diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0b7e82030b54..7fcc1ccc667b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,8 +4,10 @@ # In the event that people are to be informed of changes # to the same file or dir, add them to the end of under Multiple Owners -# Ebin-Halcyon -/icons/ @Ebin-Halcyon +# Francinum +/SQL/ @Francinum +/config/ @Francinum +rust_g.dll @francinum # Kapu1178 /code/_DEFINES/atmospherics/ @Kapu1178 diff --git a/.github/alternate_byond_versions.txt b/.github/alternate_byond_versions.txt index 9a21320ab175..7b50af46885e 100644 --- a/.github/alternate_byond_versions.txt +++ b/.github/alternate_byond_versions.txt @@ -5,5 +5,3 @@ # Format is version: map # Example: # 500.1337: runtimestation - -515.1603: runtimestation diff --git a/.github/guides/MAPS_AND_AWAY_MISSIONS.md b/.github/guides/MAPS_AND_AWAY_MISSIONS.md deleted file mode 100644 index 184ca1484053..000000000000 --- a/.github/guides/MAPS_AND_AWAY_MISSIONS.md +++ /dev/null @@ -1,40 +0,0 @@ -## MAPS - -/tg/station currently has five station maps in rotation. -* [DeltaStation](https://tgstation13.org/wiki/DeltaStation) -* [IceBoxStation](https://tgstation13.org/wiki/IceboxStation) -* [KiloStation](https://tgstation13.org/wiki/KiloStation) -* [MetaStation](https://tgstation13.org/wiki/MetaStation) -* [TramStation](https://tgstation13.org/wiki/Tramstation) - -Debug station maps. -* [RuntimeStation](https://tgstation13.org/wiki/RuntimeStation) -* [MultiZ](https://tgstation13.org/wiki/MultiZ) - -All maps have their own code file that is in the base of the `_maps` directory, or elsewhere in the codebase. For example, all of the station maps in rotation each have a corresponding JSON file and are loaded using `maps/_basemap.dm`. 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, MetaStation 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/config.txt` and then set the maps to be picked in the `config/maps.txt` file. - -## EDITING MAPS - -It is absolutely inadvisable to ever use the mapping utility offered by Dream Maker. It is clunky and dated software that will steal your time, patience, and creative desires. - -Instead, /tg/station map maintainers will always recommend using one of two modern and actively maintained programs. -* [StrongDMM](https://github.com/SpaiR/StrongDMM) (Windows/Linux/MacOS) -* [FastDMM2](https://github.com/monster860/FastDMM2) (Web-based Utility) - -Both of the above programs have native TGM support, which is mandatory for all maps being submitted to this repository. Anytime you want to make changes to a map, it is imperative you use the [Map Merging tools](https://tgstation13.org/wiki/Map_Merger). When you clone your repository onto your machine for mapping, it's always a great idea to run `tools/hooks/Install.bat` at the very start of your mapping endeavors, as this will install Git hooks that help you automatically resolve any merge conflicts that come up while mapping. - -## AWAY MISSIONS - -/tg/station 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 of the enabled ones to load. We also support functionality for config-only away missions, which can be set up using the `config/away_missions` folder. - -## MAP DEPOT - -For sentimental purposes, /tg/station hosts a [Map Depot](https://github.com/tgstation/map_depot) for any unused maps since retired from active use in the codebase. A lot of maps present in said depot do get severely outdated within weeks of their initial uploading, so do keep in mind that a bit of setup is required since active maintenance is not enforced there the same way as this repository. diff --git a/.github/guides/TICK_ORDER.md b/.github/guides/TICK_ORDER.md new file mode 100644 index 000000000000..5c27617db4ce --- /dev/null +++ b/.github/guides/TICK_ORDER.md @@ -0,0 +1,21 @@ +The byond tick proceeds as follows: +1. procs sleeping via walk() are resumed (i dont know why these are first) + +2. normal sleeping procs are resumed, in the order they went to sleep in the first place, this is where the MC wakes up and processes subsystems. a consequence of this is that the MC almost never resumes before other sleeping procs, because it only goes to sleep for 1 tick 99% of the time, and 99% of procs either go to sleep for less time than the MC (which guarantees that they entered the sleep queue earlier when its time to wake up) and/or were called synchronously from the MC's execution, almost all of the time the MC is the last sleeping proc to resume in any given tick. This is good because it means the MC can account for the cost of previous resuming procs in the tick, and minimizes overtime. + +3. control is passed to byond after all of our code's procs stop execution for this tick + +4. a few small things happen in byond internals + +5. SendMaps is called for this tick, which processes the game state for all clients connected to the game and handles sending them changes +in appearances within their view range. This is expensive and takes up a significant portion of our tick, about 0.45% per connected player +as of 3/20/2022. meaning that with 50 players, 22.5% of our tick is being used up by just SendMaps, after all of our code has stopped executing. Thats only the average across all rounds, for most highpop rounds it can look like 0.6% of the tick per player, which is 30% for 50 players. + +6. After SendMaps ends, client verbs sent to the server are executed, and its the last major step before the next tick begins. +During the course of the tick, a client can send a command to the server saying that they have executed any verb. The actual code defined +for that /verb/name() proc isnt executed until this point, and the way the MC is designed makes this especially likely to make verbs +"overrun" the bounds of the tick they executed in, stopping the other tick from starting and thus delaying the MC firing in that tick. + +The master controller can derive how much of the tick was used in: procs executing before it woke up (because of world.tick_usage), and SendMaps (because of world.map_cpu, since this is a running average you cant derive the tick spent on maptick on any particular tick). It cannot derive how much of the tick was used for sleeping procs resuming after the MC ran, or for verbs executing after SendMaps. + +It is for these reasons why you should heavily limit processing done in verbs, while procs resuming after the MC are rare, verbs are not, and are much more likely to cause overtime since theyre literally at the end of the tick. If you make a verb, try to offload any expensive work to the beginning of the next tick via a verb management subsystem. diff --git a/.github/images/README.md b/.github/images/README.md new file mode 100644 index 000000000000..a3c0c24ade34 --- /dev/null +++ b/.github/images/README.md @@ -0,0 +1,8 @@ +# Attributions + +## Badges +`built-with-resentment.svg` and `contains-technical-debt.svg` were originally sourced from https://forthebadge.com/, with the repository located at https://github.com/BraveUX/for-the-badge. `made-in-byond.gif` is a user-generated modification of one of these badges provided by this service. + +## Comics + +Both comics are sourced from https://www.monkeyuser.com/, which gives permission for use in non-profit usage via https://www.monkeyuser.com/about/index.html. `bug_free.png` can be found at https://www.monkeyuser.com/2019/bug-free/, and the original version of `technical_debt.png` can be found at https://www.monkeyuser.com/2018/tech-debt/ (the version found in the folder has been modified). diff --git a/.github/images/badges/built-with-resentment.svg b/.github/images/badges/built-with-resentment.svg new file mode 100644 index 000000000000..702b62d72141 --- /dev/null +++ b/.github/images/badges/built-with-resentment.svg @@ -0,0 +1,30 @@ + + built-with-resentment + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/badges/contains-technical-debt.svg b/.github/images/badges/contains-technical-debt.svg new file mode 100644 index 000000000000..051cec711706 --- /dev/null +++ b/.github/images/badges/contains-technical-debt.svg @@ -0,0 +1,32 @@ + + contains-technical-debts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/images/badges/made-in-byond.gif b/.github/images/badges/made-in-byond.gif new file mode 100644 index 000000000000..aed1b7ca243c Binary files /dev/null and b/.github/images/badges/made-in-byond.gif differ diff --git a/.github/images/comics/106-tech-debt-modified.png b/.github/images/comics/106-tech-debt-modified.png new file mode 100644 index 000000000000..d88ea1f72b21 Binary files /dev/null and b/.github/images/comics/106-tech-debt-modified.png differ diff --git a/.github/images/comics/131-bug-free.png b/.github/images/comics/131-bug-free.png new file mode 100644 index 000000000000..fd3da8561e62 Binary files /dev/null and b/.github/images/comics/131-bug-free.png differ diff --git a/.github/workflows/autowiki.yml b/.github/workflows/autowiki.yml index 677a1c55e9f2..081960edd13a 100644 --- a/.github/workflows/autowiki.yml +++ b/.github/workflows/autowiki.yml @@ -17,10 +17,10 @@ jobs: echo "::set-output name=SECRETS_ENABLED::$SECRET_EXISTS" - name: Checkout if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Restore BYOND cache if: steps.secrets_set.outputs.SECRETS_ENABLED - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 785486fafc98..e162930caaec 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -10,23 +10,25 @@ on: - 'project/**' jobs: run_linters: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Run Linters - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 + concurrency: + group: run_linters-${{ github.head_ref || github.run_id }} + cancel-in-progress: true steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore SpacemanDMM cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/SpacemanDMM - key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} + key: ${{ runner.os }}-spacemandmm - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} restore-keys: | - ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- ${{ runner.os }}-build- ${{ runner.os }}- - name: Install Tools @@ -35,33 +37,66 @@ jobs: bash tools/ci/install_node.sh bash tools/ci/install_spaceman_dmm.sh dreamchecker tools/bootstrap/python -c '' - - name: Run Linters + - name: Give Linters A Go + id: linter-setup + run: ':' + - name: Run Grep Checks + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: bash tools/ci/check_grep.sh + - name: Run DreamChecker + if: steps.linter-setup.conclusion == 'success' && !cancelled() + shell: bash + run: ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh + - name: Run Map Checks + if: steps.linter-setup.conclusion == 'success' && !cancelled() run: | - bash tools/ci/check_filedirs.sh daedalus.dme - bash tools/ci/check_changelogs.sh - bash tools/ci/check_grep.sh - bash tools/ci/check_misc.sh - tools/build/build --ci lint tgui-test - tools/bootstrap/python -m dmi.test tools/bootstrap/python -m mapmerge2.dmm_test - ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 - - name: Annotate Lints - uses: yogstation13/DreamAnnotate@v2 - if: always() + - name: Run DMI Tests + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: tools/bootstrap/python -m dmi.test + - name: Check File Directories + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: bash tools/ci/check_filedirs.sh daedalus.dme + - name: Check Changelogs + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: bash tools/ci/check_changelogs.sh + - name: Check Miscellaneous Files + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: bash tools/ci/check_misc.sh + - name: Run TGUI Checks + if: steps.linter-setup.conclusion == 'success' && !cancelled() + run: tools/build/build --ci lint tgui-test + + odlint: + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + name: "Lint with OpenDream" + runs-on: ubuntu-22.04 + concurrency: + group: odlint-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + steps: + - uses: actions/checkout@v4 + - uses: robinraju/release-downloader@v1.9 with: - outputFile: output-annotations.txt + repository: "OpenDreamProject/OpenDream" + tag: "latest" + fileName: "DMCompiler_linux-x64.tar.gz" + extract: true + - name: Run OpenDream + run: | + ./DMCompiler_linux-x64/DMCompiler daedalus.dme --suppress-unimplemented --define=CIBUILDING compile_all_maps: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Compile Maps - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore BYOND cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/BYOND - key: ${{ runner.os }}-byond-${{ secrets.CACHE_PURGE_KEY }} + key: ${{ runner.os }}-byond - name: Compile All Maps run: | bash tools/ci/install_byond.sh @@ -69,9 +104,9 @@ jobs: tools/build/build --ci dm -DCIBUILDING -DCITESTING -DALL_MAPS find_all_maps: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Find Maps to Test - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest outputs: maps: ${{ steps.map_finder.outputs.maps }} alternate_tests: ${{ steps.alternate_test_finder.outputs.alternate_tests }} @@ -79,7 +114,7 @@ jobs: group: find_all_maps-${{ github.head_ref || github.run_id }} cancel-in-progress: true steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Find Maps id: map_finder run: | @@ -94,7 +129,7 @@ jobs: echo "alternate_tests=$ALTERNATE_TESTS_JSON" >> $GITHUB_OUTPUT run_all_tests: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Integration Tests needs: [find_all_maps] strategy: @@ -109,7 +144,7 @@ jobs: map: ${{ matrix.map }} run_alternate_tests: - if: "!contains(github.event.head_commit.message, '[ci skip]') && needs.find_all_maps.outputs.alternate_tests != '[]'" + if: ( !contains(github.event.head_commit.message, '[ci skip]') && needs.find_all_maps.outputs.alternate_tests != '[]' ) name: Alternate Tests needs: [find_all_maps] strategy: @@ -126,20 +161,20 @@ jobs: minor: ${{ matrix.setup.minor }} check_alternate_tests: - if: "!contains(github.event.head_commit.message, '[ci skip]') && needs.find_all_maps.outputs.alternate_tests != '[]'" + if: ( !contains(github.event.head_commit.message, '[ci skip]') && needs.find_all_maps.outputs.alternate_tests != '[]' ) name: Check Alternate Tests needs: [run_alternate_tests] - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - run: echo Alternate tests passed. compare_screenshots: - if: "!contains(github.event.head_commit.message, '[ci skip]') && always()" + if: ( !contains(github.event.head_commit.message, '[ci skip]') && (always() && (!failure() && !cancelled())) ) needs: [run_all_tests, run_alternate_tests] name: Compare Screenshot Tests - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 # If we ever add more artifacts, this is going to break, but it'll be obvious. - name: Download screenshot tests uses: actions/download-artifact@v3 @@ -169,18 +204,17 @@ jobs: path: artifacts/screenshot_comparisons test_windows: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) name: Windows Build runs-on: windows-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Restore Yarn cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: tgui/.yarn/cache - key: ${{ runner.os }}-yarn-${{ secrets.CACHE_PURGE_KEY }}-${{ hashFiles('tgui/yarn.lock') }} + key: ${{ runner.os }}-yarn-${{ hashFiles('tgui/yarn.lock') }} restore-keys: | - ${{ runner.os }}-build-${{ secrets.CACHE_PURGE_KEY }}- ${{ runner.os }}-build- ${{ runner.os }}- - name: Compile @@ -192,7 +226,7 @@ jobs: md deploy bash tools/deploy.sh ./deploy - name: Deploy artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: deploy path: deploy diff --git a/.github/workflows/codeowner_reviews.yml b/.github/workflows/codeowner_reviews.yml index 994b33f01a7c..a461a96d931f 100644 --- a/.github/workflows/codeowner_reviews.yml +++ b/.github/workflows/codeowner_reviews.yml @@ -10,7 +10,7 @@ jobs: steps: # Checks-out your repository under $GITHUB_WORKSPACE, so the job can access it - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 #Parse the Codeowner file - name: CodeOwnersParser diff --git a/.github/workflows/compile_changelogs.yml b/.github/workflows/compile_changelogs.yml index 1b7bb9b0c05a..e658dceb6fff 100644 --- a/.github/workflows/compile_changelogs.yml +++ b/.github/workflows/compile_changelogs.yml @@ -8,7 +8,7 @@ on: jobs: compile: name: "Compile changelogs" - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: "Check for ACTION_ENABLER secret and pass true to output if it exists to be checked by later steps" id: value_holder @@ -17,7 +17,7 @@ jobs: run: | unset SECRET_EXISTS if [ -n "$ENABLER_SECRET" ]; then SECRET_EXISTS=true ; fi - echo "::set-output name=ACTIONS_ENABLED::$SECRET_EXISTS" + echo "ACTIONS_ENABLED=$SECRET_EXISTS" >> $GITHUB_OUTPUT - name: "Setup python" if: steps.value_holder.outputs.ACTIONS_ENABLED uses: actions/setup-python@v1 @@ -31,9 +31,10 @@ jobs: sudo apt-get install dos2unix - name: "Checkout" if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v1 + uses: actions/checkout@v3 with: fetch-depth: 25 + persist-credentials: false - name: "Compile" if: steps.value_holder.outputs.ACTIONS_ENABLED run: | diff --git a/.github/workflows/docker_publish.yml b/.github/workflows/docker_publish.yml index 695f2f027e89..1d62a9986f2f 100644 --- a/.github/workflows/docker_publish.yml +++ b/.github/workflows/docker_publish.yml @@ -7,10 +7,10 @@ on: jobs: publish: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build and Publish Docker Image to Registry uses: elgohr/Publish-Docker-Github-Action@master diff --git a/.github/workflows/gbp.yml b/.github/workflows/gbp.yml index 453533a3dde3..9c92e5f379dc 100644 --- a/.github/workflows/gbp.yml +++ b/.github/workflows/gbp.yml @@ -16,7 +16,7 @@ jobs: echo "::set-output name=ACTIONS_ENABLED::$SECRET_EXISTS" - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup git if: steps.value_holder.outputs.ACTIONS_ENABLED run: | @@ -24,7 +24,7 @@ jobs: git config --global user.email "<>" - name: Checkout alternate branch if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: "gbp-balances" # The branch name path: gbp-balances diff --git a/.github/workflows/gbp_collect.yml b/.github/workflows/gbp_collect.yml index 1a89b2692fe9..dc2af17a12de 100644 --- a/.github/workflows/gbp_collect.yml +++ b/.github/workflows/gbp_collect.yml @@ -18,7 +18,7 @@ jobs: echo "::set-output name=ACTIONS_ENABLED::$SECRET_EXISTS" - name: Checkout if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup git if: steps.value_holder.outputs.ACTIONS_ENABLED run: | @@ -26,7 +26,7 @@ jobs: git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - name: Checkout alternate branch if: steps.value_holder.outputs.ACTIONS_ENABLED - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: "gbp-balances" # The branch name path: gbp-balances diff --git a/.github/workflows/generate_documentation.yml b/.github/workflows/generate_documentation.yml index b6488ded63ef..55415a3e0953 100644 --- a/.github/workflows/generate_documentation.yml +++ b/.github/workflows/generate_documentation.yml @@ -5,13 +5,15 @@ on: - master jobs: generate_documentation: - if: "!contains(github.event.head_commit.message, '[ci skip]')" - runs-on: ubuntu-20.04 + permissions: + contents: write # for JamesIves/github-pages-deploy-action to push changes in repo + if: ( !contains(github.event.head_commit.message, '[ci skip]') ) + runs-on: ubuntu-22.04 concurrency: gen-docs steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Setup cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/SpacemanDMM key: ${{ runner.os }}-spacemandmm-${{ secrets.CACHE_PURGE_KEY }} diff --git a/.github/workflows/pr_emoji.yml b/.github/workflows/pr_emoji.yml index 219b319298ad..b6439a33df7e 100644 --- a/.github/workflows/pr_emoji.yml +++ b/.github/workflows/pr_emoji.yml @@ -8,7 +8,7 @@ permissions: jobs: title_and_changelog: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: Wayland-Smithy/emoji-stripper-action@8f4c2fe9748bb9b02f105be4e72a1a42b0f34d84 with: diff --git a/.github/workflows/round_id_linker.yml b/.github/workflows/round_id_linker.yml index 5aede3503d1b..fb4a202d1794 100644 --- a/.github/workflows/round_id_linker.yml +++ b/.github/workflows/round_id_linker.yml @@ -5,7 +5,7 @@ on: jobs: link_rounds: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: tgstation/round_linker@master with: diff --git a/.github/workflows/run_integration_tests.yml b/.github/workflows/run_integration_tests.yml index fedd7dad9a6a..f84322cd151e 100644 --- a/.github/workflows/run_integration_tests.yml +++ b/.github/workflows/run_integration_tests.yml @@ -15,7 +15,7 @@ on: type: string jobs: run_integration_tests: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest services: mysql: image: mysql:latest @@ -40,9 +40,6 @@ jobs: mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql - name: Install rust-g run: | - sudo dpkg --add-architecture i386 - sudo apt update || true - sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386 bash tools/ci/install_rust_g.sh - name: Configure version run: | diff --git a/.github/workflows/show_screenshot_test_results.yml b/.github/workflows/show_screenshot_test_results.yml index 3e9125510b7b..c0ebf50af990 100644 --- a/.github/workflows/show_screenshot_test_results.yml +++ b/.github/workflows/show_screenshot_test_results.yml @@ -11,9 +11,9 @@ on: - completed jobs: show_screenshot_test_results: - if: "!contains(github.event.head_commit.message, '[ci skip]')" + if: ( !contains(github.event.head_commit.message, '[ci skip]') && github.event.workflow_run.run_attempt == 1 ) name: Show Screenshot Test Results - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: "Check for ARTIFACTS_FILE_HOUSE_KEY" id: secrets_set diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 14d56e5f29f6..241db03f6e82 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -4,10 +4,16 @@ on: schedule: - cron: "0 0 * * *" +permissions: + contents: read + jobs: stale: - runs-on: ubuntu-20.04 + permissions: + issues: write # for actions/stale to close stale issues + pull-requests: write # for actions/stale to close stale PRs + runs-on: ubuntu-22.04 steps: - uses: actions/stale@v4 diff --git a/.github/workflows/update_tgs_dmapi.yml b/.github/workflows/update_tgs_dmapi.yml index b37bfcf6d3a4..be118d2e77cd 100644 --- a/.github/workflows/update_tgs_dmapi.yml +++ b/.github/workflows/update_tgs_dmapi.yml @@ -7,11 +7,11 @@ on: jobs: update-dmapi: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest name: Update the TGS DMAPI steps: - name: Clone - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Branch run: | @@ -21,6 +21,7 @@ jobs: - name: Apply DMAPI update uses: tgstation/tgs-dmapi-updater@v2 + id: dmapi-update with: header-path: 'code/__DEFINES/tgs.dm' library-path: 'code/modules/tgs' @@ -41,7 +42,7 @@ jobs: source_branch: "tgs-dmapi-update" 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_body: "This pull request updates the TGS DMAPI to the latest version. Please note any changes that may be breaking or unimplemented in your codebase by checking what changes are in the definitions file: code/__DEFINES/tgs.dm before merging.\n\n${{ steps.dmapi-update.outputs.release-notes }}" pr_label: "Tools" pr_allow_empty: false github_token: ${{ secrets.DD_BOT_PAT }} diff --git a/.gitignore b/.gitignore index 0a53e549989d..6fb8069c3545 100644 --- a/.gitignore +++ b/.gitignore @@ -180,19 +180,14 @@ Temporary Items #dmdoc default folder /dmdoc -# Ignore custom music and title screens (amend as appropriate) -/config/jukebox_music/sounds/* -!/config/jukebox_music/sounds/exclude -/config/credits_music/sounds/* -!/config/credits_music/sounds/exclude -/config/credits_music/jsons/* -!/config/credits_music/jsons/EXAMPLE.json -/config/title_music/sounds/* -!/config/title_music/sounds/exclude -/config/title_music/jsons/* -!/config/title_music/jsons/EXAMPLE.json -/config/title_screens/images/* -!/config/title_screens/images/exclude +#Ignore everything but the example config in the media jsons directory, For easy testing. +/config/media/jsons/* +!/config/media/jsons/__EXAMPLE.json +/config/media/sounds/* +!/config/media/jsons/exclude + +#This file contains developer-specific config overrides. These shouldn't be committed. +config/_config_nogit.txt #Linux docker /tools/LinuxOneShot/SetupProgram/obj/* @@ -203,8 +198,20 @@ Temporary Items /tools/LinuxOneShot/TGS_Instances /tools/LinuxOneShot/TGS_Logs +# byond-tracy, we intentionally do not ship this and do not want to maintain it +prof.dll +libprof.so + # JavaScript tools **/node_modules # Screenshot tests /artifacts + +# Running OpenDream locally +daedalus.json + +# Codex Database +codex.db +codex.db-shm +codex.db-wal \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fa017edecf42..79a1a64683a3 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,6 +6,7 @@ "dbaeumer.vscode-eslint", "stylemistake.auto-comment-blocks", "Donkie.vscode-tgstation-test-adapter", - "anturk.dmi-editor" + "anturk.dmi-editor", + "esbenp.prettier-vscode" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index b74e0acda049..11905cc6d754 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -15,6 +15,12 @@ "preLaunchTask": "Build All", "dmb": "${workspaceFolder}/${command:CurrentDMB}", "dreamDaemon": true + },{ + "type": "opendream", + "request": "launch", + "name": "OpenDream", + "preLaunchTask": "OpenDream: compile ${command:CurrentDME}", + "json_path": "${workspaceFolder}/${command:CurrentJson}" } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 4fa805989874..ee6fcdf0c2eb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,20 +9,49 @@ "**/.yarn": true, "**/.pnp.*": true }, + "prettier.prettierPath": "./tgui/.yarn/sdks/prettier/index.cjs", "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "files.eol": "\n", "files.insertFinalNewline": true, - "gitlens.advanced.blame.customArguments": ["-w"], + "gitlens.advanced.blame.customArguments": [ + "-w" + ], "tgstationTestExplorer.project.resultsType": "json", "[javascript]": { - "editor.rulers": [80] + "editor.rulers": [ + 80 + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[javascriptreact]": { + "editor.rulers": [ + 80 + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[typescript]": { - "editor.rulers": [80] + "editor.rulers": [ + 80 + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[typescriptreact]": { + "editor.rulers": [ + 80 + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true }, "[scss]": { - "editor.rulers": [80] + "editor.rulers": [ + 80 + ], + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 0494bc0f0a26..a5b501288efb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -89,6 +89,14 @@ ], "group": "build", "label": "tgui: sonar" + }, + { + "type": "opendream", + "problemMatcher": [ + "$openDreamCompiler" + ], + "group": "build", + "label": "OpenDream: compile daedalus.dme" } ] } diff --git a/README.md b/README.md index d0bb8d5ab227..730fbfe0cec8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@ ## Daedalus Dock codebase [![CI Suite](https://github.com/DaedalusDock/Gameserver/actions/workflows/ci_suite.yml/badge.svg)](https://github.com/DaedalusDock/Gameserver/actions/workflows/ci_suite.yml) +[![Percentage of issues still open](https://isitmaintained.com/badge/open/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Percentage of issues still open") +[![Average time to resolve an issue](https://isitmaintained.com/badge/resolution/tgstation/tgstation.svg)](https://isitmaintained.com/project/tgstation/tgstation "Average time to resolve an issue") +![Coverage](https://img.shields.io/badge/coverage-no%25-red.svg) -[![resentment](https://forthebadge.com/images/badges/built-with-resentment.svg)](https://www.monkeyuser.com/assets/images/2019/131-bug-free.png) [![resentment](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) +[![resentment](.github/images/badges/built-with-resentment.svg)](.github/images/comics/131-bug-free.png) [![technical debt](.github/images/badges/contains-technical-debt.svg)](.github/images/comics/106-tech-debt-modified.png) [![forinfinityandbyond](.github/images/badges/made-in-byond.gif)](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a) * **Website:** https://daedalus13.net * **Code:** https://github.com/DaedalusDock/Gameserver diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm deleted file mode 100644 index 6ff8fa35113a..000000000000 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ /dev/null @@ -1,618 +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/nodiagonal, -/area/ruin/powered/golem_ship) -"c" = ( -/obj/structure/closet/crate, -/obj/item/shovel, -/obj/item/shovel, -/obj/item/shovel, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/storage/bag/ore, -/obj/item/storage/bag/ore, -/obj/item/mining_scanner, -/obj/item/flashlight/lantern, -/obj/item/card/id/advanced/mining, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"d" = ( -/obj/structure/closet/crate, -/obj/item/shovel, -/obj/item/shovel, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/storage/bag/ore, -/obj/item/storage/bag/ore, -/obj/item/mining_scanner, -/obj/item/flashlight/lantern, -/obj/item/card/id/advanced/mining, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"e" = ( -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"f" = ( -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"g" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"h" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"i" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"j" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"k" = ( -/obj/machinery/computer/arcade/battle, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"l" = ( -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"m" = ( -/obj/effect/mob_spawn/ghost_role/human/golem/adamantine, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"n" = ( -/obj/machinery/mineral/equipment_vendor/golem, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"o" = ( -/obj/item/resonator, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"p" = ( -/obj/item/circuitboard/machine/ore_redemption, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/five, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"q" = ( -/obj/structure/statue/gold/rd, -/obj/structure/window/reinforced{ - dir = 4; - name = "shrine of the liberator" - }, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"r" = ( -/obj/machinery/computer/shuttle, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"t" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"u" = ( -/obj/structure/table/wood, -/obj/item/bedsheet/rd/royal_cape{ - layer = 3; - pixel_x = 5; - pixel_y = 9 - }, -/obj/item/book/manual/wiki/research_and_development{ - name = "Sacred Text of the Liberator"; - pixel_x = -4; - pixel_y = 3 - }, -/obj/structure/window/reinforced{ - dir = 4; - name = "shrine of the liberator" - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"v" = ( -/obj/item/resonator/upgraded, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"w" = ( -/obj/machinery/autolathe, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"x" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"y" = ( -/obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"z" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"A" = ( -/obj/structure/table/wood, -/obj/item/surgical_drapes{ - pixel_x = 15 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire, -/obj/item/stock_parts/matter_bin, -/obj/item/assembly/igniter, -/obj/item/stock_parts/micro_laser, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"B" = ( -/obj/item/storage/medkit/fire, -/obj/structure/table/wood, -/obj/item/storage/medkit/fire, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"C" = ( -/obj/item/storage/medkit/brute, -/obj/structure/table/wood, -/obj/item/storage/medkit/brute, -/obj/item/areaeditor/blueprints{ - desc = "Use to build new structures in the wastes."; - name = "land claim" - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"D" = ( -/obj/item/storage/medkit/brute, -/obj/structure/table/wood, -/obj/item/storage/medkit/brute, -/obj/item/disk/data/golem_shell, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"E" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"F" = ( -/obj/structure/ore_box, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"G" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/powered/golem_ship) -"H" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"I" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"K" = ( -/obj/machinery/door/airlock/titanium, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"L" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"M" = ( -/obj/effect/mob_spawn/ghost_role/human/golem/adamantine, -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"N" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"O" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"Q" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"T" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/titanium, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"U" = ( -/obj/effect/mob_spawn/ghost_role/human/golem/adamantine, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) -"V" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/ruin/powered/golem_ship) -"Y" = ( -/obj/machinery/door/airlock/titanium, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/golem_ship) - -(1,1,1) = {" -a -a -a -a -a -a -b -b -b -b -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -b -q -u -G -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -b -b -H -b -r -l -G -T -b -b -a -a -a -"} -(4,1,1) = {" -a -a -a -b -k -l -j -l -l -j -l -y -b -a -a -a -"} -(5,1,1) = {" -a -a -a -b -L -l -j -l -l -j -l -l -b -a -a -a -"} -(6,1,1) = {" -b -b -b -b -l -l -b -l -Q -G -l -Q -b -b -b -b -"} -(7,1,1) = {" -b -c -f -j -l -l -b -l -l -G -l -l -j -f -F -b -"} -(8,1,1) = {" -b -c -f -j -l -l -b -L -l -G -l -l -j -f -F -b -"} -(9,1,1) = {" -b -c -I -b -M -o -b -l -l -G -o -U -b -V -F -b -"} -(10,1,1) = {" -b -c -f -b -m -o -b -l -l -G -o -m -b -f -F -b -"} -(11,1,1) = {" -b -c -f -b -b -j -b -j -j -G -j -b -b -f -F -b -"} -(12,1,1) = {" -b -c -I -b -l -l -O -l -l -O -l -z -b -V -F -b -"} -(13,1,1) = {" -b -d -f -j -l -l -l -l -l -l -l -l -j -f -F -b -"} -(14,1,1) = {" -b -d -f -j -l -l -l -l -l -l -l -l -j -f -e -b -"} -(15,1,1) = {" -b -d -f -b -l -l -l -l -l -l -l -A -b -f -f -b -"} -(16,1,1) = {" -T -e -I -b -N -l -l -l -l -v -l -B -b -V -f -T -"} -(17,1,1) = {" -T -f -f -b -l -l -p -l -l -w -l -C -b -f -f -T -"} -(18,1,1) = {" -b -g -g -b -n -l -b -Y -Y -b -x -D -b -E -E -b -"} -(19,1,1) = {" -b -h -h -b -h -h -b -t -Q -b -h -h -b -h -h -b -"} -(20,1,1) = {" -b -i -i -b -i -i -b -K -K -b -i -i -b -i -i -b -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm deleted file mode 100644 index 341180c0013f..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm +++ /dev/null @@ -1,1781 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"c" = ( -/turf/closed/wall/mineral/bronze, -/area/icemoon/surface) -"e" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium, -/turf/open/floor/bronze, -/area/icemoon/surface) -"h" = ( -/obj/effect/mob_spawn/corpse/human/skeleton, -/obj/item/clothing/suit/bronze, -/obj/item/clothing/shoes/bronze, -/obj/item/clothing/head/bronze, -/turf/open/floor/bronze{ - temperature = 2.7 - }, -/area/icemoon/surface) -"m" = ( -/obj/item/nullrod/spear{ - name = "empowered bronze spear" - }, -/turf/open/floor/bronze{ - temperature = 2.7 - }, -/area/icemoon/surface) -"o" = ( -/turf/open/floor/bronze{ - temperature = 2.7 - }, -/area/icemoon/surface) -"A" = ( -/obj/structure/fluff/clockwork/clockgolem_remains, -/turf/open/floor/bronze, -/area/icemoon/surface) -"B" = ( -/turf/open/genturf, -/area/mine/unexplored) -"C" = ( -/obj/structure/fluff/clockwork/blind_eye, -/turf/open/floor/bronze, -/area/icemoon/surface) -"D" = ( -/obj/structure/fluff/clockwork/alloy_shards/large, -/turf/open/floor/bronze, -/area/icemoon/surface) -"G" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit, -/turf/open/floor/bronze, -/area/icemoon/surface) -"I" = ( -/obj/structure/table/bronze, -/obj/item/toy/clockwork_watch{ - desc = "You can still feel the embers of a once great empire in your hand..."; - name = "drained clockwork slab" - }, -/turf/open/floor/bronze, -/area/icemoon/surface) -"J" = ( -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/floor/bronze, -/area/icemoon/surface) -"K" = ( -/obj/structure/table/bronze, -/turf/open/floor/bronze, -/area/icemoon/surface) -"L" = ( -/mob/living/simple_animal/hostile/megafauna/clockwork_defender, -/turf/open/floor/bronze{ - temperature = 2.7 - }, -/area/icemoon/surface) -"M" = ( -/obj/structure/fluff/clockwork/fallen_armor, -/turf/open/floor/bronze, -/area/icemoon/surface) -"N" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/nospawn) -"O" = ( -/obj/structure/fluff/clockwork/alloy_shards, -/turf/open/floor/bronze, -/area/icemoon/surface) -"W" = ( -/turf/open/floor/bronze, -/area/icemoon/surface) -"X" = ( -/obj/machinery/door/airlock/bronze{ - use_power = 0 - }, -/turf/open/floor/bronze, -/area/icemoon/surface) -"Y" = ( -/obj/item/paper{ - info = "We tried to use the power of this moon to bring him back, but we've failed... I've contained what remains of his power here... if you find this, make sure those Nar-Sian Dogs don't last a second." - }, -/obj/item/pen, -/turf/open/floor/bronze{ - temperature = 2.7 - }, -/area/icemoon/surface) - -(1,1,1) = {" -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -"} -(2,1,1) = {" -N -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -X -X -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -N -"} -(3,1,1) = {" -N -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -K -G -W -A -W -K -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -N -"} -(4,1,1) = {" -N -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -C -W -J -W -W -C -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -N -"} -(5,1,1) = {" -N -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -c -X -X -c -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -N -"} -(6,1,1) = {" -N -c -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 -B -c -c -N -"} -(7,1,1) = {" -N -c -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 -B -c -c -N -"} -(8,1,1) = {" -N -c -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 -B -c -c -N -"} -(9,1,1) = {" -N -c -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 -B -c -c -N -"} -(10,1,1) = {" -N -c -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 -B -c -c -N -"} -(11,1,1) = {" -N -c -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 -B -c -c -N -"} -(12,1,1) = {" -N -c -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 -B -c -c -N -"} -(13,1,1) = {" -N -c -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 -B -c -c -N -"} -(14,1,1) = {" -N -c -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 -B -c -c -N -"} -(15,1,1) = {" -N -c -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 -B -c -c -N -"} -(16,1,1) = {" -N -c -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 -B -c -c -N -"} -(17,1,1) = {" -N -c -c -c -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 -c -c -c -c -N -"} -(18,1,1) = {" -N -c -K -C -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 -c -C -I -c -N -"} -(19,1,1) = {" -N -c -W -W -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -o -o -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -W -D -c -N -"} -(20,1,1) = {" -N -X -O -J -X -B -B -B -B -B -B -B -B -B -B -B -B -B -o -h -L -o -B -B -B -B -B -B -B -B -B -B -B -B -B -X -J -W -X -N -"} -(21,1,1) = {" -N -X -W -A -X -B -B -B -B -B -B -B -B -B -B -B -B -B -o -m -Y -o -B -B -B -B -B -B -B -B -B -B -B -B -B -X -G -M -X -N -"} -(22,1,1) = {" -N -c -W -W -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -o -o -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -W -W -c -N -"} -(23,1,1) = {" -N -c -K -C -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 -c -C -K -c -N -"} -(24,1,1) = {" -N -c -c -c -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 -c -c -c -c -N -"} -(25,1,1) = {" -N -c -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 -B -c -c -N -"} -(26,1,1) = {" -N -c -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 -B -c -c -N -"} -(27,1,1) = {" -N -c -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 -B -c -c -N -"} -(28,1,1) = {" -N -c -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 -B -c -c -N -"} -(29,1,1) = {" -N -c -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 -B -c -c -N -"} -(30,1,1) = {" -N -c -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 -B -c -c -N -"} -(31,1,1) = {" -N -c -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 -B -c -c -N -"} -(32,1,1) = {" -N -c -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 -B -c -c -N -"} -(33,1,1) = {" -N -c -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 -B -c -c -N -"} -(34,1,1) = {" -N -c -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 -B -c -c -N -"} -(35,1,1) = {" -N -c -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 -B -c -c -N -"} -(36,1,1) = {" -N -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -c -X -X -c -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -N -"} -(37,1,1) = {" -N -c -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -C -W -J -e -W -C -c -B -B -B -B -B -B -B -B -B -B -B -B -B -c -c -N -"} -(38,1,1) = {" -N -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -K -W -A -W -W -K -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -N -"} -(39,1,1) = {" -N -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -X -X -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -N -"} -(40,1,1) = {" -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm deleted file mode 100644 index 10bfe7e86f13..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm +++ /dev/null @@ -1,705 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"as" = ( -/obj/machinery/door/airlock/public, -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/nospawn) -"ax" = ( -/obj/effect/turf_decal/stripes/white/line{ - color = "#236F26"; - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"aR" = ( -/obj/item/reagent_containers/syringe/syriniver, -/obj/effect/turf_decal/siding/wideplating/dark/corner, -/obj/effect/turf_decal/tile/dark/anticorner, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"bu" = ( -/obj/effect/spawner/random/food_or_drink/snack, -/mob/living/basic/cockroach, -/turf/open/floor/fakebasalt, -/area/ruin/bughabitat) -"bQ" = ( -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 8 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"cK" = ( -/mob/living/simple_animal/hostile/ant{ - environment_smash = 0 - }, -/turf/open/floor/grass, -/area/ruin/bughabitat) -"eM" = ( -/obj/structure/chair/pew/right{ - dir = 8 - }, -/obj/item/bedsheet{ - pixel_y = 13 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"eN" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/machinery/biogenerator, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 5 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"fI" = ( -/obj/effect/decal/remains/human, -/obj/item/clipboard, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"fO" = ( -/turf/open/misc/snow, -/area/ruin/bughabitat) -"fP" = ( -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/dark/anticorner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"hk" = ( -/obj/structure/window/reinforced/spawner/east, -/turf/open/misc/snow, -/area/ruin/bughabitat) -"hy" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/suit/toggle/labcoat, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"hM" = ( -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"ih" = ( -/obj/structure/window/reinforced/tinted/fulltile, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"kv" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/item/shovel, -/turf/open/misc/snow, -/area/ruin/bughabitat) -"lj" = ( -/obj/structure/cable, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 6 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"lE" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"lG" = ( -/obj/machinery/space_heater, -/turf/open/floor/carpet/neon/simple/lime, -/area/ruin/bughabitat) -"ma" = ( -/obj/structure/statue/snow/snowman, -/turf/open/misc/snow, -/area/icemoon/surface/outdoors/nospawn) -"mM" = ( -/obj/machinery/light/warm/directional/west, -/obj/structure/tank_holder/oxygen, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"of" = ( -/obj/structure/sink{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 8 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"ot" = ( -/mob/living/basic/cockroach, -/obj/item/seeds/soya, -/turf/open/floor/fakebasalt, -/area/ruin/bughabitat) -"oZ" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"qV" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/item/wallframe/camera, -/obj/item/stack/cable_coil/cut, -/turf/open/floor/grass, -/area/ruin/bughabitat) -"ri" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/spawner/random/food_or_drink/snack, -/turf/open/floor/grass, -/area/ruin/bughabitat) -"rE" = ( -/obj/effect/spawner/random/structure/chair_flipped, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"sl" = ( -/obj/machinery/light/warm/directional/east, -/obj/effect/decal/cleanable/blood/footprints, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"sr" = ( -/obj/machinery/plumbing/growing_vat, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"st" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"tI" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"uB" = ( -/mob/living/simple_animal/butterfly, -/obj/structure/chair/pew/left{ - dir = 8 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"va" = ( -/obj/item/book/manual/wiki/cytology, -/obj/structure/table, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"wC" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26" - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"wL" = ( -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 10 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"xq" = ( -/mob/living/simple_animal/butterfly, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26" - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"yz" = ( -/obj/machinery/door/airlock/grunge, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"yC" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"zJ" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 1 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"AL" = ( -/turf/open/floor/iron, -/area/ruin/bughabitat) -"Bs" = ( -/turf/closed/wall/ice, -/area/ruin/bughabitat) -"BK" = ( -/obj/structure/table/rolling, -/obj/item/petri_dish/random, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Cb" = ( -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Cv" = ( -/obj/machinery/light/warm/directional/east, -/obj/structure/closet, -/obj/item/food/cheese/wedge, -/obj/item/stack/rods/ten, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Du" = ( -/obj/machinery/door/airlock/public, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Ea" = ( -/obj/machinery/door/window/right/directional/north, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 1 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Fq" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26" - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Ft" = ( -/turf/open/floor/grass, -/area/ruin/bughabitat) -"Gg" = ( -/obj/item/trash/shrimp_chips, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"HA" = ( -/turf/closed/wall, -/area/ruin/bughabitat) -"HU" = ( -/obj/machinery/light/warm/directional/east, -/obj/item/clothing/suit/hooded/wintercoat/hydro, -/turf/open/floor/carpet/neon/simple/lime, -/area/ruin/bughabitat) -"IX" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Jr" = ( -/obj/machinery/door/airlock/public{ - dir = 4 - }, -/obj/structure/barricade/wooden/crude, -/turf/closed/mineral/random/snow, -/area/ruin/bughabitat) -"Kc" = ( -/obj/structure/table, -/obj/machinery/light_switch/directional/south, -/obj/machinery/cell_charger, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26" - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Kq" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/carpet/neon/simple/lime, -/area/ruin/bughabitat) -"Ku" = ( -/obj/structure/table, -/obj/item/construction/plumbing/research, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Ly" = ( -/obj/structure/table, -/obj/item/stack/ducts/fifty{ - amount = 23 - }, -/mob/living/simple_animal/butterfly, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Nv" = ( -/obj/item/reagent_containers/syringe, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"Ou" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/item/plunger, -/mob/living/simple_animal/mouse, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Pt" = ( -/obj/machinery/light/warm/directional/west, -/obj/machinery/door/window/right/directional/north, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 9 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Qd" = ( -/turf/open/misc/snow, -/area/icemoon/surface/outdoors/nospawn) -"Qp" = ( -/obj/effect/turf_decal/siding/wideplating/dark/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/dark/anticorner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"QV" = ( -/obj/structure/table, -/obj/structure/windoor_assembly{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"RJ" = ( -/obj/structure/window/reinforced/spawner/east, -/mob/living/basic/cockroach, -/turf/open/floor/fakebasalt, -/area/ruin/bughabitat) -"RR" = ( -/turf/open/floor/carpet/neon/simple/lime, -/area/ruin/bughabitat) -"Tn" = ( -/obj/item/coin/silver, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"Tp" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/wideplating/light{ - color = "#236F26"; - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"Tr" = ( -/obj/item/pen/fountain, -/turf/open/floor/iron, -/area/ruin/bughabitat) -"VM" = ( -/obj/machinery/space_heater, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"VQ" = ( -/obj/item/coin/silver, -/obj/item/reagent_containers/syringe, -/turf/open/floor/plastic, -/area/ruin/bughabitat) -"Xn" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/nospawn) -"Xt" = ( -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/fakebasalt, -/area/ruin/bughabitat) -"ZT" = ( -/obj/effect/spawner/structure/window/hollow/directional{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/bughabitat) - -(1,1,1) = {" -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -"} -(2,1,1) = {" -Xn -Qd -Xn -Xn -Xn -Xn -Xn -Qd -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -"} -(3,1,1) = {" -Xn -Qd -Bs -HA -HA -HA -Bs -ih -Bs -HA -Bs -HA -HA -HA -Qd -Xn -"} -(4,1,1) = {" -Xn -Xn -HA -bu -ot -Pt -of -bQ -wL -Du -Cb -rE -Gg -HA -Qd -Xn -"} -(5,1,1) = {" -Xn -Qd -HA -RJ -Xt -zJ -AL -AL -Kc -HA -ZT -QV -ZT -Bs -Xn -Xn -"} -(6,1,1) = {" -Xn -Qd -Bs -cK -Ft -Ea -aR -hM -wC -HA -RR -RR -lG -Bs -Xn -Xn -"} -(7,1,1) = {" -Xn -Xn -HA -qV -ri -zJ -Qp -fP -xq -Du -HU -Kq -Xn -as -Xn -Xn -"} -(8,1,1) = {" -Xn -Xn -HA -fO -fO -Ea -oZ -Tn -Fq -HA -HA -HA -Bs -Bs -Qd -Xn -"} -(9,1,1) = {" -Xn -Qd -HA -hk -kv -eN -Tp -yC -lj -hy -mM -IX -VM -Bs -ma -Xn -"} -(10,1,1) = {" -Xn -Qd -Bs -va -Ly -Ku -sr -AL -Nv -oZ -AL -lE -st -HA -Qd -Xn -"} -(11,1,1) = {" -Xn -Qd -HA -Cb -Tr -sl -fI -AL -AL -AL -VQ -HA -yz -HA -Qd -Xn -"} -(12,1,1) = {" -Xn -Qd -HA -Bs -HA -HA -Cb -AL -AL -AL -tI -HA -Ou -Bs -Xn -Xn -"} -(13,1,1) = {" -Xn -Qd -Qd -Qd -Qd -Bs -BK -uB -eM -ax -Cv -HA -HA -HA -Qd -Xn -"} -(14,1,1) = {" -Xn -Xn -Qd -Qd -Qd -HA -HA -Bs -Bs -Jr -Bs -Bs -Qd -Qd -Qd -Xn -"} -(15,1,1) = {" -Xn -Xn -Qd -Qd -Qd -Qd -Xn -Xn -Xn -Xn -Xn -Qd -Qd -Qd -Qd -Xn -"} -(16,1,1) = {" -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -Xn -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm deleted file mode 100644 index 88d0c7490d64..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm +++ /dev/null @@ -1,1286 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"ag" = ( -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plating, -/area/ruin/planetengi) -"ah" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/planetengi) -"am" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"an" = ( -/turf/open/floor/engine/n2, -/area/ruin/planetengi) -"ao" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine/n2, -/area/ruin/planetengi) -"aq" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/disk/holodisk/ruin/snowengieruin, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ar" = ( -/obj/effect/mob_spawn/corpse/human/assistant, -/obj/item/construction/rcd, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron, -/area/ruin/planetengi) -"as" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east{ - start_charge = 0 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"au" = ( -/obj/machinery/rnd/production/circuit_imprinter/offstation, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"av" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/planetengi) -"aw" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/ruin/planetengi) -"ax" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/structure/statue/snow/snowman, -/turf/open/misc/snow/actually_safe, -/area/ruin/planetengi) -"ay" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/rcd_ammo, -/obj/item/rcd_ammo, -/turf/open/floor/iron, -/area/ruin/planetengi) -"az" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aA" = ( -/obj/machinery/rnd/production/fabricator/department/engineering, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/rcd_upgrade/frames, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aC" = ( -/turf/open/floor/engine/o2, -/area/ruin/planetengi) -"aD" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine/o2, -/area/ruin/planetengi) -"aE" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/item/toy/snowball, -/turf/open/misc/snow/actually_safe, -/area/ruin/planetengi) -"aF" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron, -/area/ruin/planetengi) -"aG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/turf/open/floor/engine/n2, -/area/ruin/planetengi) -"aH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aJ" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on, -/turf/open/floor/engine/n2, -/area/ruin/planetengi) -"aL" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/turf/open/floor/engine/o2, -/area/ruin/planetengi) -"aM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on, -/turf/open/floor/engine/o2, -/area/ruin/planetengi) -"aQ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"aR" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"aT" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/turf/open/misc/snow/actually_safe, -/area/ruin/planetengi) -"aV" = ( -/obj/machinery/autolathe, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aW" = ( -/obj/item/clothing/under/rank/engineering/chief_engineer, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"aX" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"ba" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/plating, -/area/ruin/planetengi) -"bc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bd" = ( -/turf/open/floor/iron, -/area/ruin/planetengi) -"be" = ( -/obj/machinery/atmospherics/components/binary/pump, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bi" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bo" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/plating, -/area/ruin/planetengi) -"bq" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Production Room"; - req_access_txt = "204" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"br" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/structure/sign/poster/official/build{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bs" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bx" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"by" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bz" = ( -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bA" = ( -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/north, -/obj/structure/window/reinforced/plasma/spawner/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/planetengi) -"bB" = ( -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/east, -/obj/structure/window/reinforced/plasma/spawner/north, -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/planetengi) -"bD" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bG" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bH" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/structure/tank_dispenser, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bL" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bS" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bU" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"bV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"bZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ca" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/planetengi) -"cb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cd" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ce" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ch" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"ci" = ( -/obj/machinery/power/energy_accumulator/grounding_rod/anchored, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cj" = ( -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ck" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/planetengi) -"cm" = ( -/obj/item/book/manual/wiki/atmospherics, -/obj/structure/table, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cp" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cs" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"ct" = ( -/obj/structure/window/reinforced/plasma/spawner/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/planetengi) -"cu" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"cx" = ( -/obj/item/pipe_dispenser, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cD" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer4, -/turf/open/floor/plating, -/area/ruin/planetengi) -"cE" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plating, -/area/ruin/planetengi) -"cF" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engineering Access"; - req_access_txt = "204" - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/planetengi) -"cI" = ( -/obj/item/modular_computer/tablet/pda/clear{ - note = "Chief's asked me to check on the machinery inside PDA. He's also worried about Build, but i'm sure Harry'll handle the construction. I just need to work on Internals. Fuck i'm hungry" - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cJ" = ( -/obj/item/modular_computer/tablet/pda/engineering{ - note = "To-do: Check on SM status. Get a pint at eat. Nag the research manager for RCDs." - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cL" = ( -/obj/effect/decal/remains/human, -/obj/item/mod/control/pre_equipped/engineering, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cO" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"cP" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer4{ - dir = 6 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cR" = ( -/obj/machinery/atmospherics/components/binary/pump/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cS" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cU" = ( -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"cV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cW" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cX" = ( -/obj/structure/cable, -/obj/machinery/power/emitter/welded{ - dir = 1 - }, -/turf/open/floor/catwalk_floor/iron, -/area/ruin/planetengi) -"cY" = ( -/obj/item/stack/sheet/plasmarglass, -/obj/item/card/id/advanced/engioutpost, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/ruin/planetengi) -"cZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"db" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/turf/open/floor/iron, -/area/ruin/planetengi) -"de" = ( -/turf/template_noop, -/area/template_noop) -"df" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/structure/sign/poster/official/pda_ad{ - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"dg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible/layer4, -/turf/open/floor/iron, -/area/ruin/planetengi) -"dh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"di" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/ruin/planetengi) -"dj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/turf/open/floor/iron, -/area/ruin/planetengi) -"dk" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/ruin/planetengi) -"dl" = ( -/obj/effect/mob_spawn/corpse/human/engineer/mod, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"dn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/plating, -/area/ruin/planetengi) -"do" = ( -/turf/closed/wall, -/area/ruin/planetengi) -"dp" = ( -/turf/closed/wall/ice, -/area/ruin/planetengi) -"dq" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"dr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/mob_spawn/corpse/human/engineer/mod, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"ds" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"dt" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/closed, -/obj/item/shard, -/turf/open/floor/plating, -/area/ruin/planetengi) -"du" = ( -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"dv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/ruin/planetengi) -"dw" = ( -/turf/open/floor/engine/air, -/area/ruin/planetengi) -"dx" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/ruin/planetengi) -"dy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on/layer4{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/planetengi) -"dz" = ( -/turf/open/floor/engine/vacuum, -/area/ruin/planetengi) -"dA" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/ruin/planetengi) -"dB" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/chair/sofa/bench/left{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/grey_tide{ - pixel_y = 32 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"dC" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/chair/sofa/bench/right{ - dir = 8 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"dD" = ( -/turf/closed/wall/rust, -/area/ruin/planetengi) -"dE" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"gK" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"kS" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"na" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 6 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"sc" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"tH" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/air, -/area/ruin/planetengi) -"vD" = ( -/turf/closed/wall/mineral/cult, -/area/ruin/planetengi) -"xA" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/vacuum, -/area/ruin/planetengi) -"yF" = ( -/mob/living/simple_animal/hostile/construct/proteon, -/turf/open/floor/iron, -/area/ruin/planetengi) -"Ai" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"GG" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"Iy" = ( -/obj/effect/turf_decal/tile/yellow, -/mob/living/simple_animal/hostile/construct/proteon, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"Je" = ( -/obj/structure/door_assembly/door_assembly_eng, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"KU" = ( -/turf/closed/wall/mineral/snow, -/area/ruin/planetengi) -"Lh" = ( -/obj/effect/turf_decal/weather/snow/corner, -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/planetengi) -"Nd" = ( -/obj/structure/girder/displaced, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"UK" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) -"Wh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron/icemoon, -/area/ruin/planetengi) - -(1,1,1) = {" -de -de -do -do -do -do -do -cE -cE -vD -cE -cE -do -do -do -do -do -de -de -"} -(2,1,1) = {" -de -de -do -an -aG -ba -br -cg -bd -by -bR -cP -aI -bo -dv -dw -do -de -de -"} -(3,1,1) = {" -de -de -do -ao -an -cE -bs -bL -cb -cb -cb -cb -cZ -cE -dw -tH -do -de -de -"} -(4,1,1) = {" -de -de -do -an -aK -bo -bv -aI -cc -be -cp -bW -db -ba -dx -dw -do -de -de -"} -(5,1,1) = {" -de -de -do -do -do -do -aH -bd -bc -cm -bS -bZ -df -do -do -do -do -de -de -"} -(6,1,1) = {" -de -de -do -aC -aL -ba -bx -bM -cd -cn -cn -cQ -dg -cD -dy -dz -do -de -de -"} -(7,1,1) = {" -de -de -do -aD -aC -cE -bF -bc -yF -bd -cx -cR -dh -cE -dz -xA -do -de -de -"} -(8,1,1) = {" -de -de -do -aC -aM -bo -aI -bQ -be -cp -cI -cS -di -dn -dA -dz -do -de -de -"} -(9,1,1) = {" -de -do -do -do -do -do -cE -vD -bz -bz -bz -do -cE -do -do -do -dp -do -de -"} -(10,1,1) = {" -vD -do -ax -aE -aT -do -bG -bV -ce -cs -bd -cV -bG -do -dB -UK -dq -dD -Ai -"} -(11,1,1) = {" -vD -ag -ay -aq -aV -cG -bd -bW -cf -bA -cJ -cW -bd -cG -cU -kS -Wh -Je -Ai -"} -(12,1,1) = {" -do -av -az -aF -aW -bq -aJ -bY -ci -ct -cL -cX -bd -cF -cU -GG -Wh -dp -Ai -"} -(13,1,1) = {" -do -aw -am -ar -bd -cG -bH -bZ -cj -bB -cW -cY -dj -cG -cU -Iy -dr -KU -aa -"} -(14,1,1) = {" -do -ah -aA -as -au -cG -bI -bZ -ck -cu -cn -cg -dk -dt -cU -GG -Nd -KU -aa -"} -(15,1,1) = {" -do -do -do -do -do -do -do -ca -cl -vD -cG -ca -vD -vD -dC -sc -ds -Lh -gK -"} -(16,1,1) = {" -de -de -aa -aa -aa -aa -aa -bD -bi -cv -bj -bD -aa -do -dD -do -dp -KU -gK -"} -(17,1,1) = {" -de -aa -aa -aa -aX -aa -aa -aQ -bj -bD -cO -bD -aa -aa -dE -du -du -aa -aa -"} -(18,1,1) = {" -de -de -aa -aa -aa -aa -aa -aQ -bl -bD -cO -bD -dl -du -na -de -aa -aa -de -"} -(19,1,1) = {" -de -de -de -de -aa -aa -aa -aQ -bl -bD -cO -bD -aa -aa -de -de -de -de -de -"} -(20,1,1) = {" -de -de -de -de -de -de -aa -aR -bm -ch -bU -ch -aa -de -de -de -de -de -de -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm deleted file mode 100644 index b8ca036db10d..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm +++ /dev/null @@ -1,171 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/unexplored) -"b" = ( -/obj/structure/sign/poster/contraband/lusty_xenomorph, -/turf/closed/indestructible/syndicate, -/area/icemoon/surface/outdoors) -"c" = ( -/turf/open/floor/mineral/diamond, -/area/icemoon/surface/outdoors) -"d" = ( -/obj/item/reagent_containers/food/drinks/trophy/gold_cup, -/turf/open/floor/mineral/diamond, -/area/icemoon/surface/outdoors) -"e" = ( -/obj/item/greentext{ - light_color = "#64C864"; - light_outer_range = 1 - }, -/turf/open/floor/mineral/diamond, -/area/icemoon/surface/outdoors) -"f" = ( -/obj/structure/falsewall/plastitanium, -/obj/structure/sign/poster/contraband/lusty_xenomorph, -/turf/open/floor/mineral/diamond, -/area/icemoon/surface/outdoors) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -b -b -b -a -a -a -a -"} -(4,1,1) = {" -a -a -a -b -c -c -c -b -a -a -a -"} -(5,1,1) = {" -a -a -b -c -c -d -c -c -b -a -a -"} -(6,1,1) = {" -a -a -b -c -d -e -d -c -f -a -a -"} -(7,1,1) = {" -a -a -b -c -c -d -c -c -b -a -a -"} -(8,1,1) = {" -a -a -a -b -c -c -c -b -a -a -a -"} -(9,1,1) = {" -a -a -a -a -b -b -b -a -a -a -a -"} -(10,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -"} -(11,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm deleted file mode 100644 index 283f87965833..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm +++ /dev/null @@ -1,886 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/nospawn) -"b" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/unpowered) -"c" = ( -/obj/structure/closet/toolcloset, -/obj/item/wrench, -/obj/item/screwdriver, -/obj/item/crowbar, -/obj/item/weldingtool/largetank, -/obj/item/wirecutters, -/obj/item/radio/off, -/turf/open/floor/wood, -/area/ruin/unpowered) -"d" = ( -/turf/open/openspace/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"e" = ( -/obj/item/clothing/suit/hooded/explorer, -/obj/item/clothing/mask/gas/explorer, -/obj/item/clothing/gloves/color/black, -/obj/item/storage/backpack/explorer, -/obj/item/flashlight/lantern, -/obj/item/storage/bag/ore, -/obj/structure/closet, -/obj/item/clothing/shoes/winterboots/ice_boots, -/turf/open/floor/wood, -/area/ruin/unpowered) -"f" = ( -/turf/open/floor/wood, -/area/ruin/unpowered) -"g" = ( -/obj/structure/fireplace, -/turf/open/floor/wood, -/area/ruin/unpowered) -"h" = ( -/obj/structure/flora/rock/icy, -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/nospawn) -"j" = ( -/obj/structure/sink/kitchen, -/turf/open/floor/wood, -/area/ruin/unpowered) -"k" = ( -/obj/structure/closet/crate/freezer, -/turf/open/floor/wood, -/area/ruin/unpowered) -"l" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/wood, -/area/ruin/unpowered) -"n" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/ruin/unpowered) -"o" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/floor/wood, -/area/ruin/unpowered) -"p" = ( -/obj/machinery/light/broken/directional/east, -/turf/open/floor/wood, -/area/ruin/unpowered) -"q" = ( -/obj/structure/table/wood, -/obj/item/pen, -/obj/machinery/light/broken/directional/west, -/obj/item/paper/crumpled/bloody{ - info = "help..."; - text = "" - }, -/turf/open/floor/wood, -/area/ruin/unpowered) -"r" = ( -/obj/item/chair/wood, -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/corpse/human/miner/explorer, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/wood, -/area/ruin/unpowered) -"s" = ( -/obj/effect/decal/cleanable/trail_holder, -/turf/open/floor/wood, -/area/ruin/unpowered) -"t" = ( -/turf/template_noop, -/area/template_noop) -"K" = ( -/obj/structure/ladder{ - travel_time = 40 - }, -/turf/open/floor/wood, -/area/ruin/unpowered) -"W" = ( -/turf/open/openspace/icemoon, -/area/template_noop) -"Y" = ( -/turf/open/openspace/icemoon/ruins, -/area/icemoon/surface/outdoors/nospawn) - -(1,1,1) = {" -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -t -"} -(2,1,1) = {" -t -t -t -t -t -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -t -t -t -t -t -"} -(3,1,1) = {" -t -t -t -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -t -t -t -t -"} -(4,1,1) = {" -t -t -t -d -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -t -t -t -"} -(5,1,1) = {" -t -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -t -t -"} -(6,1,1) = {" -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -t -"} -(7,1,1) = {" -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -"} -(8,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -"} -(9,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -b -b -b -b -b -b -b -Y -Y -Y -Y -Y -Y -Y -Y -t -"} -(10,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -b -b -b -b -b -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(11,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -c -f -f -o -q -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(12,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -e -f -f -f -r -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(13,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -f -f -f -f -s -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(14,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -g -f -f -f -s -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(15,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -f -f -f -f -s -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(16,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -j -f -f -f -s -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(17,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -k -f -f -f -s -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(18,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -l -f -f -f -K -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(19,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -b -b -b -f -f -p -b -b -b -Y -Y -Y -Y -Y -Y -Y -t -"} -(20,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -b -b -b -f -b -b -b -Y -Y -Y -Y -Y -Y -Y -Y -t -"} -(21,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -b -f -b -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -"} -(22,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -b -f -b -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -"} -(23,1,1) = {" -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -b -f -b -Y -Y -Y -Y -Y -Y -Y -Y -Y -t -t -"} -(24,1,1) = {" -t -t -Y -Y -Y -Y -Y -Y -Y -Y -Y -b -n -b -Y -Y -Y -Y -Y -Y -Y -Y -d -t -t -"} -(25,1,1) = {" -t -t -t -Y -Y -Y -Y -Y -Y -Y -a -h -h -h -a -Y -Y -Y -Y -Y -Y -d -t -t -t -"} -(26,1,1) = {" -t -t -t -d -Y -Y -Y -Y -Y -a -a -a -h -a -a -a -Y -Y -Y -Y -d -d -t -t -t -"} -(27,1,1) = {" -t -t -t -t -d -Y -Y -Y -a -a -a -a -a -a -a -a -a -Y -Y -d -d -t -t -t -t -"} -(28,1,1) = {" -t -t -t -t -t -d -d -a -a -a -a -a -a -a -a -a -a -a -d -W -t -t -t -t -t -"} -(29,1,1) = {" -t -t -t -t -t -t -t -a -a -a -a -a -a -a -a -a -a -a -t -t -t -t -t -t -t -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm deleted file mode 100644 index 7e9f7ee3954d..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm +++ /dev/null @@ -1,2272 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"az" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/chair, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"aP" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"bf" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/plate/small, -/obj/structure/sign/poster/official/moth_meth{ - pixel_y = 32 - }, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"bV" = ( -/obj/structure/chair/sofa/left{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"bW" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8 - }, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"cl" = ( -/obj/item/wallframe/airalarm{ - pixel_y = 3 - }, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"cv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"cH" = ( -/obj/structure/chair/sofa/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"cL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"cQ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"dx" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria/kitchen) -"dy" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/filled/shrink_ccw{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"dZ" = ( -/obj/structure/table, -/obj/item/trash/semki, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/reagent_containers/food/drinks/colocup, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"fa" = ( -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_access_txt = "28" - }, -/turf/open/floor/iron/white, -/area/ruin/pizzeria/kitchen) -"fo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"fF" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"gm" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/pizzeria) -"gS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/chair, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"gW" = ( -/obj/machinery/computer/arcade/orion_trail, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"gY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"hS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on, -/turf/open/floor/plating, -/area/ruin/pizzeria/kitchen) -"ir" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"iw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/ruin/pizzeria) -"iK" = ( -/turf/closed/wall, -/area/ruin/pizzeria/kitchen) -"iV" = ( -/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, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"jb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"ji" = ( -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"jX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/ruin/pizzeria/kitchen) -"jY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/power/apc/auto_name/directional/north{ - start_charge = 0 - }, -/obj/effect/decal/cleanable/ash, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"ko" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"kr" = ( -/obj/structure/table, -/obj/item/trash/waffles, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"kG" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"kI" = ( -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"lm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"lt" = ( -/obj/effect/decal/cleanable/food/egg_smudge, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"lR" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Moffuchi's Pizzeria" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"mb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/plate/small, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"mN" = ( -/obj/structure/flora/ausbushes/pointybush, -/obj/structure/sign/poster/official/moth_piping{ - pixel_y = 32 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"nr" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"om" = ( -/obj/structure/flora/grass/brown, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"ow" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"oM" = ( -/obj/effect/turf_decal/siding/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"qo" = ( -/obj/structure/chair/sofa/right{ - dir = 8 - }, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"qw" = ( -/obj/effect/decal/cleanable/food/salt, -/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/item/chair/stool/bar, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"qF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/chair, -/obj/item/toy/plush/moth{ - suicide_count = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"qR" = ( -/turf/template_noop, -/area/template_noop) -"rT" = ( -/obj/machinery/door/airlock{ - name = "Restrooms" - }, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"rU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/ruin/pizzeria/kitchen) -"rY" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"se" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/broken/directional/south, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"sl" = ( -/obj/item/wrench, -/obj/item/screwdriver, -/obj/item/crowbar/red, -/obj/structure/rack, -/obj/structure/sign/poster/official/moth_delam{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"sY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/filled/shrink_cw{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"tl" = ( -/obj/structure/table/reinforced, -/obj/item/pen/fountain, -/obj/structure/noticeboard{ - name = "menu board"; - pixel_y = 27 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria) -"tX" = ( -/obj/structure/fence/door, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"uU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"vf" = ( -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_x = 32 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"vO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"wd" = ( -/obj/structure/chair/sofa/left{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"wG" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/pizzeria/kitchen) -"wP" = ( -/obj/structure/grille, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"wS" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"wT" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria) -"xx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"yn" = ( -/obj/structure/table, -/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/item/reagent_containers/food/drinks/colocup{ - pixel_x = 5 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"yP" = ( -/obj/machinery/vending/dinnerware{ - onstation = 0 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"yS" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north{ - start_charge = 0 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"zO" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"zR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"Aa" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"Ah" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"Ay" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"AA" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_access_txt = "28" - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/white, -/area/ruin/pizzeria/kitchen) -"AP" = ( -/obj/structure/table, -/obj/item/clothing/suit/jacket/puffer, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"AZ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"Be" = ( -/obj/structure/table, -/obj/item/stack/sheet/cardboard{ - amount = 12 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria/kitchen) -"Bp" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Moffuchi's Pizzeria" - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"Cf" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"CZ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"Di" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Moffuchi's Pizzeria" - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"Dw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"DB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"DO" = ( -/obj/machinery/door/airlock{ - name = "Restrooms" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"Eu" = ( -/obj/item/wheelchair, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Ex" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"EU" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - name = "Drive Thru" - }, -/obj/machinery/door/window/left/directional/north{ - name = "Drive Thru" - }, -/turf/open/floor/iron/smooth_large, -/area/ruin/pizzeria/kitchen) -"Fe" = ( -/obj/machinery/light/small, -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"FL" = ( -/obj/structure/fence/corner, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"GM" = ( -/obj/structure/fence/corner{ - dir = 5 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Hm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/crate/bin, -/obj/item/trash/raisins, -/obj/item/trash/syndi_cakes, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"HM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light/warm/directional/north, -/obj/structure/sign/departments/restroom{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Ih" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"IA" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/toy/crayon/spraycan, -/obj/item/camera, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/effect/spawner/random/trash/botanical_waste, -/obj/item/seeds/tomato, -/obj/item/seeds/wheat, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/pizzeria) -"IL" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance/external{ - name = "External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/pizzeria/kitchen) -"IR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/item/wallframe/airalarm{ - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"IW" = ( -/obj/effect/spawner/random/entertainment/cigarette, -/obj/machinery/light/small/built/directional/south, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"IY" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/obj/item/plate_shard{ - icon_state = "plate_shard3" - }, -/obj/item/plate_shard, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"Jg" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Jt" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"Jv" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"JG" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"JM" = ( -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/obj/item/storage/bag/trash, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"KL" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"KU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Lf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/ruin/pizzeria) -"Lg" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"My" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"MN" = ( -/obj/structure/table, -/obj/item/trash/chips, -/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, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"MR" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"Ns" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Ny" = ( -/obj/machinery/processor, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"NK" = ( -/obj/structure/flora/ausbushes/pointybush, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"NL" = ( -/turf/closed/wall, -/area/ruin/pizzeria) -"Oy" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Moffuchi's Pizzeria" - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"OE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"OM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"Pg" = ( -/obj/structure/flora/grass/both, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Pj" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"PA" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"PE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"PK" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/closed/wall, -/area/ruin/pizzeria) -"PW" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/warm/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_y = 11 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria) -"Qg" = ( -/obj/structure/chair/sofa/left, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"Qm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/plate/small, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Qw" = ( -/obj/machinery/door/airlock/maintenance/external{ - name = "External Access" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/ruin/pizzeria/kitchen) -"RF" = ( -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"RW" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/item/trash/boritos, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"RX" = ( -/obj/structure/fence, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Sm" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Sw" = ( -/obj/structure/chair/sofa, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Sx" = ( -/obj/item/chair, -/obj/effect/spawner/random/trash/cigbutt, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"ST" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Ty" = ( -/obj/machinery/door/airlock{ - name = "Restrooms" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"TE" = ( -/obj/machinery/oven, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/north, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"TF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/pizzeria) -"TK" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"TU" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/white/filled/arrow_cw{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Uo" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/trash/energybar, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"UJ" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria/kitchen) -"UT" = ( -/obj/machinery/griddle, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"Vi" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Vs" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"VK" = ( -/obj/structure/chair/sofa/right{ - dir = 4 - }, -/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, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"WH" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"WO" = ( -/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/item/chair, -/obj/effect/turf_decal/siding/red{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"WT" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"WW" = ( -/obj/structure/girder, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"WX" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"Xc" = ( -/obj/structure/chair/sofa/right{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 5 - }, -/area/ruin/pizzeria) -"XB" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"XS" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = 5 - }, -/turf/open/floor/iron/checker, -/area/ruin/pizzeria) -"Ym" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance Access"; - req_access_txt = "28" - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/pizzeria) -"YW" = ( -/obj/structure/girder/displaced, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) -"Za" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/light/small/red/directional/south, -/obj/item/chair, -/turf/open/floor/iron/dark/side{ - dir = 10 - }, -/area/ruin/pizzeria) -"Ze" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/plate{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/pizzeria/kitchen) -"ZS" = ( -/obj/vehicle/ridden/scooter/skateboard, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/surface/outdoors/nospawn) - -(1,1,1) = {" -qR -qR -qR -qR -qR -qR -qR -TK -NK -TK -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -"} -(2,1,1) = {" -qR -qR -qR -qR -TK -TK -iK -wG -wG -wG -iK -TK -TK -TK -TK -TK -qR -qR -qR -qR -qR -qR -"} -(3,1,1) = {" -qR -qR -TK -TK -kI -iK -iK -My -WT -fF -iK -wG -wG -wG -iK -TK -TK -TK -TK -TK -qR -qR -"} -(4,1,1) = {" -qR -qR -nr -TK -TK -iK -TE -lt -kG -zR -iK -UJ -Be -dx -iK -iK -Pg -Jg -TK -TK -TK -qR -"} -(5,1,1) = {" -qR -qR -TK -TK -Jv -iK -bf -kG -kG -kG -fa -kG -kG -kG -oM -EU -Eu -RF -Jv -TK -TK -qR -"} -(6,1,1) = {" -qR -qR -qR -Jv -IW -iK -Ze -kG -kG -KL -iK -IR -kG -kG -Pj -wG -ZS -Vi -Jv -Jv -TK -qR -"} -(7,1,1) = {" -qR -qR -TK -Jv -Sx -iK -UT -kG -kG -rY -iK -tl -wT -XS -PW -NL -NL -wS -NL -Jg -TK -qR -"} -(8,1,1) = {" -qR -qR -TK -Jv -iK -iK -iK -yS -jX -CZ -iK -dy -Ns -sY -TU -xx -Oy -gY -Bp -Jv -Jv -Jv -"} -(9,1,1) = {" -qR -qR -qR -vf -Qw -hS -IL -AZ -Ih -cv -AA -cQ -fo -Uo -MR -OE -Di -Ah -lR -Jv -Jv -Jv -"} -(10,1,1) = {" -qR -qR -qR -NL -iK -iK -iK -Ny -yP -jb -iK -lm -Ay -JG -aP -Dw -NL -wS -NL -mN -TK -qR -"} -(11,1,1) = {" -qR -qR -qR -NL -sl -AP -iK -iK -iK -rU -iK -HM -gS -kr -ir -KU -bV -Xc -wS -TK -TK -qR -"} -(12,1,1) = {" -qR -qR -qR -NL -vO -Lf -Ym -PE -Aa -OM -Ty -zO -cL -TF -WX -Dw -Vs -mb -wS -TK -TK -qR -"} -(13,1,1) = {" -qR -qR -TK -NL -JM -bW -NL -cl -ji -uU -NL -jY -qF -Qm -az -ow -qo -wd -wS -TK -TK -qR -"} -(14,1,1) = {" -qR -qR -TK -NL -NL -Ex -NL -rT -NL -DO -NL -Jt -KU -Dw -KU -ko -NL -wS -NL -TK -TK -qR -"} -(15,1,1) = {" -qR -qR -TK -TK -NL -NL -NL -se -PK -Fe -NL -ow -Dw -KU -Dw -Hm -wS -TK -TK -TK -qR -qR -"} -(16,1,1) = {" -qR -qR -TK -TK -WW -XB -NL -NL -iw -NL -NL -gW -qw -IY -WO -PA -wS -TK -TK -TK -qR -qR -"} -(17,1,1) = {" -qR -qR -qR -TK -YW -wP -NL -IA -gm -NL -cH -VK -RW -iV -Cf -yn -wS -TK -TK -qR -qR -qR -"} -(18,1,1) = {" -qR -qR -qR -TK -TK -Jv -ST -Jv -Jv -NL -Sw -Lg -iV -Za -NL -wS -wS -TK -TK -qR -qR -qR -"} -(19,1,1) = {" -qR -qR -qR -TK -TK -kI -ST -Jv -Jv -NL -Qg -dZ -DB -MN -NL -TK -TK -TK -TK -TK -qR -qR -"} -(20,1,1) = {" -qR -qR -qR -qR -TK -TK -tX -Jv -Jv -NL -NL -wS -wS -wS -NL -TK -TK -Sm -kI -TK -qR -qR -"} -(21,1,1) = {" -qR -qR -qR -qR -TK -TK -GM -RX -RX -FL -TK -TK -TK -TK -TK -TK -TK -om -WH -TK -qR -qR -"} -(22,1,1) = {" -qR -qR -qR -qR -qR -TK -TK -TK -TK -TK -TK -qR -qR -qR -TK -TK -TK -TK -TK -qR -qR -qR -"} -(23,1,1) = {" -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -"} -(24,1,1) = {" -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm deleted file mode 100644 index 0e9dfb98eee5..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm +++ /dev/null @@ -1,724 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"bf" = ( -/obj/machinery/hydroponics/soil, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"cP" = ( -/mob/living/simple_animal/hostile/asteroid/polarbear, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"dy" = ( -/obj/item/grown/log, -/obj/item/grown/log, -/obj/item/grown/log, -/obj/item/hatchet/wooden{ - pixel_y = -19 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"dI" = ( -/obj/structure/barricade/wooden/crude/snow, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/powered/shuttle) -"fd" = ( -/obj/structure/table/bronze{ - color = "#666666" - }, -/obj/structure/sink/kitchen{ - pixel_y = 24 - }, -/obj/item/plate, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"ht" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"kj" = ( -/obj/structure/railing{ - color = "#8a7453"; - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"mq" = ( -/obj/structure/railing{ - color = "#8a7453"; - dir = 8 - }, -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"ng" = ( -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"nq" = ( -/obj/item/grown/log{ - pixel_y = -6 - }, -/obj/item/grown/log{ - pixel_y = 6 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"ol" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/powered/shuttle) -"pU" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"qd" = ( -/mob/living/simple_animal/hostile/tree, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"sF" = ( -/turf/open/openspace/icemoon/keep_below, -/area/icemoon/underground/explored) -"tD" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"uc" = ( -/obj/structure/table/bronze{ - color = "#666666" - }, -/obj/item/knife/hunting, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = 6; - pixel_y = 11 - }, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"uG" = ( -/obj/item/grown/log, -/obj/item/grown/log{ - pixel_y = 13 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"uH" = ( -/obj/structure/closet/cabinet, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/ammo_casing/shotgun/buckshot, -/obj/item/ammo_casing/shotgun/buckshot, -/obj/item/ammo_casing/shotgun/buckshot, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"vk" = ( -/obj/structure/railing{ - color = "#8a7453"; - dir = 10 - }, -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"vI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/candle{ - pixel_x = -8; - pixel_y = 13 - }, -/obj/item/food/soup/stew{ - name = "porridge"; - pixel_y = 3 - }, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"wl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/structure/mineral_door/wood, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"wN" = ( -/turf/open/openspace/icemoon/keep_below, -/area/ruin/powered/shuttle) -"ym" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"yO" = ( -/obj/structure/fluff/fokoff_sign{ - name = "Homestead Sign"; - pixel_y = 7 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"zd" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"zT" = ( -/obj/structure/bed/dogbed, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Cv" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Ea" = ( -/obj/structure/table/wood{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/book/bible{ - pixel_y = 5 - }, -/obj/item/candle{ - pixel_x = -10; - pixel_y = 5 - }, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"El" = ( -/obj/structure/table{ - color = "#f2ffbd" - }, -/obj/item/flashlight/lantern, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Ez" = ( -/obj/structure/railing{ - color = "#8a7453" - }, -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Fg" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"FS" = ( -/obj/structure/railing{ - color = "#8a7453" - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Ht" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Hv" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"HF" = ( -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/decal/cleanable/blood/innards, -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/effect/decal/cleanable/blood/gibs/limb{ - pixel_x = -9; - pixel_y = -8 - }, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Iz" = ( -/obj/structure/fireplace{ - pixel_x = -21 - }, -/obj/item/stack/sheet/animalhide/generic{ - pixel_x = -5; - pixel_y = -7 - }, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"IM" = ( -/obj/structure/barricade/wooden/snowed, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/powered/shuttle) -"Mf" = ( -/obj/structure/railing{ - color = "#8a7453" - }, -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Nz" = ( -/obj/structure/bed, -/obj/item/bedsheet/patriot, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"NP" = ( -/obj/item/wallframe/picture, -/turf/closed/wall/mineral/wood, -/area/ruin/powered/shuttle) -"Of" = ( -/obj/structure/closet/cabinet{ - name = "Pantry" - }, -/obj/item/food/grown/potato, -/obj/item/food/grown/potato, -/obj/item/food/grown/potato/sweet, -/obj/item/food/grown/potato/sweet, -/obj/item/seeds/coffee, -/obj/item/seeds/coffee, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"QI" = ( -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Rf" = ( -/obj/structure/railing{ - color = "#8a7453"; - dir = 1 - }, -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"RO" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/mineral_door/wood, -/obj/item/assembly/mousetrap/armed, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Sv" = ( -/turf/open/genturf, -/area/icemoon/underground/unexplored/rivers) -"SJ" = ( -/obj/structure/railing{ - color = "#8a7453"; - dir = 8 - }, -/obj/machinery/hydroponics/soil, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Tf" = ( -/obj/structure/railing{ - color = "#8a7453" - }, -/obj/machinery/hydroponics/soil, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"TP" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"VV" = ( -/obj/structure/bonfire, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"XZ" = ( -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/stone{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Zg" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/mineral_door/wood, -/turf/open/floor/wood/large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) - -(1,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -"} -(2,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -ol -ol -ol -dI -ol -mq -mq -SJ -vk -qd -Sv -Sv -"} -(3,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Sv -ol -ol -ol -NP -Ea -Cv -Cv -ol -zd -Ht -zd -Ht -Ht -Ht -Sv -"} -(4,1,1) = {" -Sv -sF -Sv -Sv -qd -Ht -IM -El -zT -ol -Iz -QI -QI -wl -Ht -zd -Ht -Ht -Ht -Ht -Sv -"} -(5,1,1) = {" -Sv -Sv -sF -sF -sF -Ht -ol -Nz -ng -RO -HF -ym -QI -wl -Ht -Ht -Ht -FS -yO -Ht -Sv -"} -(6,1,1) = {" -Sv -Sv -Sv -sF -sF -sF -ol -uH -ng -ol -pU -vI -pU -ol -Ht -bf -bf -Ez -Ht -tD -Sv -"} -(7,1,1) = {" -Sv -Sv -Sv -Sv -sF -sF -ol -ol -ol -ol -cP -Hv -ng -IM -zd -bf -bf -Tf -ht -Ht -Sv -"} -(8,1,1) = {" -Sv -Sv -Sv -Sv -sF -sF -sF -dI -wN -Zg -ng -ng -ng -ol -Ht -zd -Ht -Ht -Ht -Ht -Sv -"} -(9,1,1) = {" -Sv -Sv -Sv -Sv -Ht -Ht -Ht -ol -XZ -ol -fd -uc -Of -ol -Ht -bf -bf -bf -Ht -Sv -Sv -"} -(10,1,1) = {" -Sv -Sv -Sv -Sv -Sv -VV -Ht -ol -ol -ol -IM -ol -ol -ol -Ht -TP -bf -Tf -Sv -Sv -Sv -"} -(11,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Ht -Ht -Mf -dy -nq -uG -Rf -ht -Ht -Ht -Ht -Ht -Ht -Sv -Sv -Sv -"} -(12,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Sv -Fg -Ht -Ht -Ht -Ht -Ht -kj -kj -kj -Ht -Sv -Sv -Sv -Sv -Sv -"} -(13,1,1) = {" -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -Sv -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm deleted file mode 100644 index e9e09e1498a6..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm +++ /dev/null @@ -1,4874 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ac" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"af" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/structure/grille, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"ak" = ( -/obj/structure/chair/sofa/left{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"ao" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/clothing/shoes/galoshes{ - pixel_y = -5 - }, -/obj/item/flashlight/eyelight{ - pixel_y = 11 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"ap" = ( -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/fluff/tram_rail, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"az" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"aL" = ( -/obj/structure/fence/cut/medium, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"aM" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"aT" = ( -/obj/structure/window/reinforced/spawner/east, -/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/frame/computer{ - anchored = 1; - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"aY" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/wood{ - name = "Bunk A" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"br" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell, -/turf/open/floor/plating, -/area/ruin/plasma_facility/operations) -"bv" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"bD" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/effect/decal/remains/plasma{ - pixel_y = 11 - }, -/obj/effect/decal/cleanable/ash/large{ - pixel_y = 7 - }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron/white, -/area/ruin/plasma_facility/commons) -"bM" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"bT" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Plasma Relief Valve" - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"bX" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/warm/directional/south, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"cb" = ( -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"cn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/grunge{ - name = "Closet" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"cD" = ( -/obj/item/stack/sheet/iron, -/obj/item/stack/sheet/iron, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"cL" = ( -/obj/structure/table, -/obj/item/stack/cable_coil/cut{ - pixel_y = 6 - }, -/obj/item/screwdriver{ - pixel_x = -7; - pixel_y = 8 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = -18; - pixel_y = -3 - }, -/obj/item/wirecutters, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"cM" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"dc" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"dr" = ( -/obj/structure/lattice, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"dx" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/item/chair, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/iron, -/area/ruin/plasma_facility/operations) -"dB" = ( -/mob/living/simple_animal/hostile/asteroid/polarbear{ - name = "Baloo" - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"dG" = ( -/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_frame, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/obj/item/stock_parts/capacitor, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"dO" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"dQ" = ( -/obj/structure/bed, -/obj/machinery/iv_drip{ - pixel_x = -8; - pixel_y = -4 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/plasma, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron/white, -/area/ruin/plasma_facility/commons) -"dR" = ( -/obj/structure/lattice/catwalk, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"dU" = ( -/obj/structure/fluff/tram_rail{ - pixel_y = 9 - }, -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy{ - name = "landing marker" - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"dV" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/storage/toolbox/electrical, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"dY" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"ed" = ( -/obj/machinery/atmospherics/components/tank/plasma, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"ev" = ( -/obj/structure/window/reinforced/unanchored{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"eC" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"eD" = ( -/turf/closed/wall/ice, -/area/icemoon/underground/explored) -"eH" = ( -/obj/structure/fence/cut/large, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"eM" = ( -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/obj/item/shard{ - pixel_x = 11; - pixel_y = 6 - }, -/obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"eO" = ( -/obj/structure/table, -/obj/item/plate, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"eT" = ( -/obj/structure/table/reinforced, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/five, -/obj/item/circuitboard/machine/microwave, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"eX" = ( -/obj/structure/bonfire, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"fx" = ( -/obj/machinery/light/small/built/directional/west, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"fJ" = ( -/obj/structure/fence/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"fN" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/mimic/crate, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"fO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"fP" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 4; - pixel_y = -17 - }, -/obj/structure/fluff/tram_rail/end{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"gd" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"gj" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"gk" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"go" = ( -/obj/machinery/conveyor{ - id = "fire_facility_smelt" - }, -/obj/structure/window/reinforced/spawner/west, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"gD" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/black{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/north, -/turf/open/floor/iron/grimy, -/area/ruin/plasma_facility/commons) -"gH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"gR" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/structure/window/reinforced/spawner/east, -/obj/item/paper/crumpled/muddy{ - pixel_x = -8; - pixel_y = 4 - }, -/obj/item/reagent_containers/pill/patch/synthflesh{ - pixel_x = 6; - pixel_y = 2 - }, -/obj/item/surgical_drapes{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/ruin/plasma_facility/commons) -"hc" = ( -/obj/structure/rack, -/obj/machinery/light/small/broken/directional/east, -/obj/item/pickaxe, -/obj/item/clothing/head/hardhat/weldhat/orange, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"hd" = ( -/obj/effect/turf_decal/bot/right, -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/plasma/five, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"hr" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - dir = 1; - name = "Feed to Mining" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"hB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/book/random, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"hJ" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"hK" = ( -/obj/item/cigbutt/cigarbutt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"hN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"hR" = ( -/turf/closed/wall/ice, -/area/ruin/plasma_facility/operations) -"hU" = ( -/obj/structure/fence/end{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"hV" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/grille, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"hX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/anticorner, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"ia" = ( -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"ib" = ( -/obj/structure/fluff/tram_rail, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy{ - name = "landing marker" - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"ie" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"if" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"ii" = ( -/obj/structure/fence/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"ij" = ( -/obj/structure/lattice/catwalk, -/obj/structure/fluff/tram_rail{ - pixel_y = 9 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"il" = ( -/obj/effect/decal/cleanable/ants{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"iw" = ( -/obj/structure/railing, -/obj/item/grown/log{ - pixel_x = -7; - pixel_y = 1 - }, -/obj/item/grown/log, -/obj/item/grown/log{ - pixel_y = 7 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"iM" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal"; - name = "fire_facility_smelt" - }, -/obj/structure/window/reinforced/spawner/north, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/plasticflaps, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"ja" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"jb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/lights/mixed{ - pixel_x = 15; - pixel_y = 14 - }, -/mob/living/simple_animal/hostile/retaliate/frog{ - name = "Peter Jr." - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"js" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"jN" = ( -/obj/item/grown/log{ - pixel_x = -7; - pixel_y = -11 - }, -/obj/item/grown/log{ - pixel_y = -10 - }, -/obj/item/grown/log{ - pixel_y = -2 - }, -/obj/item/hatchet{ - pixel_y = 17 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"jO" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"jT" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"kh" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"ku" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"kA" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/obj/item/stack/ore/plasma, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"kG" = ( -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"kP" = ( -/obj/structure/fence, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"lc" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, -/obj/structure/mirror/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"lf" = ( -/obj/structure/fluff/tram_rail, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"lm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing/horizontal, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/icemoon/underground/explored) -"ly" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/caution, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"lG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing, -/obj/structure/fluff/tram_rail, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"lL" = ( -/obj/machinery/button/door/directional/north{ - id = "fire_facility_car"; - name = "Garage Door Button"; - pixel_y = 22; - req_access_txt = "47" - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"lU" = ( -/obj/item/chair/stool, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"lW" = ( -/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, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"lX" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lantern, -/obj/machinery/light/small/built/directional/west, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"ms" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"mt" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 1; - pixel_y = -17 - }, -/obj/structure/fluff/tram_rail/end{ - dir = 1 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"mu" = ( -/obj/structure/fence/cut/medium{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"mA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"mG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"mN" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple/half, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/mining{ - name = "Ore Processing" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/textured_half, -/area/ruin/plasma_facility/operations) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ - dir = 5 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"nl" = ( -/obj/item/stack/sheet/iron, -/obj/item/stack/sheet/iron{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/stack/sheet/iron, -/obj/item/stack/sheet/iron{ - pixel_x = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"nm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"no" = ( -/obj/structure/transit_tube/station/reverse, -/obj/structure/window/reinforced/spawner/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"nq" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/vehicle/ridden/wheelchair, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"nu" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"nz" = ( -/obj/machinery/door/airlock/hatch{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"nD" = ( -/obj/machinery/door/airlock/mining{ - name = "Interior Access" - }, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"oe" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"oi" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"or" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1; - pixel_y = -7 - }, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"oA" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"oE" = ( -/obj/structure/table, -/obj/item/paper{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/knife/combat/survival, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/external/glass/ruin, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"oM" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"oS" = ( -/obj/effect/turf_decal/tile/neutral/full, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/transit_tube/station/reverse/flipped{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/loading_area, -/obj/structure/transit_tube_pod{ - dir = 4 - }, -/turf/open/floor/iron/textured_large, -/area/ruin/plasma_facility/commons) -"oW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, -/turf/open/floor/plating/icemoon, -/area/icemoon/underground/explored) -"pd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/recharge_station, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"pf" = ( -/obj/structure/flora/grass/both, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"pj" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"pl" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"pn" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"pt" = ( -/obj/structure/table, -/obj/item/paperslip{ - pixel_x = 15; - pixel_y = -16 - }, -/obj/item/flashlight/lantern, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"pw" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/effect/turf_decal/bot_white{ - color = "#0560fc" - }, -/obj/structure/ore_box, -/turf/open/floor/iron/textured_large, -/area/ruin/plasma_facility/commons) -"pC" = ( -/obj/machinery/space_heater/improvised_chem_heater, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"pR" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"pX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"qk" = ( -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"qv" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"qw" = ( -/obj/machinery/atmospherics/components/tank/plasma, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"qP" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Feed Line to Primary Storage" - }, -/obj/machinery/door/airlock/highsecurity{ - name = "Explosive Resistant Airlock" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"qT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/item/wallframe/apc, -/obj/item/electronics/apc, -/obj/item/stack/cable_coil/five, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"qW" = ( -/turf/closed/wall, -/area/ruin/plasma_facility/commons) -"rc" = ( -/obj/effect/decal/cleanable/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"ri" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner/west, -/obj/structure/curtain/bounty, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"rk" = ( -/obj/structure/girder, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"ro" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/bot_white{ - color = "#0560fc" - }, -/obj/structure/ore_box, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"rs" = ( -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"rE" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/west, -/obj/effect/decal/cleanable/glass, -/obj/structure/window/reinforced/spawner, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"rF" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/wallframe/airalarm{ - pixel_y = 10 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"rS" = ( -/obj/effect/turf_decal/bot/left, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/plasma/thirty, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"sq" = ( -/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/reinforced/rglass, -/obj/effect/decal/cleanable/dirt, -/obj/item/disk/data/modkit_disc/resonator_blast, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"sr" = ( -/obj/structure/railing{ - dir = 5 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/sheet/mineral/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"su" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"sJ" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/ten, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/circuitboard/machine/space_heater, -/obj/item/stock_parts/capacitor, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"sP" = ( -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/plasma_facility/operations) -"sX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"sY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"tf" = ( -/obj/structure/grille/broken, -/obj/item/shard, -/obj/structure/fluff/clockwork/alloy_shards, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"tB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/grunge, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"tC" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/structure/grille, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"tG" = ( -/obj/item/stack/sheet/iron{ - pixel_x = 4 - }, -/obj/item/stack/sheet/iron{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plating/icemoon, -/area/icemoon/underground/explored) -"tP" = ( -/obj/machinery/light/small/broken/directional/south, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/commons) -"tX" = ( -/obj/structure/fluff/tram_rail, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"ui" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"ul" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner/west, -/obj/effect/decal/cleanable/glass, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"uo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"up" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"uq" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"ux" = ( -/obj/structure/transit_tube/horizontal, -/obj/effect/decal/cleanable/glass, -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"uH" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general{ - name = "Mining to Feed" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"uU" = ( -/obj/structure/fluff/clockwork/alloy_shards, -/obj/item/stack/sheet/iron/five, -/obj/item/tank/internals/emergency_oxygen/empty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"ve" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"vt" = ( -/turf/closed/wall, -/area/ruin/plasma_facility/operations) -"vz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"vI" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"vY" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/explored) -"wb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/mining{ - name = "Interior Access" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"wc" = ( -/obj/structure/fence/cut/medium, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"wg" = ( -/obj/effect/turf_decal/tile/brown, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/ruin/plasma_facility/operations) -"wm" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"wu" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"wF" = ( -/obj/structure/frame, -/obj/item/stack/cable_coil/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"wQ" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 9; - pixel_y = 3 - }, -/obj/item/plate/oven_tray{ - pixel_x = -4; - pixel_y = -3 - }, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"xd" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"xV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"yp" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/knife/kitchen, -/obj/item/food/grown/carrot, -/obj/item/food/grown/potato, -/obj/item/food/meat/slab/human/mutant/zombie, -/obj/item/food/meat/slab/human/mutant/zombie, -/obj/item/food/grown/mushroom/plumphelmet, -/obj/item/food/grown/mushroom/plumphelmet, -/obj/item/food/grown/eggplant, -/obj/item/food/grown/eggplant, -/obj/item/food/grown/tomato, -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"yv" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"yL" = ( -/obj/structure/girder, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"zk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"zD" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 1; - pixel_y = -8 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"zF" = ( -/obj/structure/flora/grass/brown, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"zO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"zU" = ( -/obj/structure/fence/end{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"zX" = ( -/obj/structure/flora/grass/green, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Ad" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Ae" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, -/obj/machinery/door/airlock/engineering{ - name = "Utilities Room" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/smooth_half, -/area/ruin/plasma_facility/operations) -"Ak" = ( -/obj/structure/bed/maint, -/obj/item/bedsheet/dorms, -/obj/item/candle{ - pixel_x = 12; - pixel_y = 9 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"An" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"Au" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"AG" = ( -/turf/open/genturf, -/area/icemoon/underground/unexplored/rivers) -"AT" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"AZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Bc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/wardrobe/grey, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Bi" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"BJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"BM" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"BQ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"BY" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/warning, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"BZ" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/mining{ - name = "Processing Control" - }, -/turf/open/floor/iron/textured_half, -/area/ruin/plasma_facility/operations) -"Cb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/railing/corner, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Cm" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"Co" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/conveyor_switch/oneway{ - id = "fire_facility_smelt"; - name = "mining conveyor" - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/floor/iron, -/area/ruin/plasma_facility/operations) -"CA" = ( -/obj/item/chair/plastic, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"CJ" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"CU" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"CW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"CX" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Dp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/general/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Dr" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "fire_facility_car"; - name = "Garage Door" - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"DJ" = ( -/obj/structure/fluff/tram_rail{ - pixel_y = 9 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"DN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"DQ" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"DR" = ( -/obj/machinery/light/small/broken/directional/north, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"DZ" = ( -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Ea" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Ee" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 4; - pixel_y = -17 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Ef" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"El" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/flora/stump, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"EZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink{ - pixel_y = 20 - }, -/obj/item/reagent_containers/glass/bucket, -/obj/item/mop/advanced, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Fb" = ( -/obj/structure/lattice/catwalk, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/fluff/tram_rail, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Fh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/machinery/light/small/broken/directional/north, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"FD" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/uranium/five, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"FG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 10 - }, -/obj/structure/fluff/tram_rail, -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"FI" = ( -/obj/machinery/atmospherics/components/tank/plasma, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"FO" = ( -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"FP" = ( -/obj/structure/window/reinforced/spawner/north, -/obj/item/soap/homemade{ - pixel_y = 2 - }, -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"Gb" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Gd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"Go" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/grille/broken, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner/north, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Hp" = ( -/obj/structure/railing/corner, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Hq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"Hv" = ( -/obj/structure/table, -/obj/item/gun/energy/plasmacutter/adv{ - pixel_y = 4 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Hz" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"HA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"HC" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"HG" = ( -/obj/structure/girder, -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"HK" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/commons) -"HS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"HX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Ib" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Id" = ( -/obj/structure/lattice, -/obj/machinery/light/small/directional/north, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"Ij" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"In" = ( -/obj/structure/flora/grass/green, -/obj/machinery/light/small/broken/directional/east, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/plasma_facility) -"II" = ( -/obj/structure/lattice, -/obj/machinery/light/small/broken/directional/south, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"IJ" = ( -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"IU" = ( -/obj/structure/chair/sofa/right{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/general/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Ja" = ( -/obj/structure/lattice/catwalk, -/obj/effect/decal/cleanable/glass, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Jb" = ( -/obj/machinery/door/airlock/maintenance/external{ - name = "Repair Shop" - }, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Jj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 5 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Jn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/built/directional/west, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"Jp" = ( -/obj/effect/turf_decal/tile/neutral/half, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/command/glass{ - name = "Operations" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/dark/textured_half, -/area/ruin/plasma_facility/commons) -"Ju" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/west, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Jv" = ( -/obj/structure/bed/maint, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/storage/fancy/cigarettes/cigpack_xeno{ - pixel_x = 3; - pixel_y = 7 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Jy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"JD" = ( -/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/layer2{ - dir = 4 - }, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"JQ" = ( -/obj/structure/fence/end{ - dir = 1 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"JX" = ( -/obj/effect/turf_decal/siding/wood, -/obj/item/clothing/suit/hooded/wintercoat/miner{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/clothing/head/hooded/winterhood/miner{ - pixel_x = -6; - pixel_y = 7 - }, -/obj/item/chair/wood, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"Kd" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/plasma_facility/operations) -"Kf" = ( -/obj/structure/bed, -/obj/item/bedsheet/black, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/miner/explorer, -/obj/machinery/light/small/blacklight/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/plasma_facility/commons) -"Km" = ( -/obj/structure/girder, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Kr" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Kw" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/fireplace{ - pixel_x = -26 - }, -/obj/item/stack/sheet/animalhide/cat{ - pixel_x = -9; - pixel_y = -4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/shoes/winterboots{ - pixel_x = 11; - pixel_y = 8 - }, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"Kx" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"KO" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/silver{ - name = "Bathroom" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"KP" = ( -/obj/structure/fence/door/opened{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"KV" = ( -/mob/living/simple_animal/hostile/mimic/crate, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"KY" = ( -/obj/machinery/light/small/built/directional/south, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/plasma_facility/commons) -"Lh" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Lu" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/general/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"LD" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"LK" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"LM" = ( -/obj/structure/table, -/obj/item/paper{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/paperslip, -/obj/item/paper{ - pixel_x = 7 - }, -/obj/item/pen{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"LY" = ( -/obj/machinery/light/small/built/directional/north, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"LZ" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Mc" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/structure/closet/firecloset, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"Mi" = ( -/obj/structure/lattice/catwalk, -/obj/structure/fluff/tram_rail{ - pixel_y = 9 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Mz" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"MH" = ( -/obj/structure/girder, -/obj/item/stack/sheet/iron, -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/plasma_facility/operations) -"MN" = ( -/obj/structure/grille/broken, -/obj/structure/window/reinforced/spawner, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"MO" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"MT" = ( -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"MU" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"MW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Na" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Ne" = ( -/obj/structure/flora/grass/brown, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Nf" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Ng" = ( -/obj/effect/turf_decal/tile/green/half, -/obj/effect/turf_decal/tile/green/half{ - dir = 1 - }, -/obj/machinery/door/airlock/medical{ - name = "Sickbay" - }, -/obj/effect/mapping_helpers/airlock_note_placer{ - note_info = "DO NOT ENTER!!!" - }, -/obj/effect/decal/cleanable/blood/tracks, -/turf/open/floor/iron/white/textured_half, -/area/ruin/plasma_facility/commons) -"Nm" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"No" = ( -/obj/structure/rack, -/obj/structure/window/reinforced/spawner/north, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Nw" = ( -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Air to Distro" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Ny" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"NC" = ( -/obj/structure/sign/warning, -/turf/closed/wall, -/area/icemoon/underground/explored) -"NX" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"On" = ( -/obj/structure/windoor_assembly{ - dir = 8 - }, -/obj/effect/decal/cleanable/glass, -/obj/item/shard, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"Or" = ( -/obj/machinery/atmospherics/components/tank/plasma, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Ov" = ( -/obj/effect/turf_decal/bot_white{ - color = "#0560fc" - }, -/obj/item/crowbar/red, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"OC" = ( -/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/chair/office/light{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"OF" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"OJ" = ( -/obj/effect/turf_decal/delivery, -/obj/item/wallframe/airalarm{ - pixel_y = 10 - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"OM" = ( -/obj/item/storage/toolbox/mechanical/old, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Ps" = ( -/obj/structure/window/reinforced/spawner/east, -/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/reinforced/rglass, -/obj/item/toy/plush/plasmamanplushie{ - name = "Aurem Negative Fourteen" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"Pt" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "fire_facility_smelt" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/plasma_facility/operations) -"Px" = ( -/obj/structure/table, -/obj/item/food/pie/cherrypie{ - pixel_y = 10 - }, -/obj/item/poster/random_official{ - desc = "Its contents have long since faded to the elements of time..."; - name = "Worn Map"; - pixel_x = -7; - pixel_y = -7 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"Py" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/item/wrench, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Pz" = ( -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/fluff/tram_rail, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"PB" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"PP" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/glasses/thermal/eyepatch{ - pixel_y = 8 - }, -/turf/open/floor/iron/grimy, -/area/ruin/plasma_facility/commons) -"PQ" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"PR" = ( -/obj/structure/girder, -/obj/item/stack/sheet/iron, -/obj/item/stack/sheet/iron, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"PS" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"PX" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"PZ" = ( -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/turf_decal/bot_red, -/obj/machinery/suit_storage_unit, -/turf/open/floor/iron/textured_large, -/area/ruin/plasma_facility/commons) -"Qh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"Qn" = ( -/obj/structure/fluff/tram_rail/end{ - dir = 1 - }, -/obj/structure/fluff/tram_rail/end{ - dir = 1; - pixel_y = -17 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"QA" = ( -/obj/item/plate/oven_tray{ - color = "#858585"; - desc = "A convenient place to put all your loose ends!"; - name = "Mechanic's Tray"; - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/screwdriver, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"QJ" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"QM" = ( -/obj/structure/fence/cut/medium{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"QQ" = ( -/obj/structure/dresser, -/turf/open/floor/iron/grimy, -/area/ruin/plasma_facility/commons) -"QY" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Rd" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Rf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Rj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/item/shard, -/obj/structure/cable, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Rt" = ( -/obj/machinery/light/small/blacklight/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/plasma_facility/commons) -"RK" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"RM" = ( -/obj/effect/decal/cleanable/glass, -/obj/structure/rack, -/obj/item/food/rationpack, -/obj/item/food/rationpack{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/icemoon/underground/explored) -"RX" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/west, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/curtain/bounty, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Sd" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Sf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"Sk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"SA" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/wood{ - name = "Bunk B" - }, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"SR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"SV" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/canister_frame/machine, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Tr" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"TD" = ( -/obj/structure/table/reinforced, -/obj/structure/sink/kitchen{ - dir = 8; - pixel_x = 11 - }, -/obj/item/reagent_containers/food/condiment/rice{ - pixel_x = -6; - pixel_y = 11 - }, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"TK" = ( -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"TY" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/fancy/cigarettes/cigpack_robustgold, -/obj/item/lighter, -/obj/item/stock_parts/matter_bin, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"Ue" = ( -/obj/structure/transit_tube/horizontal, -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"UN" = ( -/obj/structure/fence/cut/large{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"UP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/chair/plastic, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"UT" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/structure/window/reinforced/spawner/east, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"Ve" = ( -/obj/structure/flora/stump, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Vy" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "fire_facility_car"; - name = "Garage Door" - }, -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"VD" = ( -/obj/effect/turf_decal/tile/brown/half, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"VS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Maintenance" - }, -/turf/open/floor/plating, -/area/ruin/plasma_facility/operations) -"VT" = ( -/obj/item/chair/wood, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"VZ" = ( -/obj/structure/windoor_assembly, -/obj/effect/decal/cleanable/glass, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"Wd" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Wu" = ( -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"Wx" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/decal/cleanable/glass, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/public{ - name = "Commons Area" - }, -/turf/open/floor/iron/dark/textured_half, -/area/ruin/plasma_facility/commons) -"WC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"WG" = ( -/obj/machinery/light/small/broken/directional/west, -/turf/open/lava/plasma/ice_moon, -/area/ruin/plasma_facility/operations) -"WK" = ( -/obj/effect/turf_decal/tile/brown/anticorner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"WU" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/ruin/plasma_facility/operations) -"Xh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_half{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"Xj" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/item/shard, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"XA" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/smooth_large{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/operations) -"XC" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/plasma_facility/commons) -"XI" = ( -/turf/closed/wall/ice, -/area/ruin/plasma_facility/commons) -"XK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/general/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"XS" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/toilet, -/obj/structure/curtain, -/turf/open/floor/iron/freezer, -/area/ruin/plasma_facility/commons) -"XT" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"XU" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, -/obj/structure/mirror/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"XW" = ( -/obj/effect/turf_decal/tile/brown/full, -/obj/effect/turf_decal/bot_white{ - color = "#0560fc" - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/pickaxe, -/turf/open/floor/iron/textured_large, -/area/ruin/plasma_facility/commons) -"Yl" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Yw" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"YC" = ( -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/caution, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/textured_large, -/area/ruin/plasma_facility/commons) -"YI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/plasma_facility/commons) -"YN" = ( -/obj/structure/fence/end, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"YP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/commons) -"Zf" = ( -/obj/structure/girder, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Zh" = ( -/obj/structure/fluff/tram_rail{ - pixel_y = 17 - }, -/obj/structure/fluff/tram_rail, -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy{ - name = "landing marker" - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Zk" = ( -/obj/effect/turf_decal/tile/brown/half{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/paper/crumpled/bloody{ - info = "I've sealed the place off. I'm taking the last snowtreader to look for help. Please, if you find this place, leave. It's not safe here. We made them angry." - }, -/turf/open/floor/iron, -/area/ruin/plasma_facility/commons) -"Zp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/lava/plasma/ice_moon, -/area/icemoon/underground/explored) -"Zr" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 3; - pixel_y = 12 - }, -/obj/item/folder/red{ - pixel_x = -9; - pixel_y = 12 - }, -/obj/item/folder/blue{ - pixel_x = -3; - pixel_y = 17 - }, -/obj/item/paperslip{ - pixel_x = -5; - pixel_y = 15 - }, -/obj/item/paper{ - pixel_x = -12; - pixel_y = 16 - }, -/obj/item/paper{ - pixel_x = -7; - pixel_y = 18 - }, -/obj/item/pen/red{ - pixel_y = 14 - }, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_x = 10; - pixel_y = -2 - }, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"ZA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/stone, -/area/ruin/plasma_facility/commons) -"ZB" = ( -/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/filingcabinet/chestdrawer/wheeled, -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark/textured, -/area/ruin/plasma_facility/commons) -"ZC" = ( -/obj/effect/decal/cleanable/glass, -/obj/machinery/light/small/built/directional/east, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"ZH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood/large, -/area/ruin/plasma_facility/commons) -"ZN" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner/west, -/turf/open/floor/plating/icemoon, -/area/ruin/plasma_facility/operations) -"ZR" = ( -/obj/item/pen{ - pixel_x = 5; - pixel_y = 15 - }, -/obj/item/cautery, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/ruin/plasma_facility/commons) - -(1,1,1) = {" -AG -AG -AG -AG -AG -kG -Yw -ms -ms -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -"} -(2,1,1) = {" -AG -AG -AG -PQ -ms -ms -ms -ms -Yw -ms -LZ -ms -zF -AG -AG -AG -AG -AG -AG -AG -ms -ms -Ve -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -"} -(3,1,1) = {" -AG -AG -AG -ms -ms -Yw -ms -Yw -ms -ms -ms -ms -ms -ms -PQ -ms -Ve -Yw -ms -ms -ms -Yl -rs -ms -ms -AG -AG -AG -AG -AG -AG -AG -AG -"} -(4,1,1) = {" -AG -AG -ms -ms -PX -ms -ms -Yw -Yw -ms -qk -ms -Yl -Yw -ms -ms -ms -ms -qk -ms -Ve -qk -rs -ms -zF -ms -AG -AG -AG -AG -AG -AG -AG -"} -(5,1,1) = {" -AG -AG -ms -ii -kP -YN -Yw -ms -JQ -eH -cM -kP -XI -tf -Km -kP -wc -CX -kP -fJ -PX -rs -rs -ms -ms -PX -AG -AG -AG -AG -AG -AG -AG -"} -(6,1,1) = {" -AG -AG -Yl -vI -Yw -ms -Hz -Yw -Yw -Yw -KY -qW -XI -uU -qW -XI -Rt -Yw -Yw -UN -ms -rs -rs -rs -LZ -AG -AG -AG -AG -ms -AG -AG -AG -"} -(7,1,1) = {" -AG -AG -ms -mu -ms -ms -ms -Yw -Yw -Yw -Yw -Qh -Jn -OF -XC -Qh -Yw -Yw -Yw -BY -LZ -rs -fP -rs -ms -AG -AG -AG -ms -ms -ms -AG -AG -"} -(8,1,1) = {" -AG -AG -LZ -BY -ms -hJ -Py -Yw -hJ -gd -Yw -XI -wb -hN -nD -Km -Yw -Yw -Yw -QM -rs -rs -tX -rs -AG -AG -AG -Ve -ms -Yw -ms -AG -AG -"} -(9,1,1) = {" -AG -AG -PQ -vI -Hz -Yw -Yw -Yw -ms -QA -Yw -qW -WK -Ny -ku -XI -Ov -ro -DZ -yL -Zp -Zp -FG -rs -AG -AG -AG -Yw -ms -ms -Yw -Yw -AG -"} -(10,1,1) = {" -AG -AG -vY -vY -OM -LK -ms -Yw -LK -Kr -Yw -XI -cb -DN -if -XI -vt -Ef -Nf -hR -dR -dR -lG -rs -Yl -AG -qk -eX -ms -Yw -ms -Yl -AG -"} -(11,1,1) = {" -AG -AG -vY -vY -Sd -pf -Ne -In -jO -zX -XI -XI -Nm -lW -pl -Mc -af -rS -hd -vt -hR -hR -oW -rs -ms -Ve -ms -VT -Yw -Hz -ms -Yw -vY -"} -(12,1,1) = {" -AG -AG -vY -vY -XI -RX -Ea -qW -ri -ri -qW -XW -PB -bM -VD -gj -ac -pX -Ib -js -CJ -vt -fO -rs -qk -ms -ms -sP -Yw -Yw -Yw -Kd -vY -"} -(13,1,1) = {" -AG -AG -ms -vY -qW -PP -Kf -qW -gD -QQ -qW -pw -Tr -YI -uq -ja -mN -Xh -Ib -LD -iM -hR -fO -rs -rs -LZ -ms -hR -Dr -Dr -Vy -yL -vY -"} -(14,1,1) = {" -AG -AG -qk -XI -qW -qW -SA -qW -aY -qW -XI -pw -Zk -eC -bv -DQ -hR -OJ -go -Bi -Pt -hR -fO -rs -rs -rs -ms -hR -lL -FO -oA -hR -vY -"} -(15,1,1) = {" -AG -AG -ms -qW -JX -Wu -zk -Jy -Gd -QJ -MU -qW -rF -bM -xd -vt -hR -ZN -CU -hR -vt -MH -fO -rs -Hp -zU -aL -vt -FO -LD -FO -MN -vY -"} -(16,1,1) = {" -AG -AG -ms -qW -Kw -ZH -BJ -hK -ZH -wF -UT -pn -PB -eC -yv -vt -wg -br -wg -vt -Rf -hR -Fh -AZ -AZ -dO -DZ -Jb -up -FO -ia -HX -vY -"} -(17,1,1) = {" -AG -AG -zF -YP -su -pt -LM -lU -CW -sX -Wx -gH -RK -bM -nu -BZ -WU -dx -Co -vt -Sf -nz -fO -rs -az -hU -KP -hR -yL -Rd -hR -vt -vY -"} -(18,1,1) = {" -AG -AG -LZ -Xj -cD -oE -Zr -bX -XI -qW -XI -qW -pC -bM -BJ -hR -vt -vt -vt -hR -Sf -vt -fO -rs -rs -Ve -Yw -Yw -vt -Ju -yL -vY -vY -"} -(19,1,1) = {" -AG -AG -rs -HK -su -Px -eO -qT -XI -XU -lc -qW -PR -eC -bv -hR -WC -WC -uo -WC -Sf -HG -fO -rs -rs -Yl -ms -ms -El -jN -iw -vY -vY -"} -(20,1,1) = {" -AG -AG -rs -YP -or -HA -ZA -il -KO -Hq -nm -VZ -qW -dY -aM -VS -WC -qW -XI -cn -vt -hR -fO -rs -rs -rs -Ve -Yw -Yw -Yw -PX -Yl -vY -"} -(21,1,1) = {" -AG -rs -rs -qW -eT -wQ -TD -yp -qW -XS -On -FP -qW -TK -bv -vt -pd -XI -Hv -SR -Ak -hR -fO -rs -rs -rs -PQ -ms -eD -tG -Zf -ev -AG -"} -(22,1,1) = {" -rs -rs -rs -XI -qW -qW -qW -qW -qW -qW -qW -qW -XI -wu -bv -vt -Bc -vt -cL -UP -hB -vt -hR -rs -rs -rs -zF -ms -No -Yw -ZC -ms -AG -"} -(23,1,1) = {" -rs -rs -rs -Xj -dG -JD -XI -Ja -qW -gR -ZR -Cm -nq -TK -bv -hR -vt -hR -qW -EZ -jb -QY -rk -rs -rs -rs -ms -ms -nl -RM -eD -AG -AG -"} -(24,1,1) = {" -rs -rs -rs -YP -ZB -mG -Jp -ve -XI -dQ -bD -Ng -An -dc -Au -Ae -Ad -MT -vt -ao -sJ -pR -vt -DR -rs -rs -ms -ms -ms -PX -Yl -AG -AG -"} -(25,1,1) = {" -rs -rs -rs -YP -sq -OC -qW -ve -qW -qW -qW -qW -pj -bM -sY -hR -Nw -dV -hR -vt -vt -hR -hR -rs -rs -rs -ms -ms -ms -dB -ms -AG -AG -"} -(26,1,1) = {" -rs -rs -tP -XI -Ps -aT -XI -HC -oF -rc -xV -tB -BM -bM -bv -hR -wm -XA -Rj -Gb -kA -rk -fO -rs -rs -rs -ms -ms -qk -ms -zF -AG -AG -"} -(27,1,1) = {" -AG -rs -rs -ui -ij -Fb -Mi -MO -XI -Wd -hV -qW -LY -zO -hX -hR -hR -rk -hR -DZ -ie -SV -AT -rs -rs -rs -Yl -ms -ms -ms -ms -AG -AG -"} -(28,1,1) = {" -AG -rs -rs -rs -DJ -Pz -zD -Cb -MO -oM -Lh -XI -PZ -oS -YC -qW -KV -ie -TY -ie -vz -HS -fO -rs -rs -rs -rs -PQ -ms -ms -AG -AG -AG -"} -(29,1,1) = {" -AG -AG -rs -rs -zD -Pz -rs -gk -rs -rs -PS -qW -hV -XT -qv -XI -oe -uH -nk -DZ -DZ -bT -fO -rs -rs -rs -rs -ms -zF -Ve -AG -AG -AG -"} -(30,1,1) = {" -AG -AG -rs -rs -rs -tX -rs -Jj -MW -MW -BQ -lf -oM -lm -oM -ap -Lu -hr -XK -ak -IU -Dp -FD -Ee -rs -rs -rs -ms -PX -ms -AG -AG -AG -"} -(31,1,1) = {" -AG -AG -AG -rs -rs -Zh -rs -rs -rs -rs -rs -tX -rs -Ue -rs -tX -fN -Na -vz -rk -hR -qP -vt -hR -rs -rs -rs -qk -ms -ms -AG -AG -AG -"} -(32,1,1) = {" -AG -AG -AG -PX -rs -mt -rs -rs -rs -rs -rs -Qn -rs -Ue -rs -Qn -rs -sr -Mz -vt -ed -ed -ed -vt -rs -rs -rs -Ve -ms -AG -AG -AG -AG -"} -(33,1,1) = {" -AG -AG -AG -AG -AG -rs -rs -rs -rs -rs -rs -rs -rs -Ue -rs -rs -rs -rs -rs -hR -ed -FI -ed -rk -dr -dr -dr -NC -ms -AG -AG -AG -AG -"} -(34,1,1) = {" -AG -AG -AG -AG -AG -AG -rs -rs -rs -rs -rs -fP -rs -Ue -rs -fP -rs -rs -rs -hR -rk -vt -hR -vt -rs -rs -rs -rs -LZ -AG -AG -AG -AG -"} -(35,1,1) = {" -AG -AG -AG -AG -AG -AG -PQ -rs -rs -rs -rs -tX -Go -ux -ZN -tX -rs -rs -rs -WG -rs -tX -dr -fx -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(36,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -rs -NX -vt -no -ly -eM -rs -rs -rs -rs -rs -tX -dr -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(37,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -rs -af -lX -kh -mA -jT -rs -rs -rs -rs -rs -tX -dr -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(38,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -NC -dr -II -vt -Jv -CA -Sk -vt -Id -dr -NC -rs -rs -tX -NC -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(39,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -zF -rs -rs -oi -qw -Or -hc -IJ -rs -rs -rs -rs -rs -tX -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(40,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -Ij -qw -qw -vt -tC -rs -rs -rs -rs -rs -tX -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(41,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -Pz -ul -Kx -rE -Pz -rs -rs -rs -rs -rs -ib -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -"} -(42,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -mt -rs -DJ -rs -mt -rs -rs -rs -rs -rs -mt -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -"} -(43,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -rs -DJ -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -"} -(44,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -PX -rs -rs -dU -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -AG -AG -"} -(45,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -zD -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -AG -AG -"} -(46,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -rs -rs -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -"} -(47,1,1) = {" -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -rs -rs -rs -rs -rs -rs -rs -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -AG -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm deleted file mode 100644 index d8958e7f66d9..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ /dev/null @@ -1,1403 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ay" = ( -/turf/open/floor/carpet, -/area/ruin/powered) -"aM" = ( -/turf/open/floor/wood, -/area/ruin/powered) -"aP" = ( -/obj/structure/dresser, -/obj/structure/mirror/directional/north, -/turf/open/floor/wood, -/area/ruin/powered) -"aZ" = ( -/obj/structure/sign/poster/ripped, -/turf/closed/wall/rust, -/area/icemoon/underground/explored) -"bR" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/structure/fluff/fokoff_sign, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"bY" = ( -/obj/structure/flora/stump, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"cj" = ( -/obj/structure/table, -/obj/item/food/fishandchips, -/turf/open/floor/iron/checker, -/area/ruin/powered) -"cB" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/wood, -/area/ruin/powered) -"dh" = ( -/obj/machinery/door/airlock/wood, -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/wood, -/area/ruin/powered) -"fD" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/blood/bubblegum, -/obj/item/bedsheet/random, -/turf/open/floor/wood, -/area/ruin/powered) -"gG" = ( -/obj/structure/table/wood, -/obj/item/food/sashimi{ - pixel_y = 10 - }, -/obj/item/reagent_containers/food/drinks/mug/coco{ - pixel_x = -10 - }, -/obj/item/reagent_containers/food/drinks/mug/coco{ - pixel_x = 10; - pixel_y = -4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/ruin/powered) -"hD" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"iz" = ( -/obj/structure/fence/door/opened{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"iB" = ( -/turf/closed/mineral/snowmountain/icemoon, -/area/icemoon/underground/explored) -"jk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/powered) -"jH" = ( -/obj/item/clothing/head/bearpelt, -/obj/structure/table/wood, -/obj/item/food/burger/fish, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -4 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = 10; - pixel_y = 6 - }, -/turf/open/floor/wood, -/area/ruin/powered) -"jP" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"kl" = ( -/obj/structure/sign/poster/official/nanotrasen_logo, -/turf/closed/wall, -/area/icemoon/underground/explored) -"ks" = ( -/obj/structure/flora/rock/icy, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"kY" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/holofloor/wood, -/area/ruin/powered) -"la" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/obj/effect/mob_spawn/corpse/human/assistant, -/mob/living/simple_animal/hostile/skeleton/eskimo{ - name = "Village Hunter" - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"lg" = ( -/obj/structure/flora/grass/both, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"li" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/glass, -/obj/structure/mirror/directional/north, -/turf/open/floor/wood, -/area/ruin/powered) -"lo" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"mi" = ( -/obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ - health = 450; - maxHealth = 450; - name = "Right Hand of the Elder" - }, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"mI" = ( -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/grass/both, -/obj/structure/fence{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"nR" = ( -/obj/structure/chair/sofa/left, -/turf/closed/mineral/snowmountain/cavern/icemoon, -/area/icemoon/underground/explored) -"oB" = ( -/obj/structure/table/wood, -/obj/structure/bedsheetbin/empty, -/obj/item/clothing/under/misc/pj/blue, -/obj/item/clothing/shoes/sneakers/white, -/turf/open/floor/wood, -/area/ruin/powered) -"oF" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"pc" = ( -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/explored) -"pj" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"pH" = ( -/obj/structure/sign/poster/official/work_for_a_future, -/turf/closed/wall/mineral/wood, -/area/ruin/powered) -"pI" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"pP" = ( -/obj/structure/chair/sofa/left{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/powered) -"pV" = ( -/obj/machinery/door/airlock/maintenance_hatch, -/turf/open/floor/plating, -/area/ruin/powered) -"rC" = ( -/obj/structure/closet/secure_closet/freezer, -/obj/item/food/fishmeat/carp, -/obj/item/food/fishmeat/carp, -/obj/item/food/fishmeat/carp, -/obj/item/reagent_containers/food/condiment/pack/ketchup, -/obj/item/reagent_containers/food/condiment/pack/ketchup, -/obj/item/reagent_containers/food/condiment/pack/ketchup, -/turf/open/floor/iron/checker, -/area/ruin/powered) -"sG" = ( -/obj/effect/decal/cleanable/vomit, -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/powered) -"sY" = ( -/obj/structure/sink/kitchen{ - dir = 4; - pixel_x = -12 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/checker, -/area/ruin/powered) -"tg" = ( -/obj/structure/fence{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"tt" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"tF" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"tM" = ( -/obj/structure/statue/snow/snowlegion{ - desc = "An off-putting snowman, something about it gives you a sense of dread instead of holiday cheer." - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"tN" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"tX" = ( -/obj/structure/table/wood, -/obj/structure/bedsheetbin, -/turf/open/floor/wood, -/area/ruin/powered) -"us" = ( -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"ut" = ( -/obj/item/flashlight/lantern{ - on = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/powered) -"vi" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"wQ" = ( -/turf/closed/wall, -/area/ruin/powered) -"xc" = ( -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"xN" = ( -/obj/structure/bed/dogbed{ - pixel_y = 14 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/ruin/powered) -"yb" = ( -/obj/structure/chair/sofa/right{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered) -"yS" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"zR" = ( -/obj/machinery/door/airlock/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/powered) -"zT" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"AG" = ( -/obj/structure/showcase/machinery/tv, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/holofloor/wood, -/area/ruin/powered) -"AM" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/item/pickaxe, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"AN" = ( -/obj/structure/closet/cabinet, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/reagent_containers/glass/bottle/venom, -/obj/item/reagent_containers/glass/bottle/curare, -/obj/item/knife/combat/survival, -/obj/effect/decal/cleanable/dirt, -/obj/item/food/meat/slab/human, -/obj/item/food/meat/slab/human, -/obj/item/food/meat/slab/human, -/turf/open/floor/wood, -/area/ruin/powered) -"Bq" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Cd" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/ruin/powered) -"Cl" = ( -/obj/structure/sacrificealtar, -/obj/effect/decal/cleanable/blood/old, -/obj/item/knife/bloodletter, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"Dm" = ( -/obj/structure/flora/grass/brown, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"DI" = ( -/obj/structure/closet/emcloset, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath/medical, -/obj/item/clothing/mask/breath/medical, -/obj/item/flashlight/lantern, -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"DM" = ( -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Ed" = ( -/obj/machinery/door/airlock/wood, -/obj/effect/mapping_helpers/airlock/locked, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/wood, -/area/ruin/powered) -"Ei" = ( -/turf/closed/mineral/snowmountain/cavern/icemoon, -/area/icemoon/underground/explored) -"EF" = ( -/obj/effect/decal/cleanable/blood/gibs/torso, -/obj/effect/decal/remains/human, -/mob/living/simple_animal/hostile/construct/juggernaut/hostile{ - health = 450; - maxHealth = 450; - name = "Left Hand of the Elder" - }, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"FR" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Gr" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/chips, -/obj/item/trash/semki{ - pixel_x = 8; - pixel_y = -4 - }, -/obj/item/clothing/neck/petcollar, -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"Gy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/wood, -/turf/open/floor/plating, -/area/ruin/powered) -"Hf" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/wood, -/area/ruin/powered) -"Hx" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/under/rank/cargo/miner, -/obj/item/clothing/suit/hooded/wintercoat/miner, -/obj/item/clothing/shoes/winterboots, -/obj/item/card/id/advanced/mining, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/powered) -"IA" = ( -/obj/structure/fireplace{ - fuel_added = 1000; - lit = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/ruin/powered) -"Kd" = ( -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"LZ" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/random{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered) -"Nq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"Og" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Os" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/ruin/powered) -"PQ" = ( -/obj/effect/decal/cleanable/blood/splatter, -/mob/living/simple_animal/hostile/illusion{ - deathmessage = "disperses into the air in a cloud of red mist, you feel slightly more at ease."; - desc = "You can't quite make out what you're seeing."; - faction = list("cult"); - health = 500; - maxHealth = 500; - melee_damage_lower = 10; - melee_damage_upper = 30; - name = "Village Elder" - }, -/turf/open/floor/engine/cult, -/area/ruin/powered) -"Qh" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/item/bodypart/head, -/obj/item/bodypart/arm/left{ - pixel_x = -9; - pixel_y = -9 - }, -/obj/item/bodypart/leg/left, -/obj/item/bodypart/arm/right, -/obj/item/bodypart/leg/right{ - pixel_x = 8; - pixel_y = 4 - }, -/obj/item/bodypart/chest, -/obj/item/organ/heart, -/obj/item/multitool, -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"Qt" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/item/restraints/legcuffs/beartrap{ - armed = 1 - }, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"QR" = ( -/turf/closed/wall/rust, -/area/ruin/powered) -"Rv" = ( -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Sk" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"SN" = ( -/turf/open/floor/iron/freezer, -/area/ruin/powered) -"SZ" = ( -/obj/machinery/door/airlock/wood, -/turf/open/floor/wood, -/area/ruin/powered) -"Tc" = ( -/obj/structure/flora/ausbushes/fullgrass, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"TW" = ( -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"UI" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/blood, -/obj/item/food/meat/slab/corgi, -/turf/open/floor/wood, -/area/ruin/powered) -"Vn" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/powered) -"Ws" = ( -/obj/structure/fence/cut/medium{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"WH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/cult{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered) -"Ze" = ( -/turf/closed/wall, -/area/icemoon/underground/explored) -"Zw" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"Zx" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"ZG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/under/suit/tan, -/turf/open/floor/wood, -/area/ruin/powered) - -(1,1,1) = {" -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -"} -(2,1,1) = {" -tN -tN -tN -tN -pc -Og -Og -bR -Og -Og -Og -jP -Og -Og -Og -Rv -Og -Og -Og -Og -Og -Og -Og -tN -tN -tN -tN -tN -"} -(3,1,1) = {" -tN -tN -tN -xc -pc -Og -Og -aZ -pI -iB -Og -kl -Og -Og -Og -Og -Og -Og -pI -Og -Og -Og -Og -Og -bY -tN -tN -tN -"} -(4,1,1) = {" -tN -tN -tN -pc -Og -Og -Ei -Ze -iB -ks -Ei -Ze -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Tc -pc -pc -Og -Og -pc -tN -tN -"} -(5,1,1) = {" -tN -tN -Og -Og -Og -Rv -Ei -Ei -Ei -FR -pI -Ei -Ei -Vn -Vn -Vn -Ei -Ei -Ei -Ei -Ei -Ei -Ei -pc -Og -Og -Og -tN -"} -(6,1,1) = {" -tN -pI -Og -Og -bY -Ei -Ei -Ei -pI -zT -zT -zT -Ei -Vn -UI -Vn -Vn -wQ -wQ -QR -QR -wQ -Ei -Ei -Og -Rv -Og -tN -"} -(7,1,1) = {" -tN -Og -oF -Og -Ei -Ei -Vn -Vn -Vn -Vn -Og -zT -Bq -pH -jk -tX -Vn -QR -DI -SN -Qh -wQ -Ei -Ei -oF -Og -Og -tN -"} -(8,1,1) = {" -tN -Og -Og -Og -Ei -Ei -Vn -cj -sY -Vn -Og -zT -Vn -Vn -jk -oB -Vn -wQ -DI -tt -Gr -QR -lg -Ei -Ei -Og -Og -tN -"} -(9,1,1) = {" -tN -Og -Og -Ei -Ei -la -Vn -rC -ut -Vn -tF -iz -Vn -AG -aM -yb -Vn -wQ -Nq -SN -QR -QR -Og -Ei -Ei -Og -Og -tN -"} -(10,1,1) = {" -tN -Og -Kd -Ei -Ei -lo -Vn -li -Hf -SZ -zT -zT -Vn -kY -aM -pP -Vn -wQ -QR -pV -wQ -Og -Tc -Ei -Ei -Og -Og -tN -"} -(11,1,1) = {" -tN -Og -pc -Ei -Ei -lo -Vn -Hx -fD -Vn -yS -zT -Vn -Vn -SZ -Vn -Vn -Og -Og -zT -tg -Bq -Og -Ei -Ei -Og -Og -tN -"} -(12,1,1) = {" -tN -Og -pc -Ei -Ei -lo -Vn -Vn -Vn -Vn -Og -zT -Og -Bq -zT -Tc -DM -zT -zT -zT -Ws -Og -Og -Ei -Ei -Ei -Og -tN -"} -(13,1,1) = {" -tN -Og -pc -Ei -Ei -us -Sk -Qt -vi -Og -yS -zT -zT -zT -zT -Og -Og -zT -Og -Vn -Vn -Vn -Vn -Ei -Ei -Ei -pI -tN -"} -(14,1,1) = {" -tN -Og -Ei -Ei -Ei -Ei -Bq -pj -mI -Og -Og -Og -Og -Og -zT -Og -Og -zT -Og -Vn -LZ -AN -Vn -Ei -Ei -Ei -Og -tN -"} -(15,1,1) = {" -tN -Og -Ei -Vn -Vn -Vn -Vn -Vn -Vn -Vn -Vn -Og -zT -zT -zT -zT -zT -zT -zT -zR -cB -jH -Vn -Ei -Ei -bY -Og -tN -"} -(16,1,1) = {" -tN -Og -Ei -Vn -EF -hD -Vn -aP -WH -ZG -Vn -Og -zT -Tc -Og -Og -Og -Og -Og -Vn -Vn -Vn -Vn -Ei -Ei -Og -Og -tN -"} -(17,1,1) = {" -tN -Og -Ei -Vn -Cl -PQ -Ed -jk -aM -aM -Vn -Og -zT -Og -Og -Og -Bq -Og -Og -Og -Gy -sG -Vn -Ei -Ei -Og -Og -tN -"} -(18,1,1) = {" -tN -Og -Ei -Vn -mi -AM -Vn -ay -Os -jk -dh -zT -zT -Og -Og -Og -Og -TW -Og -Og -Vn -Vn -Vn -Ei -Ei -Og -Og -tN -"} -(19,1,1) = {" -tN -Og -Ei -Vn -Vn -Vn -Vn -IA -gG -aM -Vn -Og -Og -Og -pc -Dm -Og -Og -tM -Og -Og -Og -Bq -Ei -Ei -Og -Dm -tN -"} -(20,1,1) = {" -tN -Og -Ei -Ei -Ei -nR -Vn -xN -Cd -jk -Vn -TW -Og -pc -xc -pc -pc -Og -Og -Og -Og -Og -Og -Ei -Ei -Og -Og -tN -"} -(21,1,1) = {" -tN -Og -Og -pj -Ei -Ei -Vn -Vn -Vn -Vn -Vn -Og -Dm -pc -xc -xc -xc -pc -pj -Og -Og -DM -Ei -Ei -Ei -Og -Og -tN -"} -(22,1,1) = {" -tN -bY -Og -Og -Ei -Ei -Ei -Ei -Bq -Og -Og -Og -pc -xc -Zw -Zx -xc -xc -pc -pc -Og -Ei -Ei -Ei -bY -Og -Og -tN -"} -(23,1,1) = {" -tN -tN -pI -Og -Og -Ei -Ei -Ei -Ei -DM -Tc -pc -pc -xc -xc -xc -xc -xc -xc -Ei -Ei -Ei -Ei -Og -Og -Og -Og -tN -"} -(24,1,1) = {" -tN -tN -tN -pc -Og -Og -Og -Ei -Ei -Ei -Ei -Ei -Ei -xc -xc -xc -xc -xc -Ei -Ei -Ei -Ei -pI -oF -Og -Og -Og -tN -"} -(25,1,1) = {" -tN -tN -tN -xc -pc -pc -Og -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Og -Og -Og -Og -Og -Og -tN -"} -(26,1,1) = {" -tN -tN -tN -xc -pc -oF -Og -pI -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -Ei -pc -Og -Og -Og -pc -tN -Og -Og -tN -"} -(27,1,1) = {" -tN -tN -tN -tN -tN -tN -Og -Og -Og -Og -Og -Og -Og -pI -oF -Og -Og -Og -Og -Og -bY -Tc -pc -tN -tN -pI -Og -tN -"} -(28,1,1) = {" -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -tN -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm deleted file mode 100644 index b86b24d53ea0..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm +++ /dev/null @@ -1,197 +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/bathhouse, -/area/ruin/powered/bathhouse) -"c" = ( -/obj/structure/table/greyscale, -/obj/item/stack/medical/aloe{ - desc = "A healing paste you can apply on wounds. It smells amazing." - }, -/obj/item/clothing/shoes/sneakers/white{ - name = "white slippers" - }, -/obj/item/clothing/under/misc/pj/blue, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"e" = ( -/obj/structure/mirror/directional/north, -/obj/structure/sink{ - pixel_y = 20 - }, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"f" = ( -/obj/machinery/shower{ - pixel_y = 16; - reagent_id = /datum/reagent/water/holywater - }, -/obj/structure/curtain, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"g" = ( -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"h" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/north, -/obj/item/food/spaghetti/pastatomato{ - desc = "Just how mom used to make it."; - food_reagents = list(/datum/reagent/consumable/nutriment = 6, /datum/reagent/consumable/tomatojuice = 10, /datum/reagent/consumable/nutriment/vitamin = 4, /datum/reagent/pax = 5, /datum/reagent/medicine/psicodine = 10, /datum/reagent/medicine/morphine = 5); - name = "soul food"; - tastes = list("nostalgia" = 1, "happiness" = 1) - }, -/turf/open/floor/wood, -/area/ruin/powered/bathhouse) -"i" = ( -/obj/machinery/door/airlock/freezer{ - name = "bath house airlock" - }, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"j" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/powered/bathhouse) -"k" = ( -/turf/open/floor/wood, -/area/ruin/powered/bathhouse) -"l" = ( -/obj/item/bikehorn/rubberducky, -/obj/item/soap, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"m" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/ruin/powered/bathhouse) -"n" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"o" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/wood, -/area/ruin/powered/bathhouse) -"p" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) -"q" = ( -/obj/item/bikehorn/rubberducky{ - desc = "An old but clean looking rubber ducky. Something about it is very familiar..." - }, -/turf/open/floor/iron/white, -/area/ruin/powered/bathhouse) - -(1,1,1) = {" -b -b -b -b -b -a -a -a -"} -(2,1,1) = {" -b -f -g -g -b -j -j -j -"} -(3,1,1) = {" -b -b -l -g -i -k -k -j -"} -(4,1,1) = {" -b -f -g -g -b -h -k -j -"} -(5,1,1) = {" -b -b -g -g -b -m -o -j -"} -(6,1,1) = {" -b -f -g -p -b -j -j -j -"} -(7,1,1) = {" -b -b -g -q -b -n -n -a -"} -(8,1,1) = {" -b -e -g -g -b -n -n -a -"} -(9,1,1) = {" -b -e -g -g -i -n -n -a -"} -(10,1,1) = {" -b -c -g -g -b -n -a -a -"} -(11,1,1) = {" -b -b -b -b -b -a -a -a -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm deleted file mode 100644 index 6c2de8e28e91..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm +++ /dev/null @@ -1,760 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aD" = ( -/obj/structure/fence/cut/medium, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"aU" = ( -/turf/open/genturf, -/area/icemoon/underground/unexplored/rivers) -"bh" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"cv" = ( -/obj/structure/flora/rock/pile/icy, -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/powered/shuttle) -"cH" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/radio/intercom, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"cO" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/unexplored/rivers) -"dq" = ( -/obj/structure/flora/tree/dead, -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"el" = ( -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"eC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/airlock/external/glass/ruin, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"gz" = ( -/turf/closed/wall/ice, -/area/ruin/powered/shuttle) -"gH" = ( -/obj/structure/fence/end{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"hY" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/unexplored/rivers) -"kr" = ( -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"oj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/turf/open/floor/iron/grimy{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"oD" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"oT" = ( -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"qS" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"rd" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"rm" = ( -/obj/structure/table/reinforced/rglass, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"rn" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"rS" = ( -/obj/structure/flora/tree/pine, -/obj/structure/flora/grass/green, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"st" = ( -/obj/machinery/door/airlock/public, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"sM" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"te" = ( -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"th" = ( -/obj/structure/fence/end{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"uz" = ( -/obj/structure/tank_dispenser, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"vh" = ( -/obj/item/chair/plastic, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"wg" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"wJ" = ( -/obj/structure/sink{ - pixel_y = 20 - }, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"wP" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"yl" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"yF" = ( -/obj/structure/closet/wardrobe/grey, -/obj/item/clothing/gloves/color/plasmaman, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"yW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/stack/cable_coil/five, -/obj/item/wirecutters, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"zi" = ( -/obj/machinery/suit_storage_unit, -/obj/item/tank/internals/plasmaman/belt/full, -/obj/item/clothing/suit/space/eva/plasmaman, -/obj/item/clothing/head/helmet/space/plasmaman, -/obj/item/clothing/mask/breath, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"zk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/tank_holder/extinguisher{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"zz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"AY" = ( -/obj/structure/fence/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Cr" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/pen/red{ - pixel_x = -17; - pixel_y = 4 - }, -/obj/item/toy/crayon/spraycan, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Cu" = ( -/obj/structure/fence/cut/large, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"CH" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Et" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/north{ - id = "ice_comms_car"; - name = "Garage Door Button"; - pixel_x = -23; - pixel_y = 22; - req_access_txt = "47" - }, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"FK" = ( -/mob/living/simple_animal/hostile/asteroid/wolf, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/shuttle) -"FP" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/west, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Gl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/dresser, -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/iron/grimy{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"GH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/north, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"GQ" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/grille, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"HT" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Jh" = ( -/obj/structure/fence, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/icemoon/underground/explored) -"Js" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Jt" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Kh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar/large/heavy, -/obj/machinery/light/small/built/directional/south, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Kr" = ( -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/shuttle) -"Ly" = ( -/obj/structure/fence/end{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"MS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/door/airlock/shuttle, -/turf/open/floor/iron/grimy{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"NO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Oi" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"OM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/rack, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Qj" = ( -/obj/effect/turf_decal/box/corners, -/obj/item/plate/oven_tray{ - color = "#858585"; - desc = "A convenient place to put all your loose ends!"; - name = "Mechanic's Tray"; - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/screwdriver, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"RK" = ( -/obj/machinery/door/poddoor/shutters/window/preopen{ - id = "ice_comms_car"; - name = "Garage Door" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/snowed/icemoon, -/area/ruin/powered/shuttle) -"SK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/iron/smooth{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"SR" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/shuttle) -"Tz" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"TG" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Ux" = ( -/obj/structure/grille, -/obj/item/shard, -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"Vq" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) -"VN" = ( -/obj/structure/frame/computer{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Ws" = ( -/obj/structure/closet/wardrobe/grey, -/obj/item/clothing/under/plasmaman, -/turf/open/floor/iron/showroomfloor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/powered/shuttle) -"Zd" = ( -/obj/structure/window/reinforced/spawner/east, -/obj/structure/window/reinforced/spawner/west, -/obj/structure/grille, -/turf/open/floor/plating/icemoon, -/area/ruin/powered/shuttle) - -(1,1,1) = {" -aU -aU -aU -aU -aU -aU -aU -aU -aU -TG -qS -Tz -aU -aU -aU -aU -aU -"} -(2,1,1) = {" -aU -aU -aU -aU -aU -aU -aU -qS -Tz -qS -qS -qS -el -qS -aU -aU -aU -"} -(3,1,1) = {" -aU -aU -aU -aU -qS -qS -qS -qS -qS -el -qS -qS -qS -qS -aU -aU -aU -"} -(4,1,1) = {" -aU -aU -aU -qS -TG -gz -FP -Ux -Jt -sM -gz -yl -TG -aU -aU -aU -aU -"} -(5,1,1) = {" -aU -aU -qS -gz -gz -gz -rd -cH -cH -rm -gz -Zd -gz -Cu -Ly -aU -aU -"} -(6,1,1) = {" -aU -qS -TG -CH -Gl -gz -Cr -oT -vh -VN -gz -uz -gz -Kr -wP -qS -aU -"} -(7,1,1) = {" -aU -qS -qS -GH -NO -MS -oT -oD -oT -oT -eC -kr -SK -wP -qS -wP -qS -"} -(8,1,1) = {" -aU -qS -qS -GQ -oj -gz -wJ -HT -yF -Ws -gz -zi -gz -cv -wP -aU -aU -"} -(9,1,1) = {" -aU -TG -el -gz -gz -gz -st -gz -gz -gz -gz -Zd -gz -Js -Ly -aU -aU -"} -(10,1,1) = {" -aU -dq -gz -gz -zz -zk -Et -gz -SR -wP -bh -qS -th -yl -aU -aU -aU -"} -(11,1,1) = {" -aU -aU -gz -Oi -te -Vq -te -RK -wP -wP -el -wP -qS -hY -cO -aU -aU -"} -(12,1,1) = {" -aU -aU -gz -wg -rn -Qj -te -RK -wP -qS -wP -wP -wP -hY -hY -cO -aU -"} -(13,1,1) = {" -aU -aU -gz -gz -OM -yW -Kh -gz -FK -wP -qS -wP -gH -aU -aU -aU -aU -"} -(14,1,1) = {" -aU -aU -aU -gz -gz -gz -gz -gz -aD -Jh -Jh -Cu -AY -aU -aU -aU -aU -"} -(15,1,1) = {" -aU -aU -aU -aU -aU -el -rS -aU -aU -aU -aU -aU -aU -aU -aU -aU -aU -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm deleted file mode 100644 index a1cb2f8c224c..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_hermit.dmm +++ /dev/null @@ -1,441 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aM" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"bz" = ( -/obj/item/flashlight/lantern, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"bW" = ( -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"cI" = ( -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"ec" = ( -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"ei" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"gr" = ( -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"ha" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"hv" = ( -/obj/structure/bonfire/prelit, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"hN" = ( -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"ii" = ( -/obj/effect/mob_spawn/ghost_role/human/hermit, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"il" = ( -/obj/structure/barricade/wooden/crude/snow, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"mN" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/powered/shuttle) -"oJ" = ( -/obj/structure/sink, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"pI" = ( -/obj/item/chair/wood/wings, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"sC" = ( -/obj/item/gun/ballistic/rifle/boltaction/pipegun/prime, -/obj/structure/table/wood, -/obj/item/flashlight/lantern, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"sM" = ( -/obj/structure/chair/comfy/beige, -/obj/machinery/light/directional/west, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"wH" = ( -/obj/item/tank/internals/emergency_oxygen/engi, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"zd" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/item/storage/medkit/surgery, -/obj/item/storage/bag/ore, -/obj/structure/table/wood, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"CR" = ( -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"GU" = ( -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"II" = ( -/obj/item/paper/guides/jobs/hydroponics, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"JI" = ( -/obj/machinery/door/airlock/wood{ - name = "Frozen Shack" - }, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/wood, -/area/ruin/powered/shuttle) -"Oe" = ( -/obj/item/seeds/plump, -/obj/item/seeds/plump, -/obj/item/seeds/tower, -/obj/item/seeds/reishi, -/obj/structure/table/wood, -/obj/item/food/grown/mushroom/glowshroom, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"ON" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/light/directional/north, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"Qr" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"QD" = ( -/turf/template_noop, -/area/template_noop) -"Rr" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Si" = ( -/obj/structure/glowshroom/single, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"UL" = ( -/obj/item/pickaxe/improvised, -/obj/structure/table/wood, -/obj/item/knife/combat, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"WK" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"Xh" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"XI" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/grass/fairy, -/area/ruin/powered/shuttle) -"Yi" = ( -/obj/item/shovel, -/turf/open/floor/plating, -/area/ruin/powered/shuttle) -"YN" = ( -/turf/closed/mineral/snowmountain/icemoon, -/area/icemoon/underground/explored) - -(1,1,1) = {" -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -"} -(2,1,1) = {" -QD -QD -QD -QD -QD -QD -YN -QD -QD -QD -QD -QD -aM -QD -QD -QD -"} -(3,1,1) = {" -QD -QD -QD -QD -YN -YN -YN -YN -YN -QD -QD -YN -YN -YN -YN -YN -"} -(4,1,1) = {" -QD -QD -QD -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -YN -aM -"} -(5,1,1) = {" -QD -QD -YN -YN -YN -YN -YN -YN -aM -aM -il -YN -aM -aM -aM -aM -"} -(6,1,1) = {" -QD -YN -YN -YN -cI -mN -mN -mN -mN -mN -mN -aM -aM -aM -Rr -aM -"} -(7,1,1) = {" -YN -YN -ei -Oe -Yi -mN -sM -ec -ii -ha -mN -aM -aM -aM -il -aM -"} -(8,1,1) = {" -YN -ei -gr -II -GU -cI -hv -hN -hN -hN -JI -aM -aM -aM -Rr -aM -"} -(9,1,1) = {" -YN -ON -gr -Xh -Si -oJ -hN -hN -pI -sC -mN -aM -aM -aM -CR -aM -"} -(10,1,1) = {" -YN -ei -bz -gr -bW -cI -cI -cI -mN -mN -mN -Qr -aM -aM -aM -aM -"} -(11,1,1) = {" -YN -YN -YN -ei -gr -gr -XI -wH -WK -gr -YN -YN -aM -aM -aM -Rr -"} -(12,1,1) = {" -QD -QD -YN -YN -UL -zd -YN -YN -YN -YN -YN -YN -aM -aM -aM -aM -"} -(13,1,1) = {" -QD -QD -YN -YN -YN -YN -YN -YN -YN -YN -aM -aM -aM -aM -aM -aM -"} -(14,1,1) = {" -QD -QD -QD -QD -YN -YN -YN -YN -YN -aM -aM -aM -aM -Rr -aM -QD -"} -(15,1,1) = {" -QD -QD -QD -QD -QD -QD -QD -aM -aM -aM -aM -Rr -aM -aM -aM -aM -"} -(16,1,1) = {" -QD -QD -QD -QD -QD -QD -QD -QD -QD -QD -aM -aM -QD -QD -QD -aM -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm deleted file mode 100644 index 07201332c772..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm +++ /dev/null @@ -1,160 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors) -"b" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/surface/outdoors/unexplored) -"c" = ( -/turf/open/water/cursed_spring, -/area/icemoon/surface/outdoors/noteleport) -"d" = ( -/obj/item/paper/crumpled{ - info = "When one falls into this hot spring, they shall forever be turned into..." - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/surface/outdoors) - -(1,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -"} -(2,1,1) = {" -b -b -b -a -a -a -a -a -b -b -b -"} -(3,1,1) = {" -b -b -a -a -a -a -a -a -a -b -b -"} -(4,1,1) = {" -b -a -a -a -c -c -c -a -a -a -b -"} -(5,1,1) = {" -b -a -a -c -c -c -c -c -a -a -b -"} -(6,1,1) = {" -b -a -a -c -c -c -c -c -a -a -b -"} -(7,1,1) = {" -b -a -a -c -c -c -c -c -a -a -b -"} -(8,1,1) = {" -b -a -a -a -c -c -c -a -a -a -b -"} -(9,1,1) = {" -b -b -a -a -a -d -a -a -a -b -b -"} -(10,1,1) = {" -b -b -b -a -a -a -a -a -b -b -b -"} -(11,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm deleted file mode 100644 index 97192b899558..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm +++ /dev/null @@ -1,1747 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"b" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"e" = ( -/obj/structure/trap/cult, -/turf/open/floor/cult, -/area/icemoon/underground) -"h" = ( -/obj/item/paper{ - info = "We have managed to seal the beast inside, the last of its kind they say... unfortunately in doing so, it seems we have spawned creatures beyond our power to contain..." - }, -/obj/item/pen, -/turf/open/misc/asteroid{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/icemoon/underground) -"q" = ( -/turf/open/genturf, -/area/lavaland/surface/outdoors/unexplored/danger) -"w" = ( -/obj/machinery/door/airlock/cult/friendly{ - use_power = 0 - }, -/turf/open/floor/cult, -/area/icemoon/underground) -"y" = ( -/mob/living/simple_animal/hostile/megafauna/dragon{ - desc = "Hunted to extinction, this icey moon is the final resting place for these creatures."; - name = "\proper the last ash drake" - }, -/turf/open/floor/mineral/gold, -/area/icemoon/underground) -"A" = ( -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/misc/asteroid{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/icemoon/underground) -"E" = ( -/obj/item/grown/bananapeel, -/turf/open/floor/cult, -/area/icemoon/underground) -"J" = ( -/turf/closed/wall/mineral/cult, -/area/icemoon/underground) -"P" = ( -/turf/open/floor/mineral/silver, -/area/icemoon/underground) -"R" = ( -/turf/open/floor/mineral/gold, -/area/icemoon/underground) -"T" = ( -/turf/open/floor/cult, -/area/icemoon/underground) -"V" = ( -/obj/item/storage/toolbox/mechanical/old/clean, -/turf/open/misc/asteroid{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/icemoon/underground) -"Z" = ( -/turf/open/misc/asteroid{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/icemoon/underground) - -(1,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(2,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -w -w -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b -"} -(3,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -T -e -T -T -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b -"} -(4,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -T -T -E -T -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(5,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -T -e -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(6,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -w -w -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(7,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(8,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(9,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(10,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(11,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(12,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(13,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(14,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(15,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(16,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(17,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -V -Z -Z -Z -Z -Z -Z -Z -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(18,1,1) = {" -b -J -J -J -J -q -q -q -q -q -q -q -q -q -q -q -A -J -J -J -J -J -J -Z -q -q -q -q -q -q -q -q -q -q -q -J -J -J -J -b -"} -(19,1,1) = {" -b -J -T -T -J -J -q -q -q -q -q -q -q -q -q -q -h -J -R -P -P -R -J -Z -q -q -q -q -q -q -q -q -q -q -J -J -T -T -J -b -"} -(20,1,1) = {" -b -w -e -T -T -w -q -q -q -q -q -q -q -q -q -q -Z -J -P -R -R -P -J -Z -q -q -q -q -q -q -q -q -q -q -w -T -T -e -w -b -"} -(21,1,1) = {" -b -w -T -E -e -w -q -q -q -q -q -q -q -q -q -q -Z -J -P -R -y -P -J -Z -q -q -q -q -q -q -q -q -q -q -w -e -E -T -w -b -"} -(22,1,1) = {" -b -J -T -T -J -J -q -q -q -q -q -q -q -q -q -q -Z -J -R -P -P -R -J -Z -q -q -q -q -q -q -q -q -q -q -J -J -T -T -J -b -"} -(23,1,1) = {" -b -J -J -J -J -q -q -q -q -q -q -q -q -q -q -q -Z -J -J -J -J -J -J -Z -q -q -q -q -q -q -q -q -q -q -q -J -J -J -J -b -"} -(24,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -Z -Z -Z -Z -Z -Z -Z -Z -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(25,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(26,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(27,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(28,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(29,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(30,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(31,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(32,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(33,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(34,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(35,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -w -w -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(36,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -T -e -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(37,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -T -T -E -T -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b -"} -(38,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -T -e -T -T -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b -"} -(39,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -w -w -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b -"} -(40,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm deleted file mode 100644 index f0057b9d0135..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm +++ /dev/null @@ -1,979 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/documents/syndicate/mining, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"ac" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/unpowered/buried_library) -"ad" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"ae" = ( -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"af" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ag" = ( -/obj/item/feather, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ah" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ai" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aj" = ( -/obj/item/paper/fluff/ruins/oldstation/protosupermatter, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"ak" = ( -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"al" = ( -/turf/closed/wall/mineral/iron, -/area/ruin/unpowered/buried_library) -"am" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/book_of_babel, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"an" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"ao" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ap" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ar" = ( -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"at" = ( -/obj/structure/fluff/paper, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"au" = ( -/obj/structure/fluff/paper/stack, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"av" = ( -/obj/structure/bookcase/random, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"aw" = ( -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"ay" = ( -/obj/machinery/door/puzzle/keycard/library, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"az" = ( -/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aA" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"aC" = ( -/obj/item/feather, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"aD" = ( -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aE" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/item/book/manual/random, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aG" = ( -/obj/structure/table/bronze, -/obj/item/stack/ore/slag, -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aH" = ( -/obj/structure/table/bronze, -/obj/item/statuebust/hippocratic, -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aI" = ( -/obj/effect/mob_spawn/corpse/human/skeleton, -/obj/item/clothing/head/rice_hat, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aK" = ( -/obj/item/feather, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aM" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/item/book/manual/random, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"aN" = ( -/obj/structure/statue/sandstone/venus, -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aO" = ( -/mob/living/simple_animal/pet/fox, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aP" = ( -/obj/item/keycard/library, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"aQ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aR" = ( -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aS" = ( -/obj/structure/table/wood/fancy/black, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/paper/secretrecipe, -/obj/item/flashlight/lantern/jade{ - on = 1 - }, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aT" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aU" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"aV" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/structure/fluff/paper/stack, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"aW" = ( -/obj/structure/fluff/paper/stack, -/turf/open/floor/cult, -/area/ruin/unpowered/buried_library) -"aX" = ( -/obj/structure/table/bronze, -/obj/item/statuebust, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"aY" = ( -/obj/structure/table_frame/wood, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"aZ" = ( -/obj/structure/fluff/paper/stack, -/obj/structure/fluff/paper, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"ba" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bb" = ( -/obj/item/book/manual/random, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bc" = ( -/obj/item/feather, -/obj/structure/fluff/paper, -/obj/structure/fluff/paper{ - dir = 1 - }, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bd" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"be" = ( -/obj/structure/fluff/paper{ - dir = 5 - }, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bf" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bg" = ( -/obj/item/paper/fluff/ruins/oldstation/protogun, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bh" = ( -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/pet/fox, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bi" = ( -/obj/structure/fluff/paper, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bj" = ( -/obj/item/book/manual/random, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"bl" = ( -/obj/item/storage/box/fountainpens, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"bm" = ( -/obj/structure/fluff/paper/stack, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"bn" = ( -/obj/item/book/manual/random, -/obj/item/stack/sheet/mineral/wood, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bo" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"bq" = ( -/obj/structure/mineral_door/wood, -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"br" = ( -/obj/structure/girder, -/turf/closed/mineral/random/snow, -/area/ruin/unpowered/buried_library) -"bs" = ( -/obj/structure/girder, -/turf/open/misc/asteroid/snow/icemoon, -/area/ruin/unpowered/buried_library) -"bt" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/template_noop, -/area/template_noop) -"bu" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"by" = ( -/obj/structure/statue/bronze/marx, -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bz" = ( -/obj/item/flashlight/lantern/jade{ - on = 1 - }, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"bA" = ( -/obj/structure/fluff/paper/stack, -/turf/open/floor/plating/icemoon, -/area/ruin/unpowered/buried_library) -"bB" = ( -/obj/structure/fluff/paper/stack, -/turf/open/floor/carpet/black{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bC" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/simple_animal/pet/fox, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/ruin/unpowered/buried_library) -"bK" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"bL" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"bM" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"bP" = ( -/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"dC" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"GQ" = ( -/obj/structure/fluff/paper/stack, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"Qm" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) -"Xb" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/fluff/paper, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180 - }, -/area/ruin/unpowered/buried_library) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -bt -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ak -ak -ak -ak -ak -ac -ba -ac -ac -ac -ad -ad -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ak -ak -ak -ak -aU -ak -ak -an -au -ae -af -bL -ac -ad -ad -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -ak -ak -GQ -an -an -ae -bb -av -ak -ah -aL -ah -aT -ac -ad -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -ak -ak -an -aC -ae -aQ -ah -ak -av -bg -ah -Xb -ah -ak -ac -ad -ad -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -ad -ac -an -ae -an -aM -aO -ah -au -ah -aA -ah -ao -ah -bM -ac -ad -ad -ad -"} -(7,1,1) = {" -aa -aa -aa -aa -ad -ac -ak -au -ak -Qm -aR -Qm -aA -ao -dC -ah -aZ -ah -bC -ac -ad -ad -ad -"} -(8,1,1) = {" -aa -aa -aa -aa -ad -ak -ak -av -aA -an -aG -aD -aX -an -Qm -ae -Qm -ah -ae -ac -bs -an -ad -"} -(9,1,1) = {" -aa -aa -aa -aa -ad -ac -aj -av -bb -aD -aD -bz -aD -bB -ak -ae -Qm -ae -Qm -ac -an -dC -an -"} -(10,1,1) = {" -aa -aa -aa -ad -ad -ac -ap -an -ak -aD -aD -aN -an -aw -ak -ao -bK -aR -ae -bq -ae -aU -ad -"} -(11,1,1) = {" -aa -al -al -al -al -al -ae -ah -aR -aD -an -aD -aD -by -Qm -aw -ao -ae -bm -ac -bP -an -ad -"} -(12,1,1) = {" -ad -al -ab -aI -ar -al -GQ -aE -af -aD -aH -bA -aY -aD -ak -ae -au -ah -ag -br -ac -ad -ad -"} -(13,1,1) = {" -ad -al -am -aJ -aW -ay -dC -ah -ao -ae -Qm -ae -af -an -bi -ah -ak -ah -bi -ac -ad -ad -ad -"} -(14,1,1) = {" -ad -al -aS -aW -aK -al -at -ah -an -ah -bh -ah -az -ah -ak -ah -ak -bn -Xb -ac -ad -aa -aa -"} -(15,1,1) = {" -ad -al -al -ai -ar -al -bc -ah -aL -ah -aA -ah -Qm -ah -ak -ak -bl -ak -ak -ak -ad -aa -aa -"} -(16,1,1) = {" -ad -ad -al -al -al -al -bd -ah -Qm -ah -ao -aV -ak -ah -an -ak -bm -bo -ak -br -bu -aa -aa -"} -(17,1,1) = {" -aa -ad -ad -ad -ad -ac -be -bf -dC -aP -dC -aR -ae -an -ak -bj -ak -ad -ad -ad -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -ad -ac -ac -ac -ac -ac -ac -ba -ac -ac -bs -ad -aa -ad -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm deleted file mode 100644 index eebcc16e8522..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mailroom.dmm +++ /dev/null @@ -1,1049 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"au" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/mob_spawn/corpse/human/skeleton, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"az" = ( -/obj/item/food/grown/coffee, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"aG" = ( -/obj/structure/sign/warning/coldtemp, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"ba" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/textured, -/area/ruin/powered/mailroom) -"bK" = ( -/obj/structure/holobox, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"cg" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"ch" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/effect/decal/remains/human, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"dC" = ( -/obj/effect/turf_decal/siding/yellow, -/obj/structure/railing{ - dir = 4 - }, -/obj/machinery/vending/coffee, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"dG" = ( -/turf/template_noop, -/area/template_noop) -"dR" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"ft" = ( -/obj/structure/holobox, -/obj/effect/turf_decal/stripes/red/box, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"gi" = ( -/obj/structure/holobox, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"gO" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 4 - }, -/turf/open/floor/carpet/green, -/area/ruin/powered/mailroom) -"hj" = ( -/obj/structure/filingcabinet/chestdrawer/wheeled, -/obj/item/storage/fancy/heart_box, -/obj/item/food/tinychocolate, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"hk" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"hN" = ( -/obj/item/reagent_containers/food/drinks/coffee, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"iO" = ( -/obj/item/food/grown/coffee/robusta, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"iV" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"jh" = ( -/obj/structure/closet/crate/bin, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"jm" = ( -/obj/structure/closet/crate/mail{ - icon_state = "mailopen" - }, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"jx" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/item/flashlight/glowstick/orange, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"kZ" = ( -/obj/structure/filingcabinet/chestdrawer/wheeled, -/obj/item/valentine, -/obj/item/grenade/c4, -/obj/item/clothing/accessory/medal/conduct, -/obj/item/paper/crumpled/muddy/fluff/instructions, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"lw" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/turf/open/floor/carpet/green, -/area/ruin/powered/mailroom) -"lI" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"ms" = ( -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"mA" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"np" = ( -/obj/machinery/ticket_machine/directional/north, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"nM" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/effect/turf_decal/siding/thinplating, -/turf/open/floor/iron, -/area/ruin/powered/mailroom) -"nS" = ( -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"nT" = ( -/turf/closed/indestructible/rock, -/area/icemoon/underground/explored) -"oI" = ( -/obj/machinery/light/small/red/directional/east, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"oU" = ( -/obj/structure/closet/crate/mail{ - icon_state = "mailopen" - }, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"pd" = ( -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"qp" = ( -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/keycard/icebox/office - }, -/obj/effect/turf_decal/trimline/brown/arrow_ccw{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/powered/mailroom) -"qv" = ( -/obj/structure/marker_beacon/burgundy, -/turf/open/floor/plating/snowed/icemoon, -/area/icemoon/underground/explored) -"qP" = ( -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/obj/machinery/light/small/red/directional/west, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"tN" = ( -/obj/effect/turf_decal/plaque, -/turf/open/floor/carpet/green, -/area/ruin/powered/mailroom) -"uA" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"uI" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/carpet/green, -/area/ruin/powered/mailroom) -"uK" = ( -/obj/effect/decal/cleanable/plasma, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"vU" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"vV" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"wc" = ( -/obj/effect/turf_decal/trimline/yellow/arrow_ccw{ - dir = 4 - }, -/obj/item/pressure_plate/hologrid{ - reward = /mob/living/simple_animal/pet/dog/bullterrier - }, -/turf/open/floor/plating, -/area/ruin/powered/mailroom) -"xL" = ( -/obj/item/trash/can, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"yb" = ( -/obj/item/screwdriver{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"zr" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"AP" = ( -/obj/structure/closet/crate/secure, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"AS" = ( -/obj/structure/filingcabinet, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"AX" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"BZ" = ( -/obj/effect/turf_decal/trimline/white/arrow_ccw{ - dir = 4 - }, -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/toy/plush/moth - }, -/turf/open/floor/plating, -/area/ruin/powered/mailroom) -"CW" = ( -/obj/structure/sign/poster/official/obey, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"DR" = ( -/obj/structure/fence/post{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"DY" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window{ - dir = 1 - }, -/obj/machinery/door/window{ - dir = 2 - }, -/obj/structure/window/spawner/east, -/obj/item/toy/figure/cargotech, -/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/mailroom/waiting, -/turf/open/floor/noslip, -/area/ruin/powered/mailroom) -"FC" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"Gn" = ( -/obj/structure/sign/poster/ripped, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"HH" = ( -/turf/open/floor/iron/smooth_corner{ - dir = 4 - }, -/area/ruin/powered/mailroom) -"HL" = ( -/obj/structure/table/greyscale, -/obj/item/flashlight/lamp, -/obj/item/trash/candle, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"IZ" = ( -/obj/item/food/strawberryicecreamsandwich, -/turf/open/floor/iron/smooth_corner{ - dir = 1 - }, -/area/ruin/powered/mailroom) -"Jd" = ( -/obj/structure/closet/crate/mail{ - icon_state = "mailopen" - }, -/obj/effect/turf_decal/siding/yellow, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"Js" = ( -/obj/structure/fence/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"KK" = ( -/obj/machinery/light/cold/directional/east, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"LN" = ( -/obj/machinery/door/airlock/mining/glass, -/turf/open/floor/noslip, -/area/ruin/powered/mailroom) -"Mi" = ( -/obj/structure/chair/plastic{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"Mr" = ( -/obj/machinery/computer/launchpad, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"Mz" = ( -/turf/open/floor/iron/smooth_half, -/area/ruin/powered/mailroom) -"MC" = ( -/obj/effect/decal/cleanable/wrapping, -/obj/machinery/light/warm/directional/west, -/turf/open/floor/iron/smooth_half, -/area/ruin/powered/mailroom) -"MP" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/siding/thinplating/corner{ - dir = 8 - }, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"MT" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/light/cold/directional/north, -/turf/open/floor/iron/textured, -/area/ruin/powered/mailroom) -"Nq" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/decal/remains/human, -/obj/machinery/light/cold/directional/south, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/iron/textured, -/area/ruin/powered/mailroom) -"NE" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron/smooth_corner, -/area/ruin/powered/mailroom) -"NN" = ( -/turf/open/floor/carpet/green, -/area/ruin/powered/mailroom) -"Pk" = ( -/obj/item/multitool, -/obj/structure/ice_stasis, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"PD" = ( -/obj/structure/holobox, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"PO" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/siding/thinplating/corner, -/obj/item/paper/crumpled/fluff/poem, -/obj/structure/closet/crate/bin, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"PQ" = ( -/obj/machinery/door/puzzle/keycard/icebox/processing, -/turf/open/misc/grass, -/area/ruin/powered/mailroom) -"Qb" = ( -/obj/structure/closet/crate/mail{ - icon_state = "mailopen" - }, -/obj/effect/turf_decal/stripes{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"Qx" = ( -/obj/structure/sign/poster/official/obey, -/turf/closed/wall/r_wall, -/area/ruin/powered/mailroom) -"QU" = ( -/obj/effect/turf_decal/bot, -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/keycard/icebox/processing - }, -/turf/open/floor/plating, -/area/ruin/powered/mailroom) -"Rn" = ( -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"Se" = ( -/obj/item/ticket_machine_ticket, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"SA" = ( -/obj/structure/table/greyscale, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"SY" = ( -/obj/machinery/launchpad, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"To" = ( -/obj/effect/decal/cleanable/wrapping, -/obj/item/c_tube, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"TN" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/door/puzzle/keycard/icebox/office, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"UB" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"US" = ( -/obj/item/food/grown/coffee/robusta, -/turf/open/floor/iron/smooth_half, -/area/ruin/powered/mailroom) -"Vq" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Vz" = ( -/obj/item/paper_bin{ - pixel_y = 5 - }, -/obj/structure/table/rolling, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"VG" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/effect/turf_decal/stripes/red/box, -/turf/open/floor/plating/snowed/smoothed/icemoon, -/area/ruin/powered/mailroom) -"Wj" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/structure/chair/plastic{ - dir = 4 - }, -/obj/item/reagent_containers/food/drinks/ice{ - pixel_x = 4; - pixel_y = 3 - }, -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"Wr" = ( -/obj/structure/closet/crate/mail{ - icon_state = "mailopen" - }, -/obj/effect/turf_decal/siding/yellow, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/obj/item/mail/junkmail, -/turf/open/floor/iron/smooth_large, -/area/ruin/powered/mailroom) -"WE" = ( -/turf/closed/wall/r_wall, -/area/ruin/powered/mailroom) -"Xa" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/indestructible/reinforced, -/area/ruin/powered/mailroom) -"XO" = ( -/turf/open/floor/iron/smooth_corner{ - dir = 8 - }, -/area/ruin/powered/mailroom) -"XU" = ( -/turf/open/floor/iron/white, -/area/ruin/powered/mailroom) -"Yk" = ( -/obj/effect/spawner/structure/window/ice, -/turf/open/floor/plating, -/area/ruin/powered/mailroom) -"YS" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"Ze" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) -"ZV" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/carpet/royalblack, -/area/ruin/powered/mailroom) - -(1,1,1) = {" -dG -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -dG -dG -dG -dG -"} -(2,1,1) = {" -lI -yb -zr -qv -pd -iV -lI -iV -iV -qv -zr -lI -iV -iV -iV -iV -lI -lI -lI -lI -dG -"} -(3,1,1) = {" -lI -iV -nT -iV -iV -iV -iV -iV -iV -iV -zr -lI -Pk -lI -iV -iV -iV -iV -iV -iV -lI -"} -(4,1,1) = {" -iV -iV -zr -bK -iV -iV -iV -iV -iV -pd -zr -lI -lI -lI -lI -lI -lI -lI -lI -iV -lI -"} -(5,1,1) = {" -iV -iV -zr -qv -iV -xL -pd -iV -pd -qv -YS -iV -iV -iV -iV -lI -lI -iV -iV -iV -lI -"} -(6,1,1) = {" -iV -iV -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -lI -iV -iV -iV -lI -lI -iV -lI -lI -"} -(7,1,1) = {" -lI -iV -ms -ms -ms -Gn -ms -ms -ms -ms -ms -Yk -ms -dR -Js -iV -lI -lI -iV -iV -lI -"} -(8,1,1) = {" -lI -iV -ms -SY -iO -MC -Wr -Xa -Wj -ch -Mi -jx -ms -UB -DR -iV -iV -lI -lI -iV -lI -"} -(9,1,1) = {" -lI -iV -ms -Mr -NE -IZ -az -TN -XU -XU -XU -Se -DY -iV -DR -iV -iV -iV -iV -iV -lI -"} -(10,1,1) = {" -lI -iV -ms -Vz -Mz -hN -dC -WE -np -Se -XU -XU -LN -iV -YS -iV -iV -iV -iV -iV -lI -"} -(11,1,1) = {" -lI -iV -CW -jh -XO -HH -Jd -AX -MT -ba -ba -Nq -vU -iV -zr -iV -iV -iV -lI -lI -lI -"} -(12,1,1) = {" -iV -iV -ms -jm -vV -US -To -aG -QU -BZ -wc -qp -ms -dR -mA -iV -iV -iV -lI -lI -lI -"} -(13,1,1) = {" -lI -iV -ms -Yk -Yk -Yk -Yk -ms -ms -Qx -ms -ms -ms -ms -ms -ms -ms -iV -iV -iV -lI -"} -(14,1,1) = {" -lI -iV -ms -cg -Qb -cg -cg -PD -qP -cg -ms -AS -FC -Rn -au -hj -ms -iV -iV -iV -lI -"} -(15,1,1) = {" -lI -iV -ms -nS -nS -nS -nS -nS -nS -uA -ms -Ze -NN -NN -lw -HL -ms -Vq -iV -lI -lI -"} -(16,1,1) = {" -lI -iV -ms -uK -nS -nS -nS -nS -nS -nS -ms -PO -NN -tN -uI -Rn -PQ -iV -iV -lI -lI -"} -(17,1,1) = {" -lI -iV -ms -AP -nS -nS -oU -nS -nS -nS -ms -nM -NN -NN -gO -SA -ms -iV -iV -iV -lI -"} -(18,1,1) = {" -lI -iV -ms -ft -nS -VG -nS -VG -oI -gi -ms -MP -hk -KK -ZV -kZ -ms -iV -iV -iV -lI -"} -(19,1,1) = {" -iV -iV -ms -ms -CW -ms -ms -Gn -ms -ms -ms -Gn -CW -Gn -CW -CW -ms -iV -iV -lI -lI -"} -(20,1,1) = {" -lI -iV -iV -iV -lI -lI -lI -iV -iV -iV -iV -iV -lI -iV -iV -iV -iV -iV -iV -lI -lI -"} -(21,1,1) = {" -lI -iV -UB -iV -lI -lI -iV -iV -UB -iV -lI -iV -iV -iV -lI -lI -lI -iV -iV -iV -lI -"} -(22,1,1) = {" -dG -lI -lI -iV -iV -iV -iV -lI -lI -lI -lI -lI -lI -lI -lI -dG -lI -iV -lI -lI -dG -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm deleted file mode 100644 index f6a0ec51081a..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm +++ /dev/null @@ -1,938 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"b" = ( -/obj/structure/ladder{ - travel_time = 40 - }, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"d" = ( -/turf/template_noop, -/area/template_noop) -"g" = ( -/obj/item/clothing/suit/hooded/explorer, -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"h" = ( -/obj/item/clothing/shoes/winterboots/ice_boots, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"i" = ( -/obj/item/knife/combat/survival, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"l" = ( -/turf/closed/indestructible/rock/snow/ice/ore, -/area/icemoon/underground/explored) -"V" = ( -/obj/structure/frost_miner_prism, -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) -"Z" = ( -/obj/structure/frost_miner_prism, -/turf/open/misc/ice/icemoon, -/area/icemoon/underground/explored) - -(1,1,1) = {" -d -d -d -d -d -d -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -d -d -d -d -d -d -"} -(2,1,1) = {" -d -d -d -d -d -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -d -d -d -d -d -"} -(3,1,1) = {" -d -d -d -d -l -l -l -l -Z -a -a -a -a -Z -a -a -a -a -Z -l -l -l -l -d -d -d -d -"} -(4,1,1) = {" -d -d -d -l -l -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -d -d -"} -(5,1,1) = {" -d -d -l -l -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -d -"} -(6,1,1) = {" -d -l -l -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -"} -(7,1,1) = {" -l -l -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -"} -(8,1,1) = {" -l -l -l -a -a -a -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -a -a -a -l -l -l -"} -(9,1,1) = {" -l -l -Z -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -Z -l -l -"} -(10,1,1) = {" -l -l -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -l -l -"} -(11,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(12,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(13,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(14,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(15,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(16,1,1) = {" -l -l -Z -a -a -a -a -Z -a -a -a -a -a -V -a -a -a -a -a -Z -a -a -a -a -Z -l -l -"} -(17,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(18,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(19,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -b -a -a -a -a -a -a -a -a -a -l -l -"} -(20,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(21,1,1) = {" -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -"} -(22,1,1) = {" -l -l -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -l -l -"} -(23,1,1) = {" -l -l -Z -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -Z -l -l -"} -(24,1,1) = {" -l -l -l -a -a -a -a -a -a -a -a -a -a -Z -a -a -a -a -a -a -a -a -a -a -l -l -l -"} -(25,1,1) = {" -l -l -l -l -a -a -a -a -i -a -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -"} -(26,1,1) = {" -d -l -l -l -l -a -a -a -g -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -"} -(27,1,1) = {" -d -d -l -l -l -l -a -a -h -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -d -"} -(28,1,1) = {" -d -d -d -l -l -l -l -a -a -a -a -a -a -a -a -a -a -a -a -a -l -l -l -l -d -d -d -"} -(29,1,1) = {" -d -d -d -d -l -l -l -l -Z -a -a -a -a -Z -a -a -a -a -Z -l -l -l -l -d -d -d -d -"} -(30,1,1) = {" -d -d -d -d -d -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -d -d -d -d -d -"} -(31,1,1) = {" -d -d -d -d -d -d -l -l -l -l -l -l -l -l -l -l -l -l -l -l -l -d -d -d -d -d -d -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm deleted file mode 100644 index fceee3044ea7..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm +++ /dev/null @@ -1,47 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"c" = ( -/obj/effect/sliding_puzzle/lavaland, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) - -(1,1,1) = {" -a -a -a -a -a -"} -(2,1,1) = {" -a -b -b -b -a -"} -(3,1,1) = {" -a -b -c -b -a -"} -(4,1,1) = {" -a -b -b -b -a -"} -(5,1,1) = {" -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm deleted file mode 100644 index ad53650b2494..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm +++ /dev/null @@ -1,1213 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/rock/snow/ice/ore, -/area/icemoon/underground/explored) -"b" = ( -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) -"d" = ( -/turf/template_noop, -/area/template_noop) -"j" = ( -/obj/effect/mob_spawn/corpse/human/miner/explorer, -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) -"q" = ( -/mob/living/simple_animal/hostile/megafauna/wendigo, -/turf/open/indestructible/necropolis{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/icemoon/underground/explored) -"z" = ( -/obj/effect/landmark/portal_exit{ - id = "wendigo arena" - }, -/turf/open/indestructible/necropolis{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/icemoon/underground/explored) -"K" = ( -/obj/effect/landmark/portal_exit{ - id = "wendigo arena exit" - }, -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) -"N" = ( -/turf/open/indestructible/necropolis{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30); - temperature = 180; - - }, -/area/icemoon/underground/explored) -"U" = ( -/obj/item/paper/crumpled/bloody{ - info = "for your own sake, do not enter" - }, -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) -"V" = ( -/obj/effect/portal/permanent/one_way{ - id = "wendigo arena" - }, -/turf/open/misc/asteroid/snow/ice/icemoon, -/area/icemoon/underground/unexplored) - -(1,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(2,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(3,1,1) = {" -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -"} -(4,1,1) = {" -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -"} -(5,1,1) = {" -d -d -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -d -d -"} -(6,1,1) = {" -d -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -d -"} -(7,1,1) = {" -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -"} -(8,1,1) = {" -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -"} -(9,1,1) = {" -d -d -b -b -b -a -a -a -a -a -a -N -N -N -N -N -N -N -N -N -a -a -a -a -a -a -b -b -b -d -d -"} -(10,1,1) = {" -d -d -b -b -a -a -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -a -a -b -b -d -d -"} -(11,1,1) = {" -d -d -b -b -a -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -a -b -b -d -d -"} -(12,1,1) = {" -d -d -b -b -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -b -b -d -d -"} -(13,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(14,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(15,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(16,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(17,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -j -b -d -d -"} -(18,1,1) = {" -d -d -b -K -a -a -a -N -N -N -N -N -N -N -N -q -N -N -N -N -N -N -N -z -a -a -a -V -U -d -d -"} -(19,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(20,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(21,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(22,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(23,1,1) = {" -d -d -b -b -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -b -b -d -d -"} -(24,1,1) = {" -d -d -b -b -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -b -b -d -d -"} -(25,1,1) = {" -d -d -b -b -a -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -a -b -b -d -d -"} -(26,1,1) = {" -d -d -b -b -a -a -a -a -a -a -N -N -N -N -N -N -N -N -N -N -N -a -a -a -a -a -a -b -b -d -d -"} -(27,1,1) = {" -d -d -b -b -b -a -a -a -a -a -a -N -N -N -N -N -N -N -N -N -a -a -a -a -a -a -b -b -b -d -d -"} -(28,1,1) = {" -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -"} -(29,1,1) = {" -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -"} -(30,1,1) = {" -d -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -d -"} -(31,1,1) = {" -d -d -d -d -d -d -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -d -d -d -d -d -d -"} -(32,1,1) = {" -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -"} -(33,1,1) = {" -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -d -d -"} -(34,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} -(35,1,1) = {" -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -"} diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm deleted file mode 100644 index 335e9e5c47e8..000000000000 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm +++ /dev/null @@ -1,279 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"b" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/explored) -"e" = ( -/obj/structure/spawner/nether, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"p" = ( -/obj/item/wisp_lantern, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"L" = ( -/obj/item/stack/ore/bluespace_crystal, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) -"X" = ( -/obj/item/clothing/gloves/butchering, -/turf/open/misc/asteroid/snow/icemoon, -/area/icemoon/underground/explored) - -(1,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(2,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(3,1,1) = {" -b -b -b -b -b -a -a -L -a -a -b -b -b -b -b -"} -(4,1,1) = {" -b -b -b -L -a -a -a -a -L -a -a -a -b -b -b -"} -(5,1,1) = {" -b -b -b -a -L -a -L -a -a -a -a -L -b -b -b -"} -(6,1,1) = {" -b -b -a -a -a -a -a -a -a -L -a -a -a -b -b -"} -(7,1,1) = {" -b -b -L -a -a -L -a -a -X -a -a -a -a -b -b -"} -(8,1,1) = {" -b -b -a -a -a -a -p -e -a -a -L -a -a -b -b -"} -(9,1,1) = {" -b -b -a -a -L -a -a -a -a -a -a -a -L -b -b -"} -(10,1,1) = {" -b -b -L -a -a -a -L -a -L -a -a -a -a -b -b -"} -(11,1,1) = {" -b -b -b -a -a -a -a -a -a -a -L -a -b -b -b -"} -(12,1,1) = {" -b -b -b -a -a -L -a -L -a -a -a -L -b -b -b -"} -(13,1,1) = {" -b -b -b -b -b -a -a -a -a -L -b -b -b -b -b -"} -(14,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(15,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm deleted file mode 100644 index 9a0f6f79cc8b..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ /dev/null @@ -1,2486 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ad" = ( -/obj/machinery/oven, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aj" = ( -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"ao" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Resort Lobby" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"as" = ( -/turf/open/floor/plating, -/area/ruin/powered/beach) -"aB" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aC" = ( -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aE" = ( -/obj/item/storage/cans/sixbeer, -/turf/open/floor/carpet/orange, -/area/ruin/powered/beach) -"aF" = ( -/obj/machinery/vending/boozeomat{ - set_obj_flags = "EMAGGED" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aI" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aN" = ( -/obj/machinery/vending/cigarette/beach, -/obj/effect/turf_decal/sand, -/obj/structure/sign/poster/contraband/have_a_puff{ - pixel_x = -32 - }, -/turf/open/floor/iron, -/area/ruin/powered/beach) -"aP" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aS" = ( -/obj/machinery/processor, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aT" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron, -/area/ruin/powered/beach) -"aW" = ( -/obj/machinery/deepfryer, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"aY" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron, -/area/ruin/powered/beach) -"bb" = ( -/obj/structure/closet/crate/bin, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/trash/candy, -/obj/item/toy/talking/owl, -/obj/effect/turf_decal/sand, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/ruin/powered/beach) -"bd" = ( -/obj/machinery/light/directional/north, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"bC" = ( -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = -7; - pixel_y = -2 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/reagent_containers/food/drinks/bottle/rum{ - pixel_x = 4; - pixel_y = -3 - }, -/turf/open/floor/carpet/red, -/area/ruin/powered/beach) -"bG" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/item/megaphone, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"bH" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"bL" = ( -/obj/effect/turf_decal/sand{ - density = 1 - }, -/obj/effect/decal/fakelattice, -/turf/open/floor/pod/light{ - density = 1 - }, -/area/ruin/powered/beach) -"bM" = ( -/turf/open/floor/iron/stairs/old, -/area/ruin/powered/beach) -"bY" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"cd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"cg" = ( -/obj/structure/girder{ - damage_deflection = 22 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"cm" = ( -/obj/structure/fluff/beach_umbrella/engine, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"ct" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"cE" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/sepia, -/area/ruin/powered/beach) -"cP" = ( -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/water/beach/biodome, -/area/ruin/powered/beach) -"cV" = ( -/obj/structure/closet/secure_closet/freezer/meat{ - req_access = null - }, -/obj/item/food/meat/rawbacon, -/obj/item/food/meat/rawbacon, -/obj/item/food/meat/rawcutlet, -/obj/item/food/meat/rawcutlet, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"dc" = ( -/obj/item/toy/seashell, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"de" = ( -/obj/structure/bookcase/random/reference, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"dj" = ( -/obj/structure/sign/warning/gasmask{ - pixel_y = 32 - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"ek" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/ruin/powered/beach) -"et" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"eE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"fB" = ( -/turf/open/floor/iron/stairs/medium, -/area/ruin/powered/beach) -"fL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"fP" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"fS" = ( -/mob/living/simple_animal/crab{ - name = "Jonny" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"gg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/public/glass{ - name = "Resort Casino" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"gs" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"gC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"gF" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/sepia, -/area/ruin/powered/beach) -"gT" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Surfer Shack 2" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"gX" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/layer4, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"hk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - icon = 'icons/misc/beach.dmi'; - icon_state = "sand" - }, -/area/ruin/powered/beach) -"hq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/item/bedsheet/dorms{ - dir = 4 - }, -/obj/structure/bed{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hy" = ( -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo"; - pixel_x = -4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hC" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hF" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Resort Bathroom" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hN" = ( -/obj/structure/fluff/beach_umbrella/security, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"hO" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/pill/lsd, -/obj/item/reagent_containers/pill/lsd, -/obj/item/reagent_containers/pill/lsd, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hS" = ( -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"hX" = ( -/obj/structure/punching_bag, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"iH" = ( -/obj/structure/flora/ausbushes/stalkybush, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/water/beach/biodome, -/area/ruin/powered/beach) -"jc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/pill/morphine, -/obj/item/storage/fancy/donut_box, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"kb" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/poster/contraband/ambrosia_vulgaris{ - pixel_y = 32 - }, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"kd" = ( -/obj/structure/table/wood, -/obj/item/storage/bag/tray, -/obj/item/reagent_containers/food/drinks/colocup, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"kg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"kh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"kp" = ( -/obj/structure/chair/wood, -/obj/machinery/light/directional/north, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"ks" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/obj/item/toy/seashell, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"li" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Bar Access" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"lq" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/sepia, -/area/ruin/powered/beach) -"lL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"lT" = ( -/obj/structure/sign/warning/gasmask{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"me" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"mh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"mG" = ( -/obj/structure/flora/rock/pile, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"nw" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/washing_machine, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"nI" = ( -/obj/structure/closet/secure_closet/freezer/kitchen{ - req_access = null - }, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/mayonnaise, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"og" = ( -/obj/structure/weightmachine/weightlifter, -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"oF" = ( -/obj/structure/table/reinforced, -/obj/machinery/reagentgrinder, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"oL" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"oQ" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"oU" = ( -/obj/machinery/seed_extractor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"pz" = ( -/turf/open/water/beach/biodome, -/area/ruin/powered/beach) -"pE" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/sign/warning/gasmask{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"pS" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron{ - icon = 'icons/misc/beach.dmi'; - icon_state = "sand" - }, -/area/ruin/powered/beach) -"qc" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/kitchen{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"qf" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"qg" = ( -/obj/structure/flora/junglebush/large, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"qt" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/food_cart, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"qx" = ( -/obj/structure/table/wood, -/obj/structure/bedsheetbin, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"qy" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/pill/zoom, -/obj/item/reagent_containers/pill/zoom, -/obj/item/reagent_containers/pill/zoom, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"qF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"qT" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"rv" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/directional/west, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"rz" = ( -/obj/item/toy/seashell, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"rK" = ( -/obj/item/toy/beach_ball, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"rU" = ( -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/structure/table, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"sa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"sl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"sA" = ( -/mob/living/simple_animal/crab{ - name = "Jon" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"sM" = ( -/obj/machinery/light/directional/east, -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "bartender's closet"; - req_access = list(25) - }, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/neck/beads, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/clothing/suit/hawaiian, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"sV" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"ta" = ( -/obj/structure/curtain, -/turf/open/floor/iron/white, -/area/ruin/powered/beach) -"tf" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/item/food/grown/ambrosia/vulgaris, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"tn" = ( -/obj/structure/chair/sofa/right, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"tB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"tG" = ( -/turf/open/misc/beach/coastline_t/sandwater_inner, -/area/ruin/powered/beach) -"tO" = ( -/turf/open/misc/beach/coastline_t, -/area/ruin/powered/beach) -"tQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"uz" = ( -/turf/open/floor/light/colour_cycle/dancefloor_a, -/area/ruin/powered/beach) -"vf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/table/wood/poker, -/obj/item/storage/dice, -/obj/item/stack/spacecash/c1000, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"wc" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"wt" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/icecream_vat, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"ww" = ( -/obj/structure/sign/poster/official/fruit_bowl, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"wL" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"wY" = ( -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"xa" = ( -/obj/structure/sign/warning/securearea, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"xe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"xg" = ( -/obj/structure/sign/poster/official/cohiba_robusto_ad{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"xn" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/beach/coastline_b{ - dir = 9 - }, -/area/ruin/powered/beach) -"xA" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"yc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"yk" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"yN" = ( -/obj/machinery/vending/dinnerware, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"yO" = ( -/obj/structure/flora/junglebush, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"yT" = ( -/turf/open/misc/beach/coastline_b, -/area/ruin/powered/beach) -"yY" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/beach/coastline_b{ - dir = 8 - }, -/area/ruin/powered/beach) -"zm" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/pill/morphine, -/obj/item/reagent_containers/pill/morphine, -/obj/item/reagent_containers/pill/morphine, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"zv" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck/cas{ - pixel_x = -6 - }, -/obj/item/toy/cards/deck/cas/black{ - pixel_x = -6; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"zK" = ( -/obj/effect/turf_decal/sand, -/obj/structure/sign/poster/contraband/starkist{ - pixel_y = 32 - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"zT" = ( -/obj/machinery/griddle, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Ao" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/bikehorn/airhorn, -/obj/structure/table/wood, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/brute, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"AB" = ( -/obj/effect/turf_decal/sand, -/mob/living/simple_animal/crab{ - name = "James" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"AC" = ( -/obj/item/storage/crayons, -/obj/structure/closet/crate/wooden, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"AE" = ( -/obj/item/melee/skateboard/hoverboard, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"AG" = ( -/obj/structure/flora/rock/jungle, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"AY" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/reagent_containers/glass/bucket, -/obj/item/cultivator, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"Bg" = ( -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/carpet/red, -/area/ruin/powered/beach) -"Bn" = ( -/turf/open/floor/carpet/blue, -/area/ruin/powered/beach) -"Bp" = ( -/turf/closed/mineral/random/volcanic, -/area/lavaland/surface/outdoors/explored) -"Bv" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/light/directional/east, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"BE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"BL" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"BN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"Cb" = ( -/obj/effect/overlay/coconut, -/obj/machinery/light/directional/north, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Cq" = ( -/obj/structure/sign/departments/restroom{ - pixel_x = 32 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Cs" = ( -/obj/structure/girder{ - damage_deflection = 22 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"CK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"CT" = ( -/obj/item/toy/plush/lizard_plushie/green{ - name = "Soaks-The-Rays" - }, -/turf/open/floor/carpet/orange, -/area/ruin/powered/beach) -"CU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"CZ" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"Dg" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"Ds" = ( -/obj/structure/closet/secure_closet/freezer/kitchen{ - req_access = null - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Eq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Eu" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/water/beach/biodome, -/area/ruin/powered/beach) -"EE" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"EL" = ( -/obj/machinery/light/directional/south, -/turf/open/misc/beach/coastline_b{ - dir = 1 - }, -/area/ruin/powered/beach) -"EN" = ( -/obj/structure/table/reinforced, -/obj/item/secateurs, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"Fa" = ( -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Fi" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Fr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"FC" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - dir = 8; - name = "old sink"; - pixel_x = 12 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"FF" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/reagent_containers/glass/rag, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"FO" = ( -/obj/structure/fluff/beach_umbrella/cap, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"FR" = ( -/obj/structure/chair/sofa/left, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"FZ" = ( -/obj/structure/sign/poster/contraband/space_up{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Ga" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/cooking_to_serve_man, -/obj/item/clothing/suit/apron/chef, -/obj/item/clothing/head/chefhat, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Gf" = ( -/obj/structure/sign/poster/contraband/space_cola{ - pixel_y = 32 - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"GA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/chair/stool/directional/south, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/under/shorts/red, -/obj/item/clothing/glasses/sunglasses, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"GB" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/peppermill, -/obj/item/reagent_containers/food/condiment/soysauce, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"GR" = ( -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/item/toy/beach_ball/holoball/dodgeball, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"Hn" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"Hy" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/stairs/left, -/area/ruin/powered/beach) -"HO" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"HW" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/vending_refill/cigarette, -/obj/item/vending_refill/boozeomat, -/obj/structure/closet/secure_closet{ - icon_state = "cabinet"; - name = "booze storage"; - req_access = list(25) - }, -/obj/item/storage/backpack/duffelbag, -/obj/item/etherealballdeployer, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/colocup, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Il" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Iq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"Iv" = ( -/turf/open/floor/iron/stairs/right, -/area/ruin/powered/beach) -"IG" = ( -/turf/open/floor/carpet/royalblue, -/area/ruin/powered/beach) -"IJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"IL" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"IP" = ( -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/misc/beach/coastline_b{ - dir = 10 - }, -/area/ruin/powered/beach) -"Jr" = ( -/turf/open/floor/carpet/purple, -/area/ruin/powered/beach) -"Jv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"JA" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/misc/beach/coastline_b{ - dir = 4 - }, -/area/ruin/powered/beach) -"JP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"Kn" = ( -/obj/structure/flora/junglebush/large, -/obj/structure/flora/junglebush, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Ky" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"Ld" = ( -/turf/open/misc/beach/coastline_b{ - dir = 5 - }, -/area/ruin/powered/beach) -"Lm" = ( -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Lp" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Mb" = ( -/obj/effect/turf_decal/sand, -/obj/structure/sign/warning/nosmoking/circle{ - pixel_x = 32 - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Md" = ( -/obj/structure/urinal/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Mf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"MO" = ( -/obj/machinery/light/directional/east, -/obj/machinery/chem_dispenser/drinks/fullupgrade{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"MZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"NJ" = ( -/obj/machinery/computer/slot_machine, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"NK" = ( -/obj/machinery/grill, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"NV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"Ou" = ( -/obj/effect/overlay/palmtree_l, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"OE" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"OP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Pr" = ( -/obj/machinery/vending/hydronutrients, -/turf/open/floor/iron/grimy, -/area/ruin/powered/beach) -"PJ" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"PN" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/jukebox, -/obj/item/coin/gold, -/turf/open/floor/sepia, -/area/ruin/powered/beach) -"PY" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - dir = 4; - name = "old sink"; - pixel_x = -12 - }, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) -"Qf" = ( -/obj/effect/turf_decal/sand, -/obj/structure/sign/departments/botany{ - pixel_y = -32 - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Qx" = ( -/obj/effect/overlay/coconut, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"QF" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Rb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/chair/stool/bar/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Rd" = ( -/obj/structure/chair, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Ri" = ( -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Rk" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Ro" = ( -/turf/open/misc/beach/coastline_b{ - dir = 1 - }, -/area/ruin/powered/beach) -"Rx" = ( -/turf/open/misc/beach/coastline_b{ - dir = 8 - }, -/area/ruin/powered/beach) -"RB" = ( -/obj/structure/closet/cabinet, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/under/shorts/blue, -/obj/item/clothing/suit/ianshirt, -/obj/item/clothing/shoes/sandal{ - desc = "A very fashionable pair of flip-flops."; - name = "flip-flops" - }, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/neck/beads, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"RE" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"Sn" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Supply Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"SC" = ( -/obj/machinery/light/directional/north, -/mob/living/simple_animal/crab{ - name = "Eddie" - }, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"SH" = ( -/obj/structure/closet/crate/freezer{ - name = "Cooler" - }, -/obj/item/reagent_containers/food/drinks/ice, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/colocup, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - desc = "Beer advertised to be the best in space."; - name = "Masterbrand Beer" - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - desc = "Beer advertised to be the best in space."; - name = "Masterbrand Beer" - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - desc = "Beer advertised to be the best in space."; - name = "Masterbrand Beer" - }, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/obj/item/reagent_containers/food/drinks/bottle/beer/light, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"SK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/structure/mineral_door/wood{ - name = "Croupier's Booth" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"ST" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"SY" = ( -/obj/structure/flora/rock, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"Ti" = ( -/turf/open/floor/carpet/red, -/area/ruin/powered/beach) -"TC" = ( -/obj/effect/mob_spawn/ghost_role/human/beach{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"TL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"TU" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/floor/sepia, -/area/ruin/powered/beach) -"Uk" = ( -/obj/structure/sign/barsign, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"Up" = ( -/obj/structure/noticeboard/staff, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"UT" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"UZ" = ( -/obj/item/stack/sheet/iron/fifty, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"Vl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Vs" = ( -/obj/structure/toilet, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Vt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 8 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"VI" = ( -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"VL" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/closet/crate{ - name = "fuel crate" - }, -/obj/item/stack/sheet/mineral/coal/ten, -/obj/item/stack/sheet/mineral/coal/ten, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"VO" = ( -/turf/open/floor/pod/dark, -/area/ruin/powered/beach) -"Wd" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/pill/happy, -/obj/item/toy/figure/bartender{ - pixel_x = -8; - pixel_y = -1 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Wf" = ( -/obj/machinery/computer/arcade/battle, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"Wy" = ( -/obj/structure/closet/cabinet, -/obj/item/storage/backpack/duffelbag, -/obj/item/clothing/under/shorts/purple, -/obj/item/clothing/shoes/cookflops{ - desc = "A very fashionable pair of flip flops."; - name = "flip-flops" - }, -/obj/item/clothing/glasses/sunglasses/big, -/obj/item/clothing/neck/beads, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"WV" = ( -/turf/open/misc/beach/coastline_b{ - dir = 6 - }, -/area/ruin/powered/beach) -"Xa" = ( -/obj/item/melee/skateboard/hoverboard, -/mob/living/simple_animal/chicken{ - name = "Chicken Joe" - }, -/turf/open/misc/beach/coastline_t, -/area/ruin/powered/beach) -"Xt" = ( -/obj/machinery/door/airlock/sandstone{ - name = "Surfer Shack 1" - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"XM" = ( -/obj/structure/fluff/beach_umbrella/science, -/turf/open/misc/beach/sand, -/area/ruin/powered/beach) -"XW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/beach) -"Zi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/beach) -"Zj" = ( -/obj/item/instrument/guitar, -/turf/open/floor/carpet/blue, -/area/ruin/powered/beach) -"Zq" = ( -/obj/structure/sign/poster/official/high_class_martini{ - pixel_x = -32 - }, -/obj/effect/mob_spawn/ghost_role/human/bartender{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/powered/beach) -"ZA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/spawner/structure/window, -/obj/structure/curtain, -/turf/open/floor/plating, -/area/ruin/powered/beach) -"ZS" = ( -/turf/closed/mineral/random/volcanic, -/area/template_noop) -"ZZ" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/pod/light, -/area/ruin/powered/beach) - -(1,1,1) = {" -aa -aa -aa -aa -Bp -Bp -Bp -Bp -wL -wL -wL -Bp -aa -aa -aa -aa -aa -Zi -BE -BE -BE -BE -BE -BE -BE -BE -BE -yc -Bp -Bp -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aj -gs -gs -aj -aj -aa -aa -aa -Zi -BE -Mf -kp -fS -UT -aj -oQ -Zq -FF -Fi -aF -Fr -yc -Bp -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aj -cg -Cs -Cs -aj -Zi -xa -BE -Mf -FO -IG -VI -UT -SY -aj -HW -aC -aC -Eq -ct -hS -cd -Bp -"} -(4,1,1) = {" -aa -aj -aj -aj -aj -aj -aj -aj -as -HO -as -pE -mh -HO -gs -VI -VI -IG -VI -VI -VI -aj -sM -aC -aC -CK -IJ -MO -CU -Bp -"} -(5,1,1) = {" -aa -aj -NJ -Fa -xg -aC -aj -aj -aj -lT -as -yk -Jv -as -gs -VI -VI -VI -VI -VI -oL -aj -aj -li -kd -aP -Wd -aj -MZ -Bp -"} -(6,1,1) = {" -aa -aj -NJ -Bg -Ti -Fa -zv -aC -Zi -BE -BE -BE -Mf -aj -aj -Ou -VI -UT -AC -VI -VI -VI -Hy -TU -cE -cE -cE -gF -MZ -Bp -"} -(7,1,1) = {" -aa -aj -Wf -Bg -Ti -Rb -Vl -sa -CU -bb -aN -aT -aY -rv -Qx -VI -VI -VI -Ri -PJ -UT -VI -fB -lq -uz -uz -uz -lq -MZ -Bp -"} -(8,1,1) = {" -aa -aj -tn -Ti -Ti -hC -vf -ct -BN -Lm -Lm -AB -Lm -Lm -VI -rK -VI -VI -UT -VI -VI -VI -fB -lq -uz -uz -uz -PN -MZ -Bp -"} -(9,1,1) = {" -aa -aj -FR -aC -aC -Zi -BE -SK -Mf -Gf -VI -VI -UT -VI -qg -VI -Kn -VI -VI -VI -VI -VI -fB -lq -uz -uz -uz -lq -MZ -Bp -"} -(10,1,1) = {" -aa -Zi -BE -gg -gg -Mf -Qx -hk -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -tG -Iv -lq -lq -lq -lq -lq -Fr -yc -"} -(11,1,1) = {" -aa -MZ -mG -VI -VI -VI -VI -pS -Lm -Lm -Lm -Lm -Lm -Lm -Lm -Bv -VI -VI -hN -SH -VI -tO -xn -JA -JA -JA -JA -JA -IP -MZ -"} -(12,1,1) = {" -aa -MZ -VI -VI -UT -VI -VI -xe -RE -RE -Ga -jc -Il -GB -RE -Uk -VI -VI -bC -Ti -VI -tO -yT -cP -pz -pz -pz -Eu -Ro -MZ -"} -(13,1,1) = {" -Bp -Fr -yc -VI -VI -VI -VI -XW -aI -OE -aC -aC -aC -aC -cV -RE -VI -VI -XM -VI -rz -tO -yT -pz -pz -pz -pz -pz -Ro -MZ -"} -(14,1,1) = {" -Bp -wL -MZ -SC -VI -cm -VI -NV -aW -fL -nI -RE -NK -aC -aC -qy -VI -VI -Jr -Jr -VI -tO -yT -pz -pz -pz -pz -pz -Ro -MZ -"} -(15,1,1) = {" -Bp -gX -cd -VI -Ou -CT -VI -tQ -rU -aC -Ds -ww -zT -aC -aC -hO -VI -VI -FO -VI -VI -tO -yT -pz -pz -cP -cP -pz -EL -MZ -"} -(16,1,1) = {" -Bp -wL -MZ -dj -me -aE -VI -sl -hy -TL -fP -RE -ad -aC -aC -zm -VI -VI -Bn -Zj -VI -tO -yT -cP -pz -cP -iH -pz -Ro -MZ -"} -(17,1,1) = {" -Bp -wL -MZ -Cb -VI -VI -VI -RE -aS -Rk -FC -aC -aC -aC -yN -RE -VI -ks -xA -VI -VI -tO -yT -pz -pz -pz -pz -pz -Ro -MZ -"} -(18,1,1) = {" -Bp -Zi -Mf -UT -VI -VI -VI -RE -RE -RE -RE -aB -RE -RE -RE -Up -VI -Ao -bG -bL -VI -tO -yT -pz -Eu -pz -pz -cP -Ro -MZ -"} -(19,1,1) = {" -aa -MZ -bd -VI -VI -UT -VI -rv -Lm -wt -qt -Lm -Lm -Lm -Lm -rv -VI -GA -bH -bM -VI -Xa -yT -pz -pz -pz -pz -pz -EL -MZ -"} -(20,1,1) = {" -aa -MZ -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -VI -wc -tO -Ld -yY -Rx -Rx -Rx -Rx -WV -MZ -"} -(21,1,1) = {" -aa -Ky -ao -ao -yc -qg -VI -VI -VI -VI -VI -xA -VI -VI -VI -VI -VI -VI -VI -VI -Qf -aj -aj -aj -aj -aj -aj -Zi -BE -Mf -"} -(22,1,1) = {" -aa -MZ -aC -aC -Fr -yc -AG -Zi -qF -ZA -Vt -yc -yO -VI -UT -VI -VI -VI -VI -sA -Lm -wY -wY -wY -AE -AE -qf -MZ -Bp -Bp -"} -(23,1,1) = {" -aa -eE -IJ -fL -aC -Fr -BE -Mf -de -TC -hq -Fr -qF -ZA -Vt -yc -VI -VI -VI -Rd -Lm -hX -VO -og -wY -wY -Hn -Fr -yc -Bp -"} -(24,1,1) = {" -aa -lL -nw -TL -aC -aC -aC -Xt -tB -aC -kh -aj -de -TC -hq -MZ -Ou -Qx -VI -VI -Lm -VO -VO -VO -Iq -wY -JP -PY -Fr -yc -"} -(25,1,1) = {" -aa -MZ -qx -aC -Cq -aC -aC -aj -EE -Rk -RB -aj -tB -aC -OP -MZ -VI -VI -UT -VI -dc -hX -VO -og -gC -EN -kg -wY -Pr -MZ -"} -(26,1,1) = {" -aa -MZ -aj -hF -aj -bY -aC -aj -aj -aj -aj -aj -EE -aC -Wy -MZ -zK -Lm -Lm -Lm -Mb -wY -ZZ -wY -gC -oF -oU -wY -tf -MZ -"} -(27,1,1) = {" -aa -eE -qc -aC -aj -aC -aC -aC -aC -FZ -aC -aj -aj -gT -aj -Fr -ao -ao -ST -Sn -qF -BE -yc -kb -gC -wY -kg -wY -AY -MZ -"} -(28,1,1) = {" -aa -lL -Md -QF -aj -aj -aj -BL -aC -aC -aC -aC -aC -aC -aC -aC -aC -aC -MZ -GR -UZ -IL -MZ -sV -Dg -sV -CZ -sV -Zi -Mf -"} -(29,1,1) = {" -aa -MZ -Vs -aC -ta -ek -Zi -BE -yc -aC -Rk -aC -aC -aC -Lp -qT -aC -aC -MZ -et -VL -aj -Fr -BE -cd -BE -CU -BE -Mf -Bp -"} -(30,1,1) = {" -aa -Fr -BE -BE -BE -BE -Mf -ZS -Fr -BE -BE -BE -BE -BE -CU -cd -BE -BE -Mf -aj -aj -aj -Bp -Bp -Bp -Bp -Bp -Bp -Bp -Bp -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm deleted file mode 100644 index a22f8e4e9e7a..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_clown_planet.dmm +++ /dev/null @@ -1,1832 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ae" = ( -/obj/machinery/light/directional/south, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/clownplanet) -"aj" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"al" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"am" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"an" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"ao" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"ap" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aq" = ( -/obj/structure/disposalpipe/trunk, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"au" = ( -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"av" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 3 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"aw" = ( -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"aL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"aP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aS" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aX" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"aZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"bb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/structure/table, -/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape, -/obj/item/pen/fourcolor, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"be" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/structure/table, -/obj/item/flashlight/lamp/bananalamp, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/item/pickaxe, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bh" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bi" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/open/indestructible/light, -/area/ruin/powered/clownplanet) -"bk" = ( -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/machinery/light/small/directional/west, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bl" = ( -/turf/open/indestructible/light, -/area/ruin/powered/clownplanet) -"bm" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bn" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bp" = ( -/turf/closed/mineral/bananium, -/area/ruin/powered/clownplanet) -"bq" = ( -/obj/item/pickaxe, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"br" = ( -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bs" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"bt" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"bx" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"bz" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"bA" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"bB" = ( -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bD" = ( -/obj/structure/mecha_wreckage/honker, -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"bE" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"bF" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bK" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"bL" = ( -/obj/item/reagent_containers/food/drinks/trophy/gold_cup, -/obj/structure/table/glass, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bM" = ( -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bN" = ( -/obj/machinery/disposal/delivery_chute, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bO" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bP" = ( -/obj/structure/statue/bananium/clown, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bQ" = ( -/obj/structure/table/glass, -/obj/item/grown/bananapeel/bluespace, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bR" = ( -/obj/structure/table/glass, -/obj/item/clothing/shoes/clown_shoes/banana_shoes, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bS" = ( -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/machinery/light/small/directional/west, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bT" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/spray/waterflower/superlube, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bU" = ( -/obj/item/bikehorn/airhorn, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bV" = ( -/obj/structure/table/glass, -/obj/item/gun/magic/staff/honk, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"bW" = ( -/obj/item/bikehorn, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bY" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood/old, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"bZ" = ( -/obj/machinery/door/airlock/bananium, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"ca" = ( -/obj/item/bikehorn, -/obj/effect/decal/cleanable/dirt, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"cc" = ( -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"ch" = ( -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"cu" = ( -/turf/open/floor/plating, -/area/ruin/powered/clownplanet) -"dF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/machinery/light/small/directional/west, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"dG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/machinery/light/small/directional/east, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"dH" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/light/small/directional/east, -/turf/open/indestructible/white, -/area/ruin/powered/clownplanet) -"dI" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"dK" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"dL" = ( -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/item/coin/bananium, -/obj/machinery/light/small/directional/east, -/turf/open/floor/carpet, -/area/ruin/powered/clownplanet) -"dM" = ( -/obj/machinery/light/directional/north, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"dO" = ( -/obj/machinery/light/directional/south, -/turf/open/indestructible/honk, -/area/ruin/powered/clownplanet) -"eE" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/closed/wall/r_wall, -/area/ruin/powered/clownplanet) -"eS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"eV" = ( -/obj/item/bikehorn, -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"eX" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"gg" = ( -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"gX" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/chasm/lavaland, -/area/lavaland/surface/outdoors/explored) -"iZ" = ( -/obj/item/grown/bananapeel{ - color = "#2F3000"; - name = "stealth banana peel" - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"jw" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"ky" = ( -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"li" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"lx" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"lF" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/item/bikehorn, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"lN" = ( -/obj/item/bikehorn, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"mE" = ( -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"os" = ( -/obj/effect/mapping_helpers/no_lava, -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"oN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"oP" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"pb" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"ps" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"rP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"sb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"th" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"uJ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"ye" = ( -/turf/open/lava/smooth, -/area/ruin/powered/clownplanet) -"BO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4; - invisibility = 101 - }, -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"Cs" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"CB" = ( -/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"DI" = ( -/obj/structure/disposalpipe/junction/yjunction{ - dir = 1; - invisibility = 101 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"DW" = ( -/obj/machinery/light/directional/north, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/clownplanet) -"ER" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"HY" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"JU" = ( -/obj/item/bikehorn, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"KV" = ( -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"Lg" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"LH" = ( -/obj/machinery/disposal/delivery_chute{ - desc = "The following is engraved upon the chute: A FATE WORSE THAN DEATH LIES WITHIN"; - dir = 1; - name = "THE TRIAL OF HONKITUDE" - }, -/obj/structure/disposalpipe/trunk, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"Or" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/clownplanet) -"QT" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"Rl" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"Rt" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"RW" = ( -/obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"Tj" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"TD" = ( -/obj/structure/disposalpipe/trunk, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"TI" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"WO" = ( -/obj/item/bikehorn, -/obj/structure/disposalpipe/segment{ - invisibility = 101 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/indestructible/permalube, -/area/ruin/powered/clownplanet) -"Xm" = ( -/obj/item/clothing/head/cone, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"YI" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/mapping_helpers/no_lava, -/mob/living/simple_animal/hostile/retaliate/clown, -/turf/open/floor/noslip, -/area/ruin/powered/clownplanet) -"Zg" = ( -/obj/machinery/light/directional/west, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/clownplanet) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -QT -QT -QT -QT -QT -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -cc -cc -cc -cc -cc -cc -cc -Or -QT -gX -QT -QT -gX -Or -cc -cc -cc -cc -cc -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -cc -cc -cc -ye -ye -ye -ye -ye -cc -cc -gX -gX -iZ -gX -gX -cc -cc -ye -ye -ye -cc -cc -cc -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -cc -cc -ye -ye -ye -ao -aJ -ao -aJ -ye -cc -cc -gX -gX -gX -cc -cc -ye -ye -aU -cu -ye -ye -cc -cc -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -cc -cc -ye -ye -am -au -aS -li -Rl -Cs -aJ -ye -cc -cc -cc -cc -cc -bO -bB -aU -ye -ye -ye -ye -ye -cc -cc -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -cc -ye -ye -cc -rP -aj -KV -lN -KV -ps -aL -ye -cc -bB -bH -bB -cc -bB -bH -bY -bB -aU -ye -aU -ye -ye -cc -DW -aa -"} -(7,1,1) = {" -aa -aa -cc -cc -ye -am -ky -Tj -oN -aj -KV -aJ -aL -aL -cc -bx -bA -bB -bH -bH -bB -bH -bB -bB -bB -cc -ye -cu -ye -cc -cc -aa -"} -(8,1,1) = {" -aa -aa -cc -ye -ye -ap -KV -ps -oN -aL -aX -aL -bb -dF -bp -cc -dI -bA -bB -cc -cc -bH -cc -bB -bB -bB -aU -ye -ye -ye -cc -aa -"} -(9,1,1) = {" -aa -aa -cc -ye -am -KV -KV -Rl -al -al -aL -bb -bb -bb -bq -bp -cc -cc -bA -bB -bB -bH -bB -bB -ca -bH -dO -cc -ye -ye -cc -aa -"} -(10,1,1) = {" -aa -QT -cc -ye -an -TI -KV -ps -aL -oN -aL -bb -bb -bj -bl -br -bA -bA -bA -bB -cc -bB -bB -bH -bH -bB -bB -ye -aU -ye -cc -cc -"} -(11,1,1) = {" -aa -ae -cc -ye -ao -ch -mE -Rl -oN -oN -aL -bb -bg -bj -bl -bp -cc -bA -bA -bB -bB -cc -bB -bB -bB -bB -bH -ye -aU -ye -ye -cc -"} -(12,1,1) = {" -aa -QT -cc -ye -ap -KV -KV -lF -oN -an -Tj -aL -bb -dG -br -cc -cc -bA -bB -bB -cc -cc -bB -bB -cc -bB -bH -ye -cu -aU -ye -cc -"} -(13,1,1) = {" -eE -eE -eE -eE -cu -aj -KV -Tj -HY -ky -KV -Tj -aL -aL -bs -ch -aJ -cc -cc -cc -bP -bS -cc -dM -bB -bH -ca -bB -ye -aU -ye -cc -"} -(14,1,1) = {" -eE -RW -Xm -eE -cc -an -KV -KV -KV -KV -WO -KV -Rl -al -Lg -ER -oN -cc -cc -bL -bM -bM -bM -cc -bB -bH -bH -bB -ye -aU -ye -cc -"} -(15,1,1) = {" -eE -RW -RW -LH -ch -au -KV -ch -KV -sb -ch -ky -KV -Rl -th -al -HY -ps -cc -dK -bQ -bT -bM -cc -cc -bH -bB -bB -ye -aU -ye -cc -"} -(16,1,1) = {" -os -eX -CB -YI -cc -ao -KV -aJ -aj -ps -aj -KV -KV -au -bt -HY -ps -Lg -ch -bN -bM -bU -bM -bZ -bB -bH -bB -cc -ye -aU -ye -cc -"} -(17,1,1) = {" -eE -eX -RW -TD -ch -av -ER -al -al -aL -al -jw -KV -ps -JU -uJ -DI -th -cc -bM -bR -bV -bM -cc -bB -bB -bB -bB -ye -aU -ye -cc -"} -(18,1,1) = {" -eE -RW -RW -eE -cc -cc -oN -oN -oN -al -al -al -Rt -HY -ps -gg -aL -lx -cc -bL -bM -bM -bM -cc -bB -bB -bB -bB -ye -aU -ye -cc -"} -(19,1,1) = {" -eE -eE -eE -eE -ye -cc -oN -oN -eV -al -al -aL -cc -cc -aZ -cc -bD -cc -bB -cc -bP -dL -cc -dM -bB -bH -bH -bB -ye -aU -ye -cc -"} -(20,1,1) = {" -aa -QT -cc -ye -cc -cc -al -al -al -oN -al -aL -bh -bk -bn -cc -bE -aJ -bB -bB -cc -cc -bY -bB -bB -bH -bB -ye -aU -cu -ye -cc -"} -(21,1,1) = {" -aa -ae -cc -ye -cc -cc -eS -BO -aL -oN -aL -bd -bb -bl -bl -bp -cc -aZ -bA -bB -bB -cc -bB -bH -bB -bB -bB -ye -aU -ye -ye -cc -"} -(22,1,1) = {" -aa -QT -cc -ye -aq -aw -Tj -aL -aP -oN -aL -be -bb -bl -bl -bz -ch -bK -cc -bB -bB -bH -bH -bH -bB -bW -dO -cc -aU -ye -cc -cc -"} -(23,1,1) = {" -aa -aa -cc -ye -cc -cc -Rt -al -al -eV -aZ -bb -bi -bm -br -bp -cc -bA -bA -bB -bB -bH -bH -bB -bB -cc -cc -ye -cu -ye -cc -aa -"} -(24,1,1) = {" -aa -aa -cc -ye -cc -cc -th -al -aL -al -aL -aL -bh -dH -bp -cc -dI -bA -bB -bB -bB -bB -bB -cc -bB -bB -ye -cu -ye -ye -cc -aa -"} -(25,1,1) = {" -aa -aa -cc -ye -ye -cc -pb -al -al -al -HY -Tj -aL -cc -cc -bA -bA -bB -bB -bB -bH -bW -bB -bB -bB -cc -ye -aU -ye -cc -cc -aa -"} -(26,1,1) = {" -aa -aa -cc -cc -ye -cc -cc -HY -Tj -oP -KV -KV -aS -cc -ye -cc -bF -bB -bB -cc -bB -bB -cc -bB -bB -ye -cu -ye -ye -cc -DW -aa -"} -(27,1,1) = {" -aa -aa -aa -cc -cc -ye -ye -cc -cu -cc -gg -Rt -cu -cc -ye -cc -cc -cc -cc -cc -bB -bB -bB -ye -ye -ye -ye -ye -cc -cc -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -cc -cc -ye -ye -ye -aU -aU -aU -cc -ye -cc -cc -gX -gX -gX -cc -cc -ye -ye -cu -aU -ye -ye -cc -cc -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -cc -cc -cc -ye -ye -ye -ye -ye -cc -cc -gX -gX -iZ -gX -gX -cc -cc -ye -ye -ye -cc -cc -cc -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -cc -cc -cc -cc -cc -cc -cc -Zg -QT -QT -QT -QT -gX -Zg -cc -cc -cc -cc -cc -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -QT -gX -QT -QT -QT -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm b/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm deleted file mode 100644 index f236a25a6a0e..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_strong_rock.dmm +++ /dev/null @@ -1,23 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/template_noop) -"b" = ( -/turf/closed/mineral/strong, -/area/template_noop) - -(1,1,1) = {" -a -a -a -"} -(2,1,1) = {" -a -b -a -"} -(3,1,1) = {" -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm deleted file mode 100644 index c2754159e13c..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ash_walker1.dmm +++ /dev/null @@ -1,1827 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ac" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ad" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ae" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"af" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ag" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ah" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ai" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"aj" = ( -/obj/structure/stone_tile/slab, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ak" = ( -/turf/closed/indestructible/riveted/boss, -/area/ruin/unpowered/ash_walkers) -"al" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"aq" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"ar" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"as" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/unpowered/ash_walkers) -"at" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"au" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/item/flashlight/lantern, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"av" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"aw" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"ax" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"ay" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/item/flashlight/lantern, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"az" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"aF" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"aG" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"aH" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aI" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aJ" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aK" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"aR" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"aS" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"aT" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aU" = ( -/obj/structure/lavaland/ash_walker, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aV" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"aW" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"aY" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bc" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bd" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"be" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"bf" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"bg" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bh" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"bi" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"bj" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/item/storage/bag/plants/portaseeder, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bk" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/item/stack/marker_beacon/ten, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bm" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/item/construction/rcd/loaded, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bp" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/item/flashlight/lantern, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bq" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"br" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bs" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bt" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/item/flashlight/lantern, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bw" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/seeds/tower, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bx" = ( -/obj/structure/stone_tile/slab/cracked, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"by" = ( -/obj/structure/closet/crate, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bz" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bB" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bC" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"bG" = ( -/turf/closed/indestructible/riveted/boss/see_through, -/area/ruin/unpowered/ash_walkers) -"bH" = ( -/obj/structure/necropolis_gate, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"bI" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"bJ" = ( -/obj/structure/stone_tile/surrounding_tile, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cp" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cF" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/spear, -/obj/item/storage/belt, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"cL" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/spear, -/obj/item/scythe, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"cM" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/spear, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"cN" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/spear, -/obj/item/clothing/head/helmet/roman/legionnaire, -/turf/open/indestructible/boss, -/area/ruin/unpowered/ash_walkers) -"cO" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cP" = ( -/obj/structure/stone_tile/block, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cQ" = ( -/obj/structure/stone_tile/block/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cR" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"cT" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"du" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dz" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dB" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/center/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dC" = ( -/obj/structure/stone_tile, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dD" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dE" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"dP" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"eu" = ( -/obj/structure/stone_tile, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"eC" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/item/pickaxe, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"eG" = ( -/obj/structure/closet/crate/radiation, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/flare, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"gi" = ( -/obj/structure/table/optable, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"hF" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"id" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/obj/effect/decal/cleanable/blood, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ie" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/item/cultivator/rake, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"iy" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"iW" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"kX" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"mm" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"mp" = ( -/obj/structure/stone_tile/surrounding/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"mB" = ( -/obj/structure/stone_tile/surrounding/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"mL" = ( -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"nB" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"oI" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pT" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"qn" = ( -/obj/item/storage/box/rxglasses, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"qw" = ( -/obj/structure/stone_tile/slab, -/obj/effect/decal/cleanable/blood, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"qV" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"qZ" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"rs" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/item/hatchet/wooden, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ry" = ( -/obj/structure/stone_tile/block, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"rZ" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"sd" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/effect/decal/cleanable/blood, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"tY" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ua" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/item/spear, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"uv" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"vk" = ( -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"vw" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/closet/crate, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"wB" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"wQ" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"xd" = ( -/obj/structure/stone_tile/block/cracked, -/obj/item/storage/toolbox/syndicate, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"xo" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"xH" = ( -/obj/item/spear, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"zD" = ( -/obj/item/stack/sheet/mineral/wood, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"zR" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Aj" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"AV" = ( -/obj/item/pickaxe, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Bc" = ( -/obj/item/shovel, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Bl" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Bq" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Cg" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Dx" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Eb" = ( -/obj/item/seeds/glowshroom, -/obj/item/seeds/glowshroom, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Ee" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Fa" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Fg" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/item/spear, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Fp" = ( -/obj/structure/stone_tile/slab, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"FJ" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/item/weldingtool/experimental, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Go" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Gv" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Gx" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"GW" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"HU" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ic" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ie" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"If" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/item/malf_upgrade, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Iy" = ( -/obj/item/flashlight/lantern, -/obj/structure/stone_tile/center, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"IS" = ( -/obj/structure/stone_tile/block, -/obj/item/spear, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Kt" = ( -/obj/structure/water_source/puddle{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"KR" = ( -/obj/structure/stone_tile/block/cracked, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Lb" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"LH" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"LN" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"MD" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"MY" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"Nv" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"NV" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Oe" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/ore_box, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"OY" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"RE" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"RH" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Sf" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/item/reagent_containers/glass/bucket/wooden, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Sq" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Th" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Tr" = ( -/obj/machinery/hydroponics/soil, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"TO" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/lizard, -/obj/item/reagent_containers/blood/lizard, -/obj/item/stack/sheet/cloth/ten, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"TY" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Uh" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/closet/crate/internals, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/item/pickaxe, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"UI" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/machinery/iv_drip, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ash_walkers) -"UL" = ( -/obj/structure/stone_tile/cracked, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Wh" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Xp" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"YO" = ( -/obj/structure/bonfire/dense, -/obj/structure/stone_tile/center, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -aa -aa -aa -aa -ah -ah -ah -ah -ah -ah -ah -aa -aa -ah -ah -ah -ah -aa -aa -aa -"} -(2,1,1) = {" -aa -ah -ah -ah -ah -ah -ah -bi -ah -bi -cO -ah -ah -ah -ah -ah -ah -ah -aa -aa -"} -(3,1,1) = {" -aa -aa -ah -as -as -as -as -ak -as -as -cP -ah -ah -eu -oI -AV -ah -ah -ah -aa -"} -(4,1,1) = {" -aa -aa -ah -ak -If -MY -Eb -bj -vw -ak -cP -eu -Bq -ua -Xp -Xp -xo -ah -ah -aa -"} -(5,1,1) = {" -aa -aa -ac -as -Gx -FJ -aY -bk -bw -ak -NV -Sq -Bl -Fa -LN -oI -RH -NV -ah -ah -"} -(6,1,1) = {" -aa -aa -cT -ak -xd -qn -mB -Lb -bx -dP -Fp -MD -KR -YO -tY -id -oI -Xp -ah -ah -"} -(7,1,1) = {" -aa -aa -ae -as -gi -vk -Ie -bm -by -ak -KR -NV -qV -HU -TY -eu -RH -Go -ah -ah -"} -(8,1,1) = {" -aa -aa -ae -as -TO -UI -wQ -eG -bz -ak -NV -Dx -Aj -Nv -UL -zD -Sq -Bc -ah -ah -"} -(9,1,1) = {" -aa -ah -ah -as -ak -as -as -as -ak -ak -Bq -NV -Bq -Wh -RH -pT -Sf -Ic -dD -ah -"} -(10,1,1) = {" -aa -ai -aq -at -aF -aR -aR -eC -HU -uv -OY -Bq -NV -nB -qZ -ry -Iy -ie -dE -ah -"} -(11,1,1) = {" -ab -aj -ak -ak -ak -ak -ak -ak -ak -qw -GW -NV -RH -Nv -NV -rs -Tr -dB -dC -aa -"} -(12,1,1) = {" -ac -ak -ak -ak -ak -ak -ak -ak -ak -ak -IS -RH -Aj -Nv -Kt -du -dz -dC -ah -aa -"} -(13,1,1) = {" -ad -ak -ak -au -aG -aS -bc -bp -ak -ak -wB -Gv -mL -iW -ah -ah -ah -ah -ah -ah -"} -(14,1,1) = {" -ae -ak -ak -av -aH -aT -bd -bq -ak -bG -zR -LH -Bq -RE -hF -ah -bi -bi -bi -cO -"} -(15,1,1) = {" -ac -ak -ak -aw -aI -aU -be -br -bB -bH -Fp -iy -qZ -Th -ak -ak -as -ak -ak -ah -"} -(16,1,1) = {" -ac -ak -ak -ax -aJ -aV -bf -bs -ak -bG -sd -LH -Aj -iW -as -Fg -kX -cL -as -ah -"} -(17,1,1) = {" -af -ak -ak -ay -aK -aW -bg -bt -ak -ak -Ee -Bq -xH -Fp -Cg -rZ -mp -cM -as -ah -"} -(18,1,1) = {" -ac -ak -ak -ak -ak -ak -ak -ak -ak -ak -KR -Aj -eu -ah -as -mm -cF -cN -ak -cP -"} -(19,1,1) = {" -ag -aj -ak -ak -ak -ak -ak -ak -ak -bI -Oe -Uh -ah -cp -as -as -as -ak -ak -cQ -"} -(20,1,1) = {" -aa -al -ar -az -az -az -bh -az -bC -bJ -ah -ah -ah -al -ah -ah -bC -ah -ah -cR -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm deleted file mode 100644 index df10ceff550b..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_biodome_winter.dmm +++ /dev/null @@ -1,1436 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/obj/machinery/shower{ - pixel_y = 12 - }, -/turf/open/floor/iron/white/textured_large, -/area/ruin/powered/snow_biodome) -"ac" = ( -/obj/item/stack/medical/ointment, -/obj/structure/table, -/obj/item/stack/medical/bruise_pack, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"ad" = ( -/obj/structure/table, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"ae" = ( -/obj/machinery/power/smes, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"af" = ( -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"ag" = ( -/obj/structure/displaycase/freezeray, -/turf/open/floor/iron/dark/textured, -/area/ruin/powered/snow_biodome) -"ah" = ( -/obj/machinery/light/cold/directional/west, -/turf/open/floor/circuit, -/area/ruin/powered/snow_biodome) -"ai" = ( -/obj/structure/sink{ - pixel_y = 26 - }, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/white/textured_large, -/area/ruin/powered/snow_biodome) -"aj" = ( -/turf/open/floor/iron/white/textured_large, -/area/ruin/powered/snow_biodome) -"ak" = ( -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"al" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"am" = ( -/obj/item/reagent_containers/food/drinks/mug, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"an" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/textured_large, -/area/ruin/powered/snow_biodome) -"ao" = ( -/turf/open/misc/ice, -/area/ruin/powered/snow_biodome) -"ap" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aq" = ( -/turf/closed/wall/mineral/wood, -/area/ruin/powered/snow_biodome) -"ar" = ( -/obj/machinery/door/airlock/wood, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"as" = ( -/obj/machinery/door/poddoor{ - id = "winter_biodome" - }, -/turf/open/floor/iron/dark/textured, -/area/ruin/powered/snow_biodome) -"at" = ( -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"au" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"av" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"aw" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"ax" = ( -/obj/structure/table/wood, -/obj/item/food/canned/beans{ - pixel_y = 6 - }, -/obj/machinery/button/door{ - desc = "Who the hell hid behind a can of beans?"; - id = "winter_biodome"; - name = "secret button" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"ay" = ( -/obj/machinery/door/airlock/wood, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"az" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aA" = ( -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"aB" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aC" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aD" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"aE" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/mineral/wood, -/area/ruin/powered/snow_biodome) -"aF" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"aG" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"aH" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"aI" = ( -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aJ" = ( -/obj/vehicle/ridden/atv, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aK" = ( -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/iron/white/textured_large, -/area/ruin/powered/snow_biodome) -"aL" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/trash/semki, -/obj/item/trash/candy, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aM" = ( -/turf/open/floor/carpet, -/area/ruin/powered/snow_biodome) -"aN" = ( -/obj/structure/bed/dogbed, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"aO" = ( -/obj/machinery/door/airlock/glass_large, -/obj/structure/fans/tiny, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"aP" = ( -/obj/structure/fans/tiny, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"aQ" = ( -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"aR" = ( -/obj/structure/flora/tree/pine/xmas, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"bl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood{ - temperature = 180; - name = "bridge" - }, -/area/ruin/powered/snow_biodome) -"bv" = ( -/obj/machinery/light/directional/north, -/turf/open/misc/ice, -/area/ruin/powered/snow_biodome) -"bw" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"bx" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"by" = ( -/obj/machinery/light/directional/west, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"bz" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"bB" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"bD" = ( -/obj/machinery/light/directional/north, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"bM" = ( -/obj/machinery/light/directional/south, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"bN" = ( -/obj/machinery/light/directional/south, -/turf/open/misc/ice, -/area/ruin/powered/snow_biodome) -"dS" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"eb" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"eg" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"gh" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"gz" = ( -/obj/structure/chair/stool/directional/south, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"hr" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) -"hA" = ( -/obj/machinery/light/built/directional/north, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/pod/dark{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/powered/snow_biodome) -"og" = ( -/turf/open/floor/iron/stairs{ - dir = 1 - }, -/area/ruin/powered/snow_biodome) -"pr" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"qt" = ( -/obj/machinery/door/airlock/silver, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"sn" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/blue{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"tb" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"tl" = ( -/turf/open/floor/pod/light, -/area/ruin/powered/snow_biodome) -"uO" = ( -/obj/item/bedsheet/blue{ - dir = 4 - }, -/obj/structure/bed{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/ruin/powered/snow_biodome) -"vr" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"vN" = ( -/turf/open/floor/plating/snowed/smoothed, -/area/ruin/powered/snow_biodome) -"wN" = ( -/obj/machinery/light/cold/directional/east, -/turf/open/floor/circuit, -/area/ruin/powered/snow_biodome) -"xU" = ( -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"zT" = ( -/obj/machinery/door/airlock/silver, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"AM" = ( -/obj/structure/table, -/obj/item/pen, -/obj/item/paper, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"BM" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"Dd" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/gloves/fingerless, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"Ef" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"Ez" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/glass_large, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"EA" = ( -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"Gi" = ( -/obj/structure/flora/bush, -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"HP" = ( -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"HR" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"JZ" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"KS" = ( -/obj/item/chainsaw, -/obj/structure/closet, -/obj/machinery/light/small/directional/east, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"Mp" = ( -/obj/item/clothing/mask/balaclava, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"Oj" = ( -/obj/structure/table, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"PD" = ( -/obj/machinery/door/airlock/hatch, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"PK" = ( -/obj/structure/table, -/obj/item/pen, -/obj/item/paper_bin, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"PM" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood{ - temperature = 180; - name = "bridge" - }, -/area/ruin/powered/snow_biodome) -"Qa" = ( -/obj/effect/mapping_helpers/no_lava, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"QI" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"QK" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/cigpack_carp, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"QN" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/ruin/powered/snow_biodome) -"Sj" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"Ub" = ( -/obj/structure/filingcabinet, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"UM" = ( -/obj/machinery/computer/monitor/secret{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/ruin/powered/snow_biodome) -"VE" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/snow, -/area/ruin/powered/snow_biodome) -"Wg" = ( -/turf/closed/wall/r_wall, -/area/ruin/powered/snow_biodome) -"Zx" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/powered/snow_biodome) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Wg -Wg -Wg -Wg -PD -Wg -Wg -Wg -Wg -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -Wg -Wg -Wg -Wg -Wg -Dd -gh -HP -tl -gh -HP -Ub -Wg -Wg -Wg -Wg -Wg -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -Wg -Wg -Wg -ak -by -ak -Wg -Dd -HP -HP -tl -PK -gz -UM -Wg -ak -ak -ak -Wg -Wg -Wg -QI -QI -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -Wg -Wg -ak -aC -ak -ak -ak -Wg -QN -QN -QN -qt -QN -QN -QN -Wg -ak -ak -ak -ak -ak -Wg -Wg -QI -QI -aa -aa -"} -(5,1,1) = {" -aa -aa -Wg -Wg -ao -ao -ak -aI -ak -ak -by -az -ak -aB -ak -ak -ak -aI -by -ak -ak -ak -ak -ak -ak -Wg -Wg -QI -tb -aa -"} -(6,1,1) = {" -aa -aa -Wg -bv -ao -ao -ao -ao -ak -aI -ak -ak -ak -ak -ak -ak -ak -ak -ak -aQ -ak -ak -ak -az -ak -ak -Wg -QI -tb -aa -"} -(7,1,1) = {" -aa -Wg -Wg -ap -ak -ao -ao -ao -ao -ak -ak -ak -ak -ak -az -ak -aC -ak -ak -aI -aI -ak -ak -ak -ak -bM -Wg -Wg -tb -aa -"} -(8,1,1) = {" -aa -Wg -ak -ak -ak -ak -ak -ao -ao -ao -ao -ak -ak -ak -ak -ak -ak -ak -ap -aI -ak -aQ -ak -ak -ak -az -ak -Wg -tb -tb -"} -(9,1,1) = {" -aa -Wg -Wg -Wg -ak -az -ak -ak -ao -ao -ao -ao -ao -ak -ak -ak -ak -ak -ak -ak -ak -aC -ak -ak -ak -ak -ak -Wg -hA -tb -"} -(10,1,1) = {" -Wg -Wg -al -Wg -aq -aq -aq -aq -ak -ak -ak -ao -ao -ao -ao -ak -aI -az -pr -EA -ak -ak -ak -aI -ak -ak -ak -Wg -tb -tb -"} -(11,1,1) = {" -Wg -ac -am -aq -aq -uO -sn -aq -aq -aq -bD -ao -ao -ao -ao -ao -ak -ak -bl -PM -ak -aI -ak -ak -ak -Wg -Wg -Wg -Wg -tb -"} -(12,1,1) = {" -Wg -ad -af -ar -bw -aA -aD -ar -at -aq -ak -az -ak -ao -ao -ao -ao -ao -bl -PM -ak -ak -ak -az -bM -Wg -Dd -Dd -Wg -tb -"} -(13,1,1) = {" -Wg -ae -am -aq -au -au -aq -aq -bz -aq -ak -ak -ak -ao -ao -ao -ao -ao -bl -PM -ao -ak -ak -ak -aI -Wg -Mp -dS -Wg -tb -"} -(14,1,1) = {" -Wg -Wg -Wg -aq -aq -aq -aE -aH -at -aq -aq -vr -aC -ak -ao -ak -ao -ao -bl -PM -ao -ao -aI -ak -ak -Wg -tl -tl -Wg -tb -"} -(15,1,1) = {" -Wg -ah -Wg -Wg -hr -at -at -at -aM -aM -aO -vN -vN -ak -ak -ak -ak -ao -bl -PM -ao -ao -ak -ak -ak -aO -tl -tl -Ez -Qa -"} -(16,1,1) = {" -Wg -ag -og -as -Zx -at -at -at -aM -aM -aP -vN -aQ -vN -ak -az -ak -ak -bl -PM -ak -ao -ao -ak -ak -aP -tl -tl -aP -Qa -"} -(17,1,1) = {" -Wg -wN -Wg -Wg -ax -aw -aF -at -at -aq -aq -Gi -ak -ak -ak -ak -ak -ak -VE -BM -ak -ao -ao -ao -ak -Wg -tl -tl -Wg -tb -"} -(18,1,1) = {" -Wg -Wg -Wg -aq -av -aG -aG -at -bz -aq -aR -ak -ak -ak -ak -ak -ak -ak -aC -ak -ak -ak -ao -ao -ao -Wg -HP -dS -Wg -tb -"} -(19,1,1) = {" -Wg -ab -aj -ay -at -at -aH -bx -aN -aq -ak -ak -ak -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ao -bN -Wg -QK -AM -Wg -tb -"} -(20,1,1) = {" -Wg -ai -an -aq -aq -av -av -aq -aq -aq -bD -ak -ak -ak -ak -aI -ak -az -ak -ak -ak -ak -az -ak -ao -Wg -Wg -Wg -Wg -tb -"} -(21,1,1) = {" -Wg -Wg -aK -Wg -aq -aq -aq -aq -ak -ak -ak -ak -ak -ak -aC -ak -ak -ak -ak -ap -ak -ak -ak -ak -ak -ak -ak -Wg -tb -tb -"} -(22,1,1) = {" -aa -Wg -Wg -Wg -ak -aL -aI -ak -ap -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aI -ak -ak -aQ -ak -ak -ak -Wg -hA -tb -"} -(23,1,1) = {" -aa -Wg -ak -ak -az -ak -aJ -ak -ak -ak -ak -ak -ak -az -ak -aQ -ak -aC -ak -aI -ak -az -aI -aI -ak -ak -ak -Wg -tb -tb -"} -(24,1,1) = {" -aa -Wg -Wg -ak -ak -aB -ak -ak -aC -ak -ak -ak -ak -aI -ak -ap -ak -ak -ak -ak -ak -ak -aI -aI -ak -bM -Wg -Wg -tb -aa -"} -(25,1,1) = {" -aa -aa -Wg -ap -ak -ak -ak -ak -ak -aQ -ak -ak -ak -aI -ak -ak -ak -ak -aQ -ak -ak -aB -ak -ak -aC -ak -Wg -QI -tb -aa -"} -(26,1,1) = {" -aa -aa -Wg -Wg -ak -ak -az -ak -ak -ak -bB -ak -ak -ak -ak -ak -az -ak -bB -ak -ak -az -ak -ak -ak -Wg -Wg -QI -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -Wg -Wg -ak -ak -ak -ak -ak -Wg -QN -QN -QN -zT -QN -QN -QN -Wg -ak -ak -ak -ak -ak -Wg -Wg -QI -QI -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -Wg -Wg -Wg -ak -bB -ak -Wg -eg -HP -tl -tl -tl -Sj -xU -Wg -ak -bB -ak -Wg -Wg -Wg -QI -QI -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -Wg -Wg -Wg -Wg -Wg -HR -eb -gz -Oj -JZ -KS -Ef -Wg -Wg -Wg -Wg -Wg -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Wg -Wg -Wg -Wg -Wg -Wg -Wg -Wg -Wg -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm deleted file mode 100644 index ab10111d92c8..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk1.dmm +++ /dev/null @@ -1,362 +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/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"f" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"g" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"h" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"i" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"j" = ( -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"k" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"l" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"m" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"n" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"o" = ( -/obj/structure/stone_tile/block, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"p" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"q" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"r" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"s" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"t" = ( -/obj/structure/stone_tile/surrounding/cracked{ - dir = 6 - }, -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"u" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/block/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"v" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"w" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"x" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"y" = ( -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -b -b -b -b -b -b -a -a -a -a -a -"} -(2,1,1) = {" -a -a -b -b -c -c -b -b -b -b -b -b -a -a -"} -(3,1,1) = {" -b -b -b -c -d -c -c -b -b -b -b -b -b -a -"} -(4,1,1) = {" -b -b -c -c -k -o -c -c -c -c -b -b -b -b -"} -(5,1,1) = {" -b -c -d -g -c -p -c -v -c -c -c -c -b -b -"} -(6,1,1) = {" -b -c -c -h -l -e -s -j -c -d -e -c -c -b -"} -(7,1,1) = {" -b -c -c -c -c -q -t -w -x -y -p -e -c -b -"} -(8,1,1) = {" -b -c -e -i -m -j -u -e -c -f -d -y -c -b -"} -(9,1,1) = {" -b -c -f -j -c -r -c -o -c -c -c -c -b -b -"} -(10,1,1) = {" -b -b -c -c -c -o -c -c -b -b -c -b -b -b -"} -(11,1,1) = {" -b -b -b -c -n -c -c -b -b -b -b -b -b -a -"} -(12,1,1) = {" -a -b -b -c -c -c -b -b -b -b -b -a -a -a -"} -(13,1,1) = {" -a -a -b -b -b -b -b -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm deleted file mode 100644 index c613a54b39bf..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk2.dmm +++ /dev/null @@ -1,364 +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/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"f" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"g" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"h" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"i" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"j" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"k" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"l" = ( -/obj/structure/stone_tile/surrounding_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"m" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"n" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"o" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"p" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"q" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"s" = ( -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"t" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"u" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"v" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"w" = ( -/obj/structure/stone_tile/block, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"x" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"y" = ( -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"z" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"A" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"M" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -b -b -b -b -a -b -b -a -a -a -a -a -a -"} -(2,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -a -a -a -a -"} -(3,1,1) = {" -b -b -c -h -k -f -f -f -k -f -b -b -a -a -a -"} -(4,1,1) = {" -b -b -d -c -l -f -f -f -v -f -b -b -b -a -a -"} -(5,1,1) = {" -b -b -e -i -m -k -f -u -w -f -f -b -b -b -a -"} -(6,1,1) = {" -a -b -f -f -f -o -M -q -w -f -f -f -f -b -b -"} -(7,1,1) = {" -b -b -b -f -f -p -s -t -f -f -q -n -A -f -b -"} -(8,1,1) = {" -b -b -g -f -c -q -t -q -k -x -f -z -d -f -b -"} -(9,1,1) = {" -a -b -f -j -n -j -f -e -n -y -f -n -y -b -b -"} -(10,1,1) = {" -a -b -b -f -f -f -f -f -f -b -b -f -f -b -b -"} -(11,1,1) = {" -a -a -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(12,1,1) = {" -a -a -a -b -b -b -b -b -b -a -a -b -b -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm deleted file mode 100644 index 95d99b3ec9d8..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_blooddrunk3.dmm +++ /dev/null @@ -1,365 +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/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"f" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"g" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"h" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"i" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"j" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"k" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"l" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"m" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"n" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"o" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"p" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"q" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"r" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"s" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"t" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"u" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"v" = ( -/obj/structure/stone_tile/surrounding/cracked{ - dir = 6 - }, -/obj/structure/stone_tile/center, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -b -b -b -b -b -a -a -a -"} -(2,1,1) = {" -a -b -b -b -a -a -b -b -b -c -c -b -b -b -a -a -"} -(3,1,1) = {" -b -b -b -b -b -b -b -b -c -g -m -c -c -b -b -a -"} -(4,1,1) = {" -b -c -c -b -b -b -c -c -g -k -h -q -c -c -b -b -"} -(5,1,1) = {" -b -c -c -c -c -c -c -g -i -c -c -h -s -c -c -b -"} -(6,1,1) = {" -b -d -e -e -d -f -d -f -e -d -n -f -t -v -c -b -"} -(7,1,1) = {" -b -c -c -c -c -c -c -h -j -c -c -o -u -c -b -b -"} -(8,1,1) = {" -b -b -b -c -c -c -c -c -h -l -o -r -c -b -b -b -"} -(9,1,1) = {" -a -b -b -b -b -c -c -c -c -h -p -c -c -b -b -a -"} -(10,1,1) = {" -a -a -a -b -b -b -b -b -c -c -c -c -b -b -a -a -"} -(11,1,1) = {" -a -a -a -a -a -b -b -b -b -b -b -b -b -b -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm deleted file mode 100644 index 3e64a36fdb49..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cube.dmm +++ /dev/null @@ -1,980 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/turf/closed/indestructible/riveted, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/machinery/wish_granter, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -b -a -b -b -b -b -b -b -a -a -a -a -a -a -a -b -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -b -a -b -b -c -b -b -b -b -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -b -a -a -a -a -b -a -a -a -a -a -a -a -b -a -b -b -b -a -a -b -b -a -a -b -b -a -a -a -"} -(4,1,1) = {" -a -a -a -a -b -b -b -a -a -a -a -a -a -a -b -b -b -a -a -b -b -b -b -b -b -b -b -a -b -b -"} -(5,1,1) = {" -a -a -b -b -b -b -b -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -a -a -b -"} -(6,1,1) = {" -b -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -b -"} -(7,1,1) = {" -b -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -c -b -b -c -b -b -b -c -b -b -b -b -a -"} -(8,1,1) = {" -a -a -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 -a -"} -(9,1,1) = {" -a -a -b -a -a -a -a -a -a -a -b -b -b -b -c -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(10,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -c -b -b -b -b -b -b -b -b -c -b -b -b -"} -(11,1,1) = {" -a -a -a -b -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -b -"} -(12,1,1) = {" -a -a -b -a -a -a -b -b -a -a -c -b -b -b -b -b -c -b -c -b -b -b -b -b -b -b -b -b -b -b -"} -(13,1,1) = {" -a -a -b -b -b -b -b -b -b -b -b -b -c -c -b -c -c -b -b -b -b -b -b -b -b -b -b -b -c -b -"} -(14,1,1) = {" -a -a -b -c -b -b -b -b -c -b -c -d -d -d -d -d -b -b -b -b -b -b -c -b -b -b -b -b -b -b -"} -(15,1,1) = {" -a -a -b -b -b -b -c -b -b -b -b -d -d -d -d -d -b -c -b -b -c -b -a -b -b -b -b -b -b -b -"} -(16,1,1) = {" -a -a -b -b -b -b -b -b -b -c -b -d -d -e -d -d -b -b -a -a -b -b -a -a -b -b -b -b -b -b -"} -(17,1,1) = {" -a -a -b -b -b -b -b -c -b -b -c -d -d -d -d -d -c -c -a -a -a -a -a -a -a -b -b -a -b -b -"} -(18,1,1) = {" -a -a -b -a -a -a -b -b -b -b -b -d -d -d -d -d -b -c -b -a -a -a -a -a -b -b -b -c -a -a -"} -(19,1,1) = {" -a -a -b -a -a -a -b -b -b -b -b -c -b -c -c -b -c -b -b -a -a -a -a -a -b -a -b -b -a -a -"} -(20,1,1) = {" -a -a -b -b -b -b -b -b -c -b -b -b -c -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -"} -(21,1,1) = {" -a -a -b -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -a -a -b -b -b -b -a -b -b -b -a -b -b -b -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -c -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -a -a -a -a -a -a -c -b -b -b -b -b -b -b -c -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(26,1,1) = {" -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -a -a -a -a -a -b -a -a -a -a -a -a -a -a -"} -(27,1,1) = {" -b -b -b -a -a -a -a -a -a -a -a -b -c -b -b -a -b -b -b -b -b -b -a -a -a -a -a -a -a -a -"} -(28,1,1) = {" -b -b -b -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -b -b -"} -(29,1,1) = {" -b -a -a -a -a -a -a -a -a -a -a -b -b -b -b -b -b -b -b -b -a -a -a -a -b -a -b -b -b -b -"} -(30,1,1) = {" -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm deleted file mode 100644 index 24698a1bcc86..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm +++ /dev/null @@ -1,347 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"c" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/cultaltar) -"d" = ( -/turf/closed/wall/mineral/cult, -/area/ruin/unpowered/cultaltar) -"e" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/cultaltar) -"f" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/cultaltar) -"g" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"i" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"k" = ( -/obj/effect/decal/remains/human, -/obj/item/melee/cultblade, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"l" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/shoes/cult, -/obj/item/clothing/suit/hooded/cultrobes, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"m" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"o" = ( -/obj/effect/rune/narsie{ - color = "#ff0000"; - used = 1 - }, -/obj/item/cult_shift, -/obj/effect/decal/remains/human, -/obj/item/melee/cultblade/dagger, -/obj/effect/step_trigger/sound_effect{ - happens_once = 1; - name = "\proper a grave mistake"; - sound = 'sound/hallucinations/i_see_you1.ogg'; - triggerer_only = 1 - }, -/obj/effect/step_trigger/message{ - message = "You've made a grave mistake, haven't you?"; - name = "ohfuck" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"q" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/shoes/cult, -/obj/item/clothing/suit/hooded/cultrobes, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine/cult{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered/cultaltar) -"s" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/cultaltar) - -(1,1,1) = {" -a -a -a -a -a -a -b -c -b -a -a -a -a -a -a -"} -(2,1,1) = {" -a -d -e -c -s -c -b -b -b -c -s -c -s -d -a -"} -(3,1,1) = {" -a -e -f -s -d -c -c -g -c -c -d -e -f -s -a -"} -(4,1,1) = {" -a -c -s -c -c -c -c -b -c -c -c -c -e -c -a -"} -(5,1,1) = {" -a -s -d -c -c -b -b -b -b -b -c -c -d -s -a -"} -(6,1,1) = {" -a -c -c -c -b -b -l -d -k -b -b -c -c -c -a -"} -(7,1,1) = {" -b -b -c -c -g -i -b -b -b -l -b -c -c -b -b -"} -(8,1,1) = {" -c -b -g -b -b -d -b -o -b -d -b -b -g -b -c -"} -(9,1,1) = {" -b -b -c -c -b -k -b -b -b -m -b -c -c -b -b -"} -(10,1,1) = {" -a -c -c -c -g -b -m -d -q -b -b -c -c -c -a -"} -(11,1,1) = {" -a -s -d -c -c -b -b -b -b -b -c -c -d -s -a -"} -(12,1,1) = {" -a -c -s -c -c -c -c -b -c -c -c -c -e -c -a -"} -(13,1,1) = {" -a -e -f -s -d -c -c -g -c -c -d -e -f -s -a -"} -(14,1,1) = {" -a -d -e -c -s -c -b -b -b -c -s -c -s -d -a -"} -(15,1,1) = {" -a -a -a -a -a -a -b -c -b -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm deleted file mode 100644 index dc1168b07cae..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_dead_ratvar.dmm +++ /dev/null @@ -1,962 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"c" = ( -/obj/structure/fluff/clockwork/alloy_shards/small, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"d" = ( -/obj/structure/girder/bronze, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"e" = ( -/obj/item/stack/sheet/bronze, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"f" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/unpowered/ratvar) -"g" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"h" = ( -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"i" = ( -/obj/structure/grille/broken, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"j" = ( -/turf/closed/wall/mineral/bronze, -/area/ruin/unpowered/ratvar) -"k" = ( -/obj/structure/fluff/clockwork/alloy_shards/small, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"l" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ratvar) -"m" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"n" = ( -/obj/structure/fluff/clockwork/blind_eye, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"o" = ( -/obj/structure/fluff/clockwork/alloy_shards/large, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"p" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"q" = ( -/obj/structure/lattice, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered/ratvar) -"r" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"s" = ( -/obj/structure/fluff/clockwork/alloy_shards/large, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"t" = ( -/obj/item/stack/sheet/bronze, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"u" = ( -/obj/structure/grille, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"v" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium, -/obj/structure/lattice, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"w" = ( -/obj/structure/grille/broken, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"x" = ( -/obj/structure/girder/bronze, -/obj/item/stack/sheet/bronze, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"y" = ( -/obj/structure/fluff/clockwork/fallen_armor, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"z" = ( -/obj/structure/girder/bronze, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"A" = ( -/obj/structure/fluff/clockwork/clockgolem_remains, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"B" = ( -/obj/item/nullrod/spear, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"C" = ( -/obj/structure/fluff/clockwork/alloy_shards/medium_gearbit, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"D" = ( -/obj/structure/grille, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"E" = ( -/obj/structure/fluff/clockwork/clockgolem_remains, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) -"F" = ( -/obj/structure/dead_ratvar, -/turf/open/floor/bronze/filled/lavaland, -/area/ruin/unpowered/ratvar) -"G" = ( -/obj/item/stack/sheet/bronze/thirty, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/ratvar) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -b -s -h -b -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -o -b -a -h -b -r -c -j -x -b -b -g -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -a -a -f -b -l -b -v -b -p -w -j -j -c -l -b -b -a -a -a -a -"} -(4,1,1) = {" -a -a -a -a -a -a -f -l -l -r -b -b -l -j -j -j -p -l -b -h -c -r -a -a -"} -(5,1,1) = {" -a -a -a -a -a -b -l -l -p -h -c -l -l -l -j -l -b -l -l -D -h -r -a -a -"} -(6,1,1) = {" -a -a -a -h -c -h -m -l -l -c -l -l -l -l -w -l -l -l -m -c -h -f -a -a -"} -(7,1,1) = {" -a -a -b -b -b -l -l -l -l -h -b -l -l -l -l -l -l -l -l -c -f -f -b -a -"} -(8,1,1) = {" -a -h -h -g -c -b -l -l -l -l -n -h -r -l -l -b -l -l -l -l -f -b -a -a -"} -(9,1,1) = {" -a -b -c -b -b -l -l -l -l -t -h -b -h -w -p -b -g -l -l -b -b -b -b -a -"} -(10,1,1) = {" -b -h -l -l -l -l -l -l -b -b -p -r -F -b -h -A -b -l -l -l -m -l -l -a -"} -(11,1,1) = {" -c -i -j -j -l -l -l -l -l -b -h -k -h -h -h -r -l -l -l -l -l -l -b -a -"} -(12,1,1) = {" -d -j -j -j -h -l -l -b -l -q -r -h -h -h -c -q -l -b -l -l -b -h -o -a -"} -(13,1,1) = {" -e -k -b -l -l -l -b -p -s -r -h -h -h -h -h -h -h -l -l -l -l -b -b -a -"} -(14,1,1) = {" -b -b -b -m -l -l -l -b -h -h -k -h -h -h -h -h -c -b -l -l -b -b -h -b -"} -(15,1,1) = {" -b -b -b -l -l -l -l -h -h -h -h -h -h -h -k -B -h -l -l -l -l -b -b -a -"} -(16,1,1) = {" -f -l -l -l -l -l -l -q -b -h -h -h -h -h -h -s -b -l -l -l -l -f -f -a -"} -(17,1,1) = {" -b -b -b -l -l -l -b -l -q -r -h -h -h -h -h -b -s -r -l -r -l -l -b -a -"} -(18,1,1) = {" -b -h -l -l -l -b -b -h -b -h -h -h -h -h -r -k -b -C -r -h -b -b -m -b -"} -(19,1,1) = {" -b -b -l -l -l -l -h -b -h -h -h -h -h -h -h -r -j -h -c -h -r -h -b -b -"} -(20,1,1) = {" -b -l -l -l -l -b -b -p -h -c -h -k -h -h -o -b -l -l -l -b -E -r -G -o -"} -(21,1,1) = {" -g -b -l -l -l -l -l -r -h -r -h -h -h -h -y -l -l -l -l -l -l -j -j -r -"} -(22,1,1) = {" -c -c -b -l -l -b -h -h -t -b -h -h -h -h -h -m -b -l -l -l -h -j -j -j -"} -(23,1,1) = {" -b -h -m -n -b -h -l -o -j -u -r -p -h -r -h -b -l -l -l -b -b -w -r -b -"} -(24,1,1) = {" -a -a -b -b -l -l -l -j -j -q -p -h -m -e -z -j -j -l -l -c -l -l -b -a -"} -(25,1,1) = {" -a -a -b -l -l -l -l -j -l -l -b -h -r -x -h -l -l -l -l -l -l -a -a -a -"} -(26,1,1) = {" -a -a -b -c -b -l -l -l -l -l -l -g -q -b -h -l -l -l -c -m -b -a -a -a -"} -(27,1,1) = {" -a -a -a -b -h -b -l -l -l -l -l -l -l -l -l -l -l -l -l -b -a -a -a -a -"} -(28,1,1) = {" -a -a -a -a -c -b -l -b -l -l -l -l -l -l -l -l -b -l -f -a -a -a -a -a -"} -(29,1,1) = {" -a -a -a -a -b -b -f -c -b -l -c -l -l -l -l -c -o -l -b -a -a -a -a -a -"} -(30,1,1) = {" -a -a -a -a -a -g -c -b -l -l -b -m -l -b -l -f -b -a -a -a -a -a -a -a -"} -(31,1,1) = {" -a -a -a -a -a -a -a -b -l -b -a -b -l -c -f -f -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 -c -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm deleted file mode 100644 index 6c9b84be7ec6..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ /dev/null @@ -1,1725 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface) -"ac" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/unpowered/elephant_graveyard) -"at" = ( -/turf/closed/mineral/strong/wasteland, -/area/lavaland/surface) -"aA" = ( -/turf/closed/wall, -/area/ruin/unpowered/elephant_graveyard) -"aH" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/powered/graveyard_shuttle) -"aN" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/ruin/powered/graveyard_shuttle) -"aO" = ( -/obj/effect/decal/cleanable/glass, -/obj/machinery/computer, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"aW" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/item/clothing/mask/gas/explorer/folded, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"aY" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall, -/area/ruin/unpowered/elephant_graveyard) -"bc" = ( -/obj/structure/sign/poster/ripped, -/turf/closed/wall, -/area/ruin/unpowered/elephant_graveyard) -"bf" = ( -/turf/closed/mineral/strong/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"bg" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/titanium, -/area/ruin/powered/graveyard_shuttle) -"bh" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/chair/office/light, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bi" = ( -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/circuit/off, -/area/ruin/powered/graveyard_shuttle) -"bp" = ( -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bq" = ( -/obj/machinery/iv_drip, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"br" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall/mineral/titanium, -/area/ruin/powered/graveyard_shuttle) -"bt" = ( -/obj/structure/table, -/turf/closed/mineral/strong/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"by" = ( -/obj/structure/closet/emcloset, -/obj/item/light/bulb, -/obj/effect/turf_decal/box/white, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"bA" = ( -/obj/machinery/suit_storage_unit/mining/eva, -/obj/effect/turf_decal/box/white, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"bE" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window{ - dir = 1 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"bJ" = ( -/obj/structure/sign/warning/xeno_mining, -/turf/closed/wall, -/area/ruin/unpowered/elephant_graveyard) -"bK" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/ruin/unpowered/elephant_graveyard) -"bN" = ( -/obj/structure/sign/warning/securearea, -/obj/structure/sign/warning/securearea, -/turf/closed/mineral/strong/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"bQ" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/decal/cleanable/cobweb, -/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bS" = ( -/obj/effect/decal/cleanable/oil/slippery, -/obj/machinery/rnd/destructive_analyzer, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bU" = ( -/obj/item/light/bulb/broken, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"bV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/unpowered/elephant_graveyard) -"bW" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/airlock/shuttle{ - name = "archaeology shuttle airlock" - }, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"bX" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/clothing/head/fedora/curator, -/obj/item/clothing/suit/curator, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"cm" = ( -/obj/structure/table/optable, -/obj/item/storage/backpack/explorer, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/obj/item/restraints/handcuffs/cable/zipties/used, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"cv" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/titanium/white, -/area/ruin/powered/graveyard_shuttle) -"cx" = ( -/obj/item/light/bulb/broken, -/obj/effect/turf_decal/caution/stand_clear/white, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/titanium/purple, -/area/ruin/powered/graveyard_shuttle) -"cZ" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"do" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"dr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"ei" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"eq" = ( -/obj/structure/stone_tile, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"eu" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"eG" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"gl" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/shreds, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"gu" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"gB" = ( -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"gY" = ( -/obj/structure/table, -/obj/machinery/power/floodlight, -/obj/structure/cable, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"iE" = ( -/obj/structure/barricade/wooden/crude, -/obj/item/paper/fluff/ruins/elephant_graveyard, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/elephant_graveyard) -"iR" = ( -/obj/structure/statue/bone/skull/half{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"jx" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/graveyard_shuttle) -"jK" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"km" = ( -/obj/structure/headpike/bone, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"kQ" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/black, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"lt" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/clipboard, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"lK" = ( -/obj/structure/cable, -/obj/item/reagent_containers/glass/bottle/frostoil{ - desc = "A small bottle. Contains cold sauce. There's a label on here: APPLY ON SEVERE BURNS."; - volume = 10 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"mH" = ( -/obj/structure/table, -/obj/effect/spawner/random/decoration/glowstick, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"mO" = ( -/obj/item/stack/medical/gauze/improvised, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"nl" = ( -/obj/structure/table, -/obj/item/pen, -/obj/item/pen, -/obj/item/pen, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"nt" = ( -/obj/structure/bed, -/obj/item/trash/pistachios, -/obj/item/trash/chips, -/obj/item/bedsheet/brown, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"nv" = ( -/obj/structure/reagent_dispensers/water_cooler, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"nA" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"nX" = ( -/obj/item/trash/can, -/obj/structure/bedsheetbin/empty, -/obj/structure/table, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"ov" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"oK" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"oL" = ( -/obj/structure/bonfire/prelit, -/obj/effect/decal/cleanable/ash, -/obj/item/organ/tail/lizard, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/stone_tile/slab/cracked, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"rb" = ( -/obj/item/chair, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"rg" = ( -/obj/structure/rack, -/obj/item/shovel, -/obj/structure/cable, -/obj/item/wrench, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"sc" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"sg" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/t_scanner/adv_mining_scanner/lesser, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"tf" = ( -/turf/open/misc/asteroid/basalt/wasteland{ - icon_state = "wasteland_dug" - }, -/area/ruin/unpowered/elephant_graveyard) -"uj" = ( -/obj/structure/bed, -/obj/item/flashlight/lantern, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"uy" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/closet/crate/grave/filled/lead_researcher, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"vc" = ( -/obj/structure/closet/crate/grave/filled, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"wk" = ( -/obj/structure/table, -/obj/item/tape/random, -/obj/item/tape/random, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"wp" = ( -/obj/item/knife/combat/bone, -/obj/item/organ/tongue, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"xr" = ( -/obj/effect/decal/cleanable/vomit, -/obj/item/shovel, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"yy" = ( -/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker, -/obj/structure/closet/crate/grave/filled, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"yG" = ( -/obj/effect/decal/cleanable/oil/streak, -/obj/effect/decal/cleanable/glass, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"zY" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"AB" = ( -/obj/structure/bed, -/obj/item/wirecutters, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"AG" = ( -/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny, -/obj/item/cigbutt, -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"AI" = ( -/obj/structure/stone_tile/center/cracked, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"AT" = ( -/obj/structure/cable, -/obj/item/food/deadmouse, -/obj/item/assembly/mousetrap, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Br" = ( -/obj/structure/cable, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Bu" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/elephant_graveyard) -"Cn" = ( -/obj/structure/flora/rock, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Cu" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) -"Di" = ( -/obj/item/organ/lungs, -/obj/item/organ/liver, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Dw" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"DB" = ( -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"DU" = ( -/obj/structure/closet/wardrobe/curator, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Eh" = ( -/obj/item/organ/brain, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"EF" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/under/misc/overalls, -/obj/item/clothing/mask/bandana/green, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"EI" = ( -/obj/effect/decal/remains/human, -/obj/item/restraints/handcuffs/cable/zipties/used, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"EW" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Hq" = ( -/obj/structure/barricade/wooden, -/obj/structure/mineral_door/wood, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Ix" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Iy" = ( -/obj/item/paper/fluff/ruins/elephant_graveyard, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface) -"Iz" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/paper_bin, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Jd" = ( -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"JT" = ( -/obj/structure/table, -/obj/item/taperecorder, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Kj" = ( -/obj/item/organ/heart, -/obj/item/organ/eyes, -/obj/item/organ/ears, -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Kq" = ( -/obj/structure/barricade/wooden/crude, -/obj/structure/barricade/wooden, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Ks" = ( -/obj/structure/barricade/sandbags, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"LR" = ( -/obj/item/paper/fluff/ruins/elephant_graveyard, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Mx" = ( -/obj/structure/flora/rock, -/obj/structure/cable, -/obj/item/pickaxe{ - layer = 2.5; - pixel_x = -8; - pixel_y = 5 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"MF" = ( -/obj/effect/decal/remains/human, -/obj/item/tank/internals/emergency_oxygen/empty, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"MI" = ( -/obj/structure/cable, -/obj/machinery/power/floodlight, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"NO" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/elephant_graveyard) -"Oa" = ( -/obj/effect/decal/cleanable/generic, -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Ou" = ( -/obj/structure/statue/bone/rib, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"OC" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"PM" = ( -/obj/structure/stone_tile/slab/cracked, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"PN" = ( -/obj/machinery/power/floodlight, -/obj/structure/cable, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Ql" = ( -/obj/structure/barricade/wooden, -/obj/item/paper/fluff/ruins/elephant_graveyard, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Td" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"UC" = ( -/obj/structure/table, -/obj/item/storage/medkit/o2, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"UE" = ( -/obj/structure/sink/oil_well, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"UK" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"UN" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/candle, -/obj/item/trash/can/food/beans, -/obj/item/trash/can, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Vv" = ( -/obj/item/cigbutt, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"WF" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"WI" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/item/paper/fluff/ruins/elephant_graveyard/final_message, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"WX" = ( -/obj/structure/statue/bone/skull/half, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"WZ" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Xe" = ( -/obj/structure/closet/crate/grave/filled, -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"XK" = ( -/obj/item/food/deadmouse, -/obj/item/assembly/mousetrap, -/turf/open/misc/asteroid/basalt/wasteland{ - icon_state = "wasteland_dug" - }, -/area/ruin/unpowered/elephant_graveyard) -"XY" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/reagent_containers/glass/bottle/plasma{ - volume = 25 - }, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"Yq" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/turf/open/misc/asteroid/basalt/wasteland, -/area/ruin/unpowered/elephant_graveyard) -"YM" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/graveyard_shuttle) -"ZH" = ( -/obj/structure/stone_tile/surrounding_tile, -/turf/open/misc/asteroid/basalt/wasteland{ - icon_state = "wasteland_dug" - }, -/area/ruin/unpowered/elephant_graveyard) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -at -ab -ab -ab -ac -ac -ac -ac -bf -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -bf -bf -bf -bf -bf -ac -ac -ac -ac -bf -bf -bf -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -bf -bf -UN -Oa -bf -bf -bf -ac -bf -bf -bf -bf -bf -bf -bf -ac -ac -ab -ab -aa -aa -aa -aa -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -bf -bf -bf -AG -Vv -eG -gB -bf -bf -bf -gu -sc -bJ -bf -bf -bf -ac -ac -ac -ab -ab -ab -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -ab -ab -bf -bf -bf -bf -aA -bc -aA -aY -gB -EF -gB -Xe -gB -gB -oK -WF -LR -gB -gB -ac -ac -ac -ac -ab -ab -ab -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -ab -bf -bf -bf -lK -Br -Br -Br -PN -gB -gB -tf -gB -gB -gB -gB -bK -bf -bf -bf -gB -ac -ac -ac -ac -ac -ac -ab -ab -aa -aa -"} -(8,1,1) = {" -aa -aa -ab -ab -ab -bf -bf -Br -Br -Cn -gB -gB -gB -Cn -Eh -gB -km -gB -km -gB -gB -gB -gB -bf -gB -ac -ac -ac -ac -ac -ac -ac -ab -ab -aa -"} -(9,1,1) = {" -aa -ab -ab -bf -bf -bf -Br -Br -tf -gB -sc -gB -gB -gB -km -gB -zY -gB -gB -gB -km -gB -tf -bf -gB -gB -ac -ac -ac -ac -ac -ac -ac -ac -aa -"} -(10,1,1) = {" -ab -ab -bf -bf -bf -Br -OC -gB -gB -gB -gB -Xe -gB -gB -gB -ov -Kj -wp -gB -gB -gB -gB -sc -bf -bf -gB -gB -ac -ac -ac -ac -MF -yy -ac -ac -"} -(11,1,1) = {" -at -bf -bf -bf -bf -Br -gB -gB -WX -gB -Dw -Dw -Dw -Dw -gB -gB -Di -oL -gB -eq -gB -gB -UE -vc -bf -bf -dr -ac -ac -ac -ac -ei -gB -gB -ac -"} -(12,1,1) = {" -at -bf -bf -bf -bf -Br -Xe -gB -gB -gB -gB -ZH -do -PM -gB -do -gB -nA -gB -gB -cZ -gB -gB -gB -bf -bf -Ks -ac -ac -ac -ac -ac -ac -Bu -ac -"} -(13,1,1) = {" -bf -uy -gB -bf -Xe -Br -gB -gB -gB -gB -AI -gB -tf -tf -Jd -gB -nA -gB -DB -Cn -gB -Xe -gB -gB -bf -bf -gB -ac -ac -ac -ac -ac -ac -gB -ac -"} -(14,1,1) = {" -bf -WI -gB -bf -gB -Br -sc -gB -iR -gB -Ou -Ou -Ou -Ou -gB -gB -tf -gB -gB -UE -gB -gB -sc -MI -bf -Xe -dr -gB -ac -ac -ac -ac -ac -gB -ac -"} -(15,1,1) = {" -bf -jK -xr -bf -XK -Br -gB -gB -gB -gB -gB -gB -gB -gB -gB -gB -gB -vc -gB -gB -gB -gB -gB -Br -bf -ac -gB -gB -dr -ac -ac -ac -ac -Bu -ac -"} -(16,1,1) = {" -bf -jK -bf -bf -bf -Br -Br -Br -gB -gB -sc -gB -Cn -gB -km -gB -gB -gB -gB -gB -km -gB -gB -Br -bf -ac -ac -gB -gB -dr -ac -ac -ac -dr -iE -"} -(17,1,1) = {" -bf -gB -zY -bf -bf -sc -bf -Br -Mx -sg -nl -mH -kQ -JT -gB -gB -km -gB -km -gB -gB -sc -Xe -Br -bf -bf -ac -ac -gB -Bu -ac -ac -ac -NO -Ql -"} -(18,1,1) = {" -at -bf -eu -bf -bf -zY -bf -gB -gB -Td -rb -gB -gB -wk -gB -gB -sc -gB -gB -gB -gB -gB -gB -Br -Yq -bf -ac -ac -ac -gB -dr -dr -NO -dr -iE -"} -(19,1,1) = {" -ab -bf -zY -Kq -zY -gB -bf -gB -bt -XY -EI -gB -gB -UC -gB -Br -Br -Br -Br -Br -Br -Br -Br -AT -bf -bf -ac -ac -ac -ac -NO -dr -bV -ac -ac -"} -(20,1,1) = {" -aa -at -bf -bf -bf -bf -bf -Hq -bf -gY -lt -Iz -Br -Br -Br -rg -bf -ac -DU -gB -UE -bf -bf -bf -bf -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(21,1,1) = {" -aa -aa -ab -ac -ac -bf -UK -sc -bf -bf -bf -bf -nv -EW -gB -bf -bf -bf -bf -bf -bf -bf -bf -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -"} -(22,1,1) = {" -aa -aa -ab -ab -ac -bf -UK -gB -WZ -nX -bf -bf -bf -bN -gB -bf -bf -bf -bf -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -Cu -Cu -"} -(23,1,1) = {" -aa -aa -aa -ab -ab -bf -Ix -WZ -sc -nt -bf -bf -bf -bf -yG -bf -bf -bf -bf -ab -ab -ab -ab -ab -ab -ab -ab -Cu -Cu -Cu -Iy -Cu -Cu -Cu -ab -"} -(24,1,1) = {" -aa -aa -aa -aa -ab -at -uj -mO -gl -AB -bf -aH -aH -bg -bW -bg -aH -aH -aH -Iy -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -ab -ab -ab -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -at -bf -bf -bf -bf -aH -aN -bQ -bh -cv -bU -by -aH -aH -jx -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -Cu -ab -ab -ab -ab -ab -ab -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -YM -aO -bX -bi -bp -bi -cx -bE -aH -jx -Cu -Cu -Cu -Cu -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aH -aN -aW -cm -bq -bS -bA -aH -aH -jx -Cu -Cu -Cu -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -aH -aH -aH -br -aH -aH -aH -aH -Cu -Cu -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm deleted file mode 100644 index 81cef3facd91..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elite_tumor.dmm +++ /dev/null @@ -1,111 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/structure/elite_tumor, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -a -c -c -c -a -a -a -"} -(5,1,1) = {" -a -a -a -c -b -c -a -a -a -"} -(6,1,1) = {" -a -a -a -c -c -c -a -a -a -"} -(7,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(8,1,1) = {" -a -a -a -a -a -a -a -a -a -"} -(9,1,1) = {" -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm deleted file mode 100644 index e7afbb5e3a1f..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_envy.dmm +++ /dev/null @@ -1,297 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/turf/closed/wall/rust, -/area/ruin/unpowered) -"e" = ( -/obj/structure/mirror/directional/west, -/obj/item/clothing/suit/hooded/bloated_human, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating, -/area/ruin/unpowered) -"f" = ( -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/ruin/unpowered) -"g" = ( -/obj/effect/decal/cleanable/blood/tracks, -/obj/structure/mirror/directional/west, -/turf/open/floor/plating, -/area/ruin/unpowered) -"h" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating, -/area/ruin/unpowered) -"i" = ( -/turf/open/floor/plating, -/area/ruin/unpowered) -"j" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating, -/area/ruin/unpowered) -"k" = ( -/obj/structure/mirror/directional/north{ - icon_state = "mirror_broke" - }, -/obj/item/knife/envy, -/turf/open/floor/plating, -/area/ruin/unpowered) -"l" = ( -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, -/turf/open/floor/plating, -/area/ruin/unpowered) -"m" = ( -/obj/structure/mirror/directional/west, -/turf/open/floor/plating, -/area/ruin/unpowered) -"n" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/unpowered) -"o" = ( -/obj/structure/mirror/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/unpowered) -"p" = ( -/obj/machinery/door/airlock/hatch, -/turf/open/floor/plating, -/area/ruin/unpowered) -"A" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(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 -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -a -"} -(3,1,1) = {" -b -c -c -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -c -a -"} -(4,1,1) = {" -c -c -d -d -d -e -g -g -g -m -m -m -m -m -o -m -j -d -c -a -"} -(5,1,1) = {" -c -d -d -d -d -d -h -h -i -i -i -i -i -h -i -i -i -d -A -a -"} -(6,1,1) = {" -c -d -d -d -d -d -d -k -i -i -i -i -i -i -i -i -i -p -A -a -"} -(7,1,1) = {" -c -d -d -d -d -d -i -i -i -j -i -n -i -i -i -i -i -d -c -a -"} -(8,1,1) = {" -c -c -d -d -d -f -j -l -l -l -l -l -l -l -l -l -j -d -c -a -"} -(9,1,1) = {" -b -c -c -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -c -a -"} -(10,1,1) = {" -b -b -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm deleted file mode 100644 index 853f7bcb3133..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm +++ /dev/null @@ -1,470 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"c" = ( -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"d" = ( -/obj/structure/flora/grass/jungle, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"e" = ( -/obj/structure/flora/rock/jungle, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"f" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"g" = ( -/obj/structure/flora/ausbushes/ywflowers, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"h" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"i" = ( -/obj/machinery/hydroponics/soil{ - self_sustaining = 1 - }, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"j" = ( -/mob/living/simple_animal/butterfly{ - atmos_requirements = list() - }, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"l" = ( -/obj/item/food/grown/mushroom/angel, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"m" = ( -/obj/item/food/grown/mushroom/libertycap, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"n" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"p" = ( -/mob/living/simple_animal/hostile/lightgeist{ - AIStatus = 1; - light_color = "#42ECFF" - }, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"q" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"r" = ( -/obj/structure/flora/grass/jungle/b, -/obj/structure/flora/ausbushes/sparsegrass, -/mob/living/simple_animal/butterfly{ - atmos_requirements = list() - }, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"s" = ( -/obj/item/food/grown/mushroom/amanita, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"t" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"v" = ( -/obj/structure/flora/tree/jungle, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"w" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/unpowered/gaia) -"A" = ( -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"B" = ( -/obj/structure/flora/grass/jungle, -/mob/living/simple_animal/hostile/lightgeist{ - AIStatus = 1; - light_color = "#42ECFF" - }, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"C" = ( -/obj/structure/flora/ausbushes/fernybush, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) -"D" = ( -/obj/item/food/grown/mushroom/chanterelle, -/turf/open/misc/grass/lavaland, -/area/ruin/unpowered/gaia) - -(1,1,1) = {" -a -a -a -a -a -w -w -w -w -w -w -w -a -a -a -a -"} -(2,1,1) = {" -a -a -a -a -w -w -c -b -c -b -c -w -w -a -a -a -"} -(3,1,1) = {" -a -a -a -w -w -c -g -d -f -c -d -c -w -a -a -a -"} -(4,1,1) = {" -a -a -w -w -c -d -c -i -d -C -n -c -w -w -w -a -"} -(5,1,1) = {" -a -a -w -c -c -c -c -p -j -s -b -h -c -b -w -a -"} -(6,1,1) = {" -a -w -w -g -d -c -c -c -v -d -c -c -h -w -w -a -"} -(7,1,1) = {" -w -w -b -c -m -r -c -c -A -n -C -b -g -c -w -w -"} -(8,1,1) = {" -w -b -c -d -c -n -c -b -B -c -d -m -d -h -c -w -"} -(9,1,1) = {" -w -c -d -c -f -d -c -d -h -c -f -j -c -b -f -w -"} -(10,1,1) = {" -w -c -c -h -b -c -c -q -t -b -d -c -A -b -c -w -"} -(11,1,1) = {" -w -d -e -i -n -d -c -t -c -c -n -c -c -q -c -w -"} -(12,1,1) = {" -w -c -b -c -p -g -s -c -b -j -h -d -n -c -b -w -"} -(13,1,1) = {" -w -b -c -d -q -d -b -c -c -n -c -c -b -D -C -w -"} -(14,1,1) = {" -w -w -f -c -n -c -c -b -c -b -c -h -i -C -d -w -"} -(15,1,1) = {" -a -w -w -l -j -c -n -c -c -g -c -j -c -c -w -w -"} -(16,1,1) = {" -a -a -w -c -b -c -c -g -c -c -c -n -c -w -w -a -"} -(17,1,1) = {" -a -a -w -d -g -c -p -h -t -h -e -c -h -w -a -a -"} -(18,1,1) = {" -a -a -w -w -c -b -n -c -c -j -g -c -c -w -a -a -"} -(19,1,1) = {" -a -a -a -w -w -c -h -c -n -c -c -w -w -w -a -a -"} -(20,1,1) = {" -a -a -a -a -w -w -w -w -w -w -w -w -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm deleted file mode 100644 index 5111ae46435b..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_gluttony.dmm +++ /dev/null @@ -1,796 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aE" = ( -/obj/structure/stone_tile/center/burnt, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding/cracked, -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"aO" = ( -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 4 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"bv" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"bD" = ( -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"dI" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/slab/cracked{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/food/meat/slab/human/mutant/lizard, -/obj/item/food/meat/slab/human/mutant/lizard, -/obj/item/food/meat/slab/human/mutant/lizard, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"eb" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/food/meat/slab/corgi{ - pixel_x = 3; - pixel_y = 1 - }, -/obj/item/food/meat/slab/corgi{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/knife/combat/bone, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"eq" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/structure/stone_tile/block, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"eN" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"fa" = ( -/obj/structure/table/wood, -/obj/item/food/meat/slab/human, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"fY" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/burnt, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"hV" = ( -/obj/structure/stone_tile/center/burnt, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"ie" = ( -/obj/item/veilrender/vealrender, -/obj/structure/stone_tile/slab/cracked{ - dir = 6 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"iw" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"jK" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"jM" = ( -/turf/closed/indestructible/necropolis, -/area/ruin/powered/gluttony) -"kr" = ( -/obj/effect/gluttony, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"kB" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"ll" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/spear/bonespear, -/obj/item/slime_extract/silver, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"ls" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"ly" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 4 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"nM" = ( -/obj/structure/stone_tile/center/burnt, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"nT" = ( -/turf/closed/indestructible/riveted/boss, -/area/ruin/powered/gluttony) -"pj" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"pD" = ( -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/powered/gluttony) -"qs" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/powered/gluttony) -"qC" = ( -/obj/structure/stone_tile/surrounding/cracked{ - dir = 8 - }, -/obj/structure/bonfire/prelit, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"rg" = ( -/obj/structure/stone_tile/block/burnt, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"vU" = ( -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"wD" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"wI" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding/cracked, -/obj/structure/stone_tile/center/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/powered/gluttony) -"xA" = ( -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 5 - }, -/obj/structure/headpike/bone, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/powered/gluttony) -"yx" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/food/meat/slab/goliath, -/obj/item/food/meat/slab/human/mutant/ethereal, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"zd" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"zr" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 8 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Av" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 5 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Ci" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Ck" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/powered/gluttony) -"CM" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/gibs/torso, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"CU" = ( -/obj/effect/gluttony, -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"DB" = ( -/obj/structure/stone_tile/slab/burnt, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"DH" = ( -/obj/structure/headpike/bone, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"DY" = ( -/obj/structure/stone_tile/center/burnt, -/obj/structure/stone_tile/surrounding/cracked{ - dir = 6 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"Eq" = ( -/obj/structure/stone_tile/surrounding_tile/burnt, -/obj/structure/stone_tile/center/burnt, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"ED" = ( -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"EN" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/burnt, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"Fi" = ( -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Ie" = ( -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 1 - }, -/obj/structure/stone_tile/slab/cracked{ - dir = 1 - }, -/obj/effect/mob_spawn/corpse/human/miner, -/obj/item/clothing/gloves/butchering, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"IM" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"IW" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/effect/gluttony, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"LT" = ( -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"MH" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"NT" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ol" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"OA" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Pd" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Qr" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/mob_spawn/corpse/human/charredskeleton, -/obj/structure/bonfire/dense, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Rf" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Rj" = ( -/obj/structure/stone_tile/block, -/obj/effect/gluttony, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Sr" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"UG" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"UH" = ( -/obj/structure/stone_tile/slab/burnt, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Vc" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Vz" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/burnt, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Wy" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/food/meat/slab/human/mutant/moth, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"WR" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"XY" = ( -/obj/effect/decal/cleanable/blood/footprints, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"YG" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 10 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Zd" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/structure/stone_tile/block, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"Zu" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Zx" = ( -/obj/structure/stone_tile/surrounding/cracked, -/obj/structure/bonfire/prelit, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) -"ZT" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/bonfire/prelit, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/powered/gluttony) -"ZV" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/ruin/powered/gluttony) - -(1,1,1) = {" -Zu -WR -WR -WR -WR -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -"} -(2,1,1) = {" -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -nT -jM -jM -jM -Zu -Zu -"} -(3,1,1) = {" -Zu -Zu -jM -jM -jM -nT -jM -jM -jM -kr -ie -nT -Zu -Zu -"} -(4,1,1) = {" -Zu -Zu -jM -ZT -UG -Vc -qs -UH -pj -CU -kr -nT -MH -Zu -"} -(5,1,1) = {" -Zu -Zu -nT -CM -Zd -XY -LT -bD -kB -IM -CU -jM -MH -MH -"} -(6,1,1) = {" -Zu -MH -nT -Rj -Ol -Wy -eb -nT -zr -Av -YG -jM -MH -MH -"} -(7,1,1) = {" -Zu -MH -nT -ZV -eq -nT -nT -nT -wI -rg -Ie -jM -MH -Zu -"} -(8,1,1) = {" -Zu -MH -MH -ly -Vz -Ck -xA -ED -nT -nT -nT -nT -Zu -Zu -"} -(9,1,1) = {" -Zu -MH -nT -ll -iw -ls -ls -eN -vU -MH -MH -MH -DH -Zu -"} -(10,1,1) = {" -Zu -Zu -jM -dI -OA -Fi -nT -OA -Pd -EN -NT -NT -jK -Zu -"} -(11,1,1) = {" -Zu -Zu -nT -yx -Rf -Vc -nT -UH -Pd -DB -aE -DY -hV -Zu -"} -(12,1,1) = {" -Zu -Zu -nT -IW -UH -pD -Ck -Eq -Sr -fY -zd -zd -nM -Zu -"} -(13,1,1) = {" -Zu -Zu -nT -Qr -bv -Ci -wD -aO -fa -MH -MH -MH -DH -Zu -"} -(14,1,1) = {" -Zu -Zu -jM -nT -MH -MH -Zx -qC -MH -MH -MH -MH -Zu -Zu -"} -(15,1,1) = {" -Zu -Zu -Zu -Zu -Zu -MH -MH -MH -MH -MH -MH -Zu -Zu -WR -"} -(16,1,1) = {" -WR -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -Zu -WR -WR -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm deleted file mode 100644 index f21ffaedf9b2..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_greed.dmm +++ /dev/null @@ -1,552 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/structure/table/wood/poker, -/obj/item/gun/ballistic/revolver/russian/soul, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"f" = ( -/obj/structure/cursed_slot_machine, -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"g" = ( -/obj/structure/table/wood/poker, -/obj/item/coin/mythril, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"h" = ( -/obj/structure/table/wood/poker, -/obj/item/coin/diamond, -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"i" = ( -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"j" = ( -/obj/structure/table/wood/poker, -/obj/item/coin/adamantine, -/turf/open/floor/carpet, -/area/ruin/powered/greed) -"k" = ( -/obj/machinery/computer/arcade/battle{ - set_obj_flags = "EMAGGED" - }, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"l" = ( -/obj/item/coin/gold, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"m" = ( -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"n" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c1000, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"o" = ( -/obj/item/storage/bag/money, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"p" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/ore/gold, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"q" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c20, -/obj/item/stack/spacecash/c50, -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"r" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c1000, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"s" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c200, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"u" = ( -/obj/structure/table/wood/poker, -/obj/item/stack/spacecash/c500, -/obj/item/stack/spacecash/c100, -/obj/item/stack/spacecash/c1000, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"v" = ( -/obj/item/coin/gold, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"w" = ( -/obj/item/storage/bag/money, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"J" = ( -/obj/machinery/door/airlock/gold, -/obj/structure/fans/tiny/invisible, -/turf/open/floor/engine/cult, -/area/ruin/powered/greed) -"W" = ( -/turf/closed/wall/mineral/cult, -/area/ruin/powered/greed) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -b -b -a -a -a -a -a -a -a -a -b -"} -(2,1,1) = {" -a -b -b -a -a -a -a -a -a -b -b -b -a -a -a -a -a -b -b -b -"} -(3,1,1) = {" -a -b -b -b -b -b -a -a -a -b -a -a -a -a -a -a -b -b -b -b -"} -(4,1,1) = {" -a -a -b -b -b -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -"} -(5,1,1) = {" -a -a -a -b -b -a -a -c -c -c -c -c -c -c -a -a -a -a -b -a -"} -(6,1,1) = {" -b -a -a -a -a -a -c -c -W -W -W -W -W -c -a -a -a -a -b -a -"} -(7,1,1) = {" -b -a -a -a -c -c -c -W -W -n -q -s -W -c -c -c -c -a -a -a -"} -(8,1,1) = {" -a -a -a -a -c -W -W -W -k -o -l -m -W -W -W -W -c -a -a -a -"} -(9,1,1) = {" -a -a -b -a -c -W -e -h -l -m -m -m -l -m -v -W -W -a -a -a -"} -(10,1,1) = {" -b -b -b -a -c -W -f -i -m -l -m -o -m -m -m -m -J -a -a -a -"} -(11,1,1) = {" -a -a -b -a -c -W -g -j -l -m -m -l -m -l -w -W -W -a -a -a -"} -(12,1,1) = {" -a -a -a -a -c -W -W -W -k -o -m -l -W -W -W -W -c -a -a -a -"} -(13,1,1) = {" -a -a -a -a -c -c -c -W -W -p -u -r -W -c -c -c -c -a -a -a -"} -(14,1,1) = {" -b -b -a -a -a -a -c -c -W -W -W -W -W -c -a -a -a -a -a -a -"} -(15,1,1) = {" -b -b -a -a -a -a -a -c -c -c -c -c -c -c -a -a -a -a -a -a -"} -(16,1,1) = {" -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -"} -(17,1,1) = {" -a -a -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -b -b -"} -(18,1,1) = {" -a -a -a -b -b -b -b -b -b -b -b -b -b -a -a -b -b -b -b -b -"} -(19,1,1) = {" -a -a -a -b -b -b -b -a -a -a -b -b -b -b -a -b -b -b -b -b -"} -(20,1,1) = {" -a -a -a -a -b -b -a -a -a -a -a -a -b -b -b -b -b -b -b -b -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm deleted file mode 100644 index c97be0bfd363..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm +++ /dev/null @@ -1,476 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/powered) -"c" = ( -/turf/closed/wall/mineral/iron, -/area/ruin/powered) -"e" = ( -/obj/item/clothing/suit/space/orange, -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"f" = ( -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"g" = ( -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"h" = ( -/obj/item/shovel, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"i" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"j" = ( -/obj/structure/water_source/puddle, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"k" = ( -/obj/structure/glowshroom/single, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"l" = ( -/obj/item/storage/toolbox/emergency, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) -"m" = ( -/obj/structure/rack, -/obj/item/seeds/reishi, -/obj/item/seeds/plump, -/obj/item/seeds/plump, -/obj/item/food/grown/mushroom/glowshroom, -/obj/item/seeds/tower, -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"n" = ( -/obj/machinery/hydroponics/soil, -/turf/open/floor/plating, -/area/ruin/powered) -"o" = ( -/turf/open/floor/plating, -/area/ruin/powered) -"p" = ( -/obj/structure/rack, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/storage/bag/ore, -/obj/item/storage/medkit/regular, -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"q" = ( -/obj/structure/glowshroom/single, -/turf/open/floor/plating, -/area/ruin/powered) -"r" = ( -/obj/structure/rack, -/obj/item/pickaxe/emergency, -/obj/item/tank/internals/oxygen, -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"s" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"t" = ( -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"u" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/black, -/turf/open/floor/plating, -/area/ruin/powered) -"v" = ( -/obj/structure/fans, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"w" = ( -/obj/machinery/smartfridge/survival_pod/preloaded, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"x" = ( -/obj/effect/mob_spawn/ghost_role/human/hermit, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"y" = ( -/turf/open/floor/pod/dark, -/area/ruin/powered) -"z" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/tubes, -/turf/open/floor/plating, -/area/ruin/powered) -"A" = ( -/obj/structure/table, -/obj/item/knife/combat/survival, -/turf/open/floor/plating, -/area/ruin/powered) -"B" = ( -/obj/structure/table/survival_pod, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"C" = ( -/obj/structure/tubes, -/obj/item/crowbar, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"D" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/machinery/door/airlock/survival_pod/glass, -/obj/structure/fans/tiny, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"E" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 8 - }, -/turf/closed/wall/mineral/titanium/interior, -/area/ruin/powered) -"F" = ( -/turf/closed/wall/mineral/titanium, -/area/ruin/powered) -"G" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/ruin/powered) -"H" = ( -/obj/machinery/door/airlock/titanium{ - name = "Escape Pod Airlock" - }, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered) -"I" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered) -"J" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/powered) -"L" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/turf/open/floor/plating, -/area/ruin/powered) -"M" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/misc/asteroid/basalt, -/area/ruin/powered) -"P" = ( -/turf/template_noop, -/area/template_noop) -"S" = ( -/obj/item/clothing/head/helmet/space/orange, -/turf/open/misc/asteroid{ - name = "dirt" - }, -/area/ruin/powered) - -(1,1,1) = {" -P -P -P -P -P -P -P -P -P -P -P -P -P -P -P -P -"} -(2,1,1) = {" -P -P -P -P -P -P -P -P -P -P -P -s -s -s -P -P -"} -(3,1,1) = {" -P -P -P -P -P -a -a -a -a -a -s -s -s -s -s -P -"} -(4,1,1) = {" -P -P -P -a -a -a -a -a -a -a -a -s -s -s -s -P -"} -(5,1,1) = {" -P -P -a -a -a -b -c -b -t -t -t -t -t -s -s -s -"} -(6,1,1) = {" -P -a -a -a -b -b -L -n -t -v -x -B -t -s -s -s -"} -(7,1,1) = {" -a -a -a -a -b -m -o -o -t -w -y -y -D -s -s -s -"} -(8,1,1) = {" -a -b -b -b -c -f -o -q -o -o -z -C -t -s -s -s -"} -(9,1,1) = {" -a -b -f -i -g -f -f -o -o -o -t -t -t -s -s -s -"} -(10,1,1) = {" -a -b -S -j -g -g -f -f -u -o -A -b -P -s -s -s -"} -(11,1,1) = {" -a -c -e -h -l -c -p -r -c -c -c -b -P -P -s -s -"} -(12,1,1) = {" -a -b -b -k -M -b -b -b -b -a -a -P -P -E -H -E -"} -(13,1,1) = {" -a -a -b -b -b -b -a -a -a -a -P -P -P -F -I -F -"} -(14,1,1) = {" -a -a -a -a -a -a -a -a -a -P -P -P -P -F -I -F -"} -(15,1,1) = {" -P -P -a -a -P -P -P -P -P -P -P -P -P -G -J -G -"} -(16,1,1) = {" -P -P -P -P -P -P -P -P -P -P -P -P -P -P -P -P -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm deleted file mode 100644 index cad120c3f251..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm +++ /dev/null @@ -1,604 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/riveted/hierophant, -/area/ruin/unpowered/hierophant) -"b" = ( -/turf/open/indestructible/hierophant, -/area/ruin/unpowered/hierophant) -"c" = ( -/obj/effect/light_emitter{ - set_cap = 3; - set_luminosity = 5 - }, -/turf/open/indestructible/hierophant, -/area/ruin/unpowered/hierophant) -"d" = ( -/mob/living/simple_animal/hostile/megafauna/hierophant, -/turf/open/indestructible/hierophant/two, -/area/ruin/unpowered/hierophant) -"e" = ( -/turf/open/indestructible/hierophant/two, -/area/ruin/unpowered/hierophant) -"f" = ( -/obj/effect/light_emitter{ - set_cap = 3; - set_luminosity = 5 - }, -/turf/open/indestructible/hierophant/two, -/area/ruin/unpowered/hierophant) - -(1,1,1) = {" -a -a -a -b -b -b -b -a -a -a -a -a -a -a -a -a -b -b -b -b -a -a -a -"} -(2,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -b -b -b -b -b -a -"} -(3,1,1) = {" -a -b -b -b -c -c -b -b -b -a -b -b -b -a -b -b -b -c -c -b -b -b -a -"} -(4,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(5,1,1) = {" -b -b -c -b -a -a -b -c -b -b -b -c -b -b -b -c -b -a -a -b -c -b -b -"} -(6,1,1) = {" -b -b -c -b -a -a -b -c -b -b -b -c -b -b -b -c -b -a -a -b -c -b -b -"} -(7,1,1) = {" -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -b -b -b -b -b -b -"} -(8,1,1) = {" -a -b -b -b -c -c -e -e -e -a -e -e -e -a -e -e -e -c -c -b -b -b -a -"} -(9,1,1) = {" -a -b -b -b -b -b -e -e -e -e -e -f -e -e -e -e -e -b -b -b -b -b -a -"} -(10,1,1) = {" -a -b -a -b -b -b -e -a -e -e -e -e -e -e -e -a -e -b -b -b -a -b -a -"} -(11,1,1) = {" -a -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -b -b -b -b -b -a -"} -(12,1,1) = {" -a -c -b -b -c -c -e -e -f -e -e -d -e -e -f -e -e -c -c -b -b -c -a -"} -(13,1,1) = {" -a -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -b -b -b -b -b -a -"} -(14,1,1) = {" -a -b -a -b -b -b -e -a -e -e -e -e -e -e -e -a -e -b -b -b -a -b -a -"} -(15,1,1) = {" -a -b -b -b -b -b -e -e -e -e -e -f -e -e -e -e -e -b -b -b -b -b -a -"} -(16,1,1) = {" -a -b -b -b -c -c -e -e -e -a -e -e -e -a -e -e -e -c -c -b -b -b -a -"} -(17,1,1) = {" -b -b -b -b -b -b -e -e -e -e -e -e -e -e -e -e -e -b -b -b -b -b -b -"} -(18,1,1) = {" -b -b -c -b -a -a -b -c -b -b -b -c -b -b -b -c -b -a -a -b -c -b -b -"} -(19,1,1) = {" -b -b -c -b -a -a -b -c -b -b -b -c -b -b -b -c -b -a -a -b -c -b -b -"} -(20,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(21,1,1) = {" -a -b -b -b -c -c -b -b -b -a -b -b -b -a -b -b -b -c -c -b -b -b -a -"} -(22,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -c -b -b -b -b -b -b -b -b -b -b -a -"} -(23,1,1) = {" -a -a -a -b -b -b -b -a -a -a -a -a -a -a -a -a -b -b -b -b -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm deleted file mode 100644 index b2210954e53b..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pizzaparty.dmm +++ /dev/null @@ -1,647 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/obj/structure/lattice, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/turf/closed/wall, -/area/ruin/unpowered) -"e" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"f" = ( -/obj/structure/table/wood, -/obj/item/storage/box/cups, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"g" = ( -/obj/structure/reagent_dispensers/water_cooler{ - name = "punch cooler"; - reagent_id = /datum/reagent/consumable/ethanol/bacchus_blessing - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"h" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"i" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"j" = ( -/obj/item/food/pizzaslice/mushroom, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"k" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"l" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/wood, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"m" = ( -/obj/item/chair/wood/wings, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"n" = ( -/obj/structure/glowshroom/single, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"o" = ( -/obj/item/plate, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"p" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"q" = ( -/obj/item/chair/wood/wings, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"r" = ( -/obj/structure/chair/wood/wings, -/obj/effect/decal/remains/human, -/obj/item/clothing/head/festive{ - desc = "A festive party hat with the name 'timmy' scribbled on the front."; - name = "party hat" - }, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"s" = ( -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"t" = ( -/obj/structure/chair/wood/wings, -/obj/effect/decal/remains/human, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"u" = ( -/obj/structure/glowshroom/single, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"v" = ( -/obj/structure/lattice, -/obj/item/chair/wood/wings, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"w" = ( -/obj/item/kitchen/fork, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"x" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/food_or_drink/pizzaparty, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"y" = ( -/obj/structure/table/wood, -/obj/item/plate, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"z" = ( -/obj/structure/table/wood, -/obj/structure/glowshroom/single, -/obj/item/a_gift, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"A" = ( -/obj/structure/table/wood, -/obj/item/plate, -/obj/item/kitchen/fork, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"C" = ( -/obj/structure/chair/wood/wings{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"D" = ( -/obj/structure/table/wood, -/obj/item/food/pizzaslice/margherita, -/obj/item/plate, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"E" = ( -/obj/structure/table/wood, -/obj/item/food/pizzaslice/meat, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"F" = ( -/obj/structure/table/wood, -/obj/item/food/cake/birthday, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"G" = ( -/obj/structure/table/wood, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"H" = ( -/obj/item/chair/wood/wings, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"I" = ( -/obj/item/kitchen/fork, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"J" = ( -/obj/structure/glowshroom/single, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"K" = ( -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"L" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"M" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/a_gift, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"N" = ( -/obj/structure/lattice, -/obj/effect/decal/cleanable/dirt, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"O" = ( -/obj/item/knife/kitchen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"P" = ( -/obj/machinery/light/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"Q" = ( -/turf/open/floor/plating{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) - -(1,1,1) = {" -a -a -b -b -a -a -b -b -b -b -b -b -b -b -a -a -a -a -"} -(2,1,1) = {" -b -b -b -b -b -b -b -b -b -b -c -c -b -b -b -b -a -a -"} -(3,1,1) = {" -b -b -b -b -b -b -b -b -c -c -e -e -c -c -b -b -b -a -"} -(4,1,1) = {" -b -b -b -b -d -b -c -c -e -h -h -e -Q -e -d -b -b -a -"} -(5,1,1) = {" -a -b -b -b -d -b -m -e -w -h -w -h -h -e -d -b -b -b -"} -(6,1,1) = {" -a -b -b -b -d -f -n -h -h -c -e -M -e -c -b -b -b -b -"} -(7,1,1) = {" -b -b -b -b -d -g -o -h -h -C -J -h -d -b -b -b -b -b -"} -(8,1,1) = {" -b -b -b -b -e -h -p -q -x -D -K -M -d -b -b -b -b -b -"} -(9,1,1) = {" -b -b -b -c -e -i -h -r -y -E -h -h -c -b -b -b -b -b -"} -(10,1,1) = {" -b -b -b -c -e -j -h -s -z -F -q -N -c -b -b -b -b -b -"} -(11,1,1) = {" -b -b -b -b -e -e -h -t -A -G -q -h -c -b -b -b -b -b -"} -(12,1,1) = {" -b -b -b -b -d -k -h -s -s -H -h -O -d -b -b -b -b -b -"} -(13,1,1) = {" -b -b -b -b -d -k -h -u -s -s -o -n -d -b -b -b -b -a -"} -(14,1,1) = {" -b -b -b -b -d -l -i -h -e -I -L -P -d -b -b -b -b -a -"} -(15,1,1) = {" -b -b -b -b -d -d -e -e -N -e -e -d -d -b -b -b -b -a -"} -(16,1,1) = {" -a -b -b -b -b -b -c -v -b -c -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 -a -a -a -"} -(18,1,1) = {" -a -a -a -a -b -b -b -b -b -b -b -b -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm deleted file mode 100644 index 96af834c1a7f..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_pride.dmm +++ /dev/null @@ -1,292 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"g" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"i" = ( -/obj/structure/mirror/directional/east, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"j" = ( -/obj/structure/mirror/magic/pride, -/turf/closed/wall/mineral/silver, -/area/ruin/powered/pride) -"k" = ( -/obj/item/clothing/under/chameleon{ - armor = null - }, -/obj/structure/table/wood/fancy/royalblue, -/turf/open/floor/mineral/silver, -/area/ruin/powered/pride) -"l" = ( -/obj/item/dyespray, -/obj/structure/table/wood/fancy/royalblue, -/obj/item/coin/silver, -/turf/open/floor/mineral/silver, -/area/ruin/powered/pride) -"q" = ( -/obj/structure/mirror/directional/east, -/obj/structure/stone_tile/surrounding_tile, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"r" = ( -/turf/open/floor/mineral/silver, -/area/ruin/powered/pride) -"t" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"u" = ( -/obj/structure/stone_tile/block/burnt{ - dir = 4 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"x" = ( -/obj/structure/stone_tile/burnt{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"y" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"z" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding/burnt, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"B" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"G" = ( -/turf/closed/wall/mineral/cult, -/area/ruin/powered/pride) -"J" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"K" = ( -/obj/structure/mirror/directional/east, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/burnt, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"N" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding/burnt, -/obj/machinery/door/airlock/cult/unruned, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"O" = ( -/obj/structure/mirror/directional/west, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"R" = ( -/obj/structure/mirror/directional/west, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/burnt{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"S" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"U" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"X" = ( -/obj/structure/mirror/directional/west, -/turf/open/lava/smooth, -/area/ruin/powered/pride) -"Y" = ( -/turf/closed/indestructible/riveted/boss, -/area/ruin/powered/pride) -"Z" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/lava/smooth, -/area/ruin/powered/pride) - -(1,1,1) = {" -a -a -c -a -a -a -a -a -c -c -a -a -"} -(2,1,1) = {" -a -c -c -G -Y -Y -Y -G -G -G -c -a -"} -(3,1,1) = {" -c -c -Y -Y -R -O -X -X -X -G -x -a -"} -(4,1,1) = {" -c -c -G -l -r -B -g -U -U -Y -Y -a -"} -(5,1,1) = {" -c -c -G -j -r -S -y -z -y -z -N -a -"} -(6,1,1) = {" -c -c -G -k -r -t -u -Z -u -Y -Y -a -"} -(7,1,1) = {" -c -c -Y -Y -K -q -i -i -i -Y -J -a -"} -(8,1,1) = {" -a -c -c -G -G -G -Y -Y -G -G -c -a -"} -(9,1,1) = {" -a -a -c -c -a -a -a -a -a -c -c -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm deleted file mode 100644 index b9ccb545ca02..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_puzzle.dmm +++ /dev/null @@ -1,47 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/effect/sliding_puzzle/lavaland, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -a -a -"} -(2,1,1) = {" -a -c -c -c -a -"} -(3,1,1) = {" -a -c -b -c -a -"} -(4,1,1) = {" -a -c -c -c -a -"} -(5,1,1) = {" -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm deleted file mode 100644 index c4923a38c4c6..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_random_ripley.dmm +++ /dev/null @@ -1,56 +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/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"d" = ( -/obj/vehicle/sealed/mecha/working/ripley/mining, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/item/clothing/shoes/workboots/mining, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -b -b -b -a -"} -(2,1,1) = {" -b -c -b -c -b -"} -(3,1,1) = {" -b -c -d -e -b -"} -(4,1,1) = {" -b -c -c -b -b -"} -(5,1,1) = {" -b -b -b -b -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm deleted file mode 100644 index 3cbf287f2f3c..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_seed_vault.dmm +++ /dev/null @@ -1,1134 +0,0 @@ -//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/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ac" = ( -/turf/closed/wall/r_wall, -/area/ruin/powered/seedvault) -"ad" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ae" = ( -/obj/machinery/smartfridge, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"af" = ( -/obj/machinery/vending/hydroseeds, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ag" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ah" = ( -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"ai" = ( -/obj/item/reagent_containers/glass/beaker/bluespace, -/obj/item/reagent_containers/glass/beaker/bluespace, -/obj/item/reagent_containers/glass/beaker/bluespace, -/obj/item/reagent_containers/glass/beaker/bluespace, -/obj/structure/table/wood, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aj" = ( -/obj/structure/table/wood, -/obj/item/gun/energy/floragun{ - pixel_y = 6 - }, -/obj/item/gun/energy/floragun{ - pixel_y = 4 - }, -/obj/item/gun/energy/floragun{ - pixel_y = 2 - }, -/obj/item/gun/energy/floragun, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ak" = ( -/obj/effect/mob_spawn/ghost_role/human/seed_vault, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"al" = ( -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"am" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"an" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ao" = ( -/obj/structure/loom, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ap" = ( -/obj/machinery/light/directional/north, -/obj/effect/mob_spawn/ghost_role/human/seed_vault, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"aq" = ( -/obj/machinery/light/directional/north, -/obj/effect/mob_spawn/ghost_role/human/seed_vault, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"ar" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/clothing/under/rank/civilian/hydroponics, -/obj/item/clothing/under/rank/civilian/hydroponics, -/obj/item/clothing/under/rank/civilian/hydroponics, -/obj/item/clothing/under/rank/civilian/hydroponics, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"as" = ( -/obj/machinery/door/airlock/glass_large, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"at" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/cultivator, -/obj/item/cultivator, -/obj/item/cultivator, -/obj/item/cultivator, -/obj/item/shovel/spade, -/obj/item/shovel/spade, -/obj/item/shovel/spade, -/obj/item/shovel/spade, -/obj/item/hatchet, -/obj/item/hatchet, -/obj/item/hatchet, -/obj/item/hatchet, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"au" = ( -/obj/machinery/door/airlock/titanium, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"av" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aw" = ( -/obj/machinery/reagentgrinder{ - pixel_y = 5 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/green/filled/end, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ax" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/trimline/green/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/green/filled/corner, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ay" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/trimline/green/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"az" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/soap/homemade, -/obj/item/soap/homemade, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aA" = ( -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aB" = ( -/obj/effect/spawner/random/food_or_drink/seed_vault, -/obj/structure/closet/crate/hydroponics, -/obj/effect/spawner/random/food_or_drink/seed_vault, -/obj/effect/spawner/random/food_or_drink/seed_vault, -/obj/item/vending_refill/hydronutrients, -/obj/item/vending_refill/hydroseeds, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aC" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aD" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aE" = ( -/obj/structure/closet/crate/hydroponics, -/obj/structure/beebox, -/obj/item/melee/flyswatter, -/obj/item/honey_frame, -/obj/item/honey_frame, -/obj/item/honey_frame, -/obj/item/queen_bee/bought, -/obj/item/clothing/head/beekeeper_head, -/obj/item/clothing/suit/beekeeper_suit, -/obj/machinery/light/directional/west, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aF" = ( -/obj/structure/table/wood, -/obj/item/lighter, -/obj/item/lighter, -/obj/item/storage/fancy/rollingpapers, -/obj/item/storage/fancy/rollingpapers, -/obj/item/storage/fancy/rollingpapers, -/obj/item/storage/fancy/rollingpapers, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aG" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/ruin/powered/seedvault) -"aH" = ( -/obj/machinery/door/airlock/vault, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"aI" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aJ" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/trimline/green/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aK" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aL" = ( -/obj/structure/table/wood, -/obj/item/geneshears{ - pixel_x = 6 - }, -/obj/item/geneshears, -/obj/item/geneshears{ - pixel_x = -6 - }, -/obj/item/geneshears, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aM" = ( -/obj/structure/table/wood, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aN" = ( -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"aO" = ( -/obj/machinery/light/directional/east, -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/trimline/green/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"aR" = ( -/obj/machinery/door/airlock/vault, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aS" = ( -/obj/structure/table/wood, -/obj/item/storage/bag/plants{ - pixel_x = -5 - }, -/obj/item/storage/bag/plants{ - pixel_y = -5 - }, -/obj/item/storage/bag/plants{ - pixel_y = 5 - }, -/obj/item/storage/bag/plants{ - pixel_x = 5 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aT" = ( -/obj/item/reagent_containers/glass/bucket, -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/bucket, -/obj/item/reagent_containers/glass/bucket, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"aU" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"aV" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"aW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"aX" = ( -/obj/structure/closet/crate/hydroponics, -/obj/structure/beebox, -/obj/item/melee/flyswatter, -/obj/item/honey_frame, -/obj/item/honey_frame, -/obj/item/honey_frame, -/obj/item/queen_bee/bought, -/obj/item/clothing/head/beekeeper_head, -/obj/item/clothing/suit/beekeeper_suit, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aY" = ( -/obj/effect/decal/cleanable/food/plant_smudge, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"aZ" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/dark, -/area/ruin/powered/seedvault) -"ba" = ( -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bb" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"bc" = ( -/obj/machinery/light/directional/west, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bd" = ( -/obj/machinery/chem_dispenser/mutagensaltpeter, -/obj/effect/turf_decal/trimline/green/corner, -/obj/effect/turf_decal/trimline/green/line{ - dir = 9 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"be" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bf" = ( -/obj/machinery/biogenerator, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bg" = ( -/obj/machinery/light/directional/east, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bh" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/line{ - dir = 6 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bj" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/line{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"bl" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bm" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/disposaloutlet, -/obj/structure/flora/ausbushes/fullgrass, -/obj/machinery/light/directional/north, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bn" = ( -/obj/structure/window/spawner/east, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bo" = ( -/obj/machinery/chem_master/condimaster, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bp" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/trimline/green/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 6 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bq" = ( -/obj/machinery/light/directional/east, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/green/line{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"br" = ( -/obj/structure/flora/ausbushes/sunnybush, -/obj/structure/flora/grass/jungle/b, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bs" = ( -/obj/structure/window/spawner/east, -/obj/structure/flora/ausbushes/sparsegrass, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bt" = ( -/obj/structure/window/spawner, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/genericbush, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bu" = ( -/obj/structure/window/spawner/east, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/effect/decal/cleanable/glass, -/turf/open/misc/grass/lavaland, -/area/ruin/powered/seedvault) -"bv" = ( -/obj/machinery/light/directional/south, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/line, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bw" = ( -/obj/machinery/light/directional/south, -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/green/line, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bx" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"by" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/seedvault) -"bz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"bA" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/ruin/powered/seedvault) -"bB" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/line{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bC" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/trimline/green/line{ - dir = 9 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/powered/seedvault) -"bD" = ( -/turf/closed/wall/r_wall, -/area/lavaland/surface/outdoors) -"ca" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"eq" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"oR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"sv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"Bb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"DA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"Eu" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"GN" = ( -/obj/structure/table/wood, -/obj/item/secateurs{ - pixel_x = -6 - }, -/obj/item/secateurs{ - pixel_x = 6 - }, -/obj/item/secateurs, -/obj/item/secateurs{ - pixel_x = -6 - }, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"KF" = ( -/obj/machinery/door/airlock/titanium, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/vault, -/area/ruin/powered/seedvault) -"PH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) -"Uz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/ruin/powered/seedvault) -"Vn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/freezer, -/area/ruin/powered/seedvault) - -(1,1,1) = {" -eq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -"} -(2,1,1) = {" -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -ab -"} -(3,1,1) = {" -aa -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -ab -ab -ab -aa -aa -aa -ab -ab -ab -"} -(4,1,1) = {" -aa -ac -ak -ah -ac -ca -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(5,1,1) = {" -aa -ac -ap -ah -as -PH -aQ -av -al -aR -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -"} -(6,1,1) = {" -aa -ac -ap -Vn -Bb -Bb -ah -av -am -aR -ab -ab -ac -ac -ac -ac -ac -aa -aa -aa -"} -(7,1,1) = {" -aa -ac -aq -ah -ac -PH -aU -ac -ac -ac -ac -ac -ac -bc -bc -bc -ac -ac -bD -aa -"} -(8,1,1) = {" -aa -ac -ac -ac -ac -PH -ah -aS -ac -aG -ac -bh -aN -aN -aN -aN -aN -bB -ac -aa -"} -(9,1,1) = {" -ac -ac -ar -at -az -PH -ah -aT -ac -ac -ac -bb -bb -aN -aN -aN -aN -aN -ac -ac -"} -(10,1,1) = {" -ac -ad -al -al -al -PH -ah -al -aC -ac -aZ -bb -aN -bd -ba -bo -aN -aN -bv -ac -"} -(11,1,1) = {" -ac -ae -al -Vn -Bb -Bb -Bb -Bb -Bb -aH -Bb -DA -Uz -aV -aW -be -aN -aN -bw -ac -"} -(12,1,1) = {" -ac -af -am -al -al -PH -ah -al -aD -ac -aK -bb -aN -bf -bi -bp -aN -aN -bv -ac -"} -(13,1,1) = {" -ac -ac -ac -aw -al -PH -ah -aF -ac -ac -ac -aN -aN -aN -bz -aN -aN -aN -ac -ac -"} -(14,1,1) = {" -ac -ag -an -al -al -PH -ah -ah -au -aA -ac -bj -aN -bb -bk -aN -bb -bC -ac -aa -"} -(15,1,1) = {" -ac -ai -al -Vn -Bb -Bb -ah -aF -ac -aA -ac -ac -ac -bg -bl -bq -ac -ac -ac -aa -"} -(16,1,1) = {" -ac -aj -al -al -al -Eu -ac -ac -ac -aI -aA -aL -ac -by -bA -ac -ac -ab -ab -aa -"} -(17,1,1) = {" -ac -ac -ao -al -al -PH -ac -aX -aE -aA -aA -GN -ac -bm -br -bt -ab -ab -aa -aa -"} -(18,1,1) = {" -aa -ac -ac -ax -aJ -oR -KF -sv -sv -aY -aM -ac -ac -bn -bs -bu -bx -ab -ab -ab -"} -(19,1,1) = {" -aa -aa -ac -ay -aO -ah -ac -aB -aB -aB -ac -ac -aa -aa -aa -aa -ab -ab -ab -ab -"} -(20,1,1) = {" -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -ab -ab -aa -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm deleted file mode 100644 index 2089bc287fb1..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm +++ /dev/null @@ -1,639 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/riveted, -/area/ruin/unpowered) -"b" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/unpowered) -"c" = ( -/obj/item/paper/fluff/stations/lavaland/sloth/note, -/turf/open/floor/sepia{ - slowdown = 10 - }, -/area/ruin/unpowered) -"d" = ( -/turf/open/floor/sepia{ - slowdown = 10 - }, -/area/ruin/unpowered) -"e" = ( -/obj/machinery/door/airlock/wood, -/turf/open/floor/sepia{ - slowdown = 10 - }, -/area/ruin/unpowered) -"f" = ( -/obj/structure/table/wood, -/obj/item/food/grown/citrus/orange, -/turf/open/floor/sepia{ - slowdown = 10 - }, -/area/ruin/unpowered) -"g" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/floor/sepia{ - slowdown = 10 - }, -/area/ruin/unpowered) - -(1,1,1) = {" -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -b -b -b -b -b -b -b -b -a -"} -(3,1,1) = {" -a -b -a -a -a -a -a -a -b -a -"} -(4,1,1) = {" -a -b -a -c -d -d -f -a -b -a -"} -(5,1,1) = {" -a -b -a -d -d -d -g -a -b -a -"} -(6,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(7,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(8,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(9,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(10,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(11,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(12,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(13,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(14,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(15,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(16,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(17,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(18,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(19,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(20,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(21,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(22,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(23,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(24,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(25,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(26,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(27,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(28,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(29,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(30,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(31,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(32,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(33,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(34,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(35,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(36,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(37,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(38,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(39,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(40,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(41,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(42,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(43,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(44,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(45,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(46,1,1) = {" -a -b -a -d -a -a -a -a -b -a -"} -(47,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(48,1,1) = {" -a -b -a -a -a -a -d -a -b -a -"} -(49,1,1) = {" -a -b -a -d -d -d -d -a -b -a -"} -(50,1,1) = {" -a -a -a -a -e -e -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm deleted file mode 100644 index 5d131b85f4a1..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_survivalpod.dmm +++ /dev/null @@ -1,280 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/obj/effect/turf_decal/mining, -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"d" = ( -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"e" = ( -/obj/effect/turf_decal/mining/survival, -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"f" = ( -/obj/structure/fans, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"g" = ( -/obj/machinery/smartfridge/survival_pod{ - desc = "A heated storage unit. This one's seen better days."; - name = "dusty survival pod storage" - }, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"h" = ( -/obj/item/gps/computer, -/obj/structure/tubes, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"i" = ( -/obj/effect/turf_decal/mining/survival{ - dir = 8 - }, -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"j" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"k" = ( -/obj/machinery/sleeper/survival_pod, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"l" = ( -/obj/item/pickaxe, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"m" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/black, -/obj/structure/tubes, -/obj/machinery/light/small/directional/east, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"n" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"o" = ( -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/asteroid/goliath/beast{ - health = 0 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"p" = ( -/obj/structure/table/survival_pod, -/obj/item/knife/combat/survival, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"q" = ( -/obj/effect/mob_spawn/corpse/human/miner/explorer{ - brute_damage = 150; - oxy_damage = 50 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"r" = ( -/obj/structure/tubes, -/obj/item/crowbar, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"s" = ( -/obj/effect/decal/cleanable/blood/footprints, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"t" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/obj/machinery/door/airlock/survival_pod/glass, -/turf/open/floor/pod/dark, -/area/ruin/powered) -"u" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"v" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/footprints, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"w" = ( -/obj/effect/turf_decal/mining/survival{ - dir = 4 - }, -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"x" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/blood/footprints{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"y" = ( -/obj/effect/turf_decal/mining/survival{ - dir = 1 - }, -/turf/closed/wall/mineral/titanium/survival/pod, -/area/ruin/powered) -"z" = ( -/obj/effect/decal/cleanable/blood/footprints{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"A" = ( -/obj/effect/decal/cleanable/blood/footprints, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -a -a -a -b -b -b -b -b -a -a -a -"} -(2,1,1) = {" -a -a -b -b -b -b -b -b -b -a -a -"} -(3,1,1) = {" -a -a -b -d -d -i -d -d -b -a -a -"} -(4,1,1) = {" -a -b -b -d -f -k -p -e -b -b -b -"} -(5,1,1) = {" -a -b -b -y -g -l -q -t -x -b -b -"} -(6,1,1) = {" -b -b -b -d -h -m -r -c -z -b -b -"} -(7,1,1) = {" -a -b -b -d -d -w -d -d -z -j -j -"} -(8,1,1) = {" -a -a -b -b -b -b -b -u -A -b -b -"} -(9,1,1) = {" -a -a -b -b -j -n -s -v -a -a -a -"} -(10,1,1) = {" -a -a -a -a -a -o -j -b -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm deleted file mode 100644 index c41499d4d3ad..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1.dmm +++ /dev/null @@ -1,7158 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"ae" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"ag" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"ah" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ - dir = 1 - }, -/obj/structure/sign/barsign{ - pixel_y = -32; - req_access = null - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"ai" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/fullupgrade{ - dir = 1 - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate_access, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/virology) -"ak" = ( -/obj/machinery/vending/boozeomat/syndicate_access, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/bar) -"al" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/medical/syndicate_access, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"ap" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"as" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/chemistry) -"at" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_chemistry" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/chemistry) -"aG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"aL" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/testlab) -"aM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/chem_dispenser/fullupgrade, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"aW" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "lavalandsyndi_arrivals"; - name = "Arrivals Blast Door Control"; - pixel_y = -26; - req_access_txt = "150" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"aY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"bd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"bq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/arrivals) -"bx" = ( -/obj/machinery/syndicatebomb/self_destruct{ - anchored = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"bC" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table, -/obj/item/storage/medkit/fire, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/medbay) -"bM" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"bP" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"bV" = ( -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"bY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"bZ" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"cc" = ( -/obj/effect/turf_decal/box/white/corners, -/obj/structure/closet/crate, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"cq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"cA" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/chemistry, -/obj/item/book/manual/wiki/chemistry, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"cB" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/ruin/syndicate_lava_base/engineering) -"cG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/chem_master, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"cI" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/lighter{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/storage/fancy/cigarettes/cigpack_syndicate{ - pixel_x = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"cS" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/virology) -"do" = ( -/obj/structure/closet/secure_closet/medical1{ - req_access = null; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/beakers/bluespace, -/obj/item/storage/box/beakers/bluespace, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/chemistry) -"dv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/chem_heater/withbuffer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dw" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dy" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/cargo) -"dA" = ( -/obj/structure/closet/l3closet, -/obj/machinery/power/apc/syndicate{ - dir = 8; - name = "Chemistry APC"; - pixel_x = -25 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/chemistry) -"dB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dE" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/mineral/plasma{ - amount = 5; - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 5; - pixel_y = 2 - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 5; - pixel_x = 2; - pixel_y = -2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/glass/bottle/epinephrine, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/chemistry) -"dG" = ( -/obj/structure/lattice/catwalk, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"dI" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/chemistry) -"dK" = ( -/obj/machinery/igniter/incinerator_syndicatelava, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"dL" = ( -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/structure/closet/crate, -/obj/item/extinguisher{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/extinguisher{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/extinguisher{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/flashlight{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/radio/headset/syndicate/alt{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/radio/headset/syndicate/alt, -/obj/item/radio/headset/syndicate/alt{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"dP" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/cargo) -"dQ" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"dU" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"dY" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"dZ" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -3 - }, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -3 - }, -/obj/item/reagent_containers/dropper, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/screwdriver/nuke{ - pixel_y = 18 - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/chemistry) -"ee" = ( -/obj/structure/rack, -/obj/item/flashlight{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/flashlight, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"ef" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Cargo Bay APC"; - pixel_y = 25 - }, -/obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"eg" = ( -/obj/structure/closet/firecloset/full{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"eh" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/virology) -"es" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"et" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"eu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/chem_heater/withbuffer, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"ev" = ( -/turf/open/floor/iron/white/corner, -/area/ruin/syndicate_lava_base/chemistry) -"ew" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/syndichem, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/chemistry) -"eD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"eE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table, -/obj/item/storage/box/lights/bulbs, -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) -"eF" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_cargo" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"eG" = ( -/obj/structure/closet/secure_closet/personal/patient, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/virology) -"eH" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/virology) -"eI" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/virology) -"eJ" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/virology) -"eK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on/orange/visible/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"eM" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"eS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/chem_master, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"eT" = ( -/obj/effect/turf_decal/bot, -/obj/structure/chair/office/light, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"eU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/chem_dispenser/fullupgrade, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"eV" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/chemistry) -"eY" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/obj/structure/closet/crate, -/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/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"fa" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"fb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) -"ff" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/virology) -"fh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/virology) -"fi" = ( -/obj/structure/table/glass, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Virology APC"; - pixel_y = 25 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/virology) -"fj" = ( -/obj/structure/table/glass, -/obj/structure/reagent_dispensers/wall/virusfood/directional/north, -/obj/item/clothing/gloves/color/latex, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/hud/health, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/virology) -"fn" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/chemistry) -"fo" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/south{ - name = "Chemistry" - }, -/obj/machinery/door/window/left/directional/south{ - dir = 1; - name = "Chemistry"; - req_access_txt = "150" - }, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/chemistry) -"fp" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"fu" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/table, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/soft{ - pixel_x = -8 - }, -/obj/item/clothing/head/soft{ - pixel_x = -8 - }, -/obj/item/radio{ - pixel_x = 5 - }, -/obj/item/radio{ - pixel_x = 5 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fw" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"fx" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/cargo) -"fA" = ( -/obj/structure/table/glass, -/obj/item/book/manual/wiki/infections{ - pixel_y = 7 - }, -/obj/item/reagent_containers/syringe/antiviral, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/cable, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/virology) -"fB" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/virology) -"fC" = ( -/obj/machinery/smartfridge/chemistry/virology/preloaded, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/virology) -"fD" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/virology) -"fE" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/l3closet, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"fF" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/shower{ - pixel_y = 14 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"fH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/main) -"fO" = ( -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/main) -"fY" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/stack/wrapping_paper{ - pixel_y = 5 - }, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gb" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gd" = ( -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"gf" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"gg" = ( -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/obj/structure/sign/warning/xeno_mining{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"gh" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/cargo) -"gi" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/closet/crate, -/obj/item/vending_refill/snack{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/vending_refill/snack{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/vending_refill/coffee, -/obj/item/vending_refill/cola, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"gj" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/virology) -"gO" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/cargo) -"gP" = ( -/obj/machinery/photocopier, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gQ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gS" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/button/door{ - id = "lavalandsyndi_cargo"; - name = "Cargo Bay Blast Door Control"; - pixel_x = 26; - req_access_txt = "150" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"gU" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/virology) -"gV" = ( -/obj/structure/chair/office/light, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/virology) -"gX" = ( -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "lavaland_syndie_virology_exterior"; - idInterior = "lavaland_syndie_virology_interior"; - idSelf = "lavaland_syndie_virology_control"; - name = "Virology Access Console"; - pixel_x = 24; - pixel_y = -5; - req_access_txt = "150" - }, -/obj/machinery/light_switch{ - pixel_x = 25; - pixel_y = 8 - }, -/obj/effect/turf_decal/caution/red{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/virology) -"gZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"ha" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"hb" = ( -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/ruin/syndicate_lava_base/main) -"hd" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"he" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hg" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hh" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hl" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hn" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"ho" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/computer/shuttle{ - desc = "Occasionally used to call in a resupply shuttle if one is in range."; - dir = 8; - icon_keyboard = "syndie_key"; - icon_screen = "syndishuttle"; - light_color = "#FA8282"; - name = "syndicate cargo shuttle terminal"; - possible_destinations = "syndielavaland_cargo"; - req_access_txt = "150"; - shuttleId = "syndie_cargo" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) -"hp" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/virology) -"hr" = ( -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/syndicate_lava_base/virology) -"hs" = ( -/obj/machinery/computer/pandemic, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door{ - id = "lavalandsyndi_virology"; - name = "Virology Blast Door Control"; - pixel_x = -26; - req_access_txt = "150" - }, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/virology) -"ht" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/item/hand_labeler, -/obj/item/pen/red, -/obj/item/restraints/handcuffs, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/glasses/science, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/virology) -"hu" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/item/stack/sheet/mineral/plasma{ - amount = 5 - }, -/obj/item/stack/sheet/mineral/uranium{ - amount = 10 - }, -/obj/item/stack/sheet/mineral/gold{ - amount = 10 - }, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/virology) -"hv" = ( -/obj/machinery/disposal/bin, -/obj/structure/sign/warning/deathsposal{ - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/red/box, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/virology) -"hw" = ( -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"hy" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hz" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/dormitories) -"hB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"hC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Cargo Bay" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/storage/belt/utility, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/part_replacer/bluespace/tier4, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/cargo) -"hE" = ( -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/virology) -"hF" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/virology) -"hG" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/virology) -"hH" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi_virology" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/virology) -"hI" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"hJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"hK" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, -/obj/structure/closet/emcloset/anchored, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/flashlight/seclite, -/obj/item/clothing/mask/gas, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"hM" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/magazine/sniper_rounds, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"hN" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"hO" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/dormitories) -"hP" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"hQ" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"hS" = ( -/obj/structure/table/reinforced, -/obj/item/folder, -/obj/item/suppressor, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/ears/earmuffs, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hT" = ( -/obj/machinery/vending/toyliberationstation{ - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hU" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/tank_dispenser/plasma, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hV" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"hW" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"hX" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"hY" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"ie" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"ig" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"ih" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"ii" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/ruin/syndicate_lava_base/main) -"ik" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"iq" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"is" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/turretid{ - ailock = 1; - control_area = "/area/ruin/syndicate_lava_base/main"; - dir = 1; - icon_state = "control_kill"; - lethal = 1; - name = "Base turret controls"; - pixel_y = 30; - req_access = null; - req_access_txt = "150" - }, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"iu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"iv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"iw" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"iy" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"iz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"iC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"iG" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"iM" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/arrivals) -"iN" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/main) -"iO" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"iQ" = ( -/obj/machinery/door/window/left/directional/south{ - base_state = "right"; - dir = 1; - icon_state = "right"; - name = "Bar" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"iS" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"iZ" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"jb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"jc" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"je" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"ji" = ( -/obj/machinery/power/apc/syndicate{ - dir = 8; - name = "Primary Hallway APC"; - pixel_x = -25 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"jk" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"jl" = ( -/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/iron, -/area/ruin/syndicate_lava_base/main) -"jm" = ( -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/ruin/syndicate_lava_base/main) -"ju" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"jv" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/suit_storage_unit/syndicate, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jw" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/toolcloset{ - anchored = 1 - }, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jx" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi_bar" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/bar) -"jy" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/bar) -"jz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/bar) -"jA" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/magazine/sniper_rounds, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"jB" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"jC" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"jD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jM" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "lavalandsyndi_bar"; - name = "Bar Blast Door Control"; - pixel_y = 26; - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"jO" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"jP" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/bar) -"jR" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"jT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"jU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/shower{ - desc = "The HS-452. Installed recently by the Donk Co. Hygiene Division."; - dir = 4; - name = "emergency shower" - }, -/obj/structure/closet/radiation, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"jY" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"jZ" = ( -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"ka" = ( -/obj/structure/closet/crate/bin, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kb" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/storage/box/lights/bulbs, -/obj/item/stack/rods{ - amount = 50 - }, -/obj/item/clothing/head/welding, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"kj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"kp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"ks" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"kt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"kv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/main) -"kw" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/combat{ - pixel_y = -6 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/clothing/mask/breath{ - pixel_x = -2; - pixel_y = 4 - }, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/main) -"kH" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kM" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/vending/cigarette{ - extended_inventory = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"kP" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/obj/item/soap/syndie, -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"kQ" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/medbay) -"kR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"kS" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"kT" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/medbay) -"kV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/power/smes/engineering, -/obj/structure/sign/warning/electricshock{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"kW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/power/smes/engineering, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"lc" = ( -/obj/machinery/power/rtg/lavaland, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/lava/smooth/lava_land_surface, -/area/ruin/syndicate_lava_base/main) -"ld" = ( -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"le" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/arrivals) -"lf" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"lg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"lh" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"li" = ( -/obj/structure/table/wood, -/obj/item/toy/cards/deck/syndicate{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lk" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/east, -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_x = 30 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lm" = ( -/obj/structure/closet/secure_closet/medical1{ - req_access = null; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/medbay) -"ln" = ( -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/medbay) -"lp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"lq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"lv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"lw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/lavaland/surface/outdoors) -"ly" = ( -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"lA" = ( -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lC" = ( -/obj/structure/table/wood, -/obj/machinery/reagentgrinder, -/obj/item/kitchen/rollingpin, -/obj/item/knife/kitchen{ - pixel_x = 6 - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"lG" = ( -/obj/structure/table, -/obj/item/storage/box/syringes, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/gun/syringe/syndicate, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/medbay) -"lH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/medbay) -"lI" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"lJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"lL" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 30 - }, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/head/welding, -/obj/item/weldingtool/largetank, -/obj/item/analyzer, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"lM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"lS" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"lT" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"lW" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"lX" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"md" = ( -/obj/machinery/sleeper/syndie{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"mf" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"mg" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/obj/item/pipe_dispenser{ - pixel_y = 12 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"mk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"mo" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/arrivals) -"mq" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"mr" = ( -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"ms" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, -/obj/structure/closet/emcloset/anchored, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/flashlight/seclite, -/obj/item/clothing/mask/gas, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"mt" = ( -/obj/machinery/computer/arcade/orion_trail{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"mu" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"mv" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/obj/machinery/power/apc/syndicate{ - name = "Bar APC"; - pixel_y = -25 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"mw" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"mx" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"my" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/food/condiment/enzyme, -/obj/item/food/chocolatebar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"mA" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/item/reagent_containers/blood/o_minus, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/medbay) -"mE" = ( -/obj/structure/table/reinforced, -/obj/item/scalpel, -/obj/item/circular_saw{ - pixel_y = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/medbay) -"mF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"mG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"mS" = ( -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"mT" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/arrivals) -"mU" = ( -/obj/machinery/door/firedoor, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/bar) -"mX" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/stack/cable_coil{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"mZ" = ( -/obj/machinery/sleeper/syndie{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"nd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"no" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"np" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"nq" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"nr" = ( -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/ruin/syndicate_lava_base/arrivals) -"nA" = ( -/obj/structure/cable, -/turf/open/floor/iron/white/corner, -/area/ruin/syndicate_lava_base/medbay) -"nB" = ( -/obj/structure/table/reinforced, -/obj/item/surgicaldrill, -/obj/item/cautery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/medbay) -"nC" = ( -/obj/structure/table/reinforced, -/obj/item/retractor, -/obj/item/hemostat, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/medbay) -"nD" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_interior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"nE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"nW" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"nX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"nZ" = ( -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/arrivals) -"oa" = ( -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/medbay) -"ob" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/medbay) -"oc" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/power/apc/syndicate{ - dir = 4; - name = "Medbay APC"; - pixel_x = 25 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/medbay) -"ol" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/rack{ - dir = 8 - }, -/obj/item/clothing/suit/space/syndicate, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/head/helmet/space/syndicate, -/obj/item/mining_scanner, -/obj/item/pickaxe, -/turf/open/floor/mineral/plastitanium, -/area/ruin/syndicate_lava_base/arrivals) -"om" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"oo" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"op" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"or" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/storage/belt/medical, -/obj/effect/decal/cleanable/dirt, -/obj/item/crowbar, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"ou" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/main) -"ov" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"ox" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_arrivals" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"oy" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) -"oC" = ( -/obj/machinery/door/poddoor/incinerator_syndicatelava_aux, -/turf/open/floor/engine/vacuum, -/area/ruin/syndicate_lava_base/engineering) -"oD" = ( -/obj/structure/sign/warning/xeno_mining{ - pixel_x = -32 - }, -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"oF" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/arrivals) -"oH" = ( -/obj/machinery/door/poddoor/incinerator_syndicatelava_main, -/turf/open/floor/engine/vacuum, -/area/ruin/syndicate_lava_base/engineering) -"oI" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"oK" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"oM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "lavalandsyndien2"; - dir = 8 - }, -/turf/open/floor/engine/n2, -/area/ruin/syndicate_lava_base/engineering) -"oO" = ( -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieco2" - }, -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"oP" = ( -/obj/structure/sign/departments/chemistry, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"pa" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pm" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"pI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Arrival Hallway APC"; - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"pM" = ( -/obj/structure/toilet{ - pixel_y = 18 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/mirror/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) -"pU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"qa" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_syndicatelava{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/airlock_sensor/incinerator_syndicatelava{ - pixel_x = 22 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"qk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"qm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"qw" = ( -/obj/machinery/door/airlock{ - name = "Cabin 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"qy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qI" = ( -/obj/machinery/door/airlock{ - name = "Cabin 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"qU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"qW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/white/side, -/area/ruin/syndicate_lava_base/main) -"rg" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/n2, -/area/ruin/syndicate_lava_base/engineering) -"rn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"ro" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/modular_map_root/syndicatebase{ - key = "commswilding" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/arrivals) -"rp" = ( -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/syndicate_lava_base/virology) -"rv" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"ry" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"rE" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/button/door{ - id = "lavalandsyndi_chemistry"; - name = "Chemistry Blast Door Control"; - pixel_y = 26; - req_access_txt = "150" - }, -/obj/machinery/chem_mass_spec, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/chemistry) -"rO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/cable, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"sc" = ( -/turf/open/floor/engine/o2, -/area/ruin/syndicate_lava_base/engineering) -"sd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/virology) -"si" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"sl" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"sw" = ( -/obj/effect/spawner/random/vending/snackvend{ - hacked = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/ruin/syndicate_lava_base/main) -"sT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"te" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"tf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/virology) -"tp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/red/line{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"tu" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"tT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"um" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"va" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"vg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"vq" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"vA" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"vB" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on/orange/visible/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"vI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/syndicate_lava_base/chemistry) -"vK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/main) -"vM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"vN" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"vU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"wi" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ - dir = 8; - volume_rate = 200 - }, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/main) -"wp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"wv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"wA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"wE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/medbay) -"wX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"xf" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"xn" = ( -/turf/open/floor/engine/n2, -/area/ruin/syndicate_lava_base/engineering) -"xr" = ( -/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/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance{ - req_access = null - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"xt" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"xA" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"xD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"xF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"xM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"ya" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) -"ye" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/atmospherics/pipe/layer_manifold{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"yh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_syndicatelava{ - pixel_x = -8; - pixel_y = -26 - }, -/obj/machinery/button/ignition/incinerator/syndicatelava{ - pixel_x = 6; - pixel_y = -24 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/incinerator_vent_syndicatelava_aux{ - pixel_x = -8; - pixel_y = -40 - }, -/obj/machinery/button/door/incinerator_vent_syndicatelava_main{ - pixel_x = 6; - pixel_y = -40 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"yk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"yl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"yp" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/virology) -"ys" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"yy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"yO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"yS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"zK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Ab" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "lavalandsyndieo2"; - dir = 8 - }, -/turf/open/floor/engine/o2, -/area/ruin/syndicate_lava_base/engineering) -"Ae" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"Ag" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical{ - name = "Chemistry Lab"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/chemistry) -"Ao" = ( -/obj/machinery/atmospherics/components/trinary/mixer/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"AB" = ( -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"AD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/assist, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"AQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"AX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/arrivals) -"Bb" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Bj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Bu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/computer/monitor/secret{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"BD" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/obj/structure/closet/crate, -/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/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"BF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"BG" = ( -/obj/structure/bookcase/random, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Ci" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/oxygen/yellow, -/obj/item/tank/internals/oxygen/yellow, -/obj/item/tank/internals/oxygen/yellow, -/obj/item/tank/internals/emergency_oxygen/double, -/obj/item/tank/internals/emergency_oxygen/double, -/obj/item/tank/internals/emergency_oxygen/double, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Cj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Ck" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Cn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"Cu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/syndicate_lava_base/virology) -"Cz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/ruin/syndicate_lava_base/medbay) -"CA" = ( -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieplasma" - }, -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"CI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"CR" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/obj/structure/closet/crate, -/obj/item/storage/box/stockparts/deluxe, -/obj/item/storage/box/stockparts/deluxe, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/circuitboard/machine/processor, -/obj/item/circuitboard/machine/gibber, -/obj/item/circuitboard/machine/deep_fryer, -/obj/item/circuitboard/machine/cell_charger, -/obj/item/circuitboard/machine/smoke_machine, -/obj/item/stack/sheet/plasteel/fifty, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"CY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"Dj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"Dt" = ( -/obj/structure/sign/warning/fire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Dx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"DL" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Monkey Pen"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"DP" = ( -/obj/structure/closet/crate/medical, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"DY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/red/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"Eg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Eo" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Ev" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/rag{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = 5; - pixel_y = -2 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"ET" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/layer_manifold/orange/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"EV" = ( -/obj/structure/closet/emcloset/anchored, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/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, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"EZ" = ( -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"Ff" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Fs" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation B"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"FC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"FI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"FP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"FW" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Gs" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "syndie_lavaland_vault"; - name = "Vault Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 24; - pixel_y = 8; - req_access_txt = "150"; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Gx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"GQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Hm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"HP" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/dormitories) -"HQ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"HS" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"HX" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 4 - }, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"Ir" = ( -/obj/machinery/washing_machine, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) -"IB" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/virology{ - frequency = 1449; - id_tag = "lavaland_syndie_virology_exterior"; - name = "Virology Lab Exterior Airlock"; - req_access_txt = "150" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "lavaland_syndie_virology_exterior"; - idSelf = "lavaland_syndie_virology_control"; - name = "Virology Access Button"; - pixel_y = -24; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"IC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"IF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/chemistry) -"IH" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating/airless, -/area/ruin/syndicate_lava_base/engineering) -"IJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"IP" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"IQ" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"IU" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/template_noop, -/area/template_noop) -"Jo" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/dormitories) -"Jp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"Jq" = ( -/obj/effect/turf_decal/stripes/red/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"JE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on/cyan/visible/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"JM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"JQ" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Engineering APC"; - pixel_y = 25 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"JV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "lavalandsyndieco2" - }, -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"Kf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Kg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Kj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"Kp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"Kz" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"KC" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/glass/incinerator/syndicatelava_exterior, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"KI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/virology) -"KR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"KS" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/medbay) -"KU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Lp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"Ly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"LG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"LS" = ( -/turf/closed/wall/mineral/plastitanium/explosive, -/area/ruin/syndicate_lava_base/engineering) -"LT" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"Mr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/bar) -"Ms" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Mt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Nh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Nk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/medbay) -"No" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Ny" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"NQ" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"NR" = ( -/obj/structure/table/optable, -/obj/item/surgical_drapes, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/ruin/syndicate_lava_base/medbay) -"NU" = ( -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndieo2" - }, -/turf/open/floor/engine/o2, -/area/ruin/syndicate_lava_base/engineering) -"Ob" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Oq" = ( -/obj/effect/spawner/random/vending/colavend{ - hacked = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"OG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Plasma to Mix" - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"OQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"OW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "150" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"OX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Pb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Pl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Pw" = ( -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/obj/machinery/vending/coffee{ - extended_inventory = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"PE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"PR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"PT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Bar Storage"; - req_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"PZ" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - target_pressure = 4500 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/engineering) -"Qb" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Qv" = ( -/obj/structure/closet/firecloset/full{ - anchored = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Qy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Warehouse"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"QS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "lavaland_syndie_virology_interior"; - idSelf = "lavaland_syndie_virology_control"; - name = "Virology Access Button"; - pixel_x = -24; - pixel_y = 8; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"QV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Rd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"Rh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Rj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Rl" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/o2, -/area/ruin/syndicate_lava_base/engineering) -"Rn" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"Ry" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "lavalandsyndieplasma"; - dir = 8 - }, -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"RH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/ruin/syndicate_lava_base/dormitories) -"RK" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"RO" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/bar) -"RP" = ( -/obj/structure/closet/crate/secure/gear{ - req_access_txt = "150" - }, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/under/syndicate/combat, -/obj/item/clothing/under/syndicate/combat, -/obj/item/storage/belt/military, -/obj/item/storage/belt/military, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/glasses/night, -/obj/item/clothing/glasses/night, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Se" = ( -/obj/machinery/door/airlock{ - name = "Cabin 4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"Sk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"Sm" = ( -/obj/machinery/air_sensor{ - chamber_id = "lavalandsyndien2" - }, -/turf/open/floor/engine/n2, -/area/ruin/syndicate_lava_base/engineering) -"St" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/arrivals) -"SA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/trinary/mixer/flipped/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Tt" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Tu" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/virology{ - frequency = 1449; - id_tag = "lavaland_syndie_virology_interior"; - name = "Virology Lab Interior Airlock"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"TO" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"TV" = ( -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/engineering) -"TY" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Ub" = ( -/obj/structure/closet/crate, -/obj/item/storage/toolbox/electrical{ - pixel_y = 4 - }, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"Ue" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Ui" = ( -/obj/machinery/door/airlock/vault{ - id_tag = "syndie_lavaland_vault"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"Uk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"Uq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/medbay) -"Ut" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/red/line{ - dir = 5 - }, -/obj/structure/filingcabinet, -/obj/item/folder/syndicate/mining, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"UD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Vd" = ( -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"Vo" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/ruin/syndicate_lava_base/dormitories) -"Vp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Vr" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"VM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/syndicate_lava_base/virology) -"VR" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"VT" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"VV" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/chemistry) -"Wf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible/layer4, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Wg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"Wl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"Wn" = ( -/obj/modular_map_root/syndicatebase{ - key = "mistake" - }, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Xd" = ( -/obj/structure/closet/radiation, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Xq" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/ruin/syndicate_lava_base/chemistry) -"Xr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"XA" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate{ - dir = 8 - }, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/dormitories) -"XK" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating/airless, -/area/ruin/syndicate_lava_base/engineering) -"XP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/color_adapter/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"XR" = ( -/obj/machinery/door/airlock{ - name = "Cabin 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"XU" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"XW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ - name = "Warehouse"; - req_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 9 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/cargo) -"Yb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/power/apc/syndicate{ - name = "Dormitories APC"; - pixel_y = -25 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"Yh" = ( -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation A"; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron/white, -/area/ruin/syndicate_lava_base/virology) -"Yn" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/bar) -"Yt" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/plasma, -/area/ruin/syndicate_lava_base/engineering) -"YS" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/obj/structure/closet/crate/secure/weapon{ - req_access_txt = "150" - }, -/obj/item/ammo_box/c9mm{ - pixel_y = 6 - }, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/magazine/m9mm{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/ammo_box/magazine/m9mm{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/ammo_box/magazine/m9mm{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/ammo_box/magazine/m9mm{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"YU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/main) -"Za" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"Zv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/arrivals) -"Zz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/red/line{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/main) -"ZD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/dormitories) -"ZG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = -32 - }, -/obj/effect/turf_decal/stripes, -/obj/structure/closet/radiation, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/engineering) -"ZH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/cargo) -"ZN" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine/co2, -/area/ruin/syndicate_lava_base/engineering) -"ZO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) -"ZU" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/engineering) -"ZZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/main) - -(1,1,1) = {" -IU -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(4,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(5,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(6,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(7,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -eh -eh -eh -eh -eh -eh -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(8,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -si -eh -eG -ff -eI -aj -eh -eh -eh -eh -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(9,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -eh -eH -VM -Fs -OQ -eI -hp -hE -eh -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(10,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -si -eh -eI -eI -eI -PR -DL -de -hF -eh -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(11,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -si -eh -eG -fh -eI -Sk -eI -hr -hG -eh -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(12,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -eh -eH -VM -Yh -Cn -eh -gj -eh -eh -ab -ab -ab -ab -ab -ab -dG -dG -dG -dG -dG -dG -lS -mT -mT -mo -ro -mT -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(13,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -eh -eh -eI -eI -Cu -gU -hs -hH -ab -ab -ab -ab -ab -ab -dG -dG -ig -iu -iu -iu -lv -lT -mq -mS -Zv -Vr -mT -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(14,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -si -eh -fi -fA -sd -gV -ht -hH -ab -ab -ab -ab -ab -dG -dG -ig -je -iv -jk -le -lw -lT -mr -mS -Ms -Kg -ol -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(15,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -rp -eJ -fj -fB -KI -yp -hu -hH -ab -ab -ab -ab -dG -dG -ig -je -jk -jx -jx -jy -jy -jy -ms -mT -no -Kg -ol -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(16,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -pa -ab -pa -pa -pa -pa -ae -ae -fC -tf -gX -hv -hH -ab -ab -ab -dG -dG -ig -je -jk -jx -jx -IQ -lf -BG -jy -jy -jy -np -HS -mT -mT -mT -oF -ab -ab -ab -ab -ab -ab -"} -(17,1,1) = {" -ab -ab -ab -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -ae -fD -Tu -eh -eh -eh -hW -dG -dG -dG -ig -je -iv -jx -jx -Ue -kH -xt -jZ -rv -mt -mU -np -xM -EZ -oI -oD -St -ab -ab -ab -ab -ab -aa -"} -(18,1,1) = {" -ab -ab -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -ae -fE -Ny -QS -hw -hI -hX -ig -iu -iu -je -jk -jx -jx -xt -jZ -xt -jZ -xt -jZ -Ue -mU -nq -HQ -mT -mT -mT -oF -ab -ab -ab -ab -ab -aa -"} -(19,1,1) = {" -ab -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -pa -ae -fF -GQ -gZ -hw -hJ -hY -ih -iv -iM -iv -iv -jx -cI -jY -xt -jZ -tT -ly -NQ -mu -mU -nr -cq -om -mT -ab -ab -ab -ab -ab -ab -aa -aa -"} -(20,1,1) = {" -aa -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -pa -ae -ae -IB -ha -ha -hK -ha -ha -ha -ha -ha -ha -jP -jM -xt -jZ -bZ -lh -Ev -lW -mv -jy -jy -zK -xA -mT -ab -ab -ab -ab -ab -ab -ab -aa -"} -(21,1,1) = {" -aa -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -pa -pa -ae -ry -hb -ha -iN -ha -ii -iw -iO -hB -jl -jz -xt -jZ -qk -Yn -li -lA -lX -mw -ah -jy -vg -Tt -ox -ab -ab -ab -ab -ab -ab -ab -ab -"} -(22,1,1) = {" -aa -ab -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -pa -Wn -ZO -yO -Ob -VT -TY -KR -ZO -ys -hd -jm -jz -jO -xt -kp -Rj -iQ -Mr -vM -lA -ai -jP -UD -op -ox -ab -ab -ab -ab -ab -ab -ab -ab -"} -(23,1,1) = {" -aa -ab -ab -ab -ab -pa -pa -pa -pa -pa -pa -pa -pa -pa -ae -dQ -vA -hd -hy -hy -hy -ik -Wl -wA -hz -hz -jy -jy -ka -Pw -kM -lk -lC -um -mx -jy -jy -cS -oo -ox -ab -ab -ab -ab -ab -ab -ab -ab -"} -(24,1,1) = {" -aa -ab -ab -ab -ab -ab -pa -pa -ae -ae -aL -ae -ae -ae -oP -fH -sT -he -hz -hz -hz -hz -iy -Uk -hz -HX -jA -jy -jy -jy -jy -jy -ak -PT -jy -jy -EV -xD -oo -ox -ab -ab -ab -ab -ab -ab -ab -ab -"} -(25,1,1) = {" -aa -ab -ab -ab -ab -ab -pa -pa -as -do -dA -Xq -VV -vI -Ag -vK -Mt -he -hz -hM -xf -hz -iz -JM -XR -FC -jB -hz -kb -jy -kN -jZ -lE -bY -my -jy -pI -nW -aW -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(26,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -as -as -rE -dB -bd -es -eS -fn -fO -sT -hf -hz -hN -FI -qw -Jp -Vo -hz -hz -hz -hz -BF -RO -kq -Cc -gi -xr -jy -jy -vg -nX -oo -mT -ab -ab -ab -ab -ab -ab -ab -ab -"} -(27,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -at -aM -dv -dC -IF -et -eT -fo -fO -sT -hg -hz -hz -hz -hz -bV -qq -HP -Hm -Hm -xF -Hm -jy -jy -jy -jy -jy -jy -mX -Kz -aQ -mT -mT -ab -ab -ab -ab -ab -ab -ab -aa -"} -(28,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -at -cA -dw -dC -yS -eu -eU -fn -fH -sT -he -Jo -hz -pM -ya -iC -Yb -hz -hz -hz -hz -YU -xF -xF -xF -Hm -Hm -Rn -AX -bq -nZ -mT -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(29,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -at -cG -dx -dE -dY -ev -eV -fp -fH -wA -FW -hz -hz -hz -hz -Ae -ur -qI -FC -jC -hz -Kp -ks -kP -kQ -kQ -kQ -kQ -kT -Kj -kR -kQ -kQ -ab -ab -ab -ab -ab -ab -ab -ab -"} -(30,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -as -as -as -dI -dZ -ew -as -as -as -qU -hh -hz -hP -FI -Se -ZD -RH -hz -XA -jA -hz -Ly -kt -kQ -kQ -lG -md -mA -mZ -wE -oa -or -kQ -ab -ab -ab -ab -ab -ab -ab -ab -"} -(31,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -si -as -as -as -as -as -AD -dy -Bb -he -hz -hQ -oK -hz -Ir -oy -hz -hO -hz -hz -tu -ha -kQ -lm -lH -mk -lI -AQ -Dj -ob -al -kQ -ab -ab -ab -ab -ab -ab -ab -ab -"} -(32,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -si -dy -RP -YS -XU -yl -Ck -XW -qm -he -hz -hz -hz -hz -hz -hz -hz -sw -Oq -jR -wA -qW -Uq -Cz -jb -jb -jb -yk -nA -oc -kQ -kQ -si -ab -ab -ab -ab -ab -ab -ab -"} -(33,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -dy -dL -Ub -yl -Ci -CR -fa -qy -Eo -hB -hB -hB -ag -iG -iZ -ji -ZZ -Pl -Mt -Mt -kv -kS -ln -lJ -mf -Nk -te -nB -kQ -kQ -si -ab -ab -ab -ab -ab -ab -ab -ab -"} -(34,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -dy -BD -DP -Ck -eY -cc -dP -wp -dU -dU -IC -No -Jq -vq -Gs -Gx -Gx -wA -Qv -kj -kw -kT -bC -KS -ap -mE -NR -nC -kQ -si -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(35,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -dy -dy -ZH -Pb -vU -dy -dy -gO -hk -hC -dy -ha -iq -Ui -iq -ha -ha -OW -jT -ju -ju -ju -ju -ju -LS -ju -IJ -IJ -CY -ju -ju -ju -ju -ab -ab -ab -ab -ab -ab -"} -(36,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -si -dy -dy -Qy -fa -dy -fY -gP -gQ -hl -hS -ha -DY -iS -tp -ha -Xd -Eg -jU -ju -Bu -kV -lp -lL -mg -mF -Cj -Lp -bP -Lp -rn -dK -oC -ab -ab -ab -ab -ab -aa -"} -(37,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -ee -aY -fb -fu -gb -gQ -hl -gQ -hT -ha -is -bx -jc -ha -jv -Bj -ZG -ju -Wg -kW -lq -lM -Qb -mG -nd -nD -qa -KC -Rd -LT -ju -ab -ab -ab -ab -ab -ab -"} -(38,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -ef -OX -ie -QV -QV -Ff -gQ -hl -hU -ha -Ut -ou -Zz -ha -jw -LG -Kf -bM -wX -wv -wv -Rh -Vp -Xr -yh -nE -PZ -rO -AB -ju -ju -ab -ab -ab -ab -ab -ab -"} -(39,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -eg -eD -fd -fw -gc -gS -hn -gQ -hV -ha -Dx -FP -ha -ha -ju -ju -ju -ju -JQ -RK -sl -XP -ET -OG -Dt -pU -CI -jD -TV -ju -ab -ab -ab -ab -ab -ab -ab -"} -(40,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -dy -eE -fe -dy -gd -dy -ho -hD -dy -dy -wi -lc -lc -ju -ld -JV -XK -ov -Za -KU -KU -Ao -SA -aG -Wf -sl -eM -ju -AB -ju -ab -ab -ab -ab -ab -ab -ab -"} -(41,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -eF -eF -dy -gf -dy -eF -eF -dy -si -si -ab -ab -ju -ZN -oO -IH -TO -PE -RK -RK -lg -Wf -RK -VR -RK -pm -ju -oH -ju -ab -ab -ab -ab -ab -ab -ab -"} -(42,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -dy -gg -dy -si -si -si -si -ab -ab -ab -ju -ju -ju -ju -TO -JE -va -IP -vB -Nh -sl -eK -yy -vN -ju -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(43,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -fx -gh -fx -si -ab -ab -ab -ab -ab -ab -ab -ab -ab -ju -ju -ye -ZU -ju -ye -ZU -ju -cB -IH -ju -ju -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(44,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -si -si -si -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ju -oM -Sm -ju -Ab -NU -ju -Ry -CA -ju -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ju -rg -xn -ju -Rl -sc -ju -Yt -Vd -ju -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ju -ju -ju -ju -ju -ju -ju -ju -ju -ju -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(47,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm deleted file mode 100644 index ba8dc7addd64..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_1.dmm +++ /dev/null @@ -1,267 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/machinery/computer/message_monitor{ - dir = 1 - }, -/obj/item/paper/monitorkey, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"c" = ( -/obj/structure/filingcabinet/security, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"e" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi_telecomms" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"f" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) -"h" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications"; - req_access_txt = "150" - }, -/obj/modular_map_connector, -/turf/template_noop, -/area/ruin/syndicate_lava_base/telecomms) -"j" = ( -/turf/open/floor/circuit/green, -/area/ruin/syndicate_lava_base/telecomms) -"l" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"m" = ( -/obj/machinery/computer/camera_advanced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"o" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"p" = ( -/obj/structure/table, -/obj/item/storage/toolbox/syndicate, -/obj/item/multitool, -/obj/machinery/button/door{ - id = "lavalandsyndi_telecomms"; - name = "Telecomms Blast Door Control"; - pixel_x = 26; - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"q" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/power/apc/syndicate{ - name = "Telecommunications APC"; - pixel_y = -25 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"s" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"u" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"y" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"z" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom{ - freerange = 1; - name = "Syndicate Radio Intercom" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"A" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"C" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"G" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"K" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"M" = ( -/obj/machinery/telecomms/relay/preset/ruskie{ - use_power = 0 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"O" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications Control"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"R" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"V" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) -"W" = ( -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) - -(1,1,1) = {" -a -f -f -f -f -f -a -a -"} -(2,1,1) = {" -f -f -j -M -j -f -f -a -"} -(3,1,1) = {" -f -j -j -o -j -j -f -a -"} -(4,1,1) = {" -f -f -V -O -f -f -f -a -"} -(5,1,1) = {" -a -e -c -o -A -s -f -f -"} -(6,1,1) = {" -a -e -c -y -m -C -b -f -"} -(7,1,1) = {" -a -e -W -R -K -z -G -f -"} -(8,1,1) = {" -a -e -p -l -u -q -f -f -"} -(9,1,1) = {" -a -a -a -a -h -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm deleted file mode 100644 index b80b6a8eaa37..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_2.dmm +++ /dev/null @@ -1,285 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"h" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/multitool, -/obj/machinery/button/door{ - id = "lavalandsyndi_telecomms"; - name = "Telecomms Blast Door Control"; - pixel_x = 26; - req_access_txt = "150" - }, -/obj/structure/rack, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"j" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/power/apc/syndicate{ - name = "Telecommunications APC"; - pixel_y = -25 - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"k" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) -"n" = ( -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"q" = ( -/obj/machinery/telecomms/relay/preset/ruskie{ - use_power = 0 - }, -/obj/machinery/door/window/brigdoor/left/directional/south{ - req_access_txt = "150" - }, -/obj/effect/turf_decal/siding/thinplating/dark, -/turf/open/floor/circuit/green, -/area/ruin/syndicate_lava_base/telecomms) -"s" = ( -/obj/machinery/light/directional/west, -/obj/structure/filingcabinet/medical, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 6 - }, -/turf/open/floor/circuit, -/area/ruin/syndicate_lava_base/telecomms) -"x" = ( -/obj/structure/closet/crate/secure/freezer/commsagent, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"y" = ( -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"z" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/ruin/syndicate_lava_base/telecomms) -"D" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/computer/message_monitor{ - dir = 4 - }, -/obj/item/paper/monitorkey{ - pixel_x = 5 - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Syndicate Radio Intercom"; - pixel_y = -26 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"F" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"H" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/structure/filingcabinet/security, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 4 - }, -/turf/open/floor/circuit/red, -/area/ruin/syndicate_lava_base/telecomms) -"J" = ( -/turf/open/floor/iron/dark/textured_large, -/area/ruin/syndicate_lava_base/telecomms) -"K" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi_telecomms" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"L" = ( -/obj/structure/falsewall/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"M" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) -"Q" = ( -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_y = -32 - }, -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"R" = ( -/turf/open/floor/iron/dark/textured, -/area/ruin/syndicate_lava_base/telecomms) -"S" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"T" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/ruin/syndicate_lava_base/telecomms) -"U" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications"; - req_access_txt = "150" - }, -/obj/modular_map_connector, -/turf/template_noop, -/area/ruin/syndicate_lava_base/telecomms) -"X" = ( -/obj/machinery/computer/camera_advanced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/newscaster/directional/south, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/telecomms) - -(1,1,1) = {" -a -k -k -k -k -k -a -a -"} -(2,1,1) = {" -k -k -H -s -D -k -k -k -"} -(3,1,1) = {" -k -q -R -J -z -L -x -k -"} -(4,1,1) = {" -k -k -n -M -X -k -k -k -"} -(5,1,1) = {" -a -K -y -y -y -Q -k -k -"} -(6,1,1) = {" -a -K -y -b -y -T -K -a -"} -(7,1,1) = {" -a -K -y -S -y -T -K -a -"} -(8,1,1) = {" -a -K -h -F -j -k -k -a -"} -(9,1,1) = {" -a -a -a -a -U -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm deleted file mode 100644 index 984bfe87aa16..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/commswilding_3.dmm +++ /dev/null @@ -1,344 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"c" = ( -/obj/structure/railing{ - dir = 10 - }, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/lavaland_atmos, -/area/template_noop) -"d" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) -"e" = ( -/obj/machinery/button/door{ - id = "lavalandsyndi_fredrickleft"; - name = "Security Blast Door Control"; - pixel_y = -26; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"j" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"k" = ( -/obj/item/paper_bin, -/obj/item/pen, -/obj/structure/closet/cardboard, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"m" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/power/apc/syndicate{ - name = "Telecommunications APC"; - pixel_y = -25 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"o" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"p" = ( -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"q" = ( -/obj/structure/girder, -/turf/open/floor/plating/lavaland_atmos, -/area/ruin/syndicate_lava_base/telecomms) -"r" = ( -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"s" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"t" = ( -/obj/structure/sign/poster/contraband/syndiemoth{ - pixel_x = -32 - }, -/obj/item/radio/intercom{ - freerange = 1; - name = "Syndicate Radio Intercom"; - pixel_y = 5 - }, -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/cobweb, -/obj/item/phone{ - pixel_x = -4; - pixel_y = -4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"v" = ( -/obj/structure/railing, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/lavaland_atmos, -/area/template_noop) -"w" = ( -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_fredrickleft" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"y" = ( -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"z" = ( -/obj/machinery/airalarm/syndicate{ - dir = 8; - pixel_x = -24 - }, -/obj/item/modular_computer/tablet/pda/chameleon/broken{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/structure/table/reinforced, -/obj/item/food/cherrycupcake{ - pixel_x = -7; - pixel_y = 13 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"A" = ( -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_fredrickright" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"B" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/security{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/ruin/syndicate_lava_base/telecomms) -"C" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"D" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/effect/mapping_helpers/no_lava, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/lavaland_atmos, -/area/template_noop) -"E" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable, -/obj/modular_map_connector, -/obj/machinery/door/airlock/security{ - name = "Security Office"; - req_access_txt = "150" - }, -/turf/template_noop, -/area/ruin/syndicate_lava_base/telecomms) -"G" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/telecomms) -"H" = ( -/obj/structure/table, -/obj/item/storage/toolbox/syndicate, -/obj/item/multitool, -/obj/machinery/button/door{ - id = "lavalandsyndi_telecomms"; - name = "Telecomms Blast Door Control"; - pixel_x = 26; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"I" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"K" = ( -/obj/effect/mapping_helpers/no_lava, -/turf/open/floor/plating/lavaland_atmos, -/area/template_noop) -"P" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"Q" = ( -/obj/effect/mapping_helpers/no_lava, -/obj/structure/chair/plastic, -/turf/open/floor/plating/lavaland_atmos, -/area/template_noop) -"U" = ( -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"W" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/obj/structure/noticeboard/directional/east, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) -"X" = ( -/obj/machinery/button/door{ - id = "lavalandsyndi_fredrickright"; - name = "Security Blast Door Control"; - pixel_y = 26; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/stack/tile/iron/grimy, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/telecomms) -"Z" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/syndicate_lava_base/telecomms) - -(1,1,1) = {" -a -G -G -G -G -G -a -a -"} -(2,1,1) = {" -G -G -t -B -z -G -D -c -"} -(3,1,1) = {" -q -A -r -o -b -w -K -v -"} -(4,1,1) = {" -G -G -X -U -e -G -Q -v -"} -(5,1,1) = {" -a -G -G -y -d -G -G -G -"} -(6,1,1) = {" -a -G -I -C -Z -p -j -G -"} -(7,1,1) = {" -a -G -p -s -p -j -k -G -"} -(8,1,1) = {" -a -G -H -W -P -m -G -G -"} -(9,1,1) = {" -a -a -a -a -E -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm deleted file mode 100644 index 2814a5d4735d..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_feasible.dmm +++ /dev/null @@ -1,426 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"c" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch{ - heat_proof = 1; - name = "Experimentation Room"; - req_access_txt = "150" - }, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi"; - name = "Syndicate Research Experimentation Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"d" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/taperecorder, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"f" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"h" = ( -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"j" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"l" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"m" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi"; - name = "Syndicate Research Experimentation Shutters" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"n" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = -32 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"p" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/syndicate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/item/paper/crumpled{ - info = "Explosive testing on site is STRICTLY forbidden, as this outpost's walls are lined with explosives intended for intentional self-destruct purposes that may be set off prematurely through careless experiments."; - name = "Explosives Testing Warning"; - pixel_x = -6; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"q" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 10 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"r" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "lavalandsyndi"; - name = "Syndicate Research Experimentation Shutters" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"s" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"t" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"u" = ( -/obj/machinery/door/airlock/hatch{ - name = "Monkey Pen"; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"w" = ( -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"x" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"y" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"z" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"B" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/button/door{ - id = "lavalandsyndi"; - name = "Syndicate Experimentation Lockdown Control"; - pixel_y = 26; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"C" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"D" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"F" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Experimentation Lab"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"G" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table/reinforced, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"I" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"K" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"L" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"P" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"R" = ( -/obj/structure/table/reinforced, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"S" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"U" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"V" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"W" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"X" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south{ - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"Y" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Z" = ( -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/carbon/human/species/monkey{ - faction = list("neutral","Syndicate") - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) - -(1,1,1) = {" -a -a -a -a -a -a -a -D -D -a -a -a -"} -(2,1,1) = {" -a -D -D -D -D -D -D -D -Z -b -a -a -"} -(3,1,1) = {" -D -D -h -h -n -Y -h -I -L -u -a -a -"} -(4,1,1) = {" -D -W -h -j -h -j -h -c -t -z -a -a -"} -(5,1,1) = {" -D -h -h -C -h -C -h -D -B -w -a -a -"} -(6,1,1) = {" -D -h -h -V -h -s -h -m -p -y -X -a -"} -(7,1,1) = {" -D -W -h -q -U -x -K -r -R -f -l -F -"} -(8,1,1) = {" -D -D -h -h -P -S -h -m -d -G -a -a -"} -(9,1,1) = {" -a -D -D -D -D -a -a -a -a -a -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm deleted file mode 100644 index 160c34260583..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_inevitable.dmm +++ /dev/null @@ -1,524 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aA" = ( -/turf/template_noop, -/area/template_noop) -"aU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"be" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south{ - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"bs" = ( -/obj/machinery/button/door{ - id = "lavalandsyndi_mistake"; - name = "Chemistry Blast Door Control"; - pixel_y = 26; - req_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"dO" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/components/tank/nitrogen{ - dir = 4; - initialize_directions = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"ef" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"em" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"eq" = ( -/obj/machinery/door/airlock/engineering{ - name = "Supermatter"; - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"eZ" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"fY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/power/energy_accumulator/grounding_rod/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"gJ" = ( -/obj/structure/table/reinforced, -/obj/item/paper/crumpled{ - info = "Explosive testing on site is STRICTLY forbidden, as this outpost's walls are lined with explosives intended for intentional self-destruct purposes that may be set off prematurely through careless experiments."; - name = "Explosives Testing Warning"; - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson{ - pixel_y = 5 - }, -/obj/item/clothing/glasses/material/mining{ - pixel_y = 2 - }, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"gX" = ( -/obj/machinery/airalarm/directional/north{ - req_access = list(150) - }, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/matter_bin/bluespace, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/micro_laser/quadultra, -/obj/item/stock_parts/manipulator/femto, -/obj/item/stock_parts/manipulator/femto, -/obj/item/stock_parts/manipulator/femto, -/obj/item/stock_parts/manipulator/femto, -/obj/item/stock_parts/manipulator/femto, -/obj/item/stock_parts/manipulator/femto, -/obj/structure/rack, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"hJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/catwalk_floor/iron_dark, -/area/ruin/syndicate_lava_base/testlab) -"hK" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_mistake" - }, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"iQ" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"js" = ( -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"kE" = ( -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"kP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"lR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/power/energy_accumulator/grounding_rod/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"me" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"ol" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"on" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Experimentation Lab"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/modular_map_connector, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"oo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/power/energy_accumulator/tesla_coil/anchored, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"oV" = ( -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"qY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"rT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/power/emitter/welded{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"rX" = ( -/obj/machinery/atmospherics/components/unary/passive_vent, -/obj/structure/lattice/catwalk, -/turf/template_noop, -/area/ruin/syndicate_lava_base/testlab) -"sa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"uG" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/pipe_dispenser, -/obj/item/rpd_upgrade/unwrench, -/obj/structure/rack, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"uT" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"xD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"xI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"xT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"yO" = ( -/obj/machinery/power/supermatter, -/obj/structure/window/reinforced/plasma/spawner, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Au" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"AS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"AV" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"Ce" = ( -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"EC" = ( -/obj/machinery/door/poddoor{ - id = "lavalandsyndi_mistake" - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"GD" = ( -/obj/item/stack/sheet/plasmarglass, -/obj/structure/window/reinforced/plasma/spawner, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"HC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airalarm/directional/south{ - req_access = list(150) - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"It" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"IG" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"JO" = ( -/obj/machinery/atmospherics/components/trinary/filter/on{ - dir = 1; - filter_type = list("nitrogen") - }, -/obj/structure/window/reinforced/plasma/spawner, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Lc" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"Rn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Rp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Vo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Vp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"XN" = ( -/obj/machinery/atmospherics/components/tank/nitrogen, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"XS" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Yj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"Ys" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) -"ZR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/engine, -/area/ruin/syndicate_lava_base/testlab) - -(1,1,1) = {" -aA -aA -aA -aA -aA -aA -aA -aA -em -em -aA -aA -aA -"} -(2,1,1) = {" -aA -aA -em -em -em -em -em -em -em -eZ -gJ -aA -aA -"} -(3,1,1) = {" -aA -em -em -uT -Au -dO -XN -uG -em -kE -xD -aA -aA -"} -(4,1,1) = {" -em -em -gX -Lc -Lc -hJ -kE -kE -eq -kE -HC -aA -aA -"} -(5,1,1) = {" -em -bs -Yj -qY -qY -qY -Ys -xT -em -kE -aU -aA -aA -"} -(6,1,1) = {" -hK -me -XS -fY -GD -oV -js -kP -IG -kE -xI -be -aA -"} -(7,1,1) = {" -EC -me -XS -Rn -js -yO -js -rT -IG -Vp -ef -AV -on -"} -(8,1,1) = {" -em -me -AS -oo -JO -Ce -Rp -lR -em -ol -kE -aA -aA -"} -(9,1,1) = {" -em -It -Vo -ZR -iQ -em -aA -aA -aA -aA -aA -aA -aA -"} -(10,1,1) = {" -rX -sa -sa -em -em -em -aA -aA -aA -aA -aA -aA -aA -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm deleted file mode 100644 index 806a50429562..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_syndicate_base1/mistake_unlikely.dmm +++ /dev/null @@ -1,139 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"c" = ( -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/syndicate{ - pixel_y = 7 - }, -/obj/item/storage/box/monkeycubes/syndicate, -/obj/item/paper/crumpled{ - info = "Explosive testing on site is STRICTLY forbidden, as this outpost's walls are lined with explosives intended for intentional self-destruct purposes that may be set off prematurely through careless experiments."; - name = "Explosives Testing Warning"; - pixel_x = -6; - pixel_y = -3 - }, -/obj/machinery/airalarm/directional/north{ - req_access = list(150) - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"d" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/main) -"i" = ( -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"n" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"w" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"A" = ( -/obj/structure/sign/warning/explosives/alt{ - pixel_x = 32 - }, -/obj/structure/closet/firecloset, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"B" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/ruin/syndicate_lava_base/testlab) -"F" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"K" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west{ - req_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"N" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, -/obj/machinery/door/airlock/hatch{ - name = "Experimentation Lab"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/modular_map_connector, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) -"P" = ( -/obj/machinery/door/airlock/external{ - name = "external experimentation"; - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/ruin/syndicate_lava_base/testlab) -"Q" = ( -/obj/structure/table/reinforced, -/obj/item/restraints/handcuffs, -/obj/item/taperecorder, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/syndicate_lava_base/testlab) - -(1,1,1) = {" -a -B -B -B -a -a -"} -(2,1,1) = {" -a -B -c -Q -K -a -"} -(3,1,1) = {" -a -P -i -F -b -N -"} -(4,1,1) = {" -d -n -w -A -a -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm deleted file mode 100644 index b19e02fa0b75..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ufo_crash.dmm +++ /dev/null @@ -1,461 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/closed/wall/mineral/abductor, -/area/lavaland/surface/outdoors) -"d" = ( -/turf/closed/wall/mineral/abductor, -/area/ruin/unpowered) -"j" = ( -/obj/machinery/abductor/experiment{ - team_number = 100 - }, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"k" = ( -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"l" = ( -/obj/machinery/abductor/pad{ - team_number = 100 - }, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"o" = ( -/obj/item/hemostat/alien, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"p" = ( -/obj/effect/mob_spawn/corpse/human/abductor, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"q" = ( -/obj/structure/closet/abductor, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"s" = ( -/obj/structure/table/optable/abductor, -/obj/item/cautery/alien, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"t" = ( -/obj/structure/table/abductor, -/obj/item/storage/box/alienhandcuffs, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"v" = ( -/obj/item/scalpel/alien, -/obj/item/surgical_drapes, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"w" = ( -/obj/item/retractor/alien, -/obj/item/paper/guides/antag/abductor, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"y" = ( -/obj/machinery/abductor/gland_dispenser, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"z" = ( -/obj/structure/table/abductor, -/obj/item/surgicaldrill/alien, -/obj/item/circular_saw/alien, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) -"A" = ( -/obj/structure/bed/abductor, -/turf/open/floor/plating/abductor{ - initial_gas = list("oxygen" = 14, "nitrogen" = 30) - }, -/area/ruin/unpowered) - -(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 -c -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -c -d -a -a -a -a -a -a -"} -(5,1,1) = {" -a -a -d -j -k -k -a -y -d -a -"} -(6,1,1) = {" -a -a -d -k -o -s -v -z -d -a -"} -(7,1,1) = {" -a -a -d -l -p -k -w -A -d -a -"} -(8,1,1) = {" -a -a -c -d -q -t -q -d -c -a -"} -(9,1,1) = {" -a -a -b -c -d -d -d -c -b -a -"} -(10,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(11,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(12,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(13,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(14,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(15,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(16,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(17,1,1) = {" -a -b -b -b -b -b -b -b -a -a -"} -(18,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(19,1,1) = {" -a -a -b -b -b -b -b -b -b -a -"} -(20,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(21,1,1) = {" -a -b -b -b -b -b -b -b -a -a -"} -(22,1,1) = {" -a -b -b -b -b -b -b -b -a -a -"} -(23,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(24,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(25,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(26,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(27,1,1) = {" -a -a -b -b -b -b -b -b -a -a -"} -(28,1,1) = {" -a -b -b -b -b -b -b -b -a -a -"} -(29,1,1) = {" -a -b -b -b -b -b -b -b -a -a -"} -(30,1,1) = {" -a -b -b -b -b -b -b -b -b -a -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wizard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wizard.dmm deleted file mode 100644 index e46d4f505e1b..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_wizard.dmm +++ /dev/null @@ -1,755 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"b" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"c" = ( -/turf/template_noop, -/area/template_noop) -"d" = ( -/obj/structure/stone_tile/slab, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"e" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"f" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"g" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"h" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"i" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"j" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"k" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"l" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"m" = ( -/obj/structure/stone_tile/surrounding_tile/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"n" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"o" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"p" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/table/bronze, -/obj/item/disk/data/knight_gear, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"q" = ( -/obj/structure/table/bronze, -/obj/item/stack/sheet/mineral/runite{ - amount = 5 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"r" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/table/bronze, -/obj/item/stack/sheet/mineral/runite{ - amount = 5 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"s" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"t" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"u" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"v" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"w" = ( -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/turf/open/indestructible/necropolis, -/area/lavaland/surface/outdoors) -"x" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"y" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"z" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"A" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"B" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"C" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"D" = ( -/turf/closed/indestructible/riveted/boss, -/area/lavaland/surface/outdoors) -"E" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"F" = ( -/obj/structure/stone_tile/slab, -/obj/effect/mapping_helpers/no_lava, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"G" = ( -/turf/closed/indestructible/riveted/boss/see_through, -/area/lavaland/surface/outdoors) -"H" = ( -/obj/structure/necropolis_gate, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/fans/tiny/invisible, -/obj/effect/decal/cleanable/blood, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"I" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/closed/mineral/volcanic/lava_land_surface, -/area/lavaland/surface/outdoors) -"J" = ( -/obj/structure/fluff/divine/convertaltar, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"K" = ( -/mob/living/simple_animal/hostile/dark_wizard, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) - -(1,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(2,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(3,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(4,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(5,1,1) = {" -c -c -a -a -a -c -c -c -c -c -c -c -c -c -a -a -a -a -a -a -"} -(6,1,1) = {" -c -c -a -a -a -c -c -a -a -c -c -a -a -a -a -a -b -b -a -a -"} -(7,1,1) = {" -c -c -c -a -d -a -a -a -a -a -a -a -F -a -b -b -b -b -b -a -"} -(8,1,1) = {" -c -c -a -a -a -a -a -a -a -a -a -a -D -b -b -b -b -b -b -a -"} -(9,1,1) = {" -c -c -a -a -a -a -e -j -o -t -y -D -D -b -K -b -b -b -K -a -"} -(10,1,1) = {" -c -c -a -a -a -a -f -k -p -u -z -D -G -b -b -b -b -b -b -a -"} -(11,1,1) = {" -c -c -a -a -a -a -g -l -q -v -A -E -H -b -b -b -J -b -b -a -"} -(12,1,1) = {" -c -c -a -a -a -a -h -m -r -w -B -D -G -b -b -b -b -b -b -a -"} -(13,1,1) = {" -c -c -a -a -a -a -i -n -s -x -C -D -D -b -K -b -b -b -K -a -"} -(14,1,1) = {" -c -c -c -a -a -a -a -a -a -a -a -a -D -b -b -b -b -b -b -a -"} -(15,1,1) = {" -c -c -c -a -d -a -a -a -a -a -a -a -I -a -b -b -b -b -b -a -"} -(16,1,1) = {" -c -c -a -a -a -a -c -c -c -a -a -a -a -a -a -a -b -b -a -a -"} -(17,1,1) = {" -c -c -a -a -a -c -c -c -c -c -c -c -c -a -a -a -a -a -a -c -"} -(18,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(19,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} -(20,1,1) = {" -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm deleted file mode 100644 index 3cf1169c0bbb..000000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ /dev/null @@ -1,1553 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/template_noop, -/area/template_noop) -"b" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"d" = ( -/obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"e" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"f" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"g" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"i" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"j" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"l" = ( -/obj/structure/alien/weeds/node, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"o" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/gun/ballistic/automatic/pistol, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"r" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"t" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"u" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"v" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"w" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"y" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"z" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/under/rank/security/officer, -/obj/item/clothing/suit/armor/vest, -/obj/item/melee/baton/security/loaded, -/obj/item/clothing/head/helmet, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"B" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"C" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"E" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"F" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ - desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; - name = "alien queen"; - pixel_x = -16; - plants_off = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"G" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"H" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"I" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/decal/cleanable/blood, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/glasses/night, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"K" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"L" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"M" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"Q" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) -"Y" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall{ - move_force = 1000; - move_resist = 3000; - pull_force = 1000 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/ruin/unpowered/xenonest) - -(1,1,1) = {" -a -a -a -G -G -G -G -G -G -G -G -G -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(2,1,1) = {" -a -a -a -G -b -b -b -b -b -b -b -b -G -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(3,1,1) = {" -a -a -G -G -b -g -e -e -b -g -g -b -Y -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(4,1,1) = {" -a -a -G -b -b -g -g -g -g -E -g -e -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(5,1,1) = {" -a -a -G -b -g -g -y -b -b -b -y -b -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(6,1,1) = {" -a -a -G -b -g -g -w -g -F -u -I -b -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(7,1,1) = {" -a -a -G -b -e -t -g -g -g -H -u -g -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(8,1,1) = {" -a -a -G -b -i -u -b -g -l -g -t -e -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(9,1,1) = {" -a -a -G -b -o -v -g -b -g -g -e -b -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(10,1,1) = {" -a -a -G -b -g -u -b -g -g -g -y -e -b -G -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(11,1,1) = {" -a -a -G -b -b -g -t -g -g -t -g -g -b -G -a -a -a -a -a -a -a -a -a -a -a -b -b -b -b -a -"} -(12,1,1) = {" -a -a -G -G -b -e -g -g -g -g -g -g -b -G -a -a -a -a -a -a -a -a -a -a -b -b -M -i -b -b -"} -(13,1,1) = {" -a -a -a -G -b -b -g -g -l -g -g -b -b -G -a -a -a -a -a -a -a -a -a -b -b -e -u -Q -g -b -"} -(14,1,1) = {" -a -a -a -G -G -b -b -g -g -g -b -b -G -G -a -a -a -a -a -a -a -a -a -b -i -g -l -g -e -b -"} -(15,1,1) = {" -a -a -a -a -G -G -b -b -b -b -b -G -G -a -a -a -a -a -a -a -a -b -b -b -g -g -g -i -b -b -"} -(16,1,1) = {" -a -a -a -a -a -G -b -l -l -b -G -G -a -a -a -a -a -a -a -a -b -b -g -j -g -e -b -b -b -a -"} -(17,1,1) = {" -a -a -a -a -a -a -b -E -g -b -b -G -b -b -b -b -b -b -b -b -b -g -g -b -b -b -b -a -a -a -"} -(18,1,1) = {" -a -a -a -a -a -a -b -g -g -E -b -b -b -g -g -g -g -g -g -b -b -g -b -b -a -a -a -a -a -a -"} -(19,1,1) = {" -a -a -a -a -a -a -b -b -g -g -g -b -g -g -g -g -g -g -l -g -g -g -b -a -a -a -a -a -a -a -"} -(20,1,1) = {" -b -b -b -b -a -a -a -b -b -g -l -g -g -g -b -b -b -b -g -g -f -b -b -a -a -a -a -a -a -a -"} -(21,1,1) = {" -b -e -i -b -b -b -b -b -b -g -g -g -g -b -b -a -a -b -b -g -g -b -a -a -a -a -a -a -a -a -"} -(22,1,1) = {" -d -f -j -g -b -b -g -g -g -g -g -g -b -b -a -a -a -b -g -g -g -b -a -a -a -a -a -a -a -a -"} -(23,1,1) = {" -d -g -e -l -g -g -g -b -b -g -b -b -b -a -a -a -a -b -g -g -b -b -a -a -a -a -a -a -a -a -"} -(24,1,1) = {" -b -b -i -i -b -b -b -b -b -g -b -a -a -a -a -a -a -b -g -g -b -a -a -a -a -a -a -a -a -a -"} -(25,1,1) = {" -a -b -b -b -b -a -a -a -b -E -b -b -a -a -a -a -a -b -g -L -b -b -b -a -a -a -a -a -a -b -"} -(26,1,1) = {" -a -a -a -a -a -a -a -a -b -g -g -b -a -a -a -a -a -b -g -g -g -g -b -b -b -a -a -a -b -b -"} -(27,1,1) = {" -a -a -a -a -a -a -b -b -b -g -g -b -b -a -a -a -a -b -b -g -g -g -g -g -b -b -b -b -y -g -"} -(28,1,1) = {" -a -a -a -a -a -b -b -B -g -g -l -e -b -a -a -a -b -b -g -g -b -b -g -g -g -b -l -g -g -g -"} -(29,1,1) = {" -a -a -a -a -a -b -z -C -j -g -e -i -b -a -a -a -b -g -g -b -b -b -b -g -l -b -l -f -g -g -"} -(30,1,1) = {" -a -a -a -a -a -b -i -u -g -i -i -b -b -a -a -a -b -g -b -b -a -a -b -b -b -b -b -y -g -g -"} -(31,1,1) = {" -a -a -a -a -a -b -b -b -g -b -b -b -a -a -a -a -b -g -b -b -a -a -a -a -a -a -a -b -g -g -"} -(32,1,1) = {" -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -b -g -g -b -a -a -a -a -a -a -a -b -g -g -"} -(33,1,1) = {" -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -b -b -l -b -a -a -a -a -a -a -b -b -g -a -"} -(34,1,1) = {" -a -a -a -a -a -a -a -b -l -b -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -b -a -a -a -"} -(35,1,1) = {" -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -a -a -a -a -"} -(36,1,1) = {" -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -a -b -b -g -b -a -a -a -a -a -a -a -a -a -a -"} -(37,1,1) = {" -a -a -a -a -a -a -a -b -g -b -a -a -a -a -a -b -b -g -g -b -a -a -a -a -a -a -a -a -a -a -"} -(38,1,1) = {" -a -a -a -a -a -a -b -b -g -b -b -b -b -b -b -b -g -g -b -b -a -a -a -a -a -a -a -a -a -a -"} -(39,1,1) = {" -a -a -a -a -a -b -b -g -g -e -b -b -g -g -K -g -g -b -b -a -a -a -a -a -a -a -a -a -a -a -"} -(40,1,1) = {" -a -a -a -a -a -b -i -E -g -g -g -g -g -b -b -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -"} -(41,1,1) = {" -a -a -a -a -b -b -e -g -l -g -e -b -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(42,1,1) = {" -a -a -a -a -b -e -g -g -i -i -b -b -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} -(43,1,1) = {" -a -a -a -a -r -b -b -b -b -b -b -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/DJstation.dmm b/_maps/RandomRuins/SpaceRuins/DJstation.dmm index 35026f647e75..3f61b1785f69 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation.dmm @@ -5,7 +5,7 @@ /turf/template_noop, /area/space/nearstation) "d" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/spawner/random/maintenance/two, /turf/open/floor/plating, /area/ruin/space/djstation/service) @@ -14,7 +14,7 @@ /turf/template_noop, /area/space/nearstation) "f" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/maintenance_hatch{ name = "Telecommunications" }, @@ -28,7 +28,7 @@ /turf/open/floor/plating, /area/ruin/space/djstation/service) "i" = ( -/obj/structure/reagent_dispensers/plumbed{ +/obj/structure/reagent_dispensers{ dir = 8 }, /turf/open/floor/plating, @@ -60,12 +60,11 @@ /area/ruin/space/djstation/service) "w" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation/service) "x" = ( /obj/machinery/door/airlock/maintenance_hatch, -/obj/machinery/duct, /turf/open/floor/plating, /area/ruin/space/djstation/service) "y" = ( @@ -73,24 +72,24 @@ /turf/open/floor/plating, /area/ruin/space/djstation/service) "A" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation/service) "C" = ( /turf/open/floor/plating, /area/ruin/space/djstation/service) "D" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/ruin/space/djstation/service) "E" = ( /obj/machinery/power/solar/fake, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/djstation/solars) "G" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/small/directional/south, /obj/structure/closet/crate, /obj/item/clothing/head/ushanka, @@ -98,29 +97,24 @@ /turf/open/floor/plating, /area/ruin/space/djstation/service) "I" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/duct, /turf/open/floor/plating, /area/ruin/space/djstation/service) "M" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/closet/crate, /obj/effect/spawner/random/maintenance/five, /turf/open/floor/plating, /area/ruin/space/djstation/service) -"N" = ( -/obj/machinery/duct, -/turf/open/floor/plating, -/area/ruin/space/djstation/service) "O" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/djstation/solars) "P" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation/service) "R" = ( @@ -128,14 +122,14 @@ desc = "A high-capacity superconducting magnetic energy storage (SMES) unit."; name = "power storage unit" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation/service) "S" = ( /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation/service) "U" = ( @@ -513,11 +507,11 @@ o o o x -N -N +C +C x I -N +C C A C diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm index 5e295a394ea6..467ed14e8107 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_1.dmm @@ -3,7 +3,6 @@ /turf/template_noop, /area/template_noop) "d" = ( -/obj/machinery/duct, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/grimy, /area/ruin/space/djstation) @@ -25,15 +24,10 @@ }, /turf/template_noop, /area/template_noop) -"u" = ( -/obj/machinery/duct, -/turf/open/floor/iron/grimy, -/area/ruin/space/djstation) "v" = ( /obj/structure/toilet{ pixel_y = 8 }, -/obj/machinery/duct, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) @@ -79,10 +73,6 @@ }, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) -"V" = ( -/obj/machinery/duct, -/turf/closed/wall, -/area/ruin/space/djstation) "W" = ( /obj/structure/lattice, /turf/template_noop, @@ -114,7 +104,7 @@ a i A Z -u +Z i F i @@ -127,7 +117,7 @@ i M Z d -V +i v i Y diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm index 1c1e4da6f5af..d5d86831a518 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_2.dmm @@ -67,7 +67,6 @@ /turf/template_noop, /area/space/nearstation) "Z" = ( -/obj/machinery/duct, /turf/open/floor/iron/dark/textured, /area/ruin/space/djstation) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm index 6abcb22813e4..a9a84d4c2279 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/quarters_3.dmm @@ -15,7 +15,6 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) "d" = ( @@ -23,8 +22,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/djstation) "f" = ( -/obj/machinery/duct, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/djstation) "h" = ( /obj/structure/table/reinforced/plastitaniumglass, @@ -52,14 +50,13 @@ /area/ruin/space/djstation) "t" = ( /obj/machinery/light/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/djstation) "u" = ( -/obj/machinery/duct, /obj/machinery/door/airlock/silver{ name = "Bedroom" }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/djstation) "v" = ( /obj/structure/window/plasma, @@ -74,7 +71,6 @@ spawn_scatter_radius = 1 }, /obj/structure/table/reinforced/rglass, -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) "z" = ( @@ -84,7 +80,7 @@ /area/ruin/space/djstation) "A" = ( /obj/effect/spawner/random/clothing/wardrobe_closet, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/djstation) "B" = ( /obj/machinery/door/airlock/public/glass{ @@ -94,7 +90,6 @@ /turf/template_noop, /area/template_noop) "C" = ( -/obj/machinery/duct, /obj/machinery/light/directional/south, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) @@ -102,7 +97,6 @@ /turf/open/floor/carpet/purple, /area/ruin/space/djstation) "H" = ( -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) "J" = ( @@ -126,14 +120,12 @@ /area/ruin/space/djstation) "T" = ( /obj/structure/dresser, -/obj/machinery/duct, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/djstation) "U" = ( /obj/machinery/door/airlock/silver{ name = "Bathroom" }, -/obj/machinery/duct, /turf/open/floor/iron/freezer, /area/ruin/space/djstation) "V" = ( @@ -155,10 +147,6 @@ /obj/effect/spawner/random/structure/grille, /turf/template_noop, /area/space/nearstation) -"Z" = ( -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) (1,1,1) = {" a @@ -178,9 +166,9 @@ a a W i -Z -Z -Z +V +V +V V b i @@ -191,7 +179,7 @@ a a W i -Z +V V d V diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm index aad589848134..5be0c2269bd8 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_1.dmm @@ -2,10 +2,6 @@ "a" = ( /turf/closed/wall, /area/ruin/space/djstation) -"b" = ( -/obj/machinery/duct, -/turf/open/floor/iron, -/area/ruin/space/djstation) "g" = ( /obj/modular_map_root/djstation{ key = "kitchen" @@ -20,7 +16,6 @@ /turf/open/floor/plating, /area/ruin/space/djstation) "i" = ( -/obj/machinery/duct, /turf/open/floor/plating, /area/ruin/space/djstation) "k" = ( @@ -49,7 +44,6 @@ pixel_y = 4 }, /obj/machinery/light/small/directional/east, -/obj/machinery/duct, /turf/open/floor/plating, /area/ruin/space/djstation) "v" = ( @@ -79,7 +73,7 @@ /turf/open/floor/iron/vaporwave, /area/ruin/space/djstation) "A" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/djstation) "H" = ( @@ -87,7 +81,7 @@ /turf/open/floor/iron/vaporwave, /area/ruin/space/djstation) "J" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/south, /turf/open/floor/iron, /area/ruin/space/djstation) @@ -111,7 +105,6 @@ /turf/open/floor/iron/vaporwave, /area/ruin/space/djstation) "U" = ( -/obj/machinery/duct, /obj/modular_map_root/djstation{ key = "quarters" }, @@ -173,7 +166,7 @@ Y a k M -b +w r "} (6,1,1) = {" @@ -182,7 +175,7 @@ Y Y q w -b +w i a "} diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm index 4cfb748992a3..32228cc19f26 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_2.dmm @@ -27,10 +27,10 @@ pixel_x = -5; pixel_y = 8 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/djstation) "d" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/chair/office{ dir = 1 }, @@ -59,14 +59,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/djstation) -"g" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/ruin/space/djstation) "j" = ( /obj/effect/turf_decal/tile/green{ dir = 8 @@ -75,7 +67,6 @@ dir = 4 }, /obj/effect/turf_decal/tile/green, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/space/djstation) "k" = ( @@ -85,7 +76,6 @@ /turf/open/floor/iron/dark, /area/ruin/space/djstation) "m" = ( -/obj/machinery/duct, /obj/modular_map_root/djstation{ key = "quarters" }, @@ -101,7 +91,7 @@ /obj/structure/chair/wood{ dir = 1 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/djstation) "q" = ( /obj/item/paper/fluff/ruins/djstation, @@ -156,7 +146,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/djstation) "z" = ( /obj/effect/turf_decal/tile/green, @@ -167,7 +157,7 @@ /area/ruin/space/djstation) "C" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/green, /obj/effect/turf_decal/tile/green{ dir = 4 @@ -175,7 +165,6 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/space/djstation) "F" = ( @@ -216,7 +205,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/djstation) "O" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/green{ dir = 8 }, @@ -239,9 +228,8 @@ /turf/open/floor/plating, /area/ruin/space/djstation) "T" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/green, -/obj/machinery/duct, /turf/open/floor/iron/dark, /area/ruin/space/djstation) "U" = ( @@ -264,10 +252,10 @@ /turf/open/floor/iron/dark, /area/ruin/space/djstation) "W" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/djstation) "X" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/green{ dir = 8 }, @@ -353,7 +341,7 @@ a a x z -g +z C a "} diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm index c6804a107a34..fc3960e2a3fe 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/radioroom_3.dmm @@ -3,7 +3,7 @@ /turf/closed/wall, /area/ruin/space/djstation) "b" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) @@ -14,7 +14,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) "g" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) "h" = ( @@ -48,17 +48,12 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) -"A" = ( -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/djstation) "G" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/west, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) "K" = ( -/obj/machinery/duct, /obj/modular_map_root/djstation{ key = "quarters" }, @@ -87,11 +82,6 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/space/djstation) -"T" = ( -/obj/machinery/light/directional/east, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/djstation) "V" = ( /obj/structure/table, /obj/item/radio/intercom{ @@ -158,8 +148,8 @@ s h r V -A -T +h +s "} (6,1,1) = {" y @@ -168,8 +158,8 @@ a a h h -A -A +h +h a "} (7,1,1) = {" diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm index 98c3d08508a9..d78e69fa0295 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/solars_1.dmm @@ -40,7 +40,7 @@ /area/space/nearstation) "u" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/modular_map_connector, /turf/template_noop, /area/ruin/space/djstation/solars) @@ -67,14 +67,14 @@ /area/ruin/space/djstation/solars) "O" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/djstation/solars) "T" = ( /turf/template_noop, /area/template_noop) "U" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/solar/fake, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/djstation/solars) diff --git a/_maps/RandomRuins/SpaceRuins/DJstation/solars_2.dmm b/_maps/RandomRuins/SpaceRuins/DJstation/solars_2.dmm index 4e374e7a8f11..ab1fb944a7f3 100644 --- a/_maps/RandomRuins/SpaceRuins/DJstation/solars_2.dmm +++ b/_maps/RandomRuins/SpaceRuins/DJstation/solars_2.dmm @@ -9,11 +9,11 @@ /area/template_noop) "L" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/djstation/solars) "P" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/solar/fake, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/djstation/solars) @@ -23,7 +23,7 @@ /area/space/nearstation) "V" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/modular_map_connector, /turf/template_noop, /area/ruin/space/djstation/solars) diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm index 7978a92e37b1..da30d27fc0e3 100644 --- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm +++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm @@ -21,7 +21,7 @@ /obj/structure/frame/computer{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "ao" = ( @@ -32,7 +32,7 @@ /area/ruin/space/derelict/atmospherics) "aq" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/solars/derelict_starboard) "as" = ( @@ -46,7 +46,7 @@ /obj/machinery/door/airlock/external/ruin{ name = "External Engineering" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/derelict/solar_control) "ax" = ( @@ -65,12 +65,12 @@ /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "aB" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "aC" = ( /obj/machinery/power/smes, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "aF" = ( @@ -109,7 +109,7 @@ /area/ruin/space/derelict/solar_control) "aQ" = ( /obj/machinery/door/window, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "aR" = ( @@ -127,7 +127,7 @@ name = "Starboard Solar APC"; pixel_x = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "aU" = ( @@ -153,12 +153,12 @@ /obj/machinery/computer/monitor/secret{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "ba" = ( /obj/machinery/light/small/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bc" = ( @@ -188,7 +188,7 @@ name = "Starboard Solar Access"; req_access_txt = "10" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "bj" = ( @@ -328,7 +328,7 @@ id = "derelictsolar"; name = "Derelict Solar Array" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_aft) "ch" = ( @@ -356,7 +356,7 @@ /area/ruin/space/derelict/bridge/access) "ct" = ( /obj/machinery/door/airlock/maintenance, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cv" = ( @@ -393,7 +393,7 @@ /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cF" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cG" = ( @@ -421,7 +421,7 @@ /area/ruin/space/derelict/gravity_generator) "cQ" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cR" = ( @@ -457,7 +457,7 @@ name = "E.V.A."; req_access_txt = "18" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cW" = ( @@ -469,7 +469,7 @@ /area/ruin/space/derelict/bridge/access) "cX" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "cY" = ( @@ -527,17 +527,17 @@ /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "dm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/derelict/bridge/access) "dp" = ( /obj/machinery/door/airlock/public/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "dq" = ( /obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "dr" = ( @@ -572,7 +572,7 @@ /area/ruin/space/derelict/bridge/access) "dy" = ( /obj/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "dz" = ( @@ -784,11 +784,11 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "eK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge) "eN" = ( @@ -940,10 +940,6 @@ }, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"fw" = ( -/obj/effect/mob_spawn/ghost_role/drone/derelict, -/turf/open/floor/iron/airless, -/area/ruin/space/derelict/bridge/access) "fx" = ( /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/access) @@ -994,7 +990,7 @@ /area/ruin/space/derelict/singularity_engine) "fK" = ( /obj/machinery/door/window, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge/access) "fN" = ( @@ -1020,7 +1016,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/access) "fT" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/access) "fV" = ( @@ -1043,16 +1039,16 @@ /turf/closed/wall, /area/ruin/space/derelict/hallway/primary) "gb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "gc" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "gd" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/access) "gg" = ( @@ -1077,7 +1073,7 @@ /turf/closed/wall/r_wall, /area/ruin/space/derelict/hallway/primary) "gl" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/primary) "go" = ( @@ -1433,10 +1429,6 @@ /obj/item/storage/box/lights/mixed, /turf/open/floor/plating/airless, /area/ruin/space/derelict/singularity_engine) -"in" = ( -/obj/effect/mob_spawn/ghost_role/drone/derelict, -/turf/open/floor/plating/airless, -/area/ruin/space/derelict/singularity_engine) "ip" = ( /obj/item/stack/cable_coil/cut, /obj/effect/mapping_helpers/broken_floor, @@ -1604,14 +1596,14 @@ /turf/open/floor/iron, /area/ruin/space/derelict/arrival) "jf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "jg" = ( /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "ji" = ( @@ -1679,12 +1671,12 @@ /area/ruin/space/derelict/medical/chapel) "jy" = ( /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/medical/chapel) "jz" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "jB" = ( @@ -1739,12 +1731,12 @@ /area/ruin/space/derelict/medical/chapel) "jM" = ( /obj/machinery/door/window, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/medical/chapel) "jN" = ( /obj/machinery/door/window/left/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "jO" = ( @@ -1756,7 +1748,7 @@ name = "Toxins Research"; req_access_txt = "7" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "jR" = ( @@ -1764,7 +1756,7 @@ /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "jS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "jT" = ( @@ -1782,7 +1774,7 @@ /turf/open/floor/plating, /area/ruin/space/derelict/arrival) "jX" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) @@ -1799,7 +1791,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "kb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/unpowered/no_grav) "kd" = ( @@ -1808,12 +1800,12 @@ /area/ruin/unpowered/no_grav) "kf" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/unpowered/no_grav) "kg" = ( /obj/structure/window/fulltile, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/unpowered/no_grav) "kh" = ( @@ -1821,15 +1813,15 @@ name = "Toxins Research"; req_access_txt = "7" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/arrival) "ki" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/arrival) "kj" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/derelict/arrival) "kl" = ( @@ -1860,7 +1852,7 @@ /area/ruin/space/derelict/hallway/primary) "kr" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/arrival) "ks" = ( @@ -1873,7 +1865,7 @@ dir = 4; icon_state = "right" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "kB" = ( @@ -1913,7 +1905,7 @@ name = "Security"; req_access_txt = "1" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "kS" = ( @@ -1943,7 +1935,7 @@ /area/ruin/space/derelict/hallway/primary) "la" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary) "lc" = ( @@ -2040,7 +2032,7 @@ /area/ruin/space/derelict/atmospherics) "lB" = ( /obj/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary/port) "lC" = ( @@ -2112,7 +2104,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "lQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/primary/port) "lT" = ( @@ -2256,7 +2248,7 @@ /area/ruin/space/derelict/hallway/secondary) "mC" = ( /obj/item/wirecutters, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "mD" = ( @@ -2272,7 +2264,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/atmospherics) "mI" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "mJ" = ( @@ -2326,14 +2318,14 @@ /area/ruin/space/derelict/hallway/secondary) "nc" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "ne" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict9" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "nf" = ( @@ -2341,42 +2333,42 @@ /obj/effect/turf_decal/plaque{ icon_state = "derelict10" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "ng" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict11" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "nh" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict12" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "ni" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict13" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "nj" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict14" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "nk" = ( /obj/effect/turf_decal/plaque{ icon_state = "derelict15" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "nl" = ( @@ -2384,7 +2376,7 @@ /obj/effect/turf_decal/plaque{ icon_state = "derelict16" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/hallway/secondary) "no" = ( @@ -2455,7 +2447,7 @@ name = "Aft Solar Access"; req_access_txt = "10" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "nD" = ( @@ -2466,7 +2458,7 @@ /area/ruin/space/derelict/hallway/secondary) "nF" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "nG" = ( @@ -2480,7 +2472,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/derelict/hallway/secondary) "nJ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/closed/wall/r_wall, /area/ruin/space/derelict/se_solar) "nL" = ( @@ -2497,7 +2489,7 @@ /area/ruin/space/derelict/hallway/secondary) "nO" = ( /obj/machinery/power/smes, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "nR" = ( @@ -2515,8 +2507,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, -/obj/effect/mob_spawn/ghost_role/drone/derelict, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "nV" = ( @@ -2532,7 +2523,7 @@ id = "derelictsolar"; name = "Primary Solar Control" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "nZ" = ( @@ -2544,7 +2535,7 @@ name = "Worn-out APC"; pixel_x = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/se_solar) "oa" = ( @@ -2571,7 +2562,7 @@ dir = 4; icon_state = "right" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "og" = ( @@ -2595,12 +2586,12 @@ /area/ruin/space/derelict/se_solar) "ok" = ( /obj/machinery/door/airlock/external/ruin, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "ol" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/solars/derelict_aft) "op" = ( @@ -2608,7 +2599,7 @@ id = "derelictsolar"; name = "Derelict Solar Array" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_aft) @@ -2628,16 +2619,16 @@ /area/ruin/space/derelict/bridge) "oY" = ( /obj/machinery/door/airlock/vault/derelict, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "ph" = ( /obj/machinery/power/tracker, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_starboard) "po" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/stack/cable_coil/five, /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/ai_upload) @@ -2722,7 +2713,7 @@ id = "derelictsolar"; name = "Derelict Solar Array" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_starboard) "uE" = ( @@ -2822,14 +2813,14 @@ /obj/structure/table, /obj/machinery/power/apc/auto_name/directional/south, /obj/effect/spawner/random/maintenance, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/bridge) "zI" = ( /obj/machinery/power/terminal{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/ai_upload) "zJ" = ( @@ -2941,7 +2932,7 @@ /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Ef" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_starboard) @@ -2990,7 +2981,7 @@ /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "GD" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) @@ -3000,7 +2991,7 @@ /turf/template_noop, /area/space/nearstation) "GP" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Hl" = ( @@ -3053,7 +3044,7 @@ dir = 4; icon_state = "right" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Ip" = ( @@ -3133,12 +3124,12 @@ /obj/machinery/computer/vaultcontroller{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "LG" = ( /obj/item/aicard, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) @@ -3146,7 +3137,7 @@ /obj/machinery/power/smes/engineering{ charge = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/ai_upload) "Mi" = ( @@ -3167,7 +3158,7 @@ /turf/template_noop, /area/space/nearstation) "MQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/se_solar) "MS" = ( @@ -3176,7 +3167,7 @@ /area/ruin/space/derelict/atmospherics) "Ni" = ( /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "Nk" = ( @@ -3228,7 +3219,7 @@ /area/ruin/space/derelict/medical) "OJ" = ( /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/derelict/bridge/ai_upload) "OT" = ( @@ -3238,7 +3229,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/derelict/solar_control) "Pm" = ( @@ -3281,7 +3272,7 @@ /area/ruin/space/derelict/medical) "QS" = ( /obj/machinery/power/tracker, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/derelict_aft) "QW" = ( @@ -3396,7 +3387,7 @@ /turf/open/floor/iron/white/airless, /area/ruin/space/derelict/medical) "YQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/derelict/bridge/ai_upload) "Zu" = ( @@ -7552,7 +7543,7 @@ ez ez ez dW -in +dW dr iP ay @@ -9458,7 +9449,7 @@ aa aa GI cs -fw +fx fx fx fR diff --git a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm index 820ba2ce84c6..0529b9485785 100644 --- a/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm +++ b/_maps/RandomRuins/SpaceRuins/abandonedzoo.dmm @@ -4,7 +4,7 @@ /area/template_noop) "ac" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) "ag" = ( @@ -46,7 +46,7 @@ name = "Bio Containment"; req_one_access_txt = "47" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -79,7 +79,7 @@ /turf/template_noop, /area/template_noop) "aL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -141,11 +141,11 @@ /area/ruin/space/has_grav/abandonedzoo) "be" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "bf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/smes/engineering, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) @@ -165,9 +165,6 @@ /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "bl" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "bm" = ( @@ -322,7 +319,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) "ix" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/shieldwallgen/unlocked/anchored, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) @@ -331,7 +328,7 @@ name = "Bio-Research Station" }, /obj/effect/turf_decal/tile/green/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) "iZ" = ( @@ -342,7 +339,7 @@ pixel_y = -4 }, /obj/item/wirecutters, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -357,7 +354,7 @@ /area/ruin/space/has_grav/abandonedzoo) "kp" = ( /obj/machinery/light/small/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -394,16 +391,16 @@ /area/ruin/space/has_grav/abandonedzoo) "oS" = ( /obj/effect/turf_decal/tile/green/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) "qX" = ( /obj/machinery/power/shieldwallgen/unlocked/anchored, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) "sT" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/shieldwallgen/unlocked/anchored, /turf/open/floor/plating, /area/ruin/space/has_grav/abandonedzoo) @@ -422,7 +419,7 @@ /area/ruin/space/has_grav/abandonedzoo) "wc" = ( /obj/machinery/light/small/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -438,7 +435,7 @@ "wi" = ( /obj/machinery/power/terminal, /obj/effect/turf_decal/tile/green/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/abandonedzoo) "Ap" = ( @@ -457,13 +454,13 @@ /area/ruin/space/has_grav/abandonedzoo) "Gh" = ( /obj/machinery/power/shieldwallgen/unlocked/anchored, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/abandonedzoo) "GX" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/abandonedzoo) "Ig" = ( @@ -474,7 +471,7 @@ "LD" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/unlocked{ dir = 8; environ = 0; @@ -568,7 +565,6 @@ /obj/item/surgicaldrill, /obj/item/hemostat, /obj/item/scalpel, -/obj/item/surgical_drapes, /obj/item/retractor, /obj/item/cautery, /obj/item/circular_saw, diff --git a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm index acfbced15ce1..28621e35b8cf 100644 --- a/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm +++ b/_maps/RandomRuins/SpaceRuins/bigderelict1.dmm @@ -55,11 +55,11 @@ /turf/open/floor/engine, /area/ruin/space/has_grav/derelictoutpost/cargobay) "an" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "ao" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/east{ start_charge = 0 }, @@ -254,13 +254,13 @@ /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bb" = ( /obj/machinery/power/smes, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bc" = ( /obj/structure/table, /obj/item/stock_parts/cell/hyper, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "be" = ( @@ -357,11 +357,11 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bs" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "bt" = ( @@ -513,7 +513,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "ca" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/east{ start_charge = 0 }, @@ -538,7 +538,7 @@ /area/ruin/space/has_grav/derelictoutpost/dockedship) "ce" = ( /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "ch" = ( @@ -551,11 +551,11 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "cj" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "ck" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/south{ start_charge = 0 }, @@ -584,7 +584,7 @@ /area/ruin/space/has_grav/derelictoutpost/powerstorage) "cq" = ( /obj/structure/barricade/wooden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "cr" = ( @@ -593,7 +593,7 @@ req_access_txt = "10" }, /obj/structure/barricade/wooden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/powerstorage) "cu" = ( @@ -615,12 +615,12 @@ name = "checkpoint security doors" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "cA" = ( /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost) "cC" = ( @@ -658,18 +658,18 @@ /obj/structure/closet/crate{ icon_state = "crateopen" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cI" = ( /obj/structure/janitorialcart, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cJ" = ( /obj/structure/alien/weeds/creature, /obj/item/mop, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cK" = ( @@ -679,7 +679,7 @@ name = "dried blood trail" }, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cL" = ( @@ -689,13 +689,13 @@ name = "dried blood trail" }, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cM" = ( /obj/structure/alien/weeds/creature, /obj/structure/glowshroom/single, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "cO" = ( @@ -783,7 +783,7 @@ }, /obj/structure/alien/weeds/creature, /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "dg" = ( @@ -793,7 +793,7 @@ name = "dried blood trail" }, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargobay) "dh" = ( @@ -808,7 +808,7 @@ desc = "A pried-open airlock. Scratch marks mark the sidings of the door."; name = "pried-open airlock" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/cargobay) @@ -820,7 +820,7 @@ }, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "dk" = ( @@ -856,7 +856,7 @@ name = "dried blood trail" }, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "ds" = ( @@ -869,7 +869,7 @@ name = "dried blood trail" }, /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "dC" = ( @@ -882,7 +882,7 @@ /area/ruin/space/has_grav/derelictoutpost) "dI" = ( /obj/structure/alien/weeds/creature, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "dJ" = ( @@ -917,7 +917,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "dN" = ( @@ -1017,7 +1017,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "eh" = ( @@ -1047,7 +1047,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "el" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/east{ start_charge = 0 }, @@ -1080,7 +1080,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eu" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "ew" = ( @@ -1115,7 +1115,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eA" = ( @@ -1165,7 +1165,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eJ" = ( @@ -1179,7 +1179,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost/cargostorage) "eK" = ( @@ -1188,7 +1188,7 @@ icon_state = "trails_1"; name = "dried blood trail" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/derelictoutpost) "eL" = ( diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index 6bd2aa64706f..d9ae790abff3 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -245,7 +245,6 @@ /turf/open/misc/asteroid/airless, /area/ruin/unpowered/no_grav) "Gt" = ( -/obj/structure/closet/crate/grave, /obj/item/clothing/head/collectable/swat, /turf/open/misc/asteroid/airless, /area/ruin/unpowered/no_grav) diff --git a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm index d2824700b2db..5dfad30231db 100644 --- a/_maps/RandomRuins/SpaceRuins/caravanambush.dmm +++ b/_maps/RandomRuins/SpaceRuins/caravanambush.dmm @@ -90,7 +90,7 @@ /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/button/door/directional/north{ id = "caravantrade3_cargo_port"; name = "Cargo Blast Door Control" @@ -223,7 +223,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/light/small/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/button/door/directional/north{ id = "caravantrade2_cargo_port"; name = "Cargo Blast Door Control" @@ -383,7 +383,7 @@ "gt" = ( /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/secure/weapon, -/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted, +/obj/item/gun/ballistic/revolver/grenadelauncher, /turf/open/floor/iron/dark/airless, /area/shuttle/caravan/freighter3) "gv" = ( @@ -440,7 +440,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "gT" = ( @@ -559,7 +559,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "hv" = ( @@ -665,7 +665,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter3) "ia" = ( @@ -746,7 +746,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "is" = ( @@ -853,7 +853,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "iU" = ( @@ -933,7 +933,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter2) "jq" = ( @@ -1082,7 +1082,7 @@ /obj/effect/turf_decal/bot_white, /obj/structure/closet/crate/secure/gear, /obj/item/storage/belt/bandolier, -/obj/item/storage/belt/holster, +/obj/item/storage/belt/holster/shoulder, /turf/open/floor/iron/dark/airless, /area/shuttle/caravan/freighter2) "jZ" = ( diff --git a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm b/_maps/RandomRuins/SpaceRuins/clownplanet.dmm deleted file mode 100644 index 4885ff4e4915..000000000000 --- a/_maps/RandomRuins/SpaceRuins/clownplanet.dmm +++ /dev/null @@ -1,1002 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/mineral{ - color = "#de1d1d" - }, -/area/ruin/powered/clownplanet) -"ac" = ( -/turf/open/floor/bronze, -/area/ruin/powered/clownplanet) -"ad" = ( -/obj/structure/flora/rock/pile, -/turf/open/floor/bronze, -/area/ruin/powered/clownplanet) -"ae" = ( -/turf/closed/indestructible/rock{ - color = "#de1d1d" - }, -/area/ruin/powered/clownplanet) -"af" = ( -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/clownplanet) -"ag" = ( -/turf/open/floor/engine, -/area/ruin/powered/clownplanet) -"ah" = ( -/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer, -/turf/open/floor/engine, -/area/ruin/powered/clownplanet) -"ai" = ( -/obj/structure/sign/warning, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/clownplanet) -"aj" = ( -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"ak" = ( -/obj/structure/flora/ausbushes/palebush, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"al" = ( -/obj/structure/sign/warning/xeno_mining, -/turf/closed/wall/mineral/sandstone, -/area/ruin/powered/clownplanet) -"am" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"an" = ( -/obj/structure/flora/ausbushes/reedbush, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"ao" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/banana, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"ap" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aq" = ( -/obj/structure/flora/ausbushes/grassybush, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"ar" = ( -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"as" = ( -/obj/structure/water_source/puddle, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"at" = ( -/turf/open/floor/iron/bluespace, -/area/ruin/powered/clownplanet) -"au" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"av" = ( -/turf/open/floor/mineral/bananium, -/area/ruin/powered/clownplanet) -"aw" = ( -/obj/machinery/door/airlock/bananium, -/turf/open/floor/grass, -/area/ruin/powered/clownplanet) -"ax" = ( -/obj/item/assembly/mousetrap/armed, -/turf/open/floor/iron/bluespace, -/area/ruin/powered/clownplanet) -"ay" = ( -/obj/structure/flora/tree/jungle, -/turf/open/floor/iron/bluespace, -/area/ruin/powered/clownplanet) -"az" = ( -/obj/structure/signpost, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aA" = ( -/obj/structure/flora/rock, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aB" = ( -/obj/structure/flora/ausbushes/ywflowers, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aD" = ( -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) -"aE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aF" = ( -/obj/item/shovel, -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) -"aG" = ( -/obj/effect/mob_spawn/corpse/human/clown, -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) -"aH" = ( -/turf/closed/mineral/bananium{ - color = "#de1d1d" - }, -/area/ruin/powered/clownplanet) -"aI" = ( -/obj/item/gps/spaceruin, -/obj/item/pickaxe, -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) -"aJ" = ( -/obj/item/flashlight/lamp/bananalamp, -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) -"aK" = ( -/obj/structure/flora/ausbushes/sunnybush, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aM" = ( -/obj/structure/flora/rock/pile, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aN" = ( -/obj/structure/mineral_door/sandstone, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/bronze, -/area/ruin/powered/clownplanet) -"aO" = ( -/obj/structure/flora/rock/pile, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aQ" = ( -/obj/structure/flora/ausbushes/pointybush, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aR" = ( -/obj/structure/flora/ausbushes/ppflowers, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aS" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aT" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aU" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aV" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aY" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"aZ" = ( -/obj/structure/flora/rock, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"ba" = ( -/obj/structure/flora/ausbushes/reedbush, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"bb" = ( -/obj/structure/flora/rock, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"bc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"bd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"be" = ( -/obj/structure/flora/ausbushes/ywflowers, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/grass{ - color = "#1eff00" - }, -/area/ruin/powered/clownplanet) -"bf" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/stripes/white/box, -/turf/open/floor/bluespace, -/area/ruin/powered/clownplanet) -"bg" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/stripes/white/box, -/turf/open/floor/bluespace, -/area/ruin/powered/clownplanet) -"bh" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/stripes/white/box, -/turf/open/floor/bluespace, -/area/ruin/powered/clownplanet) -"bi" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/ruin/powered/clownplanet) -"bj" = ( -/obj/structure/mineral_door/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/ruin/powered/clownplanet) -"bk" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/stripes/white/box, -/turf/open/floor/bluespace, -/area/ruin/powered/clownplanet) -"bl" = ( -/obj/item/bedsheet/clown, -/obj/structure/bed, -/obj/effect/mob_spawn/corpse/human/clown, -/turf/open/floor/wood, -/area/ruin/powered/clownplanet) -"bm" = ( -/obj/structure/barricade/wooden, -/obj/structure/barricade/wooden/crude, -/turf/open/misc/asteroid, -/area/ruin/powered/clownplanet) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -aw -aw -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -aZ -ax -ax -bb -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -ae -ae -ae -ao -aj -aj -ba -at -at -aL -aj -bf -bh -ae -ae -ae -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -ae -ae -ao -as -aj -aj -aS -aW -at -at -bc -aE -aB -aj -aA -ab -ae -ae -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -ae -ae -aj -ap -aj -au -aj -aU -av -av -av -av -aL -aj -bi -bi -ab -aH -ae -ae -aa -aa -"} -(6,1,1) = {" -aa -aa -ae -aj -aj -aj -ao -aj -aj -aU -at -av -at -at -aL -aj -bj -bl -ab -aI -aH -ae -aa -aa -"} -(7,1,1) = {" -aa -ae -ae -aj -ak -aj -aj -aj -ar -aU -av -av -av -av -aL -aK -bi -ab -ab -aG -aH -ae -ae -aa -"} -(8,1,1) = {" -aa -ae -am -am -aE -aq -ap -aj -aS -aW -at -at -at -at -bc -aE -aj -ab -aD -aD -ab -ab -ae -aa -"} -(9,1,1) = {" -aa -ae -af -af -aL -aj -aj -aj -aT -at -av -av -av -av -at -aL -aj -ab -aD -ab -ab -ab -ae -aa -"} -(10,1,1) = {" -ae -ae -ac -ai -aM -aE -ak -aj -aU -at -av -at -ay -av -at -aL -au -ab -aD -ab -ab -ab -ae -ae -"} -(11,1,1) = {" -ae -ac -ad -af -al -aR -aj -aj -aU -at -av -av -av -av -at -aL -az -ab -aD -aD -ab -ab -ab -ae -"} -(12,1,1) = {" -ae -ac -ag -ag -aN -aL -aj -an -aU -at -at -at -at -at -at -aL -aj -ab -ab -aD -ab -aH -ab -ae -"} -(13,1,1) = {" -ae -ac -ah -ag -aN -aL -aj -aj -aU -at -av -av -av -av -at -aL -aj -aq -ab -aD -ab -aJ -aH -ae -"} -(14,1,1) = {" -ae -ad -ac -af -al -aL -au -aj -aU -at -at -av -at -at -at -aL -aj -aj -bm -aD -aD -aG -ab -ae -"} -(15,1,1) = {" -ae -ae -ac -ai -aO -aP -aj -ar -aU -at -at -at -av -at -at -aL -aj -aQ -ab -aD -ab -ab -ae -ae -"} -(16,1,1) = {" -aa -ae -af -af -aL -aj -aj -aj -aU -at -av -av -av -av -at -aL -aB -ab -ab -aD -ab -ab -ae -aa -"} -(17,1,1) = {" -aa -ae -aC -aC -aP -aj -ap -aj -aV -aX -at -at -at -at -bd -aP -aj -ab -aD -aD -aH -ab -ae -aa -"} -(18,1,1) = {" -aa -ae -ae -aj -an -aj -aq -aj -an -aU -av -av -av -av -aL -aj -aj -ab -aF -ab -ab -ae -ae -aa -"} -(19,1,1) = {" -aa -aa -ae -aj -aj -aj -ao -aj -aj -aU -at -av -at -at -aL -aK -aj -ab -aG -ab -ab -ae -aa -aa -"} -(20,1,1) = {" -aa -aa -ae -ae -aj -ar -aj -ak -aj -aU -av -at -av -av -aL -aj -aj -ab -aH -ab -ae -ae -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -ae -ae -ao -as -aj -aj -aY -aX -at -at -bd -be -aj -aj -aA -ab -ae -ae -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -ae -ae -ae -ao -aj -aj -aU -at -at -aL -aj -bg -bk -ae -ae -ae -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -ae -ae -ae -ae -aZ -ax -ax -bb -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ae -ae -aw -aw -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/SpaceRuins/crashedship.dmm b/_maps/RandomRuins/SpaceRuins/crashedship.dmm index cccaf5a52209..d0aa3f201da0 100644 --- a/_maps/RandomRuins/SpaceRuins/crashedship.dmm +++ b/_maps/RandomRuins/SpaceRuins/crashedship.dmm @@ -1,34 +1,25 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"am" = ( -/obj/machinery/power/port_gen/pacman/super, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) -"au" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 2 - }, -/turf/open/floor/bamboo, -/area/awaymission/bmpship/fore) -"aH" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) -"aM" = ( +"ab" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/firelock_frame, +/obj/structure/door_assembly/door_assembly_med, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/midship) -"bc" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, +"am" = ( +/obj/machinery/power/port_gen/pacman/super, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) +/area/awaymission/bmpship/aft) +"au" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 2 + }, +/turf/open/floor/bamboo, +/area/awaymission/bmpship/fore) "bj" = ( /obj/machinery/door/airlock/security/glass{ name = "Security Checkpoint"; @@ -36,13 +27,23 @@ }, /turf/open/floor/iron, /area/awaymission/bmpship/aft) +"bu" = ( +/obj/effect/spawner/random/structure/girder, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "ck" = ( /obj/effect/turf_decal/trimline/neutral/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) +"cB" = ( +/obj/structure/girder/displaced, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "cE" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/command{ emergency = 1; name = "E.V.A. Storage"; @@ -63,22 +64,6 @@ /obj/item/stack/sheet/mineral/wood, /turf/open/misc/asteroid, /area/awaymission/bmpship/fore) -"di" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/door_assembly/door_assembly_com, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/mineral/plastitanium/airless, -/area/awaymission/bmpship/fore) -"dD" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/fore) "dZ" = ( /obj/item/stack/ore/glass, /turf/open/misc/asteroid, @@ -93,6 +78,21 @@ }, /turf/open/floor/pod/light, /area/awaymission/bmpship/aft) +"em" = ( +/obj/machinery/porta_turret{ + dir = 8; + installation = /obj/item/gun/energy/lasercannon + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret + }, +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "eC" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -112,6 +112,27 @@ /obj/effect/turf_decal/delivery/white, /turf/open/floor/iron/dark/airless, /area/awaymission/bmpship/midship) +"eX" = ( +/obj/structure/door_assembly/door_assembly_mhatch, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) +"fa" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/line, +/obj/machinery/porta_turret{ + dir = 8; + installation = /obj/item/gun/energy/lasercannon; + + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret + }, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "fc" = ( /obj/structure/lattice, /turf/template_noop, @@ -124,15 +145,11 @@ "fp" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/awaymission/bmpship/midship) -"fA" = ( -/obj/machinery/light/broken/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/fore) -"fI" = ( -/obj/structure/closet/mini_fridge, +"fO" = ( +/obj/structure/grille/broken, +/obj/item/shard, /obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) "fQ" = ( /turf/open/floor/iron, @@ -153,9 +170,17 @@ /area/awaymission/bmpship/fore) "gH" = ( /obj/effect/turf_decal/trimline/neutral/filled/shrink_cw, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) +"gR" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/corner, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "hh" = ( /obj/structure/lattice, /obj/item/shard{ @@ -180,54 +205,35 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/floor/pod/light, /area/awaymission/bmpship/aft) +"ib" = ( +/obj/structure/table_frame/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/awaymission/bmpship/fore) "ip" = ( /obj/machinery/light/broken/directional/north, /turf/open/floor/iron, /area/awaymission/bmpship/aft) -"iI" = ( -/obj/structure/grille/broken, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) -"iK" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "iU" = ( /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"iW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/structure/cable, -/obj/machinery/light/broken/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "ja" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/bmpship/fore) "kc" = ( /turf/template_noop, /area/template_noop) -"km" = ( +"kz" = ( /obj/structure/girder/displaced, -/obj/effect/mapping_helpers/broken_floor, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) +/area/awaymission/bmpship/aft) "kM" = ( /obj/item/bedsheet/yellow, /turf/open/misc/asteroid, /area/awaymission/bmpship/fore) -"kZ" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/fore) "le" = ( /obj/structure/lattice, /obj/structure/disposalpipe/broken{ @@ -236,7 +242,7 @@ /turf/template_noop, /area/template_noop) "lf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/warm/directional/west, /turf/open/floor/iron/white/side{ dir = 4 @@ -245,8 +251,15 @@ "lg" = ( /turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) +"lw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 4 + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/aft) "lx" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/unlocked{ dir = 1; environ = 0; @@ -254,6 +267,11 @@ }, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) +"lE" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "lR" = ( /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, @@ -266,7 +284,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/item/gps/spaceruin, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/awaymission/bmpship/aft) "mP" = ( /obj/machinery/door/firedoor/closed, @@ -277,7 +296,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Entry Hall" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/awaymission/bmpship/aft) "nb" = ( @@ -291,22 +310,9 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/iron/dark/airless, /area/awaymission/bmpship/midship) -"nh" = ( -/obj/effect/turf_decal/trimline/brown/filled/warning{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/brown/corner, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "nl" = ( /turf/open/floor/plating/airless, /area/awaymission/bmpship/fore) -"nI" = ( -/obj/structure/girder/displaced, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "nY" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/tile/neutral{ @@ -318,6 +324,27 @@ /obj/effect/spawner/random/structure/crate_abandoned, /turf/open/floor/iron/dark, /area/awaymission/bmpship/aft) +"od" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 8 + }, +/obj/item/screwdriver{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/item/screwdriver{ + pixel_x = 3; + pixel_y = 9 + }, +/obj/item/screwdriver, +/obj/item/paper/fluff/ruins/crashedship/scribbled{ + pixel_x = -7; + pixel_y = 2 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/aft) "om" = ( /obj/effect/turf_decal/loading_area, /obj/effect/turf_decal/tile/neutral{ @@ -352,7 +379,7 @@ /area/template_noop) "pb" = ( /obj/effect/turf_decal/trimline/neutral/filled/shrink_cw, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/awaymission/bmpship/aft) "pe" = ( @@ -368,12 +395,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/awaymission/bmpship/aft) -"pB" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/glass, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "pO" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 10 @@ -383,18 +404,6 @@ }, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) -"pP" = ( -/obj/machinery/porta_turret{ - dir = 8; - installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" - }, -/obj/effect/turf_decal/trimline/brown/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/line, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "pT" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -406,11 +415,6 @@ dir = 10 }, /area/awaymission/bmpship/midship) -"pZ" = ( -/obj/structure/girder/displaced, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "qm" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -418,7 +422,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side/airless{ dir = 4 }, @@ -447,10 +451,6 @@ /obj/item/stack/ore/silver, /turf/open/misc/asteroid, /area/awaymission/bmpship/fore) -"qO" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "rb" = ( /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) @@ -458,6 +458,10 @@ /obj/structure/lattice/catwalk, /turf/template_noop, /area/template_noop) +"rq" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/midship) "rt" = ( /obj/item/chair, /turf/open/misc/asteroid/airless, @@ -473,26 +477,23 @@ "sr" = ( /obj/effect/spawner/random/maintenance/four, /obj/structure/closet/crate, -/obj/item/grenade/chem_grenade/smart_metal_foam, +/obj/item/grenade/chem_grenade/metalfoam, /obj/item/electronics/airlock, /turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) +"sF" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/bmpship/fore) +"sY" = ( +/obj/structure/closet/mini_fridge, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/awaymission/bmpship/fore) "tb" = ( /obj/item/kirbyplants, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/awaymission/bmpship/fore) -"tm" = ( -/obj/effect/turf_decal/trimline/brown/filled/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/line, -/obj/machinery/porta_turret{ - dir = 8; - installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" - }, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "tn" = ( /obj/structure/chair{ dir = 4 @@ -516,7 +517,7 @@ "tN" = ( /obj/structure/table/wood, /obj/item/paper/fluff/ruins/crashedship/captains_log, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/awaymission/bmpship/fore) "uf" = ( /obj/machinery/suit_storage_unit/open, @@ -525,13 +526,14 @@ }, /turf/open/floor/engine, /area/awaymission/bmpship/midship) +"ug" = ( +/obj/item/chair, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "um" = ( /turf/open/floor/plating, /area/awaymission/bmpship/fore) -"ut" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/aft) "uz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/airless, @@ -546,6 +548,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) +"vu" = ( +/obj/structure/girder, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "vJ" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 1 @@ -569,6 +576,14 @@ "wi" = ( /turf/open/floor/bamboo, /area/awaymission/bmpship/fore) +"wj" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/corner, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "xa" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -587,6 +602,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) +"xn" = ( +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "xy" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -618,19 +639,20 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/awaymission/bmpship/aft) "yb" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/trimline/neutral/filled/end, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"yk" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/fore) +"ys" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "yB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -655,16 +677,11 @@ /obj/item/stack/tile/wood, /turf/template_noop, /area/template_noop) -"zm" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/decoration, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood/parquet, -/area/awaymission/bmpship/fore) "zA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/awaymission/bmpship/aft) "zC" = ( /obj/structure/grille/broken, @@ -673,9 +690,16 @@ "zD" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/bmpship/midship) +"zM" = ( +/obj/item/shard{ + icon_state = "medium" + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/fore) "zO" = ( /obj/effect/turf_decal/trimline/neutral/filled/warning, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/awaymission/bmpship/aft) "zW" = ( @@ -689,13 +713,12 @@ /obj/item/dice/d6, /turf/open/floor/iron/checker/airless, /area/awaymission/bmpship/midship) -"Af" = ( -/obj/item/chair, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) +"Ai" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/fore) "Ak" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/command{ emergency = 1; name = "Teleport Access"; @@ -708,11 +731,6 @@ "Au" = ( /turf/closed/mineral/random, /area/awaymission/bmpship) -"AF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "AM" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -749,16 +767,6 @@ }, /turf/open/floor/iron, /area/awaymission/bmpship/aft) -"BS" = ( -/obj/structure/girder, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) -"Cg" = ( -/obj/structure/grille/broken, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "Cj" = ( /obj/effect/turf_decal/trimline/brown/filled/warning{ dir = 1 @@ -769,7 +777,7 @@ "Cz" = ( /obj/effect/turf_decal/siding/blue/corner, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "CK" = ( @@ -779,12 +787,20 @@ /obj/effect/turf_decal/siding/wood/corner, /turf/open/floor/bamboo, /area/awaymission/bmpship/fore) +"CL" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "CM" = ( /obj/effect/turf_decal/trimline/neutral/filled/corner, /obj/effect/turf_decal/trimline/neutral/corner{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/awaymission/bmpship/aft) "CN" = ( @@ -794,7 +810,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/corner{ dir = 4 }, @@ -814,7 +830,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side/airless{ dir = 5 }, @@ -902,6 +918,14 @@ dir = 8 }, /area/awaymission/bmpship/aft) +"Gb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light/broken/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "Gf" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -913,6 +937,11 @@ dir = 5 }, /area/awaymission/bmpship/midship) +"Gn" = ( +/obj/structure/girder/displaced, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "Gv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -928,11 +957,6 @@ /obj/structure/frame/machine, /turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) -"GM" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "Hb" = ( /obj/structure/shuttle/engine/heater{ dir = 8 @@ -964,23 +988,17 @@ "HT" = ( /obj/effect/turf_decal/siding/blue, /obj/effect/turf_decal/trimline/neutral/filled/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"HZ" = ( -/obj/structure/grille/broken, -/obj/item/shard, -/obj/effect/mapping_helpers/broken_floor, +"Io" = ( +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/fore) +/area/awaymission/bmpship/aft) "ID" = ( /obj/item/stack/rods, /turf/template_noop, /area/template_noop) -"IG" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood/parquet, -/area/awaymission/bmpship/fore) "IM" = ( /obj/item/shard, /obj/structure/lattice/catwalk, @@ -993,6 +1011,11 @@ }, /turf/open/floor/iron/dark/side/airless, /area/awaymission/bmpship/midship) +"JD" = ( +/obj/structure/grille/broken, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/aft) "JN" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -1013,31 +1036,14 @@ }, /area/awaymission/bmpship/aft) "Ko" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 4 }, /area/awaymission/bmpship/midship) -"Ku" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 8 - }, -/obj/item/screwdriver{ - pixel_x = 3; - pixel_y = -4 - }, -/obj/item/screwdriver{ - pixel_x = 3; - pixel_y = 9 - }, -/obj/item/screwdriver, -/obj/item/paper/fluff/ruins/crashedship/scribbled{ - pixel_x = -7; - pixel_y = 2 - }, +"KC" = ( /obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/airless, +/turf/open/floor/plating/airless, /area/awaymission/bmpship/aft) "KD" = ( /turf/open/misc/asteroid, @@ -1050,17 +1056,16 @@ /obj/item/light/tube/broken, /turf/template_noop, /area/template_noop) -"Ln" = ( -/obj/effect/turf_decal/trimline/brown/filled/warning, -/obj/effect/turf_decal/trimline/brown/line{ - dir = 1 +"Lm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/machinery/porta_turret{ - dir = 8; - installation = /obj/item/gun/energy/lasercannon; - set_obj_flags = "EMAGGED" +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, -/turf/open/floor/plating/airless, +/obj/structure/firelock_frame, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, /area/awaymission/bmpship/midship) "Lo" = ( /obj/machinery/door/airlock/command{ @@ -1068,7 +1073,7 @@ name = "Teleport Access"; req_access_txt = "17" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) "LX" = ( @@ -1081,7 +1086,7 @@ dir = 8 }, /obj/effect/turf_decal/trimline/neutral/filled/shrink_ccw, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/broken/directional/south, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) @@ -1096,13 +1101,8 @@ }, /turf/open/floor/mineral/plastitanium, /area/awaymission/bmpship/aft) -"Mi" = ( -/obj/structure/table_frame/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood/parquet, -/area/awaymission/bmpship/fore) "Mw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/awaymission/bmpship/midship) "MC" = ( @@ -1120,14 +1120,6 @@ dir = 4 }, /area/awaymission/bmpship/aft) -"Nn" = ( -/obj/effect/turf_decal/trimline/brown/filled/warning{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/brown/corner, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "NB" = ( /obj/effect/turf_decal/trimline/white/filled/warning{ dir = 1 @@ -1140,6 +1132,10 @@ icon_state = "podfloor_dark" }, /area/awaymission/bmpship/fore) +"NE" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/aft) "NF" = ( /obj/effect/turf_decal/stripes/end, /obj/machinery/door/airlock/external/ruin, @@ -1154,7 +1150,11 @@ }, /turf/template_noop, /area/template_noop) -"Ob" = ( +"Og" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) +"Ow" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) @@ -1169,17 +1169,12 @@ /obj/machinery/door/airlock/public/glass{ name = "Entry Hall" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/awaymission/bmpship/aft) "OF" = ( /turf/closed/wall/mineral/titanium/nodiagonal, /area/template_noop) -"OZ" = ( -/obj/structure/door_assembly/door_assembly_mhatch, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) "Pb" = ( /obj/effect/turf_decal/trimline/blue/filled/warning, /obj/effect/turf_decal/trimline/blue/line{ @@ -1210,17 +1205,12 @@ /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"Qy" = ( -/obj/structure/door_assembly/door_assembly_com, +"Ry" = ( /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) -"RA" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, /area/awaymission/bmpship/fore) "RL" = ( /obj/effect/turf_decal/stripes/line{ @@ -1234,21 +1224,40 @@ "RU" = ( /turf/closed/mineral/random/high_chance, /area/awaymission/bmpship) +"Sl" = ( +/obj/machinery/light/broken/directional/south, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/fore) +"Su" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/awaymission/bmpship/fore) +"SF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/door_assembly/door_assembly_com, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, +/area/awaymission/bmpship/fore) +"Tc" = ( +/obj/machinery/light/broken/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/iron/airless, +/area/awaymission/bmpship/midship) "Tj" = ( /obj/effect/turf_decal/trimline/neutral/filled/shrink_ccw, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/broken/directional/south, /turf/open/floor/iron, /area/awaymission/bmpship/aft) -"To" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/midship) -"Ty" = ( -/obj/effect/spawner/random/structure/girder, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) "TP" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -1257,13 +1266,6 @@ /obj/effect/spawner/random/structure/tank_holder, /turf/open/floor/pod/light, /area/awaymission/bmpship/aft) -"Uc" = ( -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/aft) "Uk" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 1 @@ -1286,40 +1288,22 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/trimline/neutral/filled/end{ dir = 1 }, /turf/open/floor/iron/airless, /area/awaymission/bmpship/midship) -"US" = ( -/obj/machinery/light/broken/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron/airless, -/area/awaymission/bmpship/midship) -"Vp" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, +"UZ" = ( +/obj/machinery/power/floodlight, +/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) -"VH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/door_assembly/door_assembly_med, +/area/awaymission/bmpship/aft) +"Wf" = ( +/obj/effect/spawner/random/structure/girder, /obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/mineral/plastitanium/airless, -/area/awaymission/bmpship/midship) -"VL" = ( -/obj/effect/mapping_helpers/burnt_floor, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/midship) +/area/awaymission/bmpship/aft) "Wi" = ( /obj/machinery/light/broken/directional/south, /obj/effect/turf_decal/trimline/red/filled/line, @@ -1328,6 +1312,15 @@ }, /turf/open/floor/iron/dark/side/airless, /area/awaymission/bmpship/aft) +"Wz" = ( +/obj/structure/grille/broken, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) +"WW" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) "Xu" = ( /obj/item/shard, /obj/item/stack/rods, @@ -1343,7 +1336,7 @@ /turf/open/floor/iron/airless, /area/awaymission/bmpship/aft) "XW" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/awaymission/bmpship/fore) "Ya" = ( /obj/effect/decal/cleanable/glass, @@ -1351,20 +1344,9 @@ /area/awaymission/bmpship/aft) "Ye" = ( /obj/effect/turf_decal/trimline/neutral/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/awaymission/bmpship/aft) -"Yl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/firelock_frame, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/mineral/plastitanium/airless, -/area/awaymission/bmpship/fore) "Yp" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -1380,20 +1362,51 @@ /obj/item/stack/rods, /turf/open/misc/asteroid, /area/awaymission/bmpship/fore) -"Zl" = ( -/obj/machinery/power/floodlight, -/obj/effect/mapping_helpers/burnt_floor, +"Zb" = ( +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/effect/turf_decal/trimline/brown/line{ + dir = 1 + }, +/obj/machinery/porta_turret{ + dir = 8; + installation = /obj/item/gun/energy/lasercannon; + + }, +/obj/effect/mapping_helpers/atom_injector/obj_flag{ + inject_flags = 1; + target_type = /obj/machinery/porta_turret + }, /turf/open/floor/plating/airless, -/area/awaymission/bmpship/aft) +/area/awaymission/bmpship/midship) "Zm" = ( /obj/item/stack/ore/diamond, /turf/open/misc/asteroid/airless, /area/awaymission/bmpship/fore) "ZA" = ( /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/awaymission/bmpship/fore) +"ZS" = ( +/obj/structure/door_assembly/door_assembly_com, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/awaymission/bmpship/midship) +"ZX" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/awaymission/bmpship/fore) +"ZY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/firelock_frame, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/mineral/plastitanium/airless, +/area/awaymission/bmpship/fore) (1,1,1) = {" kc @@ -1691,9 +1704,9 @@ Fy zA hI uF -qO -iK -iK +Io +KC +KC kc kc kc @@ -1710,7 +1723,7 @@ kc kc kc rm -nh +gR uF fc fc @@ -1738,7 +1751,7 @@ kc kc kc rm -pP +em uF Hb Hb @@ -1747,7 +1760,7 @@ qB Yw uF uF -qO +Io mb fc kc @@ -1775,7 +1788,7 @@ uF EW uF xJ -iK +KC fc fc kc @@ -1794,7 +1807,7 @@ kc kc kc rm -pP +em uF ip fQ @@ -1803,9 +1816,9 @@ Mg Gv yL yL -iK +KC kc -iK +KC kc kc kc @@ -1830,7 +1843,7 @@ Ye mP CU qm -iW +Gb vk Nc LX @@ -1860,9 +1873,9 @@ uF uF uF uF -iK +KC fm -GM +Wf kc kc kc @@ -1889,13 +1902,13 @@ fc fc EM fc -AF +ys uF kc kc fc -Ku -Af +od +ug kc kc "} @@ -1912,18 +1925,18 @@ om Ff Tj uF -iK +KC mb Wi uF am -iI +JD uF fc -ut +NE uF Xy -iK +KC kc kc "} @@ -1940,17 +1953,17 @@ nY Ff Ye bj -iK +KC fc fc -iK +KC sr -iK +KC vX mb kc uF -Uc +lw fc kc kc @@ -1971,14 +1984,14 @@ uF GH KF kc -nI -Zl +kz +UZ KF fc kc kc uF -iK +KC fc kc kc @@ -1998,7 +2011,7 @@ Oy uF uF mb -iK +KC uF uF lg @@ -2020,13 +2033,13 @@ kc kc ID kc -pB +xn rb iU -OZ +eX fc fc -qO +Io fc mb kc @@ -2049,17 +2062,17 @@ kc kc ID hh -bc +lE Cz Ho fp fc fc -km +cB fc -Ty +bu fc -Ob +Ow fc fc kc @@ -2077,17 +2090,17 @@ kc kc Pp fp -US +Tc HT zW -aH +WW fc zg KF kc fc -aH -Ob +WW +Ow mb fc kc @@ -2108,13 +2121,13 @@ UC rb HT le -pZ +Gn fc fc fc zg -Ty -Ob +bu +Ow MC kc kc @@ -2132,15 +2145,15 @@ kc kc kc Xu -pB -Ob +xn +Ow HT -Vp +CL fp fc -Ty -Qy -Ty +bu +ZS +bu fp fp fc @@ -2159,8 +2172,8 @@ kc kc kc rm -Nn -BS +wj +vu rb Me fp @@ -2172,8 +2185,8 @@ JN pT fp KO -aH -pB +WW +xn ID kc kc @@ -2187,7 +2200,7 @@ kc kc kc rm -tm +fa fp lx ck @@ -2200,8 +2213,8 @@ Pu yb Lo Mw -To -pZ +rq +Gn pO kc kc @@ -2217,7 +2230,7 @@ kc rm xb fp -Ob +Ow gH fp uf @@ -2229,8 +2242,8 @@ Jr UC rb rb -BS -Ln +vu +Zb kc kc kc @@ -2245,8 +2258,8 @@ kc rX UA UA -Yl -di +ZY +SF OF OF OF @@ -2254,10 +2267,10 @@ fp Gf yB AM -Cg -To -aH -VL +Wz +rq +WW +Og qu kc kc @@ -2283,8 +2296,8 @@ nb ts eU fp -VH -aM +ab +Lm fp fp zD @@ -2327,14 +2340,14 @@ Au Au Au kc -HZ +fO Bw -dD +Ry vg on wi au -zm +Su XW rZ rZ @@ -2356,14 +2369,14 @@ Au Au Au hh -kZ -yk -fA +zM +Ai +Sl UA wi au -Mi -RA +ib +sF dZ FP ja @@ -2389,9 +2402,9 @@ EA EA cY wi -RA +sF um -IG +ZX YU KD ja @@ -2416,7 +2429,7 @@ Zm rt CT ja -fI +sY dZ qo dZ diff --git a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm index 06b26a0b2441..5a766f369d9c 100644 --- a/_maps/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/RandomRuins/SpaceRuins/deepstorage.dmm @@ -119,7 +119,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) "aC" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) "aE" = ( @@ -127,7 +127,7 @@ name = "Recycling APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) "aG" = ( @@ -248,7 +248,7 @@ req_access_txt = "200" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/crusher) "aP" = ( @@ -403,7 +403,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "bf" = ( @@ -544,7 +544,7 @@ "by" = ( /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "bz" = ( @@ -603,28 +603,28 @@ /area/ruin/space/has_grav/deepstorage/kitchen) "bJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bN" = ( @@ -632,7 +632,7 @@ name = "Kitchen APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bO" = ( @@ -643,14 +643,14 @@ "bP" = ( /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "bQ" = ( /obj/machinery/door/airlock/public/glass{ name = "Hydroponics" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) "bR" = ( @@ -749,7 +749,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Kitchen" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/deepstorage/kitchen) "bZ" = ( @@ -760,7 +760,7 @@ "ca" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cd" = ( @@ -771,7 +771,7 @@ /area/ruin/space/has_grav/deepstorage/hydroponics) "cf" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) "cg" = ( @@ -780,7 +780,7 @@ name = "Hydroponics APC"; pixel_x = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) "ch" = ( @@ -853,7 +853,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "co" = ( @@ -894,7 +894,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cu" = ( @@ -990,7 +990,7 @@ dir = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) "cD" = ( @@ -1002,7 +1002,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) "cE" = ( @@ -1011,13 +1011,13 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cG" = ( @@ -1025,7 +1025,7 @@ dir = 10 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cH" = ( @@ -1061,7 +1061,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cL" = ( @@ -1095,7 +1095,7 @@ "cP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cQ" = ( @@ -1105,7 +1105,7 @@ pixel_x = 25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/storage) "cS" = ( @@ -1141,7 +1141,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "cW" = ( @@ -1172,15 +1172,15 @@ "da" = ( /obj/machinery/door/firedoor, /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/armory) "db" = ( /obj/structure/table, /obj/item/healthanalyzer, /obj/item/healthanalyzer, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, +/obj/item/stack/gauze, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "de" = ( @@ -1221,7 +1221,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dk" = ( @@ -1366,7 +1366,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dD" = ( @@ -1389,7 +1389,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dH" = ( @@ -1421,7 +1421,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "dN" = ( @@ -1456,7 +1456,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "dS" = ( @@ -1468,7 +1468,7 @@ name = "Dorms" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "dU" = ( @@ -1476,7 +1476,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dV" = ( @@ -1489,14 +1489,14 @@ }, /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "dY" = ( @@ -1504,7 +1504,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "eb" = ( @@ -1513,7 +1513,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "ee" = ( @@ -1524,14 +1524,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "ef" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "eh" = ( @@ -1544,7 +1544,7 @@ name = "Armory APC"; pixel_x = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "ei" = ( @@ -1576,7 +1576,7 @@ "em" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "en" = ( @@ -1613,7 +1613,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "es" = ( @@ -1624,7 +1624,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "ev" = ( @@ -1679,7 +1679,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "eD" = ( @@ -1753,7 +1753,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "eK" = ( @@ -1763,7 +1763,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "eL" = ( @@ -1776,7 +1776,7 @@ pixel_y = 25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "eO" = ( @@ -1817,7 +1817,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "eR" = ( @@ -1831,7 +1831,7 @@ }, /obj/machinery/door/firedoor, /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/airlock) "eU" = ( @@ -1839,7 +1839,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "eV" = ( @@ -1847,7 +1847,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/airlock) "eW" = ( @@ -1865,7 +1865,7 @@ /area/ruin/space/has_grav/deepstorage/airlock) "eY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, /obj/machinery/door/airlock/highsecurity{ name = "Atmospherics and Power Storage"; @@ -1911,7 +1911,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "ff" = ( @@ -1945,7 +1945,7 @@ "fl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) "fm" = ( @@ -2032,7 +2032,7 @@ pixel_x = -25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) "fy" = ( @@ -2083,7 +2083,7 @@ pixel_x = 25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "fF" = ( @@ -2215,7 +2215,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "fX" = ( @@ -2225,7 +2225,7 @@ /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "fY" = ( @@ -2235,7 +2235,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "fZ" = ( @@ -2243,7 +2243,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) "ga" = ( @@ -2296,7 +2296,7 @@ /area/ruin/space/has_grav/deepstorage/dorm) "gh" = ( /obj/machinery/power/smes/engineering, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gi" = ( @@ -2341,7 +2341,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gr" = ( @@ -2351,7 +2351,7 @@ /obj/structure/sign/warning/electricshock{ pixel_y = -32 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gu" = ( @@ -2406,7 +2406,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) "gB" = ( @@ -2453,11 +2453,11 @@ /area/ruin/space/has_grav/deepstorage) "gJ" = ( /obj/machinery/light/small/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gL" = ( @@ -2465,7 +2465,7 @@ name = "RTG Observation"; req_access_txt = "200" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gN" = ( @@ -2500,7 +2500,7 @@ /area/ruin/space/has_grav/deepstorage) "gR" = ( /obj/structure/grille, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "gT" = ( @@ -2553,13 +2553,13 @@ /area/ruin/space/has_grav/deepstorage/power) "gZ" = ( /obj/machinery/power/rtg/advanced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "ha" = ( /obj/machinery/power/rtg/advanced, /obj/machinery/light/small/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "hb" = ( @@ -2608,7 +2608,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "hi" = ( @@ -2619,7 +2619,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage) "hj" = ( @@ -2628,7 +2628,7 @@ }, /obj/machinery/firealarm/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/dorm) "hk" = ( @@ -2641,7 +2641,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/power) "hm" = ( @@ -2709,7 +2709,7 @@ /turf/closed/wall/mineral/iron, /area/ruin/space/has_grav/deepstorage/power) "po" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) "qm" = ( @@ -2727,7 +2727,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/crusher) "sL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/deepstorage/hydroponics) "wK" = ( @@ -2759,7 +2759,7 @@ pixel_y = 4 }, /obj/item/storage/medkit/toxin, -/obj/item/storage/pill_bottle/multiver, +/obj/item/storage/pill_bottle/dylovene, /obj/machinery/light/directional/south, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/deepstorage/armory) @@ -2767,7 +2767,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/deepstorage/power) "Iy" = ( diff --git a/_maps/RandomRuins/SpaceRuins/derelict7.dmm b/_maps/RandomRuins/SpaceRuins/derelict7.dmm index c9056f1aedaf..f520552fa26f 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict7.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict7.dmm @@ -251,7 +251,6 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Ca" = ( -/obj/machinery/medical_kiosk, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, diff --git a/_maps/RandomRuins/SpaceRuins/derelict8.dmm b/_maps/RandomRuins/SpaceRuins/derelict8.dmm index 5116b44f6889..e0ad82243a06 100644 --- a/_maps/RandomRuins/SpaceRuins/derelict8.dmm +++ b/_maps/RandomRuins/SpaceRuins/derelict8.dmm @@ -73,7 +73,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/ruin/space/has_grav) @@ -83,7 +83,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav) "lj" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/ruin/space/has_grav) @@ -92,7 +92,7 @@ name = "Starboard Engineering Storage" }, /obj/effect/mapping_helpers/airlock/locked, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/textured_large, /area/ruin/space/has_grav) "rB" = ( @@ -135,7 +135,7 @@ /turf/template_noop, /area/template_noop) "xD" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) @@ -149,7 +149,7 @@ "yY" = ( /obj/effect/spawner/random/trash/hobo_squat, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav) "zc" = ( /obj/item/stack/tile/iron, @@ -169,7 +169,7 @@ /obj/effect/spawner/random/maintenance/three, /obj/item/airlock_painter/decal, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav) "zK" = ( /obj/item/shard, @@ -217,7 +217,7 @@ /area/ruin/space/has_grav) "JE" = ( /obj/effect/spawner/random/trash/grille_or_waste, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "JP" = ( @@ -230,7 +230,7 @@ "KW" = ( /obj/effect/spawner/random/trash/food_packaging, /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav) "Li" = ( /obj/effect/turf_decal/stripes/line{ @@ -242,18 +242,18 @@ /area/ruin/space/has_grav) "Nl" = ( /obj/effect/spawner/random/trash/mess, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Nm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/spawner/random/maintenance, /turf/open/floor/iron, /area/ruin/space/has_grav) "NS" = ( /obj/machinery/door/airlock/maintenance, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Of" = ( @@ -292,7 +292,7 @@ /turf/open/floor/iron/dark/textured, /area/ruin/space/has_grav) "Px" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/girder/displaced, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) @@ -309,20 +309,20 @@ /area/ruin/space/has_grav) "Qp" = ( /obj/effect/spawner/random/trash/mess, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Qs" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/spawner/random/trash/caution_sign, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/ruin/space/has_grav) "SL" = ( /obj/effect/spawner/random/trash/mess, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) @@ -349,7 +349,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav) "Ym" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav) "Yp" = ( diff --git a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm b/_maps/RandomRuins/SpaceRuins/forgottenship.dmm deleted file mode 100644 index 6d7a05158ea1..000000000000 --- a/_maps/RandomRuins/SpaceRuins/forgottenship.dmm +++ /dev/null @@ -1,3413 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/template_noop, -/area/ruin/unpowered/no_grav) -"ac" = ( -/obj/machinery/porta_turret/syndicate/energy{ - armor = list("melee" = 40, "bullet" = 40, "laser" = 60, "energy" = 60, "bomb" = 60, "bio" = 0, "fire" = 100, "acid" = 100); - dir = 4; - name = "Syndicate Ship Turret"; - on = 0; - shot_delay = 10 - }, -/turf/closed/wall/r_wall/syndicate/nodiagonal, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ad" = ( -/obj/machinery/computer/operating, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ae" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate ship airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"af" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/turf/template_noop, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ag" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ah" = ( -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ai" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aj" = ( -/obj/structure/table/optable, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ak" = ( -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/structure/table/reinforced, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"al" = ( -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"am" = ( -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"an" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ao" = ( -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ap" = ( -/turf/template_noop, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aq" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ar" = ( -/obj/machinery/camera/xray{ - c_tag = "Medbay"; - dir = 6; - network = list("fsci"); - screen_loc = "" - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"as" = ( -/obj/structure/shuttle/engine/huge{ - dir = 8 - }, -/turf/template_noop, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"at" = ( -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"au" = ( -/obj/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/poddoor{ - id = "fslockdown"; - name = "Ship blast door"; - state_open = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"av" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aw" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ax" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ay" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/coin/antagtoken, -/obj/item/encryptionkey/syndicate, -/obj/item/encryptionkey/syndicate, -/obj/item/encryptionkey/syndicate, -/obj/item/dnainjector/thermal, -/obj/item/storage/box/firingpins/syndicate, -/obj/item/storage/box/firingpins/syndicate, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"az" = ( -/obj/machinery/power/port_gen/pacman/super{ - anchored = 1 - }, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aA" = ( -/obj/machinery/light/directional/north, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aB" = ( -/obj/structure/chair/comfy/black, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aC" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/obj/machinery/portable_atmospherics/scrubber{ - anchored = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aF" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aG" = ( -/obj/machinery/turretid{ - control_area = "/area/ruin/space/has_grav/syndicate_forgotten_ship"; - enabled = 0; - icon_state = "control_kill"; - lethal = 1; - name = "Ship turret control panel"; - pixel_y = 32; - req_access = null; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aI" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "fscaproom"; - name = "Room shutters control"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aJ" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aK" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aL" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aM" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aN" = ( -/obj/item/stack/sheet/mineral/uranium{ - amount = 15 - }, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aO" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aP" = ( -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aQ" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aR" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/paper/fluff/ruins/forgottenship/powerissues, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aT" = ( -/obj/machinery/computer/camera_advanced/syndie{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aU" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate ship airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aV" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aW" = ( -/obj/structure/table/reinforced, -/obj/item/toy/plush/nukeplushie, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"aX" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"aY" = ( -/turf/template_noop, -/area/ruin/unpowered/no_grav) -"aZ" = ( -/turf/closed/indestructible/syndicate, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"ba" = ( -/turf/closed/mineral/random, -/area/ruin/unpowered/no_grav) -"bb" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bc" = ( -/obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bd" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel/twenty, -/obj/item/stack/sheet/mineral/plastitanium{ - amount = 50 - }, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"be" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate ship airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bf" = ( -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Syndicate Cargo Pod APC"; - pixel_y = 25; - start_charge = 0 - }, -/obj/structure/cable, -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/circuitboard/machine/circuit_imprinter/offstation, -/obj/item/circuitboard/machine/fabricator/offstation, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/item/stack/cable_coil, -/obj/item/storage/box/stockparts/deluxe, -/obj/item/storage/box/stockparts/deluxe, -/obj/item/storage/box/beakers, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bg" = ( -/obj/structure/sign/poster/contraband/syndicate_pistol, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bh" = ( -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bi" = ( -/obj/machinery/light/directional/north, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/electrical, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/glasses/welding, -/obj/structure/closet/crate/secure/engineering{ - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bj" = ( -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bk" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "fslockdown"; - name = "Window shutters"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bl" = ( -/obj/machinery/ore_silo, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bm" = ( -/obj/machinery/mineral/ore_redemption{ - name = "Syndicate ore redemption machine"; - ore_multiplier = 4; - req_access = list(150) - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bn" = ( -/obj/structure/table/reinforced, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bo" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bp" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/mining_scanner, -/obj/item/pickaxe/drill, -/obj/item/storage/bag/ore, -/obj/item/storage/bag/ore, -/obj/item/pickaxe/drill, -/obj/item/mining_scanner, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bq" = ( -/turf/closed/mineral/random/high_chance, -/area/ruin/unpowered/no_grav) -"br" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bs" = ( -/turf/closed/mineral, -/area/ruin/unpowered/no_grav) -"bt" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bu" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/toy/nuke, -/obj/item/clothing/under/chameleon, -/obj/item/modular_computer/tablet/pda/chameleon, -/obj/item/clothing/mask/chameleon, -/obj/item/card/id/advanced/chameleon, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bv" = ( -/obj/machinery/power/apc/syndicate{ - dir = 1; - name = "Syndicate Forgotten Ship APC"; - pixel_y = 25; - start_charge = 0 - }, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bw" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/crowbar/red, -/obj/item/ammo_box/magazine/m9mm_aps, -/obj/item/ammo_box/magazine/m9mm_aps, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bx" = ( -/obj/machinery/door/airlock/grunge{ - name = "Captain's room"; - req_one_access_txt = "150" - }, -/obj/machinery/door/poddoor{ - id = "fscaproom"; - name = "Captain's blast door"; - state_open = 1 - }, -/turf/open/floor/carpet/royalblack, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"by" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bz" = ( -/obj/structure/table/reinforced, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bA" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/clothing/head/helmet/space/syndicate/black/engie, -/obj/item/clothing/suit/space/syndicate/black/engie, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"bC" = ( -/obj/structure/closet/crate/medical, -/obj/item/stack/medical/bruise_pack{ - amount = 12 - }, -/obj/item/stack/medical/ointment{ - amount = 12 - }, -/obj/item/healthanalyzer/advanced, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bD" = ( -/obj/structure/chair/comfy{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bE" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bF" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate ship airlock"; - req_one_access_txt = "150" - }, -/obj/structure/cable, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bG" = ( -/obj/structure/sink{ - pixel_y = 32 - }, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bH" = ( -/obj/structure/sink{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bI" = ( -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bJ" = ( -/obj/machinery/suit_storage_unit/syndicate{ - helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black; - suit_type = /obj/item/clothing/suit/space/syndicate/black - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bK" = ( -/obj/machinery/suit_storage_unit/syndicate{ - helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black; - suit_type = /obj/item/clothing/suit/space/syndicate/black - }, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bL" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bM" = ( -/obj/structure/cable, -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/external/ruin{ - name = "Syndicate ship airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/template_noop, -/area/template_noop) -"bO" = ( -/obj/structure/bodycontainer/crematorium{ - id = "fscremate" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bP" = ( -/obj/machinery/airalarm/syndicate{ - pixel_y = 24; - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bR" = ( -/obj/structure/sign/poster/contraband/tools, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bS" = ( -/obj/machinery/button/crematorium{ - id = "fscremate"; - pixel_x = -32 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bT" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/security/telescreen/interrogation{ - name = "Cameras monitor"; - network = list("fsci"); - req_one_access_txt = "150"; - screen_loc = "" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bU" = ( -/obj/machinery/light/directional/south, -/obj/structure/closet/crate/solarpanel_small, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bV" = ( -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bW" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bX" = ( -/obj/structure/sign/poster/contraband/c20r, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"bY" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/crowbar/red, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/magazine/m9mm, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"bZ" = ( -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ca" = ( -/obj/machinery/computer/crew/syndie{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cb" = ( -/obj/machinery/computer/atmos_alert{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cc" = ( -/obj/structure/chair/comfy, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cd" = ( -/obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ce" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/ammo_box/c9mm, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cf" = ( -/obj/structure/displaycase{ - req_one_access_txt = "150"; - start_showpiece_type = /obj/item/gun/ballistic/automatic/pistol/deagle/camo - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cg" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ch" = ( -/obj/machinery/door/airlock/grunge{ - name = "Captain's room"; - req_one_access_txt = "150" - }, -/obj/machinery/door/poddoor{ - id = "fscaproom"; - name = "Captain's blast door"; - state_open = 1 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ci" = ( -/obj/machinery/porta_turret/syndicate/energy{ - armor = list("melee" = 40, "bullet" = 40, "laser" = 60, "energy" = 60, "bomb" = 60, "bio" = 0, "fire" = 100, "acid" = 100); - dir = 4; - name = "Syndicate Ship Turret"; - on = 0; - shot_delay = 10 - }, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cj" = ( -/obj/machinery/stasis, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"ck" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/r_wall/syndicate, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"cl" = ( -/obj/machinery/light/directional/north, -/obj/item/ai_module/core/full/cybersun, -/obj/structure/table/reinforced, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cm" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cn" = ( -/obj/machinery/recharge_station, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"co" = ( -/obj/structure/filingcabinet, -/obj/machinery/door/window{ - dir = 8; - name = "Syndicate interior door"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cp" = ( -/obj/machinery/door/window{ - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "fire" = 70, "acid" = 100); - name = "Control room"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cq" = ( -/obj/machinery/door/airlock/grunge{ - name = "Bridge"; - req_one_access_txt = "150" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cr" = ( -/obj/machinery/vending/cigarette/syndicate, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cs" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/toy/sword, -/obj/item/toy/balloon/syndicate, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"ct" = ( -/obj/machinery/vending/medical/syndicate_access/cybersun, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cu" = ( -/obj/machinery/computer/security{ - desc = "Used to access interrogation room camera."; - dir = 8; - name = "Ship cameras console"; - network = list("fsc","fsci"); - screen_loc = "" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cw" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/switchblade, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"cx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cy" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/item/wrench, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cz" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/stack/sheet/mineral/titanium{ - amount = 40 - }, -/obj/item/stack/sheet/mineral/uranium{ - amount = 15 - }, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"cA" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cG" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cJ" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Spare equipment"; - req_one_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cK" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cM" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cN" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cO" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cP" = ( -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/mob/living/simple_animal/hostile/nanotrasen/elite, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cV" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cX" = ( -/obj/machinery/camera/xray/directional/east{ - c_tag = "Conference room"; - network = list("fsc"); - screen_loc = "" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cY" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicatespace, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"cZ" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"da" = ( -/obj/structure/table/reinforced, -/obj/item/ammo_box/c9mm, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"db" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dc" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dd" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/language_manual/codespeak_manual/unlimited, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"de" = ( -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"df" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/clothing/under/syndicate/combat, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/shoes/combat, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/under/syndicate/skirt, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dg" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/item/clothing/head/hos/beret/syndicate, -/obj/item/clothing/suit/armor/vest/capcarapace/syndicate, -/obj/item/clothing/mask/gas/syndicate, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/under/syndicate/skirt, -/obj/item/clothing/gloves/combat, -/obj/item/clothing/shoes/combat, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dh" = ( -/obj/machinery/camera/xray{ - c_tag = "Cargo pod"; - dir = 9; - network = list("fsci"); - screen_loc = "" - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_cargopod) -"di" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/disk/surgery/forgottenship, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"dj" = ( -/turf/closed/mineral/random/high_chance, -/area/template_noop) -"dl" = ( -/obj/machinery/door/password/voice/sfc{ - password = null - }, -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/grunge{ - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 100, "fire" = 90, "acid" = 90); - desc = "Vault airlock preventing air from going out."; - name = "Syndicate Vault Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"dm" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/stack/ore/diamond{ - amount = 3 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dn" = ( -/obj/machinery/door/airlock/grunge{ - name = "Syndicate Ship Airlock"; - req_one_access_txt = "150" - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"do" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/stack/sheet/mineral/gold{ - amount = 30 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 30 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"dp" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/stack/ore/plasma{ - amount = 19 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dr" = ( -/obj/structure/table/reinforced, -/obj/item/paper/fluff/ruins/forgottenship/missionobj, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"dt" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"jN" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"kY" = ( -/obj/structure/closet/syndicate{ - anchored = 1; - armor = list("melee" = 70, "bullet" = 40, "laser" = 40, "energy" = 30, "bomb" = 30, "bio" = 0, "fire" = 70, "acid" = 60); - desc = "A basic closet for all your villainous needs."; - locked = 1; - name = "Closet"; - req_one_access_txt = "150"; - secure = 1 - }, -/obj/effect/spawner/random/contraband/armory, -/turf/open/floor/mineral/plastitanium/red, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"Ia" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) -"Il" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/item/melee/energy/sword/saber/red, -/obj/machinery/light/directional/north, -/turf/open/floor/pod/dark, -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault) -"WR" = ( -/obj/structure/closet/crate/secure/gear{ - req_one_access_txt = "150" - }, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/syndicate_forgotten_ship) - -(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 -"} -(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 -"} -(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 -"} -(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 -dj -dj -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 -dj -dj -dj -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 -dj -dj -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ap -ap -as -aa -aa -ap -ap -as -aa -aa -ap -ap -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 -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ap -ap -ap -aa -aa -ap -ap -ap -aa -aa -ap -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 -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -af -ap -ap -ap -af -af -ap -ap -ap -af -af -ap -ap -ap -af -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -dj -dj -dj -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -dj -dj -dj -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -ci -bZ -jN -dt -al -al -dm -dt -al -dp -Ia -al -al -dt -WR -bZ -ci -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 -bZ -al -al -al -al -al -al -al -al -al -al -al -al -al -al -al -bZ -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 -bZ -bZ -bZ -bZ -bZ -bZ -bZ -bZ -dn -bZ -bZ -bZ -dn -bZ -bZ -bZ -bZ -aa -aa -aa -aa -aa -aa -aa -aa -aY -aY -aY -aY -aY -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -bZ -bV -bZ -ag -bw -bZ -av -aR -az -bZ -bz -bD -al -bY -al -bZ -aa -aa -aa -aa -aa -aa -aY -aY -aY -ba -bq -ba -aY -aY -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -aA -aw -bZ -ao -aO -bZ -aN -cC -bc -bZ -bY -bE -al -al -cY -bZ -aa -aa -aa -aa -aa -aY -aY -ba -ba -ba -ba -ba -ba -aY -aY -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -cf -aw -ch -ao -ao -bx -aH -cD -cU -by -al -al -al -cc -dr -bZ -aa -aa -aa -aa -aY -aY -ba -ba -aZ -aZ -aZ -aZ -ba -ba -aY -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -ay -aw -bZ -ao -ao -bx -aS -cx -aS -by -al -al -al -cc -da -bZ -aa -aa -aa -aY -aY -ba -ba -aZ -aZ -bA -bA -aZ -aZ -ba -aY -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -cl -aw -bZ -aB -bn -bZ -cy -cE -cV -bZ -bY -bE -al -al -cY -bZ -aa -aa -aa -aY -ba -ba -ba -aZ -bd -de -de -cz -aZ -ba -aY -aY -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -ac -bZ -co -bZ -aI -bT -bg -aD -cF -cM -bZ -ah -bD -al -bY -bZ -ac -aa -aa -aa -aY -ba -bq -ba -aZ -Il -de -de -do -aZ -ba -bq -aY -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -bZ -bZ -bZ -bZ -bZ -bZ -cG -bZ -bZ -bZ -bZ -bZ -bZ -bZ -aa -aa -aa -aa -aY -aY -ba -ba -aZ -dd -de -de -di -aZ -ba -ba -aY -aY -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -ad -am -am -ct -bZ -al -cH -al -bZ -bG -bI -cZ -db -bZ -aa -aa -aa -aa -aY -ba -ba -ba -aZ -aZ -dl -aZ -aZ -aZ -ba -ba -ba -aY -aY -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -aj -am -am -cj -bZ -aJ -cI -aC -bZ -bH -cd -bZ -bZ -bZ -aa -aa -aa -aa -aY -ba -ba -bq -bb -bb -bj -bl -bb -bb -ba -ba -ba -ba -aY -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -ak -ar -am -am -cm -cv -cW -al -aQ -bI -bI -cZ -dc -bZ -aa -aa -aa -aa -aY -aY -ba -ba -bX -aX -bj -bj -bo -bb -ba -ba -aY -aY -aY -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -ci -bZ -bZ -bZ -bZ -bZ -bZ -bZ -cK -bZ -bZ -bZ -bZ -bZ -bZ -bZ -ci -aa -aa -aa -aa -aY -ba -ba -bb -dh -bj -bm -bj -bb -ba -aY -aY -aY -aY -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -bO -bS -bZ -bv -aP -aK -aP -cH -aP -aK -aP -al -bZ -al -bJ -bZ -aa -aa -aa -aa -aY -aY -ba -bb -bf -bh -bj -bj -bb -bs -ba -ba -ba -aY -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -ai -al -bZ -bP -al -ax -ax -cN -ax -ax -aP -al -bZ -al -bK -bZ -aa -aa -aa -aa -aa -aY -aY -bR -bp -bh -bj -bC -bb -bq -ba -ba -aY -aY -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -ae -al -al -aU -al -at -ah -aM -cO -ah -ah -bQ -aP -be -aP -aP -bM -bN -bN -bN -bN -bN -ab -ab -bF -bh -bh -bj -bu -bb -ba -ba -aY -aY -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -ai -al -an -al -at -ah -cA -cP -ah -ah -aL -al -an -al -bK -bZ -aa -aa -aa -aa -aa -aY -aY -ck -bi -bj -bj -bU -bb -ba -ba -aY -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -cn -al -bZ -al -al -al -ah -cQ -ah -al -al -al -bZ -al -bL -bZ -aa -aa -aa -aa -aY -aY -ba -bb -bb -cs -cw -bb -bb -ba -ba -aY -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -ac -bZ -ah -bZ -cr -al -aF -al -cR -cX -aF -al -al -bZ -ah -bZ -ac -aa -aa -aa -aa -aY -ba -ba -ba -bb -bb -bb -bb -ba -ba -bq -aY -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -bZ -bZ -bZ -bZ -bZ -bZ -bZ -cq -bZ -bZ -bZ -bZ -bZ -bZ -bZ -aa -aa -aa -aa -aa -aY -aY -ba -ba -ba -ba -bq -ba -ba -ba -aY -aY -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aq -kY -ce -bW -aw -cS -aw -bW -cg -ce -bZ -aa -aa -aa -aa -aa -aa -aa -aa -aY -aY -bq -ba -ba -ba -ba -ba -aY -aY -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -bZ -bZ -bZ -aw -aw -aw -aw -cS -aw -aw -aw -aw -bZ -bZ -bZ -bZ -aa -aa -aa -aa -aa -aa -aY -aY -aY -aY -aY -aY -aY -aY -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -bZ -aG -aw -bZ -aw -aw -aw -cB -cT -aw -aw -aw -aw -bZ -df -df -bZ -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 -bZ -br -aw -cp -aw -aV -aw -aV -cL -aV -aw -aV -aw -cJ -aw -bt -bZ -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 -ac -bZ -aw -bZ -aw -cu -aw -aT -aw -ca -aw -cb -aw -bZ -dg -bZ -ac -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 -bZ -bZ -bZ -aw -aw -aw -aw -aw -aw -aw -aw -aw -bZ -bZ -bZ -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 -bZ -bZ -bV -bV -aW -bV -bk -bV -bV -bV -bV -bZ -bZ -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -dj -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -au -au -au -au -au -au -au -au -au -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -dj -dj -dj -dj -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 -dj -dj -dj -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 -dj -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 -dj -dj -dj -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 -dj -dj -dj -dj -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 -dj -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 -"} -(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 -"} diff --git a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm b/_maps/RandomRuins/SpaceRuins/hellfactory.dmm deleted file mode 100644 index a9acedc11e7d..000000000000 --- a/_maps/RandomRuins/SpaceRuins/hellfactory.dmm +++ /dev/null @@ -1,1735 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/hellfactory) -"ac" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/hellfactory) -"ad" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"ae" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/visible{ - dir = 4 - }, -/obj/structure/closet/secure_closet/freezer/meat, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"af" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"ag" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 1 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"ah" = ( -/turf/closed/indestructible/reinforced, -/area/ruin/space/has_grav/hellfactoryoffice) -"ai" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction/layer4{ - dir = 8 - }, -/turf/closed/indestructible/reinforced, -/area/ruin/space/has_grav/hellfactoryoffice) -"aj" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/visible{ - dir = 4 - }, -/obj/structure/hedge/opaque, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"al" = ( -/obj/structure/table/reinforced, -/obj/item/storage/cans/sixbeer, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"an" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"ao" = ( -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"ap" = ( -/obj/structure/table/reinforced, -/obj/machinery/computer/security/wooden_tv, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aq" = ( -/obj/item/pressure_plate/hologrid{ - name = "bossman's hologrid"; - reward = /obj/item/stack/spacecash/c10000 - }, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"ar" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/five, -/obj/item/grenade/firecracker, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"as" = ( -/obj/structure/holobox, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"at" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"au" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 6 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"av" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/structure/holobox, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aw" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"ax" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/manifold/layer4{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"ay" = ( -/obj/structure/hedge/opaque, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"az" = ( -/obj/item/trash/raisins, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aA" = ( -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"aB" = ( -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"aC" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aD" = ( -/obj/structure/holobox, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aE" = ( -/obj/machinery/photocopier, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aF" = ( -/obj/item/trash/can, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aG" = ( -/obj/structure/table/reinforced, -/obj/item/storage/cans/sixsoda, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aH" = ( -/obj/structure/table/reinforced, -/obj/item/trash/popcorn, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aI" = ( -/obj/structure/table/reinforced, -/obj/item/gps/spaceruin, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aJ" = ( -/obj/structure/table/reinforced, -/obj/item/trash/candle, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aK" = ( -/obj/structure/table/reinforced, -/obj/item/rsf, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aL" = ( -/turf/closed/wall/rust, -/area/ruin/space/has_grav/hellfactory) -"aM" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 5 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aN" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 4 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aO" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4{ - dir = 9 - }, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aP" = ( -/obj/structure/filingcabinet, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aQ" = ( -/obj/item/trash/can, -/obj/item/trash/can, -/obj/structure/closet/crate/bin, -/obj/item/trash/chips, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aR" = ( -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/ammo_casing/spent{ - pixel_x = 4; - pixel_y = -10 - }, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aS" = ( -/obj/structure/closet/crate, -/obj/item/stack/package_wrap, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"aT" = ( -/obj/effect/mine/gas/water_vapor, -/obj/machinery/door/window, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aU" = ( -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aV" = ( -/obj/effect/mine/gas/water_vapor, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"aW" = ( -/turf/closed/wall/r_wall/rust, -/area/ruin/space/has_grav/hellfactory) -"aX" = ( -/obj/item/ammo_casing/spent{ - pixel_x = -10; - pixel_y = -4 - }, -/obj/item/ammo_casing/spent, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"aZ" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"ba" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor/auto, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bb" = ( -/obj/structure/window/reinforced/fulltile, -/obj/structure/grille, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bc" = ( -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bd" = ( -/obj/structure/sign/warning/coldtemp{ - name = "\improper BLAST FREEZER" - }, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/hellfactory) -"be" = ( -/obj/structure/table, -/obj/item/paper_bin/carbon, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bf" = ( -/obj/machinery/door/puzzle/keycard/office, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactoryoffice) -"bg" = ( -/obj/machinery/modular_computer/console/preset/civilian, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bh" = ( -/obj/machinery/light/directional/north, -/obj/item/chair/plastic{ - pixel_y = 4 - }, -/obj/item/chair/plastic{ - pixel_y = 8 - }, -/obj/item/chair/plastic{ - pixel_y = 12 - }, -/obj/structure/rack, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bi" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bj" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bk" = ( -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"bl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/conveyor/auto, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bm" = ( -/obj/structure/table, -/obj/item/stamp/denied, -/obj/item/stamp{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/structure/window{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bn" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/soap/nanotrasen, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bo" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bp" = ( -/obj/structure/chair/plastic, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"br" = ( -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/keycard/office - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bs" = ( -/obj/machinery/conveyor/auto, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bt" = ( -/obj/structure/holobox, -/obj/machinery/conveyor/auto{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bu" = ( -/obj/structure/fermenting_barrel, -/obj/machinery/conveyor/auto{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bv" = ( -/obj/machinery/conveyor/auto{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bw" = ( -/obj/structure/table, -/obj/structure/window{ - dir = 8 - }, -/obj/item/pen/fourcolor, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bx" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/structure/window{ - dir = 8 - }, -/obj/structure/window, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"by" = ( -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bB" = ( -/obj/structure/fermenting_barrel, -/obj/machinery/conveyor/auto, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bC" = ( -/obj/structure/ore_box, -/obj/machinery/conveyor/auto{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bD" = ( -/obj/effect/turf_decal/arrows, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bE" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bF" = ( -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/skub - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bG" = ( -/obj/structure/closet/crate, -/obj/machinery/conveyor/auto, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/reagent_containers/food/drinks/flask, -/obj/item/stack/sheet/glass, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bH" = ( -/obj/item/pressure_plate/hologrid, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bI" = ( -/obj/structure/fermenting_barrel, -/obj/machinery/conveyor/auto{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bJ" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bK" = ( -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/item/book/manual/random, -/obj/item/poster/random_contraband, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"bM" = ( -/obj/structure/grille/broken, -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/stack/spacecash/c500 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bN" = ( -/obj/structure/ore_box, -/obj/machinery/conveyor/auto, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bP" = ( -/obj/effect/turf_decal/arrows{ - dir = 1 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bR" = ( -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/keycard/stockroom - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bS" = ( -/obj/item/pressure_plate/hologrid{ - reward = /obj/item/stack/arcadeticket/thirty - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bT" = ( -/obj/machinery/conveyor/auto{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bU" = ( -/obj/structure/closet/crate/large, -/obj/machinery/conveyor/auto{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bV" = ( -/obj/structure/closet/crate, -/obj/machinery/conveyor/auto{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/item/stack/sheet/cardboard, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bW" = ( -/obj/machinery/conveyor/auto{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bX" = ( -/obj/structure/sign/warning/chemdiamond, -/turf/closed/wall, -/area/ruin/space/has_grav/hellfactory) -"bY" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"bZ" = ( -/obj/machinery/door/puzzle/keycard/stockroom, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"ca" = ( -/obj/machinery/door/airlock, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cb" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/curtain, -/obj/structure/mirror/directional/north, -/turf/open/floor/holofloor/wood, -/area/ruin/space/has_grav/hellfactory) -"cc" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/turf/open/floor/holofloor/wood, -/area/ruin/space/has_grav/hellfactory) -"cd" = ( -/obj/machinery/plumbing/synthesizer{ - desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate universal enzyme."; - dispensable_reagents = list(/datum/reagent/consumable/enzyme); - reagent_id = /datum/reagent/consumable/enzyme - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"ce" = ( -/obj/machinery/plumbing/synthesizer{ - desc = "Produces a single chemical at a given volume. This one appears to have been hotwired to generate honey."; - dispensable_reagents = list(/datum/reagent/consumable/honey); - reagent_id = /datum/reagent/consumable/honey - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cf" = ( -/obj/machinery/plumbing/synthesizer{ - desc = "Produces a single chemical at a given volume. This one seems to have been hotwired to produce... blood?"; - dispensable_reagents = list(/datum/reagent/blood); - reagent_id = /datum/reagent/blood - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"ch" = ( -/obj/machinery/light/directional/west, -/obj/machinery/plumbing/tank, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"ci" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/remains/human, -/obj/structure/curtain, -/obj/structure/mirror/directional/north, -/turf/open/floor/holofloor/wood, -/area/ruin/space/has_grav/hellfactory) -"ck" = ( -/obj/machinery/plumbing/tank, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cl" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cm" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/ten_k{ - dir = 1; - pixel_y = 25 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cn" = ( -/obj/machinery/plumbing/output{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"co" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 8 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cp" = ( -/obj/effect/turf_decal/box/white/corners{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cq" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cr" = ( -/obj/structure/closet/crate/trashcart, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cs" = ( -/obj/structure/fermenting_barrel, -/obj/effect/turf_decal/box/white, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"ct" = ( -/obj/machinery/light/built/directional/south, -/obj/structure/marker_beacon{ - icon_state = "markerburgundy-on" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cu" = ( -/obj/effect/turf_decal{ - dir = 9 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cv" = ( -/obj/effect/turf_decal{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear/white, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cw" = ( -/obj/effect/turf_decal{ - dir = 1 - }, -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cx" = ( -/obj/effect/turf_decal{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear/white, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cy" = ( -/obj/effect/turf_decal{ - dir = 5 - }, -/obj/structure/fluff/broken_flooring, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cz" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cA" = ( -/obj/item/trash/raisins, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cB" = ( -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cC" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cD" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cE" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/rust, -/area/ruin/space/has_grav/hellfactory) -"cF" = ( -/obj/effect/turf_decal/delivery/white, -/obj/machinery/door/poddoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cG" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/delivery/red, -/obj/item/stack/tile/iron/base, -/obj/machinery/door/poddoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cH" = ( -/obj/effect/turf_decal/delivery/white, -/obj/structure/grille/broken, -/obj/machinery/door/poddoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cI" = ( -/obj/effect/turf_decal/delivery/white, -/obj/effect/turf_decal/delivery/red, -/obj/machinery/door/poddoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cJ" = ( -/obj/effect/turf_decal/delivery/white, -/obj/item/stack/tile/iron/base, -/obj/machinery/door/poddoor, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cK" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cL" = ( -/obj/item/bedsheet/brown{ - dir = 4 - }, -/obj/structure/bed{ - dir = 4 - }, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cM" = ( -/obj/item/storage/toolbox/emergency/old, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cN" = ( -/obj/machinery/door/puzzle/keycard/entry, -/obj/machinery/door/airlock/public, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cO" = ( -/obj/structure/holobox, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cP" = ( -/obj/effect/turf_decal/box/white/corners, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"cQ" = ( -/obj/structure/lattice/catwalk, -/turf/template_noop, -/area/ruin/space/has_grav/hellfactory) -"cR" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon{ - icon_state = "markerburgundy-on" - }, -/turf/template_noop, -/area/ruin/space/has_grav/hellfactory) -"cS" = ( -/obj/structure/lattice/catwalk, -/obj/item/keycard/entry, -/turf/template_noop, -/area/ruin/space/has_grav/hellfactory) -"cT" = ( -/obj/machinery/light/broken/directional/south, -/obj/structure/marker_beacon{ - icon_state = "markerburgundy-on" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"cV" = ( -/obj/structure/table, -/obj/item/stack/ducts/fifty, -/obj/structure/window, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"hv" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"iE" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/engineering/material_rare, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"kD" = ( -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"lR" = ( -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/bot_white/right, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"nd" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall, -/area/ruin/space/has_grav/hellfactory) -"oH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"oJ" = ( -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"pf" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"qK" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/exotic/languagebook, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"ry" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/bot_white/left, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"sk" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"uL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/bot_white/right, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"vB" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/entertainment/money_large, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"wv" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 1; - pixel_y = 25 - }, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"xK" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/holofloor/wood, -/area/ruin/space/has_grav/hellfactory) -"BC" = ( -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/bot_white/left, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) -"EJ" = ( -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"Fs" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"GE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/checker, -/area/ruin/space/has_grav/hellfactory) -"Ns" = ( -/obj/structure/closet/crate, -/obj/machinery/conveyor/auto{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/spawner/random/exotic/languagebook, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"NU" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"OJ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer2, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple/layer4, -/obj/machinery/light/directional/east, -/turf/open/floor/plastic, -/area/ruin/space/has_grav/hellfactory) -"PO" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"QS" = ( -/obj/structure/rack, -/obj/item/stack/wrapping_paper, -/obj/item/stack/package_wrap, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"Sz" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"UK" = ( -/obj/effect/decal/cleanable/oil/streak, -/turf/open/floor/iron, -/area/ruin/space/has_grav/hellfactory) -"UN" = ( -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"VN" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"Wh" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"Yd" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/hellfactoryoffice) -"Zh" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/stack/sheet/mineral/plasma, -/turf/open/floor/plating, -/area/ruin/space/has_grav/hellfactory) -"Zq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/hellfactory) - -(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 -"} -(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 -"} -(3,1,1) = {" -aa -aa -aW -ac -aW -aW -ac -ac -aW -ac -ac -ac -aW -ac -ac -ac -ac -aW -aW -ac -aW -aW -aW -aa -aa -"} -(4,1,1) = {" -aa -aa -aW -ad -au -aC -aM -aT -ba -bl -bl -bs -bB -bG -bN -bT -cd -ch -ck -ck -cs -cD -aW -aa -aa -"} -(5,1,1) = {" -aa -aa -ac -ae -av -ab -aN -hv -bb -aA -bL -bt -bb -bb -bb -bU -ce -aA -bL -aA -cn -cs -aW -aa -aa -"} -(6,1,1) = {" -aa -aa -aW -af -aw -aD -aN -aU -bb -bL -aA -bu -bb -bb -bb -bV -cf -aA -aA -UK -bL -cs -aW -aa -aa -"} -(7,1,1) = {" -aa -aa -aW -ag -ax -OJ -aO -aV -bc -bL -bL -bv -bC -bI -Ns -bW -aA -aA -bL -aA -aA -cs -aW -cQ -aa -"} -(8,1,1) = {" -aa -aa -ah -ai -ah -ah -ah -ah -bd -aA -aA -aA -bD -bJ -bP -bX -aA -aA -bL -aA -ct -cE -aW -cR -cQ -"} -(9,1,1) = {" -aa -aa -ah -aj -az -aF -aQ -ah -be -bm -bw -bx -bE -by -by -bY -by -by -by -co -cu -cF -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -ah -ao -ao -ao -aF -ah -bh -aA -bp -cV -by -Wh -BC -oJ -Zq -ry -by -by -cv -cG -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -ah -al -ao -aG -Yd -ah -bg -aA -bL -aA -Wh -Wh -oJ -by -by -oJ -Wh -by -cw -cH -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -ah -ao -ao -aH -ao -ah -ac -ac -aW -VN -by -by -lR -oJ -oJ -uL -by -Wh -cx -cI -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -ah -an -ao -aI -aR -bf -br -bF -bH -cq -cp -cq -cq -cz -cq -cz -cC -cP -cy -cJ -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -ah -wv -UN -aJ -aX -ah -ac -aW -ac -by -by -bK -aL -ca -aL -ca -aL -cq -cT -cE -ac -cR -cQ -"} -(15,1,1) = {" -aa -aa -ah -ap -ao -aK -Yd -ah -aA -bn -aW -by -Wh -Fs -aL -cb -aL -ci -aL -cm -cq -cK -aW -cS -aa -"} -(16,1,1) = {" -aa -aa -ah -aq -ao -ao -ao -ah -aB -bL -bZ -by -by -QS -aL -cc -aL -xK -ac -ac -aW -ac -aW -aa -aa -"} -(17,1,1) = {" -aa -aa -ah -ay -aE -aP -aP -ah -bi -aB -aW -ac -ac -aW -ac -aW -ac -aW -ac -Zh -cA -by -ab -aa -aa -"} -(18,1,1) = {" -aa -aa -ah -ah -ah -ah -ah -ah -bj -bo -aL -vB -ab -aB -bR -PO -ab -as -aL -cr -cB -cL -nd -aa -aa -"} -(19,1,1) = {" -aa -aa -ac -ar -aA -aB -aS -aL -bk -aB -ab -qK -EJ -aB -ab -GE -iE -iE -by -Sz -by -cM -cN -aa -aa -"} -(20,1,1) = {" -aa -aa -aW -ab -bL -kD -aB -ab -sk -aB -ab -ab -ab -bM -ab -ab -aL -ab -ab -NU -Wh -by -ab -aa -aa -"} -(21,1,1) = {" -aa -aa -ac -as -aA -ab -aB -aA -bL -aB -aB -aB -oH -aB -ab -aB -pf -aA -by -Wh -by -by -ab -aa -aa -"} -(22,1,1) = {" -aa -aa -ac -at -GE -aL -GE -aZ -aB -aB -aL -by -ab -aA -bS -aB -ab -as -aL -by -cl -cO -ab -aa -aa -"} -(23,1,1) = {" -aa -aa -aW -aW -aW -aW -aW -ac -aW -ac -ac -aW -aW -ac -ac -ac -ac -aW -aW -ab -ab -ab -ab -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 -"} -(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 -"} diff --git a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm index 926521f3db77..e212bed98f89 100644 --- a/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/hilbertresearchfacility.dmm @@ -284,12 +284,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/mineral/titanium/tiled/yellow, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"ha" = ( -/obj/structure/statue/bone/rib{ - dir = 1 - }, -/turf/open/floor/cult, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "he" = ( /obj/structure/flora/rock/pile, /turf/open/misc/asteroid/airless, @@ -547,10 +541,6 @@ /obj/effect/turf_decal/siding/thinplating_new/light/end, /turf/open/floor/mineral/titanium/tiled/white, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"mC" = ( -/obj/machinery/chem_mass_spec, -/turf/open/floor/mineral/titanium/tiled/blue, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "mD" = ( /obj/structure/railing/corner{ dir = 1 @@ -721,10 +711,7 @@ pixel_x = -5; pixel_y = 3 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /turf/open/floor/mineral/titanium/tiled/blue, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "qX" = ( @@ -1191,9 +1178,7 @@ dir = 1 }, /obj/structure/table/reinforced/plastitaniumglass, -/obj/item/crowbar/large{ - pixel_y = 4 - }, +/obj/item/crowbar, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "AI" = ( @@ -1320,7 +1305,7 @@ /turf/open/floor/mineral/titanium/tiled/purple, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Dh" = ( -/obj/machinery/chem_heater/withbuffer, +/obj/machinery/chem_heater, /turf/open/floor/mineral/titanium/tiled/blue, /area/ruin/space/has_grav/powered/hilbertresearchfacility) "Do" = ( @@ -1981,10 +1966,6 @@ /obj/structure/grille, /turf/open/floor/plating, /area/ruin/space/has_grav/powered/hilbertresearchfacility) -"RN" = ( -/obj/structure/statue/bone/rib, -/turf/open/floor/cult, -/area/ruin/space/has_grav/powered/hilbertresearchfacility) "RX" = ( /obj/machinery/door/poddoor/shutters, /turf/open/floor/mineral/plastitanium, @@ -3186,7 +3167,7 @@ Bo Bo AZ Dh -mC +Mv Bo Bo rQ @@ -3769,7 +3750,7 @@ wo Wt yO HK -ha +wo iO MX ow @@ -3807,7 +3788,7 @@ el ZV Wt KC -RN +wo hW KC dJ diff --git a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm b/_maps/RandomRuins/SpaceRuins/listeningstation.dmm deleted file mode 100644 index a8ce74065f4a..000000000000 --- a/_maps/RandomRuins/SpaceRuins/listeningstation.dmm +++ /dev/null @@ -1,2264 +0,0 @@ -//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, -/area/ruin/unpowered/no_grav) -"ac" = ( -/turf/closed/wall, -/area/ruin/space/has_grav/listeningstation) -"ad" = ( -/obj/machinery/computer/message_monitor, -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/paper/monitorkey, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"af" = ( -/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) -"ag" = ( -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/listeningstation) -"ah" = ( -/obj/machinery/computer/camera_advanced{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/newscaster/directional/north, -/obj/item/radio/intercom/directional/west{ - freerange = 1 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"ak" = ( -/obj/machinery/telecomms/relay/preset/ruskie{ - use_power = 0 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"al" = ( -/obj/structure/table, -/obj/item/storage/toolbox/syndicate, -/obj/item/flashlight{ - pixel_y = -12 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"an" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/ruin{ - id_tag = "syndie_listeningpost_external"; - req_access_txt = "150" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"ao" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"ap" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external/ruin{ - id_tag = "syndie_listeningpost_external"; - req_access_txt = "150" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"aq" = ( -/obj/structure/curtain, -/obj/machinery/shower{ - pixel_y = 14 - }, -/obj/machinery/light/small/directional/south, -/obj/item/soap, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/listeningstation) -"ar" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/toilet{ - pixel_y = 18 - }, -/obj/structure/mirror/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/listeningstation) -"as" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/med_data/syndie{ - dir = 4; - req_one_access = null - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"av" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/paper/fluff/ruins/listeningstation/reports/november, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"aw" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/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 = 8; - pixel_x = -24 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"ay" = ( -/obj/machinery/door/airlock{ - name = "Toilet" - }, -/turf/open/floor/iron/showroomfloor, -/area/ruin/space/has_grav/listeningstation) -"az" = ( -/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/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"aB" = ( -/obj/structure/rack{ - dir = 8 - }, -/obj/item/multitool, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"aC" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/mining_scanner, -/obj/item/pickaxe, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"aE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/tank_dispenser/oxygen{ - oxygentanks = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/mineral/plastitanium, -/area/ruin/space/has_grav/listeningstation) -"aF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/closed/wall/r_wall, -/area/ruin/space/has_grav/listeningstation) -"aG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating/airless, -/area/ruin/space/has_grav/listeningstation) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aL" = ( -/obj/item/bombcore/badmin{ - anchored = 1; - invisibility = 100 - }, -/turf/closed/wall, -/area/ruin/space/has_grav/listeningstation) -"aO" = ( -/obj/machinery/light/small/directional/west, -/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, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"aP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock{ - name = "Personal Quarters" - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - 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/iron, -/area/ruin/space/has_grav/listeningstation) -"aU" = ( -/obj/machinery/airalarm/syndicate{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - 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 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aW" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"aX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"ba" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bb" = ( -/obj/effect/turf_decal/stripes/red/corner, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/syndicate{ - dir = 4; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bc" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset/anchored, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"be" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/corner, -/area/ruin/space/has_grav/listeningstation) -"bg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/side, -/area/ruin/space/has_grav/listeningstation) -"bi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bk" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bl" = ( -/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) -"bm" = ( -/obj/machinery/door/airlock/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bn" = ( -/obj/structure/sign/departments/medbay/alt, -/turf/closed/wall, -/area/ruin/space/has_grav/listeningstation) -"bo" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay" - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/listeningstation) -"bp" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 8 - }, -/obj/machinery/door/airlock{ - name = "Cabin" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/listeningstation) -"bq" = ( -/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, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"br" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/power/apc/syndicate{ - dir = 4; - name = "Syndicate Listening Post APC"; - pixel_x = 25 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bs" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/o_minus{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/ruin/space/has_grav/listeningstation) -"bt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/ruin/space/has_grav/listeningstation) -"bu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/medical1{ - req_access = null; - req_access_txt = "150" - }, -/turf/open/floor/iron/white, -/area/ruin/space/has_grav/listeningstation) -"bv" = ( -/obj/structure/bookcase/random, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bw" = ( -/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/directional/south, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bx" = ( -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"by" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/clothing/head/welding, -/obj/item/weldingtool/largetank, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bB" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/iv_drip, -/obj/machinery/airalarm/syndicate{ - pixel_y = -24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/ruin/space/has_grav/listeningstation) -"bC" = ( -/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, -/obj/structure/cable, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bD" = ( -/obj/structure/table/wood, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/paper/fluff/ruins/listeningstation/briefing, -/turf/open/floor/iron/grimy, -/area/ruin/space/has_grav/listeningstation) -"bF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/ruin/space/has_grav/listeningstation) -"bH" = ( -/obj/machinery/atmospherics/components/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) -"bJ" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 6; - height = 7; - id = "caravansyndicate3_listeningpost"; - name = "Syndicate Listening Post"; - width = 15 - }, -/obj/docking_port/stationary{ - dir = 4; - dwidth = 4; - height = 5; - id = "caravansyndicate1_listeningpost"; - name = "Syndicate Listening Post"; - width = 9 - }, -/turf/template_noop, -/area/template_noop) -"bU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"dd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"iB" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/west, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"lb" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"of" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"ud" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/west, -/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/food/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/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"yv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"Di" = ( -/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/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"FN" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "syndie_listeningpost_external"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - req_access_txt = "150"; - specialfunctions = 4 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"FQ" = ( -/obj/effect/spawner/random/vending/snackvend{ - hacked = 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/iron, -/area/ruin/space/has_grav/listeningstation) -"Hs" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -4; - pixel_y = 14 - }, -/obj/item/reagent_containers/food/drinks/bottle/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/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"KA" = ( -/obj/machinery/computer/arcade/orion_trail, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"KR" = ( -/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/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"Op" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/clothing/neck/stethoscope, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/ruin/space/has_grav/listeningstation) -"Sv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"UL" = ( -/obj/effect/spawner/random/vending/colavend{ - hacked = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/ruin/space/has_grav/listeningstation) -"UX" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"VD" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/hatch{ - name = "Telecommunications"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"Xo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - 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/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) -"Xr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/listeningstation) - -(1,1,1) = {" -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 -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -aa -aa -aa -aa -"} -(4,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(5,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -"} -(6,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(7,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(8,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(9,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(10,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(11,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(14,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(15,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(16,1,1) = {" -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(17,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(18,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(19,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ab -ac -aq -ac -of -iB -Hs -ud -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(20,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ac -ar -ay -aI -aP -ba -KA -ac -bv -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(21,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -Di -aQ -bb -bk -bp -bi -bw -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(22,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ac -ac -ah -as -ac -ac -aR -ac -bl -ac -bx -bD -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(23,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -ad -lb -bU -az -ac -aS -ac -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(24,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -UX -Xr -dd -yv -VD -aT -bc -ac -bq -by -aO -bC -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(25,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ac -ac -ak -av -aB -ac -aU -bd -bm -br -bz -bF -bH -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -"} -(26,1,1) = {" -aa -ab -ab -ab -ab -ab -ab -ab -ac -ac -ac -ac -aL -aV -be -ac -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ac -ac -al -aw -aC -ac -aW -bf -bn -bs -Op -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -ab -ab -ab -ac -af -KR -FN -Sv -Xo -aX -bg -bo -bt -bB -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ac -ac -an -ac -aE -ac -FQ -UL -ac -bu -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -ab -ab -ab -ag -ao -ag -aF -ag -ac -ac -ac -ac -ac -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ag -ap -ag -aG -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -bJ -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 -"} diff --git a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm index 3439986b6656..af68a93ddfcf 100644 --- a/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm +++ b/_maps/RandomRuins/SpaceRuins/mrow_thats_right.dmm @@ -451,7 +451,6 @@ "bu" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/color/latex, -/obj/item/surgical_drapes, /turf/open/floor/iron/white/side{ dir = 8 }, diff --git a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm index d43b7ba6cbff..3d0e00c2d2ca 100644 --- a/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldAIsat.dmm @@ -44,12 +44,12 @@ /area/ruin/tcommsat_oldaisat) "ak" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/tcommsat_oldaisat) "al" = ( /obj/machinery/light/small/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/tcommsat_oldaisat) "am" = ( @@ -86,7 +86,7 @@ /turf/template_noop, /area/template_noop) "au" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/tcommsat_oldaisat) "av" = ( @@ -246,13 +246,6 @@ /obj/item/paper/crumpled, /turf/open/floor/iron/airless, /area/ruin/tcommsat_oldaisat) -"aX" = ( -/obj/item/food/meat/slab/synthmeat{ - name = "Cuban Pete-Meat" - }, -/obj/item/stack/spacecash/c200, -/turf/open/floor/engine, -/area/ruin/tcommsat_oldaisat) "aY" = ( /obj/structure/chair{ dir = 4 @@ -2910,7 +2903,7 @@ ag ao aE aE -aX +aE ag ag ag diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 60ea39a85b1b..61ff2f2f96e9 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -301,7 +301,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hall) "aU" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/hall) "aV" = ( @@ -387,7 +387,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/bridge) "bh" = ( @@ -409,7 +409,7 @@ "bi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/bridge) "bj" = ( @@ -534,7 +534,7 @@ "bx" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/hall) "by" = ( @@ -544,7 +544,7 @@ "bz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -557,13 +557,13 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/bridge) "bC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 6 }, @@ -644,7 +644,7 @@ "bQ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "bR" = ( @@ -733,7 +733,7 @@ "ce" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/north{ start_charge = 0 }, @@ -755,7 +755,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/command, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -769,7 +769,7 @@ "ck" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -884,7 +884,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "cB" = ( @@ -892,7 +892,7 @@ /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "cC" = ( @@ -903,7 +903,7 @@ "cD" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "cE" = ( @@ -947,7 +947,7 @@ /obj/effect/spawner/structure/window/hollow/reinforced/end{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/bridge) "cN" = ( @@ -960,7 +960,7 @@ "cO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -1108,7 +1108,7 @@ "dk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 10 }, @@ -1128,7 +1128,7 @@ pixel_x = -23 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "dn" = ( @@ -1216,7 +1216,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -1236,7 +1236,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor/closed, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/rnd) @@ -1249,14 +1249,14 @@ /obj/machinery/door/airlock/science, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor/closed, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "dD" = ( /obj/effect/decal/cleanable/dirt, /obj/item/roller, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -1270,7 +1270,7 @@ "dG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/alien/drone, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -1299,14 +1299,14 @@ name = "Bridge" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/bridge) "dM" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -1319,13 +1319,13 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "dO" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hydro) "dP" = ( @@ -1353,7 +1353,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west{ start_charge = 0 }, @@ -1404,7 +1404,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/cobweb, /obj/machinery/light_switch/directional/west, /obj/machinery/power/apc/auto_name/directional/north{ @@ -1430,7 +1430,7 @@ /area/ruin/space/has_grav/ancientstation/delta/rnd) "ec" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/north{ start_charge = 0 }, @@ -1562,7 +1562,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/sec) "eu" = ( @@ -1612,7 +1612,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light_switch/directional/north, /turf/open/floor/iron/white, /area/ruin/space/has_grav/ancientstation/delta/rnd) @@ -1708,7 +1708,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "eP" = ( @@ -1743,7 +1743,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hydro) "eT" = ( @@ -1752,7 +1752,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -1766,7 +1766,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/sec) "eV" = ( @@ -1811,7 +1811,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "fd" = ( @@ -1824,7 +1824,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "ff" = ( @@ -1840,7 +1840,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "fh" = ( @@ -1876,7 +1876,7 @@ "fm" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -1921,7 +1921,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "fu" = ( @@ -1977,7 +1977,7 @@ "fE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/engie) "fF" = ( @@ -2040,7 +2040,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -2125,7 +2125,7 @@ /area/ruin/space/has_grav/ancientstation/beta/mining) "fY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -2155,7 +2155,7 @@ /area/ruin/space/has_grav/ancientstation/beta/mining) "ge" = ( /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/blood/old, /obj/machinery/power/apc/auto_name/directional/east{ @@ -2180,7 +2180,7 @@ }, /obj/effect/turf_decal/tile/brown, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -2188,7 +2188,7 @@ "gi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -2215,7 +2215,7 @@ "gl" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -2223,7 +2223,7 @@ "gm" = ( /obj/machinery/door/firedoor/closed, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -2233,13 +2233,13 @@ /obj/machinery/door/poddoor{ id = "ancient" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/engie) "go" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, @@ -2248,7 +2248,7 @@ "gp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 8 @@ -2258,7 +2258,7 @@ "gq" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -2269,7 +2269,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hall) "gr" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -2280,7 +2280,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hall) "gs" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, @@ -2288,7 +2288,7 @@ "gt" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 }, @@ -2311,7 +2311,7 @@ pixel_y = 23 }, /obj/effect/decal/cleanable/food/egg_smudge, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/ancientstation/charlie/kitchen) "gw" = ( @@ -2322,13 +2322,13 @@ "gx" = ( /obj/machinery/door/airlock/maintenance_hatch, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/hall) "gy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -2347,13 +2347,13 @@ /obj/machinery/door/poddoor{ id = "ancient" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/sec) "gB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/sec) "gC" = ( @@ -2377,7 +2377,7 @@ /obj/effect/turf_decal/tile/green{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/reagent_containers/glass/bottle/nutrient/ez, /obj/item/reagent_containers/glass/bottle/nutrient/l4z, /obj/item/reagent_containers/glass/bottle/nutrient/rh, @@ -2440,7 +2440,6 @@ /obj/structure/table/optable{ name = "Robotics Operating Table" }, -/obj/item/surgical_drapes, /turf/open/floor/iron/white, /area/ruin/space/has_grav/ancientstation/delta/rnd) "gR" = ( @@ -2460,12 +2459,12 @@ name = "Engineering Storage" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/storage) "gT" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/airless, @@ -2485,7 +2484,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/engie) "gW" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "gX" = ( @@ -2527,7 +2526,7 @@ /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "he" = ( @@ -2564,7 +2563,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "hk" = ( @@ -2576,7 +2575,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "hm" = ( @@ -2585,7 +2584,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/engie) "hn" = ( @@ -2600,13 +2599,13 @@ "ho" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "hp" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -2618,7 +2617,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "hr" = ( @@ -2708,7 +2707,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "hE" = ( @@ -2723,9 +2722,6 @@ /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 @@ -2792,7 +2788,7 @@ "hL" = ( /obj/machinery/light/small/directional/east, /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/ancientstation/delta/ai) @@ -2811,7 +2807,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "hP" = ( @@ -2833,7 +2829,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "hR" = ( @@ -2920,7 +2916,7 @@ "ia" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -2938,7 +2934,7 @@ id = "ancient" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -2957,7 +2953,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -2976,7 +2972,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/solar_control{ dir = 1; id = "aftport"; @@ -3008,14 +3004,14 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "ih" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/generic, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "ii" = ( @@ -3036,7 +3032,7 @@ /obj/structure/transit_tube{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3181,7 +3177,7 @@ dir = 4 }, /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3212,7 +3208,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/east{ start_charge = 0 }, @@ -3223,7 +3219,7 @@ name = "Medical Bay" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor/closed, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -3302,7 +3298,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/rnd) "iF" = ( -/obj/machinery/chem_heater/withbuffer, +/obj/machinery/chem_heater, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, @@ -3384,7 +3380,7 @@ "iO" = ( /obj/structure/transit_tube/crossing/horizontal, /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3467,7 +3463,7 @@ name = "backup power storage unit" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/storage) "iW" = ( @@ -3546,7 +3542,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/hall) "jh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/directional/east, /obj/effect/turf_decal/tile/yellow{ @@ -3566,7 +3562,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/storage) "jk" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -3580,7 +3576,7 @@ dir = 5 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "jm" = ( @@ -3593,7 +3589,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "jn" = ( @@ -3629,7 +3625,7 @@ /obj/structure/transit_tube{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3642,7 +3638,7 @@ /obj/structure/transit_tube/station/reverse/flipped, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3654,7 +3650,7 @@ "jr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3670,7 +3666,7 @@ req_access_txt = "200" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3694,7 +3690,7 @@ "jv" = ( /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "jx" = ( @@ -3742,7 +3738,7 @@ /area/ruin/space/has_grav/ancientstation/delta/ai) "jD" = ( /obj/item/solar_assembly, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/ancientstation/charlie/solars) "jE" = ( @@ -3772,7 +3768,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "jJ" = ( @@ -3784,7 +3780,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "jK" = ( @@ -3852,7 +3848,7 @@ "jQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/stack/sheet/glass{ amount = 50 }, @@ -3866,7 +3862,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hall) "jR" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/storage) "jS" = ( @@ -3890,7 +3886,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) "jV" = ( @@ -3923,7 +3919,7 @@ /area/ruin/space/has_grav/ancientstation/delta/rnd) "jX" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3931,7 +3927,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hydro) "jY" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, @@ -3963,7 +3959,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hall) "kb" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3998,7 +3994,7 @@ /area/ruin/space/has_grav/ancientstation/delta/proto) "kh" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/ruin/space/has_grav/ancientstation/delta/proto) "ki" = ( @@ -4072,18 +4068,6 @@ }, /turf/open/floor/iron/white, /area/ruin/space/has_grav/ancientstation/delta/rnd) -"kr" = ( -/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/ghost_role/human/oldsec, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/ancientstation/charlie/dorms) "ks" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -4181,7 +4165,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/external/ruin{ name = "Engineering External Access" }, @@ -4201,7 +4185,7 @@ "kJ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "kK" = ( @@ -4238,18 +4222,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) -"kO" = ( -/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/ghost_role/human/oldsci, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/has_grav/ancientstation/charlie/dorms) "kP" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -4354,7 +4326,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/ancientstation/delta/proto) "ld" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /obj/structure/alien/weeds, /turf/open/floor/iron/dark, @@ -4415,18 +4387,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/ancientstation/delta/ai) -"ln" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldeng, -/turf/open/floor/iron, -/area/ruin/space/has_grav/ancientstation/charlie/dorms) "lo" = ( /turf/closed/mineral/silver, /area/ruin/unpowered) @@ -4448,7 +4408,6 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/oldsci, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) "ls" = ( @@ -4466,7 +4425,7 @@ "lv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/power/apc/auto_name/directional/east{ @@ -4479,12 +4438,12 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) "lx" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/small/directional/north, /obj/machinery/power/apc/auto_name/directional/north{ start_charge = 0 @@ -4513,7 +4472,7 @@ name = "Prototype Laboratory"; req_access_txt = "200" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/ancientstation/delta/proto) @@ -4641,7 +4600,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/dorms) "lS" = ( /obj/machinery/power/solar, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/solars/ancientstation/charlie/solars) "lT" = ( @@ -4668,7 +4627,7 @@ "lX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/maintenance_hatch, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -4687,7 +4646,7 @@ /area/ruin/space/has_grav/ancientstation/beta/atmos) "lZ" = ( /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/ancientstation/delta/ai) @@ -4724,19 +4683,19 @@ "mh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "mi" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "mj" = ( /obj/machinery/door/airlock/highsecurity, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/xtracks, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, @@ -4815,7 +4774,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "mt" = ( @@ -4840,7 +4799,7 @@ /obj/item/paper/fluff/ruins/oldstation/protosleep{ info = "*Prototype Sleeper*

We have deliverted the lastest in medical technology to the medical bay for your use." }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ dir = 4 @@ -4871,7 +4830,7 @@ /area/ruin/space/has_grav/ancientstation/beta/hall) "my" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/solars/ancientstation/charlie/solars) "mz" = ( @@ -4971,7 +4930,7 @@ /obj/machinery/door/airlock/mining/glass{ name = "Mining Equipment" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5016,7 +4975,7 @@ }, /obj/effect/turf_decal/tile/brown, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/south{ start_charge = 0 }, @@ -5028,11 +4987,11 @@ }, /obj/effect/turf_decal/tile/brown, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/mining) "mS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -5064,7 +5023,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/mining) "mV" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -5087,7 +5046,7 @@ "mY" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -5097,7 +5056,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/hall) "mZ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5105,7 +5064,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/hall) "na" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5128,7 +5087,7 @@ id = "ancient" }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -5139,7 +5098,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "nc" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -5162,7 +5121,7 @@ "ne" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 8 @@ -5294,14 +5253,14 @@ /area/ruin/space/has_grav/ancientstation/beta/atmos) "nu" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/stack/rods, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/atmos) "nv" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/atmos/glass{ name = "Station Atmospherics" @@ -5309,11 +5268,11 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/beta/atmos) "nw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/ancientstation/beta/hall) "nx" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/shard, /obj/machinery/atmospherics/components/binary/pump/layer4, /turf/open/floor/plating/airless, @@ -5372,7 +5331,6 @@ pixel_y = 12 }, /obj/item/retractor, -/obj/item/surgical_drapes, /obj/effect/turf_decal/tile/blue{ dir = 8 }, @@ -5417,7 +5375,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/engie) "nJ" = ( @@ -5425,7 +5383,7 @@ /obj/machinery/door/airlock/engineering{ name = "Backup Generator Room" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/storage) "nK" = ( @@ -5442,7 +5400,7 @@ "nL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5469,7 +5427,7 @@ /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "nP" = ( @@ -5500,7 +5458,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "nV" = ( @@ -5513,7 +5471,7 @@ dir = 1 }, /obj/structure/alien/weeds, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5526,7 +5484,7 @@ dir = 1 }, /mob/living/simple_animal/hostile/alien, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "nX" = ( @@ -5546,7 +5504,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/layer4{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "oa" = ( @@ -5588,7 +5546,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "oe" = ( @@ -5659,7 +5617,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5672,7 +5630,7 @@ "oo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/tracks, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5768,7 +5726,7 @@ pixel_x = -23 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5857,7 +5815,7 @@ /area/ruin/space/has_grav/ancientstation/delta/hall) "oM" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/stack/rods, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -5870,7 +5828,7 @@ "oN" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/xenoblood/xgibs/larva/body, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "oO" = ( @@ -5886,14 +5844,14 @@ icon_state = "medium" }, /obj/effect/decal/cleanable/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west{ start_charge = 0 }, /turf/open/floor/plating/airless, /area/ruin/space/has_grav/ancientstation/beta/storage) "oQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/shard{ icon_state = "small" }, @@ -5921,7 +5879,7 @@ "oU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/xenoblood/xgibs/up, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5949,7 +5907,7 @@ pixel_x = -23 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) @@ -5972,7 +5930,7 @@ /area/ruin/space/has_grav/ancientstation/delta/hall) "pc" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ @@ -6024,7 +5982,7 @@ /obj/machinery/power/apc/auto_name/directional/east{ start_charge = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) "pi" = ( @@ -6099,7 +6057,7 @@ /obj/machinery/power/apc/auto_name/directional/south{ start_charge = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/storage) "pB" = ( @@ -6163,7 +6121,7 @@ /turf/open/floor/engine/o2, /area/ruin/space/has_grav/ancientstation/beta/atmos) "qA" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/airless, @@ -6190,7 +6148,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "rW" = ( @@ -6245,7 +6203,7 @@ "ty" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/rnd) "tz" = ( @@ -6263,7 +6221,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "tO" = ( @@ -6289,7 +6247,7 @@ /turf/open/floor/plating/airless, /area/ruin/space/has_grav/ancientstation/beta/hall) "uB" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -6300,7 +6258,7 @@ /area/ruin/space/has_grav/ancientstation/beta/hall) "uP" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating/airless, @@ -6330,7 +6288,7 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/ancientstation/charlie/kitchen) "vM" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -6379,13 +6337,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) "wj" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/storage) "wx" = ( @@ -6403,7 +6361,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "wL" = ( @@ -6416,7 +6374,7 @@ "xr" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -6475,7 +6433,7 @@ "zB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -6490,7 +6448,7 @@ "zH" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -6520,7 +6478,7 @@ /area/ruin/space/has_grav/ancientstation/beta/atmos) "Af" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -6543,7 +6501,7 @@ /area/ruin/space/has_grav/ancientstation/beta/atmos) "BX" = ( /obj/effect/decal/cleanable/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating/airless, @@ -6571,7 +6529,7 @@ "Dg" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, @@ -6592,7 +6550,7 @@ /area/ruin/space/has_grav/ancientstation/beta/atmos) "Dt" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/template_noop) "Dw" = ( @@ -6673,7 +6631,7 @@ "Fv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/dorms) "FH" = ( @@ -6693,7 +6651,7 @@ "FP" = ( /obj/machinery/power/rtg/old_station, /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/template_noop) "FV" = ( @@ -6718,7 +6676,7 @@ "GS" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 9 }, @@ -6760,13 +6718,13 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/tracks, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "Iy" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 4 }, @@ -6838,7 +6796,7 @@ /area/ruin/space/has_grav/ancientstation/delta/rnd) "KD" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/delta/storage) "KF" = ( @@ -6937,13 +6895,13 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/west, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "MZ" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 6 }, @@ -6952,7 +6910,7 @@ "NE" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/charlie/hall) @@ -7030,7 +6988,7 @@ "Pd" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -7158,7 +7116,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "Sn" = ( @@ -7216,7 +7174,7 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/machinery/door/firedoor/closed, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "TL" = ( @@ -7246,7 +7204,7 @@ /area/ruin/space/has_grav/ancientstation/delta/storage) "UB" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/north{ start_charge = 0 }, @@ -7287,13 +7245,13 @@ /turf/closed/wall, /area/ruin/space/has_grav/ancientstation/delta/storage) "Wk" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "Wn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/corner{ dir = 8 }, @@ -7315,7 +7273,7 @@ "WA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -7348,7 +7306,7 @@ /area/ruin/space/has_grav/ancientstation/charlie/hydro) "XJ" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/ancientstation/charlie/engie) "Yc" = ( @@ -7369,7 +7327,7 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/ancientstation/delta/hall) "Yi" = ( @@ -7410,7 +7368,7 @@ "YM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -9350,9 +9308,9 @@ jJ cq jS bN -ln +lr bN -kO +lr bN lr pm @@ -9546,9 +9504,9 @@ jJ FV jT Fv -kr +lr bN -ln +lr bN kp pk diff --git a/_maps/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/RandomRuins/SpaceRuins/onehalf.dmm index 7ebedbdf072b..fb231e283b85 100644 --- a/_maps/RandomRuins/SpaceRuins/onehalf.dmm +++ b/_maps/RandomRuins/SpaceRuins/onehalf.dmm @@ -4,7 +4,7 @@ /area/template_noop) "ab" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/template_noop) "ad" = ( @@ -57,7 +57,7 @@ /area/ruin/space/has_grav/onehalf/dorms_med) "aq" = ( /obj/machinery/door/airlock/external/ruin, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/onehalf/drone_bay) "ar" = ( @@ -144,7 +144,7 @@ /area/ruin/space/has_grav/onehalf/dorms_med) "aD" = ( /obj/machinery/light/small/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/onehalf/drone_bay) "aE" = ( @@ -171,7 +171,7 @@ /turf/open/floor/iron/white, /area/ruin/space/has_grav/onehalf/dorms_med) "aL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/ruin/space/has_grav/onehalf/dorms_med) "aM" = ( @@ -181,7 +181,7 @@ /obj/item/reagent_containers/blood/o_minus, /obj/item/reagent_containers/blood/o_minus, /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/ruin/space/has_grav/onehalf/dorms_med) "aN" = ( @@ -229,13 +229,13 @@ /turf/template_noop, /area/template_noop) "aT" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "aV" = ( /obj/machinery/door/airlock/medical/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/ruin/space/has_grav/onehalf/dorms_med) "aW" = ( @@ -246,7 +246,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/drone_bay) "aY" = ( @@ -254,7 +254,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/drone_bay) "aZ" = ( @@ -281,12 +281,10 @@ pixel_y = 32 }, /obj/machinery/button/door/directional/north{ - custom_acid_overlay = "onehalf_drone2int"; name = "Drone 2 Internal Hatch Override"; pixel_x = 8 }, /obj/machinery/button/door/directional/north{ - custom_acid_overlay = "onehalf_drone1int"; name = "Drone 1 Internal Hatch Override"; pixel_x = -8 }, @@ -315,12 +313,10 @@ pixel_y = 32 }, /obj/machinery/button/door/directional/north{ - custom_acid_overlay = "onehalf_drone4int"; name = "Drone 4 Internal Hatch Override"; pixel_x = 8 }, /obj/machinery/button/door/directional/north{ - custom_acid_overlay = "onehalf_drone3int"; name = "Drone 3 Internal Hatch Override"; pixel_x = -8 }, @@ -354,7 +350,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) @@ -362,14 +358,14 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bk" = ( /obj/structure/disposalpipe/junction{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) @@ -377,7 +373,7 @@ /obj/structure/disposalpipe/junction{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bn" = ( @@ -385,14 +381,14 @@ dir = 4 }, /obj/machinery/door/airlock/public/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/drone_bay) "bo" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/drone_bay) "bp" = ( @@ -470,7 +466,7 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/airless, /area/ruin/space/has_grav/onehalf/hallway) "bB" = ( @@ -618,7 +614,7 @@ /area/ruin/space/has_grav/onehalf/bridge) "cf" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cg" = ( @@ -702,7 +698,7 @@ id = "bridge_onehalf"; name = "bridge blast door" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/onehalf/bridge) "cr" = ( @@ -768,12 +764,12 @@ /obj/machinery/door/airlock/command/glass{ name = "Bridge" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cF" = ( /obj/machinery/light/small/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cG" = ( @@ -784,7 +780,7 @@ /obj/machinery/door/airlock/command/glass{ name = "Bridge" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cI" = ( @@ -801,7 +797,7 @@ /obj/structure/chair/comfy/black{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cK" = ( @@ -829,7 +825,7 @@ /area/ruin/space/has_grav/onehalf/bridge) "cS" = ( /obj/structure/chair/office, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "cT" = ( @@ -902,13 +898,13 @@ /area/template_noop) "ms" = ( /obj/item/stack/tile/iron/base, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "nu" = ( /obj/item/crowbar/red, /obj/item/multitool, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/onehalf/bridge) "pG" = ( @@ -930,11 +926,11 @@ /area/ruin/space/has_grav/onehalf/dorms_med) "KC" = ( /obj/structure/frame/computer, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) "Vh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/ruin/space/has_grav/onehalf/bridge) diff --git a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm b/_maps/RandomRuins/SpaceRuins/originalcontent.dmm deleted file mode 100644 index 5679fcba3cfd..000000000000 --- a/_maps/RandomRuins/SpaceRuins/originalcontent.dmm +++ /dev/null @@ -1,2942 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/obj/structure/fluff/paper/corner, -/turf/template_noop, -/area/template_noop) -"ac" = ( -/obj/structure/fluff/paper, -/turf/template_noop, -/area/template_noop) -"ad" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/template_noop, -/area/template_noop) -"ae" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/template_noop, -/area/template_noop) -"af" = ( -/turf/closed/indestructible/paper, -/area/ruin/powered) -"ag" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/turf/template_noop, -/area/template_noop) -"ah" = ( -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/template_noop, -/area/template_noop) -"ai" = ( -/obj/structure/fluff/paper{ - dir = 6 - }, -/turf/template_noop, -/area/template_noop) -"aj" = ( -/obj/machinery/door/airlock/freezer{ - name = "airlock"; - opacity = 0 - }, -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ak" = ( -/obj/structure/fluff/paper{ - dir = 9 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"al" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"am" = ( -/obj/structure/fluff/paper{ - dir = 5 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"an" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ao" = ( -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ap" = ( -/turf/open/indestructible/paper, -/area/ruin/powered) -"aq" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ar" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"as" = ( -/obj/item/paper/crumpled/ruins/originalcontent, -/turf/open/indestructible/paper, -/area/ruin/powered) -"at" = ( -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"au" = ( -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"av" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aw" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/turf/template_noop, -/area/template_noop) -"ax" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ay" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"az" = ( -/obj/structure/fluff/paper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aA" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aB" = ( -/obj/structure/fluff/paper/stack, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aC" = ( -/obj/structure/fluff/paper{ - dir = 5 - }, -/obj/structure/fluff/paper{ - dir = 9 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aD" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper/corner, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aE" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aF" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/barricade/wooden, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aG" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/barricade/wooden, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aH" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 5 - }, -/obj/structure/barricade/wooden, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aI" = ( -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aJ" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/fluff/paper/corner, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aK" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aL" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aM" = ( -/obj/structure/fluff/paper/stack{ - dir = 10 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aN" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aO" = ( -/obj/structure/fluff/paper, -/mob/living/basic/stickman/dog, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aP" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aQ" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aR" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aS" = ( -/obj/structure/fluff/paper/corner, -/mob/living/basic/stickman/dog, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aT" = ( -/obj/structure/fluff/paper{ - dir = 6 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aU" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/fluff/paper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aV" = ( -/obj/structure/fluff/paper{ - dir = 6 - }, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aW" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/stack, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aX" = ( -/obj/structure/fluff/paper/stack, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aY" = ( -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"aZ" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ba" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/basic/stickman/dog, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bb" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bc" = ( -/obj/structure/fluff/paper{ - dir = 9 - }, -/turf/template_noop, -/area/template_noop) -"bd" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/turf/template_noop, -/area/template_noop) -"be" = ( -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/template_noop, -/area/template_noop) -"bf" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bg" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/item/toy/crayon/yellow, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bh" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/item/toy/crayon/red, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bi" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/corner, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bj" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bk" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bl" = ( -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bm" = ( -/obj/structure/fluff/paper, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bn" = ( -/obj/structure/fluff/paper{ - dir = 9 - }, -/obj/structure/fluff/paper{ - dir = 10 - }, -/turf/template_noop, -/area/template_noop) -"bo" = ( -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/template_noop, -/area/template_noop) -"bp" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/item/toy/crayon/rainbow, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bq" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"br" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bs" = ( -/obj/item/toy/crayon/spraycan, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bt" = ( -/obj/item/storage/crayons, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bu" = ( -/mob/living/basic/stickman/ranged, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bv" = ( -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bw" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/template_noop, -/area/template_noop) -"bx" = ( -/obj/structure/fluff/paper{ - dir = 5 - }, -/turf/template_noop, -/area/template_noop) -"by" = ( -/obj/structure/fluff/paper/corner, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bz" = ( -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/obj/structure/fluff/paper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bA" = ( -/obj/item/toner, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bB" = ( -/obj/structure/easel, -/obj/item/paper/pamphlet/ruin/originalcontent/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bC" = ( -/obj/item/toy/crayon/yellow, -/obj/structure/fluff/paper{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bD" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bE" = ( -/mob/living/basic/stickman/dog, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bF" = ( -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/fluff/paper/stack, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bG" = ( -/obj/item/toy/crayon/blue, -/mob/living/basic/stickman/ranged, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bH" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/item/toy/crayon/yellow, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bI" = ( -/obj/structure/fluff/paper{ - dir = 9 - }, -/obj/structure/closet/crate/bin, -/obj/item/paper/crumpled/ruins/originalcontent, -/obj/item/paper/crumpled/ruins/originalcontent, -/obj/item/paper/crumpled/ruins/originalcontent, -/obj/item/gps/spaceruin, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bJ" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/easel, -/obj/item/paper/pamphlet/ruin/originalcontent/treeside, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bK" = ( -/obj/structure/fluff/paper{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/item/storage/crayons, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bL" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/stack{ - dir = 6 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bM" = ( -/obj/item/toy/crayon/purple, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bN" = ( -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bO" = ( -/obj/machinery/door/airlock/freezer{ - name = "airlock"; - opacity = 0 - }, -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bP" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/corner{ - dir = 8 - }, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bQ" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/obj/structure/fluff/paper/stack, -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bR" = ( -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bS" = ( -/obj/structure/fluff/paper/stack{ - dir = 1 - }, -/obj/structure/fluff/paper/stack, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bT" = ( -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/obj/structure/fluff/paper/stack{ - dir = 6 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bU" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bV" = ( -/obj/item/toy/crayon/yellow, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bW" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/easel, -/obj/item/paper/pamphlet/ruin/originalcontent/pennywise, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bX" = ( -/obj/item/toy/crayon/blue, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bY" = ( -/obj/item/toy/crayon/red, -/turf/open/indestructible/paper, -/area/ruin/powered) -"bZ" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet/rainbow, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ca" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/obj/structure/table/wood, -/obj/item/storage/crayons, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cb" = ( -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/obj/item/toy/crayon/purple, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cc" = ( -/mob/living/simple_animal/hostile/boss/paper_wizard, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cd" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/toy/crayon/rainbow, -/obj/item/toy/crayon/spraycan, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ce" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/fluff/paper/corner{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cf" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper/stack, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cg" = ( -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ch" = ( -/obj/structure/fluff/paper, -/obj/item/paper/crumpled/ruins/originalcontent, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ci" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper/corner{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cj" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/basic/stickman, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ck" = ( -/obj/structure/fluff/paper{ - dir = 6 - }, -/obj/structure/fluff/paper{ - dir = 5 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cl" = ( -/obj/structure/fluff/paper/corner, -/obj/structure/fluff/paper/stack{ - dir = 4 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cm" = ( -/obj/structure/fluff/paper, -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cn" = ( -/obj/structure/fluff/paper{ - dir = 6 - }, -/obj/structure/table/wood, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas, -/obj/item/canvas/nineteen_nineteen, -/turf/open/indestructible/paper, -/area/ruin/powered) -"co" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper/stack{ - dir = 9 - }, -/obj/item/toy/crayon/blue, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cp" = ( -/obj/structure/fluff/paper{ - dir = 10 - }, -/obj/machinery/photocopier, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cq" = ( -/obj/structure/fluff/paper, -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/pen/fourcolor, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cr" = ( -/obj/structure/fluff/paper, -/obj/structure/easel, -/obj/item/paper/pamphlet/ruin/originalcontent/yelling, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cs" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/basic/stickman/dog, -/turf/open/indestructible/paper, -/area/ruin/powered) -"ct" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cu" = ( -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper/stack{ - dir = 6 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cv" = ( -/obj/structure/fluff/paper, -/obj/structure/fluff/paper/stack{ - dir = 6 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"cw" = ( -/obj/structure/fluff/paper{ - dir = 1 - }, -/mob/living/basic/stickman/ranged, -/turf/open/indestructible/paper, -/area/ruin/powered) -"wr" = ( -/obj/machinery/door/airlock/freezer{ - name = "airlock"; - opacity = 0 - }, -/obj/structure/fluff/paper{ - dir = 8 - }, -/obj/structure/fluff/paper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/indestructible/paper, -/area/ruin/powered) -"Ns" = ( -/obj/item/paper/secretrecipe, -/turf/open/indestructible/paper, -/area/ruin/powered) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ae -ae -bw -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 -ac -af -af -bd -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 -ab -ai -af -af -bx -bw -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 -ac -af -af -af -af -bd -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 -ab -ae -ae -ai -af -af -af -af -bd -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 -ac -af -af -af -af -af -af -af -bd -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 -ab -ai -af -af -af -af -af -af -af -bx -ae -ae -bw -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 -ab -ae -ae -ae -ai -af -af -af -af -af -af -af -af -af -af -af -bx -ae -ae -ae -ae -ae -bw -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -bx -ae -bw -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ae -ai -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -bx -ae -ae -ae -ae -bw -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -ak -ar -ar -ay -af -ak -ar -ar -ar -ar -ar -ar -ar -ar -ar -ay -af -af -af -af -af -af -af -bx -ae -ae -bw -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ab -ai -af -af -af -af -af -af -ak -aY -aq -aq -bk -bp -aY -aq -aq -aq -aq -bL -aq -bU -ax -ap -ch -af -af -af -af -af -af -af -af -af -af -bd -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -al -az -af -af -am -bq -aT -af -af -af -af -af -af -af -am -aq -ci -af -af -af -af -af -af -af -af -af -af -bd -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -aW -az -af -af -af -af -af -af -af -af -af -af -af -af -af -af -aR -ay -af -af -af -af -af -af -bc -aw -aw -be -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -ab -ae -ai -af -af -af -af -af -af -af -al -az -af -af -af -af -ak -ar -ar -ar -ay -af -af -af -af -af -cj -co -af -af -af -bc -aw -aw -be -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -af -af -am -aZ -ay -af -af -af -al -ap -ap -ap -aA -ar -ay -af -af -af -al -az -af -af -af -bd -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -ab -ae -ai -af -af -af -af -af -af -af -af -af -af -al -az -af -af -ak -ao -ap -ap -ap -ap -ap -az -af -af -af -am -aZ -ay -af -af -bd -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -ac -af -af -af -af -af -af -ak -ay -af -af -af -af -ba -aA -bg -ar -ao -bl -ap -bu -ap -ap -aM -az -af -af -af -af -al -az -af -af -bd -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -ac -af -af -af -af -af -af -al -az -af -af -af -af -am -aq -ax -ap -ap -ap -ap -ap -bA -bE -ap -aA -ar -ay -af -af -al -az -af -af -bd -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -ab -ai -af -af -af -af -af -af -al -aA -ay -af -af -af -af -af -al -bl -ap -bt -ap -ap -ap -ap -ap -ap -ap -az -af -af -am -aZ -ay -af -bx -ae -bw -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -ac -af -af -af -af -af -aC -aE -ao -aI -az -af -af -af -af -af -am -ax -ap -ap -ap -ap -bB -ap -ap -ap -bu -az -af -af -af -al -az -af -af -af -bd -aa -aa -aa -aa -"} -(22,1,1) = {" -ab -ae -ai -af -af -af -af -af -af -am -aq -aJ -aN -aP -aE -ar -ay -af -af -am -ax -bu -by -aq -aq -bF -ap -ap -bt -az -af -af -af -al -az -af -af -af -bd -aa -aa -aa -aa -"} -(23,1,1) = {" -ac -af -af -af -af -af -af -af -af -af -af -aK -af -af -al -aX -az -af -af -af -am -ax -az -af -af -al -as -bR -ap -az -af -af -af -al -cv -af -af -af -bd -aa -aa -aa -aa -"} -(24,1,1) = {" -ac -af -af -af -af -af -af -af -af -af -af -aL -ay -af -am -aq -bb -ar -ay -af -af -al -bz -af -af -al -bM -ap -ap -aA -ay -af -af -bi -aT -af -af -af -bd -aa -aa -aa -aa -"} -(25,1,1) = {" -ac -af -af -af -af -af -af -af -af -af -af -al -az -af -af -af -al -ap -az -af -af -al -aA -ar -bC -ao -ap -ap -bV -ap -az -af -af -cs -af -af -af -af -bd -aa -aa -aa -aa -"} -(26,1,1) = {" -ac -af -af -af -ak -ar -ar -ay -af -af -af -al -aO -af -af -af -am -bf -aZ -ay -af -al -ap -ap -ap -bG -ap -bM -ap -ap -az -af -af -ct -af -af -af -af -bd -aa -aa -aa -aa -"} -(27,1,1) = {" -ac -af -af -af -al -ap -ap -az -af -af -af -am -aN -aQ -af -af -af -af -bh -az -af -al -ap -aI -by -bH -bN -aq -aq -ax -az -af -af -ct -af -af -af -af -bd -aa -aa -aa -aa -"} -(28,1,1) = {" -ac -af -af -af -al -as -ap -az -af -af -af -af -af -aR -ay -af -af -af -al -bm -af -al -ap -ap -az -af -bO -af -af -am -aN -aQ -af -aR -ay -af -af -af -bd -aa -aa -aa -aa -"} -(29,1,1) = {" -ac -af -af -af -al -ap -ap -aA -ay -af -af -af -af -am -aU -af -af -af -bi -aT -af -al -aX -ap -az -af -bP -ay -af -af -af -ck -af -am -ci -af -af -af -bd -aa -aa -aa -aa -"} -(30,1,1) = {" -ac -af -af -ak -ao -ap -ap -aB -aD -aF -aG -af -af -af -aK -af -af -ak -bj -af -af -al -ap -ap -az -af -al -Ns -bW -ca -af -af -af -af -aR -ay -af -af -bd -aa -aa -aa -aa -"} -(31,1,1) = {" -ac -af -af -al -ap -ap -ap -ap -az -af -aH -an -an -an -aV -af -af -al -az -af -af -am -aq -aq -aT -af -bQ -ap -ap -aA -cf -ar -cp -af -al -az -af -af -bd -aa -aa -aa -aa -"} -(32,1,1) = {" -ad -ag -af -al -ap -at -ap -ap -az -af -af -af -af -af -af -af -af -al -az -af -af -af -af -af -af -af -al -bS -bX -ap -bR -ap -cq -af -am -aZ -ay -af -bd -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -ac -af -al -ap -ap -ap -ap -aA -ay -af -af -af -af -af -af -af -al -az -af -af -af -af -af -af -bI -ao -bM -bt -cb -ap -ap -cr -af -af -al -az -af -bx -bw -aa -aa -aa -"} -(34,1,1) = {" -aa -ac -af -al -ap -ap -ap -ap -ap -aA -ar -ay -af -af -af -af -af -am -bb -ay -af -af -af -af -af -bJ -bA -ap -bY -cc -ap -cl -aT -af -af -al -az -af -af -bd -aa -aa -aa -"} -(35,1,1) = {" -aa -ac -af -am -aq -au -ap -ap -ap -ap -ap -az -af -af -af -af -af -af -al -az -af -af -af -af -af -bK -aq -bT -ap -ap -ap -cm -af -af -ak -ao -az -af -af -bd -aa -aa -aa -"} -(36,1,1) = {" -aa -ac -af -af -af -al -ap -ap -at -as -ap -aA -ay -af -af -af -af -af -am -bb -br -ay -af -af -af -af -af -am -bZ -cd -cg -cn -af -af -al -ap -az -af -af -bd -aa -aa -aa -"} -(37,1,1) = {" -aa -ah -aj -an -wr -av -ap -ap -ap -ap -ap -ap -aA -ar -ay -af -af -af -af -al -bs -az -af -af -af -af -af -af -af -af -af -af -af -af -cw -ap -az -af -af -bd -aa -aa -aa -"} -(38,1,1) = {" -aa -ac -af -af -af -am -ax -ap -ap -ap -ap -aM -ap -ap -az -af -af -af -af -am -aq -bv -aE -ar -ay -af -af -af -af -af -af -af -ak -cu -aY -aq -aT -af -af -bd -aa -aa -aa -"} -(39,1,1) = {" -aa -ad -ag -af -af -af -am -aq -aq -ax -ap -ap -ap -aS -aT -af -af -af -af -af -af -af -al -bu -az -af -af -af -af -ak -ar -ar -aY -aq -aT -af -af -af -af -bd -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -ad -ag -af -af -af -af -af -am -aq -aq -ax -az -af -af -af -af -af -af -af -af -am -aq -bD -an -an -an -an -ce -bq -aq -aT -af -af -af -af -af -bc -be -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -ad -ag -af -af -af -af -af -af -af -am -aT -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -bd -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -ad -aw -ag -af -af -af -af -af -af -af -af -af -af -af -af -bn -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -bd -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -ac -af -af -af -af -af -af -af -af -af -bc -aw -aw -bo -aw -aw -aw -ag -af -af -af -af -af -af -af -af -af -af -af -bc -aw -aw -be -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -ad -aw -aw -ag -af -af -af -af -af -af -bd -aa -aa -aa -aa -aa -aa -aa -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -be -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aw -aw -aw -aw -aw -aw -be -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index ff04fe2c4eb8..261ef5c3f611 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -63,7 +63,7 @@ /obj/structure/chair/old{ dir = 1 }, -/obj/item/crowbar/large/heavy, +/obj/item/crowbar/heavy, /turf/open/floor/oldshuttle, /area/ruin/powered) "o" = ( diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 13b4148ba44b..dc8624394a94 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -1,6 +1,6 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "ae" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/highcap/five_k{ name = "Guest Room APC"; pixel_y = -25 @@ -14,7 +14,7 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "ai" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/terminal{ dir = 4 }, @@ -25,7 +25,7 @@ /area/ruin/space/has_grav/hotel/power) "ak" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "am" = ( @@ -35,7 +35,7 @@ /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) "an" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) @@ -52,7 +52,8 @@ /area/ruin/space/has_grav/hotel/guestroom/room_2) "aC" = ( /obj/machinery/light/small/directional/north, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "aE" = ( /obj/item/kirbyplants{ @@ -78,7 +79,7 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "be" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/smes/engineering, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) @@ -104,8 +105,8 @@ name = "Guest Room APC"; pixel_y = 25 }, -/obj/structure/cable, -/turf/open/floor/wood/parquet, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "bn" = ( /obj/machinery/door/airlock{ @@ -116,13 +117,13 @@ }, /area/ruin/space/has_grav/hotel/guestroom/room_3) "bo" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "bs" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/small/directional/north, @@ -146,14 +147,14 @@ "by" = ( /obj/structure/table/wood/fancy/purple, /obj/machinery/light_switch/directional/north, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "bz" = ( /obj/machinery/light/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "bK" = ( /obj/structure/sink{ @@ -164,13 +165,13 @@ /area/ruin/space/has_grav/hotel/pool) "bM" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "bN" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/engineering{ name = "Utilities"; req_access_txt = "200,201" @@ -181,14 +182,14 @@ "bU" = ( /obj/structure/table/wood/fancy/orange, /obj/item/flashlight/lamp, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "bV" = ( /obj/effect/turf_decal/siding/wood, /obj/item/kirbyplants{ icon_state = "plant-05" }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "bX" = ( /obj/effect/turf_decal/siding/wood{ @@ -198,11 +199,11 @@ name = "Dock APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/chair{ dir = 1 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "bY" = ( /obj/item/toy/beach_ball, @@ -214,7 +215,7 @@ /area/ruin/space/has_grav/hotel/pool) "ca" = ( /obj/structure/dresser, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "cb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -235,7 +236,7 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "ch" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "ci" = ( /obj/structure/chair/plastic{ @@ -262,7 +263,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "cq" = ( @@ -270,7 +271,7 @@ dir = 1 }, /obj/machinery/airalarm/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "cB" = ( /obj/structure/chair/sofa/left{ @@ -299,7 +300,7 @@ /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_4) "cQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/clothing/head/cone, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) @@ -307,7 +308,8 @@ /obj/structure/janitorialcart, /obj/item/mop, /obj/item/lightreplacer, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/custodial) "cV" = ( /obj/machinery/airalarm/directional/east, @@ -336,10 +338,10 @@ /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "dh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/solar_control{ dir = 8 }, @@ -366,7 +368,7 @@ /turf/open/floor/carpet/royalblue, /area/ruin/space/has_grav/hotel/guestroom/room_4) "dr" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, @@ -403,7 +405,7 @@ /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "dO" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -415,13 +417,13 @@ "eg" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/closet/crate/bin, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "ek" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "en" = ( /obj/machinery/atmospherics/pipe/layer_manifold/supply{ @@ -464,7 +466,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_6) "eF" = ( /obj/machinery/power/solar, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/has_grav/hotel) "eI" = ( @@ -520,11 +522,11 @@ "fg" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "fi" = ( /obj/structure/dresser, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "fn" = ( /obj/machinery/door/airlock/hatch, @@ -534,12 +536,12 @@ /obj/structure/chair/sofa/left{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) "fw" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/hotel) @@ -577,7 +579,7 @@ "fY" = ( /obj/machinery/light/directional/west, /obj/structure/dresser, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "fZ" = ( /obj/structure/table/wood, @@ -603,11 +605,11 @@ dir = 1 }, /obj/structure/displaycase/trophy, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "gf" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing/corner, /turf/template_noop, /area/ruin/space/has_grav/hotel) @@ -636,7 +638,7 @@ /obj/machinery/atmospherics/components/tank/air{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "gt" = ( @@ -646,7 +648,7 @@ /obj/item/bedsheet/green{ dir = 4 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "gu" = ( /obj/structure/chair/wood{ @@ -665,7 +667,7 @@ name = "Room Number 1"; pixel_y = -24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "gw" = ( /obj/structure/chair/wood{ @@ -689,7 +691,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) "gQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -704,10 +706,10 @@ /obj/effect/turf_decal/loading_area{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "hg" = ( /obj/effect/turf_decal/siding/wood, @@ -718,7 +720,7 @@ name = "Room Number 6"; pixel_y = 24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "hh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -741,11 +743,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "hw" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing{ dir = 8 }, @@ -753,7 +755,7 @@ /area/ruin/space/has_grav/hotel) "hA" = ( /obj/structure/dresser, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "hB" = ( /obj/effect/turf_decal/delivery, @@ -767,13 +769,15 @@ /obj/effect/turf_decal/box/white/corners{ dir = 4 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "hG" = ( /obj/effect/turf_decal/box/white/corners{ dir = 1 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "hI" = ( /obj/structure/railing/corner, @@ -790,9 +794,6 @@ /obj/structure/table/wood/fancy/cyan, /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) -"hN" = ( -/turf/open/floor/wood/parquet, -/area/ruin/space/has_grav/hotel/guestroom/room_5) "hO" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -816,7 +817,7 @@ name = "Kitchen APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "hU" = ( @@ -825,7 +826,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/dock) "hV" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/workroom) "hY" = ( @@ -838,7 +839,8 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "hZ" = ( -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "ia" = ( /obj/machinery/light/directional/south, @@ -934,7 +936,7 @@ /obj/item/reagent_containers/food/condiment/enzyme{ layer = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -949,7 +951,7 @@ /mob/living/simple_animal/bot/medbot{ name = "Accidents Happen" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/circuit/red, @@ -958,7 +960,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/chair, /obj/machinery/light/directional/north, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "iH" = ( /obj/effect/turf_decal/siding/wood{ @@ -993,13 +995,13 @@ dir = 1 }, /obj/effect/turf_decal/siding/wood, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "iP" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side{ dir = 1 }, @@ -1008,7 +1010,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "iT" = ( /obj/effect/turf_decal/siding/wood{ @@ -1023,7 +1025,7 @@ /turf/closed/wall, /area/ruin/space/has_grav/hotel/bar) "iV" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/clothing/head/cone, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) @@ -1036,7 +1038,7 @@ "iX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "iY" = ( /obj/effect/turf_decal/siding/wood{ @@ -1045,7 +1047,7 @@ /turf/open/floor/carpet/blue, /area/ruin/space/has_grav/hotel) "jb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/warning/nosmoking/circle{ @@ -1059,14 +1061,15 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/dock) "jg" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/clothing/gloves/color/yellow, /obj/structure/rack, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "jh" = ( /obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "jo" = ( /obj/effect/turf_decal/siding/wood{ @@ -1129,7 +1132,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "jA" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -1139,7 +1142,7 @@ dir = 1 }, /obj/machinery/vending/cigarette, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "jQ" = ( /obj/structure/frame, @@ -1159,7 +1162,7 @@ dir = 1 }, /obj/effect/spawner/random/vending/colavend, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "kd" = ( /obj/structure/tank_dispenser/oxygen, @@ -1199,7 +1202,7 @@ "kw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "ky" = ( /obj/effect/turf_decal/siding/wood{ @@ -1222,14 +1225,14 @@ /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) "kL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel/bar) "kM" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/wood, @@ -1244,7 +1247,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Dining" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_half{ @@ -1253,7 +1256,7 @@ /area/ruin/space/has_grav/hotel/bar) "kS" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing/corner{ dir = 1 }, @@ -1301,7 +1304,7 @@ "lj" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "ln" = ( @@ -1311,7 +1314,7 @@ /area/ruin/space/has_grav/hotel) "lo" = ( /obj/structure/table/wood/fancy/red, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "lr" = ( /obj/structure/fluff/tram_rail/end{ @@ -1343,10 +1346,10 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "lF" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "lI" = ( /turf/open/floor/iron/dark/side{ @@ -1357,15 +1360,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "lL" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "lR" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "lV" = ( /obj/effect/turf_decal/siding/white{ @@ -1381,13 +1385,14 @@ }, /obj/structure/closet/crate, /obj/item/clothing/under/syndicate/tacticool, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "lZ" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) "ma" = ( @@ -1399,7 +1404,7 @@ name = "Guest Room APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) "mi" = ( @@ -1419,22 +1424,22 @@ /obj/effect/turf_decal/siding/wood/end{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "mD" = ( /obj/structure/table/wood/fancy/cyan, /obj/item/flashlight/lamp, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "mF" = ( -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "mH" = ( /obj/structure/table/reinforced/plastitaniumglass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/paper_bin, /obj/structure/sign/poster/contraband/random/directional/east, /turf/open/floor/iron/dark, @@ -1474,13 +1479,14 @@ /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "mP" = ( /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel/guestroom/room_6) "mR" = ( -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "mS" = ( /obj/effect/turf_decal/siding/wood{ @@ -1490,7 +1496,7 @@ dir = 4 }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, @@ -1502,7 +1508,8 @@ /obj/structure/closet/crate, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "mW" = ( /obj/structure/table/wood, @@ -1515,7 +1522,7 @@ dir = 1 }, /obj/item/paper_bin, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "ne" = ( /obj/effect/turf_decal/siding/wood, @@ -1523,10 +1530,10 @@ /obj/structure/sign/warning/nosmoking/circle{ pixel_y = 32 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "nf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/maintenance{ name = "Hotel Maintenance"; req_access_txt = "201" @@ -1545,7 +1552,7 @@ name = "Guest Room A2" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -1568,11 +1575,11 @@ /obj/structure/sign/warning/nosmoking/circle{ pixel_y = 32 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "ns" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/hotel/dock) @@ -1581,7 +1588,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/workroom) "nw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/side{ dir = 1 @@ -1591,12 +1598,12 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/hotel) "nz" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "nA" = ( /obj/structure/filingcabinet, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel/workroom) "nE" = ( @@ -1643,9 +1650,9 @@ "og" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "ok" = ( /obj/effect/turf_decal/siding/wood{ @@ -1670,7 +1677,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 6 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "oo" = ( /obj/structure/fluff/tram_rail{ @@ -1691,7 +1698,7 @@ /obj/structure/table/wood/fancy/red, /obj/item/paper_bin, /obj/item/pen, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "oC" = ( /obj/structure/filingcabinet, @@ -1706,12 +1713,12 @@ "pa" = ( /obj/structure/table/wood, /obj/item/paper/pamphlet/ruin/spacehotel, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "pe" = ( /obj/machinery/door/airlock/external/glass, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "pm" = ( @@ -1735,7 +1742,7 @@ name = "Guest Room A6" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -1748,17 +1755,17 @@ /obj/effect/turf_decal/siding/wood/end{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "pJ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "pN" = ( /obj/structure/lattice/catwalk, @@ -1772,7 +1779,8 @@ /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/custodial) "qe" = ( /obj/structure/reagent_dispensers/watertank, @@ -1809,23 +1817,24 @@ /turf/template_noop, /area/template_noop) "qF" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "qG" = ( /obj/machinery/power/apc/highcap/five_k{ name = "Custodial APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/sink{ dir = 8; pixel_x = 11 }, /obj/item/reagent_containers/spray/cleaner, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/custodial) "qI" = ( /obj/structure/fluff/tram_rail/end{ @@ -1843,14 +1852,14 @@ }, /area/ruin/space/has_grav/hotel) "qM" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "qO" = ( /obj/structure/table/reinforced, /obj/machinery/processor{ pixel_y = 12 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -1863,24 +1872,24 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "qU" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "re" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "rk" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "rl" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "rr" = ( /obj/machinery/light/directional/west, @@ -1897,7 +1906,7 @@ /area/ruin/space/has_grav/hotel) "rN" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "rP" = ( /obj/machinery/door/airlock/grunge{ @@ -1905,7 +1914,7 @@ req_access_txt = "200" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_half{ @@ -1919,7 +1928,8 @@ /obj/effect/turf_decal/box/white/corners{ dir = 8 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "st" = ( /obj/effect/turf_decal/siding/wood{ @@ -1931,7 +1941,7 @@ name = "Guest Room A1" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -1956,7 +1966,7 @@ name = "Hotel Maintenance"; req_access_txt = "201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/guestroom/room_3) "sJ" = ( @@ -1982,9 +1992,9 @@ /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "sP" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "sU" = ( /obj/structure/chair{ @@ -1993,7 +2003,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "sW" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/small/directional/south, /obj/machinery/power/smes/engineering, /turf/open/floor/plating, @@ -2041,7 +2051,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Pool" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, @@ -2073,7 +2083,7 @@ name = "Room Number 4"; pixel_y = 24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "uf" = ( /obj/machinery/light/small/directional/south, @@ -2081,7 +2091,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_3) "ui" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/engineering{ name = "Utilities"; req_access_txt = "200,201" @@ -2102,7 +2112,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/chair, /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "uG" = ( /obj/structure/chair/comfy{ @@ -2121,7 +2131,7 @@ /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "uK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "uW" = ( @@ -2129,7 +2139,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Guest Suites" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured_half, @@ -2184,7 +2194,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "vH" = ( /obj/effect/turf_decal/siding/wood, @@ -2207,7 +2217,7 @@ /obj/structure/chair/office/light{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "vR" = ( /obj/structure/lattice/catwalk, @@ -2217,15 +2227,15 @@ /obj/structure/railing{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "vS" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "vV" = ( /obj/item/soap, @@ -2244,10 +2254,10 @@ pixel_x = 26; pixel_y = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "wb" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -2315,10 +2325,10 @@ /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "wB" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "wI" = ( /obj/structure/lattice/catwalk, @@ -2342,12 +2352,12 @@ /area/ruin/space/has_grav/hotel) "wT" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/space/basic, /area/ruin/space/has_grav/hotel) "wW" = ( /obj/structure/chair/plastic, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/north, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -2381,17 +2391,18 @@ name = "Hotel Maintenance"; req_access_txt = "201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/bar) "xc" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "xd" = ( /obj/effect/turf_decal/box/white/corners, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "xe" = ( /obj/structure/sign/poster/random/directional/north, @@ -2405,7 +2416,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "xi" = ( /obj/structure/window/reinforced/survival_pod{ @@ -2431,7 +2442,7 @@ icon_state = "plant-05" }, /obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "xs" = ( /obj/machinery/door/airlock/freezer{ @@ -2448,7 +2459,7 @@ dir = 1 }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, @@ -2516,7 +2527,7 @@ /area/ruin/space/has_grav/hotel) "yl" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2538,7 +2549,7 @@ "yw" = ( /obj/structure/table/wood/fancy/orange, /obj/machinery/light_switch/directional/south, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "yB" = ( /obj/structure/lattice/catwalk, @@ -2561,18 +2572,19 @@ /area/ruin/space/has_grav/hotel/bar) "yH" = ( /obj/machinery/light/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "yJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "yR" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "yV" = ( /obj/structure/lattice, @@ -2580,13 +2592,13 @@ /area/template_noop) "yY" = ( /obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "zb" = ( /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "ze" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/layer_manifold/supply{ dir = 4 }, @@ -2605,7 +2617,7 @@ "zy" = ( /obj/structure/table/wood/fancy/green, /obj/machinery/light_switch/directional/north, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "zz" = ( /obj/structure/railing, @@ -2620,16 +2632,16 @@ /obj/item/kirbyplants{ icon_state = "plant-05" }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "zJ" = ( /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "zO" = ( /obj/structure/bed/pod, /obj/item/bedsheet/ian, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "zZ" = ( /obj/structure/window, @@ -2645,11 +2657,11 @@ /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) "AG" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "AO" = ( /obj/structure/chair/sofa/corp/left, @@ -2661,7 +2673,7 @@ name = "Custodial Closet"; req_access_txt = "200,201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/textured_half, /area/ruin/space/has_grav/hotel/custodial) "AT" = ( @@ -2678,7 +2690,7 @@ pixel_x = 10; pixel_y = 17 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -2687,7 +2699,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "AZ" = ( /turf/open/floor/iron/showroomfloor, @@ -2708,13 +2720,13 @@ "Bl" = ( /obj/structure/table/wood/fancy/green, /obj/item/flashlight/lamp, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_5) "By" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "BH" = ( /obj/structure/table/reinforced, @@ -2738,7 +2750,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) "BU" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/circuit/green, /area/ruin/space/has_grav/hotel) "Cl" = ( @@ -2746,7 +2758,8 @@ /area/template_noop) "Ct" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "Cu" = ( /obj/structure/railing, @@ -2771,7 +2784,7 @@ }, /area/ruin/space/has_grav/hotel/pool) "CH" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/terminal, /obj/structure/rack, /turf/open/floor/plating, @@ -2802,7 +2815,7 @@ dir = 8 }, /obj/structure/railing/corner, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "CW" = ( @@ -2843,7 +2856,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, @@ -2874,7 +2887,7 @@ /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) "DR" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/camera/directional/east{ @@ -2894,7 +2907,7 @@ "El" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Em" = ( /obj/structure/closet/firecloset, @@ -2938,7 +2951,7 @@ "ED" = ( /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "EJ" = ( /obj/structure/table/wood/fancy/purple, @@ -2948,7 +2961,7 @@ name = "Guest Room APC"; pixel_y = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/pen, /turf/open/floor/carpet/lone, /area/ruin/space/has_grav/hotel/guestroom/room_1) @@ -2970,20 +2983,20 @@ dir = 4 }, /obj/machinery/airalarm/directional/west, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "ES" = ( /obj/machinery/door/airlock/maintenance{ name = "Hotel Maintenance"; req_access_txt = "201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/guestroom/room_5) "EY" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Fa" = ( /obj/structure/extinguisher_cabinet/directional/north, @@ -3007,7 +3020,7 @@ /turf/closed/wall, /area/ruin/space/has_grav/hotel/guestroom/room_2) "Fi" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/sign/poster/random/directional/north, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -3068,7 +3081,7 @@ }, /area/ruin/space/has_grav/hotel/dock) "Ga" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) @@ -3093,7 +3106,7 @@ /turf/open/floor/iron/dark/textured_half, /area/ruin/space/has_grav/hotel) "Gd" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/highcap/five_k{ dir = 1; name = "Power Storage APC"; @@ -3109,7 +3122,7 @@ id = "a4"; name = "privacy button" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -3134,7 +3147,7 @@ /obj/item/bedsheet/blue{ dir = 4 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "Gz" = ( /obj/structure/table/wood/fancy/royalblue, @@ -3159,14 +3172,14 @@ "Hb" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/computer/teleporter, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "Hg" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Hm" = ( /turf/closed/wall, @@ -3178,13 +3191,13 @@ /obj/item/bedsheet/purple{ dir = 4 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "Ho" = ( /obj/structure/chair/sofa/right{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/red, /area/ruin/space/has_grav/hotel/guestroom/room_3) "Hv" = ( @@ -3212,7 +3225,7 @@ /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "HD" = ( -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "HH" = ( /obj/effect/turf_decal/siding/wood{ @@ -3234,11 +3247,11 @@ /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_2) "HU" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "HV" = ( /obj/effect/spawner/structure/window/reinforced, @@ -3249,7 +3262,7 @@ name = "Dock" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/textured_half{ dir = 1 }, @@ -3275,11 +3288,11 @@ /turf/template_noop, /area/template_noop) "Ij" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Io" = ( /obj/structure/lattice, @@ -3309,7 +3322,7 @@ }, /area/ruin/space/has_grav/hotel/bar) "Iw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) "IO" = ( @@ -3321,11 +3334,11 @@ "IS" = ( /obj/structure/table/wood/fancy/royalblue, /obj/item/flashlight/lamp, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "IV" = ( /obj/effect/decal/cleanable/food/flour, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, @@ -3335,9 +3348,10 @@ /turf/template_noop, /area/template_noop) "Je" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/reagent_containers/glass/bucket, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/custodial) "Jj" = ( /obj/effect/turf_decal/loading_area, @@ -3347,7 +3361,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "JC" = ( /obj/structure/railing, @@ -3376,7 +3390,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "JQ" = ( /obj/structure/extinguisher_cabinet/directional/north, @@ -3397,7 +3411,7 @@ /obj/structure/chair{ dir = 1 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "JY" = ( /turf/closed/wall, @@ -3430,7 +3444,7 @@ /area/ruin/space/has_grav/hotel) "KJ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "KN" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -3447,7 +3461,7 @@ /turf/closed/wall, /area/ruin/space/has_grav/hotel/custodial) "Lb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/purple, /area/ruin/space/has_grav/hotel/guestroom/room_5) "Lj" = ( @@ -3465,7 +3479,7 @@ "LA" = ( /obj/structure/table/wood/fancy/purple, /obj/item/flashlight/lamp, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_1) "LB" = ( /obj/effect/turf_decal/delivery, @@ -3521,7 +3535,7 @@ "Mr" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/displaycase/trophy, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Mz" = ( /obj/structure/chair/sofa/left{ @@ -3536,7 +3550,7 @@ /area/ruin/space/has_grav/hotel) "MD" = ( /obj/structure/chair/plastic, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -3563,7 +3577,7 @@ name = "Pool APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) "MS" = ( @@ -3615,7 +3629,8 @@ pixel_x = -25; pixel_y = -25 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "NJ" = ( /obj/effect/spawner/structure/window/reinforced, @@ -3625,9 +3640,9 @@ /area/ruin/space/has_grav/hotel/dock) "NU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Oc" = ( /obj/machinery/door/firedoor, @@ -3645,7 +3660,7 @@ /area/ruin/space/has_grav/hotel) "Oi" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing{ dir = 4 }, @@ -3685,7 +3700,7 @@ name = "Guest Room A5" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -3736,7 +3751,7 @@ name = "Guest Room APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/royalblue, /area/ruin/space/has_grav/hotel/guestroom/room_4) "Pj" = ( @@ -3751,7 +3766,7 @@ "Pl" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/teleport/station, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "Pn" = ( /obj/machinery/light/small/directional/north, @@ -3776,36 +3791,36 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/hotel) "PD" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/cafeteria, /area/ruin/space/has_grav/hotel/bar) "PF" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "PG" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_6) "PI" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "PM" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "PQ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/closet, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) @@ -3825,7 +3840,7 @@ /obj/structure/railing{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/template_noop, /area/ruin/space/has_grav/hotel) "Qc" = ( @@ -3849,7 +3864,7 @@ /turf/open/floor/wood, /area/ruin/space/has_grav/hotel/bar) "Qy" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/tracker, /turf/open/floor/iron/solarpanel/airless, /area/ruin/space/has_grav/hotel) @@ -3871,13 +3886,13 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "QJ" = ( /turf/open/misc/beach/sand, /area/ruin/space/has_grav/hotel/pool) "QK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 @@ -3944,7 +3959,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Ru" = ( /obj/machinery/door/airlock/external/glass, @@ -3962,7 +3977,7 @@ /turf/open/floor/carpet/green, /area/ruin/space/has_grav/hotel/guestroom/room_2) "RI" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side, /area/ruin/space/has_grav/hotel/dock) "RL" = ( @@ -3971,7 +3986,7 @@ /area/ruin/space/has_grav/hotel/bar) "RN" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing, /turf/template_noop, /area/ruin/space/has_grav/hotel) @@ -3983,7 +3998,7 @@ /turf/open/floor/iron/showroomfloor, /area/ruin/space/has_grav/hotel/guestroom/room_1) "RS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) @@ -3999,7 +4014,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "Sf" = ( @@ -4008,7 +4023,7 @@ "Sg" = ( /obj/structure/filingcabinet, /obj/machinery/light/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Sh" = ( /obj/effect/turf_decal/siding/white/corner{ @@ -4019,7 +4034,7 @@ /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "Si" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/sepia, /area/ruin/space/has_grav/hotel/pool) "Sj" = ( @@ -4039,17 +4054,17 @@ /turf/template_noop, /area/ruin/space/has_grav/hotel) "Sv" = ( -/obj/structure/cable, -/turf/open/floor/wood/parquet, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_2) "SD" = ( /obj/machinery/door/firedoor, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "SG" = ( /obj/structure/bed/pod, /obj/item/bedsheet/orange, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_4) "SN" = ( /obj/effect/turf_decal/siding/wood{ @@ -4062,7 +4077,7 @@ /turf/open/floor/carpet/lone, /area/ruin/space/has_grav/hotel/guestroom/room_1) "SS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -4089,7 +4104,7 @@ name = "Room Number 5"; pixel_y = -24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Ts" = ( /turf/open/floor/carpet/purple, @@ -4120,10 +4135,10 @@ name = "Room Number 3"; pixel_y = -24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "TH" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/light/small/directional/south, @@ -4151,18 +4166,18 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "TY" = ( /obj/machinery/door/airlock/maintenance{ name = "Hotel Maintenance"; req_access_txt = "201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) "Uf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/extinguisher_cabinet/directional/north, /turf/open/floor/iron/dark/side{ dir = 1 @@ -4183,7 +4198,7 @@ }, /obj/effect/turf_decal/siding/wood, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/stone, @@ -4230,7 +4245,7 @@ "UL" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/teleport/hub, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "UO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4243,12 +4258,12 @@ name = "Hotel Maintenance"; req_access_txt = "201" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel/power) "UX" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing/corner{ dir = 4 }, @@ -4259,7 +4274,7 @@ name = "Public Restroom/Showers" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/freezer, /area/ruin/space/has_grav/hotel/pool) "Vr" = ( @@ -4269,7 +4284,8 @@ pixel_x = -25; pixel_y = 8 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "Vs" = ( /obj/structure/sign/poster/contraband/random/directional/east, @@ -4277,7 +4293,7 @@ /area/ruin/space/has_grav/hotel/workroom) "VA" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "VD" = ( /obj/structure/fluff/tram_rail, @@ -4292,7 +4308,7 @@ name = "Staff Room APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/gps/spaceruin{ name = "hotel gps" }, @@ -4359,10 +4375,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/guestroom/room_3) "Wt" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/siding/wood{ dir = 1 }, @@ -4385,7 +4401,8 @@ "WK" = ( /obj/structure/rack, /obj/item/crowbar/red, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/ruin/space/has_grav/hotel/dock) "WL" = ( /obj/machinery/door/airlock{ @@ -4397,7 +4414,7 @@ /area/ruin/space/has_grav/hotel/guestroom/room_1) "WN" = ( /obj/structure/lattice/catwalk, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/railing{ dir = 1 }, @@ -4411,7 +4428,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "WZ" = ( /obj/structure/table/wood, @@ -4431,7 +4448,7 @@ name = "Guest Room A4" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/sepia, @@ -4464,7 +4481,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Xw" = ( /obj/effect/turf_decal/siding/wood{ @@ -4474,7 +4491,7 @@ id = "a1"; name = "privacy button" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -4498,7 +4515,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "XB" = ( /obj/effect/spawner/structure/window/reinforced, @@ -4508,7 +4525,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -4528,7 +4545,7 @@ id = "a6"; name = "privacy button" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel/guestroom/room_6) "XT" = ( @@ -4536,14 +4553,14 @@ name = "Public Restroom/Showers" }, /obj/machinery/door/firedoor, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/pool) "XW" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 }, /obj/structure/closet/crate/bin, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Yb" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4560,7 +4577,7 @@ name = "Room Number 2"; pixel_y = 24 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Yh" = ( /obj/structure/table/wood/fancy/green, @@ -4568,17 +4585,17 @@ /area/ruin/space/has_grav/hotel/guestroom/room_5) "Yw" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/ruin/space/has_grav/hotel) "Yy" = ( /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "YC" = ( /obj/effect/turf_decal/siding/wood{ @@ -4587,7 +4604,7 @@ /obj/item/kirbyplants{ icon_state = "plant-13" }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel/dock) "YE" = ( /obj/structure/table/wood/fancy/royalblue, @@ -4596,12 +4613,12 @@ name = "Guest Room APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/pen, /turf/open/floor/carpet/orange, /area/ruin/space/has_grav/hotel/guestroom/room_6) "YL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/ruin/space/has_grav/hotel) @@ -4611,11 +4628,11 @@ }, /obj/structure/closet/crate/bin, /obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "YS" = ( /obj/machinery/airalarm/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "YU" = ( /obj/structure/sign/warning/vacuum, @@ -4681,10 +4698,10 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/ruin/space/has_grav/hotel) "Zv" = ( /obj/effect/turf_decal/siding/wood, @@ -4698,7 +4715,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark/side{ dir = 1 }, @@ -5690,7 +5707,7 @@ Zu OI lF AG -hN +mF mF LD eK diff --git a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm index a07f26c11baf..818312199e6b 100644 --- a/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm +++ b/_maps/RandomRuins/SpaceRuins/thelizardsgas.dmm @@ -2,7 +2,7 @@ "ak" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/seed, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "aK" = ( @@ -21,7 +21,7 @@ /obj/item/clothing/shoes/cowboy/lizard{ desc = "You can hear a faint hissing from inside the boots." }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "bp" = ( @@ -45,7 +45,7 @@ /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) "cm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment{ @@ -73,11 +73,11 @@ "gS" = ( /obj/structure/rack, /obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "hl" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "ig" = ( @@ -131,7 +131,7 @@ /area/ruin/space/has_grav/thelizardsgas) "na" = ( /obj/machinery/atmospherics/pipe/smart/simple/yellow/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "nL" = ( @@ -140,7 +140,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/ruin/space/has_grav/thelizardsgas) "oZ" = ( @@ -158,7 +158,7 @@ desc = "After all, what's more important than making sure you get what you're due?"; name = "Criminal Shutters" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/thelizardsgas) "rC" = ( @@ -199,7 +199,7 @@ /turf/open/misc/asteroid/airless, /area/ruin/space/has_grav/thelizardsgas) "xb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/sign/warning/fire{ pixel_y = 32 }, @@ -228,7 +228,7 @@ /area/ruin/space/has_grav/thelizardsgas) "zz" = ( /obj/machinery/door/window, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/thelizardsgas) "AZ" = ( @@ -241,10 +241,9 @@ /obj/machinery/power/apc/auto_name/directional/north{ coverlocked = 0; locked = 0; - network_id = null; start_charge = 60 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/item/paper/fluff/spaceruins/lizardsgas/memorandum, /obj/effect/spawner/random/contraband/cannabis/lizardsgas, /obj/effect/spawner/random/contraband/cannabis/lizardsgas, @@ -279,7 +278,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) "CA" = ( @@ -335,10 +334,9 @@ "Io" = ( /obj/machinery/power/smes{ charge = 2e+006; - network_id = null; output_level = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) "Je" = ( @@ -366,7 +364,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/thelizardsgas) "JY" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/corner, /area/ruin/space/has_grav/thelizardsgas) "Kw" = ( @@ -393,7 +391,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/sign/poster/fluff/lizards_gas_power{ pixel_x = 32 }, diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm deleted file mode 100644 index 55d92e643d9e..000000000000 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ /dev/null @@ -1,70475 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ab" = ( -/turf/closed/indestructible/rock/snow, -/area/awaymission/cabin/caves/mountain) -"ad" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin/lumbermill) -"ae" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"af" = ( -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ag" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"ah" = ( -/obj/structure/fence/door/opened, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"ai" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"aj" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/plaque/static_plaque/golden{ - desc = "Holding the record for about 500 years now."; - name = "The Most Annoying Organization Ever"; - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"ak" = ( -/obj/structure/table/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"al" = ( -/obj/structure/table/wood, -/obj/structure/showcase/machinery/tv{ - desc = "A slightly battered looking TV. Various infomercials play on a loop, accompanied by a jaunty tune."; - name = "Television Screen" - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"am" = ( -/obj/structure/chair/comfy{ - color = "#B22222"; - dir = 8 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"an" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin) -"ao" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ap" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aq" = ( -/turf/open/floor/wood, -/area/awaymission/cabin) -"ar" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/command{ - name = "Manager's Office" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"as" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"at" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/structure/mirror/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"au" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/cabin) -"av" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aw" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ax" = ( -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin) -"ay" = ( -/obj/machinery/light/small/directional/south, -/obj/item/storage/backpack/bannerpack{ - pixel_y = 7 - }, -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/cabin) -"az" = ( -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aA" = ( -/obj/structure/bed, -/obj/item/bedsheet/brown, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aB" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"aC" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"aD" = ( -/obj/structure/cable, -/obj/machinery/power/smes/magical{ - desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. It seems to be powered just fine without our intervention."; - name = "\improper Nanotrasen power storage unit" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aE" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/baseturf_helper/asteroid/snow, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aF" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aG" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"aH" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"aI" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aJ" = ( -/obj/structure/table, -/obj/item/surgicaldrill, -/obj/item/circular_saw, -/obj/item/cautery, -/obj/item/surgical_drapes, -/obj/item/scalpel, -/obj/item/hemostat, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"aK" = ( -/obj/structure/table/optable, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"aL" = ( -/turf/open/floor/plating, -/area/awaymission/cabin) -"aM" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aN" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aO" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aP" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ - desc = "Contains a large reservoir of soft drinks so that you can refill your cup. For free."; - name = "free refill dispenser" - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aQ" = ( -/obj/structure{ - anchored = 1; - density = 1; - desc = "Generates power from lava!"; - dir = 1; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; - icon_state = "compressor"; - name = "geothermal generator" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aR" = ( -/obj/machinery/door/window/right/directional/west{ - name = "fireplace" - }, -/obj/structure/fireplace, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aS" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "sink"; - pixel_y = 28 - }, -/obj/structure/janitorialcart, -/obj/item/mop, -/obj/item/reagent_containers/glass/bucket, -/obj/item/clothing/suit/caution, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aT" = ( -/obj/machinery/door/window/left/directional/east{ - name = "fireplace" - }, -/obj/structure/fireplace, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aU" = ( -/obj/structure/fireplace, -/obj/machinery/door/window/right/directional/west{ - name = "fireplace" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aV" = ( -/obj/machinery/space_heater, -/turf/open/floor/wood, -/area/awaymission/cabin) -"aW" = ( -/obj/structure/fireplace, -/obj/machinery/door/window/left/directional/east{ - name = "fireplace" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"aX" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aY" = ( -/obj/structure/table/wood, -/obj/item/phone, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"aZ" = ( -/obj/structure/guncase/shotgun, -/obj/item/gun/ballistic/shotgun/riot, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"ba" = ( -/obj/structure/fans/tiny, -/obj/machinery/door/airlock/wood/glass{ - name = "Cabin" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bb" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/britcup, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bd" = ( -/obj/structure/chair/office, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"be" = ( -/obj/machinery/computer/crew{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bf" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bg" = ( -/obj/machinery/door/window/left/directional/west{ - name = "manager's desk" - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bh" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bi" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "WheresTheSyndiBalloon"; - name = "Manager's Bedroom" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bj" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bk" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bl" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bm" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "snowdinbutworse5"; - name = "Cabin 5" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bn" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bo" = ( -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bp" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bq" = ( -/obj/machinery/light/directional/north, -/obj/machinery/vending/cigarette, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"br" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bs" = ( -/obj/machinery/newscaster/directional/north, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bt" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"bu" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bv" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bw" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"bx" = ( -/obj/machinery/smartfridge, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"by" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"bz" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "sink"; - pixel_y = 28 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"bA" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bB" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bC" = ( -/obj/machinery/gibber, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bD" = ( -/obj/machinery/computer/operating, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bE" = ( -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bF" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bG" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bH" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/obj/item/soap/nanotrasen{ - pixel_x = -1; - pixel_y = -3 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bI" = ( -/turf/open/lava, -/area/awaymission/cabin/caves/mountain) -"bJ" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bK" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"bL" = ( -/obj/structure/bed, -/obj/item/bedsheet/nanotrasen, -/obj/item/clothing/suit/hooded/wintercoat/captain{ - name = "manager's winter coat" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bM" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bN" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bO" = ( -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"bP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"bS" = ( -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"bT" = ( -/obj/machinery/light/small/directional/west, -/obj/item/instrument/guitar, -/obj/item/instrument/violin, -/obj/item/instrument/accordion, -/obj/item/instrument/trumpet, -/obj/structure/closet/crate/wooden, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bU" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bV" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Garage" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"bW" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"bX" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"bY" = ( -/obj/machinery/light/directional/east, -/obj/machinery/processor, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"ce" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"cf" = ( -/obj/structure/table/wood, -/obj/item/toy/snowball, -/obj/item/toy/snowball{ - pixel_y = 8 - }, -/obj/item/toy/snowball{ - pixel_x = 8 - }, -/obj/item/toy/snowball{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/toy/snowball{ - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/toy/snowball{ - pixel_x = -5; - pixel_y = -2 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"cg" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"ci" = ( -/obj/structure/chair/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cj" = ( -/obj/structure/table, -/obj/item/clothing/suit/hooded/wintercoat/hydro{ - name = "service winter coat"; - pixel_y = 4 - }, -/obj/item/clothing/suit/hooded/wintercoat/hydro{ - name = "service winter coat"; - pixel_y = 4 - }, -/obj/item/clothing/suit/hooded/wintercoat/hydro{ - name = "service winter coat"; - pixel_y = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"ck" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"cl" = ( -/obj/structure/kitchenspike, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"cm" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"co" = ( -/turf/open/chasm{ - desc = "I told you that you can't get past those doors."; - name = "anti-fun pit" - }, -/area/awaymission/cabin/caves/mountain) -"cp" = ( -/obj/machinery/gateway/away, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cr" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin) -"cs" = ( -/obj/structure/table/wood, -/obj/item/wrench, -/obj/item/soap, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ct" = ( -/obj/structure/sign/poster/official/soft_cap_pop_art{ - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cu" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"cv" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"cx" = ( -/turf/closed/indestructible/riveted, -/area/awaymission/cabin/caves/mountain) -"cy" = ( -/obj/structure/sign/poster/contraband/fun_police, -/turf/closed/indestructible/riveted, -/area/awaymission/cabin/caves/mountain) -"cz" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/structure/musician/piano{ - desc = "Very theatrical."; - icon_state = "piano"; - name = "theatre piano" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cA" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/wood{ - name = "Stage Left" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cB" = ( -/obj/machinery/door/window/left/directional/east, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cC" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cD" = ( -/obj/structure/sign/barsign{ - pixel_y = -32; - req_access = null - }, -/obj/machinery/door/window/left/directional/west{ - name = "Bar" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cE" = ( -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cF" = ( -/obj/structure/table, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"cG" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/obj/item/food/meat/slab/synthmeat, -/obj/item/food/meat/slab/synthmeat, -/obj/item/food/meat/slab/synthmeat, -/obj/item/food/meat/slab/synthmeat, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"cH" = ( -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cI" = ( -/obj/structure/cable, -/obj/structure/chair/office/light, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"cJ" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 8; - pixel_y = 10 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 8 - }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -8; - pixel_y = 10 - }, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -8 - }, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"cK" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/sillycup/smallcarton{ - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cL" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cM" = ( -/obj/machinery/door/airlock/wood{ - name = "Gateway" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"cN" = ( -/obj/machinery/computer/slot_machine, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"cO" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"cP" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"cQ" = ( -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"cR" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"cS" = ( -/obj/machinery/button/door/directional/north{ - id = "garage_cabin" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cT" = ( -/obj/vehicle/ridden/atv, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cU" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cV" = ( -/obj/vehicle/ridden/atv, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cW" = ( -/obj/item/shovel, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cX" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"cZ" = ( -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"da" = ( -/obj/structure/chair, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"db" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/structure/table/reinforced, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dc" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka{ - desc = "A fancy bottle of vodka. The name isn't in Galactic Common though."; - name = "Porosha Vodka" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dd" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/structure/chair/comfy/shuttle{ - desc = "A comfortable, secure seat. It has a more sturdy looking buckling system, for making it harder to get dragged into the ring."; - name = "announcer seat" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"de" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/hourglass, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"df" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dg" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dh" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"di" = ( -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dk" = ( -/obj/structure/chair, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dl" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dm" = ( -/obj/structure/table/reinforced, -/obj/item/modular_computer/tablet/pda/syndicate{ - default_disk = /obj/item/computer_hardware/hard_drive/role/virus/mime; - desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it."; - name = "soviet tablet"; - note = "TRANSLATED TO GALACTIC COMMON: My partner has left to help those Nanotrasen fucks three days ago. They said that a distress signal came from down south and they had to check it out. How fucking long does it take to investigate a mining outpost? Either those Nanotrasen fuckers betrayed us or something really did go wrong. Either way, I'm leaving before this becomes an issue for me and anyone else here. That dumb idiot." - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dn" = ( -/obj/structure/table/reinforced, -/obj/item/megaphone/sec{ - name = "soviet megaphone" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"do" = ( -/obj/structure/table/reinforced, -/obj/item/cigbutt/cigarbutt, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dp" = ( -/obj/machinery/vending/sovietsoda, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dq" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dr" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/reagent_containers/pill/patch/libital, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ds" = ( -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dt" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/food/condiment/mayonnaise, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"du" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"dv" = ( -/obj/structure{ - anchored = 1; - density = 1; - desc = "Generates power from lava!"; - icon = 'icons/obj/atmospherics/pipes/simple.dmi'; - icon_state = "turbine"; - name = "geothermal generator" - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"dw" = ( -/mob/living/simple_animal/hostile/bear/snow{ - desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; - melee_damage_lower = 10; - melee_damage_upper = 20; - name = "fat space polar bear"; - speed = 3 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dA" = ( -/turf/closed/wall/ice, -/area/awaymission/cabin/snowforest) -"dD" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"dE" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dF" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dG" = ( -/obj/structure/kitchenspike, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dH" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"dI" = ( -/obj/structure/table, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dJ" = ( -/obj/structure/kitchenspike, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dK" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dM" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dN" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"dO" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dP" = ( -/obj/item/shard, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dQ" = ( -/obj/item/lighter/greyscale, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dR" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dS" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dT" = ( -/obj/item/broken_bottle, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dU" = ( -/obj/item/chair, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dV" = ( -/obj/effect/decal/cleanable/blood/gibs/body, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dW" = ( -/obj/item/reagent_containers/pill/patch/libital, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"dZ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/bear/snow{ - desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; - melee_damage_lower = 10; - melee_damage_upper = 20; - name = "fat space polar bear"; - speed = 3 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"eb" = ( -/obj/structure/closet, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ec" = ( -/obj/machinery/light/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ed" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ee" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"ef" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"eg" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"eh" = ( -/obj/machinery/door/airlock/wood/glass, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ei" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/glass, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ej" = ( -/obj/structure/chair/wood, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"ek" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/snowforest) -"el" = ( -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin) -"em" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"en" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin) -"eo" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ep" = ( -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin) -"eq" = ( -/obj/machinery/door/poddoor/shutters{ - id = "garage_cabin"; - name = "garage door" - }, -/obj/structure/fans/tiny, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin) -"er" = ( -/obj/effect/turf_decal/weather/snow/corner, -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin) -"et" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/cabin) -"eu" = ( -/obj/structure/table/wood/fancy, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ev" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/glass/rag, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ew" = ( -/obj/structure/closet/crate/wooden, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ex" = ( -/obj/structure/closet/crate/wooden, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ey" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin/snowforest) -"ez" = ( -/obj/structure/fence, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eA" = ( -/obj/structure/table/wood, -/obj/item/chainsaw, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"eB" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"eC" = ( -/obj/structure/fence, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eD" = ( -/obj/structure/bonfire/dense{ - desc = "Multiple logs thrown together into a pile hastily. Let's burn it for fun!."; - name = "pile of logs" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eE" = ( -/obj/structure/table/wood, -/obj/item/grown/log/tree{ - pixel_x = -7 - }, -/obj/item/grown/log/tree, -/obj/item/grown/log/tree{ - pixel_x = 7 - }, -/obj/item/grown/log/tree{ - pixel_x = 14 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eF" = ( -/obj/structure/table/wood, -/obj/item/grown/log/tree{ - pixel_x = -7 - }, -/obj/item/grown/log/tree, -/obj/item/grown/log/tree{ - pixel_x = 7 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eG" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"eH" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"eI" = ( -/obj/effect/turf_decal/stripes/red/corner, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eJ" = ( -/obj/effect/turf_decal/stripes/red/line, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eK" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "lumbermill" - }, -/obj/effect/turf_decal/stripes/red/line, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eL" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eM" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eN" = ( -/obj/structure/bookcase/random, -/turf/open/floor/wood, -/area/awaymission/cabin) -"eP" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/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/iron/dark, -/area/awaymission/cabin/caves/mountain) -"eQ" = ( -/obj/structure/table/wood, -/obj/item/phone{ - desc = "If I forgot where the gateway was then I can just call the station with this phone! Wait, where's the phone lines?"; - name = "phone" - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"eR" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" - }, -/obj/effect/turf_decal/stripes/red/full, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"eS" = ( -/obj/machinery/recycler/lumbermill{ - desc = "Is better at killing people than cutting logs, for some reason." - }, -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" - }, -/obj/effect/turf_decal/stripes/red/full, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"eT" = ( -/obj/structure/closet/crate/wooden{ - anchored = 1 - }, -/obj/effect/turf_decal/delivery/red, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"eU" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eV" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eW" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/item/wrench, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eX" = ( -/obj/effect/turf_decal/stripes/red/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"eY" = ( -/obj/structure/closet/crate/wooden, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"eZ" = ( -/obj/structure/closet/crate/wooden, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"fa" = ( -/obj/structure/fence, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"fb" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"fc" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"fd" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"fe" = ( -/obj/structure/table/wood, -/obj/item/shovel, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ff" = ( -/obj/structure/table/wood, -/obj/item/key/atv, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"fg" = ( -/obj/structure/filingcabinet/security, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fh" = ( -/obj/machinery/computer/prisoner{ - desc = "Used to manage tracking implants placed inside criminals and the prison cells."; - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fi" = ( -/obj/item/trash/can, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"fk" = ( -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fl" = ( -/obj/structure/filingcabinet/security, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fm" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/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/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fn" = ( -/obj/machinery/vending/sustenance{ - desc = "A vending machine which vends food."; - name = "\improper Snack Machine"; - product_ads = "Sufficiently healthy.;Mmm! So good!;Have a meal.;You need food to live!"; - product_slogans = "Enjoy your meal." - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fp" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fq" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fr" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fs" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"ft" = ( -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fu" = ( -/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/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fw" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fx" = ( -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fy" = ( -/turf/closed/indestructible/fakedoor{ - desc = "It looks like there really is no way out this time."; - name = "Cell Block Y8" - }, -/area/awaymission/cabin/caves/mountain) -"fA" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fB" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fC" = ( -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fD" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/snowforest) -"fE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/ladder/unbreakable{ - desc = "Who left the grate open?"; - height = 1; - icon_state = "ladder01"; - id = "dealwentoffwithoutahitchBRO"; - name = "Grate"; - pixel_y = -10 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fF" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"fH" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"fI" = ( -/obj/effect/decal/cleanable/greenglow, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"fJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fL" = ( -/obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/mouse{ - faction = list("sewer") - }, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"fM" = ( -/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/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fN" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fO" = ( -/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/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fP" = ( -/turf/closed/indestructible/fakeglass, -/area/awaymission/cabin/caves/mountain) -"fQ" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7210" - }, -/area/awaymission/cabin/caves/mountain) -"fR" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7211" - }, -/area/awaymission/cabin/caves/mountain) -"fS" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7212" - }, -/area/awaymission/cabin/caves/mountain) -"fT" = ( -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile{ - desc = "Enjoy the view."; - name = "window" - }, -/turf/open/floor/plating, -/area/awaymission/cabin/caves/mountain) -"fU" = ( -/obj/machinery/door/airlock/centcom{ - desc = "Look at what you have done."; - max_integrity = 2000; - name = "Jail Cell 7213" - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"fV" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7214" - }, -/area/awaymission/cabin/caves/mountain) -"fW" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7215" - }, -/area/awaymission/cabin/caves/mountain) -"fX" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7216" - }, -/area/awaymission/cabin/caves/mountain) -"fY" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Jail."; - name = "Jail Cell 7217" - }, -/area/awaymission/cabin/caves/mountain) -"fZ" = ( -/obj/structure/weightmachine/stacklifter, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gb" = ( -/obj/structure/weightmachine/weightlifter, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gc" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Eh, I don't think trying to get past it is worth it anyways."; - name = "Flood Gate" - }, -/area/awaymission/cabin/caves/mountain) -"gd" = ( -/turf/open/indestructible/binary{ - density = 1; - desc = "No, I am not going through this."; - icon = 'icons/misc/beach.dmi'; - icon_state = "water"; - name = "dirty water" - }, -/area/awaymission/cabin/caves/mountain) -"go" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gp" = ( -/obj/structure/sign/poster/contraband/pwr_game{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gr" = ( -/turf/open/indestructible{ - icon_state = "plating"; - name = "plating" - }, -/area/awaymission/cabin/caves/mountain) -"gs" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gt" = ( -/obj/structure/punching_bag, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/awaymission/cabin/caves/mountain) -"gu" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/security, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gv" = ( -/obj/structure/ladder/unbreakable{ - desc = "Finally."; - icon_state = "ladder10"; - id = "whyisitcalledladder10andnotladder1"; - name = "Freedom" - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/indestructible{ - icon_state = "plating"; - name = "plating" - }, -/area/awaymission/cabin/caves/mountain) -"gw" = ( -/obj/structure/barricade/wooden/crude{ - desc = "Buffing things is illegal for it causes fun." - }, -/turf/closed/indestructible/fakedoor{ - desc = "The room for buffing things."; - name = "Exercise Room" - }, -/area/awaymission/cabin/caves/mountain) -"gx" = ( -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/cabin/caves/mountain) -"gy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/ladder/unbreakable{ - desc = "Yeah, I'll just go back to jail instead of this. It's not like there is an escape out of here, right?"; - icon_state = "ladder10"; - id = "dealwentoffwithoutahitchBRO"; - name = "Sewer Ladder" - }, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gz" = ( -/obj/effect/decal/cleanable/glass, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/barricade/security, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/greenglow, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gC" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/cabin/caves/mountain) -"gD" = ( -/obj/structure/girder, -/obj/effect/decal/cleanable/shreds, -/turf/open/indestructible{ - icon_state = "plating"; - name = "plating" - }, -/area/awaymission/cabin/caves/mountain) -"gE" = ( -/turf/closed/indestructible/fakedoor{ - desc = "I think that intercomm could open the door."; - name = "Hallway Y8" - }, -/area/awaymission/cabin/caves/mountain) -"gH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/item/mop, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/cabin) -"gM" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/dirt, -/obj/item/key/atv, -/obj/item/key/atv, -/obj/item/key/atv, -/obj/item/key/atv, -/obj/item/key/atv, -/obj/item/key/atv, -/turf/open/floor/plating, -/area/awaymission/cabin) -"gN" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/cabin) -"gT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"gY" = ( -/obj/structure/table/wood, -/obj/item/clothing/suit/hooded/wintercoat/hydro, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/head/hardhat, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"gZ" = ( -/obj/item/chair/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ha" = ( -/obj/structure/chair/wood/wings{ - name = "dealer chair" - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hb" = ( -/obj/structure/table/wood/fancy, -/obj/item/coin{ - desc = "Looks old."; - pixel_x = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hc" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 5 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hd" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"he" = ( -/obj/structure/table/wood, -/obj/structure/cable, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_y = -2 - }, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = 8; - pixel_y = 8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hf" = ( -/obj/machinery/space_heater, -/obj/effect/decal/remains/robot, -/obj/structure/sign/warning/fire{ - pixel_y = 32 - }, -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hg" = ( -/obj/machinery/door/airlock/maintenance{ - name = "janitor closet" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hh" = ( -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hi" = ( -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"hj" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hk" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_x = 32 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hl" = ( -/obj/structure/sign/poster/official/here_for_your_safety{ - pixel_y = 32 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hm" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/wood{ - name = "Gateway" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hn" = ( -/obj/structure/sign/poster/official/high_class_martini{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ho" = ( -/obj/item/wrench/medical, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"hp" = ( -/obj/machinery/stasis, -/obj/item/bedsheet/medical, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"hq" = ( -/obj/machinery/vending/medical, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"hr" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/generic, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hs" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/sign/poster/contraband/missing_gloves{ - pixel_x = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ht" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hu" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/cold, -/obj/item/clothing/glasses/cold, -/obj/item/clothing/glasses/cold, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hv" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/head/welding{ - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hw" = ( -/obj/structure/closet/toolcloset, -/obj/item/lightreplacer, -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hx" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/wood{ - name = "Stage Right" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hy" = ( -/obj/machinery/door/airlock/maintenance{ - name = "heater storage" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"hz" = ( -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/cabin) -"hA" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/freezer{ - name = "Freezer" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"hB" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Backstage" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hC" = ( -/obj/structure/cable, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hD" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/item/folder/white, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"hE" = ( -/obj/structure/cable, -/obj/structure/chair/wood, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hF" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hG" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"hH" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hI" = ( -/obj/effect/landmark/awaystart, -/obj/structure/sign/poster/official/report_crimes{ - pixel_y = -32 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"hJ" = ( -/obj/structure/lattice/catwalk, -/turf/open/indestructible{ - icon_state = "plating"; - name = "bridge" - }, -/area/awaymission/cabin/caves/mountain) -"hK" = ( -/obj/effect/decal/cleanable/greenglow, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"hL" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/snow, -/area/awaymission/cabin/caves/mountain) -"hM" = ( -/turf/closed/wall/mineral/snow, -/area/awaymission/cabin/caves/mountain) -"hP" = ( -/obj/item/candle/infinite, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"hQ" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"hR" = ( -/obj/structure/reagent_dispensers/beerkeg{ - desc = "Hey, CentCom, we located our complimentary case of space beer! The pamphlet didn't lie!"; - name = "complimentary keg of space beer" - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"hX" = ( -/obj/item/clothing/suit/armor/vest/russian_coat{ - pixel_x = 16; - pixel_y = 16 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"hY" = ( -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/reagent_containers/pill/patch/libital, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"hZ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ia" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/shard/plasma, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ib" = ( -/obj/item/hatchet/wooden, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ic" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/trash/popcorn{ - pixel_y = 12 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"id" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ie" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"if" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ii" = ( -/turf/closed/indestructible/syndicate, -/area/awaymission/cabin/caves/sovietcave) -"ij" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ik" = ( -/obj/structure/door_assembly/door_assembly_vault{ - anchored = 1; - name = "vault door" - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red/snow_cabin, -/area/awaymission/cabin/caves/sovietcave) -"im" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"in" = ( -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/awaymission/cabin) -"io" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ip" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/airlock/hatch, -/obj/structure/barricade/wooden, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"iq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/hivebot/range{ - desc = "Looks like he's been left behind."; - faction = list("russian"); - maxHealth = 5; - name = "soviet machine" - }, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"ir" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/barricade/sandbags, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"is" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"iv" = ( -/turf/closed/wall/mineral/snow, -/area/awaymission/cabin/caves) -"iw" = ( -/obj/structure/floodlight_frame, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iz" = ( -/turf/closed/wall/ice, -/area/awaymission/cabin/caves) -"iA" = ( -/obj/structure/frame/machine, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iB" = ( -/obj/structure/frame/computer, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iC" = ( -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iD" = ( -/obj/structure/closet/acloset, -/obj/item/clothing/suit/hooded/bloated_human, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iG" = ( -/obj/structure/fluff/iced_abductor, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iH" = ( -/obj/structure/table/glass, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iI" = ( -/obj/structure/closet/acloset, -/obj/item/toy/foamblade, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iJ" = ( -/obj/structure/bed/abductor, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"iM" = ( -/turf/open/floor/wood, -/area/awaymission/cabin/caves) -"iP" = ( -/obj/structure/sign/picture_frame{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/cabin/caves) -"iQ" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/cabin/caves) -"iR" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = -7; - pixel_y = -2 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iS" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = 7; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iT" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iU" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = -5; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/drinks/mug/coco{ - desc = "Still hot!"; - pixel_x = 7; - pixel_y = -2 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iV" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "snowdinbutworse1"; - name = "Cabin 1" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iW" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "snowdinbutworse2"; - name = "Cabin 2" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iX" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "snowdinbutworse3"; - name = "Cabin 3" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iY" = ( -/obj/machinery/door/airlock/wood{ - id_tag = "snowdinbutworse4"; - name = "Cabin 4" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/awaymission/cabin) -"iZ" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity10" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"ja" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity20" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"jb" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity30" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"jc" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity40" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"jd" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity50" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"je" = ( -/obj/structure/window/reinforced/fulltile/ice{ - name = "frozen window" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "fightingcommunity60" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"jf" = ( -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity60"; - name = "shutter button"; - pixel_x = -8 - }, -/obj/machinery/button/door/directional/north{ - id = "WheresTheSyndiBalloon"; - pixel_x = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jg" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinbutworse2" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jh" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinbutworse1" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ji" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinbutworse3" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jj" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinbutworse4" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jk" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinbutworse5" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jm" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"jp" = ( -/mob/living/simple_animal/pet/penguin/baby, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/snowforest) -"jq" = ( -/obj/item/clothing/suit/hooded/wintercoat/medical{ - pixel_y = 3 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/hooded/wintercoat/medical{ - pixel_y = 3 - }, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"jr" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet{ - anchored = 1 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/neck/scarf/zebra, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jt" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet{ - anchored = 1 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/neck/scarf/christmas, -/turf/open/floor/wood, -/area/awaymission/cabin) -"ju" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet{ - anchored = 1 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/neck/stripedbluescarf, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jv" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet{ - anchored = 1 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/neck/stripedgreenscarf, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jw" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/personal/cabinet{ - anchored = 1 - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/neck/stripedredscarf, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jx" = ( -/obj/structure/table/wood/poker, -/obj/item/dice/d6{ - pixel_x = 5; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"jy" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/bottle/wine{ - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -7; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 7; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jz" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/red, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jA" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow{ - pixel_x = -7 - }, -/obj/item/folder/blue{ - pixel_x = 7 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jB" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jC" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Generator Room" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/cabin) -"jD" = ( -/obj/structure/table/wood, -/obj/item/clothing/mask/gas/explorer, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jE" = ( -/obj/structure/closet/crate/bin, -/obj/item/tank/internals/emergency_oxygen/engi/empty, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"jF" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/tray, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jG" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/pistachios, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jH" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/can, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jI" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/candy, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jJ" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/cheesie, -/turf/open/floor/wood, -/area/awaymission/cabin) -"jK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mine/stun, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"jL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"jM" = ( -/obj/machinery/space_heater, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"jO" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = 32 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jP" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jQ" = ( -/obj/structure/table/wood, -/obj/structure/sign/warning/nosmoking/circle{ - pixel_x = -16; - pixel_y = 32 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jR" = ( -/obj/structure/table/wood, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = 7; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = -7; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = -3; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = 3; - throwforce = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jT" = ( -/obj/structure/table/wood, -/obj/item/radio/off{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = 5; - pixel_y = 4 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jU" = ( -/obj/structure/chair/wood, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jV" = ( -/mob/living/simple_animal/bot/firebot, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jW" = ( -/obj/structure/table/wood, -/obj/item/gun/energy/floragun, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jX" = ( -/obj/structure/table/wood, -/obj/item/pizzabox/vegetable{ - pixel_x = -6; - pixel_y = 12 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jY" = ( -/obj/structure/table/wood, -/obj/item/razor{ - pixel_y = 3 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"jZ" = ( -/obj/structure/table/wood, -/obj/item/extinguisher{ - pixel_x = -7; - pixel_y = 3 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ka" = ( -/obj/structure/table/wood, -/obj/item/extinguisher, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"kb" = ( -/obj/structure/table/wood, -/obj/item/flashlight{ - pixel_x = 4; - pixel_y = 6 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"kc" = ( -/obj/structure/table/wood, -/obj/item/flashlight{ - pixel_y = 2 - }, -/obj/item/flashlight{ - pixel_y = 15 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"kd" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/construction{ - pixel_y = 3 - }, -/obj/item/pen{ - pixel_y = 3 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ke" = ( -/obj/structure/table/wood, -/obj/item/restraints/legcuffs/beartrap{ - pixel_y = 7 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"kf" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fountain, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"ki" = ( -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/caves) -"kj" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/awaymission/cabin/caves) -"kk" = ( -/obj/machinery/light/directional/north, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/wood, -/area/awaymission/cabin) -"kl" = ( -/obj/structure/bonfire, -/turf/open/floor/plating, -/area/awaymission/cabin/caves) -"km" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/turf/open/floor/wood, -/area/awaymission/cabin/caves) -"kD" = ( -/obj/structure/table/wood, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = 7; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = -7; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = -3; - throwforce = 4 - }, -/obj/item/hatchet{ - desc = "A decent axe blade upon a short fibremetal handle. It has a long history of chopping things, but now it is used for chopping wood."; - force = 4; - name = "weak hatchet"; - pixel_x = 3; - throwforce = 4 - }, -/obj/structure/sign/warning/nosmoking/circle{ - pixel_x = 16; - pixel_y = -32 - }, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"kE" = ( -/obj/structure/closet, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/cabin) -"kF" = ( -/obj/structure/barricade/sandbags, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kG" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/assembly/infra, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kJ" = ( -/obj/effect/decal/hammerandsickle, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/bottle/vodka, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/clothing/head/helmet/rus_ushanka, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/stack/sheet/mineral/sandbags, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"kN" = ( -/turf/open/floor/plating, -/area/awaymission/cabin/caves/sovietcave) -"kO" = ( -/obj/item/bear_armor, -/turf/open/floor/plating, -/area/awaymission/cabin/caves/sovietcave) -"kR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/corpse/human/damaged, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"kX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"kZ" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/gibs, -/mob/living/simple_animal/hostile/skeleton{ - desc = "Oh shit!"; - dir = 1; - faction = list("sewer"); - name = "sewer skeleton"; - wander = 0 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin/caves/mountain) -"lb" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"lc" = ( -/turf/closed/indestructible/fakedoor{ - desc = "I can't get past this."; - name = "Reinforced Soviet Hatch" - }, -/area/awaymission/cabin/caves/sovietcave) -"lz" = ( -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = -32 - }, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"lC" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "lumbermill" - }, -/obj/effect/turf_decal/stripes/red/full, -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/lumbermill) -"lP" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/closed/wall/ice, -/area/awaymission/cabin/caves) -"lQ" = ( -/obj/structure/sign/warning/enginesafety{ - desc = "A sign detailing the various safety protocols when working on-site to ensure a safe shift. It seems to particularly focus on how dangerous the sawblade is."; - name = "\improper LUMBERMILL SAFETY" - }, -/turf/closed/wall/mineral/wood, -/area/awaymission/cabin/lumbermill) -"lS" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/spider/stickyweb, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"lT" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Seriously, I can't map an entire soviet bunker and new landscape for you. You can't get past this."; - name = "Soviet Hatch" - }, -/area/awaymission/cabin/caves/sovietcave) -"mi" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/shreds{ - pixel_x = 10; - pixel_y = -12 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mj" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/generic{ - pixel_x = -17 - }, -/obj/effect/decal/cleanable/shreds{ - pixel_y = -12 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mn" = ( -/obj/structure/fence/cut/large{ - dir = 4 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mo" = ( -/obj/structure/fence/cut/medium{ - dir = 4 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mp" = ( -/obj/structure/fence/cut/medium{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mq" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/generic{ - pixel_x = 11; - pixel_y = -4 - }, -/obj/effect/decal/cleanable/shreds{ - pixel_y = -12 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mr" = ( -/obj/effect/decal/cleanable/shreds{ - pixel_x = -12; - pixel_y = -12 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"ms" = ( -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/cabin/caves) -"mv" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mw" = ( -/obj/structure/sign/warning{ - name = "\improper SAWBLADE WARNING"; - pixel_x = -32 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"my" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/gun/ballistic/automatic/surplus{ - desc = "Uses 10mm ammo and its bulky frame prevents one-hand firing. It has the word CHEKOV engraved on the stock."; - name = "chekov's rifle" - }, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mA" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/closed/wall/ice, -/area/awaymission/cabin/caves) -"mB" = ( -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/cabin/caves) -"mE" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/closed/indestructible/rock/snow, -/area/awaymission/cabin/caves) -"mF" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/cabin/caves) -"mG" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/cabin/caves) -"mI" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mJ" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/cabin/caves) -"mK" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Seriously, You can't get past this."; - name = "Soviet Hatch" - }, -/area/awaymission/cabin/caves/sovietcave) -"mM" = ( -/obj/machinery/door/airlock/hatch, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mN" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mO" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mP" = ( -/turf/closed/indestructible/rock/snow, -/area/awaymission/cabin/caves) -"mR" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mS" = ( -/obj/machinery/door/airlock/vault{ - desc = "Made by the Russians."; - name = "Soviet Door" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"mU" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"mV" = ( -/obj/effect/turf_decal/weather/snow, -/obj/item/flashlight/flare, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/cabin/caves) -"mW" = ( -/obj/effect/turf_decal/weather/snow, -/turf/closed/indestructible/rock/snow, -/area/awaymission/cabin/caves) -"mX" = ( -/obj/effect/turf_decal/weather/snow, -/obj/item/flashlight/flare, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"na" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/cabin/caves) -"nb" = ( -/obj/effect/turf_decal/weather/snow, -/obj/item/modular_computer/tablet/pda/syndicate{ - default_disk = /obj/item/computer_hardware/hard_drive/role/virus/clown; - desc = "A portable microcomputer by Thinktronic Systems, LTD. Seems like it may have useful information on it."; - name = "soviet tablet"; - note = "TRANSLATED TO GALACTIC COMMON: DO NOT GO SOUTH." - }, -/obj/effect/decal/remains/human{ - color = "#72e4fa" - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/cabin/caves) -"nc" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/cabin/caves) -"nh" = ( -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"ni" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"nj" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"nk" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest/sovietsurface) -"nn" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/indestructible/syndicate, -/area/awaymission/cabin/caves/sovietcave) -"no" = ( -/obj/structure/sign/warning, -/turf/closed/indestructible/syndicate, -/area/awaymission/cabin/caves/sovietcave) -"np" = ( -/turf/closed/indestructible/fakedoor{ - desc = "Can you just stop?"; - name = "GO BACK THE WAY YOU CAME" - }, -/area/awaymission/cabin/caves/sovietcave) -"nq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mine/sound/bwoink, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"nr" = ( -/obj/effect/mine/sound/bwoink{ - name = "explosive mine" - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"ns" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/cobweb/cobweb2{ - desc = "No, the spider web doesn't have any secrets. For fucksake." - }, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"nt" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/ladder/unbreakable/rune{ - color = "#ff0000"; - desc = "ONE HUNDRED AND TEN PERCENT REAL."; - id = "whatkindofnerdusesmapmakertocheattheirwaytoateleportrune"; - name = "\improper TOTALLY LEGIT PORTAL OF FUN" - }, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"nB" = ( -/obj/structure/table/wood/poker, -/obj/item/dice/d6{ - pixel_x = -8 - }, -/turf/open/floor/carpet, -/area/awaymission/cabin) -"nE" = ( -/obj/structure/statue/snow/snowlegion{ - anchored = 1 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"nJ" = ( -/obj/effect/turf_decal/stripes/red/line, -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"nK" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/snow_cabin, -/area/awaymission/cabin/snowforest) -"nL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/airlock/grunge, -/turf/open/floor/mineral/plastitanium/red{ - name = "soviet floor" - }, -/area/awaymission/cabin/caves/sovietcave) -"nM" = ( -/obj/machinery/door/airlock/glass_large{ - name = "Medical Bay" - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"nN" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood, -/area/awaymission/cabin) -"nO" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"nR" = ( -/obj/structure/cable, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/awaymission/cabin) -"nS" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/awaymission/cabin) -"nT" = ( -/obj/structure/window{ - dir = 4 - }, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/wood, -/area/awaymission/cabin) -"nU" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/cabin) -"nV" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/door/airlock/maintenance{ - name = "Maintenance" - }, -/turf/open/floor/plating, -/area/awaymission/cabin) -"oC" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"pu" = ( -/obj/item/grenade/barrier{ - pixel_x = -14; - pixel_y = 14 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"pv" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/structure/statue/snow/snowlegion{ - anchored = 1; - desc = "It's still alive."; - icon_state = "snowlegion_alive" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"pE" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"pL" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"qe" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/structure/ladder/unbreakable{ - alpha = 0; - desc = "Finally."; - height = 1; - icon_state = ""; - id = "whyisitcalledladder10andnotladder1"; - mouse_opacity = 0; - name = "" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"qo" = ( -/obj/item/pickaxe{ - desc = "It's almost broken."; - force = 8; - name = "damaged pickaxe"; - throwforce = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"qq" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/snowforest) -"qR" = ( -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/snowforest) -"qV" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/banhammer{ - desc = "I'm sorry, sir, but fun actions are illegal."; - name = "fun baton" - }, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"rb" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "What" - }, -/obj/item/clothing/head/wizard/fake{ - pixel_x = -1; - pixel_y = 13 - }, -/obj/item/staff{ - layer = 3.01 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"rH" = ( -/mob/living/simple_animal/pet/penguin/emperor, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/snowforest) -"so" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/displaycase{ - start_showpiece_type = /obj/item/dice/d6/space; - trophy_message = "Stolen from dice collector before he could enjoy his day." - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"su" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass3"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"sF" = ( -/obj/structure/fluff/fokoff_sign, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"sK" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/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, "fire" = 20, "acid" = 20); - desc = "I am the law!" - }, -/obj/structure/closet{ - anchored = 1; - name = "uniform closet" - }, -/obj/item/clothing/under/rank/security/officer/spacepol{ - armor = list("melee" = 2, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "fire" = 10, "acid" = 10); - desc = "Anyone enjoying their time while working in a megacorporation, planetary government, or band of pirates is under the jurisdiction of the fun police." - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"sY" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"td" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"th" = ( -/obj/effect/light_emitter{ - set_cap = 1; - set_luminosity = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin) -"ts" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"tC" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"tK" = ( -/mob/living/simple_animal/hostile/bear/snow{ - desc = "It's a polar bear, in space, but not actually in space. It's actually on a planet. This is a planet."; - melee_damage_lower = 10; - melee_damage_upper = 20; - name = "fat space polar bear"; - speed = 3; - wander = 0 - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/snowforest) -"tP" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"ud" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/showcase/mecha/marauder{ - desc = "Used by vigilantes in the past to fight ruffians causing trouble in neighborhoods and space stations."; - icon_state = "seraph"; - name = "illegally acquired seraph" - }, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"um" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"uo" = ( -/obj/machinery/light/directional/north, -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"uz" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"uK" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass2"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"uR" = ( -/obj/structure/table/wood, -/obj/item/storage/medkit/brute, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/lumbermill) -"vj" = ( -/obj/item/key/atv, -/obj/effect/decal/remains/human{ - color = "#72e4fa" - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"vo" = ( -/obj/effect/rune/malformed{ - color = "#5772E0"; - cultist_desc = "The snowman council will now decide your fate."; - cultist_name = "The Snowman Council Rune"; - desc = "An odd collection of symbols drawn in what seems to be frozen water. Despite the fancy setup, the rune seems quite mundane which makes it unworthy of translation."; - icon_state = "2"; - invocation = "Frosty the Snowman was a jolly happy soul with a corncob pipe and a button nose and his eyes made out of coal!"; - invoke_damage = 60; - name = "ice rune" - }, -/obj/item/clothing/suit/snowman{ - desc = "The dead body of a snowman. There's holes to stick your own body in it."; - name = "snowman corpse" - }, -/obj/item/clothing/head/snowman{ - desc = "The head of a dead snowman. There's enough room inside for your own head."; - pixel_x = -1; - pixel_y = 10 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"vG" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/grenade/chem_grenade/large, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"vJ" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/cleanable/plasma, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"wI" = ( -/obj/item/toy/figure/borg{ - desc = "The robot that was manufactured just for this exploration team."; - name = "exploration squad Cyborg"; - pixel_x = 8; - toysay = "I. AM. ALIVE." - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"xa" = ( -/obj/item/paper/pamphlet/gateway, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"xd" = ( -/obj/item/food/fishmeat/carp, -/obj/item/food/fishmeat/carp, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/snowforest) -"xs" = ( -/mob/living/simple_animal/hostile/tree{ - desc = "I am death. I will have my vengeance upon my enemies."; - melee_damage_upper = 8; - wander = 0 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"xw" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/structure/statue/snow/snowlegion{ - anchored = 1; - desc = "It's still alive."; - icon_state = "snowlegion_alive" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"xx" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/knife/shiv/carrot, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"xy" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"xJ" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/nanotrasen, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"xN" = ( -/obj/structure/ladder/unbreakable/rune{ - desc = "I want out of this spookfest."; - icon_state = "hierophant"; - id = "GETMEOUTOFHEREYOUFUCKS"; - name = "\improper Emergency Escape Rune" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"yj" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ - desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; - maxHealth = 20; - melee_damage_lower = 5; - melee_damage_upper = 5; - name = "frozen skeleton"; - speed = 7; - wander = 0 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"ys" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. They're covered in scratch marks."; - name = "mangled remains" - }, -/obj/effect/decal/cleanable/shreds, -/obj/effect/decal/cleanable/shreds{ - pixel_y = 7 - }, -/obj/effect/decal/cleanable/shreds{ - pixel_x = -3; - pixel_y = -5 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"yv" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/food/egg/rainbow{ - desc = "Was an egg really worth this much effort?"; - name = "easter egg" - }, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"yy" = ( -/obj/item/shovel{ - desc = "A large tool for digging and moving snow."; - force = 10; - name = "eskimo shovel" - }, -/obj/effect/decal/remains/human{ - color = "#72e4fa" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"yJ" = ( -/obj/structure/sign/poster/contraband/free_drone{ - desc = "This poster seems to be meant for a bunch of machines that used to be deployed on space stations." - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"yY" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"zd" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Who" - }, -/obj/item/clothing/head/helmet/knight/yellow{ - armor = list("melee" = 11, "bullet" = 2, "laser" = 1, "energy" = 1, "bomb" = 5, "bio" = 2, "fire" = 0, "acid" = 10); - desc = "A classic metal helmet. The cold has made it unreliable though."; - name = "old medieval helmet"; - pixel_y = 7 - }, -/obj/item/claymore/weak/ceremonial{ - desc = "Brought to you by the guys in charge of making replica katana toys!"; - force = 1; - layer = 3.01; - name = "replica claymore"; - pixel_x = 5; - pixel_y = 8; - throwforce = 2 - }, -/obj/item/shield/riot/roman/fake{ - layer = 3.01; - pixel_x = -7 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"zn" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"zv" = ( -/obj/structure/dresser, -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity40"; - name = "shutter button" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"zB" = ( -/obj/structure/closet/crate/wooden{ - desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; - name = "wooden box" - }, -/obj/item/fakeartefact, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"zI" = ( -/obj/item/weldingtool/mini, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Ad" = ( -/obj/structure/closet/crate/wooden{ - desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; - name = "wooden box" - }, -/obj/item/fakeartefact, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Af" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass3"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Ao" = ( -/obj/structure/flora/rock/icy{ - desc = "A mountain rock." - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"At" = ( -/obj/machinery/light/directional/east, -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"AC" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/sign/poster/official/no_erp{ - pixel_y = -32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"AQ" = ( -/obj/structure/closet/crate/wooden{ - desc = "Gotta know what waits within! Could it be a secret treasure cache or a deadly tool of sin?"; - name = "wooden box" - }, -/obj/item/paper{ - info = "Moving these crates through a tunnel that isn't even finished yet is really annoying. It's such a pain in the ass to haul even a single crate to the cabin. It made sense to haul food and other goods however these are fake fucking trophies. Why do they even need these fake artifacts for some asshole's trophy case? We'll just leave the crates in the cave that has all those bones inside. Fuck it."; - name = "Shipment Delivery Note" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"BR" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ - desc = "A reanimated skeleton covered in thick sheet of natural ice. It is obvious to tell that they look really slow."; - maxHealth = 20; - melee_damage_lower = 5; - melee_damage_upper = 5; - name = "frozen skeleton"; - speed = 7; - wander = 0 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"BU" = ( -/obj/structure/fence, -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"BZ" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"CA" = ( -/obj/machinery/icecream_vat, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Dc" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Di" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Dl" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Dw" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/cleanable/generic, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"DE" = ( -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/caves) -"Fq" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/sign/poster/official/space_cops{ - pixel_y = 32 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"Fz" = ( -/obj/structure/flora/rock/icy{ - desc = "A mountain rock." - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"FL" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Because" - }, -/obj/item/clothing/head/scarecrow_hat{ - desc = "A replica straw hat that isn't actually made out of straw"; - name = "synthetic straw hat"; - pixel_x = -1; - pixel_y = 10 - }, -/obj/item/gun/ballistic/shotgun/toy/unrestricted{ - pixel_y = -2 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"FO" = ( -/obj/structure/light_construct/directional/south, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"FW" = ( -/obj/effect/decal/remains/human, -/obj/structure/light_construct/directional/south, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"GN" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"GO" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Hn" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Ho" = ( -/obj/structure/flora/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/snowforest) -"HY" = ( -/obj/structure/fence/door/opened, -/obj/structure/barricade/wooden/crude/snow, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Id" = ( -/obj/effect/decal/remains/human, -/obj/item/pickaxe{ - desc = "It's almost broken."; - force = 8; - name = "damaged pickaxe"; - throwforce = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"IU" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"IV" = ( -/obj/structure/fluff/empty_sleeper{ - desc = "An open sleeper. It looks as though it would be awaiting another patient."; - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"JL" = ( -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"JW" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/crowbar/large, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"KA" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"Lc" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass2"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"Ld" = ( -/obj/item/toy/mecha/deathripley{ - desc = "The mining mecha of the exploration team."; - name = "exploraton squad Ripley"; - pixel_y = 15 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"Lj" = ( -/obj/effect/decal/remains/xeno, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Lm" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - desc = "You didn't seriously examine each snowman to see if their description is different, did you?" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"LE" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/nullrod/claymore/multiverse{ - anchored = 1; - force = 4 - }, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"LF" = ( -/obj/structure/flora/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"LQ" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood/freezing, -/area/awaymission/cabin/caves) -"LS" = ( -/obj/structure/sign{ - pixel_x = 32 - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"LW" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"Mk" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Ml" = ( -/mob/living/simple_animal/hostile/bear/russian{ - desc = "He'll hold the line against you!"; - light_outer_range = 3; - melee_damage_upper = 25; - name = "Artyom"; - speak = list("Blyat!","Rawr!","GRR!","Growl!"); - wander = 0 - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/cabin/caves) -"Mv" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "I Don't Know" - }, -/obj/item/clothing/head/bishopmitre{ - pixel_x = -1; - pixel_y = 16 - }, -/obj/item/gun/magic/wand{ - desc = "It's just a fancy staff so that holy clerics and priests look cool. What? You didn't think someone would leave a REAL magic artifact with a snowman out in the cold, did you?"; - icon_state = "revivewand"; - layer = 3.01; - name = "holy staff"; - pixel_y = -2 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"MN" = ( -/obj/structure/barricade/wooden/snowed, -/obj/structure/barricade/wooden/crude/snow, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Na" = ( -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity10"; - name = "shutter button" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"Nb" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/remains/xeno/larva, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Nf" = ( -/obj/effect/decal/remains/human, -/obj/item/shovel, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Nq" = ( -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity20"; - name = "shutter button" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"Oe" = ( -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Oo" = ( -/obj/structure/ladder/unbreakable/rune{ - alpha = 0; - color = "#000000"; - desc = "It is time to bust out of this joint"; - height = 1; - id = "whatkindofnerdusesmapmakertocheattheirwaytoateleportrune"; - mouse_opacity = 0; - name = "\improper secret escape route" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"Ow" = ( -/obj/structure/flora{ - desc = "Looks frozen."; - icon = 'icons/obj/flora/snowflora.dmi'; - icon_state = "snowgrass_sw"; - name = "frozen flora" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"OZ" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Pd" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"Po" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"PV" = ( -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"Qf" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/structure/signpost/salvation{ - density = 0; - desc = "An intercomm. Someone seems to be on the other end. I should use it."; - icon = 'icons/obj/radio.dmi'; - icon_state = "intercom"; - max_integrity = 99999; - name = "\proper Fun Jail intercom"; - pixel_y = 32; - question = "We have a case of fun happening. Get out there and do your job." - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"QA" = ( -/obj/item/gun/ballistic/automatic/toy{ - anchored = 1; - desc = "Don't try it."; - name = "\improper Nanotrasen Saber SMG" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"QL" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin) -"QT" = ( -/obj/item/chair/stool, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Ri" = ( -/obj/effect/decal/remains/human, -/obj/item/reagent_containers/spray/pepper/empty, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Rp" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/mineral/plastitanium/red/snow_cabin, -/area/awaymission/cabin/caves/sovietcave) -"Rs" = ( -/obj/structure/flora/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Rt" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"Rz" = ( -/obj/item/toy/figure/md{ - desc = "The doctor that got volunteered to join the exploration team."; - name = "exploration squad Medic"; - pixel_x = -8; - toysay = "Guess I'll be useless until stuns are involved!" - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"RC" = ( -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"RD" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/mob/living/simple_animal/hostile/statue{ - desc = "Just a snowman. Just a snowman. Oh god, it's just a snowman."; - faction = list("statue","mining"); - health = 5000; - icon_dead = "snowman"; - icon_living = "snowman"; - icon_state = "snowman"; - loot = list(/obj/item/dnainjector/geladikinesis); - maxHealth = 5000; - melee_damage_lower = 65; - melee_damage_upper = 65; - name = "Frosty" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"RL" = ( -/obj/item/toy/figure/dsquad{ - desc = "The muscle behind the exploration team. May or may not be a secret soldier depending on the mood of Nanotrasen following their own lore."; - name = "exploration squad Officer"; - toysay = "We're top secret until we're not!" - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"RN" = ( -/obj/structure/ladder/unbreakable/rune{ - desc = "Get me out of this boring room."; - height = 1; - icon_state = "hierophant"; - id = "GETMEOUTOFHEREYOUFUCKS"; - name = "\improper Return Rune" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"RY" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/sign/poster/official/do_not_question{ - pixel_x = 32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"Sd" = ( -/obj/structure/flora/stump{ - desc = "Breaking it should be easy."; - max_integrity = 20; - name = "old stump" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"So" = ( -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity30"; - name = "shutter button" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"SS" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/cleanable/molten_object/large, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Tm" = ( -/obj/structure/chair, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"To" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/hatchet/wooden, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Tt" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"TD" = ( -/obj/item/toy/spinningtoy{ - anchored = 1; - desc = "He keeps breaking out somehow due to the help of cultists that utilize cargo shipments or atmospherical sabotage." - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"TM" = ( -/obj/structure/fence/end, -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"TU" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/cleanable/shreds, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"TY" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/caves) -"Uu" = ( -/obj/structure/statue/snow/snowlegion{ - anchored = 1; - desc = "It's still alive."; - icon_state = "snowlegion_alive" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Uv" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"UO" = ( -/obj/effect/mine/stun, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"US" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/caves) -"UZ" = ( -/obj/item/pickaxe/drill, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Vg" = ( -/obj/machinery/button/door/directional/north{ - id = "fightingcommunity50"; - name = "shutter button" - }, -/turf/open/floor/wood, -/area/awaymission/cabin) -"Vj" = ( -/obj/item/flashlight/flare, -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"VC" = ( -/obj/item/toy/figure/clown{ - desc = "Shut up, we don't talk about him."; - name = "exploration squad Clown" - }, -/turf/open/misc/ice/smooth, -/area/awaymission/cabin/caves) -"Wd" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) -"We" = ( -/obj/structure/easel{ - desc = "An ancient canvas that was used to produce art so fine, the universe can't handle it!"; - name = "Ancient Canvas Art" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/indestructible, -/area/awaymission/cabin/caves/mountain) -"Wp" = ( -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/effect/decal/cleanable/oil, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Wy" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Wz" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/turf/open/floor/iron/white, -/area/awaymission/cabin) -"WH" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/obj/item/clothing/head/helmet/skull{ - armor = list("melee" = 15, "bullet" = 5, "laser" = 5, "energy" = 2, "bomb" = 10, "bio" = 5, "fire" = 20, "acid" = 20); - desc = "It's not bloody for some reason. Dear god."; - name = "human skull" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"WK" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Why" - }, -/obj/item/clothing/head/bandana{ - pixel_x = -1; - pixel_y = -1 - }, -/obj/item/throwing_star{ - desc = "I better not rely on this being useful."; - force = 1; - name = "frozen throwing star"; - throwforce = 1 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Xa" = ( -/turf/open/misc/asteroid/snow/snow_cabin{ - name = "packed snow"; - slowdown = 0 - }, -/area/awaymission/cabin/snowforest) -"Xy" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/cabin/caves/mountain) -"XO" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/shovel, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Yc" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/item/melee/baseball_bat, -/obj/effect/decal/cleanable/glitter/blue{ - desc = "It looks like fancy glitter to me."; - name = "icy wind" - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"Yd" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/caves) -"ZY" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow/snow_cabin, -/area/awaymission/cabin/snowforest) - -(1,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(2,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(3,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(4,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(5,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -"} -(6,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -"} -(7,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -gx -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(8,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -"} -(9,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gC -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -ab -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -"} -(10,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fy -fy -cx -cx -cx -cx -cx -gE -gE -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(11,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fp -Xy -Xy -fM -fP -TD -cx -cx -Qf -Xy -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ms -ms -ms -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(12,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fQ -sY -cx -cx -td -td -yv -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ab -gx -ms -ms -Oe -BR -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(13,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -eB -fr -fq -fJ -fN -cx -cx -cx -cx -td -td -qV -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -gx -ms -ms -Oe -Oe -ms -ms -ms -ms -gx -gx -gx -gx -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(14,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -eP -fs -fq -fJ -fN -fP -QA -cx -cx -td -Xy -sK -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -gx -gx -ms -Oe -Oe -Oe -Oe -Oe -Oe -mP -ms -ms -gx -gx -gx -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(15,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fR -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -gx -ms -ms -Oe -Oe -PV -PV -Oe -Oe -Oe -Oe -mP -gx -gx -gx -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -"} -(16,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fq -fq -fJ -fN -cx -cx -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -gx -ms -Oe -Oe -PV -zB -PV -Oe -Oe -Oe -Oe -mP -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(17,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fP -yJ -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ms -ms -Oe -PV -PV -PV -PV -Oe -Oe -Oe -Oe -mP -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(18,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fq -fE -fJ -fN -fS -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ms -Oe -Oe -PV -PV -yj -PV -Oe -ms -Oe -Oe -ms -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(19,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -cx -cx -cx -cx -td -AC -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -ms -Ad -Oe -PV -PV -PV -PV -Oe -Oe -Oe -Oe -ms -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(20,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fg -fr -fq -fJ -fN -fT -Pd -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -ms -ms -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -ms -gx -gx -gx -ab -ab -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -"} -(21,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fh -ft -fF -fK -fN -fU -Oo -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ms -ms -BR -PV -PV -zB -PV -PV -BR -Oe -Oe -ms -ms -gx -gx -ab -ab -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -"} -(22,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -aj -ft -fF -fK -fN -cx -cx -cx -cx -td -Xy -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ms -Oe -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -ms -gx -gx -gx -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -"} -(23,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fk -ft -fF -fK -fN -fP -We -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -ms -Oe -Oe -Oe -PV -PV -PV -PV -Oe -Oe -ms -Oe -ms -ms -gx -gx -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -"} -(24,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fl -fs -fq -fJ -fN -fV -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -ms -Oe -PV -PV -PV -yj -PV -PV -Oe -Oe -Oe -Oe -Oe -ms -ms -gx -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -"} -(25,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -cx -cx -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -ab -ms -Oe -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -ms -Oe -Oe -ms -gx -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -"} -(26,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fq -fq -fJ -fN -fP -LE -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -gx -ms -Oe -PV -zB -PV -PV -PV -Oe -Oe -Oe -Oe -Oe -Oe -Oe -mP -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -"} -(27,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fW -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -ms -ms -Oe -PV -PV -PV -PV -Oe -Oe -ms -Oe -ms -Oe -Oe -Oe -ms -ms -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -"} -(28,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fq -fq -fJ -fN -cx -cx -cx -cx -Fq -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ms -Oe -Oe -Oe -PV -PV -Oe -Oe -ms -ms -Oe -Oe -Oe -Oe -Oe -Oe -ms -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -"} -(29,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fP -IV -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ms -ms -Oe -Oe -Oe -Oe -Oe -ms -ms -mP -mP -Oe -Oe -Oe -Oe -AQ -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(30,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fm -fr -fq -fJ -fN -fX -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ms -ms -ms -ms -ms -ms -ms -ab -ab -mP -mP -Oe -ms -Oe -Oe -mP -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(31,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -fn -fs -fq -fJ -fN -cx -cx -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -xs -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -mP -Oe -Oe -Oe -ms -ms -ms -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(32,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cy -fq -fq -fJ -fN -fP -ud -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -pL -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -mP -mP -Oe -Oe -ms -ms -Oe -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(33,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -fu -Xy -Xy -fO -fY -sY -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -ab -gx -gx -gx -mP -Oe -Oe -Oe -Oe -BR -ms -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(34,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fy -fy -cx -cx -cx -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -gx -gx -gx -gx -mP -mP -Oe -Oe -mP -mP -mP -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(35,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -td -Xy -cx -fZ -go -gs -gw -td -Xy -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -mP -mP -Oe -Oe -mP -mP -mP -ab -ab -ab -ab -ab -ab -ab -ab -"} -(36,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -td -td -td -cx -gb -gp -gt -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -mP -Oe -Oe -Oe -Oe -mP -mP -ab -ab -ab -ab -ab -ab -ab -"} -(37,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -so -td -td -td -cx -cx -cx -cx -cx -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -qe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -BZ -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -Oe -BZ -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -mP -mP -Oe -Oe -Oe -Oe -mP -mP -ab -ab -ab -ab -ab -ab -"} -(38,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -td -td -td -td -td -td -Xy -td -td -td -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -pL -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -mP -mP -Oe -Oe -ms -Oe -Oe -mP -ab -ab -ab -ab -ab -ab -"} -(39,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -Xy -td -td -td -RY -td -td -td -Xy -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -pL -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -Af -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -mP -BR -Oe -Oe -Oe -Oe -ms -mP -ab -ab -ab -ab -ab -ab -"} -(40,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -jm -RC -RC -RC -RC -RC -RC -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -Oe -jm -jm -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ms -ms -ms -Oe -Oe -Oe -ms -ms -ab -ab -ab -ab -ab -ab -"} -(41,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -Oe -Oe -Oe -Oe -MN -jm -jm -ab -ab -ab -ab -ab -ab -ab -Rt -Rt -PV -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -pL -jm -jm -jm -OZ -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ms -ms -Oe -Oe -Oe -ms -ab -ab -ab -ab -ab -ab -"} -(42,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -gc -gc -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -Oe -Oe -Oe -PV -Rt -qR -jm -jm -jm -jm -ab -ab -ab -ab -Rt -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -jm -Oe -jm -jm -ab -ab -ab -ab -jm -jm -jm -jm -RC -RC -RC -pL -RC -jm -jm -ab -ab -jm -jm -jm -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -Oe -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -iz -iz -mP -mP -mP -mP -mP -iz -iz -iz -iz -nc -ab -ab -ab -ab -ab -"} -(43,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -fI -fG -gd -gd -fG -fG -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -Oe -Oe -Oe -PV -PV -Rt -qR -qR -qR -RC -jm -jm -jm -jm -Rt -Rt -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -pL -RC -jm -jm -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -jm -jm -jm -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -pL -RC -RC -RC -RC -su -RC -RC -su -RC -mi -BU -TM -jm -mE -mP -iz -mP -iz -mP -mP -mP -iz -iz -iz -mP -iz -mP -iz -iz -iz -iz -iz -iz -ab -ab -ab -ab -ab -"} -(44,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fH -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -Oe -Oe -Oe -Oe -PV -PV -Rt -qR -qR -qR -qR -qR -RC -RC -pL -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -jm -jm -jm -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -LF -jm -RC -RC -RC -RC -RC -RC -su -Hn -su -RC -su -RC -mj -tP -lP -mE -mE -iz -iz -mP -iz -iz -iz -mP -mJ -mJ -mJ -mJ -mJ -mJ -mU -mU -um -um -mU -mW -ab -ab -ab -ab -ab -"} -(45,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -gy -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -Oe -Oe -Oe -Oe -PV -PV -PV -Rt -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -OZ -jm -jm -RC -RC -RC -RC -Lc -RC -RC -RC -RC -su -RC -RC -RC -RC -xJ -tP -mA -mA -mA -iz -mJ -mJ -mJ -mJ -mJ -mJ -mJ -mJ -mJ -mW -mW -mW -mX -um -um -um -mW -mW -ab -ab -ab -ab -ab -"} -(46,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fL -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Rt -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -jm -jm -ab -ab -ab -jm -jm -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -Lc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Yd -mv -mv -mF -mJ -mJ -mJ -mJ -mU -mU -mU -mJ -iC -iC -mP -mP -mP -PV -iC -vj -PV -PV -mP -mP -ab -ab -ab -ab -ab -"} -(47,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -Rt -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Lc -su -RC -RC -RC -RC -RC -Wy -mv -mB -mB -iC -iC -iC -iC -iC -mP -mP -iC -iC -PV -PV -PV -PV -PV -PV -PV -PV -na -mP -mP -ab -ab -ab -ab -ab -"} -(48,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fI -gd -gd -fG -fI -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -MN -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -qR -qR -qR -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -jm -jm -jm -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -mn -mv -Vj -mB -iC -iC -iC -iC -mP -mP -mP -mP -iC -PV -PV -PV -PV -PV -PV -PV -PV -mP -mP -mP -ab -ab -ab -ab -ab -"} -(49,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -MN -jm -RC -RC -RC -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -jm -jm -jm -jm -jm -jm -OZ -jm -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -mo -mv -tP -mB -iC -iC -iC -iC -mP -mP -mP -mP -iC -PV -PV -PV -PV -PV -PV -PV -iC -mP -mP -mP -ab -ab -ab -ab -ab -"} -(50,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fH -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -Oe -ab -jm -RC -RC -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -su -RC -RC -RC -RC -RC -RC -RC -su -RC -RC -Wy -mv -mB -mB -iC -iC -iC -iC -iC -mP -mP -iC -iC -iC -iC -PV -PV -PV -PV -PV -iC -mP -mP -mP -ab -ab -ab -ab -ab -"} -(51,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -Oe -Oe -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -ab -jm -RC -RC -qR -qR -qR -qR -RC -RC -Tm -CA -RC -RC -RC -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Ow -RC -Lc -RC -RC -RC -RC -RC -RC -Lc -RC -RC -RC -Lc -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -mp -mv -tP -mG -mJ -mJ -mJ -mJ -mJ -mJ -mU -mJ -iC -iC -iC -iC -PV -iC -PV -iC -iC -mP -mP -mP -ab -ab -ab -ab -ab -"} -(52,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fH -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -gx -gx -Oe -Oe -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -ab -jm -RC -RC -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xJ -tP -mA -mA -mA -iz -mJ -mJ -mJ -mV -mJ -mJ -mW -mW -mW -mU -mU -mU -mU -mU -mJ -nb -mW -mW -ab -ab -ab -ab -ab -"} -(53,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fH -fL -cx -cx -cx -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -ab -jm -RC -RC -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -su -RC -Sd -RC -mq -tP -lP -lP -mE -iz -iz -mP -iz -iz -iz -mP -mW -mW -mW -mW -mJ -mJ -mJ -mW -mW -mW -mW -mW -ab -ab -ab -ab -ab -"} -(54,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Oe -Oe -Oe -ab -ab -jm -RC -RC -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -su -RC -RC -RC -mr -BU -TM -jm -mE -mP -iz -mP -mP -iz -iz -iz -iz -iz -mP -mP -mP -iz -iz -iz -iz -mP -mP -mP -ab -ab -ab -ab -ab -"} -(55,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fI -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Oe -Oe -Oe -ab -ab -jm -RC -RC -RC -qR -qR -qR -qR -qR -qR -RC -RC -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -su -uK -jm -jm -mE -mP -ab -ab -ab -ab -ab -ab -ab -iz -iz -iz -mP -mP -mP -mP -mP -iz -iz -iz -iz -ab -ab -ab -ab -ab -"} -(56,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -fG -fG -cx -cx -cx -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Oe -Oe -ab -ab -ab -jm -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(57,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -gz -fG -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -Ao -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Ow -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Af -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(58,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fH -fG -gd -gd -fG -fG -fG -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Oe -Oe -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -pL -RC -RC -su -RC -RC -RC -RC -RC -RC -BZ -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(59,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fI -fG -gH -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -Oe -gx -gx -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Lc -RC -RC -RC -RC -RC -RC -RC -Lc -RC -RC -RC -su -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(60,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fI -gd -gd -fG -fG -gu -fG -fG -fG -fG -hK -kR -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -Oe -gx -gx -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(61,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -gd -gd -fG -gA -fL -fG -gT -fH -gT -fG -kX -kZ -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -su -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(62,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fL -gd -gd -gu -fG -fG -fI -fG -fG -fG -jL -fG -kR -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -ab -ab -ab -jm -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(63,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fH -fG -fG -gd -gd -gd -gd -gd -gd -gd -gd -hJ -hJ -gd -gd -gc -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -ki -ki -LQ -LQ -ki -ki -ki -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(64,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fH -gd -gd -gd -gd -gd -gd -gd -gd -hJ -hJ -gd -gd -gc -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -LQ -ki -ki -ki -ki -LQ -ki -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -BZ -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(65,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fG -fG -fG -fH -fG -fG -fG -fG -fG -fG -fG -fG -fL -fG -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Ow -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(66,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -fG -fI -fG -fG -fL -fG -fG -fG -fG -fI -fG -fG -fG -fG -fI -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -fA -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -jm -uK -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(67,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -fG -fG -fG -fG -fG -gB -fG -fG -fG -fG -fG -fH -fG -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -fw -fB -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(68,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -cx -gD -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -fw -fC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Fz -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -OZ -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(69,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -gr -gr -gr -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -Wd -RC -RC -em -fx -fx -fB -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Lc -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(70,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -gr -gr -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -fw -fx -fx -fD -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(71,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -fw -fx -fC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(72,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -cR -ek -ek -ek -ek -ek -ek -fx -fx -fC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Ow -RC -RC -BZ -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(73,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -cR -bS -ce -ce -ce -bS -bS -bS -fx -fx -fC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(74,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -cx -cx -cx -cx -gr -gr -cx -cx -cx -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -PV -PV -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -cR -bS -bS -cf -cf -cf -bS -bS -bS -fx -fx -fx -fB -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -xy -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(75,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -ef -bS -bS -cg -cg -cg -bS -bS -bS -fx -fx -fx -fC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(76,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -Oe -PV -PV -PV -PV -PV -PV -PV -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -th -th -th -th -th -th -th -th -th -th -th -th -cr -el -el -en -el -el -el -el -el -ep -ep -ep -er -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(77,1,1) = {" -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -an -an -an -an -an -an -an -ao -ao -an -an -an -an -an -an -an -an -ba -ba -an -eq -eq -eq -eq -an -th -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(78,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -Oe -Oe -Oe -Oe -Oe -ki -ki -ki -ki -ki -LQ -Oe -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -Na -aV -jr -au -jk -an -aq -aq -an -bl -bM -ij -bT -cs -bl -an -aq -aq -an -cS -aL -aL -aL -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(79,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -gx -gx -Oe -Oe -ki -ki -ki -LQ -ki -ki -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -th -iZ -aN -aq -az -bb -bb -eg -bm -eg -nR -an -eg -eg -eg -eg -eg -eg -hB -eg -eg -an -cT -cV -gL -cV -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(80,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -Oe -gx -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -iZ -jy -jG -az -bb -az -aq -an -aq -ht -an -cA -an -an -an -an -hx -an -aq -eg -an -cU -aL -aL -ec -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(81,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -gx -gx -gx -gx -Ao -PV -PV -PV -PV -PV -PV -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -iZ -bp -aq -az -az -az -aq -an -aq -eg -an -eg -aq -aq -aq -aq -eg -an -aq -eg -an -cV -gL -cV -cV -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(82,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -Oe -gx -gx -gx -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -th -an -an -aq -aA -aI -aA -aq -an -br -eg -an -cE -aq -aq -aq -aq -ht -an -aq -ht -an -aL -aL -aL -ed -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(83,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -Oe -Oe -gx -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -an -nU -an -an -an -aR -an -aq -eg -an -eg -aq -aq -aq -aq -eg -an -aq -eg -an -cU -cW -aL -gN -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -xy -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(84,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -gx -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -th -an -as -aB -aH -an -an -an -aq -eg -an -cz -eg -eg -eg -eg -ht -an -aq -eg -an -ed -aL -aL -kE -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(85,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -th -an -an -an -an -an -aS -hg -aq -ht -an -nT -bo -bo -bo -bo -cB -an -aq -eg -bV -ed -ed -gM -an -an -th -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(86,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -at -aC -aH -an -an -an -aq -eg -an -aO -aO -aO -aO -aO -az -az -aq -eg -an -eb -cX -an -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(87,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -an -nU -an -an -an -aT -an -aq -eg -an -az -aq -aq -az -aq -aq -cO -aq -ht -an -an -an -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -pL -RC -RC -RC -RC -Uv -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(88,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -aq -au -jt -aV -aq -an -bs -eg -eh -bb -eg -bb -hC -bb -hE -he -hG -eg -eN -an -th -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -rH -qR -qR -qR -qR -qR -rH -qR -qR -qR -qR -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(89,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gv -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -FL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -th -ja -aN -aq -az -az -az -aq -an -aq -eg -an -aP -az -ej -nB -hd -az -aO -aq -eg -aq -an -an -th -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(90,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -gr -gr -gr -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -rb -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ja -jy -jF -az -bb -bb -aq -an -aq -ht -an -bq -az -ha -hc -hd -az -az -aq -eg -aq -aN -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(91,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -Ao -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -ab -ab -jm -Oe -RC -zd -RC -nE -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -th -ja -bp -aq -az -az -bb -eg -iY -eg -eg -an -bt -az -ej -jx -hd -az -cO -aq -eg -aq -iR -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(92,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Ao -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -jm -Mv -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -Nq -aA -aI -aA -jj -an -eg -aq -an -cN -aq -az -aO -az -ci -hF -cC -eg -aq -bp -ao -th -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -rH -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(93,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -cx -cx -cx -cx -cx -cx -cx -cx -cx -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -gx -gx -ab -ab -ab -jm -WK -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -th -th -an -an -an -an -an -an -an -ct -aq -an -jE -aq -aq -az -aq -aq -aO -aq -eg -aq -an -an -th -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -xd -qR -qR -qR -qR -qR -rH -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(94,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -th -an -an -So -aV -ju -au -ji -an -eg -aq -an -cO -cO -cO -cO -cO -az -az -aq -ht -an -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -jp -xd -jp -xd -jp -qR -qR -qR -qR -qR -qR -RC -RC -xy -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(95,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Ao -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jb -aN -aq -az -bb -bb -eg -iX -eg -ht -an -hb -bU -ev -eu -cK -cD -an -aq -eg -aq -an -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -qR -qR -qR -qR -qR -qR -jp -xd -jp -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(96,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jb -jy -jH -az -bb -az -aq -an -aq -eg -an -hn -aq -eg -eg -eg -eg -an -aq -eg -aq -aN -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(97,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -co -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -Oe -Oe -Oe -Ao -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -jm -jm -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jb -bp -aq -az -az -az -aq -an -aq -eg -an -bv -bN -nO -aq -ap -eg -an -aq -eg -aq -iU -ao -th -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(98,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -aq -aA -aI -aA -aq -an -br -eg -an -an -an -an -bu -an -eo -an -aq -eg -aq -bp -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -pL -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(99,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Ao -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -BZ -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -an -nU -an -an -an -aU -an -aq -eg -an -bw -bO -bO -bO -bO -hz -eo -eg -eg -aq -an -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(100,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -bI -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -th -an -as -aB -aH -an -an -an -aq -eg -an -bx -bO -cJ -cF -cJ -hz -an -aq -ht -an -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -rH -qR -qR -qR -qR -qR -qR -qR -qR -rH -qR -qR -qR -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(101,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -Ao -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -th -an -an -an -an -an -hf -hy -aq -eg -an -by -bO -bO -bO -bO -hz -an -aq -eg -aq -an -an -th -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(102,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -ab -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -th -an -at -aC -aH -an -an -an -aq -ht -an -bz -bO -bW -ck -cj -hz -an -aq -eg -aq -aN -ao -th -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -rH -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(103,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -PV -PV -JL -JL -JL -JL -JL -JL -JL -JL -JL -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -an -nU -an -an -an -aW -an -aq -eg -an -an -an -an -an -an -hA -an -aq -eg -aq -iS -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(104,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Ao -Oe -Oe -Oe -Oe -JL -JL -JL -JL -JL -JL -JL -JL -JL -JL -JL -Oe -Oe -Oe -Oe -Oe -Ao -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -th -an -an -aq -au -jv -aV -aq -an -bs -eg -an -bA -bB -bX -cl -cl -hi -an -aq -eg -aq -bp -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(105,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -JL -JL -JL -JL -Oe -JL -JL -JL -Oe -Oe -JL -JL -Oe -Oe -Ao -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -th -jc -aN -aq -az -az -az -aq -an -aq -eg -an -bB -bB -bB -bB -hi -hi -an -hh -eg -aq -an -an -th -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(106,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -JL -JL -JL -Oe -Oe -Oe -JL -JL -Oe -Oe -Oe -Oe -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jc -jy -jI -az -bb -az -aq -an -aq -eg -an -bC -bB -bY -is -dt -cG -an -aq -ht -an -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -qR -qR -qR -RC -RC -xy -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(107,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -Oe -Ao -Oe -Oe -Oe -Oe -Oe -Oe -Oe -JL -JL -LS -Oe -Oe -Oe -JL -JL -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -th -jc -bp -aq -az -bb -bb -eg -iW -eg -eg -an -an -an -an -an -an -an -an -aq -eg -aq -an -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -qR -qR -qR -qR -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(108,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -iv -iv -kj -iv -iv -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -th -an -an -zv -aA -aI -aA -jg -an -eg -aq -an -aJ -bG -bE -cv -hq -cv -an -aq -eg -aq -aN -ao -th -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(109,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -iv -iv -iM -iM -iM -iv -iv -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -QL -th -an -an -an -an -an -an -an -ct -bh -an -aK -bE -bE -bE -bE -lz -an -aq -eg -aq -iT -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(110,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -iv -iM -iM -iM -iM -iM -iv -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -Vg -aV -jw -au -jh -an -eg -aq -an -bD -bE -bE -cI -hD -cP -nM -eg -eg -aq -bp -ao -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(111,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -iv -iP -iM -kl -iM -iM -iv -Oe -Oe -JL -JL -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jd -aN -aq -az -bb -bb -eg -iV -eg -aq -an -bE -bE -bE -cP -jq -bE -bE -aq -eg -aq -an -an -th -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(112,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -Oe -Oe -Oe -Ao -Oe -iv -iM -iM -iM -iM -iM -iv -Oe -Oe -JL -JL -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -Oe -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -th -jd -jy -jJ -az -bb -az -aq -an -eg -aq -an -bF -bP -cm -ho -bE -lz -an -aq -eg -an -an -th -th -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(113,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -Oe -iv -iv -iQ -km -iQ -iv -iv -Oe -Oe -JL -JL -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -Oe -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -jd -bp -aq -az -az -az -aq -an -eg -nS -an -bF -bQ -cu -hp -Wz -hp -an -aq -eg -an -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(114,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -gx -gx -ab -Oe -Oe -Oe -iv -iv -iv -iv -iv -Oe -Oe -Oe -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -an -aq -aA -aI -aA -aq -an -in -nN -an -an -an -an -an -an -an -an -aq -ht -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(115,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -gx -gx -gx -gx -gx -gx -LW -LW -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -th -th -an -nU -an -an -an -aU -an -eg -eg -nV -ei -et -hj -hr -hs -et -nV -eg -eg -an -th -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(116,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -an -as -aB -aH -an -an -an -ar -an -an -an -an -an -an -an -an -an -cM -hm -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(117,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -LW -LW -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -yY -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -th -th -an -an -an -an -an -aX -bf -bb -an -bj -bH -an -kk -aq -aq -aq -io -az -bb -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(118,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ax -an -aF -cL -aw -jC -bb -bb -az -an -bk -bJ -an -aq -aq -aq -eg -cH -cQ -hH -an -th -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(119,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -Oe -Oe -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -dD -dH -dH -dH -dH -dH -dN -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ax -av -aw -ed -hu -an -aY -bc -bg -an -nU -an -an -aq -cp -eg -eg -aq -cQ -hI -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(120,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -Oe -JL -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -ad -ad -eG -eG -eH -eG -eG -ad -ad -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ax -aw -ed -ed -hv -an -hl -bd -az -an -jf -ay -an -aq -aq -aq -eg -cH -cQ -ee -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(121,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -Oe -JL -JL -JL -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -ad -ad -jP -af -af -af -af -af -jP -ad -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ax -aD -aM -du -hw -an -aZ -be -az -bi -hk -bL -an -bn -aq -aq -aq -aq -az -az -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(122,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -ad -ad -af -af -af -af -jB -af -af -af -af -ad -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -th -ax -aE -aQ -dv -an -an -ao -ao -ao -an -an -je -an -an -jD -jD -an -jA -jz -an -an -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(123,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -jm -RC -Sd -RC -RC -RC -RC -RC -RC -RC -ad -ew -af -af -al -kf -ff -eQ -ak -af -af -eY -ad -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -ax -ax -ax -ax -ax -th -th -th -th -th -th -th -th -an -ao -ao -an -ao -ao -an -th -th -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(124,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -JL -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ad -ad -af -af -ak -af -am -af -fe -af -af -ad -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -th -th -th -th -th -th -th -RC -RC -RC -RC -RC -RC -th -th -th -th -th -th -th -th -th -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(125,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ad -jM -af -af -af -jV -af -af -af -jM -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(126,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ad -gY -af -af -af -af -af -af -af -jR -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(127,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -Sd -RC -RC -RC -RC -RC -ad -gY -af -af -ak -af -ak -af -af -kD -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(128,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -Sd -RC -RC -ad -jQ -af -ak -jX -af -ka -ke -af -eA -ad -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -dA -Tt -Tt -Dc -Tt -Dc -Tt -Tt -Tt -Tt -lP -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(129,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iz -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -ad -gY -af -jW -af -af -jU -jT -af -jR -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(130,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iz -iz -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -JL -JL -JL -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -ad -jM -af -kb -gZ -af -af -uR -af -jM -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -sF -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Ho -Xa -Xa -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(131,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iA -iC -gx -gx -iA -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ao -jm -RC -RC -RC -RC -RC -RC -RC -ad -ad -af -af -ak -ak -af -kd -kc -af -af -ad -ad -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -ZY -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Ho -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(132,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iB -iC -iG -iC -iH -gx -gx -gx -gx -gx -gx -gx -gx -Ao -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -ad -ex -af -af -af -jZ -af -jY -af -af -af -eZ -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -tK -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -US -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(133,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iz -iA -iC -iC -iC -iJ -iz -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -JL -JL -JL -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -ad -ad -af -af -af -af -af -af -af -af -af -ad -ad -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -HY -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(134,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -iz -iz -iD -iH -iI -iz -iz -gx -gx -gx -gx -Oe -Oe -Oe -Oe -JL -JL -JL -Oe -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -Sd -RC -Sd -RC -RC -RC -RC -ae -ad -ad -jO -af -af -af -af -af -jO -ad -ad -fb -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(135,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -iz -iz -iz -iz -iz -Oe -gx -gx -gx -Oe -Oe -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -ad -ad -eH -eG -lQ -eG -eH -ad -ad -cZ -fc -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Ho -Xa -Xa -Xa -Xa -Xa -Ho -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(136,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -Oe -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -Ao -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -mw -bS -bS -eI -eM -eU -bS -bS -mw -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Ho -Xa -Xa -Xa -Xa -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(137,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -Oe -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -Sd -RC -ag -cZ -bS -bS -eE -eJ -eR -eV -eE -bS -bS -cZ -fc -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Ho -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(138,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -PV -Oe -Oe -Oe -gx -gx -gx -Oe -Oe -JL -JL -JL -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -Sd -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -bS -eD -eF -eJ -eR -eV -eF -eD -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(139,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -PV -PV -Oe -Oe -IU -gx -gx -gx -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -bS -eE -cZ -eJ -eR -eV -cZ -eE -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(140,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -PV -PV -Oe -Oe -Oe -gx -gx -Oe -Oe -Oe -JL -JL -JL -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -Sd -RC -RC -RC -RC -RC -RC -ah -cZ -bS -eF -cZ -eK -eR -eV -cZ -eF -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Ho -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -Xa -qq -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(141,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -PV -PV -Oe -Oe -Oe -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -bS -bS -cZ -eJ -lC -eV -cZ -bS -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -aG -dg -dg -dE -dE -dE -dE -dE -dE -hZ -hZ -dg -dg -if -US -DE -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(142,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -PV -PV -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Ao -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -Sd -RC -RC -RC -ag -cZ -bS -bS -cZ -nJ -eS -nK -cZ -bS -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -bK -dh -di -dF -dO -dF -dh -dF -dF -dF -dF -ic -dp -nh -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(143,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -Oe -PV -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -Sd -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -bS -bS -bS -eJ -lC -eV -bS -bS -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -qq -bK -di -di -ds -di -di -dw -di -hY -di -di -di -dh -nh -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(144,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -Oe -IU -PV -PV -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -bS -bS -bS -eK -eR -eW -bS -bS -bS -cZ -fc -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -da -dk -di -dG -dG -dG -dG -dJ -dG -dI -dG -di -id -ni -US -DE -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(145,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -Oe -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -Rs -RC -RC -RC -RC -RC -RC -RC -RC -RC -ag -cZ -cZ -bS -bS -eL -eT -eX -bS -bS -cZ -cZ -fc -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -jm -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -Di -Xa -Ho -Xa -Xa -db -dl -dr -dI -di -di -dU -fi -di -dh -dG -di -id -ni -TY -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(146,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -ai -cZ -cZ -cZ -bS -bS -bS -bS -bS -cZ -cZ -cZ -fd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -dc -dm -di -dG -dP -di -dh -dW -dS -ia -dG -di -id -ni -US -DE -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(147,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -jm -jm -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -ey -ez -eC -eC -eC -eC -eC -eC -eC -eC -eC -fa -ey -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -Oe -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -dd -dn -di -dG -di -dS -di -hX -di -di -dG -di -ie -ni -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(148,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -KA -PV -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -Rs -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -ab -ab -ab -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -Di -Xa -Xa -Xa -Xa -dd -dn -ds -dG -di -dT -di -dh -di -dh -dG -di -id -ni -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(149,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -jm -jm -jm -jm -jm -jm -jm -RC -RC -RC -RC -RC -pL -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -pL -RC -Di -Xa -Xa -Xa -Xa -de -do -di -dG -di -dh -di -di -di -ib -dG -dw -id -nj -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(150,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -Sd -RC -RC -RC -Sd -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -jm -jm -jm -RC -RC -RC -RC -jm -jm -jm -jm -ab -ab -ab -ab -ab -jm -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -pL -jm -jm -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -RC -jm -jm -lP -US -Xa -Ho -Xa -db -dl -di -dJ -dQ -di -dV -di -dU -dV -dI -dh -ie -ni -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(151,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -pL -RC -RC -RC -jm -jm -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -Oe -jm -ab -ab -US -US -Xa -Xa -da -dk -dw -dG -dI -dG -dG -dG -dG -dG -dG -di -id -ni -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(152,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -pL -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -ab -ab -ab -ab -US -US -qq -bK -di -di -dh -di -di -dW -ds -di -di -di -di -di -nh -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(153,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -US -US -bK -dp -dh -dK -dR -dK -dK -dK -dh -dK -dK -di -dp -nh -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(154,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -KA -PV -PV -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -ab -jm -RC -RC -RC -RC -jm -jm -jm -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -US -df -dq -dq -dM -dM -dM -dZ -dM -dM -dM -dM -dq -dq -nk -US -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(155,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -Oe -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -Sd -RC -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -jm -jm -jm -Oe -oC -jm -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -US -US -US -Xa -Xa -US -US -US -Xa -Xa -Xa -US -US -US -US -TY -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(156,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -jm -jm -jm -jm -jm -jm -jm -RC -Sd -RC -Sd -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -gx -iv -iv -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -US -US -TY -US -ab -US -US -US -TY -US -ab -gx -US -DE -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(157,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -Oe -Oe -yy -Oe -Oe -Oe -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -RC -Sd -RC -jm -jm -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -gx -gx -gx -iv -iv -gx -gx -gx -gx -Oe -Oe -gx -gx -Uu -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -DE -ab -ab -ab -DE -ab -ab -DE -ab -ab -gx -gx -JL -JL -JL -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(158,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -RC -xy -RC -RC -Sd -RC -RC -RC -RC -Sd -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -Ao -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -gx -gx -gx -iv -iv -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -Oe -JL -JL -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(159,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -Oe -PV -PV -PV -PV -PV -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -RC -RC -RC -RC -RC -RC -Sd -RC -RC -RC -RC -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -GN -Oe -Oe -gx -gx -RN -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -JL -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(160,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -PV -PV -PV -PV -PV -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -jm -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -JL -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(161,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -Oe -pE -Oe -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Dl -Dl -Dl -Oe -Ao -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -JL -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(162,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Dl -Oe -Oe -Oe -Dl -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(163,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -KA -PV -PV -Oe -Oe -Oe -Oe -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -GN -Oe -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -vo -Oe -Dl -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -Oe -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(164,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -GN -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -Uu -gx -Dl -Oe -Oe -Oe -Dl -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -JL -JL -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(165,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -xa -PV -Oe -Oe -Oe -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -GN -gx -gx -gx -gx -gx -gx -gx -gx -Lm -Dl -Dl -Ao -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -Oe -JL -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(166,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -Oe -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -Oe -Oe -Oe -PV -PV -PV -KA -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -gx -ab -JL -JL -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(167,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -hL -PV -PV -PV -PV -PV -Oe -Oe -Oe -Oe -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -PV -KA -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -zn -Oe -Oe -gx -Oe -GN -Oe -pE -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -ab -gx -gx -ab -JL -JL -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(168,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -hM -hP -hQ -hP -wI -PV -Oe -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -PV -PV -KA -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -gx -ab -JL -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(169,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -hM -hQ -hR -hQ -RL -Ld -PV -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -GN -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -ab -ab -JL -JL -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(170,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -hM -hP -hQ -hP -Rz -PV -PV -gx -gx -gx -iv -iw -iv -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -pE -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -JL -JL -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(171,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -hL -PV -PV -PV -PV -PV -gx -gx -gx -gx -iv -iv -iv -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -GN -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -Oe -JL -JL -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(172,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -zn -gx -Oe -Oe -GN -gx -gx -gx -gx -gx -gx -gx -Ri -gx -Oe -Oe -GN -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -Oe -JL -JL -JL -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(173,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -JW -Oe -Oe -Oe -Oe -gx -gx -Oe -Oe -Oe -GN -gx -Oe -zn -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -Oe -JL -JL -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(174,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -ab -gx -gx -gx -Oe -gx -Oe -Oe -Oe -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -JL -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(175,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -PV -PV -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -Oe -gx -gx -gx -gx -Oe -GN -Oe -gx -gx -pE -gx -Oe -gx -gx -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -JL -JL -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(176,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -PV -VC -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -Oe -Oe -Oe -gx -Oe -Oe -Oe -Oe -GN -gx -gx -To -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -JL -JL -JL -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(177,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Ao -Oe -GN -Oe -gx -gx -gx -Oe -Oe -pE -Oe -Oe -Oe -Oe -GN -Oe -Oe -gx -Oe -Oe -Oe -Oe -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -JL -JL -JL -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(178,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -pE -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -JL -JL -JL -JL -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(179,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -Oe -gx -gx -gx -gx -Oe -GN -Oe -Oe -TU -gx -ts -TU -gx -gx -gx -Oe -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -JL -JL -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(180,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -Oe -gx -gx -gx -Oe -Oe -gx -gx -gx -tC -tC -tC -Wp -tC -pv -gx -Oe -gx -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(181,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -gx -gx -gx -gx -GN -Oe -gx -gx -gx -gx -Dw -TU -RD -Po -SS -gx -Oe -gx -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -JL -JL -Oe -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(182,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -pE -Oe -gx -gx -gx -Oe -Oe -gx -gx -gx -pv -Dw -tC -xx -tC -TU -gx -Oe -gx -gx -Oe -Oe -GN -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ao -JL -JL -JL -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(183,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -zn -gx -Oe -GN -gx -gx -gx -Oe -Oe -gx -gx -gx -gx -Lj -tC -Dw -tC -WH -gx -Oe -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Oe -Oe -Oe -JL -JL -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(184,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -gx -gx -gx -uz -Oe -gx -gx -gx -gx -gx -zI -tC -TU -vJ -gx -Oe -gx -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -JL -JL -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(185,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -Yc -tC -QT -gx -pE -gx -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -ab -ab -ab -JL -JL -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(186,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -gx -gx -gx -Oe -gx -GN -gx -gx -gx -gx -Dw -tC -tC -Mk -gx -xN -gx -Oe -Oe -gx -Oe -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -Oe -JL -JL -Oe -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(187,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -tC -Po -tC -TU -Nb -gx -gx -gx -UO -gx -gx -GN -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -Oe -Oe -JL -JL -Oe -Oe -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(188,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -GN -Oe -gx -gx -gx -gx -Oe -IU -Oe -Oe -Wp -tC -tC -Wp -xw -gx -gx -gx -Oe -Oe -Oe -gx -Oe -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -JL -JL -ab -Oe -Oe -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(189,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -GN -Oe -gx -Po -Mk -gx -gx -gx -gx -gx -Oe -gx -gx -gx -Oe -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -JL -JL -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(190,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -GN -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -gx -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -gx -gx -JL -JL -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(191,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -pE -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -gx -ab -ab -JL -JL -ab -ab -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(192,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -gx -gx -Nf -Oe -Oe -GO -Oe -pE -Oe -GO -Oe -pE -Oe -Oe -Oe -gx -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -ab -gx -ab -Oe -JL -JL -Oe -Oe -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(193,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -GN -Oe -Oe -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -GN -gx -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -ab -ab -JL -JL -Oe -Oe -Oe -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(194,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -gx -Oe -GN -Oe -Oe -Oe -Oe -gx -Oe -gx -gx -gx -gx -Oe -Oe -gx -gx -gx -pE -Oe -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -gx -gx -ab -ab -gx -gx -gx -gx -gx -Oe -JL -JL -Oe -gx -Oe -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(195,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -zn -Oe -Oe -Oe -Oe -GN -Oe -pE -Oe -Oe -Oe -gx -Oe -Oe -gx -Oe -gx -Oe -Oe -Oe -Oe -Oe -Oe -Ao -gx -gx -Oe -Oe -Oe -GN -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -ab -gx -gx -gx -ab -ab -gx -gx -gx -ab -ab -gx -Oe -JL -JL -Oe -Oe -Oe -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(196,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -gx -gx -gx -gx -gx -Oe -Oe -gx -Oe -GN -gx -Oe -Oe -Oe -gx -gx -gx -Oe -pE -Oe -gx -Oe -Oe -Oe -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -JL -JL -ab -ab -Oe -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(197,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -Oe -Oe -Ao -Oe -gx -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -gx -ab -ab -gx -gx -gx -gx -ii -ii -ab -ab -gx -JL -JL -Oe -ab -ab -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(198,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -gx -Oe -Uu -Oe -Oe -Oe -Oe -gx -gx -Oe -pE -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -Oe -Oe -ab -Oe -JL -JL -Oe -ab -ab -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(199,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -pE -Oe -pu -gx -Oe -vG -gx -gx -Oe -qo -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -ii -Oe -Oe -Oe -JL -JL -JL -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(200,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Nf -gx -Oe -Oe -Oe -gx -GN -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -Oe -Oe -JL -JL -JL -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(201,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -GN -Oe -gx -gx -gx -Oe -Oe -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -ii -ii -uo -JL -JL -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(202,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -gx -GN -gx -Oe -Oe -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ii -ii -ii -ii -ii -JL -Ml -At -Oe -Oe -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(203,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -UZ -Oe -Oe -Oe -gx -gx -gx -gx -gx -Oe -Oe -Ao -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -mM -im -mS -JL -JL -ii -Oe -Oe -Ao -ii -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(204,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -zn -Oe -Oe -Oe -XO -Oe -gx -gx -gx -Oe -FW -ii -ii -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ii -ii -ii -gx -ii -mO -im -ii -ii -ii -mS -ii -ii -ii -ii -ii -ii -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(205,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -GN -gx -Oe -Oe -GN -Oe -Oe -Oe -Oe -ii -iq -ii -gx -ii -ii -ii -ii -gx -ii -ii -ii -ii -gx -gx -ii -lb -im -ii -ii -ii -im -im -kF -iq -ii -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(206,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -GN -Oe -gx -gx -gx -gx -gx -Oe -Oe -ii -ik -ii -ir -ii -ii -ii -kH -im -ii -ii -ii -kH -im -ii -ii -gx -ii -im -im -kF -kH -im -im -im -kF -kF -ii -mM -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(207,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -gx -gx -gx -ys -Oe -Uu -ik -Rp -ip -jK -im -im -ir -ir -ir -ir -im -ir -ir -ir -ir -ii -gx -ii -im -kF -kF -im -im -im -im -im -im -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(208,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -Oe -Oe -gx -gx -Oe -Oe -Oe -ii -ii -ii -jN -im -im -jK -im -im -jK -im -im -im -im -im -ii -ii -ii -im -my -kF -im -im -im -im -im -im -im -im -ii -gx -gx -gx -gx -gx -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(209,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Id -Oe -Oe -Oe -Oe -Oe -Oe -Oe -ik -Rp -ip -im -im -im -im -im -ir -ir -im -im -im -im -im -ii -kO -ii -im -kF -kF -im -im -kJ -im -im -ii -ii -ii -ii -gx -gx -gx -gx -gx -gx -gx -ab -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(210,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Ao -gx -Oe -Oe -GN -Oe -ii -ik -ii -im -jK -im -im -im -ir -im -im -im -kJ -im -im -ii -ii -ii -im -im -kF -im -im -im -im -mI -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(211,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -pE -Oe -Oe -Oe -Oe -GN -ii -im -im -im -im -jK -ir -ir -im -im -im -im -im -ir -im -ii -ii -ii -ii -im -im -im -im -kF -ii -ii -gx -gx -gx -gx -gx -ab -gx -ab -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(212,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -Oe -Oe -Oe -FO -ii -ii -ii -kF -kF -kF -im -im -im -im -im -im -im -im -im -nL -kH -im -nL -im -im -im -im -kF -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(213,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -pE -Oe -gx -gx -ii -ii -kG -ii -ii -ii -ii -kI -im -im -im -ir -im -ii -im -kF -ii -mN -im -im -im -kF -mR -ii -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(214,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -Oe -gx -gx -gx -gx -ii -ii -ii -gx -gx -ii -ii -ir -ir -ir -ii -ii -ii -im -im -ii -ii -ii -ii -ii -ii -ii -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(215,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ir -im -ir -ii -kN -ii -kF -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(216,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -im -ii -ii -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(217,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -kK -kL -kM -ii -gx -ii -im -kF -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(218,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ii -ii -ii -ii -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(219,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -kF -mI -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(220,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(221,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lc -lc -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(222,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -iq -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(223,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -mI -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(224,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -iq -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(225,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(226,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(227,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(228,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -ab -gx -gx -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(229,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -ab -gx -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(230,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(231,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -iq -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(232,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(233,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -iq -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(234,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -jN -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(235,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -lS -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(236,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -lS -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(237,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -lS -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(238,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lT -mK -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(239,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(240,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -mI -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(241,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -mI -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(242,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(243,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(244,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -lS -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(245,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -nn -im -im -nn -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(246,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -no -jN -im -no -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(247,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -nn -jN -im -nn -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(248,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -no -im -lS -no -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(249,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -np -np -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(250,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -nq -nq -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(251,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -nr -nr -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(252,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(253,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -im -im -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(254,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ns -nt -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(255,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ii -ii -ii -ii -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -gx -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm deleted file mode 100644 index 2c536f12c38a..000000000000 --- a/_maps/RandomZLevels/TheBeach.dmm +++ /dev/null @@ -1,15636 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/sandstone, -/area/awaymission/beach) -"ab" = ( -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/misc/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" - }, -/area/awaymission/beach) -"ac" = ( -/turf/open/water/beach, -/area/awaymission/beach) -"ad" = ( -/turf/open/misc/beach/coastline_b{ - dir = 1 - }, -/area/awaymission/beach) -"ae" = ( -/turf/open/misc/beach/coastline_b{ - dir = 8 - }, -/area/awaymission/beach) -"af" = ( -/turf/open/misc/beach/coastline_t{ - dir = 9 - }, -/area/awaymission/beach) -"ag" = ( -/turf/open/misc/beach/coastline_t{ - dir = 1 - }, -/area/awaymission/beach) -"ah" = ( -/turf/open/misc/beach/coastline_t{ - dir = 5 - }, -/area/awaymission/beach) -"ai" = ( -/turf/open/misc/beach/coastline_b{ - dir = 4 - }, -/area/awaymission/beach) -"aj" = ( -/turf/open/misc/beach/coastline_t{ - dir = 8 - }, -/area/awaymission/beach) -"ak" = ( -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"al" = ( -/obj/effect/overlay/palmtree_r{ - desc = "How did you get here?"; - icon_state = "palm2"; - name = "\proper island palm tree" - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"am" = ( -/turf/open/misc/beach/coastline_t{ - dir = 4 - }, -/area/awaymission/beach) -"an" = ( -/obj/effect/overlay/coconut{ - pixel_x = 17; - pixel_y = 7 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"ao" = ( -/turf/open/misc/beach/coastline_t{ - dir = 10 - }, -/area/awaymission/beach) -"ap" = ( -/turf/open/misc/beach/coastline_t, -/area/awaymission/beach) -"aq" = ( -/turf/open/misc/beach/coastline_t{ - dir = 6 - }, -/area/awaymission/beach) -"ar" = ( -/turf/open/misc/beach/coastline_b, -/area/awaymission/beach) -"as" = ( -/obj/structure/flora/rock{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/obj/structure/flora/ausbushes/stalkybush{ - desc = "It can't be smoked."; - name = "sea weed" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/misc/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" - }, -/area/awaymission/beach) -"at" = ( -/obj/structure/flora/rock{ - desc = "A volcanic rock."; - name = "coastal rock" - }, -/turf/open/indestructible/binary{ - density = 1; - desc = "I can't move through this."; - icon = 'icons/misc/beach.dmi'; - icon_state = "water"; - name = "deep ocean water" - }, -/area/awaymission/beach) -"au" = ( -/obj/structure/closet/crate/wooden{ - desc = "Now this is what island exploration is all about."; - name = "Treasure Chest" - }, -/obj/item/clothing/head/pirate, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/suit/pirate, -/obj/item/claymore/cutlass{ - desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; - force = 0; - name = "foam cutlass"; - throwforce = 0 - }, -/obj/item/claymore/cutlass{ - desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; - force = 0; - name = "foam cutlass"; - throwforce = 0 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"av" = ( -/turf/open/water/beach{ - desc = "What's the difference?"; - name = "coastline water" - }, -/area/awaymission/beach) -"aw" = ( -/turf/open/misc/beach/coastline_b{ - dir = 6 - }, -/area/awaymission/beach) -"ax" = ( -/turf/open/misc/beach/coastline_b{ - dir = 10 - }, -/area/awaymission/beach) -"ay" = ( -/turf/open/misc/beach/coastline_t/sandwater_inner{ - dir = 4 - }, -/area/awaymission/beach) -"az" = ( -/turf/open/misc/beach/coastline_t/sandwater_inner{ - dir = 1 - }, -/area/awaymission/beach) -"aA" = ( -/obj/effect/overlay/palmtree_l, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aB" = ( -/mob/living/simple_animal/crab/kreb, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aC" = ( -/obj/item/flashlight/flare/torch, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aD" = ( -/obj/effect/overlay/coconut, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aE" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aF" = ( -/obj/structure/bonfire/prelit, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aG" = ( -/obj/item/clothing/mask/gas/tiki_mask, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aH" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ - pixel_x = -17; - pixel_y = 17 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aI" = ( -/obj/item/melee/skateboard/hoverboard{ - pixel_x = -16; - pixel_y = 1 - }, -/turf/open/water/beach, -/area/awaymission/beach) -"aK" = ( -/mob/living/simple_animal/crab, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aO" = ( -/obj/effect/baseturf_helper/beach/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aQ" = ( -/obj/machinery/gateway/away, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aS" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ - pixel_x = -12; - pixel_y = 14 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"aT" = ( -/turf/open/misc/beach/coastline_t/sandwater_inner{ - dir = 8 - }, -/area/awaymission/beach) -"aX" = ( -/turf/closed/wall/mineral/sandstone, -/area/awaymission/beach) -"aY" = ( -/turf/open/misc/beach/coastline_b{ - dir = 5 - }, -/area/awaymission/beach) -"aZ" = ( -/obj/effect/overlay/palmtree_r, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"ba" = ( -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bb" = ( -/obj/structure/dresser{ - density = 0; - pixel_y = 18 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bc" = ( -/obj/structure/mirror/directional/north, -/turf/open/floor/wood, -/area/awaymission/beach) -"bd" = ( -/turf/open/floor/wood, -/area/awaymission/beach) -"be" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/wood, -/area/awaymission/beach) -"bf" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bg" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 1 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bh" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bi" = ( -/obj/machinery/button/door/directional/east{ - id = "changlinhut2"; - name = "changing room lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bj" = ( -/obj/machinery/button/door/directional/west{ - id = "changlinhut1"; - name = "changing room lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bk" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/glasses/heat, -/turf/open/floor/wood, -/area/awaymission/beach) -"bl" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack1"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bm" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack2"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bn" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack3"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bo" = ( -/turf/open/misc/beach/coastline_t/sandwater_inner, -/area/awaymission/beach) -"bp" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bq" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/telecomms/allinone, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"br" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bs" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut2"; - name = "changing room" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bt" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "changlinhut1"; - name = "changing room" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bu" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bv" = ( -/obj/effect/overlay/palmtree_r, -/obj/effect/overlay/coconut, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bw" = ( -/turf/open/misc/beach/coastline_b{ - dir = 9 - }, -/area/awaymission/beach) -"bx" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"by" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bz" = ( -/obj/effect/turf_decal/sand, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bA" = ( -/obj/structure{ - desc = "Bar and beach south, dorms east."; - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "signpost"; - name = "directions signpost" - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bB" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack1"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bC" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack2"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bD" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack3"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bE" = ( -/obj/effect/overlay/palmtree_l{ - pixel_y = 25 - }, -/obj/effect/overlay/coconut{ - pixel_x = -7; - pixel_y = 7 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bF" = ( -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/sand, -/obj/structure/table/wood, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bG" = ( -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/item/clothing/shoes/sandal, -/obj/structure/closet/crate, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bH" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bI" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "loveshack"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bJ" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack4"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bK" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "theloveshack5"; - name = "Beach Hut" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bL" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bM" = ( -/obj/structure/mirror/directional/east, -/obj/effect/turf_decal/sand, -/obj/structure/sink{ - pixel_y = 32 - }, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bN" = ( -/obj/structure/mirror/directional/west, -/obj/effect/turf_decal/sand, -/obj/structure/sink{ - pixel_y = 32 - }, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bO" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/tequila{ - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bP" = ( -/obj/item/trash/chips{ - pixel_x = -18; - pixel_y = 7 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bQ" = ( -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bR" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/button/door/directional/east{ - id = "toilet1"; - name = "restroom lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bS" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/button/door/directional/west{ - id = "toilet2"; - name = "restroom lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bT" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/machinery/button/door/directional/east{ - id = "loveshack"; - name = "love shack lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bU" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack4"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bV" = ( -/obj/structure/sign/poster/ripped{ - pixel_x = 32 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"bW" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/button/door/directional/east{ - id = "theloveshack5"; - name = "door lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"bX" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet1"; - name = "restroom stall" - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bY" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "toilet2"; - name = "restroom stall" - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron/white, -/area/awaymission/beach) -"bZ" = ( -/obj/structure/dresser{ - density = 0 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"ca" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/wood, -/area/awaymission/beach) -"cb" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment{ - pixel_x = -28 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cc" = ( -/obj/item/trash/can{ - pixel_x = 14; - pixel_y = 7 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cd" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/vending/cola/starkist, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cf" = ( -/obj/effect/turf_decal/sand, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = -32 - }, -/obj/machinery/vending/cigarette/beach, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cg" = ( -/obj/effect/turf_decal/sand, -/obj/machinery/vending/cola/space_up, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"ch" = ( -/obj/effect/overlay/palmtree_l, -/obj/effect/overlay/coconut, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"ci" = ( -/obj/structure/closet/gmcloset, -/turf/open/floor/wood, -/area/awaymission/beach) -"cj" = ( -/obj/structure/closet/secure_closet/bar, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/obj/item/storage/box/drinkingglasses, -/turf/open/floor/wood, -/area/awaymission/beach) -"ck" = ( -/obj/effect/mob_spawn/corpse/human/bartender, -/turf/open/floor/wood, -/area/awaymission/beach) -"cl" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/awaymission/beach) -"cn" = ( -/obj/machinery/vending/boozeomat/all_access{ - desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"co" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/fullupgrade, -/obj/structure/sign/picture_frame{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cp" = ( -/obj/structure/table/wood, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, -/turf/open/floor/wood, -/area/awaymission/beach) -"cq" = ( -/obj/structure/table/wood, -/obj/machinery/microwave, -/turf/open/floor/wood, -/area/awaymission/beach) -"cr" = ( -/obj/structure/closet/secure_closet/freezer/kitchen{ - req_access = list(25) - }, -/obj/item/storage/fancy/egg_box, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/mayonnaise, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/wood, -/area/awaymission/beach) -"cs" = ( -/obj/machinery/processor, -/turf/open/floor/wood, -/area/awaymission/beach) -"ct" = ( -/obj/effect/turf_decal/stripes/white/corner, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cu" = ( -/obj/effect/turf_decal/stripes/white/line, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cv" = ( -/obj/effect/turf_decal/stripes/white/corner{ - dir = 8 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cw" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/obj/item/food/meat/slab/goliath, -/obj/item/food/meat/slab/xeno, -/obj/item/food/meat/slab/spider, -/obj/item/food/meat/slab/killertomato, -/obj/item/food/meat/slab/bear, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/turf/open/floor/wood, -/area/awaymission/beach) -"cx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cy" = ( -/obj/effect/turf_decal/stripes/white/full, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cz" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cA" = ( -/obj/structure/mineral_door/wood{ - name = "bar" - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cC" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ - pixel_x = -11 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cD" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/rag{ - pixel_y = 7 - }, -/obj/item/food/burger/crab{ - pixel_x = -14; - pixel_y = 9 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"cE" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, -/turf/open/floor/wood, -/area/awaymission/beach) -"cF" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime, -/turf/open/floor/wood, -/area/awaymission/beach) -"cG" = ( -/obj/item/toy/beach_ball, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cH" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cI" = ( -/obj/structure/sign/barsign{ - pixel_y = 32 - }, -/obj/effect/turf_decal/sand, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cJ" = ( -/obj/effect/turf_decal/stripes/white/corner, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cL" = ( -/obj/structure/table, -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/glasses/sunglasses, -/obj/item/clothing/head/collectable/petehat{ - pixel_y = 5 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cM" = ( -/obj/structure/table, -/obj/item/food/chips, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cN" = ( -/obj/structure/table, -/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/pwr_game, -/obj/item/reagent_containers/food/drinks/soda_cans/air, -/obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter, -/obj/item/reagent_containers/food/drinks/soda_cans/tonic, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cO" = ( -/obj/structure/chair, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cP" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ - pixel_x = -12; - pixel_y = -7 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ - pixel_x = 13; - pixel_y = -7 - }, -/obj/structure/fluff/beach_umbrella, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cQ" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -12; - pixel_y = -6 - }, -/obj/structure/fluff/beach_umbrella/cap, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cR" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/cola{ - pixel_x = -8; - pixel_y = -4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cS" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ - pixel_x = -9; - pixel_y = -9 - }, -/obj/structure/fluff/beach_umbrella/engine, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cT" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cU" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/cola{ - pixel_x = -8; - pixel_y = -6 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/space_mountain_wind{ - pixel_x = 15 - }, -/obj/structure/fluff/beach_umbrella/science, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cV" = ( -/obj/effect/overlay/coconut{ - pixel_x = -5; - pixel_y = 4 - }, -/turf/open/misc/beach/coastline_t/sandwater_inner, -/area/awaymission/beach) -"cW" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime{ - pixel_x = -12 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cX" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/cola{ - pixel_x = -5; - pixel_y = -5 - }, -/obj/structure/fluff/beach_umbrella/security, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cY" = ( -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -6 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"cZ" = ( -/obj/item/clothing/head/collectable/paper{ - desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves." - }, -/turf/open/water/beach, -/area/awaymission/beach) -"da" = ( -/mob/living/simple_animal/parrot, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"db" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_nanotrasen, -/turf/open/floor/wood, -/area/awaymission/beach) -"dc" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_syndie, -/turf/open/floor/wood, -/area/awaymission/beach) -"dd" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman_red, -/turf/open/floor/wood, -/area/awaymission/beach) -"de" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/suit/jacket/letterman, -/turf/open/floor/wood, -/area/awaymission/beach) -"df" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/clothing/neck/necklace/dope, -/turf/open/floor/wood, -/area/awaymission/beach) -"dg" = ( -/obj/item/clothing/glasses/heat, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"hw" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/ale, -/turf/open/floor/wood, -/area/awaymission/beach) -"iy" = ( -/obj/item/toy/seashell, -/turf/open/misc/beach/coastline_t, -/area/awaymission/beach) -"kK" = ( -/obj/item/toy/seashell{ - pixel_x = 5; - pixel_y = 4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"kS" = ( -/obj/item/toy/seashell{ - pixel_x = -7; - pixel_y = 5 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"lx" = ( -/obj/effect/turf_decal/sand, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"lA" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/maltliquor{ - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"mF" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab{ - pixel_x = 9; - pixel_y = 8 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"mV" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer/light{ - pixel_x = -14; - pixel_y = 15 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"oE" = ( -/obj/structure/table/wood, -/obj/item/food/burger/crab, -/turf/open/floor/wood, -/area/awaymission/beach) -"sG" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/sunglasses, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/floor/wood, -/area/awaymission/beach) -"wr" = ( -/obj/item/toy/seashell{ - pixel_y = -5 - }, -/turf/open/misc/beach/coastline_t, -/area/awaymission/beach) -"wz" = ( -/obj/item/toy/seashell{ - pixel_x = -8; - pixel_y = 9 - }, -/turf/open/misc/beach/coastline_t/sandwater_inner{ - dir = 8 - }, -/area/awaymission/beach) -"xA" = ( -/obj/structure/table/wood, -/obj/item/camera, -/turf/open/floor/wood, -/area/awaymission/beach) -"yp" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 15; - pixel_y = -7 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"zc" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/sake{ - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/awaymission/beach) -"ze" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = -5 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"zZ" = ( -/obj/effect/turf_decal/sand, -/obj/effect/baseturf_helper/beach/water, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"AR" = ( -/obj/item/toy/seashell{ - pixel_x = 8; - pixel_y = 14 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"Bd" = ( -/obj/item/toy/seashell{ - pixel_x = 12; - pixel_y = 5 - }, -/turf/open/misc/beach/coastline_t/sandwater_inner, -/area/awaymission/beach) -"EG" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = -2; - pixel_y = 8 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"He" = ( -/obj/structure/fluff/beach_umbrella/syndi, -/turf/open/misc/beach/coastline_t/sandwater_inner{ - dir = 1 - }, -/area/awaymission/beach) -"Kg" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 12; - pixel_y = 9 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"MD" = ( -/obj/item/toy/seashell, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"MP" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 7; - pixel_y = -5 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"Nr" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"QQ" = ( -/obj/item/reagent_containers/food/drinks/bottle/rum{ - pixel_y = 2 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/beach) -"QU" = ( -/obj/structure/closet/crate/freezer, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/rawcrab, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/gorilla, -/obj/item/food/meat/slab/gorilla, -/obj/item/food/meat/slab/gorilla, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"SR" = ( -/obj/machinery/food_cart, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"Tr" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album, -/turf/open/floor/wood, -/area/awaymission/beach) -"Vx" = ( -/obj/item/reagent_containers/food/drinks/bottle/wine{ - pixel_y = 4 - }, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/beach) -"Ws" = ( -/obj/item/toy/seashell{ - pixel_x = -10; - pixel_y = -4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"Za" = ( -/obj/item/flashlight/flare/torch{ - pixel_x = 10; - pixel_y = -4 - }, -/turf/open/misc/beach/sand, -/area/awaymission/beach) -"ZL" = ( -/obj/machinery/grill, -/turf/open/misc/beach/sand, -/area/awaymission/beach) - -(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 -"} -(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 -"} -(3,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(4,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(5,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(6,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(7,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(8,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(9,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(10,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(11,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(12,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(13,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(14,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(15,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(16,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(17,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(18,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(19,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(20,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(21,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(22,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(23,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(24,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(25,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(26,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(27,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(28,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(29,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(30,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(31,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(32,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(33,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -aw -af -aj -aj -aj -ao -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(34,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -aw -af -ay -kK -ak -kS -aT -ao -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(35,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -aw -af -ay -AR -ak -ak -ak -ak -aT -ao -aY -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(36,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -aw -af -ay -ak -ak -ak -Ws -ak -ak -ak -aT -aj -aj -ao -aY -ae -ae -ae -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 -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(37,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -aw -af -ay -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aT -aj -aj -aj -aj -ao -aY -ae -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(38,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -af -ay -ak -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -aj -ao -aY -ac -ac -ad -af -aj -aj -aj -aj -aj -ao -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(39,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -aA -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -aY -ae -aw -ag -MD -aZ -ak -ak -ak -aT -ao -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(40,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -aA -ak -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -MD -aT -aj -aj -aj -ay -ak -ak -ak -ak -ak -MD -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(41,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -ak -Kg -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aK -ak -cG -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(42,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -Za -aF -EG -ak -ak -ak -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(43,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -aA -ak -ak -aG -ak -aD -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(44,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -yp -aF -aC -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aA -ak -bo -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(45,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -ak -MP -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aD -ak -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(46,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ch -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(47,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -aA -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -aZ -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(48,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aK -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(49,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ak -ak -ak -ak -iy -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(50,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -cA -aX -ba -ba -ak -ak -ak -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(51,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ag -MD -ak -ak -ak -ak -ak -ak -ak -ak -aZ -bf -bp -bx -ak -ak -aX -aX -aX -aX -ak -ba -cd -aX -ci -bd -bd -bd -hw -cH -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(52,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -bg -bq -by -ak -ak -aX -bL -bQ -aX -ak -ba -lx -aX -cj -bd -bd -bd -hw -cH -ba -ak -ak -cP -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(53,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ax -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -bh -br -bz -ak -aA -aX -bM -bR -bX -ba -ba -ba -aX -ck -bd -bd -bd -cC -cH -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(54,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ak -ak -aD -aX -aX -aX -aX -ak -ba -ba -aX -cl -bd -bd -bd -cD -cH -ba -ak -ak -ak -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(55,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ax -ag -ak -ak -ak -ak -bf -bp -bx -ak -ak -ba -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -sG -bd -bd -bd -mF -cH -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(56,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -bg -aQ -by -zZ -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -cf -aX -cn -bd -bd -bd -cE -cH -ba -ak -ak -cQ -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(57,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -bh -br -bz -ak -ak -ak -bA -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -co -bd -bd -bd -cF -cH -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(58,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -ak -ba -ba -aX -cp -bd -bd -bd -oE -cH -ba -ak -ak -cR -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(59,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bN -bS -bY -ba -ba -ba -aX -cq -bd -bd -bd -Tr -cH -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(60,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -aX -bL -bQ -aX -ak -ba -lx -aX -bd -bd -bd -bd -xA -cH -ba -ak -aA -cS -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(61,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -aX -aX -aX -aX -ak -ba -cg -aX -cr -cs -cw -bd -aX -cI -ba -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(62,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -aX -bb -bd -aX -ak -ba -ba -ak -ak -ak -ak -ak -ba -ba -aX -aX -aX -aX -aX -aX -ba -ba -ak -ak -cT -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(63,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -aX -bc -bi -bs -ba -ba -ba -bF -ak -ak -ak -ak -ba -ba -ba -ba -ba -ba -ba -ba -ba -ba -ak -ak -ak -bo -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(64,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ax -ag -ak -ak -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -bG -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(65,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(66,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ad -ag -aE -ak -ak -aA -ak -ak -ak -ak -ak -ak -ba -ba -bG -ak -ak -aZ -ak -ak -ak -ak -ak -ak -SR -ak -ak -ak -ak -Nr -cM -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(67,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ad -ag -ak -aH -dg -ak -aD -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ZL -ak -ak -ak -ak -cL -cN -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(68,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ba -ba -bG -ak -ak -ak -ak -ak -ak -aD -ak -ak -QU -ak -cG -ak -ak -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(69,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ax -ag -aE -ak -ak -ak -aX -aX -aX -aX -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aZ -ak -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(70,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ad -ag -ak -mV -aE -ak -aX -bb -bj -bt -ba -ba -ba -bG -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aD -ak -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(71,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ad -ah -am -He -ak -aS -aX -bc -bd -aX -ak -ba -ba -bH -ak -ak -ak -aA -ak -ak -ak -aA -ak -ak -aA -ak -ak -aK -ak -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(72,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ai -ax -ah -am -az -aX -aX -aX -aX -ak -ba -ba -bG -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(73,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ai -ax -ag -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -ak -ak -ak -ct -cx -cx -cx -cx -cJ -ak -ak -cU -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(74,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ag -aA -ak -ak -ak -ak -ba -ba -bG -ak -ak -ak -ak -ak -MD -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(75,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ba -ba -bH -ak -ak -ak -ak -ak -bv -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ak -bo -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(76,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -aZ -bo -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(77,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -aI -ac -ad -ag -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(78,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ag -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -aK -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(79,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ag -aX -bb -de -lA -aX -ba -ba -aX -bO -db -bZ -aX -ak -ak -ak -ak -cu -cy -cy -cy -cy -cy -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(80,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aw -ag -aX -bd -bd -bd -bB -ba -ba -bI -bd -bd -bd -aX -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -cV -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(81,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -aw -af -ay -aX -be -bl -bd -aX -ba -ba -aX -bd -bT -ca -aX -ak -aZ -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(82,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -aw -af -aj -ay -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -aD -ak -cu -ak -ak -ak -ak -cu -ak -ak -ap -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(83,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ad -af -ay -aA -ak -ak -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -wz -ao -aY -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(84,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -aw -ag -ak -aK -ak -ak -ak -ak -ak -ak -ak -ba -ba -ak -ak -ak -ak -ak -ak -ak -ak -ak -cu -ak -ak -ak -ak -cu -ak -ak -ak -aT -ao -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(85,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -aw -af -ay -ak -ak -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -cv -cz -cz -cz -cz -cz -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(86,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -af -ay -ak -ak -ak -ak -ak -aX -bb -df -QQ -aX -ba -ba -aX -bu -dc -bZ -aX -ak -ak -ak -ak -aZ -ak -ak -ak -ak -ak -ak -ak -cW -ak -ap -ar -ac -ac -ac -cZ -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(87,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -aw -ag -MD -ak -ak -ak -ak -ak -aX -bd -bd -bd -bC -ba -ba -bJ -bd -bd -bd -aX -ak -ak -ak -ak -aD -ak -ak -ak -ak -ak -ak -ak -cO -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(88,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -af -ay -ak -MD -ak -ak -ak -ak -aX -be -bm -bd -aX -ba -ba -aX -bd -bU -ca -aX -ak -ak -ak -ak -ak -ak -ak -ak -aZ -ak -ak -ak -cX -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(89,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cO -ak -wr -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(90,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -ag -aA -aB -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ba -ba -ak -ak -ak -cb -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -cY -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(91,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bv -ak -ba -ba -ak -bP -bV -cc -ak -ak -ak -ak -ak -aA -ak -ak -ak -ak -ak -ak -ak -aK -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(92,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -aO -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(93,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ax -ag -MD -ak -ak -ak -ak -ak -aX -bb -dd -Vx -aX -ba -ba -aX -zc -bk -bZ -aX -ak -ak -ak -ak -ak -ak -aK -ak -ak -ak -ak -ak -ze -bo -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(94,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -aX -bd -bd -bd -bD -ba -ba -bK -bd -bd -bd -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -aA -aD -bo -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(95,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ax -ah -az -ak -ak -ak -ak -aX -be -bn -bd -aX -ba -ba -aX -bd -bW -ca -aX -ak -ak -aA -ak -ak -ak -ak -cG -ak -ak -ak -bo -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(96,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ax -ah -az -aK -ak -ak -aX -aX -aX -aX -aX -ba -ba -aX -aX -aX -aX -aX -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(97,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ax -ag -aA -ak -ak -ak -ak -ak -ak -ak -ak -bE -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(98,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -am -am -am -am -am -am -am -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(99,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ax -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -am -aq -bw -ai -ai -ai -ai -ai -ai -ai -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(100,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ax -ah -az -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -bo -aq -bw -ai -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(101,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ax -ag -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ap -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(102,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ad -ah -az -ak -ak -ak -ak -bo -am -am -az -Bd -aq -ar -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(103,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ax -ah -az -bo -am -am -aq -bw -ax -ah -aq -bw -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(104,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ax -ah -aq -bw -ai -ai -ac -ac -ai -ai -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(105,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ai -ai -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(106,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(107,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(108,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(109,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(110,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(111,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(112,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(113,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(114,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(115,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(116,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(117,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(118,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(119,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(120,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -av -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(121,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -at -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -at -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -as -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(122,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(123,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(124,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(125,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(126,1,1) = {" -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(127,1,1) = {" -aa -aa -ac -ae -ae -ae -ae -ae -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(128,1,1) = {" -aa -aa -ad -af -aj -aj -aj -ao -ar -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(129,1,1) = {" -aa -aa -ad -ag -ak -ak -da -ap -ar -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(130,1,1) = {" -aa -aa -ad -ag -au -an -ak -ap -ar -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(131,1,1) = {" -aa -aa -ad -ag -al -ak -MD -ap -ar -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(132,1,1) = {" -aa -aa -ad -ah -am -am -am -aq -ar -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(133,1,1) = {" -aa -aa -ac -ai -ai -ai -ai -ai -ac -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -"} -(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 -"} -(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 -"} diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm deleted file mode 100644 index 4389308ad6bd..000000000000 --- a/_maps/RandomZLevels/caves.dmm +++ /dev/null @@ -1,68077 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/rock, -/area/space/nearstation) -"ab" = ( -/turf/open/space, -/area/space) -"ac" = ( -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid/level_three) -"ad" = ( -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"ah" = ( -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"ak" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission/caves/bmp_asteroid/level_three) -"ao" = ( -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"ap" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"ar" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"as" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"au" = ( -/obj/structure/destructible/cult/item_dispenser/altar, -/obj/effect/decal/remains/human, -/obj/item/stack/sheet/runed_metal{ - amount = 25 - }, -/obj/item/veilrender/honkrender, -/obj/item/clothing/mask/gas/clown_hat, -/obj/item/organ/heart/demon, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"av" = ( -/obj/structure/trap/stun{ - desc = "A rune inscribed in the floor, the air feeling electrified around it."; - name = "shock rune" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aw" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"ax" = ( -/turf/closed/wall/mineral/cult, -/area/awaymission/caves/bmp_asteroid/level_four) -"ay" = ( -/obj/structure/destructible/cult/item_dispenser/archives, -/obj/item/tome, -/obj/item/stack/sheet/runed_metal{ - amount = 25 - }, -/obj/item/coin/antagtoken, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"az" = ( -/obj/structure/constructshell, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 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 = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aB" = ( -/obj/structure/spawner/skeleton, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aC" = ( -/obj/structure/bed, -/obj/item/bedsheet/cult, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aD" = ( -/obj/item/stack/sheet/runed_metal, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aE" = ( -/obj/structure/destructible/cult/item_dispenser/archives, -/obj/item/stack/sheet/runed_metal{ - amount = 25 - }, -/obj/item/coin/antagtoken, -/obj/item/book/granter/action/spell/summonitem{ - name = "\proper an extremely flamboyant book" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aF" = ( -/obj/structure/barricade/wooden{ - desc = "A forcefield meant to block off areas. Time has aged this forcefield into a weakened state, you could probably smash through it."; - icon = 'icons/effects/effects.dmi'; - icon_state = "m_shield"; - name = "weak forcefield" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aG" = ( -/obj/item/ectoplasm, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aH" = ( -/turf/closed/wall, -/area/awaymission/caves/bmp_asteroid/level_three) -"aI" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"aJ" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/bmp_asteroid/level_three) -"aK" = ( -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"aM" = ( -/obj/structure/ladder/unbreakable{ - height = 1; - id = "minedeep" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"aP" = ( -/obj/structure/ladder/unbreakable{ - height = 1; - id = "dungeon"; - name = "rusty ladder" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aR" = ( -/obj/effect/forcefield/cult, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aS" = ( -/obj/structure/girder/cult, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aV" = ( -/obj/effect/forcefield/cult, -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"aW" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"aX" = ( -/obj/effect/bump_teleporter{ - icon = 'icons/obj/doors/airlocks/station/overlays.dmi'; - icon_state = "unres_w"; - id = "minedeepup"; - id_target = "minedeepdown"; - invisibility = 0; - mouse_opacity = 0; - name = "light of the tunnel" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"aZ" = ( -/obj/structure/trap/fire{ - desc = "An old rune inscribed on the floor, giving off an intense amount of heat."; - name = "flame rune" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"ba" = ( -/obj/structure/destructible/cult/item_dispenser/altar, -/obj/item/book/granter/martial/plasma_fist/nobomb, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bf" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bl" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"bm" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bn" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"bw" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/spawner/skeleton, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bz" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bA" = ( -/obj/structure/destructible/cult/item_dispenser/archives, -/obj/item/necromantic_stone, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bC" = ( -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"bD" = ( -/mob/living/simple_animal/hostile/skeleton, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 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 = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"bF" = ( -/obj/structure/ladder/unbreakable{ - height = 2; - id = "dungeon"; - name = "rusty ladder" - }, -/turf/open/floor/engine/cult{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"bK" = ( -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid/level_two) -"bL" = ( -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid) -"bM" = ( -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid) -"bN" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission/caves/bmp_asteroid/level_two) -"bO" = ( -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"bQ" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/bmp_asteroid/level_two) -"bR" = ( -/turf/closed/wall, -/area/awaymission/caves/bmp_asteroid/level_two) -"bS" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"bT" = ( -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"bU" = ( -/obj/effect/bump_teleporter{ - icon = 'icons/obj/doors/airlocks/station/overlays.dmi'; - icon_state = "unres_w"; - id = "minedeepdown"; - id_target = "minedeepup"; - invisibility = 0; - mouse_opacity = 0; - name = "light of the tunnel" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"bY" = ( -/mob/living/simple_animal/hostile/skeleton, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"ca" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"ce" = ( -/obj/structure/ladder/unbreakable{ - height = 1; - id = "mineintro" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"cf" = ( -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"cg" = ( -/turf/closed/wall, -/area/awaymission/caves/research) -"ch" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/research) -"cl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"cm" = ( -/turf/closed/mineral/random/low_chance, -/area/awaymission/caves/bmp_asteroid/level_two) -"cn" = ( -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cp" = ( -/obj/structure/table, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cr" = ( -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cs" = ( -/obj/item/shard, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"ct" = ( -/obj/item/shard, -/obj/item/stack/rods, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cu" = ( -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cv" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cw" = ( -/obj/item/stack/rods, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cx" = ( -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"cA" = ( -/obj/effect/decal/remains/xeno, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/decal/cleanable/xenoblood, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cC" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs/cable, -/obj/item/restraints/handcuffs/cable, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cD" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cE" = ( -/obj/structure/sign/warning/vacuum{ - name = "\improper LOW AIR AREA"; - pixel_x = 32 - }, -/obj/item/stack/rods, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cF" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cH" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"cK" = ( -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'HOLY SHIT SWAGMAN WHAT ARE YOU DOING'."; - name = "\improper HOLY SHIT SWAGMAN WHAT ARE YOU DOING" - }, -/turf/closed/wall, -/area/awaymission/caves/bmp_asteroid/level_two) -"cN" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/decal/cleanable/xenoblood/xgibs, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cO" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/window/left/directional/east, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cP" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cR" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cS" = ( -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cT" = ( -/obj/structure/window/reinforced, -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cV" = ( -/obj/effect/decal/cleanable/xenoblood/xgibs, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cW" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cX" = ( -/obj/structure/table, -/obj/item/melee/baton/security, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cY" = ( -/obj/structure/glowshroom/single, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"cZ" = ( -/obj/structure/sign/warning/vacuum{ - name = "\improper LOW AIR AREA"; - pixel_x = 32 - }, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"db" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/crap, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"dd" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"df" = ( -/obj/structure/closet/secure_closet/miner{ - name = "weapon equipment" - }, -/obj/item/grenade/syndieminibomb/concussion, -/obj/item/grenade/syndieminibomb/concussion, -/obj/item/grenade/syndieminibomb/concussion, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"dg" = ( -/obj/effect/bump_teleporter{ - icon = 'icons/obj/doors/airlocks/station/overlays.dmi'; - icon_state = "unres_e"; - id = "mineintrodown"; - id_target = "mineintroup"; - invisibility = 0; - mouse_opacity = 0; - name = "light of the tunnel" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"dh" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid/level_two) -"di" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/caves/magma, -/obj/item/pen, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dj" = ( -/obj/structure/ladder/unbreakable{ - height = 2; - id = "minedeep" - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dk" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dl" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid/level_two) -"dm" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid/level_two) -"dn" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"do" = ( -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dp" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dr" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"ds" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dt" = ( -/turf/closed/wall, -/area/awaymission/caves/northblock) -"du" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/northblock) -"dv" = ( -/obj/machinery/suit_storage_unit/mining{ - desc = "An industrial unit made to hold space suits. Age has seemed to rust the sliding door mechanisms, making it difficult to open."; - name = "rusted suit storage unit" - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dw" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"dx" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/cobweb, -/obj/item/sord, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dy" = ( -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dz" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dA" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dB" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dC" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dD" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dF" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dH" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dI" = ( -/obj/machinery/door/airlock{ - name = "Dorm" - }, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"dJ" = ( -/obj/item/stack/rods, -/obj/structure/spider/stickyweb, -/turf/open/floor/plating, -/area/awaymission/caves/northblock) -"dK" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/awaymission/caves/northblock) -"dL" = ( -/obj/item/stack/sheet/iron, -/turf/open/floor/plating, -/area/awaymission/caves/northblock) -"dM" = ( -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"dO" = ( -/mob/living/simple_animal/hostile/retaliate/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"dP" = ( -/obj/item/stack/rods, -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"dQ" = ( -/obj/machinery/door/airlock/mining{ - name = "Dorm Access" - }, -/turf/open/floor/plating, -/area/awaymission/caves/northblock) -"dR" = ( -/turf/open/floor/plating, -/area/awaymission/caves/northblock) -"dT" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"dW" = ( -/turf/closed/wall, -/area/awaymission/caves/bmp_asteroid) -"dX" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/bmp_asteroid) -"dY" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"ea" = ( -/obj/item/stack/sheet/iron, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"ec" = ( -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"ed" = ( -/obj/structure/bed, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"ee" = ( -/obj/structure/girder, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"eg" = ( -/obj/effect/decal/cleanable/robot_debris/old, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eh" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ei" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"ej" = ( -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"ek" = ( -/obj/structure/window{ - dir = 8 - }, -/mob/living/simple_animal/hostile/mining_drone, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"el" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/gun/energy/laser/captain/scattershot, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"em" = ( -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"en" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"eo" = ( -/obj/item/stack/rods, -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"ep" = ( -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"er" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"es" = ( -/obj/structure/window{ - dir = 8 - }, -/obj/structure/window, -/mob/living/simple_animal/hostile/mining_drone, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"et" = ( -/obj/effect/decal/cleanable/shreds, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"ev" = ( -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ew" = ( -/obj/structure/table, -/obj/item/mining_scanner, -/obj/item/mining_scanner, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ex" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/decal/cleanable/cobweb, -/obj/item/survivalcapsule, -/obj/item/extinguisher/mini, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ey" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eA" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/caves/work_notice, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eB" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eC" = ( -/obj/structure/table, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eD" = ( -/obj/structure/closet/secure_closet/miner, -/obj/item/survivalcapsule, -/obj/item/extinguisher/mini, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eE" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eF" = ( -/turf/closed/wall, -/area/awaymission/caves/listeningpost) -"eG" = ( -/turf/closed/wall/rust, -/area/awaymission/caves/listeningpost) -"eH" = ( -/obj/machinery/vending/sustenance, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eI" = ( -/obj/structure/closet/crate/trashcart, -/obj/item/switchblade, -/obj/item/switchblade, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eJ" = ( -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eK" = ( -/obj/structure/table, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/item/gun/energy/recharge/kinetic_accelerator, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eL" = ( -/obj/machinery/vending/sovietsoda, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eN" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eO" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eP" = ( -/obj/structure/table, -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eR" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eT" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"eU" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eV" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eW" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eX" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"eY" = ( -/obj/structure/table, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"fh" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/caves/listeningpost) -"fi" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/awaymission/caves/listeningpost) -"fm" = ( -/turf/open/floor/plating, -/area/awaymission/caves/listeningpost) -"fq" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fx" = ( -/obj/effect/bump_teleporter{ - icon = 'icons/obj/doors/airlocks/station/overlays.dmi'; - icon_state = "unres_e"; - id = "mineintroup"; - id_target = "mineintrodown"; - invisibility = 0; - mouse_opacity = 0; - name = "light of the tunnel" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"fy" = ( -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"fz" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"fA" = ( -/obj/structure/bed{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fB" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fG" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/structure/barricade/wooden, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"fJ" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"fK" = ( -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fL" = ( -/obj/structure/sign/departments/examroom{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fN" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"fQ" = ( -/turf/open/floor/plating/elevatorshaft{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - name = "elevator flooring" - }, -/area/awaymission/caves/bmp_asteroid) -"fT" = ( -/obj/machinery/iv_drip, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"fU" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/plating/elevatorshaft{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - name = "elevator flooring" - }, -/area/awaymission/caves/bmp_asteroid) -"fW" = ( -/obj/structure/girder, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"fY" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ga" = ( -/obj/structure/ladder/unbreakable{ - height = 2; - id = "mineintro" - }, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gb" = ( -/obj/structure/closet/secure_closet/freezer/kitchen, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gc" = ( -/obj/item/stack/rods, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gf" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gg" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/donkpockets, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gh" = ( -/obj/structure/table/reinforced, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gi" = ( -/obj/structure/table/reinforced, -/obj/item/stack/rods, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gj" = ( -/obj/machinery/door/airlock/mining{ - name = "Kitchen" - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gl" = ( -/obj/item/plate, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gm" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"go" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gp" = ( -/obj/structure/table_frame, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gq" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gr" = ( -/obj/structure/table, -/obj/item/kitchen/fork, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gt" = ( -/obj/structure/table_frame, -/obj/item/stack/sheet/iron, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gu" = ( -/obj/item/stack/rods, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gv" = ( -/obj/structure/table_frame, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gw" = ( -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gx" = ( -/obj/structure/table, -/obj/item/kitchen/fork, -/obj/item/plate, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gy" = ( -/obj/item/reagent_containers/food/drinks/drinkingglass, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"gz" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Mess Hall" - }, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"gB" = ( -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gC" = ( -/obj/vehicle/sealed/mecha/working/ripley/mining, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/caves/bmp_asteroid) -"gF" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/glasses/material, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gG" = ( -/obj/structure/mecha_wreckage/durand, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/caves/bmp_asteroid) -"gH" = ( -/obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/drill/diamonddrill, -/obj/item/paper/fluff/awaymissions/caves/mech_notice, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"gI" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gJ" = ( -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gK" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"gL" = ( -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"gM" = ( -/obj/structure/mecha_wreckage/ripley, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/caves/bmp_asteroid) -"gN" = ( -/obj/structure/holohoop, -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gO" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gP" = ( -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gU" = ( -/obj/structure/holohoop{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"gX" = ( -/obj/effect/baseturf_helper/lava, -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid/level_three) -"gY" = ( -/obj/effect/baseturf_helper/lava, -/turf/open/lava/smooth{ - desc = "Looks hot."; - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - luminosity = 5 - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"gZ" = ( -/obj/effect/baseturf_helper/lava, -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid/level_two) -"ha" = ( -/obj/effect/baseturf_helper/lava, -/turf/closed/mineral/volcanic, -/area/awaymission/caves/bmp_asteroid) -"hb" = ( -/obj/effect/baseturf_helper/asteroid/basalt, -/turf/closed/wall, -/area/awaymission/caves/northblock) -"hq" = ( -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"hr" = ( -/obj/structure/spider/stickyweb, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"hw" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"hQ" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"hT" = ( -/obj/structure/flora/rock, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"jH" = ( -/obj/structure/spawner/mining/basilisk, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"jU" = ( -/obj/structure/spawner/mining/basilisk, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"ki" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/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/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"kw" = ( -/obj/structure/sign/warning/xeno_mining{ - pixel_y = -32 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"kE" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"lp" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/obj/item/multitool, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"lE" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"ml" = ( -/mob/living/simple_animal/hostile/asteroid/fugu, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"ms" = ( -/obj/structure/spawner/mining/goliath, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"mX" = ( -/obj/structure/closet/crate/miningcar{ - name = "Mining cart" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"nw" = ( -/obj/machinery/light/small/built/directional/east, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid/level_two) -"nW" = ( -/obj/effect/mine/explosive{ - desc = "Rusted mines planted out by the miners before, probably to keep the cave monsters at bay."; - name = "rusted mine" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"nY" = ( -/obj/item/slimepotion/fireproof, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"oI" = ( -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"pc" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"pC" = ( -/obj/item/mjollnir, -/mob/living/simple_animal/hostile/giant_spider/nurse, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"qD" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"qE" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/awaymission/caves/northblock) -"ra" = ( -/obj/structure/glowshroom/single, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"rl" = ( -/obj/structure/closet/crate/miningcar{ - name = "Mining cart" - }, -/obj/item/stack/sheet/mineral/mythril{ - amount = 12 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"rv" = ( -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"rF" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/awaymission/caves/bmp_asteroid) -"sl" = ( -/obj/structure/spawner/mining/hivelord, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"sw" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"sE" = ( -/obj/item/greentext, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"sI" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"sT" = ( -/obj/structure/spawner/mining/hivelord, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"tz" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"tU" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"uN" = ( -/obj/structure/spider/stickyweb, -/obj/machinery/sleeper{ - dir = 8 - }, -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"vU" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/paper/fluff/awaymissions/caves/shipment_notice, -/obj/item/paper/fluff/awaymissions/caves/safety_notice, -/turf/open/floor/iron, -/area/awaymission/caves/listeningpost) -"vX" = ( -/obj/effect/forcefield/cult, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"wl" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"ww" = ( -/turf/open/misc/asteroid/basalt/airless, -/area/awaymission/caves/bmp_asteroid/level_two) -"wT" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"xs" = ( -/obj/item/bedsheet/patriot, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"yS" = ( -/obj/structure/closet/crate, -/obj/item/paper/fluff/awaymissions/caves/shipment_receipt, -/obj/item/gun/energy/laser/captain/scattershot, -/obj/item/gun/energy/laser/captain/scattershot, -/obj/item/gun/energy/laser, -/obj/item/grenade/syndieminibomb/concussion, -/obj/item/grenade/syndieminibomb/concussion, -/obj/item/grenade/syndieminibomb/concussion, -/obj/item/slimepotion/fireproof, -/obj/item/slimepotion/fireproof, -/obj/item/clothing/glasses/thermal, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"yV" = ( -/obj/structure/flora/rock, -/obj/item/soulstone/anybody, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"zn" = ( -/obj/effect/landmark/awaystart, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"zH" = ( -/obj/structure/flora/rock, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"zN" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"zR" = ( -/obj/effect/decal/cleanable/ash, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"zS" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Aj" = ( -/obj/structure/grille, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"AN" = ( -/obj/structure/trap/stun{ - desc = "A rune inscribed in the floor, the air feeling electrified around it."; - name = "shock rune" - }, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"AZ" = ( -/obj/structure/girder, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Bd" = ( -/obj/structure/trap/fire{ - desc = "An old rune inscribed on the floor, giving off an intense amount of heat."; - name = "flame rune" - }, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"Bo" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Bs" = ( -/obj/effect/landmark/awaystart, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Bz" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"BH" = ( -/obj/structure/spawner/skeleton, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"BK" = ( -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"BL" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"BQ" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Cc" = ( -/obj/item/gun/energy/laser/captain/scattershot, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"CB" = ( -/mob/living/simple_animal/hostile/retaliate/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Ds" = ( -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"DH" = ( -/obj/structure/closet/crate/miningcar{ - name = "Mining cart" - }, -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"DO" = ( -/obj/structure/sign/warning/pods{ - desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A1 TO A2"; - pixel_x = -32 - }, -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Fj" = ( -/obj/item/toy/beach_ball{ - name = "\proper wilson"; - desc = "It's a beachball with a face crudely drawn onto it with some soot." - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"FI" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"FS" = ( -/obj/machinery/light/small/built/directional/north, -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"FV" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Gt" = ( -/obj/machinery/light/small/built/directional/north, -/obj/machinery/suit_storage_unit/mining{ - desc = "An industrial unit made to hold space suits. Age has seemed to rust the sliding door mechanisms, making it difficult to open."; - name = "rusted suit storage unit" - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"HK" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"Ik" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"IN" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"IY" = ( -/obj/structure/spider/cocoon, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"IZ" = ( -/obj/item/clothing/head/collectable/wizard, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"Jp" = ( -/obj/machinery/light/small/built/directional/east, -/obj/structure/sign/warning/pods{ - desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE B1 TO A2"; - pixel_x = 32 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"JD" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"Kh" = ( -/obj/machinery/light/small/built/directional/west, -/turf/open/floor/wood{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/northblock) -"KY" = ( -/obj/structure/table, -/obj/item/paper/crumpled/awaymissions/caves/unsafe_area, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Ls" = ( -/obj/structure/sign/departments/medbay{ - pixel_x = -32 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Ly" = ( -/obj/structure/closet/crate/miningcar{ - name = "Mining cart" - }, -/obj/item/pickaxe/rusted{ - pixel_x = 5 - }, -/obj/item/stack/sheet/mineral/adamantine{ - amount = 15 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Mk" = ( -/obj/machinery/light/small/built/directional/west, -/turf/open/floor/wood, -/area/awaymission/caves/northblock) -"Mq" = ( -/obj/structure/flora/rock, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Mw" = ( -/obj/item/shard, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"MB" = ( -/obj/item/grown/log, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"MC" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"MM" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Np" = ( -/obj/effect/mine/explosive{ - desc = "Rusted mines planted out by the miners before, probably to keep the cave monsters at bay."; - name = "rusted mine" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"NO" = ( -/obj/machinery/light/directional/north, -/obj/structure/filingcabinet, -/obj/item/paper/fluff/awaymissions/caves/omega, -/turf/open/floor/iron{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"NX" = ( -/obj/effect/decal/cleanable/blood/gibs/old, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"OA" = ( -/obj/item/gun/ballistic/automatic/pistol/deagle/gold, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"OE" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/research) -"OJ" = ( -/mob/living/simple_animal/hostile/retaliate/bat{ - desc = "A rare breed of bat which roosts deep in caves."; - name = "Cave Bat" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"OX" = ( -/turf/closed/indestructible/oldshuttle{ - desc = "Go through."; - icon = 'icons/turf/floors.dmi'; - icon_state = "black"; - name = "the other side" - }, -/area/space/nearstation) -"PS" = ( -/obj/machinery/light/small/built/directional/south, -/obj/machinery/suit_storage_unit/mining{ - desc = "An industrial unit made to hold space suits. Age has seemed to rust the sliding door mechanisms, making it difficult to open."; - name = "rusted suit storage unit" - }, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"Rm" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"Rp" = ( -/obj/structure/sign/warning/pods{ - desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A2 TO B1"; - pixel_x = 32 - }, -/obj/machinery/light/small/built/directional/east, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Ry" = ( -/obj/structure/grille, -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"RJ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"SV" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"Tj" = ( -/obj/item/assembly/igniter, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"TT" = ( -/obj/item/ectoplasm, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"Uu" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute, -/obj/item/reagent_containers/blood/o_plus, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"UT" = ( -/obj/effect/decal/remains/human, -/obj/item/clothing/under/misc/patriotsuit, -/turf/open/misc/asteroid/basalt/lava{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_four) -"VK" = ( -/obj/effect/mob_spawn/ghost_role/human/skeleton{ - name = "spooky skeleton remains" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Wj" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"WB" = ( -/obj/structure/table, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/toxin, -/obj/item/reagent_containers/blood/o_plus, -/turf/open/floor/iron, -/area/awaymission/caves/bmp_asteroid) -"WL" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/pods{ - desc = "A warning sign which warns of potential mech traffic to and from different levels of the mine."; - name = "\improper MECH TUNNEL PASSAGE A2 TO A1"; - pixel_x = -32 - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"Xs" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"XG" = ( -/obj/effect/mine/explosive{ - desc = "Rusted mines planted out by the miners before, probably to keep the cave monsters at bay."; - name = "rusted mine" - }, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"XN" = ( -/obj/item/grenade/syndieminibomb/concussion, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_two) -"XR" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"YG" = ( -/obj/item/organ/brain/alien, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"YZ" = ( -/mob/living/simple_animal/hostile/skeleton, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) -"Zj" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid) -"ZS" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid/basalt{ - initial_gas = list("nitrogen" = 23, "oxygen" = 14); - temperature = 2.7; - - }, -/area/awaymission/caves/bmp_asteroid/level_three) - -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -OX -OX -OX -OX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -gX -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -ha -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -fx -fx -dX -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -fy -fy -dW -bL -dW -dW -dW -dW -dW -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dW -fy -fy -dW -bL -dW -fy -fy -fy -dX -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hr -hr -hr -hr -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -fy -fy -dX -bL -dX -fy -ga -fy -dX -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -zH -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hr -hr -hq -Xs -YG -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -hb -dt -dt -du -dL -dK -du -dt -dt -du -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dW -fy -fy -dX -bL -dW -fy -fy -fy -dW -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -hq -zH -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -hq -hr -hq -Bz -hq -hr -hr -hq -hr -hr -hr -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dt -dx -Mk -dI -dM -dP -dI -bn -dA -du -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dW -fy -fy -dW -bL -dW -BK -BK -BK -dW -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -hq -hq -hq -ah -ah -ah -ah -ah -hq -hq -hq -hq -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -Xs -hq -hq -hq -hq -hr -hq -Xs -hq -hq -hr -hr -hr -Bz -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ww -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -du -dy -dy -dJ -dM -dM -dt -dy -dB -du -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -fz -fz -dW -bL -zS -BK -BK -BK -zS -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -aJ -hr -Xs -hr -hq -ac -ac -hr -hq -hq -XR -hr -hr -hq -hr -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ww -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -du -dz -dF -du -dM -dM -dt -dY -dz -dt -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -fy -fy -dW -BK -BK -BK -BK -BK -Mq -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -ah -ah -ah -ah -hq -hq -hq -hq -ac -ac -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -hq -aJ -ac -ac -ac -ac -ac -ac -hq -hr -hr -hr -pC -IZ -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ww -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ww -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -du -du -du -dt -qE -dM -du -du -du -dt -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -DO -BK -BK -DO -Mq -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -ah -ah -ah -ah -hq -zH -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -zH -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -hq -hr -hr -hq -XR -hr -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -BK -BK -Zj -BK -BK -BK -bL -bL -bL -bL -bL -du -dA -bn -dI -dO -dP -dI -pc -el -dt -bL -bL -bL -bL -bL -bL -bL -BK -BK -bM -bM -bM -BK -BK -BK -BK -BK -BK -BK -BK -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -zH -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -hq -Bz -hr -hr -IY -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -BK -BK -BK -zn -BK -BK -BK -bL -bL -bL -bL -bL -du -dB -dy -dK -dP -dM -dR -ea -dy -dt -bL -bL -bL -bL -bL -bL -BK -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -BK -BK -BK -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -IY -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ww -ab -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -BK -Mq -bL -bL -bL -bL -bL -dt -dz -dH -dt -dM -dP -dK -dF -dz -dt -bL -bL -bL -BK -BK -BK -BK -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -hq -hq -ac -ac -ac -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ww -ab -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ww -ab -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -BK -Mq -BK -BK -BK -BK -BK -bL -bL -bL -bL -dt -dt -du -du -dM -hQ -dt -dt -dt -du -bL -bL -BK -BK -bM -bM -bM -bM -bM -bL -dX -dW -dX -dW -dW -dW -dX -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -ak -ak -ak -ac -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -hw -bL -bL -bL -bL -dt -dC -Mk -dI -dM -dT -dI -Kh -em -du -BK -BK -BK -bM -bM -bM -bM -bM -bL -bL -dW -fq -fA -dW -fK -WB -dX -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -zH -ah -ah -ah -ah -ah -ah -ah -hq -hq -zH -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -hw -hw -bL -bL -bL -dt -dy -dy -dt -dQ -dQ -dt -ec -en -ee -BK -bL -bL -bM -bM -bM -bL -bL -bL -bL -dW -FS -fB -dW -fL -ev -dX -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -hq -hq -ah -ah -ah -ah -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ac -ac -ac -ah -ah -ah -ah -ah -hq -zH -hq -hq -hq -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ab -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -hw -bL -bL -bL -dt -dD -dF -dt -dR -dR -dt -ed -eo -ep -zR -bM -bM -bM -bM -bL -bL -bL -bL -bL -dX -tz -kE -fG -fB -fT -dX -bL -bL -Mq -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -hq -hq -hq -hq -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ww -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -du -du -du -dt -dQ -dQ -du -ee -ep -et -BK -bM -bM -bM -bL -bL -bL -bL -bL -bL -dW -MC -ev -dW -Wj -ev -dW -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -BK -cx -cx -cx -BK -BK -zR -BL -bM -bM -bM -bM -BK -BK -BK -bL -bL -bL -dX -Uu -uN -dX -ev -fB -dW -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -zH -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -BK -BK -BK -cx -cx -cx -Mq -BK -bM -bM -bM -BK -BK -Mq -cx -cx -cx -cx -cx -dW -dX -dX -dW -fN -dW -dX -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -BK -BK -BK -BK -BK -zR -BK -bM -bM -bM -BK -BK -BK -BK -cx -cx -cx -cx -cx -cx -BK -fH -ej -fH -BK -bL -bL -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -cg -cg -cg -cg -cg -cg -cg -cg -bL -bL -bM -bM -bM -bM -bM -BK -bM -bM -bM -bM -bM -bM -bM -bL -bL -BK -BK -BK -BK -BK -SV -cx -cx -cx -dW -fN -dX -BK -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -zH -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ah -ah -hq -hq -ac -ac -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -ch -cr -cA -OE -cR -cV -cr -cg -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dW -BK -cx -cx -Ls -BK -BK -BK -BK -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -sE -ac -ac -ac -ac -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ah -ah -hq -hq -hq -ac -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -ch -cs -cB -cN -cS -cW -cB -cg -bL -bL -bL -bL -bL -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -cx -cx -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -Mq -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -ac -ac -ac -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -zH -ac -ac -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -hq -ah -ah -ah -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -cg -cg -ct -cC -cO -cT -cX -db -cg -cg -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -bL -dX -dX -dW -dW -dW -dW -dW -bL -bL -bL -bl -BK -cx -cx -cx -cx -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ac -ac -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ah -ah -ah -ah -ah -hq -ac -ac -ac -hq -hq -hq -hq -hq -ac -ac -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -cg -cn -cu -cD -cu -cn -cY -cn -dd -cg -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -bL -dX -ex -eD -eD -eD -eD -dX -bL -bL -bL -bl -BK -BK -cx -cx -cx -cx -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -bL -bL -bL -bL -cx -ej -BK -bM -bM -BK -BK -ej -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ac -ac -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -hq -ac -ac -ac -hq -ac -ac -hq -hq -ac -ac -ah -ah -ac -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -ch -NO -cv -cv -cn -cn -cn -cn -FI -ch -bL -bL -bL -bL -bM -bM -bL -bL -bL -bL -bL -dW -ey -ev -ev -ev -eR -dX -bL -bL -bL -BK -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -BK -BK -bL -bL -bL -bL -cx -cx -ej -BK -bM -BK -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ac -ak -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -XG -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ah -ah -ah -ah -ah -hq -ac -ac -hq -zH -ac -ac -hq -hq -hq -hq -ah -ah -hq -hq -hq -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -ch -cp -cn -cE -cn -cn -cZ -cn -df -ch -BK -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -dX -Gt -eE -ev -ev -PS -dX -bL -bL -bL -BK -BK -BK -BK -BK -cx -cx -cx -cx -cx -cx -BK -BK -BK -BK -BK -BK -Mq -BK -bL -bL -bL -dW -gN -cx -ej -BK -bM -bM -bM -BK -cx -gU -dW -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -ac -ac -ak -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ah -ah -ah -ah -ah -hq -hq -YZ -hq -ac -ac -ac -hq -hq -hq -hq -ah -ah -hq -hq -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -ch -cg -cw -cg -cP -cP -cg -cF -cg -cg -BK -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -dX -eA -ev -ev -ev -eT -dW -bL -BK -BK -SV -BK -BK -BK -BK -wl -cx -cx -cx -cx -BK -BK -SV -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -cx -gP -cx -ej -BK -BK -BK -ej -cx -cx -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -ac -ac -ak -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ah -ah -ah -ah -ah -hq -hq -hq -ac -ac -ac -hq -YZ -ac -ac -ac -ah -ah -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -BK -BK -BK -Mw -cF -cr -cr -cF -BK -BK -BK -BK -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -dX -ev -ev -ev -ev -ev -eF -eG -eG -eG -eF -BK -BK -BK -BK -dW -cx -cx -BK -BK -BK -BK -dW -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -cx -cx -cx -wl -cx -BK -rF -cx -cx -cx -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -ac -ac -ak -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -hq -ac -ac -ac -ac -ac -hq -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -Mw -BK -BK -ch -cP -cP -ch -BK -BK -BK -bL -bL -bL -bL -bL -BK -BK -bL -dW -dX -dX -dX -eB -dW -eH -eL -ev -eW -eN -eJ -eO -fh -BK -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -Aj -Aj -Aj -dW -cx -cx -dW -Aj -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ac -ac -ak -ak -ak -ak -ak -ak -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -aH -aJ -aI -aJ -aJ -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ah -ah -hq -ac -ac -ac -ac -ac -hq -ac -ac -ah -ah -ah -ah -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -BK -BK -BK -zS -cx -cx -zS -BK -BK -BK -BK -BK -bL -bL -bL -BK -BK -bL -dW -eg -lE -ev -ev -eF -eF -eF -eG -eG -eX -eJ -eJ -fh -BK -BK -BK -BK -BK -cx -cx -BK -Mq -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -Mq -BK -BK -BK -zS -cx -cx -zS -BK -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ac -ac -ac -ak -ak -ak -ak -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -aH -aK -aK -tU -aH -Ik -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ah -ah -hq -hq -ac -ac -ac -hq -hq -ac -ac -ac -ah -ah -ah -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -bL -bL -bL -BK -BK -bL -dX -eh -ej -eg -ev -eF -eI -lp -eU -eG -eY -eJ -eJ -eF -fh -eF -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -BK -BK -BK -jH -BK -BK -cx -cx -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -BK -BK -BK -BK -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -ac -ac -ac -ak -ak -ak -ak -ac -hq -hq -hq -hq -hq -ah -hq -hq -hq -hq -ah -ah -hq -hq -aI -aK -aM -aK -aI -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -hq -ac -ac -ac -hq -hq -hq -ZS -aJ -ac -ah -ah -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -OJ -BK -BK -BK -BK -cx -cx -BK -BK -BK -OJ -BK -BK -bL -bL -bL -BK -BK -bL -dX -ei -er -ej -ev -eG -eJ -eN -eJ -eF -sw -eJ -eJ -fi -fm -fi -cx -cx -cx -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -cx -cx -cx -cx -cx -cx -cx -BK -bL -bL -bL -BK -BK -nW -BK -bM -bM -bM -bM -BK -BK -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -hq -zH -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -aJ -IN -aK -aK -aJ -hq -hq -hq -hq -hq -XG -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -hq -ac -ac -ac -yV -HK -ac -ZS -ZS -aJ -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -BK -BK -BK -cx -cx -cx -BK -BK -BK -BK -BK -BK -BK -bL -bL -BK -BK -bL -dX -ej -ej -ev -ev -eG -eJ -eO -eJ -eF -vU -eJ -eJ -eF -fh -eF -BK -BK -BK -cx -cx -cx -cx -cx -cx -cx -cx -BK -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -ZS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -ah -ah -hq -hq -hq -hq -hq -aH -aJ -aI -aH -aH -hq -hq -hq -ah -ah -ah -hq -hq -hq -zH -hq -hq -hq -hq -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -ac -ac -ak -ak -ac -ac -aJ -ZS -aJ -aJ -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -BK -BK -bL -dW -ek -es -ew -eC -eF -eJ -eJ -eJ -eJ -eJ -eJ -eN -fh -BK -BK -BK -BK -BK -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -cx -BK -bl -bl -rl -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ZS -ZS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ak -ak -ac -ac -aJ -bC -bC -aJ -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -BK -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -BK -BK -BK -dW -dW -dX -dX -dW -eF -eK -eP -eV -eF -eJ -eJ -eJ -fh -BK -BK -BK -SV -BK -cx -cx -BK -SV -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ZS -ZS -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -hq -ak -ak -ak -ak -ac -ac -aJ -bD -bF -aJ -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -BK -OJ -BK -BK -BK -cx -cx -cx -BK -BK -BK -BK -BK -BK -BK -bL -bL -BK -BK -BK -BK -BK -BK -BK -BK -bL -eF -eF -eF -eG -eG -eF -eF -eF -eG -BK -BK -BK -dW -Aj -cx -cx -fJ -dW -BK -BK -BK -cx -cx -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -zH -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -hq -hq -hq -hq -ak -ak -ak -ac -ac -ac -aJ -aJ -aJ -aJ -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -BK -BK -Mq -BK -cx -cx -BK -BK -OJ -BK -BK -BK -BK -BK -bL -bL -BK -BK -bM -bM -bM -bM -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -BK -zS -BK -Mq -BK -fJ -fQ -fQ -fQ -fQ -fJ -BK -BK -BK -cx -cx -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -hq -hq -hq -hq -hq -hq -hq -hq -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -BK -BK -BK -BK -cx -cx -BK -BK -BK -BK -BK -BK -BK -BK -bL -BK -BK -BK -bM -bM -bM -bM -bM -bM -BK -BK -BK -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -fJ -fQ -fQ -fQ -fQ -fJ -BK -BK -BK -BK -cx -cx -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -zH -hq -hq -hq -hq -hq -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -XG -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ac -ak -ak -ak -hq -hq -hq -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -BK -BK -BK -BK -cx -cx -BK -BK -BK -Mq -BK -bL -bL -bL -bL -BK -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -BK -BK -bL -bL -bL -bL -BK -BK -BK -BK -BK -fJ -fQ -fU -fQ -fQ -fJ -BK -BK -BK -BK -cx -cx -cx -cx -BK -bL -bL -bL -bL -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ac -ak -ak -ak -hq -hq -hq -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -BK -BK -BK -cx -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -dW -BK -BK -BK -Mq -BK -BK -fJ -fQ -fQ -fQ -fQ -fJ -BK -BK -BK -bL -dW -qD -cx -cx -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -hq -hq -hq -ah -ah -ah -ah -ah -hq -hq -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ak -ak -ac -hq -hq -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bL -bL -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -zS -BK -BK -BK -BK -BK -MM -dW -fJ -fJ -fJ -fJ -dW -qD -BK -BK -bL -bL -BK -BK -cx -cx -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -zH -hq -hq -hq -ak -ak -hq -hq -ac -ac -ac -ak -ak -ak -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bL -bL -bL -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bl -bl -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -BK -cx -cx -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -hq -ah -ah -ah -hq -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ak -ak -hq -ms -ac -ac -ac -ac -ac -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bL -bL -bL -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -cx -cx -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -ah -ah -hq -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ak -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ak -ak -ak -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bL -bL -bL -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -dX -dW -dW -dX -dX -dX -dW -dX -dW -dW -cx -cx -BK -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ak -ak -ak -ak -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bL -bL -bL -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -dX -fY -gb -dX -gl -ev -ev -fN -ej -gz -cx -cx -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ak -ak -ak -ak -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -ca -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -fW -fy -ev -gf -gm -ev -ev -fN -ej -gz -cx -cx -BK -bL -bL -bL -bM -bM -bL -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -hq -hq -hq -ah -ah -ah -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -ca -BK -BK -BK -BK -Mq -BK -bL -bL -bL -bL -bL -bL -bL -BK -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -ca -BK -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -fy -gc -gg -fy -ev -gm -dW -dX -dW -zN -cx -BK -BK -bM -bM -bM -bL -bL -bL -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -zH -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ac -ak -ak -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -ca -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -BK -BK -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -fy -gh -bM -go -gq -gw -fH -BK -BK -cx -cx -BK -bM -bM -bM -bM -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -hq -hq -hq -ah -ah -ah -ac -ac -ah -ah -ah -ah -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -BK -BK -BK -BK -Mq -BK -BK -bL -bL -bL -bL -bL -ca -ca -ca -ca -ca -bL -bM -bM -bM -bM -bL -BK -BK -BK -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -gp -gt -gx -fH -BK -BK -cx -cx -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -hq -hq -hq -hq -hq -hq -ac -ac -ah -ah -ah -ah -hq -zH -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -BK -BK -BK -BK -bL -bL -bL -bL -bL -bM -bM -bM -bM -fy -fy -gi -fy -fy -gq -gy -fH -Mq -BK -BK -cx -cx -cx -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -ah -ah -ah -hq -hq -hq -hq -ac -ac -ac -ah -ah -ah -ah -hq -hq -ac -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -hq -hq -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -Mq -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -fy -dW -fy -gq -gu -gq -dX -bL -bL -bL -bL -bL -BK -bM -bM -BK -fN -fH -bM -bM -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -hq -hq -hq -ah -ah -ac -ac -ac -ac -ac -ah -ah -ah -ah -ah -ah -hq -hq -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -zH -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -ac -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -Mq -BK -BK -mX -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -fy -gj -ev -gr -gv -gt -dW -bL -bL -bL -bL -bL -BK -BK -fH -ej -ej -fH -bM -bM -bM -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -hq -ah -ah -ac -ac -ac -ac -ac -ah -ah -ah -hq -hq -hq -hq -hq -ak -ak -ak -ak -ak -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -hq -hq -hq -hq -hq -Jp -ak -ac -ac -ac -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -fy -fW -ev -gq -gm -gq -dW -bL -bL -bL -bL -dW -gK -dW -dX -fN -fN -dX -bM -bM -bM -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -hq -ah -ah -ah -ah -ac -ac -ac -ah -ah -ah -hq -hq -hq -hq -ac -ac -ak -ak -ak -ak -ak -ak -ac -ac -ac -ak -ak -ak -ak -ac -ac -ac -ah -ah -ah -hq -hq -Jp -hq -hq -aJ -ak -ac -ac -ac -ak -ak -ak -hq -hq -hq -hq -hq -hq -hq -hq -ah -ah -ah -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -dW -dX -dW -dW -dX -dX -bL -BK -dW -dX -dW -gL -ej -ej -BK -ej -dX -bM -bM -bM -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ak -ak -ak -ak -ak -ak -ak -ak -ak -ac -ac -ac -ah -ah -ah -hq -hq -aJ -hq -aK -aJ -ak -ac -ac -ac -ak -ak -ak -ak -ak -ak -ac -ac -ac -hq -hq -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -BK -BK -fy -gF -gH -ej -ej -BK -BK -BK -AZ -bM -bM -BK -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ac -ac -ac -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -hq -hq -aJ -aW -aW -aJ -ac -ac -ac -ac -ac -ac -ak -ak -ak -ak -ac -ac -hq -hq -hq -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -fy -gI -fy -sT -BL -BL -bM -bM -bM -bM -BK -Mq -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ac -ac -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ac -ac -ac -ac -ac -ac -ac -ah -ah -ah -hq -JD -aJ -aK -aK -aH -ac -ac -ac -ac -ac -ac -ak -ak -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -sT -fy -fy -fy -BK -BK -BK -bM -bM -bM -bM -BK -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -zH -hq -hq -hq -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ac -ah -ah -ah -ah -hq -hq -hq -hq -aJ -aK -aK -aH -ac -ac -ac -ac -ac -ac -ak -ak -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -fW -gB -fy -gB -gJ -fy -fy -bM -BL -BK -BK -bM -BK -BK -BK -BK -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -ak -aH -aK -aK -aJ -ac -ac -ac -ac -ac -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dX -gC -sI -gG -gJ -gB -fy -bM -BK -BL -ej -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -ak -ak -ak -aH -aK -aK -aH -ac -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -ah -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -dW -dW -dW -dX -gJ -gM -gJ -gO -dX -gK -dW -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ak -ak -ak -aJ -aK -aK -aH -ac -ac -ac -ac -ac -ac -ah -ah -ah -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -dX -dX -dX -dW -dW -dX -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(70,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -hq -hq -ac -ac -ac -ac -ak -ak -ak -aJ -aK -aK -aJ -ac -ac -ac -ac -ac -ac -hq -hq -hq -hq -hq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bM -bM -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -BK -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(71,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -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 -aK -aK -aJ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bM -bM -bM -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -BK -BK -Mq -BK -BK -BK -BK -BK -BK -BK -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -aa -aa -aa -aa -aa -aa -aa -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -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 -aX -aX -aJ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -bL -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 -OX -OX -OX -OX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(81,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(82,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(83,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(84,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(85,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(86,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(87,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(88,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(89,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(90,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(91,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(92,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(93,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(94,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(95,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(96,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(97,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(98,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(99,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(100,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(101,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(102,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(103,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(104,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(105,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(106,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(107,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(108,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(109,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(110,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(111,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(112,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(113,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(114,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(115,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(116,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(117,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(118,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(119,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(120,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(121,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(122,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(123,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(124,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(125,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(126,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(127,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(128,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(129,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(130,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(131,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(132,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(133,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(134,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(135,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(136,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(137,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(138,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(139,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(140,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(141,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(142,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(143,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(144,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(145,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(146,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(147,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(148,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(149,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(150,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(151,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(152,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(153,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(154,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(155,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(156,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(157,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(158,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(159,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(160,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(161,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(162,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(163,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(164,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(165,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(166,1,1) = {" -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(167,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(169,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(171,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(173,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(174,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -gY -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(175,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -rv -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -rv -rv -ad -rv -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -OA -xs -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -UT -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -OX -OX -OX -OX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -gZ -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bQ -dg -dg -bR -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bR -bT -bT -bR -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bR -bR -bR -bR -bR -bK -bK -bK -bK -bK -bQ -bT -bT -bR -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bR -bT -bT -bT -bQ -bK -bK -bK -bK -bK -bQ -bT -bT -bQ -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bQ -bT -ce -bT -bQ -bK -bK -bK -bK -bK -bQ -bT -bT -bQ -bN -bN -bN -bK -bN -bN -bN -bN -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -oI -bR -bT -bT -bT -bR -bK -bK -bK -bK -bK -bR -bS -bS -bQ -bN -bN -bN -bN -bN -bN -bN -bN -bN -bN -bK -bK -bK -bK -oI -oI -oI -sl -oI -oI -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ao -rv -rv -ao -ao -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -oI -bR -oI -cf -kw -bR -oI -bK -bK -bK -bK -bR -bT -bT -bR -oI -oI -oI -oI -oI -oI -bN -bN -bN -bN -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -oI -oI -oI -Fj -oI -MB -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(201,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ao -ao -rv -rv -Rm -rv -rv -ao -ao -ao -aw -ao -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -oI -RJ -oI -cf -cf -RJ -oI -oI -bK -bK -bK -WL -oI -oI -WL -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -oI -bK -bK -bK -bK -oI -bK -bK -bK -bK -bK -oI -oI -ra -oI -BQ -MB -MB -oI -oI -oI -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ao -rv -rv -rv -rv -rv -rv -BH -rv -rv -rv -rv -rv -ao -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -oI -oI -oI -cf -cf -cf -cf -cf -oI -bK -bK -oI -oI -oI -oI -oI -bO -bO -bO -bO -oI -oI -oI -hT -oI -oI -oI -bK -bK -oI -oI -bK -bK -bK -bK -oI -bK -bK -bK -bK -oI -oI -oI -oI -Ds -Bs -oI -Tj -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ao -ao -ao -rv -ax -ad -ad -ad -rv -Rm -rv -Rm -rv -rv -ad -ad -rv -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -KY -DH -cf -cf -cf -cf -cf -cf -bK -bK -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -Np -oI -oI -oI -bK -bK -bK -oI -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -vX -vX -vX -vX -vX -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -rv -rv -ao -Rm -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -Bo -oI -oI -oI -oI -cf -cf -bK -bK -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -Np -oI -oI -oI -oI -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -rv -vX -Rm -Rm -BH -Rm -rv -vX -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -ad -rv -rv -rv -rv -ad -ad -rv -rv -rv -rv -rv -rv -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -rv -ao -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -bK -bQ -cl -cl -bR -cH -cH -bQ -bK -oI -hT -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(206,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -vX -Rm -ao -ao -ap -ao -Rm -rv -vX -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ax -ax -ax -ax -ax -ax -ax -ax -ax -ax -ax -aV -aV -ax -aA -ao -ax -ax -rv -rv -rv -ax -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -bK -bQ -bO -bO -cl -bT -bT -cl -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bO -bO -bO -bO -bK -bK -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -vX -Rm -ao -ar -as -ar -ao -Rm -vX -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ad -ad -ad -ao -ao -ao -ao -ao -ao -ao -ao -ao -ao -ao -ao -ao -ad -ad -ad -ao -ao -ao -aB -ax -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -bK -bQ -cl -cl -bQ -cH -cH -bR -oI -bO -bO -bO -bO -bO -bO -oI -oI -bK -oI -oI -oI -oI -oI -oI -oI -oI -bO -bO -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -vX -Rm -ap -as -au -as -ap -Rm -vX -ad -ad -ad -ad -ad -ad -ad -ad -ao -ad -ao -ad -ad -ad -ad -ad -ao -ao -ao -ap -ad -ad -ad -ao -ao -ap -ao -ad -ad -ao -ao -ao -ap -ao -ax -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -bO -bO -bO -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -Np -oI -oI -bO -bO -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -cm -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(209,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -vX -Rm -ao -ar -as -ar -ao -Rm -vX -ad -ad -ad -ad -ad -ad -ad -ad -ao -ad -ad -ao -ad -ad -ad -ad -ao -ao -ad -ad -ao -ao -ad -ad -ao -ao -ao -ad -ad -ao -ao -ao -ao -aR -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -rv -Rm -BH -Rm -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ww -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -hT -oI -oI -oI -oI -oI -oI -oI -oI -oI -bO -bO -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -vX -Rm -ao -ao -ap -ao -Rm -rv -vX -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ax -ax -ax -ax -ax -ax -ax -aV -aV -ax -aR -ao -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ww -ab -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -bT -bT -bT -bT -bT -bT -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -CB -oI -oI -oI -bO -bO -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(211,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -rv -vX -Rm -ao -ao -Rm -rv -vX -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ao -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ax -ao -ao -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -ao -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -oI -oI -oI -bK -bK -bK -oI -oI -oI -bK -bK -bK -bK -bK -oI -oI -bO -bO -bK -bO -bO -bO -bO -bO -bK -bK -bK -bK -bN -bN -bK -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(212,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -vX -vX -ao -vX -vX -rv -ad -ad -ad -ad -ax -ax -ax -ax -ax -ao -ao -ao -ad -ad -rv -rv -rv -TT -rv -ad -rv -ad -ad -rv -ax -aR -aR -aR -ax -ad -rv -ax -ao -ao -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -Rm -rv -rv -ad -ao -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -bK -oI -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -bN -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bN -bN -bK -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(213,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -TT -rv -ao -rv -rv -ad -ad -ad -ad -ad -ax -ay -ao -aD -ax -ao -ao -ao -ad -ad -rv -rv -rv -rv -ax -aR -aR -aR -ax -rv -ax -ao -ao -ao -ax -ad -rv -ax -ao -av -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aR -ao -ao -ao -ao -rv -ao -ao -ao -ao -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ww -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -oI -oI -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bN -bK -bK -bK -bK -bK -bK -bK -bK -oI -hT -bO -bO -bT -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -cm -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(214,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -rv -wT -av -wT -rv -ad -ad -ad -ad -ad -ax -az -ao -ao -ax -ao -ao -ao -rv -rv -rv -rv -rv -rv -ax -ao -ao -ao -ax -rv -ax -ao -ao -ao -ad -ad -rv -ax -ao -ao -ao -ax -rv -rv -rv -rv -ad -ad -rv -rv -rv -aR -aR -aR -aR -ad -ad -ad -ax -ax -ao -ax -ad -ad -rv -rv -rv -ao -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ww -ww -ww -ww -ww -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bK -bK -bK -Np -oI -bO -bO -bO -bO -bO -oI -oI -oI -bR -dl -bR -bQ -bQ -bR -bK -bK -bK -bK -bK -oI -oI -bO -bO -bT -bO -bO -bO -bO -bK -bK -bK -bK -bK -bN -bK -bK -bK -bK -cm -cm -cm -cm -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(215,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -rv -rv -aw -rv -rv -ad -ad -ad -ad -ad -ax -ao -ao -av -aF -ao -ao -ao -rv -rv -rv -TT -rv -rv -ax -ao -ao -ao -ax -rv -ax -ao -ao -aR -ax -rv -rv -ax -ao -ao -ao -ax -rv -rv -rv -ad -ad -ad -rv -rv -ax -ao -ao -ao -ao -aR -aR -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ao -ao -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bN -bN -oI -oI -oI -bO -bO -bO -bO -bO -oI -oI -oI -dh -dm -dh -do -dv -bR -bK -bK -bK -bK -bK -oI -oI -bO -bO -bT -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bN -bN -bN -bK -cm -cm -cm -cm -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(216,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -wT -rv -rv -ao -rv -rv -rv -wT -ad -ad -ad -ax -ao -av -ao -ax -ao -ao -ao -rv -rv -rv -rv -rv -rv -ax -ao -ao -aG -ax -rv -ax -ao -ao -ao -ax -rv -rv -ax -ao -aG -ao -ax -rv -rv -ad -ad -ad -ad -rv -aR -ao -ao -bf -ao -ao -ao -ao -aR -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bN -bN -oI -bO -bO -bO -bO -bO -bO -bO -oI -oI -bQ -bR -dl -bR -dr -do -bR -bK -bK -bK -oI -oI -oI -oI -bO -bO -bT -bO -oI -cm -cm -cm -cm -cm -bK -bK -bK -bK -bN -bN -bK -bK -bK -cm -cm -bK -bK -bK -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(217,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -rv -rv -ao -ao -rv -rv -rv -rv -rv -rv -ax -aA -ax -ax -ax -ao -ao -ao -rv -rv -rv -ax -ax -ax -ax -ao -ax -ao -ax -ax -ax -ao -ap -ao -ax -ax -ax -ax -ao -ao -aR -ax -ax -ax -ad -ad -ax -ax -aR -ao -ao -bf -ap -bf -ao -ao -ao -ao -ax -rv -ad -ad -ad -ad -ad -ad -ad -aR -ao -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ww -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -oI -oI -bO -bO -bO -bO -bO -bO -oI -oI -Bo -bR -di -dn -do -do -dr -bQ -bK -bK -bK -oI -Np -bO -bO -bO -bO -bT -bO -oI -cm -cm -cm -cm -cm -bK -bK -bK -bK -bN -bN -bK -bK -bK -bK -bK -bK -bN -bN -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(218,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -rv -rv -ao -ao -ao -rv -rv -rv -rv -rv -ao -ao -ao -ao -ao -ao -ao -ao -rv -rv -rv -ax -ao -ao -ax -ao -ao -av -ad -ad -ad -ad -ao -ao -ao -ao -ao -ad -ad -ao -ao -ao -vX -ad -ad -vX -ao -ao -ao -ao -bf -ao -ao -ao -aw -ao -bz -ao -aR -Rm -rv -ad -ad -ad -ad -ad -ad -ax -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ab -ab -ab -ww -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -Bo -bQ -dj -do -do -do -do -bR -bK -bK -cm -oI -oI -bO -bO -bO -oI -oI -oI -oI -cm -cm -cm -cm -cm -bK -bK -cm -cm -bK -bN -bN -bK -bK -bK -bK -bK -bN -bN -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(219,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ao -ao -rv -ao -ao -ao -ao -aB -av -ao -ao -ao -ap -ao -rv -rv -rv -ax -aP -aw -aF -ao -ap -ao -ad -ad -ao -ao -ao -ao -ao -ao -ao -ao -ao -ap -ao -vX -ad -ad -ad -ad -vX -ao -ao -bf -ap -ao -bm -ao -bf -bw -bA -bE -aR -rv -rv -ad -ad -ad -ad -ad -ax -ao -ao -Rm -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ww -ww -ww -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -Np -oI -cm -bQ -dk -dp -nw -ds -dw -bR -bK -bK -cm -oI -oI -bO -bO -bO -oI -oI -bK -cm -cm -cm -cm -cm -bK -bK -bK -cm -cm -bK -bN -bN -bN -bN -bN -bN -bN -bN -bN -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(220,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ao -ao -ao -rv -rv -ao -ao -ao -ao -ao -ao -aG -ao -rv -rv -rv -ax -ao -ao -ax -ao -ao -ao -ao -ao -ao -ao -av -ad -ad -ad -ao -ao -ao -ao -ao -ao -vX -ad -ad -vX -ao -ao -ao -ao -bf -ao -ao -ao -ao -ao -bz -ao -aR -rv -rv -ad -ad -ad -ad -ad -ax -ao -ao -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -cm -bR -bR -bR -bR -bQ -bQ -bQ -cm -cm -cm -oI -oI -bO -bO -bO -oI -oI -bK -cm -cm -cm -cm -cm -bK -oI -oI -oI -oI -cm -bK -bK -bN -bN -bN -bN -bN -bK -bK -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(221,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ao -rv -rv -rv -ax -ax -ax -ax -ax -ao -ao -ao -rv -rv -rv -ax -ax -ax -ax -ao -ax -ao -ax -ax -ax -ao -ap -ao -ax -ax -ax -ax -aR -ao -ao -ax -ax -ad -ad -rv -ax -ax -aR -aR -ao -bf -ap -bf -ao -ao -ao -ao -ax -rv -rv -ad -ad -ad -ad -ax -aw -aB -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -bO -bO -oI -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -oI -oI -bO -bO -bO -oI -bK -bK -cm -cm -cm -cm -cm -bK -oI -oI -oI -oI -cm -bK -bK -bK -bK -bN -bN -bN -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(222,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ax -ao -ao -ao -ax -ao -ao -ao -ad -rv -rv -rv -rv -rv -ax -aR -ao -ao -ax -rv -ax -ao -ao -ao -ax -rv -rv -ax -ao -ao -ao -ax -rv -ad -ad -rv -rv -rv -ad -ad -aR -ao -bf -ao -ao -ao -ao -aR -rv -rv -ad -ad -ad -ad -ad -ax -ao -Rm -rv -AN -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -oI -oI -oI -cm -cm -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -cm -bK -Np -oI -bO -bO -bO -oI -cm -cm -cm -cm -cm -bK -bK -bK -oI -oI -ra -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(223,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -ao -ao -aF -ao -ao -ao -ad -rv -rv -rv -rv -rv -ax -ao -ao -ao -ax -rv -ax -ao -ao -aR -ax -rv -rv -ax -ao -ao -ao -ax -rv -ad -ad -ad -rv -rv -ad -ad -aR -ao -ao -ao -ao -ao -aR -rv -rv -rv -ad -ad -ad -ad -ad -aR -ao -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -cm -cm -oI -oI -oI -oI -oI -bO -bO -bO -oI -cm -cm -cm -cm -cm -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(224,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ao -ao -ao -ax -ao -ao -ao -rv -rv -rv -rv -rv -rv -ax -ao -ao -ao -ax -rv -ax -ao -ao -ao -ax -ad -ad -ax -ao -ao -ao -ax -rv -rv -ad -ad -rv -ad -ad -ad -rv -ax -ao -ao -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -ax -ao -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -bO -oI -cm -cm -bK -bR -bR -bK -bK -bK -bK -bK -bK -bK -bK -oI -bO -bO -bO -bO -bO -oI -oI -oI -cm -cm -cm -cm -bK -bK -bK -oI -oI -hT -oI -oI -oI -oI -Ry -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(225,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -aC -ao -aE -ax -ao -ao -ao -rv -rv -rv -rv -rv -rv -ax -aR -aR -ao -ax -rv -ax -ao -ao -ao -ax -ad -ad -ax -ao -ao -ao -ax -rv -rv -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ao -ao -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -bO -bO -bO -bO -oI -oI -cm -cm -bR -oI -oI -cK -bK -bK -bN -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -oI -oI -oI -cm -cm -cm -cm -bK -bK -oI -oI -VK -FV -bK -bK -oI -oI -Ry -oI -oI -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(226,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ax -ax -ax -ax -ax -ao -ao -ao -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ax -ao -aR -aR -ax -ad -rv -ax -aw -ao -aR -ax -rv -rv -rv -ad -ad -ad -ad -vX -wT -rv -rv -rv -vX -vX -rv -rv -rv -ad -ad -ad -ad -ax -ax -ao -ao -Rm -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -oI -oI -bO -oI -oI -oI -bK -bK -bK -bR -oI -oI -bR -bK -bK -bK -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -bK -cm -cm -cm -bK -bK -bK -oI -FV -oI -oI -bK -bK -oI -Ry -oI -oI -oI -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(227,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ao -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -rv -ax -ao -aw -ao -ax -rv -rv -rv -ad -ad -ad -ad -ad -ad -vX -ao -vX -ad -ad -ad -ad -ad -ad -ad -ax -vX -rv -ao -ao -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -oI -bK -bK -bK -bK -bR -oI -oI -oI -oI -bR -bN -bN -oI -oI -bO -bO -bO -bO -oI -oI -oI -oI -oI -bK -cm -cm -bK -bK -bK -bK -bK -oI -oI -bK -bK -bK -bK -bK -Ry -oI -oI -oI -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(228,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ad -rv -rv -rv -rv -rv -ax -aS -ao -aS -ax -ax -ax -ax -ax -ax -ax -ad -ad -ax -ao -av -ao -ax -rv -rv -ad -ad -ad -ad -ad -ad -rv -ao -rv -ax -ad -ad -ad -ad -ad -ad -ad -ao -ao -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -oI -bK -bK -bK -bK -bR -oI -Ds -oI -oI -bR -bN -bN -oI -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(229,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ao -ao -ad -ad -ao -ao -ao -ao -ao -ao -ao -ao -ao -ao -aG -ao -ao -ad -ad -ad -ao -ao -ao -ax -rv -rv -ad -ad -ad -ad -ad -ad -rv -ao -rv -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -oI -oI -oI -bK -bK -bK -cK -oI -oI -bR -bN -bK -bK -oI -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(230,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ao -ad -ad -ao -ao -ao -ao -ap -av -ao -ad -ad -ad -ap -ad -ao -ao -ad -ad -ao -ap -ao -ax -rv -rv -ad -ad -ad -ad -ad -ad -rv -rv -TT -ad -vX -ax -ax -rv -ad -ax -rv -ao -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -bO -bO -oI -cm -cm -bK -bK -bR -bR -bN -bK -bK -bK -oI -oI -bO -bO -bO -bO -cm -bK -bK -bK -bK -bK -bK -bK -bN -bK -bK -bK -bK -bK -bK -bN -bK -bK -bK -bK -bK -bK -oI -oI -hT -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(231,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ao -ao -ao -ao -ad -ad -ad -ad -ao -ao -ad -ad -ao -ao -ao -ao -ao -aB -ax -rv -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ao -rv -rv -rv -rv -ao -ao -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -bO -bO -oI -cm -cm -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -bO -bO -bO -bO -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -Ly -oI -oI -oI -oI -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(232,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -vX -ax -ax -ad -ad -ad -ad -ax -ax -ax -ax -ax -ax -ax -ax -ax -ax -ax -ax -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -rv -ao -ao -ao -ao -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -Np -oI -oI -oI -oI -oI -oI -oI -oI -hT -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(233,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -rv -AN -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -bO -bO -bO -bO -bO -oI -oI -oI -oI -bK -bK -bK -bK -oI -bO -bO -bO -bK -bK -bO -bO -bO -bO -cm -cm -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -bO -bO -bO -oI -hT -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(234,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -rv -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -oI -oI -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -oI -bO -bO -bO -bK -bK -bO -bO -bO -bO -cm -cm -bK -bK -bK -bK -cm -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -bK -bO -bO -bO -bO -bO -bO -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(235,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -oI -oI -oI -oI -oI -bO -bO -bO -bO -hT -oI -oI -oI -oI -oI -bO -bO -bO -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bK -cm -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(236,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -Rp -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bN -bN -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -oI -oI -Rp -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(238,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -oI -oI -bQ -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bK -bK -bK -bK -bK -bK -bK -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(239,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -oI -bT -bQ -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -cm -cm -cm -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(240,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -ad -rv -ad -ad -ad -ad -ad -rv -ad -wT -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bS -bS -bQ -oI -oI -hT -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(241,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -ad -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -rv -rv -Bd -ao -aZ -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bT -bY -bR -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -hT -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(242,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -wT -ao -ba -ao -wT -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -bT -bT -bR -oI -oI -oI -oI -oI -oI -oI -bK -bN -bN -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -hT -oI -oI -oI -oI -oI -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(243,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -rv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -rv -ad -ad -ad -ad -ad -ad -rv -aZ -ao -Bd -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bT -bT -bQ -bK -bK -oI -oI -jU -oI -oI -oI -oI -oI -bK -bN -bN -bN -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -CB -oI -oI -oI -oI -bK -bK -bK -Cc -oI -oI -hT -oI -bK -bK -bK -bK -bK -bK -oI -oI -oI -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(244,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -rv -wT -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bT -bT -bQ -bK -bK -bK -oI -oI -oI -CB -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -bK -oI -oI -oI -NX -XN -ki -FV -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -hT -oI -bO -bO -bO -bO -bO -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(245,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bT -bT -bQ -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -oI -oI -yS -oI -BQ -ml -oI -nY -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(246,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -bT -bT -bR -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -hT -CB -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -FV -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(247,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bQ -bT -bT -bQ -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -oI -oI -oI -oI -oI -oI -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -aa -aa -aa -aa -aa -aa -aa -"} -(248,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -bK -bK -bR -bU -bU -bQ -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -bK -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -OX -OX -OX -OX -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 deleted file mode 100644 index db7781f80adc..000000000000 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ /dev/null @@ -1,71989 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ac" = ( -/turf/closed/mineral/random/labormineral, -/area/awaymission/moonoutpost19/main) -"ae" = ( -/turf/closed/indestructible/rock, -/area/awaymission/moonoutpost19/main) -"at" = ( -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/syndicate) -"ay" = ( -/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/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"az" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aA" = ( -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aB" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aC" = ( -/obj/effect/decal/cleanable/dirt, -/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/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aN" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aP" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aR" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aU" = ( -/turf/closed/wall, -/area/awaymission/moonoutpost19/syndicate) -"aV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"aZ" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bd" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"be" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/syndicate) -"bf" = ( -/obj/effect/decal/cleanable/dirt, -/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/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bg" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bi" = ( -/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/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bl" = ( -/turf/closed/mineral/random/high_chance, -/area/awaymission/moonoutpost19/hive) -"bm" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/space_cube{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bn" = ( -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bo" = ( -/obj/machinery/airalarm/directional/north{ - pixel_y = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bp" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bq" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/item/radio/off{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = 2 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"br" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bs" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Gateway Access"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bu" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bv" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bw" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bx" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"by" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bz" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/item/plate, -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bA" = ( -/obj/machinery/light/directional/west, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bD" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bE" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bF" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bG" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/syndi_cakes, -/obj/item/trash/sosjerky, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bI" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bJ" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bK" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bM" = ( -/obj/structure/closet/emcloset, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bN" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bO" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Break Room" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bP" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bQ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - name = "Gateway"; - req_access_txt = "150" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bR" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/multitool, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bS" = ( -/obj/machinery/computer/monitor/secret, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bT" = ( -/obj/machinery/power/smes{ - input_level = 10000; - inputting = 0; - output_level = 15000 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bU" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/airalarm/directional/north{ - pixel_y = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bV" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"bX" = ( -/obj/machinery/conveyor{ - id = "awaysyndie" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"bY" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 4; - output_dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"bZ" = ( -/obj/structure/sign/poster/contraband/syndicate_recruitment{ - pixel_y = 32 - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ca" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cd" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ce" = ( -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cg" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ch" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ci" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/light/small/directional/west, -/obj/item/stock_parts/cell/high, -/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cj" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"ck" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cm" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/hacking_guide{ - pixel_x = 32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cn" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"co" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cp" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"cq" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cr" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/public/glass{ - density = 0; - icon_state = "open"; - name = "Dormitories"; - set_obj_flags = "EMAGGED" - }, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"cs" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"ct" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"cu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cv" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cw" = ( -/obj/machinery/door/airlock/engineering{ - name = "Power Maintenance"; - req_access_txt = "150" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cx" = ( -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cy" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cA" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cB" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cC" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cD" = ( -/obj/machinery/mineral/processing_unit_console{ - machinedir = 8 - }, -/turf/closed/wall, -/area/awaymission/moonoutpost19/syndicate) -"cE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cG" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard, -/obj/structure/alien/weeds, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"cH" = ( -/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/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cJ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cK" = ( -/obj/machinery/power/apc/highcap/ten_k{ - name = "Worn-out APC"; - pixel_y = -25; - req_access_txt = "150"; - start_charge = 0 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cL" = ( -/obj/structure/alien/weeds, -/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/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cM" = ( -/obj/item/storage/box/lights/mixed, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cN" = ( -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cP" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cQ" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "awaysyndie"; - layer = 3.1; - name = "mining conveyor" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cS" = ( -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" - }, -/obj/machinery/light/broken/directional/east, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cT" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - density = 0; - icon_state = "open"; - id_tag = "awaydorm4"; - name = "Dorm 1"; - opacity = 0; - set_obj_flags = "EMAGGED" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"cU" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm5"; - name = "Dorm 2" - }, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"cV" = ( -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cY" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 12 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"cZ" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/syndie{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "awaydorm4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"da" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"db" = ( -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"dc" = ( -/obj/structure/dresser, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "awaydorm5"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"de" = ( -/obj/machinery/mineral/stacking_machine{ - dir = 1; - input_dir = 1; - output_dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"df" = ( -/obj/machinery/mineral/stacking_unit_console{ - machinedir = 8 - }, -/turf/closed/wall, -/area/awaymission/moonoutpost19/syndicate) -"dg" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dh" = ( -/obj/structure/chair/wood, -/obj/machinery/airalarm/directional/west{ - pixel_x = -23; - req_access = null; - req_access_txt = "150" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"di" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"dj" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"dk" = ( -/obj/machinery/airalarm/directional/east{ - pixel_x = 23; - req_access = null; - req_access_txt = "150" - }, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"dl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dn" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"do" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dp" = ( -/obj/structure/closet/crate, -/obj/item/storage/bag/ore, -/obj/structure/alien/weeds, -/obj/item/mining_scanner, -/obj/item/shovel, -/obj/item/pickaxe, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dq" = ( -/obj/structure/table/wood, -/obj/item/pen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2, -/obj/structure/sign/poster/contraband/c20r{ - pixel_y = -32 - }, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"dr" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - req_access_txt = "150" - }, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/ammo_box/magazine/m9mm, -/obj/item/suppressor, -/turf/open/floor/wood{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"ds" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/syndie{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"dt" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "150" - }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/wood{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"du" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external/ruin{ - density = 0; - icon_state = "open"; - opacity = 0; - req_access_txt = "150"; - set_obj_flags = "EMAGGED" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"dw" = ( -/obj/structure/tank_dispenser/oxygen{ - oxygentanks = 9 - }, -/obj/machinery/light/small/broken/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/syndicate) -"dy" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/mask/gas, -/obj/item/pickaxe/drill, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dA" = ( -/turf/closed/mineral/random, -/area/awaymission/moonoutpost19/main) -"dB" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = -32 - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dC" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dD" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dI" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/external/ruin{ - density = 0; - icon_state = "open"; - opacity = 0; - req_access_txt = "150"; - set_obj_flags = "EMAGGED" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dL" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/syndicate) -"dM" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"dZ" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/moonoutpost19/research) -"ea" = ( -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"eb" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - name = "Acid-Proof biohazard containment door" - }, -/obj/machinery/door/poddoor{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - layer = 2.9; - name = "Acid-Proof biohazard containment door" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ec" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"ed" = ( -/obj/machinery/vending/snack, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"ee" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ef" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eg" = ( -/obj/machinery/atmospherics/components/unary/portables_connector{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eh" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/turf/open/floor/iron/white/side{ - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ei" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 10 - }, -/obj/structure/alien/weeds, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"ej" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"el" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"em" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"en" = ( -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eo" = ( -/obj/machinery/light/broken/directional/north, -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/machinery/camera/directional/north{ - c_tag = "Xenobiology Containment North"; - network = list("mo19x") - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"ep" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/machinery/sparker/directional/north{ - desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; - id = "awayxenobio"; - name = "Acid-Proof mounted igniter" - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eq" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"er" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"et" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/research) -"eu" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ev" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ex" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"ey" = ( -/obj/structure/table/reinforced, -/obj/structure/alien/weeds, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the contents of the xenobiology containment pen."; - dir = 8; - name = "xenobiology monitor"; - network = list("mo19x") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ez" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof containment chamber blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eA" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/awaymission/moonoutpost19/research) -"eB" = ( -/obj/structure/alien/weeds/node, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eF" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eH" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eI" = ( -/turf/closed/wall, -/area/awaymission/moonoutpost19/research) -"eJ" = ( -/turf/closed/wall/rust, -/area/awaymission/moonoutpost19/research) -"eK" = ( -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eL" = ( -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eM" = ( -/obj/machinery/light/small/broken/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology"; - network = list("mo19","mo19r") - }, -/turf/open/floor/iron/white/side{ - dir = 6; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"eO" = ( -/obj/structure/table/reinforced, -/obj/machinery/button/door{ - id = "Awaylab"; - name = "Containment Chamber Blast Doors"; - pixel_x = 4; - pixel_y = -2; - req_access_txt = "201" - }, -/obj/machinery/button/ignition{ - id = "awayxenobio"; - pixel_x = 4; - pixel_y = 8 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eQ" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"eS" = ( -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eT" = ( -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eU" = ( -/obj/machinery/space_heater, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/build{ - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eV" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eW" = ( -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 15000 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eX" = ( -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eY" = ( -/obj/item/newspaper, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"eZ" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fa" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fb" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/research) -"fc" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fd" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 5; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fe" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = 32 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ff" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fg" = ( -/obj/structure/table, -/obj/item/stack/sheet/mineral/plasma, -/obj/machinery/light/small/broken/directional/north, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fh" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/structure/alien/weeds, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fi" = ( -/obj/structure/closet/crate/freezer, -/obj/structure/alien/weeds, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/xenos_claw, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fj" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fk" = ( -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fm" = ( -/obj/structure/closet/l3closet/scientist, -/obj/structure/window/reinforced, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fp" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fv" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_2" - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fw" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fx" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/research{ - density = 0; - icon_state = "open"; - name = "Xenobiology Lab"; - opacity = 0; - req_access_txt = "201"; - set_obj_flags = "EMAGGED" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fz" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fA" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fB" = ( -/obj/structure/alien/weeds/node, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"fD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/item/stack/rods, -/obj/item/stack/cable_coil{ - amount = 5 - }, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fE" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof containment chamber blast door" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/item/stack/rods, -/obj/item/stack/cable_coil{ - amount = 5 - }, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - desc = "A one meter section of pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof Pipe" - }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fJ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - desc = "Has a valve and pump attached to it. This one has been applied with an acid-proof coating."; - dir = 8; - name = "Acid-Proof Air Injector" - }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fK" = ( -/obj/machinery/light/broken/directional/east, -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Containment East"; - network = list("mo19x") - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"fL" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fM" = ( -/obj/item/cigbutt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fO" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fQ" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fR" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fS" = ( -/obj/structure/filingcabinet, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fT" = ( -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/obj/item/clothing/suit/armor/vest, -/obj/item/reagent_containers/spray/pepper, -/obj/item/grenade/flashbang, -/obj/item/storage/belt/security, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fU" = ( -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/structure/sign/poster/official/safety_report{ - pixel_y = 32 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fW" = ( -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fX" = ( -/obj/structure/sign/warning/biohazard{ - pixel_x = 32 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"fZ" = ( -/obj/machinery/door/firedoor, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ga" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/closet/l3closet/scientist, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gb" = ( -/obj/structure/grille, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof containment chamber blast door" - }, -/obj/item/stack/cable_coil/cut, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gc" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gd" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"gf" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gg" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gi" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gj" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gk" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gl" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gm" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gn" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/razor{ - pixel_y = 5 - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"go" = ( -/obj/structure/alien/weeds/node, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gq" = ( -/obj/structure/table, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gr" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gs" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" - }, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gt" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" - }, -/obj/machinery/door/poddoor/preopen{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaylab"; - name = "Acid-Proof containment chamber blast door" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gu" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 4; - name = "Acid-Proof disposal pipe" - }, -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gv" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 10; - name = "Acid-Proof disposal pipe" - }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gw" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/off, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gx" = ( -/obj/structure/table, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gy" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/closet/toolcloset, -/obj/item/clothing/gloves/color/yellow, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gz" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gA" = ( -/obj/machinery/computer/monitor/secret{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gC" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gD" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gE" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gF" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 6; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gG" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 4; - locked = 0; - name = "Worn-out APC"; - pixel_x = 25; - start_charge = 100 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gH" = ( -/obj/structure/table, -/obj/item/retractor, -/obj/item/hemostat, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gI" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/machinery/light/small/broken/directional/east, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gJ" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/machinery/light/small/broken/directional/west, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_psych, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/facehugger, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gK" = ( -/obj/structure/table/reinforced, -/obj/structure/alien/weeds, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/item/radio/off, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gM" = ( -/obj/structure/disposalpipe/segment{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - name = "Acid-Proof disposal pipe" - }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"gN" = ( -/obj/item/stack/rods, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gO" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/security{ - desc = "Used to access the various cameras on the outpost."; - dir = 4; - network = list("mo19r","mo19") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - id = "Awaybiohazard"; - name = "Biohazard Shutter Control"; - req_access_txt = "101" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gP" = ( -/obj/structure/chair/office, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gQ" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gR" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gS" = ( -/obj/machinery/light/broken/directional/east, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gT" = ( -/obj/structure/table/optable, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gU" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gV" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"gW" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gX" = ( -/obj/structure/alien/weeds, -/turf/open/floor/iron/white, -/area/awaymission/moonoutpost19/research) -"gY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/alien/weeds, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ha" = ( -/obj/structure/disposaloutlet{ - desc = "An outlet for the pneumatic disposal system. This one has been applied with an acid-proof coating."; - dir = 1; - name = "Acid-Proof disposal outlet" - }, -/obj/structure/disposalpipe/trunk{ - desc = "An underfloor disposal pipe. This one has been applied with an acid-proof coating."; - dir = 1; - name = "Acid-Proof disposal pipe" - }, -/obj/structure/alien/weeds, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hb" = ( -/obj/machinery/light/broken/directional/south, -/obj/structure/alien/weeds, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology Containment South"; - network = list("mo19x") - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hc" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/machinery/sparker/directional/south{ - desc = "A wall-mounted ignition device. This one has been applied with an acid-proof coating."; - id = "awayxenobio"; - name = "Acid-Proof mounted igniter" - }, -/turf/open/floor/engine, -/area/awaymission/moonoutpost19/research) -"hd" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"he" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hg" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hh" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hi" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hj" = ( -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hm" = ( -/obj/machinery/vending/medical{ - req_access_txt = "201" - }, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hn" = ( -/obj/structure/closet/crate/bin, -/obj/item/clothing/gloves/color/latex, -/obj/item/trash/chips, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ho" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/turf/open/floor/iron/white/corner{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hp" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hq" = ( -/obj/structure/closet/secure_closet{ - icon_state = "rd"; - name = "research director's locker"; - req_access_txt = "201" - }, -/obj/item/storage/backpack/satchel/science, -/obj/item/clothing/gloves/color/latex, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hr" = ( -/obj/structure/table, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hs" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/light/small/broken/directional/north, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"ht" = ( -/obj/structure/closet/crate/bin, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hu" = ( -/obj/machinery/door/poddoor{ - id = "AwayRD"; - layer = 2.9; - name = "privacy shutter" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hv" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hw" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hx" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hy" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hB" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hD" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/command{ - density = 0; - icon_state = "open"; - name = "Research Director's Office"; - opacity = 0; - req_access_txt = "201"; - set_obj_flags = "EMAGGED" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hE" = ( -/obj/structure/noticeboard/directional/south, -/obj/machinery/light/small/broken/directional/south, -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division"; - network = list("mo19","mo19r") - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hG" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Storage"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hI" = ( -/turf/closed/wall/rust, -/area/awaymission/moonoutpost19/arrivals) -"hJ" = ( -/turf/closed/wall, -/area/awaymission/moonoutpost19/arrivals) -"hK" = ( -/obj/structure/closet/crate, -/obj/item/storage/box/lights/mixed, -/obj/item/poster/random_contraband, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hL" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hM" = ( -/obj/structure/chair, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor{ - desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; - id = "Awaybiohazard"; - layer = 2.9; - name = "Acid-Proof biohazard containment door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hO" = ( -/obj/structure/table, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hP" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hQ" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hR" = ( -/obj/structure/urinal/directional/north, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hS" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/urinal/directional/north, -/obj/structure/mirror/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hT" = ( -/obj/machinery/shower{ - pixel_y = 16 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hU" = ( -/obj/machinery/shower{ - pixel_y = 16 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"hW" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"hX" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/folder/white, -/obj/item/stamp/rd{ - pixel_x = 3; - pixel_y = -2 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hY" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"hZ" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - name = "research monitor"; - network = list("mo19x","mo19r") - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"ia" = ( -/obj/machinery/computer/aifixer, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"ib" = ( -/obj/structure/rack, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/circuitboard/computer/teleporter, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ic" = ( -/obj/structure/rack, -/obj/item/paicard{ - pixel_x = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"id" = ( -/obj/structure/rack, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ie" = ( -/obj/machinery/door/airlock/medical{ - name = "Research Division"; - req_access_txt = "201" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"if" = ( -/obj/structure/closet/l3closet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ig" = ( -/obj/structure/closet/l3closet, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ih" = ( -/obj/structure/table, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/hud/health, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ii" = ( -/obj/structure/table, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"ij" = ( -/obj/machinery/airalarm/unlocked{ - dir = 8; - pixel_x = -23; - req_access = null - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ik" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/east{ - icon_state = "mirror_broke" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"il" = ( -/obj/item/soap/nanotrasen, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"im" = ( -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"in" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"io" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ip" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/button/door{ - id = "Awaybiohazard"; - name = "Biohazard Shutter Control"; - pixel_y = 8; - req_access_txt = "201" - }, -/obj/machinery/button/door{ - id = "AwayRD"; - name = "Privacy Shutter Control"; - pixel_y = -2; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"iq" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"ir" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"is" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"it" = ( -/obj/item/storage/secure/safe/directional/east, -/obj/effect/decal/cleanable/blood/splatter, -/obj/item/pen, -/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iu" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/machinery/shower{ - dir = 4; - name = "emergency shower" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iv" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iw" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ix" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iy" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iA" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iB" = ( -/obj/structure/table, -/obj/item/plate, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iC" = ( -/obj/structure/table, -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iD" = ( -/obj/structure/table, -/obj/item/trash/raisins, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iF" = ( -/obj/structure/sink{ - pixel_y = 28 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iG" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iH" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/light/small/broken/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Research Director's Office"; - network = list("mo19","mo19r") - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"iI" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"iJ" = ( -/obj/structure/table, -/obj/item/radio/off, -/obj/item/laser_pointer, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/research) -"iK" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iL" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iM" = ( -/obj/structure/table, -/obj/item/storage/secure/briefcase, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iN" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iO" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"iP" = ( -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iQ" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iR" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iS" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"iT" = ( -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"iU" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"iX" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"iY" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"iZ" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"jb" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jc" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/detective, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jd" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"je" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jf" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"jg" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"jh" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ji" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light/small/directional/west, -/obj/item/trash/cheesie, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jk" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jl" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jm" = ( -/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{ - id = "awaykitchen"; - name = "Serving Hatch" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jn" = ( -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"jo" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"jq" = ( -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jr" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"js" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jt" = ( -/obj/structure/table, -/obj/item/newspaper, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ju" = ( -/obj/structure/chair, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jv" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jw" = ( -/obj/machinery/vending/snack, -/obj/structure/sign/poster/contraband/eat{ - pixel_y = 32 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jx" = ( -/obj/structure/sign/departments/science{ - pixel_y = 32 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jz" = ( -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"jB" = ( -/obj/structure/grille, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"jC" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"jD" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jE" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"jF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jG" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jH" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 1; - locked = 0; - name = "Worn-out APC"; - pixel_y = 25; - start_charge = 100 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jI" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jJ" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jK" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jL" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jM" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jN" = ( -/obj/item/cigbutt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jO" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jP" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_y = 5 - }, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"jQ" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"jR" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"jT" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jU" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jX" = ( -/obj/item/cigbutt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jY" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23; - req_access = null - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"jZ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ka" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kb" = ( -/obj/machinery/door/firedoor/closed, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kd" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"ke" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kf" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kh" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kk" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"km" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kn" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/reagent_containers/glass/rag{ - pixel_y = 5 - }, -/obj/machinery/door/poddoor/shutters{ - id = "awaykitchen"; - name = "Serving Hatch" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ko" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"kp" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/item/knife/kitchen, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"kq" = ( -/obj/structure/table, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"kr" = ( -/obj/effect/decal/cleanable/food/egg_smudge, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"ks" = ( -/obj/machinery/light/directional/east, -/obj/machinery/processor, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"kt" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/candy, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ku" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kw" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals North"; - network = list("mo19") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kx" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ky" = ( -/turf/open/floor/iron/white/corner{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kz" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/firedoor/closed, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kB" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kC" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"kD" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is curled up in fetal position with the hands placed near the throat." - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kH" = ( -/obj/machinery/door/firedoor/closed, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kI" = ( -/obj/effect/decal/cleanable/generic, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kJ" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kK" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/cleanable/xenoblood/xgibs, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kL" = ( -/obj/effect/decal/cleanable/xenoblood, -/obj/effect/decal/remains/xeno{ - desc = "They look like the remains of something... alien. The front of skull appears to have been completely obliterated." - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kM" = ( -/obj/structure/closet/crate/bin, -/obj/item/plate, -/obj/item/food/badrecipe, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"kN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kO" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kP" = ( -/obj/item/stack/rods, -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"kQ" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"kR" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kS" = ( -/obj/machinery/door/firedoor/closed, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kT" = ( -/obj/machinery/button/door/directional/west{ - id = "awaydorm1"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kU" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/suit/navy, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kV" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kW" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kX" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kY" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"kZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"la" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lb" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Kitchen"; - network = list("mo19") - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"lc" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/moonoutpost19/arrivals) -"ld" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/moonoutpost19/arrivals) -"lf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lg" = ( -/obj/item/cigbutt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lh" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lk" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"ll" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"lm" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm1"; - name = "Dorm 1" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ln" = ( -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lo" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/chair/wood, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lq" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/item/storage/box, -/obj/machinery/airalarm/unlocked{ - dir = 8; - pixel_x = -23; - req_access = null - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lr" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ls" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Bar"; - network = list("mo19") - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/west{ - id = "awaykitchen"; - name = "Kitchen Shutters Control" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/awaymission/moonoutpost19/arrivals) -"lu" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "201" - }, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lv" = ( -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"lw" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink"; - pixel_y = 28 - }, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"lx" = ( -/obj/structure/closet/crate{ - desc = "It's a storage unit for kitchen clothes and equipment."; - name = "Kitchen Crate" - }, -/obj/item/storage/box/mousetraps, -/obj/item/clothing/under/suit/waiter, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"lA" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/moonoutpost19/arrivals) -"lD" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating{ - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"lF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lG" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lH" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"lJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"lK" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lL" = ( -/obj/structure/table/wood, -/obj/item/lighter, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lM" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lN" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lO" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"lQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lR" = ( -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lS" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lT" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/suit/hooded/chaplain_hoodie, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"lU" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is sitting upright with its legs tucked in and hands still holding onto its arms." - }, -/obj/item/gun/ballistic/shotgun/sc_pump, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"lW" = ( -/obj/structure/table, -/obj/item/storage/lockbox, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"lX" = ( -/obj/structure/table, -/obj/item/radio/off, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"lZ" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"ma" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mb" = ( -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mc" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"md" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"me" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mh" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"mi" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mj" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mk" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"ml" = ( -/obj/structure/table, -/obj/item/storage/backpack/satchel/leather/withwallet, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mm" = ( -/obj/structure/closet/secure_closet{ - locked = 0; - name = "kitchen Cabinet"; - req_access_txt = "201" - }, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"mn" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "meat fridge"; - req_access_txt = "201" - }, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"mo" = ( -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "refrigerator"; - req_access_txt = "201" - }, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/storage/fancy/egg_box, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006; - temperature = 273.15 - }, -/area/awaymission/moonoutpost19/arrivals) -"mp" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mq" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mr" = ( -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"ms" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mt" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mu" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mv" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"my" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/north, -/obj/machinery/button/door/directional/west{ - id = "awaydorm2"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mz" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mA" = ( -/obj/structure/closet/emcloset, -/obj/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mC" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = -32 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mD" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/chair/comfy/beige, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mE" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 3 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mF" = ( -/obj/structure/chair/comfy/beige, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"mG" = ( -/obj/machinery/computer/shuttle{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mH" = ( -/obj/machinery/door/airlock/titanium{ - name = "Shuttle Cockpit" - }, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mI" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mJ" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/device.dmi'; - icon_state = "beacon"; - name = "tracking beacon" - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mK" = ( -/obj/machinery/door/airlock/titanium{ - name = "Shuttle Airlock" - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mL" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mM" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mN" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/noticeboard/directional/east, -/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals South"; - network = list("mo19") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mP" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"mQ" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"mR" = ( -/obj/machinery/door/airlock{ - id_tag = "awaydorm2"; - name = "Dorm 2" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mS" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 5; - icon_state = "ltrails_1" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mT" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mU" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"mV" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/pen, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"mW" = ( -/obj/structure/chair, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mY" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/window/reinforced, -/turf/open/floor/mineral/titanium/yellow, -/area/awaymission/moonoutpost19/arrivals) -"mZ" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_1" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"na" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nb" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/misc/assistantformal, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nc" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/generic, -/obj/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nf" = ( -/obj/structure/filingcabinet, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"ng" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"nh" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/moonoutpost19/arrivals) -"ni" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nj" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/candy, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nl" = ( -/obj/item/cigbutt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nm" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_y = 32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nn" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"no" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nq" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - icon_state = "ltrails_2" - }, -/obj/machinery/camera/directional/west{ - c_tag = "Dormitories"; - network = list("mo19") - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"ns" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nt" = ( -/obj/structure/grille, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nu" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nv" = ( -/obj/item/pickaxe/drill, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"nw" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nx" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/item/clothing/neck/tie/black, -/obj/item/clothing/under/suit/black, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"ny" = ( -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nz" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "201" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nA" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nB" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nD" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/obj/item/shard, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nE" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nF" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nG" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 6; - icon_state = "ltrails_1" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nH" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle."; - layer = 4.1 - }, -/obj/machinery/button/door/directional/west{ - id = "awaydorm3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nI" = ( -/obj/structure/dresser, -/obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nJ" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nK" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A warning sign which reads 'HOSTILE ATMOSPHERE AHEAD'"; - name = "\improper HOSTILE ATMOSPHERE AHEAD"; - pixel_x = -32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nL" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nM" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nN" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nO" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock{ - id_tag = "awaydorm3"; - name = "Dorm 3" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nP" = ( -/obj/item/pen, -/obj/item/storage/pill_bottle{ - pixel_y = 6 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nQ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nR" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nS" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nT" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/suit/burgundy, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nU" = ( -/obj/machinery/newscaster/directional/east, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nV" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"nW" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nX" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nY" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/generic, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"nZ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/corner, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"oa" = ( -/obj/structure/chair/comfy/black, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"ob" = ( -/obj/item/kirbyplants{ - desc = "A plastic potted plant."; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"oc" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"og" = ( -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"oz" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"oJ" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"oT" = ( -/obj/structure/closet/secure_closet{ - icon_state = "science"; - locked = 0; - name = "scientist's locker"; - req_access_txt = "201" - }, -/obj/item/clothing/suit/toggle/labcoat, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"oU" = ( -/obj/structure/window/reinforced, -/obj/structure/closet/secure_closet{ - icon_state = "science"; - name = "scientist's locker"; - req_access_txt = "201" - }, -/obj/item/clothing/suit/toggle/labcoat, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/gas, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"qr" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"qw" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"qD" = ( -/obj/item/stack/ore/iron{ - pixel_x = 7; - pixel_y = -6 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"qK" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"rh" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/queen/large{ - desc = "A gigantic alien who is in charge of the hive and all of its loyal servants."; - name = "alien queen"; - pixel_x = -16; - plants_off = 1 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"rk" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"rq" = ( -/obj/structure/shuttle/engine/propulsion/burst/right{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"rD" = ( -/obj/item/trash/candy, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"sb" = ( -/obj/item/flashlight/lantern{ - icon_state = "lantern-on" - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"si" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien/sentinel, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"sy" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"sM" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien/drone{ - plants_off = 1 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"tb" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"tK" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/decal/cleanable/blood, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/clothing/under/syndicate, -/obj/item/clothing/glasses/night, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"uf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"uK" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"uR" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"vm" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"vJ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"vK" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/suit/space/syndicate/orange, -/obj/item/clothing/mask/gas, -/obj/item/clothing/head/helmet/space/syndicate/orange, -/obj/item/clothing/mask/facehugger/impregnated, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"vV" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"wq" = ( -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"wx" = ( -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"wT" = ( -/obj/item/stack/ore/iron{ - pixel_x = -3; - pixel_y = 9 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"xI" = ( -/obj/item/storage/bag/ore, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"yz" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"zp" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"zF" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"zZ" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"Ad" = ( -/obj/structure/alien/weeds/node, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"BH" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"CY" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"DF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"DS" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"FJ" = ( -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/decal/cleanable/oil, -/obj/item/storage/medkit/regular{ - empty = 1; - name = "First-Aid (empty)" - }, -/obj/item/healthanalyzer{ - pixel_x = 6; - pixel_y = -5 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -5; - pixel_y = -2 - }, -/obj/item/bodypart/arm/left/robot, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"Gn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"Hw" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"HQ" = ( -/obj/machinery/power/shieldwallgen/unlocked, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"IW" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"Jd" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_1" - }, -/obj/item/mining_scanner, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"Ku" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"KG" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/gun/ballistic/automatic/pistol, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"Li" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/syndicate) -"Mm" = ( -/obj/machinery/door/airlock/medical{ - name = "Research Division"; - req_access_txt = "201" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"Ny" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/decal/cleanable/blood/gibs, -/obj/item/clothing/mask/facehugger/impregnated, -/obj/item/clothing/under/rank/security/officer, -/obj/item/clothing/suit/armor/vest, -/obj/item/melee/baton/security/loaded, -/obj/item/clothing/head/helmet, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"OO" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"Pn" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 23; - req_access = null - }, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"PC" = ( -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 8; - icon_state = "ltrails_2" - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"PS" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"Qq" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"Rm" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/moonoutpost19/arrivals) -"RY" = ( -/obj/structure/alien/weeds/node, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"Sg" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"Sp" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"SE" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"Ub" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"Uh" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/decal/cleanable/blood/tracks{ - desc = "Your instincts say you shouldn't be following these."; - dir = 9; - icon_state = "ltrails_1" - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"Uq" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"UY" = ( -/obj/structure/alien/weeds/node, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"VE" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/arrivals) -"Wc" = ( -/obj/structure/alien/weeds/node, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) -"Wf" = ( -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/arrivals) -"Ye" = ( -/obj/structure/alien/weeds, -/mob/living/simple_animal/hostile/alien, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"Yn" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"Zb" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/egg/burst, -/obj/effect/decal/cleanable/blood, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/hive) -"Zf" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4); - temperature = 251 - }, -/area/awaymission/moonoutpost19/main) -"Zs" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/moonoutpost19/research) -"Zx" = ( -/obj/structure/shuttle/engine/propulsion/burst/left{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"Zz" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/arrivals) -"ZZ" = ( -/obj/item/stack/ore/iron{ - pixel_x = -7; - pixel_y = -4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 48.7, "nitrogen" = 13.2, "oxygen" = 32.4) - }, -/area/awaymission/moonoutpost19/main) - -(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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -Uq -Uq -uK -oz -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -PS -oz -oz -PS -uK -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -Uq -uK -PS -PS -uK -oJ -PS -oz -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -PS -PS -OO -BH -PS -PS -OO -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -PS -PS -BH -PS -rh -CY -tK -tb -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -oz -si -PS -PS -PS -tb -CY -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -BH -CY -PS -PS -UY -PS -si -oz -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -KG -Ad -PS -PS -PS -PS -oz -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -PS -CY -Uq -PS -PS -PS -OO -oz -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -Uq -Uq -PS -PS -PS -PS -PS -PS -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -oz -PS -PS -PS -PS -PS -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -vK -BH -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -Uq -PS -PS -UY -PS -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -oz -CY -qw -PS -Uq -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -Uq -PS -PS -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -BH -PS -UY -PS -oz -Uq -ac -ac -ac -ac -ac -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -PS -PS -PS -BH -Uq -Uq -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -UY -UY -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -PS -Ye -PS -oz -Uq -Uq -Uq -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -PS -PS -Uq -Uq -ac -Uq -Uq -Uq -Uq -Uq -Uq -Uq -Uq -Uq -PS -PS -Uq -Uq -Uq -Uq -ac -ac -ac -ac -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -PS -PS -PS -Uq -Uq -Uq -PS -PS -PS -PS -PS -PS -Uq -Uq -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -PS -PS -PS -Uq -PS -PS -PS -PS -PS -PS -UY -PS -PS -PS -Uq -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -Uq -Uq -Uq -Uq -ac -ac -ac -Uq -Uq -PS -UY -PS -PS -PS -Uq -Uq -Uq -Uq -PS -PS -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -Uq -Uq -oz -BH -Uq -Uq -Uq -Uq -Uq -Uq -PS -PS -PS -PS -Uq -Uq -bl -bl -Uq -Uq -PS -PS -Uq -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -Uq -oz -PS -Ye -PS -Uq -Uq -PS -PS -PS -PS -PS -PS -Uq -Uq -bl -bl -bl -Uq -PS -PS -PS -Uq -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -Uq -oz -PS -oz -UY -PS -PS -PS -Uq -Uq -PS -Uq -Uq -Uq -bl -bl -bl -bl -Uq -PS -PS -Uq -Uq -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -lc -lA -lA -lA -lc -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -Uq -Uq -Uq -BH -BH -Uq -Uq -Uq -Uq -Uq -PS -Uq -bl -bl -bl -bl -bl -bl -Uq -PS -PS -Uq -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -lc -lc -mp -mG -mV -lc -lc -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -Uq -Uq -Uq -Uq -ac -ac -ac -Uq -oJ -Uq -Uq -bl -bl -bl -bl -bl -Uq -PS -sM -Uq -Uq -Uq -ac -ac -ac -dA -dA -dA -vm -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ld -lW -mb -mc -mb -nf -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -PS -Uq -bl -bl -bl -bl -bl -Uq -PS -PS -PS -PS -Uq -Uq -Uq -ac -dA -dA -vm -vm -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eJ -eJ -eJ -eI -eI -eI -eJ -eI -wq -wq -ld -lX -mq -mr -mW -lX -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -PS -PS -Uq -Uq -bl -bl -bl -bl -Uq -Uq -PS -PS -PS -PS -PS -Uq -Uq -vm -vm -RY -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eI -eI -eJ -eI -eJ -eJ -wq -wq -wq -eJ -hK -eX -eX -he -eX -fR -eZ -eI -wq -wq -ld -ld -ld -mH -ld -ld -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -Uq -zp -PS -PS -UY -oz -Uq -bl -bl -bl -Uq -Uq -PS -PS -Uq -Uq -PS -PS -PS -Uq -Wc -uR -uR -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eS -fO -fL -fL -gw -eJ -eI -eJ -eI -eI -hL -hW -ea -ea -dZ -dZ -eX -eJ -wq -wq -ld -lZ -mr -mr -mr -lZ -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -Ny -Zb -Ye -PS -oz -BH -Uq -bl -bl -bl -Uq -PS -PS -Uq -Uq -Uq -Uq -PS -UY -Uq -Wc -uR -uR -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eJ -eT -fr -fM -gf -gx -eI -hd -eX -hp -eZ -eX -he -dZ -iF -iZ -dZ -fQ -eJ -hI -wq -ld -ma -mc -mr -mc -ng -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -BH -CY -PS -BH -BH -Uq -Uq -bl -bl -bl -Uq -PS -Uq -Uq -ac -ac -Uq -Uq -Uq -Uq -vm -RY -uR -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eJ -eU -fO -fN -fN -gy -eI -eX -ea -ea -dZ -dZ -ea -ea -iG -dZ -ea -jT -kt -hI -wq -lA -mb -ms -mI -ms -mb -lA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -Uq -Uq -PS -Uq -Uq -Uq -bl -bl -bl -bl -Uq -PS -Uq -Uq -ac -ac -ac -ac -ac -dA -dA -vm -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eJ -eV -fO -fO -gg -gz -eI -eX -ea -hq -hB -hB -hB -hB -hC -ea -jq -jU -ku -io -wq -ld -mc -mt -mJ -mt -mc -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -Uq -bl -bl -bl -bl -bl -bl -Uq -PS -PS -Uq -ac -ac -ac -ac -ac -dA -dA -vm -uR -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eW -eZ -eX -fR -gA -eJ -he -ea -hr -hB -hC -hX -ip -hB -dZ -jr -jU -kv -io -wq -ld -md -ms -mI -ms -nh -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -Uq -bl -bl -bl -bl -bl -bl -Uq -Uq -UY -Uq -ac -ac -ac -ac -dA -dA -vm -vm -uR -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eJ -eI -eJ -fQ -eJ -eJ -eI -eX -ea -hs -hB -hM -hY -iq -iH -ea -js -jV -ku -io -wq -lA -mc -mc -mr -mc -mc -lA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -UY -Uq -bl -bl -bl -bl -bl -bl -bl -Uq -PS -Uq -ac -ac -ac -ac -dA -dA -vm -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eX -eX -fR -eX -eX -gN -he -dZ -ht -hC -hB -hZ -hC -iI -ea -jt -jV -kw -hI -lc -ld -me -mb -mr -mb -me -ld -lc -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -Uq -bl -bl -bl -bl -bl -bl -bl -Uq -PS -Uq -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eY -ea -ea -ea -dZ -dZ -ea -ea -hu -hD -hu -ia -hB -iJ -ea -ju -jU -ku -io -ld -lD -lD -mu -mr -mY -lD -lD -ld -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -Uq -bl -bl -bl -bl -bl -bl -Uq -Uq -PS -Uq -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eI -eZ -ea -fS -gi -Zs -gO -hg -fV -hv -gR -hu -ib -ir -iK -dZ -jr -jV -kv -io -lc -rq -Zx -ld -mK -ld -rq -Zx -lc -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -Uq -PS -Uq -bl -bl -bl -bl -bl -Uq -Uq -PS -PS -Uq -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eJ -fa -dZ -fT -eu -gC -gP -hh -fV -hv -gR -hu -ic -is -iL -ea -jv -jV -kv -io -wq -wq -wq -io -mL -io -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -Uq -Uq -PS -Uq -Uq -Uq -Uq -Uq -Uq -Uq -PS -PS -Uq -Uq -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -dZ -ea -ea -eX -ea -fU -gj -gD -gQ -hi -fV -hv -gR -hu -id -it -iM -ea -jw -jX -ku -hI -wq -wq -wq -mv -lM -io -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -Uq -PS -PS -oz -Uq -Uq -PS -PS -Ku -PS -PS -Uq -Uq -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ed -et -ea -fc -ea -fV -gk -gE -fV -fV -fV -hv -hE -eI -ea -dZ -dZ -ea -hJ -jY -kx -hI -hI -io -io -io -mM -io -io -io -hI -hI -hI -hI -nW -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -Uq -BH -oJ -PS -PS -PS -PS -PS -Uq -Uq -Uq -Uq -Uq -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eb -ee -eu -eK -fd -fv -fW -gl -gF -gR -gR -gR -fk -hj -hN -ea -iu -iN -eI -jx -jZ -ky -kN -lf -lF -lF -lF -jG -lF -lF -no -zZ -nA -nK -Wf -qK -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -Uq -oz -PS -UY -PS -oz -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -eb -ef -ev -eL -fe -fw -fX -gm -gG -gS -hj -hj -hj -hF -hN -ie -hj -hj -Mm -jy -jU -jF -jG -lg -lG -mg -mw -mN -mg -mg -mg -zZ -lM -lN -Wf -qK -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -Uq -oz -PS -PS -BH -BH -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -fb -ea -ea -dZ -ea -ea -fx -dZ -ea -dZ -dZ -oT -oU -hw -hw -hN -ea -iv -iO -eI -jz -ka -jF -kO -lh -lH -io -io -hI -io -io -io -hI -nB -nL -hI -VE -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -yz -Uq -Uq -Uq -Uq -Uq -Uq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ff -fy -eu -gn -gH -dZ -ea -fV -hx -hG -eI -dZ -ea -ea -ea -hI -jZ -kz -hJ -hJ -hJ -io -wq -gd -wq -wq -wq -hI -hI -hI -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -fg -fy -eu -go -fk -gT -ea -hm -hy -hj -hj -if -dZ -wq -wq -hJ -kb -kA -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -fh -fz -ee -gp -fk -gU -dZ -hn -hj -hj -hj -ig -dZ -wq -wq -io -Sp -kB -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -dZ -ea -ea -fi -fz -ee -gq -gI -gV -ea -eK -FJ -hj -hF -ih -ea -wq -wq -io -kd -kC -kP -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -eg -eg -eI -fj -fA -fZ -eJ -eI -eJ -ea -ho -jE -Pn -hO -ii -ea -wq -wq -io -ke -kD -kQ -sy -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -eh -eh -eM -fk -fB -fk -gr -gJ -gW -ea -dZ -ea -ea -ea -dZ -ea -wq -nn -hI -kf -kE -hI -Zz -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -ei -ex -eN -fl -fC -fk -fk -fk -gX -dZ -wq -wq -wq -wq -wq -wq -wq -wq -jA -Sp -kE -io -wq -wq -wq -wq -wq -wq -wq -Sg -wq -Uh -iT -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ej -ey -eO -fm -fD -ga -gs -gK -gY -dZ -wq -wq -wq -wq -wq -wq -wq -iT -jB -kh -kB -io -wq -wq -wq -wq -wq -wq -wq -hI -jC -nD -jC -jC -jC -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dZ -HQ -ez -ez -ez -fE -gb -gt -ez -HQ -ea -wq -wq -wq -wq -wq -wq -wq -wq -jC -kd -kG -io -wq -wq -wq -wq -wq -wq -wq -hI -nw -nE -nM -nS -nX -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -aU -aU -aU -aU -aU -aU -aU -aU -aU -aU -aU -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ea -eA -eq -eq -fF -gc -gu -eA -ea -ea -wq -wq -wq -wq -wq -wq -hJ -hI -hI -kj -kH -hJ -hJ -hJ -hI -hJ -hI -hI -hJ -hJ -nx -nF -kE -kB -kC -jC -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -bv -bF -aU -bX -bX -cC -bX -bX -de -dl -aU -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -el -er -eq -en -fG -em -gv -gM -ha -ea -wq -wq -wq -wq -wq -nn -hJ -jb -jD -jU -jF -kS -lk -lI -lI -lI -mP -mZ -ni -nq -kG -nG -kE -kE -kE -oa -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -aU -aU -bw -aU -aU -bY -cn -cD -cn -cn -df -dm -aU -aU -aU -aU -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -em -eB -em -en -fH -el -en -eB -eq -ea -wq -wq -wq -wq -wq -wq -io -jc -jF -jV -jG -kR -ll -lJ -mh -mx -mQ -kB -nj -mh -ny -mx -nN -lJ -nY -ob -jC -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -bd -bm -bx -bG -aU -bZ -co -cE -cQ -cV -cE -dn -aU -dw -dB -aU -dL -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -en -en -eH -eq -fH -eq -eq -en -eq -ea -wq -wq -wq -wq -wq -wq -io -jd -jF -jU -hI -hI -lm -hJ -hI -hI -mR -hJ -hJ -kV -hI -hJ -nO -hJ -hI -hI -hJ -Zz -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -be -bn -bx -bH -bO -ca -cp -ca -do -do -ca -ca -du -dx -dC -dI -dM -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ec -eo -eq -eq -eq -fJ -eq -eq -en -hb -ec -wq -wq -wq -wq -wq -wq -hJ -je -jG -jU -hJ -kT -ln -lK -hJ -my -mS -na -hJ -lM -hJ -nH -nP -nT -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -aU -bo -by -bI -bP -cb -cq -cF -cS -do -cF -do -aU -dy -dD -aU -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ep -eq -eH -eq -eq -eq -eq -eQ -hc -ea -wq -wq -hI -hI -hJ -hJ -hJ -jf -jF -jU -hI -kU -lo -lL -hJ -mz -mT -nb -hJ -Ub -hI -nI -ln -nU -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -aU -bp -bz -bJ -aU -bP -cr -cG -aU -cY -dg -dp -aU -aU -aU -aU -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -eq -eF -eQ -eH -en -fp -eq -en -eq -ea -wq -wq -hI -hP -hJ -iw -hJ -jg -jF -kk -hI -hJ -hJ -hI -hI -hJ -hJ -hJ -hI -Ub -hI -hJ -hJ -hJ -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -at -at -at -at -at -at -at -at -at -cc -cs -cH -aU -aU -aU -aU -aU -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -er -em -en -en -eQ -en -en -eB -eq -ea -wq -wq -hJ -hQ -hI -ix -hJ -hI -jH -jV -kI -kV -Ub -lM -lN -lN -lN -lO -nk -ns -hJ -lM -lN -hI -Zf -wq -wq -wq -vJ -Hw -Zf -wx -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -ay -aF -aN -aV -bf -bq -bA -bK -at -cd -ca -cI -aU -cZ -dh -dq -aU -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -el -eH -eB -fp -fK -eH -eH -eq -eq -ea -wq -wq -hI -hR -ij -im -iz -jh -jF -jG -kJ -hJ -hJ -lN -mi -mA -mU -nc -nl -nt -nz -lN -nQ -nV -nZ -rk -rk -rk -SE -oc -qK -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -az -uf -uf -uf -aV -br -bB -bL -at -ce -ca -cJ -cT -da -di -dr -aU -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ea -ea -ea -ea -ea -ec -ea -ea -ea -ea -ea -wq -wq -hI -hS -ik -im -im -hJ -jI -jG -jF -kW -hJ -lO -hI -hJ -hI -hI -vV -hI -hI -nJ -nR -hJ -DS -wq -wq -wq -Yn -IW -DS -wq -rD -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -aA -uf -aP -Gn -bg -bs -bC -bC -bQ -cf -ct -cK -aU -aU -aU -aU -aU -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -hI -hI -iy -hJ -hI -jJ -jG -jG -kX -hI -lM -hI -wq -wq -hI -nm -Ub -hI -hJ -hJ -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -aB -uf -uf -DF -bh -Li -bD -bM -at -cg -cu -cI -cU -db -dj -ds -aU -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -hT -il -iz -iP -hI -jK -jF -jF -kY -hJ -Ub -hI -wq -wq -hI -mM -hI -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -aC -aB -aR -aZ -bi -bu -bE -bN -at -ch -cv -cL -aU -dc -dk -dt -aU -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -hU -im -im -iP -hI -jL -jF -jG -kZ -hJ -lN -hJ -wq -wq -Yn -IW -nu -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -at -at -at -at -at -at -at -at -at -at -at -cw -at -at -aU -aU -aU -aU -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -hI -in -iA -hI -hI -jM -km -km -jM -hJ -kV -hJ -hJ -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -bR -ci -cx -cM -at -ac -ac -ac -ac -ac -ac -ac -ac -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -hJ -hJ -hJ -ji -jk -jk -jk -la -lq -jk -mj -Rm -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -bS -cj -cy -cN -at -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -io -iB -iQ -jj -jk -jk -jk -jN -lr -jj -mj -Rm -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -bT -ck -cz -cO -at -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -io -iC -iR -jj -jk -jk -kK -jk -jk -jk -jj -mC -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -bU -cl -cA -cN -at -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -io -iD -iS -jk -jN -jk -kL -jk -ls -jk -mk -hI -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -bV -cm -cB -cP -at -ac -ac -ac -ac -ac -ac -ac -wq -wq -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -nn -hJ -hJ -hI -zF -jl -jl -jl -jl -hJ -lQ -hJ -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -at -at -at -at -at -at -ac -ac -ac -ac -ac -ac -wq -wq -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hJ -hJ -jm -jO -kn -jO -jO -hJ -lR -lR -hJ -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -wq -wq -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hJ -iU -iX -iX -ko -iX -iX -lt -lR -lS -mD -io -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -Qq -jn -jP -kp -iX -iX -iX -lS -lR -mE -io -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -Qq -iX -jQ -kq -ko -iX -iX -lR -lR -mF -io -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hJ -iX -iX -jn -kr -iX -lb -iX -lT -ml -hI -hI -Zz -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -wq -wq -wq -wq -wq -wq -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -iY -jo -jR -ks -kM -hJ -lu -hJ -hJ -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hJ -hJ -hI -io -hJ -hJ -hJ -lv -lv -mm -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -lw -lv -mn -hJ -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -wq -wq -wq -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hI -lx -lU -mo -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -qD -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -ac -ac -ac -ac -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -hJ -hJ -hJ -hI -hI -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -wq -qr -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -wq -PC -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -wq -ZZ -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -qr -wq -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wq -wq -wq -wq -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -wq -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -og -wq -Jd -wq -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -wT -sb -xI -wq -wq -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -dA -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -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 -wq -nv -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/research.dmm b/_maps/RandomZLevels/research.dmm deleted file mode 100644 index ad348101b942..000000000000 --- a/_maps/RandomZLevels/research.dmm +++ /dev/null @@ -1,70269 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/open/space, -/area/space) -"ab" = ( -/turf/closed/mineral, -/area/space/nearstation) -"ad" = ( -/turf/closed/mineral, -/area/awaymission/research/exterior) -"ag" = ( -/turf/closed/wall/mineral/plastitanium{ - dir = 8 - }, -/area/awaymission/research/interior/engineering) -"ah" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 1 - }, -/turf/open/space, -/area/awaymission/research/interior/engineering) -"ai" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aj" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 1 - }, -/turf/open/space, -/area/awaymission/research/interior/engineering) -"ak" = ( -/turf/closed/wall/mineral/plastitanium{ - dir = 1 - }, -/area/awaymission/research/interior/engineering) -"al" = ( -/turf/closed/wall/mineral/plastitanium, -/area/awaymission/research/interior/engineering) -"am" = ( -/obj/structure/window/reinforced, -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/awaymission/research/interior/engineering) -"an" = ( -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"ao" = ( -/obj/structure/window/reinforced, -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/awaymission/research/interior/engineering) -"ap" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"aq" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"ar" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/engineering) -"as" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"at" = ( -/obj/machinery/suit_storage_unit/engine, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"au" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"av" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/smes, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high/empty, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aw" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"ax" = ( -/obj/item/kirbyplants{ - icon_state = "plant-20"; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"ay" = ( -/obj/structure/chair{ - dir = 8 - }, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"az" = ( -/obj/effect/gibspawner/human, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aA" = ( -/obj/item/stack/sheet/plasteel, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aC" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aD" = ( -/obj/machinery/power/port_gen/pacman, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aE" = ( -/obj/effect/gibspawner/human, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aF" = ( -/obj/item/stack/rods, -/obj/item/stack/sheet/iron, -/obj/item/stock_parts/cell/high/empty, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aG" = ( -/obj/item/stock_parts/cell/high, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aH" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/maint) -"aI" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aJ" = ( -/obj/machinery/computer/pod{ - dir = 1; - id = "spacebattlepod2"; - name = "Hull Door Control" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"aK" = ( -/obj/effect/mob_spawn/corpse/human/syndicatesoldier{ - brute_damage = 200 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"aL" = ( -/obj/structure/table, -/obj/item/grenade/c4, -/obj/item/grenade/c4, -/obj/item/storage/toolbox/syndicate, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/research/interior/engineering) -"aM" = ( -/obj/item/stock_parts/cell/high/empty, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aO" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"aP" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"aQ" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aR" = ( -/obj/item/stack/sheet/plasteel, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aT" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"aW" = ( -/obj/machinery/light/directional/east, -/obj/structure/tank_dispenser, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"aZ" = ( -/obj/machinery/light/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"be" = ( -/obj/item/stack/rods, -/obj/item/ammo_casing/c45, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"bf" = ( -/turf/closed/wall/mineral/plastitanium{ - dir = 4 - }, -/area/awaymission/research/interior/engineering) -"bg" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"bi" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/obj/item/clothing/gloves/color/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bl" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/gateway) -"bm" = ( -/obj/machinery/power/apc/highcap/ten_k{ - auto_name = 1; - dir = 4; - name = "Engineering APC"; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/engineering) -"bn" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bs" = ( -/obj/item/ammo_casing/c45, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"bw" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bx" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"bz" = ( -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bD" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"bE" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bF" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bG" = ( -/obj/item/stack/sheet/iron, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bH" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bI" = ( -/obj/effect/mob_spawn/corpse/human/syndicatesoldier{ - brute_damage = 200 - }, -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/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/iron/white, -/area/awaymission/research/interior/engineering) -"bK" = ( -/obj/item/wrench, -/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/iron/white, -/area/awaymission/research/interior/engineering) -"bL" = ( -/obj/item/stack/sheet/plasteel, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bM" = ( -/obj/item/storage/toolbox/mechanical, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bN" = ( -/obj/effect/mob_spawn/corpse/human/engineer{ - brute_damage = 200 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bO" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bP" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"bQ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bR" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bT" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bV" = ( -/obj/structure/sign/warning/nosmoking/circle{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bX" = ( -/obj/effect/mob_spawn/corpse/human/engineer{ - brute_damage = 200 - }, -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c9mm, -/obj/effect/decal/cleanable/blood, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"bY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"bZ" = ( -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"ca" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cb" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 4; - name = "Gateway APC"; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cf" = ( -/obj/item/ammo_casing/c46x30mm, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"cg" = ( -/obj/effect/mob_spawn/corpse/human/syndicatesoldier{ - brute_damage = 200 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"ch" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ci" = ( -/obj/machinery/light/directional/west, -/obj/structure/window/reinforced, -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cj" = ( -/obj/structure/window/reinforced, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"ck" = ( -/obj/machinery/door/window/right/directional/east{ - dir = 2 - }, -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cl" = ( -/obj/machinery/light/directional/east, -/obj/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cn" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cp" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"cq" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"cr" = ( -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior) -"cs" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"cv" = ( -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cx" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/genetics) -"cy" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Genetics Maintenance"; - req_access_txt = "9" - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cz" = ( -/obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cA" = ( -/obj/item/ammo_casing/c46x30mm, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior) -"cC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"cD" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cF" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/obj/item/paper/pamphlet/gateway, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"cL" = ( -/obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate/ranged, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cM" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior) -"cN" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior) -"cP" = ( -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ - brute_damage = 200 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"cQ" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/secure) -"cR" = ( -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Gateway Access"; - req_access_txt = "205" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/gateway) -"cS" = ( -/obj/machinery/power/apc/highcap/five_k{ - dir = 4; - name = "Genetics APC"; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/genetics) -"cY" = ( -/obj/item/ammo_casing/c9mm, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"cZ" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"da" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"db" = ( -/obj/structure/filingcabinet, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dc" = ( -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dd" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"de" = ( -/obj/structure/filingcabinet, -/obj/structure/filingcabinet, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"df" = ( -/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."; - memory = list(3 = list("label" = "Buffer1:Kr-$$@##", "UI" = "f8f603857000f930127c4", "SE" = "414401462231053131010241514651403453121613263463440351136366", "UE" = "340008485c321e542aed4df7032ac04d", "name" = "Krystal Symers", "blood_type" = "A+")); - name = "dusty genetics data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/thermal, -/obj/item/dnainjector/thermal, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dg" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"dk" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dl" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"dn" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"do" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/security) -"dp" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/telemut, -/obj/item/dnainjector/telemut, -/obj/item/dnainjector/chavmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dy" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dz" = ( -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ - brute_damage = 200 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"dB" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"dC" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dK" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dL" = ( -/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."; - memory = 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{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/obj/item/dnainjector/dwarf, -/obj/item/dnainjector/dwarf, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dM" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/dnainjector/chameleonmut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dP" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"dR" = ( -/obj/item/ammo_casing/c45, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"dW" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage C"; - req_access_txt = "205" - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dX" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage D"; - req_access_txt = "205" - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"dY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"dZ" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ea" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/cryo) -"eb" = ( -/obj/machinery/door/poddoor{ - id = "cryopodg2"; - name = "cryogenetic genetics blastdoor" - }, -/turf/open/floor/iron/stairs, -/area/awaymission/research/interior/genetics) -"ec" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ed" = ( -/obj/item/ammo_casing/c45, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"ee" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eg" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eh" = ( -/turf/open/floor/iron/white/corner, -/area/awaymission/research/interior) -"ei" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ej" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ek" = ( -/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/iron/white, -/area/awaymission/research/interior) -"em" = ( -/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/iron/white, -/area/awaymission/research/interior) -"en" = ( -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/awaymission/research/interior) -"er" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"es" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior) -"et" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eu" = ( -/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/iron/white, -/area/awaymission/research/interior/cryo) -"ev" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ew" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ex" = ( -/obj/machinery/light/directional/north, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"ez" = ( -/obj/machinery/light/directional/north, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"eA" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"eB" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/mob/living/simple_animal/hostile/nanotrasen/ranged, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"eC" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"eD" = ( -/obj/structure/barricade/security, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/cryo) -"eE" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eF" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eH" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eI" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eJ" = ( -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eN" = ( -/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/iron/white, -/area/awaymission/research/interior) -"eO" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"eP" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"eQ" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Cell Door"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"eS" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"eT" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"eU" = ( -/obj/item/paper/crumpled/awaymissions/research/sensitive_info, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"eV" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"eW" = ( -/obj/structure/barricade/security, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"eX" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"eY" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"fb" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fc" = ( -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fd" = ( -/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 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fe" = ( -/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 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"ff" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fg" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fh" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fi" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fk" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fl" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/item/ammo_casing/c45, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fn" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fo" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fp" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fq" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fr" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ft" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fu" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fv" = ( -/obj/structure/plaque/static_plaque/golden{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fw" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fx" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fy" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 4; - name = "Vault APC"; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fz" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fA" = ( -/obj/machinery/light/small/directional/west, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"fD" = ( -/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/iron/white, -/area/awaymission/research/interior/cryo) -"fE" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fF" = ( -/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/iron/white, -/area/awaymission/research/interior/cryo) -"fH" = ( -/obj/effect/mob_spawn/corpse/human/syndicatesoldier{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fI" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fJ" = ( -/obj/structure/barricade/security, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"fK" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access_txt = "9" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"fL" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fM" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fN" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fO" = ( -/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/iron/white, -/area/awaymission/research/interior) -"fQ" = ( -/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/iron/white, -/area/awaymission/research/interior) -"fR" = ( -/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/iron/white, -/area/awaymission/research/interior) -"fS" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fT" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"fU" = ( -/obj/structure/barricade/security, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"fV" = ( -/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/iron/white, -/area/awaymission/research/interior/security) -"gc" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gd" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/terminal, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gf" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gg" = ( -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Power Storage"; - req_access_txt = "205" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gj" = ( -/obj/structure/cable, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gk" = ( -/obj/structure/barricade/security, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gl" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Vault Storage"; - req_access_txt = "205" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"gn" = ( -/obj/machinery/door/airlock/research{ - name = "Secure Storage"; - req_access_txt = "9,63" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/secure) -"gp" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"gq" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior) -"gB" = ( -/obj/structure/sign/departments/science, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"gD" = ( -/turf/open/floor/iron, -/area/awaymission/research/interior) -"gL" = ( -/obj/item/screwdriver, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/item/ammo_casing/c45, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"gP" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"gQ" = ( -/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/iron/white, -/area/awaymission/research/interior/cryo) -"gS" = ( -/obj/item/reagent_containers/spray/pepper, -/obj/effect/decal/cleanable/blood/drip, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"gT" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"gU" = ( -/obj/structure/barricade/security, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"gV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"gX" = ( -/obj/effect/decal/cleanable/blood/drip, -/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/iron/white, -/area/awaymission/research/interior) -"gZ" = ( -/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/iron/white, -/area/awaymission/research/interior) -"ha" = ( -/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/iron/white, -/area/awaymission/research/interior) -"hb" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hd" = ( -/obj/structure/barricade/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"he" = ( -/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/iron/white, -/area/awaymission/research/interior/security) -"hk" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hn" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ho" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hq" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hr" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hs" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"ht" = ( -/obj/machinery/light/directional/south, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"hv" = ( -/obj/machinery/light/directional/south, -/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/iron/white, -/area/awaymission/research/interior/cryo) -"hy" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hz" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hA" = ( -/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/iron/white, -/area/awaymission/research/interior) -"hB" = ( -/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/iron/white, -/area/awaymission/research/interior) -"hC" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hD" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"hE" = ( -/obj/machinery/door/window/right/directional/south{ - name = "Cell Door"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"hF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/security) -"hG" = ( -/obj/structure/closet/secure_closet/security, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hH" = ( -/obj/machinery/vending/security, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hI" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage A"; - req_access_txt = "205" - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hJ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/highsecurity{ - aiDisabledIdScanner = 1; - name = "Secure Storage B"; - req_access_txt = "205" - }, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hK" = ( -/obj/machinery/door/poddoor{ - id = "cryopodg1"; - name = "cryogenetic genetics blastdoor" - }, -/turf/open/floor/iron/stairs{ - dir = 1 - }, -/area/awaymission/research/interior/genetics) -"hL" = ( -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/awaymission/research/interior) -"hM" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hN" = ( -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"hO" = ( -/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/iron/white, -/area/awaymission/research/interior) -"hP" = ( -/obj/structure/sign/directions/medical{ - pixel_x = 32; - pixel_y = -32 - }, -/obj/structure/sign/directions/evac{ - pixel_x = 32; - pixel_y = -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/iron/white, -/area/awaymission/research/interior) -"hQ" = ( -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/awaymission/research/interior) -"hR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"hS" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines. This one has the initials 'C.P' marked on the front."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/clothing/head/collectable/petehat{ - name = "dusty hat" - }, -/obj/item/firing_pin/dna, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hT" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"hZ" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ia" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"id" = ( -/turf/closed/wall, -/area/awaymission/research/interior/maint) -"ii" = ( -/obj/item/kirbyplants{ - desc = "A potted plant, it doesn't look very healthy..."; - name = "dead potted plant" - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ij" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/mob/living/simple_animal/bot/secbot/genesky, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ik" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"il" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna/dredd, -/obj/item/firing_pin/dna/dredd, -/obj/item/dnainjector/insulated, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"io" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"ip" = ( -/obj/structure/urinal/directional/north, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"ir" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"it" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"iv" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Security Maintenance"; - req_access_txt = "63" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"iA" = ( -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iB" = ( -/obj/machinery/door/airlock{ - name = "Stall" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iC" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/effect/landmark/awaystart, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iD" = ( -/turf/closed/wall, -/area/awaymission/research/interior) -"iE" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"iF" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/security) -"iJ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iK" = ( -/obj/structure/window/reinforced/tinted, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iL" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iM" = ( -/turf/closed/wall, -/area/awaymission/research/interior/bathroom) -"iN" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iO" = ( -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iP" = ( -/obj/machinery/door/airlock{ - name = "Unisex Bathroom" - }, -/turf/open/floor/iron/freezer, -/area/awaymission/research/interior/bathroom) -"iQ" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"iR" = ( -/turf/open/floor/iron, -/area/awaymission/research/interior/maint) -"iS" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/awaymission/research/interior/maint) -"iU" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/research/interior/maint) -"iW" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/medbay) -"iX" = ( -/turf/closed/wall, -/area/awaymission/research/interior/dorm) -"iY" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"iZ" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ja" = ( -/obj/machinery/sleeper, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jb" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jc" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"je" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jf" = ( -/turf/closed/wall, -/area/awaymission/research/interior/medbay) -"jg" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jh" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ji" = ( -/obj/machinery/door/airlock/glass_large, -/turf/closed/mineral, -/area/awaymission/research/exterior) -"jj" = ( -/obj/structure/dresser, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jk" = ( -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jl" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jm" = ( -/obj/item/kirbyplants{ - icon_state = "plant-14" - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"jn" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"jo" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"jp" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"jq" = ( -/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/iron, -/area/awaymission/research/interior) -"js" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"jt" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ju" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jv" = ( -/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/iron/white, -/area/awaymission/research/interior/medbay) -"jx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jz" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jB" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jC" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jD" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jE" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"jF" = ( -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"jH" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior) -"jK" = ( -/obj/structure/sign/departments/medbay, -/turf/closed/wall/r_wall, -/area/awaymission/research/interior) -"jR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"jS" = ( -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"jT" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/south{ - id = "Dorm1"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jU" = ( -/obj/structure/bed, -/obj/item/bedsheet/blue, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jV" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/south{ - id = "Dorm2"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jW" = ( -/obj/structure/bed, -/obj/item/bedsheet/purple, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jX" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/south{ - id = "Dorm3"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jY" = ( -/obj/structure/bed, -/obj/item/bedsheet/clown, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"jZ" = ( -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"ka" = ( -/obj/effect/turf_decal/siding/yellow/corner, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kc" = ( -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kd" = ( -/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/iron, -/area/awaymission/research/interior) -"ke" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"kf" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"kg" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kh" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ki" = ( -/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/iron/white, -/area/awaymission/research/interior/medbay) -"kl" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"km" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kn" = ( -/obj/structure/table, -/obj/item/scalpel, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ko" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kp" = ( -/obj/machinery/power/apc/highcap/five_k{ - dir = 4; - name = "Dorms APC"; - pixel_x = 25 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/dorm) -"kq" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm1"; - name = "Dorm 1" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"kr" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm2"; - name = "Dorm 2" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"ks" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm3"; - name = "Dorm 3" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"kt" = ( -/obj/item/gun/ballistic/automatic/pistol/m1911, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"ku" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kv" = ( -/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/iron/white, -/area/awaymission/research/interior) -"kw" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kx" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ky" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kz" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kA" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kB" = ( -/obj/effect/spawner/structure/window/reinforced/tinted, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"kC" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 9 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kD" = ( -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kE" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kF" = ( -/obj/structure/closet/wardrobe/green, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kL" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"kN" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kO" = ( -/obj/structure/chair/comfy/beige, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kP" = ( -/obj/effect/mob_spawn/corpse/human/geneticist{ - brute_damage = 145; - oxy_damage = 55 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kQ" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kR" = ( -/obj/structure/table/wood, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin, -/obj/item/pen/fourcolor, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kV" = ( -/obj/structure/closet/wardrobe/grey, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"kW" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kX" = ( -/obj/item/stack/rods, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kY" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"kZ" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"la" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lb" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lc" = ( -/obj/structure/window/reinforced, -/obj/structure/closet/wardrobe/mixed, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"ld" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lf" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lh" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"li" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ll" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lm" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"ln" = ( -/turf/open/floor/iron, -/area/space/nearstation) -"lo" = ( -/obj/structure/table/wood, -/obj/structure/bedsheetbin, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lp" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lq" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lu" = ( -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/item/shard{ - icon_state = "small" - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"lv" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/item/ammo_casing/c45, -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lx" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/dromedaryco, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"ly" = ( -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lz" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lA" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lB" = ( -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lC" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lD" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lF" = ( -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lG" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lH" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lI" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lJ" = ( -/obj/structure/closet/crate/bin, -/obj/item/trash/can, -/obj/item/trash/chips, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"lK" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm6"; - name = "Dorm 6" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lL" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm5"; - name = "Dorm 5" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lM" = ( -/obj/machinery/door/airlock{ - id_tag = "Dorm4"; - name = "Dorm 4" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lN" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lO" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/north{ - id = "Dorm6"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lP" = ( -/obj/structure/bed, -/obj/item/bedsheet/rainbow, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lQ" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/north{ - id = "Dorm5"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lR" = ( -/obj/structure/bed, -/obj/item/bedsheet/green, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lS" = ( -/obj/structure/table/wood, -/obj/machinery/button/door/directional/north{ - id = "Dorm4"; - name = "Privacy Button" - }, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lT" = ( -/obj/structure/bed, -/obj/item/bedsheet/patriot, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/research/interior/dorm) -"lW" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/medbay) -"lX" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/siding/yellow{ - dir = 10 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lY" = ( -/obj/effect/turf_decal/siding/yellow{ - dir = 6 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"lZ" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"ma" = ( -/turf/closed/wall/r_wall, -/area/awaymission/research/interior/escapepods) -"mb" = ( -/turf/closed/wall, -/area/awaymission/research/interior/escapepods) -"me" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/research/exterior) -"mf" = ( -/obj/structure/shuttle/engine/propulsion/burst{ - dir = 4 - }, -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/research/exterior) -"mg" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mh" = ( -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mi" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"ml" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mm" = ( -/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/iron/white, -/area/awaymission/research/interior/escapepods) -"mo" = ( -/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/iron/white, -/area/awaymission/research/interior/escapepods) -"mp" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mq" = ( -/turf/open/floor/plating, -/area/awaymission/research/exterior) -"mr" = ( -/obj/item/stack/rods, -/obj/item/shard, -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"ms" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/mob_spawn/corpse/human/geneticist{ - brute_damage = 145; - oxy_damage = 55 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"mt" = ( -/obj/machinery/door/airlock/titanium{ - name = "Escape Pod Airlock" - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/research/exterior) -"mu" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mv" = ( -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mw" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mx" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"my" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/awaymission/research/exterior) -"mA" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mB" = ( -/turf/closed/wall, -/area/awaymission/research/exterior) -"mC" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mD" = ( -/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/iron/white, -/area/awaymission/research/interior/escapepods) -"mE" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mF" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mG" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mH" = ( -/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/iron/white, -/area/awaymission/research/interior/escapepods) -"mI" = ( -/obj/structure/sign/warning/pods{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mJ" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mK" = ( -/obj/structure/flora/ausbushes/brflowers, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mL" = ( -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mM" = ( -/obj/structure/flora/ausbushes/grassybush, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/grass, -/area/awaymission/research/interior/escapepods) -"mN" = ( -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mO" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mP" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mQ" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mS" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod Three" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mT" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mU" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mV" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mW" = ( -/obj/structure/sign/warning/vacuum{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mX" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"mY" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"mZ" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"na" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/obj/item/dnainjector/thermal, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"nb" = ( -/obj/structure/closet/crate, -/obj/item/disk/data{ - desc = "A specialized data disk for holding critical genetic backup data. Without proper passwords, information will turn up blank on most DNA machines."; - name = "encrypted genetic data disk"; - read_only = 1 - }, -/obj/item/firing_pin/dna, -/obj/item/dnainjector/telemut, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/secure) -"nf" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/awaymission/research/interior/engineering) -"nC" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/gun/ballistic/automatic/wt550, -/obj/item/ammo_box/magazine/wt550m9, -/obj/item/ammo_box/magazine/wt550m9, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"oc" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"ok" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"oT" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"pt" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod Three" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"pv" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"pS" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"pW" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"pX" = ( -/obj/item/stack/sheet/iron, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"qi" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/button/door{ - id = "cryopodg1"; - name = "panic lockdown button" - }, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"qp" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"qP" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"qQ" = ( -/obj/item/clothing/mask/gas/clown_hat, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"qS" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"qY" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"qZ" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"rh" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"rk" = ( -/obj/structure/barricade/security, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"ry" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"rB" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/maintenance, -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"sf" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"si" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"sl" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"sn" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"sq" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Storage" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"su" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"sM" = ( -/obj/structure/window/reinforced, -/obj/effect/landmark/awaystart, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"ts" = ( -/turf/open/misc/asteroid/airless, -/area/awaymission/research/exterior) -"tv" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"tE" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"uf" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"uh" = ( -/obj/structure/chair/office, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"ut" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"va" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"vh" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"vT" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"vX" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"wa" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"wq" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/airless, -/area/awaymission/research/exterior) -"wF" = ( -/obj/item/bikehorn, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"wM" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"wN" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"xl" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/gateway) -"xy" = ( -/obj/item/stack/sheet/mineral/bananium{ - amount = 50 - }, -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"xE" = ( -/obj/structure/rack, -/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/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"xG" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod Two" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"yc" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"yj" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_x = 32; - pixel_y = 40 - }, -/obj/structure/sign/directions/engineering{ - dir = 1; - pixel_x = 32; - pixel_y = 33 - }, -/obj/structure/sign/directions/science{ - dir = 1; - pixel_x = 32; - pixel_y = 26 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/mob/living/simple_animal/hostile/syndicate/ranged/smg, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"yM" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"yW" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/simple_animal/hostile/nanotrasen, -/turf/open/floor/iron, -/area/awaymission/research/interior/cryo) -"zn" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"zs" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"AY" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot, -/obj/item/clothing/head/helmet/riot, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"Ba" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/toxin, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Bp" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Bx" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"BN" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"BQ" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Cs" = ( -/obj/machinery/door/window/left/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Ct" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron, -/area/awaymission/research/interior/engineering) -"CF" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"CK" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"CN" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"CV" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Dl" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Do" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"Dt" = ( -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"DO" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"DY" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/simple_animal/hostile/nanotrasen/ranged, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Eh" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Ez" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"EC" = ( -/obj/item/ammo_casing/c45, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"EE" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"EV" = ( -/obj/effect/mob_spawn/corpse/human/engineer{ - brute_damage = 200 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"Fl" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/item/ammo_casing/c45, -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Fn" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Fx" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"FB" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet, -/obj/item/clothing/head/helmet, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"FQ" = ( -/obj/effect/mob_spawn/corpse/human/geneticist{ - brute_damage = 145; - oxy_damage = 55 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"FY" = ( -/obj/item/stack/sheet/plasteel, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"FZ" = ( -/obj/machinery/computer/scan_consolenew, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Ge" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Gk" = ( -/obj/item/shard{ - icon_state = "small" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Gn" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/folder, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Ha" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"HD" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"HE" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"HS" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"HW" = ( -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"It" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Iv" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"IN" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/automatic/pistol/m1911, -/obj/item/gun/ballistic/automatic/pistol/m1911, -/obj/item/ammo_box/magazine/m45, -/obj/item/ammo_box/magazine/m45, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"IO" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"IT" = ( -/obj/machinery/door/window/right/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Jc" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"Jp" = ( -/obj/structure/table/wood, -/obj/item/storage/dice, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"Jw" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Jz" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"JT" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"Kd" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/carbon/human, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Kg" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Km" = ( -/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/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"KF" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/ablative, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"KJ" = ( -/obj/item/ammo_casing/c46x30mm, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"KK" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"KN" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/fire, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Le" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Lm" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"LX" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Mo" = ( -/obj/item/stack/rods, -/obj/item/ammo_casing/c45, -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"MA" = ( -/obj/effect/mob_spawn/corpse/human/geneticist{ - brute_damage = 145; - oxy_damage = 55 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Nf" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Nu" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Surgery" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"NF" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"NI" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"NW" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"Or" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Ov" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"OF" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"OH" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/escapepods) -"OU" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/cryo) -"OW" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Pt" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/button/door{ - id = "cryopodg2"; - name = "panic lockdown button" - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"PG" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/carbon/human, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Qd" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Qg" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Qi" = ( -/obj/machinery/door/window/right/directional/east, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Qq" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/mob/living/simple_animal/hostile/nanotrasen/ranged, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"Qs" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Qz" = ( -/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/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"QC" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"QI" = ( -/obj/effect/gibspawner/human, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/item/ammo_casing/c45, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"QQ" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/security) -"Re" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"Rn" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/south, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Ro" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"RI" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"SM" = ( -/turf/open/misc/asteroid, -/area/awaymission/research/exterior) -"Ta" = ( -/obj/machinery/power/apc/highcap/five_k{ - dir = 4; - name = "Cryostatis APC"; - pixel_x = 25 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Th" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/mob/living/simple_animal/hostile/syndicate, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Tj" = ( -/obj/item/melee/baton/telescopic, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Tz" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"TC" = ( -/obj/item/ammo_casing/c45, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"TD" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"TE" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"TW" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Ub" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Uf" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"Uq" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, -/turf/open/misc/asteroid/airless, -/area/awaymission/research/exterior) -"Uu" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"UA" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/maint) -"UO" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"UV" = ( -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"UY" = ( -/obj/item/ammo_casing/c46x30mm, -/obj/item/ammo_casing/c9mm, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Vt" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"VD" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"VW" = ( -/obj/structure/closet, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"Wf" = ( -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/cryo) -"Ws" = ( -/turf/open/misc/asteroid/airless, -/area/space/nearstation) -"WR" = ( -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/awaymission/research/interior) -"Xz" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 8 - }, -/obj/effect/turf_decal/siding/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/research/interior/dorm) -"XE" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/research/interior/escapepods) -"XM" = ( -/obj/machinery/door/airlock/research{ - name = "Cryogenetics Research"; - req_access_txt = "9" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"XU" = ( -/obj/item/ammo_casing/c45, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/engineering) -"XV" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/iron, -/area/awaymission/research/interior/genetics) -"Ye" = ( -/obj/item/ammo_casing/c9mm, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/cryo) -"Yf" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/research/interior/genetics) -"Yx" = ( -/obj/effect/mob_spawn/corpse/human/doctor{ - brute_damage = 200 - }, -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) -"Yz" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/research/interior/security) -"Zg" = ( -/obj/item/stack/rods, -/obj/item/shard, -/turf/open/misc/asteroid, -/area/awaymission/research/exterior) -"ZJ" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/awaymission/research/interior/medbay) - -(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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -"} -(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 -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 -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -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 -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -cQ -db -db -dK -cQ -er -cQ -fw -gd -fw -cQ -hs -cQ -db -db -dK -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -dW -dc -cQ -fx -dc -gf -cQ -dc -hI -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -cQ -dc -cQ -fy -gf -gf -cQ -dc -cQ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dd -dp -dL -cQ -dc -cQ -cQ -gg -cQ -cQ -dc -cQ -hS -dM -il -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -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 -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -dc -eT -dK -gf -dK -dc -dc -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -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 -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 -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 -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 -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -de -db -dK -cQ -dc -eU -dc -gf -dc -dc -dc -cQ -db -db -dK -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -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 -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 -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 -ab -aa -aa -aa -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 -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -dX -dc -dc -dc -gj -dc -dc -dc -hJ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -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 -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -cQ -dc -eV -eW -gk -eW -eV -dc -cQ -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -df -dd -dM -cQ -dc -eW -fz -gf -fz -eW -dc -cQ -hT -na -nb -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -gl -cQ -cQ -cQ -cQ -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -fA -gf -fA -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -gf -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -dc -dc -dc -gk -dc -dc -dc -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -cQ -cQ -cQ -cQ -gn -cQ -cQ -cQ -cQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -dY -dg -dY -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bl -bl -bl -bl -ad -ad -ad -ts -ts -ts -ts -dY -dg -dY -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Zg -mq -my -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bQ -bQ -ci -xl -bl -bl -ad -ts -ts -ts -ts -ts -dY -dg -dY -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -SM -mr -me -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bz -bR -bR -cj -bz -cD -bl -ad -ts -ts -dY -dY -cp -dY -dg -dY -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -me -ms -me -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bA -bS -bY -cj -bz -bz -bl -cp -cp -cp -dY -es -eX -es -dg -dY -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -mf -mt -mf -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bB -bT -bZ -ck -qS -qS -cR -dg -dg -dg -dg -dg -dg -dg -gp -cp -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bC -bU -ca -sM -bz -bz -bl -cp -cp -cp -dY -es -eY -es -dg -dY -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bz -bR -bR -sM -bz -cF -bl -ad -ts -ts -dY -dY -cp -dY -dg -dY -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -ab -ab -ab -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bz -cb -cl -cv -bl -bl -ad -ts -ts -ts -ts -ts -dY -dg -dY -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bl -bl -bl -bl -bl -bl -ad -ad -ad -ts -ts -ts -ts -dY -dg -dY -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -dY -dg -dY -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -cp -cp -gq -cp -cp -aH -ad -ad -ad -ad -ts -ts -ad -ad -ad -ad -ad -ji -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -OF -EE -qp -EE -OF -aH -aH -aH -aH -ad -ad -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -dZ -et -Ta -qp -qp -qp -qp -zn -dZ -bD -aH -ad -ad -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -ea -ea -ea -ea -XM -ea -ea -ea -ea -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -bD -ea -eu -fb -fD -HD -eu -fb -fD -ea -bD -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -bD -cS -bD -bD -bD -ea -ev -fc -fE -HD -ev -fc -fE -ea -bD -bD -bD -cS -bD -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -bD -cx -cx -cx -cx -cx -ea -ev -fd -fE -DY -ev -fd -fE -ea -cx -cx -cx -cx -cx -bD -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -bD -cx -XV -DO -Ha -XV -ea -ev -fc -fE -HD -ev -fc -fE -ea -Jz -Ha -DO -DO -cx -bD -bD -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -cx -Qi -Qg -Ge -Ge -ea -ew -fe -fE -HD -ev -fe -fE -ea -Ge -CF -DO -vX -cx -cx -bD -id -bD -bD -bD -bD -bD -kp -bD -dy -bD -bD -bD -bD -bD -bD -bD -bD -bD -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -Yf -KK -KK -KK -UV -ea -ev -fc -fE -HD -ev -fc -fE -ea -KK -KK -Gk -KK -KK -cy -bD -id -bD -iX -iX -iX -iX -iX -iX -iX -aP -iX -iX -iX -iX -iX -iX -iX -bD -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -Pt -KK -KK -qP -KK -ea -ex -ff -fF -HD -gQ -ff -ht -ea -KK -KK -vh -KK -uf -cx -hD -id -bD -iX -jj -jC -jT -iX -kC -kQ -jE -lm -ly -iX -lO -jC -jj -iX -bD -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -FZ -Tz -KK -KK -OW -eb -Wf -Wf -Ro -MA -Tj -yW -OU -hK -KK -KK -KK -uh -sf -cx -bD -id -bD -iX -jk -jD -jk -kq -jn -kR -kR -jF -kc -lK -jk -jD -jk -iX -bD -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cx -uf -KK -KK -KK -KK -ea -ez -fg -fD -HD -gS -fg -hv -ea -KK -qP -FQ -KK -qi -cx -bD -id -bD -iX -jl -jk -jU -iX -jn -Jp -kR -zs -kc -iX -lP -jk -jl -iX -bD -aH -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -cy -KK -KK -Ez -Gk -KK -ea -ev -fc -fE -HD -ev -fc -fE -ea -Eh -KK -KK -KK -Rn -cx -bD -id -bD -iX -iX -iX -iX -iX -jn -kT -kR -jF -kc -iX -iX -iX -iX -iX -bD -aH -ts -ts -ts -mB -ts -ts -ts -mB -ts -ts -ts -mB -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aH -cn -cx -cx -Cs -DO -CF -Kd -ea -eA -fd -fE -HD -ev -fd -fE -ea -BN -rh -rh -IT -cx -cx -bD -id -bD -iX -jj -jC -jV -iX -jn -wa -jF -jF -kc -iX -lQ -jC -jj -iX -bD -ma -mb -mu -mb -mb -mb -mO -mb -mb -mb -mS -mb -mb -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -aH -bD -bD -cx -PG -DO -Fn -DO -ea -eB -fc -fH -Ye -ev -fc -fE -ea -DO -Fn -DO -XV -cx -bD -bD -id -bD -iX -jk -jD -jk -kr -jn -jF -jF -ln -kc -lL -jk -jD -jk -iX -bD -ma -mg -mv -mv -mb -mg -mv -mv -mb -mg -mv -mv -mb -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -aH -aH -bD -cx -cx -cx -cx -cx -ea -eC -fe -fI -HD -gT -fe -fE -ea -cx -cx -cx -cx -cx -bD -id -id -bD -iX -jl -jk -jW -iX -jn -jF -jF -jF -kc -iX -lR -jk -jl -iX -bD -ma -mb -TE -mb -mb -mb -xG -mb -mb -mb -pt -mb -mb -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aH -cz -bD -bD -bD -bD -bD -ea -ev -fh -fI -DY -ev -fc -fE -ea -bD -bD -bD -bD -bD -bD -id -aO -bD -iX -iX -iX -iX -iX -jn -jF -jF -jF -kc -iX -iX -iX -iX -iX -bD -mb -mh -mw -mw -mC -mI -mw -mw -mC -mI -mT -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -dR -ea -eD -fi -fJ -TW -gU -fi -fF -ea -bD -id -id -id -id -id -id -aO -bD -iX -jj -jC -jX -iX -jn -jF -jF -jF -lz -iX -lS -jC -jj -iX -bD -mb -mi -OH -OH -OH -OH -OH -OH -OH -OH -mE -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -dR -ea -ea -cp -fK -cp -fK -cp -ea -ea -bD -id -io -io -iJ -iA -iM -aO -bD -iX -jk -jD -jk -ks -jn -jF -jF -zs -kc -lM -jk -jD -jk -iX -bD -mb -mj -OH -OH -OH -OH -OH -OH -OH -OH -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -dR -ec -eE -cp -fL -OF -gV -cp -bD -bD -bD -id -ip -iA -iK -iA -iM -aO -bD -iX -jl -jk -jY -iX -jn -zs -kR -jF -kc -iX -lT -jk -jl -iX -bD -mb -mj -OH -OH -mD -mJ -mo -OH -OH -OH -mE -mZ -mv -mv -XE -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -bD -ed -eF -cp -fL -oc -gV -cp -bD -eF -Uf -id -ip -iA -iK -iN -iM -id -eH -iX -iX -iX -iX -iX -jn -jF -kR -jF -lA -iX -iX -iX -iX -iX -bD -mb -NI -OH -OH -mE -mb -mi -OH -OH -OH -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -aH -bD -ee -ee -cp -fM -cp -fM -cp -bD -ee -ee -id -ip -iA -iA -iO -iM -iR -iU -iX -jm -jE -jE -jE -kD -jF -jF -lo -lB -jE -jE -jE -lX -iX -lZ -mb -ml -OH -OH -mF -mK -mP -OH -OH -OH -mU -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -aH -aO -ch -bm -bD -bD -bD -aH -ad -ad -ad -aH -aH -bD -rB -pW -cp -fL -Dl -gV -cp -bD -aO -Re -id -id -iA -iL -iA -iP -iR -iU -iY -jn -jF -jF -kt -kE -jF -jF -wa -jF -jF -jF -jF -lz -iX -bD -mb -mi -OH -OH -mF -mL -mP -OH -OH -OH -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ar -ar -ar -ar -ar -aP -ar -ar -ar -ar -bD -aH -ad -ad -ad -aH -dk -bD -eg -bD -cp -fL -OF -gV -cp -bD -dy -bD -bD -id -iB -iM -iB -iM -iS -iU -iX -jo -jF -jZ -jF -jF -jF -jF -jF -jF -jF -wa -wa -kc -iX -hD -mb -mi -OH -OH -mG -mb -mQ -OH -OH -OH -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -Uq -ts -ts -ts -ts -ar -at -at -aD -ar -aQ -aZ -bn -bE -ar -bD -aH -ad -ad -ad -aH -bD -cp -cp -eH -cp -va -gB -va -cp -eH -cp -cp -bD -id -iC -iM -iC -iM -iR -iU -iX -jn -jF -ka -ku -kF -kV -lc -lp -lp -lN -Xz -Xz -lY -aP -bD -mb -mi -OH -OH -mG -mb -mQ -OH -OH -OH -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ar -au -au -aE -aI -aR -NW -pX -bF -ar -bD -aH -aH -aH -aH -aH -cY -cp -eh -eI -eI -fN -Jw -qp -eI -hy -hL -cp -bD -id -id -id -id -id -id -eH -iX -Jc -kR -IO -iX -iX -iX -iX -iX -iX -iX -iX -iX -iX -iX -bD -aP -mi -OH -OH -mF -mM -mP -OH -OH -OH -mE -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ag -al -al -al -al -al -al -al -al -Ct -sl -gL -bG -ar -bD -bD -bD -cL -cY -dk -dy -cp -ei -eJ -fk -fO -OF -gX -hk -eJ -hM -cp -dy -bD -bD -bD -bD -bD -dZ -bD -iX -jn -jF -kc -iX -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -bD -mb -ml -OH -OH -mF -mL -mP -OH -OH -OH -mV -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ah -am -ap -ap -ap -ap -ap -an -aJ -nf -Ct -EV -bH -ar -ar -cp -cp -cM -cp -UA -cp -cp -ej -eK -eJ -eJ -OF -eJ -eJ -hz -hN -cp -cp -eH -iD -iD -iD -iD -iD -iD -iD -jq -jH -kd -iD -eH -iD -iD -iD -iD -iD -iD -iD -iD -iD -iD -iD -mi -OH -OH -mE -mb -mi -OH -OH -OH -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ai -an -an -an -as -an -an -an -an -aT -Ct -Mo -bI -bV -cf -cq -cA -cN -Bx -dl -dz -cZ -ek -eL -fl -eJ -OF -eJ -eJ -hA -hO -hZ -hZ -ir -hZ -hZ -hZ -iQ -hZ -hZ -hA -HS -HS -HS -hO -ir -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -hZ -mm -OH -OH -mH -mN -mm -OH -OH -OH -mE -mZ -mv -mv -XE -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ai -an -an -an -an -an -an -an -aK -au -be -sl -XU -EC -cg -cr -UY -KJ -cp -RI -Lm -cp -Vt -Dt -Qs -CN -gD -HW -HS -HS -HS -HS -sn -pv -HS -HS -HS -HS -HS -HS -HS -HS -HS -HS -HS -pv -HS -HS -HS -HS -HS -HS -HS -HS -HS -HS -HS -OH -OH -OH -OH -OH -OH -OH -OH -OH -mE -mY -mY -mY -mY -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -aj -ao -aq -aq -aq -aq -ay -an -aL -nf -bf -bs -bK -bX -Ct -cs -cC -cP -TD -dn -dB -da -em -eN -eJ -eJ -Nf -eJ -eJ -hB -hP -ia -ia -it -iE -ia -ia -ia -ia -ia -ia -yj -ut -HS -kv -it -ia -iE -ia -ia -ia -ia -ia -ia -iE -ia -ia -mo -OH -OH -OH -OH -OH -OH -OH -OH -mW -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ak -al -al -al -al -al -al -al -al -Ct -bg -QI -bL -ar -ar -cp -cp -cp -cp -Do -cp -cp -ei -eK -fn -eJ -Nf -eJ -eJ -hC -hM -cp -cp -eH -cp -cp -cp -cp -cp -cp -cp -js -ry -ke -cp -eH -iD -iD -iD -iD -iD -iD -iD -iD -iD -aP -iD -mp -mx -mA -mx -mx -mx -mx -mA -mx -mX -mb -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ts -ts -ts -ts -ts -ts -ts -ts -ar -av -az -aF -aM -au -pS -UO -bM -ar -aO -aO -aO -aO -aO -aO -dC -cp -ei -eJ -fo -fQ -yM -gZ -fo -eJ -hM -cp -dZ -bD -aO -aO -aO -aO -aO -aO -cp -su -jK -tE -cp -bD -dC -aO -aO -aO -aO -aO -aO -aO -dC -aO -id -mb -mb -mb -mb -mb -mb -mb -mb -mb -mb -mb -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 -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 -ts -ts -ts -ts -ts -ts -ts -ts -ar -aw -aA -aG -pS -FY -pX -VD -bN -ar -aO -aH -aH -aH -aH -aH -aO -cp -en -eO -eO -fR -Fx -ha -eO -eO -hQ -cp -bD -aH -aH -aH -aH -aH -aH -aO -cp -js -ut -ke -cp -bD -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ts -ts -Uq -ts -ts -ts -ts -ts -ar -ax -aB -aB -aB -aW -bi -bw -bO -ar -aO -aH -ad -ad -ad -aH -aO -cp -cp -cp -cp -Km -cp -Qz -cp -cp -cp -cp -bD -aH -ad -ad -ad -ad -aH -aO -cp -js -ry -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ar -ar -aC -aC -aC -ar -ar -ar -ar -ar -aO -aH -ad -ad -ad -aH -aO -aO -aH -aH -cp -fT -Nf -hc -cp -aH -aH -bD -bD -aH -ad -ad -ad -ad -aH -aO -cp -wM -cp -Qd -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -bx -bP -bx -ch -aH -ad -ad -ad -aH -aH -aO -aO -aO -aP -fT -Fx -hc -aP -bD -bD -bD -aH -aH -ad -ad -ad -ad -aH -aO -cp -js -Ub -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -wq -aH -aH -aH -aH -aH -ad -ad -ad -ad -aH -aH -aH -eP -cp -Uu -cp -WR -cp -hD -aH -aH -aH -ad -ad -ad -ad -ad -aH -aO -cp -js -ut -ke -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -cp -fT -QC -hc -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -aH -aO -cp -jt -cp -kf -cp -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aO -cp -fT -Nf -hc -cp -bD -aH -aH -aH -aH -aH -aH -ad -aH -aH -aO -iW -jh -Iv -kg -iW -bD -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -cp -fS -cp -hb -cp -bD -bD -bD -bD -bD -bD -aH -ad -aH -aO -aO -iW -jh -TC -kh -iW -bD -bD -bD -bD -bD -bD -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ts -ts -ts -ts -ts -ad -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -do -fU -rk -hd -do -do -do -do -do -do -bD -aH -ad -aH -aO -iW -iW -ju -dP -kh -iW -iW -iW -iW -iW -iW -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -VW -ok -ok -do -fp -fV -LX -he -hm -do -ok -ok -VW -do -bD -aH -ad -aH -aO -iW -iZ -jv -TC -ki -kw -jf -kW -ld -lq -lC -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -JT -ok -ok -eQ -fq -LX -LX -LX -hn -hE -ok -ok -HE -do -bD -aH -ad -aH -aO -iW -ja -vT -NF -vT -kx -kL -kX -vT -vT -lD -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -Yz -jp -si -hF -fr -LX -LX -LX -ho -hF -si -jp -Yz -do -bD -aH -ad -aH -aO -iW -ja -vT -vT -NF -kg -sq -jh -vT -Th -kg -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -"} -(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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -fr -QQ -QQ -QQ -ho -do -do -do -do -do -bD -aH -ad -aH -aO -iW -jb -vT -vT -kP -kg -jR -je -Ov -Ba -KN -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -VW -ok -ok -do -fq -LX -QQ -LX -hq -do -ok -ok -VW -do -bD -aH -ad -aH -aO -iW -jc -vT -vT -ZJ -ky -jf -jR -jR -jR -jR -iW -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -JT -ok -ok -eQ -fq -LX -QQ -LX -hn -hE -ok -ok -HE -do -bD -aH -ad -aH -aO -iW -CV -vT -NF -vT -kz -jR -kY -lf -jz -lF -iW -hD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -Yz -jp -si -hF -fr -BQ -QQ -LX -ho -hF -si -jp -Yz -do -bD -aH -ad -aH -aO -iW -ja -vT -vT -vT -kA -sq -jh -Fl -Bp -kh -aP -bD -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -ft -Or -Or -QQ -ho -do -do -do -do -do -bD -aH -ad -aH -aO -iW -ja -vT -vT -vT -kg -kL -kZ -Fl -Th -lD -iW -lW -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -AY -nC -IN -do -fu -It -CK -Gn -he -hG -hG -hG -ii -do -iF -aH -ad -aH -aO -iW -je -jx -jx -jx -ko -jf -la -lh -jx -lG -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -ok -ok -ok -eS -fq -Kg -yc -oT -LX -LX -LX -LX -hn -do -bD -aH -ad -aH -aO -iW -jf -Nu -jR -jR -jf -jf -kB -Nu -lu -jf -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -Qq -ok -ok -eS -fq -LX -qY -wN -LX -LX -LX -LX -ij -do -hD -aH -ad -aH -aO -iW -jg -jz -jS -kl -jf -kN -jz -li -lv -lH -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -xE -FB -KF -do -fv -gc -gP -gP -hr -hH -hR -hR -ik -iv -bD -aH -ad -aH -aO -iW -jh -vT -vT -km -kB -kO -dP -tv -Yx -lI -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -do -do -do -do -do -do -do -do -do -do -do -do -do -do -do -aO -aH -ad -aH -aO -iW -jh -Le -vT -kn -kB -kO -vT -qZ -vT -kg -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aH -ad -aH -aO -iW -je -jB -jx -ko -jf -je -lb -ll -lx -lJ -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -aH -aO -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -iW -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aO -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -aH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -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 -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -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 -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 -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -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 -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 -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -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 -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 -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -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 -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 -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -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 -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 -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -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 -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 -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ad -ad -ad -ad -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 -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 -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -ts -ts -ts -ts -ad -ad -ad -ad -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 -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 -ts -ts -ts -ts -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -ts -ts -ts -ad -ad -ad -ad -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 -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -ts -ts -ts -ad -ad -ad -ad -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 -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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -ts -ts -ts -ad -ad -ad -ad -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 -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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ts -ts -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -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 -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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -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 -ab -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ts -ts -ad -ad -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 -ad -ad -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -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 -ad -ad -ts -ts -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ts -ts -ts -ts -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -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 -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -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 -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -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 -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(209,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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -"} -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -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 -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -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 -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 -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -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 -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -xy -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -wF -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -qQ -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -Ws -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -Ws -ab -ab -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -Ws -Ws -Ws -ab -ab -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -Ws -Ws -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -Ws -Ws -Ws -ab -ab -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -Ws -Ws -Ws -Ws -Ws -ab -ab -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -Ws -Ws -Ws -Ws -Ws -ab -ab -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ws -Ws -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm deleted file mode 100644 index 876db8f8dcf6..000000000000 --- a/_maps/RandomZLevels/snowdin.dmm +++ /dev/null @@ -1,79265 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowdin/cave/mountain) -"ab" = ( -/obj/item/storage/medkit{ - empty = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"ac" = ( -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowdin/cave/mountain) -"ad" = ( -/turf/open/space/basic, -/area/space) -"ae" = ( -/turf/closed/mineral/snowmountain, -/area/awaymission/snowdin/cave/mountain) -"ah" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/cave) -"ai" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/cave) -"aj" = ( -/turf/closed/mineral/snowmountain, -/area/awaymission/snowdin/cave) -"an" = ( -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"ap" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"aq" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/research) -"ar" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/research) -"as" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"at" = ( -/obj/item/pickaxe, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"au" = ( -/obj/item/shard, -/obj/item/retractor, -/obj/item/cautery, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"av" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"aw" = ( -/obj/machinery/computer, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"ax" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"ay" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"az" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/research) -"aB" = ( -/obj/structure/table, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aC" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/research) -"aD" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aE" = ( -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aF" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aG" = ( -/obj/structure/table, -/obj/item/paper_bin, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aH" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aI" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aJ" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/dorm) -"aK" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/dorm) -"aL" = ( -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aM" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/item/paper/fluff/awaymissions/snowdin/research_feed, -/obj/item/paper/fluff/awaymissions/snowdin/research_feed, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aN" = ( -/obj/item/paper/fluff/awaymissions/snowdin/research_feed, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aO" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aP" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/item/paper/fluff/awaymissions/snowdin/research_feed, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"aQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aR" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/obj/item/bedsheet/purple, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aS" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/dorm) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/bedsheet/purple, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aU" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aV" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/dorm) -"aW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aX" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"aZ" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/bedsheet/orange, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"ba" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/sign/poster/contraband/kudzu{ - pixel_y = 32 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bb" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/obj/item/paper/crumpled/ruins/snowdin/dontdeadopeninside, -/obj/item/bedsheet/green, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bc" = ( -/obj/structure/window, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"bd" = ( -/obj/structure/window, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"be" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/kitchen) -"bf" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/kitchen) -"bh" = ( -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"bi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bj" = ( -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"bk" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute{ - empty = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"bl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bn" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"bo" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"bp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bq" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"br" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bs" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"bt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bv" = ( -/obj/machinery/gibber, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/kitchenspike, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bB" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"bC" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Ready Room"; - req_access_txt = "150" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"bE" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"bH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bM" = ( -/obj/effect/landmark/awaystart, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"bO" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"bP" = ( -/obj/structure/flora/tree/pine/xmas/presents, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "snowdindormresearch3"; - name = "Jouslen McGee's Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "snowdindormresearch2"; - name = "Elizabeth Queef's Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "snowdindormresearch1"; - name = "Jacob Ullman's Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "snowdindormhydro2"; - name = "Rachel Migro's Private Quarters" - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "snowdindormhydro1"; - name = "Katherine Esterdeen's Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"bV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"bW" = ( -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bX" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"bY" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"cb" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/kitchenspike, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"cd" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/kitchen) -"ce" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"ch" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"ci" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cj" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"ck" = ( -/obj/structure/table, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cm" = ( -/obj/effect/spawner/random/exotic/antag_gear, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"cn" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"co" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"cp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cr" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"cs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"ct" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"cw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"cz" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Research Desks" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"cA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"cB" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"cC" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"cD" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"cF" = ( -/obj/item/shard, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"cG" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock"; - req_access_txt = "48" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"cH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"cI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"cJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock{ - name = "Freezer" - }, -/obj/structure/barricade/wooden, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"cK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/kitchen/fork, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box{ - illustration = "donk_kit"; - name = "box of donkpockets" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"cS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/food/egg_smudge, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"cT" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"cV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"cW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"cZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/item/trash/can, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"da" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"db" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"dd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"df" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"dg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Research Desks" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"dh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"di" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"dj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"dk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"dl" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"dn" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"do" = ( -/obj/structure/closet/secure_closet/freezer/meat/open, -/obj/structure/spider/stickyweb, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"dp" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/kitchen) -"dq" = ( -/obj/structure/spider/stickyweb, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"ds" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"dt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/food/flour, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"du" = ( -/obj/machinery/deepfryer, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dv" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dw" = ( -/obj/machinery/deepfryer, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dx" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/crate{ - name = "explosives ordinance" - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"dy" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"dA" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"dB" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"dC" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"dD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"dE" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"dG" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"dH" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"dK" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post) -"dL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"dM" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post) -"dN" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/messhall) -"dO" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/messhall) -"dP" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/messhall) -"dQ" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "35" - }, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/storage/box{ - illustration = "donk_kit"; - name = "box of donkpockets" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dT" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/enzyme, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"dU" = ( -/obj/structure/table, -/obj/item/knife/kitchen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"dV" = ( -/obj/effect/decal/cleanable/food/egg_smudge, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"dW" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"dX" = ( -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"dY" = ( -/obj/structure/ladder/unbreakable{ - height = 1; - id = "snowdin" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"ea" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"eb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/sign/poster/contraband/lusty_xenomorph{ - pixel_x = 32 - }, -/obj/structure/table/wood, -/obj/item/paper_bin, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"ec" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/dorm) -"ed" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"ee" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"eh" = ( -/obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/obj/item/bedsheet/red, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"ei" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post) -"ej" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"ek" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"el" = ( -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"eo" = ( -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/outside) -"ep" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"er" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks/beer, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"es" = ( -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"et" = ( -/obj/machinery/vending/boozeomat, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"eu" = ( -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"ex" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"ey" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"ez" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"eB" = ( -/obj/effect/decal/cleanable/food/flour, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"eC" = ( -/obj/item/knife/kitchen{ - pixel_x = 6; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"eD" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"eE" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/snowdin/outside) -"eF" = ( -/obj/structure/mineral_door/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"eG" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"eH" = ( -/obj/structure/barricade/wooden, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"eI" = ( -/obj/item/crowbar, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"eJ" = ( -/turf/closed/mineral/snowmountain/cavern, -/area/awaymission/snowdin/cave/cavern) -"eK" = ( -/turf/closed/wall/mineral/cult, -/area/awaymission/snowdin/cave/cavern) -"eL" = ( -/turf/closed/mineral/plasma/ice, -/area/awaymission/snowdin/cave/cavern) -"eN" = ( -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"eO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"eP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"eQ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/dorm) -"eR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"eS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"eT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock{ - id_tag = "snowdindormsec"; - name = "James Reed's Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"eU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"eV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/trash/cheesie, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"eW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/trash/cheesie, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"eX" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"eY" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"eZ" = ( -/obj/structure/table, -/obj/item/bedsheet/purple, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"fa" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"fd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"fe" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/bot_white, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"ff" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post/gateway) -"fg" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/gateway) -"fh" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/gateway) -"fi" = ( -/obj/structure/barricade/wooden/crude, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"fj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "35" - }, -/obj/machinery/door/firedoor, -/obj/structure/barricade/wooden/crude, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"fk" = ( -/obj/machinery/smartfridge, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"fl" = ( -/obj/structure/table, -/obj/machinery/door/firedoor, -/obj/structure/barricade/wooden/crude, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"fm" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/hydro) -"fn" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/wood{ - amount = 15 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"fo" = ( -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"fp" = ( -/obj/structure/rack, -/obj/item/grown/log/tree, -/obj/item/grown/log/tree{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/grown/log/tree{ - pixel_x = -2; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"fr" = ( -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"fs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"ft" = ( -/obj/structure/sign/poster/official/no_erp{ - pixel_x = -32 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/dorm) -"fu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"fw" = ( -/obj/machinery/sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"fx" = ( -/obj/item/reagent_containers/blood, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"fy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"fz" = ( -/obj/item/flashlight/pen, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"fA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"fD" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"fF" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"fG" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"fJ" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"fK" = ( -/obj/structure/table/reinforced, -/obj/item/trash/raisins, -/obj/structure/barricade/wooden/crude, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"fL" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/fork, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"fM" = ( -/obj/structure/table_frame, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"fN" = ( -/obj/structure/table_frame, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"fO" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"fP" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"fQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"fR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"fS" = ( -/obj/item/knife/kitchen, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"fV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/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/iron, -/area/awaymission/snowdin/post/hydro) -"fW" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/hydro) -"fX" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/garage) -"fY" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/garage) -"fZ" = ( -/obj/structure/table/wood, -/obj/item/hatchet, -/obj/item/hatchet{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"ga" = ( -/obj/structure/barricade/wooden/snowed, -/obj/structure/spider/stickyweb, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"gb" = ( -/obj/structure/table/wood, -/obj/item/storage/toolbox/mechanical/old, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"gc" = ( -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"ge" = ( -/turf/closed/mineral/iron/ice, -/area/awaymission/snowdin/cave/cavern) -"gf" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"gh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"gi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"gj" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"gk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/pickaxe/mini, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"gl" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave/mountain) -"gm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/closet/crate, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"gn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"go" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"gp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"gq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"gr" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"gu" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"gv" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"gw" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"gx" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"gy" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"gA" = ( -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"gB" = ( -/obj/effect/decal/cleanable/food/pie_smudge, -/obj/item/trash/can, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"gD" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"gE" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_y = 3 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 7; - pixel_y = 7 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gG" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gH" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"gI" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"gJ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gK" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gL" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"gM" = ( -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"gN" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"gO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/structure/cable, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/garage) -"gP" = ( -/obj/machinery/power/terminal, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"gS" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"gT" = ( -/obj/item/clothing/head/cone, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"gU" = ( -/obj/effect/decal/remains/human, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"gV" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"gW" = ( -/turf/closed/mineral/diamond/ice, -/area/awaymission/snowdin/cave/cavern) -"gZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/trash/can, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"ha" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"hb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"hc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"hd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"he" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"hg" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"hj" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"hk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hl" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"hm" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hn" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hp" = ( -/obj/item/chair, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hq" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hr" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"hs" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"ht" = ( -/obj/structure/table, -/obj/item/trash/waffles, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hu" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hv" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"hw" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"hy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"hA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"hB" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"hC" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"hD" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"hE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"hF" = ( -/obj/structure/destructible/cult/pylon, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"hG" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/captain{ - name = "overseer's winter coat" - }, -/obj/item/clothing/shoes/winterboots, -/obj/item/key/atv, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"hH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"hI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"hJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock{ - id_tag = "snowdindormcap"; - name = "Overseer's Private Quarters" - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"hK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/dorm) -"hL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"hM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"hN" = ( -/obj/structure/grille/broken, -/obj/item/shard{ - icon_state = "medium" - }, -/obj/item/stack/rods{ - amount = 2 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"hO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "45" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"hP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"hQ" = ( -/obj/structure/window, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/landmark/awaystart, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hS" = ( -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/loading_area, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hU" = ( -/obj/structure/window, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"hV" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"hX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"hY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"hZ" = ( -/obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash, -/obj/item/storage/box/rubbershot, -/obj/structure/fireaxecabinet/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"ib" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"ic" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/garage) -"id" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/garage) -"ie" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/garage) -"if" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"ih" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"ii" = ( -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"ij" = ( -/obj/item/clothing/head/cone, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"ik" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"im" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/structure/spawner/nether{ - max_mobs = 5 - }, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"in" = ( -/mob/living/simple_animal/hostile/netherworld/blankbody{ - desc = "It's Caleb Reed, but their flesh has an ashy texture, and their face is featureless save an eerie smile."; - name = "Caleb Reed" - }, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"io" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"ip" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"iq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"ir" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"is" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Dorms" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"it" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"iu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"iv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"iw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/sign/departments/medbay{ - pixel_y = 32 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"ix" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"iy" = ( -/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/iron, -/area/awaymission/snowdin/post) -"iz" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"iA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"iB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/effect/landmark/awaystart, -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"iC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"iD" = ( -/obj/structure/table, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"iE" = ( -/obj/item/trash/candy, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"iF" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"iG" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"iH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"iI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"iJ" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"iL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"iM" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"iN" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iP" = ( -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iR" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Garage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"iU" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Garage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"iV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"iW" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"iZ" = ( -/obj/item/clothing/head/cone, -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"jb" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"je" = ( -/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 = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"jf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"jg" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"jh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"ji" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"jj" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"jk" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Dorms" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"jl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"jm" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"jo" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"js" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jt" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"ju" = ( -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"jv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"jw" = ( -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/obj/item/paper/pamphlet/gateway{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/paper/pamphlet/gateway{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"jx" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"jy" = ( -/obj/structure/table, -/obj/item/trash/candle, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"jz" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/kitchen/fork, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"jC" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"jD" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"jE" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/awaystart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"jF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"jG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"jH" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"jI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"jJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"jK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"jL" = ( -/obj/vehicle/ridden/atv, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"jM" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical/old, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"jO" = ( -/mob/living/simple_animal/hostile/netherworld/blankbody{ - desc = "It's Jacob Ullman, but their flesh has an ashy texture, and their face is featureless save an eerie smile."; - name = "Jacob Ullman" - }, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"jP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"jQ" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post/custodials) -"jR" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/custodials) -"jT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"jU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"jV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"jW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"jX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"jY" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "snowdin_gate" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"jZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "snowdin_gate" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"ka" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"kc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"kd" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"ke" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Ready Room"; - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"kg" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"kh" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"ki" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"kj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"kk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"kl" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"km" = ( -/obj/structure/sign/poster/contraband/tools{ - pixel_x = 32 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/tank/internals/plasma, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"kr" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"ku" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/cave/mountain) -"kv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/shower{ - pixel_y = 25 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/machinery/shower{ - pixel_y = 25 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/shower{ - pixel_y = 25 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"ky" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Showers" - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"kF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"kG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"kI" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"kJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"kK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"kL" = ( -/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 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"kM" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Mess Hall" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"kN" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"kO" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"kP" = ( -/obj/item/trash/candy, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"kQ" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"kR" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"kS" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"kT" = ( -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"kU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"kV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"kW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"kX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"kY" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"kZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lb" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lc" = ( -/obj/vehicle/ridden/atv, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"ld" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lk" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"ll" = ( -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"lm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/janitorialcart, -/obj/item/mop, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"ln" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"lo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/snowdin_station_sign/up, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/two, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/three, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/four, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"ls" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/five, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/six, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/snowdin_station_sign/up/seven, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"lx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"ly" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Mess Hall" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"lz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"lA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"lB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"lC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"lD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"lE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "35" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"lF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"lG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"lH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"lI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"lJ" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/item/paper/crumpled/ruins/snowdin/foreshadowing, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"lK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"lL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"lM" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lN" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"lP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"lQ" = ( -/obj/machinery/door/airlock{ - name = "Mechanic's Quarters" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"lR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"lU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lV" = ( -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lW" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lX" = ( -/obj/machinery/door/airlock{ - name = "Private Stall" - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"lY" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/custodials) -"lZ" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"ma" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"mb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"mc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Custodial Closet" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"md" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"me" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/snowdin_station_sign, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mg" = ( -/obj/effect/turf_decal/snowdin_station_sign/two, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mh" = ( -/obj/effect/turf_decal/snowdin_station_sign/three, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mi" = ( -/obj/effect/turf_decal/snowdin_station_sign/four, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mj" = ( -/obj/effect/turf_decal/snowdin_station_sign/five, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mk" = ( -/obj/effect/turf_decal/snowdin_station_sign/six, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"ml" = ( -/obj/effect/turf_decal/snowdin_station_sign/seven, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"mo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"mp" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"mq" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "35" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"mr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"ms" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"mt" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"mv" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"mw" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/weather/snow, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"my" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"mz" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"mA" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/awaystart, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"mB" = ( -/obj/item/storage/toolbox/electrical, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"mC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"mE" = ( -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"mF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"mG" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"mI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"mJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mL" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mM" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"mN" = ( -/obj/structure/table/wood, -/obj/item/trash/candy, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"mO" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"mP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering"; - req_access_txt = "32" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"mQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"mR" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"mS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"mT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"mU" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots{ - pixel_x = 2; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"mV" = ( -/obj/structure/table, -/obj/item/key/atv, -/obj/item/key/atv, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"mX" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"mY" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"na" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/custodials) -"nb" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"nc" = ( -/obj/structure/fence{ - pixel_x = 16 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"nd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"ne" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"nf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"ng" = ( -/obj/structure/flora/grass/both, -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"nh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"ni" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"nj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"nl" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post/engineering) -"no" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"np" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nq" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"nr" = ( -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"ns" = ( -/obj/machinery/computer/monitor/secret, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nt" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/engineering) -"nu" = ( -/obj/machinery/vending/hydronutrients, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"nv" = ( -/obj/machinery/vending/hydroseeds, -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"nw" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/watertank, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"nx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"ny" = ( -/obj/structure/barricade/sandbags, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"nA" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"nB" = ( -/obj/machinery/door/poddoor/shutters{ - id = "snowdingarage1"; - name = "garage door" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"nC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"nD" = ( -/obj/structure/closet/jcloset, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"nE" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/secpost) -"nF" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/secpost) -"nH" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"nJ" = ( -/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/iron, -/area/awaymission/snowdin/post) -"nK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"nL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"nM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"nN" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/engineering) -"nO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"nP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"nQ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nS" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"nT" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nU" = ( -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"nV" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/hydro) -"nW" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/hydro) -"nX" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "35" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"nY" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"oa" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"ob" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/secpost) -"oc" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/secpost) -"of" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"og" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oh" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"ol" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/warning/electricshock{ - pixel_x = -32 - }, -/obj/structure/cable, -/obj/machinery/power/smes/engineering, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"om" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"on" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"oo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"op" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"oq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = -1; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"or" = ( -/obj/structure/table, -/obj/item/cultivator, -/obj/item/cultivator{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"os" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"ou" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"ov" = ( -/obj/structure/flora/grass/both, -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"ow" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/cavern2) -"ox" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/cavern2) -"oy" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oz" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oA" = ( -/obj/machinery/door/window/brigdoor/left/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oG" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"oH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/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/iron, -/area/awaymission/snowdin/post) -"oJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"oK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"oL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/blood/old, -/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/iron, -/area/awaymission/snowdin/post) -"oM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"oN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"oO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"oP" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"oQ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/mechanical, -/obj/structure/sign/warning/enginesafety{ - pixel_x = 32 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"oR" = ( -/obj/structure/table, -/obj/item/hatchet{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/hatchet, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"oS" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/wrench, -/obj/item/reagent_containers/glass/bucket, -/obj/item/wirecutters, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"oT" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"oU" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"oV" = ( -/obj/structure/closet/secure_closet/hydroponics, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"oW" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/engineering) -"oX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/engineering) -"pa" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/cavern2) -"pb" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"pc" = ( -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"pd" = ( -/obj/structure/bed, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"pe" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"pf" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"pg" = ( -/obj/structure/table, -/obj/machinery/microwave, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"pj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/sign/poster/official/do_not_question{ - pixel_y = -32 - }, -/obj/item/wirecutters, -/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/iron, -/area/awaymission/snowdin/post/secpost) -"pk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/screwdriver, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"pm" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"pn" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"po" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"pp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post) -"pq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"pr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"ps" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"pt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"pu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"px" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"py" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/storage/toolbox/electrical{ - pixel_x = 4; - pixel_y = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"pz" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pA" = ( -/turf/closed/wall, -/area/awaymission/snowdin/cave/cavern) -"pB" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"pC" = ( -/obj/item/chair, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"pD" = ( -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"pE" = ( -/turf/closed/wall/mineral/cult, -/area/awaymission/snowdin/post/cavern2) -"pF" = ( -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"pG" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"pH" = ( -/turf/closed/wall/r_wall, -/area/awaymission/snowdin/post/secpost) -"pI" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/snowdin/post/secpost) -"pJ" = ( -/obj/machinery/door/airlock/vault{ - name = "Armory"; - req_access_txt = "3" - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"pK" = ( -/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/iron, -/area/awaymission/snowdin/post/secpost) -"pL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"pM" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/item/paper/fluff/awaymissions/snowdin/profile/engi1, -/obj/item/paper/fluff/awaymissions/snowdin/profile/hydro1, -/obj/item/paper/fluff/awaymissions/snowdin/profile/overseer, -/obj/item/paper/fluff/awaymissions/snowdin/profile/research1, -/obj/item/paper/fluff/awaymissions/snowdin/profile/research2, -/obj/item/paper/fluff/awaymissions/snowdin/profile/research3, -/obj/item/paper/fluff/awaymissions/snowdin/profile/sec1, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"pN" = ( -/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 = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"pO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"pP" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"pQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"pR" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/suit/hooded/wintercoat, -/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/iron, -/area/awaymission/snowdin/post) -"pS" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"pT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"pV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"pW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"pX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"pZ" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qa" = ( -/obj/machinery/light/directional/north, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qb" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qc" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qd" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/clothing/head/welding, -/obj/item/weldingtool/largetank, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/turf/closed/wall, -/area/awaymission/snowdin/post/engineering) -"qf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 9 - }, -/obj/structure/cable, -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qg" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"qh" = ( -/obj/structure/fence, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"qi" = ( -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"qk" = ( -/obj/structure/closet/cabinet, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"ql" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"qm" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"qn" = ( -/obj/structure/guncase/shotgun, -/obj/item/gun/ballistic/shotgun/automatic, -/obj/item/gun/ballistic/shotgun/automatic, -/obj/item/gun/ballistic/shotgun/automatic, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"qo" = ( -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"qp" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"qq" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"qr" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/barricade/wooden/crude, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"qs" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/barricade/wooden/crude, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"qt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qv" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ - name = "Air Mix To Turbine Mix" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qx" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible{ - dir = 10 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qB" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qD" = ( -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"qF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/cavern2) -"qG" = ( -/obj/machinery/door/airlock{ - name = "Private Quarters" - }, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"qH" = ( -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"qI" = ( -/obj/structure/closet/secure_closet/freezer/fridge/open, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"qK" = ( -/obj/structure/rack, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"qL" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post) -"qM" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"qN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"qP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qS" = ( -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"qT" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 6 - }, -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "snowdin_turbine_exterior"; - idInterior = "snowdin_turbine_interior"; - idSelf = "snowdin_turbine_access"; - name = "Turbine Access Console"; - pixel_x = -8; - pixel_y = -26; - req_access_txt = "32" - }, -/obj/machinery/button/ignition{ - id = "snowdin_turbine_ignitor"; - pixel_x = 6; - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qX" = ( -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("snowdinmix" = "Mix Chamber"); - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"qY" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"qZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"ra" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("snowdino2" = "Oxygen Supply"); - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"rb" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("snowdinn2" = "Nitrogen Supply"); - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"rc" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"re" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rf" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern2) -"rh" = ( -/obj/structure/window, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"ri" = ( -/obj/structure/window, -/obj/structure/table, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/cavern2) -"rk" = ( -/obj/structure/rack, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"rm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"rn" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots{ - pixel_x = 2; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"ro" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/engineering) -"rp" = ( -/turf/closed/wall/r_wall, -/area/awaymission/snowdin/post/engineering) -"rq" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/glass{ - autoclose = 0; - frequency = 1449; - heat_proof = 1; - id_tag = "snowdin_turbine_exterior"; - name = "Turbine Exterior Airlock"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/snowdin/post/engineering) -"rr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/closed/wall/r_wall, -/area/awaymission/snowdin/post/engineering) -"rs" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"rt" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"rw" = ( -/obj/structure/fence, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"rx" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"ry" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rz" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern2) -"rF" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"rG" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"rH" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/barricade/wooden/crude/snow, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"rI" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/engineering) -"rJ" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"rK" = ( -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/snowdin/post/engineering) -"rL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"rM" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "snowdinmix"; - dir = 1 - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/post/engineering) -"rN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "snowdinmix"; - dir = 1 - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/post/engineering) -"rO" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "snowdino2"; - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/awaymission/snowdin/post/engineering) -"rP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "snowdino2"; - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/awaymission/snowdin/post/engineering) -"rQ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "snowdinn2"; - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/awaymission/snowdin/post/engineering) -"rR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "snowdinn2"; - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/awaymission/snowdin/post/engineering) -"rS" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"rT" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"rU" = ( -/obj/structure/fence, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"rV" = ( -/obj/structure/lattice/catwalk, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"rW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/plasma/unanchored, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"rY" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/exotic/snow_gear, -/obj/effect/spawner/random/exotic/snow_gear, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"rZ" = ( -/mob/living/simple_animal/hostile/netherworld/migo, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"sa" = ( -/obj/machinery/holopad, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"sb" = ( -/obj/structure/spawner/nether{ - max_mobs = 4; - name = "weak netherworld link" - }, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"sc" = ( -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"sd" = ( -/obj/machinery/power/port_gen/pacman, -/obj/machinery/power/terminal{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"sg" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/glass{ - autoclose = 0; - frequency = 1449; - heat_proof = 1; - id_tag = "snowdin_turbine_interior"; - name = "Turbine Interior Airlock"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/awaymission/snowdin/post/engineering) -"sh" = ( -/obj/machinery/air_sensor{ - chamber_id = "snowdinmix" - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/post/engineering) -"sj" = ( -/obj/machinery/air_sensor{ - chamber_id = "snowdino2" - }, -/turf/open/floor/engine/o2, -/area/awaymission/snowdin/post/engineering) -"sk" = ( -/obj/machinery/air_sensor{ - chamber_id = "snowdinn2" - }, -/turf/open/floor/engine/n2, -/area/awaymission/snowdin/post/engineering) -"sl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"sn" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/plasma/spawner/east, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"so" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/plasma/spawner/west, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"sp" = ( -/obj/structure/fence/door{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"ss" = ( -/obj/structure/cable, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"st" = ( -/mob/living/simple_animal/hostile/skeleton/ice, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"su" = ( -/obj/machinery/door/airlock/maintenance{ - name = "SMES Storage"; - req_access_txt = "32" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"sv" = ( -/obj/machinery/computer/monitor/secret{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"sz" = ( -/obj/machinery/door/poddoor{ - id = "snowdinturbinegas"; - name = "Turbine Gas Release" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"sA" = ( -/obj/machinery/air_sensor{ - chamber_id = "snowdinincin" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"sB" = ( -/obj/machinery/igniter{ - id = "snowdin_turbine_ignitor" - }, -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"sC" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "snowdinincin"; - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"sD" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sF" = ( -/obj/structure/fence, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/plasma/spawner/north, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"sI" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"sJ" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"sK" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"sO" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sP" = ( -/obj/structure/fence/corner, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"sQ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"sR" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"sS" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"sT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"sU" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/computer{ - desc = "A console meant for calling and sending a transit ferry. It seems iced-over and non-functional."; - dir = 4; - icon_screen = null; - name = "Shuttle Transist Console" - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"sZ" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"ta" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"tb" = ( -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"tc" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"td" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"te" = ( -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"tf" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"tg" = ( -/obj/machinery/door/poddoor{ - id = "snowdinturbineoutlet"; - name = "Turbine Outlet" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"th" = ( -/obj/structure/rack, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"ti" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"tk" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"tl" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"tp" = ( -/turf/closed/wall/mineral/snow, -/area/awaymission/snowdin/cave/cavern) -"tq" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/outside) -"ts" = ( -/obj/structure/flora/tree/dead, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"tt" = ( -/mob/living/simple_animal/hostile/skeleton/templar, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"tu" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"tv" = ( -/obj/structure/barricade/wooden/crude/snow, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"tz" = ( -/mob/living/simple_animal/hostile/skeleton/ice, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"tE" = ( -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowdin/cave) -"tF" = ( -/turf/closed/mineral/snowmountain, -/area/awaymission/snowdin/outside) -"tG" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/mineral/snowmountain, -/area/awaymission/snowdin/cave) -"tR" = ( -/obj/structure/barricade/wooden/snowed, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"tY" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/cavern1) -"tZ" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/cavern1) -"uc" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"ue" = ( -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"ug" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"ui" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"uj" = ( -/obj/machinery/computer/monitor/secret, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uk" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"ul" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"um" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"un" = ( -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/cavern2) -"ur" = ( -/obj/machinery/door/airlock{ - name = "Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"us" = ( -/obj/machinery/door/airlock/maintenance{ - name = "SMES Storage"; - req_access_txt = "32" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"ux" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/cavern1) -"uz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uA" = ( -/obj/machinery/power/port_gen/pacman, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uB" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uC" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"uD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/cavern1) -"uF" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uG" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uI" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/cavern1) -"uK" = ( -/obj/structure/cable, -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uM" = ( -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uN" = ( -/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 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uO" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uS" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"uU" = ( -/obj/item/chair, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uV" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"uZ" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"va" = ( -/obj/structure/girder, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"vb" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"vc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/cavern1) -"vd" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"ve" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"vf" = ( -/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, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"vh" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"vi" = ( -/obj/structure/closet/crate/wooden, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"vj" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"vn" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"vo" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"vp" = ( -/obj/machinery/door/airlock{ - name = "Bathroom" - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern1) -"vr" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"vs" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"vt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"vu" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"vw" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern1) -"vx" = ( -/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/iron, -/area/awaymission/snowdin/post/cavern1) -"vy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"vA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/cavern1) -"vB" = ( -/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 = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"vC" = ( -/obj/structure/rack, -/obj/machinery/light/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"vD" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/structure/curtain, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern1) -"vE" = ( -/obj/structure/toilet{ - dir = 1 - }, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern1) -"vG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/cavern1) -"vL" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/snowdin/post/broken_shuttle) -"vM" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/broken_shuttle) -"vN" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/effect/baseturf_helper/asteroid/snow, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/broken_shuttle) -"vR" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/awaymission/snowdin/post/broken_shuttle) -"vT" = ( -/obj/structure/chair, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"vU" = ( -/obj/item/chair, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"vX" = ( -/obj/machinery/door/airlock/shuttle, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"vY" = ( -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"wb" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"wc" = ( -/obj/machinery/computer{ - desc = "A console meant for calling and sending a transit ferry. It seems iced-over and non-functional."; - dir = 1; - icon_screen = null; - name = "Shuttle Transist Console" - }, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"wd" = ( -/obj/item/shard, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"wm" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - desc = "A turret built with substandard parts and run down further with age."; - dir = 9; - faction = list("pirate") - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"ws" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"wD" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_dock) -"wE" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/mining_dock) -"wG" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wH" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wJ" = ( -/obj/machinery/computer/monitor/secret, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wK" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wL" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wM" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wN" = ( -/obj/structure/spider/stickyweb, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"wO" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wP" = ( -/turf/closed/wall/mineral/cult, -/area/awaymission/snowdin/post/mining_dock) -"wQ" = ( -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/snowdin/cave/mountain) -"wR" = ( -/obj/machinery/door/airlock/maintenance{ - name = "SMES Storage"; - req_access_txt = "32" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"wS" = ( -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/snowdin/cave) -"wT" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"wU" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/warning/docking{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"wV" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/cavern1) -"wW" = ( -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"wX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"wY" = ( -/obj/structure/cable, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"xa" = ( -/obj/effect/turf_decal/stripes/white/line, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xe" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xf" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xh" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"xi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"xj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/spawner/nether{ - max_mobs = 4; - name = "weak netherworld link" - }, -/obj/structure/cable, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"xk" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xl" = ( -/turf/open/floor/plating/elevatorshaft{ - initial_gas = "o2=22;n2=82;TEMP=180" - }, -/area/awaymission/snowdin/cave) -"xn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 10 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xp" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xq" = ( -/obj/machinery/light/small/broken/directional/east, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/cavern1) -"xs" = ( -/obj/item/gun/energy/e_gun{ - dead_cell = 1 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier{ - brute_damage = 145; - mob_name = "James Reed"; - name = "James Reed"; - oxy_damage = 55 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"xw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"xx" = ( -/obj/machinery/door/airlock/vault{ - name = "Relic Storage"; - req_access_txt = "3" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xy" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xz" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille/broken, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/mob/living/simple_animal/hostile/netherworld/migo, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xC" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xD" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 6 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xH" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/grey{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"xI" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xK" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 6; - id = "snowdin_excavation_top"; - name = "snowdin excavation top"; - roundstart_template = /datum/map_template/shuttle/snowdin/excavation; - width = 6 - }, -/turf/open/floor/plating/elevatorshaft{ - initial_gas = "o2=22;n2=82;TEMP=180" - }, -/area/awaymission/snowdin/cave) -"xL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"xO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"xP" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 3; - height = 6; - id = "snowdin_excavation_down"; - name = "snowdin excavation down"; - width = 6 - }, -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_dock) -"xQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_dock) -"xS" = ( -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma{ - amount = 3 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"xT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 5 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"xU" = ( -/obj/structure/bed{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/ice{ - name = "Privateer Jones" - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"xV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4 - }, -/turf/closed/mineral/snowmountain/cavern, -/area/awaymission/snowdin/cave/cavern) -"xW" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_dock) -"xY" = ( -/obj/effect/spawner/structure/window/reinforced, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"ya" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"yc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yd" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yf" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"yg" = ( -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/cave) -"yi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/fence, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"yj" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/crate, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"yl" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"yo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yp" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"yq" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/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/smart/manifold4w/orange/visible, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"yt" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"yu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 8; - name = "plasma vent" - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/cave) -"yv" = ( -/turf/closed/wall/mineral/snow, -/area/awaymission/snowdin/outside) -"yx" = ( -/obj/structure/closet/crate, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"yy" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"yz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"yA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"yC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_dock) -"yD" = ( -/obj/structure/fence{ - pixel_x = 16 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/outside) -"yE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"yF" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"yG" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"yH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 5 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"yL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"yM" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"yO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/fence/door{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"yP" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"yQ" = ( -/obj/structure/sign/warning/docking{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"yS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"yT" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"yW" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/minipost) -"yX" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/minipost) -"yY" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/minipost) -"yZ" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post/minipost) -"za" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 4; - name = "plasma vent" - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/cave) -"zc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"zd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"ze" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 9 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"zf" = ( -/obj/structure/rack, -/obj/item/pickaxe/drill, -/obj/item/pickaxe/drill{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"zj" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/fence/corner{ - dir = 9 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"zk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/fence/corner, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"zl" = ( -/obj/structure/lattice/catwalk, -/obj/structure/window/reinforced/plasma/spawner/north, -/obj/structure/window/reinforced/plasma/unanchored, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"zm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zn" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zo" = ( -/obj/machinery/door/poddoor/shutters{ - id = "snowdingarage2"; - name = "garage door" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zp" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zq" = ( -/obj/vehicle/ridden/atv{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zt" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/mineral/wood, -/area/awaymission/snowdin/igloo) -"zu" = ( -/turf/closed/wall/mineral/wood, -/area/awaymission/snowdin/igloo) -"zw" = ( -/obj/structure/rack, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zy" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zz" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"zC" = ( -/obj/structure/rack, -/obj/item/grown/log/tree, -/obj/item/grown/log/tree{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/grown/log/tree{ - pixel_x = -2; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"zD" = ( -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"zE" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/wood{ - amount = 15 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"zG" = ( -/obj/machinery/space_heater, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4 - }, -/obj/machinery/space_heater, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4 - }, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_dock) -"zJ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/mining_dock) -"zL" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Garage" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zM" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"zN" = ( -/obj/structure/rack, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"zQ" = ( -/obj/item/hatchet{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"zR" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zS" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"zT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/fence/corner{ - dir = 6 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"zU" = ( -/obj/structure/girder, -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"zV" = ( -/obj/structure/filingcabinet, -/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/iron, -/area/awaymission/snowdin/post/minipost) -"zW" = ( -/obj/structure/filingcabinet, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"zX" = ( -/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/iron, -/area/awaymission/snowdin/post/minipost) -"zY" = ( -/obj/effect/turf_decal/bot, -/obj/structure/ore_box, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"zZ" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall/mineral/snow, -/area/awaymission/snowdin/igloo) -"Aa" = ( -/turf/closed/wall/mineral/snow, -/area/awaymission/snowdin/igloo) -"Ac" = ( -/obj/structure/table/wood, -/obj/item/hatchet{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"Ad" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/fence/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Ae" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Ag" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Ah" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Ai" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Aj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"Ak" = ( -/obj/structure/table, -/obj/item/paper_bin, -/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/iron, -/area/awaymission/snowdin/post/minipost) -"Am" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Ao" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"Ap" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/fence, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Ar" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/fence/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"As" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/fence/door, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"At" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Av" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Aw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/minipost) -"Ax" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Ay" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"Az" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"AA" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"AC" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"AD" = ( -/turf/open/floor/plating{ - initial_gas = "o2=22;n2=82;TEMP=180" - }, -/area/awaymission/snowdin/outside) -"AE" = ( -/obj/item/pen, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"AF" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"AG" = ( -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/minipost) -"AH" = ( -/obj/structure/bed, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/minipost) -"AI" = ( -/obj/structure/bonfire/prelit{ - burn_icon = "bonfire_warm" - }, -/obj/effect/light_emitter{ - light_color = "#FAA019"; - light_outer_range = 4; - name = "fire light" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"AK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/fence/door, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"AL" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/fence/corner, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"AM" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"AN" = ( -/obj/item/key/atv, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"AO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"AP" = ( -/obj/machinery/door/airlock{ - id_tag = "snowdindormabandoned1"; - name = "Private Quarters" - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/minipost) -"AQ" = ( -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/minipost) -"AR" = ( -/obj/structure/girder, -/obj/item/stack/sheet/iron, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/minipost) -"AU" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"AW" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"AX" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"AY" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/suit/hooded/wintercoat, -/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/iron, -/area/awaymission/snowdin/post/minipost) -"AZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"Ba" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/minipost) -"Bb" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Be" = ( -/obj/effect/landmark/awaystart, -/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/iron, -/area/awaymission/snowdin/post/minipost) -"Bf" = ( -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Bh" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"Bi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/fence/door, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Bj" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Bk" = ( -/obj/item/clothing/neck/stethoscope, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"Bl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"Bo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Bp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Bq" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Br" = ( -/obj/machinery/computer/monitor/secret, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Bs" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"Bu" = ( -/obj/structure/table, -/obj/item/clothing/glasses/hud/health, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"Bv" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Bw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/loading_area, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Bx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"By" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Bz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BA" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"BC" = ( -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma{ - amount = 3 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"BD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/fence/corner{ - dir = 10 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BF" = ( -/obj/structure/lattice/catwalk, -/obj/structure/fence/door, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"BG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BH" = ( -/obj/structure/fence, -/turf/closed/mineral/snowmountain/cavern, -/area/awaymission/snowdin/cave/cavern) -"BI" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"BJ" = ( -/mob/living/simple_animal/hostile/netherworld/blankbody{ - desc = "It's Caleb Reed, but their flesh has an ashy texture, and their face is featureless save an eerie smile."; - name = "Caleb Reed" - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"BK" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"BM" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"BN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 9 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"BO" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BP" = ( -/obj/structure/lattice/catwalk, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/lava/plasma, -/area/awaymission/snowdin/cave/cavern) -"BQ" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 10 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"BT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BU" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"BV" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"BY" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"BZ" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Ca" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Cb" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Cc" = ( -/obj/structure/fence/door, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Cd" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/fence{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Ce" = ( -/obj/effect/turf_decal/bot, -/obj/structure/closet/crate{ - name = "explosives ordinance" - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Cj" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/mining, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Ck" = ( -/obj/structure/fence/door, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Cl" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/cave/cavern) -"Ct" = ( -/turf/closed/wall/mineral/plastitanium, -/area/awaymission/snowdin/outside) -"Cu" = ( -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Cv" = ( -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Cx" = ( -/obj/machinery/light/small/broken/directional/west, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"CA" = ( -/obj/structure/bonfire/prelit{ - burn_icon = "bonfire_warm" - }, -/obj/effect/light_emitter{ - light_color = "#FAA019"; - light_outer_range = 4; - name = "fire light" - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"CC" = ( -/turf/closed/wall/mineral/plastitanium, -/area/awaymission/snowdin/cave) -"CD" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/awaymission/snowdin/cave) -"CE" = ( -/obj/structure/girder, -/obj/item/stack/sheet/mineral/plastitanium, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"CH" = ( -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CI" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CJ" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CK" = ( -/obj/structure/closet/syndicate{ - desc = "It's a storage unit for a Syndicate boarding party." - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CL" = ( -/obj/structure/closet/syndicate{ - desc = "It's a storage unit for a Syndicate boarding party." - }, -/obj/effect/turf_decal/bot_white, -/obj/item/gun/ballistic/automatic/pistol, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CO" = ( -/obj/machinery/recharge_station, -/turf/open/floor/circuit/red, -/area/awaymission/snowdin/cave) -"CP" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"CQ" = ( -/obj/structure/shuttle/engine/propulsion/left{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"CS" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/post/mining_main) -"CT" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CW" = ( -/obj/item/shard, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"CX" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/landmark/awaystart, -/obj/item/bedsheet/nanotrasen{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"CZ" = ( -/obj/structure/frame/machine, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/turf/open/floor/circuit/red, -/area/awaymission/snowdin/cave) -"Da" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"De" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/built/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Df" = ( -/obj/item/stack/rods, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Dg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/shard, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Dh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Di" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Dl" = ( -/obj/structure/shuttle/engine/propulsion/right{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Dm" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/structure/fence/door{ - dir = 4 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Dq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Dr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/stack/rods, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Ds" = ( -/obj/item/grenade/c4, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Dv" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Dx" = ( -/obj/machinery/light/built/directional/south, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"DA" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"DB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"DC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"DH" = ( -/obj/structure/window/reinforced/plasma/plastitanium, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"DI" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"DJ" = ( -/obj/machinery/door/airlock/hatch{ - req_access_txt = "150" - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"DK" = ( -/obj/structure/grille, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"DN" = ( -/obj/effect/gibspawner/human, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"DR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/item/shard, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"DT" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"DU" = ( -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"DX" = ( -/obj/item/shard, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"DY" = ( -/obj/effect/turf_decal/weather/snow, -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Ea" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Eb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mob_spawn/corpse/human/syndicatesoldier, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Ed" = ( -/turf/open/floor/circuit/red, -/area/awaymission/snowdin/cave) -"Eg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Ej" = ( -/obj/structure/grille/broken, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/snowdin/cave) -"Ek" = ( -/obj/structure/door_assembly/door_assembly_hatch, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"El" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/bot_white, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Em" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"En" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Eo" = ( -/obj/effect/turf_decal/weather/snow, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Ep" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Eq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/shard, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Eu" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Ev" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/item/stack/rods, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"Ew" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Ez" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/shard, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"EB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/reagent_containers/glass/beaker, -/turf/open/floor/mineral/plastitanium/red, -/area/awaymission/snowdin/cave) -"ED" = ( -/obj/item/toy/plush/nukeplushie, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/suit_storage_unit{ - state_open = 1 - }, -/turf/open/floor/mineral/plastitanium{ - initial_gas = "o2=22;n2=82;TEMP=180"; - simulated = 0; - temperature = 180 - }, -/area/awaymission/snowdin/cave) -"EF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/suit_storage_unit/syndicate, -/turf/open/floor/mineral/plastitanium{ - initial_gas = "o2=22;n2=82;TEMP=180"; - simulated = 0; - temperature = 180 - }, -/area/awaymission/snowdin/cave) -"EG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/suit_storage_unit{ - state_open = 1 - }, -/turf/open/floor/mineral/plastitanium{ - initial_gas = "o2=22;n2=82;TEMP=180"; - simulated = 0; - temperature = 180 - }, -/area/awaymission/snowdin/cave) -"EH" = ( -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EK" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EM" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/bot_white, -/obj/item/surgical_drapes, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EN" = ( -/obj/machinery/sleeper/syndie{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EO" = ( -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EP" = ( -/obj/effect/turf_decal/bot_white, -/obj/machinery/sleeper/syndie{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"EQ" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"ES" = ( -/obj/structure/table/reinforced, -/obj/machinery/light/built/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"ET" = ( -/obj/machinery/porta_turret/syndicate{ - dir = 10 - }, -/turf/closed/wall/mineral/plastitanium, -/area/awaymission/snowdin/cave) -"EU" = ( -/obj/item/stack/ore/iron, -/turf/closed/mineral/iron/ice, -/area/awaymission/snowdin/cave/cavern) -"EX" = ( -/obj/item/pickaxe/drill{ - pixel_x = 3; - pixel_y = 3 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"EZ" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Fg" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"Fh" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/loading_area, -/obj/vehicle/ridden/atv, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"Fj" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"Fn" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Fo" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Fp" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Ft" = ( -/obj/structure/fence/door, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Fu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Fv" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/exotic/snow_gear, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Fx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Fy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 5 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"FC" = ( -/obj/structure/bed{ - dir = 4 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"FD" = ( -/obj/machinery/door/firedoor, -/obj/structure/holosign/barrier/atmos, -/obj/structure/grille/broken, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"FG" = ( -/obj/item/shard, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FH" = ( -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4 - }, -/obj/structure/sign/warning/xeno_mining{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FL" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/mining_dock) -"FM" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille/broken, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"FP" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"FQ" = ( -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/mining_dock) -"FT" = ( -/obj/structure/ore_box, -/turf/closed/mineral/snowmountain/cavern, -/area/awaymission/snowdin/cave/cavern) -"FU" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_dock) -"FZ" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_main) -"Ga" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Gb" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Gd" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_main/robotics) -"Ge" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"Gf" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Gh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_dock) -"Gi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Gj" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Gk" = ( -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Gl" = ( -/obj/machinery/door/poddoor/shutters{ - id = "snowdingarageunder"; - name = "garage door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Gm" = ( -/obj/machinery/door/poddoor/shutters{ - id = "snowdingarageunder2"; - name = "garage door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Gn" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Go" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main) -"Gq" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Gt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 1 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Gu" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"Gv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Gw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"Gx" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main/robotics) -"Gy" = ( -/obj/structure/table, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/glasses/welding, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"Gz" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"GA" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"GB" = ( -/obj/machinery/rnd/production/fabricator/department/robotics, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"GC" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"GD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"GE" = ( -/obj/item/disk/holodisk/snowdin/ripjacob, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"GF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"GG" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"GH" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/mining_main/mechbay) -"GI" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"GJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"GK" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/obj/item/clothing/head/bowler{ - pixel_y = 13 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"GL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"GN" = ( -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main/mechbay) -"GO" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"GP" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/mining_main) -"GQ" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"GR" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"GS" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/turf/open/floor/plating, -/area/awaymission/snowdin/outside) -"GT" = ( -/obj/structure/window/reinforced/fulltile/ice, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/plating, -/area/awaymission/snowdin/outside) -"GU" = ( -/turf/closed/wall/rust, -/area/awaymission/snowdin/post/mining_main/robotics) -"GV" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = 3; - pixel_y = 7 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"GW" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"GX" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"GY" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"GZ" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ha" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Hb" = ( -/mob/living/simple_animal/hostile/netherworld/migo, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Hc" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hd" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"He" = ( -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hf" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hh" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hi" = ( -/obj/effect/turf_decal/bot, -/obj/structure/mecha_wreckage/ripley, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hj" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille, -/obj/structure/window/reinforced/fulltile/ice, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hk" = ( -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Hl" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main) -"Hm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ho" = ( -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/outside) -"Hp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{ - dir = 1; - name = "plasma vent" - }, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/outside) -"Hq" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"Hs" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"Ht" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/robotics) -"Hu" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"Hw" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Hx" = ( -/obj/machinery/holopad, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Hy" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Mech Lab"; - req_access_txt = "29" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Hz" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HA" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HB" = ( -/obj/machinery/mineral/processing_unit_console, -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HC" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/machinery/conveyor{ - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"HD" = ( -/obj/structure/table, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"HE" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_main) -"HF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_main) -"HG" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"HI" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/outside) -"HK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/stack/sheet/glass{ - amount = 20; - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"HL" = ( -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"HM" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"HO" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HR" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HS" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"HT" = ( -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"HU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/public/glass, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"HV" = ( -/obj/machinery/door/airlock{ - name = "Private Quarters" - }, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"HW" = ( -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"HX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"HY" = ( -/obj/structure/closet/emcloset, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"HZ" = ( -/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 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Ia" = ( -/obj/machinery/door/poddoor/shutters{ - id = "snowdingarage3"; - name = "garage door" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ic" = ( -/obj/machinery/door/airlock/research{ - name = "Robotics Lab"; - req_access_txt = "29" - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"Id" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_dock) -"Ie" = ( -/obj/structure/barricade/sandbags, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"If" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = -32 - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ig" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ih" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ii" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Ij" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Ik" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Il" = ( -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Im" = ( -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/mining_main/mechbay) -"In" = ( -/obj/vehicle/sealed/mecha/working/ripley/mining, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Io" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Ip" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Ir" = ( -/obj/structure/closet/cabinet, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"Is" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"It" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Iu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_main) -"Iv" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ix" = ( -/obj/vehicle/ridden/atv{ - dir = 1 - }, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Iy" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Iz" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"IA" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = 6 - }, -/obj/item/storage/belt/utility, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"IB" = ( -/obj/structure/table, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"IC" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/hydro, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/button/door/directional/south{ - id = "snowdindormhydro1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"ID" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"IE" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"IF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"IG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"IH" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Garage" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"II" = ( -/obj/effect/decal/cleanable/oil, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"IJ" = ( -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/turf/closed/wall, -/area/awaymission/snowdin/post/mining_main/robotics) -"IL" = ( -/obj/structure/flora/tree/pine, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"IN" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"IQ" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"IR" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"IS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"IT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/mining_main) -"IU" = ( -/obj/machinery/light/directional/south, -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"IV" = ( -/obj/structure/table, -/obj/structure/showcase/machinery/microwave, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"IW" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"IX" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"IY" = ( -/obj/machinery/light/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"IZ" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Jb" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/button/door/directional/south{ - id = "snowdindormresearch2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"Jc" = ( -/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, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Jd" = ( -/obj/item/shard, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Je" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jf" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 8; - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jg" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jh" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "snowdin_belt_mine" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Ji" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Jj" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Jm" = ( -/obj/machinery/door/firedoor, -/obj/structure/grille/broken, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/item/shard, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jn" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jp" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Jq" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"Jt" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ju" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"Jv" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Jw" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Jx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Jy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Jz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"JA" = ( -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"JB" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JC" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JD" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"JE" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/storage/toolbox/emergency, -/obj/item/clothing/suit/hooded/wintercoat, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"JF" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JG" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JH" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JI" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"JL" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"JM" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"JN" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"JO" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"JP" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"JQ" = ( -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_main) -"JU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"JV" = ( -/turf/open/misc/ice, -/area/awaymission/snowdin/outside) -"JW" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"JY" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"JZ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Misc Storage"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Ka" = ( -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"Kb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Kc" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Kd" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"Kg" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ki" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Kj" = ( -/obj/machinery/power/port_gen/pacman, -/obj/machinery/power/terminal{ - dir = 4 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Kk" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Kl" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"Km" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"Kn" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 2; - height = 5; - id = "snowdin_mining_top"; - name = "snowdin mining top"; - roundstart_template = /datum/map_template/shuttle/snowdin/mining; - width = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_main) -"Ko" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Kp" = ( -/obj/machinery/holopad, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Kq" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Kr" = ( -/obj/structure/door_assembly/door_assembly_min{ - anchored = 1; - name = "broken airlock" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Ks" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Kt" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 2; - height = 5; - id = "snowdin_mining_down"; - name = "snowdin mining bottom"; - width = 5 - }, -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_dock) -"Ku" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Kv" = ( -/obj/structure/fence/corner, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Kw" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ky" = ( -/obj/item/stack/sheet/mineral/wood, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Kz" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"KA" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KB" = ( -/obj/structure/door_assembly/door_assembly_min{ - anchored = 1; - name = "broken airlock" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KC" = ( -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"KD" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KE" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KF" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KG" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"KH" = ( -/obj/machinery/computer/monitor/secret{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"KI" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"KJ" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty{ - pixel_x = -1; - pixel_y = 1 - }, -/obj/item/stack/rods, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"KK" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering"; - req_access_txt = "32" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"KL" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KM" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KN" = ( -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"KP" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"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/iron, -/area/awaymission/snowdin/post/mining_dock) -"KR" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"KV" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"KX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"KZ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"Lb" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"Lf" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/research) -"Lg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/spider/stickyweb, -/obj/machinery/light/broken/directional/west, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"Lh" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Li" = ( -/obj/structure/fence/door/opened, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Lk" = ( -/obj/machinery/button/door/directional/west{ - id = "snowdindormabandoned1"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/post/minipost) -"Lm" = ( -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Ln" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"Lp" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Lq" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Ls" = ( -/obj/machinery/light/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"Lt" = ( -/obj/item/shard, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Lu" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Lw" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"Lx" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Ly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 9 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Lz" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"LI" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/decal/cleanable/blood/drip, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"LJ" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"LK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"LM" = ( -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"LQ" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"LR" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/bot_white, -/obj/item/chair, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"LT" = ( -/obj/vehicle/ridden/atv{ - dir = 4 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"LV" = ( -/obj/machinery/light/broken/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"LW" = ( -/obj/structure/table/wood, -/obj/structure/fireaxecabinet/directional/south, -/obj/effect/spawner/random/exotic/snow_gear, -/turf/open/floor/wood, -/area/awaymission/snowdin/outside) -"LY" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"LZ" = ( -/obj/structure/sign/warning/docking{ - pixel_y = 32 - }, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/mining_dock) -"Ma" = ( -/obj/effect/turf_decal/weather/snow/corner, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Mb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"Mc" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"Mg" = ( -/obj/structure/table, -/obj/item/clothing/neck/stethoscope, -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Mj" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"Ml" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"Mo" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave/mountain) -"Mq" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Mz" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"MB" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"MG" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"MJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "snowdingarageunder"; - name = "left garage door toggle"; - pixel_x = -8 - }, -/obj/machinery/button/door/directional/north{ - id = "snowdingarageunder2"; - name = "right garage door toggle"; - pixel_x = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"MK" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/kitchen) -"MN" = ( -/obj/item/stack/rods, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"MP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/broken/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"MR" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 6 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"MT" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"MU" = ( -/obj/item/stack/ore/iron, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"MV" = ( -/obj/item/shard, -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"MW" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"MZ" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Na" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Officer Norm" - }, -/obj/item/clothing/head/helmet{ - pixel_y = 8 - }, -/obj/item/melee/baton/security{ - pixel_x = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Nb" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"Nf" = ( -/obj/structure/fence/corner{ - dir = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Nh" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/shoes/winterboots, -/obj/item/tome, -/obj/machinery/button/door/directional/south{ - id = "snowdindormresearch3"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"Nk" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/suit/hooded/wintercoat/security, -/obj/item/clothing/shoes/winterboots, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/button/door/directional/west{ - id = "snowdindormsec"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"Nn" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"Nt" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"Nu" = ( -/obj/structure/fence{ - pixel_x = 16 - }, -/turf/open/misc/ice, -/area/awaymission/snowdin/outside) -"Nv" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"Nz" = ( -/obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"NA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"NB" = ( -/obj/structure/table, -/obj/item/storage/medkit/o2{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"ND" = ( -/obj/structure/closet/cabinet, -/obj/item/clothing/shoes/winterboots, -/obj/machinery/button/door/directional/south{ - id = "snowdindormresearch1"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"NF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"NG" = ( -/obj/item/storage/medkit/fire{ - empty = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"NH" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"NL" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/spider/stickyweb, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"NN" = ( -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"NQ" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"NR" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"NV" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"NX" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/paper/crumpled/ruins/snowdin/shovel, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"Ob" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"Oe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Of" = ( -/obj/structure/fence{ - pixel_x = -16 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Og" = ( -/obj/machinery/vending/wallmed/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Oh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/broken/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"Oj" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Om" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"Ou" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"Ov" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"Ox" = ( -/obj/structure/table, -/obj/item/disk/holodisk/snowdin/welcometodie, -/obj/machinery/button/door/directional/south{ - id = "snowdin_gate" - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"Oz" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"OA" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"OB" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"OD" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/closet/emcloset, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"OH" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"OJ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"OP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/robotics) -"OR" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"OT" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) -"OV" = ( -/obj/structure/table/wood, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"OW" = ( -/obj/machinery/light/directional/south, -/obj/item/crowbar, -/obj/structure/noticeboard/directional/south, -/obj/item/paper/fluff/awaymissions/snowdin/secnotice, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/secpost) -"OZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "1" - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"Pb" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Pd" = ( -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave/mountain) -"Pf" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"Ph" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Pm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"Po" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"Pp" = ( -/obj/structure/fence/corner{ - dir = 10 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Pr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/spider/stickyweb, -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, -/turf/open/floor/iron/freezer, -/area/awaymission/snowdin/post/kitchen) -"Ps" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 1 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Pu" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/post/mining_main) -"Px" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"PC" = ( -/obj/machinery/space_heater, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"PH" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"PI" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"PJ" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern2) -"PL" = ( -/obj/structure/chair, -/obj/machinery/light/small/directional/west, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"PQ" = ( -/obj/item/reagent_containers/food/drinks/bottle/beer{ - list_reagents = null - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"PU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/east{ - id = "snowdindormcap"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/awaymission/snowdin/post/dorm) -"PV" = ( -/obj/item/shard, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"PW" = ( -/obj/item/shard, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"PY" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Qc" = ( -/obj/structure/flora/stump, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Qd" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave/mountain) -"Qf" = ( -/obj/item/shard, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Qg" = ( -/obj/effect/baseturf_helper/asteroid/snow{ - baseturf = /turf/open/misc/asteroid/snow/ice; - name = "asteroid snowice baseturf editor" - }, -/turf/closed/wall/ice, -/area/awaymission/snowdin/post/mining_dock) -"Qh" = ( -/obj/structure/table, -/obj/item/clothing/glasses/hud/health, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Qj" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Ql" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Qp" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Qq" = ( -/obj/structure/fluff/fokoff_sign, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Qs" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"Qv" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"Qx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"Qy" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/mining_dock) -"QB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/light/broken/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"QD" = ( -/obj/item/shard{ - icon_state = "medium" - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"QE" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/outside) -"QH" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"QI" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"QJ" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/north, -/obj/item/disk/holodisk/snowdin/weregettingpaidright, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/research) -"QM" = ( -/mob/living/simple_animal/hostile/giant_spider/nurse/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"QN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/door/airlock/public/glass, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post) -"QO" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"QP" = ( -/mob/living/simple_animal/hostile/asteroid/basilisk, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"QQ" = ( -/obj/structure/flora/grass/both, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"QR" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"QS" = ( -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"QU" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"QY" = ( -/obj/structure/girder, -/obj/effect/turf_decal/weather/snow, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"QZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/shard, -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"Ra" = ( -/obj/structure/barricade/wooden, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Rd" = ( -/obj/structure/barricade/sandbags, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Re" = ( -/obj/effect/mob_spawn/corpse/human/clown, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Rj" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Rm" = ( -/obj/item/stack/sheet/mineral/plastitanium, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Rn" = ( -/obj/structure/door_assembly/door_assembly_min{ - anchored = 1; - name = "broken airlock" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main) -"Rs" = ( -/obj/item/stack/cable_coil{ - amount = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Ru" = ( -/obj/item/shard, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Rv" = ( -/obj/structure/fence/corner{ - dir = 10 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"RB" = ( -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"RC" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"RD" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Observation Deck" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/cavern1) -"RE" = ( -/obj/effect/baseturf_helper/asteroid/snow, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"RF" = ( -/obj/machinery/airalarm/directional/north, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"RH" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"RN" = ( -/obj/structure/flora/bush, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"RO" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/west, -/obj/item/paper_bin, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"RP" = ( -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"RR" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"RS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"RW" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"RX" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"RY" = ( -/obj/item/key/atv, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"RZ" = ( -/obj/structure/filingcabinet, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"Sa" = ( -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Sb" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Sd" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Sf" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Si" = ( -/mob/living/simple_animal/hostile/giant_spider/hunter/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Sj" = ( -/obj/machinery/button/door/directional/south{ - id = "snowdinturbineoutlet"; - name = "Turbine Outlet Release"; - pixel_y = -32 - }, -/obj/machinery/button/door/directional/south{ - id = "snowdinturbinegas"; - name = "Turbine Gas Release" - }, -/obj/machinery/computer/atmos_control/fixed{ - atmos_chambers = list("snowdinincin" = "Incinerator Chamber"); - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"Sk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/warning/electricshock{ - pixel_x = -32 - }, -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"Sl" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"Sm" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"So" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Sp" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"Sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"Ss" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/secpost) -"St" = ( -/obj/structure/fence{ - pixel_x = -16 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/outside) -"Su" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Sw" = ( -/obj/structure/statue/snow/snowman{ - name = "Snow-Luc Price" - }, -/obj/item/clothing/head/hos{ - pixel_y = 10 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Sy" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/conveyor_switch/oneway{ - id = "snowdin_belt_mine"; - name = "mining conveyor" - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"SA" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Officer Norm" - }, -/obj/item/gun/energy/e_gun/mini{ - pixel_y = -5 - }, -/obj/item/clothing/head/helmet{ - pixel_y = 8 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"SC" = ( -/obj/structure/spider/stickyweb, -/obj/structure/spider/stickyweb, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"SE" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/kitchen) -"SF" = ( -/obj/structure/bed, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"SG" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/o2, -/area/awaymission/snowdin/post/engineering) -"SI" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"SK" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/door_buttons/access_button{ - idDoor = "snowdin_turbine_interior"; - idSelf = "snowdin_turbine_access"; - layer = 3.1; - name = "Turbine airlock control"; - pixel_x = 8; - pixel_y = -24 - }, -/turf/open/floor/engine, -/area/awaymission/snowdin/post/engineering) -"SL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"SM" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"SQ" = ( -/obj/machinery/light/small/directional/west, -/obj/item/stack/rods{ - amount = 2 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"SS" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"SU" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"SV" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/circular_saw, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"SX" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"SZ" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Ready Room"; - req_access_txt = "150" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Tb" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Te" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"Tf" = ( -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Tk" = ( -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Tm" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Tn" = ( -/obj/machinery/holopad, -/obj/item/disk/holodisk/snowdin/overrun, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"Tr" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"Ts" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/sign/warning/docking{ - pixel_x = 32 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"Tv" = ( -/obj/structure/table, -/obj/item/storage/medkit/ancient, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Tw" = ( -/obj/effect/decal/remains/human, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Ty" = ( -/obj/machinery/light/broken/directional/east, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/gateway) -"TA" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"TD" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/n2, -/area/awaymission/snowdin/post/engineering) -"TI" = ( -/obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"TJ" = ( -/obj/item/stack/sheet/iron, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"TK" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_main) -"TM" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 5 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"TR" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/messhall) -"TT" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mob_spawn/corpse/human/syndicatesoldier, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"TW" = ( -/obj/structure/closet/crate/wooden, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"TY" = ( -/obj/machinery/power/port_gen/pacman, -/obj/item/stack/sheet/mineral/plasma{ - amount = 3 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"TZ" = ( -/obj/structure/closet/crate/wooden, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Ua" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"Ub" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Uf" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Ui" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"Uj" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 10 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Uk" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/broken/directional/east, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"Um" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Un" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/plasma, -/area/awaymission/snowdin/post/engineering) -"Up" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/post/cavern2) -"Uq" = ( -/obj/effect/baseturf_helper/asteroid/snow{ - baseturf = /turf/open/misc/asteroid/snow/ice; - name = "asteroid snowice baseturf editor" - }, -/turf/closed/indestructible/rock/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Us" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/garage) -"Ut" = ( -/obj/structure/closet/cabinet, -/obj/machinery/button/door/directional/south{ - id = "snowdindormhydro2"; - name = "Dorm Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"Uu" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Ux" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Uy" = ( -/obj/item/clothing/head/cone, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"UA" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/closet/cabinet, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/cavern1) -"UB" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"UC" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1 - }, -/obj/item/pickaxe/mini{ - pixel_x = 5; - pixel_y = 3 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"UG" = ( -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"UH" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"UI" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"UM" = ( -/mob/living/simple_animal/hostile/skeleton/eskimo, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"UQ" = ( -/obj/machinery/light/small/directional/north, -/obj/item/stack/rods, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"UT" = ( -/obj/structure/flora/rock/pile/icy, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Va" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/structure/sign/nanotrasen, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Vb" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mob_spawn/corpse/human/syndicatesoldier, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Ve" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Vf" = ( -/obj/item/trash/can, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Vi" = ( -/obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/bear/snow, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Vl" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Vm" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Vo" = ( -/mob/living/simple_animal/hostile/giant_spider/ice, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Vp" = ( -/obj/item/paper/crumpled/ruins/snowdin/misc1, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Vq" = ( -/obj/machinery/light/broken/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"Vu" = ( -/obj/machinery/light/broken/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"Vw" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Vx" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/decal/remains/human, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Vy" = ( -/obj/structure/sign/nanotrasen{ - pixel_y = -32 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"Vz" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/nanotrasen{ - pixel_x = 32 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/post/cavern2) -"VB" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"VE" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/light/small/directional/north, -/obj/item/trash/cheesie, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"VF" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"VJ" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"VO" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/nanotrasen{ - pixel_y = 32 - }, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"VP" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"VQ" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"VU" = ( -/obj/structure/closet/crate/wooden, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/floor/plating/snowed/cavern, -/area/awaymission/snowdin/cave/cavern) -"VW" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/fans/tiny, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"VY" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Wa" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"We" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/cave) -"Wh" = ( -/obj/structure/bookcase/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/dorm) -"Wl" = ( -/obj/structure/rack, -/obj/machinery/light/small/directional/east, -/obj/item/storage/toolbox/emergency, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"Wm" = ( -/obj/machinery/light/directional/south, -/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/iron, -/area/awaymission/snowdin/post) -"Wp" = ( -/obj/structure/statue/snow/snowman{ - anchored = 1; - name = "Officer Snowlby" - }, -/obj/item/clothing/head/helmet{ - pixel_y = 8 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Wt" = ( -/obj/machinery/button/door/directional/west{ - id = "snowdingarage1"; - name = "garage door toggle" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Wu" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/snowed/smoothed, -/area/awaymission/snowdin/cave) -"Wv" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/dorm) -"Wx" = ( -/obj/structure/table/reinforced, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Wy" = ( -/obj/structure/girder, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"WA" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"WB" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"WE" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/hydro) -"WF" = ( -/obj/structure/cable, -/turf/open/floor/engine/vacuum, -/area/awaymission/snowdin/post/engineering) -"WG" = ( -/obj/machinery/light/broken/directional/west, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"WH" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"WI" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"WJ" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"WM" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"WN" = ( -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"WR" = ( -/obj/item/shard, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"WS" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/snowdin/post/cavern1) -"WV" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible{ - dir = 8 - }, -/turf/open/floor/plating/snowed, -/area/awaymission/snowdin/outside) -"WW" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/messhall) -"WX" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Xd" = ( -/obj/item/stack/rods, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Xh" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/pink/visible, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/engineering) -"Xj" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/mineral/titanium/blue, -/area/awaymission/snowdin/post/broken_shuttle) -"Xk" = ( -/obj/structure/closet/wardrobe/robotics_black, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/mining_main/robotics) -"Xl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"Xo" = ( -/obj/structure/flora/grass/both, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Xt" = ( -/obj/structure/rack, -/obj/item/storage/box/rubbershot, -/obj/machinery/light/small/directional/south, -/obj/item/storage/box/rubbershot{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/secpost) -"Xu" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/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/iron, -/area/awaymission/snowdin/post/mining_dock) -"Xw" = ( -/obj/structure/table, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post/minipost) -"XB" = ( -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"XD" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/decal/cleanable/blood/old, -/obj/effect/mob_spawn/corpse/human/syndicatesoldier, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"XI" = ( -/obj/effect/spawner/random/exotic/snow_gear, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"XK" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/south{ - id = "snowdingarage2"; - name = "garage door toggle" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/minipost) -"XN" = ( -/obj/structure/fence, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"XP" = ( -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/engine/cult{ - initial_gas = "n2=82;plasma=24;TEMP=120"; - temperature = 120 - }, -/area/awaymission/snowdin/cave/cavern) -"XQ" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"XR" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/obj/effect/spawner/random/exotic/antag_gear_weak, -/turf/open/floor/wood, -/area/awaymission/snowdin/igloo) -"XS" = ( -/obj/item/reagent_containers/dropper, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"XV" = ( -/obj/effect/light_emitter{ - name = "cave light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/ice/smooth, -/area/awaymission/snowdin/cave) -"XW" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/awaymission/snowdin/post/dorm) -"XX" = ( -/obj/structure/flora/bush, -/obj/structure/flora/bush, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"XY" = ( -/obj/structure/barricade/sandbags, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Ya" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/cavern1) -"Yd" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Ye" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Yf" = ( -/obj/structure/fence, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Yh" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"Yk" = ( -/obj/item/aicard, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/cave) -"Ym" = ( -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Yn" = ( -/obj/machinery/door/airlock/external/glass/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/garage) -"Yo" = ( -/obj/structure/table, -/obj/item/storage/medkit/fire{ - empty = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Yr" = ( -/obj/item/shard, -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"Ys" = ( -/turf/open/floor/plating/elevatorshaft, -/area/awaymission/snowdin/post/mining_dock) -"Yt" = ( -/obj/effect/mob_spawn/corpse/human/assistant{ - brute_damage = 150; - oxy_damage = 50 - }, -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Yu" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"Yv" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/spawner/random/structure/crate_abandoned, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern1) -"Yx" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/mining_main) -"Yz" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/cavern2) -"YA" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock"; - req_access_txt = "48" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) -"YB" = ( -/obj/machinery/light/broken/directional/west, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_dock) -"YC" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"YE" = ( -/obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"YF" = ( -/obj/structure/fence{ - pixel_x = -16 - }, -/turf/open/misc/ice, -/area/awaymission/snowdin/outside) -"YG" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/binary/volume_pump{ - name = "Mix To Turbine" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "snowdin_turbine_exterior"; - idSelf = "snowdin_turbine_access"; - name = "Turbine airlock control"; - pixel_x = -8; - pixel_y = 24 - }, -/obj/structure/sign/warning/fire{ - pixel_y = -32 - }, -/turf/open/floor/engine, -/area/awaymission/snowdin/post/engineering) -"YK" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/grimy, -/area/awaymission/snowdin/post/cavern2) -"YO" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"YP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/light/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/research) -"YR" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/crate{ - icon_state = "crateopen"; - name = "explosives ordinance" - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/cave) -"YT" = ( -/obj/effect/turf_decal/weather/snow, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/snowdin, -/area/awaymission/snowdin/outside) -"YZ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main/mechbay) -"Zb" = ( -/obj/effect/gibspawner/generic, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/outside) -"Zd" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/gateway) -"Zj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/airalarm/directional/north, -/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/iron, -/area/awaymission/snowdin/post/secpost) -"Zn" = ( -/obj/structure/flora/tree/pine, -/obj/effect/light_emitter{ - name = "outdoor light"; - set_cap = 3; - set_luminosity = 6 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Zp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/item/storage/medkit/o2{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"Zq" = ( -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 - }, -/obj/machinery/light/broken/directional/north, -/turf/open/floor/engine/cult, -/area/awaymission/snowdin/post/cavern2) -"Zu" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/post/minipost) -"Zv" = ( -/mob/living/simple_animal/hostile/skeleton/ice{ - name = "Captain Bones" - }, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Zw" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"Zx" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/cave) -"Zy" = ( -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"Zz" = ( -/obj/structure/mecha_wreckage/ripley, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"ZB" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/awaymission/snowdin/post/custodials) -"ZE" = ( -/obj/structure/fence/corner{ - dir = 4 - }, -/turf/open/misc/asteroid/snow/ice, -/area/awaymission/snowdin/cave/cavern) -"ZH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) -"ZI" = ( -/obj/machinery/button/door/directional/north{ - id = "snowdingarage3"; - name = "garage door toggle" - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/mining_main) -"ZJ" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/post/garage) -"ZK" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"ZM" = ( -/obj/structure/fence/corner{ - dir = 9 - }, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) -"ZT" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/misc/asteroid/snow{ - floor_variance = 0; - icon_state = "snow_dug"; - slowdown = 1 - }, -/area/awaymission/snowdin/cave) -"ZU" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/iron/cafeteria, -/area/awaymission/snowdin/post/messhall) -"ZX" = ( -/obj/structure/flora/stump, -/turf/open/misc/asteroid/snow, -/area/awaymission/snowdin/outside) - -(1,1,1) = {" -aa -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(2,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(3,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(4,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(5,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(6,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(7,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(8,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(9,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(10,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -qS -aj -aj -aj -aj -aj -aj -aj -ae -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(11,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -qS -qS -YC -qS -aj -qS -YC -qS -qS -qS -aj -aj -aj -qS -qS -qS -qS -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(12,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -qS -qS -qS -aj -qS -Tw -qS -qS -Sa -qS -qS -qS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(13,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -TI -Zy -Cu -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Qj -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -aj -YC -QS -QS -QS -QS -QS -QS -QS -QS -YC -qS -qS -qS -qS -YC -qS -qS -qS -qS -qS -qS -aj -aj -ae -aj -aj -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(14,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -qS -aj -aj -QS -QS -QS -qS -YC -aj -aj -aj -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(15,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zn -Zy -Zy -ZK -Zy -Zy -Tf -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -Sa -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -Tw -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(16,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -aK -aK -aK -aK -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -YC -aj -aj -QS -QS -QS -QS -QS -QS -QS -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(17,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Cu -Zy -Zy -Zy -aK -vs -dY -aK -Zy -Zy -Zy -Qj -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ZK -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -aj -QS -QS -QS -QS -QS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(18,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -RE -Zy -Zy -Zy -Zy -Qj -Zy -Zy -aK -dA -aV -aK -aK -aK -aK -aK -aK -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Cu -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -qS -qS -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -aj -ae -aj -aj -aj -qS -qS -qS -qS -YC -qS -qS -YC -qS -qS -qS -qS -QS -QS -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(19,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Zy -TI -Zy -Zy -aK -aK -aK -aK -dB -Cx -eN -dC -CX -Nb -hG -aK -Zy -YE -Zy -Zy -Cu -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -YC -qS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -qS -Sa -qS -qS -Tw -qS -Tw -qS -qS -qS -qS -qS -qS -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(20,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -aK -bO -QU -aV -dC -ea -eO -fs -eO -eO -hH -aK -Qj -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -qS -aj -aj -qS -qS -qS -aj -aj -aj -qS -qS -qS -qS -qS -aj -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Qj -Zy -TI -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(21,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -TI -Qj -aK -Wv -cn -aS -dC -eb -eP -eP -gh -PU -hI -aK -aK -aK -aK -aK -aK -aK -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -aj -qS -Tw -qS -aj -aj -qS -YC -YC -aj -aj -qS -qS -qS -qS -Sa -qS -aj -qS -qS -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ku -ae -ae -ae -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(22,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Zy -aJ -aK -aK -aK -aS -co -aV -aS -aS -aS -aV -aV -aS -hJ -aV -Wh -aS -kv -vy -lU -aK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tG -qS -ji -QS -QS -XV -QS -QS -XV -QS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -YC -qS -qS -qS -qS -qS -qS -qS -qS -qS -YC -aj -qS -qS -qS -aj -aj -aj -YC -YC -qS -qS -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Qj -YE -SS -Zy -Qj -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -YE -Zy -eo -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(23,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Zy -aK -aQ -bi -bx -bQ -cp -cV -cv -ec -eQ -ft -eQ -eQ -hK -eQ -je -aS -kw -lf -lV -aK -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -bj -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -qS -qS -qS -qS -Vi -qS -qS -qS -qS -Tw -aj -aj -aj -qS -qS -aj -ae -aj -aj -aj -aj -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Cu -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -eo -YE -Zy -Zy -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(24,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Qj -aK -aR -Uk -Nh -aV -cq -cW -dD -ed -eR -fu -gi -gZ -hL -io -jf -aV -kx -NN -lW -aK -Qj -Zy -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -Zy -SU -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Xo -Zy -Zy -Zy -Zy -ae -ae -ae -aj -aj -aj -aj -qS -qS -qS -qS -qS -aj -qS -YC -qS -qS -qS -qS -qS -qS -aj -ae -ae -ae -ae -aj -aj -qS -Sa -Vx -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Cu -Zy -ZK -Zy -Zy -SS -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Cu -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -eo -Zy -TI -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(25,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -Zy -Zy -aK -aS -aV -aS -aV -cr -cX -dE -ee -eS -MP -Ov -ha -dE -ip -jg -aV -ky -aV -aV -aK -aK -Zy -Zy -ZK -TI -Zy -Zy -Zy -Zy -Zy -ts -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Zy -TI -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -aj -aj -qS -qS -qS -qS -qS -qS -qS -aj -aj -ae -ae -ae -ae -ae -aj -aj -qS -qS -qS -qS -aj -qS -qS -qS -qS -qS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QE -eo -ae -ae -ae -eo -QE -eo -eo -eo -QE -Zy -Zy -Qj -Qj -YE -Zy -Qj -Zy -Zy -TI -Zy -Zy -Zy -Zy -SS -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -YE -Zy -eo -Zy -Zy -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(26,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Zy -Zy -Zy -Cu -Zy -aK -aT -bi -bx -bR -cs -cY -aS -aS -eT -aS -aS -hb -aS -iq -jf -aV -kz -lh -lX -OT -aK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -QE -Zy -Zy -Zy -TI -UG -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -qS -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -qS -qS -qS -qS -qS -YC -qS -qS -aj -aj -QS -QS -QS -QS -QS -QS -eo -eo -eo -ae -ae -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Zy -Zy -TI -YE -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Cu -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -eo -eo -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(27,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Zy -ZX -Zy -Zy -Zy -aK -aU -lJ -Jb -aS -cq -cZ -aS -Nk -eU -aV -gk -hc -aV -ir -jh -jP -kA -Oh -aV -aV -aK -Qj -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -TI -Zy -Zy -Cu -Zy -Tf -Zy -Zy -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -aj -aj -qS -qS -qS -QS -QS -QS -QS -LJ -eo -eo -eo -eo -eo -QE -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -SS -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -eo -Zy -Zy -TI -Zy -Cu -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(28,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -aK -aV -aV -aV -aS -ct -da -aV -VE -eV -aV -os -hd -aS -iq -Ls -aS -kB -lj -lX -OT -aK -Zy -Zy -Cu -Zy -TI -Zy -Cu -Zy -TI -Zy -Qj -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -qS -aj -aj -aj -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -tq -TI -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(29,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Zy -Zy -Zy -TI -Zy -aK -aW -bl -bA -bS -cu -db -aV -eh -eW -aS -gm -he -aV -iq -jj -aS -Nt -Nt -jR -jR -na -na -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -ai -aj -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(30,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Zy -Zy -Zy -Zy -Qj -aK -aX -XW -ND -aS -cv -Pm -aS -aS -aS -aS -aV -aS -aS -iq -jg -jQ -jR -jR -lY -mE -nb -na -na -Zy -YE -Zy -ZK -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ng -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -ZK -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Qj -Zy -Zy -Zy -Xo -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -SS -Qj -Zy -Zy -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -TI -Zy -YE -Zy -Cu -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Qj -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(31,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Cu -Zy -Zy -Zy -Zy -aK -aS -aV -aS -aS -cr -dd -rJ -ei -eX -fw -fw -fw -dK -is -jk -jR -qD -lk -sT -mF -mF -nC -ob -ob -ob -ob -Qj -Zy -Zy -Zy -Zy -Zy -Cu -Zy -TI -Zy -Zy -Qj -tq -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -SS -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Cu -Zy -Zy -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -eo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(32,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Zy -TI -Zy -Zy -Zy -aK -aY -bl -bx -bT -cw -cY -rJ -dK -eY -fx -gn -gr -hM -it -jl -jR -ZB -ll -ma -mG -mG -nD -oc -oy -Sl -pH -pH -pH -pH -YE -Zy -bq -NV -NV -NV -NV -NV -MT -SS -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -ae -ae -Zy -Zy -Zy -Zy -SS -bq -NV -NV -NV -NV -NV -MT -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(33,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -Qj -Zy -Zy -Zy -ZX -aK -aZ -XW -Ut -aS -cx -de -rJ -dM -eY -fy -go -NG -hM -it -jm -jR -jR -lm -mb -mG -mG -nD -oc -oz -Ss -pH -qn -qn -pH -Zy -Zy -ax -sI -sS -td -sS -td -sS -tq -Zy -TI -Zy -Zy -Zy -TI -Cu -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Qj -Zy -YE -Zy -Qj -Zy -Zy -Qj -Zy -Zy -Zn -Zy -Zy -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ae -ae -Zy -Zy -Zy -ae -ae -Zy -Zy -Zy -Zy -tq -sS -td -sS -td -sS -sI -hl -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -tq -eo -eo -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(34,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -aK -aS -aV -aV -aV -cx -de -dG -dM -Mg -fz -gp -hg -hN -it -jn -Wm -jR -jR -mc -lY -jR -nE -oc -oA -oH -pI -qo -qp -pH -TI -Zy -ax -sJ -dX -te -te -te -te -dX -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 -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -vL -vR -vX -vR -vL -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -ae -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -dX -dX -te -te -te -te -yF -hl -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -eo -eo -eo -Zy -Zy -YE -Va -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Cu -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Go -Go -GP -Go -Go -GP -GP -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(35,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -TI -Zy -Zy -Zy -aK -ba -bl -bx -bU -cy -df -dH -dK -Qh -fA -gq -Zp -hO -iu -jm -jT -kF -ln -md -xw -QB -nF -hZ -oB -pj -pI -qp -Xt -pH -Zy -TI -ax -sK -dX -te -te -te -te -dX -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 -eo -JV -JV -JV -JV -JV -JV -JV -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -vM -PL -vY -wb -vM -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -dX -te -te -te -te -yG -hl -Zy -Zy -Zy -Zy -Zy -TI -Zy -Cu -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -eo -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Cu -Zy -eo -eo -YE -Cu -Zy -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -GP -Gq -Gq -Gq -Gq -Gq -Gq -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(36,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -TI -Zy -Zy -Qj -aK -bb -RX -IC -aS -cq -de -Pf -dK -Og -ab -gr -gr -hM -iv -jo -jU -js -jU -me -mI -nd -nF -Ob -oC -pk -pJ -qo -qK -pH -Cu -Zy -ax -sJ -dX -te -te -te -te -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -te -te -te -te -te -te -te -dX -dX -dX -dX -dX -dX -dX -dX -dX -oa -vN -vT -vY -wc -vM -oa -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -dX -te -te -te -te -yF -hl -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Ft -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -SS -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Go -Gq -Gq -Gq -Gq -Gq -Gq -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(37,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Qj -Zy -Zy -TI -aq -ar -ar -aK -aS -aV -aV -aS -cq -dd -eZ -dK -Tv -bk -Yo -NB -dK -iw -jp -jV -ej -lo -mf -mJ -ne -OZ -of -oD -OW -pI -pH -pH -pH -Zy -YE -ax -sK -dX -te -te -te -te -dX -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 -eo -JV -JV -JV -JV -JV -JV -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -vM -vU -vY -Xj -vM -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 -dX -dX -te -te -te -te -yG -hl -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -eo -eo -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -MB -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -Go -GP -GP -Go -Go -GP -Go -Gq -Gq -Gq -Gq -Gq -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(38,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -ZK -Qj -ar -aw -aE -aL -bc -bo -bE -az -cz -dg -dK -dK -dK -dM -dM -dM -dK -ix -jq -jm -jU -lp -mg -mK -nf -nH -og -oE -pm -pK -qq -Zy -Cu -Zy -SU -ax -sJ -dX -te -te -te -te -dX -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 -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -vL -vR -vX -vR -vL -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 -dX -dX -te -te -te -te -yF -hl -Zy -Zy -Cu -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ft -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -eo -eo -TI -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -SS -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -GP -HT -xH -Go -HT -xH -Go -Go -Go -GP -Gq -GP -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(39,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -ar -Om -aF -aE -aE -bo -bE -az -bo -dh -dL -ej -fd -fd -ej -fd -hP -ej -jr -jW -jU -lq -mh -mL -nf -QZ -oh -oF -pn -pL -qq -Qj -pS -TI -Zy -ax -sI -sU -tf -tl -tf -tl -tq -Zy -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -QQ -Zy -Zy -YE -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Qj -Zy -Zy -Qj -TI -Zy -Qj -YE -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Cu -tq -tl -tf -tl -tf -sU -sI -hl -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -SS -Zy -Zy -YE -TI -Zy -Zy -YE -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -SS -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -GP -Yx -Ir -GP -Yx -Ir -Go -ae -Go -Kj -Gq -KH -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(40,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Cu -ar -ay -aG -aM -bc -bp -bE -az -br -di -dM -ek -Wl -hC -gu -hj -dK -iy -js -jX -kG -lr -mi -mM -nf -nF -Zj -oG -po -pM -qq -TI -Zy -Zy -Zy -Tr -YT -YT -YT -YT -YT -Ju -SS -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Va -Tr -YT -YT -YT -YT -YT -Ju -TI -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -dX -Zy -YE -ZX -Zy -Zy -Qj -Zy -YE -Zy -Va -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -TI -Qj -ae -ae -ae -ae -ae -ae -ae -GP -HT -Is -Go -HT -Is -Go -ae -GP -Kk -Kw -KI -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(41,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -ar -az -aC -aC -az -YP -bF -bV -cA -dj -dM -el -ff -fg -fg -fh -fh -fh -fg -fg -NX -ls -mj -jo -Sr -nF -oc -oH -oH -oc -ob -qL -qL -qL -Cu -TI -Zy -dX -dX -dX -Zy -Zy -Va -Zy -Zy -Zy -Cu -YE -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Cu -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -ZK -Zy -eo -SS -Zy -Zy -Zy -dX -dX -dX -dX -dX -Zy -dX -dX -dX -dX -Zy -Qj -Zy -TI -Zy -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ku -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -YE -Qj -Zy -Zy -Zy -YE -Qj -Zy -Zy -Qj -Zy -Zy -YE -Cu -Zy -Zy -Zy -Zy -YE -Zy -ZK -eo -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Pp -Mz -Nf -ZX -Zy -Zy -Zy -Zy -ae -ae -ae -ae -Hl -Go -HV -Go -Go -HV -Go -GP -Go -GP -Go -Su -KJ -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(42,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Qj -ar -aw -aE -aE -bd -br -bI -bW -cB -bo -dK -Zd -fg -fF -gv -hk -hQ -RO -Ox -fh -kI -lt -mk -mL -nh -nJ -hM -oI -pp -pN -dK -qM -rk -rG -Zy -TI -dX -dX -dX -Zy -YE -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -YE -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ft -Zy -Cu -Zy -Zy -YE -Zy -dX -dX -dX -Zy -dX -te -te -AC -yW -Zy -Zy -Cu -Zn -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Cu -Zy -Zy -YE -SS -Zy -Zy -Cu -Zy -Zy -TI -Zy -Zy -ae -ae -ae -GP -HD -GR -It -Iu -IR -Go -Is -Ir -xH -Go -Kw -Gq -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(43,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Qj -Zy -Zy -Zy -ar -QJ -aH -aN -aE -bs -bH -bX -cB -bE -az -Lf -fh -fG -gw -gw -hR -iA -ju -jY -kJ -lu -ml -jU -ni -nK -HU -oJ -pq -pO -qr -qN -js -rH -dX -dX -dX -dX -dX -dX -Zy -Zy -Ft -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -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 -eo -eo -eo -eo -eo -eo -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -TI -Zy -TI -TI -Zy -TJ -oa -te -Tb -AD -yW -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -Zy -Zy -eo -eo -eo -eo -Zy -TI -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Va -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Pu -FZ -Go -GP -Go -HE -Gq -Gq -HW -IS -HV -HT -RW -HT -GP -Yh -Gq -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(44,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -ar -aB -aG -aO -bc -br -bI -bY -cC -bE -dK -XQ -fh -fG -gx -hm -hS -iB -jv -jZ -kK -lv -js -jW -nj -nL -dK -js -pr -pP -dK -LK -NA -qL -oa -dX -dX -dX -dX -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Ft -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -dX -Zy -zU -Ag -te -te -yW -AX -AX -yW -yW -yY -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -YE -eo -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -SS -TI -Zy -TI -Zy -Zy -Zy -Zy -Zy -Ga -PC -GQ -Hm -HF -HW -Gq -Gq -IS -Go -GP -Go -GP -Go -Go -KK -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(45,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Cu -Zy -ZX -ar -aC -aC -aC -az -bt -bJ -Sp -bp -dk -dK -ep -fh -fG -fG -hn -hT -iC -ju -jY -kJ -lw -jo -js -nk -nM -QN -oK -ps -pQ -qs -pQ -rm -rH -dX -dX -dX -dX -dX -Zy -dX -dX -Ft -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -eo -Zy -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Cu -Zy -ZX -Zu -oa -dX -yW -yW -Ah -Av -Lw -yX -AY -Be -yX -Lz -BA -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -YE -Zy -Zy -Zy -Zy -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Ft -Zy -Zy -Zy -Zy -Zy -dX -TI -dX -Gb -Gq -Gq -SX -GR -HW -Gq -GR -IT -IR -cG -Gq -Kc -Kc -Gq -Gq -Go -ae -ac -ac -ac -ac -ac -ac -ac -"} -(46,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -ar -aw -aE -aE -bc -br -bs -az -NQ -dl -dM -TR -fg -fF -Ty -hk -hU -iD -jw -fh -kL -lx -mm -jX -jX -jm -hM -oL -pt -pR -dK -qM -rn -rG -Zy -Zy -Zy -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -Zy -Zy -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Va -Zy -Zy -Zy -Qj -Zy -Zy -yW -zo -zo -yW -zV -Ai -Aw -zp -AM -AZ -zp -Bj -zp -WJ -yY -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -TI -Zy -eo -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -SS -Zy -Zy -Zy -dX -Zy -Zy -Zy -dX -Gb -Gq -GR -SX -HG -HX -HX -IF -HW -Gq -Hm -JL -HW -GR -GR -KL -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(47,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -TI -Qj -ar -Om -aI -aE -aE -bp -bs -az -WI -dk -dN -dO -dO -dO -dP -dP -dO -dP -dP -dP -kM -ly -dP -dP -nl -nN -nt -nt -nt -nN -nN -nN -oW -qL -YE -TI -Zy -Zy -Cu -Zy -Zy -dX -Va -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -eo -eo -Zy -Zy -ZX -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -SS -Zy -YE -Zy -Zy -ae -ae -yX -zp -XK -yX -zW -Aj -Aj -Ai -AN -Aj -Bf -yY -Br -BC -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -TI -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ft -Zy -Zy -Zy -Zy -Zy -Zy -Zy -CS -FZ -FZ -Go -Go -GP -GP -Go -HF -Gq -IW -Rn -JM -Gq -Gq -GR -KM -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(48,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Zy -Zy -Zy -Zy -ar -aD -aG -aP -bc -bo -RR -az -zM -fa -dO -er -ex -fJ -gA -hp -gA -gA -Mj -RH -Px -lz -mn -dO -Yu -nO -ol -oM -pu -oM -Sk -qP -oW -Zy -Zy -Cu -Zy -GK -Zy -Zy -Zy -Zy -SS -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -tq -nc -yD -Nu -Nu -Nu -Nu -Nu -Nu -tq -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -SS -Zy -Zy -TI -Zy -ae -ae -yY -zq -zy -zL -zX -zp -Ax -AE -Ai -Ba -zp -yY -yX -yY -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ws -Zy -Zy -Zy -ws -Zy -QR -Zy -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -SS -Zy -TI -Zy -Zy -Zy -Zy -ZX -Zy -Xo -ae -ae -ae -FZ -HY -Iu -IG -IS -Go -GP -Go -Go -Kl -KA -KN -GP -ae -ac -ac -ac -ac -ac -ac -ac -"} -(49,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -Qj -Zy -Zy -Zy -ar -ar -ar -ar -ar -az -az -az -aC -aC -dP -es -fi -fK -gB -hq -gA -gA -jy -gA -kN -lA -gA -dO -iz -nP -om -oN -om -oN -qt -qQ -ro -rI -dX -dX -dX -Zy -Zy -TI -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -dX -te -te -te -te -te -te -te -te -dX -Zy -Zy -Zy -Cu -Zy -TI -Zy -Zy -Zy -Zy -eo -TI -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -SS -Qj -Zy -Zy -ae -ae -ae -yZ -yX -yY -yX -yX -Ak -Ay -AF -AO -AO -zp -Bk -Bs -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -ai -XN -Dm -XN -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Wp -Zy -Va -ZX -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Ga -HF -HW -HW -IU -Go -Jt -JN -GP -Go -KB -Go -Go -GP -ac -ac -ac -ac -ac -ac -ac -"} -(50,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -be -bu -bL -Lg -Pr -dn -dO -et -ex -fL -Px -hr -gA -iE -hp -Px -gD -lB -Px -mO -no -nQ -no -no -no -no -ZH -SM -rp -rp -rp -sz -rp -Zy -Zy -Zy -dX -dX -SS -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -ZX -Zy -Zy -Cu -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -dX -te -te -te -te -te -te -te -te -dX -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -ku -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -yX -yY -yY -yX -AP -yX -yX -Bl -Xw -yX -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -ii -ii -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -TI -Zy -Cu -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -ZK -Zy -SS -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -UC -Zy -TI -Qd -Ga -HF -GR -HW -IV -Go -Uu -Gq -GP -Gq -Gq -Kc -KR -Go -ac -ac -ac -ac -ac -ac -ac -"} -(51,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -ZX -TI -Zy -Qj -bf -bv -bM -cb -cH -do -dP -eu -ex -fM -gD -gA -hV -iF -gD -Px -kO -lC -mo -mP -np -nR -on -oO -pv -pT -qu -Sj -rp -SK -rp -sA -rp -rp -rp -Qj -dX -dX -SS -Zy -Zy -TI -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -dX -te -te -te -te -te -te -te -te -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -yW -AG -AQ -Lk -yX -jt -Bu -yY -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -ii -qS -ii -aj -aj -aj -aj -ai -aj -aj -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -ZX -Zy -Zy -ZX -Zy -Zy -Zy -ae -FZ -HZ -HX -HX -IW -Jj -Gq -JO -Go -Gq -Gq -HW -KL -Go -ac -ac -ac -ac -ac -ac -ac -"} -(52,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -bf -bw -bN -cc -cI -cb -dP -WW -ex -fN -gA -hs -gA -iG -hs -gD -kP -lB -gA -mO -nq -nS -oo -oP -pw -pw -Qx -qT -rq -rK -sg -sB -WF -WF -tg -dX -dX -dX -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Cu -Zy -Zy -dX -te -te -te -te -te -te -te -te -dX -Zy -TI -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Cu -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -ae -ae -ae -ae -ai -ai -ai -ai -ai -ai -ai -ae -ae -yW -AH -AQ -AQ -yW -yY -yX -yY -ae -ae -ai -ai -ai -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -ii -qS -qS -aj -aj -qS -qS -qS -OJ -qS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qc -ae -ae -GP -Go -Iv -IH -Iv -GP -GP -GP -Go -JL -HW -Gq -KM -GP -ac -ac -ac -ac -ac -ac -ac -"} -(53,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Zy -Zy -Cu -ZX -bf -bf -bf -cd -cJ -dp -dp -Kd -ex -fJ -gA -ht -hW -iH -jz -kc -iH -lD -hV -dO -UB -nT -op -oP -px -pU -Nv -qU -rr -YG -rr -sC -rp -rp -rp -dX -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -tq -St -YF -YF -YF -YF -YF -YF -YF -tq -Zy -Zy -Zy -Zy -TI -TI -TI -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -TI -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Qj -ae -ae -ae -ae -ai -yg -yg -yg -yg -yg -ai -ae -ae -yW -yW -AR -AQ -yW -ae -ae -ae -ae -ae -ai -yg -yg -ai -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -qS -aj -aj -aj -aj -qS -qS -qS -qS -qS -qS -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Pp -Nf -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -FZ -ZI -Gq -IX -GP -Jv -Jv -Jv -Gq -HW -HW -KM -GP -ac -ac -ac -ac -ac -ac -ac -"} -(54,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -bf -ce -cK -dq -dQ -ex -ex -fO -gA -hu -gA -gA -hp -kd -gA -lB -ZU -dO -ns -nU -oq -oQ -py -pV -Nv -Mb -rp -rp -rp -rp -rp -Zy -Zy -Zy -TI -dX -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -aj -aj -aj -ai -yg -yg -yg -yg -yg -ai -ae -ae -ae -aj -qS -qS -aj -aj -ae -ae -wQ -wQ -ai -yg -za -ai -wS -wQ -aj -aj -ai -aj -aj -aj -aj -wS -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -qS -ii -ii -ii -ii -qS -qS -ii -ii -qS -qS -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -TI -Zy -Zy -Zy -Zy -Zy -SS -Fg -Fj -TI -ZX -Zy -TI -Zy -Zy -Zy -dX -Zy -Zy -dX -dX -Ia -Gq -Gq -Ix -GP -Jw -JP -JP -Km -JP -KO -KV -GP -ac -ac -ac -ac -ac -ac -ac -"} -(55,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -bf -NL -cL -dr -cd -cd -dp -dP -dO -hv -hv -hv -hv -dO -dP -lE -mq -dO -nt -nN -nN -nN -nN -pW -qv -qW -rs -rM -sh -oW -Zy -YE -Zy -Zy -Zy -Zy -SS -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -YE -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -ae -ae -ae -aj -an -xS -ai -yf -yf -za -yg -yg -ai -aj -ai -aj -aj -Ky -qS -Ra -aj -ae -wS -wS -wS -ai -yf -yt -ai -wS -wS -aj -qS -OJ -qS -qS -qS -qS -wS -ai -wS -wS -aj -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -ii -ii -Vw -qS -qS -wS -wS -qS -qS -qS -qS -wS -wS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Qj -Zy -TI -Zy -SS -Fh -Fj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -dX -dX -oa -Ia -Gq -II -IY -Go -Jx -JQ -JQ -Kn -JQ -JQ -KT -Go -ac -ac -ac -ac -ac -ac -ac -"} -(56,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -bf -SE -cM -ds -dR -ey -cd -fP -gE -hw -hX -iI -gJ -WE -kQ -lF -mr -mQ -nu -nV -or -oR -nt -pX -qw -qX -rt -rN -Un -oW -TI -Zy -TI -Zy -dX -dX -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -YE -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -aj -ii -ii -So -an -yf -yt -yf -ai -ai -aj -Ui -QS -aj -aj -Ra -Ra -wS -ae -wS -wS -wS -gy -xL -ys -SL -an -wS -aj -wS -wS -wS -qS -qS -qS -qS -OJ -qS -qS -aj -wQ -wQ -ae -ae -wQ -wQ -wQ -ae -ae -ae -ae -ae -aj -aj -aj -wS -ai -wS -aj -wS -wS -qS -qS -ii -ii -qS -qS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -SS -Fg -Fj -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -dX -dX -Ia -Ix -Gq -Gq -Go -Jx -JQ -JQ -JQ -JQ -JQ -KT -GP -ac -ac -ac -ac -ac -ac -ac -"} -(57,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -bf -ch -cN -dt -dS -ez -fj -fQ -gF -fQ -hY -hY -fQ -hY -hY -lG -Lb -mt -nv -nV -iJ -iJ -nt -pY -Ml -qY -nN -nN -nN -oW -Qj -Zy -Zy -Zy -dX -dX -SS -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -ae -ae -ae -ae -wQ -wS -qS -qS -yc -zc -yH -zc -an -an -RC -ii -QS -QS -QS -aj -qS -Ky -wS -wS -wS -qS -wS -Bv -BN -BS -BV -an -BZ -Ce -wS -wS -wS -wS -qS -qS -qS -qS -qS -qS -aj -wS -ai -wS -wS -wS -wS -wS -wQ -wQ -wQ -ae -ae -ae -ae -ae -wQ -wQ -wQ -ae -wQ -wS -aj -aj -qS -qS -qS -qS -qS -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -SS -Fh -Fj -Zy -Zy -Zy -ZX -Zy -Zy -Zy -TI -Zy -Zy -Zy -ae -FZ -Iy -Iy -Iy -Go -Jy -JQ -JQ -JQ -JQ -JQ -KU -GP -ac -ac -ac -ac -ac -ac -ac -"} -(58,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -bf -ci -cO -du -dT -MK -cd -fR -gG -Lb -gI -iJ -gI -gH -kR -lH -ms -mt -nw -nW -iJ -oS -nt -pZ -qx -qZ -Xh -rO -sj -oW -TI -TI -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Cu -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -wS -wS -ii -qS -yd -yo -yI -zd -an -ii -ij -qS -qS -qS -QS -QS -qS -wS -wS -wS -qS -QS -qS -ii -ii -ii -ii -ii -Ca -Ca -aj -aj -wS -wS -QS -QS -QS -qS -qS -qS -Cj -qS -gf -qS -qS -qS -qS -aj -wS -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -BI -qS -qS -ii -ii -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -SS -Fh -Fj -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -Go -Go -GP -GP -GP -Jx -JQ -JQ -JQ -JQ -JQ -KT -GP -ac -ac -ac -ac -ac -ac -ac -"} -(59,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -bf -cj -cP -dv -ch -eB -fk -fR -gH -gH -gH -gH -gJ -Xl -iJ -lI -mt -Lb -nx -nW -Ln -oT -nN -qa -qy -ra -rt -rP -SG -oW -TI -TI -Zy -Zy -dX -Zy -SS -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -IL -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -wS -wS -an -ii -qS -wS -wS -yJ -zd -an -ii -qS -qS -qS -qS -qS -qS -qS -wS -ai -wS -qS -QS -QS -qS -qS -qS -Uy -qS -aj -aj -aj -aj -wS -wS -QS -QS -QS -QS -qS -qS -Ck -Uy -Vb -RB -qS -RB -qS -qS -wS -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -ai -wS -wS -ii -ii -VY -ai -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -SS -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -Go -Jx -JQ -JQ -JQ -JQ -JQ -KT -GP -ac -ac -ac -ac -ac -ac -ac -"} -(60,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -bf -cj -cQ -dw -dU -dr -fl -fS -gI -gH -gI -gJ -gG -kg -kS -lH -kR -iJ -Qv -nV -iJ -oU -nN -qb -qz -qY -nN -nN -nN -oW -TI -TI -Zy -dX -dX -YE -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -TI -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Zy -Zy -Zy -Zy -Xo -ae -ae -ae -ae -ae -wQ -wS -an -an -ii -ii -wS -wS -yK -ze -an -ii -qS -ii -ii -ii -ii -ii -qS -ii -So -ii -ii -qS -ii -ii -ii -ii -qS -VY -ai -wS -wS -aj -aj -aj -QS -QS -QS -QS -QS -qS -Ck -ii -qS -Uy -ii -ii -qS -RB -aj -aj -wS -wQ -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -qS -qS -qS -wS -wS -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -RN -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -Go -Jz -JU -JU -Ko -JU -JU -TK -GP -ac -ac -ac -ac -ac -ac -ac -"} -(61,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -TI -Zy -Zy -Cu -bf -ck -cR -ds -dV -eC -cd -Nn -gJ -hy -gH -Lb -gH -Xl -hy -lI -uC -mR -uC -nX -ou -oV -nt -qc -qA -qZ -Xh -rQ -sk -oW -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -TI -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -tG -aj -aj -an -an -an -an -an -ii -QS -ii -ii -ii -ii -ii -qS -ii -ii -ii -ii -qS -qS -qS -ii -ii -ii -ii -ii -ii -ii -qS -qS -wS -wS -aj -aj -aj -QS -QS -QS -QS -QS -ii -Cj -ii -wS -wS -wS -wS -ai -Wu -qS -qS -wS -wQ -wQ -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -qS -qS -qS -qS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Zy -dX -dX -Zy -Zy -Zy -dX -dX -dX -ae -ae -ae -ae -ae -ae -ae -Go -Go -GP -GP -GP -Go -GP -Go -Go -ac -ac -ac -ac -ac -ac -ac -"} -(62,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -bf -cl -cS -dr -dW -eD -cd -Vu -gK -Xl -gG -iJ -gI -Xl -gI -lK -ms -Xl -nA -nY -VJ -oV -nN -qd -qB -rb -rt -rR -TD -oW -Qj -Zy -Zy -Zy -Pp -Mz -Nf -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -Zy -Zy -Zy -Zy -ae -ae -ae -ae -aj -an -xk -xk -xC -xC -xk -xk -ii -QS -qS -qS -qS -qS -QS -QS -qS -qS -qS -qS -qS -qS -QS -qS -qS -qS -QS -qS -qS -ii -ii -qS -TY -aj -aj -aj -aj -QS -QS -QS -qS -qS -ii -wS -wS -aj -wS -wS -wS -wS -qS -RB -RB -ai -aj -wS -wS -wS -wS -ae -ae -ae -wQ -wQ -wQ -ae -ae -wQ -wQ -wS -qS -ii -ii -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -FP -te -dX -dX -Cu -TI -dX -te -Gf -tq -tq -tq -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(63,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -bf -bf -bf -bf -bf -bf -bf -fV -gL -hA -ib -iL -jB -iL -iL -lL -mv -Lb -nA -fW -fW -oW -nt -qe -qC -oW -oW -oW -oW -oW -Zy -Zy -dX -Zy -SS -Zy -Zy -dX -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -ae -aj -xa -xl -xl -xl -xK -xl -xl -an -ii -ii -wS -qS -QS -QS -QS -qS -qS -qS -qS -ii -ii -ii -ii -ii -qS -qS -qS -qS -qS -qS -ii -qS -qS -ii -qS -ii -ii -qS -qS -ii -qS -VY -ai -wS -aj -QS -QS -qS -qS -qS -qS -ii -WH -ii -ii -qS -qS -wS -ae -ae -ae -wS -wS -wS -ai -aj -wS -wS -wS -aj -ii -ii -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Fn -Gw -Fx -FE -NH -NH -FE -Fx -Fy -GS -Ho -Ho -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(64,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -fm -fW -fW -fW -fW -fW -fW -fW -fW -fW -fW -fW -fW -fW -jC -oX -pz -qf -Nv -oW -Zy -Qj -Zy -Zy -Zy -dX -Pp -Mz -Nf -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -aj -xa -xl -xl -xl -xl -xl -xl -yp -ii -wS -wS -qS -QS -QS -QS -qS -qS -BI -qS -ii -an -an -an -ii -ii -ii -ij -qS -qS -qS -qS -QS -QS -QS -qS -ii -ii -BI -qS -qS -qS -qS -wS -wS -aj -QS -QS -QS -QS -qS -qS -qS -qS -qS -Ou -QS -qS -wS -aj -ai -aj -aj -qS -qS -OJ -ii -qS -qS -qS -ii -ii -qS -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Fo -Fx -te -dX -Zy -Zy -dX -te -Gt -GT -Hp -Ho -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(65,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -TI -jC -iM -kT -hB -mw -kT -iM -iM -jD -oW -oW -oW -oW -oW -Zy -ZX -Zy -Zy -Zy -dX -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -wQ -ai -MW -xl -xl -xl -xl -xl -xl -yq -ii -wS -wS -wS -qS -QS -Am -Az -wS -ai -wS -wS -wS -Bv -xT -an -xE -xL -xT -Az -Am -Am -QS -LY -QS -qS -qS -qS -qS -ai -aj -wS -wS -wS -aj -ae -aj -aj -aj -wS -wS -wS -aj -QS -QS -qS -qS -WR -Ou -QS -QS -Ui -aj -aj -qS -ii -qS -aj -aj -qS -qS -ii -Vw -qS -qS -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Fp -Fx -te -dX -dX -Zy -dX -te -WV -tq -tq -tq -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(66,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -gM -hB -hB -iM -jD -Cu -TI -TI -Zy -TI -Zy -Zy -TI -Qj -ZX -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -wQ -ai -MW -xl -xl -xl -xl -xl -xl -yq -an -ii -qS -qS -qS -qS -Am -Az -wS -wQ -wQ -wQ -wS -Ub -ys -ys -Ly -BK -xM -Az -Az -Am -wS -ai -wS -wS -wS -aj -wS -wS -wS -wQ -wQ -wQ -ae -ae -ae -ae -ae -wQ -wQ -wQ -aj -QS -QS -QS -qS -RP -LQ -QS -QS -QS -aj -qS -qS -ii -qS -aj -aj -qS -qS -qS -ai -aj -aj -wS -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -WA -Fx -te -te -dX -ZX -dX -te -Gv -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(67,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Cu -Zy -ZX -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -gN -Cu -Zy -Zy -Zy -Qj -TI -TI -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -dX -dX -SS -Zy -Zy -YE -Zy -ZX -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -Zy -Zy -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -wQ -wS -xa -xl -xl -xl -xl -xl -xl -yr -an -ii -ii -ii -ii -qS -Am -Az -wS -wQ -wQ -wQ -wS -ai -yt -yf -ai -aj -aj -aj -wS -wS -wS -wS -wQ -wQ -wQ -ae -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -wS -wS -ai -ve -qS -Qf -RP -Ph -ii -ii -ii -qS -wS -wS -aj -aj -aj -wS -wS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Fn -Fu -Fy -te -dX -Zy -dX -te -WV -tq -tq -tq -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(68,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -gN -Qj -fY -fY -fY -fY -fY -fY -fY -fY -fY -dX -Zy -Zy -dX -dX -dX -dX -Zy -dX -dX -dX -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -Zy -Zy -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -wQ -wS -xa -xl -xl -xl -xl -xl -xl -yp -an -an -an -an -an -zY -aj -wS -wS -ae -ae -wQ -wQ -ai -yu -yg -ai -ae -ae -ae -wQ -wQ -wQ -wQ -wQ -wQ -wQ -ae -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -wS -wS -wS -aj -aj -wS -wS -ai -UQ -ii -Lt -qS -wS -ae -wQ -ae -ae -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -tq -Fp -Fx -te -dX -Zy -dX -te -Gw -GS -Ho -Ho -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(69,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -fX -gO -ic -ic -iN -jE -kh -kU -lM -Yd -mS -Yn -dX -dX -Zy -Zy -dX -Zy -Zy -dX -Zy -Zy -Zy -Zy -Pp -Nf -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -eo -eo -eo -eo -Zy -Zy -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -wQ -wS -an -xp -xp -xD -xD -xp -xp -an -gT -an -an -an -an -zY -aj -wQ -wQ -ae -ae -ae -ae -ai -yg -yg -ai -ae -ae -ae -ae -wQ -wQ -wQ -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -qS -wS -wS -aj -qS -qS -qS -qS -qS -Dv -Ql -ai -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -Fp -RS -Fx -FE -NH -FE -Fx -Fu -GT -Hp -Ho -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(70,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -fY -gP -hD -id -Us -iW -ki -kV -lN -my -mT -Yn -dX -dX -Zy -Zy -dX -dX -Zy -Zy -Zy -Zy -Zy -Zy -SS -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -XX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -Zy -YE -Zy -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -wQ -wS -aj -aj -an -an -an -an -an -an -an -zf -zf -We -zN -aj -aj -ae -ae -ae -ae -ae -ae -ai -ai -ai -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -qS -qS -qS -qS -qS -qS -qS -Lt -RB -qS -Lt -qS -LQ -qS -wS -RP -RP -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -tq -tq -tq -Zy -dX -Zy -dX -te -Gf -tq -tq -tq -tq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(71,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -TI -Zy -Zy -Zy -ZX -Zy -TI -Zy -Zy -fY -Ux -Oe -ie -iP -jF -kj -kW -id -ld -mU -fY -dX -Zy -Zy -Zy -YE -Zy -Zy -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Tf -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -eo -eo -eo -eo -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -wS -xE -xL -xT -an -xE -yL -wS -wS -ai -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -aj -aj -qS -an -RP -Zx -RP -Kz -MV -Kz -wS -wS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -dX -dX -dX -dX -Fj -HI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(72,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -fY -Rj -Oe -if -iQ -jG -kk -kX -ie -mz -mz -fY -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -eo -eo -eo -eo -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wS -wS -xF -xM -xn -ys -ys -NF -wS -wQ -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -Kz -Qf -an -Kz -an -Kz -an -RP -an -CC -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Xo -Zy -Cu -Zy -Zy -Zy -Fj -Hq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(73,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -ZX -Zy -Qj -fY -gS -hE -id -iR -jH -ie -kY -id -mA -mV -fY -Qj -Zy -YE -Zy -Zy -dX -Zy -dX -Zy -Zy -Zy -Pp -Nf -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -wS -wS -ai -yf -yt -ai -aj -ae -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -CC -RP -RP -Lm -wS -RP -RP -RP -an -CC -CC -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -TI -Zy -Hq -Hq -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(74,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -fY -fY -fY -fY -iS -jI -id -kZ -lO -mB -Ua -fY -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -ai -yg -yu -ai -ae -ae -wQ -wQ -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -CC -CC -an -DN -an -RP -an -wS -aj -CC -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Mz -Mz -mp -Mz -mp -Mz -Yf -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(75,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -dX -fY -iT -jJ -ie -RZ -lP -mC -mX -fY -Zy -TI -Zy -YE -dX -Zy -Zy -Zy -Zy -ZK -Zy -SS -Zy -YE -Zy -TI -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ai -yg -yg -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -CC -CC -Mq -an -an -an -wS -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(76,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Cu -Zy -eE -eE -eE -eE -Zy -fY -iU -jH -id -id -lQ -id -ie -fY -ZJ -Zy -Zy -Zy -Zy -Zy -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ai -ai -ai -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -CC -Yr -an -Sd -CC -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Cu -Zy -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(77,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eE -fn -fZ -eE -Zy -fY -iV -jK -jK -lb -lR -hE -Wt -nB -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Pp -Nf -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -CC -CC -CC -Sd -DX -Yr -CC -an -an -an -an -CC -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -YE -Zy -Zy -Cu -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(78,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -eF -fo -LW -eE -Qj -fY -iW -jL -kl -lc -hE -jL -iW -nB -dX -dX -Zy -Zy -dX -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -an -CC -an -DY -Mq -CC -an -an -an -an -CC -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ZK -TI -Zy -Zy -Zy -Xo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(79,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -eE -fp -gb -eE -Zy -fY -iW -iW -iW -iW -iW -hE -hE -nB -oa -dX -dX -Zy -Zy -Zy -dX -TI -Zy -Zy -SS -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wQ -wQ -wS -aj -an -CC -Mq -LI -an -CC -El -an -an -EE -CC -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(80,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eE -eE -eE -eE -Zy -fY -Lu -jM -km -ld -iW -hE -hE -nB -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -ZK -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -bP -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wS -wS -an -Dx -CC -DH -bC -DH -CC -Em -Mq -an -EF -CC -AU -Ru -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -IL -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(81,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -dX -Zy -Zy -Cu -Zy -fY -fY -fY -fY -fY -fY -fY -fY -fY -ZJ -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Pp -Kv -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 -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -TI -TI -Zy -YE -Zy -Zy -Zy -ZK -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Zy -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Aa -Aa -Aa -Aa -Aa -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -IL -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -wS -an -an -LR -ke -ka -ka -ka -SZ -En -OH -Mq -EE -CC -Ym -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -ts -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(82,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -dX -Zy -dX -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -YE -Zy -dX -dX -Zy -Zy -Zy -SS -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -QE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -zZ -Aa -zD -zD -XR -Aa -Aa -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -TI -TI -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -wS -an -Mq -fe -DH -ka -Ea -PQ -DH -Eo -XD -Mq -EG -CC -Ym -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(83,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -YE -Zy -Zy -YE -dX -Zy -Zy -Zy -dX -TI -Zy -Zy -dX -Zy -Zy -Zy -Zy -dX -dX -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Xo -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Aa -zD -AA -zD -zD -zD -Aa -Zy -Zy -Aa -Aa -Aa -Aa -Aa -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Qj -TI -Zy -Qj -Zy -ae -ae -ae -CC -CC -CC -CC -CC -CC -CC -Tm -CJ -ka -CC -CC -CC -CC -CC -CC -ET -Ym -Zy -Zy -bB -Zy -ae -ae -ae -Ct -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -IL -Zy -Zy -TI -Zy -TI -Zy -Cu -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(84,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -SS -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Tf -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Aa -zD -zD -AI -zD -zD -Aa -Zy -zZ -Aa -zD -zD -Gu -Aa -Aa -ae -ae -ae -ae -Zn -Zy -Zy -Xo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -MN -Zy -Zy -AU -CC -CH -CH -De -CH -CH -DH -ka -Eb -PQ -DH -CH -Eu -Ez -EH -EN -CC -Ym -Zy -Zy -Zy -Zy -Qj -Ym -Cv -Cv -EZ -Ct -ae -ae -ae -ae -ae -Zy -Qj -Zy -Zy -Zy -TI -Zy -Zy -YE -TI -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(85,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ZK -TI -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Aa -zD -zD -zD -zD -zD -Aa -TI -Aa -zD -zD -zD -zD -zD -Aa -Zy -Zy -ZX -yv -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Cu -TI -Zy -YE -Zy -Zy -Zy -Zy -Ym -CC -CI -CT -Df -Di -DA -DI -Vp -Ea -ka -Ej -Ep -Di -Di -Di -EO -CC -AU -Zy -QD -Zy -Zy -Zy -Ym -Ym -Cv -Ct -Ct -ae -ae -ae -ae -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(86,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -Zy -Zy -TI -SS -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -YE -Xo -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Aa -Aa -zD -zD -zD -Aa -Aa -Zy -Aa -zD -zD -AI -zD -zD -Aa -Qj -Zy -Zy -yv -Zy -Zy -Zy -Zy -TI -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Ym -CC -CJ -TT -Dg -Dq -DB -DJ -DR -Dq -Eg -Ek -DR -DB -EA -Xd -EP -CC -Ym -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(87,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -Zy -Zy -Zy -SS -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -TI -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Aa -Aa -zD -Aa -Aa -Zy -Zy -Aa -zD -zD -zD -AA -zD -Aa -Zy -Zy -Zy -yv -TI -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -YE -MN -Zy -Zy -Zy -Zy -MN -Zy -Zy -TI -Zy -AU -CC -CK -Tm -Dh -Dr -DC -DK -DC -DC -DC -Ej -Eq -Ev -EB -XS -EH -CC -Ym -Zy -MN -MN -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Zy -Zy -Cu -Zy -Zy -YE -TI -Zy -Zy -Zy -ZK -Cu -TI -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(88,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -ae -ae -ae -ae -ae -Zy -yv -ae -ae -Zy -Qj -Zy -Aa -zD -Aa -Zy -Zy -Qj -Aa -Aa -zD -zD -zD -Aa -Aa -Zy -Zy -TI -yv -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Ym -CC -CL -CW -Di -Ds -Di -CC -ka -PW -ka -CC -Di -Ew -Ep -EK -EQ -CC -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zn -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(89,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -dX -dX -Zy -Zy -Zy -Zy -SS -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -YE -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Qj -Zy -Zy -Zy -Qj -TI -yv -Zy -Qj -Zy -Zy -Zy -Aa -Ao -Aa -Zy -Zy -Zy -Zy -Aa -Aa -zD -Aa -Aa -Zy -Zy -Zy -Zy -yv -yv -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -QD -Zy -Zy -Zy -Zy -CC -OA -ka -BU -VB -Ye -CC -DT -Ed -DT -CC -Wx -Qp -SV -Rs -OR -CC -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -IL -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(90,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -dX -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -YE -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -yv -Zy -Zy -YE -Zy -TI -as -AU -Tk -Zy -TI -Zy -Zy -Zy -Aa -zD -Aa -Zy -Qj -Zy -YE -Zy -Zy -yv -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ct -Zy -Zy -CC -QO -Yk -Rs -CC -CC -CC -DU -DU -DU -CC -CC -CC -ED -au -ES -CC -Zy -Zy -Ct -Ct -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(91,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ah -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -SS -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -ZX -Zy -yv -yv -Zy -Zy -Zy -Zy -Zy -as -Ym -Tk -Zy -Zy -Zy -TI -Zy -Aa -Ao -Aa -Zy -Zy -Zy -Zy -ZX -Zy -yv -yv -Zy -Zy -Zy -Zy -YE -Cu -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -bB -Zy -Zy -Zy -Ym -Zy -Qj -CC -CO -CZ -CZ -CD -AU -CC -gj -Vl -zz -CC -AU -CC -CH -EM -CH -CC -Ym -Zy -Cv -Ym -Zy -ZX -Zy -Zy -Zy -Ym -Ym -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(92,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ai -aj -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ae -ae -gl -Mz -Mz -ZM -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -dX -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Zy -Zy -yv -Zy -Zy -TI -Zy -Cu -ZX -as -Ym -Ym -vh -vh -Uj -Zy -Zy -as -AU -Tk -Zy -Zy -TI -Cu -Zy -Zy -Zy -yv -YE -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -IL -Zy -Zy -TI -Zy -Zy -Ym -Zy -ZX -CD -CP -CP -CP -Wy -Rm -Ym -Ym -AU -Ym -Ym -Ym -CD -CP -CP -CP -CC -AU -Zy -Ym -Ym -Zy -Ct -Zy -Zy -Zy -Ym -Ym -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(93,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -ap -Lq -ap -ap -aj -aj -ap -ap -ap -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -dX -dX -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Cu -TI -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -TI -Zy -yv -ny -Uj -Zy -Zy -Zy -Vm -Ym -Ym -QH -QH -PY -Ym -vh -vh -Ym -Ym -Tk -Zy -Zy -Zy -TA -Zy -YE -Zy -yv -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Zy -Zy -CE -CQ -Da -Dl -AU -Ym -Rm -Ym -Ym -Ym -Rm -AU -QY -CQ -Da -Dl -CC -Ym -bB -Ym -Ym -Zy -Ym -Ru -Zy -ZX -Ym -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Qj -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(94,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -an -ap -aj -ap -ap -ap -ap -ap -ap -aj -Lq -dx -dx -eG -eG -ap -ai -ai -ai -ai -Zy -Va -Zy -Zy -Zy -Zy -Zy -dX -Zy -Zy -dX -dX -dX -dX -Zy -Pp -Kv -Zy -ZK -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -tF -tF -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Rd -Rd -Ym -vh -vh -yM -QH -QH -MR -Zy -Zy -Zy -TM -QH -Ym -Ym -Ym -Ma -Zy -TI -Zy -Zy -Zy -Zy -Zy -yv -Zy -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Zy -Zy -AU -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -AU -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Ym -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(95,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -an -an -an -aj -aj -an -an -aj -an -ap -ap -ap -eG -eG -ap -ap -Lq -ih -iZ -dX -SS -Zy -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -dX -Zy -Va -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -tF -tF -eo -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -YE -tF -tF -tF -tF -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Rd -Ym -Ym -QH -MR -Zy -Zy -Zy -Zy -Zy -Zy -tF -Zy -Zy -TM -Ym -Ym -Tk -Zy -Zy -Zy -Zy -TI -Zy -Zy -tF -tF -tF -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -ZX -Zy -Ru -Ct -Ct -Ct -Zy -bB -MN -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(96,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -aj -at -an -an -an -an -an -aj -an -cT -an -an -eH -an -ap -gT -an -ii -ii -dX -Li -dX -dX -Zy -dX -Zy -Zy -dX -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -tF -tF -tF -tF -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -eo -Zy -tF -tF -tF -tF -tF -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -ZX -Zy -TI -Zy -Rd -Rd -Tk -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -tF -tF -tF -Zy -as -Ym -Tk -Zy -YE -tF -tF -Zy -Zy -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Ct -Cv -Ym -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(97,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -an -an -an -an -an -aj -aj -aj -aj -aj -at -an -an -cT -an -an -an -ij -ji -dX -SS -Zy -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -Zy -Ft -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -tF -tF -tF -tF -tF -eo -eo -Zy -Zy -Zy -eo -Zy -Zy -eo -eo -tF -tF -tF -tF -tF -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -ZX -Zy -yv -bn -Ym -tF -tF -Qj -TI -Zy -Zy -Zy -TI -tF -tF -tF -Zy -as -Ym -Tk -Zy -Zy -tF -tF -tF -tF -tF -tF -tF -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -MN -Zy -Zy -Zy -Ym -Ym -Ym -Ru -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -IL -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(98,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -aj -aj -an -an -aj -aj -aj -aj -aj -aj -an -an -eI -an -an -an -an -ij -jb -dX -kr -dX -Zy -Zy -dX -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -YE -Zy -tF -tF -tF -tF -tF -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -tF -tF -tF -tF -tF -Zy -Zy -TI -Zy -Zy -Zy -Zy -Cu -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -Zy -Zy -yv -Qj -zt -zu -zu -zu -zu -Zy -Zy -tF -tF -tF -tF -tF -tF -tF -Ym -Tk -Zy -TI -tF -tF -tF -tF -tF -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -ZX -Ym -Ym -Ym -Zy -Zy -ZX -MN -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(99,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -aj -an -an -an -at -an -an -aj -an -an -an -cT -an -eH -an -gT -an -ii -ii -dX -Ft -Zy -Zy -Zy -Zy -dX -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Li -Zy -Zy -Cu -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 -tF -tF -tF -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -tF -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -yv -yv -Zy -zu -zC -rY -Ac -zu -Qj -Zy -tF -tF -tF -tF -tF -tF -tF -Ym -Tk -Zy -tF -tF -tF -tF -tF -tF -tF -tF -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -QD -Ym -Ym -Zy -Ym -Zy -MN -Zy -Zy -Cu -Zy -Zy -YE -Zy -Cu -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(100,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -an -an -aj -an -aj -aj -an -an -an -ap -ap -ap -eG -eG -ap -ap -Sf -ik -iZ -dX -kr -dX -Zy -dX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -tF -tF -tF -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -TI -yv -Zy -tF -zu -zD -zD -zD -zu -Zy -Zy -Zy -tF -tF -tF -tF -tF -Ym -Ym -Tk -Zy -tF -tF -tF -tF -tF -tF -tF -tF -Zy -TI -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Ct -Zy -Ym -Zb -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -ZX -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -QD -Zy -Zy -Zy -Zy -ov -Zy -Zy -YE -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(101,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -ap -aj -ap -ap -aj -aj -ap -ap -aj -YR -dy -ap -eG -eG -ap -ai -ai -ai -ai -Zy -Va -Zy -Zy -Zy -Zy -Cu -Zy -TI -Zy -Zy -Zy -ZK -Zy -Zy -Va -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -TI -Zy -ZX -Zy -yv -Zy -tF -zu -zE -zQ -zD -Ao -Qj -Zy -ZX -tF -tF -tF -tF -tF -Ym -Ym -tF -tF -tF -tF -tF -tF -tF -tF -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Ym -Ym -Zy -Ym -Zy -Zy -bB -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(102,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -aj -aj -aj -ap -Sf -ap -ap -ap -ap -ap -ap -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -XI -SS -Zy -YE -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Pp -Mz -Mz -Kv -Zy -YE -TI -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -yv -tF -tF -zu -zu -zu -zu -zu -Zy -Zy -Zy -tF -tF -tF -tF -Ym -Ym -Ym -tF -tF -tF -tF -tF -tF -tF -tF -tF -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -TI -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(103,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ai -ai -aj -ai -ai -ai -aj -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ae -ae -ae -gl -Mz -Kv -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -TI -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -eo -eo -eo -eo -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -tF -tF -tF -Qj -Zy -Zy -Qj -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -as -Ym -Ym -tF -tF -tF -tF -tF -tF -tF -tF -tF -tF -tF -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -bB -TI -Zy -Ym -Ym -Ym -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -va -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(104,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ai -ai -ai -ai -aj -aj -ai -ai -ai -ai -ai -ai -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -SS -TI -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -tq -yD -Nu -Nu -Nu -JV -JV -JV -yD -nc -tq -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -YE -Zy -Zy -yv -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Vm -vh -vh -vh -UM -Ym -Ym -tF -tF -tF -tF -tF -tF -tF -tF -tF -Zy -Zy -Zy -ZX -Zy -Zy -TI -Zy -Zy -TI -Zy -Zy -Zy -Zy -Ym -Ym -Ym -ZX -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -TI -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(105,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -YE -Zy -Zy -TI -SS -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 -Cu -Zy -ZX -Zy -Zy -TI -Zy -Zy -dX -te -te -te -te -JV -JV -JV -te -dX -dX -Zy -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -Zy -ZX -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -TI -Zy -yv -yv -Zy -YE -Zy -Zy -Zy -TI -Zy -Vm -vh -UM -Ym -Ym -QH -QH -Ym -Ym -tF -tF -tF -tF -tF -tF -tF -tF -tF -Zy -TI -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Zy -Zy -Ym -va -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(106,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -YE -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -te -te -te -JV -JV -JV -te -te -te -dX -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -TI -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -eo -eo -eo -eo -eo -Zy -ZK -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -yv -Zy -Zy -Zy -TI -ZX -Zy -Vm -Ym -Ym -QH -QH -MR -TI -Zy -as -Ym -Ym -Uj -Zy -tF -tF -tF -TI -Zy -yv -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Ym -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Ym -Zy -Zy -MN -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(107,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -ZX -Zy -dX -te -te -te -JV -JV -te -te -te -te -dX -Zy -TI -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -YE -Zy -TI -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -yv -Zy -Zy -Zy -Zy -Zy -Zy -as -AU -Tk -Zy -Zy -Zy -Zy -Zy -as -AU -Ym -Ym -vh -Uj -Zy -Zy -Zy -YE -yv -yv -Zy -ZX -Zy -TI -Zy -TI -Zy -Zy -Zy -Zy -Zy -va -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Ym -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(108,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Pp -Mz -Mz -Kv -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -dX -te -te -te -JV -JV -JV -JV -te -te -dX -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -ZX -Zy -yv -yv -Zy -Zy -TI -Zy -Zy -Aa -Ao -Aa -Qj -Zy -YE -Cu -Qj -Aa -Ao -Aa -QH -QH -Ym -Uj -Zy -Zy -Vm -Rd -yv -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Ym -Zy -Zy -Ct -Zy -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zb -Ym -Ym -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(109,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -SS -Zy -Zy -ZK -Zy -Zy -TI -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -tq -St -YF -YF -JV -JV -JV -JV -St -Of -tq -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Qj -Zy -Zy -Qj -Zy -YE -Zy -Zy -YE -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -yv -Zy -TA -Zy -Qj -Zy -Aa -zD -Aa -Zy -Zy -Zy -TI -Zy -Aa -zD -Aa -Zy -Zy -TM -QH -vh -vh -Ym -Rd -Rd -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Ym -bB -Zy -Ym -Zy -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Cu -Zy -Zy -Zy -TI -Zy -Zy -IL -Zy -TI -Zy -Zy -YE -Zy -Zy -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(110,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Pp -Mz -Mz -Kv -Zy -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -ZK -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Zy -TI -Zy -Zy -ae -ae -ae -ae -ae -Zy -Zy -Qj -Zy -Zy -Zy -Xo -Zy -Zy -Zy -Zy -Zy -Tf -Zy -SU -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -TI -yv -Zy -Zy -Zy -Zy -Aa -Aa -zD -Aa -Aa -Zy -Qj -Zy -Aa -Aa -zD -Aa -Aa -Qj -Zy -Zy -TM -Ym -Ym -Ym -Rd -Zy -Zy -ZX -TI -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Ym -Zy -Zy -Ym -Zy -Zy -Zy -Ym -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -MN -Zy -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -YE -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(111,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -Cu -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -YE -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Xo -Zy -Zy -Zy -SU -MG -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -yv -yv -Zy -Zy -Zy -zZ -Aa -zD -zD -zD -Aa -Aa -Zy -zZ -Aa -zD -zD -zD -Aa -Aa -Zy -TI -Zy -TM -Ym -Rd -Rd -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ym -Zy -Zy -Zy -Zy -Ru -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(112,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -TI -Zy -Pp -Mz -Mz -Kv -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -YE -TI -Zy -Qq -Zy -Zy -ai -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -RY -LT -Zy -Zy -TI -Zy -Zy -Zy -TI -Zy -YE -Zy -Zy -Zy -Zy -yv -Zy -TI -Zy -Qj -Aa -zD -zD -zD -zD -zD -Aa -Zy -Aa -zD -AA -zD -zD -zD -Aa -Zy -Zy -Cu -Zy -TM -Rd -yv -Zy -ZX -Zy -TI -Zy -Zy -Zy -Zy -ZX -Zy -Zy -TI -Zy -Zy -Ym -Zy -MN -Zy -Zy -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -Zy -YE -TI -Zy -Zy -YE -TI -Zy -ZK -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(113,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -SS -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Cu -Zy -eo -eo -eo -eo -eo -eo -eo -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -tG -jx -jx -jx -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -yv -Zy -Zy -Zy -Zy -Aa -zD -AA -AI -zD -zD -Aa -TI -Aa -zD -zD -AI -zD -zD -Aa -Qj -Zy -YE -TI -Zy -yv -yv -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -TI -Zy -Zy -Ym -Zy -Zy -Zy -bB -Zy -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -ZX -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Cu -Zy -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(114,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -SS -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -YE -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -TI -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -Zy -YE -TI -Zy -Zy -Zy -YE -Zy -TI -Qj -ae -ae -ae -ae -aj -qS -KC -qS -qS -qS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -yv -Zy -Zy -YE -Zy -Aa -zD -zD -zD -zD -zD -Aa -TI -Aa -zD -zD -zD -zD -zD -Aa -Zy -Zy -Zy -Qj -Zy -yv -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Ru -Zy -Zy -Zy -Ym -Zy -Zy -Zy -Zy -Zy -AU -Ym -Ym -Ym -AU -Ym -Ym -Ym -AU -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ct -Zy -Zy -wd -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -YE -TI -Zy -TI -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(115,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ku -Mz -Kv -Zy -ZK -Zy -Zy -Zy -Zy -ZK -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 -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zy -Zy -ZK -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -aj -qS -qS -qS -nr -KC -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -TI -Zy -yv -Qj -Zy -Zy -Zy -Aa -Aa -zD -zD -Gu -Aa -Aa -Zy -Aa -Aa -zD -zD -BM -Aa -Aa -ae -ae -ae -ae -ae -yv -Zy -Zy -Zy -Zy -ZX -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Ym -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Ym -Zy -Ym -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -TI -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -TI -SU -Sw -Zy -TI -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(116,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -ZK -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Lh -Zy -Zy -Qj -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -Zn -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -qS -nr -qS -qS -YC -qS -qS -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Aa -Aa -Aa -Aa -Aa -Zy -Qj -Zy -Aa -Aa -Aa -Aa -Aa -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Ym -AU -Ym -Ym -AU -Ym -Ym -Ym -Zy -Qj -Ym -Zy -Zy -Zy -Zy -YE -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -TI -TI -SA -TI -Yt -SU -TI -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(117,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -Zy -Zy -Qj -Zy -Cu -Zy -Zy -ae -ae -ae -ae -ae -Qj -ae -ae -ae -ae -ae -Qj -Zy -Zy -eo -eo -eo -eo -eo -eo -eo -eo -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -KC -qS -Tw -qS -qS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Xo -TI -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Ym -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -Zy -Zy -Qj -Zy -TI -Zy -Zy -Zy -Zy -Zy -SU -Na -TI -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(118,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -YE -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Cu -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -ji -Zy -eo -eo -eo -eo -eo -eo -Qj -TI -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -Bq -QI -qS -qS -XY -XY -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Cu -Zy -Zy -Zy -Zy -IL -Zy -Zy -YE -Cu -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(119,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Cu -Zy -Zy -Zy -Zy -Zy -Zy -YE -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -XV -QS -QS -QS -XV -tG -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -RP -QI -XY -XY -wm -qS -Ps -RP -aj -ae -aj -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -YE -Zy -TI -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(120,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -TI -Zy -Zy -Zy -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -FC -RP -FC -aj -aj -aj -RP -XB -XY -wm -ii -qS -Pb -VQ -aj -aj -aj -Fv -RP -RP -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Qj -Zy -Zy -Zy -Zy -Zy -YE -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(121,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Xo -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -aj -ae -ae -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -RP -RP -RP -RP -aj -aj -aj -aj -aj -qS -qS -qS -qS -qS -qS -qS -aj -mN -RP -ZT -Vf -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -YE -Zy -Qj -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(122,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -ZK -Zy -TI -Zy -Zy -Zy -Zy -YE -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -QS -aj -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -SF -st -RP -RP -xU -aj -aj -aj -aj -aj -aj -aj -qS -aj -qS -qS -aj -RP -Zw -CA -Zw -RP -OV -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(123,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Zy -Qj -Zy -Zy -Zy -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -QS -QS -QS -QS -QS -QS -aj -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -RP -RP -RP -RP -aj -aj -aj -aj -aj -aj -aj -qS -aj -aj -qS -aj -Vf -RP -ZT -RP -RP -OV -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(124,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -TI -Zy -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -RP -RP -SF -aj -aj -aj -aj -aj -aj -aj -aj -aj -qS -qS -qS -Pb -RP -RP -RP -RP -OV -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(125,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Zy -Zy -Qj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -RP -RP -RP -RP -RP -RP -aj -aj -aj -aj -aj -aj -aj -aj -QS -qS -Ps -RP -aj -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(126,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Pd -Pd -Pd -ae -ae -ae -aj -aj -Zv -RP -RP -RP -VQ -RP -Oz -Oz -aj -aj -aj -aj -aj -QS -qS -Ps -RP -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(127,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -BJ -QS -QS -QS -QS -QS -QS -QS -QS -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Pd -Pd -Pd -Mo -Pd -ae -ae -ae -ae -aj -aj -RP -RP -XB -qS -Ps -RP -RP -aj -aj -aj -aj -aj -aj -qS -Ps -RP -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(128,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -aj -aj -aj -aj -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Pd -Pd -Pd -Pd -Pd -Pd -ae -ae -ae -ae -ae -aj -aj -aj -aj -qS -Ps -RP -Bb -qS -qS -aj -aj -aj -aj -qS -Ps -TZ -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(129,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -aj -aj -aj -ae -ae -ae -ae -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Pd -Mo -Pd -Pd -Pd -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -qS -qS -qS -qS -QS -qS -qS -qS -Ps -TZ -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(130,1,1) = {" -ac -ac -ac -ac -ac -ac -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -aj -QS -QS -QS -QS -QS -QS -QS -QS -QS -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -Pd -Pd -Pd -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -aj -aj -aj -NR -tu -QS -QS -qS -qS -aj -aj -aj -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ae -ac -ac -ac -ac -ac -ac -ac -"} -(131,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -tE -tE -tE -tE -tE -tE -tE -tE -tE -tE -tE -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -tE -tE -tE -tE -tE -tE -tE -tE -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(132,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(133,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(134,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(135,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(136,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(137,1,1) = {" -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -ac -"} -(138,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Uq -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(139,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(140,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(141,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(142,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(143,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(144,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(145,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(146,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eK -eK -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(147,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eK -eK -eJ -eK -eK -eK -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -wN -WN -WN -Vo -WN -WN -wN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eL -eJ -eJ -eJ -eJ -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(148,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eK -eK -gc -KP -gc -XP -eK -eJ -gc -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -wN -wN -eJ -eJ -WN -wN -WN -WN -WN -wN -wN -LM -cm -wN -wN -wN -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -eJ -eJ -eJ -eL -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(149,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -gc -gc -gV -gV -gc -gc -eK -eK -eJ -eK -eK -eK -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eK -eJ -eJ -eK -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -WN -WN -Vo -wN -wN -WN -WN -WN -QM -WN -WN -eJ -eJ -eJ -WN -WN -WN -WN -WN -UT -WN -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -fr -eJ -eL -eJ -eJ -eJ -eJ -fr -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -fr -fr -eJ -eJ -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(150,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -eJ -gU -hF -im -gc -gc -gc -eK -gc -eK -eK -eK -eK -eK -eJ -eJ -eJ -eJ -eJ -eJ -WN -gc -WN -WN -Nz -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -wN -cm -WN -wN -eJ -eJ -WN -WN -WN -cm -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -WN -QM -WN -wN -WN -WN -WN -eJ -ge -ge -ge -eJ -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -fr -fr -fr -eJ -eL -eJ -fr -fr -fr -eJ -eJ -eJ -eL -fr -eL -fr -eJ -eJ -eJ -eJ -fr -eL -eJ -eJ -eL -eL -fr -fr -fr -eJ -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -eJ -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(151,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eK -eK -XP -gc -gc -gV -gU -gV -gc -eJ -eK -gc -eK -eK -eK -eK -eJ -eJ -eJ -eK -eJ -eK -WN -WN -gc -WN -gc -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -Re -wN -eJ -eJ -eJ -eJ -eJ -eJ -WN -wN -wN -WN -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -gW -eJ -ge -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -eJ -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eJ -fr -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -eJ -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -gW -WN -WN -gW -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(152,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eK -eK -gc -gc -gV -gc -gc -jO -gc -gc -gc -gc -gc -eK -eK -gc -eK -eK -eJ -gc -gV -WN -gc -WN -WN -gc -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -QM -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -wN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -UT -WN -QP -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -fr -fr -eJ -eL -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eJ -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(153,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -eK -gc -gc -gc -gc -gc -gc -gV -gc -gc -gV -gc -gc -gc -eJ -eK -gc -gc -gV -WN -gU -gc -gc -WN -WN -WN -WN -QP -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -cm -WN -wN -wN -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eL -eJ -eJ -eJ -eJ -fr -eJ -eJ -fr -fr -fr -eJ -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -fr -eJ -eJ -eL -eJ -eJ -eJ -fr -eJ -eJ -eL -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -eL -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -WN -WN -WN -WN -WN -WN -WN -gW -gW -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(154,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -eK -gc -gc -XP -gV -gc -gc -eK -ge -gc -gc -gU -gV -gV -gc -gc -gV -gc -WN -WN -gc -WN -WN -gc -UI -UI -WN -WN -WN -WN -fr -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -Si -WN -WN -pc -eJ -eJ -eJ -wN -wN -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -eJ -eL -eL -eJ -fr -eL -eL -eJ -fr -fr -eL -eL -eL -eJ -fr -eJ -eJ -eL -eJ -eJ -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eL -eJ -eJ -eJ -eJ -fr -fr -eJ -eL -eL -eJ -eJ -tp -PH -qi -qi -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -ge -gW -WN -WN -QP -WN -gW -WN -QP -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(155,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -ge -gc -gc -in -gc -gc -ge -ge -eK -gc -gc -ge -gc -gc -gc -gc -gV -gc -gc -gc -WN -WN -WN -WN -WN -WN -WN -WN -fr -fr -fr -fr -UI -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Nz -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -UT -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -fr -eL -eL -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -fr -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -eL -eJ -tp -qi -tt -qi -tp -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -MU -eJ -eJ -MU -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -ge -ge -ge -ge -gW -WN -WN -WN -gW -gW -gW -WN -WN -WN -gW -ge -ge -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(156,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -gc -gV -gU -gc -gc -gc -eK -ge -gc -gc -gV -eK -eK -gc -eJ -gc -gc -gU -gV -gc -WN -gc -eK -UT -eJ -eJ -eJ -WN -WN -WN -WN -fr -fr -fr -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eL -eL -fr -fr -fr -fr -eL -eL -eJ -eJ -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -fr -fr -eJ -eL -tp -tp -tp -tp -tp -tv -tp -tp -tp -tp -tp -eJ -eJ -ge -ge -eJ -eJ -ge -ge -ge -WN -ge -eJ -MU -ge -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -gW -WN -WN -WN -gW -gW -gW -WN -WN -WN -WN -ge -ge -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(157,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -vi -gc -gc -gV -gc -gc -gc -eK -Mc -eK -eK -ge -gc -gc -gc -eK -qg -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -eL -WN -WN -WN -fr -fr -fr -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -fr -eJ -eL -tp -qi -qi -tp -qi -qi -qi -tp -qi -VU -tp -eJ -eJ -eJ -ge -eJ -eJ -ge -ge -ge -MU -ge -eJ -WN -eJ -eJ -WN -ge -eJ -EU -MU -ge -eJ -eJ -WN -eJ -eJ -eJ -eJ -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -gW -WN -WN -WN -gW -gW -gW -WN -WN -WN -gW -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(158,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eK -eK -eJ -gc -hF -im -gV -gc -eK -gc -eK -eK -eK -eK -ge -eK -ge -eJ -gc -WN -gc -WN -gc -eK -eJ -eJ -eJ -eJ -fr -eL -eL -eJ -eJ -eL -WN -fr -fr -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -Nz -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eL -eL -eJ -eJ -eJ -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eL -eJ -eJ -eL -fr -eL -eJ -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -tp -qi -tt -tv -qi -tt -qi -tv -tt -qi -tp -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -WN -eJ -eJ -WN -eJ -eJ -WN -ge -eJ -ge -WN -ge -ge -ge -WN -ge -eJ -eJ -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -QP -WN -WN -WN -gW -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(159,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eK -eJ -gc -gc -gc -gU -eK -eK -eK -eK -eK -ge -eK -eK -ge -eK -WN -gc -WN -WN -WN -eJ -eJ -eJ -eL -fr -fr -fr -fr -eJ -eJ -eJ -WN -fr -fr -fr -fr -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -fr -eJ -eJ -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -tp -TW -qi -tp -qi -qi -qi -tp -qi -qi -tp -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -WN -eJ -Cl -WN -eJ -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -ge -WN -ge -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -gW -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(160,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -eK -eK -gc -gc -gc -eK -eK -eK -eJ -eK -eK -ge -ge -eK -eJ -eJ -WN -gc -WN -gc -WN -WN -eL -eL -WN -WN -eL -fr -eL -eJ -WN -WN -fr -fr -fr -fr -WN -UT -UI -WN -WN -Nz -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -gW -eJ -eJ -eJ -wN -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -UT -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -WN -eL -eJ -WN -WN -fr -fr -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -eJ -eJ -fr -fr -fr -fr -eL -eJ -eJ -eL -eJ -tp -tp -tp -tp -tp -tv -tp -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -WN -WN -qi -WN -WN -WN -WN -eJ -eJ -Cl -WN -eJ -ge -ge -WN -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -WN -WN -WN -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(161,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eK -eK -eK -eJ -gc -XP -eK -eK -eK -eJ -ge -ge -ge -ge -ge -eJ -eJ -eK -eJ -gc -WN -gc -WN -fr -fr -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -WN -WN -WN -QP -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -QP -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -fr -fr -fr -fr -fr -fr -eL -eL -eL -eL -eL -fr -fr -fr -eL -eL -eJ -eJ -eJ -gW -eJ -eJ -fr -fr -eL -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -tp -qi -tt -qi -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -WN -WN -qi -WN -WN -WN -WN -WN -WN -qi -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -gW -gW -ge -eJ -ge -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(162,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eK -eK -eK -eJ -ge -ge -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -WN -gc -WN -fr -fr -fr -fr -WN -WN -fr -fr -fr -fr -WN -fr -WN -fr -WN -WN -eL -WN -WN -WN -WN -WN -WN -WN -WN -UI -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -eJ -eJ -eJ -fr -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -ge -eL -ge -eL -eJ -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -eJ -eJ -eJ -eJ -fr -fr -eJ -eJ -fr -eJ -eJ -eL -eJ -eJ -tp -PH -qi -qi -tp -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -ge -WN -eJ -Cl -WN -eJ -eJ -WN -WN -qi -qi -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(163,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eK -eK -eJ -eJ -ge -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eK -eJ -WN -WN -WN -WN -WN -fr -fr -fr -fr -fr -fr -WN -WN -WN -WN -fr -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -ge -ge -ge -ge -eL -eL -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -eL -eJ -fr -fr -fr -eJ -eJ -eJ -tp -tp -tp -tp -tp -eJ -gW -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -MU -eJ -eJ -WN -eJ -ge -WN -eJ -Cl -eJ -WN -ge -ge -Cl -qi -qi -Cl -eJ -eJ -ge -eJ -eJ -eJ -ge -ge -eJ -ge -ge -ge -eJ -ge -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(164,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eL -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -fr -fr -fr -fr -fr -WN -WN -WN -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -UT -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -eL -ge -eL -ge -eL -eL -eL -fr -fr -fr -fr -fr -eJ -eJ -eL -fr -eJ -eL -eJ -eJ -eJ -eJ -fr -eJ -eL -fr -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -WN -eJ -eJ -WN -eJ -ge -WN -eJ -eJ -eJ -WN -eJ -eJ -eJ -WN -WN -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(165,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -fr -fr -fr -eJ -eJ -fr -eL -eJ -eJ -ge -ge -eJ -eJ -gW -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -fr -fr -fr -fr -fr -eL -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -eL -eL -eL -eL -eL -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -eJ -eJ -eJ -fr -eJ -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -WN -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -ge -WN -eJ -ge -eJ -WN -WN -WN -WN -WN -WN -MU -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(166,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -fr -fr -fr -eJ -eL -fr -eL -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -WN -Sb -WN -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -UI -UI -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -UI -WN -WN -eJ -WN -eJ -eJ -eL -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -WN -ge -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(167,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eL -eL -eL -fr -eL -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -pA -fr -fr -fr -fr -fr -eL -eL -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -tp -tp -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -wN -wN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -WN -eJ -eJ -eL -fr -eL -eL -eL -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -Cl -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -MU -ge -eJ -eJ -WN -eJ -ge -ge -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(168,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eL -eL -eL -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -rS -sl -Jq -sO -fr -fr -fr -fr -fr -fr -fr -eL -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -qi -qi -tz -qi -tp -WN -WN -WN -WN -QP -WN -WN -WN -Nz -WN -WN -eJ -eJ -eJ -eJ -wN -wN -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -UI -UI -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -fr -fr -fr -fr -fr -eL -eL -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -MU -eJ -eJ -eJ -WN -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -FT -eJ -eJ -eJ -ge -ge -ge -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(169,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -fr -fr -eJ -eL -eJ -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -qi -rT -rV -sE -sO -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -PH -qi -qi -qi -tp -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -ga -wN -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -WN -WN -eJ -gW -eJ -eL -fr -fr -eL -fr -eJ -eL -fr -fr -fr -fr -eL -eL -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -ge -WN -WN -WN -WN -WN -MU -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -Cl -qi -qi -Cl -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(170,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eL -eL -fr -fr -eJ -eJ -fr -fr -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -WN -qi -rT -rV -sE -sO -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -qi -tp -tp -tp -tp -tv -tp -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -ga -ga -eJ -eJ -WN -WN -WN -WN -QP -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -eJ -eJ -eJ -ge -MU -WN -WN -WN -WN -eJ -eJ -ge -eJ -eJ -eJ -eJ -WN -eJ -eJ -ge -eJ -ge -WN -WN -eJ -eJ -eJ -WN -WN -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(171,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -eL -fr -eL -fr -fr -fr -eJ -eL -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -pA -rw -rU -sm -sF -sP -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -tp -qi -qi -qi -tp -tz -qi -tp -eJ -eJ -WN -WN -WN -WN -WN -WN -UI -UI -WN -WN -WN -WN -SC -wN -wN -WN -WN -WN -WN -WN -WN -WN -UT -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -eJ -eL -eL -fr -eJ -fr -fr -eJ -eJ -eL -eL -fr -eL -eJ -eJ -eJ -eJ -eJ -fr -eJ -eJ -eL -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -MU -ge -eJ -WN -eJ -ge -WN -eJ -eJ -eJ -ge -WN -WN -WN -WN -MU -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(172,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eL -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -gW -gW -eJ -tp -qi -qi -tt -qi -qi -qi -tp -tp -mY -WN -WN -WN -UT -WN -WN -WN -WN -WN -WN -WN -WN -WN -wN -WN -WN -WN -WN -UI -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -fr -eJ -fr -fr -eL -eJ -eJ -eJ -fr -fr -fr -fr -eL -eJ -eL -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -MU -ge -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -Cl -eJ -eJ -eJ -eJ -eJ -ge -WN -ge -eJ -WN -eJ -eJ -WN -ge -eJ -eJ -ge -WN -WN -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -Gd -Gx -GU -Gx -GU -GU -Gx -Gx -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(173,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -eL -eJ -fr -fr -fr -fr -fr -eL -eJ -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -tp -qi -qi -tz -qi -qi -qi -qi -mY -mY -WN -WN -WN -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -UI -UI -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -UI -WN -eJ -eJ -eJ -eJ -fr -fr -fr -fr -eL -eL -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -fr -eJ -eJ -eJ -fr -eJ -eJ -eJ -eL -fr -eJ -eJ -eL -eL -eL -fr -fr -fr -eL -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -ge -eJ -eJ -WN -WN -ge -eJ -eJ -eJ -eJ -eJ -ge -WN -eJ -eJ -WN -eJ -eJ -WN -ge -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -Ge -Gy -GV -Hs -OP -HL -Iz -GU -wE -wE -wE -wD -wD -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(174,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -qi -tz -tp -tv -tp -tp -tp -tp -tp -tp -WN -WN -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -UI -UI -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eL -eJ -eJ -eL -eL -fr -eJ -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eL -fr -eL -eJ -fr -fr -fr -eJ -eJ -eJ -eL -eJ -fr -fr -fr -fr -eJ -eJ -eL -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -MU -eJ -eJ -ge -WN -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -ge -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -Cl -eJ -WN -eJ -eJ -eJ -Cl -WN -WN -WN -WN -WN -WN -MU -MU -MU -MU -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -Ge -Gz -GW -Ht -HK -HL -IA -GU -wJ -Uf -wL -wO -wE -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(175,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -tp -qi -qi -tp -qi -qi -tz -qi -tp -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -fr -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -Cl -eJ -eJ -WN -Cl -eJ -eJ -eJ -eJ -Cl -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -WN -WN -WN -WN -WN -qi -WN -WN -WN -WN -WN -qi -WN -WN -eJ -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -Ge -GA -GX -Hu -HL -HL -IB -Gx -wM -wL -wL -JW -wE -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(176,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -eL -eJ -eJ -fr -fr -fr -eL -eJ -eJ -eL -fr -eL -eJ -eJ -WN -WN -WN -WN -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -eJ -eJ -eJ -tp -qi -qi -tp -qi -qi -qi -VU -tp -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -wV -WN -WN -WN -xq -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -gW -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -fr -fr -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -fr -fr -fr -eL -eL -eL -fr -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -qi -qi -WN -WN -qi -qi -WN -WN -WN -qi -qi -WN -WN -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -qi -WN -WN -WN -WN -WN -qi -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -Ge -GB -GY -Xk -HM -HM -IB -IJ -wM -wM -JA -wG -wE -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(177,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -fr -fr -eJ -eL -fr -fr -fr -fr -fr -eJ -eL -fr -eL -eJ -UT -WN -WN -WN -WN -WN -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -tp -TW -fD -tp -tp -tp -tp -tp -tp -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -uI -uZ -uO -uZ -uI -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -QP -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -eL -fr -fr -fr -eJ -eL -eJ -eJ -fr -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -ge -ge -eJ -UT -WN -WN -qi -WN -WN -WN -WN -qi -WN -WN -WN -qi -WN -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -eJ -eJ -ge -WN -Cl -eJ -WN -eJ -ge -WN -Cl -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -Gd -GC -GC -GU -GC -Ic -GU -GU -wR -wD -wD -wE -wE -wD -wD -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(178,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eL -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -WN -WN -WN -fr -fr -fr -fr -rV -fr -fr -fr -eL -eL -WN -eL -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tY -tZ -tY -tY -uF -PI -vt -vA -vG -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -fr -eJ -eL -fr -fr -eJ -fr -eJ -fr -eL -fr -eL -eJ -eL -eL -fr -fr -fr -eL -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -MU -WN -WN -WN -WN -eJ -Cl -eJ -eJ -WN -eJ -Cl -eJ -WN -eJ -Cl -eJ -eJ -eJ -ge -ge -eJ -eJ -UT -qi -Cl -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -xW -xW -xW -wT -Gh -wL -Gh -Id -Id -Id -Jc -YA -JB -JY -Kg -Kg -KD -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(179,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -eJ -WN -WN -WN -fr -fr -fr -fr -rV -fr -fr -WN -eL -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tZ -ul -Qs -tY -WM -PI -ul -uI -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -eJ -eL -fr -eJ -eJ -eJ -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -eJ -ge -eJ -WN -ge -eJ -MU -ge -eJ -WN -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -Qy -Qg -xW -xW -xW -wL -Gh -GD -GZ -xy -Gj -wL -wL -Gi -Jd -Jm -JC -GZ -Gj -xy -xy -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(180,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -eJ -fr -fr -fr -eJ -fr -fr -fr -fr -fr -eJ -eJ -eL -eL -WN -WN -fr -fr -fr -fr -fr -rV -fr -fr -WN -eL -ge -eL -WN -eL -fr -fr -fr -fr -fr -fr -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -tY -tY -tZ -tZ -tY -tY -uD -tZ -tZ -vb -vn -vb -tY -tZ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eJ -eL -fr -eL -eJ -eJ -eJ -WN -WN -UI -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -fr -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -WN -ge -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -WN -WN -WN -WN -WN -WN -ge -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -PV -FD -FG -SQ -FM -FU -Gi -GE -Ha -Hw -Hw -Hw -ID -wM -Ih -YA -JD -wL -xy -Gj -xy -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(181,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -fr -fr -fr -eJ -eL -fr -fr -fr -fr -fr -eL -fr -eJ -eJ -WN -WN -fr -fr -fr -fr -fr -rV -fr -fr -WN -eL -gW -ge -eL -WN -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -tZ -av -ue -ue -tY -ul -uE -uE -uE -vc -vc -ul -vB -tY -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eL -fr -fr -eJ -fr -fr -eJ -fr -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eL -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -ge -MU -WN -WN -WN -WN -eJ -eJ -ge -eJ -WN -ge -eJ -ge -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -MU -ge -ge -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -UT -WN -WN -cF -WN -WN -VW -FH -wL -Lx -xy -Gj -xy -Hb -Hx -xy -Ie -wD -IN -wE -wD -wD -wD -JC -GZ -KE -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(182,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eL -fr -fr -fr -fr -pA -rV -pA -fr -eL -eL -ge -eL -eL -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -tZ -uc -UA -uk -ur -ux -uF -ul -ul -vd -uF -vu -vC -tY -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -eL -fr -eJ -eL -fr -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -WN -WN -WN -WN -WN -UI -UI -WN -WN -Nz -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -WN -qi -Cl -eJ -eJ -eJ -WN -ge -eJ -ge -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -WN -WN -WN -MU -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -UI -WN -WN -WN -VW -wL -FK -Lx -xy -xy -wL -Gj -GZ -Gj -If -wD -wM -wE -Jn -Jn -wE -JC -Kp -KF -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(183,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -fr -eJ -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -eL -eL -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -UT -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tZ -tY -tZ -tY -tZ -vo -uG -ul -uS -LV -tY -tZ -tZ -tY -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -WN -fr -fr -eJ -eJ -eJ -WN -WN -WN -WN -WN -fr -WN -WN -WN -WN -UI -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -ge -WN -ge -ge -eJ -Cl -eJ -eJ -WN -WN -Cl -eJ -eJ -eJ -eJ -Cl -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -eJ -Cl -WN -WN -WN -WN -WN -WN -Qy -xW -xW -zI -xW -RF -ya -GF -xy -wL -xy -Ig -wD -wM -wD -OB -wL -JZ -JC -GZ -xy -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(184,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -eL -eJ -eJ -eL -eL -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -eL -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eL -eJ -eJ -eL -eL -tY -ug -ul -tZ -WS -PI -uK -PI -um -vp -Ya -vD -tZ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eL -eJ -eJ -WN -WN -fr -WN -WN -WN -UI -WN -WN -WN -WN -fr -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -AW -UI -WN -WN -WN -AW -WN -WN -WN -WN -qi -WN -WN -eJ -ge -ge -eJ -eJ -Cl -WN -WN -WN -UI -WN -WN -qi -UI -WN -WN -WN -WN -WN -WN -WN -WN -FL -xW -xW -xW -GG -wL -ya -ya -Ih -wD -UH -wD -Jp -JE -wD -Ts -Kq -KG -wD -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(185,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -eL -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -eJ -eL -fr -tZ -ug -um -us -uz -lZ -uV -vu -vf -tY -vw -vE -tZ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -eL -fr -eJ -eL -eJ -fr -eJ -eJ -eJ -eL -eJ -WN -fr -fr -WN -WN -WN -WN -WN -WN -WN -fr -fr -WN -eJ -eJ -eJ -eJ -eJ -WN -UI -UI -WN -WN -WN -eJ -pA -eJ -eJ -eJ -eJ -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -BO -BT -qi -qi -pA -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -Cl -qi -AW -WN -MU -WN -WN -qi -WN -WN -WN -WN -qi -WN -WN -WN -WN -AW -WN -WN -WN -WN -WN -WN -UI -qi -qi -WN -WN -WN -WN -WN -qi -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -UT -Gk -GH -GN -Hy -GN -GH -GH -wM -wE -wD -wE -wE -wD -Kr -wD -wD -wE -wE -bh -bh -bh -bh -bh -bh -bh -"} -(186,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -fr -eJ -fr -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eL -fr -fr -fr -eJ -fr -tY -Yv -um -tY -tZ -tZ -tZ -tY -RD -tZ -tY -tZ -tY -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -eL -eJ -eL -fr -fr -fr -fr -fr -fr -fr -WN -WN -UT -fr -fr -fr -fr -eJ -eJ -eL -fr -fr -eL -WN -WN -WN -WN -WN -WN -qi -sO -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -Bo -Jq -qi -Cb -WN -WN -WN -WN -WN -WN -WN -UI -WN -ge -ge -eJ -UI -UI -WN -eJ -ge -WN -eJ -eJ -eJ -WN -eJ -eJ -WN -qi -Cl -eJ -ge -eJ -Cl -eJ -eJ -WN -eJ -Cl -eJ -WN -eJ -eJ -Cl -ge -YO -WN -WN -WN -WN -WN -WN -qi -eJ -ge -eJ -ge -eJ -Cl -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Vy -Gk -GI -Hc -Hg -YZ -Ii -GN -wM -wL -wD -JF -JF -Ki -wL -GZ -wL -Gj -wD -bh -bh -bh -bh -bh -bh -bh -"} -(187,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eL -eJ -eL -fr -eL -fr -tY -ul -um -ul -uA -tY -vo -uE -vc -WG -vx -tY -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -WN -WN -WN -fr -eJ -eL -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -WN -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -fr -eJ -eJ -eJ -eJ -WN -WN -WN -qi -zj -zk -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -BP -BP -Bo -BY -Cc -Ve -WN -WN -UI -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -qi -Cl -eJ -WN -eJ -eJ -eJ -WN -ge -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -Cl -eJ -eJ -Cl -eJ -ge -eJ -eJ -eJ -eJ -YO -WN -WN -WN -WN -WN -UT -WN -WN -WN -WN -WN -Gl -GJ -Hd -Hg -HO -Ij -GH -wM -wL -wD -JG -Ka -xO -Ks -Ka -KQ -KZ -wE -bh -bh -bh -bh -bh -bh -bh -"} -(188,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eL -fr -eJ -eJ -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -eJ -eL -eJ -fr -fr -fr -fr -fr -tY -uj -um -um -uB -tY -uM -uU -PI -ul -uF -tY -eL -eJ -eL -eJ -eJ -eJ -eL -fr -eL -eJ -WN -WN -WN -WN -WN -fr -fr -fr -eL -eJ -fr -fr -fr -fr -fr -fr -eL -WN -WN -eJ -eL -eL -eJ -fr -fr -eL -fr -fr -fr -eJ -eL -fr -eJ -pA -yi -yi -yO -zk -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -pA -BD -fr -fr -fr -rV -rV -rV -Bo -Cd -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -qi -qi -eJ -eJ -WN -ge -Cl -ge -WN -eJ -Cl -WN -WN -WN -WN -WN -eJ -ge -eJ -eJ -WN -eJ -eJ -eJ -WN -ge -eJ -eJ -eJ -eJ -eJ -WN -WN -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -YO -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Gl -GJ -He -He -HP -Ik -GH -wM -wL -wE -JH -Ys -Ys -Kt -Ys -Ys -KX -wE -bh -bh -bh -bh -bh -bh -bh -"} -(189,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -fr -fr -eL -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eL -eL -fr -fr -fr -fr -eJ -eL -tZ -tY -tY -tZ -tZ -tY -uN -uV -vj -vr -ul -uI -eL -fr -fr -eL -eL -eJ -fr -fr -fr -WN -WN -fr -WN -fr -fr -fr -fr -fr -WN -WN -fr -fr -fr -fr -eL -eL -eJ -eJ -WN -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -Ad -Ap -Ap -pA -WN -rS -BE -fr -fr -rV -sn -rV -rV -rV -pA -eJ -eJ -eL -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -qi -WN -UI -WN -WN -UI -WN -WN -WN -UI -AW -WN -WN -ge -ge -ge -ge -ge -WN -eJ -eJ -eJ -eJ -eJ -WN -ge -eJ -eJ -eJ -eJ -eJ -WN -WN -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Gl -GJ -Hf -He -HQ -Il -GH -WX -wL -wE -JH -Ys -Ys -Ys -Ys -Ys -KX -wE -bh -bh -bh -bh -bh -bh -bh -"} -(190,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -fr -fr -eJ -eJ -eJ -eL -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -sn -rV -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -QP -WN -eJ -eJ -WN -WN -eL -fr -eJ -fr -fr -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -uI -uO -uO -uO -uO -uO -uI -fr -fr -fr -eJ -eJ -eL -fr -fr -fr -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -WN -WN -eJ -WN -eL -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -sn -rV -sn -rV -fr -fr -fr -fr -Ae -qi -qi -WN -UI -Bx -BF -rV -rV -rW -fr -sG -rV -rV -eJ -eJ -eJ -fr -eJ -fr -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -WN -WN -UT -WN -WN -WN -WN -WN -WN -qi -WN -ge -ge -ge -ge -ge -ge -WN -ge -eJ -WN -eJ -eJ -WN -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -MU -WN -WN -WN -ge -ge -ge -ge -eJ -eJ -ge -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Gk -MJ -Hg -Hz -HO -Im -GN -wL -wL -wE -JI -Ys -Ys -Ys -Ys -Ys -KY -wE -bh -bh -bh -bh -bh -bh -bh -"} -(191,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -pA -rW -fr -sG -pA -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -WN -WN -fr -fr -fr -fr -fr -eL -eJ -fr -eL -eL -WN -WN -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -fr -fr -fr -eJ -eJ -WN -WN -fr -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -fr -pA -rV -rW -fr -zl -fr -sG -rV -rV -rV -rV -AK -AW -WN -WN -WN -sD -BG -fr -fr -rV -so -rV -fr -fr -fr -eJ -eL -fr -eL -fr -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -Cl -ge -ge -WN -Cl -eJ -ge -ge -ge -WN -eJ -ge -MU -ge -eJ -WN -eJ -eJ -ge -ge -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -ge -ge -ge -ge -ge -eJ -eJ -eJ -WN -WN -WN -WN -WN -QP -WN -WN -WN -WN -WN -Gm -GJ -He -HA -HO -In -GH -wL -wL -wE -JH -Ys -Ys -Ys -Ys -Ys -KX -wE -bh -bh -bh -bh -bh -bh -bh -"} -(192,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -so -rV -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -WN -eL -fr -eJ -fr -fr -fr -fr -fr -eL -eL -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eL -fr -eJ -eJ -eJ -WN -fr -fr -fr -fr -fr -fr -fr -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eL -eL -eJ -fr -fr -fr -fr -rV -so -rV -so -rV -fr -Ad -Ap -Ap -AL -WN -WN -WN -WN -WN -At -fr -fr -fr -rV -fr -fr -fr -fr -eJ -fr -fr -fr -fr -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -ge -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -ge -ge -ge -WN -ge -eJ -WN -eJ -eJ -WN -ge -eJ -ge -ge -eJ -ge -ge -eJ -Cl -qi -qi -Cl -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -WN -UT -WN -WN -WN -WN -WN -WN -WN -WN -WN -Gm -GL -Hh -Hf -HO -Ik -GN -wL -wL -wD -JH -Ys -Ys -Ys -Ys -Ys -KX -wD -bh -bh -bh -bh -bh -bh -bh -"} -(193,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eL -eL -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eL -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eL -fr -fr -eL -eL -eJ -eL -eJ -fr -Nz -WN -WN -WN -WN -WN -UT -WN -WN -eL -eL -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eL -xV -fr -fr -fr -rV -fr -fr -fr -Ae -WN -WN -WN -WN -WN -WN -WN -WN -pA -fr -fr -fr -rV -fr -fr -fr -fr -eL -eJ -fr -eJ -eJ -eJ -eJ -fr -eL -eJ -eJ -eJ -fr -eJ -ge -WN -ge -eJ -WN -eJ -eJ -eJ -WN -eJ -eJ -ge -ge -ge -WN -ge -eJ -WN -Cl -eJ -WN -ge -Cl -ge -ge -ge -ge -ge -eJ -eJ -WN -WN -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -WN -MZ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Gm -GJ -Hh -Hg -Um -Io -IE -wL -Je -wD -JJ -Kb -Kb -Ku -Kb -Kb -Xu -wD -bh -bh -bh -bh -bh -bh -bh -"} -(194,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -WN -WN -eL -eJ -eJ -eL -fr -fr -fr -fr -fr -eJ -eJ -eL -fr -WN -WN -WN -WN -WN -WN -fr -WN -WN -WN -eL -fr -fr -eJ -WN -fr -fr -fr -fr -fr -fr -WN -eJ -eL -eJ -eL -fr -eJ -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -eL -wD -wD -wE -wE -wD -wD -xW -xW -xW -xW -eJ -eJ -eJ -eJ -pA -WN -WN -WN -WN -WN -WN -eJ -eJ -eL -fr -fr -fr -rV -fr -fr -fr -fr -eJ -eJ -fr -eL -eJ -eL -fr -fr -fr -eJ -eJ -eJ -fr -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -WN -WN -WN -WN -qi -WN -WN -WN -qi -WN -WN -WN -WN -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -MU -MU -WN -eJ -eJ -WN -MZ -WN -WN -WN -WN -WN -WN -WN -WN -Nz -WN -Vy -Gk -HR -Hi -Hh -HS -Ip -GN -wD -Jf -wE -wD -wE -wD -wD -wE -wE -wD -wD -bh -bh -bh -bh -bh -bh -bh -"} -(195,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -fr -fr -eJ -eL -WN -fr -fr -eJ -WN -WN -WN -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -eL -eL -eJ -fr -WN -fr -fr -fr -fr -WN -fr -fr -fr -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eL -fr -eL -eJ -fr -fr -fr -eL -eL -eL -eJ -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -fr -eJ -wE -cD -YB -VP -wL -wL -WB -yj -Sm -xW -eJ -eJ -eJ -eJ -eJ -WN -WN -Nz -WN -WN -eJ -eJ -eJ -fr -fr -fr -fr -rV -fr -fr -fr -fr -eJ -eL -fr -eL -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -WN -WN -WN -WN -WN -WN -qi -WN -WN -WN -qi -WN -ge -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -ge -ge -eJ -eJ -eJ -eL -eJ -WN -MZ -WN -WN -WN -WN -WN -WN -WN -WN -WN -Sy -rL -Gk -GN -Hj -HB -GN -GH -GH -wL -Jg -wD -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(196,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -eJ -eL -fr -fr -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -WN -UT -WN -eJ -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -eL -Nz -fr -fr -fr -WN -WN -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -wD -Sm -IQ -xy -Tn -xy -WB -Sm -yx -wD -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -eJ -eL -fr -fr -fr -fr -BQ -WN -eJ -fr -fr -fr -eJ -fr -eJ -eJ -eJ -eJ -eJ -fr -eJ -eL -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -WN -WN -Cl -eJ -ge -eJ -Cl -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -eJ -WN -ZE -Oj -Rv -WN -WN -WN -WN -WN -WN -WN -Bw -FQ -Gn -GO -Hk -HC -Hk -Hk -Hk -Hk -Jh -wE -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(197,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -eL -eL -eJ -eL -fr -fr -fr -fr -fr -rV -fr -fr -WN -eJ -WN -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -WN -WN -fr -WN -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eL -fr -eL -eJ -eJ -fr -fr -fr -eJ -eL -fr -eJ -eL -fr -fr -fr -fr -fr -eJ -eL -eJ -eJ -wD -wE -wE -wE -xz -xx -xx -xY -wD -wE -wE -wE -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -BR -eJ -eL -WN -fr -fr -fr -fr -fr -fr -eL -eL -eJ -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -qi -qi -Cl -eJ -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -fr -fr -eJ -WN -WN -WN -WN -ZE -Oj -Rv -WN -WN -WN -WN -WN -ui -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW -xW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(198,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -fr -fr -eJ -WN -pA -qh -qh -qh -qh -qh -sp -qh -pA -WN -eJ -WN -WN -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -eL -eJ -eJ -fr -eJ -eJ -eL -fr -fr -fr -fr -fr -eJ -eJ -eJ -fr -fr -fr -eL -fr -eL -eJ -eJ -eJ -wD -wT -xe -xs -xA -xI -xN -wL -yl -xN -yP -wD -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -WN -sE -eJ -eL -eL -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -fr -fr -eJ -eJ -eL -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -ge -eJ -eJ -ge -eJ -eJ -Cl -eJ -ge -eJ -Cl -qi -qi -Cl -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -WN -UT -WN -fr -WN -WN -ZE -Oj -Rv -WN -WN -WN -WN -Cb -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(199,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -fr -fr -eL -WN -WN -qi -qi -qi -qi -qi -qi -qi -WN -WN -WN -WN -WN -WN -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -WN -eL -fr -fr -fr -fr -fr -fr -eL -fr -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -eL -eJ -fr -eL -eL -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -eL -fr -eJ -eJ -eJ -eJ -wE -wU -xf -xt -xB -xJ -xO -xZ -ym -yy -yQ -wE -eJ -eJ -eJ -WN -Ve -qi -pA -eJ -eJ -eL -eJ -eJ -fr -fr -fr -WN -sE -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -eJ -WN -WN -eJ -eJ -WN -WN -ge -eJ -eJ -WN -WN -WN -qi -WN -Ve -WN -EX -WN -WN -eL -fr -eJ -eJ -fr -eJ -eJ -fr -eL -WN -WN -WN -fr -fr -WN -WN -WN -MZ -WN -WN -WN -WN -Cb -fr -fr -fr -rV -sn -rV -fr -fr -fr -eJ -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(200,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -gW -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -eL -eJ -eL -eJ -WN -eJ -un -qi -qi -qi -Vz -qi -WN -WN -Nz -Sb -WN -WN -fr -fr -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -fr -eL -WN -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -WN -WN -fr -eL -eL -eL -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -eJ -eJ -eL -eL -eJ -eJ -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -wE -VF -xg -Ys -Ys -Ys -xP -Ys -Ys -yz -Vq -wD -wE -wD -xW -VO -qi -qi -At -fr -eJ -eJ -eJ -eL -eJ -fr -fr -fr -Bo -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -WN -WN -WN -WN -MU -WN -WN -WN -eJ -ge -WN -WN -eJ -eJ -WN -WN -WN -WN -qi -fr -fr -Zz -qi -fr -fr -eL -fr -fr -eL -fr -eL -eJ -fr -fr -fr -WN -WN -fr -WN -WN -WN -WN -MZ -WN -WN -WN -WN -Cc -rV -rV -rV -rW -fr -sG -rV -rV -Ji -By -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(201,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -fr -eJ -fr -eJ -eJ -eJ -eJ -WN -WN -pa -rc -rx -rc -pa -eJ -eJ -WN -WN -WN -WN -fr -fr -WN -eJ -eJ -Nz -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -eL -eL -fr -fr -fr -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -fr -fr -fr -fr -WN -WN -fr -fr -fr -eJ -eJ -eL -eJ -eJ -eJ -tp -tp -tp -eJ -fr -fr -fr -eJ -eL -eL -eL -eL -eL -eJ -eL -fr -fr -fr -eL -eJ -eJ -eJ -eJ -wD -wW -xg -Ys -Ys -Ys -Ys -Ys -Ys -yA -wM -zm -OD -zG -zR -qi -qi -Ar -zk -fr -eJ -eJ -eJ -eL -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -eJ -eJ -WN -WN -eJ -ge -Cl -eJ -fr -eJ -Cl -WN -fr -WN -fr -fr -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -WN -WN -fr -fr -MZ -WN -WN -WN -WN -Cb -qi -fr -fr -rV -so -rV -fr -fr -sE -qi -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(202,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eL -fr -eJ -fr -eL -eJ -eJ -eJ -WN -WN -pa -pG -ry -pG -ow -eJ -eJ -eJ -eJ -WN -WN -fr -WN -WN -WN -WN -WN -WN -WN -eL -eL -fr -eJ -eL -fr -fr -fr -eJ -eL -eJ -fr -fr -eJ -eL -WN -WN -WN -WN -fr -fr -WN -WN -WN -fr -WN -WN -WN -fr -WN -WN -WN -fr -fr -fr -fr -WN -fr -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -tp -tz -tp -eJ -fr -fr -eL -eJ -eL -eL -eL -fr -fr -fr -fr -fr -eJ -eJ -eJ -wD -wD -wE -wD -wP -wX -xg -Ys -Ys -Ys -Ys -Ys -Ys -yA -xy -zn -wL -wL -zS -qi -qi -At -fr -fr -eJ -eJ -eJ -rT -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -fr -eJ -eJ -eJ -eJ -ge -eJ -eJ -Cl -qi -qi -Cl -eJ -WN -WN -eJ -Cl -qi -qi -WN -WN -WN -WN -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -WN -UT -fr -WN -MZ -WN -WN -WN -Cl -Cl -eJ -eL -fr -fr -rV -fr -fr -fr -sE -qi -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(203,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eL -eL -eJ -eJ -eJ -eJ -WN -Up -qF -rd -rz -Yz -ox -eJ -eJ -eJ -eJ -eJ -eJ -eL -WN -WN -WN -WN -WN -WN -WN -fr -eL -fr -eJ -eJ -eJ -fr -fr -eL -eL -eL -fr -fr -fr -WN -WN -WN -WN -fr -fr -WN -WN -fr -fr -fr -WN -WN -fr -fr -fr -WN -WN -WN -fr -fr -fr -fr -fr -fr -eJ -eL -eL -eJ -eJ -eJ -eJ -tp -qi -tp -tp -fr -fr -tp -eJ -eL -eL -eL -eL -eL -eJ -eL -fr -fr -eL -eJ -wE -wG -wK -wO -wP -wW -xh -wW -Ys -Ys -Ys -Ys -Ys -yA -xy -zn -wL -wL -zS -qi -Ar -zk -fr -fr -eJ -eJ -Jq -rT -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -eJ -fr -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -WN -WN -eJ -eJ -WN -qi -Cl -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -eJ -WN -fr -fr -fr -fr -fr -fr -WN -ZE -Oj -Oj -Oj -Cl -eJ -eJ -eL -fr -fr -rV -fr -fr -fr -sE -qi -qi -qi -eL -eJ -fr -fr -eL -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(204,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eJ -eJ -ow -pa -pa -pa -pa -re -rA -re -ow -ox -ox -ow -ox -ow -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -fr -fr -fr -fr -eJ -eJ -eL -fr -eJ -eJ -eJ -eL -eL -fr -fr -WN -WN -WN -WN -fr -WN -WN -WN -WN -fr -WN -WN -WN -fr -WN -WN -WN -fr -fr -WN -WN -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -tp -qi -qi -qi -fr -fr -tp -eJ -eJ -eL -eL -eL -eL -eJ -eL -fr -eJ -eJ -eJ -wE -wH -wL -wL -wP -wW -xh -wW -wW -Ys -Ys -Ys -Ys -yC -yS -zm -zw -zH -zR -qi -As -rV -rV -rV -rV -Bh -Bo -Bz -fr -eJ -eJ -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -ge -eJ -WN -WN -eL -eL -fr -fr -fr -fr -WN -WN -eJ -fr -eL -eL -fr -eJ -eL -eL -fr -eL -WN -WN -fr -WN -fr -fr -fr -WN -WN -Nz -WN -WN -eJ -eJ -eJ -eJ -fr -rV -sn -rV -fr -fr -sE -qi -qi -qi -eL -eJ -eJ -fr -eL -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(205,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ox -pb -pB -qk -pE -qH -rB -rB -rz -pG -ow -sZ -sZ -ox -eJ -eJ -eJ -eJ -WN -WN -WN -eJ -eJ -fr -fr -fr -eJ -eJ -eJ -eL -fr -fr -fr -eJ -eJ -eJ -fr -fr -WN -WN -WN -WN -WN -WN -WN -WN -fr -fr -fr -fr -WN -WN -WN -WN -WN -WN -WN -Nz -WN -WN -fr -eL -eL -eL -eJ -eL -eJ -eJ -eJ -tp -qi -qi -fr -fr -fr -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wD -Lp -wM -wM -wR -wY -xi -wW -wW -wW -Ys -Ys -Ys -yC -yT -wE -xW -zI -xW -VO -At -fr -fr -fr -fr -fr -rV -fr -rV -sn -rV -fr -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -ge -eJ -eJ -eJ -WN -WN -eJ -eJ -WN -WN -eJ -eJ -fr -WN -eL -fr -fr -fr -eL -Cl -qi -qi -fr -fr -eL -fr -fr -eJ -eJ -fr -fr -eL -eJ -WN -fr -WN -fr -fr -fr -fr -WN -eJ -eJ -eJ -pA -rV -rV -rV -rV -rW -fr -sG -rV -rV -Bo -sl -sl -sl -sl -eJ -eJ -fr -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(206,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ox -YK -pC -pD -qG -rf -qH -qH -ss -rf -sQ -pG -Yz -ox -eJ -eJ -eJ -WN -WN -eJ -eJ -eJ -eL -eL -fr -fr -eL -eJ -eJ -fr -fr -eJ -eL -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -fr -fr -WN -WN -fr -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -fr -fr -fr -fr -eJ -eJ -tp -tp -tp -tp -tp -qi -fr -fr -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wE -wJ -wL -Wa -wP -LZ -xj -xu -xu -xu -xQ -xQ -xQ -yE -yQ -wE -eJ -zJ -zT -yi -zk -fr -fr -fr -fr -fr -rV -rV -rW -fr -sG -rV -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -MU -MU -WN -WN -WN -WN -UT -eJ -eJ -ge -eJ -eJ -eJ -fr -fr -fr -fr -fr -eL -eL -eJ -WN -WN -eJ -eJ -eJ -fr -Cl -qi -qi -Cl -fr -eJ -fr -fr -fr -WN -WN -fr -fr -fr -fr -fr -eJ -eJ -eL -fr -fr -fr -fr -rV -so -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eL -bh -bh -bh -bh -bh -bh -bh -"} -(207,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ow -pd -pD -pD -pE -Po -qH -rZ -ss -ql -ow -ta -th -ow -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eL -eJ -tp -tp -tp -tp -eJ -WN -WN -WN -WN -WN -UT -WN -WN -WN -WN -WN -WN -fr -WN -WN -WN -WN -WN -QP -WN -eJ -eJ -eL -eJ -eJ -fr -eJ -eL -eJ -tp -qi -qi -tp -qi -qi -qi -qi -tp -qi -fr -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wD -wE -wE -wP -wP -wW -wW -wW -wW -wW -wW -ya -ya -ya -wL -xW -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -rV -so -rV -fr -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -eJ -qi -qi -Cl -eJ -eJ -eJ -eJ -Cl -WN -WN -fr -fr -fr -fr -fr -eJ -WN -WN -WN -WN -WN -fr -eJ -WN -WN -eJ -eJ -eJ -fr -WN -fr -WN -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -fr -fr -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(208,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -ox -ox -pE -pE -pE -pE -Zq -sa -ss -ql -ox -ow -ox -ow -eJ -eJ -eJ -WN -eJ -eJ -eJ -tp -tp -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -tp -tz -VU -tp -eJ -eJ -eJ -WN -WN -WN -WN -QP -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eL -eJ -eL -eL -eL -eL -eJ -tp -fr -qi -tv -qi -tz -tp -qi -tp -qi -tz -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -wE -wP -wD -wP -wP -wP -wD -wD -wE -wE -wE -xW -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -fr -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -Cl -qi -WN -WN -WN -WN -WN -qi -qi -WN -fr -fr -fr -fr -eL -fr -eJ -WN -WN -eJ -eJ -eJ -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eL -fr -fr -WN -WN -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -fr -fr -eL -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(209,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ow -pe -pF -pG -qH -rh -qH -sb -ss -rf -pE -tb -ti -ow -eJ -eJ -eJ -eJ -eJ -eJ -gW -tp -PH -PH -qi -qi -tp -tp -tp -tp -eJ -gW -tp -qi -qi -tp -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -QP -WN -WN -WN -WN -WN -UT -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -tp -qi -qi -tp -qi -fr -tp -qi -tp -qi -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eK -eK -eK -eJ -eJ -eJ -eJ -eJ -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -eL -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -fr -fr -eJ -eJ -eJ -eJ -eJ -WN -Ve -WN -WN -WN -qi -WN -WN -fr -fr -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -eJ -eJ -fr -WN -WN -WN -fr -eJ -eL -eL -eL -eJ -eL -eJ -fr -eL -eL -fr -fr -fr -fr -eJ -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(210,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ox -pf -pG -ql -qH -qH -qH -qH -ss -pG -sR -pG -PJ -ox -eJ -tp -tp -tp -tp -tp -tp -tp -qi -tz -qi -tt -qi -qi -qi -tp -tp -tp -tp -tp -tv -tp -tp -tp -tp -tp -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -tz -qi -tp -qi -qi -tp -qi -fr -qi -VU -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eK -eK -eK -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -rV -fr -fr -fr -eJ -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -fr -eL -eJ -fr -eJ -eJ -eJ -WN -ge -ge -WN -Cl -eJ -WN -fr -eJ -eJ -eJ -eJ -eJ -eJ -qi -qi -Cl -eJ -eJ -eJ -Cl -qi -qi -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -fr -eJ -eJ -eJ -eJ -eL -eJ -eJ -fr -eJ -eL -fr -fr -fr -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(211,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ow -pg -pg -qm -qI -ri -qH -qH -rB -rf -ow -tc -tk -ox -eJ -tp -TW -fD -tp -PH -PH -tp -qi -qi -qi -qi -tz -qi -qi -qi -qi -qi -qi -qi -qi -qi -qi -qi -qi -tR -tR -qi -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -tp -tp -tp -tp -tv -tp -tp -tp -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -rV -sn -rV -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -Ad -Bp -qh -pA -eL -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -WN -eJ -eJ -WN -eJ -fr -fr -fr -eL -fr -eJ -eJ -eJ -Cl -qi -WN -WN -WN -WN -WN -WN -WN -qi -Cl -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -WN -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -eL -eL -eJ -eL -fr -fr -fr -fr -fr -fr -fr -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(212,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ow -ox -ox -pE -pE -ow -ow -pE -su -ox -ox -ox -ow -ow -eJ -tp -qi -qi -tp -qi -qi -tp -qi -tp -tp -tp -tp -tp -tp -tp -tp -tp -tp -tv -tp -tp -tp -tv -tp -tp -tp -tp -tp -WN -WN -WN -WN -WN -WN -WN -QP -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -eJ -eJ -eJ -eJ -tp -qi -qi -VU -tp -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -pA -rW -fr -sG -rV -rV -rV -rV -rV -rV -rV -rV -rV -rV -rV -Bi -qi -qi -BH -eJ -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -fr -ge -WN -eL -eJ -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -fr -WN -WN -WN -eJ -eJ -eJ -eJ -fr -eL -fr -fr -fr -fr -fr -fr -eL -fr -fr -fr -fr -fr -eL -eJ -fr -eL -bh -bh -bh -bh -bh -bh -bh -"} -(213,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -pE -SI -rz -rz -ox -eJ -eJ -eJ -eJ -gW -tp -qi -tt -tp -qi -qi -tp -qi -tp -qi -qi -PH -tp -eJ -eJ -tp -qi -qi -qi -tp -eJ -tp -qi -qi -qi -tp -gW -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -eJ -eJ -tp -tz -qi -TW -tp -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eL -eL -eL -rV -so -rV -fr -fr -fr -rV -fr -fr -fr -fr -fr -fr -WN -Ae -qi -qi -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -Nz -WN -WN -eJ -eJ -eL -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -bh -bh -bh -bh -bh -bh -bh -"} -(214,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ox -Te -sc -sv -ow -eJ -eJ -eJ -eJ -eJ -tp -tt -qi -tp -tv -tp -tp -qi -tp -qi -qi -tz -tp -eJ -eJ -tp -qi -qi -qi -tp -gW -tp -qi -qi -qi -tp -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -tp -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -ge -ge -ge -eJ -eJ -eJ -eJ -eL -eL -eL -eL -fr -eL -fr -fr -fr -fr -eJ -eJ -eL -eL -eJ -fr -rV -fr -fr -fr -eL -fr -WN -eJ -pA -eJ -eJ -eJ -eL -eJ -eL -fr -fr -fr -fr -eL -eJ -fr -eJ -eL -eJ -eL -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -ge -WN -eJ -ge -WN -eJ -eJ -MU -ge -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -fr -WN -fr -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(215,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -ow -rF -sd -ow -ox -eJ -eJ -eJ -eJ -eJ -tp -qi -qi -tv -qi -qi -qi -qi -tv -qi -tp -tp -tp -eJ -eJ -tp -qi -qi -tp -tp -eJ -tp -tp -qi -qi -tp -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eL -eL -eL -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -fr -fr -fr -rV -fr -fr -fr -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -fr -fr -fr -fr -eJ -fr -fr -eJ -fr -eJ -fr -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -eJ -eJ -WN -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -fr -fr -eJ -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eJ -WN -Nz -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(216,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ox -ox -ox -ow -eJ -eJ -eJ -gW -eJ -eJ -tp -qi -qi -tp -qi -tt -qi -tp -tp -tp -tp -eJ -eJ -gW -eJ -tp -tz -VU -tp -eJ -eJ -eJ -tp -VU -tz -tp -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eL -eL -eL -eL -eJ -fr -eJ -eL -fr -fr -fr -fr -fr -fr -fr -fr -eL -eJ -fr -eL -eJ -fr -fr -fr -eJ -gW -eJ -eJ -eJ -eL -fr -eJ -fr -eJ -eJ -eL -fr -eJ -eL -fr -eJ -fr -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -ge -fr -fr -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -WN -eJ -ge -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -fr -fr -WN -fr -fr -eL -fr -fr -fr -fr -fr -eJ -eL -eL -eJ -eJ -WN -WN -WN -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(217,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -qi -qi -qi -tp -eJ -gW -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -eJ -eJ -eJ -tp -tp -tp -tp -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -ge -eJ -eJ -eJ -eJ -eL -eL -eJ -eL -eJ -eJ -fr -eL -fr -fr -fr -eJ -fr -eL -eJ -fr -fr -eJ -eJ -fr -eJ -eJ -eJ -eJ -eJ -eL -fr -fr -fr -eL -fr -eL -fr -fr -fr -eL -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eL -eJ -fr -fr -eJ -fr -fr -fr -fr -fr -fr -eJ -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -MU -eJ -eJ -ge -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -WN -fr -WN -WN -WN -WN -WN -WN -eJ -WN -WN -WN -WN -WN -WN -WN -WN -Ve -IZ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(218,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -tp -tp -tp -tp -tp -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -gW -eJ -eJ -gW -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -ge -ge -ge -ge -ge -ge -eJ -eJ -ge -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -fr -eL -eL -eL -eJ -eJ -fr -eJ -eJ -fr -fr -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eJ -eJ -fr -eJ -fr -fr -fr -eJ -eJ -fr -eJ -fr -eJ -eL -eJ -fr -fr -fr -fr -fr -fr -fr -fr -eJ -eL -eJ -fr -fr -fr -eJ -eJ -eL -eL -eL -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -WN -Nz -WN -WN -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(219,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eL -eL -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -fr -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eL -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -ge -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -bh -bh -bh -bh -bh -bh -bh -"} -(220,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(221,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(222,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(223,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(224,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(225,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(226,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -bh -"} -(227,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(228,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(229,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(230,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(231,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(232,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(233,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(234,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(235,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(236,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(237,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(238,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(239,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(240,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(241,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(242,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(243,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(244,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(245,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(246,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(247,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(248,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(249,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(250,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(251,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(252,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(253,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(254,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} -(255,1,1) = {" -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -"} diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm deleted file mode 100644 index 467dd2fc92d6..000000000000 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ /dev/null @@ -1,77962 +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/riveted, -/area/awaymission/undergroundoutpost45/caves) -"ad" = ( -/turf/closed/mineral/random/labormineral, -/area/awaymission/undergroundoutpost45/caves) -"ae" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"af" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/awaymission/undergroundoutpost45/central) -"ag" = ( -/turf/closed/wall/mineral/titanium, -/area/awaymission/undergroundoutpost45/central) -"ah" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"aj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ak" = ( -/obj/machinery/light/small/broken/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"al" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"an" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/central) -"ao" = ( -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ap" = ( -/obj/machinery/light/small/broken/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aq" = ( -/obj/machinery/button/door/directional/south{ - desc = "A remote control switch for the elevator doors."; - id = "UO45_Elevator"; - name = "Elevator Doors"; - pixel_x = 6 - }, -/obj/machinery/button/door/directional/south{ - desc = "A remote control switch for calling the elevator to your level."; - id = "UO45_useless"; - name = "B1"; - pixel_x = -6 - }, -/obj/machinery/button/door/directional/south{ - desc = "A remote control switch for calling the elevator to your level."; - id = "UO45_useless"; - name = "B2"; - pixel_x = -6; - pixel_y = -34 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ar" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"as" = ( -/obj/machinery/door/poddoor{ - id = "UO45_Elevator" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"at" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"au" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ax" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ay" = ( -/obj/structure/chair/comfy/beige{ - dir = 4 - }, -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"az" = ( -/obj/structure/sign/warning/vacuum{ - desc = "A beacon used by a teleporter."; - icon = 'icons/obj/device.dmi'; - icon_state = "beacon"; - name = "tracking beacon" - }, -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/landmark/awaystart, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aC" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"aD" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"aF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aG" = ( -/obj/machinery/button/door/directional/north{ - desc = "A remote control switch for the elevator."; - id = "UO45_Elevator"; - name = "Elevator Doors"; - pixel_x = 6 - }, -/obj/machinery/button/door/directional/north{ - desc = "A remote control switch to call the elevator."; - id = "UO45_useless"; - name = "Call Elevator"; - pixel_x = -6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aH" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = 32 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aJ" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aK" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/poster/official/safety_internals{ - pixel_x = -32 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aM" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aN" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/machinery/door/firedoor, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aO" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aP" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aQ" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aR" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/machinery/door/firedoor, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aS" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aT" = ( -/obj/effect/landmark/awaystart, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/misc/pj/blue, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aV" = ( -/obj/structure/table/wood, -/obj/item/newspaper, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aW" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/soda_cans/cola, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aX" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"aZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/suit/black/skirt, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ba" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bb" = ( -/obj/structure/table/wood, -/obj/item/book/manual/ripley_build_and_repair, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bc" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bd" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/space, -/area/awaymission/undergroundoutpost45/central) -"bf" = ( -/obj/item/storage/belt/security, -/obj/item/assembly/flash/handheld, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bg" = ( -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bi" = ( -/obj/structure/sink{ - pixel_y = 25 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bj" = ( -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bk" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bm" = ( -/obj/structure/chair/comfy/beige{ - dir = 1 - }, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bn" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bo" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes{ - pixel_y = 2 - }, -/obj/item/lighter{ - pixel_x = 4; - pixel_y = 2 - }, -/turf/open/floor/iron/grimy{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bq" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"br" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bs" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bt" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/all_access{ - pixel_y = -23 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bu" = ( -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bv" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals"; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bx" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"by" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bz" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bA" = ( -/obj/machinery/light/blacklight/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bH" = ( -/obj/machinery/light/blacklight/directional/east, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bI" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bJ" = ( -/obj/structure/toilet{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bK" = ( -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_y = -32 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"bP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"bR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"bT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"bV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"bY" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"bZ" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ca" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ci" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"cj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ck" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"co" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"cp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"cq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"cs" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ct" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cu" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cv" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cx" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cz" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/filingcabinet, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cA" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cD" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cE" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/grille, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "awaydorm2"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "awaydorm1"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"cW" = ( -/obj/structure/grille, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cX" = ( -/obj/item/stack/rods, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/grille, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"cZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm2"; - name = "Dorm 2" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"da" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"db" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm1"; - name = "Dorm 1" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/closet, -/obj/item/poster/random_contraband, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"df" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/central) -"dg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/item/stack/rods, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"di" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dm" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dn" = ( -/obj/machinery/light/blacklight/directional/north, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"do" = ( -/obj/item/kirbyplants{ - layer = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"dv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"dw" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dB" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dC" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dE" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/light/blacklight/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dH" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dJ" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dK" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dM" = ( -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "meat fridge"; - req_access_txt = "201" - }, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dO" = ( -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/reagent_containers/food/condiment/milk, -/obj/item/storage/fancy/egg_box, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "refrigerator"; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"dP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/structure/chair, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dR" = ( -/obj/machinery/door/airlock/security{ - name = "Security Checkpoint"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dS" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dW" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dY" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"dZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ea" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eb" = ( -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ec" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ed" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Gateway Chamber"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ee" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ef" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Security Checkpoint Maintenance"; - req_access_txt = "201" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ei" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ej" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ek" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"el" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"em" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"en" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ep" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eq" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"es" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/central) -"et" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ev" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/misc/pj/red, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ew" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ey" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ez" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eA" = ( -/obj/structure/flora/ausbushes/ppflowers, -/turf/open/floor/grass{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eB" = ( -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eC" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eD" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eI" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eL" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eN" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eO" = ( -/obj/structure/flora/ausbushes/ywflowers, -/turf/open/floor/grass{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eP" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eR" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eV" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eW" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/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 = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eX" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/structure/sign/poster/official/safety_report{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eY" = ( -/obj/machinery/computer/security{ - dir = 1; - network = list("uo45") - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"eZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fb" = ( -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fc" = ( -/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 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ff" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fg" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics"; - network = list("uo45") - }, -/obj/machinery/power/apc/highcap/ten_k{ - locked = 0; - name = "Hydroponics APC"; - pixel_y = -25; - start_charge = 100 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fh" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fi" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fj" = ( -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fk" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fl" = ( -/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, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/central) -"fo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"fp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fs" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ft" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/shovel/spade, -/obj/item/wrench, -/obj/item/screwdriver, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fu" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Hydroponics Maintenance"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fz" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/chair/wood, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "awaydorm3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm3"; - name = "Dorm 3" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fH" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fI" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/eat{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fK" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fL" = ( -/obj/machinery/smartfridge, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fN" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fO" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"fQ" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fR" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/all_access{ - pixel_y = -23 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/dresser, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fS" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fT" = ( -/obj/item/kirbyplants{ - layer = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fU" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Central Hallway"; - network = list("uo45") - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fV" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fW" = ( -/obj/machinery/vending/snack, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fX" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fY" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"fZ" = ( -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ga" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gb" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"gd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"ge" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gg" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gh" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gi" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Kitchen Maintenance"; - req_access_txt = "201" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gm" = ( -/obj/structure/closet/crate{ - desc = "It's a storage unit for kitchen clothes and equipment."; - name = "Kitchen Crate" - }, -/obj/item/storage/box/mousetraps, -/obj/item/clothing/under/suit/waiter, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gn" = ( -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/gas, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"go" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/stack/rods, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gp" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gq" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gr" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gs" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gu" = ( -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "201" - }, -/turf/open/floor/iron/showroomfloor{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gv" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/gateway) -"gw" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/gateway) -"gx" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"gy" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"gz" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"gA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gC" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gD" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gE" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gF" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gG" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gH" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"gJ" = ( -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"gK" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/gateway) -"gL" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/gateway) -"gM" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass{ - amount = 16; - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron{ - amount = 23 - }, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"gN" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"gO" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gP" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"gQ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"gU" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"gV" = ( -/obj/structure/table, -/obj/item/folder/white, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"gW" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"gX" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"gY" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Research Lab"; - network = list("uo45","uo45r") - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"gZ" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ha" = ( -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hb" = ( -/obj/machinery/light/small/directional/east, -/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, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hc" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"hf" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hg" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hh" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/folder/red, -/obj/machinery/door/window/left/directional/south{ - dir = 8; - name = "Security Checkpoint"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"hi" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hj" = ( -/obj/machinery/vending/snack, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hk" = ( -/obj/machinery/vending/cola, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hl" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hm" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hn" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/reagent_containers/glass/rag, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ho" = ( -/obj/machinery/vending/boozeomat, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hp" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hq" = ( -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hr" = ( -/obj/structure/table, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hs" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Kitchen"; - network = list("uo45") - }, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hu" = ( -/obj/machinery/gateway/away{ - calibrated = 0 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hw" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hx" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hy" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hA" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"hB" = ( -/obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hD" = ( -/obj/machinery/rnd/production/fabricator, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hG" = ( -/obj/structure/table/glass, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/micro_laser, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hH" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"hI" = ( -/obj/structure/table, -/obj/item/trash/chips, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hJ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hK" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hL" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hM" = ( -/obj/structure/table/reinforced, -/obj/item/lighter, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Kitchen"; - req_access_txt = "201" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hR" = ( -/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/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hS" = ( -/obj/structure/table, -/obj/item/food/mint, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/table, -/obj/item/book/manual/chef_recipes, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hV" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"hW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"hX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"hZ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/south{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Hydroponics Desk"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ib" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ic" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"id" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ie" = ( -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"if" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ih" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ii" = ( -/obj/machinery/rnd/production/circuit_imprinter/offstation, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ik" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/matter_bin, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"il" = ( -/obj/structure/table, -/obj/item/plate, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"im" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"in" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"io" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/barman_recipes, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ip" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iq" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ir" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/machinery/processor, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"is" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"it" = ( -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iu" = ( -/obj/machinery/door/window{ - name = "Gateway Chamber"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iv" = ( -/obj/structure/window/reinforced, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 32 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ix" = ( -/obj/machinery/door/airlock{ - name = "Emergency Supplies" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/stock_parts/scanning_module, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iz" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iD" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iF" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iG" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iI" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"iL" = ( -/obj/machinery/light/small/directional/north, -/obj/item/clothing/gloves/color/latex, -/obj/structure/closet/emcloset, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iM" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"iO" = ( -/obj/structure/table, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iP" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iQ" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/table, -/obj/item/paper/pamphlet/gateway, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iS" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/gateway) -"iW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"iY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"iZ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ja" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jb" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jc" = ( -/obj/machinery/light/blacklight/directional/east, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jd" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"je" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jf" = ( -/obj/structure/closet/secure_closet{ - locked = 0; - name = "kitchen Cabinet"; - req_access_txt = "201" - }, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/sugar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jg" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Gateway Chamber"; - network = list("uo45","uo45r") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ji" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Gateway Observation"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/table, -/obj/item/folder/white, -/obj/item/disk/data, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"js" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"jt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ju" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jv" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jw" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jx" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/drinks/bottle/beer, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jz" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Bar"; - network = list("uo45") - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jA" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"jE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/central) -"jF" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jG" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jI" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jK" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"jM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"jN" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/research{ - name = "Research Lab"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"jO" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"jQ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/research) -"jR" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/poster/official/safety_internals{ - pixel_y = 32 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jS" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jT" = ( -/obj/structure/table, -/obj/item/kitchen/fork, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jV" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 1; - locked = 0; - name = "UO45 Bar APC"; - pixel_y = 25; - start_charge = 100 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jW" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jX" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"jZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ka" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"kb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"kc" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"kd" = ( -/obj/item/storage/backpack/satchel/science, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/suit/toggle/labcoat/science, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet{ - icon_state = "rd"; - name = "research director's locker"; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kh" = ( -/obj/item/kirbyplants{ - layer = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ki" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/command{ - name = "Gateway EVA"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"km" = ( -/obj/item/clothing/under/suit/navy, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kn" = ( -/obj/machinery/light/blacklight/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ko" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ks" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ku" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"kv" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"kw" = ( -/obj/structure/closet/l3closet, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"kx" = ( -/obj/structure/closet/crate, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"ky" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/clothing/head/welding, -/obj/structure/sign/warning/biohazard{ - pixel_y = 32 - }, -/obj/item/assembly/prox_sensor, -/obj/item/assembly/prox_sensor, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kz" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kA" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kJ" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"kM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kO" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kT" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kW" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kX" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_biohazard"; - name = "biohazard containment door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"kZ" = ( -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/space/nearstation) -"la" = ( -/obj/machinery/shower{ - pixel_y = 15 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lb" = ( -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/sign/departments/science{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ld" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"le" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lf" = ( -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lg" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"li" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lj" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - pixel_y = -23 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ll" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lm" = ( -/obj/structure/disposalpipe/junction, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ln" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"lo" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lr" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Gateway Ready Room"; - network = list("uo45","uo45r") - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/item/reagent_containers/spray/pepper, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"ly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lA" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division West"; - network = list("uo45","uo45r") - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"lE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lF" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lG" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/machinery/firealarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lH" = ( -/obj/machinery/power/apc/highcap/ten_k{ - locked = 0; - name = "UO45 Research Division APC"; - pixel_y = -25; - start_charge = 100 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lI" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lM" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lN" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Research Division East"; - network = list("uo45","uo45r") - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lO" = ( -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"lP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lR" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lS" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lT" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lU" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lW" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Diner" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"lX" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/plasma{ - amount = 26 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"lY" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering Secure Storage"; - network = list("uo45") - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"lZ" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ma" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mb" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mc" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"md" = ( -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"me" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mg" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mh" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/command{ - name = "Research Director's Office"; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mi" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_rdprivacy"; - name = "privacy shutters" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_rdprivacy"; - name = "privacy shutters" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mk" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ml" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mm" = ( -/obj/structure/closet/firecloset, -/obj/machinery/light/small/directional/south, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mn" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mp" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mq" = ( -/obj/structure/table, -/obj/item/newspaper, -/obj/machinery/newscaster/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mr" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ms" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mt" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mu" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mv" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/storage/backpack/satchel/eng, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/mask/gas, -/obj/item/clothing/glasses/meson, -/obj/structure/closet/secure_closet/engineering_personal{ - locked = 0; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"mx" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"my" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mz" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"mA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"mB" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/flashlight, -/obj/item/flashlight, -/obj/item/flashlight, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mD" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mE" = ( -/obj/machinery/power/apc/highcap/ten_k{ - locked = 0; - name = "UO45 Gateway APC"; - pixel_y = -25; - start_charge = 100 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mF" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mG" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mH" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"mJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"mK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mL" = ( -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"mM" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mN" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mP" = ( -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants{ - layer = 5 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mR" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/newscaster/directional/west, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mS" = ( -/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{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mT" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mU" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"mV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "awaydorm5"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"mZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"nb" = ( -/obj/machinery/button/door/directional/south{ - id = "awaydorm7"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nc" = ( -/obj/machinery/vending/cola, -/obj/effect/decal/cleanable/dirt, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nd" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ne" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nf" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/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 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ng" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nh" = ( -/obj/machinery/door/poddoor{ - id = "UO45_Secure Storage"; - name = "secure storage" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ni" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"nj" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nk" = ( -/obj/structure/table, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nl" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/chair, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"no" = ( -/obj/machinery/computer/security{ - dir = 4; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"np" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nq" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - dir = 8; - name = "research monitor"; - network = list("uo45r") - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nr" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ns" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/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/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nx" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/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/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ny" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nz" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/contraband/smoke{ - pixel_y = 32 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm5"; - name = "Dorm 5" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm7"; - name = "Dorm 7" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nI" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"nJ" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"nK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"nL" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"nM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"nN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nO" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/table, -/obj/item/radio/off, -/obj/item/laser_pointer, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nP" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/folder/white, -/obj/item/stamp/rd{ - pixel_x = 3; - pixel_y = -2 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nR" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the research division and the labs within."; - name = "research monitor"; - network = list("uo45r") - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nS" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/item/paicard{ - pixel_x = 4 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nT" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/machinery/light/blacklight/directional/west, -/obj/item/radio/off, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nV" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"nW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"nX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"nY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"nZ" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oa" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ob" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"od" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oe" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/camera/directional/north{ - c_tag = "Dormitories"; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"of" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"og" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oh" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ok" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ol" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"om" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"on" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oo" = ( -/obj/structure/disposalpipe/junction/yjunction{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"op" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Dormitories" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oq" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"or" = ( -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"os" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ot" = ( -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 10000; - inputting = 0; - output_level = 7000 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ou" = ( -/obj/machinery/power/smes{ - charge = 1.5e+006; - input_level = 30000; - inputting = 0; - output_level = 7000 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ov" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ow" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ox" = ( -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oy" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/button/door{ - desc = "A remote control-switch which locks the research division down in the event of a biohazard leak or contamination."; - id = "UO45_biohazard"; - name = "Biohazard Door Control"; - pixel_y = 8; - req_access_txt = "201" - }, -/obj/machinery/button/door{ - desc = "A remote control-switch that controls the privacy shutters."; - id = "UO45_rdprivacy"; - name = "Privacy Shutter Control"; - pixel_y = -2; - req_access_txt = "201" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oz" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oA" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oB" = ( -/obj/machinery/computer/aifixer{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oC" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oE" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oQ" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oR" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oT" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"oU" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"oV" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/port_gen/pacman{ - name = "P.A.C.M.A.N.-type portable generator" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"oW" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/power/port_gen/pacman/super{ - name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator" - }, -/obj/item/wrench, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"oY" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"oZ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pa" = ( -/obj/machinery/air_sensor{ - chamber_id = "uo45air" - }, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pb" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pc" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pd" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pe" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pg" = ( -/obj/item/storage/secure/safe{ - pixel_x = 5; - pixel_y = -27 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ph" = ( -/obj/structure/filingcabinet, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - desc = "A remote control switch which locks the research division down in the event of a biohazard leak or contamination."; - id = "UO45_biohazard"; - name = "Biohazard Door Control"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pl" = ( -/obj/item/kirbyplants{ - layer = 5 - }, -/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 = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pn" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"po" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm4"; - name = "Dorm 4" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - id_tag = "awaydorm6"; - name = "Dorm 6" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pr" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ps" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"px" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"py" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"pz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pD" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"pE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "uo45air" - }, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pF" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "uo45air" - }, -/turf/open/floor/engine/air, -/area/awaymission/undergroundoutpost45/engineering) -"pG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"pI" = ( -/obj/machinery/door/airlock/command{ - name = "Server Room"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pJ" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"pL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"pM" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Research Storage"; - req_access_txt = "201" - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"pN" = ( -/obj/structure/chair/comfy/black, -/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 = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pO" = ( -/obj/structure/chair/comfy/black, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pP" = ( -/obj/structure/chair/comfy/black, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "awaydorm4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/button/door/directional/east{ - id = "awaydorm6"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pV" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/toilet{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pW" = ( -/obj/machinery/door/airlock{ - name = "Unit 1" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pX" = ( -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pY" = ( -/obj/structure/mirror/directional/east, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"pZ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qb" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/door/airlock/engineering/glass{ - name = "SMES Room"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qd" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter{ - layer = 3.3; - name = "Mixed Air Tank Out" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qe" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/meter{ - layer = 3.3; - name = "Mixed Air Tank In" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qf" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"qh" = ( -/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/awaymission/undergroundoutpost45/research) -"qi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general{ - dir = 10 - }, -/turf/open/floor/iron/dark/telecomms, -/area/awaymission/undergroundoutpost45/research) -"qj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = 32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qk" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ql" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qm" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sink{ - dir = 4; - pixel_x = -11 - }, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qn" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qo" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/clothing/glasses/hud/health, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/corner{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qp" = ( -/obj/structure/table, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/item/hand_labeler, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/iron/white/side{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qq" = ( -/obj/machinery/vending/medical{ - req_access_txt = "201" - }, -/turf/open/floor/iron/white/side{ - dir = 6; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qr" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qs" = ( -/obj/structure/chair/wood, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qt" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qu" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/dresser, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qv" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qw" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qx" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qy" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qC" = ( -/obj/machinery/vending/cola, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qD" = ( -/obj/structure/chair, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qE" = ( -/obj/machinery/computer/monitor/secret{ - name = "primary power monitoring console" - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/obj/structure/closet/secure_closet/engineering_personal{ - req_access = null; - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qJ" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 10 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics"; - network = list("uo45") - }, -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/machinery/firealarm/directional/north, -/obj/item/multitool, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("uo45air" = "Air Supply") - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qL" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 10 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qN" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"qO" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qP" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/server{ - dir = 8; - pixel_x = -22 - }, -/turf/open/floor/circuit/telecomms/server, -/area/awaymission/undergroundoutpost45/research) -"qQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general, -/turf/open/floor/iron/dark/telecomms, -/area/awaymission/undergroundoutpost45/research) -"qR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general{ - dir = 4 - }, -/obj/machinery/door/airlock/command/glass{ - name = "Server Room"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general{ - dir = 4 - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qT" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general{ - dir = 9 - }, -/obj/structure/chair/office/light, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qU" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qW" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qX" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"qY" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/south, -/obj/item/pen, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"qZ" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ra" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rb" = ( -/obj/machinery/door/airlock{ - name = "Unit 2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rc" = ( -/obj/structure/mirror/directional/east, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rd" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"re" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rf" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rg" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rh" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ri" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rj" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rk" = ( -/obj/item/kirbyplants{ - layer = 5 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rl" = ( -/obj/machinery/firealarm/directional/north, -/obj/structure/tank_dispenser{ - pixel_x = -1 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rm" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/table, -/obj/item/storage/box, -/obj/item/storage/box, -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ro" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"rp" = ( -/obj/machinery/power/apc/highcap/ten_k{ - dir = 8; - name = "UO45 Engineering APC"; - pixel_x = -25; - req_access_txt = "201"; - start_charge = 100 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/machinery/meter/monitored{ - chamber_id = "uo45distro" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/item/clothing/suit/armor/vest, -/obj/item/clothing/head/helmet, -/obj/structure/closet/secure_closet{ - icon_state = "sec"; - name = "security officer's locker"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/button/door/directional/east{ - desc = "A remote control switch for the engineering security doors."; - id = "UO45_Engineering"; - name = "Engineering Lockdown"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rs" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/obj/item/clothing/under/misc/pj/blue, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"rt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ru" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Mix to Exterior" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ry" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general{ - dir = 9 - }, -/turf/open/floor/iron/dark/telecomms, -/area/awaymission/undergroundoutpost45/research) -"rA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'SERVER ROOM'."; - name = "SERVER ROOM"; - pixel_y = -32 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rB" = ( -/obj/structure/table, -/obj/item/folder/white, -/obj/item/pen, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rC" = ( -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rD" = ( -/obj/structure/closet/crate, -/obj/item/storage/box/lights/mixed, -/obj/item/poster/random_contraband, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rE" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "201" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rG" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/iron/white/side{ - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rJ" = ( -/obj/structure/table, -/obj/item/storage/box/gloves, -/turf/open/floor/iron/white/side{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"rL" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rM" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering Hallway"; - network = list("uo45") - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rO" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rT" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"rX" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Reception" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"rZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sa" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"se" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sg" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering security door" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"si" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/closet/secure_closet/personal/cabinet{ - locked = 0; - req_access_txt = "201" - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"sj" = ( -/obj/machinery/power/apc/highcap/ten_k{ - locked = 0; - name = "UO45 Mining APC"; - pixel_y = -25; - start_charge = 100 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/closet/secure_closet/engineering_personal{ - icon_state = "mining"; - locked = 0; - name = "miner's equipment"; - req_access = null; - req_access_txt = "201" - }, -/obj/item/storage/backpack/satchel/eng, -/obj/item/clothing/gloves/fingerless, -/obj/effect/turf_decal/tile/brown, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"sk" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Distro" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"so" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("uo45mix" = "Mix Chamber"); - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sq" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible{ - dir = 4 - }, -/obj/machinery/meter{ - layer = 3.3 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "uo45mix"; - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"ss" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"st" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"su" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"sv" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = -32 - }, -/turf/open/floor/iron/white/corner{ - dir = 4; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"sw" = ( -/obj/structure/closet/l3closet, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"sx" = ( -/obj/structure/closet/l3closet, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"sA" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/item/soap/nanotrasen, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sB" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sC" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sE" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sH" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"sL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Reception" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sN" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sT" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering security door" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sU" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Waste In" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sY" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Mix to Filter" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"sZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ta" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible{ - dir = 9 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 6 - }, -/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 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"td" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/machinery/meter{ - layer = 3.3 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"te" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "uo45mix"; - dir = 8 - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"tf" = ( -/obj/machinery/air_sensor{ - chamber_id = "uo45mix" - }, -/turf/open/floor/engine/vacuum, -/area/awaymission/undergroundoutpost45/engineering) -"tg" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"th" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ti" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tj" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tm" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"to" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"tp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"tq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/research) -"tr" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ts" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tu" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tv" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tw" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tx" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ty" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tz" = ( -/obj/machinery/computer/security{ - dir = 1; - network = list("uo45") - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/button/door/directional/west{ - desc = "A remote control switch for the security privacy shutters."; - id = "UO45_EngineeringOffice"; - name = "Privacy Shutters"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 8 - }, -/obj/machinery/meter/monitored{ - chamber_id = "uo45waste" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tH" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 Outlet Pump" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tI" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 Outlet Pump" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tJ" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Unfiltered to Mix" - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"tK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"tL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Maintenance"; - req_access_txt = "201" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"tN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/research) -"tO" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tQ" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tV" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/obj/item/stack/rods, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"tW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/research) -"tX" = ( -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tY" = ( -/obj/machinery/shower{ - dir = 1 - }, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"tZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"ua" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"ud" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/meter, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"ue" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/engineering{ - name = "Engineering Foyer"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uf" = ( -/obj/structure/filingcabinet, -/obj/effect/decal/cleanable/dirt, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ug" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ui" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uj" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "External to Filter" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uk" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Air to External" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ul" = ( -/obj/machinery/light/blacklight/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 5 - }, -/obj/machinery/airalarm/all_access{ - pixel_y = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"um" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"un" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("uo45n2" = "Nitrogen Supply"); - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"up" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/noreconnect{ - atmos_chambers = list("uo45o2" = "Oxygen Supply"); - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"ur" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 9 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"us" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ut" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden{ - dir = 10 - }, -/obj/structure/table/reinforced, -/obj/item/wrench, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uv" = ( -/turf/closed/mineral/random/labormineral, -/area/awaymission/undergroundoutpost45/research) -"uw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"ux" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/research) -"uy" = ( -/obj/structure/closet, -/obj/item/storage/belt/utility, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uz" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/fixed{ - atmos_chambers = list("uo45air" = "Air Supply", "uo45mix" = "Mix Chamber", "uo45n2" = "Nitrogen Supply", "uo45o2" = "Oxygen Supply"); - dir = 4; - name = "Chamber Atmospherics Monitoring" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uC" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uE" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"uF" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_access_txt = "201" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/engineering) -"uI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible{ - dir = 1 - }, -/obj/machinery/meter{ - layer = 3.3 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uJ" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/meter{ - layer = 3.3 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uK" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uL" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uM" = ( -/obj/machinery/atmospherics/components/binary/valve, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uN" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"uQ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uR" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uS" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"uU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/fixed{ - atmos_chambers = list("uo45waste", "uo45distro"); - dir = 4; - name = "Distribution and Waste Monitoring" - }, -/turf/open/floor/iron/dark/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uX" = ( -/obj/machinery/light/blacklight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/warning/securearea{ - pixel_x = 32 - }, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"uZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"va" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering security door" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering security door" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vc" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/machinery/door/poddoor/preopen{ - id = "UO45_Engineering"; - name = "engineering security door" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vd" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "uo45n2"; - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"ve" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "uo45n2"; - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vf" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - chamber_id = "uo45o2"; - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vg" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - chamber_id = "uo45o2"; - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vh" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"vi" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"vj" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"vk" = ( -/obj/machinery/door/airlock/external/ruin, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"vm" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/stack/rods, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vp" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"vs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/computer/atmos_alert{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/dark/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vt" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vv" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vy" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vz" = ( -/obj/machinery/door/airlock/engineering{ - name = "Engineering"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vC" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vD" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/air_sensor{ - chamber_id = "uo45n2" - }, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vE" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/engine/n2, -/area/awaymission/undergroundoutpost45/engineering) -"vF" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/air_sensor{ - chamber_id = "uo45o2" - }, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vG" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/engine/o2, -/area/awaymission/undergroundoutpost45/engineering) -"vI" = ( -/turf/closed/wall/r_wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"vJ" = ( -/turf/closed/wall/r_wall, -/area/awaymission/undergroundoutpost45/mining) -"vK" = ( -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"vL" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"vM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Maintenance"; - req_access_txt = "201" - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"vN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Foyer"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"vO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Foyer"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"vP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/machinery/computer/station_alert{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/noticeboard{ - dir = 1; - pixel_y = -27 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vT" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/obj/machinery/vending/engivend, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering Foyer"; - network = list("uo45") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/vending/tool, -/obj/structure/sign/poster/official/build{ - pixel_y = -32 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/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/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/engineering) -"vY" = ( -/obj/structure/closet/emcloset, -/obj/item/clothing/mask/breath, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"vZ" = ( -/obj/structure/closet/firecloset, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wa" = ( -/obj/structure/closet/firecloset, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wb" = ( -/obj/structure/table/wood, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wc" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"we" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"wf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wg" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/item/kirbyplants{ - layer = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wl" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wn" = ( -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/engineering) -"wp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "awaydorm8"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm8"; - name = "Mining Dorm 1" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"ws" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"ww" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wB" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wC" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wK" = ( -/obj/machinery/door/airlock{ - name = "Private Restroom" - }, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wL" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/freezer{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"wM" = ( -/obj/structure/chair/wood, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "awaydorm9"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock{ - id_tag = "awaydorm9"; - name = "Mining Dorm 2" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/closet/secure_closet/miner{ - req_access = null; - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"wZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/mining{ - name = "Processing Area"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/door/airlock/mining{ - name = "Processing Area"; - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xl" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xm" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 4; - output_dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xn" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xq" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" - }, -/obj/structure/sign/warning/nosmoking{ - pixel_x = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xr" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xs" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "UO45_mining"; - name = "mining conveyor" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xu" = ( -/obj/machinery/suit_storage_unit/mining, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xv" = ( -/obj/structure/table, -/obj/item/pickaxe, -/obj/item/radio/off, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xw" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xx" = ( -/obj/machinery/mineral/processing_unit_console{ - machinedir = 8 - }, -/turf/closed/wall/rust, -/area/awaymission/undergroundoutpost45/mining) -"xy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/machinery/light/blacklight/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Mining"; - network = list("uo45") - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xA" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xC" = ( -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xD" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xE" = ( -/obj/machinery/conveyor{ - id = "UO45_mining" - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xF" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/mining/glass{ - name = "Mining EVA"; - req_access_txt = "201" - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xL" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xM" = ( -/obj/machinery/mineral/stacking_unit_console{ - machinedir = 2 - }, -/turf/closed/wall, -/area/awaymission/undergroundoutpost45/mining) -"xN" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/closet/crate, -/obj/item/stack/sheet/iron{ - amount = 26 - }, -/obj/item/stack/sheet/glass{ - amount = 19 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xQ" = ( -/obj/machinery/computer/mech_bay_power_console{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xR" = ( -/obj/structure/cable, -/turf/open/floor/iron/recharge_floor, -/area/awaymission/undergroundoutpost45/mining) -"xS" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/awaymission/undergroundoutpost45/mining) -"xT" = ( -/obj/machinery/mineral/stacking_machine{ - dir = 1; - input_dir = 8; - output_dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xU" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/machinery/firealarm/directional/east, -/obj/structure/closet/crate, -/obj/item/stack/sheet/mineral/plasma{ - amount = 6 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/external/ruin{ - name = "Mining External Airlock"; - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xY" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"xZ" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -23 - }, -/obj/structure/closet/emcloset, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"ya" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"yb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/iron{ - dir = 8; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"yc" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"yd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"ye" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"yf" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Mining External Airlock"; - req_access_txt = "201" - }, -/obj/effect/turf_decal/sand, -/turf/open/floor/iron, -/area/awaymission/undergroundoutpost45/mining) -"yy" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"yN" = ( -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"zb" = ( -/obj/structure/alien/weeds, -/obj/structure/alien/resin/wall, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"zq" = ( -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"zG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/newscaster{ - pixel_x = -30 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"zK" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"zO" = ( -/obj/effect/decal/cleanable/blood/gibs/up, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"zX" = ( -/obj/structure/closet/secure_closet{ - icon_state = "hydro"; - locked = 0; - name = "botanist's locker"; - req_access_txt = "201" - }, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/plant_analyzer, -/obj/item/clothing/mask/bandana/striped/botany, -/obj/item/hatchet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Ae" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Ai" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Bh" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"BK" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/clothing/glasses/meson{ - pixel_y = 4 - }, -/obj/item/stamp/ce, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"BL" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/down, -/obj/effect/mob_spawn/corpse/human, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"BN" = ( -/obj/machinery/computer/monitor/secret{ - dir = 1; - name = "primary power monitoring console" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"BQ" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"BS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Cd" = ( -/obj/structure/alien/weeds, -/obj/structure/glowshroom/single, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Ce" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/research) -"Cr" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Cv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Cw" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 2; - pixel_y = 6 - }, -/turf/open/floor/iron/white/corner{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"CH" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Dm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Dq" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Dz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"DJ" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 6 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"DU" = ( -/obj/structure/table/reinforced, -/obj/item/storage/fancy/cigarettes{ - pixel_x = -2 - }, -/obj/item/lighter{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Ed" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/south{ - dir = 4; - name = "Hydroponics Desk"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"EP" = ( -/obj/structure/closet/secure_closet{ - icon_state = "hydro"; - locked = 0; - name = "botanist's locker"; - req_access_txt = "201" - }, -/obj/item/clothing/suit/apron, -/obj/item/storage/bag/plants/portaseeder, -/obj/item/clothing/mask/bandana/striped/botany, -/obj/item/cultivator, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Fd" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/command/glass{ - name = "Chief Engineer"; - req_access_txt = "201" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Fx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Fy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"FS" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Ga" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Gl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Gn" = ( -/obj/structure/alien/weeds, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Gp" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"GI" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"HM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"HW" = ( -/obj/structure/alien/weeds, -/obj/structure/glowshroom/single, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Ic" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"IK" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"IT" = ( -/obj/structure/alien/weeds, -/obj/effect/mob_spawn/corpse/human, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Km" = ( -/obj/structure/table, -/obj/item/storage/medkit/toxin{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/storage/medkit/toxin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/white/side{ - dir = 1; - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/research) -"Kt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"KE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/circuit/telecomms/server, -/area/awaymission/undergroundoutpost45/research) -"KN" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"KU" = ( -/obj/structure/closet/crate, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"KY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Lb" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/corpse/human, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Lk" = ( -/obj/effect/decal/cleanable/blood/splatter, -/obj/effect/mob_spawn/corpse/human, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Lz" = ( -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 351.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"LW" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"Mk" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/gateway) -"Mu" = ( -/obj/machinery/door/window/right/directional/south{ - name = "Bar Door"; - req_access_txt = "201" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"Mx" = ( -/obj/machinery/light/small/directional/east, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"MA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"MC" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/mining) -"MW" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/central) -"NA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/machinery/door/window/left/directional/south{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Security Checkpoint"; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"NK" = ( -/obj/structure/bookcase/manuals/engineering, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"NQ" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/item/paper/guides/jobs/hydroponics, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"NT" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/central) -"Oh" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/gateway) -"Oq" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/mining) -"Ot" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"OF" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"OO" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/sign/warning/deathsposal{ - desc = "A warning sign which reads 'DISPOSAL: LEADS TO EXTERIOR'"; - name = "\improper DISPOSAL: LEADS TO EXTERIOR"; - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Qm" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_EngineeringOffice"; - name = "Privacy Shutters" - }, -/obj/machinery/door/window/left/directional/south{ - dir = 4; - name = "Engineering Reception"; - req_access_txt = "201" - }, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Qo" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Qu" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"QX" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/structure/sign/warning/biohazard{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"Rb" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"Rx" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"RA" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"RX" = ( -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/button/door/directional/south{ - id = "UO45_Engineering"; - name = "Engineering Lockdown"; - pixel_x = -6; - req_access_txt = "201" - }, -/obj/machinery/button/door/directional/south{ - id = "UO45_Secure Storage"; - name = "Engineering Secure Storage"; - pixel_x = 6; - req_access_txt = "201" - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Sf" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/research) -"Sh" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Su" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/gateway) -"Tr" = ( -/obj/structure/alien/resin/membrane, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"TC" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"UG" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"UH" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/down, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"UM" = ( -/obj/effect/turf_decal/sand/plating, -/obj/effect/turf_decal/stripes/asteroid/line{ - dir = 10 - }, -/turf/open/floor/plating{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Wd" = ( -/obj/structure/alien/resin/wall, -/obj/structure/alien/weeds, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Wo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - dir = 1; - name = "Hydroponics Desk"; - req_access_txt = "201" - }, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"WE" = ( -/obj/structure/glowshroom/single, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 351.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"WQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet{ - dir = 4 - }, -/turf/open/floor/carpet{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"XF" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"XJ" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "UO45_EngineeringOffice"; - name = "Privacy Shutters" - }, -/obj/machinery/door/window/left/directional/south{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Engineering Reception"; - req_access_txt = "201" - }, -/obj/item/folder/red, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"XQ" = ( -/obj/structure/glowshroom/single, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Yb" = ( -/obj/structure/alien/weeds, -/obj/structure/bed/nest, -/obj/effect/mob_spawn/corpse/human, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"Yn" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) -"YK" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/crew_quarters) -"YV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/engineering) -"Zs" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/mining) -"ZD" = ( -/obj/structure/alien/weeds, -/obj/effect/decal/cleanable/blood/gibs/core, -/turf/open/misc/asteroid{ - heat_capacity = 1e+006; - initial_gas = list("carbon_dioxide" = 173.4, "nitrogen" = 135.1, "plasma" = 229.8); - name = "Cave Floor"; - temperature = 363.9 - }, -/area/awaymission/undergroundoutpost45/caves) -"ZZ" = ( -/obj/structure/table, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 13; - pixel_y = 5 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/plantbgone{ - pixel_y = 3 - }, -/obj/item/watertank, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark{ - heat_capacity = 1e+006 - }, -/area/awaymission/undergroundoutpost45/central) - -(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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Yb -ZD -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zK -KN -Gn -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gw -gw -gv -gv -gw -gw -gw -gv -gw -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -HW -Gn -zq -Tr -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gI -gI -gJ -gJ -is -QX -jg -jF -gv -gK -gK -gL -gK -gK -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Gn -zq -ci -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gJ -LW -LW -LW -it -iO -jh -jG -gw -ky -lo -ma -mB -gK -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zO -ad -UH -Yb -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gJ -LW -hu -Su -iu -iP -ji -iP -ed -iP -iP -jI -mC -gL -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lk -zq -KN -ZD -BL -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gw -gJ -LW -LW -LW -iv -iQ -jj -jI -gv -kz -lq -jI -mD -gL -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Yb -ZD -zb -Wd -ad -ad -ad -zq -Gn -zq -Tr -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gJ -gI -gJ -gJ -it -iR -jk -jI -gv -gK -lr -iP -mE -gK -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Yb -zK -Gn -IT -zb -ad -ad -ad -XQ -zq -BQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gv -gv -gU -gU -gU -gU -iS -jl -gv -gv -kA -ji -mb -mF -gv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Cd -zq -BQ -ZD -ad -ad -Tr -zq -zq -Tr -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gK -gV -hw -ib -ib -iT -jm -gK -Rx -kB -lt -mb -mG -gw -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -Gn -ad -Lb -zq -zq -ad -ad -ad -ad -ad -Yb -Gn -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gL -gW -hx -ic -iw -iU -jn -gL -Rx -kC -ji -mc -mH -gw -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zO -Gn -Gn -Gn -Gn -zq -zq -ad -ad -ad -ad -IT -ZD -UH -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gK -gK -gL -gL -gK -iV -jo -gL -gL -iV -kl -gK -gw -gv -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Gn -zq -zq -zq -zq -Lk -Tr -zO -XQ -BQ -zq -zb -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gL -hy -id -gK -iW -jp -jJ -kf -kD -lv -md -gU -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Tr -zq -zq -zq -Gn -zq -zq -zq -zq -zq -zb -Wd -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gK -hz -ie -ix -iX -jq -jK -kE -kE -lw -me -gU -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -IT -BQ -zq -Gn -Gn -ZD -zq -Gn -Gn -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gL -hA -if -gv -gv -gw -gw -gv -kF -lx -gw -gv -Oh -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -UH -Gn -zq -Gn -ad -ad -KN -Yb -zK -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gL -gv -gv -gv -XQ -zq -zq -gv -kG -ly -gw -zq -zq -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Gn -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -gU -kH -ly -gU -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -Tr -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -gU -kI -lz -gU -zq -zq -zq -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -XQ -zq -XQ -zq -zq -zq -gU -kH -ly -gU -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -Mk -gw -kJ -lA -gw -Oh -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -gU -kH -ly -gU -zq -zq -XQ -zq -zq -XQ -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -zq -zq -zq -gU -kK -lB -gU -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -gU -kG -ly -gU -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -XQ -gw -kH -lC -gv -zq -XQ -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -gz -gw -kL -lD -gv -hc -zq -ad -gz -hc -hc -gy -gy -gx -gx -gx -gy -gx -gy -gy -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gx -gy -gx -gz -gz -hc -gz -gz -kh -kM -lE -mf -mJ -mJ -nM -nM -pb -pG -qf -qO -ry -qO -tg -tK -us -uK -vh -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gx -gX -hB -ih -iy -iY -jr -jM -ki -kN -lF -mg -mK -nj -nN -ow -pc -pH -qg -pH -qg -qg -th -tL -ut -uL -vi -gx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gy -gY -hC -ih -iz -iZ -js -jN -kj -kO -lG -gy -gz -gz -gz -gz -gz -gz -KE -qP -qh -gz -nt -tM -uu -uM -vj -gx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gx -gy -gZ -hD -ii -iA -ha -gX -jO -kk -kP -lH -gy -kd -nk -nO -ox -pd -gy -qi -qQ -rz -gz -ti -tN -gy -gy -gx -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gx -gM -ha -hE -hE -iB -gz -gz -gz -gz -kQ -lI -gy -mM -nl -nl -nl -pe -gy -qj -qR -rA -gz -nu -tN -uv -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gy -gN -gX -hF -kN -iC -hc -zq -zq -gz -kR -lJ -mh -mN -nm -nP -oy -mP -pI -qk -qS -rB -hc -nu -tM -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gz -gz -hb -hG -ik -iD -hc -zq -zq -hH -kS -lK -mi -mO -nn -nQ -oz -pf -gy -ql -qT -rC -hc -tj -tO -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -gz -hc -hH -hH -hc -gz -zq -zq -hH -kR -lL -mj -mP -mP -nR -oA -pg -gy -gx -gz -gz -gz -tk -tP -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -zq -XQ -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -jQ -zq -zq -zq -zq -zq -zq -hH -kR -lM -mj -mQ -mP -nS -oB -oA -pJ -qm -hc -rD -st -tl -tP -gy -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -zq -zq -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -Sf -gz -kT -lN -gx -gy -gx -gx -gx -gy -gy -qn -hc -rE -su -tm -tQ -gx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -XQ -zq -zq -zq -zq -zq -hH -kR -lM -hH -mR -no -nT -oC -ph -gy -gy -gz -rF -gz -tn -tP -gx -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -XQ -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -XQ -zq -zq -zq -zq -zq -zq -zq -zq -hH -kU -lM -hH -mS -np -nU -oD -pi -pK -qo -qU -rG -sv -tn -tP -gz -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -XQ -zq -hH -kV -lM -hH -mT -nq -nV -nV -lu -pL -qp -qV -rH -sw -to -tR -gz -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aC -aC -aD -aD -aC -aC -aC -aC -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -XQ -zq -zq -gz -gz -kW -lM -hH -hH -hH -hH -oE -hH -gx -qq -ha -kP -sx -tn -tP -hc -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -XQ -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aD -aD -aD -aC -aC -aC -cu -cD -cW -di -cq -cq -ee -aC -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -gz -gn -kV -ha -mk -mk -mk -mk -mk -mk -pM -ha -ha -rI -Km -tn -tS -hc -hc -hc -Ce -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -bq -bq -bq -al -bY -aC -al -bY -cX -cm -ae -ae -ef -ae -an -an -ae -aC -aC -aC -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -gz -iL -kX -kX -kX -mU -nr -mU -mU -kV -jO -qr -qW -rJ -Cw -tp -tT -gy -uN -hH -ah -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aC -br -aC -aC -aC -bZ -aC -cv -cE -cW -Gl -ae -bf -eg -cz -zG -eW -fo -fA -fQ -aC -ad -ad -zq -zq -zq -zq -zq -zq -zq -ad -gz -gz -kY -kY -kY -gz -hc -hc -gz -hc -gz -gz -gz -gz -gz -tq -tU -uw -uO -vk -ah -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -bi -bs -by -bI -bO -ca -cp -cp -cF -cY -cf -dv -dP -eh -bL -bL -eX -fm -fB -fR -aC -ad -ad -zq -zq -zq -zq -zq -zq -XQ -ad -ad -gz -gz -lO -gz -gz -ns -nN -nj -rK -nN -nN -qX -rK -nN -tr -tV -ux -uP -hH -ah -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -XQ -ad -ad -ad -ad -zq -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -bj -bt -aC -aC -bP -cb -cq -ct -BS -cq -dk -an -dQ -ei -ew -eL -eY -an -fC -fS -aC -ad -XQ -zq -zq -zq -zq -zq -zq -zq -zq -ad -gy -kZ -ha -ml -gx -nt -nW -mJ -mJ -nM -mJ -mJ -mJ -mJ -nM -tW -hc -hc -hc -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aC -aC -aC -ad -ad -aC -bi -bu -bz -bJ -bQ -cc -aC -aC -aC -ae -br -an -dR -aP -NA -hh -aP -ae -fD -aC -aC -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -gx -la -ha -mm -gy -nu -nX -zq -zq -XQ -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -XQ -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -au -aK -aC -aP -aP -aC -aC -bv -aC -aC -bQ -cd -cr -cw -cH -ae -aF -dw -aS -ej -ey -ey -eZ -bA -fE -fT -aC -ad -ad -zq -zq -Mx -zq -zq -zq -zq -XQ -ad -gy -lb -ha -mn -gy -nu -nY -zq -zq -zq -zq -zq -zq -XQ -zq -zq -zq -zq -zq -zq -zq -zq -XQ -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ae -ae -ae -ae -ae -ae -aS -aS -aN -ax -ax -ax -bk -aS -bA -aF -bP -Gl -aC -cx -cI -cZ -dl -dx -aS -aS -aS -aS -aS -aS -fE -aS -aC -fO -gr -gr -gr -gg -gr -gr -gr -gg -gg -fK -gy -gy -lO -gy -gx -nv -nY -gr -gr -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -zq -zq -zq -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -af -ag -ag -ag -af -an -aS -aS -aO -ax -az -aB -bl -bw -bB -bK -bR -cf -cp -aU -cJ -ae -aF -dy -dS -ek -ez -eN -fa -fp -bL -aS -da -gA -gs -gA -gs -hf -gs -gs -iE -ja -jt -ng -kn -lc -lP -mo -mV -nw -nZ -oF -pl -gr -gr -zq -XQ -zq -zq -zq -XQ -zq -zq -zq -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -zq -ad -zq -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ag -aj -ak -aq -ag -an -aF -aS -aP -ay -ay -aT -bm -aC -bC -aS -bQ -cg -ae -ae -ae -ae -aS -aS -dT -el -el -el -el -fq -fF -bL -ge -gl -gt -gA -gs -hg -gA -gA -gA -gA -ju -gs -gs -ld -lQ -gl -mW -nx -oa -ld -pm -pN -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -zq -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ag -aj -ao -bY -as -at -aS -aS -aP -aV -ba -bg -bn -aC -bD -bL -bL -ch -cs -aI -aS -da -aS -aS -dT -el -eA -eB -el -fq -fE -fU -ae -fK -gr -gr -gr -fK -gr -gr -gr -gg -gg -jR -gs -ld -gA -mp -fN -ny -ob -ld -gs -pO -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ag -al -al -ar -as -at -aS -aF -aP -aW -bb -bg -bo -aC -bE -bM -bT -bM -aS -aS -aS -da -aS -aS -dT -el -eB -eO -el -fq -fE -fV -ae -zq -zq -zq -zq -Dq -zq -zq -zq -XQ -gg -gg -ko -le -lR -mq -fN -nz -oc -oG -pn -pP -gr -zq -zq -XQ -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ag -al -ap -fu -ag -ae -aG -aF -aP -aX -bc -bg -bm -aC -bF -aF -bP -cg -aC -aC -aC -aC -dm -aS -dU -el -el -el -el -fq -fE -aF -aP -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -fK -gs -lf -fO -fO -fO -fO -od -oH -fO -fN -fK -gg -gg -zq -zq -zq -zq -XQ -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -af -ag -ag -ag -af -an -aH -aS -aQ -aY -aY -bh -bp -bp -bG -bN -bP -cj -cr -aZ -cK -aC -dn -dz -dV -em -eC -eC -aY -fr -fG -fW -aP -zq -zq -zq -XQ -zq -zq -XQ -zq -zq -zq -gr -gA -gs -fN -mr -mX -pS -oe -oI -po -pQ -qs -qY -gg -zq -zq -zq -zq -zq -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ae -ae -an -ae -ae -ae -ae -aI -aS -aR -aS -aS -aS -aS -bx -bH -aS -bQ -ck -aC -cA -cI -db -bM -dA -dW -en -en -en -en -en -fH -fX -aP -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -gr -gs -gs -fO -ms -mY -nB -of -oJ -fO -pR -qt -mt -gg -zq -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aJ -aM -aC -aP -aP -aP -aP -aC -aC -aD -bU -cl -co -cB -cL -aC -do -dB -dX -dB -dB -eP -fb -fs -fI -fY -an -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -gg -gs -lg -fO -mt -km -fO -og -oK -pp -pS -fO -fO -gg -ad -zq -zq -zq -zq -ad -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aC -aD -aD -aC -ad -ad -ad -ad -ad -ad -ad -bP -cm -aC -aC -aC -aC -aC -aP -dY -eo -aP -dL -fc -ae -ae -an -an -zq -zq -zq -XQ -gg -gr -gr -gr -fK -gg -gg -kp -kp -fN -fN -fO -fN -oh -oL -fN -WQ -qu -mu -fO -ad -zq -zq -zq -zq -XQ -zq -zq -zq -zq -zq -zq -zq -zq -XQ -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bP -cn -ct -BS -ct -dc -aD -bd -dZ -aS -aP -Ed -hZ -ae -ad -ad -XQ -zq -zq -zq -gg -gg -hI -il -iF -jb -jv -jS -hK -hK -fN -mu -HM -pS -oi -oI -pq -pU -qv -qZ -fN -ad -ad -XQ -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -XQ -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bV -co -cp -cp -cM -cm -aD -dC -ea -aS -aS -eR -fe -ae -zq -zq -zq -zq -zq -RA -gg -hi -hJ -im -hJ -hK -jw -jT -hK -iH -fO -mv -mY -nC -of -oM -fO -fN -fO -fO -fO -fO -fK -gg -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -cN -dd -dp -dD -bM -ep -aS -aS -ff -aP -zq -zq -zq -zq -zq -zq -gr -hj -hK -hK -hK -iH -hK -hJ -hK -hK -fO -ev -nb -fO -oj -oN -fO -pV -fO -ra -fN -sA -ts -gg -gg -zq -zq -vI -vI -vI -vI -vJ -vI -vI -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -cN -de -aC -dE -eb -eb -eb -eb -ff -aP -zq -zq -XQ -zq -zq -zq -gr -hk -YK -in -in -YK -iH -jU -kq -lh -fO -fN -fN -fO -ok -oO -fN -pW -fO -rb -fN -sB -pX -tX -gg -zq -Qu -vJ -wb -rs -vK -wM -wb -vI -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -cN -de -Cr -dF -aF -aS -aS -eS -ff -aP -zq -zq -zq -zq -zq -zq -gr -hl -hM -hl -iG -hl -hl -hL -iH -li -lS -fN -nc -nD -ol -oP -pr -pX -qw -pX -rL -pX -pX -tY -gg -gr -vm -vJ -wc -wp -vL -wp -Oq -vJ -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -an -cN -de -Yn -dG -eb -eb -eb -eb -fe -aP -zq -zq -zq -zq -zq -zq -gr -hm -hN -hK -hK -hK -jx -hL -hK -li -lT -fO -nd -gA -om -oJ -fO -pY -qx -rc -fO -sC -sC -fN -fN -uQ -vn -vK -wd -wq -vL -wN -si -vJ -vJ -vJ -vJ -vI -vI -vJ -vI -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -WE -ae -cN -df -IK -dH -aS -aS -aS -aS -fg -an -NT -zq -zq -zq -XQ -zq -gg -hn -hO -hK -hK -hK -Mu -hK -kr -li -hJ -fO -ne -nE -on -oQ -fO -fN -fN -fO -fO -fN -fN -fN -uy -uR -vo -vL -we -wr -vL -wO -we -vK -xl -xq -xw -xE -xl -xl -vJ -zq -zq -zq -zq -zq -zq -zq -XF -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -WE -Lz -Lz -an -cN -de -Rb -dG -eb -eb -eb -eb -fh -an -an -zq -zq -zq -ad -ad -fK -ho -hO -io -iH -jc -jz -hK -ks -lj -lU -fN -nf -nF -oo -oR -ps -pZ -qy -rd -rM -rd -rd -qy -rd -uS -vp -vM -wf -ws -wC -wu -wX -vK -xm -xr -xx -xr -xM -xT -vI -vI -vI -vI -Zs -zq -zq -zq -KU -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -Lz -Lz -an -cO -df -FS -dI -aS -aS -aS -aS -fi -ft -fK -fK -gg -gg -gg -fK -fK -fO -hP -fN -iI -fO -fO -jV -ks -lk -fO -fO -fO -nG -op -fO -fO -fN -fO -fO -fN -fN -fO -fO -uz -fO -fN -vK -wg -wu -wD -wP -sj -vL -xn -xs -xy -xF -xN -xU -ww -xZ -yc -ww -UM -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -Lz -Lz -aP -cP -df -aC -dJ -eb -eb -eb -eb -fj -fu -fL -fZ -gh -gm -fN -gC -gO -hp -hQ -ip -iJ -jd -fO -jW -kt -ll -lV -mx -ng -nH -oq -oS -pt -ja -ja -re -rN -ng -tt -tZ -tZ -uT -vq -vN -wh -wu -wE -wu -wZ -xg -xo -xo -wu -xG -wh -xV -xX -ya -yd -yf -OF -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -WE -Lz -aP -cQ -dg -co -dK -ec -eq -eD -en -fk -Bh -Wo -fZ -fZ -fZ -gu -gD -gO -hq -hR -hr -iK -je -jA -jX -ku -lm -lW -my -my -nI -or -oT -my -my -my -rf -rO -sD -tu -ua -ua -ua -vr -vO -wi -wv -wF -wF -xa -xh -xp -wv -xz -xH -xP -xW -xY -yb -ye -ww -DJ -zq -zq -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -Lz -an -cR -cc -aC -dL -dB -dB -dB -eT -fl -fw -fN -ga -fZ -dM -fO -gE -gO -hr -hS -iq -gO -gO -jB -jY -fO -fK -gg -gg -gr -gr -gr -gg -gr -gr -gr -fK -rP -sE -gg -gr -gr -gr -fK -vI -vI -ww -ww -ww -vI -vI -vJ -ww -xA -xI -ww -vI -vI -vI -vI -vI -Zs -zq -zq -zq -zq -zq -ad -ad -ad -ad -zq -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -ad -ad -ad -ad -zq -zq -zq -zq -zq -XQ -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -Lz -an -cS -Gl -aC -zX -EP -TC -NQ -ZZ -aC -fx -fO -fO -gi -fO -fO -gF -gO -gO -hT -gO -gO -gD -jB -jZ -kv -ae -zq -zq -zq -zq -zq -Dq -zq -zq -zq -gr -rQ -sF -gr -zq -zq -zq -zq -zq -MC -zq -zq -zq -zq -ad -vJ -xu -xB -xJ -xQ -vI -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -WE -Lz -an -cT -cc -aC -aC -aC -aC -aC -aC -aC -fy -bq -bZ -bq -go -fN -gG -gP -hs -hU -ir -dO -jf -jC -ka -kw -an -zq -zq -zq -zq -zq -zq -zq -zq -zq -gr -rR -sG -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -vI -xu -xC -xK -xR -vJ -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -XQ -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -Lz -Lz -ae -cU -dh -cq -dN -BS -ct -eF -ct -ct -fz -gQ -gb -gj -gp -fO -fN -fN -fN -hV -fO -fN -fO -jC -kb -kx -an -zq -zq -zq -zq -zq -zq -zq -zq -zq -gr -rS -sF -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -vI -xv -xD -xL -xS -vI -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -cV -cp -co -co -cp -es -eG -cp -fm -fm -fm -gc -dh -gq -gb -gH -gQ -gb -hW -gH -iM -gb -jD -kc -an -an -zq -zq -zq -zq -zq -zq -zq -zq -RA -gg -rT -sH -gg -UG -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -vI -vI -vJ -vI -vJ -vI -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -et -eH -eV -an -zq -zq -gd -fm -fm -fm -dv -dv -fm -hX -fm -fm -fm -jE -an -ae -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -gr -rQ -sF -gr -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ae -aP -eI -aP -an -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -MW -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -Ga -gr -rU -sI -gr -Ga -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ah -ah -ah -MW -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -Fx -rg -rV -sJ -rg -Cv -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -zq -zq -zq -zq -zq -Fy -MA -Cv -fK -rW -sK -fK -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -Ai -ni -ni -ln -rX -sL -ln -ni -ni -qb -qb -ni -ni -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -Ai -ni -qC -rh -rY -sM -tv -uc -uA -uU -vs -vP -ni -ln -qb -qb -qb -ln -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -zq -zq -zq -zq -zq -Ai -qb -qD -ri -rZ -sM -tw -ud -uB -uV -rj -vQ -uE -OO -GI -BK -DU -Ot -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -Ai -qb -qD -rj -sa -sN -tx -ue -uC -uW -vt -vR -wk -Dm -Ae -Gp -yN -RX -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -Sh -ni -ln -rk -sb -sO -ty -ln -uD -sM -vu -vS -wl -Dz -KY -CH -Ic -BN -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -Ai -zq -ni -ni -Qm -XJ -ln -ln -uE -uX -vv -vT -Fd -Qo -Kt -yy -YV -ln -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -zq -zq -Ai -zq -ni -rl -sd -sQ -tz -uf -qb -sM -vw -vU -wn -uE -wK -uE -NK -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -Ai -zq -ni -rm -se -sR -tA -ug -uF -sR -vx -vV -uE -wB -wL -ln -ln -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -px -ad -ln -rn -sf -sS -tB -rr -qb -uY -vy -vW -ni -ln -ni -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -ad -ad -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ni -ni -ln -py -ln -ln -ro -sg -sT -sT -ln -ln -uZ -vz -vX -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ln -ln -ln -nJ -os -oU -pz -qb -qE -rp -sh -sU -tC -ui -ln -va -mL -vY -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -lX -mz -ln -nK -ot -oV -pA -qb -qF -mL -qH -sV -tD -uj -uG -vb -mL -vZ -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -lY -mA -nh -nK -ou -oW -pB -qc -qG -pj -rq -sW -tE -uk -uH -vc -vC -wa -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -lZ -lZ -ni -nK -ot -oV -pC -qb -mw -mZ -sk -sX -tF -ul -ln -ln -ln -ln -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ln -ln -ni -nL -ov -oY -pD -qb -qI -rt -sl -sY -tG -um -uI -vd -vD -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ln -ln -ln -ni -ln -qJ -ru -sm -sZ -tH -un -uJ -ve -vE -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -oZ -pE -qd -qK -rv -sn -rt -rj -uo -ni -ln -ln -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -pa -pF -qe -qL -rw -so -ta -rj -up -uI -vf -vF -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ln -ln -ln -qM -rx -so -tb -tI -uq -uJ -vg -vG -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -qN -qN -sp -tc -tJ -ur -ni -ln -ln -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -ad -ad -ad -zq -ad -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -ln -ln -sq -td -ln -ni -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -XQ -zq -zq -zq -ad -ad -ad -ad -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ln -sr -te -ln -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -XQ -zq -ad -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ni -ss -tf -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ni -ni -ln -ni -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -XQ -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -zq -XQ -zq -zq -zq -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -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/_basemap.dm b/_maps/_basemap.dm index 1f32260b685b..6f6ddc37d210 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -2,11 +2,10 @@ #ifndef LOWMEMORYMODE #ifdef ALL_MAPS - #include "map_files\Mining\Lavaland.dmm" #include "map_files\debug\runtimestation.dmm" #include "map_files\debug\multiz.dmm" #include "map_files\Atlas\atlas.dmm" - #include "map_files\MetaStation\MetaStation.dmm" + #include "map_files\Theseus\Theseus.dmm" #ifdef CIBUILDING #include "templates.dm" diff --git a/_maps/map_files/Mafia/mafia_lavaland.dmm b/_maps/map_files/Mafia/mafia_lavaland.dmm deleted file mode 100644 index f8e019149e9f..000000000000 --- a/_maps/map_files/Mafia/mafia_lavaland.dmm +++ /dev/null @@ -1,921 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/riveted, -/area/centcom/mafia) -"b" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/centcom/mafia) -"c" = ( -/turf/closed/wall/rust, -/area/centcom/mafia) -"d" = ( -/turf/open/floor/plating, -/area/centcom/mafia) -"f" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/centcom/mafia) -"g" = ( -/obj/mafia_game_board, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/centcom/mafia) -"h" = ( -/obj/structure/grille/indestructable, -/turf/open/floor/plating, -/area/centcom/mafia) -"j" = ( -/obj/machinery/door/airlock/external/ruin{ - max_integrity = 99999; - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/locked, -/turf/open/floor/plating, -/area/centcom/mafia) -"k" = ( -/obj/mafia_game_board, -/turf/open/floor/plating, -/area/centcom/mafia) -"l" = ( -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/grass/fakebasalt, -/area/centcom/mafia) -"m" = ( -/obj/effect/landmark/mafia, -/turf/open/floor/grass/fakebasalt, -/area/centcom/mafia) -"n" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/centcom/mafia) -"o" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 4 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"p" = ( -/obj/machinery/door/poddoor/preopen{ - desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; - id = "mafia"; - max_integrity = 99999; - name = "Station Night Shutters" - }, -/turf/closed/indestructible/fakeglass, -/area/centcom/mafia) -"q" = ( -/turf/open/floor/grass/fakebasalt, -/area/centcom/mafia) -"r" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"s" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"t" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"u" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"v" = ( -/obj/mafia_game_board, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/centcom/mafia) -"w" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/centcom/mafia) -"x" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/centcom/mafia) -"y" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"z" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"A" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"B" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"C" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"D" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"E" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"F" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"G" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"H" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"I" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"J" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"K" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 8 - }, -/obj/structure/closet{ - desc = "It's a storage unit. For mining stuff. Y'know."; - icon_state = "mining"; - name = "miner equipment locker" - }, -/obj/item/clothing/under/rank/cargo/miner/lavaland, -/turf/open/floor/iron, -/area/centcom/mafia) -"L" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"M" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"N" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"O" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"P" = ( -/obj/effect/turf_decal/trimline/brown/filled/end, -/turf/open/floor/iron, -/area/centcom/mafia) -"Q" = ( -/obj/effect/landmark/mafia, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"R" = ( -/obj/effect/baseturf_helper/asteroid, -/obj/effect/landmark/mafia/town_center, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"S" = ( -/obj/effect/turf_decal/trimline/brown/filled/end{ - dir = 8 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"T" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"U" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"V" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/centcom/mafia) -"W" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"X" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/centcom/mafia) -"Y" = ( -/turf/closed/indestructible/reinforced, -/area/centcom/mafia) - -(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 -"} -(2,1,1) = {" -a -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -a -"} -(3,1,1) = {" -a -Y -Y -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -Y -Y -a -"} -(4,1,1) = {" -a -Y -Y -c -g -h -d -d -d -d -d -b -d -d -d -d -d -h -k -c -Y -Y -a -"} -(5,1,1) = {" -a -Y -Y -c -h -d -d -b -Y -Y -j -Y -j -Y -Y -d -d -b -h -c -Y -Y -a -"} -(6,1,1) = {" -a -Y -Y -c -b -Y -Y -j -Y -l -q -Y -s -H -Y -j -Y -Y -d -c -Y -Y -a -"} -(7,1,1) = {" -a -Y -c -c -d -Y -r -M -p -m -q -p -w -A -p -q -l -Y -d -c -c -Y -a -"} -(8,1,1) = {" -a -Y -c -d -d -Y -L -N -Y -Y -q -Y -x -Y -Y -q -m -Y -d -d -c -Y -a -"} -(9,1,1) = {" -a -Y -c -d -Y -Y -p -O -P -p -q -p -y -p -q -q -p -Y -Y -d -c -Y -a -"} -(10,1,1) = {" -a -Y -c -d -Y -l -p -Y -p -p -p -p -p -p -p -Y -p -K -Y -d -c -Y -a -"} -(11,1,1) = {" -a -Y -c -d -j -m -q -q -q -p -q -u -q -p -B -C -C -J -j -b -c -Y -a -"} -(12,1,1) = {" -a -Y -c -b -Y -Y -p -Y -p -p -t -R -X -p -p -Y -p -Y -Y -d -c -Y -a -"} -(13,1,1) = {" -a -Y -c -d -j -n -C -C -P -p -q -W -q -p -q -q -q -m -j -d -c -Y -a -"} -(14,1,1) = {" -a -Y -c -d -Y -o -p -Y -p -p -p -p -p -p -p -Y -p -l -Y -b -c -Y -a -"} -(15,1,1) = {" -a -Y -c -d -Y -Y -p -q -q -p -S -p -q -p -B -D -p -Y -Y -d -c -Y -a -"} -(16,1,1) = {" -a -Y -c -f -d -Y -m -q -Y -Y -T -Y -q -Y -Y -E -G -Y -d -d -c -Y -a -"} -(17,1,1) = {" -a -Y -c -c -d -Y -l -q -p -Q -U -p -q -m -p -F -I -Y -d -c -c -Y -a -"} -(18,1,1) = {" -a -Y -Y -c -d -Y -Y -j -Y -z -V -Y -q -l -Y -j -Y -Y -d -c -Y -Y -a -"} -(19,1,1) = {" -a -Y -Y -c -h -b -d -d -Y -Y -j -Y -j -Y -Y -d -b -d -h -c -Y -Y -a -"} -(20,1,1) = {" -a -Y -Y -c -k -h -d -d -b -d -d -d -d -d -d -d -d -h -v -c -Y -Y -a -"} -(21,1,1) = {" -a -Y -Y -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -c -Y -Y -a -"} -(22,1,1) = {" -a -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -Y -a -"} -(23,1,1) = {" -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -a -"} diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm deleted file mode 100644 index 44ebf216a327..000000000000 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ /dev/null @@ -1,134409 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aaa" = ( -/turf/open/space/basic, -/area/space) -"aac" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space, -/area/space) -"aaf" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"aat" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"aau" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters_2"; - name = "Pharmacy shutters" - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/pharmacy) -"aav" = ( -/turf/open/space, -/area/space) -"aaw" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"aaC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - name = "justice injector" - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"aaU" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"aaZ" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"abc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"abo" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{ - icon_state = "filter_on-0_f"; - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"abq" = ( -/obj/structure/railing, -/obj/machinery/light/small/red/directional/west, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"abu" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two"; - space_dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/security/prison) -"abx" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aby" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"abC" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"abD" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"abR" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"abU" = ( -/obj/machinery/newscaster/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Courtroom - Gallery" - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"ace" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_y = 6 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Prison Sanitarium"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aci" = ( -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "1" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/security/prison) -"ack" = ( -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"acn" = ( -/obj/structure/table, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"acq" = ( -/obj/machinery/door/airlock{ - name = "Cleaning Closet" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"acu" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"acx" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/mask/muzzle, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"acE" = ( -/obj/structure/weightmachine/weightlifter, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"acI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"acL" = ( -/obj/item/folder/red, -/obj/item/pen, -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"acM" = ( -/obj/structure/bed/roller, -/obj/structure/bed/roller, -/obj/machinery/iv_drip, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"acR" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"acS" = ( -/obj/structure/closet/crate/necropolis{ - desc = "Presumably placed here by top men."; - name = "\improper Ark of the Covenant" - }, -/obj/item/toy/clockwork_watch{ - desc = "An ancient piece of machinery, made from an unknown metal by an unknown maker."; - name = "\improper Ancient Relic" - }, -/mob/living/simple_animal/pet/dog/corgi{ - desc = "Make sure you give him plenty of bellyrubs, or he'll melt your skin off."; - name = "\improper Keeper of the Ark" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"acZ" = ( -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"adb" = ( -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"adc" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/prison) -"add" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/iron, -/area/station/security/prison) -"ade" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"adh" = ( -/turf/open/floor/iron, -/area/station/security/prison) -"adq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"adr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"ads" = ( -/obj/structure/punching_bag, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"adt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"adw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"adx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/disposal/delivery_chute{ - dir = 4; - name = "Prisoner Transfer" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/plasticflaps/opaque{ - name = "Prisoner Transfer" - }, -/turf/open/floor/iron, -/area/station/security/prison) -"ady" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Prison Cell Block 2"; - network = list("ss13","prison") - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"adz" = ( -/obj/structure/sign/warning/securearea, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/bridge) -"adB" = ( -/obj/structure/cable, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) -"adC" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"adE" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"adO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"adQ" = ( -/obj/structure/table, -/obj/item/cultivator, -/obj/item/hatchet, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/paper/guides/jobs/hydroponics, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/spawner/random/entertainment/coin, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"adR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/prison) -"adW" = ( -/obj/structure/rack, -/obj/item/restraints/handcuffs, -/obj/item/assembly/flash/handheld, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"aej" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"ael" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"aeG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"aeO" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aeS" = ( -/obj/structure/bookcase/random, -/turf/open/floor/iron, -/area/station/security/prison) -"aeT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"afe" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"afh" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"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/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"afC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"afD" = ( -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) -"afG" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"afM" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/corner, -/area/station/security/prison) -"afQ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"afR" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "Security Blast Door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/security/brig) -"afU" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark/side, -/area/station/security/prison) -"agc" = ( -/obj/effect/turf_decal/bot, -/mob/living/simple_animal/bot/secbot/beepsky/armsky, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"agi" = ( -/obj/effect/spawner/random/structure/crate_empty, -/obj/item/clothing/gloves/color/fyellow, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"agj" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"agk" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"agD" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"agI" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/storage/primary) -"agJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Security E.V.A. Storage"; - req_access_txt = "3" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"agU" = ( -/obj/machinery/camera/emp_proof/directional/west{ - c_tag = "Engine Monitoring"; - network = list("ss13","engine") - }, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"aha" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = -32 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"ahc" = ( -/turf/open/floor/iron, -/area/station/security/range) -"ahd" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"ahe" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"ahs" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"ahw" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"ahy" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen #8"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ahF" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron, -/area/station/security/brig) -"ahI" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"ahK" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"ahP" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"aia" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"aif" = ( -/obj/machinery/door/poddoor/massdriver_trash, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aih" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "garbage"; - name = "disposal conveyor" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aii" = ( -/obj/structure/easel, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"ail" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/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/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"aim" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ain" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"aiv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Prison Laundry"; - network = list("ss13","prison") - }, -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"aiB" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"aiN" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/camera/directional/north{ - c_tag = "Bar - Starboard" - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"aiT" = ( -/obj/effect/landmark/start/atmospheric_technician, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"aiV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ajc" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Disposal Exit"; - name = "disposal exit vent" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aje" = ( -/turf/open/floor/plating, -/area/station/maintenance/fore) -"ajf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"ajk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ajl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"ajp" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Prison Common Room"; - network = list("ss13","prison") - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"ajr" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/structure/closet_private, -/obj/item/clothing/under/misc/assistantformal, -/turf/open/floor/wood, -/area/station/commons/dorms) -"aju" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"ajN" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"ajP" = ( -/obj/item/toy/beach_ball/holoball, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"aki" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"akn" = ( -/obj/machinery/power/supermatter, -/obj/structure/cable, -/obj/machinery/mass_driver{ - dir = 4; - id = "sm_core_eject"; - resistance_flags = 2 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"ako" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/port) -"akp" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/obj/item/clothing/glasses/meson/engine, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/engineering/main) -"akE" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"akT" = ( -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"ala" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"alb" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"alc" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"ale" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"alj" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"alx" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aly" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right"; - layer = 3 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"alA" = ( -/obj/machinery/mineral/stacking_machine{ - input_dir = 2 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"alB" = ( -/obj/machinery/mineral/stacking_unit_console{ - machinedir = 8; - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"alH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"alL" = ( -/turf/open/floor/iron/dark/side{ - dir = 1 - }, -/area/station/security/prison) -"alN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"alQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"alR" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "PermaLockdown"; - name = "Lockdown Shutters" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/door/airlock/security/glass{ - id_tag = "permaouter"; - name = "Permabrig Transfer"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/prison) -"alW" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"amv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white/corner{ - dir = 4 - }, -/area/station/medical/medbay/lobby) -"amN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"amP" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"amZ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/port) -"anj" = ( -/obj/structure/disposaloutlet{ - dir = 8; - name = "Prisoner Delivery" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"anw" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"anN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"anS" = ( -/turf/open/floor/plating/airless, -/area/space/nearstation) -"anU" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"anV" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"anW" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"anX" = ( -/obj/machinery/conveyor{ - dir = 4; - id = "garbage" - }, -/obj/machinery/recycler, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aoa" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aob" = ( -/turf/open/floor/plating, -/area/station/maintenance/port) -"aoe" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aof" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aog" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aol" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/fore) -"aom" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"aov" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"aox" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"aoG" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"aoO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"aoT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"aoX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"apc" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"apd" = ( -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"apj" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/port) -"apn" = ( -/obj/machinery/power/solar_control{ - id = "forestarboard"; - name = "Starboard Bow Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"app" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"apy" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"apC" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/item/tank/internals/oxygen, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"apD" = ( -/obj/machinery/door/airlock/security/glass{ - name = "N2O Storage"; - req_access_txt = "3" - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/fore) -"apE" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"apF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"apJ" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"apM" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"apX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/closet/radiation, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"aql" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"aqr" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"aqv" = ( -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/cargo/storage) -"aqz" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"aqC" = ( -/obj/machinery/space_heater, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqD" = ( -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqE" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqF" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqG" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqH" = ( -/obj/machinery/space_heater, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aqK" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aqO" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aqU" = ( -/obj/machinery/disposal/bin, -/obj/machinery/airalarm/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"aqV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"aqW" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Arrival Airlock" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"arf" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "hosspace"; - name = "Space Shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hos) -"ary" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"arz" = ( -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"arA" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"arK" = ( -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"arL" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"arP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"arS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"arV" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"arZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"asb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"asc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"asg" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"asn" = ( -/obj/structure/closet/crate, -/obj/item/food/breadslice/plain, -/obj/item/food/breadslice/plain, -/obj/item/food/breadslice/plain, -/obj/item/food/grown/potato, -/obj/item/food/grown/potato, -/obj/item/food/grown/onion, -/obj/item/food/grown/onion, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aso" = ( -/obj/structure/sink/kitchen{ - pixel_y = 28 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"asz" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/mineral/plasma{ - amount = 35 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"atd" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"atk" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"atp" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"atq" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"atr" = ( -/obj/machinery/door/poddoor/shutters{ - id = "supplybridge" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"att" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"atv" = ( -/obj/machinery/computer/prisoner/management{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"atw" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"atB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 - }, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"atL" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"atM" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"atQ" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"atR" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/machinery/requests_console/directional/west{ - announcementConsole = 1; - department = "Chief Medical Officer's Desk"; - departmentType = 5; - name = "Chief Medical Officer's Requests Console" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"atS" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"aua" = ( -/obj/structure/table/reinforced, -/obj/item/folder/red, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/obj/machinery/requests_console/directional/south{ - department = "Security"; - departmentType = 5; - name = "Security Requests Console" - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"aub" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"auo" = ( -/obj/structure/mopbucket, -/obj/item/mop, -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"auq" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"aus" = ( -/obj/structure/closet, -/obj/item/stock_parts/matter_bin, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"auA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"auB" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"auC" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/fore) -"auF" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/port) -"auG" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"auL" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"auR" = ( -/mob/living/simple_animal/hostile/retaliate/goose/vomit, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"auU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"auV" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron, -/area/station/security/brig) -"auZ" = ( -/obj/machinery/computer/shuttle/labor{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/station/security/brig) -"avk" = ( -/turf/open/floor/iron/dark, -/area/station/security/brig) -"avl" = ( -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_one_access_txt = "10;24" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"avB" = ( -/obj/effect/turf_decal/box, -/turf/open/floor/iron/textured, -/area/station/engineering/atmospherics_engine) -"avC" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/light/small/maintenance/directional/south, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"avG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"avH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"avJ" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"avP" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/plating, -/area/station/science/server) -"avZ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"awd" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"awf" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"awg" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"awh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"awi" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/mob/living/simple_animal/bot/secbot/beepsky/officer, -/turf/open/floor/iron, -/area/station/security/brig) -"awj" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"awl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"awo" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"awp" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"awq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"aws" = ( -/turf/open/floor/iron, -/area/station/security/brig) -"awv" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"awD" = ( -/obj/machinery/modular_computer/console/preset/cargochat/science{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"awI" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"awK" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/research) -"awP" = ( -/obj/item/clothing/gloves/color/rainbow, -/obj/item/clothing/shoes/sneakers/rainbow, -/obj/item/clothing/under/color/rainbow, -/obj/item/clothing/head/soft/rainbow, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"awU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/mmi, -/obj/item/mmi, -/obj/item/mmi, -/obj/structure/table, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"awV" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"axb" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/engineering_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"axf" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"axh" = ( -/obj/machinery/computer/prisoner/management{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"axj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"axm" = ( -/obj/machinery/button/flasher{ - id = "secentranceflasher"; - name = "Brig Entrance Flasher"; - pixel_x = -6; - pixel_y = -38; - req_access_txt = "1" - }, -/obj/machinery/button/flasher{ - id = "holdingflash"; - name = "Holding Cell Flasher"; - pixel_x = 6; - pixel_y = -38; - req_access_txt = "1" - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/security/brig) -"axo" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"axr" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/brig) -"axu" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/iron, -/area/station/security/brig) -"axz" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"axB" = ( -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"axI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"axK" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/button/door/directional/west{ - id = "Cabin4"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"axQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/wood, -/area/station/commons/lounge) -"axZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"ayD" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/decoration/ornament, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"ayK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"ayR" = ( -/obj/item/wrench, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"azg" = ( -/obj/item/stack/cable_coil, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"azm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"azv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"azw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"azB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"azK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"azT" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"azU" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = 30 - }, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/restraints/handcuffs, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"azW" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"azX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"azY" = ( -/obj/structure/railing, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"aAf" = ( -/obj/structure/cable, -/obj/machinery/power/tracker, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) -"aAp" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/aisat_interior) -"aAA" = ( -/obj/docking_port/stationary{ - dir = 8; - 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) -"aAQ" = ( -/obj/structure/rack, -/obj/item/clothing/mask/animal/horsehead, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/plating, -/area/station/maintenance/port) -"aAR" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/item/book/manual/wiki/robotics_cyborgs, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/electrical, -/obj/item/multitool, -/obj/item/clothing/head/welding, -/obj/item/clothing/glasses/welding, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"aAV" = ( -/obj/machinery/door/airlock/external{ - name = "Labor Camp Shuttle Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"aAY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 1"; - name = "Cell 1 Locker" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"aBa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 3"; - name = "Cell 3 Locker" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"aBb" = ( -/obj/effect/landmark/start/warden, -/obj/structure/chair/office, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron, -/area/station/security/warden) -"aBd" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"aBe" = ( -/obj/machinery/holopad, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron, -/area/station/security/brig) -"aBg" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"aBk" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/storage/tech) -"aBn" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/hand_labeler, -/obj/item/camera/detective, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"aBo" = ( -/obj/effect/landmark/start/detective, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"aBw" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/reagent_containers/glass/bottle/chloralhydrate, -/obj/item/reagent_containers/glass/bottle/toxin{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_x = 5; - pixel_y = 1 - }, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/glass/bottle/facid{ - name = "fluorosulfuric acid bottle"; - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/reagent_containers/syringe{ - pixel_y = 5 - }, -/obj/item/reagent_containers/dropper, -/obj/machinery/airalarm/directional/west, -/obj/machinery/button/ignition{ - id = "executionburn"; - name = "Justice Ignition Switch"; - pixel_x = -25; - pixel_y = 36 - }, -/obj/item/assembly/signaler{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/machinery/button/flasher{ - id = "justiceflash"; - name = "Justice Flash Control"; - pixel_x = -36; - pixel_y = 36; - req_access_txt = "1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/button/door/directional/west{ - id = "executionfireblast"; - name = "Justice Area Lockdown"; - pixel_y = 24; - req_access_txt = "2" - }, -/obj/machinery/button/door/directional/west{ - id = "SecJusticeChamber"; - name = "Justice Vent Control"; - pixel_x = -36; - pixel_y = 24; - req_access_txt = "3" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"aBz" = ( -/obj/machinery/button/door/directional/west{ - id = "hop"; - name = "Privacy Shutters Control"; - req_access_txt = "57" - }, -/obj/effect/mapping_helpers/ianbirthday, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"aBA" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"aBF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"aBG" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Departure Lounge - Starboard Fore" - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-14" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"aBN" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"aBS" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/item/paper_bin{ - pixel_x = -11; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = -11; - pixel_y = 7 - }, -/obj/item/hand_labeler{ - pixel_x = -10; - pixel_y = -6 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - dir = 8; - name = "Prison Monitor"; - network = list("prison"); - pixel_x = 30 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"aBT" = ( -/obj/structure/plasticflaps/opaque{ - name = "Service Deliveries" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Service" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"aCl" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/fluorine{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/iodine{ - pixel_x = 1 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/medbay/central) -"aCo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"aCt" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aCv" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/book/manual/wiki/security_space_law, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"aCw" = ( -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"aCM" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/rods/fifty, -/obj/item/storage/toolbox/emergency, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"aCR" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"aDa" = ( -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) -"aDl" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/storage/mech) -"aDo" = ( -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"aDw" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aDB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aDC" = ( -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aDD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aDE" = ( -/turf/open/floor/iron, -/area/station/security/warden) -"aDJ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aDN" = ( -/obj/machinery/vending/wardrobe/det_wardrobe, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aDW" = ( -/obj/machinery/computer/security/mining{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"aDY" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Hot Return Secondary Cooling" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"aEf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"aEk" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"aEJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"aEK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aEN" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/drinkingglass, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aET" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=1-BrigCells"; - location = "0-SecurityDesk" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aEZ" = ( -/obj/machinery/door/window{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aFa" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aFe" = ( -/obj/machinery/chem_master/condimaster{ - name = "CondiMaster Neo" - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"aFp" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Control Room"; - req_access_txt = "10"; - req_one_access_txt = "0" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"aFw" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"aFA" = ( -/obj/structure/rack, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_y = 4 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 5; - pixel_y = 2 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Security - Office - Starboard" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/security/office) -"aFB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/west{ - c_tag = "Science Hallway - Central"; - network = list("ss13","rd") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"aFC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Gateway Atrium"; - req_access_txt = "62" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"aFJ" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"aFR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"aFS" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"aFU" = ( -/obj/structure/closet/firecloset, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"aFV" = ( -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"aFZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aGd" = ( -/obj/structure/closet, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"aGh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"aGk" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"aGu" = ( -/obj/structure/filingcabinet, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"aGw" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/item/folder/red, -/obj/item/folder/red, -/obj/item/clothing/glasses/sunglasses/big, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"aGx" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"aGF" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"aGQ" = ( -/obj/machinery/holopad/secure, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"aHk" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L10" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aHo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"aHp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/bed, -/obj/item/bedsheet, -/obj/machinery/flasher/directional/west{ - id = "Cell 1" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"aHq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/west{ - c_tag = "Aft Primary Hallway - Middle" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"aHt" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aHA" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aHE" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron, -/area/station/security/brig) -"aHF" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aHJ" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"aHN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"aHT" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Auxiliary Bathrooms" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"aHX" = ( -/obj/structure/bed/roller, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/medical) -"aIE" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aIJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aIM" = ( -/obj/structure/chair{ - name = "Bailiff" - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"aIQ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/construction/storage_wing) -"aIR" = ( -/turf/open/floor/iron, -/area/station/security/courtroom) -"aIS" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aIT" = ( -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aJp" = ( -/obj/structure/table/glass, -/obj/structure/cable, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white, -/obj/item/pen/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"aJr" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"aJU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"aKf" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/light/small/directional/east, -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree, -/obj/item/canvas/twentythree_twentythree, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"aKu" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Engineering" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/starboard/fore) -"aKJ" = ( -/obj/machinery/door/poddoor{ - id = "Secure Storage"; - name = "Secure Storage" - }, -/turf/open/floor/plating, -/area/station/engineering/main) -"aKX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/lounge) -"aLo" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "forestarboard"; - name = "Fore-Starboard Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/starboard/aft) -"aLq" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8; - initialize_directions = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"aLB" = ( -/obj/effect/landmark/start/lawyer, -/turf/open/floor/iron, -/area/station/security/courtroom) -"aLI" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/curved{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"aLZ" = ( -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"aMl" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - sortType = 14 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"aMq" = ( -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"aMr" = ( -/obj/structure/window/reinforced, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"aMt" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"aMA" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aMQ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Law Office"; - req_access_txt = "38" - }, -/turf/open/floor/wood, -/area/station/security/courtroom) -"aNm" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"aNq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"aNw" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"aNC" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"aNJ" = ( -/obj/structure/cable, -/obj/machinery/computer/security/telescreen/interrogation{ - name = "isolation room monitor"; - network = list("isolation"); - pixel_y = 31 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"aNL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"aNT" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aNV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"aOa" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"aOc" = ( -/obj/machinery/holopad/secure, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"aOf" = ( -/obj/structure/cable/layer1, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"aOo" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Brig - Hallway - Entrance" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"aOI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"aOV" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/space, -/area/space/nearstation) -"aOX" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/space, -/area/space/nearstation) -"aOY" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"aPa" = ( -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"aPf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"aPv" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"aPw" = ( -/obj/machinery/ai_slipper{ - uses = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"aPz" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=0-SecurityDesk"; - location = "16-Fore" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aPI" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"aPL" = ( -/obj/structure/rack, -/obj/item/flashlight, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_guide, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/airlock_painter, -/obj/item/crowbar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"aPQ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "lawyer_shutters"; - name = "law office shutters" - }, -/turf/open/floor/plating, -/area/station/service/lawoffice) -"aQg" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/courtroom) -"aQr" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"aQw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"aQD" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/paper, -/obj/machinery/door/window/left/directional/east{ - dir = 2; - name = "Hydroponics Window"; - req_one_access_txt = "30;35" - }, -/obj/effect/turf_decal/delivery, -/obj/item/pen, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hydro_service"; - name = "Service Shutter" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"aQF" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/button/door/directional/west{ - id = "Cabin5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"aQG" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aQH" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aQI" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/closet, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aQJ" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aQU" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"aRc" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/east{ - dir = 1; - name = "Kitchen Window"; - req_access_txt = "28" - }, -/obj/machinery/door/firedoor, -/obj/item/paper, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_service"; - name = "Service Shutter" - }, -/obj/item/pen, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"aRk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"aRB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"aRG" = ( -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aRV" = ( -/obj/machinery/porta_turret/ai{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"aRW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aRX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Courtroom" - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aSa" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/camera/directional/south{ - c_tag = "Security Post - Cargo" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"aSh" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aSk" = ( -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"aSp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aSD" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"aSG" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"aSI" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"aSP" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aTl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aTA" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/brig) -"aTC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"aTG" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Bridge - Starboard" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"aTJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"aTQ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"aTU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aUj" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/stack/package_wrap{ - pixel_y = 5 - }, -/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/trimline/brown/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aUk" = ( -/obj/effect/turf_decal/delivery, -/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 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aUm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aUn" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"aUs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"aUC" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Disposals Chute" - }, -/obj/machinery/disposal/delivery_chute{ - dir = 8; - name = "disposals chute"; - pixel_x = 5 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"aUD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"aUG" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aUH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"aUK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"aUW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"aVa" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"aVc" = ( -/obj/structure/table/wood/poker, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"aVe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"aVk" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"aVl" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"aVn" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"aVo" = ( -/obj/structure/table/wood, -/obj/machinery/firealarm/directional/south, -/obj/item/storage/photo_album/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/bar) -"aVr" = ( -/obj/machinery/porta_turret/ai{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"aVt" = ( -/obj/item/kirbyplants{ - icon_state = "plant-13" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aVu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aVw" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aVx" = ( -/obj/structure/chair, -/obj/machinery/camera/directional/north{ - c_tag = "Arrivals - Fore Arm - Far" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aVy" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/tcommsat/server) -"aVO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"aWd" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Central Primary Hallway - Fore" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aWf" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aWh" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aWl" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aWn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/oil/slippery, -/turf/open/floor/iron, -/area/station/science/mixing) -"aWp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ - icon_state = "manifold-3"; - dir = 8 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"aWu" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/science/mixing) -"aWz" = ( -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"aWK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"aWN" = ( -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"aWO" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"aWT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aWU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aWV" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aWW" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aXb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"aXq" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"aXR" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"aXU" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/north, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"aYi" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"aYj" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"aYm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aYA" = ( -/obj/structure/table/glass, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/blood_filter, -/obj/machinery/light/directional/south, -/obj/item/bonesetter, -/obj/machinery/button/door/directional/south{ - id = "main_surgery"; - name = "privacy shutters control" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"aYE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aYF" = ( -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"aYO" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"aYQ" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio4"; - layer = 3.3; - name = "Xenobio Pen 4 Blast Doors"; - pixel_y = 4; - req_access_txt = "55"; - sync_doors = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"aYT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"aZa" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZk" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L10" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZl" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L12" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZm" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L14" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZp" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=15-Court"; - location = "14.9-CrewQuarters-Central" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"aZO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south{ - pixel_x = 26 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"aZP" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdordnance"; - name = "Ordnance Lab Shutters" - }, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plating, -/area/station/science/mixing) -"aZZ" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"baa" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bab" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bac" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bap" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"baz" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"baA" = ( -/obj/structure/table, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"baG" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baI" = ( -/obj/structure/window/reinforced, -/obj/machinery/door/window/right/directional/east{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Fitness Ring" - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"baQ" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baS" = ( -/obj/machinery/holopad, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baV" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Fore - Courtroom" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"baW" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"bba" = ( -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/paicard, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"bbE" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/aft) -"bbL" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bbN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/trash/box, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/item/toy/plush/lizard_plushie/green{ - name = "Tends-the-Wounds" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"bbO" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Exterior - Starboard Aft"; - network = list("minisat") - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"bbS" = ( -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/engine_smes) -"bbT" = ( -/obj/structure/sign/poster/party_game, -/turf/closed/wall/prepainted/daedalus, -/area/space/nearstation) -"bca" = ( -/obj/machinery/door/poddoor{ - id = "QMLoaddoor2"; - name = "Supply Dock Loading Door" - }, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"bce" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"bcl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bct" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"bcA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bcO" = ( -/obj/structure/easel, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"bcQ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"bdm" = ( -/obj/structure/table, -/obj/item/hand_labeler{ - pixel_y = 11 - }, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/hand_labeler_refill{ - pixel_x = -8; - pixel_y = 3 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"bdn" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/xenobiology/hallway) -"bdz" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/station/solars/port/aft) -"bdE" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bdO" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bdP" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bef" = ( -/obj/machinery/newscaster/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"beh" = ( -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_y = 8 - }, -/obj/item/toy/figure/virologist{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ben" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"ber" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"beJ" = ( -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"beM" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"beP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"beX" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"bfA" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/iron, -/area/station/commons/dorms) -"bfD" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"bfM" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "forestarboard"; - name = "Fore-Starboard Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/port/aft) -"bfQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"bfS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"bfT" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"bgg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"bgn" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/space, -/area/space/nearstation) -"bgo" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/space, -/area/space/nearstation) -"bgp" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Central Aft" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"bgF" = ( -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "Robotics Desk"; - req_access_txt = "29" - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy2"; - name = "Robotics Shutters" - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"bgQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"bgR" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"bhc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/xenobiology) -"bhd" = ( -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/servingdish, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/security/prison) -"bhf" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bhh" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"bhm" = ( -/obj/machinery/computer/pandemic, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"bhq" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"bhx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"bhE" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"bhW" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bih" = ( -/obj/structure/chair/comfy{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron, -/area/station/science/research) -"bim" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/camera/directional/east{ - c_tag = "Science Ordnance Gas Storage 2"; - network = list("ss13","rd") - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"bio" = ( -/obj/machinery/camera/directional/south{ - c_tag = "AI Chamber - Aft"; - network = list("aicore") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"biv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"biy" = ( -/obj/machinery/door/airlock/security{ - name = "Customs Desk"; - req_access_txt = "1" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"biC" = ( -/obj/structure/window/reinforced, -/obj/item/reagent_containers/food/drinks/mug/coco{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/mug/tea{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/drinks/coffee{ - pixel_x = -3 - }, -/obj/structure/table/reinforced{ - name = "Jim Norton's Quebecois Coffee table" - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"biF" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"biL" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"biQ" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/iv_drip, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"biX" = ( -/obj/item/clothing/mask/gas, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bja" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"bjb" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/west{ - dir = 4; - name = "Hydroponics Desk"; - req_one_access_txt = "30;35" - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"bjh" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"bji" = ( -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock"; - space_dir = 2 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"bjk" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/turf/open/space/basic, -/area/space/nearstation) -"bjl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/service/janitor) -"bjv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"bjw" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bjx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bjC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bjR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"bkg" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bkB" = ( -/obj/item/extinguisher, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bkD" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light/no_nightlight/directional/west, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bkP" = ( -/obj/item/retractor, -/obj/item/hemostat{ - pixel_x = -10 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/table, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"bkR" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.1-Engineering-Enter"; - location = "12-Central-Starboard" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bkV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"blh" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/displaycase/trophy, -/turf/open/floor/wood, -/area/station/service/library) -"bln" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"blu" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/dorms) -"blw" = ( -/obj/structure/transit_tube/curved{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"bly" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) -"blA" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/corner, -/area/station/medical/medbay/lobby) -"blF" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"blO" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/landmark/start/bartender, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/bar) -"blT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"blU" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"blV" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"blW" = ( -/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/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"blX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"blY" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=5-Customs"; - location = "4-Customs" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"blZ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bma" = ( -/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, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bmo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/grille, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"bmr" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bms" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bmt" = ( -/obj/item/radio/off, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bmu" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Bridge" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/central) -"bmy" = ( -/obj/item/kirbyplants/random, -/obj/structure/light_construct/small/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"bmE" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"bmU" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/main) -"bno" = ( -/obj/structure/transit_tube/diagonal, -/turf/open/space, -/area/space/nearstation) -"bnx" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"bny" = ( -/obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; - name = "Antechamber Turret Control"; - pixel_x = 30; - req_access_txt = "65" - }, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"bnB" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bnD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bnG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"bnJ" = ( -/obj/machinery/door/airlock{ - name = "Starboard Emergency Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"bnK" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"bnO" = ( -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bnW" = ( -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"bnX" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"bok" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chapel_shutters_parlour"; - name = "chapel shutters" - }, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"bot" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-left" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"boA" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"boB" = ( -/obj/structure/closet/secure_closet/research_director, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) -"boG" = ( -/obj/structure/closet/emcloset, -/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/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"boK" = ( -/obj/structure/table, -/obj/item/storage/box/evidence{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/item/hand_labeler{ - pixel_x = -8; - pixel_y = 10 - }, -/obj/item/storage/box/evidence{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/item/storage/box/evidence{ - pixel_x = 9; - pixel_y = 8 - }, -/obj/item/storage/box/prisoner{ - pixel_x = 9 - }, -/obj/machinery/recharger{ - pixel_x = -5; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"boM" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"boP" = ( -/obj/effect/spawner/random/structure/crate, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"boQ" = ( -/obj/structure/closet/boxinggloves, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"boS" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/blobstart, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/east{ - id = "AuxToilet3"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"boY" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"boZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"bpa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"bpc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"bpu" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"bpF" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/start/assistant, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/east{ - id = "AuxToilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"bpT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = 11; - pixel_y = -2 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"bpV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Quiet Room" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"bqf" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron, -/area/station/maintenance/port) -"bqg" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 3; - height = 5; - id = "commonmining_home"; - name = "SS13: Common Mining Dock"; - roundstart_template = /datum/map_template/shuttle/mining_common/meta; - width = 7 - }, -/turf/open/floor/plating, -/area/station/hallway/primary/port) -"bql" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bqn" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/door/airlock/atmos/glass{ - name = "Distribution Loop"; - req_access_txt = "24" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron/dark/corner{ - dir = 1 - }, -/area/station/engineering/atmos/pumproom) -"bqo" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bqw" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bqA" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bqE" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "AuxShower"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/spawner/random/trash/soap{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"bqO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/main) -"bqR" = ( -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"bqZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bra" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"brb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bro" = ( -/obj/structure/table, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/science/research) -"brt" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/storage/primary) -"brv" = ( -/obj/structure/closet/crate, -/obj/item/stock_parts/cell/high, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"brF" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"brK" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"brM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"brO" = ( -/obj/structure/transit_tube/diagonal/topleft, -/turf/open/space, -/area/space/nearstation) -"brY" = ( -/obj/machinery/camera/motion/directional/east{ - c_tag = "MiniSat Foyer"; - network = list("minisat") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"bsb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bsd" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"bsj" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"bsk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"bsm" = ( -/obj/item/beacon, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bsn" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/delivery, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bsq" = ( -/obj/item/storage/toolbox/emergency, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bst" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"bsD" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bsJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bsK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "commissarydoor"; - name = "Commissary Door Lock"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"bsL" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=7-Command-Starboard"; - location = "6-Port-Central" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bsN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"bsT" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - dir = 2; - name = "Atmospherics Desk"; - req_access_txt = "24" - }, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"bto" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"btK" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"btO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"btP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"btQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"btR" = ( -/obj/item/kirbyplants{ - icon_state = "plant-18" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"btS" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"buf" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"bug" = ( -/obj/structure/lattice, -/obj/item/tank/internals/oxygen/empty, -/turf/open/space/basic, -/area/space/nearstation) -"bul" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bun" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"buu" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar"; - req_access_txt = "25" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"buP" = ( -/obj/structure/table/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/telephone/engineering, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"buV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/office) -"bvp" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"bvw" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bvx" = ( -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"bvB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-20" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bvC" = ( -/obj/structure/chair, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bvD" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bvF" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bvI" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bvZ" = ( -/obj/item/cigbutt, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bwl" = ( -/obj/structure/sign/plaques/kiddie/library{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bwN" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"bwU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/medical/medbay/lobby) -"bxa" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"bxn" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bxq" = ( -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bxr" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bxs" = ( -/obj/machinery/computer/security/telescreen{ - dir = 8; - name = "Telecomms Camera Monitor"; - network = list("tcomms"); - pixel_x = 26 - }, -/obj/machinery/computer/telecomms/monitor{ - dir = 8; - network = "tcommsat" - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bxv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bxZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"byb" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"byi" = ( -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"byo" = ( -/obj/structure/closet, -/obj/item/clothing/gloves/color/fyellow, -/obj/effect/spawner/random/maintenance/two, -/obj/item/clothing/head/festive, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"byB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/drinkingglasses, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/effect/spawner/random/food_or_drink/cups, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"byH" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"byQ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/structure/sign/warning/electricshock, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"bzg" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port Mix to South Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bzo" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bzs" = ( -/obj/structure/chair/office, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bzt" = ( -/obj/machinery/computer/telecomms/server{ - dir = 8; - network = "tcommsat" - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bzC" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"bzL" = ( -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bzM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"bzT" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/medical/medbay/central) -"bzU" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bAc" = ( -/obj/machinery/door_timer{ - id = "Cell 1"; - name = "Cell 1"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"bAd" = ( -/obj/structure/closet/secure_closet/brig, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) -"bAj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bAk" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, -/obj/effect/turf_decal/delivery, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"bAm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/kirbyplants/random, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"bAr" = ( -/obj/effect/turf_decal/box, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/security_officer, -/turf/open/floor/iron/dark, -/area/station/security/range) -"bAu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"bAJ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"bAS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"bAT" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/turf/open/space, -/area/space/nearstation) -"bAU" = ( -/obj/machinery/microwave{ - pixel_y = 4 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bAY" = ( -/obj/structure/filingcabinet{ - pixel_x = 3 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bBb" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"bBc" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"bBg" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"bBh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bBs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Service - Port" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"bBv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"bBA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueue"; - name = "HoP Queue Shutters" - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bBC" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "hopqueue"; - name = "HoP Queue Shutters" - }, -/obj/effect/turf_decal/loading_area, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bBR" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=12-Central-Starboard"; - location = "11.1-Command-Starboard" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bCg" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/computer/security/telescreen/ordnance{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"bCv" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - icon_state = "right"; - name = "Containment Pen #7"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio7"; - name = "Xenobio Pen 7 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"bCF" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay"; - req_access_txt = "5" - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"bCI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bCJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bCL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bCR" = ( -/obj/machinery/holopad, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/engineering/main) -"bCS" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"bDi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - External Airlock" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"bDl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"bDt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"bDH" = ( -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Starboard Primary Hallway - Engineering" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/sign/directions/engineering{ - dir = 4; - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bDJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/storage) -"bDQ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_one_access_txt = "10;24" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"bEf" = ( -/obj/machinery/telecomms/processor/preset_one, -/obj/machinery/camera/directional/north{ - c_tag = "Telecomms - Server Room - Fore-Port"; - network = list("ss13","tcomms") - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bEg" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"bEh" = ( -/obj/machinery/telecomms/receiver/preset_left, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bEj" = ( -/obj/machinery/telecomms/receiver/preset_right, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bEk" = ( -/obj/machinery/telecomms/processor/preset_three, -/obj/machinery/camera/directional/north{ - c_tag = "Telecomms - Server Room - Fore-Starboard"; - network = list("ss13","tcomms") - }, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bEl" = ( -/obj/machinery/door/airlock/external{ - name = "Transport Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"bEm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"bEo" = ( -/obj/machinery/door/airlock{ - name = "Port Emergency Storage" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bEt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bEv" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"bEB" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=11.1-Command-Starboard"; - location = "11-Command-Port" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bEC" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bED" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Command Hallway" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bEE" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"bEF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/side, -/area/station/medical/medbay/central) -"bEG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bEH" = ( -/obj/effect/landmark/start/mime, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/theater) -"bEN" = ( -/obj/effect/turf_decal/bot/right, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"bEZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/modular_computer/console/preset/cargochat/service{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"bFa" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"bFu" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/toilet/auxiliary) -"bFD" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/start/depsec/engineering, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"bFH" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bFQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"bFT" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/smartfridge/extract/preloaded, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"bFV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Council Chamber"; - req_access_txt = "19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"bFY" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdgene"; - name = "Genetics Lab Shutters" - }, -/turf/open/floor/plating, -/area/station/science/genetics) -"bGc" = ( -/obj/machinery/telecomms/bus/preset_one, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bGd" = ( -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"bGe" = ( -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bGf" = ( -/obj/machinery/telecomms/bus/preset_three, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bGh" = ( -/obj/machinery/announcement_system, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bGo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) -"bGq" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Library Maintenance"; - req_one_access_txt = "12;37" - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bGr" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) -"bGw" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Central Primary Hallway - Port" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bGy" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bGE" = ( -/obj/structure/chair/stool/directional/east, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) -"bGG" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bGH" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bGI" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bGT" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;17" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bHj" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/service/library) -"bHq" = ( -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"bHz" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/structure/mirror/directional/west, -/obj/machinery/light/small/directional/south, -/obj/machinery/button/door/directional/south{ - id = "FitnessShower"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/fitness/recreation) -"bHA" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/mask/muzzle, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"bHH" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"bHN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"bHO" = ( -/obj/machinery/light/directional/south, -/obj/machinery/doppler_array{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"bHT" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Dormitories - Fore" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"bHV" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/firealarm/directional/north, -/obj/structure/tank_holder/extinguisher, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Cryogenics"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"bHW" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bHX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bIk" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bIq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bIL" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/item/restraints/handcuffs, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"bIR" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Crematorium Maintenance"; - req_one_access_txt = "27" - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"bIV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/air_sensor/incinerator_tank, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"bIW" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"bJg" = ( -/obj/machinery/telecomms/message_server/preset, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bJh" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"bJl" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"bJm" = ( -/obj/machinery/telecomms/bus/preset_two, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bJn" = ( -/obj/machinery/blackbox_recorder, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bJo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bJr" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bJt" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bJD" = ( -/obj/machinery/door/window{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Theater Stage" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"bJK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - icon_state = "manifold-3"; - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"bJO" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bJP" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bJU" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape"; - location = "8-Central-to-Aft" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bKb" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bKf" = ( -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"bKl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"bKA" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"bKL" = ( -/obj/machinery/telecomms/processor/preset_two, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bKM" = ( -/obj/machinery/ntnet_relay, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bKN" = ( -/obj/machinery/telecomms/bus/preset_four, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bKO" = ( -/obj/machinery/telecomms/hub/preset, -/turf/open/floor/circuit/green/telecomms/mainframe, -/area/station/tcommsat/server) -"bKP" = ( -/obj/machinery/telecomms/processor/preset_four, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bKS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-06" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bKU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bLe" = ( -/obj/machinery/vending/autodrobe/all_access, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bLu" = ( -/obj/structure/rack, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/scanning_module{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/assembly/prox_sensor{ - pixel_y = 2 - }, -/turf/open/floor/iron/white, -/area/station/maintenance/aft/lesser) -"bLv" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"bLy" = ( -/obj/machinery/computer/exoscanner_control{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Drone Launch Room"; - pixel_x = 14 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"bLF" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin5"; - name = "Cabin 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"bLN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"bLT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"bLX" = ( -/obj/machinery/button/ignition/incinerator/atmos, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"bMr" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"bMt" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/hydroponics/garden) -"bMu" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - Aft Arm - Far" - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bMB" = ( -/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/item/kirbyplants{ - icon_state = "plant-03" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"bML" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"bMV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"bMZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"bNb" = ( -/turf/closed/wall/mineral/plastitanium, -/area/station/hallway/secondary/entry) -"bNv" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/machinery/newscaster/directional/north, -/obj/effect/spawner/random/bureaucracy/pen, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"bNy" = ( -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"bNJ" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"bNK" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bNS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) -"bNX" = ( -/obj/machinery/telecomms/server/presets/common, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bNY" = ( -/obj/machinery/telecomms/server/presets/engineering, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bOa" = ( -/obj/machinery/telecomms/server/presets/medical, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bOb" = ( -/obj/machinery/telecomms/server/presets/science, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bOc" = ( -/obj/machinery/telecomms/broadcaster/preset_left, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bOi" = ( -/obj/structure/table, -/obj/item/clothing/mask/cigarette/pipe, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bOn" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bOo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"bOt" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"bOF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/aft) -"bOG" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/prepainted/daedalus, -/area/space/nearstation) -"bOH" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) -"bOJ" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"bON" = ( -/obj/structure/sign/warning/securearea{ - pixel_x = -32 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/central) -"bOW" = ( -/obj/structure/lattice/catwalk, -/turf/open/floor/iron, -/area/space/nearstation) -"bPb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"bPh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"bPL" = ( -/obj/structure/rack, -/obj/item/storage/box, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bPN" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bQc" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/pod/old/mass_driver_controller/trash{ - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"bQe" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"bQh" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bQk" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/ported/border/borderfloor, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/monitoring) -"bQn" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"bQy" = ( -/obj/structure/table, -/obj/item/hand_tele, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"bQI" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"bQK" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"bQP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"bRg" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/skill_station, -/turf/open/floor/wood, -/area/station/service/library) -"bRs" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"bRu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/cargo/qm) -"bRx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bRz" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"bRI" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bRX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters"; - name = "Pharmacy shutters" - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/pharmacy) -"bSq" = ( -/obj/machinery/computer/exodrone_control_console{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"bSF" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"bSU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"bSY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/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/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"bTf" = ( -/obj/structure/table/glass, -/obj/structure/reagent_dispensers/wall/virusfood/directional/west, -/obj/machinery/requests_console/directional/south{ - department = "Virology"; - name = "Virology Requests Console"; - receive_ore_updates = 1 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen/red, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/item/stack/sheet/mineral/plasma, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"bTq" = ( -/obj/machinery/camera/motion/directional/south{ - c_tag = "AI Upload Chamber - Port"; - network = list("aiupload") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"bTt" = ( -/obj/item/storage/box, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bTA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"bTE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=11-Command-Port"; - location = "10.2-Aft-Port-Corner" - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTK" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bTL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"bTQ" = ( -/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/iron, -/area/station/hallway/primary/central) -"bTT" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"bUb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bUL" = ( -/obj/machinery/telecomms/server/presets/security, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"bUM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/lounge) -"bUU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bUV" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bUY" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"bVc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVf" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVg" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner"; - location = "10.1-Central-from-Aft" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L5" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVh" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L7" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVj" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVo" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=8-Central-to-Aft"; - location = "7.5-Starboard-Aft-Corner" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bVp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"bVF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/warehouse) -"bVR" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/treatment_center) -"bVT" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bVU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/janitor) -"bVX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"bWb" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"bWe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"bWk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"bWz" = ( -/obj/machinery/airalarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"bWK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"bWN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"bWS" = ( -/obj/structure/table/wood, -/obj/item/book/granter/action/spell/smoke/lesser{ - name = "mysterious old book of cloud-chasing" - }, -/obj/item/reagent_containers/food/drinks/bottle/holywater{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/nullrod{ - pixel_x = 4 - }, -/obj/item/organ/heart, -/obj/item/soulstone/anybody/chaplain, -/turf/open/floor/cult, -/area/station/service/chapel/office) -"bWZ" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine{ - pixel_y = 8 - }, -/obj/item/clothing/glasses/meson/engine{ - pixel_y = -8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"bXg" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"bXm" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/chem_pack{ - pixel_x = 10; - pixel_y = 10 - }, -/obj/item/storage/box/rxglasses{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/stack/medical/gauze{ - pixel_x = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/stack/medical/mesh, -/turf/open/floor/iron/white/side{ - dir = 10 - }, -/area/station/medical/treatment_center) -"bXx" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"bXC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bXE" = ( -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bXN" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bXQ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Port" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bXU" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"bXV" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bXZ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/fore) -"bYE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"bYK" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bYL" = ( -/turf/open/floor/iron/recharge_floor, -/area/station/maintenance/port/aft) -"bYM" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/maintenance/port/aft) -"bYR" = ( -/obj/structure/table, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Paramedic Dispatch"; - name = "medical camera"; - network = list("ss13","medical") - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"bYS" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/white/corner, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"bYZ" = ( -/obj/machinery/vending/security, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"bZg" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"bZp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"bZs" = ( -/obj/item/cultivator, -/obj/item/crowbar, -/obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"bZu" = ( -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "Kitchen" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/maintenance/starboard/greater) -"bZA" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"bZH" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Bow Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"bZP" = ( -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/maintenance/port/aft) -"bZQ" = ( -/turf/open/floor/circuit, -/area/station/maintenance/port/aft) -"bZV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"cac" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"cah" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/frame/computer{ - anchored = 1; - dir = 4 - }, -/turf/open/floor/circuit/green/off, -/area/station/science/research) -"cai" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"car" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"caG" = ( -/obj/machinery/computer/security/telescreen/ce{ - dir = 1; - pixel_y = -30 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/suit_storage_unit/ce, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"caH" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"caT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"caV" = ( -/obj/effect/turf_decal/siding/purple/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"caX" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"caY" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"cba" = ( -/obj/machinery/power/smes{ - capacity = 9e+006; - charge = 10000 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"cbk" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Restrooms" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"cbn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/obj/machinery/meter, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"cbs" = ( -/obj/structure/window/reinforced, -/obj/item/food/cakeslice/pound_cake_slice{ - pixel_x = 8; - pixel_y = -2 - }, -/obj/machinery/airalarm/directional/east, -/obj/structure/table/reinforced{ - name = "Jim Norton's Quebecois Coffee table" - }, -/obj/item/food/poppypretzel{ - pixel_x = -8; - pixel_y = -3 - }, -/obj/item/food/muffin/berry{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/food/hotcrossbun{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"cbw" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cbx" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cbI" = ( -/obj/machinery/computer/message_monitor{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"cbS" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"cca" = ( -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ccd" = ( -/turf/open/floor/iron/white, -/area/station/science/research) -"ccg" = ( -/obj/machinery/airalarm/directional/north, -/obj/structure/closet/secure_closet/personal, -/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/spawner/random/bureaucracy/briefcase, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"ccp" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ccr" = ( -/obj/machinery/vending/hydronutrients, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cct" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"ccH" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Chapel Office - Backroom" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"ccM" = ( -/obj/machinery/computer/security/mining, -/obj/machinery/keycard_auth/directional/north, -/obj/item/radio/intercom/directional/north{ - pixel_y = 34 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"cdf" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"cdh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cdl" = ( -/obj/structure/chair/office, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - departmentType = 3; - name = "Security Requests Console" - }, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"cdy" = ( -/obj/structure/cable, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cdI" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cdJ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/chamber) -"cdR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"cem" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/storage/art) -"cet" = ( -/obj/structure/rack, -/obj/item/book/manual/wiki/infections{ - pixel_y = 7 - }, -/obj/item/reagent_containers/syringe/antiviral, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"cex" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"ceB" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"ceC" = ( -/obj/machinery/telecomms/server/presets/command, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"ceP" = ( -/obj/structure/transit_tube/curved/flipped{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"cff" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"cfn" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/robotics/mechbay) -"cfu" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Fore Primary Hallway Aft" - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"cfE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"cfK" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/brig) -"cfN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/medical/office) -"cfY" = ( -/obj/machinery/smartfridge/chemistry/preloaded, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"cgg" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"cgk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/assembly/timer, -/obj/effect/spawner/random/maintenance, -/obj/item/storage/box/shipping, -/obj/item/storage/toolbox/mechanical, -/obj/item/radio/off{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/wrench, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"cgA" = ( -/obj/machinery/computer/security/labor{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"cgE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cgL" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"chn" = ( -/obj/machinery/telecomms/broadcaster/preset_right, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"cho" = ( -/obj/machinery/telecomms/server/presets/supply, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"chR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"cii" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"cim" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ciw" = ( -/obj/machinery/newscaster/directional/north, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"ciD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ciL" = ( -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cjn" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/service/bar) -"cjs" = ( -/obj/machinery/smartfridge/chemistry/virology/preloaded, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"cjD" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"cjI" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/table/wood, -/obj/item/folder{ - pixel_y = 2 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"cjN" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ckb" = ( -/obj/effect/spawner/random/structure/grille, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ckh" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"ckk" = ( -/obj/effect/turf_decal/loading_area/white{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ckA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"ckH" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"ckP" = ( -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"ckR" = ( -/obj/item/reagent_containers/glass/rag, -/obj/structure/table/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"clc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/lab) -"clm" = ( -/obj/item/kirbyplants, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cly" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Engine Airlock Internal"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sm-engine-airlock" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/monitoring) -"clF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"clG" = ( -/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/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/modular_computer/console/preset/engineering, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"clH" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"clM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"clT" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"cmt" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cmx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"cmB" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"cmJ" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"cmS" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/service/chapel) -"cmU" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/fax_machine, -/obj/structure/table, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"cmZ" = ( -/obj/item/clothing/suit/hazardvest, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"cnj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Locker Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/commons/locker) -"cnm" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/computer/security, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"cnB" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Main Hallway- CMO"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cnJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"cnS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"cnV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"cok" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"cos" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/structure/cable, -/obj/item/radio/off{ - pixel_x = -6; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"coA" = ( -/mob/living/simple_animal/bot/cleanbot/medbay, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"coC" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Hydroponics Maintenance"; - req_access_txt = "35" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"coO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"coS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/chapel) -"coT" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/table/glass, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/grenade/chem_grenade, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/screwdriver{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"cpb" = ( -/obj/structure/table, -/obj/item/storage/secure/briefcase{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron/dark, -/area/station/security/office) -"cpd" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"cpe" = ( -/turf/open/floor/iron/dark, -/area/station/security/office) -"cph" = ( -/obj/effect/turf_decal/tile/blue, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"cpi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"cpu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"cpA" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"cpC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Library" - }, -/turf/open/floor/wood, -/area/station/service/library) -"cpM" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #6"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"cpQ" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/food/drinks/shaker, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"cpZ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "CO2 to Pure" - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cqg" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"cqh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"cqi" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cqj" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cqB" = ( -/obj/structure/table/wood, -/obj/machinery/status_display/evac/directional/north, -/obj/item/book/manual/wiki/tcomms, -/obj/item/folder/blue, -/obj/item/pen, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"crh" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"crj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"crm" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"crq" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/telecomms/bus, -/obj/item/circuitboard/machine/telecomms/broadcaster, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"crx" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"crI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"crU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"crV" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"csf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"csl" = ( -/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/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"csv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"csA" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;6" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"csR" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"ctd" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"cte" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/engineering) -"ctm" = ( -/obj/effect/turf_decal/trimline/yellow/filled/corner, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cto" = ( -/obj/effect/landmark/start/paramedic, -/obj/effect/turf_decal/loading_area/white{ - color = "#52B4E9"; - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"ctB" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/head_of_personnel, -/obj/machinery/light_switch{ - pixel_x = 38; - pixel_y = -35 - }, -/obj/machinery/button/flasher{ - id = "hopflash"; - pixel_x = 38; - pixel_y = -25 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"ctF" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ctG" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ctJ" = ( -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"ctW" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/button/door/directional/north{ - id = "pharmacy_shutters"; - name = "pharmacy shutters control"; - pixel_x = 24; - req_access_txt = "5;69" - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"ctZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cua" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cue" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"cuh" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"cuj" = ( -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"cuz" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Starboard Primary Hallway - Tech Storage" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"cuN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"cuX" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/chief_medical_officer, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"cuY" = ( -/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/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"cvl" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/siding/white, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"cvp" = ( -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"cvr" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cvA" = ( -/obj/machinery/door/airlock{ - id_tag = "AuxToilet2"; - name = "Unit 2" - }, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"cvK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"cvM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/janitor) -"cwd" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/sign/departments/chemistry/pharmacy{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cwn" = ( -/obj/structure/window/reinforced, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/fire{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/fire{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"cwo" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"cwB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/station/command/gateway) -"cwJ" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"cxe" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"cxg" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/storage/box/syringes{ - pixel_y = 4 - }, -/obj/item/storage/box/syringes, -/obj/item/gun/syringe, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"cxl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/space, -/area/space/nearstation) -"cxr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"cxx" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"cxB" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9.1-Escape-1"; - location = "8.1-Aft-to-Escape" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cxI" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"cxQ" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cxW" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 9 - }, -/turf/open/floor/iron/checker, -/area/station/science/research) -"cyo" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cyq" = ( -/obj/machinery/cryopod{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"cyx" = ( -/obj/machinery/door/window{ - name = "Secure Art Exhibition"; - req_access_txt = "37" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/large/library{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library) -"cyR" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/item/chair, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"cyY" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ - name = "Unit 2 Head Pressure Pump" - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"czL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"czM" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/fitness/recreation) -"czU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"cAd" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) -"cAe" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"cAi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"cAn" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cAy" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"cAH" = ( -/obj/machinery/door/poddoor/shutters{ - id = "ordnanceaccess"; - name = "Ordnance Access" - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"cAN" = ( -/obj/structure/closet/secure_closet/cytology, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"cAW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cAX" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"cAZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"cBa" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Main Hallway- Surgical Junction"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cBe" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/security/prison) -"cBk" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) -"cBl" = ( -/obj/effect/spawner/random/structure/chair_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"cBo" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"cBv" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"cBC" = ( -/obj/structure/rack, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/iron/twenty, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"cBD" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Prison Central"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"cBN" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cBO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cBP" = ( -/obj/structure/chair, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cBS" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/food/drinks/bottle/vodka, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"cBZ" = ( -/obj/item/stack/ore/silver, -/obj/item/stack/ore/silver, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/rack, -/obj/item/shovel{ - pixel_x = -5 - }, -/obj/item/pickaxe{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"cCd" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/structure/plasticflaps/opaque, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/qm) -"cCj" = ( -/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/iron/dark, -/area/station/medical/morgue) -"cCk" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"cCl" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"cCy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"cCH" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cCI" = ( -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cCJ" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cCK" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/cable, -/turf/open/floor/grass, -/area/station/medical/virology) -"cCL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"cCM" = ( -/obj/structure/lattice/catwalk, -/obj/item/reagent_containers/food/drinks/bottle/rum{ - pixel_x = -7; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/clothing/mask/cigarette/rollie/cannabis{ - pixel_y = -3 - }, -/turf/open/space/basic, -/area/space/nearstation) -"cCN" = ( -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/machinery/airalarm/directional/west, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/crowbar, -/obj/item/wrench, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"cCO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cDe" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"cDh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"cDq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"cDv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cDw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cDz" = ( -/turf/closed/indestructible/riveted{ - desc = "A wall impregnated with Fixium, able to withstand massive explosions with ease"; - name = "hyper-reinforced wall" - }, -/area/station/science/test_area) -"cDD" = ( -/obj/structure/lattice/catwalk, -/obj/item/instrument/guitar, -/turf/open/space/basic, -/area/space/nearstation) -"cDJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"cDN" = ( -/obj/structure/chair/sofa/left, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/carpet, -/area/station/medical/psychology) -"cEa" = ( -/obj/effect/landmark/start/chief_engineer, -/obj/structure/chair/office/light{ - dir = 1; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"cEw" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "chapel_shutters_parlour"; - name = "chapel shutters control" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"cEz" = ( -/obj/structure/closet/wardrobe/grey, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cEB" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cEC" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cED" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cEE" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/showcase/machinery/cloning_pod{ - desc = "An old decommissioned scanner, permanently scuttled."; - icon_state = "scanner"; - name = "decommissioned cloning scanner" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"cEN" = ( -/turf/open/floor/carpet, -/area/station/medical/psychology) -"cEU" = ( -/obj/item/toy/figure/roboticist, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"cFb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cFc" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/maintenance, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cFj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"cFl" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cFu" = ( -/obj/structure/closet, -/obj/item/assembly/prox_sensor{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cFv" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cFx" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"cFy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/evac/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/research) -"cFI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"cFK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/item/skub{ - name = "medicinal skub" - }, -/obj/item/toy/cattoy, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"cFR" = ( -/obj/structure/chair/sofa/corp/left, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"cFV" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Morgue"; - network = list("ss13","medbay") - }, -/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/iron/dark, -/area/station/medical/morgue) -"cFW" = ( -/obj/structure/bodycontainer/morgue{ - 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/iron/dark, -/area/station/medical/morgue) -"cFY" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"cGq" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/effect/spawner/random/bureaucracy/folder{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"cGs" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/box, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"cGB" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/chair/office/light, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"cGF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"cGJ" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cGK" = ( -/obj/structure/chair/office/light, -/obj/structure/cable, -/obj/effect/landmark/start/psychologist, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cGL" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cGR" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/structure/table/glass, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"cHg" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/restraints/handcuffs, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/west{ - pixel_y = -4 - }, -/obj/machinery/button/door/directional/west{ - id = "rdrnd"; - name = "Research and Development Containment Control"; - pixel_y = 6; - req_access_txt = "63" - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"cHh" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/item/reagent_containers/food/drinks/britcup{ - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/science/research) -"cHj" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/holding_cell) -"cHo" = ( -/obj/effect/turf_decal/trimline/purple/corner, -/obj/item/radio/intercom/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"cHp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/commons/lounge) -"cHu" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Central West"; - network = list("ss13","rd","xeno") - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/button/door/directional/east{ - id = "XenoPens"; - name = "Xenobiology Shutters"; - req_access_txt = "55" - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"cHv" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/reinforced, -/obj/item/storage/box/lights/mixed, -/obj/item/cigbutt/cigarbutt, -/obj/item/candle{ - pixel_x = -5 - }, -/obj/item/storage/box/matches{ - pixel_x = 1; - pixel_y = -1 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"cHy" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cHz" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/machinery/camera/directional/south{ - c_tag = "Medbay Psychology Office"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cHF" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_y = 5 - }, -/obj/item/reagent_containers/dropper{ - pixel_y = -4 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 - }, -/area/station/medical/medbay/central) -"cHY" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"cIb" = ( -/obj/machinery/airalarm/directional/north, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cIh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cIl" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/library) -"cIF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cIG" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Aft Primary Hallway - Aft" - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cII" = ( -/obj/effect/turf_decal/box/white{ - color = "#9FED58" - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"cIJ" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - sortType = 16 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"cIY" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"cJe" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"cJt" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/phosphorus{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/potassium{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/sodium{ - pixel_x = 1 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 - }, -/area/station/medical/medbay/central) -"cJz" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/nitrogen_tank{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cJF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departure Lounge" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cJG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departure Lounge" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cJY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"cKc" = ( -/obj/machinery/door/airlock{ - name = "Theater Stage"; - req_one_access_txt = "12;46;70" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"cKh" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"cKH" = ( -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"cLm" = ( -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cLo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cLp" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cLq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cLr" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cLH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"cLJ" = ( -/obj/effect/turf_decal/box/corners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cLP" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"cLQ" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"cLT" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/noticeboard/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"cLV" = ( -/obj/structure/cable, -/obj/machinery/camera/emp_proof/directional/east{ - c_tag = "Engine Core"; - network = list("ss13","engine") - }, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"cMd" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/toolbox/mechanical, -/obj/machinery/camera/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"cMf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cMh" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"cMi" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9.2-Escape-2"; - location = "9.1-Escape-1" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cMr" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"cMy" = ( -/obj/machinery/power/solar_control{ - dir = 4; - id = "aftport"; - name = "Port Quarter Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"cMA" = ( -/obj/machinery/power/smes, -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"cMD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"cMF" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"cMJ" = ( -/obj/structure/girder, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cMK" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cMP" = ( -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"cMR" = ( -/obj/structure/table, -/obj/item/candle, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cMS" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cMT" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cMU" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/volume_pump{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cNg" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"cNj" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/cultivator, -/obj/item/clothing/head/chefhat, -/obj/machinery/camera/directional/west{ - c_tag = "Service - Starboard" - }, -/obj/item/storage/box/lights/mixed, -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"cNs" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"cNu" = ( -/obj/machinery/door/airlock/hatch{ - name = "Secure Pen"; - req_access_txt = "55" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, -/area/station/science/cytology) -"cNG" = ( -/obj/machinery/door/airlock/external{ - name = "Common Mining Dock" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/plating, -/area/station/hallway/primary/port) -"cNK" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Engineering Desk"; - req_one_access_txt = "24;32" - }, -/obj/item/folder/yellow, -/obj/item/pen, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cNN" = ( -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, -/area/station/hallway/secondary/exit/departure_lounge) -"cNR" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cNW" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"cNY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"cOb" = ( -/obj/machinery/light/floor/has_bulb, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cOc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/station/service/bar) -"cOd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/research) -"cOf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"cOH" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"cOT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cOW" = ( -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/obj/structure/flora/ausbushes/sunnybush, -/obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, -/area/station/hallway/secondary/exit/departure_lounge) -"cPa" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cPc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"cPm" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/directional/west, -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron, -/area/station/cargo/storage) -"cPo" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/item/food/pie/cream, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/service/kitchen) -"cPq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - sortType = 2 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"cPt" = ( -/obj/structure/tank_dispenser/oxygen{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"cPu" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"cPv" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/station/solars/starboard/aft) -"cPO" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"cPU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"cPX" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table, -/obj/item/storage/box/gloves{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/item/storage/box/masks{ - pixel_x = 4; - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"cQl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-right" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"cQu" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"cQB" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 8; - initialize_directions = 4; - name = "euthanization chamber freezer" - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"cQE" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"cQH" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"cQI" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "Cabin7"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"cQJ" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = -32 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQK" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQL" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQM" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQO" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQP" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQY" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"cQZ" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"cRm" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cRE" = ( -/obj/machinery/door/poddoor/preopen{ - id = "medsecprivacy"; - name = "privacy shutter" - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/right/directional/north{ - req_access_txt = "63" - }, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) -"cRI" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) -"cRR" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"cRS" = ( -/obj/structure/sign/warning/coldtemp, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"cSa" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cSb" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"cSn" = ( -/turf/open/floor/engine, -/area/station/science/xenobiology) -"cSy" = ( -/mob/living/simple_animal/slime, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"cSA" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"cSG" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/security/prison) -"cSI" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cST" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"cSW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"cTd" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"cTh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"cTk" = ( -/obj/machinery/camera/motion/directional/south{ - active_power_usage = 0; - c_tag = "Armory - External"; - network = list("security"); - use_power = 0 - }, -/turf/open/space/basic, -/area/space) -"cTo" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/aisat/exterior) -"cTA" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"cTB" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"cTM" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Main Hallway- South"; - network = list("ss13","medbay") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"cTN" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"cTU" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"cTV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/turf/open/space, -/area/space/nearstation) -"cTY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/secure_closet/brig{ - id = "Cell 2"; - name = "Cell 2 Locker" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"cUl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"cUs" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/item/toy/figure/geneticist, -/obj/item/radio/intercom/directional/west, -/obj/item/storage/pill_bottle/mutadone{ - pixel_x = -9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"cUI" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "MiniSat Exterior - Space Access"; - network = list("minisat") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"cUJ" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"cUZ" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 5; - height = 7; - id = "supply_home"; - name = "Cargo Bay"; - width = 12 - }, -/turf/open/space/basic, -/area/space) -"cVc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"cVh" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"cVr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/effect/turf_decal/siding/yellow, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"cVx" = ( -/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) -"cVP" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"cVU" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/medical/patient_stretcher, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"cWh" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"cWt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"cWF" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Research and Development Lab"; - req_one_access_txt = "7" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/lab) -"cWM" = ( -/obj/machinery/door/airlock/external{ - name = "Construction Zone" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) -"cWP" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"cXd" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"cXm" = ( -/obj/machinery/computer/department_orders/science{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"cXr" = ( -/obj/machinery/chem_mass_spec, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"cXH" = ( -/obj/machinery/firealarm/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"cXN" = ( -/obj/machinery/door/firedoor, -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/service/kitchen) -"cXS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) -"cXY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"cYp" = ( -/obj/machinery/door/window/right/directional/east{ - base_state = "left"; - icon_state = "left"; - name = "Danger: Conveyor Access"; - req_access_txt = "12" - }, -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"cYz" = ( -/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/iron/dark, -/area/station/medical/morgue) -"cYJ" = ( -/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) -"cYL" = ( -/obj/machinery/door/poddoor/shutters{ - id = "aux_base_shutters"; - name = "Auxiliary Base Shutters" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"cYP" = ( -/obj/machinery/suit_storage_unit/radsuit, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"cYR" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/camera/directional/north{ - c_tag = "Locker Room Starboard" - }, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/commons/locker) -"cYS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"cYU" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"cZb" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Library" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/library) -"cZc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"cZs" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/command/gateway) -"cZt" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals - Fore Arm" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"cZC" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/genetics) -"cZD" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"cZE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"cZP" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/science/research) -"dah" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"dak" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"daw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering/glass{ - name = "Power Monitoring"; - req_access_txt = "11" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/engine_smes) -"day" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"daJ" = ( -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"daO" = ( -/obj/structure/rack, -/obj/item/gun/ballistic/shotgun/riot, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 6 - }, -/obj/item/gun/ballistic/shotgun/riot{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"daV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"dbt" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"dby" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;37;25;28" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/port) -"dbG" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/science/mixing) -"dbP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"dcr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"dcJ" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"dcQ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"dcT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"ddc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"ddj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"ddr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"ddw" = ( -/obj/machinery/door/window/brigdoor{ - name = "Arrivals Security Checkpoint"; - pixel_y = -8; - req_access_txt = "1" - }, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"ddy" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"ddz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/research) -"ddD" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin2"; - name = "Cabin 4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"ddI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ddR" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"ddV" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner"; - location = "7-Command-Starboard" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ddZ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) -"dee" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/south, -/obj/machinery/biogenerator{ - pixel_x = 3 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"dep" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"deE" = ( -/obj/structure/closet/emcloset, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"deH" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Outer Window" - }, -/obj/machinery/door/window/brigdoor{ - dir = 8; - name = "Brig Control Desk"; - req_access_txt = "3" - }, -/obj/item/folder/red, -/obj/item/folder/red, -/obj/item/poster/random_official, -/obj/structure/cable, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) -"deL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"deQ" = ( -/obj/machinery/seed_extractor, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"deS" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/break_room) -"deZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/aft/lesser) -"dfh" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/main) -"dfl" = ( -/obj/machinery/computer/bank_machine, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"dfo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"dfr" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/command) -"dfu" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"dfF" = ( -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"dfX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dgf" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dgg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"dgm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"dgr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"dgu" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"dgy" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dgC" = ( -/obj/machinery/atmospherics/components/binary/pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"dgN" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dgP" = ( -/obj/item/storage/book/bible, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chapel - Fore" - }, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"dgQ" = ( -/obj/structure/table, -/obj/item/folder/blue{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/office) -"dgV" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"dgX" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"dhb" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel{ - amount = 10 - }, -/obj/item/stack/rods/fifty, -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"dhf" = ( -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"dhg" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"dhh" = ( -/obj/structure/closet/secure_closet/security/engine, -/obj/machinery/airalarm/directional/east, -/obj/machinery/requests_console/directional/south{ - department = "Security"; - departmentType = 5; - name = "Security Requests Console" - }, -/obj/machinery/firealarm/directional/south{ - pixel_x = 26 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"dhj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research) -"dhy" = ( -/obj/structure/chair, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"din" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"diu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"diY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"djf" = ( -/obj/machinery/requests_console/directional/north{ - department = "Chapel"; - departmentType = 1; - name = "Chapel Requests Console" - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"djs" = ( -/obj/item/stack/sheet/plasteel{ - amount = 10; - pixel_x = -2; - pixel_y = 2 - }, -/obj/structure/table, -/obj/item/stack/sheet/rglass{ - amount = 30; - pixel_x = 2; - pixel_y = -2 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/obj/item/clothing/gloves/color/yellow, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"dju" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"djw" = ( -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"djB" = ( -/obj/effect/landmark/observer_start, -/obj/effect/turf_decal/plaque{ - icon_state = "L8" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"djC" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"djH" = ( -/obj/effect/mapping_helpers/broken_floor, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"djM" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 15; - id = "arrivals_stationary"; - name = "arrivals"; - roundstart_template = /datum/map_template/shuttle/arrival/box; - width = 7 - }, -/turf/open/space/basic, -/area/space/nearstation) -"djS" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron, -/area/station/science/lab) -"djX" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"dkh" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/open/floor/plating, -/area/station/hallway/primary/central) -"dkn" = ( -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/engine/cult, -/area/station/service/library) -"dkp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/storage/box/beakers{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/item/storage/box/syringes{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/wrench, -/obj/item/knife/kitchen, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dkt" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.3-Engineering-Central"; - location = "13.2-Tcommstore" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"dkG" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"dkH" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27;37" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"dls" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"dlA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 3 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"dlE" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/item/plant_analyzer, -/obj/item/cultivator, -/obj/item/reagent_containers/glass/bucket, -/obj/structure/rack, -/obj/item/vending_refill/hydroseeds, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dlY" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"dma" = ( -/obj/effect/landmark/start/captain, -/obj/structure/chair/comfy/brown, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"dmf" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/science/central) -"dmu" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/pen, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/photo_album/prison, -/obj/item/camera, -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"dmB" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/chapel) -"dmI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dmL" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/deck, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"dmM" = ( -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/effect/turf_decal/box, -/obj/structure/window/reinforced, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"dmT" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/xenobiology) -"dmU" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"dmV" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/curved{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"dmW" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/cargo/storage) -"dnd" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dnn" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters/window{ - id = "gateshutter"; - name = "Gateway Access Shutter" - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"dnu" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dnz" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dnA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"dnL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"dnO" = ( -/obj/machinery/space_heater, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dnR" = ( -/obj/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dnS" = ( -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"doi" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"doo" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/iron, -/area/station/commons/dorms) -"dor" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"dou" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"doA" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"doJ" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"doK" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"doO" = ( -/obj/machinery/vending/hydronutrients, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"doQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/office) -"doZ" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/machinery/light/small/directional/west, -/obj/item/paper/fluff/gateway, -/obj/item/coin/plasma, -/obj/item/melee/chainofcommand, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"dpd" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dpe" = ( -/obj/effect/decal/cleanable/garbage, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"dpm" = ( -/obj/structure/chair/pew/left, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"dpp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Conveyor Access"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"dpw" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"dpx" = ( -/obj/structure/table/wood, -/obj/item/lipstick{ - pixel_y = 5 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Theater - Stage" - }, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) -"dpG" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/spawner/random/entertainment/dice, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"dpZ" = ( -/obj/structure/table, -/obj/item/stock_parts/micro_laser, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/micro_laser/high, -/obj/item/stock_parts/micro_laser/high, -/obj/item/stock_parts/micro_laser/high, -/obj/item/stock_parts/micro_laser/high, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"dqe" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dqg" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/white, -/area/station/security/medical) -"dqk" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/rd) -"dqu" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dqv" = ( -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"dqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"dqD" = ( -/obj/item/reagent_containers/glass/bucket, -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dqF" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dqU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"dqV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dsa" = ( -/obj/machinery/photocopier, -/turf/open/floor/iron/white, -/area/station/science/research) -"dst" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dsw" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit/departure_lounge) -"dsD" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dsH" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"dsM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/central) -"dsX" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"dsY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"dtd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"dtf" = ( -/obj/machinery/door/airlock/grunge{ - name = "Cell 4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"dto" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"dtt" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Fitness Room - Fore" - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"dtC" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"dtE" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dtG" = ( -/obj/machinery/light/directional/south, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -29 - }, -/obj/structure/bed/dogbed/renault, -/mob/living/simple_animal/pet/fox/renault, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"dtK" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"dtL" = ( -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"dtM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/stack/cable_coil, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"dtO" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"dtQ" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dtV" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"dtZ" = ( -/obj/item/stack/sheet/cardboard, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"dub" = ( -/obj/structure/bookcase/random/fiction, -/turf/open/floor/wood, -/area/station/service/library) -"duf" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/closet{ - anchored = 1; - can_be_unanchored = 1; - name = "Cold protection gear" - }, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/shoes/winterboots, -/obj/item/clothing/suit/hooded/wintercoat/science, -/obj/item/clothing/suit/hooded/wintercoat/science, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"dug" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"dun" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"duo" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dus" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/obj/effect/turf_decal/caution/stand_clear, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"duA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"duB" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Virology Access"; - req_one_access_txt = "5;39" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"duG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ - dir = 1 - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"duH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"duN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dvg" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"dvk" = ( -/obj/structure/table, -/obj/item/ai_module/reset, -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/flasher/directional/south{ - id = "AI" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"dvq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/cryo_cell, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"dvt" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"dvC" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"dvM" = ( -/obj/item/target/alien/anchored, -/obj/machinery/camera/preset/ordnance{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating/airless{ - luminosity = 2 - }, -/area/station/science/test_area) -"dwo" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"dwv" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dww" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dwD" = ( -/turf/open/floor/iron/stairs/left{ - dir = 8 - }, -/area/station/engineering/atmospherics_engine) -"dwJ" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/structure/grille, -/turf/open/space, -/area/space/nearstation) -"dwW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) -"dwZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"dxa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/office) -"dxo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"dxp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"dxt" = ( -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/cargo/storage) -"dxu" = ( -/obj/structure/table/wood, -/obj/machinery/button/ticket_machine{ - pixel_x = 32 - }, -/obj/item/paper_bin/carbon{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/stamp/hop{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/machinery/light_switch/directional/south{ - pixel_x = 6; - pixel_y = -34 - }, -/obj/machinery/button/door/directional/south{ - id = "hop"; - name = "Privacy Shutters Control"; - pixel_x = -6; - req_access_txt = "57" - }, -/obj/machinery/button/door/directional/south{ - id = "hopqueue"; - name = "Queue Shutters Control"; - pixel_x = -6; - pixel_y = -34; - req_access_txt = "57" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"dxA" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/server) -"dxD" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=2.1-Leaving-Storage"; - location = "1.5-Fore-Central" - }, -/obj/effect/turf_decal/plaque{ - icon_state = "L6" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"dxF" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dxP" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"dya" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"dyb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dyi" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"dyl" = ( -/obj/machinery/door/airlock/external{ - name = "Space Shack" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"dyq" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/fore) -"dyx" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/hop) -"dyE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"dyH" = ( -/obj/structure/bookcase/random/reference, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"dyK" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"dyX" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9.4-Escape-4"; - location = "9.3-Escape-3" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"dzb" = ( -/obj/item/clothing/mask/gas, -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dzc" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"dzB" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light_switch/directional/west{ - pixel_x = -38 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"dzU" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/command, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"dAc" = ( -/obj/machinery/air_sensor/ordnance_mixing_tank, -/turf/open/floor/engine/airless, -/area/station/science/mixing/chamber) -"dAp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"dAr" = ( -/obj/structure/rack, -/obj/item/gun/energy/e_gun/dragnet, -/obj/item/gun/energy/e_gun/dragnet, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"dAC" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"dAD" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"dAK" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/ported/border/borderfloor, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/monitoring) -"dAL" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"dBf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"dCg" = ( -/obj/machinery/component_printer, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"dCq" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/courtroom) -"dCr" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dCx" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"dCD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"dCE" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"dCH" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"dCK" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/prison/safe) -"dCM" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"dCV" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dDa" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"dDl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"dDr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"dDu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"dDv" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5; - pixel_x = -7; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/condiment/flour{ - pixel_x = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"dDw" = ( -/obj/structure/rack, -/obj/item/wrench/medical, -/obj/effect/turf_decal/siding/white, -/obj/item/food/popsicle/creamsicle_orange, -/obj/machinery/airalarm/kitchen_cold_room{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"dDU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"dEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dED" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"dEH" = ( -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/structure/table/wood, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_loot_count = 2; - spawn_random_offset = 1 - }, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"dER" = ( -/obj/machinery/requests_console/directional/west{ - department = "Detective"; - name = "Detective Requests Console" - }, -/obj/machinery/light/small/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/machinery/camera/directional/west{ - c_tag = "Detective's Office" - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"dFc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"dFg" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/red, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/neck/tie/red, -/obj/item/clothing/head/soft/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"dFh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"dFn" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"dFr" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law{ - pixel_y = 3 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"dFt" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"dFB" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"dFC" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"dFI" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"dFQ" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"dGK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/status_display/evac/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"dGP" = ( -/obj/structure/training_machine, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"dHb" = ( -/obj/structure/table/wood, -/obj/item/paper, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"dHf" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"dHr" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #4"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio4"; - name = "Xenobio Pen 4 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"dHy" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"dHA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"dHE" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"dHQ" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Containment Pen #8"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"dHW" = ( -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"dIg" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos/pumproom) -"dIj" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/research) -"dIq" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Testing Labs"; - req_one_access_txt = "7" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/lab) -"dIt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 5 - }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"dII" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Server Room" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) -"dIJ" = ( -/obj/machinery/light/directional/north, -/obj/item/storage/secure/briefcase, -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/storage/secure/briefcase, -/obj/item/assembly/flash/handheld, -/obj/machinery/computer/security/telescreen/vault{ - pixel_y = 30 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"dIN" = ( -/obj/machinery/door/airlock{ - id_tag = "AuxToilet1"; - name = "Unit 1" - }, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"dIW" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/storage) -"dJh" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/science/genetics) -"dJj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dJr" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/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/iron/dark, -/area/station/medical/morgue) -"dJx" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"dJN" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/space/nearstation) -"dJY" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"dKp" = ( -/obj/structure/closet/secure_closet/hydroponics, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"dKF" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"dKG" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"dKN" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/pen, -/obj/item/storage/box/prisoner, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Prison Hallway Port"; - network = list("ss13","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison) -"dKU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"dKV" = ( -/obj/effect/landmark/start/botanist, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"dKZ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/directional/west{ - c_tag = "Captain's Office - Emergency Escape" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/central) -"dLf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"dLj" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Hydroponics Desk"; - req_one_access_txt = "30;35" - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"dLk" = ( -/obj/machinery/door_buttons/access_button{ - idDoor = "xeno_airlock_interior"; - idSelf = "xeno_airlock_control"; - name = "Access Button"; - pixel_x = 29; - pixel_y = -8; - req_access_txt = "55" - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"dLn" = ( -/obj/structure/flora/ausbushes/fernybush, -/turf/open/floor/grass, -/area/station/medical/virology) -"dLC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"dLK" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"dLT" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"dLV" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"dMu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"dMw" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"dMM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/button/door/directional/east{ - id = "bridge blast"; - name = "Bridge Access Blast Door Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"dNk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"dNp" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/station/service/bar) -"dNL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"dNN" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/service/theater) -"dNU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"dOo" = ( -/obj/structure/safe, -/obj/item/storage/secure/briefcase{ - contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/ballistic/automatic/pistol,/obj/item/suppressor,/obj/item/melee/baton/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen) - }, -/obj/item/storage/backpack/duffelbag/syndie/hitman, -/obj/item/card/id/advanced/silver/reaper, -/obj/item/lazarus_injector, -/obj/item/gun/energy/disabler, -/obj/item/gun/ballistic/revolver/russian, -/obj/item/ammo_box/a357, -/obj/item/clothing/neck/stethoscope, -/obj/item/book{ - desc = "An undeniably handy book."; - icon_state = "bookknock"; - name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" - }, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"dOu" = ( -/obj/structure/closet/wardrobe/miner, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"dOx" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"dOy" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/port/aft) -"dOA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"dPa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"dPf" = ( -/obj/machinery/atmospherics/components/binary/circulator{ - dir = 1 - }, -/obj/structure/cable/layer1, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"dPk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/library) -"dPs" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/lesser) -"dPt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"dPu" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/item/storage/box/beakers, -/obj/item/storage/box/pillbottles, -/obj/item/storage/box/syringes, -/obj/item/storage/fancy/candle_box, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"dPw" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) -"dPO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"dPS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"dPV" = ( -/obj/machinery/porta_turret/ai, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"dQj" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/execution/education) -"dQk" = ( -/obj/structure/table, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/entertainment/dice, -/turf/open/floor/iron, -/area/station/commons/dorms) -"dQo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"dQI" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/carbon/human/species/monkey/punpun, -/turf/open/floor/iron, -/area/station/service/bar) -"dRa" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/cable, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = -2 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"dRK" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"dRU" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"dRV" = ( -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/research{ - autoclose = 0; - frequency = 1449; - id_tag = "xeno_airlock_interior"; - name = "Xenobiology Lab Internal Airlock"; - req_access_txt = "55" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"dSi" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Command Hallway - Starboard" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"dSl" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #7"; - dir = 5; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"dSo" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) -"dSC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/item/crowbar, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"dSH" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"dSI" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"dSM" = ( -/obj/structure/chair/office, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"dSQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"dSW" = ( -/obj/structure/table, -/obj/item/storage/dice, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"dSY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dTc" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet4"; - name = "Unit 4" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"dTm" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"dTq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Antechamber"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"dTr" = ( -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"dTu" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"dTL" = ( -/obj/structure/table, -/obj/item/paicard, -/turf/open/floor/iron, -/area/station/commons/locker) -"dTY" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/engineering/main) -"dUd" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/station/solars/starboard/fore) -"dUg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/warden) -"dUw" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"dUA" = ( -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"dUC" = ( -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"dUE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"dUW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "space-bridge access" - }, -/obj/machinery/button/door/directional/north{ - id = "supplybridge"; - name = "Shuttle Bay Space Bridge Control" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"dVf" = ( -/obj/effect/turf_decal/arrows/white{ - color = "#0000FF"; - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dVu" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Surgery C"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"dVE" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Bridge - Port" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"dVL" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"dVV" = ( -/obj/structure/cable/layer1, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"dVY" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"dWd" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/range) -"dWf" = ( -/obj/structure/sign/plaques/kiddie{ - pixel_y = 32 - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Upload Chamber - Fore"; - network = list("aiupload") - }, -/obj/structure/table/wood/fancy/green, -/obj/effect/spawner/random/aimodule/harmless, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"dWl" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/library) -"dWn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"dWo" = ( -/obj/structure/table/wood, -/obj/machinery/light_switch/directional/west, -/obj/effect/spawner/random/bureaucracy/folder{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"dWs" = ( -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"dWO" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/science/research) -"dWU" = ( -/obj/machinery/power/port_gen/pacman, -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"dXn" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/office) -"dXK" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-maint-passthrough" - }, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Entrance"; - req_access_txt = "47" - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"dXY" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 8; - name = "Surgical Supplies"; - req_access_txt = "45" - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/stack/sticky_tape/surgical, -/obj/item/stack/medical/bone_gel, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"dYb" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"dYn" = ( -/obj/item/paper_bin/carbon, -/obj/item/pen/fountain, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/security/office) -"dYt" = ( -/obj/effect/landmark/start/captain, -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"dYv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"dYy" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"dYL" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"dYM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"dYW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"dZo" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"dZq" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/pdapainter/security, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"dZs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"dZL" = ( -/obj/structure/sign/poster/official/cleanliness{ - pixel_x = 32 - }, -/obj/machinery/door/window/right/directional/east{ - dir = 1; - name = "Hydroponics Delivery"; - req_access_txt = "35" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"dZM" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/office) -"dZR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"dZW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eau" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"eaB" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/morgue) -"eaH" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"eaQ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"eaS" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/dorms/cryo) -"ebb" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"ebe" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/hallway/primary/central) -"ebi" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"ebm" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/chair/stool{ - name = "Jim Norton's Quebecois Coffee stool" - }, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"ebF" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"ebL" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/door/window/left/directional/north{ - name = "MuleBot Access"; - req_access_txt = "50" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"ebP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"ebX" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"ece" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"ecf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"ecm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"ecy" = ( -/obj/machinery/shower{ - name = "emergency shower"; - pixel_y = 16 - }, -/obj/effect/turf_decal/trimline/blue/end, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ecE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"ecL" = ( -/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/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"ecV" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdgene2"; - name = "Genetics Lab Shutters" - }, -/turf/open/floor/plating, -/area/station/science/genetics) -"edd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"ede" = ( -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/checker, -/area/station/engineering/atmos/storage/gas) -"edp" = ( -/obj/machinery/light/directional/south, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Starboard Corner" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"edq" = ( -/obj/structure/rack, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_loot_count = 3; - spawn_loot_double = 0; - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"edt" = ( -/obj/structure/cable, -/obj/structure/bed/dogbed/mcgriff, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/firealarm/directional/west{ - pixel_y = 26 - }, -/mob/living/simple_animal/pet/dog/pug/mcgriff, -/turf/open/floor/iron, -/area/station/security/warden) -"edy" = ( -/obj/structure/table/wood, -/obj/item/folder, -/obj/item/folder, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/service/library) -"edI" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"edU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"edY" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Permabrig Visitation"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/brig) -"edZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/status_display/evac/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/mixing) -"ees" = ( -/obj/structure/fluff/broken_flooring{ - dir = 4; - icon_state = "pile" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eet" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"eew" = ( -/obj/structure/rack, -/obj/item/gun/energy/ionrifle, -/obj/item/gun/energy/temperature/security, -/obj/item/clothing/suit/hooded/ablative, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"eex" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "Science Deliveries" - }, -/obj/structure/plasticflaps/opaque{ - name = "Science Deliveries" - }, -/obj/structure/disposalpipe/trunk, -/obj/structure/sign/departments/science{ - color = "#D381C9"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"eeG" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Arrival Airlock" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"eeV" = ( -/obj/structure/railing/corner, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eeW" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Command Hallway" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"eeY" = ( -/obj/machinery/chem_heater/withbuffer{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/machinery/button/door/directional/south{ - id = "pharmacy_shutters_2"; - name = "pharmacy shutters control"; - req_access_txt = "5;69" - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"eeZ" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science Break Room"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/station/science/research) -"efb" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/bar) -"efc" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/machinery/light/directional/north, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - departmentType = 3; - name = "Security Requests Console" - }, -/obj/machinery/camera/directional/north{ - c_tag = "Customs Checkpoint" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"eff" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight, -/obj/item/analyzer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/assembly/signaler, -/obj/item/stack/rods{ - amount = 25 - }, -/obj/item/stack/cable_coil, -/obj/item/gps, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/gps, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"efi" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"efj" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/warden) -"efk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Chemical Storage"; - req_access_txt = "69" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"efm" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/clothing/head/welding{ - pixel_y = 9 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/clothing/head/welding{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"efw" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"efz" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/mixing) -"efD" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"efR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"egx" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/execution/education) -"egS" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Distro Staging to Distro" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"egU" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Ordnance Lab Maintenance"; - req_access_txt = "8" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"ehk" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/wrench, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/science/server) -"ehn" = ( -/obj/machinery/door/airlock/grunge{ - name = "Cell 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"eho" = ( -/obj/structure/girder, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port) -"ehx" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L6" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ehA" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"ehD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Quartermaster Maintenance"; - req_one_access_txt = "41" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"ehJ" = ( -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"eig" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/north, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"eiK" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/north{ - c_tag = "Science Mechbay"; - network = list("ss13","rd") - }, -/obj/machinery/button/door/directional/north{ - id = "mechbay"; - name = "Mech Bay Shutters Control"; - req_access_txt = "29" - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"eiR" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Departure Lounge - Port Aft" - }, -/obj/machinery/light/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-04" - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eiW" = ( -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/service) -"ejb" = ( -/obj/structure/closet/crate/freezer/blood, -/obj/effect/turf_decal/siding/white, -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Cold Storage"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"ejk" = ( -/obj/machinery/computer/atmos_control/engine{ - icon_state = "computer"; - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"ejn" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/easel, -/obj/item/canvas/nineteen_nineteen, -/obj/item/canvas/twentythree_nineteen, -/obj/item/canvas/twentythree_twentythree, -/turf/open/floor/wood, -/area/station/service/library) -"eju" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"ejO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ejQ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/horizontal, -/turf/open/space, -/area/space/nearstation) -"ejW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ekb" = ( -/obj/structure/mirror/directional/north, -/obj/structure/sink{ - pixel_y = 17 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/soap{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) -"eke" = ( -/obj/structure/rack, -/obj/item/stack/sheet/cardboard, -/obj/item/stack/sheet/cardboard, -/obj/structure/light_construct/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eku" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/plumbed{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"eky" = ( -/obj/structure/table/reinforced, -/obj/item/stock_parts/cell/high{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = -8; - pixel_y = 9 - }, -/obj/item/stock_parts/cell/high, -/obj/machinery/cell_charger, -/obj/item/borg/upgrade/rename{ - pixel_x = 3; - pixel_y = 18 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"ekD" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"ekW" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/sm_apc/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"ekZ" = ( -/obj/item/stack/sheet/cardboard, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"els" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"elA" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"elC" = ( -/obj/effect/turf_decal/siding/purple, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"elF" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/item/clothing/glasses/meson/engine, -/obj/machinery/light/directional/east, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/obj/item/pipe_dispenser, -/turf/open/floor/iron, -/area/station/engineering/main) -"elH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"elN" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"elO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"emr" = ( -/obj/structure/table/optable, -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"emv" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"emY" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/obj/structure/sign/directions/command{ - pixel_y = -8 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/primary/fore) -"eno" = ( -/obj/machinery/atmospherics/components/binary/pump/layer2{ - icon_state = "pump_map-2"; - dir = 8 - }, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"enx" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"enR" = ( -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/security/courtroom) -"eos" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "5;12;29;33;69" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) -"eou" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"eoz" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eoE" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/iv_drip, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"eoM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ - dir = 1 - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"eoW" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"epb" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"epw" = ( -/obj/machinery/vending/wardrobe/engi_wardrobe, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) -"epz" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"epI" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"epU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"epV" = ( -/obj/structure/rack, -/obj/item/stack/sheet/cardboard, -/obj/item/radio/off, -/obj/structure/light_construct/directional/north, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"epW" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "Mix to Filter" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eqk" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/trinary/filter{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"eql" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/carpet, -/area/station/service/library) -"eqw" = ( -/obj/structure/bookcase/random/religion, -/turf/open/floor/wood, -/area/station/service/library) -"eqy" = ( -/obj/machinery/light/no_nightlight/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"eqC" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"eqE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"eqN" = ( -/obj/effect/turf_decal/siding, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"eqO" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/obj/item/clothing/shoes/laceup, -/obj/item/clothing/under/suit/black_really, -/obj/item/clothing/glasses/sunglasses, -/obj/machinery/camera/directional/north{ - c_tag = "Corporate Showroom" - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"ero" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/curved{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"erp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"erB" = ( -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 1; - icon_state = "right"; - name = "gas ports" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "justice gas pump" - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"erC" = ( -/obj/structure/table, -/obj/item/clothing/head/soft/grey{ - pixel_x = -2; - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"erH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"erK" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Head of Personnel"; - req_access_txt = "57" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"erM" = ( -/obj/structure/table, -/obj/item/training_toolbox, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"erT" = ( -/obj/structure/rack, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"erZ" = ( -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - name = "MuleBot Access"; - req_access_txt = "50" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Research" - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"esm" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/requests_console/directional/north{ - department = "Law Office"; - name = "Lawyer Requests Console" - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"esq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"esw" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"esx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/command/teleporter) -"esB" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"esG" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"esN" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"etd" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/keycard_auth/directional/east, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"eti" = ( -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"ett" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/ethanol{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/carbon{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/chlorine{ - pixel_x = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/medbay/central) -"etx" = ( -/obj/effect/landmark/start/bartender, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/service/bar) -"etB" = ( -/obj/machinery/light/directional/west, -/obj/machinery/computer/piratepad_control/civilian{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"etC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - sortType = 8 - }, -/turf/open/floor/wood, -/area/station/security/office) -"etG" = ( -/obj/effect/landmark/start/geneticist, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"etM" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/structure/reagent_dispensers/wall/peppertank/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"eue" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"euf" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/blobstart, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/west{ - id = "Toilet2"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/spawner/random/trash/graffiti{ - pixel_x = -32; - spawn_loot_chance = 50 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"euh" = ( -/obj/structure/table/wood, -/obj/item/folder/yellow, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"euj" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"eul" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/newscaster/directional/south{ - pixel_x = -28 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"eun" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"eux" = ( -/obj/structure/window/fulltile, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/maintenance/starboard/aft) -"euC" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"euP" = ( -/obj/machinery/iv_drip, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"euT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"euZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"evc" = ( -/obj/structure/sign/poster/official/cleanliness{ - pixel_x = -32 - }, -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"evj" = ( -/obj/structure/light_construct/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"evv" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/plasma_tank{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"evI" = ( -/obj/machinery/computer/teleporter, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"evO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/range) -"evR" = ( -/obj/structure/closet/bombcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"evU" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/lobby) -"evV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"evX" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ewz" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"ewJ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"ewV" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"exa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"exc" = ( -/obj/structure/closet, -/obj/item/extinguisher, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"exi" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/curved/flipped{ - icon_state = "curved1"; - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"exn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/space_heater, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"exL" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"exS" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) -"eyk" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/rnd_secure_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"eyn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"eyN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"eyT" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "20;12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"eyW" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"ezz" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Port-Fore" - }, -/obj/structure/reagent_dispensers/fueltank/large, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ezP" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"ezR" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"ezS" = ( -/obj/machinery/door/airlock{ - name = "Unit B" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"eAh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"eAm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"eAD" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eAS" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 2; - icon_state = "right"; - name = "Reception Window" - }, -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Brig Control Desk"; - req_access_txt = "3" - }, -/obj/item/paper, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/item/storage/fancy/donut_box, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "briglockdown"; - name = "Warden Desk Shutters" - }, -/turf/open/floor/iron/showroomfloor, -/area/station/security/warden) -"eBf" = ( -/obj/structure/filingcabinet/security{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"eBk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/freezer, -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink"; - pixel_y = 28 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"eBF" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"eBH" = ( -/obj/structure/statue/snow/snowman, -/turf/open/floor/fake_snow, -/area/station/maintenance/port/aft) -"eBL" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/hallway/primary/central) -"eCd" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"eCe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/south{ - id = "prisonereducation"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"eCr" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"eCu" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - dir = 1; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = -30 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"eCx" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"eCE" = ( -/obj/machinery/door/poddoor/shutters{ - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison) -"eDa" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"eDj" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/corporate_showroom) -"eDt" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"eDz" = ( -/obj/structure/chair, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/security/office) -"eDA" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"eDG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"eDJ" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"eDW" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"eDX" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eEg" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering - Entrance" - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"eEh" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio3"; - layer = 3.3; - name = "Xenobio Pen 3 Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"eEk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"eEs" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"eEv" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"eEw" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port) -"eEA" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ - icon_state = "connector_map-2"; - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"eEK" = ( -/obj/effect/turf_decal/siding, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"eEU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/port) -"eFa" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Secure Tech Storage" - }, -/obj/item/radio/intercom/directional/east, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"eFl" = ( -/obj/structure/chair/pew/left, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"eFn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eFu" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eFw" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "cmoprivacy"; - name = "privacy shutter" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/command/heads_quarters/cmo) -"eFG" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/port) -"eFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Central South"; - dir = 9; - network = list("ss13","rd","xeno") - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"eFQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"eFR" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/iron, -/area/station/security/brig) -"eFV" = ( -/obj/effect/turf_decal/trimline/purple/corner, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"eGd" = ( -/obj/machinery/door/window{ - dir = 1; - name = "MiniSat Walkway Access" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"eGg" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eGw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) -"eGA" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eGC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"eGO" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eGZ" = ( -/turf/open/floor/iron, -/area/station/cargo/sorting) -"eHf" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"eHq" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/obj/effect/spawner/random/maintenance, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"eHt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"eHx" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"eHy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eHF" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"eHK" = ( -/obj/structure/table/wood, -/obj/structure/cable, -/obj/item/storage/photo_album/chapel, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"eHO" = ( -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"eHZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = 5; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/drinks/waterbottle{ - pixel_x = 7; - pixel_y = 6 - }, -/obj/item/plate{ - pixel_x = -9 - }, -/obj/item/reagent_containers/food/drinks/waterbottle{ - pixel_x = 7 - }, -/obj/effect/spawner/random/food_or_drink/donkpockets{ - pixel_x = -9; - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"eIe" = ( -/obj/machinery/vending/coffee, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"eIf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eIk" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"eIn" = ( -/obj/structure/chair, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"eIo" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/computer/atmos_control/oxygen_tank{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eIs" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/spawner/random/contraband/prison, -/obj/machinery/firealarm/directional/north, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"eID" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Science Ordnance Test Lab 2"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"eII" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"eIK" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/random/structure/grille, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"eIZ" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"eJf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"eJw" = ( -/obj/structure/rack, -/obj/item/wrench, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"eJA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"eJB" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/server) -"eJC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"eJE" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/airlock/medical/glass{ - name = "Break Room"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/break_room) -"eJW" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"eKh" = ( -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eKt" = ( -/obj/structure/table/wood, -/obj/item/toy/mecha/honk{ - pixel_y = 12 - }, -/obj/item/toy/dummy, -/obj/item/lipstick/purple{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/lipstick/jade{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lipstick/black, -/obj/structure/mirror/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/theater) -"eKx" = ( -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "QMLoad"; - name = "Loading Conveyor"; - pixel_x = -13; - pixel_y = -5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"eKy" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"eKE" = ( -/obj/structure/chair/comfy/beige, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"eKH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/item/kirbyplants/dead, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"eKM" = ( -/obj/effect/landmark/start/chief_medical_officer, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"eKO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"eLq" = ( -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"eLy" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"eLA" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/gravity_generator) -"eLC" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/command{ - name = "Research Director's Office"; - req_access_txt = "30" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) -"eLH" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"eLK" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"eLR" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"eMf" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "foreport"; - name = "Fore-Port Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/port/fore) -"eMn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"eMs" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eMC" = ( -/obj/structure/sign/plaques/kiddie/perfect_drone{ - pixel_y = 32 - }, -/obj/structure/table/wood, -/obj/item/storage/backpack/duffelbag/drone, -/obj/structure/window/reinforced, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"eMF" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge Access"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-left" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"eMG" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/item/clothing/suit/hooded/wintercoat/engineering, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"eMR" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Containment Pen #6"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio6"; - name = "Xenobio Pen 6 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"eMZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"eNc" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"eNg" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/security/brig) -"eNh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"eNk" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "corporate_privacy"; - name = "showroom shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/corporate_showroom) -"eNl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"eNp" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"eNu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/modular_computer/console/preset/cargochat/medical{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"eND" = ( -/obj/structure/sign/departments/cargo, -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/warehouse) -"eNT" = ( -/obj/effect/turf_decal/arrows/red{ - dir = 4; - pixel_x = -15 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"eNX" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/mess, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"eNY" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eOi" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/wooden_tv, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"eOl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "commissaryshutter"; - name = "Commissary Shutter Control" - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"eOq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"ePn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/filled/end{ - dir = 1 - }, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"ePq" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"ePr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ePE" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/rcl/pre_loaded, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"ePF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/vehicle/ridden/janicart, -/obj/item/key/janitor, -/turf/open/floor/iron, -/area/station/service/janitor) -"ePR" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/trash/food_packaging, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"eQb" = ( -/obj/structure/table/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/white/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/cable, -/obj/machinery/power/data_terminal, -/obj/machinery/telephone/medical, -/turf/open/floor/iron/white/side{ - dir = 6 - }, -/area/station/medical/treatment_center) -"eQf" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Quarter Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"eQg" = ( -/obj/machinery/flasher/directional/south{ - id = "AI" - }, -/obj/machinery/porta_turret/ai{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"eQl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"eQm" = ( -/obj/machinery/light/directional/west, -/obj/machinery/recharge_station, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"eQn" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Bar - Backroom" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/mirror/directional/north, -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/bar) -"eQv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/engineering/main) -"eQx" = ( -/obj/structure/table, -/obj/item/clothing/under/suit/black/skirt, -/obj/item/clothing/under/suit/black_really, -/obj/machinery/light/small/directional/north, -/obj/item/radio/intercom/directional/north, -/obj/item/clothing/accessory/waistcoat, -/obj/item/clothing/suit/toggle/lawyer/black, -/obj/item/clothing/under/suit/red, -/obj/item/clothing/neck/tie/black, -/obj/item/clothing/under/suit/black, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms) -"eQz" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/obj/machinery/airalarm/directional/north, -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) -"eQQ" = ( -/obj/item/food/snowcones/clown, -/turf/open/floor/fake_snow, -/area/station/maintenance/port/aft) -"eQZ" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"eRi" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"eRj" = ( -/obj/machinery/light/small/maintenance/directional/west, -/obj/effect/spawner/random/structure/grille, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"eRk" = ( -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/structure/closet/secure_closet/lethalshots, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"eRF" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Exterior - Starboard Fore"; - network = list("minisat") - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"eRN" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/food_or_drink/seed{ - spawn_all_loot = 1; - spawn_random_offset = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"eRZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"eSf" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"eSh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"eSi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/mining{ - name = "Drone Bay"; - req_access_txt = "31" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"eSj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/lounge) -"eSF" = ( -/obj/structure/sign/poster/contraband/robust_softdrinks{ - name = "Jim Norton's Quebecois Coffee"; - pixel_y = 32 - }, -/obj/item/seeds/coffee{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/seeds/coffee/robusta{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/seeds/coffee{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/box/drinkingglasses{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/storage/pill_bottle/happinesspsych{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/item/seeds/coffee{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/machinery/light/directional/north, -/obj/structure/table{ - name = "Jim Norton's Quebecois Coffee table" - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"eSL" = ( -/obj/machinery/light/directional/east, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"eSU" = ( -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"eTk" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/geiger_counter{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/radio/off{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"eTp" = ( -/obj/structure/closet/secure_closet/captains, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"eTz" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"eTE" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/firecloset, -/turf/open/floor/iron, -/area/station/engineering/main) -"eUh" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"eUs" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"eUu" = ( -/obj/structure/transit_tube/crossing/horizontal, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"eUv" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/window/right/directional/east{ - dir = 8; - name = "Fitness Ring" - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"eUy" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"eUM" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/ten_k/directional/west, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"eVm" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"eVu" = ( -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"eVO" = ( -/obj/structure/sign/plaques/kiddie/badger{ - pixel_y = 32 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/service/chapel/funeral) -"eVT" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"eWg" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"eWl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/structure/reagent_dispensers/plumbed{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"eWu" = ( -/obj/structure/toilet/greyscale{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"eWz" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Courtroom" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"eWE" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"eWM" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"eXp" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/engineering/main) -"eXL" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"eXW" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/rack, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler, -/obj/item/assembly/timer, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"eYf" = ( -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Access"; - req_access_txt = "24" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"eYC" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"eYG" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"eYN" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"eYX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Shuttle Airlock" - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"eZk" = ( -/obj/structure/filingcabinet/employment, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"eZz" = ( -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"fab" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"far" = ( -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"fav" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/fore) -"faz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"fbl" = ( -/obj/structure/table, -/obj/item/storage/medkit/brute, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"fbm" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"fbt" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Recreation Area" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"fbA" = ( -/obj/machinery/requests_console/directional/south{ - department = "Mining"; - name = "Mining Requests Console" - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"fbD" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"fbY" = ( -/obj/structure/mirror/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"fcb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "xeno_airlock_exterior"; - idInterior = "xeno_airlock_interior"; - idSelf = "xeno_airlock_control"; - name = "Access Console"; - pixel_x = -25; - pixel_y = -25; - req_access_txt = "55" - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"fcj" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/break_room) -"fcw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/range) -"fcF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"fcJ" = ( -/obj/structure/lattice, -/obj/item/shard, -/turf/open/space/basic, -/area/space/nearstation) -"fcY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fdB" = ( -/obj/structure/frame/machine, -/obj/item/circuitboard/machine/chem_master, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"fdE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"fdG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fdK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"fdW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"fee" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/structure/disposaloutlet{ - dir = 8 - }, -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) -"feh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"fej" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/iron{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/lithium{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 1 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/medbay/central) -"fem" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"fen" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"fex" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"feI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/bar) -"feV" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"ffm" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ffo" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/xenobiology) -"ffx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"ffE" = ( -/obj/item/wrench, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"ffP" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating/foam{ - temperature = 2.7 - }, -/area/space/nearstation) -"ffR" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "N2 to Airmix" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ffX" = ( -/obj/machinery/igniter/incinerator_ordmix, -/turf/open/floor/engine/airless, -/area/station/science/mixing/chamber) -"fga" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "prison release"; - name = "Labor Camp Shuttle Lockdown"; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"fgc" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/virology) -"fgs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"fgL" = ( -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"fgU" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"fgV" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"fgW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"fgY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Primary Tool Storage" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fhb" = ( -/obj/machinery/door/airlock/command{ - name = "Emergency Escape"; - req_access_txt = "20" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"fhe" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/west, -/obj/machinery/fax_machine, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"fhj" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fhn" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing) -"fhz" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fhB" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"fhN" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"fic" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"fil" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"fiq" = ( -/obj/machinery/mass_driver/shack{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/space_hut) -"fiB" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/controller, -/obj/item/compact_remote, -/obj/item/compact_remote, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"fiG" = ( -/obj/machinery/door/airlock/atmos{ - name = "Hypertorus Fusion Reactor"; - req_access_txt = "24" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"fiJ" = ( -/obj/structure/table, -/obj/machinery/recharger, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"fiR" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;27" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"fiZ" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/cable, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"fjt" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Security Post - Cargo"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"fjw" = ( -/obj/machinery/light/directional/west, -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/mixing) -"fjK" = ( -/obj/machinery/flasher/portable, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"fjQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"fjU" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/wood, -/area/station/commons/lounge) -"fko" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"fkF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"fkH" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Mechanic Storage" - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"fkK" = ( -/obj/effect/landmark/start/roboticist, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"flt" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"flF" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fmg" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/ai_monitored/command/storage/eva) -"fmp" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_y = 4 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) -"fmF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fmX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"fna" = ( -/obj/structure/chair, -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 4; - pixel_x = -30 - }, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"fne" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher/directional/west{ - id = "Cell 2"; - pixel_y = -22 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/iron, -/area/station/security/brig) -"fng" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "commissaryshutter"; - name = "Vacant Commissary Shutter" - }, -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"fni" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fno" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"fnu" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"fnv" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Prison Sanitarium"; - req_access_txt = "2" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/security/prison) -"fnL" = ( -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"fnS" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"fnZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/brig) -"foe" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/cytology) -"fop" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"foq" = ( -/turf/open/floor/wood, -/area/station/service/lawoffice) -"fos" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/security/prison) -"foI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fpp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/lounge) -"fpq" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"fpF" = ( -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"fpQ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/item/radio/intercom/prison/directional/west, -/turf/open/floor/iron/white, -/area/station/security/prison) -"fpX" = ( -/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/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"fqg" = ( -/obj/machinery/light/small/directional/south, -/obj/item/radio/intercom/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"fqi" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"fqq" = ( -/obj/structure/noticeboard/directional/south, -/obj/structure/table/wood, -/obj/machinery/computer/med_data/laptop{ - dir = 1; - pixel_y = 4 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"fqt" = ( -/obj/structure/bodycontainer/crematorium{ - dir = 1; - id = "crematoriumChapel" - }, -/obj/machinery/button/crematorium{ - id = "crematoriumChapel"; - pixel_x = -26; - req_access_txt = "27" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"fqu" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"fqz" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"fqD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fqH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fqN" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"fqO" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"fqP" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/library) -"fqT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"frp" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"frC" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"frK" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/item/kirbyplants/potty, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/turf/open/floor/iron/white, -/area/station/commons/lounge) -"frL" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"frR" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"frW" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/three, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"fsc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/obj/machinery/light/no_nightlight/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"fsi" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"fsq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"fsw" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"fsB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"fsW" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"ftq" = ( -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"fts" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"ftE" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/office) -"ftN" = ( -/obj/structure/closet/secure_closet/engineering_chief, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/item/storage/secure/briefcase, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"ftO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/trinary/filter/flipped, -/turf/open/floor/iron, -/area/station/science/mixing) -"ftX" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/machinery/door/window{ - base_state = "right"; - icon_state = "right"; - name = "Captain's Desk"; - req_access_txt = "20" - }, -/obj/structure/disposalpipe/segment, -/obj/item/stamp/captain, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/item/hand_tele, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"fub" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"fuj" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/locker) -"ful" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"fun" = ( -/obj/structure/table, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/wirecutters, -/obj/item/multitool, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"fuw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/item/cigbutt{ - pixel_x = -6; - pixel_y = -4 - }, -/obj/machinery/duct, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"fuY" = ( -/obj/structure/closet/secure_closet/chemical, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"fuZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/office) -"fva" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/horizontal, -/turf/open/space, -/area/space/nearstation) -"fvc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/range) -"fve" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fvg" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"fvp" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"fwj" = ( -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/evac, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/storage/eva) -"fwk" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/side, -/area/station/medical/medbay/lobby) -"fwC" = ( -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Research Director Observation"; - req_access_txt = "30" - }, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) -"fwO" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"fwP" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"fwY" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fxe" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth (Chaplain)"; - req_access_txt = "22" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"fxr" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/obj/item/instrument/musicalmoth{ - name = "Syl Labee" - }, -/turf/open/space/basic, -/area/space/nearstation) -"fxs" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fxx" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/supply) -"fxE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"fxK" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"fya" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/sorting/mail{ - sortType = 19 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"fyh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"fyv" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom{ - broadcasting = 1; - dir = 8; - listening = 0; - name = "Station Intercom (Court)" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"fyM" = ( -/obj/effect/landmark/xeno_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"fyU" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) -"fzi" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"fzn" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"fzC" = ( -/obj/machinery/computer/communications, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"fzF" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/duct, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"fzJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/qm) -"fAq" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Command Hallway - Central" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"fAz" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) -"fAJ" = ( -/turf/open/floor/wood, -/area/station/commons/lounge) -"fAO" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"fAW" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/left/directional/east{ - name = "Kitchen Delivery"; - req_access_txt = "28" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm/kitchen_cold_room{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"fBf" = ( -/obj/machinery/flasher/portable, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Secure Gear Storage" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"fBh" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 1; - name = "First Aid Supplies"; - req_access_txt = "5" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/toxin, -/obj/item/storage/medkit/toxin{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"fBu" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Dormitories - Aft" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"fBy" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"fBB" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"fBL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"fBP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"fCb" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 10 - }, -/turf/open/floor/iron/checker, -/area/station/science/research) -"fCy" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Teleport Access"; - req_one_access_txt = "17;19" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/teleporter) -"fCC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"fCD" = ( -/obj/structure/rack, -/obj/item/radio/off{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/radio/off{ - pixel_x = -6; - pixel_y = 7 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"fCM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"fCT" = ( -/obj/structure/cable, -/obj/machinery/door/window/left/directional/north{ - dir = 2; - name = "Containment Pen #2"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"fCV" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"fDe" = ( -/obj/machinery/computer/crew{ - dir = 4 - }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"fDg" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Port Primary Hallway - Middle" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fDi" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"fDp" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/structure/sign/warning/securearea{ - pixel_x = -32; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"fDq" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Aft Starboard Solar Maintenance" - }, -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"fDv" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - id_tag = "commissarydoor"; - name = "Commissary" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"fDw" = ( -/obj/machinery/light/small/maintenance/directional/south, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"fDO" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fDW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Chapel Office"; - req_access_txt = "22" - }, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"fEb" = ( -/obj/machinery/light/directional/north, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fEk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"fEn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"fEo" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/plating, -/area/station/maintenance/port) -"fEp" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/station/solars/port/aft) -"fEw" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/security/courtroom) -"fEy" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fEA" = ( -/obj/structure/table, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"fEC" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port) -"fEH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Control Room"; - req_access_txt = "10"; - req_one_access_txt = "0" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"fEJ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/dorms/cryo) -"fEL" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"fET" = ( -/obj/machinery/door_buttons/access_button{ - idDoor = "xeno_airlock_exterior"; - idSelf = "xeno_airlock_control"; - name = "Access Button"; - pixel_y = -24; - req_access_txt = "55" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/research{ - autoclose = 0; - frequency = 1449; - id_tag = "xeno_airlock_exterior"; - name = "Xenobiology Lab External Airlock"; - req_access_txt = "55" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"fFc" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio5"; - layer = 3.3; - name = "Xenobio Pen 5 Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"fFg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"fFl" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"fFm" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fFD" = ( -/obj/structure/cable, -/obj/machinery/photocopier, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"fFM" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/end, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"fFN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"fFV" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"fGm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"fGt" = ( -/obj/structure/table/reinforced, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/service, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/service/bar) -"fGA" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/landmark/blobstart, -/obj/machinery/camera/directional/north{ - c_tag = "Evidence Storage" - }, -/obj/item/storage/secure/safe/directional/north{ - name = "evidence safe" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"fGD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;17" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"fGM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"fHy" = ( -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"fHS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"fHZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"fIy" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"fIA" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/courtroom) -"fJd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fJr" = ( -/obj/item/bodypart/chest/robot{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/bodypart/head/robot{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"fJv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/door/airlock/security/glass{ - name = "Gear Room"; - req_one_access_txt = "1;4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"fJH" = ( -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"fJL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"fKb" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fKe" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/office) -"fKl" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"fKq" = ( -/obj/structure/closet/emcloset, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"fKz" = ( -/obj/structure/chair/office/light, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"fKD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fKO" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/office) -"fLk" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fLl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/maintenance/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"fLm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"fLn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"fLx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"fLz" = ( -/obj/machinery/door/airlock{ - name = "Hydroponics Backroom"; - req_access_txt = "35" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"fLN" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "gateshutter"; - name = "Gateway Shutter Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fLV" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "engine_sides" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"fLY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"fLZ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"fMu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ - dir = 1 - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"fMG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 6 - }, -/obj/machinery/button/door/directional/north{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_x = -6; - req_access_txt = "24" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"fMJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Server Room" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) -"fMK" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/disposalpipe/junction/flip{ - dir = 2 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"fMR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"fMS" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"fMT" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/south, -/obj/machinery/computer/monitor{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"fNu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"fNz" = ( -/obj/structure/sign/departments/medbay/alt, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/medbay/lobby) -"fOi" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album{ - pixel_y = -4 - }, -/obj/item/camera{ - pixel_y = 4 - }, -/obj/item/radio/intercom/directional/west{ - freerange = 1; - name = "Captain's Intercom" - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"fOD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"fOH" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"fOJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"fOL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fOM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Fuel Pipe to Filter" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fON" = ( -/obj/structure/closet/crate, -/obj/item/reagent_containers/glass/bowl, -/obj/effect/spawner/random/contraband/prison, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/reagent_containers/glass/bowl, -/obj/item/kitchen/fork/plastic, -/obj/item/kitchen/fork/plastic, -/obj/item/kitchen/fork/plastic, -/obj/item/storage/box/drinkingglasses, -/obj/item/kitchen/spoon/plastic, -/obj/item/kitchen/spoon/plastic, -/obj/item/kitchen/spoon/plastic, -/obj/item/knife/plastic, -/obj/item/knife/plastic, -/obj/item/knife/plastic, -/obj/item/storage/bag/tray/cafeteria, -/obj/item/storage/bag/tray/cafeteria, -/obj/item/storage/bag/tray/cafeteria, -/obj/item/storage/bag/tray/cafeteria, -/obj/item/storage/box/drinkingglasses, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/security/prison) -"fPj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/range) -"fPm" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/service/library) -"fPn" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"fPu" = ( -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"fPJ" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"fPR" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"fPT" = ( -/obj/machinery/vending/engivend, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) -"fQk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"fQq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"fQB" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"fQO" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/supermatter/room) -"fRb" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"fRn" = ( -/obj/machinery/vending/clothing, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"fRp" = ( -/obj/item/candle, -/obj/machinery/light_switch/directional/north, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"fRq" = ( -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/port) -"fRx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/yellow/filled/end, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"fRB" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"fRD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"fRE" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"fRJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"fRN" = ( -/obj/structure/table/wood, -/obj/item/toy/plush/carpplushie{ - color = "red"; - name = "\improper Nanotrasen wildlife department space carp plushie" - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"fSe" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical{ - pixel_y = 12 - }, -/obj/item/electronics/airalarm{ - pixel_x = -5; - pixel_y = -5 - }, -/obj/item/electronics/firealarm{ - pixel_x = 5; - pixel_y = -5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/item/electronics/airalarm{ - pixel_x = -5; - pixel_y = -5 - }, -/obj/item/electronics/firealarm{ - pixel_x = 5 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/structure/sign/poster/official/nanotrasen_logo{ - pixel_x = 32 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"fSf" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/south, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) -"fSv" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white/side, -/area/station/science/lobby) -"fSH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/showcase/machinery/oldpod{ - desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; - name = "decommissioned sleeper" - }, -/obj/effect/decal/cleanable/greenglow, -/obj/effect/spawner/random/decoration/glowstick, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"fTb" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/east, -/obj/effect/landmark/start/assistant, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/south{ - id = "Toilet4"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/spawner/random/trash/graffiti{ - pixel_y = -32; - spawn_loot_chance = 50 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"fTf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"fTh" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"fTk" = ( -/obj/machinery/door/window/right/directional/south{ - name = "First Aid Supplies"; - req_access_txt = "5" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/brute{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/brute{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"fTo" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"fTw" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"fTJ" = ( -/obj/machinery/rnd/production/fabricator/department/service, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/box, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"fTO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"fTQ" = ( -/obj/machinery/biogenerator, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"fUR" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fUV" = ( -/obj/machinery/chem_master/condimaster{ - desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; - name = "SapMaster XP" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/north{ - c_tag = "Hydroponics - Fore" - }, -/obj/machinery/button/door/directional/north{ - id = "hydro_service"; - name = "Service Shutter Control"; - req_access_txt = "35" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"fVg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/south{ - c_tag = "Xenobiology Lab - Central North"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/status_display/ai/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fVm" = ( -/obj/structure/cable, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"fVn" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"fVp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"fVN" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/mob/living/simple_animal/pet/dog/corgi/puppy/void{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/science/research) -"fVZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/turf/open/space/basic, -/area/space) -"fWe" = ( -/obj/structure/cable, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"fWk" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/service/bar) -"fWp" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/rd) -"fWs" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"fWD" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"fWF" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"fWI" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"fWT" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"fWV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"fXk" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"fXt" = ( -/obj/item/food/cracker, -/obj/item/food/cracker{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/item/trash/boritos{ - desc = "Why does it look like boritos? Nobody would feed unhealthy snacks to pets, right?"; - name = "cracker bag"; - pixel_x = -14 - }, -/turf/open/floor/grass, -/area/station/science/research) -"fXC" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"fXD" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/command) -"fXM" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"fXO" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/machinery/vending/wardrobe/medi_wardrobe, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"fXQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Waste Release" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"fYf" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/purple/corner, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science Hallway - West"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"fYh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"fYp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"fYq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"fYr" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/brig) -"fYx" = ( -/obj/machinery/vending/cart{ - req_access_txt = "57" - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"fZq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Detective's Office"; - req_access_txt = "4" - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/detectives_office) -"fZy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"fZH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"fZM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"fZQ" = ( -/obj/structure/railing/corner{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"gaa" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/teleporter) -"gac" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2; - sortType = 18 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"gar" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"gat" = ( -/obj/machinery/exodrone_launcher, -/obj/item/exodrone, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"gav" = ( -/obj/machinery/door/poddoor/incinerator_atmos_aux, -/turf/open/space/basic, -/area/station/maintenance/disposal/incinerator) -"gaP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"gaV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/chamber) -"gbw" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "1;4;38;12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"gby" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/rack, -/obj/item/storage/secure/briefcase, -/obj/item/clothing/mask/cigarette/cigar, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"gbE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"gbH" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/warden) -"gbI" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/entry) -"gbO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"gcg" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"gck" = ( -/obj/structure/table/wood, -/obj/item/pen/red, -/obj/item/pen/blue{ - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/service/library) -"gcy" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"gcF" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"gcI" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"gcP" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/taperecorder{ - pixel_x = -3 - }, -/obj/item/storage/fancy/cigarettes, -/obj/item/assembly/flash/handheld, -/obj/item/reagent_containers/spray/pepper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"gdK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"gdY" = ( -/obj/machinery/photocopier{ - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/service/library) -"gep" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"ger" = ( -/obj/structure/closet/crate/hydroponics, -/obj/item/paper/guides/jobs/hydroponics, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 5 - }, -/obj/effect/spawner/random/food_or_drink/seed{ - spawn_all_loot = 1; - spawn_random_offset = 1 - }, -/obj/effect/spawner/random/contraband/prison, -/turf/open/floor/iron, -/area/station/security/prison) -"ges" = ( -/obj/structure/cable, -/obj/structure/chair/office, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"gey" = ( -/obj/machinery/door/window{ - name = "MiniSat Walkway Access" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"geB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"geL" = ( -/obj/machinery/power/smes, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"geM" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/service/theater) -"geR" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin6"; - name = "Cabin 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"geT" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"gff" = ( -/obj/machinery/light/directional/south, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"gfs" = ( -/obj/structure/table, -/obj/machinery/light/directional/east, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/flasher/directional/south{ - id = "AI" - }, -/obj/item/ai_module/core/full/asimov, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"gfx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"gfP" = ( -/obj/structure/table, -/obj/item/storage/fancy/egg_box, -/obj/item/reagent_containers/food/condiment/flour, -/obj/item/reagent_containers/food/condiment/rice, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"gfQ" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/machinery/door/airlock/hatch{ - id_tag = "smesroom_door"; - name = "SMES Access"; - req_access_txt = "10" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"gfV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"gfW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"gfY" = ( -/obj/structure/cable, -/obj/machinery/modular_computer/console/preset/engineering, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"ggc" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "hosspace"; - name = "Space Shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hos) -"gge" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"ggh" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"ggk" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads into space!"; - name = "deathsposal unit" - }, -/obj/structure/sign/warning/deathsposal{ - pixel_y = -32 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ggm" = ( -/obj/structure/rack, -/obj/item/vending_refill/security, -/obj/item/storage/box/handcuffs, -/obj/item/storage/box/flashbangs{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"ggv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ggE" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"ggP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"ggW" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ggY" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"gha" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"ghr" = ( -/obj/structure/lattice, -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"ghG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"ghJ" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ghP" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"ghS" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/locker) -"ghU" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"ghY" = ( -/mob/living/simple_animal/pet/penguin/baby{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/science/research) -"gic" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gik" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"gim" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"giA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"giP" = ( -/obj/structure/bookcase/random/reference, -/turf/open/floor/wood, -/area/station/service/library) -"giZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"gje" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"gjS" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/main) -"gjU" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Hypertorus Fusion Reactor Chamber Fore" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"gkq" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "AI Chamber"; - req_access_txt = "16" - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Chamber entrance shutters"; - name = "AI Chamber entrance shutters" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"gkL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"gkS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"gkT" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Robotics Lab"; - req_access_txt = "29" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"gkX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"glx" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/lesser) -"glF" = ( -/obj/structure/table/glass, -/obj/item/radio/intercom/directional/west, -/obj/structure/microscope, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Fore"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"glK" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Auxiliary Tool Storage" - }, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"glN" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/storage/box/gum, -/obj/item/surgicaldrill, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"glV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"gml" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"gmo" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"gmC" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"gmH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Interrogation Monitoring"; - req_one_access_txt = "1;4" - }, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/security/office) -"gmO" = ( -/obj/machinery/power/tracker, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/port/aft) -"gmR" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"gmZ" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"gnf" = ( -/obj/structure/bed/roller, -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Medbay Foyer"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"gnh" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"gns" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/lighter, -/turf/open/floor/carpet, -/area/station/command/bridge) -"gnv" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gnw" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/command/bridge) -"gnA" = ( -/obj/structure/lattice/catwalk, -/obj/structure/easel, -/obj/item/canvas/twentythree_twentythree, -/turf/open/space/basic, -/area/space/nearstation) -"gnD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "CMO Maintenance"; - req_access_txt = "40" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"gnG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"gnJ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"gnO" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"gnQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"god" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"gol" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"goE" = ( -/obj/structure/closet/wardrobe/white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"goM" = ( -/obj/structure/girder, -/obj/effect/spawner/random/structure/grille, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"goQ" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/transmitter, -/obj/item/stock_parts/subspace/transmitter, -/obj/item/stock_parts/subspace/amplifier, -/obj/item/stock_parts/subspace/amplifier, -/obj/item/stock_parts/subspace/amplifier, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"goR" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/toilet/restrooms) -"goS" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/sign/poster/contraband/random/directional/north, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"gpd" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/closet/crate/solarpanel_small, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"gpy" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -2 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -8; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"gpJ" = ( -/obj/item/kirbyplants, -/obj/machinery/vending/wallmed/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gpZ" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"gqa" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"gqd" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"gql" = ( -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"gqm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"gqA" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/button/door/directional/south{ - id = "evashutter"; - name = "E.V.A. Storage Shutter Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"gqE" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"gqM" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/medbay/lobby) -"gqZ" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"grr" = ( -/obj/machinery/suit_storage_unit/rd, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science Admin"; - network = list("ss13","rd") - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) -"grx" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"grF" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"grN" = ( -/obj/structure/closet/secure_closet/exile, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"gss" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"gsF" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gsG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"gtf" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/treatment_center) -"gts" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"gtG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Gamer Lair"; - req_one_access_txt = "12;27" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"gtJ" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"gtK" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/paper/guides/jobs/medical/morgue{ - pixel_x = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"gud" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"guj" = ( -/obj/item/tank/internals/oxygen/red{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/item/tank/internals/oxygen/red{ - pixel_x = 4; - pixel_y = -1 - }, -/obj/item/tank/internals/anesthetic{ - pixel_x = 2 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/item/wrench, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"gul" = ( -/obj/structure/cable, -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/grass, -/area/station/medical/virology) -"guu" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"guv" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"gux" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "QM #1" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"guy" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"guV" = ( -/obj/machinery/computer/atmos_alert, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"gvs" = ( -/obj/structure/rack, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/item/hand_labeler, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"gvw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"gvy" = ( -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/maintenance/two, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"gvE" = ( -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/mob/living/simple_animal/pet/dog/corgi/puppy/slime, -/turf/open/floor/grass, -/area/station/science/research) -"gvH" = ( -/obj/structure/lattice/catwalk, -/obj/item/barcodescanner, -/turf/open/space/basic, -/area/space/nearstation) -"gvN" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"gvR" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"gvV" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"gwk" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Ordnance Lab"; - req_access_txt = "8" - }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdordnance"; - name = "Ordnance Lab Shutters" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-toxins-passthrough" - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"gwv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"gxi" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"gxC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"gxQ" = ( -/obj/structure/chair/stool/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"gxT" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"gyh" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/start/botanist, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"gyi" = ( -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"gyl" = ( -/obj/structure/window/reinforced/plasma/spawner/east, -/turf/open/space/basic, -/area/space/nearstation) -"gys" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) -"gyB" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"gyI" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/storage/satellite) -"gyJ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/storage/tcomms) -"gyN" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port) -"gyR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"gyS" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/south, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"gyV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"gzb" = ( -/obj/machinery/door/window{ - name = "HoP's Desk"; - req_access_txt = "57" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"gzx" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron, -/area/station/science/mixing) -"gzI" = ( -/obj/machinery/power/shieldwallgen, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"gzT" = ( -/obj/machinery/field/generator, -/turf/open/floor/plating, -/area/station/engineering/main) -"gAj" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gAo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/science/mixing) -"gAs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/incinerator_vent_atmos_aux{ - pixel_x = -8; - pixel_y = -24 - }, -/obj/machinery/button/door/incinerator_vent_atmos_main{ - pixel_x = -8; - pixel_y = -36 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"gAu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"gAB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/checkpoint/engineering) -"gAH" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Pen #6"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"gAR" = ( -/obj/structure/flora/junglebush/c, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/medical/virology) -"gAX" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"gAY" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/computer/security/mining{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"gAZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - sortType = 12 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) -"gBh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"gBi" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet2"; - name = "Unit 2" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"gBn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"gBo" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/security/office) -"gBw" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"gBz" = ( -/obj/structure/cable, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=13.2-Tcommstore"; - location = "13.1-Engineering-Enter" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"gBC" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"gBU" = ( -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"gBV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ - icon_state = "manifold-3"; - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"gCj" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"gCL" = ( -/obj/structure/window/fulltile, -/obj/structure/flora/ausbushes/leafybush, -/obj/structure/flora/ausbushes/ywflowers, -/turf/open/floor/grass, -/area/station/maintenance/starboard/aft) -"gCS" = ( -/obj/structure/window/reinforced, -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"gCX" = ( -/obj/structure/closet/crate, -/obj/item/stack/cable_coil, -/obj/item/crowbar, -/obj/item/screwdriver{ - pixel_y = 16 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"gDh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"gDn" = ( -/obj/structure/destructible/cult/item_dispenser/archives/library, -/obj/item/clothing/under/suit/red, -/obj/effect/decal/cleanable/cobweb, -/obj/item/book/codex_gigas, -/turf/open/floor/engine/cult, -/area/station/service/library) -"gDo" = ( -/obj/structure/table, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/mask/gas/sechailer{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"gDq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"gDt" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Theater - Backstage" - }, -/obj/structure/table/wood, -/obj/item/clothing/mask/animal/pig, -/obj/item/bikehorn, -/turf/open/floor/wood, -/area/station/service/theater) -"gDF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/brig) -"gDG" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gDM" = ( -/obj/structure/rack, -/obj/item/stack/package_wrap{ - pixel_x = 6 - }, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light/directional/south, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"gDV" = ( -/obj/machinery/door/poddoor/preopen{ - id = "prison release"; - name = "prisoner processing blast door" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/button/door/directional/west{ - id = "prison release"; - name = "Labor Camp Shuttle Lockdown"; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"gEv" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"gEz" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/lounge) -"gEB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"gED" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"gET" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"gFa" = ( -/obj/docking_port/stationary/random{ - dir = 4; - id = "pod_4_lavaland"; - name = "lavaland" - }, -/turf/open/space/basic, -/area/space) -"gFb" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/space/basic, -/area/space) -"gFw" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"gGj" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"gGr" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"gGC" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"gGE" = ( -/obj/item/reagent_containers/spray/plantbgone, -/obj/item/reagent_containers/spray/pestspray{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/item/reagent_containers/glass/bottle/nutrient/rh{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/structure/table, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"gGP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"gGX" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/item/clothing/mask/balaclava, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"gGZ" = ( -/obj/structure/closet/secure_closet/engineering_electrical, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/engine_smes) -"gHb" = ( -/obj/machinery/igniter/incinerator_atmos, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"gHt" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"gHw" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"gHH" = ( -/obj/machinery/door/window/right/directional/east{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Security Delivery"; - req_access_txt = "1" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/security/office) -"gHW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gIb" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gIN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gIV" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/hallway/primary/fore) -"gIW" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Space Bridge"; - req_access_txt = "55" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "xeno_blastdoor"; - name = "biohazard containment door" - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"gJg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"gJp" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Atmospherics Maintenance"; - req_access_txt = "24" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"gJw" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/button/door/directional/south{ - id = "mechbay"; - name = "Mech Bay Shutters Control"; - req_access_txt = "29" - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"gJK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"gJS" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table, -/obj/item/surgical_drapes, -/obj/item/cautery, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"gKd" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"gKu" = ( -/obj/effect/landmark/start/botanist, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"gKz" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"gKA" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"gKE" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"gKU" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/greater) -"gKW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"gKY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"gKZ" = ( -/obj/machinery/light/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/vending/cigarette, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"gLo" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -4; - pixel_y = -3 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 28 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"gLu" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"gLL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"gMj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"gMx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"gMA" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"gMJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"gML" = ( -/obj/structure/table/wood/poker, -/turf/open/floor/wood, -/area/station/commons/lounge) -"gNl" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/department/engine) -"gNy" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"gNH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"gNY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"gOv" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"gOC" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Primary Treatment Centre"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"gOV" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin4"; - name = "Cabin 5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"gPu" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door_buttons/airlock_controller{ - idExterior = "virology_airlock_exterior"; - idInterior = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Console"; - pixel_x = 24; - pixel_y = -24; - req_access_txt = "39" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"gPw" = ( -/obj/structure/rack, -/obj/effect/spawner/random/food_or_drink/seed, -/obj/item/seeds/cannabis, -/obj/item/seeds/cannabis, -/obj/item/seeds/cannabis, -/obj/item/food/grown/mushroom/glowshroom, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"gPL" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"gPM" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Security - Gear Room" - }, -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"gPX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"gQf" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/space/basic, -/area/space/nearstation) -"gQz" = ( -/obj/effect/landmark/start/botanist, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"gQK" = ( -/obj/effect/spawner/random/decoration/statue, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"gQV" = ( -/turf/open/floor/iron/white, -/area/station/medical/storage) -"gQW" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"gQZ" = ( -/obj/item/kirbyplants/dead, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"gRv" = ( -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"gRy" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gRz" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"gRC" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"gRO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"gSf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"gSm" = ( -/obj/machinery/teleport/station, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/plating, -/area/station/command/teleporter) -"gSo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"gSp" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"gSN" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"gSY" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"gSZ" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Virology Lab"; - network = list("ss13","medbay") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"gTb" = ( -/obj/machinery/vending/wardrobe/sec_wardrobe, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"gTq" = ( -/obj/machinery/door/airlock/grunge{ - name = "Prison Forestry" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/prison) -"gTu" = ( -/obj/machinery/power/emitter, -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/engineering/main) -"gTx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"gTW" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Security - Office - Port" - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"gTZ" = ( -/obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/item/aicard, -/obj/item/paicard, -/obj/item/circuitboard/aicore, -/obj/machinery/keycard_auth/directional/north{ - pixel_x = -5 - }, -/obj/machinery/button/door/directional/north{ - id = "xeno_blastdoor"; - name = "Xenobiology Containment Control"; - pixel_x = 8; - req_access_txt = "30" - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"gUa" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/engine) -"gUg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"gUr" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"gUu" = ( -/obj/structure/sign/painting/library{ - pixel_y = -32 - }, -/turf/open/floor/wood, -/area/station/service/library) -"gUz" = ( -/obj/effect/turf_decal/arrows/white{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"gUB" = ( -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/item/taperecorder{ - pixel_x = 6; - pixel_y = 10 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"gUE" = ( -/obj/structure/mopbucket, -/obj/item/mop, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"gUH" = ( -/obj/structure/bodycontainer/morgue{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/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/iron/dark, -/area/station/medical/morgue) -"gVf" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"gVq" = ( -/obj/structure/chair/stool{ - icon_state = "stool"; - dir = 1 - }, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"gVu" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"gVE" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"gVL" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/machinery/camera/directional/west{ - c_tag = "Science Ordnance Test Lab" - }, -/obj/item/assembly/prox_sensor{ - pixel_y = 2 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 9; - pixel_y = -2 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 8; - pixel_y = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"gVP" = ( -/obj/machinery/bluespace_beacon, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"gVR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/turf_decal/bot, -/obj/item/electronics/apc, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"gWb" = ( -/obj/structure/chair/pew/right, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"gWe" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gWs" = ( -/turf/open/floor/engine/airless, -/area/station/science/mixing/chamber) -"gWx" = ( -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"gWP" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"gXE" = ( -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/medbay/lobby) -"gXL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"gXO" = ( -/obj/machinery/meter{ - name = "Mixed Air Tank In" - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"gXP" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/bot, -/obj/item/bodypart/arm/right/robot{ - pixel_x = 3 - }, -/obj/item/bodypart/arm/left/robot{ - pixel_x = -3 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/item/assembly/flash/handheld{ - pixel_x = 6; - pixel_y = 13 - }, -/obj/machinery/ecto_sniffer{ - pixel_x = -6; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"gXU" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/bridge) -"gXV" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"gXX" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"gYa" = ( -/obj/structure/cable, -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/neutral/filled/warning{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"gYe" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"gYm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"gYq" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/tcommsat/server) -"gYt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"gYu" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"gYI" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/structure/sign/poster/official/random/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"gYT" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/entertainment/arcade, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"gZa" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"gZk" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/courtroom) -"gZq" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/science/research) -"gZu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"gZv" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"gZz" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/hallway/secondary/command) -"gZB" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/storage/gas) -"gZK" = ( -/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, -/obj/item/stack/sheet/mineral/plasma{ - amount = 30 - }, -/obj/item/gps, -/obj/structure/closet/crate/engineering, -/turf/open/floor/plating, -/area/station/engineering/main) -"hac" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/porta_turret/ai, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the RD's goons from the safety of his office."; - dir = 4; - name = "Research Monitor"; - network = list("rd"); - pixel_x = -28 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"hae" = ( -/obj/effect/turf_decal/loading_area/white, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"haB" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 4 - }, -/obj/item/clothing/glasses/hud/health{ - pixel_y = 2 - }, -/obj/item/clothing/glasses/hud/health, -/turf/open/floor/iron/white/side{ - dir = 8 - }, -/area/station/medical/treatment_center) -"haV" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"haX" = ( -/obj/effect/turf_decal/arrows/white, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"hbm" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"hbn" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"hbp" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hbq" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Central Primary Hallway - Fore - AI Upload" - }, -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; - name = "\improper HIGH-POWER TURRETS AHEAD"; - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hbu" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/monitoring) -"hbw" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Engineering - Foyer - Shared Storage" - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"hbC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"hbG" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"hct" = ( -/obj/machinery/button/door/directional/west{ - id = "atmoshfr"; - name = "Radiation Shutters Control"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"hcO" = ( -/obj/structure/fireaxecabinet/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Port" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light/no_nightlight/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hcR" = ( -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hdc" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"hdd" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One"; - space_dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"hdl" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"hdw" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/sign/departments/psychology{ - pixel_x = -32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"hdA" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"hdE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;63" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"hdG" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/service/kitchen) -"hdX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hef" = ( -/obj/machinery/photocopier, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"heh" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"hel" = ( -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"her" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"heu" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_alert{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/sign/poster/official/safety_internals{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"hev" = ( -/obj/effect/turf_decal/bot, -/obj/structure/mecha_wreckage/ripley, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"hew" = ( -/obj/structure/closet/crate, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/item/stack/cable_coil{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/stock_parts/cell/high, -/obj/machinery/light_switch/directional/north, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/spawner/random/engineering/flashlight, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"hez" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"heB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/item/broken_bottle{ - pixel_x = 9; - pixel_y = -4 - }, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2; - sortType = 20 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"heJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"heK" = ( -/obj/item/storage/belt/utility, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/structure/rack, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "gateshutter"; - name = "Gateway Shutter Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"heM" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/solars/starboard/aft) -"heS" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"heZ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Science Ordnance Lab"; - network = list("ss13","rd") - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/siding{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"hfd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/cargo/qm) -"hfg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"hfh" = ( -/obj/structure/table, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/engine_smes) -"hfj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/insectguts, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"hfm" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Arrivals - Aft Arm" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"hfp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Hydroponics Backroom"; - req_access_txt = "35" - }, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"hfv" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 10 - }, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/reagent_containers/glass/beaker/cryoxadone{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/storage/pill_bottle/mannitol, -/obj/item/reagent_containers/dropper{ - pixel_y = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"hfx" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Vacant Office Maintenance"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"hfI" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/engine, -/area/station/science/cytology) -"hfT" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"hfX" = ( -/obj/effect/decal/cleanable/oil, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"hgg" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input{ - dir = 1 - }, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"hgn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/machinery/meter, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"hgo" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.2-Central-CrewQuarters"; - location = "14-Starboard-Central" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hgy" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"hgG" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"hgN" = ( -/obj/structure/closet/wardrobe/pjs, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/dorms) -"hgX" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"hhb" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"hhf" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"hhm" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation B"; - req_access_txt = "39" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hhx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"hhO" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"hhQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hib" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hie" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"hih" = ( -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) -"hij" = ( -/obj/machinery/door/airlock/external{ - name = "Auxiliary Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "whiteship-dock" - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"him" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/iron, -/area/station/science/mixing) -"hin" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/theater) -"his" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"hiz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hjd" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance/two, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"hjf" = ( -/obj/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"hjl" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hjv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hjG" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"hkg" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/commons/dorms/cryo) -"hks" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"hkA" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#9FED58" - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hkJ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Auxiliary Base Construction" - }, -/obj/machinery/button/door/directional/south{ - id = "aux_base_shutters"; - name = "Public Shutters Control"; - req_access_txt = "72" - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"hkN" = ( -/obj/machinery/vending/cigarette, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"hkQ" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/theater) -"hkS" = ( -/obj/effect/turf_decal/box, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"hkV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"hkW" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science Robotics Workshop"; - network = list("ss13","rd") - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light_switch/directional/north{ - pixel_x = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"hle" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"hlv" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hlz" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"hlJ" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hlP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/mixing) -"hme" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;25;28" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hmi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"hmk" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;22;25;26;28;35;37;46;38;70" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"hml" = ( -/obj/effect/turf_decal/box/red, -/obj/effect/turf_decal/arrows/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/multilayer/connected, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"hmG" = ( -/obj/structure/bed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hmM" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"hmW" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"hnm" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"hnt" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/north, -/obj/structure/closet/secure_closet/security, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"hnw" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"hnz" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; - location = "10-Aft-To-Central" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"hnF" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hnL" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"hnP" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Cytology - Secure Pen"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"hnX" = ( -/obj/machinery/computer/holodeck{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"hoa" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 4 - }, -/obj/machinery/computer/department_orders/engineering, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"hoe" = ( -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/delivery, -/obj/structure/closet/secure_closet/engineering_personal, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"hoh" = ( -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/security/courtroom) -"hoj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"hov" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 8; - name = "Emergency Loop Tie" - }, -/obj/effect/turf_decal/delivery/white, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"hoz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Xenobiology Maintenance"; - req_access_txt = "47" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"hoF" = ( -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hpk" = ( -/obj/structure/disposaloutlet{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"hpm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"hpn" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"hpE" = ( -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"hpO" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"hpQ" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Surgical Wing"; - network = list("ss13","medbay") - }, -/obj/structure/bed/roller, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"hqf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"hqg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"hqi" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"hqm" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"hqv" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/light/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Brig - Hallway - Starboard" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"hqx" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/box, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"hqy" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/effect/spawner/random/bureaucracy/pen, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"hqL" = ( -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"hrb" = ( -/obj/structure/rack, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/maintenance, -/obj/item/storage/belt/utility, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"hrc" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"hrf" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"hrh" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port) -"hrq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Fore Primary Hallway" - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hrs" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"hru" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/lobby) -"hrI" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"hsb" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"hsO" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"htm" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/turf_decal/trimline/red/warning{ - dir = 4 - }, -/obj/machinery/flasher/directional/north{ - id = "visitorflash" - }, -/turf/open/floor/iron, -/area/station/security/prison) -"htC" = ( -/obj/machinery/computer/shuttle/mining{ - dir = 1; - req_access = null - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"htR" = ( -/turf/open/floor/iron/dark/corner{ - dir = 4 - }, -/area/station/security/prison) -"htS" = ( -/obj/structure/fluff/iced_abductor, -/turf/open/misc/asteroid/basalt/airless, -/area/space/nearstation) -"htW" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"hus" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/hallway) -"huz" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/commons/locker) -"huK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/hydroponics/soil{ - pixel_y = 8 - }, -/obj/effect/spawner/random/food_or_drink/seed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"huT" = ( -/obj/structure/table/glass, -/obj/item/folder/white{ - pixel_y = 2 - }, -/obj/item/screwdriver{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/radio/headset/headset_med, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"hva" = ( -/obj/machinery/door_timer{ - id = "Cell 3"; - name = "Cell 3"; - pixel_x = 32; - pixel_y = -32 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"hve" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "test chamber blast door" - }, -/obj/structure/cable, -/obj/structure/sign/warning/electricshock, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"hvt" = ( -/obj/structure/kitchenspike_frame, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hvv" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/structure/closet/crate/trashcart, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"hvy" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/requests_console/directional/east{ - announcementConsole = 1; - department = "Research Lab"; - departmentType = 5; - name = "Research Requests Console"; - receive_ore_updates = 1 - }, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/obj/item/stack/sheet/glass, -/turf/open/floor/iron, -/area/station/science/lab) -"hvA" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/bed/dogbed/ian, -/mob/living/simple_animal/pet/dog/corgi/ian, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"hvF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/science) -"hvK" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/bed/dogbed/runtime, -/obj/item/toy/cattoy, -/mob/living/simple_animal/pet/cat/runtime, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"hvN" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"hvO" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/nuke_storage) -"hvQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"hvU" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hwg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"hwh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"hwn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/chamber) -"hwv" = ( -/obj/machinery/door/airlock/hatch{ - name = "Xenobiology Maintenance"; - req_access_txt = "47" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"hwA" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/reagent_containers/spray/cleaner, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"hwD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hwW" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix to Distro Staging" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hxw" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hxF" = ( -/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/firealarm/directional/east, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"hxX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) -"hyg" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/chair, -/obj/structure/cable, -/obj/effect/turf_decal/siding/red/corner, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"hyo" = ( -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"hyp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"hyr" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/hatch{ - name = "Observation Room"; - req_access_txt = "47" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"hyt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"hyu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/lab) -"hyy" = ( -/obj/machinery/vending/dinnerware, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"hyz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"hyE" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/fore) -"hyZ" = ( -/obj/machinery/flasher/directional/east{ - id = "AI"; - pixel_y = 26 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/holopad/secure, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"hza" = ( -/obj/structure/table/wood, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"hzD" = ( -/obj/machinery/rnd/production/fabricator/department/engineering, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"hzH" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"hzQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"hAc" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "engine_emitter"; - name = "Core Emitter Shutter"; - pixel_x = 8; - pixel_y = 8 - }, -/obj/machinery/button/door{ - id = "engine_sides"; - name = "Core Inspection Shutter"; - pixel_x = 8; - pixel_y = -8 - }, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"hAj" = ( -/obj/structure/table, -/obj/item/airlock_painter, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"hAn" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - Air" - }, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"hAr" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/qm) -"hAA" = ( -/obj/machinery/computer/robotics{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"hAU" = ( -/obj/effect/landmark/start/cyborg, -/obj/machinery/holopad/secure, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"hAV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"hBa" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/roboticist, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"hBb" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"hBJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"hBR" = ( -/obj/structure/rack, -/obj/item/shield/riot{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/shield/riot, -/obj/item/shield/riot{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"hBT" = ( -/obj/machinery/holopad, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"hCi" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"hCp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"hCx" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hCI" = ( -/obj/item/hand_labeler_refill, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"hCN" = ( -/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 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"hCP" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/dorms) -"hCS" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.3-Lockers-Dorms"; - location = "14.2-Central-CrewQuarters" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"hCU" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/open/floor/plating, -/area/station/command/bridge) -"hCW" = ( -/obj/item/disk/data{ - pixel_x = 9; - pixel_y = -1 - }, -/obj/structure/table/wood, -/obj/item/toy/talking/ai{ - name = "\improper Nanotrasen-brand toy AI"; - pixel_y = 6 - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"hDb" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/command{ - name = "Chief Engineer's Office"; - req_access_txt = "56" - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/heads_quarters/ce) -"hDJ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"hDN" = ( -/obj/machinery/photocopier{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"hDP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/warden) -"hDR" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"hDV" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"hEd" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"hEe" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"hEi" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"hEl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Departure Lounge Security Post"; - req_access_txt = "63" - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"hEr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 8 - }, -/obj/machinery/computer/department_orders/security{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"hEE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"hEM" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "test chamber blast door" - }, -/obj/effect/turf_decal/bot, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/machinery/door/window/left/directional/south{ - dir = 4; - name = "Maximum Security Test Chamber"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"hFc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"hFj" = ( -/obj/machinery/door/airlock/external{ - name = "Atmospherics External Access"; - req_access_txt = "24" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"hFw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"hFD" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/miningoffice) -"hFJ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"hFK" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/machinery/suit_storage_unit/captain, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"hFW" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/blue{ - desc = "An old pair of nitrile gloves, with no sterile properties."; - name = "old nitrile gloves" - }, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/surgical, -/obj/item/reagent_containers/glass/rag, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"hFZ" = ( -/obj/machinery/dna_scannernew, -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/machinery/requests_console/directional/west{ - department = "Genetics"; - departmentType = 2; - name = "Genetics Requests Console" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"hGa" = ( -/obj/effect/decal/cleanable/oil, -/obj/machinery/light_switch/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"hGj" = ( -/obj/machinery/rnd/production/circuit_imprinter, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"hGm" = ( -/obj/structure/closet/crate, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/security/prison) -"hGA" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"hGC" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Medbay Storage"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"hGE" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/bodycontainer/morgue, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"hGR" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"hGT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"hHy" = ( -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"hHJ" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=1.5-Fore-Central"; - location = "1-BrigCells" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hHO" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"hIa" = ( -/obj/structure/chair, -/obj/effect/landmark/start/chaplain, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"hIe" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hIn" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light_switch/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Fitness Room - Aft" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"hIt" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hIE" = ( -/obj/structure/cable, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"hIN" = ( -/obj/machinery/door/window/brigdoor/security/holding{ - id = "Holding Cell"; - name = "Holding Cell" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"hIU" = ( -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"hIV" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Dock"; - req_access_txt = "48" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"hIX" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 10 - }, -/obj/item/flashlight/lamp{ - on = 0; - pixel_x = -7; - pixel_y = 18 - }, -/obj/item/kitchen/rollingpin{ - pixel_x = -4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hJu" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hJy" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"hJF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/meter, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"hJJ" = ( -/obj/machinery/rnd/production/fabricator/omni, -/turf/open/floor/iron/dark, -/area/station/science/lab) -"hJO" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hJU" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"hJX" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"hKk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"hKn" = ( -/obj/machinery/vending/dinnerware, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"hKA" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/storage/tools) -"hKH" = ( -/turf/closed/wall/mineral/plastitanium, -/area/station/commons/fitness/recreation) -"hLg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"hLi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"hLp" = ( -/obj/effect/spawner/random/structure/grille, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"hLt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hLx" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"hLH" = ( -/obj/machinery/door/airlock/grunge{ - name = "Prison Workshop" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/prison) -"hLQ" = ( -/obj/effect/landmark/start/bartender, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"hLV" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"hMa" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"hMj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Shuttle Airlock"; - req_access_txt = "2" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"hMl" = ( -/obj/machinery/rnd/production/fabricator/department/cargo, -/obj/structure/disposalpipe/segment, -/obj/machinery/camera/directional/east{ - c_tag = "Cargo Bay - Mid" - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"hMn" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"hMH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"hNh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"hNk" = ( -/obj/item/bodypart/leg/left, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"hNu" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"hNy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"hNZ" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Staff Entrance"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/office) -"hOe" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/cargo/qm) -"hOj" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"hOl" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"hOB" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"hOF" = ( -/obj/machinery/disposal/bin, -/obj/machinery/camera/directional/east{ - c_tag = "Garden" - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"hOV" = ( -/obj/structure/closet/toolcloset, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"hPi" = ( -/obj/machinery/door/airlock/grunge{ - name = "Cell 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"hPq" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/mob/living/simple_animal/bot/cleanbot/autopatrol, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hPH" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdgene2"; - name = "Genetics Lab Shutters" - }, -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Genetics Desk"; - req_access_txt = "9" - }, -/obj/item/folder, -/obj/item/pen, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/genetics) -"hPP" = ( -/obj/structure/safe/floor, -/obj/item/food/fortunecookie, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"hQo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"hQs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"hQU" = ( -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"hQW" = ( -/obj/structure/table, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"hRj" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"hRm" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"hRr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"hRC" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Engineering - Transit Tube Access" - }, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"hRL" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"hRM" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"hRN" = ( -/obj/machinery/atmospherics/components/trinary/mixer{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"hSs" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/computer/department_orders/medical{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"hSw" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/bar) -"hSy" = ( -/obj/structure/closet/wardrobe/mixed, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"hSK" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L7" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hSY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"hSZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"hTb" = ( -/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/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"hTj" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/item/food/grown/poppy/lily, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"hTs" = ( -/obj/structure/chair{ - name = "Judge" - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"hTt" = ( -/obj/machinery/computer/station_alert{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -29 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"hTz" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Disposal Access"; - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"hTM" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"hTQ" = ( -/obj/machinery/door/window/left/directional/south{ - dir = 8; - name = "Mass Driver Door"; - req_access_txt = "8" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"hTS" = ( -/obj/structure/closet/bombcloset, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/requests_console/directional/west{ - department = "Ordnance Lab"; - departmentType = 5; - name = "Ordnance Requests Console" - }, -/obj/effect/turf_decal/siding{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"hTU" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"hUx" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/landmark/start/chemist, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"hUy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"hUJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"hUT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"hVd" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"hVj" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/gravity_generator) -"hVr" = ( -/obj/item/folder, -/obj/item/folder, -/obj/machinery/camera/autoname/directional/south, -/obj/structure/table/wood, -/obj/item/taperecorder, -/obj/item/tape, -/turf/open/floor/wood, -/area/station/service/library) -"hVB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"hWc" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"hWg" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"hWi" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"hWo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/security/medical) -"hWs" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;6" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"hXg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"hXj" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hXy" = ( -/obj/machinery/teleport/hub, -/turf/open/floor/plating, -/area/station/command/teleporter) -"hXQ" = ( -/obj/structure/sign/warning/fire{ - pixel_x = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Fuel Pipe to Incinerator" - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"hXY" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"hYi" = ( -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = -7; - pixel_y = 9 - }, -/obj/item/dest_tagger{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"hYl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/cargo/qm) -"hYF" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"hYU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"hYV" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"hZj" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"hZm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"hZp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"hZv" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"hZM" = ( -/obj/structure/closet/crate, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"hZX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"iad" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"iai" = ( -/obj/machinery/door/airlock{ - id_tag = "FitnessShower"; - name = "Fitness Room Shower" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/fitness/recreation) -"iat" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"iaB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"iaO" = ( -/obj/effect/landmark/start/lawyer, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"iaP" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/machinery/door/window/right/directional/east{ - base_state = "left"; - dir = 1; - icon_state = "left"; - name = "Danger: Conveyor Access"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"iaT" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"ibj" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ibo" = ( -/obj/structure/table/glass, -/obj/item/paper_bin, -/obj/item/clipboard, -/obj/item/toy/figure/cmo, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"ibu" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ibC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"ibD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"ibS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"icj" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Dock Maintenance"; - req_access_txt = "48" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"icu" = ( -/obj/structure/noticeboard/directional/north{ - desc = "A memorial wall for pinning mementos upon."; - name = "memorial board" - }, -/obj/item/storage/fancy/candle_box, -/obj/item/storage/fancy/candle_box{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/carpet, -/area/station/service/chapel/funeral) -"icG" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"icH" = ( -/obj/structure/bed, -/obj/item/bedsheet/captain, -/obj/effect/landmark/start/captain, -/obj/machinery/camera/directional/east{ - c_tag = "Captain's Quarters" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"icO" = ( -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "6" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"icR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"idt" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"idB" = ( -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"idE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"idL" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"idO" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/atmos/glass{ - name = "Hypertorus Fusion Reactor"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"idU" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/landmark/start/head_of_security, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"iek" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ies" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 4 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = -5; - pixel_y = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"ieH" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"ieR" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One"; - space_dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"ifr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"ifv" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Surgery Maintenance"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"igr" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"igs" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/office) -"igu" = ( -/obj/structure/cable/layer1, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"igv" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) -"igB" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable/multilayer/connected/one_two, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"igG" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"ihb" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"ihg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"ihl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/clothing/shoes/wheelys/rollerskates{ - pixel_y = 5 - }, -/obj/item/clothing/shoes/wheelys/rollerskates, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"ihm" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"ihu" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"ihy" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"ihz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"ihP" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ihT" = ( -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ihW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"iia" = ( -/obj/effect/turf_decal/bot, -/obj/item/robot_suit, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"iih" = ( -/obj/machinery/vending/boozeomat/all_access, -/obj/effect/decal/cleanable/cobweb, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/aft) -"iis" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 4 - }, -/obj/item/folder/yellow, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"iiC" = ( -/obj/machinery/iv_drip, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"iiD" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"iiI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"iji" = ( -/obj/effect/turf_decal/trimline/green/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ijj" = ( -/obj/item/storage/secure/safe/directional/east, -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = -12; - pixel_y = 5 - }, -/obj/machinery/fax_machine, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"ijI" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ijJ" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"ijY" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/brig) -"ikj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"iko" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"ikq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/security/range) -"iky" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/fax_machine, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"ikC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "MiniSat Maintenance"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"ikW" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port) -"ilb" = ( -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"ilj" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/station/solars/starboard/fore) -"ilk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"ilG" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"ilJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"ilO" = ( -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ime" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"img" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"imo" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/medical/virology) -"imr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"imx" = ( -/obj/structure/table/wood, -/obj/structure/sign/picture_frame/showroom/one{ - pixel_x = -8; - pixel_y = 32 - }, -/obj/structure/sign/picture_frame/showroom/two{ - pixel_x = 8; - pixel_y = 32 - }, -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"imz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"imG" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"imI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/lounge) -"ine" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1; - name = "O2 to Airmix" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ing" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Test Subject Cell"; - req_access_txt = "39" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ink" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"inl" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"inv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/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/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"inF" = ( -/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 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"inH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"inN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/red/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"inX" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/side, -/area/station/science/lobby) -"ioe" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"ior" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ioE" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/command/heads_quarters/hop) -"ipl" = ( -/obj/structure/rack, -/obj/item/stack/rods{ - amount = 23 - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"ipn" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"ipo" = ( -/obj/structure/girder, -/obj/effect/spawner/random/structure/grille, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"ipr" = ( -/turf/open/floor/glass/reinforced, -/area/station/science/research) -"ipx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"ipR" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"iqk" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - Toxins" - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"iqp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"iqt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"iqC" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/science/research) -"iqE" = ( -/obj/effect/turf_decal/box/white{ - color = "#EFB341" - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"iqP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/wood, -/area/station/commons/lounge) -"iqW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"iqY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ira" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring medbay to ensure patient safety."; - dir = 4; - name = "Medbay Monitor"; - network = list("medbay"); - pixel_x = -32 - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -20 - }, -/obj/machinery/computer/med_data{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"iri" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"irv" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Crew Quarters Entrance" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/sign/departments/lawyer{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"irB" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 1 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"irV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"ish" = ( -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/lounge) -"isn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"isp" = ( -/obj/machinery/camera/motion/directional/south{ - c_tag = "Vault"; - network = list("vault") - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"isx" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"isz" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"isE" = ( -/obj/structure/dresser, -/obj/machinery/newscaster/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"isJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/lesser) -"isP" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Distro to Waste" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"isU" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"itl" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/corner, -/obj/machinery/airalarm/directional/east, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"itv" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/medbay/central) -"itE" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/atmos_control/nocontrol/master{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"itG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"itM" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/effect/spawner/random/engineering/tank, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"iud" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"iuf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"iuj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/office) -"iuy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"iuF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/security/office) -"iuJ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/break_room) -"iuX" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ivm" = ( -/obj/machinery/airalarm/directional/east, -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/stamp, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"ivz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"ivC" = ( -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/structure/closet/crate, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"ivL" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"ivO" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/firealarm/directional/west, -/obj/structure/table/wood, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/obj/item/clothing/under/misc/burial, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"iwb" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/medical{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"iwp" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"iwH" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"iwK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/landmark/start/geneticist, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"iwX" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"ixe" = ( -/obj/machinery/lapvend, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"ixn" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/bot, -/obj/machinery/camera{ - c_tag = "Engineering - Foyer - Starboard"; - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"ixp" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/command) -"ixw" = ( -/obj/machinery/holopad, -/obj/machinery/camera/directional/south{ - network = list("minisat") - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"ixz" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ixG" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"ixT" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/structure/closet/crate/silvercrate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"iyk" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_one_access_txt = "5;12;33;69" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"iyq" = ( -/obj/machinery/atmospherics/components/tank/air{ - pipe_color = "#0000FF"; - piping_layer = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"iyu" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"iyv" = ( -/obj/effect/turf_decal/siding/white{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"iyG" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"iyL" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"iyS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"izf" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"izT" = ( -/obj/effect/spawner/random/entertainment/deck, -/obj/machinery/light/small/directional/west, -/obj/structure/table/wood/poker, -/turf/open/floor/wood, -/area/station/commons/lounge) -"izW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"iAg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"iAj" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"iAl" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"iAF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"iBl" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "chapel_shutters_space"; - name = "chapel shutters" - }, -/turf/open/floor/plating, -/area/station/service/chapel) -"iBF" = ( -/obj/machinery/vending/hydroseeds{ - slogan_delay = 700 - }, -/obj/structure/noticeboard/directional/north, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"iBO" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"iBW" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) -"iBZ" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/blobstart, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/west{ - id = "Toilet1"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/obj/effect/spawner/random/trash/graffiti{ - pixel_x = -32; - spawn_loot_chance = 50 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"iCd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"iCl" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"iCz" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault{ - name = "Vault"; - req_access_txt = "53" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"iCB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"iCG" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/office) -"iCT" = ( -/obj/machinery/light/directional/east, -/obj/structure/table, -/obj/structure/sign/poster/random/directional/east, -/obj/machinery/telephone/service, -/obj/structure/cable, -/obj/machinery/power/data_terminal, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"iCV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"iCZ" = ( -/obj/structure/bed/roller, -/obj/machinery/camera/directional/west{ - c_tag = "Gateway - Atrium" - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/vending/wallmed/directional/west, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"iDm" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Three"; - space_dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "escape-pod-3" - }, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"iDo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"iDs" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/structure/rack, -/obj/item/multitool, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"iDA" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/locker) -"iDF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"iDJ" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/capacitor, -/obj/item/stock_parts/scanning_module{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/manipulator, -/obj/item/stock_parts/manipulator, -/turf/open/floor/iron, -/area/station/science/lab) -"iDZ" = ( -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"iEb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - id_tag = "AuxShower"; - name = "Showers" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"iEc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/iron/white, -/area/station/science/lab) -"iEd" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"iEh" = ( -/turf/open/floor/iron/stairs/right{ - dir = 1 - }, -/area/station/engineering/atmos) -"iEl" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"iEx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"iEG" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"iEY" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"iFn" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Chapel - Port" - }, -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"iFu" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Virology Airlock"; - network = list("ss13","medbay") - }, -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"iFw" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"iFA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/theater) -"iFX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"iGi" = ( -/obj/item/crowbar, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"iGm" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"iGq" = ( -/obj/structure/lattice, -/obj/item/broken_bottle, -/turf/open/space/basic, -/area/space/nearstation) -"iGC" = ( -/obj/structure/table, -/obj/item/implanter{ - pixel_x = 5; - pixel_y = 12 - }, -/obj/item/storage/box/evidence{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/toy/crayon/white{ - pixel_y = -4 - }, -/obj/item/toy/crayon/white{ - pixel_x = -5; - pixel_y = -4 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"iGH" = ( -/obj/effect/spawner/random/structure/girder, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"iGJ" = ( -/obj/structure/rack, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"iHd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"iHk" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"iHm" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"iHB" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "Security Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"iHE" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/stasis, -/obj/machinery/defibrillator_mount/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"iIb" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/station/science/xenobiology) -"iIf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"iIl" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"iIo" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"iIQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"iJe" = ( -/obj/machinery/newscaster/directional/north, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/item/reagent_containers/dropper, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"iJw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"iJB" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/aft/lesser) -"iJD" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - dir = 4; - name = "medical bed" - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"iJG" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"iJS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/chem_master, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"iJZ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"iKa" = ( -/turf/open/floor/iron, -/area/station/service/hydroponics) -"iKe" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/lab) -"iKh" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"iKn" = ( -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"iKr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"iKu" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"iKv" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"iKy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"iKW" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"iKZ" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to Distro" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"iLf" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/science/research) -"iLA" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"iLE" = ( -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"iLH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"iLI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"iLJ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - sortType = 7 - }, -/turf/open/floor/iron, -/area/station/security/office) -"iLM" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Gateway - Access" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/command/gateway) -"iMh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"iMl" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"iMn" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"iMy" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"iMD" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Containment Pen #4"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"iMG" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) -"iMM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/janitor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/janitor) -"iMW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"iMY" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/vending/drugs, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"iNd" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"iNF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/layer1, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"iNH" = ( -/obj/machinery/air_sensor/plasma_tank, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"iNN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Council Chamber"; - req_access_txt = "19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"iNP" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/dim/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"iOe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"iOs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port) -"iOA" = ( -/obj/structure/reagent_dispensers/cooking_oil, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"iOC" = ( -/obj/machinery/door/firedoor/border_only/closed{ - dir = 8; - name = "Animal Pen A" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"iOF" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"iON" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"iOP" = ( -/obj/machinery/door/morgue{ - name = "Chapel Garden" - }, -/turf/open/floor/cult, -/area/station/service/chapel/funeral) -"iOQ" = ( -/obj/structure/disposalpipe/sorting/mail{ - sortType = 4 - }, -/obj/effect/landmark/start/station_engineer, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"iPc" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod Two"; - space_dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"iPj" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"iPk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"iPm" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"iPs" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms) -"iPC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/suit_storage_unit/industrial/loader, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"iPU" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"iPY" = ( -/obj/effect/landmark/start/lawyer, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"iQl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/science/server) -"iQq" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/medbay/lobby) -"iQr" = ( -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"iQL" = ( -/obj/item/storage/secure/safe/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Chief Engineer's Office" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"iQR" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/research) -"iRg" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"iRn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/bar) -"iRx" = ( -/obj/item/flashlight/lamp, -/obj/machinery/newscaster/directional/west, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"iRz" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/storage/tools) -"iRC" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/trimline/red/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"iRE" = ( -/obj/structure/bed/dogbed, -/obj/effect/decal/cleanable/blood/old, -/obj/structure/sign/poster/contraband/random/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"iRG" = ( -/obj/structure/rack, -/obj/item/clothing/suit/armor/riot{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/clothing/suit/armor/riot{ - pixel_y = 2 - }, -/obj/item/clothing/suit/armor/riot{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_y = -2 - }, -/obj/item/clothing/suit/armor/bulletproof{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - departmentType = 3; - name = "Security Requests Console" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"iRM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/south{ - c_tag = "Science Ordnance Mix"; - network = list("ss13","rd") - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/mixing) -"iRO" = ( -/obj/machinery/computer/upload/ai, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 2; - icon_state = "right"; - layer = 3.1; - name = "Upload Console Window"; - req_access_txt = "16" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"iRR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"iRT" = ( -/obj/machinery/griddle, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"iRU" = ( -/obj/machinery/newscaster/directional/north, -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/commons/dorms) -"iRY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Foyer"; - req_one_access_txt = "32;19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"iSi" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics - Aft" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"iSu" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/brig) -"iSy" = ( -/obj/machinery/door/poddoor/incinerator_ordmix, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"iSA" = ( -/obj/structure/table/reinforced, -/obj/machinery/camera/directional/north{ - c_tag = "Science Robotics Office"; - network = list("ss13","rd") - }, -/obj/item/radio/intercom/directional/north, -/obj/item/storage/medkit{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/storage/medkit{ - pixel_x = -5; - pixel_y = -1 - }, -/obj/item/healthanalyzer{ - pixel_x = 4; - pixel_y = 6 - }, -/obj/item/healthanalyzer{ - pixel_x = -3; - pixel_y = -4 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"iSS" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/item/stack/rods/fifty, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 4 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/atmos) -"iSY" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"iTe" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ - dir = 1 - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"iTg" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/grass, -/area/station/medical/virology) -"iTk" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/dice, -/turf/open/floor/iron, -/area/station/commons/locker) -"iTF" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"iTI" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"iTM" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/ai_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"iUd" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/airalarm/mixingchamber{ - pixel_y = -24 - }, -/turf/open/floor/iron, -/area/station/science/mixing/chamber) -"iUe" = ( -/obj/machinery/button/door/directional/west{ - id = "transitlockdown"; - name = "Transit Tube Lockdown"; - pixel_y = -6; - req_access_txt = "19" - }, -/obj/machinery/button/door/directional/west{ - id = "Secure Storage"; - name = "Engineering Secure Storage"; - pixel_y = 6; - req_access_txt = "11" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"iUf" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"iUG" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/modular_computer/console/preset/command, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"iUN" = ( -/turf/open/floor/iron/dark, -/area/station/science/lab) -"iUU" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"iVc" = ( -/obj/machinery/airalarm/directional/south, -/obj/item/stack/package_wrap{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/stack/package_wrap, -/obj/structure/table/wood, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/wood, -/area/station/service/bar) -"iVh" = ( -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"iVt" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"iVA" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/abandoned) -"iVR" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"iVZ" = ( -/obj/structure/table, -/obj/item/crowbar/red, -/obj/item/wrench, -/obj/item/clothing/mask/gas, -/obj/item/storage/box{ - pixel_x = 2; - pixel_y = 4 - }, -/obj/item/storage/box, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/requests_console/directional/west{ - department = "Atmospherics"; - departmentType = 3; - name = "Atmospherics Requests Console" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"iWk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/obj/machinery/meter, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"iWx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"iWz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"iXa" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"iXg" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"iXp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"iXs" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.8-Dorms-Lockers"; - location = "14.5-Recreation" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"iXC" = ( -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"iXV" = ( -/obj/structure/chair, -/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/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"iXX" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"iYp" = ( -/obj/effect/turf_decal/stripes/end, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"iYt" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/trash/soap, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) -"iYu" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"iYM" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"iYV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/mob/living/simple_animal/hostile/lizard/wags_his_tail, -/turf/open/floor/plating, -/area/station/service/janitor) -"iZa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/courtroom) -"iZq" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"iZK" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"iZM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"iZN" = ( -/obj/machinery/light/directional/east, -/obj/machinery/status_display/ai/directional/east, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"jad" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"jah" = ( -/obj/structure/cable, -/obj/structure/sink/kitchen{ - dir = 8; - pixel_x = 14 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/mob/living/simple_animal/hostile/retaliate/goat{ - name = "Pete" - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"jat" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/airlock/medical{ - name = "Psychology"; - req_access_txt = "70" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/psychology) -"jaw" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"jaC" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - icon_state = "right"; - name = "Outer Window" - }, -/obj/machinery/door/window/brigdoor{ - dir = 4; - name = "Security Desk"; - req_access_txt = "1" - }, -/obj/item/folder/red, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"jaI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Starboard" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "atmoshfr"; - name = "Radiation Shutters Control"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jaN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/dark/half{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"jaT" = ( -/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, -/obj/structure/closet/crate/secure{ - desc = "A secure crate containing various materials for building a customised test-site."; - name = "Firing Range Gear Crate"; - req_access_txt = "1" - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"jbh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/cargo/qm) -"jbo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/spawner/random/structure/girder{ - spawn_loot_chance = 80 - }, -/obj/effect/spawner/random/structure/barricade{ - spawn_loot_chance = 50 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"jbp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"jbD" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"jbJ" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jbZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"jci" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"jcs" = ( -/obj/structure/bookcase/random, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"jcx" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Incinerator Access"; - req_access_txt = "24" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"jcD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"jcL" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 4 - }, -/obj/machinery/pdapainter/research, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"jcZ" = ( -/obj/machinery/air_sensor/mix_tank, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"jdn" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"jdN" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"jdZ" = ( -/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 = 3; - pixel_y = -7 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/igniter{ - pixel_x = 3; - pixel_y = -7 - }, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/assembly/timer{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/item/storage/pill_bottle/epinephrine{ - pixel_x = 8; - pixel_y = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"jed" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdordnance"; - name = "Ordnance Lab Shutters" - }, -/turf/open/floor/plating, -/area/station/science/mixing) -"jeN" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/port/fore) -"jeT" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - Mix" - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"jeV" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/requests_console/directional/north{ - announcementConsole = 1; - department = "Chief Engineer's Desk"; - departmentType = 4; - name = "Chief Engineer's Requests Console" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"jeY" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/obj/structure/sign/directions/command{ - pixel_y = -8 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/commons/storage/tools) -"jfb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"jfl" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jfn" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) -"jfp" = ( -/obj/effect/landmark/start/shaft_miner, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"jfz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing/corner{ - dir = 8 - }, -/obj/structure/railing/corner, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"jfE" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/airlock_sensor/incinerator_atmos{ - pixel_y = 24 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"jfR" = ( -/obj/structure/bookcase, -/turf/open/floor/wood, -/area/station/command/bridge) -"jfS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/belt/utility/full, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"jgL" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"jgT" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"jgU" = ( -/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 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"jhs" = ( -/obj/structure/table, -/obj/machinery/light/directional/north, -/obj/item/folder/white{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 7 - }, -/obj/item/reagent_containers/dropper{ - pixel_x = -3; - pixel_y = -6 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/science/lab) -"jhu" = ( -/obj/structure/light_construct/directional/east, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"jhB" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/cytology) -"jhL" = ( -/obj/structure/rack, -/obj/item/storage/box/lights/mixed, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/stack/package_wrap, -/obj/item/stack/sheet/glass{ - amount = 30 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"jhT" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jhV" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"jia" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jik" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"jiz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/sink{ - dir = 8; - pixel_x = 12 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"jiA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"jiG" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"jiO" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/light_switch/directional/south{ - pixel_x = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "chapel_shutters_space"; - name = "chapel shutters control"; - pixel_x = -6 - }, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"jiR" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"jjp" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"jjM" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/captain/private) -"jjQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"jkv" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/security/range) -"jkE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"jkQ" = ( -/obj/structure/table, -/obj/item/phone{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jlf" = ( -/obj/structure/table/wood, -/obj/item/staff/broom, -/obj/item/wrench, -/obj/machinery/airalarm/directional/east, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"jll" = ( -/obj/machinery/light/small/broken/directional/south, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"jln" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"jlw" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jlG" = ( -/obj/structure/table/reinforced, -/obj/item/storage/backpack/duffelbag/med/surgery, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"jlJ" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/aft) -"jlT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"jmc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"jmD" = ( -/obj/structure/table/reinforced, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/assembly/prox_sensor{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"jmL" = ( -/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/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/crowbar, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/item/grenade/chem_grenade/smart_metal_foam, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/item/stock_parts/cell/emproof{ - pixel_x = -6; - pixel_y = 2 - }, -/obj/item/stock_parts/cell/emproof{ - pixel_x = 4; - pixel_y = 6 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"jmO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"jmQ" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - Middle Arm" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"jmZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"jnd" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"jng" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jnx" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/medical) -"jnH" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"jnU" = ( -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"jnW" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"jnX" = ( -/obj/item/candle, -/obj/machinery/light_switch/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"jou" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/light/directional/west, -/obj/item/banner/cargo/mundane, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/turf/open/floor/iron, -/area/station/cargo/storage) -"jow" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/start/assistant, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/east{ - id = "AuxToilet2"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"joB" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"joJ" = ( -/obj/machinery/camera{ - c_tag = "Warden's Office"; - dir = 10 - }, -/obj/structure/table, -/obj/machinery/button/door{ - desc = "Controls the shutters over the cell windows."; - id = "Secure Gate"; - name = "Cell Window Control"; - pixel_x = -6; - pixel_y = 7; - req_access_txt = "63"; - specialfunctions = 4 - }, -/obj/machinery/button/door{ - desc = "Controls the shutters over the brig windows."; - id = "briglockdown"; - name = "Brig Lockdown Control"; - pixel_x = 6; - pixel_y = 7; - req_access_txt = "63" - }, -/obj/machinery/button/door{ - desc = "Controls the blast doors in front of the prison wing."; - id = "Prison Gate"; - name = "Prison Wing Lockdown"; - pixel_y = -3; - req_access_txt = "2" - }, -/obj/item/key/security, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"joV" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"joX" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"jpf" = ( -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"jpn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"jps" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"jpJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/chapel/office) -"jpN" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jpP" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger, -/obj/structure/cable, -/obj/machinery/camera/directional/east{ - c_tag = "Security Post - Research Division"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"jqt" = ( -/obj/machinery/modular_computer/console/preset/engineering{ - icon_state = "console"; - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"jqx" = ( -/obj/effect/decal/cleanable/food/flour, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jqz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/green/filled/corner, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jqA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jqB" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"jqC" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jqI" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/morphine, -/obj/item/storage/box/chemimp{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/storage/box/trackimp, -/obj/item/storage/lockbox/loyalty, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"jqN" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"jqS" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/engineering/main) -"jqU" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"jrk" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - name = "Cargo Bay Maintenance"; - req_one_access_txt = "31;48" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"jro" = ( -/obj/structure/chair/office, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/service/library) -"jrw" = ( -/obj/structure/closet/emcloset, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"jrx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"jry" = ( -/obj/structure/table/wood/fancy/orange, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = -1; - pixel_y = -2 - }, -/obj/item/lighter{ - pixel_x = 11; - pixel_y = -7 - }, -/obj/item/coin/gold{ - pixel_x = 9; - pixel_y = 9 - }, -/turf/open/floor/carpet/red, -/area/station/cargo/qm) -"jrB" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge Access"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-left" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"jrJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"jrW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "1;4;38;12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"jsA" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"jsE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"jsI" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"jsN" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"jsU" = ( -/obj/machinery/keycard_auth/directional/east, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"jsY" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/mask/muzzle, -/obj/item/electropack, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"jto" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"jtP" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/station/service/library) -"jtY" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_exterior"; - name = "Virology Exterior Airlock"; - req_access_txt = "39" - }, -/obj/machinery/door_buttons/access_button{ - dir = 1; - 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 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"jue" = ( -/turf/closed/wall/mineral/plastitanium, -/area/station/security/prison) -"jul" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/virology{ - autoclose = 0; - frequency = 1449; - id_tag = "virology_airlock_interior"; - name = "Virology Interior Airlock"; - req_access_txt = "39" - }, -/obj/machinery/door_buttons/access_button{ - idDoor = "virology_airlock_interior"; - idSelf = "virology_airlock_control"; - name = "Virology Access Button"; - pixel_x = 8; - pixel_y = -24; - req_access_txt = "39" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"jun" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"jur" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/item/multitool, -/obj/item/stock_parts/cell/high, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"juD" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"juG" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"juK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"juM" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/mixing) -"juP" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/lab) -"jve" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jvt" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"jvv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"jvw" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/station/solars/port/fore) -"jvx" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"jvO" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/mob/living/simple_animal/bot/secbot/pingsky, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"jvV" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"jwd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Storage"; - req_access_txt = "10" - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"jwj" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"jws" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"jwu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"jwA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"jwJ" = ( -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/medical/virology) -"jwM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"jwV" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/computer/gateway_control{ - dir = 8 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"jxE" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) -"jxI" = ( -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"jxO" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/detectives_office) -"jxU" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"jxY" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jyd" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/assembly/timer{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/assembly/timer{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/assembly/timer{ - pixel_x = 6; - pixel_y = -4 - }, -/obj/item/assembly/timer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"jyv" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"jyx" = ( -/obj/item/kirbyplants/random, -/obj/machinery/firealarm/directional/west{ - pixel_y = -9 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"jyz" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/maintenance/aft/lesser) -"jyK" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"jyZ" = ( -/obj/machinery/door/poddoor/shutters{ - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/machinery/door/window/right/directional/south{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/security/prison) -"jzH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jzM" = ( -/obj/structure/cable, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"jzZ" = ( -/obj/machinery/conveyor/inverted{ - dir = 10; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"jAb" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"jAq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/medical/patient_stretcher, -/obj/item/food/pizzaslice/moldy/bacteria, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"jAu" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/roller, -/obj/item/roller{ - pixel_y = 3 - }, -/obj/item/roller{ - pixel_y = 6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"jAy" = ( -/obj/effect/landmark/start/station_engineer, -/obj/machinery/light/directional/west, -/obj/structure/sign/warning/electricshock{ - pixel_x = -31 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"jAH" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"jAT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"jBb" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/station/dispenser{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"jBr" = ( -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = -8 - }, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/secondary/command) -"jBt" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/vacant_room/commissary) -"jBV" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/north, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/healthanalyzer, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"jBW" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "External Waste Ports to Filter" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jBZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Virology Central Hallway"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"jCh" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jCA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"jCW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"jCZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"jDi" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"jDl" = ( -/obj/structure/rack, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"jDn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"jDo" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/service/theater) -"jDE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"jDH" = ( -/obj/structure/closet/l3closet, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"jDM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Dock Maintenance"; - req_access_txt = "48" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"jEj" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"jEp" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"jEr" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/holopad/secure, -/obj/machinery/flasher/directional/west{ - id = "AI"; - pixel_y = -26 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"jEz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"jED" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"jEF" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = 6; - pixel_y = 7 - }, -/obj/item/camera_film{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"jEJ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"jEO" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"jEX" = ( -/obj/machinery/seed_extractor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"jFa" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"jFc" = ( -/obj/structure/showcase/machinery/microwave{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"jFe" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Pharmacy Maintenance"; - req_access_txt = "69" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"jFj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"jFo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"jFt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jFu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"jFz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/service/theater) -"jFA" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"jFF" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"jFJ" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/bodycontainer/morgue{ - 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/iron/dark, -/area/station/medical/morgue) -"jFR" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"jGa" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"jGm" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/mob/living/simple_animal/parrot/poly, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"jGD" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"jHk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"jHt" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 4 - }, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"jHu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"jHB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) -"jHK" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "Security Deliveries" - }, -/obj/structure/plasticflaps/opaque{ - name = "Security Deliveries" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/departments/security{ - color = "#DE3A3A"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"jHP" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/maintenance/directional/south, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"jHS" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/landmark/start/chaplain, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"jIg" = ( -/obj/structure/table, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/item/radio/off, -/obj/item/multitool, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"jIl" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jIn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"jIq" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/obj/structure/cable, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/break_room) -"jIt" = ( -/obj/structure/sign/poster/official/get_your_legs{ - pixel_y = 32 - }, -/obj/structure/chair/sofa/right, -/obj/item/toy/plush/moth{ - name = "Mender Moff" - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) -"jIF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"jIG" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"jIK" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"jIO" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"jIP" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/storage/tech) -"jIS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-toxins-passthrough" - }, -/turf/open/floor/plating, -/area/station/science/mixing/hallway) -"jIZ" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/library) -"jJa" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-maint-passthrough" - }, -/obj/machinery/door/airlock/research{ - name = "Xenobiology Access"; - req_access_txt = "47" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"jJm" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Chapel - Funeral Parlour" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ - pixel_x = 24 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"jJq" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/anesthetic_mix, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"jJC" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/space, -/area/space/nearstation) -"jJP" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"jJT" = ( -/obj/machinery/light/directional/south, -/obj/machinery/button/door/directional/south{ - id = "roboticsprivacy2"; - name = "Robotics Privacy Control"; - req_access_txt = "29" - }, -/obj/item/mod/core/standard{ - pixel_x = -4 - }, -/obj/item/mod/core/standard{ - pixel_x = 4 - }, -/obj/item/mod/core/standard{ - pixel_y = 4 - }, -/obj/structure/closet/crate/science{ - name = "MOD core crate" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"jKe" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"jKn" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"jKo" = ( -/obj/structure/bed, -/obj/item/bedsheet, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/medical) -"jKs" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"jKu" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"jKz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"jKO" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"jKW" = ( -/obj/structure/sign/directions/medical{ - pixel_y = -7 - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/pharmacy) -"jLv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/light_construct/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"jLw" = ( -/obj/structure/marker_beacon/burgundy, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"jLE" = ( -/obj/structure/sign/plaques/kiddie/perfect_man{ - pixel_y = 32 - }, -/obj/structure/window/reinforced, -/obj/effect/spawner/random/decoration/showcase, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"jLG" = ( -/obj/machinery/vending/wardrobe/jani_wardrobe, -/turf/open/floor/iron, -/area/station/service/janitor) -"jLR" = ( -/obj/effect/landmark/secequipment, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/security/office) -"jLU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"jMa" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"jMi" = ( -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/lesser) -"jMn" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"jMp" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/space/basic, -/area/space/nearstation) -"jMv" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"jMP" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"jNp" = ( -/obj/structure/railing/corner, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"jNC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"jNH" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"jNK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"jOi" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jOn" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"jOp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"jOK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/lab) -"jOR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"jPJ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/space/basic, -/area/space/nearstation) -"jPR" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"jPY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"jQb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"jQg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"jQp" = ( -/obj/machinery/door/poddoor/shutters{ - id = "visitation"; - name = "Visitation Shutters" - }, -/obj/machinery/door/window/left/directional/south{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/security/prison) -"jQE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"jQH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"jQK" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"jQL" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/paper, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"jQY" = ( -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 4; - name = "Hot Loop Supply" - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"jQZ" = ( -/obj/item/storage/box/syringes, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"jRc" = ( -/obj/structure/table, -/obj/item/storage/toolbox/electrical, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/engine_smes) -"jRm" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/command/gateway) -"jRo" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Labor Shuttle Dock" - }, -/obj/machinery/gulag_item_reclaimer{ - pixel_y = 24 - }, -/obj/machinery/flasher/directional/east{ - id = "PRelease"; - pixel_y = 20 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/fore) -"jRw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"jRA" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"jRR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/restaurant_portal/bar, -/turf/open/floor/wood, -/area/station/commons/lounge) -"jRT" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/turf/open/floor/wood, -/area/station/service/library) -"jRX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/grunge{ - name = "Morgue"; - req_access_txt = "5;6" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"jSb" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"jSm" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"jSr" = ( -/obj/machinery/computer/secure_data{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"jSw" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio7"; - layer = 3.3; - name = "Xenobio Pen 7 Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"jSC" = ( -/obj/structure/light_construct/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"jSF" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"jSH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"jSI" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/storage/tech) -"jSL" = ( -/obj/structure/closet/athletic_mixed, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"jTk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible/layer5, -/obj/machinery/light/no_nightlight/directional/south, -/obj/structure/sign/poster/official/wtf_is_co2{ - pixel_y = -32 - }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"jTp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/item/stack/cable_coil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"jTu" = ( -/obj/item/kirbyplants{ - icon_state = "plant-11" - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"jTC" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Telecomms - Server Room - Aft-Starboard"; - network = list("ss13","tcomms") - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"jTI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"jUt" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"jUB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"jUF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"jUK" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/toilet/auxiliary) -"jVJ" = ( -/obj/machinery/button/door/directional/north{ - id = "hop"; - name = "Privacy Shutters Control"; - req_access_txt = "28" - }, -/obj/machinery/computer/accounting, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"jVO" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"jVR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"jWa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"jXc" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/service/theater) -"jXe" = ( -/obj/structure/lattice, -/obj/item/wirecutters, -/turf/open/space/basic, -/area/space/nearstation) -"jXg" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"jXj" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/camera/directional/east{ - c_tag = "Prison Isolation Cell"; - network = list("ss13","prison","isolation") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"jXp" = ( -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/structure/table/wood, -/obj/item/taperecorder{ - pixel_x = 8; - pixel_y = -1 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"jXw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/status_display/evac/directional/east, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jXx" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/mob/living/simple_animal/chicken{ - name = "Kentucky"; - real_name = "Kentucky" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"jXC" = ( -/obj/structure/bodycontainer/morgue, -/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/iron/dark, -/area/station/medical/morgue) -"jXG" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"jXL" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"jXY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/scientist, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"jYa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) -"jYe" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jYt" = ( -/obj/machinery/door/poddoor/massdriver_chapel, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"jYH" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"jYU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/security/office) -"jZd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"jZi" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) -"jZv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"jZB" = ( -/obj/structure/rack, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/storage/toolbox/emergency, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"jZC" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"jZS" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/sign/departments/botany{ - pixel_x = 32 - }, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"jZV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"jZY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"kai" = ( -/obj/machinery/holopad/secure, -/turf/open/floor/iron/dark, -/area/station/security/office) -"kaj" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/extinguisher, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"kao" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"kas" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/structure/table/wood, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"kaE" = ( -/obj/machinery/vending/wardrobe/cargo_wardrobe, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kaY" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"kbe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"kbB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"kbT" = ( -/obj/structure/cable, -/obj/machinery/power/emitter/welded{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"kbY" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"kce" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Waste to Filter" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"kcr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"kcu" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/virology) -"kcG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"kcX" = ( -/obj/structure/rack, -/obj/item/integrated_circuit/loaded/hello_world, -/obj/item/integrated_circuit/loaded/speech_relay, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"kda" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"kde" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"kdo" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"kdp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"kdD" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/maintenance/three, -/obj/structure/closet/crate/medical, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"kee" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"ker" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"keB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"keE" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"keG" = ( -/obj/machinery/light/directional/north, -/obj/structure/table, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/mask/surgical, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = -10; - pixel_y = -1 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"keN" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"keP" = ( -/obj/docking_port/stationary/random{ - id = "pod_2_lavaland"; - name = "lavaland" - }, -/turf/open/space, -/area/space) -"keY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/north{ - c_tag = "Brig - Hallway - Port" - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/brig) -"kfa" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/vending/wardrobe/robo_wardrobe, -/obj/machinery/button/door/directional/north{ - id = "roboticsprivacy"; - name = "Robotics Privacy Control"; - pixel_x = -24; - req_access_txt = "29" - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"kfk" = ( -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 6; - pixel_y = -1 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -5; - pixel_y = 2 - }, -/obj/structure/table/wood, -/obj/structure/light_construct/small/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"kfm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = -32 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"kfn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing, -/turf/open/floor/iron/stairs/right{ - dir = 8 - }, -/area/station/engineering/atmospherics_engine) -"kfx" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/storage_shared) -"kfy" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/security/prison) -"kgf" = ( -/obj/item/kirbyplants/random, -/obj/machinery/airalarm/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"kgg" = ( -/obj/structure/railing, -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"kgl" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"kgp" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/item/storage/belt/utility, -/obj/item/storage/toolbox/electrical, -/obj/item/radio/off, -/obj/item/hand_labeler, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"kgr" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"kgt" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/secondary/command) -"kgD" = ( -/obj/structure/chair, -/obj/item/radio/intercom/chapel/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"kgH" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"kgL" = ( -/obj/structure/table/optable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"kgQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"kgZ" = ( -/obj/structure/rack, -/obj/item/clothing/under/color/white, -/obj/item/clothing/head/soft/mime, -/obj/item/clothing/under/color/white, -/obj/item/clothing/head/soft/mime, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/mask/surgical, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"khh" = ( -/obj/structure/table/reinforced, -/obj/structure/cable, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"khj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"khq" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"khu" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port) -"khE" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"khS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Recreation Area" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"khY" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/prison) -"kie" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Air to Pure" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"kig" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/xenobiology/hallway) -"kiq" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/raw_anomaly_core/random{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/raw_anomaly_core/random{ - pixel_x = 7; - pixel_y = 9 - }, -/obj/item/raw_anomaly_core/random, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"kiw" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"kiE" = ( -/obj/item/book/manual/nuclear, -/turf/open/floor/plating/foam{ - temperature = 2.7 - }, -/area/space/nearstation) -"kiM" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"kiY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"kjg" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"kjv" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/photocopier, -/turf/open/floor/wood, -/area/station/service/library) -"kjG" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"kjJ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kjK" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/machinery/camera/directional/north{ - c_tag = "Bar - Fore" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/commons/lounge) -"kjX" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"kjY" = ( -/obj/structure/chair{ - pixel_y = -2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"kke" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/research) -"kkl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"kkn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"kkA" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"kkO" = ( -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"kll" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/storage/gas) -"klR" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"klW" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Primary Treatment Centre"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"kmj" = ( -/obj/structure/window/reinforced, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable, -/obj/effect/spawner/random/decoration/showcase, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"kmw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"kmA" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/prison) -"kmC" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"kmP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kmR" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Security - EVA Storage" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"knc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"knj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "E.V.A. Storage"; - req_access_txt = "18" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"kny" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"knF" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"knP" = ( -/obj/machinery/light/directional/west, -/obj/machinery/computer/camera_advanced/base_construction/aux{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"koo" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-maint-passthrough" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/science/research) -"koy" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"koC" = ( -/obj/machinery/camera/autoname{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"koH" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/components/binary/tank_compressor{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"koV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"kpc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"kpe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"kph" = ( -/obj/item/newspaper, -/obj/structure/table, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"kpj" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kps" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Teleporter Room" - }, -/obj/structure/rack, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"kpA" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"kpF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"kpG" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/secondary/command) -"kqO" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"kqR" = ( -/obj/machinery/suit_storage_unit/hos, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"kqU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"krt" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/shaker, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"krz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"krK" = ( -/obj/structure/cable, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/flip{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"krR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"krX" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"ksk" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/nuke_storage) -"ksD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Access"; - req_one_access_txt = "32;19" - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/preopen{ - id = "transitlockdown" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"ksL" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"ksY" = ( -/obj/machinery/space_heater, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"kta" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/medical/psychology) -"kte" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageSort2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"ktj" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/rack, -/obj/item/tank/internals/anesthetic, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"ktm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"ktt" = ( -/obj/machinery/turretid{ - control_area = "/area/station/ai_monitored/turret_protected/ai_upload"; - icon_state = "control_stun"; - name = "AI Upload turret control"; - pixel_y = 28 - }, -/obj/item/radio/intercom/directional/north{ - broadcasting = 1; - frequency = 1447; - name = "Private Channel"; - pixel_x = -26 - }, -/obj/effect/landmark/start/cyborg, -/obj/machinery/light/small/directional/west, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the AI Upload."; - dir = 4; - name = "AI Upload Monitor"; - network = list("aiupload"); - pixel_x = -29 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"ktB" = ( -/obj/machinery/computer/prisoner/gulag_teleporter_computer{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"ktN" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"ktO" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/qm) -"ktQ" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ktS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/service/janitor) -"ktU" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"ktW" = ( -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"ktY" = ( -/obj/item/storage/secure/safe/directional/north{ - name = "armory safe A" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"kuc" = ( -/obj/machinery/computer/teleporter{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/command/teleporter) -"kul" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/detectives_office) -"kuz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"kuB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"kuD" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"kuJ" = ( -/obj/machinery/door/airlock{ - name = "Central Emergency Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"kuX" = ( -/obj/machinery/vending/cigarette, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"kuY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kuZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"kvf" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"kvg" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"kvj" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"kvt" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"kvu" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"kvw" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = 7; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/spawner/random/entertainment/deck{ - pixel_x = -6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"kvC" = ( -/obj/structure/closet/secure_closet/bar{ - req_access_txt = "25" - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/service/bar) -"kvD" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"kvN" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"kvR" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/central) -"kwq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/button/door/directional/south{ - id = "gateshutter"; - name = "Gateway Shutter Control"; - pixel_y = -34; - req_access_txt = "19" - }, -/obj/machinery/button/door/directional/south{ - id = "evashutter"; - name = "E.V.A. Storage Shutter Control"; - req_access_txt = "19" - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"kwF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"kwP" = ( -/obj/machinery/camera/directional/north, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"kwV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/security/office) -"kxn" = ( -/obj/machinery/airalarm/server{ - dir = 8; - pixel_x = -22 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Telecomms - Server Room - Aft-Port"; - network = list("ss13","tcomms") - }, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"kxo" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/item/clothing/head/that, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/bar) -"kxq" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/porta_turret/ai, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 8; - pixel_x = 28 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"kxB" = ( -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"kxY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"kyr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/prison) -"kyv" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/cafeteria, -/area/station/commons/dorms) -"kyC" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/disposal/incinerator) -"kyN" = ( -/obj/machinery/photocopier{ - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"kyP" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"kyS" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/rods, -/turf/open/space/basic, -/area/station/solars/port/fore) -"kyW" = ( -/obj/structure/table, -/obj/item/wirecutters, -/obj/item/screwdriver{ - pixel_x = -2; - pixel_y = 10 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/syndicatebomb/training, -/turf/open/floor/iron, -/area/station/security/office) -"kzp" = ( -/obj/effect/landmark/event_spawn, -/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/iron/dark, -/area/station/medical/morgue) -"kzr" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kzC" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"kzK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/lab) -"kzV" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/treatment, -/obj/item/stock_parts/subspace/treatment, -/obj/item/stock_parts/subspace/treatment, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"kAa" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"kAg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"kAo" = ( -/obj/effect/turf_decal/trimline/blue/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"kAv" = ( -/obj/structure/table, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = -5 - }, -/obj/item/stock_parts/scanning_module{ - pixel_x = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"kAy" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/lockers) -"kAN" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"kAP" = ( -/obj/structure/table, -/obj/item/flashlight/lamp, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"kBa" = ( -/obj/machinery/portable_atmospherics/canister/hydrogen, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"kBg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"kBj" = ( -/obj/structure/rack, -/obj/effect/landmark/blobstart, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"kBm" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"kBv" = ( -/obj/machinery/exodrone_launcher, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"kBD" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/reagentgrinder{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = -6 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Bar - Counter" - }, -/obj/structure/table, -/obj/machinery/requests_console/directional/south{ - department = "Bar"; - departmentType = 2; - name = "Bar Requests Console" - }, -/turf/open/floor/iron, -/area/station/service/bar) -"kBI" = ( -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"kBS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Detective Maintenance"; - req_access_txt = "4" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"kBZ" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/wood, -/area/station/service/library) -"kCb" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"kCd" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"kCo" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;35" - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"kCF" = ( -/obj/structure/closet/wardrobe/grey, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"kCH" = ( -/obj/machinery/door/firedoor, -/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/iron/dark, -/area/station/medical/medbay/central) -"kDb" = ( -/obj/structure/table, -/obj/item/food/mint, -/obj/item/kitchen/rollingpin, -/obj/item/reagent_containers/food/condiment/enzyme{ - layer = 5 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 5 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"kDc" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"kDL" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"kEj" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"kEt" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"kEV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"kFa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"kFf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"kFg" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"kFj" = ( -/obj/machinery/light/small/directional/west, -/obj/item/clothing/mask/animal/horsehead, -/obj/structure/table/wood, -/obj/machinery/airalarm/directional/south, -/obj/item/clothing/mask/cigarette/pipe, -/obj/item/clothing/mask/fakemoustache, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/wood, -/area/station/service/theater) -"kFl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"kFz" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"kGb" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/rack, -/obj/item/wrench, -/obj/item/crowbar/red, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"kGj" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"kGn" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"kGz" = ( -/obj/structure/closet/wardrobe/black, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"kGI" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"kGT" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/open/floor/plating, -/area/station/service/hydroponics) -"kGW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/restraints/legcuffs/beartrap, -/obj/item/restraints/legcuffs/beartrap, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/service/janitor) -"kHd" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"kHr" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/briefcase{ - desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; - name = "\improper Nanotrasen-brand secure briefcase exhibit"; - pixel_y = 2 - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"kHF" = ( -/obj/machinery/door/poddoor{ - id = "SecJusticeChamber"; - name = "Justice Vent" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/security/execution/education) -"kHH" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/hangover, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"kHI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"kIb" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"kIh" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"kIq" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"kIr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"kIw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kIC" = ( -/obj/machinery/recharger{ - pixel_y = 3 - }, -/obj/item/restraints/handcuffs{ - pixel_y = 3 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"kIP" = ( -/obj/structure/table, -/obj/item/pen/red{ - pixel_x = 8; - pixel_y = 15 - }, -/obj/item/gps{ - gpstag = "QM0"; - pixel_x = -4; - pixel_y = 10 - }, -/obj/item/pen/fountain{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/item/pen/blue{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kIY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"kJd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"kJe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"kJt" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/table/reinforced, -/obj/item/storage/box/bodybags, -/obj/item/pen, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"kJA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"kJG" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"kJL" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #4"; - dir = 6; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"kJM" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"kJS" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"kJT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"kKb" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"kKe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"kKj" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet3"; - name = "Unit 3" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"kKm" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"kKn" = ( -/turf/open/floor/carpet, -/area/station/service/chapel) -"kKA" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kKH" = ( -/obj/structure/table/wood, -/obj/item/taperecorder{ - pixel_x = 3 - }, -/obj/item/storage/box/evidence, -/obj/item/flashlight/seclite, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"kKN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"kLb" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"kLg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"kLo" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/item/pen, -/obj/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"kLt" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) -"kLA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"kLG" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"kLK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"kMi" = ( -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/structure/crate_empty, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"kMy" = ( -/obj/structure/cable, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"kMz" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"kMN" = ( -/obj/structure/table, -/obj/item/stack/cable_coil{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/stack/cable_coil, -/obj/item/stock_parts/cell/high, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"kMR" = ( -/obj/machinery/door/airlock/mining{ - name = "Deliveries"; - req_one_access_txt = "50" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"kMU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"kMY" = ( -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/table/reinforced, -/obj/machinery/requests_console/directional/north{ - department = "Security"; - departmentType = 3; - name = "Security Requests Console" - }, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Security Post - Medbay"; - network = list("ss13","medbay") - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"kNa" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"kNb" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/processor{ - pixel_y = 12 - }, -/obj/effect/turf_decal/bot, -/obj/structure/table, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"kNn" = ( -/obj/effect/spawner/random/structure/chair_maintenance, -/obj/item/toy/plush/pkplush{ - name = "Hug Emoji" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"kNN" = ( -/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/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kNU" = ( -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"kNW" = ( -/obj/structure/table/wood, -/obj/item/clothing/glasses/monocle, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"kOu" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"kOC" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1; - name = "server vent" - }, -/turf/open/floor/circuit/telecomms/server, -/area/station/science/server) -"kOE" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/aft) -"kOI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"kOW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/side, -/area/station/medical/treatment_center) -"kPq" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"kPu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"kPG" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"kPJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/genetics) -"kQc" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 8 - }, -/obj/item/kirbyplants/random, -/obj/structure/sign/warning/coldtemp{ - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"kQw" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"kQx" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/item/weldingtool, -/obj/item/clothing/head/welding, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"kQN" = ( -/obj/effect/spawner/random/trash/caution_sign, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"kRn" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Secure Gear Storage"; - req_access_txt = "3" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"kRP" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"kRS" = ( -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/sec{ - pixel_y = 7 - }, -/obj/item/storage/backpack/duffelbag/sec, -/turf/open/floor/iron/dark, -/area/station/security/office) -"kRT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Cytology Lab - Worklab"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"kSd" = ( -/obj/structure/closet{ - name = "Evidence Closet 3" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"kSg" = ( -/obj/structure/rack, -/obj/item/storage/box, -/obj/effect/turf_decal/bot, -/obj/item/radio/off{ - pixel_x = 6 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"kSr" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"kSC" = ( -/obj/structure/table, -/obj/item/clothing/under/rank/prisoner/skirt{ - pixel_x = -13; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/prisoner/skirt{ - pixel_x = 9; - pixel_y = 5 - }, -/obj/item/clothing/under/rank/prisoner{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"kSV" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/engineering/main) -"kSW" = ( -/obj/machinery/light/directional/north, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/engineering/main) -"kTh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"kTA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/botanist, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"kTF" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Interrogation room"; - network = list("interrogation") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"kTH" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"kTS" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/office) -"kTX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/storage) -"kTY" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"kUo" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"kUq" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/kirbyplants/photosynthetic, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) -"kUt" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"kUD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kUH" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/iv_drip, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"kUQ" = ( -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"kVb" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/ai_upload) -"kVU" = ( -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"kWa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"kWh" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/red, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"kWl" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 2"; - name = "Cell 2" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig) -"kWq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"kWz" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/iv_drip, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"kWE" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Departure Lounge - Starboard Aft" - }, -/obj/machinery/light/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"kWM" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Containment Pen #3"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"kWP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"kWT" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/transit_tube) -"kXd" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"kXp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/carpet, -/area/station/service/chapel) -"kXu" = ( -/obj/machinery/door/poddoor/shutters{ - id = "abandoned_kitchen" - }, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"kXz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"kXP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"kXQ" = ( -/obj/structure/frame/machine{ - anchored = 1 - }, -/turf/open/floor/circuit/green/off, -/area/station/science/research) -"kXR" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"kYe" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"kYf" = ( -/obj/machinery/camera/directional/south{ - c_tag = "RD Observation Cage"; - network = list("ss13","rd") - }, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) -"kYs" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/cargo/qm) -"kYB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"kYE" = ( -/obj/structure/cable, -/obj/structure/chair/office/light, -/obj/effect/landmark/start/virologist, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"kYK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"kYP" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"kZg" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"kZE" = ( -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"kZJ" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"kZM" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"kZS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - icon_state = "right"; - name = "Shooting Range" - }, -/turf/open/floor/iron, -/area/station/security/range) -"kZT" = ( -/obj/machinery/door/poddoor/incinerator_atmos_main, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"lae" = ( -/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/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"lak" = ( -/obj/structure/cable, -/obj/structure/bed/roller, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"lan" = ( -/obj/machinery/air_sensor/nitrogen_tank, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"lao" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"laG" = ( -/obj/machinery/modular_computer/console/preset/cargochat/engineering, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"laH" = ( -/obj/structure/table/reinforced, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/clothing/gloves/color/latex/nitrile, -/obj/item/wrench/medical, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"laS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Surgery C Maintenance"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"laV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Art Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"lbd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"lbf" = ( -/obj/item/stock_parts/cell/high, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"lbj" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/science/research) -"lbo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"lbp" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/table/wood, -/obj/item/folder/white{ - pixel_x = -14; - pixel_y = 3 - }, -/obj/item/paper_bin/carbon{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/pen, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"lbP" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lbR" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/office) -"lbU" = ( -/obj/structure/sign/departments/science, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/lobby) -"lci" = ( -/obj/machinery/light_switch/directional/west, -/obj/structure/table, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/obj/item/transfer_valve{ - pixel_x = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"lcq" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lcC" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.5-Recreation"; - location = "14.3-Lockers-Dorms" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"lcF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"lcN" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Genetics Maintenance"; - req_access_txt = "9" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"lcW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"ldb" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"lde" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/bar) -"ldO" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/storage/eva) -"led" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"lel" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"les" = ( -/obj/effect/turf_decal/tile/dark, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"lev" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"lew" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Captain's Bedroom"; - req_access_txt = "20" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"leB" = ( -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port) -"leC" = ( -/obj/machinery/door/airlock/grunge{ - name = "Vacant Office" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/vacant_room/office) -"leP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"lfh" = ( -/obj/effect/spawner/random/engineering/vending_restock, -/turf/open/floor/plating, -/area/station/maintenance/port) -"lfA" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Isolation A"; - req_access_txt = "39" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"lfI" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"lfM" = ( -/obj/structure/table, -/obj/item/inspector{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/inspector{ - pixel_x = 5 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"lfN" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/poddoor/shutters{ - id = "mechbay"; - name = "Mech Bay Shutters" - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"lfQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/table/glass, -/obj/item/storage/box/petridish{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/storage/box/petridish{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/machinery/requests_console/directional/east{ - department = "Xenobiology"; - name = "Xenobiology Requests Console"; - receive_ore_updates = 1 - }, -/obj/machinery/button/door/directional/south{ - id = "XenoPens"; - name = "Xenobiology Shutters"; - req_access_txt = "55" - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"lgb" = ( -/obj/structure/table/wood, -/obj/item/clothing/head/sombrero, -/obj/structure/sign/poster/random/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) -"lgg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"lgk" = ( -/obj/machinery/vending/wardrobe/hydro_wardrobe, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small/directional/north, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"lgo" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/science/xenobiology) -"lgw" = ( -/turf/open/floor/carpet, -/area/station/service/library) -"lgD" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron, -/area/station/science/mixing) -"lgQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"lgW" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"lgY" = ( -/obj/structure/table, -/obj/item/multitool{ - pixel_x = 4; - pixel_y = 12 - }, -/obj/item/multitool{ - pixel_x = -4; - pixel_y = 8 - }, -/obj/structure/table, -/obj/item/stock_parts/cell/high{ - pixel_y = -4 - }, -/obj/item/stock_parts/cell/high{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/item/multitool{ - pixel_y = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"lhd" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"lhr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"lhC" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"lhE" = ( -/obj/structure/table/glass, -/obj/item/clothing/gloves/color/latex, -/obj/item/healthanalyzer, -/obj/item/clothing/glasses/hud/health, -/obj/item/clothing/glasses/science, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"lhK" = ( -/obj/machinery/door/poddoor/shutters{ - id = "teleshutter"; - name = "Teleporter Access Shutter" - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/button/door/directional/east{ - id = "teleshutter"; - name = "Teleporter Shutter Control"; - pixel_y = 5; - req_access_txt = "19" - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"lhL" = ( -/obj/machinery/chem_master, -/obj/structure/noticeboard/directional/south, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"lhN" = ( -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"lhR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) -"lib" = ( -/obj/structure/closet/secure_closet/hos, -/obj/item/clothing/shoes/cowboy/black, -/obj/machinery/camera/directional/north{ - c_tag = "Head of Security's Office" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"lic" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"lim" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/chamber) -"lip" = ( -/obj/structure/sign/warning/testchamber, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"liq" = ( -/obj/structure/window/reinforced, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/cable, -/obj/effect/spawner/random/decoration/showcase, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"ljb" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) -"ljv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"ljG" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"ljN" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"ljU" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"ljV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"lkg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = 23 - }, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"lks" = ( -/obj/machinery/door/airlock{ - name = "Unisex Showers" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"lkz" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lkF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail{ - dir = 8; - sortType = 21 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"lkO" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"lkU" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"llc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"lle" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"llf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/warden) -"llh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lli" = ( -/obj/structure/table, -/obj/item/food/grown/wheat, -/obj/item/food/grown/watermelon, -/obj/item/food/grown/citrus/orange, -/obj/item/food/grown/grapes, -/obj/item/food/grown/cocoapod, -/obj/item/food/grown/apple, -/obj/item/food/grown/chili, -/obj/item/food/grown/cherries, -/obj/item/food/grown/soybeans, -/obj/item/food/grown/citrus/lime, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"llm" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"llx" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"llM" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/mixing/launch) -"llX" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"lmk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/medical) -"lmr" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"lmx" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) -"lmC" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/keycard_auth/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"lmF" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"lmH" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lmS" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/storage/medkit/o2{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/o2, -/obj/item/storage/medkit/o2{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"lnt" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"lnz" = ( -/obj/structure/closet/secure_closet/hydroponics, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"lnN" = ( -/obj/structure/table, -/obj/item/storage/bag/construction, -/obj/item/storage/bag/construction, -/obj/item/storage/bag/construction, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/structure/sign/poster/official/build{ - pixel_x = 32 - }, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"lnQ" = ( -/obj/structure/chair/comfy/black{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"lnX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"log" = ( -/obj/structure/rack, -/obj/item/toy/plush/lizard_plushie/green{ - name = "Given-As-Compensation" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"low" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"lox" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"loR" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"lpd" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 8 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"lps" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"lpt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"lpz" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/button/door{ - id = "xenobio6"; - layer = 3.3; - name = "Xenobio Pen 6 Blast Doors"; - pixel_y = 1; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"lpV" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/sign/departments/court{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"lqa" = ( -/obj/structure/table/reinforced, -/obj/item/kitchen/fork/plastic, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"lqn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "commissaryshutter"; - name = "Vacant Commissary Shutter" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"lqz" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/cargo/qm) -"lqA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Courtroom"; - req_access_txt = "42" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"lqG" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"lqI" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"lqP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"lqR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"lqU" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lra" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"lrh" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lrn" = ( -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"lro" = ( -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"lry" = ( -/obj/machinery/door/airlock{ - name = "Maintenance Bathroom"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"lrI" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/computer/cargo{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"lrP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/lab) -"lrY" = ( -/obj/structure/table/optable, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"lsj" = ( -/obj/machinery/light/directional/west, -/obj/machinery/button/flasher{ - id = "IsolationFlash"; - pixel_x = -23; - pixel_y = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"lsv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"lsP" = ( -/obj/effect/spawner/random/structure/table, -/obj/effect/spawner/random/decoration/generic, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"lsT" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"lsU" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"ltn" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lty" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ltB" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"ltH" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ltL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/service_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"ltP" = ( -/obj/machinery/computer/cargo{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor"; - layer = 4; - name = "Loading Doors"; - pixel_y = -8; - req_access_txt = "31" - }, -/obj/machinery/button/door/directional/west{ - id = "QMLoaddoor2"; - layer = 4; - name = "Loading Doors"; - pixel_y = 8; - req_access_txt = "31" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"lup" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/flasher/directional/south{ - id = "AI"; - pixel_x = 26 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"luw" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"luD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"luT" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"lvH" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/button/door/directional/south{ - id = "ceprivacy"; - name = "Privacy Shutters Control" - }, -/obj/machinery/pdapainter/engineering, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"lvY" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"lvZ" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"lwf" = ( -/obj/effect/landmark/start/head_of_personnel, -/obj/structure/chair/office{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"lwh" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"lwA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"lwB" = ( -/obj/machinery/door/airlock/external{ - name = "Space Shack" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"lwJ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"lwL" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/table, -/obj/machinery/firealarm/directional/north, -/obj/item/stack/sheet/iron/five, -/obj/item/radio/intercom/directional/east{ - pixel_y = 8 - }, -/obj/item/stack/cable_coil/five, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"lwZ" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"lxh" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"lxj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Fore Primary Hallway Cells" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"lxr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"lxO" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"lxR" = ( -/obj/machinery/door/window/right/directional/east{ - name = "Danger: Conveyor Access"; - req_access_txt = "12" - }, -/obj/machinery/conveyor/inverted{ - dir = 10; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"lxZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/chem_heater/withbuffer, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"lye" = ( -/turf/open/floor/iron, -/area/station/engineering/atmos) -"lyl" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lyn" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/lounge) -"lyp" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Air to Mix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"lyP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lyV" = ( -/obj/effect/landmark/start/head_of_security, -/obj/structure/chair/comfy/black, -/turf/open/floor/iron/dark, -/area/station/security/office) -"lzb" = ( -/obj/item/folder/red{ - pixel_y = 3 - }, -/obj/machinery/light/directional/east, -/obj/structure/table/glass, -/obj/item/folder/red{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"lzc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/aisat/exterior) -"lzg" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Distro Staging to Filter" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"lzj" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"lzu" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/effect/spawner/random/entertainment/lighter, -/turf/open/floor/iron, -/area/station/service/bar) -"lzN" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lzP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "holodeck" - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"lzT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"lAb" = ( -/obj/machinery/meter, -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "gas ports" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"lAf" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/obj/machinery/smartfridge/petri/preloaded, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"lAs" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"lAu" = ( -/turf/open/space/basic, -/area/space/nearstation) -"lAF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"lAI" = ( -/obj/structure/rack, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = 5 - }, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = 1 - }, -/obj/item/gun/energy/laser/practice{ - pixel_x = 2; - pixel_y = -2 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"lBi" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/small/directional/west, -/obj/structure/reagent_dispensers/beerkeg, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"lBC" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lBO" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lBT" = ( -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"lCs" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"lCB" = ( -/obj/machinery/computer/scan_consolenew{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"lCF" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"lCL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lCP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"lCS" = ( -/obj/machinery/door/airlock/command{ - name = "Head of Security's Office"; - req_access_txt = "58" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"lCT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"lCV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"lCW" = ( -/obj/structure/table, -/obj/structure/bedsheetbin{ - pixel_x = 2 - }, -/obj/item/clothing/mask/muzzle, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lCX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "detective_shutters"; - name = "detective's office shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/detectives_office) -"lDa" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/gateway) -"lDe" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/door/poddoor/shutters/window{ - id = "armory"; - name = "armory shutters" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"lDf" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"lDk" = ( -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/food_or_drink/booze{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"lDl" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/light/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"lDp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/locker) -"lDq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"lDs" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"lDy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"lDT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/holohoop{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Prison Yard"; - network = list("ss13","prison") - }, -/turf/open/floor/iron, -/area/station/security/prison) -"lEk" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/pdapainter/medbay, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) -"lEm" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - name = "Cargo Desk"; - req_access_txt = "50" - }, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 9 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/item/newspaper, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"lEs" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"lEt" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lEA" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"lEC" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) -"lEF" = ( -/obj/structure/frame/machine, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"lEI" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) -"lES" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/service) -"lET" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"lFl" = ( -/obj/machinery/door/airlock/command{ - name = "Chief Medical Officer's Office"; - req_access_txt = "40" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"lFz" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/command) -"lFD" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "N2 to Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"lFH" = ( -/obj/structure/window, -/obj/effect/decal/cleanable/food/flour, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"lFK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"lFM" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"lGi" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"lGq" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/warning, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"lGF" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"lGK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/east, -/obj/effect/turf_decal/trimline/red/warning{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"lGN" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/engineering/main) -"lGS" = ( -/obj/docking_port/stationary/public_mining_dock, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) -"lHb" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"lHg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/machinery/light_switch/directional/west{ - pixel_y = -8 - }, -/obj/machinery/button/door/directional/west{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - req_access_txt = "31" - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"lHp" = ( -/obj/structure/window/reinforced, -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "MiniSat Exterior Access"; - network = list("minisat") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"lHr" = ( -/obj/structure/table, -/obj/item/clothing/under/suit/sl, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"lHu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"lHv" = ( -/obj/machinery/vending/assist, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"lHL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"lIi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lIm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"lIr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"lIz" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"lIB" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"lID" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Starboard Primary Hallway" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lIV" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"lJp" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"lJI" = ( -/obj/machinery/status_display/supply{ - pixel_y = 32 - }, -/obj/machinery/conveyor{ - dir = 5; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"lJL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"lJT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"lJW" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/machinery/light/small/red/directional/west, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"lJX" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/structure/closet/secure_closet/psychology, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"lKf" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"lKj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"lKu" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space) -"lKI" = ( -/obj/structure/table/glass, -/obj/machinery/camera/directional/west{ - c_tag = "Pharmacy"; - network = list("ss13","medbay") - }, -/obj/machinery/light/directional/west, -/obj/item/book/manual/wiki/chemistry{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/grenades, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"lKW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lLc" = ( -/obj/machinery/door/airlock/engineering{ - name = "Telecomms Storage"; - req_access_txt = "61" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"lLi" = ( -/obj/machinery/computer/security/qm{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/cargo/qm) -"lLl" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/cooking_to_serve_man, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"lLs" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"lLv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Command Hallway" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"lLC" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/science/genetics) -"lLS" = ( -/obj/item/crowbar, -/obj/item/wrench, -/obj/structure/table, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lLU" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lLZ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"lMh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"lMp" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"lMq" = ( -/turf/open/misc/asteroid/basalt/airless, -/area/space/nearstation) -"lMx" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lMy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"lMJ" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"lMV" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/mob/living/simple_animal/sloth/citrus, -/turf/open/floor/iron, -/area/station/cargo/storage) -"lMZ" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"lNm" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"lNO" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/camera/directional/south{ - c_tag = "Science Toxins Launch"; - network = list("ss13","rd") - }, -/obj/machinery/computer/pod/old/mass_driver_controller/ordnancedriver{ - pixel_y = -24 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"lNR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"lOe" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/vending/games, -/turf/open/floor/wood, -/area/station/service/library) -"lOh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"lOo" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/maintenance/directional/south, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"lOW" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Ordnance Test Lab"; - req_access_txt = "8" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/heavy, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"lOX" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "XenoPens"; - name = "Xenobiology Lockdown" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"lPh" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"lPk" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"lPu" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"lPD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"lPK" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"lPV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"lQh" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"lQj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"lQm" = ( -/obj/machinery/space_heater, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/port) -"lQn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"lQt" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/candle, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/radio/off{ - desc = "An old handheld radio. You could use it, if you really wanted to."; - icon_state = "radio"; - name = "old radio"; - pixel_y = 15 - }, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"lQv" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"lQF" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"lRj" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lRn" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"lRE" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"lSa" = ( -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"lSj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/south{ - dir = 8; - name = "Jim Norton's Quebecois Coffee"; - req_one_access_txt = "12;25;28;35;37" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"lSW" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"lSX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"lTb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"lTo" = ( -/obj/structure/table/reinforced, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"lTt" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"lTG" = ( -/obj/structure/sign/painting/library{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/station/service/library) -"lTM" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"lUq" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"lUv" = ( -/obj/item/storage/book/bible, -/obj/structure/altar_of_gods, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"lUy" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"lUU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"lUX" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/xenobiology/hallway) -"lVr" = ( -/obj/machinery/hydroponics/soil{ - pixel_y = 8 - }, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/machinery/light/small/directional/north, -/turf/open/floor/cult, -/area/station/service/chapel/funeral) -"lVw" = ( -/obj/machinery/newscaster/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"lVF" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "XenoPens"; - name = "Xenobiology Lockdown" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"lWz" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/engineering/glass{ - name = "Shared Engineering Storage"; - req_one_access_txt = "32;19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"lWC" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14.9-CrewQuarters-Central"; - location = "14.8-Dorms-Lockers" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"lWO" = ( -/turf/open/floor/iron, -/area/station/maintenance/space_hut) -"lWR" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"lWY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/button/door/directional/north{ - id = "rdrnd"; - name = "Research and Development Containment Control"; - pixel_x = -6; - req_access_txt = "30" - }, -/obj/machinery/button/door/directional/north{ - id = "rdordnance"; - name = "Ordnance Containment Control"; - pixel_x = 6; - req_access_txt = "30" - }, -/obj/machinery/button/door/directional/north{ - id = "rdoffice"; - name = "Privacy Control"; - pixel_y = 34; - req_access_txt = "30" - }, -/obj/machinery/computer/security/telescreen/rd{ - pixel_x = 31; - pixel_y = 30 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"lXD" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"lYr" = ( -/obj/machinery/door/airlock{ - name = "Service Hall"; - req_access_txt = "null"; - req_one_access_txt = "73" - }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"lYt" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"lYv" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) -"lYI" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"lYO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 27 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"lZd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"lZg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/grass, -/area/station/medical/virology) -"lZn" = ( -/obj/machinery/door/airlock{ - name = "Theater Backstage"; - req_access_txt = "46" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/maintenance/starboard/greater) -"lZo" = ( -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = -8 - }, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/captain/private) -"lZp" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"lZx" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Virology Lab"; - req_access_txt = "39" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"lZy" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"lZB" = ( -/obj/structure/table, -/obj/item/aicard, -/obj/item/ai_module/reset, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"lZK" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"lZV" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"mab" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Custodial Closet"; - req_access_txt = "26" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"mac" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"mad" = ( -/obj/structure/rack, -/obj/item/restraints/handcuffs{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"maC" = ( -/obj/structure/cable, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"maG" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"maO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"maQ" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white/side, -/area/station/medical/medbay/lobby) -"maT" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/spawner/random/medical/memeorgans, -/obj/structure/closet/crate/freezer, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"mbj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"mbm" = ( -/obj/effect/landmark/start/paramedic, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"mbu" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Psychology Maintenance"; - req_access_txt = "70" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"mbz" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) -"mbI" = ( -/obj/machinery/door/airlock/research{ - name = "Robotics Lab"; - req_access_txt = "29" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"mbK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"mbL" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/closet/l3closet/scientist, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"mbN" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mce" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 4; - name = "Engineering Deliveries"; - req_access_txt = "10" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/engineering/main) -"mcC" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"mcQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"mcS" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/structure/closet/secure_closet/atmospherics, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"mcV" = ( -/obj/structure/table/wood, -/obj/item/stamp/hos, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"mcY" = ( -/obj/structure/closet/secure_closet/miner, -/obj/item/clothing/suit/hooded/wintercoat/miner, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"mdd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mdf" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/camera/directional/east{ - c_tag = "Science Maintenance Corridor"; - network = list("ss13","rd") - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) -"mdi" = ( -/obj/machinery/hydroponics/soil{ - pixel_y = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/spawner/random/food_or_drink/seed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"mds" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/vending/cigarette, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"mdB" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"mdJ" = ( -/obj/structure/table/wood, -/obj/item/radio/intercom/directional/east, -/obj/item/clothing/glasses/regular/hipster{ - name = "Hipster Glasses" - }, -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/entertainment/musical_instrument, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood, -/area/station/service/theater) -"mdR" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mdU" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"mee" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - req_access_txt = "20" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/captain/private) -"mef" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"mew" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/closet/secure_closet/security/med, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"mey" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light_switch/directional/north, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"mez" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/research) -"meI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/cargo/storage) -"meJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"meK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"meM" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"mfa" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"mfe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"mff" = ( -/obj/machinery/light/small/maintenance/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"mfg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"mfi" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"mfk" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - freq = 1400; - location = "Disposals" - }, -/obj/structure/plasticflaps, -/obj/machinery/door/window/right/directional/north{ - dir = 2; - name = "delivery door"; - req_access_txt = "31" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"mfn" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 4; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 6; - pixel_y = -1 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/syringe, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mfD" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 5; - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -1 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Test Chamber"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"mfM" = ( -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"mgc" = ( -/obj/machinery/button/door/incinerator_vent_ordmix{ - id = "ordnanceaccess"; - name = "Ordnance Access"; - pixel_x = -26; - pixel_y = -24 - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"mge" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"mgz" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mgJ" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"mgL" = ( -/obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"mgV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"mhc" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"mhh" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 - }, -/turf/open/floor/carpet/royalblue, -/area/station/service/library) -"mhs" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"mht" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/obj/item/toy/crayon/spraycan, -/obj/item/toy/crayon/spraycan{ - pixel_x = -4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) -"mhE" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"mhU" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"miC" = ( -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"miE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/theater) -"miG" = ( -/obj/machinery/light/directional/west, -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"miH" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/machinery/door/airlock/security/glass{ - name = "Gear Room"; - req_one_access_txt = "1;4" - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"miQ" = ( -/obj/effect/landmark/start/paramedic, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"miR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/newscaster/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"miU" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/duct, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"miV" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"mji" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/space, -/area/space/nearstation) -"mjo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"mjH" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"mjR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"mjS" = ( -/obj/structure/rack, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/suture, -/obj/item/reagent_containers/syringe/multiver, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = -1; - pixel_y = 2 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"mjV" = ( -/obj/machinery/door/airlock/silver{ - name = "Bathroom" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) -"mki" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"mkw" = ( -/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/item/clothing/glasses/sunglasses, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"mkx" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) -"mkE" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mkH" = ( -/obj/machinery/light/directional/west, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"mkK" = ( -/obj/machinery/computer/security{ - dir = 8 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"mkZ" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"mld" = ( -/obj/machinery/air_sensor/nitrous_tank, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"mlx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"mlP" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"mma" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"mmb" = ( -/obj/structure/fluff/broken_flooring{ - icon_state = "singular" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"mmf" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"mml" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/bridge) -"mmq" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/lab) -"mmI" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - sortType = 5 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"mmJ" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/components/binary/valve/digital{ - dir = 8; - name = "Waste Release" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mmM" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"mng" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/machinery/door/window/right/directional/east{ - base_state = "left"; - dir = 2; - icon_state = "left"; - name = "shower" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/fitness/recreation) -"mnH" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Maintenance"; - req_one_access_txt = "12;22" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"mnI" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mnJ" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mnK" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"mnX" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) -"mnY" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/chair/office/light, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"mob" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/east, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"moh" = ( -/obj/structure/table, -/obj/item/paper/guides/jobs/engi/gravity_gen, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/effect/spawner/random/bureaucracy/pen, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"mok" = ( -/obj/structure/table, -/obj/item/paper/fluff/holodeck/disclaimer, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"mol" = ( -/obj/effect/mapping_helpers/paint_wall/priapus, -/turf/closed/wall/prepainted/daedalus, -/area/station/service/hydroponics) -"mot" = ( -/obj/structure/mirror/directional/west, -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"moM" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/closet, -/obj/item/surgicaldrill, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"mph" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) -"mpm" = ( -/obj/item/taperecorder, -/obj/item/camera, -/obj/structure/table/wood, -/obj/item/radio/intercom/directional/south, -/obj/structure/sign/painting/library_private{ - pixel_x = -32; - pixel_y = -32 - }, -/turf/open/floor/engine/cult, -/area/station/service/library) -"mpv" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/item/paper/fluff/ids_for_dummies, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"mpz" = ( -/obj/item/mmi, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mpF" = ( -/obj/structure/rack, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port) -"mpI" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Science Hallway - Admin"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"mpV" = ( -/obj/structure/cable, -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"mqn" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_y = 6 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mqo" = ( -/obj/machinery/door/poddoor/shutters{ - id = "maintwarehouse" - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/port/aft) -"mqF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) -"mqP" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"mqS" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"mqU" = ( -/obj/structure/closet/firecloset, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/checker, -/area/station/science/research) -"mrb" = ( -/obj/machinery/suit_storage_unit/atmos, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mrd" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Storage" - }, -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"mre" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/storage/box/lights/mixed{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/storage/box/lights/mixed{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/spray/cleaner, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/item/grenade/chem_grenade/cleaner{ - pixel_x = -7; - pixel_y = 12 - }, -/obj/machinery/requests_console/directional/north{ - department = "Janitorial"; - departmentType = 1; - name = "Janitorial Requests Console" - }, -/turf/open/floor/iron, -/area/station/service/janitor) -"mrv" = ( -/obj/structure/rack, -/obj/item/stack/sheet/cloth/five, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"mrw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mrO" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Fuel Pipe" - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"mrR" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"mrX" = ( -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"mrZ" = ( -/obj/structure/table, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/suture, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"msj" = ( -/obj/machinery/firealarm/directional/east, -/obj/structure/table/glass, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"msm" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 12 - }, -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/structure/light_construct/small/directional/south, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"msC" = ( -/obj/structure/girder, -/obj/effect/spawner/random/structure/grille, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"msL" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube, -/turf/open/space, -/area/space/nearstation) -"msN" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/sign/warning/vacuum/external, -/turf/open/floor/plating, -/area/station/cargo/storage) -"msS" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people, -/obj/machinery/light/directional/south, -/obj/item/paper/guides/jobs/hydroponics, -/obj/machinery/camera/directional/south{ - c_tag = "Hydroponics - Foyer" - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"msV" = ( -/obj/structure/closet/crate/bin, -/obj/item/knife/kitchen, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"msZ" = ( -/obj/structure/table/glass, -/obj/item/folder/blue{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/folder/white, -/obj/item/pen, -/obj/item/stamp/cmo, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"mti" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"mtn" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"mts" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/map/left{ - icon_state = "map-left-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/starboard) -"mtt" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/cargo/storage) -"mtB" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"mtC" = ( -/obj/effect/spawner/random/structure/chair_maintenance, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"mtF" = ( -/obj/structure/table, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 16 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"mtR" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Exterior - Port Fore"; - network = list("minisat") - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"mtS" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"mtV" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/neutral/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"mub" = ( -/obj/machinery/light/small/broken/directional/west, -/obj/structure/table, -/obj/item/clothing/suit/cyborg_suit, -/obj/item/clothing/mask/gas/cyborg, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"muh" = ( -/obj/machinery/power/terminal, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"muo" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/wood, -/area/station/service/theater) -"mut" = ( -/obj/machinery/mech_bay_recharge_port, -/obj/structure/sign/poster/official/safety_report{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/station/cargo/warehouse) -"muD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"muK" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"muL" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"muN" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/structure/closet_private, -/obj/item/clothing/under/suit/navy, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"muP" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"muT" = ( -/turf/open/floor/iron, -/area/station/engineering/main) -"mva" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mvj" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/science/research) -"mvv" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/wood, -/area/station/service/library) -"mvx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"mvA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/item/biopsy_tool{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/book/manual/wiki/cytology{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"mvJ" = ( -/obj/structure/closet/crate/coffin, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"mwa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"mwG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"mwM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mxb" = ( -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"mxw" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Research Division Server Room"; - req_access_txt = "30" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/science/server) -"myb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine/airless, -/area/station/science/mixing/chamber) -"myi" = ( -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"myo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"myp" = ( -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"myz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/department_orders/service{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"myC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"myM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"myT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"mzr" = ( -/obj/item/reagent_containers/glass/bucket, -/obj/item/mop, -/obj/item/reagent_containers/glass/bottle/ammonia, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"mzG" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mzL" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/station/engineering/main) -"mzR" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/command, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"mAe" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) -"mAt" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"mAu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"mAC" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/iron, -/area/station/commons/locker) -"mAE" = ( -/obj/structure/table, -/obj/structure/sign/departments/medbay{ - pixel_y = 32 - }, -/obj/item/reagent_containers/glass/beaker/large, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mAI" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"mAR" = ( -/obj/structure/table/glass, -/obj/item/wrench, -/obj/item/crowbar, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"mAW" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"mAY" = ( -/obj/item/clothing/suit/snowman, -/obj/item/clothing/head/snowman, -/turf/open/floor/fake_snow, -/area/station/maintenance/port/aft) -"mBd" = ( -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mBg" = ( -/obj/effect/spawner/random/structure/crate_empty, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"mBh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/ticket_machine/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"mBy" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mBz" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"mBC" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_exterior{ - name = "Burn Chamber Exterior Airlock" - }, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"mBP" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/xenobiology/hallway) -"mBU" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/rack, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/bodybags, -/obj/item/healthanalyzer, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"mBY" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mCi" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"mCl" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/button/door/directional/east{ - id = "Cabin3"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"mCH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/flora/ausbushes/stalkybush, -/turf/open/floor/grass, -/area/station/science/research) -"mCT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mCY" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"mDh" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"mDG" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"mDH" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"mDK" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"mDP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/atmos/glass{ - name = "Hypertorus Fusion Reactor"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"mDQ" = ( -/obj/structure/cable, -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"mEl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"mEq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"mEr" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Cleaning Closet"; - req_one_access_txt = "12;35" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"mEx" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"mEL" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Brig Control"; - req_access_txt = "3" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/warden) -"mEU" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Science Genetics"; - network = list("ss13","rd") - }, -/obj/machinery/newscaster/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"mEX" = ( -/obj/machinery/bookbinder, -/turf/open/floor/wood, -/area/station/service/library) -"mFq" = ( -/obj/machinery/door/airlock/research{ - name = "Mech Bay"; - req_access_txt = "29" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"mFv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"mFy" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mFR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/light/small/maintenance/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"mFZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/structure/table, -/obj/item/storage/box/mousetraps{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/clothing/gloves/color/orange{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/service/janitor) -"mGe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"mGk" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Exterior - Fore Starboard"; - network = list("minisat") - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"mGr" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mGs" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/interrogation) -"mGw" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/security_officer, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"mGx" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/assembly/mousetrap, -/obj/item/food/deadmouse, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mGz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/girder, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"mGD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mGG" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/machinery/door/window/left/directional/north{ - dir = 2; - name = "Pharmacy Desk"; - req_access_txt = "5; 69" - }, -/obj/machinery/door/firedoor, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters"; - name = "pharmacy shutters" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"mGK" = ( -/obj/structure/rack, -/obj/machinery/status_display/ai/directional/north, -/obj/effect/spawner/random/techstorage/medical_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"mGO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"mGT" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Visitation" - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mGU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"mHp" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"mHs" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"mHw" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Chapel- Starboard" - }, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"mHA" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"mHI" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"mIb" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/item/roller, -/obj/item/roller, -/obj/item/toy/figure/md, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"mIe" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"mIi" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"mIj" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/aft) -"mIq" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/camera/directional/west{ - c_tag = "Auxilary Restrooms" - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"mIs" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) -"mIB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"mIF" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"mIU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mJk" = ( -/obj/item/storage/box/matches{ - pixel_x = -2; - pixel_y = 3 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/item/clothing/mask/cigarette/cigar/cohiba, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"mJo" = ( -/obj/machinery/mineral/ore_redemption{ - dir = 4; - input_dir = 8; - output_dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/east{ - name = "Ore Redemtion Window" - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"mJx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"mJA" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"mJB" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"mJI" = ( -/turf/open/space, -/area/space/nearstation) -"mJK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mJW" = ( -/obj/structure/table, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/security/medical) -"mKf" = ( -/obj/effect/spawner/random/trash/mess, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"mKp" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"mKv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"mKx" = ( -/obj/machinery/gateway/centerstation, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"mKK" = ( -/obj/machinery/vending/sustenance, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mKO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/tank/plasma{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"mKT" = ( -/obj/structure/table/wood, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/folder/blue, -/obj/item/stamp/law, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"mLb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"mLi" = ( -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"mLm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"mLp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"mLq" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"mLr" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Robotics Maintenance"; - req_access_txt = "29" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/science/robotics/lab) -"mLs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/iron, -/area/station/maintenance/starboard/lesser) -"mLt" = ( -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/structure/table/glass, -/obj/item/book/manual/hydroponics_pod_people, -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/requests_console/directional/west{ - department = "Hydroponics"; - departmentType = 2; - name = "Hydroponics Requests Console" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"mLw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"mLC" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"mLF" = ( -/obj/item/radio/intercom/directional/west{ - pixel_y = -10 - }, -/obj/item/kirbyplants/random, -/obj/machinery/light_switch/directional/west{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mLI" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/launch) -"mLX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mML" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"mMX" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"mMY" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/cobweb, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/landmark/start/hangover, -/obj/machinery/button/door/directional/west{ - id = "Cabin6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"mNa" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/station/solars/port/fore) -"mNc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"mNe" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"mNm" = ( -/obj/structure/table/wood, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/item/food/grown/poppy{ - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"mNp" = ( -/obj/machinery/computer/cargo{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/cargo/qm) -"mNr" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"mNC" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/computer/chef_order{ - dir = 8 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"mNH" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/chair/office/light{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"mNW" = ( -/obj/structure/disposalpipe/segment, -/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/iron/dark, -/area/station/medical/morgue) -"mOs" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Science Hallway - Research"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"mOA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"mON" = ( -/obj/machinery/light/directional/north, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/item/book/manual/wiki/engineering_construction{ - pixel_y = 3 - }, -/obj/item/folder/yellow, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mPb" = ( -/obj/item/dice/d20, -/obj/item/dice, -/obj/structure/table/wood, -/obj/effect/decal/cleanable/dirt/dust, -/obj/item/storage/dice, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/light_construct/small/directional/south, -/obj/structure/sign/poster/contraband/random/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"mPe" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/newscaster/directional/south, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"mPp" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"mPr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"mPB" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/computer/station_alert, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"mPJ" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Plasma to Pure" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mPK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"mPM" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/open/floor/engine/cult, -/area/station/service/library) -"mPX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"mPY" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"mQf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"mQm" = ( -/obj/machinery/door/window/right/directional/west{ - dir = 1; - name = "Atmospherics Access"; - req_access_txt = "24" - }, -/obj/effect/turf_decal/loading_area, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"mQn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"mQt" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mQx" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/libraryscanner, -/turf/open/floor/wood, -/area/station/service/library) -"mQD" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"mQQ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Air to External Air Ports" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light_switch/directional/north, -/obj/machinery/light/no_nightlight/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"mQR" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/station/commons/locker) -"mQS" = ( -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Departure Lounge - Port Fore" - }, -/obj/item/kirbyplants{ - icon_state = "plant-24" - }, -/obj/structure/sign/poster/official/random/directional/west, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"mQU" = ( -/obj/structure/plasticflaps, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/disposal/delivery_chute, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"mRj" = ( -/obj/structure/rack, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/gas, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"mRz" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"mRC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mRS" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"mRT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"mRU" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/hallway/secondary/exit/departure_lounge) -"mRX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"mSp" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"mSt" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"mSz" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"mTb" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/requests_console/directional/west{ - department = "Kitchen"; - departmentType = 2; - name = "Kitchen Requests Console" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"mTh" = ( -/obj/structure/closet/emcloset, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"mTn" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - O2" - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"mTp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"mTA" = ( -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"mTG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"mTP" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 10 - }, -/obj/machinery/meter, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"mTU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"mTW" = ( -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/crap, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"mTX" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"mUc" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"mUi" = ( -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"mUx" = ( -/obj/effect/spawner/random/maintenance, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"mUB" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/mixing) -"mUO" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"mUR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 10 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"mUS" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"mVg" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/engineering_hacking{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = -2 - }, -/obj/item/trash/can{ - pixel_x = -8 - }, -/obj/machinery/firealarm/directional/south, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mVi" = ( -/obj/effect/turf_decal/tile/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Starboard" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mVp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mVr" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) -"mVs" = ( -/obj/machinery/light_switch/directional/west, -/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/table/glass, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"mVx" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"mVA" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/rnd_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"mVF" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"mVL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mVM" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"mVT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"mVV" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/supply) -"mVZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"mWd" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/open/space/basic, -/area/space) -"mWn" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/chaplain, -/obj/item/radio/intercom/chapel/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"mWt" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"mWx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"mWG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mWI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) -"mWO" = ( -/obj/machinery/computer/cryopod{ - pixel_y = 26 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"mXa" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/mixing) -"mXe" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/range) -"mXf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"mXp" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"mXD" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"mXG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"mXI" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"mXJ" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"mXO" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"mXW" = ( -/obj/machinery/door/airlock{ - id_tag = "AuxToilet3"; - name = "Unit 3" - }, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"mYi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"mYO" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"mYR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"mYT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = -2 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"mYY" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"mZf" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/lab) -"mZh" = ( -/obj/structure/rack, -/obj/item/cane, -/obj/item/food/grown/mushroom/glowshroom, -/turf/open/floor/plating, -/area/station/command/heads_quarters/captain/private) -"mZj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"mZm" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"mZn" = ( -/obj/machinery/door/window/right/directional/north{ - base_state = "left"; - dir = 8; - icon_state = "left"; - name = "Library Desk Door"; - pixel_x = 3; - req_access_txt = "37" - }, -/turf/open/floor/wood, -/area/station/service/library) -"mZV" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/robotics/lab) -"naq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"nas" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"nax" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"naA" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/medical/medbay/lobby) -"nbh" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge Access"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-right" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nbj" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Central Primary Hallway - Aft-Port Corner" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nbp" = ( -/obj/machinery/computer/mechpad{ - dir = 8 - }, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"nbq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/hatch{ - name = "Engine Airlock Internal"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sm-engine-airlock" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"nbu" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"nby" = ( -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"nbz" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/machinery/fax_machine, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"nbE" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/box, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"nbJ" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"nbL" = ( -/obj/structure/table/glass, -/obj/structure/cable, -/obj/item/modular_computer/laptop/preset/civilian{ - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"nbM" = ( -/obj/structure/displaycase/trophy, -/turf/open/floor/wood, -/area/station/service/library) -"nbO" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nbR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"nbX" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"ncc" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/shower{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/end{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"ncf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"ncw" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"ncD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ncN" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/sparker/directional/west{ - id = "executionburn" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"ncP" = ( -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"ncX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"ndb" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/door/window{ - name = "MiniSat Walkway Access" - }, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Exterior - Aft Port"; - network = list("minisat") - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"ndd" = ( -/obj/item/clothing/head/fedora, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/commons/lounge) -"ndn" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"ndo" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/locker) -"ndr" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"ndG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/station/science/lab) -"ndM" = ( -/obj/item/target, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"ndO" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants{ - icon_state = "applebush" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ndW" = ( -/obj/structure/closet/secure_closet/miner, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"nej" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"neG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"neY" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/holding_cell) -"neZ" = ( -/obj/machinery/restaurant_portal/restaurant, -/turf/open/floor/wood, -/area/station/commons/lounge) -"nfc" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"nfh" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/primary/central) -"nfn" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"nfq" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/effect/landmark/start/chemist, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"nfv" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - id = "atmoshfr" - }, -/turf/open/floor/plating, -/area/station/engineering/atmospherics_engine) -"nfU" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"ngd" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"ngk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/space_heater, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"ngl" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ngu" = ( -/obj/structure/chair{ - dir = 4; - name = "Prosecution" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"ngE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"ngH" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"ngK" = ( -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/ywflowers, -/obj/item/food/grown/banana, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/medical/virology) -"ngS" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, -/area/station/science/cytology) -"ngU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/structure/closet/secure_closet/freezer/kitchen, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"nhe" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"nht" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"nhB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 5 - }, -/obj/machinery/light/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Engine Room South"; - network = list("ss13","engine") - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"nhM" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Brig"; - req_access_txt = "63; 42" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/courtroom) -"nhP" = ( -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"nig" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"nih" = ( -/obj/structure/toilet/greyscale{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/white, -/area/station/security/prison) -"nik" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"niu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"niE" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/smartfridge/organ, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "main_surgery" - }, -/turf/open/floor/iron/dark, -/area/station/medical/treatment_center) -"niJ" = ( -/obj/machinery/holopad/secure, -/obj/structure/chair/wood{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"niL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"niS" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"niY" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) -"njb" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"njd" = ( -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"njk" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"njn" = ( -/obj/structure/chair{ - name = "Judge" - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"njp" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"njs" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/station/science/mixing) -"njy" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/iron, -/area/station/science/mixing) -"njH" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"njM" = ( -/obj/structure/closet{ - name = "Evidence Closet 5" - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"nkh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"nkk" = ( -/obj/structure/cable, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/south{ - id = "PermaLockdown"; - name = "Panic Button"; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/station/security/prison) -"nku" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"nkw" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/north, -/obj/effect/spawner/random/entertainment/lighter, -/turf/open/floor/wood, -/area/station/commons/dorms) -"nky" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/belt/utility, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"nkJ" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/commons/storage/art) -"nkQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"nkS" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "XenoPens"; - name = "Xenobiology Lockdown" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"nkV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"nkW" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"nlm" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Gateway Chamber" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"nlp" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/folder/white, -/obj/item/hand_labeler, -/obj/item/pen, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"nlK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"nmk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Evidence Storage"; - req_one_access_txt = "1;4" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"nmo" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/east{ - id = "Prison Gate"; - name = "Prison Wing Lockdown"; - req_access_txt = "2" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"nmE" = ( -/obj/structure/rack, -/obj/item/extinguisher, -/obj/item/storage/belt/utility, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"nmY" = ( -/obj/structure/noticeboard/directional/north{ - desc = "A memorial wall for pinning mementos upon."; - name = "memorial board" - }, -/obj/item/storage/book/bible, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/service/chapel/funeral) -"nnj" = ( -/obj/structure/table/reinforced{ - name = "Jim Norton's Quebecois Coffee table" - }, -/obj/item/storage/fancy/donut_box, -/obj/item/paper{ - info = "Jim Norton's Quebecois Coffee. You see, in 2265 the Quebecois had finally had enough of Canada's shit, and went to the one place that wasn't corrupted by Canuckistan.Je vais au seul endroit qui n'a pas ??? corrompu par les Canadiens ... ESPACE."; - name = "Coffee Shop"; - pixel_x = -4; - pixel_y = 6 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"nnx" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/conveyor{ - dir = 8; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo Bay - Aft"; - pixel_x = 14 - }, -/obj/machinery/disposal/delivery_chute{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/west{ - dir = 4; - name = "Crate to Shuttle"; - req_access_txt = "50" - }, -/obj/structure/plasticflaps/opaque{ - name = "Service Deliveries" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"nny" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/maintenance, -/obj/item/stock_parts/cell, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"nnN" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"nnO" = ( -/obj/structure/table, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 7 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/range) -"nnR" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"nnS" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/command/heads_quarters/cmo) -"nnT" = ( -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) -"nof" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"nol" = ( -/obj/structure/sign/warning/pods{ - pixel_x = 30 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"noE" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/chapel/funeral) -"npa" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/requests_console/directional/west{ - department = "Ordnance Test Range"; - departmentType = 5; - name = "Test Range Requests Console" - }, -/obj/item/assembly/signaler{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/item/assembly/signaler{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, -/obj/item/assembly/signaler{ - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"npp" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/item/stock_parts/subspace/analyzer, -/obj/machinery/camera/directional/west{ - c_tag = "Telecomms - Storage" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"npr" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plating, -/area/station/maintenance/port) -"npv" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 12 - }, -/obj/effect/turf_decal/tile/yellow, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"npM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"npV" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"nqb" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"nqe" = ( -/obj/item/plant_analyzer, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"nrc" = ( -/obj/structure/flora/ausbushes/sunnybush, -/obj/machinery/camera/directional/north{ - c_tag = "Virology Test Subject Chamber"; - network = list("ss13","medbay") - }, -/turf/open/floor/grass, -/area/station/medical/virology) -"nre" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Chapel Office" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"nrf" = ( -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Bridge Deliveries"; - req_access_txt = "19" - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/command/bridge) -"nrp" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/lounge) -"nrr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"nrt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"nru" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood, -/area/station/commons/lounge) -"nrI" = ( -/turf/open/floor/iron, -/area/station/science/mixing) -"nrP" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"nrQ" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"nsp" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"nsv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"nsB" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nsG" = ( -/obj/machinery/hydroponics/soil, -/obj/machinery/camera/directional/west{ - c_tag = "Prison Forestry"; - network = list("ss13","prison") - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/turf/open/floor/grass, -/area/station/security/prison) -"nsU" = ( -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - icon_state = "trimline"; - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"nsZ" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, -/obj/effect/spawner/random/trash/garbage{ - spawn_loot_count = 3 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"ntb" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"ntf" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"ntm" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"nto" = ( -/obj/machinery/hydroponics/soil{ - pixel_y = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/spawner/random/food_or_drink/seed, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"ntw" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos/storage/gas) -"ntx" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"ntC" = ( -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ntZ" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - N2" - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"nua" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/bodycontainer/morgue{ - 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/iron/dark, -/area/station/medical/morgue) -"nui" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"nul" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmospherics_engine) -"nuq" = ( -/obj/machinery/door/airlock/atmos{ - name = "Atmospherics"; - req_access_txt = "24" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/checker, -/area/station/engineering/atmos/storage/gas) -"nuw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"nuH" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"nuJ" = ( -/obj/machinery/button/flasher{ - id = "visitorflash"; - pixel_x = -6; - pixel_y = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/button/door/directional/north{ - id = "visitation"; - name = "Visitation Shutters"; - pixel_x = 6; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"nuU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"nuZ" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/airlock/medical/glass{ - name = "Paramedic Dispatch Room"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/office) -"nvi" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;35" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"nvl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Custodial Closet" - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/service/janitor) -"nvm" = ( -/obj/effect/turf_decal/tile/dark{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"nvp" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"nvt" = ( -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Cargo Bay Bridge Access" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "north-maint-viewingdeck" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nvz" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/service/library) -"nvK" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"nwc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"nwe" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/closet, -/obj/item/crowbar, -/obj/item/assembly/flash/handheld, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"nwr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"nwN" = ( -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nwT" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/virology) -"nxd" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"nxf" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"nxp" = ( -/obj/structure/table/wood, -/obj/machinery/computer/security/telescreen/entertainment/directional/west, -/obj/effect/decal/cleanable/cobweb, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/service/library) -"nxE" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #8"; - dir = 10; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"nyf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"nyl" = ( -/obj/machinery/door/window/right/directional/south{ - dir = 1; - name = "Medical Deliveries"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"nyo" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"nyp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"nyC" = ( -/obj/structure/closet/secure_closet/medical2, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"nyG" = ( -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"nyT" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Fore" - }, -/obj/structure/closet/secure_closet/engineering_welding, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"nzd" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Starboard - Art Storage" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nzs" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - dir = 8; - name = "First Aid Supplies"; - req_access_txt = "5" - }, -/obj/item/clothing/glasses/blindfold{ - pixel_y = 3 - }, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/ears/earmuffs{ - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/glasses/eyepatch, -/obj/item/clothing/suit/straight_jacket, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"nzJ" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/spawner/random/engineering/toolbox, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"nzL" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - dir = 4; - name = "old sink"; - pixel_x = -12 - }, -/obj/structure/mirror/directional/west, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"nAm" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - req_access_txt = "20" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"nAu" = ( -/obj/effect/spawner/random/structure/grille, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"nAJ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"nAL" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"nAM" = ( -/obj/item/phone{ - desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/structure/table/wood, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"nAO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"nBr" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"nBA" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/medical/abandoned) -"nBD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/closet/crate/trashcart/laundry, -/obj/effect/spawner/random/contraband/prison, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner/skirt, -/obj/item/clothing/under/rank/prisoner/skirt, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"nCo" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/effect/landmark/start/prisoner, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"nCq" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"nCy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"nCH" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "ceprivacy"; - name = "privacy shutter" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/ce) -"nCL" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nCO" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/obj/effect/landmark/start/medical_doctor, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"nCU" = ( -/obj/machinery/space_heater, -/obj/machinery/light/small/maintenance/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"nDh" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryosleep Bay" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/commons/dorms/cryo) -"nDl" = ( -/obj/machinery/door/morgue{ - name = "Private Study"; - req_access_txt = "37" - }, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/engine/cult, -/area/station/service/library) -"nDm" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"nDt" = ( -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"nDG" = ( -/obj/machinery/light/small/red/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"nDM" = ( -/obj/structure/fireaxecabinet/directional/south, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_y = 3 - }, -/obj/machinery/light_switch/directional/east, -/obj/structure/table/glass, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nDU" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"nDV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"nDX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"nEj" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"nEm" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"nEC" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/mixing/launch) -"nED" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"nEO" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#EFB341" - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"nER" = ( -/obj/structure/chair/wood/wings{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/theater) -"nET" = ( -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"nFu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"nFx" = ( -/obj/machinery/gibber, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"nFJ" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"nFL" = ( -/obj/machinery/camera/directional/north, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"nFN" = ( -/obj/structure/closet/lasertag/blue, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"nFR" = ( -/obj/machinery/vending/boozeomat, -/obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = -28 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/service/bar) -"nFW" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"nGm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"nGv" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/machinery/flasher/directional/north{ - id = "AI"; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"nGw" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/command{ - name = "Research Director's Office"; - req_access_txt = "30" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/heads_quarters/rd) -"nGx" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/office) -"nGF" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/secure_closet/hydroponics, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"nGN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) -"nGQ" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"nGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"nGV" = ( -/obj/structure/table/reinforced, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/item/radio/intercom/directional/east{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/obj/structure/cable, -/obj/machinery/telephone/security, -/obj/machinery/power/data_terminal, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"nHc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"nHm" = ( -/obj/machinery/smartfridge/organ, -/obj/machinery/door/poddoor/preopen{ - id = "surgeryc"; - name = "privacy shutter" - }, -/turf/open/floor/iron/dark, -/area/station/medical/surgery/aft) -"nHu" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/north{ - c_tag = "Service Maintinance" - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"nHx" = ( -/obj/structure/flora/junglebush/b, -/obj/structure/flora/ausbushes/ppflowers, -/obj/machinery/light/directional/east, -/turf/open/floor/grass, -/area/station/medical/virology) -"nHN" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"nHP" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"nIa" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 6 - }, -/obj/item/defibrillator/loaded{ - pixel_y = 3 - }, -/obj/item/defibrillator/loaded, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"nIf" = ( -/obj/structure/cable, -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"nIw" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"nIF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "1" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig) -"nIK" = ( -/obj/machinery/computer/med_data, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"nIN" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"nIP" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"nJi" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"nJl" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/structure/flora/ausbushes/grassybush, -/turf/open/floor/grass, -/area/station/science/research) -"nJm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/medbay/lobby) -"nJo" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/item/stack/sheet/glass, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/signaler, -/obj/item/assembly/timer{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"nJN" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"nJQ" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"nKc" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nKl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"nKu" = ( -/obj/item/cigbutt, -/obj/structure/table/reinforced, -/obj/item/storage/medkit/fire{ - pixel_y = -4 - }, -/obj/item/paper{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"nKz" = ( -/obj/machinery/door/airlock/security{ - name = "Court Cell"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"nKF" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/greater) -"nKL" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/science/central) -"nKY" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nLb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"nLc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"nLe" = ( -/obj/machinery/door/poddoor/preopen{ - id = "medsecprivacy"; - name = "privacy shutter" - }, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/brigdoor/left/directional/north{ - req_access_txt = "63" - }, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) -"nLg" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"nLu" = ( -/obj/structure/closet/secure_closet/chief_medical, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/item/screwdriver, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) -"nLF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"nLR" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/lounge) -"nLZ" = ( -/obj/item/toy/beach_ball/branded, -/turf/open/space/basic, -/area/space) -"nMa" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Central Primary Hallway - Fore - Starboard Corner" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nMs" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/closet, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nMw" = ( -/obj/machinery/light/no_nightlight/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"nMF" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue, -/mob/living/simple_animal/bot/cleanbot, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"nMJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"nMR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"nMS" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nMV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/structure/plaque/static_plaque/golden/commission/meta, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"nNc" = ( -/obj/structure/table/glass, -/obj/machinery/cell_charger, -/obj/item/stack/cable_coil, -/obj/item/assembly/igniter, -/obj/item/stock_parts/cell, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"nNh" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nNi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"nNk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"nNu" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"nNE" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"nNL" = ( -/turf/closed/mineral/volcanic, -/area/space/nearstation) -"nNP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/medical, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"nOI" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI core shutters" - }, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai) -"nPg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nPk" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) -"nPI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"nPQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"nQe" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Locker Room Port" - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"nQk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"nQp" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/status_display/evac/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"nQw" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/pharmacy) -"nQE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Pure to Mix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"nRb" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"nRe" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/lobby) -"nRC" = ( -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"nRJ" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"nRN" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nRQ" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/filingcabinet/chestdrawer, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"nRV" = ( -/obj/effect/spawner/random/food_or_drink/donkpockets, -/obj/structure/table/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"nSp" = ( -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_ordmix{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"nSs" = ( -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/radio/intercom/directional/north{ - broadcasting = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"nSI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"nTI" = ( -/turf/open/floor/wood, -/area/station/service/theater) -"nTJ" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"nTQ" = ( -/obj/machinery/power/solar_control{ - id = "foreport"; - name = "Port Bow Solar Control" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"nUa" = ( -/obj/machinery/modular_computer/console/preset/cargochat/cargo{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"nUq" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "Engineering"; - name = "Engineering Security Doors" - }, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) -"nUy" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"nUG" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"nUK" = ( -/obj/machinery/door/airlock/external{ - name = "Space Shack" - }, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"nUM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"nUU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"nVm" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nVt" = ( -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"nVL" = ( -/obj/structure/grille/broken, -/obj/item/bouquet/poppy, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"nVM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nVR" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"nVS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"nWg" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"nWn" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"nWB" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/computer/secure_data{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"nWF" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) -"nWY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"nXg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"nXi" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison) -"nXj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"nXv" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/bureaucracy/folder{ - spawn_random_offset = 1 - }, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"nXC" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"nXE" = ( -/obj/machinery/button/door/incinerator_vent_ordmix{ - pixel_x = 8; - pixel_y = -30 - }, -/obj/machinery/button/ignition/incinerator/ordmix{ - pixel_x = -6; - pixel_y = -30 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/science/mixing) -"nXS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"nYc" = ( -/obj/machinery/door/airlock/public/glass{ - name = "space-bridge access" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/button/door/directional/north{ - id = "supplybridge"; - name = "Shuttle Bay Space Bridge Control" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "north-maint-viewingdeck" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"nYl" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/machinery/ore_silo, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"nYo" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Visitation" - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"nYA" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"nYJ" = ( -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) -"nYV" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"nZb" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"nZg" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"nZi" = ( -/obj/machinery/recharge_station, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"nZj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"nZp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"nZy" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port to Filter" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"nZF" = ( -/obj/machinery/portable_atmospherics/canister, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"nZO" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/computer/med_data/laptop{ - dir = 8; - pixel_y = 1; - req_one_access = null; - req_one_access_txt = "4;5;9" - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"nZT" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"oap" = ( -/obj/structure/table, -/obj/item/storage/crayons, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/dorms) -"oas" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"oav" = ( -/obj/structure/sign/painting/library{ - pixel_y = -32 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/service/library) -"oaE" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"oaS" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"oaT" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"oaZ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"obi" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "47" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"obA" = ( -/obj/structure/table/optable{ - desc = "A cold, hard place for your final rest."; - name = "Morgue Slab" - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"obC" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/research) -"obO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"obP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/cook, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"obT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"obX" = ( -/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/station/construction/mining/aux_base) -"och" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"ocv" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark, -/area/station/science/lab) -"ocA" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/structure/cable, -/obj/effect/spawner/random/decoration/showcase, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"ocQ" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/port) -"ocT" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Arrivals - Station Entrance" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ocV" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"odc" = ( -/obj/structure/table, -/obj/effect/spawner/random/engineering/tool, -/turf/open/floor/iron, -/area/station/engineering/main) -"odE" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"odF" = ( -/obj/machinery/air_sensor/carbon_tank, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"odJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/white/corner{ - color = null; - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"odL" = ( -/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/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"odM" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/xenobiology) -"odO" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"odP" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/ai/directional/west, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"odV" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/sign/warning/securearea{ - pixel_x = 32; - pixel_y = 32 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/siding/yellow, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"odZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"oeg" = ( -/obj/structure/table/wood, -/obj/machinery/status_display/ai/directional/north, -/obj/item/flashlight/lamp, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"oeo" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"oet" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"oeK" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"oeP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/soap{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"ofl" = ( -/obj/structure/table/wood, -/obj/item/storage/photo_album/library, -/obj/structure/sign/painting/large/library_private{ - dir = 8; - pixel_x = -29 - }, -/turf/open/floor/engine/cult, -/area/station/service/library) -"ofu" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/medbay/central) -"ofy" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ofB" = ( -/obj/machinery/door/airlock/security{ - name = "Court Cell"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"ofF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"ofK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/camera/directional/west{ - c_tag = "Science Ordnance Corridor"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"ofT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"ofU" = ( -/obj/structure/sign/poster/contraband/missing_gloves, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/storage/primary) -"ogb" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/psychology) -"ogd" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 4 - }, -/obj/structure/railing/corner, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"ogg" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/department/science/xenobiology) -"ogF" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"ogQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ogX" = ( -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"ohg" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/security/brig) -"ohh" = ( -/obj/item/flashlight/lantern{ - pixel_y = 7 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"ohk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"oho" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"ohs" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/coldroom) -"ohu" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"ohD" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/engine_input{ - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"ohL" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/commons/lounge) -"ohQ" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/dirt/dust, -/obj/effect/decal/cleanable/oil/slippery, -/obj/effect/decal/cleanable/blood/gibs/down, -/mob/living/simple_animal/bot/mulebot{ - name = "Leaping Rabbit" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"oij" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"oin" = ( -/obj/structure/table, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/security, -/turf/open/floor/iron/dark, -/area/station/security/office) -"oiC" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/siding/red, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"oiE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"oiO" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"oiQ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"ojb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ojc" = ( -/obj/structure/filingcabinet, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"ojh" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"ojx" = ( -/obj/structure/table, -/obj/item/storage/box/lights/mixed{ - pixel_x = 11; - pixel_y = 11 - }, -/obj/item/multitool{ - pixel_x = -3; - pixel_y = -4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"ojN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering{ - name = "Tech Storage"; - req_one_access_txt = "23;30" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"ojW" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/spawner/random/bureaucracy/briefcase{ - spawn_loot_count = 2; - spawn_loot_split = 1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) -"ojY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/warden) -"okn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/meter, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"okA" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/chair{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"okO" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock{ - name = "Garden" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"okS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/chair/stool/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"okX" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"olb" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"olg" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window{ - dir = 8; - name = "MiniSat Airlock Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"olL" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/research) -"olN" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"omb" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ome" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"omh" = ( -/obj/structure/toilet/greyscale{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"omA" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/qm) -"omF" = ( -/obj/machinery/teleport/station, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"omL" = ( -/turf/open/floor/plating/airless, -/area/space) -"omY" = ( -/obj/machinery/light_switch/directional/south, -/obj/structure/table/wood, -/obj/item/razor{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/clothing/mask/cigarette/cigar, -/obj/item/reagent_containers/food/drinks/flask/gold, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"onc" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Ordnance Gas Storage Maintenance"; - req_access_txt = "8" - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/starboard/aft) -"ong" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"onr" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"ons" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/kitchen) -"onz" = ( -/turf/open/floor/plating, -/area/station/science/mixing/launch) -"onC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port) -"ood" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "outerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/flasher/directional/east{ - id = "secentranceflasher" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"ooC" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"ooE" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/blood/gibs/old, -/obj/effect/turf_decal/tile/green/fourcorners, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"ooG" = ( -/obj/machinery/telephone/command{ - layer = 2.91; - pixel_y = 10 - }, -/obj/structure/cable, -/obj/machinery/power/data_terminal, -/obj/machinery/airalarm/directional/east, -/obj/structure/filingcabinet/chestdrawer{ - pixel_y = 2 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"ooS" = ( -/obj/machinery/light/directional/north, -/obj/structure/chair/sofa/corp/right, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"ooZ" = ( -/obj/structure/bookcase{ - name = "Holy Bookcase" - }, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel/funeral) -"opc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/range) -"opd" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"opi" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 1 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 6 - }, -/obj/item/paper_bin{ - pixel_x = 8; - pixel_y = 11 - }, -/obj/item/folder/yellow{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/folder/yellow{ - pixel_x = -9; - pixel_y = 1 - }, -/obj/item/paper{ - pixel_x = -5 - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"opp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"ops" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"opx" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/shower{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"opF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"opJ" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/stack/spacecash/c1{ - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/rag, -/obj/structure/table/reinforced{ - name = "Jim Norton's Quebecois Coffee table" - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"opO" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"oqa" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Crew Quarters Access" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/locker) -"oqn" = ( -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"oqy" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/closet/secure_closet/security/science, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"oqJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"oqY" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"oro" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"orI" = ( -/obj/machinery/computer/monitor{ - name = "Bridge Power Monitoring Console" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"orL" = ( -/obj/machinery/biogenerator, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"orM" = ( -/obj/structure/closet/lasertag/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"orQ" = ( -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Infirmary" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/medical) -"orU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"orW" = ( -/obj/structure/closet/secure_closet/evidence, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"orX" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/trunk, -/obj/structure/cable, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"osc" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, -/turf/open/floor/plating/airless, -/area/station/ai_monitored/aisat/exterior) -"osp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"osq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"osv" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"osJ" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"otd" = ( -/obj/structure/closet, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"otk" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"otq" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"oud" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/vacant_room/commissary) -"oug" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"oum" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/lesser) -"out" = ( -/obj/structure/lattice, -/obj/item/reagent_containers/food/drinks/bottle/goldschlager, -/turf/open/space/basic, -/area/space/nearstation) -"oux" = ( -/obj/structure/table/wood, -/obj/item/gavelblock, -/obj/item/gavelhammer, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"ovn" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera/directional/west{ - c_tag = "Starboard Primary Hallway - Atmospherics" - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"ovU" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"ovV" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat" - }, -/obj/item/clothing/head/hardhat/orange{ - name = "protective hat" - }, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"owq" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/interrogation) -"owz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"owB" = ( -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"owC" = ( -/obj/structure/cable/layer1, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"owG" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"owS" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"owV" = ( -/obj/machinery/power/shieldwallgen, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"oxa" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"oxe" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"oxn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/trimline/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"oxA" = ( -/obj/structure/table, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/obj/item/storage/belt/utility, -/turf/open/floor/iron, -/area/station/engineering/main) -"oxB" = ( -/obj/machinery/gulag_teleporter, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"oxE" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"oxO" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/theater) -"oxQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"oyh" = ( -/obj/structure/rack, -/obj/item/hatchet, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"oyA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"oyK" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"oyM" = ( -/obj/effect/spawner/random/structure/girder{ - spawn_loot_chance = 80 - }, -/obj/effect/spawner/random/structure/barricade{ - spawn_loot_chance = 50 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"oyN" = ( -/obj/machinery/suit_storage_unit/engine, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"oyP" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/holopad/secure, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"oyR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Port Primary Hallway - Mining Shuttle" - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"oyS" = ( -/turf/open/floor/iron, -/area/station/commons/dorms) -"oyU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/commons/lounge) -"ozc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ozk" = ( -/obj/structure/window/reinforced, -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"ozq" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"ozv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"ozI" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Outlet Pump" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ozJ" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Server Room" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) -"ozN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"oAa" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"oAe" = ( -/obj/structure/fluff/broken_flooring{ - dir = 4; - icon_state = "singular" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"oAy" = ( -/obj/structure/table, -/obj/item/analyzer, -/obj/item/healthanalyzer, -/obj/machinery/camera/autoname/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"oAL" = ( -/obj/machinery/hydroponics/soil, -/obj/item/shovel/spade, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/grass, -/area/station/security/prison) -"oAQ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/horizontal, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"oBn" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"oBA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/security/brig) -"oBT" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"oBX" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Law Office Maintenance"; - req_access_txt = "38" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"oCK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"oCL" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/departments/court{ - pixel_y = -32 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"oCO" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/kitchen/coldroom) -"oCS" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"oCW" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"oCZ" = ( -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/lab) -"oDc" = ( -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"oDo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"oDr" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"oDx" = ( -/obj/structure/table/reinforced, -/obj/item/flashlight/lamp, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"oDE" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"oDH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"oDQ" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -4; - pixel_y = 7 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/service/bar) -"oEb" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"oEd" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/surgery/aft) -"oEh" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"oEu" = ( -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"oEz" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"oEO" = ( -/obj/item/stack/rods/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/structure/closet/crate, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"oEW" = ( -/obj/machinery/door/airlock/mining{ - name = "Mining Office"; - req_access_txt = "48" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"oFb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/broken/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"oFf" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_one_access_txt = "1;4" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/office) -"oFk" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"oFo" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/service/library) -"oFp" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/field/generator, -/turf/open/floor/plating, -/area/station/engineering/main) -"oFw" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Central Fore" - }, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"oFy" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/atmos) -"oFB" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/obj/machinery/rnd/production/circuit_imprinter/robotics, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"oFC" = ( -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"oFQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/east{ - c_tag = "Prison Workshop"; - network = list("ss13","prison") - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"oGi" = ( -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) -"oGB" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;63;48;50" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"oGM" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/storage/box/lights/mixed, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"oGN" = ( -/obj/effect/landmark/start/cyborg, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/north{ - c_tag = "AI Upload Foyer"; - network = list("aiupload") - }, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"oGS" = ( -/obj/machinery/plate_press, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/security/prison) -"oHd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"oHe" = ( -/obj/machinery/door/airlock/external{ - name = "Mining Dock Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/miningoffice) -"oHh" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Server Room" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/tcommsat/server) -"oHq" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"oHs" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"oHt" = ( -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"oId" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/space, -/area/space/nearstation) -"oIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/lesser) -"oIp" = ( -/turf/open/floor/iron/stairs/medium{ - dir = 8 - }, -/area/station/engineering/atmospherics_engine) -"oIu" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/storage/toolbox/mechanical, -/obj/item/pipe_dispenser, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"oII" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/obj/structure/closet/l3closet, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"oJk" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/plating, -/area/station/engineering/main) -"oJA" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/acidic_buffer{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/basic_buffer{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/formaldehyde{ - pixel_x = 1 - }, -/obj/structure/sign/warning/chemdiamond{ - pixel_y = 32 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark/textured_edge{ - dir = 8 - }, -/area/station/medical/medbay/central) -"oJC" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;63;48;50" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/maintenance/fore/lesser) -"oJT" = ( -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"oKF" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/spawner/random/trash/janitor_supplies, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"oKH" = ( -/turf/open/floor/iron/stairs/medium{ - dir = 1 - }, -/area/station/engineering/atmos) -"oKM" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"oLe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"oLk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"oLP" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/lesser) -"oLQ" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/prison) -"oLX" = ( -/obj/structure/closet, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"oMc" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/britcup{ - pixel_x = -6; - pixel_y = 11 - }, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"oMe" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/station/cargo/qm) -"oMm" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"oMw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"oMC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"oMJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"oMN" = ( -/turf/open/floor/wood, -/area/station/service/library) -"oMU" = ( -/obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"oMV" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"oMX" = ( -/obj/structure/table/glass, -/obj/item/clothing/gloves/color/latex, -/obj/item/surgical_drapes, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"oNc" = ( -/obj/structure/table/wood, -/obj/item/storage/secure/safe/directional/east, -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/machinery/button/door/directional/north{ - id = "detective_shutters"; - name = "detective's office shutters control"; - req_access_txt = "4" - }, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"oNq" = ( -/obj/structure/table/wood, -/obj/item/poster/random_official, -/obj/item/poster/random_official, -/obj/item/poster/random_official, -/obj/item/poster/random_official, -/obj/item/poster/random_official, -/obj/structure/cable, -/obj/machinery/button/door/directional/east{ - id = "corporate_privacy"; - name = "corporate showroom shutters control"; - req_access_txt = "19" - }, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"oNC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library) -"oNG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/engine_output{ - can_hibernate = 0; - dir = 8 - }, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"oNH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/stool/directional/north, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/wood, -/area/station/commons/lounge) -"oNO" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"oOb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/structure/table, -/obj/machinery/telephone/service, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/service/janitor) -"oOc" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"oOg" = ( -/obj/structure/cable, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=14-Starboard-Central"; - location = "13.3-Engineering-Central" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"oOj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"oOl" = ( -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"oOC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"oOK" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"oOM" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"oOQ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"oPi" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"oPs" = ( -/obj/machinery/door/firedoor/border_only/closed{ - dir = 8; - name = "Animal Pen B" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"oQc" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for the Auxiliary Mining Base."; - dir = 1; - name = "Auxiliary Base Monitor"; - network = list("auxbase"); - pixel_y = -28 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"oQl" = ( -/obj/machinery/door/window/brigdoor{ - name = "Command Desk"; - req_access_txt = "19" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"oQr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"oQU" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/item/reagent_containers/glass/bottle/epinephrine, -/obj/item/reagent_containers/glass/bottle/multiver, -/obj/item/reagent_containers/syringe, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"oQY" = ( -/obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"oRg" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"oRh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 10 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"oRj" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/box, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"oRn" = ( -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/obj/item/computer_hardware/hard_drive/role/signal/ordnance, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"oRu" = ( -/obj/structure/table/wood/fancy/orange, -/obj/item/gps{ - gpstag = "QM0"; - pixel_x = 10; - pixel_y = 12 - }, -/obj/machinery/status_display/supply{ - pixel_x = 32 - }, -/obj/item/storage/wallet{ - pixel_x = -3; - pixel_y = 10 - }, -/obj/item/ammo_casing/caseless/rocket{ - desc = "Your grandpappy brought this home after the war. You're pretty sure it's a dud."; - name = "Dud Rocket"; - pixel_x = -4; - pixel_y = -7 - }, -/turf/open/floor/carpet/red, -/area/station/cargo/qm) -"oRD" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/iron/white, -/area/station/science/research) -"oRH" = ( -/obj/structure/rack, -/obj/item/crowbar/red, -/obj/item/restraints/handcuffs, -/obj/item/wrench, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"oRL" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 11; - height = 22; - id = "whiteship_home"; - name = "SS13: Auxiliary Dock, Station-Port"; - width = 35 - }, -/turf/open/space/basic, -/area/space) -"oRQ" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"oRW" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Mechanic Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"oSb" = ( -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "Security" - }, -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/fore) -"oSc" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"oSd" = ( -/obj/machinery/rnd/production/fabricator/department/medical, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"oSm" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"oSx" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Bar" - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/commons/lounge) -"oSI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"oTd" = ( -/obj/machinery/computer/station_alert{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"oTo" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"oTw" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"oTz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/vehicle/ridden/trolley, -/turf/open/floor/iron, -/area/station/cargo/storage) -"oTD" = ( -/obj/structure/frame/computer, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"oTI" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/grass, -/area/station/science/research) -"oTM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"oUt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"oUA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/space_heater, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"oUF" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"oUK" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"oUM" = ( -/obj/structure/closet, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - desc = "Takes you to a whole new level of thinking."; - name = "Meta-Cider" - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"oUW" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/newscaster/directional/north, -/obj/structure/dresser, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"oVk" = ( -/obj/structure/table/glass, -/obj/machinery/light/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"oVm" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"oVx" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/entry) -"oVG" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/effect/spawner/random/trash/soap{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"oVI" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"oVM" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "20;12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"oWr" = ( -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/starboard) -"oWC" = ( -/obj/effect/landmark/start/cargo_technician, -/turf/open/floor/iron, -/area/station/cargo/storage) -"oWF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"oWL" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"oWO" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"oWP" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/fluff/broken_flooring, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"oWQ" = ( -/obj/structure/closet/wardrobe/green, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"oXt" = ( -/obj/machinery/door/poddoor{ - id = "QMLoaddoor"; - name = "Supply Dock Loading Door" - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"oXu" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"oXQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"oXZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"oYa" = ( -/obj/machinery/door/window{ - dir = 1; - name = "Mass Driver"; - req_access_txt = "12" - }, -/obj/machinery/door/window{ - name = "Mass Driver"; - req_access_txt = "12" - }, -/obj/effect/turf_decal/loading_area{ - dir = 1 - }, -/obj/machinery/computer/pod/old/mass_driver_controller/shack{ - pixel_x = -24 - }, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"oYz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/caution, -/obj/effect/turf_decal/ported/border/borderfloor, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/monitoring) -"oYG" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/science) -"oYM" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"oYR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"oYX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"oZh" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"oZv" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"oZy" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Morgue Maintenance"; - req_access_txt = "6" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"oZA" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"oZB" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"paf" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"paj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"pao" = ( -/obj/machinery/computer/operating, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Primary Surgery"; - name = "medical camera"; - network = list("ss13","medical") - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"pat" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"paD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;25;28" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"paF" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"paI" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/librarian, -/turf/open/floor/wood, -/area/station/service/library) -"paP" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/gateway) -"pbd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"pbr" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"pbK" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"pce" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/mob/living/simple_animal/bot/floorbot, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"pcn" = ( -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"pcq" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"pcr" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"pcI" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"pcU" = ( -/obj/structure/table, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 1 - }, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/folder/yellow{ - pixel_x = 3; - pixel_y = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"pdh" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"pdk" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/checkpoint/customs) -"pdp" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"pdq" = ( -/obj/structure/sign/warning/vacuum{ - pixel_x = 32 - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"pdr" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "N2O to Pure" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pdw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"pdM" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"pdS" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"ped" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/lockers) -"peh" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"pew" = ( -/obj/machinery/firealarm/directional/north, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"peE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"peL" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/central) -"peU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/suit_storage_unit/medical, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"pfc" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"pfd" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"pfe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"pfg" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/solars/port/fore) -"pfk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"pfn" = ( -/obj/structure/table/reinforced, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - dir = 8; - name = "Pharmacy Desk"; - req_access_txt = "5; 69" - }, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "pharmacy_shutters_2"; - name = "Pharmacy shutters" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"pfr" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"pfv" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/machinery/newscaster/directional/west, -/obj/item/pen/invisible, -/turf/open/floor/engine/cult, -/area/station/service/library) -"pfB" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Quiet Room" - }, -/turf/open/floor/wood, -/area/station/service/library) -"pfI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/research) -"pfX" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"pgj" = ( -/obj/structure/table/reinforced, -/obj/item/folder/yellow, -/obj/item/stamp/ce, -/obj/item/reagent_containers/pill/patch/aiuri, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/item/computer_hardware/hard_drive/role/atmos, -/obj/item/computer_hardware/hard_drive/role/engineering, -/obj/item/computer_hardware/hard_drive/role/engineering, -/obj/item/computer_hardware/hard_drive/role/engineering, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"pgn" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pgy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"pgH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"pgM" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/teleporter) -"pgS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_access_txt = "28" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/station/hallway/secondary/service) -"pgT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/button/door/directional/east{ - id = "atmoshfr"; - name = "Radiation Shutters Control"; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmospherics_engine) -"pgX" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/security/prison) -"phy" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "MuleBot Access"; - req_access_txt = "50" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=4"; - dir = 4; - freq = 1400; - location = "Medbay" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"phF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair/stool/directional/west, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"phL" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/bureaucracy/folder{ - spawn_random_offset = 1 - }, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"phN" = ( -/obj/machinery/camera/directional/west{ - c_tag = "AI Chamber - Port"; - network = list("aicore") - }, -/obj/structure/showcase/cyborg/old{ - dir = 4; - pixel_x = -9; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"phQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"phT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"phZ" = ( -/obj/structure/easel, -/obj/machinery/light/small/maintenance/directional/west, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"pik" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pix" = ( -/turf/open/floor/plating, -/area/station/engineering/main) -"piR" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/obj/structure/closet/crate/trashcart, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"piV" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"piY" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"pjc" = ( -/turf/open/floor/iron/white, -/area/station/medical/office) -"pjG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/camera/directional/north{ - c_tag = "Science Lobby"; - network = list("ss13","rd") - }, -/obj/machinery/vending/modularpc, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"pjU" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"pkf" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=3-Central-Port"; - location = "2.1-Leaving-Storage" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pkj" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pkk" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"pko" = ( -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"pkH" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"pkI" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"pkO" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"plr" = ( -/obj/machinery/disposal/bin{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"plC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"plH" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"plN" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"plP" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/aft/greater) -"plT" = ( -/obj/effect/spawner/random/structure/grille, -/obj/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"plV" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/urinal/directional/west, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"plZ" = ( -/obj/machinery/holopad/secure{ - pixel_x = 9; - pixel_y = -9 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"pmg" = ( -/obj/structure/cable/layer1, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"pmh" = ( -/obj/structure/cable, -/obj/machinery/computer/security{ - dir = 1 - }, -/obj/item/paper/crumpled{ - info = "Hey, assholes. We don't need a couch in the meeting room, I threw it out the airlock. I don't care if it's real leather, go patrol like you're paid to do instead of cycling through cameras all shift!"; - name = "old, crumpled note" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"pmu" = ( -/obj/structure/closet/secure_closet/bar{ - pixel_x = -3; - pixel_y = -1; - req_access_txt = "25" - }, -/obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"pmG" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"pmN" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"pmR" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"pmS" = ( -/obj/item/bodypart/arm/left, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"pna" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"pnb" = ( -/obj/structure/plasticflaps/opaque, -/obj/machinery/door/poddoor/preopen{ - id = "atmos"; - name = "Atmospherics Blast Door" - }, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=2"; - freq = 1400; - location = "Atmospherics" - }, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos/storage/gas) -"pne" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"pnE" = ( -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = 2; - pixel_y = -3 - }, -/obj/item/stack/package_wrap{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"pnQ" = ( -/obj/structure/lattice, -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/turf/open/space/basic, -/area/space/nearstation) -"pnR" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"pnX" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/xenobiology/hallway) -"pnY" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/item/holosign_creator/robot_seat/bar, -/turf/open/floor/iron, -/area/station/service/bar) -"pob" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pod" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"poh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pol" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"pot" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/camera/directional/east{ - c_tag = "Science - Server Room"; - name = "science camera"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/server) -"poD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"poI" = ( -/obj/item/hand_labeler, -/obj/item/stack/package_wrap, -/obj/structure/table/wood, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"poK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"poO" = ( -/obj/structure/chair/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"ppg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ppA" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Science Ordnance Gas Storage"; - network = list("ss13","rd") - }, -/obj/structure/filingcabinet/chestdrawer, -/obj/item/radio/intercom/directional/west{ - pixel_y = -10 - }, -/obj/machinery/light_switch/directional/west{ - pixel_x = -42 - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"ppH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ppK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ppN" = ( -/obj/structure/window/reinforced/plasma/spawner/west, -/turf/open/space/basic, -/area/space/nearstation) -"pqd" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"pqe" = ( -/obj/structure/chair/wood{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) -"pqs" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/medical/morgue) -"pqA" = ( -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"pqI" = ( -/obj/structure/lattice/catwalk, -/obj/item/fish_feed, -/turf/open/space/basic, -/area/space/nearstation) -"pqO" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pqX" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"prd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"prh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/carpet, -/area/station/service/theater) -"prk" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/oil/slippery, -/turf/open/floor/iron/white, -/area/station/science/research) -"prq" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"prB" = ( -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/obj/structure/window/reinforced, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"prK" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"prP" = ( -/obj/machinery/meter, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"prS" = ( -/obj/structure/table, -/obj/item/clipboard, -/obj/item/toy/figure/scientist, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/science/lab) -"prX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pse" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/test_area) -"psj" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/lawoffice) -"psv" = ( -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/rods/fifty, -/obj/item/stack/rods/fifty, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"ptB" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"ptE" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"ptF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/lab) -"ptK" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"ptL" = ( -/obj/structure/chair/stool/directional/south, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"ptZ" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/reagent_dispensers/watertank/high, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"pub" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"pud" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"puf" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 10 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"puh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pur" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"pus" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"puA" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"puO" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/plasticflaps/opaque, -/turf/open/floor/plating, -/area/station/cargo/qm) -"puS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"pvl" = ( -/obj/structure/sign/directions/evac, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/primary/aft) -"pvn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/vehicle/sealed/mecha/working/ripley/cargo, -/turf/open/floor/plating, -/area/station/cargo/warehouse) -"pvq" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"pvJ" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pvK" = ( -/obj/structure/cable, -/obj/machinery/computer/crew{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/red/filled/line, -/turf/open/floor/iron, -/area/station/security/warden) -"pvL" = ( -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/structure/cable, -/obj/machinery/computer/crew{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"pvR" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"pvU" = ( -/obj/machinery/atmospherics/components/trinary/filter, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"pvY" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Holodeck - Fore"; - name = "holodeck camera" - }, -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) -"pwd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Hydroponics Storage" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pwf" = ( -/obj/machinery/computer/med_data{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"pwF" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - name = "Unfiltered & Air to Mix" - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pxg" = ( -/obj/effect/landmark/start/cook, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"pxh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"pxt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"pxS" = ( -/obj/structure/closet/secure_closet/miner, -/obj/machinery/camera/directional/north{ - c_tag = "Mining Dock" - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"pxY" = ( -/obj/machinery/door/window/left/directional/east{ - dir = 8; - name = "Service Deliveries"; - req_one_access_txt = "25;26;35;28;22;37;46;38;70" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"pyn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pyr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"pyN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"pyP" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"pyS" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"pyT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"pzh" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"pzn" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/carpet, -/area/station/service/library) -"pzr" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"pzv" = ( -/obj/machinery/door/airlock/mining{ - name = "Cargo Bay"; - req_one_access_txt = "31;48" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"pzw" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"pzG" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/wood, -/area/station/service/library) -"pzK" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"pzV" = ( -/obj/effect/spawner/random/trash/cigbutt, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/textured, -/area/station/medical/medbay/central) -"pAf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"pAn" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/command) -"pAv" = ( -/obj/structure/table, -/obj/structure/window, -/obj/item/reagent_containers/food/condiment/saltshaker{ - layer = 3.1; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; - pixel_x = -8; - pixel_y = 2 - }, -/obj/item/reagent_containers/food/condiment/enzyme{ - pixel_x = 9; - pixel_y = 3 - }, -/obj/item/book/manual/chef_recipes, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"pAA" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pAE" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white/corner, -/obj/item/storage/box/gloves{ - pixel_y = 8 - }, -/obj/item/storage/box/masks{ - pixel_y = 4 - }, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/white/side{ - dir = 9 - }, -/area/station/medical/treatment_center) -"pAO" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"pAP" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"pAV" = ( -/obj/machinery/light/small/directional/south, -/obj/item/folder, -/obj/item/folder, -/obj/machinery/camera/directional/south{ - c_tag = "Telecomms - Control Room"; - network = list("ss13","tcomms") - }, -/obj/structure/table/wood, -/obj/item/pen, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"pAY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"pBr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"pBt" = ( -/obj/structure/table, -/obj/machinery/microwave, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research) -"pBD" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"pBN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"pBU" = ( -/obj/effect/spawner/random/engineering/vending_restock, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"pBW" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/commons/lounge) -"pCv" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/engineering/main) -"pCA" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/science/research) -"pDc" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/science/genetics) -"pDm" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"pDw" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"pDz" = ( -/obj/structure/table, -/obj/item/stack/cable_coil, -/obj/machinery/firealarm/directional/west, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"pDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Port Mix to North Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pDK" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"pDX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"pEn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/reagent_dispensers/plumbed, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"pEM" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"pEY" = ( -/obj/machinery/light/directional/south, -/obj/machinery/requests_console/directional/south{ - department = "Engineering"; - departmentType = 3; - name = "Engineering Requests Console" - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"pFq" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"pFA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"pFE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pFP" = ( -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pFR" = ( -/obj/machinery/reagentgrinder, -/obj/machinery/requests_console/directional/west{ - department = "Pharmacy"; - departmentType = 2; - name = "Pharmacy Requests Console"; - receive_ore_updates = 1 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"pGc" = ( -/obj/structure/table, -/obj/item/folder/blue{ - pixel_x = -18; - pixel_y = 3 - }, -/obj/item/paper_bin{ - pixel_x = 3; - pixel_y = 7 - }, -/obj/item/pen{ - pixel_x = 3; - pixel_y = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"pGd" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"pGf" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"pGn" = ( -/obj/structure/flora/junglebush/large, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/grass, -/area/station/medical/treatment_center) -"pGx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/machinery/duct, -/obj/machinery/button/door/directional/north{ - id = "kitchen_counter"; - name = "Counter Shutters Control"; - req_access_txt = "28" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"pGy" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/construction/mining/aux_base) -"pGz" = ( -/obj/machinery/chem_dispenser/drinks{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/newscaster/directional/south, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/service/bar) -"pGM" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/central) -"pGU" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"pGW" = ( -/obj/structure/sign/directions/command{ - dir = 4; - pixel_y = -8 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/command) -"pHq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"pHF" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"pHL" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"pHN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"pHU" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/commons/dorms) -"pIm" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "E.V.A. Storage"; - req_access_txt = "18" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"pIn" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/chair, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"pIo" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/office) -"pIp" = ( -/obj/machinery/vending/tool, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"pIq" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/effect/landmark/start/depsec/medical, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"pIr" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"pIy" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"pIE" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"pII" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"pIO" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/machinery/processor{ - pixel_y = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pJm" = ( -/obj/effect/spawner/random/structure/crate, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"pJq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/library) -"pJu" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/wood, -/area/station/service/library) -"pJv" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/wood, -/area/station/service/library) -"pJx" = ( -/obj/machinery/door/airlock/external{ - name = "Auxiliary Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"pJF" = ( -/obj/structure/disposalpipe/segment, -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/sorting) -"pJM" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"pJU" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Captain's Quarters"; - req_access_txt = "20" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/captain/private) -"pKi" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/aft/greater) -"pKN" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"pKY" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"pLa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pLc" = ( -/obj/structure/chair, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"pLe" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/trimline/yellow/filled/corner{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"pLh" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ - dir = 8 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"pLk" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"pLB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"pLU" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, -/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, -/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pMD" = ( -/obj/structure/rack, -/obj/machinery/light/directional/east, -/obj/item/fuel_pellet, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"pME" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -1; - pixel_y = 4 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"pMS" = ( -/obj/structure/disposaloutlet, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"pMT" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"pMU" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/siding/white, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/medical/medbay/lobby) -"pMX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"pNc" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Science Tool Closet"; - req_one_access_txt = "12;47" - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"pNd" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/iron/white, -/area/station/medical/office) -"pNi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"pNt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"pNv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pNH" = ( -/obj/structure/cable/layer1, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"pNN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/range) -"pNO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"pOe" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"pOs" = ( -/obj/effect/landmark/blobstart, -/obj/structure/closet/secure_closet/detective, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"pOz" = ( -/obj/machinery/vending/wardrobe/chap_wardrobe, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"pOQ" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) -"pOR" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/cigar, -/turf/open/floor/wood, -/area/station/commons/lounge) -"pOT" = ( -/obj/machinery/airlock_sensor/incinerator_ordmix{ - pixel_x = -24 - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"pOZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/station/service/theater) -"pPb" = ( -/mob/living/simple_animal/chicken{ - name = "Featherbottom"; - real_name = "Featherbottom" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"pPf" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/surgery/aft) -"pPi" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"pPq" = ( -/obj/machinery/door/airlock/grunge{ - name = "Cell 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/prison/safe) -"pPA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock{ - name = "Bar Storage"; - req_access_txt = "25" - }, -/obj/machinery/door/firedoor, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/hallway/secondary/service) -"pPB" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"pPF" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"pPW" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Robotics Desk"; - req_access_txt = "29" - }, -/obj/item/folder, -/obj/item/pen, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy"; - name = "Robotics Shutters" - }, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"pPY" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/cytology) -"pQi" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"pQv" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat - Antechamber"; - network = list("minisat") - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"pQz" = ( -/obj/machinery/door/airlock/wood{ - doorClose = 'sound/effects/doorcreaky.ogg'; - doorOpen = 'sound/effects/doorcreaky.ogg'; - name = "The Gobetting Barmaid" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"pQD" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"pQG" = ( -/obj/machinery/porta_turret/ai{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) -"pQH" = ( -/obj/machinery/vending/assist, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"pRo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 8 - }, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"pRC" = ( -/obj/machinery/rnd/production/fabricator/department/security, -/turf/open/floor/iron/dark, -/area/station/security/office) -"pRQ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"pRW" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/locker) -"pRX" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/carbon_tank{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pSd" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"pSe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"pSg" = ( -/obj/structure/table/wood, -/obj/structure/sign/picture_frame/showroom/three{ - pixel_x = -8; - pixel_y = 32 - }, -/obj/structure/sign/picture_frame/showroom/four{ - pixel_x = 8; - pixel_y = 32 - }, -/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 = "\improper Nanotrasen-brand personal AI device exhibit" - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"pSk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay Clinic" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/landmark/navigate_destination, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"pSm" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"pSs" = ( -/obj/structure/rack, -/obj/item/book/manual/wiki/engineering_guide{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"pSB" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"pSF" = ( -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/white, -/area/station/science/research) -"pSI" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"pSO" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Mix" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"pSS" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/junction/flipped{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"pTj" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"pTA" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"pTG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-right" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"pTH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"pTM" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"pUh" = ( -/obj/structure/dresser, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"pUy" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) -"pUE" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"pUH" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"pUT" = ( -/obj/structure/table, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/command, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"pUY" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #2"; - dir = 9; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"pVa" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/structure/urinal/directional/west, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"pVc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"pVd" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/lockers) -"pVg" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"pVl" = ( -/obj/structure/table/glass, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -8 - }, -/obj/item/clothing/mask/breath{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"pVz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"pVE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"pVL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/library) -"pVO" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"pVT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"pVV" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"pVX" = ( -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"pWb" = ( -/obj/structure/closet/toolcloset, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/turf/open/floor/iron, -/area/station/engineering/main) -"pWc" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"pWf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Cargo Bay Bridge Access" - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"pWo" = ( -/obj/structure/sink/kitchen{ - dir = 8; - pixel_x = 14 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"pWu" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"pWG" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"pWR" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"pWV" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"pXr" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = 1; - pixel_y = -1 - }, -/obj/item/multitool, -/obj/item/clothing/glasses/meson, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"pXx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"pXI" = ( -/obj/machinery/door/window/right/directional/north{ - dir = 8; - name = "Research Test Chamber"; - req_access_txt = "7" - }, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"pYh" = ( -/obj/machinery/button/door/directional/west{ - id = "bridge blast"; - name = "Bridge Access Blast Door Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"pYu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"pYJ" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/station/science/robotics/mechbay) -"pZb" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"pZj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"pZq" = ( -/obj/item/storage/secure/safe/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) -"pZr" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/start/depsec/engineering, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"pZA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"pZM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/spawner/random/trash/mess, -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port) -"pZT" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"pZZ" = ( -/obj/structure/cable, -/obj/machinery/door/airlock{ - name = "Service Hall"; - req_one_access_txt = "73" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"qaf" = ( -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qah" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qak" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/service/bar) -"qau" = ( -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"qaw" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/cigbutt/roach, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"qaL" = ( -/obj/effect/turf_decal/siding/purple, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"qaQ" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/customs) -"qaR" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qaU" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qaV" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"qbj" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/obj/machinery/button/door/directional/west{ - id = "MedbayFoyer"; - name = "Medbay Doors Control"; - normaldoorcontrol = 1; - pixel_y = -9 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"qbl" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"qbA" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"qbF" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"qbG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/server) -"qbL" = ( -/obj/structure/chair/pew/right, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"qbU" = ( -/obj/machinery/power/tracker, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) -"qbV" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/aft) -"qcb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"qcj" = ( -/obj/structure/table/wood/poker, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/wood, -/area/station/commons/lounge) -"qcm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/item/reagent_containers/glass/bucket, -/obj/item/mop, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/janitor) -"qcp" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/cargo/request{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"qcr" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/south{ - dir = 8; - name = "Maximum Security Test Chamber"; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"qct" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"qcu" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/locker) -"qcE" = ( -/obj/machinery/light/directional/north, -/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/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qcF" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = -2 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/clothing/shoes/sneakers/orange{ - pixel_x = -6; - pixel_y = -8 - }, -/obj/item/clothing/under/rank/prisoner{ - pixel_x = 8; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/prison) -"qcO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"qcU" = ( -/obj/machinery/power/apc/highcap/ten_k/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"qdc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/cargo/qm) -"qdW" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/teleporter) -"qeb" = ( -/obj/item/target, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"qei" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Ordnance Lab"; - req_access_txt = "8" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdordnance"; - name = "Ordnance Lab Shutters" - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"qeB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"qeF" = ( -/obj/machinery/light_switch/directional/west{ - pixel_y = 26 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"qeQ" = ( -/obj/machinery/turretid{ - icon_state = "control_stun"; - name = "AI Chamber turret control"; - pixel_x = 3; - pixel_y = -23 - }, -/obj/machinery/door/window{ - atom_integrity = 300; - base_state = "leftsecure"; - dir = 8; - icon_state = "leftsecure"; - name = "Primary AI Core Access"; - req_access_txt = "16" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"qfe" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"qft" = ( -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"qfx" = ( -/obj/structure/closet/secure_closet/freezer/meat, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/camera/autoname/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"qfG" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"qfI" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "rdoffice"; - name = "Research Director's Shutters" - }, -/turf/open/floor/plating, -/area/station/science/server) -"qfR" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/machinery/light/small/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/spawner/random/bureaucracy/pen, -/turf/open/floor/iron, -/area/station/commons/locker) -"qgf" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "MiniSat Space Access Airlock"; - req_access_txt = "32" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/poddoor/preopen{ - id = "transitlockdown" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"qgo" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/folder/red{ - pixel_x = -5 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"qgq" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Firing Range"; - req_one_access_txt = "1;4" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/range) -"qgA" = ( -/obj/machinery/power/emitter, -/turf/open/floor/plating, -/area/station/engineering/main) -"qgC" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/binary/pump, -/obj/structure/sign/warning/gasmask{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"qgH" = ( -/obj/structure/chair/comfy/beige, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/bridge) -"qgI" = ( -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"qgX" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qgY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Library" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"qhw" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;48;50;1" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"qhy" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Holodeck - Aft"; - name = "holodeck camera" - }, -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) -"qhC" = ( -/obj/effect/turf_decal/trimline/blue/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"qhK" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/suit_storage_unit/security, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"qhS" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_ordmix{ - pixel_x = -22 - }, -/obj/machinery/door/airlock/research/glass/incinerator/ordmix_interior{ - name = "Burn Chamber Interior Airlock" - }, -/turf/open/floor/engine, -/area/station/science/mixing/chamber) -"qia" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"qic" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"qie" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"qif" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/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/iron/dark, -/area/station/medical/morgue) -"qim" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"qis" = ( -/obj/effect/spawner/xmastree, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/service/chapel) -"qiL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"qiP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"qiQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qje" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"qjf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"qji" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"qjo" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"qjr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"qjC" = ( -/obj/machinery/door/airlock/hatch{ - name = "MiniSat Space Access Airlock"; - req_one_access_txt = "32;19" - }, -/turf/open/floor/plating, -/area/station/ai_monitored/aisat/exterior) -"qjM" = ( -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the engine."; - dir = 8; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"qjY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/cafeteria, -/area/station/security/prison) -"qkk" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/carpet, -/area/station/service/chapel) -"qks" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"qku" = ( -/obj/structure/chair/stool/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"qkz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qkZ" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"qla" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"qlk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"qll" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qlo" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"qlt" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/siding/red{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"qlC" = ( -/obj/machinery/computer/station_alert, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"qlH" = ( -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1447; - name = "Private Channel" - }, -/obj/machinery/camera/motion/directional/south{ - c_tag = "AI Upload Chamber - Starboard"; - network = list("aiupload") - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"qlY" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qlZ" = ( -/obj/structure/sign/warning/fire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/mixing/chamber) -"qmc" = ( -/obj/structure/closet{ - name = "Evidence Closet 2" - }, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"qmn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"qmo" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/rack, -/obj/structure/railing, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qmv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) -"qmG" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "PermaLockdown"; - name = "Lockdown Shutters" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/station/security/prison) -"qmL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"qmR" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"qmS" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qmW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"qmX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/yellow{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qne" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/computer/atmos_control/nocontrol/incinerator{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"qnk" = ( -/obj/machinery/light/directional/south, -/obj/structure/bed/roller, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"qnC" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/structure/sign/warning/electricshock, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"qnF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) -"qnY" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/sign/poster/official/random/directional/north, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qnZ" = ( -/obj/structure/closet/secure_closet/hop, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"qoj" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/grass, -/area/station/security/prison) -"qot" = ( -/obj/structure/transit_tube/curved/flipped{ - dir = 8 - }, -/turf/open/space, -/area/space/nearstation) -"qoA" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/ai_monitored/security/armory) -"qoE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/holopad, -/obj/effect/landmark/start/scientist, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"qoI" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"qoJ" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"qoO" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/recharge_station, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"qoW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qpd" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Brig Maintenance"; - req_one_access_txt = "63;12" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qph" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/four, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"qpl" = ( -/obj/machinery/door_timer{ - id = "Cell 2"; - name = "Cell 2"; - pixel_y = -32 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/security/brig) -"qpm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail{ - dir = 4; - sortType = 28 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"qpG" = ( -/obj/structure/table/wood, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"qpH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"qpS" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) -"qqe" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"qqq" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qqz" = ( -/obj/structure/bookcase/random/nonfiction, -/turf/open/floor/wood, -/area/station/service/library) -"qqA" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"qqD" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"qqN" = ( -/obj/machinery/door/airlock/security{ - id_tag = "IsolationCell"; - name = "Isolation Cell"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"qrf" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Law Office"; - req_access_txt = "38" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"qrg" = ( -/obj/machinery/light_switch/directional/north, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"qrp" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"qrA" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east{ - name = "Pharmacy Desk"; - req_access_txt = "5; 69" - }, -/obj/machinery/door/window/right/directional/east{ - dir = 8; - name = "Pharmacy Desk"; - req_access_txt = "5" - }, -/obj/item/reagent_containers/glass/bottle/morphine, -/obj/item/reagent_containers/glass/bottle/toxin{ - pixel_x = 5; - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 8 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -5 - }, -/obj/item/reagent_containers/syringe/epinephrine, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"qsw" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"qsF" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qsG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"qsV" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/engine_smes) -"qsW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Crew Quarters Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"qti" = ( -/obj/item/storage/box/lights/mixed, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"qtl" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qtp" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"qtF" = ( -/obj/item/pen, -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/item/folder/red, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/machinery/newscaster/directional/north, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/obj/item/radio/off, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"qtK" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"qtU" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 1"; - name = "Cell 1" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig) -"qtY" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/dark/half, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"quc" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/turf/open/space/basic, -/area/space/nearstation) -"qui" = ( -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"quu" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"quL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"quS" = ( -/obj/machinery/door/morgue{ - name = "Confession Booth" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"qvb" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/light_switch/directional/south, -/obj/structure/rack, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/nitrogen/full, -/obj/item/tank/internals/nitrogen/full, -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath/vox, -/turf/open/floor/iron, -/area/station/engineering/main) -"qvf" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qvs" = ( -/obj/machinery/door/window/right/directional/north{ - name = "Petting Zoo" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research) -"qvM" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_y = 4 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"qwb" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/office) -"qwj" = ( -/obj/structure/table/glass, -/turf/open/floor/iron/white, -/area/station/science/research) -"qwF" = ( -/obj/structure/closet/crate/wooden/toy, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/station/service/theater) -"qwP" = ( -/obj/structure/table, -/obj/item/storage/box/prisoner{ - pixel_y = 8 - }, -/obj/item/storage/box/prisoner, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"qxb" = ( -/obj/structure/table, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/firealarm/directional/south, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"qxd" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qxi" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"qxC" = ( -/obj/machinery/vending/cigarette, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"qxK" = ( -/obj/machinery/door/airlock{ - id_tag = "Toilet1"; - name = "Unit 1" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"qxS" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"qxZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/theater) -"qyj" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"qyo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Vault Storage" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/construction/storage_wing) -"qyx" = ( -/obj/machinery/smartfridge, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"qyy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"qyH" = ( -/obj/machinery/vending/assist, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"qyJ" = ( -/obj/structure/table, -/obj/item/stack/sheet/plasteel/fifty, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"qyP" = ( -/obj/structure/mirror/directional/west, -/obj/item/lipstick/black, -/obj/item/lipstick/jade{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lipstick/purple{ - pixel_x = -2; - pixel_y = -2 - }, -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qzc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/main) -"qzj" = ( -/obj/effect/spawner/random/structure/closet_private, -/obj/item/clothing/under/misc/assistantformal, -/turf/open/floor/wood, -/area/station/commons/dorms) -"qzp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/white, -/area/station/security/medical) -"qzq" = ( -/obj/structure/chair{ - name = "Judge" - }, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Courtroom" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"qzs" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"qzL" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qAf" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"qAp" = ( -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/central) -"qAs" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qAu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"qAL" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-maint-passthrough" - }, -/turf/open/floor/plating, -/area/station/science/research) -"qAO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qBd" = ( -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/door/airlock/medical{ - name = "Unfinished Room"; - req_access_txt = "5" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"qBw" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"qBH" = ( -/obj/machinery/mechpad, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"qBM" = ( -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"qBQ" = ( -/obj/structure/window/reinforced, -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/effect/spawner/random/aimodule/harmful, -/obj/structure/table/wood/fancy/red, -/obj/machinery/door/window/brigdoor/left/directional/south{ - dir = 8; - name = "High-Risk Modules"; - req_access_txt = "20" - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"qCf" = ( -/turf/open/floor/iron, -/area/station/commons/locker) -"qCl" = ( -/obj/machinery/modular_computer/console/preset/civilian{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"qCx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/security/office) -"qCy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"qCV" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qCW" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"qCZ" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/ansible, -/obj/item/stock_parts/subspace/ansible, -/obj/item/stock_parts/subspace/ansible, -/obj/item/stock_parts/subspace/crystal, -/obj/item/stock_parts/subspace/crystal, -/obj/item/stock_parts/subspace/crystal, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"qDI" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Aft Primary Hallway - Fore" - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"qDO" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 24 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"qDU" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"qEc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/junction{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"qEg" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 4 - }, -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"qEj" = ( -/obj/machinery/vending/wardrobe/chef_wardrobe, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light_switch/directional/south{ - pixel_x = -6 - }, -/obj/machinery/button/door/directional/south{ - id = "kitchen_service"; - name = "Service Shutter Control"; - pixel_x = 6; - req_access_txt = "28" - }, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"qFa" = ( -/obj/effect/landmark/start/depsec/medical, -/obj/machinery/button/door/directional/east{ - id = "medsecprivacy"; - name = "Privacy Shutters Control" - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"qFb" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/mining{ - name = "Deliveries"; - req_one_access_txt = "50" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"qFe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"qFg" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/north, -/obj/machinery/computer/med_data/laptop, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"qFD" = ( -/obj/item/radio/intercom/directional/south, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"qFH" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/west{ - dir = 1; - name = "Monkey Pen"; - req_access_txt = "9" - }, -/turf/open/floor/grass, -/area/station/science/genetics) -"qFM" = ( -/obj/machinery/light/small/maintenance/directional/east, -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"qFO" = ( -/obj/machinery/light_switch/directional/north, -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"qFZ" = ( -/obj/machinery/light/small/maintenance/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"qGj" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/gateway) -"qGt" = ( -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/aft) -"qGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qGz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"qGE" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"qGT" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"qGX" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"qHa" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qHf" = ( -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching the turbine vent."; - dir = 8; - name = "turbine vent monitor"; - network = list("turbine"); - pixel_x = 29 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"qHw" = ( -/obj/machinery/atmospherics/components/trinary/mixer/airmix{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"qHM" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qIb" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Equipment Closet"; - req_access_txt = "11" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"qIk" = ( -/obj/structure/table/reinforced, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"qIn" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"qIv" = ( -/obj/structure/showcase/machinery/tv{ - dir = 1; - pixel_x = 2; - pixel_y = 3 - }, -/obj/structure/table/wood, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"qIQ" = ( -/obj/structure/closet/masks, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"qJy" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/red{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"qJG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"qKa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"qKb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution{ - icon_state = "caution"; - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"qKi" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "privacy shutters" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hop) -"qKp" = ( -/obj/machinery/vending/coffee{ - pixel_x = -3 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/button/door/directional/west{ - id = "council blast"; - name = "Council Chamber Blast Door Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"qKK" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/recharge_station, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"qLc" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"qLg" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"qLm" = ( -/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/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/atmos_alert, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"qLr" = ( -/obj/machinery/door/window/left/directional/north{ - name = "Petting Zoo" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research) -"qLD" = ( -/obj/structure/table/wood, -/obj/effect/spawner/random/decoration/ornament, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"qLM" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 9 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"qLV" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/poster/random/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"qLZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qNg" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Break Room"; - network = list("ss13","medbay") - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"qNl" = ( -/obj/machinery/mech_bay_recharge_port{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/science/robotics/mechbay) -"qNo" = ( -/obj/machinery/disposal/bin, -/obj/structure/cable, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/office) -"qNE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qNF" = ( -/obj/structure/table/wood, -/obj/item/paicard, -/turf/open/floor/wood, -/area/station/service/library) -"qNY" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"qOk" = ( -/obj/item/wrench, -/obj/item/stack/sheet/glass{ - amount = 30 - }, -/obj/item/stack/sheet/iron{ - amount = 30 - }, -/obj/item/stack/cable_coil, -/obj/item/stack/cable_coil, -/obj/structure/closet, -/obj/item/vending_refill/cigarette, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/wood, -/area/station/service/bar) -"qOJ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"qPc" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"qPh" = ( -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"qPj" = ( -/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/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qPr" = ( -/obj/structure/table/wood, -/obj/item/clothing/mask/cigarette/pipe, -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"qPy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"qPK" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"qPM" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"qPQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"qQn" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"qQo" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"qQt" = ( -/obj/effect/turf_decal/bot/left, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"qQv" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/purple{ - dir = 5 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"qQD" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"qQK" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"qQS" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/station/maintenance/port) -"qQV" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"qRj" = ( -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/yellow/opposingcorners{ - icon_state = "tile_opposing_corners"; - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/button/massdriver{ - id = "sm_core_eject"; - name = "Core Eject"; - pixel_y = -4 - }, -/obj/machinery/button/door{ - id = "sm_core_vent"; - id_tag = null; - name = "Core Vent Control"; - pixel_y = 6 - }, -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor/right/directional/north{ - name = "Engine Emergency Systems"; - req_access_txt = "56" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"qRn" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/spawner/random/trash/caution_sign, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"qRx" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Gravity Generator Room" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"qRS" = ( -/obj/structure/table, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = -3 - }, -/obj/item/clothing/gloves/cargo_gauntlet, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"qSl" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/cargo/qm) -"qSz" = ( -/obj/structure/sign/departments/chemistry/pharmacy, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/pharmacy) -"qST" = ( -/obj/structure/closet/crate, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"qSW" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/disposal) -"qTm" = ( -/obj/structure/table/wood, -/obj/machinery/recharger, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"qTp" = ( -/obj/structure/light_construct/directional/north, -/obj/effect/decal/cleanable/greenglow, -/obj/structure/showcase/machinery/cloning_pod{ - desc = "An old prototype cloning pod, permanently decommissioned following the incident."; - name = "decommissioned cloner" - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"qTx" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/mining, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"qTL" = ( -/obj/structure/flora/ausbushes/lavendergrass, -/obj/item/food/grown/banana, -/turf/open/floor/grass, -/area/station/medical/virology) -"qUi" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/lab) -"qUy" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"qUI" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"qUL" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"qUM" = ( -/turf/open/floor/carpet/red, -/area/station/cargo/qm) -"qUR" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"qUX" = ( -/obj/structure/table, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/iron, -/area/station/security/prison) -"qVz" = ( -/obj/structure/window/reinforced, -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Pen #5"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"qVA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/bed/roller, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"qVL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"qVO" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/engineering/main) -"qWi" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light_switch/directional/south, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"qWj" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"qWn" = ( -/obj/structure/table/wood, -/obj/item/paper_bin/carbon{ - pixel_x = -10; - pixel_y = 4 - }, -/obj/item/paper_bin/carbon{ - pixel_x = -10; - pixel_y = 9 - }, -/obj/item/computer_hardware/hard_drive/role/quartermaster, -/obj/item/computer_hardware/hard_drive/role/quartermaster, -/obj/item/computer_hardware/hard_drive/role/quartermaster, -/turf/open/floor/wood, -/area/station/cargo/qm) -"qWo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"qWQ" = ( -/obj/machinery/door/window{ - dir = 4; - name = "Mass Driver"; - req_access_txt = "22" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"qWS" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/effect/spawner/random/engineering/toolbox, -/turf/open/floor/iron, -/area/station/engineering/main) -"qWY" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"qXc" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"qXx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"qXO" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"qXR" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/service/bar) -"qYf" = ( -/obj/structure/table, -/obj/item/paper_bin/construction, -/obj/item/airlock_painter, -/obj/machinery/airalarm/directional/east, -/obj/item/rcl/pre_loaded, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"qYo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"qYs" = ( -/obj/structure/sign/barsign, -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/lounge) -"qYx" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/purple/visible, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"qYy" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"qYZ" = ( -/obj/structure/table/glass, -/obj/item/hand_labeler, -/obj/item/radio/headset/headset_med, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"qZc" = ( -/obj/structure/rack, -/obj/item/storage/box/shipping, -/obj/item/pushbroom, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"qZd" = ( -/obj/structure/cable, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/plating, -/area/station/hallway/secondary/service) -"qZh" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/engineering, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"qZi" = ( -/obj/structure/rack, -/obj/machinery/firealarm/directional/west, -/obj/item/clothing/gloves/color/fyellow, -/obj/item/clothing/suit/hazardvest, -/obj/item/multitool, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"qZk" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"qZn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/camera/emp_proof/directional/north{ - c_tag = "Engine Room North"; - network = list("ss13","engine") - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"qZu" = ( -/obj/machinery/drone_dispenser, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) -"qZx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/south{ - c_tag = "Engineering - Desk" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"qZy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"qZE" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/command/glass{ - name = "Server Access"; - req_access_txt = "30" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/iron/dark, -/area/station/science/server) -"qZG" = ( -/obj/machinery/modular_computer/console/preset/research{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"qZL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"qZN" = ( -/obj/effect/landmark/start/scientist, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"rah" = ( -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"rai" = ( -/obj/structure/table/reinforced, -/obj/structure/reagent_dispensers/servingdish, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"ran" = ( -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"ras" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmospherics_engine) -"raB" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"raQ" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/structure/table{ - name = "Jim Norton's Quebecois Coffee table" - }, -/obj/item/reagent_containers/food/drinks/coffee{ - pixel_x = -3; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/drinks/coffee{ - pixel_x = 5; - pixel_y = 12 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/item/modular_computer/laptop/preset/civilian, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"raW" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"raZ" = ( -/obj/structure/table/wood, -/obj/item/folder/red, -/turf/open/floor/carpet, -/area/station/command/bridge) -"rbf" = ( -/obj/machinery/meter{ - name = "Mixed Air Tank Out" - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"rbl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"rby" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/photocopier, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"rbD" = ( -/obj/machinery/door/firedoor, -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/lobby) -"rbJ" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock"; - space_dir = 2 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"rce" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 2; - icon_state = "right"; - name = "Containment Pen #2"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio2"; - name = "Xenobio Pen 2 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"rcl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"rcE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"rcG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rcK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"rcP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rdj" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/commons/lounge) -"rdk" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"rdm" = ( -/obj/structure/cable, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/lab) -"rdr" = ( -/obj/machinery/door/airlock/medical{ - name = "Primary Surgical Theatre"; - req_access_txt = "45" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"rec" = ( -/obj/docking_port/stationary{ - dwidth = 1; - height = 4; - roundstart_template = /datum/map_template/shuttle/escape_pod/default; - width = 3 - }, -/turf/open/space/basic, -/area/space) -"reo" = ( -/obj/machinery/computer/security/wooden_tv{ - pixel_x = 1; - pixel_y = 6 - }, -/obj/structure/table/glass, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"reQ" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/structure/table, -/obj/item/clothing/gloves/color/latex{ - pixel_x = 4; - pixel_y = 9 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"reV" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"reZ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Service Maintenance"; - req_one_access_txt = "12;73" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "service-passthrough" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"rfj" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"rfl" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/recharge_station, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/trash/graffiti{ - pixel_y = -32; - spawn_loot_chance = 50 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"rfy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"rfA" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/plating, -/area/station/maintenance/port) -"rfN" = ( -/obj/structure/railing{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/filled/end, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/obj/structure/rack, -/obj/item/storage/box{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rfU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"rgc" = ( -/obj/structure/table/wood, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/item/food/grown/harebell, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/noticeboard/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"rgj" = ( -/obj/machinery/door/window{ - name = "Captain's Desk"; - req_access_txt = "20" - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"rgA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"rgC" = ( -/obj/item/target/alien, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"rgG" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/crossing, -/turf/open/space, -/area/space/nearstation) -"rgI" = ( -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rhb" = ( -/obj/effect/turf_decal/siding, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/newscaster/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/science/lab) -"rhi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"rhj" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) -"rhq" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"rhw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"rhB" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Ordnance Test Lab Maintenance"; - req_access_txt = "8" - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"rhP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/maintenance/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"rif" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rig" = ( -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"ril" = ( -/obj/machinery/oven, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"riq" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Gateway Maintenance"; - req_access_txt = "17" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"riu" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"riP" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"riR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"riY" = ( -/obj/structure/cable, -/obj/machinery/button/door/directional/south{ - id = "armory"; - name = "Armory Shutters"; - req_access_txt = "3" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"rjh" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Jetpack Storage"; - pixel_x = -1; - req_access_txt = "18" - }, -/obj/structure/window/reinforced, -/obj/structure/rack, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = 4; - pixel_y = -1 - }, -/obj/item/tank/jetpack/carbondioxide, -/obj/item/tank/jetpack/carbondioxide{ - pixel_x = -4; - pixel_y = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"rjl" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"rjm" = ( -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"rjo" = ( -/obj/machinery/button/door/directional/east{ - id = "abandoned_kitchen"; - name = "Shutters Control" - }, -/obj/item/book/manual/wiki/cooking_to_serve_man{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -11; - pixel_y = 14 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = -6; - pixel_y = 10 - }, -/obj/item/reagent_containers/glass/rag{ - pixel_x = -10; - pixel_y = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"rjs" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) -"rjI" = ( -/obj/machinery/computer/upload/borg, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/west{ - dir = 2; - layer = 3.1; - name = "Cyborg Upload Console Window"; - req_access_txt = "16" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"rka" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/cigbutt{ - pixel_y = 7 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"rkG" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2; - sortType = 22 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"rkN" = ( -/obj/structure/table, -/obj/item/paper_bin/bundlenatural{ - pixel_x = -19; - pixel_y = 5 - }, -/obj/item/paper_bin/bundlenatural{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/paper_bin/bundlenatural{ - pixel_x = -19; - pixel_y = 9 - }, -/obj/item/paperplane{ - pixel_x = 9 - }, -/obj/item/paperplane{ - pixel_x = 7; - pixel_y = 7 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/cargo, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"rkT" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"rkZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"rld" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Kitchen"; - req_one_access_txt = "25;28" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/navigate_destination/kitchen, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen) -"rlx" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"rlQ" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"rlY" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/quartermaster, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/cargo/qm) -"rmd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/library) -"rmh" = ( -/obj/machinery/door/poddoor/massdriver_ordnance, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/station/science/mixing/launch) -"rmj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"rmm" = ( -/obj/effect/spawner/random/structure/crate, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"rmt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"rmu" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"rmB" = ( -/obj/structure/table/wood, -/obj/machinery/computer/med_data/laptop{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/button/door/directional/west{ - id = "hosprivacy"; - name = "Privacy Shutters Control" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"rmY" = ( -/obj/machinery/computer/security/mining{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"rnA" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/displaycase/trophy, -/turf/open/floor/wood, -/area/station/service/library) -"rnC" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"rnT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rnU" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"rnX" = ( -/obj/machinery/suit_storage_unit/standard_unit, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"rnZ" = ( -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"rof" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"rog" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/landmark/start/roboticist, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"rok" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"ron" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 23 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"rot" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"roE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"rpp" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 5 - }, -/obj/item/pen, -/obj/machinery/computer/security/telescreen{ - desc = "Used for monitoring the engine."; - dir = 8; - name = "Engine Monitor"; - network = list("engine"); - pixel_x = 26 - }, -/obj/machinery/button/door/directional/east{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = 16; - req_one_access_txt = "1;10" - }, -/obj/machinery/button/door/directional/east{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 24; - req_one_access_txt = "1;24" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"rpK" = ( -/obj/structure/urinal/directional/north, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"rpP" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"rpQ" = ( -/obj/machinery/door/poddoor/preopen{ - id = "Prison Gate"; - name = "Security Blast Door" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"rpT" = ( -/obj/machinery/atmospherics/components/binary/valve/digital{ - name = "Exhaust-Return Tie" - }, -/obj/effect/turf_decal/trimline/green/line, -/obj/effect/turf_decal/trimline/green/line{ - icon_state = "trimline"; - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"rqq" = ( -/obj/item/storage/secure/safe/hos{ - pixel_x = 36; - pixel_y = 28 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"rqy" = ( -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"rqH" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/stack/pipe_cleaner_coil/random, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/canvas, -/obj/item/chisel{ - pixel_y = 7 - }, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"rqL" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"rqM" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"rqP" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"rqT" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Science Petting Zoo"; - network = list("ss13","rd") - }, -/obj/structure/frame/computer{ - anchored = 1; - dir = 8 - }, -/turf/open/floor/circuit/green/off, -/area/station/science/research) -"rqV" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=10-Aft-To-Central"; - location = "9.4-Escape-4" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"rrt" = ( -/obj/structure/lattice, -/obj/effect/spawner/random/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"rrx" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"rrG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"rrJ" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"rrU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rrV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Medbay Security Post"; - req_access_txt = "63" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"rsg" = ( -/obj/structure/rack, -/obj/item/storage/box/firingpins{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/firingpins, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"rsl" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio8"; - layer = 3.3; - name = "Xenobio Pen 8 Blast Doors"; - pixel_y = 4; - req_access_txt = "55" - }, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = 10; - pixel_y = -1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"rsB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"rsW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail{ - sortType = 27 - }, -/obj/effect/turf_decal/tile/green/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"rtc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"rtd" = ( -/obj/machinery/camera/motion/directional/east{ - c_tag = "E.V.A. Storage" - }, -/obj/machinery/requests_console/directional/east{ - department = "EVA"; - name = "EVA Requests Console" - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"rti" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/bot, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/security/courtroom) -"rtq" = ( -/obj/item/wrench, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rtw" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"rtC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"rtK" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"rtQ" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy2"; - name = "Robotics Shutters" - }, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/robotics/lab) -"rtV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"rue" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"ruw" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ruM" = ( -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/obj/machinery/keycard_auth/directional/west, -/obj/machinery/requests_console/directional/north{ - announcementConsole = 1; - department = "Head of Security's Desk"; - departmentType = 5; - name = "Head of Security Requests Console" - }, -/obj/machinery/button/door/directional/north{ - id = "hosspace"; - name = "Space Shutters Control"; - pixel_x = -24 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"ruQ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"ruS" = ( -/obj/structure/closet/crate/hydroponics, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"ruT" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/camera/directional/south{ - c_tag = "Prison Cell Block 1"; - network = list("ss13","prison") - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) -"ruW" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rdrnd"; - name = "Research and Development Shutters" - }, -/turf/open/floor/plating, -/area/station/science/lab) -"rvo" = ( -/obj/structure/noticeboard/directional/north, -/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/iron, -/area/station/hallway/primary/central) -"rvv" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron{ - amount = 10 - }, -/obj/item/electropack, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"rvz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/south{ - c_tag = "Atmospherics - Hypertorus Fusion Reactor Chamber Aft" - }, -/obj/structure/closet/radiation, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"rvM" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/station/security/brig) -"rvR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"rwm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"rwK" = ( -/obj/machinery/requests_console/directional/east{ - announcementConsole = 1; - department = "Bridge"; - departmentType = 5; - name = "Bridge Requests Console" - }, -/obj/machinery/computer/cargo/request, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rwN" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/autoname/directional/south, -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen, -/turf/open/floor/wood, -/area/station/service/library) -"rwO" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/science/mixing) -"rxh" = ( -/obj/item/toy/beach_ball/branded{ - pixel_y = 7 - }, -/obj/structure/table/wood, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"rxn" = ( -/obj/effect/spawner/random/maintenance/two, -/obj/structure/rack, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"rxr" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"rxx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"rxy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"rxA" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/medical) -"rxC" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L8" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rxE" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/gateway) -"rxM" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"rxX" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rya" = ( -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"ryh" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/item/taperecorder, -/obj/item/computer_hardware/hard_drive/role/lawyer, -/obj/machinery/button/door/directional/south{ - id = "lawyer_shutters"; - name = "law office shutter control"; - req_access_txt = "38" - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"ryj" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/processor/slime, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"ryJ" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"ryN" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"ryP" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"ryS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/research) -"rzv" = ( -/obj/structure/closet, -/obj/item/stack/sheet/iron{ - amount = 34 - }, -/obj/item/extinguisher/mini, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"rzE" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/landmark/start/roboticist, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"rzQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/science/research) -"rAm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"rAT" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/item/toy/plush/beeplushie{ - desc = "Maybe hugging this will make you feel better about yourself."; - name = "Therabee" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"rAV" = ( -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"rAX" = ( -/obj/structure/closet/crate/secure/weapon{ - desc = "A secure clothing crate."; - name = "formal uniform crate"; - req_access_txt = "3" - }, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/under/rank/security/officer/formal, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/suit/security/officer, -/obj/item/clothing/under/rank/security/warden/formal, -/obj/item/clothing/suit/security/warden, -/obj/item/clothing/under/rank/security/head_of_security/formal, -/obj/item/clothing/suit/security/hos, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navyofficer, -/obj/item/clothing/head/beret/sec/navywarden, -/obj/item/clothing/head/hos/beret/navyhos, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"rBt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 6 - }, -/obj/effect/turf_decal/trimline/yellow/filled/warning{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"rBw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"rBO" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) -"rBX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rCr" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/nitrous_tank{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rCt" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/east{ - id = "qm_warehouse"; - name = "Warehouse Door Control"; - req_access_txt = "31" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"rCW" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Chapel Office Maintenance"; - req_one_access_txt = "22" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"rCY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/no_nightlight/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/siding/yellow/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"rDn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"rDS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"rDW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"rEd" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"rEp" = ( -/obj/structure/sign/warning/biohazard, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/department/science/xenobiology) -"rEL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/dark{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"rFa" = ( -/obj/machinery/research/anomaly_refinery, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"rFq" = ( -/obj/machinery/pdapainter{ - pixel_y = 2 - }, -/obj/machinery/requests_console/directional/north{ - announcementConsole = 1; - department = "Head of Personnel's Desk"; - departmentType = 5; - name = "Head of Personnel's Requests Console" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"rFF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/solars/port/aft) -"rFP" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/fore) -"rFS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"rFT" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"rFV" = ( -/obj/machinery/door/airlock{ - name = "Prison Showers" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"rGa" = ( -/obj/machinery/light/directional/north, -/obj/machinery/door/window/right/directional/north{ - dir = 4; - name = "Research Delivery"; - req_access_txt = "7" - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lab) -"rGc" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"rGg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"rGm" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "evashutter"; - name = "E.V.A. Storage Shutter" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"rGo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"rGz" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"rGG" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Exterior - Fore Port"; - network = list("minisat") - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"rGM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"rGV" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/obj/structure/cable, -/obj/machinery/smartfridge/organ, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"rHz" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"rHN" = ( -/obj/structure/table, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/dark, -/area/station/security/office) -"rHO" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"rHY" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"rIb" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/station/commons/lounge) -"rIe" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"rIF" = ( -/obj/machinery/light/directional/south, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"rII" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/effect/spawner/random/structure/crate_empty, -/obj/item/circuitboard/machine/thermomachine, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"rIJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/firealarm/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"rIL" = ( -/obj/structure/tank_dispenser/oxygen{ - pixel_x = -1; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"rIM" = ( -/obj/machinery/disposal/bin, -/obj/machinery/status_display/ai/directional/east, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) -"rIZ" = ( -/obj/machinery/computer/security/telescreen/cmo{ - dir = 4; - pixel_x = -30 - }, -/obj/machinery/keycard_auth/directional/south{ - pixel_x = 6 - }, -/obj/machinery/button/door/directional/south{ - id = "cmoprivacy"; - name = "CMO Privacy Shutters"; - pixel_x = -8; - req_access_txt = "40" - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/structure/table/glass, -/obj/machinery/telephone/command, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"rJg" = ( -/obj/machinery/light/directional/north, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"rJm" = ( -/obj/structure/cable, -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/beaker, -/obj/item/reagent_containers/syringe, -/obj/item/reagent_containers/dropper, -/obj/machinery/camera/directional/north{ - c_tag = "Virology Isolation B"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"rJt" = ( -/obj/structure/table/glass, -/obj/machinery/computer/med_data/laptop, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"rJv" = ( -/turf/open/floor/plating, -/area/station/hallway/primary/port) -"rJC" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"rJE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/cargo/storage) -"rJJ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"rJU" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/storage/mech) -"rJV" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"rKn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"rKP" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"rKV" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"rLc" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Medbay Storage"; - req_access_txt = "5" - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"rLq" = ( -/obj/structure/closet/secure_closet/security/cargo, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"rLv" = ( -/turf/open/floor/plating/foam{ - temperature = 2.7 - }, -/area/space/nearstation) -"rLz" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/filingcabinet{ - pixel_x = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"rLB" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/central) -"rLG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"rLI" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/station/commons/locker) -"rLP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"rLR" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/service/library) -"rLW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"rMc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rMn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"rMH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Head of Personnel"; - req_access_txt = "57" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hop) -"rMT" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/rnd/production/fabricator/department/robotics, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"rMU" = ( -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/siding/purple, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"rNf" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"rNn" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"rNr" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/cargo/qm) -"rNs" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"rNE" = ( -/obj/structure/sign/warning/electricshock{ - pixel_x = 32 - }, -/turf/open/space/basic, -/area/space) -"rNF" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/security/prison) -"rNN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"rNZ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"rOb" = ( -/obj/structure/rack, -/obj/item/aicard, -/obj/item/radio/off, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -29 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rOi" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"rOq" = ( -/obj/item/storage/box/lights/mixed, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"rOr" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"rOB" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rOH" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron, -/area/station/security/prison) -"rOQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"rOZ" = ( -/obj/machinery/camera{ - c_tag = "Xenobiology Lab - Pen #3"; - dir = 6; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"rPb" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/corner, -/obj/machinery/photocopier, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"rPd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/lab) -"rPh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/highsecurity{ - name = "Secure Network Access"; - req_access_txt = "19" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload_foyer) -"rPl" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"rPm" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Science Research"; - network = list("ss13","rd") - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/lab) -"rPp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"rPv" = ( -/obj/machinery/door/airlock/mining{ - name = "Mining Office"; - req_access_txt = "48" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"rPG" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rPR" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/button/door/directional/west{ - id = "Engineering"; - name = "Engineering Lockdown"; - pixel_y = -6; - req_access_txt = "10" - }, -/obj/machinery/button/door/directional/west{ - id = "atmos"; - name = "Atmospherics Lockdown"; - pixel_y = 6; - req_access_txt = "24" - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"rPX" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"rQg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"rQn" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"rQr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/assistant, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"rQt" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"rQv" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/engineering/main) -"rQA" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Port to Filter" - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"rQW" = ( -/obj/structure/bed, -/obj/item/bedsheet/dorms, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/button/door/directional/east{ - id = "Cabin2"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"rRe" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"rRf" = ( -/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/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"rRg" = ( -/obj/machinery/door/airlock/atmos{ - name = "Hypertorus Fusion Reactor"; - req_access_txt = "24" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"rRh" = ( -/obj/structure/toilet{ - pixel_y = 13 - }, -/obj/machinery/light/directional/south, -/obj/effect/landmark/start/captain, -/obj/machinery/light_switch/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) -"rRp" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"rRs" = ( -/obj/structure/table/reinforced, -/obj/item/tank/internals/anesthetic{ - pixel_x = 3 - }, -/obj/item/tank/internals/anesthetic, -/obj/item/tank/internals/anesthetic{ - pixel_x = -3 - }, -/obj/item/clothing/mask/breath/medical{ - pixel_y = -3 - }, -/obj/item/clothing/mask/breath/medical, -/obj/item/clothing/mask/breath/medical{ - pixel_y = 3 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"rRu" = ( -/obj/structure/table, -/obj/item/stock_parts/micro_laser{ - pixel_x = -6; - pixel_y = 4 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 2 - }, -/obj/item/stock_parts/micro_laser{ - pixel_x = 6; - pixel_y = -2 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"rRw" = ( -/obj/structure/table/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/spawner/random/food_or_drink/snack{ - pixel_x = 6; - spawn_loot_count = 2; - spawn_random_offset = 1 - }, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ - pixel_x = -6; - spawn_loot_count = 2; - spawn_random_offset = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"rRF" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron, -/area/station/commons/dorms) -"rRL" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"rRW" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio1"; - layer = 3.3; - name = "Xenobio Pen 1 Blast Doors"; - pixel_y = 1; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"rSy" = ( -/obj/effect/landmark/blobstart, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"rSD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rSE" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rSJ" = ( -/obj/structure/window/reinforced, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"rTm" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"rTr" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"rTy" = ( -/obj/machinery/light/no_nightlight/directional/west, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"rTC" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/glass/beaker/large, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"rTW" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rUb" = ( -/turf/closed/wall/prepainted/daedalus, -/area/space/nearstation) -"rUd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"rUg" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/highsecurity{ - name = "Gravity Generator Foyer"; - req_access_txt = "10" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"rUh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"rUu" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/item/kirbyplants/random, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"rUI" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/obj/machinery/light/no_nightlight/directional/west, -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - initialize_directions = 8 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"rUM" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"rVa" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"rVn" = ( -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"rVz" = ( -/obj/structure/cable, -/obj/machinery/power/apc/highcap/five_k/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"rVB" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"rVK" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"rVU" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"rWr" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"rWs" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rWy" = ( -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rWE" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Council Chamber" - }, -/obj/machinery/light/directional/north, -/obj/machinery/status_display/ai/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"rWY" = ( -/obj/machinery/airalarm/directional/north, -/obj/item/clothing/under/suit/burgundy, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/structure/closet_private, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"rXh" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/office) -"rXn" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/construction/storage_wing) -"rXo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/effect/turf_decal/siding, -/turf/open/floor/iron, -/area/station/science/lab) -"rXt" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"rXu" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"rXD" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "hosprivacy"; - name = "privacy shutters" - }, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hos) -"rXU" = ( -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/obj/structure/sign/directions/command{ - dir = 8; - pixel_y = -8 - }, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/central) -"rYg" = ( -/obj/machinery/vending/boozeomat, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"rYl" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"rYA" = ( -/obj/machinery/porta_turret/ai, -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"rYU" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"rYY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"rYZ" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"rZj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral/half{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"rZy" = ( -/obj/machinery/camera/directional/east{ - c_tag = "AI Chamber - Starboard"; - network = list("aicore") - }, -/obj/structure/showcase/cyborg/old{ - dir = 8; - pixel_x = 9; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"sak" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Containment Pen #5"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio5"; - name = "Xenobio Pen 5 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"saq" = ( -/obj/machinery/light/directional/west, -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"saA" = ( -/obj/machinery/door/poddoor/shutters{ - id = "qm_warehouse"; - name = "Warehouse Shutters" - }, -/obj/structure/cable, -/obj/effect/turf_decal/caution/stand_clear, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"saH" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/space_hut) -"saK" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/teleporter) -"saT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"sbk" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"sbG" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sbQ" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/science/research) -"sbV" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/library) -"sbY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"scc" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"sce" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"scf" = ( -/obj/machinery/light/directional/east, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"scm" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"scp" = ( -/obj/structure/cable, -/obj/machinery/power/terminal{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"scq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"scy" = ( -/obj/machinery/vending/mechcomp, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"scO" = ( -/obj/machinery/door/poddoor/shutters{ - id = "ordnanceaccess"; - name = "Ordnance Access" - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"scT" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"scZ" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sdc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"sdk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"sdm" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"sdp" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"sdF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"sdH" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Xenobiology Lab - Euthanasia Chamber"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) -"sdP" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"sdT" = ( -/obj/structure/table/reinforced, -/obj/machinery/camera/directional/west{ - c_tag = "Prison Cafeteria"; - network = list("ss13","prison") - }, -/obj/item/food/energybar, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"sdV" = ( -/obj/machinery/airalarm/directional/north, -/obj/item/clothing/under/misc/assistantformal, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/structure/closet_private, -/turf/open/floor/wood, -/area/station/commons/dorms) -"sdW" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/machinery/power/data_terminal, -/obj/machinery/telephone/security, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"sed" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/xenobiology) -"seg" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/vacant_room/office) -"sei" = ( -/obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/button/door{ - desc = "A door remote control switch for the exterior brig doors."; - id = "outerbrig"; - name = "Brig Exterior Door Control"; - normaldoorcontrol = 1; - pixel_x = 6; - pixel_y = 7; - req_access_txt = "63" - }, -/obj/machinery/button/flasher{ - id = "secentranceflasher"; - name = "Brig Entrance Flasher"; - pixel_y = -3; - req_access_txt = "1" - }, -/obj/machinery/button/door{ - desc = "A door remote control switch for the interior brig doors."; - id = "innerbrig"; - name = "Brig Interior Door Control"; - normaldoorcontrol = 1; - pixel_x = -6; - pixel_y = 7; - req_access_txt = "63" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"set" = ( -/obj/effect/decal/cleanable/blood/gibs/limb, -/obj/structure/rack, -/obj/item/storage/medkit/regular, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/suture, -/obj/item/stack/medical/mesh, -/obj/item/clothing/glasses/hud/health, -/obj/effect/turf_decal/trimline/green/filled/line, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"seG" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"seH" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab2"; - name = "Secondary Research and Development Shutter" - }, -/turf/open/floor/plating, -/area/station/science/lab) -"seP" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/item/storage/box/masks, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"seR" = ( -/obj/structure/table, -/obj/item/poster/random_contraband, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"seT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"seU" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "packageSort2"; - name = "Sort and Deliver"; - pixel_x = -2; - pixel_y = 12 - }, -/obj/machinery/conveyor_switch/oneway{ - dir = 8; - id = "packageExternal"; - name = "Crate Returns"; - pixel_x = -5; - pixel_y = -3 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"sfH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"sfJ" = ( -/obj/item/clothing/suit/straight_jacket, -/obj/item/electropack, -/obj/structure/table, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"sga" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"sgQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"shk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"shp" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/cargo/qm) -"shy" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"shH" = ( -/obj/structure/closet/emcloset, -/obj/machinery/camera/directional/south{ - c_tag = "Science Entry"; - network = list("ss13","rd") - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating/dark{ - dir = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/checker, -/area/station/science/research) -"shN" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"shZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sig" = ( -/obj/machinery/computer/security/telescreen/interrogation{ - dir = 8; - pixel_x = 30 - }, -/obj/effect/turf_decal/trimline/red/filled/corner, -/turf/open/floor/iron, -/area/station/security/brig) -"siw" = ( -/obj/structure/sign/warning/securearea{ - name = "\improper STAY CLEAR HEAVY MACHINERY" - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/fore) -"siG" = ( -/obj/effect/mapping_helpers/dead_body_placer, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/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/iron/dark, -/area/station/medical/morgue) -"sje" = ( -/obj/effect/landmark/start/shaft_miner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"sjo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sjt" = ( -/obj/machinery/door/airlock/medical{ - name = "Medical Cold Room"; - req_access_txt = "5" - }, -/turf/open/floor/iron, -/area/station/medical/coldroom) -"sjF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"sjL" = ( -/obj/structure/closet{ - name = "Evidence Closet 1" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"skl" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"sko" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching output from station security cameras."; - name = "Security Camera Monitor"; - network = list("ss13"); - pixel_y = 30 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"skt" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"skJ" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/vending/wallmed/directional/west, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/fax_machine, -/obj/structure/table, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"skZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"slg" = ( -/obj/item/target, -/obj/structure/training_machine, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"slk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/light_construct/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"slL" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/hos) -"slV" = ( -/obj/machinery/door/airlock/research{ - name = "Abandoned Space Bridge"; - req_access_txt = "55" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/effect/mapping_helpers/airlock/abandoned, -/turf/open/floor/iron/white, -/area/station/maintenance/aft/lesser) -"slZ" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/engine/cult, -/area/station/service/library) -"sme" = ( -/obj/structure/table/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/item/wheelchair{ - pixel_y = -3 - }, -/obj/item/wheelchair, -/obj/item/wheelchair{ - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"smi" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "brig shutters" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"smz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"smE" = ( -/obj/machinery/computer/operating, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"smR" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"smS" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/left/directional/west{ - dir = 2; - name = "Cargo Desk"; - req_access_txt = "50" - }, -/obj/item/paper_bin{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/paper/crumpled{ - pixel_x = 7 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"snl" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/item/kirbyplants/random, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/siding/red, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"snw" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/ordnance_mixing_input{ - dir = 1 - }, -/turf/open/floor/engine/airless, -/area/station/science/mixing/chamber) -"snU" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"soe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/iron, -/area/station/security/prison) -"sof" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/maintenance/space_hut) -"soh" = ( -/obj/machinery/vending/mechcomp, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"soq" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"soX" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/chair/stool/bar/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/lounge) -"soZ" = ( -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"spj" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"spo" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"spq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"sps" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = -4 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"spA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/lab) -"spE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"spT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"sqf" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/ai) -"sqj" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"sqo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/start/cargo_technician, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"sqV" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/wood, -/area/station/service/library) -"sqZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"srK" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"srZ" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"ssj" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ssy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"ssN" = ( -/obj/machinery/oven, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"ssP" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/machinery/airalarm/directional/east, -/obj/structure/sign/map/right{ - desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; - icon_state = "map-right-MS"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"stc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/office) -"sti" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"sty" = ( -/obj/effect/spawner/random/trash/mess, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"stH" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/security/office) -"stJ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/robotics/mechbay) -"stM" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"stN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"stQ" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"stT" = ( -/obj/machinery/fax_machine, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/cargo/qm) -"suh" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"sui" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "roboticsprivacy"; - name = "Robotics Shutters" - }, -/turf/open/floor/plating, -/area/station/science/robotics/lab) -"suA" = ( -/obj/structure/rack, -/obj/item/stack/cable_coil{ - pixel_x = -1; - pixel_y = -3 - }, -/obj/item/wrench, -/obj/item/flashlight/seclite, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"suE" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"suP" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"suT" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ - dir = 8 - }, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"suX" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"suY" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L14" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"svq" = ( -/obj/structure/closet, -/obj/item/stack/sheet/glass{ - amount = 12 - }, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"swc" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"swh" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"swl" = ( -/obj/structure/closet/secure_closet/injection{ - name = "educational injections"; - pixel_x = 2 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"swp" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"swx" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"swD" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/supermatter/room) -"swK" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"swM" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/prison/safe) -"swS" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/science/mixing) -"sxa" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Chapel" - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"sxp" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"sxv" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/storage) -"sxG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"sxP" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"sxT" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Firing Range" - }, -/obj/machinery/light_switch/directional/west{ - pixel_y = -12 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"sxU" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Distro Loop" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/machinery/meter/monitored/distro_loop, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"sxZ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sys" = ( -/obj/structure/bookcase/random/adult, -/turf/open/floor/wood, -/area/station/service/library) -"syz" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"szv" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"szx" = ( -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/machinery/chem_heater/withbuffer, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"szy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"szA" = ( -/obj/effect/turf_decal/tile/dark/half, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"szT" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"sAB" = ( -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron, -/area/station/cargo/storage) -"sAD" = ( -/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/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"sAE" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/service/hydroponics/garden) -"sAI" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"sBb" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"sBd" = ( -/obj/structure/lattice, -/obj/item/stack/cable_coil, -/turf/open/space/basic, -/area/space/nearstation) -"sBp" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"sBq" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 30 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"sBG" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/greater) -"sBL" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/security_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"sCl" = ( -/obj/structure/lattice/catwalk, -/obj/structure/chair/stool/bar/directional/south, -/obj/item/storage/crayons, -/turf/open/space/basic, -/area/space/nearstation) -"sCs" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/requests_console/directional/east{ - announcementConsole = 1; - department = "Captain's Desk"; - departmentType = 5; - name = "Captain's Requests Console" - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"sCB" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Port Primary Hallway - Port" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"sCT" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"sDb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"sDm" = ( -/obj/machinery/deepfryer, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 5 - }, -/obj/machinery/light_switch/directional/south, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"sDw" = ( -/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/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"sDx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/shower{ - name = "emergency shower"; - pixel_y = 16 - }, -/obj/effect/turf_decal/trimline/blue/end, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"sDy" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/grass, -/area/station/science/research) -"sDA" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"sDB" = ( -/obj/structure/table, -/obj/structure/cable, -/obj/item/instrument/harmonica, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"sDL" = ( -/obj/effect/turf_decal/tile/blue, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"sDQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"sDY" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Crematorium"; - req_access_txt = "22;27" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"sEb" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"sEj" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"sEx" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/iannewyear, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"sEy" = ( -/obj/structure/chair, -/obj/effect/landmark/start/chaplain, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"sEQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 11 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"sER" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/service/theater) -"sEU" = ( -/obj/machinery/light/directional/east, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"sEX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"sFe" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/multilayer/connected/one_two, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"sFg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"sFk" = ( -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"sFm" = ( -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/lab) -"sFx" = ( -/obj/machinery/light/directional/west, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/kirbyplants{ - icon_state = "plant-03" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"sFz" = ( -/obj/structure/chair/wood/wings, -/obj/effect/landmark/start/mime, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/theater) -"sFA" = ( -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"sFC" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"sFD" = ( -/obj/structure/light_construct/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"sFL" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron, -/area/station/commons/locker) -"sFY" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/warden) -"sGj" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/service/theater) -"sGD" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"sGG" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/command/teleporter) -"sGS" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/siding/purple, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"sGU" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/robotics/lab) -"sGX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"sHe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"sHp" = ( -/obj/structure/table, -/obj/item/storage/box/bodybags{ - pixel_x = 2; - pixel_y = 2 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"sHs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/command/teleporter) -"sHv" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"sHw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"sHU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"sIl" = ( -/obj/machinery/camera/emp_proof/directional/west{ - c_tag = "Engine Airlock"; - network = list("ss13","engine") - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"sIt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 6 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"sIu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"sIA" = ( -/obj/machinery/door/airlock/external{ - name = "Transport Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"sIO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"sIP" = ( -/obj/machinery/light/no_nightlight/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"sJp" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"sJJ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port) -"sJO" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/customs) -"sJS" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"sKe" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"sKk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"sKn" = ( -/obj/machinery/space_heater/improvised_chem_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"sKE" = ( -/obj/item/radio/intercom/directional/east, -/obj/structure/tank_dispenser, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"sKT" = ( -/obj/item/storage/bag/plants/portaseeder, -/obj/structure/table, -/obj/item/plant_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"sKV" = ( -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"sKY" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/space/basic, -/area/space/nearstation) -"sLg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/engineering, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"sLo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"sLz" = ( -/obj/structure/cable, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/ai) -"sLN" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = 8 - }, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = 8 - }, -/obj/machinery/door/window{ - atom_integrity = 300; - base_state = "leftsecure"; - dir = 8; - icon_state = "leftsecure"; - layer = 4.1; - name = "Tertiary AI Core Access"; - pixel_x = -3; - req_access_txt = "16" - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) -"sLW" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/requests_console/directional/east{ - department = "Atmospherics"; - departmentType = 3; - name = "Atmospherics Requests Console" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"sLX" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/departments/court{ - pixel_y = 32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sMh" = ( -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/item/storage/toolbox/emergency, -/obj/item/storage/toolbox/emergency{ - pixel_x = -2; - pixel_y = -3 - }, -/obj/item/wrench, -/obj/item/multitool, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"sMi" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"sMx" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/computer/apc_control, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/ce) -"sMz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"sMF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"sMH" = ( -/obj/structure/bed, -/obj/item/clothing/suit/straight_jacket, -/obj/item/clothing/glasses/blindfold, -/obj/item/clothing/mask/muzzle, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) -"sMJ" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/structure/transit_tube/station/dispenser/flipped{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"sMS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"sMT" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"sNA" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"sOb" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/office) -"sOo" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/duct, -/obj/machinery/door/airlock/medical/glass{ - name = "Cryogenics Bay"; - req_access_txt = "5" - }, -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"sOr" = ( -/obj/machinery/photocopier, -/obj/machinery/camera/directional/east{ - c_tag = "Law Office" - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"sOy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 6 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"sOz" = ( -/obj/machinery/air_sensor/oxygen_tank, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"sOS" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"sOW" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"sPb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"sPc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sPo" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/cargo/qm) -"sPv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"sPO" = ( -/obj/machinery/atmospherics/components/binary/volume_pump{ - name = "Unit 1 Head Pressure Pump" - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"sQe" = ( -/obj/machinery/sparker/directional/north{ - id = "Xenobio" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"sQf" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"sQj" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"sQn" = ( -/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/iron, -/area/station/engineering/atmos) -"sQs" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"sQw" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"sQG" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light_switch/directional/north, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"sRo" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/bot, -/obj/structure/rack, -/obj/item/lightreplacer{ - pixel_y = 7 - }, -/obj/machinery/status_display/evac/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"sRz" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/engineering) -"sRB" = ( -/mob/living/carbon/human/species/monkey, -/turf/open/floor/grass, -/area/station/science/genetics) -"sRI" = ( -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"sSe" = ( -/obj/machinery/mass_driver/ordnance, -/turf/open/floor/plating, -/area/station/science/mixing/launch) -"sSq" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-16" - }, -/obj/item/radio/intercom/directional/north, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sSw" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmospherics_engine) -"sSL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"sSQ" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"sTk" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/air_tank{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"sTo" = ( -/obj/machinery/space_heater, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"sTt" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"sTC" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"sTF" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"sTJ" = ( -/turf/open/floor/carpet, -/area/station/commons/dorms) -"sTU" = ( -/obj/machinery/door/window/brigdoor/security/cell{ - id = "Cell 3"; - name = "Cell 3" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig) -"sUa" = ( -/obj/machinery/meter/monitored/waste_loop, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"sUj" = ( -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window/right/directional/south{ - name = "Corpse Arrivals" - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"sUm" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"sUq" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/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/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"sUD" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/rack, -/obj/machinery/camera/directional/south{ - c_tag = "Brig - Infirmary" - }, -/obj/item/clothing/under/rank/medical/scrubs/purple, -/obj/item/storage/medkit/regular, -/obj/item/healthanalyzer{ - pixel_y = -2 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"sUE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher/directional/west{ - id = "Cell 3"; - pixel_y = -22 - }, -/obj/structure/bed, -/obj/item/bedsheet, -/turf/open/floor/iron, -/area/station/security/brig) -"sUG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"sUI" = ( -/obj/machinery/light/dim/directional/east, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/engineering/main) -"sUJ" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"sUK" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/vending/coffee{ - default_price = 0; - extra_price = 0; - fair_market_price = 0; - name = "\improper Jim Norton's Quebecois Coffee" - }, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"sUU" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/commons/dorms) -"sVa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"sVx" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"sVF" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/commons/lounge) -"sWd" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"sWh" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"sWj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/radio/intercom/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"sWp" = ( -/obj/structure/closet, -/obj/item/storage/box/lights/mixed, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"sWC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"sWD" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/rack, -/obj/item/storage/briefcase{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/storage/secure/briefcase{ - pixel_x = 2; - pixel_y = -2 - }, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"sWW" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"sXh" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"sXi" = ( -/obj/structure/closet/firecloset, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"sXK" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/bot_white, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"sXM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/atmospheric_technician, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"sXS" = ( -/obj/machinery/door/poddoor/shutters{ - id = "teleshutter"; - name = "Teleporter Access Shutter" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/command/teleporter) -"sXV" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"sYe" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"sYk" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/robotics/lab) -"sYq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"sYJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/starboard) -"sYS" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"sYV" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"sZl" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"sZo" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"sZq" = ( -/obj/structure/table, -/obj/item/candle, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"sZA" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"sZR" = ( -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron, -/area/station/commons/locker) -"sZX" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/computer/station_alert{ - dir = 4 - }, -/obj/structure/plaque/static_plaque/atmos{ - pixel_x = -32 - }, -/obj/machinery/newscaster/directional/south, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Desk" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"tac" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/spawner/random/structure/tank_holder, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"tad" = ( -/obj/structure/table, -/obj/item/stack/sheet/glass/fifty, -/obj/item/stack/rods/fifty, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"tav" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"taP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/lounge) -"taS" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/open/floor/plating, -/area/station/hallway/secondary/command) -"tbb" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"tbf" = ( -/obj/machinery/shieldgen, -/turf/open/floor/plating, -/area/station/engineering/main) -"tbo" = ( -/obj/structure/cable, -/obj/effect/spawner/xmastree, -/turf/open/floor/iron, -/area/station/commons/locker) -"tbv" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bottle/mercury{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/nitrogen{ - pixel_x = 7; - pixel_y = 3 - }, -/obj/item/reagent_containers/glass/bottle/oxygen{ - pixel_x = 1 - }, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 - }, -/area/station/medical/medbay/central) -"tby" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"tbC" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=6-Port-Central"; - location = "5-Customs" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"tbM" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tbP" = ( -/obj/structure/table, -/obj/machinery/airalarm/directional/south, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/science/misc_lab) -"tbQ" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"tbW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"tca" = ( -/obj/machinery/recharge_station, -/obj/effect/turf_decal/stripes/end{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"tcf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"tcp" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"tcv" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tcw" = ( -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"tcU" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/iron/chapel{ - dir = 8 - }, -/area/station/service/chapel) -"tdc" = ( -/obj/effect/landmark/start/station_engineer, -/turf/open/floor/iron, -/area/station/engineering/main) -"tdk" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"tdx" = ( -/obj/effect/turf_decal/trimline/purple/line, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 25 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"tdz" = ( -/obj/structure/closet, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tdK" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/starboard/fore) -"tdY" = ( -/obj/structure/rack, -/obj/item/stack/rods{ - amount = 4 - }, -/obj/item/clothing/suit/apron/chef, -/obj/item/clothing/head/chefhat, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"tec" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/table, -/obj/item/assembly/signaler, -/obj/item/assembly/signaler{ - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/station/engineering/storage/mech) -"tep" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/hallway/primary/fore) -"teP" = ( -/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/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"teQ" = ( -/obj/machinery/door/poddoor{ - id = "QMLoaddoor2"; - name = "Supply Dock Loading Door" - }, -/obj/machinery/conveyor{ - dir = 4; - id = "QMLoad2" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/cargo/storage) -"tfa" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"tfh" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tfi" = ( -/obj/machinery/light/small/directional/west, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"tfz" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"tfJ" = ( -/obj/effect/spawner/random/vending/snackvend, -/obj/machinery/light/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/wood, -/area/station/security/office) -"tfM" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"tgb" = ( -/obj/machinery/holopad, -/turf/open/floor/iron/white, -/area/station/science/storage) -"tgh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"tgk" = ( -/obj/machinery/airalarm/directional/east, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"tgl" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood, -/area/station/commons/lounge) -"tgs" = ( -/obj/effect/spawner/random/trash/mess, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"tgy" = ( -/obj/structure/rack, -/obj/item/clothing/glasses/hud/security/sunglasses/gars{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/glasses/hud/security/sunglasses/gars{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/clothing/glasses/hud/security/sunglasses{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/glasses/hud/security/sunglasses{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/machinery/airalarm/directional/west, -/obj/machinery/camera/motion/directional/west{ - c_tag = "Armory - Internal" - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"tgz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"tgB" = ( -/obj/machinery/status_display/evac/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"tgJ" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"tgO" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"tgQ" = ( -/obj/structure/water_source/puddle, -/obj/structure/flora/junglebush/large{ - pixel_y = 0 - }, -/obj/structure/cable, -/turf/open/floor/grass, -/area/station/medical/virology) -"thg" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"thh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"thq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/watertank, -/turf/open/floor/iron, -/area/station/service/janitor) -"thr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Dormitories" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/dorms) -"thM" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"thN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-toxins-passthrough" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/science/mixing/hallway) -"thR" = ( -/obj/machinery/food_cart, -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"tia" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "aftport"; - name = "Aft-Port Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/port/aft) -"tid" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tiy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"tiE" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"tiF" = ( -/obj/structure/table, -/obj/item/hatchet, -/obj/item/cultivator, -/obj/item/crowbar, -/obj/item/reagent_containers/glass/bucket, -/obj/item/plant_analyzer, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"tiQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"tiR" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"tje" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - id_tag = "innerbrig"; - name = "Brig"; - req_access_txt = "63" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "brig-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"tjo" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"tjp" = ( -/obj/item/reagent_containers/glass/bottle/toxin{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/reagentgrinder{ - pixel_y = 4 - }, -/obj/item/reagent_containers/pill/morphine{ - name = "Exponential Entrophy"; - pixel_x = -9; - pixel_y = -4 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"tjs" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/solars/port/fore) -"tjy" = ( -/obj/effect/turf_decal/box/white, -/obj/effect/turf_decal/arrows/white{ - color = "#0000FF"; - pixel_y = 15 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"tjz" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/table, -/obj/machinery/button/door{ - id = "xenobio2"; - layer = 3.3; - name = "Xenobio Pen 2 Blast Doors"; - pixel_y = 1; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"tjS" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Bridge - Starboard Access" - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"tjW" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"tkp" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"tky" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"tkS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Security Office"; - req_one_access_txt = "1;4" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/office) -"tkY" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research/glass{ - name = "Pharmacy"; - req_access_txt = "5; 69" - }, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"tla" = ( -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"tlf" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/dark{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"tlo" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard, -/obj/item/paper/monitorkey, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/obj/item/clothing/glasses/meson, -/obj/item/lighter, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"tlu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"tlA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"tlD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/effect/landmark/start/depsec/medical, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"tlN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"tlT" = ( -/obj/machinery/door/firedoor, -/obj/structure/window/reinforced, -/obj/machinery/computer/cargo/request{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"tmf" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"tmg" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/wood, -/area/station/service/library) -"tms" = ( -/obj/effect/spawner/random/structure/table_or_rack, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"tmx" = ( -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/atmos) -"tmA" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"tmH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Central East"; - network = list("ss13","rd","xeno") - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"tmO" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"tnf" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/lab) -"tno" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"tnF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"tnM" = ( -/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 = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/service/kitchen) -"toe" = ( -/obj/structure/table/wood, -/obj/machinery/computer/libraryconsole, -/turf/open/floor/wood, -/area/station/service/library) -"ton" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/research) -"too" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"tow" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"toy" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"toQ" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"toS" = ( -/obj/structure/cable/multilayer/connected/one_two, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"toZ" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"tpc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; - req_access_txt = "32"; - space_dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/engine) -"tpd" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/central) -"tpj" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"tpq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/yellow/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tpu" = ( -/obj/effect/spawner/random/structure/grille, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"tpy" = ( -/obj/machinery/firealarm/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/courtroom) -"tpS" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/commons/dorms/cryo) -"tpX" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"tpY" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding{ - dir = 8 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/wrench, -/obj/item/clothing/glasses/welding, -/obj/machinery/firealarm/directional/south, -/turf/open/floor/iron, -/area/station/science/lab) -"tqc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/brig) -"tqf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/obj/structure/cable, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"tqi" = ( -/obj/structure/cable, -/obj/machinery/camera/directional/south{ - c_tag = "Chief Medical Officer's Office"; - network = list("ss13","medbay") - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"tqH" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/goonplaque, -/area/station/hallway/primary/port) -"tqR" = ( -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"tqX" = ( -/obj/structure/sign/warning/pods, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/engine) -"tra" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"trd" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/shower{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"tri" = ( -/obj/machinery/teleport/hub, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"trs" = ( -/obj/item/cigbutt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"tru" = ( -/obj/machinery/computer/warrant{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"trx" = ( -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"trJ" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/turf/open/floor/grass, -/area/station/security/prison) -"trP" = ( -/obj/machinery/modular_computer/console/preset/id, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"tsl" = ( -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"tsp" = ( -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/light_switch/directional/west, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Port-Aft" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"tsw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Brig Infirmary Maintenance"; - req_access_txt = "63" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"tsC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/airlock/research{ - name = "Genetics Lab"; - req_access_txt = "9" - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron/white, -/area/station/science/genetics) -"tsF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"tsK" = ( -/obj/machinery/door/airlock/external{ - name = "Auxiliary Escape Airlock" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"tsX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"tsZ" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/horizontal, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/space, -/area/space/nearstation) -"tta" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Fuel Closet"; - req_one_access_txt = "12;35" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"ttu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"ttw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/holofloor/dark, -/area/station/science/cytology) -"ttA" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"ttC" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"ttT" = ( -/obj/structure/chair/wood/wings{ - dir = 1 - }, -/obj/effect/landmark/start/clown, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/service/theater) -"ttX" = ( -/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/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"ttY" = ( -/obj/machinery/door/airlock/external{ - name = "Solar Maintenance"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"tuk" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"tur" = ( -/obj/structure/disposalpipe/junction/flip, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"tuI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/west, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"tuN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/maintenance, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/segment, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"tuT" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"tvh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"tvt" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"tvz" = ( -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/closed/wall/prepainted/daedalus, -/area/station/command/heads_quarters/captain/private) -"tvB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/security/courtroom) -"tvG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"tvJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/miningoffice) -"tvU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/cargo/storage) -"twa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/chapel) -"twf" = ( -/obj/structure/lattice/catwalk, -/obj/structure/transit_tube/crossing/horizontal, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/space, -/area/space/nearstation) -"twh" = ( -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"twq" = ( -/obj/structure/sign/warning/hottemp{ - pixel_y = -32 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"twK" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/chapel{ - dir = 4 - }, -/area/station/service/chapel) -"twU" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/storage/dice, -/turf/open/floor/wood, -/area/station/commons/lounge) -"twV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"txe" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"txh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "MiniSat Maintenance"; - req_access_txt = "32" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"txo" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"txp" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"txE" = ( -/obj/structure/cable, -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/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/iron/dark, -/area/station/medical/morgue) -"txN" = ( -/obj/machinery/atmospherics/components/trinary/mixer{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"txY" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tyb" = ( -/obj/effect/turf_decal/box/red, -/obj/machinery/atmospherics/components/unary/outlet_injector{ - dir = 1 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"tyh" = ( -/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/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"typ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"tyu" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"tyF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"tyK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"tyQ" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/item/kirbyplants{ - icon_state = "plant-20"; - pixel_y = 3 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"tyU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"tyZ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tzh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) -"tzi" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/lesser) -"tzk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"tzJ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"tzM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"tzP" = ( -/obj/machinery/vending/medical, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"tAb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/cargo/storage) -"tAd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"tAh" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos/pumproom) -"tAn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"tAq" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"tAy" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"tAC" = ( -/obj/machinery/flasher/portable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"tAR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"tBd" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tBg" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/structure/table, -/obj/machinery/telephone/engineering, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"tBk" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/obj/machinery/light/dim/directional/south, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"tBm" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"tBH" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/server) -"tBV" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"tCj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/chair, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"tCr" = ( -/obj/effect/landmark/start/clown, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/service/theater) -"tCA" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"tCO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"tCR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"tDm" = ( -/obj/structure/cable, -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/station/solars/starboard/fore) -"tDs" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/dorms) -"tDH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"tDJ" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"tDL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"tDY" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/commons/dorms) -"tEv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"tED" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/library) -"tEH" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/landmark/start/virologist, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"tEI" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/disposalpipe/segment, -/obj/item/bikehorn/rubberducky, -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"tEQ" = ( -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"tEV" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/greater) -"tFd" = ( -/obj/structure/table, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/item/stock_parts/subspace/filter, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"tFe" = ( -/obj/machinery/door/airlock{ - name = "Bar"; - req_access_txt = "25" - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/bar) -"tFo" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"tFA" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"tFG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Library" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/library) -"tFJ" = ( -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"tFQ" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/science/mixing) -"tFU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"tGt" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/transit_tube/curved/flipped, -/turf/open/space, -/area/space/nearstation) -"tGx" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"tGB" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tGH" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"tGO" = ( -/obj/machinery/airalarm/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"tHb" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"tHc" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin7"; - name = "Cabin 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"tHj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"tHv" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/station/commons/locker) -"tHD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"tHP" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Command Hallway" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"tHT" = ( -/obj/machinery/ai_slipper{ - uses = 10 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"tHX" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"tIc" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "garbage" - }, -/obj/effect/spawner/random/trash/garbage{ - spawn_loot_count = 3; - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"tIU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tIZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"tJe" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/departments/science{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"tJi" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/office) -"tJu" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"tJD" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - N2O" - }, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"tJE" = ( -/obj/effect/turf_decal/trimline/red/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"tJV" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"tKv" = ( -/obj/structure/rack, -/obj/item/reagent_containers/glass/bucket, -/obj/item/mop, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"tKC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"tKF" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"tKT" = ( -/obj/machinery/computer/security/hos{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"tKW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"tLb" = ( -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tLn" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39;25;28" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" - }, -/turf/open/floor/plating, -/area/station/medical/medbay/central) -"tLo" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 4; - pixel_y = 2 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_x = 8 - }, -/obj/item/grenade/chem_grenade/smart_metal_foam{ - pixel_y = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"tLz" = ( -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/obj/machinery/camera/directional/north{ - c_tag = "Science Research Office"; - network = list("ss13","rd") - }, -/turf/open/floor/iron, -/area/station/science/lab) -"tLK" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/security/checkpoint/engineering) -"tMg" = ( -/obj/structure/bed/roller, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"tMk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"tMp" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple/corner{ - dir = 1 - }, -/obj/item/storage/box/bodybags{ - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/storage/box/disks{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"tMI" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"tMV" = ( -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"tNa" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/commons/vacant_room/office) -"tNC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/effect/turf_decal/siding/blue{ - dir = 8 - }, -/obj/effect/turf_decal/siding/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark/telecomms, -/area/station/science/server) -"tNX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"tNZ" = ( -/obj/item/storage/fancy/candle_box{ - pixel_y = 5 - }, -/obj/structure/table/wood, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"tOc" = ( -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"tOg" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"tOi" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"tOw" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"tOz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"tOA" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tPf" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tPg" = ( -/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/iron/dark, -/area/station/engineering/storage/tech) -"tPk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"tPm" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/security/brig) -"tPr" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"tPA" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/lab) -"tPH" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"tPR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/disposal/bin{ - name = "Jim Norton's Quebecois Coffee disposal unit" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"tPS" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"tPW" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"tQb" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Pen #1"; - network = list("ss13","rd","xeno") - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"tQs" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tQE" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tQT" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tQV" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"tQZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/dark/side{ - dir = 4 - }, -/area/station/science/lab) -"tRg" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"tRm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"tRH" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Gravity Generator Room"; - req_access_txt = "19;23" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"tSb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"tSf" = ( -/obj/structure/closet/secure_closet/courtroom, -/obj/machinery/light_switch/directional/north, -/obj/item/gavelblock, -/obj/item/gavelhammer, -/turf/open/floor/iron, -/area/station/security/courtroom) -"tSi" = ( -/obj/structure/chair{ - dir = 4; - name = "Prosecution" - }, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"tSp" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/service/library) -"tSz" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/effect/turf_decal/trimline/brown/filled/warning, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"tSE" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tSP" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"tSS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tSU" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"tTu" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/window{ - name = "MiniSat Walkway Access" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"tTH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Funeral Parlour" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"tTK" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/storage) -"tTL" = ( -/obj/machinery/holopad, -/turf/open/floor/wood, -/area/station/service/library) -"tUa" = ( -/obj/structure/table, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"tUq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"tUy" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/security/prison) -"tUz" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron, -/area/station/science/mixing) -"tUB" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock/maintenance{ - name = "Abandoned Warehouse"; - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"tUF" = ( -/obj/machinery/door/window{ - atom_integrity = 300; - base_state = "rightsecure"; - dir = 4; - icon_state = "rightsecure"; - name = "Primary AI Core Access"; - req_access_txt = "16" - }, -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - Core"; - network = list("aicore") - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"tUH" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/duct, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tUI" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "MiniSat Space Access Airlock"; - req_access_txt = "32" - }, -/obj/machinery/door/poddoor/preopen{ - id = "transitlockdown" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"tUN" = ( -/obj/structure/tank_dispenser, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/science/mixing) -"tUR" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/obj/structure/chair/office, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"tVh" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/service/bar) -"tVi" = ( -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"tVr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"tVy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"tWo" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port) -"tWu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"tWF" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/medical/glass{ - id_tag = "MedbayFoyer"; - name = "Medbay Clinic" - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"tXy" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"tXz" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"tXJ" = ( -/obj/machinery/vending/autodrobe, -/obj/structure/sign/poster/contraband/clown{ - pixel_x = 32 - }, -/obj/structure/sign/poster/contraband/random/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"tXK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"tYr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/break_room) -"tYs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"tYy" = ( -/obj/structure/mirror/directional/east, -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"tYB" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"tYD" = ( -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"tYR" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/north, -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/obj/effect/turf_decal/tile/neutral/half, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"tZf" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/airalarm/directional/west, -/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" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/bar) -"tZi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"tZm" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/corporate_showroom) -"tZx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 9 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"tZy" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"tZW" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Atmospherics Tank - CO2" - }, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"tZX" = ( -/obj/vehicle/ridden/secway, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron/dark, -/area/station/security/office) -"uac" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"uaf" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"uay" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"uaD" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Arrival Airlock"; - space_dir = 1 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"uaE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"uaG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/obj/machinery/light_switch/directional/south, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/service/bar) -"uaN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"uaX" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/table, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"ubj" = ( -/obj/machinery/door/window/brigdoor{ - name = "Justice Chamber"; - req_access_txt = "3" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Justice Chamber"; - req_access_txt = "3" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id = "executionfireblast" - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"ubw" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"ubB" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/obj/machinery/light/small/directional/east, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"ubD" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/research) -"ubI" = ( -/obj/structure/cable, -/obj/machinery/door/window/left/directional/north{ - name = "Containment Pen #7"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"ubO" = ( -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"ucj" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Corporate Showroom"; - req_access_txt = "19" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "showroom" - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"ucl" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "Medical Deliveries" - }, -/obj/structure/plasticflaps/opaque{ - name = "Medical Deliveries" - }, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/structure/sign/departments/examroom{ - color = "#52B4E9"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"ucr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"ucy" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"ucC" = ( -/obj/effect/spawner/random/engineering/canister, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"ucI" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"ucL" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ucP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/caution/stand_clear/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/hidden, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"ucW" = ( -/obj/structure/table/wood, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/book/manual/wiki/security_space_law, -/obj/item/pen/red, -/obj/machinery/computer/security/telescreen{ - desc = "Used for watching Prison Wing holding areas."; - name = "Prison Monitor"; - network = list("prison"); - pixel_y = 30 - }, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"udr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ - dir = 1 - }, -/turf/open/floor/engine/n2, -/area/station/engineering/atmos) -"udw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, -/obj/machinery/meter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"udP" = ( -/obj/effect/decal/cleanable/blood/old, -/obj/effect/spawner/random/medical/patient_stretcher, -/obj/item/toy/plush/snakeplushie{ - name = "Boa Ben" - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"udR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"uee" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/door/window/left/directional/north{ - dir = 4; - name = "Containment Pen #1"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio1"; - name = "Xenobio Pen 1 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"ueg" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"uep" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/turf/open/floor/circuit/telecomms/server, -/area/station/science/server) -"uet" = ( -/obj/item/bot_assembly/floorbot{ - created_name = "FloorDiffBot"; - desc = "Why won't it work?"; - name = "FloorDiffBot" - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"ueB" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"ueC" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/tank_dispenser{ - pixel_x = -1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"ueF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"ueY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library) -"ufg" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/station/security/brig) -"ufi" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/storage) -"ufr" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/fore/lesser) -"ufu" = ( -/obj/structure/chair/stool/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/wood, -/area/station/commons/lounge) -"ufw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ufx" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/obj/structure/sign/poster/official/random/directional/east, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"ufy" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/structure/reagent_dispensers/wall/peppertank/directional/east, -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"ufJ" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/flasher/directional/east{ - id = "holdingflash" - }, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"ufN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Port Primary Hallway" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"ufR" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge"; - req_access_txt = "19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-left" - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"ugi" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ugo" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/computer/mech_bay_power_console{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"ugu" = ( -/obj/structure/cable, -/obj/machinery/holopad/secure, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"ugD" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable/layer1, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"ugI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"uhj" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/warehouse) -"uhm" = ( -/obj/structure/table, -/obj/item/stack/rods/fifty, -/obj/item/wrench, -/obj/item/storage/box/lights/mixed, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"uhw" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"uhI" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"uhU" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"uic" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/commons/dorms) -"uiG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"uiH" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/obj/structure/closet/secure_closet/security/sec, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"uje" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ujg" = ( -/obj/structure/table/wood, -/obj/machinery/newscaster/directional/east, -/obj/effect/spawner/random/bureaucracy/paper, -/turf/open/floor/wood, -/area/station/commons/dorms) -"ujh" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"ujk" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"ujs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/janitorialcart, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/service/janitor) -"ujE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Air to Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"ujL" = ( -/obj/machinery/autolathe, -/obj/machinery/camera/directional/south{ - c_tag = "Cargo - Mailroom" - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"uka" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"ukj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"ukk" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"ukl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"ukD" = ( -/obj/machinery/computer/atmos_control/nocontrol/ordnancemix, -/obj/effect/turf_decal/bot, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"ukF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"ukM" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"ukY" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"ulb" = ( -/obj/structure/table/glass, -/obj/machinery/light/small/directional/north, -/obj/item/folder/white{ - pixel_y = 4 - }, -/obj/item/pen/red, -/obj/machinery/camera/directional/north{ - c_tag = "Virology Isolation A"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"ulj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/obj/machinery/camera/directional/west{ - c_tag = "Atmospherics - Crystallizer" - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmospherics_engine) -"uln" = ( -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"ulq" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ulD" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"ulM" = ( -/obj/machinery/air_sensor/air_tank, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"ulZ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/cargo/drone_bay) -"uml" = ( -/obj/structure/chair, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"umn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"umr" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"umM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"umW" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"und" = ( -/obj/item/radio/intercom/directional/north, -/obj/structure/sign/poster/official/random/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"unm" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"uno" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/virology/glass{ - name = "Containment Cells"; - req_access_txt = "39" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"unA" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/station/service/library) -"unB" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"unK" = ( -/obj/structure/chair/stool/directional/east, -/turf/open/floor/iron, -/area/station/commons/dorms) -"unQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/stairs/left{ - dir = 1 - }, -/area/station/engineering/atmos) -"uod" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"uox" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, -/turf/open/floor/iron, -/area/station/science/mixing) -"uoO" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Atmospherics - Entrance" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/structure/table, -/obj/item/book/manual/wiki/atmospherics, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/t_scanner, -/obj/item/storage/belt/utility, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"upb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"upo" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/service/bar) -"upB" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"upD" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/junction{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"upT" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "medsecprivacy"; - name = "privacy shutter" - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/security/checkpoint/medical) -"upY" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/depsec/supply, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"uqf" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"uqi" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/engineering{ - name = "Auxiliary Base Construction"; - req_one_access_txt = "72" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"uqu" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"uqv" = ( -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"uqU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"uqX" = ( -/obj/structure/cable, -/obj/item/kirbyplants/random, -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uqY" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"urh" = ( -/obj/effect/spawner/random/entertainment/arcade, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"urP" = ( -/obj/machinery/light/no_nightlight/directional/east, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"usc" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"ush" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"usN" = ( -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/turf/open/floor/catwalk_floor/iron, -/area/station/engineering/monitoring) -"usW" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"utc" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageSort2" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/west{ - dir = 4; - name = "Crate Security Door"; - req_access_txt = "50" - }, -/turf/open/floor/plating, -/area/station/cargo/sorting) -"utr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/medical/coldroom) -"utC" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"utD" = ( -/obj/machinery/door/poddoor{ - dir = 4; - id = "sm_core_vent"; - name = "Core Vent" - }, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"utK" = ( -/obj/structure/table, -/obj/item/razor{ - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"utU" = ( -/obj/structure/table, -/obj/machinery/light/directional/south, -/obj/item/storage/medkit/regular{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/medkit/regular, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"utZ" = ( -/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/security/courtroom) -"uug" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_one_access_txt = "12;47" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"uui" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"uuv" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"uuy" = ( -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"uuE" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) -"uuF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"uuG" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"uuL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"uuT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/lab) -"uuW" = ( -/obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"uuX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/ai_monitored/turret_protected/ai_upload) -"uvf" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/orange, -/obj/item/restraints/handcuffs, -/obj/item/reagent_containers/spray/pepper, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"uvn" = ( -/obj/structure/window/reinforced, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"uvo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"uvB" = ( -/obj/structure/table/wood, -/obj/item/stamp{ - pixel_x = 7; - pixel_y = 9 - }, -/obj/item/stamp/denied{ - pixel_x = 7; - pixel_y = 4 - }, -/obj/item/stamp/qm{ - pixel_x = 7; - pixel_y = -2 - }, -/obj/item/clipboard{ - pixel_x = -6; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/cargo/qm) -"uvH" = ( -/obj/effect/turf_decal/trimline/brown/filled/line, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uvV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/radio/intercom/directional/north, -/obj/machinery/shower{ - pixel_y = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"uvZ" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"uwd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"uwg" = ( -/obj/structure/rack, -/obj/machinery/light/directional/west, -/obj/item/clothing/head/helmet/riot{ - pixel_x = 3; - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/riot{ - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/riot{ - pixel_x = -3; - pixel_y = 2 - }, -/obj/item/clothing/head/helmet/alt{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/clothing/head/helmet/alt{ - pixel_y = -2 - }, -/obj/item/clothing/head/helmet/alt{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"uwm" = ( -/obj/structure/closet/emcloset, -/obj/structure/sign/warning/pods{ - pixel_y = 30 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/landmark/start/hangover/closet, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"uwx" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uwS" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/entry) -"uxn" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Containment Pen #1"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"uxp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"uxv" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/defibrillator_mount/directional/south, -/obj/structure/bed/pod{ - desc = "An old medical bed, just waiting for replacement with something up to date."; - name = "medical bed" - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"uxz" = ( -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/commons/locker) -"uxX" = ( -/obj/structure/cable, -/obj/structure/rack, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"uyh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/grunge{ - name = "Courtroom" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"uyC" = ( -/obj/structure/displaycase/captain{ - pixel_y = 5 - }, -/obj/machinery/status_display/evac/directional/north, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"uyD" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"uyH" = ( -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"uyP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/bot, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"uzl" = ( -/obj/machinery/camera/directional/west{ - active_power_usage = 0; - c_tag = "Turbine Vent"; - network = list("turbine"); - use_power = 0 - }, -/turf/open/space/basic, -/area/space) -"uzt" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"uzC" = ( -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"uzE" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"uzH" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Science Firing Range"; - network = list("ss13","rd") - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"uzL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"uzM" = ( -/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ - pixel_x = 32 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"uzN" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #3"; - req_access_txt = "55" - }, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio3"; - name = "Xenobio Pen 3 Blast Door" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"uzW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"uAh" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"uAk" = ( -/turf/open/floor/iron/dark, -/area/station/security/holding_cell) -"uAl" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Departure Lounge" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"uAt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/station/security/brig) -"uBt" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"uBD" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/tcommsat/computer) -"uBO" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"uCb" = ( -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"uCj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"uCA" = ( -/obj/machinery/seed_extractor, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"uCS" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "31; 48" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"uDd" = ( -/obj/structure/chair/comfy{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"uDt" = ( -/obj/structure/easel, -/obj/item/canvas/nineteen_nineteen, -/obj/item/canvas/twentythree_nineteen, -/obj/item/canvas/twentythree_twentythree, -/obj/machinery/light/directional/west, -/turf/open/floor/wood, -/area/station/service/library) -"uDu" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"uDw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"uEg" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/sign/poster/contraband/random/directional/east, -/turf/open/floor/wood, -/area/station/service/theater) -"uEo" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced, -/obj/item/radio/intercom/directional/east, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/command, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"uEx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"uEP" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"uEZ" = ( -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/security/office) -"uFb" = ( -/obj/structure/cable, -/turf/open/floor/grass, -/area/station/medical/virology) -"uFe" = ( -/obj/machinery/disposal/bin, -/obj/machinery/firealarm/directional/south{ - pixel_x = 26 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"uFo" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/station/commons/dorms) -"uFw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"uFz" = ( -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"uFV" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"uFW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"uGk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/server) -"uGn" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Engineering Foyer"; - req_one_access_txt = "32;19" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"uGo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"uGJ" = ( -/obj/machinery/computer/mecha{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/science) -"uGN" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Corporate Showroom"; - req_access_txt = "19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "showroom" - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"uGS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/research) -"uGZ" = ( -/obj/structure/table/wood, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/item/radio/intercom/directional/north, -/obj/item/reagent_containers/food/drinks/mug{ - pixel_x = -4; - pixel_y = 4 - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"uHi" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/medical_doctor, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"uHx" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/sorting) -"uHI" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"uHL" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"uHX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"uIa" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Chapel" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"uIc" = ( -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"uIg" = ( -/obj/machinery/door/window/left/directional/north{ - dir = 8; - name = "Magboot Storage"; - pixel_x = -1; - req_access_txt = "18" - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/rack, -/obj/item/clothing/shoes/magboots{ - pixel_x = -4; - pixel_y = 3 - }, -/obj/item/clothing/shoes/magboots, -/obj/item/clothing/shoes/magboots{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/eva) -"uIj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"uIy" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/science/robotics/lab) -"uJq" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/closet/crate/internals, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"uJy" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"uJR" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/solars/starboard/fore) -"uKh" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"uKj" = ( -/obj/structure/chair, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"uKl" = ( -/obj/structure/table, -/obj/item/cultivator, -/obj/item/hatchet, -/obj/item/crowbar, -/obj/machinery/light/directional/north, -/obj/item/plant_analyzer, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/service/hydroponics/garden) -"uKo" = ( -/obj/structure/rack, -/obj/item/clothing/under/misc/mailman, -/obj/item/clothing/under/misc/vice_officer, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"uKu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"uKA" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/range) -"uKD" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port) -"uKH" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"uLw" = ( -/obj/structure/rack, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/under/rank/prisoner, -/obj/item/clothing/shoes/sneakers/orange, -/obj/item/clothing/shoes/sneakers/orange, -/obj/item/clothing/shoes/sneakers/orange, -/obj/item/clothing/shoes/sneakers/orange, -/obj/item/clothing/shoes/sneakers/orange, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/item/restraints/handcuffs, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"uLA" = ( -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/white, -/area/station/security/prison) -"uLE" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uLI" = ( -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uLR" = ( -/obj/structure/table, -/turf/open/floor/iron, -/area/station/engineering/main) -"uMk" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Quartermaster"; - req_access_txt = "41" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/qm) -"uMs" = ( -/obj/structure/chair/stool/directional/east, -/obj/effect/landmark/start/assistant, -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/commons/lounge) -"uMv" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"uMK" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Pure to Ports" - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"uMS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"uNi" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/light_switch/directional/north, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 8 - }, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/table/wood, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"uNr" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/science/server) -"uNE" = ( -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"uNH" = ( -/obj/machinery/shower{ - pixel_y = 12 - }, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"uNP" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/treatment_center) -"uOc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"uOl" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/storage) -"uOm" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"uOF" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"uOT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"uOZ" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"uPa" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=4-Customs"; - location = "3-Central-Port" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"uPf" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"uPG" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"uPJ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "47" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"uPR" = ( -/obj/effect/turf_decal/trimline/blue/filled/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"uPW" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/science/robotics/lab) -"uQh" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"uQv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"uQy" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"uQF" = ( -/obj/structure/lattice, -/obj/item/stack/rods, -/turf/open/space/basic, -/area/space/nearstation) -"uQS" = ( -/obj/structure/chair/stool/bar/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/commons/lounge) -"uQW" = ( -/obj/machinery/vending/tool, -/obj/effect/turf_decal/delivery, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/storage_shared) -"uQY" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/lounge) -"uRm" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"uRq" = ( -/obj/machinery/light_switch/directional/east, -/obj/machinery/modular_computer/console/preset/curator{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/library) -"uRt" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Port Primary Hallway - Starboard" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"uRW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"uRX" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"uSH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"uSS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"uSZ" = ( -/obj/machinery/door/morgue{ - name = "Relic Closet"; - req_access_txt = "22" - }, -/turf/open/floor/cult, -/area/station/service/chapel/office) -"uTk" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"uTm" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/medical{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"uTD" = ( -/obj/machinery/door/window/left/directional/south{ - dir = 1; - name = "Mass Driver Control Door"; - req_access_txt = "8" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"uTI" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"uTU" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"uTW" = ( -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/clothing/head/cone{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/engineering/main) -"uUf" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sink{ - pixel_y = 29 - }, -/mob/living/simple_animal/mouse/brown/tom, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"uUx" = ( -/obj/structure/chair/office, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/service/library) -"uUA" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"uUD" = ( -/obj/structure/chair/comfy/black, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/bridge) -"uUK" = ( -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"uUX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"uUZ" = ( -/obj/machinery/holopad, -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"uVa" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/obj/machinery/light/small/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"uVc" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"uVp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"uVu" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"uVI" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/office) -"uVN" = ( -/obj/structure/table/wood, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/telephone/command, -/obj/machinery/power/data_terminal, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"uWa" = ( -/obj/item/storage/bag/trash, -/obj/machinery/airalarm/directional/west, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/prison/safe) -"uWh" = ( -/obj/structure/table/glass, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/item/blood_filter, -/obj/machinery/light/directional/north, -/obj/item/bonesetter, -/obj/machinery/button/door/directional/north{ - id = "main_surgery"; - name = "privacy shutters control" - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"uWm" = ( -/obj/structure/flora/rock/jungle, -/turf/open/floor/grass, -/area/station/medical/virology) -"uWn" = ( -/obj/machinery/nuclearbomb/selfdestruct, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"uWE" = ( -/obj/machinery/door/airlock/atmos/glass{ - name = "Atmospherics Monitoring"; - req_access_txt = "24" - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/checker, -/area/station/engineering/atmos/storage/gas) -"uWN" = ( -/obj/machinery/cryopod{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"uWR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/airlock/maintenance{ - name = "Medical Freezer Maintenance"; - req_access_txt = "5" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"uWW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/gateway) -"uWZ" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"uXa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/command/heads_quarters/ce) -"uXo" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/chapel) -"uXC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"uXD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"uXP" = ( -/obj/machinery/light_switch/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"uXT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"uXX" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"uYd" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/siding/white{ - dir = 1 - }, -/turf/open/floor/iron/kitchen_coldroom, -/area/station/medical/coldroom) -"uYj" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/engineering/main) -"uYn" = ( -/obj/structure/sign/warning/coldtemp{ - name = "\improper CRYOGENICS"; - pixel_y = 32 - }, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, -/turf/open/floor/iron/dark/textured, -/area/station/medical/cryo) -"uYL" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"uYZ" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/disposal/incinerator) -"uZd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"uZU" = ( -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/machinery/light/directional/west, -/obj/structure/table/glass, -/obj/item/storage/secure/safe/caps_spare/directional/west, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"var" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"vas" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vaw" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vaD" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"vaJ" = ( -/obj/machinery/airalarm/directional/west, -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -2 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = 7; - pixel_y = 2 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/computer_hardware/hard_drive/portable{ - pixel_x = -8; - pixel_y = -3 - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"vaK" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"vaY" = ( -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/effect/turf_decal/trimline/brown/warning, -/obj/machinery/camera/directional/north, -/obj/item/reagent_containers/glass/rag, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"vba" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"vbf" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"vbh" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/grimy, -/area/station/security/interrogation) -"vbi" = ( -/obj/item/clothing/suit/hazardvest, -/obj/item/clothing/suit/hazardvest, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/item/tank/internals/emergency_oxygen/engi, -/obj/effect/turf_decal/delivery, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/engineering/main) -"vbm" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/turf/open/space/basic, -/area/space) -"vbo" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/yjunction{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vbt" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"vbB" = ( -/obj/machinery/airalarm/directional/north, -/obj/effect/spawner/random/structure/closet_private, -/obj/item/clothing/under/suit/tan, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"vbF" = ( -/obj/machinery/light_switch/directional/north, -/obj/machinery/pipedispenser/disposal, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/no_nightlight/directional/north, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vbR" = ( -/obj/structure/table/glass, -/obj/item/clothing/accessory/armband/hydro, -/obj/item/clothing/suit/apron, -/obj/item/wrench, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"vca" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/structure/mirror/directional/east, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"vct" = ( -/obj/effect/spawner/random/structure/grille, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"vcO" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vcQ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 4; - sortType = 13 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"vcT" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"vdb" = ( -/obj/machinery/door/airlock/hatch{ - name = "Telecomms Control Room"; - req_one_access_txt = "19; 61" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/dark, -/area/station/tcommsat/computer) -"vdd" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vde" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"vdo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"vdF" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/rack, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron, -/area/station/engineering/main) -"vdH" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"ved" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/cargo/storage) -"vep" = ( -/obj/machinery/portable_atmospherics/scrubber/huge, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"vet" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"vew" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"veC" = ( -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"veH" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Power Monitoring" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/computer/station_alert, -/turf/open/floor/iron/dark, -/area/station/engineering/main) -"veJ" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/obj/machinery/flasher/directional/east{ - id = "hopflash"; - pixel_y = -26 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"veQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/station/science/test_area) -"veU" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"veX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/chair/stool/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"vfl" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/obj/effect/turf_decal/stripes/white/full, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"vfz" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/reagent_dispensers/fueltank/large, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"vfL" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/purple{ - dir = 6 - }, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"vgj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/range) -"vgq" = ( -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"vgw" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/locker) -"vgH" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics"; - req_one_access_txt = "35;28" - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"vgY" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/science/mixing) -"vhr" = ( -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"vhF" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"vhG" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/port) -"vhK" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"vhQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vil" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"vio" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"vir" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/shower{ - pixel_y = 12 - }, -/obj/structure/curtain, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/captain/private) -"vis" = ( -/obj/structure/filingcabinet, -/obj/item/folder/documents, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"viJ" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/cable, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"viT" = ( -/obj/machinery/power/tracker, -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/aft) -"viX" = ( -/obj/machinery/modular_computer/console/preset/id{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/office) -"vjb" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"vjg" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron, -/area/station/science/research) -"vjp" = ( -/obj/machinery/duct, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"vjs" = ( -/turf/open/floor/carpet, -/area/station/command/bridge) -"vjA" = ( -/obj/structure/cable, -/obj/machinery/holopad/secure, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer3, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat/foyer) -"vkc" = ( -/obj/effect/landmark/start/librarian, -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/service/library) -"vkd" = ( -/obj/machinery/door/poddoor{ - id = "QMLoaddoor"; - name = "Supply Dock Loading Door" - }, -/obj/machinery/conveyor{ - dir = 8; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"vkp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"vkJ" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, -/obj/machinery/door/poddoor/shutters/radiation/preopen{ - dir = 4; - id = "engine_emitter" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"vkL" = ( -/obj/structure/table/reinforced, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/glass/fifty, -/obj/item/circuitboard/mecha/ripley/main, -/obj/item/circuitboard/mecha/ripley/peripherals, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"vkP" = ( -/obj/structure/closet/l3closet/virology, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"vkX" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"vlm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"vlx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"vlz" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"vlR" = ( -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"vlV" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/button/door/directional/north{ - id = "evashutter"; - name = "E.V.A. Storage Shutter Control"; - req_access_txt = "19" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vmd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vml" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/secondary/exit/departure_lounge) -"vms" = ( -/obj/machinery/door/airlock{ - id_tag = "Cabin3"; - name = "Cabin 6" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/dorms) -"vmw" = ( -/obj/machinery/air_sensor/engine, -/obj/structure/cable, -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"vmM" = ( -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/north, -/obj/structure/table/wood, -/obj/item/phone{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"vmT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vmV" = ( -/obj/item/radio/intercom/directional/south, -/obj/structure/table/reinforced, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/item/clothing/head/welding, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"vnr" = ( -/obj/structure/disposalpipe/junction/yjunction, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white/side, -/area/station/medical/medbay/central) -"vnw" = ( -/obj/structure/cable, -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"vnD" = ( -/obj/machinery/light/directional/east, -/obj/structure/table/reinforced, -/obj/item/storage/box/lights/mixed, -/obj/item/stack/sheet/iron{ - amount = 30 - }, -/obj/item/radio/off{ - pixel_x = -5; - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/structure/sign/poster/random/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"vnG" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/recharger, -/obj/item/restraints/handcuffs, -/obj/structure/table/glass, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"vnR" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/service/library) -"vnW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/dorms) -"voe" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmos) -"vof" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ - dir = 1 - }, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"vow" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/machinery/light_switch/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"voy" = ( -/obj/structure/table, -/obj/item/folder/red{ - pixel_x = 3 - }, -/obj/item/folder/white{ - pixel_x = -4; - pixel_y = 2 - }, -/obj/item/restraints/handcuffs, -/obj/machinery/light/directional/east, -/obj/item/radio/off, -/obj/machinery/requests_console/directional/east{ - department = "Security"; - departmentType = 5; - name = "Security Requests Console" - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"voB" = ( -/obj/machinery/light_switch/directional/west, -/turf/open/floor/iron/grimy, -/area/station/security/detectives_office) -"voI" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen_counter"; - name = "Kitchen Counter Shutters" - }, -/obj/item/holosign_creator/robot_seat/restaurant, -/turf/open/floor/iron/cafeteria{ - dir = 5 - }, -/area/station/service/kitchen) -"voJ" = ( -/obj/machinery/vending/cola/red, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"voK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/science/lab) -"voM" = ( -/obj/machinery/status_display/evac/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Starboard - Kitchen" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"voY" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ - dir = 9 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"vpa" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"vpd" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/recharge_station, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"vpC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"vpX" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"vql" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/service/library) -"vqo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Corporate Showroom"; - req_access_txt = "19" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "showroom" - }, -/turf/open/floor/wood, -/area/station/command/corporate_showroom) -"vqz" = ( -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/research) -"vqB" = ( -/obj/machinery/microwave{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/structure/table, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/office) -"vqC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/science/robotics/mechbay) -"vrk" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/junction/flip{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vrm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/research) -"vrB" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/structure/rack, -/obj/effect/spawner/random/clothing/costume, -/obj/effect/spawner/random/clothing/costume, -/turf/open/floor/plating, -/area/station/maintenance/port) -"vrJ" = ( -/obj/machinery/porta_turret/ai{ - dir = 8 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"vrL" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"vrS" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"vrZ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"vse" = ( -/obj/structure/rack, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/effect/spawner/random/engineering/toolbox, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vss" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Aft Primary Hallway" - }, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/science/lobby) -"vsw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"vsC" = ( -/obj/machinery/atmospherics/components/binary/circulator/cold, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"vsE" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"vsP" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/engineering/storage_shared) -"vsS" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/camera/directional/north{ - c_tag = "Prison Visitation"; - network = list("ss13","prison") - }, -/obj/effect/turf_decal/trimline/red/warning{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"vtR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"vtW" = ( -/obj/structure/table, -/obj/item/stack/wrapping_paper, -/obj/item/stack/wrapping_paper{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"vuf" = ( -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vuA" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"vuB" = ( -/obj/machinery/atmospherics/components/binary/pump, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"vuF" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/hallway/primary/port) -"vuI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"vuS" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"vvo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/l3closet/janitor, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/station/service/janitor) -"vvq" = ( -/obj/structure/chair/stool/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"vvv" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"vvM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"vwU" = ( -/obj/structure/table/glass, -/obj/item/storage/secure/briefcase{ - pixel_x = 3; - pixel_y = 5 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"vxd" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/security/prison) -"vxs" = ( -/obj/effect/turf_decal/tile/yellow, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vxF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/station/science/research) -"vxI" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/security/courtroom) -"vyl" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"vym" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/starboard/greater) -"vyp" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Holodeck Control" - }, -/obj/item/radio/intercom/directional/south, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"vyt" = ( -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"vyu" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/poster/random/directional/south, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"vyz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vyM" = ( -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vyN" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"vyO" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"vzg" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"vzo" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"vzC" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"vzJ" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"vzN" = ( -/obj/effect/spawner/structure/window/prepainted/daedalus, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/open/floor/plating, -/area/station/medical/medbay/lobby) -"vzQ" = ( -/obj/structure/cable, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"vzU" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"vzV" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vzY" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"vAi" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vAr" = ( -/obj/structure/table, -/obj/machinery/computer/security/telescreen/ordnance{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"vAx" = ( -/obj/item/target/syndicate, -/obj/structure/training_machine, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/security/range) -"vAB" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/directional/south, -/obj/structure/rack, -/obj/item/clothing/under/color/blue, -/obj/item/clothing/ears/earmuffs, -/obj/item/clothing/neck/tie/blue, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"vAC" = ( -/obj/structure/sign/warning/vacuum/external, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/space/nearstation) -"vAP" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding/purple{ - dir = 4 - }, -/obj/item/radio/headset/headset_medsci{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 9 - }, -/obj/item/storage/box/gloves{ - pixel_x = 5; - pixel_y = 1 - }, -/obj/machinery/button/door/directional/east{ - id = "rdgene2"; - name = "Secondary Genetics Shutters Control"; - pixel_y = -6; - req_access_txt = "7" - }, -/obj/machinery/button/door/directional/east{ - id = "rdgene"; - name = "Primary Genetics Shutters Control"; - pixel_y = 6; - req_access_txt = "7" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"vAY" = ( -/obj/machinery/door/airlock/mining{ - name = "Warehouse"; - req_one_access_txt = "31;48" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"vBb" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"vBf" = ( -/obj/machinery/door/window/right/directional/west, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"vBq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"vBr" = ( -/obj/machinery/door/airlock/external, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "starboard-bow-airlock" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vBv" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 6 - }, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"vBw" = ( -/obj/machinery/door/poddoor/shutters{ - id = "qm_warehouse"; - name = "Warehouse Shutters" - }, -/obj/effect/turf_decal/caution/stand_clear, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"vBH" = ( -/obj/machinery/portable_atmospherics/pump, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vBI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/chapel) -"vBO" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"vBS" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/office) -"vBX" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"vCa" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vCn" = ( -/obj/machinery/rnd/destructive_analyzer, -/obj/effect/turf_decal/siding{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/science/lab) -"vCy" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vCF" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/siding/red{ - dir = 6 - }, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"vCN" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/structure/sign/warning/electricshock, -/obj/machinery/door/poddoor/preopen{ - id = "xenobio8"; - name = "Xenobio Pen 8 Blast Door" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"vDb" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"vDd" = ( -/obj/structure/cable/layer1, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"vDg" = ( -/obj/structure/disposaloutlet{ - desc = "An outlet for the pneumatic disposal system. This one seems designed for rapid corpse disposal."; - dir = 8; - name = "rapid corpse mover 9000" - }, -/obj/structure/window/reinforced, -/obj/structure/disposalpipe/trunk, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"vDj" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/effect/turf_decal/trimline/yellow/warning, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vDl" = ( -/obj/structure/lattice, -/obj/item/tail_pin, -/turf/open/space/basic, -/area/space/nearstation) -"vDB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - 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/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"vDD" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;63;48;50" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/fore/lesser) -"vDJ" = ( -/obj/structure/sign/poster/official/cleanliness{ - pixel_x = 32 - }, -/obj/structure/sink{ - pixel_y = 22 - }, -/obj/effect/turf_decal/bot, -/obj/item/clothing/suit/apron/chef{ - name = "Jim Norton's Quebecois Coffee apron" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/north{ - c_tag = "Jim Norton's Quebecois Coffee" - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"vDK" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/office) -"vDP" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Head of Personnel's Office" - }, -/obj/structure/table/wood, -/obj/item/storage/box/pdas{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/silver_ids, -/obj/item/storage/box/ids, -/obj/machinery/light/directional/south, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hop) -"vDT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"vDW" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/office) -"vDX" = ( -/obj/structure/cable, -/obj/machinery/holopad/secure, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"vEv" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/vehicle/ridden/trolley, -/turf/open/floor/iron, -/area/station/cargo/storage) -"vEx" = ( -/obj/structure/table/wood, -/obj/machinery/light/small/directional/west, -/obj/item/radio/off{ - pixel_y = 4 - }, -/obj/item/screwdriver{ - pixel_y = 10 - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"vED" = ( -/obj/structure/window/reinforced/tinted{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/research) -"vEE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"vEF" = ( -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"vEV" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"vFb" = ( -/obj/structure/lattice/catwalk, -/obj/item/binoculars, -/turf/open/space/basic, -/area/space/nearstation) -"vFk" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vFp" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=16-Fore"; - location = "15-Court" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"vFv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"vFN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/mech_bay_power_console{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"vGb" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"vGr" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"vGs" = ( -/obj/item/pushbroom, -/obj/structure/closet{ - name = "janitorial supplies" - }, -/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/iron/dark, -/area/station/medical/morgue) -"vGA" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"vGL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"vHg" = ( -/obj/item/radio/intercom/directional/north, -/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/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"vHu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/department/medical/central) -"vHG" = ( -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"vHM" = ( -/obj/effect/turf_decal/tile/neutral/half/contrasted, -/turf/open/floor/iron, -/area/station/security/courtroom) -"vHP" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"vHT" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"vIc" = ( -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"vIe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vIi" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/o_plus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/item/reagent_containers/blood/b_plus, -/obj/item/reagent_containers/blood/b_minus, -/obj/item/reagent_containers/blood/a_plus, -/obj/item/reagent_containers/blood/a_minus, -/obj/item/reagent_containers/blood/lizard, -/obj/item/reagent_containers/blood/ethereal, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"vIn" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/medical) -"vIo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/external{ - name = "Escape Pod Four"; - req_access_txt = "32"; - space_dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/department/engine) -"vIy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"vIA" = ( -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"vIC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/service/library) -"vIG" = ( -/turf/open/floor/engine/airless, -/area/station/engineering/supermatter/room) -"vIJ" = ( -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"vIZ" = ( -/obj/effect/turf_decal/tile/red/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/office) -"vJs" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"vJt" = ( -/obj/structure/cable, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"vJv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/red/filled/warning{ - dir = 10 - }, -/obj/machinery/modular_computer/console/preset/cargochat/security{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"vJG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Storage Room"; - req_access_txt = "12" - }, -/obj/effect/mapping_helpers/airlock/abandoned, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"vKf" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "MiniSat Exterior - Port Aft"; - network = list("minisat") - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vKl" = ( -/obj/structure/cable, -/obj/machinery/power/solar_control{ - dir = 1; - id = "starboardsolar"; - name = "Starboard Quarter Solar Control" - }, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"vKn" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/engine/n2o, -/area/station/engineering/atmos) -"vKp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"vKs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"vKK" = ( -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = -8; - pixel_y = -3 - }, -/obj/item/paperslip{ - pixel_x = -5; - pixel_y = 10 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"vKT" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"vLe" = ( -/obj/structure/musician/piano, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/wood, -/area/station/service/theater) -"vLh" = ( -/obj/machinery/smartfridge/drinks{ - icon_state = "boozeomat" - }, -/obj/effect/turf_decal/tile/bar, -/obj/structure/low_wall/prepainted/daedalus, -/turf/open/floor/iron, -/area/station/service/bar) -"vLo" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"vLr" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/construction/storage_wing) -"vLB" = ( -/obj/structure/table, -/obj/effect/turf_decal/siding{ - dir = 9 - }, -/obj/item/stock_parts/matter_bin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stock_parts/matter_bin, -/obj/item/stock_parts/micro_laser, -/turf/open/floor/iron, -/area/station/science/lab) -"vLF" = ( -/obj/effect/landmark/blobstart, -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"vLK" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"vMe" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/machinery/newscaster/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/central) -"vMg" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"vMu" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/space_hut) -"vMJ" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;63;48;50" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"vMO" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/newscaster/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"vMW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 9 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"vNi" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"vNt" = ( -/obj/structure/tank_dispenser, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"vNF" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"vNK" = ( -/obj/structure/table, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/machinery/light/small/directional/north, -/obj/item/assembly/flash/handheld, -/obj/item/assembly/flash/handheld, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"vNS" = ( -/obj/item/target/syndicate, -/turf/open/floor/engine, -/area/station/science/misc_lab/range) -"vNT" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 1 - }, -/turf/open/space, -/area/space/nearstation) -"vNU" = ( -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"vNX" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"vOe" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"vOl" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"vOz" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/landmark/navigate_destination/bar, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/reagent_containers/glass/rag, -/obj/structure/table, -/obj/machinery/duct, -/turf/open/floor/iron, -/area/station/service/bar) -"vOO" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/machinery/door/window{ - base_state = "right"; - icon_state = "right"; - name = "MiniSat Walkway Access" - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"vOT" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"vPl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"vPA" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"vPJ" = ( -/obj/structure/closet, -/obj/item/extinguisher, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"vPM" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/machinery/light/small/maintenance/directional/north, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"vPU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output{ - dir = 1 - }, -/turf/open/floor/engine/co2, -/area/station/engineering/atmos) -"vQj" = ( -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/machinery/airalarm/directional/east, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"vQn" = ( -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"vQF" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"vQQ" = ( -/obj/structure/table, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/item/multitool/circuit{ - pixel_x = 7 - }, -/obj/item/multitool/circuit, -/obj/item/multitool/circuit{ - pixel_x = -8 - }, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"vRp" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/atmospherics_engine) -"vRu" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/fore/lesser) -"vRF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ - pixel_x = 40; - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"vRT" = ( -/obj/machinery/light/directional/south, -/obj/item/stack/sheet/cardboard{ - amount = 14 - }, -/obj/item/stack/package_wrap, -/turf/open/floor/iron, -/area/station/security/prison) -"vRZ" = ( -/obj/structure/closet/secure_closet/warden, -/obj/item/gun/energy/laser, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"vSi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"vSn" = ( -/obj/effect/turf_decal/trimline/green/filled/corner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"vSt" = ( -/obj/machinery/portable_atmospherics/canister/carbon_dioxide, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"vSJ" = ( -/obj/item/radio/intercom/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Cargo Bay - Fore" - }, -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/box/red, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"vSQ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ - dir = 1 - }, -/turf/open/floor/engine/o2, -/area/station/engineering/atmos) -"vTa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"vTg" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"vTi" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Secure Tech Storage"; - req_access_txt = "19;23" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"vTz" = ( -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"vTR" = ( -/obj/machinery/firealarm/directional/west, -/obj/structure/table, -/obj/item/folder, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/locker) -"vUa" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "Engineering Deliveries" - }, -/obj/structure/plasticflaps/opaque{ - name = "Engineering Deliveries" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/structure/sign/departments/engineering{ - color = "#EFB341"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"vUk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"vUo" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"vUI" = ( -/obj/structure/table/glass, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"vUX" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"vUY" = ( -/obj/structure/table/wood, -/obj/item/camera_film{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/camera_film{ - pixel_y = 9 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood, -/area/station/service/library) -"vVn" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/structure/window/reinforced, -/obj/machinery/door/window{ - dir = 8; - name = "Secure Art Exhibition"; - req_access_txt = "37" - }, -/obj/structure/sign/painting/library_secure{ - pixel_x = 32 - }, -/obj/effect/spawner/random/decoration/statue{ - spawn_loot_chance = 50 - }, -/turf/open/floor/carpet/royalblue, -/area/station/service/library) -"vVo" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"vVp" = ( -/obj/machinery/door/window/left/directional/north{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "Containment Pen #5"; - req_access_txt = "55" - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"vVt" = ( -/obj/structure/table, -/obj/item/storage/bag/tray/cafeteria, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"vVB" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"vVE" = ( -/obj/machinery/camera/motion/directional/east{ - c_tag = "MiniSat Maintenance"; - network = list("minisat") - }, -/obj/structure/rack, -/obj/item/storage/toolbox/electrical{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/storage/toolbox/mechanical, -/obj/item/multitool, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"vVM" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/structure/closet/crate/goldcrate, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/nuke_storage) -"vVP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/white/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"vWe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/command/gateway) -"vWm" = ( -/obj/item/radio/intercom/directional/west, -/obj/structure/table, -/obj/item/storage/backpack/duffelbag/sec/surgery{ - pixel_y = 5 - }, -/obj/item/clothing/mask/balaclava, -/obj/item/reagent_containers/spray/cleaner{ - pixel_x = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/red/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"vWr" = ( -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"vWs" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/obj/effect/landmark/start/depsec/medical, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"vWO" = ( -/obj/machinery/disposal/delivery_chute{ - dir = 1; - name = "Service Deliveries" - }, -/obj/structure/plasticflaps/opaque{ - name = "Service Deliveries" - }, -/obj/structure/disposalpipe/trunk{ - dir = 2 - }, -/obj/structure/sign/departments/botany{ - color = "#9FED58"; - pixel_y = -32 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"vWV" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/obj/item/camera, -/obj/item/camera_film, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/station/commons/storage/art) -"vXh" = ( -/obj/structure/closet/emcloset, -/obj/machinery/camera/directional/west{ - c_tag = "Xenobiology Lab - Airlock"; - network = list("ss13","rd","xeno") - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology/hallway) -"vXl" = ( -/obj/effect/turf_decal/stripes/red/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/science/cytology) -"vXs" = ( -/obj/machinery/chem_master, -/obj/machinery/light/directional/east, -/obj/structure/noticeboard/directional/east, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"vXD" = ( -/obj/structure/table/wood/poker, -/obj/structure/cable, -/obj/effect/spawner/random/entertainment/deck, -/turf/open/floor/wood, -/area/station/commons/lounge) -"vXF" = ( -/obj/machinery/vending/wardrobe/law_wardrobe, -/turf/open/floor/wood, -/area/station/service/lawoffice) -"vXL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"vXU" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vYb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/wood, -/area/station/service/bar) -"vYk" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/medical/coldroom) -"vYq" = ( -/obj/machinery/firealarm/directional/east, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/commons/toilet/auxiliary) -"vYs" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/aft) -"vYX" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Bridge - Command Chair" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "bridge blast"; - name = "Bridge Access Blast Door Control"; - req_access_txt = "19" - }, -/obj/machinery/button/door/directional/south{ - id = "council blast"; - name = "Council Chamber Blast Door Control"; - pixel_y = -34; - req_access_txt = "19" - }, -/turf/open/floor/carpet, -/area/station/command/bridge) -"vZd" = ( -/obj/structure/chair/stool/directional/south, -/turf/open/floor/iron, -/area/station/security/prison) -"vZn" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"vZz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"vZC" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Gravity Generator Foyer" - }, -/obj/structure/closet/radiation, -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 - }, -/obj/machinery/airalarm/directional/east, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"waa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ - icon_state = "manifold-3"; - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"wap" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"waq" = ( -/obj/docking_port/stationary{ - dir = 4; - dwidth = 1; - height = 4; - roundstart_template = /datum/map_template/shuttle/escape_pod/default; - width = 3 - }, -/turf/open/space/basic, -/area/space) -"waJ" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/central) -"waR" = ( -/obj/structure/chair/stool/directional/north, -/turf/open/floor/iron, -/area/station/commons/locker) -"wbj" = ( -/obj/structure/chair/stool/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/prison) -"wbl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/hangover, -/obj/machinery/duct, -/obj/effect/turf_decal/tile/bar/opposingcorners, -/turf/open/floor/iron/white, -/area/station/service/kitchen) -"wbs" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"wbu" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/firealarm/directional/south, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"wbv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wbE" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"wcm" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/item/airlock_painter/decal, -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"wcs" = ( -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"wdn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"wdp" = ( -/obj/effect/decal/cleanable/insectguts, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"wdq" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"wdF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"wdO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"wdQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/camera/directional/east{ - c_tag = "Outer Vault"; - name = "storage wing camera" - }, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/trimline/brown/filled/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"wdU" = ( -/obj/structure/table/wood, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"wea" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"weo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/engine_smes) -"weM" = ( -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 4; - name = "Cold Loop Supply" - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"weW" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "5" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"wfc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/office) -"wff" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/north{ - name = "Inner Pipe Access"; - req_access_txt = "24" - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/pump/off{ - dir = 1; - name = "O2 To Pure" - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"wfg" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"wfq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/carpet/green, -/area/station/maintenance/port/aft) -"wfw" = ( -/turf/open/floor/iron, -/area/station/cargo/storage) -"wfJ" = ( -/obj/effect/turf_decal/box, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"wfQ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"wfY" = ( -/obj/machinery/suit_storage_unit/cmo, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 10 - }, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/cmo) -"wgz" = ( -/obj/structure/table, -/obj/machinery/newscaster/directional/east, -/obj/machinery/camera/directional/south{ - c_tag = "Departure Lounge - Security Post" - }, -/obj/item/book/manual/wiki/security_space_law{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/taperecorder{ - pixel_x = 4 - }, -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/red/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"wgB" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"wgW" = ( -/obj/structure/table, -/obj/effect/spawner/random/bureaucracy/folder, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"wgY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"wgZ" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"whg" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/security/prison) -"whl" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"whp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/office) -"whs" = ( -/obj/structure/cable, -/obj/machinery/airalarm/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/security/warden) -"whB" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/fore) -"whM" = ( -/obj/structure/sign/warning/securearea{ - desc = "A warning sign which reads 'BOMB RANGE"; - name = "BOMB RANGE" - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/test_area) -"whU" = ( -/obj/effect/spawner/random/trash/box, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"whX" = ( -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"wia" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wif" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/obj/machinery/light/small/red/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"wip" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Locker Room" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"wiu" = ( -/obj/structure/closet/crate, -/obj/item/stack/sheet/rglass{ - amount = 50 - }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/storage/toolbox/emergency, -/obj/structure/window/reinforced, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"wiy" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"wiz" = ( -/obj/effect/spawner/random/trash/janitor_supplies, -/obj/structure/rack, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"wiF" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) -"wiH" = ( -/obj/machinery/door/airlock/command{ - name = "Command Desk"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"wiX" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/service/bar) -"wiZ" = ( -/obj/machinery/door/airlock/external{ - name = "Security External Airlock"; - req_access_txt = "1" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/security/prison) -"wjG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai) -"wjL" = ( -/obj/item/radio/intercom/directional/south, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"wjQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"wjS" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"wka" = ( -/obj/structure/closet/l3closet/security, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"wkc" = ( -/obj/structure/closet/crate/coffin, -/obj/machinery/door/window/left/directional/east{ - name = "Coffin Storage"; - req_access_txt = "22" - }, -/turf/open/floor/plating, -/area/station/service/chapel/funeral) -"wki" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"wkj" = ( -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"wkk" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/holopad, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"wkv" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/item/laser_pointer/red, -/turf/open/space/basic, -/area/space/nearstation) -"wkx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/central) -"wkD" = ( -/obj/machinery/power/shieldwallgen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/teleporter) -"wkG" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/command/heads_quarters/rd) -"wkJ" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/engine/air, -/area/station/engineering/atmos) -"wkO" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"wkW" = ( -/obj/structure/plasticflaps/opaque, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=1"; - dir = 1; - freq = 1400; - location = "Hydroponics" - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"wli" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Medbay Maintenance"; - req_access_txt = "5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"wlD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"wlJ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/iron/dark/textured, -/area/station/engineering/atmos) -"wlT" = ( -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wma" = ( -/obj/structure/closet/secure_closet/security/sec, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/lockers) -"wmd" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"wmB" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"wmD" = ( -/obj/structure/chair/stool/directional/south{ - dir = 1; - name = "Jim Norton's Quebecois Coffee stool" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/wood, -/area/station/service/cafeteria) -"wmE" = ( -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"wmV" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/fore) -"wmY" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"wnp" = ( -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/item/emptysandbag, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/station/cargo/storage) -"wnx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"wnB" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"wnE" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"wnF" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 8 - }, -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"wnQ" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"wnY" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"woa" = ( -/obj/machinery/light/dim/directional/north, -/obj/machinery/suit_storage_unit/radsuit, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"wof" = ( -/obj/machinery/light/directional/east, -/obj/structure/filingcabinet, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 8; - pixel_x = 26 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"wos" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;48;50;1" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"wow" = ( -/obj/structure/cable, -/obj/effect/landmark/start/security_officer, -/turf/open/floor/iron, -/area/station/security/office) -"woy" = ( -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/medical{ - pixel_y = 8 - }, -/obj/structure/sign/directions/science{ - pixel_y = -8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/service/library) -"woB" = ( -/obj/machinery/door/airlock/external{ - name = "Supply Dock Airlock"; - req_access_txt = "31" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"woD" = ( -/obj/effect/turf_decal/loading_area, -/obj/machinery/airalarm/directional/east, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"woM" = ( -/obj/effect/turf_decal/trimline/purple/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/science/research) -"woO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/aft) -"woT" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wpb" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"wpc" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"wpI" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/space_hut) -"wpJ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/highsecurity{ - name = "AI Upload"; - req_access_txt = "16" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai_upload) -"wpK" = ( -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/item/paper/fluff/smartwire_rant, -/obj/machinery/button/door/directional/south{ - id = "smesroom_door"; - name = "Access Door Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/engine_smes) -"wpP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"wpX" = ( -/obj/structure/chair/comfy/brown, -/turf/open/floor/engine/cult, -/area/station/service/library) -"wqL" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "council blast"; - name = "Council Blast Doors" - }, -/obj/structure/cable, -/obj/effect/mapping_helpers/paint_wall/bridge, -/turf/open/floor/plating, -/area/station/command/bridge) -"wqQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wrf" = ( -/obj/structure/closet/secure_closet/quartermaster, -/obj/machinery/airalarm/directional/north, -/obj/machinery/camera/directional/north, -/turf/open/floor/wood, -/area/station/cargo/qm) -"wrj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/commons/vacant_room/commissary) -"wrv" = ( -/obj/structure/table/reinforced, -/obj/item/stamp/denied{ - pixel_x = 4; - pixel_y = -2 - }, -/obj/item/stamp{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/item/pen/red{ - pixel_y = 10 - }, -/obj/item/dest_tagger{ - pixel_x = 9; - pixel_y = 10 - }, -/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"wrD" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "rndlab2"; - name = "Secondary Research and Development Shutter" - }, -/obj/machinery/door/window/left/directional/south{ - dir = 4; - name = "Research Lab Desk"; - req_one_access_txt = "7" - }, -/obj/item/folder, -/obj/item/pen, -/turf/open/floor/iron/white, -/area/station/science/lab) -"wrL" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/firedoor/heavy, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-toxins-passthrough" - }, -/obj/machinery/door/airlock/research{ - name = "Ordnance Gas Storage"; - req_access_txt = "8" - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"wsc" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"wsp" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Permabrig Kitchen" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"wsq" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Armory"; - req_access_txt = "3" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"wsv" = ( -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"wsw" = ( -/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, -/obj/machinery/meter, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wsB" = ( -/obj/machinery/power/smes/engineering, -/obj/structure/cable, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"wsE" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L2" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wsN" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"wsZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/storage/box/beakers{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/storage/box/bodybags, -/turf/open/floor/iron/dark, -/area/station/medical/medbay/central) -"wtc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/engineering/flashlight, -/turf/open/floor/plating, -/area/station/maintenance/central) -"wtj" = ( -/obj/machinery/computer/secure_data, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"wtl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/no_nightlight/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wtH" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/dresser, -/obj/item/storage/secure/safe/directional/north, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"wtJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/robotics/lab) -"wtU" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wuc" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"wuh" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood, -/area/station/commons/lounge) -"wuo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"wuH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"wuM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"wva" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wvy" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Prison Cafeteria" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/white, -/area/station/security/prison) -"wvz" = ( -/obj/structure/chair/stool/directional/north, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"wvA" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/dorms) -"wvB" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron/fifty, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"wvH" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/station/maintenance/port) -"wwu" = ( -/obj/structure/chair/stool/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"wwz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"wwI" = ( -/obj/machinery/computer/secure_data, -/obj/machinery/newscaster/directional/north, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/customs) -"wwK" = ( -/obj/item/tank/internals/oxygen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/central) -"wwM" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"wxl" = ( -/obj/machinery/light/floor/has_bulb, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"wxo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/green, -/area/station/science/robotics/mechbay) -"wxE" = ( -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"wxS" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"wxX" = ( -/obj/machinery/status_display/ai/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"wyh" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"wyy" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/obj/structure/table, -/obj/item/stamp/rd, -/obj/item/folder/white, -/obj/item/toy/figure/rd{ - pixel_y = 10 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"wyF" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wyI" = ( -/obj/structure/table/reinforced, -/obj/machinery/recharger{ - pixel_y = 4 - }, -/obj/item/radio/off{ - pixel_x = -11; - pixel_y = -3 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/supply) -"wyQ" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/table/wood, -/obj/item/food/pie/cream, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/station/service/theater) -"wyR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"wyY" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron, -/area/station/security/prison) -"wzf" = ( -/obj/structure/rack, -/obj/item/wrench, -/obj/item/screwdriver, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/camera/directional/east{ - c_tag = "Vacant Commissary" - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/commons/vacant_room/commissary) -"wzg" = ( -/obj/machinery/vending/wardrobe/atmos_wardrobe, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"wzj" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 1 - }, -/obj/structure/chair/stool/directional/north, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"wzv" = ( -/obj/machinery/shieldgen, -/obj/machinery/light/small/directional/north, -/obj/machinery/camera/directional/north{ - c_tag = "Engineering - Secure Storage" - }, -/turf/open/floor/plating, -/area/station/engineering/main) -"wzx" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"wzB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/landmark/start/security_officer, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/office) -"wzC" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/effect/turf_decal/bot_white, -/obj/structure/cable, -/obj/machinery/monkey_recycler, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"wzF" = ( -/obj/structure/closet/secure_closet{ - name = "contraband locker"; - req_access_txt = "3" - }, -/obj/effect/spawner/random/maintenance/three, -/obj/effect/spawner/random/contraband/armory, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"wzH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai_upload) -"wzR" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/main) -"wAk" = ( -/obj/item/seeds/wheat, -/obj/item/seeds/sugarcane, -/obj/item/seeds/potato, -/obj/item/seeds/apple, -/obj/item/grown/corncob, -/obj/item/food/grown/carrot, -/obj/item/food/grown/wheat, -/obj/item/food/grown/pumpkin{ - pixel_y = 5 - }, -/obj/machinery/camera/autoname/directional/east, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"wAz" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"wBk" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"wBl" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/office{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"wBw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"wBB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wBG" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"wBI" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/space/nearstation) -"wBX" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"wCc" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/parquet, -/area/station/medical/psychology) -"wCh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wCj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/wood, -/area/station/commons/lounge) -"wCm" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/hallway/primary/aft) -"wCp" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/break_room) -"wCw" = ( -/obj/structure/bed, -/obj/item/bedsheet/red, -/obj/effect/turf_decal/tile/red/fourcorners, -/obj/machinery/airalarm/directional/east, -/obj/machinery/flasher/directional/north{ - id = "IsolationFlash" - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"wCz" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window{ - base_state = "right"; - dir = 8; - icon_state = "right"; - name = "MiniSat Airlock Access" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"wCP" = ( -/obj/machinery/airalarm/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/chapel, -/area/station/service/chapel) -"wCU" = ( -/obj/item/food/grown/wheat, -/obj/item/food/grown/watermelon, -/obj/item/food/grown/citrus/orange, -/obj/item/food/grown/grapes, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/structure/table/glass, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wCX" = ( -/obj/machinery/computer/warrant{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"wDh" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/department/medical/central) -"wDw" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/main) -"wDF" = ( -/obj/structure/closet/secure_closet/atmospherics, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wEk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/security/brig) -"wEl" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"wEo" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/science/mixing/launch) -"wEt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/requests_console/directional/west{ - department = "Robotics"; - departmentType = 2; - name = "Robotics Requests Console"; - receive_ore_updates = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/science/robotics/lab) -"wEy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wEH" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"wER" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/computer/camera_advanced/xenobio{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"wEV" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/cell_charger{ - pixel_y = 4 - }, -/obj/structure/table/glass, -/obj/item/stock_parts/cell/high, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"wFd" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/sorting/mail{ - dir = 2; - sortType = 29 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"wFB" = ( -/obj/structure/cable, -/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/iron/dark, -/area/station/medical/morgue) -"wFO" = ( -/obj/machinery/atmospherics/components/binary/valve/layer4, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"wFR" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/light_switch/directional/west, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"wFZ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"wGd" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/engineering/atmos) -"wGx" = ( -/obj/machinery/atmospherics/components/unary/passive_vent{ - dir = 4; - name = "killroom vent" - }, -/turf/open/floor/circuit/telecomms, -/area/station/science/xenobiology) -"wGH" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"wGX" = ( -/obj/effect/turf_decal/tile/red, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/fore) -"wGZ" = ( -/obj/effect/turf_decal/tile/purple, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wHe" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/effect/spawner/random/bureaucracy/pen, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"wHB" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tcomms) -"wHN" = ( -/obj/machinery/vending/wardrobe/viro_wardrobe, -/obj/item/radio/intercom/directional/east, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"wHO" = ( -/obj/effect/turf_decal/trimline/red/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/checkpoint/medical) -"wHP" = ( -/obj/structure/filingcabinet/filingcabinet, -/obj/effect/turf_decal/tile/brown/half/contrasted, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"wHT" = ( -/obj/machinery/door/airlock/command/glass{ - name = "Gravity Generator Area"; - req_access_txt = "19; 61" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"wHW" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/green{ - luminosity = 2 - }, -/area/station/ai_monitored/command/nuke_storage) -"wIq" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/reagent_containers/blood{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"wIt" = ( -/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wIv" = ( -/obj/structure/rack, -/obj/item/clothing/gloves/color/fyellow, -/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/spawner/random/maintenance/two, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"wIx" = ( -/obj/machinery/conveyor/inverted{ - dir = 6; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"wIK" = ( -/obj/structure/table, -/obj/effect/turf_decal/bot, -/obj/item/storage/medkit/toxin{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/ordnance{ - pixel_x = 4; - pixel_y = 1 - }, -/turf/open/floor/iron/white, -/area/station/science/mixing) -"wIS" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"wIU" = ( -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"wJj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/decal/cleanable/dirt, -/obj/item/cigbutt{ - pixel_y = 7 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/starboard/greater) -"wJv" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/turf/open/space, -/area/space/nearstation) -"wJD" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/dorms) -"wJM" = ( -/obj/machinery/light_switch/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) -"wJQ" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/fore) -"wJS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"wKi" = ( -/obj/effect/spawner/random/structure/crate, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"wKI" = ( -/obj/structure/cable, -/obj/structure/sign/poster/ripped{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"wKK" = ( -/obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Command Hallway - Port" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"wKM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/siding/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"wKW" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/item/shard, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"wKZ" = ( -/obj/structure/chair{ - dir = 8; - name = "Defense" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron, -/area/station/security/courtroom) -"wLr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wLC" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/door/window{ - base_state = "right"; - icon_state = "right"; - name = "MiniSat Walkway Access" - }, -/obj/machinery/camera/directional/west{ - c_tag = "MiniSat Exterior - Aft Starboard"; - network = list("minisat") - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"wLL" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/plating, -/area/station/engineering/engine_smes) -"wLS" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/light/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wLY" = ( -/obj/machinery/computer/mecha{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/machinery/requests_console/directional/east{ - announcementConsole = 1; - department = "Research Director's Desk"; - departmentType = 5; - name = "Research Director's Requests Console" - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/rd) -"wMh" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - dir = 8; - name = "First Aid Supplies"; - req_access_txt = "5" - }, -/obj/item/mod/module/plasma_stabilizer, -/obj/item/mod/module/thermal_regulator, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"wMm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"wMu" = ( -/obj/effect/turf_decal/siding/purple{ - dir = 9 - }, -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/pen{ - pixel_x = -2; - pixel_y = 5 - }, -/obj/machinery/light_switch/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/genetics) -"wMA" = ( -/obj/machinery/meter, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"wMK" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/office) -"wMR" = ( -/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/science_wardrobe, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron/white, -/area/station/science/research) -"wMT" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/newscaster/directional/south, -/obj/effect/landmark/start/assistant, -/obj/effect/landmark/start/hangover, -/obj/effect/spawner/random/trash/graffiti{ - pixel_x = -32; - spawn_loot_chance = 50 - }, -/obj/machinery/button/door/directional/west{ - id = "Toilet3"; - name = "Lock Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"wMU" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hop) -"wNc" = ( -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) -"wNm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"wNU" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/primary/port) -"wNZ" = ( -/obj/machinery/firealarm/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage" - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"wOe" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/lesser) -"wOh" = ( -/obj/structure/sign/warning/securearea{ - pixel_y = 32 - }, -/obj/structure/closet/radiation, -/obj/effect/turf_decal/delivery, -/obj/item/clothing/glasses/meson/engine, -/turf/open/floor/iron, -/area/station/engineering/main) -"wOj" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/meter, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"wOk" = ( -/obj/machinery/door/airlock/research{ - glass = 1; - name = "Slime Euthanization Chamber"; - opacity = 0; - req_access_txt = "55" - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"wOn" = ( -/turf/open/floor/carpet/green, -/area/station/maintenance/port/aft) -"wOu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/medical/virology) -"wOJ" = ( -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"wOM" = ( -/obj/structure/table/glass, -/obj/item/stack/sheet/mineral/plasma{ - pixel_y = 4 - }, -/obj/item/reagent_containers/glass/beaker{ - pixel_x = 8; - pixel_y = 2 - }, -/obj/item/reagent_containers/dropper, -/obj/item/reagent_containers/glass/beaker/large{ - pixel_x = -3; - pixel_y = 3 - }, -/obj/structure/cable, -/obj/machinery/light_switch/directional/west, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"wOY" = ( -/obj/docking_port/stationary/random{ - dir = 4; - id = "pod_3_lavaland"; - name = "lavaland" - }, -/turf/open/space, -/area/space) -"wPd" = ( -/obj/machinery/light/small/directional/north, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/engine/cult, -/area/station/service/library) -"wPe" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "privacy shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/heads_quarters/hop) -"wPo" = ( -/obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; - name = "Common Channel"; - pixel_y = -8 - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel" - }, -/obj/item/radio/intercom/directional/east{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_y = -8 - }, -/obj/effect/landmark/start/ai, -/obj/machinery/button/door/directional/south{ - id = "AI Chamber entrance shutters"; - name = "AI Chamber Entrance Shutters Control"; - pixel_x = -24; - req_access_txt = "16" - }, -/obj/machinery/button/door/directional/south{ - id = "AI Core shutters"; - name = "AI Core Shutters Control"; - pixel_x = 24; - req_access_txt = "16" - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) -"wPy" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/service/library) -"wPz" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/security/armory) -"wPI" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"wPN" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Clinic"; - network = list("ss13","medbay") - }, -/obj/item/radio/intercom/directional/west, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"wPR" = ( -/obj/machinery/reagentgrinder{ - pixel_y = 4 - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"wQa" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/port) -"wQb" = ( -/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/spawner/random/trash/mess, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"wQp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/small/maintenance/directional/south, -/obj/structure/railing{ - dir = 5 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"wQr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/engine) -"wQM" = ( -/turf/open/floor/iron/white, -/area/station/science/lobby) -"wRc" = ( -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"wRh" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"wRu" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L12" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wRU" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Captain's Office" - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"wSd" = ( -/obj/structure/window/reinforced, -/obj/machinery/computer/atmos_control/mix_tank{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"wSI" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/security/range) -"wSN" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/maintenance/directional/south, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"wST" = ( -/obj/structure/cable, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"wSV" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/department/science/central) -"wTb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/green/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/prison) -"wTm" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/service/bar) -"wTp" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/brigdoor{ - dir = 1; - name = "Weapon Distribution"; - req_access_txt = "3" - }, -/obj/item/paper, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/door/window/left/directional/south{ - name = "Requests Window" - }, -/obj/item/pen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"wTM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/security/brig) -"wTT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"wTU" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Engineering Security Post"; - req_access_txt = "63" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"wTW" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "PermaLockdown"; - name = "Lockdown Shutters" - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plating, -/area/station/security/prison) -"wTZ" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/iron/freezer, -/area/station/security/prison) -"wUi" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/white, -/area/station/science/mixing/hallway) -"wUr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"wUu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"wUy" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"wUC" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"wUJ" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 5 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"wVv" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/monitoring) -"wVy" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light/small/maintenance/directional/west, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"wVJ" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"wVU" = ( -/obj/machinery/mass_driver/chapelgun, -/obj/structure/sign/warning/vacuum/external{ - pixel_y = 32 - }, -/obj/machinery/light/small/directional/north, -/obj/item/gps, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"wVY" = ( -/obj/item/book/manual/wiki/security_space_law{ - name = "space law"; - pixel_y = 2 - }, -/obj/item/toy/gun, -/obj/item/restraints/handcuffs, -/obj/structure/table/wood, -/obj/item/clothing/head/collectable/hos{ - name = "novelty HoS hat" - }, -/obj/machinery/firealarm/directional/east, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"wVZ" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/brig) -"wWa" = ( -/obj/structure/table/reinforced, -/obj/item/storage/box/beakers{ - pixel_y = 7 - }, -/obj/item/assembly/igniter{ - pixel_y = -3 - }, -/obj/machinery/firealarm/directional/north, -/turf/open/floor/iron/dark/textured_edge{ - dir = 4 - }, -/area/station/medical/medbay/central) -"wWd" = ( -/obj/machinery/flasher/directional/north{ - id = "AI" - }, -/obj/structure/table/wood/fancy/blue, -/obj/effect/spawner/random/aimodule/neutral, -/obj/machinery/door/window{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Core Modules"; - req_access_txt = "20" - }, -/obj/structure/window/reinforced, -/turf/open/floor/circuit, -/area/station/ai_monitored/turret_protected/ai_upload) -"wWf" = ( -/obj/machinery/light/directional/east, -/obj/structure/sign/departments/science{ - name = "\improper ROBOTICS!"; - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"wWt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/sign/poster/official/soft_cap_pop_art{ - pixel_y = 32 - }, -/obj/effect/landmark/start/paramedic, -/turf/open/floor/iron/dark, -/area/station/medical/break_room) -"wWx" = ( -/obj/structure/noticeboard/directional/north, -/obj/item/reagent_containers/food/condiment/milk{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/condiment/sugar{ - pixel_y = 4 - }, -/obj/item/reagent_containers/food/condiment/soymilk{ - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/ice{ - pixel_x = -4; - pixel_y = -2 - }, -/obj/item/reagent_containers/food/drinks/bottle/cream{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/structure/table{ - name = "Jim Norton's Quebecois Coffee table" - }, -/turf/open/floor/iron/dark, -/area/station/service/cafeteria) -"wWH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 2; - sortType = 28 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/research) -"wWK" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/camera/directional/west{ - c_tag = "Medbay Primary Treatment Centre West"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"wXv" = ( -/obj/effect/landmark/start/assistant, -/obj/structure/chair/comfy/black, -/turf/open/floor/wood, -/area/station/service/library) -"wXw" = ( -/obj/structure/closet{ - name = "Evidence Closet 4" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"wXH" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"wXM" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/item/stack/medical/mesh, -/obj/item/stack/medical/gauze, -/obj/item/stack/medical/suture, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"wYa" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"wYc" = ( -/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/directional/east, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/construction/mining/aux_base) -"wYi" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"wYq" = ( -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"wYQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"wYS" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"wZf" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "brig shutters" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/warden) -"wZN" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/science/mixing) -"xad" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6 - }, -/obj/item/reagent_containers/glass/bottle/epinephrine, -/obj/item/reagent_containers/syringe, -/obj/effect/turf_decal/siding/white/corner{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white/side{ - dir = 5 - }, -/area/station/medical/treatment_center) -"xai" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"xaN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail{ - dir = 1; - sortType = 15 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xaT" = ( -/obj/structure/chair/office/light, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"xbb" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/structure/sign/warning/electricshock, -/turf/open/floor/engine, -/area/station/science/cytology) -"xbc" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xbs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, -/turf/open/floor/engine, -/area/station/maintenance/disposal/incinerator) -"xbB" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/portable_atmospherics/canister/plasma, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"xbN" = ( -/obj/machinery/computer/med_data{ - dir = 8 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/carpet, -/area/station/security/detectives_office) -"xbP" = ( -/obj/machinery/hydroponics/soil, -/obj/item/cultivator, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/grass, -/area/station/security/prison) -"xca" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"xct" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/transit_tube/curved/flipped, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"xcw" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Court Cell"; - req_access_txt = "2" - }, -/turf/open/floor/iron/dark, -/area/station/security/courtroom) -"xcA" = ( -/obj/machinery/disposal/bin, -/obj/machinery/light/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/iron/white, -/area/station/science/lobby) -"xcF" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/engineering/break_room) -"xcH" = ( -/obj/structure/table/wood, -/obj/item/storage/crayons, -/turf/open/floor/wood, -/area/station/service/library) -"xcN" = ( -/obj/docking_port/stationary/random{ - id = "pod_lavaland"; - name = "lavaland" - }, -/turf/open/space, -/area/space) -"xcZ" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - name = "Interrogation"; - req_access_txt = "63" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"xdf" = ( -/obj/structure/table, -/obj/item/storage/box/hug{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/razor{ - pixel_x = -8; - pixel_y = 3 - }, -/turf/open/floor/iron, -/area/station/security/prison) -"xdr" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "QMLoad2"; - name = "Unloading Conveyor"; - pixel_x = -13; - pixel_y = -4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"xdt" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, -/obj/machinery/door/airlock{ - name = "Kitchen Cold Room"; - req_access_txt = "28" - }, -/obj/machinery/duct, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/cafeteria, -/area/station/service/kitchen/coldroom) -"xdI" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/table/wood, -/obj/item/pinpointer/nuke, -/obj/item/disk/nuclear, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"xdS" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"xes" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/effect/landmark/start/research_director, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"xev" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/machinery/module_duplicator, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"xew" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"xeD" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xeO" = ( -/obj/machinery/door/airlock/engineering{ - name = "Starboard Quarter Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/starboard/aft) -"xfb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xfk" = ( -/obj/structure/chair/stool/directional/south, -/obj/effect/decal/cleanable/cobweb, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/maintenance/port/aft) -"xfr" = ( -/turf/open/floor/iron/white, -/area/station/medical/virology) -"xfs" = ( -/obj/machinery/power/shieldwallgen/xenobiologyaccess, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"xfI" = ( -/obj/machinery/light/small/directional/south, -/obj/structure/displaycase/labcage, -/turf/open/floor/engine, -/area/station/command/heads_quarters/rd) -"xfJ" = ( -/obj/structure/cable, -/obj/machinery/power/solar{ - id = "forestarboard"; - name = "Fore-Starboard Solar Array" - }, -/turf/open/floor/iron/solarpanel/airless, -/area/station/solars/starboard/fore) -"xfU" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/item/folder/yellow{ - pixel_y = 4 - }, -/obj/machinery/camera/directional/north{ - c_tag = "Bridge - Central" - }, -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xfX" = ( -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating/airless, -/area/station/solars/port/fore) -"xgv" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/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/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/mixing/launch) -"xgy" = ( -/obj/structure/rack, -/obj/item/clothing/mask/surgical, -/obj/item/clothing/suit/apron/chef, -/turf/open/floor/iron/showroomfloor, -/area/station/maintenance/starboard/lesser) -"xgE" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/power/port_gen/pacman, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable/multilayer/connected, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"xgO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"xgW" = ( -/obj/machinery/suit_storage_unit/security, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"xhi" = ( -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"xhp" = ( -/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/landmark/xeno_spawn, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/commons/toilet/auxiliary) -"xht" = ( -/obj/structure/table/glass, -/obj/machinery/light/small/directional/south, -/obj/item/folder/white{ - pixel_y = 4 - }, -/obj/item/pen/red, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"xhy" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;47" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/aft/lesser) -"xhO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"xhS" = ( -/obj/machinery/light/directional/south, -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"xhW" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/atmos) -"xhX" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"xhZ" = ( -/obj/structure/table/glass, -/obj/item/clothing/gloves/color/latex, -/obj/item/surgical_drapes, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"xif" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;39" - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "viro-passthrough" - }, -/turf/open/floor/plating, -/area/station/medical/medbay/central) -"xii" = ( -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -2; - pixel_y = 9 - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"xir" = ( -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xiO" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/red/line, -/turf/open/floor/engine, -/area/station/science/cytology) -"xiX" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/table/reinforced, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/entertainment/lighter, -/turf/open/floor/iron, -/area/station/service/bar) -"xjb" = ( -/obj/effect/landmark/start/ai/secondary, -/obj/item/radio/intercom/directional/north{ - freerange = 1; - listening = 0; - name = "Custom Channel"; - pixel_x = -8 - }, -/obj/item/radio/intercom/directional/west{ - freerange = 1; - listening = 0; - name = "Common Channel" - }, -/obj/item/radio/intercom/directional/south{ - freerange = 1; - frequency = 1447; - listening = 0; - name = "Private Channel"; - pixel_x = -8 - }, -/obj/machinery/door/window{ - atom_integrity = 300; - base_state = "rightsecure"; - dir = 4; - icon_state = "rightsecure"; - layer = 4.1; - name = "Secondary AI Core Access"; - pixel_x = 4; - req_access_txt = "16" - }, -/turf/open/floor/circuit/green, -/area/station/ai_monitored/turret_protected/ai) -"xjg" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/wood, -/area/station/commons/lounge) -"xjl" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Research Maintenance"; - req_access_txt = "47" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"xjm" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"xjt" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"xjF" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"xjY" = ( -/obj/machinery/door/firedoor, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/navigate_destination/hydro, -/obj/effect/turf_decal/trimline/green/filled/line{ - dir = 8 - }, -/obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics"; - req_access_txt = "35" - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xkm" = ( -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/command/gateway) -"xkw" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/command/storage/satellite) -"xkE" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/chair/pew/left, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"xkP" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door/directional/east{ - id = "maintwarehouse"; - name = "Privacy Shutters Control" - }, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"xkT" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/obj/machinery/light/small/directional/west, -/obj/machinery/requests_console/directional/west, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"xlb" = ( -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/obj/item/radio/intercom/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"xlh" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Auxiliary Tool Storage"; - req_access_txt = "12" - }, -/obj/effect/landmark/event_spawn, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/fourcorners, -/turf/open/floor/iron, -/area/station/commons/storage/tools) -"xli" = ( -/obj/machinery/icecream_vat, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/floor/iron/kitchen_coldroom/freezerfloor, -/area/station/service/kitchen/coldroom) -"xlj" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/obj/machinery/navbeacon{ - codes_txt = "delivery;dir=8"; - dir = 8; - freq = 1400; - location = "QM #2" - }, -/turf/open/floor/iron, -/area/station/cargo/warehouse) -"xls" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/station/service/library) -"xlH" = ( -/obj/machinery/atmospherics/components/unary/heat_exchanger{ - icon_state = "he1"; - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"xlK" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/security/holding_cell) -"xlU" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai_upload) -"xmm" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 8 - }, -/obj/machinery/duct, -/turf/open/floor/iron/white, -/area/station/medical/storage) -"xms" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"xmy" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xmE" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/sink{ - dir = 4; - pixel_x = -12; - pixel_y = 2 - }, -/obj/structure/sign/poster/official/cleanliness{ - pixel_y = -32 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xmG" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"xmR" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"xmT" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, -/turf/open/space, -/area/space/nearstation) -"xmX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security{ - aiControlDisabled = 1; - id_tag = "prisonereducation"; - name = "Prisoner Education Chamber"; - req_access_txt = "3" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/security/execution/education) -"xnC" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/locker) -"xnK" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/firealarm/directional/west, -/obj/effect/decal/cleanable/cobweb, -/turf/open/floor/wood, -/area/station/service/library) -"xom" = ( -/obj/structure/disposaloutlet{ - dir = 4; - name = "Cargo Deliveries" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding/green{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 9 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"xov" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 9 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"xoA" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/iron, -/area/station/engineering/main) -"xoP" = ( -/obj/machinery/light_switch/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"xoQ" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"xoW" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xpb" = ( -/obj/machinery/gravity_generator/main, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"xpf" = ( -/obj/effect/turf_decal/trimline/purple/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple, -/turf/open/floor/iron/white, -/area/station/science/research) -"xpk" = ( -/obj/structure/table/wood, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/item/folder/blue, -/obj/item/clothing/head/collectable/hop{ - name = "novelty HoP hat" - }, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"xpR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"xqc" = ( -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/port/aft) -"xqh" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/commons/dorms) -"xqs" = ( -/obj/effect/landmark/xeno_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/start/hangover, -/turf/open/floor/carpet, -/area/station/commons/dorms) -"xqO" = ( -/obj/machinery/door/airlock{ - name = "Theater Backstage"; - req_access_txt = "46" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/station/service/theater) -"xqR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/flasher/directional/east{ - id = "justiceflash" - }, -/turf/open/floor/iron/dark, -/area/station/security/execution/education) -"xqZ" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"xrk" = ( -/obj/effect/landmark/start/chaplain, -/turf/open/floor/iron/dark, -/area/station/service/chapel) -"xro" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"xrt" = ( -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/obj/structure/table, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/station/engineering/storage/mech) -"xrQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/lesser) -"xrX" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/airlock/external{ - name = "Arrival Airlock"; - space_dir = 2 - }, -/turf/open/floor/plating, -/area/station/hallway/secondary/entry) -"xsn" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/directional/north, -/obj/machinery/light/directional/north, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"xsq" = ( -/obj/structure/weightmachine/weightlifter, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/prison) -"xsr" = ( -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "Bridge Access"; - req_access_txt = "19" - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "bridge-right" - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xsu" = ( -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"xsv" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"xsw" = ( -/obj/machinery/shower{ - name = "emergency shower"; - pixel_y = 16 - }, -/obj/effect/turf_decal/trimline/blue/end, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"xsx" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"xsG" = ( -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8; - sortType = 17 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"xsI" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/cargo/drone_bay) -"xsO" = ( -/obj/machinery/door/airlock/engineering{ - name = "Port Bow Solar Access"; - req_access_txt = "10" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"xsS" = ( -/obj/effect/spawner/random/contraband/prison, -/obj/structure/closet/crate, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/item/stack/license_plates/empty/fifty, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/radio/intercom/prison/directional/north, -/turf/open/floor/plating, -/area/station/security/prison) -"xtn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/commons/locker) -"xto" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"xtv" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"xtw" = ( -/obj/item/stack/rods, -/turf/open/space/basic, -/area/space) -"xtA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/camera/directional/south{ - c_tag = "Arrivals - Middle Arm - Far" - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"xtW" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/maintenance{ - name = "Service Maintenance"; - req_one_access_txt = "12;73" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "service-passthrough" - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xtZ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/smart/simple/green/visible, -/turf/open/space/basic, -/area/space/nearstation) -"xub" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"xuv" = ( -/obj/machinery/cryopod{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/commons/dorms/cryo) -"xuw" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/security/prison) -"xuz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"xuI" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos) -"xuL" = ( -/obj/machinery/portable_atmospherics/canister/plasma, -/turf/open/floor/engine/plasma, -/area/station/engineering/atmos) -"xuO" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"xuW" = ( -/obj/structure/cable, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/solar_assembly, -/obj/item/stack/sheet/glass/fifty, -/obj/structure/closet/crate/engineering/electrical, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/aft) -"xuZ" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/command_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"xvj" = ( -/obj/structure/closet/bombcloset/security, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/brig) -"xvs" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/science/storage) -"xvC" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"xvO" = ( -/obj/effect/turf_decal/trimline/red/filled/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"xvQ" = ( -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ - dir = 4 - }, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"xvX" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/obj/machinery/door/poddoor/preopen{ - id = "briglockdown"; - name = "brig shutters" - }, -/turf/open/floor/plating, -/area/station/security/warden) -"xvY" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/south, -/obj/structure/cable, -/obj/structure/table/glass, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"xwd" = ( -/obj/effect/decal/cleanable/dirt/dust, -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/surgery, -/obj/structure/light_construct/directional/west, -/obj/item/storage/fancy/cigarettes/cigpack_uplift, -/turf/open/floor/iron/white, -/area/station/medical/abandoned) -"xwq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/spawner/random/trash/garbage{ - spawn_scatter_radius = 1 - }, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"xwu" = ( -/obj/structure/closet/secure_closet/personal, -/obj/item/clothing/under/misc/assistantformal, -/obj/item/clothing/suit/hooded/wintercoat, -/obj/item/clothing/shoes/winterboots, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/dark, -/area/station/commons/locker) -"xwG" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Library Maintenance"; - req_one_access_txt = "12;37" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port) -"xwN" = ( -/turf/open/floor/iron, -/area/station/engineering/break_room) -"xwO" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xwY" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xxb" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"xxh" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/greater) -"xxn" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/starboard/fore) -"xxr" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/ai_monitored/command/storage/eva) -"xxG" = ( -/obj/structure/table/wood, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/wood, -/area/station/cargo/qm) -"xxQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos/pumproom) -"xxX" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/security/glass{ - name = "Prison Wing"; - req_access_txt = "1" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "perma-entrance" - }, -/turf/open/floor/iron, -/area/station/security/brig) -"xyh" = ( -/obj/structure/table, -/obj/item/exodrone{ - pixel_y = 8 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"xyl" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_one_access_txt = "1;4" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"xyp" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"xyu" = ( -/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/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"xyv" = ( -/obj/structure/table/glass, -/obj/item/retractor, -/obj/item/hemostat, -/obj/item/cautery, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/surgery/theatre) -"xyN" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xyO" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/effect/landmark/start/hangover, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"xyY" = ( -/obj/structure/window/reinforced, -/obj/structure/cable, -/obj/effect/turf_decal/tile/blue/half/contrasted, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xzf" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"xzi" = ( -/obj/structure/cable, -/obj/machinery/computer/shuttle/mining/common, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/security/checkpoint/customs) -"xzp" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister/nitrous_oxide, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"xzA" = ( -/obj/structure/rack, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = 3 - }, -/obj/item/circuitboard/machine/exoscanner, -/obj/item/circuitboard/machine/exoscanner{ - pixel_y = -3 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"xzE" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"xzJ" = ( -/obj/structure/chair/office/light{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/pharmacy) -"xzM" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"xzU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"xzW" = ( -/mob/living/basic/cow{ - name = "Betsy"; - real_name = "Betsy" - }, -/turf/open/floor/grass, -/area/station/service/hydroponics/garden) -"xzZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Medbay Primary Treatment Centre East"; - network = list("ss13","medbay") - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"xAq" = ( -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"xAt" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"xAu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/science/mixing/launch) -"xAx" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"xAQ" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/light_switch/directional/south, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"xAZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"xBd" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/wood, -/area/station/service/library) -"xBn" = ( -/obj/structure/plasticflaps, -/obj/machinery/conveyor{ - dir = 8; - id = "QMLoad" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/cargo/storage) -"xBp" = ( -/obj/structure/cable, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/aft/greater) -"xBq" = ( -/obj/structure/rack, -/obj/item/clothing/suit/hazardvest, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xBv" = ( -/obj/structure/table, -/obj/item/stack/package_wrap{ - pixel_x = -9; - pixel_y = -9 - }, -/obj/item/paper_bin{ - pixel_x = 1; - pixel_y = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/brown/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"xBB" = ( -/obj/effect/landmark/event_spawn, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xBD" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/commons/fitness/recreation) -"xBF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/ai_monitored/command/storage/eva) -"xBG" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/caution/red, -/obj/machinery/reagentgrinder{ - pixel_x = -1; - pixel_y = 8 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/tile/purple/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/science/cytology) -"xBK" = ( -/obj/machinery/atmospherics/components/binary/circulator{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"xBL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/security/prison) -"xBW" = ( -/obj/structure/table/wood/fancy/orange, -/obj/machinery/requests_console/directional/east{ - announcementConsole = 1; - department = "Quartermaster's Desk"; - departmentType = 2; - name = "Quartermaster's Requests Console" - }, -/obj/item/reagent_containers/food/drinks/bottle/whiskey{ - pixel_x = -5; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = 2; - pixel_y = -4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -9; - pixel_y = -4 - }, -/turf/open/floor/carpet/red, -/area/station/cargo/qm) -"xCe" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/conveyor{ - dir = 9; - id = "garbage" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"xCo" = ( -/obj/structure/rack, -/obj/item/storage/box/flashes{ - pixel_x = 3 - }, -/obj/item/storage/box/teargas{ - pixel_x = 1; - pixel_y = -2 - }, -/obj/item/gun/grenadelauncher, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/security/armory) -"xCF" = ( -/obj/structure/transit_tube/curved{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"xCY" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/table/glass, -/obj/item/folder/blue{ - pixel_y = 3 - }, -/obj/item/pen, -/obj/machinery/computer/security/telescreen/minisat{ - dir = 1; - pixel_y = -28 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron/dark, -/area/station/engineering/transit_tube) -"xDk" = ( -/obj/machinery/biogenerator, -/turf/open/floor/plating, -/area/station/maintenance/starboard/aft) -"xDn" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/obj/structure/cable, -/obj/effect/landmark/start/depsec/science, -/turf/open/floor/iron, -/area/station/security/checkpoint/science) -"xDK" = ( -/obj/item/radio/intercom/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xDQ" = ( -/obj/item/kirbyplants/random, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"xDT" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/machinery/light/no_nightlight/directional/east, -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, -/turf/open/floor/iron/dark, -/area/station/engineering/atmos) -"xEb" = ( -/obj/structure/table, -/obj/item/electronics/apc, -/obj/item/electronics/airlock, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"xEj" = ( -/obj/machinery/computer/security, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xEw" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xEH" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xES" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xFb" = ( -/obj/structure/table/glass, -/obj/item/folder/blue, -/obj/item/clothing/neck/stethoscope, -/obj/item/clothing/glasses/hud/health, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/obj/item/computer_hardware/hard_drive/role/chemistry, -/obj/item/computer_hardware/hard_drive/role/medical, -/obj/item/computer_hardware/hard_drive/role/medical, -/obj/item/computer_hardware/hard_drive/role/medical, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"xFs" = ( -/obj/effect/landmark/start/paramedic, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xFA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/space_hut) -"xFC" = ( -/obj/structure/railing{ - dir = 9 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xFI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"xFW" = ( -/obj/structure/sign/directions/medical{ - dir = 8; - pixel_y = 8 - }, -/obj/structure/sign/directions/evac, -/obj/structure/sign/directions/science{ - dir = 4; - pixel_y = -8 - }, -/turf/closed/wall/prepainted/daedalus, -/area/station/science/lobby) -"xGd" = ( -/obj/machinery/holopad, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/command) -"xGn" = ( -/obj/machinery/duct, -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/white, -/area/station/medical/cryo) -"xGu" = ( -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/stasis{ - dir = 4 - }, -/obj/machinery/defibrillator_mount/directional/north, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"xGB" = ( -/turf/open/floor/plating, -/area/station/commons/fitness/recreation) -"xGF" = ( -/obj/machinery/camera/directional/north{ - c_tag = "AI Chamber - Fore"; - network = list("aicore") - }, -/obj/structure/showcase/cyborg/old{ - pixel_y = 20 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"xGY" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"xGZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/science/lab) -"xHA" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/structure/cable, -/obj/effect/spawner/random/decoration/showcase, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"xHI" = ( -/obj/structure/table, -/obj/item/folder/red, -/obj/item/taperecorder, -/obj/item/radio/intercom/directional/south{ - broadcasting = 1; - frequency = 1423; - listening = 0; - name = "Interrogation Intercom" - }, -/turf/open/floor/iron/dark, -/area/station/security/interrogation) -"xHR" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/engineering/atmos) -"xIm" = ( -/obj/item/radio/intercom/directional/west, -/obj/machinery/piratepad/civilian, -/obj/effect/turf_decal/bot_white, -/obj/machinery/camera/directional/west{ - c_tag = "Central Primary Hallway - Fore - Port Corner" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xIE" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;22;25;37;38;46" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xIP" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs/cable/white, -/obj/item/toy/plush/pkplush{ - name = "C.H.E.R.U.B." - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"xIX" = ( -/obj/machinery/status_display/evac/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/mixing) -"xJg" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) -"xJE" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"xJT" = ( -/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/hatch{ - name = "Observation Room"; - req_access_txt = "47" - }, -/turf/open/floor/iron, -/area/station/maintenance/department/science/xenobiology) -"xJZ" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"xKj" = ( -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"xKr" = ( -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/station/engineering/main) -"xKE" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/port/fore) -"xKG" = ( -/obj/structure/urinal/directional/north, -/obj/structure/cable, -/obj/machinery/duct, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"xKO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/aft) -"xKP" = ( -/obj/machinery/light/directional/west, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"xLa" = ( -/obj/machinery/airalarm/directional/west, -/obj/effect/spawner/random/structure/tank_holder, -/turf/open/floor/iron, -/area/station/cargo/drone_bay) -"xLF" = ( -/obj/effect/spawner/random/structure/crate, -/obj/machinery/light/small/maintenance/directional/north, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xLO" = ( -/obj/machinery/computer/secure_data{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"xLW" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/commons/fitness/recreation) -"xMA" = ( -/obj/item/toy/cattoy, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"xMD" = ( -/obj/machinery/mass_driver/trash{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"xMN" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/commons/vacant_room/office) -"xMW" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/machinery/door/poddoor/preopen{ - id = "Xenolab"; - name = "test chamber blast door" - }, -/obj/structure/cable, -/turf/open/floor/engine, -/area/station/science/xenobiology) -"xNc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/engineering/main) -"xNk" = ( -/obj/machinery/firealarm/directional/east, -/obj/item/paper_bin{ - pixel_x = -1; - pixel_y = 6 - }, -/obj/structure/table/wood, -/obj/machinery/requests_console/directional/south{ - announcementConsole = 1; - department = "Telecomms Admin"; - departmentType = 5; - name = "Telecomms Requests Console" - }, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"xNr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"xNz" = ( -/obj/structure/chair/office/light{ - dir = 8 - }, -/obj/effect/turf_decal/siding/white{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/office) -"xNK" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Bridge - Port Access" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xOg" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/station/maintenance/disposal/incinerator) -"xOp" = ( -/obj/structure/table/glass, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white{ - dir = 8 - }, -/obj/item/storage/belt/medical{ - pixel_y = 6 - }, -/obj/item/storage/belt/medical{ - pixel_y = 4 - }, -/obj/item/storage/belt/medical{ - pixel_y = 2 - }, -/obj/item/storage/belt/medical, -/turf/open/floor/iron/white/side{ - dir = 4 - }, -/area/station/medical/treatment_center) -"xOr" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"xOF" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 5; - id = "laborcamp_home"; - name = "fore bay 1"; - roundstart_template = /datum/map_template/shuttle/labour/generic; - width = 9 - }, -/turf/open/space/basic, -/area/space) -"xOQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"xPg" = ( -/obj/structure/table/reinforced, -/obj/machinery/cell_charger, -/obj/machinery/firealarm/directional/north, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/station/medical/storage) -"xPi" = ( -/obj/structure/table/reinforced, -/obj/item/clipboard{ - pixel_x = 4; - pixel_y = -4 - }, -/obj/item/folder/yellow{ - pixel_x = 4 - }, -/obj/machinery/requests_console/directional/west{ - department = "Engineering"; - departmentType = 3; - name = "Engineering Requests Console" - }, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/break_room) -"xPs" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/maintenance/department/medical/central) -"xPv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"xPF" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/iron, -/area/station/commons/dorms) -"xPI" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"xPM" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;35;47" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/lesser) -"xPR" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/turf/open/floor/plating, -/area/station/construction/mining/aux_base) -"xPU" = ( -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_one_access_txt = "10;24" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/engineering/supermatter/room) -"xQG" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/table/wood, -/obj/item/computer_hardware/hard_drive/role/detective, -/obj/item/folder/red{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/folder/red{ - pixel_x = -7 - }, -/obj/item/computer_hardware/hard_drive/role/detective, -/obj/item/computer_hardware/hard_drive/role/detective, -/obj/structure/cable, -/obj/machinery/fax_machine, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/hos) -"xQJ" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/ai) -"xQU" = ( -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/station/engineering/atmos) -"xRa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"xRu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xRv" = ( -/obj/structure/table, -/obj/machinery/button/door/directional/east{ - id = "rdrnd"; - name = "Primary Research Shutters Control"; - pixel_y = 6; - req_access_txt = "7" - }, -/obj/machinery/button/door/directional/east{ - id = "rndlab2"; - name = "Secondary Research Shutters Control"; - pixel_y = -6; - req_access_txt = "7" - }, -/obj/machinery/power/data_terminal, -/obj/structure/cable, -/obj/machinery/telephone/research, -/turf/open/floor/iron, -/area/station/science/lab) -"xRw" = ( -/obj/effect/spawner/random/structure/chair_maintenance{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/fore) -"xRx" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron, -/area/station/commons/dorms) -"xRF" = ( -/obj/machinery/door/airlock/maintenance{ - req_one_access_txt = "12;5;33;69" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/station/maintenance/department/medical/central) -"xRS" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south{ - name = "Cargo Desk"; - req_access_txt = "50" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/cargo/sorting) -"xRU" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/iron/white, -/area/station/security/prison) -"xSi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/command/teleporter) -"xSz" = ( -/obj/structure/table, -/obj/item/folder/yellow, -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/obj/item/paper/pamphlet/gateway, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/command/gateway) -"xSK" = ( -/obj/structure/table, -/obj/item/toy/plush/slimeplushie{ - name = "Nanners" - }, -/turf/open/floor/plating, -/area/station/maintenance/department/science/xenobiology) -"xSL" = ( -/obj/structure/chair{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xTd" = ( -/obj/structure/closet/secure_closet/atmospherics, -/turf/open/floor/iron/dark, -/area/station/engineering/atmospherics_engine) -"xTe" = ( -/obj/effect/turf_decal/tile/purple/fourcorners, -/obj/machinery/door/airlock/research{ - name = "Research Division Access"; - req_access_txt = "47" - }, -/obj/machinery/door/firedoor, -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ - cycle_id = "sci-entrance" - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/science/research) -"xTg" = ( -/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/firedoor, -/obj/machinery/door/window/left/directional/north{ - dir = 2; - name = "Reception Window" - }, -/obj/machinery/door/poddoor/preopen{ - id = "hop"; - name = "privacy shutters" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/heads_quarters/hop) -"xTq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) -"xTt" = ( -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/maintenance, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"xTx" = ( -/obj/machinery/airalarm/directional/south, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/station/engineering/atmos/storage/gas) -"xTB" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/maintenance/central) -"xTF" = ( -/obj/item/storage/crayons, -/obj/machinery/light/small/directional/west, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/service/chapel/office) -"xTM" = ( -/obj/machinery/firealarm/directional/east, -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xTX" = ( -/turf/closed/wall/prepainted/daedalus, -/area/station/ai_monitored/aisat/exterior) -"xUf" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/flora/ausbushes/palebush, -/obj/structure/flora/ausbushes/fernybush, -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/brflowers, -/turf/open/floor/grass, -/area/station/science/research) -"xUy" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/station/cargo/storage) -"xUC" = ( -/obj/machinery/power/generator{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"xUD" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/medical/virology) -"xUG" = ( -/obj/machinery/modular_computer/console/preset/engineering, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"xUJ" = ( -/obj/machinery/computer/secure_data, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/checkpoint/engineering) -"xVb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/flasher/directional/north{ - id = "AI"; - pixel_x = -22 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/turret_protected/aisat_interior) -"xVg" = ( -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/hos) -"xVh" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/structure/sign/poster/random/directional/north, -/turf/open/floor/wood, -/area/station/commons/lounge) -"xVk" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/aft/greater) -"xVs" = ( -/turf/open/floor/iron, -/area/station/cargo/miningoffice) -"xVP" = ( -/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"xVS" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"xWt" = ( -/obj/effect/landmark/start/captain, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"xWA" = ( -/obj/machinery/nuclearbomb/beer{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/structure/table/wood, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/station/command/corporate_showroom) -"xWU" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xXp" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"xXu" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"xXE" = ( -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/command/heads_quarters/ce) -"xXH" = ( -/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"xXK" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/structure/cable/layer3, -/turf/open/floor/iron/dark, -/area/station/ai_monitored/aisat/exterior) -"xXL" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/neutral/filled/corner{ - dir = 4 - }, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/station/medical/morgue) -"xXU" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ - dir = 1 - }, -/turf/open/floor/engine/vacuum, -/area/station/engineering/atmos) -"xXW" = ( -/obj/docking_port/stationary{ - dheight = 1; - dir = 8; - dwidth = 12; - height = 17; - id = "syndicate_nw"; - name = "northwest of station"; - width = 23 - }, -/turf/open/space/basic, -/area/space) -"xXZ" = ( -/obj/structure/chair/comfy{ - dir = 1 - }, -/obj/item/clothing/suit/nerdshirt, -/obj/item/clothing/head/fedora, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"xYn" = ( -/obj/machinery/door/window/left/directional/west{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Infirmary" - }, -/obj/effect/turf_decal/trimline/blue/filled/line{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/security/medical) -"xYr" = ( -/obj/structure/sign/warning/radiation/rad_area{ - dir = 1; - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"xYs" = ( -/obj/structure/table, -/obj/item/storage/bag/plants, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/trimline/brown/warning{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"xYz" = ( -/obj/effect/spawner/random/structure/crate, -/turf/open/floor/plating, -/area/station/maintenance/port) -"xYS" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/wood, -/area/station/security/office) -"xZc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/siding{ - dir = 4 - }, -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/command/heads_quarters/rd) -"xZf" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"xZh" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/wood, -/area/station/command/heads_quarters/hos) -"xZo" = ( -/obj/effect/spawner/random/structure/grille, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) -"xZr" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Dormitories" - }, -/obj/structure/cable, -/obj/effect/landmark/navigate_destination, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron, -/area/station/commons/dorms) -"xZD" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"xZQ" = ( -/obj/structure/window/reinforced, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/secondary/service) -"xZT" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/table, -/turf/open/floor/iron, -/area/station/service/bar) -"yaa" = ( -/obj/structure/table/wood, -/obj/structure/window/reinforced, -/obj/machinery/light_switch/directional/west, -/obj/item/storage/secure/briefcase{ - pixel_x = -2; - pixel_y = 4 - }, -/obj/item/storage/lockbox/medal, -/turf/open/floor/wood, -/area/station/command/heads_quarters/captain/private) -"yau" = ( -/obj/structure/cable, -/obj/machinery/computer/secure_data{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/security/office) -"yaz" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/button/ignition{ - id = "Xenobio"; - pixel_x = -4; - pixel_y = -3 - }, -/obj/machinery/button/door/directional/north{ - id = "Xenolab"; - name = "Test Chamber Blast Doors"; - pixel_x = 6; - pixel_y = -2; - req_access_txt = "55" - }, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/computer/security/telescreen{ - name = "Test Chamber Monitor"; - network = list("xeno"); - pixel_y = 9 - }, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/iron, -/area/station/science/xenobiology) -"yaC" = ( -/obj/structure/cable, -/turf/open/floor/plating/airless, -/area/station/solars/starboard/fore) -"yaL" = ( -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"yaW" = ( -/turf/open/floor/iron/chapel{ - dir = 1 - }, -/area/station/service/chapel) -"yaX" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/command/teleporter) -"ybg" = ( -/obj/structure/table, -/obj/item/poster/random_official{ - pixel_y = 13 - }, -/obj/item/poster/random_official{ - pixel_y = 5 - }, -/obj/item/poster/random_official, -/turf/open/floor/iron/dark, -/area/station/security/office) -"ybt" = ( -/obj/structure/sign/directions/security{ - dir = 1; - pixel_y = 8 - }, -/obj/structure/sign/directions/engineering{ - dir = 4 - }, -/obj/structure/sign/directions/command{ - dir = 1; - pixel_y = -8 - }, -/obj/effect/mapping_helpers/paint_wall/medical, -/turf/closed/wall/prepainted/daedalus, -/area/station/medical/medbay/lobby) -"ybw" = ( -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = -4 - }, -/turf/open/floor/plating, -/area/station/maintenance/starboard/greater) -"ybE" = ( -/obj/machinery/hydroponics/soil, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/item/plant_analyzer, -/turf/open/floor/grass, -/area/station/security/prison) -"ybG" = ( -/obj/machinery/power/terminal, -/obj/machinery/light/small/directional/east, -/obj/item/radio/intercom/directional/east, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/solars/port/fore) -"ybT" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/stripes/white/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/science/storage) -"ycg" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"ycp" = ( -/obj/machinery/conveyor{ - dir = 1; - id = "packageExternal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/left/directional/west{ - dir = 2; - name = "Crate Security Door"; - req_access_txt = "50" - }, -/turf/open/floor/iron, -/area/station/cargo/storage) -"ycL" = ( -/obj/structure/cable, -/obj/effect/turf_decal/trimline/blue/filled/warning, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"ycT" = ( -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"ycZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/xenobiology) -"ydo" = ( -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"ydu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/effect/spawner/random/entertainment/gambling, -/obj/effect/spawner/random/entertainment/gambling, -/turf/open/floor/wood, -/area/station/commons/lounge) -"ydL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/mapping_helpers/burnt_floor, -/turf/open/floor/plating, -/area/station/maintenance/starboard/fore) -"yed" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood, -/area/station/service/theater) -"yes" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"yex" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/grimy, -/area/station/tcommsat/computer) -"yeD" = ( -/obj/effect/turf_decal/tile/green/fourcorners, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"yeN" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/locker) -"yeX" = ( -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"yfd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/dark/telecomms, -/area/station/tcommsat/server) -"yff" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door/directional/west{ - id = "Disposal Exit"; - name = "Disposal Vent Control"; - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/station/maintenance/disposal) -"yfg" = ( -/obj/effect/turf_decal/trimline/red/filled/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/security/prison) -"yfh" = ( -/obj/machinery/medical_kiosk, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/effect/turf_decal/siding/white, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron/white/side{ - dir = 1 - }, -/area/station/medical/treatment_center) -"yfo" = ( -/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/security/office) -"yfv" = ( -/obj/structure/table, -/obj/effect/spawner/random/decoration/ornament, -/turf/open/floor/iron, -/area/station/maintenance/port/aft) -"yfy" = ( -/obj/machinery/duct, -/obj/machinery/door/airlock/medical{ - name = "Primary Surgical Theatre"; - req_access_txt = "45" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"yfA" = ( -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 4 - }, -/mob/living/simple_animal/bot/medbot/autopatrol, -/turf/open/floor/iron/white/corner{ - dir = 8 - }, -/area/station/medical/medbay/lobby) -"yfG" = ( -/obj/machinery/computer/arcade/orion_trail{ - desc = "For gamers only. Casuals need not apply."; - icon_screen = "library"; - icon_state = "oldcomp"; - name = "Gamer Computer" - }, -/obj/structure/sign/poster/contraband/lusty_xenomorph{ - pixel_x = -32 - }, -/obj/item/toy/katana{ - desc = "As seen in your favourite Japanese cartoon."; - name = "anime katana" - }, -/obj/structure/table/wood, -/turf/open/floor/plating, -/area/station/maintenance/port/aft) -"yfJ" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Security Maintenance"; - req_access_txt = "1" - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) -"yfS" = ( -/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall/prepainted/daedalus, -/area/station/engineering/atmos/storage/gas) -"ygg" = ( -/turf/open/floor/iron/white, -/area/station/science/cytology) -"ygw" = ( -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron/dark, -/area/station/service/chapel/office) -"ygx" = ( -/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, -/turf/open/floor/iron/ported/techfloor_grid, -/area/station/engineering/supermatter/room) -"ygB" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/cable, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"ygE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/iron/white, -/area/station/science/storage) -"ygI" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, -/obj/machinery/door/airlock/engineering{ - name = "Engine Room"; - req_one_access_txt = "10;24" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"ygP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/white, -/area/station/science/lab) -"ygR" = ( -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/bar, -/turf/open/floor/iron, -/area/station/construction/storage_wing) -"yhc" = ( -/obj/machinery/power/generator{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/engineering/supermatter/room) -"yhl" = ( -/obj/item/tank/internals/oxygen, -/obj/item/tank/internals/oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/machinery/light/small/maintenance/directional/east, -/turf/open/floor/plating, -/area/station/maintenance/port) -"yhn" = ( -/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/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/white, -/area/station/hallway/secondary/entry) -"yhC" = ( -/obj/machinery/power/port_gen/pacman, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"yhS" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/fore) -"yib" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/obj/item/toy/plush/space_lizard_plushie{ - desc = "He stared into the void and listened. He didn't expect an answer..."; - name = "Void-Stares-Back" - }, -/turf/open/space/basic, -/area/space/nearstation) -"yid" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/white, -/area/station/science/storage) -"yie" = ( -/obj/structure/rack, -/obj/effect/spawner/random/techstorage/tcomms_all, -/turf/open/floor/iron/dark, -/area/station/engineering/storage/tech) -"yii" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/engineering/atmospherics_engine) -"yij" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet/restrooms) -"yiv" = ( -/obj/effect/turf_decal/trimline/blue/filled/corner{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/medical/treatment_center) -"yiC" = ( -/obj/structure/cable, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating/airless, -/area/station/solars/port/aft) -"yiT" = ( -/obj/structure/table/glass, -/obj/item/book/manual/wiki/medicine, -/obj/item/clothing/neck/stethoscope, -/obj/item/wrench/medical, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, -/turf/open/floor/iron/dark, -/area/station/medical/cryo) -"yiX" = ( -/obj/structure/chair{ - dir = 8; - name = "Defense" - }, -/obj/effect/turf_decal/tile/green/anticorner/contrasted{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/security/courtroom) -"yjC" = ( -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/delivery, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/obj/machinery/light/directional/north, -/obj/machinery/light_switch/directional/north, -/turf/open/floor/iron/white, -/area/station/science/misc_lab) -"yjH" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/catwalk_floor/iron_dark, -/area/station/maintenance/port/aft) -"yjJ" = ( -/obj/machinery/disposal/bin{ - desc = "A pneumatic waste disposal unit. This one leads to the morgue."; - name = "corpse disposal" - }, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/obj/structure/sign/warning/bodysposal{ - pixel_y = -32 - }, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"yjM" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/box/white{ - color = "#52B4E9" - }, -/turf/open/floor/iron/ported/techfloor, -/area/station/engineering/supermatter/room) -"yjO" = ( -/obj/machinery/telecomms/server/presets/service, -/obj/machinery/light/small/directional/south, -/turf/open/floor/circuit/telecomms/mainframe, -/area/station/tcommsat/server) -"yjP" = ( -/obj/machinery/holopad, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/station/service/hydroponics) -"yjT" = ( -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=9.3-Escape-3"; - location = "9.2-Escape-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/yellow/opposingcorners, -/turf/open/floor/iron/dark, -/area/station/hallway/secondary/exit/departure_lounge) -"ykd" = ( -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/effect/spawner/random/maintenance, -/obj/structure/cable, -/obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/station/cargo/storage) -"ykr" = ( -/obj/effect/turf_decal/trimline/blue/filled/warning{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/iron/white, -/area/station/medical/medbay/central) -"ykI" = ( -/obj/effect/landmark/start/hangover, -/turf/open/floor/engine{ - name = "Holodeck Projector Floor" - }, -/area/station/holodeck/rec_center) -"ykQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron/dark, -/area/station/service/chapel/funeral) -"ylr" = ( -/obj/machinery/light/directional/north, -/obj/machinery/computer/security/wooden_tv, -/turf/open/floor/carpet, -/area/station/command/heads_quarters/captain/private) -"ylw" = ( -/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/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/effect/turf_decal/bot{ - dir = 1 - }, -/obj/item/stock_parts/cell/emproof{ - pixel_x = -4; - pixel_y = 6 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/iron{ - dir = 1 - }, -/area/station/engineering/main) -"yly" = ( -/obj/machinery/computer/crew, -/obj/effect/turf_decal/tile/green/half/contrasted{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/station/command/bridge) -"ylA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/medbay/lobby) -"ylC" = ( -/obj/structure/tank_dispenser/oxygen, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/security/brig) -"ylE" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/station/command/heads_quarters/cmo) -"ylH" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/white, -/area/station/security/prison) -"ylM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden, -/turf/open/floor/iron, -/area/station/hallway/primary/starboard) -"yma" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Auxilliary Surgery"; - req_access_txt = "45" - }, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/blue/fourcorners, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/station/medical/surgery/aft) -"ymb" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white, -/area/station/science/research) -"ymf" = ( -/obj/structure/sign/warning/radiation/rad_area{ - pixel_y = 32 - }, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/station/engineering/gravity_generator) - -(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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -xXW -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rUb -rUb -anS -tPH -anS -rUb -rUb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rUb -aaa -aaa -aaa -aaa -aaa -rUb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -fxr -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -quc -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -lMJ -oEO -lMJ -anS -aaa -anS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -anS -anS -anS -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -anS -aaa -lMJ -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -anS -aaa -lMJ -anS -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -lAu -lMJ -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lAu -lMJ -lAu -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rUb -lMJ -anS -anS -anS -aaa -rUb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -lMJ -bNb -gbI -gbI -gbI -gbI -gbI -oWO -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lAu -oWO -oWO -oWO -oWO -oWO -lMJ -lMJ -lMJ -lMJ -lMJ -oWO -oWO -oWO -oWO -lAu -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -anS -ivC -anS -lMJ -oEO -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -gbI -nZg -oVx -aVt -aWT -oWO -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -oWO -bvB -aWT -oWO -aox -quc -aox -quc -aox -oWO -bKS -aWT -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aaa -anS -anS -anS -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -xcN -aaa -aaa -aaa -rec -hdd -bsk -ieR -aVu -jSF -uwS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -uwS -aVu -hDJ -gbI -lMJ -lMJ -lMJ -lMJ -lMJ -gbI -btS -jSF -hij -xhi -hij -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aaa -lMJ -aaa -lMJ -aaa -anS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -gbI -aSI -gbI -bFH -aWU -oWO -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -oWO -aVw -aWU -oWO -lAu -aaa -aaa -aaa -aaa -oWO -aVw -aWU -hij -aZZ -hij -oRL -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -rrt -rrt -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -anS -anS -anS -aaa -rUb -anS -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -lMJ -bNb -gbI -gbI -gbI -gbI -gbI -eIn -aWV -gbI -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -gbI -bvC -xtA -uwS -aaa -aaa -aaa -aaa -aaa -uwS -caY -aWU -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -kgg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rUb -lMJ -lMJ -lEF -oTD -lMJ -lMJ -aaa -aaa -aaa -mWd -aaa -aaa -mWd -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -gbI -aVx -aWU -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -oWO -oWO -bvD -aWU -oWO -lAu -aaa -aaa -aaa -aaa -oWO -aVw -aWU -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -fGM -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -aaa -qbU -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rUb -lMJ -anS -uay -lMJ -lMJ -lMJ -lMJ -lMJ -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -pGy -aVu -aWU -eeG -aZZ -xrX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -uaD -bsk -aqW -aVu -mFy -gbI -aaa -aaa -aaa -aaa -aaa -gbI -aVu -aWU -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -fGM -rrt -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -dPw -aaa -hih -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lMJ -anS -azg -aaa -rUb -aaa -aaa -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -knP -dCx -pGy -hnm -aWU -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -oWO -oWO -aVu -bxv -oWO -lAu -aaa -aaa -aaa -aaa -oWO -aVu -bMu -gbI -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -vMu -sof -vMu -vMu -vMu -vMu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -lMJ -lEC -lMJ -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -aUn -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rUb -aaa -rUb -lMJ -rUb -anS -rUb -lMJ -lMJ -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -kFg -eVm -cYL -rkZ -mrw -aWT -baa -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -cqg -btO -aWW -mQt -oWO -lAu -aaa -aaa -aaa -aaa -oWO -bKU -oOM -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -vMu -fiq -oYa -xFA -wpI -saH -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -mNa -aaa -lEC -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lMJ -lMJ -aaa -aaa -lMJ -aaa -aaa -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -kFg -eVm -cYL -rkZ -bvF -aWU -baa -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -bsm -qVL -bvF -mQt -oWO -lAu -aaa -aaa -aaa -aaa -oWO -aVu -mQt -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -vMu -vMu -vMu -fMS -lQt -saH -lMJ -gQK -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -lMJ -lMJ -lMJ -eMf -eMf -eMf -mNa -mNa -lEC -dJN -dJN -dJN -dJN -lMJ -dJN -lMJ -rNf -rNf -lMJ -lMJ -jXe -lMJ -lMJ -dJN -dJN -dJN -dJN -aaa -lMJ -lMJ -aaa -aaa -lMJ -aaa -aaa -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -jmc -hkJ -pGy -jUt -bvF -aWU -bab -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -baa -btP -eqE -gcy -gbI -aaa -aaa -aaa -aaa -aaa -gbI -btS -lOh -gbI -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -anS -saH -eAh -lWO -hTU -saH -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nAu -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -jvw -aaa -lEC -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lMJ -uay -aaa -aaa -lMJ -aaa -aaa -pGy -aDa -aDa -aDa -aDa -obX -aDa -aDa -aDa -lGS -cWM -ilJ -tra -uqi -ozN -ggW -aYE -bac -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -bsn -btQ -bvI -nFu -oWO -lAu -aaa -cVx -aaa -aaa -oWO -aVu -mQt -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -vMu -nUK -vMu -vMu -vMu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -lMJ -lEC -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aox -uay -aox -aaa -lMJ -aaa -aaa -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -oSc -oQc -pGy -mVx -aWU -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -oWO -oWO -aVu -wbu -gbI -aaf -hnL -bEl -oWO -aaf -gbI -gVu -keB -oWO -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nLZ -aaa -aaa -aaa -rrt -aaa -lMJ -aaa -aaa -aaa -gmO -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -hih -aaa -sBd -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -auC -mac -auC -aaa -lMJ -aaa -aaa -pGy -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -oYM -paf -pGy -rGg -aWU -eeG -aZZ -xrX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -uaD -bsk -aqW -aVu -gRz -gbI -oWO -oWO -bEm -oWO -oWO -gbI -btS -ukF -eEw -eEw -eEw -eEw -aox -aox -aox -aox -aox -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -gnA -sCl -lMJ -lMJ -dOy -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -hih -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -auC -iHm -auC -aaa -lMJ -auC -auC -auC -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -ttX -ueB -pGy -rGg -aWU -oWO -oWO -oWO -lAu -aaa -aaa -aaa -aaa -aaa -lAu -oWO -oWO -oWO -tbW -jmQ -gbI -bBc -oWO -sIA -oWO -bHH -gbI -aVu -pcI -fiR -rDS -cDe -eEw -eEw -eEw -cTN -eEw -eEw -aaa -lAu -lAu -aaa -mWd -aaa -lAu -lAu -lAu -lAu -lAu -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -lMJ -aaa -aaa -aaa -dOy -aaa -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -lMJ -hih -lMJ -jvw -eMf -eMf -eMf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -auC -auC -nVm -auC -auC -keN -auC -xZo -auC -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -aDa -xPR -wYc -dhb -pGy -xyu -wdq -aYF -oWO -lMJ -aaa -lAu -lAu -djM -lAu -lAu -lAu -lMJ -oWO -btR -aWW -lWR -tIZ -mGD -mGD -mGD -mGD -mGD -mGD -qPM -hTb -eEw -uHX -cDe -ako -eEw -otq -qAO -dFt -vYs -vYs -qNY -qNY -vYs -vYs -vYs -qNY -qNY -qNY -qNY -qNY -lAu -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -fee -aaa -aaa -aaa -rrt -aaa -lMJ -aaa -aaa -tia -dOy -tia -tia -tia -tia -tia -tia -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -jvw -aaa -lEC -aaa -jvw -jvw -mNa -jvw -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -auC -auC -keN -auC -uTk -arZ -hOj -xZo -dqe -doA -xZo -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -yhn -bvF -aWV -gbI -gbI -gbI -oWO -oWO -oWO -oWO -oWO -gbI -gbI -gbI -jFA -bvF -ogQ -nRJ -bJo -bJo -tgB -ihP -bJt -bJo -hfm -bMB -eEw -iOs -cDe -eEw -eEw -eEw -isU -eEw -vYs -iih -cpQ -ayD -iRE -nzL -lBi -qNY -xfk -aVc -rlx -qNY -qNY -lMJ -lMJ -lMJ -lMJ -lMJ -aox -lMJ -lMJ -lMJ -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -lZV -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -tia -fEp -dOy -fEp -fEp -fEp -fEp -fEp -fEp -tia -aaa -anS -nRb -anS -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -lMJ -lMJ -lMJ -eMf -eMf -eMf -jvw -mNa -lEC -mNa -jvw -eMf -eMf -eMf -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -auC -aqC -fyM -nvt -sGX -rQt -rQt -rQt -rQt -rQt -eju -rQt -rQt -rQt -rQt -rQt -rQt -rQt -rQt -rQt -rQt -rQt -rQt -wmV -xoW -bcA -rGg -eaQ -nZp -nZp -nDX -nZp -nZp -tPW -nZp -nZp -ocT -iTI -nZp -mgz -rGg -rGg -nRJ -bJo -blU -eEw -eEw -eEw -eEw -eEw -eEw -eEw -onC -cDe -bPL -eEw -gyN -kIh -tWo -vYs -pmu -wOn -wOn -wfq -wOn -ckP -ckP -auR -ndr -crh -vDb -qNY -qNY -lAu -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lAu -lAu -lZV -lAu -lAu -lMJ -aaa -aaa -aaa -aaa -lMJ -tia -dOy -tia -tia -tia -tia -tia -tia -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -kyS -aaa -lEC -aaa -jvw -jvw -mNa -jvw -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -keN -aqD -nMS -auC -auC -auC -aRG -lUq -auG -auC -keN -auC -dst -nbO -nwN -aRG -aRG -lZy -auG -dnd -oLX -xZo -aRG -aSP -auC -und -cZt -iLA -sZo -bvI -wPI -bvF -bvF -biv -uQv -blT -poK -hBT -bEt -bEt -bEt -vba -ncD -jEJ -bCI -bEo -cDe -cDe -fOD -dkH -rDS -rDS -rDS -rDS -iuy -nfn -bbL -bbL -auF -vYs -edq -wfq -wOn -wOn -wOn -lDk -rlx -crh -crh -wYq -ckP -tDJ -qNY -lAu -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -imo -imo -fgc -fgc -fgc -imo -imo -fgc -fgc -wOu -fgc -fgc -imo -aaa -aaa -aaa -aaa -lMJ -aaa -yiC -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -lMJ -wNc -uQF -jvw -eMf -eMf -eMf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -aox -auC -auC -nYc -auC -lMJ -auC -auC -keN -auC -auC -lMJ -auC -auC -auC -auC -keN -auC -auC -auC -auC -auC -auC -keN -auC -auC -gbI -gbI -tEV -qhw -tEV -sJO -pdk -sJO -qaQ -qoW -bCL -vhG -vhG -vuF -vuF -vuF -vhG -vhG -qLZ -bCJ -eEw -auF -bsq -bJr -eEw -aqK -aqO -tWo -wvH -rDS -tWo -eEU -aob -qaU -vYs -kfk -tOc -tOc -ckR -bjh -bjh -rlx -ckP -ckP -ckP -ckP -jMa -qNY -lAu -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -imo -vIi -wsv -bhm -lhE -bTf -imo -ulb -maC -wOu -rJm -xht -imo -aaa -aaa -aaa -aaa -lMJ -tia -dOy -tia -tia -tia -tia -tia -tia -lMJ -lMJ -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -wNc -aaa -uQF -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aqE -arZ -atp -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -tEV -jrx -tEV -dhg -qIk -nwe -sJO -jpN -ong -ocQ -rJv -rJv -rJv -rJv -rJv -ocQ -oeo -oyR -eEw -bqf -yhl -ako -eEw -leB -aob -vMg -aob -rDS -eEw -eEw -eEw -eEw -vYs -sty -ckP -bmE -ndr -jGD -kiM -ckP -crh -ckP -ckP -wYq -jGD -qNY -lAu -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -imo -bIW -xfr -wuc -tEH -beh -imo -uTm -nPQ -wOu -fqi -iwb -imo -lMJ -lMJ -lMJ -lMJ -tia -fEp -dOy -fEp -fEp -fEp -fEp -fEp -fEp -tia -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aqF -doJ -atq -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -tEV -nHP -tEV -kWa -beM -tqR -biy -afs -blW -vuF -rJv -rJv -rJv -rJv -rJv -vuF -vlz -tEv -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -tWo -cUJ -eEw -xYz -aob -mpF -vYs -eDt -qPK -ckP -ckP -dvt -csf -bXE -ckP -ckP -crh -ckP -qNY -qNY -lMJ -lMJ -lMJ -vYs -lwB -vYs -lMJ -lMJ -imo -vkP -xfr -hkA -dYW -cjs -imo -fgc -lfA -wOu -hhm -fgc -imo -imo -aaa -aaa -aaa -lMJ -tia -dOy -tia -tia -tia -tia -tia -tia -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aqF -doJ -atq -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -tEV -nHP -tEV -cnm -beM -mpV -xzi -owS -blX -vuF -rJv -rJv -rJv -rJv -rJv -vuF -vlz -qaR -seg -dWo -myT -enx -tAy -qLD -hqy -eEw -amZ -iuy -sJJ -jUB -bVT -aob -vYs -cxQ -rlx -crh -ckP -ckP -muD -ckP -ckP -ckP -ckP -ckP -mPb -vYs -vYs -vYs -vYs -vYs -ctZ -qNY -aaa -aaa -imo -dgV -hLg -oij -dYW -ggk -imo -oRH -fdW -jBZ -fdW -sSQ -qYZ -fgc -lAu -aaa -aaa -lMJ -aaa -yiC -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -tPH -tPH -nRb -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aqF -doJ -atq -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -eHf -nHP -tEV -efc -ges -ddw -ctd -qTx -blY -cNG -bqg -rJv -rJv -rJv -rJv -vuF -tbC -lty -seg -uyH -xMN -azm -kPq -dSM -jQL -eEw -auF -rDS -eEw -rLW -tWu -bXx -vYs -nZb -pVg -ckP -fsW -ckP -kuZ -slk -ckP -ckP -evj -uet -vYs -vYs -vYs -yfG -xXZ -vYs -dyl -vYs -vYs -aaa -imo -uxX -xUD -hhQ -hhQ -rsW -uno -wwM -hCx -wxS -tlA -kYE -aJp -kcu -suP -aaa -aaa -lMJ -bfM -dOy -bfM -bfM -bfM -bfM -bfM -bfM -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aqF -doJ -atq -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -eHf -cac -tEV -wwI -beP -khh -pdk -owS -blZ -vuF -rJv -rJv -rJv -rJv -rJv -vuF -bBh -mXG -leC -xMN -xMN -lhC -tNa -uyH -nXv -eEw -qtl -rDS -eEw -ikW -eEw -eEw -vYs -jlw -jve -bmy -vYs -uYL -maO -vYs -qyH -vHP -vYs -dEH -vYs -acS -vYs -pLU -uzM -gtG -eIf -tYs -vYs -aaa -imo -cet -dUE -gSZ -hIe -wHN -nwT -vow -kTh -xPv -muP -lrn -xii -fgc -lMJ -lMJ -lMJ -bfM -fEp -dOy -fEp -fEp -fEp -fEp -fEp -fEp -bfM -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aqF -doJ -atq -aaa -aaa -aaa -aaa -aaa -aAA -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -eHf -nHP -tEV -hnt -saT -gTb -sJO -vHg -bma -vuF -rJv -rJv -rJv -rJv -rJv -vuF -vlz -sQs -seg -seg -bQK -phL -phL -ihg -ihg -hfx -rbl -rDS -eEw -eEw -eEw -eAD -vYs -vYs -vYs -vYs -vYs -vYs -pQz -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -oEz -muD -vYs -lMJ -imo -imo -lZx -imo -imo -imo -imo -imo -fgc -ing -fgc -fgc -imo -imo -aaa -aaa -aaa -lMJ -bfM -bdz -bfM -bfM -bfM -bfM -bfM -bfM -lMJ -lMJ -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -xtw -aaa -fcJ -aaa -wNc -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aqG -asb -atr -aaa -aaa -aaa -jfn -jfn -oHe -jfn -jfn -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -tEV -nHP -tEV -tEV -yfJ -tEV -tEV -qnY -blV -ocQ -rJv -rJv -rJv -rJv -rJv -ocQ -vlz -rof -ggY -seg -bNv -mkZ -bqR -dSM -cGq -eEw -fRq -rDS -iuy -paD -twV -hrs -hNy -hFw -sJS -cKH -hNy -dYM -hNy -vYs -cCk -qUR -mmb -gLu -lvY -bXE -oAe -cCk -vYs -vPJ -bXE -fLY -vYs -aaa -lAu -fgc -qOJ -fgc -lAu -aaa -imo -nrc -jwJ -lZg -iTg -cXS -ngK -fgc -aaa -aaa -aaa -lMJ -aaa -dOy -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -aaa -xfX -aaa -kyS -eMf -eMf -eMf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -aox -auC -auC -dUW -auC -lMJ -lMJ -lMJ -jfn -brv -kXP -cBZ -jfn -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -cUZ -aaa -aaa -aaa -aaa -aaa -aaa -tEV -xxh -pLk -nHP -bfS -cuN -wos -wea -cDq -vhG -vhG -vuF -vhG -vuF -vhG -vhG -ppg -fve -bNK -seg -ivm -jEF -jhu -hqy -dsH -eEw -lQm -rDS -vYs -vYs -vYs -vYs -vYs -vYs -cMJ -vYs -vYs -vYs -hNy -ebL -cCk -bXE -bXE -kMi -bXE -vyN -bXE -kMi -vYs -vYs -goS -muD -vYs -aaa -lAu -fgc -qOJ -fgc -lAu -aaa -imo -eQz -qTL -gul -uFb -tgQ -adB -fgc -aaa -aaa -aaa -lMJ -bfM -dOy -bfM -bfM -bfM -bfM -bfM -bfM -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -jvw -aaa -hih -aaa -jvw -jvw -jvw -mNa -aaa -aaa -aaa -aaa -aaa -mWd -aaa -aaa -lMJ -lMJ -keN -dnO -rIF -auC -aaa -aaa -aaa -jfn -hZM -xVs -lCs -jfn -lMJ -lMJ -lMJ -lMJ -msN -bca -woB -msN -woB -oXt -msN -lMJ -lMJ -lMJ -lMJ -tEV -nHP -dtZ -pbr -vIc -pII -tEV -qPj -sxG -gkL -hQo -hFc -sCB -hFc -hFc -dFc -oHq -inv -seg -seg -seg -eEw -eEw -eEw -eEw -eEw -eEw -rDS -vYs -dDv -hIX -rQn -eLR -gZa -nVt -kOE -nof -nVS -wKI -vYs -jSC -bXE -mBg -rue -bXE -kMi -rig -bXE -vYs -sFA -bXE -muD -vYs -aaa -lAu -fgc -gPu -fgc -lAu -aaa -imo -gAR -dLn -cCK -jwJ -uWm -nHx -fgc -lMJ -lMJ -lMJ -bfM -fEp -dOy -fEp -fEp -fEp -fEp -fEp -fEp -bfM -aaa -anS -anS -anS -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -lMJ -lMJ -lMJ -eMf -eMf -eMf -mNa -mNa -lEC -lEC -mNa -eMf -eMf -eMf -lMJ -lMJ -lMJ -qSW -aif -qSW -gnJ -qSW -qSW -qSW -auC -aqH -dEh -auC -aaa -aaa -aaa -tvJ -tvJ -hIV -hFD -tvJ -jfn -tvJ -lAu -lAu -tTK -dIW -tvU -tTK -dmW -xBn -tTK -lAu -lAu -bDJ -bDJ -tEV -jrk -tEV -tEV -ehD -tEV -tEV -odL -mLm -tXK -eyn -fHZ -qsF -jCh -fdG -jfl -jZV -bSY -bFu -bqE -oOc -eEw -cBk -qyP -bOi -aAQ -eEw -cUJ -vYs -ril -dvt -bRI -hvt -vYs -joV -vYs -qWj -vYs -hNy -vYs -nvp -bXE -bXE -bXE -rig -gLu -bXE -gLu -vYs -vYs -hdX -muD -vYs -vYs -imo -imo -jul -imo -imo -lMJ -imo -imo -fgc -fgc -fgc -fgc -imo -imo -aaa -aaa -aaa -aaa -bfM -dOy -bfM -bfM -bfM -bfM -bfM -bfM -lMJ -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -mNa -mNa -mNa -jvw -aaa -hih -aaa -jvw -mNa -jvw -jvw -aaa -aaa -aaa -qSW -xMD -ajc -tIc -alx -xCe -anU -auC -auC -pWf -auC -auC -auC -auC -auC -ndW -xVs -umr -xKP -htC -tvJ -tTK -tTK -tTK -teQ -kGn -tTK -kGn -vkd -tTK -tTK -tTK -bDJ -hqi -kaE -vil -wnp -fzJ -hfd -qWn -fzJ -vhG -vhG -ilO -sQf -ghJ -vhG -bFu -aHT -bFu -bFu -jUK -jUK -bLT -rPX -eEw -xYz -jhV -wvH -aqK -eEw -aGF -vYs -fko -jqx -bXC -tdY -vYs -vYs -vYs -erp -vYs -iGm -tUB -vew -vew -dyE -oWP -ueg -geT -bXE -bXE -jLv -mqo -duH -muD -vYs -eBH -imo -evc -fIy -jDH -imo -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -dOy -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -eMf -eMf -eMf -jvw -aaa -lEC -aaa -jvw -eMf -eMf -eMf -aaa -aaa -aaa -gnJ -gnJ -qSW -qSW -qSW -nsZ -anV -mfk -iKu -aXR -auL -mTh -auC -awP -auC -mcY -jfp -kpF -xVs -aDW -tvJ -lJI -oUK -oUK -jzZ -xUy -ltP -xUy -nET -pGU -pGU -mTX -cPm -qfe -lYv -lYv -fzJ -fzJ -shp -hOe -omA -bkg -lDf -qxd -tqH -lCP -apj -bFu -ecL -mIq -plV -pVa -bFu -iEb -bFu -eEw -qQS -aof -aob -tWo -eEw -rDS -vYs -hKn -bXE -mGO -iZM -inl -cZE -erp -pLa -vYs -xAq -vYs -yfv -riP -bXE -ees -bXE -plC -rig -oAe -xsx -mqo -duH -muD -vYs -mAY -imo -ihT -qOJ -gQW -imo -aaa -aaa -lMJ -lMJ -cCM -cDD -lMJ -lMJ -aaa -aaa -aaa -aaa -lAu -lAu -dOy -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lEC -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -gnJ -aih -bQc -yff -aly -amP -anW -dpp -oXZ -rQt -aRG -bQI -auC -auC -auC -pxS -xVs -kpF -fbA -tvJ -tvJ -vSJ -wfw -xdr -wfw -wfw -wfw -wfw -wfw -eKx -wfw -wfw -wfw -lqP -bDJ -fzJ -fzJ -wrf -hYl -xxG -omA -jIl -lDf -qxd -kmC -lCP -wNU -bFu -xhp -fbY -bLT -vYq -bLT -ohu -jqN -eEw -bLe -rLW -vMg -aob -eEw -rDS -vYs -msV -bUU -rjo -pIO -vYs -ipo -mGz -plT -exc -wSN -vYs -ovU -jkQ -cBC -eke -mrv -tFJ -hev -xTt -xkP -mqo -jqA -muD -vYs -eQQ -imo -uNH -cAy -iFu -imo -aaa -aaa -lMJ -lAu -lAu -lAu -lAu -lMJ -aaa -aaa -aaa -aaa -lAu -pMT -kEj -pMT -lAu -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lEC -lEC -lEC -aaa -aaa -aaa -aaa -aaa -aaa -gnJ -aii -mKf -aki -iaP -nsZ -anX -siw -xZo -rQt -eBF -vpa -fVm -auC -hew -dOu -jgL -aQw -jgL -dfo -rPv -day -lYv -lYv -lYv -dxt -xzU -kKA -vPl -dxt -xzU -kKA -vPl -spT -jou -hAr -kYs -qSl -bRu -uvB -fzJ -fzJ -mtV -qxd -sQf -lCP -wNU -bFu -qxC -bFu -dIN -bFu -cvA -bFu -mXW -eEw -fEo -rLW -rLW -jNC -qHM -koV -vYs -kXu -hIt -vYs -vYs -vYs -vYs -pqO -vYs -vYs -rKn -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -vYs -oEz -muD -vYs -vYs -xqc -imo -jtY -imo -imo -lMJ -gKU -gKU -tBV -tBV -tBV -tBV -gKU -gKU -aaa -aaa -aaa -lAu -pMT -cLP -pMT -lAu -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lMJ -aaa -lEC -aaa -aaa -aaa -aaa -aaa -aaa -gnJ -pBU -ajf -tpj -alA -cYp -lxR -auC -eRi -rQt -qiQ -fRJ -cpu -icj -hUT -hUT -jAH -wMm -kAg -uln -oEW -mAe -dwW -feh -ved -hpE -tAb -hpE -ved -ozq -jUF -hpE -jUF -jUF -unm -uMk -qdc -qdc -rNr -jbh -lLi -fzJ -fzJ -qxd -sQf -nJQ -eEw -eEw -eEw -eEw -bpF -bFu -jow -bFu -boS -eEw -vrB -fEo -wvH -bPL -eEw -rDS -rDS -hLp -pZM -vYs -bYK -bZP -sFD -gje -gvs -vYs -lDq -stQ -stQ -haV -stQ -haV -stQ -haV -pTH -stQ -stQ -vMW -haV -haV -haV -qtp -xif -seT -lYO -wLS -pKi -gKU -gKU -wnB -juG -osv -osv -oPi -pqX -gKU -gKU -gKU -gKU -tBV -pMT -bQe -pMT -rFF -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -nRb -tPH -anS -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -aaa -lAu -lAu -lAu -ghr -aaa -lMJ -aaa -lEC -aaa -aaa -aaa -aaa -lAu -aaa -gnJ -nEj -hGa -hZX -alB -tfa -aoO -auC -jZB -eju -att -auC -auC -auC -iiD -jgL -xVs -jfp -tBk -fxx -fxx -mVV -mVV -xDQ -pWV -oMU -lYv -kKA -mtt -dxt -wfw -kKA -tzM -lYv -qRS -hAr -qUM -qUM -qUM -qUM -rlY -stT -fzJ -fDg -sQf -vhr -eEw -aoe -eet -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -tWo -rDS -rDS -rDS -vYs -bYL -bZQ -cbw -muD -suA -vYs -yjH -bbE -bbE -bbE -bbE -bbE -bbE -bbE -bbE -bbE -bbE -rKn -bbE -bbE -wli -bbE -xqc -nZj -asc -lMp -tLn -xBp -osv -mQf -nKF -lry -nKF -krK -osv -osv -osv -lox -oPi -gKU -kwP -cLP -cMy -rFF -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -aaa -lAu -nXi -nXi -nXi -khY -khY -khY -aaa -lEC -aaa -aaa -lAu -lAu -tzJ -pfg -pfg -pfg -auC -hTz -auC -auC -auC -auC -auC -rQt -att -auC -ohQ -auC -fDi -sje -dmL -dpG -pBD -fxx -rmY -kZE -mVV -mVV -vEv -ykd -lYv -sAB -wfw -aqv -oWC -sAB -tzM -lYv -bra -hAr -xBW -oRu -jry -qUM -lqz -mNp -fzJ -qxd -mgV -rLG -dkH -koV -rDS -rDS -rDS -pbK -rDS -tWo -rDS -rDS -rDS -rDS -rDS -rDS -rDS -rDS -rDS -tWo -rDS -vYs -bYM -bZP -cbx -cdh -bUV -vYs -skZ -bbE -xyv -kgL -dVY -nbX -pao -kgL -xyv -bbE -whX -frp -bbE -dDw -utr -cNg -vYk -bzT -duB -bzT -pKi -gKz -qiL -qFM -nKF -msm -nKF -eTz -nKF -pfX -pfX -nKF -kAa -eQf -uui -cLQ -eDA -rFF -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lMJ -aaa -lAu -nXi -nXi -xbP -ybE -nsG -oAL -khY -aaa -lEC -aaa -lAu -tzJ -tzJ -tzJ -nTQ -mmf -xAQ -auC -qxi -xZo -oaE -qtK -xZo -ukM -rQt -bOJ -xZo -srZ -auC -auC -jDM -auC -auC -auC -auC -cdl -mVT -wyI -mVV -oTz -tzM -lYv -wfw -wfw -wfw -wfw -wfw -tzM -lYv -nnx -fzJ -fzJ -fzJ -omA -omA -fzJ -fzJ -fzJ -ijI -low -bsD -eEw -fEC -aoa -tWo -hjd -owG -rDS -rDS -rDS -aoa -aqO -xYz -tWo -bPN -vMg -bTt -rfA -tWo -rDS -vYs -vYs -vYs -bXE -bXE -ipl -vYs -yjH -bbE -xhZ -mIF -nYV -bap -nYV -sCT -oMX -bbE -eKh -frp -bbE -cvl -rNZ -uYd -ohs -kQc -hLi -hpQ -nKF -nKF -laS -nKF -nKF -nKF -nKF -rXt -nKF -nKF -nKF -nKF -ckh -gKU -eig -xuW -cMA -rFF -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -nAu -rrt -rrt -rrt -rrt -rrt -rrt -rrt -ckb -aaa -lMJ -aaa -lAu -nXi -orL -gBC -aNL -kvf -kKb -khY -aaa -lEC -lEC -lEC -djX -aeG -ttY -aeG -ahs -qCy -xsO -kjg -dHf -jFF -jFF -jFF -jFF -iNd -mlx -fWe -lZy -auC -hCI -eBF -tca -xZo -hPP -auC -ojc -iXp -aSa -fxx -qEg -kSr -ufi -lmx -lmx -lMV -pWV -wfw -tzM -lYv -wIx -ycp -ktO -oMe -sPo -sPo -sPo -cCd -puO -pFA -sQf -tbb -eEw -eEw -eEw -eEw -eEw -eEw -eEw -bGq -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -eEw -cUJ -eEw -sTo -vYs -epV -bXE -koy -vYs -jLU -bbE -uWh -fsq -kxB -aOa -kxB -uMv -aYA -bbE -bXE -frp -bbE -ejb -kUo -ilb -sjt -xfb -asc -uPR -yma -wIU -mNc -yjJ -iVA -fSH -cDJ -dTu -bbN -xwd -cHv -nKF -ckh -gKU -gKU -gKU -gKU -rFF -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lMJ -aaa -lMJ -aaa -lAu -nXi -deQ -adh -adh -aaw -wRc -khY -khY -aaa -aaa -lAu -tzJ -tzJ -tzJ -agD -ybG -ain -xKE -dnd -aRG -sdk -qmS -oaS -dou -auC -ehJ -fVm -auC -auC -qlY -eBF -aRG -xZo -xZo -auC -rLq -upY -mUO -fjt -rCt -tzM -qUI -hMl -aqU -opi -kIP -lmx -kSr -ufi -lmx -lmx -gGr -mQU -kte -utc -kte -hpk -pJF -lkg -gUg -fhj -sbV -nxp -kBZ -gdY -rnA -fPm -blh -oMN -qqz -xnK -eqw -mvv -sbV -kjv -uDt -ejn -mht -eEw -rDS -eho -lfh -vYs -bXE -dvt -vYs -vYs -hGT -ifv -rOQ -jCA -prq -qau -jXg -cFj -cQH -bbE -vyN -frp -bbE -bbE -bbE -bbE -bbE -kkl -cdy -hdA -oEd -cNs -fgW -iiC -iVA -cEE -iHk -dah -gNy -cGB -hFW -nKF -ckh -gKU -txp -xVk -gKU -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -aaa -lMJ -lAu -aaa -lMJ -aaa -lMJ -aaa -aaa -khY -ger -tOw -dgX -vSn -wRc -trJ -khY -aUn -aUn -rrt -rrt -rrt -tzJ -pfg -pfg -tjs -jeN -auC -auC -eSi -auC -auC -auC -auC -cPq -sBp -sBp -vyO -sBp -sBp -sBp -wKi -nMs -auC -auC -auC -auC -auC -bVF -vBw -saA -bVF -bVF -bVF -bVF -meI -jUF -lYv -rJE -wJM -kMR -afh -wbs -seU -qZc -uHx -uHx -dlA -hLV -bwl -sbV -toe -paI -oMN -nbM -oMN -nbM -oMN -qqz -vql -sys -cIl -sbV -pzG -wPy -pHF -opO -eEw -rDS -eEw -xYz -vYs -rzv -svq -vYs -xxb -nLc -bbE -opx -xjm -cZc -bpT -pdp -dXY -rRs -bbE -bXE -nXg -uOc -dPt -bXE -uQy -bZp -hyt -cvr -wEy -nHm -sOW -uHi -lrY -iVA -qTp -iHk -glN -cFK -nBA -cBS -nKF -iVR -lEs -aGx -qFZ -gKU -lMJ -aaa -aaa -lMJ -lAu -lAu -lAu -lMJ -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -lAu -lAu -khY -nXi -khY -khY -khY -khY -khY -khY -khY -kmA -kmA -kmA -qks -wTb -qoj -nXi -lAu -mji -aaa -aaa -aaa -lAu -aaa -lAu -ulZ -rqy -gat -iJZ -rYY -xLa -rRu -kAv -auC -vlm -xFC -djH -mJA -dnu -auC -ivz -ivz -erH -sBp -swx -sBp -gvw -auC -lHg -wsN -juK -ihl -vFN -mut -bVF -rXn -pzv -mJo -uHx -uHx -uHx -xJE -pSd -eGZ -jwj -vWO -pJF -fqH -bqo -avH -cZb -tSp -tSp -tSp -tSp -pzn -nvz -lgw -lgw -lgw -lgw -bHj -pfB -spq -jro -edy -rwN -eEw -rDS -eEw -eEw -vYs -vYs -vYs -vYs -aBF -bbE -bbE -uNP -gtf -rdr -niE -yfy -gtf -uNP -bbE -bbE -bbE -bbE -cct -bbE -phy -bbE -wbv -cvr -wEy -pPf -xZf -fAO -vzU -iVA -mIb -fPJ -hjG -jAq -iHk -moM -nKF -aSk -fqu -far -tKv -gKU -lMJ -aaa -aaa -jpJ -bok -bok -bok -noE -bok -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lAu -nXi -nXi -khY -dmu -kmA -asn -fON -lFH -mKK -sdT -bhd -rai -lqa -kmA -dto -tcw -oAL -nXi -lAu -aUn -aaa -aaa -aaa -aaa -aaa -lAu -ulZ -rqy -rqy -fnu -gJK -nej -wTT -bLy -auC -qxi -auC -auC -auC -auC -auC -auC -auC -auC -auC -auC -aQI -tCR -auC -eHZ -wsN -juK -kJM -cBv -pvn -bVF -aUj -rVK -baW -uHx -wHP -kdo -mLb -bnX -mLC -tSz -jHK -uHx -vMO -tXK -mma -qgY -vIC -vIC -eql -vIC -rmd -vIC -vIC -vIC -vIC -vIC -pVL -bpV -wuH -uUx -xcH -rLR -eEw -dOx -fQB -hme -xAt -itG -dun -iyG -nLc -bbE -wWK -wFR -nIN -eFQ -mYT -dkG -sNA -aMt -muK -sxv -xPg -oSd -god -bQn -nyl -sxv -qVA -aiV -gHW -pPf -mRS -dVu -nyC -iVA -ktj -dPu -hjG -cVU -iHk -kUH -nKF -gnO -ckh -gKU -gKU -gKU -jpJ -jpJ -jpJ -jpJ -pvR -akT -akT -noE -lVr -bok -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -lAu -nXi -cAe -lVw -aaw -kmA -aso -aaZ -wsp -aaZ -aaZ -mkE -xuw -xRU -kmA -nXi -gTq -dCK -swM -swM -swM -swM -swM -swM -lMJ -lMJ -lMJ -ulZ -rqy -kBv -kPu -toZ -cMP -rnZ -bSq -auC -qxi -auC -aaa -aaa -aaf -aaa -aaa -aaf -aaa -aaa -auC -xZo -tCR -auC -eBk -sqo -juK -fYp -lTb -wcm -bVF -aUk -uwx -aXq -tlT -iwX -eGZ -bdm -vtW -pmN -tiE -vUa -uHx -xJg -gud -iMn -sbV -sqV -oMN -sbV -unA -xls -vnR -qlk -dub -oMN -giP -oMN -sbV -dPk -dWl -jIZ -jIZ -eEw -eGC -xYz -khu -bbE -bbE -uWR -bbE -bbE -bbE -xGu -nCO -fzF -vjp -llc -nUM -idL -fBL -iJD -sxv -laH -cto -aGh -vTz -tzP -sxv -qVA -cvr -miC -oEd -oEd -oEd -oEd -iVA -iVA -iVA -tgO -iHk -hYF -kdD -nKF -nKF -ckh -gKU -vzo -fpF -jZv -sIO -fqt -jpJ -mvJ -wkc -mvJ -noE -iOP -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -khY -khY -aeS -adh -aaw -kmA -atL -gfP -pAv -voJ -ylH -fop -jik -guu -nXi -abx -pJM -dCK -eWu -aHJ -dCK -eWu -aHJ -swM -aaa -aaa -lAu -ulZ -ulZ -ulZ -xsI -xzA -pMD -xyh -oMc -auC -hdE -auC -aaf -ksk -ksk -ksk -ksk -ksk -ksk -aaf -auC -qmo -erH -uCS -sYe -tuN -uTU -sHw -esq -bVF -bVF -pQD -uwx -aXq -smS -fzn -eGZ -hYi -pnE -vBb -gNY -eex -pJF -cWP -bqw -fhz -sbV -lTG -gUu -sbV -jtP -xls -lgw -ueY -dub -oMN -giP -pJu -sbV -oMN -oNC -dPk -dPk -eEw -rBw -qQS -khu -hfv -dRa -gaP -tqf -eYC -uNP -kWz -wjS -rKP -xKj -xKj -pKY -dor -llx -eoE -kTX -oII -eYN -miU -eYN -fXO -kTX -wBB -cvr -qLc -fcj -oMV -dtC -qNg -iud -bAm -qBd -kzC -oOK -hYF -maT -nKF -mki -kaY -bIR -ygw -jHS -ccH -iEG -sHp -jpJ -noE -myp -myp -ykQ -cEw -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -nXi -wyY -aeT -adh -ajp -kmA -kmA -nXi -kmA -kmA -aEN -fop -jik -vVt -kmA -aby -xvO -dCK -nCo -dwZ -dCK -nCo -dwZ -swM -aaa -aaa -aaa -lMJ -lAu -lAu -auC -auC -auC -auC -auC -auC -dSY -auC -aaa -ksk -dfl -lmF -vVM -nYl -ksk -aaa -auC -auC -vMJ -auC -lra -gVR -lcW -knc -uJq -bVF -dhy -aUm -jvv -uvH -xRS -mLC -mLC -xBv -vKK -vBb -afG -ucl -pJF -oMm -kiw -uRt -sbV -lTG -oav -sbV -tmg -xls -lgw -pJq -unA -mZn -gck -hVr -sbV -lOe -bRg -qQn -fqP -xwG -cIJ -tWo -khu -dvq -gDq -xFI -uOZ -yiT -bVR -nIN -pGd -llx -pAE -haB -bXm -wjS -kjG -axz -oug -mVF -xmm -aoT -vet -igG -rLc -xfb -asc -pjU -eJE -mTG -tVy -lQj -lQj -aha -iVA -iVA -iVA -iVA -iVA -nKF -xVk -iMW -gKU -jpJ -jpJ -jpJ -sDY -jpJ -jpJ -icu -myp -kjY -dYv -rJC -bok -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -nXi -aaw -qku -wwu -aaw -adh -vrL -yfg -fgU -kmA -kmA -wvy -kmA -kmA -kmA -aby -xvO -dCK -lwh -dtf -dCK -lwh -ehn -swM -swM -aaa -aaa -lMJ -aaa -aaa -auC -dnO -log -xZo -agi -auC -sIu -lIB -aaa -ksk -qrg -cpi -cpi -ucI -hvO -aIQ -aIQ -uqX -pBr -bVF -rFS -cqh -nny -cBv -iPC -uhj -dhy -rVn -fhB -jdn -lao -hel -eGZ -pcU -rkN -vBb -ujL -uHx -uHx -sHv -bql -lCP -sbV -lTG -gUu -sbV -wXv -xls -lgw -oMN -qNF -oFo -oMN -mQx -sbV -sbV -sbV -sbV -sbV -eEw -uKD -eFG -hrh -uYn -suT -hkV -xGn -fFM -sOo -mmM -mbm -rqL -yfh -pGn -kOW -wjS -sdm -ncc -kTX -hGC -coA -sMS -gQV -peU -kTX -xfb -cvr -hdA -fcj -pPi -pEM -eOq -jZY -lTo -ogb -dyH -wCc -lJX -cHy -nKF -mUx -vLK -gKU -ivO -iRx -xTF -sjF -pOz -jpJ -eVO -dYv -iDZ -dYv -sEy -bok -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -khY -ptL -dSW -qUX -pFq -adh -fPR -rjm -jEO -kfy -pna -ber -pna -pna -fpQ -tSU -hbm -cBe -yfg -ber -ady -yfg -ber -ddZ -swM -swM -swM -swM -aaa -aaa -auC -dnu -apy -cai -auG -auC -bkV -lIB -aaa -ksk -trx -uWn -uDw -ddr -iCz -vLr -qyo -aTU -jSm -bVF -mey -cBv -vpC -xlj -gux -bVF -cyR -rVn -uwx -mgJ -lao -ojx -dhf -pHL -eGZ -vBb -oBT -hHy -lao -nNu -shk -lCP -sbV -lTG -gUu -sbV -gdY -xls -lgw -tTL -jRT -vkc -oMN -xBd -sbV -gDn -ofl -pfv -sbV -tWo -uKD -bnO -khu -bZV -inH -dSQ -pNi -gsG -bVR -wUJ -yiv -llx -xad -xOp -eQb -wjS -rKP -dPO -rLc -hhb -fNu -niL -cjD -mRX -iKW -xfb -jOR -wEy -wCp -wCp -wWt -sFg -jCZ -wCp -ogb -veU -mPY -kMy -jEj -mbu -bVX -rLP -gKU -djf -hIa -cjI -ebi -kvu -jpJ -nmY -gfx -jJm -dYv -xuO -bok -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -khY -vZd -sDB -hsO -wbj -sqZ -cBD -kbY -kbY -eJW -kbY -kbY -kbY -kbY -kbY -eJW -kbY -rNF -kbY -kbY -vzJ -pub -caX -aeO -lwh -nCo -eWu -swM -aaa -aaa -keN -uKo -ddj -axI -nCL -gOv -nik -lIB -aaa -ksk -cTU -wHW -wHW -isp -hvO -aIQ -aIQ -lpt -mTp -bVF -vAY -vAY -bVF -bVF -bVF -bVF -eND -uTI -iRR -srK -uHx -uHx -uHx -iaB -nLg -vBb -eGZ -beX -qFb -aBg -gUg -upD -sbV -cyx -oMN -oMN -oMN -tED -lgw -oMN -vUY -cLT -uRq -cXH -nDl -slZ -wpX -mpm -sbV -npr -dcr -wQa -khu -bHV -fRb -jwA -vXL -jJq -uNP -biQ -oxQ -hks -pzK -pzK -ewz -pGd -llx -eoE -kTX -veC -brF -cwo -cxe -qoO -kTX -bLN -cvr -wEy -eNu -wCp -ooS -ngd -ljG -wCp -jIt -cEN -eun -cGJ -cHz -nKF -dTm -xsG -rCW -nqb -eHK -tNZ -giZ -nLb -jpJ -noE -pkk -noE -qWQ -kas -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -nXi -adh -swK -kIq -aaw -adr -kmA -kmA -rFV -kmA -kmA -hLH -kmA -kmA -dCK -dCK -dCK -dCK -xsq -adh -adr -pgX -afe -xvO -pPq -eHF -dJx -swM -aaa -aaa -auC -dnd -aog -auC -auC -auC -dSY -lIB -aaa -ksk -vis -mCi -ixT -dOo -ksk -aaa -aIQ -aHt -uwx -aIE -aMA -aMA -aNT -vJt -hIE -suE -sUm -uLI -uwx -vpX -xIm -etB -uHx -lrI -nUa -vBb -wrv -hef -lao -dCD -sQf -lCP -sbV -mhh -vVn -kjX -oMN -xls -lgw -mEX -sbV -sbV -sbV -sbV -sbV -wPd -dkn -mPM -sbV -eEw -dby -khu -khu -fKO -kTS -pNd -kTS -fKO -uNP -iHE -duA -qla -vsw -vsw -qeB -xJZ -mAI -uxv -sxv -fTk -cvp -xOQ -vTz -fBh -sxv -xRu -cvr -miQ -hSs -wCp -cFR -kvw -fpq -wCp -cDN -cEN -ael -cGK -fqq -nKF -dTm -lUU -gKU -tow -nIw -qXx -nre -dNk -fDW -gdK -gfx -noE -wVU -eJC -jYt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -nXi -urh -afM -dDU -ahw -anj -kmA -wTZ -fex -wTZ -kmA -gar -fBP -oGS -dCK -uUf -uWa -acq -aaw -adh -ads -adO -afe -ruT -dCK -dCK -dCK -swM -lMJ -lMJ -auC -auC -auC -auC -rUM -qpd -mHp -auC -aaf -ksk -ksk -ksk -ksk -ksk -ksk -lMJ -aIQ -kQx -wdQ -xAZ -wcs -hMn -ygR -lgg -ush -mPK -lgg -kWP -lgg -uLE -ckk -heS -uHx -dZs -lao -lEm -lao -lao -lao -jYe -ufN -bsJ -woy -sbV -sbV -sbV -pJv -tFG -cpC -pJv -sbV -buf -cVh -puA -sbV -sbV -sbV -sbV -ojh -bUY -pFP -fKO -bYR -pwf -fDe -rAm -ljV -doQ -uNP -muK -vHT -aNq -fem -xzZ -sXh -uFV -vHT -muK -sxv -cwn -nIa -wMh -cxg -lmS -sxv -dLT -cAW -esB -iMY -wCp -wCp -wCp -wCp -wCp -fmp -kta -cST -cGL -lbp -nKF -dTm -fLl -gKU -uSZ -jpJ -jpJ -jpJ -fxe -jpJ -uNi -gfx -noE -noE -noE -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -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 -nAu -pnQ -khY -khY -afU -nBD -alN -qjY -kmA -pVX -oeP -dlY -kmA -xsS -kyr -vRT -dCK -eIs -mzr -dCK -acE -adb -fos -htR -afe -xvO -hPi -eHF -dJx -swM -aaa -aaa -aaa -auC -apC -axI -kvt -auC -auC -auC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -brt -ofU -brt -agI -fgY -agI -brt -sUK -lSj -opJ -mPr -fqz -tPR -txo -vIe -gAj -dGK -cSa -cSa -lcq -cSa -pus -pus -elO -geB -vbo -xaN -pNv -ixz -cim -pNv -rSE -ddI -pNv -aSh -pNv -pNv -pNv -ixz -pNv -cRm -jOi -pNv -ggv -wva -fKO -bYS -xNz -iyv -whp -pjc -fuZ -uNP -uNP -uNP -bVR -gOC -bVR -klW -bVR -uNP -uNP -sxv -sxv -kTX -kTX -kTX -sxv -sxv -cNW -cAX -kCH -itv -itv -wsZ -nlp -seP -itv -ogb -ogb -jat -ogb -nKF -nKF -dTm -mDK -gKU -bWS -jpJ -kgD -llX -mWn -jpJ -noE -tTH -noE -noE -ooZ -noE -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -khY -khY -aiv -aom -aom -kmA -wiy -bNJ -jsA -kmA -hGm -oFQ -oGS -dCK -abD -iGJ -dCK -dQo -nkV -adt -alL -afe -aeO -lwh -nCo -omh -swM -lAu -lAu -rNE -auC -xLF -aRG -kvt -auC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -brt -pIp -lHv -dtM -rDn -aPL -brt -wWx -rQr -nnj -cmx -keE -oet -qkz -aZn -aWf -abC -aWf -aWf -lBC -aWf -aWf -aWf -uPa -kuY -bsL -tSS -dCH -bdP -baG -baG -geB -bEB -jng -bHW -baG -dCH -baG -bdP -baG -baG -baG -bTE -rOB -nbj -fKO -fKO -qAf -sUG -umn -rmj -buV -kTS -syz -oDH -ruw -rWs -tid -tUH -lXD -wlT -ryN -gDG -xRu -xRu -xRu -xRu -xRu -ozc -rXu -suX -ykr -oxE -vaD -vaD -mtn -vaD -vzg -cTM -hdw -phT -cqi -nKF -swh -dTm -uKu -gKU -gKU -dmB -quS -jpJ -jpJ -jpJ -gYu -ayK -wRh -iFn -yaW -dmB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -khY -khY -khY -khY -egx -egx -egx -egx -egx -egx -egx -egx -egx -egx -egx -egx -acI -adc -vVP -alL -afe -lEI -dCK -dCK -dCK -swM -nXi -nXi -khY -jeN -auC -auC -kvt -auC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -brt -cMd -nky -xzf -whl -jhL -brt -eSF -wpP -biC -kYK -vBX -oet -sjo -aWf -baH -evX -bqA -bqA -nKY -baQ -emv -eSL -lCL -bqA -bqA -bul -bqA -gnv -bGw -bqA -txY -bEC -bHX -bHX -mbN -bHX -lle -bOn -cTd -tPf -bHX -bTF -aWf -rBX -bhW -kTS -pAP -stc -iuj -iuj -dxa -nuZ -jQH -cCO -kOI -fnL -fnL -bWk -cqj -rcG -kkA -tyZ -cCO -cCO -cCO -cCO -cCO -xXu -cCO -cCO -cCO -iFX -iqt -cCO -cCO -cCO -cCO -eSh -dVL -pAf -dAp -qGT -fyh -oiE -atB -hvQ -gKU -jnX -uXo -qkk -fPu -wCP -fPu -hie -fPu -aDo -twK -dmB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -kHF -epU -ncN -rfU -mhc -aBw -etM -vWm -eII -iPm -egx -soe -adc -vVP -adR -afe -iEd -mGT -iYu -lmr -uzt -lmr -jNH -fgU -jeN -aol -lIB -dSY -auC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -brt -eff -cgk -kgp -hDR -vnD -brt -vDJ -bef -cbs -ebm -raQ -wmD -sjo -dCE -kjJ -jBt -caH -nfc -sEj -kgl -dyx -dyx -wPe -dyx -dyx -erK -dyx -dyx -dfr -pGW -eeW -bED -fwj -ldO -ldO -ldO -ldO -ldO -ldO -ldO -ldO -bTG -dCE -vKT -uHL -hNZ -pAP -dZM -pIo -cex -cfN -kTS -ibu -cvr -cca -cmt -cnB -vuI -jPR -crx -csv -esN -tfh -oJT -cca -cca -cca -cca -kTY -cBa -cca -cca -cca -cca -oHt -cca -cvr -uXT -cca -tfh -fTw -nKF -uRm -csR -cAi -wJS -gKU -dgP -twa -cmS -eFl -dpm -xkE -ayK -kQw -ohh -tiR -iBl -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -kHF -oMC -jsY -dNL -eNp -gcP -cYU -kbB -lAb -guj -egx -acI -add -vVP -alL -qqD -iad -nYo -iad -iad -raW -yes -mnI -wYi -jeN -aol -apD -iAg -auC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -vRu -vRu -vRu -vRu -vRu -vDD -vRu -vRu -vRu -vRu -vRu -vRu -vRu -vRu -eue -pkf -kjJ -jBt -oud -fng -lqn -oud -dyx -jVJ -iRg -prB -aBz -nvK -nNE -dyx -pAn -taS -var -bEG -ldO -lTM -dYb -psv -tLo -cCN -dYb -dYb -ldO -cED -aWf -vKT -dju -kTS -lbR -iCG -sme -nzs -jAu -fKO -mLq -cjN -clm -nnS -nnS -lFl -eFw -eFw -nnS -nnS -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -wDh -cvr -uXT -cca -itv -itv -nKF -nKF -nKF -nKF -wJS -gKU -mNm -twa -qis -gWb -qbL -gWb -hie -kQw -rAV -tiR -iBl -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -kHF -tiy -xqR -aaC -ubj -oHd -kWq -ugI -erB -lPk -egx -gge -lDT -adw -alL -sdF -iSu -iSu -iSu -iSu -htm -nXi -lGK -khY -jeN -jeN -jeN -tsw -jeN -lAu -lAu -aaa -lAu -aaa -lAu -xOF -lAu -aaa -gqd -jTI -qbA -qbA -qbA -hlz -qbA -aGk -qbA -hlz -qbA -qbA -qbA -oGB -niu -aWf -hPq -jBt -ccg -wrj -phF -eOl -dyx -dIJ -lwf -gzb -sEx -hyz -poI -qKi -bzL -bBA -var -ubw -knj -kwF -qjf -mXf -wjQ -uuv -wjQ -dLC -rGm -mIU -aWf -kUD -rxA -rxA -rxA -rrV -rxA -rxA -rxA -itv -rTW -bCF -ofu -nnS -skJ -ylE -mtB -rJt -atR -rIZ -wDh -vct -vct -eRj -xPs -iyq -wFO -crU -xPs -hhO -hhO -hhO -lsP -wDh -cvr -uXT -ctm -itv -wWa -cHF -tbv -cJt -nKF -aRk -mnH -sdP -coS -kXp -uXC -uXC -uXC -uXC -lUv -xrk -anw -iBl -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -nVL -aWl -aWl -aWl -egx -egx -egx -egx -egx -egx -teP -abc -eCe -egx -egx -egx -khY -khY -wTW -qmG -alR -iSu -xgW -jRA -iSu -jQp -eCE -jyZ -jnx -hwA -oQU -hGE -hWo -jnx -fYr -fYr -axf -fYr -lAu -gIV -aAV -gIV -rFP -vRu -oJC -ufr -gqd -ufr -ufr -ufr -ufr -ufr -ufr -ufr -gqd -ufr -ufr -mhU -aZa -tQE -jBt -hQW -qAu -wpc -pZq -dyx -ijj -gAY -qcp -fFD -hyz -qnZ -dyx -nUy -taS -mBh -bEG -xxr -uaN -jIg -dTr -rIL -bwN -avJ -ukk -rGm -mIU -aWf -puh -rxA -mew -mKp -pIq -ira -qbj -rxA -wPN -mjo -sMF -xSL -eFw -xFb -iXX -xaT -msZ -cuX -pvL -wDh -qZL -qPy -qZL -xPs -vHu -vHu -qZL -cmB -vHu -vHu -qUL -qUL -bRz -eHt -xFs -tpq -efk -ePn -hEd -pzV -fRx -weW -rkT -gKU -rgc -vBI -kKn -eFl -dpm -eFl -oho -kQw -rAV -tiR -iBl -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -khY -nih -rAT -egx -swl -fsi -uXP -egx -mqn -bHA -acL -nXi -adx -adh -sdF -iSu -ylC -kmR -gDF -vsS -aTA -iRC -vIn -jBV -obT -dqg -qzp -jnx -auZ -fYr -avk -fYr -lAu -rFP -jRo -eYX -gDV -lYI -nJi -tep -aaa -aaa -aaf -aaa -lAu -lAu -aaa -aaf -aaa -nfh -nkW -ppH -aWf -rxX -jBt -lwL -mEq -bsK -wzf -dyx -dyx -dyx -dyx -iKv -ihu -vDP -dyx -oTw -taS -var -bEG -pIm -uac -aUK -aUK -rtd -isn -uEx -xBF -rGm -mIU -aWf -puh -rxA -kMY -dJY -wHO -lPh -vWs -nLe -vnr -nht -gIN -sFC -eFw -vwU -bce -fKz -ibo -nNi -bBg -wDh -qZL -xPs -spE -spE -spE -wiz -iGH -xPs -eno -vHu -xhX -och -wDh -cca -jVR -pLe -itv -oJA -ett -aCl -fej -nKF -wJS -gKU -ilG -vBI -kKn -gWb -qbL -gWb -rcl -kQw -ohh -tiR -iBl -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -khY -uLA -mXI -egx -egx -egx -xmX -dQj -iJe -whg -aOI -fnv -hUJ -adh -sdF -gDF -qhK -jRA -gDF -nuJ -dPa -pOe -vIn -qFg -lmk -aHX -jKo -vIn -ufg -gDF -hMj -gDF -gDF -iSu -iSu -iSu -rFP -oBn -nJi -fil -lAu -aaa -kVb -kVb -uuX -uuX -kVb -kVb -lAu -ebe -uUA -nPg -aWf -fwY -jBt -jBt -fDv -jBt -jBt -rLB -bmr -dyx -fYx -wMU -hyz -jSr -dyx -pIr -taS -var -sEb -ldO -euj -rnX -uIg -fmg -rjh -dYb -gqA -ldO -vlV -aWf -puh -rxA -qtF -qFa -tlD -nNP -ceB -cRE -bEF -xRu -cvr -gIb -eFw -hvK -eKM -jFu -ycT -tqi -wDh -wDh -ntf -rJU -rJU -rJU -rJU -rJU -uuG -xPs -eEA -vHu -xsv -kNU -wDh -kny -eJA -lDs -itv -nKF -nKF -nKF -nKF -nKF -wJS -gKU -fRp -vBI -kKn -yaW -tcU -yaW -oho -xRa -jto -jiO -dmB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -khY -wCw -jXj -tjW -qqN -lsj -sdF -kmA -ace -acx -acM -nXi -hUJ -adh -nkk -gDF -gDF -agJ -gDF -aTA -aTA -edY -vIn -mJW -orQ -xYn -sUD -vIn -aws -awV -avZ -fga -aTA -uAt -aHp -wVZ -wzj -aDC -nJi -tep -aaa -kVb -kVb -wWd -pQG -kUq -dvk -kVb -aaa -nfh -puA -ppH -heJ -kzr -rLB -bdE -vVo -cnS -qti -wwK -bms -dyx -rFq -iCB -gDh -mpv -qKi -bzL -taS -var -wKK -ldO -fmg -fmg -fmg -fmg -fmg -fmg -fmg -xxr -bTK -aZa -pAA -rxA -rxA -rxA -upT -upT -upT -rxA -gLo -xRu -cdy -utU -nnS -nLu -wfY -lQh -lEk -rIM -wDh -qZL -qZL -rJU -mxb -scy -soh -rJU -rJU -rJU -xPs -cmB -xPs -pqs -pqs -eaB -jRX -eaB -eaB -nKF -leP -oiE -oiE -oiE -tnF -gKU -dmB -uIa -sxa -dmB -dmB -mYO -aDo -mHw -cQE -pcq -dmB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -cTV -lMJ -jue -khY -khY -khY -oLQ -oLQ -aNJ -hUJ -kmA -nXi -nXi -nXi -nXi -kSC -adh -sdF -xxX -afR -bOo -nIF -axj -iZq -pvq -alQ -apE -fnZ -apE -paF -eNg -aws -auU -ukl -ukl -qtU -tsX -aAY -wVZ -aDw -hHJ -pUE -tep -aaf -kVb -dPV -mph -mph -jHB -bTq -kVb -kVb -qXc -qXc -hbq -rMc -fDO -kuJ -rok -wtc -bhf -biX -bkB -bmt -dyx -hvA -idB -gDh -ctB -xTg -veJ -bBC -iAl -bEG -pgM -bQy -ozk -hXy -gSm -kuc -owV -wkD -pgM -cED -aWf -iJw -ndO -iQq -pMU -wXM -tAR -kJd -tWF -iqY -asc -cvr -gpJ -nnS -nnS -nnS -gnD -nnS -nnS -wDh -rhP -rJU -rJU -cxr -gol -gol -tec -lsv -rJU -kUQ -vBO -fDw -pqs -bNy -euP -hwh -gtK -kJt -nKF -iMW -gKU -gKU -gKU -csA -gKU -cMR -nDV -cLm -sZq -dmB -dmB -dmB -dmB -dmB -dmB -dmB -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -khY -tUy -khY -hOB -hUJ -hGA -cBo -rNn -uvf -qwP -qcF -aaw -sdF -aTA -rpQ -bOo -aTA -awp -awp -ukl -awp -awp -tqc -awp -ltB -apF -atM -auV -shy -bAc -gDF -aTA -aTA -iSu -hjl -aDC -nJi -tep -aaa -kVb -oOl -rxx -rjI -aPv -oWF -eQg -kVb -ktt -qXc -frL -aWf -tVi -rLB -xTB -peL -xTB -xTB -rLB -bmu -dyx -ooG -jsU -rQg -dxu -dyx -nnN -kpG -var -dDa -pgM -dug -pyr -ecm -gVP -esx -ben -jCW -sXS -mIU -aWf -bRx -xbc -fNz -gXE -ylA -vQF -ktm -pSk -npv -sEQ -tGB -nXC -iyk -kgH -ggh -qpH -rOr -gmR -qZL -qZL -ixG -cGF -vaw -vuf -vuf -tUR -xrt -rJU -kUQ -vHu -xsv -pqs -smE -obA -pol -wBl -gcg -oZy -gRO -gKU -lRn -pkO -iKr -mQS -cMS -nDV -cLm -jIK -hJX -eiR -mSp -cQJ -cQY -ttC -bji -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -keP -aaa -aaa -aaa -rec -abu -xBL -iPc -bun -hUJ -adh -adh -adh -adh -adh -sdF -hUJ -hUJ -deL -iHB -nmo -tPm -hsb -qje -cmJ -ezR -hle -tky -tky -tky -tky -tky -tky -vsE -aws -aTA -aEJ -fne -wVZ -wzj -aEK -hib -tep -aaa -kVb -dWf -nhP -aOc -aPw -ome -ome -wpJ -iUf -rPh -gic -hbp -kjJ -eBL -aaf -aaf -aaf -gXU -gXU -nrf -gXU -ioE -ioE -rMH -ioE -dyx -kpG -jBr -vrZ -qWo -fCy -gHw -yaX -gaa -xSi -xSi -xSi -sHs -lhK -mIU -bVc -bRx -bXN -vzN -nJm -wFZ -eXL -gnf -jKW -nQw -tkY -cfY -qrA -nQw -nQw -nQw -nQw -nQw -vtR -rJU -rJU -rJU -ekW -vWr -vWr -vWr -vWr -ksL -rJU -ucC -vHu -wuo -pqs -jlG -tYD -gYa -eHO -xXL -nKF -qQK -gKU -boG -cLm -fdK -cLm -cLm -nDV -cLm -cLm -cLm -cLm -cMf -cQK -mRU -mRU -mRU -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -khY -vxd -khY -lak -sdF -nJN -sdF -sEU -sdF -sdF -sdF -adh -dKN -iSu -ijY -iSu -iSu -gDF -gDF -gDF -nmk -gDF -boK -cgA -ktB -oxB -hDN -iSu -keY -ukl -kWl -iwH -cTY -wVZ -aDw -aDC -aSp -tep -aaa -kVb -bpu -wzH -iRO -aPv -iIQ -aRV -kVb -oGN -qXc -eNY -aWf -kjJ -eBL -aaf -aaf -aaf -hCU -iUG -wUr -dVE -rnT -ufR -sDL -sDL -saq -rSD -eMF -vrZ -aVO -qdW -gCX -wiu -aUC -kps -jDl -gzI -wkD -pgM -ngl -dCE -aYm -woT -fwk -ycL -naA -yfA -qnk -qSz -mVs -hqg -qGX -iZK -pFR -lKI -coT -xvY -nQw -vtR -rJU -nzJ -vuf -cMh -vWr -opd -vWr -vWr -piR -rJU -aFV -qUL -wuo -pqs -jXC -jXC -siG -kzp -gUH -nKF -bxZ -gKU -eMs -nDV -rqV -nDV -nDV -nDV -oqJ -cOT -cLm -eHy -dyX -cQL -cQY -cQK -rbJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -lMJ -jue -khY -khY -khY -khY -khY -sfJ -xdf -kmA -aci -kmA -jpf -adh -naq -adW -nXi -iSu -aaa -aaa -iSu -kSd -qmc -sjL -csl -wPz -wPz -qoA -wPz -xvj -wka -iSu -pHN -qpl -gDF -aTA -aTA -iSu -hjl -dCr -vdH -tep -aaf -kVb -dPV -jln -jln -xlU -qlH -kVb -kVb -qXc -qXc -sYV -dCE -kjJ -eBL -aaf -hCU -hCU -gXU -xUG -rrU -ryP -mML -bot -bnW -xNK -aoG -dMM -jrB -vrZ -bKf -pgM -pgM -saK -pgM -pgM -sGG -sGG -sGG -pgM -cFl -aWf -imr -bXN -maQ -xto -amv -blA -tMg -bRX -aYi -eHx -wmE -wmE -wmE -kUt -iOe -wnE -jFe -daV -rJU -vse -vWr -vWr -vWr -vmd -vWr -vWr -hvv -rJU -uuG -qUL -wuo -pqs -qif -wFB -txE -cCj -cFV -nKF -xmR -gKU -vml -eRZ -cLo -cLm -cLm -cLm -wxl -cLm -sDA -eHy -eoz -cQK -mRU -mRU -mRU -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nWF -aaa -khY -nXi -nXi -khY -cSG -kmA -acR -rOH -adC -nXi -nXi -lAu -aaa -aaa -iSu -fGA -tFA -bEv -fpX -qoA -uwg -apJ -lDe -ujk -tky -tky -vsE -aws -aTA -aEJ -sUE -wVZ -wzj -aHA -hNu -tep -aaa -kVb -kVb -qBQ -vrJ -iXa -gfs -kVb -aaa -nfh -cIb -ppH -nWn -kjJ -eBL -aaf -hCU -trP -uZU -ncw -jpn -cph -hyo -gnw -gnw -gnw -iNN -gnw -gXU -epz -aVO -gZz -aaf -aaf -eNk -kmj -sHe -fJr -xpk -eNk -bTG -aWf -imr -bXN -vzN -jOn -qLg -gcI -jTu -cfY -szx -coO -aoX -nEO -fuY -rTC -qmn -eeY -nQw -lOo -rJU -itM -lxr -lxr -lxr -nNk -icR -icR -iDs -rJU -vct -qUL -wQp -pqs -sUj -cCj -vDB -cCj -cFW -nKF -xwq -gKU -pZb -vaK -cLp -cLm -cMT -cMT -iAj -cMT -cMT -eHy -eoz -cQK -mRU -lAu -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lAu -lAu -khY -wiZ -khY -khY -khY -nXi -nXi -lMJ -lMJ -lMJ -lMJ -iSu -orW -njM -wXw -eBf -wPz -iRG -apJ -lDe -ujk -ahF -roE -fCM -hva -sTU -pDw -aBa -wVZ -aDw -aHA -qlt -tep -aaa -aaa -kVb -kVb -uuX -uuX -kVb -kVb -lAu -ebe -asg -uZd -aWf -kjJ -eBL -aaf -hCU -nIK -qYy -ryP -ryP -mML -gby -gnw -jfR -eWE -rrU -qKp -gXU -rYU -fBy -kgt -gZz -gZz -tZm -eMC -hfX -gMj -kHr -eDj -bTG -aWf -imr -bXQ -gqM -jyK -nQk -wki -fdE -mGG -nfq -lIz -nWg -xzJ -cXr -hrI -hUx -lhL -nQw -lqG -rJU -tBg -lxr -kAN -vxs -mBz -mBz -mRT -cwJ -bnK -qUL -qUL -vHu -pqs -vDg -mNW -cYz -cCj -dJr -nKF -cAi -gKU -vOe -nDV -cLq -dMw -vml -cNN -vml -cOW -vml -dgr -eoz -cQM -mRU -lAu -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -aox -aox -aaa -aaa -lAu -lAu -lMJ -aaa -aaa -aaa -wPz -wPz -wPz -wPz -wPz -wPz -hBR -riY -wPz -kYP -ahI -gbH -efj -sFY -gbH -sFY -sFY -gbH -lxj -aHA -clF -fil -lAu -aaa -aaf -aaa -lAu -lAu -aaa -aaf -lAu -nfh -rYZ -wVJ -wsE -oWL -eBL -aaf -hCU -yly -vhF -bnW -cph -aVa -rOb -gnw -gnw -dFr -rfy -vjs -adz -xjF -aVO -xdS -bGG -bJO -eNk -ocA -maG -cJY -lAF -vqo -quu -jbJ -dyK -bXN -gqM -mrZ -qft -qft -uFe -bRX -ctW -vXs -jdZ -huT -nQw -aau -pfn -aau -nQw -vtR -rJU -tac -euZ -sDQ -wzx -rJU -rJJ -rJJ -rJU -rJU -wCm -wCm -xRF -eaB -eaB -jFJ -nua -cCj -vGs -nKF -jDn -gKU -eGg -nDV -cLr -cLm -jIK -jIK -tHb -jIK -jIK -eHy -eoz -cQK -mRU -lAu -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -wPz -xCo -dAr -rRf -cuY -tgy -agc -apM -wPz -aOo -uRX -gbH -edt -vRZ -joJ -aFR -whs -gbH -aDw -aHA -bVp -tep -fil -tep -tep -tep -tep -tep -tep -tep -fil -emY -aWd -pvJ -gWP -kjJ -eBL -aaf -gXU -xfU -bnW -xBB -xyY -vnG -wEV -qWi -gnw -uUZ -rfy -njk -wqL -aUs -fVn -bGH -rtw -bJO -tZm -imx -fHS -fWT -jFc -tZm -rvo -bVf -kZM -hZv -ybt -fNz -bwU -bwU -vzN -nQw -bRX -nQw -bRX -nQw -nQw -bgR -eLy -eLy -nQw -iuf -aDl -rJU -oRW -rJJ -fkH -aDl -cCl -qGt -wCm -aGd -aGd -wCm -epb -cFY -eaB -eaB -eaB -icO -eaB -nKF -hWs -plP -vml -iYM -cLr -cLm -cLm -cLm -wxl -cLm -cLm -eHy -eoz -cQK -mRU -mRU -mRU -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jLw -aaa -aaa -cTk -wPz -ktY -tJE -kVU -tJE -kVU -tJE -fzi -wTp -jAb -ahI -sFY -awf -aDE -oTM -llf -pvK -xvX -aDw -cue -tdk -dgy -aFZ -dgy -tuT -kvD -dgy -dqF -dgy -dgy -aFZ -cDh -ssj -lBO -dxD -kjJ -eBL -aaf -hCU -qlC -vhF -bnW -oQl -bnW -vjs -vYX -gnw -bnW -eKE -hza -wqL -aUs -rHY -bGI -bGH -bJP -tZm -uGZ -maG -mTW -rxh -eNk -bTQ -bVg -ehx -fLk -cXY -lRE -lRE -lRE -lRE -dUw -nsv -nsv -nsv -iJG -cwd -lKW -lKW -lKW -olN -tCO -vHG -pPB -tUq -rwm -hnz -ojb -sWW -lkU -aHq -sWW -sWW -rjl -xKO -nDm -lyP -nsv -nsv -nsv -pLB -lmH -mEx -eDa -uAl -nDV -pod -nDV -hDV -nDV -nDV -nDV -lHL -eHy -yjT -qPc -cua -cQK -rbJ -cYJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -wPz -wPz -eau -akE -alW -akE -alW -akE -wsq -reV -cxI -mEL -hDP -dUg -sei -ojY -aBb -eAS -aDw -aHA -uqf -aHA -aIJ -cue -aHA -dCr -aHA -aPz -cue -aRW -aHA -aUD -aWf -hSK -djB -baS -eBL -aaf -hCU -orI -ihb -vnw -xyY -fzC -lnQ -uvZ -wiH -lnt -uUD -gns -wqL -fYq -xGd -nMV -iIf -mfi -ucj -maG -maG -fEL -xWA -eNk -jxY -bVh -rxC -aWf -bZg -car -car -sVa -kao -car -car -car -hAV -car -car -cFb -car -car -car -kao -ctF -car -car -car -car -car -sVa -krR -car -car -car -car -cFb -car -hGR -car -car -car -car -car -car -cIF -cJF -cLr -vGL -cMi -cLr -cLr -pod -cLm -cLm -cLm -eoz -cQO -mRU -mRU -mRU -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -lAu -aaa -aaa -wPz -wzF -sDw -eew -hxF -daO -eRk -qoA -wyh -ahI -sFY -awg -axh -aBS -mDQ -dmU -wZf -aDw -aHA -wGX -wGX -nQp -wGX -wGX -wGX -wGX -cfu -lpV -wGX -wGX -hrq -hlv -jia -aZk -baT -eBL -aaf -hCU -guV -vhF -bnW -xyY -reo -vjs -kwq -gnw -bnW -qgH -raZ -wqL -aUs -rGo -imz -bGH -xub -tZm -eqO -sHe -fRN -mJk -eNk -tOA -bJU -aHk -wGZ -ciD -hfT -vhK -cdI -cdI -gCj -cdI -cdI -jHu -qDI -tJe -cdI -mTA -mTA -mTA -kIY -ctG -ubO -hBb -gET -cxB -dwo -cyo -lRj -cyo -fsw -mTA -mTA -wWf -cyo -mJB -cyo -cyo -gET -cyo -cyo -hBb -cIG -cJG -ePq -fLn -aBG -cLm -cMT -pod -cPa -cPu -kWE -eoz -cQP -cQY -klR -rbJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -vbm -pVd -ped -ped -pVd -pVd -wPz -qoA -qoA -wPz -wPz -wPz -wPz -wPz -dZo -ahI -gbH -deH -sFY -gbH -sFY -sFY -gbH -aDB -aHA -wGX -fEw -aQg -nhM -aQg -aQg -aQg -aQg -aQg -uyh -utZ -hoh -aWh -gWe -aZl -xmy -eBL -aaf -gXU -pME -bnW -bnW -xyY -dzU -cGR -sqj -gnw -rWE -mml -shN -wqL -aUs -fVn -bGH -bGH -bJP -tZm -pSg -doK -gMj -qIv -tZm -kmP -bVj -wRu -fUR -xFW -lbU -nRe -vss -evU -stJ -stJ -stJ -mFq -stJ -stJ -pvl -ibj -vNi -vNi -mZV -mZV -mZV -mZV -mZV -mZV -mZV -dmf -eos -nKL -kPJ -oro -vNi -cZC -cZC -cZC -cZC -cZC -cZC -iJB -dPs -dPs -oum -dPs -dPs -xhy -dPs -jaC -dsw -hEl -vml -mRU -vml -mRU -vml -mRU -mRU -mRU -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -pVd -pVd -rsg -ggm -jqI -pVd -uiH -lxO -oKM -dxP -dqv -qia -bIL -ped -jAb -atS -rvM -awi -axj -kcG -aBd -ece -cFI -aHF -aET -wGX -aQg -tSf -iZa -iZa -tpy -tAq -gZk -aQG -ipx -aTl -aQg -kNN -hxw -aZm -bAj -eBL -aaf -hCU -xEj -vhF -xBB -tOi -cZD -eXW -gnw -gnw -euh -mml -vjs -adz -vrZ -mjR -fAq -bIk -bJP -eNk -xHA -pGf -qUy -sbY -uGN -ejO -lyl -suY -mVi -hru -rMU -axo -wQM -gJw -stJ -eiK -eQm -oMJ -nZi -vmV -mZV -sui -pPW -sui -mZV -gXP -rMT -aAR -rMT -wEt -mLr -nGN -wkx -qZu -kPJ -ecV -hPH -cZC -cUs -lCB -hFZ -dJh -sRB -dPs -iPk -wOJ -kkO -kvN -dPs -fVp -dPs -sko -xLO -jiG -vml -lMJ -lMJ -lAu -lAu -lAu -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aav -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aav -aaa -aaa -aaa -aaa -aaa -rrt -lAu -ped -rAX -jmO -mIB -tpX -kRn -tpX -tpX -tpX -tpX -tpX -tpX -vrS -fJv -ujk -aiB -apF -awj -aws -eFR -azK -aBe -smi -aDD -aDC -wGX -aQg -aIM -aIR -aIR -ngu -tSi -gZk -aQH -aQH -ocV -aQg -qcE -imr -aWf -baT -eBL -aaf -hCU -wtj -njH -ryP -ryP -mML -sMh -gnw -jfR -wdU -glV -mds -gXU -wxX -lZp -kgt -gZz -gZz -tZm -jLE -sHe -soZ -hCW -eDj -bUb -aWf -imr -bXV -hru -qaL -les -tlf -bhE -lfN -vqC -wxo -jkE -rNN -rrJ -uIy -kfa -bst -qCl -oFB -rxy -poD -hbC -brM -ime -uIy -wSV -wSV -wSV -kPJ -wMu -wnF -mEU -tMp -mdU -elC -lLC -sRB -dPs -smR -bOt -kkO -bfQ -dPs -wOe -dPs -biL -ttu -gha -dsw -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -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 -rrt -lMJ -pVd -pVd -tAC -fjK -fBf -pVd -wma -fiZ -ebX -mqP -bYZ -bXU -gPM -ped -hEr -vJv -tky -kIr -ukl -tje -nZT -wEk -ood -dHE -gSN -wCX -aQg -enR -acu -vzC -oZA -dHb -gZk -aQH -aQH -qFD -aQg -sSq -uGo -aWf -baT -eBL -aaf -hCU -awo -lzb -kIC -kde -tOi -cZD -gnw -gnw -gnw -bFV -gnw -gXU -sxp -mjR -gZz -aaf -aaf -eNk -liq -trs -oNq -wVY -eNk -bUb -aWf -imr -bXV -rbD -daJ -szA -jaN -bhE -lfN -vqC -hBa -nbp -fWV -ueF -gkT -kRP -mDh -hnw -tKF -lMy -iia -rog -nIP -kvj -uIy -vUI -oVk -fYf -bFY -reQ -etG -jFa -boA -iwK -elC -qFH -pDc -iJB -dPs -dPs -dPs -uug -dPs -ibD -dPs -iXV -cNR -uBt -dsw -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -pVd -ped -ped -pVd -pVd -pVd -pVd -ped -miH -kAy -ped -kAy -qwb -yfo -qwb -txe -awl -axm -neY -cHj -cHj -neY -neY -neY -neY -vxI -njn -fyv -aIR -aIR -vHM -gZk -aQH -aQH -abU -aQg -aQg -uGo -nWn -baT -eBL -aaf -hCU -hCU -gXU -ccM -glV -ryP -mML -cQl -aFw -tjS -pyS -pYh -xsr -xjF -dHW -qGj -qGj -lDa -qGj -cZs -cZs -cZs -cZs -qGj -fEb -aWf -xeD -bXV -inX -wQM -qtY -jaN -bhE -lfN -qrp -ctJ -qBH -euC -jdN -uIy -iSA -rzE -hnw -mJx -ffE -qaV -jTp -cEU -dDl -rtQ -rzQ -oyA -ron -tsC -qDU -nGm -gkX -jOp -gPL -caV -dLK -mCY -lcN -ahP -ibD -ibD -ibD -ibD -ibD -dPs -ssP -voy -wgz -vml -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -uKA -jaT -vgj -sxT -dWd -gBo -khj -khj -uPf -gTW -khj -kyW -qwb -tZX -qwb -pTA -ohg -aws -cHj -tCj -xlK -uLw -neY -uuE -bAd -vxI -qzq -oux -aLB -rti -tvB -lqA -mGU -vFp -mGU -aUG -aQg -uGo -jqC -baT -eBL -aaf -aaf -aaf -hCU -rwK -aTG -hpm -jiA -pTG -gJg -scf -kPG -kPG -nbh -aov -mjR -rxE -grN -iMl -lYt -iCZ -mjS -ovV -acn -qGj -mYR -aWf -uZd -wtU -fSv -puS -szA -jaN -nJo -stJ -jKu -qNl -iOF -pYJ -ugo -uIy -jmD -eky -vkL -orX -aMl -fab -dDl -fab -sYk -bgF -wKM -ipr -eCx -bFY -qQv -fFl -lpd -vAP -eIZ -fFl -nZO -vfL -iJB -ibD -dPs -dPs -dPs -dPs -ibD -dPs -dPs -dPs -dPs -dPs -anS -anS -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -mXe -lAI -bAr -pNN -qgq -fKe -vDK -vDW -oaZ -wzB -ade -wfc -mkH -cpe -yfo -jAb -awh -aws -cHj -aWz -lwA -plN -neY -uAk -bAd -vxI -hTs -hRm -dCq -aIR -tvB -gZk -aQH -aQH -hTM -aUH -utZ -uGo -aZn -baT -eBL -aaf -aaf -aaf -gXU -gXU -gXU -msj -nDM -gXU -jjM -jjM -pJU -jjM -lZo -xjF -gxT -aFC -uWW -rcK -uRW -uRW -uRW -kLb -fiJ -qGj -inF -bVm -imr -bXV -evU -uFW -nvm -rEL -xcA -stJ -cfn -cfn -cfn -cfn -cfn -uIy -uIy -uPW -uIy -uIy -hkW -jfS -qaV -dDl -jJT -uIy -qmv -ipr -bWz -cZC -cZC -cZC -cZC -cZC -cZC -cZC -cZC -cZC -iJB -ibD -dPs -eLK -fRD -uug -ibD -scc -lMh -tsK -pdq -pJx -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -uKA -jnd -tAd -nnO -wSI -qwb -tJi -mEl -iGC -ybg -dgQ -eEv -sOb -wMK -oFf -sBq -bMZ -ukl -hIN -vUo -arP -bzM -nKz -uAk -uAk -vxI -aIR -vIA -jJP -bML -fIA -gZk -aQH -aQH -mGU -cTh -eWz -jzH -aWf -qHa -jjM -jjM -jjM -jjM -jjM -vir -jjM -jjM -jjM -jjM -rYg -hkN -pyT -grF -jjM -xjF -mjR -qGj -cwB -kxY -eNc -tZi -ezP -bTA -lJp -qGj -tyh -dCE -imr -bXV -lbU -pjG -wnx -ofT -bPb -xTe -qGz -qGz -qGz -rMn -qGz -xTe -oiO -rfj -fMK -mbI -kXd -wtJ -wtJ -mBU -gJS -uIy -cFy -ipr -cHo -fhn -evR -hTS -rwO -kDc -lgD -vEV -fjw -aWn -egU -qmW -dPs -ngk -kkO -dPs -kkO -aEk -mZm -dPs -dPs -dPs -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -uKA -fvc -kZS -opc -wSI -jLR -ebb -cpe -cpe -cpe -pGc -kdp -aJU -cpe -tkS -soq -awp -aws -cHj -tCj -ewJ -oCL -neY -sMH -uAk -ofB -aIS -lxh -aIR -yiX -wKZ -gZk -aQH -aQH -aIT -tru -aQg -sLX -dCE -baV -jjM -qQo -fhe -fOi -tvz -ekb -tvz -uyC -doZ -yaa -plZ -iqp -pVz -iqp -mee -xjF -nCq -qGj -aCM -xSz -jwV -cPt -vWe -dHA -heK -qGj -rgI -jqC -ktQ -xTM -evU -ixe -wQM -uVp -kXR -hvN -ccd -fmX -ccd -fJL -ccd -hvN -woM -ipr -prk -sGU -vfl -hae -fkK -uCb -mtF -sGU -uSS -ipr -tdx -qei -wgY -odJ -eAm -efz -hlP -hlP -hlP -edZ -iJB -kKe -dPs -gSf -cXd -dPs -kkO -sps -kkO -dPs -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -uKA -fPj -ahc -jkv -wSI -jLR -ebb -kyN -uEZ -cpe -cpb -kdp -aJU -pRC -yfo -vbt -awp -axr -cHj -tCj -ufJ -jxO -kul -kul -kul -aQg -aIT -xcw -aIR -aIR -mIe -gZk -aQJ -aIT -aIT -qxb -aQg -uGo -aWf -vAi -jjM -xdI -xWt -omY -tvz -rRh -tvz -jgU -iat -rgj -dya -agj -dpw -gWx -jjM -dSi -els -qGj -qGj -lDa -lDa -qGj -lDa -nlm -lDa -qGj -fLN -aZa -gRy -waJ -hru -nNc -hbG -hbG -bba -ubD -mqU -fCb -lPK -cxW -shH -kke -dIj -ipr -fSf -uIy -keG -awU -emr -wpb -bkP -uIy -ddz -ipr -ptE -fhn -sQG -lPV -eEK -swS -tUz -nrI -jnH -iRM -iJB -dLV -dPs -dPs -dPs -dPs -dPs -dPs -dPs -dPs -lMJ -tPH -anS -nRb -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aav -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lMJ -uKA -fPj -ahc -jkv -wSI -jLR -ebb -lyV -rHN -kai -cpe -jEz -eCu -qwb -qwb -sWj -awp -hqv -jxO -jxO -jxO -jxO -dER -aFa -kKH -aQg -aQg -aQg -aQg -aMQ -aQg -aQg -aQg -aRX -utZ -aQg -aQg -iON -aZa -ltn -jjM -ylr -gWx -mcQ -tvz -mjV -tvz -hCN -eOi -kLo -pzh -qpG -krt -dtG -jjM -xjF -mjR -lFz -qGj -jXG -xkm -rGz -cOf -kuB -jRm -dnn -bTI -aWf -ktQ -nkW -tnf -seH -wrD -seH -seH -tnf -mZf -mZf -mZf -mZf -mZf -mZf -qnF -ipr -aFJ -uIy -sGU -sGU -uIy -uIy -uIy -uIy -cOd -ipr -eyW -aZP -oIu -qZN -eqN -gzx -hRN -tgJ -thg -mUB -iJB -rqP -adE -dPs -rmm -bLu -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aav -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lAu -dWd -fPj -vAx -jkv -wSI -jLR -ebb -viX -dYn -cpe -oin -uVI -wow -pmh -rXh -paj -awq -aHE -lCX -sWD -voB -aCt -aDJ -aEZ -aGu -psj -esm -iPY -eti -foq -ryh -psj -sFx -oQr -htW -oQr -ghS -uGo -aZp -xmy -jjM -vpd -wEl -fxE -tEI -qsG -nAm -qsG -dma -ftX -fxE -qPQ -idt -kBm -jjM -xqZ -cKh -ixp -qGj -toQ -mKx -iIo -fRE -paP -jRm -dnn -bTI -aWf -ktQ -puA -tnf -tLz -qUi -spA -xGZ -rhb -rPd -iEc -uuT -ygP -rPd -juP -xpf -ipr -kNa -eVT -eVT -sBb -fRB -fcF -uGS -aFB -jWa -ipr -eyW -jed -wIK -gmC -eqN -tFQ -cnJ -njy -ftO -xIX -iJB -kqO -adE -slV -kkO -kkO -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -uKA -evO -ikq -fcw -wSI -qwb -rJg -cpe -cpe -cpe -qgo -kdp -dtO -yau -rXh -ukj -oBA -cfK -fZq -udR -udR -udR -guy -aFa -pOs -psj -ucW -mKT -aGw -iaO -osJ -aPQ -lDp -yeN -lIr -yeN -oqa -jzH -aWf -cSI -jjM -dAL -gWx -nlK -lew -hIU -tvz -etd -sCs -uEo -wRU -tvh -tGO -yeX -jjM -ndn -mjR -fXD -qGj -rGz -xkm -jXG -rrx -bDt -iLM -dnn -bTI -aWf -ktQ -puA -tnf -jhs -iKe -rdm -kzK -rXo -rhj -clc -mmq -ptF -clc -cWF -ukY -ipr -ipr -ipr -ipr -ymb -uUK -iko -eFV -lGF -mUS -iyu -fEn -jed -ukD -uNE -heZ -juM -tUN -fhn -ppN -ppN -iJB -oFb -jyz -oLP -fJH -dcJ -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -vbm -uKA -dWd -uKA -dWd -uKA -vqB -vlx -vIZ -kRS -gDo -lfM -dDr -hqL -qwb -qwb -aws -wTM -axu -lCX -azT -aBn -aCv -fqg -whB -whB -whB -mkw -spo -npV -jPY -tGH -qrf -iiI -dED -xtn -xtn -qsW -uGo -jqC -qHa -jjM -rLz -vBf -oyP -eTp -hIU -tvz -tvz -jjM -jjM -jjM -fhb -jjM -jjM -jjM -xjF -miR -qGj -qGj -qGj -qGj -qGj -qGj -riq -qGj -rxE -bTJ -aWf -eGA -vMe -tnf -hvy -oCZ -prS -xRv -djS -gAZ -uuT -vLB -iDJ -tpY -mZf -mOs -clH -fno -vBq -vrm -fTO -lEA -kuz -jvx -iLf -xUf -joB -mWI -fhn -mXa -njs -iUd -hwn -hwn -cdJ -iSy -iSy -iJB -nYA -dPs -dPs -dPs -dPs -dPs -lMJ -lMJ -aaa -lMJ -anS -anS -tPH -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -lAu -lAu -yfo -ftE -iKy -qCx -bAu -mGw -qiP -nGx -lgQ -mad -yfo -sig -ezR -nbu -jxO -azU -aBo -aCw -gBh -kBS -kcr -whB -jQE -tiQ -nyp -tiQ -hez -aPQ -iiI -qCf -hCS -bLv -ghS -uGo -aWf -baT -jjM -wtH -icH -sFk -hFK -dYt -tvz -mZh -jjM -ljN -dKZ -dsM -bGy -sPb -eyT -aov -mjR -bGT -bIq -bKb -pGM -tpd -bON -vVo -nrr -fGD -mWG -rMc -edp -isJ -tzi -tzi -tzi -tzi -tzi -tzi -pUy -rPd -hyu -tQZ -rPm -mZf -hvF -clT -oYG -oYG -hvF -kke -kke -vxF -jvx -cZP -lbj -joB -hSZ -jed -vgY -uox -gAo -lim -pOT -lim -myb -gWs -iJB -fVp -ddy -lHb -dPs -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -slL -slL -ggc -slL -slL -qNo -igs -iLJ -vBS -kwV -vuS -nyG -pQi -fCD -dXn -iSu -xcZ -iSu -jxO -oNc -nWB -xbN -aDN -whB -led -oBX -nXS -iky -sOr -eZk -vXF -psj -irv -qCf -tEQ -qcu -fuj -uGo -aWf -ejW -jjM -jjM -jjM -jjM -jjM -jjM -jjM -jjM -jjM -oVM -kvR -kvR -kvR -kvR -rXU -tHP -lLv -qAp -rLB -rLB -rLB -rLB -rLB -rLB -rLB -rLB -bUb -aWf -qAs -xPM -xrQ -gmZ -wGH -wnY -tur -obi -voK -rPd -vCn -ocv -iUN -tPA -cHg -esw -efD -oiC -oqy -ton -qwj -aVe -suh -eIk -hMa -mDG -iVt -jed -dbG -tUz -wZN -qhS -nSp -mBC -dAc -ffX -iJB -ibD -wmY -nCU -dPs -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lMJ -slL -ruM -tKT -atv -slL -rXD -slL -aFA -xYS -dXn -gHH -dXn -gmH -dXn -dXn -cLH -wdF -djw -whB -whB -whB -whB -whB -whB -skl -whB -whB -whB -psj -psj -psj -psj -wip -ghS -cnj -qcu -alj -uGo -aWf -baT -bcl -bdO -uBO -bcl -xir -mVp -nzd -fcY -oSI -hiz -wap -fZM -hJO -qLV -xES -hLt -clM -mva -tQs -mva -voM -xDK -cMK -mva -fxs -pNO -bUb -aWf -xVS -jMi -jMi -jMi -jMi -jMi -sWC -tzi -rGa -uuT -sFm -iUN -hJJ -tPA -pIn -esw -xDn -kWh -cos -ton -qwj -tav -dvC -hSZ -oRD -wMR -pSF -jed -aWu -him -nXE -gaV -qgC -qlZ -snw -gWs -iJB -ibD -ddy -cBl -wBG -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aav -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lAu -arf -xZh -xzE -idU -rmB -lwJ -slL -eDz -jYU -hyE -oSb -hyE -tsl -fna -owq -djw -hgy -xai -whB -azW -ipn -ipn -ipn -ipn -wFd -ipn -ipn -jrW -mRz -fAz -vTR -qfR -iiI -qCf -tEQ -qcu -ciw -uGo -sPc -gsF -dCE -aZa -aWf -hgo -aWf -bkR -aWf -abC -brb -uje -aWf -aWf -aWf -ygB -bBR -uZd -ddV -jqC -aZa -aWf -sPc -aWf -aWf -aWf -iuX -aWf -aWf -bVo -iji -dkh -wCU -oZh -ccp -jMi -aHN -erZ -cRI -uuT -jOK -lrP -ndG -tPA -hyg -qJy -joX -vCF -aua -kke -kke -cNY -vqz -jjQ -qbV -qbV -qbV -qbV -hus -gwk -cAH -iJB -deZ -iJB -iSy -iSy -iJB -ibD -dPs -dPs -dPs -dPs -dPs -lMJ -aaa -lMJ -lMJ -anS -tPH -anS -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aav -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lAu -arf -heh -uVN -mcV -qTm -rmu -lCS -etC -iuF -xyl -sQj -whB -jvt -pLc -owq -djw -kAP -xHI -whB -azX -kcr -whB -whB -whB -whB -whB -whB -whB -xwu -pkI -yeN -yeN -pne -yeN -rLI -qcu -kGI -pyn -lEt -nMa -lQn -hXj -lbP -hJu -uZd -hoF -niS -mdR -tcv -vrk -shZ -obO -obO -tcv -tcv -jXw -iLE -toy -rWy -qqq -hwD -eFu -eFu -rif -eFn -jqz -kpj -wyF -vmT -pwd -cIh -cIh -msS -jMi -sWC -tzi -mZf -dIq -ruW -ruW -ruW -mZf -snl -fgL -mkK -uGJ -jpP -ton -dsa -arS -lAs -rVU -qbV -dwv -mAW -bOF -ofK -cnV -tyU -dPs -eIK -dPs -gyl -gyl -iJB -ibD -dPs -eJw -pqd -pmG -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lAu -arf -dnL -sdc -niJ -bvp -xoP -slL -stH -tfJ -hyE -yhS -whB -vbh -pLc -owq -djw -xzM -qjo -whB -pDX -kcr -whB -wMT -goR -euf -goR -iBZ -goR -ail -tzh -qCf -pRW -pne -iDA -nQe -tdK -dxF -tdK -tdK -hKA -hKA -hKA -jeY -dnA -lID -aqV -ish -nLR -gEz -gEz -nrp -imI -gEz -gEz -efb -efb -qXR -efb -efb -efb -efb -efb -efb -prX -kIw -jZS -iUU -yeD -yeD -dkh -bZs -cIh -ccr -jMi -myC -tzi -hzH -hfg -awD -cXm -tbP -wkG -wkG -wkG -wkG -wkG -wkG -dqk -dqk -aXb -ipr -wdp -qbV -kEV -gZu -thN -aUW -aUW -gbE -jIS -ahP -mbj -ibD -ibD -ibD -ibD -pNc -kkO -kkO -kkO -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lMJ -slL -rqq -tMV -xVg -gSo -rby -hyE -hyE -hyE -hyE -yhS -whB -nAM -jXp -mGs -tgk -kTF -xmG -whB -mFR -nMJ -whB -kKj -goR -gBi -goR -qxK -goR -sUq -tzh -pRW -sZR -pne -qCf -bWb -tdK -meJ -kMz -tdK -wUC -qZi -ktN -hKA -pZj -bjw -tFU -qYs -lyn -fpp -fAJ -dPS -cdR -uQY -kLt -fGt -cjn -exS -tZf -nFR -efb -kvC -iVc -efb -aBT -lYr -eiW -kGT -dLj -bjb -mol -kGT -xjY -kGT -jMi -sWC -tzi -kcX -hCp -iPj -eCd -brK -fWp -jcL -hUy -grr -boB -sAI -hAA -fWp -aXb -ipr -eSf -qbV -jcD -dww -bOF -ktU -ofF -wUi -dPs -scc -scc -scc -wmY -uJy -eUh -dPs -mff -kkO -dFn -dPs -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -slL -lib -kqR -xQG -dZq -hyE -hyE -ala -kBj -whB -mAu -whB -whB -whB -whB -whB -whB -whB -whB -riR -jVO -mHI -uqv -cbk -hqf -ogX -ncP -eEk -oQr -tzh -sFL -iTk -ajN -hWi -fic -tdK -tdK -tcf -tdK -sTt -bSU -oGM -iRz -dLf -bjw -tFU -nLR -kjK -lbd -ufu -cHp -gxQ -nru -fyU -upo -ker -tmA -kgr -fWk -tFe -etx -aVo -efb -xZQ -pIy -eiW -iBF -sUJ -gyh -mLt -eUy -mTU -plr -jMi -qDO -xjl -ifr -gGP -qoE -oas -pSm -nGw -myM -wEH -fxK -fxK -hFJ -fxK -fWp -eWM -ipr -gVE -qbV -jcD -qbV -qbV -hus -wrL -scO -iJB -iJB -iJB -iJB -iJB -rhB -iJB -iJB -iJB -iJB -dPs -dPs -lMJ -lMJ -lMJ -lMJ -nRb -anS -tPH -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -slL -arf -hyE -hyE -hyE -hyE -byo -alb -aje -whB -hmM -ipn -ipn -fvp -ipn -ipn -ipn -ipn -ipn -kDL -rSy -whB -xKG -rtV -ulD -vca -mob -eEk -vGb -xnC -xtn -vvq -mwG -qCf -tEQ -kGz -tdK -gXL -aTC -bxa -aPI -hyp -xlh -tDL -bjw -tFU -gEz -pBW -mnK -ndd -fAJ -twU -fAJ -mnX -lde -wiX -kxo -hLQ -kBD -efb -iRn -qOk -efb -pxY -unB -eiW -doO -lic -ugi -ugi -ugi -vSi -seG -coC -lkF -tzi -yjC -lGi -kpc -xAx -xev -fWp -oLk -kYe -oDo -fkF -dak -pur -eLC -vcQ -ipr -ryS -qbV -jcD -qbV -vep -uhI -mLw -mgc -ppA -vaJ -xvs -eqC -lci -jnU -npa -gVL -jyd -llM -lAu -lMJ -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -whB -ahd -xsu -aje -aje -alc -aje -whB -tvt -whB -whB -gyB -whB -whB -whB -whB -whB -whB -whB -whB -xKG -yij -goR -goR -goR -goR -mQR -xnC -pne -huz -tbo -uxz -tEQ -kCF -tdK -jMv -tdK -hOV -czL -erT -iRz -tDL -bjw -tFU -gEz -jRR -iSY -xjg -uQY -atk -iqP -mnX -lzu -tVh -vOz -jnW -xZT -efb -eQn -uaG -efb -bBs -ecf -eiW -fUV -ppK -xyN -xyN -xyN -pXx -wjL -jMi -sWC -tzi -vQQ -fiB -loR -kJS -dCg -fWp -eKH -xZc -xes -wdn -oRn -gUB -fWp -sGS -ipr -cYS -qbV -jcD -qbV -xsn -ybT -uCj -tgb -lsU -aCR -uOl -exL -jDE -jDE -wIS -peh -bCg -llM -lAu -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aav -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -whB -ahe -gSY -aje -ajP -hMH -qcb -gyB -gYt -whB -ary -gxC -aje -gSY -tbQ -whB -xyO -mot -iTF -goR -rpK -xOr -byH -dTc -fTb -goR -dSo -xnC -mwG -qCf -sZR -pRW -tEQ -goE -tdK -lIV -tdK -cgg -glK -tad -hKA -tfM -bjw -nVM -oSx -wuh -fAJ -fAJ -qpS -taP -taP -mnX -pnY -dQI -hSw -sdp -pGz -efb -vYb -feI -pPA -nKl -pVE -qyx -wPR -yaL -ydo -iKa -iKa -pXx -ntC -jMi -mWt -tzi -fXC -dFB -sZl -pXI -fen -dqk -gTZ -pUT -acZ -cmU -rjs -kYf -dqk -mqF -ipr -lJL -uPJ -kiY -qbV -hWc -bEE -ygE -yid -yid -aZO -lOW -ecE -lET -pUH -pdM -jKn -bHO -mLI -lAu -lMJ -aaa -aaa -aaa -aaa -lMJ -vFb -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -hRM -pse -hRM -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 -aav -aaa -aaa -aaa -aaa -aaa -aWl -lMJ -lMJ -lMJ -czM -czM -whB -whB -seR -xRw -aje -ale -gSY -whB -kcr -whB -arz -izW -aub -aje -ahd -whB -dsX -oVG -iMh -lks -mGe -oOj -ftq -goR -goR -goR -utC -jKz -pne -sFL -erC -waR -tEQ -crm -dtE -mLp -tdK -tdK -tdK -tdK -hKA -cuz -vzY -mYY -aKX -ntm -rIb -nLR -nLR -nLR -eSj -soX -xiX -blO -qak -kHH -oDQ -efb -cOc -dNp -efb -fCC -dqU -aQD -lkO -yaL -xGY -xGY -xGY -qJG -pkH -jMi -sWC -tzi -uzH -pcn -fEk -jXY -dGP -dqk -lWY -mtS -acZ -usc -fwC -xfI -dqk -qcO -ipr -mpI -qbV -bBv -qbV -xzp -pKN -cIY -bSF -xbB -xbB -xvs -kgf -jFj -hfj -pnR -vdo -rFa -llM -lAu -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -lMJ -aaf -aaf -hRM -hRM -qeb -hRM -hRM -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 -aUn -lMJ -rrt -lAu -lAu -lAu -hYV -mng -bHz -whB -uaX -wgW -whB -whB -whB -whB -kcr -whB -arA -aje -gSY -aje -bJl -whB -wfg -tYy -uEP -goR -ful -ggP -rKV -ezS -rfl -goR -bRs -jKz -pne -sFL -utK -qCf -tEQ -oWQ -tdK -tcf -tdK -xvQ -duo -tdK -mts -tDL -bjw -tFU -gEz -rtC -uQY -fjU -izT -iLH -taP -mbz -wTm -vLh -efb -buu -efb -efb -efb -efb -efb -dZR -pfc -eiW -jQZ -gKu -yjP -iKa -iKa -kTA -eDJ -jMi -vDT -tzi -fCV -oxa -fEk -pcn -vNS -dqk -wLY -qZG -pDK -wyy -rjs -oGi -dqk -aXb -ipr -mcC -qbV -bBv -qbV -uXX -uXX -nhe -oRg -oRg -oRg -xvs -hkS -gRv -jFj -umW -gpy -kiq -llM -lAu -lMJ -aaa -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -quc -aaf -aaf -whM -hRM -cCH -cDv -cEB -hRM -whM -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 -aaa -aUn -lAu -fEJ -fEJ -fEJ -tpS -tpS -czM -iai -whB -whB -whB -whB -sXi -rRL -whB -gbw -whB -whB -whB -whB -whB -whB -whB -goR -goR -goR -goR -goR -lQv -goR -goR -goR -goR -cYR -bGr -pne -iDA -dTL -waR -tEQ -fRn -tdK -gXL -vJG -eNl -bct -tdK -oWr -tDL -bjw -tFU -gEz -nuH -eWg -fAJ -fAJ -taP -fAJ -ohL -fAJ -ohL -rld -qeF -mTb -ggE -hyy -qEj -ons -byB -iri -vgH -bQP -gfV -kpe -xyN -xyN -thh -ofy -jMi -sWC -tzi -aQr -pcn -tBm -gXX -gYe -dqk -dqk -qfI -qfI -eJB -eJB -eJB -ubD -ucr -ipr -hdl -qbV -bBv -qbV -aXU -rxM -iaT -kCd -kCd -nrQ -xvs -koH -ssy -jFj -nEC -nEC -llM -nEC -nEC -nEC -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -hRM -hRM -cBN -cCI -cCI -hNk -cFv -hRM -hRM -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 -aaa -aaa -aUn -lAu -fEJ -gpZ -ghU -vJs -eaS -gYT -eMZ -eMZ -dls -pSI -gYI -nig -nig -aBN -uAh -orM -blu -nkw -poO -blu -oUW -sTJ -blu -iPs -tDs -bpa -tYB -oUt -fBu -lWC -oUt -xZr -iiI -qKa -pne -pRW -tHv -pRW -gff -qcu -tdK -tcf -tdK -tdK -tdK -tdK -tdK -tDL -bjw -dCM -nLR -xVh -bFa -mfe -mfe -axQ -ydu -veX -iBW -rdj -voI -jQg -nwr -kFf -mti -adq -pgS -fXM -vGr -eiW -mol -pEn -sYq -iKa -ydo -jHk -rtK -jMi -upB -tzi -tzi -tzi -tzi -tzi -tzi -tzi -tzi -uep -kOC -uNr -tBH -ehk -eJB -kAo -ipr -mAt -qbV -bBv -qbV -rxM -bim -ucy -jMn -kCd -kCd -xvs -eqk -wfJ -iDF -nEC -sSe -onz -wEo -rmh -aYT -anS -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaf -aaf -veQ -iYp -cBO -cCI -gBw -cCI -dvM -cDz -pse -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 -aaa -aaa -aUn -aaa -tpS -mWO -axB -nsp -nDh -gvV -lHu -dUA -dUA -dUA -bvx -dUA -dUA -kLA -uAh -dFg -blu -ajr -bGo -blu -vbB -jun -blu -eQx -bpa -oyS -unK -xqh -edd -pxh -oyS -hCP -pRW -qEc -oiQ -qCf -qCf -pRW -tEQ -hSy -tdK -pBN -uwd -uwd -uwd -cCy -pdS -gyR -lMx -lqU -nLR -tgl -mVr -pOQ -nru -axQ -pOR -oNH -iBW -sVF -tnM -eMn -hEe -iRT -tKW -upb -aRc -bKl -oXQ -cNj -eiW -mqS -sYq -xGY -xGY -uyP -mhs -jMi -sWC -mEr -gUE -isJ -wVy -isJ -hqm -xPI -tzi -iQl -tNC -qZE -qbG -uGk -mxw -qhC -ipr -hdl -qbV -bBv -qbV -qbV -qbV -onc -qbV -bOF -bOF -qbV -nbE -xAu -iDF -jjp -xgv -hTQ -lNO -nEC -nEC -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaf -hRM -hRM -cBP -pmS -cCI -cCI -cFx -hRM -hRM -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aUn -lAu -fEJ -xuv -uWN -cyq -hkg -aEf -sMz -xBD -xBD -lHr -fbl -wHe -sxP -sxP -uAh -vAB -blu -mCl -nPk -blu -rQW -xqs -blu -kyv -bpa -xRx -dQk -pHU -kda -mrR -mrR -thr -ndo -lcC -lPD -mAC -gGX -ojW -vgw -hSy -tdK -alH -tdK -tdK -nVR -tdK -tdK -crI -lrh -krX -cem -cem -cem -cem -neZ -taP -mfe -mfe -bUM -uQS -cPo -eMn -fwO -kDb -pxg -mXp -ons -xYs -bjR -eku -eiW -ptZ -sYq -ikj -ikj -ePr -iSi -jMi -tHD -isJ -isJ -isJ -tta -isJ -rah -vNF -tzi -uep -kOC -avP -pot -dxA -eJB -itl -mvx -jZi -qbV -bBv -nxf -mHs -vLF -rhi -dzc -bOF -mub -qbV -sKE -jnU -eID -uTD -qXO -vFv -vAr -llM -lAu -aaa -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -lMJ -quc -lMJ -lMJ -aaa -lMJ -aaa -lMJ -quc -aaf -aaf -whM -hRM -cCJ -cDw -cEC -hRM -whM -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 -aaa -aaa -aUn -lAu -fEJ -fEJ -fEJ -tpS -tpS -czM -dtt -hJy -eUv -xLW -xLW -xLW -baI -oCW -uAh -nFN -blu -blu -vms -blu -blu -ddD -blu -blu -sUU -xPF -oap -bfA -doi -blu -bMt -bMt -bMt -sAE -okO -sAE -bMt -bMt -tdK -tdK -tdK -fHy -tdK -aaa -aaa -aaa -sYJ -tDL -bjw -lqU -nkJ -vWV -rqH -cem -qPr -wCj -fAJ -fAJ -iBW -uQS -tnM -eMn -lLl -ssN -bYE -aFe -ons -vaY -chR -vyu -eiW -mol -jZd -kCb -kCb -tgh -eDJ -jMi -pgH -kQN -cQZ -njd -rah -isJ -isJ -nvi -tzi -tzi -tzi -tzi -tzi -tzi -tzi -kke -jJa -kke -qbV -bBv -fvg -gmo -gmo -fbD -mAW -bOF -nxf -qbV -qbV -qbV -qbV -qbV -qbV -mLI -mLI -mLI -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -lMJ -aaf -aaf -hRM -hRM -ndM -hRM -hRM -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 -aaa -aUn -lMJ -dwJ -lAu -lAu -lAu -hYV -qIQ -lHu -xms -prK -ioe -ioe -gKA -gik -ihm -uAh -euT -khS -bpa -oUt -wvA -bpa -oUt -uic -kJG -qyj -mkx -doo -bfA -jKs -hgN -bMt -gGE -bKA -sYS -bDl -sYS -uHI -adQ -tdK -uwd -uwd -tcf -bXZ -jSI -aBk -jSI -jSI -tDL -xNr -mNr -laV -pxt -ncX -cem -aiN -oyU -cHp -fQq -iBW -uQS -cXN -wbl -nIf -vcT -pWo -gDM -ons -fTJ -woD -fqT -xom -mol -gyi -pdw -dKV -qgI -vGA -jMi -hmW -nSI -rIe -lFK -nCy -nCy -mVM -nCy -nCy -dBf -ihz -ihz -ihz -axZ -qAL -jIF -bHN -wWH -koo -luD -woO -lkz -bOF -bOF -bOF -bOF -nqe -rnC -bOF -nto -nto -nto -bOF -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -hRM -pse -hRM -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 -aaa -aaa -aaa -dwJ -aaa -aaa -lAu -hYV -jSL -uhw -uml -prK -ioe -kTH -ioe -pqA -mMX -iXs -dUA -hCP -oyS -edd -dAC -oyS -edd -oyS -vOT -oyS -oyS -uFo -rRF -jKs -gtJ -bMt -fTQ -pWu -jXL -pAY -cQu -bjv -tiF -tdK -uwd -vas -sgQ -bXZ -iTM -eyk -xuZ -jSI -tDL -bjw -lqU -nkJ -aKf -qYf -cem -mIs -gys -bGE -uMs -bGE -uQS -hdG -obP -hJU -oSm -oCO -oCO -oCO -oCO -oCO -vde -gqZ -mol -lel -xEH -odO -hrc -dee -jMi -dtL -pgH -hqm -isJ -isJ -juD -isJ -isJ -pPF -nbJ -sLo -tzi -hcR -pJm -isJ -mdf -oyK -dpe -bOF -mAW -jIn -tgz -goM -bsN -dqD -bOF -xDk -tgs -lUy -ciL -frR -dlE -bOF -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aox -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -dwJ -aaa -aaa -lAu -hYV -boQ -mwa -luT -prK -thM -gqE -odE -rhq -pdh -eaH -qBw -fbt -pcr -kda -gcF -bHT -kda -pcr -uKh -nol -wJD -jKs -mDH -jKs -aBA -bMt -uKl -pWu -jXL -myo -jXL -dKF -lli -tdK -pbd -tSE -qzL -bXZ -eFa -jbD -iBO -jSI -tby -bjx -wNZ -qbl -qbl -qbl -qbl -cOH -fKl -qcj -gML -vXD -frK -ons -pGx -hzQ -sDm -oCO -bAk -qfx -iOA -oCO -fFN -dUC -mol -afC -ulq -wAk -vbR -hTj -byi -mZj -kCo -glx -isJ -frW -uIj -xPI -isJ -isJ -isJ -isJ -tzi -tzi -tzi -tzi -olL -dXK -olL -qbV -nxf -jIn -sKV -bOF -stN -bsN -bOF -jEX -ciL -eux -gCL -ciL -kNn -gvR -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -rrt -wiF -oaT -aaa -czM -czM -xvC -hKk -nBr -jKe -jKe -jKe -miV -pfr -xBD -hIn -blu -blu -gOV -blu -blu -bLF -tdK -lNm -tdK -blu -geR -blu -tHc -blu -bMt -uCA -pWu -jXL -cVc -gml -nAO -dqB -vcO -kJT -tdK -tdK -bXZ -jSI -vTi -jSI -jSI -dLf -gBz -nNh -qbl -swc -oEb -qbl -bJD -cAd -sER -sER -jXc -vLe -sGj -ngU -fsB -hSY -xdt -dgC -tlN -thR -oCO -mPe -lES -mol -hfp -mol -byi -byi -byi -byi -cpA -qlo -nbR -isJ -gvy -eNX -meK -msC -lIm -lIm -udP -tzi -kXQ -cah -kXQ -pCA -obC -eeZ -qbV -cEz -jIn -nxf -bOF -fPn -pZA -llh -evV -ciL -ciL -frR -ciL -gPw -bOF -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -czM -czM -hYV -czM -czM -uwm -hNh -oRQ -hKk -erM -slg -erM -pfr -pfr -xBD -eIe -blu -axK -tHj -blu -aQF -vnW -tdK -jbp -tdK -mMY -gGC -blu -vnW -cQI -bMt -eRN -tzk -rPp -bhx -mSt -rRp -sKT -tdK -pSB -tdK -tPg -iDo -uVc -gRC -pQH -jIP -nRN -bjw -lqU -qbl -sti -avC -qbl -lfI -hxX -sFz -ljb -ttT -muo -sGj -kNb -iCT -gvN -oCO -jah -gqa -xli -oCO -mUi -lES -lnz -rhw -xmE -qbl -fTf -ihy -ihy -rkG -piY -mLs -isJ -isJ -isJ -isJ -isJ -oyM -jbo -isJ -tzi -fVN -gZq -mCH -vED -obC -cHh -qbV -qfG -bCS -oYX -bOF -bOF -bOF -bOF -bOF -huK -mdi -mdi -mdi -mdi -bOF -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -lAu -hYV -jrw -xGB -mdB -iDm -ioe -hNh -xpR -sHU -vTa -sWd -vTa -sHU -vTa -xBD -xhS -blu -rWY -wkO -blu -sdV -tDY -tdK -lZd -tdK -muN -ldb -blu -fgV -pqe -bMt -ekD -iOC -jXx -tlu -kGj -oPs -ekD -tdK -uwd -tdK -axb -wsc -sBL -wxE -myi -jIP -tDL -gfW -wYa -bnJ -eKO -rOq -qbl -wyQ -hxX -dNN -geM -jDo -pOZ -sGj -sGj -sGj -sGj -sGj -sGj -aej -nFx -oCO -qZd -lES -dKp -rhw -lae -qbl -qWY -qbl -qbl -mab -qbl -isJ -isJ -wKW -xgy -kgZ -mfn -uqU -uuL -lCW -tzi -mvj -fXt -oTI -qLr -mez -bih -qbV -vPM -uVu -jIn -jIn -jIn -iWz -irB -bOF -bOF -bOF -bOF -bOF -qbV -qbV -heM -heM -tNX -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -czM -czM -iDm -czM -czM -jFR -hNh -wYS -hNh -gGj -gGj -hJy -mXJ -mXJ -hJy -kuX -blu -pUh -sTJ -blu -iRU -poO -tdK -lZd -tdK -pUh -vNU -blu -qzj -ujg -bMt -pPb -lBT -rSJ -hOF -pWc -xzW -lBT -tdK -uwd -tdK -mGK -wsc -ltL -nfU -oAy -jIP -nWY -mUc -nKc -qbl -fKq -eKO -qbl -kNW -prh -oxO -hin -iFA -qxZ -xqO -jFz -bNS -eKt -kFj -sGj -img -oQY -oCO -czU -lES -nGF -gQz -sAD -qbl -rpP -qbl -nvl -cvM -kGW -ePF -isJ -mAE -rah -gXV -wIq -jKO -hlJ -xIP -tzi -sbQ -ghY -oTI -qvs -iQR -dWO -qbV -dww -cFu -nxf -mAW -hEi -jIn -jIn -jIn -jIn -jIn -dsY -ciL -jlJ -geL -fDq -vKl -tNX -tNX -tNX -aaa -aaa -aaa -aaa -cPv -aaa -aaa -aaa -cPv -aaa -aaa -aaa -cPv -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -czM -aaa -waq -lAu -czM -czM -hYV -hYV -lzP -hYV -hYV -lzP -hYV -hYV -hYV -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -uQh -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -tdK -nUG -tdK -mVA -oqY -yie -nfU -pXr -jIP -pZj -bjw -lqU -qbl -qbl -xIE -qbl -jlf -miE -lgb -dpx -iYt -mdJ -sGj -yed -bEH -nER -gDt -sGj -fAW -crV -qbl -pZZ -qbl -lgk -vNX -dZL -wkW -cdf -qbl -mFZ -bjl -iMM -ujs -isJ -wQb -rah -dWs -rah -qxS -vQn -oyh -tzi -gvE -sDy -nJl -vjg -pfI -bro -qbV -bOF -bOF -bOF -bOF -nxf -rgC -dzc -nxf -rxn -qph -nyf -odZ -xeO -efR -cMr -hXg -din -bfD -cuh -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -mIj -viT -lMJ -lMJ -aaa -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -hKH -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -otd -tdK -auo -ljU -awI -qRn -tdK -lZd -tdK -qgX -qIn -uwd -fWD -awd -tdK -tbM -aLZ -aNm -vas -eHq -phZ -qgX -tdK -uwd -tdK -vNK -uWZ -uWZ -gHt -gHt -ojN -gyR -bjw -lqU -qbl -fts -eKO -qbl -qbl -cKc -qbl -qbl -qbl -qbl -qbl -isE -nTI -tCr -qwF -qbl -bZu -qbl -qbl -nyo -qbl -qbl -fLz -qbl -qbl -wfQ -qbl -mre -bVU -iYV -thq -isJ -tjp -fdB -sKn -hmG -set -ooE -mRj -isJ -kXQ -rqT -kXQ -iqC -dhj -pBt -ubD -aaa -aaa -aaa -bOF -bOF -bOF -bOF -bOF -bOF -bOF -nax -bOF -qbV -oTo -efw -eVu -tNX -tNX -tNX -aaa -aaa -aaa -aaa -cPv -aaa -aaa -aaa -cPv -aaa -aaa -aaa -cPv -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -lMJ -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -tdK -tdK -tdK -tdK -tdK -dHy -hhf -ooC -uwd -uwd -uwd -eQZ -uwd -uwd -qji -uwd -uwd -pSB -uwd -uwd -qIn -uwd -uwd -uwd -tdK -lZB -kMN -xEb -fun -vQj -jIP -gts -cUl -lzN -hmk -sfH -sfH -sfH -fMR -gac -fMR -fMR -fMR -xWU -qbl -tXJ -igv -uEg -hkQ -lZn -wJj -ibC -gKZ -fuw -qbl -iNP -aCo -ihy -vIy -kvg -qbl -jLG -vvo -qcm -oOb -isJ -isJ -isJ -isJ -isJ -ptK -isJ -isJ -isJ -ubD -ubD -ubD -awK -gIW -awK -ubD -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -bOF -cJe -bOF -qbV -heM -heM -heM -tNX -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -quc -aaa -aaa -lAu -hYV -afD -afD -ykI -afD -afD -afD -afD -afD -afD -afD -tdK -sWp -hQU -ruS -dnR -tdK -lZd -dnR -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -fav -bXZ -bXZ -bXZ -bXZ -bXZ -xXE -xXE -xXE -xXE -xXE -xXE -rIJ -rTr -llm -vym -vym -vym -vym -vym -vym -vym -lbf -jci -dep -qbl -qbl -qbl -qbl -qbl -qbl -nHu -rka -qaw -fya -reZ -vvM -ngE -rFT -rya -osp -fLZ -ktS -ktS -ktS -ktS -oIe -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -uzl -aaa -aaa -lAu -kig -sPv -kig -lAu -aaa -aaa -aaa -lKu -lMJ -aaa -aaa -aaa -aaa -bOF -okX -bOF -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -lMJ -aaa -wOY -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -dYy -tQT -auq -lhd -tdK -jmZ -dnz -bXZ -tyQ -vfz -pWG -dzB -uhm -bmU -oFp -gzT -qgA -qgA -bmU -clG -jAy -ngH -hoe -bmU -sMx -lmC -rPR -iUe -pTj -nFW -xXE -vEE -rTr -llm -gyJ -npp -goQ -qCZ -kzV -tFd -vym -kIb -jci -sBG -fMR -sfH -fMR -sfH -lCT -xtW -heB -mNC -bEZ -myz -qbl -boP -cPU -rya -nDU -osp -mKO -scq -qne -apX -mcS -gMx -jad -uYZ -uYZ -uYZ -uYZ -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -kig -vPA -kig -lAu -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aox -aox -aox -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aLo -cPv -aLo -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -lMJ -aaa -aaa -lAu -hYV -pvY -afD -afD -afD -afD -afD -afD -afD -afD -qhy -tdK -tLb -atd -qNE -qGu -vJG -xxn -oeK -bXZ -oyN -jrJ -iHd -pfk -jmL -bmU -gzT -gzT -qgA -gTu -bmU -qLm -rsB -wzR -cWh -bmU -jeV -ehA -oDx -nbz -tsF -qRj -xXE -vEE -rTr -llm -gyJ -crq -wHB -eyN -nuw -dpZ -vym -nmE -xBq -rya -nDU -ksY -rya -hCi -qbl -qbl -qbl -qbl -qbl -qbl -qbl -nDU -uxp -rya -oEh -osp -tSb -xOg -xOg -xOg -fgs -vRF -rGM -xbs -bIV -jED -gav -aaa -aaa -aav -aaa -aaa -lAu -kig -sPv -kig -lAu -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aLo -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -lMJ -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -tLb -atd -atd -atd -tdK -bmo -oeK -bXZ -vNt -lbo -fBB -uYj -ylw -bmU -wzv -oJk -pix -gZK -bmU -veH -gKW -oDE -eMG -bmU -mPB -ehA -pgj -cEa -uXa -caG -xXE -rYl -rTr -bDH -gyJ -gyJ -gyJ -lLc -gyJ -gyJ -vym -vym -vym -vym -vym -vym -rlQ -swc -qbl -whU -xwY -eQl -eLH -bXg -qbl -deE -uMS -jll -vym -osp -wdO -xOg -stM -xOg -gAs -uYZ -jfE -uYZ -gHb -jfb -uYZ -aaa -aaa -aaa -aaa -aaa -lAu -kig -sPv -kig -lAu -lAu -lAu -lAu -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -ykI -afD -afD -tdK -tLb -atd -dnS -atd -tdK -lZd -ayR -bXZ -mrd -eQv -wBw -uYj -gpd -bmU -tbf -pix -mzL -kSV -bmU -dfh -dfh -qIb -dfh -bmU -xXE -iQL -tlo -lMZ -uXa -lvH -xXE -cVr -bjC -llm -lLU -ovn -lLS -crj -dvg -fDp -jxE -eou -iVZ -itE -sZX -vym -vym -vym -vym -hgG -nRC -vTg -rya -cmZ -qbl -qbl -aYO -cPO -jcx -uiG -mge -aTJ -aiT -gqm -ghG -bLX -jwM -uYZ -iKn -uYZ -uYZ -aaa -aaa -aaa -aaa -aaa -lAu -kig -uSH -lUX -kig -kig -kig -kig -kig -kig -lMJ -lMJ -lMJ -lMJ -lMJ -aox -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -dnR -aus -tdz -tUa -tdK -lZd -iCl -bXZ -djs -lbo -prd -uTW -yhC -bmU -bmU -aKJ -aKJ -bmU -bmU -epw -muT -bqO -muT -rQv -iMG -ehA -ePE -mzR -kee -jGm -nCH -bTL -oOg -lIi -eJf -ylM -bqZ -dkt -lNR -nsB -bsT -okA -ibS -too -cpd -jIG -jIG -dRK -vym -fub -hYU -tCA -uaf -hYU -qjr -vuA -hRL -twq -pVc -aaU -afQ -pyN -krz -xOg -lgW -lqI -gkS -rcE -uuy -kyC -aaa -aaa -aaa -aaa -aaa -aaa -lAu -kig -gnQ -idE -idE -idE -idE -idE -lKj -kig -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rUb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -lAu -hYV -afD -afD -afD -afD -afD -afD -afD -afD -afD -afD -tdK -tdK -tdK -tdK -tdK -tdK -uQh -bXZ -bXZ -gjS -dfh -jwd -dfh -gjS -gjS -hAj -iHd -iHd -isz -gjS -fPT -wwz -wAz -iEY -azw -hDb -nGQ -snU -qjM -bZA -ftN -nCH -odV -sMT -bto -pZT -wgZ -vVB -sga -imG -sZA -pnb -mQm -uXD -hQs -exa -pVV -nFJ -iEl -vym -xwO -swp -rya -rJV -mPp -dFI -qbl -xEw -lsT -pVc -cba -elA -hXQ -wMA -gss -qHf -wdO -okS -uYZ -iKn -uYZ -aaa -aaa -aaa -quc -lMJ -quc -lMJ -kig -kig -kig -kig -kig -kig -lUX -dDu -kig -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -rUb -czM -czM -czM -czM -lzP -hYV -hYV -lzP -tdK -tdK -tdK -tdK -nEm -tLb -tdK -dqu -lhd -lZd -bXZ -odc -qWS -muT -hEE -muT -dTY -ghP -dSI -dSI -dSI -dSI -pCv -vUX -dSI -feV -pEY -gjS -xXE -xXE -xXE -xXE -xXE -xXE -xXE -deS -uGn -tYr -iuJ -iuJ -deS -cNK -deS -iuJ -gZB -ueC -ebF -boM -mef -ijJ -hgX -uFz -vym -ybw -xZD -nRC -iGi -kIb -vym -vym -gJp -vym -pVc -mKv -voe -pMX -ckA -uvo -uvo -kKm -gED -uYZ -kZT -uYZ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lAu -lAu -lAu -lAu -lAu -kig -sPv -kig -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -rUb -rLv -rLv -kiE -czM -mXD -hnX -mok -vyp -tdK -tdK -apd -wIv -arK -dnS -tdK -tdK -tdK -lZd -bXZ -uLR -agk -wwz -dFh -muT -tdc -dSI -lGN -bCR -jqS -muT -lGN -jqS -fBB -feV -muT -vdF -gjS -wOh -oZv -eEg -pWb -gjS -dus -oMw -oFk -mVL -mLF -miG -oTd -iFw -nxd -xPi -gZB -edI -tQV -sXM -mef -vgq -guv -njp -vym -oKF -pvU -nZF -bXg -wbE -vym -tsp -aim -bkD -omb -lKf -rDW -ckH -cii -niY -niY -niY -jJC -jJC -jJC -jPJ -xXp -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -mBP -pnX -fET -pnX -pnX -lMJ -lMJ -lMJ -lMJ -aox -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -lMJ -aaa -aaa -tPH -rLv -rLv -rLv -czM -qqe -tyu -vTa -sDb -jQK -uka -uka -opF -opF -mRC -bAS -hrf -hhf -ooC -bXZ -kSW -lzT -wDw -nnR -nnR -nnR -nnR -vOl -vOl -vOl -vOl -vOl -vOl -tno -mmI -qzc -vkX -ygI -eYG -qVO -eXp -wBk -bDQ -jIq -kBg -gnG -cgE -xgO -kgQ -owz -xgO -rvR -rPb -gZB -gZB -fMG -iCd -xTx -gZB -kll -yfS -vym -vym -vym -vym -vym -vym -vym -fEy -xHR -vZz -tHX -xca -fXQ -tDH -vNT -rEd -rEd -rEd -rEd -rEd -aaf -ihW -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -pnX -awv -his -vXh -pnX -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -lMJ -aaa -aaa -rLv -rLv -rLv -rUb -czM -czM -tdK -tdK -tdK -tdK -bcO -dnS -dnS -fFV -dnS -tdK -vLo -bXZ -aKu -bXZ -nyT -oOC -muT -xKr -muT -nrt -vbi -elF -xoA -bgQ -oAa -eTE -oxA -xoA -gAu -oAa -qvb -gjS -akp -lZK -eWl -pWb -gjS -dfu -fQk -gAX -rRw -buP -her -vkp -kEt -mYi -ozv -ede -nuq -typ -dNU -heu -gZB -iSS -xuI -vBH -vBH -jYH -jYH -ckH -wzg -khq -hvU -fOM -lye -lye -rot -iyL -nAL -cxl -mQD -pfd -oEu -oEu -rEd -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -pnX -uvV -elH -vyt -bdn -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -lMJ -aaa -aaa -rUb -rLv -rLv -anS -aox -aox -mBY -fLx -mSz -fLx -dnS -oUM -mpz -pSs -tdK -tdK -tBd -bXZ -mce -vio -eQv -oOC -muT -fQO -fQO -fQO -fQO -hbu -hbu -fEH -hbu -hbu -hbu -hbu -aFp -hbu -hbu -bmU -kfx -nUq -nUq -kfx -kfx -xcF -dfF -raB -nRV -nbL -tPS -tKC -xwN -hVB -qZx -gZB -gZB -pzr -iCd -xlb -gZB -mQQ -jBW -fKb -qCV -cMU -cMU -hcO -izf -izf -fqD -ufw -fKD -fKD -cJz -voY -jIO -aaf -kZg -lan -hdc -nUU -rEd -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lAu -pnX -dLk -rgA -mbL -pnX -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -quc -aaa -aaa -ffP -rLv -rLv -aWl -aaa -aox -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -bXZ -uuW -jHP -hVj -njb -ffx -xNc -oOC -muT -fQO -bWZ -khE -sIl -hbu -dAK -jSH -mLi -mrX -nDt -agU -wVv -eUM -hbu -uQW -hbw -qKK -ePR -ddR -vsP -uOF -oxe -aat -eLq -otk -hXY -hBJ -flt -nKu -mVg -gZB -efm -aql -bFQ -pzw -jYa -oOQ -gNH -vzV -ucL -gNH -gNH -kKN -sLW -vhQ -bQh -fJd -xoQ -sMi -bzU -ffR -pRo -xmT -tkp -udr -ntZ -oEu -rEd -aaf -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -jhB -foe -pnX -lUX -dRV -lUX -pnX -foe -jhB -aox -aox -aox -pqI -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -fWs -rUb -rUb -aWl -aaa -aox -hVj -jyv -bTT -jyv -mQn -eLA -qmL -tuI -tRH -aRB -cMF -rUg -sKe -iOQ -nnR -gMJ -muT -fQO -woa -eDG -dbP -cly -oYz -jSH -mrX -iis -gxi -hAc -gxi -sdW -hbu -pAO -bWN -bWN -szv -rZj -lWz -lev -vkp -jps -lJT -cte -cte -wTU -cte -sRz -tLK -gZB -uoO -ebF -ebF -xtv -uWE -dCV -pkj -eGO -igr -wDF -mrb -wDF -igr -sDx -diY -fJd -caT -dfX -lFD -scZ -wGd -aaf -rEd -rEd -rEd -rEd -rEd -aaf -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -pPY -jhB -jhB -jhB -jhB -xBG -glF -wOM -fcb -jyx -cAN -cGs -jhB -jhB -jhB -jhB -pPY -lMJ -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -hVj -uhU -frC -scT -xTq -eLA -jRw -wBX -hVj -vZC -kXz -hVj -oVI -muT -sUI -jlT -oAa -fQO -cYP -dbP -nGR -hbu -bQk -usN -usN -jHt -jqt -ejk -jqt -baA -hbu -tYR -irV -pko -pko -bAJ -vsP -laG -iXg -quL -mBy -cte -eTk -qZh -nHN -bFD -tLK -gZB -qvM -eEs -oUA -exn -ntw -muL -mBd -ezz -igr -lip -bhq -igr -igr -vbF -diY -foI -caT -uzC -jhT -ntb -nAL -cxl -mQD -vSQ -sRI -sRI -rEd -aaf -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -hfI -pYu -kRT -ttw -dWn -mvA -gnh -ygg -jQb -dYL -bzC -eul -xbb -pDm -hnP -vXl -hfI -lAu -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -hVj -ymf -jyv -xpb -aia -wHT -jRw -wkk -hVj -bXZ -nED -bXZ -qsV -qsV -qsV -daw -qsV -fQO -fQO -nbq -fQO -fQO -fQO -fQO -fQO -rPl -rPl -rPl -rPl -rPl -fQO -sRo -hGj -hzD -eDW -hrb -vsP -hoa -rBt -quL -kSg -cte -xUJ -pZr -sLg -koC -gAB -gZB -ntw -ntw -gZB -yfS -gZB -ink -grx -sQn -igr -oFy -oFy -xhW -igr -iek -eKy -fJd -caT -uzC -eIo -nMw -jIO -aaf -kZg -sOz -ntx -uKH -rEd -aaf -aaa -aaa -quc -aaa -quc -aaa -aaa -jhB -rrG -gVf -hVd -qkZ -dkp -tVr -duN -aHo -dqV -ilk -ucP -cNu -ngS -tyb -xiO -jhB -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -hVj -scT -frC -uhU -szy -eLA -xro -rxr -iVh -bXZ -xYr -bXZ -wsB -wLL -weo -rVz -qsV -qBM -ran -nwc -sJp -fQO -fbm -qcU -vbf -vSt -aPa -dmM -iAF -yjM -fQO -gNl -gNl -gNl -gNl -gNl -gUa -mON -xwN -dyi -cFc -cte -ufy -rpp -wof -dhh -fGm -sUa -aFS -kce -fOH -vZn -bqn -rcP -qui -lye -rPG -lye -lye -lye -mnJ -owB -elN -fJd -qHw -gSp -dsD -ine -pRo -xmT -tkp -cCL -mTn -sRI -rEd -aaf -aaa -aaa -lMJ -aaa -lMJ -aaa -aaa -hfI -lCV -rtc -rtc -rtc -dVf -dJj -eCr -aPf -plH -ies -lfQ -jhB -vjb -uzE -lFM -hfI -lAu -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -hVj -jyv -iPU -qRx -sKk -eLA -rOi -kFz -dFC -bXZ -inN -bfT -iIl -ogF -weo -hfh -qsV -sTC -giA -lqR -giA -fQO -kBI -toS -kBI -vSt -cuj -kBa -jQY -weM -fQO -rWr -wif -apc -jEp -fWF -rqM -nkQ -xwN -lvZ -kWT -kWT -kWT -kWT -kWT -kWT -esG -lDl -aLq -aQU -lzg -tAn -nHc -xov -grx -rtq -lye -lye -lye -lye -lye -lye -elN -sWh -caT -qah -wff -scZ -wGd -aaf -rEd -rEd -rEd -rEd -rEd -aaf -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -ffo -ffo -ffo -ffo -ffo -ffo -lAf -rUh -qpm -cbS -sXK -ffo -ffo -ffo -ffo -ffo -ffo -lMJ -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aWl -rrt -rrt -rrt -rrt -rrt -rrt -rrt -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -aox -hVj -hVj -hVj -hVj -hVj -hVj -byb -kFz -dWU -bXZ -tIU -bXZ -iIl -ogF -fZy -gGZ -qsV -iqW -tyF -pmR -ohk -ohk -ohk -owC -ohk -uod -uod -qqA -fYh -rTm -fQO -apc -apc -kZJ -apc -lLs -gUa -ixn -cRR -smz -ksD -arL -qoJ -aju -mAR -pVl -nas -isP -eSU -eSU -iEx -tZy -dIg -azB -grx -lye -lye -lye -dtQ -lye -lye -bvZ -elN -fJd -bWK -gSp -flF -tcp -phQ -oId -gXO -dKU -iXC -iXC -rEd -aaf -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -bhh -cSn -tfi -tQb -fhN -rGV -qie -oxn -hhx -wzC -cgL -nxE -tfi -cSn -bhh -lAu -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aac -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -lMJ -aaa -aaa -lAu -lAu -eLA -pVT -mnY -moh -bXZ -tIU -bXZ -gfY -gVq -fZy -bbS -qsV -hZj -umM -ljv -ljv -pHq -pHq -iNF -pHq -pHq -pHq -tOz -xVP -jgT -fQO -qST -apc -apc -jEp -nDG -gUa -ufx -dtd -jaw -kWT -fqN -uqu -uqu -hRC -tPk -qYo -sxU -egS -mPX -aNV -tZy -dIg -dZW -grx -lye -gKE -tmx -tmx -tmx -lye -lye -dmI -fJd -mzG -uzC -sTk -wkj -jIO -aaf -kZg -ulM -wkJ -ewV -rEd -aaf -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -bhh -cSn -cSy -cSn -byQ -bFT -rUh -wyR -pud -ryj -vCN -cSn -cSy -cSn -bhh -lAu -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aWl -rrt -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -lMJ -lAu -lAu -mJI -nui -uJR -uJR -tdK -tdK -tdK -ydL -bXZ -qsV -pew -eUs -jRc -qsV -lDy -sPO -lhN -giA -sOy -bJK -igu -mXO -nPI -dSH -mUR -qZy -bln -fQO -dgf -jEp -apc -apc -kZJ -gUa -gUa -dRU -tqX -gUa -sMJ -jws -usW -kWT -qgf -gTx -iKZ -eSU -tMI -aNV -tZy -dIg -azB -efi -grx -grx -grx -grx -lye -lye -cLJ -elN -fJd -lye -ior -kie -xuz -phQ -oId -rbf -fMu -hAn -iXC -rEd -aaf -aaa -aaa -aaa -rrt -rrt -lMJ -lMJ -vIJ -ffo -ltH -uxn -ltH -fhN -tFo -gYm -hmi -xhO -rdk -cgL -ltH -ahy -ltH -ffo -pMS -lMJ -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -lMJ -mJI -nui -nui -nui -apn -wvz -gyS -tdK -dnS -nkh -bXZ -iIl -scp -eUs -wpK -qsV -hZj -kBI -vsC -yhc -dPf -vDd -pmg -sFe -kbT -pgy -kBI -mVZ -jgT -fQO -ieH -apc -apc -apc -apc -gUa -fqO -npM -apc -gUa -dOA -kFl -xCY -kWT -jAT -gTx -wOj -xxQ -lhr -szT -gEB -sQw -kkn -bMV -bMV -bMV -bMV -gBn -fXk -fXk -fXk -aJr -kJA -fXk -sXV -mFv -pTM -ckH -aaf -rEd -rEd -rEd -rEd -rEd -aaf -aaa -aaa -aaa -rrt -aaa -aaa -rEp -wmd -lgo -kaj -uee -rRW -odM -wER -lVF -nkS -lOX -cHY -odM -duf -dHQ -rsl -lgo -pRQ -rEp -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -lMJ -aAf -yaC -yaC -yaC -bOH -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -yaC -oUF -amN -hWg -amN -aqz -wJQ -bZH -vyz -nkh -bXZ -igB -aOf -pNH -uVa -gfQ -sGD -lSW -olb -wST -puf -nku -kLK -hbn -nsU -pgy -kBI -mVZ -jgT -fQO -fQO -fQO -fQO -aFU -apc -rqM -apc -rVa -jEp -oHs -ejQ -aOY -aOY -kWT -tUI -esG -gLL -dAD -eqy -nAJ -dtV -tAh -lnN -fSe -lgY -rII -qGE -oFw -dIt -fFg -wlJ -iyS -mrO -fFg -nMR -jSb -jTk -ckH -aaf -aaf -aaf -aaf -aaf -aaf -aaf -aaa -rrt -aox -aox -aox -ogg -ogg -gep -lgo -pNt -cSW -diu -fni -diu -diu -kYB -fZH -gyV -uOT -cSW -cSW -trd -lgo -fLm -ogg -ogg -lMJ -lMJ -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -ilj -aaa -aaa -aaa -aaa -aaa -ilj -aaa -aaa -aaa -aaa -lMJ -aaa -mJI -nui -nui -nui -app -muh -arV -dyq -ekZ -dnS -bXZ -bXZ -qsV -qsV -qsV -qsV -qZn -dVV -ugD -wST -cfE -qLM -xXH -qKb -nsU -ptB -kBI -sSL -ygx -rGc -tOg -nhB -fQO -fQO -fQO -fQO -aqr -rVa -mtC -oHs -oAQ -lMJ -lMJ -aaf -ack -esG -esG -esG -esG -esG -ras -vRp -vRp -vRp -vRp -igr -igr -rCY -spj -rmt -dyb -rQA -pgn -jxU -lzj -mFv -bgp -ckH -lMJ -rEd -rEd -rEd -rEd -rEd -lMJ -aaa -rrt -lAu -lAu -lMJ -ruQ -gbO -mWx -hoz -kFa -boZ -mhE -lCF -jqU -vUk -gim -kqU -cHu -kqU -qsw -jiz -qyy -hwv -jsN -vzQ -ruQ -lAu -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -lMJ -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -tDm -xfJ -xfJ -aaa -aaa -lMJ -aaa -aaa -lMJ -mJI -nui -uJR -uJR -uJR -tdK -tdK -dnS -dnz -bXZ -tdK -tdK -fQO -kBI -lDy -cyY -eZz -aYj -qCW -sIt -gBV -aWp -rpT -udw -cMD -dxo -hZj -hRr -aWK -mTP -xjt -waa -bpc -fQO -boY -apc -jEp -oHs -tsZ -ack -ack -ack -ack -ack -aox -aox -aox -bOW -ras -twh -ulj -rUI -oCS -eeV -rfN -qmX -uuF -elN -nZy -rtq -wLr -vdd -uzC -lLZ -pFE -cxx -xtZ -hJF -hgg -mfM -mfM -rEd -lMJ -aaa -lMJ -lMJ -lMJ -lMJ -ruQ -gbO -lgo -lgo -qnC -sed -jsE -cSb -sed -iJS -kbe -lxZ -sed -dcQ -wUu -sed -qnC -lgo -lgo -uIc -ruQ -lAu -aaa -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -rrt -rrt -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -tDm -xfJ -xfJ -aaa -aaa -lMJ -aaa -aaa -lMJ -lAu -lAu -aaa -aaa -aaa -tdK -dzb -lhd -dqu -bXZ -tdK -tdK -fQO -kBI -hZj -kBI -vsC -xUC -xBK -xXH -fQO -xPU -vkJ -avl -fQO -gwv -aDY -dgg -dgg -luw -mIi -cAZ -abo -fQO -dgN -bWe -nrP -oHs -twf -lMJ -aaa -lMJ -aox -lMJ -aaa -lMJ -lMJ -aox -nul -prP -jNK -mfa -bHq -vDj -unQ -qmX -uuF -elN -wia -pik -mCT -pik -uzC -pRX -sxZ -jIO -lMJ -kZg -odF -tGx -piV -rEd -lMJ -aaa -rrt -lAu -lAu -lMJ -ogg -vKp -lgo -pUY -hjf -nRQ -uzW -fVg -sed -bhh -bhh -bhh -sed -eFN -pud -cPX -kOu -dSl -lgo -uIc -ogg -aaa -aaa -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -lMJ -dUd -dUd -ilj -dUd -dUd -lMJ -dUd -dUd -tDm -dUd -dUd -lMJ -lMJ -aox -aox -aox -aox -aox -aox -aox -aaa -aaa -nVR -qgX -dnS -bXZ -bXZ -tdK -tdK -fQO -mNe -lDy -ohk -oNO -jbZ -oRh -tZx -fLV -oNG -vmw -ohD -fLV -kBI -hZj -oVm -isx -scm -hov -cPc -gKd -fQO -oHs -vIo -oHs -gUa -oAQ -aaa -aaa -aaa -aox -aaa -aaa -lMJ -aaa -aox -nul -hoj -avB -qPh -bHq -lGq -oKH -qmX -uuF -elN -qaf -cOb -wLr -pik -qah -cpZ -tJu -uyD -gQf -cbn -vPU -tZW -mfM -rEd -lMJ -aaa -rrt -aox -aox -aox -ruQ -gbO -lgo -hpO -fCT -rce -uzW -pud -bhh -wGx -eGw -rBO -bhh -rUh -pud -bCv -ubI -kHd -lgo -uIc -ruQ -lMJ -lMJ -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -tDm -xfJ -xfJ -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -tdK -auB -avG -bXZ -tdK -tdK -fQO -fQO -kBI -hZj -kBI -kBI -kBI -kBI -kBI -fLV -vIG -akn -vIG -fLV -kBI -hZj -xlH -meM -tjo -hZj -cPc -iWk -fQO -kmw -wQr -ebP -gUa -twf -aaa -aaa -aaa -aox -aaa -aaa -lMJ -aaa -aox -nul -qFe -rnU -hpn -bHq -lGq -oKH -qmX -uuF -elN -wia -pik -wLr -pik -uzC -oYR -sxZ -jIO -lMJ -rEd -rEd -rEd -rEd -rEd -lMJ -aaa -rrt -lAu -lAu -lMJ -ogg -gbO -lgo -cSn -hjf -tjz -uzW -pud -bhh -eGw -eGw -sdH -bhh -rUh -pud -jSw -kOu -cSn -lgo -uIc -ogg -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -tdK -tdK -vBr -bXZ -tdK -tdK -fQO -kBI -iqW -iWx -ncf -ncf -ncf -bgg -viJ -fLV -jzM -jzM -cLV -fLV -viJ -nLF -iWx -iWx -okn -iWx -fjQ -gKd -fQO -oHs -tpc -oHs -gUa -oAQ -lMJ -aaa -lMJ -aox -lMJ -aaa -lMJ -lMJ -aox -nul -gKY -mlP -ogd -gZv -djC -iEh -qmX -uuF -elN -pDE -gKE -bzg -lye -uzC -eDX -pFE -cxx -xtZ -hJF -duG -lSa -lSa -rEd -lMJ -aaa -lMJ -lMJ -lMJ -lMJ -ruQ -gbO -lgo -lgo -qnC -sed -uzW -pud -sed -cQB -wOk -cRS -sed -rUh -fOL -sed -qnC -lgo -lgo -uIc -ruQ -lAu -aaa -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -lMJ -dUd -dUd -ilj -dUd -dUd -lMJ -dUd -dUd -ilj -nnT -nnT -lMJ -lMJ -aox -aaa -aaa -aaa -aaa -aaa -aox -aox -aox -vBr -mGx -avG -bXZ -bXZ -bXZ -fQO -fQO -atQ -atQ -atQ -atQ -atQ -atQ -fQO -fQO -fQO -utD -fQO -fQO -fQO -atQ -atQ -atQ -atQ -atQ -atQ -swD -fQO -lAu -waq -lAu -gUa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -lMJ -ras -dwD -oIp -kfn -pgT -jfz -edU -qmX -tuk -eKy -wCh -dtQ -dSC -lye -kHI -evv -fsc -jIO -lMJ -kZg -iNH -xuL -jiR -rEd -lMJ -aaa -rrt -lAu -lAu -lMJ -ruQ -gbO -gbO -lgo -fEA -sEX -fFm -cSA -tmH -cSW -cSW -cSW -vKs -fmF -nXj -ycZ -vBv -lgo -uIc -uIc -ruQ -lAu -aaa -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -gvH -aaa -aaa -tdK -tdK -vBr -bXZ -aaa -aaa -aaa -rrt -ycg -ycg -ycg -ycg -ycg -ycg -aaa -aaa -aaa -aox -aaa -aaa -aaa -ycg -ycg -ycg -ycg -ycg -ycg -fwP -lMJ -aaa -aaa -aaa -lMJ -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -ras -ras -ras -sSw -fiG -nfv -rRg -ras -nfv -sbG -poh -uuF -elN -wLr -mLX -wCh -lye -txN -mPJ -tJu -uyD -gQf -cbn -vof -iqk -lSa -rEd -lMJ -aaa -rrt -aox -aox -aox -ogg -ogg -gbO -lgo -eEh -uzN -vyl -opp -uzL -dcQ -tPr -cSb -dcT -dcT -epI -eMR -lpz -lgo -uIc -ogg -ogg -lMJ -lMJ -tpu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -tDm -xfJ -xfJ -aaa -aaa -aox -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -lMJ -aaa -aox -bXZ -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -lMJ -lMJ -lMJ -quc -lMJ -lMJ -lMJ -dgu -dgm -dgu -dgu -dgm -dgu -aaa -lMJ -aaa -aaa -aaa -lMJ -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -ras -vEF -pDz -xTd -dtK -rTy -lSX -hct -nfv -nfv -dFQ -kMU -elN -ujE -fTh -uMK -bvZ -uzC -oYR -sxZ -jIO -lMJ -rEd -rEd -rEd -rEd -rEd -lMJ -aaa -aaa -aaa -rrt -aaa -aaa -ruQ -gbO -lgo -wXH -kWM -wnQ -aYQ -dHr -knF -dcT -rUu -sak -fFc -ffm -cpM -wXH -lgo -uIc -ruQ -lAu -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -rrt -lMJ -lMJ -dUd -dUd -ilj -dUd -dUd -lMJ -dUd -dUd -tDm -dUd -dUd -lMJ -lMJ -quc -aaa -aaa -aaa -aaa -aaa -quc -lMJ -lMJ -bOG -lMJ -aox -aaa -aaa -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aox -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -aaa -lMJ -aaa -aav -aaa -lMJ -twf -lMJ -lMJ -rUb -gFb -aaa -aaa -nul -qyJ -dtK -dtK -dtK -dtK -hZp -dtK -dtK -nfv -nfv -gUr -elN -wqQ -ajk -vXU -lye -uzC -qll -pFE -cxx -xtZ -hJF -iTe -beJ -beJ -rEd -lMJ -aaa -aaa -aaa -rrt -aaa -aaa -ruQ -gbO -lgo -cSn -cSn -uvn -ffm -iMD -wnQ -qcr -ffm -vVp -wnQ -dbt -cSn -cSn -lgo -uIc -ruQ -lAu -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -tDm -xfJ -xfJ -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aox -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -rrt -quc -aaa -gFa -aaa -quc -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -nul -nby -dtK -auA -sce -gUz -sce -bja -dtK -tla -ras -jaI -tHX -epW -wCh -uzC -lye -uzC -rCr -sxZ -jIO -lMJ -kZg -mld -tmf -vKn -rEd -lMJ -aaa -aaa -aaa -rrt -rrt -rrt -ogg -gbO -lgo -rOZ -wUy -uvn -dbt -cSn -uvn -ujh -dbt -cSy -uvn -dbt -wUy -gAH -lgo -uIc -ogg -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -rrt -aaa -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -xfJ -xfJ -ilj -xfJ -xfJ -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aox -lMJ -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -lMJ -lMJ -lMJ -quc -lMJ -lMJ -lMJ -dgu -dgm -dgu -dgu -dgm -dgu -rrt -lMJ -aaa -aaa -aaa -aaa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -ras -kyP -dtK -tvG -bEN -vlR -qQt -gFw -dtK -dtK -idO -nuU -wsw -hwW -wCh -lye -hjv -anN -pdr -tJu -uyD -gQf -cbn -eoM -tJD -beJ -rEd -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -ogg -gbO -lgo -lgo -lgo -lgo -kJL -cSn -uvn -ujh -dbt -cSn -qVz -lgo -lgo -lgo -lgo -uIc -ogg -aaa -aaa -aaa -aaa -lKu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -lMJ -lMJ -dUd -dUd -dUd -dUd -dUd -lMJ -dUd -dUd -dUd -dUd -dUd -lMJ -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aox -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -rrt -aaa -aaa -aaa -aaa -aaa -twf -aaa -aaa -aaa -aaa -aaa -aaa -ras -sIP -dtK -haX -cII -fnS -tjy -gFw -oZB -dtK -nfv -wtl -qvf -caT -uuF -lye -gKE -nQE -lwZ -sxZ -jIO -lMJ -rEd -rEd -rEd -rEd -rEd -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -ogg -gbO -gbO -iLI -mfg -lgo -ffo -yaz -mNH -ujh -kpA -kGb -bhc -lgo -biF -uIc -uIc -vzQ -ogg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -lMJ -aaa -aox -aaa -aaa -aaa -aaa -aaa -aox -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aox -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aaa -aaa -aaa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -ras -gjU -dtK -tvG -qQt -iqE -bEN -gFw -dtK -cvK -mDP -oCK -lye -mdd -riu -sMi -lyp -jFt -hRj -pwF -cxx -xtZ -hJF -xXU -jxI -jxI -rEd -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -ogg -cTA -cTA -cTA -vKp -atw -ffo -oRj -vuB -jFo -qQD -hqx -ffo -jDi -uIc -cTA -cTA -tRg -ogg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aWl -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -aWl -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -lMJ -lMJ -lMJ -quc -lMJ -lMJ -lMJ -dgu -dgm -dgu -dgu -dgm -dgu -rrt -iGq -bbT -aaf -vDl -lMJ -oAQ -lMJ -lMJ -rUb -gFb -aaa -aaa -nul -dtK -dtK -yii -wYQ -eNT -wYQ -bPh -dtK -rvz -sSw -tyK -lye -caT -uuF -lye -lye -pSO -wSd -sxZ -jIO -lMJ -kZg -jcZ -jxI -qQV -rEd -lMJ -nYJ -lMJ -rrt -rrt -rrt -lMJ -ogg -ogg -fWI -cTA -lcF -xfs -xMW -hve -xMW -hEM -xMW -hve -dmT -xfs -uPG -cTB -tms -ogg -ogg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -dgu -dgm -dgu -dgu -dgm -dgu -aaa -aaa -aaa -aox -aaa -aaa -aaa -dgu -dgm -dgu -dgu -dgm -dgu -rrt -aaa -out -aaa -aaa -aaa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -nul -nul -dtK -dtK -dtK -dtK -jwu -cvK -cvK -ahK -ras -ecy -vZz -caT -peE -mwM -rUd -wIt -ozI -qYx -uqY -hwg -hgn -lPu -jeT -jxI -rEd -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -ogg -ogg -ogg -xJT -ogg -ffo -cSn -cSn -faz -cSn -cSn -ffo -ogg -hyr -ogg -ogg -ogg -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -pat -baz -pat -baz -pat -baz -aaa -aaa -aaa -quc -aaa -aaa -aaa -pat -baz -pat -baz -pat -baz -rrt -aaa -aaa -aaa -aaa -aaa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nul -nul -dtK -dtK -urP -dtK -nby -wvB -gql -ras -xsw -grx -cWt -sMi -sMi -mmJ -hnF -jvV -qZk -ckH -lMJ -rEd -rEd -rEd -rEd -rEd -lMJ -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -ogg -osq -dxp -kJe -ffo -sQe -cSn -faz -cSn -cSn -ffo -jsI -uDu -kJe -ogg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -rrt -rrt -rrt -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -rrt -rrt -rrt -rrt -rrt -aaa -aaa -bug -aaa -aaa -aaa -oAQ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nul -nul -ras -ras -ras -ras -ras -ras -ras -ckH -ckH -mGr -dpd -dpd -mJK -lQF -xDT -pob -tDH -kuD -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -rrt -nYJ -rrt -rrt -rrt -lMJ -lMJ -ogg -eoW -cTA -tms -ffo -hpO -cSn -pLh -mgL -kHd -ffo -qic -xSK -cTA -ogg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -rUb -iGq -lMJ -lMJ -oAQ -lMJ -lMJ -rUb -gFb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -quc -lMJ -nRb -wBI -nRb -lMJ -ckH -ckH -bDi -tMk -oLe -ckH -ckH -ckH -ckH -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -rEp -ogg -ruQ -ruQ -ffo -cSn -cSn -cSn -cSn -cSn -ffo -ruQ -ruQ -ogg -rEp -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -twf -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -lJW -ckH -ckH -eYf -ckH -ckH -kph -uDd -abq -aaa -nYJ -aaa -aaa -aaa -nYJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -lAu -lMJ -ffo -ffo -jur -mfD -rvv -ffo -ffo -lMJ -lAu -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lKu -aaa -aaa -oAQ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -nRb -lMJ -aaa -qoI -fZQ -igr -kfm -igr -jcs -gBU -jNp -xQU -lMJ -rrt -rrt -rrt -rrt -rrt -lMJ -lMJ -rrt -rrt -lAu -rrt -rrt -rrt -rrt -rrt -rrt -lMJ -lMJ -lMJ -ffo -ffo -ffo -ffo -ffo -iIb -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -fva -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -igr -hFj -igr -lMJ -lMJ -lMJ -lMJ -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -lMJ -lMJ -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -fva -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lKu -aaa -aaa -lMJ -lAu -lMJ -lAu -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aLI -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nRb -wBI -nRb -dPw -fVZ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -rrt -rrt -rrt -rrt -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -lMJ -aaa -lMJ -aaa -lMJ -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -qzs -tGt -msL -msL -rgG -msL -msL -msL -exi -qzs -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -jLw -aaa -lMJ -aaa -jLw -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -dmV -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -fva -aaa -aaa -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -yib -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -gQZ -lMJ -lMJ -lMJ -lMJ -lMJ -lMJ -pSS -lMJ -lMJ -lMJ -aox -lMJ -anS -wBI -anS -lMJ -aox -lMJ -aox -dJN -aox -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lAu -bno -qzs -brO -mJI -aaa -aox -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -ceP -lAu -qzs -lAu -xCF -aaa -aox -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -lMJ -aox -aox -lMJ -eUu -aaf -qzs -aaf -eUu -lMJ -aox -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aMq -qjC -qjC -aOV -blw -aNw -ajl -aNw -qot -aaa -lMJ -aaa -nRb -wBI -nRb -lMJ -quc -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aMq -pyP -pyP -aOV -aMq -xct -jBb -ero -aOV -aaa -aaa -aaa -lMJ -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -vAC -qmR -cUI -vAC -rUb -iwp -hml -lHp -rUb -aaa -lMJ -aaa -lMJ -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aSD -xew -pyP -aOX -bly -gMA -xXK -skt -aOX -aNw -aTQ -aNw -lMJ -nRb -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aNw -aNw -aNw -tJV -iKh -wCz -olg -tRm -tRm -eGd -vyM -gey -tRm -tRm -tRm -icG -bjk -anS -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aNw -aTQ -mOA -aTQ -aSD -tTu -rHO -rHO -rHO -rHO -rHO -rHO -mtR -aVk -aOY -aOY -aSG -gMA -neG -rHz -xTX -aOY -bcQ -lTt -ivL -mOA -aTQ -aNw -aNw -aNw -aNw -aNw -aNw -aNw -jMp -aNw -aNw -jMp -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -jLw -lMJ -azY -rUb -lMJ -lMJ -aMr -tmO -rHO -rHO -rHO -rHO -rGG -aVk -aOY -aOY -aOY -aOY -aOY -cTo -aaa -aaa -aaa -osc -lps -mjH -gCS -xTX -aaa -aMq -vKf -rHO -rHO -rHO -rHO -kLG -kLG -ndb -kLG -kLG -kLG -kLG -rHO -rHO -hLx -bBb -lMJ -lMJ -rUb -hHO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aMq -qbF -cAn -ops -aNC -aOY -cTo -aaa -aaa -aaa -aaa -aaa -aaa -cTo -aaa -aaa -cTo -cTo -cTo -iRY -cTo -cTo -aaa -aaa -cTo -aNC -ops -aNC -aOY -aOY -aOY -cTo -aOY -aOY -aNC -ops -aNC -bcQ -qbF -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -rrt -aaa -aaa -aMq -qbF -btK -anS -lMJ -lMJ -cTo -aaa -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -evI -abR -pfe -cok -cTo -xTX -aaa -cTo -dPw -omL -dPw -aaa -aaa -aaa -cTo -aaa -aaa -lMJ -anS -lMJ -aMr -qbF -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aMq -qbF -vvv -anS -anS -anS -cTo -cTo -cTo -sqf -sqf -sqf -cTo -cTo -cTo -cTo -ttA -omF -bnx -vjA -hOl -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -xTX -xTX -xMA -anS -anS -tXy -qbF -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aMq -qbF -aOV -aaa -aaa -cTo -cTo -sqf -sqf -sqf -xjb -sqf -sqf -sqf -sqf -sqf -ttA -tri -bny -pfe -brY -uBD -uBD -uBD -uBD -uBD -aVy -bEf -bGc -oXu -bJg -cTo -cTo -cTo -cTo -lMJ -lMJ -aMr -vCa -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aNw -aSD -qbF -aOV -aaa -aaa -cTo -sqf -aVl -oFC -phN -jEr -lro -odP -aVl -jGa -xkT -aAp -aAp -aAp -dTq -aAp -uBD -vEx -bGh -cbI -bAU -aVy -bEg -bGd -bGd -bJm -bNX -kxn -bOc -cTo -aaa -aaa -aMq -vCa -bAT -aNw -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aMq -vFk -qim -oqn -aOV -aaa -cTo -cTo -sLz -xQJ -uaE -uaE -tHT -uUX -uUX -uUX -azv -dKG -aAp -hac -pQv -tSP -pce -uBD -cqB -bxn -bzo -rRe -aVy -bEh -bGe -bGd -bKL -bNY -bGd -ceC -cTo -xTX -aaa -aMq -cVP -qim -vCy -bgn -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aMq -jMP -iQr -oqn -aOV -aaa -cTo -cTo -sLz -aVn -aWN -sqf -qeQ -sqf -sqf -aWN -uUX -bio -aAp -blF -bnB -tSP -bsb -uBD -bvw -yex -bxq -bJh -gYq -gYq -gYq -sbk -bGd -bGd -bGd -bUL -aVy -cTo -cTo -bly -cVP -uKj -oqn -bgn -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -cTo -nFL -ddc -dMu -wJv -jZC -lzc -lzc -wgB -nGv -aWO -nOI -lup -wPo -sqf -rYA -mHA -aGQ -gkq -xVb -hAU -jvO -wNm -vdb -qct -qct -ugu -mbK -oHh -lhR -ozJ -vDX -bKM -bKO -yfd -yfd -dII -cff -fMJ -gPX -eNh -orU -ixw -cTo -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aMq -jMP -iQr -oqn -aOV -aaa -cTo -cTo -sLz -xGF -iCV -sqf -tUF -sqf -sqf -tfz -wjG -bnG -aAp -nSs -bnD -tSP -bsd -uBD -qFO -bxq -wlD -bAY -gYq -gYq -gYq -pVO -fOJ -fOJ -fOJ -yjO -aVy -cTo -cTo -bcQ -cVP -uKj -oqn -bgn -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aMq -jqB -wmB -oqn -aOV -aaa -cTo -cTo -sLz -xyp -kLg -kLg -sOS -iCV -iCV -iCV -pSe -pIE -aAp -kxq -rNs -tSP -nMF -uBD -oeg -bxr -bzs -pAV -aVy -bEj -bGe -bGd -bKP -bOb -bMr -cho -cTo -xTX -aaa -aMq -cVP -wmB -uOm -bgn -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aOY -bcQ -oDr -aOV -aaa -aaa -cTo -sqf -aVr -iZN -oDc -hyZ -rZy -iZN -aVr -nGV -ubB -aAp -aAp -aAp -txh -aAp -uBD -vmM -bxs -bzt -xNk -aVy -bEg -bGd -bGd -bKN -bOa -jTC -chn -cTo -aaa -aaa -aMq -vCa -aVk -aOY -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMq -nNL -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 -rrt -aaa -aaa -aMq -oDr -aOV -aaa -aaa -cTo -cTo -sqf -sqf -sqf -sLN -sqf -sqf -sqf -sqf -sqf -gyI -sVx -pWR -lnX -asz -uBD -uBD -uBD -uBD -uBD -aVy -bEk -bGf -iMy -bJn -cTo -cTo -cTo -cTo -aaa -aaa -aMq -vCa -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMq -htS -nNL -nNL -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 -rrt -aaa -aaa -aMq -oDr -aOV -aaa -aaa -aaa -cTo -cTo -cTo -sqf -sqf -sqf -cTo -cTo -cTo -cTo -gyI -xgE -uFw -tXz -hTt -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -xTX -xTX -aaa -aaa -aaa -aMq -vCa -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nNL -nNL -nNL -nNL -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 -rrt -aaa -aaa -aMq -oDr -aOV -aaa -aaa -aaa -cTo -aaa -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -cTo -gEv -xkw -ryJ -fMT -cTo -xTX -aaa -cTo -aaa -aaa -aaa -aaa -aaa -aaa -cTo -aaa -aaa -aaa -aaa -aaa -aMq -vCa -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -nNL -nNL -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 -rrt -aaa -aaa -aMq -oDr -aOX -aNw -aNw -aNw -cTo -aaa -aaa -aaa -aaa -aaa -aaa -cTo -aaa -aaa -cTo -ipR -ktW -wuM -vVE -cTo -aaa -aaa -cTo -aNw -aNw -aNw -aNw -aNw -aNw -cTo -aNw -aNw -aNw -aNw -aNw -bly -vCa -bgn -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -jLw -lMJ -azY -rUb -lMJ -lMJ -aMr -sTF -rHO -rHO -rHO -rHO -mGk -aOX -aNw -aNw -aNw -aNw -aNw -cTo -aaa -aaa -cTo -cTo -cTo -ikC -cTo -cTo -aaa -aMq -bbO -rHO -rHO -rHO -rHO -rHO -rHO -wLC -kLG -kLG -kLG -kLG -kLG -kLG -rVB -bBb -lMJ -lMJ -rUb -hHO -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -aNC -aOY -aOY -aOY -aSG -vOO -rHO -rHO -rHO -rHO -rHO -rHO -eRF -bgn -aaa -aaa -aaa -aMq -nTJ -bgn -aaa -aaa -aMq -vCa -aVk -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aNC -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aNC -aOY -aOY -aOY -aOY -aOY -bcQ -vCa -bgo -aNw -aNw -aNw -aSD -onr -bsj -aNw -aNw -bly -vCa -bgn -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aMq -hZm -rHO -rHO -rHO -rHO -rHO -fTo -rHO -rHO -rHO -rHO -uOm -bgn -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aNC -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aOY -aNC -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -lMJ -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -lMJ -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -rrt -rrt -rUb -rrt -rrt -rrt -rrt -rUb -rrt -rrt -rrt -rrt -rrt -rrt -rUb -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rUb -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rrt -rUb -rrt -rrt -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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 -sKY -aaa -aaa -aaa -aaa -wkv -aaa -aaa -aaa -aaa -aaa -aaa -sKY -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -sKY -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -sKY -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -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/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm deleted file mode 100644 index 419c5b52c1f1..000000000000 --- a/_maps/map_files/Mining/Lavaland.dmm +++ /dev/null @@ -1,70146 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/closed/indestructible/riveted/boss, -/area/lavaland/surface/outdoors) -"ac" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ad" = ( -/turf/closed/mineral/random/high_chance/volcanic, -/area/lavaland/surface/outdoors) -"af" = ( -/obj/structure/necropolis_gate/legion_gate, -/obj/structure/necropolis_arch, -/obj/structure/stone_tile/slab, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ai" = ( -/turf/closed/mineral/random/volcanic, -/area/lavaland/surface/outdoors) -"aj" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"ak" = ( -/turf/closed/mineral/random/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/machinery/computer/shuttle/labor/one_way{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ap" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/laborcamp) -"aq" = ( -/turf/closed/wall, -/area/mine/laborcamp) -"ar" = ( -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"as" = ( -/obj/machinery/shower{ - pixel_y = 22 - }, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"at" = ( -/obj/machinery/shower{ - pixel_y = 22 - }, -/obj/item/soap/nanotrasen, -/obj/item/bikehorn/rubberducky/plasticducky, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"av" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aw" = ( -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"ay" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - dir = 8; - name = "old sink"; - pixel_x = 12 - }, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"az" = ( -/turf/open/floor/iron, -/area/mine/laborcamp) -"aB" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Showers" - }, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"aE" = ( -/obj/machinery/vending/sustenance, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aF" = ( -/obj/machinery/door/airlock{ - name = "Labor Camp Library" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aG" = ( -/obj/structure/table, -/obj/item/plate, -/obj/item/kitchen/fork, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aH" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - pixel_x = 3 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aJ" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restroom" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/seeds/wheat, -/obj/item/seeds/wheat, -/obj/item/seeds/tomato, -/obj/item/seeds/onion, -/obj/item/seeds/garlic, -/obj/item/seeds/carrot, -/obj/item/seeds/ambrosia, -/obj/item/seeds/apple, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aV" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/iron, -/area/mine/eva) -"aW" = ( -/obj/machinery/biogenerator, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/structure/window/reinforced{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"aY" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Shuttle Security Airlock"; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"aZ" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/north{ - id = "labor"; - name = "Labor Camp Lockdown"; - req_access_txt = "2" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ba" = ( -/obj/machinery/door/poddoor/preopen{ - id = "labor"; - name = "labor camp blast door" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bc" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/carrot, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"bd" = ( -/obj/machinery/mineral/processing_unit_console, -/turf/closed/wall, -/area/mine/laborcamp) -"be" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/item/seeds/soya, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"bf" = ( -/turf/closed/wall, -/area/mine/eva) -"bg" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/eva) -"bh" = ( -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"bi" = ( -/obj/structure/gulag_beacon, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bj" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bk" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bl" = ( -/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, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/plant_analyzer, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"bm" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/onion, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"bn" = ( -/turf/closed/wall, -/area/mine/mechbay) -"bo" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/mechbay) -"bp" = ( -/obj/machinery/mech_bay_recharge_port, -/turf/open/floor/plating, -/area/mine/mechbay) -"bq" = ( -/turf/closed/wall, -/area/mine/production) -"br" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/production) -"bs" = ( -/obj/structure/table, -/obj/item/pickaxe, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/item/gps/mining, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/iron, -/area/mine/eva) -"bt" = ( -/obj/machinery/suit_storage_unit/mining, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/eva) -"bu" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/suit_storage_unit/mining, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/light_switch/directional/east, -/turf/open/floor/iron, -/area/mine/eva) -"bw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"bB" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/mine/laborcamp/security) -"bC" = ( -/obj/machinery/computer/shuttle/mining{ - req_access = null - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/mine/production) -"bE" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/production) -"bF" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/mine/eva) -"bH" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/mine/eva) -"bI" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/eva) -"bJ" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/eva) -"bK" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/mine/eva) -"bL" = ( -/obj/machinery/door/airlock/highsecurity{ - name = "Labor Camp Monitoring"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"bM" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"bN" = ( -/obj/structure/sign/warning/docking, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/production) -"bP" = ( -/turf/open/floor/iron, -/area/mine/production) -"bQ" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"bW" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/eva) -"bY" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/eva) -"bZ" = ( -/turf/closed/mineral/random/volcanic, -/area/lavaland/surface/outdoors/explored) -"ca" = ( -/turf/closed/wall, -/area/mine/laborcamp/security) -"cb" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/table, -/obj/item/restraints/handcuffs, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cc" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/mob/living/simple_animal/bot/secbot/beepsky{ - desc = "Powered by the tears and sweat of laborers."; - name = "Prison Ofitser" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cf" = ( -/obj/machinery/computer/secure_data, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cg" = ( -/obj/machinery/computer/security/labor, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"ch" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"cn" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"cp" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/eva) -"cq" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/eva) -"cs" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/eva) -"ct" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/eva) -"cw" = ( -/obj/item/bikehorn{ - color = "#000"; - desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks."; - name = "charred bike horn" - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"cB" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cC" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cD" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"cF" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"cG" = ( -/obj/machinery/light/directional/west, -/obj/structure/closet/secure_closet/freezer/gulag_fridge, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"cH" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"cI" = ( -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"cJ" = ( -/obj/machinery/door/airlock{ - name = "Closet" - }, -/turf/open/floor/plating, -/area/mine/production) -"cK" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/plating, -/area/mine/production) -"cL" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/mine/production) -"cM" = ( -/turf/closed/wall, -/area/mine/living_quarters) -"cO" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/mine/production) -"cP" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/mine/production) -"cQ" = ( -/turf/closed/wall/r_wall, -/area/mine/maintenance) -"cR" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cS" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cT" = ( -/obj/machinery/light/small/directional/north, -/obj/structure/closet/crate/secure/loot, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cU" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cV" = ( -/turf/open/floor/plating, -/area/mine/living_quarters) -"cW" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/mine/living_quarters) -"cY" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"cZ" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"db" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/mine/production) -"dc" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot, -/obj/item/food/mint, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/mine/production) -"dd" = ( -/obj/structure/table, -/obj/item/paper/fluff/stations/lavaland/orm_notice, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/mine/production) -"de" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/mine/production) -"df" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/mine/production) -"dg" = ( -/turf/open/floor/circuit, -/area/mine/maintenance) -"dj" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/dark, -/area/mine/maintenance) -"dk" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/circuit, -/area/mine/maintenance) -"dl" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/iv_drip, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"dm" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"do" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dq" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"dr" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/mine/living_quarters) -"ds" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) -"du" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/bot, -/obj/item/coin/gold, -/turf/open/floor/iron, -/area/mine/production) -"dv" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"dw" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/delivery, -/turf/open/floor/iron, -/area/mine/production) -"dy" = ( -/obj/structure/table, -/obj/item/storage/medkit/toxin{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"dC" = ( -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"dD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"dF" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/binary/pump/on, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dJ" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"dM" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron, -/area/mine/production) -"dO" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/mine/production) -"dP" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Communications"; - req_access_txt = "48" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/maintenance) -"dQ" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dR" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Infirmary" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"dS" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Mining Station Maintenance"; - req_access_txt = "48" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/layer_manifold, -/turf/open/floor/plating, -/area/mine/living_quarters) -"dT" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"dU" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/production) -"dV" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/mine/production) -"dW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/mine/production) -"dX" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "mining_internal"; - name = "mining conveyor" - }, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"dY" = ( -/obj/machinery/conveyor{ - id = "mining_internal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/mine/production) -"dZ" = ( -/turf/open/floor/iron, -/area/mine/living_quarters) -"ea" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eb" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ec" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ee" = ( -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ef" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eh" = ( -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ei" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ek" = ( -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/living_quarters) -"em" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"en" = ( -/obj/machinery/mineral/processing_unit_console, -/turf/closed/wall, -/area/mine/production) -"eo" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/mine/production) -"eq" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"et" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"eC" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"eJ" = ( -/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/iron, -/area/mine/production) -"eL" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eM" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eO" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eP" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"eQ" = ( -/obj/machinery/door/airlock/glass, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eR" = ( -/obj/machinery/door/airlock/glass{ - name = "Break Room" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"eS" = ( -/obj/machinery/mineral/equipment_vendor, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/mine/production) -"eT" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"eU" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"eW" = ( -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/production) -"eX" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal" - }, -/obj/structure/plasticflaps, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/mine/production) -"eY" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "mining_internal" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/mine/production) -"eZ" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "mining_internal" - }, -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating, -/area/mine/production) -"fa" = ( -/obj/structure/chair, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fb" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/structure/chair, -/obj/structure/extinguisher_cabinet/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fc" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fj" = ( -/obj/machinery/vending/snack, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fk" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fm" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/newscaster/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fn" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fp" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fq" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fr" = ( -/obj/structure/table, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"fu" = ( -/obj/structure/chair, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fv" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fy" = ( -/obj/structure/table, -/obj/item/clothing/glasses/meson, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/mining_scanner, -/obj/item/flashlight, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fB" = ( -/obj/structure/displaycase, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fF" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fG" = ( -/obj/structure/table, -/obj/item/storage/box/donkpockets, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fI" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/item/radio/intercom/directional/west, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fK" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fL" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"fP" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"fQ" = ( -/turf/open/genturf, -/area/lavaland/surface/outdoors/unexplored/danger) -"fR" = ( -/turf/closed/mineral/random/high_chance/volcanic, -/area/lavaland/surface/outdoors/unexplored) -"fV" = ( -/turf/closed/indestructible/riveted/boss/see_through, -/area/lavaland/surface/outdoors) -"fW" = ( -/obj/structure/necropolis_gate/locked, -/obj/structure/stone_tile/slab, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"gd" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/mine/production) -"gj" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/center, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"gk" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"gn" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/living_quarters) -"go" = ( -/obj/structure/stone_tile/block, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"gt" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/recharge_floor, -/area/mine/mechbay) -"gC" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"gM" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"gO" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"gT" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron/dark, -/area/mine/maintenance) -"gX" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Public Shuttle Lobby"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/table, -/obj/item/gps/mining, -/obj/item/gps/mining, -/turf/open/floor/iron, -/area/mine/living_quarters) -"hg" = ( -/obj/structure/stone_tile/surrounding, -/obj/structure/stone_tile/center/cracked, -/mob/living/simple_animal/hostile/megafauna/legion, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"hr" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Crew Area"; - network = list("mine") - }, -/obj/machinery/computer/security/telescreen/entertainment/directional/south, -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"hs" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"hu" = ( -/obj/structure/stone_tile/block/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"hv" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"hJ" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"hL" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ia" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/production) -"id" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ip" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"iE" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Labor Camp External Airlock"; - req_access = null - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/mine/laborcamp) -"jj" = ( -/turf/open/floor/iron, -/area/mine/mechbay) -"jt" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ju" = ( -/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/iron, -/area/mine/living_quarters) -"jz" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 7; - id = "lavaland_common_away"; - name = "Mining base public dock"; - width = 7 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"jF" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"jH" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"jL" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"jN" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/center/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"jV" = ( -/obj/machinery/light/small/directional/east, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"jX" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp External West"; - network = list("labor") - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/laborcamp) -"kk" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"km" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - dir = 1; - name = "old sink"; - pixel_y = -5 - }, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"kn" = ( -/obj/machinery/conveyor_switch/oneway{ - id = "gulag"; - name = "labor camp conveyor" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"kr" = ( -/obj/machinery/door/airlock{ - id_tag = "miningdorm1"; - name = "Room 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"kt" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external{ - name = "Lavaland Shuttle Airlock"; - space_dir = 8 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ku" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/displaycase, -/turf/open/floor/iron, -/area/mine/living_quarters) -"kv" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"kz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/eva) -"kB" = ( -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"kD" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"kH" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/center/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"kI" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/mining/glass{ - name = "Processing Area"; - req_access_txt = "48" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"kJ" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/center, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"kO" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"lf" = ( -/obj/machinery/door/airlock{ - id_tag = "miningdorm3"; - name = "Room 3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"ls" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lv" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lw" = ( -/obj/structure/stone_tile/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"ly" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lz" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lC" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/block, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"lD" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lE" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lF" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lI" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lO" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"lQ" = ( -/obj/structure/stone_tile/surrounding/cracked{ - dir = 6 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lS" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lW" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"lZ" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mb" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"md" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"mj" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"ml" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mq" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mr" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ms" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mv" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mw" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mx" = ( -/obj/structure/stone_tile, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mC" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) -"mQ" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mS" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mV" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mW" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mX" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mY" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"mZ" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"nb" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"nc" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ne" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"nf" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"ng" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/indestructible/boss, -/area/lavaland/surface/outdoors) -"nm" = ( -/obj/structure/sink/kitchen{ - desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; - name = "old sink"; - pixel_y = 28 - }, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"no" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/living_quarters) -"nq" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/random/food_or_drink/donkpockets, -/turf/open/floor/iron, -/area/mine/laborcamp) -"nt" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/iron, -/area/mine/laborcamp) -"nz" = ( -/obj/machinery/light/small/directional/west, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/eva) -"nA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"nI" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/living_quarters) -"nM" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"nU" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "gulag" - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/plasticflaps, -/turf/open/floor/plating, -/area/mine/laborcamp) -"ob" = ( -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ok" = ( -/obj/structure/stone_tile/block, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"oB" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"oI" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/north{ - id = "miningdorm1"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"oK" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"oL" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external{ - name = "Lavaland Shuttle Airlock" - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"oO" = ( -/obj/structure/table, -/obj/item/gps/mining, -/obj/item/gps/mining, -/turf/open/floor/iron, -/area/mine/living_quarters) -"oS" = ( -/obj/structure/sign/poster/official/work_for_a_future{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"oU" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"oW" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"pa" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pd" = ( -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile/surrounding_tile{ - dir = 8 - }, -/obj/structure/stone_tile/center/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Labor Camp Operations"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"pl" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp Cell 1"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"pm" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pr" = ( -/obj/structure/toilet{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"pv" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Labor Camp External North"; - network = list("labor") - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/laborcamp) -"pz" = ( -/obj/structure/bed, -/obj/item/bedsheet/medical, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/camera/directional/east{ - c_tag = "Labor Camp Infirmary"; - network = list("labor") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"pE" = ( -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"pR" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"pT" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pU" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"pV" = ( -/obj/machinery/door/airlock{ - name = "Restroom" - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"pZ" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"qq" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"qs" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/cafeteria, -/area/mine/laborcamp) -"qt" = ( -/obj/structure/table, -/obj/item/cigbutt, -/turf/open/floor/iron, -/area/mine/living_quarters) -"qP" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ri" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"rj" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/living_quarters) -"rB" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) -"rG" = ( -/obj/machinery/door/airlock/public/glass{ - id_tag = "gulag1"; - name = "Cell 1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"rO" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"rR" = ( -/obj/machinery/recharge_station, -/turf/open/floor/iron, -/area/mine/mechbay) -"sa" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"sj" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/mine/production) -"sn" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"su" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"sH" = ( -/obj/structure/fluff/drake_statue, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"sK" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"sM" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/laborcamp/security) -"sU" = ( -/obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/production) -"sV" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"tj" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"tk" = ( -/obj/structure/closet/crate, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"ty" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"tI" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"tJ" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"tZ" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"uk" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"uB" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/sign/poster/official/report_crimes{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"uC" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"uE" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Processing Area Room"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/iron, -/area/mine/production) -"uG" = ( -/obj/machinery/light/directional/south, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"uV" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"vg" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"vh" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/sign/poster/official/twelve_gauge{ - pixel_y = 32 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"vj" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"vm" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Mining Shuttle Airlock"; - space_dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) -"vq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"vs" = ( -/obj/structure/sign/warning/docking{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"vy" = ( -/obj/machinery/computer/mechpad{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/mechbay) -"vL" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron, -/area/mine/laborcamp) -"vM" = ( -/obj/machinery/mineral/processing_unit{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/laborcamp) -"vP" = ( -/obj/structure/sign/poster/official/safety_report{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp Central"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"wa" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -1; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"we" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/unexplored) -"wg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/mine/living_quarters) -"wi" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"wj" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/tile/purple{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"wk" = ( -/obj/structure/closet/secure_closet/engineering_welding{ - req_access = list(54) - }, -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, -/area/mine/mechbay) -"wv" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"wB" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"wE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"wK" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Mining External Airlock"; - req_access = null - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron, -/area/mine/production) -"wQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/east, -/turf/open/floor/iron, -/area/mine/laborcamp) -"xi" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/closed/wall, -/area/mine/living_quarters) -"xn" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"xT" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"xU" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Labor Camp External Airlock"; - req_access = null - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/plating, -/area/mine/laborcamp) -"xV" = ( -/obj/machinery/computer/mech_bay_power_console, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/mine/mechbay) -"xX" = ( -/obj/structure/sign/departments/medbay/alt{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"yr" = ( -/turf/closed/wall/r_wall, -/area/mine/laborcamp) -"yy" = ( -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"yS" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile/block/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"zg" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"zo" = ( -/obj/machinery/computer/prisoner, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"zA" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/mineral/labor_points_checker{ - pixel_y = 25 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"zH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants{ - icon_state = "plant-05" - }, -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp Cellblock"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"zS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"zT" = ( -/obj/structure/cable, -/obj/effect/turf_decal/loading_area{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/mechbay) -"zX" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/structure/closet/secure_closet/labor_camp_security, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"Af" = ( -/obj/machinery/light/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Ai" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Au" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/sign/warning/gasmask{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Aw" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"AH" = ( -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"AU" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/eva) -"AW" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"Be" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"Bh" = ( -/obj/machinery/camera/directional/east{ - c_tag = "Communications Relay"; - network = list("mine") - }, -/turf/open/floor/circuit, -/area/mine/maintenance) -"Bj" = ( -/obj/machinery/door/airlock/public/glass{ - id_tag = "gulag2"; - name = "Cell 2" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Bt" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"BC" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"BO" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"BX" = ( -/obj/machinery/light/directional/east, -/obj/machinery/camera/directional/east{ - c_tag = "Shuttle Docking Foyer"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/newscaster/directional/east, -/turf/open/floor/iron, -/area/mine/production) -"BZ" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/glass{ - name = "Mining Station Bridge" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Cg" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Cn" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Co" = ( -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Dh" = ( -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/tile/brown, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Dm" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 3" - }, -/obj/structure/sign/poster/official/obey{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Dt" = ( -/obj/machinery/door/airlock/external/glass{ - name = "Mining External Airlock"; - req_access = null; - space_dir = 2 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/production) -"Dv" = ( -/obj/structure/sign/poster/official/obey{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Dy" = ( -/obj/structure/stone_tile/block{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"DN" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp External South"; - network = list("labor") - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/laborcamp) -"DY" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"Ef" = ( -/obj/effect/turf_decal/bot, -/obj/structure/ore_box, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"En" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"EC" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron, -/area/mine/production) -"EH" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"EK" = ( -/obj/machinery/conveyor{ - id = "gulag" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/laborcamp) -"EY" = ( -/obj/structure/closet/secure_closet/brig, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Fe" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = -12 - }, -/obj/structure/mirror/directional/west, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Fn" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ft" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Fv" = ( -/obj/machinery/camera/directional/west{ - c_tag = "EVA"; - network = list("mine") - }, -/obj/machinery/light/directional/west, -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/eva) -"FD" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/sign/poster/official/work_for_a_future{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 2" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"FE" = ( -/obj/structure/stone_tile/block, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"FF" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/mine/laborcamp/security) -"FM" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile/block{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"FO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/public/glass{ - id_tag = "cellblock1"; - name = "Labor Camp Operations" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"FW" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Gf" = ( -/obj/structure/ore_box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Gh" = ( -/obj/structure/table, -/obj/item/mecha_parts/mecha_equipment/drill, -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp{ - pixel_y = 4 - }, -/obj/effect/turf_decal/tile/purple, -/turf/open/floor/iron, -/area/mine/mechbay) -"Gn" = ( -/obj/item/kirbyplants/random, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Gz" = ( -/obj/machinery/door/airlock/public/glass{ - id_tag = "gulag3"; - name = "Cell 3" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"GA" = ( -/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/a_minus, -/obj/item/reagent_containers/blood/b_minus{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/reagent_containers/blood/b_plus{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/item/reagent_containers/blood/o_plus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/machinery/camera/directional/south{ - c_tag = "Outpost Infirmary"; - network = list("mine") - }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"GN" = ( -/obj/structure/table, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 5; - pixel_y = 3 - }, -/obj/item/tank/internals/emergency_oxygen, -/turf/open/floor/iron, -/area/mine/living_quarters) -"GQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"GR" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"GY" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Hd" = ( -/turf/closed/wall/r_wall, -/area/mine/laborcamp/security) -"Hi" = ( -/obj/machinery/washing_machine, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/cafeteria, -/area/mine/laborcamp) -"Hs" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/east{ - c_tag = "Labor Camp Library"; - network = list("labor") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"HF" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"HG" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/circuit, -/area/mine/maintenance) -"HM" = ( -/obj/structure/fence{ - dir = 4 - }, -/obj/effect/turf_decal/mining, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"HN" = ( -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"HO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"HX" = ( -/obj/structure/stone_tile/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Iq" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Monitoring"; - req_access_txt = "2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"Iv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Iy" = ( -/obj/docking_port/stationary{ - dir = 2; - dwidth = 11; - height = 22; - id = "whiteship_lavaland"; - name = "lavaland wastes"; - width = 35 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"IG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"IK" = ( -/obj/structure/toilet{ - dir = 8 - }, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"IL" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp Cell 3"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"IN" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"IO" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"IP" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"IR" = ( -/obj/structure/table, -/obj/item/paper, -/obj/item/pen, -/obj/machinery/light/small/directional/west, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/camera/directional/west{ - c_tag = "Labor Camp Cell 2"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"IS" = ( -/obj/machinery/camera/directional/west{ - c_tag = "Dormitories"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"IX" = ( -/obj/item/pickaxe, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Jd" = ( -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"Je" = ( -/obj/machinery/light/small/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Jf" = ( -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Jh" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/item/cultivator, -/obj/item/seeds/potato, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"JB" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 5 - }, -/obj/structure/stone_tile/slab/cracked{ - dir = 10 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"JM" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/directional/south{ - c_tag = "Labor Camp Showers"; - network = list("labor") - }, -/turf/open/floor/iron/freezer, -/area/mine/laborcamp) -"JR" = ( -/obj/structure/stone_tile, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"JW" = ( -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"JX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/mine/eva) -"Kj" = ( -/obj/structure/stone_tile/slab/cracked, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Km" = ( -/obj/structure/cable, -/obj/machinery/door/airlock/glass{ - name = "Mining Station Bridge" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"Kt" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Kv" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/cable, -/obj/structure/table, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron, -/area/mine/eva) -"KD" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/iron/cafeteria, -/area/mine/laborcamp) -"KP" = ( -/obj/machinery/meter, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/mine/living_quarters) -"KS" = ( -/obj/machinery/door/airlock/medical/glass{ - name = "Infirmary" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"KT" = ( -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"KY" = ( -/obj/structure/cable, -/obj/machinery/bluespace_beacon, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/mine/maintenance) -"KZ" = ( -/obj/structure/stone_tile/slab/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/slab/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Lg" = ( -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Lr" = ( -/obj/machinery/door/window/right/directional/south, -/obj/machinery/shower{ - pixel_y = 22 - }, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Lu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/production) -"Lx" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"LH" = ( -/obj/structure/sign/poster/official/do_not_question{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"LL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/eva) -"Ma" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Na" = ( -/turf/closed/wall/r_wall, -/area/lavaland/surface/outdoors/explored) -"Nb" = ( -/obj/machinery/mechpad, -/turf/open/floor/iron, -/area/mine/mechbay) -"Nt" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Ny" = ( -/obj/machinery/door/airlock{ - name = "Restroom" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Nz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/laborcamp) -"NM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light_switch/directional/south, -/turf/open/floor/circuit, -/area/mine/maintenance) -"NS" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/structure/closet/crate, -/obj/item/dice/d4, -/turf/open/floor/iron, -/area/mine/production) -"Op" = ( -/obj/structure/stone_tile/slab, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"OI" = ( -/obj/structure/table, -/obj/item/toy/cards/deck, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"OQ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"OW" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Pa" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/red, -/obj/machinery/recharger, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"Pg" = ( -/obj/machinery/telecomms/relay/preset/mining, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/mine/maintenance) -"Pj" = ( -/obj/structure/stone_tile/block/cracked, -/obj/structure/stone_tile/block/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Pl" = ( -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Pr" = ( -/obj/structure/chair/stool/directional/west, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Pt" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Px" = ( -/obj/effect/turf_decal/bot, -/obj/structure/ore_box, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"PE" = ( -/obj/structure/closet/crate/internals, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"PL" = ( -/obj/machinery/suit_storage_unit/mining, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/mine/eva) -"PS" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/newscaster/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"PZ" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"Qa" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"Qc" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/south{ - id = "miningbathroom"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Qg" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/flashlight, -/obj/item/pickaxe, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Qj" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron, -/area/mine/production) -"Qo" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/book/manual/chef_recipes{ - pixel_x = 2; - pixel_y = 6 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Qv" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Labor Camp Shuttle Prisoner Airlock"; - space_dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Qw" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"QE" = ( -/obj/structure/bed{ - dir = 4 - }, -/obj/item/bedsheet/brown{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"QJ" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"QO" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"QQ" = ( -/obj/structure/table, -/obj/item/storage/fancy/donut_box, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"QS" = ( -/obj/structure/stone_tile/block{ - dir = 8 - }, -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Rd" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Rx" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) -"Ry" = ( -/obj/structure/fence{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"RE" = ( -/obj/machinery/shower{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/turf/open/floor/iron, -/area/mine/production) -"RH" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Mining External Airlock"; - req_access_txt = "48" - }, -/turf/open/floor/iron, -/area/mine/eva) -"RJ" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/living_quarters) -"RT" = ( -/obj/machinery/door/airlock/mining/glass{ - name = "Mining Station EVA"; - req_access_txt = "54" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/eva) -"Sd" = ( -/obj/machinery/hydroponics/constructable, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/decal/cleanable/dirt, -/obj/item/seeds/redbeet, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"Sf" = ( -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"Sg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/public/glass{ - id_tag = "cellblock1"; - name = "Labor Camp Cellblock" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Sh" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Mining External Airlock"; - req_access_txt = "48" - }, -/turf/open/floor/iron, -/area/mine/eva) -"Si" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"So" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/north{ - id = "miningdorm2"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"Sp" = ( -/obj/structure/table, -/obj/item/storage/medkit/regular, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"SJ" = ( -/obj/structure/statue{ - desc = "A lifelike statue of a horrifying monster."; - dir = 8; - icon = 'icons/mob/lavaland/lavaland_monsters.dmi'; - icon_state = "goliath"; - name = "goliath" - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"SM" = ( -/turf/open/floor/plating, -/area/mine/laborcamp/security) -"SS" = ( -/obj/machinery/camera/autoname/directional/south{ - network = list("mine") - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Tb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/item/radio/intercom/directional/north{ - prison_radio = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"To" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Crew Area Hallway East"; - network = list("mine") - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Tp" = ( -/obj/structure/chair/stool/directional/south, -/obj/structure/sign/poster/official/obey{ - pixel_y = 32 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/machinery/flasher/directional/west{ - id = "GulagCell 1" - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"TC" = ( -/obj/structure/cable, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/mine/living_quarters) -"TG" = ( -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"TI" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/camera/directional/south{ - c_tag = "Labor Camp Security Office"; - network = list("labor") - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"TL" = ( -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/mine/living_quarters) -"TP" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"TQ" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Mining Shuttle Airlock"; - space_dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/production) -"Uc" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 8 - }, -/obj/structure/stone_tile{ - dir = 1 - }, -/obj/structure/stone_tile, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ui" = ( -/obj/structure/stone_tile/block{ - dir = 1 - }, -/obj/structure/stone_tile, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ur" = ( -/obj/structure/bookcase, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Uv" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/cafeteria, -/area/mine/laborcamp) -"Ux" = ( -/obj/structure/stone_tile{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"UA" = ( -/obj/machinery/light/small/directional/south, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/laborcamp) -"UC" = ( -/obj/machinery/door/airlock/research/glass{ - name = "Mining Station Mech Bay"; - req_access_txt = "54" - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/mine/mechbay) -"UH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"UJ" = ( -/obj/machinery/vending/security{ - onstation_override = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp/security) -"UO" = ( -/obj/machinery/mineral/unloading_machine{ - dir = 1; - icon_state = "unloader-corner"; - input_dir = 1; - output_dir = 2 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/laborcamp) -"UR" = ( -/obj/structure/stone_tile/block/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Va" = ( -/obj/structure/fluff/drake_statue/falling, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ve" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Vm" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/iron, -/area/mine/production) -"Vo" = ( -/obj/structure/stone_tile{ - dir = 8 - }, -/obj/structure/stone_tile/cracked{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"VA" = ( -/obj/machinery/seed_extractor, -/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/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/dark, -/area/mine/laborcamp) -"VP" = ( -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"VQ" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 3; - height = 10; - id = "mining_away"; - name = "lavaland mine"; - width = 7 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"VW" = ( -/obj/machinery/door/airlock{ - id_tag = "miningdorm2"; - name = "Room 2" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"VX" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plating, -/area/mine/living_quarters) -"We" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Ww" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 3 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high{ - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 1 - }, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, -/obj/effect/turf_decal/tile/purple, -/obj/machinery/camera/directional/south{ - c_tag = "Mech Bay"; - network = list("mine") - }, -/turf/open/floor/iron, -/area/mine/mechbay) -"WB" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/security/glass{ - name = "Labor Camp Shuttle Security Airlock"; - req_access_txt = "2" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"WH" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/obj/structure/stone_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"WI" = ( -/obj/structure/stone_tile{ - dir = 4 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"WR" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/iron, -/area/mine/living_quarters) -"WT" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Crew Area Hallway"; - network = list("mine") - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron, -/area/mine/living_quarters) -"Xb" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Xh" = ( -/obj/docking_port/stationary{ - dir = 8; - dwidth = 2; - height = 5; - id = "laborcamp_away"; - name = "labor camp"; - width = 9 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) -"Xt" = ( -/obj/effect/turf_decal/tile/purple, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron, -/area/mine/production) -"XP" = ( -/obj/structure/stone_tile/cracked, -/obj/structure/stone_tile/block{ - dir = 8 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"XV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/button/door/directional/north{ - id = "miningdorm3"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/carpet, -/area/mine/living_quarters) -"Yd" = ( -/obj/machinery/door/airlock{ - id_tag = "miningbathroom"; - name = "Restroom" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Yk" = ( -/obj/structure/stone_tile/center, -/obj/structure/stone_tile/surrounding_tile, -/obj/structure/stone_tile/surrounding_tile{ - dir = 4 - }, -/obj/structure/stone_tile/surrounding_tile/cracked{ - dir = 1 - }, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors) -"Ym" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/living_quarters) -"YJ" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/mine/laborcamp) -"YN" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external/glass{ - name = "Labor Camp Shuttle Prisoner Airlock" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"YV" = ( -/obj/structure/rack, -/obj/item/storage/bag/ore, -/obj/item/pickaxe, -/obj/item/flashlight, -/obj/item/clothing/glasses/meson, -/obj/item/mining_scanner, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"Zc" = ( -/obj/machinery/door/window/left/directional/south, -/obj/machinery/shower{ - pixel_y = 22 - }, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Zh" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/brown, -/obj/effect/turf_decal/tile/brown{ - dir = 8 - }, -/turf/open/floor/iron, -/area/mine/mechbay) -"Zk" = ( -/obj/machinery/conveyor{ - dir = 10; - id = "gulag" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/mine/laborcamp) -"Zr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/freezer, -/area/mine/living_quarters) -"Zs" = ( -/obj/machinery/light/small/directional/east, -/turf/open/floor/plating, -/area/mine/laborcamp) -"ZO" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/mine/laborcamp) -"ZX" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/mine/living_quarters) -"ZY" = ( -/obj/structure/ore_box, -/turf/open/misc/asteroid/basalt/lava_land_surface, -/area/lavaland/surface/outdoors/explored) - -(1,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(2,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(3,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ad -ad -ad -ad -ad -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(4,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -ai -ai -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(5,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -ai -ai -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(6,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -ai -KT -pU -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(7,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aw -aw -pU -KT -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -"} -(8,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -pU -pU -ad -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -ad -an -an -an -an -an -an -an -an -an -an -an -an -pU -pU -pU -an -an -pU -pU -an -an -an -an -an -an -an -an -an -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -aj -aj -aj -aw -aw -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -pU -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -pU -pU -aj -aj -aj -aj -aw -aw -aj -aj -aw -aw -aj -aj -aw -aj -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -pU -pU -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -pU -pU -an -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aw -aw -KT -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -aw -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -pU -aj -aj -aj -aj -aj -aj -aj -"} -(12,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -IO -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -aj -aj -aj -aj -aj -aj -aj -aj -an -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aw -aw -aw -KT -aw -aw -aw -aw -aw -KT -aw -aw -KT -aw -aw -aw -aj -aw -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -JR -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -pU -pU -aj -aj -aj -aj -aj -aj -pU -an -an -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -aj -aw -aw -aw -KT -KT -KT -KT -KT -KT -KT -KT -KT -aw -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -pU -pU -an -an -an -an -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aw -aw -aw -aw -KT -KT -KT -KT -KT -KT -KT -KT -KT -aw -aw -pU -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -pU -aj -aj -aj -aj -aj -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -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 -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 -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aw -aw -aw -aw -KT -KT -KT -KT -KT -KT -KT -KT -KT -aw -aw -aw -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -JB -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aw -aw -aw -KT -KT -KT -KT -KT -KT -KT -KT -KT -aw -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Op -ad -ad -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -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 -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 -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aw -aw -KT -KT -KT -KT -KT -KT -KT -Xh -KT -KT -KT -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -pU -aj -aj -aj -aj -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -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 -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 -pU -pU -aj -aj -aj -aj -aj -KT -aj -aj -aj -aj -aj -aj -aj -aj -yr -ap -ap -ap -ap -yr -aY -yr -yr -yr -Qv -yr -aw -aw -aj -aj -aj -aj -aj -pU -ai -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -aj -aj -aj -aj -aj -yr -vj -Pr -Pr -vj -aq -aZ -aq -ao -aq -Je -yr -KT -bZ -aj -aj -cw -aj -pU -pU -ai -ai -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -KT -aj -aj -aj -KT -yr -Dv -aH -ZO -aQ -aq -WB -aq -bi -aq -YN -yr -bZ -bZ -bZ -aj -aj -aj -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -KT -KT -ap -ap -ap -yr -vj -OI -aG -vj -aq -ba -aq -bj -vs -vj -yr -Hd -Hd -Hd -FF -Hd -nI -TC -TC -cM -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -hu -pU -pU -pU -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -KT -KT -ap -ar -JM -aq -vj -vj -vL -vj -vP -az -vj -su -vj -aQ -yr -cb -UJ -cG -QQ -Hd -qt -rj -Gn -cM -no -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -pU -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -KT -pv -yr -as -ar -aB -vj -vj -GY -GY -GY -GY -GY -nA -nA -GY -bL -cc -zS -zS -oU -Hd -Ym -rj -eM -cM -ZX -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -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 -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 -KT -KT -KT -KT -KT -KT -tk -yr -at -ay -aq -aE -vj -GY -vj -tZ -nq -Qo -bk -EY -EY -yr -vh -bh -bw -TI -Hd -pE -rj -dZ -cM -VX -nI -cM -pU -pU -pU -pU -pU -jz -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -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 -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 -KT -KT -KT -KT -ap -ap -ap -yr -aq -aq -aq -aq -oS -GY -vj -VA -bc -Jh -bl -yr -yr -yr -Lx -bh -bw -oW -sM -eL -gn -ec -dZ -uk -ju -cM -pU -pU -pU -pU -cR -kt -cR -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -pU -ak -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -ad -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 -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 -KT -KT -KT -KT -ap -Sp -YJ -aq -Cn -uB -Xb -aq -Tb -GY -vj -sK -Jd -wE -km -yr -SM -pV -UH -ch -sa -sa -Iq -eq -eq -eq -eq -eq -SS -cM -pU -pU -pU -pU -cR -dZ -cR -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -yy -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -pU -ak -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -ap -Bt -OQ -aq -av -Nz -En -aF -Iv -GY -aS -aW -be -Sd -bm -yr -bB -ca -cf -bh -AW -bM -sM -dZ -dZ -Dh -Nt -eq -dZ -cM -cM -cM -xi -cM -cR -oL -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -fQ -fQ -fQ -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -ap -DY -pz -aq -Ur -Hs -aq -aq -aq -Sg -aq -aq -aq -aq -aq -yr -Hd -Hd -cg -cB -bh -uG -cQ -cQ -cQ -cQ -ip -eq -dZ -cM -Lg -kO -Co -kO -eL -Pl -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -KT -yr -DY -aq -aq -aq -aq -aq -pr -aq -PS -zH -aq -Tp -pl -ap -DN -aw -FF -zo -cC -Pa -zX -cQ -dg -dg -cQ -dZ -eq -dZ -cM -fa -dZ -dZ -dZ -dZ -dZ -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -pU -pU -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -ZY -yr -DY -aq -YV -YV -YV -aq -nm -aJ -GY -En -rG -En -qP -ap -KT -aw -FF -FF -FF -FF -FF -cQ -gT -HG -cQ -ea -eq -ek -cM -fb -dZ -fy -fy -dZ -SJ -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -fQ -aj -aj -aj -aj -aj -an -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -KT -ZY -yr -KS -aq -Qg -vj -vj -aq -aq -aq -nA -jt -aq -aq -aq -yr -KT -aj -aj -aj -aj -aj -pU -cQ -Pg -KY -dP -eb -eq -kv -eQ -ef -Aw -fy -fy -dZ -dZ -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -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 -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 -KT -KT -KT -UA -yr -yr -yr -Cg -xX -az -vj -vj -vj -PE -aq -LH -vj -aq -FD -IR -ap -aj -aj -aj -aj -aj -pU -ad -cQ -dj -NM -cQ -ec -eq -eL -cM -fc -dZ -dZ -dZ -dZ -eM -cM -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -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 -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 -KT -KT -KT -KT -xU -Zs -iE -GQ -nt -Jf -Jf -Px -vj -vj -aq -xn -En -Bj -Iv -qP -ap -KT -aj -aj -aj -aj -pU -ai -cQ -dk -Bh -cQ -WT -eq -eM -cM -gX -fq -oO -GN -fB -ku -cM -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -wi -pU -pU -pU -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -UA -yr -yr -yr -Au -Ef -Ef -xT -pR -En -En -FO -GY -vj -aq -aq -aq -yr -KT -aj -aj -aj -aj -pU -pU -cQ -cQ -cQ -cQ -ee -eq -dZ -cM -cM -cM -cM -cM -cM -cM -cM -cM -cM -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -pU -pU -pU -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -tk -ap -AH -vj -az -vj -We -vj -vj -vj -aq -zA -ri -aq -Dm -IL -ap -KT -aj -aj -aj -aj -aj -pU -cM -dl -GA -cM -dZ -eq -fp -cM -QE -fr -cM -QE -fr -cM -QE -fr -cM -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -KT -ap -vj -vj -pk -vj -kn -wQ -az -QO -aq -GY -En -Gz -En -qP -ap -KT -KT -aj -aj -aj -aj -pU -cR -dm -dC -dQ -ea -eq -dZ -cM -oI -fP -cM -So -fP -cM -XV -fP -cM -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -pU -pU -pU -aj -aj -pU -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -ap -Gf -ob -aq -aq -bd -aq -aq -nU -yr -qs -KD -yr -yr -yr -yr -KT -KT -aj -aj -aj -aj -pU -cR -Qa -dD -dR -ef -eq -dZ -cM -kr -cM -cM -VW -cM -cM -lf -cM -cM -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -an -an -pU -pU -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 -an -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -ap -Gf -vg -UO -EK -vM -EK -EK -Zk -yr -Uv -Hi -ap -KT -KT -KT -KT -KT -KT -aj -aj -ai -ad -cM -dy -RJ -dQ -ec -eq -dZ -eL -OW -IS -eL -OW -VP -eL -OW -ec -cR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -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 -an -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -ap -ap -ap -yr -yr -yr -yr -yr -yr -yr -ap -ap -ap -KT -KT -KT -KT -KT -KT -aj -aj -ai -cM -cM -cM -cM -cM -WR -eq -HO -HO -HO -HO -HO -HO -Af -HO -HO -fp -cR -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(40,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -pU -pU -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 -an -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -KT -KT -KT -KT -KT -jX -KT -KT -Ry -KT -KT -KT -KT -KT -KT -KT -KT -KT -aj -aj -aj -aj -cM -cS -do -dF -cM -eh -eq -fp -cM -cM -dQ -dQ -cM -cM -cM -Ny -cM -cM -ai -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -yy -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -pU -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 -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -HM -KT -KT -KT -KT -KT -KT -KT -aj -aj -aj -aj -aj -aj -cM -cT -cV -cV -cM -ea -eq -eM -cM -fj -fk -Pt -fI -cM -Zc -Zr -cM -ai -ad -ai -ai -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Dy -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -pU -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 -an -an -an -an -an -an -an -an -an -an -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -Ry -KT -KT -KT -KT -KT -KT -aj -aj -aj -aj -aj -aj -aj -cM -cU -KP -dH -dS -ei -eq -ek -dQ -fk -fk -TL -fk -cM -Lr -uC -cM -pU -ai -ai -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -aj -aj -aj -aj -aj -pU -pU -pU -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 -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -Ry -KT -KT -KT -KT -KT -aj -aj -aj -aj -pU -pU -aj -pU -cM -cV -wg -cV -cM -To -eq -kv -eR -TP -fu -wa -hr -cM -cM -Yd -cM -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -an -an -an -an -an -an -an -an -an -an -an -an -an -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -an -pU -an -an -an -an -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -Na -KT -KT -KT -KT -aj -aj -aj -pU -pU -pU -pU -pU -pU -cM -cW -dr -dr -cM -vq -eq -eL -dQ -fk -fk -Ve -fK -cM -Fe -Qc -cM -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -an -an -an -an -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -an -an -an -an -an -an -an -an -an -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -an -an -pU -aj -aj -pU -an -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -KT -aj -aj -KT -KT -KT -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -cM -cM -cM -cM -cM -dZ -eq -dZ -cM -fm -fk -fF -fk -cM -IK -tI -cM -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(46,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -wi -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -KT -KT -KT -KT -KT -aj -aj -aj -aj -aj -KT -KT -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -cR -dZ -eq -dZ -cM -fn -fv -fG -fL -cM -cM -cM -cM -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -"} -(47,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -cR -ek -hv -eO -cM -cR -cR -cR -cR -cM -ai -ai -ai -aj -pU -aj -aj -pU -pU -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -"} -(48,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -ai -aj -aj -aj -aj -aj -aj -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -cR -cR -BZ -cR -cR -pU -pU -pU -pU -ai -ai -ai -pU -aj -aj -aj -aj -pU -pU -pU -ai -ad -ad -pU -pU -aj -aj -aj -aj -"} -(49,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -ai -ai -aj -aj -aj -aj -aj -aj -aj -ai -ai -ai -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -br -oK -br -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -ad -ad -ad -ad -ad -ai -ai -aj -aj -aj -"} -(50,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -pU -ai -am -ai -ai -ai -ai -ai -ai -ai -am -ai -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -br -eC -br -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -pU -pU -ad -ad -ad -ad -ad -ad -ad -ad -pU -aj -aj -"} -(51,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -ai -am -am -am -am -am -am -am -am -am -ai -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -br -eC -br -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -ad -ad -ad -ad -ad -ad -ad -pU -aj -aj -"} -(52,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -aj -aj -pU -pU -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -br -eC -br -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -ad -ad -ad -ad -ad -ad -ad -pU -aj -aj -"} -(53,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -aj -pU -pU -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -br -eC -br -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -ad -ad -ai -ad -pU -pU -aj -aj -"} -(54,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -VQ -pU -pU -pU -pU -aj -aj -aj -br -eC -br -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(55,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -WI -ad -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -aj -pU -aj -aj -aj -aj -aj -pU -pU -bN -vm -br -pU -pU -aj -aj -aj -pU -br -eC -br -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -"} -(56,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -ai -ai -ai -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -aj -aj -aj -aj -aj -aj -pU -br -Rx -br -pU -aj -aj -aj -aj -pU -br -Sf -br -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(57,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ai -ai -ai -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -bn -bo -bo -bn -bn -br -br -TQ -br -br -pU -aj -aj -pU -br -br -Km -br -br -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(58,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ai -ai -ai -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -bn -bp -rR -Ww -bn -br -cH -rB -NS -br -bq -bq -bq -bq -ia -cH -oK -cD -br -bq -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(59,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ad -ad -yy -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -ai -bn -gt -jj -Gh -bn -bC -Lu -Rx -cl -cH -cO -Qj -EC -dJ -ia -cn -eC -bP -eS -bq -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(60,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -aj -aj -pU -pU -aj -pU -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -aj -bn -xV -zT -Zh -UC -Rx -eC -Vm -eC -eC -eC -eC -eC -eC -kI -Be -eC -eP -eT -bq -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(61,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -aj -aj -bn -wk -Nb -vy -bo -bE -Sf -cn -cF -cI -cP -cn -Rx -bP -ia -gd -IG -bP -eU -bq -bq -bq -bq -sU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(62,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -aj -pU -bn -bo -bn -bf -bf -bF -RT -bF -bf -cJ -bq -cZ -ds -BX -ia -bP -IG -bP -dU -br -wj -dU -br -pU -pU -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(63,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -bf -bs -Fv -AU -Kv -bf -cK -bq -bq -ia -bq -ia -bP -IG -bP -sj -wK -lO -sj -Dt -pU -pU -ai -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(64,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -pU -pU -pU -pU -bg -PL -LL -kz -cp -bf -cL -bq -du -bP -bP -cH -dT -IG -bP -cH -br -jV -RE -br -pU -pU -pU -ai -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(65,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -aj -pU -pU -aj -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -ai -aj -pU -pU -pU -bg -bt -bH -JX -cq -bf -bq -bq -db -bP -bP -bP -bP -Xt -cF -eW -bq -bq -bq -bq -sU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(66,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -aj -aj -pU -pU -bf -bu -bI -bW -aV -bf -ad -bq -dc -bP -dM -dW -IG -PZ -bq -eX -bq -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(67,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -aj -aj -pU -pU -bf -bf -bg -RH -bg -bf -ai -bq -dd -bP -uE -dX -em -eJ -dV -eY -bq -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(68,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -kk -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -aj -aj -pU -pU -pU -bf -bJ -bY -cs -bf -ai -bq -de -dv -bq -dV -en -dV -dV -eY -bq -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(69,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -aj -aj -pU -pU -bf -bK -bW -ct -bf -ai -bq -df -dw -dO -dY -eo -dY -dY -eZ -bq -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(70,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -ai -ai -aj -aj -pU -bf -bg -Sh -bg -bf -ai -bq -bq -bq -bq -bq -bq -bq -bq -bq -bq -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(71,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -nz -pU -pU -pU -nz -ai -ai -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(72,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -ai -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(73,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -KZ -ad -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -pU -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -ai -ai -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -"} -(74,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -ai -pU -ai -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -"} -(75,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -ai -ai -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -pU -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -"} -(76,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -ai -pU -pU -pU -pU -pU -pU -ai -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -ai -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(77,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -ai -pU -pU -ai -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(78,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -ai -ai -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -ai -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(79,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ad -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -pU -pU -pU -pU -pU -pU -aj -pU -aj -aj -aj -aj -"} -(80,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ai -ai -ai -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -"} -(81,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ai -ai -ai -ad -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -"} -(82,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -ai -ai -ai -ad -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -"} -(83,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ad -hu -pU -aj -aj -aj -aj -aj -aj -aj -pU -aj -pU -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -ai -pU -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -"} -(84,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -ai -aj -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -"} -(85,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -ai -aj -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -"} -(86,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -aj -pU -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -ai -aj -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -"} -(87,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -pU -pU -pU -ai -am -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(88,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -kk -pU -pU -pU -pU -pU -pU -pU -aj -pU -aj -pU -pU -pU -aj -pU -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ai -am -ai -ai -pU -ai -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(89,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -aj -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -ai -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(90,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(91,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(92,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -"} -(93,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -"} -(94,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(95,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -hu -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(96,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -pU -"} -(97,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -ai -ai -pU -pU -pU -pU -pU -ai -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(98,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -ai -pU -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -ai -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(99,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ai -ai -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -ai -pU -pU -pU -pU -pU -pU -ai -am -ai -ai -ai -ai -pU -pU -ai -ai -ai -am -am -ai -ai -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(100,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ai -ai -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -ai -pU -pU -ai -am -am -am -am -am -ai -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(101,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ad -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -ai -pU -ai -am -am -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -Iy -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(102,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -ai -am -ai -am -am -ai -IX -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(103,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -am -am -am -am -ai -Rd -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(104,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(105,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -kk -kk -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -ai -am -am -am -am -am -ai -pU -pU -pU -pU -pU -ai -am -ai -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(106,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -ai -am -am -am -am -am -am -am -ai -ai -pU -pU -ai -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(107,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -pU -ai -pU -am -am -am -am -am -am -am -am -am -ai -ai -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(108,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -ai -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -"} -(109,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(110,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(111,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -"} -(112,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -"} -(113,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -pU -pU -pU -"} -(114,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -aj -aj -"} -(115,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -"} -(116,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -ad -ai -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -aj -aj -"} -(117,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -ad -ad -ai -ai -ad -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(118,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -sV -ad -ai -ai -ad -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(119,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -ad -ai -ai -yy -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -"} -(120,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -Si -aj -aj -aj -aj -aj -aj -pT -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -ai -pU -pU -pU -pU -pU -pU -aj -pU -pU -aj -aj -aj -aj -"} -(121,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tj -qq -pZ -pZ -QJ -pU -pU -pU -pU -aj -aj -BC -aj -aj -aj -pU -JW -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -ai -pU -pU -pU -pU -aj -aj -pU -aj -aj -aj -aj -"} -(122,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -yS -pa -HN -pa -pa -Kj -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -Ux -fQ -fQ -fQ -fQ -fQ -HX -pU -pU -dq -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -"} -(123,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -mj -ty -jF -gM -kB -Qw -hu -pU -wv -aj -aj -aj -aj -lI -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -pU -pU -WI -pU -pU -Kt -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -pU -pU -aj -aj -pU -aj -aj -aj -aj -"} -(124,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HF -go -sH -hs -pa -rO -pU -pU -aj -ly -aj -aj -aj -lw -aj -aj -ls -aj -aj -WI -wv -HX -fQ -fQ -fQ -yy -pU -Si -pU -pU -WI -pU -pU -BO -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -ai -pU -aj -aj -pU -aj -aj -pU -pU -aj -aj -aj -"} -(125,1,1) = {" -aa -aa -aa -mS -mV -mq -mV -nc -aa -aa -fV -fV -pa -jH -gO -kD -ty -wB -aa -aa -ls -aj -aj -aj -aj -aj -aj -aj -aj -aj -lI -aa -aa -wv -pU -pU -wi -pU -WI -pU -yy -pU -Si -pU -pU -pU -WH -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am -aj -aj -aj -aj -aj -aj -aj -pU -aj -aj -aj -"} -(126,1,1) = {" -aa -aa -fV -gj -gC -mr -nb -ne -aa -aa -fV -fV -Yk -pa -pa -pa -pa -HN -aa -UR -UR -lz -UR -lF -UR -IP -lS -UR -lZ -lS -lS -UR -aa -cY -pU -pU -pU -pU -Si -pU -pU -pU -pU -pU -wv -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -"} -(127,1,1) = {" -mQ -mQ -fW -mQ -mW -hg -ac -nf -ac -ac -ac -af -uV -nM -QS -nM -nM -uV -Op -Pj -GR -Pj -lD -lC -GR -lQ -GR -lW -et -Pj -tJ -FM -Kj -Ma -pU -oB -pU -wi -pU -WI -pU -pU -Si -pU -pU -yy -zg -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -am -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(128,1,1) = {" -aa -aa -fV -gk -mX -mZ -nc -ng -aa -aa -fV -fV -pd -pa -Ai -HF -HN -md -aa -XP -lv -lv -lE -lv -lE -pm -lv -lv -mb -pm -ml -pm -aa -ok -pU -pU -WI -zg -pU -pU -pU -EH -fQ -JR -pU -pU -Ux -pU -WI -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -am -am -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(129,1,1) = {" -aa -aa -aa -mS -mY -ms -hJ -id -aa -aa -fV -fV -Qw -jL -gM -kH -pa -rO -aa -aa -lw -aj -aj -aj -lI -aj -aj -aj -aj -lw -aj -aa -aa -yy -pU -pU -pU -Ux -pU -bQ -pU -pU -fQ -fQ -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -am -fR -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(130,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pa -go -Va -hs -HF -Ui -pU -pU -aj -aj -mv -sn -lw -aj -aj -aj -lI -aj -aj -Si -yy -wv -WI -wv -pU -pU -pU -pU -pU -pU -zg -fQ -wv -Si -pU -pU -zg -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -am -am -we -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(131,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -mj -Ai -jN -gO -kJ -pa -ok -pU -pU -aj -aj -aj -pU -Ux -aj -WI -pU -ly -aj -aj -pU -pU -fQ -fQ -wi -pU -hL -pU -pU -IN -fQ -fQ -fQ -fQ -pU -pU -Vo -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -we -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(132,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -mj -pa -pa -pa -Qw -Op -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -TG -aj -aj -aj -pU -wi -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -am -we -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(133,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tj -pa -Qw -Uc -Dy -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -HX -aj -aj -aj -Si -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -am -am -we -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -"} -(134,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -yy -pU -pU -pU -pU -pU -Si -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -am -am -am -am -am -we -aj -pU -aj -pU -aj -aj -aj -aj -aj -aj -"} -(135,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -zg -FW -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(136,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -yy -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -mC -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(137,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -FE -pU -Ux -yy -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(138,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(139,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(140,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -lI -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(141,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -HX -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(142,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(143,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(144,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -yy -pU -pU -pU -pU -pU -pU -pU -aj -aj -mw -pU -lI -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(145,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -mx -pU -pU -mx -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(146,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(147,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(148,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -zg -ad -pU -pU -Fn -pU -pU -aj -aj -aj -pU -pU -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(149,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(150,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -aj -aj -aj -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(151,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -hu -pU -pU -pU -ad -ad -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(152,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ad -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(153,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(154,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -wv -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(155,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(156,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(157,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(158,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(159,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(160,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(161,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(162,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(163,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(164,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(165,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(166,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -wv -ad -ad -pU -pU -aj -aj -aj -aj -pU -pU -pU -aj -pU -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(167,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -ai -ai -ai -ai -pU -aj -aj -aj -pU -pU -pU -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -pU -aj -pU -aj -aj -aj -aj -aj -aj -"} -(168,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -Ft -ai -ai -ai -ai -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(169,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ad -ai -ai -ai -ai -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(170,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ad -ai -ai -ai -ai -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(171,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ad -ai -ai -ai -ai -ad -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(172,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -ad -ai -ai -ai -ai -ad -ad -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -aj -"} -(173,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -ad -ai -ai -ai -ai -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(174,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -ad -ai -ai -ai -ai -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(175,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -Si -ai -ai -ai -ai -yy -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(176,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -ai -ai -ai -ai -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(177,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -ad -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(178,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(179,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(180,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(181,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(182,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(183,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(184,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ad -ai -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(185,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ai -wv -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(186,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ai -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(187,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ai -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(188,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ai -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(189,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -HX -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(190,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -pU -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(191,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(192,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(193,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(194,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(195,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(196,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(197,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(198,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -HX -pU -ad -ad -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(199,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -HX -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(200,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(201,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(202,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(203,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -HX -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(204,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(205,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(206,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -pU -pU -pU -ai -ai -pU -pU -pU -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(207,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -ad -ai -ai -pU -pU -pU -aj -pU -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(208,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -ai -ai -ad -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(209,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -ad -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(210,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(211,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(212,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(213,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(214,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(215,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(216,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(217,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(218,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -QJ -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(219,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(220,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -"} -(221,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ai -ai -ai -ai -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -"} -(222,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ai -ai -ai -ai -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -"} -(223,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ai -ai -ai -ai -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(224,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ai -ai -ai -ai -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(225,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Op -ai -ai -ai -ai -ad -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(226,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(227,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -ai -ai -ai -ai -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(228,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(229,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(230,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(231,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(232,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ok -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(233,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(237,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Op -QJ -pU -ad -ad -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -aj -aj -aj -aj -pU -pU -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -aj -pU -aj -pU -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -pU -pU -pU -pU -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(249,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(250,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -pU -pU -ad -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(251,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -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 -QJ -pU -pU -pU -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(254,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -QJ -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} -(255,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -pU -pU -pU -aj -aj -aj -aj -aj -aj -aj -aj -aj -pU -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -fQ -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -aj -"} diff --git a/_maps/map_files/Theseus/Theseus.dmm b/_maps/map_files/Theseus/Theseus.dmm new file mode 100644 index 000000000000..8c63d7ab33a1 --- /dev/null +++ b/_maps/map_files/Theseus/Theseus.dmm @@ -0,0 +1,130642 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aaa" = ( +/turf/open/space/basic, +/area/space) +"aac" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space, +/area/space) +"aad" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aaf" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"aau" = ( +/obj/machinery/vending/wardrobe/medi_wardrobe, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/noticeboard/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"aav" = ( +/turf/open/space, +/area/space) +"aax" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"aaC" = ( +/obj/machinery/camera{ + dir = 6; + network = list("ss13","medbay"); + c_tag = "Medbay Breakroom" + }, +/obj/machinery/button/door/directional/north{ + name = "Privacy Control"; + pixel_y = -24; + id = "med_break_privacy" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"aaJ" = ( +/obj/effect/spawner/random/trash/box, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"aaM" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"aaN" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "70" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"aaV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"abh" = ( +/obj/structure/cable/red{ + icon_state = "129" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"abp" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"abq" = ( +/obj/structure/railing, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"abF" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"abM" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"abR" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"abU" = ( +/obj/machinery/newscaster/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Courtroom - Gallery" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"acd" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"acg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/machinery/requests_console/directional/north{ + name = "Janitorial Requests Console"; + department = "Janitorial"; + departmentType = 1 + }, +/turf/open/floor/iron, +/area/station/service/janitor) +"ack" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"acn" = ( +/obj/structure/table, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"aco" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"act" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/obj/item/radio/intercom/directional/south, +/obj/structure/closet/secure_closet/security, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"acu" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"acT" = ( +/obj/machinery/modular_computer/console/preset/id{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/requests_console/directional/east{ + name = "Captain's Requests Console"; + department = "Captain's Desk"; + departmentType = 5; + announcementConsole = 1 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"acV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"adn" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"adp" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"adz" = ( +/obj/structure/sign/warning/securearea, +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/bridge) +"adF" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen, +/obj/structure/window/reinforced, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"adJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"adN" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"adQ" = ( +/obj/structure/table, +/obj/item/cultivator, +/obj/item/hatchet, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/random/entertainment/coin, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"aei" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"aej" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"aek" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit) +"aep" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"aeN" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;48;50;1" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"aeU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"afd" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"afm" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"afC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"afD" = ( +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"afG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"afQ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"afY" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"agf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + name = "Engineering Security Doors"; + id = "Engineering" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"agj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/grass, +/area/station/security/pig) +"agk" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"agl" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"agn" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"agu" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 27 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"agI" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/detectives_office/private_investigators_office) +"agJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"ahd" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ahe" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"aho" = ( +/obj/machinery/light/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Fore" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-14" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"ahs" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"ahv" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Entrance" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/book/manual/wiki/atmospherics, +/obj/item/t_scanner, +/obj/item/t_scanner, +/obj/item/t_scanner, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"ahz" = ( +/obj/structure/table/wood, +/obj/machinery/telephone/command, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 9; + pixel_y = -1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/data_terminal, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"ahK" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"ahY" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"aia" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"aif" = ( +/obj/machinery/door/poddoor/massdriver_trash, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"aii" = ( +/obj/structure/easel, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"aip" = ( +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"air" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"aiN" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/machinery/camera/directional/north{ + c_tag = "Bar - Starboard" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"aiT" = ( +/obj/effect/landmark/start/atmospheric_technician, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"aiX" = ( +/obj/machinery/light/directional/east, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"aje" = ( +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ajf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"ajg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ajk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ajr" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/structure/closet_private, +/obj/item/clothing/under/misc/assistantformal, +/turf/open/floor/wood, +/area/station/commons/dorms) +"aju" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"ajv" = ( +/obj/machinery/navbeacon{ + location = "13.3-Engineering-Central"; + codes_txt = "patrol;next_patrol=14-Starboard-Central" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"ajw" = ( +/obj/machinery/chem_dispenser, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"ajP" = ( +/obj/item/toy/beach_ball/holoball, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ajU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"akc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central/port) +"aki" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"ako" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"akp" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/firecloset, +/obj/item/clothing/glasses/meson/engine, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/engineering/main) +"akt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"akR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/item/paper_bin, +/obj/item/pen/blue, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"akT" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"ala" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"alc" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ale" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"alh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"alk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "16" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"als" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"alx" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"alA" = ( +/obj/machinery/mineral/stacking_machine{ + input_dir = 2 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"amf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"amz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"amP" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"amR" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"amX" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"amZ" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ang" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"anq" = ( +/obj/machinery/vending/coffee{ + pixel_x = -3 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + name = "Council Chamber Blast Door Control"; + id = "council blast"; + req_access_txt = "19" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"anw" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"anN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"anS" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"anU" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"anV" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"anW" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"anX" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/recycler, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"anZ" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"aoa" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aob" = ( +/turf/open/floor/plating, +/area/station/maintenance/port) +"aoe" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aof" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aos" = ( +/obj/machinery/power/solar{ + name = "Aft-Port Solar Array"; + id = "aftport" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"aot" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"aox" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"aoA" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"aoG" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"aoR" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"aoW" = ( +/obj/machinery/camera/motion/directional/south{ + network = list("aiupload"); + c_tag = "AI Upload Chamber - Port" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"apc" = ( +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"apd" = ( +/obj/structure/table, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = -8 + }, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = -8 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"apf" = ( +/obj/effect/decal/cleanable/greenglow/filled, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"apj" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/port) +"apX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/radiation, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"aqa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"aqh" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/modular_computer/console/preset/id{ + dir = 8 + }, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"aqj" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"aqv" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron, +/area/station/cargo/storage) +"aqz" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"aqH" = ( +/obj/machinery/space_heater, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aqK" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aqO" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aqU" = ( +/obj/machinery/disposal/bin, +/obj/machinery/airalarm/directional/east, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"aqV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"aqW" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"arh" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"arp" = ( +/obj/machinery/computer/secure_data, +/turf/open/floor/iron, +/area/station/security/warden) +"ary" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"arz" = ( +/obj/machinery/space_heater, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"arA" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"arK" = ( +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"arU" = ( +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"asj" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "External Waste Ports to Filter"; + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"asr" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"asw" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/service/janitor) +"asJ" = ( +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/machinery/camera/directional/north{ + c_tag = "Departures Hallway - Aft" + }, +/obj/item/reagent_containers/glass/rag, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"asP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"atd" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"atj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"atk" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"att" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"atB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"atK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/assembly/signaler, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"aub" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"auf" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"auo" = ( +/obj/structure/mopbucket, +/obj/item/mop, +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"auq" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"aus" = ( +/obj/structure/closet, +/obj/item/stock_parts/matter_bin, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"auA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"auB" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"auC" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/fore) +"auF" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/port) +"auI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable/orange{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"auL" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"avg" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/mineral/plasma{ + amount = 35 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/cyan{ + icon_state = "1" + }, +/obj/structure/cable/cyan{ + icon_state = "65" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"avt" = ( +/obj/machinery/light/small/directional/south, +/obj/item/radio/intercom/directional/west, +/obj/structure/sign/poster/official/no_erp{ + pixel_y = -32 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"avy" = ( +/obj/machinery/door/airlock{ + name = "Fitness Room Shower"; + id_tag = "FitnessShower" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/fitness/recreation) +"avC" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/small/maintenance/directional/south, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"avG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"avH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"avT" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/requests_console/directional/east{ + name = "Medical Director's Request Console"; + department = "Medical Director's Desk"; + departmentType = 5; + announcementConsole = 1 + }, +/obj/machinery/camera{ + dir = 6; + network = list("ss13","medbay"); + c_tag = "Medical Director's Office" + }, +/obj/machinery/telephone/command, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"awd" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"awo" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"awI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"awP" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"awX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Vault Storage" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/construction/storage_wing) +"axb" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/engineering_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"axm" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"axw" = ( +/obj/docking_port/stationary/random{ + name = "lavaland"; + dir = 4; + id = "pod_4_lavaland" + }, +/turf/open/space/basic, +/area/space) +"axB" = ( +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"axQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/south, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ayi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"aym" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom/directional/east, +/obj/item/clothing/glasses/regular/hipster{ + name = "Hipster Glasses" + }, +/obj/machinery/light/small/directional/south, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) +"ayK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"ayQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"azi" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"azv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"azB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"azG" = ( +/obj/machinery/rnd/production/fabricator/department/robotics, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"azJ" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port) +"azY" = ( +/obj/structure/railing, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"aAp" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/turret_protected/aisat_interior) +"aAs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"aAu" = ( +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"aAz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Control Room"; + req_access_txt = "10" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"aAA" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock"; + req_access_txt = "48" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"aAQ" = ( +/obj/structure/rack, +/obj/item/clothing/mask/animal/horsehead, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aAW" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"aBk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/storage/tech) +"aBF" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"aBQ" = ( +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/decoration/showcase, +/obj/machinery/light/small/directional/north, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"aBR" = ( +/obj/structure/chair/stool/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"aCo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"aCD" = ( +/obj/machinery/door/airlock{ + name = "Cabin 2"; + id_tag = "Cabin6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"aCK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"aDn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"aDo" = ( +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"aDC" = ( +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"aDF" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"aDG" = ( +/obj/machinery/flasher/portable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"aDH" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"aDV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/department_orders/service{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"aDW" = ( +/obj/machinery/computer/security/mining{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"aDY" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Hot Return Secondary Cooling" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"aDZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"aEf" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/entertainment/arcade, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"aEK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"aEY" = ( +/mob/living/simple_animal/bot/secbot/pingsky, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"aFc" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"aFe" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"aFw" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"aFH" = ( +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"aFO" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"aFP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/medical) +"aFU" = ( +/obj/structure/closet/firecloset, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"aFW" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"aGd" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Mechanic Storage" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"aGw" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/clothing/glasses/sunglasses/big, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"aGx" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"aGO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"aGS" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"aGT" = ( +/obj/structure/table, +/obj/item/taperecorder{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/tape{ + pixel_x = -10 + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"aGW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"aHd" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/item/flashlight/lamp, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"aHe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aHf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"aHo" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/modular_computer/console/preset/engineering, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"aIb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"aIq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"aIB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"aIF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"aIJ" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Genpop Brig"; + req_access_txt = "1" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Genpop Shutter"; + id = "cell3genpop" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"aIK" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space, +/area/space/nearstation) +"aIR" = ( +/turf/open/floor/iron, +/area/station/security/courtroom) +"aIS" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aIT" = ( +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aJe" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"aJr" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"aJw" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"aJx" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/safe{ + pixel_x = 7 + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"aJG" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"aJH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aJJ" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"aJO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"aJR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "40" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"aJY" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/shower{ + name = "emergency shower"; + dir = 8 + }, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"aKb" = ( +/obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"aKf" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/light/small/directional/east, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"aKr" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -5; + pixel_y = 8 + }, +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 7; + pixel_y = -1 + }, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"aKT" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"aKX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/lounge) +"aKY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"aLd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"aLq" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8; + initialize_directions = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"aLs" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/janitor) +"aLv" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"aLB" = ( +/obj/effect/landmark/start/lawyer, +/turf/open/floor/iron, +/area/station/security/courtroom) +"aLZ" = ( +/obj/effect/landmark/blobstart, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"aMg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"aMq" = ( +/obj/structure/window/reinforced, +/turf/open/space, +/area/space/nearstation) +"aMr" = ( +/obj/structure/window/reinforced, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"aMQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/turf/open/floor/wood, +/area/station/security/courtroom) +"aMY" = ( +/obj/machinery/door/window{ + name = "Captain's Desk"; + req_access_txt = "20" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"aNc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"aNm" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"aNr" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"aNw" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"aNC" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"aND" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "136" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"aNJ" = ( +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/structure/rack, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Gateway Shutter Control"; + id = "gateshutter"; + req_access_txt = "19" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"aNV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"aOc" = ( +/obj/machinery/holopad/secure, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"aOi" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/fluff/broken_flooring{ + icon_state = "pile"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"aOH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/break_room) +"aOV" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/space, +/area/space/nearstation) +"aOX" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/space, +/area/space/nearstation) +"aOY" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/space/nearstation) +"aPa" = ( +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"aPI" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"aPL" = ( +/obj/structure/rack, +/obj/item/clothing/head/helmet/riot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/riot{ + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/riot{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_y = -2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"aPS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"aQc" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + name = "Supermatter Chamber"; + heat_proof = 1; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"aQg" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/courtroom) +"aQG" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aQH" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aQI" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/closet, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aQO" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"aQR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"aQU" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"aRh" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"aRu" = ( +/obj/item/storage/box/lights/mixed, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"aRG" = ( +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"aRO" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"aRU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"aRV" = ( +/obj/machinery/porta_turret/ai{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"aRX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Courtroom" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aSa" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/camera/directional/south{ + c_tag = "Security Post - Cargo" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"aSD" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"aSG" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/space, +/area/space/nearstation) +"aSQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"aTl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"aTt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"aTw" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"aTJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"aTQ" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"aUg" = ( +/obj/structure/cable/orange{ + icon_state = "9" + }, +/obj/structure/cable/orange{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"aUm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"aUn" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"aUo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"aUq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"aUs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"aUu" = ( +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"aVa" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"aVf" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/button/ticket_machine{ + pixel_x = -10; + id = "ticket_machine_medbay"; + req_access_txt = "5"; + pixel_y = 6 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"aVg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/obj/structure/cable/yellow{ + icon_state = "80" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"aVk" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/space/nearstation) +"aVl" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"aVq" = ( +/mob/living/carbon/human/species/monkey, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/grass, +/area/station/medical/virology) +"aVr" = ( +/obj/machinery/porta_turret/ai{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"aVt" = ( +/obj/item/kirbyplants{ + icon_state = "plant-13" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aVu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aVw" = ( +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aVx" = ( +/obj/structure/chair, +/obj/machinery/camera/directional/north{ + c_tag = "Arrivals - Fore Arm - Far" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aVy" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/tcommsat/server) +"aVZ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"aWh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"aWk" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/food/pie/cream, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Kitchen Counter Shutters"; + id = "kitchen_counter" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/service/kitchen) +"aWl" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"aWt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"aWK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"aWN" = ( +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"aWT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aWU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aWV" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aWW" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aXf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"aXq" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"aXV" = ( +/obj/structure/rack, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"aYi" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"aYo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"aYu" = ( +/obj/structure/cable/yellow{ + icon_state = "34" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"aYE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aYF" = ( +/obj/item/kirbyplants{ + icon_state = "plant-05" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"aZD" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"aZF" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aZZ" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bab" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bac" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"baz" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"baS" = ( +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Access"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/red{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"baW" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"bbc" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "psych_privacy" + }, +/turf/open/floor/plating, +/area/station/medical/psychology) +"bbk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/girder, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bbE" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"bbI" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"bbS" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/engine_smes) +"bbT" = ( +/obj/structure/sign/poster/party_game, +/turf/closed/wall/prepainted/daedalus, +/area/space/nearstation) +"bbX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"bca" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"bco" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/closed/wall/prepainted/medical, +/area/station/medical/chemistry) +"bct" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"bcK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"bcO" = ( +/obj/structure/easel, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"bcQ" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space, +/area/space/nearstation) +"bcU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"bdm" = ( +/obj/structure/table, +/obj/item/hand_labeler{ + pixel_y = 11 + }, +/obj/item/stack/package_wrap{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/stack/package_wrap{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/hand_labeler_refill{ + pixel_x = -8; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"bdE" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bef" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 1 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"beg" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/security/office) +"bem" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"beH" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"beJ" = ( +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"beK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"beX" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"bfA" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron, +/area/station/commons/dorms) +"bgf" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"bgn" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/space, +/area/space/nearstation) +"bgo" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/space, +/area/space/nearstation) +"bgp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Central Aft" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"bgH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/no_nightlight/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"bgN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bgQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/main) +"bgS" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"bhk" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/assistant, +/obj/machinery/button/door/directional/east{ + name = "Lock Control"; + id = "AuxToilet2"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"bhq" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"bhG" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"bhI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Atmospherics Maintenance"; + req_access_txt = "24" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"bhN" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/obj/machinery/light/dim/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"bhW" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"bhY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + name = "Virology Interior Airlock"; + frequency = 1449; + id_tag = "virology_airlock_interior"; + autoclose = 0; + req_access_txt = "39" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door_buttons/access_button{ + name = "Virology Access Button"; + pixel_x = 8; + pixel_y = -24; + idSelf = "virology_airlock_control"; + idDoor = "virology_airlock_interior"; + req_access_txt = "39" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"biu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"biv" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"biL" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"biX" = ( +/obj/item/clothing/mask/gas, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bja" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"bjk" = ( +/obj/structure/lattice, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/turf/open/space/basic, +/area/space/nearstation) +"bjo" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Magboot Storage"; + dir = 8; + pixel_x = -1; + req_access_txt = "18" + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/rack, +/obj/item/clothing/shoes/magboots{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/clothing/shoes/magboots, +/obj/item/clothing/shoes/magboots{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"bjs" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"bjv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"bjz" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/prepainted/medical, +/area/station/hallway/primary/central/aft) +"bjJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"bjK" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"bjP" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"bkg" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"bkB" = ( +/obj/item/extinguisher, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bkD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/no_nightlight/directional/west, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"bkF" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Storage"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"bkJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"bkW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"bkZ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/conveyor{ + dir = 8; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + pixel_x = 14; + c_tag = "Cargo Bay - Aft" + }, +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/door/window/right/directional/west{ + name = "Crate to Shuttle"; + dir = 4; + req_access_txt = "50" + }, +/obj/structure/plasticflaps/opaque{ + name = "Service Deliveries" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"blh" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/station/service/library) +"bll" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"bln" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"blu" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/dorms) +"blw" = ( +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/turf/open/space, +/area/space/nearstation) +"bly" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/space, +/area/space/nearstation) +"blz" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"blC" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"blD" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"blO" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/bar) +"blU" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bmh" = ( +/obj/machinery/navbeacon{ + location = "7-Command-Starboard"; + codes_txt = "patrol;next_patrol=7.5-Starboard-Aft-Corner" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"bmo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/grille, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"bmr" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bms" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bmt" = ( +/obj/item/radio/off, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"bmy" = ( +/obj/item/kirbyplants/random, +/obj/structure/light_construct/small/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"bmC" = ( +/obj/structure/rack, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"bmE" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"bmH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"bmK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"bmT" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"bmU" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/main) +"bmY" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"bnj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"bnl" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"bnm" = ( +/obj/machinery/door/window/brigdoor{ + name = "Command Desk"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"bno" = ( +/obj/structure/transit_tube/diagonal, +/turf/open/space, +/area/space/nearstation) +"bnv" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/office) +"bnw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"bnx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"bnJ" = ( +/obj/machinery/door/airlock{ + name = "Starboard Emergency Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"bnQ" = ( +/obj/machinery/door/airlock/freezer{ + name = "Cold Storage"; + req_access_txt = "45" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/surgery/port) +"bnW" = ( +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"bon" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable/orange{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"bot" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-left" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"bov" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"boM" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"boP" = ( +/obj/effect/spawner/random/structure/crate, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"boY" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"bpc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"bpj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"bpk" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"bpu" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"bpD" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"bpS" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"bqf" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron, +/area/station/maintenance/port) +"bqC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bqN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"bqR" = ( +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"bqV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) +"bra" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"brt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/security/deck) +"brv" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"brx" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "CO2 to Pure"; + dir = 1 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"brO" = ( +/obj/structure/transit_tube/diagonal/topleft, +/turf/open/space, +/area/space/nearstation) +"brX" = ( +/obj/machinery/photocopier, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"bsb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"bsd" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"bse" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"bsj" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"bsk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bsq" = ( +/obj/item/storage/toolbox/emergency, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bss" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bsu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"bsB" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_access_txt = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"bsS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"bto" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"btp" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/bed, +/obj/item/bedsheet/yellow, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"btK" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"btO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"btP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"btQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"btR" = ( +/obj/item/kirbyplants{ + icon_state = "plant-18" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"btS" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bub" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bud" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "9" + }, +/obj/structure/cable/red{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"bug" = ( +/obj/structure/lattice, +/obj/item/tank/internals/oxygen/empty, +/turf/open/space/basic, +/area/space/nearstation) +"bup" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"but" = ( +/obj/machinery/power/shieldwallgen, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"buD" = ( +/obj/item/wrench, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"buI" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"bve" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;48;50;1" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"bvh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"bvw" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bvx" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"bvB" = ( +/obj/item/kirbyplants{ + icon_state = "plant-20" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bvC" = ( +/obj/structure/chair, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bvD" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bvF" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bvI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bvZ" = ( +/obj/item/cigbutt, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"bwy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"bwC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"bwN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"bxn" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bxo" = ( +/obj/item/storage/toolbox/emergency, +/obj/structure/cable/yellow{ + icon_state = "136" + }, +/obj/structure/cable/yellow{ + icon_state = "129" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"bxq" = ( +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bxr" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bxv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bxz" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/command) +"bxE" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = 6; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"bxH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/command/teleporter) +"bxP" = ( +/obj/item/gun/ballistic/revolver/single_action/juno{ + pixel_y = -2 + }, +/obj/item/gun/ballistic/revolver/single_action/juno{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/gun/ballistic/revolver/single_action/juno{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"bxX" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/warden) +"byi" = ( +/obj/effect/mapping_helpers/paint_wall/priapus, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"byo" = ( +/obj/structure/closet, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/spawner/random/maintenance/two, +/obj/item/clothing/head/festive, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"byp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"byH" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"byL" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/defibrillator_mount/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"byU" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"bzo" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bzK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"bzU" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"bAf" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"bAk" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/on/coldroom, +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"bAJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"bAS" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"bAT" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/turf/open/space, +/area/space/nearstation) +"bAU" = ( +/obj/machinery/microwave{ + pixel_y = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bAY" = ( +/obj/structure/filingcabinet{ + pixel_x = 3 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bBb" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"bBc" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"bBj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"bBs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Service - Port" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"bBO" = ( +/obj/machinery/computer/med_data, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"bCN" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"bCO" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"bCR" = ( +/obj/machinery/holopad, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/engineering/main) +"bCW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"bCY" = ( +/obj/machinery/light/small/maintenance/directional/south, +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"bDa" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/range) +"bDd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"bDi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - External Airlock" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"bDs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/navbeacon{ + dir = 8; + freq = 1400; + location = "QM #1"; + codes_txt = "delivery;dir=8" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"bDt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bDA" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"bDH" = ( +/obj/machinery/light/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Starboard Primary Hallway - Engineering" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 4; + pixel_y = -24 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bDJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/storage) +"bDR" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"bDS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"bEe" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"bEg" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"bEh" = ( +/obj/machinery/telecomms/receiver/preset_left, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bEj" = ( +/obj/machinery/telecomms/receiver/preset_right, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bEl" = ( +/obj/machinery/door/airlock/external{ + name = "Transport Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bEm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bEo" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/gps{ + pixel_x = 10; + pixel_y = 12; + gpstag = "QM0" + }, +/obj/machinery/status_display/supply{ + pixel_x = 32 + }, +/obj/item/storage/wallet{ + pixel_x = -3; + pixel_y = 10 + }, +/obj/item/ammo_casing/caseless/rocket{ + name = "Dud Rocket"; + desc = "Your grandpappy brought this home after the war. You're pretty sure it's a dud."; + pixel_x = -4; + pixel_y = -7 + }, +/turf/open/floor/carpet/red, +/area/station/cargo/qm) +"bEq" = ( +/obj/effect/spawner/random/engineering/vending_restock, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bEt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bEz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"bEB" = ( +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"bEC" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"bEI" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"bEN" = ( +/obj/effect/turf_decal/bot/right, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"bEZ" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bFa" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"bFc" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"bFg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"bFu" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/toilet/auxiliary) +"bFD" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/depsec/engineering, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"bFH" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/chair, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bFI" = ( +/mob/living/carbon/human/species/monkey, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"bFK" = ( +/obj/machinery/camera/directional/north{ + name = "holodeck camera"; + c_tag = "Holodeck - Fore" + }, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"bFQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"bFS" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"bFV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Council Chamber"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"bGc" = ( +/obj/machinery/telecomms/bus/preset_one, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bGd" = ( +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"bGe" = ( +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bGf" = ( +/obj/machinery/telecomms/bus/preset_three, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bGh" = ( +/obj/machinery/announcement_system, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bGm" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/warden) +"bGq" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_one_access_txt = "12;37" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bGr" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/locker) +"bGH" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"bGI" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"bHf" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"bHl" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/brig) +"bHq" = ( +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"bHH" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"bHM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"bHT" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Dormitories - Fore" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"bIb" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Starboard Aft" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"bIh" = ( +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bIp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"bIV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/air_sensor/incinerator_tank, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"bIW" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"bJb" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/button/massdriver{ + name = "Core Eject"; + pixel_y = -4; + id = "sm_core_eject" + }, +/obj/machinery/button/door{ + name = "Core Vent Control"; + pixel_y = 6; + id = "sm_core_vent" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/right/directional/north{ + name = "Engine Emergency Systems"; + req_access_txt = "56" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"bJg" = ( +/obj/machinery/telecomms/message_server/preset, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bJh" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"bJl" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"bJm" = ( +/obj/machinery/telecomms/bus/preset_two, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bJn" = ( +/obj/machinery/blackbox_recorder, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bJr" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bJs" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/siding/brown/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"bJz" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"bJO" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"bJP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"bKl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"bKn" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"bKA" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"bKL" = ( +/obj/machinery/telecomms/processor/preset_two, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bKM" = ( +/obj/machinery/ntnet_relay, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bKN" = ( +/obj/machinery/telecomms/bus/preset_four, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bKO" = ( +/obj/machinery/telecomms/hub/preset, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"bKP" = ( +/obj/machinery/telecomms/processor/preset_four, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bKU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bKY" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"bLe" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bLv" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"bLx" = ( +/obj/structure/bed, +/obj/item/bedsheet/captain, +/obj/effect/landmark/start/captain, +/obj/machinery/camera/directional/east{ + c_tag = "Captain's Quarters" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"bLG" = ( +/turf/open/floor/iron, +/area/station/security/warden) +"bLT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"bLX" = ( +/obj/machinery/button/ignition/incinerator/atmos, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"bMj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"bMt" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/hydroponics/garden) +"bMu" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - Aft Arm - Far" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bMV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"bMX" = ( +/obj/machinery/vending/wardrobe/chef_wardrobe, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch/directional/south{ + pixel_x = -6 + }, +/obj/machinery/button/door/directional/south{ + name = "Service Shutter Control"; + pixel_x = 6; + id = "kitchen_service"; + req_access_txt = "28" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"bNd" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/central/port) +"bNq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"bNv" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/machinery/newscaster/directional/north, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"bNS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) +"bNX" = ( +/obj/machinery/telecomms/server/presets/common, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bNY" = ( +/obj/machinery/telecomms/server/presets/engineering, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bOa" = ( +/obj/machinery/telecomms/server/presets/medical, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bOb" = ( +/obj/machinery/telecomms/server/presets/science, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bOc" = ( +/obj/machinery/telecomms/broadcaster/preset_left, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bOi" = ( +/obj/structure/table, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bOj" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"bOG" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/prepainted/daedalus, +/area/space/nearstation) +"bOJ" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"bOW" = ( +/obj/structure/lattice/catwalk, +/turf/open/floor/iron, +/area/space/nearstation) +"bPh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"bPi" = ( +/obj/item/kirbyplants/fullysynthetic, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"bPL" = ( +/obj/structure/rack, +/obj/item/storage/box, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bPN" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bPQ" = ( +/obj/machinery/suit_storage_unit/hos, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"bQc" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/directional/west, +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"bQk" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/east, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/ported/border/borderfloor, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/monitoring) +"bQl" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"bQm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/science/robotics/mechbay) +"bQw" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"bQI" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"bQK" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"bQL" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"bQP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"bQV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"bRb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Locker Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"bRg" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/light/directional/east, +/obj/machinery/skill_station, +/turf/open/floor/wood, +/area/station/service/library) +"bRi" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"bRj" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"bRq" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + name = "Privacy Control"; + id = "med_sleeper_left"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"bRs" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"bRy" = ( +/obj/machinery/door/window/right/directional/south{ + name = "Engineering Deliveries"; + dir = 4; + req_access_txt = "10" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/main) +"bRW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"bRX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/filingcabinet/chestdrawer{ + name = "case files" + }, +/obj/item/folder/red, +/obj/item/folder/white, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"bRZ" = ( +/obj/structure/disposalpipe/sorting/mail{ + sortType = 14 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"bSr" = ( +/obj/item/storage/secure/safe/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"bSu" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"bSx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/station/medical/morgue) +"bSz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"bSU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"bTg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bTt" = ( +/obj/item/storage/box, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bTL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"bTT" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"bUu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bUL" = ( +/obj/machinery/telecomms/server/presets/security, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"bUO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"bUU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bUV" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bVs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"bVF" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/warehouse) +"bVH" = ( +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"bVK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bVT" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bVV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/machinery/camera/autoname/directional/east{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"bWb" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"bWe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"bWr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"bWs" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"bWK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"bWN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"bWS" = ( +/obj/structure/table/wood, +/obj/item/book/granter/action/spell/smoke/lesser{ + name = "mysterious old book of cloud-chasing" + }, +/obj/item/reagent_containers/food/drinks/bottle/holywater{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/nullrod{ + pixel_x = 4 + }, +/obj/item/organ/heart, +/obj/item/soulstone/anybody/chaplain, +/turf/open/floor/cult, +/area/station/service/chapel/office) +"bWZ" = ( +/obj/structure/rack, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine{ + pixel_y = 8 + }, +/obj/item/clothing/glasses/meson/engine{ + pixel_y = -8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"bXg" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"bXx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bXC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bXE" = ( +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"bXW" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Medbay Treatment Center" + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"bXZ" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/fore) +"bYj" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/mug/coco{ + pixel_x = 8 + }, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"bYt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"bYL" = ( +/turf/open/floor/iron/recharge_floor, +/area/station/maintenance/port/aft) +"bYQ" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/mud, +/area/station/security/pig) +"bYS" = ( +/turf/closed/wall/prepainted/medical, +/area/station/maintenance/port) +"bZb" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"bZo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"bZK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"bZQ" = ( +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"cae" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/warden) +"cam" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"caz" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17;18;5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"caC" = ( +/obj/machinery/computer/security/telescreen{ + name = "turbine vent monitor"; + desc = "Used for watching the turbine vent."; + dir = 8; + pixel_x = 29; + network = list("turbine") + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/structure/cable/red{ + icon_state = "3" + }, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"caG" = ( +/obj/machinery/computer/security/telescreen/ce{ + dir = 1; + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/suit_storage_unit/ce, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"caH" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"caK" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/porta_turret/ai, +/obj/machinery/computer/security/telescreen{ + name = "Research Monitor"; + desc = "Used for watching the RD's goons from the safety of his office."; + dir = 4; + pixel_x = -28; + network = list("rd") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"caT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cbd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + location = "11-Command-Port"; + codes_txt = "patrol;next_patrol=11.1-Command-Starboard" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"cbi" = ( +/obj/structure/chair/wood/wings, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) +"cbn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"cbq" = ( +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"cbB" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people, +/obj/machinery/light/directional/south, +/obj/item/paper/guides/jobs/hydroponics, +/obj/machinery/camera/directional/south{ + c_tag = "Hydroponics - Foyer" + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"cbI" = ( +/obj/machinery/computer/message_monitor{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"cbP" = ( +/obj/machinery/light/directional/north, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"cca" = ( +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ccg" = ( +/obj/machinery/airalarm/directional/north, +/obj/structure/closet/secure_closet/personal, +/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/spawner/random/bureaucracy/briefcase, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"ccv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ccw" = ( +/obj/structure/chair/comfy/brown, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"ccF" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"ccH" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office - Backroom" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"ccM" = ( +/obj/machinery/computer/security/mining, +/obj/machinery/keycard_auth/directional/north, +/obj/item/radio/intercom/directional/north{ + pixel_y = 34 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ccN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"ccZ" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "129" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cdh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cdp" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/exam_room) +"cdR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"cee" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"cem" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/storage/art) +"cep" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"cet" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"ceC" = ( +/obj/machinery/telecomms/server/presets/command, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"ceP" = ( +/obj/structure/transit_tube/curved/flipped{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"ceV" = ( +/obj/machinery/power/solar{ + name = "Aft-Port Solar Array"; + id = "aftport" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"ceY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"cff" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"cfu" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Fore Primary Hallway Aft" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"cfw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"cfE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"cgg" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"cgk" = ( +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"cgq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"cgr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/obj/effect/spawner/random/contraband/armory, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"cgB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Deck"; + req_one_access_txt = "1;4" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"cgC" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"cgE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"cgS" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Lab"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"chg" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + name = "Supermatter Chamber"; + heat_proof = 1; + req_one_access_txt = "10;24" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"chm" = ( +/obj/item/paper{ + pixel_x = -8; + pixel_y = 8 + }, +/obj/structure/sign/poster/contraband/donut_corp{ + pixel_y = 32 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/office) +"chn" = ( +/obj/machinery/telecomms/broadcaster/preset_right, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"cho" = ( +/obj/machinery/telecomms/server/presets/supply, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"cii" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"cjn" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/service/bar) +"cjI" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/wood, +/obj/item/folder{ + pixel_y = 2 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"cjQ" = ( +/obj/machinery/light/small/red/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/sign/warning/fire{ + pixel_y = -32 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"cjR" = ( +/obj/structure/closet/lasertag/red, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"cjS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ckm" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"ckA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) +"ckD" = ( +/obj/structure/closet/wardrobe/grey, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"ckE" = ( +/obj/machinery/light/cold/directional/west, +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"ckH" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"ckP" = ( +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ckW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"clh" = ( +/obj/machinery/vending/wardrobe/sec_wardrobe, +/turf/open/floor/iron, +/area/station/security/lockers) +"clr" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/north, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Virology Isolation A" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"clI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"clL" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"cmx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"cmC" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"cmE" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"cmF" = ( +/obj/machinery/door/airlock/security{ + name = "Control Room"; + req_access_txt = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/warden) +"cmZ" = ( +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"cnf" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"cnh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/box/red/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/red/corners{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + name = "Mech Bay Shutters"; + id = "mechbay" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/mechbay) +"cnj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Locker Room" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/commons/locker) +"cno" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 8 + }, +/obj/machinery/light/cold/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"cnS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/central) +"cnZ" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cod" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"cog" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"coh" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/item/defibrillator/loaded, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"cou" = ( +/obj/machinery/disposal/bin, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light_switch/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"coC" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Hydroponics Maintenance"; + req_access_txt = "35" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"cpd" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"cpi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"cpj" = ( +/obj/structure/table/glass, +/obj/item/modular_computer/laptop/preset/civilian{ + pixel_y = 3 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"cpC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/turf/open/floor/wood, +/area/station/service/library) +"cpW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"cpX" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = 6; + pixel_y = 4; + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"cpY" = ( +/obj/effect/landmark/start/captain, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"cqg" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"cqh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"cqi" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/medbay/central) +"cqF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"cqW" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"cqX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Medical Reception" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"crh" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"crm" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"crq" = ( +/obj/structure/rack, +/obj/item/circuitboard/machine/telecomms/bus, +/obj/item/circuitboard/machine/telecomms/broadcaster, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"crr" = ( +/obj/item/bodypart/chest/robot{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/bodypart/head/robot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"crI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"crV" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/kitchenspike, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"crX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"crZ" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"csa" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"csf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"csn" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"csC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"csW" = ( +/turf/closed/wall/prepainted/medical, +/area/station/science/robotics/lab) +"ctb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"ctp" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cty" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"ctO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"ctZ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/medical) +"cua" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cuj" = ( +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"cuC" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"cuQ" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/effect/turf_decal/trimline/blue/end, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cuR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"cvr" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"cvK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"cvY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"cwg" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"cwl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cwn" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/storage) +"cwp" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"cww" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"cwJ" = ( +/obj/machinery/bodyscanner_console, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"cxg" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"cxl" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/space, +/area/space/nearstation) +"cxt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"cxx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"cxQ" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cxS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + name = "Virology Exterior Airlock"; + frequency = 1449; + id_tag = "virology_airlock_exterior"; + autoclose = 0; + req_access_txt = "39" + }, +/obj/machinery/door_buttons/access_button{ + name = "Virology Access Button"; + dir = 1; + pixel_y = -24; + idSelf = "virology_airlock_control"; + idDoor = "virology_airlock_exterior"; + req_access_txt = "39" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"cyq" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"cyx" = ( +/obj/machinery/door/window{ + name = "Secure Art Exhibition"; + req_access_txt = "37" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/sign/painting/large/library{ + dir = 1 + }, +/turf/open/floor/carpet/royalblue, +/area/station/service/library) +"cyR" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/item/chair, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"cyY" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + name = "Unit 2 Head Pressure Pump" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"czd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"czk" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"czr" = ( +/obj/machinery/door/airlock{ + name = "Commissary"; + id_tag = "commissarydoor" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"czt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"czC" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"czL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"czM" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/fitness/recreation) +"czT" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"czU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/girder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cAd" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) +"cAn" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"cAo" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"cAr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"cAI" = ( +/obj/structure/table, +/obj/item/paper/guides/jobs/engi/gravity_gen, +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"cAR" = ( +/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/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/crowbar, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = 4; + pixel_y = 6 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"cAV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cAX" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = -2 + }, +/obj/structure/mirror/directional/west, +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/medical/medbay/aft) +"cAZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"cBe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cBk" = ( +/obj/structure/table, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cBr" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "129" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"cBv" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"cBz" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"cBC" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/twenty, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"cBJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"cBS" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/psychologist, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/medical/psychology) +"cBZ" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"cCd" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/structure/plasticflaps/opaque, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/qm) +"cCj" = ( +/obj/structure/lattice/catwalk, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"cCk" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"cCn" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"cCL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/oxygen_output{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"cCO" = ( +/obj/structure/flora/junglebush/large, +/obj/machinery/light/floor/has_bulb, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/medical/medbay/central) +"cCS" = ( +/obj/machinery/conveyor_switch/oneway{ + name = "disposal conveyor"; + dir = 8; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"cDh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"cDm" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"cDp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"cEa" = ( +/obj/effect/landmark/start/chief_engineer, +/obj/structure/chair/office/light{ + dir = 1; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"cEd" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cEs" = ( +/obj/structure/table/wood, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/clothing/head/collectable/hop{ + name = "novelty HoP hat" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"cEx" = ( +/obj/structure/chair, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"cEO" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/computer/chef_order{ + dir = 8 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"cFa" = ( +/obj/machinery/computer/med_data{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"cFp" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"cFt" = ( +/obj/machinery/navbeacon{ + location = "6-Port-Central"; + codes_txt = "patrol;next_patrol=7-Command-Starboard" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"cFJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "5" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"cGq" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"cGG" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"cGQ" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"cGR" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/structure/table/glass, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cGU" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/brig) +"cHd" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"cHi" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Escape Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"cHp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/lounge) +"cHw" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"cHM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/chair/stool{ + dir = 8 + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"cHP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"cHS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"cHT" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/central/aft) +"cIb" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"cIu" = ( +/obj/machinery/computer/monitor{ + name = "Bridge Power Monitoring Console" + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cII" = ( +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"cJz" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/nitrogen_tank{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cJG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cJM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"cJO" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"cJY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"cKc" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"cKD" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"cKF" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"cKN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cLm" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cLt" = ( +/obj/machinery/button/door/directional/west{ + name = "Transit Tube Lockdown"; + pixel_y = -6; + id = "transitlockdown"; + req_access_txt = "19" + }, +/obj/machinery/button/door/directional/west{ + name = "Engineering Secure Storage"; + pixel_y = 6; + id = "Secure Storage"; + req_access_txt = "11" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"cLB" = ( +/obj/structure/chair/stool/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"cLJ" = ( +/obj/effect/turf_decal/box/corners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cLO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/lockers) +"cLQ" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"cLT" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/noticeboard/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"cLY" = ( +/obj/machinery/power/solar{ + name = "Aft-Port Solar Array"; + id = "aftport" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"cMf" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cMn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"cMr" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"cMw" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cMA" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"cMD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"cMG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"cMJ" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cMR" = ( +/obj/structure/table, +/obj/item/candle, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cMS" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cMT" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cMU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/volume_pump{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cNj" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/cultivator, +/obj/item/clothing/head/chefhat, +/obj/machinery/camera/directional/west{ + c_tag = "Service - Starboard" + }, +/obj/item/storage/box/lights/mixed, +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"cNl" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"cNr" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"cNN" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/palebush, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/grass, +/area/station/hallway/secondary/exit/departure_lounge) +"cNR" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cNZ" = ( +/obj/structure/table, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/security, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"cOb" = ( +/obj/machinery/light/floor/has_bulb, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cOc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood, +/area/station/service/bar) +"cOf" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"cOn" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"cOH" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) +"cOK" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"cOT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cOW" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/sunnybush, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/grass, +/area/station/hallway/secondary/exit/departure_lounge) +"cOY" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"cPc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"cPd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"cPf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"cPm" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/directional/west, +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron, +/area/station/cargo/storage) +"cPp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"cPs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"cPu" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cPD" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;63;48;50" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"cPO" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/abandoned, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"cPS" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cQl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-right" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cQn" = ( +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cQu" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"cQE" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"cQH" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"cQJ" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQK" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQL" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQM" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQO" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQP" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cQR" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"cQT" = ( +/obj/structure/girder/displaced, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"cQY" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"cRl" = ( +/turf/open/floor/iron, +/area/station/medical/cryo) +"cRB" = ( +/obj/machinery/space_heater, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"cRQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"cRX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"cSD" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/camera/directional/south{ + network = list("ss13","medbay"); + c_tag = "Medbay Diagnostics" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"cSF" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Filter"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cSN" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cTo" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/aisat/exterior) +"cUL" = ( +/obj/machinery/navbeacon{ + location = "9.4-Escape-4"; + codes_txt = "patrol;next_patrol=10-Aft-To-Central" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"cVf" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cVg" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/side, +/area/station/security/prison/workout) +"cVH" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/security/warden) +"cVP" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"cVR" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + name = "Cell 1"; + dir = 8; + id = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"cWh" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"cWz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"cWD" = ( +/obj/machinery/bluespace_beacon, +/turf/open/floor/iron, +/area/station/command/teleporter) +"cWW" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/asteroid_magnet{ + center_x = 43; + center_y = 162; + area_size = 6 + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"cXE" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"cXH" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"cXJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Ports"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"cYc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "24" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"cYf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/pig) +"cYH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Art Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"cYL" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"cYM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"cYP" = ( +/obj/machinery/suit_storage_unit/radsuit, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"cYR" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/camera/directional/north{ + c_tag = "Locker Room Starboard" + }, +/obj/structure/sign/warning/pods{ + pixel_y = 30 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/commons/locker) +"cZb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/library) +"cZh" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"cZs" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/command/gateway) +"cZt" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals - Fore Arm" + }, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"cZx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"cZB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"cZD" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"cZE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dak" = ( +/obj/structure/table/wood, +/obj/machinery/status_display/evac/directional/north, +/obj/item/book/manual/wiki/tcomms, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/pen, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"daz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"daD" = ( +/obj/structure/rack, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/item/borg/upgrade/rename{ + pixel_y = 3 + }, +/obj/item/borg/upgrade/rename{ + pixel_y = -2; + pixel_x = -2 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"daE" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"daR" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/prison/workout) +"dbw" = ( +/obj/structure/closet/secure_closet/engineering_chief, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/storage/secure/briefcase, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"dbx" = ( +/obj/machinery/vending/drugs, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"dby" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"dbz" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"dbA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"dcd" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/button/door/directional/north{ + name = "Separator Control"; + id = "med_sleeper_center"; + req_access_txt = "5" + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker/cryoxadone, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dcO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/storage/medkit/regular, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/medical) +"ddc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"ddp" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/sign/directions/evac{ + pixel_x = -32 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"ddC" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ddG" = ( +/obj/structure/table/reinforced, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/service, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"dee" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/directional/south, +/obj/machinery/biogenerator{ + pixel_x = 3 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"dem" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"dep" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"dey" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/detectives_office/private_investigators_office) +"deD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"deE" = ( +/obj/structure/closet/emcloset, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"dfl" = ( +/obj/machinery/computer/bank_machine, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"dfp" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"dfr" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"dfF" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"dfG" = ( +/obj/machinery/light_switch/directional/south, +/obj/structure/closet/mini_fridge/clean, +/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/cola, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/item/reagent_containers/food/drinks/soda_cans/cola, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood, +/area/station/medical/break_room) +"dfP" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/warning/pods{ + pixel_y = 30 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"dfV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/engineering/glass{ + name = "Power Monitoring"; + req_access_txt = "11" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/engine_smes) +"dfX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dgf" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"dgg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"dgm" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"dgr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"dgt" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"dgu" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"dgv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"dgy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"dgN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"dgP" = ( +/obj/item/storage/book/bible, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chapel - Fore" + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"dhb" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"dhf" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"dhi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/green/filled/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dhy" = ( +/obj/structure/chair, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"dhV" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"dir" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"dit" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"diY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"djp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera{ + dir = 6; + network = list("ss13","medbay"); + c_tag = "Psychology Office" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"djx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"djC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"djH" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"djW" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"dkc" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dkj" = ( +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"dku" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/structure/cable/orange{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"dky" = ( +/obj/machinery/navbeacon{ + location = "10.1-Central-from-Aft"; + codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dkB" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "MedPatientD_Privacy" + }, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_d) +"dlj" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-16" + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"dma" = ( +/obj/effect/landmark/start/captain, +/obj/structure/chair/comfy/brown, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"dmd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"dmz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"dmB" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel) +"dmI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dmL" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/deck, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"dmM" = ( +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/effect/turf_decal/box, +/obj/structure/window/reinforced, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"dmW" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/cargo/storage) +"dnc" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"dnd" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"dne" = ( +/obj/structure/chair/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"dni" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/rack, +/obj/item/roller{ + pixel_y = 4 + }, +/obj/item/roller{ + pixel_y = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/security/medical) +"dnu" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"dnw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/teleporter) +"dnz" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dnA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"dnC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dnL" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"dnO" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"dnR" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dnS" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"doi" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"doj" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/engine_input{ + dir = 8 + }, +/obj/structure/cable/red{ + icon_state = "18" + }, +/obj/structure/cable/red{ + icon_state = "24" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"doo" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/iron, +/area/station/commons/dorms) +"dor" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "AI core shutters"; + id = "AI Core shutters" + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/ai) +"dou" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"doA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"doD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"doO" = ( +/obj/machinery/vending/hydronutrients, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"doP" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"dpm" = ( +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"dpp" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Conveyor Access"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"dpv" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposaloutlet{ + name = "Cargo Deliveries"; + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/obj/effect/turf_decal/siding/yellow, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"dpw" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"dpx" = ( +/obj/structure/table/wood, +/obj/item/lipstick{ + pixel_y = 5 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Theater - Stage" + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) +"dpC" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"dpG" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"dpX" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "34" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"dpZ" = ( +/obj/structure/table, +/obj/item/stock_parts/micro_laser, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/manipulator, +/obj/item/stock_parts/capacitor, +/obj/item/stock_parts/micro_laser/high, +/obj/item/stock_parts/micro_laser/high, +/obj/item/stock_parts/micro_laser/high, +/obj/item/stock_parts/micro_laser/high, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"dqu" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dqF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"dqG" = ( +/obj/structure/table, +/obj/machinery/photocopier{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"dqW" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Courtroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"dra" = ( +/obj/structure/table/wood, +/obj/effect/abstract/smell_holder/detective_office, +/obj/item/storage/fancy/cigarettes{ + pixel_x = -3 + }, +/obj/item/cigbutt, +/obj/item/cigbutt{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"drx" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "MedPatientA_Privacy" + }, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_a) +"drD" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"dsz" = ( +/obj/machinery/computer/security/wooden_tv, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"dsD" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dsH" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"dsJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"dtk" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"dtA" = ( +/obj/machinery/requests_console/directional/north{ + name = "Head of Security Requests Console"; + pixel_x = 29; + pixel_y = 0; + department = "Head of Security's Desk"; + departmentType = 5; + announcementConsole = 1 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"dtE" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dtK" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"dtM" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) +"dtQ" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dtT" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"dtV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"dtW" = ( +/obj/machinery/chem_master, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"dtZ" = ( +/obj/item/stack/sheet/cardboard, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"dub" = ( +/obj/structure/bookcase/random/fiction, +/turf/open/floor/wood, +/area/station/service/library) +"duk" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Gear Room"; + req_one_access_txt = "1;4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/lockers) +"duo" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"duG" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/plasma_input{ + dir = 1 + }, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"duH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"duW" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"dvd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"dvg" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"dvk" = ( +/obj/structure/table, +/obj/item/ai_module/reset, +/obj/machinery/light/directional/west, +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"dvl" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/camera/emp_proof/directional/north{ + network = list("ss13","engine"); + c_tag = "Engine Room North" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"dvt" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dvy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"dvB" = ( +/turf/open/floor/carpet/green, +/area/station/maintenance/port/aft) +"dvS" = ( +/turf/open/floor/iron, +/area/station/security/office) +"dwj" = ( +/turf/closed/wall/prepainted/daedalus, +/area/space) +"dwD" = ( +/turf/open/floor/iron/stairs/left{ + dir = 8 + }, +/area/station/engineering/atmospherics_engine) +"dwJ" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/structure/grille, +/turf/open/space, +/area/space/nearstation) +"dwW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/storage) +"dxo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"dxt" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron, +/area/station/cargo/storage) +"dxP" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/station/commons/storage/primary) +"dyb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/obj/machinery/meter, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"dyq" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/fore) +"dyx" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/heads_quarters/hop) +"dyA" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters{ + name = "Privacy Shutter"; + id = "detprivate" + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"dyE" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dzb" = ( +/obj/item/clothing/mask/gas, +/obj/effect/spawner/random/structure/table_or_rack, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dzn" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/security/lockers) +"dzo" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Surgery Observation"; + stripe_paint = "#DE3A3A" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"dzw" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 1; + id = "crematoriumChapel" + }, +/obj/machinery/button/crematorium{ + pixel_x = -26; + id = "crematoriumChapel"; + req_access_txt = "27" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"dzx" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"dzB" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light_switch/directional/west{ + pixel_x = -38 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"dAj" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "med_diagnostic_privacy" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dAl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dAw" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/prison/shower) +"dAx" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"dAC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"dAD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"dAK" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/ported/border/borderfloor, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/monitoring) +"dAL" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"dAM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"dAN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "132" + }, +/obj/structure/cable/cyan{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"dAS" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/prison/garden) +"dAX" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"dBl" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"dBB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"dBL" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/crossing, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space, +/area/space/nearstation) +"dBQ" = ( +/obj/machinery/power/apc/highcap/ten_k/directional/west, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"dCk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/modular_computer/console/preset/cargochat/service{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"dCq" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/security/courtroom) +"dDh" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dDj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"dDw" = ( +/obj/structure/table/glass, +/obj/machinery/body_scan_display/directional/west, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 12 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"dDA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"dDE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"dDL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dDP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/west{ + name = "Hydroponics Desk"; + dir = 4; + req_one_access_txt = "30;35" + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"dDQ" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dDT" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"dDX" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/command{ + name = "Chief Engineer's Office"; + req_access_txt = "56" + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/east, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/heads_quarters/ce) +"dEf" = ( +/obj/structure/table, +/obj/item/clothing/head/welding, +/obj/item/clothing/glasses/welding, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"dEm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"dEn" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/office) +"dEq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"dEv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 5 + }, +/obj/machinery/door/firedoor/heavy, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"dED" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"dEH" = ( +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/structure/table/wood, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dEK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"dEO" = ( +/obj/effect/turf_decal/siding/blue, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dEY" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/iv_drip, +/turf/open/floor/iron, +/area/station/security/medical) +"dFg" = ( +/obj/structure/rack, +/obj/item/clothing/under/color/red, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/neck/tie/red, +/obj/item/clothing/head/soft/red, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"dFi" = ( +/obj/machinery/door/airlock{ + name = "Unit 1"; + id_tag = "Toilet1" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"dFr" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 3 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"dFu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"dFG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "130" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"dFI" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"dFM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/filingcabinet/chestdrawer{ + name = "case files" + }, +/obj/item/folder/white, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/structure/window/reinforced/spawner/west{ + pixel_x = -4 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"dGo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dGq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/brig) +"dGW" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/door/window{ + name = "MiniSat Walkway Access" + }, +/obj/machinery/camera/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Aft Port" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"dHb" = ( +/obj/structure/table/wood, +/obj/item/paper, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"dHd" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dHg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/office/hall) +"dHh" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"dHo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"dHx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2; + sortType = 18 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"dHW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"dHY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/grass, +/area/station/security/pig) +"dIg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos/pumproom) +"dII" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Server Room" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) +"dIW" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/cargo/storage) +"dJc" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engine_sides" + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"dJk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dJC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"dJS" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window{ + name = "MiniSat Airlock Access"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"dJT" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing, +/turf/open/space/basic, +/area/space/nearstation) +"dJY" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"dKa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"dKh" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "29" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"dKp" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"dKv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dKy" = ( +/obj/machinery/navbeacon{ + location = "14.5-Recreation"; + codes_txt = "patrol;next_patrol=14.8-Dorms-Lockers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"dKF" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"dKG" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"dKT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"dKU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/air_input{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"dKV" = ( +/obj/effect/landmark/start/botanist, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"dLe" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/cold/directional/south, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/circuit, +/area/station/science/robotics/mechbay) +"dLn" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/station/medical/virology) +"dLt" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/item/reagent_containers/food/drinks/britcup{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"dLF" = ( +/obj/machinery/chem_heater, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"dMq" = ( +/obj/machinery/disposal/bin, +/obj/machinery/airalarm/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/aft) +"dMu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"dMw" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"dMI" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dMJ" = ( +/obj/structure/punching_bag, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/prison/workout) +"dNl" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/security/deck) +"dNp" = ( +/obj/machinery/vending/wardrobe/bar_wardrobe, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/service/bar) +"dNK" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Diagnostics"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"dNN" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/service/theater) +"dNU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"dNY" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"dOR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "40" + }, +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"dOT" = ( +/obj/machinery/camera/motion/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Foyer" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/cyan{ + icon_state = "16" + }, +/obj/structure/cable/cyan{ + icon_state = "24" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"dPg" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"dPm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"dPr" = ( +/obj/structure/closet/firecloset, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dPs" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/lesser) +"dPw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"dPy" = ( +/obj/machinery/door/airlock/vault{ + name = "Isolation Cell A"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"dPS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"dPV" = ( +/obj/machinery/porta_turret/ai, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"dQe" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"dQg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"dQk" = ( +/obj/structure/table, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/station/commons/dorms) +"dQD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/effect/spawner/structure/window/reinforced/tinted, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"dQF" = ( +/obj/machinery/disposal/delivery_chute{ + name = "Security Deliveries"; + dir = 1 + }, +/obj/structure/plasticflaps/opaque{ + name = "Security Deliveries" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/departments/security{ + pixel_y = -32; + color = "#DE3A3A" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"dQO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"dRa" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/surgery/prep) +"dRK" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"dRN" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"dRR" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"dSh" = ( +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dSi" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Command Hallway - Starboard" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"dSo" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/machinery/light/small/directional/north, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/turf/open/floor/iron, +/area/station/commons/locker) +"dSC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/item/crowbar, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dSH" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"dSI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"dSM" = ( +/obj/structure/chair/office, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"dTk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"dTu" = ( +/obj/item/toy/beach_ball/holoball, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"dTH" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"dTL" = ( +/obj/structure/table, +/obj/item/paicard, +/turf/open/floor/iron, +/area/station/commons/locker) +"dTX" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Pure to Mix"; + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dTY" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) +"dUd" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/starboard/fore) +"dUA" = ( +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"dUC" = ( +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"dUJ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-access" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock/security/glass{ + name = "Brig Access"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"dVb" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/office) +"dVB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dVE" = ( +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"dVN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"dVR" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"dVS" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/isolation_cells) +"dWo" = ( +/obj/structure/table/wood, +/obj/machinery/light_switch/directional/west, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"dWR" = ( +/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/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"dXr" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"dXS" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"dXW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"dYb" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"dYj" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"dYv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"dYy" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"dYz" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"dYN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"dZa" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/bin, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"dZf" = ( +/obj/structure/table/wood/fancy/orange, +/obj/machinery/requests_console/directional/east{ + name = "Quartermaster's Requests Console"; + department = "Quartermaster's Desk"; + departmentType = 2; + announcementConsole = 1 + }, +/obj/item/reagent_containers/food/drinks/bottle/whiskey{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -9; + pixel_y = -4 + }, +/turf/open/floor/carpet/red, +/area/station/cargo/qm) +"dZi" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"dZs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"dZO" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"dZP" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"dZW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/no_nightlight/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"dZY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"eaf" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"eag" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/station/maintenance/space_hut) +"eak" = ( +/obj/machinery/airalarm/directional/south, +/obj/item/stack/package_wrap{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/stack/package_wrap, +/obj/structure/table/wood, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"eas" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"eay" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/north, +/obj/item/paper_bin, +/obj/item/pen, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/button/ticket_machine{ + pixel_x = -10; + id = "ticket_machine_medbay"; + req_access_txt = "5"; + pixel_y = 6 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"eaH" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"eaL" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"eaS" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/dorms/cryo) +"eaU" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/commons/lounge) +"eaV" = ( +/obj/machinery/door/airlock/security{ + name = "Solitary Confinement"; + req_access_txt = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"ebi" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"ebm" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"ebo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ebG" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/o_plus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/b_plus, +/obj/item/reagent_containers/blood/b_minus, +/obj/item/reagent_containers/blood/a_plus, +/obj/item/reagent_containers/blood/a_minus, +/obj/item/reagent_containers/blood/lizard, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"ebL" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/window/left/directional/north{ + name = "MuleBot Access"; + req_access_txt = "50" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ebN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"ebP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"ebQ" = ( +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"ebX" = ( +/obj/machinery/airalarm/directional/north, +/obj/item/clothing/under/misc/assistantformal, +/obj/effect/spawner/random/structure/closet_private, +/turf/open/floor/wood, +/area/station/commons/dorms) +"ebY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"ecz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"edd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"edy" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/service/library) +"edz" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"edM" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/noticeboard/directional/east, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"edN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"edU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"eew" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"eeG" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"eeL" = ( +/obj/machinery/camera/directional/south{ + name = "holodeck camera"; + c_tag = "Holodeck - Aft" + }, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"eeM" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = -6 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"eeW" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Command Hallway" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"efb" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/bar) +"efk" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"eft" = ( +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"efw" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"efG" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"efH" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"efP" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/gun/energy/e_gun/dragnet, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"efW" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"egt" = ( +/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{ + name = "Kitchen Counter Shutters"; + id = "kitchen_counter" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/service/kitchen) +"egG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"egL" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"ehA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"ehB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/cryo) +"ehD" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Quartermaster Maintenance"; + req_one_access_txt = "41" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"ehW" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"ehY" = ( +/obj/machinery/door_timer{ + name = "Cell 1"; + pixel_x = -32; + id = "Cell 1" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"eib" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/norn, +/area/station/security/prison/workout) +"eiI" = ( +/obj/machinery/navbeacon{ + dir = 4; + freq = 1400; + location = "Bridge"; + codes_txt = "delivery;dir=4" + }, +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/central) +"eiR" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Aft" + }, +/obj/machinery/light/directional/west, +/obj/item/kirbyplants{ + icon_state = "plant-04" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"eiW" = ( +/obj/effect/mapping_helpers/paint_wall/priapus, +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/service) +"eiX" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/cyan{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"ejg" = ( +/obj/machinery/mass_driver/shack{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/station/maintenance/space_hut) +"ejn" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/wood, +/area/station/service/library) +"ejr" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"ejs" = ( +/obj/machinery/door/airlock/external{ + name = "Atmospherics External Access"; + req_access_txt = "24" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"ejt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"ejH" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ekb" = ( +/obj/structure/mirror/directional/north, +/obj/structure/sink{ + pixel_y = 17 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/soap{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) +"eke" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cardboard, +/obj/item/stack/sheet/cardboard, +/obj/structure/light_construct/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ekj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"ekq" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"eku" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/cold/directional/north, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"ekD" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"ekF" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Brig Infirmary Maintenance"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ekQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ekZ" = ( +/obj/item/stack/sheet/cardboard, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"elh" = ( +/obj/machinery/light/warm/directional/south, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood, +/area/station/medical/psychology) +"elF" = ( +/obj/structure/table, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/item/clothing/glasses/meson/engine, +/obj/machinery/light/directional/east, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/obj/item/pipe_dispenser, +/turf/open/floor/iron, +/area/station/engineering/main) +"elN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"emj" = ( +/obj/machinery/light_switch/directional/south, +/obj/structure/table/wood, +/obj/item/razor{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/clothing/mask/cigarette/cigar, +/obj/item/reagent_containers/food/drinks/flask/gold, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"emo" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"emw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"emK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"emU" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"emY" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/structure/sign/directions/command{ + pixel_y = -8 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/primary/fore) +"emZ" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"enq" = ( +/obj/machinery/door/airlock/command{ + name = "E.V.A. Storage"; + req_access_txt = "18" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"enr" = ( +/obj/machinery/vending/boozeomat/all_access, +/obj/effect/decal/cleanable/cobweb, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"enx" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"enH" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/aft) +"enM" = ( +/obj/item/food/grown/wheat, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/grapes, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"eoh" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"eom" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"eou" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"eoz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"eoL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eoM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrous_output{ + dir = 1 + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"epb" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"epd" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"epj" = ( +/obj/machinery/modular_computer/console/preset/cargochat/medical{ + dir = 8 + }, +/obj/effect/turf_decal/box/red/corners{ + dir = 1 + }, +/obj/effect/turf_decal/box/red/corners{ + dir = 8 + }, +/obj/structure/sign/poster/official/periodic_table{ + pixel_x = 32 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"epk" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "chapel shutters control"; + id = "chapel_shutters_parlour" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"epw" = ( +/obj/machinery/vending/wardrobe/engi_wardrobe, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/main) +"epz" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"epD" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/brig) +"epV" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cardboard, +/obj/item/radio/off, +/obj/structure/light_construct/directional/north, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eqg" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"eqj" = ( +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"eql" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/carpet, +/area/station/service/library) +"eqp" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"eqw" = ( +/obj/structure/bookcase/random/religion, +/turf/open/floor/wood, +/area/station/service/library) +"eqy" = ( +/obj/machinery/light/no_nightlight/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"eqE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"eqF" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"eqL" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"eqO" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/item/clothing/shoes/laceup, +/obj/item/clothing/under/suit/black_really, +/obj/item/clothing/glasses/sunglasses, +/obj/machinery/camera/directional/north{ + c_tag = "Corporate Showroom" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"eqS" = ( +/obj/structure/sign/warning/securearea{ + pixel_x = -32 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"erf" = ( +/obj/item/clothing/head/cone, +/turf/open/floor/plating, +/area/space/nearstation) +"erh" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"erk" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ero" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube/curved{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"eru" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"erx" = ( +/obj/structure/table/glass, +/obj/machinery/light/cold/directional/west, +/obj/machinery/camera/directional/south{ + network = list("ss13","medbay"); + c_tag = "Medbay Surgery Suite A" + }, +/obj/item/retractor, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"erA" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"erC" = ( +/obj/structure/table, +/obj/item/clothing/head/soft/grey{ + pixel_x = -2; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"erE" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/office) +"erM" = ( +/obj/structure/table, +/obj/item/training_toolbox, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"erT" = ( +/obj/structure/rack, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"erY" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"ese" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"esp" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/hemostat, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"esq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"esG" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"esU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"etd" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/keycard_auth/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"eti" = ( +/obj/machinery/light/directional/west, +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"etq" = ( +/obj/machinery/navbeacon{ + location = "12-Central-Starboard"; + codes_txt = "patrol;next_patrol=13.1-Engineering-Enter" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"etx" = ( +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"etP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"euh" = ( +/obj/structure/table/wood, +/obj/item/folder/yellow, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"euj" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"euv" = ( +/obj/structure/noticeboard/directional/north{ + name = "memorial board"; + desc = "A memorial wall for pinning mementos upon." + }, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"euD" = ( +/obj/effect/landmark/blobstart, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"euG" = ( +/obj/item/kirbyplants/random, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"euI" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"euO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"evj" = ( +/obj/structure/light_construct/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"evv" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/plasma_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"evw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"evI" = ( +/obj/machinery/computer/teleporter, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"ewG" = ( +/obj/structure/safe, +/obj/item/storage/secure/briefcase{ + contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/ballistic/automatic/pistol,/obj/item/suppressor,/obj/item/melee/baton/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen) + }, +/obj/item/storage/backpack/duffelbag/syndie/hitman, +/obj/item/card/id/advanced/silver/reaper, +/obj/item/lazarus_injector, +/obj/item/gun/energy/disabler, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/a357, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes"; + desc = "An undeniably handy book."; + icon_state = "bookknock" + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"ewV" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"ewX" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/fore) +"exa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"exc" = ( +/obj/structure/closet, +/obj/item/extinguisher, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"exe" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office) +"exn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/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/neutral, +/obj/machinery/suit_storage_unit/atmos/mod, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"exS" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"eyk" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/rnd_secure_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"eyI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"eyP" = ( +/obj/machinery/newscaster/directional/north, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"eza" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ezw" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"ezz" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Port-Fore" + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ezP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/gateway) +"ezS" = ( +/obj/machinery/door/airlock{ + name = "Unit B" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"ezT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"ezU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + name = "Cargo Deliveries"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"eAt" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark/corner{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"eAD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/curved{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"eAQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"eAV" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) +"eBh" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"eBj" = ( +/obj/machinery/sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Treatment B" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"eBo" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"eBp" = ( +/mob/living/simple_animal/hostile/lizard/wags_his_tail, +/turf/open/floor/iron, +/area/station/service/janitor) +"eBA" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"eBW" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/obj/structure/table/glass, +/obj/item/storage/box/gloves, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"eCg" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"eCz" = ( +/obj/structure/closet/wardrobe/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"eCI" = ( +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"eCP" = ( +/turf/open/floor/iron/norn, +/area/station/security/prison/workout) +"eDd" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"eDj" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/corporate_showroom) +"eDm" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = 7 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","prison","isolation") + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"eDE" = ( +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"eDJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"eDW" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"eDX" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/plasma{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"eEf" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"eEg" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Entrance" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"eEk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"eEs" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"eEt" = ( +/obj/structure/urinal/directional/east, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"eEw" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port) +"eEA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"eEU" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eFa" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Secure Tech Storage" + }, +/obj/item/radio/intercom/directional/east, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"eFl" = ( +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"eFw" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/modular_computer/console/preset/id, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"eFG" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eFP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"eGa" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"eGf" = ( +/obj/effect/turf_decal/bot/left, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"eGg" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"eGh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"eGl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"eGn" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"eGo" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "33" + }, +/obj/structure/cable/orange{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"eGp" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"eGs" = ( +/obj/structure/table, +/obj/item/kirbyplants/photosynthetic, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"eGB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/donksofttoyvendor, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"eGO" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"eGZ" = ( +/turf/open/floor/iron, +/area/station/cargo/sorting) +"eHf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"eHq" = ( +/obj/structure/rack, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/spawner/random/maintenance, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eHx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/pharmacy) +"eHy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"eHH" = ( +/obj/machinery/navbeacon{ + location = "13.1-Engineering-Enter"; + codes_txt = "patrol;next_patrol=13.2-Tcommstore" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"eHZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/waterbottle/large{ + pixel_x = 5; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/drinks/waterbottle{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/plate{ + pixel_x = -9 + }, +/obj/item/reagent_containers/food/drinks/waterbottle{ + pixel_x = 7 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_x = -9; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"eId" = ( +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"eIe" = ( +/obj/machinery/vending/coffee, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"eIn" = ( +/obj/structure/chair, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"eIo" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/computer/atmos_control/oxygen_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"eIt" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eIA" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"eIL" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/security/prison/rec) +"eIO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"eJa" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/window/reinforced, +/obj/machinery/door/window{ + name = "Secure Art Exhibition"; + dir = 8; + req_access_txt = "37" + }, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/turf/open/floor/carpet/royalblue, +/area/station/service/library) +"eJe" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/break_room) +"eJq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/goonplaque, +/area/station/hallway/primary/port) +"eJs" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"eJv" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"eJy" = ( +/obj/machinery/disposal/delivery_chute{ + name = "Engineering Deliveries"; + dir = 1 + }, +/obj/structure/plasticflaps/opaque{ + name = "Engineering Deliveries" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/structure/sign/departments/engineering{ + pixel_y = -32; + color = "#EFB341" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"eJC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"eJG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"eJQ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Rooms"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"eKb" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"eKt" = ( +/obj/structure/table/wood, +/obj/item/toy/mecha/honk{ + pixel_y = 12 + }, +/obj/item/toy/dummy, +/obj/item/lipstick/purple{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/lipstick/jade{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/black, +/obj/structure/mirror/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/theater) +"eKy" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"eKD" = ( +/obj/effect/spawner/random/structure/chair_comfy{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"eKE" = ( +/obj/structure/chair/comfy/beige, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/bridge) +"eKK" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eKY" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "64" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"eLm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"eLq" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"eLv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"eLw" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/curved/flipped{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space, +/area/space/nearstation) +"eLC" = ( +/obj/structure/disposalpipe/junction/flip, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"eLH" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"eLR" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eMn" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"eMC" = ( +/obj/structure/sign/plaques/kiddie/perfect_drone{ + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/storage/backpack/duffelbag/drone, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"eMG" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/clothing/suit/hooded/wintercoat/engineering, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"eMO" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"eMT" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"eNc" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"eNe" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Auxiliary Bathrooms" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"eNh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"eNl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eND" = ( +/obj/structure/sign/departments/cargo, +/obj/structure/disposalpipe/sorting, +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/warehouse) +"eNT" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4; + pixel_x = -15 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"eOi" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"eOm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"eOt" = ( +/obj/structure/disposalpipe/broken{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"eOG" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"eOW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"ePa" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;29" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ePb" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"ePr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ePF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/vehicle/ridden/janicart, +/obj/item/key/janitor, +/turf/open/floor/iron, +/area/station/service/janitor) +"ePG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"ePR" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table/reinforced, +/obj/effect/spawner/random/trash/food_packaging, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"ePY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"eQg" = ( +/obj/machinery/flasher/directional/south{ + id = "AI" + }, +/obj/machinery/porta_turret/ai{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"eQl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/obj/machinery/meter, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"eQn" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Bar - Backroom" + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/mirror/directional/north, +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"eQr" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"eQv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/main) +"eQJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"eQQ" = ( +/obj/item/food/snowcones/clown, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"eQZ" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eRi" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"eRA" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Council Blast Doors"; + id = "council blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"eRN" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/random/food_or_drink/seed{ + spawn_all_loot = 1; + spawn_random_offset = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"eRW" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"eSA" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"eSB" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Reception Desk"; + icon_state = "right"; + dir = 2; + base_state = "right" + }, +/obj/machinery/door/window/brigdoor/right{ + dir = 1; + req_one_access_txt = "3" + }, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/plating, +/area/station/security/warden) +"eSU" = ( +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"eSZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"eTd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/security/brig) +"eTg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/item/broken_bottle{ + pixel_x = 9; + pixel_y = -4 + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2; + sortType = 20 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"eTi" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"eTk" = ( +/obj/structure/table, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/item/geiger_counter{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/radio/off{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"eTp" = ( +/obj/structure/closet/secure_closet/captains, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"eTv" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"eTz" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"eTE" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/engineering/main) +"eTF" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"eTG" = ( +/mob/living/simple_animal/bot/cleanbot, +/obj/machinery/light/small/directional/east, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"eTJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"eTP" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engine_sides" + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"eUu" = ( +/obj/structure/transit_tube/crossing/horizontal, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"eUy" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"eUX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"eVe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/library) +"eVo" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/prison/garden) +"eVu" = ( +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"eVL" = ( +/obj/machinery/door/airlock{ + name = "Unit 3"; + id_tag = "AuxToilet3" + }, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"eVM" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/rnd_all, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"eVO" = ( +/obj/structure/sign/plaques/kiddie/badger{ + pixel_y = 32 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"eWb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/carpet, +/area/station/service/library) +"eWg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"eWt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space/basic, +/area/station/solars/starboard/fore) +"eWE" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"eWK" = ( +/obj/machinery/power/shieldwallgen, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"eXB" = ( +/obj/structure/rack, +/obj/item/clothing/gloves/color/fyellow, +/obj/structure/sink/kitchen{ + name = "old sink"; + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + pixel_y = 28 + }, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"eXC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/item/chair/stool/bar, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eXG" = ( +/obj/structure/chair/stool, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"eXT" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Command Hallway - Port" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"eXW" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/rack, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler, +/obj/item/assembly/timer, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"eXX" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"eXZ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"eYw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"eYz" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"eYK" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"eYS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"eZg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"eZh" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/fore) +"eZk" = ( +/obj/structure/filingcabinet/employment, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"eZt" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"eZz" = ( +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"eZP" = ( +/obj/machinery/door/window{ + name = "Primary AI Core Access"; + icon_state = "rightsecure"; + dir = 4; + atom_integrity = 300; + base_state = "rightsecure"; + req_access_txt = "16" + }, +/obj/machinery/camera/directional/north{ + network = list("aicore"); + c_tag = "AI Chamber - Core" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"eZV" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"far" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"faE" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"faJ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Genpop Brig" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"faK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"fbl" = ( +/obj/structure/table, +/obj/item/storage/medkit/brute, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"fbm" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"fbo" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"fbs" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/machinery/door/poddoor/shutters{ + name = "Privacy Shutter"; + id = "detprivate" + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"fbt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Recreation Area" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"fbY" = ( +/obj/structure/mirror/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"fcd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) +"fcg" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/camera/directional/north{ + c_tag = "Mining Dock" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"fch" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"fcm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"fcp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/medical{ + name = "Charging Bay"; + req_access_txt = "29"; + stripe_paint = "#563758" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/science/robotics/mechbay) +"fcA" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/warden) +"fcJ" = ( +/obj/structure/lattice, +/obj/item/shard, +/turf/open/space/basic, +/area/space/nearstation) +"fcN" = ( +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"fcR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/space_hut) +"fcX" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/clothing/head/welding{ + pixel_y = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/clothing/head/welding{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"fdk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"fdr" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/north, +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/security/warden) +"fdK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"fdM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/atmos_alert, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"fdZ" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"feh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"feK" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/sign/directions/evac{ + pixel_x = -32 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"ffv" = ( +/obj/machinery/camera/directional/south{ + network = list("aicore"); + c_tag = "AI Chamber - Aft" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"ffx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"ffB" = ( +/obj/machinery/camera/motion/directional/south{ + network = list("vault"); + c_tag = "Vault" + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"ffN" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ffP" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating/foam{ + temperature = 2.7 + }, +/area/space/nearstation) +"fgb" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/storage) +"fgd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/theater) +"fgl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"fgs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"fgt" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "med_break_privacy" + }, +/turf/open/floor/plating, +/area/station/medical/break_room) +"fgQ" = ( +/obj/machinery/door/firedoor/border_only/closed{ + name = "Animal Pen B"; + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"fgV" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"fhe" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/west, +/obj/machinery/fax_machine, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"fhj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fhz" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fhA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"fic" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"fir" = ( +/obj/machinery/pdapainter{ + pixel_y = 2 + }, +/obj/machinery/requests_console/directional/north{ + name = "Head of Personnel's Requests Console"; + department = "Head of Personnel's Desk"; + departmentType = 5; + announcementConsole = 1 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"fiG" = ( +/obj/machinery/door/airlock/atmos{ + name = "Hypertorus Fusion Reactor"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"fiJ" = ( +/obj/structure/table, +/obj/machinery/recharger, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"fiK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"fjf" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"fjt" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"fjJ" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/item/reagent_containers/glass/bottle/chloralhydrate{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 5; + pixel_y = -4 + }, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"fjQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"fjR" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "privacy shutter"; + id = "ceprivacy" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"fjT" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"fkb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"fks" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"fky" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"fkG" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"fkN" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"fkR" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"fkS" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"flc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"fle" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/turf/open/floor/iron, +/area/station/security/office) +"fln" = ( +/obj/structure/closet/masks, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"flt" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"flx" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"flB" = ( +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"flF" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"flL" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"fmg" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/ai_monitored/command/storage/eva) +"fmG" = ( +/obj/machinery/door/window{ + name = "MiniSat Walkway Access"; + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"fmL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fmW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"fnf" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/window/reinforced/spawner/north, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"fnq" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Rooms"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"fnM" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"fnS" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"fnT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/cook, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"fnU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"foa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/vitals_monitor, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"foq" = ( +/turf/open/floor/wood, +/area/station/service/lawoffice) +"foy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/rnd/production/fabricator/department/robotics, +/obj/machinery/status_display/ai/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"foI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"foO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"foS" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17;18;5" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fpf" = ( +/obj/structure/chair{ + name = "Prosecution"; + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"fpo" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"fpF" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"fpH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"fqh" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"fqi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"fqq" = ( +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"fqG" = ( +/obj/structure/chair/stool/directional/north, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"fqH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fqO" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"fqW" = ( +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fri" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"frs" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"frw" = ( +/obj/structure/closet/athletic_mixed, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"frC" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"frK" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/kirbyplants/potty, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/computer/security/telescreen/entertainment/directional/south, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"frQ" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"fsc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/obj/machinery/light/no_nightlight/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"fsh" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"fsz" = ( +/obj/structure/toilet/greyscale{ + dir = 4 + }, +/obj/effect/spawner/random/contraband/permabrig_weapon, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"fsS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fsV" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fsW" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"fsX" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"fta" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ftf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;29" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ftj" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 8 + }, +/obj/structure/sign/departments/chemistry/pharmacy{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ftq" = ( +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"fts" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"ftC" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"ftH" = ( +/obj/structure/railing, +/obj/effect/spawner/random/clothing/wardrobe_closet, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ftV" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fub" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"fud" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"fuf" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fuj" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/locker) +"fuk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ful" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"fun" = ( +/obj/structure/table, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/item/wirecutters, +/obj/item/multitool, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"fuD" = ( +/obj/machinery/bodyscanner, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"fvi" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/security/deck) +"fvk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/holomap/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) +"fvm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"fvr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) +"fvJ" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fwi" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/brown, +/obj/machinery/door/airlock/medical/glass{ + name = "Patient Rooms"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"fwy" = ( +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fwK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "1;4;38;12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"fwP" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"fwY" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/cable/orange{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"fxe" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"fxr" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/obj/item/instrument/musicalmoth{ + name = "Syl Labee" + }, +/turf/open/space/basic, +/area/space/nearstation) +"fxs" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Infirmary"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/medical) +"fxv" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"fxx" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/supply) +"fxE" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"fxM" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"fyi" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"fyL" = ( +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/machinery/atmospherics/components/tank/air, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"fyP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"fyU" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"fyV" = ( +/mob/living/simple_animal/hostile/retaliate/goat{ + name = "Pete" + }, +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 14 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"fzn" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"fzr" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/iron, +/area/station/security/brig) +"fzC" = ( +/obj/machinery/computer/communications, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"fzJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/qm) +"fzZ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"fAj" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"fAJ" = ( +/turf/open/floor/wood, +/area/station/commons/lounge) +"fAR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"fAW" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/left/directional/east{ + name = "Kitchen Delivery"; + req_access_txt = "28" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm/kitchen_cold_room{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"fBb" = ( +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/station/security/prison/workout) +"fBf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"fBk" = ( +/obj/structure/cable/blue{ + icon_state = "128" + }, +/obj/structure/table, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/service{ + friendly_name = "Robotics"; + placard_name = "Medical PBX" + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"fBp" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"fBB" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"fBQ" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"fBZ" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"fCd" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"fCC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"fCQ" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"fCV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"fCW" = ( +/obj/structure/table/glass, +/obj/structure/sign/poster/official/periodic_table{ + pixel_x = 32 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Chemistry" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"fDg" = ( +/obj/machinery/light/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Port Primary Hallway - Middle" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fDi" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/directional/east, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"fDp" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/structure/sign/warning/securearea{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"fDE" = ( +/obj/machinery/door/airlock/engineering{ + name = "Telecomms Storage"; + req_access_txt = "61" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"fDG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"fDY" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"fEg" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"fEm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"fEo" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fEq" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"fEw" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/courtroom) +"fEC" = ( +/obj/structure/closet, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fEJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/dorms/cryo) +"fFg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"fFn" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"fFp" = ( +/obj/item/reagent_containers/glass/rag, +/obj/structure/table/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"fFJ" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Starboard - Art Storage" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"fFN" = ( +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"fFV" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"fGm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"fGs" = ( +/obj/structure/rack, +/obj/item/bodybag/stasis, +/obj/item/bodybag/stasis{ + pixel_y = 6 + }, +/obj/item/bodybag/stasis{ + pixel_y = 12 + }, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"fGv" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"fGx" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"fGP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"fGW" = ( +/obj/structure/cable/orange{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"fHs" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Cargo Desk"; + dir = 2; + req_access_txt = "50" + }, +/obj/item/paper_bin{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/paper/crumpled{ + pixel_x = 7 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"fHC" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/directional/east{ + c_tag = "Vacant Commissary" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"fHW" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"fIf" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Crew Quarters Entrance" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/departments/lawyer{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"fIk" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fIA" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) +"fIC" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"fIX" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/lighter, +/turf/open/floor/carpet, +/area/station/command/bridge) +"fJd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"fJZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"fKb" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"fKc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"fKl" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"fKn" = ( +/obj/machinery/flasher/directional/east{ + pixel_y = 26; + id = "AI" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/holopad/secure, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"fKp" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/prison/shower) +"fKq" = ( +/obj/structure/closet/emcloset, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"fKA" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"fKD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"fKM" = ( +/obj/structure/cable/blue{ + icon_state = "6" + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"fKN" = ( +/obj/structure/closet/secure_closet/hos, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"fLk" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"fLl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/maintenance/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"fLx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"fLz" = ( +/obj/machinery/door/airlock{ + name = "Hydroponics Backroom"; + req_access_txt = "35" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"fLA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"fLZ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"fMh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"fMs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"fMu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/siphon/monitored/air_output{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"fMI" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Warehouse Shutters"; + id = "qm_warehouse" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"fMJ" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Server Room" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) +"fMK" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"fMS" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"fNf" = ( +/obj/structure/closet/crate, +/obj/item/stack/cable_coil, +/obj/item/crowbar, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"fNq" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Cell 3 Locker"; + id = "Cell 3" + }, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron, +/area/station/security/brig) +"fNC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"fOs" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/bed, +/obj/item/bedsheet/green, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"fPm" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/service/library) +"fPu" = ( +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"fPz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"fPN" = ( +/obj/machinery/door/airlock/grunge{ + name = "Genpop Showers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"fPT" = ( +/obj/machinery/vending/engivend, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/engineering/main) +"fQk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"fQm" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"fQq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"fQr" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/carpplushie{ + name = "\improper Nanotrasen wildlife department space carp plushie"; + color = "red" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"fQO" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/supermatter/room) +"fQR" = ( +/obj/effect/spawner/structure/window/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/prison/rec) +"fQS" = ( +/obj/structure/closet/crate/cardboard, +/obj/item/toy/brokenradio, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"fRn" = ( +/obj/machinery/vending/clothing, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"fRp" = ( +/obj/item/candle, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"fRq" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fRO" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/coldroom/starboard) +"fSe" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical{ + pixel_y = 12 + }, +/obj/item/electronics/airalarm{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/item/electronics/firealarm{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/item/electronics/airalarm{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/item/electronics/firealarm{ + pixel_x = 5 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/structure/sign/poster/official/nanotrasen_logo{ + pixel_x = 32 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"fSg" = ( +/obj/structure/chair/stool{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"fSh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"fSu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"fSB" = ( +/obj/structure/lattice, +/obj/machinery/camera/motion/directional/south{ + dir = 8; + network = list("security"); + use_power = 0; + active_power_usage = 0; + c_tag = "Armory - External" + }, +/turf/open/space/basic, +/area/space/nearstation) +"fSO" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Deck"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"fTj" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"fTo" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"fTr" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"fTy" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/warden) +"fTA" = ( +/obj/structure/rack{ + name = "skeletal minibar"; + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar" + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/engine/cult, +/area/station/service/library) +"fTH" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window{ + name = "MiniSat Airlock Access"; + icon_state = "right"; + dir = 8; + base_state = "right" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"fTJ" = ( +/obj/machinery/rnd/production/fabricator/department/service, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/box, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"fTQ" = ( +/obj/machinery/biogenerator, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"fUa" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"fUf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 15 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"fUj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"fUs" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/directional/west{ + name = "Disposal Vent Control"; + id = "Disposal Exit"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"fUD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Departure Lounge Security Post"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"fUF" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"fVb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"fVd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"fVh" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/item/storage/belt/utility, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"fVl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"fVC" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"fVF" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Atmospherics Blast Door"; + id = "atmos" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) +"fVQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/east{ + name = "Kitchen Window"; + dir = 1; + req_access_txt = "28" + }, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Service Shutter"; + id = "kitchen_service" + }, +/obj/item/pen, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"fVZ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space/basic, +/area/space) +"fWk" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/service/bar) +"fWs" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"fWF" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"fWT" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"fXk" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"fXD" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/command) +"fXG" = ( +/obj/structure/closet/wardrobe/pjs, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"fXQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"fXS" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"fYh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"fYx" = ( +/obj/machinery/vending/cart{ + req_access_txt = "57" + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"fYK" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/command/teleporter) +"fYL" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"fYR" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Gear Room"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/lockers) +"fZQ" = ( +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"gaq" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"gav" = ( +/obj/machinery/door/poddoor/incinerator_atmos_aux, +/turf/open/space/basic, +/area/station/maintenance/disposal/incinerator) +"gax" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"gaJ" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "1;4;38;12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"gbh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"gbl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"gbw" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"gby" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/rack, +/obj/item/storage/secure/briefcase, +/obj/item/clothing/mask/cigarette/cigar, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"gbA" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"gbI" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/entry) +"gbZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"gcg" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/pig) +"gcj" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"gck" = ( +/obj/structure/table/wood, +/obj/item/pen/red, +/obj/item/pen/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/library) +"gcy" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gcF" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"gcQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"gcY" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"gdd" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"gde" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/ai_upload) +"gdh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/status_display/evac/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"gdu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Exam Room"; + req_access_txt = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"gdv" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"gdP" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"gdY" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/service/library) +"gea" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw, +/obj/effect/turf_decal/trimline/red/arrow_ccw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"gek" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"gem" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"gey" = ( +/obj/machinery/door/window{ + name = "MiniSat Walkway Access" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"geF" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"geQ" = ( +/obj/machinery/mineral/stacking_unit_console{ + pixel_x = 32; + machinedir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"geT" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"gff" = ( +/obj/machinery/light/directional/south, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"gfo" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/patients_rooms/room_a) +"gfs" = ( +/obj/structure/table, +/obj/machinery/light/directional/east, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/flasher/directional/south{ + id = "AI" + }, +/obj/item/ai_module/core/full/asimov, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"gfx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"gfz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"gfL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gfV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ggs" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/warden) +"ggE" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"ggK" = ( +/obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "5" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"ggT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"ggW" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ghh" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"ghx" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"ghD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/security{ + name = "Forensics Room"; + req_access_txt = "4" + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"ghG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/components/trinary/filter/flipped/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"ghS" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/locker) +"ghU" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"gig" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"gik" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gir" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/camera/directional/south{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Space Access" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"giA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"giP" = ( +/obj/structure/bookcase/random/reference, +/turf/open/floor/wood, +/area/station/service/library) +"gjd" = ( +/obj/machinery/recharge_station, +/turf/open/floor/circuit, +/area/station/science/robotics/mechbay) +"gjC" = ( +/obj/machinery/camera/directional/east{ + network = list("aicore"); + c_tag = "AI Chamber - Starboard" + }, +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"gjD" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"gjS" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/main) +"gjU" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Hypertorus Fusion Reactor Chamber Fore" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"gjZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"gki" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"gkj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"gkk" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/transit_tube/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"gkS" = ( +/obj/machinery/computer/upload/borg, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Cyborg Upload Console Window"; + dir = 2; + layer = 3.1; + req_access_txt = "16" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"gli" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/commons/storage/primary) +"gly" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) +"glI" = ( +/mob/living/simple_animal/pet/dog/corgi/ian, +/obj/machinery/status_display/evac/directional/north, +/obj/structure/bed/dogbed/ian, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"glK" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Auxiliary Tool Storage" + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"glV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"gmf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"gmM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/lounge) +"gnp" = ( +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"gnw" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/command/bridge) +"gnx" = ( +/obj/structure/window/reinforced, +/obj/machinery/door/window/right/directional/east{ + name = "Fitness Ring"; + icon_state = "left"; + dir = 8; + base_state = "left" + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gnA" = ( +/obj/structure/lattice/catwalk, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/turf/open/space/basic, +/area/space/nearstation) +"gnJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"gnO" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"gnS" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"gnY" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"goe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"goQ" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/transmitter, +/obj/item/stock_parts/subspace/amplifier, +/obj/item/stock_parts/subspace/amplifier, +/obj/item/stock_parts/subspace/amplifier, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"goR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/toilet/restrooms) +"goS" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gpd" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/closet/crate/solarpanel_small, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"gpX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"gpZ" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"gqa" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"gql" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"gqm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"gqo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/turf/open/floor/grass, +/area/station/security/pig) +"gqt" = ( +/obj/machinery/button/door/directional/west{ + name = "Radiation Shutters Control"; + id = "atmoshfr"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"gqE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gqI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"gqM" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) +"gqZ" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"grw" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"grF" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"grG" = ( +/obj/machinery/turretid{ + name = "Antechamber Turret Control"; + pixel_x = 30; + control_area = "/area/station/ai_monitored/turret_protected/aisat_interior"; + req_access_txt = "65" + }, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"grN" = ( +/obj/structure/closet/secure_closet/exile, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"grP" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/cyan{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"gsc" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/cigbutt{ + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"gse" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"gst" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"gsw" = ( +/obj/effect/decal/cleanable/oil/slippery, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"gsS" = ( +/obj/machinery/vending/wardrobe/robo_wardrobe, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"gsU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"gsX" = ( +/obj/machinery/door/airlock{ + name = "Unit 4"; + id_tag = "Toilet4" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"gtf" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/item/modular_computer/laptop/preset/civilian, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"gtk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"gtm" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"gts" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"gtC" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"gtQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gub" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"guk" = ( +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/holohoop{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"gul" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"guv" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"guK" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"guM" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"guN" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"guQ" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;26;35" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"guV" = ( +/obj/machinery/computer/atmos_alert, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"gva" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"gvr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"gvs" = ( +/obj/structure/rack, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/item/hand_labeler, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gvH" = ( +/obj/structure/lattice/catwalk, +/obj/item/barcodescanner, +/turf/open/space/basic, +/area/space/nearstation) +"gvN" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"gwf" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/item/storage/secure/safe/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"gwr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"gwv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"gwy" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gwC" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"gwL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"gwY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"gxi" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"gxl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"gxt" = ( +/obj/machinery/door/poddoor/shutters{ + name = "E.V.A. Storage Shutter"; + id = "evashutter" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"gxC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"gxQ" = ( +/obj/structure/chair/stool/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"gxU" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"gxX" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/item/toy/figure/virologist{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"gyh" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/start/botanist, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"gyi" = ( +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"gyw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Command Hallway" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"gyB" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"gyI" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/storage/satellite) +"gyJ" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/storage/tcomms) +"gzE" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"gzF" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/item/kirbyplants{ + icon_state = "plant-05" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"gzJ" = ( +/obj/structure/window/reinforced/spawner/west, +/obj/structure/rack, +/obj/item/stack/medical/bruise_pack{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = -4 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = 8; + pixel_y = 12 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = 8; + pixel_y = 4 + }, +/obj/item/stack/medical/bruise_pack{ + pixel_x = 8 + }, +/obj/structure/window/reinforced/spawner/north, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"gzK" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"gzT" = ( +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/station/engineering/main) +"gAb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"gAg" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"gAj" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"gAk" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"gAs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/incinerator_vent_atmos_aux{ + pixel_x = -8; + pixel_y = -24 + }, +/obj/machinery/button/door/incinerator_vent_atmos_main{ + pixel_x = -8; + pixel_y = -36 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"gAB" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/checkpoint/engineering) +"gAM" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"gAR" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) +"gAT" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gAY" = ( +/obj/machinery/newscaster/directional/east, +/obj/machinery/computer/security/mining{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"gBb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gBk" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"gBE" = ( +/obj/structure/table, +/obj/item/shovel/spade{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/cultivator{ + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bucket{ + pixel_x = 6; + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"gBI" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"gBU" = ( +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"gCe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"gCm" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"gCA" = ( +/obj/machinery/camera/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay Lobby" + }, +/obj/structure/sign/departments/examroom{ + pixel_x = -32 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"gCS" = ( +/obj/item/radio/intercom/directional/south{ + name = "Private Channel"; + frequency = 1447; + broadcasting = 1 + }, +/obj/machinery/camera/motion/directional/south{ + network = list("aiupload"); + c_tag = "AI Upload Chamber - Starboard" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"gDn" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/clothing/under/suit/red, +/obj/effect/decal/cleanable/cobweb, +/obj/item/book/codex_gigas, +/turf/open/floor/engine/cult, +/area/station/service/library) +"gDo" = ( +/obj/machinery/light/directional/south, +/obj/machinery/requests_console/directional/south{ + name = "Engineering Requests Console"; + department = "Engineering"; + departmentType = 3 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"gDt" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Theater - Backstage" + }, +/obj/structure/table/wood, +/obj/item/clothing/mask/animal/pig, +/obj/item/bikehorn, +/turf/open/floor/wood, +/area/station/service/theater) +"gDM" = ( +/obj/structure/rack, +/obj/item/stack/package_wrap{ + pixel_x = 6 + }, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/light/directional/south, +/obj/structure/sign/poster/random/directional/east, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"gDR" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"gEf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/navbeacon{ + dir = 8; + freq = 1400; + location = "QM #2"; + codes_txt = "delivery;dir=8" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"gEo" = ( +/obj/machinery/door/airlock{ + name = "Theater Stage"; + req_one_access_txt = "12;46;70" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"gEp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/button/door/directional/south{ + name = "Gateway Shutter Control"; + pixel_y = -34; + id = "gateshutter"; + req_access_txt = "19" + }, +/obj/machinery/button/door/directional/south{ + name = "E.V.A. Storage Shutter Control"; + id = "evashutter"; + req_access_txt = "19" + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"gEq" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"gEv" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"gEz" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/lounge) +"gEB" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"gED" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) +"gEI" = ( +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"gEN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gEY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"gFb" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/space) +"gFk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"gFl" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"gFr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"gFu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"gFw" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"gFy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"gFC" = ( +/obj/structure/chair/comfy/black, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"gFW" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/window/spawner/west, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"gGh" = ( +/obj/machinery/chem_dispenser, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"gGj" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"gGk" = ( +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"gGr" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"gGC" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"gGE" = ( +/obj/item/reagent_containers/spray/plantbgone, +/obj/item/reagent_containers/spray/pestspray{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/obj/item/reagent_containers/glass/bottle/nutrient/rh{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"gGL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"gGW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"gGX" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/item/clothing/mask/balaclava, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"gGZ" = ( +/obj/structure/closet/secure_closet/engineering_electrical, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/engine_smes) +"gHb" = ( +/obj/machinery/igniter/incinerator_atmos, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"gHg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"gHq" = ( +/obj/machinery/modular_computer/console/preset/command{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"gHx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"gHG" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"gIa" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"gIr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"gIv" = ( +/obj/machinery/door/airlock/mining{ + name = "Cargo Bay"; + req_one_access_txt = "31;48" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"gIA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gIR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"gJn" = ( +/obj/machinery/power/apc/highcap/ten_k/directional/west, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"gJq" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"gJz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 3 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"gJJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hos) +"gKd" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"gKu" = ( +/obj/effect/landmark/start/botanist, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"gKx" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"gKy" = ( +/obj/machinery/door/airlock{ + name = "Cabin 4"; + id_tag = "Cabin2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"gKA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gKE" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gKF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gKI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Recreation Area" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"gKU" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/greater) +"gKW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"gKY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"gKZ" = ( +/obj/machinery/light/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"gLa" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"gLu" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"gLz" = ( +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"gLB" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"gLL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"gLN" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"gLR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"gLU" = ( +/obj/structure/table, +/obj/item/candle, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/service/chapel) +"gMe" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"gMh" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"gMj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"gMu" = ( +/obj/structure/rack, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire, +/obj/structure/window/reinforced/spawner/west, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"gMx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"gMA" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"gML" = ( +/obj/structure/table/wood/poker, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/wood, +/area/station/commons/lounge) +"gMN" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"gMQ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/table/wood, +/obj/item/storage/box/donkpockets{ + pixel_x = -8; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"gNa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"gNd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"gNj" = ( +/obj/structure/table, +/obj/machinery/button/door{ + name = "Core Emitter Shutter"; + pixel_x = 8; + pixel_y = 8; + id = "engine_emitter" + }, +/obj/machinery/button/door{ + name = "Core Inspection Shutter"; + pixel_x = 8; + pixel_y = -8; + id = "engine_sides" + }, +/obj/item/book/manual/codex/supermatter, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"gNl" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/department/engine) +"gNr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"gNY" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"gNZ" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"gOr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"gOD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"gOE" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"gOJ" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/machinery/requests_console/directional/north{ + name = "Lawyer Requests Console"; + department = "Law Office" + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"gON" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/space/basic, +/area/station/solars/starboard/fore) +"gOO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"gPs" = ( +/obj/machinery/door/poddoor/massdriver_chapel, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"gPz" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"gPE" = ( +/obj/machinery/power/data_terminal, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"gPK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gPU" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"gPX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"gQf" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/space/basic, +/area/space/nearstation) +"gQz" = ( +/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"gQE" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"gQK" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"gQV" = ( +/turf/open/floor/iron/white, +/area/station/medical/storage) +"gQZ" = ( +/obj/item/kirbyplants/dead, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"gRb" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"gRg" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "MedPatientC_Privacy" + }, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_c) +"gRz" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gRC" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"gRF" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"gSp" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"gSx" = ( +/obj/structure/closet/secure_closet/quartermaster, +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Departures Hallway - Aft" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"gSY" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"gTd" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"gTu" = ( +/obj/machinery/power/emitter, +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/engineering/main) +"gTx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible/layer4, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"gTD" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"gTK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"gTQ" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/arrows, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"gUa" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/department/engine) +"gUi" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Departures Hallway - Aft - Lounge" + }, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"gUu" = ( +/obj/structure/sign/painting/library{ + pixel_y = -32 + }, +/turf/open/floor/wood, +/area/station/service/library) +"gUz" = ( +/obj/effect/turf_decal/arrows/white{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"gVc" = ( +/obj/docking_port/stationary{ + name = "SS13: Auxiliary Dock, Station-Port"; + dir = 2; + width = 35; + height = 22; + id = "whiteship_home"; + dwidth = 11 + }, +/turf/open/space/basic, +/area/space) +"gVu" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gVI" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/reagent_containers/glass/bucket/wooden{ + name = "emergency IV bucket" + }, +/obj/structure/closet/crate, +/obj/machinery/light/small/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"gWb" = ( +/obj/structure/chair/pew/right, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"gWc" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/medical, +/area/station/medical/medbay/aft) +"gWx" = ( +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"gWY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"gXe" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Gravity Generator Area"; + req_access_txt = "19; 61" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"gXf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"gXr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atm, +/turf/open/floor/wood, +/area/station/commons/lounge) +"gXJ" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"gXO" = ( +/obj/machinery/meter{ + name = "Mixed Air Tank In" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"gXU" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/bridge) +"gYc" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/sign/warning/gasmask{ + pixel_y = 32 + }, +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"gYq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/tcommsat/server) +"gYs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"gYu" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"gYv" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/cryo) +"gYB" = ( +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"gYL" = ( +/mob/living/carbon/human/species/monkey, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/medical/virology) +"gYN" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"gYS" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/medical/pharmacy) +"gYT" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/entertainment/arcade, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"gZa" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gZk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/security/courtroom) +"gZv" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"gZB" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/storage/gas) +"gZI" = ( +/obj/structure/rack, +/obj/effect/spawner/random/trash/soap, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"gZK" = ( +/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, +/obj/item/stack/sheet/mineral/plasma{ + amount = 30 + }, +/obj/item/gps, +/obj/structure/closet/crate/engineering, +/turf/open/floor/plating, +/area/station/engineering/main) +"gZM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"hab" = ( +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-right" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"haC" = ( +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-left" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"haX" = ( +/obj/effect/turf_decal/arrows/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"hbn" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"hbu" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/monitoring) +"hbw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Engineering - Foyer - Shared Storage" + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"hbH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"hce" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"hch" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"hcD" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"hcO" = ( +/obj/structure/fireaxecabinet/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Port" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/no_nightlight/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hcV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Starboard Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"hcY" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/item/kirbyplants/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"hdc" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"hdD" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + network = list("ss13","medbay"); + c_tag = "Medbay Central Aft Corridor" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"hdK" = ( +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/rods/fifty, +/obj/item/stack/rods/fifty, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "34" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"hdX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hdZ" = ( +/obj/structure/statue/snow/snowman, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"hef" = ( +/obj/machinery/photocopier, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"hel" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"hem" = ( +/mob/living/simple_animal/bot/cleanbot/autopatrol, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"her" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"hes" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"heu" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/atmos_alert{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/sign/poster/official/safety_internals{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"hev" = ( +/obj/effect/turf_decal/bot, +/obj/structure/mecha_wreckage/ripley, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"hew" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"hez" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"heA" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/grass, +/area/station/security/pig) +"heM" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/solars/starboard/aft) +"hfd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/cargo/qm) +"hfh" = ( +/obj/structure/table, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/engine_smes) +"hfk" = ( +/obj/machinery/door/poddoor/preopen{ + name = "Engineering Security Doors"; + id = "Engineering" + }, +/obj/effect/turf_decal/caution/stand_clear, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) +"hfp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Hydroponics Backroom"; + req_access_txt = "35" + }, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"hfx" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Vacant Office Maintenance"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"hfN" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "18" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"hgg" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/carbon_input{ + dir = 1 + }, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"hgi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"hgn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"hgK" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"hgL" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"hgP" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"hgX" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"hhk" = ( +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hie" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"hih" = ( +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"hiw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"hjd" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"hjv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hjI" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"hkg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/commons/dorms/cryo) +"hks" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/treatment_center) +"hkK" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"hkN" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"hkQ" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/service/theater) +"hkU" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/bot_white, +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Fore - Port Corner" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"hlQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"hlY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"hmD" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"hnj" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Test Subject Cell"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"hnm" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"hnF" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hnL" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"hnX" = ( +/obj/machinery/computer/holodeck{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hoa" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 4 + }, +/obj/machinery/computer/department_orders/engineering, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"hoe" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/secure_closet/engineering_personal, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"hoh" = ( +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/medical{ + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/courtroom) +"hoN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"hoX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hpg" = ( +/obj/item/kirbyplants{ + icon_state = "plant-03" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"hpk" = ( +/obj/structure/disposaloutlet{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"hpA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/departments/court{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"hqi" = ( +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"hqm" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hqq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"hqy" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"hrc" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"hrq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"hrr" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"hrM" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Containment Cells"; + req_access_txt = "39" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"hsq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "showroom shutters"; + id = "corporate_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"hsC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"hsF" = ( +/obj/structure/table, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"hsV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"htm" = ( +/obj/structure/table, +/obj/machinery/telephone/security, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/data_terminal, +/turf/open/floor/iron, +/area/station/security/office) +"hts" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"htC" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 1; + req_access = null + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"htH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"htQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"htS" = ( +/obj/structure/fluff/iced_abductor, +/turf/open/misc/asteroid/basalt/airless, +/area/space/nearstation) +"htW" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"hue" = ( +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hup" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"huH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"hvg" = ( +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison/workout) +"hvt" = ( +/obj/structure/kitchenspike_frame, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hvG" = ( +/obj/machinery/button/door/directional/north{ + name = "Privacy Control"; + id = "psych_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"hvO" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/nuke_storage) +"hvQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"hvT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"hwg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"hwM" = ( +/obj/effect/spawner/xmastree, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"hxD" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"hxU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"hxX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) +"hyg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"hyo" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"hyp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"hyE" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/fore) +"hza" = ( +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"hzd" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space/basic, +/area/space/nearstation) +"hzx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"hzD" = ( +/obj/machinery/rnd/production/fabricator/department/engineering, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"hzF" = ( +/obj/machinery/telephone/command{ + layer = 2.91; + pixel_y = 10 + }, +/obj/machinery/power/data_terminal, +/obj/machinery/airalarm/directional/east, +/obj/structure/filingcabinet/chestdrawer{ + pixel_y = 2 + }, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"hzO" = ( +/obj/machinery/door/window/right/directional/south{ + name = "Coffee Shop"; + dir = 4; + req_one_access_txt = "12;25;28;35;37" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"hzQ" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"hzS" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"hzX" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"hAj" = ( +/obj/structure/table, +/obj/item/airlock_painter, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"hAn" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - Air" + }, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"hAr" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/qm) +"hAt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/orange{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"hAu" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"hAD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"hAW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"hBd" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"hBu" = ( +/obj/effect/turf_decal/loading_area/white{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"hBA" = ( +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Hydroponics Delivery"; + dir = 1; + req_access_txt = "35" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"hBQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"hCi" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"hCk" = ( +/obj/structure/closet/secure_closet/bar{ + pixel_x = -3; + pixel_y = -1; + req_access_txt = "25" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hCI" = ( +/obj/item/hand_labeler_refill, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"hCP" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/dorms) +"hCQ" = ( +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/wood, +/area/station/service/library) +"hCT" = ( +/obj/machinery/microwave{ + pixel_x = -1; + pixel_y = 7 + }, +/obj/structure/table, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"hCW" = ( +/obj/item/disk/data{ + pixel_x = 9; + pixel_y = -1 + }, +/obj/structure/table/wood, +/obj/item/toy/talking/ai{ + name = "\improper Nanotrasen-brand toy AI"; + pixel_y = 6 + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"hCX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"hDw" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"hDz" = ( +/obj/structure/closet/wardrobe/green, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"hDJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"hDV" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"hEC" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"hEL" = ( +/obj/machinery/atmospherics/components/binary/pump/on, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"hFB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"hFD" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/miningoffice) +"hFK" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/machinery/suit_storage_unit/captain, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"hGa" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/light_switch/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"hGj" = ( +/obj/machinery/rnd/production/circuit_imprinter, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"hGy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"hGB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"hHd" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"hHy" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"hHO" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"hHP" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hIa" = ( +/obj/structure/chair, +/obj/effect/landmark/start/chaplain, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"hIg" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"hIj" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hIn" = ( +/obj/machinery/disposal/bin, +/obj/machinery/light_switch/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Fitness Room - Aft" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"hIt" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hIA" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/dropper, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hIO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"hIP" = ( +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hIU" = ( +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"hIV" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"hJy" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hJC" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/effect/turf_decal/trimline/blue/end, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hJF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/meter, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"hJT" = ( +/obj/effect/landmark/start/head_of_personnel, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"hJX" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"hJY" = ( +/obj/machinery/power/smes/engineering, +/obj/machinery/light/small/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"hKc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"hKk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hKm" = ( +/obj/machinery/firealarm/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"hKA" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/storage/tools) +"hKH" = ( +/turf/closed/wall/mineral/plastitanium, +/area/station/commons/fitness/recreation) +"hKJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"hKO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hKQ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"hLm" = ( +/obj/machinery/modular_computer/console/preset/engineering, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"hLp" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"hLx" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"hLy" = ( +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"hLC" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"hLF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"hLQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"hLR" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"hMc" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_y = 5 + }, +/obj/item/folder{ + pixel_x = -2 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/station/security/office) +"hMl" = ( +/obj/machinery/rnd/production/fabricator/department/cargo, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/directional/east{ + c_tag = "Cargo Bay - Mid" + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"hMm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"hMn" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"hMT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"hNe" = ( +/obj/structure/weightmachine/stacklifter, +/turf/open/floor/iron/dark/side, +/area/station/security/prison/workout) +"hNh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"hNu" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"hNA" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"hNC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hNK" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"hOd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"hOe" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/cargo/qm) +"hOh" = ( +/obj/machinery/keycard_auth/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"hOl" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"hOq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"hON" = ( +/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 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"hOV" = ( +/obj/structure/closet/toolcloset, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"hPn" = ( +/obj/machinery/door/airlock/hatch{ + name = "SMES Access"; + id_tag = "smesroom_door"; + req_access_txt = "10" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/red{ + icon_state = "192" + }, +/obj/structure/cable/orange{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"hPv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_access_txt = "28" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/cafeteria, +/area/station/hallway/secondary/service) +"hPP" = ( +/obj/structure/safe/floor, +/obj/item/food/fortunecookie, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"hQa" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/railing, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"hQr" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Deck"; + req_one_access_txt = "1;4" + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"hQs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"hQU" = ( +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"hQW" = ( +/obj/structure/table, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"hRj" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"hRk" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"hRm" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"hRr" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"hRO" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"hRW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/north, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/commons/lounge) +"hSw" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/bar) +"hSA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2; + sortType = 29 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"hSE" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/flasher/directional/east{ + pixel_y = -26; + id = "hopflash" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"hTj" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/item/food/grown/poppy/lily, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"hTk" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/head_of_personnel, +/obj/machinery/light_switch{ + pixel_x = 38; + pixel_y = -35 + }, +/obj/machinery/button/flasher{ + pixel_x = 38; + pixel_y = -25; + id = "hopflash" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"hTs" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"hTt" = ( +/obj/machinery/computer/station_alert{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -29 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"hTy" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"hTM" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"hTT" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"hUG" = ( +/obj/machinery/door/airlock/wood{ + name = "The Gobetting Barmaid"; + doorOpen = 'sound/effects/doorcreaky.ogg'; + doorClose = 'sound/effects/doorcreaky.ogg' + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hUK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"hUO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"hUW" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/patients_rooms/room_c) +"hVj" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/gravity_generator) +"hVm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"hVr" = ( +/obj/item/folder, +/obj/item/folder, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/item/tape, +/turf/open/floor/wood, +/area/station/service/library) +"hVB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"hVC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"hVI" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) +"hVM" = ( +/obj/machinery/computer/telecomms/server{ + dir = 8; + network = "tcommsat" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/cyan{ + icon_state = "8" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"hWi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"hWD" = ( +/obj/structure/table/glass, +/obj/item/radio/intercom/directional/west, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 12 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"hWF" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer/department_orders/medical, +/obj/effect/turf_decal/box/red/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/red/corners, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"hWU" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"hWV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"hWZ" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"hXe" = ( +/obj/machinery/button/door/directional/north{ + name = "Mech Bay Shutters Control"; + id = "mechbay"; + req_access_txt = "29" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"hXr" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"hXy" = ( +/obj/machinery/teleport/hub, +/turf/open/floor/plating, +/area/station/command/teleporter) +"hXC" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"hXD" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"hXI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;37;25;28" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"hXT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "desk shutter"; + req_access_txt = "33" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/medical/chemistry) +"hXY" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"hYi" = ( +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/dest_tagger{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"hYo" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"hYM" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"hYU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"hYV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"hYY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"hZj" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"hZm" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"hZp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"hZM" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"iay" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5;33;69" + }, +/turf/open/floor/plating, +/area/station/medical/medbay/aft) +"iaB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"iaO" = ( +/obj/effect/landmark/start/lawyer, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"ibe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ibC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"ibE" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"ibW" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/camera/autoname/directional/west{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron, +/area/station/security/brig) +"ici" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"icl" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/rnd/production/circuit_imprinter/robotics, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"icp" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "privacy shutters"; + id = "hop" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) +"icD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"icG" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"icV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"idi" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_diagnostic_privacy" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"idt" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"idy" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Mix"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"idB" = ( +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"idI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"idO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/atmos/glass{ + name = "Hypertorus Fusion Reactor"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"idP" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Access Door Bolt Control"; + id = "smesroom_door"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/structure/cable/red{ + icon_state = "48" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/engine_smes) +"idS" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iek" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"iep" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"iez" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central/fore) +"ieH" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"ieR" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "40" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"ifi" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"ifw" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"ifz" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ifA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"ifF" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"igf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Fore Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"igg" = ( +/obj/machinery/navbeacon{ + location = "15-Court"; + codes_txt = "patrol;next_patrol=16-Fore" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"igh" = ( +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"igk" = ( +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"igr" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"igv" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) +"igx" = ( +/turf/closed/wall/prepainted/medical, +/area/station/science/robotics/mechbay) +"ihg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"ihl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/clothing/shoes/wheelys/rollerskates{ + pixel_y = 5 + }, +/obj/item/clothing/shoes/wheelys/rollerskates, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"ihm" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"ihp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"ihM" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"ihW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"iij" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"iis" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 4 + }, +/obj/item/folder/yellow, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"iiD" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"iiE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"iiL" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"iiM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"iiO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"iiW" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"ijf" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ijj" = ( +/obj/item/storage/secure/safe/directional/east, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = -12; + pixel_y = 5 + }, +/obj/machinery/fax_machine, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"ijJ" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"ijT" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/structure/sign/warning/chemdiamond{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ikg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ikj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"iky" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/fax_machine, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"ikC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "MiniSat Maintenance"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"ikW" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ilG" = ( +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"ilL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"img" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"imj" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"imo" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/medical/virology) +"imx" = ( +/obj/structure/table/wood, +/obj/structure/sign/picture_frame/showroom/one{ + pixel_x = -8; + pixel_y = 32 + }, +/obj/structure/sign/picture_frame/showroom/two{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"imz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"imF" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/prison/workout) +"imG" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"imI" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/lounge) +"imN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"imS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"imY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"imZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ink" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"inl" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ino" = ( +/obj/structure/sign/plaques/kiddie/library{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"inA" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/rods/fifty, +/obj/item/storage/toolbox/emergency, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/spawner/random/engineering/flashlight, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"inQ" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ioe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"ioh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"ior" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ioE" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/command/heads_quarters/hop) +"ioG" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ioO" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"ioV" = ( +/obj/effect/decal/cleanable/ash, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"ipg" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ipl" = ( +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 23 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ipo" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ipx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"ipP" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/prison/rec) +"ipR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"ipW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"iqk" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - Toxins" + }, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"iqp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"iqy" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Distro to Waste"; + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"iqE" = ( +/obj/effect/turf_decal/box/white{ + color = "#EFB341" + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"iqN" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"iqO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"iqP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/wood, +/area/station/commons/lounge) +"iqW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"irb" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/effect/decal/cleanable/glass, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"irL" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"irN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"irV" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"ish" = ( +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/medical{ + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/lounge) +"isy" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"isz" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"isE" = ( +/obj/structure/dresser, +/obj/machinery/newscaster/directional/north, +/obj/machinery/light/small/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"isJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/lesser) +"isW" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/space/basic, +/area/station/solars/starboard/aft) +"itm" = ( +/mob/living/simple_animal/hostile/retaliate/hog/security, +/turf/open/floor/mud, +/area/station/security/pig) +"itw" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/folder/red{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"itB" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_sleeper_right" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"itC" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"itE" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/atmos_control/nocontrol/master{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"itP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"itU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Starboard" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"itV" = ( +/obj/effect/spawner/random/entertainment/deck, +/obj/structure/table/wood/poker, +/turf/open/floor/wood, +/area/station/commons/lounge) +"iub" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"iui" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"iuw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"iuB" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "O2 to Airmix"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"iuC" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"iuJ" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/break_room) +"iuP" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"ivg" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ivm" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/stamp, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"ivG" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Starboard Primary Hallway - Tech Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"ivL" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ivO" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"ivU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Genpop Brig"; + req_access_txt = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Genpop Shutter"; + id = "cell2genpop" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"ivZ" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-access" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Brig Access"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"iwa" = ( +/obj/structure/window/reinforced, +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "24" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"iwb" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"iwe" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/security/glass{ + name = "Brig Access"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"iwn" = ( +/turf/open/floor/iron, +/area/station/security/prison/rec) +"iwp" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/light/small/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"iws" = ( +/obj/structure/table, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"iwt" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/central) +"iww" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"iwS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iwW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_one_access_txt = "12;37" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"iwX" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"iwY" = ( +/obj/structure/cable/orange{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"ixb" = ( +/obj/machinery/button/door/directional/north{ + name = "Privacy Shutters Control"; + id = "hop"; + req_access_txt = "28" + }, +/obj/machinery/computer/accounting, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"ixm" = ( +/obj/machinery/flasher/directional/north{ + id = "Cell 2" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/brig) +"ixp" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/command) +"ixw" = ( +/obj/machinery/holopad, +/obj/machinery/camera/directional/south{ + network = list("minisat") + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"ixH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Access"; + req_one_access_txt = "32;19" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"ixT" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/structure/closet/crate/silvercrate, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"iyo" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"iyx" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/medical/chemistry) +"iyy" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"iyL" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"iyS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"izf" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"izn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"izo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"izr" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"izy" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/door/directional/west{ + name = "Engineering Lockdown"; + pixel_y = -6; + id = "Engineering"; + req_access_txt = "10" + }, +/obj/machinery/button/door/directional/west{ + name = "Atmospherics Lockdown"; + pixel_y = 6; + id = "atmos"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"izD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/orange{ + icon_state = "12" + }, +/obj/structure/cable/orange{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"izO" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/poddoor/shutters/window{ + name = "Gateway Access Shutter"; + id = "gateshutter" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"izR" = ( +/obj/structure/table/glass, +/obj/machinery/light_switch/directional/east, +/obj/item/cautery, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"izW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"iAc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"iAj" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"iAn" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"iAF" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/box, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"iAQ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock{ + name = "Aft Emergency Storage" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"iAW" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"iBb" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/aft) +"iBe" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"iBy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"iBF" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"iBH" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Command Hallway - Central" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"iBO" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"iBU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"iCc" = ( +/obj/structure/table, +/obj/item/kirbyplants/photosynthetic, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) +"iCd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"iCe" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/table, +/obj/item/storage/box/metalfoam, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"iCl" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"iCv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iCw" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"iCB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"iCM" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/engineering/break_room) +"iCO" = ( +/obj/machinery/navbeacon{ + location = "1.5-Fore-Central"; + codes_txt = "patrol;next_patrol=2.1-Leaving-Storage" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"iCQ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "32" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"iCV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"iCY" = ( +/obj/structure/table, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/multitool, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"iCZ" = ( +/obj/structure/bed/roller, +/obj/machinery/camera/directional/west{ + c_tag = "Gateway - Atrium" + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/vending/wallmed/directional/west, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"iDd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"iDm" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Three"; + space_dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "escape-pod-3" + }, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"iDp" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"iDA" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/locker) +"iDZ" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"iEd" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"iEh" = ( +/turf/open/floor/iron/stairs/right{ + dir = 1 + }, +/area/station/engineering/atmos) +"iEi" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"iEl" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"iEx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"iEE" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + name = "Cabin Bolt Control"; + id = "Cabin7"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"iEG" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"iEK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"iEY" = ( +/obj/machinery/telecomms/processor/preset_one, +/obj/machinery/camera/directional/north{ + network = list("ss13","tcomms"); + c_tag = "Telecomms - Server Room - Fore-Port" + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"iFf" = ( +/obj/structure/rack, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/brute, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"iFn" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Chapel - Port" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"iFu" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iFw" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"iFO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"iFT" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Mechanic Storage" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"iGi" = ( +/obj/item/crowbar, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"iGq" = ( +/obj/structure/lattice, +/obj/item/broken_bottle, +/turf/open/space/basic, +/area/space/nearstation) +"iGt" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"iHd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"iHk" = ( +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"iHU" = ( +/obj/machinery/vending/hydroseeds{ + slogan_delay = 700 + }, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"iIk" = ( +/obj/structure/chair/stool{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"iIQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"iIU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"iJu" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "64" + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"iJL" = ( +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/station/security/prison/workout) +"iKa" = ( +/turf/open/floor/iron, +/area/station/service/hydroponics) +"iKb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"iKh" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"iKn" = ( +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"iKr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"iKu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"iKB" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"iKI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"iKU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/aft) +"iLq" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Bridge - Starboard" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"iLA" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"iLH" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/aft) +"iLM" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Gateway - Access" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/command/gateway) +"iMi" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) +"iMn" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"iMx" = ( +/obj/item/clothing/head/cone, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"iMy" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"iMN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/cold/directional/south, +/obj/structure/extinguisher_cabinet/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"iMT" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"iNb" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Virology Isolation B" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "132" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"iNg" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/item/toy/plush/carpplushie{ + name = "Bitey" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"iNx" = ( +/obj/structure/rack, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"iNH" = ( +/obj/machinery/air_sensor/plasma_tank, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"iNN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Council Chamber"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"iNO" = ( +/obj/machinery/camera/emp_proof/directional/west{ + network = list("ss13","engine"); + c_tag = "Engine Airlock" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"iNP" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/dim/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"iOl" = ( +/obj/structure/table, +/obj/item/stack/spacecash/c1, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"iOn" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/flasher/directional/south{ + pixel_x = 26; + id = "AI" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"iOp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "64" + }, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"iOs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/crate, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"iOA" = ( +/obj/structure/reagent_dispensers/cooking_oil, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"iOP" = ( +/obj/machinery/door/morgue{ + name = "Chapel Garden" + }, +/turf/open/floor/cult, +/area/station/service/chapel/funeral) +"iPi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"iPr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"iPy" = ( +/obj/machinery/computer/cargo{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/button/door/directional/west{ + name = "Loading Doors"; + layer = 4; + pixel_y = -8; + id = "QMLoaddoor"; + req_access_txt = "31" + }, +/obj/machinery/button/door/directional/west{ + name = "Loading Doors"; + layer = 4; + pixel_y = 8; + id = "QMLoaddoor2"; + req_access_txt = "31" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"iPC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/suit_storage_unit/industrial/loader, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"iPD" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/item/storage/box/bodybags, +/obj/item/storage/box/gloves{ + pixel_x = 4; + pixel_y = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"iPI" = ( +/obj/item/storage/fancy/candle_box{ + pixel_y = 5 + }, +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"iPT" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/interrogation) +"iPU" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"iPY" = ( +/obj/effect/landmark/start/lawyer, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"iQa" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"iQj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"iQr" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"iQL" = ( +/obj/item/storage/secure/safe/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chief Engineer's Office" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"iQM" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"iRn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"iRp" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"iRv" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"iRx" = ( +/obj/item/flashlight/lamp, +/obj/machinery/newscaster/directional/west, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"iRz" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/storage/tools) +"iRT" = ( +/obj/machinery/griddle, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"iRU" = ( +/obj/machinery/newscaster/directional/north, +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/commons/dorms) +"iSa" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"iSf" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Access"; + req_access_txt = "2" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"iSi" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Hydroponics - Aft" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"iSS" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/item/stack/rods/fifty, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ + dir = 4 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/atmos) +"iSY" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"iTe" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrous_input{ + dir = 1 + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"iTk" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/station/commons/locker) +"iTL" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iTM" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/ai_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"iUm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"iUy" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"iUH" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Genpop Brig" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"iUQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"iVd" = ( +/obj/machinery/door/airlock/mining{ + name = "Deliveries"; + req_one_access_txt = "50" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"iVK" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"iVR" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Pure"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"iVV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"iWf" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Bar"; + req_access_txt = "25" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/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 = "12" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"iWk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/machinery/meter, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"iWm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"iWx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"iWy" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"iWI" = ( +/turf/open/floor/iron/dark, +/area/station/security/deck) +"iXg" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"iXn" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "med_diagnostic_privacy" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"iXC" = ( +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"iXP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"iYi" = ( +/obj/machinery/navbeacon{ + location = "9.3-Escape-3"; + codes_txt = "patrol;next_patrol=9.4-Escape-4" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"iYt" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/trash/soap, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) +"iZa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/courtroom) +"iZc" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"iZG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"iZI" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Incinerator Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"iZJ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/space_heater, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"iZM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iZN" = ( +/obj/machinery/light/directional/east, +/obj/machinery/status_display/ai/directional/east, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"iZR" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/assistant, +/obj/machinery/button/door/directional/east{ + name = "Lock Control"; + id = "AuxToilet1"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"iZU" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"jab" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"jae" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"jal" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"jar" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"jaw" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"jbh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/cargo/qm) +"jbD" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"jbQ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"jbZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"jcs" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"jcv" = ( +/obj/structure/rack, +/obj/item/radio/off, +/obj/item/tank/internals/oxygen, +/obj/item/radio/off, +/obj/item/tank/internals/oxygen, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "32" + }, +/turf/open/floor/plating, +/area/station/command/teleporter) +"jcZ" = ( +/obj/machinery/air_sensor/mix_tank, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"jdn" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"jdo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"jdJ" = ( +/obj/structure/sign/plaques/kiddie{ + pixel_y = 32 + }, +/obj/machinery/camera/directional/north{ + network = list("aiupload"); + c_tag = "AI Upload Chamber - Fore" + }, +/obj/structure/table/wood/fancy/green, +/obj/effect/spawner/random/aimodule/harmless, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"jdL" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"jdT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"jdV" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"jec" = ( +/obj/machinery/navbeacon{ + location = "1-BrigCells"; + codes_txt = "patrol;next_patrol=1.5-Fore-Central" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"jei" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"jeC" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"jeN" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/port/fore) +"jeT" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - Mix" + }, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"jeY" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/structure/sign/directions/command{ + pixel_y = -8 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/commons/storage/tools) +"jfb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/layer2{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"jfn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"jfp" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"jfr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Council Blast Doors"; + id = "council blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"jfz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/structure/railing/corner, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"jfC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"jfE" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/airlock_sensor/incinerator_atmos{ + pixel_y = 24 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"jfJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/command/gateway) +"jfL" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"jfR" = ( +/obj/structure/bookcase, +/turf/open/floor/wood, +/area/station/command/bridge) +"jgc" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"jgn" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"jgD" = ( +/obj/effect/turf_decal/loading_area{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"jgG" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jgH" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"jgT" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"jhb" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/port_gen/pacman, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"jhg" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"jhh" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"jhu" = ( +/obj/structure/light_construct/directional/east, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"jhO" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"jhT" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/components/trinary/filter/atmos/o2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jhV" = ( +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jim" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"jiu" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Arrivals - Aft Arm" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"jiA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"jiI" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"jiR" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"jjM" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/heads_quarters/captain/private) +"jjR" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/railing, +/obj/item/tape/random, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"jkj" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"jku" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/orange{ + icon_state = "12" + }, +/obj/structure/cable/orange{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"jkG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"jkH" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"jkI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 19 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"jkN" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jkO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"jkQ" = ( +/obj/structure/table, +/obj/item/phone{ + pixel_x = 6; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jkT" = ( +/mob/living/simple_animal/parrot/poly, +/obj/structure/filingcabinet/chestdrawer{ + name = "case files" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"jlf" = ( +/obj/structure/table/wood, +/obj/item/staff/broom, +/obj/item/wrench, +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"jlh" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"jlk" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"jll" = ( +/obj/machinery/light/small/broken/directional/south, +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"jln" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) +"jlw" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jly" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"jlG" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"jlI" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"jlS" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/restraints/handcuffs, +/obj/machinery/light/directional/east, +/obj/item/radio/off, +/obj/machinery/requests_console/directional/east{ + name = "Security Requests Console"; + department = "Security"; + departmentType = 5 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"jlX" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Departures Hallway - Aft" + }, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"jmc" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"jmu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"jmy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"jmQ" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - Middle Arm" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"jmY" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"jni" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"jnp" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryosleep Bay" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/commons/dorms/cryo) +"jnu" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"jnX" = ( +/obj/item/candle, +/obj/machinery/light_switch/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"joc" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jou" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/directional/west, +/obj/item/banner/cargo/mundane, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/iron, +/area/station/cargo/storage) +"joP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Port Primary Hallway" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"joU" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"joV" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jpD" = ( +/obj/machinery/computer/mech_bay_power_console, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"jpE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = -5; + pixel_y = 1 + }, +/obj/item/healthanalyzer{ + pixel_x = 4; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/security/medical) +"jpH" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Genpop Brig"; + req_access_txt = "1" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Genpop Shutter"; + id = "cell1genpop" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"jpJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel/office) +"jpQ" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"jpR" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Pig Pen"; + id_tag = "outerbrig"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/security/pig) +"jqb" = ( +/obj/machinery/power/smes{ + charge = 10000; + capacity = 9e+06 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"jql" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/red/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"jqq" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/port) +"jqs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"jqA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jqB" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"jqN" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"jqS" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/engineering/main) +"jqW" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"jrc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"jrl" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters{ + name = "Privacy Shutter"; + id = "detprivate" + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"jrs" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"jrw" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"jry" = ( +/obj/structure/table/wood/fancy/orange, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -1; + pixel_y = -2 + }, +/obj/item/lighter{ + pixel_x = 11; + pixel_y = -7 + }, +/obj/item/coin/gold{ + pixel_x = 9; + pixel_y = 9 + }, +/turf/open/floor/carpet/red, +/area/station/cargo/qm) +"jrz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Cryogenics Maintenance Access"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"jrE" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"jrJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"jrN" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"jrT" = ( +/obj/machinery/light/small/directional/south, +/obj/item/folder, +/obj/item/folder, +/obj/machinery/camera/directional/south{ + network = list("ss13","tcomms"); + c_tag = "Telecomms - Control Room" + }, +/obj/structure/table/wood, +/obj/item/pen, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"jsh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 27 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"jso" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"jsG" = ( +/obj/item/stock_parts/cell/upgraded/plus{ + pixel_x = 5; + pixel_y = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"jsH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"jsZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jth" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"jto" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"jtN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"jtP" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/station/service/library) +"jtR" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"jub" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"jug" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + name = "Custom Channel"; + pixel_x = -8; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/west{ + name = "Common Channel"; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/south{ + name = "Private Channel"; + pixel_x = -8; + frequency = 1447; + listening = 0; + freerange = 1 + }, +/obj/machinery/door/window{ + name = "Secondary AI Core Access"; + icon_state = "rightsecure"; + dir = 4; + layer = 4.1; + pixel_x = 4; + atom_integrity = 300; + base_state = "rightsecure"; + req_access_txt = "16" + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) +"juB" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/navbeacon{ + location = "14.8-Dorms-Lockers"; + codes_txt = "patrol;next_patrol=14.9-CrewQuarters-Central" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"juU" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Port Aft" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"juZ" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"jve" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jvm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"jvw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/station/solars/port/fore) +"jvG" = ( +/obj/machinery/door/airlock/security{ + name = "Customs Desk"; + req_access_txt = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"jvH" = ( +/obj/structure/table/optable, +/obj/item/clothing/mask/breath/medical, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"jvP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"jvV" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jwf" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"jwj" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"jws" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"jwu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"jwv" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 4 + }, +/obj/item/stack/sheet/mineral/plasma/five, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"jwJ" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) +"jwM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"jwP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/item/folder/red, +/obj/item/folder/yellow, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"jwR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/newscaster/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"jwV" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/computer/gateway_control{ + dir = 8 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"jxn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"jxB" = ( +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"jxI" = ( +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"jxU" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater/on, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jyv" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"jyP" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"jyS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jyX" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"jzf" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"jzs" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/vending/coffee, +/turf/open/floor/wood, +/area/station/medical/break_room) +"jzz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"jzD" = ( +/turf/closed/wall/prepainted/medical, +/area/station/maintenance/aft/greater) +"jzQ" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"jzZ" = ( +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"jAj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"jAH" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"jAI" = ( +/obj/item/bedsheet/blue{ + name = "surgical drapes" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jAT" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"jBr" = ( +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = -8 + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"jBt" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/vacant_room/commissary) +"jBE" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"jBS" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_diagnostic_privacy" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"jBV" = ( +/obj/structure/closet/wardrobe/pjs, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"jCG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + name = "Engineering Security Doors"; + id = "Engineering" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"jCZ" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"jDe" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"jDg" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jDy" = ( +/obj/structure/reagent_dispensers, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"jDX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/library) +"jEb" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/item/toy/figure/md, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"jEh" = ( +/obj/machinery/navbeacon{ + location = "13.2-Tcommstore"; + codes_txt = "patrol;next_patrol=13.3-Engineering-Central" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"jEn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"jEp" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"jEy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"jED" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/incinerator_input{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"jEF" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/item/camera_film{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"jEK" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + name = "Cell 3"; + dir = 8; + id = "Cell 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"jFc" = ( +/obj/structure/showcase/machinery/microwave{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"jFp" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/exit/departure_lounge) +"jFt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jFz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/service/theater) +"jFA" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"jFN" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"jFR" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"jFX" = ( +/obj/machinery/door/window/right/directional/north{ + name = "Library Desk Door"; + icon_state = "left"; + dir = 8; + pixel_x = 3; + base_state = "left"; + req_access_txt = "37" + }, +/turf/open/floor/wood, +/area/station/service/library) +"jGa" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"jGD" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jGN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "20;12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"jHb" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"jHk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"jHt" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 4 + }, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"jHE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + space_dir = 4; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/engine) +"jHN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"jHS" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"jIl" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"jIs" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/requests_console/directional/east{ + name = "Atmospherics Requests Console"; + department = "Atmospherics"; + departmentType = 3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jIG" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"jIK" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"jIO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"jIP" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage/tech) +"jIR" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"jIZ" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) +"jJg" = ( +/obj/machinery/navbeacon{ + location = "9.2-Escape-2"; + codes_txt = "patrol;next_patrol=9.3-Escape-3" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"jJm" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel - Funeral Parlour" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ + pixel_x = 24 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"jJC" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/space, +/area/space/nearstation) +"jJG" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/pen/red, +/obj/machinery/computer/security/telescreen{ + name = "Prison Monitor"; + desc = "Used for watching Prison Wing holding areas."; + pixel_y = 30; + network = list("prison") + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"jJP" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"jKe" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"jKl" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"jKs" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"jKz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"jKC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"jKG" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"jLb" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"jLj" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/space/nearstation) +"jLv" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/light_construct/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"jLw" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"jLD" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"jLE" = ( +/obj/structure/sign/plaques/kiddie/perfect_man{ + pixel_y = 32 + }, +/obj/structure/window/reinforced, +/obj/effect/spawner/random/decoration/showcase, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"jLG" = ( +/obj/machinery/vending/wardrobe/jani_wardrobe, +/turf/open/floor/iron, +/area/station/service/janitor) +"jLH" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"jLU" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/medical/treatment_center) +"jLW" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"jMc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jMf" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/sink{ + pixel_y = 22 + }, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"jMi" = ( +/obj/effect/mapping_helpers/paint_wall/priapus, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/lesser) +"jMp" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"jME" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"jMK" = ( +/obj/machinery/firealarm/directional/east, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 6 + }, +/obj/structure/table/wood, +/obj/machinery/requests_console/directional/south{ + name = "Telecomms Requests Console"; + department = "Telecomms Admin"; + departmentType = 5; + announcementConsole = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"jMP" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"jNc" = ( +/obj/structure/railing/corner, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jNm" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"jNp" = ( +/obj/structure/railing/corner, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"jNq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"jNC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jOg" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/chair/stool/bar, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jOG" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"jOI" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"jON" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/service/janitor) +"jOT" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"jPa" = ( +/obj/structure/sign/poster/ripped{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jPe" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26"; + stripe_paint = "#B69F3C" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/lesser) +"jPJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/space/basic, +/area/space/nearstation) +"jQp" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/fore) +"jQu" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"jQC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"jQK" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"jQL" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"jQQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"jQZ" = ( +/obj/item/storage/box/syringes, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"jRa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"jRc" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/engine_smes) +"jRm" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/command/gateway) +"jRw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"jRz" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"jRT" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/turf/open/floor/wood, +/area/station/service/library) +"jSb" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jSh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"jSk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Patient Room C"; + id_tag = "MedPatientC"; + stripe_paint = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"jSr" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"jSu" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"jSy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "40" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"jSC" = ( +/obj/structure/light_construct/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jSF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"jSH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"jSI" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/storage/tech) +"jSP" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"jTk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible/layer5, +/obj/machinery/light/no_nightlight/directional/south, +/obj/structure/sign/poster/official/wtf_is_co2{ + pixel_y = -32 + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jTn" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/medical, +/area/station/science/robotics/lab) +"jTv" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jTx" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/toilet/greyscale, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"jTz" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"jTD" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jTU" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"jUq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + name = "Commissary Shutter Control"; + id = "commissaryshutter" + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"jUx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"jUB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jUG" = ( +/obj/item/radio/intercom/directional/west{ + name = "Common Channel"; + pixel_y = -8; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/south{ + name = "Private Channel"; + frequency = 1447; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/east{ + name = "Custom Channel"; + pixel_y = -8; + listening = 0; + freerange = 1 + }, +/obj/effect/landmark/start/ai, +/obj/machinery/button/door/directional/south{ + name = "AI Chamber Entrance Shutters Control"; + pixel_x = -24; + id = "AI Chamber entrance shutters"; + req_access_txt = "16" + }, +/obj/machinery/button/door/directional/south{ + name = "AI Core Shutters Control"; + pixel_x = 24; + id = "AI Core shutters"; + req_access_txt = "16" + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) +"jUK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/toilet/auxiliary) +"jUO" = ( +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"jVh" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "6" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"jVU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"jWf" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/green/line, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"jWm" = ( +/obj/machinery/conveyor_switch/oneway{ + name = "Loading Conveyor"; + dir = 8; + pixel_x = -13; + pixel_y = -5; + id = "QMLoad" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"jWw" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"jWx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/medical) +"jWK" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"jWT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"jWX" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"jXb" = ( +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/structure/light_construct/small/directional/north, +/obj/machinery/newscaster/directional/north, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jXe" = ( +/obj/structure/lattice, +/obj/item/wirecutters, +/turf/open/space/basic, +/area/space/nearstation) +"jXh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"jXp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port to Filter"; + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"jXs" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"jXw" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Diagnostics"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"jXC" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"jXG" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"jXL" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"jYa" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) +"jYb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"jYd" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"jYw" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet{ + name = "Evidence Closet 5" + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"jYA" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office) +"jYH" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"jYO" = ( +/obj/machinery/door/window/left/directional/east{ + name = "Service Deliveries"; + dir = 8; + req_one_access_txt = "25;26;35;28;22;37;46;38;70" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"jZd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"jZv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"jZz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"jZB" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/storage/toolbox/emergency, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"jZC" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/space, +/area/space/nearstation) +"jZG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jZI" = ( +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mud, +/area/station/security/pig) +"jZP" = ( +/obj/structure/table/glass, +/obj/structure/reagent_dispensers/wall/virusfood/directional/west, +/obj/machinery/requests_console/directional/south{ + name = "Virology Requests Console"; + department = "Virology"; + receive_ore_updates = 1 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen/red, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"jZT" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"kah" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/pen{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen/red{ + pixel_x = -1; + pixel_y = 6 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"kas" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"kaE" = ( +/obj/machinery/vending/wardrobe/cargo_wardrobe, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"kaF" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"kaJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"kaK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"kaW" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"kcg" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"kco" = ( +/obj/machinery/airalarm/directional/north, +/obj/item/clothing/under/suit/burgundy, +/obj/effect/spawner/random/structure/closet_private, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"kcs" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"kcL" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"kda" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"kdj" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 21 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"kdC" = ( +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space) +"kdU" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/office) +"kdX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"kee" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"keh" = ( +/obj/docking_port/stationary{ + name = "Cargo Bay"; + dir = 8; + width = 12; + height = 7; + id = "supply_home"; + dwidth = 5 + }, +/turf/open/space/basic, +/area/space) +"kep" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"kez" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"keB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"keF" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"keN" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"kfk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"kfn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing, +/turf/open/floor/iron/stairs/right{ + dir = 8 + }, +/area/station/engineering/atmospherics_engine) +"kfr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/bookcase/random, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"kft" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/recharge_station, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"kfx" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage_shared) +"kfF" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"kfO" = ( +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"kfQ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kgh" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"kgl" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"kgp" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/security/lockers) +"kgt" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"kgz" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"kgD" = ( +/obj/structure/chair, +/obj/item/radio/intercom/chapel/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"kgQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"kgY" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/deck) +"khc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Patient Room A"; + id_tag = "MedPatientA"; + stripe_paint = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"khp" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"khq" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"khs" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"khu" = ( +/obj/machinery/light/small/maintenance/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port) +"khB" = ( +/obj/item/book/manual/wiki/security_space_law{ + name = "space law"; + pixel_y = 2 + }, +/obj/item/toy/gun, +/obj/item/restraints/handcuffs, +/obj/structure/table/wood, +/obj/item/clothing/head/collectable/hos{ + name = "novelty HoS hat" + }, +/obj/machinery/firealarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"khE" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"khH" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"kiE" = ( +/obj/item/book/manual/nuclear, +/turf/open/floor/plating/foam{ + temperature = 2.7 + }, +/area/space/nearstation) +"kiG" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"kiM" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kjb" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/item/clothing/suit/nerdshirt, +/obj/item/clothing/head/fedora, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kjk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kjq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"kjv" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/station/service/library) +"kjx" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"kjI" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/bar) +"kjK" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/machinery/camera/directional/north{ + c_tag = "Bar - Fore" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kjX" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"kjY" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"kkn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"kkO" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"klh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering{ + name = "Tech Storage"; + req_one_access_txt = "23;30" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"kll" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/storage/gas) +"klr" = ( +/obj/structure/mirror/directional/north{ + pixel_y = 34 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"klx" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/commons/lounge) +"klE" = ( +/obj/item/gun/energy/ionrifle, +/obj/item/gun/energy/temperature/security, +/obj/item/clothing/suit/hooded/ablative, +/obj/machinery/light/directional/east, +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"klR" = ( +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"kmw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"kmy" = ( +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"kmQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kmV" = ( +/obj/machinery/camera/emp_proof/directional/west{ + network = list("ss13","engine"); + c_tag = "Engine Monitoring" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"knc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"knh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"knS" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"knZ" = ( +/obj/machinery/door/window{ + name = "Captain's Bedroom"; + dir = 1; + req_access_txt = "20" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"koc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "16" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"kod" = ( +/obj/structure/table/glass, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white, +/obj/item/pen/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"koj" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"kol" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"koq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"koy" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"koF" = ( +/obj/docking_port/stationary{ + name = "port bay 2"; + dir = 8; + width = 5; + height = 13; + id = "ferry_home"; + dwidth = 2 + }, +/turf/open/space/basic, +/area/space) +"koR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"kpe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"kph" = ( +/obj/item/newspaper, +/obj/structure/table, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"kpm" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light_switch/directional{ + pixel_x = -24; + pixel_y = -8 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"kpn" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kpo" = ( +/obj/effect/landmark/observer_start, +/obj/effect/turf_decal/plaque{ + icon_state = "L8" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"kpp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"kpE" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"kpF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"kpG" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"kpJ" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kpL" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 22 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"kpQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"kpR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"kqs" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Bridge - Port" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"kqA" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + name = "Security Reception Desk"; + dir = 1; + req_access_txt = "3" + }, +/obj/machinery/door/window/left/directional/west{ + name = "Reception Desk"; + icon_state = "right"; + dir = 2; + base_state = "right" + }, +/obj/machinery/door/firedoor, +/obj/item/cigbutt{ + pixel_x = 6 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"kqM" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/sink{ + pixel_y = 22 + }, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"kqV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/command) +"kra" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/office) +"krt" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/drinks/shaker, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"krz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"krC" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"krH" = ( +/obj/machinery/power/generator{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/orange{ + icon_state = "8" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"krX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"krY" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ksj" = ( +/obj/machinery/navbeacon{ + location = "16-Fore"; + codes_txt = "patrol;next_patrol=0-SecurityDesk" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"ksk" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/nuke_storage) +"ksn" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ksv" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/obj/structure/sign/departments/botany{ + pixel_x = 32 + }, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ksB" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/aft) +"ksK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"ksR" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ksY" = ( +/obj/machinery/space_heater, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"kte" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageSort2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"ktz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Dormitories" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"ktD" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"ktN" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"ktO" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/qm) +"ktW" = ( +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"kuc" = ( +/obj/machinery/computer/teleporter{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/command/teleporter) +"kue" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"kuD" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"kuN" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "chapel shutters"; + id = "chapel_shutters_space" + }, +/turf/open/floor/plating, +/area/station/service/chapel) +"kuX" = ( +/obj/machinery/vending/cigarette, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"kuZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kvu" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"kvC" = ( +/obj/structure/closet/secure_closet/bar{ + req_access_txt = "25" + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/service/bar) +"kvD" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"kvR" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/central) +"kvZ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"kws" = ( +/obj/machinery/door/window{ + name = "Theater Stage"; + icon_state = "right"; + dir = 8; + base_state = "right" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"kwB" = ( +/obj/machinery/computer/upload/ai, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Upload Console Window"; + icon_state = "right"; + dir = 2; + layer = 3.1; + base_state = "right"; + req_access_txt = "16" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"kwL" = ( +/obj/structure/table/wood, +/obj/machinery/button/ticket_machine{ + pixel_x = 32 + }, +/obj/item/paper_bin/carbon{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/stamp/hop{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/light_switch/directional/south{ + pixel_x = 6; + pixel_y = -34 + }, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters Control"; + pixel_x = -6; + id = "hop"; + req_access_txt = "57" + }, +/obj/machinery/button/door/directional/south{ + name = "Queue Shutters Control"; + pixel_x = -6; + pixel_y = -34; + id = "hopqueue"; + req_access_txt = "57" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"kxq" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/porta_turret/ai, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 8; + pixel_x = 28 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"kxw" = ( +/obj/structure/cable/yellow{ + icon_state = "130" + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"kxD" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"kxY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"kyd" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/effect/turf_decal/siding/red, +/obj/effect/turf_decal/arrows, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"kyt" = ( +/obj/structure/chair{ + name = "Bailiff" + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) +"kyC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/disposal/incinerator) +"kyP" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"kyS" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/rods, +/turf/open/space/basic, +/area/station/solars/port/fore) +"kyU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/command) +"kza" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"kze" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"kzm" = ( +/obj/structure/table/reinforced, +/obj/item/folder/red{ + pixel_x = 5 + }, +/obj/item/storage/box/evidence{ + pixel_x = -5; + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"kzq" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office) +"kzs" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"kzL" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"kzS" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Shared Engineering Storage"; + req_one_access_txt = "32;19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"kzV" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/subspace/treatment, +/obj/item/stock_parts/subspace/treatment, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"kzZ" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/station/dispenser{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"kAf" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light/cold/directional/south, +/obj/structure/sign/exitonly{ + pixel_y = -32 + }, +/obj/effect/turf_decal/siding/red/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"kAg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"kAk" = ( +/obj/structure/table, +/obj/item/hand_tele, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"kAt" = ( +/obj/machinery/disposal/delivery_chute{ + name = "Medical Deliveries"; + dir = 1 + }, +/obj/structure/plasticflaps/opaque{ + name = "Medical Deliveries" + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/departments/examroom{ + pixel_y = -32; + color = "#52B4E9" + }, +/obj/structure/barricade/wooden, +/obj/structure/window/spawner/north, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"kAC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"kAN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"kAS" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Central Primary Hallway - Fore" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"kBa" = ( +/obj/machinery/portable_atmospherics/canister/hydrogen, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"kBj" = ( +/obj/structure/rack, +/obj/effect/landmark/blobstart, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"kBm" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"kBF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"kBI" = ( +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"kBT" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/structure/cable/red{ + icon_state = "48" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"kBZ" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/station/service/library) +"kCb" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"kCQ" = ( +/obj/machinery/door/airlock{ + name = "Service Hall"; + req_access_txt = "null"; + req_one_access_txt = "73" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"kCX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"kDb" = ( +/obj/structure/table, +/obj/item/food/mint, +/obj/item/kitchen/rollingpin, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 5 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"kDp" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"kDs" = ( +/obj/item/wrench, +/obj/item/stack/sheet/glass{ + amount = 30 + }, +/obj/item/stack/sheet/iron{ + amount = 30 + }, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/structure/closet, +/obj/item/vending_refill/cigarette, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/random/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"kDS" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/flasher/portable, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"kEt" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"kEA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"kED" = ( +/obj/structure/table, +/obj/item/stack/package_wrap/small, +/obj/item/hand_labeler, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"kEL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"kES" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"kEZ" = ( +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"kFb" = ( +/obj/structure/rack, +/obj/item/electronics/firelock, +/obj/item/electronics/apc, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"kFc" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"kFj" = ( +/obj/machinery/light/small/directional/west, +/obj/item/clothing/mask/animal/horsehead, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/south, +/obj/item/clothing/mask/cigarette/pipe, +/obj/item/clothing/mask/fakemoustache, +/obj/structure/sign/poster/contraband/random/directional/west, +/turf/open/floor/wood, +/area/station/service/theater) +"kFl" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"kFz" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"kFC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"kFP" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/office/hall) +"kGf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"kGj" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"kGn" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"kGx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kGT" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/priapus, +/turf/open/floor/plating, +/area/station/service/hydroponics) +"kHe" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"kHg" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"kHt" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"kHI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"kHU" = ( +/obj/machinery/power/solar{ + name = "Fore-Port Solar Array"; + id = "foreport" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/fore) +"kHV" = ( +/obj/machinery/light/directional/east, +/obj/machinery/camera/autoname/directional/east{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"kIb" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"kIC" = ( +/obj/machinery/recharger{ + pixel_y = 3 + }, +/obj/item/restraints/handcuffs{ + pixel_y = 3 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"kID" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"kIE" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"kIF" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"kIH" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"kIO" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Fore Port" + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"kIR" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"kJi" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air to Distro"; + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"kJr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"kJt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/medical/cryo) +"kJA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"kJM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"kKl" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"kKm" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"kKn" = ( +/turf/open/floor/carpet, +/area/station/service/chapel) +"kKA" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron, +/area/station/cargo/storage) +"kKP" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"kKR" = ( +/obj/machinery/requests_console/directional/north{ + name = "Chapel Requests Console"; + department = "Chapel"; + departmentType = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"kLf" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"kLn" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"kLt" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"kLA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"kLG" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"kLK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"kLU" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"kMb" = ( +/obj/machinery/door/airlock{ + name = "Patient Restroom"; + id_tag = "Med_PatientWC" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/medical/medbay/aft) +"kMn" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/aft) +"kMp" = ( +/obj/structure/table/glass, +/obj/item/roller, +/obj/item/roller{ + pixel_y = 16 + }, +/obj/machinery/defibrillator_mount/loaded/directional/west, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"kMq" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "20;12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"kMC" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"kMF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"kMN" = ( +/obj/structure/table, +/obj/item/stack/cable_coil{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/stack/cable_coil, +/obj/item/stock_parts/cell/high, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"kNb" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/processor{ + pixel_y = 12 + }, +/obj/effect/turf_decal/bot, +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"kNF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"kNH" = ( +/obj/machinery/door/airlock/security{ + name = "Evidence Storage"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"kNJ" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"kOc" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/security/armory) +"kOh" = ( +/obj/machinery/space_heater, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"kOi" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/rnd/production/fabricator/department/medical, +/obj/machinery/light_switch/directional{ + pixel_x = -24; + pixel_y = -8 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"kOE" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"kOH" = ( +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"kOR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Medbay Central Fore Corridor" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"kPg" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/construction/storage_wing) +"kPs" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port Mix to South Ports"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"kPy" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"kPF" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"kPU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"kQw" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"kQx" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"kQH" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port) +"kRh" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Emergency Loop Tie"; + dir = 8 + }, +/obj/effect/turf_decal/delivery/white, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"kRs" = ( +/obj/machinery/chem_master/condimaster{ + name = "SapMaster XP"; + desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments." + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/directional/north{ + c_tag = "Hydroponics - Fore" + }, +/obj/machinery/button/door/directional/north{ + name = "Service Shutter Control"; + id = "hydro_service"; + req_access_txt = "35" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"kRJ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kRW" = ( +/obj/structure/chair/stool{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"kSg" = ( +/obj/structure/rack, +/obj/item/storage/box, +/obj/effect/turf_decal/bot, +/obj/item/radio/off{ + pixel_x = 6 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"kSq" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"kSr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) +"kSD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"kSV" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/engineering/main) +"kSW" = ( +/obj/machinery/light/directional/north, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/engineering/main) +"kTc" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kTd" = ( +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kTh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"kTu" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"kTA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/botanist, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"kTG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"kTN" = ( +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north{ + name = "Private Channel"; + frequency = 1447; + listening = 0; + broadcasting = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"kTO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"kTQ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"kTX" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"kUc" = ( +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/machinery/camera/directional/east{ + network = list("ss13","prison","isolation"); + c_tag = "Isolation Cell A" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"kUj" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "18" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"kUw" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/medical) +"kUA" = ( +/obj/machinery/door/window/right/directional/west{ + name = "Atmospherics Access"; + dir = 1; + req_access_txt = "24" + }, +/obj/effect/turf_decal/loading_area, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"kUC" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"kUK" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"kVb" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/turret_protected/ai_upload) +"kVU" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"kVX" = ( +/obj/structure/rack, +/obj/item/storage/pill_bottle/iron, +/obj/item/storage/pill_bottle/dylovene, +/obj/item/storage/pill_bottle/potassiodide{ + pixel_x = -8 + }, +/obj/effect/turf_decal/delivery/red, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"kWd" = ( +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"kWr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"kWz" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/stairs{ + dir = 4 + }, +/area/station/security/deck) +"kWE" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Aft" + }, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-16" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"kWT" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/transit_tube) +"kXb" = ( +/obj/machinery/vending/boozeomat, +/obj/structure/sign/picture_frame/portrait/bar{ + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/item/radio/intercom/directional/west, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/service/bar) +"kXf" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"kXl" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Courtroom" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"kXu" = ( +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kXB" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"kXD" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"kXP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"kXU" = ( +/obj/machinery/door/airlock{ + name = "Port Emergency Storage" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"kXW" = ( +/obj/machinery/door/window/right/directional/south{ + name = "Coffee Shop"; + req_one_access_txt = "12;25;28;35;37" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"kYq" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Crate Security Door"; + dir = 2; + req_access_txt = "50" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"kYs" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/wood, +/area/station/cargo/qm) +"kYK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"kZe" = ( +/obj/machinery/power/shieldwallgen, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"kZg" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"kZw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Foyer"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/cyan{ + icon_state = "160" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"kZJ" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"kZT" = ( +/obj/machinery/door/poddoor/incinerator_atmos_main, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"lae" = ( +/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/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lan" = ( +/obj/machinery/air_sensor/nitrogen_tank, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"lao" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"lat" = ( +/obj/structure/sign/poster/official/moth_epi{ + pixel_x = -32 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"lax" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/button/door/directional/east{ + name = "Commissary Door Lock"; + id = "commissarydoor"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"laC" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"laG" = ( +/obj/machinery/modular_computer/console/preset/cargochat/engineering, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"laQ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/taperecorder, +/obj/item/computer_hardware/hard_drive/role/lawyer, +/obj/machinery/button/door/directional/south{ + name = "law office shutter control"; + id = "lawyer_shutters"; + req_access_txt = "38" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"laY" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"lbc" = ( +/obj/machinery/meter/monitored/waste_loop, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"lbd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"lbe" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lbf" = ( +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"lbo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"lbp" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"lbH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"lbS" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"lcm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lcq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/norn, +/area/station/security/prison/workout) +"lcG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central/port) +"lcJ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"lcW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"lde" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"ldq" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"ldu" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/exit) +"ldC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"ldM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"leb" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central/aft) +"lej" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lel" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/firealarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"leB" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port) +"leQ" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"lfh" = ( +/obj/machinery/chem_master, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"lfk" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"lfp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"lfX" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"lfY" = ( +/obj/machinery/airalarm/all_access{ + dir = 4; + pixel_x = 24 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"lgb" = ( +/obj/structure/table/wood, +/obj/item/clothing/head/sombrero, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) +"lgc" = ( +/obj/structure/chair/office, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/security/warden) +"lgg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"lgk" = ( +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lgw" = ( +/turf/open/floor/carpet, +/area/station/service/library) +"lgz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lgK" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) +"lgM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"lgN" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"lgY" = ( +/obj/structure/table, +/obj/item/multitool{ + pixel_x = 4; + pixel_y = 12 + }, +/obj/item/multitool{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/structure/table, +/obj/item/stock_parts/cell/high{ + pixel_y = -4 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/item/multitool{ + pixel_y = 10 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"lgZ" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"lhd" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"lhj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"lhr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"lhC" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"lhM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/urinal/directional/west, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"lhN" = ( +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"lic" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lip" = ( +/obj/structure/sign/warning/testchamber, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"liO" = ( +/obj/structure/table/reinforced, +/obj/item/folder/yellow, +/obj/item/stamp/ce, +/obj/item/reagent_containers/pill/kelotane, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/computer_hardware/hard_drive/role/atmos, +/obj/item/computer_hardware/hard_drive/role/engineering, +/obj/item/computer_hardware/hard_drive/role/engineering, +/obj/item/computer_hardware/hard_drive/role/engineering, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"liV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Medbay Lobby"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"ljb" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/theater) +"ljc" = ( +/obj/structure/urinal/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"ljf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lji" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"ljk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"ljB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"ljI" = ( +/obj/structure/table/wood, +/obj/machinery/telephone/security, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"ljQ" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/storage/primary) +"ljU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ljV" = ( +/obj/item/bedsheet/medical, +/obj/structure/bed, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/cold/directional/east, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lkj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters Control"; + id = "ceprivacy" + }, +/obj/machinery/pdapainter/engineering, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"lkE" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"lkM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"lkO" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lkV" = ( +/obj/machinery/teleport/station, +/turf/open/floor/plating, +/area/station/command/teleporter) +"lli" = ( +/obj/structure/table, +/obj/item/food/grown/wheat, +/obj/item/food/grown/watermelon, +/obj/item/food/grown/citrus/orange, +/obj/item/food/grown/grapes, +/obj/item/food/grown/cocoapod, +/obj/item/food/grown/apple, +/obj/item/food/grown/chili, +/obj/item/food/grown/cherries, +/obj/item/food/grown/soybeans, +/obj/item/food/grown/citrus/lime, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"llk" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/item/stack/splint, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"llm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"llF" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"llN" = ( +/obj/item/stack/cable_coil/yellow, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"llX" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"lmx" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/storage) +"lmA" = ( +/obj/item/wrench, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"lmC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/keycard_auth/directional/west, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"lmF" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"lmL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) +"lmP" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lmS" = ( +/obj/structure/table/glass, +/obj/machinery/body_scan_display/directional/east, +/obj/item/cautery, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"lnd" = ( +/obj/machinery/power/solar_control{ + name = "Starboard Bow Solar Control"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"lng" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/directional/west{ + c_tag = "Auxilary Restrooms" + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"lni" = ( +/obj/machinery/light/cold/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"lnk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"lnt" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"lnv" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/stack/cable_coil/random, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/canvas, +/obj/item/chisel{ + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"lnz" = ( +/obj/structure/closet/secure_closet/hydroponics, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lnA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"lnN" = ( +/obj/structure/table, +/obj/item/storage/bag/construction, +/obj/item/storage/bag/construction, +/obj/item/storage/bag/construction, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/structure/sign/poster/official/build{ + pixel_x = 32 + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"lnQ" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"lnS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"lnV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lod" = ( +/obj/machinery/light/cold/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"loe" = ( +/obj/structure/disposalpipe/sorting/mail{ + sortType = 4 + }, +/obj/effect/landmark/start/station_engineer, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"loh" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "Storage Cage" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lot" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/holomap/directional/south, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"loz" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/medical/pharmacy) +"loX" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"lpg" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"lpi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"lps" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"lpt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"lpV" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/departments/court{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"lqz" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"lqA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom"; + req_access_txt = "42" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"lqD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Port Mix to North Ports"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lqI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"lqJ" = ( +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"lqR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"lqU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lqW" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"lqZ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Tool Storage" + }, +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination/tools, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"lra" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"lrg" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lri" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"lrn" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lro" = ( +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"lrw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "66" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Robotics Lab"; + req_access_txt = "29"; + stripe_paint = "#563758" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"lrH" = ( +/obj/machinery/photocopier, +/turf/open/floor/iron, +/area/station/security/warden) +"lrI" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/computer/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"lrL" = ( +/obj/machinery/holopad, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lsm" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/ai_monitored/security/armory) +"lsH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lsN" = ( +/obj/machinery/requests_console/directional/east{ + name = "Bridge Requests Console"; + department = "Bridge"; + departmentType = 5; + announcementConsole = 1 + }, +/obj/machinery/computer/cargo/request, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"lsT" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"ltm" = ( +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"ltp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ltq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/rack, +/obj/item/stack/splint, +/turf/open/floor/iron, +/area/station/security/medical) +"ltw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ltC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atm, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"ltL" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/service_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"luw" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"luG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"luT" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"luY" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/requests_console/directional/west{ + name = "Kitchen Requests Console"; + department = "Kitchen"; + departmentType = 2 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"lvu" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"lvJ" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lvP" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Atmospherics Desk"; + dir = 2; + req_access_txt = "24" + }, +/obj/item/folder/yellow, +/obj/item/pen, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + name = "Atmospherics Blast Door"; + id = "atmos" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"lvR" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"lvY" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"lwL" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table, +/obj/machinery/firealarm/directional/north, +/obj/item/stack/sheet/iron/five, +/obj/item/radio/intercom/directional/east{ + pixel_y = 8 + }, +/obj/item/stack/cable_coil/five, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"lwP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"lwV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"lwZ" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"lxc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"lxg" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lxh" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"lxA" = ( +/obj/structure/rack, +/obj/item/extinguisher, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"lxC" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lxD" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"lxG" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/cyan{ + icon_state = "68" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"lxR" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Danger: Conveyor Access"; + req_access_txt = "12" + }, +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"lyb" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"lye" = ( +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lyi" = ( +/obj/machinery/airalarm/directional/north, +/obj/item/kirbyplants{ + icon_state = "applebush" + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lyn" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/commons/lounge) +"lyp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Air to Mix" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lyI" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"lyW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"lza" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "5" + }, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/obj/structure/cable/cyan{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"lzb" = ( +/obj/item/folder/red{ + pixel_y = 3 + }, +/obj/machinery/light/directional/east, +/obj/structure/table/glass, +/obj/item/folder/red{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"lzc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/aisat/exterior) +"lzj" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"lzk" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"lzm" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"lzu" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/iron, +/area/station/service/bar) +"lzG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"lzP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "holodeck" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"lzQ" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"lzR" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Lobby"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"lzV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"lzZ" = ( +/obj/structure/noticeboard/directional/north{ + name = "memorial board"; + desc = "A memorial wall for pinning mementos upon." + }, +/obj/item/storage/book/bible, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"lAm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/janitorialcart, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/service/janitor) +"lAt" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"lAu" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lAB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lAF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"lAK" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/mud, +/area/station/security/pig) +"lBB" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"lBH" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Restrooms" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"lBT" = ( +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"lBV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) +"lCk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lCs" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"lCP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"lCU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"lDf" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"lDh" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"lDl" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/light/no_nightlight/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"lDo" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lDs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/urinal/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"lDy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"lDz" = ( +/obj/item/kirbyplants{ + icon_state = "plant-06" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"lEh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lEi" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/brig) +"lEk" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/command/heads_quarters/cmo) +"lEm" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Cargo Desk"; + req_access_txt = "50" + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/item/newspaper, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"lES" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/service) +"lEW" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/surgery/starboard) +"lFc" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"lFl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"lFz" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/command) +"lFJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/engineering/flashlight, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"lFY" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"lFZ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"lGq" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/warning, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lGN" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/engineering/main) +"lHr" = ( +/obj/structure/table, +/obj/item/clothing/under/suit/sl, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"lHv" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"lHy" = ( +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"lHH" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "10" + }, +/obj/structure/cable/red{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"lHL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"lHO" = ( +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = 2; + pixel_y = -3 + }, +/obj/item/stack/package_wrap{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"lIj" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"lIC" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"lID" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "pile"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lIJ" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lIO" = ( +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"lIT" = ( +/obj/structure/table/glass, +/obj/item/wheelchair{ + pixel_y = -4 + }, +/obj/item/wheelchair{ + pixel_y = 4 + }, +/obj/machinery/defibrillator_mount/loaded/directional/west, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"lJg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"lJk" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"lJl" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"lJm" = ( +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lJn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lJz" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"lJE" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lJF" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"lJI" = ( +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"lJQ" = ( +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"lJT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"lJW" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"lJX" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/psychology) +"lKf" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"lKh" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lKs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Vacant Commissary Shutter"; + id = "commissaryshutter" + }, +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"lKu" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"lLi" = ( +/obj/machinery/computer/security/qm{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/cargo/qm) +"lLr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/command) +"lLs" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/spawner/random/maintenance, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"lLS" = ( +/obj/item/crowbar, +/obj/item/wrench, +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lLU" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lLZ" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/co2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lMf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"lMo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) +"lMq" = ( +/turf/open/misc/asteroid/basalt/airless, +/area/space/nearstation) +"lMr" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"lMJ" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"lMV" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"lMZ" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"lNv" = ( +/obj/structure/sign/warning/fire{ + pixel_x = 32 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Fuel Pipe to Incinerator" + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"lNF" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"lNZ" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"lOb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"lOe" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/vending/games, +/turf/open/floor/wood, +/area/station/service/library) +"lOg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"lOh" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"lOS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/vending/tool, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"lPc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"lPi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"lPu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/mix_output{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"lPJ" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"lPR" = ( +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lQm" = ( +/obj/machinery/space_heater, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lQx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lQF" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lQY" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/station/maintenance/port) +"lRa" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"lRu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"lRX" = ( +/obj/machinery/light/cold/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"lSa" = ( +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"lSj" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"lSk" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"lSH" = ( +/obj/machinery/door/airlock/security{ + name = "Interrogation Monitoring"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/security/interrogation) +"lSQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Cargo Bay Bridge Access" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"lSX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"lTl" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/fluorine, +/obj/item/reagent_containers/glass/bottle/lithium{ + pixel_x = 8 + }, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = -8 + }, +/obj/effect/turf_decal/delivery/red, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lTt" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"lTG" = ( +/obj/structure/sign/painting/library{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/station/service/library) +"lTQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Exam Room"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"lTX" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/break_room) +"lUs" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/item/storage/box/syringes, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"lUv" = ( +/obj/item/storage/book/bible, +/obj/structure/altar_of_gods, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"lUJ" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"lUR" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) +"lUU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"lVn" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lVr" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/machinery/light/small/directional/north, +/turf/open/floor/cult, +/area/station/service/chapel/funeral) +"lVt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"lWd" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "24" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"lWh" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 6 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"lWm" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"lWB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"lWR" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"lWS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/highsecurity{ + name = "AI Upload"; + req_access_txt = "16" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"lWV" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Fuel Pipe to Filter"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"lXP" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"lYp" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"lYt" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"lYH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"lYI" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"lYL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"lZn" = ( +/obj/machinery/door/airlock{ + name = "Theater Backstage"; + req_access_txt = "46" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/maintenance/starboard/greater) +"lZo" = ( +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = -8 + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/heads_quarters/captain/private) +"lZy" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"lZB" = ( +/obj/structure/table, +/obj/item/aicard, +/obj/item/ai_module/reset, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"lZE" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"lZK" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"lZL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"maD" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet/evidence, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"maJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"maO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"maW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"mbz" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"mbD" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Warehouse Shutters"; + id = "qm_warehouse" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"mcb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"mcQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"mcS" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"mdd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mds" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mdB" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"mdE" = ( +/obj/machinery/navbeacon{ + dir = 4; + freq = 1400; + location = "Engineering"; + codes_txt = "delivery;dir=4" + }, +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/starboard/fore) +"mdP" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"mee" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/captain/private) +"mef" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"mey" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light_switch/directional/north, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"meA" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"meI" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mfb" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mfe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"mft" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"mfM" = ( +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"mfU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"mfY" = ( +/mob/living/simple_animal/pet/fox/renault, +/obj/machinery/light/directional/south, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -29 + }, +/obj/structure/bed/dogbed/renault, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"mgl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/medical/cryo) +"mgt" = ( +/obj/effect/turf_decal/box/red, +/obj/effect/turf_decal/arrows/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"mgx" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"mgF" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"mgI" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"mgJ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"mgK" = ( +/obj/machinery/door/airlock/public/glass{ + name = "space-bridge access" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"mhd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mhh" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/structure/sign/painting/library_secure{ + pixel_x = 32 + }, +/obj/effect/spawner/random/decoration/statue{ + spawn_loot_chance = 50 + }, +/turf/open/floor/carpet/royalblue, +/area/station/service/library) +"mhi" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/h2{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"mhs" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"mht" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) +"mhO" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 8 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"mhT" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"mhY" = ( +/obj/machinery/vending/medical, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"mix" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"miC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"miG" = ( +/obj/machinery/light/directional/west, +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"miQ" = ( +/obj/structure/closet/crate/freezer/blood, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"miS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron, +/area/station/security/medical) +"miV" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"miW" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"mji" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/space, +/area/space/nearstation) +"mjt" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Storage"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"mju" = ( +/obj/structure/cable/red{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"mjv" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"mjJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"mjN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/chair/stool{ + dir = 8 + }, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"mjV" = ( +/obj/machinery/door/airlock/silver{ + name = "Bathroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) +"mkd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"mkm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"mkw" = ( +/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/item/clothing/glasses/sunglasses, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"mkx" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/dorms) +"mkY" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mkZ" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"mld" = ( +/obj/machinery/air_sensor/nitrous_tank, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"mlg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"mlD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"mlS" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mlU" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/filled/line, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"mma" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"mmb" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "singular" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mmf" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"mml" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/command/bridge) +"mmp" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"mmu" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"mmx" = ( +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"mmU" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mmZ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/office) +"mna" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/trimline/red/corner, +/turf/open/floor/iron, +/area/station/security/lockers) +"mnq" = ( +/obj/structure/chair, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"mns" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"mnJ" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mnK" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"mnX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"mok" = ( +/obj/structure/table, +/obj/item/paper/fluff/holodeck/disclaimer, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mol" = ( +/obj/effect/mapping_helpers/paint_wall/priapus, +/turf/closed/wall/prepainted/daedalus, +/area/station/service/hydroponics) +"mot" = ( +/obj/structure/mirror/directional/west, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"mox" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/item/stack/medical/bone_gel, +/obj/item/stack/sticky_tape/surgical, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"moz" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/hemostat, +/obj/effect/turf_decal/tile/blue, +/obj/item/bonesetter, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"moM" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/medbay/aft) +"moO" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"moX" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"mpe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"mph" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"mpk" = ( +/mob/living/simple_animal/bot/mulebot{ + name = "Leaping Rabbit" + }, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/decal/cleanable/blood/gibs/down, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"mpm" = ( +/obj/item/taperecorder, +/obj/item/camera, +/obj/structure/table/wood, +/obj/item/radio/intercom/directional/south, +/obj/structure/sign/painting/library_private{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"mpv" = ( +/obj/machinery/modular_computer/console/preset/id{ + dir = 4 + }, +/obj/item/paper/fluff/ids_for_dummies, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"mpz" = ( +/obj/item/mmi, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mpA" = ( +/obj/structure/table, +/obj/item/clothing/under/suit/black/skirt, +/obj/item/clothing/under/suit/black_really, +/obj/item/radio/intercom/directional/north, +/obj/item/clothing/accessory/waistcoat, +/obj/item/clothing/suit/toggle/lawyer/black, +/obj/item/clothing/under/suit/red, +/obj/item/clothing/neck/tie/black, +/obj/item/clothing/under/suit/black, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms) +"mpF" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port) +"mqb" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"mqi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/restraints/legcuffs/beartrap, +/obj/item/restraints/legcuffs/beartrap, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Custodial Closet" + }, +/turf/open/floor/iron, +/area/station/service/janitor) +"mqo" = ( +/obj/machinery/door/poddoor/shutters{ + id = "maintwarehouse" + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/aft) +"mqx" = ( +/obj/structure/chair, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"mqS" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"mqZ" = ( +/obj/structure/table, +/obj/item/folder/yellow, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/item/paper/pamphlet/gateway, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"mrb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/space_heater, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mrd" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Storage" + }, +/obj/machinery/suit_storage_unit/engine, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"mrg" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"mrj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"mrv" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cloth/five, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mrw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mrD" = ( +/obj/machinery/vending/wardrobe/law_wardrobe, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"mrN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mrR" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"mrV" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mrX" = ( +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"msa" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"msj" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/table/glass, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"msu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"msw" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "chapel shutters"; + id = "chapel_shutters_parlour" + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"msK" = ( +/obj/machinery/power/emitter/welded{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "8" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"msN" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/station/cargo/storage) +"msP" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/fore) +"msQ" = ( +/obj/machinery/light/directional/west, +/obj/structure/sign/poster/official/random/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"msV" = ( +/obj/structure/closet/crate/bin, +/obj/item/knife/kitchen, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mtp" = ( +/obj/structure/rack, +/obj/item/crowbar/red, +/obj/item/restraints/handcuffs, +/obj/item/wrench, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"mtt" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mtu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"mtC" = ( +/obj/effect/spawner/random/structure/chair_maintenance, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"mtN" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"mtV" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"mug" = ( +/obj/machinery/power/apc/highcap/five_k/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"muo" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) +"mut" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/sign/poster/official/safety_report{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/station/cargo/warehouse) +"muD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"muL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"muN" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/structure/closet_private, +/obj/item/clothing/under/suit/navy, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"muP" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"muS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"muT" = ( +/turf/open/floor/iron, +/area/station/engineering/main) +"muX" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"mvx" = ( +/obj/machinery/navbeacon{ + location = "11.1-Command-Starboard"; + codes_txt = "patrol;next_patrol=12-Central-Starboard" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"mvJ" = ( +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"mwi" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"mwl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mwr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"mwC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"mwM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mwS" = ( +/turf/open/space/basic, +/area/station/cargo/mining/asteroid_magnet) +"mxI" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "32" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"mxY" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"mya" = ( +/obj/machinery/vending/drugs, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"myi" = ( +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"myl" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"myn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"myp" = ( +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"myv" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "separation shutters"; + dir = 4; + id = "med_sleeper_center" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"myS" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"myT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"mzd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"mzj" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"mzm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"mzn" = ( +/obj/effect/turf_decal/siding/brown/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/arrow_ccw{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/arrow_cw, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/exitonly{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"mzD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"mzG" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mzH" = ( +/obj/structure/table/glass, +/obj/item/hand_labeler, +/obj/item/radio/headset/headset_med, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"mzL" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/station/engineering/main) +"mzP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Psychology"; + stripe_paint = "#D381C9"; + req_access_txt = "70" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"mzU" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/rack, +/obj/item/multitool, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"mAe" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mAt" = ( +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"mAz" = ( +/obj/structure/closet/secure_closet/psychology, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"mAC" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/iron, +/area/station/commons/locker) +"mAI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/camera/autoname/directional/south{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"mAJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"mAR" = ( +/obj/structure/table/glass, +/obj/item/wrench, +/obj/item/crowbar, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"mAY" = ( +/obj/item/clothing/suit/snowman, +/obj/item/clothing/head/snowman, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"mBc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/vehicle/ridden/trolley, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mBd" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"mBh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/ticket_machine/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"mBr" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"mBy" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mBY" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mCe" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Pure to Ports"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mCi" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"mCr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"mCz" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"mCT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mDm" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"mDF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/service/janitor) +"mDH" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"mDI" = ( +/obj/machinery/vending/assist, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"mDK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mDP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/atmos/glass{ + name = "Hypertorus Fusion Reactor"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"mEA" = ( +/obj/item/kirbyplants{ + icon_state = "plant-24" + }, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"mEX" = ( +/obj/machinery/bookbinder, +/turf/open/floor/wood, +/area/station/service/library) +"mFv" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"mFy" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mFA" = ( +/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/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"mFF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"mFH" = ( +/obj/effect/spawner/structure/window/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"mFY" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"mGc" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = -5 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/storage/secure/briefcase{ + pixel_x = 5; + pixel_y = 7 + }, +/turf/open/floor/iron, +/area/station/security/office) +"mGx" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/assembly/mousetrap, +/obj/item/food/deadmouse, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mGD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mGG" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"mGK" = ( +/obj/structure/rack, +/obj/machinery/status_display/ai/directional/north, +/obj/effect/spawner/random/techstorage/medical_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"mGO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mGU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"mGZ" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mHn" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space/basic, +/area/station/solars/port/aft) +"mHw" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel- Starboard" + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"mHK" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"mHP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"mHT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"mIc" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mIe" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"mIi" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 5 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"mIj" = ( +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"mIJ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Starboard Operating Room"; + stripe_paint = "#DE3A3A"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"mIS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"mJk" = ( +/obj/item/storage/box/matches{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/clothing/mask/cigarette/cigar/cohiba, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"mJo" = ( +/obj/machinery/mineral/ore_redemption{ + dir = 4; + input_dir = 8; + output_dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/east{ + name = "Ore Redemtion Window" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"mJA" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"mJF" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"mJI" = ( +/turf/open/space, +/area/space/nearstation) +"mJJ" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"mJK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mJM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"mJS" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"mKe" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"mKf" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"mKv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"mKx" = ( +/obj/machinery/gateway/centerstation, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"mKC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Engine Airlock Internal"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sm-engine-airlock" + }, +/obj/machinery/door/firedoor, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"mKG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"mKO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/tank/plasma{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"mKU" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mLd" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/engineering/material_cheap, +/obj/effect/spawner/random/engineering/tank, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mLi" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"mLC" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"mLF" = ( +/obj/item/radio/intercom/directional/west{ + pixel_y = -10 + }, +/obj/item/kirbyplants/random, +/obj/machinery/light_switch/directional/west{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mLX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mMe" = ( +/obj/structure/cable/red{ + icon_state = "10" + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"mMn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"mMp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"mMs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"mMu" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mMH" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"mML" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"mMO" = ( +/obj/structure/flora/ausbushes/sunnybush, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Virology Test Subject Chamber" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"mMX" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mNc" = ( +/obj/structure/table, +/obj/item/reagent_containers/spray/cleaner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"mNe" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"mNi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/medical) +"mNl" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"mNm" = ( +/obj/structure/table/wood, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"mNo" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mNp" = ( +/obj/machinery/computer/cargo{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"mNE" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/horizontal, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"mNM" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"mOd" = ( +/obj/item/paperplane, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"mOf" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"mOt" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/mapping_helpers/burnt_floor, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mOA" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"mOJ" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Detective's Office" + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"mON" = ( +/obj/machinery/light/directional/north, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/item/book/manual/wiki/engineering_construction{ + pixel_y = 3 + }, +/obj/item/folder/yellow, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mOV" = ( +/obj/machinery/door/window{ + name = "HoP's Desk"; + req_access_txt = "57" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"mPb" = ( +/obj/item/dice/d20, +/obj/item/dice, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/dice, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/light_construct/small/directional/south, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mPk" = ( +/obj/machinery/air_sensor/engine, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"mPm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mPp" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"mPq" = ( +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"mPr" = ( +/obj/structure/rack, +/obj/item/storage/lockbox/loyalty, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"mPw" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Exam Room" + }, +/obj/item/pen/blue, +/obj/machinery/button/door/directional/east{ + name = "Privacy Control"; + id = "med_exam"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"mPB" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"mPK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"mPM" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"mPP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mPX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"mQm" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/blobstart, +/obj/machinery/button/door/directional/west{ + name = "Lock Control"; + id = "Toilet1"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"mQn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"mQp" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/deck) +"mQt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"mQx" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/libraryscanner, +/turf/open/floor/wood, +/area/station/service/library) +"mQD" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"mQH" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Mix to Filter"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"mQK" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Robotics Waiting Room" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"mQR" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) +"mQS" = ( +/obj/machinery/light/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Fore" + }, +/obj/item/kirbyplants{ + icon_state = "plant-24" + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"mQU" = ( +/obj/structure/plasticflaps, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/disposal/delivery_chute, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"mRg" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Fore Primary Hallway Cells" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"mRC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mRF" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Fitness Room - Fore" + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mRL" = ( +/obj/structure/table, +/obj/item/storage/bag/trash, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"mRT" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"mRU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"mSp" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"mSt" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"mSz" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"mSD" = ( +/obj/structure/rack, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"mSE" = ( +/obj/structure/filingcabinet/chestdrawer{ + name = "case files" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"mTh" = ( +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"mTn" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - O2" + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"mTq" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"mTP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 10 + }, +/obj/machinery/meter, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"mTW" = ( +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/crap, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"mTX" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"mUr" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port) +"mUx" = ( +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mUz" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"mUH" = ( +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) +"mUN" = ( +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"mUO" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"mUP" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"mUR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 10 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"mVb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"mVg" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/engineering_hacking{ + pixel_x = 2; + pixel_y = 3 + }, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = -2 + }, +/obj/item/trash/can{ + pixel_x = -8 + }, +/obj/machinery/firealarm/directional/south, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mVr" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) +"mVs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"mVL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mVX" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/door/window{ + name = "Captain's Desk"; + icon_state = "right"; + base_state = "right"; + req_access_txt = "20" + }, +/obj/structure/disposalpipe/segment, +/obj/item/stamp/captain, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/hand_tele, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"mVZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"mWl" = ( +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"mWn" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/obj/item/radio/intercom/chapel/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"mWs" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"mWO" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 26 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"mXc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate/freezer, +/obj/structure/sink/kitchen{ + name = "old sink"; + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + pixel_y = 28 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"mXf" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/office) +"mXg" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"mXl" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"mXp" = ( +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"mXr" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"mXD" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mXJ" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"mXL" = ( +/obj/docking_port/stationary{ + dir = 4; + width = 3; + height = 4; + dwidth = 1; + roundstart_template = /datum/map_template/shuttle/escape_pod/default + }, +/turf/open/space/basic, +/area/space) +"mXO" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"mYc" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"mYi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"mYO" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"mYY" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"mZc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"mZh" = ( +/obj/structure/rack, +/obj/item/cane, +/obj/item/food/grown/mushroom/glowshroom, +/turf/open/floor/plating, +/area/station/command/heads_quarters/captain/private) +"mZj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"mZK" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_exam" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/medical/exam_room) +"mZW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"mZY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/external{ + name = "Escape Pod Four"; + space_dir = 4; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/department/engine) +"naa" = ( +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"nae" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/holopad, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"nas" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"naA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nbf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/status_display/evac/directional/east, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nbr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"nby" = ( +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"nbz" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/fax_machine, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"nbA" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock{ + name = "Garden" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"nbM" = ( +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/station/service/library) +"nbT" = ( +/obj/machinery/flasher/directional/north{ + id = "Cell 1" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/brig) +"nbX" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + name = "Hot Loop Supply"; + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"ncc" = ( +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"ncf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"ncr" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Waste to Filter" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"ncw" = ( +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ncX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"ndd" = ( +/obj/item/clothing/head/fedora, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ndn" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"ndo" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/locker) +"ndr" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ndu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"ndJ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ndQ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Genpop Brig" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"neb" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"nex" = ( +/obj/machinery/navbeacon{ + location = "3-Central-Port"; + codes_txt = "patrol;next_patrol=4-Customs" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"neE" = ( +/obj/structure/tank_holder/anesthetic, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"neP" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"neZ" = ( +/obj/machinery/jukebox, +/turf/open/floor/wood, +/area/station/commons/lounge) +"nfc" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"nfi" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/lockers) +"nfl" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"nfv" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "atmoshfr" + }, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"nfA" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"nfF" = ( +/obj/machinery/power/solar_control{ + name = "Port Bow Solar Control"; + id = "foreport" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"nfH" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/west{ + name = "Cabin Bolt Control"; + id = "Cabin5"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"nfU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"nfZ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ngd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"ngg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"ngi" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"ngo" = ( +/obj/item/bot_assembly/floorbot{ + name = "FloorDiffBot"; + desc = "Why won't it work?"; + created_name = "FloorDiffBot" + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ngy" = ( +/obj/effect/turf_decal/box/white{ + color = "#EFB341" + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"ngK" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ywflowers, +/obj/item/food/grown/banana, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"ngM" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"nhu" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nhL" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"nhM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Brig"; + req_access_txt = "63; 42" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/courtroom) +"nhP" = ( +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"nhU" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"nhZ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"nib" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -12; + pixel_y = 10 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"niY" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"njb" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"njc" = ( +/obj/machinery/door/airlock/security{ + name = "Court Cell"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"njk" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"njn" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"njp" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"njC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/turf_decal/bot, +/obj/item/electronics/apc, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"nkc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nku" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"nkw" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/north, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood, +/area/station/commons/dorms) +"nkJ" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/commons/storage/art) +"nkK" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/library) +"nkQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"nlq" = ( +/obj/effect/turf_decal/trimline/green/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Port Patient Rooms" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"nlD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"nlE" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"nlK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"nlY" = ( +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"nmf" = ( +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"nml" = ( +/obj/machinery/door/airlock{ + name = "Unit 2"; + id_tag = "Toilet2" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"nmX" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/library) +"nnc" = ( +/obj/structure/rack, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/bruise_pack, +/obj/item/reagent_containers/syringe/dylovene, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"nnj" = ( +/obj/structure/table/wood, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/secure/briefcase{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"nnv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nny" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance, +/obj/item/stock_parts/cell, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"nnz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"nnG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"nnN" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"nnS" = ( +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"nnT" = ( +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) +"noi" = ( +/obj/machinery/light/floor/has_bulb, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + name = "Genpop Shutters"; + id = "cell2genpop"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"nol" = ( +/obj/structure/sign/warning/pods{ + pixel_x = 30 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"noB" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"noE" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel/funeral) +"noK" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/saline_glucose, +/obj/item/reagent_containers/glass/bottle/synaptizine{ + pixel_x = 8 + }, +/obj/effect/turf_decal/delivery/red, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"npp" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/item/stock_parts/subspace/analyzer, +/obj/machinery/camera/directional/west{ + c_tag = "Telecomms - Storage" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"npr" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/station/maintenance/port) +"npB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Network Access"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"npI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"npV" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"nqo" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"nqt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"nqI" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"nqV" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nre" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"nri" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"nrk" = ( +/obj/machinery/computer/security/telescreen{ + name = "Prison Monitor"; + desc = "Used for watching Prison Wing holding areas."; + dir = 8; + pixel_x = 30; + network = list("prison") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"nrm" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nrp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/lounge) +"nrt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"nru" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/wood, +/area/station/commons/lounge) +"nrP" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"nse" = ( +/obj/effect/turf_decal/caution/stand_clear{ + dir = 4 + }, +/obj/effect/turf_decal/box/red/corners{ + dir = 8 + }, +/obj/effect/turf_decal/box/red/corners, +/obj/machinery/door/poddoor/shutters{ + name = "Mech Bay Shutters"; + id = "mechbay" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/robotics/mechbay) +"nsx" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"nsI" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"nsJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) +"nsN" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nsO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"nsQ" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = -2; + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/item/instrument/harmonica{ + pixel_x = 16; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"nsW" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"nsZ" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_loot_count = 3 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"ntb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"ntc" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"ntm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ntu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/washing_machine, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/wood, +/area/station/medical/break_room) +"ntw" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos/storage/gas) +"ntx" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"ntA" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Server Room" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) +"ntB" = ( +/obj/structure/chair/sofa/right{ + dir = 4 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"ntC" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ntK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"ntS" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ntZ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - N2" + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"nui" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"nul" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmospherics_engine) +"num" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"nup" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"nuq" = ( +/obj/machinery/door/airlock/atmos{ + name = "Atmospherics"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/storage/gas) +"nuw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"nuC" = ( +/obj/machinery/navbeacon{ + location = "4-Customs"; + codes_txt = "patrol;next_patrol=5-Customs" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"nuH" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"nuU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"nvn" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"nvp" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nvI" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"nwg" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/smes/engineering{ + input_level = 60000; + output_level = 70000; + input_attempt = 1 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"nwh" = ( +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/button/door/directional/east{ + name = "Cabin Bolt Control"; + id = "Cabin2"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"nwu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"nwB" = ( +/obj/structure/lattice, +/obj/structure/disposalpipe/broken{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"nwP" = ( +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"nwU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nwZ" = ( +/obj/machinery/navbeacon{ + location = "2.1-Leaving-Storage"; + codes_txt = "patrol;next_patrol=3-Central-Port" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"nxd" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"nxg" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"nxm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"nxp" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen/entertainment/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/library) +"nxF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nxW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/holopad/secure, +/obj/machinery/flasher/directional/west{ + pixel_y = -26; + id = "AI" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"nxX" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/corner, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Rooms"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"nyn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nyx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"nyO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nyT" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Fore" + }, +/obj/structure/closet/secure_closet/engineering_welding, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"nzb" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"nzz" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nzF" = ( +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) +"nzV" = ( +/obj/machinery/vending/hydronutrients, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"nAm" = ( +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"nAu" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nAI" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"nAJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"nAL" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"nBb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"nBm" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"nBr" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"nBW" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"nCl" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_sleeper_left" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nCn" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nCs" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/library) +"nCt" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"nCH" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/door/window{ + name = "MiniSat Walkway Access"; + icon_state = "right"; + base_state = "right" + }, +/obj/machinery/camera/directional/west{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Aft Starboard" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"nCP" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"nDg" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"nDl" = ( +/obj/machinery/door/morgue{ + name = "Private Study"; + req_access_txt = "37" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/engine/cult, +/area/station/service/library) +"nDn" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"nDt" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"nDu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/dark{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/port/aft) +"nDv" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Distro Staging"; + dir = 1 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"nDG" = ( +/obj/machinery/light/small/red/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"nDL" = ( +/obj/machinery/power/solar{ + name = "Aft-Port Solar Array"; + id = "aftport" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"nDM" = ( +/obj/structure/fireaxecabinet/directional/south, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_y = 3 + }, +/obj/machinery/light_switch/directional/east, +/obj/structure/table/glass, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"nDS" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"nDU" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"nDV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"nEb" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/newscaster/directional/west, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"nEj" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"nEm" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"nEo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/orange{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"nEJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"nER" = ( +/obj/structure/chair/wood/wings{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/theater) +"nET" = ( +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"nFg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-right" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"nFu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"nFx" = ( +/obj/machinery/gibber, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"nFy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"nFJ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"nFW" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"nGF" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/closet/secure_closet/hydroponics, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"nGK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/maintenance/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"nGR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"nGW" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/cooking_to_serve_man, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"nHc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"nHn" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"nHo" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "129" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"nHu" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/north{ + c_tag = "Service Maintinance" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"nHx" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) +"nHy" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"nHE" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical, +/obj/item/multitool, +/obj/structure/rack, +/obj/effect/turf_decal/stripes/line, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"nHN" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"nIe" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"nIm" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"nIq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"nIw" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"nIG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"nJj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"nJp" = ( +/mob/living/carbon/human/species/monkey, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"nJy" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"nJQ" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"nJT" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nJU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"nKc" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nKm" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"nKu" = ( +/obj/item/cigbutt, +/obj/structure/table/reinforced, +/obj/item/storage/medkit/fire{ + pixel_y = -4 + }, +/obj/item/paper{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"nLe" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"nLg" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"nLP" = ( +/obj/structure/cable/yellow{ + icon_state = "24" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"nLR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/lounge) +"nLT" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/cold/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nLZ" = ( +/obj/item/toy/beach_ball/branded, +/turf/open/space/basic, +/area/space) +"nMa" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"nMc" = ( +/obj/machinery/camera/directional/north{ + network = list("aicore"); + c_tag = "AI Chamber - Fore" + }, +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"nMh" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"nMm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"nMs" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/closet, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"nMw" = ( +/obj/machinery/light/no_nightlight/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"nMz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/cryo) +"nMR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"nNg" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/telephone/engineering, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"nNh" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nNn" = ( +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"nNz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nNE" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"nNG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nNI" = ( +/obj/machinery/photocopier, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"nNL" = ( +/turf/closed/mineral/volcanic, +/area/space/nearstation) +"nNQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"nNY" = ( +/obj/machinery/door/firedoor, +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Kitchen Counter Shutters"; + id = "kitchen_counter" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/service/kitchen) +"nOe" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"nOp" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"nOZ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"nPn" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"nPo" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) +"nPt" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"nPx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"nPD" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/south, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"nPE" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nQd" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/theater) +"nQe" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Locker Room Port" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"nQp" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"nQw" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/pharmacy) +"nRb" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"nRc" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Shower Room"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"nRo" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"nRC" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"nRM" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"nRN" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nRZ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/north, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/station/service/janitor) +"nSV" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"nTj" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nTv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Showers"; + id_tag = "AuxShower" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"nTC" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"nTE" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"nTI" = ( +/turf/open/floor/wood, +/area/station/service/theater) +"nTJ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"nTL" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"nUa" = ( +/obj/machinery/modular_computer/console/preset/cargochat/cargo{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"nUm" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"nUo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + name = "Genpop Shutters"; + id = "cell3genpop"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"nUG" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"nUN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nUU" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"nUY" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Teleporter Access Shutter"; + id = "teleshutter" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"nVd" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nVp" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"nVt" = ( +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nVu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"nVD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"nVM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nVR" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"nWg" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/item/storage/belt/medical{ + pixel_y = -4 + }, +/obj/item/storage/belt/medical, +/obj/item/storage/belt/medical{ + pixel_y = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"nWl" = ( +/obj/structure/cable/red{ + icon_state = "192" + }, +/obj/structure/cable/orange{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"nWL" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/west{ + name = "Cabin Bolt Control"; + id = "Cabin6"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"nWP" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"nWX" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix to Ports"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"nWY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"nXc" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_sleeper_right" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nXk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Quiet Room" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/library) +"nXp" = ( +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"nXq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"nXu" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"nXv" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"nXA" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17;18;5" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"nYl" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/machinery/ore_silo, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"nYJ" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"nZb" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"nZs" = ( +/obj/machinery/ticket_machine/directional/north{ + desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll ansd linked to buttons with a multitool."; + id = "ticket_machine_medbay" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"nZC" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nZF" = ( +/obj/machinery/portable_atmospherics/canister, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"nZQ" = ( +/obj/machinery/light/directional/south, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Starboard Corner" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"oaE" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"oaN" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oaT" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"oaY" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/morgue) +"obG" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"obK" = ( +/obj/machinery/navbeacon{ + location = "14-Starboard-Central"; + codes_txt = "patrol;next_patrol=14.2-Central-CrewQuarters" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"obM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Corporate Showroom"; + req_access_txt = "19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "showroom" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"ocf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"oct" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ocA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ocF" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"ocV" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"odc" = ( +/obj/structure/table, +/obj/effect/spawner/random/engineering/tool, +/turf/open/floor/iron, +/area/station/engineering/main) +"odl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_md_privacy" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "16" + }, +/obj/structure/cable/yellow{ + icon_state = "24" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"odx" = ( +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"odD" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/heads_quarters/hos) +"odF" = ( +/obj/machinery/air_sensor/carbon_tank, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"odO" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"odP" = ( +/obj/machinery/light/directional/west, +/obj/machinery/status_display/ai/directional/west, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"odV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/sign/warning/securearea{ + pixel_x = 32; + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/effect/turf_decal/siding/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"oee" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Central Primary Hallway - Starboard - Kitchen" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"oeg" = ( +/obj/structure/table/wood, +/obj/machinery/status_display/ai/directional/north, +/obj/item/flashlight/lamp, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"oei" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"oet" = ( +/obj/machinery/door/airlock/security{ + name = "Investigator's Office"; + req_access_txt = "4" + }, +/turf/open/floor/iron, +/area/station/security/detectives_office/private_investigators_office) +"oeV" = ( +/obj/machinery/bodyscanner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oeZ" = ( +/obj/structure/urinal/directional/north, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"ofl" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/library, +/obj/structure/sign/painting/large/library_private{ + dir = 8; + pixel_x = -29 + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"ofs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"oft" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Chemistry" + }, +/obj/machinery/chem_heater, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"ofy" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ofB" = ( +/obj/machinery/door/airlock/security{ + name = "Court Cell"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"ofL" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"ofU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"ofZ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"ogd" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 4 + }, +/obj/structure/railing/corner, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"ogo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ogt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 2 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ogv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"ogQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ohh" = ( +/obj/item/flashlight/lantern{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"ohk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"ohl" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"oho" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"ohq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"ohu" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"ohB" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"ohI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/security/medical) +"ohJ" = ( +/obj/machinery/power/smes{ + charge = 1e+07 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "128" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"ohL" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ohO" = ( +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/obj/machinery/camera/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay Robotics Lab" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"ohR" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Diagnostics"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oia" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"ois" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"oiz" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"oiG" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"oiP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"oiX" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"ojc" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"ojl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"ojx" = ( +/obj/structure/table, +/obj/item/storage/box/lights/mixed{ + pixel_x = 11; + pixel_y = 11 + }, +/obj/item/multitool{ + pixel_x = -3; + pixel_y = -4 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"ojz" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/aft) +"ojM" = ( +/obj/machinery/light/directional/east, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"ojW" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/spawner/random/bureaucracy/briefcase{ + spawn_loot_count = 2; + spawn_loot_split = 1 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) +"okc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/brig) +"okn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/machinery/meter, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"okw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"okC" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"olb" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"olc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"olv" = ( +/obj/machinery/vending/security, +/turf/open/floor/iron, +/area/station/security/lockers) +"oly" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8 + }, +/obj/machinery/button/door/directional/south{ + name = "chapel shutters control"; + pixel_x = -6; + id = "chapel_shutters_space" + }, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"olS" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;22;25;26;28;35;37;46;38;70" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"omb" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"omo" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"omt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"omx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"omA" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/qm) +"omD" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + name = "isolation room monitor"; + pixel_x = -30; + network = list("isolation") + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"omF" = ( +/obj/machinery/teleport/station, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"omL" = ( +/turf/open/floor/plating/airless, +/area/space) +"omU" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"ona" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"ond" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/door/airlock/atmos/glass{ + name = "Distribution Loop"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/engineering/atmos/pumproom) +"onq" = ( +/obj/structure/window/reinforced, +/obj/machinery/flasher/directional/north{ + id = "AI" + }, +/obj/effect/spawner/random/aimodule/harmful, +/obj/structure/table/wood/fancy/red, +/obj/machinery/door/window/brigdoor/left/directional/south{ + name = "High-Risk Modules"; + dir = 8; + req_access_txt = "20" + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) +"onr" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"ons" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/kitchen) +"onu" = ( +/obj/machinery/button/door/directional/east{ + name = "Privacy Control"; + id = "med_md_privacy"; + req_access_txt = "40" + }, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"onC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port) +"onR" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"onT" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"onY" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"ooa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ooj" = ( +/obj/structure/table, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/machinery/telephone/security, +/obj/machinery/power/data_terminal, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"ooy" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"ooO" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"ooQ" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"ooZ" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel/funeral) +"opi" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 1 + }, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 6 + }, +/obj/item/paper_bin{ + pixel_x = 8; + pixel_y = 11 + }, +/obj/item/folder/yellow{ + pixel_x = -6; + pixel_y = 8 + }, +/obj/item/folder/yellow{ + pixel_x = -9; + pixel_y = 1 + }, +/obj/item/paper{ + pixel_x = -5 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"opj" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"ops" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"opF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"opO" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"opP" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/primary/aft) +"opV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt{ + pixel_x = -6; + pixel_y = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/trash/garbage, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"oqg" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"oqj" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"oqk" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engine_sides" + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"oqn" = ( +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"oqH" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"oqI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"oqJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"orm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atm, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"orU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"osc" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2, +/turf/open/floor/plating/airless, +/area/station/ai_monitored/aisat/exterior) +"osl" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"osp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"oss" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"osB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"osJ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"osK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"osN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/station/service/library) +"otb" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"otd" = ( +/obj/structure/closet, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"otg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Patient Room D"; + id_tag = "MedPatientD"; + stripe_paint = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"otk" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"otz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"otG" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/suit_storage_unit/cmo, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"otO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"otT" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/official/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"oud" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/vacant_room/commissary) +"oul" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "N2 to Pure"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"our" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"out" = ( +/obj/structure/lattice, +/obj/item/reagent_containers/food/drinks/bottle/goldschlager, +/turf/open/space/basic, +/area/space/nearstation) +"oux" = ( +/obj/structure/table/wood, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"ouC" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ouL" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Forensics Maintenance"; + req_access_txt = "4" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"ouT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"ova" = ( +/obj/machinery/computer/security{ + dir = 4 + }, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"ovf" = ( +/obj/machinery/door/airlock/virology{ + name = "Virology"; + req_one_access_txt = "5;39" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ovn" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/directional/west{ + c_tag = "Starboard Primary Hallway - Atmospherics" + }, +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"ovq" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"ovM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ovO" = ( +/obj/structure/sink{ + pixel_y = 14 + }, +/obj/structure/mirror/directional/north{ + pixel_y = 34 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"ovU" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"ovV" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat" + }, +/obj/item/clothing/head/hardhat/orange{ + name = "protective hat" + }, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"ovX" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"owc" = ( +/obj/structure/chair/office, +/obj/machinery/requests_console/directional/north{ + name = "Security Requests Console"; + department = "Security"; + departmentType = 3 + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"owe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"owi" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"own" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/office, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"owx" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = "10;9" + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"owA" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"owB" = ( +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"owG" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"owR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oxe" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"oxv" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"oxT" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"oya" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"oyj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"oyH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/closet/crate, +/obj/effect/spawner/random/contraband/prison{ + pixel_x = -6 + }, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"oyN" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/suit_storage_unit/engine/mod, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"oyP" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/holopad/secure, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"oyS" = ( +/turf/open/floor/iron, +/area/station/commons/dorms) +"oyT" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/primary/central/fore) +"oyU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ozf" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"ozu" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/psychology{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/green/line, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"ozv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"oAa" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"oAy" = ( +/obj/structure/table, +/obj/item/analyzer, +/obj/item/healthanalyzer, +/obj/machinery/camera/autoname/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"oAA" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"oAB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"oAE" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + name = "Cell 2"; + dir = 8; + id = "Cell 2" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"oAG" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"oAS" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"oAT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/drinkingglasses, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/effect/spawner/random/food_or_drink/cups, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"oBm" = ( +/obj/machinery/telephone{ + name = "dusty telephone"; + desc = "It's a dusty, old NTPO 667 phone. Judging by its frayed appearance, you think it'll be a miracle if it even works at all."; + friendly_name = "Unknown"; + show_netids = 1 + }, +/obj/machinery/power/data_terminal, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"oBn" = ( +/obj/effect/abstract/smell_holder/detective_office, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/nuke_storage) +"oBt" = ( +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"oBS" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"oBT" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"oBZ" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"oCA" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"oCO" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/kitchen/coldroom) +"oCQ" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"oCW" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"oDc" = ( +/obj/structure/showcase/cyborg/old{ + dir = 8; + pixel_x = 9; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"oDe" = ( +/obj/structure/lattice/catwalk, +/obj/structure/transit_tube/crossing/horizontal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"oDj" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"oDr" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"oDw" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"oDx" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight/lamp, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"oDO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"oDQ" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = -4; + pixel_y = 7 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/bar) +"oDU" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/security/armory/upper) +"oDZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"oEb" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"oEg" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"oEh" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"oEq" = ( +/turf/open/floor/iron, +/area/station/security/prison/workout) +"oEu" = ( +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"oEz" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oED" = ( +/obj/machinery/meter, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"oEI" = ( +/turf/open/floor/iron, +/area/station/command/teleporter) +"oEK" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port) +"oEW" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"oEY" = ( +/obj/structure/plasticflaps/opaque{ + name = "Science Deliveries" + }, +/obj/structure/sign/departments/science{ + pixel_y = -32; + color = "#D381C9" + }, +/obj/structure/barricade/wooden, +/obj/structure/window/spawner/north, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"oFa" = ( +/obj/structure/table/glass, +/obj/machinery/light/cold/directional/east, +/obj/machinery/camera{ + dir = 6; + network = list("ss13","medbay"); + c_tag = "Medbay Surgical Suite B" + }, +/obj/item/fixovein, +/obj/item/bonesetter, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"oFc" = ( +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"oFp" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/field/generator, +/turf/open/floor/plating, +/area/station/engineering/main) +"oFy" = ( +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/atmos) +"oFC" = ( +/obj/machinery/status_display/ai/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"oFG" = ( +/obj/machinery/light/cold/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oFP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oGg" = ( +/obj/structure/tank_holder/anesthetic, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"oGH" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;29" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"oGM" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/storage/box/lights/mixed, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"oHd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"oHe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/cargo/miningoffice) +"oHg" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"oHi" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"oHm" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"oHs" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"oHE" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Council Blast Doors"; + id = "council blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"oHI" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/starboard) +"oHT" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + name = "Station Intercom (Court)"; + dir = 8; + listening = 0; + broadcasting = 1 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"oHZ" = ( +/obj/machinery/light/cold/directional/east, +/obj/structure/table/glass, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/telephone/service{ + friendly_name = "Chemistry"; + placard_name = "Medical PBX" + }, +/obj/machinery/power/data_terminal, +/obj/structure/cable/blue{ + icon_state = "8" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"oIb" = ( +/obj/structure/table/wood, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/obj/item/poster/random_official, +/obj/machinery/button/door/directional/east{ + name = "corporate showroom shutters control"; + id = "corporate_privacy"; + req_access_txt = "19" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"oId" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/space, +/area/space/nearstation) +"oIo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"oIp" = ( +/turf/open/floor/iron/stairs/medium{ + dir = 8 + }, +/area/station/engineering/atmospherics_engine) +"oIr" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"oIL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"oJk" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/plating, +/area/station/engineering/main) +"oJG" = ( +/obj/machinery/airalarm/server{ + dir = 8; + pixel_x = -22 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + network = list("ss13","tcomms"); + c_tag = "Telecomms - Server Room - Aft-Port" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"oJJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"oJU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "3" + }, +/obj/structure/cable/red{ + icon_state = "10" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"oKl" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"oKq" = ( +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"oKA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"oKC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock{ + name = "Bar Storage"; + req_access_txt = "25" + }, +/obj/machinery/door/firedoor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/service) +"oKF" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"oKH" = ( +/turf/open/floor/iron/stairs/medium{ + dir = 1 + }, +/area/station/engineering/atmos) +"oLe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"oLr" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/window{ + icon_state = "right"; + dir = 4; + layer = 3; + base_state = "right" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"oLt" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table/glass, +/obj/item/scalpel, +/obj/item/circular_saw{ + pixel_y = 12 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/medical/morgue) +"oLE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Command Hallway" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oLO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"oMe" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/plating, +/area/station/cargo/qm) +"oMw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"oMN" = ( +/turf/open/floor/wood, +/area/station/service/library) +"oMQ" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"oMS" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "HoP Queue Shutters"; + id = "hopqueue" + }, +/obj/effect/turf_decal/loading_area, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oMT" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"oMU" = ( +/obj/effect/turf_decal/bot_white, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) +"oNl" = ( +/obj/structure/closet/secure_closet/chemical, +/obj/item/storage/box/beakers, +/obj/item/reagent_containers/spray/cleaner, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"oNw" = ( +/obj/structure/table, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/telephone/service{ + friendly_name = "Nurse's Station"; + placard_name = "Medical PBX" + }, +/obj/machinery/power/data_terminal, +/obj/structure/cable/blue{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"oNH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/directional/north, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/wood, +/area/station/commons/lounge) +"oNK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oNM" = ( +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"oNO" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"oOc" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"oOl" = ( +/obj/machinery/flasher/directional/north{ + id = "AI" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"oOn" = ( +/obj/machinery/light/cold/directional/east, +/obj/structure/window/reinforced/spawner/north, +/obj/structure/rack, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 4 + }, +/obj/item/storage/pill_bottle/ryetalyn, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oOz" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oOM" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"oOQ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"oOY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_one_access_txt = "1;4" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"oPb" = ( +/obj/machinery/door/firedoor/border_only/closed{ + name = "Animal Pen A"; + dir = 8 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"oPe" = ( +/obj/machinery/door/airlock/medical{ + name = "Chemical Storage"; + stripe_paint = "#ff9900"; + req_access_txt = "69" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Chemical Storage"; + stripe_paint = "#ff9900"; + req_access_txt = "69" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oPj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oPk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"oPL" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/port) +"oPQ" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oPS" = ( +/obj/structure/rack, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/bar/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oPT" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"oPW" = ( +/obj/machinery/door/airlock/freezer{ + name = "Cold Storage"; + req_access_txt = "45" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/surgery/starboard) +"oQh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"oQj" = ( +/obj/machinery/door/airlock/security{ + name = "Customs Desk"; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"oQr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"oQw" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Distro Staging to Distro"; + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"oQH" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"oQY" = ( +/obj/structure/kitchenspike, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"oRh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 10 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"oRi" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"oRB" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"oRQ" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"oRR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oSi" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"oSm" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"oSx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Bar" + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/commons/lounge) +"oSZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/noticeboard/directional/north, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oTe" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"oTz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/vehicle/ridden/trolley, +/turf/open/floor/iron, +/area/station/cargo/storage) +"oTE" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"oUc" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/courtroom) +"oUA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/suit_storage_unit/atmos, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"oUK" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"oUT" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oUW" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/newscaster/directional/north, +/obj/structure/dresser, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"oVe" = ( +/obj/docking_port/stationary{ + name = "emergency evac bay"; + dir = 2; + width = 29; + height = 25; + id = "emergency_home"; + dwidth = 9 + }, +/turf/open/space/basic, +/area/space) +"oVF" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"oVY" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"oWb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"oWe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"oWn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"oWB" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"oWC" = ( +/obj/effect/landmark/start/cargo_technician, +/turf/open/floor/iron, +/area/station/cargo/storage) +"oWF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"oWO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"oWP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/fluff/broken_flooring, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oXa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"oXh" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oXm" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"oXu" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"oXF" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"oXQ" = ( +/obj/machinery/door/airlock/grunge{ + name = "Vacant Office" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/vacant_room/office) +"oXW" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/light_switch/directional{ + pixel_x = -24; + pixel_y = -24 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"oXX" = ( +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 1 + }, +/obj/machinery/door/window/brigdoor/right/directional/north{ + name = "Storage Cage" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oYj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"oYk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"oYy" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/hud/health{ + pixel_y = -4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"oYz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/caution, +/obj/effect/turf_decal/ported/border/borderfloor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/monitoring) +"oYR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"oZa" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/light/cold/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oZv" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"oZA" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"oZB" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"oZK" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/brown, +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 8 + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Patient Rooms"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"oZO" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Quartermaster"; + req_access_txt = "41" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/qm) +"pah" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"pam" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"pan" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"pat" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"paw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pax" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/mining{ + name = "Drone Bay"; + req_access_txt = "31" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"pay" = ( +/obj/machinery/navbeacon{ + location = "0-SecurityDesk"; + codes_txt = "patrol;next_patrol=1-BrigCells" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"paI" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/librarian, +/turf/open/floor/wood, +/area/station/service/library) +"pbr" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"pbE" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/station/security/brig) +"pca" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"pck" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"pcq" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"pcr" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"pcu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"pcU" = ( +/obj/structure/table, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 1 + }, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/folder/yellow{ + pixel_x = 3; + pixel_y = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"pdg" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"pdh" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"pdq" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"pdw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"pdK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"pew" = ( +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"peE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"peL" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/central) +"peS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"peZ" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"pfd" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/nitrogen_input{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"pfg" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/solars/port/fore) +"pfk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"pfr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"pfv" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/newscaster/directional/west, +/obj/item/pen/invisible, +/turf/open/floor/engine/cult, +/area/station/service/library) +"pfy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/corner, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"pfB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Quiet Room" + }, +/turf/open/floor/wood, +/area/station/service/library) +"pgc" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;17;18;5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"pgn" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"pgq" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"pgx" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Pharmacy" + }, +/obj/structure/noticeboard/directional/north, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pgy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"pgM" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/teleporter) +"phm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"phr" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Fore Starboard" + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"phB" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"phF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"phI" = ( +/obj/structure/table, +/obj/item/paper_bin/bundlenatural{ + pixel_x = -19; + pixel_y = 5 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_x = -7; + pixel_y = 5 + }, +/obj/item/paper_bin/bundlenatural{ + pixel_x = -19; + pixel_y = 9 + }, +/obj/item/paperplane{ + pixel_x = 9 + }, +/obj/item/paperplane{ + pixel_x = 7; + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/cargo, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"phL" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"phQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"phZ" = ( +/obj/structure/easel, +/obj/machinery/light/small/maintenance/directional/west, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"pia" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/computer/med_data/laptop, +/turf/open/floor/iron, +/area/station/security/medical) +"pig" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/medical/cryo) +"pik" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"pix" = ( +/turf/open/floor/plating, +/area/station/engineering/main) +"piD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/rack, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/medical) +"piE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"piU" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "17" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"piV" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"pjh" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageSort2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/west{ + name = "Crate Security Door"; + dir = 4; + req_access_txt = "50" + }, +/turf/open/floor/plating, +/area/station/cargo/sorting) +"pjx" = ( +/obj/structure/sink/kitchen{ + name = "old sink"; + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + pixel_y = 28 + }, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"pjD" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Central Primary Hallway - Fore - AI Upload" + }, +/obj/structure/sign/warning/securearea{ + name = "\improper HIGH-POWER TURRETS AHEAD"; + desc = "A warning sign which reads 'HIGH-POWER TURRETS AHEAD'."; + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"pjP" = ( +/obj/structure/table/optable, +/turf/open/floor/iron, +/area/station/medical/morgue) +"pjU" = ( +/obj/machinery/door/airlock/freezer{ + name = "Cold Storage"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"pjX" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light/cold/directional/south, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"pkb" = ( +/obj/machinery/newscaster/directional/west, +/obj/item/reagent_containers/food/drinks/bottle/whiskey, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/structure/filingcabinet/chestdrawer/wheeled, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"pkk" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"pko" = ( +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"pkB" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms) +"pkO" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"plg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"plp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"plr" = ( +/obj/machinery/disposal/bin{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"plx" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"plC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"plP" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"plT" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"plZ" = ( +/obj/machinery/holopad/secure{ + pixel_x = 9; + pixel_y = -9 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"pmk" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"pmB" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/item/paper, +/obj/machinery/door/window/left/directional/east{ + name = "Hydroponics Window"; + dir = 2; + req_one_access_txt = "30;35" + }, +/obj/effect/turf_decal/delivery, +/obj/item/pen, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Service Shutter"; + id = "hydro_service" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"pmF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/machinery/light_switch/directional/west{ + pixel_y = -8 + }, +/obj/machinery/button/door/directional/west{ + name = "Warehouse Door Control"; + id = "qm_warehouse"; + req_access_txt = "31" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"pmN" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"pmR" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"pmV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"pnl" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Port Fore" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"pnP" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pnQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 4 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"pnS" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_sleeper_left" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pnT" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"pnY" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/holosign_creator/robot_seat/bar, +/turf/open/floor/iron, +/area/station/service/bar) +"pob" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"por" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/rack, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/o2, +/obj/effect/turf_decal/tile/bar/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"poD" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"poJ" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/machinery/light/warm/directional/south, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"poO" = ( +/obj/structure/chair/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"ppp" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"ppz" = ( +/obj/structure/sign/warning/radiation/rad_area{ + dir = 1; + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ppK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"pqA" = ( +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"prp" = ( +/obj/machinery/door/airlock/freezer{ + name = "Cold Storage"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"prr" = ( +/turf/open/floor/iron, +/area/station/security/lockers) +"prw" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Gamer Lair"; + req_one_access_txt = "12;27" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"prB" = ( +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/structure/window/reinforced, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"prD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"prG" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Maintenance"; + req_one_access_txt = "12;22" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/service/chapel) +"prK" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"prL" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Aft Starboard Solar Maintenance" + }, +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/chair/stool/directional/south, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"prP" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"psh" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"psj" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/lawoffice) +"psq" = ( +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/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 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"psu" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"psX" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"pte" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"ptp" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"pts" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/table/wood, +/obj/machinery/microwave{ + pixel_x = -1; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"ptB" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/caution, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"ptK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"ptZ" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"puc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) +"puf" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 10 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"puj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pup" = ( +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"puE" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"puI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"puO" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/plasticflaps/opaque, +/turf/open/floor/plating, +/area/station/cargo/qm) +"puX" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/patients_rooms/room_b) +"puY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"pvb" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -8 + }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/glass/bottle/alkysine, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/south, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pvk" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"pvn" = ( +/obj/effect/decal/cleanable/dirt, +/obj/vehicle/sealed/mecha/working/ripley/cargo, +/turf/open/floor/plating, +/area/station/cargo/warehouse) +"pvp" = ( +/obj/structure/table, +/obj/item/stock_parts/cell/high{ + pixel_y = -4 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"pvt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"pvR" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"pvU" = ( +/obj/machinery/atmospherics/components/trinary/filter, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"pwa" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"pwF" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Unfiltered & Air to Mix" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"pwN" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"pxh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"pxl" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/engineering) +"pxQ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/supply) +"pxS" = ( +/obj/effect/spawner/random/structure/closet_maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"pyd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Council Blast Doors"; + id = "council blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"pyj" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Engineering - Transit Tube Access" + }, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"pyK" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/tank, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"pyN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"pyP" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"pyS" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"pyT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"pzh" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"pzn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/carpet, +/area/station/service/library) +"pzw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"pzG" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/service/library) +"pzK" = ( +/obj/machinery/bodyscanner_console{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pAf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"pAn" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/command) +"pAs" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "33" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"pAv" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pAO" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"pBq" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"pBD" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"pBM" = ( +/obj/machinery/door/airlock{ + name = "Cabin 1"; + id_tag = "Cabin7" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"pBP" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"pBU" = ( +/obj/effect/spawner/random/engineering/vending_restock, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"pBW" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/commons/lounge) +"pCg" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pCh" = ( +/obj/structure/plasticflaps/opaque{ + name = "Service Deliveries" + }, +/obj/machinery/navbeacon{ + dir = 4; + freq = 1400; + location = "Service"; + codes_txt = "delivery;dir=4" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"pCk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "med_break_privacy" + }, +/turf/open/floor/plating, +/area/station/medical/break_room) +"pCH" = ( +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"pCK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"pCM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/engineering, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"pCT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pDd" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"pDh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Starboard Patient Rooms" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"pDu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"pDz" = ( +/obj/structure/table, +/obj/item/stack/cable_coil, +/obj/machinery/firealarm/directional/west, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"pDX" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"pEk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/hallway/primary/fore) +"pEz" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"pFr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door_buttons/airlock_controller{ + name = "Virology Access Console"; + pixel_x = 24; + pixel_y = -24; + idSelf = "virology_airlock_control"; + idInterior = "virology_airlock_interior"; + idExterior = "virology_airlock_exterior"; + req_access_txt = "39" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"pFA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"pFE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"pFI" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"pFM" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"pFR" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"pGh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pGo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"pGz" = ( +/obj/machinery/chem_dispenser/drinks{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/bar) +"pGU" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"pGW" = ( +/obj/structure/sign/directions/command{ + dir = 4; + pixel_y = -8 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"pHb" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) +"pHq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"pHF" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"pHK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"pHL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"pHM" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"pHU" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/commons/dorms) +"pHZ" = ( +/obj/machinery/door/airlock{ + name = "Cabin 6"; + id_tag = "Cabin3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"pIj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/cigbutt/roach, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"pIE" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"pII" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"pIO" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/processor{ + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pIS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"pIV" = ( +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"pIX" = ( +/obj/machinery/door/airlock{ + name = "Cabin 3"; + id_tag = "Cabin5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"pJc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"pJq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) +"pJs" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) +"pJu" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/service/library) +"pJv" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/wood, +/area/station/service/library) +"pJy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"pJF" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/sorting) +"pJG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/mud, +/area/station/security/pig) +"pJS" = ( +/obj/machinery/vending/dinnerware, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"pJU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Captain's Quarters"; + req_access_txt = "20" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/captain/private) +"pKd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/prison/rec) +"pKk" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"pKu" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"pKA" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pKM" = ( +/obj/machinery/door/airlock{ + name = "Unisex Showers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"pKU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pLf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"pLy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"pLO" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"pLZ" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"pMe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"pMl" = ( +/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/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pMm" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard{ + pixel_x = 4; + pixel_y = -4 + }, +/obj/item/folder/yellow{ + pixel_x = 4 + }, +/obj/machinery/requests_console/directional/west{ + name = "Engineering Requests Console"; + department = "Engineering"; + departmentType = 3 + }, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"pMA" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"pME" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -1; + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"pMF" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"pMT" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"pMX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"pNd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"pNg" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"pNm" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"pNs" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/ten, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = -4 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"pNC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) +"pNV" = ( +/obj/structure/chair/sofa/left{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"pOd" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/landmark/pestspawn, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"pOz" = ( +/obj/machinery/vending/wardrobe/chap_wardrobe, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"pOD" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"pOK" = ( +/obj/machinery/door/window/left/directional/north{ + name = "Jetpack Storage"; + dir = 8; + pixel_x = -1; + req_access_txt = "18" + }, +/obj/structure/window/reinforced, +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"pOQ" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) +"pOR" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/cigar, +/turf/open/floor/wood, +/area/station/commons/lounge) +"pOZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) +"pPb" = ( +/mob/living/simple_animal/chicken{ + name = "Featherbottom"; + real_name = "Featherbottom" + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"pPK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + location = "10.2-Aft-Port-Corner"; + codes_txt = "patrol;next_patrol=11-Command-Port" + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"pQe" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"pQq" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Crew Quarters Access" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"pQD" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"pQG" = ( +/obj/machinery/porta_turret/ai{ + dir = 4 + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"pQH" = ( +/obj/machinery/vending/assist, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"pQO" = ( +/obj/effect/turf_decal/bot/right, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"pQS" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"pQT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"pQU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"pRa" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"pRe" = ( +/obj/machinery/door/airlock{ + name = "Custodial Closet"; + req_access_txt = "26"; + stripe_paint = "#A1149A" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/janitor) +"pRf" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/structure/sign/departments/restroom{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"pRg" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"pRm" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/button/door/directional/south{ + name = "Door Bolt Control"; + pixel_x = -8; + id = "MedPatientB"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters"; + pixel_x = 8; + id = "MedPatientB_Privacy" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"pRo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 8 + }, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"pRq" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"pRs" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/machinery/door/window{ + name = "MiniSat Walkway Access"; + icon_state = "right"; + base_state = "right" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"pRU" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"pRW" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/locker) +"pRX" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/carbon_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/dark/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"pSd" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"pSk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"pSs" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"pSx" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/fore) +"pSV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"pSW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Gateway Atrium"; + req_access_txt = "62" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"pTc" = ( +/obj/effect/turf_decal/box/red/corners, +/obj/effect/turf_decal/box/red/corners{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pTj" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"pTs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"pTM" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"pUb" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"pUh" = ( +/obj/structure/dresser, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"pUq" = ( +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"pUw" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"pUP" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "9" + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pVa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"pVc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"pVg" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"pVk" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"pVl" = ( +/obj/structure/table/glass, +/obj/item/tank/internals/emergency_oxygen{ + pixel_x = -8 + }, +/obj/item/clothing/mask/breath{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"pVr" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"pVw" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"pVz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"pVV" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"pWb" = ( +/obj/structure/closet/toolcloset, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/turf/open/floor/iron, +/area/station/engineering/main) +"pWc" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"pWd" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/camera, +/obj/item/camera_film, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"pWh" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/spawner/random/contraband/prison, +/obj/structure/closet/crate/bin, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","prison","isolation") + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"pWo" = ( +/obj/structure/sink/kitchen{ + dir = 8; + pixel_x = 14 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"pWu" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"pWG" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"pWP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"pWV" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"pXp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"pXt" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"pXA" = ( +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"pXM" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/poddoor{ + name = "Supply Dock Loading Door"; + dir = 4; + id = "QMLoaddoor2" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"pXN" = ( +/obj/structure/chair/office, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/library) +"pXR" = ( +/obj/structure/table/glass, +/obj/machinery/newscaster/directional/west, +/obj/item/storage/box/beakers, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"pXW" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"pXX" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"pYd" = ( +/obj/structure/chair{ + name = "Defense"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) +"pYe" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/start/depsec/engineering, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"pYy" = ( +/obj/structure/sink/kitchen{ + name = "old sink"; + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 4; + pixel_x = -12 + }, +/obj/structure/mirror/directional/west, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"pYB" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/item/kirbyplants, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"pYD" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/tank_holder/anesthetic, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pYG" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pYY" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"pYZ" = ( +/obj/effect/decal/cleanable/generic, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"pZb" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"pZj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"pZq" = ( +/obj/item/storage/secure/safe/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) +"pZT" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"pZW" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"pZY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"qaf" = ( +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qah" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qak" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/service/bar) +"qam" = ( +/mob/living/simple_animal/bot/secbot/beepsky/armsky, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/bot_red, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"qaw" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"qaQ" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/customs) +"qaU" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qba" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"qbl" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"qbE" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"qbF" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"qbG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/security/checkpoint/customs) +"qbI" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"qbL" = ( +/obj/structure/chair/pew/right, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"qbO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qbS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qcb" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"qcc" = ( +/obj/structure/bed/dogbed, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"qcf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"qcj" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qcp" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/cargo/request{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"qcu" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/locker) +"qcw" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qcy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"qcG" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"qcP" = ( +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"qdg" = ( +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"qdB" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"qdH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"qdT" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qdX" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"qek" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/curved{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"qev" = ( +/obj/machinery/camera/motion/directional/east{ + network = list("minisat"); + c_tag = "MiniSat Maintenance" + }, +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/multitool, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"qeC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"qfd" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"qfp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"qfx" = ( +/obj/structure/closet/secure_closet/freezer/meat, +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/camera/autoname/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"qfR" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/iron, +/area/station/commons/locker) +"qgf" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external{ + name = "MiniSat Space Access Airlock"; + req_access_txt = "32" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"qgi" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"qgj" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Gravity Generator Room"; + req_access_txt = "19;23" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"qgn" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"qgA" = ( +/obj/machinery/power/emitter, +/turf/open/floor/plating, +/area/station/engineering/main) +"qgH" = ( +/obj/structure/chair/comfy/beige, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/station/command/bridge) +"qgI" = ( +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"qgX" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qgY" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"qhh" = ( +/obj/machinery/navbeacon{ + location = "9.1-Escape-1"; + codes_txt = "patrol;next_patrol=9.2-Escape-2" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"qhp" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/curved/flipped, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space, +/area/space/nearstation) +"qhF" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qhL" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"qhO" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/warden) +"qie" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qif" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"qil" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qim" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"qiK" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"qiQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qiT" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"qiU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Emergency Medbay Access"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qiV" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qjq" = ( +/obj/structure/table/wood, +/obj/structure/sign/picture_frame/showroom/three{ + pixel_x = -8; + pixel_y = 32 + }, +/obj/structure/sign/picture_frame/showroom/four{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/item/paicard{ + name = "\improper Nanotrasen-brand personal AI device exhibit"; + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape." + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"qjr" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"qjx" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"qjC" = ( +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Space Access Airlock"; + req_one_access_txt = "32;19" + }, +/turf/open/floor/plating, +/area/station/ai_monitored/aisat/exterior) +"qjJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"qjN" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"qjS" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/button/door/directional/south{ + name = "Door Bolt Control"; + pixel_x = -8; + id = "MedPatientA"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters"; + pixel_x = 8; + id = "MedPatientA_Privacy" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"qkk" = ( +/obj/item/clothing/head/cone, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qkm" = ( +/obj/structure/closet/emcloset, +/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/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"qko" = ( +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"qkG" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"qkM" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qlk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"qll" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2o{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qlt" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"qlB" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/wood, +/area/station/service/library) +"qlC" = ( +/obj/machinery/computer/station_alert, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qlV" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/space, +/area/space/nearstation) +"qlY" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qmo" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qmy" = ( +/obj/structure/window/reinforced, +/obj/machinery/light/small/directional/south, +/obj/machinery/camera/directional/south{ + network = list("minisat"); + c_tag = "MiniSat Exterior Access" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"qmL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"qmR" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"qne" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/computer/atmos_control/nocontrol/incinerator{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"qnk" = ( +/obj/structure/table, +/obj/machinery/door/window/brigdoor/left/directional/north{ + name = "desk shutter"; + req_access_txt = "5" + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"qnO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qnZ" = ( +/obj/structure/closet/secure_closet/hop, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"qoo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"qot" = ( +/obj/structure/transit_tube/curved/flipped{ + dir = 8 + }, +/turf/open/space, +/area/space/nearstation) +"qoI" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"qoJ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"qpk" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"qpo" = ( +/obj/structure/sink/kitchen{ + name = "old sink"; + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + pixel_y = 28 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"qpE" = ( +/obj/machinery/modular_computer/console/preset/id, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/requests_console/directional/north{ + name = "Chief Engineer's Requests Console"; + department = "Chief Engineer's Desk"; + departmentType = 4; + announcementConsole = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"qpF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"qpO" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"qpR" = ( +/obj/machinery/camera/emp_proof/directional/east{ + network = list("ss13","engine"); + c_tag = "Engine Core" + }, +/obj/structure/cable/red{ + icon_state = "66" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"qpS" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qqa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/service/janitor) +"qqe" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"qqk" = ( +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"qqm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"qqx" = ( +/obj/machinery/camera/directional/east{ + network = list("interrogation"); + c_tag = "Interrogation room" + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"qqz" = ( +/obj/structure/bookcase/random/nonfiction, +/turf/open/floor/wood, +/area/station/service/library) +"qqA" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qqO" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"qqR" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"qqY" = ( +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"qrg" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"qri" = ( +/obj/item/cultivator, +/obj/item/crowbar, +/obj/item/plant_analyzer, +/obj/item/reagent_containers/glass/bucket, +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"qrm" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/space, +/area/space/nearstation) +"qrH" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"qrW" = ( +/obj/machinery/computer/security/hos{ + dir = 1 + }, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"qsa" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qsl" = ( +/obj/structure/table, +/obj/item/storage/toolbox/electrical, +/obj/item/storage/toolbox/electrical{ + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"qsr" = ( +/obj/machinery/door/airlock/command{ + name = "Medical Director's Office"; + stripe_paint = "#9cc7de"; + req_one_access_txt = "40" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qss" = ( +/obj/structure/noticeboard/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"qsE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qsG" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"qsP" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qsV" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/engine_smes) +"qsW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Crew Quarters Access" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"qti" = ( +/obj/item/storage/box/lights/mixed, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/central) +"qtl" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qtz" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"qtK" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qtT" = ( +/obj/structure/railing, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"qtV" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/folder/red, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"qua" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"quc" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space/basic, +/area/space/nearstation) +"quk" = ( +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qum" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/camera/directional/west{ + c_tag = "Captain's Office - Emergency Escape" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"quZ" = ( +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/station/engineering/main) +"qvb" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch/directional/south, +/obj/structure/rack, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/nitrogen/full, +/obj/item/tank/internals/nitrogen/full, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath/vox, +/turf/open/floor/iron, +/area/station/engineering/main) +"qvf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qvg" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qvk" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/vending/cola/red, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"qvm" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"qvC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qvN" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/button/door/directional/east{ + name = "Teleporter Shutter Control"; + pixel_y = 5; + id = "teleshutter"; + req_access_txt = "17" + }, +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/machinery/camera/motion/directional/east{ + c_tag = "Teleporter" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"qws" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"qwE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qwF" = ( +/obj/structure/closet/crate/wooden/toy, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) +"qwG" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qwS" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/library) +"qxb" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/machinery/firealarm/directional/south, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"qxd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"qxl" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/prison/rec) +"qxA" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"qxC" = ( +/obj/machinery/vending/cigarette, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"qxY" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"qxZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/theater) +"qyc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"qyt" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"qyx" = ( +/obj/machinery/smartfridge, +/turf/open/floor/plating, +/area/station/hallway/secondary/service) +"qyH" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qyJ" = ( +/obj/structure/table, +/obj/item/stack/sheet/plasteel/fifty, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"qyP" = ( +/obj/structure/mirror/directional/west, +/obj/item/lipstick/black, +/obj/item/lipstick/jade{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/purple{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qyV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "6" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qzj" = ( +/obj/effect/spawner/random/structure/closet_private, +/obj/item/clothing/under/misc/assistantformal, +/turf/open/floor/wood, +/area/station/commons/dorms) +"qzv" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/soap{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"qzL" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qAa" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"qAd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qAi" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Engineering Foyer"; + req_one_access_txt = "32;19" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"qAm" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"qAp" = ( +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/medical{ + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/central) +"qAq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"qAu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"qAC" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/library) +"qAU" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"qBw" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"qBB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"qBM" = ( +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"qCf" = ( +/turf/open/floor/iron, +/area/station/commons/locker) +"qCP" = ( +/obj/structure/table, +/obj/item/poster/random_official{ + pixel_y = 3 + }, +/obj/item/poster/random_official{ + pixel_y = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"qCV" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qCW" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"qDr" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/modular_computer/console/preset/command, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qDw" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"qDC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"qDH" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"qDJ" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qDT" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"qEc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"qEg" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"qEh" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"qEv" = ( +/obj/structure/urinal/directional/east, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"qER" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"qES" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qFa" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"qFb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/mining{ + name = "Deliveries"; + req_one_access_txt = "50" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"qFd" = ( +/obj/machinery/door/airlock{ + name = "Service Hall"; + req_one_access_txt = "73" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"qFA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"qFD" = ( +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"qFO" = ( +/obj/machinery/light_switch/directional/north, +/obj/structure/showcase/cyborg/old{ + pixel_y = 20 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"qFP" = ( +/obj/effect/turf_decal/trimline/green/corner, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qGa" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"qGg" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/button/door/directional/south{ + name = "Door Bolt Control"; + pixel_x = -8; + id = "Med_PatientWC"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/medical/medbay/aft) +"qGh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/service/janitor) +"qGj" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/gateway) +"qGm" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"qGo" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qGs" = ( +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qGu" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qGE" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"qGN" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/light/cold/directional/north, +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = 32 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"qHw" = ( +/obj/machinery/atmospherics/components/trinary/mixer/airmix{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"qHB" = ( +/obj/machinery/light/warm/directional/north, +/obj/effect/turf_decal/siding/wood/corner, +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/wood, +/area/station/medical/break_room) +"qHD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"qHM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qIi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qIo" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/colavend, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"qIv" = ( +/obj/structure/showcase/machinery/tv{ + dir = 1; + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"qIE" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"qIH" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"qIK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"qIM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"qJb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"qJh" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"qJx" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/effect/spawner/random/decoration/showcase, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"qJQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"qJR" = ( +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qKA" = ( +/obj/machinery/computer/crew{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"qKJ" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qKK" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/recharge_station, +/obj/effect/turf_decal/tile/neutral/half{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"qKL" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bed, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/west{ + name = "Cabin Bolt Control"; + id = "Cabin4"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"qKT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"qLD" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"qLK" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock"; + space_dir = 2 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"qLM" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qLV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"qLY" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Abandoned Warehouse"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qMJ" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Control Room"; + req_one_access_txt = "19; 61" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/tcommsat/computer) +"qMU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/biogenerator, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"qNi" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qNz" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"qND" = ( +/obj/structure/bodycontainer/morgue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"qNE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qNF" = ( +/obj/structure/table/wood, +/obj/item/paicard, +/turf/open/floor/wood, +/area/station/service/library) +"qNP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"qNT" = ( +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"qNY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qOd" = ( +/obj/machinery/power/solar_control{ + name = "Port Quarter Solar Control"; + dir = 4; + id = "aftport" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"qOC" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"qOF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"qOR" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"qPc" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"qPh" = ( +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"qPl" = ( +/obj/machinery/light/warm/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"qPn" = ( +/obj/structure/closet/secure_closet/security/engine, +/obj/machinery/airalarm/directional/east, +/obj/machinery/requests_console/directional/south{ + name = "Security Requests Console"; + department = "Security"; + departmentType = 5 + }, +/obj/machinery/firealarm/directional/south{ + pixel_x = 26 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"qPr" = ( +/obj/machinery/light/directional/north, +/obj/machinery/restaurant_portal/restaurant, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qPB" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"qPM" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"qQg" = ( +/obj/effect/turf_decal/siding/blue, +/obj/machinery/light/cold/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qQn" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"qQo" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"qQt" = ( +/obj/effect/turf_decal/bot/left, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"qQF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"qQH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"qQS" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qQV" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"qRn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/spawner/random/trash/caution_sign, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"qRx" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Gravity Generator Room" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"qRF" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"qRL" = ( +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"qRS" = ( +/obj/structure/table, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = -3 + }, +/obj/item/clothing/gloves/cargo_gauntlet, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"qSl" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/cargo/qm) +"qSm" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"qSp" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"qSz" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"qST" = ( +/obj/structure/closet/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"qSW" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/disposal) +"qTs" = ( +/obj/effect/turf_decal/tile/dark/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qTu" = ( +/obj/structure/rack, +/obj/item/radio, +/obj/item/crowbar, +/obj/machinery/camera/directional/east{ + c_tag = "Tool Storage" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"qUb" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"qUc" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/landmark/start/assistant, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"qUx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"qUy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"qUC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"qUL" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"qUM" = ( +/turf/open/floor/carpet/red, +/area/station/cargo/qm) +"qUR" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"qVr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/main) +"qVv" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qVx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"qVC" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"qVL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"qVN" = ( +/obj/machinery/door/airlock{ + name = "Unit 2"; + id_tag = "AuxToilet2" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"qWe" = ( +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark/corner{ + dir = 8 + }, +/area/station/security/prison/workout) +"qWi" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/light_switch/directional/south, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"qWn" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -10; + pixel_y = 4 + }, +/obj/item/paper_bin/carbon{ + pixel_x = -10; + pixel_y = 9 + }, +/obj/item/computer_hardware/hard_drive/role/quartermaster, +/obj/item/computer_hardware/hard_drive/role/quartermaster, +/obj/item/computer_hardware/hard_drive/role/quartermaster, +/turf/open/floor/wood, +/area/station/cargo/qm) +"qWC" = ( +/obj/item/cigbutt, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"qWO" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) +"qWR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qWS" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/table, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/engineering/main) +"qXc" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"qXf" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"qXj" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/office/hall) +"qXp" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"qXq" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"qXx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"qXR" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/service/bar) +"qYo" = ( +/obj/machinery/atmospherics/pipe/smart/simple/supply/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"qYs" = ( +/obj/structure/sign/barsign, +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/lounge) +"qYv" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"qYx" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/purple/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"qYR" = ( +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"qZc" = ( +/obj/structure/rack, +/obj/item/storage/box/shipping, +/obj/item/pushbroom, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"qZf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"qZi" = ( +/obj/structure/rack, +/obj/machinery/firealarm/directional/west, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/clothing/suit/hazardvest, +/obj/item/multitool, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"qZk" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"qZl" = ( +/obj/machinery/vending/mechcomp, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"qZx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Engineering - Desk" + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"qZy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"qZz" = ( +/obj/machinery/disposal/delivery_chute{ + name = "Service Deliveries"; + dir = 1 + }, +/obj/structure/plasticflaps/opaque{ + name = "Service Deliveries" + }, +/obj/structure/disposalpipe/trunk, +/obj/structure/sign/departments/botany{ + pixel_y = -32; + color = "#9FED58" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"qZK" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"qZQ" = ( +/obj/machinery/button/door/directional/west{ + name = "Privacy Shutters Control"; + id = "hop"; + req_access_txt = "57" + }, +/obj/effect/mapping_helpers/ianbirthday, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"rah" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"raj" = ( +/obj/structure/chair/stool, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"ras" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmospherics_engine) +"raL" = ( +/obj/structure/disposaloutlet{ + name = "Cargo Deliveries"; + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/siding/green{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"raZ" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/turf/open/floor/carpet, +/area/station/command/bridge) +"rbf" = ( +/obj/machinery/meter{ + name = "Mixed Air Tank Out" + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"rbg" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"rbl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"rbr" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"rbu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"rbS" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/engine{ + name = "Holodeck Projector Floor" + }, +/area/station/holodeck/rec_center) +"rcl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"rcq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/command/gateway) +"rcu" = ( +/obj/machinery/door/window/left/directional/west{ + name = "Bridge Deliveries"; + dir = 4; + req_access_txt = "19" + }, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/command/bridge) +"rcI" = ( +/obj/machinery/door/airlock/hatch{ + name = "Telecomms Server Room" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/tcommsat/server) +"rdl" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/telephone/service{ + friendly_name = "Pharmacy"; + placard_name = "Medical PBX" + }, +/obj/machinery/power/data_terminal, +/obj/machinery/newscaster/directional/south, +/obj/structure/cable/blue{ + icon_state = "8" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"rdC" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Patient Room B"; + id_tag = "MedPatientB"; + stripe_paint = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"reb" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"rei" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"reo" = ( +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 1; + pixel_y = 6 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"reF" = ( +/obj/effect/spawner/xmastree, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"reN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"reP" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"rfk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"rfs" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Cell 1 Locker"; + id = "Cell 1" + }, +/turf/open/floor/iron, +/area/station/security/brig) +"rfu" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"rfy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/bridge) +"rfA" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/plating, +/area/station/maintenance/port) +"rfH" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"rgc" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"rgt" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rgz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"rgU" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/cyan{ + icon_state = "32" + }, +/obj/structure/cable/cyan{ + icon_state = "40" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"rhq" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"rhw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"rhX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/green, +/area/station/maintenance/port/aft) +"ric" = ( +/obj/machinery/turretid{ + name = "AI Upload turret control"; + icon_state = "control_stun"; + pixel_y = 28; + control_area = "/area/station/ai_monitored/turret_protected/ai_upload" + }, +/obj/item/radio/intercom/directional/north{ + name = "Private Channel"; + pixel_x = -26; + frequency = 1447; + broadcasting = 1 + }, +/obj/effect/landmark/start/cyborg, +/obj/machinery/light/small/directional/west, +/obj/machinery/computer/security/telescreen{ + name = "AI Upload Monitor"; + desc = "Used for watching the AI Upload."; + dir = 4; + pixel_x = -29; + network = list("aiupload") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"rig" = ( +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"ris" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + dir = 4; + id = "MedPatientB_Privacy" + }, +/turf/open/floor/plating, +/area/station/medical/patients_rooms/room_b) +"riu" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"riw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"riP" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"riR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rja" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Crematorium Maintenance"; + req_one_access_txt = "27" + }, +/turf/open/floor/plating, +/area/station/service/chapel/office) +"rjc" = ( +/obj/structure/flora/ausbushes, +/turf/open/floor/mud, +/area/station/security/pig) +"rje" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + name = "HoP Queue Shutters"; + id = "hopqueue" + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"rkh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"rkr" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"rkA" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"rkZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"rld" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Kitchen"; + req_one_access_txt = "25;28" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/navigate_destination/kitchen, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen) +"rlf" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"rlr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"rlx" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"rlH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"rlM" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5; + pixel_x = -7; + pixel_y = 13 + }, +/obj/item/reagent_containers/food/condiment/flour{ + pixel_x = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rlQ" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"rlT" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/upper) +"rlW" = ( +/mob/living/simple_animal/mouse/brown/tom, +/obj/structure/chair/stool/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"rlY" = ( +/obj/structure/chair/office, +/obj/effect/landmark/start/quartermaster, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/cargo/qm) +"rmd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/library) +"rmt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"rmz" = ( +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light_switch/directional/west, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Port-Aft" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rmA" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"rmU" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"rmY" = ( +/obj/machinery/computer/security/mining{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"rnA" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/displaycase/trophy, +/turf/open/floor/wood, +/area/station/service/library) +"rnF" = ( +/obj/structure/table, +/obj/machinery/ecto_sniffer{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/assembly/flash{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/bodypart/arm/left/robot{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/bodypart/arm/right/robot{ + pixel_x = 8; + pixel_y = -2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"rnI" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"rnO" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/clothing/gloves/color/yellow, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"rnT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rnX" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"rnY" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"rod" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/structure/cable/orange{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"roh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"rot" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/components/trinary/filter/atmos/n2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"row" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Control Room"; + req_access_txt = "10" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"roF" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/chair/stool/directional/west, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"rpa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Medical Reception" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"rpn" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air to External Air Ports"; + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/no_nightlight/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rpq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rps" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"rpA" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"rpB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/xeno_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"rqf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rqv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"rqx" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"rqy" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"rqz" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"rqA" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"rqB" = ( +/obj/machinery/flasher/directional/north{ + id = "AI" + }, +/obj/structure/table/wood/fancy/blue, +/obj/effect/spawner/random/aimodule/neutral, +/obj/machinery/door/window{ + name = "Core Modules"; + icon_state = "right"; + dir = 4; + base_state = "right"; + req_access_txt = "20" + }, +/obj/structure/window/reinforced, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai_upload) +"rqG" = ( +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"rqM" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"rqW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"rqX" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"rrp" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"rrt" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"rru" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"rrx" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"rrD" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"rrQ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"rrR" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"rrU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rst" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/dorms) +"rsB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"rsW" = ( +/obj/structure/water_source/puddle, +/obj/structure/flora/junglebush/large{ + pixel_y = 0 + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"rsY" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"rti" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/security/courtroom) +"rtj" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"rto" = ( +/obj/item/stack/sheet/plasteel{ + pixel_x = -2; + pixel_y = 2; + amount = 10 + }, +/obj/structure/table, +/obj/item/stack/sheet/rglass{ + pixel_x = 2; + pixel_y = -2; + amount = 30 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"rtq" = ( +/obj/item/wrench, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rtx" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"rtB" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/fore) +"rtK" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"rtV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"rua" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"rub" = ( +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"rue" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"rup" = ( +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"ruB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"ruF" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 10 + }, +/obj/structure/rack, +/obj/item/storage/box{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ruS" = ( +/obj/structure/closet/crate/hydroponics, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ruY" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"rvt" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"rvu" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/machinery/door/window/right/directional/east{ + name = "shower"; + icon_state = "left"; + dir = 2; + base_state = "left" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/fitness/recreation) +"rvz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Atmospherics - Hypertorus Fusion Reactor Chamber Aft" + }, +/obj/structure/closet/radiation, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"rvB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atm, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"rvI" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"rvR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"rwN" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/service/library) +"rwU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/vitals_monitor, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"rxc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/janitor) +"rxh" = ( +/obj/item/toy/beach_ball/branded{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"rxx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"rxE" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/gateway) +"rxV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rxZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"rya" = ( +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"ryf" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/chapel, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"rys" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"ryQ" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/stairs{ + dir = 8 + }, +/area/station/security/deck) +"ryR" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rzm" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"rzv" = ( +/obj/structure/closet, +/obj/item/stack/sheet/iron{ + amount = 34 + }, +/obj/item/extinguisher/mini, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rzY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"rAu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"rAK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/medical) +"rAP" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Treatment B"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"rAR" = ( +/obj/structure/sign/poster/ripped{ + pixel_x = -31 + }, +/obj/machinery/rnd/production/fabricator/department/security, +/turf/open/floor/iron, +/area/station/security/office) +"rAV" = ( +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"rAY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"rBb" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/small/directional/west, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"rBd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"rBi" = ( +/obj/effect/turf_decal/bot_white, +/obj/item/robot_suit, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"rBj" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"rBl" = ( +/obj/structure/bed, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/bedsheet/dorms, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/button/door/directional/east{ + name = "Cabin Bolt Control"; + id = "Cabin3"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"rBt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/yellow/filled/warning{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"rBx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "Council Blast Doors"; + id = "council blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"rBF" = ( +/obj/structure/cable/red{ + icon_state = "1" + }, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"rCc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"rCg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron, +/area/station/medical/cryo) +"rCn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) +"rCr" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/nitrous_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rCD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"rCV" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"rDo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"rDN" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/pig) +"rDQ" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"rDW" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"rDY" = ( +/obj/machinery/door/airlock/security{ + name = "Control Room"; + req_access_txt = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/warden) +"rDZ" = ( +/mob/living/simple_animal/chicken{ + name = "Kentucky"; + real_name = "Kentucky" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"rEd" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"rEm" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"rEK" = ( +/obj/machinery/light/directional/north, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"rFm" = ( +/obj/machinery/telecomms/processor/preset_three, +/obj/machinery/camera/directional/north{ + network = list("ss13","tcomms"); + c_tag = "Telecomms - Server Room - Fore-Starboard" + }, +/turf/open/floor/circuit/green/telecomms/mainframe, +/area/station/tcommsat/server) +"rFn" = ( +/obj/structure/closet/secure_closet/brig{ + name = "Cell 2 Locker"; + id = "Cell 2" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) +"rFA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Office Maintenance"; + req_one_access_txt = "22" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/service/chapel/office) +"rFF" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/solars/port/aft) +"rFP" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/fore) +"rFS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"rGc" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"rGp" = ( +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"rGr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"rGy" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/south, +/obj/machinery/computer/monitor{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"rGz" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"rGM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_atmos{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"rGS" = ( +/obj/structure/holohoop, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"rGT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"rHl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/purple/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rHr" = ( +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/obj/structure/cable/yellow{ + icon_state = "130" + }, +/obj/structure/cable/yellow{ + icon_state = "96" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"rHD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"rHL" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"rHO" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"rHY" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rIb" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/station/commons/lounge) +"rIc" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/marsexec, +/turf/open/floor/plating, +/area/station/security/interrogation) +"rIu" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"rIA" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"rIJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/firealarm/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"rJd" = ( +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"rJe" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"rJk" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"rJr" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Storage" + }, +/obj/structure/rack, +/obj/item/roller, +/obj/item/roller{ + pixel_y = 6 + }, +/obj/item/roller{ + pixel_y = 12 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"rJC" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"rJT" = ( +/obj/effect/spawner/random/structure/closet_empty/crate/with_loot, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"rJU" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage/mech) +"rJV" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"rJX" = ( +/obj/effect/landmark/start/cook, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"rJY" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"rKl" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/ansible, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/crystal, +/obj/item/stock_parts/subspace/crystal, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"rKB" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/machinery/light/small/maintenance/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"rKF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"rKJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"rKQ" = ( +/obj/structure/table, +/obj/item/crowbar/red, +/obj/item/wrench, +/obj/item/clothing/mask/gas, +/obj/item/storage/box{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/box, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/requests_console/directional/west{ + name = "Atmospherics Requests Console"; + department = "Atmospherics"; + departmentType = 3 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"rKT" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"rKV" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"rLa" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"rLc" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/storage) +"rLh" = ( +/obj/machinery/door/poddoor{ + name = "Secure Storage"; + id = "Secure Storage" + }, +/turf/open/floor/plating, +/area/station/engineering/main) +"rLn" = ( +/obj/machinery/portable_atmospherics/canister/oxygen/cryo, +/obj/effect/turf_decal/box/red, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron, +/area/station/medical/cryo) +"rLq" = ( +/obj/structure/closet/secure_closet/security/cargo, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"rLv" = ( +/turf/open/floor/plating/foam{ + temperature = 2.7 + }, +/area/space/nearstation) +"rLz" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/filingcabinet{ + pixel_x = 4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"rLB" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/central) +"rLH" = ( +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/command/gateway) +"rLW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"rLZ" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/candle, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/radio/off{ + name = "old radio"; + desc = "An old handheld radio. You could use it, if you really wanted to."; + icon_state = "radio"; + pixel_y = 15 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"rMD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/brig) +"rME" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"rMH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel"; + req_access_txt = "57" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hop) +"rMY" = ( +/obj/machinery/door/airlock/medical{ + name = "Chemistry"; + stripe_paint = "#ff9900"; + req_access_txt = "33" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"rNc" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"rND" = ( +/obj/structure/chair/stool/directional/east, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"rNE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"rNK" = ( +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/rack, +/obj/item/storage/box/trackimp, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"rOb" = ( +/obj/structure/rack, +/obj/item/aicard, +/obj/item/radio/off, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -29 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rOj" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"rOL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"rOM" = ( +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rPb" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/photocopier, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"rPo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/teleporter) +"rPp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"rPG" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rPX" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"rQm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"rQr" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/wooden_tv{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"rQv" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/engineering/main) +"rQz" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/brig) +"rQB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"rQE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rRe" = ( +/obj/machinery/light/small/directional/south, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"rRg" = ( +/obj/machinery/door/airlock/atmos{ + name = "Hypertorus Fusion Reactor"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"rRh" = ( +/obj/structure/toilet{ + pixel_y = 13 + }, +/obj/machinery/light/directional/south, +/obj/effect/landmark/start/captain, +/obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) +"rRi" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/lockers) +"rRm" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "20" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rRp" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"rRw" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/spawner/random/food_or_drink/snack{ + pixel_x = 6; + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_x = -6; + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"rRF" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/commons/dorms) +"rRY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"rSf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"rSD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rSJ" = ( +/obj/structure/window/reinforced, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"rSR" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/light_switch/directional/north, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"rSZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/warning/radiation/rad_area{ + dir = 1; + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"rTm" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"rTp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"rTr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rTx" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rTy" = ( +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"rTG" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"rTQ" = ( +/obj/machinery/door/window{ + name = "Mass Driver"; + dir = 1; + req_access_txt = "12" + }, +/obj/machinery/door/window{ + name = "Mass Driver"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/computer/pod/old/mass_driver_controller/shack{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"rTR" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"rUb" = ( +/turf/closed/wall/prepainted/daedalus, +/area/space/nearstation) +"rUd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rUI" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/light/no_nightlight/directional/west, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"rUK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/lockers) +"rUO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"rUQ" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 16 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"rUU" = ( +/obj/structure/toilet/greyscale{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"rUW" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/telephone/medical, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"rVc" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/reagent_containers/glass/rag, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/bar) +"rVf" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"rVn" = ( +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"rVB" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"rWr" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"rWA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Starboard" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/machinery/button/door/directional/north{ + name = "Radiation Shutters Control"; + id = "atmoshfr"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"rWC" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"rWE" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Council Chamber" + }, +/obj/machinery/light/directional/north, +/obj/machinery/status_display/ai/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"rWO" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/port) +"rWW" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"rWX" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"rXj" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"rXn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/construction/storage_wing) +"rXr" = ( +/obj/structure/table/glass, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"rXz" = ( +/obj/machinery/nuclearbomb/beer{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/structure/table/wood, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"rXF" = ( +/obj/structure/table/glass, +/obj/machinery/light/small, +/obj/item/paper_bin, +/obj/item/folder/white, +/turf/open/floor/iron, +/area/station/medical/morgue) +"rXG" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/warden) +"rXU" = ( +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/command{ + dir = 8; + pixel_y = -8 + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/central) +"rYg" = ( +/obj/machinery/vending/boozeomat, +/obj/machinery/light/small/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"rYt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "24" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"rYu" = ( +/turf/open/floor/iron/dark/corner{ + dir = 1 + }, +/area/station/security/prison/workout) +"rYy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"rYA" = ( +/obj/machinery/porta_turret/ai, +/obj/machinery/flasher/directional/north{ + id = "AI" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"rYU" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"rYX" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/security/office) +"rZp" = ( +/obj/machinery/light/cold/directional/south, +/obj/structure/filingcabinet, +/obj/item/folder/white, +/obj/item/folder/yellow, +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"rZL" = ( +/obj/machinery/conveyor_switch/oneway{ + name = "Unloading Conveyor"; + pixel_x = -13; + pixel_y = -4; + id = "QMLoad2" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"rZS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"rZY" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"saq" = ( +/obj/machinery/light/directional/west, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"saO" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"sba" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/turf/open/floor/iron, +/area/station/medical/cryo) +"sbk" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"sbz" = ( +/obj/machinery/door/airlock/maintenance/external{ + req_access_txt = "12;13" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"sbG" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"sbI" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Lobby"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"sbJ" = ( +/obj/structure/bed, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"sbP" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"sbV" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/library) +"sbY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"sca" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"sce" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"scj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"scq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"scv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/space/basic, +/area/station/solars/starboard/fore) +"scC" = ( +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/closet/crate/hydroponics, +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/effect/spawner/random/food_or_drink/seed{ + spawn_all_loot = 1; + spawn_random_offset = 1 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"scT" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"scZ" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"sdh" = ( +/obj/machinery/turretid{ + name = "AI Chamber turret control"; + icon_state = "control_stun"; + pixel_x = 3; + pixel_y = -23 + }, +/obj/machinery/door/window{ + name = "Primary AI Core Access"; + icon_state = "leftsecure"; + dir = 8; + atom_integrity = 300; + base_state = "leftsecure"; + req_access_txt = "16" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"sdl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sds" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"sdv" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"sdQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"seg" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/vacant_room/office) +"seB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"seC" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced, +/obj/item/radio/intercom/directional/east, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/command, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"seG" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/delivery, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"seR" = ( +/obj/structure/table, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"sfa" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/aft) +"sfh" = ( +/obj/effect/turf_decal/loading_area{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"sfo" = ( +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = -32 + }, +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"sfr" = ( +/obj/machinery/door/poddoor/preopen{ + name = "Engineering Security Doors"; + id = "Engineering" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) +"sfI" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"sfN" = ( +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"sfT" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Central Primary Hallway - Port" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"sga" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"sgk" = ( +/obj/machinery/disposal/bin, +/obj/machinery/camera/directional/east{ + c_tag = "Garden" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"sgn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Head of Personnel"; + req_access_txt = "57" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"sgu" = ( +/obj/structure/cable/yellow{ + icon_state = "130" + }, +/obj/structure/disposalpipe/junction/yjunction, +/obj/structure/cable/yellow{ + icon_state = "132" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"sgO" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"shh" = ( +/obj/structure/closet, +/obj/item/clothing/mask/gas/plaguedoctor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"shG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"shN" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"sid" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters{ + name = "Privacy Shutter"; + id = "detprivate" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"siw" = ( +/obj/structure/sign/warning/securearea{ + name = "\improper STAY CLEAR HEAVY MACHINERY" + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/fore) +"siD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"siG" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"siJ" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/closet/wardrobe/miner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"sja" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"sjb" = ( +/obj/effect/turf_decal/siding/brown/corner{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sje" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/toilet/greyscale, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"sji" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"sjm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/east, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"sjD" = ( +/obj/machinery/door/airlock/security/glass{ + name = "General Armory"; + req_access_txt = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"sjF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"sjQ" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"sjZ" = ( +/obj/machinery/power/terminal{ + dir = 1 + }, +/obj/machinery/flasher/directional/north{ + pixel_x = -22; + id = "AI" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"ska" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"skt" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"skL" = ( +/obj/machinery/door/airlock/command{ + name = "Emergency Escape"; + req_access_txt = "20" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"sla" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "10" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"slg" = ( +/obj/item/target, +/obj/structure/training_machine, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"slk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/light_construct/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sls" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable/cyan{ + icon_state = "12" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"sly" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase{ + name = "\improper Nanotrasen-brand secure briefcase exhibit"; + desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"slT" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/window/right/directional/east{ + name = "Fitness Ring"; + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"slZ" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/engine/cult, +/area/station/service/library) +"smb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/engineering{ + name = "Engine Room"; + req_one_access_txt = "10;24" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"smg" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"smv" = ( +/obj/machinery/navbeacon{ + location = "14.2-Central-CrewQuarters"; + codes_txt = "patrol;next_patrol=14.3-Lockers-Dorms" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"smx" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Departures Hallway - Aside - Robotics & EVA" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"smJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"smY" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"snj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"snn" = ( +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"sol" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/riot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/riot{ + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/riot{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_y = -2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/requests_console/directional/north{ + name = "Security Requests Console"; + department = "Security"; + departmentType = 3 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"soF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"soX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/chair/stool/bar/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/lounge) +"soZ" = ( +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"spd" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/cable/yellow{ + icon_state = "144" + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"spo" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"spq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"spB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"spJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/space/basic, +/area/station/solars/port/aft) +"sqa" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"sqf" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/turret_protected/ai) +"sqj" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sql" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/primary/central/aft) +"sqo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/start/cargo_technician, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"sqs" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"sqy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"sqF" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sqV" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/station/service/library) +"srg" = ( +/obj/item/kirbyplants{ + icon_state = "plant-10" + }, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 1 + }, +/obj/structure/sign/exitonly{ + pixel_y = 32 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"srK" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"srP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 5 + }, +/obj/structure/cable/red{ + icon_state = "6" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"srZ" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ssA" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"ssN" = ( +/obj/machinery/oven, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"ssT" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"sti" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"stl" = ( +/obj/machinery/mass_driver{ + dir = 4; + id = "sm_core_eject"; + resistance_flags = 2 + }, +/obj/structure/cable/red{ + icon_state = "2" + }, +/obj/structure/cable/red{ + icon_state = "64" + }, +/obj/structure/cable/red{ + icon_state = "8" + }, +/obj/structure/cable/red{ + icon_state = "32" + }, +/obj/structure/cable/red{ + icon_state = "16" + }, +/obj/structure/cable/red{ + icon_state = "128" + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/obj/machinery/power/supermatter, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"stv" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"sty" = ( +/obj/effect/spawner/random/trash/mess, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"stM" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"stS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"stT" = ( +/obj/machinery/fax_machine, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/cargo/qm) +"suk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"sup" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"suu" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/coldroom/port) +"suA" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -3 + }, +/obj/item/wrench, +/obj/item/flashlight/seclite, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"suB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"suJ" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"suS" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"sva" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"svj" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/stack/package_wrap{ + pixel_y = 5 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"svq" = ( +/obj/structure/closet, +/obj/item/stack/sheet/glass{ + amount = 12 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"svr" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"svD" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"svS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"swa" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"swc" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"swd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"swm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"swp" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"sws" = ( +/obj/machinery/camera/motion/directional/east{ + c_tag = "E.V.A. Storage" + }, +/obj/machinery/requests_console/directional/east{ + name = "EVA Requests Console"; + department = "EVA" + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"swD" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/supermatter/room) +"swE" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"swT" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"swX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sxa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"sxt" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"sxG" = ( +/obj/docking_port/stationary/random{ + name = "lavaland"; + dir = 4; + id = "pod_3_lavaland" + }, +/turf/open/space, +/area/space) +"sxP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"sxT" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"sxU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Distro Loop" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, +/obj/machinery/meter/monitored/distro_loop, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"sxZ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"syr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"sys" = ( +/obj/structure/bookcase/random/adult, +/turf/open/floor/wood, +/area/station/service/library) +"syw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Vacant Commissary Shutter"; + id = "commissaryshutter" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"syB" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/blobstart, +/obj/machinery/button/door/directional/west{ + name = "Lock Control"; + id = "Toilet2"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"syC" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Fore - Courtroom" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"syL" = ( +/obj/machinery/door/poddoor{ + name = "Supply Dock Loading Door"; + dir = 4; + id = "QMLoaddoor" + }, +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"syT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"syW" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"syY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"szv" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"szy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"szK" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/north, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/cafeteria, +/area/station/commons/dorms) +"szM" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Engineering Security Post"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"szQ" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"szT" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"sAj" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"sAt" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"sAB" = ( +/obj/effect/turf_decal/arrows/red{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white, +/turf/open/floor/iron, +/area/station/cargo/storage) +"sAD" = ( +/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/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"sAE" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/service/hydroponics/garden) +"sAF" = ( +/obj/effect/turf_decal/siding/brown{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sBd" = ( +/obj/structure/lattice, +/obj/item/stack/cable_coil, +/turf/open/space/basic, +/area/space/nearstation) +"sBq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"sBF" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"sBL" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/security_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"sBV" = ( +/obj/effect/turf_decal/trimline/green/arrow_cw{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sCl" = ( +/obj/structure/lattice/catwalk, +/obj/structure/chair/stool/bar/directional/south, +/obj/item/storage/crayons, +/turf/open/space/basic, +/area/space/nearstation) +"sCw" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"sCG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"sCK" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"sCL" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sCW" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"sDb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"sDm" = ( +/obj/machinery/deepfryer, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/light_switch/directional/south, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"sDx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/effect/turf_decal/trimline/blue/end, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sDA" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"sDC" = ( +/obj/item/seeds/coffee{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/seeds/coffee/robusta{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/seeds/coffee{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/box/drinkingglasses{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/seeds/coffee{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"sDF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"sDL" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sDM" = ( +/obj/structure/table/wood, +/obj/machinery/fax_machine{ + pixel_y = 6 + }, +/obj/item/storage/secure/safe/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"sDV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"sDY" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Crematorium"; + req_access_txt = "22;27" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"sEj" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"sEq" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"sEv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"sEy" = ( +/obj/structure/chair, +/obj/effect/landmark/start/chaplain, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"sED" = ( +/obj/structure/cable/yellow{ + icon_state = "18" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"sEL" = ( +/obj/structure/table, +/obj/item/stack/sheet/plasteel/twenty, +/obj/item/assembly/prox_sensor{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"sEM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"sEQ" = ( +/obj/machinery/button/door/directional/east{ + name = "Shutters Control"; + id = "abandoned_kitchen" + }, +/obj/item/book/manual/wiki/cooking_to_serve_man{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -11; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/glass/rag{ + pixel_x = -10; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sER" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"sFk" = ( +/obj/structure/table/wood, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"sFp" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/iron, +/area/station/security/office) +"sFr" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"sFx" = ( +/obj/machinery/light/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants{ + icon_state = "plant-03" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"sFA" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sFK" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Medbay Operating Prep" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"sFL" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/station/commons/locker) +"sFW" = ( +/obj/structure/disposalpipe/sorting/mail{ + dir = 8; + sortType = 9 + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sGj" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/theater) +"sGr" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/command) +"sGv" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"sGT" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"sHg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark/corner, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"sHp" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"sHr" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"sHw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"sHU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"sIk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"sIn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/orange{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"sIt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 6 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"sIz" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/brig) +"sIA" = ( +/obj/machinery/door/airlock/external{ + name = "Transport Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"sIK" = ( +/obj/structure/rack, +/obj/item/storage/box/handcuffs, +/obj/item/storage/box/flashbangs{ + pixel_x = -2; + pixel_y = -2 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"sIO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"sIP" = ( +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"sIW" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L14" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"sJk" = ( +/obj/effect/turf_decal/box/white, +/obj/effect/turf_decal/arrows/white{ + pixel_y = 15; + color = "#0000FF" + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"sJn" = ( +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sJp" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"sJJ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"sJO" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/customs) +"sJQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sKk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"sKu" = ( +/obj/structure/rack{ + name = "coat rack" + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"sKG" = ( +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"sKT" = ( +/obj/item/storage/bag/plants/portaseeder, +/obj/structure/table, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"sKX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"sKY" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/space/nearstation) +"sLc" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"sLq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"sLx" = ( +/obj/machinery/door/airlock{ + name = "Aft Emergency Storage" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"sLS" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"sMh" = ( +/obj/machinery/light/directional/south, +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/item/storage/toolbox/emergency{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/wrench, +/obj/item/multitool, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"sMi" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sMw" = ( +/obj/structure/table/reinforced, +/obj/item/stamp/denied{ + pixel_x = 5 + }, +/obj/item/stamp{ + pixel_x = -5; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"sMx" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/computer/apc_control, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"sMW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/maintenance/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"sNf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"sNh" = ( +/turf/open/floor/iron/dark, +/area/station/security/brig) +"sNo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"sNH" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/transit_tube/horizontal, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"sNI" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"sOj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"sOr" = ( +/obj/machinery/photocopier, +/obj/machinery/camera/directional/east{ + c_tag = "Law Office" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"sOy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 6 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"sOz" = ( +/obj/machinery/air_sensor/oxygen_tank, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"sPk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"sPo" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/cargo/qm) +"sPr" = ( +/obj/machinery/button/door/directional/north{ + name = "Mech Bay Shutters Control"; + id = "mechbay"; + req_access_txt = "29" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"sPs" = ( +/obj/machinery/door/airlock{ + name = "Cabin 5"; + id_tag = "Cabin4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"sPy" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/holding_cell) +"sPE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"sPJ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"sPO" = ( +/obj/machinery/atmospherics/components/binary/volume_pump{ + name = "Unit 1 Head Pressure Pump" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"sQn" = ( +/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/iron, +/area/station/engineering/atmos) +"sQw" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"sQy" = ( +/obj/machinery/light/directional/south, +/obj/effect/landmark/xeno_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"sQB" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"sQD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/space/basic, +/area/station/solars/port/aft) +"sQH" = ( +/obj/machinery/power/apc/sm_apc/directional/north, +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "40" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"sQI" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"sQR" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"sQU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"sRo" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/bot, +/obj/structure/rack, +/obj/item/lightreplacer{ + pixel_y = 7 + }, +/obj/machinery/status_display/evac/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"sRp" = ( +/obj/machinery/door/window{ + name = "Mass Driver"; + dir = 4; + req_access_txt = "22" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"sRz" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/engineering) +"sRI" = ( +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"sRJ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"sRU" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"sSk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"sSw" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmospherics_engine) +"sSB" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sSE" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/security/prison/rec) +"sSH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"sSL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"sSZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"sTk" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/air_tank{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sTl" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"sTC" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"sTF" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"sTJ" = ( +/turf/open/floor/carpet, +/area/station/commons/dorms) +"sTY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/command/gateway) +"sUf" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "N2 to Airmix"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"sUh" = ( +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"sUw" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sUy" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"sUI" = ( +/obj/machinery/light/dim/directional/east, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/engineering/main) +"sUJ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"sVe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"sVF" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"sVL" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Customs - Port" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"sVN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"sVQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/camera/directional/north{ + c_tag = "Atmospherics - Central Fore" + }, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"sVU" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"sWd" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"sWh" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"sWp" = ( +/obj/structure/closet, +/obj/item/storage/box/lights/mixed, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"sWs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/hatch{ + name = "Engine Airlock Internal"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "sm-engine-airlock" + }, +/obj/machinery/door/firedoor, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/monitoring) +"sXu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"sXM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/atmospheric_technician, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"sXV" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"sYe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"sYq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"sYx" = ( +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"sYJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/starboard) +"sYS" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"sZi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"sZj" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"sZA" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"sZI" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/structure/cable/red{ + icon_state = "66" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"sZR" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/commons/locker) +"sZX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/computer/station_alert{ + dir = 4 + }, +/obj/structure/plaque/static_plaque/atmos{ + pixel_x = -32 + }, +/obj/machinery/newscaster/directional/south, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Desk" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"tad" = ( +/obj/structure/table, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/rods/fifty, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"tar" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"taJ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/security/office) +"taP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/lounge) +"tba" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/cigarette, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"tbb" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"tbf" = ( +/obj/machinery/shieldgen, +/turf/open/floor/plating, +/area/station/engineering/main) +"tbs" = ( +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"tbv" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"tbw" = ( +/obj/machinery/navbeacon{ + location = "5-Customs"; + codes_txt = "patrol;next_patrol=6-Port-Central" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"tby" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tbM" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tbQ" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"tbS" = ( +/obj/structure/table/reinforced, +/obj/structure/noticeboard/directional/north, +/obj/item/reagent_containers/food/condiment/sugar, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"tbW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"tca" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"tcp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"tcR" = ( +/obj/structure/filingcabinet, +/obj/item/folder, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"tcU" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"tdc" = ( +/obj/effect/landmark/start/station_engineer, +/turf/open/floor/iron, +/area/station/engineering/main) +"tdh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"tdk" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"tdu" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"tdw" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Law Office Maintenance"; + req_access_txt = "38" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"tdz" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tdI" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tdK" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/starboard/fore) +"tdY" = ( +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 4 + }, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/head/chefhat, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tep" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/primary/fore) +"tes" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"tey" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"teO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/green/visible{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"tfc" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"tfd" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"tfz" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"tfM" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tgc" = ( +/obj/structure/table/wood, +/obj/item/folder/red{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/paper{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/paper{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/folder/red{ + pixel_x = -7 + }, +/obj/item/pen/fountain, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"tgh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"tgl" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/commons/lounge) +"tgp" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tgv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"thd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"thh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"thq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/iron, +/area/station/service/janitor) +"thr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Dormitories" + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron, +/area/station/commons/dorms) +"thD" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Pure to Fuel Pipe"; + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"thH" = ( +/obj/machinery/shower{ + name = "emergency shower"; + dir = 8 + }, +/obj/structure/overfloor_catwalk/iron, +/turf/open/floor/plating, +/area/station/engineering/monitoring) +"thK" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"thM" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"thR" = ( +/obj/machinery/food_cart, +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"thS" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 12; + pixel_y = -1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"thV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"tia" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"tii" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"tiE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"tiF" = ( +/obj/structure/table, +/obj/item/hatchet, +/obj/item/cultivator, +/obj/item/crowbar, +/obj/item/reagent_containers/glass/bucket, +/obj/item/plant_analyzer, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"tiM" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"tiR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"tjc" = ( +/obj/effect/turf_decal/siding/thinplating_new, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"tjq" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/machinery/door/poddoor/preopen{ + name = "disposal exit vent"; + id = "Disposal Exit" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"tjr" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tjs" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/solars/port/fore) +"tjG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"tjS" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Bridge - Starboard Access" + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"tkl" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"tkm" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tkp" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"tkx" = ( +/obj/structure/table/reinforced, +/obj/machinery/microscope, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"tkE" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"tla" = ( +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"tlo" = ( +/obj/structure/table/reinforced, +/obj/item/clipboard, +/obj/item/paper/monitorkey, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/item/clothing/glasses/meson, +/obj/item/lighter, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"tls" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Central Primary Hallway - Fore - Starboard Corner" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"tlN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"tlT" = ( +/obj/machinery/door/firedoor, +/obj/structure/window/reinforced, +/obj/machinery/computer/cargo/request{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"tlX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"tme" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"tmf" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"tmg" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/wood, +/area/station/service/library) +"tmx" = ( +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/atmos) +"tmF" = ( +/obj/machinery/power/solar_control{ + name = "Starboard Quarter Solar Control"; + dir = 1; + id = "starboardsolar" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"tmO" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"tmW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"tnr" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"tns" = ( +/obj/machinery/light/directional/north, +/obj/item/storage/secure/briefcase, +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/storage/secure/briefcase, +/obj/item/assembly/flash/handheld, +/obj/machinery/computer/security/telescreen/vault{ + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"toa" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"toe" = ( +/obj/structure/table/wood, +/obj/machinery/computer/libraryconsole, +/turf/open/floor/wood, +/area/station/service/library) +"too" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"tov" = ( +/obj/structure/table/glass, +/obj/machinery/firealarm/directional/north, +/obj/item/reagent_containers/glass/beaker/large, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"tow" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"toM" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"toQ" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"toR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"toV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"tpb" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"tpj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"tpy" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/courtroom) +"tpS" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/dorms/cryo) +"tpU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tqK" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/reagentgrinder{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/shaker{ + pixel_x = -6 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Bar - Counter" + }, +/obj/structure/table, +/obj/machinery/requests_console/directional/south{ + name = "Bar Requests Console"; + department = "Bar"; + departmentType = 2 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"tqX" = ( +/obj/structure/sign/warning/pods, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/department/engine) +"trg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/warden) +"trh" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"tri" = ( +/obj/machinery/teleport/hub, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"trk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"tro" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"tru" = ( +/obj/machinery/computer/warrant{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"trx" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"trz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/structure/cable/red{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"trC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"trP" = ( +/obj/machinery/modular_computer/console/preset/id, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"tsF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"tsK" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Escape Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"tsY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ttu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"ttA" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"tuH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"tuI" = ( +/obj/machinery/power/solar{ + name = "Fore-Port Solar Array"; + id = "foreport" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/fore) +"tuM" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"tuT" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"tvz" = ( +/obj/effect/mapping_helpers/paint_wall/bridge, +/turf/closed/wall/prepainted/daedalus, +/area/station/command/heads_quarters/captain/private) +"tvB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) +"tvG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"tvJ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/miningoffice) +"tvU" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/plating, +/area/station/cargo/storage) +"twa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) +"twe" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"twg" = ( +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"twh" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"twq" = ( +/obj/structure/sign/warning/hottemp{ + pixel_y = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"twF" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/command) +"twK" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"twU" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/storage/dice, +/turf/open/floor/wood, +/area/station/commons/lounge) +"txd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"txp" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"txv" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"txB" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Aft Primary Hallway - Aft" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"txI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"txN" = ( +/obj/machinery/atmospherics/components/trinary/mixer{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"txT" = ( +/obj/machinery/door/poddoor/shutters{ + name = "Teleporter Access Shutter"; + id = "teleshutter" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/teleporter) +"tyu" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"tyF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"tyQ" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/item/kirbyplants{ + icon_state = "plant-20"; + pixel_y = 3 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"tze" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/east{ + network = list("ss13","tcomms"); + c_tag = "Telecomms - Server Room - Aft-Starboard" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/cyan{ + icon_state = "8" + }, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"tzh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/locker) +"tzi" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/lesser) +"tzk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"tzJ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"tzM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/storage) +"tAh" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos/pumproom) +"tAn" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"tAq" = ( +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"tAu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tBk" = ( +/obj/structure/table, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"tBT" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/table/glass, +/obj/item/storage/box/masks, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"tCd" = ( +/obj/structure/cable/blue{ + icon_state = "17" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"tCi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"tCp" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/norn, +/area/station/security/prison/workout) +"tCr" = ( +/obj/effect/landmark/start/clown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/theater) +"tCx" = ( +/obj/machinery/shower{ + pixel_y = 12 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"tCy" = ( +/obj/effect/turf_decal/trimline/red/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tDq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"tDG" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"tDH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"tDL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tDY" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/commons/dorms) +"tEn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"tED" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/library) +"tEI" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/disposalpipe/segment, +/obj/item/bikehorn/rubberducky, +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"tEQ" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"tEV" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/greater) +"tFa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"tFd" = ( +/obj/structure/table, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/item/stock_parts/subspace/filter, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"tFe" = ( +/obj/machinery/door/airlock{ + name = "Bar"; + req_access_txt = "25" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/bar) +"tFq" = ( +/obj/machinery/door/poddoor{ + name = "Core Vent"; + dir = 4; + id = "sm_core_vent" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"tFu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Emergency Medbay Access"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tFG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Library" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) +"tFH" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/ai_upload) +"tFJ" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"tFU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tGc" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"tGx" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"tGB" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault{ + name = "Vault"; + req_access_txt = "53" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"tGC" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"tGE" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"tGN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"tGO" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"tGP" = ( +/mob/living/simple_animal/slug/glubby, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"tHb" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"tHg" = ( +/obj/effect/landmark/blobstart, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"tHv" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/locker) +"tHx" = ( +/obj/item/beacon, +/obj/effect/turf_decal/delivery, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"tHP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Command Hallway" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"tHR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"tHU" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"tHX" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"tIc" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_loot_count = 3; + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"tIi" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"tIE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"tIF" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/filingcabinet, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"tIJ" = ( +/obj/machinery/light/directional/west, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"tIP" = ( +/mob/living/simple_animal/pet/cat/runtime, +/obj/structure/bed/dogbed/runtime, +/obj/item/toy/cattoy, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"tJb" = ( +/obj/machinery/computer/med_data{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"tJj" = ( +/obj/structure/table/wood, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/folder/blue{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/stamp/law, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"tJu" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/yellow/visible, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"tJD" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - N2O" + }, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"tJS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"tJV" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"tKc" = ( +/obj/machinery/computer/atmos_control/engine{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"tKf" = ( +/obj/structure/table, +/obj/item/storage/crayons, +/turf/open/floor/iron, +/area/station/commons/dorms) +"tKh" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"tKo" = ( +/obj/machinery/ai_slipper{ + uses = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"tKr" = ( +/obj/effect/spawner/random/structure/chair_comfy{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"tKt" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Gateway Chamber" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"tKv" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"tKw" = ( +/obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/obj/structure/cable/cyan{ + icon_state = "5" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"tKy" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Lobby East"; + network = list("ss13","medbay") + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"tKK" = ( +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"tLb" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tLK" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/engineering) +"tMu" = ( +/obj/item/stack/cable_coil/yellow, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"tMv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"tMH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"tMI" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"tMP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"tMT" = ( +/obj/machinery/door_timer{ + name = "Cell 2"; + pixel_x = -32; + id = "Cell 2" + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"tMU" = ( +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"tNa" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/commons/vacant_room/office) +"tNA" = ( +/obj/machinery/door/airlock/medical{ + name = "Break Room"; + stripe_paint = "#4c3117"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/break_room) +"tNX" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"tOg" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"tOn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "showroom shutters"; + id = "corporate_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"tOz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"tOA" = ( +/obj/effect/landmark/pestspawn, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"tOO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"tOQ" = ( +/obj/structure/table/wood, +/obj/item/toy/figure/cmo{ + pixel_x = 7 + }, +/obj/item/reagent_containers/glass/maunamug, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"tPe" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/machinery/door/window/right/directional/east{ + name = "Danger: Conveyor Access"; + icon_state = "left"; + dir = 1; + base_state = "left"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"tPg" = ( +/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/iron/dark, +/area/station/engineering/storage/tech) +"tPB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/brig) +"tPH" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"tPN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"tPR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/detectives_office/private_investigators_office) +"tQe" = ( +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"tQl" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "33" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"tQo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"tQr" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"tQy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"tQz" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/light/small/directional/west, +/obj/item/paper/fluff/gateway, +/obj/item/coin/plasma, +/obj/item/melee/chainofcommand, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"tQA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/hatch{ + name = "MiniSat Antechamber"; + req_one_access_txt = "32;19" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/cyan{ + icon_state = "144" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"tQT" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tRa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"tRe" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Departures Hallway - Aft" + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"tRm" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"tRu" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"tRv" = ( +/obj/machinery/camera/directional/west{ + network = list("aicore"); + c_tag = "AI Chamber - Port" + }, +/obj/structure/showcase/cyborg/old{ + dir = 4; + pixel_x = -9; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"tRV" = ( +/obj/machinery/conveyor_switch/oneway{ + name = "Sort and Deliver"; + pixel_x = -2; + pixel_y = 12; + id = "packageSort2" + }, +/obj/machinery/conveyor_switch/oneway{ + name = "Crate Returns"; + dir = 8; + pixel_x = -5; + pixel_y = -3; + id = "packageExternal" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"tSd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"tSf" = ( +/obj/structure/closet/secure_closet/courtroom, +/obj/machinery/light_switch/directional/north, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/turf/open/floor/iron, +/area/station/security/courtroom) +"tSp" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/station/service/library) +"tSw" = ( +/obj/machinery/door/airlock{ + name = "Unit 3"; + id_tag = "Toilet3" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"tSz" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/warning, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"tSE" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tSL" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"tTt" = ( +/obj/structure/closet/secure_closet/personal/patient, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"tTu" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window{ + name = "MiniSat Walkway Access" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"tTH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Funeral Parlour" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"tTJ" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Plasma to Pure"; + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"tTK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/storage) +"tTL" = ( +/obj/machinery/holopad, +/turf/open/floor/wood, +/area/station/service/library) +"tTP" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tUa" = ( +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"tUp" = ( +/obj/docking_port/stationary{ + name = "arrivals"; + dir = 8; + width = 7; + height = 15; + id = "arrivals_stationary"; + dwidth = 3; + roundstart_template = /datum/map_template/shuttle/arrival/box + }, +/turf/open/space/basic, +/area/space/nearstation) +"tUy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"tUB" = ( +/obj/machinery/navbeacon{ + location = "14.9-CrewQuarters-Central"; + codes_txt = "patrol;next_patrol=15-Court" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"tUI" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external{ + name = "MiniSat Space Access Airlock"; + req_access_txt = "32" + }, +/obj/machinery/door/poddoor/preopen{ + id = "transitlockdown" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"tUQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"tUZ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Aft Primary Hallway - Teleporter" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"tVc" = ( +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Virology Airlock" + }, +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"tVh" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/service/bar) +"tVn" = ( +/obj/structure/chair, +/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/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"tVF" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"tWj" = ( +/obj/machinery/space_heater, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"tWo" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port) +"tWu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"tWE" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "showroom shutters"; + id = "corporate_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"tWF" = ( +/obj/structure/closet/secure_closet/detective, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"tWI" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"tWM" = ( +/obj/machinery/holopad/secure, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat/foyer) +"tWV" = ( +/obj/machinery/newscaster/directional/west, +/turf/open/floor/carpet, +/area/station/hallway/secondary/exit) +"tXj" = ( +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"tXy" = ( +/obj/structure/window/reinforced, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"tXJ" = ( +/obj/machinery/vending/autodrobe, +/obj/structure/sign/poster/contraband/clown{ + pixel_x = 32 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"tXO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "showroom shutters"; + id = "corporate_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"tYl" = ( +/obj/machinery/sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/camera/directional/west{ + network = list("ss13","medbay"); + c_tag = "Medbay Treatment A" + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"tYy" = ( +/obj/structure/mirror/directional/east, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"tYR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/light/small/directional/north, +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/obj/effect/turf_decal/tile/neutral/half, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"tZi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"tZm" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/corporate_showroom) +"tZx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 9 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"tZy" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"tZz" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"tZB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"tZW" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Atmospherics Tank - CO2" + }, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"uaf" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"uas" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Hydroponics Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"uaD" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock"; + space_dir = 1 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"uaE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uaO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"uaR" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"uaS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"uaW" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"uaX" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"ubv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen/cmo{ + dir = 1; + pixel_y = -24 + }, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"ubB" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"ubJ" = ( +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"ubM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Distro Staging to Filter"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"ubO" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ucb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"uct" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ucA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ucI" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"uda" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"udn" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/toolbox, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"udr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/nitrogen_output{ + dir = 1 + }, +/turf/open/floor/engine/n2, +/area/station/engineering/atmos) +"udv" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"udw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"udI" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"udO" = ( +/obj/structure/table, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"udW" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/obj/structure/cable/blue{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"uec" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Medbay Lobby"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"ueg" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"uem" = ( +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-left" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uer" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"uex" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"ueY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/library) +"ufd" = ( +/obj/machinery/vending/sustenance, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"ufi" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ufp" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"ufu" = ( +/obj/structure/chair/stool/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ufw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/dark/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ufx" = ( +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/east, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"ufy" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"ufR" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-left" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ufX" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ufZ" = ( +/obj/structure/table, +/obj/item/paper_bin/construction, +/obj/item/airlock_painter, +/obj/machinery/airalarm/directional/east, +/obj/item/stack/cable_coil/red, +/turf/open/floor/iron, +/area/station/commons/storage/art) +"ugi" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ugk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ugS" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"uhj" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/cargo/warehouse) +"uhm" = ( +/obj/structure/table, +/obj/item/stack/rods/fifty, +/obj/item/wrench, +/obj/item/storage/box/lights/mixed, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"uht" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/hallway/secondary/exit) +"uhU" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"uij" = ( +/obj/machinery/light_switch/directional/west{ + pixel_y = 26 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"uik" = ( +/obj/structure/table, +/obj/machinery/telephone/security, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/machinery/power/data_terminal, +/turf/open/floor/iron, +/area/station/security/warden) +"uil" = ( +/obj/docking_port/stationary{ + name = "northwest of station"; + dir = 8; + width = 23; + height = 17; + id = "syndicate_nw"; + dwidth = 12; + dheight = 1 + }, +/turf/open/space/basic, +/area/space) +"uiP" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/highsecurity{ + name = "Gravity Generator Foyer"; + req_access_txt = "10" + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"uiW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"ujg" = ( +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/east, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/wood, +/area/station/commons/dorms) +"ujF" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ujL" = ( +/obj/machinery/autolathe, +/obj/machinery/camera/directional/south{ + c_tag = "Cargo - Mailroom" + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"ujQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"uka" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"ukb" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"ukk" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"ukx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"ukE" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"ukF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ukH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/library) +"ukL" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"ukM" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ukO" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/table, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"ukS" = ( +/obj/machinery/computer/arcade/orion_trail{ + name = "Gamer Computer"; + desc = "For gamers only. Casuals need not apply."; + icon_state = "oldcomp"; + icon_screen = "library" + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_x = -32 + }, +/obj/item/toy/katana{ + name = "anime katana"; + desc = "As seen in your favourite Japanese cartoon." + }, +/obj/structure/table/wood, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ukX" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"ulj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Atmospherics - Crystallizer" + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"ulq" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ult" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"ulz" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"ulD" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"ulE" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ulH" = ( +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/hos) +"ulL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ulM" = ( +/obj/machinery/air_sensor/air_tank, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"uml" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"umr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"umD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"umK" = ( +/obj/structure/railing, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"umR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"und" = ( +/obj/item/radio/intercom/directional/north, +/obj/structure/sign/poster/official/random/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"unw" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/closet/secure_closet/chief_medical, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"unA" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/station/service/library) +"unE" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"unK" = ( +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron, +/area/station/commons/dorms) +"unQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/stairs/left{ + dir = 1 + }, +/area/station/engineering/atmos) +"unV" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uoc" = ( +/obj/structure/bookcase/random/fiction, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"uod" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"uop" = ( +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"uot" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"uoE" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"uoK" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"upb" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"upB" = ( +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"upD" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"upG" = ( +/obj/structure/table, +/obj/structure/window/reinforced/spawner/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/window/reinforced/spawner/west{ + pixel_x = -4 + }, +/obj/machinery/telephone/medical{ + friendly_name = "Medical Front Desk" + }, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"uqN" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/atmospherics/components/unary/portables_connector{ + dir = 1 + }, +/obj/structure/window/spawner/west, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/medical/cryo) +"uqY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"url" = ( +/obj/structure/window/reinforced, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron/grimy, +/area/station/security/deck) +"urv" = ( +/obj/machinery/navbeacon{ + location = "14.3-Lockers-Dorms"; + codes_txt = "patrol;next_patrol=14.5-Recreation" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"urP" = ( +/obj/machinery/light/no_nightlight/directional/east, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"urT" = ( +/mob/living/simple_animal/pet/dog/corgi{ + name = "\improper Keeper of the Ark"; + desc = "Make sure you give him plenty of bellyrubs, or he'll melt your skin off." + }, +/obj/item/toy/clockwork_watch{ + name = "\improper Ancient Relic"; + desc = "An ancient piece of machinery, made from an unknown metal by an unknown maker." + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"use" = ( +/obj/structure/sign/directions/evac{ + pixel_x = -32 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ush" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"usl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"usp" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/north{ + name = "Inner Pipe Access"; + req_access_txt = "24" + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump/off{ + name = "O2 To Pure"; + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"usJ" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/machinery/telephone/medical, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"usT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/machinery/button/door/directional/north{ + name = "Counter Shutters Control"; + id = "kitchen_counter"; + req_access_txt = "28" + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"usW" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"utz" = ( +/obj/structure/table/wood, +/obj/item/clothing/glasses/monocle, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/service/theater) +"utC" = ( +/obj/machinery/portable_atmospherics/scrubber, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"utK" = ( +/obj/structure/table, +/obj/item/razor{ + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"utO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/item/airlock_painter/decal, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"utR" = ( +/obj/structure/window/reinforced, +/obj/structure/chair/stool/directional/east, +/turf/open/floor/iron/grimy, +/area/station/security/deck) +"utT" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating/airless, +/area/station/solars/starboard/aft) +"utZ" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/security/courtroom) +"uuw" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2, +/turf/open/space/basic, +/area/space/nearstation) +"uuF" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uuG" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"uuP" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"uuW" = ( +/obj/structure/closet/radiation, +/obj/structure/sign/warning/radiation/rad_area{ + dir = 1; + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"uvo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"uvp" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"uvx" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"uvB" = ( +/obj/structure/table/wood, +/obj/item/stamp{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/item/stamp/denied{ + pixel_x = 7; + pixel_y = 4 + }, +/obj/item/stamp/qm{ + pixel_x = 7; + pixel_y = -2 + }, +/obj/item/clipboard{ + pixel_x = -6; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/cargo/qm) +"uvH" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"uvZ" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/bridge) +"uwc" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/caution{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"uwp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/machinery/atm, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"uwS" = ( +/obj/structure/sign/warning/docking, +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/entry) +"uwV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"uxl" = ( +/obj/machinery/holopad, +/turf/open/floor/carpet/cyan, +/area/station/medical/psychology) +"uxz" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/locker) +"uxD" = ( +/obj/structure/rack, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_loot_count = 3; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"uxG" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/transit_tube/station/dispenser/flipped{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"uxK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"uxU" = ( +/obj/item/radio/intercom/directional/east, +/obj/machinery/disposal/bin{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/service/janitor) +"uxY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"uyh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Courtroom" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"uyp" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + network = list("minisat"); + c_tag = "MiniSat - Antechamber" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/structure/cable/cyan{ + icon_state = "132" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"uyu" = ( +/mob/living/carbon/human/species/monkey/punpun, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/service/bar) +"uyw" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/mirror/directional/west, +/obj/machinery/light/small/directional/south, +/obj/machinery/button/door/directional/south{ + name = "Lock Control"; + id = "FitnessShower"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/fitness/recreation) +"uyA" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"uyC" = ( +/obj/structure/displaycase/captain{ + pixel_y = 5 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"uyD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"uyE" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"uyF" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/chem_master/condimaster{ + name = "HoochMaster Deluxe"; + desc = "Looks like a knock-off chem-master. Perhaps useful for separating liquids when mixing drinks precisely. Also dispenses condiments." + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/bar) +"uyH" = ( +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"uyP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/bot, +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"uza" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"uzj" = ( +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/navbeacon{ + dir = 8; + freq = 1400; + location = "Kitchen"; + codes_txt = "delivery;dir=8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/maintenance/starboard/greater) +"uzw" = ( +/obj/machinery/light/cold/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"uzz" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"uzC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uzQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/east{ + name = "Radiation Shutters Control"; + id = "atmoshfr"; + req_access_txt = "24" + }, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmospherics_engine) +"uzV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"uzX" = ( +/obj/effect/turf_decal/trimline/red/arrow_ccw{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uAf" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"uAg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/power/data_terminal, +/obj/structure/table, +/obj/machinery/telephone/service, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/service/janitor) +"uAj" = ( +/obj/effect/landmark/start/ai/secondary, +/obj/item/radio/intercom/directional/north{ + name = "Custom Channel"; + pixel_x = 8; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/east{ + name = "Common Channel"; + listening = 0; + freerange = 1 + }, +/obj/item/radio/intercom/directional/south{ + name = "Private Channel"; + pixel_x = 8; + frequency = 1447; + listening = 0; + freerange = 1 + }, +/obj/machinery/door/window{ + name = "Tertiary AI Core Access"; + icon_state = "leftsecure"; + dir = 8; + layer = 4.1; + pixel_x = -3; + atom_integrity = 300; + base_state = "leftsecure"; + req_access_txt = "16" + }, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai) +"uAl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"uAJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 6 + }, +/obj/structure/closet/secure_closet/freezer/kitchen, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"uAP" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -1; + pixel_y = 5 + }, +/obj/item/pen, +/obj/machinery/computer/security/telescreen{ + name = "Engine Monitor"; + desc = "Used for monitoring the engine."; + dir = 8; + pixel_x = 26; + network = list("engine") + }, +/obj/machinery/button/door/directional/east{ + name = "Engineering Lockdown"; + pixel_y = 16; + id = "Engineering"; + req_one_access_txt = "1;10" + }, +/obj/machinery/button/door/directional/east{ + name = "Atmospherics Lockdown"; + pixel_y = 24; + id = "atmos"; + req_one_access_txt = "1;24" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"uBg" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"uBm" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"uBt" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"uBD" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/tcommsat/computer) +"uBH" = ( +/obj/structure/closet/crate/cardboard, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"uBQ" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"uCj" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"uCA" = ( +/obj/machinery/seed_extractor, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"uCQ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/brig) +"uCS" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "31; 48" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"uDd" = ( +/obj/structure/chair/comfy{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"uDe" = ( +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uDt" = ( +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/service/library) +"uDw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/station/ai_monitored/command/nuke_storage) +"uDD" = ( +/obj/machinery/light/cold/directional/west, +/obj/structure/cable/blue{ + icon_state = "3" + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"uDY" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"uEb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/maintenance/aft/greater) +"uEe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"uEg" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/wood, +/area/station/service/theater) +"uEq" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"uEH" = ( +/obj/machinery/ai_slipper{ + uses = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"uEI" = ( +/obj/machinery/door/firedoor, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/navigate_destination/hydro, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/door/airlock/hydroponics/glass{ + name = "Hydroponics"; + req_access_txt = "35" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"uEO" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"uEP" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"uER" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uES" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"uFl" = ( +/mob/living/simple_animal/bot/floorbot, +/obj/machinery/light/small/directional/west, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"uFm" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"uFn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uFo" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/commons/dorms) +"uFt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/station/security/lockers) +"uFv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"uFz" = ( +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"uFJ" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uGb" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 5 + }, +/obj/machinery/light/directional/west, +/obj/machinery/camera/directional/west{ + network = list("ss13","engine"); + c_tag = "Engine Room South" + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"uGf" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"uGu" = ( +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"uGz" = ( +/obj/machinery/door/window/brigdoor/left/directional/west{ + name = "Front Desk"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"uGN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Corporate Showroom"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "showroom" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"uGZ" = ( +/obj/structure/table/wood, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/north, +/obj/item/reagent_containers/food/drinks/mug{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"uHx" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/cargo/sorting) +"uHD" = ( +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/under/suit/waiter, +/obj/item/clothing/under/suit/waiter, +/obj/structure/closet, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"uHI" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"uHO" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"uHP" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"uHW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"uHX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"uIa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"uIi" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"uIt" = ( +/obj/machinery/power/smes{ + charge = 5e+06 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/cyan{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"uIG" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"uIN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Customs - Port Quarter" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"uJl" = ( +/obj/structure/chair{ + name = "Defense"; + dir = 8 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"uJq" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/closet/crate/internals, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"uJR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/solars/starboard/fore) +"uKj" = ( +/obj/structure/chair, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"uKl" = ( +/obj/structure/table, +/obj/item/cultivator, +/obj/item/hatchet, +/obj/item/crowbar, +/obj/machinery/light/directional/north, +/obj/item/plant_analyzer, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/hydroponics/garden) +"uKr" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/security/checkpoint/customs) +"uKu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"uKH" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"uKS" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 8 + }, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/aft) +"uLe" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"uLg" = ( +/obj/machinery/door/airlock{ + name = "Unit 1"; + id_tag = "AuxToilet1" + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"uLs" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"uLy" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/space/basic, +/area/station/solars/starboard/aft) +"uLF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "65" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uLR" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/station/engineering/main) +"uLU" = ( +/obj/effect/turf_decal/trimline/green/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"uMi" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/interrogation) +"uMC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "privacy shutter"; + id = "ceprivacy" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/ce) +"uME" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/item/razor{ + pixel_x = 13; + pixel_y = 2 + }, +/obj/item/clothing/mask/breath{ + pixel_y = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"uMI" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"uMQ" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"uMU" = ( +/obj/machinery/door/airlock/medical{ + name = "Pharmacy"; + stripe_paint = "#ff9900"; + req_access_txt = "69" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"uMX" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"uNc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/item/radio/intercom/directional/south{ + name = "Private Channel"; + frequency = 1447; + listening = 0; + broadcasting = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "144" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"uNA" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 11 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uNC" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"uNH" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uNM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"uOb" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"uOm" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"uOF" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"uPr" = ( +/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 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"uPB" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Deck"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"uQd" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"uQv" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"uQF" = ( +/obj/structure/lattice, +/obj/item/stack/rods, +/turf/open/space/basic, +/area/space/nearstation) +"uQS" = ( +/obj/structure/chair/stool/bar/directional/south, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/commons/lounge) +"uQW" = ( +/obj/machinery/vending/tool, +/obj/effect/turf_decal/delivery, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"uQZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stack/cable_coil/red, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"uRk" = ( +/obj/structure/girder/displaced, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"uRp" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/solars/starboard/aft) +"uRq" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/modular_computer/console/preset/curator{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) +"uRr" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Mix Outlet Pump"; + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uRt" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Port Primary Hallway - Starboard" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"uRF" = ( +/obj/machinery/light/cold/directional/west, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"uRN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"uRS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"uRU" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "singular"; + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"uRV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/brown/corner{ + dir = 1 + }, +/obj/structure/noticeboard/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uSp" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/security/office) +"uSZ" = ( +/obj/machinery/door/morgue{ + name = "Relic Closet"; + req_access_txt = "22" + }, +/turf/open/floor/cult, +/area/station/service/chapel/office) +"uTp" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 7 + }, +/obj/item/cautery{ + pixel_x = -4; + pixel_y = 12 + }, +/turf/open/floor/iron, +/area/station/security/medical) +"uTA" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"uTI" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"uTX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/burnt_floor, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;29" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"uUe" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 4 + }, +/obj/item/pen{ + pixel_x = 5 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 + }, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"uUi" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Dormitories - Aft" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"uUq" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"uUD" = ( +/obj/structure/chair/comfy/black, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/command/bridge) +"uUP" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"uUX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit, +/area/station/ai_monitored/turret_protected/ai) +"uUZ" = ( +/obj/machinery/holopad, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uVb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"uVc" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"uVk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"uWa" = ( +/obj/structure/table, +/turf/open/floor/iron, +/area/station/security/brig) +"uWh" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"uWm" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/station/medical/virology) +"uWn" = ( +/obj/machinery/nuclearbomb/selfdestruct, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"uWN" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"uWU" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"uXa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"uXh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/station/security/brig) +"uXo" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"uXC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"uXJ" = ( +/obj/structure/closet/secure_closet/security/sec, +/turf/open/floor/iron, +/area/station/security/lockers) +"uXR" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"uYb" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"uYd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"uYj" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/engineering/main) +"uYK" = ( +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/primary/central/aft) +"uYL" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"uYU" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/starboard/fore) +"uYZ" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/disposal/incinerator) +"uZg" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"uZh" = ( +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"uZk" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"uZu" = ( +/obj/structure/rack, +/obj/item/storage/medkit/advanced, +/obj/effect/turf_decal/tile/bar/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"uZz" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/security/brig) +"uZI" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/office) +"uZL" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"uZU" = ( +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/light/directional/west, +/obj/structure/table/glass, +/obj/item/storage/secure/safe/caps_spare/directional/west, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"uZX" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"var" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"vas" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"vaA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"vaB" = ( +/obj/structure/lattice/catwalk, +/obj/structure/transit_tube/junction/flipped{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space, +/area/space/nearstation) +"vaK" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"vaT" = ( +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/vending/coffee, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"vbc" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Bridge - Command Chair" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/button/door/directional/south{ + name = "Bridge Access Blast Door Control"; + id = "bridge blast"; + req_access_txt = "19" + }, +/obj/machinery/button/door/directional/south{ + name = "Council Chamber Blast Door Control"; + pixel_y = -34; + id = "council blast"; + req_access_txt = "19" + }, +/turf/open/floor/carpet, +/area/station/command/bridge) +"vbf" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"vbi" = ( +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/item/tank/internals/emergency_oxygen/engi, +/obj/effect/turf_decal/delivery, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/engineering/main) +"vbB" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/spawner/random/structure/closet_private, +/obj/item/clothing/under/suit/tan, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"vbF" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/pipedispenser/disposal, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/no_nightlight/directional/north, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vbR" = ( +/obj/structure/table/glass, +/obj/item/clothing/accessory/armband/hydro, +/obj/item/clothing/suit/apron, +/obj/item/wrench, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"vbT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + name = "Head of Personnel's Desk"; + icon_state = "rightsecure"; + dir = 1; + base_state = "rightsecure"; + req_access_txt = "57" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/north{ + name = "Reception Window"; + dir = 2 + }, +/obj/machinery/door/poddoor/preopen{ + name = "privacy shutters"; + id = "hop" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/hop) +"vbX" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north{ + pixel_x = 6 + }, +/obj/machinery/button/door/directional/north{ + name = "Atmospherics Lockdown"; + pixel_x = -6; + id = "atmos"; + req_access_txt = "24" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"vca" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"vcj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vco" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vcT" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"vdd" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vdh" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vdF" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/rack, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron, +/area/station/engineering/main) +"vdQ" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vem" = ( +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"veo" = ( +/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"vew" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"vex" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"veA" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/prison/workout) +"veH" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Power Monitoring" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/computer/station_alert, +/turf/open/floor/iron/dark, +/area/station/engineering/main) +"veL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/library) +"veO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"veX" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) +"vfx" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"vfz" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"vfF" = ( +/obj/machinery/light/cold/directional/south, +/obj/effect/spawner/random/vending/snackvend, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/aft) +"vfP" = ( +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vgj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/dark, +/area/station/security/holding_cell) +"vgq" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"vgt" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"vgw" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/locker) +"vgH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/hydroponics/glass{ + name = "Hydroponics"; + req_one_access_txt = "35;28" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"vgQ" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album{ + pixel_y = -4 + }, +/obj/item/camera{ + pixel_y = 4 + }, +/obj/item/radio/intercom/directional/west{ + name = "Captain's Intercom"; + freerange = 1 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"vhh" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vhj" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"vhr" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vhF" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"vhG" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/port) +"vio" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"vir" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/shower{ + pixel_y = 12 + }, +/obj/structure/curtain, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/captain/private) +"vis" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"vit" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/station/security/lockers) +"vix" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/turf/open/floor/grass, +/area/station/medical/virology) +"viH" = ( +/obj/machinery/button/door/directional/north{ + name = "Privacy Shutters"; + id = "detprivate"; + req_access_txt = "4" + }, +/obj/structure/filingcabinet/chestdrawer{ + name = "case files" + }, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"viK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/engineering/main) +"viV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"vjm" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"vjs" = ( +/turf/open/floor/carpet, +/area/station/command/bridge) +"vju" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"vjB" = ( +/obj/structure/table, +/obj/item/plant_analyzer{ + pixel_x = -3 + }, +/obj/item/cultivator{ + pixel_x = 4; + pixel_y = 9 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"vjG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/camera/autoname/directional/east, +/turf/open/floor/mud, +/area/station/security/pig) +"vjJ" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/camera/directional/west{ + network = list("minisat"); + c_tag = "MiniSat Exterior - Starboard Fore" + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"vjY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/brig) +"vkc" = ( +/obj/effect/landmark/start/librarian, +/obj/structure/chair/office{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/library) +"vke" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"vkM" = ( +/obj/machinery/door/airlock/command{ + name = "Medical Director's Office"; + stripe_paint = "#9cc7de"; + req_one_access_txt = "40" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"vkW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"vlh" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"vly" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/siding/thinplating_new, +/obj/structure/cable/yellow{ + icon_state = "66" + }, +/obj/structure/cable/yellow{ + icon_state = "80" + }, +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"vlR" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"vlT" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vme" = ( +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 6 + }, +/obj/item/toy/cards/deck, +/turf/open/floor/iron/norn, +/area/station/medical/break_room) +"vml" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/exit/departure_lounge) +"vmM" = ( +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/north, +/obj/structure/table/wood, +/obj/item/phone{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"vnh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"vnq" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/science/robotics/mechbay) +"vnB" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"vnC" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"vnD" = ( +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 6 + }, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"vnG" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/item/restraints/handcuffs, +/obj/structure/table/glass, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"vnR" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/service/library) +"voe" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmos) +"vof" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/plasma_output{ + dir = 1 + }, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"von" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"voG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"voH" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"voO" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"voY" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"voZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"vpd" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/recharge_station, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"vpt" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"vpy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"vpC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"vpE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"vpL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vpO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vpS" = ( +/obj/machinery/camera/autoname{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/landmark/start/depsec/engineering, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"vpY" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/lockers) +"vql" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/library) +"vqo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Corporate Showroom"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "showroom" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"vrc" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/iron/dark/corner, +/area/station/security/prison/workout) +"vrB" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vrJ" = ( +/obj/machinery/porta_turret/ai{ + dir = 8 + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai_upload) +"vrT" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "privacy shutters"; + id = "hop" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/command/heads_quarters/hop) +"vrZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"vsc" = ( +/obj/machinery/airalarm/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"vse" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vsf" = ( +/obj/machinery/button/door/directional/west{ + name = "Bridge Access Blast Door Control"; + id = "bridge blast"; + req_access_txt = "19" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"vsk" = ( +/obj/structure/window/reinforced, +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/coffee{ + pixel_x = -5; + pixel_y = 4 + }, +/obj/item/cigbutt{ + pixel_x = 6 + }, +/turf/open/floor/iron/grimy, +/area/station/security/deck) +"vsx" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vsy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/directional/east{ + name = "Privacy Shutters Control"; + id = "maintwarehouse" + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"vsC" = ( +/obj/machinery/atmospherics/components/binary/circulator/cold, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"vsG" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"vsP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/storage_shared) +"vtf" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/door/poddoor{ + name = "Supply Dock Loading Door"; + dir = 4; + id = "QMLoaddoor" + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"vti" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"vtn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "160" + }, +/obj/machinery/door/airlock/medical/glass{ + name = "Robotics Lab"; + req_access_txt = "29"; + stripe_paint = "#563758" + }, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"vtq" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Gateway Maintenance"; + req_access_txt = "17" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"vtF" = ( +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"vuf" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vus" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/primary/central/fore) +"vuu" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/security/medical) +"vuA" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"vuC" = ( +/obj/structure/sign/departments/medbay/alt, +/turf/closed/wall/prepainted/medical, +/area/station/maintenance/port) +"vuR" = ( +/obj/machinery/power/generator{ + dir = 8 + }, +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/orange{ + icon_state = "4" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"vvo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/l3closet/janitor, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/station/service/janitor) +"vvq" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"vvs" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/west, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"vvv" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"vvw" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage/mech) +"vwz" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/east{ + name = "Warehouse Door Control"; + id = "qm_warehouse"; + req_access_txt = "31" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"vwN" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock"; + space_dir = 2 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"vwO" = ( +/obj/machinery/light/cold/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vxr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"vxI" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/courtroom) +"vyf" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"vym" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/starboard/greater) +"vyp" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Holodeck Control" + }, +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"vyC" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"vyN" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vyS" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vza" = ( +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"vzd" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/interrogation) +"vzj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vzo" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"vzC" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"vzN" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/medbay/lobby) +"vzY" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/office) +"vAB" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/obj/structure/rack, +/obj/item/clothing/under/color/blue, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/neck/tie/blue, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"vAC" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space/nearstation) +"vAW" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vAY" = ( +/obj/machinery/door/airlock/mining{ + name = "Warehouse"; + req_one_access_txt = "31;48" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"vBb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"vBf" = ( +/obj/machinery/door/window/right/directional/west, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"vBh" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vBr" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "starboard-bow-airlock" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"vBB" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"vBC" = ( +/obj/effect/turf_decal/siding/brown/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vBD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"vBH" = ( +/obj/machinery/portable_atmospherics/pump, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vBI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) +"vBN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"vCa" = ( +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"vCy" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"vCL" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Equipment Closet"; + req_access_txt = "11" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"vDj" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/warning, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vDl" = ( +/obj/structure/lattice, +/obj/item/tail_pin, +/turf/open/space/basic, +/area/space/nearstation) +"vDy" = ( +/obj/effect/landmark/start/cyborg, +/obj/machinery/light/small/directional/east, +/obj/machinery/camera/directional/north{ + network = list("aiupload"); + c_tag = "AI Upload Foyer" + }, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload_foyer) +"vDG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = -3; + pixel_y = 8 + }, +/obj/item/clothing/gloves/color/orange{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/janitor) +"vDP" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Head of Personnel's Office" + }, +/obj/structure/table/wood, +/obj/item/storage/box/pdas{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/silver_ids, +/obj/item/storage/box/ids, +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hop) +"vDV" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Kitchen Counter Shutters"; + id = "kitchen_counter" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/service/kitchen) +"vEp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"vEq" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"vEx" = ( +/obj/structure/table/wood, +/obj/machinery/light/small/directional/west, +/obj/item/radio/off{ + pixel_y = 4 + }, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"vEE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"vEF" = ( +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"vEL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"vEQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"vEY" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/item/multitool, +/obj/item/clothing/glasses/meson, +/obj/machinery/light_switch/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vFk" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"vFN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/computer/mech_bay_power_console{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"vFT" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Central Primary Hallway" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"vGb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"vGA" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"vGE" = ( +/obj/structure/table, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/assembly/flash/handheld, +/obj/item/assembly/flash/handheld, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vGM" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/ai_monitored/turret_protected/ai_upload) +"vGW" = ( +/obj/structure/railing{ + dir = 6 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vHF" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 10 + }, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 18; + on = 0 + }, +/obj/item/kitchen/rollingpin{ + pixel_x = -4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vHM" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/turf/open/floor/iron, +/area/station/security/courtroom) +"vHP" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vIp" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"vIv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/structure/cable/red{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"vIA" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"vIC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/library) +"vIG" = ( +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"vJg" = ( +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/interrogation) +"vJB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/railing, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"vJG" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"vJT" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 7 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/machinery/door/window/brigdoor{ + name = "Arrivals Security Checkpoint"; + pixel_y = null; + req_access_txt = "1" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"vKm" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"vKn" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/engine/n2o, +/area/station/engineering/atmos) +"vKW" = ( +/obj/structure/cable/blue{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "144" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vKY" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/obj/machinery/light/small/directional/west, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_b) +"vLe" = ( +/obj/structure/musician/piano, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/wood, +/area/station/service/theater) +"vLh" = ( +/obj/machinery/smartfridge/drinks{ + icon_state = "boozeomat" + }, +/obj/effect/turf_decal/tile/bar, +/obj/structure/low_wall/prepainted/daedalus, +/turf/open/floor/iron, +/area/station/service/bar) +"vLu" = ( +/obj/effect/spawner/structure/window, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_exam" + }, +/turf/open/floor/plating, +/area/station/medical/exam_room) +"vLW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/vending/modularpc, +/obj/machinery/camera/directional/north{ + c_tag = "Departures Hallway - Aft" + }, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"vMg" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vMp" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"vMD" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/holomap/directional/north, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"vMN" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"vMO" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/newscaster/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vNb" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"vNt" = ( +/obj/structure/tank_dispenser, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"vNx" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + network = list("ss13","medbay"); + c_tag = "Virology Lab" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vNT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent{ + dir = 1 + }, +/turf/open/space, +/area/space/nearstation) +"vNU" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"vNW" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + name = "Arrivals Security Checkpoint"; + dir = 1; + pixel_y = null; + req_access_txt = "1" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"vNX" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"vOe" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"vOn" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"vOo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"vOz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"vOG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/orange/visible{ + dir = 8 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"vOL" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/item/food/grown/banana, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"vPg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"vPl" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"vPt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vPz" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"vPJ" = ( +/obj/structure/closet, +/obj/item/extinguisher, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vPU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/carbon_output{ + dir = 1 + }, +/turf/open/floor/engine/co2, +/area/station/engineering/atmos) +"vQd" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"vQj" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/machinery/airalarm/directional/east, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vQw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"vQW" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/maintenance{ + name = "Service Maintenance"; + req_one_access_txt = "12;73" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "service-passthrough" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"vQX" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"vRg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"vRp" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/atmospherics_engine) +"vRu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron/grimy, +/area/station/security/detectives_office/private_investigators_office) +"vRz" = ( +/obj/structure/bed/dogbed{ + name = "hog bed" + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/grass, +/area/station/security/pig) +"vRA" = ( +/obj/item/reagent_containers/food/condiment/milk{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/reagent_containers/food/condiment/soymilk{ + pixel_y = -4 + }, +/obj/item/reagent_containers/food/drinks/ice{ + pixel_x = -4; + pixel_y = -2 + }, +/obj/item/reagent_containers/food/drinks/bottle/cream{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"vRF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/embedded_controller/radio/airlock_controller/incinerator_atmos{ + pixel_x = 40; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/door/airlock/public/glass/incinerator/atmos_interior, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"vRS" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/carpet, +/area/station/medical/medbay/aft) +"vSt" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"vSw" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/table/glass, +/obj/item/stack/gauze, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"vSJ" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Cargo Bay - Fore" + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/box/red, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"vSQ" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/oxygen_input{ + dir = 1 + }, +/turf/open/floor/engine/o2, +/area/station/engineering/atmos) +"vSZ" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock"; + req_access_txt = "48" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"vTa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"vTg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"vTi" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "Secure Tech Storage"; + req_access_txt = "19;23" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"vTl" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/command, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/command/heads_quarters/ce) +"vTx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/main) +"vTy" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"vTD" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"vTH" = ( +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"vTL" = ( +/obj/machinery/keycard_auth/directional/east, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"vTN" = ( +/obj/machinery/door/airlock/vault{ + name = "Isolation Cell B"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/isolation_cells) +"vTR" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/table, +/obj/item/folder, +/obj/item/storage/medkit/regular, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"vTY" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/button/door/directional/north{ + name = "Gateway Shutter Control"; + id = "gateshutter"; + req_access_txt = "19" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"vTZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"vUn" = ( +/obj/structure/closet/wardrobe/black, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"vUC" = ( +/obj/structure/table/reinforced, +/obj/machinery/dna_analyzer, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"vUY" = ( +/obj/structure/table/wood, +/obj/item/camera_film{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/camera_film{ + pixel_y = 9 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"vVa" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "showroom shutters"; + id = "corporate_privacy" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"vVc" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"vVB" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"vVM" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/structure/closet/crate/goldcrate, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/nuke_storage) +"vVU" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"vVY" = ( +/obj/structure/closet/wardrobe/white/medical, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"vWe" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"vWr" = ( +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vWs" = ( +/obj/structure/table, +/obj/item/pen/red{ + pixel_x = 8; + pixel_y = 15 + }, +/obj/item/gps{ + pixel_x = -4; + pixel_y = 10; + gpstag = "QM0" + }, +/obj/item/pen/fountain{ + pixel_x = 9; + pixel_y = 4 + }, +/obj/item/pen/blue{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/cargo/storage) +"vWw" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vWB" = ( +/obj/machinery/disposal/bin{ + name = "deathsposal unit"; + desc = "A pneumatic waste disposal unit. This one leads into space!" + }, +/obj/structure/sign/warning/deathsposal{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vWI" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"vWK" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"vWU" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"vWY" = ( +/obj/structure/closet/lasertag/blue, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"vXc" = ( +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"vXg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/security/prison/workout) +"vXm" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"vXs" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"vXw" = ( +/obj/structure/table/wood, +/obj/item/stamp/hos{ + pixel_x = 7; + pixel_y = 2 + }, +/obj/item/food/donut/jelly{ + pixel_y = -11 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hos) +"vXU" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vYb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/service/bar) +"vYj" = ( +/obj/structure/table/reinforced, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/east{ + name = "Private Channel"; + frequency = 1447; + listening = 0; + broadcasting = 1 + }, +/obj/machinery/telephone/security, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"vYs" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"vYE" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/computer/security/telescreen{ + name = "Security Camera Monitor"; + desc = "Used for watching output from station security cameras."; + pixel_y = 30; + network = list("ss13") + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"vYQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"vZg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/security/prison/garden) +"vZx" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"vZz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"vZC" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Gravity Generator Foyer" + }, +/obj/structure/closet/radiation, +/obj/structure/sign/warning/radiation/rad_area{ + dir = 1; + pixel_y = 32 + }, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"vZT" = ( +/obj/machinery/computer/pandemic, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wat" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"waO" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"waR" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron, +/area/station/commons/locker) +"wbk" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"wbs" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"wbt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wbu" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"wbv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wbA" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"wbE" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wbS" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"wcw" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Arrivals - Station Entrance" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"wcK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"wcO" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"wdf" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wdq" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"wds" = ( +/obj/structure/table, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/fax_machine, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"wdt" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"wdx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"wdC" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"wdF" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"wdR" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_a) +"wdU" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"weH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/cold/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wfg" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"wfw" = ( +/turf/open/floor/iron, +/area/station/cargo/storage) +"wgp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"wgs" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"wgz" = ( +/obj/structure/table, +/obj/machinery/newscaster/directional/east, +/obj/machinery/camera/directional/south{ + c_tag = "Departure Lounge - Security Post" + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/taperecorder{ + pixel_x = 4 + }, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"wgF" = ( +/obj/machinery/power/smes{ + charge = 5e+06 + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"wgW" = ( +/obj/structure/table, +/obj/effect/spawner/random/bureaucracy/folder, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"wgZ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"whp" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"whr" = ( +/obj/machinery/door_timer{ + name = "Cell 3"; + pixel_x = -32; + id = "Cell 3" + }, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"whu" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/starboard) +"whB" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/fore) +"whK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"whU" = ( +/obj/effect/spawner/random/trash/box, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wia" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wic" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"wif" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/red/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"wiy" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/machinery/button/door/directional/east{ + name = "Bridge Access Blast Door Control"; + id = "bridge blast"; + req_access_txt = "19" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"wiF" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"wiH" = ( +/obj/machinery/door/airlock/command{ + name = "Command Desk"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"wjw" = ( +/obj/structure/table, +/obj/item/paper/crumpled{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/food/donut{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/office) +"wjD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) +"wjL" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"wka" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"wkc" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/left/directional/east{ + name = "Coffin Storage"; + req_access_txt = "22" + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"wkd" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"wkj" = ( +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"wkl" = ( +/obj/structure/closet/wardrobe/mixed, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"wkv" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/item/laser_pointer/red, +/turf/open/space/basic, +/area/space/nearstation) +"wkw" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable/red{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wkA" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"wkJ" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/engine/air, +/area/station/engineering/atmos) +"wkK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"wkL" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"wkM" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/blobstart, +/obj/machinery/button/door/directional/east{ + name = "Lock Control"; + id = "AuxToilet3"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/plating, +/area/station/commons/toilet/auxiliary) +"wkO" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/commons/dorms) +"wkS" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Cargo Bay Maintenance"; + req_one_access_txt = "31;48" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) +"wkX" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"wlf" = ( +/obj/machinery/power/solar{ + name = "Fore-Starboard Solar Array"; + id = "forestarboard" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"wlw" = ( +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "Bridge Access"; + req_access_txt = "19" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "bridge-right" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"wlz" = ( +/obj/machinery/atmospherics/components/binary/pump/off{ + name = "Cold Loop Supply"; + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"wlJ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/door/firedoor/heavy, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"wlU" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/button/door/directional/north{ + name = "Lock Control"; + id = "AuxShower"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/effect/spawner/random/trash/soap{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/iron, +/area/station/commons/toilet/auxiliary) +"wlX" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"wmn" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/item/clothing/head/cone, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"wmp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;35" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"wmy" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory) +"wmB" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"wmC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"wmD" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/commons/storage/primary) +"wmE" = ( +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"wmX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wmY" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"wnp" = ( +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/item/emptysandbag, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/cargo/storage) +"wnr" = ( +/obj/structure/urinal/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"wnJ" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"wnO" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"wnP" = ( +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/telephone/service, +/obj/machinery/power/data_terminal, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"wnS" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"wnV" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/tank_dispenser{ + pixel_x = -1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"wnW" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"woa" = ( +/obj/machinery/light/dim/directional/north, +/obj/machinery/suit_storage_unit/radsuit, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"wof" = ( +/obj/machinery/light/directional/east, +/obj/structure/filingcabinet, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 8; + pixel_x = 26 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"woj" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"wom" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"woo" = ( +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/south, +/obj/item/storage/photo_album/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"wov" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "Kitchen Counter Shutters"; + id = "kitchen_counter" + }, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/cafeteria{ + dir = 5 + }, +/area/station/service/kitchen) +"woy" = ( +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/medical{ + pixel_y = 8 + }, +/obj/structure/sign/directions/science{ + pixel_y = -8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/service/library) +"woB" = ( +/obj/machinery/door/airlock/external{ + name = "Supply Dock Airlock"; + req_access_txt = "31" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"woD" = ( +/obj/effect/turf_decal/loading_area, +/obj/machinery/airalarm/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"woL" = ( +/obj/effect/landmark/start/bartender, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"woP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/conveyor_switch/oneway{ + name = "Crate Returns"; + dir = 8; + pixel_x = -5; + pixel_y = 23; + id = "packageExternal" + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"wpc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/vacant_room/commissary) +"wpe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/defibrillator_mount/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"wpE" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Service Maintenance"; + req_one_access_txt = "12;73" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "service-passthrough" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wpG" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"wpI" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/effect/spawner/random/entertainment/arcade, +/turf/open/floor/iron, +/area/station/security/prison/workout) +"wpP" = ( +/obj/structure/chair/office, +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"wpX" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/engine/cult, +/area/station/service/library) +"wqy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"wqL" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/item/toy/plush/beeplushie{ + name = "Therabee"; + desc = "Maybe hugging this will make you feel better about yourself." + }, +/obj/machinery/camera/directional/east{ + network = list("ss13","prison","isolation"); + c_tag = "Isolation Cell B" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/security/isolation_cells) +"wqQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wrj" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/commons/vacant_room/commissary) +"wrv" = ( +/obj/structure/table/reinforced, +/obj/item/stamp/denied{ + pixel_x = 4; + pixel_y = -2 + }, +/obj/item/stamp{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/pen/red{ + pixel_y = 10 + }, +/obj/item/dest_tagger{ + pixel_x = 9; + pixel_y = 10 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"wrG" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"wsw" = ( +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/machinery/meter, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wsJ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"wsN" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"wsZ" = ( +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/machinery/computer/security/telescreen{ + name = "Engine Monitor"; + desc = "Used for monitoring the engine."; + dir = 8; + pixel_x = 32; + network = list("engine") + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/ce) +"wtH" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/dresser, +/obj/item/storage/secure/safe/directional/north, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"wuh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/commons/lounge) +"wuH" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wuM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"wuW" = ( +/obj/structure/table/optable, +/obj/item/clothing/mask/breath/medical, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"wvi" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/service/janitor) +"wvp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/security/interrogation) +"wvy" = ( +/obj/effect/spawner/structure/window/prepainted/marsexec, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/office) +"wvz" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"wvB" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"wvH" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wvM" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"wvR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"wwq" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/norn, +/area/station/security/prison/workout) +"wwz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/main) +"wwG" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"wwK" = ( +/obj/item/tank/internals/oxygen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/central) +"wwX" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 17 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"wxe" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/security/medical) +"wxl" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"wxB" = ( +/obj/machinery/shower{ + name = "emergency shower"; + pixel_y = 16 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = -2 + }, +/obj/effect/turf_decal/bot_white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/freezer, +/area/station/medical/coldroom/starboard) +"wxD" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wxE" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"wxX" = ( +/obj/machinery/status_display/ai/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"wyc" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"wyg" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"wyI" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = -11; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/supply) +"wyP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wyQ" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/item/food/pie/cream, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood, +/area/station/service/theater) +"wzb" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wzg" = ( +/obj/machinery/vending/wardrobe/atmos_wardrobe, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"wzv" = ( +/obj/machinery/shieldgen, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Engineering - Secure Storage" + }, +/turf/open/floor/plating, +/area/station/engineering/main) +"wzw" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"wzy" = ( +/obj/machinery/door/airlock/security{ + name = "Emergency Armory"; + req_access_txt = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"wzA" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wzH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/circuit/green, +/area/station/ai_monitored/turret_protected/ai_upload) +"wzL" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/surgery/port) +"wzM" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wAh" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"wAk" = ( +/obj/item/seeds/wheat, +/obj/item/seeds/sugarcane, +/obj/item/seeds/potato, +/obj/item/seeds/apple, +/obj/item/grown/corncob, +/obj/item/food/grown/carrot, +/obj/item/food/grown/wheat, +/obj/item/food/grown/pumpkin{ + pixel_y = 5 + }, +/obj/machinery/camera/autoname/directional/east, +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"wAu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/obj/machinery/light_switch/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/service/bar) +"wAx" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/closet/secure_closet/medical3, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"wAA" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"wAD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Morgue"; + stripe_paint = "#000000"; + req_access_txt = "6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"wAP" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"wAZ" = ( +/obj/machinery/door/airlock/atmos/glass{ + name = "Atmospherics Monitoring"; + req_access_txt = "24" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/storage/gas) +"wBa" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"wBf" = ( +/obj/structure/girder, +/turf/open/space/basic, +/area/space/nearstation) +"wBv" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"wBw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"wBI" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space/nearstation) +"wCa" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark/side{ + dir = 8 + }, +/area/station/security/prison/workout) +"wCc" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"wCh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wCp" = ( +/obj/structure/bed, +/obj/item/bedsheet/medical, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"wCD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wCK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wCP" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"wCX" = ( +/obj/machinery/computer/warrant{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wCZ" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27;37" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wDh" = ( +/turf/closed/wall/prepainted/medical, +/area/station/maintenance/department/medical/central) +"wDi" = ( +/obj/machinery/atmospherics/components/unary/heat_exchanger{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"wDl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"wDu" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/turf/open/floor/carpet/blue, +/area/station/command/heads_quarters/cmo) +"wDA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"wDF" = ( +/obj/structure/closet/secure_closet/atmospherics, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wDI" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/line, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"wDO" = ( +/obj/structure/table, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"wDT" = ( +/obj/machinery/door/poddoor/preopen{ + name = "Atmospherics Blast Door"; + id = "atmos" + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/checker, +/area/station/engineering/atmos/storage/gas) +"wEf" = ( +/obj/structure/grille, +/obj/structure/window/spawner/north, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"wEl" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"wEv" = ( +/obj/structure/bodycontainer/morgue, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"wEJ" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/item/stock_parts/cell/high{ + pixel_y = -4 + }, +/obj/item/stock_parts/cell/high{ + pixel_x = -4; + pixel_y = -6 + }, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"wEM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"wEV" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/cell_charger{ + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"wEX" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"wEY" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Treatment A"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"wFa" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wFh" = ( +/obj/structure/rack, +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/belt/utility{ + pixel_y = 5 + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage_shared) +"wFo" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Access"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"wFG" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"wFM" = ( +/obj/structure/table, +/obj/machinery/telephone/service{ + friendly_name = "Reception"; + placard_name = "Medical PBX" + }, +/obj/machinery/power/data_terminal, +/obj/structure/window/reinforced/spawner/west, +/obj/structure/cable/blue{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"wGd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/engineering/atmos) +"wGh" = ( +/obj/machinery/modular_computer/console/preset/engineering{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/monitoring) +"wGv" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/medical/surgery/port) +"wGA" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + id = "engine_sides" + }, +/obj/structure/cable/red{ + icon_state = "1" + }, +/obj/structure/cable/red{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"wGD" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"wGF" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/east, +/obj/effect/landmark/start/assistant, +/obj/machinery/button/door/directional/south{ + name = "Lock Control"; + id = "Toilet4"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"wGP" = ( +/obj/structure/punching_bag, +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/station/security/prison/workout) +"wGX" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"wHb" = ( +/turf/open/floor/grass, +/area/station/medical/virology) +"wHe" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"wHm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"wHB" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tcomms) +"wHN" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wHO" = ( +/obj/structure/table, +/obj/item/clothing/neck/stethoscope, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/item/folder/red, +/obj/item/folder/red{ + pixel_y = 1 + }, +/obj/item/folder/red{ + pixel_y = 2 + }, +/obj/item/folder/red{ + pixel_y = 3 + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"wHP" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"wIe" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"wIt" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/purple/visible, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wIx" = ( +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "packageExternal" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"wIM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"wJj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/item/cigbutt{ + pixel_y = 7 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"wJv" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/turf/open/space, +/area/space/nearstation) +"wJD" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/dorms) +"wJW" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit) +"wKf" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"wKi" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"wKI" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Storage"; + stripe_paint = "#52B4E9"; + req_access_txt = "5" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"wLr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wMh" = ( +/obj/structure/tank_holder/anesthetic, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/starboard) +"wMi" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Operating Rooms"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/medical/surgery/prep) +"wMm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"wMw" = ( +/obj/machinery/flasher/directional/north{ + id = "Cell 3" + }, +/turf/open/floor/iron, +/area/station/security/brig) +"wMH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wMU" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"wMW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"wNa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"wNc" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"wNe" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/clothing/wardrobe_closet_colored, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wNm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/garden) +"wNx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer5, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/item/circuitboard/machine/thermomachine, +/turf/open/floor/iron/dark/textured, +/area/station/engineering/atmos) +"wNU" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/port) +"wNZ" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Starboard Primary Hallway - Auxiliary Tool Storage" + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"wOh" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/structure/closet/radiation, +/obj/effect/turf_decal/delivery, +/obj/item/clothing/glasses/meson/engine, +/turf/open/floor/iron, +/area/station/engineering/main) +"wOj" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/meter, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"wOR" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"wPc" = ( +/obj/effect/turf_decal/trimline/green/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wPd" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/engine/cult, +/area/station/service/library) +"wPy" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"wPD" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"wPI" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"wPM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"wPP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wPR" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 4 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"wPS" = ( +/obj/structure/grille, +/obj/structure/window/spawner, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"wPW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"wPZ" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/effect/turf_decal/stripes/white/corner{ + dir = 8 + }, +/obj/machinery/button/door/directional/west{ + name = "Genpop Shutters"; + id = "cell1genpop"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"wQa" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"wQr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/engine) +"wQv" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "privacy shutters"; + id = "med_exam" + }, +/turf/open/floor/plating, +/area/station/medical/exam_room) +"wQw" = ( +/obj/machinery/light/cold/directional/south, +/obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/green/line, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"wQx" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/surgery/port) +"wRh" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"wRR" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/random/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"wRS" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Danger: Conveyor Access"; + icon_state = "left"; + base_state = "left"; + req_access_txt = "12" + }, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"wRU" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Captain's Office" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"wRY" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "whiteship-dock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"wSd" = ( +/obj/structure/window/reinforced, +/obj/machinery/computer/atmos_control/mix_tank{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"wSo" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/assistant, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/obj/machinery/button/door/directional/west{ + name = "Lock Control"; + id = "Toilet3"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"wSs" = ( +/turf/open/floor/iron/dark, +/area/station/science/robotics/lab) +"wSv" = ( +/obj/item/gun/energy/e_gun{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/gun/energy/e_gun, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet{ + name = "secure weapons locker" + }, +/obj/item/gun/energy/laser{ + pixel_y = -4 + }, +/obj/item/gun/energy/laser{ + pixel_x = 3; + pixel_y = -5 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/security/armory/upper) +"wSx" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/light/directional/east, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"wSA" = ( +/obj/machinery/door/airlock/command{ + name = "Teleport Access"; + req_access_txt = "17" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/command/teleporter) +"wSD" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"wSU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + name = "bridge blast door"; + id = "bridge blast" + }, +/obj/effect/mapping_helpers/paint_wall/bridge, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/command/bridge) +"wTm" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 3 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/service/bar) +"wTq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wTt" = ( +/obj/machinery/oven, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wTG" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"wTM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical{ + name = "Pharmacy"; + stripe_paint = "#ff9900"; + req_access_txt = "69;5" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"wUa" = ( +/obj/structure/light_construct/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wUq" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"wUC" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"wUP" = ( +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = -8; + pixel_y = -3 + }, +/obj/item/paperslip{ + pixel_x = -5; + pixel_y = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"wVw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"wVC" = ( +/obj/effect/landmark/start/station_engineer, +/obj/machinery/light/directional/west, +/obj/structure/sign/warning/electricshock{ + pixel_x = -31 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"wVO" = ( +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"wVU" = ( +/obj/machinery/mass_driver/chapelgun, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/obj/item/gps, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"wVW" = ( +/obj/machinery/door/poddoor/preopen{ + name = "Engineering Security Doors"; + id = "Engineering" + }, +/obj/effect/turf_decal/caution/stand_clear, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/break_room) +"wVZ" = ( +/obj/structure/chair{ + name = "Prosecution"; + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/courtroom) +"wWn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/marsexec, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/security/brig) +"wWo" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"wWu" = ( +/obj/machinery/door/airlock/engineering{ + name = "Starboard Bow Solar Access"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"wWx" = ( +/turf/open/floor/wood, +/area/station/security/detectives_office/private_investigators_office) +"wWE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"wWJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"wXb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"wXk" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "6" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"wXr" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"wXv" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair/comfy/black, +/turf/open/floor/wood, +/area/station/service/library) +"wXY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"wYa" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"wYg" = ( +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/structure/table/glass, +/obj/item/book/manual/hydroponics_pod_people, +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/requests_console/directional/west{ + name = "Hydroponics Requests Console"; + department = "Hydroponics"; + departmentType = 2 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"wYk" = ( +/turf/open/floor/iron, +/area/station/security/prison/garden) +"wYq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"wYE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/station/service/lawoffice) +"wYQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"wYS" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"wZa" = ( +/turf/closed/wall/prepainted/medical, +/area/station/medical/patients_rooms/room_d) +"wZf" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/lockers) +"wZi" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"wZw" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer, +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/north{ + network = list("ss13","medbay"); + c_tag = "Medbay Cryogenics" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/medical/cryo) +"wZL" = ( +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"wZW" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/newscaster/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"xag" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;29" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"xah" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/aft) +"xar" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/space/basic, +/area/station/solars/starboard/aft) +"xas" = ( +/obj/machinery/door/airlock{ + name = "Central Emergency Storage" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/central) +"xat" = ( +/obj/structure/cable/yellow{ + icon_state = "17" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"xaG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"xaL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"xba" = ( +/obj/machinery/navbeacon{ + freq = 1400; + location = "Disposals"; + codes_txt = "delivery;dir=1" + }, +/obj/structure/plasticflaps, +/obj/machinery/door/window/right/directional/north{ + name = "delivery door"; + dir = 2; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"xbi" = ( +/obj/structure/rack, +/obj/machinery/airalarm/directional/north, +/obj/item/storage/pill_bottle/alkysine, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = 8 + }, +/obj/effect/turf_decal/delivery/red, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xbk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"xbs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/machinery/door/airlock/public/glass/incinerator/atmos_exterior, +/turf/open/floor/engine, +/area/station/maintenance/disposal/incinerator) +"xca" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"xch" = ( +/obj/machinery/power/smes/engineering, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"xct" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/transit_tube/curved/flipped, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"xcw" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Court Cell"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"xcF" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/break_room) +"xds" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"xdI" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/structure/table/wood, +/obj/item/pinpointer/nuke, +/obj/item/disk/nuclear, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"xdJ" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"xdN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"xdP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/station/engineering/break_room) +"xew" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/aisat/exterior) +"xeD" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xeI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/junction, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/aft) +"xeM" = ( +/obj/structure/chair/office, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"xeT" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"xfb" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy{ + icon_state = "markercerulean-on"; + picked_color = "Cerulean" + }, +/turf/open/space/basic, +/area/space/nearstation) +"xfg" = ( +/turf/open/floor/iron, +/area/station/medical/treatment_center) +"xfl" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xfr" = ( +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xfx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/medical/virology) +"xfU" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/item/folder/yellow{ + pixel_y = 4 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Bridge - Central" + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xfX" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/station/solars/port/fore) +"xfZ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen/cryo, +/obj/effect/turf_decal/box/red, +/obj/machinery/light/cold/directional/south, +/turf/open/floor/iron, +/area/station/medical/cryo) +"xgf" = ( +/obj/machinery/firealarm/directional/east, +/obj/structure/chair/office/light, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"xgl" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xgu" = ( +/obj/structure/chair/stool, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"xgG" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light_switch/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"xgO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"xhj" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"xhm" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + network = list("ss13","medbay"); + c_tag = "Virology Central Hallway" + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xhS" = ( +/obj/machinery/light/directional/south, +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"xhW" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/atmos) +"xir" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/prison/rec) +"xiv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/cargo/warehouse) +"xiP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"xiX" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/iron, +/area/station/service/bar) +"xjg" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/commons/lounge) +"xjt" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"xjy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/flasher/directional/north{ + pixel_x = -22; + id = "AI" + }, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"xjF" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"xjJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"xjW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"xkf" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xkm" = ( +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/gateway) +"xkw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/satellite) +"xkz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"xkC" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"xkD" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"xkE" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"xkO" = ( +/obj/structure/bodycontainer/morgue, +/obj/machinery/light/dim/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"xkT" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/obj/machinery/light/small/directional/west, +/obj/machinery/requests_console/directional/west, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai) +"xlb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"xlh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Auxiliary Tool Storage"; + req_access_txt = "12" + }, +/obj/effect/landmark/event_spawn, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"xli" = ( +/obj/machinery/icecream_vat, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/service/kitchen/coldroom) +"xlr" = ( +/obj/structure/filingcabinet/security, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/dark, +/area/station/security/detectives_office/private_investigators_office) +"xls" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/library) +"xlK" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"xlX" = ( +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/navbeacon{ + dir = 1; + freq = 1400; + location = "Hydroponics"; + codes_txt = "delivery;dir=1" + }, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"xmk" = ( +/obj/structure/table, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/station/security/courtroom) +"xms" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"xmu" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xmy" = ( +/obj/structure/rack, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron, +/area/station/security/lockers) +"xmE" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"xmT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, +/turf/open/space, +/area/space/nearstation) +"xmV" = ( +/obj/structure/table, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = -4 + }, +/obj/effect/turf_decal/stripes/white/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/requests_console/directional/west{ + name = "Robotics Requests Console"; + department = "Robotics"; + departmentType = 2; + receive_ore_updates = 1 + }, +/turf/open/floor/iron, +/area/station/science/robotics/lab) +"xng" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/vending/wardrobe/chem_wardrobe, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"xnj" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"xnC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/locker) +"xnJ" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xnK" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/wood, +/area/station/service/library) +"xon" = ( +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Exhaust-Return Tie" + }, +/obj/effect/turf_decal/trimline/green/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"xor" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/warning{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/red{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/engineering/atmospherics_engine) +"xov" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 9 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xow" = ( +/obj/machinery/atmospherics/pipe/bridge_pipe/cyan/visible, +/obj/machinery/atmospherics/components/binary/valve/digital{ + name = "Waste Release"; + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xoA" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/station/engineering/main) +"xoE" = ( +/obj/machinery/navbeacon{ + location = "7.5-Starboard-Aft-Corner"; + codes_txt = "patrol;next_patrol=8-Central-to-Aft" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xoQ" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xpb" = ( +/obj/machinery/gravity_generator/main, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"xpd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/command/teleporter) +"xpl" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"xpn" = ( +/obj/structure/closet/wardrobe/chemistry_white, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) +"xpo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + name = "Emergency Medbay Access"; + stripe_paint = "#DE3A3A"; + req_access_txt = "5" + }, +/turf/open/floor/noslip, +/area/station/medical/medbay/central) +"xpu" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/service/bar) +"xpF" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/command/gateway) +"xpO" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"xpR" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"xqa" = ( +/obj/structure/table/glass, +/obj/machinery/light/cold/directional/north, +/obj/item/wrench, +/obj/item/flashlight/pen, +/obj/item/screwdriver, +/turf/open/floor/iron, +/area/station/medical/cryo) +"xqc" = ( +/turf/closed/wall/prepainted/medical, +/area/station/maintenance/port/aft) +"xqf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"xqg" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xqh" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/commons/dorms) +"xqn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"xqK" = ( +/obj/structure/closet/crate, +/obj/item/stack/sheet/rglass{ + amount = 50 + }, +/obj/item/stack/sheet/iron/fifty, +/obj/item/storage/toolbox/emergency, +/obj/effect/spawner/random/engineering/flashlight, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"xqO" = ( +/obj/machinery/door/airlock{ + name = "Theater Backstage"; + req_access_txt = "46" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/station/service/theater) +"xqX" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/fore) +"xqZ" = ( +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"xrk" = ( +/obj/effect/landmark/start/chaplain, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"xro" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"xrS" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"xrX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Arrival Airlock"; + space_dir = 2 + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"xsj" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"xst" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/north{ + name = "Engineering Desk"; + dir = 4; + req_one_access_txt = "24;32" + }, +/obj/item/folder/yellow, +/obj/item/pen, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"xsu" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"xsx" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"xsV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "law office shutters"; + id = "lawyer_shutters" + }, +/turf/open/floor/plating, +/area/station/service/lawoffice) +"xtk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"xtn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/commons/locker) +"xtw" = ( +/obj/item/stack/rods, +/turf/open/space/basic, +/area/space) +"xtA" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - Middle Arm - Far" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"xtW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/orange{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"xtZ" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/smart/simple/green/visible, +/turf/open/space/basic, +/area/space/nearstation) +"xud" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"xuk" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"xuv" = ( +/obj/machinery/cryopod{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/commons/dorms/cryo) +"xuz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/obj/machinery/meter, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"xuI" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos) +"xuK" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"xuL" = ( +/obj/machinery/portable_atmospherics/canister/plasma, +/turf/open/floor/engine/plasma, +/area/station/engineering/atmos) +"xuO" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"xuZ" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/command_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"xve" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/security/office) +"xvo" = ( +/obj/machinery/door/airlock/highsecurity{ + name = "AI Chamber"; + req_access_txt = "16" + }, +/obj/machinery/door/poddoor/shutters/preopen{ + name = "AI Chamber entrance shutters"; + id = "AI Chamber entrance shutters" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/cyan{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "144" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"xvt" = ( +/obj/machinery/recharge_station{ + pixel_y = 13 + }, +/turf/open/floor/iron/freezer, +/area/station/security/prison/shower) +"xvL" = ( +/obj/machinery/door/poddoor{ + name = "Supply Dock Loading Door"; + dir = 4; + id = "QMLoaddoor2" + }, +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"xvQ" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 4 + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"xvR" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/solars/starboard/aft) +"xvS" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/machinery/button/door/directional/east{ + name = "Privacy Control"; + id = "med_sleeper_right"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"xvY" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"xwb" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"xwd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"xwu" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/under/misc/assistantformal, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/commons/locker) +"xwv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"xwx" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/fore) +"xwA" = ( +/obj/structure/chair/wood/wings{ + dir = 1 + }, +/obj/effect/landmark/start/clown, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/station/service/theater) +"xwK" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/security/brig) +"xwN" = ( +/turf/open/floor/iron, +/area/station/engineering/break_room) +"xwO" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xwY" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xxi" = ( +/obj/effect/turf_decal/trimline/yellow/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"xxG" = ( +/obj/structure/table/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/cargo/qm) +"xxL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"xxQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold/cyan/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/pumproom) +"xya" = ( +/obj/structure/table/glass, +/obj/item/fixovein, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"xyr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"xyt" = ( +/obj/effect/turf_decal/trimline/blue/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xyv" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"xyC" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "N2O to Pure"; + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xyN" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"xyQ" = ( +/obj/effect/spawner/structure/window/reinforced/plasma/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/radiation/preopen{ + dir = 4; + id = "engine_emitter" + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/obj/structure/cable/red{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/station/engineering/supermatter/room) +"xzd" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xzG" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"xzK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xzU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"xzW" = ( +/mob/living/basic/cow{ + name = "Betsy"; + real_name = "Betsy" + }, +/turf/open/floor/grass, +/area/station/service/hydroponics/garden) +"xzX" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"xAW" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit) +"xAY" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/commons/storage/tools) +"xAZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"xBd" = ( +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/station/service/library) +"xBn" = ( +/obj/structure/plasticflaps, +/obj/machinery/conveyor{ + dir = 8; + id = "QMLoad" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/cargo/storage) +"xBq" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xBv" = ( +/obj/structure/table, +/obj/item/stack/package_wrap{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"xBB" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xBD" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/commons/fitness/recreation) +"xBE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"xBK" = ( +/obj/machinery/atmospherics/components/binary/circulator{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"xBV" = ( +/turf/closed/wall/r_wall/prepainted/medical, +/area/station/medical/chemistry) +"xCe" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/conveyor{ + dir = 9; + id = "garbage" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"xCp" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/table, +/obj/item/toy/crayon/white{ + pixel_x = 9; + pixel_y = 7 + }, +/obj/item/storage/box/evidence{ + pixel_x = -4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"xCF" = ( +/obj/structure/transit_tube/curved{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"xCP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/junction, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xCY" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/folder/blue{ + pixel_y = 3 + }, +/obj/item/pen, +/obj/machinery/computer/security/telescreen/minisat{ + dir = 1; + pixel_y = -28 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark, +/area/station/engineering/transit_tube) +"xDg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"xDo" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/command/heads_quarters/cmo) +"xDy" = ( +/obj/effect/turf_decal/trimline/blue/arrow_cw{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xDC" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/door/airlock/medical{ + name = "Port Operating Room"; + stripe_paint = "#DE3A3A"; + req_access_txt = "45" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/port) +"xDQ" = ( +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"xDS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"xDT" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/light/no_nightlight/directional/east, +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"xEa" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"xEb" = ( +/obj/structure/table, +/obj/item/electronics/apc, +/obj/item/electronics/airlock, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"xEj" = ( +/obj/machinery/computer/security, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xEl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xEF" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/starboard/fore) +"xEH" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"xER" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/port) +"xEX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) +"xFd" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/security/brig) +"xFj" = ( +/obj/machinery/door/airlock/grunge{ + name = "Genpop Showers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/security/prison/rec) +"xFr" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/telephone/engineering, +/obj/machinery/power/data_terminal, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"xFu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xFC" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"xFD" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"xFK" = ( +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"xFN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xGi" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Deck"; + req_one_access_txt = "1;4" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/security/deck) +"xGs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port Corner" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xGw" = ( +/obj/structure/closet/boxinggloves, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"xGA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"xGB" = ( +/turf/open/floor/plating, +/area/station/commons/fitness/recreation) +"xGY" = ( +/obj/machinery/hydroponics/constructable, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"xHR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xIa" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"xIn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"xIE" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;22;25;37;38;46" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xJe" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"xJf" = ( +/obj/structure/closet, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/reagent_containers/food/drinks/bottle/beer{ + name = "Meta-Cider"; + desc = "Takes you to a whole new level of thinking." + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/starboard/fore) +"xJg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) +"xJs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/spawner/random/trash/mess, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port) +"xJN" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"xJZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/ai_upload) +"xKo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xKp" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"xKr" = ( +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/station/engineering/main) +"xKE" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/fore) +"xKP" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"xLD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xLO" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"xLW" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/commons/fitness/recreation) +"xMk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/starboard/lesser) +"xMs" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/brig/upper) +"xMu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/bar/opposingcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/station/service/kitchen) +"xMA" = ( +/obj/item/toy/cattoy, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"xMD" = ( +/obj/machinery/mass_driver/trash{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"xMI" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "5" + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/cable/blue{ + icon_state = "33" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xNc" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/main) +"xNA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/commons/locker) +"xNE" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/security/prison/workout) +"xNK" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Bridge - Port Access" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xNS" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/cargo/storage) +"xNZ" = ( +/obj/structure/table, +/obj/item/stack/wrapping_paper, +/obj/item/stack/wrapping_paper{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"xOg" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/disposal/incinerator) +"xOv" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xOA" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/bot, +/obj/machinery/camera{ + dir = 9; + c_tag = "Engineering - Foyer - Starboard" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/break_room) +"xOF" = ( +/obj/machinery/light/cold/directional/east, +/turf/open/floor/carpet/blue, +/area/station/medical/medbay/lobby) +"xPb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xPf" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/filingcabinet/security, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"xPo" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/freezer, +/area/station/commons/toilet/restrooms) +"xPs" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/department/medical/central) +"xPF" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/station/commons/dorms) +"xPM" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/poddoor/preopen{ + name = "Atmospherics Blast Door"; + id = "atmos" + }, +/obj/machinery/navbeacon{ + freq = 1400; + location = "Atmospherics"; + codes_txt = "delivery;dir=2" + }, +/obj/machinery/atmospherics/pipe/smart/simple/supply/hidden, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos/storage/gas) +"xPO" = ( +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/radio/intercom/directional/south, +/obj/item/pen/blue, +/turf/open/floor/wood, +/area/station/medical/psychology) +"xPR" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"xQK" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"xQU" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating/airless, +/area/station/engineering/atmos) +"xRa" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"xRf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/command/heads_quarters/hos) +"xRu" = ( +/obj/machinery/photocopier, +/obj/effect/turf_decal/bot_red, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xRw" = ( +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/fore) +"xRx" = ( +/obj/structure/chair/stool/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/commons/dorms) +"xRS" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + name = "Cargo Desk"; + req_access_txt = "50" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/cargo/sorting) +"xSg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"xSj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/white, +/area/station/medical/exam_room) +"xSs" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"xSy" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/engineering/main) +"xSJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/security/lockers) +"xSY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"xTd" = ( +/obj/structure/closet/secure_closet/atmospherics, +/turf/open/floor/iron/dark, +/area/station/engineering/atmospherics_engine) +"xTj" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -4; + pixel_y = 3 + }, +/obj/item/pen{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/folder/red{ + pixel_x = 8; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/security/warden) +"xTq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) +"xTw" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/turf/open/floor/iron/dark, +/area/station/security/office/hall) +"xTx" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"xTA" = ( +/obj/machinery/airalarm/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/security/office) +"xTB" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/central) +"xTF" = ( +/obj/item/storage/crayons, +/obj/machinery/light/small/directional/west, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"xTH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"xTI" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/station/security/office) +"xTJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"xTP" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central/starboard) +"xTV" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"xTX" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/ai_monitored/aisat/exterior) +"xUi" = ( +/obj/machinery/light/small/maintenance/directional/east, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/aft/upper) +"xUy" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/cargo/storage) +"xUG" = ( +/obj/machinery/modular_computer/console/preset/engineering, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xUJ" = ( +/obj/machinery/computer/secure_data, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/engineering) +"xVh" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/structure/sign/poster/random/directional/north, +/turf/open/floor/wood, +/area/station/commons/lounge) +"xVk" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"xVs" = ( +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"xVv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xVx" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/security/brig) +"xVB" = ( +/obj/machinery/door/airlock/security{ + name = "Forensics Room"; + req_access_txt = "4" + }, +/turf/open/floor/plating, +/area/station/security/detectives_office/private_investigators_office) +"xVP" = ( +/obj/machinery/atmospherics/pipe/smart/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"xVS" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron, +/area/station/medical/surgery/port) +"xWo" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"xWt" = ( +/obj/effect/landmark/start/captain, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"xWD" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/machinery/button/door/directional/south{ + name = "Diagnostics Privacy Control"; + id = "med_diagnostic_privacy"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"xWO" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "MiniSat Maintenance"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/cyan{ + icon_state = "96" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/turret_protected/aisat_interior) +"xWS" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/door/directional/south{ + name = "E.V.A. Storage Shutter Control"; + id = "evashutter"; + req_access_txt = "18" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"xWU" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xXl" = ( +/obj/machinery/navbeacon{ + location = "8-Central-to-Aft"; + codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"xXp" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"xXv" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/station/medical/break_room) +"xXA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/south, +/obj/item/kirbyplants, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central/aft) +"xXE" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/heads_quarters/ce) +"xXH" = ( +/obj/machinery/atmospherics/pipe/smart/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"xXL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xXU" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/mix_input{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/station/engineering/atmos) +"xYb" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"xYs" = ( +/obj/structure/table, +/obj/item/storage/bag/plants, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"xYw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored/engine_output{ + dir = 8; + can_hibernate = 0 + }, +/obj/structure/cable/red{ + icon_state = "33" + }, +/obj/structure/cable/red{ + icon_state = "40" + }, +/turf/open/floor/engine/airless, +/area/station/engineering/supermatter/room) +"xYz" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port) +"xYC" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) +"xYJ" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/red{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/engineering/atmos/storage/gas) +"xYX" = ( +/obj/item/kirbyplants{ + icon_state = "plant-16" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "128" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xYZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/west{ + name = "Hydroponics Desk"; + dir = 4; + req_one_access_txt = "30;35" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"xZo" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"xZD" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"xZQ" = ( +/obj/structure/window/reinforced, +/obj/effect/turf_decal/delivery, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/service) +"xZT" = ( +/obj/machinery/chem_dispenser/drinks/beer{ + dir = 1 + }, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/bar) +"yaa" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced, +/obj/machinery/light_switch/directional/west, +/obj/item/storage/secure/briefcase{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/storage/lockbox/medal, +/turf/open/floor/wood, +/area/station/command/heads_quarters/captain/private) +"yau" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"yaG" = ( +/obj/machinery/computer/security/telescreen{ + name = "Telecomms Camera Monitor"; + dir = 8; + pixel_x = 26; + network = list("tcomms") + }, +/obj/machinery/computer/telecomms/monitor{ + dir = 8; + network = "tcommsat" + }, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"yaI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/plaque/static_plaque/golden/commission/meta, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/command) +"yaL" = ( +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"yaW" = ( +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"ybv" = ( +/obj/machinery/requests_console/directional/south{ + name = "Mining Requests Console"; + department = "Mining" + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"ybw" = ( +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = -4 + }, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"ycg" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"ydo" = ( +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"ydu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/gambling, +/obj/effect/spawner/random/entertainment/gambling, +/turf/open/floor/wood, +/area/station/commons/lounge) +"ydF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"ydT" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + name = "Outer Window"; + icon_state = "right"; + base_state = "right" + }, +/obj/machinery/door/window/brigdoor{ + name = "Security Desk"; + dir = 4; + req_access_txt = "1" + }, +/obj/item/folder/red, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"yed" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/theater) +"yex" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/grimy, +/area/station/tcommsat/computer) +"yeB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/starboard/greater) +"yeC" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "5"; + stripe_paint = "#52B4E9" + }, +/turf/open/floor/plating, +/area/station/medical/storage) +"yeD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/command/gateway) +"yeI" = ( +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","prison","isolation") + }, +/turf/open/floor/iron, +/area/station/security/brig) +"yeL" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/item/clothing/head/that, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/table, +/turf/open/floor/iron, +/area/station/service/bar) +"yeS" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/commons/dorms) +"yeX" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/captain/private) +"yfd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/telecomms, +/area/station/tcommsat/server) +"yfg" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"yfq" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/line{ + dir = 1 + }, +/obj/structure/cable/blue{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"yfr" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/command, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"yfv" = ( +/obj/structure/table, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"yfz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/no_nightlight/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/siding/yellow/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/engineering/atmos) +"yfL" = ( +/turf/open/floor/iron, +/area/station/security/brig) +"yfS" = ( +/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/engineering/atmos/storage/gas) +"ygw" = ( +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"ygx" = ( +/obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/bridge_pipe/green/visible, +/turf/open/floor/iron/ported/techfloor_grid, +/area/station/engineering/supermatter/room) +"ygF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"ygL" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"ygR" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/bar, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"ygU" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/button/door/directional/south{ + name = "Door Bolt Control"; + pixel_x = -8; + id = "MedPatientD"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters"; + pixel_x = 8; + id = "MedPatientD_Privacy" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_d) +"yhl" = ( +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port) +"yhA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/station/security/medical) +"yhU" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/obj/machinery/door/airlock{ + name = "Kitchen Cold Room"; + req_access_txt = "28" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/cafeteria, +/area/station/service/kitchen/coldroom) +"yid" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"yie" = ( +/obj/structure/rack, +/obj/effect/spawner/random/techstorage/tcomms_all, +/turf/open/floor/iron/dark, +/area/station/engineering/storage/tech) +"yii" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/engineering/atmospherics_engine) +"yis" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/button/door/directional/south{ + name = "Door Bolt Control"; + pixel_x = -8; + id = "MedPatientC"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/obj/machinery/button/door/directional/south{ + name = "Privacy Shutters"; + pixel_x = 8; + id = "MedPatientC_Privacy" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/station/medical/patients_rooms/room_c) +"yiC" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"yjB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/station/medical/cryo) +"yjM" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/ported/techfloor, +/area/station/engineering/supermatter/room) +"yjO" = ( +/obj/machinery/telecomms/server/presets/service, +/obj/machinery/light/small/directional/south, +/turf/open/floor/circuit/telecomms/mainframe, +/area/station/tcommsat/server) +"yjP" = ( +/obj/machinery/holopad, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/service/hydroponics) +"yka" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/station/maintenance/disposal) +"ykb" = ( +/obj/structure/chair/stool{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/engineering/engine_smes) +"ykk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/maintenance/starboard/greater) +"ykQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"ylh" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_y = 5 + }, +/obj/item/clothing/mask/gas{ + pixel_y = 3 + }, +/obj/item/clothing/mask/gas{ + pixel_x = 1; + pixel_y = -1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/fore) +"ylj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/station/security/checkpoint/customs) +"ylw" = ( +/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/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/effect/turf_decal/bot{ + dir = 1 + }, +/obj/item/stock_parts/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron{ + dir = 1 + }, +/area/station/engineering/main) +"yly" = ( +/obj/machinery/computer/crew, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/command/bridge) +"ylB" = ( +/obj/effect/mapping_helpers/iannewyear, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/station/command/heads_quarters/hop) +"ylJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/east{ + name = "storage wing camera"; + c_tag = "Outer Vault" + }, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window, +/turf/open/floor/iron, +/area/station/construction/storage_wing) +"ylO" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) +"ylU" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "45" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ylX" = ( +/obj/structure/girder, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) +"ymf" = ( +/obj/structure/sign/warning/radiation/rad_area{ + pixel_y = 32 + }, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/engineering/gravity_generator) + +(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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +uil +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +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 +quc +aaa +aaa +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +fVZ +aaa +aaa +fVZ +aaa +aaa +aaa +aaa +aaa +lMJ +lAu +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +quc +aaa +aaa +fxr +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lAu +oWO +oWO +oWO +oWO +lAu +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lAu +oWO +lDz +aWT +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +gbI +btS +jSF +wRY +mXr +wRY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aaa +aaa +aaa +aaa +aaa +dPw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dPw +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lAu +oWO +aVw +aWU +wRY +aZZ +wRY +gVc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aaa +aaa +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aaa +aUn +aaa +aaa +aaa +aaa +lMJ +lAu +lAu +lMJ +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +oWO +oWO +oWO +oWO +oWO +aaa +aaa +aaa +aaa +aaa +uwS +bvD +aWU +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +oAS +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aaa +aaa +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aaa +aUn +aUn +aUn +aUn +aUn +gbI +oWO +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +oWO +bvB +aWT +oWO +lMJ +lMJ +lMJ +lMJ +lMJ +oWO +aVw +aWU +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pHM +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lKu +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +aVt +aWT +oWO +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +uwS +aVu +hDJ +gbI +aox +quc +aox +quc +aox +gbI +otO +aWU +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +pHM +rrt +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +gbI +aVu +jSF +uwS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +oWO +aVw +aWU +oWO +lMJ +lMJ +lMJ +lMJ +lMJ +oWO +aVu +bMu +gbI +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +fcR +eag +fcR +fcR +fcR +fcR +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +bFH +aWU +oWO +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +gbI +bvC +xtA +uwS +lAu +aaa +aaa +aaa +lAu +oWO +aVu +aWU +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +fcR +ejg +rTQ +bwC +rEm +toa +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +rrt +rrt +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +eIn +aWV +gbI +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +oWO +bvD +aWU +oWO +aaa +aaa +aaa +aaa +lAu +oWO +aVu +aWU +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +fcR +fcR +fcR +uza +rLZ +toa +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +aVx +aWU +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +oWO +oWO +bvD +aWU +oWO +lAu +aaa +aaa +aaa +lAu +oWO +aVu +aWU +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +anS +toa +sVe +vjm +jOI +toa +lMJ +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +aaa +wkA +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +aVu +aWU +eeG +aZZ +xrX +aaa +aaa +aaa +aaa +aaa +aaa +aaa +uaD +bsk +aqW +aVu +mFy +gbI +aaa +aaa +aaa +aaa +aaa +gbI +uwp +kJr +gbI +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +fcR +onT +fcR +fcR +fcR +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +dPw +aaa +kDp +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aUn +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +hnm +aWU +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +oWO +oWO +aVu +bxv +oWO +lAu +aaa +aaa +aaa +lAu +oWO +aVu +mQt +oWO +lAu +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nLZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +tuI +tuI +tuI +jvw +lMJ +kDp +lMJ +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +aUn +rrt +rrt +rrt +rrt +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +rkZ +mrw +aWT +bEZ +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +cqg +btO +aWW +mQt +oWO +lAu +aaa +aaa +aaa +lAu +oWO +bKU +mQt +oWO +lAu +lMJ +aaa +aox +aox +aox +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +jvw +aaa +kDp +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +rkZ +bvF +aWU +bEZ +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +tHx +qVL +bvF +mQt +oWO +lAu +aaa +aaa +aaa +lAu +oWO +aVu +mQt +oWO +lAu +lMJ +aaa +eEw +eEw +jTD +eEw +eEw +lAu +lAu +lAu +lAu +aJw +lAu +lAu +lAu +lAu +lAu +lAu +lAu +aaa +aaa +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +lMJ +lMJ +lMJ +tuI +tuI +tuI +jvw +jvw +kDp +aox +aox +aox +aox +lMJ +aox +lMJ +aox +aox +lMJ +lMJ +jXe +lMJ +lMJ +lMJ +lMJ +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +nJU +bvF +aWU +bab +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +bEZ +btP +eqE +gcy +gbI +aaa +aaa +aaa +aaa +aaa +gbI +btS +lOh +gbI +lMJ +lMJ +aaa +eEw +ipg +dnC +gLa +vYs +vYs +qNY +qNY +vYs +vYs +vYs +qNY +qNY +qNY +qNY +qNY +lAu +aaa +aaa +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +kaJ +aaa +nAu +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +jvw +aaa +kDp +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +bYt +ggW +aYE +bac +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +uCj +btQ +bvI +nFu +oWO +lAu +aaa +koF +aaa +lAu +oWO +aVu +mQt +oWO +lAu +lMJ +aaa +eEw +eEw +vAW +eEw +vYs +enr +hIA +tGE +qcc +pYy +vvs +qNY +cNr +fUa +rlx +qNY +qNY +lMJ +lMJ +lMJ +lMJ +lMJ +hzd +lMJ +lMJ +lMJ +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +aaa +lMJ +cMG +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +kHU +kHU +kHU +jvw +lMJ +kDp +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +gbI +mIc +aWU +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +oWO +oWO +aVu +wbu +gbI +aaf +hnL +bEl +oWO +aaf +gbI +gVu +keB +oWO +lAu +lMJ +aaa +eEw +kQH +dnC +tWo +vYs +hCk +dvB +dvB +rhX +dvB +ckP +ckP +kTd +ndr +crh +ioG +qNY +qNY +lAu +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +cMG +lMJ +rrt +aaa +aaa +lMJ +aaa +aaa +aaa +adn +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +kDp +aaa +sBd +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +mwS +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +nFy +aWU +eeG +aZZ +xrX +aaa +aaa +aaa +aaa +aaa +aaa +aaa +uaD +bsk +aqW +aVu +gRz +gbI +oWO +oWO +bEm +oWO +oWO +gbI +btS +ukF +eEw +eEw +eEw +eEw +eEw +lmP +krY +auF +vYs +uxD +rhX +dvB +dvB +dvB +ntS +rlx +crh +crh +wYq +ckP +wZi +qNY +lAu +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +lMJ +lAu +lAu +aaa +lAu +lAu +aaa +aaa +lAu +lAu +cMG +aaa +rrt +aaa +aaa +gnA +sCl +lMJ +lMJ +uyA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +lKu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +llN +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +nFy +aWU +oWO +oWO +oWO +lAu +aaa +aaa +aaa +aaa +aaa +lAu +oWO +oWO +oWO +tbW +jmQ +gbI +bBc +oWO +sIA +oWO +bHH +gbI +aVu +lCU +udI +nwu +vQd +wuH +ulE +tlX +jgG +qaU +vYs +jXb +tKh +tKh +fFp +lJF +lJF +rlx +ckP +ckP +ckP +ckP +pBP +qNY +lAu +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +imo +foO +koc +imo +iCQ +foO +imo +imo +nhZ +qyc +rGr +imo +imo +aaa +aaa +lMJ +aaa +aaa +aaa +uyA +aaa +lMJ +aaa +aaa +lMJ +aaa +aaa +aaa +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +tuI +tuI +tuI +jvw +lMJ +kDp +lMJ +jvw +tuI +tuI +tuI +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +aox +aox +aox +aox +aox +ovq +cWW +ovq +aox +aox +aox +aox +aox +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +gbI +mwl +wdq +aYF +oWO +lMJ +aaa +lAu +lAu +tUp +lAu +lAu +lAu +lMJ +oWO +btR +aWW +lWR +hLQ +mGD +mGD +mGD +gKF +mGD +mGD +qPM +lot +eEw +uHX +uoE +dPr +eEw +eEw +eEw +eEw +vYs +sty +ckP +bmE +ndr +jGD +kiM +ckP +crh +ckP +ckP +wYq +jGD +qNY +lAu +aaa +aaa +lMJ +hzd +lMJ +aaa +aaa +aaa +imo +iNb +nPD +imo +clr +vlT +imo +usJ +ebG +vZT +rXr +jZP +imo +aaa +aaa +lMJ +aaa +aaa +cLY +uyA +cLY +cLY +cLY +cLY +cLY +cLY +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +jvw +aaa +kDp +aaa +jvw +jvw +jvw +jvw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +aox +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +gbI +pan +bvF +aWV +gbI +gbI +gbI +oWO +oWO +oWO +oWO +oWO +gbI +gbI +gbI +jFA +bvF +ogQ +jrE +gwy +qOR +bIh +rqA +qxA +rWW +jiu +hpg +eEw +iOs +uoE +eEw +eEw +xYz +aob +mpF +vYs +cIb +crh +ckP +ckP +dvt +csf +bXE +ckP +ckP +crh +ckP +qNY +qNY +lMJ +lMJ +lMJ +vYs +afd +vYs +lMJ +lMJ +lMJ +imo +jFN +fBQ +imo +uFJ +xEl +imo +lrg +xfr +ayQ +ofL +gxX +imo +lMJ +lMJ +lMJ +lMJ +nDL +sQD +oHg +mHn +mHn +mHn +mHn +mHn +mHn +aos +aaa +anS +nRb +anS +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +lMJ +lMJ +lMJ +tuI +tuI +tuI +jvw +jvw +kDp +jvw +jvw +tuI +tuI +tuI +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +qHD +aox +dJT +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +gbI +ugk +bVK +evw +izn +gWY +cee +gWY +gWY +rqz +gWY +izn +wcw +pam +gWY +iXP +bVK +bVK +xpl +mGZ +blU +eEw +eEw +eEw +eEw +eEw +eEw +eEw +onC +uoE +bPL +sJJ +jUB +bVT +aob +vYs +cxQ +rlx +crh +ckP +ckP +muD +ckP +ckP +ckP +ckP +ckP +mPb +vYs +vYs +vYs +vYs +vYs +uFn +qNY +aaa +aaa +imo +imo +lej +mlg +imo +nhZ +vfP +imo +lzm +xfr +sLc +eSZ +buI +imo +aaa +aaa +aaa +aaa +lMJ +ceV +uyA +ceV +ceV +ceV +ceV +ceV +ceV +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +kyS +aaa +kDp +aaa +jvw +jvw +jvw +jvw +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +qHD +aox +dJT +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +gbI +und +cZt +iLA +xjW +bvI +wPI +bvF +bvF +biv +uQv +wkL +bEt +uBg +ucA +bEt +bEt +bEt +bEt +laY +ibe +kXU +wuH +wuH +uYd +wCZ +nwu +nwu +nwu +lQx +phB +eEw +rLW +tWu +bXx +vYs +nZb +pVg +ckP +fsW +ckP +kuZ +slk +ckP +ckP +evj +ngo +vYs +vYs +vYs +ukS +kjb +vYs +erk +vYs +vYs +lAu +foO +mzH +eBh +hKJ +xhm +hKJ +mtp +imo +bmC +xfr +eQJ +gcQ +vWB +imo +aaa +aaa +aaa +aaa +lMJ +aaa +jTz +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +kHU +kHU +kHU +jvw +lMJ +toM +uQF +jvw +kHU +kHU +kHU +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +qHD +aox +dJT +lMJ +aaa +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +aUn +gbI +gbI +gbI +tEV +aeN +tEV +sJO +qbG +qbG +sJO +qaQ +ylj +igh +sJO +sJO +qbG +qbG +sJO +dSI +ska +gtk +eEw +auF +bsq +bJr +eEw +aqK +aqO +tWo +wvH +xGA +eEw +ikW +eEw +eEw +vYs +jlw +jve +bmy +vYs +uYL +maO +vYs +qyH +vHP +vYs +dEH +vYs +urT +vYs +dXS +fqW +prw +dKv +lEh +vYs +uuw +aHf +kod +qko +ljf +cJM +cPs +mHT +hrM +kIR +gig +jsh +lsH +fyL +imo +aaa +aaa +aaa +aaa +lMJ +cLY +uyA +cLY +cLY +cLY +cLY +cLY +cLY +lMJ +lMJ +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +mNl +aaa +uQF +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +qHD +aox +dJT +lMJ +aaa +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +tEV +udv +tEV +rbg +igh +kXW +eJs +mWl +ylj +igh +qbG +gzF +aNr +ova +sJO +dSI +ska +uIN +eEw +bqf +yhl +ako +eEw +leB +lQY +vMg +aob +xGA +eEw +eEw +eEw +oEK +vYs +vYs +vYs +vYs +vYs +vYs +hUG +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +oEz +gtQ +vYs +lMJ +nIG +bIW +lrn +muP +fEm +kTh +mzj +nIG +cet +vNx +pca +iwb +wHN +imo +lMJ +lMJ +lMJ +lMJ +nDL +sQD +oHg +mHn +mHn +mHn +mHn +mHn +mHn +aos +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +qHD +aox +dJT +lMJ +aaa +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +tEV +lFZ +tEV +vRA +hzO +bEe +uKr +miW +kGx +igh +qbG +rps +igh +swE +sJO +qbG +ska +eLm +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +tWo +mMH +dVB +ouC +uda +cEd +ooa +tpU +rTr +qKJ +ooa +imS +gPK +vYs +cCk +qUR +mmb +gLu +lvY +bXE +uRU +cCk +vYs +vPJ +bXE +cAV +vYs +aaa +imo +imo +nhZ +gHg +hnj +mlg +imo +imo +imo +imo +cgS +imo +imo +imo +aaa +aaa +aaa +aaa +lMJ +ceV +uyA +ceV +ceV +ceV +ceV +ceV +ceV +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +tvJ +vSZ +tvJ +lMJ +aaa +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +tEV +lFZ +tEV +sDC +igh +bxE +dtk +mWl +hQa +qIH +thS +bse +sSH +qaw +sMw +vJT +kTc +wEM +seg +dWo +myT +enx +dTH +qLD +hqy +eEw +amZ +kTO +vYs +vYs +vYs +vYs +vYs +vYs +cMJ +vYs +vYs +vYs +gtQ +ebL +cCk +bXE +bXE +cOY +bXE +vyN +bXE +cOY +vYs +vYs +goS +gtQ +vYs +lAu +foO +mMO +jwJ +wHb +cwg +gYL +ngK +imo +lAu +foO +tdh +foO +lAu +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +jTz +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +tPH +tPH +nRb +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +tvJ +jzQ +tvJ +lMJ +aaa +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +eHf +lFZ +tEV +tbS +igh +nib +mWl +mWl +hQa +nuC +vNW +rps +jXh +ska +kpJ +veo +tbw +pJy +seg +uyH +jkG +hzx +pXX +dSM +jQL +eEw +auF +xGA +vYs +rlM +vHF +ici +eLR +gZa +nVt +kOE +iCv +nNG +jPa +vYs +jSC +bXE +nsW +rue +bXE +cOY +rig +bXE +vYs +sFA +fuf +gtQ +vYs +lAu +eBo +nJp +vOL +erY +rpB +rsW +aVq +imo +lAu +xfx +tdh +xfx +lMJ +lMJ +lMJ +lMJ +aaa +aaa +lMJ +gtC +uyA +gtC +gtC +gtC +gtC +gtC +gtC +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +lMJ +tvJ +cbq +tvJ +lMJ +lMJ +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +eHf +uUP +tEV +igh +igh +uMX +mWl +bYj +nCt +omt +sJO +aqh +dXr +omU +act +sJO +svD +puY +oXQ +vYQ +lMf +lhC +tNa +uyH +nXv +eEw +qtl +xGA +vYs +wTt +dvt +yiC +hvt +vYs +joV +vYs +bbk +vYs +gtQ +vYs +nvp +bXE +bXE +bXE +rig +gLu +bXE +gLu +vYs +vYs +hdX +wyP +vYs +lAu +nIG +gAR +dLn +vix +bFI +uWm +nHx +imo +lMJ +xfx +weH +xfx +lAu +aaa +aaa +lMJ +lMJ +lMJ +ruY +sQD +oHg +mHn +mHn +mHn +mHn +mHn +mHn +bgS +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +tvJ +tvJ +aAA +tvJ +tvJ +lMJ +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +eHf +lFZ +tEV +uHD +igh +iOl +onR +lWm +kGx +igh +sJO +qbG +kfQ +qiT +qbG +sJO +vMD +aaV +seg +seg +bQK +phL +phL +ihg +ihg +hfx +rbl +xGA +vYs +nqV +sCL +bXC +tdY +vYs +vYs +vYs +qnO +vYs +qhF +qLY +vew +vew +dyE +oWP +ueg +geT +bXE +bXE +jLv +mqo +bqC +gtQ +vYs +lMJ +imo +imo +nhZ +veO +umD +mlg +imo +imo +lAu +xfx +tdh +xfx +lAu +aaa +aaa +aaa +aaa +aaa +lMJ +wlf +bKn +wlf +wlf +wlf +wlf +wlf +wlf +lMJ +lMJ +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +xtw +aaa +fcJ +aaa +wNc +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +tvJ +oCA +oHe +lvR +tvJ +lMJ +aUn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +tEV +lFZ +tEV +tEV +bsB +tEV +tEV +sJO +ese +igh +eYw +qbG +trC +kmQ +qbG +dKa +ska +oIL +yfg +seg +bNv +mkZ +bqR +dSM +cGq +eEw +fRq +xGA +vYs +wzA +bXE +mGO +iZM +inl +cZE +oNK +jMc +vYs +lvJ +vYs +yfv +riP +bXE +lID +bXE +plC +rig +uRU +xsx +mqo +duH +gtQ +vYs +aaa +aaa +aaa +lMJ +lAu +lAu +lAu +lMJ +aaa +lAu +xfx +tdh +xfx +lAu +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +uyA +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +tuI +tuI +tuI +jvw +aaa +xfX +aaa +kyS +tuI +tuI +tuI +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aox +auC +auC +mgK +auC +lMJ +lMJ +lMJ +tvJ +brv +kXP +cBZ +tvJ +lMJ +aUn +aaa +aaa +aaa +aaa +aaa +aaa +keh +aaa +aaa +aaa +aaa +aaa +aaa +tEV +vBB +acd +sCW +hNA +eTJ +bve +cMn +wom +igh +eYw +sJO +oQj +jvG +sJO +dKa +ska +mBr +rqX +seg +ivm +jEF +jhu +hqy +dsH +eEw +lQm +xGA +vYs +msV +bUU +sEQ +pIO +vYs +ipo +czU +plT +exc +xTH +vYs +ovU +jkQ +cBC +eke +mrv +tFJ +hev +cPS +vsy +mqo +jqA +wyP +vYs +vYs +vYs +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +lAu +uZL +pFr +mgF +lAu +aaa +aaa +aaa +aaa +aaa +lMJ +gtC +uyA +gtC +gtC +gtC +gtC +gtC +gtC +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +jvw +aaa +hih +aaa +jvw +jvw +jvw +jvw +aaa +aaa +aaa +aaa +aaa +aJw +lAu +aaa +lMJ +lMJ +keN +dnO +sQy +auC +aaa +aaa +lAu +tvJ +hZM +bnw +lCs +tvJ +lMJ +lMJ +lMJ +lMJ +msN +xvL +woB +msN +woB +vtf +msN +lMJ +lMJ +lMJ +lMJ +tEV +lFZ +dtZ +pbr +tHg +pII +tEV +mFA +gzK +tnr +dZP +sVL +bDS +htH +dKa +dKa +ska +iAc +seg +seg +seg +eEw +eEw +eEw +eEw +eEw +eEw +xGA +vYs +kXu +hIt +vYs +vYs +vYs +vYs +nsN +vYs +vYs +jZG +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +vYs +oEz +gtQ +vYs +hdZ +vYs +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +imo +imo +bhY +imo +imo +lMJ +lMJ +lMJ +lMJ +lMJ +ruY +sQD +oHg +spJ +spJ +spJ +spJ +spJ +spJ +bgS +aaa +anS +anS +anS +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +lMJ +lMJ +lMJ +tuI +tuI +tuI +jvw +jvw +tMu +hih +jvw +tuI +tuI +tuI +lMJ +lMJ +lMJ +qSW +aif +qSW +gnJ +qSW +qSW +qSW +auC +aqH +sKX +auC +auC +auC +jfn +tvJ +tvJ +hIV +hFD +tvJ +jfn +tvJ +lAu +lAu +tTK +dIW +tvU +tTK +dmW +xBn +tTK +lAu +lAu +bDJ +bDJ +tEV +wkS +tEV +tEV +ehD +tEV +tEV +uPr +xqf +wkK +qKT +iBy +qEh +gwC +mFF +tQo +xSY +fjT +bFu +wlU +oOc +eEw +cBk +qyP +bOi +aAQ +eEw +jWw +aob +eEU +xJs +vYs +czC +qdB +wUa +cKN +gvs +vYs +pup +kjk +kjk +kjk +kjk +kjk +kjk +oRR +kjk +kjk +kjk +puj +kjk +pYG +vYs +mAY +vYs +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +imo +sfo +vpL +pKk +imo +aaa +aaa +aaa +aaa +aaa +aaa +wlf +uyA +wlf +wlf +wlf +wlf +wlf +wlf +lMJ +lMJ +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +jvw +jvw +jvw +jvw +aaa +hih +aaa +jvw +jvw +jvw +jvw +aaa +aaa +aaa +qSW +xMD +tjq +tIc +alx +xCe +anU +auC +auC +lSQ +auC +auC +auC +vtF +xVs +xJN +imY +umr +xKP +htC +tvJ +tTK +tTK +tTK +pXM +kGn +tTK +kGn +syL +tTK +tTK +tTK +bDJ +hqi +kaE +wIe +wnp +fzJ +hfd +qWn +fzJ +vhG +vhG +vhh +jEy +byU +vhG +bFu +eNe +bFu +bFu +jUK +jUK +bLT +rPX +eEw +xYz +jhV +wvH +aqK +eEw +nUG +mUr +aob +eXC +vYs +bYL +bZQ +wzb +muD +suA +vYs +gEN +oaY +oaY +oaY +oaY +oaY +oaY +wXk +oaY +oaY +oaY +mLd +syW +gEN +vYs +eQQ +vYs +aaa +lMJ +lAu +lAu +lAu +lMJ +lAu +imo +oMT +tdh +cQR +imo +aaa +aaa +aaa +aaa +aaa +aaa +aaa +uyA +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +kHU +kHU +kHU +jvw +aaa +hih +aaa +jvw +kHU +kHU +kHU +aaa +aaa +lAu +gnJ +gnJ +qSW +qSW +qSW +nsZ +anV +xba +iKu +ksR +auL +mTh +auC +awP +xVs +bov +aJG +kpF +xVs +aDW +tvJ +lJI +oUK +oUK +jzZ +xUy +iPy +xUy +nET +pGU +pGU +mTX +cPm +stv +bDR +qrH +fzJ +fzJ +gKx +hOe +omA +bkg +lDf +qxd +eJq +lCP +apj +bFu +qpo +lng +lDs +lhM +bFu +nTv +bFu +eEw +qQS +aof +aob +tWo +eEw +xGA +sQI +vpO +khu +vYs +jpD +qdB +dMI +cdh +bUV +vYs +gEN +oaY +xkO +wEv +wEv +wEv +aip +uRS +oLt +rXF +oaY +vYs +vYs +gEN +vYs +vYs +vYs +qNY +vYs +qNY +qNY +qNY +vYs +qNY +imo +tCx +xFu +tVc +imo +aaa +aaa +aaa +aaa +aaa +aaa +lAu +uyA +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +hih +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +lAu +gnJ +cCS +bQc +fUs +oLr +amP +anW +dpp +tOO +pTs +aRG +bQI +auC +fcg +xVs +bov +xVs +kpF +ybv +tvJ +tvJ +vSJ +wfw +rZL +wfw +wfw +wfw +wfw +wfw +jWm +wfw +wfw +wfw +hGB +bDJ +fzJ +fzJ +gSx +qoo +xxG +omA +jIl +lDf +qxd +tRa +lCP +wNU +bFu +pjx +fbY +bLT +kIF +bLT +ohu +jqN +eEw +bLe +rLW +vMg +aob +eEw +xGA +jOg +eEU +fsS +vYs +vYs +vYs +koy +bXE +ipl +vYs +gEN +oaY +aAW +jgD +jgD +dtT +jgD +hqq +bSx +pjP +oaY +wNe +ftH +gEN +idS +vYs +gAT +uNH +bXE +iFu +bXE +jkN +gAT +tTP +imo +imo +cxS +imo +imo +gKU +qeC +qeC +gKU +aaa +lAu +pMT +eBA +pMT +lAu +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +hih +hih +hih +aaa +aaa +aaa +aaa +aaa +lAu +gnJ +aii +mKf +aki +tPe +nsZ +anX +siw +xZo +jQQ +qil +piE +auC +siJ +hew +sGT +drD +thV +rbu +hmD +ptp +ndJ +bDR +bDR +xpO +dxt +xzU +kKA +vPl +dxt +xzU +kKA +vPl +aQO +jou +hAr +kYs +qSl +rqW +uvB +fzJ +fzJ +mtV +qxd +xJe +lCP +wNU +bFu +qxC +bFu +uLg +bFu +qVN +bFu +eVL +eEw +fEo +rLW +rLW +jNC +qHM +fmL +cMw +rKT +aob +vYs +cRB +vYs +epV +lID +vYs +vYs +gEN +oaY +lyW +lyW +kjq +rqx +rqx +sfh +oaY +oaY +oaY +kpn +vGW +gEN +qNi +vYs +bXE +lJE +qie +qie +hue +qie +qie +bUu +rTx +rlr +agu +uEb +pwa +lMV +rLa +mfb +gKU +gKU +lAu +pMT +czd +pMT +lAu +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +hih +aaa +aaa +aaa +aaa +aaa +lAu +gnJ +pBU +ajf +tpj +alA +wRS +lxR +auC +eRi +pTs +qiQ +bCW +kpQ +hBQ +hBQ +rKF +jAH +wMm +kAg +oAA +oEW +mAe +dwW +feh +izo +ahY +mhd +ahY +pXp +inQ +ikg +ahY +ikg +fMh +sTl +oZO +ilL +ilL +llF +jbh +lLi +fzJ +fzJ +qxd +xJe +nJQ +eEw +eEw +eEw +eEw +iZR +bFu +bhk +bFu +wkM +eEw +vrB +fEo +wvH +bPL +eEw +jsZ +oWn +hLp +aob +cMJ +bEq +vYs +bXE +aOi +vYs +vdh +aMg +oaY +eom +nhL +uXR +qND +bhN +qND +oaY +cnZ +flx +flx +flx +pAv +kjk +kjk +kjk +smJ +iTL +ajg +iwS +iTL +iTL +sSB +xqc +sSZ +nMm +bZb +jzD +sHr +frs +nAI +mmU +oRi +rFF +pMT +rWX +pMT +rFF +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +nRb +tPH +anS +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +aaa +tMu +aUn +aUn +aUn +aUn +aUn +aUn +gnJ +nEj +hGa +yka +geQ +suJ +omx +auC +jZB +jlh +att +auC +auC +auC +iiD +gEq +xVs +jfp +tBk +fxx +fxx +fcd +fcd +xDQ +pWV +oMU +gem +kKA +mtt +dxt +wfw +kKA +tzM +gem +qRS +hAr +qUM +qUM +qUM +qUM +rlY +stT +fzJ +fDg +xJe +vhr +eEw +aoe +mKG +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +tWo +uct +nwu +oWn +vYs +vyN +vYs +rzv +svq +vYs +dSh +xqc +oaY +wAD +oaY +oaY +oaY +wQx +wQx +wQx +ylU +wGv +wGv +wGv +wGv +wGv +wGv +suu +suu +eJe +eJe +qsP +eJe +eJe +eJe +eJe +moM +ovf +lJX +lJX +lJX +lJX +lJX +lJX +lZL +rFF +jlX +xaL +qOd +rFF +aaa +lMJ +aaa +aaa +aaa +lMJ +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +wNc +lMJ +lMJ +lMJ +lMJ +tzJ +pfg +pfg +pfg +auC +qws +auC +auC +auC +auC +auC +pTs +att +auC +mpk +auC +fDi +jkH +dmL +dpG +pBD +fxx +rmY +trh +pxQ +pxQ +mBc +gcj +hRO +sAB +wfw +aqv +oWC +sAB +tzM +gem +bra +hAr +dZf +bEo +jry +qUM +lqz +mNp +fzJ +qxd +gCe +vco +wCZ +qbO +tsY +nwu +nwu +qiV +oWn +tWo +qES +nwu +nwu +nwu +nwu +nwu +nwu +nwu +bss +tWo +xGA +vYs +vYs +vYs +vYs +vYs +vYs +uNA +dDQ +nDu +qTs +hks +lIT +kMp +wQx +eku +xyv +cwp +wQx +neE +gNZ +dDw +erx +wQx +ehW +fKA +eJe +qHB +xXv +bmY +ntu +dfG +eJe +snn +jQu +lJX +mAz +pNV +ntB +uoc +lJX +aXf +gFl +ggT +cLQ +roF +rFF +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +uGu +aaa +lAu +tzJ +tzJ +tzJ +nfF +mmf +xgG +auC +qZf +xZo +oaE +qtK +xZo +ukM +pTs +bOJ +xZo +srZ +auC +auC +oct +auC +auC +auC +auC +owc +sXu +wyI +fcd +oTz +tzM +gem +wfw +wfw +wfw +wfw +wfw +tzM +gem +bkZ +fzJ +fzJ +fzJ +omA +omA +fzJ +fzJ +fzJ +pQU +aJO +ccN +eEw +fEC +aoa +tWo +hjd +owG +lAB +nwu +bss +aoa +aqO +psX +tWo +bPN +vMg +bTt +rfA +tWo +qXf +nqI +lCk +kRJ +puj +puj +uaE +wTq +xqc +oSZ +iPi +qqm +xfg +xfg +wQx +wnJ +mnq +fEq +wzL +oyj +oyj +oyj +moz +wQx +qVC +jrN +eJe +jzs +huH +fSg +fSg +aoR +tNA +hLR +jQu +bbc +ccw +uxl +gGk +hIO +aaN +sdQ +rFF +xSs +nmf +mUP +rFF +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +vMN +sBF +sBF +oPT +rYy +hWZ +xwd +ahs +nIe +wFo +bem +xbk +hjI +aad +hjI +aad +rNE +gFy +dgt +lZy +auC +hCI +num +tca +xZo +hPP +auC +ojc +mzd +aSa +fxx +qEg +kSr +rGT +lmx +lmx +fgb +pWV +wfw +tzM +gem +wIx +kYq +ktO +oMe +sPo +sPo +sPo +cCd +puO +pFA +xJe +tbb +eEw +eEw +eEw +eEw +eEw +eEw +eEw +bGq +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +eEw +ajU +xBV +xBV +xBV +xBV +xBV +xBV +xBV +xBV +hRk +cHS +qqm +xfg +rZp +wQx +eTv +dQe +rXj +wzL +pZY +jvH +pOD +uOb +bnQ +psu +gnp +eJe +pts +eXG +dLt +vme +kRW +eJe +fUF +jQu +bbc +hWV +euO +euO +elh +lJX +lZL +gKU +gKU +gKU +rFF +rFF +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +tzJ +tzJ +tzJ +qAm +tQr +xwx +xKE +dnd +qkk +bMj +frQ +uuP +dou +auC +vNb +oqj +auC +auC +qlY +num +aRG +xZo +xZo +auC +rLq +epb +mUO +fjt +vwz +tzM +nIm +hMl +aqU +opi +vWs +lmx +kSr +rGT +lmx +lmx +gGr +mQU +kte +pjh +kte +hpk +pJF +woP +bDA +fhj +sbV +nxp +kBZ +gdY +rnA +fPm +blh +oMN +qqz +xnK +eqw +qlB +sbV +kjv +uDt +ejn +mht +eEw +ajU +xBV +lfh +gGh +xng +pXR +lat +oXW +rMY +nZC +qJR +akR +xfg +lIO +wQx +wnJ +dQe +fEq +wzL +qNP +foa +nEJ +lbS +wQx +bbE +gnp +eJe +gMQ +iiE +mjN +cHM +poJ +eJe +iHk +wQw +lJX +hvG +dAX +rUW +xPO +lJX +lZL +gKU +txp +xVk +gKU +lMJ +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +wBf +rrt +rrt +rrt +tzJ +pfg +pfg +tjs +jeN +auC +auC +pax +auC +auC +auC +auC +aJH +nNQ +fNC +aad +fNC +eLv +aHe +wKi +nMs +auC +auC +auC +auC +auC +bVF +mbD +fMI +bVF +bVF +bVF +bVF +meI +sOj +oiX +xNS +rzm +iVd +pEz +wbs +tRV +qZc +uHx +uHx +gJz +gOE +ino +sbV +toe +paI +oMN +nbM +oMN +nbM +oMN +qqz +vql +sys +nkK +sbV +pzG +wPy +pHF +opO +eEw +ajU +xBV +tov +kol +ngy +eqj +lbH +aIq +iyx +rKJ +qGo +jwP +nDn +cFa +wQx +xVS +iMT +pjX +wQx +byL +kgz +izR +xya +wQx +rWO +nsx +eJe +qPl +vsc +qfp +uxY +aaC +eJe +nRM +jWf +mzP +sjm +djp +cBS +tJb +lJX +vsx +vWw +aGx +bCY +gKU +lMJ +aaa +lMJ +aaa +lAu +lAu +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +mji +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +auC +ylh +aRG +mwi +auC +nwB +jeN +wmn +xFC +djH +mJA +dnu +auC +fSh +fCV +hMT +fNC +qvg +fNC +yau +auC +pmF +wsN +dvy +ihl +vFN +mut +bVF +rXn +gIv +mJo +uHx +uHx +uHx +dAx +pSd +eGZ +jwj +qZz +pJF +fqH +jrs +avH +cZb +tSp +tSp +tSp +tSp +pzn +lgw +lgw +lgw +lgw +lgw +qwS +pfB +spq +psh +edy +rwN +eEw +ajU +xBV +dLF +jwv +jXs +ajw +xpn +gGL +hXT +ibE +qGo +gtf +hXD +oNw +wQx +wQx +dzo +wQx +wQx +xDC +wQx +wQx +wQx +wQx +suu +prp +eJe +eJe +eJe +pCk +fgt +eJe +eJe +wCc +ozu +lJX +lJX +lJX +lJX +lJX +lJX +kWr +bUO +far +tKv +gKU +lMJ +aaa +lMJ +noE +msw +msw +msw +noE +msw +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +erf +auC +gYc +xzG +dnu +auC +ylX +jeN +jeN +jeN +jeN +jeN +auC +auC +auC +auC +auC +auC +auC +aQI +seB +auC +eHZ +wsN +dvy +kJM +cBv +pvn +bVF +svj +xTV +baW +uHx +wHP +jLD +hLF +nHy +mLC +tSz +dQF +uHx +vMO +vcj +mma +qgY +vIC +vIC +eql +vIC +rmd +vIC +vIC +vIC +vIC +vIC +eWb +nXk +jDX +pXN +nCs +hCQ +eEw +ajU +xBV +xBV +oft +fCW +dtW +oNl +oHZ +bco +udW +fkN +txd +txd +mPm +qQg +eJQ +wlX +qJb +qJb +tZz +pFM +pFM +pNm +sFr +mTq +pNm +vXs +gTQ +fnq +iHk +iDd +iDd +uzw +iDd +bhG +ltw +iHk +iLH +moM +aGx +far +gnO +lZL +gKU +gKU +jpJ +jpJ +jpJ +jpJ +noE +pvR +akT +akT +noE +lVr +msw +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +auC +auC +auC +auC +auC +iMx +aaa +jLj +aaa +aaa +aaa +aaf +aaa +aaa +aaf +aaa +aaa +auC +xZo +seB +auC +mXc +sqo +tGP +irN +xiv +utO +bVF +dhV +tmW +aXq +tlT +iwX +eGZ +bdm +xNZ +pmN +tiE +eJy +uHx +xJg +vzj +iMn +sbV +sqV +oMN +sbV +unA +xls +vnR +qlk +dub +oMN +giP +oMN +sbV +eVe +qAC +jIZ +nmX +eEw +ajU +aZF +xBV +xBV +jLU +hks +hks +hks +hks +bXW +xxi +oOz +oOz +oOz +dEO +wMi +ucb +mAJ +kzs +kLn +gMN +aKY +rQm +rQm +rQm +rQm +ohq +kyd +nxX +aot +rIu +kfO +iZU +rIu +nlq +cOn +hrr +dMq +moM +gkj +gkj +bQw +lZL +jpJ +vzo +fpF +jZv +sIO +dzw +noE +mvJ +wkc +mvJ +noE +iOP +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +eOt +aaa +lMJ +lMJ +aaf +ksk +ksk +ksk +ksk +ksk +oBn +aaf +auC +qmo +ogt +uCS +sYe +tUQ +gAb +sHw +esq +bVF +bVF +pQD +tmW +aXq +fHs +fzn +eGZ +hYi +lHO +vBb +gNY +oEY +uHx +rOj +reb +fhz +sbV +lTG +gUu +sbV +jtP +xls +lgw +ueY +dub +oMN +giP +pJu +sbV +oMN +ukH +eVe +veL +eEw +oPk +vBh +eEw +jAI +hks +tYl +keF +bRq +wEY +iWy +nLT +hks +dAj +dAj +ohR +hks +qGN +lqW +edM +eBW +tBT +jkj +sFK +rIA +rIA +rIA +lqW +kAf +moM +gRg +jSk +hUW +dkB +otg +wZa +bCN +mpe +vfF +moM +gkj +aFO +aFO +mPP +rja +ygw +jHS +ccH +iEG +sHp +noE +noE +myp +myp +ykQ +epk +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lAu +lAu +lAu +lAu +aaa +aaa +aaa +aaa +ksk +dfl +lmF +vVM +nYl +ksk +lAu +auC +auC +cPD +auC +lra +njC +lcW +knc +uJq +bVF +dhy +aUm +tmW +uvH +xRS +mLC +mLC +xBv +wUP +vBb +afG +kAt +pJF +fKc +sZj +uRt +sbV +lTG +gUu +sbV +tmg +xls +lgw +pJq +unA +jFX +gck +hVr +sbV +lOe +bRg +qQn +osN +iwW +rUQ +tWo +azJ +aob +hks +dcd +ncc +ncc +pnS +bjP +qGo +jXw +dAl +cwJ +qdT +hks +dRa +dRa +dRa +dRa +lEW +mIJ +lEW +lEW +lEW +lEW +fRO +pjU +fRO +asr +yis +hUW +tGC +ygU +wZa +bCN +gwL +moM +moM +far +far +far +doD +jpJ +jpJ +jpJ +jpJ +sDY +jpJ +noE +euv +myp +kjY +dYv +rJC +msw +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +eVo +eVo +eVo +geF +rfu +hAu +oWB +lAu +aaa +aaa +aaa +ksk +qrg +cpi +cpi +ucI +hvO +iQa +aDH +euG +pMe +bVF +rFS +cqh +nny +cBv +iPC +uhj +dhy +rVn +eKb +jdn +lao +hel +eGZ +pcU +phI +vBb +ujL +uHx +uHx +fvJ +xJe +lCP +sbV +lTG +gUu +sbV +wXv +xls +lgw +oMN +qNF +oMN +oMN +mQx +sbV +sbV +sbV +sbV +sbV +eEw +bDt +eFG +eEw +eEw +hks +ocF +dGo +fLA +nCl +oaN +kKl +idi +ncc +fuD +cSD +hks +cRl +kJt +sba +xfZ +lEW +gdd +iyo +hWD +kTX +lEW +wxB +qhL +fRO +mtN +kXB +hUW +pVk +eqF +wZa +neb +lRX +moM +mOt +gkj +mUx +kiG +ddC +jpJ +ivO +iRx +xTF +sjF +pOz +noE +eVO +dYv +iDZ +dYv +sEy +msw +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +eVo +oCQ +eeM +bpk +bpk +kep +hTT +oWB +lAu +aaa +aaa +ksk +trx +uWn +uDw +bvh +tGB +kPg +awX +jqs +ygL +bVF +mey +cBv +vpC +gEf +bDs +bVF +cyR +rVn +tmW +mgJ +lao +ojx +dhf +pHL +eGZ +vBb +oBT +hHy +lao +cog +dDA +lCP +sbV +lTG +gUu +sbV +gdY +xls +lgw +tTL +jRT +vkc +oMN +xBd +sbV +gDn +ofl +pfv +sbV +lJm +bDt +eEw +eEw +aob +hks +hks +myv +myv +hks +rJd +kKl +idi +ncc +nhu +eXX +hks +cRl +sba +pig +rLn +lEW +lod +mMp +mMp +esp +lEW +cvr +kKP +fRO +tTt +oDw +hUW +jCZ +wCp +wZa +bCN +mpe +moM +ulL +noB +umK +nCP +ccv +jpJ +kKR +hIa +cjI +ebi +kvu +noE +lzZ +gfx +jJm +dYv +xuO +msw +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +aaa +aaa +lAu +lAu +lAu +geF +qMU +rkA +aBF +tRu +wKf +ona +nJy +lAu +aaa +aaa +ksk +mgx +fDG +fDG +ffB +hvO +lBB +jiI +lpt +vju +bVF +vAY +vAY +bVF +bVF +bVF +bVF +eND +uTI +dit +srK +uHx +uHx +uHx +iaB +nLg +vBb +eGZ +beX +qFb +vZx +lwP +upD +sbV +cyx +oMN +oMN +oMN +tED +lgw +oMN +vUY +cLT +uRq +cXH +nDl +slZ +wpX +mpm +sbV +npr +uxK +wQa +aob +khu +hks +ocF +dGo +fLA +nXc +oaN +kKl +idi +ncc +oeV +mkY +hks +xqa +yjB +nMz +uqN +lEW +wpe +wuW +lJk +jhh +oPW +kaW +klR +fRO +gfo +gfo +gfo +puX +puX +puX +otT +mpe +moM +jBE +gkj +wUq +yid +wwX +rFA +wAA +ryf +iPI +rys +fgl +noE +noE +pkk +noE +sRp +kas +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +aaa +qxl +qxl +sSE +eIL +qxl +eVo +vjB +hWU +dBB +wYk +nOZ +mlU +vZg +lAu +aaa +aaa +ksk +vis +mCi +ixT +ewG +ksk +lAu +lIj +fIC +rAu +ePb +bRj +pLZ +bCO +kFc +jly +lpg +fIC +wcO +mlD +gFr +hkU +cKF +uHx +lrI +nUa +vBb +wrv +hef +lao +cDp +xJe +lCP +sbV +mhh +eJa +kjX +oMN +xls +lgw +mEX +sbV +sbV +sbV +sbV +sbV +wPd +fTA +mPM +sbV +eEw +hXI +eEw +aob +aob +hks +dcd +ncc +ncc +itB +uop +kKl +jBS +usl +pzK +xWD +hks +wZw +ehB +mgl +rCg +lEW +bEz +rwU +jmy +mox +lEW +gVI +miQ +fRO +cGG +rBb +gfo +anZ +vKY +puX +bCN +mpe +moM +fqq +gkj +qtT +smY +lUU +jpJ +tow +nIw +qXx +nre +jQC +wPD +tJS +gfx +noE +wVU +eJC +gPs +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +dAw +dAw +qxl +kfr +wmC +kES +atj +qxl +dAS +pWh +wNm +wYk +hWU +wbS +eVo +lMJ +lMJ +lMJ +ksk +ksk +ksk +bDa +ksk +ksk +lMJ +jei +kQx +ylJ +xAZ +uYb +hMn +ygR +lgg +ush +mPK +lgg +lgg +lgg +iKb +hBu +aXq +uHx +dZs +lao +lEm +lao +lao +lao +aDn +joP +iEd +woy +sbV +sbV +sbV +pJv +tFG +cpC +pJv +sbV +oPL +jqq +jqq +sbV +sbV +sbV +sbV +xIa +jKl +dkc +eEw +lQm +aob +hks +eBj +ljV +xvS +rAP +iWy +oZa +hks +iXn +iXn +dNK +hks +gYv +jrz +gYv +gYv +lEW +wMh +cxg +lmS +oFa +lEW +fRO +fRO +fRO +wdR +lOb +gfo +fch +blC +puX +bCN +lni +moM +lbp +uBm +kOh +smY +fLl +jpJ +uSZ +jpJ +jpJ +jpJ +fxe +noE +rSR +gfx +noE +noE +noE +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +dAw +fsz +rUU +qxl +qvk +agn +fjf +wyg +bbI +ndQ +bWs +bQV +uNM +cBz +lkE +eVo +aaa +aaa +aaa +aaa +kdC +aaa +aaa +aaa +aaa +aaa +dey +dey +dey +ghD +dey +tPR +tPR +dyA +dyA +dyA +dyA +tPR +tPR +wvR +xjJ +vTD +gdh +uQd +uQd +efk +uQd +xuK +xuK +pVa +gbZ +nJj +fUf +goe +xER +bgf +goe +hFB +nqt +goe +dVR +goe +goe +goe +daE +paw +fyi +lFY +paw +jzz +oss +vuC +bYS +wnW +hks +hks +hks +hks +hks +yfq +dJk +hks +sAF +sAF +sAF +cqi +bJs +rxV +uRV +gIa +lEW +lEW +lEW +lEW +lEW +lEW +cAX +qGg +moM +pVr +qjS +gfo +moO +pRm +puX +bCN +ovM +moM +jzD +jzD +jzD +smY +mDK +jpJ +bWS +jpJ +kgD +llX +mWn +noE +noE +tTH +noE +noE +ooZ +noE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +bQl +kWd +pvt +xFj +wgs +ofs +ofs +hyg +eew +ipP +gBE +wYk +qpO +vVc +scC +eVo +lAu +lAu +lAu +lAu +lAu +aaa +aaa +aaa +aaa +aaa +dey +xlr +fpo +gGW +vRg +tPR +tWF +wWx +rQr +nnj +cmx +sKu +dyA +wvR +vxr +fIC +kpp +oDj +oDj +oDZ +oDj +oDj +oDj +nex +maW +cFt +kCX +eGp +qjJ +kfF +kfF +jso +cbd +jOT +pte +ofZ +eGp +kfF +ntc +fvm +wXr +wXr +pPK +rVf +mJM +tFu +jWK +mmu +pCg +gMh +gMh +xpo +sjb +ifz +gea +vBC +swX +swX +swX +tIE +swX +xzK +fuk +oFP +ang +cca +fwi +fxv +avt +moM +kMb +moM +moM +drx +khc +gfo +ris +rdC +puX +cCn +bHM +moM +rfH +tSL +mlS +smY +uKu +gKU +dmB +dmB +xQK +jpJ +jpJ +dmB +gYu +ayK +wRh +iFn +yaW +dmB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +fKp +ovO +iRp +qxl +eDm +iwn +knh +hyg +dZa +ipP +veA +mFH +iUH +mFH +veA +veA +iqO +jKC +sBq +pNd +vXg +daR +aUn +aUn +aUn +aUn +dey +vUC +cgk +lYL +lvu +tPR +viH +wWx +wpP +kah +kYK +tQe +oet +wvR +bSu +fCd +qxY +gOr +gOr +jAj +lUJ +hlY +vlh +lUJ +kHg +lUJ +kNF +lUJ +juZ +sfT +lUJ +syr +sgO +xEa +rqv +bmK +rlf +csn +qAU +nPE +wzM +xPb +oFc +iRv +plg +qiU +oXh +vwO +qsa +qsa +qsa +xpo +uzX +mhO +rRm +xyt +cCO +fta +cca +pKA +cca +nUN +aWt +bFg +qFP +irL +oZK +mmx +uMI +ejH +uMI +pRf +tQl +uMI +uHO +cmE +uMI +uHO +kLU +oxT +xeI +qYv +kpR +idI +idI +rfk +atB +hvQ +dmB +jnX +uXo +xkC +fPu +wCP +fPu +hie +fPu +aDo +twK +dmB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +bQl +kWd +viV +qxl +hCT +pFI +iwn +jxn +nfl +ipP +vrc +iJL +imF +iJL +wGP +ihM +mqb +pMA +emU +mqb +myS +imj +aaa +lMJ +aaa +aaa +dey +tkx +cgk +pYZ +cgk +tPR +wWx +wWx +bef +dra +cmx +khH +sid +wqy +wpG +bFS +jBt +caH +nfc +sEj +kgl +dyx +dyx +icp +dyx +dyx +sgn +dyx +dyx +dfr +pGW +eeW +oLE +bNd +bNd +lcG +akc +bNd +bNd +cHT +cHT +xPb +oFc +fVC +xGs +bjz +cdp +cdp +vLu +vLu +cdp +cdp +mya +vKW +aoA +tdI +lEk +lEk +mJF +lEk +lEk +mJF +lEk +lEk +vyS +qcw +cqi +srg +hzX +wCc +iHk +swm +aYu +kmy +pDh +hzX +iHk +iHk +iHk +iHk +tMP +moM +gKU +gkj +xVk +lNZ +pSV +npI +dmB +dgP +twa +rJk +eFl +dpm +xkE +ayK +kQw +ohh +tiR +kuN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +fKp +klr +gZI +qxl +bAf +uvp +dby +jSP +nsQ +ipP +cVg +tCp +wwq +eCP +fBb +rGS +lHy +lHy +dTu +lHy +guk +siD +lAu +lMJ +aaa +dey +dey +kzm +cgk +oEg +fqh +xVB +wWx +wWx +wWx +wWx +vRu +jsH +jrl +pLy +nwZ +gIr +jBt +oud +lKs +syw +oud +dyx +ixb +eRW +prB +qZQ +lJl +nNE +dyx +pAn +kyU +var +aCK +twF +aaa +lAu +aaf +aaa +aaa +aaa +cHT +loX +oFc +iRv +nyn +xnj +cdp +pYB +vSw +jEb +oqH +cdp +xYX +qsE +tCy +sqF +lEk +ckE +ekq +pkb +unw +tIP +csa +mJF +uDe +oFG +cqi +cqi +cqi +cqi +vaT +jOG +dpX +pLO +moM +moM +gFW +gFW +gFW +uKS +sfN +moM +xPs +xPs +xPs +xPs +xPs +lZL +dmB +mNm +twa +reF +gWb +qbL +gWb +hie +kQw +rAV +tiR +kuN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +bQl +kWd +kWd +qxl +iiL +iwn +grw +jSP +cpX +ipP +hNe +eCP +eib +lcq +dMJ +kvZ +cRQ +cRQ +opj +cRQ +xNE +siD +lAu +lMJ +aaa +dey +irb +aqj +pOd +ofU +aJx +agI +hcY +uEq +jnu +agl +cHw +pah +tPR +nIq +wsJ +hem +jBt +ccg +wrj +phF +jUq +dyx +tns +hJT +mOV +ylB +xIn +naa +vrT +xdJ +rje +var +hUK +kqV +lAu +aaa +aaf +aaa +aaa +lAu +leb +jmu +oFc +iRv +peS +xXA +cdp +iep +qRL +qRL +sPJ +cdp +cdp +cqi +kOR +lVn +lEk +otG +ekq +gPU +oiz +xDo +aqa +odl +gMe +ijT +cqi +kVX +lTl +cqi +rnY +vpE +jiA +qqk +tjc +eDd +fFN +fFN +fFN +fFN +dhb +moM +gAg +xPs +gAg +fQS +sAj +rTR +prG +uDY +lWB +dDj +uXC +uXC +uXC +uXC +lUv +xrk +anw +kuN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +fKp +ovO +rTp +qxl +emZ +iwn +grw +nVp +ovX +ipP +qWe +hvg +wCa +hvg +rYu +myn +rlW +aBR +nXu +jni +ufd +qLV +lMJ +rFP +rFP +tPR +ouL +dey +dey +dey +dey +dey +dey +dey +dey +dey +fbs +dey +dey +qSp +jHN +aDF +jBt +hQW +qAu +wpc +pZq +dyx +ijj +gAY +qcp +brX +fhA +qnZ +dyx +isy +lLr +mBh +hUK +kqV +lAu +aaa +aaf +aaa +aaa +lAu +leb +pGh +oFc +iRv +tGc +qIo +mZK +aGS +nhU +xSj +ihp +cww +vLu +pTc +bpD +bmT +qsr +lMr +sfI +lwV +aHd +wds +nHo +lEk +uDe +voH +oPe +rQE +cjQ +cqi +mNc +hiw +faE +rmU +vly +iZc +svr +svr +svr +dem +kxD +moM +gAg +xPs +gAg +uBH +xPs +jNm +dmB +rgc +vBI +kKn +eFl +dpm +eFl +oho +kQw +rAV +tiR +kuN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dAw +xvt +kWd +rgz +fPN +mXg +xaG +ooO +kTu +ipP +ipP +wpI +iVV +oVY +iVV +iVV +myl +ooj +uUe +iZG +oEq +fTr +eqp +lAu +deD +aDC +lYI +qAq +tep +aaa +aaa +aaf +aaa +aaa +aaa +aaa +aaf +aaa +vus +fGv +xFN +uZX +wEX +jBt +lwL +hVm +lax +fHC +dyx +dyx +dyx +dyx +jWX +wyc +vDP +dyx +cqW +lLr +var +hUK +kqV +lAu +aaa +aaf +aaa +aaa +lAu +leb +pGh +oFc +iRv +peS +oYj +wQv +dJY +wHO +soF +fXS +dRN +gdu +lxg +lDo +fDY +kVU +gFC +nnS +daz +wDu +gTd +ubv +lEk +uDe +hdD +cqi +xbi +noK +cqi +dbx +vRS +puE +spd +guK +mQK +fFN +fFN +fFN +cfw +gEY +gWc +gAg +xPs +apf +jsG +xPs +lZL +dmB +ilG +vBI +kKn +gWb +qbL +gWb +rcl +kQw +ohh +tiR +kuN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +dVS +dVS +dVS +dVS +qEv +eEt +qxl +fHW +mxY +jbQ +iCw +cZh +faJ +oEq +oEq +uIi +oEq +oEq +nBW +kcL +onY +iIU +oEq +mRL +eqp +lAu +deD +aDC +aDC +csC +pEk +lAu +aaa +kVb +kVb +vGM +gde +kVb +kVb +lAu +iez +kSq +xgl +efH +hkK +jBt +jBt +czr +jBt +jBt +rLB +bmr +dyx +fYx +wMU +fhA +jSr +dyx +dHh +lLr +var +lZE +twF +aaa +aaa +aaf +aaa +aaa +aaa +cHT +mkd +oFc +iRv +imN +sxt +cdp +qFa +mPw +qER +nLe +cou +cdp +xRu +aoA +fDY +ieR +tOQ +onu +rCD +avT +gHq +bRi +alk +uDe +iMN +cqi +cqi +cqi +cqi +moM +moM +vtn +moM +moM +moM +fFN +fFN +ejr +cfw +uHP +moM +xPs +xPs +xPs +xPs +xPs +lZL +dmB +fRp +vBI +kKn +yaW +tcU +yaW +oho +xRa +jto +oly +dmB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +sje +pBq +btp +dVS +dVS +dVS +dVS +dVS +oyH +grw +jxn +gDR +fQR +bVV +oEq +euI +uaR +oxv +lzk +iIU +iIU +iIU +oEq +kHV +dRR +lAu +deD +aDC +aDC +sjQ +tep +aaa +kVb +kVb +rqB +pQG +eGs +dvk +kVb +aaa +vus +rtB +xFN +mVb +iUy +rLB +bdE +jdT +cnS +qti +wwK +bms +dyx +fir +iCB +sEM +mpv +icp +xdJ +lLr +var +eXT +kgt +aaf +aaf +quc +aaf +aaf +aaf +cHT +sql +jtN +cOK +tey +vzN +cdp +cdp +cdp +lTQ +cdp +cdp +cdp +cqi +mzn +xDy +lEk +eKY +lEk +vkM +lEk +eUX +cBr +lEk +vyS +pKA +cqi +sEL +pvp +xmV +aKT +wdC +kBF +ohO +nNI +csW +udO +eMn +moM +iay +moM +moM +iNx +uRN +idI +idI +idI +dJC +dmB +dmB +uIa +sxa +dmB +dmB +mYO +aDo +mHw +cQE +pcq +dmB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +kqM +wqL +peZ +vTN +jhg +omD +oGg +dVS +ioV +bca +xBE +wGD +rQz +rQz +aIJ +rQz +rQz +rQz +ivU +rQz +rQz +rQz +jpH +rQz +rQz +lMJ +rFP +aDC +jec +bKY +tep +aaf +kVb +dPV +mph +dQD +alh +aoW +kVb +kVb +qXc +qXc +pjD +ruB +bjK +xas +wXY +lFJ +oTe +biX +bkB +bmt +dyx +glI +idB +cam +hTk +vbT +hSE +oMS +mMn +uFm +twF +aaa +aaa +aaf +aaa +aaa +aaa +cHT +nTj +oFc +iRv +wmX +vzN +nEb +qqY +uRF +oKA +gCA +fKM +uDD +uec +sva +pUP +quk +quk +gNr +kaK +qDJ +lIJ +sFW +dbA +oPQ +xMI +iwt +rWC +lPJ +wdF +bRZ +sVN +tia +wSs +pUq +rrQ +aFc +mIj +wDh +gLR +tbs +xPs +xPs +doD +gKU +gKU +gKU +xag +vml +cMR +nDV +cLm +gLU +dmB +dmB +dmB +dmB +dmB +dmB +dmB +vml +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +dVS +dVS +dVS +dVS +hvT +bup +kOH +dVS +pKd +dUJ +iwe +pKd +rQz +fNq +yfL +fzr +rQz +rFn +cGU +fzr +rQz +rfs +uCQ +ibW +rQz +aaa +rFP +aDC +aDC +qAq +tep +aaa +kVb +oOl +rxx +gkS +iBe +oWF +eQg +kVb +ric +qXc +xnJ +uZX +czk +rLB +xTB +peL +xTB +xTB +rLB +eiI +dyx +hzF +hOh +spB +kwL +dyx +nnN +kpG +var +tdu +kqV +lAu +aaa +aaf +aaa +aaa +lAu +uYK +pGh +oFc +iRv +cWz +vzN +xgu +qqY +nae +sHg +pnQ +bVs +pnQ +liV +cno +tjr +sBV +wPc +cuC +qwG +jdL +gnY +tkm +ftj +jzf +rHl +lrw +nvn +owx +bSz +bVH +bVH +bVH +tCd +qss +iJu +kgh +tcR +wDh +ekQ +ijf +laC +uTX +gbh +vml +rHL +pkO +iKr +mQS +cMS +nDV +cLm +jIK +hJX +eiR +mSp +cQJ +cQY +cQK +iKB +qLK +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +jTx +iNg +fOs +dVS +fqi +kPF +uME +dVS +qgn +lAt +lpi +mAI +rQz +wMw +tPB +hAW +rQz +ixm +cGU +uEe +rQz +nbT +jZz +qWO +rQz +aaa +rFP +aDC +aEK +bEI +tep +aaa +kVb +jdJ +nhP +aOc +tKo +xJZ +xJZ +lWS +koR +npB +lnV +wVO +lSk +oyT +aaf +aaf +aaf +gXU +gXU +rcu +gXU +ioE +ioE +rMH +ioE +dyx +kpG +jBr +vrZ +hUK +kqV +lAu +aaa +aaf +aaa +aaa +lAu +uYK +pGh +oFc +pnP +nNz +vzN +rvB +tHR +sNo +ult +fnf +wFM +uGz +vzN +rLc +cwn +cwn +rLc +mjt +rLc +nQw +nQw +uMU +nQw +eHx +loz +gYS +dEf +sIk +nPx +wSs +qcP +fBk +igx +igx +igx +igx +igx +wDh +ekQ +wCK +ufi +xPs +mKU +vml +qkm +cLm +fdK +cLm +cLm +nDV +cLm +cLm +cLm +cLm +cMf +cQK +mRU +mRU +mRU +mRU +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dVS +jMf +kUc +bHf +dPy +crX +kPF +fjJ +dVS +txI +xir +lpi +gLz +rQz +uXh +vjY +uWa +rQz +yeI +cGU +uWa +rQz +yfL +vjY +uWa +rQz +aaa +rFP +aDC +aDC +uaS +tep +aaa +kVb +bpu +wzH +kwB +iBe +iIQ +aRV +kVb +vDy +qXc +sca +uZX +lSk +oyT +aaf +aaf +aaf +djW +qDr +kFC +kqs +rnT +ufR +sDL +sDL +saq +rSD +haC +vrZ +aCK +twF +aaa +aaa +aaf +aaa +aaa +aaa +cHT +vEq +swd +hIg +nNz +rpa +sNo +sNo +tZB +ult +qnk +qSz +mVs +vzN +coh +iPD +pFR +kOi +abF +xvY +nQw +kpm +emo +tIF +flL +pvb +gYS +foy +eGf +nPx +wSs +rBi +wSs +vnq +qjN +uaO +nfA +igx +siG +tOA +xXL +cRX +xPs +aUq +vml +voO +nDV +cUL +nDV +nDV +nDV +oqJ +cOT +cLm +eHy +iYi +cQL +cQY +cQK +cQK +vwN +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +ifF +dVS +dVS +dVS +dVS +dVS +dVS +eaV +dVS +dVS +okc +ivZ +iSf +okc +rQz +bHl +jEK +rQz +rQz +okc +oAE +rQz +rQz +okc +cVR +rQz +rQz +rQz +rQz +aDC +efG +ulz +tep +aaf +kVb +dPV +jln +jln +nsJ +gCS +kVb +kVb +qXc +qXc +rvt +pQS +lSk +oyT +aaf +nsO +rru +gXU +xUG +rrU +hKQ +mML +bot +bnW +xNK +aoG +wiy +uem +vrZ +fBZ +kgt +kgt +kgt +kgt +twF +twF +twF +twF +kgt +rEK +iRv +nNz +cqX +qqY +qqY +tZB +ult +aVf +bRX +rBd +iMi +hWF +nnz +wPM +wPM +nxm +mEA +nQw +mhY +qua +vkW +own +rdl +gYS +icl +sIk +nPx +osB +nTC +osB +bQm +oHd +xyr +gjd +igx +uuG +amz +xXL +wCD +xPs +gTD +vml +vml +rQB +ukx +cLm +cLm +cLm +wxl +cLm +sDA +eHy +eoz +cQK +mRU +mRU +mRU +mRU +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +ifF +sUy +toV +byp +hMm +hQr +iWI +cgB +rpA +pXA +wZL +cod +xMs +qUx +ubJ +nUo +oIr +rkh +whr +noi +bnl +nKm +tMT +wPZ +lgN +wDA +ehY +fky +kXf +eTd +ebm +gcY +tdk +tep +aaa +kVb +kVb +onq +vrJ +iCc +gfs +kVb +aaa +vus +lyi +xFN +uZX +lSk +oyT +aaf +oXm +trP +uZU +ncw +sJQ +xzd +hyo +gnw +gnw +gnw +iNN +gnw +gXU +epz +hUK +kqV +aaf +aaf +vVa +aBQ +eGl +crr +cEs +tXO +xPb +iRv +aIB +vzN +raj +tZB +tZB +qjx +upG +dFM +xTJ +wKI +kTQ +gQV +gQV +gQV +gQV +jyX +wTM +vMp +edN +czT +czT +rrp +gYS +azG +pQO +nPx +wSs +wSs +vem +igx +hXe +oHd +dLe +igx +gLN +amz +oYk +stS +xPs +imZ +vml +pZb +vaK +iqN +cLm +cMT +cMT +iAj +cMT +cMT +eHy +eoz +cQK +mRU +lAu +lAu +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +amf +suS +fmW +jYd +qdX +uPB +qNz +fSO +rJY +gsU +uLe +lfk +vsG +jab +lfk +gLB +oiG +lfk +xVx +lHv +xVx +iAW +xVx +qvm +fFn +sIz +epD +qtz +pbE +lEi +aDC +pZW +qlt +tep +aaa +aaa +kVb +kVb +vGM +tFH +kVb +kVb +lAu +iez +wkd +sLq +efH +lSk +oyT +aaf +wBa +bBO +xkf +cVf +qVv +mML +gby +gnw +jfR +eWE +rrU +anq +gXU +rYU +qPB +kgt +sGr +kqV +tZm +eMC +rkr +gMj +sly +eDj +xPb +iRv +nNz +gqM +xgu +qqY +qqY +ult +qnk +mGG +aYi +vzN +nWg +gQV +wDO +wDO +gQV +wAP +nQw +eaL +bll +gzJ +gMu +oPS +gYS +nHE +gxU +sVN +mjJ +mjJ +fkR +fcp +xPR +eGh +oMQ +dKh +pVw +gki +mCz +dgv +oGH +vPt +vml +vOe +nDV +toR +dMw +vml +cNN +vml +cOW +vml +dgr +eoz +cQM +mRU +lAu +aaa +cXE +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +vgt +fmW +jLW +lAu +lMJ +oDU +oDU +oDU +oDU +oDU +pwN +oDU +kOc +kOc +kOc +kOc +kOc +bxX +trg +trg +trg +bxX +bxX +bjs +pIS +nzF +xwK +sbI +rMD +rQz +mRg +iub +guN +pEk +lAu +aaa +aaf +aaa +aaa +aaa +aaa +aaf +lAu +vus +kUK +iiW +bpS +jdV +oyT +aaf +wSU +yly +vhF +bnW +oAG +aVa +rOb +gnw +gnw +dFr +rfy +vjs +adz +xjF +hUK +rbr +jgn +bJO +vVa +eMO +aJe +cJY +lAF +vqo +iEK +pCT +ceY +vzN +nZs +qqY +qqY +ldq +eay +qKA +fsX +vzN +lUs +gQV +wDO +wDO +gQV +wAx +nQw +vMp +bRW +loh +wmE +fGs +gYS +tfd +wSs +daD +aAu +rnF +gsS +igx +cnh +nse +igx +igx +qNT +rtj +xPs +xPs +xPs +ftf +vml +eGg +nDV +qpk +cLm +jIK +jIK +tHb +jIK +jIK +eHy +eoz +cQK +mRU +lAu +lAu +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +aco +ifw +lAu +aaa +oDU +oDU +oDU +oDU +oDU +oDU +oDU +oDU +mPr +wmy +rNK +sIK +kOc +fTy +lrH +pnT +xTj +fcA +trg +smg +nPo +xwK +xwK +bFc +bQL +fTj +aDC +pZW +ezU +tep +aLv +tep +tep +tep +tep +tep +tep +tep +aLv +emY +kAS +sds +xOv +lSk +oyT +aaf +gXU +xfU +bnW +xBB +tIi +vnG +wEV +qWi +gnw +uUZ +rfy +njk +rBx +aUs +oUT +bGH +bGH +bJO +tZm +imx +qcy +fWT +jFc +tZm +vza +iRv +nNz +gqM +xgu +qqY +qqY +eAt +vzN +vzN +vzN +vzN +llk +gQV +gQV +gQV +gQV +wAx +nQw +pYD +bRW +oXX +wmE +por +gYS +csW +jTn +csW +csW +csW +csW +csW +sPr +omo +xAW +xPs +eCg +lqJ +xPs +bsS +wJW +bkW +jFp +vml +orm +qpk +cLm +cLm +cLm +wxl +cLm +cLm +eHy +eoz +cQK +mRU +mRU +mRU +mRU +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +jae +ifw +lAu +aaa +oDU +oDU +cgr +kEL +wSv +vnD +bxP +oDU +psq +tSd +eGn +eft +lsm +ggs +hxU +lyI +rXG +cae +cmF +nTE +uZz +bPi +wWn +wxD +aDC +aDC +aDC +afY +hNu +dgy +kzL +dgy +tuT +kvD +dgy +dqF +dgy +jNq +kzL +cDh +sQR +obG +iCO +lSk +oyT +aaf +lDh +qlC +vhF +bnW +bnm +bnW +vjs +vbc +gnw +bnW +eKE +hza +oHE +aUs +oUT +bGI +bGH +moX +tZm +uGZ +oQH +mTW +rxh +tOn +nyO +dky +nNz +vzN +xgu +qqY +qqY +iIk +vzN +fMK +fMK +rLc +oYy +rJr +vVY +oBS +jlI +aau +nQw +pgx +epj +oOn +uZu +iFf +gYS +fMK +lJQ +fMK +fMK +lJQ +fMK +cPO +aNc +nri +lOg +xPs +lqJ +lqJ +xPs +bsS +mPq +jim +qRF +uAl +nDV +qOF +nDV +hDV +nDV +nDV +nDV +lHL +eHy +jJg +qPc +cua +cQK +cQK +vwN +oVe +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +aco +ifw +lAu +aaa +oDU +oDU +aPL +aUu +rUO +ldC +bSr +oDU +oei +adN +rJe +adN +sjD +qhO +uTA +okw +iWm +bGm +eSB +smg +yfL +lyb +kqA +sAt +vTy +vTy +vTy +nMh +bwy +cGQ +mcb +cGQ +cGQ +wdf +cGQ +ksj +cGQ +dAM +jpQ +igf +vnB +xYC +kpo +lrL +oyT +aaf +wBa +cIu +qkM +ctp +hTy +fzC +lnQ +uvZ +wiH +lnt +uUD +fIX +jfr +owR +fdZ +yaI +wFG +wbA +obM +pXt +hNK +dQg +rXz +hsq +nkc +iRv +nNz +cqX +qqY +qqY +qqY +iIk +vzN +fMK +fMK +rLc +rLc +rLc +rLc +rLc +yeC +rLc +gYS +gYS +gYS +gYS +gYS +gYS +gYS +fMK +fmg +fmg +fmg +fmg +fmg +fmg +vke +clI +smx +xPs +ePa +xPs +xPs +bsS +msu +vBN +nXp +gvr +gAM +dbz +qhh +gAM +gAM +jYb +cLm +cLm +cLm +eoz +cQO +mRU +mRU +mRU +mRU +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +aco +ifw +lAu +aaa +oDU +oDU +sol +vyf +qam +mJJ +oXF +wzy +vOn +eft +pLf +eft +lsm +iyy +okw +cFp +bLG +uik +trg +smg +yfL +itw +wWn +jal +aDC +aDC +aDC +aDC +wGX +wGX +nQp +wGX +wGX +wFa +wGX +cfu +lpV +wGX +wGX +hrq +oLO +twe +plP +kAC +oyT +aaf +wSU +guV +vhF +bnW +tIi +reo +vjs +gEp +gnw +bnW +qgH +raZ +eRA +aUs +prD +imz +bGH +kcg +tZm +eqO +bsu +fQr +mJk +tWE +nyO +xXl +nwU +cqX +qqY +qqY +qqY +iIk +vzN +eCI +fMK +rlT +rGp +lJQ +cQT +wPS +gsw +wEf +xUi +fMK +uRk +fMK +lJQ +uRk +fMK +fMK +fmg +dYb +dYb +eId +iCY +fmg +eIO +gqI +nDS +ebY +lxc +ddp +kXD +eOW +aJR +cNl +qRF +cJG +ukL +cLm +aho +cLm +cMT +qOF +vVU +cPu +kWE +eoz +cQP +cQY +cQK +iQM +vwN +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +aco +ifw +lAu +aaa +oDU +oDU +aXV +wnS +rUO +aUu +lSj +oDU +aDG +gwf +kDS +dWR +kOc +fdr +okw +arp +lgc +cVH +trg +smg +xFd +xwK +xwK +gCm +xqX +nvI +egG +aDC +wGX +fEw +aQg +nhM +aQg +aQg +aQg +aQg +aQg +uyh +utZ +hoh +duW +nOe +mHK +kAC +oyT +aaf +gXU +pME +bnW +bnW +cSN +yfr +cGR +sqj +gnw +rWE +mml +shN +pyd +aUs +oUT +bGH +bGH +bJP +tZm +qjq +rei +gMj +qIv +tZm +ebo +iRv +ceY +vzN +qqY +qqY +qqY +iIk +vzN +fMK +fMK +rlT +ccF +rlT +rlT +rlT +nXA +rlT +rlT +rlT +rlT +rlT +rlT +fmg +fmg +fmg +fmg +hdK +fpH +xrS +uex +enq +vKm +bBj +bBj +bBj +dQO +bBj +lJz +bBj +jRa +eZV +dPs +dPs +dPs +dPs +dPs +ydT +xiP +fUD +vml +mRU +vml +mRU +vml +mRU +mRU +mRU +mRU +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +ifF +ryQ +dNl +ifF +lMJ +oDU +oDU +oDU +kze +efP +mSD +klE +oDU +kOc +kOc +kOc +kOc +kOc +bxX +rDY +trg +bxX +bxX +bxX +dnc +yfL +dtM +xwK +lzR +dGq +xwK +egG +pay +wGX +aQg +tSf +iZa +iZa +tpy +tAq +gZk +aQG +ipx +aTl +aQg +oKl +kUC +sIW +lxC +oyT +aaf +lDh +xEj +vhF +xBB +mrN +cZD +eXW +gnw +gnw +euh +mml +vjs +adz +vrZ +oVF +iBH +uBQ +bJP +vVa +qJx +air +qUy +sbY +uGN +kEA +dDL +itU +vzN +nRo +xOF +tKy +qqY +vzN +fMK +fMK +rlT +lFc +sED +ppp +ppp +ppp +ppp +ppp +ppp +pAs +ppp +xat +fmg +jmY +dYb +iCe +gva +aVg +gnS +gjD +fmg +mYc +mPq +khp +sGv +hoN +pUw +qGa +mPq +tar +voG +sbz +kkO +kkO +kkO +dPs +vYE +xLO +jLH +vml +lMJ +lMJ +lAu +lAu +lAu +lAu +lAu +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aav +aaa +aaa +aaa +aaa +aaa +aaa +ifF +mQp +rvI +mtu +mQp +lMJ +aaa +oDU +oDU +oDU +oDU +oDU +oDU +qXj +pmk +kID +lcJ +xPf +kFP +pIV +pfy +nwP +dHg +lAu +okc +smg +vjY +vjY +vjY +vjY +sup +lEi +egG +aDC +wGX +aQg +kyt +aIR +aIR +wVZ +fpf +gZk +aQH +aQH +ocV +aQg +bEC +dYN +uZX +kAC +oyT +aaf +wBa +sJn +izr +cVf +qVv +mML +sMh +gnw +jfR +wdU +glV +mds +gXU +wxX +gdP +kgt +bxz +kqV +tZm +jLE +bsu +soZ +hCW +eDj +itP +iRv +mzD +vzN +vzN +vzN +vzN +vzN +vzN +rlT +nBm +rlT +aND +pgM +pgM +pgM +pgM +pgM +piU +pgM +pgM +rHr +ppp +kUj +bZo +xrS +xrS +ccZ +bwN +cBe +ukk +gxt +lji +mPq +khp +ldu +iAQ +ldu +ldu +emw +tar +dzx +dPs +kkO +kkO +kkO +dPs +biL +ttu +phm +dsJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +iZJ +kMF +brt +utR +lAu +aaa +lMJ +fSB +oDU +oDU +oDU +aaa +qXj +nuU +hOl +oJJ +eyI +kNH +eyI +pHK +dZO +dHg +lAu +okc +jHb +clL +clL +uES +eTi +hYM +lEi +egG +egG +wCX +aQg +oUc +acu +vzC +oZA +dHb +gZk +aQH +aQH +qFD +aQg +dlj +xKo +uZX +kAC +oyT +aaf +mgI +awo +lzb +kIC +xYb +qwE +cZD +gnw +gnw +gnw +bFV +gnw +gXU +oPj +hes +kqV +aaf +aaf +vVa +gEI +qWC +oIb +khB +tXO +itP +nfZ +rHD +foS +ppp +ppp +ppp +ppp +ppp +ppp +ppp +ppp +nPt +pgM +hXy +lkV +kuc +jcv +tUy +kZe +pgM +lFc +fwy +fmg +rub +oKq +oKq +sws +oKq +pJc +ukk +gxt +qFA +khp +uAf +ldu +lFc +ldu +vLW +bsS +tar +nbr +dPs +kkO +wmY +kkO +dPs +tVn +cNR +uBt +qIE +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +pKu +iWI +brt +vsk +lAu +aaa +aaa +aaa +aaa +aaa +aUn +aaa +qXj +maD +xTw +jYw +qtV +kFP +bEB +bpj +rqy +erE +erE +erE +wvy +wvy +wvy +erE +uLs +kEZ +sPy +sPy +sPy +sPy +vxI +njn +oHT +aIR +aIR +vHM +gZk +aQH +aQH +abU +aQg +aQg +xKo +uZX +kAC +oyT +aaf +uVk +rru +gXU +ccM +glV +hKQ +mML +cQl +aFw +tjS +pyS +vsf +hab +xjF +sYx +qGj +qGj +xpF +qGj +cZs +cZs +cZs +cZs +qGj +cbP +iRv +hbH +cHT +wmD +wmD +nXA +wmD +wmD +wmD +wmD +wmD +pgM +pgM +bxH +lJg +lJg +rPo +sRU +but +pgM +lFc +xFD +fmg +euj +rnX +bjo +fmg +pOK +dYb +xWS +fmg +ldu +ldu +ldu +ldu +lFc +ldu +hgL +bsS +tar +bqN +dPs +kkO +kkO +kkO +dPs +gdv +jlS +wgz +vml +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +iDp +sEv +brt +url +lAu +aaa +aaa +aaa +aaa +lMJ +aUn +aaa +rRi +wZf +wZf +wZf +wZf +wZf +wZf +qpF +jvP +wvy +hMc +kdU +dEn +fle +htm +wvy +qUb +sNh +sPy +vgj +cQH +neP +vxI +kXl +oux +aLB +rti +tvB +lqA +mGU +igg +mGU +xmk +aQg +xKo +dDT +kAC +oyT +aaf +aaf +aaf +djW +lsN +iLq +plp +dmd +nFg +icD +aiX +vOo +vOo +wlw +wcK +pRU +rxE +grN +rLH +lYt +iCZ +nnc +ovV +acn +qGj +gOD +gRb +nNz +ujF +wmD +ukO +bWr +lOS +kED +fVh +oia +xWo +pgM +kAk +oEI +oEI +oEI +dnw +faK +eWK +pgM +lFc +xFD +fmg +fmg +fmg +fmg +fmg +fmg +fmg +fmg +fmg +pxS +rlT +ftV +muX +lFc +ldu +oya +bsS +tar +nbr +dPs +dPs +dPs +sbz +dPs +dPs +dPs +dPs +dPs +anS +anS +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +mQp +cMA +kue +mQp +lMJ +lMJ +lMJ +lMJ +wZf +wZf +wZf +wZf +rRi +mna +uXJ +rsY +vit +vpY +wZf +pHK +dZO +erE +chm +dVb +dvS +dvS +kra +uZI +qUb +sNh +sPy +aei +ufp +neP +vxI +hTs +hRm +dCq +aIR +tvB +gZk +aQH +aQH +hTM +gHx +utZ +xKo +jhO +kAC +oyT +aaf +aaf +aaf +gXU +gXU +gXU +msj +nDM +gXU +jjM +jjM +pJU +jjM +lZo +xjF +snj +pSW +lPi +vaA +mIS +mIS +mIS +rua +fiJ +qGj +hON +wPP +nNz +qbI +wmD +iws +xFK +xFK +xFK +mZc +aDZ +wEJ +pgM +xqK +oEI +oEI +cWD +dnw +faK +kZe +pgM +lFc +fIk +ppp +ppp +ppp +ppp +ppp +ppp +xat +mUN +mUN +mUN +rlT +fsV +jKG +nLP +ldu +eGB +bsS +tar +nbr +dPs +kkO +kkO +kkO +kkO +kkO +tsK +pdq +cHi +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +ifF +kWz +fvi +ifF +aaa +aaa +aaa +lMJ +wZf +mjv +uFt +mjv +wZf +kgp +nfi +tuM +pdK +prr +rUK +mix +pNg +exe +vzY +vzY +bnv +meA +mhT +jYA +uaW +waO +njc +swa +ufp +ufp +vxI +oUc +vIA +jJP +sqa +fIA +gZk +aQH +aQH +mGU +ifA +dqW +qDw +efH +ckm +jjM +jjM +jjM +jjM +jjM +vir +jjM +jjM +jjM +jjM +rYg +hkN +pyT +grF +jjM +xjF +pUb +qGj +pcu +kxY +eNc +tZi +ezP +cty +erh +qGj +pMl +fVC +nNz +qbI +wmD +iSa +xFK +xFK +xFK +mZc +aDZ +rrR +pgM +fNf +oEI +fYK +qvN +xpd +jrc +pgM +pgM +lFc +jwf +fMK +fMK +fMK +lJQ +fMK +kxw +xlK +xlK +cnf +ppp +pgc +ppp +bxo +mUN +ldu +ldu +ugS +tar +nbr +dPs +sbz +dPs +dPs +dPs +dPs +dPs +dPs +dPs +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +aco +ifw +lAu +aaa +aaa +aaa +aaa +wZf +oBt +cPf +djx +nRc +mkm +mkm +rZY +fbo +dZi +fYR +wDI +mrj +kzq +taJ +kcs +xve +mOd +poD +wvy +dpC +sNh +sPy +sEq +sbJ +ufp +ofB +aIS +lxh +aIR +uJl +pYd +gZk +aQH +aQH +aIT +tru +aQg +hpA +pQS +syC +jjM +qQo +fhe +vgQ +tvz +ekb +tvz +uyC +tQz +yaa +plZ +iqp +pVz +iqp +mee +xjF +uyE +qGj +inA +mqZ +jwV +arU +vWe +yeD +aNJ +qGj +qyt +uWh +ePY +hKm +wmD +qsl +xFK +qTu +pNs +rnO +aDZ +mDI +pgM +pgM +wSA +pgM +pgM +txT +nUY +pgM +pxS +lFc +rlT +ukX +tWj +dVE +enH +enH +enH +enH +enH +jtR +eZt +rlT +jDy +gAk +fMK +lJQ +sLx +mfU +tar +nbr +jub +ejt +uht +gUi +tWV +amR +ldu +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +aco +ifw +lAu +aaa +aaa +aaa +aaa +wZf +kaF +rTG +kaF +wZf +xmy +xSJ +kIH +nfi +prr +duk +mft +doA +erE +xTA +rYX +beg +ksK +mGc +erE +vzd +vzd +uMi +uMi +uMi +uMi +aQg +lXP +xcw +aIR +aIR +mIe +gZk +uGf +aIT +aIT +qxb +aQg +xKo +uZX +abp +jjM +xdI +xWt +emj +tvz +rRh +tvz +hIU +erA +aMY +epd +owA +dpw +gWx +jjM +dSi +mmp +qGj +qGj +jfJ +rcq +qGj +sTY +tKt +rcq +qGj +vTY +nVd +xfl +cHT +wmD +wmD +lqZ +wmD +dxP +gli +ljQ +wmD +enH +wnO +eMT +iGt +mxI +cBJ +ecz +enH +enH +caz +enH +enH +enH +enH +enH +oAB +our +uIG +enH +enH +enH +enH +enH +enH +enH +enH +ldu +jSy +tar +nbr +rqG +rqG +rqG +ltm +eKD +eKD +aek +lMJ +tPH +anS +nRb +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aav +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +jae +ifw +lAu +aaa +aaa +aaa +aaa +wZf +wZf +wZf +wZf +rRi +olv +prr +prr +prr +uXJ +rUK +mft +tjG +erE +tXj +vzY +eOG +ksK +sFp +rAR +vzd +nSV +cEx +mOJ +uEO +qYR +aQg +aQg +aQg +aQg +aMQ +aQg +aQg +aQg +aRX +utZ +aQg +aQg +mRT +pvk +gtm +jjM +dsz +gWx +mcQ +tvz +mjV +tvz +hIU +eOi +adF +pzh +pRa +krt +mfY +jjM +xjF +pUb +lFz +qGj +jXG +xkm +rGz +cOf +sCG +jRm +izO +iuw +iRv +ltp +hxD +feK +vXc +xVv +ivg +xVv +cYc +mZW +nrm +uER +nrm +qba +qba +eoh +uLF +ayi +nrm +fGP +gbl +ufX +mBd +xVv +xVv +use +xVv +xVv +xVv +xVv +jTU +txB +qOC +xVv +ivg +xVv +xVv +dFu +bsS +dOR +nbr +rqG +rqG +rqG +ltm +gYB +gYB +aek +lAu +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aav +ifF +aco +ifw +lAu +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +rRi +ojM +prr +clh +dzn +leQ +wZf +qDH +doA +wvy +dqG +dvS +xCp +aGW +aGW +aGW +vJg +bbX +mqx +aGT +qqO +lhj +psj +gOJ +iPY +eti +foq +laQ +psj +sFx +oQr +htW +oQr +ghS +xKo +tUB +kAC +jjM +vpd +wEl +fxE +tEI +qsG +nAm +qsG +dma +mVX +fxE +uvx +idt +kBm +jjM +xqZ +pQe +ixp +qGj +toQ +mKx +fnM +nDg +lri +jRm +izO +iuw +nfZ +hgi +jar +mdP +bZK +bZK +bZK +dFG +bZK +bZK +bZK +gNa +bZK +bZK +bZK +xLD +bZK +bZK +bZK +bZK +xLD +vpy +rgt +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +bZK +sVU +qdH +qdH +hLy +cJO +hcD +rqG +ltm +tKr +tKr +aek +lAu +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +ifF +aco +fmW +jlk +lAu +lAu +lAu +lAu +lMJ +lAu +kgY +kgY +rRi +wZf +cLO +cLO +wZf +wZf +wZf +aVZ +doA +wvy +qCP +dvS +mXf +aGW +poD +uSp +vzd +tMU +maJ +qYR +qqx +afm +psj +jJG +tJj +aGw +iaO +osJ +xsV +qBB +vnC +hsC +vnC +pQq +qDw +efH +knS +jjM +dAL +gWx +nlK +knZ +tiM +tvz +etd +acT +seC +wRU +kTG +tGO +yeX +jjM +ndn +pUb +fXD +qGj +rGz +xkm +jXG +rrx +biu +iLM +izO +iuw +iRv +ltp +hxD +dYz +amX +amX +amX +ubO +amX +amX +amX +xeD +amX +amX +fCQ +gXJ +tUZ +amX +amX +wTG +fcm +xCP +kjx +hzQ +qkG +nCn +nCn +scj +vfx +vfx +eLC +vfx +vfx +vfx +ksn +vfx +vfx +vWI +iVK +hts +eYK +hEC +mJS +rqG +ltm +ltm +ltm +ldu +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lKu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +qbE +uzz +fks +sdv +bhW +cgC +cgC +bhW +gbw +xGi +iWI +hQr +tIJ +wOR +fBp +fLk +sCK +tWI +aRh +doA +wvy +mSE +dvS +mmZ +ksK +wjw +vzd +vzd +vzd +rIc +iPT +whB +whB +whB +mkw +spo +npV +rxZ +ngi +wYE +iui +dED +xtn +xtn +qsW +xKo +dDT +ckm +jjM +rLz +vBf +oyP +eTp +hIU +tvz +tvz +jjM +jjM +jjM +skL +jjM +jjM +jjM +xjF +wZW +qGj +qGj +qGj +qGj +qGj +qGj +vtq +qGj +rxE +ylO +iRv +vQw +joU +opP +oAB +qSm +tba +isJ +isJ +isJ +isJ +aLs +aLs +aLs +pRe +aLs +aLs +aLs +aLs +aLs +guQ +enH +rJU +rJU +iFT +aRU +aGd +vvw +tHU +qDT +fnU +enH +enH +enH +enH +enH +enH +ldu +ldu +qZK +ldu +ldu +ldu +aek +aek +aek +ldu +ldu +lMJ +anS +anS +tPH +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +ifF +vnh +uiW +uiW +uiW +uiW +uiW +uiW +aeU +xGi +iWI +hQr +nBb +iuP +eyI +czt +eyI +woj +xkz +gpX +erE +xTI +dEn +xve +aGW +aGW +lSH +rAY +wvp +ooy +ooy +whB +rOM +whB +wvM +dfp +mwr +wAh +hez +xsV +xNA +qCf +smv +bLv +ghS +xKo +uZX +kAC +jjM +wtH +bLx +sFk +hFK +cpY +tvz +mZh +jjM +dYj +qum +jth +edz +ndu +kMq +wcK +hes +kPy +syT +hce +euD +rBj +eqS +gFu +nnG +mKe +bmH +rZS +nZQ +isJ +isJ +isJ +isJ +isJ +isJ +rah +guM +cKc +aLs +acg +nRZ +qGh +mqi +thq +eBp +ePF +aLs +vEp +rah +rJU +udn +jgc +hch +gPz +rJU +aRU +aRU +rJU +rJU +rah +hqm +isJ +xMk +xMk +xMk +sDV +xMk +rah +rah +isJ +lAu +lAu +lAu +aaa +aaa +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ifF +ifF +ifF +ifF +ifF +ifF +ifF +ifF +ifF +kgY +wxe +wxe +aFP +fxs +aFP +ctZ +qdg +woj +qdg +odD +odD +gJJ +gJJ +ulH +gJJ +gJJ +uMi +aKr +ljI +ghh +dir +oOY +sDF +tdw +eQr +iky +sOr +eZk +mrD +psj +fIf +qCf +pHb +qcu +fuj +xKo +uZX +lbe +jjM +jjM +jjM +jjM +jjM +jjM +jjM +jjM +jjM +jGN +kvR +kvR +kvR +kvR +rXU +tHP +gyw +qAp +rLB +rLB +rLB +rLB +rLB +rLB +rLB +rLB +itP +nfZ +qGm +pdg +gzE +gzE +gzE +gzE +asP +rCV +pDd +nlY +aLs +uAg +rxc +qGh +mDF +qqa +jON +lAm +aLs +kpL +jSu +rJU +vse +qcf +vWr +hzS +vuf +vuf +cvY +gPz +rJU +ebQ +koj +isJ +xMk +rah +rah +isJ +rah +rah +rah +ptK +lAu +aaa +aaa +aaa +aaa +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +wxe +dEY +kUw +vuu +dni +gcg +cYf +jpR +cYf +odD +bPQ +upB +upB +wkX +upB +fkG +hyE +whB +whB +whB +whB +whB +otb +whB +whB +whB +psj +psj +psj +psj +bRb +ghS +cnj +qcu +rtx +xKo +uZX +kAC +gjZ +uZk +fGx +wat +wwG +nxF +fFJ +tro +xDg +ogv +wat +hsV +ozf +hUO +doP +fPz +olc +fdk +bJz +pKU +oee +eaf +dDh +pKU +xqg +tFa +itP +iRv +itC +jMi +jMi +jMi +jMi +jMi +wDl +uVb +sCw +nlY +aLs +aLs +vDG +jLG +uxU +vvo +asw +wvi +jPe +roh +xeT +rJU +pyK +qcf +vWr +vWr +vWr +vWr +gse +mzU +rJU +lfX +isJ +isJ +xMk +rah +rah +isJ +ebQ +rah +rah +isJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aav +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +wxe +dcO +jWx +mNi +piD +gcg +jZI +bYQ +rjc +gJJ +fKN +nPn +xRf +oqI +qQF +qQF +hyE +jjR +rqf +ryR +ryR +ryR +hSA +ryR +ryR +fwK +fzZ +lIC +vTR +qfR +xNA +qCf +tEQ +qcu +eyP +xKo +uwV +akt +fMS +vFT +qXp +obK +uZg +etq +qXp +nJT +eOm +naA +qXp +qXp +qXp +nWP +mvx +lFl +bmh +mOf +vFT +gul +hup +gul +gul +gul +lgZ +gul +gul +xoE +uLU +kGT +enM +krC +iHU +jMi +wDl +iUQ +lWd +nlY +gYN +aLs +aLs +aLs +aLs +aLs +aLs +aLs +aLs +hNC +isJ +rJU +xFr +qcf +vWr +vWr +qUL +vWr +gse +jXC +rJU +xkD +isJ +xMk +xMk +isJ +isJ +isJ +rah +rah +isJ +isJ +aaa +aaa +aaa +aaa +aaa +aaa +anS +tPH +anS +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aav +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +wxe +ltq +ohI +rAK +yhA +gcg +heA +pJG +lAK +gJJ +tKK +uMQ +vXw +ahz +eDE +mXl +hyE +vJB +pQT +whB +whB +whB +whB +whB +whB +whB +xwu +sqs +vnC +vnC +fAR +vnC +jfL +qcu +dDE +ldM +wBv +tls +gfz +nzz +ghx +rDo +xqn +twg +eXZ +hLC +xTP +whp +rCc +cZx +cZx +xTP +lzQ +nbf +odx +xtk +reP +nVD +qJQ +aSQ +aTw +aIb +wMH +dhi +owi +mUz +fsh +uas +bDd +wdx +cbB +jMi +wDl +sgu +jgH +jgH +jgH +qfd +jgH +jgH +jgH +jgH +jgH +jgH +jgH +wrG +pDd +rJU +jZT +mDm +oWb +uHW +rDQ +gse +gse +qif +rJU +rah +xMk +xMk +isJ +isJ +rah +isJ +xkD +isJ +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aox +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +wxe +jpE +pia +uTp +miS +gcg +gqo +dHY +itm +odD +tgc +wgp +eFw +eJv +jIR +kIE +hyE +pDX +lYH +whB +wSo +goR +syB +goR +mQm +goR +pRq +tzh +qCf +pRW +muS +iDA +nQe +tdK +iww +tdK +tdK +hKA +hKA +hKA +jeY +dnA +hcV +aqV +ish +nLR +gEz +gEz +nrp +imI +gEz +gEz +efb +efb +qXR +efb +efb +efb +efb +efb +efb +aTt +iiM +ksv +fAj +dPg +dPg +kGT +qri +gXf +nzV +jMi +wDl +dEK +isJ +isJ +isJ +isJ +kFb +rah +rah +rah +rah +mAt +tkl +isJ +hIj +rJU +rJU +sQH +vWr +vWr +vWr +vWr +vWr +jlG +rJU +rah +xMk +isJ +isJ +rah +rah +rah +rah +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +iBb +lMJ +aaa +aaa +iBb +aaa +aaa +aaa +iBb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +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 +wxe +wxe +wxe +wxe +ekF +rDN +vRz +agj +vjG +odD +sDM +wSx +dtA +nrk +vTL +qrW +hyE +sMW +rSf +whB +tSw +goR +nml +goR +dFi +goR +ltC +tzh +pRW +sZR +muS +qCf +bWb +tdK +kLf +kHt +tdK +wUC +qZi +ktN +hKA +pZj +wbk +tFU +qYs +lyn +kAN +fAJ +dPS +cdR +fAJ +kLt +ddG +cjn +exS +uyF +kXb +efb +kvC +eak +efb +pCh +kCQ +eiW +kGT +dDP +xYZ +mol +kGT +uEI +kGT +jMi +wDl +dEK +ptK +lAu +aaa +isJ +ptK +ptK +ptK +ptK +ptK +isJ +isJ +isJ +hHP +pDd +aZD +gub +lNF +eru +eru +eru +xeM +arh +rJU +rah +xMk +isJ +ebQ +rah +rah +isJ +isJ +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +whB +rpq +hyE +hyE +hyE +hyE +hyE +hyE +hyE +hyE +hyE +hyE +hyE +hyE +riR +nqo +pMF +xPo +lBH +rtV +nUm +sKG +eEk +oQr +tzh +sFL +iTk +xzX +hWi +fic +tdK +tdK +ocA +tdK +eqL +bSU +oGM +iRz +tDL +wbk +tFU +nLR +kjK +lbd +ufu +cHp +gxQ +nru +fyU +jeC +gQE +tDG +xpu +fWk +tFe +etx +woo +efb +xZQ +tuH +eiW +iBF +sUJ +gyh +wYg +eUy +cuR +plr +jMi +wDl +dEK +ptK +lAu +aaa +lMJ +lAu +lAu +lAu +lAu +lAu +aaa +aaa +isJ +isJ +tfc +rJU +rJU +rJU +iOp +ygF +ygF +atK +pDu +rJU +rah +xMk +isJ +rah +rah +rah +isJ +aaa +lMJ +aaa +lAu +aaa +aaa +aaa +aaa +aaa +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +dwj +dwj +whB +whB +whB +whB +byo +ala +kBj +whB +ogo +ryR +ryR +rHY +ryR +ryR +ryR +ryR +ryR +saO +unE +whB +wnr +rtV +ulD +vca +vca +eEk +vGb +xnC +xtn +vvq +ljB +qCf +tEQ +vUn +tdK +dHd +lRa +xAY +aPI +hyp +xlh +tDL +wbk +tFU +gEz +pBW +mnK +ndd +fAJ +twU +fAJ +mnX +lde +kjI +yeL +woL +tqK +efb +iRn +kDs +efb +jYO +wRR +eiW +doO +lic +ugi +ugi +ugi +oQh +seG +coC +qUC +kdj +isJ +lMJ +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lAu +ptK +hIj +rah +rah +rJU +gPE +qZl +qZl +rJU +rJU +rJU +isJ +qZK +isJ +isJ +isJ +isJ +tzi +heM +heM +heM +tNX +lAu +lAu +aaa +aaa +aaa +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +kMn +isW +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +lAu +whB +ahd +xsu +aje +rpq +alc +aje +whB +hYo +whB +whB +gyB +whB +whB +whB +whB +whB +whB +whB +whB +ljc +aIF +goR +goR +goR +goR +mQR +xnC +xDS +uot +hwM +uxz +tEQ +ckD +tdK +rnI +tdK +hOV +czL +erT +iRz +tDL +wbk +tFU +gEz +eaU +iSY +xjg +fAJ +atk +iqP +mnX +lzu +tVh +rVc +ktD +xZT +efb +eQn +wAu +efb +bBs +lmL +eiW +kRs +ppK +xyN +xyN +xyN +lJn +wjL +jMi +wDl +dEK +ptK +lAu +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lAu +ptK +hIj +pgq +rah +rJU +rJU +rJU +rJU +rJU +rah +rah +rah +xMk +rah +qXq +rKB +isJ +xvR +xah +prL +tmF +tNX +tNX +tNX +lAu +aaa +aaa +aaa +aaa +xar +aaa +aaa +aaa +xar +aaa +aaa +aaa +xar +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aav +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +whB +ahe +gSY +vpt +ajP +dKT +qcb +blD +wHm +whB +ary +gxC +aje +gSY +tbQ +whB +oBZ +mot +qAa +goR +oeZ +iUm +byH +gsX +wGF +goR +dSo +xnC +ljB +qCf +sZR +pRW +tEQ +eCz +tdK +jmc +tdK +cgg +glK +tad +hKA +tfM +wbk +nVM +oSx +wuh +fAJ +qpS +fAJ +lMo +taP +mnX +pnY +uyu +hSw +eGa +pGz +efb +vYb +fUj +oKC +vBD +jfC +qyx +wPR +yaL +ydo +iKa +iKa +lJn +ntC +jMi +wDl +tCi +ptK +lAu +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lAu +ptK +hHP +sQU +sQU +sQU +sQU +sQU +sQU +sQU +sQU +sQU +sQU +dTk +dTk +dHW +dTk +hoX +vQX +hOd +cMr +tEn +sxT +gwr +uRp +iKU +iKU +iKU +iKU +iKU +utT +iKU +iKU +iKU +utT +iKU +iKU +iKU +utT +iKU +iKU +sfa +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aav +aaa +aaa +aaa +aaa +aaa +aWl +lMJ +lMJ +lMJ +czM +czM +whB +whB +seR +xRw +aje +ale +gSY +whB +rSf +whB +arz +izW +aub +aje +ahd +whB +xud +qzv +suk +pKM +xwv +kfk +ftq +goR +goR +goR +utC +jKz +muS +sFL +erC +waR +tEQ +crm +dtE +adJ +tdK +tdK +tdK +tdK +hKA +ivG +bub +mYY +aKX +ntm +rIb +nLR +nLR +nLR +gmM +soX +xiX +blO +qak +ioO +oDQ +efb +cOc +dNp +efb +fCC +ngg +pmB +lkO +yaL +xGY +xGY +xGY +eJG +thd +jMi +wDl +kSD +isJ +lMJ +lMJ +quc +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +isJ +ptK +ptK +isJ +rah +rah +rah +rah +rah +isJ +isJ +isJ +isJ +isJ +eqg +isJ +rah +heM +oqg +efw +eVu +tNX +tNX +tNX +lAu +aaa +aaa +aaa +aaa +xar +aaa +aaa +aaa +xar +aaa +aaa +aaa +xar +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aUn +lMJ +rrt +lAu +lAu +lAu +hYV +rvu +uyw +whB +uaX +wgW +whB +whB +whB +whB +rSf +whB +arA +aje +gSY +aje +bJl +whB +wfg +tYy +uEP +goR +ful +kfk +rKV +ezS +kft +goR +bRs +jKz +muS +sFL +utK +qCf +tEQ +hDz +tdK +ocA +tdK +xvQ +duo +tdK +oHI +tDL +wbk +tFU +gEz +gXr +fAJ +klx +itV +hRW +taP +mbz +wTm +vLh +efb +iWf +efb +efb +efb +efb +efb +dvd +vWK +eiW +jQZ +gKu +yjP +iKa +iKa +kTA +eDJ +jMi +xMk +kSD +ptK +lAu +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lAu +lAu +isJ +isJ +ptK +ptK +ptK +isJ +isJ +aaa +aaa +aaa +isJ +hXr +isJ +isJ +heM +heM +heM +heM +tNX +lAu +lAu +aaa +aaa +aaa +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aUn +lAu +fEJ +fEJ +fEJ +tpS +tpS +czM +avy +whB +whB +whB +whB +pRg +sja +whB +gaJ +whB +whB +whB +whB +whB +whB +whB +goR +goR +goR +goR +goR +tpb +goR +goR +goR +goR +cYR +bGr +muS +iDA +dTL +waR +tEQ +fRn +tdK +hgK +vJG +eNl +bct +tdK +whu +tDL +wbk +tFU +gEz +nuH +eWg +fAJ +fAJ +taP +fAJ +ohL +fAJ +ohL +rld +uij +luY +ggE +pJS +bMX +ons +oAT +uzV +vgH +bQP +gfV +kpe +xyN +xyN +thh +ofy +jMi +von +kSD +ptK +lAu +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +lAu +lMJ +aaa +lMJ +aaa +aaa +aaa +isJ +jqW +isJ +aaa +aaa +aaa +aaa +aaa +lAu +aaa +aaa +aaa +aaa +aaa +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aUn +lAu +fEJ +gpZ +ghU +xhj +eaS +gYT +pck +aQR +eTF +beH +msQ +lkM +lkM +hIP +cYM +cjR +blu +nkw +poO +blu +oUW +sTJ +blu +pkB +dnL +fvk +cep +reN +uUi +juB +pGo +ktz +hVC +ekj +aLd +pRW +tHv +pRW +gff +qcu +tdK +ocA +tdK +tdK +tdK +tdK +tdK +tDL +wbk +tgp +nLR +xVh +bFa +mfe +mfe +axQ +ydu +veX +crZ +abM +wov +otz +qIM +mzm +koq +kez +hPv +cxt +tes +eiW +mol +lRu +sYq +iKa +ydo +jHk +rtK +jMi +wDl +kSD +ptK +lAu +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aox +aox +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +kMn +uLy +ojz +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aUn +aaa +tpS +mWO +axB +okC +jnp +ukE +sZi +dUA +dUA +dUA +bvx +dUA +dUA +kLA +kPU +dFg +blu +ajr +oWe +blu +vbB +ioh +blu +mpA +jkO +oyS +unK +xqh +edd +pxh +oyS +hCP +pRW +qEc +lgM +qCf +qCf +pRW +tEQ +wkl +tdK +nGK +jWT +jWT +jWT +eza +kNJ +tAu +vXm +lqU +nLR +tgl +mVr +pOQ +nru +axQ +pOR +oNH +osl +sVF +egt +nlD +ois +iRT +wWE +upb +fVQ +bKl +lfp +cNj +eiW +mqS +sYq +xGY +xGY +uyP +mhs +jMi +wDl +dEK +isJ +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +ksB +aaa +aaa +aaa +ksB +aaa +aaa +aaa +ksB +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aUn +lAu +fEJ +xuv +uWN +cyq +hkg +aEf +ljk +xBD +xBD +lHr +fbl +wHe +sxP +sxP +kPU +vAB +blu +rBl +yeS +blu +nwh +gGC +blu +szK +jkO +xRx +dQk +pHU +kda +mrR +mrR +thr +ndo +urv +fBf +mAC +gGX +ojW +vgw +wkl +tdK +owe +tdK +tdK +nVR +tdK +tdK +crI +lKh +krX +cem +cem +cem +cem +neZ +taP +mfe +mfe +whK +uQS +aWk +nlD +ohl +kDb +rJX +mXp +ons +xYs +pJs +szQ +eiW +ptZ +sYq +ikj +ikj +ePr +iSi +jMi +wDl +dEK +isJ +isJ +isJ +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aUn +lAu +fEJ +fEJ +fEJ +tpS +tpS +czM +mRF +hJy +slT +xLW +xLW +xLW +gnx +oCW +kPU +vWY +blu +blu +pHZ +blu +blu +gKy +blu +blu +flc +xPF +tKf +bfA +doi +blu +bMt +bMt +bMt +sAE +nbA +sAE +bMt +bMt +tdK +tdK +tdK +rnI +tdK +aaa +aaa +aaa +sYJ +tDL +wbk +lqU +nkJ +pWd +lnv +cem +qPr +taP +fAJ +fAJ +osl +uQS +egt +nlD +nGW +ssN +upb +aFe +ons +asJ +cAr +acV +eiW +mol +jZd +kCb +kCb +tgh +eDJ +jMi +wDl +dEK +isJ +rJT +rah +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +xfb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aUn +lMJ +dwJ +lAu +lAu +lAu +hYV +fln +aAs +xms +prK +ioe +ioe +gKA +gik +ihm +gOO +pAf +gKI +jUx +pGo +xKp +jUx +pGo +iKI +ftC +nsI +mkx +doo +bfA +jKs +fXG +bMt +gGE +bKA +sYS +kdX +sYS +uHI +adQ +tdK +luG +jWT +cjS +bXZ +jSI +aBk +jSI +jSI +tDL +cPd +oIo +cYH +gTK +ncX +cem +aiN +oyU +cHp +fQq +osl +uQS +nNY +nlD +txv +vcT +pWo +gDM +ons +fTJ +woD +nVu +raL +mol +gyi +pdw +dKV +qgI +vGA +jMi +wDl +fVd +sDV +xMk +wzw +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +xfb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +dwJ +aaa +aaa +lAu +hYV +frw +uoK +uml +prK +ioe +bNq +ioe +pqA +mMX +dKy +dUA +hCP +oyS +edd +dAC +oyS +edd +oyS +wWJ +oyS +oyS +uFo +rRF +jKs +rst +bMt +fTQ +pWu +jXL +fri +cQu +bjv +tiF +tdK +qIi +vas +mMu +bXZ +iTM +eyk +xuZ +jSI +tDL +wbk +lqU +nkJ +aKf +ufZ +cem +uUq +lnA +cLB +qUc +rND +uQS +vDV +fnT +pCH +oSm +oCO +oCO +oCO +oCO +oCO +aUo +gqZ +mol +lel +xEH +odO +hrc +dee +jMi +mAt +fVd +isJ +wWo +plx +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +dwJ +aaa +aaa +lAu +hYV +xGw +jSh +luT +prK +thM +gqE +gqE +rhq +pdh +eaH +qBw +fbt +pcr +kda +gcF +bHT +kda +pcr +nMa +nol +wJD +jKs +mDH +jKs +jBV +bMt +uKl +pWu +jXL +iBU +jXL +dKF +lli +tdK +vPg +tSE +qzL +bXZ +eFa +jbD +iBO +jSI +tby +nnv +wNZ +qbl +qbl +qbl +qbl +cOH +fKl +qcj +gML +nlE +frK +ons +usT +aWh +sDm +oCO +bAk +qfx +iOA +oCO +fkb +dUC +mol +afC +ulq +wAk +vbR +hTj +byi +mZj +wmp +qbl +qbl +isJ +isJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lKu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +rrt +wiF +oaT +aaa +czM +czM +aaM +hKk +nBr +jKe +jKe +jKe +miV +pfr +xBD +hIn +blu +blu +sPs +blu +blu +pIX +tdK +aFW +tdK +blu +aCD +blu +pBM +blu +bMt +uCA +pWu +jXL +gIR +ohB +auf +qVx +xsj +jME +tdK +tdK +bXZ +jSI +vTi +jSI +jSI +tDL +eHH +nNh +qbl +swc +oEb +qbl +kws +cAd +sER +sER +ssA +vLe +sGj +uAJ +aGO +xMu +yhU +hEL +tlN +thR +oCO +jwR +lES +mol +hfp +mol +byi +byi +byi +byi +fJZ +wbv +tDq +qbl +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +czM +czM +hYV +czM +czM +dfP +hNh +oRQ +hKk +erM +slg +erM +pfr +pfr +xBD +eIe +blu +qKL +mwC +blu +nfH +mMs +tdK +wka +tdK +nWL +gGC +blu +mMs +iEE +bMt +eRN +tzk +rPp +ujQ +mSt +rRp +sKT +tdK +nxg +tdK +tPg +msa +uVc +gRC +pQH +jIP +nRN +wbk +lqU +qbl +sti +avC +qbl +ngM +hxX +cbi +ljb +xwA +muo +sGj +kNb +wnP +gvN +oCO +fyV +gqa +xli +oCO +eTz +lES +lnz +rhw +xmE +qbl +tme +aPS +wPW +gst +sNI +ykk +qbl +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +lAu +hYV +jrw +xGB +mdB +iDm +ioe +hNh +xpR +sHU +vTa +sWd +vTa +sHU +vTa +xBD +xhS +blu +kco +wkO +blu +ebX +tDY +tdK +gmf +tdK +muN +riw +blu +fgV +dne +bMt +ekD +oPb +rDZ +jvm +kGj +fgQ +ekD +tdK +qIi +tdK +axb +jRz +sBL +wxE +myi +jIP +tDL +wMW +wYa +bnJ +yeB +aRu +qbl +wyQ +hxX +dNN +eSA +gJq +pOZ +sGj +sGj +sGj +sGj +sGj +sGj +aej +nFx +oCO +gly +lES +dKp +rhw +lae +qbl +wSD +qbl +qbl +qbl +qbl +qbl +qbl +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aac +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +czM +czM +iDm +czM +czM +jFR +hNh +wYS +hNh +gGj +gGj +hJy +mXJ +mXJ +hJy +kuX +blu +pUh +sTJ +blu +iRU +poO +tdK +gmf +tdK +pUh +vNU +blu +qzj +ujg +bMt +pPb +lBT +rSJ +sgk +pWc +xzW +lBT +tdK +qIi +tdK +mGK +jRz +ltL +nfU +oAy +jIP +nWY +lKh +nKc +qbl +fKq +yeB +qbl +utz +iQj +eZg +eZg +hKc +qxZ +xqO +jFz +bNS +eKt +kFj +sGj +img +oQY +oCO +bnj +lES +nGF +gQz +sAD +qbl +qQH +qbl +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +czM +aaa +mXL +lAu +czM +czM +hYV +hYV +lzP +hYV +hYV +lzP +hYV +hYV +hYV +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +cZB +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +tdK +uer +tdK +eVM +suB +yie +nfU +vEY +jIP +pZj +wbk +lqU +qbl +qbl +xIE +qbl +jlf +fgd +lgb +dpx +iYt +aym +sGj +yed +nQd +nER +gDt +sGj +fAW +crV +qbl +qFd +qbl +lgk +vNX +hBA +xlX +eas +qbl +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +hKH +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +otd +tdK +auo +ljU +awI +qRn +tdK +gmf +tdK +qgX +uFv +jWT +sLS +awd +tdK +tbM +aLZ +aNm +vas +eHq +phZ +qgX +tdK +qIi +tdK +vGE +tbv +iEi +vdQ +vdQ +klh +tAu +blz +lqU +qbl +fts +yeB +qbl +qbl +gEo +qbl +qbl +qbl +qbl +qbl +isE +nTI +tCr +qwF +qbl +uzj +qbl +qbl +rOL +qbl +qbl +fLz +qbl +qbl +jdo +qbl +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +lMJ +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +tdK +tdK +tdK +tdK +tdK +eKK +hgP +eIt +jWT +jWT +sqy +eQZ +fyP +jWT +sQB +jWT +jWT +lxD +jWT +jWT +kGf +jWT +jWT +sqy +tdK +lZB +kMN +xEb +fun +vQj +jIP +gts +xEX +mFY +olS +bcK +bcK +bcK +fVl +dHx +fVl +fVl +hYY +xWU +qbl +tXJ +igv +uEg +hkQ +lZn +wJj +ibC +gKZ +opV +qbl +iNP +aCo +rrD +hlQ +vWU +qbl +aaa +aaa +aaa +aaa +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +quc +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +sWp +hQU +ruS +dnR +tdK +gmf +dnR +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +xXE +xXE +xXE +xXE +xXE +xXE +rIJ +gNd +llm +vym +vym +vym +vym +vym +vym +vym +lbf +xmu +dep +qbl +qbl +qbl +qbl +qbl +qbl +nHu +gsc +pIj +jkI +wpE +qcG +sNf +axm +rya +osp +fLZ +trk +trk +trk +trk +trk +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +lMJ +aaa +sxG +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +eeL +tdK +dYy +tQT +auq +lhd +tdK +qAd +dnz +bXZ +tyQ +vfz +pWG +dzB +uhm +bmU +oFp +gzT +qgA +qgA +bmU +aHo +wVC +dNY +hoe +bmU +sMx +lmC +izy +cLt +pTj +nFW +xXE +vEE +gNd +llm +gyJ +npp +goQ +rKl +kzV +tFd +vym +kIb +jxB +kpE +fVl +bcK +fVl +bcK +iPr +vQW +eTg +cEO +dCk +aDV +qbl +boP +lPc +rya +nDU +osp +mKO +scq +qne +apX +mcS +gMx +gMx +uYZ +uYZ +uYZ +uYZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +lMJ +aaa +aaa +lAu +hYV +oOM +afD +afD +afD +afD +afD +afD +afD +afD +rbS +tdK +tLb +atd +qNE +qGu +vJG +xxL +hBd +bXZ +oyN +jrJ +iHd +pfk +cAR +bmU +gzT +gzT +qgA +gTu +bmU +fdM +rsB +cqF +cWh +bmU +qpE +ehA +oDx +nbz +tsF +bJb +xXE +vEE +gNd +llm +gyJ +crq +wHB +tQy +nuw +dpZ +vym +lxA +xBq +rya +nDU +ksY +rya +hCi +qbl +qbl +qbl +qbl +qbl +qbl +qbl +nDU +wbt +gaq +oEh +osp +iFO +xOg +xOg +xOg +fgs +vRF +rGM +xbs +bIV +jED +gav +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +lMJ +aaa +aaa +lAu +hYV +bFK +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +tLb +atd +atd +atd +tdK +bmo +mNo +bXZ +vNt +lbo +fBB +uYj +ylw +bmU +wzv +oJk +pix +gZK +bmU +veH +gKW +ojl +eMG +bmU +mPB +ehA +liO +cEa +uXa +caG +xXE +bTg +vOz +bDH +gyJ +gyJ +gyJ +fDE +gyJ +gyJ +vym +vym +vym +vym +vym +vym +rlQ +swc +qbl +whU +xwY +eQl +eLH +bXg +qbl +deE +gek +jll +vym +osp +nXq +xOg +stM +xOg +gAs +uYZ +jfE +uYZ +gHb +jfb +uYZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +quc +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +tLb +atd +kHe +atd +tdK +oDO +lmA +bXZ +mrd +eQv +wBw +uYj +gpd +bmU +tbf +pix +mzL +kSV +bmU +qVr +viK +vCL +vTx +bmU +xXE +iQL +tlo +lMZ +uXa +lkj +xXE +dpv +tMv +llm +lLU +ovn +lLS +lYp +dvg +fDp +fVF +eou +rKQ +itE +sZX +vym +vym +vym +vym +mns +nRC +vTg +rya +cmZ +qbl +qbl +pCK +oHm +iZI +sSk +tkE +aTJ +aiT +gqm +ghG +bLX +jwM +uYZ +iKn +uYZ +uYZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +dnR +aus +tdz +tUa +tdK +gmf +iCl +bXZ +rto +lbo +ocf +dkj +vIp +bmU +bmU +rLh +rLh +bmU +bmU +epw +muT +eAQ +muT +rQv +oiP +ehA +uQZ +vTl +kee +jkT +uMC +bTL +ajv +mHP +syY +miC +mHP +jEh +bgN +azi +lvP +ctb +ntK +too +cpd +jIG +jIG +dRK +vym +fub +hYU +buD +uaf +hYU +qjr +vuA +dep +twq +pVc +iuC +afQ +pyN +krz +xOg +iij +lqI +vIv +hGy +rBF +kyC +lAu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +lAu +hYV +afD +afD +afD +afD +afD +afD +afD +afD +afD +afD +tdK +tdK +tdK +tdK +tdK +tdK +cZB +bXZ +bXZ +gjS +qVr +bkF +vTx +gjS +gjS +hAj +iHd +iHd +isz +gjS +fPT +wwz +hHd +gFk +ssT +dDX +vex +fxM +wsZ +nup +dbw +fjR +odV +mNM +bto +pZT +wgZ +vVB +sga +imG +sZA +xPM +kUA +qIK +hQs +exa +pVV +nFJ +iEl +vym +xwO +swp +rya +rJV +mPp +dFI +qbl +jVU +lsT +pVc +jqb +lWh +lNv +oED +lfY +caC +tii +trz +uYZ +iKn +uYZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +rUb +czM +czM +czM +czM +lzP +hYV +hYV +lzP +tdK +tdK +tdK +tdK +nEm +tLb +tdK +dqu +lhd +gmf +bXZ +odc +qWS +muT +ngd +muT +dTY +quZ +muT +muT +muT +muT +jLb +xNc +muT +xSy +gDo +gjS +xXE +xXE +xXE +xXE +xXE +xXE +xXE +lTX +qAi +aOH +iuJ +iuJ +iCM +xst +xdP +iuJ +gZB +wnV +vTH +boM +mef +ijJ +hgX +uFz +vym +ybw +xZD +nRC +iGi +kIb +vym +vym +bhI +vym +pVc +mKv +voe +pMX +ckA +uvo +uvo +kKm +gED +uYZ +kZT +uYZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +quc +aaa +aaa +rUb +rLv +rLv +kiE +czM +mXD +hnX +mok +vyp +tdK +tdK +apd +eXB +arK +dnS +tdK +tdK +tdK +gmf +bXZ +uLR +agk +wwz +bIp +muT +tdc +muT +lGN +bCR +jqS +muT +oHi +jqS +fBB +xSy +muT +vdF +gjS +wOh +oZv +eEg +pWb +gjS +hfk +oMw +als +mVL +mLF +miG +sUh +iFw +nxd +pMm +gZB +nwg +osK +sXM +mef +vgq +guv +njp +vym +oKF +pvU +nZF +bXg +wbE +vym +rmz +uWU +bkD +omb +lKf +rDW +ckH +cii +niY +niY +niY +jJC +jJC +jJC +jPJ +xXp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lKu +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +lMJ +aaa +aaa +tPH +rLv +rLv +rLv +czM +qqe +tyu +vTa +sDb +jQK +uka +uka +opF +opF +mRC +bAS +hDw +hgP +nzb +bXZ +kSW +lnS +gZM +eYS +lnk +lnk +lnk +lnk +lnk +lnk +lnk +eYS +lnk +gZM +dPm +fMs +ukb +smb +kza +svS +sPE +cDm +jyP +sfr +gYs +puI +cgE +xgO +kgQ +umR +xgO +rvR +rPb +gZB +gZB +vbX +iCd +xTx +gZB +kll +yfS +vym +vym +vym +vym +vym +vym +vym +gBb +xHR +vZz +tHX +xca +fXQ +tDH +vNT +rEd +rEd +rEd +rEd +rEd +aaf +ihW +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +lMJ +aaa +aaa +rLv +rLv +rLv +rUb +czM +czM +tdK +tdK +tdK +tdK +bcO +dnS +dnS +fFV +dnS +tdK +rSZ +bXZ +mdE +bXZ +nyT +wic +muT +xKr +muT +nrt +vbi +elF +xoA +bgQ +oAa +eTE +cAo +xoA +rME +oAa +qvb +gjS +akp +lZK +qDC +pWb +gjS +wVW +fQk +ezw +rRw +nNg +her +sji +kEt +mYi +ozv +wDT +nuq +xYJ +dNU +heu +gZB +iSS +xuI +vBH +vBH +jYH +jYH +ckH +wzg +khq +ckW +lWV +lye +lye +rot +iyL +nAL +cxl +mQD +pfd +oEu +oEu +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +lMJ +aaa +aaa +rUb +rLv +rLv +anS +aox +aox +mBY +fLx +mSz +fLx +dnS +xJf +mpz +pSs +tdK +tdK +lzG +bXZ +bRy +vio +eQv +wic +muT +fQO +fQO +fQO +fQO +hbu +hbu +aAz +hbu +hbu +hbu +hbu +row +hbu +hbu +bmU +kfx +agf +jCG +kfx +kfx +xcF +dfF +qgi +igk +cpj +fqG +shG +xwN +hVB +qZx +gZB +gZB +aRO +iCd +xlb +gZB +rpn +asj +fKb +qCV +cMU +cMU +hcO +izf +izf +nTL +ufw +fKD +fKD +cJz +voY +jIO +aaf +kZg +lan +hdc +nUU +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +quc +aaa +aaa +ffP +rLv +rLv +aWl +aaa +aox +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +bXZ +uuW +lzV +hVj +njb +ffx +xNc +wic +muT +fQO +bWZ +khE +iNO +hbu +dAK +jSH +mLi +mrX +nDt +kmV +gRF +dBQ +hbu +uQW +hbw +qKK +ePR +mWs +vsP +uOF +oxe +dXW +eLq +otk +hXY +tGN +flt +nKu +mVg +gZB +fcX +rlH +bFQ +pzw +jYa +oOQ +icV +unV +joc +hKO +hKO +cwl +jIs +lgz +mrV +fJd +xoQ +sMi +bzU +sUf +pRo +xmT +tkp +udr +ntZ +oEu +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +lMJ +lMJ +fWs +rUb +rUb +aWl +aaa +aox +hVj +jyv +bTT +jyv +mQn +pNC +qmL +lVt +qgj +iiO +voZ +uiP +qqR +loe +lnk +ipW +muT +fQO +woa +vEL +ebN +sWs +oYz +jSH +mrX +iis +gxi +gNj +gxi +cNZ +hbu +pAO +bWN +bWN +szv +dEm +kzS +sPk +vTZ +dHo +lJT +lBV +puc +szM +fvr +sRz +tLK +gZB +ahv +mju +nNn +oRB +wAZ +etP +jyS +eGO +igr +wDF +mrb +wDF +igr +sDx +diY +fJd +caT +dfX +oul +scZ +wGd +aaf +rEd +rEd +rEd +rEd +rEd +aaf +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +hVj +uhU +frC +scT +xTq +hVI +jRw +emK +hVj +vZC +cPp +hVj +aJY +muT +sUI +vEQ +oAa +fQO +cYP +ebN +nGR +hbu +bQk +thH +thH +jHt +wGh +tKc +wGh +hsF +hbu +tYR +irV +pko +pko +bAJ +vsP +laG +iXg +tPN +mBy +lUR +eTk +gxl +nHN +bFD +tLK +gZB +oTE +eEs +oUA +exn +ntw +muL +sUw +ezz +igr +lip +bhq +igr +igr +vbF +diY +foI +caT +uzC +jhT +ntb +nAL +cxl +mQD +vSQ +sRI +sRI +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +hVj +ymf +jyv +xpb +aia +gXe +jRw +qJh +hVj +bXZ +xuk +bXZ +qsV +qsV +qsV +dfV +qsV +fQO +fQO +mKC +fQO +fQO +fQO +fQO +fQO +nOp +xwb +xwb +xwb +cHd +fQO +sRo +hGj +hzD +eDW +wFh +vsP +hoa +rBt +tPN +kSg +lUR +xUJ +pYe +pCM +vpS +gAB +gZB +ntw +ntw +gZB +yfS +gZB +ink +cQn +sQn +igr +oFy +oFy +xhW +igr +iek +eKy +fJd +caT +uzC +eIo +nMw +jIO +aaf +kZg +sOz +ntx +uKH +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +hVj +scT +frC +uhU +szy +hVI +xro +khs +aFH +bXZ +ppz +bXZ +hJY +bon +xtW +mug +qsV +qBM +flB +hCX +sJp +fQO +fbm +gJn +vbf +vSt +aPa +dmM +iAF +yjM +fQO +gNl +gNl +gNl +gNl +gNl +gUa +mON +xwN +jDe +fkS +pxl +ufy +uAP +wof +qPn +fGm +lbc +oXa +ncr +bjJ +vPz +ond +gIA +lPR +lye +rPG +lye +lye +lye +mnJ +owB +elN +fJd +qHw +gSp +dsD +iuB +pRo +xmT +tkp +cCL +mTn +sRI +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +hVj +jyv +iPU +qRx +sKk +rCn +cHP +kFz +wgF +bXZ +jql +rmA +xch +rod +jku +hfh +qsV +sTC +giA +lqR +giA +fQO +kBI +oNM +kBI +vSt +cuj +kBa +nbX +wlz +fQO +rWr +wif +apc +jEp +fWF +rqM +nkQ +xwN +ifi +kWT +kWT +kWT +kWT +kWT +kWT +esG +lDl +aLq +aQU +ubM +tAn +nHc +xov +cQn +rtq +lye +lye +lye +lye +lye +lye +elN +sWh +caT +qah +usp +scZ +wGd +aaf +rEd +rEd +rEd +rEd +rEd +aaf +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aWl +rrt +rrt +rrt +rrt +rrt +rrt +rrt +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +aox +hVj +hVj +hVj +hVj +hVj +hVj +tVF +kFz +adp +bXZ +cpW +bXZ +ooQ +rod +jku +gGZ +qsV +iqW +tyF +pmR +ohk +ohk +ohk +fYL +ohk +uod +uod +qqA +fYh +rTm +fQO +apc +apc +kZJ +apc +lLs +gUa +xOA +swT +dmz +ixH +vhj +qoJ +aju +mAR +pVl +nas +iqy +eSU +eSU +iEx +tZy +dIg +azB +cQn +lye +lye +lye +dtQ +lye +lye +bvZ +elN +fJd +bWK +gSp +flF +tcp +phQ +oId +gXO +dKU +iXC +iXC +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aac +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +lMJ +aaa +aaa +aaa +lAu +wjD +rRY +xgf +cAI +bXZ +cpW +bXZ +hLm +ykb +hAt +bbS +qsV +qyV +qWR +tgv +tgv +dVN +dVN +oJU +dVN +qbS +pHq +tOz +xVP +jgT +fQO +qST +apc +apc +jEp +nDG +gUa +ufx +bcU +jaw +kWT +vti +gbA +gbA +pyj +bkJ +qYo +sxU +oQw +mPX +aNV +tZy +dIg +dZW +cQn +lye +gKE +tmx +tmx +tmx +lye +lye +dmI +fJd +mzG +uzC +sTk +wkj +jIO +aaf +kZg +ulM +wkJ +ewV +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aWl +rrt +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +lMJ +lAu +lAu +mJI +nui +uJR +uJR +tdK +tdK +tdK +fiK +bXZ +qsV +pew +nEo +jRc +qsV +pSk +sPO +lhN +giA +sOy +teO +xjt +mXO +ezT +dSH +mUR +qZy +bln +fQO +dgf +jEp +apc +apc +kZJ +gUa +gUa +cmC +tqX +gUa +uxG +jws +usW +kWT +qgf +gTx +kJi +eSU +tMI +aNV +tZy +dIg +azB +aJJ +hhk +hhk +hhk +hhk +qGs +lye +cLJ +elN +fJd +lye +ior +iVR +xuz +phQ +oId +rbf +fMu +hAn +iXC +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +lMJ +mJI +nui +nui +nui +lnd +wvz +pXW +tdK +dnS +eoL +bXZ +gAj +eGo +izD +idP +qsV +rYt +kBI +vsC +vuR +xBK +mVZ +kBI +hbn +msK +pgy +kBI +mVZ +jgT +fQO +ieH +apc +apc +apc +apc +gUa +fqO +wIM +apc +gUa +gkk +kFl +xCY +kWT +jAT +gTx +wOj +xxQ +lhr +szT +gEB +sQw +kkn +bMV +bMV +bMV +bMV +wVw +jTv +fXk +fXk +aJr +kJA +fXk +sXV +mFv +pTM +ckH +aaf +rEd +rEd +rEd +rEd +rEd +aaf +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +lMJ +lMJ +eAV +pSx +pSx +pSx +mUH +lgK +pSx +pSx +pSx +pSx +pSx +lgK +pSx +pSx +pSx +pSx +pSx +pSx +pSx +qiK +fVb +wdt +wNa +aqz +aYo +wWu +htQ +gwY +bXZ +fQm +fcN +nWl +fwY +hPn +auI +dku +olb +fGW +puf +nku +kLK +hbn +eIA +pgy +vyC +mVZ +jgT +fQO +fQO +fQO +fQO +aFU +apc +rqM +apc +fEg +jEp +oHs +mNE +aOY +aOY +kWT +tUI +esG +gLL +dAD +eqy +nAJ +dtV +tAh +lnN +fSe +lgY +wNx +qGE +sVQ +dEv +fFg +wlJ +iyS +thD +fFg +nMR +jSb +jTk +ckH +aaf +aaf +aaf +aaf +aaf +aaf +aaf +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +eWt +aaa +aaa +aaa +aaa +aaa +eWt +aaa +aaa +aaa +aaa +lMJ +aaa +mJI +nui +nui +nui +efW +sbP +xEF +dyq +ekZ +dnS +bXZ +bXZ +qsV +qsV +qsV +qsV +dvl +iwY +sIn +aUg +cfE +qLM +xXH +uwc +eIA +ptB +kBI +sSL +ygx +rGc +tOg +uGb +fQO +fQO +fQO +fQO +cKD +uNC +mtC +oHs +cCj +lMJ +lMJ +aaf +ack +esG +esG +esG +esG +esG +ras +vRp +vRp +vRp +vRp +igr +igr +yfz +agJ +rmt +dyb +jXp +pgn +jxU +lzj +mFv +bgp +ckH +lMJ +rEd +rEd +rEd +rEd +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +lMJ +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +lMJ +aaa +aaa +lMJ +mJI +nui +uJR +uJR +uJR +tdK +tdK +dnS +dnz +awI +atd +dnz +fQO +kBI +lDy +cyY +eZz +fGW +qCW +sIt +qvC +vOG +xon +udw +cMD +dxo +hZj +hRr +aWK +mTP +xjt +mCr +bpc +fQO +boY +apc +jEp +oHs +cCj +ack +ack +ack +ack +ack +aox +aox +aox +bOW +ras +twh +ulj +rUI +xor +jNc +ruF +nyx +ffN +elN +cSF +rtq +wLr +vdd +uzC +lLZ +pFE +cxx +xtZ +hJF +hgg +mfM +mfM +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +rrt +rrt +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +lMJ +aaa +aaa +lMJ +lAu +lAu +aaa +aaa +aaa +tdK +dzb +lhd +dqu +bXZ +dnS +vas +fQO +kBI +hZj +kBI +vsC +krH +xBK +xXH +fQO +chg +xyQ +aQc +fQO +gwv +aDY +dgg +dgg +luw +mIi +cAZ +mhi +fQO +dgN +bWe +nrP +oHs +oDe +lMJ +aaa +lMJ +aox +lMJ +aaa +lMJ +lMJ +aox +nul +prP +bHq +bHq +bHq +vDj +unQ +ydF +dZY +elN +wia +pik +mCT +pik +uzC +pRX +sxZ +jIO +lMJ +kZg +odF +tGx +piV +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +lMJ +lMJ +dUd +dUd +eWt +dUd +dUd +lMJ +dUd +dUd +eWt +dUd +dUd +lMJ +lMJ +aox +aox +aox +aox +aox +aox +aox +aaa +lAu +nVR +qgX +dnS +bXZ +bXZ +dnS +aaJ +fQO +mNe +lDy +ohk +oNO +jbZ +oRh +tZx +dJc +xYw +mPk +doj +oqk +kBI +hZj +eYz +gHG +mrg +kRh +cPc +gKd +fQO +oHs +mZY +oHs +gUa +cCj +aaa +aaa +aaa +aox +aaa +aaa +lMJ +aaa +aox +nul +prP +bHq +qPh +bHq +lGq +oKH +ydF +dZY +elN +qaf +cOb +wLr +pik +qah +brx +tJu +uyD +gQf +cbn +vPU +tZW +mfM +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +aox +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +tdK +auB +avG +bXZ +oBm +lhd +fQO +fQO +kBI +hZj +kBI +kBI +kBI +kBI +kBI +dJc +jUO +stl +jUO +oqk +kBI +hZj +gQK +wDi +fud +hZj +cPc +iWk +fQO +kmw +wQr +ebP +gUa +oDe +aaa +aaa +aaa +aox +aaa +aaa +lMJ +aaa +aox +nul +prP +bHq +bHq +bHq +lGq +oKH +ydF +dZY +elN +wia +pik +wLr +pik +uzC +oYR +sxZ +jIO +lMJ +rEd +rEd +rEd +rEd +rEd +lMJ +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +aox +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +tdK +tdK +vBr +bXZ +shh +pYY +fQO +kBI +iqW +iWx +ncf +ncf +ncf +srP +gBk +eTP +abh +vIG +qpR +wGA +gBk +rzY +iWx +iWx +okn +iWx +fjQ +gKd +fQO +oHs +jHE +oHs +gUa +cCj +lMJ +aaa +lMJ +aox +lMJ +aaa +lMJ +lMJ +aox +nul +gKY +gZv +ogd +gZv +djC +iEh +ydF +dZY +elN +lqD +gKE +kPs +lye +uzC +eDX +pFE +cxx +xtZ +hJF +duG +lSa +lSa +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +lMJ +lMJ +dUd +dUd +eWt +dUd +dUd +lMJ +dUd +dUd +eWt +nnT +nnT +lMJ +lMJ +aox +aaa +aaa +aaa +aaa +aaa +aox +aox +aox +vBr +mGx +avG +bXZ +bXZ +bXZ +fQO +fQO +egL +dBl +dBl +dBl +dBl +bud +fQO +fQO +fQO +tFq +fQO +fQO +fQO +lHH +gBI +gBI +gBI +gBI +eEf +swD +fQO +lAu +mXL +lAu +gUa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +lMJ +ras +dwD +oIp +kfn +uzQ +jfz +edU +ydF +thK +eKy +wCh +dtQ +dSC +lye +kHI +evv +fsc +jIO +lMJ +kZg +iNH +xuL +jiR +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +aox +aaa +aaa +aaa +aaa +aaa +gvH +aaa +aaa +tdK +tdK +vBr +bXZ +aaa +aaa +aaa +rrt +ycg +ycg +ycg +ycg +ycg +ycg +aaa +aaa +aaa +aox +aaa +aaa +aaa +ycg +ycg +ycg +ycg +ycg +ycg +fwP +lMJ +aaa +aaa +aaa +lMJ +cCj +aaa +aaa +aaa +aaa +aaa +aaa +ras +ras +ras +sSw +fiG +nfv +rRg +ras +nfv +sbG +xds +dZY +elN +wLr +mLX +wCh +lye +txN +tTJ +tJu +uyD +gQf +cbn +vof +iqk +lSa +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +aox +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +lMJ +aaa +aox +bXZ +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +lMJ +lMJ +lMJ +quc +lMJ +lMJ +lMJ +dgu +dgm +dgu +dgu +dgm +dgu +aaa +lMJ +aaa +aaa +aaa +lMJ +cCj +aaa +aaa +aaa +aaa +aaa +aaa +ras +vEF +pDz +xTd +dtK +rTy +lSX +gqt +nfv +nfv +cYL +xSg +elN +cXJ +nWX +mCe +bvZ +uzC +oYR +sxZ +jIO +lMJ +rEd +rEd +rEd +rEd +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +rrt +lMJ +lMJ +dUd +dUd +eWt +dUd +dUd +lMJ +dUd +dUd +eWt +dUd +dUd +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +quc +lMJ +lMJ +bOG +lMJ +aox +aaa +aaa +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aox +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +aaa +lMJ +aaa +aav +aaa +lMJ +oDe +lMJ +lMJ +rUb +gFb +aaa +aaa +nul +qyJ +dtK +dtK +dtK +dtK +hZp +dtK +dtK +nfv +nfv +jDg +elN +wqQ +ajk +vXU +lye +uzC +qll +pFE +cxx +xtZ +hJF +iTe +beJ +beJ +rEd +lMJ +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +rrt +aaa +aaa +ewX +msP +scv +uYU +jQp +aaa +ewX +msP +scv +eZh +jQp +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aox +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +rrt +quc +aaa +axw +aaa +quc +cCj +aaa +aaa +aaa +aaa +aaa +aaa +nul +nby +dtK +auA +sce +gUz +sce +bja +dtK +tla +ras +rWA +tHX +mQH +wCh +uzC +lye +uzC +rCr +sxZ +jIO +lMJ +kZg +mld +tmf +vKn +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +rrt +aaa +aaa +ewX +msP +gON +uYU +jQp +aaa +ewX +msP +gON +eZh +jQp +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aox +lMJ +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +lMJ +lMJ +lMJ +quc +lMJ +lMJ +lMJ +dgu +dgm +dgu +dgu +dgm +dgu +rrt +lMJ +aaa +aaa +aaa +aaa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +ras +kyP +dtK +tvG +bEN +vlR +qQt +gFw +dtK +dtK +idO +pmV +wsw +nDv +wCh +lye +hjv +anN +xyC +tJu +uyD +gQf +cbn +eoM +tJD +beJ +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +lMJ +lMJ +dUd +dUd +dUd +dUd +dUd +lMJ +dUd +dUd +dUd +dUd +dUd +lMJ +lMJ +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aox +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +rrt +aaa +aaa +aaa +aaa +aaa +oDe +aaa +aaa +aaa +aaa +aaa +aaa +ras +sIP +dtK +haX +cII +fnS +sJk +gFw +oZB +dtK +nfv +bgH +qvf +caT +uuF +lye +gKE +dTX +lwZ +sxZ +jIO +lMJ +rEd +rEd +rEd +rEd +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +lMJ +aaa +aox +aaa +aaa +aaa +aaa +aaa +aox +aaa +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aox +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aaa +aaa +aaa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +ras +gjU +dtK +tvG +qQt +iqE +bEN +gFw +dtK +cvK +mDP +lcm +lye +mdd +riu +sMi +lyp +jFt +hRj +pwF +cxx +xtZ +hJF +xXU +jxI +jxI +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aWl +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +aWl +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +lMJ +lMJ +lMJ +quc +lMJ +lMJ +lMJ +dgu +dgm +dgu +dgu +dgm +dgu +rrt +iGq +bbT +aaf +vDl +lMJ +cCj +lMJ +lMJ +rUb +gFb +aaa +aaa +nul +dtK +dtK +yii +wYQ +eNT +wYQ +bPh +dtK +rvz +sSw +sdl +lye +caT +uuF +lye +lye +idy +wSd +sxZ +jIO +lMJ +kZg +jcZ +jxI +qQV +rEd +lMJ +nYJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +dgu +dgm +dgu +dgu +dgm +dgu +aaa +aaa +aaa +aox +aaa +aaa +aaa +dgu +dgm +dgu +dgu +dgm +dgu +rrt +aaa +out +aaa +aaa +aaa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +nul +nul +dtK +dtK +dtK +dtK +jwu +cvK +cvK +ahK +ras +cuQ +vZz +caT +peE +mwM +rUd +wIt +uRr +qYx +uqY +hwg +hgn +lPu +jeT +jxI +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +pat +baz +pat +baz +pat +baz +aaa +aaa +aaa +quc +aaa +aaa +aaa +pat +baz +pat +baz +pat +baz +rrt +aaa +aaa +aaa +aaa +aaa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nul +nul +dtK +dtK +urP +dtK +nby +wvB +gql +ras +hJC +lye +bWK +sMi +sMi +xow +hnF +jvV +qZk +ckH +lMJ +rEd +rEd +rEd +rEd +rEd +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +rrt +rrt +rrt +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +rrt +rrt +rrt +rrt +rrt +aaa +aaa +bug +aaa +aaa +aaa +cCj +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nul +nul +ras +ras +ras +ras +ras +ras +ras +mMe +uZh +aax +gfL +wkw +mJK +lQF +xDT +pob +tDH +kuD +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +rUb +iGq +lMJ +lMJ +cCj +lMJ +lMJ +rUb +gFb +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +quc +lMJ +nRb +wBI +nRb +lMJ +ckH +ckH +bDi +pWP +oLe +ckH +ckH +ckH +ckH +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +oDe +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +lJW +ckH +ckH +ejs +ckH +ckH +kph +uDd +abq +aaa +nYJ +aaa +aaa +aaa +nYJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +lKu +aaa +aaa +cCj +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +nRb +lMJ +aaa +qoI +fZQ +igr +eFP +igr +jcs +gBU +jNp +xQU +lMJ +rrt +rrt +rrt +rrt +rrt +lMJ +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +sNH +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +igr +baS +igr +lMJ +lMJ +lMJ +lMJ +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +sNH +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +qek +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nRb +wBI +nRb +dPw +fVZ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +rrt +rrt +rrt +rrt +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +qrm +qhp +aIK +aIK +dBL +aIK +aIK +aIK +eLw +qlV +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +eAD +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +sNH +aaa +aaa +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +gQZ +lMJ +lMJ +lMJ +lMJ +lMJ +lMJ +vaB +lMJ +lMJ +lMJ +aox +lMJ +anS +wBI +anS +lMJ +aox +lMJ +aox +aox +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lAu +bno +kMC +brO +mJI +aaa +aox +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +ceP +lAu +kMC +lAu +xCF +aaa +aox +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +lMJ +aox +aox +lMJ +eUu +aaf +kMC +aaf +eUu +lMJ +aox +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aMq +qjC +qjC +aOV +blw +aNw +rNc +aNw +qot +aaa +lMJ +aaa +nRb +wBI +nRb +lMJ +quc +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aMq +pyP +pyP +aOV +aMq +xct +kzZ +ero +aOV +aaa +aaa +aaa +lMJ +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +vAC +qmR +gir +vAC +rUb +iwp +mgt +qmy +rUb +aaa +lMJ +aaa +lMJ +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aSD +xew +pyP +aOX +bly +gMA +wXb +skt +aOX +aNw +aTQ +aNw +lMJ +nRb +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aNw +aNw +aNw +tJV +iKh +fTH +dJS +tRm +tRm +fmG +bOj +gey +tRm +tRm +tRm +icG +bjk +anS +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aNw +aTQ +mOA +aTQ +aSD +tTu +rHO +rHO +rHO +rHO +rHO +rHO +pnl +aVk +aOY +aOY +aSG +gMA +bzK +eiX +xTX +aOY +bcQ +lTt +ivL +mOA +aTQ +aNw +aNw +aNw +aNw +aNw +aNw +aNw +jMp +aNw +aNw +jMp +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +jLw +lMJ +azY +rUb +lMJ +lMJ +aMr +tmO +rHO +rHO +rHO +rHO +kIO +aVk +aOY +aOY +aOY +aOY +aOY +cTo +aaa +aaa +aaa +osc +lps +gax +iwa +xTX +aaa +aMq +juU +rHO +rHO +rHO +rHO +kLG +kLG +dGW +kLG +kLG +kLG +kLG +rHO +rHO +hLx +bBb +lMJ +lMJ +rUb +hHO +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +aaa +aaa +aMq +qbF +cAn +ops +aNC +aOY +cTo +aaa +aaa +aaa +aaa +aaa +aaa +cTo +aaa +aaa +cTo +cTo +cTo +kZw +cTo +cTo +aaa +aaa +cTo +aNC +ops +aNC +aOY +aOY +aOY +cTo +aOY +aOY +aNC +ops +aNC +bcQ +qbF +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +rrt +aaa +aaa +aMq +qbF +btK +anS +lMJ +lMJ +cTo +aaa +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +evI +abR +ouT +lxG +cTo +xTX +aaa +cTo +dPw +omL +dPw +aaa +aaa +aaa +cTo +aaa +aaa +lMJ +anS +lMJ +aMr +qbF +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aMq +qbF +vvv +anS +anS +anS +cTo +cTo +cTo +sqf +sqf +sqf +cTo +cTo +cTo +cTo +ttA +omF +bnx +tWM +iAn +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +xTX +xTX +xMA +anS +anS +tXy +qbF +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aMq +qbF +aOV +aaa +aaa +cTo +cTo +sqf +sqf +sqf +jug +sqf +sqf +sqf +sqf +sqf +ttA +tri +grG +ouT +dOT +uBD +uBD +uBD +uBD +uBD +aVy +iEY +bGc +oXu +bJg +cTo +cTo +cTo +cTo +lMJ +lMJ +aMr +vCa +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aNw +aSD +qbF +aOV +aaa +aaa +cTo +sqf +aVl +oFC +tRv +nxW +lro +odP +aVl +jGa +xkT +aAp +aAp +aAp +tQA +aAp +uBD +vEx +bGh +cbI +bAU +aVy +bEg +bGd +bGd +bJm +bNX +oJG +bOc +cTo +aaa +aaa +aMq +vCa +bAT +aNw +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aMq +vFk +qim +oqn +aOV +aaa +cTo +cTo +sqf +hXC +uUX +uUX +nHn +uUX +uUX +uUX +azv +dKG +aAp +caK +uyp +eEA +uFl +uBD +dak +bxn +bzo +rRe +aVy +bEh +bGe +bGd +bKL +bNY +bGd +ceC +cTo +xTX +aaa +aMq +cVP +qim +vCy +bgn +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aMq +jMP +iQr +oqn +aOV +aaa +cTo +cTo +sqf +kBT +aWN +sqf +sdh +sqf +sqf +aWN +uUX +ffv +aAp +hfN +esU +tMH +bsb +uBD +bvw +yex +bxq +bJh +gYq +gYq +gYq +sbk +bGd +bGd +bGd +bUL +aVy +cTo +cTo +bly +cVP +uKj +oqn +bgn +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +cTo +tRe +ddc +dMu +wJv +jZC +lzc +lzc +ohJ +sjZ +sZI +dor +iOn +jUG +sqf +rYA +jVh +aKb +xvo +xjy +lza +aEY +dEq +qMJ +fSu +fSu +tKw +ePG +rcI +bqV +ntA +ggK +bKM +bKO +yfd +yfd +dII +cff +fMJ +gPX +eNh +orU +ixw +cTo +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aMq +jMP +iQr +oqn +aOV +aaa +cTo +cTo +sqf +nMc +iCV +sqf +eZP +sqf +sqf +tfz +beK +uNc +aAp +kTN +jEn +eEA +bsd +uBD +qFO +bxq +cgq +bAY +gYq +gYq +gYq +sla +ctO +ctO +cFJ +yjO +aVy +cTo +cTo +bcQ +cVP +uKj +oqn +bgn +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aMq +jqB +wmB +oqn +aOV +aaa +cTo +cTo +sqf +grP +hOq +hOq +uEH +hOq +hOq +hOq +dAN +pIE +aAp +kxq +rgU +eEA +eTG +uBD +oeg +bxr +sls +jrT +aVy +bEj +bGe +bGd +bKP +bOb +rup +cho +cTo +xTX +aaa +aMq +cVP +wmB +uOm +bgn +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aOY +bcQ +oDr +aOV +aaa +aaa +cTo +sqf +aVr +iZN +oDc +fKn +gjC +iZN +aVr +vYj +ubB +aAp +aAp +aAp +xWO +aAp +uBD +vmM +yaG +hVM +jMK +aVy +bEg +bGd +bGd +bKN +bOa +tze +chn +cTo +aaa +aaa +aMq +vCa +aVk +aOY +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMq +nNL +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 +rrt +aaa +aaa +aMq +oDr +aOV +aaa +aaa +cTo +cTo +sqf +sqf +sqf +uAj +sqf +sqf +sqf +sqf +sqf +gyI +uIt +oSi +aep +avg +uBD +uBD +uBD +uBD +uBD +aVy +rFm +bGf +iMy +bJn +cTo +cTo +cTo +cTo +aaa +aaa +aMq +vCa +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMq +htS +nNL +nNL +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 +rrt +aaa +aaa +aMq +oDr +aOV +aaa +aaa +aaa +cTo +cTo +cTo +sqf +sqf +sqf +cTo +cTo +cTo +cTo +gyI +jhb +xdN +sRJ +hTt +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +xTX +xTX +aaa +aaa +aaa +aMq +vCa +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nNL +nNL +nNL +nNL +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 +rrt +aaa +aaa +aMq +oDr +aOV +aaa +aaa +aaa +cTo +aaa +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +cTo +gEv +xkw +hAD +rGy +cTo +xTX +aaa +cTo +aaa +aaa +aaa +aaa +aaa +aaa +cTo +aaa +aaa +aaa +aaa +aaa +aMq +vCa +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +nNL +nNL +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 +rrt +aaa +aaa +aMq +oDr +aOX +aNw +aNw +aNw +cTo +aaa +aaa +aaa +aaa +aaa +aaa +cTo +aaa +aaa +cTo +ipR +ktW +wuM +qev +cTo +aaa +aaa +cTo +aNw +aNw +aNw +aNw +aNw +aNw +cTo +aNw +aNw +aNw +aNw +aNw +bly +vCa +bgn +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +jLw +lMJ +azY +rUb +lMJ +lMJ +aMr +sTF +rHO +rHO +rHO +rHO +phr +aOX +aNw +aNw +aNw +aNw +aNw +cTo +aaa +aaa +cTo +cTo +cTo +ikC +cTo +cTo +aaa +aMq +bIb +rHO +rHO +rHO +rHO +rHO +rHO +nCH +kLG +kLG +kLG +kLG +kLG +kLG +rVB +bBb +lMJ +lMJ +rUb +hHO +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aaa +aNC +aOY +aOY +aOY +aSG +pRs +rHO +rHO +rHO +rHO +rHO +rHO +vjJ +bgn +aaa +aaa +aaa +aMq +nTJ +bgn +aaa +aaa +aMq +vCa +aVk +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aNC +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aNC +aOY +aOY +aOY +aOY +aOY +bcQ +vCa +bgo +aNw +aNw +aNw +aSD +onr +bsj +aNw +aNw +bly +vCa +bgn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aMq +hZm +rHO +rHO +rHO +rHO +rHO +fTo +rHO +rHO +rHO +rHO +uOm +bgn +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aNC +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aOY +aNC +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +lMJ +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +lMJ +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +rrt +rrt +rUb +rrt +rrt +rrt +rrt +rUb +rrt +rrt +rrt +rrt +rrt +rrt +rUb +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rUb +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rrt +rUb +rrt +rrt +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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 +sKY +aaa +aaa +aaa +aaa +wkv +aaa +aaa +aaa +aaa +aaa +aaa +sKY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +sKY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +sKY +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +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/MetaStation/chemlab_holder.dmm b/_maps/map_files/Theseus/chemlab_holder.dmm similarity index 98% rename from _maps/map_files/MetaStation/chemlab_holder.dmm rename to _maps/map_files/Theseus/chemlab_holder.dmm index 8907520fe0df..ded4aa2bab72 100644 --- a/_maps/map_files/MetaStation/chemlab_holder.dmm +++ b/_maps/map_files/Theseus/chemlab_holder.dmm @@ -24,7 +24,7 @@ dir = 8 }, /obj/machinery/power/data_terminal, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/table/glass, /obj/machinery/telephone/command, /turf/open/floor/iron/white, @@ -33,7 +33,7 @@ /obj/item/radio/intercom/directional/south, /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/blue/half/contrasted, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/computer/crew{ dir = 1 }, @@ -43,7 +43,7 @@ /obj/structure/filingcabinet/chestdrawer, /obj/machinery/newscaster/directional/south, /obj/effect/turf_decal/tile/blue/anticorner/contrasted, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/space) "af" = ( @@ -154,10 +154,7 @@ /turf/open/floor/iron/white, /area/space) "aq" = ( -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -4; pixel_y = 12 @@ -310,7 +307,7 @@ /area/space) "aJ" = ( /obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; name = "Chemistry shutters" @@ -496,7 +493,7 @@ /turf/open/floor/iron/dark, /area/space) "bg" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/poddoor/shutters/preopen{ id = "chem_lockdown"; name = "Chemistry shutters" @@ -511,7 +508,7 @@ /turf/open/floor/iron/white, /area/space) "bh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/yellow/half/contrasted{ @@ -540,7 +537,7 @@ /turf/open/floor/iron/white, /area/space) "bm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, @@ -559,8 +556,8 @@ /turf/open/floor/iron/white, /area/space) "bp" = ( -/obj/structure/cable, -/obj/machinery/chem_heater/withbuffer, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/chem_heater, /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -647,10 +644,7 @@ pixel_x = -4; pixel_y = 12 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 7; - pixel_y = 12 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, /turf/open/floor/iron/white, /area/space) @@ -677,7 +671,6 @@ /turf/open/floor/iron/dark, /area/space) "bE" = ( -/obj/machinery/computer/operating, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/space) @@ -704,7 +697,7 @@ /turf/open/floor/iron/dark, /area/space) "bH" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ diff --git a/_maps/map_files/MetaStation/holder_oldsm.dmm b/_maps/map_files/Theseus/holder_oldsm.dmm similarity index 96% rename from _maps/map_files/MetaStation/holder_oldsm.dmm rename to _maps/map_files/Theseus/holder_oldsm.dmm index e6fe870be77e..0c7b247b9855 100644 --- a/_maps/map_files/MetaStation/holder_oldsm.dmm +++ b/_maps/map_files/Theseus/holder_oldsm.dmm @@ -36,7 +36,7 @@ /area/space/nearstation) "ai" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; req_one_access_txt = "10;24" @@ -46,7 +46,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "aj" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -54,13 +54,13 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "ak" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/color_adapter, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "al" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -90,7 +90,7 @@ /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) "aq" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -129,7 +129,7 @@ /area/station/engineering/supermatter/room) "ax" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/visible, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; @@ -175,7 +175,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/binary/pump{ dir = 1; name = "Gas to Mix" @@ -220,7 +220,7 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "aK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/smes/engineering, /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -247,20 +247,20 @@ /area/station/engineering/supermatter/room) "aO" = ( /obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "aP" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "aQ" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/engine, @@ -277,7 +277,7 @@ /obj/effect/turf_decal/stripes/line, /obj/machinery/meter, /obj/machinery/light/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/status_display/evac/directional/south, /turf/open/floor/engine, @@ -286,7 +286,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -294,14 +294,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, /obj/machinery/meter, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "aV" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/engineering/glass{ name = "Laser Room"; req_one_access_txt = "10;24" @@ -309,7 +309,7 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "aW" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "aX" = ( @@ -319,7 +319,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "aZ" = ( @@ -332,7 +332,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -365,7 +365,7 @@ /turf/open/floor/plating, /area/station/engineering/supermatter) "bf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" @@ -376,7 +376,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -389,12 +389,12 @@ /area/station/engineering/supermatter/room) "bi" = ( /obj/machinery/power/emitter/welded, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "bj" = ( /obj/machinery/light/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "bk" = ( @@ -406,7 +406,7 @@ dir = 4 }, /obj/machinery/meter, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -425,11 +425,11 @@ /turf/open/floor/engine, /area/station/engineering/supermatter) "bo" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/station/engineering/supermatter) "bp" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/sm_apc/directional/east, /turf/open/floor/plating, /area/station/engineering/supermatter/room) @@ -439,14 +439,14 @@ /area/station/engineering/supermatter) "br" = ( /obj/structure/window/reinforced/plasma, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/power/energy_accumulator/tesla_coil/anchored, /turf/open/floor/engine, /area/station/engineering/supermatter) "bs" = ( /obj/structure/window/reinforced/plasma, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/power/energy_accumulator/grounding_rod/anchored, /turf/open/floor/engine, @@ -463,7 +463,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/machinery/button/door/directional/east{ id = "engsm"; @@ -504,7 +504,7 @@ c_tag = "Engineering Supermatter Starboard"; network = list("ss13","engine") }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -532,7 +532,7 @@ /area/space/nearstation) "bE" = ( /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/engineering/glass{ name = "Supermatter Engine Room"; req_one_access_txt = "10;24" @@ -543,14 +543,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/station/engineering/supermatter/room) "bG" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/binary/pump/on{ name = "Engine Coolant Bypass" }, @@ -588,7 +588,7 @@ /area/station/engineering/supermatter) "bL" = ( /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) @@ -611,7 +611,7 @@ c_tag = "Engineering Supermatter Port"; network = list("ss13","engine") }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/airalarm/engine{ dir = 4; @@ -650,7 +650,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -689,7 +689,7 @@ dir = 4 }, /obj/machinery/light/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -697,7 +697,7 @@ /obj/structure/window/reinforced/plasma{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/power/energy_accumulator/tesla_coil/anchored, /turf/open/floor/engine, @@ -706,7 +706,7 @@ /obj/structure/window/reinforced/plasma{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/power/energy_accumulator/grounding_rod/anchored, /turf/open/floor/engine, @@ -718,7 +718,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ dir = 1 }, @@ -754,7 +754,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -772,7 +772,7 @@ /area/station/engineering/supermatter) "co" = ( /obj/item/crowbar, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/poddoor/shutters/radiation/preopen{ id = "engsm"; name = "Radiation Chamber Shutters" @@ -784,7 +784,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -807,7 +807,7 @@ /turf/open/floor/plating, /area/station/engineering/supermatter/room) "ct" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, @@ -817,7 +817,7 @@ /obj/machinery/power/emitter/welded{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "cv" = ( @@ -825,7 +825,7 @@ dir = 1 }, /obj/machinery/light/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/supermatter/room) "cw" = ( @@ -839,7 +839,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -847,7 +847,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) @@ -855,7 +855,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/north, /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/machinery/status_display/evac/directional/north, @@ -884,7 +884,7 @@ dir = 4; name = "Cooling Loop Bypass" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, @@ -894,7 +894,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/visible, /turf/open/floor/engine, /area/station/engineering/supermatter/room) diff --git a/_maps/map_files/Theseus/medbay_holder.dmm b/_maps/map_files/Theseus/medbay_holder.dmm new file mode 100644 index 000000000000..5db3486766b8 --- /dev/null +++ b/_maps/map_files/Theseus/medbay_holder.dmm @@ -0,0 +1,31488 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/space/basic, +/area/space) +"ab" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ac" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ad" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Arrivals - Aft Arm - Far" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ae" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"af" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ag" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ah" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"ai" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"am" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port) +"ao" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ap" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aq" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"ar" = ( +/obj/structure/chair/office, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"as" = ( +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"at" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"au" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/pen, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"av" = ( +/obj/structure/mirror/directional/west, +/obj/item/lipstick/black, +/obj/item/lipstick/jade{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/lipstick/purple{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aw" = ( +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ax" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ay" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"az" = ( +/obj/structure/rack, +/obj/effect/spawner/random/clothing/costume, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aA" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port) +"aF" = ( +/turf/open/floor/wood, +/area/station/service/library) +"aG" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/wood, +/area/station/service/library) +"aH" = ( +/obj/item/folder, +/obj/item/folder, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/table/wood, +/obj/item/taperecorder, +/obj/item/tape, +/turf/open/floor/wood, +/area/station/service/library) +"aI" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/libraryscanner, +/turf/open/floor/wood, +/area/station/service/library) +"aJ" = ( +/obj/machinery/newscaster/directional/south, +/turf/open/floor/wood, +/area/station/service/library) +"aK" = ( +/obj/machinery/firealarm/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"aL" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/library) +"aM" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) +"aN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"aP" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"aQ" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/storage/eva) +"aR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/light/directional/west, +/obj/structure/table, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/obj/item/grenade/chem_grenade/metalfoam, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"aS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"aT" = ( +/obj/structure/tank_dispenser/oxygen{ + pixel_x = -1; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"aU" = ( +/obj/machinery/camera/motion/directional/east{ + c_tag = "E.V.A. Storage" + }, +/obj/machinery/requests_console/directional/east{ + department = "EVA"; + name = "EVA Requests Console" + }, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"aV" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/ai_monitored/command/storage/eva) +"aW" = ( +/obj/machinery/teleport/station, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/plating, +/area/station/command/teleporter) +"aX" = ( +/obj/machinery/bluespace_beacon, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"aY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/command/teleporter) +"aZ" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Teleporter Room" + }, +/obj/structure/rack, +/obj/structure/window/reinforced{ + dir = 1; + layer = 2.9 + }, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/suit/hazardvest, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"ba" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/teleporter) +"bc" = ( +/obj/structure/sign/plaques/kiddie/perfect_drone{ + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/storage/backpack/duffelbag/drone, +/obj/structure/window/reinforced, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"be" = ( +/obj/structure/table/wood, +/obj/structure/sign/picture_frame/showroom/one{ + pixel_x = -8; + pixel_y = 32 + }, +/obj/structure/sign/picture_frame/showroom/two{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"bf" = ( +/obj/structure/table/wood, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/north, +/obj/item/reagent_containers/food/drinks/mug{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"bh" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/item/clothing/shoes/laceup, +/obj/item/clothing/under/suit/black_really, +/obj/item/clothing/glasses/sunglasses, +/obj/machinery/camera/directional/north{ + c_tag = "Corporate Showroom" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"bi" = ( +/obj/structure/table/wood, +/obj/structure/sign/picture_frame/showroom/three{ + pixel_x = -8; + pixel_y = 32 + }, +/obj/structure/sign/picture_frame/showroom/four{ + pixel_x = 8; + pixel_y = 32 + }, +/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 = "\improper Nanotrasen-brand personal AI device exhibit" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"bj" = ( +/obj/machinery/door/airlock/external{ + name = "Auxiliary Airlock" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "whiteship-dock" + }, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bl" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/entry) +"bn" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bo" = ( +/turf/open/floor/plating, +/area/station/maintenance/port) +"bp" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/paper, +/obj/structure/sign/poster/official/random/directional/south, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"bq" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"br" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"bs" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/commons/vacant_room/office) +"bt" = ( +/obj/structure/table, +/obj/item/clothing/mask/cigarette/pipe, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bu" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bv" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bw" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bx" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Quiet Room" + }, +/turf/open/floor/wood, +/area/station/service/library) +"bz" = ( +/obj/machinery/door/morgue{ + name = "Private Study"; + req_access_txt = "37" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/engine/cult, +/area/station/service/library) +"bA" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"bC" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"bD" = ( +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/structure/table, +/obj/item/stack/sheet/plasteel{ + amount = 10 + }, +/obj/machinery/airalarm/directional/west, +/obj/item/stack/sheet/glass/fifty, +/obj/item/stack/sheet/glass/fifty, +/obj/item/crowbar, +/obj/item/wrench, +/obj/item/storage/toolbox/electrical{ + pixel_x = 1; + pixel_y = -1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"bE" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"bF" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"bG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"bH" = ( +/obj/machinery/door/window/left/directional/north{ + dir = 8; + name = "Jetpack Storage"; + pixel_x = -1; + req_access_txt = "18" + }, +/obj/structure/window/reinforced, +/obj/structure/rack, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/tank/jetpack/carbondioxide, +/obj/item/tank/jetpack/carbondioxide{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"bI" = ( +/obj/machinery/computer/teleporter{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/command/teleporter) +"bJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/station/command/teleporter) +"bK" = ( +/obj/structure/rack, +/obj/item/tank/internals/oxygen, +/obj/item/tank/internals/oxygen, +/obj/item/radio/off, +/obj/item/radio/off, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"bL" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/command/teleporter) +"bQ" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bR" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/hallway/secondary/entry) +"bS" = ( +/turf/open/space/basic, +/area/space/nearstation) +"bT" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"bU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bX" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Vacant Office Maintenance"; + req_access_txt = "32" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bY" = ( +/obj/structure/rack, +/obj/item/clothing/mask/animal/horsehead, +/obj/effect/spawner/random/clothing/costume, +/turf/open/floor/plating, +/area/station/maintenance/port) +"bZ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ca" = ( +/obj/structure/rack, +/obj/item/storage/box, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cb" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cc" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/station/service/library) +"cd" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/wood, +/area/station/service/library) +"ce" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"cg" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 8; + sortType = 17 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ch" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/vending/games, +/turf/open/floor/wood, +/area/station/service/library) +"ci" = ( +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/clothing/under/suit/red, +/obj/effect/decal/cleanable/cobweb, +/obj/item/book/codex_gigas, +/turf/open/floor/engine/cult, +/area/station/service/library) +"cj" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/engine/cult, +/area/station/service/library) +"ck" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/engine/cult, +/area/station/service/library) +"cl" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"cm" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"cn" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"co" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cp" = ( +/obj/machinery/power/shieldwallgen, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"cq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"cr" = ( +/obj/machinery/power/shieldwallgen, +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 2 + }, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"ct" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"cu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"cv" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"cw" = ( +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/crap, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"cy" = ( +/obj/structure/table/wood, +/obj/item/toy/plush/carpplushie{ + color = "red"; + name = "\improper Nanotrasen wildlife department space carp plushie" + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"cz" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"cB" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cC" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cD" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cF" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cG" = ( +/obj/machinery/space_heater, +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cH" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"cI" = ( +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/obj/machinery/light/directional/west, +/turf/open/floor/wood, +/area/station/service/library) +"cJ" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"cN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"cO" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/light/directional/east, +/obj/machinery/skill_station, +/turf/open/floor/wood, +/area/station/service/library) +"cP" = ( +/obj/structure/table/wood, +/obj/item/storage/photo_album/library, +/obj/structure/sign/painting/large/library_private{ + dir = 8; + pixel_x = -29 + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"cQ" = ( +/obj/structure/chair/comfy/brown, +/turf/open/floor/engine/cult, +/area/station/service/library) +"cR" = ( +/obj/structure/rack{ + icon = 'icons/obj/stationobjs.dmi'; + icon_state = "minibar"; + name = "skeletal minibar" + }, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/engine/cult, +/area/station/service/library) +"cS" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"cT" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"cU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cV" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"cX" = ( +/obj/machinery/suit_storage_unit/standard_unit, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/button/door/directional/south{ + id = "evashutter"; + name = "E.V.A. Storage Shutter Control"; + req_access_txt = "19" + }, +/turf/open/floor/iron/dark, +/area/station/ai_monitored/command/storage/eva) +"cY" = ( +/obj/machinery/power/shieldwallgen, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/command/teleporter) +"cZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"da" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"dc" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/briefcase{ + desc = "A large briefcase with a digital locking system, and the Nanotrasen logo emblazoned on the sides."; + name = "\improper Nanotrasen-brand secure briefcase exhibit"; + pixel_y = 2 + }, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"dd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"de" = ( +/obj/structure/showcase/machinery/microwave{ + dir = 1; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"df" = ( +/obj/item/toy/beach_ball/branded{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"dh" = ( +/obj/item/storage/box/matches{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = 4; + pixel_y = 1 + }, +/obj/item/clothing/mask/cigarette/cigar{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/clothing/mask/cigarette/cigar/cohiba, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"di" = ( +/obj/structure/showcase/machinery/tv{ + dir = 1; + pixel_x = 2; + pixel_y = 3 + }, +/obj/structure/table/wood, +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"dj" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 11; + height = 22; + id = "whiteship_home"; + name = "SS13: Auxiliary Dock, Station-Port"; + width = 35 + }, +/turf/open/space/basic, +/area/space) +"dk" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dp" = ( +/obj/item/storage/box, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dq" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/easel, +/obj/item/canvas/nineteen_nineteen, +/obj/item/canvas/twentythree_nineteen, +/obj/item/canvas/twentythree_twentythree, +/turf/open/floor/wood, +/area/station/service/library) +"dr" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"ds" = ( +/obj/structure/table/wood, +/obj/item/folder, +/obj/item/folder, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/service/library) +"dt" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/turf/open/floor/wood, +/area/station/service/library) +"du" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) +"dv" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/wood, +/area/station/service/library) +"dw" = ( +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/machinery/newscaster/directional/west, +/obj/item/pen/invisible, +/turf/open/floor/engine/cult, +/area/station/service/library) +"dx" = ( +/obj/item/taperecorder, +/obj/item/camera, +/obj/structure/table/wood, +/obj/item/radio/intercom/directional/south, +/obj/structure/sign/painting/library_private{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"dy" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" + }, +/turf/open/floor/engine/cult, +/area/station/service/library) +"dz" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"dA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"dB" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "evashutter"; + name = "E.V.A. Storage Shutter" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/ai_monitored/command/storage/eva) +"dC" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/ai_monitored/command/storage/eva) +"dD" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teleshutter"; + name = "Teleporter Access Shutter" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/command/teleporter) +"dE" = ( +/obj/machinery/door/poddoor/shutters{ + id = "teleshutter"; + name = "Teleporter Access Shutter" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/button/door/directional/east{ + id = "teleshutter"; + name = "Teleporter Shutter Control"; + pixel_y = 5; + req_access_txt = "19" + }, +/turf/open/floor/iron, +/area/station/command/teleporter) +"dG" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/corporate_showroom) +"dH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Corporate Showroom"; + req_access_txt = "19" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "showroom" + }, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"dI" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/command/corporate_showroom) +"dJ" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"dL" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dM" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"dN" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/bureaucracy/paper, +/turf/open/floor/plating, +/area/station/maintenance/port) +"dO" = ( +/obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/toy/crayon/spraycan, +/obj/item/toy/crayon/spraycan{ + pixel_x = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/library) +"dP" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"dQ" = ( +/obj/machinery/firealarm/directional/south, +/obj/machinery/camera/autoname/directional/south, +/obj/structure/table/wood, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/wood, +/area/station/service/library) +"dR" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/service/library) +"dT" = ( +/obj/structure/chair/office, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"dU" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) +"dW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"dX" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"dY" = ( +/obj/machinery/firealarm/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"dZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ea" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/button/door/directional/north{ + id = "evashutter"; + name = "E.V.A. Storage Shutter Control"; + req_access_txt = "19" + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"eb" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ec" = ( +/obj/item/radio/intercom/directional/north, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ed" = ( +/obj/machinery/light/directional/north, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ee" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ef" = ( +/obj/structure/noticeboard/directional/north, +/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/iron, +/area/station/hallway/primary/central) +"eg" = ( +/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/iron, +/area/station/hallway/primary/central) +"eh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ei" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ej" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ek" = ( +/obj/structure/closet/emcloset, +/obj/structure/sign/warning/vacuum/external{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"el" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port) +"en" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ep" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port) +"er" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/enzyme{ + layer = 5; + pixel_x = -7; + pixel_y = 13 + }, +/obj/item/reagent_containers/food/condiment/flour{ + pixel_x = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"es" = ( +/obj/machinery/oven, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"et" = ( +/obj/structure/table, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eu" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ev" = ( +/obj/structure/closet/crate/bin, +/obj/item/knife/kitchen, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/broken/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ew" = ( +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ex" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ez" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eA" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/central) +"eB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"eG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eI" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eR" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"eU" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 10 + }, +/obj/item/flashlight/lamp{ + on = 0; + pixel_x = -7; + pixel_y = 18 + }, +/obj/item/kitchen/rollingpin{ + pixel_x = -4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eV" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eW" = ( +/obj/effect/decal/cleanable/food/flour, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eX" = ( +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"eZ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "abandoned_kitchen" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/spawner/random/trash/mess, +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fn" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fp" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fq" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fs" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ft" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fu" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fv" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fw" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L6" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fy" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fz" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fA" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fB" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fC" = ( +/obj/structure/rack, +/obj/item/poster/random_contraband, +/obj/effect/spawner/random/maintenance, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fD" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fE" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fG" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fH" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fK" = ( +/obj/machinery/button/door/directional/east{ + id = "abandoned_kitchen"; + name = "Shutters Control" + }, +/obj/item/book/manual/wiki/cooking_to_serve_man{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -11; + pixel_y = 14 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/glass/rag{ + pixel_x = -10; + pixel_y = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"fL" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fN" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fO" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fP" = ( +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fQ" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"fR" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port) +"fS" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/office) +"fT" = ( +/obj/item/kirbyplants, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fU" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fV" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fW" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/security/checkpoint/medical) +"fX" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/kirbyplants{ + icon_state = "applebush" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fY" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"fZ" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"gb" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"gc" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"gd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"ge" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"gf" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"gh" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gi" = ( +/obj/structure/kitchenspike_frame, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gj" = ( +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 4 + }, +/obj/item/clothing/suit/apron/chef, +/obj/item/clothing/head/chefhat, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gk" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gl" = ( +/obj/effect/decal/cleanable/blood/old, +/obj/machinery/processor{ + pixel_y = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gn" = ( +/turf/open/floor/iron/recharge_floor, +/area/station/maintenance/port/aft) +"gp" = ( +/obj/machinery/space_heater, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port) +"gq" = ( +/obj/effect/spawner/random/engineering/vending_restock, +/turf/open/floor/plating, +/area/station/maintenance/port) +"gs" = ( +/obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port) +"gt" = ( +/obj/structure/table, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Paramedic Dispatch"; + name = "medical camera"; + network = list("ss13","medical") + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"gu" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding/white/corner, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"gv" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/office) +"gw" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Staff Entrance"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/office) +"gx" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/closet/secure_closet/security/med, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"gy" = ( +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table/reinforced, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + departmentType = 3; + name = "Security Requests Console" + }, +/obj/machinery/light/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Security Post - Medbay"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"gz" = ( +/obj/item/pen, +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/item/folder/red, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/machinery/newscaster/directional/north, +/obj/item/screwdriver{ + pixel_y = 10 + }, +/obj/item/radio/off, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"gA" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) +"gB" = ( +/obj/structure/sign/departments/medbay/alt, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/medbay/lobby) +"gC" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/lobby) +"gE" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white/side, +/area/station/medical/medbay/lobby) +"gF" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/medbay/lobby) +"gG" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/obj/structure/sign/directions/engineering{ + dir = 4 + }, +/obj/structure/sign/directions/command{ + dir = 1; + pixel_y = -8 + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/medbay/lobby) +"gH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"gJ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"gK" = ( +/obj/structure/sign/directions/medical{ + dir = 8; + pixel_y = 8 + }, +/obj/structure/sign/directions/evac, +/obj/structure/sign/directions/science{ + dir = 4; + pixel_y = -8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/station/science/lobby) +"gL" = ( +/obj/machinery/vending/boozeomat/all_access, +/obj/effect/decal/cleanable/cobweb, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"gM" = ( +/obj/structure/closet/secure_closet/bar{ + pixel_x = -3; + pixel_y = -1; + req_access_txt = "25" + }, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gN" = ( +/obj/structure/rack, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_loot_count = 3; + spawn_loot_double = 0; + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gO" = ( +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = 6; + pixel_y = -1 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/reagent_containers/food/drinks/drinkingglass{ + pixel_x = -5; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/structure/light_construct/small/directional/north, +/obj/machinery/newscaster/directional/north, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gP" = ( +/obj/effect/spawner/random/trash/mess, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gQ" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gR" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gS" = ( +/obj/machinery/computer/slot_machine{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"gT" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gV" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"gX" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"gY" = ( +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"ha" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"hc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"hd" = ( +/obj/structure/sign/warning/coldtemp{ + name = "\improper CRYOGENICS"; + pixel_y = 32 + }, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"he" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/cryo_cell, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"hf" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/firealarm/directional/north, +/obj/structure/tank_holder/extinguisher, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Cryogenics"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"hg" = ( +/obj/machinery/computer/med_data{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"hh" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"hj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"hk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/office) +"hm" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/holopad, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"hn" = ( +/obj/effect/landmark/start/depsec/medical, +/obj/machinery/button/door/directional/east{ + id = "medsecprivacy"; + name = "Privacy Shutters Control" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"ho" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"hp" = ( +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"hq" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white, +/obj/effect/turf_decal/trimline/brown/warning, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/medical/medbay/lobby) +"hw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"hy" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"hz" = ( +/obj/structure/sign/departments/science, +/turf/closed/wall/prepainted/daedalus, +/area/station/science/lobby) +"hA" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hB" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/dropper, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hC" = ( +/turf/open/floor/carpet/green, +/area/station/maintenance/port/aft) +"hD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/green, +/area/station/maintenance/port/aft) +"hE" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hF" = ( +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hG" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hH" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hI" = ( +/obj/structure/chair/stool/directional/north, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"hJ" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hK" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"hL" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hM" = ( +/obj/effect/spawner/random/food_or_drink/donkpockets, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hN" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/closet/secure_closet/freezer/kitchen/maintenance, +/obj/machinery/light/small/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hP" = ( +/obj/structure/girder, +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hT" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cardboard, +/obj/item/radio/off, +/obj/structure/light_construct/directional/north, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hU" = ( +/obj/structure/closet, +/obj/item/stack/sheet/iron{ + amount = 34 + }, +/obj/item/extinguisher/mini, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"hV" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"hX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"hY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"ia" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"ib" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/siding/white, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"ic" = ( +/obj/effect/turf_decal/siding/white{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"id" = ( +/obj/structure/chair/office, +/turf/open/floor/wood, +/area/station/service/library) +"iq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white/corner{ + dir = 4 + }, +/area/station/medical/medbay/lobby) +"ir" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"is" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"it" = ( +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"iu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/medical/medbay/lobby) +"iv" = ( +/obj/effect/turf_decal/tile/purple, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"iw" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/lobby) +"ix" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"iy" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"iz" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"iA" = ( +/obj/item/kirbyplants/random, +/obj/structure/light_construct/small/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"iC" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"iH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iJ" = ( +/obj/structure/closet, +/obj/item/stack/sheet/glass{ + amount = 12 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"iN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"iO" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"iP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"iQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"iR" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Cryogenics Bay"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/iron/white, +/area/station/medical/office) +"iS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"iT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"iU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"iW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/office) +"iX" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/wheelchair{ + pixel_y = -3 + }, +/obj/item/wheelchair, +/obj/item/wheelchair{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"iY" = ( +/obj/machinery/computer/security/telescreen{ + desc = "Used for monitoring medbay to ensure patient safety."; + dir = 4; + name = "Medbay Monitor"; + network = list("medbay"); + pixel_x = -32 + }, +/obj/machinery/light_switch/directional/west{ + pixel_x = -20 + }, +/obj/machinery/computer/med_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"iZ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"ja" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/medical, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"jc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jd" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"je" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/mob/living/simple_animal/bot/medbot/autopatrol, +/turf/open/floor/iron/white/corner{ + dir = 8 + }, +/area/station/medical/medbay/lobby) +"jf" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/corner, +/area/station/medical/medbay/lobby) +"jg" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jh" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jj" = ( +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"jk" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/science/lobby) +"jl" = ( +/obj/structure/bed/dogbed, +/obj/effect/decal/cleanable/blood/old, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jm" = ( +/obj/item/reagent_containers/glass/rag, +/obj/structure/table/wood, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jn" = ( +/obj/structure/chair/stool/directional/west, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jo" = ( +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"js" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jt" = ( +/obj/structure/rack, +/obj/item/screwdriver{ + pixel_y = 16 + }, +/obj/item/hand_labeler, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ju" = ( +/obj/structure/rack, +/obj/item/stack/cable_coil{ + pixel_x = -1; + pixel_y = -3 + }, +/obj/item/wrench, +/obj/item/flashlight/seclite, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jv" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jw" = ( +/obj/structure/rack, +/obj/item/stack/rods{ + amount = 23 + }, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jx" = ( +/obj/structure/table, +/obj/machinery/cell_charger, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"jC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"jD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"jE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"jF" = ( +/turf/open/floor/iron/white, +/area/station/medical/office) +"jG" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"jH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"jI" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + dir = 8; + name = "First Aid Supplies"; + req_access_txt = "5" + }, +/obj/item/clothing/glasses/blindfold{ + pixel_y = 3 + }, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 3 + }, +/obj/item/clothing/ears/earmuffs, +/obj/item/clothing/glasses/eyepatch, +/obj/item/clothing/suit/straight_jacket, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"jJ" = ( +/obj/item/radio/intercom/directional/west, +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/machinery/button/door/directional/west{ + id = "MedbayFoyer"; + name = "Medbay Doors Control"; + normaldoorcontrol = 1; + pixel_y = -9 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"jK" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/effect/landmark/start/depsec/medical, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"jL" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"jN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jO" = ( +/obj/structure/bed/roller, +/obj/item/radio/intercom/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Medbay Foyer"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jP" = ( +/obj/machinery/light/directional/south, +/obj/structure/bed/roller, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jQ" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jR" = ( +/obj/item/kirbyplants{ + icon_state = "plant-11" + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jT" = ( +/obj/machinery/disposal/bin, +/obj/machinery/firealarm/directional/south{ + pixel_x = 26 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"jV" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/science/lobby) +"jW" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"jX" = ( +/obj/structure/sink/kitchen{ + desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; + dir = 4; + name = "old sink"; + pixel_x = -12 + }, +/obj/structure/mirror/directional/west, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jY" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"jZ" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ka" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kd" = ( +/obj/structure/closet, +/obj/item/extinguisher, +/obj/effect/spawner/random/maintenance/three, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kf" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"kh" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"ki" = ( +/obj/structure/table/glass, +/obj/item/book/manual/wiki/medicine, +/obj/item/clothing/neck/stethoscope, +/obj/item/wrench/medical, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"kk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"kl" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/anesthetic_mix, +/turf/open/floor/iron/dark, +/area/station/medical/cryo) +"km" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/office) +"kn" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/office) +"ko" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/office) +"kq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron/white, +/area/station/medical/office) +"kr" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/roller, +/obj/item/roller{ + pixel_y = 3 + }, +/obj/item/roller{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/office) +"ks" = ( +/obj/machinery/door/poddoor/preopen{ + id = "medsecprivacy"; + name = "privacy shutter" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/left/directional/north{ + req_access_txt = "63" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) +"kt" = ( +/obj/machinery/door/poddoor/preopen{ + id = "medsecprivacy"; + name = "privacy shutter" + }, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/brigdoor/right/directional/north{ + req_access_txt = "63" + }, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) +"kv" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"kw" = ( +/obj/structure/sign/directions/medical{ + pixel_y = -7 + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/pharmacy) +"kx" = ( +/obj/structure/sign/departments/chemistry/pharmacy, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/pharmacy) +"ky" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "pharmacy_shutters"; + name = "Pharmacy shutters" + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/pharmacy) +"kz" = ( +/obj/machinery/smartfridge/chemistry/preloaded, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"kA" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/door/window/left/directional/north{ + dir = 2; + name = "Pharmacy Desk"; + req_access_txt = "5; 69" + }, +/obj/machinery/door/firedoor, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "pharmacy_shutters"; + name = "pharmacy shutters" + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"kB" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/pharmacy) +"kC" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"kD" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"kE" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/science/robotics/mechbay) +"kF" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/directional/west, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kG" = ( +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_random_offset = 1 + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kH" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"kL" = ( +/obj/machinery/door/airlock/wood{ + doorClose = 'sound/effects/doorcreaky.ogg'; + doorOpen = 'sound/effects/doorcreaky.ogg'; + name = "The Gobetting Barmaid" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"kX" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/treatment_center) +"kY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/treatment_center) +"lb" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/medbay/central) +"lc" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Clinic"; + network = list("ss13","medbay") + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ld" = ( +/obj/structure/disposalpipe/junction/yjunction, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/side, +/area/station/medical/medbay/central) +"le" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white/side, +/area/station/medical/medbay/central) +"lf" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/syringe/epinephrine{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 28 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lh" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/effect/turf_decal/tile/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"li" = ( +/obj/machinery/light_switch/directional/west, +/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/table/glass, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/dropper, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 10 + }, +/obj/item/stack/sheet/mineral/plasma{ + pixel_y = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lj" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lk" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/chem_heater, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"ll" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/effect/landmark/start/chemist, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lm" = ( +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/machinery/button/door/directional/north{ + id = "pharmacy_shutters"; + name = "pharmacy shutters control"; + pixel_x = 24; + req_access_txt = "5;69" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"ln" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"lo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/light_construct/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lp" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/window/left/directional/north{ + name = "MuleBot Access"; + req_access_txt = "50" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lt" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Primary Treatment Centre West"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lu" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/stasis{ + dir = 4 + }, +/obj/machinery/defibrillator_mount/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lv" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/iv_drip, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lw" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"ly" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/maintenance/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"lz" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lA" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/stasis, +/obj/machinery/defibrillator_mount/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lB" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"lC" = ( +/obj/machinery/light/directional/west, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lF" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 11 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"lM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/research/glass{ + name = "Pharmacy"; + req_access_txt = "5; 69" + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lO" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lQ" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lR" = ( +/obj/machinery/chem_master, +/obj/machinery/light/directional/east, +/obj/structure/noticeboard/directional/east, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"lS" = ( +/obj/structure/chair/stool/directional/south, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"lT" = ( +/mob/living/simple_animal/hostile/retaliate/goose/vomit, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"lU" = ( +/obj/machinery/vending/assist, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lV" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"lW" = ( +/obj/structure/light_construct/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lX" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"lY" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"lZ" = ( +/obj/structure/table, +/obj/effect/spawner/random/decoration/ornament, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"ma" = ( +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"mb" = ( +/obj/structure/table/glass, +/obj/item/retractor, +/obj/item/hemostat, +/obj/item/cautery, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"mc" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/body_scan_display/directional/north, +/obj/structure/table/optable, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"md" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/north, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"me" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"mf" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/shower{ + dir = 8 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"mg" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light_switch/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mj" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mk" = ( +/obj/effect/landmark/start/paramedic, +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"ml" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mm" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mn" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mo" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"mq" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"mv" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mw" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"mx" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"my" = ( +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"mz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"mA" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"mB" = ( +/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 = 3; + pixel_y = -7 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/igniter{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/assembly/timer{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/item/storage/pill_bottle/epinephrine{ + pixel_x = 8; + pixel_y = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"mE" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"mF" = ( +/obj/structure/table/wood/poker, +/obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"mG" = ( +/obj/machinery/vending/cigarette, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mH" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"mI" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mJ" = ( +/obj/structure/table, +/obj/item/phone{ + pixel_x = 6; + pixel_y = -2 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"mL" = ( +/obj/structure/table/glass, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/blood_filter, +/obj/item/bonesetter, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"mM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"mP" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"mQ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "main_surgery" + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/treatment_center) +"mR" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mS" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mT" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mV" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mW" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mX" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"mY" = ( +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = 2 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"na" = ( +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nb" = ( +/obj/item/kirbyplants, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/medbay/central) +"nd" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ne" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nf" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ng" = ( +/obj/structure/table, +/obj/machinery/light/directional/south, +/obj/item/storage/medkit/regular{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/medkit/regular, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nh" = ( +/obj/item/kirbyplants, +/obj/machinery/vending/wallmed/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ni" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nj" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + name = "Pharmacy Desk"; + req_access_txt = "5; 69" + }, +/obj/machinery/door/window/right/directional/east{ + dir = 8; + name = "Pharmacy Desk"; + req_access_txt = "5" + }, +/obj/item/reagent_containers/glass/bottle/morphine, +/obj/item/reagent_containers/glass/bottle/toxin{ + pixel_x = 5; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 8 + }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/syringe/epinephrine, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nk" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nl" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#EFB341" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nm" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nn" = ( +/obj/structure/table/glass, +/obj/item/folder/white{ + pixel_y = 2 + }, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/radio/headset/headset_med, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/obj/item/hand_labeler, +/obj/item/stack/package_wrap, +/obj/item/stack/package_wrap, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"no" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"np" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Aft Primary Hallway - Fore" + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"nr" = ( +/obj/structure/light_construct/directional/east, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"ns" = ( +/obj/structure/fluff/broken_flooring{ + icon_state = "singular" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"nu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nv" = ( +/obj/structure/rack, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/iron/twenty, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"nz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"nA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"nB" = ( +/obj/machinery/door/airlock/medical{ + name = "Primary Surgical Theatre"; + req_access_txt = "45" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nC" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nF" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/white/corner, +/obj/structure/table/glass, +/turf/open/floor/iron/white/side{ + dir = 9 + }, +/area/station/medical/treatment_center) +"nG" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/white, +/obj/structure/disposalpipe/segment, +/obj/machinery/bodyscanner{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 1 + }, +/area/station/medical/treatment_center) +"nH" = ( +/obj/effect/turf_decal/siding/white/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/bodyscanner_console{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 5 + }, +/area/station/medical/treatment_center) +"nI" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nK" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nL" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Primary Treatment Centre"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"nM" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"nO" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/command/heads_quarters/cmo) +"nQ" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_one_access_txt = "5;12;33;69" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"nR" = ( +/obj/machinery/reagentgrinder, +/obj/machinery/requests_console/directional/west{ + department = "Pharmacy"; + departmentType = 2; + name = "Pharmacy Requests Console"; + receive_ore_updates = 1 + }, +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nS" = ( +/obj/structure/closet/secure_closet/chemical, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"nT" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nU" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/sign/departments/chemistry/pharmacy{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nV" = ( +/obj/machinery/light/directional/east, +/obj/structure/sign/departments/science{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"nW" = ( +/obj/item/kirbyplants/random, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"nX" = ( +/obj/item/bot_assembly/floorbot{ + created_name = "FloorDiffBot"; + desc = "Why won't it work?"; + name = "FloorDiffBot" + }, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"nY" = ( +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/structure/table/wood, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/food_or_drink/booze{ + spawn_loot_count = 2; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/entertainment/musical_instrument, +/obj/structure/sign/poster/contraband/random/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"nZ" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"ob" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"oc" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/fluff/broken_flooring, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"od" = ( +/obj/structure/fluff/broken_flooring{ + dir = 4; + icon_state = "pile" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oe" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cardboard, +/obj/item/stack/sheet/cardboard, +/obj/structure/light_construct/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"of" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"og" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oh" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oi" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/sink{ + dir = 8; + pixel_x = 11; + pixel_y = -2 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"ok" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/smartfridge/organ, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "main_surgery" + }, +/turf/open/floor/iron/dark, +/area/station/medical/treatment_center) +"ol" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = -2 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"om" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/syringe, +/turf/open/floor/iron/white/side{ + dir = 8 + }, +/area/station/medical/treatment_center) +"on" = ( +/obj/structure/flora/junglebush/large, +/obj/machinery/light/floor/has_bulb, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/grass, +/area/station/medical/treatment_center) +"oo" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/white/side{ + dir = 4 + }, +/area/station/medical/treatment_center) +"op" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Primary Treatment Centre East"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"or" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Main Hallway- CMO"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"os" = ( +/obj/machinery/light_switch/directional/north, +/obj/machinery/vending/wallmed/directional/west, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/obj/machinery/fax_machine, +/obj/structure/table, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"ot" = ( +/obj/structure/table/glass, +/obj/item/folder/blue, +/obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/hud/health, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/item/computer_hardware/hard_drive/role/chemistry, +/obj/item/computer_hardware/hard_drive/role/medical, +/obj/item/computer_hardware/hard_drive/role/medical, +/obj/item/computer_hardware/hard_drive/role/medical, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"ov" = ( +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/obj/structure/bed/dogbed/runtime, +/obj/item/toy/cattoy, +/mob/living/simple_animal/pet/cat/runtime, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"ow" = ( +/obj/structure/closet/secure_closet/chief_medical, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/item/screwdriver, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"oy" = ( +/obj/structure/table/glass, +/obj/machinery/camera/directional/west{ + c_tag = "Pharmacy"; + network = list("ss13","medbay") + }, +/obj/machinery/light/directional/west, +/obj/item/book/manual/wiki/chemistry{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/book/manual/wiki/grenades, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oz" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oA" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 8; + pixel_y = 2 + }, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -4; + pixel_y = 12 + }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oB" = ( +/obj/machinery/chem_dispenser{ + layer = 2.7 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"oC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "pharmacy_shutters_2"; + name = "Pharmacy shutters" + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/pharmacy) +"oD" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"oE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"oG" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/hallway/primary/aft) +"oH" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/decal/cleanable/blood/old, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"oI" = ( +/obj/structure/table/wood/poker, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/wood, +/area/station/maintenance/port/aft) +"oJ" = ( +/obj/item/dice/d20, +/obj/item/dice, +/obj/structure/table/wood, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/storage/dice, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/light_construct/small/directional/south, +/obj/structure/sign/poster/contraband/random/directional/south, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oK" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"oL" = ( +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"oM" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"oN" = ( +/obj/structure/rack, +/obj/item/stack/sheet/cloth/five, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"oO" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Primary Surgery"; + name = "medical camera"; + network = list("ss13","medical") + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/button/door/directional/west{ + name = "privacy shutters control"; + id = "main_surgery" + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oP" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oQ" = ( +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oR" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"oT" = ( +/obj/machinery/door/airlock/medical{ + name = "Primary Surgical Theatre"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"oX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/white/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/bodyscanner_console, +/turf/open/floor/iron/white/side{ + dir = 10 + }, +/area/station/medical/treatment_center) +"oY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/bodyscanner, +/turf/open/floor/iron/white/side, +/area/station/medical/treatment_center) +"pc" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/east, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pl" = ( +/obj/effect/landmark/start/chief_medical_officer, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"pm" = ( +/obj/machinery/suit_storage_unit/cmo, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"po" = ( +/obj/structure/window/reinforced{ + dir = 1; + pixel_y = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/table/glass, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/grenade/chem_grenade, +/obj/item/stack/cable_coil, +/obj/item/stack/cable_coil, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pr" = ( +/obj/structure/chair/office/light{ + dir = 4 + }, +/obj/effect/landmark/start/chemist, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"ps" = ( +/obj/structure/table/reinforced, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/east{ + dir = 8; + name = "Pharmacy Desk"; + req_access_txt = "5; 69" + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "pharmacy_shutters_2"; + name = "Pharmacy shutters" + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pt" = ( +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"pu" = ( +/obj/effect/turf_decal/tile/purple/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"pv" = ( +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"pw" = ( +/obj/structure/closet/crate/necropolis{ + desc = "Presumably placed here by top men."; + name = "\improper Ark of the Covenant" + }, +/obj/item/toy/clockwork_watch{ + desc = "An ancient piece of machinery, made from an unknown metal by an unknown maker."; + name = "\improper Ancient Relic" + }, +/mob/living/simple_animal/pet/dog/corgi{ + desc = "Make sure you give him plenty of bellyrubs, or he'll melt your skin off."; + name = "\improper Keeper of the Ark" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"px" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"py" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"pz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"pA" = ( +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"pB" = ( +/obj/structure/table/glass, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/circular_saw, +/obj/item/blood_filter, +/obj/item/bonesetter, +/obj/machinery/button/door/directional/south{ + id = "main_surgery"; + name = "privacy shutters control" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"pC" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"pD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"pE" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"pF" = ( +/obj/machinery/door/window/right/directional/south{ + dir = 8; + name = "Surgical Supplies"; + req_access_txt = "45" + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table/reinforced, +/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/item/stack/sticky_tape/surgical, +/obj/item/stack/medical/bone_gel, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"pG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pH" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pI" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pJ" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"pK" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pM" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"pN" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"pO" = ( +/obj/structure/chair/office/light, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"pQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"pR" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"pS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "CMO Maintenance"; + req_access_txt = "40" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"pW" = ( +/obj/machinery/chem_heater, +/obj/effect/turf_decal/tile/yellow, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/obj/machinery/button/door/directional/south{ + id = "pharmacy_shutters_2"; + name = "pharmacy shutters control"; + req_access_txt = "5;69" + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pX" = ( +/obj/machinery/chem_master, +/obj/structure/noticeboard/directional/south, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"pY" = ( +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"pZ" = ( +/obj/structure/fluff/broken_flooring{ + dir = 4; + icon_state = "singular" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qa" = ( +/obj/effect/turf_decal/bot, +/obj/structure/mecha_wreckage/ripley, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"qc" = ( +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/optable, +/obj/machinery/body_scan_display/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"qd" = ( +/obj/machinery/light/directional/south, +/obj/machinery/button/door/directional/south{ + id = "main_surgery"; + name = "privacy shutters control" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/table/glass, +/obj/item/clothing/gloves/color/latex, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"qe" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"qf" = ( +/obj/structure/table/reinforced, +/obj/item/tank/internals/anesthetic{ + pixel_x = 3 + }, +/obj/item/tank/internals/anesthetic, +/obj/item/tank/internals/anesthetic{ + pixel_x = -3 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = -3 + }, +/obj/item/clothing/mask/breath/medical, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"qg" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/firealarm/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qh" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qi" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qj" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qk" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qm" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"qn" = ( +/obj/structure/table/glass, +/obj/machinery/computer/med_data/laptop, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qo" = ( +/obj/structure/table/glass, +/obj/item/folder/blue{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/folder/white, +/obj/item/pen, +/obj/item/stamp/cmo, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qq" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qr" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/pdapainter/medbay, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"qt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"qu" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"qv" = ( +/obj/machinery/computer/arcade/orion_trail{ + desc = "For gamers only. Casuals need not apply."; + icon_screen = "library"; + icon_state = "oldcomp"; + name = "Gamer Computer" + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_x = -32 + }, +/obj/item/toy/katana{ + desc = "As seen in your favourite Japanese cartoon."; + name = "anime katana" + }, +/obj/structure/table/wood, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qw" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/obj/item/reagent_containers/food/drinks/soda_cans/monkey_energy, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qy" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/defibrillator_mount/directional/south, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qz" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/iv_drip, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qA" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/end{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qB" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qC" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/defibrillator_mount/directional/south, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + name = "medical bed" + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"qD" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"qF" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"qG" = ( +/obj/machinery/modular_computer/console/preset/id{ + dir = 4 + }, +/obj/machinery/requests_console/directional/west{ + announcementConsole = 1; + department = "Chief Medical Officer's Desk"; + departmentType = 5; + name = "Chief Medical Officer's Requests Console" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qH" = ( +/obj/structure/chair/office/light{ + dir = 1 + }, +/obj/effect/landmark/start/chief_medical_officer, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"qK" = ( +/obj/machinery/disposal/bin, +/obj/machinery/status_display/ai/directional/east, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/command/heads_quarters/cmo) +"qT" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/science/robotics/lab) +"qU" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/space_hut) +"qV" = ( +/turf/open/floor/plating/airless, +/area/space/nearstation) +"qW" = ( +/obj/structure/chair/comfy{ + dir = 1 + }, +/obj/item/clothing/suit/nerdshirt, +/obj/item/clothing/head/fedora, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qX" = ( +/obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"qY" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/light_construct/directional/west, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"qZ" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"ra" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/directional/east{ + id = "maintwarehouse"; + name = "Privacy Shutters Control" + }, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"rb" = ( +/obj/machinery/light/small/maintenance/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rc" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/storage) +"rd" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/storage) +"re" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"rf" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rh" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rl" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/department/medical/central) +"rn" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage/mech) +"ro" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/daedalus, +/area/station/engineering/storage/mech) +"rp" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rr" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rs" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"rt" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/railing, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"ru" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/plating/airless, +/area/station/maintenance/space_hut) +"rv" = ( +/obj/machinery/mass_driver/shack{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/station/maintenance/space_hut) +"rw" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"rx" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Gamer Lair"; + req_one_access_txt = "12;27" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ry" = ( +/obj/structure/closet, +/obj/item/extinguisher, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/maintenance/two, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rz" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"rA" = ( +/obj/machinery/door/poddoor/shutters{ + id = "maintwarehouse" + }, +/turf/open/floor/iron/dark, +/area/station/maintenance/port/aft) +"rE" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger, +/obj/machinery/firealarm/directional/north, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rF" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/clothing/gloves/color/latex/nitrile, +/obj/item/wrench/medical, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rG" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/closet/l3closet, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"rI" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Storage"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/mob/living/simple_animal/bot/cleanbot/medbay, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"rJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"rK" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rL" = ( +/obj/machinery/door/window/right/directional/south{ + name = "First Aid Supplies"; + req_access_txt = "5" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/brute{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/brute{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rM" = ( +/obj/structure/window/reinforced, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/fire{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/fire{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"rN" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"rO" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"rP" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"rQ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/toolbox, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"rR" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/effect/spawner/random/engineering/tank, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"rT" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 4 + }, +/obj/machinery/light_switch/directional/north, +/obj/effect/spawner/random/structure/tank_holder, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"rU" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rV" = ( +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"rW" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"rX" = ( +/obj/machinery/door/window{ + dir = 1; + name = "Mass Driver"; + req_access_txt = "12" + }, +/obj/machinery/door/window{ + name = "Mass Driver"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/loading_area{ + dir = 1 + }, +/obj/machinery/computer/pod/old/mass_driver_controller/shack{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"rY" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"rZ" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"sa" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sc" = ( +/obj/machinery/door/airlock/external{ + name = "Space Shack" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"se" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sf" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sg" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"si" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sl" = ( +/obj/machinery/rnd/production/fabricator/department/medical, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sm" = ( +/obj/effect/landmark/start/paramedic, +/obj/effect/turf_decal/loading_area/white{ + color = "#52B4E9"; + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sn" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"so" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sp" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/holopad, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sr" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"ss" = ( +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"st" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 6 + }, +/obj/item/defibrillator/loaded{ + pixel_y = 3 + }, +/obj/item/defibrillator/loaded, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"su" = ( +/obj/machinery/newscaster/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"sy" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"sz" = ( +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"sA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"sE" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"sF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"sG" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"sH" = ( +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"sI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"sK" = ( +/obj/structure/rack, +/obj/item/wrench/medical, +/obj/effect/turf_decal/siding/white, +/obj/item/food/popsicle/creamsicle_orange, +/obj/machinery/airalarm/kitchen_cold_room{ + dir = 1; + pixel_y = 24 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"sL" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding/white, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"sM" = ( +/obj/structure/closet/crate/freezer/blood, +/obj/effect/turf_decal/siding/white, +/obj/machinery/camera/directional/north{ + c_tag = "Medbay Cold Storage"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"sQ" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sR" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/gloves{ + pixel_y = 8 + }, +/obj/item/storage/box/masks{ + pixel_y = 4 + }, +/obj/item/storage/box/bodybags, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 4 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 2 + }, +/obj/item/clothing/glasses/hud/health, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sU" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/rxglasses{ + pixel_x = -4; + pixel_y = 8 + }, +/obj/item/stack/medical/mesh, +/obj/item/stack/gauze{ + pixel_x = 8 + }, +/obj/item/reagent_containers/chem_pack{ + pixel_x = 10; + pixel_y = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"sV" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sW" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sX" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south{ + dir = 8; + name = "First Aid Supplies"; + req_access_txt = "5" + }, +/obj/item/mod/module/plasma_stabilizer, +/obj/item/mod/module/thermal_regulator, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"sZ" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/department/medical/central) +"tb" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"tc" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"td" = ( +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"te" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"tf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"tg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"th" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ti" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/maintenance/space_hut) +"tj" = ( +/obj/structure/table, +/obj/item/plate, +/obj/item/candle, +/obj/effect/decal/cleanable/dirt/dust, +/obj/item/radio/off{ + desc = "An old handheld radio. You could use it, if you really wanted to."; + icon_state = "radio"; + name = "old radio"; + pixel_y = 15 + }, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"tk" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/space_hut) +"tq" = ( +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tr" = ( +/turf/open/floor/iron/white, +/area/station/medical/storage) +"ts" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"tt" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tu" = ( +/obj/structure/table/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/storage/box/syringes{ + pixel_y = 4 + }, +/obj/item/storage/box/syringes, +/obj/item/gun/syringe, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tx" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"tA" = ( +/obj/effect/turf_decal/tile/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"tB" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"tC" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Mechanic Storage" + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"tD" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=10.1-Central-from-Aft"; + location = "10-Aft-To-Central" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"tE" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9.1-Escape-1"; + location = "8.1-Aft-to-Escape" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"tF" = ( +/obj/structure/statue/snow/snowman, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"tG" = ( +/obj/item/clothing/suit/snowman, +/obj/item/clothing/head/snowman, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"tH" = ( +/obj/item/food/snowcones/clown, +/turf/open/floor/fake_snow, +/area/station/maintenance/port/aft) +"tJ" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"tK" = ( +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"tL" = ( +/obj/effect/turf_decal/siding/white{ + dir = 1 + }, +/turf/open/floor/iron/kitchen_coldroom, +/area/station/medical/coldroom) +"tM" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tN" = ( +/obj/structure/plasticflaps/opaque, +/obj/machinery/door/window/left/directional/north{ + dir = 8; + name = "MuleBot Access"; + req_access_txt = "50" + }, +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=4"; + dir = 4; + freq = 1400; + location = "Medbay" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"tO" = ( +/obj/machinery/door/window/right/directional/south{ + dir = 1; + name = "Medical Deliveries"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tP" = ( +/obj/machinery/vending/medical, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tQ" = ( +/obj/effect/turf_decal/siding/white{ + dir = 4 + }, +/obj/machinery/vending/wardrobe/medi_wardrobe, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tR" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"tS" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/suit_storage_unit/medical, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"tT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"tU" = ( +/obj/effect/turf_decal/siding/white{ + dir = 8 + }, +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tV" = ( +/obj/machinery/door/window/right/directional/south{ + dir = 1; + name = "First Aid Supplies"; + req_access_txt = "5" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/toxin{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/toxin, +/obj/item/storage/medkit/toxin{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tW" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/item/storage/medkit/regular{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/storage/medkit/o2{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/o2{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/table/reinforced, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"tX" = ( +/obj/machinery/vending/mechcomp, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"tY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"tZ" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"ua" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"uc" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"ud" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"ue" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uf" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/medical/virology) +"ug" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/port/aft) +"ui" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/medical/coldroom) +"uj" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/coldroom) +"uk" = ( +/obj/machinery/door/airlock/medical{ + name = "Medical Cold Room"; + req_access_txt = "5" + }, +/turf/open/floor/iron, +/area/station/medical/coldroom) +"ul" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"um" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Storage"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/storage) +"un" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"up" = ( +/obj/machinery/atmospherics/components/tank/air{ + pipe_color = "#0000FF"; + piping_layer = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ur" = ( +/obj/machinery/vending/mechcomp, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"ut" = ( +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"uu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uv" = ( +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"uw" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/department/science/central) +"ux" = ( +/obj/effect/spawner/random/decoration/statue, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"uy" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/o_plus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/b_plus, +/obj/item/reagent_containers/blood/b_minus, +/obj/item/reagent_containers/blood/a_plus, +/obj/item/reagent_containers/blood/a_minus, +/obj/item/reagent_containers/blood/lizard, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uz" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uA" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uB" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uD" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uF" = ( +/obj/structure/sign/poster/official/cleanliness{ + pixel_x = -32 + }, +/obj/structure/sink{ + pixel_y = 22 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uG" = ( +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uH" = ( +/obj/machinery/shower{ + pixel_y = 12 + }, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"uJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uK" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/medical/medbay/central) +"uL" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 8 + }, +/obj/item/kirbyplants/random, +/obj/structure/sign/warning/coldtemp{ + pixel_y = 32 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/bed/roller, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uT" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uU" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"uV" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uW" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"uX" = ( +/obj/machinery/atmospherics/components/binary/valve/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"uY" = ( +/obj/effect/spawner/random/trash/janitor_supplies, +/obj/structure/rack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"uZ" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/obj/item/assembly/signaler, +/obj/item/assembly/signaler{ + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"va" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/structure/chair/office, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vc" = ( +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"vd" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"vf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vh" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vi" = ( +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vy" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"vB" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Main Hallway- Surgical Junction"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"vC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"vD" = ( +/obj/effect/spawner/random/structure/girder, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"vE" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"vF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/table, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"vG" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/table, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vH" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vI" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vJ" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/closet/crate/trashcart, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"vK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"vM" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/primary/aft) +"vN" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/west{ + c_tag = "Aft Primary Hallway - Middle" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"vO" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/department/science/central) +"vS" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"vU" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Virology Lab"; + network = list("ss13","medbay") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vV" = ( +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vW" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vX" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Virology Airlock"; + network = list("ss13","medbay") + }, +/obj/structure/closet/l3closet, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"vY" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wa" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Surgical Wing"; + network = list("ss13","medbay") + }, +/obj/structure/bed/roller, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wc" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wd" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"we" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wf" = ( +/obj/machinery/firealarm/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wg" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wi" = ( +/obj/effect/landmark/start/paramedic, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wj" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wk" = ( +/obj/machinery/door/firedoor, +/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/iron/dark, +/area/station/medical/medbay/central) +"wl" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wo" = ( +/obj/structure/closet, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"wp" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/purple, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"wq" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/science/genetics) +"wr" = ( +/obj/structure/table/glass, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"ws" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wu" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wv" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/aft/greater) +"wx" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/greater) +"wz" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/surgery/aft) +"wA" = ( +/obj/machinery/smartfridge/organ, +/obj/machinery/door/poddoor/preopen{ + id = "surgeryc"; + name = "privacy shutter" + }, +/turf/open/floor/iron/dark, +/area/station/medical/surgery/aft) +"wB" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/surgery/aft) +"wC" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/break_room) +"wE" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/break_room) +"wF" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/modular_computer/console/preset/cargochat/medical{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"wG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/computer/department_orders/medical{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"wH" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/vending/drugs, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"wI" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"wJ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"wK" = ( +/obj/effect/spawner/random/structure/chair_maintenance{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wL" = ( +/obj/machinery/atmospherics/components/binary/pump/layer2{ + icon_state = "pump_map-2"; + dir = 8 + }, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wN" = ( +/obj/structure/railing, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wO" = ( +/obj/effect/spawner/random/engineering/canister, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wP" = ( +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"wR" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"wS" = ( +/obj/structure/table/glass, +/obj/structure/reagent_dispensers/wall/virusfood/directional/west, +/obj/machinery/requests_console/directional/south{ + department = "Virology"; + name = "Virology Requests Console"; + receive_ore_updates = 1 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen/red, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wT" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/item/toy/figure/virologist{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wU" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wV" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads into space!"; + name = "deathsposal unit" + }, +/obj/structure/sign/warning/deathsposal{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wX" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"wY" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/greater) +"xa" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"xc" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xd" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xe" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xf" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xg" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"xi" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xj" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"xm" = ( +/obj/machinery/firealarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xr" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Surgery C Maintenance"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"xs" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"xt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xu" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xv" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xw" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Medbay Surgery C"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"xx" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xA" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/poster/official/soft_cap_pop_art{ + pixel_y = 32 + }, +/obj/effect/landmark/start/paramedic, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xB" = ( +/obj/machinery/light/directional/north, +/obj/structure/chair/sofa/corp/right, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xC" = ( +/obj/structure/chair/sofa/corp/left, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"xD" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/beakers{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/storage/box/bodybags, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"xE" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xF" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xG" = ( +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"xM" = ( +/obj/machinery/light/directional/east, +/obj/structure/sign/departments/science{ + name = "\improper ROBOTICS!"; + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"xN" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/science/genetics) +"xO" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/north, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Isolation A"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xP" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xQ" = ( +/obj/structure/rack, +/obj/item/crowbar/red, +/obj/item/restraints/handcuffs, +/obj/item/wrench, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xS" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"xT" = ( +/obj/structure/flora/ausbushes/sunnybush, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Test Subject Chamber"; + network = list("ss13","medbay") + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"xU" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/machinery/airalarm/directional/north, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) +"xV" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) +"xY" = ( +/obj/machinery/light/small/maintenance/directional/east, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"ya" = ( +/obj/machinery/iv_drip, +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"yb" = ( +/obj/structure/table/optable, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"yc" = ( +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"yd" = ( +/obj/structure/closet/secure_closet/medical2, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"ye" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Break Room"; + network = list("ss13","medbay") + }, +/obj/item/radio/intercom/directional/west, +/obj/machinery/vending/coffee, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yg" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yi" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yj" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = 7; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + pixel_x = 7; + pixel_y = 5 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/spawner/random/entertainment/deck{ + pixel_x = -6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/folder/white, +/obj/item/hand_labeler, +/obj/item/pen, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"yl" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ym" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"yn" = ( +/obj/effect/spawner/random/structure/table, +/obj/effect/spawner/random/decoration/generic, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"yo" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"yp" = ( +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"yq" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/medical/morgue) +"yr" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/morgue) +"ys" = ( +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"yt" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"yz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"yA" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) +"yB" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/item/food/grown/banana, +/turf/open/floor/grass, +/area/station/medical/virology) +"yC" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/station/medical/virology) +"yD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"yF" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/abandoned) +"yH" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/landmark/start/medical_doctor, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yI" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yJ" = ( +/obj/item/radio/intercom/directional/south, +/obj/structure/chair/sofa/corp/right{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yK" = ( +/obj/structure/chair/sofa/corp/left{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"yL" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/structure/table/glass, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/storage/box/masks, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"yN" = ( +/obj/machinery/smartfridge/organ, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"yO" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"yP" = ( +/obj/structure/table/reinforced, +/obj/item/storage/backpack/duffelbag/med/surgery, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"yQ" = ( +/obj/structure/bodycontainer/morgue, +/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/iron/dark, +/area/station/medical/morgue) +"yS" = ( +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/door/window/right/directional/south{ + name = "Corpse Arrivals" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"yT" = ( +/obj/structure/disposaloutlet{ + desc = "An outlet for the pneumatic disposal system. This one seems designed for rapid corpse disposal."; + dir = 8; + name = "rapid corpse mover 9000" + }, +/obj/structure/window/reinforced, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"yU" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"yW" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"yX" = ( +/obj/item/toy/beach_ball/branded, +/turf/open/space/basic, +/area/space) +"yY" = ( +/obj/structure/lattice/catwalk, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 8 + }, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"yZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) +"za" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/medical/virology) +"zb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Virology Central Hallway"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"zi" = ( +/obj/structure/lattice/catwalk, +/obj/item/reagent_containers/food/drinks/bottle/rum{ + pixel_x = -7; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/reagent_containers/food/drinks/colocup{ + pixel_x = 6; + pixel_y = -4 + }, +/obj/item/clothing/mask/cigarette/rollie/cannabis{ + pixel_y = -3 + }, +/turf/open/space/basic, +/area/space/nearstation) +"zk" = ( +/obj/machinery/door/airlock{ + name = "Maintenance Bathroom"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"zl" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/light_construct/small/directional/south, +/obj/machinery/light/small/maintenance/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"zm" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/showcase/machinery/oldpod{ + desc = "An old NT branded sleeper, decommissioned after the lead acetate incident. None of the functional machinery remains inside."; + name = "decommissioned sleeper" + }, +/obj/effect/decal/cleanable/greenglow, +/obj/effect/spawner/random/decoration/glowstick, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zn" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old decommissioned scanner, permanently scuttled."; + icon_state = "scanner"; + name = "decommissioned cloning scanner" + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zo" = ( +/obj/structure/light_construct/directional/north, +/obj/effect/decal/cleanable/greenglow, +/obj/structure/showcase/machinery/cloning_pod{ + desc = "An old prototype cloning pod, permanently decommissioned following the incident."; + name = "decommissioned cloner" + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zp" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/roller, +/obj/item/roller, +/obj/item/toy/figure/md, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zq" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/rack, +/obj/item/tank/internals/anesthetic, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"zr" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"zs" = ( +/obj/structure/sign/warning/securearea{ + pixel_y = -32 + }, +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/donkpockets, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"zt" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave{ + pixel_y = 6 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"zu" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"zw" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"zx" = ( +/obj/machinery/iv_drip, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"zy" = ( +/obj/structure/table/optable{ + desc = "A cold, hard place for your final rest."; + name = "Morgue Slab" + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"zz" = ( +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"zB" = ( +/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/iron/dark, +/area/station/medical/morgue) +"zC" = ( +/obj/structure/disposalpipe/segment, +/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/iron/dark, +/area/station/medical/morgue) +"zD" = ( +/obj/machinery/light/small/directional/east, +/obj/structure/bodycontainer/morgue{ + 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/iron/dark, +/area/station/medical/morgue) +"zG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"zI" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"zJ" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/medical/virology) +"zL" = ( +/obj/structure/lattice/catwalk, +/obj/item/instrument/guitar, +/turf/open/space/basic, +/area/space/nearstation) +"zM" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"zN" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"zO" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/mess, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/storage/box/beakers, +/obj/item/storage/box/pillbottles, +/obj/item/storage/box/syringes, +/obj/item/storage/fancy/candle_box, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zQ" = ( +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/door/airlock/medical{ + name = "Unfinished Room"; + req_access_txt = "5" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"zR" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/prepainted/daedalus, +/area/station/medical/psychology) +"zS" = ( +/obj/structure/sign/poster/official/get_your_legs{ + pixel_y = 32 + }, +/obj/structure/chair/sofa/right, +/obj/item/toy/plush/moth{ + name = "Mender Moff" + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"zT" = ( +/obj/structure/chair/sofa/left, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"zU" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_y = 4 + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"zV" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Medbay Main Hallway- South"; + network = list("ss13","medbay") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"zX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"zY" = ( +/obj/effect/landmark/start/paramedic, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"zZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Aa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Ab" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/grunge{ + name = "Morgue"; + req_access_txt = "5;6" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"Ac" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"Ah" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + 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/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"Ai" = ( +/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/iron/dark, +/area/station/medical/morgue) +"Aj" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/bodycontainer/morgue{ + 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/iron/dark, +/area/station/medical/morgue) +"Ak" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/south, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Al" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Am" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Ao" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Ap" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) +"Aq" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Ar" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/station/medical/virology) +"Av" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Ax" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"Ay" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/reagent_containers/pill/maintenance, +/obj/item/storage/box/gum, +/obj/item/surgicaldrill, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"Az" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"AA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"AB" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"AC" = ( +/obj/structure/bookcase/random/reference, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"AD" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/wood, +/area/station/medical/psychology) +"AE" = ( +/turf/open/floor/carpet, +/area/station/medical/psychology) +"AF" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/station/medical/psychology) +"AG" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/sign/departments/psychology{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"AH" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"AI" = ( +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/machinery/firealarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"AJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"AK" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"AL" = ( +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"AM" = ( +/obj/machinery/light_switch/directional/west, +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/paper/guides/jobs/medical/morgue{ + pixel_x = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"AN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"AO" = ( +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"AP" = ( +/obj/effect/landmark/event_spawn, +/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/iron/dark, +/area/station/medical/morgue) +"AQ" = ( +/obj/machinery/door/airlock/grunge{ + name = "Morgue"; + req_access_txt = "6" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"AR" = ( +/obj/structure/table/glass, +/obj/item/hand_labeler, +/obj/item/radio/headset/headset_med, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"AT" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"AU" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ywflowers, +/obj/item/food/grown/banana, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/medical/virology) +"AW" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/station/medical/virology) +"AX" = ( +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"AY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/trash/box, +/obj/effect/spawner/random/maintenance/two, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Tends-the-Wounds" + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"AZ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"Ba" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/skub{ + name = "medicinal skub" + }, +/obj/item/toy/cattoy, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"Bb" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/medical/patient_stretcher, +/obj/item/food/pizzaslice/moldy/bacteria, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"Bc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/medical/patient_stretcher, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"Bd" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"Be" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Bf" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Bg" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Bh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Bi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Bj" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical{ + name = "Psychology"; + req_access_txt = "70" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/psychology) +"Bk" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Bl" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Bm" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/research{ + name = "Chemical Storage"; + req_access_txt = "69" + }, +/obj/effect/turf_decal/tile/yellow/fourcorners, +/turf/open/floor/iron/textured, +/area/station/medical/medbay/central) +"Bn" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table/reinforced, +/obj/item/storage/box/bodybags, +/obj/item/pen, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"Bp" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"Bq" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/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/iron/dark, +/area/station/medical/morgue) +"Br" = ( +/obj/structure/bodycontainer/morgue{ + dir = 1 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Morgue"; + network = list("ss13","medbay") + }, +/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/iron/dark, +/area/station/medical/morgue) +"Bs" = ( +/obj/structure/bodycontainer/morgue{ + 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/iron/dark, +/area/station/medical/morgue) +"Bt" = ( +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/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/iron/dark, +/area/station/medical/morgue) +"Bu" = ( +/obj/item/pushbroom, +/obj/structure/closet{ + name = "janitorial supplies" + }, +/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/iron/dark, +/area/station/medical/morgue) +"Bv" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Bw" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/station/maintenance/aft/lesser) +"Bx" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Bz" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"BA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/reinforced, +/obj/item/book/manual/codex/surgery, +/obj/structure/light_construct/directional/west, +/obj/item/storage/fancy/cigarettes/cigpack_uplift, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BB" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/chair/office/light, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BC" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"BD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BE" = ( +/obj/machinery/status_display/evac/directional/west, +/obj/structure/closet/secure_closet/psychology, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"BH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"BJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"BK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"BL" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"BM" = ( +/obj/structure/table/reinforced, +/obj/item/storage/box/beakers{ + pixel_y = 7 + }, +/obj/item/assembly/igniter{ + pixel_y = -3 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/medbay/central) +"BN" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/end{ + dir = 1 + }, +/turf/open/floor/iron/textured, +/area/station/medical/medbay/central) +"BP" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"BQ" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"BR" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/lesser) +"BS" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/components/unary/passive_vent/layer2{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"BT" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/reinforced, +/obj/item/storage/box/lights/mixed, +/obj/item/cigbutt/cigarbutt, +/obj/item/candle{ + pixel_x = -5 + }, +/obj/item/storage/box/matches{ + pixel_x = 1; + pixel_y = -1 + }, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BU" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/table/reinforced, +/obj/item/clothing/gloves/color/blue{ + desc = "An old pair of nitrile gloves, with no sterile properties."; + name = "old nitrile gloves" + }, +/obj/item/clothing/mask/surgical, +/obj/item/clothing/suit/apron/surgical, +/obj/item/reagent_containers/glass/rag, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BV" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/food/drinks/bottle/vodka, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BW" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/closet, +/obj/item/surgicaldrill, +/obj/machinery/airalarm/directional/south, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/iv_drip, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"BY" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/maintenance/three, +/obj/structure/closet/crate/medical, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"BZ" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/medical/memeorgans, +/obj/structure/closet/crate/freezer, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"Ca" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Cb" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Cc" = ( +/obj/structure/filingcabinet/filingcabinet, +/obj/machinery/camera/directional/south{ + c_tag = "Medbay Psychology Office"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Cd" = ( +/obj/structure/noticeboard/directional/south, +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop{ + dir = 1; + pixel_y = 4 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Ce" = ( +/obj/machinery/light_switch/directional/east, +/obj/structure/table/wood, +/obj/item/folder/white{ + pixel_x = -14; + pixel_y = 3 + }, +/obj/item/paper_bin/carbon{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/pen, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Cg" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/glass/beaker/large{ + pixel_y = 5 + }, +/obj/item/reagent_containers/dropper{ + pixel_y = -4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/medbay/central) +"Ch" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/medical/medbay/central) +"Ci" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/ethanol{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/carbon{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/chlorine{ + pixel_x = 1 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/medbay/central) +"Cu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/easel, +/obj/item/canvas/twentythree_twentythree, +/turf/open/space/basic, +/area/space/nearstation) +"Cx" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Cz" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"CA" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/mercury{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/nitrogen{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/oxygen{ + pixel_x = 1 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/medbay/central) +"CB" = ( +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/textured, +/area/station/medical/medbay/central) +"CC" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/fluorine{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/iodine{ + pixel_x = 1 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/medbay/central) +"CE" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/greater) +"CF" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"CH" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Aft Primary Hallway - Aft" + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"CI" = ( +/obj/structure/sign/directions/evac, +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/aft/lesser) +"CJ" = ( +/obj/structure/lattice/catwalk, +/obj/structure/chair/stool/bar/directional/south, +/obj/item/storage/crayons, +/turf/open/space/basic, +/area/space/nearstation) +"CN" = ( +/obj/structure/rack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"CO" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/two, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"CP" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"CQ" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"CV" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/phosphorus{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/potassium{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/sodium{ + pixel_x = 1 + }, +/turf/open/floor/iron/dark/textured_edge{ + dir = 4 + }, +/area/station/medical/medbay/central) +"CW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/effect/turf_decal/trimline/yellow/filled/end, +/turf/open/floor/iron/textured, +/area/station/medical/medbay/central) +"CX" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/iron{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/lithium{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/medbay/central) +"CY" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"CZ" = ( +/obj/structure/closet/emcloset, +/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/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Da" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/sign/map/right{ + desc = "A framed picture of the station. Clockwise from security in red at the top, you see engineering in yellow, science in purple, escape in checkered red-and-white, medbay in green, arrivals in checkered red-and-blue, and then cargo in brown."; + icon_state = "map-right-MS"; + pixel_y = 32 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Db" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/hallway/secondary/exit/departure_lounge) +"Dc" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/obj/machinery/newscaster/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Dd" = ( +/obj/machinery/vending/coffee, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"De" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/effect/turf_decal/tile/neutral/opposingcorners, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Df" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Dh" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Dn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Dp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Dr" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Ds" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/maintenance/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Dt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Du" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Dv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/yjunction{ + dir = 8 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Dx" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Dy" = ( +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Dz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DC" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DE" = ( +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DF" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"DG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"DH" = ( +/obj/machinery/camera/directional/north, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"DK" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DL" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DM" = ( +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DN" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Crematorium Maintenance"; + req_one_access_txt = "27" + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DP" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"DU" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;6" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"DV" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"DX" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=10-Aft-To-Central"; + location = "9.4-Escape-4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Ek" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Em" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"Eo" = ( +/obj/machinery/light/small/maintenance/directional/south, +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Ep" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Eq" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/structure/bodycontainer/morgue{ + dir = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Er" = ( +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Es" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel/office) +"Et" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/firealarm/directional/west, +/obj/structure/table/wood, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/obj/item/clothing/under/misc/burial, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Eu" = ( +/obj/machinery/requests_console/directional/north{ + department = "Chapel"; + departmentType = 1; + name = "Chapel Requests Console" + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Ev" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Ew" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Ex" = ( +/obj/machinery/door/morgue{ + name = "Relic Closet"; + req_access_txt = "22" + }, +/turf/open/floor/cult, +/area/station/service/chapel/office) +"Ey" = ( +/obj/structure/table/wood, +/obj/item/book/granter/action/spell/smoke/lesser{ + name = "mysterious old book of cloud-chasing" + }, +/obj/item/reagent_containers/food/drinks/bottle/holywater{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/nullrod{ + pixel_x = 4 + }, +/obj/item/organ/heart, +/obj/item/soulstone/anybody/chaplain, +/turf/open/floor/cult, +/area/station/service/chapel/office) +"EA" = ( +/obj/machinery/light/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Fore" + }, +/obj/item/kirbyplants{ + icon_state = "plant-24" + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"EB" = ( +/obj/machinery/status_display/evac/directional/south, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"ED" = ( +/obj/machinery/light/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Fore" + }, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-14" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"EE" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"EH" = ( +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"EI" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/start/chaplain, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"EJ" = ( +/obj/item/flashlight/lamp, +/obj/machinery/newscaster/directional/west, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"EK" = ( +/obj/structure/chair, +/obj/effect/landmark/start/chaplain, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"EM" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/computer/security/telescreen/entertainment/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"EN" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel) +"EO" = ( +/obj/item/candle, +/obj/machinery/light_switch/directional/west, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"EP" = ( +/obj/item/storage/book/bible, +/obj/machinery/light/small/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Chapel - Fore" + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"EQ" = ( +/obj/structure/table/wood, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"ES" = ( +/obj/structure/table/wood, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"ET" = ( +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"EU" = ( +/obj/item/candle, +/obj/machinery/light_switch/directional/north, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"EV" = ( +/obj/structure/table, +/obj/item/candle, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"EW" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"EX" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"EY" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"EZ" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Fa" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + icon_state = "right"; + name = "Outer Window" + }, +/obj/machinery/door/window/brigdoor{ + dir = 4; + name = "Security Desk"; + req_access_txt = "1" + }, +/obj/item/folder/red, +/obj/item/pen, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Fb" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/maintenance/solars/port/aft) +"Fc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Fd" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office - Backroom" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Fe" = ( +/obj/item/storage/crayons, +/obj/machinery/light/small/directional/west, +/obj/structure/table/wood, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Ff" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/table/wood, +/obj/item/folder{ + pixel_y = 2 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Fh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Fi" = ( +/obj/structure/chair, +/obj/item/radio/intercom/chapel/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Fj" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"Fk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Fl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Fn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Fo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"Fp" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/palebush, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/grass, +/area/station/hallway/secondary/exit/departure_lounge) +"Fr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Fs" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Ft" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Crematorium"; + req_access_txt = "22;27" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Fu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Fv" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Fx" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel Office" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Fy" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"FD" = ( +/turf/open/floor/carpet, +/area/station/service/chapel) +"FE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Chapel" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"FF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"FG" = ( +/obj/machinery/light/floor/has_bulb, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"FH" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/east, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"FI" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"FK" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 1; + id = "crematoriumChapel" + }, +/obj/machinery/button/crematorium{ + id = "crematoriumChapel"; + pixel_x = -26; + req_access_txt = "27" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"FL" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 2; + pixel_y = 2 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"FM" = ( +/obj/machinery/vending/wardrobe/chap_wardrobe, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"FN" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"FQ" = ( +/obj/machinery/door/morgue{ + name = "Confession Booth (Chaplain)"; + req_access_txt = "22" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"FR" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/landmark/start/chaplain, +/obj/item/radio/intercom/chapel/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"FS" = ( +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"FT" = ( +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"FU" = ( +/obj/structure/chair/pew/right, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"FV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"FW" = ( +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"FX" = ( +/obj/structure/table, +/obj/item/candle, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"FY" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"FZ" = ( +/obj/structure/flora/ausbushes/fernybush, +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/brflowers, +/obj/structure/flora/ausbushes/sunnybush, +/obj/structure/window/reinforced/fulltile, +/turf/open/floor/grass, +/area/station/hallway/secondary/exit/departure_lounge) +"Ga" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Gc" = ( +/obj/machinery/airalarm/directional/west, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"Gd" = ( +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"Ge" = ( +/obj/structure/chair/pew/right, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"Gf" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"Gg" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gh" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gj" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gk" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"Gl" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chapel_shutters_parlour"; + name = "chapel shutters" + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"Gm" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/light/small/directional/north, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"Gn" = ( +/obj/structure/closet/crate/coffin, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"Go" = ( +/turf/closed/wall/prepainted/daedalus, +/area/station/service/chapel/funeral) +"Gp" = ( +/obj/structure/noticeboard/directional/north{ + desc = "A memorial wall for pinning mementos upon."; + name = "memorial board" + }, +/obj/item/storage/fancy/candle_box, +/obj/item/storage/fancy/candle_box{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/table/wood, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"Gq" = ( +/obj/structure/sign/plaques/kiddie/badger{ + pixel_y = 32 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/item/food/grown/poppy{ + pixel_y = 2 + }, +/obj/machinery/light/small/directional/north, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"Gr" = ( +/obj/structure/noticeboard/directional/north{ + desc = "A memorial wall for pinning mementos upon."; + name = "memorial board" + }, +/obj/item/storage/book/bible, +/obj/structure/table/wood, +/turf/open/floor/carpet, +/area/station/service/chapel/funeral) +"Gs" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Gu" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"Gv" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/chair/pew/left, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"Gw" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"Gx" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Departure Lounge - Port Aft" + }, +/obj/machinery/light/directional/west, +/obj/item/kirbyplants{ + icon_state = "plant-04" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Gz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/status_display/evac/directional/north, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GA" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Departure Lounge - Starboard Aft" + }, +/obj/machinery/light/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-16" + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GB" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"GC" = ( +/obj/structure/closet/crate/coffin, +/obj/machinery/door/window/left/directional/east{ + name = "Coffin Storage"; + req_access_txt = "22" + }, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"GD" = ( +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GG" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Funeral Parlour" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"GJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"GK" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"GL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"GM" = ( +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"GN" = ( +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GP" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9.4-Escape-4"; + location = "9.3-Escape-3" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GQ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GR" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9.3-Escape-3"; + location = "9.2-Escape-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"GS" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GT" = ( +/obj/structure/chair{ + pixel_y = -2 + }, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GU" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Chapel - Funeral Parlour" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/computer/pod/old/mass_driver_controller/chapelgun{ + pixel_x = 24 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"GV" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"GW" = ( +/obj/structure/table/wood, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"GX" = ( +/obj/item/storage/book/bible, +/obj/structure/altar_of_gods, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"GY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"GZ" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Chapel- Starboard" + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"Ha" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hb" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hc" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hd" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/delivery, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"He" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hf" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hg" = ( +/obj/structure/sign/warning/vacuum{ + pixel_x = 32 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hh" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Hi" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"Hj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"Hk" = ( +/obj/machinery/door/window{ + dir = 4; + name = "Mass Driver"; + req_access_txt = "22" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"Hl" = ( +/obj/machinery/mass_driver/chapelgun, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/machinery/light/small/directional/north, +/obj/item/gps, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"Hm" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Chapel - Port" + }, +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"Hn" = ( +/obj/item/flashlight/lantern{ + pixel_y = 7 + }, +/obj/structure/table/wood, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"Ho" = ( +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"Hp" = ( +/obj/effect/landmark/start/chaplain, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"Hq" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/chapel{ + dir = 8 + }, +/area/station/service/chapel) +"Hr" = ( +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/chapel, +/area/station/service/chapel) +"Hs" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Ht" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/landmark/navigate_destination, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Hu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space/basic, +/area/space/nearstation) +"Hv" = ( +/obj/machinery/hydroponics/soil{ + pixel_y = 8 + }, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/machinery/light/small/directional/north, +/turf/open/floor/cult, +/area/station/service/chapel/funeral) +"Hw" = ( +/obj/machinery/door/morgue{ + name = "Chapel Garden" + }, +/turf/open/floor/cult, +/area/station/service/chapel/funeral) +"Hx" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "chapel_shutters_parlour"; + name = "chapel shutters control" + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"Hy" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"Hz" = ( +/obj/structure/chair, +/obj/effect/landmark/start/chaplain, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"HA" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"HB" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/item/food/grown/harebell, +/obj/structure/table/wood, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"HC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"HD" = ( +/obj/structure/bookcase{ + name = "Holy Bookcase" + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel/funeral) +"HE" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"HF" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"HG" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"HH" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/light_switch/directional/south{ + pixel_x = 8 + }, +/obj/machinery/button/door/directional/south{ + id = "chapel_shutters_space"; + name = "chapel shutters control"; + pixel_x = -6 + }, +/turf/open/floor/iron/chapel{ + dir = 1 + }, +/area/station/service/chapel) +"HI" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/turf/open/floor/iron/chapel{ + dir = 4 + }, +/area/station/service/chapel) +"HJ" = ( +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"HK" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"HL" = ( +/obj/machinery/door/poddoor/massdriver_chapel, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/station/service/chapel/funeral) +"HM" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "chapel_shutters_space"; + name = "chapel shutters" + }, +/turf/open/floor/plating, +/area/station/service/chapel) +"HN" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock"; + space_dir = 2 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"HO" = ( +/obj/effect/turf_decal/delivery, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock"; + space_dir = 2 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"HP" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"HQ" = ( +/obj/docking_port/stationary{ + dir = 2; + dwidth = 9; + height = 25; + id = "emergency_home"; + name = "emergency evac bay"; + width = 29 + }, +/turf/open/space/basic, +/area/space) +"HR" = ( +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space) +"HS" = ( +/obj/structure/closet/crate/freezer, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/random, +/obj/item/reagent_containers/blood/o_plus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/b_plus, +/obj/item/reagent_containers/blood/b_minus, +/obj/item/reagent_containers/blood/a_plus, +/obj/item/reagent_containers/blood/a_minus, +/obj/item/reagent_containers/blood/lizard, +/obj/item/reagent_containers/blood/ethereal, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/reagent_containers/blood{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"HT" = ( +/obj/structure/closet/secure_closet/medical1, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"HU" = ( +/obj/structure/closet/l3closet/virology, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"HV" = ( +/obj/machinery/atmospherics/components/tank/air, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"HW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"HX" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/infections{ + pixel_y = 7 + }, +/obj/item/reagent_containers/syringe/antiviral, +/obj/item/reagent_containers/dropper, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"HZ" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/space) +"Ia" = ( +/turf/open/floor/iron/white, +/area/space) +"Ib" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/turf/open/floor/iron/white, +/area/space) +"Ig" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Ik" = ( +/obj/machinery/light_switch/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Virology Lab"; + network = list("ss13","medbay") + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Il" = ( +/obj/structure/table/glass, +/obj/item/clothing/gloves/color/latex, +/obj/item/healthanalyzer, +/obj/item/clothing/glasses/hud/health, +/obj/item/clothing/glasses/science, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"Im" = ( +/obj/structure/chair/office/light{ + dir = 8 + }, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"In" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"Io" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Ip" = ( +/obj/structure/table/glass, +/obj/structure/reagent_dispensers/wall/virusfood/directional/west, +/obj/machinery/requests_console/directional/south{ + department = "Virology"; + name = "Virology Requests Console"; + receive_ore_updates = 1 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen/red, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/item/stack/sheet/mineral/plasma, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"Iq" = ( +/obj/structure/table/glass, +/obj/machinery/reagentgrinder{ + pixel_y = 8 + }, +/obj/item/toy/figure/virologist{ + pixel_x = -8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/space) +"Ir" = ( +/obj/machinery/smartfridge/chemistry/virology/preloaded, +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/space) +"Is" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads into space!"; + name = "deathsposal unit" + }, +/obj/structure/sign/warning/deathsposal{ + pixel_y = -32 + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/space) +"Iu" = ( +/obj/machinery/vending/wardrobe/viro_wardrobe, +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/space) +"Ix" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/north, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Isolation A"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/space) +"Iy" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/space) +"Iz" = ( +/obj/structure/rack, +/obj/item/crowbar/red, +/obj/item/restraints/handcuffs, +/obj/item/wrench, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"IB" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"IC" = ( +/obj/structure/flora/ausbushes/sunnybush, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Test Subject Chamber"; + network = list("ss13","medbay") + }, +/turf/open/floor/grass, +/area/space) +"ID" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/machinery/airalarm/directional/north, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/space) +"IE" = ( +/obj/structure/flora/junglebush/c, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/space) +"IH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"IK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"IL" = ( +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/space) +"IM" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/item/food/grown/banana, +/turf/open/floor/grass, +/area/space) +"IN" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/open/floor/grass, +/area/space) +"IO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space) +"IP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Virology Central Hallway"; + network = list("ss13","medbay") + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"IR" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Ja" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"Jb" = ( +/obj/structure/flora/ausbushes/lavendergrass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/space) +"Jd" = ( +/obj/structure/table/glass, +/obj/machinery/light/small/directional/south, +/obj/item/folder/white{ + pixel_y = 4 + }, +/obj/item/pen/red, +/turf/open/floor/iron/white, +/area/space) +"Je" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/bedsheet/medical{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Jf" = ( +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"Jh" = ( +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Ji" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/space) +"Jk" = ( +/obj/structure/flora/rock/jungle, +/turf/open/floor/grass, +/area/space) +"Jl" = ( +/obj/structure/table/glass, +/obj/item/hand_labeler, +/obj/item/radio/headset/headset_med, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/green/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"Jn" = ( +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 9 + }, +/obj/effect/turf_decal/tile/green/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/space) +"Jo" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ywflowers, +/obj/item/food/grown/banana, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/grass, +/area/space) +"Jq" = ( +/obj/structure/flora/junglebush/b, +/obj/structure/flora/ausbushes/ppflowers, +/obj/machinery/light/directional/east, +/turf/open/floor/grass, +/area/space) +"Jr" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"Jt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"Ju" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Jx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/poddoor/preopen{ + id = "medsecprivacy"; + name = "privacy shutter" + }, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/security/checkpoint/medical) +"Jz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"JA" = ( +/obj/structure/table/glass, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white, +/obj/item/pen/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/space) +"JC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"JF" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"JG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"JK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/hallway/secondary/exit/departure_lounge) +"JL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"JM" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"JN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"JO" = ( +/obj/machinery/power/data_terminal, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/bot, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"JP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"JQ" = ( +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"JT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"JU" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"JW" = ( +/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/item/kirbyplants{ + icon_state = "plant-03" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"JY" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"JZ" = ( +/obj/effect/mapping_helpers/dead_body_placer, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/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/iron/dark, +/area/station/medical/morgue) +"Ka" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Kd" = ( +/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/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"Kh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/start/medical_doctor, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Ki" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Kj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Km" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Departure Lounge Security Post"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Kn" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;27" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Ko" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"Kp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/maintenance/directional/east, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Kr" = ( +/obj/structure/cable/smart_cable/color/yellow, +/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/iron/dark, +/area/station/medical/morgue) +"Ks" = ( +/obj/machinery/power/tracker, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"Ku" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;47" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/lesser) +"Kw" = ( +/obj/effect/decal/cleanable/oil, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"Ky" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"KF" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"KG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/airalarm/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"KI" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"KO" = ( +/obj/structure/table/glass, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/folder/white, +/obj/item/pen/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"KQ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/service/library) +"KV" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Lab"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"La" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Le" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/space/basic, +/area/station/solars/port/aft) +"Lf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/medical, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"Lg" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "corporate_privacy"; + name = "showroom shutters" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/command/corporate_showroom) +"Lh" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape"; + location = "8-Central-to-Aft" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Lk" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Ll" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Lp" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_exterior"; + name = "Virology Exterior Airlock"; + req_access_txt = "39" + }, +/obj/machinery/door_buttons/access_button{ + dir = 1; + 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 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Lr" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/iron/white, +/area/space) +"Lt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Lu" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Medbay Security Post"; + req_access_txt = "63" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"Lv" = ( +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Lw" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Lx" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Ly" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/office) +"LA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"LC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"LE" = ( +/obj/machinery/power/smes, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"LG" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"LJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"LK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Abandoned Warehouse"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"LL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"LN" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/office) +"LO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/library) +"LQ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/virology) +"LR" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"LS" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"LU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) +"LW" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"LY" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"LZ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) +"Ma" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/sign/warning/securearea{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction/flip{ + dir = 8 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Mb" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Test Subject Cell"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Me" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Mf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"Mg" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Chapel Office"; + req_access_txt = "22" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/service/chapel/office) +"Mj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Mk" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/service/chapel) +"Ml" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Mo" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Mu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Mv" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Mechanic Storage" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Mw" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/solar{ + id = "aftport"; + name = "Aft-Port Solar Array" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"Mx" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"My" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/office) +"MB" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "cmoprivacy"; + name = "privacy shutter" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/command/heads_quarters/cmo) +"MD" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ME" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"MF" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"MH" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"MJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"MK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"ML" = ( +/obj/machinery/computer/mech_bay_power_console, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"MP" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Aft Primary Hallway" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"MQ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Containment Cells"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"MW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"MX" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/medical/abandoned) +"Nb" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Nd" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/hallway/primary/aft) +"Nf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/virology) +"Ng" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"Nh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table, +/obj/item/stack/medical/mesh, +/obj/item/stack/gauze, +/obj/item/stack/medical/bruise_pack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Ni" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Nj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Nk" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Nl" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"No" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Np" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;6" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Nq" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Ns" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/space) +"Nt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Nu" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/space) +"Nz" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"NA" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "5" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"NB" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Surgery Maintenance"; + req_access_txt = "45" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ND" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"NI" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"NP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"NQ" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"NU" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/service/chapel) +"NW" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"NX" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"NZ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Oi" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Oj" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Ok" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Ol" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/space) +"Om" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"Op" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Oq" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"Os" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Ot" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Ow" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Ox" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"Oy" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"OB" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"OC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"OE" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"OF" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"OG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"OH" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/spawner/random/maintenance, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"OJ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/circuit, +/area/station/maintenance/port/aft) +"OL" = ( +/obj/structure/water_source/puddle, +/obj/structure/flora/junglebush/large{ + pixel_y = 0 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/space) +"OM" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"ON" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"OO" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=11-Command-Port"; + location = "10.2-Aft-Port-Corner" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"OP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/chair/office/light, +/obj/effect/landmark/start/virologist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/space) +"OU" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/iv_drip, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"OV" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"OY" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Morgue Maintenance"; + req_access_txt = "6" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"OZ" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Pd" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Pf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Ph" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Departure Lounge" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"Pl" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"Pm" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"Pn" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/space) +"Pr" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Pw" = ( +/obj/effect/turf_decal/bot, +/obj/effect/spawner/random/structure/closet_empty/crate, +/turf/open/floor/iron, +/area/station/maintenance/port/aft) +"Pz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/storage) +"PC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"PE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"PG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"PI" = ( +/obj/structure/table/glass, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 10 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = -6; + pixel_y = 6 + }, +/obj/item/reagent_containers/glass/beaker/cryoxadone{ + pixel_x = 6; + pixel_y = 6 + }, +/obj/item/storage/pill_bottle/alkysine, +/obj/item/reagent_containers/dropper{ + pixel_y = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"PK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"PL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 27 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/space) +"PM" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"PN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/junction{ + dir = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"PQ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"PR" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/airalarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"PV" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Quarter Solar Access"; + req_access_txt = "10" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"PX" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/layer_manifold/supply/hidden, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"PY" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"Qa" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Qb" = ( +/obj/structure/chair, +/obj/effect/landmark/start/assistant, +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Qf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Isolation B"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/space) +"Qh" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Qk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Qn" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Qo" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Qp" = ( +/obj/structure/table/glass, +/obj/item/storage/secure/briefcase{ + pixel_x = 3; + pixel_y = 5 + }, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Qr" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Qt" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/station/medical/virology) +"Qu" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/sign/poster/ripped{ + pixel_y = -32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Qv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Qw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"Qy" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"QA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"QC" = ( +/obj/machinery/power/solar_control{ + dir = 4; + id = "aftport"; + name = "Port Quarter Solar Control" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"QD" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"QH" = ( +/obj/machinery/light/small/directional/north, +/obj/machinery/light_switch/directional/north, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 8 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/table/wood, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"QI" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#9FED58" + }, +/turf/open/floor/iron/white, +/area/space) +"QJ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"QL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"QM" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/medical/glass{ + name = "Cryogenics Bay"; + req_access_txt = "5" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"QP" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Pharmacy Maintenance"; + req_access_txt = "69" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"QS" = ( +/obj/structure/table/glass, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/white/corner{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/medical, +/turf/open/floor/iron/white/side{ + dir = 6 + }, +/area/station/medical/treatment_center) +"QT" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/space) +"QV" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"QW" = ( +/obj/machinery/nuclearbomb/beer{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/structure/table/wood, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"QX" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Ra" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/office) +"Rd" = ( +/obj/machinery/door/airlock/external, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Rh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Ri" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/rack, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Rj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/north, +/turf/open/floor/plating, +/area/station/engineering/storage/mech) +"Ro" = ( +/obj/machinery/door/airlock/research{ + name = "Mech Bay"; + req_access_txt = "29" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/purple/fourcorners, +/turf/open/floor/iron, +/area/station/science/robotics/mechbay) +"Rp" = ( +/obj/item/storage/fancy/candle_box{ + pixel_y = 5 + }, +/obj/structure/table/wood, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Rt" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Rx" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Ry" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"RB" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"RD" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"RF" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"RG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/west, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"RH" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"RJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"RK" = ( +/obj/effect/spawner/xmastree, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/service/chapel) +"RL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"RM" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Library Maintenance"; + req_one_access_txt = "12;37" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"RO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"RP" = ( +/obj/item/radio/intercom/directional/south, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/computer/crew{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"RQ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"RT" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/portables_connector/layer2{ + icon_state = "connector_map-2"; + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"RV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"RW" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Sn" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/space) +"So" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/space) +"Sp" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"Sq" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"Ss" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"St" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/virology{ + autoclose = 0; + frequency = 1449; + id_tag = "virology_airlock_interior"; + name = "Virology Interior Airlock"; + req_access_txt = "39" + }, +/obj/machinery/door_buttons/access_button{ + idDoor = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Button"; + pixel_x = 8; + pixel_y = -24; + req_access_txt = "39" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Su" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Maintenance"; + req_one_access_txt = "12;22" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Sz" = ( +/obj/machinery/mech_bay_recharge_port, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"SC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"SH" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Chapel Office Maintenance"; + req_one_access_txt = "22" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"SI" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box/white{ + color = "#52B4E9" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"SJ" = ( +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"SK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"SN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation A"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"SP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"SQ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"SR" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/maintenance/directional/south, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"ST" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"SV" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"SX" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner"; + location = "10.1-Central-from-Aft" + }, +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"SY" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line, +/turf/open/floor/iron/white, +/area/station/medical/office) +"Ta" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Tb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Tc" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Td" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Te" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/structure/table, +/obj/machinery/telephone/engineering, +/obj/machinery/power/data_terminal, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Tj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Tl" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/dark, +/area/station/medical/medbay/central) +"Tm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) +"Tn" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Tp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"Tr" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "viro-passthrough" + }, +/turf/open/floor/plating, +/area/station/medical/medbay/central) +"Ts" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/grass, +/area/space) +"Tw" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"Tx" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Ty" = ( +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"Tz" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/effect/landmark/start/depsec/medical, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"TA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"TB" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"TC" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"TH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"TK" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"TN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"TQ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"TU" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"TW" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/white, +/area/space) +"TX" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L8" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Ub" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Ud" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Uf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Uh" = ( +/obj/machinery/computer/security/telescreen/cmo{ + dir = 4; + pixel_x = -30 + }, +/obj/machinery/keycard_auth/directional/south{ + pixel_x = 6 + }, +/obj/machinery/button/door/directional/south{ + id = "cmoprivacy"; + name = "CMO Privacy Shutters"; + pixel_x = -8; + req_access_txt = "40" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/machinery/power/data_terminal, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/machinery/telephone/command, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Uk" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light_switch/directional/north, +/obj/machinery/power/apc/auto_name/directional/east, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"Ul" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Un" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Uq" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Break Room"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/break_room) +"Ut" = ( +/obj/machinery/door/airlock/command{ + name = "Chief Medical Officer's Office"; + req_access_txt = "40" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Uu" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Uw" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"UA" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/abandoned) +"UI" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"UK" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Port Corner" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/blue/filled/corner, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"UL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Isolation B"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"UN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/solar{ + id = "forestarboard"; + name = "Fore-Starboard Solar Array" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/station/solars/port/aft) +"US" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 27 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"UU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Medical Freezer Maintenance"; + req_access_txt = "5" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"UW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/girder, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"UX" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/west, +/turf/open/floor/wood, +/area/station/service/library) +"UY" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Vb" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Access"; + req_one_access_txt = "5;39" + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Vc" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/rack, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Ve" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Vg" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Vh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/dark/textured, +/area/station/medical/cryo) +"Vi" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/dropper, +/obj/machinery/camera/directional/north{ + c_tag = "Virology Isolation B"; + network = list("ss13","medbay") + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Vk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Vm" = ( +/obj/structure/window/reinforced, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/random/decoration/showcase, +/obj/machinery/light/small/directional/north, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"Vn" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/grunge{ + name = "Quiet Room" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"Vq" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Vs" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/north, +/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/iron/dark, +/area/station/medical/morgue) +"Vt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/wood, +/area/station/service/library) +"Vu" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Vv" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Vw" = ( +/obj/structure/light_construct/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Vx" = ( +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 16 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Vz" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/power/terminal{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/chair/stool/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"VC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"VG" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"VJ" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"VK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Containment Cells"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/fourcorners, +/turf/open/floor/iron/white, +/area/space) +"VL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"VO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"VP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"VR" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Virology Lab"; + req_access_txt = "39" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"VS" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"VU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"VV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"VW" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"VY" = ( +/obj/structure/chair/office/light, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/start/psychologist, +/turf/open/floor/wood, +/area/station/medical/psychology) +"VZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Wd" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/effect/mapping_helpers/paint_wall/medical, +/turf/open/floor/plating, +/area/space) +"Wl" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"Wm" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/machinery/newscaster/directional/south, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Wn" = ( +/obj/structure/cable/smart_cable/color/yellow, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/space) +"Wo" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay Clinic" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Wp" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Ws" = ( +/obj/structure/table, +/obj/item/stack/gauze, +/obj/item/stack/medical/mesh, +/obj/item/stack/medical/bruise_pack, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Wu" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/station/security/checkpoint/medical) +"Ww" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Wx" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"Wy" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + sortType = 27 + }, +/obj/effect/turf_decal/tile/green/half/contrasted, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"WA" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"WC" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Psychology Maintenance"; + req_access_txt = "70" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"WD" = ( +/obj/item/bodypart/chest/robot{ + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/bodypart/head/robot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/structure/table/wood, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"WG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/carpet, +/area/station/service/chapel) +"WH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"WJ" = ( +/obj/machinery/holopad, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/medical/medbay/lobby) +"WL" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"WO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"WP" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/wood, +/area/station/service/library) +"WQ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"WS" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door_buttons/airlock_controller{ + idExterior = "virology_airlock_exterior"; + idInterior = "virology_airlock_interior"; + idSelf = "virology_airlock_control"; + name = "Virology Access Console"; + pixel_x = 24; + pixel_y = -24; + req_access_txt = "39" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"WU" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"WX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port) +"WZ" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;25;28" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "viro-passthrough" + }, +/turf/open/floor/plating, +/area/station/medical/medbay/central) +"Xa" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Xb" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/virology/glass{ + name = "Test Subject Cell"; + req_access_txt = "39" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"Xc" = ( +/obj/machinery/light/small/maintenance/directional/west, +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"Xd" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Xf" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Xi" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port) +"Xj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/kirbyplants/random, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/medical/psychology) +"Xk" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Xl" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"Xm" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/grass, +/area/station/medical/virology) +"Xn" = ( +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/sink{ + dir = 4; + pixel_x = -12; + pixel_y = -2 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"Xq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"Xr" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=9.2-Escape-2"; + location = "9.1-Escape-1" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Xu" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/opposingcorners, +/turf/open/floor/iron/dark, +/area/station/hallway/secondary/exit/departure_lounge) +"Xz" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/medical/psychology) +"XA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/camera/directional/south{ + c_tag = "Chief Medical Officer's Office"; + network = list("ss13","medbay") + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"XB" = ( +/obj/effect/spawner/random/structure/grille, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"XD" = ( +/obj/machinery/camera/autoname/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/sm_apc/directional/north, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"XJ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating/airless, +/area/station/solars/port/aft) +"XK" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/spawner/random/decoration/showcase, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"XM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/event_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"XN" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"XO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/turf/open/floor/wood, +/area/station/service/library) +"XQ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/aft) +"XR" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/airlock/medical/glass{ + name = "Paramedic Dispatch Room"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/office) +"XS" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"XV" = ( +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/basic_buffer{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/glass/bottle/space_cleaner, +/obj/structure/sign/warning/chemdiamond{ + pixel_y = 32 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron/dark/textured_edge{ + dir = 8 + }, +/area/station/medical/medbay/central) +"XY" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/solar_assembly, +/obj/item/stack/sheet/glass/fifty, +/obj/structure/closet/crate/engineering/electrical, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"XZ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/mob/living/carbon/human/species/monkey, +/turf/open/floor/grass, +/area/station/medical/virology) +"Yd" = ( +/obj/structure/table/wood, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/storage/photo_album/chapel, +/turf/open/floor/iron/grimy, +/area/station/service/chapel/office) +"Yf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/pharmacy) +"Yg" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "5;12;29;33;69" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/maintenance/department/science/central) +"Ym" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Yn" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Primary Treatment Centre"; + req_access_txt = "5" + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/door/firedoor, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/treatment_center) +"Yp" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/space) +"Yq" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Yr" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/station/service/library) +"Yt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/library) +"Yv" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/station/service/library) +"Yw" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Yx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"Yy" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"YC" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/station/medical/virology) +"YE" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/landmark/pestspawn, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"YG" = ( +/obj/structure/table/glass, +/obj/item/paper_bin, +/obj/item/clipboard, +/obj/item/toy/figure/cmo, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"YH" = ( +/obj/machinery/computer/pandemic, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"YJ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"YK" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"YN" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;33;69" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/department/medical/central) +"YO" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 9 + }, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"YP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"YR" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/space) +"YU" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/grass, +/area/station/medical/virology) +"YV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/surgery/theatre) +"YZ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/solars/port/aft) +"Zb" = ( +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/rack, +/obj/item/multitool, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Zd" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/warning{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/medbay/lobby) +"Zg" = ( +/obj/machinery/computer/pandemic, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/green/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Zi" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Zj" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/engineering/storage/mech) +"Zk" = ( +/obj/structure/water_source/puddle, +/obj/structure/flora/junglebush/large{ + pixel_y = 0 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/station/medical/virology) +"Zl" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/service/library) +"Zm" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/white, +/area/station/medical/virology) +"Zq" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Medbay Maintenance"; + req_access_txt = "5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Zs" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/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/iron/dark, +/area/station/medical/morgue) +"Zt" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/medbay/central) +"Zu" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/station/maintenance/aft/greater) +"Zv" = ( +/obj/machinery/door/firedoor, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white/side, +/area/station/medical/medbay/lobby) +"Zw" = ( +/obj/structure/chair/office/light, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white, +/area/station/command/heads_quarters/cmo) +"Zx" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/kitchen_coldroom/freezerfloor, +/area/station/medical/coldroom) +"Zy" = ( +/obj/structure/table/wood, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/item/folder/blue, +/obj/item/clothing/head/collectable/hop{ + name = "novelty HoP hat" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/carpet, +/area/station/command/corporate_showroom) +"ZB" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/station/maintenance/port/aft) +"ZG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;5;39;37;25;28" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ZH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/station/service/chapel/funeral) +"ZI" = ( +/obj/machinery/disposal/bin{ + desc = "A pneumatic waste disposal unit. This one leads to the morgue."; + name = "corpse disposal" + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/sign/warning/bodysposal{ + pixel_y = -32 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"ZK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/station/command/corporate_showroom) +"ZL" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Auxilliary Surgery"; + req_access_txt = "45" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/station/medical/surgery/aft) +"ZN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/station/medical/office) +"ZO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/break_room) +"ZR" = ( +/obj/effect/turf_decal/trimline/blue/filled/end, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/white, +/area/station/medical/cryo) +"ZS" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/station/maintenance/port) +"ZU" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/neutral/filled/warning{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/medical/morgue) +"ZY" = ( +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/grass, +/area/station/medical/virology) + +(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 +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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +ab +bj +bQ +bj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ac +bj +bR +bj +dj +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ac +bk +bk +bk +bS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rs +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ac +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ac +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rt +rW +rW +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ad +bl +bT +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +qU +ru +qU +qU +qU +qU +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 +"} +(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 +ae +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +qU +rv +rX +sF +ti +rw +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 +"} +(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 +af +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +qU +qU +qU +sG +tj +rw +bT +ux +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ag +bl +bT +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +qV +rw +rY +sH +tk +rw +bT +bT +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +Bx +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +rW +Hu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +af +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bT +qU +rZ +qU +qU +qU +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rW +aa +aa +aa +aa +aa +aa +aa +bT +aa +aa +bT +aa +aa +aa +aa +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 +"} +(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 +ah +bk +bS +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bT +dJ +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +yX +aa +aa +aa +rW +aa +bT +aa +aa +aa +Ks +aa +aa +aa +aa +bT +aa +aa +aa +aa +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 +"} +(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 +ai +am +am +am +am +dJ +dJ +dJ +dJ +dJ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bT +dJ +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rW +aa +Cu +CJ +bT +bT +XJ +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +"} +(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 +LZ +Kn +RQ +mq +am +am +am +Rd +am +am +aa +bS +bS +aa +jW +aa +bS +bS +bS +bS +bS +aa +aa +aa +aa +aa +bT +dJ +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +rW +aa +bT +aa +aa +aa +XJ +aa +bT +aa +aa +bT +aa +aa +aa +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +Kd +am +bU +mq +dk +am +ek +WX +fA +dM +dM +hA +hA +dM +dM +dM +hA +hA +hA +hA +hA +bS +aa +aa +aa +aa +bT +dJ +bT +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +yY +aa +aa +aa +rW +aa +bT +aa +aa +Mw +XJ +Mw +Mw +Mw +Mw +Mw +Mw +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +JW +am +bV +mq +am +am +am +OB +am +dM +gL +hB +ix +jl +jX +kF +hA +lS +mF +hH +hA +hA +bT +bT +bT +bT +bT +dJ +bT +bT +bT +rW +rW +rW +rW +rW +rW +rW +rW +rW +yZ +bT +bT +bT +bT +bT +bT +bT +Mw +Le +XJ +Le +Le +Le +Le +Le +Le +Mw +aa +qV +Hi +qV +bT +Hu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +am +am +bW +mq +ca +am +el +ZS +bw +dM +gM +hC +hC +hD +hC +hF +hF +lT +jn +iz +nW +hA +hA +bS +aa +aa +bT +dJ +bT +aa +aa +bT +aa +aa +aa +aa +aa +aa +bS +bS +yZ +bS +bS +bT +aa +aa +aa +aa +bT +Mw +XJ +Mw +Mw +Mw +Mw +Mw +Mw +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +RQ +RQ +RQ +Ev +RJ +MD +QA +QA +cC +dM +gN +hD +hC +hC +hC +kG +hH +iz +iz +nq +hF +oH +hA +bS +aa +aa +bT +dJ +bT +aa +aa +uf +uf +Qt +Qt +Qt +uf +uf +Qt +Qt +za +Qt +Qt +uf +aa +aa +aa +aa +bT +aa +Pm +aa +aa +aa +aa +aa +bT +aa +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ao +bn +bw +bu +RQ +bw +en +bo +fB +dM +gO +hE +hE +jm +jY +jY +hH +hF +hF +hF +hF +oI +hA +bS +aa +aa +bT +dJ +bT +aa +aa +uf +uy +vh +Zg +wr +wS +uf +xO +Uw +za +Vi +Ak +uf +aa +aa +aa +aa +bT +Mw +XJ +Mw +Mw +Mw +Mw +Mw +Mw +bT +bT +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ap +bo +bv +bo +RQ +am +am +am +am +dM +gP +hF +iy +jn +jZ +kH +hF +iz +hF +hF +nq +jZ +hA +bS +aa +aa +bT +dJ +bT +aa +aa +uf +uz +vi +Zm +ws +wT +uf +xP +Uf +za +PR +Al +uf +bT +bT +bT +bT +Mw +Le +XJ +Le +Le +Le +Le +Le +Le +Mw +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +am +am +am +bw +tb +am +aA +bo +fC +dM +gQ +hG +hF +hF +eV +kI +eX +hF +hF +iz +hF +hA +hA +bT +bT +bT +dM +sa +dM +bT +bT +uf +uA +vi +MF +wt +wU +uf +Qt +SN +za +JU +Qt +uf +uf +aa +aa +aa +bT +Mw +XJ +Mw +Mw +Mw +Mw +Mw +Mw +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aq +au +am +cB +RJ +dL +eo +eR +bo +dM +gR +hH +iz +hF +hF +iH +hF +hF +hF +hF +hF +oJ +dM +dM +dM +dM +dM +sb +hA +aa +aa +uf +uB +vj +PX +wt +wV +uf +xQ +JG +zb +JG +Am +AR +Qt +bS +aa +aa +bT +aa +Pm +aa +aa +aa +aa +aa +bT +aa +aa +Hh +Hh +Hi +bT +Hu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ar +bp +am +cC +RQ +am +ay +eS +fD +dM +gS +hI +hF +jo +hF +kJ +lo +hF +hF +nr +nX +dM +dM +dM +qv +qW +dM +sc +dM +dM +aa +uf +Vc +Ud +NI +NI +Wy +MQ +Vv +VP +JN +Rx +Nb +KO +LQ +BS +aa +aa +bT +UN +XJ +UN +UN +UN +UN +UN +UN +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +as +bq +am +cD +RQ +am +ep +am +am +dM +gT +hJ +iA +dM +ka +kK +dM +lU +mG +dM +nY +dM +pw +dM +qw +qX +rx +sd +sI +dM +aa +uf +uD +Qn +vU +wu +wX +Nf +xS +yz +Xa +zI +Ao +AT +Qt +bT +bT +bT +UN +Le +XJ +Le +Le +Le +Le +Le +Le +UN +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +at +at +bX +cE +RQ +am +am +am +fE +dM +dM +dM +dM +dM +dM +kL +dM +dM +dM +dM +dM +dM +dM +dM +dM +dM +dM +se +iH +dM +bT +uf +uf +VR +uf +uf +uf +uf +uf +Qt +Mb +Qt +Qt +uf +uf +aa +aa +aa +bT +UN +TA +UN +UN +UN +UN +UN +UN +bT +bT +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ar +br +am +cF +RQ +RJ +Nq +BH +Tn +iK +eG +mv +pc +iK +RG +iK +dM +lV +mH +ns +nZ +oK +eX +pZ +lV +dM +ry +eX +sJ +dM +aa +bS +Qt +Nj +Qt +bS +aa +uf +xT +yA +YU +zJ +Ap +AU +Qt +aa +aa +aa +bT +aa +XJ +aa +aa +aa +aa +aa +bT +aa +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +au +bs +am +cG +RQ +dM +dM +dM +dM +dM +dM +hL +dM +dM +dM +iK +lp +lV +eX +eX +Pw +eX +px +eX +Pw +dM +dM +sf +iH +dM +aa +bS +Qt +Nj +Qt +bS +aa +uf +xU +yB +Xm +YC +Zk +XZ +Qt +aa +aa +aa +bT +UN +XJ +UN +UN +UN +UN +UN +UN +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +am +am +am +am +RQ +dM +er +eU +fG +gh +gV +hM +iC +Vq +Mx +Qu +dM +lW +eX +Pl +ob +eX +Pw +oL +eX +dM +rz +sg +iH +dM +aa +bS +Qt +WS +Qt +bS +aa +uf +xV +yC +ZY +yA +Ar +AW +Qt +bT +bT +bT +UN +Le +XJ +Le +Le +Le +Le +Le +Le +UN +aa +qV +qV +qV +bT +Hu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +av +bt +bY +am +tb +dM +es +eV +fH +gi +dM +hN +dM +LL +dM +iK +dM +lX +eX +eX +eX +oL +nZ +eX +nZ +dM +dM +sh +iH +dM +dM +uf +uf +St +uf +uf +bT +uf +uf +Qt +Qt +Qt +Qt +uf +uf +aa +aa +aa +aa +UN +XJ +UN +UN +UN +UN +UN +UN +bT +bT +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aw +bu +ao +am +gX +dM +et +eW +fI +gj +dM +dM +dM +TQ +dM +MH +LK +lY +lY +nu +oc +oM +py +eX +eX +qY +rA +si +iH +dM +tF +uf +uF +PC +vV +uf +aa +aa +bT +aa +aa +aa +aa +bT +aa +aa +aa +aa +aa +aa +XJ +aa +aa +aa +aa +aa +aa +aa +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ax +bo +bw +am +RQ +dM +eu +eX +fJ +gk +gW +hO +TQ +YP +dM +fs +dM +lZ +mI +eX +od +eX +pz +oL +pZ +qZ +rA +si +iH +dM +tG +uf +uG +Nj +vW +uf +aa +aa +bT +bT +zi +zL +bT +bT +aa +aa +aa +aa +bS +bS +XJ +bS +aa +aa +aa +aa +aa +aa +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ay +bv +bo +am +RQ +dM +ev +eY +fK +gl +dM +hP +UW +js +kd +zM +dM +ma +mJ +nv +oe +oN +pA +qa +QX +ra +rA +sj +iH +dM +tH +uf +uH +JC +vX +uf +aa +aa +bT +bS +bS +bS +bS +bT +aa +aa +aa +aa +bS +DG +XN +DG +bS +aa +aa +aa +aa +aa +aa +bT +aa +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ay +ay +bZ +cH +tz +dM +ew +eZ +dM +dM +dM +dM +ZB +dM +dM +lz +dM +dM +dM +dM +dM +dM +dM +dM +dM +dM +dM +se +iH +dM +dM +ug +uf +Lp +uf +uf +bT +wY +wY +yD +yD +yD +yD +wY +wY +aa +aa +aa +bS +DG +PY +DG +bS +aa +aa +aa +aa +aa +aa +bT +bT +rW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +az +bu +ca +am +RQ +RQ +ex +fa +dM +Sz +OJ +Vw +Yx +jt +dM +LR +Td +Td +Lk +Td +Lk +Td +Lk +AN +Td +Td +YO +Lk +Lk +Lk +Ig +Tr +Yw +US +vY +wv +wY +wY +RD +Ry +Av +Av +Cb +AX +wY +wY +wY +wY +yD +DG +Tw +DG +Fb +bT +bT +bT +bT +bT +bT +Hi +Hh +qV +bT +Hu +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +am +am +am +am +bw +RQ +RQ +RQ +dM +gn +gY +SQ +iH +ju +dM +Jz +ha +ha +ha +ha +ha +ha +ha +ha +ha +ha +lz +ha +ha +Rt +ha +ug +uJ +OG +Ot +WZ +AH +qt +BK +wx +zk +wx +Ma +Av +Av +Av +Ka +Cb +wY +DH +PY +QC +Fb +aa +aa +bT +aa +aa +aa +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 +"} +(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 +RQ +RQ +RQ +RQ +RQ +RQ +bw +RQ +dM +ML +OJ +UI +iI +jv +dM +XM +ha +mb +mL +Wx +of +oO +pB +mb +ha +rb +tx +ha +sK +LU +tJ +ui +uK +Vb +uK +wv +xa +me +xY +wx +zl +wx +ND +wx +Bz +Bz +wx +vy +PV +YZ +Em +Vz +Fb +aa +aa +bT +aa +aa +aa +bT +aa +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 +"} +(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 +bw +cb +bv +dp +dN +bw +RQ +dM +dM +dM +eX +eX +jw +dM +Jz +ha +mc +mM +PG +og +oP +pC +qc +ha +eX +tx +ha +sL +Tm +tK +uj +uL +Xk +wa +wx +wx +xr +wx +wx +wx +wx +LG +wx +wx +wx +wx +Zu +wY +Uk +XY +LE +Fb +aa +aa +bT +aa +aa +aa +bT +aa +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 +"} +(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 +am +am +am +am +am +am +am +tb +am +gp +dM +hT +eX +jx +dM +eI +ha +md +YJ +QJ +oh +oQ +pD +qd +ha +eX +tx +ha +sM +Zx +tL +uk +uM +OG +Yq +ZL +PK +WQ +ZI +yF +zm +UA +MX +AY +BA +BT +wx +Zu +wY +wY +wY +wY +Fb +aa +aa +bT +aa +aa +aa +bT +aa +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 +"} +(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 +UX +aL +cc +cI +dq +dO +am +RQ +fL +gq +dM +eX +eV +dM +dM +Lx +NB +YV +Ko +nz +oi +oR +pE +qe +ha +px +tx +ha +ha +ha +ha +ha +uN +Kh +wc +wz +xc +xt +ya +yF +zn +zN +Ax +AZ +BB +BU +wx +Zu +wY +DK +CQ +wY +bT +aa +aa +bT +aa +aa +aa +bT +aa +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 +"} +(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 +Zl +aL +cd +cJ +dr +dP +am +RQ +am +aA +dM +hU +iJ +dM +BP +YE +ha +mf +mP +nA +oj +oS +pF +qf +ha +eX +xh +VU +fc +eX +tM +ul +uO +Vg +wd +wA +xd +xu +yb +yF +zo +zN +Ay +Ba +BC +BV +wx +hV +wJ +DL +Eo +wY +bT +aa +aa +bT +bS +bS +bS +bT +bS +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 +"} +(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 +KQ +bx +ce +dT +ds +dQ +am +RQ +am +am +dM +dM +dM +dM +VS +ha +ha +kX +mQ +nB +ok +oT +mQ +kX +ha +ha +ha +ha +Xf +ha +tN +ha +uP +Vg +wd +wB +xe +xv +yc +yF +zp +zO +Az +Bb +zN +BW +wx +CN +Uu +DM +Ep +wY +bT +aa +aa +Es +Gl +Gl +Gl +Go +Gl +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +Yr +Vn +Yv +id +dt +dR +am +hK +Xi +UY +EE +DF +PN +OH +vA +ha +lt +mg +lw +nC +ol +oU +pG +qg +lB +rc +rE +sl +Pz +Ox +tO +rc +uQ +Wp +we +wB +xf +xw +yd +yF +zq +zP +Az +Bc +zN +BX +wx +CO +Zu +wY +wY +wY +Es +Es +Es +Es +Gm +GB +GB +Go +Hv +Gl +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 +"} +(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 +aF +aL +WP +LO +du +du +am +Ve +aA +fR +ha +ha +UU +ha +ha +ha +lu +mh +mR +nD +nD +oV +pH +qh +qy +rc +rF +sm +sQ +tq +tP +rc +uQ +Vg +wf +wz +wz +wz +wz +yF +yF +yF +AA +zN +BD +BY +wx +wx +Zu +wY +Eq +EH +Fc +Fr +FK +Es +Gn +GC +Gn +Go +Hw +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HR +Nu +Nu +Nu +HR +HR +Nu +Nu +IO +Nu +Nu +HR +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 +aG +aL +aF +Vt +WP +XO +am +Qk +fN +fR +PI +Xn +JL +TH +kh +kX +lv +mi +mS +nE +nE +oW +ml +mT +qz +rd +rG +sn +sR +sn +tQ +rd +uR +Vg +wg +wC +xg +xx +ye +Sp +zr +zQ +AB +Bd +BD +BZ +wx +CP +NZ +DN +Er +EI +Fd +Fs +FL +Es +Go +GD +GD +Hj +Hx +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HS +HZ +YH +Il +Ip +HR +Ix +TW +IO +Qf +Jd +HR +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 +aH +aL +ch +cO +dv +Yt +RM +Vx +bw +fR +hc +hX +iN +Xq +ki +kY +lw +mj +mT +nF +om +oX +mi +mV +pG +re +rH +so +sS +so +tR +re +uM +OG +Oi +Uq +Ng +VV +ZO +ZO +zs +yF +yF +yF +yF +yF +wx +CQ +LA +wY +Es +Es +Es +Ft +Es +Es +Gp +GD +GS +GE +Hy +Gl +bS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HT +Ia +Ns +Im +Iq +HR +Iy +Tj +IO +OV +Je +HR +Jr +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 +aI +aL +aL +aL +aL +aL +am +VL +fO +gs +hd +hY +iO +Om +ZR +QM +Oq +mk +mU +nG +on +oY +mi +qi +qA +rd +rI +sp +sT +tr +tS +rd +uM +Vg +wc +wC +xi +xz +yg +yH +zt +zR +AC +Be +BE +Ca +wx +kf +Ww +wY +Et +EJ +Fe +Fu +FM +Es +Gq +GE +GT +GE +Hz +Gl +bS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HU +Ia +QI +In +Ir +HR +Nu +JF +IO +UL +Nu +HR +HR +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 +aJ +aL +ci +cP +dw +aL +bw +VL +fP +fR +he +Vh +iP +jC +kk +kY +VW +ml +mT +nH +oo +QS +mi +mS +qB +re +rJ +sq +sU +ts +tT +um +uM +MK +wd +wE +wE +xA +yh +yI +wE +zR +AD +Bf +Xz +Ow +WC +NX +Dp +wY +Eu +EK +Ff +Fv +FN +Es +Gr +GF +GU +GE +HA +Gl +bS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HV +Ib +Lr +In +Is +HR +Iz +Ky +IP +Ky +Jf +Jl +Nu +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 +aK +bz +cj +cQ +dx +aL +ez +DQ +fQ +fR +hf +ia +iQ +jD +kl +kX +OU +mi +mV +nI +nI +NW +mj +mT +qz +rd +rK +sr +sV +tt +tU +rd +OF +Vg +wd +wF +wE +xB +yi +yJ +wE +zS +AE +Bg +Lw +Cc +wx +sA +cg +SH +TC +Yd +Rp +LY +WO +Es +Go +GG +Go +Hk +HB +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +Ri +Ol +Yp +Yp +PL +VK +Kj +Pn +QL +Mf +OP +JA +QT +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 +aL +aL +ck +cR +dy +aL +am +ZG +fR +fR +fS +gv +iR +gv +fS +kX +lA +mm +mW +nJ +nJ +Qw +pI +qj +qC +rc +rL +ss +sW +tq +tV +rc +lJ +Vg +wi +wG +wE +xC +yj +yK +wE +zT +AE +Bh +VY +Cd +wx +sA +Dr +wY +Ew +EM +Fh +Fx +RV +Mg +ZH +GF +Go +Hl +HC +HL +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HX +Pf +Ik +Io +Iu +Wd +IB +IK +RW +Ja +Jh +Jn +Nu +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 +aM +aL +aL +aL +aL +dU +eA +JQ +fS +gt +hg +ib +iS +jE +km +kX +lB +mn +mX +nK +op +Ty +pJ +mn +lB +rc +rM +st +sX +tu +tW +rc +uT +Qo +wj +wH +wE +wE +wE +wE +wE +zU +AF +Bi +Xj +Ce +wx +sA +Ds +wY +Ex +Es +Es +Es +FQ +Es +QH +GF +Go +Go +Go +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HR +KV +HR +HR +HR +HR +HR +Nu +Xb +Nu +Nu +HR +HR +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 +aN +bA +aN +cS +dz +aN +eB +Mu +fS +gu +hh +ic +iT +jF +kn +kX +kX +kX +kY +nL +kY +Yn +kY +kX +kX +rc +rc +rd +rd +rd +rc +rc +uU +ME +wk +lb +lb +xD +yk +yL +lb +zR +zR +Bj +zR +wx +wx +sA +Dt +wY +Ey +Es +Fi +Fy +FR +Es +Go +GH +Go +Go +HD +Go +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +IC +IL +So +Jb +Ji +Jo +Nu +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 +TK +WA +TK +TK +TK +OO +VC +UK +fS +fS +WL +ZN +iU +jG +ko +gv +lC +mo +mY +nM +oq +SV +pK +qk +qD +rf +lJ +lJ +lJ +lJ +lJ +un +uV +Tc +wl +wI +xj +xj +yl +xj +zu +zV +AG +Bk +BJ +wx +Cx +sA +Du +wY +wY +EN +Fj +Es +Es +Es +Gu +GI +GV +Hm +FW +EN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +ID +IM +Ts +Sn +OL +Wn +Nu +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 +aP +bC +cl +cT +dA +dW +KF +fl +fT +gv +hj +Ly +Ra +Ra +SY +XR +VG +No +Zt +No +No +Mo +VJ +Tx +Tl +Mj +No +No +No +No +No +QV +No +No +No +Zi +Zt +No +No +No +No +LW +RF +LC +MJ +Zq +Tb +Qa +Dv +DP +wY +EO +Fk +Ll +FS +Gc +FS +GJ +FS +GM +HE +EN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +IE +IN +YR +IL +Jk +Jq +Nu +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 +aQ +aQ +aQ +aQ +aQ +dX +KI +fm +fU +gw +hj +LN +iW +jH +kq +gv +lE +Vg +na +TN +or +SC +pM +qm +qF +rh +rN +su +na +na +na +na +uW +vB +na +na +na +na +ym +na +Vg +zX +na +rN +BL +wx +Cz +Aq +Gs +vf +wY +EP +Fl +Mk +FT +Gd +Gv +GI +GW +Hn +HF +HM +bS +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +HR +HR +Nu +Nu +Nu +Nu +HR +HR +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 +aR +bD +cm +cm +aQ +dY +KF +fm +fV +gv +hk +My +iX +jI +kr +fS +lF +VO +nb +nO +nO +Ut +MB +MB +nO +nO +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +rl +Vg +zX +na +lb +lb +wx +wx +wx +wx +vf +wY +EQ +Fl +RK +FU +Ge +FU +GJ +GW +Ho +HF +HM +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 +"} +(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 +aS +bE +aS +cU +dB +dZ +KF +fn +fW +fW +fW +Lu +fW +fW +fW +lb +lG +Lv +nc +nO +os +Qy +pN +qn +qG +Uh +rl +XB +XB +Xc +sZ +up +uX +vC +sZ +wK +wK +wK +yn +rl +Vg +zX +AI +lb +BM +Cg +CA +CV +wx +HW +Su +NU +Ki +WG +FV +FV +FV +FV +GX +Hp +HG +HM +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 +"} +(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 +aT +bF +cn +cV +dB +dZ +KF +fo +fW +gx +Jt +Tz +iY +jJ +fW +lc +lH +LS +nd +MB +ot +SI +pO +qo +qH +RP +rl +IR +Gb +IR +sZ +mE +mE +IR +XS +mE +mE +cN +cN +JY +PE +zY +AJ +Bm +BN +Ch +CB +CW +NA +rO +wY +ES +Fn +FD +FT +Gd +FT +GK +GW +Ho +HF +HM +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 +"} +(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 +aU +bG +co +cW +dB +dZ +KF +fo +fW +gy +hm +Wu +iZ +jK +ks +ld +lI +WU +ne +MB +Qp +RL +Zw +YG +Xd +Wm +rl +IR +sZ +vK +vK +vK +uY +vD +sZ +wL +mE +xE +yo +rl +na +zZ +AK +lb +XV +Ci +CC +CX +wx +vf +wY +ET +Fn +FD +FU +Ge +FU +GL +GW +Hn +HF +HM +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 +"} +(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 +aV +bH +cm +cX +aQ +ea +KF +fo +fW +gz +hn +Lf +ja +jL +kt +le +lJ +Vg +nf +MB +ov +pl +pQ +qq +XA +rl +rl +RO +rn +rn +rn +rn +rn +vE +sZ +RT +mE +xF +yp +rl +zw +Aa +AL +lb +wx +wx +wx +wx +wx +vf +wY +EU +Fn +FD +FW +Gf +FW +GK +GY +Hq +HH +EN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aV +aV +aV +aV +dC +eb +OZ +fp +fW +fW +fW +Jx +Jx +Jx +fW +lf +lJ +Kh +ng +nO +ow +pm +pR +qr +qK +rl +IR +IR +rn +JO +tX +ur +rn +rn +rn +sZ +XS +sZ +yq +yq +yr +Ab +yr +yr +wx +xs +Qa +Qa +Qa +JT +wY +EN +Fo +FE +EN +EN +Gw +GM +GZ +Hr +HI +EN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aW +bI +cp +cY +ba +dY +KF +fq +fX +gA +ho +Nh +Ml +QD +Wo +Nt +OG +Vg +nh +nO +nO +nO +pS +nO +nO +rl +ly +rn +rn +Rj +tY +tY +uZ +vF +rn +wN +zG +xG +yq +yN +zx +Ac +AM +Bn +wx +LA +wY +wY +wY +DU +wY +EV +Dz +Dy +FX +EN +EN +EN +EN +EN +EN +EN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aX +bJ +cq +cZ +dD +dZ +KF +fr +fY +gB +hp +Pr +jc +jN +kv +lh +lL +mw +ni +nQ +Nk +Kp +MW +PQ +Bl +IR +IR +RH +Zj +ON +sy +sy +va +vG +rn +wN +mE +xF +yq +yO +zy +SK +Nz +NP +OY +vS +wY +CY +Dx +DV +EA +EW +Dz +Dy +EY +Gg +Gx +GN +Ha +Hs +HJ +HN +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +aY +aY +aY +da +dE +dZ +Vu +fr +fZ +gC +hq +Zd +jd +jO +kw +kB +lM +kz +nj +kB +kB +kB +kB +kB +IH +rn +rn +rn +XD +sz +sz +sz +sz +vH +rn +wO +mE +xH +yq +yP +zz +ZU +AO +Bp +wx +cz +wY +CZ +Dy +DW +Dy +Dy +Dz +Dy +Dy +Dy +Dy +GO +Hb +Gk +Gk +Gk +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 +"} +(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 +aZ +bK +cr +cY +ba +ec +KI +Ym +Qv +Zv +JP +WJ +je +jP +kx +li +lN +mx +nk +nR +oy +po +KG +kB +IH +rn +rP +sy +tc +sz +tZ +sz +sz +vI +rn +wP +Ul +xH +yq +yQ +yQ +JZ +AP +Bq +wx +Ek +wY +Da +Dz +DX +Dz +Dz +Dz +FF +FY +Dy +Gy +GP +Hc +Hs +Hb +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ba +bL +bL +bL +ba +ed +KF +ft +fZ +gE +OM +iq +jf +jQ +ky +lj +lO +my +my +my +oz +pp +Yf +QP +Rh +rn +rQ +sz +sz +sz +ua +sz +sz +vJ +rn +vE +cN +xH +yq +Vs +Kr +Zs +zB +Br +wx +NQ +wY +Db +Oy +Qh +Dy +Dy +Dy +FG +Dy +Gh +Gy +GQ +Hb +Gk +Gk +Gk +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 +"} +(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 +Vm +Tp +WD +Zy +Lg +dX +KF +ft +fZ +gC +Qb +ir +jg +jR +kz +lk +lP +mz +nl +nS +oA +pq +pW +kB +SR +rn +rR +La +La +La +LJ +Vk +Vk +Zb +rn +XB +cN +xI +yq +yS +zB +Ah +zB +Bs +wx +nt +wY +Dc +DB +JM +Dy +EX +EX +FH +EX +EX +Gy +GQ +Hb +Gk +bS +HP +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +bc +Kw +ct +dc +dG +dX +KF +ft +gb +gF +Pd +is +jh +jS +kA +ll +lQ +mA +nm +mA +oB +pr +pX +kB +Op +rn +Te +La +td +tA +uc +uc +vb +SJ +YN +cN +cN +mE +yq +yT +zC +Ai +zB +Bt +wx +Gs +wY +Dd +Dz +TU +EB +Db +Fp +Db +FZ +Db +Gz +GQ +Hd +Gk +bS +HP +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +XK +ZK +cu +dd +dH +ee +Ju +fu +fZ +gF +Ws +it +it +jT +ky +lm +lR +mB +nn +kB +oC +ps +oC +kB +IH +rn +rT +Lt +te +tB +rn +tf +tf +rn +rn +vM +vM +YK +yr +yr +zD +Aj +zB +Bu +wx +Dn +wY +De +Dz +Xu +Dy +EY +EY +FI +EY +EY +Gy +GQ +Hb +Gk +bS +HP +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +be +Xl +cv +de +dI +ef +Me +fv +gc +gG +gB +iu +iu +gC +kB +ky +kB +ky +kB +kB +oD +pt +pt +kB +ST +ro +rn +Mv +tf +tC +ro +ut +vc +vM +wo +wo +vM +Nd +ys +yr +yr +yr +AQ +yr +wx +Np +CE +Db +DC +Xu +Dy +Dy +Dy +FG +Dy +Dy +Gy +GQ +Hb +Gk +Gk +Gk +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 +"} +(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 +bf +ZK +cw +df +Lg +eg +SX +fw +gd +gH +hw +hw +hw +hw +kC +ln +ln +ln +no +nU +oE +oE +oE +qu +XQ +rp +rU +WH +tg +tD +ud +uu +vd +vN +uu +uu +xm +Ss +yt +yU +ln +ln +ln +Bv +BQ +TB +CF +Df +Dz +Ok +Dz +EZ +Dz +Dz +Dz +Gi +Gy +GR +He +Ht +Hb +HO +HQ +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +ZK +ZK +PM +QW +Lg +eh +Ub +TX +KF +MP +Ta +Ta +RB +Wl +Ta +Ta +Ta +Nl +Ta +Ta +Un +Ta +Ta +Ta +Wl +Ni +Ta +Ta +Ta +Ta +Ta +RB +OE +Ta +Ta +Ta +Ta +Un +Ta +OC +Ta +Ta +Ta +Ta +Ta +Ta +Os +Ph +Xu +SP +Xr +Xu +Xu +Ok +Dy +Dy +Dy +GQ +Hf +Gk +Gk +Gk +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 +"} +(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 +bh +Tp +cy +dh +Lg +ei +Lh +fy +ge +gJ +hy +iv +jj +jj +kD +jj +jj +nT +np +nV +jj +pu +pu +pu +Qr +rr +rV +sE +th +tE +ue +uv +Oj +uv +wp +pu +pu +xM +uv +yW +uv +uv +th +uv +uv +sE +CH +Dh +DE +VZ +ED +Dy +EX +Ok +Ga +Gj +GA +GQ +Hg +Hs +HK +HO +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +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 +bi +Sq +ct +di +dI +ej +Yy +fz +gf +gK +hz +iw +jk +jV +kE +kE +kE +Ro +kE +kE +oG +pv +pY +pY +qT +qT +qT +qT +qT +qT +qT +uw +Yg +vO +wq +wR +pY +xN +xN +xN +xN +xN +xN +Bw +BR +BR +CI +BR +BR +Ku +BR +Fa +JK +Km +Db +Gk +Db +Gk +Db +Gk +Gk +Gk +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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} +(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 +"} diff --git a/_maps/map_files/Theseus/medbay_vendor_concept.dmm b/_maps/map_files/Theseus/medbay_vendor_concept.dmm new file mode 100644 index 000000000000..62fc57c621ce --- /dev/null +++ b/_maps/map_files/Theseus/medbay_vendor_concept.dmm @@ -0,0 +1,455 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/space/basic, +/area/space) +"b" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"e" = ( +/obj/machinery/button/door/directional/west{ + name = "Commissary Shutter Control"; + id = "commissaryshutter"; + pixel_x = 0; + pixel_y = 24 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"f" = ( +/obj/machinery/navbeacon{ + location = "8-Central-to-Aft"; + codes_txt = "patrol;next_patrol=8.1-Aft-to-Escape" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"g" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/iron, +/area/space) +"h" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/holopad, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/space) +"i" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"j" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Vacant Commissary Shutter"; + id = "commissaryshutter" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/noticeboard/directional/east, +/turf/open/floor/iron, +/area/space) +"k" = ( +/turf/closed/wall/prepainted/medical, +/area/space) +"m" = ( +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron, +/area/space) +"n" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -2; + pixel_y = 4 + }, +/obj/item/pen, +/obj/machinery/newscaster/directional/south, +/turf/open/floor/iron, +/area/space) +"o" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"p" = ( +/obj/structure/rack, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/directional/east{ + c_tag = "Vacant Commissary" + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/space) +"q" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/machinery/button/door/directional/west{ + name = "Commissary Shutter Control"; + id = "commissaryshutter" + }, +/turf/open/floor/iron, +/area/space) +"r" = ( +/turf/closed/wall/prepainted/daedalus, +/area/space) +"t" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/space) +"u" = ( +/obj/machinery/door/airlock{ + name = "Commissary"; + id_tag = "commissarydoor" + }, +/turf/open/floor/iron, +/area/space) +"v" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/space) +"x" = ( +/obj/structure/closet/secure_closet/personal, +/obj/effect/spawner/random/bureaucracy/briefcase, +/obj/machinery/light/cold/directional/east, +/turf/open/floor/iron, +/area/space) +"y" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"B" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/space) +"C" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/item/radio/intercom/directional/east{ + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/space) +"D" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron, +/area/space) +"E" = ( +/obj/structure/noticeboard/directional/north, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"F" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/south{ + c_tag = "Central Primary Hallway - Aft-Starboard" + }, +/turf/open/floor/iron, +/area/space) +"G" = ( +/obj/machinery/navbeacon{ + location = "10.1-Central-from-Aft"; + codes_txt = "patrol;next_patrol=10.2-Aft-Port-Corner" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"H" = ( +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/space) +"I" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"K" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"L" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/space) +"M" = ( +/obj/item/storage/secure/safe/directional/south, +/turf/open/floor/plating, +/area/space) +"N" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/iron, +/area/space) +"O" = ( +/obj/structure/cable/yellow{ + icon_state = "68" + }, +/turf/open/floor/plating, +/area/space) +"Q" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "33" + }, +/turf/open/floor/plating, +/area/space) +"R" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"S" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + name = "Vacant Commissary Shutter"; + id = "commissaryshutter" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"T" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"V" = ( +/obj/machinery/button/door/directional/east{ + name = "Commissary Door Lock"; + id = "commissarydoor"; + specialfunctions = 4; + normaldoorcontrol = 1 + }, +/turf/open/floor/plating, +/area/space) +"Y" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Z" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/table, +/obj/item/stack/sheet/iron/five, +/obj/item/stack/cable_coil/five, +/turf/open/floor/iron, +/area/space) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +E +i +Y +k +k +k +k +k +k +"} +(3,1,1) = {" +a +y +G +Y +u +V +N +v +q +r +"} +(4,1,1) = {" +a +g +i +Y +r +r +e +I +Z +r +"} +(5,1,1) = {" +a +y +f +T +K +S +Q +h +n +r +"} +(6,1,1) = {" +a +L +i +B +H +j +m +O +M +r +"} +(7,1,1) = {" +a +R +o +F +D +r +x +C +p +r +"} +(8,1,1) = {" +a +b +i +t +r +r +r +r +r +r +"} +(9,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/debug/atmos_mintest.dmm b/_maps/map_files/debug/atmos_mintest.dmm index 6340a538113b..58e6b380df50 100644 --- a/_maps/map_files/debug/atmos_mintest.dmm +++ b/_maps/map_files/debug/atmos_mintest.dmm @@ -49,7 +49,7 @@ /area/station/hallway/primary/central) "al" = ( /obj/machinery/power/rtg/debug, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -73,7 +73,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "ap" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "aq" = ( @@ -113,7 +113,7 @@ /area/station/hallway/primary/central) "ay" = ( /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "az" = ( @@ -171,7 +171,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "aI" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/floor/has_bulb, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -192,7 +192,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "aN" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/rtg/debug, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -206,7 +206,7 @@ /area/station/hallway/primary/central) "aT" = ( /obj/machinery/gravity_generator/main, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "aU" = ( @@ -270,7 +270,6 @@ /obj/item/pipe_dispenser, /obj/structure/table/reinforced, /obj/item/debug/omnitool, -/obj/item/door_remote/omni, /turf/open/floor/iron, /area/station/hallway/primary/central) "be" = ( @@ -424,17 +423,17 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "bA" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/arrows, /obj/machinery/light/floor/has_bulb, /turf/open/floor/iron, /area/station/hallway/primary/central) "bB" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/hallway/primary/central) "bC" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/arrows{ icon_state = "arrows"; dir = 4 @@ -462,7 +461,6 @@ "bH" = ( /obj/structure/table/reinforced, /obj/item/debug/omnitool, -/obj/item/door_remote/omni, /turf/open/floor/iron, /area/station/hallway/primary/central) "bI" = ( @@ -541,14 +539,14 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "bY" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/public/glass{ name = "Power" }, /turf/open/floor/iron, /area/station/hallway/primary/central) "bZ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/public/glass{ name = "Main Floor" }, @@ -556,7 +554,7 @@ /area/station/hallway/primary/central) "ca" = ( /obj/machinery/light/floor/has_bulb, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "cb" = ( @@ -717,7 +715,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "cz" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/public/glass{ name = "Gravgen" }, @@ -825,12 +823,12 @@ icon_state = "circ-off-0"; dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "cQ" = ( /obj/machinery/power/generator, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "cR" = ( @@ -838,7 +836,7 @@ icon_state = "circ-off-0"; dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "cS" = ( diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm index 06f4baeaefdf..b1546652aa7a 100644 --- a/_maps/map_files/debug/multiz.dmm +++ b/_maps/map_files/debug/multiz.dmm @@ -3,16 +3,16 @@ /turf/open/space/basic, /area/space) "ab" = ( -/obj/structure/lattice, -/turf/open/space/basic, +/obj/structure/lattice/catwalk, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/space, /area/space/nearstation) "ad" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/bridge) "ae" = ( /obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, +/turf/open/space, /area/space/nearstation) "af" = ( /turf/open/floor/plating, @@ -22,7 +22,7 @@ /area/station/engineering/atmos) "ai" = ( /obj/machinery/power/rtg/advanced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/space/nearstation) "aj" = ( @@ -44,14 +44,13 @@ /turf/open/floor/plating, /area/station/engineering/atmos) "an" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/openspace, /area/space/nearstation) "ao" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/space/nearstation) +/turf/open/space, +/area/space) "ap" = ( /obj/machinery/airalarm/directional/north{ locked = 0; @@ -62,7 +61,7 @@ /area/station/engineering/main) "aq" = ( /obj/machinery/computer/monitor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "ar" = ( @@ -80,7 +79,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "at" = ( @@ -101,7 +100,7 @@ /area/station/engineering/atmos) "aD" = ( /obj/structure/fans/tiny, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "aG" = ( @@ -109,7 +108,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "aI" = ( @@ -165,14 +164,14 @@ /turf/open/floor/plating, /area/station/engineering/main) "aU" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "aV" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/gravity_generator) "aW" = ( @@ -214,7 +213,7 @@ "bd" = ( /obj/structure/table, /obj/item/weldingtool/experimental, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/engineering/main) @@ -226,7 +225,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/engineering/gravity_generator) @@ -247,7 +246,7 @@ /obj/structure/table, /obj/item/analyzer, /obj/item/wrench, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/station/engineering/atmos) @@ -255,7 +254,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/atmos) "bl" = ( @@ -308,7 +307,7 @@ "bt" = ( /obj/machinery/door/airlock, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/atmos) "bu" = ( @@ -324,7 +323,7 @@ /area/station/engineering/main) "bx" = ( /obj/machinery/door/airlock, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/main) "by" = ( @@ -343,7 +342,7 @@ pixel_y = 23 }, /obj/structure/closet/jcloset, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central) @@ -357,7 +356,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "bE" = ( @@ -373,7 +372,7 @@ pixel_y = 23 }, /obj/structure/closet/secure_closet/captains, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron{ dir = 8 @@ -404,7 +403,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "bO" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "bP" = ( @@ -429,7 +428,7 @@ pixel_y = 23 }, /obj/structure/closet/firecloset/full, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron{ dir = 9 @@ -463,17 +462,17 @@ /turf/open/floor/plating, /area/station/hallway/primary/central) "ce" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron{ dir = 8 }, /area/station/command/bridge) "cf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/command/bridge) "cl" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron{ dir = 8 }, @@ -510,12 +509,12 @@ /area/station/command/bridge) "cw" = ( /obj/machinery/door/airlock, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/command/bridge) "cx" = ( /obj/machinery/door/airlock/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/secondary/entry) "cy" = ( @@ -531,7 +530,7 @@ /area/station/hallway/primary/central) "cB" = ( /obj/machinery/light/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -541,7 +540,7 @@ /area/station/hallway/primary/central) "cC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron{ dir = 1 }, @@ -550,7 +549,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron{ dir = 1 }, @@ -560,14 +559,14 @@ dir = 4 }, /obj/machinery/light/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron{ dir = 1 }, /area/station/hallway/primary/central) "cF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "cG" = ( @@ -649,7 +648,7 @@ "cW" = ( /obj/effect/landmark/blobstart, /obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/construction) "cX" = ( @@ -657,7 +656,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/construction) "cY" = ( @@ -679,7 +678,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron, /area/station/commons/storage/primary) @@ -687,7 +686,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/commons/storage/primary) "dc" = ( @@ -855,7 +854,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "eb" = ( @@ -909,10 +908,8 @@ /area/station/hallway/secondary/service) "ey" = ( /obj/structure/ladder, -/obj/effect/turf_decal/stripes/asteroid/corner{ - dir = 8 - }, -/turf/open/floor/iron, +/obj/structure/lattice, +/turf/open/openspace, /area/station/hallway/secondary/service) "ez" = ( /obj/machinery/light/directional/west, @@ -989,7 +986,8 @@ /area/station/engineering/storage) "eV" = ( /obj/structure/ladder, -/turf/open/floor/iron, +/obj/structure/lattice, +/turf/open/openspace, /area/station/engineering/storage) "eX" = ( /obj/effect/turf_decal/stripes/white/line{ @@ -1038,7 +1036,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "hi" = ( @@ -1071,7 +1069,7 @@ /turf/open/floor/iron, /area/station/construction) "iq" = ( -/obj/structure/cable/multilayer/multiz, +/obj/structure/cable/multiz, /turf/open/floor/plating, /area/station/construction) "iu" = ( @@ -1131,7 +1129,7 @@ /area/station/hallway/secondary/service) "lm" = ( /obj/machinery/light/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/commons/storage/primary) "lu" = ( @@ -1148,7 +1146,7 @@ /turf/open/floor/plating, /area/station/commons/storage/primary) "mb" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/storage) "mG" = ( @@ -1168,7 +1166,7 @@ /turf/open/floor/iron, /area/station/engineering/storage) "nF" = ( -/obj/structure/cable/multilayer/multiz, +/obj/structure/cable/multiz, /turf/open/floor/plating, /area/station/hallway/secondary/service) "nS" = ( @@ -1207,8 +1205,10 @@ /turf/open/floor/glass, /area/station/hallway/secondary/service) "pV" = ( -/turf/open/openspace/airless, -/area/space) +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) "qo" = ( /turf/open/openspace, /area/station/engineering/storage) @@ -1238,7 +1238,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/primary/central) "sh" = ( @@ -1273,11 +1273,11 @@ /area/station/engineering/storage) "ty" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/construction) "uv" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -1308,7 +1308,7 @@ /area/station/construction) "vT" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/construction) "xr" = ( @@ -1341,12 +1341,12 @@ /turf/open/openspace, /area/station/engineering/storage) "yl" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "yt" = ( /obj/machinery/door/airlock/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/construction) "yR" = ( @@ -1412,9 +1412,8 @@ /turf/open/floor/iron, /area/station/construction) "Bk" = ( -/obj/structure/grille, -/turf/open/openspace/airless, -/area/space/nearstation) +/turf/open/space/openspace, +/area/space) "Bm" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -1425,7 +1424,7 @@ /area/station/commons/storage/primary) "BM" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/construction) "CA" = ( @@ -1433,7 +1432,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "CK" = ( @@ -1491,7 +1490,7 @@ /turf/open/floor/plating, /area/station/hallway/secondary/service) "Fs" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/construction) "FL" = ( @@ -1516,7 +1515,7 @@ /turf/open/floor/plating, /area/station/construction) "Hp" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/commons/storage/primary) "Ht" = ( @@ -1545,7 +1544,7 @@ /turf/open/floor/iron, /area/station/engineering/storage) "Jg" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/hallway/secondary/service) "Jt" = ( @@ -1554,6 +1553,10 @@ }, /turf/open/floor/iron, /area/station/engineering/storage) +"Jw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) "JH" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ @@ -1606,9 +1609,8 @@ /turf/open/floor/plating, /area/station/maintenance/department/bridge) "Ob" = ( -/obj/structure/lattice, /obj/structure/grille, -/turf/open/openspace/airless, +/turf/open/space/openspace, /area/space/nearstation) "Og" = ( /obj/machinery/airalarm/directional/north, @@ -1644,7 +1646,7 @@ /area/station/engineering/storage) "RQ" = ( /obj/machinery/door/airlock/glass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/commons/storage/primary) "St" = ( @@ -1652,7 +1654,6 @@ dir = 1 }, /obj/structure/table, -/obj/item/construction/plumbing, /turf/open/floor/iron, /area/station/construction) "SN" = ( @@ -1681,7 +1682,7 @@ /area/station/engineering/storage) "UA" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/engineering/storage) "UH" = ( @@ -1689,7 +1690,7 @@ /turf/open/floor/plating, /area/station/engineering/storage) "Vm" = ( -/obj/structure/cable/multilayer/multiz, +/obj/structure/cable/multiz, /turf/open/floor/plating, /area/station/engineering/storage) "Vn" = ( @@ -1718,7 +1719,7 @@ /area/station/hallway/secondary/service) "XQ" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/station/hallway/secondary/service) "Zc" = ( @@ -1752,8427 +1753,196608 @@ (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 +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} (2,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(3,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(4,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(5,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao 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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} (7,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(8,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(9,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(10,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao 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 -"} -(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 -"} -(9,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(10,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(11,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bY -bY -bY -bY -bY -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} (12,1,1) = {" aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -af -af -af -af -af -af -af -bz -af -af -af -af -af -bz -af -af -af -af -af -bz -af -af -af -af -af -af -af -bz -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(13,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ah -ah -ah -ah -ah -ah -ah -bA -bZ -bZ -bZ -bZ -bZ -bA -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(14,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ah -al -aw -aM -aZ -bj -bA -bB -bE -bE -bE -bE -bE -bE -cN -cW -dm -dy -dy -dy -dy -dy -dy -dy -dy -dm -dM -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(15,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -Dm -ah -am -aw -aw -ba -bk -bt -rN -bN -bN -bN -bC -bN -bN -cP -cX -dn -dn -ZH -FY -zZ -dn -dn -cR -cR -cR -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(16,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ah -am -aw -aN -bb -bl -ah -bD -bO -bO -bO -gY -bO -bO -yt -vT -dn -dn -dn -dn -dn -dn -dn -cR -dn -cR -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(17,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ah -am -aw -aO -bc -bm -ah -bE -bE -bE -bE -gY -bE -bE -cQ -cY -dn -cN -BM -dn -dn -dn -dn -cR -hi -cR -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(18,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ah -am -bl -aP -aP -bn -ah -bF -bE -co -bE -gY -bE -bE -cN -cY -dn -dn -Fs -dn -dn -dn -dn -cR -FL -cR -dL -cN -ME -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(19,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -ad -ah -ah -ah -ah -ah -ah -bu -bu -bv -bu -bu -cB -bO -bO -ty -vT -Fs -Fs -iq -dn -dn -dn -dn -dn -gK -dn -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(20,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -ab -ab -ab -ab -ab -ab -ab -bu -bG -ce -cp -cv -cC -bE -bE -cR -cY -dn -cN -jT -dn -dn -dn -dn -Zv -In -jD -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(21,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -ab -ai -an -ai -an -ai -ab -bv -bI -cf -eb -bv -uv -bN -bN -zC -hm -EF -VB -Hk -dn -dn -dn -dn -dn -sm -Tf -dL -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(22,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -ab -ai ao ao ao -ai -ab -bv -bI -cf -eb -bu -cD -bE -bE -cN -cY -dn -dn -dn -dn -dn -dn -dn -qx -CP -Pm -ij -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(23,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -ab -ab -ab ao -ab -ab -ab -bv -bJ -cf -cf -cw -cD -bE -bE -cQ -cY -dn -dn -dn -dn -dn -dn -dn -dn -dn -dn -St -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(24,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -aa -aa -ab ao -ab -aa -aa -bv -bK -eb -eb -bu -cD -bE -bE -cQ -cY -dn -dn -dn -dn -dn -dn -dn -dn -dn -dn -xr -cN -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(25,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -aa -aa -aj -dZ -aj -aa -aa -bv -bI -eb -eb -bv -cD -Au -bE -cN -cZ -do -dz -dz -dz -dz -dz -dz -dz -dz -AI -vF -cN -ME -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(26,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ae -aa -aa -aj -aD -aj -aa -aa -bu -bM -ec -cr -bu -cD -bE -bE -cS -cS -cS -dJ -dJ -dJ -dJ -dJ -dJ -dJ -dJ -cS -cS -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(27,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -ad -aj -aj -CA -aj -aj -aj -bu -bu -bv -bu -bu -cE -bE -bE -cS -da -on -dA -dl -dl -dl -dl -dl -dl -dl -dp -dl -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(28,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -aj -ap -yl -aS -bd -bo -bw -bN -bN -ct -bN -cF -bN -bN -cU -db -dJ -dB -dl -dl -dl -dl -dl -dl -dl -dl -dl -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(29,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -aj -aq -yl -yl -yl -yl -bx -bO -bO -bO -bO -gY -bE -bE -cS -Hp -dJ -dB -dl -dD -dc -dc -dA -dl -dD -dc -dc -cS -af -ad -aa -ab -aa -aa -aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(13,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(14,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} -(30,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -aj -ar -dW -yl -bf -bp -aj -bP -bE -bE -bO -cA -bE -bE -cS -Hp -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dN -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(31,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -Dm -ak -ak -ak -aU -ak -ak -ak -bQ -bE -bE -bO -cA -bE -bE -cS -lm -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dO -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(32,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -as -aG -aV -bg -bq -ak -bR -bE -bE -bO -gY -bO -bO -RQ -Hp -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dN -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(33,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -at -bh -bh -bh -br -ak -bS -bE -bE -bO -cA -bE -bE -cV -dJ -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dN -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(34,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -aI -aI -dV -aI -aI -ak -WR -bE -co -bO -cA -bE -bE -cV -dJ -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dP -cS -af -ad -aa -ab -aa -aa +(15,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(16,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(17,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} -(35,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -dV -dV -dV -dV -dV -by -by -by -by -cx -cG -by -by -by -de -dJ -dB -dl -dE -dH -dI -dB -dl -dE -dJ -dQ -cS -ME -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(36,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -dV -aJ -aK -aL -dV -by -bU -cl -cl -cl -cH -cI -cJ -by -dk -dk -dC -dl -dE -dH -dI -dB -dl -dE -dJ -DU -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(37,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -Dm -ak -dV -aK -dV -bi -dV -by -bV -eo -eo -eo -eo -eo -cK -by -Zk -mG -xK -dl -dF -dk -dk -dC -dl -dF -dk -dk -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(38,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -dV -aL -aK -aJ -dV -by -bW -eo -eo -eo -eo -eo -cL -by -aW -yX -nS -dl -dl -dl -dl -dl -dl -dl -dl -dl -cS -af -ad -aa -ab -aa -aa +(18,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(19,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(20,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} -(39,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -ak -dV -dV -aY -dV -dV -by -bX -eo -eo -cy -eo -eo -cM -by -yR -Bm -lT -dl -dl -dl -dl -dl -dl -dl -dx -dl -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(40,1,1) = {" +(21,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(22,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(23,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(24,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa -ab -aa -ad -af -ak -ak -ak -ak -ak -ak -by -by -cn -by -oh -by -cn -by -by -cS -cS -cS -cS -cS -cS -cS -cS -cS -cS -cS -cS -cS -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(41,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -af -oA -af -af -af -af -oA -af -af -af -by -LW -by -af -af -af -oA -af -af -af -af -oA -af -af -af -af -oA -af -af -af -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(42,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -by -Kd -by -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(43,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -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 -ab -aa -aa -aa -aa -aa -aa -aa -aa -"} -(44,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -ab -aa -aa -aa -aa -aa -aa +"} +(25,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} -(45,1,1) = {" -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +(26,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(27,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(28,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(29,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(30,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(31,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(32,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(33,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(34,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(35,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(36,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(37,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(38,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(39,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(40,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(41,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(42,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao 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 +(43,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(44,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(45,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(46,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa "} (47,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(48,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(49,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao aa +"} +(50,1,1) = {" aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao 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 -"} -(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 -"} -(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 -"} -(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 -"} -(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 +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao 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 -"} - -(1,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(2,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(3,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(4,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(53,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(54,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(55,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(56,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(57,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(58,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(59,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(60,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(61,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(62,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(63,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(64,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(65,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(66,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(67,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(68,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(69,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(70,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(71,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(72,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(73,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(74,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(75,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(76,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(77,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(78,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(79,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(80,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(81,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(82,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(83,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(84,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(85,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(86,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(87,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(88,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(89,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(90,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(91,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(92,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(93,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(94,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(95,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(96,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(97,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(98,1,1) = {" +aa +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +aa +"} +(99,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(100,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(101,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(102,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(103,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(104,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(105,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(106,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(107,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(108,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(109,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(110,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(111,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(112,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +af +af +af +bz +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(113,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ah +ah +ah +ah +ah +ah +ah +bA +bZ +bZ +bZ +bZ +bZ +bA +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(114,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ah +al +aw +aM +aZ +bj +bA +bB +bE +bE +bE +bE +bE +bE +cN +cW +dm +dy +dy +dy +dy +dy +dy +dy +dy +dm +dM +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(115,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +Dm +ah +am +aw +aw +ba +bk +bt +rN +bN +bN +bN +bC +bN +bN +cP +cX +dn +dn +ZH +FY +zZ +dn +dn +cR +cR +cR +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(116,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ah +am +aw +aN +bb +bl +ah +bD +bO +bO +bO +gY +bO +bO +yt +vT +dn +dn +dn +dn +dn +dn +dn +cR +dn +cR +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(117,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ah +am +aw +aO +bc +bm +ah +bE +bE +bE +bE +gY +bE +bE +cQ +cY +dn +cN +BM +dn +dn +dn +dn +cR +hi +cR +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(118,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ah +am +bl +aP +aP +bn +ah +bF +bE +co +bE +gY +bE +bE +cN +cY +dn +dn +Fs +dn +dn +dn +dn +cR +FL +cR +dL +cN +ME +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(119,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +ad +ah +ah +ah +ah +ah +ah +bu +bu +bv +bu +bu +cB +bO +bO +ty +vT +Fs +Fs +iq +dn +dn +dn +dn +dn +gK +dn +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(120,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ae +ae +ae +ae +ae +ae +ae +bu +bG +ce +cp +cv +cC +bE +bE +cR +cY +dn +cN +jT +dn +dn +dn +dn +Zv +In +jD +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(121,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ae +ai +Jw +ai +Jw +ai +ae +bv +bI +cf +eb +bv +uv +bN +bN +zC +hm +EF +VB +Hk +dn +dn +dn +dn +dn +sm +Tf +dL +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(122,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ae +ai +ab +ab +ab +ai +ae +bv +bI +cf +eb +bu +cD +bE +bE +cN +cY +dn +dn +dn +dn +dn +dn +dn +qx +CP +Pm +ij +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(123,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ae +ae +ae +ab +ae +ae +ae +bv +bJ +cf +cf +cw +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +St +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(124,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ao +ao +ae +ab +ae +ao +ao +bv +bK +eb +eb +bu +cD +bE +bE +cQ +cY +dn +dn +dn +dn +dn +dn +dn +dn +dn +dn +xr +cN +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(125,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ao +ao +aj +dZ +aj +ao +ao +bv +bI +eb +eb +bv +cD +Au +bE +cN +cZ +do +dz +dz +dz +dz +dz +dz +dz +dz +AI +vF +cN +ME +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(126,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao pV +ao +ao +aj +aD +aj +ao +ao +bu +bM +ec +cr +bu +cD +bE +bE +cS +cS +cS +dJ +dJ +dJ +dJ +dJ +dJ +dJ +dJ +cS +cS +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(127,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +ad +aj +aj +CA +aj +aj +aj +bu +bu +bv +bu +bu +cE +bE +bE +cS +da +on +dA +dl +dl +dl +dl +dl +dl +dl +dp +dl +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(128,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +aj +ap +yl +aS +bd +bo +bw +bN +bN +ct +bN +cF +bN +bN +cU +db +dJ +dB +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(129,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +aj +aq +yl +yl +yl +yl +bx +bO +bO +bO +bO +gY +bE +bE +cS +Hp +dJ +dB +dl +dD +dc +dc +dA +dl +dD +dc +dc +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(130,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +aj +ar +dW +yl +bf +bp +aj +bP +bE +bE +bO +cA +bE +bE +cS +Hp +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(131,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +Dm +ak +ak +ak +aU +ak +ak +ak +bQ +bE +bE +bO +cA +bE +bE +cS +lm +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dO +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(132,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +as +aG +aV +bg +bq +ak +bR +bE +bE +bO +gY +bO +bO +RQ +Hp +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(133,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +at +bh +bh +bh +br +ak +bS +bE +bE +bO +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dN +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(134,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +aI +aI +dV +aI +aI +ak +WR +bE +co +bO +cA +bE +bE +cV +dJ +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dP +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(135,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +dV +dV +dV +dV +dV +by +by +by +by +cx +cG +by +by +by +de +dJ +dB +dl +dE +dH +dI +dB +dl +dE +dJ +dQ +cS +ME +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(136,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +dV +aJ +aK +aL +dV +by +bU +cl +cl +cl +cH +cI +cJ +by +dk +dk +dC +dl +dE +dH +dI +dB +dl +dE +dJ +DU +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(137,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +Dm +ak +dV +aK +dV +bi +dV +by +bV +eo +eo +eo +eo +eo +cK +by +Zk +mG +xK +dl +dF +dk +dk +dC +dl +dF +dk +dk +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(138,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +dV +aL +aK +aJ +dV +by +bW +eo +eo +eo +eo +eo +cL +by +aW +yX +nS +dl +dl +dl +dl +dl +dl +dl +dl +dl +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(139,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +dV +dV +aY +dV +dV +by +bX +eo +eo +cy +eo +eo +cM +by +yR +Bm +lT +dl +dl +dl +dl +dl +dl +dl +dx +dl +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(140,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +ak +ak +ak +ak +ak +ak +by +by +cn +by +oh +by +cn +by +by +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +cS +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(141,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +af +oA +af +af +af +af +oA +af +af +af +by +LW +by +af +af +af +oA +af +af +af +af +oA +af +af +af +af +oA +af +af +af +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(142,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +by +Kd +by +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(143,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(144,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(145,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(146,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(147,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(148,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(149,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(150,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(151,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(152,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(153,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(154,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(155,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(156,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(157,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(158,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(159,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(160,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(161,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(162,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(163,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(164,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(165,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(166,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(167,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(168,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(169,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(170,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(171,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(172,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(173,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(174,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(175,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(176,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(177,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(178,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(179,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(180,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(181,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(182,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(183,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(184,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(185,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(186,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(187,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(188,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(189,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(190,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(191,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(192,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(193,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(194,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(195,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(196,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(197,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(198,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(199,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(200,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(201,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(202,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(203,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(204,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(205,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(206,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(207,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(208,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(209,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(210,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(211,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(212,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(213,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(214,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(215,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(216,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(217,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(218,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(219,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(220,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(221,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(222,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(223,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(224,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(225,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(226,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(227,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(228,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(229,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(230,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(231,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(232,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(233,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(234,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(235,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(236,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(237,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(238,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(239,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(240,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(241,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(242,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(243,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(244,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(245,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(246,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(247,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(248,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(249,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(250,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(251,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(252,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(253,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(254,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} +(255,1,1) = {" +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +ao +"} + +(1,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(2,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(3,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(4,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(5,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(6,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(7,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(8,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(9,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(10,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(11,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(12,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(13,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(14,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(15,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(16,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(17,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(18,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(19,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(20,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(21,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(22,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(23,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(24,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(25,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(26,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(27,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(28,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(29,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(30,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(31,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(32,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(33,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(34,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(35,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(36,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(37,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(38,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(39,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(40,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(41,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(42,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(43,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(44,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(45,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(46,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(47,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(48,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(49,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(50,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(51,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(52,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(53,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(54,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(55,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(56,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(57,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(58,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(59,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(60,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(61,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(62,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(63,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(64,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(65,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(66,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(67,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(68,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(69,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(70,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(71,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(72,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(73,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(74,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(75,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(76,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(77,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(78,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(79,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(80,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(81,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(82,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(83,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(84,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(85,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(86,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(87,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(88,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(89,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(90,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(91,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(92,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(93,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(94,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(95,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(96,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(97,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(98,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(99,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(100,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(101,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(102,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(103,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(104,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(105,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(106,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(107,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(108,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(109,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(110,1,2) = {" +aa +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(111,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +bY +bY +bY +bY +bY +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(112,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +af +af +af +af +af +af +af +bz +af +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +bz +af +af +af +af +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(113,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +Gb +Gb +Gb +Gb +Gb +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(114,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +Dm +TY +Gb +Gb +eE +Gb +dY +dY +WN +dY +dY +dY +dY +dY +WN +dY +es +eI +eI +kg +eI +eI +eI +eI +kg +eI +eI +eM +TY +ME +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(115,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +Gb +Gb +Gb +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +CK +gW +Qo +Gb +Gb +Gb +Gb +eF +eF +eF +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(116,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +Gb +Gb +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +Gb +Gb +Gb +Gb +Gb +Gb +Gb +eF +iu +eF +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(117,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +Gb +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eu +Gb +TY +XQ +Gb +Gb +Gb +Gb +eF +iu +eF +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(118,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +eN +dY +dY +dY +dY +dY +eu +Gb +Gb +Jg +Gb +Gb +Gb +Gb +eF +eF +eF +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(119,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +ad +TY +eF +ed +ed +eF +TY +TY +TY +eF +TY +TY +mZ +dY +dY +dY +eu +Gb +Gb +nF +Gb +Gb +Gb +Gb +Gb +Gb +Gb +Kw +TY +ME +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(120,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +an +Bk +Bk +Bk +Bk +Bk +Bk +Bk +TY +dY +dY +WN +TY +em +dY +dY +dY +eu +Gb +TY +Fd +Gb +Gb +Gb +Gb +hY +Lu +Gb +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(121,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +eF +dY +dY +dY +eF +sh +dY +dY +dY +eu +Gb +Gb +jb +LE +IC +jL +Gb +XN +iu +Gb +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(122,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +eO +dY +dY +dY +dY +sh +dY +dY +dY +eu +Gb +Gb +Gb +Zc +Gb +Gb +Gb +IL +zd +Gb +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(123,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +eO +dY +dY +pw +pw +dY +dY +dY +dY +eu +Gb +Gb +Gb +Gb +Gb +Gb +Gb +XN +av +Gb +eL +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(124,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +eO +dY +dY +pw +pw +dY +dY +dY +dY +eu +Gb +Gb +Gb +Gb +Gb +Gb +Gb +Ai +su +Gb +Kw +TY +ME +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(125,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +eF +dY +dY +dY +eF +dY +dY +dY +eN +ey +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eJ +eH +lu +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(126,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Ob +Bk +Bk +Bk +Bk +Bk +Bk +Bk +TY +dY +dY +eN +TY +sh +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +TY +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(127,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +ad +TY +eF +eD +eD +eF +TY +TY +TY +eF +TY +TY +sh +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(128,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +WN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +af +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(129,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +TY +ME +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(130,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +eN +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +eF +eF +eF +eF +eF +eF +eF +eF +TY +KM +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(131,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(132,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +Dm +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(133,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(134,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +TY +dY +dY +eN +dY +dY +dY +dY +eN +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(135,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +dY +dY +dY +TY +TY +TY +TY +dY +TY +TY +TY +TY +dY +dY +dY +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(136,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +sh +iK +mZ +xI +TY +ee +iK +ez +iK +iK +iK +en +TY +SN +SN +SN +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(137,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +iK +dY +iK +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +iu +iu +iu +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(138,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +Dm +TY +dY +mZ +iK +sh +dY +TY +sh +dY +dY +dY +dY +dY +dY +TY +iu +iu +iu +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(139,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +dY +dY +eN +dY +dY +TY +sh +dY +dY +iK +dY +dY +dY +TY +iu +Ht +iu +eF +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(140,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +TY +TY +TY +TY +TY +TY +TY +TY +Gb +Gb +Gb +Gb +Gb +TY +TY +TY +TY +TY +TY +iu +iu +iu +iu +iu +iu +iu +iu +iu +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(141,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +af +oA +af +af +af +af +oA +af +af +af +af +af +af +oA +af +af +af +oA +af +oJ +eC +eC +eC +eC +eC +eC +eC +eC +eC +eC +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(142,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +ad +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(143,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(144,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(145,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(146,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(147,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(148,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(149,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(150,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(151,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(152,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(153,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(154,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(155,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(156,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(157,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(158,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(159,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(160,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(161,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(162,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(163,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(164,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(165,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(166,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(167,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(168,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(169,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(170,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(171,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(172,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(173,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(174,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(175,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(176,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(177,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(178,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(179,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(180,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(181,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(182,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(183,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(184,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(185,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(186,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(187,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(188,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(189,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(190,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(191,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(192,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(193,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(194,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(195,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(196,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(197,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(198,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(199,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(200,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(201,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(202,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(203,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(204,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(205,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(206,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(207,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(208,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(209,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(210,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(211,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(212,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(213,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(214,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(215,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(216,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(217,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(218,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(219,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(220,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(221,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(222,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(223,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(224,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(225,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(226,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(227,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(228,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(229,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(230,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(231,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(232,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(233,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(234,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(235,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(236,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(237,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(238,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(239,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(240,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(241,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(242,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(243,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(244,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(245,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(246,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(247,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(248,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(249,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(250,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(251,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(252,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(253,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(254,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(255,1,2) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} + +(1,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(2,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(3,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(4,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(5,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(6,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(7,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(8,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(9,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(10,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(11,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(12,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(13,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(14,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(15,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(16,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(17,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(18,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(19,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(20,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(21,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(22,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(23,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(24,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(25,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(26,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(27,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(28,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(29,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(30,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(31,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(32,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(33,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(34,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(35,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(36,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(37,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(38,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(39,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(40,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(41,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(42,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(43,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(44,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(45,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(46,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(47,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(48,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(49,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(50,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(51,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(52,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(53,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(54,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(55,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(56,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(57,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(58,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(59,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(60,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(61,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(62,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(63,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(64,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(65,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(66,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(67,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(68,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(69,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(70,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(71,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(72,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(73,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(74,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(75,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(76,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(77,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(78,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(79,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(80,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(81,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(82,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(83,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(84,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(85,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(86,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(87,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(88,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(89,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(90,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(91,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(92,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(93,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(94,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(95,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(96,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(97,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(98,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(99,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(100,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(101,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(102,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(103,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(104,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(105,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(106,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(107,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(108,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(109,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(110,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(111,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +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 +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(112,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +rd +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(113,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(114,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(115,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +jV +td +td +td +td +td +td +jA +jA +ZQ +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(116,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +DG +TH +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(117,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +AG +UA +TH +TH +TH +TH +DK +qo +od +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(118,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xB +TH +mb +TH +TH +TH +TH +DK +DK +od +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(119,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +AG +AG +AG +AG +AG +AG +AG +AG +vt +Um +Um +Um +Um +Um +Um +Um +Um +xB +TH +Vm +TH +TH +TH +TH +TH +Pz +Af +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(120,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +DK +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +AG +Og +TH +TH +TH +TH +TH +TH +Af +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(121,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +DK +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +Pz +TH +TH +TH +UH +JH +ho +TH +Af +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(122,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +DK +Jt +dS +dS +dS +dS +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +Pu +TH +eQ +iH +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(123,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +DK +Jt +dS +Kb +Kb +Kb +dS +dS +dS +dS +xB +TH +TH +TH +TH +TH +TH +TH +qo +Eb +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(124,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +ri +ri +DK +Jt +dS +Kb +Kb +Kb +dS +dS +dS +dS +EH +eX +eX +eX +eX +eX +eX +eX +sE +qR +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(125,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +ri +ri +DK +Jt +dS +Kb +Kb +Kb +dS +dS +nz +eV +dS +IN +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(126,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +Bk +Bk +Bk +Bk +Bk +ri +dG +fo +dS +dS +dS +dS +dS +dS +dS +AG +dS +dS +IN +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(127,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +AG +AG +AG +AG +AG +AG +AG +AG +fa +Qw +Qw +Qw +Qw +Qw +Qw +ej +Qw +Qw +Vn +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(128,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(129,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(130,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(131,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(132,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(133,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(134,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(135,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +fp +fp +fp +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(136,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +fp +fp +fp +fp +fp +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(137,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +fp +qo +qo +qo +fp +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(138,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +fp +qo +qo +qo +fp +xO +xO +xO +xO +xO +xO +xO +xO +xO +xO +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(139,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +fp +qo +qo +qo +fp +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(140,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +fp +fp +fp +fp +fp +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(141,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +AG +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +qo +xO +qo +qo +qo +xO +qo +qo +qo +xO +qo +qo +qo +qo +qo +qo +qo +qo +AG +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(142,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +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 +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(143,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(144,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(145,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(146,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(147,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(148,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(149,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(150,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(151,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(152,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(153,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(154,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(155,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(156,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(157,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(158,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(159,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(160,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(5,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(161,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(162,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(6,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(163,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(7,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(164,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(8,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(165,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(9,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(166,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(10,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(167,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(11,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -bY -bY -bY -bY -bY -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(168,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(12,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -af -af -af -af -af -af -af -bz -af -af -af -af -af -bz -af -af -af -af -bz -af -af -af -af -bz -af -af -af -af -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(169,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(13,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -TY -TY -TY -TY -TY -TY -TY -Gb -Gb -Gb -Gb -Gb -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(170,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(14,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -Dm -TY -Gb -Gb -eE -Gb -dY -dY -WN -dY -dY -dY -dY -dY -WN -dY -es -eI -eI -kg -eI -eI -eI -eI -kg -eI -eI -eM -TY -ME -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(171,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(15,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -Gb -Gb -Gb -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eu -CK -gW -Qo -Gb -Gb -Gb -Gb -eF -eF -eF -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(172,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(16,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -Gb -Gb -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eu -Gb -Gb -Gb -Gb -Gb -Gb -Gb -eF -iu -eF -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(173,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(17,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -Gb -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eu -Gb -TY -XQ -Gb -Gb -Gb -Gb -eF -iu -eF -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(174,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(18,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -dY -dY -dY -eN -dY -dY -dY -dY -dY -eu -Gb -Gb -Jg -Gb -Gb -Gb -Gb -eF -eF -eF -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(175,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(19,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -ad -TY -eF -ed -ed -eF -TY -TY -TY -eF -TY -TY -mZ -dY -dY -dY -eu -Gb -Gb -nF -Gb -Gb -Gb -Gb -Gb -Gb -Gb -Kw -TY -ME -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(176,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(20,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -Ob -pV -pV -pV -pV -pV -pV -pV -TY -dY -dY -WN -TY -em -dY -dY -dY -eu -Gb -TY -Fd -Gb -Gb -Gb -Gb -hY -Lu -Gb -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(177,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(21,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(178,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk Bk -pV -pV -pV -pV -pV -pV -pV -eF -dY -dY -dY -eF -sh -dY -dY -dY -eu -Gb -Gb -jb -LE -IC -jL -Gb -XN -iu -Gb -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV "} -(22,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(179,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk Bk -pV -pV -pV -pV -pV -pV -pV -eO -dY -dY -dY -dY -sh -dY -dY -dY -eu -Gb -Gb -Gb -Zc -Gb -Gb -Gb -IL -zd -Gb -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV "} -(23,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(180,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk Bk -pV -pV -pV -pV -pV -pV -pV -eO -dY -dY -pw -pw -dY -dY -dY -dY -eu -Gb -Gb -Gb -Gb -Gb -Gb -Gb -XN -av -Gb -eL -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(24,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV Bk -pV -pV -pV -pV -pV -pV -pV -eO -dY -dY -pw -pw -dY -dY -dY -dY -eu -Gb -Gb -Gb -Gb -Gb -Gb -Gb -Ai -su -Gb -Kw -TY -ME -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(25,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV Bk -pV -pV -pV -pV -pV -pV -pV -eF -dY -dY -dY -eF -dY -dY -dY -eN -ey -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eJ -eH -lu -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(26,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV Bk -pV -pV -pV -pV -pV -pV -pV -TY -dY -dY -eN -TY -sh -dY -dY -TY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -TY -TY -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(27,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -ad -TY -eF -eD -eD -eF -TY -TY -TY -eF -TY -TY -sh -dY -dY -WN -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -WN -dY -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(28,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -dY -dY -dY -WN -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -TY -af -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(29,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -TY -ME -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(30,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -eN -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eF -eF -eF -eF -eF -eF -eF -eF -eF -TY -KM -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -"} -(31,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -TY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV "} -(32,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -Dm -TY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(181,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(33,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -TY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -dY -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(182,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(34,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -TY -dY -dY -eN -dY -dY -dY -dY -eN -dY -dY -dY -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(183,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(35,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -dY -dY -dY -TY -TY -TY -TY -dY -TY -TY -TY -TY -dY -dY -dY -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(184,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(36,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -sh -iK -mZ -xI -TY -ee -iK -ez -iK -iK -iK -en -TY -SN -SN -SN -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(185,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(37,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -iK -dY -iK -dY -TY -sh -dY -dY -dY -dY -dY -dY -TY -iu -iu -iu -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(186,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(38,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -Dm -TY -dY -mZ -iK -sh -dY -TY -sh -dY -dY -dY -dY -dY -dY -TY -iu -iu -iu -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(187,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(39,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -dY -dY -eN -dY -dY -TY -sh -dY -dY -iK -dY -dY -dY -TY -iu -Ht -iu -eF -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(188,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(40,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -TY -TY -TY -TY -TY -TY -TY -TY -Gb -Gb -Gb -Gb -Gb -TY -TY -TY -TY -TY -TY -iu -iu -iu -iu -iu -iu -iu -iu -iu -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(189,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(41,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -af -oA -af -af -af -af -oA -af -af -af -af -af -af -oA -af -af -af -oA -af -oJ -eC -eC -eC -eC -eC -eC -eC -eC -eC -eC -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(190,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(42,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(191,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(192,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(43,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(193,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(44,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(194,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(45,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(195,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(46,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(196,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(47,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(197,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(48,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(198,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(49,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(199,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(50,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(200,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(51,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(201,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(52,1,2) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(202,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} - -(1,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(203,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(2,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(204,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(3,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(205,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(4,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(206,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(5,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(207,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(6,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(208,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(7,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(209,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(8,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(210,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(9,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(211,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(10,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(212,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(11,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -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 -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(213,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(12,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -rd -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(214,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(13,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(215,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(14,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(216,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(15,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -jV -td -td -td -td -td -td -jA -jA -ZQ -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(217,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(16,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xB -DG -TH -TH -TH -TH -TH -DK -qo -od -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(218,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(17,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xB -AG -UA -TH -TH -TH -TH -DK -qo -od -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(219,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(18,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xB -TH -mb -TH -TH -TH -TH -DK -DK -od -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(220,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(19,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -AG -AG -AG -AG -AG -AG -AG -AG -vt -Um -Um -Um -Um -Um -Um -Um -Um -xB -TH -Vm -TH -TH -TH -TH -TH -Pz -Af -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(221,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(20,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -pV -pV -DK -Jt -dS -dS -dS -dS -dS -dS -dS -dS -xB -AG -Og -TH -TH -TH -TH -TH -TH -Af -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(222,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(21,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -pV -pV -DK -Jt -dS -dS -dS -dS -dS -dS -dS -dS -xB -Pz -TH -TH -TH -UH -JH -ho -TH -Af -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(223,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(22,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -pV -pV -DK -Jt -dS -dS -dS -dS -dS -dS -dS -dS -xB -TH -TH -TH -TH -TH -Pu -TH -eQ -iH -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(224,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(23,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -pV -pV -DK -Jt -dS -Kb -Kb -Kb -dS -dS -dS -dS -xB -TH -TH -TH -TH -TH -TH -TH -qo -Eb -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(225,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(24,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -ri -ri -DK -Jt -dS -Kb -Kb -Kb -dS -dS -dS -dS -EH -eX -eX -eX -eX -eX -eX -eX -sE -qR -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(226,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(25,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -ri -ri -DK -Jt -dS -Kb -Kb -Kb -dS -dS -nz -eV -dS -IN -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(227,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(26,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -pV -pV -pV -pV -pV -ri -dG -fo -dS -dS -dS -dS -dS -dS -dS -AG -dS -dS -IN -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(228,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(27,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -AG -AG -AG -AG -AG -AG -AG -AG -fa -Qw -Qw -Qw -Qw -Qw -Qw -ej -Qw -Qw -Vn -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(229,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(28,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(230,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(29,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(231,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(30,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(232,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(31,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(233,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(32,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(234,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(33,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(235,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(34,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(236,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(35,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -fp -fp -fp -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(237,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(36,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -fp -fp -fp -fp -fp -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(238,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(37,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -fp -qo -qo -qo -fp -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(239,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(38,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -fp -qo -qo -qo -fp -xO -xO -xO -xO -xO -xO -xO -xO -xO -xO -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(240,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(39,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -fp -qo -qo -qo -fp -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(241,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(40,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -fp -fp -fp -fp -fp -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(242,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(41,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -AG -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -qo -xO -qo -qo -qo -xO -qo -qo -qo -xO -qo -qo -qo -qo -qo -qo -qo -qo -AG -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(243,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(42,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -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 -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(244,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(43,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(245,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(44,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(246,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(45,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(247,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(46,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(248,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(47,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(249,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(48,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(250,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(49,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(251,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +"} +(252,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(50,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(253,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(51,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(254,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} -(52,1,3) = {" -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV -pV +(255,1,3) = {" +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk +Bk "} diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 20a042a19907..37a155303c70 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -44,23 +44,12 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) -"ao" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space, -/area/space/nearstation) "ap" = ( /obj/structure/closet/secure_closet/engineering_electrical{ locked = 0 }, /turf/open/floor/iron, /area/station/engineering/main) -"aq" = ( -/obj/machinery/camera/directional/north, -/obj/machinery/computer/monitor, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "ar" = ( /obj/machinery/airalarm/unlocked{ dir = 1; @@ -71,30 +60,6 @@ }, /turf/open/floor/iron, /area/station/engineering/main) -"as" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"at" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "au" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/radiation/rad_area{ @@ -111,39 +76,15 @@ "aA" = ( /turf/open/floor/iron, /area/station/engineering/main) -"aC" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/main) "aD" = ( /turf/open/floor/iron, /area/station/security/brig) -"aE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "aF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/iron, /area/station/engineering/main) -"aG" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/closet/radiation, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "aH" = ( /obj/machinery/light/directional/east, /obj/machinery/recharge_station, @@ -159,7 +100,6 @@ /obj/item/rcd_ammo/large, /obj/item/rcd_ammo/large, /obj/item/construction/rcd/combat, -/obj/item/construction/plumbing, /turf/open/floor/iron, /area/station/command/bridge) "aN" = ( @@ -191,36 +131,6 @@ /obj/item/stock_parts/cell/infinite, /turf/open/floor/iron, /area/station/engineering/main) -"aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"aU" = ( -/obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) -"aV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "aX" = ( /obj/machinery/door/airlock/engineering/glass{ name = "Gravity Generator" @@ -252,44 +162,16 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"bd" = ( -/obj/structure/table, -/obj/item/weldingtool/experimental, -/obj/item/inducer, -/obj/item/storage/belt/utility/chief/full, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) -"be" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "bf" = ( /obj/machinery/suit_storage_unit/captain, /turf/open/floor/iron, /area/station/engineering/main) -"bg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "bh" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/iron, /area/station/engineering/gravity_generator) -"bk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/atmos) "bl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -339,11 +221,6 @@ /obj/machinery/rnd/destructive_analyzer, /turf/open/floor/iron, /area/station/science) -"bt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science) "bu" = ( /turf/closed/wall/r_wall, /area/station/command/bridge) @@ -355,12 +232,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/brig) -"bx" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/main) "by" = ( /turf/closed/wall/r_wall, /area/station/medical/medbay) @@ -379,27 +250,6 @@ "bE" = ( /turf/open/floor/iron, /area/station/hallway/primary/central) -"bG" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/table, -/obj/item/uplink/debug{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/uplink/nuclear/debug, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/bridge) "bH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron, @@ -464,15 +314,8 @@ /obj/machinery/chem_master, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"bR" = ( -/obj/machinery/camera/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/machinery/chem_heater/debug, -/turf/open/floor/iron/dark, -/area/station/medical/chemistry) "bS" = ( -/obj/machinery/chem_dispenser/fullupgrade, +/obj/machinery/chem_dispenser, /turf/open/floor/iron/dark, /area/station/medical/chemistry) "bT" = ( @@ -482,24 +325,6 @@ }, /turf/open/floor/iron, /area/station/security/brig) -"bU" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/mob/living/carbon/human, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/medical/medbay) "bV" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/tile/blue{ @@ -521,7 +346,6 @@ }, /area/station/medical/medbay) "bX" = ( -/obj/machinery/sleeper/syndie/fullupgrade, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -541,65 +365,21 @@ /obj/machinery/autolathe/hacked, /turf/open/floor/iron, /area/station/science) -"cd" = ( -/obj/machinery/door/airlock, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/command/bridge) -"ce" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/bridge) -"cf" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/bridge) -"cg" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/command/bridge) -"ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/medical/chemistry) -"ci" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) -"cj" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/medical/chemistry) "ck" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/medical/medbay) -"cl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/white/corner{ - dir = 1 - }, -/area/station/medical/medbay) "cm" = ( /turf/open/floor/iron, /area/station/medical/medbay) +"cn" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/research, +/turf/open/floor/iron/dark, +/area/station/science/misc_lab) "co" = ( /obj/machinery/light/directional/east, /obj/machinery/ore_silo, @@ -748,18 +528,12 @@ dir = 1 }, /area/station/medical/medbay) -"cI" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) "cJ" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/table/optable, +/obj/machinery/body_scan_display/directional/south, /turf/open/floor/iron/cafeteria, /area/station/medical/medbay) "cK" = ( @@ -767,24 +541,14 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/table/glass, -/obj/item/storage/box/monkeycubes{ - pixel_x = 6; - pixel_y = 1 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = -6; - pixel_y = 2 - }, +/obj/machinery/bodyscanner, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) "cL" = ( -/obj/item/storage/backpack/duffelbag/syndie/surgery, -/obj/item/disk/surgery/debug, /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/table/glass, +/obj/machinery/bodyscanner_console, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) "cN" = ( @@ -806,24 +570,6 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron, /area/station/commons/storage/primary) -"cW" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction) -"cX" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction) "cY" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -841,23 +587,6 @@ "db" = ( /turf/closed/wall/mineral/plastitanium, /area/station/hallway/secondary/entry) -"dc" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"dd" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "de" = ( /obj/machinery/gulag_teleporter, /turf/open/floor/iron, @@ -880,14 +609,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"dk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "dl" = ( /turf/open/floor/plating, /area/station/commons/storage/primary) @@ -970,13 +691,6 @@ }, /turf/open/floor/iron, /area/station/construction) -"dA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "dB" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, @@ -1008,10 +722,6 @@ /obj/machinery/door/airlock, /turf/open/floor/iron, /area/station/commons/storage/primary) -"dH" = ( -/obj/machinery/door/airlock, -/turf/open/floor/plating, -/area/station/maintenance/department/bridge) "dI" = ( /obj/effect/landmark/start, /turf/open/floor/iron, @@ -1149,20 +859,9 @@ /obj/machinery/door/airlock, /turf/open/floor/iron, /area/station/construction) -"eg" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/security/brig) "eh" = ( /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"ei" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "ej" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, @@ -1184,21 +883,16 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"ep" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "es" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/dna_scannernew, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/computer/scan_consolenew{ + dir = 1 + }, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) "et" = ( @@ -1227,17 +921,6 @@ /obj/machinery/status_display/supply, /turf/closed/wall, /area/station/cargo/storage) -"ez" = ( -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "eA" = ( /obj/machinery/conveyor{ dir = 1; @@ -1264,11 +947,6 @@ }, /turf/open/space/basic, /area/space) -"eF" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "eG" = ( /obj/machinery/airalarm/unlocked{ dir = 8; @@ -1276,14 +954,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"eH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "eJ" = ( /obj/docking_port/stationary{ dir = 4; @@ -1313,11 +983,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"eP" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "eQ" = ( /obj/machinery/conveyor_switch/oneway{ dir = 8; @@ -1389,13 +1054,6 @@ }, /turf/open/floor/plating, /area/station/cargo/storage) -"eZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "fa" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -1526,97 +1184,10 @@ /obj/structure/fans/tiny, /turf/open/floor/plating, /area/station/hallway/secondary/entry) -"ft" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/hallway/primary/central) -"fw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fx" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L1" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fy" = ( -/obj/machinery/light/directional/north, -/obj/effect/turf_decal/plaque{ - icon_state = "L3" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fz" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L5" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fA" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L7" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "fB" = ( /obj/machinery/status_display/supply, /turf/closed/wall/r_wall, /area/station/cargo/storage) -"fC" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L9" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fD" = ( -/obj/machinery/light/directional/north, -/obj/machinery/camera/directional/north, -/obj/effect/turf_decal/plaque{ - icon_state = "L11" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) -"fE" = ( -/obj/effect/turf_decal/plaque{ - icon_state = "L13" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "fF" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -1626,25 +1197,10 @@ /obj/structure/fans/tiny, /turf/open/floor/iron, /area/station/cargo/storage) -"fH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "fI" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, /area/station/maintenance/aft) -"fK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/commons/storage/primary) "fM" = ( /obj/structure/sign/directions/supply{ dir = 4; @@ -1661,14 +1217,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"fN" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/commons/storage/primary) "fO" = ( /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) @@ -1684,42 +1232,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"fR" = ( -/obj/machinery/door/airlock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/commons/storage/primary) -"fS" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"fU" = ( -/obj/machinery/airalarm/unlocked{ - dir = 1; - pixel_y = 23 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"fV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) -"fW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "fX" = ( /obj/structure/sign/directions/supply{ dir = 4; @@ -1736,11 +1248,6 @@ }, /turf/open/floor/plating, /area/station/commons/storage/primary) -"fY" = ( -/obj/machinery/light/directional/west, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/storage) "fZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 @@ -1787,16 +1294,6 @@ }, /turf/open/floor/plating, /area/station/commons/storage/primary) -"gi" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/machinery/airalarm/unlocked{ - dir = 4; - pixel_x = 32 - }, -/obj/structure/cable, -/obj/machinery/computer/shuttle/mining, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gk" = ( /obj/structure/sign/departments/evac, /turf/closed/wall/r_wall, @@ -1810,22 +1307,10 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"gm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gn" = ( /obj/machinery/camera/directional/north, /turf/open/floor/iron, /area/station/security/brig) -"go" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, @@ -1834,20 +1319,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) -"gu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/entry) "gv" = ( /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -1879,14 +1350,6 @@ /obj/machinery/keycard_auth/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"gA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -1901,14 +1364,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"gD" = ( -/obj/machinery/camera/autoname/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/cargo/miningoffice) "gE" = ( /obj/machinery/camera/directional/north, /turf/open/floor/iron, @@ -1924,14 +1379,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/iron, /area/station/construction) -"gH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/camera/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/secondary/exit/departure_lounge) "gI" = ( /obj/machinery/light/directional/north, /obj/machinery/camera/directional/north, @@ -1943,19 +1390,43 @@ /obj/item/paper/guides/jobs/security/labor_camp, /turf/open/floor/iron, /area/station/security/brig) -"gY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +"gV" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/station/engineering/gravity_generator) +"hc" = ( +/obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/science) +/area/station/commons/storage/primary) +"hf" = ( +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/plaque{ + icon_state = "L3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "hD" = ( /obj/structure/closet/secure_closet/chemical/heisenberg{ locked = 0 }, /turf/open/floor/iron, /area/station/medical/chemistry) +"hO" = ( +/obj/machinery/asteroid_magnet{ + center_x = 47; + center_y = 32; + area_size = 6 + }, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) "ii" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -1963,27 +1434,64 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron, /area/station/construction) -"jb" = ( -/obj/machinery/door/airlock, -/obj/structure/cable, +"ji" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/science) +/area/station/engineering/main) +"jm" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L7" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"jx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "jE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, /turf/open/floor/plating, /area/station/engineering/atmos) +"jT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "jU" = ( /obj/structure/table, /obj/item/melee/energy/axe, /turf/open/floor/iron, /area/station/commons/storage/primary) -"kj" = ( -/obj/machinery/door/airlock, -/obj/structure/cable, +"kd" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/cargo/miningoffice) +/area/station/command/bridge) +"kh" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/security/brig) "kn" = ( /obj/machinery/light/directional/north, /turf/open/floor/iron, @@ -1992,39 +1500,54 @@ /obj/structure/server, /turf/open/floor/iron/dark, /area/station/science/misc_lab) -"kQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) "lc" = ( /turf/open/floor/engine, /area/station/hallway/secondary/entry) -"lg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/main) "lX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"lY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ma" = ( /obj/machinery/rnd/production/fabricator/omni, /turf/open/floor/iron, /area/station/science) -"mE" = ( -/obj/structure/cable, -/obj/machinery/chem_mass_spec, -/turf/open/floor/iron, -/area/station/medical/chemistry) +"mr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"mM" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 6 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) +"mY" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/hallway/primary/central) "nn" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -2042,16 +1565,59 @@ /obj/item/storage/toolbox/syndicate, /turf/open/floor/iron, /area/station/commons/storage/primary) +"nz" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/engineering/main) +"nD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/medical/chemistry) +"nJ" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/command/bridge) +"nO" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 6 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/main) "od" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"oo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) "ou" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/station/engineering/atmos) +"oE" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) "oV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -2059,10 +1625,47 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/iron, /area/station/medical/chemistry) +"oZ" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/commons/storage/primary) +"pi" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/science) +"pu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 5 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "pA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/r_wall, /area/station/science) +"pC" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L13" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"pG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) "pI" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -2070,45 +1673,80 @@ /obj/machinery/door/airlock/external/glass/ruin, /turf/open/floor/plating, /area/station/medical/medbay) +"pW" = ( +/obj/machinery/door/airlock/public/glass, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/medical/medbay) "qb" = ( /obj/machinery/door/airlock, /turf/open/floor/plating, /area/station/engineering/atmos) -"qQ" = ( -/turf/open/floor/engine, -/area/station/cargo/miningoffice) -"rn" = ( -/obj/structure/cable, +"qB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"qQ" = ( +/turf/open/floor/engine, +/area/station/cargo/miningoffice) "rK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"rL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +"rV" = ( +/obj/machinery/camera/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/chem_heater, +/turf/open/floor/iron/dark, +/area/station/medical/chemistry) +"sf" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/mob/living/carbon/human, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/medical/medbay) "sr" = ( /obj/machinery/door/airlock/shell, /turf/open/floor/iron/dark, /area/station/construction) -"sE" = ( -/obj/structure/cable, -/obj/machinery/power/rtg/debug, -/turf/open/floor/plating/airless, -/area/space/nearstation) "sH" = ( /obj/structure/table, /obj/item/storage/box/shipping, /turf/open/floor/iron, /area/station/commons/storage/primary) +"tp" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/science) +"tB" = ( +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "tE" = ( /obj/machinery/door/airlock/research, /turf/open/floor/iron/dark, @@ -2145,11 +1783,14 @@ /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/station/engineering/atmos) -"uO" = ( -/obj/machinery/door/airlock/public/glass, -/obj/structure/cable, +"uw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/camera/directional/north, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/commons/storage/primary) +/area/station/hallway/secondary/exit/departure_lounge) "uQ" = ( /obj/machinery/light/directional/west, /obj/structure/table, @@ -2166,6 +1807,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/misc_lab) +"vb" = ( +/obj/machinery/door/airlock, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/science) "vm" = ( /mob/living/circuit_drone, /turf/open/floor/iron/dark, @@ -2180,14 +1826,6 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) -"vP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/medical/chemistry) "wb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -2201,16 +1839,51 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central) +"we" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"wh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"wi" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"wz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/security/brig) "wB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"wM" = ( -/obj/structure/cable, +"wL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/engineering/gravity_generator) "wS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 @@ -2224,6 +1897,43 @@ "wU" = ( /turf/closed/wall/r_wall, /area/station/science/misc_lab) +"xp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 5 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"xN" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L5" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"xV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"yw" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/closet/secure_closet/medical3{ + locked = 0 + }, +/obj/item/healthanalyzer/advanced, +/turf/open/floor/iron, +/area/station/medical/medbay) +"yD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/cargo/storage) "yK" = ( /obj/structure/fans/tiny/invisible, /obj/effect/turf_decal/stripes/line{ @@ -2231,11 +1941,36 @@ }, /turf/open/floor/engine, /area/station/hallway/secondary/entry) -"zo" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +"zk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/cargo/miningoffice) +"zn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/construction) +"zy" = ( +/obj/machinery/door/airlock, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/construction) +"zV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) +"Ao" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L9" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "AE" = ( /obj/machinery/airalarm/unlocked{ dir = 1; @@ -2249,6 +1984,32 @@ }, /turf/open/floor/iron, /area/station/science) +"AU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/science) +"Bn" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table, +/obj/item/uplink/debug{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/uplink/nuclear/debug, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/command/bridge) "BD" = ( /obj/structure/closet/secure_closet/chief_medical{ locked = 0 @@ -2260,18 +2021,29 @@ /turf/open/floor/iron, /area/station/command/bridge) "BG" = ( -/obj/structure/table, -/obj/item/ammo_box/c10mm, -/obj/item/gun/ballistic/automatic/pistol, +/obj/structure/filingcabinet/security, /turf/open/floor/iron, /area/station/command/bridge) +"BU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/main) "Ce" = ( /turf/open/floor/iron, /area/station/medical/chemistry) +"Cr" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/rtg/debug, +/turf/open/floor/plating/airless, +/area/space/nearstation) "Ct" = ( /obj/structure/closet/syndicate/resources/everything, /turf/open/floor/iron, /area/station/science) +"Cy" = ( +/turf/open/space/basic, +/area/station/cargo/mining/asteroid_magnet) "CQ" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/stripes/line{ @@ -2283,11 +2055,6 @@ /obj/machinery/component_printer, /turf/open/floor/iron/dark, /area/station/science/misc_lab) -"CV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/medical/chemistry) "Df" = ( /obj/machinery/light/directional/east, /obj/item/integrated_circuit/loaded/hello_world, @@ -2295,30 +2062,28 @@ /obj/structure/rack, /turf/open/floor/iron/dark, /area/station/science/misc_lab) -"DA" = ( -/obj/machinery/light/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +"DR" = ( +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/science) +/area/station/command/bridge) "DW" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/machinery/computer/scan_consolenew{ - dir = 1 - }, +/obj/machinery/dna_scannernew, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) -"EA" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +"Et" = ( +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/construction) -"EB" = ( -/obj/structure/extinguisher_cabinet/directional/north, +/area/station/hallway/primary/central) +"Eu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/medical/medbay) +/area/station/engineering/main) "EG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2336,13 +2101,11 @@ }, /turf/open/floor/iron, /area/station/command/bridge) -"ES" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) +"EP" = ( +/obj/machinery/door/airlock, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/command/bridge) "EX" = ( /obj/structure/table, /obj/item/screwdriver{ @@ -2350,6 +2113,108 @@ }, /turf/open/floor/iron, /area/station/medical/chemistry) +"EZ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/medical/chemistry) +"Fj" = ( +/obj/effect/turf_decal/plaque{ + icon_state = "L1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"Fp" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/commons/storage/primary) +"Fv" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"FD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"FR" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/sleeper/syndie/fullupgrade, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/medical/medbay) +"Gs" = ( +/obj/machinery/light/directional/north, +/obj/machinery/camera/directional/north, +/obj/effect/turf_decal/plaque{ + icon_state = "L11" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"GL" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/main) +"GZ" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"Hf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"Hh" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 10 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"Ho" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/space, +/area/space/nearstation) +"Hq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/medical/chemistry) +"Ht" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "Ir" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2375,6 +2240,48 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"IK" = ( +/obj/machinery/light/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/closet/radiation, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/gravity_generator) +"IL" = ( +/obj/machinery/camera/directional/north, +/obj/machinery/computer/monitor, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/main) +"IX" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/external/glass/ruin, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/engineering/main) +"Js" = ( +/obj/structure/table/glass, +/obj/item/storage/box/monkeycubes{ + pixel_x = 6; + pixel_y = 1 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 2 + }, +/turf/open/floor/iron, +/area/station/medical/medbay) +"Jy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/medical/chemistry) "JF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -2393,6 +2300,14 @@ }, /turf/open/floor/engine, /area/station/cargo/miningoffice) +"Kl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/construction) "Kx" = ( /obj/structure/table, /obj/item/analyzer, @@ -2400,26 +2315,27 @@ /obj/machinery/light/directional/south, /turf/open/floor/plating, /area/station/engineering/atmos) +"Lv" = ( +/obj/machinery/light/directional/north, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/science) "Ly" = ( /obj/machinery/chem_dispenser/chem_synthesizer, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"LH" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/research, -/turf/open/floor/iron/dark, -/area/station/science/misc_lab) "LW" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"Mh" = ( -/obj/structure/cable, +"Mn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 9 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/hallway/primary/central) +/area/station/hallway/secondary/exit/departure_lounge) "ME" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -2430,11 +2346,19 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/engineering/gravity_generator) -"MY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +"MZ" = ( +/obj/machinery/door/airlock/engineering/glass{ + name = "Gravity Generator" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/engineering/atmos) +/area/station/engineering/gravity_generator) "Nb" = ( /obj/machinery/bci_implanter, /turf/open/floor/iron/dark, @@ -2443,15 +2367,32 @@ /obj/machinery/chem_recipe_debug, /turf/open/floor/iron, /area/station/medical/chemistry) -"Ns" = ( -/obj/machinery/door/airlock/public/glass, -/obj/structure/cable, +"NN" = ( +/obj/structure/fans/tiny, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/station/medical/medbay) +/area/station/engineering/main) +"NV" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron, +/area/station/medical/chemistry) +"Oh" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/cargo/storage) "Oo" = ( /obj/machinery/rnd/production/fabricator/department/robotics, /turf/open/floor/iron, /area/station/science) +"Ot" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "Ov" = ( /obj/structure/table, /obj/machinery/cell_charger, @@ -2460,17 +2401,41 @@ /obj/item/stock_parts/cell/bluespace, /turf/open/floor/iron/dark, /area/station/science/misc_lab) +"Oy" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/security/brig) "OD" = ( /obj/machinery/rnd/production/fabricator/department, /turf/open/floor/iron, /area/station/science) -"Qi" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 +"Py" = ( +/obj/machinery/airalarm/unlocked{ + dir = 1; + pixel_y = 23 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/construction) +"PJ" = ( +/obj/machinery/light/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/cargo/storage) +"Qa" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/airalarm/unlocked{ + dir = 4; + pixel_x = 32 }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/computer/shuttle/mining, /turf/open/floor/iron, -/area/station/hallway/secondary/entry) +/area/station/cargo/miningoffice) "Qt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -2478,6 +2443,13 @@ /obj/machinery/door/airlock/external/glass/ruin, /turf/open/floor/plating, /area/station/medical/medbay) +"QF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "QY" = ( /obj/structure/table, /obj/item/organ/cyberimp/bci{ @@ -2491,6 +2463,14 @@ }, /turf/open/floor/iron/dark, /area/station/science/misc_lab) +"QZ" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/station/science/misc_lab) "Rb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -2501,6 +2481,20 @@ }, /turf/open/floor/plating, /area/station/hallway/secondary/entry) +"Rg" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/engineering/atmos) +"RF" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/medical/medbay) "RM" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -2511,13 +2505,42 @@ }, /turf/open/floor/iron, /area/station/command/bridge) +"Sf" = ( +/obj/machinery/camera/autoname/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"Si" = ( +/obj/machinery/door/airlock, +/turf/open/floor/plating, +/area/station/medical/medbay) "Sj" = ( -/obj/structure/table/optable, /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/structure/table/glass, +/obj/item/storage/backpack/duffelbag/syndie/surgery, /turf/open/floor/iron/white/corner, /area/station/medical/medbay) +"SG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) +"SI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "Td" = ( /obj/machinery/light/directional/east, /obj/effect/turf_decal/stripes/line{ @@ -2525,45 +2548,45 @@ }, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"Tg" = ( +/obj/machinery/door/airlock/public/glass, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/commons/storage/primary) "Tj" = ( /obj/machinery/door/poddoor, /turf/open/floor/engine, /area/station/hallway/secondary/entry) +"Ts" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/machinery/door/airlock/external/glass/ruin, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/engineering/main) "Tt" = ( /turf/open/floor/plating, /area/station/maintenance/aft) -"TV" = ( -/obj/machinery/door/airlock, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/construction) -"Ut" = ( -/obj/structure/closet/secure_closet/medical3{ - locked = 0 - }, -/obj/item/healthanalyzer/advanced, -/turf/open/floor/iron, -/area/station/medical/medbay) -"Vg" = ( -/obj/machinery/light/directional/south, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central) -"Vr" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, +"TF" = ( +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 + dir = 8 }, -/turf/open/floor/iron/dark, -/area/station/science/misc_lab) -"Vy" = ( -/obj/structure/cable, /turf/open/floor/iron, -/area/station/engineering/main) -"VA" = ( -/obj/structure/fans/tiny, -/obj/structure/cable, +/area/station/hallway/secondary/entry) +"UI" = ( +/obj/machinery/door/airlock, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/cargo/miningoffice) +"US" = ( +/obj/structure/table, +/obj/item/weldingtool/experimental, +/obj/item/inducer, +/obj/item/storage/belt/utility/chief/full, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/station/engineering/main) "We" = ( @@ -2584,33 +2607,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron, /area/station/hallway/primary/central) -"Wx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/engineering/gravity_generator) "WK" = ( /obj/structure/money_bot, -/turf/open/floor/iron/dark, -/area/station/science/misc_lab) -"WT" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/machinery/door/airlock/external/glass/ruin, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/engineering/main) -"Xg" = ( -/obj/machinery/light/directional/east, -/obj/machinery/vending/syndichem{ - onstation = 0; - req_access = null - }, -/turf/open/floor/iron, -/area/station/medical/chemistry) +/turf/open/floor/iron/dark, +/area/station/science/misc_lab) "Xp" = ( /obj/machinery/light/directional/south, /obj/structure/tank_dispenser{ @@ -2618,10 +2618,6 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) -"XC" = ( -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/science) "XR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 @@ -2637,6 +2633,15 @@ /obj/effect/landmark/blobstart, /turf/open/floor/iron, /area/station/commons/storage/primary) +"Yc" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/entry) +"Yf" = ( +/obj/machinery/light/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/primary/central) "Ym" = ( /obj/structure/table, /obj/item/storage/toolbox/electrical, @@ -2648,6 +2653,11 @@ }, /turf/open/floor/iron/dark, /area/station/science/misc_lab) +"Zm" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/station/hallway/secondary/exit/departure_lounge) "ZD" = ( /obj/machinery/suit_storage_unit/ce, /turf/open/floor/iron, @@ -2655,6 +2665,12 @@ "ZP" = ( /turf/open/floor/iron/dark, /area/station/science/misc_lab) +"ZU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/machinery/door/airlock, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/plating, +/area/station/engineering/atmos) (1,1,1) = {" aa @@ -4242,10 +4258,10 @@ Td II II gl -gD -kj -wM -wM +Sf +UI +Yc +Yc LW lc lc @@ -4332,12 +4348,12 @@ em em em em -gi -gm -go +Qa +Hh +zk gp eL -gr +xp LW lc lc @@ -4429,7 +4445,7 @@ dY dY dY eh -gu +qB LW lc lc @@ -4521,7 +4537,7 @@ od dj ed eh -gu +qB LW lc lc @@ -4613,7 +4629,7 @@ fi dP ex eh -gu +qB LW lc lc @@ -4705,7 +4721,7 @@ Re dV dY ej -gu +qB LW lc lc @@ -4797,7 +4813,7 @@ dY dY dY eh -gu +qB LW lc lc @@ -4889,7 +4905,7 @@ aa aa dY gE -gu +qB LW lc lc @@ -4981,7 +4997,7 @@ aa aa dY gq -ei +xV LW lc lc @@ -5073,7 +5089,7 @@ aa aa dY eh -gu +qB LW lc lc @@ -5165,7 +5181,7 @@ aa aa dY eh -gu +qB LW lc lc @@ -5257,7 +5273,7 @@ aa aa dY ej -gu +qB LW lc lc @@ -5349,7 +5365,7 @@ aa aa dY eh -gu +qB LW lc lc @@ -5441,7 +5457,7 @@ aa aa dY eh -gu +qB LW lc lc @@ -5533,7 +5549,7 @@ bw ag ag eh -gu +qB LW dh en @@ -5625,7 +5641,7 @@ aD dR ag eh -gu +qB eh eV eh @@ -5710,32 +5726,32 @@ gn aD aD bH -ci -ci -ci -ci -ci -eg -ei -gu -ei -ep -ei -ei -ei -ei -ei -ei -ei -ei -gu -ei -ei -ei -ei -ei -ei -Qi +wz +wz +wz +wz +wz +Oy +xV +qB +xV +jx +xV +xV +xV +xV +xV +xV +xV +xV +qB +xV +xV +xV +xV +xV +xV +TF fZ eh dY @@ -5802,7 +5818,7 @@ aD aD aD bT -cI +kh dg aD aD @@ -5811,12 +5827,12 @@ ag eh eh eh -gu +qB eh eh eh eh -eF +Fv eM fM eh @@ -5827,7 +5843,7 @@ eh eh eh eh -rn +pG eh eh dY @@ -5903,7 +5919,7 @@ bA gd bA bZ -ft +mY bZ cN cN @@ -5919,7 +5935,7 @@ cN cN cN cN -LH +cn en dY dY @@ -5995,10 +6011,10 @@ ca OD bA kn -ES +Ht bE cN -cW +Py dm dy ii @@ -6011,7 +6027,7 @@ dy dm dM cN -Vr +QZ vm uQ Ov @@ -6079,18 +6095,18 @@ aw aw ba jE -MY -bk -bt -bt -bt +Hf +ZU +AU +AU +AU AP pA -kQ -ES -rL +mr +Ht +zV cP -cX +Kl dn dn dn @@ -6171,18 +6187,18 @@ aw aN bb bl -zo +Rg ah -DA +Lv bD -XC -gY -jb -ES +tp +pi +vb +Ht bE -Mh -TV -EA +Et +zy +zn dn dn dn @@ -6267,7 +6283,7 @@ ZD ah bD bD -XC +tp Ct gd cA @@ -6296,21 +6312,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE aa aa aa @@ -6359,7 +6375,7 @@ Xp ah ma bD -XC +tp co bA wS @@ -6388,21 +6404,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6451,7 +6467,7 @@ ah ah bu bu -cd +EP bu bu cB @@ -6480,21 +6496,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6542,8 +6558,8 @@ ab ab ab bu -bG -ce +Bn +kd cp bu cC @@ -6572,21 +6588,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6627,15 +6643,15 @@ aa aa ae ab -sE -sE -sE -sE -sE +Cr +Cr +Cr +Cr +Cr ab bv bI -cf +DR EI bv dU @@ -6664,21 +6680,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6719,15 +6735,15 @@ aa aa ae ab -sE +Cr an -sE +Cr an -sE +Cr ab bv BG -cf +DR BD bu dU @@ -6756,21 +6772,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6811,15 +6827,15 @@ aa aa ae ab -sE +Cr an -ao +Ho an -sE +Cr ab bv bJ -cf +DR cq cw Wq @@ -6848,21 +6864,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6905,13 +6921,13 @@ ae ac ab ab -ao +Ho ab ab ac bv bK -cf +DR Iy bu cD @@ -6938,23 +6954,23 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +hO +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -6997,13 +7013,13 @@ ae ac ac aj -aC +Ts aj ac ac bv aK -cf +DR RM bv cD @@ -7032,21 +7048,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7089,13 +7105,13 @@ aj aj aj aj -VA +NN aj ac ac bu bM -cg +nJ cr bu wb @@ -7124,21 +7140,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7181,20 +7197,20 @@ aj al aA aj -WT +IX aj aj aj bu bu -cd +EP bu bu cE bE bE cS -dd +GZ dp dl dl @@ -7216,21 +7232,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7273,20 +7289,20 @@ aj ap aA We -Vy +GL aS -bd +US bo aj hD -cj +EZ ct Nc cF bE bE cS -dc +hc dC dC dC @@ -7308,21 +7324,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7362,23 +7378,23 @@ aa aa aa aj -aq -Vy -Vy -aE -aT -be -be -bx -CV -CV -ch -CV +IL +GL +GL +nO +ji +BU +BU +nz +Hq +Hq +Jy +Hq cT bN bN da -fK +pu dJ dJ dJ @@ -7400,21 +7416,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7458,19 +7474,19 @@ ar aA aH aF -lg +Eu bf bp aj bP Ce JF -mE +EZ oV bE bE cS -fx +Fj dq dJ dJ @@ -7492,21 +7508,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +Cy +oE aa aa aa @@ -7550,19 +7566,19 @@ ad ak ak ak -aU +MZ ak ak ak bQ Ce Ce -cj -vP -Mh -Vg +EZ +nD +Et +Yf cS -fy +hf dr dJ dJ @@ -7584,21 +7600,21 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE +oE aa aa aa @@ -7640,21 +7656,21 @@ aa ad af ak -as -aG -aV -bg +wi +IK +oo +lY bq ak -bR -cj -cj -cj +rV +EZ +EZ +EZ oV bE -Mh -uO -fz +Et +Tg +xN ds dJ dJ @@ -7731,9 +7747,9 @@ aa aa bY af -ak -at -Wx +gV +FD +wL bh bh br @@ -7741,12 +7757,12 @@ ak bS Ce Ce -cj +EZ oV bE bE cV -fA +jm dt dJ dD @@ -7759,7 +7775,7 @@ dJ dJ ea cS -fS +Zm fO fO gk @@ -7832,13 +7848,13 @@ aI ak Ly EX -Xg -cj +NV +EZ oV bE bE cV -fC +Ao du dJ dJ @@ -7851,7 +7867,7 @@ dJ dJ sH cS -fU +mM gb fO ga @@ -7925,12 +7941,12 @@ by by ck by -Ns +pW cG cx by by -fD +Gs dv dJ dJ @@ -7943,7 +7959,7 @@ dJ dJ dQ cS -gA +Ot fO fO gf @@ -8014,15 +8030,15 @@ MN MN av by -bU -cl -cl -cl +sf +RF +FR +RF cH cu cJ by -fE +pC dw dJ dJ @@ -8035,7 +8051,7 @@ dJ dJ dN cS -gH +uw fO fO fb @@ -8114,7 +8130,7 @@ cm cm Sj by -dA +we dJ dJ dJ @@ -8127,7 +8143,7 @@ dJ dJ dJ cS -fV +QF fO fO gf @@ -8206,20 +8222,20 @@ cm cm cL by -dk -eH -eH -eH -eH -fH -fw -eH -eH -eH -eH -fH -fR -fW +SG +SI +SI +SI +SI +jT +wh +SI +SI +SI +SI +jT +oZ +Mn fO fO fb @@ -8291,10 +8307,10 @@ av av by bX -cm eU +cm cy -Ut +cm cm cK by @@ -8303,7 +8319,7 @@ dx dl dl gg -ez +tB dB dl dl @@ -8382,12 +8398,12 @@ ak ak ak by -by -dH -by +Si +ad Qt by -EB +yw +cm DW by cS @@ -8395,7 +8411,7 @@ cS cS cS cS -fN +Fp vv cS cS @@ -8475,19 +8491,19 @@ af af af af -af -by +ad cz by +Js cm es by eu eu eG -eP -fY -eZ +Oh +PJ +yD eu fq fr @@ -8568,12 +8584,12 @@ ad ad ad ad -by pI by by by by +by eu eu eu diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 673201b824d8..f052359a6569 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2,6 +2,17 @@ "aa" = ( /turf/open/space/basic, /area/space) +"ab" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool/experimental, +/obj/machinery/power/terminal{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "ac" = ( /turf/closed/indestructible/fakedoor{ name = "Sub-Laboratory Elevator"; @@ -14,8 +25,37 @@ "af" = ( /obj/effect/turf_decal/stripes/corner, /obj/structure/railing/corner, -/turf/open/floor/plating/icemoon, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"ah" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/structure/table/glass/plasmaglass, +/obj/item/reagent_containers/syringe{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = -2; + pixel_y = 13 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 1; + pixel_y = 14 + }, +/obj/machinery/light/cold/directional/north, +/obj/item/reagent_containers/dropper{ + pixel_x = -4; + pixel_y = -6 + }, +/obj/item/storage/box/monkeycubes{ + pixel_x = -6; + pixel_y = 5 + }, +/obj/item/reagent_containers/glass/bottle/space_cleaner, +/turf/open/floor/mineral/plastitanium/red, +/area/centcom/syndicate_mothership/expansion_bioterrorism) "ai" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, @@ -36,24 +76,16 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "ao" = ( -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "ap" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/mapping_helpers/paint_wall/centcom, /turf/open/floor/plating, /area/centcom/central_command_areas/control) -"ar" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/ert_spawn, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "at" = ( /obj/machinery/door/airlock/centcom{ name = "Thunderdome Backstage" @@ -123,7 +155,7 @@ /area/centcom/central_command_areas/holding) "aA" = ( /obj/machinery/light/directional/south, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "aB" = ( /obj/effect/turf_decal/tile/red, @@ -165,7 +197,7 @@ /area/centcom/central_command_areas/holding) "aG" = ( /obj/structure/railing/corner, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "aH" = ( /obj/machinery/vending/cigarette/syndicate, @@ -176,9 +208,8 @@ /obj/structure/railing{ dir = 6 }, -/turf/open/floor/catwalk_floor/iron_smooth{ - temperature = 2.7 - }, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership) "aJ" = ( /obj/structure/chair/stool/directional/north, @@ -186,7 +217,7 @@ /obj/structure/sign/poster/contraband/donk_co{ pixel_y = -32 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "aK" = ( /obj/structure/table/reinforced, @@ -230,6 +261,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"aO" = ( +/obj/machinery/camera/autoname/directional/south{ + network = list("nukie") + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "aP" = ( /obj/structure/chair{ dir = 1 @@ -272,12 +311,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) -"aU" = ( -/obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/basalt/wasteland{ - temperature = 2.7 - }, -/area/centcom/central_command_areas/holding) "aV" = ( /obj/structure/table/wood, /obj/item/clipboard, @@ -392,12 +425,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"bm" = ( -/obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "bo" = ( /obj/effect/landmark/thunderdome/two, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -463,7 +490,8 @@ /area/centcom/syndicate_mothership) "bz" = ( /obj/item/stack/sheet/mineral/sandbags, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "bA" = ( /obj/structure/table/reinforced, @@ -497,7 +525,7 @@ /obj/machinery/door/airlock/wood{ name = "Red Team" }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "bD" = ( /obj/effect/turf_decal/tile/green{ @@ -531,11 +559,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"bH" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/armory) "bI" = ( /obj/machinery/shower{ pixel_y = 12 @@ -579,7 +602,7 @@ /area/centcom/central_command_areas/holding) "bO" = ( /obj/effect/landmark/holding_facility, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "bP" = ( /obj/machinery/door/window/brigdoor{ @@ -713,10 +736,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"ci" = ( -/obj/machinery/duct, -/turf/open/floor/iron/cafeteria, -/area/centcom/central_command_areas/holding) "cj" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 9 @@ -778,7 +797,7 @@ "cp" = ( /obj/structure/lattice/catwalk, /obj/structure/railing, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "cq" = ( /obj/effect/turf_decal/tile/neutral{ @@ -838,7 +857,7 @@ "cx" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/storage/book/bible, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "cy" = ( /obj/structure/chair/sofa/bench/right{ @@ -942,16 +961,13 @@ /obj/structure/bookcase/random/fiction, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"cL" = ( -/obj/item/gun/energy/pulse/carbine/loyalpin, -/obj/item/flashlight/seclite, -/obj/structure/table/reinforced, -/obj/machinery/airalarm/directional/south, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +"cK" = ( +/obj/structure/chair/office, +/obj/effect/landmark/ert_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "cN" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ @@ -1031,7 +1047,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "db" = ( /obj/structure/table/wood, @@ -1048,7 +1065,7 @@ fair_market_price = 0; name = "\improper Jim Norton's Quebecois Coffee" }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "dd" = ( /obj/structure/reagent_dispensers/watertank, @@ -1070,7 +1087,7 @@ pixel_y = -1 }, /obj/machinery/light/small/directional/north, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "dh" = ( /obj/structure/closet/crate, @@ -1084,7 +1101,8 @@ /obj/structure/sign/painting/library{ pixel_y = 32 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "di" = ( /obj/structure/table/reinforced, @@ -1129,7 +1147,7 @@ /area/centcom/central_command_areas/holding) "dm" = ( /obj/machinery/seed_extractor, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "do" = ( /obj/structure/chair/office{ @@ -1154,7 +1172,7 @@ name = "Hijikata"; radio_key = null }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "ds" = ( /obj/item/flashlight/lantern, @@ -1195,21 +1213,6 @@ }, /turf/open/floor/carpet, /area/centcom/syndicate_mothership/control) -"dz" = ( -/obj/item/clipboard, -/obj/structure/table/reinforced, -/obj/item/detective_scanner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/obj/item/storage/box/ids{ - pixel_x = 6; - pixel_y = 12 - }, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "dB" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/effect/turf_decal/tile/yellow/half{ @@ -1228,16 +1231,6 @@ dir = 4 }, /area/centcom/central_command_areas/holding) -"dC" = ( -/obj/structure/rack, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/wrench{ - desc = "A little smidgeon of Freon..."; - name = "Freon" - }, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "dD" = ( /obj/structure/fence, /obj/effect/light_emitter{ @@ -1247,11 +1240,13 @@ /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) "dE" = ( -/turf/open/floor/catwalk_floor/titanium, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "dF" = ( /obj/machinery/icecream_vat, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "dG" = ( /obj/structure/table/wood, @@ -1264,7 +1259,7 @@ /area/centcom/tdome/observation) "dH" = ( /obj/structure/fence/door/opened, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "dJ" = ( /obj/machinery/button/door/indestructible{ @@ -1284,26 +1279,24 @@ /obj/structure/table/wood/fancy/royalblue, /obj/item/instrument/piano_synth, /obj/item/instrument/saxophone, -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) -"dN" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/rcl/pre_loaded, -/turf/open/floor/catwalk_floor, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "dO" = ( /obj/machinery/light/directional/south, /obj/effect/landmark/holding_facility, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "dP" = ( /obj/machinery/light/cold/directional/east, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "dQ" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/tile, -/area/centcom/central_command_areas/holding) +/obj/structure/chair/office, +/obj/effect/landmark/ert_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "dR" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -1348,7 +1341,7 @@ /obj/item/clothing/mask/fakemoustache{ pixel_y = 9 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "dV" = ( /obj/structure/table/wood, @@ -1382,6 +1375,19 @@ }, /turf/open/floor/iron, /area/centcom/tdome/observation) +"dY" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 8 + }, +/obj/structure/table/glass/plasmaglass, +/obj/item/folder/white, +/obj/item/pen{ + pixel_x = 6; + pixel_y = 5 + }, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/mineral/plastitanium, +/area/centcom/syndicate_mothership/control) "dZ" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -1403,7 +1409,7 @@ /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "ed" = ( /obj/machinery/vending/cola, @@ -1529,7 +1535,8 @@ /area/centcom/central_command_areas/courtroom) "ev" = ( /obj/machinery/photocopier, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "ew" = ( /obj/effect/light_emitter{ @@ -1569,7 +1576,7 @@ /area/centcom/syndicate_mothership/control) "eA" = ( /obj/structure/statue/uranium/nuke, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "eB" = ( /obj/structure/bookcase/random, @@ -1581,7 +1588,7 @@ set_cap = 1; set_luminosity = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "eD" = ( /obj/machinery/door/airlock/centcom{ @@ -1631,7 +1638,7 @@ pixel_y = 11 }, /obj/item/camera_film, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "eK" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -1720,7 +1727,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "eX" = ( /obj/effect/turf_decal/stripes/end{ @@ -1739,7 +1746,7 @@ /obj/structure/sign/painting/library{ pixel_y = 32 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "fa" = ( /obj/effect/turf_decal/tile/green{ @@ -1809,17 +1816,8 @@ /obj/structure/railing{ dir = 6 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) -"fi" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/effect/landmark/ert_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "fj" = ( /obj/structure/extinguisher_cabinet/directional/east, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1853,7 +1851,7 @@ dir = 4 }, /obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "fp" = ( /obj/structure/sink{ @@ -1864,10 +1862,23 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, /area/centcom/central_command_areas/holding) -"fq" = ( -/obj/machinery/duct, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) +"fr" = ( +/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/smart/manifold4w/supply/visible{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin/storage) "fs" = ( /obj/effect/turf_decal/tile/yellow/half, /obj/effect/turf_decal/tile/yellow/half{ @@ -1895,7 +1906,8 @@ /obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/glass/fifty, /obj/item/multitool, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "fu" = ( /obj/effect/turf_decal/tile/yellow/half{ @@ -1989,7 +2001,7 @@ /obj/machinery/door/airlock/wood{ name = "Blue Team" }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "fJ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -1997,7 +2009,7 @@ /area/centcom/tdome/arena) "fK" = ( /obj/structure/chair/stool/directional/south, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "fM" = ( /turf/closed/indestructible/fakedoor{ @@ -2051,7 +2063,7 @@ /area/centcom/central_command_areas/holding) "fV" = ( /obj/machinery/light/small/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "fW" = ( /obj/effect/turf_decal/tile/bar, @@ -2118,8 +2130,12 @@ "gf" = ( /obj/structure/flora/tree/pine, /obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) +"gg" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "gh" = ( /turf/closed/indestructible/fakedoor{ name = "Thunderdome Admin" @@ -2156,7 +2172,7 @@ "gk" = ( /obj/structure/table/wood/fancy/red, /obj/item/toy/spinningtoy, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "gl" = ( /obj/structure/filingcabinet/security, @@ -2180,7 +2196,8 @@ "go" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/storage/crayons, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "gp" = ( /obj/structure/table/wood, @@ -2341,7 +2358,7 @@ "gM" = ( /obj/structure/table/wood, /obj/item/paicard, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "gO" = ( /turf/closed/indestructible/reinforced/centcom, @@ -2488,7 +2505,7 @@ pixel_y = 17 }, /obj/structure/fluff/tram_rail, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "hm" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -2528,11 +2545,6 @@ /obj/structure/weightmachine/weightlifter, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"hs" = ( -/turf/open/misc/asteroid/basalt/wasteland{ - temperature = 2.7 - }, -/area/centcom/central_command_areas/holding) "ht" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -2589,7 +2601,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "hx" = ( /obj/machinery/photocopier, @@ -2691,7 +2703,7 @@ dir = 1 }, /obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "hJ" = ( /obj/machinery/computer/security/telescreen, @@ -2756,16 +2768,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"hQ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/structure/reagent_dispensers/plumbed{ - pixel_x = 5; - pixel_y = 4 - }, -/turf/open/floor/catwalk_floor, -/area/centcom/central_command_areas/holding) "hS" = ( /obj/structure/flora/rock/icy, /turf/open/misc/asteroid/snow/airless, @@ -2777,7 +2779,8 @@ "hU" = ( /obj/structure/mopbucket, /obj/item/mop, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "hW" = ( /obj/structure/chair/office, @@ -2903,13 +2906,6 @@ /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) -"iq" = ( -/obj/machinery/camera/autoname/directional/north{ - network = list("nukie") - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) "ir" = ( /turf/closed/indestructible/fakeglass, /area/centcom/central_command_areas/prison/cells) @@ -3003,7 +2999,8 @@ "iC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "iD" = ( /obj/structure/closet/secure_closet/security, @@ -3561,7 +3558,8 @@ /area/centcom/syndicate_mothership/control) "jY" = ( /obj/machinery/vending/cigarette/syndicate, -/turf/open/floor/catwalk_floor/titanium, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "ka" = ( /obj/effect/turf_decal/stripes/line{ @@ -3575,27 +3573,15 @@ "kb" = ( /turf/closed/indestructible/rock/snow, /area/centcom/syndicate_mothership/control) -"ke" = ( -/obj/machinery/light/cold/directional/east, -/obj/machinery/vending/snack/teal, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) +"kd" = ( +/obj/machinery/light/small/directional/south, +/turf/open/floor/carpet/black, +/area/centcom/central_command_areas/holding) "kf" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/components/binary/pump/on, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"kg" = ( -/obj/structure/railing{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, -/area/centcom/syndicate_mothership/control) "kh" = ( /obj/structure/chair/office, /turf/open/floor/mineral/titanium/tiled/yellow, @@ -3649,7 +3635,7 @@ /obj/structure/railing/corner{ dir = 8 }, -/turf/open/floor/plating/icemoon, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "ko" = ( /turf/closed/indestructible/abductor{ @@ -3973,9 +3959,6 @@ "ll" = ( /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"lm" = ( -/turf/open/misc/asteroid/basalt/wasteland/safe_air, -/area/centcom/central_command_areas/holding) "ln" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/brown, @@ -4232,7 +4215,6 @@ }, /area/centcom/abductor_ship) "lY" = ( -/obj/item/surgical_drapes, /obj/item/paper/guides/antag/abductor, /obj/item/scalpel/alien, /obj/structure/table/abductor, @@ -4282,6 +4264,16 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"mh" = ( +/obj/machinery/light/cold/directional/east, +/obj/machinery/vending/snack/teal, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "mi" = ( /obj/effect/turf_decal/tile/brown{ dir = 1 @@ -4326,7 +4318,7 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) "mm" = ( -/turf/open/misc/ice/icemoon, +/turf/open/misc/ice, /area/centcom/syndicate_mothership/control) "mn" = ( /obj/structure/table/wood, @@ -4389,12 +4381,6 @@ /obj/structure/closet/cardboard/metal, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"mA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) "mB" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/rock/snow, @@ -4537,7 +4523,8 @@ desc = "A gift from your benefactors."; force = 20 }, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "mQ" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -4673,7 +4660,8 @@ /area/centcom/tdome/observation) "nk" = ( /obj/machinery/processor, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "nl" = ( /obj/machinery/computer/security/mining{ @@ -4749,17 +4737,11 @@ "nu" = ( /obj/structure/flora/grass/both, /obj/structure/flora/rock/pile, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "nw" = ( -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) -"ny" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "nz" = ( /turf/closed/indestructible/opsglass, @@ -4787,6 +4769,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/general/visible, /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/expansion_bombthreat) +"nF" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/armory) "nG" = ( /obj/machinery/computer/security/mining{ dir = 1 @@ -4839,6 +4827,20 @@ /obj/structure/chair/office, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/control) +"nO" = ( +/obj/item/clipboard, +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/obj/item/storage/box/ids{ + pixel_x = 6; + pixel_y = 12 + }, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "nP" = ( /obj/structure/sink/kitchen{ dir = 8; @@ -4846,7 +4848,8 @@ pixel_y = 8 }, /obj/item/reagent_containers/glass/bucket, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "nQ" = ( /obj/effect/turf_decal/tile/bar, @@ -4974,24 +4977,13 @@ /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/expansion_bombthreat) "og" = ( -/obj/item/clothing/shoes/galoshes{ - pixel_y = -8 - }, -/obj/item/storage/belt/janitor{ - pixel_x = 2; - pixel_y = -4 - }, -/obj/item/watertank/janitor{ - pixel_x = 1; - pixel_y = 3 - }, -/obj/item/pushbroom{ - pixel_x = -5; - pixel_y = -3 +/obj/structure/railing{ + dir = 1 }, -/obj/machinery/duct, -/turf/open/floor/catwalk_floor, -/area/centcom/central_command_areas/holding) +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "oh" = ( /obj/structure/table/wood, /obj/item/paper_bin, @@ -5338,8 +5330,22 @@ /obj/item/food/meat/slab/synthmeat, /obj/item/food/meat/slab/synthmeat, /obj/item/food/meat/slab/synthmeat, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) +"pa" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Sky Bridge" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) "pb" = ( /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership/control) @@ -5365,7 +5371,7 @@ /obj/structure/railing/corner{ dir = 4 }, -/turf/open/floor/plating/icemoon, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "pf" = ( /obj/structure/table/reinforced, @@ -5476,7 +5482,7 @@ /obj/structure/railing/corner{ dir = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "pw" = ( /obj/effect/light_emitter{ @@ -5549,7 +5555,7 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, -/turf/open/misc/ice/icemoon, +/turf/open/misc/ice, /area/centcom/syndicate_mothership/control) "pH" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -5563,11 +5569,6 @@ "pJ" = ( /turf/open/misc/asteroid/basalt/airless, /area/centcom/central_command_areas/holding) -"pK" = ( -/obj/structure/reagent_dispensers/plumbed, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "pL" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -5664,6 +5665,16 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) +"pY" = ( +/obj/item/gun/energy/pulse/carbine, +/obj/item/flashlight/seclite, +/obj/structure/table/reinforced, +/obj/machinery/airalarm/directional/south, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "pZ" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -5671,6 +5682,18 @@ }, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) +"qa" = ( +/obj/structure/chair/sofa/bench{ + dir = 4 + }, +/obj/machinery/light/cold/directional/west, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "qb" = ( /turf/open/floor/iron/stairs/old, /area/centcom/syndicate_mothership/control) @@ -5718,9 +5741,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"qi" = ( +/obj/effect/turf_decal/tile/green, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "qj" = ( /obj/structure/chair/stool/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "qk" = ( /obj/effect/turf_decal/tile/green{ @@ -5859,7 +5887,7 @@ /obj/structure/railing{ dir = 5 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "qy" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -5918,14 +5946,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/ert) -"qH" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21" - }, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "qI" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -5945,6 +5965,24 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"qN" = ( +/obj/machinery/door/airlock/titanium{ + name = "Restroom" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"qO" = ( +/obj/item/kirbyplants{ + icon_state = "plant-21" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/power/apc/auto_name/directional/south, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "qQ" = ( /obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth_half, @@ -5974,7 +6012,7 @@ /obj/structure/fence{ dir = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "qW" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -6016,7 +6054,7 @@ dir = 1 }, /obj/structure/railing, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "ri" = ( /obj/effect/turf_decal/stripes/full, @@ -6049,6 +6087,19 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"ro" = ( +/obj/effect/turf_decal/siding/wideplating, +/obj/effect/turf_decal/siding/wideplating{ + dir = 1 + }, +/obj/machinery/door/airlock/hatch{ + name = "General Quarters" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron/dark/textured_half, +/area/centcom/syndicate_mothership/control) "rp" = ( /obj/structure/table/glass/plasmaglass, /obj/item/storage/pill_bottle{ @@ -6218,7 +6269,7 @@ /obj/structure/railing{ dir = 5 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "rR" = ( /obj/machinery/door/airlock/external/ruin{ @@ -6228,7 +6279,8 @@ dir = 8 }, /obj/structure/fans/tiny, -/turf/open/floor/catwalk_floor/titanium, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "rS" = ( /obj/effect/turf_decal/stripes/line{ @@ -6263,6 +6315,14 @@ /obj/machinery/light/directional/east, /turf/open/floor/engine/cult, /area/centcom/wizard_station) +"rY" = ( +/obj/machinery/power/smes/magical, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "rZ" = ( /obj/machinery/shower{ dir = 8 @@ -6303,6 +6363,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) +"se" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "sh" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold/purple/visible{ @@ -6310,9 +6376,15 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"sk" = ( -/turf/open/floor/plating/icemoon, -/area/centcom/syndicate_mothership/control) +"sl" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/ert_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "sm" = ( /obj/structure/window/paperframe{ can_atmos_pass = 4 @@ -6400,11 +6472,30 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/briefing) +"sy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/door/airlock/wood{ + name = "Bar" + }, +/turf/open/floor/iron/sepia, +/area/centcom/central_command_areas/holding) "sz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/evac/directional/west, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"sA" = ( +/obj/structure/rack, +/obj/item/stack/sheet/iron/fifty, +/obj/item/wrench{ + desc = "A little smidgeon of Freon..."; + name = "Freon" + }, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "sC" = ( /obj/effect/turf_decal/tile/green{ dir = 1 @@ -6417,7 +6508,7 @@ "sD" = ( /obj/structure/flora/rock/pile, /obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "sE" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -6438,7 +6529,7 @@ roundstart_template = /datum/map_template/shuttle/assault_pod/default; width = 7 }, -/turf/open/floor/plating/icemoon, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "sH" = ( /obj/machinery/computer/security/telescreen, @@ -6604,7 +6695,8 @@ /obj/item/food/meat/slab/monkey, /obj/item/food/meat/slab/monkey, /obj/structure/closet/secure_closet/freezer/meat/open, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "td" = ( /obj/structure/sign/departments/drop, @@ -6645,6 +6737,12 @@ }, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) +"tn" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "to" = ( /obj/machinery/computer/shuttle/ferry{ dir = 4 @@ -6726,6 +6824,11 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"tA" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "tB" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -6878,6 +6981,13 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/evacuation) +"tW" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "tX" = ( /obj/machinery/door/airlock/uranium/glass/safe, /turf/open/floor/engine/cult, @@ -6916,16 +7026,6 @@ /obj/effect/turf_decal/siding/thinplating_new/dark, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"ul" = ( -/obj/structure/chair/sofa/bench/left{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "um" = ( /obj/machinery/computer/communications{ dir = 1 @@ -6937,7 +7037,8 @@ /area/centcom/central_command_areas/ferry) "uo" = ( /obj/machinery/light/floor/has_bulb, -/turf/open/floor/catwalk_floor/titanium, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "up" = ( /obj/structure/table/wood, @@ -7014,6 +7115,12 @@ }, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"uz" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "uA" = ( /obj/structure/chair{ dir = 4 @@ -7057,7 +7164,7 @@ /obj/item/wirecutters{ pixel_y = 3 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "uK" = ( /obj/machinery/processor, @@ -7095,6 +7202,15 @@ /obj/machinery/light/cold/directional/east, /turf/open/floor/iron/smooth, /area/centcom/syndicate_mothership/control) +"uT" = ( +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "uU" = ( /obj/machinery/door/poddoor/incinerator_ordmix{ id = "syn_ordmix_vent" @@ -7118,7 +7234,7 @@ /obj/structure/railing{ dir = 10 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "uX" = ( /obj/machinery/shower{ @@ -7283,11 +7399,35 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"vu" = ( +/obj/machinery/door/airlock/external/ruin{ + req_access_txt = "150" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"vy" = ( +/obj/machinery/door/airlock/centcom{ + name = "Administrative Office"; + req_access_txt = "109" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin) "vz" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "vA" = ( /obj/effect/spawner/structure/window/reinforced, @@ -7335,15 +7475,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"vF" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Office"; - req_access_txt = "109" - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "vG" = ( /obj/machinery/door/poddoor/shutters{ id = "XCCsec1"; @@ -7371,16 +7502,31 @@ }, /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) +"vK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "vL" = ( /obj/machinery/light/floor/has_bulb, /turf/open/floor/iron/dark/textured_half{ dir = 4 }, /area/centcom/syndicate_mothership/control) +"vM" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/effect/landmark/ert_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "vN" = ( /obj/structure/chair/stool/directional/north, /obj/structure/extinguisher_cabinet/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "vO" = ( /obj/machinery/light/directional/east, @@ -7538,11 +7684,6 @@ /obj/machinery/status_display/ai/directional/east, /turf/open/floor/iron, /area/centcom/central_command_areas/armory) -"wh" = ( -/obj/effect/turf_decal/tile/green, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "wi" = ( /obj/structure/chair/office/light{ dir = 8 @@ -7565,7 +7706,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "wo" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ @@ -7655,11 +7796,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"wy" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "wz" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -7704,7 +7840,8 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron, +/obj/structure/overfloor_catwalk/iron, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "wG" = ( /obj/effect/turf_decal/tile/green{ @@ -7801,14 +7938,6 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"wT" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "wU" = ( /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/iron/smooth_half{ @@ -7819,7 +7948,7 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 10 }, -/turf/open/misc/ice/icemoon, +/turf/open/misc/ice, /area/centcom/syndicate_mothership/control) "wW" = ( /obj/item/kirbyplants{ @@ -7863,7 +7992,7 @@ pixel_y = 32 }, /obj/effect/landmark/holding_facility, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "xc" = ( /obj/machinery/door/airlock/external/ruin{ @@ -7958,7 +8087,7 @@ /obj/structure/railing/corner{ dir = 1 }, -/turf/open/floor/plating/icemoon, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "xo" = ( /obj/effect/turf_decal/tile/green, @@ -8025,16 +8154,16 @@ /turf/open/floor/engine/cult, /area/centcom/wizard_station) "xy" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/fueltank, -/obj/item/weldingtool/experimental, -/obj/machinery/power/terminal{ - dir = 8 +/obj/structure/table/reinforced, +/obj/item/paper/fluff/stations/centcom/disk_memo{ + pixel_x = -6; + pixel_y = -7 }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) +/obj/item/taperecorder{ + pixel_y = 15 + }, +/turf/open/floor/carpet, +/area/centcom/syndicate_mothership/control) "xz" = ( /obj/structure/table/wood/fancy, /obj/item/storage/photo_album, @@ -8067,7 +8196,7 @@ /area/centcom/central_command_areas/control) "xE" = ( /obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "xF" = ( /obj/structure/bookcase/random/reference, @@ -8079,6 +8208,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/control) +"xK" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "xN" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, @@ -8099,13 +8232,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron, /area/centcom/central_command_areas/ferry) -"xR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "xS" = ( /obj/machinery/button/door/indestructible{ id = "XCCsec1"; @@ -8131,7 +8257,7 @@ /obj/structure/railing{ dir = 5 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "xV" = ( /obj/structure/chair/office{ @@ -8210,7 +8336,7 @@ /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) "yg" = ( -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "yh" = ( /obj/structure/table/wood, @@ -8238,6 +8364,14 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"yk" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/ert_spawn, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "yn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum, @@ -8257,7 +8391,7 @@ /area/centcom/central_command_areas/ferry) "yq" = ( /obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "yr" = ( /obj/machinery/door/airlock/centcom{ @@ -8280,7 +8414,8 @@ /area/centcom/syndicate_mothership/control) "yu" = ( /obj/machinery/light/cold/directional/west, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "yw" = ( /turf/closed/indestructible/fakedoor{ @@ -8313,7 +8448,7 @@ pixel_x = -6; pixel_y = 6 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "yB" = ( /obj/effect/turf_decal/tile/blue{ @@ -8411,7 +8546,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "yS" = ( /obj/structure/table/reinforced, @@ -8458,6 +8593,14 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"yX" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "yY" = ( /obj/structure/chair, /obj/effect/landmark/thunderdome/observe, @@ -8475,27 +8618,6 @@ }, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"za" = ( -/obj/effect/turf_decal/siding/wideplating{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wideplating{ - dir = 8 - }, -/obj/machinery/door/airlock/titanium{ - name = "Experiments Wing Decontamination" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/iron/smooth_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "zb" = ( /obj/machinery/computer/med_data{ dir = 4 @@ -8626,16 +8748,23 @@ }, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"zv" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/turf/open/floor/catwalk_floor/iron_dark, -/area/centcom/syndicate_mothership/control) "zw" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/reinforced/centcom, /area/centcom/tdome/observation) +"zx" = ( +/obj/structure/table/glass/plasmaglass, +/obj/item/plunger{ + pixel_x = -9; + pixel_y = 15 + }, +/obj/item/reagent_containers/dropper{ + pixel_x = 5; + pixel_y = 14 + }, +/obj/structure/noticeboard/directional/west, +/turf/open/floor/mineral/titanium/tiled/yellow, +/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "zz" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -8651,13 +8780,6 @@ /obj/structure/flora/ausbushes/genericbush, /turf/open/floor/grass, /area/centcom/tdome/administration) -"zB" = ( -/obj/structure/sign/poster/contraband/c20r{ - pixel_y = -32 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) "zC" = ( /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -8670,7 +8792,7 @@ /obj/structure/railing/corner{ dir = 1 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "zE" = ( /obj/effect/turf_decal/tile/brown{ @@ -8750,7 +8872,7 @@ "zL" = ( /obj/structure/flora/grass/both, /obj/structure/flora/rock/icy, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "zM" = ( /obj/effect/turf_decal/tile/brown{ @@ -8779,6 +8901,11 @@ }, /turf/open/floor/grass, /area/centcom/wizard_station) +"zR" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin) "zS" = ( /obj/structure/table/reinforced, /obj/item/food/grown/tea/astra{ @@ -8852,7 +8979,7 @@ /obj/structure/railing{ dir = 9 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "zZ" = ( /obj/effect/turf_decal/tile/brown{ @@ -8861,21 +8988,6 @@ /obj/effect/turf_decal/tile/brown, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/three) -"Aa" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/computer/monitor/secret{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/status_display/evac/directional/south, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) "Ab" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -8983,7 +9095,6 @@ /area/centcom/central_command_areas/control) "Aq" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -8992,13 +9103,6 @@ }, /turf/open/floor/iron/white, /area/centcom/central_command_areas/control) -"Ar" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/closed/indestructible/syndicate, -/area/centcom/syndicate_mothership/control) "As" = ( /obj/machinery/computer/communications{ dir = 8 @@ -9135,21 +9239,22 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/wood, /area/centcom/central_command_areas/admin) -"AL" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/ert_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "AM" = ( /obj/structure/railing{ dir = 1 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) +"AN" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "AO" = ( /obj/machinery/computer/communications{ dir = 8 @@ -9161,14 +9266,15 @@ /obj/structure/sign/poster/contraband/masked_men{ pixel_x = 32 }, -/obj/machinery/chem_dispenser/fullupgrade, +/obj/machinery/chem_dispenser, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) "AQ" = ( /obj/structure/chair/office/light{ dir = 8 }, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "AR" = ( /obj/machinery/light/cold/directional/south, @@ -9176,14 +9282,17 @@ dir = 8 }, /area/centcom/syndicate_mothership/control) +"AS" = ( +/obj/item/kirbyplants/random, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "AT" = ( /obj/structure/sign/departments/medbay/alt, /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/control) "AU" = ( -/obj/machinery/computer/operating{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -9284,8 +9393,12 @@ /area/centcom/tdome/administration) "Bk" = ( /obj/machinery/vending/clothing, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) +"Bl" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space/nearstation) "Bm" = ( /obj/structure/reagent_dispensers/fueltank, /obj/item/weldingtool/experimental, @@ -9460,14 +9573,14 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ +/obj/item/reagent_containers/glass/bottle/dylovene{ pixel_x = -3 }, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ +/obj/item/reagent_containers/glass/bottle/dylovene{ pixel_x = 6; pixel_y = 8 }, @@ -9625,6 +9738,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"BX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "Ca" = ( /obj/item/kirbyplants{ icon_state = "plant-22" @@ -9696,7 +9814,29 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron, +/obj/structure/overfloor_catwalk/iron, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"Cl" = ( +/obj/effect/turf_decal/siding/wideplating{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wideplating{ + dir = 8 + }, +/obj/machinery/door/airlock/titanium{ + name = "Experiments Wing Decontamination" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/iron/smooth_half{ + dir = 8 + }, /area/centcom/syndicate_mothership/control) "Cm" = ( /obj/structure/closet/crate/freezer{ @@ -9782,7 +9922,7 @@ /obj/structure/flora/tree/dead, /obj/structure/flora/grass/both, /obj/structure/railing, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Cv" = ( /obj/structure/flora/tree/pine, @@ -9791,7 +9931,7 @@ set_cap = 1; set_luminosity = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Cw" = ( /obj/effect/turf_decal/siding/wideplating{ @@ -9851,19 +9991,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) -"CG" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/door/airlock/highsecurity{ - name = "Sky Bridge" - }, -/obj/structure/cable, -/turf/open/floor/iron/textured_large, -/area/centcom/syndicate_mothership/control) "CH" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -9926,6 +10053,27 @@ "CN" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"CO" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/obj/structure/table/reinforced, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/iron/fifty, +/obj/item/stack/sheet/plasteel{ + amount = 15 + }, +/obj/item/stack/sheet/rglass{ + amount = 50; + pixel_x = 2; + pixel_y = -2 + }, +/obj/item/stack/rods/fifty, +/obj/item/stack/cable_coil, +/obj/item/screwdriver/power, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) "CP" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -9937,7 +10085,8 @@ /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bombthreat) "CQ" = ( -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "CR" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -9949,12 +10098,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"CU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "CV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/grimy, @@ -9970,7 +10113,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "CY" = ( /obj/structure/chair{ @@ -9990,6 +10133,34 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) +"Da" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) +"Db" = ( +/obj/effect/turf_decal/tile/red/half{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half{ + dir = 8 + }, +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/structure/closet/syndicate/personal, +/obj/structure/sign/poster/contraband/gorlex_recruitment{ + pixel_y = 32 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark/textured_half{ + dir = 8 + }, +/area/centcom/syndicate_mothership/control) "Dd" = ( /obj/machinery/door/window/survival_pod{ dir = 8; @@ -10032,7 +10203,8 @@ /obj/structure/sign/poster/contraband/busty_backdoor_xeno_babes_6{ pixel_x = 32 }, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "Di" = ( /turf/closed/indestructible/reinforced/centcom, @@ -10041,11 +10213,6 @@ /obj/structure/sign/nanotrasen, /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/prison/cells) -"Dk" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin) "Dl" = ( /obj/effect/turf_decal/siding/wood{ dir = 1 @@ -10053,18 +10220,7 @@ /obj/structure/chair/wood{ dir = 4 }, -/turf/open/floor/wood/tile, -/area/centcom/central_command_areas/holding) -"Dn" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/door/airlock/wood{ - name = "Bar" - }, -/obj/machinery/duct, -/turf/open/floor/iron/sepia, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Do" = ( /obj/structure/railing/corner{ @@ -10072,7 +10228,7 @@ }, /obj/structure/flora/tree/dead, /obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Dp" = ( /obj/structure/table/reinforced, @@ -10089,10 +10245,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/control) -"Dr" = ( -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) "Ds" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -10419,7 +10571,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "Es" = ( /obj/effect/light_emitter{ @@ -10448,12 +10600,6 @@ /obj/structure/fence, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"Ey" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) "Ez" = ( /obj/structure/table/reinforced, /obj/item/restraints/handcuffs/cable/zipties, @@ -10510,10 +10656,6 @@ dir = 4 }, /area/centcom/syndicate_mothership/expansion_bombthreat) -"EG" = ( -/obj/machinery/chem_heater/withbuffer, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "EH" = ( /obj/machinery/igniter/incinerator_ordmix{ id = "syn_ordmix_igniter" @@ -10591,17 +10733,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/lava/plasma/ice_moon, -/area/centcom/syndicate_mothership/control) -"ER" = ( -/obj/machinery/camera/autoname/directional/north{ - network = list("nukie") - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron_smooth, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "ES" = ( /obj/structure/sign/poster/contraband/lamarr{ @@ -10611,15 +10743,6 @@ dir = 1 }, /area/centcom/syndicate_mothership/control) -"ET" = ( -/obj/machinery/door/airlock/titanium{ - name = "Restroom" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "EU" = ( /obj/structure/chair/stool/directional/south, /obj/structure/sign/map/left{ @@ -10628,7 +10751,7 @@ pixel_y = 32 }, /obj/effect/landmark/start/nukeop, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "EV" = ( /obj/structure/extinguisher_cabinet/directional/south, @@ -10728,7 +10851,7 @@ /obj/structure/railing{ dir = 1 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "Fj" = ( /obj/machinery/door/firedoor, @@ -10797,18 +10920,6 @@ /obj/item/pen, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) -"Ft" = ( -/obj/structure/table/reinforced, -/obj/item/paper/fluff/stations/centcom/disk_memo{ - pixel_x = -6; - pixel_y = -7 - }, -/obj/item/taperecorder{ - pixel_y = 15 - }, -/obj/item/stack/spacecash/c50, -/turf/open/floor/carpet, -/area/centcom/syndicate_mothership/control) "Fv" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom" @@ -10822,7 +10933,7 @@ dir = 8 }, /obj/machinery/light/small/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "Fx" = ( /obj/structure/lattice/catwalk, @@ -10830,7 +10941,7 @@ /obj/structure/railing{ dir = 9 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "Fy" = ( /obj/structure/chair/stool/directional/south, @@ -10841,7 +10952,7 @@ /area/centcom/syndicate_mothership/control) "Fz" = ( /obj/structure/railing, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "FA" = ( /obj/effect/turf_decal/tile/yellow/half{ @@ -10938,6 +11049,11 @@ /obj/machinery/hydroponics/constructable, /turf/open/floor/mineral/titanium/tiled, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"FO" = ( +/obj/item/kirbyplants/random, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "FP" = ( /obj/structure/window/reinforced/survival_pod{ name = "Tinted Window"; @@ -10963,10 +11079,30 @@ /obj/structure/flora/grass/both, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) +"FS" = ( +/obj/item/clothing/shoes/galoshes{ + pixel_y = -8 + }, +/obj/item/storage/belt/janitor{ + pixel_x = 2; + pixel_y = -4 + }, +/obj/item/watertank/janitor{ + pixel_x = 1; + pixel_y = 3 + }, +/obj/item/pushbroom{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, +/area/centcom/central_command_areas/holding) "FT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron, +/obj/structure/overfloor_catwalk/iron, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "FU" = ( /obj/effect/turf_decal/siding/wood{ @@ -10987,7 +11123,6 @@ /turf/open/floor/stone, /area/centcom/central_command_areas/holding) "FX" = ( -/obj/machinery/computer/auxiliary_base/directional/north, /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/radio/headset/headset_cent, @@ -11050,6 +11185,10 @@ /obj/structure/flora/rock/pile, /turf/open/misc/asteroid/basalt/safe_air, /area/centcom/central_command_areas/holding) +"Ge" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "Gf" = ( /obj/machinery/firealarm/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump{ @@ -11057,6 +11196,10 @@ }, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/admin) +"Gh" = ( +/obj/structure/cable/smart_cable/color/yellow, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "Gi" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 6 @@ -11133,20 +11276,12 @@ }, /turf/open/lava, /area/centcom/wizard_station) -"Gs" = ( -/obj/machinery/power/smes/magical, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/light/directional/north, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) "Gt" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 }, /obj/machinery/vending/hydronutrients, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Gu" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, @@ -11204,27 +11339,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"GB" = ( -/obj/machinery/power/apc/auto_name/directional/west, -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table/reinforced, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/iron/fifty, -/obj/item/stack/sheet/plasteel{ - amount = 15 - }, -/obj/item/stack/sheet/rglass{ - amount = 50; - pixel_x = 2; - pixel_y = -2 - }, -/obj/item/stack/rods/fifty, -/obj/item/stack/cable_coil, -/obj/item/screwdriver/power, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin/storage) "GC" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -11243,16 +11357,6 @@ /obj/structure/flora/grass/both, /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) -"GE" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) "GH" = ( /obj/effect/turf_decal/siding/wideplating{ dir = 8 @@ -11273,13 +11377,9 @@ /obj/effect/mapping_helpers/paint_wall/centcom, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation) -"GK" = ( -/obj/structure/cable, -/turf/closed/indestructible/syndicate, -/area/centcom/syndicate_mothership/control) "GM" = ( /obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/basalt/wasteland/safe_air, +/turf/open/misc/asteroid/basalt/safe_air, /area/centcom/central_command_areas/holding) "GN" = ( /obj/structure/table/reinforced, @@ -11294,6 +11394,13 @@ /obj/structure/closet/crate/cardboard/mothic, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"GP" = ( +/obj/structure/sign/poster/contraband/c20r{ + pixel_y = -32 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/smooth, +/area/centcom/syndicate_mothership/control) "GQ" = ( /obj/structure/railing, /turf/open/floor/iron/stairs/old{ @@ -11301,12 +11408,19 @@ temperature = 2.7 }, /area/centcom/syndicate_mothership) +"GR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "GS" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 }, /obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "GT" = ( /obj/structure/table/reinforced, @@ -11323,6 +11437,11 @@ }, /turf/open/floor/iron/dark/textured_large, /area/centcom/syndicate_mothership/control) +"GV" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "GW" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -11440,16 +11559,6 @@ name = "plating" }, /area/centcom/tdome/observation) -"Hn" = ( -/obj/structure/chair/sofa/bench/right{ - dir = 4 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "Ho" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/centcom{ @@ -11460,6 +11569,13 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/prison) +"Hp" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/opsglass, +/area/centcom/syndicate_mothership/control) "Hq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -11467,26 +11583,18 @@ /obj/effect/turf_decal/siding/purple, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"Hr" = ( -/obj/item/kirbyplants/random, -/obj/structure/cable, -/turf/open/floor/iron/smooth, -/area/centcom/syndicate_mothership/control) "Ht" = ( /obj/item/kirbyplants/random, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) -"Hu" = ( -/obj/item/kirbyplants/random, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "Hv" = ( /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/courtroom) "Hy" = ( /obj/machinery/recharge_station, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "Hz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -11506,7 +11614,17 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 9 }, -/turf/open/misc/ice/icemoon, +/turf/open/misc/ice, +/area/centcom/syndicate_mothership/control) +"HD" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/iron, /area/centcom/syndicate_mothership/control) "HE" = ( /obj/structure/flora/ausbushes/lavendergrass, @@ -11516,13 +11634,6 @@ /obj/structure/flora/ausbushes/palebush, /turf/open/misc/asteroid, /area/centcom/tdome/observation) -"HF" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "HG" = ( /obj/machinery/camera/autoname/directional/south{ network = list("nukie") @@ -11576,24 +11687,24 @@ "HN" = ( /turf/open/floor/mineral/titanium, /area/centcom/syndicate_mothership/control) -"HQ" = ( -/obj/structure/flora/rock/pile, -/turf/open/misc/asteroid/snow/icemoon, -/area/centcom/syndicate_mothership/control) -"HS" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/effect/turf_decal/siding/thinplating_new/dark{ +"HO" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/door/airlock/hatch{ - name = "Armoury" +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 4 +/obj/machinery/computer/monitor/secret{ + dir = 1 }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/status_display/evac/directional/south, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin/storage) +"HQ" = ( +/obj/structure/flora/rock/pile, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "HU" = ( /obj/effect/turf_decal/siding/wideplating/dark, @@ -11613,7 +11724,7 @@ /obj/machinery/camera/autoname/directional/east{ network = list("nukie") }, -/obj/machinery/chem_dispenser/mutagensaltpeter, +/obj/machinery/chem_dispenser/mini/mutagensaltpeter, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) "HW" = ( @@ -11743,12 +11854,20 @@ /obj/item/reagent_containers/glass/bucket, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) +"Im" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "In" = ( /obj/structure/flora/grass/both, /obj/structure/railing{ dir = 1 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Io" = ( /obj/structure/barricade/wooden, @@ -11770,9 +11889,6 @@ /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 4 }, -/obj/structure/sign/poster/contraband/the_big_gas_giant_truth{ - pixel_y = 32 - }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Ir" = ( @@ -11810,13 +11926,13 @@ /obj/machinery/camera/autoname/directional/east{ network = list("nukie") }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Iy" = ( /obj/item/kirbyplants{ icon_state = "plant-10" }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Iz" = ( /obj/machinery/door/poddoor{ @@ -11879,38 +11995,6 @@ }, /turf/open/floor/iron, /area/centcom/tdome/arena) -"IH" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 1 - }, -/obj/structure/table/glass/plasmaglass, -/obj/item/reagent_containers/syringe{ - pixel_x = -5; - pixel_y = 12 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = -2; - pixel_y = 13 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = 1; - pixel_y = 14 - }, -/obj/machinery/light/cold/directional/north, -/obj/item/reagent_containers/dropper{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/item/storage/box/monkeycubes{ - pixel_x = -6; - pixel_y = 5 - }, -/obj/item/reagent_containers/glass/bottle/formaldehyde{ - pixel_x = 8; - pixel_y = 4 - }, -/turf/open/floor/mineral/plastitanium/red, -/area/centcom/syndicate_mothership/expansion_bioterrorism) "II" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -12051,6 +12135,13 @@ }, /turf/open/floor/iron, /area/centcom/tdome/arena) +"Jf" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Jg" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/mapping_helpers/paint_wall/centcom, @@ -12090,19 +12181,17 @@ /obj/structure/railing{ dir = 10 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) -"Jm" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +"Jo" = ( +/obj/machinery/door/airlock/centcom{ + name = "Briefing Room"; + req_access_txt = "101" }, -/obj/machinery/light/small/directional/south, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, -/area/centcom/syndicate_mothership/control) +/area/centcom/central_command_areas/ferry) "Jp" = ( /obj/machinery/vending/cigarette/syndicate, /turf/open/floor/mineral/titanium, @@ -12118,7 +12207,7 @@ dir = 8 }, /obj/structure/chair/stool/directional/east, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "Js" = ( /obj/effect/turf_decal/tile/red{ @@ -12263,15 +12352,16 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"JR" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/turf/open/floor/mineral/titanium, -/area/centcom/syndicate_mothership/control) +"JS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/wood, +/area/centcom/central_command_areas/admin) "JT" = ( /obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "JU" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -12347,20 +12437,6 @@ /obj/structure/table/reinforced, /turf/open/floor/iron/grimy, /area/centcom/central_command_areas/briefing) -"Kf" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Storage"; - req_access_txt = "106" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin) "Kg" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -12370,7 +12446,7 @@ /turf/open/misc/asteroid/snow/airless, /area/centcom/syndicate_mothership) "Ki" = ( -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "Kk" = ( /obj/docking_port/stationary{ @@ -12384,13 +12460,6 @@ }, /turf/open/space/basic, /area/space) -"Kl" = ( -/obj/machinery/camera/autoname/directional/south{ - network = list("nukie") - }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) "Km" = ( /obj/machinery/light/directional/west, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -12475,15 +12544,33 @@ /area/centcom/syndicate_mothership/expansion_bioterrorism) "Kx" = ( /obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) +"Ky" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, +/area/centcom/central_command_areas/holding) "Kz" = ( /obj/item/kirbyplants{ icon_state = "plant-10" }, /obj/machinery/light/directional/south, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) +"KB" = ( +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "KC" = ( /obj/machinery/status_display/evac/directional/south, /turf/open/floor/wood, @@ -12602,22 +12689,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/control) -"KX" = ( -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wideplating/dark{ - dir = 4 - }, -/obj/machinery/door/airlock/highsecurity{ - name = "Sky Bridge" - }, -/obj/structure/cable, -/turf/open/floor/iron/textured_large, -/area/centcom/syndicate_mothership/control) "KY" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 8 @@ -12756,6 +12827,11 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/centcom/central_command_areas/evacuation/ship) +"Lx" = ( +/obj/effect/turf_decal/delivery, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "Ly" = ( /obj/machinery/door/airlock/titanium, /turf/open/floor/mineral/titanium, @@ -12898,6 +12974,14 @@ /obj/structure/speaking_tile, /turf/closed/mineral/ash_rock, /area/awaymission/errorroom) +"Ma" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "Mb" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/siding/red/corner{ @@ -13063,13 +13147,6 @@ }, /turf/open/floor/iron, /area/centcom/syndicate_mothership/control) -"My" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Mz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/effect/mapping_helpers/paint_wall/centcom, @@ -13116,7 +13193,7 @@ }, /obj/structure/chair/stool/directional/east, /obj/effect/landmark/start/nukeop, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "MH" = ( /obj/effect/turf_decal/siding/wood{ @@ -13136,12 +13213,6 @@ /obj/structure/reagent_dispensers/beerkeg, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supplypod) -"MJ" = ( -/obj/structure/chair/office, -/obj/effect/landmark/ert_spawn, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "MK" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -13169,6 +13240,11 @@ name = "Guest House Entrance" }, /area/centcom/central_command_areas/holding) +"MP" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/armory) "MQ" = ( /obj/structure/closet/secure_closet/courtroom, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -13195,7 +13271,7 @@ set_cap = 1; set_luminosity = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "MU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -13236,28 +13312,12 @@ /obj/structure/table/reinforced/rglass, /obj/item/book/manual/hydroponics_pod_people, /obj/item/paper/guides/jobs/hydroponics, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "MY" = ( /obj/structure/sign/nanotrasen, /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/briefing) -"MZ" = ( -/obj/effect/turf_decal/siding/thinplating_new/dark{ - dir = 8 - }, -/obj/structure/table/glass/plasmaglass, -/obj/item/folder/white, -/obj/item/pen{ - pixel_x = 6; - pixel_y = 5 - }, -/obj/machinery/light/cold/directional/west, -/obj/item/stack/spacecash/c200{ - pixel_y = 17 - }, -/turf/open/floor/mineral/plastitanium, -/area/centcom/syndicate_mothership/control) "Na" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/mineral/plastitanium/red, @@ -13315,10 +13375,6 @@ /obj/machinery/monkey_recycler, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bioterrorism) -"Nk" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_smooth, -/area/centcom/syndicate_mothership/control) "Nl" = ( /obj/machinery/light/directional/south, /obj/effect/turf_decal/tile/neutral{ @@ -13347,7 +13403,7 @@ /obj/structure/railing{ dir = 6 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "Np" = ( /obj/structure/bookcase/random, @@ -13355,16 +13411,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) -"Nq" = ( -/obj/structure/chair/office{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Nr" = ( /obj/structure/table/reinforced, /obj/item/folder/red, @@ -13385,7 +13431,7 @@ /obj/structure/railing{ dir = 6 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "Nt" = ( /obj/structure/filingcabinet/medical, @@ -13413,21 +13459,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"Ny" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "NB" = ( /obj/structure/chair/greyscale{ dir = 4 }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership) -"NC" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "ND" = ( /obj/structure/table, /obj/structure/bedsheetbin, @@ -13448,7 +13485,7 @@ /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "NG" = ( /obj/machinery/door/airlock/centcom{ @@ -13470,6 +13507,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/observation) +"NI" = ( +/obj/machinery/camera/autoname/directional/north{ + network = list("nukie") + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "NJ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/status_display/ai/directional/south, @@ -13480,17 +13525,8 @@ /obj/effect/turf_decal/weather/snow/corner{ dir = 6 }, -/turf/open/misc/ice/icemoon, +/turf/open/misc/ice, /area/centcom/syndicate_mothership/control) -"NL" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/power/apc/auto_name/directional/south, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "NM" = ( /obj/structure/closet/crate/bin, /obj/machinery/light/directional/south, @@ -13550,7 +13586,7 @@ /area/centcom/central_command_areas/courtroom) "NX" = ( /obj/machinery/light/directional/west, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "NZ" = ( /obj/structure/table/wood, @@ -13585,10 +13621,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) -"Od" = ( -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Oe" = ( /obj/structure/closet/crate/bin, /obj/item/clothing/suit/xenos, @@ -13599,7 +13631,7 @@ /obj/structure/sign/painting/library{ pixel_y = 32 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Of" = ( /obj/item/clipboard, @@ -13713,29 +13745,12 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/two) -"Or" = ( -/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/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/machinery/meter, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) "Os" = ( /obj/structure/fluff/tram_rail, /obj/structure/fluff/tram_rail{ pixel_y = 17 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Ot" = ( /obj/structure/table/reinforced, @@ -13761,42 +13776,12 @@ pixel_y = -14 }, /obj/item/cultivator, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) -"Ow" = ( -/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/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) "Ox" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/central_command_areas/fore) -"Oy" = ( -/obj/effect/turf_decal/siding/wideplating, -/obj/effect/turf_decal/siding/wideplating{ - dir = 1 - }, -/obj/machinery/door/airlock/hatch{ - name = "General Quarters" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/iron/dark/textured_half, -/area/centcom/syndicate_mothership/control) "Oz" = ( /obj/machinery/door/airlock/external/ruin, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -13807,10 +13792,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron/cafeteria, /area/centcom/central_command_areas/holding) -"OC" = ( -/obj/structure/flora/rock/pile, -/turf/open/misc/asteroid/basalt/wasteland/safe_air, -/area/centcom/central_command_areas/holding) "OD" = ( /obj/machinery/microwave{ desc = "Cooks and boils stuff, somehow."; @@ -13860,23 +13841,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) -"OI" = ( -/obj/machinery/chem_mass_spec, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) -"OJ" = ( -/obj/machinery/door/airlock/external/ruin{ - req_access_txt = "150" - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) "OL" = ( /turf/closed/indestructible/rock, /area/centcom/central_command_areas/holding) @@ -13905,15 +13869,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/one) -"OQ" = ( -/obj/machinery/door/airlock/centcom{ - name = "Briefing Room"; - req_access_txt = "101" - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "OR" = ( /obj/machinery/computer/secure_data{ dir = 1 @@ -13956,25 +13911,6 @@ }, /turf/open/floor/iron/white, /area/centcom/tdome/observation) -"OW" = ( -/obj/structure/chair/sofa/bench{ - dir = 4 - }, -/obj/machinery/light/cold/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/titanium, -/area/centcom/syndicate_mothership/control) -"OX" = ( -/obj/structure/chair/office{ - dir = 1 - }, -/obj/effect/landmark/ert_spawn, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "OY" = ( /obj/item/storage/fancy/donut_box, /obj/structure/table/reinforced, @@ -13988,6 +13924,24 @@ }, /turf/open/floor/grass, /area/centcom/central_command_areas/holding) +"Pa" = ( +/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/smart/manifold4w/supply/visible{ + dir = 1 + }, +/obj/machinery/meter, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/admin/storage) "Pb" = ( /obj/structure/fence/cut/large, /turf/open/misc/asteroid/snow/airless, @@ -13999,7 +13953,7 @@ /area/centcom/tdome/observation) "Pd" = ( /obj/structure/flora/tree/pine, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Pe" = ( /obj/structure/table/wood, @@ -14032,7 +13986,6 @@ /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) "Pg" = ( -/obj/machinery/computer/auxiliary_base/directional/north, /obj/structure/table/reinforced, /obj/item/clipboard, /obj/item/folder/yellow, @@ -14044,7 +13997,7 @@ /obj/structure/flora/rock/icy{ pixel_x = -7 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Pi" = ( /obj/effect/turf_decal/tile/yellow/half, @@ -14145,12 +14098,6 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod/loading/four) -"Pw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/duct, -/obj/item/clothing/suit/apron, -/turf/open/floor/catwalk_floor, -/area/centcom/central_command_areas/holding) "Px" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, @@ -14174,6 +14121,22 @@ /obj/item/paper/pamphlet/centcom/visitor_info, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) +"PA" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) +"PB" = ( +/obj/structure/chair/sofa/bench/left{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "PC" = ( /obj/structure/table/wood, /obj/effect/turf_decal/siding/wood, @@ -14183,7 +14146,7 @@ desc = "A polaroid camera with extra capacity for social media marketing."; name = "Professional camera" }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "PD" = ( /obj/effect/turf_decal/tile/yellow/half{ @@ -14232,8 +14195,15 @@ }, /obj/item/reagent_containers/glass/bucket, /obj/effect/turf_decal/siding/wood, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) +"PJ" = ( +/obj/structure/chair/comfy/black, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/grimy, +/area/centcom/central_command_areas/admin) "PK" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -14249,13 +14219,6 @@ /obj/structure/flora/ausbushes/palebush, /turf/open/misc/asteroid, /area/centcom/central_command_areas/evacuation) -"PM" = ( -/obj/structure/chair/office, -/obj/effect/landmark/ert_spawn, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/briefing) "PN" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/barman_recipes, @@ -14268,7 +14231,8 @@ "PO" = ( /obj/structure/kitchenspike, /obj/item/gun/magic/hook, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "PP" = ( /obj/structure/closet/secure_closet/freezer/fridge/open, @@ -14335,9 +14299,8 @@ /obj/structure/railing{ dir = 4 }, -/turf/open/floor/catwalk_floor/iron_smooth{ - temperature = 2.7 - }, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership) "PV" = ( /obj/effect/turf_decal/stripes/line{ @@ -14368,7 +14331,7 @@ /area/centcom/tdome/observation) "PZ" = ( /obj/machinery/light/directional/north, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Qa" = ( /obj/structure/table/wood, @@ -14385,6 +14348,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"Qd" = ( +/obj/effect/turf_decal/siding/thinplating_new/dark, +/obj/effect/turf_decal/siding/thinplating_new/dark{ + dir = 1 + }, +/obj/machinery/door/airlock/hatch{ + name = "Armoury" + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/turf/open/floor/iron/smooth_half{ + dir = 4 + }, +/area/centcom/syndicate_mothership/control) "Qe" = ( /turf/open/ai_visible, /area/centcom/ai_multicam_room) @@ -14428,7 +14406,7 @@ /area/centcom/central_command_areas/control) "Ql" = ( /obj/machinery/light/small/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Qm" = ( /obj/effect/turf_decal/siding/wood{ @@ -14475,7 +14453,7 @@ "Qs" = ( /obj/structure/flora/tree/dead, /obj/structure/flora/grass/both, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Qu" = ( /obj/structure/window/paperframe{ @@ -14539,7 +14517,8 @@ /obj/item/watertank{ pixel_x = -10 }, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "QC" = ( /turf/closed/indestructible/reinforced/centcom, @@ -14550,11 +14529,24 @@ /obj/item/clothing/under/costume/geisha, /obj/item/clothing/under/costume/kilt, /obj/item/clothing/under/costume/roman, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) +"QF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) +"QG" = ( +/obj/machinery/door/poddoor/ert, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/armory) "QH" = ( /obj/item/toy/figure/syndie, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "QI" = ( /obj/structure/lattice/catwalk, @@ -14567,7 +14559,7 @@ /obj/structure/railing{ dir = 5 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "QJ" = ( /obj/effect/turf_decal/siding/wood{ @@ -14640,7 +14632,7 @@ icon_state = "map-right-MS"; pixel_y = 32 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "QU" = ( /obj/structure/table/wood, @@ -14675,7 +14667,7 @@ /area/centcom/syndicate_mothership) "QX" = ( /obj/item/stack/spacecash/c20, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "QY" = ( /obj/item/storage/box/handcuffs, @@ -14708,13 +14700,14 @@ /area/centcom/tdome/observation) "Rc" = ( /obj/machinery/light/small/directional/east, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "Rd" = ( /obj/structure/railing{ dir = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Re" = ( /obj/structure/table/reinforced/plasmarglass, @@ -14740,7 +14733,7 @@ force = 30 }, /obj/machinery/light/small/directional/south, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Rg" = ( /obj/item/kirbyplants{ @@ -14841,8 +14834,14 @@ pixel_x = 9; pixel_y = 9 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) +"Rq" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/open/floor/mineral/titanium, +/area/centcom/syndicate_mothership/control) "Rr" = ( /obj/item/kirbyplants{ icon_state = "plant-21" @@ -14874,7 +14873,7 @@ /obj/structure/window/paperframe{ can_atmos_pass = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Rw" = ( /obj/structure/table/wood, @@ -14974,21 +14973,16 @@ /obj/machinery/camera/autoname/directional/west{ network = list("nukie") }, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "RK" = ( /turf/closed/indestructible/opsglass, /area/centcom/syndicate_mothership/expansion_bioterrorism) "RL" = ( /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) -"RM" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/armory) "RN" = ( /turf/open/floor/iron/stairs/medium, /area/centcom/central_command_areas/holding) @@ -15085,7 +15079,7 @@ /obj/structure/railing{ dir = 6 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Sd" = ( /turf/open/floor/carpet/black, @@ -15219,7 +15213,8 @@ /obj/machinery/light/small/directional/north, /obj/structure/easel, /obj/item/canvas/twentythree_twentythree, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "Sz" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -15276,7 +15271,7 @@ /obj/structure/railing{ dir = 9 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "SL" = ( /obj/structure/rack, @@ -15290,7 +15285,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "SM" = ( /obj/item/kirbyplants{ @@ -15390,13 +15385,6 @@ dir = 4 }, /area/centcom/central_command_areas/holding) -"Tb" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/closed/indestructible/opsglass, -/area/centcom/syndicate_mothership/control) "Tc" = ( /obj/effect/turf_decal/tile/brown{ dir = 8 @@ -15454,7 +15442,7 @@ /obj/structure/chair/wood{ dir = 4 }, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Tf" = ( /obj/structure/closet/secure_closet/freezer/fridge/open{ @@ -15477,7 +15465,8 @@ layer = 5 }, /obj/item/food/grown/redbeet, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "Tg" = ( /obj/item/storage/briefcase{ @@ -15652,6 +15641,20 @@ dir = 4 }, /area/centcom/syndicate_mothership/control) +"TD" = ( +/obj/machinery/door/airlock/centcom{ + name = "Administrative Storage"; + req_access_txt = "106" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/admin) "TE" = ( /obj/structure/chair/comfy/brown{ color = "#596479"; @@ -15694,11 +15697,6 @@ }, /turf/open/floor/stone, /area/centcom/central_command_areas/holding) -"TK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/ferry) "TL" = ( /obj/item/mop, /obj/structure/sink/kitchen{ @@ -15707,7 +15705,8 @@ pixel_y = 4 }, /obj/item/reagent_containers/glass/bucket, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "TM" = ( /obj/effect/turf_decal/tile/yellow/half{ @@ -15738,7 +15737,7 @@ /obj/structure/railing{ dir = 10 }, -/turf/open/lava/plasma/ice_moon, +/turf/open/lava/plasma, /area/centcom/syndicate_mothership/control) "TO" = ( /obj/machinery/keycard_auth/directional/south, @@ -15758,6 +15757,17 @@ }, /turf/open/floor/iron/smooth_half, /area/centcom/syndicate_mothership/control) +"TR" = ( +/obj/structure/chair/sofa/bench/right{ + dir = 4 + }, +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "TS" = ( /obj/structure/table/wood, /obj/item/dice/d20{ @@ -15810,28 +15820,6 @@ /obj/machinery/light/directional/west, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"TY" = ( -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron, -/area/centcom/syndicate_mothership/control) -"Ub" = ( -/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/smart/manifold4w/supply/visible{ - dir = 1 - }, -/obj/machinery/meter, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/centcom/central_command_areas/admin/storage) "Uc" = ( /obj/machinery/computer/camera_advanced/xenobio, /obj/structure/noticeboard/directional/east, @@ -15850,11 +15838,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/evacuation) -"Ug" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/components/tank/nitrogen, -/turf/open/space/basic, -/area/space/nearstation) "Uh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 @@ -15961,7 +15944,7 @@ "Uq" = ( /obj/structure/flora/grass/both, /obj/structure/flora/tree/dead, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Ur" = ( /obj/structure/closet/secure_closet/personal/cabinet, @@ -16001,14 +15984,14 @@ pixel_x = 2; pixel_y = 5 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "Uu" = ( /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership) "Uv" = ( /obj/structure/table/reinforced, -/obj/item/reagent_containers/glass/bottle/multiver{ +/obj/item/reagent_containers/glass/bottle/dylovene{ pixel_x = 6 }, /obj/item/reagent_containers/glass/bottle/epinephrine{ @@ -16025,14 +16008,14 @@ "Ux" = ( /obj/structure/chair/stool/directional/west, /obj/effect/landmark/start/nukeop, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "Uy" = ( /turf/open/misc/beach/sand, /area/centcom/central_command_areas/holding) "Uz" = ( /obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "UA" = ( /obj/item/cardboard_cutout{ @@ -16052,13 +16035,20 @@ name = "BrewMaster 2199"; pixel_x = -4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, +/area/centcom/central_command_areas/holding) +"UD" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/clothing/suit/apron, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "UE" = ( /obj/structure/table/reinforced/plastitaniumglass, /obj/item/paper_bin, /obj/item/pen/fountain, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "UF" = ( /obj/structure/table, @@ -16121,6 +16111,11 @@ }, /turf/open/floor/iron, /area/centcom/central_command_areas/supplypod) +"UN" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, +/area/centcom/syndicate_mothership/control) "UO" = ( /obj/machinery/door/airlock/centcom{ name = "CentCom Security"; @@ -16340,14 +16335,6 @@ }, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"Vp" = ( -/obj/structure/chair/office{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "Vq" = ( /obj/machinery/firealarm/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -16404,13 +16391,6 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/supply) -"Vz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) "VB" = ( /obj/structure/table/reinforced, /obj/item/clipboard, @@ -16420,6 +16400,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/control) +"VD" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/stack/cable_coil/red, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, +/area/centcom/central_command_areas/holding) "VF" = ( /obj/machinery/computer/crew{ dir = 4 @@ -16446,7 +16432,8 @@ /area/centcom/syndicate_mothership/control) "VI" = ( /obj/machinery/autolathe, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "VJ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark, @@ -16481,12 +16468,6 @@ /obj/item/pen/fountain, /turf/open/floor/carpet/black, /area/centcom/central_command_areas/holding) -"VO" = ( -/obj/machinery/door/poddoor/ert, -/obj/effect/turf_decal/delivery, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/armory) "VP" = ( /obj/effect/turf_decal/tile/brown, /obj/effect/turf_decal/tile/brown{ @@ -16659,7 +16640,7 @@ /obj/structure/chair/wood{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Wf" = ( /obj/structure/sink{ @@ -16683,6 +16664,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/courtroom) +"Wk" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/syndicate_mothership/control) "Wl" = ( /obj/structure/table/wood, /obj/machinery/recharger, @@ -16806,12 +16795,6 @@ /obj/machinery/washing_machine, /turf/open/floor/iron/sepia, /area/centcom/central_command_areas/holding) -"WA" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/wood/large, -/area/centcom/central_command_areas/holding) "WB" = ( /obj/structure/chair/wood{ dir = 4 @@ -16872,7 +16855,7 @@ dir = 4 }, /obj/machinery/biogenerator, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "WI" = ( /obj/structure/table/wood, @@ -16985,16 +16968,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/centcom/tdome/arena) -"WU" = ( -/obj/machinery/door/airlock/centcom{ - name = "Administrative Office"; - req_access_txt = "109" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable, -/turf/open/floor/iron, -/area/centcom/central_command_areas/admin) "WV" = ( /obj/effect/light_emitter{ set_cap = 1; @@ -17022,7 +16995,7 @@ /area/centcom/central_command_areas/ferry) "WZ" = ( /obj/machinery/light/small/directional/north, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Xb" = ( /obj/machinery/computer/security{ @@ -17136,11 +17109,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/centcom/tdome/administration) -"Xo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Xp" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -17291,13 +17259,6 @@ }, /turf/open/floor/mineral/titanium/tiled/yellow, /area/centcom/syndicate_mothership/expansion_bombthreat) -"XH" = ( -/obj/item/kirbyplants{ - icon_state = "plant-10" - }, -/obj/machinery/duct, -/turf/open/floor/carpet/black, -/area/centcom/central_command_areas/holding) "XI" = ( /obj/structure/closet, /obj/item/storage/backpack/duffelbag/med/surgery, @@ -17356,13 +17317,29 @@ pixel_x = -3; pixel_y = 3 }, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "XO" = ( /obj/structure/table/wood/fancy/royalblue, /obj/item/toy/toy_xeno, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) +"XP" = ( +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wideplating/dark{ + dir = 4 + }, +/obj/machinery/door/airlock/highsecurity{ + name = "Sky Bridge" + }, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/textured_large, +/area/centcom/syndicate_mothership/control) "XQ" = ( /obj/machinery/computer/crew{ dir = 1 @@ -17375,7 +17352,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "XS" = ( /turf/open/floor/mineral/plastitanium/red, @@ -17428,7 +17405,7 @@ }, /obj/structure/table/reinforced/plasmarglass, /obj/item/reagent_containers/glass/bottle/epinephrine, -/obj/item/reagent_containers/glass/bottle/multiver{ +/obj/item/reagent_containers/glass/bottle/dylovene{ pixel_x = 6 }, /obj/item/reagent_containers/syringe{ @@ -17440,29 +17417,6 @@ /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/indestructible/syndicate, /area/centcom/syndicate_mothership/expansion_bombthreat) -"Yj" = ( -/obj/structure/chair/comfy/black, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, -/turf/open/floor/iron/grimy, -/area/centcom/central_command_areas/admin) -"Yk" = ( -/obj/effect/turf_decal/tile/red/half{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/half{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating_new/dark, -/obj/structure/closet/syndicate/personal, -/obj/structure/sign/poster/contraband/gorlex_recruitment{ - pixel_y = 32 - }, -/obj/structure/cable, -/turf/open/floor/iron/dark/textured_half{ - dir = 8 - }, -/area/centcom/syndicate_mothership/control) "Yl" = ( /obj/structure/flora/tree/dead, /turf/open/misc/asteroid/snow/airless, @@ -17478,13 +17432,6 @@ "Yn" = ( /turf/closed/indestructible/reinforced/centcom, /area/centcom/central_command_areas/supplypod) -"Yq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/wood, -/area/centcom/central_command_areas/admin) "Yr" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -17493,13 +17440,13 @@ /area/centcom/central_command_areas/admin) "Ys" = ( /obj/machinery/light/directional/east, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Yt" = ( /obj/structure/fence/cut/medium{ dir = 4 }, -/turf/open/misc/asteroid/snow/icemoon, +/turf/open/misc/asteroid/snow, /area/centcom/syndicate_mothership/control) "Yu" = ( /obj/structure/table/reinforced, @@ -17567,9 +17514,6 @@ /obj/structure/closet/cardboard, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) -"YC" = ( -/turf/open/floor/wood/large, -/area/centcom/central_command_areas/holding) "YD" = ( /obj/structure/table/wood, /obj/structure/reagent_dispensers/beerkeg, @@ -17582,17 +17526,17 @@ /obj/item/food/syndicake{ pixel_y = 3 }, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/syndicate_mothership/control) "YF" = ( /obj/machinery/gibber, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "YG" = ( /obj/structure/railing, -/turf/open/floor/catwalk_floor/iron_smooth{ - temperature = 2.7 - }, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership) "YI" = ( /obj/structure/sign/warning/nosmoking, @@ -17629,7 +17573,8 @@ dir = 4 }, /obj/machinery/light/directional/west, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "YN" = ( /obj/structure/table/reinforced, @@ -17748,7 +17693,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, /obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, -/turf/open/floor/catwalk_floor/iron_smooth, +/obj/structure/overfloor_catwalk/iron_smooth, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "Ze" = ( /obj/effect/turf_decal/tile/red, @@ -17852,11 +17798,12 @@ "Zn" = ( /obj/structure/table/wood/fancy/royalblack, /obj/item/storage/box/holy/follower, -/turf/open/floor/wood/large, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "Zo" = ( /obj/machinery/light/small/directional/west, -/turf/open/floor/catwalk_floor, +/obj/structure/overfloor_catwalk, +/turf/open/floor/plating, /area/centcom/central_command_areas/holding) "Zp" = ( /obj/effect/turf_decal/stripes/line{ @@ -17870,20 +17817,6 @@ }, /turf/open/floor/mineral/plastitanium, /area/centcom/syndicate_mothership/expansion_bombthreat) -"Zq" = ( -/obj/structure/table/glass/plasmaglass, -/obj/item/plunger{ - pixel_x = -9; - pixel_y = 15 - }, -/obj/item/construction/plumbing, -/obj/item/reagent_containers/dropper{ - pixel_x = 5; - pixel_y = 14 - }, -/obj/structure/noticeboard/directional/west, -/turf/open/floor/mineral/titanium/tiled/yellow, -/area/centcom/syndicate_mothership/expansion_chemicalwarfare) "Zr" = ( /obj/structure/table/wood, /obj/machinery/light/directional/south, @@ -17894,9 +17827,6 @@ /obj/machinery/shuttle_manipulator, /turf/open/floor/circuit/green, /area/centcom/central_command_areas/briefing) -"Zt" = ( -/turf/open/floor/wood/parquet, -/area/centcom/central_command_areas/holding) "Zu" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/machinery/light/directional/north, @@ -17930,7 +17860,8 @@ /area/centcom/central_command_areas/holding) "Zz" = ( /obj/machinery/vending/dinnerware, -/turf/open/floor/catwalk_floor/titanium, +/obj/structure/overfloor_catwalk/titanium, +/turf/open/floor/plating, /area/centcom/syndicate_mothership/control) "ZA" = ( /obj/structure/table/wood, @@ -17966,6 +17897,15 @@ /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/plating, /area/centcom/syndicate_mothership/expansion_bombthreat) +"ZD" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/effect/landmark/ert_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron/dark, +/area/centcom/central_command_areas/briefing) "ZE" = ( /obj/effect/landmark/error, /turf/open/misc/ashplanet/wateryrock, @@ -17979,12 +17919,19 @@ /obj/machinery/status_display/ai/directional/south, /turf/open/floor/iron/dark, /area/centcom/central_command_areas/admin) +"ZG" = ( +/obj/structure/cable/smart_cable/color/yellow, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/yellow/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/orange/hidden/layer5, +/turf/closed/indestructible/syndicate, +/area/centcom/syndicate_mothership/control) "ZH" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ dir = 4 }, -/turf/open/floor/plating/snowed/icemoon, +/turf/open/floor/plating/snowed, /area/centcom/syndicate_mothership/control) "ZI" = ( /obj/structure/chair/bronze{ @@ -17998,6 +17945,15 @@ /obj/structure/closet/crate/cardboard, /turf/open/floor/plating, /area/centcom/syndicate_mothership/control) +"ZK" = ( +/obj/machinery/door/airlock/centcom{ + name = "Administrative Office"; + req_access_txt = "109" + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/smart_cable/color/yellow, +/turf/open/floor/iron, +/area/centcom/central_command_areas/ferry) "ZM" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, @@ -18039,7 +17995,7 @@ /obj/structure/closet/crate/bin, /obj/item/camera_film, /obj/machinery/light/small/directional/west, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "ZS" = ( /obj/structure/table/reinforced, @@ -18091,12 +18047,12 @@ /area/centcom/central_command_areas/supply) "ZY" = ( /obj/machinery/vending/autodrobe, -/turf/open/floor/wood/parquet, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) "ZZ" = ( /obj/machinery/vending/hydroseeds, /obj/machinery/light/small/directional/south, -/turf/open/floor/wood/tile, +/turf/open/floor/wood, /area/centcom/central_command_areas/holding) (1,1,1) = {" @@ -23146,7 +23102,7 @@ kb nH Ue rp -Zq +zx Gx HY zX @@ -23401,7 +23357,7 @@ aa aa kb nH -dC +sA EN EN EN @@ -24183,7 +24139,7 @@ ng ac ng CN -IH +ah pS Gu JO @@ -24943,7 +24899,7 @@ aa aa kb nH -EG +EN EN kh EN @@ -25205,7 +25161,7 @@ pV AP Py Un -OI +EN we br Bq @@ -25219,7 +25175,7 @@ kv kv kv kv -Ug +Bl yN Mq kb @@ -25718,7 +25674,7 @@ ng VX XE od -MZ +dY Sr nz br @@ -27778,12 +27734,12 @@ bK qp bK ng -za +Cl ng ng mV DK -Ey +Rq Yz Yz Dd @@ -28035,12 +27991,12 @@ bK bK bK Ht -ny -Kl +Ma +aO ng ng ng -ET +qN ng ng ng @@ -28293,11 +28249,11 @@ Zd IP hk hk -Dr -Nk +xK +UN ng MB -Jm +Da Fd Mx HA @@ -28541,22 +28497,22 @@ lQ HN HN tY -ER -ny -ny -ny -Tb -ny +KB +Ma +Ma +Ma +Hp +Ma WW Ig aT hk -mA -Oy -GE -GE -TY -wT +vK +ro +HD +HD +PA +Wk pZ pZ nz @@ -28803,12 +28759,12 @@ Yd Yd Yd Kt -ny +Ma WW WW WW uS -Hu +AS ng nQ Ak @@ -29060,12 +29016,12 @@ Jr MG GS ng -Ar -iq -Nk -Nk -GK -GK +ZG +NI +UN +UN +Gh +Gh ng ng Ck @@ -29320,7 +29276,7 @@ ng BC WW WW -zB +GP ng hU ng @@ -29577,7 +29533,7 @@ ng Gl WW WW -Dr +xK Mg QB ng @@ -29834,7 +29790,7 @@ ng Ve WW WW -Hr +FO ng nP ng @@ -30091,7 +30047,7 @@ ng xI tB tB -GK +Gh ng ng ng @@ -30348,7 +30304,7 @@ nz xI YR YR -GK +Gh nz cp ng @@ -30605,7 +30561,7 @@ nz da YR YR -kg +og nz cp yq @@ -30862,7 +30818,7 @@ nz da YR YR -kg +og nz cp JT @@ -31119,7 +31075,7 @@ nz xI XM AR -GK +Gh nz cp ao @@ -31376,7 +31332,7 @@ nz xI gb EV -GK +Gh nz cp JT @@ -31633,7 +31589,7 @@ nz da YR YR -kg +og nz cp ao @@ -31890,7 +31846,7 @@ nz da YR YR -kg +og nz cp ao @@ -32147,7 +32103,7 @@ nz xI GZ HG -GK +Gh nz cp ao @@ -32404,7 +32360,7 @@ nz xI XM AR -GK +Gh nz cp sD @@ -32661,7 +32617,7 @@ nz da YR YR -kg +og nz cp Qs @@ -32671,9 +32627,9 @@ Cu Ki SK xn -sk -sk -sk +ll +ll +ll kn Jl Ki @@ -32918,7 +32874,7 @@ nz da YR YR -kg +og nz cp HQ @@ -32927,11 +32883,11 @@ ao Ph Fx xn -sk -sk -sk -sk -sk +ll +ll +ll +ll +ll kn TN Ki @@ -33175,7 +33131,7 @@ nz xI YR YR -GK +Gh nz cp ng @@ -33183,13 +33139,13 @@ ao ao ao Er -sk -sk -sk -sk -sk -sk -sk +ll +ll +ll +ll +ll +ll +ll rd Ki In @@ -33428,11 +33384,11 @@ Bt bZ ng ng -Ar -Ar -CG -KX -GK +ZG +ZG +pa +XP +Gh ng ng ng @@ -33441,12 +33397,12 @@ ao ao Fi sG -sk -sk -sk -sk -sk -sk +ll +ll +ll +ll +ll +ll rd Ki pv @@ -33685,7 +33641,7 @@ nz nz ng qv -OW +qa Rn QN QN @@ -33697,13 +33653,13 @@ ao ao ao Fi -sk -sk -sk -sk -sk -sk -sk +ll +ll +ll +ll +ll +ll +ll rd Ki CX @@ -33942,7 +33898,7 @@ uv vL oS HN -HF +yX pH QN iY @@ -33955,11 +33911,11 @@ ao ao qx pe -sk -sk -sk -sk -sk +ll +ll +ll +ll +ll af No yq @@ -34199,7 +34155,7 @@ uv vL oS HN -HF +yX pH QN pt @@ -34213,9 +34169,9 @@ ao ao QI pe -sk -sk -sk +ll +ll +ll af Ns yq @@ -34456,7 +34412,7 @@ Kr nz ng cy -ul +PB aL QN QN @@ -34713,7 +34669,7 @@ pZ Xm ng dR -Hn +TR aL QN QN @@ -34970,7 +34926,7 @@ pZ pZ Gp HN -HF +yX pH QN wU @@ -34999,14 +34955,14 @@ OL OL OL pJ -hs -hs +Ud +Ud pJ Zc pJ pJ -hs -hs +Ud +Ud OL OL OL @@ -35227,7 +35183,7 @@ OG DY ng Jp -ke +mh ez QN iY @@ -35252,16 +35208,16 @@ kb OL pJ pJ -hs -pJ -pJ -pJ +Ud +Ud pJ pJ pJ -hs +Ud +Ud +Ud pJ -hs +Ud pJ Nd Nd @@ -35507,7 +35463,7 @@ ao kb OL OL -hs +Ud pJ Nd Nd @@ -35515,8 +35471,8 @@ Nd Nd Nd pJ -hs -hs +Ud +Ud pJ pJ pJ @@ -36033,7 +35989,7 @@ fT ZA Bn PP -pK +kd fO tc CQ @@ -36256,7 +36212,7 @@ mP ng ng Wr -Ar +ZG Fr HN Fy @@ -36278,19 +36234,19 @@ kb OL pJ pJ -hs +Ud pJ Nd OB -ci -ci -Dn -fq -fq -fq -fq -fq -fq +Fh +Fh +sy +Sd +Sd +Sd +Sd +Sd +Sd TJ CQ Rc @@ -36513,7 +36469,7 @@ bz nz HN HN -HF +yX HN HN Fy @@ -36534,16 +36490,16 @@ kb kb OL pJ -pJ -pJ +Ud +Ud pJ Nd QA -ci +Fh Fh fO Wb -XH +bu Sd Sd bu @@ -36764,13 +36720,13 @@ ll Tx HN ng -Yk -zv -zv -HS -JR -JR -HF +Db +Jf +Jf +Qd +uz +uz +yX HN HN Fy @@ -36791,7 +36747,7 @@ kb OL OL pJ -aU +GM pJ pJ Nd @@ -37027,7 +36983,7 @@ Dh nz HN HN -HF +yX HN HN TG @@ -37284,12 +37240,12 @@ ng ng ng nz -OJ +vu nz HN gJ dy -Ft +xy nt HJ VJ @@ -37300,16 +37256,16 @@ kb OL pJ OL -hs -pJ -pJ -pJ -aU -pJ -hs +Ud +Ud pJ pJ -hs +GM +Ud +Ud +Ud +Ud +Ud Nd RD QL @@ -37815,14 +37771,14 @@ OL pJ pJ pJ +Ud pJ +Ud pJ -hs -pJ -pJ -pJ -aU pJ +Ud +GM +Ud pJ Oi hb @@ -38072,14 +38028,14 @@ OL pJ pJ pJ -aU -pJ -hs -hs +GM +Ud +Ud +Ud pJ pJ pJ -hs +Ud pJ Nd Xx @@ -38326,7 +38282,7 @@ hh Ff hh OL -aU +GM pJ pJ pJ @@ -38591,8 +38547,8 @@ Oi ex dS Qu -YC -YC +yg +yg gK Rv ZR @@ -38841,19 +38797,19 @@ OL OL OL Zc -hs -pJ +Ud pJ +Ud Oi MW AD ej -YC -YC +yg +yg UQ Rv We -YC +yg fO dj dj @@ -39098,28 +39054,28 @@ OL OL OL pJ +Ud pJ -pJ -hs +Ud Oi dB TA Qu -YC -YC +yg +yg yQ Rv PC -YC +yg Te vz -dQ +Uz fO UU -YC -YC +yg +yg Nd -lm +Ud Ud Ud Ud @@ -39354,10 +39310,10 @@ Es OL OL pJ -pJ -pJ +Ud +Ud Zc -hs +Ud Nd fO fO @@ -39367,18 +39323,18 @@ aA fO fO yR -YC +yg eJ vz -dQ +Uz fO fO eZ -YC +yg Nd Ud Gd -lm +Ud Ud OL Di @@ -39611,7 +39567,7 @@ Es Es OL pJ -aU +GM pJ pJ pJ @@ -39619,22 +39575,22 @@ Oi Og fs sm -YC -YC +yg +yg fD fO fO eZ wk vz -dQ +Uz cJ Rv -YC -YC +yg +yg Nd Ud -lm +Ud pJ Ud OL @@ -39876,19 +39832,19 @@ Oi yT ic dl -YC -YC +yg +yg bs RN RN -YC -YC +yg +yg vz -dQ +Uz cJ Rv -YC -YC +yg +yg Nd Ud Ud @@ -40127,25 +40083,25 @@ OL Zc pJ pJ -aU +GM pJ Oi FA gi sm -YC -YC +yg +yg bs RN RN -YC -YC +yg +yg hI cf fO fO eZ -YC +yg Nd Ud Ud @@ -40381,7 +40337,7 @@ Ff Ff Es OL -aU +GM pJ pJ pJ @@ -40391,7 +40347,7 @@ fO fO fO eZ -YC +yg fO fO fO @@ -40401,13 +40357,13 @@ bX Sd Px Rv -YC -YC +yg +yg Nd -lm Ud Ud -lm +Ud +Ud OL OL OL @@ -40647,8 +40603,8 @@ Zi wX fO bN -YC -YC +yg +yg Rm uq Rv @@ -40658,12 +40614,12 @@ Qo Sd JK Rv -YC -YC +yg +yg Nd Ud Ud -OC +Gd Ud Ud Ud @@ -40896,16 +40852,16 @@ Ff Es OL pJ -hs -pJ -hs +Ud +Ud +Ud Nd Zi kw eT VS dr -YC +yg VG sF Rv @@ -40916,16 +40872,16 @@ Sd Zy fO eZ -YC +yg Nd -lm +Ud Ud Ud Ud Ud GM Ud -lm +Ud Ud OL OL @@ -41153,16 +41109,16 @@ Ff Es OL pJ -pJ +Ud Zc -hs +Ud Nd bI fp fO bN -YC -YC +yg +yg hK Wz Rv @@ -41172,7 +41128,7 @@ TX Sd es Rv -YC +yg aA Nd Nd @@ -41410,7 +41366,7 @@ Ff Es OL pJ -aU +GM pJ pJ Nd @@ -41419,7 +41375,7 @@ fO fO fO eZ -YC +yg fO fO fO @@ -41429,8 +41385,8 @@ ba Sd Px Rv -YC -YC +yg +yg QL HL UG @@ -41675,19 +41631,19 @@ Oi ex dS sm -YC -YC +yg +yg bs RN RN -YC -YC +yg +yg NF QJ fO fO eZ -YC +yg Uz dq dq @@ -41923,7 +41879,7 @@ Bz Es Es OL -hs +Ud Zc pJ pJ @@ -41932,19 +41888,19 @@ Oi MW AD SP -YC -YC +yg +yg bs RN RN -YC -YC +yg +yg Dl -dQ +Uz xF Rv -YC -YC +yg +yg Uz dq dq @@ -42182,9 +42138,9 @@ hh OL OL pJ -aU -pJ -hs +GM +Ud +Ud Oi dB hg @@ -42195,13 +42151,13 @@ fO fO fO eZ -YC +yg Rp -dQ +Uz Ml Rv -YC -YC +yg +yg QL FV VR @@ -42451,13 +42407,13 @@ bO bS Rv gH -YC -YC +yg +yg al -dQ +Uz fO fO -YC +yg aA Nd Nd @@ -42469,7 +42425,7 @@ Ud Ud Gd Ud -lm +Ud OL aa aa @@ -42708,17 +42664,17 @@ bO hB Rv cP -YC -YC +yg +yg vz -dQ +Uz aH fO -YC -YC +yg +yg Nd -lm -lm +Ud +Ud Ud Ud Ud @@ -42952,7 +42908,7 @@ Es hh hh OL -aU +GM pJ pJ pJ @@ -42974,7 +42930,7 @@ fO hy hy Nd -lm +Ud Gd Ud Ud @@ -42982,8 +42938,8 @@ GM Ud Ud Ud -lm -OC +Ud +Gd OL aa aa @@ -43212,24 +43168,24 @@ OL pJ pJ pJ -hs +Ud Oi FA gi sm -WA -WA +Iy +Iy fO eo QQ -YC -YC +yg +yg QL ph Po QL -YC -YC +yg +yg Oi Gd Ud @@ -43469,7 +43425,7 @@ pJ pJ pJ pJ -aU +GM Nd Nd Nd @@ -43479,14 +43435,14 @@ Nd Nd Nd Nd -YC -YC +yg +yg QL qe KT QL -YC -YC +yg +yg Oi Ud Ud @@ -43722,37 +43678,37 @@ hh Ff hh OL -aU +GM Zc -hs +Ud pJ pJ pJ pJ Zc -hs -pJ +Ud pJ pJ -hs +Ud +Ud Oi -YC -YC +yg +yg QL qe qe QL -YC -YC +yg +yg Nd Ud -lm +Ud Nd dh CQ CQ AQ -dN +VD Nd OL OL @@ -43981,26 +43937,26 @@ hh OL pJ pJ -hs -hs +Ud +Ud pJ pJ pJ pJ -hs -hs +Ud +Ud pJ Zc pJ Oi -YC -YC +yg +yg QL UL Aj QL -YC -YC +yg +yg Nd Nd Nd @@ -44251,13 +44207,13 @@ Nd Nd Nd eZ -YC +yg fO Rv Rv fO eZ -YC +yg fO Cn vr @@ -44495,36 +44451,36 @@ hh OL Nd cx -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg NX -YC -YC +yg +yg NX -YC -YC -YC -YC -YC -YC -YC -YC +yg +yg +yg +yg +yg +yg +yg +yg Kz fO Sy -og +FS Nd OL aa @@ -44752,33 +44708,33 @@ hh OL Nd Zn -YC -YC +yg +yg Ys -YC -YC -YC -YC +yg +yg +yg +yg Ys -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC -YC +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg +yg cN CQ TL @@ -45270,8 +45226,8 @@ Cy ds fO Iy -Zt -Zt +yg +yg Iy fO XI @@ -45526,10 +45482,10 @@ Cy xa Cy fO -Zt -Zt -Zt -Zt +yg +yg +yg +yg fO Rk gV @@ -45783,10 +45739,10 @@ hZ FY CW fO -Zt -Zt -Zt -Zt +yg +yg +yg +yg fO dt hb @@ -46303,7 +46259,7 @@ ep zW fO QD -Zt +yg Iy RL TM @@ -46313,7 +46269,7 @@ Pi zU RL Iy -Zt +yg QD fO OZ @@ -46560,8 +46516,8 @@ cv fu fO XN -Zt -Zt +yg +yg bC UZ ep @@ -46570,7 +46526,7 @@ ep AD RL fK -Zt +yg SL fO Tk @@ -46817,7 +46773,7 @@ dM ZY fO df -Zt +yg fK RL Zk @@ -46827,14 +46783,14 @@ OF ic RL fK -Zt +yg Rf fO Hi Hi Hi fO -hQ +Ky eb eW Gt @@ -47074,7 +47030,7 @@ Nd Nd Nd gk -Zt +yg fK RL UZ @@ -47083,15 +47039,15 @@ OF ep AD fI -Zt -Zt +yg +yg XO Nd Nd Nd Nd Nd -Pw +UD yg yg ZZ @@ -47345,7 +47301,7 @@ Nd Nd Nd pJ -hs +Ud pJ Nd PI @@ -55272,7 +55228,7 @@ Zg Rl Br Xq -qH +qO On fv hE @@ -55529,10 +55485,10 @@ Yc VK PR Uh -Xo -WU -CU -Yj +BX +vy +se +PJ YQ uh oh @@ -55789,7 +55745,7 @@ Mt Sw On AK -Yq +JS Xq Xq ef @@ -56046,13 +56002,13 @@ MU NM On Wm -Nq -My -Od -Dk -vF -wy -TK +AN +tW +gg +zR +ZK +Lx +tA xQ mD RH @@ -56060,8 +56016,8 @@ Wy Sk Zs RF -OX -NL +vM +uT gO aa aa @@ -56303,21 +56259,21 @@ To BT On uP -dz +nO Nr Xq Rg rz wz -TK -xR -OQ -Ny -PM +tA +QF +Jo +GV +cK Om SR Yy -AL +sl oK gO aa @@ -56560,21 +56516,21 @@ CV nA eD CV -Vp +Im OY tl fN mD su fw -wh +qi rz NN -MJ +dQ TI Zl zz -OX +vM aR gO aa @@ -56817,21 +56773,21 @@ Gf oV On Wq -Vz +GR uV hT TS mD su fw -bm +tn mD SM -Ny -ar -fi -ar -Ny +GV +yk +ZD +yk +GV sx gO aa @@ -57074,7 +57030,7 @@ On On On On -Kf +TD On On On @@ -57086,7 +57042,7 @@ qR Mp WR RH -NC +Ge RH WR dW @@ -57330,8 +57286,8 @@ WX Ur UR YU -GB -Ub +CO +Pa aw YU uY @@ -57343,7 +57299,7 @@ mD Ya ce ST -VO +QG ST ce Ya @@ -57587,9 +57543,9 @@ QV QV Mo Sx -Gs -Ow -Aa +rY +fr +HO YU uZ oe @@ -57600,7 +57556,7 @@ mD WG Zv sE -bH +MP sE Zv VZ @@ -57844,8 +57800,8 @@ tD oB ZF YU -xy -Or +ab +Pa UI YU uY @@ -57855,9 +57811,9 @@ xf ts mD cm -bH -bH -bH +MP +MP +MP sE sE Vu @@ -58112,7 +58068,7 @@ fw ts mD Wd -bH +MP RV Sq gX @@ -58369,7 +58325,7 @@ fw ts mD gw -bH +MP bA bj Pt @@ -58617,7 +58573,7 @@ XA Sx Nn yi -cL +pY YU vb oe @@ -58626,9 +58582,9 @@ xk ts mD Vg -bH -bH -bH +MP +MP +MP sE sE IK @@ -58885,7 +58841,7 @@ mD wg oL fj -RM +nF PE oL VM diff --git a/_maps/metastation.json b/_maps/metastation.json deleted file mode 100644 index 9bdad81f9897..000000000000 --- a/_maps/metastation.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": 1, - "map_name": "MetaStation", - "map_path": "map_files/MetaStation", - "map_file": "MetaStation.dmm", - "shuttles": { - "cargo": "cargo_box", - "ferry": "ferry_fancy", - "whiteship": "whiteship_meta", - "emergency": "emergency_meta" - }, - "job_changes": { - "cook": { - "additional_cqc_areas": ["/area/station/service/bar", "/area/station/service/kitchen/coldroom", "/area/station/commons/lounge"] - } - } -} diff --git a/_maps/multiz_debug.json b/_maps/multiz_debug.json index eaa71b7e2208..4ffc3abd519e 100644 --- a/_maps/multiz_debug.json +++ b/_maps/multiz_debug.json @@ -11,12 +11,12 @@ { "Up": 1, "Down": -1, - "Baseturf": "/turf/open/openspace", + "Baseturf": "/turf/open/space/openspace", "Linkage": "Cross" }, { "Down": -1, - "Baseturf": "/turf/open/openspace", + "Baseturf": "/turf/open/space/openspace", "Linkage": "Cross" } ] diff --git a/_maps/shuttles/aux_base_default.dmm b/_maps/shuttles/aux_base_default.dmm deleted file mode 100644 index 5ce720e07599..000000000000 --- a/_maps/shuttles/aux_base_default.dmm +++ /dev/null @@ -1,180 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"b" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"e" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/ore_box, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"i" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"k" = ( -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"t" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"v" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"w" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"x" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"z" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"B" = ( -/obj/machinery/computer/auxiliary_base/directional/north, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"P" = ( -/obj/docking_port/mobile/auxiliary_base{ - dir = 2 - }, -/obj/machinery/bluespace_beacon, -/turf/closed/wall, -/area/shuttle/auxiliary_base) -"U" = ( -/obj/structure/closet/secure_closet/miner/unlocked, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"W" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"X" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Auxiliary Base"; - network = list("auxbase") - }, -/obj/structure/mining_shuttle_beacon, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) - -(1,1,1) = {" -e -b -b -b -b -b -b -b -w -"} -(2,1,1) = {" -v -k -k -k -k -k -k -k -x -"} -(3,1,1) = {" -v -k -k -k -k -k -k -k -x -"} -(4,1,1) = {" -v -k -k -k -W -k -k -k -x -"} -(5,1,1) = {" -v -k -k -X -P -B -k -k -x -"} -(6,1,1) = {" -v -k -k -k -z -k -k -k -x -"} -(7,1,1) = {" -v -k -k -k -k -k -k -k -x -"} -(8,1,1) = {" -v -k -k -k -k -k -k -k -x -"} -(9,1,1) = {" -i -t -t -t -t -t -t -t -U -"} diff --git a/_maps/shuttles/aux_base_small.dmm b/_maps/shuttles/aux_base_small.dmm deleted file mode 100644 index 82c3f17e06e3..000000000000 --- a/_maps/shuttles/aux_base_small.dmm +++ /dev/null @@ -1,143 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"b" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/ore_box, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"c" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"d" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"e" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"f" = ( -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"g" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"h" = ( -/obj/machinery/camera/directional/south{ - network = list("auxbase") - }, -/obj/structure/mining_shuttle_beacon, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"i" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"j" = ( -/obj/docking_port/mobile/auxiliary_base{ - dir = 2 - }, -/obj/machinery/bluespace_beacon, -/turf/closed/wall, -/area/shuttle/auxiliary_base) -"k" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"l" = ( -/obj/machinery/portable_atmospherics/canister/air, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"m" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"n" = ( -/obj/structure/closet/secure_closet/miner/unlocked, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) -"O" = ( -/obj/machinery/computer/auxiliary_base/directional/north, -/turf/open/floor/plating, -/area/shuttle/auxiliary_base) - -(1,1,1) = {" -b -e -e -e -e -e -l -"} -(2,1,1) = {" -c -f -f -f -f -f -m -"} -(3,1,1) = {" -c -f -f -i -f -f -m -"} -(4,1,1) = {" -c -f -h -j -O -f -m -"} -(5,1,1) = {" -c -f -f -k -f -f -m -"} -(6,1,1) = {" -c -f -f -f -f -f -m -"} -(7,1,1) = {" -d -g -g -g -g -g -n -"} diff --git a/_maps/shuttles/emergency_arena.dmm b/_maps/shuttles/emergency_arena.dmm deleted file mode 100644 index 9919a9d0cbd6..000000000000 --- a/_maps/shuttles/emergency_arena.dmm +++ /dev/null @@ -1,327 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"f" = ( -/turf/template_noop, -/area/template_noop) -"g" = ( -/turf/closed/indestructible/necropolis, -/area/shuttle/escape/arena) -"h" = ( -/turf/open/indestructible{ - icon_state = "cult" - }, -/area/shuttle/escape/arena) -"i" = ( -/obj/structure/closet/crate/necropolis/dragon, -/turf/open/indestructible{ - icon_state = "cult" - }, -/area/shuttle/escape/arena) -"j" = ( -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"k" = ( -/obj/structure/fluff/drake_statue, -/turf/open/indestructible{ - icon_state = "cult" - }, -/area/shuttle/escape/arena) -"l" = ( -/obj/structure/closet/crate/necropolis/tendril, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"m" = ( -/obj/structure/fluff/drake_statue, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"n" = ( -/obj/effect/forcefield/arena_shuttle_entrance, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"o" = ( -/obj/effect/forcefield/arena_shuttle_entrance, -/obj/docking_port/mobile/emergency{ - name = "The Arena" - }, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"z" = ( -/obj/effect/landmark/shuttle_arena_safe, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) -"T" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 1 - }, -/turf/open/indestructible{ - icon_state = "cult" - }, -/area/shuttle/escape/arena) -"V" = ( -/obj/structure/healingfountain, -/turf/open/indestructible/necropolis/air, -/area/shuttle/escape/arena) - -(1,1,1) = {" -g -g -g -g -g -g -g -n -g -o -g -g -g -g -g -n -g -n -g -g -g -f -"} -(2,1,1) = {" -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -"} -(3,1,1) = {" -g -h -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -h -V -g -"} -(4,1,1) = {" -g -h -k -l -j -m -l -j -m -l -j -k -l -j -m -l -j -m -j -j -V -g -"} -(5,1,1) = {" -g -i -h -h -j -j -z -j -j -z -j -h -z -j -j -z -j -j -j -j -V -g -"} -(6,1,1) = {" -g -i -i -h -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -T -g -"} -(7,1,1) = {" -g -i -i -h -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -V -g -"} -(8,1,1) = {" -g -i -h -h -j -j -z -j -j -z -j -j -z -j -h -z -j -j -j -j -V -g -"} -(9,1,1) = {" -g -h -k -l -j -m -l -j -m -l -j -m -l -j -m -l -j -m -j -j -V -g -"} -(10,1,1) = {" -g -h -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -j -h -g -g -"} -(11,1,1) = {" -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -g -f -"} diff --git a/_maps/shuttles/emergency_asteroid.dmm b/_maps/shuttles/emergency_asteroid.dmm index 849d60ccc0a6..6dd1438066e2 100644 --- a/_maps/shuttles/emergency_asteroid.dmm +++ b/_maps/shuttles/emergency_asteroid.dmm @@ -376,7 +376,6 @@ /obj/item/cautery{ pixel_x = 4 }, -/obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "bJ" = ( diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index 342f57eec4a1..8891aaa82e72 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -254,7 +254,6 @@ /obj/structure/extinguisher_cabinet/directional/east, /obj/structure/table, /obj/item/storage/box/drinkingglasses, -/obj/item/reagent_containers/food/drinks/bottle/lizardwine, /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ dir = 1 @@ -408,7 +407,6 @@ /area/shuttle/escape) "bw" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index d7bd55096713..b8170d98c9d6 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -63,7 +63,6 @@ /area/shuttle/escape/brig) "an" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "ao" = ( diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index 9a9fde660f28..8277983d9922 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -482,10 +482,6 @@ pixel_x = -2; pixel_y = 4 }, -/obj/item/stack/spacecash/c50{ - pixel_x = 2; - pixel_y = 7 - }, /obj/machinery/vending/wallmed/directional/west, /turf/open/floor/carpet/green, /area/shuttle/escape) @@ -582,17 +578,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 @@ -787,7 +778,6 @@ /area/shuttle/escape/brig) "vL" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/blue, /area/shuttle/escape) "vP" = ( @@ -905,14 +895,7 @@ /area/shuttle/escape) "yH" = ( /obj/structure/closet/crate, -/obj/item/paint/black, -/obj/item/paint/blue, -/obj/item/paint/green, -/obj/item/paint/red, -/obj/item/paint/violet, -/obj/item/paint/white, -/obj/item/paint/yellow, -/obj/item/paint_remover, +/obj/item/paint_sprayer, /turf/open/floor/sepia, /area/shuttle/escape) "yJ" = ( @@ -951,7 +934,7 @@ dir = 1 }, /obj/structure/table/reinforced, -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade, +/obj/machinery/chem_dispenser/drinks/beer, /turf/open/floor/iron, /area/shuttle/escape) "AA" = ( @@ -1196,7 +1179,7 @@ dir = 1 }, /obj/structure/table/reinforced, -/obj/machinery/chem_dispenser/drinks/fullupgrade, +/obj/machinery/chem_dispenser/drinks, /obj/structure/sign/poster/official/cohiba_robusto_ad{ pixel_y = 32 }, diff --git a/_maps/shuttles/emergency_cere.dmm b/_maps/shuttles/emergency_cere.dmm index 525f0b0b198e..d74d04676650 100644 --- a/_maps/shuttles/emergency_cere.dmm +++ b/_maps/shuttles/emergency_cere.dmm @@ -819,13 +819,6 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, /area/shuttle/escape) -"cH" = ( -/obj/machinery/computer/operating{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue/fourcorners, -/turf/open/floor/iron/white, -/area/shuttle/escape) "cI" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/blue/fourcorners, @@ -839,7 +832,6 @@ /obj/item/clothing/suit/apron/surgical, /obj/item/clothing/gloves/color/latex, /obj/item/clothing/mask/surgical, -/obj/item/surgical_drapes, /obj/item/razor, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron/white, @@ -1844,7 +1836,7 @@ co cv cA cE -cH +cB ab cR cX diff --git a/_maps/shuttles/emergency_delta.dmm b/_maps/shuttles/emergency_delta.dmm index 64de44e59da6..01b0669b4e52 100644 --- a/_maps/shuttles/emergency_delta.dmm +++ b/_maps/shuttles/emergency_delta.dmm @@ -135,19 +135,8 @@ }, /turf/open/floor/iron/white, /area/shuttle/escape) -"ak" = ( -/obj/machinery/computer/operating, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/iron/white, -/area/shuttle/escape) "al" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/effect/turf_decal/tile/blue{ dir = 4 }, @@ -214,17 +203,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 @@ -1650,7 +1634,7 @@ af ab ad hB -ak +aR as az nD diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index 9199e9b81feb..46ff7803eb6e 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -111,10 +111,6 @@ }, /turf/open/floor/mineral/plasma/disco, /area/shuttle/escape) -"v" = ( -/obj/machinery/jukebox/disco/indestructible, -/turf/open/floor/light/colour_cycle/dancefloor_a, -/area/shuttle/escape) "w" = ( /obj/machinery/door/airlock/gold, /turf/open/floor/wood, @@ -196,7 +192,6 @@ /area/shuttle/escape) "L" = ( /obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/bottle/lizardwine, /turf/open/floor/wood, /area/shuttle/escape) "M" = ( @@ -348,7 +343,7 @@ j j t R -v +t R t j diff --git a/_maps/shuttles/emergency_donut.dmm b/_maps/shuttles/emergency_donut.dmm index df0dfe5b9f12..31c89fc9b119 100644 --- a/_maps/shuttles/emergency_donut.dmm +++ b/_maps/shuttles/emergency_donut.dmm @@ -391,17 +391,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 diff --git a/_maps/shuttles/emergency_kilo.dmm b/_maps/shuttles/emergency_kilo.dmm index 4c6804cb8ad3..32f02810a803 100644 --- a/_maps/shuttles/emergency_kilo.dmm +++ b/_maps/shuttles/emergency_kilo.dmm @@ -1554,7 +1554,7 @@ /obj/item/reagent_containers/hypospray/medipen{ pixel_y = -6 }, -/obj/item/reagent_containers/glass/bottle/multiver, +/obj/item/reagent_containers/glass/bottle/dylovene, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "cY" = ( @@ -1562,9 +1562,6 @@ /turf/closed/wall/mineral/titanium, /area/shuttle/escape) "cZ" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, /obj/effect/turf_decal/bot, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) @@ -1575,7 +1572,6 @@ /area/shuttle/escape) "db" = ( /obj/structure/table, -/obj/item/surgical_drapes, /obj/item/retractor, /obj/item/cautery, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm deleted file mode 100644 index 4aa0e7c94cc8..000000000000 --- a/_maps/shuttles/emergency_luxury.dmm +++ /dev/null @@ -1,1330 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/turf/template_noop, -/area/template_noop) -"ab" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/escape/luxury) -"ac" = ( -/obj/machinery/door/airlock/external/ruin{ - name = "Economy-Class" - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ad" = ( -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, -/obj/machinery/door/airlock/silver{ - name = "First Class" - }, -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"ae" = ( -/obj/docking_port/mobile/emergency{ - dir = 2; - dwidth = 5; - height = 14; - name = "Luxurious Emergency Shuttle"; - width = 25 - }, -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, -/obj/machinery/door/airlock/silver{ - name = "First Class" - }, -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"af" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Escape Shuttle Cell" - }, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape/brig) -"ag" = ( -/turf/closed/indestructible/riveted/plastinum, -/area/shuttle/escape/luxury) -"ah" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/ore_box, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/directional/north, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"aj" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/large, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ak" = ( -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"al" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/escape/luxury) -"ao" = ( -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"aq" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/reagent_dispensers/fueltank, -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ar" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape/luxury) -"as" = ( -/obj/structure/shuttle/engine/heater{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/escape/luxury) -"at" = ( -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape/brig) -"au" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"av" = ( -/obj/machinery/door/poddoor/shutters/indestructible{ - id = "ohnopoors" - }, -/turf/closed/indestructible/opsglass{ - desc = "A durable looking window made of an alloy of of plasma and titanium."; - name = "plastitanium window" - }, -/area/shuttle/escape/luxury) -"aw" = ( -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"ax" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/light/small/directional/east, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ay" = ( -/turf/closed/indestructible/syndicate, -/area/shuttle/escape/luxury) -"az" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"aA" = ( -/obj/machinery/button/door{ - id = "ohnopoors"; - name = "window shutters"; - pixel_y = 26 - }, -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"aB" = ( -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"aC" = ( -/obj/item/food/enchiladas{ - pixel_y = 3 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aD" = ( -/obj/item/food/candiedapple{ - pixel_y = 6 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aE" = ( -/obj/item/food/benedict{ - pixel_y = 1 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aF" = ( -/obj/item/food/cakeslice/chocolate{ - pixel_y = 1 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aG" = ( -/obj/item/food/eggplantparm{ - pixel_y = 3 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aH" = ( -/obj/item/food/spaghetti/copypasta{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aI" = ( -/obj/item/food/spaghetti/boiledspaghetti{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aJ" = ( -/obj/item/food/cherrycupcake{ - pixel_y = 2 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aK" = ( -/obj/item/food/spaghetti/meatballspaghetti{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aL" = ( -/obj/item/food/notasandwich{ - pixel_y = 11 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aM" = ( -/obj/structure/chair/comfy/teal{ - dir = 4 - }, -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"aN" = ( -/obj/item/food/burger/baconburger{ - pixel_y = 2 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aO" = ( -/obj/item/food/melonfruitbowl{ - pixel_y = 4 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aP" = ( -/obj/item/food/khachapuri{ - pixel_y = 6 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aQ" = ( -/obj/item/food/bearsteak{ - pixel_y = 6 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aR" = ( -/obj/structure/mirror/directional/west, -/obj/structure/sink/greyscale{ - dir = 4; - pixel_x = -12 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"aS" = ( -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"aT" = ( -/obj/item/food/spaghetti/pastatomato{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aU" = ( -/obj/item/food/kebab/tofu{ - pixel_y = 6 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aV" = ( -/obj/item/food/honkdae{ - pixel_y = 8 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aW" = ( -/obj/item/food/spaghetti/chowmein{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aX" = ( -/obj/item/food/grilled_cheese_sandwich{ - pixel_y = 11 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aY" = ( -/obj/item/food/jelliedtoast/cherry{ - pixel_y = 6 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"aZ" = ( -/obj/item/food/honeybun{ - pixel_y = 1 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"ba" = ( -/obj/item/food/pizza/dank{ - pixel_y = 5 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/red, -/area/shuttle/escape/luxury) -"bb" = ( -/obj/machinery/door/airlock/silver{ - name = "Restroom" - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"bc" = ( -/turf/closed/indestructible/opsglass{ - desc = "A durable looking window made of an alloy of of plasma and titanium."; - name = "plastitanium window" - }, -/area/shuttle/escape/luxury) -"be" = ( -/obj/structure/girder, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bf" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/turf_decal/loading_area, -/obj/effect/spawner/random/maintenance/six, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bg" = ( -/obj/structure/closet/crate/trashcart, -/obj/effect/turf_decal/loading_area, -/obj/effect/spawner/random/maintenance/three, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bi" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 8 - }, -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"bj" = ( -/obj/structure/chair/comfy/shuttle, -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape/brig) -"bk" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"bl" = ( -/obj/machinery/computer/station_alert{ - dir = 8 - }, -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"bm" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/storage/fancy/cigarettes/cigars/havana{ - pixel_y = 7 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"bn" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/engineering/electrical, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bo" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/engineering, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bp" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/window{ - dir = 4 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bq" = ( -/obj/item/stack/rods/ten, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"br" = ( -/obj/effect/decal/cleanable/robot_debris, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bs" = ( -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bt" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/item/clothing/head/collectable/paper, -/turf/open/floor/holofloor/beach/water, -/area/shuttle/escape/luxury) -"bu" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/turf/open/floor/holofloor/beach/water, -/area/shuttle/escape/luxury) -"bv" = ( -/obj/machinery/computer/crew{ - dir = 8 - }, -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"bw" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 2 - }, -/obj/structure/window/reinforced{ - dir = 4; - layer = 2.9 - }, -/turf/open/floor/holofloor/beach/coast_t{ - dir = 8 - }, -/area/shuttle/escape/luxury) -"bx" = ( -/obj/machinery/door/airlock/silver{ - name = "Flight Control" - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"by" = ( -/obj/structure/closet/crate/large, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bz" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bA" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/window{ - dir = 4 - }, -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bB" = ( -/obj/item/stack/ore/glass, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bC" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/window, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bD" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape/brig) -"bE" = ( -/obj/machinery/light/directional/north, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"bF" = ( -/obj/item/bikehorn/rubberducky, -/obj/item/bikehorn/rubberducky, -/turf/open/floor/holofloor/beach/water, -/area/shuttle/escape/luxury) -"bG" = ( -/obj/machinery/door/window/left/directional/east, -/turf/open/floor/holofloor/beach/coast_t{ - dir = 8 - }, -/area/shuttle/escape/luxury) -"bH" = ( -/obj/structure/door_assembly, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bI" = ( -/obj/item/stack/tile/iron/base, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bJ" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bK" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bL" = ( -/obj/structure/window/reinforced, -/turf/open/floor/holofloor/beach/water, -/area/shuttle/escape/luxury) -"bM" = ( -/obj/structure/window/reinforced, -/obj/machinery/door/window/right/directional/east, -/turf/open/floor/holofloor/beach/coast_t{ - dir = 8 - }, -/area/shuttle/escape/luxury) -"bN" = ( -/obj/machinery/chem_dispenser/drinks/beer{ - name = "aperitif fountain"; - pixel_y = 8 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"bO" = ( -/obj/machinery/chem_dispenser/drinks{ - name = "soda fountain"; - pixel_y = 8 - }, -/obj/structure/table/wood/fancy/black, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"bP" = ( -/obj/structure/table/wood/fancy/black, -/obj/machinery/recharger, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"bQ" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/holofloor/beach/water, -/area/shuttle/escape/luxury) -"bR" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bS" = ( -/obj/item/stack/tile/iron/base, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bT" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bU" = ( -/obj/effect/decal/cleanable/generic, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"bV" = ( -/obj/structure/chair/comfy/brown, -/turf/open/floor/carpet/orange, -/area/shuttle/escape/luxury) -"bW" = ( -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"bX" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/window, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"bY" = ( -/obj/structure/table/wood/fancy/black, -/obj/item/reagent_containers/food/drinks/bottle/champagne{ - pixel_x = 7; - pixel_y = 11 - }, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = -7; - pixel_y = 11 - }, -/obj/item/reagent_containers/glass/rag{ - pixel_x = -6; - pixel_y = 4 - }, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"bZ" = ( -/obj/machinery/vending/boozeomat, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"cb" = ( -/obj/machinery/stasis, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cc" = ( -/obj/effect/turf_decal/delivery, -/obj/structure/closet/crate/large, -/obj/effect/decal/cleanable/robot_debris, -/obj/effect/spawner/random/maintenance/eight, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cd" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Emergency Shuttle Infirmary" - }, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cf" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/item/stack/ore/glass, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cg" = ( -/obj/effect/decal/cleanable/glass, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ch" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/carpet/orange, -/area/shuttle/escape/luxury) -"ci" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"cj" = ( -/obj/structure/closet/crate/freezer, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood, -/obj/item/reagent_containers/blood/a_minus, -/obj/item/reagent_containers/blood/b_minus{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/reagent_containers/blood/b_plus{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/reagent_containers/blood/o_minus, -/obj/item/reagent_containers/blood/o_plus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/random, -/obj/item/reagent_containers/blood/a_plus, -/obj/item/reagent_containers/blood/random, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"ck" = ( -/obj/item/stack/tile/iron/base, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cl" = ( -/mob/living/simple_animal/bot/medbot{ - name = "\improper emergency medibot"; - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cm" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/circular_saw, -/obj/item/retractor{ - pixel_x = 4 - }, -/obj/item/hemostat{ - pixel_x = -4 - }, -/obj/item/clothing/gloves/color/latex, -/obj/item/clothing/mask/surgical, -/obj/item/surgicaldrill, -/obj/item/cautery, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cn" = ( -/obj/machinery/door/airlock{ - name = "Economy Medical" - }, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"co" = ( -/obj/item/shard, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cp" = ( -/obj/structure/closet/crate/freezer, -/obj/effect/decal/cleanable/blood/old, -/obj/item/bot_assembly/medbot, -/obj/item/stack/medical/gauze, -/obj/item/reagent_containers/food/drinks/bottle/whiskey, -/obj/item/reagent_containers/glass/bottle/ethanol, -/obj/item/organ/stomach, -/obj/item/clothing/mask/surgical, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cq" = ( -/obj/effect/decal/cleanable/chem_pile, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cr" = ( -/obj/structure/frame/machine, -/obj/effect/decal/cleanable/cobweb/cobweb2, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cs" = ( -/obj/effect/decal/cleanable/robot_debris, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"ct" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"cu" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"cv" = ( -/obj/structure/table, -/obj/item/reagent_containers/pill/maintenance{ - pixel_x = -6; - pixel_y = -3 - }, -/obj/item/reagent_containers/pill/maintenance{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/item/reagent_containers/pill/maintenance, -/obj/item/healthanalyzer{ - pixel_y = 9 - }, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cw" = ( -/obj/structure/bed, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cx" = ( -/obj/effect/decal/cleanable/vomit/old, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cy" = ( -/obj/item/shard, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cz" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/escape/luxury) -"cA" = ( -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cB" = ( -/obj/structure/bed, -/obj/effect/decal/cleanable/blood/old, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cC" = ( -/obj/structure/grille/broken, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cD" = ( -/obj/structure/frame/machine, -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/cobweb, -/obj/machinery/light/small/directional/west, -/turf/open/floor/iron, -/area/shuttle/escape/luxury) -"cE" = ( -/obj/structure/chair/comfy/brown, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/orange, -/area/shuttle/escape/luxury) -"cF" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"cG" = ( -/obj/structure/table, -/obj/item/storage/medkit/advanced, -/obj/item/storage/medkit/regular, -/obj/item/storage/medkit/fire, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 6 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = -3; - pixel_y = 8 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/item/reagent_containers/syringe/epinephrine{ - pixel_x = 3; - pixel_y = -2 - }, -/obj/machinery/light/directional/north, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cH" = ( -/obj/machinery/light/directional/south, -/obj/structure/table/optable, -/obj/item/surgical_drapes, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"cI" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/carpet/blue, -/area/shuttle/escape/luxury) -"cJ" = ( -/obj/item/stack/tile/iron/base, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cK" = ( -/obj/structure/table, -/obj/item/wirecutters{ - pixel_y = 6 - }, -/obj/item/hatchet, -/obj/item/knife/kitchen, -/obj/machinery/light/small/directional/west, -/turf/open/floor/plating, -/area/shuttle/escape/luxury) -"cL" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/obj/machinery/light/directional/south, -/turf/open/floor/carpet/orange, -/area/shuttle/escape/luxury) -"cM" = ( -/obj/machinery/light/directional/south, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"cN" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/carpet/green, -/area/shuttle/escape/luxury) -"qa" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium/white, -/area/shuttle/escape/luxury) -"zh" = ( -/turf/open/floor/mineral/diamond, -/area/shuttle/escape/luxury) -"Eg" = ( -/obj/machinery/vending/wallmed/directional/north, -/obj/machinery/iv_drip, -/turf/open/floor/carpet/cyan, -/area/shuttle/escape/luxury) -"Lt" = ( -/obj/machinery/door/airlock/security/glass{ - name = "Escape Shuttle Cell" - }, -/obj/machinery/scanner_gate/luxury_shuttle, -/obj/effect/mapping_helpers/airlock/access/all/security/brig, -/turf/open/floor/mineral/plastitanium/red/brig, -/area/shuttle/escape/brig) - -(1,1,1) = {" -aa -al -ar -ar -al -ar -ar -ar -ar -al -ar -ar -al -aa -"} -(2,1,1) = {" -ab -al -as -as -al -as -as -as -as -al -as -as -al -ab -"} -(3,1,1) = {" -ab -ah -bn -by -ab -cD -aj -cc -aj -ab -cp -cv -cK -ab -"} -(4,1,1) = {" -ab -aj -bo -bz -bH -bR -bC -bJ -ak -cn -cq -bs -cA -ab -"} -(5,1,1) = {" -ab -aq -bp -bA -ab -bS -bC -bJ -cf -ab -cr -cw -cB -ab -"} -(6,1,1) = {" -ab -be -bq -bB -ck -bT -ak -bU -cg -ab -ab -ab -ab -ab -"} -(7,1,1) = {" -ab -bf -br -bC -bJ -bI -bC -bK -bs -co -cs -cJ -cC -ab -"} -(8,1,1) = {" -ab -bg -ak -bC -bJ -bU -bC -bJ -bS -bC -bJ -cx -bC -ab -"} -(9,1,1) = {" -ac -ax -bs -bC -bK -bS -bX -bJ -ak -bC -bJ -cy -bC -ab -"} -(10,1,1) = {" -ag -ag -af -ag -ag -ay -av -av -av -ay -av -av -av -ay -"} -(11,1,1) = {" -af -at -at -bD -ag -aA -ao -ao -ao -ao -ao -ao -ao -ag -"} -(12,1,1) = {" -ag -bj -at -bD -ag -cE -aG -aK -ch -bV -aO -aT -cL -ag -"} -(13,1,1) = {" -ag -at -at -bD -ag -bV -aH -aL -ch -bV -aP -aU -ch -ag -"} -(14,1,1) = {" -ag -Lt -ag -ag -ag -bV -aC -aE -ch -bV -aX -aZ -ch -ag -"} -(15,1,1) = {" -ag -ao -bt -bQ -bL -bV -aD -aF -ch -bV -aY -ba -ch -ag -"} -(16,1,1) = {" -ag -ao -bu -bF -bL -bV -aI -aD -ch -bV -aH -aV -ch -ag -"} -(17,1,1) = {" -ae -ao -bw -bG -bM -bV -aJ -aN -ch -bV -aQ -aW -cL -ag -"} -(18,1,1) = {" -ag -bk -ao -ao -ao -ao -ao -ao -ao -ao -cI -ao -ao -ag -"} -(19,1,1) = {" -ad -ao -ao -ao -bN -bW -bY -ao -ci -ag -ag -ag -bb -ag -"} -(20,1,1) = {" -ag -ao -ao -ao -bO -cF -bZ -ao -cN -ag -aR -aR -aS -ag -"} -(21,1,1) = {" -ag -au -bx -bx -au -ag -au -cd -au -ag -ct -ct -cM -ag -"} -(22,1,1) = {" -ag -bm -aw -aw -bP -ag -cj -aB -cm -ag -ag -ag -aS -ag -"} -(23,1,1) = {" -ag -bE -aw -aw -cz -ag -cG -aB -cH -ag -cu -bb -aS -ag -"} -(24,1,1) = {" -ag -aM -aM -aM -zh -ag -Eg -aB -cl -ag -ag -ag -cM -ag -"} -(25,1,1) = {" -ag -az -bi -bl -bv -ag -cb -cb -cb -ag -qa -bb -aS -ag -"} -(26,1,1) = {" -ag -bc -bc -bc -bc -ag -ag -ag -ag -ag -ag -ag -ag -ag -"} diff --git a/_maps/shuttles/emergency_medisim.dmm b/_maps/shuttles/emergency_medisim.dmm index 6f5b2ab20b2b..d6b2ee0fdb89 100644 --- a/_maps/shuttles/emergency_medisim.dmm +++ b/_maps/shuttles/emergency_medisim.dmm @@ -92,17 +92,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 @@ -174,7 +169,6 @@ /area/shuttle/escape) "hr" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/mineral/titanium/tiled/blue, /area/shuttle/escape) "hw" = ( diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 7ac4b080a7a4..3a5fde1bc6ea 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -285,7 +285,7 @@ /area/shuttle/escape) "aT" = ( /obj/structure/table, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, /obj/machinery/light/directional/east, @@ -407,17 +407,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 @@ -466,7 +461,6 @@ /area/shuttle/escape) "bz" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/machinery/light/directional/west, /obj/machinery/status_display/evac/directional/west, /turf/open/floor/mineral/titanium, diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency_meteor.dmm deleted file mode 100644 index adb6c318ca46..000000000000 --- a/_maps/shuttles/emergency_meteor.dmm +++ /dev/null @@ -1,1756 +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/mineral, -/area/shuttle/escape/meteor) -"c" = ( -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"d" = ( -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"e" = ( -/obj/machinery/computer/emergency_shuttle{ - dir = 4; - use_power = 0 - }, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"f" = ( -/mob/living/simple_animal/hostile/asteroid/goliath, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"g" = ( -/obj/structure/mineral_door/iron, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"h" = ( -/obj/item/pickaxe, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"i" = ( -/obj/effect/station_crash, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"k" = ( -/obj/structure/closet/crate, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"l" = ( -/obj/machinery/power/smes, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"m" = ( -/obj/structure/window/reinforced{ - dir = 1 - }, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/escape/meteor) -"n" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/escape/meteor) -"u" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) -"L" = ( -/obj/docking_port/mobile/emergency{ - dwidth = 20; - height = 40; - movement_force = list("KNOCKDOWN" = 3, "THROW" = 6); - name = "\proper a meteor with engines strapped to it"; - width = 40 - }, -/turf/open/misc/asteroid, -/area/shuttle/escape/meteor) - -(1,1,1) = {" -a -a -a -b -b -b -b -b -b -b -b -d -d -d -b -b -b -d -d -d -L -d -d -b -d -d -d -d -d -b -b -b -b -b -b -b -b -a -a -a -"} -(2,1,1) = {" -a -a -b -b -b -b -d -d -b -b -b -b -b -b -b -d -d -d -b -i -b -b -b -b -b -b -b -d -d -d -d -d -b -b -b -b -b -b -a -a -"} -(3,1,1) = {" -a -b -b -b -b -d -d -d -b -b -b -b -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -d -d -b -b -b -b -a -a -"} -(4,1,1) = {" -b -b -b -b -b -d -d -d -b -b -b -b -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -b -b -b -b -b -a -"} -(5,1,1) = {" -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -b -b -b -b -b -b -b -d -d -d -d -k -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(6,1,1) = {" -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -b -b -b -b -b -b -d -d -d -d -d -k -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(7,1,1) = {" -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -b -b -b -b -b -b -d -d -d -d -b -k -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(8,1,1) = {" -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -"} -(9,1,1) = {" -b -b -b -b -b -b -d -b -b -b -b -b -b -g -g -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -"} -(10,1,1) = {" -a -b -b -b -b -b -d -b -b -b -b -b -d -d -d -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -"} -(11,1,1) = {" -a -b -b -b -b -d -d -d -d -d -d -d -d -d -d -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -"} -(12,1,1) = {" -a -b -b -b -b -b -d -d -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 -b -b -b -b -a -a -"} -(13,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -a -"} -(14,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(15,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(16,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(17,1,1) = {" -a -c -d -e -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -a -"} -(18,1,1) = {" -a -c -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -"} -(19,1,1) = {" -a -c -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -m -n -"} -(20,1,1) = {" -a -c -d -d -b -b -b -b -d -b -b -b -b -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -d -m -n -"} -(21,1,1) = {" -a -c -d -d -b -b -b -b -d -b -b -b -d -d -b -b -b -b -b -b -b -d -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -d -m -n -"} -(22,1,1) = {" -b -b -b -b -b -b -b -b -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -d -d -d -m -n -"} -(23,1,1) = {" -b -b -b -b -b -b -b -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(24,1,1) = {" -b -b -b -b -b -b -b -d -d -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(25,1,1) = {" -b -b -b -b -b -b -b -d -d -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(26,1,1) = {" -b -b -b -b -b -b -b -d -d -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(27,1,1) = {" -a -b -b -b -b -b -b -d -d -b -b -b -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(28,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -b -b -b -d -d -d -d -d -d -d -d -b -b -b -b -b -b -b -b -b -b -a -"} -(29,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -d -d -d -b -b -b -d -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(30,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -d -b -b -b -d -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -b -a -"} -(31,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -d -b -b -b -d -b -b -b -b -b -d -b -b -b -b -b -b -b -b -b -a -a -"} -(32,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -d -b -b -b -d -b -b -b -l -u -d -d -d -d -b -b -b -b -b -b -a -a -"} -(33,1,1) = {" -a -b -b -b -b -b -b -b -b -b -b -b -b -b -b -d -b -b -h -b -b -b -d -b -b -b -l -u -d -d -d -d -b -b -b -b -b -b -a -a -"} -(34,1,1) = {" -a -b -b -b -b -b -b -d -d -d -b -b -b -b -b -d -b -b -b -b -b -b -d -b -b -b -l -u -d -d -d -d -b -b -b -b -b -m -n -a -"} -(35,1,1) = {" -a -b -b -b -b -b -d -d -f -d -b -b -b -b -d -d -d -d -d -d -d -d -d -b -b -b -l -u -d -d -d -d -b -b -b -b -b -m -n -a -"} -(36,1,1) = {" -a -b -b -b -b -b -d -d -d -d -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -l -u -d -d -d -d -d -d -d -d -d -m -n -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 -l -u -d -d -d -d -b -b -b -b -b -m -n -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 -b -b -a -"} -(39,1,1) = {" -a -a -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 -b -a -a -"} -(40,1,1) = {" -a -a -a -a -a -a -b -b -b -b -b -b -b -a -a -b -b -b -b -b -a -a -b -a -a -a -a -b -b -b -b -b -b -b -b -b -b -a -a -a -"} diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index 31354e92f8e0..85656e66831d 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -85,7 +85,7 @@ /area/shuttle/escape) "bb" = ( /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -119,7 +119,7 @@ "bn" = ( /obj/machinery/light/small/directional/east, /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "bo" = ( @@ -188,7 +188,7 @@ /area/shuttle/escape) "bI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -256,7 +256,7 @@ }, /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/airalarm/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "dp" = ( @@ -388,7 +388,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -496,7 +496,7 @@ network = list("ss13","monastery") }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -527,7 +527,7 @@ /area/shuttle/escape) "hY" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -602,14 +602,14 @@ /area/shuttle/escape) "iJ" = ( /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "iM" = ( /obj/machinery/door/airlock/grunge{ name = "Chapel" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "iS" = ( @@ -630,7 +630,7 @@ c_tag = "Monastery Cloister Port"; network = list("ss13","monastery") }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -638,7 +638,7 @@ "iW" = ( /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/sand, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -869,7 +869,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "mw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -900,7 +900,7 @@ network = list("ss13","monastery") }, /obj/effect/turf_decal/sand, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -913,7 +913,7 @@ /obj/machinery/door/airlock/grunge{ name = "Chapel" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -934,7 +934,7 @@ /area/shuttle/escape) "nd" = ( /obj/machinery/portable_atmospherics/canister/oxygen, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 6 }, @@ -1108,7 +1108,7 @@ /area/shuttle/escape) "pw" = ( /obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -1223,7 +1223,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "qT" = ( @@ -1293,7 +1293,7 @@ /area/shuttle/escape) "rQ" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -1312,7 +1312,7 @@ /turf/open/floor/carpet/black, /area/shuttle/escape) "sc" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, /area/shuttle/escape) @@ -1320,7 +1320,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "sg" = ( @@ -1330,7 +1330,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "sm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -1399,7 +1399,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "td" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -1441,7 +1441,7 @@ /area/shuttle/escape) "un" = ( /obj/effect/turf_decal/sand, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/escape) "uu" = ( @@ -1478,7 +1478,7 @@ /area/shuttle/escape) "vb" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, @@ -1497,7 +1497,7 @@ /obj/item/kirbyplants{ icon_state = "plant-21" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 5 }, @@ -1529,7 +1529,7 @@ /obj/machinery/door/airlock/grunge{ name = "Chapel Access" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -1566,7 +1566,7 @@ "vX" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -1579,7 +1579,7 @@ /obj/item/kirbyplants{ icon_state = "plant-10" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 6 }, @@ -1638,7 +1638,7 @@ "xw" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/chair/wood, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 9 }, @@ -1652,7 +1652,7 @@ /turf/open/floor/carpet, /area/shuttle/escape) "xZ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/extinguisher_cabinet/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -1796,7 +1796,7 @@ /area/shuttle/escape) "zr" = ( /obj/machinery/light/small/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -1869,7 +1869,7 @@ /turf/open/misc/asteroid, /area/shuttle/escape) "Am" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "An" = ( @@ -1934,12 +1934,12 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) "Bh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -1954,7 +1954,7 @@ /area/shuttle/escape) "Br" = ( /obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -2080,7 +2080,7 @@ /obj/machinery/power/apc/auto_name/directional/west, /obj/machinery/light/small/directional/west, /obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/grass, /area/shuttle/escape) "Dk" = ( @@ -2118,7 +2118,7 @@ /area/shuttle/escape) "Dv" = ( /obj/item/storage/book/bible, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/altar_of_gods, /turf/open/floor/carpet, /area/shuttle/escape) @@ -2132,7 +2132,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "DG" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 5 }, @@ -2170,7 +2170,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "DY" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/grass, /area/shuttle/escape) "Eb" = ( @@ -2188,7 +2188,7 @@ c_tag = "Monastery Art Storage"; network = list("ss13","monastery") }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 6 }, @@ -2200,7 +2200,7 @@ }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "Ew" = ( @@ -2303,7 +2303,7 @@ name = "Chapel" }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "FK" = ( @@ -2318,7 +2318,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -2340,7 +2340,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -2365,7 +2365,7 @@ /area/shuttle/escape) "GB" = ( /obj/effect/turf_decal/sand, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -2454,7 +2454,7 @@ "It" = ( /obj/machinery/light/small/directional/south, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -2530,7 +2530,7 @@ /obj/machinery/power/smes{ charge = 5e+006 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "Jg" = ( @@ -2626,7 +2626,7 @@ /obj/machinery/door/airlock/grunge{ name = "Art Storage" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2704,7 +2704,7 @@ /turf/open/floor/iron/showroomfloor, /area/shuttle/escape) "La" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -2819,7 +2819,7 @@ /turf/open/space, /area/shuttle/escape) "MC" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2828,7 +2828,7 @@ /obj/machinery/door/airlock/grunge{ name = "Art Gallery" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 @@ -2839,7 +2839,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "MX" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, @@ -2944,7 +2944,7 @@ dir = 1 }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -2999,7 +2999,7 @@ name = "Monastery Maintenance"; req_one_access_txt = "22;24;10;11;37" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, @@ -3113,7 +3113,7 @@ name = "Library" }, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "Qj" = ( @@ -3206,7 +3206,7 @@ /area/shuttle/escape) "Rj" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 @@ -3240,7 +3240,7 @@ "Rx" = ( /obj/item/storage/toolbox/mechanical, /obj/machinery/light/small/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3307,7 +3307,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -3347,7 +3347,7 @@ /obj/item/toy/crayon/spraycan, /obj/structure/table/wood, /obj/machinery/newscaster/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "Sq" = ( @@ -3456,7 +3456,7 @@ name = "Garden" }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "Ti" = ( @@ -3467,7 +3467,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "Tk" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -3488,7 +3488,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "Tt" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/port_gen/pacman, /turf/open/floor/plating, /area/shuttle/escape) @@ -3550,7 +3550,7 @@ /obj/structure/table/wood, /obj/machinery/airalarm/directional/west, /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "Up" = ( @@ -3563,7 +3563,7 @@ "Ur" = ( /obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 }, @@ -3733,12 +3733,12 @@ /turf/open/floor/plating, /area/shuttle/escape) "WG" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/shuttle/escape) "WH" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/dim/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -3821,7 +3821,7 @@ /area/shuttle/escape) "XI" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/escape) "XK" = ( @@ -3861,7 +3861,7 @@ /area/shuttle/escape) "XY" = ( /obj/effect/turf_decal/tile/red/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 1 }, @@ -3871,7 +3871,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "XZ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 6 @@ -3879,7 +3879,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "Yc" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3984,7 +3984,7 @@ /area/shuttle/escape/brig) "Zr" = ( /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ dir = 8 }, @@ -3996,7 +3996,7 @@ /turf/open/floor/carpet, /area/shuttle/escape) "ZM" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 4 }, @@ -4016,7 +4016,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "ZZ" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/carpet, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm index f0bfd3c0fd69..9b4331356169 100644 --- a/_maps/shuttles/emergency_nature.dmm +++ b/_maps/shuttles/emergency_nature.dmm @@ -1105,9 +1105,6 @@ /area/shuttle/escape) "Sl" = ( /obj/effect/turf_decal/trimline/blue/filled/line, -/obj/machinery/computer/operating{ - dir = 1 - }, /turf/open/floor/iron{ dir = 1 }, diff --git a/_maps/shuttles/emergency_omega.dmm b/_maps/shuttles/emergency_omega.dmm index 5524880b5573..ba57e491b02b 100644 --- a/_maps/shuttles/emergency_omega.dmm +++ b/_maps/shuttles/emergency_omega.dmm @@ -473,7 +473,6 @@ /area/shuttle/escape) "bo" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /obj/effect/turf_decal/tile/blue{ dir = 4 }, diff --git a/_maps/shuttles/emergency_raven.dmm b/_maps/shuttles/emergency_raven.dmm index 748a8f848d4b..9670ad5c8a2c 100644 --- a/_maps/shuttles/emergency_raven.dmm +++ b/_maps/shuttles/emergency_raven.dmm @@ -325,7 +325,6 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "aT" = ( -/obj/machinery/computer/operating, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -334,7 +333,6 @@ /obj/machinery/light/directional/north, /obj/machinery/status_display/evac/directional/north, /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -740,17 +738,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 @@ -1774,7 +1767,7 @@ /obj/effect/turf_decal/bot_white, /obj/structure/rack, /obj/effect/decal/cleanable/dirt, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment{ pixel_x = 5 @@ -1823,21 +1816,21 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/smes/engineering, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dD" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dE" = ( /obj/item/radio/intercom/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dF" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dH" = ( @@ -1869,7 +1862,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dN" = ( @@ -1881,7 +1874,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "dQ" = ( @@ -1977,7 +1970,7 @@ /obj/effect/decal/cleanable/dirt, /obj/machinery/power/port_gen/pacman, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "ed" = ( @@ -1985,7 +1978,7 @@ /obj/machinery/computer/monitor{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/escape) "ee" = ( diff --git a/_maps/shuttles/emergency_rollerdome.dmm b/_maps/shuttles/emergency_rollerdome.dmm index 39ddccf0a39f..9be037940ed4 100644 --- a/_maps/shuttles/emergency_rollerdome.dmm +++ b/_maps/shuttles/emergency_rollerdome.dmm @@ -283,10 +283,6 @@ /obj/structure/railing, /turf/open/floor/wood, /area/shuttle/escape) -"RN" = ( -/obj/machinery/jukebox/disco/indestructible, -/turf/open/floor/light, -/area/shuttle/escape) "TU" = ( /obj/structure/railing{ dir = 10 @@ -461,7 +457,7 @@ Cg ce pa HS -RN +HS HS pa dJ diff --git a/_maps/shuttles/emergency_russiafightpit.dmm b/_maps/shuttles/emergency_russiafightpit.dmm index 4677b40129f8..58076a453844 100644 --- a/_maps/shuttles/emergency_russiafightpit.dmm +++ b/_maps/shuttles/emergency_russiafightpit.dmm @@ -379,9 +379,7 @@ /obj/item/melee/baseball_bat{ pixel_x = -5 }, -/obj/item/crowbar/large{ - pixel_x = 6 - }, +/obj/item/crowbar, /turf/open/floor/mineral/plastitanium, /area/shuttle/escape) "bp" = ( diff --git a/_maps/shuttles/emergency_tram.dmm b/_maps/shuttles/emergency_tram.dmm index fa2eb836a256..5674f0cb71df 100644 --- a/_maps/shuttles/emergency_tram.dmm +++ b/_maps/shuttles/emergency_tram.dmm @@ -298,17 +298,12 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe/epinephrine{ pixel_x = 3; pixel_y = -2 diff --git a/_maps/shuttles/emergency_wabbajack.dmm b/_maps/shuttles/emergency_wabbajack.dmm index 1de7cfecc388..ad3e199b6579 100644 --- a/_maps/shuttles/emergency_wabbajack.dmm +++ b/_maps/shuttles/emergency_wabbajack.dmm @@ -208,7 +208,7 @@ /turf/open/floor/mineral/titanium, /area/shuttle/escape) "aQ" = ( -/obj/machinery/chem_heater/withbuffer, +/obj/machinery/chem_heater, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aR" = ( @@ -225,7 +225,7 @@ pixel_x = 2; pixel_y = 2 }, -/obj/item/reagent_containers/glass/bottle/multiver, +/obj/item/reagent_containers/glass/bottle/dylovene, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) "aU" = ( diff --git a/_maps/shuttles/emergency_zeta.dmm b/_maps/shuttles/emergency_zeta.dmm index e859f0bbd65e..05854dcde047 100644 --- a/_maps/shuttles/emergency_zeta.dmm +++ b/_maps/shuttles/emergency_zeta.dmm @@ -253,7 +253,6 @@ /area/shuttle/escape) "Tn" = ( /obj/structure/table/optable/abductor, -/obj/item/surgical_drapes, /turf/open/floor/plating/abductor, /area/shuttle/escape) "Um" = ( diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index f69156aef90d..eb2d5264ec30 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -43,9 +43,6 @@ /obj/item/food/meat/slab/human/mutant/fly{ name = "flyman meat" }, -/obj/item/food/meat/slab/human/mutant/golem/adamantine{ - name = "golem meat" - }, /obj/item/food/meat/slab/human/mutant/lizard{ name = "lizard meat" }, diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index 79f99bad492b..6422cf1c654a 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -70,10 +70,6 @@ }, /turf/open/floor/pod/light, /area/shuttle/hunter) -"p" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/hook, -/turf/open/floor/pod/light, -/area/shuttle/hunter) "q" = ( /obj/structure/shuttle/engine/heater{ dir = 8 @@ -211,9 +207,6 @@ /turf/open/floor/plating, /area/shuttle/hunter) "M" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/armor{ - dir = 1 - }, /turf/open/floor/pod/light, /area/shuttle/hunter) "P" = ( @@ -222,10 +215,6 @@ }, /turf/open/floor/pod/light, /area/shuttle/hunter) -"Z" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/synth, -/turf/open/floor/pod/light, -/area/shuttle/hunter) (1,1,1) = {" a @@ -427,7 +416,7 @@ a a a i -p +M s s s @@ -442,7 +431,7 @@ a a a i -Z +M z s z diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 8a727d9fdd40..29a93acc962d 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -28,7 +28,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) "bK" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -82,9 +82,6 @@ /turf/open/floor/plating/airless, /area/shuttle/hunter/russian) "eQ" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian{ - dir = 1 - }, /obj/effect/turf_decal/bot_red, /obj/effect/decal/cleanable/dirt, /turf/open/floor/pod/dark, @@ -168,7 +165,7 @@ /obj/machinery/door/airlock/security/glass{ name = "Ship Support Systems" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -227,7 +224,7 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "sR" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -266,7 +263,6 @@ /obj/effect/turf_decal/bot_red, /obj/effect/turf_decal/siding/red, /obj/effect/decal/cleanable/dirt, -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian/leader, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "xd" = ( @@ -300,9 +296,6 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/hunter/russian) "yr" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian{ - dir = 1 - }, /obj/effect/turf_decal/bot_red, /obj/machinery/light/small/directional/south, /turf/open/floor/pod/dark, @@ -383,13 +376,13 @@ /obj/item/reagent_containers/food/drinks/bottle/vodka, /obj/item/reagent_containers/food/drinks/bottle/vodka, /obj/item/reagent_containers/food/drinks/bottle/vodka, -/obj/item/crowbar/large/old, +/obj/item/crowbar/old, /obj/item/lighter/greyscale, /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "Ej" = ( /obj/machinery/power/apc/auto_name/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/suit_storage_unit/standard_unit{ mask_type = /obj/item/clothing/mask/gas; storage_type = /obj/item/tank/internals/oxygen/yellow @@ -410,7 +403,7 @@ /turf/open/floor/plating/airless, /area/shuttle/hunter/russian) "Fy" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line, /obj/machinery/power/smes/engineering{ charge = 1e+006 @@ -446,7 +439,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/hunter/russian) "Gu" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -615,9 +608,6 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "Th" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian{ - dir = 1 - }, /obj/effect/turf_decal/bot_red, /obj/effect/decal/cleanable/dirt, /obj/structure/sign/poster/contraband/kss13{ @@ -679,7 +669,7 @@ /turf/open/floor/pod/dark, /area/shuttle/hunter/russian) "WG" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/terminal{ dir = 8 }, diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 2d8486d13a04..d04095da29c2 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -71,9 +71,6 @@ /obj/structure/chair/comfy/shuttle{ dir = 1 }, -/obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol{ - dir = 1 - }, /obj/effect/turf_decal/box, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) @@ -115,9 +112,6 @@ /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) "Am" = ( -/obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol{ - dir = 8 - }, /obj/effect/turf_decal/box, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm index f01e13f0cefd..6cee70273883 100644 --- a/_maps/shuttles/infiltrator_advanced.dmm +++ b/_maps/shuttles/infiltrator_advanced.dmm @@ -192,7 +192,7 @@ name = "Infiltrator E.V.A APC"; pixel_y = -25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) "av" = ( @@ -203,7 +203,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) "aw" = ( @@ -214,7 +214,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) "ax" = ( @@ -225,7 +225,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) "ay" = ( @@ -240,7 +240,7 @@ pixel_y = -24 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/bridge) "az" = ( @@ -248,7 +248,7 @@ /obj/machinery/computer/monitor/secret{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/bridge) "aA" = ( @@ -260,7 +260,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/bridge) "aB" = ( @@ -340,7 +340,7 @@ name = "Infiltrator Airlock APC"; pixel_x = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) "aL" = ( @@ -356,7 +356,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "aN" = ( @@ -374,7 +374,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "aQ" = ( @@ -415,7 +415,7 @@ dir = 4; pixel_x = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/hallway) "aU" = ( @@ -424,7 +424,7 @@ }, /obj/effect/turf_decal/stripes/corner, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "aV" = ( @@ -432,7 +432,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "aW" = ( @@ -444,7 +444,7 @@ name = "Infiltrator Access"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "aX" = ( @@ -466,7 +466,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "aZ" = ( @@ -489,7 +489,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "bb" = ( @@ -507,7 +507,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "bd" = ( @@ -515,7 +515,7 @@ /obj/item/storage/box/bodybags{ pixel_y = 6 }, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, /obj/item/stack/medical/bruise_pack{ pixel_x = 6 }, @@ -538,7 +538,7 @@ name = "Infiltrator Access"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "bf" = ( @@ -552,7 +552,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "bh" = ( @@ -562,7 +562,7 @@ id = "infiltrator_medbay"; name = "Infiltrator Medical Bay" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bi" = ( @@ -595,7 +595,7 @@ /obj/item/reagent_containers/hypospray/medipen{ pixel_y = -6 }, -/obj/item/reagent_containers/glass/bottle/multiver, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/structure/table/reinforced, /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, @@ -664,7 +664,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "bs" = ( @@ -699,7 +699,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "bw" = ( @@ -715,21 +715,21 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "by" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/medical) "bA" = ( @@ -756,7 +756,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "bD" = ( @@ -800,7 +800,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "bK" = ( @@ -833,7 +833,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "bO" = ( @@ -878,7 +878,7 @@ name = "Infiltrator E.V.A APC"; pixel_y = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) "bT" = ( @@ -923,7 +923,7 @@ pixel_x = 4; pixel_y = 4 }, -/obj/item/book/manual/wiki/surgery, +/obj/item/book/manual/codex/surgery, /obj/item/clothing/gloves/color/latex, /obj/item/clothing/mask/surgical, /obj/item/clothing/suit/apron/surgical, @@ -946,7 +946,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "bY" = ( @@ -984,7 +984,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "cc" = ( @@ -995,7 +995,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "cd" = ( @@ -1030,7 +1030,6 @@ /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) "ch" = ( -/obj/item/surgical_drapes, /obj/item/retractor, /obj/item/cautery, /obj/structure/table/reinforced, @@ -1076,7 +1075,7 @@ /area/shuttle/syndicate/hallway) "cl" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/syndicate/hallway) "cm" = ( @@ -1086,7 +1085,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "co" = ( @@ -1096,7 +1095,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/light/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "cp" = ( @@ -1419,7 +1418,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/eva) "df" = ( @@ -1440,7 +1439,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/eva) "dh" = ( @@ -1522,7 +1521,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/light/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/airlock) "do" = ( @@ -1533,7 +1532,7 @@ /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) "dp" = ( @@ -1572,7 +1571,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "dt" = ( @@ -1582,7 +1581,7 @@ /obj/effect/turf_decal/bot, /obj/effect/turf_decal/caution/stand_clear, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) "du" = ( @@ -1596,7 +1595,7 @@ dir = 10 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "dv" = ( @@ -1612,7 +1611,7 @@ id = "infiltrator_armorybay"; name = "Infiltrator Armoy Bay" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) "dx" = ( @@ -1632,7 +1631,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "dz" = ( @@ -1661,7 +1660,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/medical) "dB" = ( @@ -1673,7 +1672,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "dC" = ( @@ -1683,7 +1682,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) "dD" = ( @@ -1745,7 +1744,7 @@ pixel_x = -25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/medical) "dI" = ( @@ -1754,7 +1753,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "dJ" = ( @@ -1778,7 +1777,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/hallway) "dL" = ( @@ -1789,7 +1788,7 @@ dir = 8 }, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) "dM" = ( @@ -1808,7 +1807,7 @@ name = "Infiltrator Armory APC"; pixel_x = 25 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/armory) "dN" = ( @@ -1861,13 +1860,10 @@ pixel_y = -32 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/armory) "dT" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, /obj/effect/turf_decal/bot, /obj/machinery/airalarm/syndicate{ dir = 8; @@ -1922,7 +1918,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "dZ" = ( @@ -1972,7 +1968,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "ed" = ( @@ -1998,7 +1994,7 @@ dir = 1 }, /obj/machinery/light/small/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/circuit/red, /area/shuttle/syndicate/hallway) "ef" = ( @@ -2007,7 +2003,7 @@ }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "eg" = ( @@ -2018,7 +2014,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "eh" = ( @@ -2029,7 +2025,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "ei" = ( @@ -2054,7 +2050,7 @@ }, /obj/machinery/light/directional/east, /obj/structure/extinguisher_cabinet/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/eva) "ek" = ( @@ -2069,7 +2065,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/syndicate/hallway) "el" = ( @@ -2081,7 +2077,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "em" = ( @@ -2097,7 +2093,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/armory) "en" = ( diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm index 96be0a3f3a42..f27bbe66cb73 100644 --- a/_maps/shuttles/infiltrator_basic.dmm +++ b/_maps/shuttles/infiltrator_basic.dmm @@ -48,7 +48,8 @@ /turf/open/floor/iron/dark, /area/shuttle/syndicate/bridge) "ak" = ( -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/hallway) "al" = ( /obj/machinery/computer/camera_advanced/syndie, @@ -69,7 +70,8 @@ /obj/structure/chair/office/tactical{ dir = 8 }, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/bridge) "ap" = ( /turf/open/floor/iron/dark, @@ -84,7 +86,8 @@ /obj/structure/chair/office/tactical{ dir = 4 }, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/bridge) "as" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -240,7 +243,8 @@ /turf/open/floor/plating, /area/shuttle/syndicate/airlock) "bi" = ( -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/engineering) "bj" = ( /turf/closed/wall/r_wall/syndicate/nodiagonal, @@ -296,6 +300,10 @@ /obj/structure/railing{ dir = 4 }, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/o_minus, +/obj/item/reagent_containers/blood/o_minus, /turf/open/floor/iron/dark/textured_large, /area/shuttle/syndicate/medical) "bt" = ( @@ -323,7 +331,7 @@ /area/shuttle/syndicate/medical) "bu" = ( /obj/structure/table/reinforced, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, /obj/item/stack/medical/bruise_pack, /obj/item/stack/medical/ointment, /obj/effect/turf_decal/tile/blue{ @@ -453,13 +461,8 @@ pixel_x = -3; pixel_y = 8 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = 6; - pixel_y = 8 - }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, @@ -491,6 +494,12 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/regular, +/obj/item/storage/medkit/fire, +/obj/item/storage/medkit/o2, +/obj/item/storage/medkit/brute, +/obj/item/storage/medkit/brute, /turf/open/floor/iron, /area/shuttle/syndicate/medical) "ce" = ( @@ -534,7 +543,6 @@ /area/shuttle/syndicate/hallway) "cp" = ( /obj/structure/table/optable, -/obj/item/surgical_drapes, /turf/open/floor/iron/white, /area/shuttle/syndicate/medical) "cr" = ( @@ -616,20 +624,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/syndicate/engineering) -"cT" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/brute, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/iron, -/area/shuttle/syndicate/medical) "df" = ( /obj/machinery/newscaster/directional/south, /turf/open/floor/iron/dark, @@ -641,7 +635,8 @@ /turf/closed/wall/r_wall/syndicate, /area/shuttle/syndicate/engineering) "dz" = ( -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/medical) "el" = ( /obj/machinery/light/directional/east, @@ -714,7 +709,8 @@ /area/shuttle/syndicate/eva) "lJ" = ( /obj/effect/turf_decal/siding/thinplating_new, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/medical) "mj" = ( /obj/effect/turf_decal/tile/red/half{ @@ -779,7 +775,8 @@ /turf/open/floor/iron/dark, /area/shuttle/syndicate/eva) "tG" = ( -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/syndicate/bridge) "tM" = ( /turf/open/floor/iron/dark/textured_corner{ @@ -791,19 +788,19 @@ /obj/effect/turf_decal/syndicateemblem/bottom/left, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/syndicate/hallway) -"vl" = ( -/obj/item/storage/medkit/regular{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/medkit/fire, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = -3 +"uO" = ( +/obj/effect/turf_decal/tile/blue, +/obj/machinery/bodyscanner{ + dir = 8 }, -/obj/structure/table/reinforced, +/turf/open/floor/iron, +/area/shuttle/syndicate/medical) +"vl" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/sign/poster/contraband/random/directional/south, +/obj/machinery/bodyscanner_console{ + dir = 8 + }, /turf/open/floor/iron, /area/shuttle/syndicate/medical) "vv" = ( @@ -979,12 +976,10 @@ /turf/open/floor/iron/dark/textured_corner, /area/shuttle/syndicate/engineering) "JQ" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = 11 - }, /obj/structure/mirror/directional/east, /obj/effect/turf_decal/tile/blue, +/obj/structure/rack, +/obj/item/defibrillator/loaded, /turf/open/floor/iron/white/side, /area/shuttle/syndicate/medical) "Km" = ( @@ -1004,14 +999,13 @@ /turf/open/floor/iron/white/side, /area/shuttle/syndicate/medical) "Lh" = ( -/obj/structure/rack, -/obj/item/toy/plush/nukeplushie, /obj/effect/turf_decal/siding/thinplating_new{ dir = 6 }, /obj/structure/railing{ dir = 6 }, +/obj/machinery/vitals_monitor, /turf/open/floor/iron/dark/textured_large, /area/shuttle/syndicate/medical) "MJ" = ( @@ -1037,6 +1031,13 @@ }, /turf/open/floor/iron/dark, /area/shuttle/syndicate/airlock) +"NZ" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/turf/open/floor/iron, +/area/shuttle/syndicate/medical) "Qb" = ( /obj/effect/turf_decal/syndicateemblem/middle/left, /turf/open/floor/mineral/plastitanium/red, @@ -1243,7 +1244,7 @@ bt br Ro br -cT +uO aK aJ aJ @@ -1265,7 +1266,7 @@ Xw aZ aJ bu -br +NZ br br vl diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index 171cec10a1f3..f2cc3e6ea9dd 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -26,7 +26,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/labor) "f" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/shuttle/labor) diff --git a/_maps/shuttles/mining_common_kilo.dmm b/_maps/shuttles/mining_common_kilo.dmm deleted file mode 100644 index 76b22ac96222..000000000000 --- a/_maps/shuttles/mining_common_kilo.dmm +++ /dev/null @@ -1,173 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"b" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/mining) -"c" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"d" = ( -/obj/machinery/computer/shuttle/mining/common, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"e" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"f" = ( -/obj/effect/turf_decal/stripes/end{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"g" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"h" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"i" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"j" = ( -/obj/machinery/light/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"k" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"l" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"m" = ( -/obj/machinery/door/airlock/titanium{ - name = "Lavaland Shuttle Airlock" - }, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_common"; - name = "lavaland shuttle"; - port_direction = 4; - width = 7 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"n" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"o" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/delivery, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"p" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating, -/area/shuttle/mining) -"q" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/delivery, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"r" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"s" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/open/floor/plating/airless, -/area/shuttle/mining) - -(1,1,1) = {" -a -a -b -i -b -a -a -"} -(2,1,1) = {" -a -c -f -j -n -o -r -"} -(3,1,1) = {" -b -d -g -k -n -p -s -"} -(4,1,1) = {" -a -e -h -l -n -q -r -"} -(5,1,1) = {" -a -a -b -m -b -a -a -"} diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm deleted file mode 100644 index 013ff187afc3..000000000000 --- a/_maps/shuttles/mining_common_meta.dmm +++ /dev/null @@ -1,122 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"b" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/mining) -"c" = ( -/obj/structure/table, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"d" = ( -/obj/machinery/computer/shuttle/mining/common, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"e" = ( -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) -"f" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"g" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) -"h" = ( -/obj/machinery/door/airlock/titanium{ - name = "Lavaland Shuttle Airlock" - }, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_common"; - name = "lavaland shuttle"; - port_direction = 4; - width = 7 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"i" = ( -/obj/structure/closet/crate, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"j" = ( -/obj/structure/shuttle/engine/heater, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"k" = ( -/obj/structure/ore_box, -/turf/open/floor/mineral/titanium/blue, -/area/shuttle/mining) -"l" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/open/floor/plating/airless, -/area/shuttle/mining) -"Q" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium, -/area/shuttle/mining) - -(1,1,1) = {" -a -a -b -a -b -a -a -"} -(2,1,1) = {" -a -c -e -g -f -i -a -"} -(3,1,1) = {" -b -d -Q -e -f -j -l -"} -(4,1,1) = {" -a -c -e -e -f -k -a -"} -(5,1,1) = {" -a -a -b -h -b -a -a -"} diff --git a/_maps/shuttles/mining_freight.dmm b/_maps/shuttles/mining_freight.dmm deleted file mode 100644 index c6fe00f27ae4..000000000000 --- a/_maps/shuttles/mining_freight.dmm +++ /dev/null @@ -1,171 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"b" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/mining) -"c" = ( -/obj/structure/table, -/obj/item/storage/toolbox/emergency, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"d" = ( -/obj/machinery/computer/shuttle/mining/common, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"e" = ( -/obj/structure/table, -/obj/item/radio, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"f" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"g" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"h" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"i" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"j" = ( -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"k" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"l" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/yellow, -/area/shuttle/mining) -"m" = ( -/obj/machinery/door/airlock/titanium{ - name = "Lavaland Shuttle Airlock" - }, -/obj/docking_port/mobile{ - dir = 8; - dwidth = 3; - height = 5; - id = "mining_common"; - name = "lavaland shuttle"; - port_direction = 4; - width = 7 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/mining) -"n" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"o" = ( -/obj/structure/closet/crate, -/obj/effect/turf_decal/delivery, -/obj/machinery/airalarm/directional/west, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"p" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating, -/area/template_noop) -"q" = ( -/obj/structure/ore_box, -/obj/effect/turf_decal/delivery, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/mining) -"r" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/mineral/titanium, -/area/shuttle/mining) -"s" = ( -/obj/structure/shuttle/engine/propulsion/burst, -/turf/open/floor/plating/airless, -/area/shuttle/mining) - -(1,1,1) = {" -a -a -b -i -b -a -a -"} -(2,1,1) = {" -a -c -f -j -n -o -r -"} -(3,1,1) = {" -b -d -g -k -n -p -s -"} -(4,1,1) = {" -a -e -h -l -n -q -r -"} -(5,1,1) = {" -a -a -b -m -b -a -a -"} diff --git a/_maps/shuttles/mining_kilo.dmm b/_maps/shuttles/mining_kilo.dmm index ff3cc154c6f2..e884e7c0878a 100644 --- a/_maps/shuttles/mining_kilo.dmm +++ b/_maps/shuttles/mining_kilo.dmm @@ -231,14 +231,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/mining/large) "B" = ( /obj/effect/turf_decal/box/corners{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/mining/large) "C" = ( @@ -251,7 +251,7 @@ /area/shuttle/mining/large) "E" = ( /obj/effect/turf_decal/box/corners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/mining/large) "F" = ( @@ -278,7 +278,7 @@ name = "Mining Shuttle External Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -289,7 +289,7 @@ "J" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -300,7 +300,7 @@ /obj/structure/sign/warning/vacuum/external{ pixel_x = 32 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -328,7 +328,7 @@ port_direction = 2; width = 7 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ dir = 1 diff --git a/_maps/shuttles/mining_large.dmm b/_maps/shuttles/mining_large.dmm index 26b769aad2c0..bf6e34a4dbf1 100644 --- a/_maps/shuttles/mining_large.dmm +++ b/_maps/shuttles/mining_large.dmm @@ -372,7 +372,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/white/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/mining/large) "A" = ( @@ -380,12 +380,12 @@ /obj/effect/turf_decal/box/white/corners{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/mining/large) "B" = ( /obj/effect/turf_decal/box/white/corners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/mining/large) "C" = ( @@ -403,7 +403,7 @@ name = "Mining Shuttle External Airlock" }, /obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/mining/large) "E" = ( @@ -412,7 +412,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/mining/large) "F" = ( @@ -430,7 +430,7 @@ /obj/structure/sign/warning/vacuum/external{ pixel_x = 32 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/mining/large) "I" = ( @@ -452,7 +452,7 @@ port_direction = 2; width = 7 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/mining/large) diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm deleted file mode 100644 index e337a20f030e..000000000000 --- a/_maps/shuttles/pirate_default.dmm +++ /dev/null @@ -1,1414 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/small/directional/west, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ab" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/recharger, -/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/iron/dark, -/area/shuttle/pirate) -"ac" = ( -/obj/machinery/computer/shuttle/pirate, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ad" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "piratebridge"; - name = "Bridge Shutters Control"; - pixel_y = -5 - }, -/obj/item/radio/intercom{ - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/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/iron/dark, -/area/shuttle/pirate) -"ae" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"af" = ( -/turf/template_noop, -/area/template_noop) -"ag" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ah" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ai" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/south, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"aj" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"ak" = ( -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/structure/closet/secure_closet/freezer{ - locked = 0; - name = "fridge" - }, -/obj/item/storage/box/donkpockets{ - pixel_x = 2; - pixel_y = 3 - }, -/obj/item/storage/box/donkpockets, -/obj/item/storage/fancy/donut_box, -/obj/item/food/cookie, -/obj/item/food/cookie{ - pixel_x = -6; - pixel_y = -6 - }, -/obj/item/food/chocolatebar, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"al" = ( -/obj/machinery/loot_locator, -/obj/effect/decal/cleanable/dirt, -/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/iron/dark, -/area/shuttle/pirate) -"am" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"an" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/machinery/button/door/directional/south{ - id = "piratebridgebolt"; - name = "Bridge Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ao" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ap" = ( -/obj/machinery/door/airlock/hatch{ - name = "Port Gun Battery" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"aq" = ( -/obj/structure/chair/stool/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"ar" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/storage/fancy/cigarettes{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/storage/fancy/cigarettes/cigpack_carp{ - pixel_x = 10; - pixel_y = 6 - }, -/obj/item/storage/fancy/cigarettes/cigpack_robust{ - pixel_x = 2 - }, -/obj/item/storage/fancy/cigarettes/cigpack_midori{ - pixel_x = 10 - }, -/obj/item/storage/fancy/cigarettes/cigpack_shadyjims{ - pixel_x = 2; - pixel_y = -6 - }, -/obj/item/storage/fancy/cigarettes/cigpack_uplift{ - pixel_x = 10; - pixel_y = -6 - }, -/obj/item/lighter{ - pixel_x = -10; - pixel_y = -2 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"au" = ( -/obj/machinery/door/airlock/hatch{ - id_tag = "piratebridgebolt"; - name = "Bridge" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"av" = ( -/obj/machinery/door/airlock/hatch{ - name = "Starboard Gun Battery" - }, -/obj/structure/barricade/wooden/crude, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"aw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"ax" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"ay" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/vomit/old, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"az" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/chem_dispenser/drinks{ - dir = 8 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"aB" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/computer/monitor/secret{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/airalarm/all_access{ - pixel_y = -24 - }, -/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/iron/dark, -/area/shuttle/pirate) -"aC" = ( -/obj/machinery/shuttle_scrambler, -/obj/effect/decal/cleanable/dirt, -/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/iron/dark, -/area/shuttle/pirate) -"aD" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aF" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aH" = ( -/obj/structure/shuttle/engine/propulsion/left, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"aI" = ( -/obj/machinery/light/small/directional/west, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = -32 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aJ" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aK" = ( -/obj/structure/shuttle/engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"aL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aM" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/wood, -/area/shuttle/pirate) -"aN" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/button/door/directional/south{ - id = "pirateportexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aO" = ( -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/stripes/corner, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/button/door/directional/south{ - id = "piratestarboardexternal"; - name = "External Bolt Control"; - normaldoorcontrol = 1; - specialfunctions = 4 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aQ" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 1; - faction = list("pirate") - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"aR" = ( -/obj/machinery/porta_turret/syndicate/energy{ - faction = list("pirate") - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/pirate) -"aS" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"aU" = ( -/obj/structure/sign/departments/engineering, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/pirate) -"aV" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aW" = ( -/obj/machinery/light/small/directional/west, -/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/directional/south, -/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/iron/dark, -/area/shuttle/pirate) -"be" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/oil, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bf" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/turretid{ - icon_state = "control_kill"; - lethal = 1; - locked = 0; - pixel_y = -24; - req_access = null - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/obj/machinery/recharger, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bo" = ( -/obj/machinery/light/small/directional/east, -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"br" = ( -/obj/structure/table/wood, -/obj/item/storage/box/matches, -/obj/item/reagent_containers/food/drinks/bottle/rum{ - name = "Captain Pete's Private Reserve Cuban Spaced Rum"; - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = 6; - pixel_y = 12 - }, -/obj/item/clothing/mask/cigarette/cigar, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/wood, -/area/shuttle/pirate) -"bt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/small/directional/north, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/melee/energy/sword/pirate{ - pixel_x = -1; - pixel_y = 6 - }, -/obj/item/melee/energy/sword/pirate{ - pixel_x = 6; - pixel_y = 6 - }, -/obj/item/melee/energy/sword/pirate{ - pixel_x = 13; - pixel_y = 6 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"bu" = ( -/obj/machinery/firealarm/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"by" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/piratepad, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bC" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/obj/machinery/light/small/directional/east, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bF" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/obj/item/book/manual/wiki/barman_recipes{ - pixel_x = -8 - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bH" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"bI" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/computer/piratepad_control{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/decal/cleanable/dirt, -/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/iron, -/area/shuttle/pirate) -"bK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/sink{ - pixel_y = 24 - }, -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron/showroomfloor, -/area/shuttle/pirate) -"bM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - name = "Crew Cabin" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"bO" = ( -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot, -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bQ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bX" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/power/terminal{ - dir = 4 - }, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 4 - }, -/obj/item/flashlight{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/storage/box/lights/bulbs, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/obj/item/multitool, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/plating, -/area/shuttle/pirate) -"bZ" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/pirate) -"ce" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/docking_port/mobile/pirate{ - dwidth = 11; - height = 16; - launch_status = 0; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); - name = "Pirate Ship"; - port_direction = 2; - width = 17 - }, -/obj/docking_port/stationary{ - dwidth = 11; - height = 16; - id = "pirateship_home"; - name = "Deep Space"; - width = 17 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/plating, -/area/shuttle/pirate) -"df" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/pirate) -"dy" = ( -/obj/structure/chair/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/light/small/directional/east, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/wood, -/area/shuttle/pirate) -"dU" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ek" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/structure/sign/poster/contraband/revolver{ - pixel_x = 32 - }, -/obj/item/storage/backpack/duffelbag/syndie/x4{ - pixel_y = 8 - }, -/obj/item/grenade/smokebomb{ - pixel_x = -5 - }, -/obj/item/grenade/smokebomb{ - pixel_x = 5 - }, -/obj/structure/sign/poster/contraband/bountyhunters{ - pixel_y = 32 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"ep" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/shuttle/engine/heater, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"er" = ( -/obj/structure/shuttle/engine/propulsion/right, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"et" = ( -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eu" = ( -/obj/structure/girder, -/obj/item/stack/rods{ - amount = 3 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ew" = ( -/obj/structure/girder, -/obj/item/stack/rods{ - amount = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ex" = ( -/obj/structure/window/reinforced, -/obj/structure/frame/machine, -/obj/item/wrench, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"ey" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "piratebridge" - }, -/obj/structure/grille, -/obj/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/pirate) -"ez" = ( -/obj/structure/window/reinforced, -/obj/structure/frame/machine, -/obj/item/stack/cable_coil/cut, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eA" = ( -/obj/structure/window/reinforced{ - dir = 1; - pixel_y = 1 - }, -/obj/structure/frame/computer{ - anchored = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"eE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/pirate) -"fW" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/pirate) -"fY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"gY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"km" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/turf_decal/bot, -/obj/machinery/firealarm/directional/north, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"mD" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/shuttle/pirate) -"mU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock/engineering{ - name = "Engineering" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"np" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/shuttle/pirate) -"vB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/storage/box/lethalshot, -/obj/item/gun/ballistic/shotgun/automatic/combat{ - pixel_x = -2; - pixel_y = 2 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"wf" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/iron/showroomfloor, -/area/shuttle/pirate) -"wR" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 8; - faction = list("pirate") - }, -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/pirate) -"yi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/hatch{ - name = "Armory Access" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"zw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/door/airlock{ - name = "Captain's Quarters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/wood, -/area/shuttle/pirate) -"ED" = ( -/obj/effect/turf_decal/delivery, -/obj/effect/decal/cleanable/dirt, -/obj/structure/tank_dispenser/oxygen, -/turf/open/floor/plating, -/area/shuttle/pirate) -"Gk" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/shower{ - name = "decontamination shower"; - pixel_y = 12 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/window{ - dir = 4 - }, -/obj/machinery/door/window{ - name = "Decontamination" - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"JT" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate, -/obj/item/storage/bag/money/vault, -/obj/item/stack/sheet/mineral/gold{ - amount = 3; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 8; - pixel_x = 2; - pixel_y = -1 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"Ni" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"Oe" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"OD" = ( -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"OL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) -"RY" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/captain{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/decal/cleanable/dirt, -/obj/structure/sign/poster/contraband/random{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/shuttle/pirate) -"Ur" = ( -/obj/structure/closet/secure_closet/personal, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/iron, -/area/shuttle/pirate) - -(1,1,1) = {" -af -af -af -fW -aj -aj -aj -aj -aj -aj -aj -wR -af -af -af -af -"} -(2,1,1) = {" -af -et -eu -ex -eA -aa -ap -aw -ak -bF -aj -aj -aj -fW -af -af -"} -(3,1,1) = {" -aQ -aj -aj -aj -aj -aj -aj -ax -aq -ar -aj -RY -aM -ep -aH -af -"} -(4,1,1) = {" -af -af -af -af -af -af -ey -ay -Oe -OL -zw -dy -br -ep -er -af -"} -(5,1,1) = {" -af -af -af -af -af -af -aj -az -bx -bH -aj -aj -aj -aj -aj -aR -"} -(6,1,1) = {" -af -af -af -ey -ey -aj -aj -aj -yi -aj -aj -Gk -Ni -aF -aI -aJ -"} -(7,1,1) = {" -af -af -ey -ey -aC -aW -aj -bg -gY -JT -aj -km -aN -aj -aj -aj -"} -(8,1,1) = {" -af -af -ey -ab -ae -bf -aj -bl -fY -ai -aU -be -aD -aG -ep -aH -"} -(9,1,1) = {" -af -af -ey -ac -ag -am -au -bm -by -bm -mU -aL -bP -bX -ep -aK -"} -(10,1,1) = {" -af -af -ey -ad -ah -an -aj -bt -gY -bI -aj -bO -bQ -bk -ep -er -"} -(11,1,1) = {" -af -af -ey -ey -al -aB -aj -ek -bA -vB -aj -np -aO -aj -aj -aj -"} -(12,1,1) = {" -af -af -af -ey -ey -aj -aj -aj -yi -aj -aj -ED -aS -bZ -bo -ce -"} -(13,1,1) = {" -af -af -af -af -af -af -aj -mD -bB -Ur -aj -aj -aj -aj -aj -aR -"} -(14,1,1) = {" -af -af -af -af -af -af -ey -eE -bC -bJ -bM -dU -aV -ep -aH -af -"} -(15,1,1) = {" -aQ -aj -aj -aj -aj -aj -aj -bu -aj -wf -aj -OD -aV -ep -er -af -"} -(16,1,1) = {" -af -et -ew -ez -eA -ao -av -bv -aj -bK -aj -aj -aj -fW -af -af -"} -(17,1,1) = {" -af -af -af -fW -aj -aj -aj -aj -aj -aj -aj -df -af -af -af -af -"} diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm deleted file mode 100644 index dc27959fe561..000000000000 --- a/_maps/shuttles/pirate_dutchman.dmm +++ /dev/null @@ -1,1535 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"ac" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate/flying_dutchman) -"ad" = ( -/obj/effect/turf_decal/siding/wood/end, -/obj/structure/cannon{ - dir = 1 - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 8; - name = "wooden railing" - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate/flying_dutchman) -"af" = ( -/turf/template_noop, -/area/template_noop) -"ak" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/structure/chair/wood{ - dir = 1 - }, -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/gunner, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"am" = ( -/obj/structure/railing{ - color = "#4C3117"; - dir = 5; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/drinks/bottle/beer{ - pixel_x = -5; - pixel_y = 8 - }, -/obj/item/stack/cannonball/fourteen, -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"an" = ( -/obj/structure/railing{ - color = "#4C3117"; - dir = 9; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/table/wood, -/obj/item/melee/baseball_bat{ - desc = "Throw the plank! Arr..."; - icon_state = "baseball_bat_metal"; - name = "knocking stick"; - pixel_y = 4 - }, -/obj/item/binoculars{ - pixel_x = 6; - pixel_y = 1 - }, -/obj/item/flashlight/flare/torch, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"ao" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"aw" = ( -/obj/machinery/computer/monitor/secret{ - dir = 8 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"aB" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"aK" = ( -/obj/structure/railing{ - color = "#4C3117"; - dir = 5; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"aO" = ( -/obj/structure/railing{ - color = "#4C3117"; - dir = 9; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"aZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/closet/cabinet, -/obj/item/storage/bag/money/dutchmen, -/obj/item/stack/sheet/mineral/gold{ - amount = 3; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 8; - pixel_x = 2; - pixel_y = -1 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"be" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"bn" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"bu" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 8; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"by" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"bO" = ( -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"co" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"da" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"dc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/storage/box/lethalshot, -/obj/item/gun/ballistic/shotgun/automatic/combat, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"dM" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/grenade/smokebomb{ - pixel_x = 5 - }, -/obj/item/grenade/smokebomb{ - pixel_x = -5 - }, -/obj/item/paper/crumpled/muddy/fluff/cannon_instructions, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"dZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/fermenting_barrel, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"en" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"eA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"eG" = ( -/obj/structure/mineral_door/wood{ - color = "#6b6536" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"fH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/wood, -/obj/item/stack/cannonball/fourteen, -/obj/item/flashlight/flare/torch, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"fW" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"fY" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"gq" = ( -/obj/machinery/computer/shuttle/pirate{ - dir = 1 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"gP" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/comfy/shuttle, -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"gQ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/closet/cabinet, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/restraints/handcuffs/cable/zipties, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"gS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/fermenting_barrel/gunpowder, -/obj/item/reagent_containers/glass/bucket/wooden, -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"hz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"hV" = ( -/obj/structure/table/wood, -/obj/machinery/recharger{ - pixel_y = 2 - }, -/obj/item/stack/cannonball/emp{ - pixel_x = -8 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"it" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 1 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"km" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"kz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"mG" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"ny" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/obj/machinery/light/floor/has_bulb, -/turf/open/space/basic, -/area/shuttle/pirate/flying_dutchman) -"pG" = ( -/obj/structure/window/reinforced/shuttle/survival_pod, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"rd" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"rN" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"sa" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"sc" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/headpike/bone, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"sf" = ( -/obj/machinery/door/airlock/vault{ - color = "#825427"; - name = "ye olde strong door" - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"sC" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"tt" = ( -/obj/machinery/piratepad, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"tH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"uk" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 8; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"uw" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/obj/structure/cannon{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate/flying_dutchman) -"uR" = ( -/obj/machinery/power/tracker{ - dir = 8 - }, -/obj/structure/cable, -/turf/open/floor/iron/solarpanel/airless, -/area/shuttle/pirate/flying_dutchman) -"vi" = ( -/obj/structure/railing{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/obj/structure/railing{ - color = "#4C3117"; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"vt" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 8 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"vw" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"vT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/fluff{ - density = 1; - desc = "Ha ha ha, you fool!"; - icon = 'icons/obj/stack_objects.dmi'; - icon_state = "sheet-gold_3"; - name = "fool's gold" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"xA" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ - dir = 1; - x_offset = -4; - y_offset = -8 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"yy" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"zw" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"zE" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/floor/has_bulb, -/obj/structure/fluff{ - density = 1; - desc = "Ha ha ha, you fool!"; - icon = 'icons/obj/stack_objects.dmi'; - icon_state = "sheet-silver_2"; - name = "fool's silver" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"zO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Ac" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/light/small/directional/south, -/obj/structure/fermenting_barrel/gunpowder, -/obj/item/reagent_containers/glass/bucket/wooden, -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"BK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/light/floor/has_bulb, -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/reagent_containers/food/condiment/milk{ - pixel_x = -5 - }, -/obj/item/reagent_containers/food/condiment/milk{ - pixel_x = 5 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Cv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Da" = ( -/obj/structure/festivus{ - anchored = 1; - color = "#825427"; - desc = "A sturdy pole designed to hold the vessel's solar sails in place."; - name = "mast"; - pixel_x = -16; - pixel_y = 2 - }, -/turf/closed/wall/mineral/wood/nonmetal, -/area/shuttle/pirate/flying_dutchman) -"Dr" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/bottle/rum{ - desc = "Rum with ghostly properties that can help the drinker enter the spirit realm. It has fermented under the sea of space for ages."; - name = "Ghost Pirate Rum"; - pixel_x = -4; - pixel_y = 12 - }, -/obj/item/clothing/mask/cigarette/cigar{ - pixel_x = 4 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -7; - pixel_y = 5 - }, -/obj/item/lighter{ - pixel_x = 8; - pixel_y = 11 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"EU" = ( -/obj/machinery/shuttle_scrambler, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"EX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Fv" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Fz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/table/wood, -/obj/item/stack/cannonball/fourteen, -/obj/item/flashlight/flare/torch, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"FK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/light/small/directional/east, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Gr" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Gt" = ( -/obj/structure/cable, -/turf/closed/wall/mineral/wood/nonmetal, -/area/shuttle/pirate/flying_dutchman) -"Hh" = ( -/obj/machinery/computer/piratepad_control{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"Jp" = ( -/obj/structure/table, -/obj/machinery/recharger{ - pixel_y = 2 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"JY" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Ki" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"KZ" = ( -/obj/structure/table/wood, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Le" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Lt" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/item/gun/energy/laser{ - pixel_x = -3; - pixel_y = 6 - }, -/obj/item/gun/energy/laser{ - pixel_y = 3 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"LD" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/floor/has_bulb, -/obj/docking_port/stationary{ - dir = 8; - dwidth = 11; - height = 16; - id = "pirateship_home"; - name = "Deep Space"; - width = 17 - }, -/obj/docking_port/mobile/pirate{ - dheight = 7; - dir = 8; - dwidth = 18; - height = 6; - launch_status = 0; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); - name = "Pirate Ship"; - port_direction = 4; - preferred_direction = 8; - width = 13 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Ms" = ( -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"NG" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/railing/corner{ - color = "#4C3117"; - name = "wooden railing" - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Oe" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space/basic, -/area/shuttle/pirate/flying_dutchman) -"OL" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Pm" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"PS" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/structure/table/wood, -/obj/item/claymore/cutlass{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/claymore/cutlass, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Qa" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 8; - name = "wooden railing" - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"RO" = ( -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"RQ" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"RY" = ( -/obj/machinery/power/solar/fake, -/obj/structure/cable, -/turf/open/floor/iron/solarpanel/airless, -/area/shuttle/pirate/flying_dutchman) -"Sp" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/structure/table/wood, -/obj/item/stack/cannonball/shellball/seven, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"St" = ( -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/carpet/blue/airless, -/area/shuttle/pirate/flying_dutchman) -"SV" = ( -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/obj/structure/cannon{ - dir = 8 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate/flying_dutchman) -"Uk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/rack{ - icon = 'icons/obj/stationobjs.dmi'; - icon_state = "minibar"; - name = "skeletal minibar" - }, -/obj/item/food/grown/sugarcane, -/obj/item/food/grown/sugarcane, -/obj/item/food/grown/sugarcane, -/obj/item/reagent_containers/glass/bucket/wooden, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Vm" = ( -/obj/structure/railing/corner{ - color = "#4C3117"; - dir = 4; - name = "wooden railing" - }, -/obj/structure/railing/corner{ - color = "#4C3117"; - name = "wooden railing" - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"VF" = ( -/obj/machinery/loot_locator, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"WB" = ( -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"WQ" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"WR" = ( -/turf/closed/wall/mineral/wood/nonmetal, -/area/shuttle/pirate/flying_dutchman) -"WS" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"Yr" = ( -/obj/structure/closet/cabinet{ - anchored = 1; - desc = "What kind of scary things could be here?"; - name = "Davy Jones' Locker" - }, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/item/restraints/legcuffs/bola, -/obj/item/gun/energy/laser, -/obj/item/megaphone, -/obj/item/melee/chainofcommand/tailwhip/kitty, -/obj/item/claymore/cutlass, -/turf/open/floor/carpet/royalblack/airless, -/area/shuttle/pirate/flying_dutchman) -"Ys" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"ZL" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/railing{ - color = "#4C3117"; - dir = 1; - name = "wooden railing" - }, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) -"ZZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/light/floor/has_bulb, -/turf/open/floor/wood/airless, -/area/shuttle/pirate/flying_dutchman) - -(1,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -uR -af -af -af -af -"} -(2,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -uR -af -af -af -af -af -af -af -ny -af -RY -RY -RY -"} -(3,1,1) = {" -af -af -af -af -af -af -af -af -af -af -RY -RY -ny -af -af -af -af -af -af -af -Oe -RY -RY -Oe -ny -"} -(4,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -Oe -Oe -RY -af -af -af -af -af -af -Oe -Oe -Oe -Oe -af -"} -(5,1,1) = {" -af -af -af -af -af -af -af -af -af -af -RY -RY -Oe -af -af -af -af -af -af -af -af -Oe -RY -RY -af -"} -(6,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -Oe -Oe -af -af -WR -pG -SV -WR -af -ny -af -af -af -"} -(7,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -ny -Gt -pG -SV -WR -Fz -vw -WR -WR -Gt -WR -WR -af -"} -(8,1,1) = {" -af -af -af -af -af -ZL -ZZ -rN -WR -WR -WR -WR -WR -WR -Fz -OL -hz -fY -Gr -WR -VF -tt -Hh -WR -WR -"} -(9,1,1) = {" -af -af -af -aO -bu -by -WB -Le -be -Uk -dZ -BK -pG -gQ -fY -WB -WB -WB -Gr -WR -WR -Ms -vt -Yr -WR -"} -(10,1,1) = {" -af -af -an -ao -WB -eA -en -Ki -sa -WB -WB -NG -WR -WS -RO -Sp -dM -KZ -Le -Ac -WR -Fv -rN -Jp -WR -"} -(11,1,1) = {" -ac -ad -ak -WB -it -fW -St -Da -da -WB -WB -RQ -eG -WS -Gr -Da -dc -Ys -WB -Gr -sf -WS -gP -gq -WR -"} -(12,1,1) = {" -af -af -am -aB -WB -km -sC -mG -bn -WB -WB -uk -WR -WS -Le -Lt -PS -hV -RO -gS -WR -tH -kz -Dr -WR -"} -(13,1,1) = {" -af -af -af -aK -Cv -zw -RO -EX -Vm -sc -vT -zE -pG -aZ -yy -WB -WB -WB -Gr -WR -WR -Ms -WQ -xA -WR -"} -(14,1,1) = {" -af -af -af -af -af -zO -LD -WR -vi -WR -WR -WR -WR -WR -fH -rd -FK -yy -Gr -WR -EU -bO -aw -WR -WR -"} -(15,1,1) = {" -af -af -af -af -af -af -af -af -Qa -af -af -af -ny -Gt -pG -uw -WR -fH -Pm -WR -WR -Gt -WR -WR -af -"} -(16,1,1) = {" -af -af -af -af -af -af -af -af -co -af -af -af -Oe -Oe -af -af -WR -pG -uw -WR -af -ny -af -af -af -"} -(17,1,1) = {" -af -af -af -af -af -af -af -af -JY -af -RY -RY -Oe -af -af -af -af -af -af -af -af -Oe -RY -RY -af -"} -(18,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -Oe -Oe -RY -af -af -af -af -af -af -Oe -Oe -Oe -Oe -af -"} -(19,1,1) = {" -af -af -af -af -af -af -af -af -af -af -RY -RY -ny -af -af -af -af -af -af -af -Oe -RY -RY -Oe -ny -"} -(20,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -uR -af -af -af -af -af -af -af -ny -af -RY -RY -RY -"} -(21,1,1) = {" -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -af -uR -af -af -af -af -"} diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm deleted file mode 100644 index 0eb09f930bc2..000000000000 --- a/_maps/shuttles/pirate_silverscale.dmm +++ /dev/null @@ -1,1534 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"am" = ( -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"au" = ( -/obj/machinery/door/airlock/silver/glass, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"aA" = ( -/obj/item/storage/bag/money/vault, -/obj/item/stack/sheet/mineral/gold{ - amount = 3; - pixel_x = -2; - pixel_y = 2 - }, -/obj/item/stack/sheet/mineral/silver{ - amount = 8; - pixel_x = 2; - pixel_y = -1 - }, -/obj/structure/table, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"aZ" = ( -/obj/machinery/suit_storage_unit/pirate, -/obj/effect/turf_decal/bot_red, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"bH" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ci" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"cE" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"cH" = ( -/obj/machinery/door/airlock/silver, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"dd" = ( -/obj/machinery/newscaster/directional/east, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"de" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"dI" = ( -/obj/structure/dresser, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"dT" = ( -/obj/item/ammo_box/a762{ - pixel_y = 2 - }, -/obj/item/ammo_box/a762, -/obj/item/grenade/c4{ - pixel_x = -13 - }, -/obj/structure/table, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ei" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"em" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eK" = ( -/obj/structure/shuttle/engine/router, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"eU" = ( -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"ff" = ( -/obj/structure/bed/pod{ - dir = 4 - }, -/obj/item/bedsheet/black{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"fj" = ( -/obj/machinery/computer/shuttle/pirate{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/shuttle/pirate) -"fN" = ( -/obj/structure/dresser, -/obj/machinery/light/small/directional/north, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"fT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"gg" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/obj/machinery/airalarm/all_access{ - dir = 8; - pixel_x = -24 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"ht" = ( -/obj/machinery/door/airlock/silver, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"hu" = ( -/obj/structure/chair/stool/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"hF" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"hW" = ( -/obj/machinery/piratepad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/blue, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"je" = ( -/turf/template_noop, -/area/template_noop) -"jm" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, -/obj/docking_port/stationary{ - dir = 4; - dwidth = 13; - height = 3; - id = "pirateship_home"; - name = "Deep Space"; - width = 26 - }, -/obj/docking_port/mobile/pirate{ - dir = 4; - dwidth = 13; - height = 3; - launch_status = 0; - movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); - name = "Silverscale Cruiser"; - preferred_direction = 4; - width = 26 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"jG" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"jQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ko" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/bot/right, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"ky" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/mirror/directional/north, -/obj/structure/sink{ - pixel_y = 17 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"kF" = ( -/obj/effect/turf_decal/trimline/yellow/warning, -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"lk" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"lu" = ( -/obj/item/storage/secure/safe/directional/north, -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/obj/structure/bed/pod, -/obj/item/bedsheet/black, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"lL" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"mz" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"mI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 5 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"nh" = ( -/obj/machinery/computer/monitor/secret{ - dir = 8 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/shuttle/pirate) -"nm" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"nB" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"nK" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"nY" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"pk" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 8; - faction = list("pirate") - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"pU" = ( -/obj/machinery/door/airlock/silver, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"qA" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"rB" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/pirate) -"sB" = ( -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"ue" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"uP" = ( -/obj/structure/bed/pod, -/obj/item/bedsheet/black, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"vw" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"vz" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"vM" = ( -/obj/structure/closet/secure_closet/personal/cabinet, -/obj/item/ammo_casing/shotgun, -/obj/item/ammo_casing/shotgun, -/obj/item/ammo_casing/shotgun, -/obj/item/ammo_casing/shotgun, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"vP" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"wa" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"wE" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 8; - faction = list("pirate") - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/template_noop) -"xe" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/light/directional/east, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"xj" = ( -/obj/structure/table/glass, -/obj/item/storage/medkit/brute, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"xs" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/pirate) -"xO" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"xR" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/melee/energy/sword/saber/purple{ - pixel_y = 12 - }, -/obj/item/melee/energy/sword/saber/purple{ - pixel_x = 8; - pixel_y = 7 - }, -/obj/item/melee/energy/sword/saber/purple{ - pixel_x = 17 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"yv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/meter, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"zB" = ( -/obj/structure/table/glass, -/obj/machinery/chem_dispenser/drinks/beer{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"zN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/obj/effect/turf_decal/caution/stand_clear{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"zQ" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"Ae" = ( -/obj/machinery/shuttle_scrambler, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Ai" = ( -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Aj" = ( -/obj/structure/chair/sofa/corp/right{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"AE" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/structure/shuttle/engine/heater{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"AR" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/structure/mirror/directional/north, -/obj/structure/sink{ - pixel_y = 17 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Ch" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"CH" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"CP" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, -/obj/structure/cable, -/obj/effect/turf_decal/bot, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"CW" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"DP" = ( -/obj/machinery/airalarm/all_access{ - dir = 4; - pixel_x = 24 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"DX" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Gr" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Gy" = ( -/obj/structure/table/glass, -/obj/machinery/light/small/directional/west, -/obj/item/reagent_containers/food/drinks/bottle/patron{ - pixel_x = -5; - pixel_y = 16 - }, -/obj/item/reagent_containers/food/drinks/bottle/cognac{ - pixel_x = -10; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/bottle/grappa{ - pixel_x = 10; - pixel_y = 15 - }, -/obj/item/reagent_containers/food/drinks/bottle/vodka{ - pixel_x = 2; - pixel_y = 4 - }, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"HD" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "silverbridge" - }, -/turf/open/floor/plating, -/area/shuttle/pirate) -"HS" = ( -/obj/structure/musician/piano{ - icon_state = "piano" - }, -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Ig" = ( -/obj/structure/table/glass, -/obj/machinery/chem_dispenser/drinks{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"Is" = ( -/obj/machinery/computer/piratepad_control{ - dir = 4 - }, -/obj/machinery/light/directional/west, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Jc" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -8 - }, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/drinks/bottle/wine{ - pixel_y = 6 - }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Jq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/gunner{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"JL" = ( -/obj/structure/bookcase/random/nonfiction, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"JV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Kq" = ( -/obj/machinery/light/directional/west, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Lk" = ( -/obj/machinery/power/terminal{ - dir = 1 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 6 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"LE" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/obj/effect/turf_decal/trimline/yellow/end{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"LQ" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Mo" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ - dir = 8; - x_offset = 10; - y_offset = 5 - }, -/turf/open/floor/iron/dark/side{ - dir = 8 - }, -/area/shuttle/pirate) -"Mu" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"MA" = ( -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/captain{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Nm" = ( -/obj/machinery/loot_locator, -/obj/effect/turf_decal/bot, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"NI" = ( -/obj/machinery/door/airlock/silver, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"Oo" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/drinks/bottle/tequila{ - pixel_x = 10; - pixel_y = 10 - }, -/obj/item/reagent_containers/food/drinks/bottle/hcider{ - layer = 3.1; - pixel_x = -6; - pixel_y = 8 - }, -/obj/item/reagent_containers/food/drinks/bottle/rum{ - layer = 3.2; - pixel_x = -15; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/drinks/shaker{ - pixel_x = 1; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/drinks/bottle/gin{ - pixel_x = -10; - pixel_y = 15 - }, -/obj/item/reagent_containers/food/drinks/bottle/wine{ - layer = 3.1; - pixel_x = 3; - pixel_y = 5 - }, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"Ox" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"OJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Pg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 1 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Qm" = ( -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"QI" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"QO" = ( -/obj/machinery/newscaster/directional/north, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"QU" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 4 - }, -/obj/item/flashlight/seclite, -/obj/item/storage/box/lights/bulbs, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/obj/item/multitool, -/obj/effect/turf_decal/bot, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"RE" = ( -/obj/machinery/newscaster/directional/south, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"RF" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"RH" = ( -/obj/structure/fireplace, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"RO" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/ammo_box/a762, -/obj/item/ammo_box/a762{ - pixel_y = 3 - }, -/obj/effect/turf_decal/bot, -/obj/item/gun/ballistic/rifle/boltaction/brand_new/prime, -/obj/item/gun/ballistic/rifle/boltaction/brand_new/prime{ - pixel_y = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"RU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"RY" = ( -/obj/machinery/light/directional/east, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Sh" = ( -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 1 - }, -/obj/machinery/porta_turret/syndicate/energy{ - dir = 4; - faction = list("pirate") - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Si" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Su" = ( -/obj/machinery/power/port_gen/pacman{ - anchored = 1 - }, -/obj/structure/cable, -/obj/machinery/airalarm/all_access{ - dir = 1; - pixel_y = 24 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Sv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"TT" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"TV" = ( -/obj/machinery/porta_turret/syndicate/energy{ - dir = 8; - faction = list("pirate") - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Uf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 4 - }, -/obj/machinery/light/small/directional/north, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"Ut" = ( -/obj/structure/rack, -/obj/item/stack/sheet/mineral/wood{ - amount = 10 - }, -/obj/item/lighter, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"UJ" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 8 - }, -/obj/effect/turf_decal/trimline/yellow/warning{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Vw" = ( -/obj/structure/table, -/obj/machinery/recharger, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"Ww" = ( -/obj/structure/shuttle/engine/heater{ - dir = 8 - }, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) -"Wy" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot/left, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"Xw" = ( -/obj/structure/table/glass, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = 9; - pixel_y = 9 - }, -/obj/item/storage/fancy/cigarettes/cigars{ - pixel_y = 5 - }, -/obj/item/storage/fancy/cigarettes/cigars/cohiba{ - pixel_y = 7 - }, -/obj/item/storage/fancy/cigarettes/cigars/havana{ - pixel_y = 9 - }, -/obj/item/lighter, -/obj/item/reagent_containers/food/drinks/drinkingglass{ - pixel_x = -8 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"XB" = ( -/obj/machinery/vending/boozeomat/all_access{ - onstation = 0 - }, -/obj/machinery/light/small/directional/south, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 10 - }, -/turf/open/floor/carpet/royalblack, -/area/shuttle/pirate) -"XX" = ( -/obj/structure/bookcase/random/fiction, -/turf/open/floor/iron/dark/textured, -/area/shuttle/pirate) -"Yj" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/storage/box/lethalshot, -/obj/item/storage/box/lethalshot, -/obj/effect/turf_decal/bot, -/obj/item/gun/ballistic/shotgun/doublebarrel/slugs, -/turf/open/floor/pod/dark, -/area/shuttle/pirate) -"YD" = ( -/obj/structure/table, -/obj/machinery/button/door{ - id = "silverbridge"; - name = "Window Shutters Control"; - pixel_y = -5 - }, -/obj/item/radio/intercom{ - freerange = 1; - pixel_y = 5 - }, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) -"ZD" = ( -/obj/machinery/door/airlock/silver/glass, -/obj/effect/mapping_helpers/airlock/cutaiwire, -/turf/open/floor/pod/light, -/area/shuttle/pirate) -"ZU" = ( -/obj/structure/chair/sofa/corp/left{ - dir = 1 - }, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/shuttle/pirate) - -(1,1,1) = {" -je -je -rB -nY -rB -Gr -Gr -lL -je -jG -Gr -Gr -rB -jm -rB -je -je -"} -(2,1,1) = {" -je -vw -rB -TT -rB -Mu -Mu -Mu -UJ -Mu -Mu -Mu -rB -TT -rB -vw -je -"} -(3,1,1) = {" -je -nK -rB -jQ -rB -Ww -Ww -Ww -eK -Ww -Ww -Ww -rB -zN -rB -AE -je -"} -(4,1,1) = {" -pk -rB -rB -de -rB -HD -HD -HD -rB -HD -HD -HD -rB -zQ -rB -rB -TV -"} -(5,1,1) = {" -rB -rB -Su -Si -rB -aZ -aZ -aZ -Is -Yj -RO -xR -rB -ci -QI -rB -rB -"} -(6,1,1) = {" -rB -CP -Lk -Si -ht -wa -wa -wa -hW -wa -wa -wa -cH -Si -yv -ko -rB -"} -(7,1,1) = {" -rB -QU -Pg -qA -rB -RY -wa -bH -Ox -Qm -wa -RY -rB -xe -wa -Wy -rB -"} -(8,1,1) = {" -rB -rB -au -rB -rB -rB -cH -rB -rB -rB -cH -rB -rB -rB -au -rB -rB -"} -(9,1,1) = {" -HD -JL -fT -cE -xs -HS -Ch -eU -Jc -gg -Ch -aA -xs -Kq -fT -Gy -HD -"} -(10,1,1) = {" -HD -Ut -fT -CH -xs -hu -JV -eU -Xw -DX -JV -dT -xs -Ai -fT -Oo -HD -"} -(11,1,1) = {" -rB -RH -ue -lk -ZD -ei -JV -eU -xj -DX -JV -lk -ZD -ei -Ch -CW -rB -"} -(12,1,1) = {" -HD -sB -ue -Aj -xs -Ai -am -am -am -am -am -Ai -xs -Ai -Ch -zB -HD -"} -(13,1,1) = {" -HD -XX -fT -ZU -xs -Nm -Vw -vz -vz -vz -YD -Ae -xs -dd -fT -Ig -HD -"} -(14,1,1) = {" -rB -rB -pU -rB -rB -rB -HD -Mo -fj -nh -HD -rB -rB -rB -pU -rB -rB -"} -(15,1,1) = {" -rB -dI -Sv -XB -rB -kF -HD -HD -HD -HD -HD -Sh -rB -fN -Sv -ff -rB -"} -(16,1,1) = {" -rB -vM -OJ -MA -HD -xO -je -je -je -je -je -RF -HD -LQ -OJ -uP -rB -"} -(17,1,1) = {" -rB -rB -QO -mI -HD -je -je -je -je -je -je -je -HD -Jq -RE -rB -rB -"} -(18,1,1) = {" -wE -rB -lu -RU -rB -je -je -je -je -je -je -je -rB -Uf -DP -rB -wE -"} -(19,1,1) = {" -je -rB -rB -NI -rB -je -je -je -je -je -je -je -rB -NI -rB -rB -je -"} -(20,1,1) = {" -je -hF -rB -ky -rB -je -je -je -je -je -je -je -rB -AR -rB -em -je -"} -(21,1,1) = {" -je -nm -rB -rB -rB -je -je -je -je -je -je -je -rB -rB -rB -mz -je -"} -(22,1,1) = {" -je -je -nB -rB -rB -je -je -je -je -je -je -je -rB -rB -vP -je -je -"} -(23,1,1) = {" -je -je -je -rB -rB -je -je -je -je -je -je -je -rB -rB -je -je -je -"} -(24,1,1) = {" -je -je -je -rB -rB -je -je -je -je -je -je -je -rB -rB -je -je -je -"} -(25,1,1) = {" -je -je -je -je -rB -je -je -je -je -je -je -je -rB -je -je -je -je -"} -(26,1,1) = {" -je -je -je -je -rB -je -je -je -je -je -je -je -rB -je -je -je -je -"} -(27,1,1) = {" -je -je -je -je -LE -je -je -je -je -je -je -je -LE -je -je -je -je -"} diff --git a/_maps/shuttles/ruin_caravan_victim.dmm b/_maps/shuttles/ruin_caravan_victim.dmm index 9f94ed2957c0..e33fc69e89f0 100644 --- a/_maps/shuttles/ruin_caravan_victim.dmm +++ b/_maps/shuttles/ruin_caravan_victim.dmm @@ -245,7 +245,7 @@ dir = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "lM" = ( @@ -859,7 +859,7 @@ /obj/machinery/power/apc/auto_name/directional/east, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) "QY" = ( @@ -990,7 +990,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/shuttle/caravan/freighter1) diff --git a/_maps/shuttles/ruin_pirate_cutter.dmm b/_maps/shuttles/ruin_pirate_cutter.dmm index 1493a75e32cc..c0e6d17840fc 100644 --- a/_maps/shuttles/ruin_pirate_cutter.dmm +++ b/_maps/shuttles/ruin_pirate_cutter.dmm @@ -109,7 +109,7 @@ /area/shuttle/caravan/pirate) "hI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "hS" = ( @@ -133,7 +133,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "js" = ( @@ -410,7 +410,7 @@ "vW" = ( /obj/machinery/light/small/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "wL" = ( @@ -552,7 +552,6 @@ "BI" = ( /obj/structure/table, /obj/machinery/light/small/directional/west, -/obj/item/stack/spacecash/c200, /turf/open/floor/iron/dark, /area/shuttle/caravan/pirate) "BL" = ( @@ -569,7 +568,7 @@ dir = 4; pixel_x = 24 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/plating, /area/shuttle/caravan/pirate) @@ -607,7 +606,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "Gh" = ( @@ -798,7 +797,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/pirate) "Sc" = ( diff --git a/_maps/shuttles/ruin_syndicate_dropship.dmm b/_maps/shuttles/ruin_syndicate_dropship.dmm index 49b84eadcd1c..b6723476a5ff 100644 --- a/_maps/shuttles/ruin_syndicate_dropship.dmm +++ b/_maps/shuttles/ruin_syndicate_dropship.dmm @@ -31,7 +31,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "dZ" = ( @@ -69,7 +69,7 @@ }, /obj/item/wrench, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "hF" = ( @@ -81,7 +81,7 @@ pixel_x = -25 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/caravan/syndicate3) "ka" = ( @@ -438,7 +438,7 @@ /obj/item/stack/sheet/mineral/plasma{ amount = 20 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/syndicate3) "PL" = ( @@ -488,7 +488,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/caravan/syndicate3) "Vr" = ( diff --git a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm index 2bd889ed524a..bfbce8595d41 100644 --- a/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm +++ b/_maps/shuttles/ruin_syndicate_fighter_shiv.dmm @@ -14,7 +14,7 @@ req_access = null; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot{ environment_smash = 0 }, @@ -68,7 +68,7 @@ dir = 1; network = list("caravansyndicate1") }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/caravan/syndicate1) "wV" = ( @@ -92,7 +92,7 @@ preferred_direction = 4; width = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/caravan/syndicate1) "Jv" = ( diff --git a/_maps/shuttles/whiteship_box.dmm b/_maps/shuttles/whiteship_box.dmm index 06b8520297e6..73eb6d3687fd 100644 --- a/_maps/shuttles/whiteship_box.dmm +++ b/_maps/shuttles/whiteship_box.dmm @@ -118,7 +118,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -129,7 +129,7 @@ dir = 1 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 5 }, @@ -143,7 +143,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/crew) "ax" = ( @@ -158,7 +158,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "ay" = ( @@ -177,7 +177,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "az" = ( @@ -190,7 +190,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aB" = ( @@ -207,7 +207,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aC" = ( @@ -221,7 +221,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aD" = ( @@ -232,7 +232,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aE" = ( @@ -266,7 +266,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aF" = ( @@ -288,7 +288,7 @@ dir = 6 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -298,7 +298,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/zombie{ desc = "This undead fiend looks to be badly decomposed."; environment_smash = 0; @@ -306,7 +306,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + zombiejob = "Civilian" }, /turf/open/floor/iron/white/corner{ dir = 1 @@ -402,7 +402,7 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/zombie{ desc = "This undead fiend looks to be badly decomposed."; environment_smash = 0; @@ -480,16 +480,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 10 }, /area/shuttle/abandoned/medbay) "aZ" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/computer/operating{ - dir = 1 - }, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -533,7 +530,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bd" = ( @@ -632,7 +629,7 @@ pixel_y = 24 }, /obj/machinery/light/small/built/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bq" = ( @@ -650,7 +647,7 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "bs" = ( @@ -700,7 +697,7 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bx" = ( @@ -732,7 +729,7 @@ "bz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -792,7 +789,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/small/built/directional/east, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 5 }, @@ -820,7 +817,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/blue, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "bI" = ( @@ -829,7 +826,7 @@ /obj/item/wrench, /obj/item/crowbar, /obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "bJ" = ( @@ -874,7 +871,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "bO" = ( @@ -939,7 +936,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -950,12 +947,12 @@ /obj/machinery/door/airlock/medical/glass{ name = "Cryo Room" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "bW" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 8 }, @@ -969,7 +966,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "bY" = ( @@ -981,7 +978,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bridge) "bZ" = ( @@ -991,7 +988,7 @@ }, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bridge) "ca" = ( @@ -1028,7 +1025,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side, /area/shuttle/abandoned/medbay) "ce" = ( @@ -1104,7 +1101,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "cm" = ( @@ -1172,14 +1169,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cs" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/firealarm/directional/north, /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cu" = ( @@ -1191,7 +1188,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cv" = ( @@ -1201,7 +1198,7 @@ }, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "cw" = ( @@ -1212,7 +1209,7 @@ /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "cx" = ( @@ -1246,7 +1243,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cz" = ( @@ -1262,7 +1259,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cC" = ( @@ -1273,7 +1270,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cD" = ( @@ -1281,7 +1278,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -1398,7 +1395,7 @@ amount = 10 }, /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cN" = ( @@ -1406,7 +1403,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 10 }, @@ -1416,7 +1413,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/corner{ dir = 8 }, @@ -1484,7 +1481,7 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "cW" = ( @@ -1534,7 +1531,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 10 }, @@ -1542,7 +1539,7 @@ "da" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/corner{ dir = 8 }, @@ -1553,7 +1550,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/zombie{ desc = "This undead fiend looks to be badly decomposed."; environment_smash = 0; @@ -1561,7 +1558,7 @@ melee_damage_lower = 11; melee_damage_upper = 11; name = "Rotting Carcass"; - zombiejob = "Assistant" + zombiejob = "Civilian" }, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) @@ -1571,7 +1568,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dd" = ( @@ -1579,7 +1576,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "de" = ( @@ -1587,7 +1584,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 4 }, @@ -1602,7 +1599,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dg" = ( @@ -1615,7 +1612,7 @@ pixel_y = 30 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dh" = ( @@ -1626,7 +1623,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "di" = ( @@ -1637,7 +1634,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dj" = ( @@ -1761,7 +1758,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bridge) "gL" = ( @@ -1851,7 +1848,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "FW" = ( diff --git a/_maps/shuttles/whiteship_delta.dmm b/_maps/shuttles/whiteship_delta.dmm index c59cd581e3ad..4ed83f4ce473 100644 --- a/_maps/shuttles/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship_delta.dmm @@ -153,7 +153,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "au" = ( @@ -320,7 +320,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aK" = ( @@ -354,7 +354,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "aQ" = ( @@ -365,7 +365,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aS" = ( @@ -376,7 +376,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aT" = ( @@ -394,7 +394,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aU" = ( @@ -406,7 +406,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aV" = ( @@ -416,7 +416,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "aW" = ( @@ -431,7 +431,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "aX" = ( @@ -443,7 +443,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark{ dir = 8 }, @@ -456,7 +456,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "aZ" = ( @@ -468,7 +468,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "ba" = ( @@ -480,7 +480,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bb" = ( @@ -504,7 +504,6 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bd" = ( @@ -559,7 +558,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bl" = ( @@ -586,7 +585,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bo" = ( @@ -619,7 +618,7 @@ name = "Crew Quarters" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "br" = ( @@ -710,7 +709,7 @@ "bz" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bA" = ( @@ -740,7 +739,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "bD" = ( @@ -764,7 +763,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bH" = ( @@ -853,7 +852,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bR" = ( @@ -866,7 +865,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "bS" = ( @@ -907,7 +906,7 @@ /obj/machinery/light/small/built/directional/east, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bV" = ( @@ -930,10 +929,6 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/cobweb, /obj/machinery/firealarm/directional/west, -/obj/item/stack/spacecash/c200{ - pixel_x = 7; - pixel_y = 4 - }, /obj/item/pen{ pixel_x = -4 }, @@ -949,7 +944,7 @@ "bX" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "bY" = ( @@ -994,7 +989,7 @@ /obj/structure/spider/stickyweb, /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "cc" = ( @@ -1007,7 +1002,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "ce" = ( @@ -1026,7 +1021,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cf" = ( @@ -1035,8 +1030,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, -/mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "cg" = ( @@ -1069,7 +1063,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "ck" = ( @@ -1081,14 +1075,14 @@ /obj/machinery/power/smes/engineering{ charge = 1e+006 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cl" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/power/apc/auto_name/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cm" = ( @@ -1125,7 +1119,7 @@ pixel_y = 2 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "co" = ( @@ -1167,7 +1161,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "cs" = ( @@ -1187,7 +1181,7 @@ "ct" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/button/door/directional/west{ id = "whiteship_windows"; name = "Windows Blast Door Control"; @@ -1229,7 +1223,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "cw" = ( @@ -1266,7 +1260,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/oil, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cD" = ( @@ -1338,7 +1332,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cO" = ( @@ -1358,7 +1352,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "cQ" = ( @@ -1393,7 +1387,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "cV" = ( @@ -1440,7 +1434,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dd" = ( @@ -1448,7 +1442,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "de" = ( @@ -1459,20 +1453,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "df" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dg" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dh" = ( @@ -1483,7 +1477,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "di" = ( @@ -1502,7 +1496,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 9 }, @@ -1512,7 +1506,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -1520,7 +1514,7 @@ "dl" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 1 }, @@ -1531,7 +1525,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white/side{ dir = 5 }, @@ -1545,7 +1539,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/medbay) "do" = ( @@ -1554,7 +1548,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/medbay) "dp" = ( @@ -1565,7 +1559,7 @@ /obj/machinery/light/small/directional/south, /obj/structure/spider/stickyweb, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/medbay) "dq" = ( @@ -1580,7 +1574,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dr" = ( @@ -1594,7 +1588,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "ds" = ( @@ -1610,7 +1604,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "du" = ( @@ -1619,7 +1613,6 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/giant_spider/nurse/scrawny, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dx" = ( @@ -1694,8 +1687,7 @@ /area/shuttle/abandoned/medbay) "dG" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/medbay) "dH" = ( @@ -1716,7 +1708,7 @@ /obj/machinery/light/small/built/directional/west, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/cargo) "dM" = ( @@ -1733,9 +1725,7 @@ /obj/item/reagent_containers/glass/bottle/epinephrine{ pixel_x = 6 }, -/obj/item/reagent_containers/glass/bottle/multiver{ - pixel_x = -3 - }, +/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/syringe, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/white, @@ -1767,7 +1757,7 @@ /obj/effect/turf_decal/bot, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/spider/stickyweb, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/abandoned/medbay) "dR" = ( @@ -1875,7 +1865,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "pn" = ( diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm index 554926c9210a..fc8a760b4ba1 100644 --- a/_maps/shuttles/whiteship_kilo.dmm +++ b/_maps/shuttles/whiteship_kilo.dmm @@ -146,7 +146,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/abandoned/cargo) @@ -280,7 +280,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/abandoned/cargo) @@ -345,7 +345,7 @@ dir = 6 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "aG" = ( @@ -355,7 +355,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) @@ -367,7 +367,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "aI" = ( @@ -378,7 +378,7 @@ dir = 10 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "aJ" = ( @@ -416,7 +416,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -428,7 +428,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) @@ -437,7 +437,7 @@ /obj/machinery/power/smes/engineering{ charge = 1e+006 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -511,7 +511,7 @@ }, /obj/effect/turf_decal/stripes/corner, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/abandoned/cargo) "aV" = ( @@ -519,7 +519,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/mineral/titanium/yellow, @@ -527,7 +527,7 @@ "aW" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/dirt, /mob/living/simple_animal/hostile/netherworld/migo{ environment_smash = 0 @@ -539,7 +539,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/mineral/titanium/yellow, /area/shuttle/abandoned/cargo) @@ -551,7 +551,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/greenglow, @@ -565,7 +565,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) @@ -575,7 +575,7 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "bb" = ( @@ -604,7 +604,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "be" = ( @@ -615,7 +615,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "bf" = ( @@ -626,7 +626,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/engine) "bg" = ( @@ -635,7 +635,7 @@ }, /obj/effect/decal/cleanable/blood/gibs/old, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -646,7 +646,7 @@ /obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bi" = ( @@ -789,7 +789,7 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/status_display/supply{ pixel_x = 32; pixel_y = -32 @@ -801,7 +801,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) @@ -860,7 +860,7 @@ dir = 10 }, /obj/machinery/power/apc/auto_name/directional/south, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bA" = ( @@ -918,7 +918,7 @@ dir = 6 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/cargo) "bJ" = ( @@ -929,7 +929,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light_switch/directional/south, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/plating, @@ -987,7 +987,7 @@ dir = 5 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/titanium/blue, /area/shuttle/abandoned/bridge) "bT" = ( @@ -1006,7 +1006,7 @@ "bW" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/shuttle{ name = "NTMS-037 Saloon" }, @@ -1123,7 +1123,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on, /mob/living/simple_animal/hostile/netherworld/blankbody{ environment_smash = 0 @@ -1181,7 +1181,7 @@ }, /obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/bar) "cn" = ( @@ -1280,7 +1280,7 @@ dir = 8 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, @@ -1291,7 +1291,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1303,7 +1303,7 @@ dir = 5 }, /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, @@ -1348,7 +1348,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/bar) @@ -1365,7 +1365,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/bar) "cE" = ( @@ -1373,7 +1373,7 @@ dir = 4 }, /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/door/airlock/shuttle{ name = "NTMS-037 Lockers" }, @@ -1384,7 +1384,7 @@ dir = 9 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/crew) @@ -1399,7 +1399,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/blood/old, /mob/living/simple_animal/hostile/netherworld/migo{ environment_smash = 0 @@ -1486,7 +1486,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/gibs/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, @@ -1497,7 +1497,7 @@ /obj/machinery/door/airlock/command{ name = "NTMS-037 Ship Control" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1513,7 +1513,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/decal/cleanable/greenglow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/bar) @@ -1526,7 +1526,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/showroomfloor, /area/shuttle/abandoned/bar) "cT" = ( @@ -1542,7 +1542,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/hostile/netherworld{ environment_smash = 0 }, @@ -1634,7 +1634,6 @@ /obj/item/storage/toolbox/mechanical{ pixel_y = 6 }, -/obj/item/stack/spacecash/c200, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bridge) "db" = ( @@ -1649,7 +1648,7 @@ pixel_y = 5 }, /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/abandoned/bar) "dc" = ( diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 49eae48498ee..e6ec9089c02e 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -304,7 +304,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "aQ" = ( @@ -314,7 +314,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "ba" = ( @@ -327,7 +327,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bb" = ( @@ -339,7 +339,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "bc" = ( @@ -358,7 +358,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/crew) "be" = ( @@ -424,7 +424,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bm" = ( @@ -488,7 +488,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/cafeteria, /area/shuttle/abandoned/crew) "bw" = ( @@ -515,7 +515,7 @@ name = "Engineering" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "bz" = ( @@ -604,7 +604,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "bM" = ( @@ -660,7 +660,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bO" = ( @@ -670,7 +670,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "bQ" = ( @@ -741,7 +741,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "cc" = ( @@ -774,7 +774,7 @@ /obj/item/storage/photo_album{ pixel_x = 14 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "ce" = ( @@ -830,7 +830,7 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "ci" = ( @@ -838,7 +838,7 @@ pixel_y = 32 }, /obj/machinery/light/small/built/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cj" = ( @@ -847,7 +847,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cl" = ( @@ -890,7 +890,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "cv" = ( @@ -1052,7 +1052,7 @@ "cJ" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "cL" = ( @@ -1111,7 +1111,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/abandoned/bar) "cP" = ( @@ -1122,7 +1122,7 @@ dir = 8; pixel_x = -24 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "cQ" = ( @@ -1166,7 +1166,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cY" = ( @@ -1178,7 +1178,7 @@ /obj/item/stack/cable_coil, /obj/item/stock_parts/cell/high, /obj/item/multitool, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "cZ" = ( @@ -1191,7 +1191,7 @@ pixel_y = 24 }, /obj/machinery/light/small/built/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "db" = ( @@ -1199,7 +1199,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "dc" = ( @@ -1294,7 +1294,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dq" = ( @@ -1316,7 +1316,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dt" = ( @@ -1325,7 +1325,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dB" = ( @@ -1393,7 +1393,7 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dI" = ( @@ -1412,7 +1412,7 @@ amount = 10 }, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dK" = ( @@ -1421,7 +1421,7 @@ }, /obj/effect/turf_decal/bot, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dO" = ( @@ -1507,7 +1507,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/turf_decal/bot, /obj/item/wrench, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/abandoned/engine) "dX" = ( @@ -1672,7 +1672,7 @@ /obj/effect/turf_decal/stripes/white/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "gt" = ( @@ -1701,7 +1701,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/engine) "iK" = ( @@ -1719,7 +1719,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "jv" = ( @@ -1735,7 +1735,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) @@ -1757,7 +1757,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "nK" = ( @@ -1776,7 +1776,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "pC" = ( @@ -1791,7 +1791,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/engine) "pS" = ( @@ -1878,7 +1878,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "Aa" = ( @@ -1903,7 +1903,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "AK" = ( @@ -1927,7 +1927,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "Dw" = ( @@ -1960,14 +1960,14 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "FF" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "FH" = ( @@ -2000,7 +2000,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "GZ" = ( @@ -2011,7 +2011,7 @@ /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bridge) "HJ" = ( @@ -2064,7 +2064,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "JE" = ( @@ -2119,7 +2119,7 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/engine) "Of" = ( @@ -2131,7 +2131,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/crew) "PW" = ( @@ -2149,7 +2149,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/engine) "Rs" = ( @@ -2160,7 +2160,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/bar) "Sd" = ( @@ -2220,7 +2220,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "SW" = ( @@ -2254,7 +2254,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/abandoned/cargo) "XR" = ( diff --git a/_maps/shuttles/whiteship_tram.dmm b/_maps/shuttles/whiteship_tram.dmm deleted file mode 100644 index 1f75975f2ca6..000000000000 --- a/_maps/shuttles/whiteship_tram.dmm +++ /dev/null @@ -1,1843 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"aa" = ( -/obj/effect/turf_decal/bot_white, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/engine) -"ab" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/engine) -"ac" = ( -/obj/effect/turf_decal/bot_white, -/obj/machinery/suit_storage_unit/mining/eva, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/engine) -"ad" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) -"ae" = ( -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/bot_white, -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"af" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/obj/machinery/portable_atmospherics/canister/oxygen, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ag" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, -/obj/machinery/portable_atmospherics/canister, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ah" = ( -/obj/machinery/space_heater, -/obj/effect/turf_decal/bot_white, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ai" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 4 - }, -/obj/item/flashlight, -/obj/item/clothing/head/welding, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"aj" = ( -/obj/structure/rack, -/obj/item/pickaxe/rusted, -/obj/item/mining_scanner, -/obj/item/mining_voucher, -/obj/item/weldingtool/largetank, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ak" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/engine) -"am" = ( -/obj/machinery/power/smes/engineering{ - charge = 1e+006 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/structure/cable, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"an" = ( -/obj/machinery/power/terminal{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ao" = ( -/obj/structure/cable, -/obj/machinery/power/port_gen/pacman/super, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ap" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) -"aq" = ( -/obj/machinery/door/firedoor/heavy, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) -"ar" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/engine) -"as" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/obj/structure/railing{ - dir = 6 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"at" = ( -/obj/structure/lattice/catwalk, -/obj/structure/marker_beacon/burgundy, -/obj/structure/railing{ - dir = 10 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"au" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"av" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"aw" = ( -/obj/structure/sign/directions/supply, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/shuttle/abandoned/cargo) -"ax" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 1; - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"az" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 1; - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate, -/obj/effect/spawner/random/exotic/technology, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"aA" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 1; - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_loot, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/spawner/random/exotic/tool, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"aB" = ( -/obj/structure/chair/comfy/shuttle, -/turf/open/floor/mineral/titanium/blue/airless, -/area/shuttle/abandoned/cargo) -"aD" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/cargo) -"aE" = ( -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/cargo) -"aG" = ( -/obj/effect/turf_decal/mining, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/shuttle/abandoned/cargo) -"aH" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_abandoned, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"aI" = ( -/obj/effect/turf_decal/caution/white, -/obj/effect/spawner/random/trash/grime, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"aJ" = ( -/obj/item/stack/sheet/mineral/titanium, -/obj/effect/decal/cleanable/blood/gibs/limb, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"aK" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/medical/medkit_rare, -/obj/effect/spawner/random/food_or_drink/booze, -/obj/effect/spawner/random/food_or_drink/salad, -/obj/effect/spawner/random/maintenance/two, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"aL" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 9 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/engine) -"aM" = ( -/obj/structure/shuttle/engine/large{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"aN" = ( -/obj/item/stack/sheet/mineral/titanium, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"aP" = ( -/obj/machinery/door/window/right/directional/west, -/obj/effect/turf_decal/arrows/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"aQ" = ( -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"aR" = ( -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"aS" = ( -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"aT" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/shuttle/abandoned/cargo) -"aU" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 5 - }, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/engine) -"aV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) -"aW" = ( -/obj/effect/spawner/random/trash/hobo_squat, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"aX" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"aY" = ( -/obj/structure/sign/warning/chemdiamond, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/shuttle/abandoned/cargo) -"aZ" = ( -/turf/closed/wall/mineral/plastitanium, -/area/shuttle/abandoned/engine) -"ba" = ( -/obj/machinery/door/window/left/directional/west, -/obj/effect/turf_decal/arrows/red{ - dir = 8 - }, -/obj/effect/mob_spawn/corpse/human/cargo_tech, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"bb" = ( -/obj/machinery/door/window/right/directional/east, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"bc" = ( -/obj/machinery/door/window/survival_pod{ - dir = 8; - opacity = 1 - }, -/obj/effect/turf_decal/delivery/red, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"bd" = ( -/obj/machinery/atmospherics/components/tank/air{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"bf" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bg" = ( -/obj/machinery/door/window/survival_pod{ - dir = 4; - opacity = 1 - }, -/obj/effect/turf_decal/delivery/red, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"bh" = ( -/obj/item/stack/cable_coil/five, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"bi" = ( -/obj/structure/frame/computer, -/turf/open/floor/mineral/titanium/blue/airless, -/area/shuttle/abandoned/cargo) -"bj" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"bk" = ( -/obj/effect/turf_decal/caution/white{ - dir = 4 - }, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"bl" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/decoration/showcase, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bn" = ( -/obj/effect/turf_decal/caution/white{ - dir = 8 - }, -/obj/effect/spawner/random/trash/food_packaging, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"bo" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 4; - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/engineering/atmospherics_portable, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bp" = ( -/obj/effect/decal/cleanable/blood, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"bq" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"br" = ( -/obj/machinery/door/window/left/directional/west, -/obj/effect/turf_decal/arrows/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"bs" = ( -/obj/machinery/firealarm/directional/east, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) -"bt" = ( -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/item/shard/plasma, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"bu" = ( -/obj/item/shard, -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"bv" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/structure/furniture_parts, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/seed_rare, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bw" = ( -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"bx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) -"by" = ( -/obj/item/stack/rods, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"bz" = ( -/obj/structure/sign/directions/supply{ - dir = 1 - }, -/turf/closed/wall/mineral/titanium/survival/nodiagonal, -/area/shuttle/abandoned/cargo) -"bA" = ( -/obj/structure/window/reinforced/survival_pod{ - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/food_or_drink/snack, -/obj/effect/spawner/random/food_or_drink/snack, -/obj/effect/spawner/random/food_or_drink/snack, -/obj/effect/spawner/random/exotic/languagebook, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bB" = ( -/obj/structure/window/reinforced/survival_pod{ - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/structure/mining_shuttle_beacon, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"bC" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 9 - }, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/bridge) -"bD" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 5 - }, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/bridge) -"bE" = ( -/obj/machinery/stasis/survival_pod, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"bF" = ( -/obj/structure/bed/double/pod, -/obj/item/bedsheet/qm/double, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"bG" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"bI" = ( -/obj/structure/table/reinforced/rglass, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = -1; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/drinks/colocup{ - pixel_x = 10; - pixel_y = 9 - }, -/obj/item/plate{ - pixel_x = -2 - }, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"bJ" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/closet/syndicate, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/gloves/fingerless, -/obj/item/clothing/under/syndicate/coldres, -/obj/item/clothing/neck/stripedbluescarf, -/obj/item/clothing/head/beret/centcom_formal, -/obj/item/clothing/suit/armor/vest, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"bL" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"bN" = ( -/obj/docking_port/mobile{ - dir = 2; - dwidth = 6; - height = 27; - id = "whiteship"; - launch_status = 0; - name = "White Ship"; - port_direction = 2; - width = 13 - }, -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"bO" = ( -/obj/structure/rack, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = -5; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = -1; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = 4; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/waterbottle/large{ - pixel_x = 8; - pixel_y = 7 - }, -/obj/effect/turf_decal/siding/white, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"bP" = ( -/obj/structure/closet/crate/radiation, -/obj/effect/turf_decal/bot_white, -/obj/item/stack/sheet/mineral/uranium/five, -/obj/item/stack/sheet/mineral/plasma{ - amount = 10 - }, -/obj/machinery/light/cold/directional/south, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"bS" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/west, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"bT" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/external/ruin, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"bV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"ca" = ( -/obj/structure/cable, -/obj/structure/table, -/obj/machinery/cell_charger, -/obj/item/stock_parts/cell/high, -/obj/item/multitool{ - pixel_x = 7; - pixel_y = 5 - }, -/obj/item/stack/cable_coil{ - pixel_x = -5; - pixel_y = 6 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 9 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ce" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/turf/open/floor/plating, -/area/shuttle/abandoned/engine) -"cg" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/engine) -"ci" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/engine) -"cj" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/hatch, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/engine) -"ck" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/engine) -"cl" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/engine) -"cn" = ( -/obj/effect/gibspawner, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"cr" = ( -/obj/structure/window/reinforced/survival_pod{ - dir = 8; - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/engineering/tank, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"cv" = ( -/obj/item/shard, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"cx" = ( -/obj/structure/window/reinforced/spawner/west, -/obj/structure/window/reinforced/spawner/east, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/cargo) -"cA" = ( -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"cB" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue/airless, -/area/shuttle/abandoned/cargo) -"cC" = ( -/obj/item/stack/rods, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"cD" = ( -/obj/structure/sign/warning/docking, -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/cargo) -"cE" = ( -/obj/structure/cable, -/obj/machinery/light/cold/no_nightlight/directional/east, -/obj/machinery/light/cold/no_nightlight/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/power/apc/auto_name/directional/east, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/cargo) -"cF" = ( -/turf/closed/wall/mineral/plastitanium/nodiagonal, -/area/shuttle/abandoned/cargo) -"cG" = ( -/obj/effect/turf_decal/caution/white{ - dir = 1 - }, -/obj/effect/spawner/random/exotic/ripley, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"cH" = ( -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/exotic/syndie, -/obj/effect/spawner/random/exotic/tool, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"cI" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"cJ" = ( -/obj/structure/grille/broken, -/obj/structure/holosign/barrier, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"cL" = ( -/obj/structure/window/reinforced/survival_pod{ - opacity = 1 - }, -/obj/effect/turf_decal/bot_red, -/obj/effect/spawner/random/structure/crate_empty, -/obj/effect/spawner/random/maintenance/two, -/obj/effect/spawner/random/food_or_drink/refreshing_beverage, -/obj/effect/spawner/random/food_or_drink/condiment, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/cargo) -"cM" = ( -/turf/template_noop, -/area/template_noop) -"cN" = ( -/obj/structure/railing{ - dir = 4 - }, -/obj/structure/railing{ - dir = 8 - }, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"cO" = ( -/obj/structure/window/reinforced/plasma/spawner/west, -/obj/structure/window/reinforced/plasma/spawner/east, -/obj/structure/lattice/catwalk, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"cP" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"cS" = ( -/obj/structure/railing{ - dir = 4 - }, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"cU" = ( -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/railing{ - dir = 4 - }, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"cV" = ( -/obj/structure/window/reinforced/plasma/spawner/west, -/obj/structure/window/reinforced/plasma/spawner/east, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"cY" = ( -/obj/structure/window/reinforced/spawner/east, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"da" = ( -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/bridge) -"dc" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/airalarm/directional/north, -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"de" = ( -/obj/machinery/door/firedoor/heavy, -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/abandoned/bridge) -"df" = ( -/obj/structure/rack, -/obj/item/food/canned/beans{ - pixel_x = -4; - pixel_y = 10 - }, -/obj/item/food/canned/peaches{ - pixel_x = 7; - pixel_y = 7 - }, -/obj/item/food/canned/beans{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/food/canned/peaches{ - pixel_x = 7; - pixel_y = 1 - }, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"dg" = ( -/obj/structure/cable, -/obj/structure/chair{ - dir = 4; - pixel_x = 7 - }, -/obj/machinery/light/cold/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/machinery/power/apc/auto_name/directional/north, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"dh" = ( -/obj/machinery/door/window/brigdoor, -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"di" = ( -/obj/structure/window/reinforced/spawner, -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/radio{ - desc = "An old handheld radio. You could use it, if you really wanted to."; - icon_state = "radio"; - name = "old radio"; - pixel_x = -4; - pixel_y = 9 - }, -/obj/item/flashlight/lamp{ - pixel_x = 6 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dj" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dk" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/cold/no_nightlight/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dl" = ( -/obj/structure/sign/warning/nosmoking/circle, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/bridge) -"dm" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/white, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"dn" = ( -/obj/effect/decal/cleanable/blood, -/obj/item/knife/kitchen, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/bridge) -"do" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/hatch, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half, -/area/shuttle/abandoned/bridge) -"dq" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/airlock/hatch, -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"ds" = ( -/obj/structure/sign/poster/official/do_not_question, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/bridge) -"dt" = ( -/obj/machinery/suit_storage_unit/open, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"du" = ( -/obj/structure/closet/emcloset/anchored, -/obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dv" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/bridge) -"dw" = ( -/obj/structure/bed/pod{ - dir = 1 - }, -/obj/item/bedsheet/ce{ - dir = 1 - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"dx" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/turf/open/floor/plating, -/area/shuttle/abandoned/bridge) -"dy" = ( -/turf/closed/wall/mineral/titanium/nodiagonal, -/area/shuttle/abandoned/bridge) -"dz" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/chair{ - dir = 1; - pixel_y = 14 - }, -/obj/effect/turf_decal/siding/white, -/obj/machinery/airalarm/directional/east, -/turf/open/floor/plastic, -/area/shuttle/abandoned/bridge) -"dA" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"fh" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/obj/structure/window/reinforced/plasma/spawner, -/obj/structure/window/reinforced/plasma/spawner/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/engine) -"gq" = ( -/obj/machinery/door/window/left/directional/east, -/obj/effect/turf_decal/arrows/red{ - dir = 4 - }, -/obj/structure/holosign/barrier/engineering, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"hr" = ( -/obj/effect/decal/cleanable/blood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"iH" = ( -/obj/item/shard, -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"lA" = ( -/obj/effect/decal/cleanable/blood/gibs, -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"mj" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 10 - }, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/bridge) -"nM" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"nV" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/machinery/microwave{ - pixel_y = 6 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/bridge) -"pm" = ( -/obj/effect/spawner/structure/window/reinforced/shuttle, -/obj/machinery/door/firedoor/heavy, -/turf/open/floor/plating, -/area/shuttle/abandoned/bridge) -"rP" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/phone{ - pixel_x = 6; - pixel_y = 3 - }, -/obj/item/reagent_containers/food/drinks/bottle/sake{ - pixel_x = -7; - pixel_y = 4 - }, -/obj/item/cigbutt/cigarbutt{ - pixel_x = 5; - pixel_y = -1 - }, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 4 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"sw" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/corner{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"sE" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/reagent_containers/glass/maunamug{ - pixel_x = 7; - pixel_y = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 1 - }, -/obj/item/food/donut/choco{ - pixel_x = -7; - pixel_y = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"sH" = ( -/obj/structure/closet/crate/engineering, -/obj/effect/turf_decal/bot_white, -/obj/item/stack/sheet/iron/twenty, -/obj/item/stack/sheet/glass{ - amount = 10 - }, -/obj/item/storage/box/lights/mixed, -/obj/item/wrench, -/obj/machinery/airalarm/directional/south, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"ua" = ( -/obj/effect/spawner/random/trash/botanical_waste, -/turf/open/floor/pod, -/area/shuttle/abandoned/cargo) -"ue" = ( -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"uv" = ( -/obj/machinery/atmospherics/components/tank/air, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/engine) -"vb" = ( -/obj/effect/decal/cleanable/blood/gibs/torso, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"wp" = ( -/obj/structure/closet/syndicate, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"yd" = ( -/obj/effect/spawner/random/vending/colavend, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/bridge) -"yA" = ( -/obj/structure/bed/pod, -/obj/effect/mob_spawn/corpse/human/nanotrasensoldier, -/obj/item/bedsheet/hos, -/obj/effect/turf_decal/bot_white, -/obj/machinery/light/cold/directional/east, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"zN" = ( -/obj/machinery/stasis/survival_pod, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"AC" = ( -/obj/structure/chair/comfy/shuttle, -/obj/effect/mob_spawn/corpse/human/assistant, -/turf/open/floor/mineral/titanium/blue/airless, -/area/shuttle/abandoned/cargo) -"CS" = ( -/obj/item/reagent_containers/pill/happy, -/obj/item/reagent_containers/pill/aranesp{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/reagent_containers/pill/zoom{ - pixel_x = -4; - pixel_y = -6 - }, -/obj/machinery/firealarm/directional/east, -/turf/open/floor/iron/smooth_half, -/area/shuttle/abandoned/bridge) -"DS" = ( -/obj/machinery/holopad/secure, -/obj/effect/turf_decal/stripes/white/line{ - dir = 10 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"Fp" = ( -/obj/structure/window/reinforced/spawner/west, -/turf/template_noop, -/area/shuttle/abandoned/cargo) -"FQ" = ( -/obj/item/shard, -/obj/structure/grille/broken, -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"Hp" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 4 - }, -/obj/machinery/door/window/brigdoor/left/directional/north, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/dark, -/area/shuttle/abandoned/bridge) -"Ic" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"Io" = ( -/obj/effect/mob_spawn/corpse/human/cargo_tech, -/obj/effect/decal/cleanable/blood, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"IC" = ( -/obj/structure/cable, -/obj/item/reagent_containers/pill/psicodine{ - pixel_x = 17; - pixel_y = 4 - }, -/obj/item/food/drug/moon_rock, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/bridge) -"Ki" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/bridge) -"LM" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half, -/area/shuttle/abandoned/bridge) -"Mp" = ( -/obj/structure/chair/comfy/shuttle{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron/smooth_half{ - dir = 1 - }, -/area/shuttle/abandoned/bridge) -"Mv" = ( -/obj/item/stack/rods, -/turf/open/floor/mineral/titanium/airless, -/area/shuttle/abandoned/cargo) -"OL" = ( -/obj/machinery/computer/shuttle/white_ship/bridge{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/white/line{ - dir = 6 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"PU" = ( -/obj/effect/decal/cleanable/blood/gibs, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"Qm" = ( -/obj/structure/closet/syndicate, -/obj/effect/turf_decal/bot_white, -/obj/structure/window/reinforced/spawner/north, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"Qy" = ( -/obj/item/shard, -/obj/effect/decal/cleanable/blood/gibs/torso, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"Rg" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 4 - }, -/obj/item/storage/pill_bottle{ - pixel_x = 4; - pixel_y = -15 - }, -/obj/item/storage/pill_bottle{ - pixel_x = 16; - pixel_y = -12 - }, -/obj/item/reagent_containers/syringe/contraband/krokodil, -/obj/item/reagent_containers/syringe/contraband/saturnx{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/smooth_half, -/area/shuttle/abandoned/bridge) -"Tj" = ( -/obj/effect/decal/cleanable/blood, -/obj/structure/holosign/barrier, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"UC" = ( -/obj/effect/turf_decal/stripes/white/box, -/obj/machinery/door/firedoor/heavy, -/obj/machinery/door/airlock/external/ruin{ - name = "Escape Pod Loader" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/effect/decal/cleanable/blood/tracks{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/shuttle/abandoned/bridge) -"Wm" = ( -/obj/structure/table/reinforced/plastitaniumglass, -/obj/item/storage/box/donkpockets/donkpocketberry{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/item/storage/box/donkpockets/donkpocketspicy{ - pixel_x = -4; - pixel_y = 10 - }, -/obj/item/reagent_containers/food/drinks/bottle/sake{ - pixel_x = 10; - pixel_y = 13 - }, -/obj/item/reagent_containers/food/drinks/bottle/sake{ - pixel_x = 9; - pixel_y = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/west, -/turf/open/floor/iron/smooth_large, -/area/shuttle/abandoned/bridge) -"WR" = ( -/obj/machinery/door/window/right/directional/west, -/obj/effect/turf_decal/arrows/red{ - dir = 8 - }, -/obj/effect/decal/cleanable/blood/splatter, -/turf/open/floor/mineral/titanium/white/airless, -/area/shuttle/abandoned/cargo) -"WV" = ( -/obj/effect/decal/cleanable/blood, -/turf/open/floor/plating/airless, -/area/shuttle/abandoned/cargo) -"YI" = ( -/obj/machinery/porta_turret/centcom_shuttle/weak{ - dir = 6 - }, -/turf/closed/wall/mineral/titanium, -/area/shuttle/abandoned/bridge) -"ZA" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 8 - }, -/turf/open/floor/catwalk_floor, -/area/shuttle/abandoned/engine) - -(1,1,1) = {" -cM -cM -aL -cl -ci -ci -ci -ci -cS -au -cI -aP -ba -cI -WR -br -WV -bw -cS -bC -dy -dy -dy -dy -pm -pm -mj -"} -(2,1,1) = {" -cM -cM -aM -ce -af -aV -bd -ci -cO -cI -AC -aQ -cv -bh -bp -Qy -PU -Tj -cO -dy -bE -bJ -nV -Wm -DS -rP -pm -"} -(3,1,1) = {" -cM -cM -bV -ce -ag -bx -uv -cl -cN -cI -aB -cn -cB -bi -aB -aN -cC -FQ -cN -dy -dc -dh -Ic -Io -Mp -sE -pm -"} -(4,1,1) = {" -cM -aX -bS -cl -ah -bx -cl -cl -cO -cI -aB -aR -vb -lA -Mv -iH -aJ -cJ -cO -dy -bF -di -dn -yd -OL -sw -pm -"} -(5,1,1) = {" -aZ -cl -cl -cl -cg -cj -cl -as -cP -av -cI -dA -bb -cI -gq -bt -bu -by -cP -da -dy -dv -do -ds -dy -dy -da -"} -(6,1,1) = {" -cl -aa -ad -ca -ai -bx -aq -cY -cY -cY -aD -cY -cY -cY -cY -cY -cD -cY -cY -cY -de -dj -dp -dt -dx -cM -cM -"} -(7,1,1) = {" -bN -ab -bT -ZA -ZA -ap -ar -cx -cx -cx -aE -cx -cx -cx -cx -cx -cE -cx -cx -cx -bG -bL -Ki -ue -UC -cM -cM -"} -(8,1,1) = {" -cl -ac -ad -ae -aj -ap -aq -Fp -Fp -Fp -cD -Fp -Fp -Fp -Fp -Fp -cF -Fp -Fp -Fp -de -dk -LM -du -dx -cM -cM -"} -(9,1,1) = {" -aZ -cl -cl -cl -ak -ck -cl -at -cS -aw -aG -aT -bc -cr -bc -aY -aG -bz -cS -da -dy -dl -dq -dv -dy -dy -da -"} -(10,1,1) = {" -cM -bj -fh -cl -am -ap -cl -cl -cO -ax -aH -aW -cA -bk -aS -cA -bv -cL -cV -dy -df -bO -Rg -dw -zN -bE -dy -"} -(11,1,1) = {" -cM -cM -aM -ce -an -bx -sH -cl -cU -az -aI -ua -bf -bl -bq -aS -cG -bA -cU -dy -dg -dm -IC -hr -Hp -nM -dy -"} -(12,1,1) = {" -cM -cM -bV -ce -ao -bs -bP -ci -cO -aA -aK -cA -aS -bn -cA -cA -cH -bB -cV -dy -bI -dz -CS -yA -Qm -wp -dy -"} -(13,1,1) = {" -cM -cM -aU -cl -ci -ci -ci -ci -cP -aw -aG -aY -bg -bo -bg -aT -aG -bz -cP -bD -dy -dy -dy -dy -dy -dy -YI -"} diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index 7ffd105f7478..668534b79e99 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -13,7 +13,7 @@ id = "syndie_battlecruier_bridge_blast"; layer = 3 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/shuttle/sbc_starfury) @@ -135,7 +135,7 @@ id = "syndie_battlecruier_bridge_blast"; layer = 3 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -225,7 +225,7 @@ /area/shuttle/sbc_starfury) "aG" = ( /obj/structure/window/reinforced/plasma/plastitanium, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "aH" = ( @@ -310,7 +310,7 @@ /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "aS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "aU" = ( @@ -325,14 +325,14 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "aV" = ( /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -356,7 +356,7 @@ /area/shuttle/sbc_starfury) "bd" = ( /obj/effect/turf_decal/tile/yellow, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -373,7 +373,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "bj" = ( @@ -459,7 +459,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "bt" = ( @@ -481,7 +481,7 @@ layer = 3 }, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "by" = ( @@ -594,7 +594,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "bY" = ( @@ -636,7 +636,7 @@ name = "Weapon Bay 2"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -646,13 +646,13 @@ /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "ci" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/extinguisher_cabinet/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -665,7 +665,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -674,7 +674,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -683,7 +683,7 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -693,7 +693,7 @@ name = "Weapon Bay 3"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -702,7 +702,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/shuttle/sbc_starfury) @@ -711,7 +711,7 @@ name = "Weapon Bay 1"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -722,7 +722,7 @@ name = "Weapon Bays Access"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -734,7 +734,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -762,7 +762,7 @@ name = "Bridge"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/cutaiwire, @@ -777,7 +777,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -786,7 +786,7 @@ name = "Weapon Bays Access"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -796,7 +796,7 @@ name = "Weapon Bay 4"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/plating, @@ -813,7 +813,6 @@ /area/shuttle/sbc_starfury) "cM" = ( /obj/structure/table, -/obj/item/surgical_drapes, /obj/item/razor, /obj/machinery/button/door/directional/west{ id = "starfury_surgery_shutters"; @@ -887,7 +886,7 @@ /area/shuttle/sbc_starfury) "db" = ( /obj/machinery/light/directional/west, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -954,7 +953,7 @@ "do" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/directional/east, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -972,7 +971,7 @@ /turf/open/floor/plating, /area/shuttle/sbc_starfury) "dq" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "dr" = ( @@ -984,7 +983,7 @@ /obj/item/cautery{ pixel_x = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/siding/blue{ dir = 4 }, @@ -993,7 +992,7 @@ "ds" = ( /obj/structure/table/optable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "du" = ( @@ -1004,12 +1003,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "dx" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/south{ req_access = list(150) }, @@ -1037,7 +1036,7 @@ /obj/item/bodypart/arm/right/robot{ pixel_x = 3 }, -/obj/item/book/manual/wiki/surgery, +/obj/item/book/manual/codex/surgery, /obj/effect/turf_decal/siding/blue{ dir = 4 }, @@ -1049,13 +1048,6 @@ dir = 10 }, /area/shuttle/sbc_starfury) -"dC" = ( -/obj/machinery/computer/operating{ - dir = 1 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/shuttle/sbc_starfury) "dD" = ( /obj/structure/closet/crate/freezer/blood, /obj/item/reagent_containers/blood, @@ -1072,7 +1064,7 @@ }, /area/shuttle/sbc_starfury) "dI" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /mob/living/simple_animal/bot/medbot{ desc = "A medical bot of syndicate origins. Probably plots about how to stab you full of toxins in its free time."; faction = list("neutral","silicon","turret","Syndicate"); @@ -1104,7 +1096,7 @@ /obj/structure/window/reinforced/survival_pod{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/siding/blue{ dir = 4 }, @@ -1128,7 +1120,7 @@ /area/shuttle/sbc_starfury) "dN" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -1158,7 +1150,7 @@ "dT" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -1171,7 +1163,7 @@ }, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/light, @@ -1263,7 +1255,7 @@ }, /obj/machinery/door/firedoor/heavy, /obj/effect/mapping_helpers/airlock/cutaiwire, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/light, @@ -1298,7 +1290,7 @@ /area/shuttle/sbc_starfury) "et" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1334,7 +1326,7 @@ /area/shuttle/sbc_starfury) "ex" = ( /obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1343,7 +1335,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -1362,7 +1354,7 @@ dir = 8 }, /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1371,7 +1363,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1416,7 +1408,7 @@ dir = 4 }, /obj/effect/decal/cleanable/oil, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1426,7 +1418,7 @@ dir = 8 }, /obj/item/weldingtool/largetank, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1440,7 +1432,7 @@ dir = 8 }, /obj/effect/decal/cleanable/oil, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1464,7 +1456,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1472,7 +1464,7 @@ "eR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "eS" = ( @@ -1480,7 +1472,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1511,7 +1503,7 @@ "eX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/south{ req_access = list(150) }, @@ -1522,13 +1514,13 @@ /obj/effect/decal/cleanable/oil, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "eZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/south, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) @@ -1536,7 +1528,7 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, @@ -1547,7 +1539,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "fc" = ( @@ -1556,7 +1548,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "fd" = ( @@ -1608,7 +1600,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "fi" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -1684,7 +1676,7 @@ /area/shuttle/sbc_starfury) "fq" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/pod/dark, @@ -1782,7 +1774,7 @@ name = "Shuttle Bay"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor/heavy, @@ -1804,7 +1796,7 @@ req_access_txt = "150" }, /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor/heavy, @@ -1830,7 +1822,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -1853,9 +1845,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser{ - dir = 8 - }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "gA" = ( @@ -1900,7 +1889,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line{ @@ -1929,7 +1918,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "gL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -1941,7 +1930,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "gO" = ( @@ -1959,7 +1948,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2039,7 +2028,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2103,7 +2092,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/shuttle/sbc_starfury) @@ -2115,7 +2104,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hg" = ( @@ -2128,7 +2117,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/iron, /area/shuttle/sbc_starfury) @@ -2141,7 +2130,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hi" = ( @@ -2156,7 +2145,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hj" = ( @@ -2168,7 +2157,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hk" = ( @@ -2178,14 +2167,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/north, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hl" = ( /obj/structure/disposalpipe/junction{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -2286,7 +2275,7 @@ /obj/machinery/airalarm/directional/north{ req_access = list(150) }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "hv" = ( @@ -2298,12 +2287,12 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "hw" = ( /obj/structure/disposalpipe/junction, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2426,7 +2415,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "hL" = ( -/obj/structure/cable/layer1, +/obj/structure/cable/smart_cable/color/red, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "hN" = ( @@ -2466,7 +2455,7 @@ /area/shuttle/sbc_starfury) "hV" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -2607,7 +2596,7 @@ /area/shuttle/sbc_starfury) "ih" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -2648,7 +2637,7 @@ "im" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -2705,16 +2694,6 @@ /obj/machinery/microwave, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) -"ir" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/assault{ - dir = 8 - }, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "it" = ( /obj/effect/turf_decal/siding/thinplating/dark/corner{ dir = 4 @@ -2767,7 +2746,7 @@ dir = 8 }, /obj/item/assembly/flash/handheld, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "iw" = ( @@ -2830,7 +2809,7 @@ "iC" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -2840,9 +2819,6 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "iE" = ( -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/captain{ - dir = 4 - }, /turf/open/floor/carpet, /area/shuttle/sbc_starfury) "iF" = ( @@ -2887,7 +2863,7 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/line, @@ -2977,7 +2953,7 @@ "iP" = ( /obj/effect/turf_decal/bot, /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/engineering{ @@ -3046,7 +3022,7 @@ /obj/structure/disposalpipe/segment{ dir = 9 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -3076,7 +3052,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "jd" = ( @@ -3088,7 +3064,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "jf" = ( @@ -3098,8 +3074,9 @@ name = "Syndicate Battlecruiser APC"; pixel_y = 25 }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/cable/smart_cable/color/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "ji" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -3116,7 +3093,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/iron/smooth, /area/shuttle/sbc_starfury) @@ -3150,7 +3127,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/layer1, +/obj/structure/cable/smart_cable/color/red, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "jz" = ( @@ -3161,8 +3138,8 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/firedoor, -/obj/structure/cable/layer1, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/red, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/mapping_helpers/airlock/cutaiwire, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -3171,16 +3148,18 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/layer1, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/cable/smart_cable/color/red, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "jB" = ( /obj/machinery/power/terminal{ dir = 1 }, /obj/machinery/firealarm/directional/south, -/obj/structure/cable/multilayer/connected, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/cable/smart_cable/color_connector/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "jD" = ( /obj/machinery/portable_atmospherics/scrubber, @@ -3202,7 +3181,7 @@ }, /obj/machinery/power/port_gen/pacman/super, /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/north, /turf/open/floor/engine, /area/shuttle/sbc_starfury) @@ -3218,7 +3197,7 @@ name = "Radiation Chamber Shutters" }, /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "jQ" = ( @@ -3227,7 +3206,7 @@ }, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable/layer1, +/obj/structure/cable/smart_cable/color/red, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) @@ -3237,7 +3216,7 @@ amount = 50 }, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/sign/warning/nosmoking{ pixel_y = 32 }, @@ -3263,7 +3242,7 @@ /obj/structure/sign/warning/deathsposal{ pixel_y = 32 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/binary/pump/off/scrubbers/visible/layer2{ dir = 8; name = "Waste Outlet Pump" @@ -3279,7 +3258,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, @@ -3311,7 +3290,7 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "kk" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "kl" = ( @@ -3323,7 +3302,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "km" = ( @@ -3343,7 +3322,7 @@ /obj/effect/turf_decal/tile/yellow{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "kn" = ( @@ -3351,7 +3330,7 @@ dir = 4 }, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "ko" = ( @@ -3383,7 +3362,7 @@ name = "Medbay Storage"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/effect/turf_decal/siding/blue{ dir = 4 }, @@ -3416,9 +3395,6 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/assault{ - dir = 8 - }, /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -3487,7 +3463,7 @@ charge = 4e+006 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/button/door/directional/north{ id = "syndie_battlecruiser_sm"; name = "engine shutters"; @@ -3568,7 +3544,7 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -3598,7 +3574,7 @@ /area/shuttle/sbc_starfury) "lb" = ( /obj/effect/turf_decal/stripes/corner, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -3641,14 +3617,14 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "lk" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, @@ -3677,7 +3653,7 @@ /area/shuttle/sbc_starfury) "lq" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/sign/warning/docking{ @@ -3690,7 +3666,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -3771,7 +3747,7 @@ name = "Emitter Room"; req_access_txt = "150" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/barricade/wooden/crude, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -3821,19 +3797,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "lI" = ( /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "lJ" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "lK" = ( @@ -4060,7 +4036,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/extinguisher_cabinet/directional/south, /turf/open/floor/engine, /area/shuttle/sbc_starfury) @@ -4075,7 +4051,7 @@ charge = 4e+006 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "ow" = ( @@ -4092,7 +4068,7 @@ input_level = 15000; inputting = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "oO" = ( @@ -4108,7 +4084,7 @@ dir = 6 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "pa" = ( @@ -4169,9 +4145,10 @@ dir = 8 }, /obj/structure/extinguisher_cabinet/directional/south, -/obj/structure/cable/layer1, +/obj/structure/cable/smart_cable/color/red, /obj/machinery/light/directional/south, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "qm" = ( /obj/effect/turf_decal/box/corners, @@ -4181,7 +4158,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "qQ" = ( @@ -4207,7 +4184,7 @@ /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "rr" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/structure/barricade/wooden/crude, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/airlock/engineering/glass{ @@ -4232,18 +4209,6 @@ }, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) -"sh" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/assault{ - dir = 4 - }, -/turf/open/floor/iron/dark, -/area/shuttle/sbc_starfury) "sB" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -4257,7 +4222,7 @@ dir = 4 }, /obj/item/crowbar/red, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -4269,7 +4234,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, @@ -4282,7 +4247,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/sbc_starfury) "ui" = ( @@ -4293,7 +4258,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -4311,7 +4276,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "vk" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, @@ -4341,7 +4306,7 @@ /area/shuttle/sbc_starfury) "vH" = ( /obj/structure/disposalpipe/segment, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, @@ -4385,7 +4350,7 @@ amount = 50 }, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "wC" = ( @@ -4416,7 +4381,7 @@ /area/shuttle/sbc_starfury) "xG" = ( /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "xH" = ( @@ -4445,7 +4410,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable/multilayer/connected, +/obj/structure/cable/smart_cable/color_connector/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "yY" = ( @@ -4484,7 +4449,7 @@ "Ag" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/engineering{ @@ -4567,9 +4532,6 @@ /obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser{ - dir = 4 - }, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "CC" = ( @@ -4589,7 +4551,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "Dd" = ( @@ -4609,7 +4571,7 @@ amount = 50 }, /obj/effect/turf_decal/bot, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/north{ req_access = list(150) }, @@ -4617,7 +4579,7 @@ /area/shuttle/sbc_starfury) "DV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "Ex" = ( @@ -4632,7 +4594,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "EH" = ( @@ -4655,7 +4617,7 @@ /obj/machinery/power/terminal{ dir = 1 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -4667,7 +4629,7 @@ req_access_txt = "150" }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/mapping_helpers/airlock/cutaiwire, @@ -4699,7 +4661,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Fr" = ( @@ -4763,7 +4725,7 @@ input_level = 15000; inputting = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Gz" = ( @@ -4778,7 +4740,7 @@ /obj/machinery/computer/monitor{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/west, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -4791,12 +4753,12 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/sbc_starfury) "HL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "HT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "HU" = ( @@ -4840,7 +4802,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Jf" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, @@ -4853,7 +4815,7 @@ /obj/machinery/computer/monitor{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Ju" = ( @@ -4868,7 +4830,7 @@ dir = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "JL" = ( @@ -5015,16 +4977,16 @@ /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "MS" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Nq" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "Nw" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, @@ -5124,7 +5086,7 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "Pb" = ( @@ -5161,7 +5123,7 @@ /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "PL" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white/side{ @@ -5170,7 +5132,7 @@ /area/shuttle/sbc_starfury) "PM" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/sign/warning/docking{ @@ -5183,7 +5145,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -5199,13 +5161,13 @@ input_level = 15000; inputting = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Qf" = ( /obj/machinery/power/port_gen/pacman/super, /obj/effect/turf_decal/delivery, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/engine, /area/shuttle/sbc_starfury) "Qu" = ( @@ -5243,7 +5205,7 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Ri" = ( @@ -5254,7 +5216,7 @@ /obj/machinery/computer/monitor{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Rj" = ( @@ -5280,7 +5242,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/firealarm/directional/south, /turf/open/floor/engine, /area/shuttle/sbc_starfury) @@ -5303,7 +5265,7 @@ /area/shuttle/sbc_starfury) "Sk" = ( /obj/effect/turf_decal/stripes/line, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/mineral/plastitanium, @@ -5331,7 +5293,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Sy" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, @@ -5351,7 +5313,7 @@ "ST" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "Ta" = ( @@ -5382,7 +5344,7 @@ pixel_x = -3; pixel_y = -3 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/white, /area/shuttle/sbc_starfury) "TI" = ( @@ -5399,7 +5361,7 @@ input_level = 15000; inputting = 0 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Ux" = ( @@ -5409,7 +5371,7 @@ /area/shuttle/sbc_starfury) "Uy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/shuttle/sbc_starfury) @@ -5418,7 +5380,7 @@ /obj/machinery/door/poddoor/shutters/preopen{ id = "starfury_surgery_shutters" }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/shuttle/sbc_starfury) "UH" = ( @@ -5455,7 +5417,7 @@ /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Vm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, @@ -5496,24 +5458,24 @@ "Wc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Wg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) "Wu" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/sbc_starfury) "Wv" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -5526,7 +5488,7 @@ /obj/machinery/computer/monitor{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/light/directional/east, /turf/open/floor/iron/dark, /area/shuttle/sbc_starfury) @@ -5538,7 +5500,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/pod/dark, @@ -5569,7 +5531,7 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Xr" = ( @@ -5577,8 +5539,9 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable/multilayer/connected, -/turf/open/floor/catwalk_floor/iron_dark, +/obj/structure/cable/smart_cable/color_connector/yellow, +/obj/structure/overfloor_catwalk/iron_dark, +/turf/open/floor/plating, /area/shuttle/sbc_starfury) "Xz" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -5599,7 +5562,7 @@ "XN" = ( /obj/machinery/computer/monitor, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/airalarm/directional/north{ req_access = list(150) }, @@ -5624,7 +5587,7 @@ req_access_txt = "150" }, /obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/mapping_helpers/airlock/cutaiwire, @@ -5635,7 +5598,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 }, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/iron, /area/shuttle/sbc_starfury) "Yt" = ( @@ -5644,11 +5607,11 @@ /area/shuttle/sbc_starfury) "Yw" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/pod/dark, /area/shuttle/sbc_starfury) "Zm" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/shuttle/sbc_starfury) @@ -6272,14 +6235,14 @@ eO eR fe ae -sh -sh +gO +gO ae hh hG ae -sh -sh +gO +gO ae iV SI @@ -6410,8 +6373,8 @@ AQ eR wc ae -ir -ir +hW +hW ae hj hI @@ -6593,7 +6556,7 @@ ae hx df ds -dC +MS UB dY ec diff --git a/_maps/templates/heretic_sacrifice_template.dmm b/_maps/templates/heretic_sacrifice_template.dmm index 8ba6e5654a71..4e6810cba972 100644 --- a/_maps/templates/heretic_sacrifice_template.dmm +++ b/_maps/templates/heretic_sacrifice_template.dmm @@ -37,7 +37,7 @@ /turf/open/misc/ironsand, /area/centcom/heretic_sacrifice/rust) "fh" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating, /area/centcom/heretic_sacrifice/rust) "gJ" = ( @@ -53,7 +53,7 @@ /area/centcom/heretic_sacrifice/flesh) "jg" = ( /obj/effect/decal/cleanable/blood/old, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/rust, /area/centcom/heretic_sacrifice/rust) "jB" = ( @@ -75,7 +75,7 @@ /area/centcom/heretic_sacrifice/rust) "mG" = ( /obj/effect/turf_decal/weather, -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/rust, /area/centcom/heretic_sacrifice/rust) "mR" = ( @@ -203,7 +203,7 @@ /turf/open/floor/plating/rust, /area/centcom/heretic_sacrifice/rust) "uT" = ( -/obj/structure/cable, +/obj/structure/cable/smart_cable/color/yellow, /turf/open/floor/plating/rust, /area/centcom/heretic_sacrifice/rust) "vs" = ( diff --git a/_maps/templates/holodeck_medicalsim.dmm b/_maps/templates/holodeck_medicalsim.dmm index d080fb94176f..3a56b0e1f841 100644 --- a/_maps/templates/holodeck_medicalsim.dmm +++ b/_maps/templates/holodeck_medicalsim.dmm @@ -283,9 +283,6 @@ }, /area/template_noop) "pY" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ dir = 8 @@ -459,18 +456,6 @@ 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 @@ -710,7 +695,7 @@ /area/template_noop) "Qu" = ( /obj/structure/table/glass, -/obj/item/stack/medical/gauze, +/obj/item/stack/gauze, /obj/item/cautery, /obj/effect/turf_decal/tile/red{ dir = 1 @@ -855,7 +840,6 @@ /area/template_noop) "Zq" = ( /obj/structure/table/glass, -/obj/item/surgical_drapes, /obj/item/razor, /obj/item/hemostat, /obj/effect/turf_decal/tile/red{ @@ -908,7 +892,7 @@ Ig (4,1,1) = {" gr tI -An +pY hQ jr NV diff --git a/_maps/templates/holodeck_photobooth.dmm b/_maps/templates/holodeck_photobooth.dmm index a9581461de78..aa8acf04c3e8 100644 --- a/_maps/templates/holodeck_photobooth.dmm +++ b/_maps/templates/holodeck_photobooth.dmm @@ -15,16 +15,7 @@ /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{ +/obj/item/paint_sprayer{ pixel_x = 7 }, /turf/open/floor/holofloor/carpet, diff --git a/_maps/templates/holodeck_thunderdome1218.dmm b/_maps/templates/holodeck_thunderdome1218.dmm index dde50e98b90c..67a1acb370a3 100644 --- a/_maps/templates/holodeck_thunderdome1218.dmm +++ b/_maps/templates/holodeck_thunderdome1218.dmm @@ -99,12 +99,6 @@ }, /turf/open/floor/holofloor/asteroid, /area/template_noop) -"T" = ( -/obj/structure/table/wood, -/obj/item/tailclub, -/obj/item/spear, -/turf/open/floor/holofloor/asteroid, -/area/template_noop) "X" = ( /obj/structure/table/wood, /obj/item/scythe, @@ -175,7 +169,7 @@ a (6,1,1) = {" Q J -T +N p p p @@ -211,7 +205,7 @@ a (9,1,1) = {" H J -T +N p p p diff --git a/_maps/templates/medium_shuttle4.dmm b/_maps/templates/medium_shuttle4.dmm index 73f2928f5a9f..55ae3d8f1543 100644 --- a/_maps/templates/medium_shuttle4.dmm +++ b/_maps/templates/medium_shuttle4.dmm @@ -71,7 +71,7 @@ /area/ruin/powered/shuttle/medium_4) "v" = ( /obj/structure/shuttle/engine/propulsion/burst/right, -/turf/open/misc/asteroid/basalt/lava_land_surface, +/turf/open/misc/asteroid/basalt, /area/ruin/powered/shuttle/medium_4) "w" = ( /obj/structure/shuttle/engine/propulsion/burst, diff --git a/_maps/templates/shelter_3.dmm b/_maps/templates/shelter_3.dmm index 379240430862..d0e78ff77d42 100644 --- a/_maps/templates/shelter_3.dmm +++ b/_maps/templates/shelter_3.dmm @@ -155,7 +155,7 @@ /turf/open/floor/carpet/black, /area/misc/survivalpod) "z" = ( -/obj/machinery/vending/cigarette/beach, +/obj/machinery/vending/cigarette, /turf/open/floor/carpet/black, /area/misc/survivalpod) "A" = ( diff --git a/_maps/templates/the_arena.dmm b/_maps/templates/the_arena.dmm deleted file mode 100644 index f3b420af5c80..000000000000 --- a/_maps/templates/the_arena.dmm +++ /dev/null @@ -1,2622 +0,0 @@ -//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"a" = ( -/turf/closed/indestructible/necropolis, -/area/shuttle/shuttle_arena) -"b" = ( -/turf/open/indestructible/necropolis/air, -/area/shuttle/shuttle_arena) -"c" = ( -/obj/effect/forcefield/arena_shuttle, -/turf/open/indestructible/necropolis/air, -/area/shuttle/shuttle_arena) -"d" = ( -/turf/open/lava/smooth, -/area/shuttle/shuttle_arena) -"e" = ( -/obj/effect/landmark/shuttle_arena_entrance, -/turf/open/indestructible/necropolis/air, -/area/shuttle/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/theseus.json b/_maps/theseus.json new file mode 100644 index 000000000000..cf1b931f4e6a --- /dev/null +++ b/_maps/theseus.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "map_name": "Theseus", + "map_path": "map_files/Theseus", + "map_file": "Theseus.dmm", + "webmap_id": "Theseus", + "shuttles": { + "cargo": "cargo_box", + "ferry": "ferry_fancy", + "whiteship": "whiteship_meta", + "emergency": "emergency_meta" + }, + "job_changes": { + "cook": { + "additional_cqc_areas": ["/area/station/service/bar", "/area/station/service/kitchen/coldroom", "/area/station/commons/lounge"] + } + } +} diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 823662cada4f..07fd3c5299f2 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -37,7 +37,7 @@ #define DNA_UNI_IDENTITY_BLOCKS 7 /// This number needs to equal the total number of DNA blocks -#define DNA_FEATURE_BLOCKS 28 +#define DNA_FEATURE_BLOCKS 32 #define DNA_MUTANT_COLOR_BLOCK 1 #define DNA_ETHEREAL_COLOR_BLOCK 2 @@ -55,17 +55,22 @@ #define DNA_MUSHROOM_CAPS_BLOCK 14 #define DNA_MONKEY_TAIL_BLOCK 15 #define DNA_POD_HAIR_BLOCK 16 -#define DNA_HEADTAILS_BLOCK 17 -#define DNA_MUTANT_COLOR_BLOCK_2 18 -#define DNA_MUTANT_COLOR_BLOCK_3 19 -#define DNA_TESHARI_FEATHERS_BLOCK 20 -#define DNA_TESHARI_EARS_BLOCK 21 -#define DNA_TESHARI_BODY_FEATHERS_BLOCK 22 -#define DNA_TESHARI_TAIL_BLOCK 23 -#define DNA_VOX_HAIR_BLOCK 24 -#define DNA_VOX_FACIAL_HAIR_BLOCK 25 -#define DNA_VOX_TAIL_BLOCK 26 -#define DNA_VOX_SNOUT_BLOCK 27 +#define DNA_MUTANT_COLOR_BLOCK_2 17 +#define DNA_MUTANT_COLOR_BLOCK_3 18 +#define DNA_TESHARI_FEATHERS_BLOCK 19 +#define DNA_TESHARI_EARS_BLOCK 20 +#define DNA_TESHARI_BODY_FEATHERS_BLOCK 21 +#define DNA_TESHARI_TAIL_BLOCK 22 +#define DNA_VOX_HAIR_BLOCK 23 +#define DNA_VOX_FACIAL_HAIR_BLOCK 24 +#define DNA_VOX_TAIL_BLOCK 25 +#define DNA_VOX_SNOUT_BLOCK 26 +#define DNA_IPC_SCREEN_BLOCK 27 +#define DNA_IPC_ANTENNA_BLOCK 28 +#define DNA_SAURIAN_SCREEN_BLOCK 29 +#define DNA_SAURIAN_TAIL_BLOCK 30 +#define DNA_SAURIAN_SCUTES_BLOCK 31 +#define DNA_SAURIAN_ANTENNA_BLOCK 32 #define DNA_SEQUENCE_LENGTH 4 #define DNA_MUTATION_BLOCKS 8 @@ -81,53 +86,52 @@ #define NOTRANSSTING 7 #define NOZOMBIE 8 #define NO_UNDERWEAR 9 -#define NOSTOMACH 10 -#define NO_DNA_COPY 11 -#define DRINKSBLOOD 12 +#define NO_DNA_COPY 10 +#define DRINKSBLOOD 11 /// Use this if you want to change the race's color without the player being able to pick their own color. AKA special color shifting -#define DYNCOLORS 13 -#define AGENDER 14 +#define DYNCOLORS 12 +#define AGENDER 13 /// Do not draw eyes or eyeless overlay -#define NOEYESPRITES 15 -/// Used for determining which wounds are applicable to this species. -/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD) -#define HAS_FLESH 16 -/// if we have bones (can suffer bone wounds) -#define HAS_BONE 17 +#define NOEYESPRITES 14 ///If we have a limb-specific overlay sprite -#define HAS_MARKINGS 18 +#define HAS_MARKINGS 15 /// Do not draw blood overlay -#define NOBLOODOVERLAY 19 +#define NOBLOODOVERLAY 17 ///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png -#define NOAUGMENTS 20 +#define NOAUGMENTS 18 ///will be assigned a universal vampire themed last name shared by their department. this is preferenced! -#define BLOOD_CLANS 21 +#define BLOOD_CLANS 19 /// Can this species use the 'Body size' preference -#define BODY_RESIZABLE 22 -#define MUTCOLORS2 23 -#define MUTCOLORS3 24 +#define BODY_RESIZABLE 20 ///Haircolor -#define HAIRCOLOR 25 -#define FACEHAIRCOLOR 26 -#define SCLERA 27 +#define HAIRCOLOR 22 +#define FACEHAIRCOLOR 22 +#define SCLERA 23 ///Has non-human hair. Used by pref code to hide standard hair options. -#define NONHUMANHAIR 28 +#define NONHUMANHAIR 24 +///Snowflake for IPCs, so they can pick prosthetic branding +#define BRANDEDPROSTHETICS 25 + +/// For use in /datum/species/var/organs +#define DOES_NOT_NEED "does_not_need" //organ slots -#define ORGAN_SLOT_ADAMANTINE_RESONATOR "adamantine_resonator" #define ORGAN_SLOT_APPENDIX "appendix" #define ORGAN_SLOT_BRAIN "brain" #define ORGAN_SLOT_BRAIN_ANTIDROP "brain_antidrop" #define ORGAN_SLOT_BRAIN_ANTISTUN "brain_antistun" #define ORGAN_SLOT_BREATHING_TUBE "breathing_tube" +#define ORGAN_SLOT_CELL "cell" #define ORGAN_SLOT_EARS "ears" #define ORGAN_SLOT_EYES "eye_sight" #define ORGAN_SLOT_HEART "heart" #define ORGAN_SLOT_HEART_AID "heartdrive" #define ORGAN_SLOT_HUD "eye_hud" #define ORGAN_SLOT_LIVER "liver" +#define ORGAN_SLOT_KIDNEYS "kidneys" #define ORGAN_SLOT_LUNGS "lungs" #define ORGAN_SLOT_PARASITE_EGG "parasite_egg" +#define ORGAN_SLOT_POSIBRAIN "posibrain" #define ORGAN_SLOT_REGENERATIVE_CORE "hivecore" #define ORGAN_SLOT_RIGHT_ARM_AUG "r_arm_device" #define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" //This one ignores alphabetical order cause the arms should be together @@ -149,10 +153,13 @@ #define ORGAN_SLOT_EXTERNAL_POD_HAIR "pod_hair" #define ORGAN_SLOT_EXTERNAL_VOX_HAIR "vox_hair" #define ORGAN_SLOT_EXTERNAL_VOX_FACIAL_HAIR "vox_facial_hair" -#define ORGAN_SLOT_EXTERNAL_HEADTAILS "headtails" #define ORGAN_SLOT_EXTERNAL_TESHARI_FEATHERS "teshari_feathers" #define ORGAN_SLOT_EXTERNAL_TESHARI_EARS "teshari_ears" #define ORGAN_SLOT_EXTERNAL_TESHARI_BODY_FEATHERS "teshari_body_feathers" +#define ORGAN_SLOT_EXTERNAL_IPC_SCREEN "ipc_screen" +#define ORGAN_SLOT_EXTERNAL_IPC_ANTENNA "ipc_antenna" +#define ORGAN_SLOT_EXTERNAL_SAURIAN_SCREEN "saurian_screen" +#define ORGAN_SLOT_EXTERNAL_SAURIAN_SCUTES "saurian_scutes" /// Xenomorph organ slots #define ORGAN_SLOT_XENO_ACIDGLAND "acid_gland" @@ -163,8 +170,6 @@ #define ORGAN_SLOT_XENO_RESINSPINNER "resin_spinner" //organ defines -#define STANDARD_ORGAN_THRESHOLD 100 -#define STANDARD_ORGAN_HEALING 50 / 100000 /// designed to fail organs when left to decay for ~15 minutes #define STANDARD_ORGAN_DECAY 111 / 100000 @@ -181,7 +186,6 @@ /// Defines how a mob's processing_organs is ordered /// Exists so Life()'s organ process order is consistent GLOBAL_LIST_INIT(organ_process_order, list( - ORGAN_SLOT_BRAIN, ORGAN_SLOT_APPENDIX, ORGAN_SLOT_RIGHT_ARM_AUG, ORGAN_SLOT_LEFT_ARM_AUG, @@ -195,10 +199,10 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_ZOMBIE, ORGAN_SLOT_THRUSTERS, ORGAN_SLOT_HUD, + ORGAN_SLOT_KIDNEYS, ORGAN_SLOT_LIVER, ORGAN_SLOT_TONGUE, ORGAN_SLOT_VOICE, - ORGAN_SLOT_ADAMANTINE_RESONATOR, ORGAN_SLOT_HEART_AID, ORGAN_SLOT_BRAIN_ANTIDROP, ORGAN_SLOT_BRAIN_ANTISTUN, @@ -209,35 +213,11 @@ GLOBAL_LIST_INIT(organ_process_order, list( ORGAN_SLOT_XENO_RESINSPINNER, ORGAN_SLOT_XENO_ACIDGLAND, ORGAN_SLOT_XENO_NEUROTOXINGLAND, - ORGAN_SLOT_XENO_EGGSAC,)) + ORGAN_SLOT_XENO_EGGSAC, + ORGAN_SLOT_BRAIN)) -//Defines for Golem Species IDs -#define SPECIES_GOLEM "golem" -#define SPECIES_GOLEM_ADAMANTINE "a_golem" -#define SPECIES_GOLEM_PLASMA "p_golem" -#define SPECIES_GOLEM_DIAMOND "diamond_golem" -#define SPECIES_GOLEM_GOLD "gold_golem" -#define SPECIES_GOLEM_SILVER "silver_golem" -#define SPECIES_GOLEM_PLASTEEL "plasteel_golem" -#define SPECIES_GOLEM_TITANIUM "titanium_golem" -#define SPECIES_GOLEM_PLASTITANIUM "plastitanium_golem" -#define SPECIES_GOLEM_ALIEN "alloy_golem" -#define SPECIES_GOLEM_WOOD "wood_golem" -#define SPECIES_GOLEM_URANIUM "uranium_golem" -#define SPECIES_GOLEM_SAND "sand_golem" -#define SPECIES_GOLEM_GLASS "glass_golem" -#define SPECIES_GOLEM_BLUESPACE "bluespace_golem" -#define SPECIES_GOLEM_BANANIUM "ba_golem" -#define SPECIES_GOLEM_CULT "cultgolem" -#define SPECIES_GOLEM_CLOTH "clothgolem" -#define SPECIES_GOLEM_PLASTIC "plastic_golem" -#define SPECIES_GOLEM_BRONZE "bronze_golem" -#define SPECIES_GOLEM_CARDBOARD "c_golem" -#define SPECIES_GOLEM_LEATHER "leather_golem" -#define SPECIES_GOLEM_DURATHREAD "d_golem" -#define SPECIES_GOLEM_BONE "b_golem" -#define SPECIES_GOLEM_SNOW "sn_golem" -#define SPECIES_GOLEM_HYDROGEN "metallic_hydrogen_golem" +#define SPECIES_DATA_PERKS 1 +#define SPECIES_DATA_LANGUAGES 2 // Defines for used in creating "perks" for the species preference pages. /// A key that designates UI icon displayed on the perk. diff --git a/code/__DEFINES/MC.dm b/code/__DEFINES/MC.dm index fbbda68b3be5..e84c7d486e3d 100644 --- a/code/__DEFINES/MC.dm +++ b/code/__DEFINES/MC.dm @@ -17,6 +17,15 @@ #define MC_AVG_FAST_UP_SLOW_DOWN(average, current) (average > current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) #define MC_AVG_SLOW_UP_FAST_DOWN(average, current) (average < current ? MC_AVERAGE_SLOW(average, current) : MC_AVERAGE_FAST(average, current)) +///creates a running average of "things elapsed" per time period when you need to count via a smaller time period. +///eg you want an average number of things happening per second but you measure the event every tick (50 milliseconds). +///make sure both time intervals are in the same units. doesnt work if current_duration > total_duration or if total_duration == 0 +#define MC_AVG_OVER_TIME(average, current, total_duration, current_duration) ((((total_duration) - (current_duration)) / (total_duration)) * (average) + (current)) + +#define MC_AVG_MINUTES(average, current, current_duration) (MC_AVG_OVER_TIME(average, current, 1 MINUTES, current_duration)) + +#define MC_AVG_SECONDS(average, current, current_duration) (MC_AVG_OVER_TIME(average, current, 1 SECONDS, current_duration)) + #define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} #define START_PROCESSING(Processor, Datum) if (!(Datum.datum_flags & DF_ISPROCESSING)) {Datum.datum_flags |= DF_ISPROCESSING;Processor.processing += Datum} @@ -107,3 +116,19 @@ }\ /datum/controller/subsystem/processing/##X/fire() {..() /*just so it shows up on the profiler*/} \ /datum/controller/subsystem/processing/##X + +#define VERB_MANAGER_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/verb_manager/##X);\ +/datum/controller/subsystem/verb_manager/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/verb_manager/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/verb_manager/##X + +#define FLUID_SUBSYSTEM_DEF(X) GLOBAL_REAL(SS##X, /datum/controller/subsystem/fluids/##X);\ +/datum/controller/subsystem/fluids/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/fluids/##X/fire() {..() /*just so it shows up on the profiler*/} \ +/datum/controller/subsystem/fluids/##X diff --git a/code/__DEFINES/_helpers.dm b/code/__DEFINES/_helpers.dm index 08d4b39906e9..7f2f6705761b 100644 --- a/code/__DEFINES/_helpers.dm +++ b/code/__DEFINES/_helpers.dm @@ -14,9 +14,13 @@ /// subtypesof(), typesof() without the parent path #define subtypesof(typepath) ( typesof(typepath) - typepath ) -/// Takes a datum as input, returns its ref string, or a cached version of it -/// This allows us to cache \ref creation, which ensures it'll only ever happen once per datum, saving string tree time -/// It is slightly less optimal then a []'d datum, but the cost is massively outweighed by the potential savings -/// It will only work for datums mind, for datum reasons -/// : because of the embedded typecheck -#define text_ref(datum) (isdatum(datum) ? (datum:cached_ref ||= "\ref[datum]") : ("\ref[datum]")) +/// Until a condition is true, sleep +#define UNTIL(X) while(!(X)) sleep(world.tick_lag) + +/// Clears all nulls in a list, returning the amount removed. +#define list_clear_nulls(L) ((L):RemoveAll(null)) + +// Refs contain a type id within their string that can be used to identify byond types. +// Custom types that we define don't get a unique id, but this is useful for identifying +// types that don't normally have a way to run istype() on them. +#define TYPEID(thing) copytext(REF(thing), 4, 6) diff --git a/code/__DEFINES/_multiz.dm b/code/__DEFINES/_multiz.dm new file mode 100644 index 000000000000..02dd04549d43 --- /dev/null +++ b/code/__DEFINES/_multiz.dm @@ -0,0 +1,13 @@ + +#define HasBelow(Z) (((Z) > world.maxz || (Z) < 2 || ((Z)-1) > length(SSmapping.multiz_levels)) ? 0 : SSmapping.multiz_levels[(Z)-1]) +#define HasAbove(Z) (((Z) >= world.maxz || (Z) < 1 || (Z) > length(SSmapping.multiz_levels)) ? 0 : SSmapping.multiz_levels[(Z)]) +//So below + +#define GetAbove(A) (HasAbove(A:z) ? get_step(A, UP) : null) +#define GetBelow(A) (HasBelow(A:z) ? get_step(A, DOWN) : null) + + +/// Vertical Z movement +#define ZMOVING_VERTICAL 1 +/// Laterial Z movement +#define ZMOVING_LATERAL 2 diff --git a/code/__DEFINES/_profile.dm b/code/__DEFINES/_profile.dm index 1a6a65cacb3a..88c2cfde63de 100644 --- a/code/__DEFINES/_profile.dm +++ b/code/__DEFINES/_profile.dm @@ -1,4 +1,2 @@ -#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/abstract.dm b/code/__DEFINES/abstract.dm new file mode 100644 index 000000000000..876e396010f8 --- /dev/null +++ b/code/__DEFINES/abstract.dm @@ -0,0 +1,14 @@ +/** +* Abstract-ness is a meta-property of a class that is used to indicate +* that the class is intended to be used as a base class for others, and +* should not (or cannot) be instantiated. +* We have no such language concept in DM, and so we provide a datum member +* that can be used to hint at abstractness for circumstances where we would +* like that to be the case, such as base behavior providers. +*/ + +//This helper is underutilized, but that's a problem for me later. -Francinum + +/// TRUE if the current path is abstract. See __DEFINES\abstract.dm for more information. +/// Instantiating abstract paths is illegal. +#define isabstract(foo) (initial(foo.type) == initial(foo.abstract_type)) diff --git a/code/__DEFINES/access.dm b/code/__DEFINES/access.dm index 8aafe2ea30a1..609306df8e68 100644 --- a/code/__DEFINES/access.dm +++ b/code/__DEFINES/access.dm @@ -27,7 +27,7 @@ #define ACCESS_TELEPORTER 17 #define ACCESS_EVA 18 /// Bridge, EVA storage windoors, gateway shutters, AI integrity restorer, comms console -#define ACCESS_HEADS 19 +#define ACCESS_MANAGEMENT 19 #define ACCESS_CAPTAIN 20 #define ACCESS_ALL_PERSONAL_LOCKERS 21 #define ACCESS_CHAPEL_OFFICE 22 @@ -172,7 +172,7 @@ /// Bitflag for Private Command ID card accesses. See PRIVATE_COMMAND_ACCESS. #define ACCESS_FLAG_PRV_COMMAND (1 << 2) /// Displayed name for Captain ID card accesses. -#define ACCESS_FLAG_CAPTAIN_NAME "Captain" +#define ACCESS_FLAG_CAPTAIN_NAME "Superintendent" /// Bitflag for Captain ID card accesses. See CAPTAIN_ACCESS. #define ACCESS_FLAG_CAPTAIN (1 << 3) /// Displayed name for Centcom ID card accesses. @@ -294,7 +294,7 @@ ACCESS_RC_ANNOUNCE, \ ACCESS_VAULT, \ ACCESS_TECH_STORAGE, \ - ACCESS_HEADS, \ + ACCESS_MANAGEMENT, \ ACCESS_TELEPORTER, \ ACCESS_ARMORY, \ ACCESS_AI_UPLOAD, \ @@ -455,7 +455,7 @@ #define REGION_COMMAND "Command" /// Used to seed the accesses_by_region list in SSid_access. A list of all command regional accesses that are overseen by the Captain. #define REGION_ACCESS_COMMAND list( \ - ACCESS_HEADS, \ + ACCESS_MANAGEMENT, \ ACCESS_RC_ANNOUNCE, \ ACCESS_KEYCARD_AUTH, \ ACCESS_CHANGE_IDS, \ diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 13aa83e7e9eb..43152eaba437 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -8,44 +8,9 @@ //Misc Medal hub IDs #define MEDAL_METEOR "Your Life Before Your Eyes" -#define MEDAL_PULSE "Jackpot" #define MEDAL_TIMEWASTE "Overextended The Joke" -#define MEDAL_RODSUPLEX "Feat of Strength" -#define MEDAL_CLOWNCARKING "Round and Full" -#define MEDAL_THANKSALOT "The Best Driver" -#define MEDAL_HELBITALJANKEN "Hel-bent on Winning" -#define MEDAL_MATERIALCRAFT "Getting an Upgrade" -#define MEDAL_DISKPLEASE "Disk, Please!" -#define MEDAL_GAMER "I'm Not Important" -#define MEDAL_VENDORSQUISH "Teenage Anarchist" -#define MEDAL_SWIRLIE "Bowl-d" -#define MEDAL_SELFOUCH "Hands???" -#define MEDAL_SANDMAN "Mister Sandman" -#define MEDAL_CLEANBOSS "Cleanboss" -#define MEDAL_RULE8 "Rule 8" -#define MEDAL_LONGSHIFT "longshift" -#define MEDAL_SNAIL "KKKiiilll mmmeee" #define MEDAL_LOOKOUTSIR "Look Out, Sir!" -#define MEDAL_GOTTEM "GOTTEM" -#define MEDAL_ASCENSION "Ascension" -#define MEDAL_FRENCHING "FrenchingTheBubble" -#define MEDAL_ASH_ASCENSION "Ash" -#define MEDAL_FLESH_ASCENSION "Flesh" -#define MEDAL_RUST_ASCENSION "Rust" -#define MEDAL_VOID_ASCENSION "Void" -#define MEDAL_BLADE_ASCENSION "Blade" -#define MEDAL_TOOLBOX_SOUL "Toolsoul" -#define MEDAL_CHEM_TUT "Beginner Chemist" -#define MEDAL_HOT_DAMN "Hot Damn!" -#define MEDAL_CAYENNE_DISK "Very Important Piscis" -#define MEDAL_TRAM_SURFER "Tram Surfer" -#define MEDAL_CULT_SHUTTLE_OMFG "WHAT JUST HAPPENED" #define MEDAL_CLICKBAIT "Clickbait" -#define MEDAL_NARSUPREME "Narsupreme" -#define MEDAL_SPRINGLOCK "The Man Inside the Modsuit" - -//Skill medal hub IDs -#define MEDAL_LEGENDARY_MINER "Legendary Miner" //Mafia medal hub IDs (wins) #define MAFIA_MEDAL_ASSISTANT "Assistant" @@ -71,47 +36,6 @@ #define MAFIA_MEDAL_CHARISMATIC "Charismatic" #define MAFIA_MEDAL_VIP "VIP" -//Boss medals - -// Medal hub IDs for boss medals (Pre-fixes) -#define BOSS_MEDAL_ANY "Boss Killer" -#define BOSS_MEDAL_MINER "Blood-drunk Miner Killer" -#define BOSS_MEDAL_FROSTMINER "Demonic-frost Miner Killer" -#define BOSS_MEDAL_BUBBLEGUM "Bubblegum Killer" -#define BOSS_MEDAL_COLOSSUS "Colossus Killer" -#define BOSS_MEDAL_DRAKE "Drake Killer" -#define BOSS_MEDAL_HIEROPHANT "Hierophant Killer" -#define BOSS_MEDAL_LEGION "Legion Killer" -#define BOSS_MEDAL_TENDRIL "Tendril Exterminator" -#define BOSS_MEDAL_SWARMERS "Swarmer Beacon Killer" -#define BOSS_MEDAL_WENDIGO "Wendigo Killer" -#define BOSS_MEDAL_KINGGOAT "King Goat Killer" - -#define BOSS_MEDAL_MINER_CRUSHER "Blood-drunk Miner Crusher" -#define BOSS_MEDAL_FROSTMINER_CRUSHER "Demonic-frost Miner Crusher" -#define BOSS_MEDAL_BUBBLEGUM_CRUSHER "Bubblegum Crusher" -#define BOSS_MEDAL_COLOSSUS_CRUSHER "Colossus Crusher" -#define BOSS_MEDAL_DRAKE_CRUSHER "Drake Crusher" -#define BOSS_MEDAL_HIEROPHANT_CRUSHER "Hierophant Crusher" -#define BOSS_MEDAL_LEGION_CRUSHER "Legion Crusher" -#define BOSS_MEDAL_SWARMERS_CRUSHER "Swarmer Beacon Crusher" -#define BOSS_MEDAL_WENDIGO_CRUSHER "Wendigo Crusher" -#define BOSS_MEDAL_KINGGOAT_CRUSHER "King Goat Crusher" - -// Medal hub IDs for boss-kill scores -#define BOSS_SCORE "Bosses Killed" -#define MINER_SCORE "BDMs Killed" -#define FROST_MINER_SCORE "DFMs Killed" -#define BUBBLEGUM_SCORE "Bubblegum Killed" -#define COLOSSUS_SCORE "Colossus Killed" -#define DRAKE_SCORE "Drakes Killed" -#define HIEROPHANT_SCORE "Hierophants Killed" -#define LEGION_SCORE "Legion Killed" -#define SWARMER_BEACON_SCORE "Swarmer Beacs Killed" -#define WENDIGO_SCORE "Wendigos Killed" -#define KINGGOAT_SCORE "King Goat Killed" -#define TENDRIL_CLEAR_SCORE "Tendrils Killed" - // DB ID for hardcore random mode #define HARDCORE_RANDOM_SCORE "Hardcore Random Score" diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index 076efefc7d5f..9078d9165e33 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -36,7 +36,7 @@ /// probability that the pawn should try resisting out of restraints #define RESIST_SUBTREE_PROB 50 ///macro for whether it's appropriate to resist right now, used by resist subtree -#define SHOULD_RESIST(source) (source.on_fire || source.buckled || HAS_TRAIT(source, TRAIT_RESTRAINED) || (source.pulledby && source.pulledby.grab_state > GRAB_PASSIVE)) +#define SHOULD_RESIST(source) (source.on_fire || source.buckled || HAS_TRAIT(source, TRAIT_ARMS_RESTRAINED) || HAS_TRAIT(source, TRAIT_AGGRESSIVE_GRAB)) ///macro for whether the pawn can act, used generally to prevent some horrifying ai disasters #define IS_DEAD_OR_INCAP(source) (source.incapacitated() || source.stat) @@ -46,6 +46,8 @@ #define BB_NEXT_HUNGRY "BB_NEXT_HUNGRY" ///what we're going to eat next #define BB_FOOD_TARGET "bb_food_target" +///Path we should use next time we use the JPS movement datum +#define BB_PATH_TO_USE "BB_path_to_use" //for songs @@ -108,7 +110,7 @@ ///The implant the AI was created from #define BB_MOD_IMPLANT "BB_mod_implant" ///Range for a MOD AI controller. -#define MOD_AI_RANGE 100 +#define MOD_AI_RANGE 200 ///Vending machine AI controller blackboard keys #define BB_VENDING_CURRENT_TARGET "BB_vending_current_target" diff --git a/code/__DEFINES/aiming.dm b/code/__DEFINES/aiming.dm new file mode 100644 index 000000000000..6c28e86ae256 --- /dev/null +++ b/code/__DEFINES/aiming.dm @@ -0,0 +1,4 @@ +#define TARGET_CAN_MOVE (1<<0) +#define TARGET_CAN_RUN (1<<1) +#define TARGET_CAN_INTERACT (1<<2) +#define TARGET_CAN_RADIO (1<<3) diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 620459f81e7e..1ed5a60e97aa 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -122,53 +122,19 @@ ///File to the malf flavor #define MALFUNCTION_FLAVOR_FILE "antagonist_flavor/malfunction_flavor.json" -///File to the thief flavor -#define THIEF_FLAVOR_FILE "antagonist_flavor/thief_flavor.json" - /// JSON string file for all of our heretic influence flavors #define HERETIC_INFLUENCE_FILE "antagonist_flavor/heretic_influences.json" -///employers that are from the syndicate -GLOBAL_LIST_INIT(syndicate_employers, list( - "Animal Rights Consortium", - "Bee Liberation Front", - "Cybersun Industries", - "Donk Corporation", - "Gorlex Marauders", - "MI13", - "Tiger Cooperative Fanatic", - "Waffle Corporation Terrorist", - "Waffle Corporation", -)) -///employers that are from nanotrasen -GLOBAL_LIST_INIT(nanotrasen_employers, list( - "Champions of Evil", - "Corporate Climber", - "Gone Postal", - "Internal Affairs Agent", - "Legal Trouble", -)) - ///employers who hire agents to do the hijack GLOBAL_LIST_INIT(hijack_employers, list( - "Animal Rights Consortium", - "Bee Liberation Front", + "Legal Trouble", "Gone Postal", - "Tiger Cooperative Fanatic", - "Waffle Corporation Terrorist", )) -///employers who hire agents to do a task and escape... or martyrdom. whatever +///employers who hire agents to do a task and escape... GLOBAL_LIST_INIT(normal_employers, list( - "Champions of Evil", - "Corporate Climber", - "Cybersun Industries", - "Donk Corporation", - "Gorlex Marauders", - "Internal Affairs Agent", "Legal Trouble", - "MI13", - "Waffle Corporation", + "Gone Postal", )) ///employers for malfunctioning ais. they do not have sides, unlike traitors. diff --git a/code/__DEFINES/ao.dm b/code/__DEFINES/ao.dm index 02ac6fd1612b..31820b950b9a 100644 --- a/code/__DEFINES/ao.dm +++ b/code/__DEFINES/ao.dm @@ -6,5 +6,5 @@ #define AO_UPDATE_OVERLAY 1 #define AO_UPDATE_REBUILD 2 -// If ao_neighbors equals this, no AO shadows are present. -#define AO_ALL_NEIGHBORS 1910 +/// If ao_junction equals this, no AO shadows are present. +#define AO_ALL_NEIGHBORS 255 diff --git a/code/__DEFINES/asteroid_magnet_defines.dm b/code/__DEFINES/asteroid_magnet_defines.dm new file mode 100644 index 000000000000..1af3d6baef88 --- /dev/null +++ b/code/__DEFINES/asteroid_magnet_defines.dm @@ -0,0 +1,22 @@ +/// Used in asteroid composition lists to indicate a skip +#define SKIP "skip" + +// Mining template rarities +#define MINING_NO_RANDOM_SPAWN -1 +#define MINING_COMMON 1 +#define MINING_UNCOMMON 2 +#define MINING_RARE 3 + +/// YOU MUST USE THIS OVER CHECK_TICK IN ASTEROID GENERATION +#define GENERATOR_CHECK_TICK \ + if(TICK_CHECK) { \ + SSatoms.map_loader_stop(REF(template)); \ + stoplag(); \ + SSatoms.map_loader_begin(REF(template)); \ + } + +#define MAGNET_ERROR_KEY_BUSY 1 +#define MAGNET_ERROR_KEY_USED_COORD 2 +#define MAGNET_ERROR_KEY_COOLDOWN 3 +#define MAGNET_ERROR_KEY_MOB 4 +#define MAGNET_ERROR_KEY_NO_COORD 5 diff --git a/code/__DEFINES/atmospherics/atmos_canpass.dm b/code/__DEFINES/atmos_canpass.dm similarity index 100% rename from code/__DEFINES/atmospherics/atmos_canpass.dm rename to code/__DEFINES/atmos_canpass.dm diff --git a/code/__DEFINES/atmospherics/ZAS_math.dm b/code/__DEFINES/atmospherics/ZAS_math.dm index a61a839ee6ce..14d2cba96db6 100644 --- a/code/__DEFINES/atmospherics/ZAS_math.dm +++ b/code/__DEFINES/atmospherics/ZAS_math.dm @@ -22,6 +22,7 @@ #define TCMB 2.7 // -270.3 degrees celsius #define CELSIUS + T0C +#define KELVIN_TO_CELSIUS(X) ((X) - T0C) #define ATMOS_PRECISION 0.0001 #define QUANTIZE(variable) (round(variable, ATMOS_PRECISION)) diff --git a/code/__DEFINES/atmospherics/_ZAS.dm b/code/__DEFINES/atmospherics/_ZAS.dm index c0af317b15bb..c9e8ef8bc706 100644 --- a/code/__DEFINES/atmospherics/_ZAS.dm +++ b/code/__DEFINES/atmospherics/_ZAS.dm @@ -86,7 +86,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) ///The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE #define PRESSURE_DAMAGE_COEFFICIENT 4 #define MAX_HIGH_PRESSURE_DAMAGE 4 // This used to be 20... I got this much random rage for some retarded decision by polymorph?! Polymorph now lies in a pool of blood with a katana jammed in his spleen. ~Errorage --PS: The katana did less than 20 damage to him :( -#define LOW_PRESSURE_DAMAGE 0.6 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). +#define LOW_PRESSURE_DAMAGE 2 // The amount of damage someone takes when in a low pressure area. (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value). ////OPTIMIZATIONS///// @@ -117,10 +117,12 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) //If the fire is burning slower than this rate then the reaction is going too slow to be self sustaining and the fire burns itself out. //This ensures that fires don't grind to a near-halt while still remaining active forever. #define FIRE_GAS_MIN_BURNRATE 0.01 -#define FIRE_LIQUD_MIN_BURNRATE 0.0025 +#define FIRE_LIQUID_MIN_BURNRATE 0.0025 -//How many moles of fuel are contained within one solid/liquid fuel volume unit -#define LIQUIDFUEL_AMOUNT_TO_MOL 0.45 //mol/volume unit +// Converts liquid fuel units to mols +#define LIQUIDFUEL_AMOUNT_TO_MOL(amount) round(amount * 0.45, ATMOS_PRECISION) +// Converts gaseous fuel mols to reagent units +#define GASFUEL_AMOUNT_TO_LIQUID(amount) round(amount / 0.45, CHEMICAL_QUANTISATION_LEVEL) #define TANK_LEAK_PRESSURE (30 * ONE_ATMOSPHERE) // Tank starts leaking. #define TANK_RUPTURE_PRESSURE (40 * ONE_ATMOSPHERE) // Tank spills all contents into atmosphere. @@ -142,7 +144,7 @@ GLOBAL_REAL_VAR(list/gzn_check) = list(NORTH, SOUTH, EAST, WEST) #define TCOMMS_ATMOS list(GAS_NITROGEN = 100) //#define TCOMMS_ATMOS "n2=100;TEMP=80" /// space -#define AIRLESS_ATMOS list() +#define AIRLESS_ATMOS null /// -93.15°C snow and ice turfs //#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" /// -14°C kitchen coldroom, just might loss your tail; higher amount of mol to reach about 101.3 kpA diff --git a/code/__DEFINES/atmospherics/atmos_core.dm b/code/__DEFINES/atmospherics/atmos_core.dm index 25de5af15477..00c4a4524f56 100644 --- a/code/__DEFINES/atmospherics/atmos_core.dm +++ b/code/__DEFINES/atmospherics/atmos_core.dm @@ -31,7 +31,7 @@ /// -270.3degC //#define TCMB 2.7 /// -48.15degC -#define TCRYO 225 +#define TCRYO 170 /// 0degC //#define T0C 273.15 /// 20degC diff --git a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm index 0c9f2c49110a..3a8b6fbe1114 100644 --- a/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm +++ b/code/__DEFINES/atmospherics/atmos_mapping_helpers.dm @@ -1,50 +1,3 @@ -/*//OPEN TURF ATMOS -/// the default air mix that open turfs spawn -#define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" -#define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" -/// -193,15°C telecommunications. also used for xenobiology slime killrooms -#define TCOMMS_ATMOS "n2=100;TEMP=80" -/// space -#define AIRLESS_ATMOS "TEMP=2.7" -/// -93.15°C snow and ice turfs -#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" -/// -14°C kitchen coldroom, just might loss your tail; higher amount of mol to reach about 101.3 kpA -#define KITCHEN_COLDROOM_ATMOS "o2=26;n2=97;TEMP=[COLD_ROOM_TEMP]" -/// used in the holodeck burn test program -#define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" - -//ATMOSPHERICS DEPARTMENT GAS TANK TURFS -#define ATMOS_TANK_N2O "n2o=6000;TEMP=293.15" -#define ATMOS_TANK_CO2 "co2=50000;TEMP=293.15" -#define ATMOS_TANK_PLASMA "plasma=70000;TEMP=293.15" -#define ATMOS_TANK_O2 "o2=100000;TEMP=293.15" -#define ATMOS_TANK_N2 "n2=100000;TEMP=293.15" -#define ATMOS_TANK_BZ "bz=100000;TEMP=293.15" -#define ATMOS_TANK_FREON "freon=100000;TEMP=293.15" -#define ATMOS_TANK_HALON "halon=100000;TEMP=293.15" -#define ATMOS_TANK_HEALIUM "healium=100000;TEMP=293.15" -#define ATMOS_TANK_H2 "hydrogen=100000;TEMP=293.15" -#define ATMOS_TANK_HYPERNOBLIUM "nob=100000;TEMP=293.15" -#define ATMOS_TANK_MIASMA "miasma=100000;TEMP=293.15" -#define ATMOS_TANK_NITRIUM "nitrium=100000;TEMP=293.15" -#define ATMOS_TANK_PLUOXIUM "pluox=100000;TEMP=293.15" -#define ATMOS_TANK_PROTO_NITRATE "proto_nitrate=100000;TEMP=293.15" -#define ATMOS_TANK_TRITIUM "tritium=100000;TEMP=293.15" -#define ATMOS_TANK_H2O "water_vapor=100000;TEMP=293.15" -#define ATMOS_TANK_ZAUKER "zauker=100000;TEMP=293.15" -#define ATMOS_TANK_HELIUM "helium=100000;TEMP=293.15" -#define ATMOS_TANK_ANTINOBLIUM "antinoblium=100000;TEMP=293.15" -#define ATMOS_TANK_AIRMIX "o2=2644;n2=10580;TEMP=293.15" -*/ -//LAVALAND -/// what pressure you have to be under to increase the effect of equipment meant for lavaland -#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 - -//ATMOS MIX IDS -//#define LAVALAND_DEFAULT_ATMOS "LAVALAND_ATMOS" -#define LAVALAND_DEFAULT_ATMOS OPENTURF_LOW_PRESSURE -#define ICEMOON_DEFAULT_ATMOS OPENTURF_LOW_PRESSURE ; temperature = 180 - //AIRLOCK CONTROLLER TAGS //RnD ordnance burn chamber @@ -67,13 +20,3 @@ #define INCINERATOR_ATMOS_AIRLOCK_EXTERIOR "atmos_incinerator_airlock_exterior" #define TEST_ROOM_ATMOS_MAINVENT_1 "atmos_test_room_mainvent_1" #define TEST_ROOM_ATMOS_MAINVENT_2 "atmos_test_room_mainvent_2" - -//Syndicate lavaland base incinerator (lavaland_surface_syndicate_base1.dmm) -#define INCINERATOR_SYNDICATELAVA_IGNITER "syndicatelava_igniter" -#define INCINERATOR_SYNDICATELAVA_MAINVENT "syndicatelava_mainvent" -#define INCINERATOR_SYNDICATELAVA_AUXVENT "syndicatelava_auxvent" -#define INCINERATOR_SYNDICATELAVA_DP_VENTPUMP "syndicatelava_airlock_pump" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR "syndicatelava_airlock_sensor" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER "syndicatelava_airlock_controller" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_INTERIOR "syndicatelava_airlock_interior" -#define INCINERATOR_SYNDICATELAVA_AIRLOCK_EXTERIOR "syndicatelava_airlock_exterior" diff --git a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm index dae51eb5afeb..4dfd71d11717 100644 --- a/code/__DEFINES/atmospherics/atmos_mob_interaction.dm +++ b/code/__DEFINES/atmospherics/atmos_mob_interaction.dm @@ -49,18 +49,10 @@ #define BODYTEMP_COOLING_MAX -30 /// The maximum number of degrees that your body can heat up in 1 tick, due to the environment, when in a hot area. #define BODYTEMP_HEATING_MAX 30 -/// The body temperature limit the human body can take before it starts taking damage from heat. -/// This also affects how fast the body normalises it's temperature when hot. -/// 340k is about 66c, and rather high for a human. -#define BODYTEMP_HEAT_DAMAGE_LIMIT (BODYTEMP_NORMAL + 30) -/// The body temperature limit the human body can take before it starts taking damage from cold. -/// This also affects how fast the body normalises it's temperature when cold. -/// 270k is about -3c, that is below freezing and would hurt over time. -#define BODYTEMP_COLD_DAMAGE_LIMIT (BODYTEMP_NORMAL - 40) -/// The body temperature limit the human body can take before it will take wound damage. -#define BODYTEMP_HEAT_WOUND_LIMIT (BODYTEMP_NORMAL + 90) // 400.5 k -/// The modifier on cold damage limit hulks get ontop of their regular limit -#define BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER 25 + +#define BODYTEMP_COLD_DAMAGE_LIMIT 243 +#define BODYTEMP_HEAT_DAMAGE_LIMIT 360 + /// The modifier on cold damage hulks get. #define HULK_COLD_DAMAGE_MOD 2 @@ -79,7 +71,7 @@ #define BODYTEMP_COLD_WARNING_3 (BODYTEMP_COLD_DAMAGE_LIMIT - 150) //120k /// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this -#define COLD_SLOWDOWN_FACTOR 20 +#define COLD_SLOWDOWN_FACTOR 17 //CLOTHES diff --git a/code/__DEFINES/atmospherics/atmos_piping.dm b/code/__DEFINES/atmospherics/atmos_piping.dm index 11e76cfc935a..1768f070f4f7 100644 --- a/code/__DEFINES/atmospherics/atmos_piping.dm +++ b/code/__DEFINES/atmospherics/atmos_piping.dm @@ -34,7 +34,7 @@ /// The maximum pressure an gas tanks release valve can be set to. #define TANK_MAX_RELEASE_PRESSURE (ONE_ATMOSPHERE*3) /// The default initial value gas tanks release valves are set to. (At least the ones containing pure plasma/oxygen.) -#define TANK_DEFAULT_RELEASE_PRESSURE 16 +#define TANK_DEFAULT_RELEASE_PRESSURE (ONE_ATMOSPHERE*O2STANDARD) /// The default initial value gas plasmamen tanks releases valves are set to. #define TANK_PLASMAMAN_RELEASE_PRESSURE 4 /// The internal temperature in kelvins at which a handheld gas tank begins to take damage. diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 862ccef9dd8e..56b701a10af3 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -40,10 +40,6 @@ #define AI_DETECT_HUD "19" /// Displays launchpads' targeting reticle #define DIAG_LAUNCHPAD_HUD "22" -//for antag huds. these are used at the /mob level -#define ANTAG_HUD "23" -// for fans to identify pins -#define FAN_HUD "24" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -60,7 +56,6 @@ #define DATA_HUD_ABDUCTOR 7 #define DATA_HUD_SENTIENT_DISEASE 8 #define DATA_HUD_AI_DETECT 9 -#define DATA_HUD_FAN 10 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/augments.dm b/code/__DEFINES/augments.dm new file mode 100644 index 000000000000..18cccc14ab0f --- /dev/null +++ b/code/__DEFINES/augments.dm @@ -0,0 +1,26 @@ +#define AUGMENT_CATEGORY_NONE "ERROR" +#define AUGMENT_SLOT_NONE "ERROR" + +//ALL OF THOSE DEFINES NEED TO BE UNIQUE!!! +//Limbs +#define AUGMENT_CATEGORY_BODYPARTS "Limbs" +#define AUGMENT_SLOT_HEAD "Head" +#define AUGMENT_SLOT_CHEST "Chest" +#define AUGMENT_SLOT_L_ARM "Left Arm" +#define AUGMENT_SLOT_R_ARM "Right Arm" +#define AUGMENT_SLOT_L_LEG "Left Leg" +#define AUGMENT_SLOT_R_LEG "Right Leg" + +//Organs +#define AUGMENT_CATEGORY_ORGANS "Organs" +#define AUGMENT_SLOT_HEART "Heart" +#define AUGMENT_SLOT_LUNGS "Lungs" +#define AUGMENT_SLOT_LIVER "Liver" +#define AUGMENT_SLOT_STOMACH "Stomach" +#define AUGMENT_SLOT_EYES "Eyes" +#define AUGMENT_SLOT_TONGUE "Tongue" + +//Implants +#define AUGMENT_CATEGORY_IMPLANTS "Implants" +#define AUGMENT_SLOT_IMPLANTS "Code Reasons" + diff --git a/code/__DEFINES/blood.dm b/code/__DEFINES/blood.dm index b3b8c0d1f3da..1703be356542 100644 --- a/code/__DEFINES/blood.dm +++ b/code/__DEFINES/blood.dm @@ -1,11 +1,14 @@ /// Checks if an object is covered in blood -#define HAS_BLOOD_DNA(thing) (length(thing.GetComponent(/datum/component/forensics)?.blood_DNA)) +#define HAS_BLOOD_DNA(thing) (length(thing.forensics?.blood_DNA)) + +/// Returns a reference to a blood datum +#define GET_BLOOD_REF(blood_type) GLOB.blood_datums[blood_type] //Bloody shoes/footprints /// Minimum alpha of footprints -#define BLOODY_FOOTPRINT_BASE_ALPHA 20 +#define BLOODY_FOOTPRINT_BASE_ALPHA 120 /// How much blood a regular blood splatter contains -#define BLOOD_AMOUNT_PER_DECAL 50 +#define BLOOD_AMOUNT_PER_DECAL 100 /// How much blood an item can have stuck on it #define BLOOD_ITEM_MAX 200 /// How much blood a blood decal can contain @@ -13,12 +16,7 @@ /// How much blood a footprint need to at least contain #define BLOOD_FOOTPRINTS_MIN 5 -//Bloody shoe blood states -/// Red blood -#define BLOOD_STATE_HUMAN "blood" -/// Green xeno blood -#define BLOOD_STATE_XENO "xeno" -/// Black robot oil -#define BLOOD_STATE_OIL "oil" -/// No blood is present -#define BLOOD_STATE_NOT_BLOODY "no blood whatsoever" + +#define BLOOD_PRINT_HUMAN "blood" +#define BLOOD_PRINT_PAWS "bloodpaw" +#define BLOOD_PRINT_CLAWS "bloodclaw" diff --git a/code/__DEFINES/bodyparts.dm b/code/__DEFINES/bodyparts.dm index f2bfaa8d09fe..aaa13fa08507 100644 --- a/code/__DEFINES/bodyparts.dm +++ b/code/__DEFINES/bodyparts.dm @@ -1,8 +1,6 @@ ///The standard amount of bodyparts a carbon has. Currently 6, HEAD/arm/left/arm/right/CHEST/leg/left/R_LEG #define BODYPARTS_DEFAULT_MAXIMUM 6 -///max_damage * this = minimum damage before a bone can break -#define BODYPART_MINIMUM_BREAK_MOD 0.8 ///A modifier applied to the chance to break bones on a given instance of damage #define BODYPART_BONES_BREAK_CHANCE_MOD 1 ///The minimum amount of brute damage for an attack to roll for bone jostle @@ -17,44 +15,62 @@ #define DROPLIMB_MINIMUM_DAMAGE 10 #define DROPLIMB_THRESHOLD_EDGE 0.2 -#define DROPLIMB_THRESHOLD_TEAROFF 0.66 +#define DROPLIMB_THRESHOLD_TEAROFF 0.5 #define DROPLIMB_THRESHOLD_DESTROY 1 +/// The amount of time an organ has to be dead for it to be unrecoverable +#define ORGAN_RECOVERY_THRESHOLD (10 MINUTES) + //Bodypart flags #define BP_BLEEDING (1<<0) -#define BP_HAS_BLOOD (1<<1) -#define BP_HAS_BONES (1<<2) +#define BP_HAS_BLOOD (1<<1) // IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION +#define BP_HAS_BONES (1<<2) // IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION #define BP_BROKEN_BONES (1<<3) -///UNIMPLIMENTED - PLACEHOLDER +/// This limb has a tendon IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION #define BP_HAS_TENDON (1<<4) -///UNIMPLIMENTED - PLACEHOLDER +/// This limb's tendon is cut, and is disabled. #define BP_TENDON_CUT (1<<5) -///UNIMPLIMENTED - PLACEHOLDER +/// This limb has an artery. IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION #define BP_HAS_ARTERY (1<<6) -///UNIMPLIMENTED - PLACEHOLDER +/// This limb's artery is cut, causing massive bleeding. #define BP_ARTERY_CUT (1<<7) -/// This limb has a "hand" and contributes to usable_arms +/// This limb has a "hand" and contributes to usable_arms. IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION #define BP_IS_GRABBY_LIMB (1<<8) -/// This limb is able to be used for movement and contributes to usable_legs +/// This limb is able to be used for movement and contributes to usable_legs. IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION #define BP_IS_MOVEMENT_LIMB (1<<9) +/// Limb is not connected to the nervous system and is not usable. +#define BP_CUT_AWAY (1<<10) +/// Limb cannot feel pain. IMMUTABLE: DO NOT ADD/REMOVE AFTER DEFINITION +#define BP_NO_PAIN (1<<11) +/// Limb is MF dead +#define BP_NECROTIC (1<<12) +/// Limb can be dislocated +#define BP_CAN_BE_DISLOCATED (1<<13) +/// Limb is dislocated +#define BP_DISLOCATED (1<<14) -#define STOCK_BP_FLAGS_CHEST (BP_HAS_BLOOD | BP_HAS_BONES) -#define STOCK_BP_FLAGS_HEAD (BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_ARTERY) -#define STOCK_BP_FLAGS_ARMS (BP_IS_GRABBY_LIMB | BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_TENDON) -#define STOCK_BP_FLAGS_LEGS (BP_IS_MOVEMENT_LIMB | BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_TENDON) +#define HATCH_CLOSED 1 +#define HATCH_UNSCREWED 2 +#define HATCH_OPENED 3 //check_bones() return values -#define CHECKBONES_NONE (0<<0) -#define CHECKBONES_OK (1<<0) -#define CHECKBONES_BROKEN (1<<1) +#define CHECKBONES_NONE (1<<0) +#define CHECKBONES_OK (1<<1) +#define CHECKBONES_BROKEN (1<<2) //check_tendon() return values -#define CHECKTENDON_NONE (0<<0) -#define CHECKTENDON_OK (1<<0) +#define CHECKTENDON_NONE (1<<0) +#define CHECKTENDON_OK (1<<1) #define CHECKTENDON_SEVERED (1<<2) //check_artery() return values -#define CHECKARTERY_NONE (0<<0) -#define CHECKARTERY_OK (1<<0) +#define CHECKARTERY_NONE (1<<0) +#define CHECKARTERY_OK (1<<1) #define CHECKARTERY_SEVERED (1<<2) +// flags for receive_damage() +#define DAMAGE_CAN_FRACTURE (1<<0) +#define DAMAGE_CAN_JOSTLE_BONES (1<<1) +#define DAMAGE_CAN_DISMEMBER (1<<2) + +#define DEFAULT_DAMAGE_FLAGS (DAMAGE_CAN_FRACTURE | DAMAGE_CAN_JOSTLE_BONES | DAMAGE_CAN_DISMEMBER) diff --git a/code/__DEFINES/callbacks.dm b/code/__DEFINES/callbacks.dm index 4b93bc44b047..705b80661198 100644 --- a/code/__DEFINES/callbacks.dm +++ b/code/__DEFINES/callbacks.dm @@ -2,3 +2,5 @@ /// A shorthand for the callback datum, [documented here](datum/callback.html) #define CALLBACK new /datum/callback #define INVOKE_ASYNC world.ImmediateInvokeAsync +/// like CALLBACK but specifically for verb callbacks +#define VERB_CALLBACK new /datum/callback/verb_callback diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index c18f0cf29a5f..cd27fc1c98c6 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -38,7 +38,7 @@ #define SUPPLYPOD_X_OFFSET -16 /// The baseline unit for cargo crates. Adjusting this will change the cost of all in-game shuttles, crate export values, bounty rewards, and all supply pack import values, as they use this as their unit of measurement. -#define CARGO_CRATE_VALUE 200 +#define CARGO_CRATE_VALUE 10 GLOBAL_LIST_EMPTY(supplypod_loading_bays) @@ -58,3 +58,9 @@ GLOBAL_LIST_INIT(podstyles, list(\ 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")\ )) + +// Supply pack flags +#define SUPPLY_PACK_EMAG (1<<0) +#define SUPPLY_PACK_CONTRABAND (1<<1) +#define SUPPLY_PACK_DROPPOD_ONLY (1<<2) +#define SUPPLY_PACK_GOVERNMENT (1<<3) diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm index 77d2bced447f..9c179e98c872 100644 --- a/code/__DEFINES/clothing.dm +++ b/code/__DEFINES/clothing.dm @@ -11,10 +11,8 @@ #define SENSOR_OFF 0 /// Suit sensor displays the mob as alive or dead #define SENSOR_LIVING 1 -/// Suit sensor displays the mob damage values -#define SENSOR_VITALS 2 -/// Suit sensor displays the mob damage values and exact location -#define SENSOR_COORDS 3 +/// Suit sensor displays the mob's health status and rough +#define SENSOR_COORDS 2 //suit sensors: has_sensor defines /// Suit sensor has been EMP'd and cannot display any information (can be fixed) diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index f1374b0722c9..1576e5027fe9 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -35,6 +35,7 @@ #define COLOR_SOFT_RED "#FA8282" #define COLOR_CULT_RED "#960000" #define COLOR_BUBBLEGUM_RED "#950A0A" +#define COLOR_HUMAN_BLOOD "#a10808" #define COLOR_YELLOW "#FFFF00" #define COLOR_VIVID_YELLOW "#FBFF23" @@ -118,13 +119,6 @@ #define COLOR_ASSEMBLY_BLUE "#38559E" #define COLOR_ASSEMBLY_PURPLE "#6F6192" -///Colors for xenobiology vatgrowing -#define COLOR_SAMPLE_YELLOW "#c0b823" -#define COLOR_SAMPLE_PURPLE "#342941" -#define COLOR_SAMPLE_GREEN "#98b944" -#define COLOR_SAMPLE_BROWN "#91542d" -#define COLOR_SAMPLE_GRAY "#5e5856" - ///Main colors for UI themes #define COLOR_THEME_MIDNIGHT "#6086A0" #define COLOR_THEME_PLASMAFIRE "#FFB200" @@ -216,9 +210,6 @@ #define COLOR_PRIDE_GREEN "#41FC66" #define COLOR_PRIDE_BLUE "#42FFF2" #define COLOR_PRIDE_PURPLE "#5D5DFC" -// Medical colors -#define COLOR_MEDICAL_BRUTE "#ff0000" -#define COLOR_MEDICAL_BURN "#ff7700" /// The default color for admin say, used as a fallback when the preference is not enabled #define DEFAULT_ASAY_COLOR COLOR_MOSTLY_PURE_RED @@ -255,3 +246,27 @@ #define CL_MATRIX_CG 18 #define CL_MATRIX_CB 19 #define CL_MATRIX_CA 20 + +// Medical readout colors +#define COLOR_MEDICAL_BRUTE "#ff0000" +#define COLOR_MEDICAL_BURN "#ff7700" +#define COLOR_MEDICAL_TOXIN "#00ff00" +#define COLOR_MEDICAL_OXYLOSS "#0000ff" +#define COLOR_MEDICAL_CRYSTAL "#0066ff" +#define COLOR_MEDICAL_ROBOTIC "#666688" +#define COLOR_MEDICAL_INTERNAL "#ff66ff" +#define COLOR_MEDICAL_RADIATION "#66ff66" +#define COLOR_MEDICAL_NECROTIC "#663333" +#define COLOR_MEDICAL_INTERNAL_DANGER "#aa3333" +#define COLOR_MEDICAL_DISLOCATED "#6666ff" +#define COLOR_MEDICAL_BROKEN "#ff00aa" +#define COLOR_MEDICAL_SPLINTED "#ff66aa" +#define COLOR_MEDICAL_EMBEDDED "#D580FF" +#define COLOR_MEDICAL_LIGAMENT "#4DA6FF" +#define COLOR_MEDICAL_GENETIC "#3BB300" +#define COLOR_MEDICAL_IMPLANT "#aa66ff" +#define COLOR_MEDICAL_UNKNOWN_IMPLANT "#aa00ff" +#define COLOR_MEDICAL_SCARRING "#aa9999" +#define COLOR_MEDICAL_MISSING "#886666" + +#define COLORED_SQUARE(COLOR) "___" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 79e64a55b093..fa69a9e5b9b7 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -19,10 +19,12 @@ #define BRAIN "brain" //Damage flag defines // -/// Involves a melee attack or a thrown object. -#define MELEE "melee" -/// Involves a solid projectile. -#define BULLET "bullet" +/// Involves a blunt object. +#define BLUNT "blunt" +/// Involves a weapon with a point, or bullets. +#define PUNCTURE "puncture" +/// Involves a weapon with a sharp edge, like a knife. +#define SLASH "slash" /// Involves a laser. #define LASER "laser" /// Involves an EMP or energy-based projectile. @@ -35,10 +37,6 @@ #define FIRE "fire" /// Involves corrosive substances. #define ACID "acid" -/// Involved in checking the likelyhood of applying a wound to a mob. -#define WOUND "wound" -/// Involves being eaten -#define CONSUME "consume" //bitflag damage defines used for suicide_act #define BRUTELOSS (1<<0) @@ -92,9 +90,9 @@ #define BASE_GRAB_RESIST_CHANCE 60 //base chance for whether or not you can escape from a grab //slowdown when in softcrit. Note that crawling slowdown will also apply at the same time! -#define SOFTCRIT_ADD_SLOWDOWN 4 +#define SOFTCRIT_ADD_SLOWDOWN 3 //slowdown when crawling -#define CRAWLING_ADD_SLOWDOWN 4 +#define CRAWLING_ADD_SLOWDOWN 6 //Attack types for checking shields/hit reactions #define MELEE_ATTACK 1 @@ -117,7 +115,7 @@ //the define for visible message range in combat #define SAMETILE_MESSAGE_RANGE 1 -#define COMBAT_MESSAGE_RANGE 3 +#define COMBAT_MESSAGE_RANGE 4 #define DEFAULT_MESSAGE_RANGE 7 //Shove knockdown lengths (deciseconds) @@ -140,7 +138,7 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( ///Chance for embedded objects to cause pain (damage user) #define EMBEDDED_PAIN_CHANCE 15 ///Chance for embedded object to fall out (causing pain but removing the object) -#define EMBEDDED_ITEM_FALLOUT 5 +#define EMBEDDED_ITEM_FALLOUT 0 ///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) @@ -148,11 +146,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( ///Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) #define EMBEDDED_IMPACT_PAIN_MULTIPLIER 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 EMBED_THROWSPEED_THRESHOLD 4 +#define EMBED_THROWSPEED_THRESHOLD 2 ///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 +#define EMBEDDED_UNSAFE_REMOVAL_TIME (3 SECONDS) ///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 @@ -167,29 +165,10 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #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 -#define WEAPON_MEDIUM 2 -#define WEAPON_HEAVY 3 //Gun trigger guards #define TRIGGER_GUARD_ALLOW_ALL -1 #define TRIGGER_GUARD_NONE 0 #define TRIGGER_GUARD_NORMAL 1 -//Gun bolt types -///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. -/// Example: c20, shotguns, m90 -#define BOLT_TYPE_STANDARD 1 -///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. -/// Example: Some SMGs, the L6 -#define BOLT_TYPE_OPEN 2 -///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. -/// Example: Break action shotguns, revolvers -#define BOLT_TYPE_NO_BOLT 3 -///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. -/// Example: Pistols with a slide lock, some SMGs -#define BOLT_TYPE_LOCKING 4 -///This is effectively BOLT_TYPE_STANDARD and NO_BOLT in one. -#define BOLT_TYPE_NO_BOLT_PLUS 5 //Sawn off nerfs ///accuracy penalty of sawn off guns @@ -249,6 +228,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define BODY_ZONE_PRECISE_L_FOOT "l_foot" #define BODY_ZONE_PRECISE_R_FOOT "r_foot" +/// The max damage capacity of the average human. Used for balance purposes. +#define CARBON_BODYPART_HEALTH_SUM (/obj/item/bodypart/head::max_damage + /obj/item/bodypart/chest::max_damage + /obj/item/bodypart/leg::max_damage + /obj/item/bodypart/arm::max_damage) + //We will round to this value in damage calculations. #define DAMAGE_PRECISION 0.1 @@ -295,13 +277,8 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( /// Martial arts attack happened and succeeded, do not allow a check for a regular attack. #define MARTIAL_ATTACK_SUCCESS TRUE -/// IF an object is weak against armor, this is the value that any present armor is multiplied by -#define ARMOR_WEAKENED_MULTIPLIER 2 - -/// Return values used in item/melee/baton/baton_attack. -/// Does a normal item attack. -#define BATON_DO_NORMAL_ATTACK 1 -/// The attack has been stopped. Either because the user was clumsy or the attack was blocked. -#define BATON_ATTACK_DONE 2 -/// The baton attack is still going. baton_effect() is called. -#define BATON_ATTACKING 3 +// Used by attack chain +/// Continue the attack chain +#define ATTACK_CHAIN_CONTINUE 0 +/// Attack was a success, stop any further chain procs +#define ATTACK_CHAIN_SUCCESS 1 diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 544e03bb0bb7..c6fab7e2e4e7 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -63,6 +63,8 @@ //windows affected by Nar'Sie turn this color. #define NARSIE_WINDOW_COLOUR "#7D1919" +#define IRON_VALUE_PER_UNIT 0.0004 + //The amount of materials you get from a sheet of mineral like iron/diamond/glass etc #define MINERAL_MATERIAL_AMOUNT 2000 //The maximum size of a stack object. diff --git a/code/__DEFINES/cooldowns.dm b/code/__DEFINES/cooldowns.dm index 7707558bfe7e..c94ea9b45b79 100644 --- a/code/__DEFINES/cooldowns.dm +++ b/code/__DEFINES/cooldowns.dm @@ -59,9 +59,9 @@ #define COOLDOWN_YAWN_PROPAGATION "yawn_propagation_cooldown" //Shared cooldowns for actions -#define MOB_SHARED_COOLDOWN_1 "mob_shared_cooldown_1" -#define MOB_SHARED_COOLDOWN_2 "mob_shared_cooldown_2" -#define MOB_SHARED_COOLDOWN_3 "mob_shared_cooldown_3" +#define MOB_SHARED_COOLDOWN_1 (1<<0) +#define MOB_SHARED_COOLDOWN_2 (1<<1) +#define MOB_SHARED_COOLDOWN_3 (1<<2) //TIMER COOLDOWN MACROS diff --git a/code/__DEFINES/credits.dm b/code/__DEFINES/credits.dm index 2b3f0f734d2a..77ecd66f2705 100644 --- a/code/__DEFINES/credits.dm +++ b/code/__DEFINES/credits.dm @@ -1 +1,3 @@ #define BLACKBOX_FEEDBACK_NUM(key) (SSblackbox.feedback[key] ? SSblackbox.feedback[key].json["data"] : null) + +#define BLACKBOX_FEEDBACK_NESTED_TALLY(key) (SSblackbox.feedback[key] ? SSblackbox.feedback[key].json["data"] : null) diff --git a/code/__DEFINES/datacore.dm b/code/__DEFINES/datacore.dm new file mode 100644 index 000000000000..87d4eaaf5a42 --- /dev/null +++ b/code/__DEFINES/datacore.dm @@ -0,0 +1,42 @@ +#define DATACORE_ID "id" +#define DATACORE_NAME "name" +#define DATACORE_AGE "age" +#define DATACORE_GENDER "gender" +#define DATACORE_SPECIES "species" +#define DATACORE_FINGERPRINT "fingerprint" +#define DATACORE_APPEARANCE "character_appearance" +#define DATACORE_MINDREF "mind" +#define DATACORE_DNA_IDENTITY "identity" +#define DATACORE_DNA_FEATURES "features" + +#define DATACORE_PHYSICAL_HEALTH "p_stat" +#define DATACORE_MENTAL_HEALTH "m_stat" +#define DATACORE_BLOOD_TYPE "blood_type" +#define DATACORE_BLOOD_DNA "b_dna" +#define DATACORE_DISEASES "cdi" +#define DATACORE_DISEASES_DETAILS "cdi_d" +#define DATACORE_DISABILITIES "ma_dis" +#define DATACORE_DISABILITIES_DETAILS "ma_dis_d" + +#define DATACORE_NOTES "notes" +#define DATACORE_NOTES_DETAILS "notes_d" + +#define DATACORE_RANK "rank" +#define DATACORE_INITIAL_RANK "initial_rank" +#define DATACORE_TRIM "trim" +#define DATACORE_PDA_ID "pda_id" + +#define DATACORE_CRIMES "crim" +#define DATACORE_CRIMINAL_STATUS "criminal" +#define DATACORE_CITATIONS "citation" + +/// Keys for SSdatacore.library +#define DATACORE_RECORDS_STATION "general" +#define DATACORE_RECORDS_SECURITY "security" +#define DATACORE_RECORDS_MEDICAL "medical" +#define DATACORE_RECORDS_LOCKED "locked" + +#define DATACORE_RECORDS_AETHER "aether" +#define DATACORE_RECORDS_DAEDALUS "daedalus" +#define DATACORE_RECORDS_HERMES "hermes" +#define DATACORE_RECORDS_MARS "mars" diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 2657b95f3b38..687a0e13428b 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -9,7 +9,10 @@ #define ELEMENT_INCOMPATIBLE 1 // /datum/element flags -/// Causes the detach proc to be called when the host object is being deleted +/// Causes the detach proc to be called when the host object is being deleted. +/// Should only be used if you need to perform cleanup not related to the host object. +/// You do not need this if you are only unregistering signals, for instance. +/// You would need it if you are doing something like removing the target from a processing list. #define ELEMENT_DETACH (1 << 0) /** * Only elements created with the same arguments given after `id_arg_index` share an element instance diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm index 7db852789e1e..47f08a996113 100644 --- a/code/__DEFINES/dcs/signals/signals_action.dm +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -35,8 +35,3 @@ #define COMSIG_STARTED_CHARGE "mob_ability_charge_started" /// From base of /datum/action/cooldown/mob_cooldown/charge/proc/do_charge(): () #define COMSIG_FINISHED_CHARGE "mob_ability_charge_finished" -/// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () -#define COMSIG_SWOOP_INVULNERABILITY_STARTED "mob_swoop_invulnerability_started" -/// From base of /datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(): () -#define COMSIG_LAVA_ARENA_FAILED "mob_lava_arena_failed" - diff --git a/code/__DEFINES/dcs/signals/signals_area.dm b/code/__DEFINES/dcs/signals/signals_area.dm index e82027baab2f..406d168a51e2 100644 --- a/code/__DEFINES/dcs/signals/signals_area.dm +++ b/code/__DEFINES/dcs/signals/signals_area.dm @@ -18,3 +18,8 @@ #define COMSIG_ALARM_TRIGGERED "comsig_alarm_triggered" ///Send when an alarm source is cleared (alarm_type, area/source_area) #define COMSIG_ALARM_CLEARED "comsig_alarm_clear" + + +// Spook level signals +///from base of area/proc/adjust_spook_level(): (area, old_spook_level) +#define AREA_SPOOK_LEVEL_CHANGED "comsig_area_spook_level_changed" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm index 04755aca997d..e03155f2352a 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_attack.dm @@ -33,7 +33,8 @@ ///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 COMPONENT_SKIP_ATTACK_STEP (1<<1) + ///from base of atom/attack_ghost(): (mob/dead/observer/ghost) #define COMSIG_ATOM_ATTACK_GHOST "atom_attack_ghost" ///from base of atom/attack_hand(): (mob/user, list/modifiers) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm index 3ce2ebd39e1a..025c5a052065 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_main.dm @@ -10,9 +10,6 @@ ///from base of atom/get_examine_name(): (/mob, list/overrides) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" #define COMSIG_PARENT_EXAMINE_MORE "atom_examine_more" ///from base of atom/examine_more(): (/mob) - //Positions for overrides list - #define EXAMINE_POSITION_ARTICLE (1<<0) - #define EXAMINE_POSITION_BEFORE (1<<1) //End positions #define COMPONENT_EXNAME_CHANGED (1<<0) ///from base of [/atom/proc/update_appearance]: (updates) diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm index 2f8ebc836650..e85b05e4f025 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -9,7 +9,7 @@ ///from base of atom/ShiftClick(): (/mob) #define COMSIG_CLICK_SHIFT "shift_click" #define COMPONENT_ALLOW_EXAMINATE (1<<0) //Allows the user to examinate regardless of client.eye. -///from base of atom/CtrlClickOn(): (/mob) +///from base of atom/CtrlClickOn(): (/mob, list/params) #define COMSIG_CLICK_CTRL "ctrl_click" ///from base of atom/AltClick(): (/mob) #define COMSIG_CLICK_ALT "alt_click" @@ -22,7 +22,7 @@ ///from base of atom/MouseDrop(): (/atom/over, /mob/user) #define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" #define COMPONENT_NO_MOUSEDROP (1<<0) -///from base of atom/MouseDrop_T: (/atom/from, /mob/user) +///from base of atom/MouseDroppedOn: (/atom/from, /mob/user) #define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" ///from base of mob/MouseWheelOn(): (/atom, delta_x, delta_y, params) #define COMSIG_MOUSE_SCROLL_ON "mousescroll_on" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm index 64ea966dc0a5..f008ef7d895a 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -7,10 +7,6 @@ #define COMPONENT_MOVABLE_BLOCK_PRE_MOVE (1<<0) ///from base of atom/movable/Moved(): (atom/old_loc, dir, forced, list/old_locs) #define COMSIG_MOVABLE_MOVED "movable_moved" -///from base of atom/movable/Cross(): (/atom/movable) -#define COMSIG_MOVABLE_CROSS "movable_cross" -///from base of atom/movable/Move(): (/atom/movable) -#define COMSIG_MOVABLE_CROSS_OVER "movable_cross_am" ///from base of atom/movable/Bump(): (/atom) #define COMSIG_MOVABLE_BUMP "movable_bump" ///from base of atom/movable/newtonian_move(): (inertia_direction, start_delay) @@ -59,9 +55,14 @@ #define HEARING_SPEAKER 2 #define HEARING_LANGUAGE 3 #define HEARING_RAW_MESSAGE 4 - /* #define HEARING_RADIO_FREQ 5 + #define HEARING_RADIO_FREQ 5 #define HEARING_SPANS 6 - #define HEARING_MESSAGE_MODE 7 */ + #define HEARING_MESSAGE_MODE 7 + #define HEARING_SOUND_LOC 8 + #define HEARING_MESSAGE_RANGE 9 + +/// Same as the above but RAW_MESSAGE will be replaced with the mob's interpretation of the message. +#define COMSIG_LIVING_HEAR_POST_TRANSLATION "living_hear_after_translate" ///called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_DISPOSING "movable_disposing" @@ -81,8 +82,6 @@ #define COMSIG_MOVABLE_LIGHT_OVERLAY_TOGGLE_ON "movable_light_overlay_toggle_on" ///called when the movable's glide size is updated: (new_glide_size) #define COMSIG_MOVABLE_UPDATE_GLIDE_SIZE "movable_glide_size" -///Called when a movable is hit by a plunger in layer mode, from /obj/item/plunger/attack_atom() -#define COMSIG_MOVABLE_CHANGE_DUCT_LAYER "movable_change_duct_layer" ///Called when a movable is being teleported from `do_teleport()`: (destination, channel) #define COMSIG_MOVABLE_TELEPORTED "movable_teleported" ///Called after a movable is teleported from `do_teleport()`: () diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm index bdc082f9c759..eb3fccdbf931 100644 --- a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movement.dm @@ -2,26 +2,23 @@ // When the signal is called: (signal arguments) // All signals send the source datum of the signal as the first argument -///signal sent out by an atom when it checks if it can be pulled, for additional checks -#define COMSIG_ATOM_CAN_BE_PULLED "movable_can_be_pulled" - #define COMSIG_ATOM_CANT_PULL (1 << 0) +///signal sent out by an atom when it checks if it can be grabbed, for additional checks +#define COMSIG_ATOM_CAN_BE_GRABBED "movable_can_be_grabbed" + #define COMSIG_ATOM_NO_GRAB (1 << 0) ///signal sent out by an atom when it is no longer being pulled by something else : (atom/puller) -#define COMSIG_ATOM_NO_LONGER_PULLED "movable_no_longer_pulled" -///signal sent out by an atom when it is no longer pulling something : (atom/pulling) -#define COMSIG_ATOM_NO_LONGER_PULLING "movable_no_longer_pulling" +#define COMSIG_ATOM_NO_LONGER_GRABBED "movable_no_longer_grabbed" +///signal sent out by a living mob when it is no longer pulling something : (atom/pulling) +#define COMSIG_LIVING_NO_LONGER_GRABBING "living_no_longer_grabbing" ///called for each movable in a turf contents on /turf/zImpact(): (atom/movable/A, levels) #define COMSIG_ATOM_INTERCEPT_Z_FALL "movable_intercept_z_impact" -///called on a movable (NOT living) when it starts pulling (atom/movable/pulled, state, force) -#define COMSIG_ATOM_START_PULL "movable_start_pull" -///called on /living when someone starts pulling (atom/movable/pulled, state, force) -#define COMSIG_LIVING_START_PULL "living_start_pull" -///called on /living when someone is pulled (mob/living/puller) -#define COMSIG_LIVING_GET_PULLED "living_start_pulled" -///called on /living, when pull is attempted, but before it completes, from base of [/mob/living/start_pulling]: (atom/movable/thing, force) -#define COMSIG_LIVING_TRY_PULL "living_try_pull" - #define COMSIG_LIVING_CANCEL_PULL (1 << 0) -/// Called from /mob/living/update_pull_movespeed -#define COMSIG_LIVING_UPDATING_PULL_MOVESPEED "living_updating_pull_movespeed" +///called on a movable when it starts pulling (atom/movable/pulled, state, force) +#define COMSIG_LIVING_START_GRAB "movable_start_grab" +///called on a movable when it has been grabbed +#define COMSIG_ATOM_GET_GRABBED "movable_start_grabbed" +///called on /living, when a grab is attempted, but before it completes, from base of [/mob/living/make_grab]: (atom/movable/thing, grab_type) +#define COMSIG_LIVING_TRY_GRAB "living_try_pull" + #define COMSIG_LIVING_CANCEL_GRAB (1 << 0) + /// Called from /mob/living/PushAM -- Called when this mob is about to push a movable, but before it moves /// (aotm/movable/being_pushed) #define COMSIG_LIVING_PUSHING_MOVABLE "living_pushing_movable" diff --git a/code/__DEFINES/dcs/signals/signals_cytology.dm b/code/__DEFINES/dcs/signals/signals_cytology.dm deleted file mode 100644 index 7dc4152edfc7..000000000000 --- a/code/__DEFINES/dcs/signals/signals_cytology.dm +++ /dev/null @@ -1,4 +0,0 @@ -//Cytology signals -///Sent from /datum/biological_sample/proc/reset_sample -#define COMSIG_SAMPLE_GROWTH_COMPLETED "sample_growth_completed" - #define SPARE_SAMPLE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_datum.dm b/code/__DEFINES/dcs/signals/signals_datum.dm index 49bb6406e789..dd6da412fe3b 100644 --- a/code/__DEFINES/dcs/signals/signals_datum.dm +++ b/code/__DEFINES/dcs/signals/signals_datum.dm @@ -38,12 +38,3 @@ /// From /datum/gas_mixture/proc/react: () #define COMSIG_GASMIX_REACTED "comsig_gasmix_reacted" -// Modular computer's file signals. Tells the program datum something is going on. -/// From /obj/item/computer_hardware/hard_drive/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDING "comsig_modular_computer_file_adding" -/// From /obj/item/computer_hardware/hard_drive/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_ADDED "comsig_modular_computer_file_adding" -/// From /obj/item/computer_hardware/hard_drive/proc/remove_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_DELETING "comsig_modular_computer_file_deleting" -/// From /obj/item/computer_hardware/hard_drive/proc/store_file: () -#define COMSIG_MODULAR_COMPUTER_FILE_DELETED "comsig_modular_computer_file_adding" diff --git a/code/__DEFINES/dcs/signals/signals_gib.dm b/code/__DEFINES/dcs/signals/signals_gib.dm index aefc908bf1fc..67c95f61e5db 100644 --- a/code/__DEFINES/dcs/signals/signals_gib.dm +++ b/code/__DEFINES/dcs/signals/signals_gib.dm @@ -1,5 +1,5 @@ //Gibs ///from base of /obj/effect/decal/cleanable/blood/gibs/streak(): (list/directions, list/diseases) #define COMSIG_GIBS_STREAK "gibs_streak" -/// Called on mobs when they step in blood. (blood_amount, blood_state, list/blood_DNA) +/// Called on mobs when they step in blood. #define COMSIG_STEP_ON_BLOOD "step_on_blood" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index d6e1ef2bde82..f36b570e58ac 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -71,3 +71,13 @@ ///Global signal sent when SSticker enters Runlevel Game #define COMSIG_GLOB_GAME_START "!game_started" + +///Global signal sent when the Datacore's initial manifest is complete +#define COMSIG_GLOB_DATACORE_READY "!datacore_ready" +///Global signal sent when the datacore is added to via manifest_inject() (datum/data/record/general, datum/data/record/medical, datum/data/record/security, datum/data/record/locked) +#define COMSIG_GLOB_MANIFEST_INJECT "!manifest_inject" + +///Global signal sent when someone is marked as wanted. +#define COMSIG_GLOB_WANTED_CRIMINAL "!wanted_crew" +///Global signal sent when SSholomaps initializes +#define COMSIG_GLOB_HOLOMAPS_READY "!holomaps_ready" diff --git a/code/__DEFINES/dcs/signals/signals_machinery.dm b/code/__DEFINES/dcs/signals/signals_machinery.dm index 05a22ceb1c00..6b2c2e7ad33e 100644 --- a/code/__DEFINES/dcs/signals/signals_machinery.dm +++ b/code/__DEFINES/dcs/signals/signals_machinery.dm @@ -1,2 +1,7 @@ ///Issued by Air Alarms and Fire Alarms to communicate. #define COMSIG_FIRE_ALERT "comsig_fire_alert" + +///from base of [/datum/holomap_holder/proc/show_to]: (mob/viewer) +#define COMSIG_HOLOMAP_VIEWER_GAINED "comsig_holomap_add_viewer" +///from base of [/datum/holomap_holder/proc/remove_viewer]: (mob/viewer) +#define COMSIG_HOLOMAP_VIEWER_REMOVED "comsig_holomap_remove_viewer" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm index a66242699018..033f66d62b79 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -8,9 +8,6 @@ ///Called from /mob/living/carbon/help_shake_act on the helper, after any hugs have ocurred. (mob/living/helped) #define COMSIG_CARBON_HELPED "carbon_helped_someone" -///Before a carbon mob is shoved, sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target) -#define COMSIG_CARBON_DISARM_PRESHOVE "carbon_disarm_preshove" - #define COMSIG_CARBON_ACT_SOLID (1<<0) //Tells disarm code to act as if the mob was shoved into something solid, even we we're not ///When a carbon mob is disarmed, this is sent to the turf we're trying to shove onto (mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) #define COMSIG_CARBON_DISARM_COLLIDE "carbon_disarm_collision" #define COMSIG_CARBON_SHOVE_HANDLED (1<<0) @@ -20,16 +17,24 @@ ///When a carbon gets a vending machine tilted on them #define COMSIG_ON_VENDOR_CRUSH "carbon_vendor_crush" // /mob/living/carbon physiology signals -#define COMSIG_CARBON_GAIN_WOUND "carbon_gain_wound" //from /datum/wound/proc/apply_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) -#define COMSIG_CARBON_LOSE_WOUND "carbon_lose_wound" //from /datum/wound/proc/remove_wound() (/mob/living/carbon/C, /datum/wound/W, /obj/item/bodypart/L) #define COMSIG_CARBON_BREAK_BONE "carbon_break_bone" #define COMSIG_CARBON_HEAL_BONE "carbon_heal_bone" ///from base of /obj/item/bodypart/proc/attach_limb(): (new_limb, special) allows you to fail limb attachment #define COMSIG_CARBON_ATTACH_LIMB "carbon_attach_limb" #define COMPONENT_NO_ATTACH (1<<0) -#define COMSIG_CARBON_REMOVE_LIMB "carbon_remove_limb" //from base of /obj/item/bodypart/proc/drop_limb(lost_limb, dismembered) -#define COMSIG_BODYPART_GAUZED "bodypart_gauzed" // from /obj/item/bodypart/proc/apply_gauze(/obj/item/stack/gauze) -#define COMSIG_BODYPART_GAUZE_DESTROYED "bodypart_degauzed" // from [/obj/item/bodypart/proc/seep_gauze] when it runs out of absorption +#define COMSIG_CARBON_REMOVED_LIMB "carbon_remove_limb" //from base of /obj/item/bodypart/proc/drop_limb(lost_limb, dismembered) + +/// From /obj/item/bodypart/proc/attach_limb(/mob/living/carbon/C, special) +#define COMSIG_LIMB_ATTACH "limb_attach" +/// From /obj/item/bodypart/proc/drop_limb(/mob/living/carbon/C, special) +#define COMSIG_LIMB_REMOVE "limb_remove" +/// From /obj/item/bodypart/proc/apply_splint() +#define COMSIG_LIMB_SPLINTED "limb_splinted" +/// From /obj/item/bodypart/proc/remove_splint() +#define COMSIG_LIMB_UNSPLINTED "limb_unsplinted" + +#define COMSIG_LIMB_UPDATE_INTERACTION_SPEED "limb_interact_speed_change" +#define COMSIG_LIMB_EMBED_RIP "limb_embed_rip" ///from base of mob/living/carbon/soundbang_act(): (list(intensity)) #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" @@ -37,15 +42,13 @@ #define COMSIG_CARBON_GAIN_ORGAN "carbon_gain_organ" ///from /item/organ/proc/Remove() (/obj/item/organ/) #define COMSIG_CARBON_LOSE_ORGAN "carbon_lose_organ" -///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent) +///from /mob/living/carbon/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop, silent) #define COMSIG_CARBON_EQUIP_HAT "carbon_equip_hat" -///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent) +///from /mob/living/carbon/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop, silent) #define COMSIG_CARBON_UNEQUIP_HAT "carbon_unequip_hat" -///from /mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop, silent) +///from /mob/living/carbon/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop, silent) #define COMSIG_CARBON_UNEQUIP_SHOECOVER "carbon_unequip_shoecover" #define COMSIG_CARBON_EQUIP_SHOECOVER "carbon_equip_shoecover" -///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_RIP "item_embed_start_rip" ///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_EMBED_REMOVAL "item_embed_remove_safe" ///Called when someone attempts to cuff a carbon @@ -68,6 +71,10 @@ #define COMSIG_CARBON_SANITY_UPDATE "carbon_sanity_update" ///Called when a carbon breathes, before the breath has actually occured #define COMSIG_CARBON_PRE_BREATHE "carbon_pre_breathe" +///Called from apply_overlay(cache_index, overlay) +#define COMSIG_CARBON_APPLY_OVERLAY "carbon_apply_overlay" +///Called from remove_overlay(cache_index, overlay) +#define COMSIG_CARBON_REMOVE_OVERLAY "carbon_remove_overlay" // /mob/living/carbon/human signals @@ -79,11 +86,7 @@ #define COMSIG_HUMAN_CORETEMP_CHANGE "human_coretemp_change" ///from /datum/species/handle_fire. Called when the human is set on fire and burning clothes and stuff #define COMSIG_HUMAN_BURNING "human_burning" -///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers) -#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack" -///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity, modifiers) -#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" -//from /mob/living/carbon/human/proc/check_shields(): (atom/hit_by, damage, attack_text, attack_type, armour_penetration) +//from /mob/living/carbon/human/proc/check_shields(): (atom/hit_by, damage, attack_text, attack_type, armor_penetration) #define COMSIG_HUMAN_CHECK_SHIELDS "human_check_shields" #define SHIELD_BLOCK (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 1b92c35488c3..5a1e24edc13f 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -1,4 +1,4 @@ -///called on /living when attempting to pick up an item, from base of /mob/living/put_in_hand_check(): (obj/item/I) +///called on /living when attempting to pick up an item, from base of /mob/living/can_put_in_hand(): (obj/item/I) #define COMSIG_LIVING_TRY_PUT_IN_HAND "living_try_put_in_hand" /// Can't pick up #define COMPONENT_LIVING_CANT_PUT_IN_HAND (1<<0) @@ -6,8 +6,6 @@ // Organ signals /// Called on the organ when it is implanted into someone (mob/living/carbon/receiver) #define COMSIG_ORGAN_IMPLANTED "comsig_organ_implanted" -/// Called when using the *wag emote -#define COMSIG_ORGAN_WAG_TAIL "comsig_wag_tail" /// Called on the organ when it is removed from someone (mob/living/carbon/old_owner) #define COMSIG_ORGAN_REMOVED "comsig_organ_removed" @@ -51,7 +49,7 @@ #define COMSIG_LIVING_WRITE_MEMORY "living_write_memory" #define COMPONENT_DONT_WRITE_MEMORY (1<<0) -/// from /proc/healthscan(): (list/scan_results, advanced, mob/user, mode) +/// from /proc/healthscan(): (list/render_strings, mob/user, mode, advanced) /// Consumers are allowed to mutate the scan_results list to add extra information #define COMSIG_LIVING_HEALTHSCAN "living_healthscan" @@ -77,11 +75,15 @@ #define COMSIG_LIVING_POST_FULLY_HEAL "living_post_fully_heal" /// from start of /mob/living/handle_breathing(): (delta_time, times_fired) #define COMSIG_LIVING_HANDLE_BREATHING "living_handle_breathing" -///from /obj/item/hand_item/slapper/attack_atom(): (source=mob/living/slammer, obj/structure/table/slammed_table) +///from /obj/item/hand_item/slapper/attack_obj(): (source=mob/living/slammer, obj/structure/table/slammed_table) #define COMSIG_LIVING_SLAM_TABLE "living_slam_table" ///from /obj/item/hand_item/slapper/attack(): (source=mob/living/slapper, mob/living/slapped) #define COMSIG_LIVING_SLAP_MOB "living_slap_mob" -///(NOT on humans) from mob/living/*/UnarmedAttack(): (atom/target, proximity, modifiers) +/// from /mob/living/*/UnarmedAttack(), before sending [COMSIG_LIVING_UNARMED_ATTACK]: (mob/living/source, atom/target, proximity, modifiers) +/// The only reason this exists is so hulk can fire before Fists of the North Star. +/// Note that this is called before [/mob/living/proc/can_unarmed_attack] is called, so be wary of that. +#define COMSIG_LIVING_EARLY_UNARMED_ATTACK "human_pre_attack_hand" +/// from mob/living/*/UnarmedAttack(): (mob/living/source, atom/target, proximity, modifiers) #define COMSIG_LIVING_UNARMED_ATTACK "living_unarmed_attack" ///From base of mob/living/MobBump() (mob/living) #define COMSIG_LIVING_MOB_BUMP "living_mob_bump" @@ -94,3 +96,12 @@ ///From obj/item/toy/crayon/spraycan #define COMSIG_LIVING_MOB_PAINTED "living_mob_painted" + +///From mob/living/Say() +#define COMSIG_LIVING_USE_RADIO "living_talk_into_radio" + +///From mob/living/proc/set_combat_mode(): (mob/living/user, new_mode) +#define COMSIG_LIVING_TOGGLE_COMBAT_MODE "living_toggle_combat_mode" + +/// from base of [/mob/living/changeNext_Move()] (next_move) +#define COMSIG_LIVING_CHANGENEXT_MOVE "living_changenext_move" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm index 165a8152093f..6f1faf475b40 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -44,6 +44,11 @@ #define COMSIG_MOB_CLIENT_CHANGE_VIEW "mob_client_change_view" /// From base of /mob/proc/reset_perspective() (mob/source) #define COMSIG_MOB_RESET_PERSPECTIVE "mob_reset_perspective" +/// from base of /client/proc/set_eye() : (atom/old_eye, atom/new_eye) +#define COMSIG_CLIENT_SET_EYE "client_set_eye" +/// from base of /datum/view_data/proc/afterViewChange() : (view) +#define COMSIG_VIEWDATA_UPDATE "viewdata_update" + ///from mind/transfer_to. Sent to the receiving mob. #define COMSIG_MOB_MIND_TRANSFERRED_INTO "mob_mind_transferred_into" @@ -82,13 +87,14 @@ #define COMPONENT_UPPERCASE_SPEECH (1<<0) // used to access COMSIG_MOB_SAY argslist #define SPEECH_MESSAGE 1 - // #define SPEECH_BUBBLE_TYPE 2 + #define SPEECH_BUBBLE_TYPE 2 #define SPEECH_SPANS 3 - // #define SPEECH_SANITIZE 4 + #define SPEECH_SANITIZE 4 #define SPEECH_LANGUAGE 5 - /* #define SPEECH_IGNORE_SPAM 6 - #define SPEECH_FORCED 7 */ - #define SPEECH_RANGE 8 + #define SPEECH_IGNORE_SPAM 6 + #define SPEECH_FORCED 7 + #define SPEECH_FILTERPROOF 8 + #define SPEECH_RANGE 9 ///from /mob/say_dead(): (mob/speaker, message) #define COMSIG_MOB_DEADSAY "mob_deadsay" @@ -120,7 +126,7 @@ #define COMSIG_MOB_CREAMED "mob_creamed" ///From /obj/item/gun/proc/check_botched() #define COMSIG_MOB_CLUMSY_SHOOT_FOOT "mob_clumsy_shoot_foot" -///from /obj/item/hand_item/slapper/attack_atom(): (source=obj/structure/table/slammed_table, mob/living/slammer) +///from /obj/item/hand_item/slapper/attack_obj(): (source=obj/structure/table/slammed_table, mob/living/slammer) #define COMSIG_TABLE_SLAMMED "table_slammed" ///from base of atom/attack_hand(): (mob/user, modifiers) #define COMSIG_MOB_ATTACK_HAND "mob_attack_hand" @@ -147,3 +153,6 @@ #define COMSIG_MOB_AUTOMUTE_CHECK "client_automute_check" // The check is performed by the client. /// Prevents the automute system checking this client for repeated messages. #define WAIVE_AUTOMUTE_CHECK (1<<0) + +/// from base of [/datum/preference/toggle/motion_sickness] (new_value) +#define COMSIG_MOB_MOTION_SICKNESS_UPDATE "client_prefs_motion_sickness_change" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm index c5a7f8c93a50..cbd60ecb349c 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_simple.dm @@ -5,7 +5,7 @@ // /mob/living/simple_animal/hostile signals ///before attackingtarget has happened, source is the attacker and target is the attacked #define COMSIG_HOSTILE_PRE_ATTACKINGTARGET "hostile_pre_attackingtarget" - #define COMPONENT_HOSTILE_NO_ATTACK (1<<0) //cancel the attack, only works before attack happens + #define COMPONENT_HOSTILE_NO_ATTACK COMPONENT_CANCEL_ATTACK_CHAIN //cancel the attack, only works before attack happens ///after attackingtarget has happened, source is the attacker and target is the attacked, extra argument for if the attackingtarget was successful #define COMSIG_HOSTILE_POST_ATTACKINGTARGET "hostile_post_attackingtarget" ///from base of mob/living/simple_animal/hostile/regalrat: (mob/living/simple_animal/hostile/regalrat/king) diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index e5c27a902a65..6c33f9352e13 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -1,6 +1,14 @@ //MODsuit signals /// Called when a module is selected to be the active one from on_select(obj/item/mod/module/module) #define COMSIG_MOD_MODULE_SELECTED "mod_module_selected" +/// Called when a MOD user deploys one or more of its parts. +#define COMSIG_MOD_DEPLOYED "mod_deployed" +/// Called when a MOD user retracts one or more of its parts. +#define COMSIG_MOD_RETRACTED "mod_retracted" +/// Called when a MOD deploys a part. +#define COMSIG_MOD_PART_DEPLOYED "mod_part_deployed" +/// Called when a MOD retracts a part. +#define COMSIG_MOD_PART_RETRACTED "mod_part_retracted" /// Called when a MOD activation is called from toggle_activate(mob/user) #define COMSIG_MOD_ACTIVATE "mod_activate" /// Cancels the suit's activation diff --git a/code/__DEFINES/dcs/signals/signals_mood.dm b/code/__DEFINES/dcs/signals/signals_mood.dm deleted file mode 100644 index fd5f5c9606e6..000000000000 --- a/code/__DEFINES/dcs/signals/signals_mood.dm +++ /dev/null @@ -1,7 +0,0 @@ -//Mood -///called when you send a mood event from anywhere in the code. -#define COMSIG_ADD_MOOD_EVENT "add_mood" -///Mood event that only RnD members listen for -#define COMSIG_ADD_MOOD_EVENT_RND "RND_add_mood" -///called when you clear a mood event from anywhere in the code. -#define COMSIG_CLEAR_MOOD_EVENT "clear_mood" diff --git a/code/__DEFINES/dcs/signals/signals_moveloop.dm b/code/__DEFINES/dcs/signals/signals_moveloop.dm index 44cf57c72054..9c9190358ea0 100644 --- a/code/__DEFINES/dcs/signals/signals_moveloop.dm +++ b/code/__DEFINES/dcs/signals/signals_moveloop.dm @@ -1,11 +1,11 @@ -///from [/datum/move_loop/start_loop] (): +///from [/datum/move_loop/loop_started] (): #define COMSIG_MOVELOOP_START "moveloop_start" ///from [/datum/move_loop/stop_loop] (): #define COMSIG_MOVELOOP_STOP "moveloop_stop" ///from [/datum/move_loop/process] (): #define COMSIG_MOVELOOP_PREPROCESS_CHECK "moveloop_preprocess_check" #define MOVELOOP_SKIP_STEP (1<<0) -///from [/datum/move_loop/process] (succeeded, visual_delay): +///from [/datum/move_loop/process] (result, visual_delay): //Result is an enum value. Enums defined in __DEFINES/movement.dm #define COMSIG_MOVELOOP_POSTPROCESS "moveloop_postprocess" //from [/datum/move_loop/has_target/jps/recalculate_path] (): #define COMSIG_MOVELOOP_JPS_REPATH "moveloop_jps_repath" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index 3e949627ae14..2f3258d3f275 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -101,11 +101,11 @@ #define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item" /// A mob has just unequipped an item. #define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item" -///called on [/obj/item] before unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) +///called on [/obj/item] before unequip from base of [mob/proc/tryUnequipItem]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_PRE_UNEQUIP "item_pre_unequip" ///only the pre unequip can be cancelled #define COMPONENT_ITEM_BLOCK_UNEQUIP (1<<0) -///called on [/obj/item] AFTER unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) +///called on [/obj/item] AFTER unequip from base of [mob/proc/tryUnequipItem]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_POST_UNEQUIP "item_post_unequip" ///from base of obj/item/on_grind(): ()) #define COMSIG_ITEM_ON_GRIND "on_grind" @@ -129,7 +129,13 @@ #define COMSIG_ITEM_ATTACK_ZONE "item_attack_zone" ///from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_HIT_REACT "item_hit_react" - #define COMPONENT_HIT_REACTION_BLOCK (1<<0) + +#define COMSIG_ITEM_CHECK_BLOCK "item_check_block" + /// Hit was blocked by the component, continue to hit_reaction + #define COMPONENT_CHECK_BLOCK_BLOCKED (1<<0) + /// Hit was blocked by the component, do not continue into hit_reaction() + #define COMPONENT_CHECK_BLOCK_SKIP_REACTION (1<<1) + ///called on item when microwaved (): (obj/machinery/microwave/M) #define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" #define COMPONENT_SUCCESFUL_MICROWAVE (1<<0) @@ -227,6 +233,10 @@ #define COMSIG_ITEM_SPLIT_PROFIT "item_split_profits" ///called when getting the item's exact ratio for cargo's profit, without selling the item. #define COMSIG_ITEM_SPLIT_PROFIT_DRY "item_split_profits_dry" +///from base of /atom/movable/proc/on_enter_storage(): (datum/storage/storage) +#define COMSIG_ITEM_STORED "item_stored" +///from base of /atom/movable/proc/on_exit_storage(): (datum/storage/storage) +#define COMSIG_ITEM_UNSTORED "item_unstored" // /obj/item/clothing signals @@ -279,25 +289,25 @@ ///called from base of /obj/item/radio/proc/set_frequency(): (list/args) #define COMSIG_RADIO_NEW_FREQUENCY "radio_new_frequency" -///called during SSpacketnets/proc/ImmediateSubspaceVocalSend(): (message, freq_num) +#define COMSIG_RADIO_NEW_MESSAGE "radio_new_message" +///called during SSpacketnets/proc/ImmediateSubspaceVocalSend(): (speaker, message, freq_num, data) #define COMSIG_RADIO_RECEIVE "radio_receive" // /obj/item/pen signals - ///called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user) #define COMSIG_PEN_ROTATED "pen_rotated" // /obj/item/gun signals -///called in /obj/item/gun/fire_gun (user, target, flag, params) +///called in /obj/item/gun/try_fire_gun (user, target, flag, params) #define COMSIG_GUN_TRY_FIRE "gun_try_fire" #define COMPONENT_CANCEL_GUN_FIRE (1<<0) -///called in /obj/item/gun/process_fire (src, target, params, zone_override) +///called in /obj/item/gun/do_fire_gun (src, target, params, zone_override) #define COMSIG_MOB_FIRED_GUN "mob_fired_gun" -///called in /obj/item/gun/process_fire (user, target, params, zone_override) +///called in /obj/item/gun/do_fire_gun (user, target, params, zone_override) #define COMSIG_GUN_FIRED "gun_fired" -///called in /obj/item/gun/process_chamber (src) +///called in /obj/item/gun/update_chamber (src) #define COMSIG_GUN_CHAMBER_PROCESSED "gun_chamber_processed" -///called in /obj/item/gun/ballistic/process_chamber (casing) +///called in /obj/item/gun/ballistic/update_chamber (casing) #define COMSIG_CASING_EJECTED "casing_ejected" // Jetpack things @@ -322,11 +332,11 @@ // /obj/item/grenade signals -///called in /obj/item/gun/process_fire (user, target, params, zone_override) +///called in /obj/item/gun/do_fire_gun (user, target, params, zone_override) #define COMSIG_GRENADE_DETONATE "grenade_prime" //called from many places in grenade code (armed_by, nade, det_time, delayoverride) #define COMSIG_MOB_GRENADE_ARMED "grenade_mob_armed" -///called in /obj/item/gun/process_fire (user, target, params, zone_override) +///called in /obj/item/gun/do_fire_gun (user, target, params, zone_override) #define COMSIG_GRENADE_ARMED "grenade_armed" // /obj/projectile signals (sent to the firer) @@ -380,7 +390,7 @@ #define COMSIG_ITEM_ATTACK_SELF "item_attack_self" //from base of obj/item/attack_self_secondary(): (/mob) #define COMSIG_ITEM_ATTACK_SELF_SECONDARY "item_attack_self_secondary" -///from base of obj/item/attack_atom(): (/obj, /mob) +///from base of obj/item/attack_obj(): (/obj, /mob) #define COMSIG_ITEM_ATTACK_OBJ "item_attack_obj" ///from base of obj/item/pre_attack(): (atom/target, mob/user, params) #define COMSIG_ITEM_PRE_ATTACK "item_pre_attack" diff --git a/code/__DEFINES/dcs/signals/signals_operating_computer.dm b/code/__DEFINES/dcs/signals/signals_operating_computer.dm deleted file mode 100644 index 94f2f52ede2b..000000000000 --- a/code/__DEFINES/dcs/signals/signals_operating_computer.dm +++ /dev/null @@ -1,5 +0,0 @@ -// /obj/machinery/computer/operating signals - -/// Fired when a dissection surgery completes. -/// (mob/living/target) -#define COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE "operating_computer_dissection_complete" diff --git a/code/__DEFINES/dcs/signals/signals_reagent.dm b/code/__DEFINES/dcs/signals/signals_reagent.dm index 00fdddc6c9e7..b0b8c93883de 100644 --- a/code/__DEFINES/dcs/signals/signals_reagent.dm +++ b/code/__DEFINES/dcs/signals/signals_reagent.dm @@ -17,9 +17,6 @@ ///from base of [/datum/reagent/proc/expose_atom]: (/turf, reac_volume) #define COMSIG_REAGENT_EXPOSE_TURF "reagent_expose_turf" -///from base of [/datum/controller/subsystem/materials/proc/InitializeMaterial]: (/datum/material) -#define COMSIG_MATERIALS_INIT_MAT "SSmaterials_init_mat" - ///from base of [/datum/component/multiple_lives/proc/respawn]: (mob/respawned_mob, gibbed, lives_left) #define COMSIG_ON_MULTIPLE_LIVES_RESPAWN "on_multiple_lives_respawn" diff --git a/code/__DEFINES/dcs/signals/signals_storage.dm b/code/__DEFINES/dcs/signals/signals_storage.dm index 456ac3c0781a..602ec54c0873 100644 --- a/code/__DEFINES/dcs/signals/signals_storage.dm +++ b/code/__DEFINES/dcs/signals/signals_storage.dm @@ -2,3 +2,16 @@ #define COMSIG_STORAGE_DUMP_CONTENT "storage_dump_contents" /// Return to stop the standard dump behavior. #define STORAGE_DUMP_HANDLED (1<<0) + +/// Sent after /datum/storage/attempt_insert(): (obj/item/inserted, mob/user, override, force) +#define COMSIG_STORAGE_INSERTED_ITEM "storage_inserted_item" + +/// Sent when /datum/storage/open_storage(): (mob/to_show, performing_quickdraw) +#define COMSIG_STORAGE_ATTEMPT_OPEN "storage_attempt_open" + /// Interrupt the opening. + #define STORAGE_INTERRUPT_OPEN (1<<0) + +/// Sent when /datum/storage/can_insert(): (obj/item/to_insert, mob/user, messages, force) +#define COMSIG_STORAGE_CAN_INSERT "storage_can_insert" + /// Disallow the insertion. + #define STORAGE_NO_INSERT (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_swab.dm b/code/__DEFINES/dcs/signals/signals_swab.dm deleted file mode 100644 index 6a6aefb66d8e..000000000000 --- a/code/__DEFINES/dcs/signals/signals_swab.dm +++ /dev/null @@ -1,3 +0,0 @@ -// /datum/component/swabbing signals -#define COMSIG_SWAB_FOR_SAMPLES "swab_for_samples" ///Called when you try to swab something using the swabable component, includes a mutable list of what has been swabbed so far so it can be modified. - #define COMPONENT_SWAB_FOUND (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_turf.dm b/code/__DEFINES/dcs/signals/signals_turf.dm index 7fa0608c6bc3..190a7952c77e 100644 --- a/code/__DEFINES/dcs/signals/signals_turf.dm +++ b/code/__DEFINES/dcs/signals/signals_turf.dm @@ -8,10 +8,6 @@ #define COMSIG_TURF_CHANGE "turf_change" ///from base of atom/has_gravity(): (atom/asker, list/forced_gravities) #define COMSIG_TURF_HAS_GRAVITY "turf_has_gravity" -///from base of turf/multiz_turf_del(): (turf/source, direction) -#define COMSIG_TURF_MULTIZ_DEL "turf_multiz_del" -///from base of turf/multiz_turf_new: (turf/source, direction) -#define COMSIG_TURF_MULTIZ_NEW "turf_multiz_new" ///from base of turf/proc/onShuttleMove(): (turf/new_turf) #define COMSIG_TURF_ON_SHUTTLE_MOVE "turf_on_shuttle_move" ///from /turf/proc/immediate_calculate_adjacent_turfs() @@ -23,3 +19,11 @@ #define COMSIG_TURF_DECAL_DETACHED "turf_decal_detached" #define COMSIG_TURF_EXPOSE "turf_expose" + +///from /datum/element/footstep/prepare_step(): (list/steps) +#define COMSIG_TURF_PREPARE_STEP_SOUND "turf_prepare_step_sound" + //stops element/footstep/proc/prepare_step() from returning null if the turf itself has no sound + #define FOOTSTEP_OVERRIDEN (1<<0) + +///Called when turf no longer blocks light from passing through +#define COMSIG_TURF_NO_LONGER_BLOCK_LIGHT "turf_no_longer_block_light" diff --git a/code/__DEFINES/dcs/signals/signals_twohand.dm b/code/__DEFINES/dcs/signals/signals_twohand.dm index ffe335954cb3..7285c3db44bd 100644 --- a/code/__DEFINES/dcs/signals/signals_twohand.dm +++ b/code/__DEFINES/dcs/signals/signals_twohand.dm @@ -1,7 +1,7 @@ // /datum/component/two_handed signals ///from base of datum/component/two_handed/proc/wield(mob/living/carbon/user): (/mob/user) -#define COMSIG_TWOHANDED_WIELD "twohanded_wield" - #define COMPONENT_TWOHANDED_BLOCK_WIELD (1<<0) +#define COMSIG_ITEM_WIELD "item_wield" + #define COMPONENT_ITEM_BLOCK_WIELD (1<<0) ///from base of datum/component/two_handed/proc/unwield(mob/living/carbon/user): (/mob/user) -#define COMSIG_TWOHANDED_UNWIELD "twohanded_unwield" +#define COMSIG_ITEM_UNWIELD "item_unwield" diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm index accfd60046df..247d28ea62c0 100644 --- a/code/__DEFINES/dynamic.dm +++ b/code/__DEFINES/dynamic.dm @@ -16,4 +16,10 @@ /// This cycle, a round event was hijacked when the next midround event is too soon. #define HIJACKED_TOO_SOON "HIJACKED_TOO_SOON" -#define IS_DYNAMIC_GAME_MODE (istype(SSticker.mode, /datum/game_mode/dynamic)) +#define GAMEMODE_WAS_DYNAMIC (istype(SSticker.mode, /datum/game_mode/dynamic)) + +#define GAMEMODE_WAS_MALF_AI (istype(SSticker.mode, /datum/game_mode/malf) || (GAMEMODE_WAS_DYNAMIC && locate(/datum/dynamic_ruleset/roundstart/malf_ai) in SSticker.mode:executed_rules)) + +#define GAMEMODE_WAS_REVS (istype(SSticker.mode, /datum/game_mode/revolution) || (GAMEMODE_WAS_DYNAMIC && ((locate(/datum/dynamic_ruleset/roundstart/revs) in SSticker.mode:executed_rules) || locate(/datum/dynamic_ruleset/latejoin/provocateur) in SSticker.mode:executed_rules))) + +#define GAMEMODE_WAS_NUCLEAR_EMERGENCY (istype(SSticker.mode, /datum/game_mode/nuclear_emergency) || (GAMEMODE_WAS_DYNAMIC && ((locate(/datum/dynamic_ruleset/roundstart/nuclear) in SSticker.mode:executed_rules) || (locate(/datum/dynamic_ruleset/midround/from_ghosts/nuclear) in SSticker.mode:executed_rules)))) diff --git a/code/__DEFINES/economy.dm b/code/__DEFINES/economy.dm index d4104cf05d6a..997ff446b85e 100644 --- a/code/__DEFINES/economy.dm +++ b/code/__DEFINES/economy.dm @@ -1,71 +1,40 @@ -/// Number of paychecks jobs start with at the creation of a new bank account for a player (So at shift-start or game join, but not a blank new account.) -#define STARTING_PAYCHECKS 7 /// How much mail the Economy SS will create per minute, regardless of firing time. -#define MAX_MAIL_PER_MINUTE 3 +#define MAX_MAIL_PER_MINUTE 0.05 /// Probability of using letters of envelope sprites on all letters. #define FULL_CRATE_LETTER_ODDS 70 -// -#define PAYCHECK_PRISONER 25 -#define PAYCHECK_ASSISTANT 50 -#define PAYCHECK_MINIMAL 55 -#define PAYCHECK_EASY 60 -#define PAYCHECK_MEDIUM 75 -#define PAYCHECK_HARD 100 -#define PAYCHECK_COMMAND 200 -#define PAYCHECK_ZERO 0 +/// The baseline cost for basically everything in the game +#define PAYCHECK_ASSISTANT 10 -///The amount of money taken from station master and distributed to all departments every 5 minutes. -#define ECON_STATION_PAYOUT 6000 -///The amount of money in a department account where station master will stop filling it up. -#define ECON_STATION_PAYOUT_MAX 5000 +#define PAYCHECK_MINIMAL (PAYCHECK_ASSISTANT * 2) +#define PAYCHECK_EASY (PAYCHECK_ASSISTANT * 2.5) +#define PAYCHECK_MEDIUM (PAYCHECK_ASSISTANT * 4) +#define PAYCHECK_HARD (PAYCHECK_ASSISTANT * 7) +#define PAYCHECK_COMMAND (PAYCHECK_ASSISTANT * 20) -///The minimum amount of money in the station master account required for a departmental payout -#define ECON_STATION_PAYOUT_REQUIREMENT 600 +#define PAYCHECK_ZERO 0 //A multiplier for when you buy from your department. #define VENDING_DISCOUNT 0 -///NOT USED FOR ECONOMY -#define ACCOUNT_CIV "CIV" - - #define ACCOUNT_ENG "ENG" -#define ACCOUNT_ENG_NAME "Engineering Budget" -#define ACCOUNT_SCI "SCI" -#define ACCOUNT_SCI_NAME "Scientific Budget" +#define ACCOUNT_ENG_NAME "Daedalus Industries Funds" #define ACCOUNT_MED "MED" -#define ACCOUNT_MED_NAME "Medical Budget" +#define ACCOUNT_MED_NAME "Aether Pharmaceuticals Funds" #define ACCOUNT_SRV "SRV" -#define ACCOUNT_SRV_NAME "Service Budget" #define ACCOUNT_CAR "CAR" -#define ACCOUNT_CAR_NAME "Cargo Budget" +#define ACCOUNT_CAR_NAME "Hermes Galactic Freight Funds" #define ACCOUNT_SEC "SEC" -#define ACCOUNT_SEC_NAME "Defense Budget" - -/// The number of departmental accounts for the economy. DOES NOT INCLUDE STATION MASTER. -#define ECON_NUM_DEPARTMENT_ACCOUNTS 6 +#define ACCOUNT_SEC_NAME "Mars People's Coalition Budget" #define ACCOUNT_STATION_MASTER "STA" #define ACCOUNT_STATION_MASTER_NAME "Station Budget" -#define NO_FREEBIES "commies go home" +#define ACCOUNT_GOV "GOV" +#define ACCOUNT_GOV_NAME "Special Order Budget" -//Defines that set what kind of civilian bounties should be applied mid-round. -#define CIV_JOB_BASIC 1 -#define CIV_JOB_ROBO 2 -#define CIV_JOB_CHEF 3 -#define CIV_JOB_SEC 4 -#define CIV_JOB_DRINK 5 -#define CIV_JOB_CHEM 6 -#define CIV_JOB_VIRO 7 -#define CIV_JOB_SCI 8 -#define CIV_JOB_ENG 9 -#define CIV_JOB_MINE 10 -#define CIV_JOB_MED 11 -#define CIV_JOB_GROW 12 -#define CIV_JOB_RANDOM 13 +#define NO_FREEBIES "commies go home" //By how much should the station's inflation value be multiplied by when dividing the civilian bounty's reward? #define BOUNTY_MULTIPLIER 10 diff --git a/code/__DEFINES/explosions.dm b/code/__DEFINES/explosions.dm index cd30f89f1b0d..9c1ac30267c7 100644 --- a/code/__DEFINES/explosions.dm +++ b/code/__DEFINES/explosions.dm @@ -23,12 +23,17 @@ /// A wrapper for [/atom/proc/ex_act] to ensure that the explosion propagation and attendant signal are always handled. #define EX_ACT(target, args...)\ - if(!(target.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) { \ + if(length(target.contents) && !(target.flags_1 & PREVENT_CONTENTS_EXPLOSION_1)) { \ target.contents_explosion(##args);\ };\ SEND_SIGNAL(target, COMSIG_ATOM_EX_ACT, ##args);\ target.ex_act(##args); +#define EX_ACT_LIST(target, args...) \ + for(var/atom/movable/AM as anything in target) { \ + EX_ACT(AM, ##args) \ + } + // Internal explosion argument list keys. // Must match the arguments to [/datum/controller/subsystem/explosions/proc/propagate_blastwave] /// The origin atom of the explosion. diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm index 265f86d5f6f7..dbfb23478e89 100644 --- a/code/__DEFINES/external_organs.dm +++ b/code/__DEFINES/external_organs.dm @@ -8,7 +8,3 @@ #define ORGAN_COLOR_STATIC (1<<3) ///Uses the mutcolor list #define ORGAN_COLOR_INHERIT_ALL (1<<4) - -///Tail wagging -#define WAG_ABLE (1<<0) -#define WAG_WAGGING (1<<1) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index f84f53104ecc..7d15e1e08587 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -32,32 +32,35 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define PREVENT_CLICK_UNDER_1 (1<<5) ///specifies that this atom is a hologram that isnt real #define HOLOGRAM_1 (1<<6) -/// Prevents mobs from getting chainshocked by teslas and the supermatter -#define SHOCKED_1 (1<<7) -///Whether /atom/Initialize() has already run for the object -#define INITIALIZED_1 (1<<8) /// was this spawned by an admin? used for stat tracking stuff. -#define ADMIN_SPAWNED_1 (1<<9) +#define ADMIN_SPAWNED_1 (1<<7) /// should not get harmed if this gets caught by an explosion? -#define PREVENT_CONTENTS_EXPLOSION_1 (1<<10) +#define PREVENT_CONTENTS_EXPLOSION_1 (1<<8) /// Should this object be paintable with very dark colors? -#define ALLOW_DARK_PAINTS_1 (1<<11) +#define ALLOW_DARK_PAINTS_1 (1<<9) /// Should this object be unpaintable? -#define UNPAINTABLE_1 (1<<12) +#define UNPAINTABLE_1 (1<<10) /// Is the thing currently spinning? -#define IS_SPINNING_1 (1<<13) -#define IS_ONTOP_1 (1<<14) -#define SUPERMATTER_IGNORES_1 (1<<15) +#define IS_SPINNING_1 (1<<11) +#define IS_ONTOP_1 (1<<12) +#define SUPERMATTER_IGNORES_1 (1<<13) /// If a turf can be made dirty at roundstart. This is also used in areas. -#define CAN_BE_DIRTY_1 (1<<16) +#define CAN_BE_DIRTY_1 (1<<14) /// Should we use the initial icon for display? Mostly used by overlay only objects -#define HTML_USE_INITAL_ICON_1 (1<<17) +#define HTML_USE_INITAL_ICON_1 (1<<15) /// Can players recolor this in-game via vendors (and maybe more if support is added)? -#define IS_PLAYER_COLORABLE_1 (1<<18) +#define IS_PLAYER_COLORABLE_1 (1<<16) /// Whether or not this atom has contextual screentips when hovered OVER -#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<19) +#define HAS_CONTEXTUAL_SCREENTIPS_1 (1<<17) // Whether or not this atom is storing contents for a disassociated storage object -#define HAS_DISASSOCIATED_STORAGE_1 (1<<20) +#define HAS_DISASSOCIATED_STORAGE_1 (1<<18) +// Atom has similar priority to border objects when doing Bump() calculations. +#define BUMP_PRIORITY_1 (1<<19) +/// If this atom has experienced a decal element "init finished" sourced appearance update +/// We use this to ensure stacked decals don't double up appearance updates for no rasin +/// Flag as an optimization, don't make this a trait without profiling +/// Yes I know this is a stupid flag, no you can't take him from me ~LemonInTheDark +#define DECAL_INIT_UPDATE_EXPERIENCED_1 (1<<20) //OH YEAH BABY FLAGS_2 HERE WE GO ///Plasma Contamination @@ -110,28 +113,26 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #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) /// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter) -#define NOTELEPORT (1<<6) +#define NOTELEPORT (1<<5) /// Hides area from player Teleport function. -#define HIDDEN_AREA (1<<7) +#define HIDDEN_AREA (1<<6) /// If false, loading multiple maps with this area type will create multiple instances. -#define UNIQUE_AREA (1<<8) +#define UNIQUE_AREA (1<<7) /// If people are allowed to suicide in it. Mostly for OOC stuff like minigames -#define BLOCK_SUICIDE (1<<9) +#define BLOCK_SUICIDE (1<<8) /// Can the Xenobio management console transverse this area by default? -#define XENOBIOLOGY_COMPATIBLE (1<<10) +#define XENOBIOLOGY_COMPATIBLE (1<<9) /// If Abductors are unable to teleport in with their observation console -#define ABDUCTOR_PROOF (1<<11) +#define ABDUCTOR_PROOF (1<<10) /// If an area should be hidden from power consoles, power/atmosphere alerts, etc. -#define NO_ALERTS (1<<12) +#define NO_ALERTS (1<<11) /// If blood cultists can draw runes or build structures on this AREA. -#define CULT_PERMITTED (1<<13) +#define CULT_PERMITTED (1<<12) ///Whther this area is iluminated by starlight -#define AREA_USES_STARLIGHT (1<<14) +#define AREA_USES_STARLIGHT (1<<13) /// If engravings are persistent in this area -#define PERSISTENT_ENGRAVINGS (1<<15) +#define PERSISTENT_ENGRAVINGS (1<<14) /* 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) diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 9980ccf90e42..a021f39f406f 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -18,14 +18,26 @@ #define FOOTSTEP_GENERIC_HEAVY "heavy" //footstep mob defines -#define FOOTSTEP_MOB_CLAW 1 -#define FOOTSTEP_MOB_BAREFOOT 2 -#define FOOTSTEP_MOB_HEAVY 3 -#define FOOTSTEP_MOB_SHOE 4 -#define FOOTSTEP_MOB_HUMAN 5 //Warning: Only works on /mob/living/carbon/human -#define FOOTSTEP_MOB_SLIME 6 -#define FOOTSTEP_OBJ_MACHINE 7 -#define FOOTSTEP_OBJ_ROBOT 8 +#define FOOTSTEP_MOB_CLAW "footstep_claw" +#define FOOTSTEP_MOB_BAREFOOT "footstep_barefoot" +#define FOOTSTEP_MOB_HEAVY "footstep_heavy" +#define FOOTSTEP_MOB_SHOE "footstep_shoe" +#define FOOTSTEP_MOB_HUMAN "footstep_human" //Warning: Only works on /mob/living/carbon/human +#define FOOTSTEP_MOB_SLIME "footstep_slime" +#define FOOTSTEP_OBJ_MACHINE "footstep_machine" +#define FOOTSTEP_OBJ_ROBOT "footstep_robot" + +#define STEP_IDX_SOUNDS 1 +#define STEP_IDX_VOL 2 +#define STEP_IDX_RANGE 3 + +//priority defines for the footstep_override element +#define STEP_SOUND_NO_PRIORITY 0 +#define STEP_SOUND_CONVEYOR_PRIORITY 1 +#define STEP_SOUND_TABLE_PRIORITY 2 + +///the name of the index key for priority +#define STEP_SOUND_PRIORITY "step_sound_priority" /* @@ -43,32 +55,28 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/wood1.ogg', 'sound/effects/footstep/wood2.ogg', 'sound/effects/footstep/wood3.ogg', - 'sound/effects/footstep/wood4.ogg', - 'sound/effects/footstep/wood5.ogg'), 100, 0), + 'sound/effects/footstep/wood4.ogg'), 80, 0), FOOTSTEP_FLOOR = list(list( - 'goon/sounds/footstep/floor1.ogg', - 'goon/sounds/footstep/floor2.ogg', - 'goon/sounds/footstep/floor3.ogg', - 'goon/sounds/footstep/floor4.ogg', - 'goon/sounds/footstep/floor5.ogg'), 75, -1), + 'sound/effects/footstep/floor1.ogg', + 'sound/effects/footstep/floor2.ogg', + 'sound/effects/footstep/floor3.ogg', + 'sound/effects/footstep/floor4.ogg', + 'goon/sounds/footstep/floor5.ogg'), 50, -1), FOOTSTEP_PLATING = list(list( 'sound/effects/footstep/plating1.ogg', 'sound/effects/footstep/plating2.ogg', 'sound/effects/footstep/plating3.ogg', - 'sound/effects/footstep/plating4.ogg', - 'sound/effects/footstep/plating5.ogg'), 100, 1), + 'sound/effects/footstep/plating4.ogg'), 70, 1), FOOTSTEP_CARPET = list(list( 'sound/effects/footstep/carpet1.ogg', 'sound/effects/footstep/carpet2.ogg', 'sound/effects/footstep/carpet3.ogg', - 'sound/effects/footstep/carpet4.ogg', - 'sound/effects/footstep/carpet5.ogg'), 75, -1), + 'sound/effects/footstep/carpet4.ogg'), 75, -1), FOOTSTEP_SAND = list(list( 'sound/effects/footstep/asteroid1.ogg', 'sound/effects/footstep/asteroid2.ogg', 'sound/effects/footstep/asteroid3.ogg', - 'sound/effects/footstep/asteroid4.ogg', - 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + 'sound/effects/footstep/asteroid4.ogg'), 75, 0), FOOTSTEP_GRASS = list(list( 'sound/effects/footstep/grass1.ogg', 'sound/effects/footstep/grass2.ogg', @@ -89,8 +97,7 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/catwalk1.ogg', 'sound/effects/footstep/catwalk2.ogg', 'sound/effects/footstep/catwalk3.ogg', - 'sound/effects/footstep/catwalk4.ogg', - 'sound/effects/footstep/catwalk5.ogg'), 100, 1), + 'sound/effects/footstep/catwalk4.ogg'), 100, 1), )) //bare footsteps lists GLOBAL_LIST_INIT(barefootstep, list( @@ -98,14 +105,12 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/woodbarefoot1.ogg', 'sound/effects/footstep/woodbarefoot2.ogg', 'sound/effects/footstep/woodbarefoot3.ogg', - 'sound/effects/footstep/woodbarefoot4.ogg', - 'sound/effects/footstep/woodbarefoot5.ogg'), 80, -1), + 'sound/effects/footstep/woodbarefoot4.ogg'), 20, -1), FOOTSTEP_HARD_BAREFOOT = list(list( 'sound/effects/footstep/hardbarefoot1.ogg', 'sound/effects/footstep/hardbarefoot2.ogg', 'sound/effects/footstep/hardbarefoot3.ogg', - 'sound/effects/footstep/hardbarefoot4.ogg', - 'sound/effects/footstep/hardbarefoot5.ogg'), 80, -1), + 'sound/effects/footstep/hardbarefoot4.ogg'), 20, -1), FOOTSTEP_CARPET_BAREFOOT = list(list( 'sound/effects/footstep/carpetbarefoot1.ogg', 'sound/effects/footstep/carpetbarefoot2.ogg', @@ -116,8 +121,7 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/asteroid1.ogg', 'sound/effects/footstep/asteroid2.ogg', 'sound/effects/footstep/asteroid3.ogg', - 'sound/effects/footstep/asteroid4.ogg', - 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + 'sound/effects/footstep/asteroid4.ogg'), 75, 0), FOOTSTEP_GRASS = list(list( 'sound/effects/footstep/grass1.ogg', 'sound/effects/footstep/grass2.ogg', @@ -134,6 +138,11 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_CATWALK = list(list( + 'sound/effects/footstep/catwalk1.ogg', + 'sound/effects/footstep/catwalk2.ogg', + 'sound/effects/footstep/catwalk3.ogg', + 'sound/effects/footstep/catwalk4.ogg'), 30, 1), )) //claw footsteps lists @@ -160,8 +169,7 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/asteroid1.ogg', 'sound/effects/footstep/asteroid2.ogg', 'sound/effects/footstep/asteroid3.ogg', - 'sound/effects/footstep/asteroid4.ogg', - 'sound/effects/footstep/asteroid5.ogg'), 75, 0), + 'sound/effects/footstep/asteroid4.ogg'), 75, 0), FOOTSTEP_GRASS = list(list( 'sound/effects/footstep/grass1.ogg', 'sound/effects/footstep/grass2.ogg', @@ -178,6 +186,11 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_CATWALK = list(list( + 'sound/effects/footstep/catwalk1.ogg', + 'sound/effects/footstep/catwalk2.ogg', + 'sound/effects/footstep/catwalk3.ogg', + 'sound/effects/footstep/catwalk4.ogg'), 60, 1), )) //heavy footsteps list @@ -196,5 +209,10 @@ GLOBAL_LIST_INIT(heavyfootstep, list( 'sound/effects/footstep/lava3.ogg'), 100, 0), FOOTSTEP_MEAT = list(list( 'sound/effects/meatslap.ogg'), 100, 0), + FOOTSTEP_CATWALK = list(list( + 'sound/effects/footstep/catwalk1.ogg', + 'sound/effects/footstep/catwalk2.ogg', + 'sound/effects/footstep/catwalk3.ogg', + 'sound/effects/footstep/catwalk4.ogg'), 100, 1), )) diff --git a/code/__DEFINES/forensics.dm b/code/__DEFINES/forensics.dm new file mode 100644 index 000000000000..cc2145585c11 --- /dev/null +++ b/code/__DEFINES/forensics.dm @@ -0,0 +1,4 @@ +#define SAMPLE_BLOOD_DNA "blood" +#define SAMPLE_FIBERS "fibers" +#define SAMPLE_RESIDUE "gunshot residue" +#define SAMPLE_TRACE_DNA "dna" diff --git a/code/__DEFINES/gamemodes.dm b/code/__DEFINES/gamemodes.dm new file mode 100644 index 000000000000..faf8df81081a --- /dev/null +++ b/code/__DEFINES/gamemodes.dm @@ -0,0 +1,8 @@ +//Gamemode weights +#define GAMEMODE_WEIGHT_NEVER 0 + +#define GAMEMODE_WEIGHT_LEGENDARY 10 +#define GAMEMODE_WEIGHT_EPIC 30 +#define GAMEMODE_WEIGHT_RARE 50 +#define GAMEMODE_WEIGHT_UNCOMMON 70 +#define GAMEMODE_WEIGHT_COMMON 100 diff --git a/code/__DEFINES/generators.dm b/code/__DEFINES/generators.dm new file mode 100644 index 000000000000..e9d373c9a65d --- /dev/null +++ b/code/__DEFINES/generators.dm @@ -0,0 +1,15 @@ +//generator types +#define GEN_NUM "num" +#define GEN_VECTOR "vector" +#define GEN_BOX "box" +#define GEN_COLOR "color" +#define GEN_CIRCLE "circle" +#define GEN_SPHERE "sphere" +#define GEN_SQUARE "square" +#define GEN_CUBE "cube" + +///particle editor var modifiers +#define P_DATA_GENERATOR "generator" +#define P_DATA_ICON_ADD "icon_add" +#define P_DATA_ICON_REMOVE "icon_remove" +#define P_DATA_ICON_WEIGHT "icon_edit" diff --git a/code/__DEFINES/grab_defines.dm b/code/__DEFINES/grab_defines.dm new file mode 100644 index 000000000000..1b3437a83073 --- /dev/null +++ b/code/__DEFINES/grab_defines.dm @@ -0,0 +1,9 @@ +// Trait sources for grabs +#define AGGRESSIVE_GRAB "source_aggressive_grab" +#define NECK_GRAB "source_neck_grab" +#define KILL_GRAB "source_kill_grab" + +/// Applied to movables that are aggressively grabbed OR HIGHER +#define TRAIT_AGGRESSIVE_GRAB "trait_aggressive_grab" +/// Applied to movables that are being strangled +#define TRAIT_KILL_GRAB "trait_strangle_grab" diff --git a/code/__DEFINES/gradient.dm b/code/__DEFINES/gradient.dm new file mode 100644 index 000000000000..573a339880b9 --- /dev/null +++ b/code/__DEFINES/gradient.dm @@ -0,0 +1,4 @@ +// spacemandmm doesn't really implement gradient() right, so let's just handle that here yeah? +#define rgb_gradient(index, args...) UNLINT(gradient(args, index)) +#define hsl_gradient(index, args...) UNLINT(gradient(args, space = COLORSPACE_HSL, index)) +#define hsv_gradient(index, args...) UNLINT(gradient(args, space = COLORSPACE_HSV, index)) diff --git a/code/__DEFINES/holomap.dm b/code/__DEFINES/holomap.dm new file mode 100644 index 000000000000..3068215d415d --- /dev/null +++ b/code/__DEFINES/holomap.dm @@ -0,0 +1,15 @@ +#define HOLOMAP_AREACOLOR_COMMAND "#00006dcc" +#define HOLOMAP_AREACOLOR_SECURITY "#ae1212cc" +#define HOLOMAP_AREACOLOR_MEDICAL "#638fc2cc" +#define HOLOMAP_AREACOLOR_GENERIC_ROOM "#358030cc" +#define HOLOMAP_AREACOLOR_ENGINEERING "#F1C231cc" +#define HOLOMAP_AREACOLOR_CARGO "#E06F0099" +#define HOLOMAP_AREACOLOR_HALLWAYS "#8f8f8fcc" +#define HOLOMAP_AREACOLOR_SCIENCE "#A154A6cc" +#define HOLOMAP_AREACOLOR_MAINTENANCE "#363636cc" + +#define HOLOMAP_COLOR_EXTERNAL_AIRLOCK "#ff8080cc" +#define HOLOMAP_COLOR_WALL "#ffffffcc" + +/// Dimensions of the holomap. This is NOT MEANT TO BE CHANGED, its just for readability. +#define HOLOMAP_SIZE 480 diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index c37282618915..447ef1cc165a 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -93,12 +93,11 @@ #define ui_palette_scroll_offset(north_offset) ("WEST+1:8,NORTH-[6+north_offset]:28") //Middle right (status indicators) -#define ui_healthdoll "EAST-1:28,CENTER-2:17" +#define ui_healthdoll "EAST-1:28,CENTER-1:19" #define ui_health "EAST-1:28,CENTER-1:19" -#define ui_internal "EAST-1:28,CENTER+1:21" -#define ui_mood "EAST-1:28,CENTER:21" -#define ui_spacesuit "EAST-1:28,CENTER-4:14" -#define ui_stamina "EAST-1:28,CENTER-3:14" +#define ui_blob_health "EAST-1:28,CENTER+1:21" +#define ui_spacesuit "EAST-1:28,CENTER-3:14" +#define ui_stamina "EAST-1:28,CENTER-2:17" //Pop-up inventory #define ui_shoes "WEST+1:8,SOUTH:5" @@ -204,6 +203,12 @@ //Families #define ui_wanted_lvl "NORTH,11" +//Gun buttons +#define ui_gun1 "EAST-2:26,SOUTH+2:7" +#define ui_gun2 "EAST-1:28, SOUTH+3:7" +#define ui_gun3 "EAST-2:26,SOUTH+3:7" +#define ui_gun_select "EAST-1:28,SOUTH+2:7" + // Defines relating to action button positions /// Whatever the base action datum thinks is best diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 59cae05e802b..830438639634 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -23,7 +23,7 @@ DEFINE_BITFIELD(smoothing_flags, list( #define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) {SSicon_smooth.add_to_queue(thing_to_queue)} -#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/neighbor in orange(1, thing_to_queue)) {var/atom/atom_neighbor = neighbor; QUEUE_SMOOTH(atom_neighbor)} +#define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/atom/neighbor as anything in orange(1, thing_to_queue)) {QUEUE_SMOOTH(neighbor)} /**SMOOTHING GROUPS @@ -32,7 +32,8 @@ DEFINE_BITFIELD(smoothing_flags, list( * * Matched with the `list/canSmoothWith` variable to check whether smoothing is possible or not. */ -#define S_TURF(num) ((24 * 0) + num) //Not any different from the number itself, but kept this way in case someone wants to expand it by adding stuff before it. +#define S_TURF(num) (#num + ",") + /* /turf only */ #define SMOOTH_GROUP_TURF_OPEN S_TURF(0) ///turf/open @@ -93,22 +94,21 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_BAMBOO_FLOOR S_TURF(52) //![/turf/open/floor/bamboo] #define SMOOTH_GROUP_CLOSED_TURFS S_TURF(53) ///turf/closed -#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(53) ///turf/closed/wall/mineral/titanium/survival -#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(54) ///turf/closed/indestructible/hotelwall -#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(55) ///turf/closed/mineral, /turf/closed/indestructible -#define SMOOTH_GROUP_BOSS_WALLS S_TURF(56) ///turf/closed/indestructible/riveted/boss - -#define MAX_S_TURF SMOOTH_GROUP_BOSS_WALLS //Always match this value with the one above it. +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS S_TURF(54) ///turf/closed/wall/mineral/titanium/survival +#define SMOOTH_GROUP_HOTEL_WALLS S_TURF(55) ///turf/closed/indestructible/hotelwall +#define SMOOTH_GROUP_MINERAL_WALLS S_TURF(56) ///turf/closed/mineral, /turf/closed/indestructible +#define SMOOTH_GROUP_BOSS_WALLS S_TURF(57) ///turf/closed/indestructible/riveted/boss +#define MAX_S_TURF 56 //Always match this value with the one above it. -#define S_OBJ(num) (MAX_S_TURF + 1 + num) +#define S_OBJ(num) ("-" + #num + ",") /* /obj included */ -#define SMOOTH_GROUP_WALLS S_OBJ(0) ///turf/closed/wall, /obj/structure/falsewall -#define SMOOTH_GROUP_HIERO_WALL S_OBJ(1) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall -#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(2) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod +#define SMOOTH_GROUP_WALLS S_OBJ(1) ///turf/closed/wall, /obj/structure/falsewall +#define SMOOTH_GROUP_HIERO_WALL S_OBJ(2) ///obj/effect/temp_visual/elite_tumor_wall, /obj/effect/temp_visual/hierophant/wall +#define SMOOTH_GROUP_SURVIVAL_TITANIUM_POD S_OBJ(3) ///turf/closed/wall/mineral/titanium/survival/pod, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/reinforced/shuttle/survival_pod -#define SMOOTH_GROUP_PAPERFRAME S_OBJ(20) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe +#define SMOOTH_GROUP_PAPERFRAME S_OBJ(4) ///obj/structure/window/paperframe, /obj/structure/mineral_door/paperframe #define SMOOTH_GROUP_WINDOW_FULLTILE S_OBJ(21) ///turf/closed/indestructible/fakeglass, /obj/structure/window/fulltile, /obj/structure/window/reinforced/fulltile, /obj/structure/window/reinforced/tinted/fulltile, /obj/structure/window/plasma/fulltile, /obj/structure/window/reinforced/plasma/fulltile #define SMOOTH_GROUP_WINDOW_FULLTILE_BRONZE S_OBJ(22) ///obj/structure/window/bronze/fulltile @@ -148,4 +148,30 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SMOOTH_GROUP_GAS_TANK S_OBJ(71) -#define MAX_S_OBJ SMOOTH_GROUP_GAS_TANK //Always match this value with the one above it. +/// Performs the work to set smoothing_groups and canSmoothWith. +/// An inlined function used in both turf/Initialize and atom/Initialize. +#define SETUP_SMOOTHING(...) \ + if (istext(smoothing_groups)) { \ + SET_SMOOTHING_GROUPS(smoothing_groups); \ + } \ +\ + if (istext(canSmoothWith)) { \ + /* S_OBJ is always negative, and we are guaranteed to be sorted. */ \ + if (canSmoothWith[1] == "-") { \ + smoothing_flags |= SMOOTH_OBJ; \ + } \ + SET_SMOOTHING_GROUPS(canSmoothWith); \ + } + +/// Given a smoothing groups variable, will set out to the actual numbers inside it +#define UNWRAP_SMOOTHING_GROUPS(smoothing_groups, out) \ + json_decode("\[[##smoothing_groups]0\]"); \ + ##out.len--; + +#define ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_group_variable) \ + do { \ + if(smoothing_group_variable) { \ + var/list/unwrapped = UNWRAP_SMOOTHING_GROUPS(smoothing_group_variable, unwrapped); \ + assert_sorted(unwrapped, "[#smoothing_group_variable] ([type])"); \ + } \ + } while(FALSE) diff --git a/code/__DEFINES/input.dm b/code/__DEFINES/input.dm new file mode 100644 index 000000000000..7ec645990d78 --- /dev/null +++ b/code/__DEFINES/input.dm @@ -0,0 +1,2 @@ +///if the running average click latency is above this amount then clicks will never queue and will execute immediately +#define MAXIMUM_CLICK_LATENCY (0.5 DECISECONDS) diff --git a/code/__DEFINES/interactable.dm b/code/__DEFINES/interactable.dm new file mode 100644 index 000000000000..8aeca6e67286 --- /dev/null +++ b/code/__DEFINES/interactable.dm @@ -0,0 +1,9 @@ +/// A "helper" for defining all of the needed things for mouse pointers to recognize an object is interactable +#define DEFINE_INTERACTABLE(TYPE) \ + ##TYPE/is_mouseover_interactable = TRUE; \ + ##TYPE/MouseExited(location, control, params) { \ + . = ..(); \ + usr.update_mouse_pointer(); \ + } \ + +#define MOUSE_ICON_HOVERING_INTERACTABLE 'icons/effects/mouse_pointers/interact.dmi' diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 2bf6217b7958..5f75afaaf4c7 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -1,7 +1,7 @@ /*ALL DEFINES RELATED TO INVENTORY OBJECTS, MANAGEMENT, ETC, GO HERE*/ //ITEM INVENTORY WEIGHT, FOR w_class -/// Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins/holochips) +/// Usually items smaller then a human hand, (e.g. playing cards, lighter, scalpel, coins) #define WEIGHT_CLASS_TINY 1 /// Pockets can hold small and tiny items, (e.g. flashlight, multitool, grenades, GPS device) #define WEIGHT_CLASS_SMALL 2 @@ -87,6 +87,9 @@ ///hides mutant/moth wings, does not apply to functional wings #define HIDEMUTWINGS (1<<13) +/// Every flag that hides a bodypart or organ. +#define BODYPART_HIDE_FLAGS (HIDESNOUT | HIDEMUTWINGS | HIDEHAIR | HIDEFACIALHAIR | HIDEEYES | HIDEJUMPSUIT) + //bitflags for clothing coverage - also used for limbs #define CHEST (1<<0) #define HEAD (1<<1) @@ -167,7 +170,6 @@ GLOBAL_LIST_INIT(detective_vest_allowed, typecacheof(list( /obj/item/ammo_box, /obj/item/ammo_casing, - /obj/item/detective_scanner, /obj/item/flashlight, /obj/item/gun/ballistic, /obj/item/gun/energy, @@ -179,9 +181,9 @@ GLOBAL_LIST_INIT(detective_vest_allowed, typecacheof(list( /obj/item/taperecorder, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/storage/belt/holster/detective, - /obj/item/storage/belt/holster/nukie, - /obj/item/storage/belt/holster/thermal, + /obj/item/storage/belt/holster/shoulder, + /obj/item/storage/belt/holster/shoulder/nukie, + /obj/item/storage/belt/holster/shoulder/thermal, ))) GLOBAL_LIST_INIT(security_vest_allowed, typecacheof(list( @@ -196,9 +198,9 @@ GLOBAL_LIST_INIT(security_vest_allowed, typecacheof(list( /obj/item/restraints/handcuffs, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, - /obj/item/storage/belt/holster/detective, - /obj/item/storage/belt/holster/nukie, - /obj/item/storage/belt/holster/thermal, + /obj/item/storage/belt/holster/shoulder, + /obj/item/storage/belt/holster/shoulder/nukie, + /obj/item/storage/belt/holster/shoulder/thermal, ))) GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( @@ -209,9 +211,9 @@ GLOBAL_LIST_INIT(security_wintercoat_allowed, typecacheof(list( /obj/item/melee/baton, /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, - /obj/item/storage/belt/holster/detective, - /obj/item/storage/belt/holster/nukie, - /obj/item/storage/belt/holster/thermal, + /obj/item/storage/belt/holster/shoulder, + /obj/item/storage/belt/holster/shoulder/nukie, + /obj/item/storage/belt/holster/shoulder/thermal, ))) /// String for items placed into the left pocket. diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 4caa74839ac6..ceb211da6e41 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -11,6 +11,17 @@ #define isweakref(D) (istype(D, /datum/weakref)) +#define isimage(thing) (istype(thing, /image)) + +GLOBAL_VAR_INIT(magic_appearance_detecting_image, new /image) // appearances are awful to detect safely, but this seems to be the best way ~ninjanomnom +#define isappearance(thing) (!isimage(thing) && !ispath(thing) && istype(GLOB.magic_appearance_detecting_image, thing)) + +// The filters list has the same ref type id as a filter, but isnt one and also isnt a list, so we have to check if the thing has Cut() instead +GLOBAL_VAR_INIT(refid_filter, TYPEID(filter(type="angular_blur"))) +#define isfilter(thing) (!hascall(thing, "Cut") && TYPEID(thing) == GLOB.refid_filter) + +#define isgenerator(A) (istype(A, /generator)) + //Turfs //#define isturf(A) (istype(A, /turf)) This is actually a byond built-in. Added here for completeness sake. @@ -25,12 +36,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define isgroundlessturf(A) (is_type_in_typecache(A, GLOB.turfs_without_ground)) -GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( - /turf/open/openspace, - /turf/open/space/openspace - ))) - -#define isopenspaceturf(A) (is_type_in_typecache(A, GLOB.turfs_openspace)) +#define isopenspaceturf(A) (istype(A, /turf/open/openspace) || istype(A, /turf/open/space/openspace)) #define isopenturf(A) (istype(A, /turf/open)) @@ -38,6 +44,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isspaceturf(A) (istype(A, /turf/open/space)) +#define islevelbaseturf(A) istype(A, SSmapping.level_trait(A.z, ZTRAIT_BASETURF) || /turf/open/space) + #define isfloorturf(A) (istype(A, /turf/open/floor)) #define isclosedturf(A) (istype(A, /turf/closed)) @@ -70,7 +78,6 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( //Human sub-species #define isabductor(A) (is_species(A, /datum/species/abductor)) -#define isgolem(A) (is_species(A, /datum/species/golem)) #define islizard(A) (is_species(A, /datum/species/lizard)) #define isplasmaman(A) (is_species(A, /datum/species/plasmaman)) #define isvox(A) (is_species(A, /datum/species/vox)) @@ -82,14 +89,13 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #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)) -#define isfelinid(A) (is_species(A, /datum/species/human/felinid)) #define isethereal(A) (is_species(A, /datum/species/ethereal)) #define isvampire(A) (is_species(A,/datum/species/vampire)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) #define ismonkey(A) (is_species(A, /datum/species/monkey)) #define isandroid(A) (is_species(A, /datum/species/android)) -#define isskrell(A) (is_species(A, /datum/species/skrell)) #define isteshari(A) (is_species(A, /datum/species/teshari)) +#define isipc(A) (is_species(A, /datum/species/ipc)) //More carbon mobs #define isalien(A) (istype(A, /mob/living/carbon/alien)) @@ -217,7 +223,7 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define ismobholder(A) (istype(A, /obj/item/mob_holder)) -#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash) || istype(A, /obj/item/holochip)) +#define iscash(A) (istype(A, /obj/item/coin) || istype(A, /obj/item/stack/spacecash)) #define isbodypart(A) (istype(A, /obj/item/bodypart)) @@ -231,6 +237,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isfalsewall(A) (istype(A, /obj/structure/falsewall)) +#define isgrab(A) (istype(A, /obj/item/hand_item/grab)) + //Assemblies #define isassembly(O) (istype(O, /obj/item/assembly)) @@ -278,3 +286,4 @@ GLOBAL_LIST_INIT(book_types, typecacheof(list( #define is_security_officer_job(job_type) (istype(job_type, /datum/job/security_officer)) #define is_research_director_job(job_type) (istype(job_type, /datum/job/research_director)) #define is_unassigned_job(job_type) (istype(job_type, /datum/job/unassigned)) + diff --git a/code/__DEFINES/jobs.dm b/code/__DEFINES/jobs.dm index e5c32f414aa8..2e28c5c461f9 100644 --- a/code/__DEFINES/jobs.dm +++ b/code/__DEFINES/jobs.dm @@ -28,51 +28,46 @@ */ //No department -#define JOB_ASSISTANT "Assistant" +#define JOB_ASSISTANT "Civilian" #define JOB_PRISONER "Prisoner" //Command -#define JOB_CAPTAIN "Captain" -#define JOB_HEAD_OF_PERSONNEL "Head of Personnel" -#define JOB_HEAD_OF_SECURITY "Head of Security" -#define JOB_RESEARCH_DIRECTOR "Research Director" -#define JOB_CHIEF_ENGINEER "Chief Engineer" -#define JOB_CHIEF_MEDICAL_OFFICER "Medical Director" +#define JOB_CAPTAIN "Superintendent" +#define JOB_HEAD_OF_PERSONNEL "Delegate" +#define JOB_SECURITY_CONSULTANT "Security Consultant" //Silicon #define JOB_AI "AI" #define JOB_CYBORG "Cyborg" #define JOB_PERSONAL_AI "Personal AI" //Security -#define JOB_WARDEN "Warden" -#define JOB_DETECTIVE "Detective" +#define JOB_SECURITY_MARSHAL "Security Marshal" +#define JOB_WARDEN "Brig Lieutenant" +#define JOB_DETECTIVE "Private Investigator" #define JOB_SECURITY_OFFICER "Security Officer" #define JOB_SECURITY_OFFICER_MEDICAL "Security Officer (Medical)" #define JOB_SECURITY_OFFICER_ENGINEERING "Security Officer (Engineering)" #define JOB_SECURITY_OFFICER_SCIENCE "Security Officer (Science)" #define JOB_SECURITY_OFFICER_SUPPLY "Security Officer (Cargo)" //Engineering +#define JOB_CHIEF_ENGINEER "Chief Engineer" #define JOB_STATION_ENGINEER "Station Engineer" #define JOB_ATMOSPHERIC_TECHNICIAN "Atmospheric Technician" //Medical -#define JOB_MEDICAL_DOCTOR "Medical Doctor" +#define JOB_MEDICAL_DIRECTOR "Medical Director" +#define JOB_MEDICAL_DOCTOR "General Practitioner" #define JOB_PARAMEDIC "Paramedic" #define JOB_CHEMIST "Chemist" #define JOB_VIROLOGIST "Virologist" -//Science -#define JOB_SCIENTIST "Scientist" -#define JOB_ROBOTICIST "Roboticist" -#define JOB_GENETICIST "Geneticist" //Supply #define JOB_QUARTERMASTER "Quartermaster" -#define JOB_CARGO_TECHNICIAN "Cargo Technician" -#define JOB_SHAFT_MINER "Shaft Miner" +#define JOB_DECKHAND "Deckhand" +#define JOB_PROSPECTOR "Prospector" //Service #define JOB_BARTENDER "Bartender" #define JOB_BOTANIST "Botanist" #define JOB_COOK "Cook" #define JOB_JANITOR "Janitor" #define JOB_CLOWN "Clown" -#define JOB_MIME "Mime" -#define JOB_CURATOR "Curator" +#define JOB_ARCHIVIST "Archivist" #define JOB_LAWYER "Lawyer" #define JOB_CHAPLAIN "Chaplain" #define JOB_PSYCHOLOGIST "Psychologist" @@ -102,25 +97,27 @@ #define DEPARTMENT_UNASSIGNED "No department assigned" #define DEPARTMENT_BITFLAG_SECURITY (1<<0) -#define DEPARTMENT_SECURITY "Security" -#define DEPARTMENT_BITFLAG_COMMAND (1<<1) -#define DEPARTMENT_COMMAND "Command" +#define DEPARTMENT_SECURITY "Mars Private Security" +#define DEPARTMENT_BITFLAG_MANAGEMENT (1<<1) +#define DEPARTMENT_MANAGEMENT "Management" #define DEPARTMENT_BITFLAG_SERVICE (1<<2) -#define DEPARTMENT_SERVICE "Service" +#define DEPARTMENT_SERVICE "Independant" #define DEPARTMENT_BITFLAG_CARGO (1<<3) -#define DEPARTMENT_CARGO "Cargo" +#define DEPARTMENT_CARGO "Hermes Galactic Freight" #define DEPARTMENT_BITFLAG_ENGINEERING (1<<4) -#define DEPARTMENT_ENGINEERING "Engineering" +#define DEPARTMENT_ENGINEERING "Daedalus Industries" #define DEPARTMENT_BITFLAG_SCIENCE (1<<5) #define DEPARTMENT_SCIENCE "Science" #define DEPARTMENT_BITFLAG_MEDICAL (1<<6) -#define DEPARTMENT_MEDICAL "Medical" +#define DEPARTMENT_MEDICAL "Aether Pharmaceuticals" #define DEPARTMENT_BITFLAG_SILICON (1<<7) #define DEPARTMENT_SILICON "Silicon" #define DEPARTMENT_BITFLAG_ASSISTANT (1<<8) -#define DEPARTMENT_ASSISTANT "Assistant" +#define DEPARTMENT_ASSISTANT "Civilian" #define DEPARTMENT_BITFLAG_CAPTAIN (1<<9) #define DEPARTMENT_CAPTAIN "Captain" +#define DEPARTMENT_BITFLAG_COMPANY_LEADER (1<<10) +#define DEPARTMENT_COMPANY_LEADER "Company Leader" /* Job datum job_flags */ /// Whether the mob is announced on arrival. @@ -133,15 +130,12 @@ #define JOB_CREW_MEMBER (1<<3) /// Whether this job can be joined through the new_player menu. #define JOB_NEW_PLAYER_JOINABLE (1<<4) -/// Whether this job appears in bold in the job menu. -#define JOB_BOLD_SELECT_TEXT (1<<5) /// Reopens this position if we lose the player at roundstart. -#define JOB_REOPEN_ON_ROUNDSTART_LOSS (1<<6) +#define JOB_REOPEN_ON_ROUNDSTART_LOSS (1<<5) /// If the player with this job can have quirks assigned to him or not. Relevant for new player joinable jobs and roundstart antags. -#define JOB_ASSIGN_QUIRKS (1<<7) +#define JOB_ASSIGN_QUIRKS (1<<6) /// Whether this job can be an intern. -#define JOB_CAN_BE_INTERN (1<<8) - +#define JOB_CAN_BE_INTERN (1<<7) #define FACTION_NONE "None" #define FACTION_STATION "Station" diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 94fe3136a4e5..481b1fe50681 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -40,6 +40,7 @@ #define COMSIG_KB_HUMAN_QUICKEQUIPBELT_DOWN "keybinding_human_quickequipbelt_down" #define COMSIG_KB_HUMAN_BAGEQUIP_DOWN "keybinding_human_bagequip_down" #define COMSIG_KB_HUMAN_SUITEQUIP_DOWN "keybinding_human_suitequip_down" +#define COMSIG_KB_HUMAN_WIELD_DOWN "keybinding_human_wield_item_down" //Living #define COMSIG_KB_LIVING_RESIST_DOWN "keybinding_living_resist_down" diff --git a/code/__DEFINES/lag_switch.dm b/code/__DEFINES/lag_switch.dm index 2115ce4a5dd4..f10ac4cd53f0 100644 --- a/code/__DEFINES/lag_switch.dm +++ b/code/__DEFINES/lag_switch.dm @@ -16,5 +16,9 @@ #define DISABLE_PARALLAX 7 /// Disables footsteps, TRAIT_BYPASS_MEASURES exempted #define DISABLE_FOOTSTEPS 8 +/// Disable icon VV render preview. Unlikely to be of use in 90% of circumstances, unless GFI starts shitting bricks again. +#define DISABLE_VV_ICON_PREVIEW 9 +/// Kick and prevent connections from unverified users +#define KICK_GUESTS 10 -#define MEASURES_AMOUNT 8 // The total number of switches defined above +#define MEASURES_AMOUNT 10 // The total number of switches defined above diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index c475a4308295..fe6d808b7885 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -1,18 +1,23 @@ -#define NO_STUTTER 1 -#define TONGUELESS_SPEECH 2 -#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD 4 -#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD 8 +#define NO_STUTTER (1<<0) +#define TONGUELESS_SPEECH (1<<1) +#define LANGUAGE_HIDE_ICON_IF_UNDERSTOOD (1<<2) +#define LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD (1<<3) +#define LANGUAGE_CAN_WHISPER (1<<4) +#define LANGUAGE_SELECTABLE_SPEAK (1<<5) +#define LANGUAGE_SELECTABLE_UNDERSTAND (1<<6) +#define LANGUAGE_OVERRIDE_SAY_MOD (1<<7) // LANGUAGE SOURCE DEFINES #define LANGUAGE_ALL "all" // For use in full removal only. #define LANGUAGE_ATOM "atom" #define LANGUAGE_MIND "mind" +#define LANGUAGE_MMI "mmi" #define LANGUAGE_ABSORB "absorb" #define LANGUAGE_APHASIA "aphasia" #define LANGUAGE_CTF "ctf" #define LANGUAGE_CULTIST "cultist" -#define LANGUAGE_CURATOR "curator" +#define LANGUAGE_ARCHIVIST "archivist" #define LANGUAGE_GLAND "gland" #define LANGUAGE_HAT "hat" #define LANGUAGE_MALF "malf" @@ -21,3 +26,6 @@ #define LANGUAGE_SOFTWARE "software" #define LANGUAGE_STONER "stoner" #define LANGUAGE_VOICECHANGE "voicechange" + +#define LANGUAGE_UNDERSTAND (1<<0) +#define LANGUAGE_SPEAK (1<<1) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index a9d3c4826bc4..1ae1b258b2b5 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -1,6 +1,8 @@ //Defines for atom layers and planes //KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE +//#define FLOAT_PLANE -32767 //For easy recordkeeping; this is a byond define. + //NEVER HAVE ANYTHING BELOW THIS PLANE ADJUST IF YOU NEED MORE SPACE #define LOWEST_EVER_PLANE -200 @@ -26,6 +28,9 @@ Specifically: ZMIMIC_MAX_PLANE to (ZMIMIC_MAX_PLANE - ZMIMIC_MAX_DEPTH) #define GAME_PLANE -6 +///Slightly above the game plane but does not catch mouse clicks. Useful for certain visuals that should be clicked through, like seethrough trees +#define SEETHROUGH_PLANE -5 + // PLANE_SPACE layer(s) #define SPACE_LAYER 1.8 @@ -47,14 +52,17 @@ Specifically: ZMIMIC_MAX_PLANE to (ZMIMIC_MAX_PLANE - ZMIMIC_MAX_DEPTH) #define DISPOSAL_PIPE_LAYER 2.3 #define GAS_PIPE_HIDDEN_LAYER 2.35 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap #define WIRE_LAYER 2.4 -#define WIRE_BRIDGE_LAYER 2.44 +#define WIRE_KNOT_LAYER 2.44 #define WIRE_TERMINAL_LAYER 2.45 #define GAS_SCRUBBER_LAYER 2.46 #define GAS_PIPE_VISIBLE_LAYER 2.47 //layer = initial(layer) + piping_layer / 1000 in atmospherics/update_icon() to determine order of pipe overlap #define GAS_FILTER_LAYER 2.48 #define GAS_PUMP_LAYER 2.49 +#define BOT_PATH_LAYER 2.491 #define LOW_OBJ_LAYER 2.5 -///catwalk overlay of /turf/open/floor/plating/catwalk_floor +/// The lattice of /obj/structure/overfloor_catwalk +#define CATWALK_LATTICE_LAYER 2.505 +/// The rim of /obj/structure/overfloor_catwalk #define CATWALK_LAYER 2.51 #define LOW_SIGIL_LAYER 2.52 #define SIGIL_LAYER 2.53 @@ -99,6 +107,7 @@ Specifically: ZMIMIC_MAX_PLANE to (ZMIMIC_MAX_PLANE - ZMIMIC_MAX_DEPTH) #define MOB_UPPER_LAYER 4.07 #define HITSCAN_PROJECTILE_LAYER 4.09 #define ABOVE_MOB_LAYER 4.1 +#define TROLLEY_BARS_LAYER 4.2 #define WALL_OBJ_LAYER 4.25 #define EDGED_TURF_LAYER 4.3 #define ON_EDGED_TURF_LAYER 4.35 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 1601798aa36c..8394bb69c78e 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -1,15 +1,23 @@ ///Object doesn't use any of the light systems. Should be changed to add a light source to the object. #define NO_LIGHT_SUPPORT 0 ///Light made with the lighting datums, applying a matrix. -#define STATIC_LIGHT 1 +#define COMPLEX_LIGHT 1 ///Light made by masking the lighting darkness plane. -#define MOVABLE_LIGHT 2 +#define OVERLAY_LIGHT 2 ///Light made by masking the lighting darkness plane, and is directional. -#define MOVABLE_LIGHT_DIRECTIONAL 3 +#define OVERLAY_LIGHT_DIRECTIONAL 3 -///Is a movable light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. +/// Is our overlay light source attached to another movable (its loc), meaning that the lighting component should go one level deeper. #define LIGHT_ATTACHED (1<<0) +// Area lighting +/// Area is permanently black, cannot be lit ever. This shouldn't really be used, but is technically supported. +#define AREA_LIGHTING_NONE 0 +/// Area is lit by lighting_object and lighting_sources +#define AREA_LIGHTING_DYNAMIC 1 +/// Area is lit by the area's base_lighting values. +#define AREA_LIGHTING_STATIC 2 + //Bay lighting engine shit, not in /code/modules/lighting because BYOND is being shit about it /// frequency, in 1/10ths of a second, of the lighting process #define LIGHTING_INTERVAL 5 @@ -57,38 +65,34 @@ /// 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 +#define _EMISSIVE_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, val,val,val,0) + /// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. -#define EMISSIVE_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1,1,1,0) +#define EMISSIVE_COLOR _EMISSIVE_COLOR(1) /// A globaly cached version of [EMISSIVE_COLOR] for quick access. GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) + +#define _EM_BLOCK_COLOR(val) list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,val, 0,0,0,0) /// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. -#define EM_BLOCK_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) +#define EM_BLOCK_COLOR _EM_BLOCK_COLOR(1) + /// A globaly cached version of [EM_BLOCK_COLOR] for quick access. GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) /// A set of appearance flags applied to all emissive and emissive blocker overlays. -#define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR|RESET_TRANSFORM) +#define EMISSIVE_APPEARANCE_FLAGS (KEEP_APART|KEEP_TOGETHER|RESET_COLOR) /// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. #define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) /// A globaly cached version of [EM_MASK_MATRIX] for quick access. GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) -/// Returns the red part of a #RRGGBB hex sequence as number -#define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) - -/// Returns the green part of a #RRGGBB hex sequence as number -#define GETGREENPART(hexa) hex2num(copytext(hexa, 4, 6)) - -/// Returns the blue part of a #RRGGBB hex sequence as number -#define GETBLUEPART(hexa) hex2num(copytext(hexa, 6, 8)) - /// Parse the hexadecimal color into lumcounts of each perspective. #define PARSE_LIGHT_COLOR(source) \ do { \ if (source.light_color != COLOR_WHITE) { \ - var/__light_color = source.light_color; \ - source.lum_r = GETREDPART(__light_color) / 255; \ - source.lum_g = GETGREENPART(__light_color) / 255; \ - source.lum_b = GETBLUEPART(__light_color) / 255; \ + var/list/color_map = rgb2num(source.light_color); \ + source.lum_r = color_map[1] / 255; \ + source.lum_g = color_map[2] / 255; \ + source.lum_b = color_map[3] / 255; \ } else { \ source.lum_r = 1; \ source.lum_g = 1; \ @@ -97,9 +101,9 @@ do { \ } while (FALSE) /// The default falloff curve for all atoms. It's a magic number you should adjust until it looks good. -#define LIGHTING_DEFAULT_FALLOFF_CURVE 2.36 //3 +#define LIGHTING_DEFAULT_FALLOFF_CURVE 2 /// Include this to have lights randomly break on initialize. #define LIGHTS_RANDOMLY_BROKEN -#define TURF_IS_DYNAMICALLY_LIT(T) (!(T.always_lit || T.loc:area_has_base_lighting)) +#define TURF_IS_DYNAMICALLY_LIT(T) (!(T.always_lit || T.loc.luminosity)) diff --git a/code/__DEFINES/logging.dm b/code/__DEFINES/logging.dm index 7eac66fcb824..cd5aee0ebec9 100644 --- a/code/__DEFINES/logging.dm +++ b/code/__DEFINES/logging.dm @@ -40,6 +40,7 @@ #define LOG_VICTIM (1 << 20) #define LOG_RADIO_EMOTE (1 << 21) #define LOG_MECHCOMP (1 <<22) +#define LOG_HEALTH (1<< 23) //Individual logging panel pages #define INDIVIDUAL_ATTACK_LOG (LOG_ATTACK | LOG_VICTIM) @@ -48,7 +49,11 @@ #define INDIVIDUAL_COMMS_LOG (LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS) #define INDIVIDUAL_OOC_LOG (LOG_OOC | LOG_ADMIN) #define INDIVIDUAL_OWNERSHIP_LOG (LOG_OWNERSHIP) -#define INDIVIDUAL_SHOW_ALL_LOG (LOG_ATTACK | LOG_SAY | LOG_WHISPER | LOG_EMOTE | LOG_RADIO_EMOTE | LOG_DSAY | LOG_PDA | LOG_CHAT | LOG_COMMENT | LOG_TELECOMMS | LOG_OOC | LOG_ADMIN | LOG_OWNERSHIP | LOG_GAME | LOG_ADMIN_PRIVATE | LOG_ASAY | LOG_MECHA | LOG_VIRUS | LOG_CLONING | LOG_SHUTTLE | LOG_ECON | LOG_VICTIM) +#define INDIVIDUAL_HEALTH_LOG (LOG_HEALTH) +#define INDIVIDUAL_SHOW_ALL_LOG (ALL) #define LOGSRC_CKEY "Ckey" #define LOGSRC_MOB "Mob" + + +#define log_health(mob, message) mob?.log_message(message, LOG_HEALTH, COLOR_GREEN, FALSE) diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 32215950698e..43c1f255db86 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -69,6 +69,9 @@ #define MC_CHARGE "CHARGE" #define MC_AI "AI" +/// Modular Computer Autorun file +#define MC_AUTORUN_FILE "autorun" + //NTNet stuff, for modular computers // NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc) #define NTNET_SOFTWAREDOWNLOAD 1 // Downloads of software from NTNet @@ -228,6 +231,7 @@ #define DCAT_MISC "Miscellaneous" #define DCAT_SILICON "Silicons" #define DCAT_MINING "Mining Tools" +#define DCAT_PAINTER "Painters" // Design categories for the mechfab #define DCAT_CYBORG "Cyborg" diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 5cf1834db289..b4cd1b11918c 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -72,7 +72,6 @@ require only minor tweaks. // boolean - weather types that occur on the level #define ZTRAIT_SNOWSTORM "Weather_Snowstorm" -#define ZTRAIT_ASHSTORM "Weather_Ashstorm" #define ZTRAIT_VOIDSTORM "Weather_Voidstorm" /// boolean - does this z prevent ghosts from observing it @@ -113,13 +112,6 @@ require only minor tweaks. #define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE) ///Z level traits for Deep Space #define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) -///Z level traits for Lavaland -#define ZTRAITS_LAVALAND list(\ - ZTRAIT_MINING = TRUE, \ - ZTRAIT_ASHSTORM = TRUE, \ - ZTRAIT_LAVA_RUINS = TRUE, \ - ZTRAIT_BOMBCAP_MULTIPLIER = 2, \ - ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface) ///Z level traits for Away Missions #define ZTRAITS_AWAY list(ZTRAIT_AWAY = TRUE) ///Z level traits for Secret Away Missions @@ -152,7 +144,6 @@ require only minor tweaks. #define PLACE_DEFAULT "random" #define PLACE_SAME_Z "same" //On same z level as original ruin #define PLACE_SPACE_RUIN "space" //On space ruin z level(s) -#define PLACE_LAVA_RUIN "lavaland" //On lavaland ruin z levels(s) #define PLACE_BELOW "below" //On z levl below - centered on same tile #define PLACE_ISOLATED "isolated" //On isolated ruin z level diff --git a/code/__DEFINES/mapswitch.dm b/code/__DEFINES/mapswitch.dm new file mode 100644 index 000000000000..dbb0059786ee --- /dev/null +++ b/code/__DEFINES/mapswitch.dm @@ -0,0 +1,8 @@ +/// Uses the left operator when compiling, uses the right operator when not compiling. +// Currently uses the CBT macro, but if http://www.byond.com/forum/post/2831057 is ever added, +// or if map tools ever agree on a standard, this should switch to use that. +#ifdef CBT +#define MAP_SWITCH(compile_time, map_time) ##compile_time +#else +#define MAP_SWITCH(compile_time, map_time) ##map_time +#endif diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index 32e31e08b51a..ada6fdd6679f 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -57,7 +57,7 @@ #define MATERIAL_GREYSCALE (1<<4) /// Wrapper for fetching material references. Exists exclusively so that people don't need to wrap everything in a list every time. -#define GET_MATERIAL_REF(arguments...) SSmaterials._GetMaterialRef(list(##arguments)) +#define GET_MATERIAL_REF(arguments...) SSmaterials._GetMaterialRef(##arguments) #define MATERIAL_SOURCE(mat) "[mat.name]_material" @@ -68,8 +68,3 @@ #define MATERIAL_SLOWDOWN_PLASTEEL (0.05) /// The slowdown value of one [MINERAL_MATERIAL_AMOUNT] of alien alloy. #define MATERIAL_SLOWDOWN_ALIEN_ALLOY (0.1) - -// Flags for wall shine -#define WALL_SHINE_PLATING (1<<0) -#define WALL_SHINE_REINFORCED (1<<1) -#define WALL_SHINE_BOTH (WALL_SHINE_REINFORCED|WALL_SHINE_PLATING) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 62c1af9d200f..e22a0dffe1cd 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -1,7 +1,9 @@ // Remove these once we have Byond implementation. -#define ISNAN(a) (!(a==a)) -#define ISINF(a) (!ISNAN(a) && ISNAN(a-a)) -#define IS_INF_OR_NAN(a) (ISNAN(a-a)) +// ------------------------------------ +#define IS_FINITE(a) (isnum(a) && !isinf(a)) + +#define IS_INF_OR_NAN(a) (isnan(a) || isinf(a)) + // Aight dont remove the rest // Credits to Nickr5 for the useful procs I've taken from his library resource. @@ -46,6 +48,9 @@ // Similar to clamp but the bottom rolls around to the top and vice versa. min is inclusive, max is exclusive #define WRAP(val, min, max) clamp(( min == max ? min : (val) - (round(((val) - (min))/((max) - (min))) * ((max) - (min))) ),min,max) +/// Increments a value and wraps it if it exceeds some value. Can be used to circularly iterate through a list through `idx = WRAP_UP(idx, length_of_list)`. +#define WRAP_UP(val, max) (((val) % (max)) + 1) + // Real modulus that handles decimals #define MODULUS(x, y) ( (x) - FLOOR(x, y)) @@ -116,7 +121,7 @@ #define TORADIANS(degrees) ((degrees) * 0.0174532925) /// Gets shift x that would be required the bitflag (1<1 blows out colors and greys + */ +#define COLOR_MATRIX_CONTRAST(val) list(val,0,0,0, 0,val,0,0, 0,0,val,0, 0,0,0,1, (1-val)*0.5,(1-val)*0.5,(1-val)*0.5,0) diff --git a/code/__DEFINES/media.dm b/code/__DEFINES/media.dm new file mode 100644 index 000000000000..c91c51b47ba3 --- /dev/null +++ b/code/__DEFINES/media.dm @@ -0,0 +1,13 @@ +//Media Tags +/// All tracks share this tag. Probably shouldn't be called upon. +#define MEDIA_TAG_ALLMEDIA "ALL_TRACKS" +/// Common Lobby music tracks. MUST NOT also be rare. +#define MEDIA_TAG_LOBBYMUSIC_COMMON "LOBBY" +/// RARE lobby music tracks. Replaces the rarity flag. MUST NOT also be common. +#define MEDIA_TAG_LOBBYMUSIC_RARE "LOBBY_RARE" +/// Common Round-End Stinger tracks. +#define MEDIA_TAG_ROUNDEND_COMMON "ROUNDEND" +/// RARE Round-End Stinger tracks. MUST NOT also be common. +#define MEDIA_TAG_ROUNDEND_RARE "ROUNDEND_RARE" +/// Jukebox music. +#define MEDIA_TAG_JUKEBOX "JUKEBOX" diff --git a/code/__DEFINES/memory_defines.dm b/code/__DEFINES/memory_defines.dm index 9eeb823b431b..be388f622099 100644 --- a/code/__DEFINES/memory_defines.dm +++ b/code/__DEFINES/memory_defines.dm @@ -36,22 +36,20 @@ //Flags for memories ///this memory doesn't have a location, emit that #define MEMORY_FLAG_NOLOCATION (1<<0) -///this memory's protagonist for one reason or another doesn't have a mood, emit that -#define MEMORY_FLAG_NOMOOD (1<<1) ///this memory shouldn't include the station name (example: revolution memory) -#define MEMORY_FLAG_NOSTATIONNAME (1<<2) +#define MEMORY_FLAG_NOSTATIONNAME (1<<1) ///this memory is REALLY shit and should never be saved in persistence, basically apply this to all quirks. -#define MEMORY_FLAG_NOPERSISTENCE (1<<3) +#define MEMORY_FLAG_NOPERSISTENCE (1<<2) ///this memory has already been engraved, and cannot be selected for engraving again. -#define MEMORY_FLAG_ALREADY_USED (1<<4) +#define MEMORY_FLAG_ALREADY_USED (1<<3) ///this memory requires the target not to be blind. -#define MEMORY_CHECK_BLINDNESS (1<<5) +#define MEMORY_CHECK_BLINDNESS (1<<4) ///this memory requires the target not to be deaf. -#define MEMORY_CHECK_DEAFNESS (1<<6) +#define MEMORY_CHECK_DEAFNESS (1<<5) ///this memory requires the target not to be both deaf and blind. #define MEMORY_CHECK_BLIND_AND_DEAF (MEMORY_CHECK_BLINDNESS|MEMORY_CHECK_DEAFNESS) ///this memory can be memorized by unconscious people. -#define MEMORY_SKIP_UNCONSCIOUS (1<<8) +#define MEMORY_SKIP_UNCONSCIOUS (1<<6) // These defines are for what notable event happened. they correspond to the json lists related to the memory /// A memory of completing a surgery. @@ -110,7 +108,7 @@ * * ideally these eventually get moved off this system... though engraving your bank account is so HILARIOUSLY dumb so maybe leave that one */ -///your memorized code +///your memorized bank account #define MEMORY_ACCOUNT "account" ///your memorized drug #define MEMORY_QUIRK_DRUG "quirk_drug" @@ -149,6 +147,7 @@ #define DETAIL_HIGHFIVE_TYPE "HIGHFIVE_TYPE" #define DETAIL_BOMB_TYPE "BOMB_TYPE" #define DETAIL_ACCOUNT_ID "ACCOUNT_ID" +#define DETAIL_ACCOUNT_PIN "ACCOUNT_PIN" #define DETAIL_KISSER "KISSER" #define DETAIL_FOOD "FOOD" #define DETAIL_DRINK "DRINK" diff --git a/code/__DEFINES/midrounds.dm b/code/__DEFINES/midrounds.dm new file mode 100644 index 000000000000..9aad3b7849bb --- /dev/null +++ b/code/__DEFINES/midrounds.dm @@ -0,0 +1,2 @@ +///The amount of time before a dead antagonist is considered permanently dead +#define MIDROUND_ANTAGONIST_DEATH_TO_PERMA 10 MINUTES diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 12821980432e..dab412cf6b64 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -13,7 +13,8 @@ #define MOVE_INTENT_SPRINT "sprint" //Blood levels -#define BLOOD_VOLUME_MAX_LETHAL 2150 +#define BLOOD_VOLUME_ABSOLUTE_MAX 2150 +#define BLOOD_VOLUME_MAX_LETHAL BLOOD_VOLUME_ABSOLUTE_MAX #define BLOOD_VOLUME_EXCESS 2100 #define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 @@ -23,15 +24,32 @@ #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 -/// How efficiently humans regenerate blood. -#define BLOOD_REGEN_FACTOR 0.25 +// Blood circulation levels +#define BLOOD_CIRC_FULL 100 +#define BLOOD_CIRC_SAFE 85 +#define BLOOD_CIRC_OKAY 70 +#define BLOOD_CIRC_BAD 60 +#define BLOOD_CIRC_SURVIVE 30 + +// Values for flash_pain() +#define PAIN_SMALL "weakest_pain" +#define PAIN_MEDIUM "weak_pain" +#define PAIN_LARGE "pain" + +//Germs and infections. +#define GERM_LEVEL_AMBIENT 275 // Maximum germ level you can reach by standing still. +#define GERM_LEVEL_MOVE_CAP 300 // Maximum germ level you can reach by running around. + +#define INFECTION_LEVEL_ONE 250 +#define INFECTION_LEVEL_TWO 500 // infections grow from ambient to two in ~5 minutes +#define INFECTION_LEVEL_THREE 1000 // infections grow from two to three in ~10 minutes //Sizes of mobs, used by mob/living/var/mob_size -#define MOB_SIZE_TINY 0 -#define MOB_SIZE_SMALL 1 -#define MOB_SIZE_HUMAN 2 -#define MOB_SIZE_LARGE 3 -#define MOB_SIZE_HUGE 4 // Use this for things you don't want bluespace body-bagged +#define MOB_SIZE_TINY 1 +#define MOB_SIZE_SMALL 5 +#define MOB_SIZE_HUMAN 10 +#define MOB_SIZE_LARGE 20 +#define MOB_SIZE_HUGE 40 // Use this for things you don't want bluespace body-bagged //Ventcrawling defines #define VENTCRAWLER_NONE 0 @@ -51,11 +69,6 @@ #define MOB_SPIRIT (1 << 9) #define MOB_PLANT (1 << 10) - -//Organ defines for carbon mobs -#define ORGAN_ORGANIC 1 -#define ORGAN_ROBOTIC 2 - #define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi' #define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi' @@ -80,16 +93,16 @@ #define BODYTYPE_MONKEY (1<<4) ///The limb is snouted. #define BODYTYPE_SNOUTED (1<<5) -///The limb has skrelly bits -#define BODYTYPE_SKRELL (1<<6) ///The limb is voxed -#define BODYTYPE_VOX_BEAK (1<<7) +#define BODYTYPE_VOX_BEAK (1<<6) ///The limb is in the shape of a vox leg. -#define BODYTYPE_VOX_LEGS (1<<8) +#define BODYTYPE_VOX_LEGS (1<<7) ///Vox limb that isnt a head or legs. -#define BODYTYPE_VOX_OTHER (1<<9) +#define BODYTYPE_VOX_OTHER (1<<8) ///The limb is small and feathery -#define BODYTYPE_TESHARI (1<<10) +#define BODYTYPE_TESHARI (1<<9) +/// IPC heads. +#define BODYTYPE_BOXHEAD (1<<10) //Defines for Species IDs ///A placeholder bodytype for xeno larva, so their limbs cannot be attached to anything. @@ -105,6 +118,7 @@ #define SPECIES_FELINE "felinid" #define SPECIES_FLYPERSON "fly" #define SPECIES_HUMAN "human" +#define SPECIES_IPC "ipc" #define SPECIES_JELLYPERSON "jelly" #define SPECIES_SLIMEPERSON "slime" #define SPECIES_LUMINESCENT "luminescent" @@ -118,9 +132,9 @@ #define SPECIES_MUSHROOM "mush" #define SPECIES_PLASMAMAN "plasmaman" #define SPECIES_PODPERSON "pod" +#define SPECIES_SAURIAN "saurian" #define SPECIES_SHADOW "shadow" #define SPECIES_SKELETON "skeleton" -#define SPECIES_SKRELL "skrell" #define SPECIES_SNAIL "snail" #define SPECIES_TESHARI "teshari" #define SPECIES_VAMPIRE "vampire" @@ -157,8 +171,7 @@ ///Heartbeat is gone... He's dead Jim :( #define BEAT_NONE 0 -#define HUMAN_MAX_OXYLOSS 3 -#define HUMAN_CRIT_MAX_OXYLOSS (SSMOBS_DT/3) +#define HUMAN_FAILBREATH_OXYLOSS 1 #define HEAT_DAMAGE_LEVEL_1 1 //Amount of damage applied when your body temperature just passes the 360.15k safety point #define HEAT_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 400K point @@ -180,6 +193,7 @@ //Brain Damage defines #define BRAIN_DAMAGE_MILD 20 #define BRAIN_DAMAGE_SEVERE 100 +#define BRAIN_DAMAGE_CRITICAL 150 #define BRAIN_DAMAGE_DEATH 200 #define BRAIN_TRAUMA_MILD /datum/brain_trauma/mild @@ -214,6 +228,7 @@ #define SURGERY_CLOSED 0 #define SURGERY_OPEN 1 #define SURGERY_RETRACTED 2 +#define SURGERY_DEENCASED 3 //Health hud screws for carbon mobs #define SCREWYHUD_NONE 0 @@ -236,26 +251,6 @@ #define BEAUTY_LEVEL_GOOD 66 #define BEAUTY_LEVEL_GREAT 100 -//Moods levels for humans -#define MOOD_LEVEL_HAPPY4 15 -#define MOOD_LEVEL_HAPPY3 10 -#define MOOD_LEVEL_HAPPY2 6 -#define MOOD_LEVEL_HAPPY1 2 -#define MOOD_LEVEL_NEUTRAL 0 -#define MOOD_LEVEL_SAD1 -3 -#define MOOD_LEVEL_SAD2 -7 -#define MOOD_LEVEL_SAD3 -15 -#define MOOD_LEVEL_SAD4 -20 - -//Sanity levels for humans -#define SANITY_MAXIMUM 150 -#define SANITY_GREAT 125 -#define SANITY_NEUTRAL 100 -#define SANITY_DISTURBED 75 -#define SANITY_UNSTABLE 50 -#define SANITY_CRAZY 25 -#define SANITY_INSANE 0 - //Nutrition levels for humans #define NUTRITION_LEVEL_FAT 600 #define NUTRITION_LEVEL_FULL 550 @@ -316,8 +311,7 @@ #define SENTIENCE_ORGANIC 1 #define SENTIENCE_ARTIFICIAL 2 #define SENTIENCE_HUMANOID 3 -#define SENTIENCE_MINEBOT 4 -#define SENTIENCE_BOSS 5 +#define SENTIENCE_BOSS 4 //Mob AI Status #define POWER_RESTORATION_OFF 0 @@ -429,7 +423,76 @@ #define POCKET_STRIP_DELAY (4 SECONDS) //time taken to search somebody's pockets #define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you -#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism +/// Applies a Chemical Effect with the given magnitude to the mob +#define APPLY_CHEM_EFFECT(mob, effect, magnitude) \ + if(effect in mob.chem_effects) { \ + mob.chem_effects[effect] += magnitude; \ + } \ + else { \ + mob.chem_effects[effect] = magnitude; \ + } + +#define SET_CHEM_EFFECT_IF_LOWER(mob, effect, magnitude) \ + if(effect in mob.chem_effects) { \ + mob.chem_effects[effect] = max(magnitude , mob.chem_effects[effect]); \ + } \ + else { \ + mob.chem_effects[effect] = magnitude; \ + } + +///Check chem effect presence in a mob +#define CHEM_EFFECT_MAGNITUDE(mob, effect) (mob.chem_effects[effect] || 0) + +//CHEMICAL EFFECTS +/// Prevents damage from freezing. Boolean. +#define CE_CRYO "cryo" +/// Inaprovaline +#define CE_STABLE "stable" +/// Breathing depression, makes you need more air +#define CE_BREATHLOSS "breathloss" +/// Fights off necrosis in bodyparts and organs +#define CE_ANTIBIOTIC "antibiotic" +/// Iron/nutriment +#define CE_BLOODRESTORE "bloodrestore" +#define CE_PAINKILLER "painkiller" +/// Liver filtering +#define CE_ALCOHOL "alcohol" +/// Liver damage +#define CE_ALCOHOL_TOXIC "alcotoxic" +/// Increases or decreases heart rate +#define CE_PULSE "xcardic" +/// Reduces incoming toxin damage and helps with liver filtering +#define CE_ANTITOX "antitox" +/// Dexalin. +#define CE_OXYGENATED "oxygen" +/// Anti-virus effect. +#define CE_ANTIVIRAL "antiviral" +// Generic toxins, stops autoheal. +#define CE_TOXIN "toxins" +/// Gets in the way of blood circulation, higher the worse +#define CE_BLOCKAGE "blockage" +/// Lowers the subject's voice to a whisper +#define CE_VOICELOSS "whispers" +/// Makes it harder to disarm someone +#define CE_STIMULANT "stimulants" +/// Multiplier for bloodloss +#define CE_ANTICOAGULANT "anticoagulant" +/// Enables brain regeneration even in poor circumstances +#define CE_BRAIN_REGEN "brainregen" + +// Pulse levels, very simplified. +#define PULSE_NONE 0 // So !M.pulse checks would be possible. +#define PULSE_SLOW 1 // <60 bpm +#define PULSE_NORM 2 // 60-90 bpm +#define PULSE_FAST 3 // 90-120 bpm +#define PULSE_2FAST 4 // >120 bpm +#define PULSE_THREADY 5 // Occurs during hypovolemic shock +#define GETPULSE_HAND 0 // Less accurate. (hand) +#define GETPULSE_TOOL 1 // More accurate. (med scanner, sleeper, etc.) +#define PULSE_MAX_BPM 250 // Highest, readable BPM by machines and humans. + +// Partial stasis sources +#define STASIS_CRYOGENIC_FREEZING "cryo" // Eye protection #define FLASH_PROTECTION_SENSITIVE -1 @@ -437,6 +500,9 @@ #define FLASH_PROTECTION_FLASH 1 #define FLASH_PROTECTION_WELDER 2 +// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. +#define MOB_BIG_FIRE_STACK_THRESHOLD 3 + // Roundstart trait system #define MAX_QUIRKS 6 //The maximum amount of quirks one character can have at roundstart @@ -447,6 +513,8 @@ // /obj/item/bodypart on_mob_life() retval flag #define BODYPART_LIFE_UPDATE_HEALTH (1<<0) +#define BODYPART_LIFE_UPDATE_HEALTH_HUD (1<<1) +#define BODYPART_LIFE_UPDATE_DAMAGE_OVERLAYS (1<<2) #define MAX_REVIVE_FIRE_DAMAGE 180 #define MAX_REVIVE_BRUTE_DAMAGE 180 @@ -460,7 +528,7 @@ #define PULL_PRONE_SLOWDOWN 1.5 #define HUMAN_CARRY_SLOWDOWN 0.35 -//Flags that control what things can spawn species (whitelist) +//Flags that control what things can spawn species (whitelist) (changesource_flagx) //Badmin magic mirror #define MIRROR_BADMIN (1<<0) //Standard magic mirror (wizard) @@ -522,9 +590,6 @@ #define SILENCE_RANGED_MESSAGE (1<<0) -/// Returns whether or not the given mob can succumb -#define CAN_SUCCUMB(target) (HAS_TRAIT(target, TRAIT_CRITICAL_CONDITION) && !HAS_TRAIT(target, TRAIT_NODEATH)) - // Body position defines. /// Mob is standing up, usually associated with lying_angle value of 0. #define STANDING_UP 0 @@ -534,9 +599,6 @@ ///How much a mob's sprite should be moved when they're lying down #define PIXEL_Y_OFFSET_LYING -6 -///Define for spawning megafauna instead of a mob for cave gen -#define SPAWN_MEGAFAUNA "bluh bluh huge boss" - ///Squash flags. For squashable element ///Whether or not the squashing requires the squashed mob to be lying down @@ -681,14 +743,21 @@ #define ABOVE_BODY_FRONT_LAYER (BODY_FRONT_LAYER-1) //used by canUseTopic() -/// If silicons need to be next to the atom to use this -#define BE_CLOSE TRUE -/// If other mobs (monkeys, aliens, etc) can use this -#define NO_DEXTERITY TRUE // I had to change 20+ files because some non-dnd-playing fuckchumbis can't spell "dexterity" -// If telekinesis you can use it from a distance -#define NO_TK TRUE -/// If mobs can use this while resting -#define FLOOR_OKAY TRUE +/// Needs to be Adjacent() to target. +#define USE_CLOSE (1<<0) +/// Needs to be an AdvancedToolUser +#define USE_DEXTERITY (1<<1) +// Forbid TK overriding USE_CLOSE +#define USE_IGNORE_TK (1<<2) +/// The mob needs to have hands (Does not need EMPTY hands) +#define USE_NEED_HANDS (1<<3) +/// Allows the mob to be resting +#define USE_RESTING (1<<4) +/// Ignore USE_CLOSE if they have silicon reach +#define USE_SILICON_REACH (1<<5) +/// Needs to be literate +#define USE_LITERACY (1<<6) + /// The default mob sprite size (used for shrinking or enlarging the mob sprite to regular size) #define RESIZE_DEFAULT_SIZE 1 @@ -729,3 +798,23 @@ GLOBAL_REAL_VAR(list/voice_type2sound) = list( ///Managed global that is a reference to the real global GLOBAL_LIST_INIT(voice_type2sound_ref, voice_type2sound) + +/// Breath succeeded completely +#define BREATH_OKAY 1 +/// Breath caused damage, but should not be obvious +#define BREATH_SILENT_DAMAGING 0 +/// Breath succeeded but is damaging. +#define BREATH_DAMAGING -1 +/// Breath completely failed. chokies!! +#define BREATH_FAILED -2 + +/// Attack missed. +#define MOB_ATTACKEDBY_MISS 3 +/// Attack completely failed (missing user, etc) +#define MOB_ATTACKEDBY_FAIL 0 +#define MOB_ATTACKEDBY_SUCCESS 1 +#define MOB_ATTACKEDBY_NO_DAMAGE 2 + +#define BLIND_NOT_BLIND 0 +#define BLIND_PHYSICAL 1 +#define BLIND_SLEEPING 2 diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index cc309df533c2..27d3a99d4751 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -17,13 +17,8 @@ #define MODULE_ACTIVE 3 //Defines used by the theme for clothing flags and similar -#define CONTROL_LAYER "control_layer" -#define HELMET_FLAGS "helmet_flags" -#define CHESTPLATE_FLAGS "chestplate_flags" -#define GAUNTLETS_FLAGS "gauntlets_flags" -#define BOOTS_FLAGS "boots_flags" - #define UNSEALED_LAYER "unsealed_layer" +#define SEALED_LAYER "sealed_layer" #define UNSEALED_CLOTHING "unsealed_clothing" #define SEALED_CLOTHING "sealed_clothing" #define UNSEALED_INVISIBILITY "unsealed_invisibility" @@ -31,10 +26,30 @@ #define UNSEALED_COVER "unsealed_cover" #define SEALED_COVER "sealed_cover" #define CAN_OVERSLOT "can_overslot" +#define UNSEALED_MESSAGE "unsealed_message" +#define SEALED_MESSAGE "sealed_message" //Defines used to override MOD clothing's icon and worn icon files in the skin. #define MOD_ICON_OVERRIDE "mod_icon_override" #define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override" +//Defines for MODlink frequencies +#define MODLINK_FREQ_NANOTRASEN "NT" +#define MODLINK_FREQ_SYNDICATE "SYND" +#define MODLINK_FREQ_CHARLIE "CHRL" +#define MODLINK_FREQ_CENTCOM "CC" + +//Default text for different messages for the user. +#define HELMET_UNSEAL_MESSAGE "hisses open" +#define HELMET_SEAL_MESSAGE "hisses closed" +#define CHESTPLATE_UNSEAL_MESSAGE "releases your chest" +#define CHESTPLATE_SEAL_MESSAGE "cinches tightly around your chest" +#define GAUNTLET_UNSEAL_MESSAGE "become loose around your fingers" +#define GAUNTLET_SEAL_MESSAGE "tighten around your fingers and wrists" +#define BOOT_UNSEAL_MESSAGE "relax their grip on your legs" +#define BOOT_SEAL_MESSAGE "seal around your feet" + /// Global list of all /datum/mod_theme -GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) +GLOBAL_LIST_EMPTY(mod_themes) +/// Global list of all ids associated to a /datum/mod_link instance +GLOBAL_LIST_EMPTY(mod_link_ids) diff --git a/code/__DEFINES/movement.dm b/code/__DEFINES/movement.dm index b75812d60d4a..c670c7be91fc 100644 --- a/code/__DEFINES/movement.dm +++ b/code/__DEFINES/movement.dm @@ -34,6 +34,24 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define MOVEMENT_LOOP_IGNORE_PRIORITY (1<<1) ///Should we override the loop's glide? #define MOVEMENT_LOOP_IGNORE_GLIDE (1<<2) +///Should we not update our movables dir on move? +#define MOVEMENT_LOOP_NO_DIR_UPDATE (1<<3) +///Is the loop moving the movable outside its control, like it's an external force? e.g. footsteps won't play if enabled. +#define MOVEMENT_LOOP_OUTSIDE_CONTROL (1<<4) + +// Movement loop status flags +/// Has the loop been paused, soon to be resumed? +#define MOVELOOP_STATUS_PAUSED (1<<0) +/// Is the loop running? (Is true even when paused) +#define MOVELOOP_STATUS_RUNNING (1<<1) +/// Is the loop queued in a subsystem? +#define MOVELOOP_STATUS_QUEUED (1<<2) + +/** + * Returns a bitfield containing flags both present in `flags` arg and the `processing_move_loop_flags` move_packet variable. + * Has no use outside of procs called within the movement proc chain. + */ +#define CHECK_MOVE_LOOP_FLAGS(movable, flags) (movable.move_packet ? (movable.move_packet.processing_move_loop_flags & (flags)) : NONE) //Index defines for movement bucket data packets #define MOVEMENT_BUCKET_TIME 1 @@ -61,7 +79,7 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) /// Used when the grip on a pulled object shouldn't be broken. #define FALL_RETAIN_PULL (1<<3) -/// Runs check_pulling() by the end of [/atom/movable/proc/zMove] for every movable that's pulling something. Should be kept enabled unless you know what you are doing. +/// Runs recheck_grabs() by the end of [/atom/movable/proc/zMove] for every movable that's pulling something. Should be kept enabled unless you know what you are doing. #define ZMOVE_CHECK_PULLING (1<<0) /// Checks if pulledby is nearby. if not, stop being pulled. #define ZMOVE_CHECK_PULLEDBY (1<<1) @@ -69,18 +87,18 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define ZMOVE_FALL_CHECKS (1<<2) #define ZMOVE_CAN_FLY_CHECKS (1<<3) #define ZMOVE_INCAPACITATED_CHECKS (1<<4) -/// Doesn't call zPassIn() and zPassOut() +/// Doesn't call CanZPass() #define ZMOVE_IGNORE_OBSTACLES (1<<5) /// Gives players chat feedbacks if they're unable to move through z levels. #define ZMOVE_FEEDBACK (1<<6) /// Whether we check the movable (if it exists) the living mob is buckled on or not. #define ZMOVE_ALLOW_BUCKLED (1<<7) -/// If the movable is actually ventcrawling vertically. -#define ZMOVE_VENTCRAWLING (1<<8) /// Includes movables that're either pulled by the source or mobs buckled to it in the list of moving movables. -#define ZMOVE_INCLUDE_PULLED (1<<9) +#define ZMOVE_INCLUDE_PULLED (1<<8) /// Skips check for whether the moving atom is anchored or not. -#define ZMOVE_ALLOW_ANCHORED (1<<10) +#define ZMOVE_ALLOW_ANCHORED (1<<9) +/// Skip CanMoveOnto() checks +#define ZMOVE_SKIP_CANMOVEONTO (1<<10) #define ZMOVE_CHECK_PULLS (ZMOVE_CHECK_PULLING|ZMOVE_CHECK_PULLEDBY) @@ -109,3 +127,8 @@ GLOBAL_VAR_INIT(glide_size_multiplier, 1.0) #define TELEPORT_CHANNEL_CULT "cult" /// Anything else #define TELEPORT_CHANNEL_FREE "free" + +///Return values for moveloop Move() +#define MOVELOOP_FAILURE 0 +#define MOVELOOP_SUCCESS 1 +#define MOVELOOP_NOT_READY 2 diff --git a/code/__DEFINES/movement_info.dm b/code/__DEFINES/movement_info.dm new file mode 100644 index 000000000000..dc17f095c617 --- /dev/null +++ b/code/__DEFINES/movement_info.dm @@ -0,0 +1,20 @@ +#define ACTIVE_MOVEMENT_OLDLOC 1 +#define ACTIVE_MOVEMENT_DIRECTION 2 +#define ACTIVE_MOVEMENT_FORCED 3 +#define ACTIVE_MOVEMENT_OLDLOCS 4 + +#define SET_ACTIVE_MOVEMENT(_old_loc, _direction, _forced, _oldlocs) \ + active_movement = list( \ + _old_loc, \ + _direction, \ + _forced, \ + _oldlocs, \ + ) + +/// Finish any active movements +#define RESOLVE_ACTIVE_MOVEMENT \ + if(active_movement) { \ + var/__move_args = active_movement; \ + active_movement = null; \ + Moved(arglist(__move_args)); \ + } diff --git a/code/__DEFINES/multiz.dm b/code/__DEFINES/multiz.dm deleted file mode 100644 index b4c9d0de5774..000000000000 --- a/code/__DEFINES/multiz.dm +++ /dev/null @@ -1,7 +0,0 @@ - -#define HasBelow(Z) (((Z) > world.maxz || (Z) < 2 || ((Z)-1) > length(SSmapping.multiz_levels)) ? 0 : SSmapping.multiz_levels[(Z)-1]) -#define HasAbove(Z) (((Z) >= world.maxz || (Z) < 1 || (Z) > length(SSmapping.multiz_levels)) ? 0 : SSmapping.multiz_levels[(Z)]) -//So below - -#define GetAbove(A) (HasAbove(A:z) ? get_step(A, UP) : null) -#define GetBelow(A) (HasBelow(A:z) ? get_step(A, DOWN) : null) diff --git a/code/__DEFINES/mutant_colors.dm b/code/__DEFINES/mutant_colors.dm index 5630c7e00ff2..3ed6657bdf4a 100644 --- a/code/__DEFINES/mutant_colors.dm +++ b/code/__DEFINES/mutant_colors.dm @@ -1,4 +1,6 @@ -//These must always come in groups of 3. +// These must always come in groups of 3. +// do NOT assign the same mutant color to multiple organs if they have seperate preferences, it WILL break +// I KNOW YOU #define MUTCOLORS_KEY_GENERIC "generic" #define MUTCOLORS_GENERIC_1 "generic_1" #define MUTCOLORS_GENERIC_2 "generic_2" @@ -14,9 +16,27 @@ #define MUTCOLORS_TESHARI_BODY_FEATHERS_2 "teshari_bodyfeathers_2" #define MUTCOLORS_TESHARI_BODY_FEATHERS_3 "teshari_bodyfeathers_3" +#define MUTCOLORS_KEY_IPC_ANTENNA "ipc_antenna" + #define MUTCOLORS_KEY_IPC_ANTENNA_1 "ipc_antenna_1" + #define MUTCOLORS_KEY_IPC_ANTENNA_2 "ipc_antenna_2" + #define MUTCOLORS_KEY_IPC_ANTENNA_3 "ipc_antenna_3" + +#define MUTCOLORS_KEY_SAURIAN_SCREEN "saurian_screen" + #define MUTCOLORS_KEY_SAURIAN_SCREEN_1 "saurian_screen_1" + #define MUTCOLORS_KEY_SAURIAN_SCREEN_2 "saurian_screen_2" + #define MUTCOLORS_KEY_SAURIAN_SCREEN_3 "saurian_screen_3" + +#define MUTCOLORS_KEY_SAURIAN_ANTENNA "saurian_antenna" + #define MUTCOLORS_KEY_SAURIAN_ANTENNA_1 "saurian_antenna_1" + #define MUTCOLORS_KEY_SAURIAN_ANTENNA_2 "saurian_antenna_2" + #define MUTCOLORS_KEY_SAURIAN_ANTENNA_3 "saurian_antenna_3" + ///ADD NEW ONES TO THIS OR SHIT DOESNT WORK GLOBAL_LIST_INIT(all_mutant_colors_keys, list( MUTCOLORS_KEY_GENERIC, MUTCOLORS_KEY_TESHARI_TAIL, - MUTCOLORS_KEY_TESHARI_BODY_FEATHERS + MUTCOLORS_KEY_TESHARI_BODY_FEATHERS, + MUTCOLORS_KEY_IPC_ANTENNA, + MUTCOLORS_KEY_SAURIAN_SCREEN, + MUTCOLORS_KEY_SAURIAN_ANTENNA, )) diff --git a/code/__DEFINES/networks.dm b/code/__DEFINES/networks.dm deleted file mode 100644 index 2b692e757f2f..000000000000 --- a/code/__DEFINES/networks.dm +++ /dev/null @@ -1,94 +0,0 @@ -#define HID_RESTRICTED_END 101 //the first nonrestricted ID, automatically assigned on connection creation. - -#define NETWORK_BROADCAST_ID "ALL" - -/// To debug networks use this to check -//#define DEBUG_NETWORKS 1 - - -/// We do some macro magic to make sure the strings are created at compile time rather than runtime -/// We do it this way so that if someone changes any of the names of networks we don't have to hunt down -/// all the constants though all the files for them. hurrah! - -/// Ugh, couldn't get recursive stringafy to work in byond for some reason -#define NETWORK_NAME_COMBINE(L,R) ((L) + "." + (R)) - -/// Station network names. Used as the root networks for main parts of the station -#define __STATION_NETWORK_ROOT "SS13" -#define __CENTCOM_NETWORK_ROOT "CENTCOM" -#define __SYNDICATE_NETWORK_ROOT "SYNDI" -#define __LIMBO_NETWORK_ROOT "LIMBO" // Limbo is a dead network - -/// various sub networks pieces -#define __NETWORK_LIMBO "LIMBO" -#define __NETWORK_TOOLS "TOOLS" -#define __NETWORK_REMOTES "REMOTES" -#define __NETWORK_AIRLOCKS "AIRLOCKS" -#define __NETWORK_DOORS "DOORS" -#define __NETWORK_ATMOS "ATMOS" -#define __NETWORK_SCUBBERS "AIRLOCKS" -#define __NETWORK_AIRALARMS "AIRALARMS" -#define __NETWORK_CONTROL "CONTROL" -#define __NETWORK_STORAGE "STORAGE" -#define __NETWORK_CARGO "CARGO" -#define __NETWORK_BOTS "BOTS" -#define __NETWORK_COMPUTER "COMPUTER" -#define __NETWORK_CARDS "CARDS" -#define __NETWORK_CIRCUITS "CIRCUITS" - -/// Various combined subnetworks -#define NETWORK_DOOR_REMOTES NETWORK_NAME_COMBINE(__NETWORK_DOORS, __NETWORK_REMOTES) -#define NETWORK_DOOR_AIRLOCKS NETWORK_NAME_COMBINE(__NETWORK_DOORS, __NETWORK_AIRLOCKS) -#define NETWORK_ATMOS_AIRALARMS NETWORK_NAME_COMBINE(__NETWORK_ATMOS, __NETWORK_AIRALARMS) -#define NETWORK_ATMOS_SCUBBERS NETWORK_NAME_COMBINE(__NETWORK_ATMOS, __NETWORK_SCUBBERS) -#define NETWORK_CARDS NETWORK_NAME_COMBINE(__NETWORK_COMPUTER, __NETWORK_CARDS) -#define NETWORK_BOTS_CARGO NETWORK_NAME_COMBINE(__NETWORK_CARGO, __NETWORK_BOTS) - - -// Finally turn eveything into strings -#define STATION_NETWORK_ROOT __STATION_NETWORK_ROOT -#define CENTCOM_NETWORK_ROOT __CENTCOM_NETWORK_ROOT -#define SYNDICATE_NETWORK_ROOT __SYNDICATE_NETWORK_ROOT -#define LIMBO_NETWORK_ROOT __LIMBO_NETWORK_ROOT - - - -/// Network name should be all caps and no punctuation except for _ and . between domains -/// This does a quick an dirty fix to a network name to make sure it works -/proc/simple_network_name_fix(name) - // can't make this as a define, some reason findtext(name,@"^[^\. ]+[A-Z0-9_\.]+[^\. ]+$") dosn't work - var/static/regex/check_regex = new(@"[ \-]{1}","g") - return check_regex.Replace(uppertext(name),"_") -/* - * Helper that verifies a network name is valid. - * - * A valid network name (ie, SS13.ATMOS.SCRUBBERS) is all caps, no spaces with periods between - * branches. Returns false if it doesn't meat this requirement - * - * Arguments: - * * name - network text name to check -*/ -/proc/verify_network_name(name) - // can't make this as a define, some reason findtext(name,@"^[^\. ]+[A-Z0-9_\.]+[^\. ]+$") dosn't work - var/static/regex/check_regex = new(@"^(?=[^\. ]+)[A-Z0-9_\.]+[^\. ]+$") - return istext(name) && check_regex.Find(name) - - - -/// Port protocol. A port is just a list with a few vars that are used to send signals -/// that something is refreshed or updated. These macros make it faster rather than -/// calling procs -#define NETWORK_PORT_DISCONNECTED(LIST) (!LIST || LIST["_disconnected"]) -#define NETWORK_PORT_UPDATED(LIST) (LIST && !LIST["_disconnected"] && LIST["_updated"]) -#define NETWORK_PORT_UPDATE(LIST) if(LIST) { LIST["_updated"] = TRUE } -#define NETWORK_PORT_CLEAR_UPDATE(LIST) if(LIST) { LIST["_updated"] = FALSE } -#define NETWORK_PORT_SET_UPDATE(LIST) if(LIST) { LIST["_updated"] = TRUE } -#define NETWORK_PORT_DISCONNECT(LIST) if(LIST) { LIST["_disconnected"] = TRUE } - -/// Error codes -#define NETWORK_ERROR_OK null -#define NETWORK_ERROR_NOT_ON_NETWORK "network_error_not_on_network" -#define NETWORK_ERROR_BAD_NETWORK "network_error_bad_network" -#define NETWORK_ERROR_BAD_RECEIVER_ID "network_error_bad_receiver_id" -#define NETWORK_ERROR_UNAUTHORIZED "network_error_bad_unauthorized" - diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index 16556328d72b..ac392dcbf9cf 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -4,17 +4,16 @@ #define EMAGGED (1<<0) #define IN_USE (1<<1) // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! #define CAN_BE_HIT (1<<2) //can this be bludgeoned by items? -#define BEING_SHOCKED (1<<3) // Whether this thing is currently (already) being shocked by a tesla -#define DANGEROUS_POSSESSION (1<<4) //Admin possession yes/no -#define ON_BLUEPRINTS (1<<5) //Are we visible on the station blueprints at roundstart? -#define UNIQUE_RENAME (1<<6) // can you customize the description/name of the thing? -#define USES_TGUI (1<<7) //put on things that use tgui on ui_interact instead of custom/old UI. -#define BLOCK_Z_OUT_DOWN (1<<8) // Should this object block z falling from loc? -#define BLOCK_Z_OUT_UP (1<<9) // Should this object block z uprise from loc? -#define BLOCK_Z_IN_DOWN (1<<10) // Should this object block z falling from above? -#define BLOCK_Z_IN_UP (1<<11) // Should this object block z uprise from below? -#define NO_BUILD (1<<12) // Can we build on this object? -#define PLASMAGUARD (1<<13) //Immune to plasma contamination +#define DANGEROUS_POSSESSION (1<<3) //Admin possession yes/no +#define UNIQUE_RENAME (1<<4) // can you customize the description/name of the thing? +#define USES_TGUI (1<<5) //put on things that use tgui on ui_interact instead of custom/old UI. +#define BLOCK_Z_OUT_DOWN (1<<6) // Should this object block z falling from loc? +#define BLOCK_Z_OUT_UP (1<<7) // Should this object block z uprise from loc? +#define BLOCK_Z_IN_DOWN (1<<8) // Should this object block z falling from above? +#define BLOCK_Z_IN_UP (1<<9) // Should this object block z uprise from below? +#define BLOCK_Z_FALL (1<<10) // Should this object block falling? +#define NO_BUILD (1<<11) // Can we build on this object? +#define PLASMAGUARD (1<<12) //Immune to plasma contamination // If you add new ones, be sure to add them to /obj/Initialize as well for complete mapping support @@ -41,6 +40,8 @@ #define IGNORE_DIGITIGRADE (1<<18) /// Has contextual screentips when HOVERING OVER OTHER objects #define ITEM_HAS_CONTEXTUAL_SCREENTIPS (1 << 19) +/// Does not leave fingerprints or fibers on attack +#define NO_EVIDENCE_ON_ATTACK (1<<20) // Flags for the clothing_flags var on /obj/item/clothing /// SUIT and HEAD items which stop lava from hurting the wearer @@ -73,20 +74,25 @@ /// Clothes that block speech (i.e the muzzle). Can be applied to any clothing piece. #define BLOCKS_SPEECH (1<<13) /// prevents from placing on plasmaman helmet -#define PLASMAMAN_HELMET_EXEMPT (1<<14) +#define STACKABLE_HELMET_EXEMPT (1<<14) /// Usable as casting clothes by wizards (only matters for suits and headwear) #define CASTING_CLOTHES (1<<15) +/// This head clothing can deliver air from an airtank +#define HEADINTERNALS (1<<16) +/// Does not leave fibers behind +#define FIBERLESS (1<<17) /// Flags for the organ_flags var on /obj/item/organ #define ORGAN_SYNTHETIC (1<<0) //Synthetic organs, or cybernetic organs. Reacts to EMPs and don't deteriorate or heal #define ORGAN_FROZEN (1<<1) //Frozen organs, don't deteriorate -#define ORGAN_FAILING (1<<2) //Failing organs perform damaging effects until replaced or fixed +#define ORGAN_DEAD (1<<2) //Failing organs perform damaging effects until replaced or fixed #define ORGAN_EXTERNAL (1<<3) //Was this organ implanted/inserted/etc, if true will not be removed during species change. #define ORGAN_VITAL (1<<4) //Currently only the brain #define ORGAN_EDIBLE (1<<5) //is a snack? :D #define ORGAN_SYNTHETIC_EMP (1<<6) //Synthetic organ affected by an EMP. Deteriorates over time. #define ORGAN_UNREMOVABLE (1<<7) //Can't be removed using surgery +#define ORGAN_CUT_AWAY (1<<8) //! The organ is not attached to the parent. /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing @@ -100,6 +106,8 @@ #define TOY_FIREARM_OVERLAY (1<<0) // If update_overlay would add some indicator that the gun is a toy, like a plastic cap on a pistol /// Currently used to identify valid guns to steal #define NOT_A_REAL_GUN (1<<1) +/// Can't fire with akimbo +#define NO_AKIMBO (1<<2) /// Flags for sharpness in obj/item #define SHARP_EDGED (1<<0) diff --git a/code/__DEFINES/packetnet.dm b/code/__DEFINES/packetnet.dm index 8a42889ce864..a64d21c4aa9f 100644 --- a/code/__DEFINES/packetnet.dm +++ b/code/__DEFINES/packetnet.dm @@ -21,6 +21,9 @@ // Net Classes #define NETCLASS_P2P_PHONE "PNET_VCSTATION" #define NETCLASS_APC "PNET_AREAPOWER" +#define NETCLASS_TERMINAL "PNET_STERM" +#define NETCLASS_GRPS_CARD "NET_GPRS" +#define NETCLASS_MESSAGE_SERVER "NET_MSGSRV" // Packet fields // not honestly thrilled with having these be defines but kapu wants it that way @@ -35,6 +38,14 @@ /// Network Class of a device, used as part of ping replies. #define PACKET_NETCLASS "netclass" +// Special addresses +#define NET_ADDRESS_PING "ping" + +// Standard Commands +#define NET_COMMAND_PING_REPLY "ping_reply" + +// PDA Text Message +#define NETCMD_PDAMESSAGE "pda_message" // Dataterminal connection/disconnect return values @@ -47,6 +58,9 @@ /// Connection rejected, Not sharing a turf (???) #define NETJACK_CONNECT_NOTSAMETURF 2 +/// Data Terminal not found. +#define NETJACK_CONNECT_NOT_FOUND 3 + // receive_signal return codes /// Packet fully handled by parent @@ -54,3 +68,19 @@ /// Packet needs additional handling #define RECEIVE_SIGNAL_CONTINUE FALSE +// ----- +// Inviolability flags + +/// Packet contains volatile data where storing it may cause GC issues. +/// This means references to atoms, non-trivial datums like virtualspeakers, etc. +#define MAGIC_DATA_MUST_DISCARD (1<<0) + +/// Packet contains data that players should never be able to see *DIRECTLY*. +/// Re-Interpretation is allowed, This is specifically for arbitrary packet capture applications where raw fields are accessible. +/// For example, voice signal packets, or stuff that wouldn't make sense to be parsable as raw text. +#define MAGIC_DATA_MUST_OBFUSCATE (1<<1) + +/// All protection flags at once. +#define MAGIC_DATA_INVIOLABLE ALL + +#define PACKET_STRING_FILE "packetnet.json" diff --git a/code/__DEFINES/pain.dm b/code/__DEFINES/pain.dm new file mode 100644 index 000000000000..f4493376ec2f --- /dev/null +++ b/code/__DEFINES/pain.dm @@ -0,0 +1,38 @@ +/// Chance to drop your held item passed here +#define PAIN_THRESHOLD_DROP_ITEM 50 +/// Chance to reduce paralysis duration passed here +#define PAIN_THRESHOLD_REDUCE_PARALYSIS 10 +/// Stage at +#define SHOCK_MIN_PAIN_TO_BEGIN 30 + +/// Maximum shock stage value +#define SHOCK_MAXIMUM 160 + +#define SHOCK_TIER_1 10 +#define SHOCK_TIER_2 30 +#define SHOCK_TIER_3 40 +#define SHOCK_TIER_4 60 +#define SHOCK_TIER_5 80 +#define SHOCK_TIER_6 120 +#define SHOCK_TIER_7 150 + +/// The amount of shock required for someone to be elligible for shock-induced fibrillation +#define SHOCK_AMT_FOR_FIBRILLATION 120 + +/// The amount of pain where the mob is rendered unconscious +#define PAIN_AMT_PASSOUT (200) + +/// The amount of pain where movement slowdown beings +#define PAIN_AMT_BEGIN_SLOWDOWN (PAIN_AMT_PASSOUT * 0.075) +#define PAIN_MAX_SLOWDOWN 5 + +#define PAIN_AMT_LOW (PAIN_AMT_PASSOUT * 0.05) +#define PAIN_AMT_MEDIUM (PAIN_AMT_PASSOUT * 0.35) +#define PAIN_AMT_AGONIZING (PAIN_AMT_PASSOUT * 0.85) + +/// max_damage * this value is the amount of pain constantly applied when the limb bone is broken +#define BROKEN_BONE_PAIN_FACTOR 0.1 +/// max_damage * this value is the amount of pain constantly applied when the limb is dislocated +#define DISLOCATED_LIMB_PAIN_FACTOR 0.05 +/// The amount of pain applied immediately when a bone breaks +#define BONE_BREAK_APPLICATION_PAIN 60 diff --git a/code/__DEFINES/paint.dm b/code/__DEFINES/paint.dm index 4ff98527924c..9c2144f203ed 100644 --- a/code/__DEFINES/paint.dm +++ b/code/__DEFINES/paint.dm @@ -1,13 +1,17 @@ // Macros for all the paint helpers //Daedalus Industries -#define PAINT_WALL_DAEDALUS "#e9ca9b" -#define PAINT_STRIPE_DAEDALUS "#7e5c3a" +#define PAINT_WALL_DAEDALUS "#706149" +#define PAINT_STRIPE_DAEDALUS "#4b443d" //Priapus Recreational Solutions #define PAINT_WALL_PRIAPUS "#74b274" #define PAINT_STRIPE_PRIAPUS PAINT_STRIPE_DAEDALUS +//Mars Executive Outcomes +#define PAINT_WALL_MARS PAINT_WALL_DAEDALUS +#define PAINT_STRIPE_MARSEXECUTIVE "#683822" + //Medical #define PAINT_WALL_MEDICAL "#FFFFFF" #define PAINT_STRIPE_MEDICAL "#FFFFFF" diff --git a/code/__DEFINES/particles.dm b/code/__DEFINES/particles.dm new file mode 100644 index 000000000000..e3a872570cfb --- /dev/null +++ b/code/__DEFINES/particles.dm @@ -0,0 +1,13 @@ +// /obj/effect/abstract/particle_holder/var/particle_flags +// Flags that effect how a particle holder displays something + +/// If we're inside something inside a mob, display off that mob too +#define PARTICLE_ATTACH_MOB (1<<0) + +// Defines for debris iconstates +#define DEBRIS_SPARKS "spark" +#define DEBRIS_WOOD "wood" +#define DEBRIS_ROCK "rock" +#define DEBRIS_GLASS "glass" +#define DEBRIS_LEAF "leaf" +#define DEBRIS_SNOW "snow" diff --git a/code/__DEFINES/path.dm b/code/__DEFINES/path.dm new file mode 100644 index 000000000000..17e73d4c3824 --- /dev/null +++ b/code/__DEFINES/path.dm @@ -0,0 +1,19 @@ +// Define set that decides how an atom will be scanned for astar things +/// If set, we make the assumption that CanAStarPass() will NEVER return FALSE unless density is true +#define CANASTARPASS_DENSITY 0 +/// If this is set, we bypass density checks and always call the proc +#define CANASTARPASS_ALWAYS_PROC 1 + +/** + * 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. + * We do early next.density check despite it being already checked in LinkBlockedWithAccess for short-circuit performance + */ +#define CAN_STEP(cur_turf, next, simulated_only, pass_info, avoid) (next && (next != avoid) && !next.density && !(simulated_only && isspaceturf(next)) && !cur_turf.LinkBlockedWithAccess(next, pass_info)) +/// 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), simulated_only, pass_info, avoid) && CAN_STEP(cur_turf, get_step(cur_turf, dirB), simulated_only, pass_info, avoid))) + +#define DIAGONAL_DO_NOTHING NONE +#define DIAGONAL_REMOVE_ALL 1 +#define DIAGONAL_REMOVE_CLUNKY 2 diff --git a/code/__DEFINES/plumbing.dm b/code/__DEFINES/plumbing.dm deleted file mode 100644 index 9666a5be1e16..000000000000 --- a/code/__DEFINES/plumbing.dm +++ /dev/null @@ -1,9 +0,0 @@ -#define FIRST_DUCT_LAYER 1 -#define SECOND_DUCT_LAYER 2 -#define THIRD_DUCT_LAYER 4 -#define FOURTH_DUCT_LAYER 8 -#define FIFTH_DUCT_LAYER 16 - -#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER - -#define MACHINE_REAGENT_TRANSFER 10 //the default max plumbing machinery transfers diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index e714587e0d4a..4df41495b2a7 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -1,9 +1,3 @@ -#define CABLE_LAYER_1 (1<<0) -#define CABLE_LAYER_2 (1<<1) -#define CABLE_LAYER_3 (1<<2) - -#define MACHINERY_LAYER_1 1 - #define SOLAR_TRACK_OFF 0 #define SOLAR_TRACK_TIMED 1 #define SOLAR_TRACK_AUTO 2 diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm index 60afc17d0494..051bd733ea58 100644 --- a/code/__DEFINES/preferences.dm +++ b/code/__DEFINES/preferences.dm @@ -120,3 +120,5 @@ #define PLAYTIME_HARDCORE_RANDOM 120 // 2 hours /// The time needed to unlock the gamer cloak in preferences #define PLAYTIME_VETERAN 300000 // 5,000 hours + +#define SPRITE_ACCESSORY_NONE "None" diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index e7012590bae8..f4a862373bf6 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -15,17 +15,19 @@ /// The caliber used by the [security auto-rifle][/obj/item/gun/ballistic/automatic/wt550]. #define CALIBER_46X30MM "4.6x30mm" /// The caliber used by the Nanotrasen Saber SMG, PP-95 SMG and Type U3 Uzi. Also used as the default caliber for pistols but only the stechkin APS machine pistol doesn't override it. -#define CALIBER_9MM "9mm" +#define CALIBER_9MM "9x19mm Parabellum" /// The caliber used as the default for ballistic guns. Only not overridden for the [surplus rifle][/obj/item/gun/ballistic/automatic/surplus]. -#define CALIBER_10MM "10mm" +#define CALIBER_10MM "10mm Auto" /// The caliber used by most revolver variants. -#define CALIBER_357 ".357" +#define CALIBER_357 ".357 Smith & Wesson" /// The caliber used by the detective's revolver. -#define CALIBER_38 ".38" +#define CALIBER_38 ".38 Special" /// The caliber used by the C-20r SMG, the tommygun, and the M1911 pistol. -#define CALIBER_45 ".45" -/// The caliber used by sniper rifles and the desert eagle. -#define CALIBER_50 ".50" +#define CALIBER_45 ".45 ACP" +/// The caliber used by the desert eagle. +#define CALIBER_50_PISTOL ".50 Action Express" +/// The caliber used by sniper rifles +#define CALIBER_50_RIFLE ".50 BMG" /// The caliber used by the gyrojet pistol. #define CALIBER_75 ".75" /// The caliber used by [one revolver variant][/obj/item/gun/ballistic/revolver/nagant]. @@ -35,7 +37,7 @@ /// The caliber used by bolt action rifles. #define CALIBER_A762 "a762" /// The caliber used by shotguns. -#define CALIBER_SHOTGUN "shotgun" +#define CALIBER_12GAUGE "12-gauge" /// The caliber used by grenade launchers. #define CALIBER_40MM "40mm" /// The caliber used by rocket launchers. diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index f4451e1b7e64..f7b7c7226af1 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -30,6 +30,12 @@ #define GC_QUEUE_HARDDELETE 3 //! short queue for things that hard delete instead of going thru the gc subsystem, this is purely so if they *can* softdelete, they will soft delete rather then wasting time with a hard delete. #define GC_QUEUE_COUNT 3 //! Number of queues, used for allocating the nested lists. Don't forget to increase this if you add a new queue stage +// Defines for the ssgarbage queue items +#define GC_QUEUE_ITEM_QUEUE_TIME 1 //! Time this item entered the queue +#define GC_QUEUE_ITEM_REF 2 //! Ref to the item +#define GC_QUEUE_ITEM_GCD_DESTROYED 3 //! Item's gc_destroyed var value. Used to detect ref reuse. +#define GC_QUEUE_ITEM_INDEX_COUNT 3 //! Number of item indexes, used for allocating the nested lists. Don't forget to increase this if you add a new queue item index + // Defines for the time an item has to get its reference cleaned before it fails the queue and moves to the next. #define GC_FILTER_QUEUE 1 SECONDS #define GC_CHECK_QUEUE 5 MINUTES @@ -47,7 +53,11 @@ #define QDELETED(X) (isnull(X) || QDELING(X)) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) -#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE) +// This is a bit hacky, we do it to avoid people relying on a return value for the macro +// If you need that you should use QDEL_IN_STOPPABLE instead +#define QDEL_IN(item, time) ; \ + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time); +#define QDEL_IN_STOPPABLE(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), (time) > GC_FILTER_QUEUE ? WEAKREF(item) : item), time, TIMER_STOPPABLE) #define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME) #define QDEL_NULL(item) qdel(item); item = null #define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); } diff --git a/code/__DEFINES/quirks.dm b/code/__DEFINES/quirks.dm new file mode 100644 index 000000000000..3eef13598c16 --- /dev/null +++ b/code/__DEFINES/quirks.dm @@ -0,0 +1,15 @@ +//Medical Categories for quirks +#define CAT_QUIRK_ALL 0 +#define CAT_QUIRK_NOTES 1 +#define CAT_QUIRK_DISABILITIES 2 + +#define QUIRK_GENRE_BANE -1 +#define QUIRK_GENRE_NEUTRAL 0 +#define QUIRK_GENRE_BOON 1 + +/// This quirk can only be applied to humans +#define QUIRK_HUMAN_ONLY (1<<0) +/// This quirk processes on SSquirks (and should implement quirk process) +#define QUIRK_PROCESSES (1<<1) +/// This quirk is has a visual aspect in that it changes how the player looks. Used in generating dummies. +#define QUIRK_CHANGES_APPEARANCE (1<<2) diff --git a/code/__DEFINES/radio.dm b/code/__DEFINES/radio.dm index a003d0a9a658..eb92bf3f7829 100644 --- a/code/__DEFINES/radio.dm +++ b/code/__DEFINES/radio.dm @@ -2,18 +2,18 @@ //say based modes like binary are in living/say.dm -#define RADIO_CHANNEL_COMMON "Common" +#define RADIO_CHANNEL_COMMON "Local" #define RADIO_KEY_COMMON ";" -#define RADIO_CHANNEL_SECURITY "Security" +#define RADIO_CHANNEL_SECURITY "Mars" #define RADIO_KEY_SECURITY "s" #define RADIO_TOKEN_SECURITY ":s" -#define RADIO_CHANNEL_ENGINEERING "Engineering" +#define RADIO_CHANNEL_ENGINEERING "Daedalus" #define RADIO_KEY_ENGINEERING "e" #define RADIO_TOKEN_ENGINEERING ":e" -#define RADIO_CHANNEL_COMMAND "Command" +#define RADIO_CHANNEL_COMMAND "Management" #define RADIO_KEY_COMMAND "c" #define RADIO_TOKEN_COMMAND ":c" @@ -21,11 +21,11 @@ #define RADIO_KEY_SCIENCE "n" #define RADIO_TOKEN_SCIENCE ":n" -#define RADIO_CHANNEL_MEDICAL "Medical" +#define RADIO_CHANNEL_MEDICAL "Aether" #define RADIO_KEY_MEDICAL "m" #define RADIO_TOKEN_MEDICAL ":m" -#define RADIO_CHANNEL_SUPPLY "Supply" +#define RADIO_CHANNEL_SUPPLY "Hermes" #define RADIO_KEY_SUPPLY "u" #define RADIO_TOKEN_SUPPLY ":u" @@ -106,6 +106,7 @@ #define RADIO_ATMOSIA "atmosia" #define RADIO_AIRLOCK "airlock" #define RADIO_MAGNETS "magnets" +#define RADIO_PDAMESSAGE "pdamessage" #define DEFAULT_SIGNALER_CODE 30 diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 276199dcebe7..3a9fe61ee9d5 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -13,8 +13,6 @@ #define AMOUNT_VISIBLE (1<<6) // For non-transparent containers that still have the general amount of reagents in them visible. #define NO_REACT (1<<7) // Applied to a reagent holder, the contents will not react with each other. #define REAGENT_HOLDER_INSTANT_REACT (1<<8) // Applied to a reagent holder, all of the reactions in the reagents datum will be instant. Meant to be used for things like smoke effects where reactions aren't meant to occur -///If the holder is "alive" (i.e. mobs and organs) - If this flag is applied to a holder it will cause reagents to split upon addition to the object -#define REAGENT_HOLDER_ALIVE (1<<9) // Is an open container for all intents and purposes. #define OPENCONTAINER (REFILLABLE | DRAINABLE | TRANSPARENT) @@ -22,14 +20,16 @@ // Reagent exposure methods. /// Used for splashing. #define TOUCH (1<<0) -/// Used for ingesting the reagents. Food, drinks, inhaling smoke. -#define INGEST (1<<1) -/// Used by foams, sprays, and blob attacks. -#define VAPOR (1<<2) -/// Used by medical patches and gels. -#define PATCH (1<<3) -/// Used for direct injection of reagents. -#define INJECT (1<<4) +/// Used for vapors +#define VAPOR (1<<1) +/// When you be eating da reagent +#define INGEST (1<<2) +/// Direct into the blood stream +#define INJECT (1<<3) + +#define CHEM_BLOOD 1 +#define CHEM_INGEST 2 +#define CHEM_TOUCH 3 #define MIMEDRINK_SILENCE_DURATION 30 //ends up being 60 seconds given 1 tick every 2 seconds ///Health threshold for synthflesh and rezadone to unhusk someone @@ -60,7 +60,7 @@ #define CHEMICAL_QUANTISATION_LEVEL 0.0001 ///The smallest amount of volume allowed - prevents tiny numbers #define CHEMICAL_VOLUME_MINIMUM 0.001 -///Round to this, to prevent extreme decimal magic and to keep reagent volumes in line with perceived values. +//Sanity check limit to clamp chems to sane amounts and prevent rounding errors during transfer. #define CHEMICAL_VOLUME_ROUNDING 0.01 ///Default pH for reagents datum #define CHEMICAL_NORMAL_PH 7.000 @@ -71,7 +71,7 @@ #define REAGENT_STANDARD_PURITY 0.75 //reagent bitflags, used for altering how they works -///allows on_mob_dead() if present in a dead body +///Can process in dead mobs. #define REAGENT_DEAD_PROCESS (1<<0) ///Do not split the chem at all during processing - ignores all purity effects #define REAGENT_DONOTSPLIT (1<<1) @@ -81,32 +81,23 @@ #define REAGENT_SNEAKYNAME (1<<3) ///Retains initial volume of chem when splitting for purity effects #define REAGENT_SPLITRETAINVOL (1<<4) -///Lets a given reagent be synthesized important for random reagents and things like the odysseus syringe gun(Replaces the old can_synth variable) -#define REAGENT_CAN_BE_SYNTHESIZED (1<<5) -///Allows a reagent to work on a mob regardless of stasis -#define REAGENT_IGNORE_STASIS (1<<6) +///Any reagent marked with this cannot be put in random objects like eggs +#define REAGENT_SPECIAL (1<<5) ///This reagent won't be used in most randomized recipes. Meant for reagents that could be synthetized but are normally inaccessible or TOO hard to get. -#define REAGENT_NO_RANDOM_RECIPE (1<<7) +#define REAGENT_NO_RANDOM_RECIPE (1<<6) ///Does this reagent clean things? -#define REAGENT_CLEANS (1<<8) - +#define REAGENT_CLEANS (1<<7) +///Uses a fixed metabolization rate that isn't reliant on mob size +#define REAGENT_IGNORE_MOB_SIZE (1<<8) //Chemical reaction flags, for determining reaction specialties -///Convert into impure/pure on reaction completion -#define REACTION_CLEAR_IMPURE (1<<0) -///Convert into inverse on reaction completion when purity is low enough -#define REACTION_CLEAR_INVERSE (1<<1) -///Clear converted chems retain their purities/inverted purities. Requires 1 or both of the above. -#define REACTION_CLEAR_RETAIN (1<<2) ///Used to create instant reactions -#define REACTION_INSTANT (1<<3) +#define REACTION_INSTANT (1<<1) ///Used to force reactions to create a specific amount of heat per 1u created. So if thermic_constant = 5, for 1u of reagent produced, the heat will be forced up arbitarily by 5 irresepective of other reagents. If you use this, keep in mind standard thermic_constant values are 100x what it should be with this enabled. -#define REACTION_HEAT_ARBITARY (1<<4) +#define REACTION_HEAT_ARBITARY (1<<2) ///Used to bypass the chem_master transfer block (This is needed for competitive reactions unless you have an end state programmed). More stuff might be added later. When defining this, please add in the comments the associated reactions that it competes with -#define REACTION_COMPETITIVE (1<<5) -///Used to force pH changes to be constant regardless of volume -#define REACTION_PH_VOL_CONSTANT (1<<6) +#define REACTION_COMPETITIVE (1<<3) ///If a reaction will generate it's impure/inverse reagents in the middle of a reaction, as apposed to being determined on ingestion/on reaction completion -#define REACTION_REAL_TIME_SPLIT (1<<7) +#define REACTION_REAL_TIME_SPLIT (1<<4) ///Used for overheat_temp - This sets the overheat so high it effectively has no overheat temperature. #define NO_OVERHEAT 99999 @@ -120,69 +111,18 @@ #define MAX_ADDICTION_POINTS 1000 ///Addiction start/ends -#define WITHDRAWAL_STAGE1_START_CYCLE 60 -#define WITHDRAWAL_STAGE1_END_CYCLE 120 -#define WITHDRAWAL_STAGE2_START_CYCLE 121 -#define WITHDRAWAL_STAGE2_END_CYCLE 180 -#define WITHDRAWAL_STAGE3_START_CYCLE 181 - -///reagent tags - used to look up reagents for specific effects. Feel free to add to but comment it -/// This reagent does brute effects (BOTH damaging and healing) -#define REACTION_TAG_BRUTE (1<<0) -/// This reagent does burn effects (BOTH damaging and healing) -#define REACTION_TAG_BURN (1<<1) -/// This reagent does toxin effects (BOTH damaging and healing) -#define REACTION_TAG_TOXIN (1<<2) -/// This reagent does oxy effects (BOTH damaging and healing) -#define REACTION_TAG_OXY (1<<3) -/// This reagent does clone effects (BOTH damaging and healing) -#define REACTION_TAG_CLONE (1<<4) -/// This reagent primarily heals, or it's supposed to be used for healing (in the case of c2 - they are healing) -#define REACTION_TAG_HEALING (1<<5) -/// This reagent primarily damages -#define REACTION_TAG_DAMAGING (1<<6) -/// This reagent explodes as a part of it's intended effect (i.e. not overheated/impure) -#define REACTION_TAG_EXPLOSIVE (1<<7) -/// This reagent does things that are unique and special -#define REACTION_TAG_OTHER (1<<8) -/// This reagent's reaction is dangerous to create (i.e. explodes if you fail it) -#define REACTION_TAG_DANGEROUS (1<<9) -/// This reagent's reaction is easy -#define REACTION_TAG_EASY (1<<10) -/// This reagent's reaction is difficult/involved -#define REACTION_TAG_MODERATE (1<<11) -/// This reagent's reaction is hard -#define REACTION_TAG_HARD (1<<12) -/// This reagent affects organs -#define REACTION_TAG_ORGAN (1<<13) -/// This reaction creates a drink reagent -#define REACTION_TAG_DRINK (1<<14) -/// This reaction has something to do with food -#define REACTION_TAG_FOOD (1<<15) -/// This reaction is a slime reaction -#define REACTION_TAG_SLIME (1<<16) -/// This reaction is a drug reaction -#define REACTION_TAG_DRUG (1<<17) -/// This reaction is a unique reaction -#define REACTION_TAG_UNIQUE (1<<18) -/// This reaction is produces a product that affects reactions -#define REACTION_TAG_CHEMICAL (1<<19) -/// This reaction is produces a product that affects plants -#define REACTION_TAG_PLANT (1<<20) -/// This reaction is produces a product that affects plants -#define REACTION_TAG_COMPETITIVE (1<<21) - -/// Below are defines used for reagent associated machines only -/// For the pH meter flashing method -#define ENABLE_FLASHING -1 -#define DISABLE_FLASHING 14 +#define WITHDRAWAL_STAGE1_START_CYCLE 600 //10 minutes +#define WITHDRAWAL_STAGE1_END_CYCLE 1200 +#define WITHDRAWAL_STAGE2_START_CYCLE 1201 // 20 minutes +#define WITHDRAWAL_STAGE2_END_CYCLE 2400 +#define WITHDRAWAL_STAGE3_START_CYCLE 2400 //40 minutes #define GOLDSCHLAGER_VODKA (10) #define GOLDSCHLAGER_GOLD (1) #define GOLDSCHLAGER_GOLD_RATIO (GOLDSCHLAGER_GOLD/(GOLDSCHLAGER_VODKA+GOLDSCHLAGER_GOLD)) -#define BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT 3 +#define BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT 6 #define BLASTOFF_DANCE_MOVES_PER_SUPER_MOVE 3 ///This is the center of a 1 degree deadband in which water will neither freeze to ice nor melt to liquid @@ -195,3 +135,10 @@ #define GRENADE_WIRED 2 /// Grenade is ready to be finished #define GRENADE_READY 3 + +#define DISPENSER_REAGENT_VALUE 0.2 + +// Chem cartridge defines +#define CARTRIDGE_VOLUME_LARGE 500 +#define CARTRIDGE_VOLUME_MEDIUM 250 +#define CARTRIDGE_VOLUME_SMALL 100 diff --git a/code/__DEFINES/records.dm b/code/__DEFINES/records.dm new file mode 100644 index 000000000000..2778a7833619 --- /dev/null +++ b/code/__DEFINES/records.dm @@ -0,0 +1,6 @@ +#define CRIMINAL_NONE "None" +#define CRIMINAL_INCARCERATED "Incarcerated" +#define CRIMINAL_WANTED "*Arrest*" +#define CRIMINAL_SUSPECT "Suspected" +#define CRIMINAL_PAROLE "Paroled" +#define CRIMINAL_DISCHARGED "Discharged" diff --git a/code/__DEFINES/research.dm b/code/__DEFINES/research.dm index 4594c7179a84..66d12aac451b 100644 --- a/code/__DEFINES/research.dm +++ b/code/__DEFINES/research.dm @@ -7,6 +7,7 @@ #define FABRICATOR_SCREEN_SEARCH 4 #define FABRICATOR_SCREEN_CATEGORYVIEW 5 #define FABRICATOR_SCREEN_MODIFY_MEMORY 6 +#define FABRICATOR_SCREEN_QUEUE 7 //! Department flags for designs. Defines which depfab can print what at roundstart #define DESIGN_FAB_SECURITY (1<<0) diff --git a/code/__DEFINES/robots.dm b/code/__DEFINES/robots.dm index 433e3d9087dc..d8aabb1e17c5 100644 --- a/code/__DEFINES/robots.dm +++ b/code/__DEFINES/robots.dm @@ -89,6 +89,13 @@ ///The Bot is allowed to have a pAI placed in control of it. #define BOT_MODE_PAI_CONTROLLABLE (1<<3) +DEFINE_BITFIELD(bot_mode_flags, list( + "BOT_MODE_ON" = BOT_MODE_ON, + "BOT_MODE_AUTOPATROL" = BOT_MODE_AUTOPATROL, + "BOT_MODE_REMOTE_ENABLED" = BOT_MODE_REMOTE_ENABLED, + "BOT_MODE_PAI_CONTROLLABLE" = BOT_MODE_PAI_CONTROLLABLE +)) + //Bot cover defines indicating the Bot's status ///The Bot's cover is open and can be modified/emagged by anyone. #define BOT_COVER_OPEN (1<<0) @@ -99,6 +106,13 @@ ///The Bot has been hacked by a Silicon, emagging them, but revertable. #define BOT_COVER_HACKED (1<<3) +DEFINE_BITFIELD(bot_cover_flags, list( + "BOT_COVER_OPEN" = BOT_COVER_OPEN, + "BOT_COVER_LOCKED" = BOT_COVER_LOCKED, + "BOT_COVER_EMAGGED" = BOT_COVER_EMAGGED, + "BOT_COVER_HACKED" = BOT_COVER_HACKED +)) + //Bot types /// Secutritrons (Beepsky) #define SEC_BOT "Securitron" @@ -177,6 +191,14 @@ ///Whether we will stun & cuff or endlessly stun #define SECBOT_HANDCUFF_TARGET (1<<4) +DEFINE_BITFIELD(security_mode_flags, list( + "SECBOT_DECLARE_ARRESTS" = SECBOT_DECLARE_ARRESTS, + "SECBOT_CHECK_IDS" = SECBOT_CHECK_IDS, + "SECBOT_CHECK_WEAPONS" = SECBOT_CHECK_WEAPONS, + "SECBOT_CHECK_RECORDS" = SECBOT_CHECK_RECORDS, + "SECBOT_HANDCUFF_TARGET" = SECBOT_HANDCUFF_TARGET, +)) + //MedBOT defines ///Whether to declare if someone (we are healing) is in critical condition #define MEDBOT_DECLARE_CRIT (1<<0) @@ -184,3 +206,22 @@ #define MEDBOT_STATIONARY_MODE (1<<1) ///Whether the bot will randomly speak from time to time. This will not actually prevent all speech. #define MEDBOT_SPEAK_MODE (1<<2) + +DEFINE_BITFIELD(medical_mode_flags, list( + "MEDBOT_DECLARE_CRIT" = MEDBOT_DECLARE_CRIT, + "MEDBOT_STATIONARY_MODE" = MEDBOT_STATIONARY_MODE, + "MEDBOT_SPEAK_MODE" = MEDBOT_SPEAK_MODE, +)) + +//cleanBOT defines on what to clean +#define CLEANBOT_CLEAN_BLOOD (1<<0) +#define CLEANBOT_CLEAN_TRASH (1<<1) +#define CLEANBOT_CLEAN_PESTS (1<<2) +#define CLEANBOT_CLEAN_DRAWINGS (1<<3) + +DEFINE_BITFIELD(janitor_mode_flags, list( + "CLEANBOT_CLEAN_BLOOD" = CLEANBOT_CLEAN_BLOOD, + "CLEANBOT_CLEAN_TRASH" = CLEANBOT_CLEAN_TRASH, + "CLEANBOT_CLEAN_PESTS" = CLEANBOT_CLEAN_PESTS, + "CLEANBOT_CLEAN_DRAWINGS" = CLEANBOT_CLEAN_DRAWINGS, +)) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index f2fb5f291d7e..5cee5a543b4a 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -63,8 +63,6 @@ #define ROLE_POSIBRAIN "Posibrain" #define ROLE_DRONE "Drone" #define ROLE_DEATHSQUAD "Deathsquad" -#define ROLE_LAVALAND "Lavaland" - #define ROLE_POSITRONIC_BRAIN "Positronic Brain" #define ROLE_FREE_GOLEM "Free Golem" #define ROLE_SERVANT_GOLEM "Servant Golem" @@ -82,7 +80,6 @@ #define ROLE_ESCAPED_PRISONER "Escaped Prisoner" #define ROLE_LIFEBRINGER "Lifebringer" #define ROLE_ASHWALKER "Ash Walker" -#define ROLE_LAVALAND_SYNDICATE "Lavaland Syndicate" #define ROLE_HERMIT "Hermit" #define ROLE_BEACH_BUM "Beach Bum" #define ROLE_HOTEL_STAFF "Hotel Staff" @@ -90,7 +87,6 @@ #define ROLE_SYNDICATE_CYBERSUN "Cybersun Space Syndicate" //Ghost role syndi from Forgottenship ruin #define ROLE_SYNDICATE_CYBERSUN_CAPTAIN "Cybersun Space Syndicate Captain" //Forgottenship captain syndie #define ROLE_HEADSLUG_CHANGELING "Headslug Changeling" -#define ROLE_SPACE_PIRATE "Space Pirate" #define ROLE_ANCIENT_CREW "Ancient Crew" #define ROLE_SPACE_DOCTOR "Space Doctor" #define ROLE_SPACE_BARTENDER "Space Bartender" diff --git a/code/__DEFINES/rust_g.dm b/code/__DEFINES/rust_g.dm index cab4430a88df..5404cebed97e 100644 --- a/code/__DEFINES/rust_g.dm +++ b/code/__DEFINES/rust_g.dm @@ -110,9 +110,15 @@ #define rustg_dmi_strip_metadata(fname) RUSTG_CALL(RUST_G, "dmi_strip_metadata")(fname) #define rustg_dmi_create_png(path, width, height, data) RUSTG_CALL(RUST_G, "dmi_create_png")(path, width, height, data) #define rustg_dmi_resize_png(path, width, height, resizetype) RUSTG_CALL(RUST_G, "dmi_resize_png")(path, width, height, resizetype) +/** + * input: must be a path, not an /icon; you have to do your own handling if it is one, as icon objects can't be directly passed to rustg. + * + * output: json_encode'd list. json_decode to get a flat list with icon states in the order they're in inside the .dmi + */ +#define rustg_dmi_icon_states(fname) RUSTG_CALL(RUST_G, "dmi_icon_states")(fname) #define rustg_file_read(fname) RUSTG_CALL(RUST_G, "file_read")(fname) -#define rustg_file_exists(fname) RUSTG_CALL(RUST_G, "file_exists")(fname) +#define rustg_file_exists(fname) (RUSTG_CALL(RUST_G, "file_exists")(fname) == "true") #define rustg_file_write(text, fname) RUSTG_CALL(RUST_G, "file_write")(text, fname) #define rustg_file_append(text, fname) RUSTG_CALL(RUST_G, "file_append")(text, fname) #define rustg_file_get_line_count(fname) text2num(RUSTG_CALL(RUST_G, "file_get_line_count")(fname)) @@ -123,7 +129,13 @@ #define text2file(text, fname) rustg_file_append(text, "[fname]") #endif +/// Returns the git hash of the given revision, ex. "HEAD". #define rustg_git_revparse(rev) RUSTG_CALL(RUST_G, "rg_git_revparse")(rev) + +/** + * Returns the date of the given revision in the format YYYY-MM-DD. + * Returns null if the revision is invalid. + */ #define rustg_git_commit_date(rev) RUSTG_CALL(RUST_G, "rg_git_commit_date")(rev) #define RUSTG_HTTP_METHOD_GET "get" @@ -158,8 +170,9 @@ #define rustg_time_milliseconds(id) text2num(RUSTG_CALL(RUST_G, "time_milliseconds")(id)) #define rustg_time_reset(id) RUSTG_CALL(RUST_G, "time_reset")(id) +/// Returns the timestamp as a string /proc/rustg_unix_timestamp() - return text2num(RUSTG_CALL(RUST_G, "unix_timestamp")()) + return RUSTG_CALL(RUST_G, "unix_timestamp")() #define rustg_raw_read_toml_file(path) json_decode(RUSTG_CALL(RUST_G, "toml_file_to_json")(path) || "null") diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index fa76bb5c0747..fc44fde7c73f 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -27,7 +27,6 @@ #define WHISPER_MODE "the type of whisper" #define MODE_WHISPER "whisper" -#define MODE_WHISPER_CRIT "whispercrit" #define MODE_DEPARTMENT "department" #define MODE_KEY_DEPARTMENT "h" @@ -58,6 +57,8 @@ #define MODE_CUSTOM_SAY_ERASE_INPUT "erase_input" +#define MODE_NO_QUOTE "no_quote" + //Spans. Robot speech, italics, etc. Applied in compose_message(). #define SPAN_ROBOT "robot" #define SPAN_YELL "yell" @@ -75,7 +76,11 @@ #define REDUCE_RANGE (1<<1) #define NOPASS (1<<2) -//Eavesdropping +/// Range to hear normal messages +#define MESSAGE_RANGE 7 +/// Range to hear whispers normally +#define WHISPER_RANGE 1 +/// Additional range to partially hear whispers #define EAVESDROP_EXTRA_RANGE 1 //how much past the specified message_range does the message get starred, whispering only /// How close intercoms can be for radio code use diff --git a/code/__DEFINES/scent.dm b/code/__DEFINES/scent.dm index 28039dbcb05c..4d0ab5459e33 100644 --- a/code/__DEFINES/scent.dm +++ b/code/__DEFINES/scent.dm @@ -3,3 +3,8 @@ #define SCENT_FRAGRANCE "fragrance" #define SCENT_HAZE "haze" #define SCENT_PLUME "plume" + +#define INTENSITY_SUBTLE 1 +#define INTENSITY_NORMAL 2 +#define INTENSITY_STRONG 3 +#define INTENSITY_OVERPOWERING 4 diff --git a/code/__DEFINES/slapcraft_defines.dm b/code/__DEFINES/slapcraft_defines.dm new file mode 100644 index 000000000000..b6fe3c9142dd --- /dev/null +++ b/code/__DEFINES/slapcraft_defines.dm @@ -0,0 +1,24 @@ +#define SLAPCRAFT_STEP(type) GLOB.slapcraft_steps[type] +#define SLAPCRAFT_RECIPE(type) GLOB.slapcraft_recipes[type] + +// Defines for ordering in which the recipe steps have to be done +// Step by step +#define SLAP_ORDER_STEP_BY_STEP 1 +// First and last have to be done in order, but the rest is freeform. +#define SLAP_ORDER_FIRST_AND_LAST 2 +// First has to be done in order, rest is freeform. +#define SLAP_ORDER_FIRST_THEN_FREEFORM 3 + +// General, default categories. +#define SLAP_CAT_MISC "Misc." +#define SLAP_SUBCAT_MISC "Misc." + +// Other categories and their subcategories +#define SLAP_CAT_PROCESSING "Processing" +#define SLAP_CAT_COMPONENTS "Components" +#define SLAP_CAT_WEAPONS "Weapons" +#define SLAP_CAT_TOOLS "Tools" +#define SLAP_CAT_ROBOTS "Robots" //currently empty, will be used for simple bots +#define SLAP_CAT_CLOTHING "Clothing" +#define SLAP_CAT_MEDICAL "Medical" +#define SLAP_CAT_RUSTIC "Rustic" diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 7730d0dbded2..b8327d326144 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -7,6 +7,13 @@ #define CHANNEL_AMBIENCE 1019 #define CHANNEL_BUZZ 1018 #define CHANNEL_TRAITOR 1017 +#define CHANNEL_BREATHING 1016 + +//THIS SHOULD ALWAYS BE THE LOWEST ONE! +//KEEP IT UPDATED +#define CHANNEL_HIGHEST_AVAILABLE 1015 + +#define MAX_INSTRUMENT_CHANNELS (128 * 6) ///Default range of a sound. #define SOUND_RANGE 17 @@ -20,13 +27,6 @@ ///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 INTERACTION_SOUND_RANGE_MODIFIER -3 @@ -82,16 +82,15 @@ #define SOUND_ENVIROMENT_PHASED list(1.8, 0.5, -1000, -4000, 0, 5, 0.1, 1, -15500, 0.007, 2000, 0.05, 0.25, 1, 1.18, 0.348, -5, 2000, 250, 0, 3, 100, 63) //"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_STANDARD_STATION SOUND_ENVIRONMENT_STONEROOM +#define SOUND_AREA_LARGE_ENCLOSED SOUND_ENVIRONMENT_HANGAR #define SOUND_AREA_SMALL_ENCLOSED SOUND_ENVIRONMENT_BATHROOM -#define SOUND_AREA_TUNNEL_ENCLOSED SOUND_ENVIRONMENT_STONEROOM +#define SOUND_AREA_TUNNEL_ENCLOSED SOUND_ENVIRONMENT_CAVE #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_ICEMOON SOUND_ENVIRONMENT_CAVE #define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY @@ -118,6 +117,7 @@ #define ANNOUNCER_DEFAULT "announce_default" #define ANNOUNCER_CENTCOM "announce_centcom" #define ANNOUNCER_ATTENTION "announce_attention" +#define ANNOUNCER_ALERT "announce_alert" /// Global list of all of our announcer keys. GLOBAL_LIST_INIT(announcer_keys, list( @@ -171,3 +171,10 @@ GLOBAL_LIST_INIT(announcer_keys, list( #define SFX_TREE_CHOP "tree_chop" #define SFX_ROCK_TAP "rock_tap" #define SFX_BREAK_BONE "break_bone" +#define SFX_PAINT "paint" +#define SFX_BLOCK_BIG_METAL "big_metal_block" + + +#define LOOPING_SOUND_DIRECT 1 +#define LOOPING_SOUND_NORMAL 2 +#define LOOPING_SOUND_LOCAL 3 diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index 7b31c5134e56..eb8ef225b86c 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -40,5 +40,5 @@ /world/Del() var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") if (debug_server) - call(debug_server, "auxtools_shutdown")() + call_ext(debug_server, "auxtools_shutdown")() . = ..() diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm index 20d17dd6cc50..48d6563c08aa 100644 --- a/code/__DEFINES/span.dm +++ b/code/__DEFINES/span.dm @@ -31,6 +31,7 @@ #define span_colossus(str) ("" + str + "") #define span_command_headset(str) ("" + str + "") #define span_comradio(str) ("" + str + "") +#define span_computertext(str) ("" + str + "") #define span_cult(str) ("" + str + "") #define span_cultbold(str) ("" + str + "") #define span_cultboldtalic(str) ("" + str + "") @@ -38,6 +39,7 @@ #define span_cultlarge(str) ("" + str + "") #define span_danger(str) ("" + str + "") #define span_deadsay(str) ("" + str + "") +#define span_debug(str) ("" + str + "") #define span_deconversion_message(str) ("" + str + "") #define span_drone(str) ("" + str + "") #define span_engradio(str) ("" + str + "") @@ -77,6 +79,7 @@ #define span_nicegreen(str) ("" + str + "") #define span_notice(str) ("" + str + "") #define span_noticealien(str) ("" + str + "") +#define span_obviousnotice(str) ("" + str + "") #define span_ooc(str) ("" + str + "") #define span_papyrus(str) ("" + str + "") #define span_phobia(str) ("" + str + "") @@ -106,6 +109,8 @@ #define span_smallnotice(str) ("" + str + "") #define span_smallnoticeital(str) ("" + str + "") #define span_spider(str) ("" + str + "") +#define span_statsbad(str) ("" + str + "") +#define span_statsgood(str) ("" + str + "") #define span_suicide(str) ("" + str + "") #define span_suppradio(str) ("" + str + "") #define span_subtle(str) ("" + str + "") @@ -122,3 +127,12 @@ // Spans that use embedded tgui components: // Sorted alphabetically #define span_tooltip(tip, main_text) ("" + main_text + "") + +// Generic color spans for good/bad etc +#define span_bad(str) ("" + str + "") +#define span_mild(str) ("" + str + "") +#define span_average(str) ("" + str + "") +#define span_good(str) ("" + str + "") + +// Codex +#define CODEX_LINK(str, entrytext) ("" + str + "") diff --git a/code/__DEFINES/spatial_gridmap.dm b/code/__DEFINES/spatial_gridmap.dm index ef66cbf37661..0023edd1f173 100644 --- a/code/__DEFINES/spatial_gridmap.dm +++ b/code/__DEFINES/spatial_gridmap.dm @@ -1,11 +1,13 @@ -///each cell in a spatial_grid is this many turfs in length and width +/// each cell in a spatial_grid is this many turfs in length and width (with world.max(x or y) being 255, 15 of these fit on each side of a z level) #define SPATIAL_GRID_CELLSIZE 17 -///Takes a coordinate, and spits out the spatial grid index (x or y) it's inside +/// Takes a coordinate, and spits out the spatial grid index (x or y) it's inside #define GET_SPATIAL_INDEX(coord) ROUND_UP((coord) / SPATIAL_GRID_CELLSIZE) +/// changes the cell_(x or y) vars on /datum/spatial_grid_cell to the x or y coordinate on the map for the LOWER LEFT CORNER of the grid cell. +/// index is from 1 to SPATIAL_GRID_CELLS_PER_SIDE +#define GRID_INDEX_TO_COORDS(index) ((((index) - 1) * SPATIAL_GRID_CELLSIZE) + 1) +/// number of grid cells per x or y side of all z levels. pass in world.maxx or world.maxy #define SPATIAL_GRID_CELLS_PER_SIDE(world_bounds) GET_SPATIAL_INDEX(world_bounds) -#define SPATIAL_GRID_CHANNELS 2 - //grid contents channels ///everything that is hearing sensitive is stored in this channel @@ -19,6 +21,8 @@ ///all atmos machines are stored in this channel (I'm sorry kyler) #define SPATIAL_GRID_CONTENTS_TYPE_ATMOS "spatial_grid_contents_type_atmos" +#define ALL_CONTENTS_OF_CELL(cell) (cell.hearing_contents | cell.client_contents | cell.atmos_contents | cell.radio_nonatmos_contents | cell.radio_atmos_contents) + ///whether movable is itself or containing something which should be in one of the spatial grid channels. #define HAS_SPATIAL_GRID_CONTENTS(movable) (movable.spatial_grid_key) @@ -47,3 +51,11 @@ if(!length(cell_contents_list)) {\ cell_contents_list = dummy_list; \ }; + +///remove from every list +#define GRID_CELL_REMOVE_ALL(cell, movable) \ + GRID_CELL_REMOVE(cell.hearing_contents, movable) \ + GRID_CELL_REMOVE(cell.client_contents, movable) \ + GRID_CELL_REMOVE(cell.atmos_contents, movable) \ + GRID_CELL_REMOVE(cell.radio_nonatmos_contents, movable) \ + GRID_CELL_REMOVE(cell.radio_atmos_contents, movable) diff --git a/code/__DEFINES/spooky_defines.dm b/code/__DEFINES/spooky_defines.dm new file mode 100644 index 000000000000..5de5edd00f77 --- /dev/null +++ b/code/__DEFINES/spooky_defines.dm @@ -0,0 +1,17 @@ +#define SPOOK_LEVEL_WEAK_POWERS 10 +#define SPOOK_LEVEL_MEDIUM_POWERS 30 +#define SPOOK_LEVEL_DESTRUCTIVE_POWERS 70 + +#define SPOOK_LEVEL_OBJECT_ROTATION SPOOK_LEVEL_WEAK_POWERS + +// Spook amounts +#define SPOOK_AMT_CORPSE 5 +#define SPOOK_AMT_BLOOD_SPLATTER 2 +#define SPOOK_AMT_BLOOD_STREAK 1 +#define SPOOK_AMT_BLOOD_DROP 0.5 + +#define RECORD_GHOST_POWER(power) \ + do {\ + var/area/A = get_area(power.owner); \ + SSblackbox.record_feedback("nested tally", "ghost_power_used", 1, list(A?.name || "NULL", power.name)); \ + } while (FALSE) diff --git a/code/__DEFINES/stamina.dm b/code/__DEFINES/stamina.dm index 107897bb7dcb..e77a7dc3a892 100644 --- a/code/__DEFINES/stamina.dm +++ b/code/__DEFINES/stamina.dm @@ -70,4 +70,4 @@ ///The amount of stamina required to sprint #define STAMINA_MIN2SPRINT_MODIFER 0.4 //Same as exhaustion threshold ///How much stamina is taken per tile while sprinting -#define STAMINA_SPRINT_COST 6 +#define STAMINA_SPRINT_COST 4 diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm index 9ad1a9b300af..ac465c0a32e2 100644 --- a/code/__DEFINES/stat.dm +++ b/code/__DEFINES/stat.dm @@ -4,15 +4,16 @@ //mob/var/stat things #define CONSCIOUS 0 -#define SOFT_CRIT 1 -#define UNCONSCIOUS 2 -#define HARD_CRIT 3 -#define DEAD 4 +#define UNCONSCIOUS 1 +#define DEAD 2 //Health Defines -#define HEALTH_THRESHOLD_CRIT 0 //! Soft crit -#define HEALTH_THRESHOLD_FULLCRIT -100 //! Hard crit -#define HEALTH_THRESHOLD_DEAD -200 +#define HEALTH_THRESHOLD_CRIT 100 //! Soft crit +#define HEALTH_THRESHOLD_FULLCRIT 0 //! Hard crit +#define HEALTH_THRESHOLD_DEAD 0 + +/// The amount of damage a mob can take past that which would kill it, per damage type. +#define HEALTH_OVERKILL_DAMAGE_PER_TYPE 0 #define HEALTH_THRESHOLD_NEARDEATH -150 //Not used mechanically, but to determine if someone is so close to death they hear the other side @@ -21,11 +22,11 @@ ///The rate at which satiation decays per second. #define SATIETY_DECAY 0.2 //Max satiety lasts 25 minutes, 600 * 5 ///The rate at which satiation decays per second. -#define HUNGER_DECAY 0.04 +#define HUNGER_DECAY 0.004 ///How much hunger is lost on moving (walk) -#define HUNGER_LOSS_WALK 0.005 +#define HUNGER_LOSS_WALK 0.002 ///How much hunger is lost on moving (run) -#define HUNGER_LOSS_RUN 0.01 +#define HUNGER_LOSS_RUN 0.005 #define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second #define REAGENTS_METABOLISM 0.2 //How many units of reagent are consumed per second, by default. diff --git a/code/__DEFINES/stat_tracking.dm b/code/__DEFINES/stat_tracking.dm index 65246ecd5ece..c236a8037138 100644 --- a/code/__DEFINES/stat_tracking.dm +++ b/code/__DEFINES/stat_tracking.dm @@ -10,12 +10,56 @@ STAT_ENTRY[STAT_ENTRY_TIME] += STAT_TIME;\ STAT_ENTRY[STAT_ENTRY_COUNT] += 1; -// Cost tracking macros, to be used in one proc -// The static lists are under the assumption that costs and counting are global lists, and will therefor -// Break during world init +// Cost tracking macros, to be used in one proc. If you're using this raw you'll want to use global lists +// If you don't you'll need another way of reading it #define INIT_COST(costs, counting) \ var/list/_costs = costs; \ var/list/_counting = counting; \ - var/usage = TICK_USAGE; + var/_usage = TICK_USAGE; +// STATIC cost tracking macro. Uses static lists instead of the normal global ones +// Good for debug stuff, and for running before globals init +#define INIT_COST_STATIC(...) \ + var/static/list/hidden_static_list_for_fun1 = list(); \ + var/static/list/hidden_static_list_for_fun2 = list(); \ + INIT_COST(hidden_static_list_for_fun1, hidden_static_list_for_fun2) +// Cost tracking macro for global lists, prevents erroring if GLOB has not yet been initialized +#define INIT_COST_GLOBAL(costs, counting) \ + INIT_COST_STATIC() \ + if(GLOB){\ + costs = hidden_static_list_for_fun1; \ + counting = hidden_static_list_for_fun2 ; \ + } \ + _usage = TICK_USAGE; + + +#define SET_COST(category) \ + do { \ + var/_cost = TICK_USAGE; \ + _costs[category] += TICK_DELTA_TO_MS(_cost - _usage);\ + _counting[category] += 1; \ + } while(FALSE); \ + _usage = TICK_USAGE; + +#define SET_COST_LINE(...) SET_COST("[__LINE__]") + +/// A quick helper for running the code as a statement and profiling its cost. +/// For example, `SET_COST_STMT(var/x = do_work())` +#define SET_COST_STMT(code...) ##code; SET_COST("[__LINE__] - [#code]") + +#define EXPORT_STATS_TO_CSV_LATER(filename, costs, counts) EXPORT_STATS_TO_FILE_LATER(filename, costs, counts, stat_tracking_export_to_csv_later) + +#define EXPORT_STATS_TO_FILE_LATER(filename, costs, counts, proc) \ + do { \ + var/static/last_export = 0; \ + if (world.time - last_export > 1.1 SECONDS) { \ + last_export = world.time; \ + /* spawn() is used here because this is often used to track init times, where timers act oddly. */ \ + /* I was making timers and even after init times were complete, the timers didn't run :shrug: */ \ + spawn (1 SECONDS) { \ + ##proc(filename, costs, counts); \ + } \ + } \ + } while (FALSE); \ + _usage = TICK_USAGE; diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index dce92503ba65..7f22ae63eeeb 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -39,3 +39,71 @@ #define STASIS_ASCENSION_EFFECT "heretic_ascension" +#define STASIS_BODYBAG_EFFECT "stasis_bodybag" + +#define STASIS_DEBUG_HEALTH "stasis_debug_health" + +// Status effect application helpers. +// These are macros for easier use of adjust_timed_status_effect and set_timed_status_effect. +// +// adjust_x: +// - Adds duration to a status effect +// - Removes duration if a negative duration is passed. +// - Ex: adjust_stutter(10 SECONDS) adds ten seconds of stuttering. +// - Ex: adjust_jitter(-5 SECONDS) removes five seconds of jittering, or just removes jittering if less than five seconds exist. +// +// adjust_x_up_to: +// - Will only add (or remove) duration of a status effect up to the second parameter +// - If the duration will result in going beyond the second parameter, it will stop exactly at that parameter +// - The second parameter cannot be negative. +// - Ex: adjust_stutter_up_to(20 SECONDS, 10 SECONDS) adds ten seconds of stuttering. +// +// set_x: +// - Set the duration of a status effect to the exact number. +// - Setting duration to zero seconds is effectively the same as just using remove_status_effect, or qdelling the effect. +// - Ex: set_stutter(10 SECONDS) sets the stuttering to ten seconds, regardless of whether they had more or less existing stutter. +// +// set_x_if_lower: +// - Will only set the duration of that effect IF any existing duration is lower than what was passed. +// - Ex: set_stutter_if_lower(10 SECONDS) will set stuttering to ten seconds if no stuttering or less than ten seconds of stuttering exists +// - Ex: set_jitter_if_lower(20 SECONDS) will do nothing if more than twenty seconds of jittering already exists + +#define adjust_stutter(duration) adjust_timed_status_effect(duration, /datum/status_effect/speech/stutter) +#define adjust_stutter_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/speech/stutter, up_to) +#define set_stutter(duration) set_timed_status_effect(duration, /datum/status_effect/speech/stutter) +#define set_stutter_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/speech/stutter, TRUE) + +#define adjust_derpspeech(duration) adjust_timed_status_effect(duration, /datum/status_effect/speech/stutter/derpspeech) +#define adjust_derpspeech_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/speech/stutter/derpspeech, up_to) +#define set_derpspeech(duration) set_timed_status_effect(duration, /datum/status_effect/speech/stutter/derpspeech) +#define set_derpspeech_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/speech/stutter/derpspeech, TRUE) + +#define adjust_slurring(duration) adjust_timed_status_effect(duration, /datum/status_effect/speech/slurring/generic) +#define adjust_slurring_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/speech/slurring/generic, up_to) +#define set_slurring(duration) set_timed_status_effect(duration, /datum/status_effect/speech/slurring/generic) +#define set_slurring_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/speech/slurring/generic, TRUE) + +#define adjust_dizzy(duration) adjust_timed_status_effect(duration, /datum/status_effect/dizziness) +#define adjust_dizzy_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/dizziness, up_to) +#define set_dizzy(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness) +#define set_dizzy_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/dizziness, TRUE) + +#define adjust_jitter(duration) adjust_timed_status_effect(duration, /datum/status_effect/jitter) +#define adjust_jitter_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/jitter, up_to) +#define set_jitter(duration) set_timed_status_effect(duration, /datum/status_effect/jitter) +#define set_jitter_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/jitter, TRUE) + +#define adjust_confusion(duration) adjust_timed_status_effect(duration, /datum/status_effect/confusion) +#define adjust_confusion_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/confusion, up_to) +#define set_confusion(duration) set_timed_status_effect(duration, /datum/status_effect/confusion) +#define set_confusion_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/confusion, TRUE) + +#define adjust_drugginess(duration) adjust_timed_status_effect(duration, /datum/status_effect/drugginess) +#define adjust_drugginess_up_to(duration, up_to) adjust_timed_status_effect(duration, /datum/status_effect/drugginess, up_to) +#define set_drugginess(duration) set_timed_status_effect(duration, /datum/status_effect/drugginess) +#define set_drugginess_if_lower(duration) set_timed_status_effect(duration, /datum/status_effect/drugginess, TRUE) + +#define adjust_pacifism(duration) adjust_timed_status_effect(/datum/status_effect/pacify, duration) +#define set_pacifism(duration) set_timed_status_effect(/datum/status_effect/pacify, duration) + + diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 44761f6dad45..c32b11189cc8 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -98,7 +98,7 @@ ///type and all subtypes should always immediately call Initialize in New() #define INITIALIZE_IMMEDIATE(X) ##X/New(loc, ...){\ ..();\ - if(!(flags_1 & INITIALIZED_1)) {\ + if(!(initialized)) {\ var/previous_initialized_value = SSatoms.initialized;\ SSatoms.initialized = INITIALIZATION_INNEW_MAPLOAD;\ args[1] = TRUE;\ @@ -123,30 +123,34 @@ #define INIT_ORDER_SOUNDS 83 #define INIT_ORDER_INSTRUMENTS 82 #define INIT_ORDER_GREYSCALE 81 -#define INIT_ORDER_VIS 80 +#define INIT_ORDER_VIS 79 #define INIT_ORDER_DISCORD 78 #define INIT_ORDER_ACHIEVEMENTS 77 #define INIT_ORDER_STATION 74 //This is high priority because it manipulates a lot of the subsystems that will initialize after it. #define INIT_ORDER_QUIRKS 73 -#define INIT_ORDER_REAGENTS 72 //HAS to be before mapping and assets - both create objects, which creates reagents, which relies on lists made in this subsystem +#define INIT_ORDER_MATERIALS 72 //HAS to be before reagents, reagents have materials +#define INIT_ORDER_REAGENTS 71 //HAS to be before mapping and assets - both create objects, which creates reagents, which relies on lists made in this subsystem #define INIT_ORDER_EVENTS 70 -#define INIT_ORDER_IDACCESS 66 -#define INIT_ORDER_JOBS 65 // Must init before atoms, to set up properly the dynamic job lists. -#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_IDACCESS 68 +#define INIT_ORDER_JOBS 67 // Must init before atoms, to set up properly the dynamic job lists. +#define INIT_ORDER_AI_MOVEMENT 66 //We need the movement setup +#define INIT_ORDER_MEDIA 64 //Needs to init before ticker to generate the login music pool +#define INIT_ORDER_DATACORE 63 // Must come before SSticker so datacore reading things can access it +#define INIT_ORDER_AI_CONTROLLERS 62 //So the controller can get the ref +#define INIT_ORDER_TICKER 61 #define INIT_ORDER_TCG 55 #define INIT_ORDER_MAPPING 50 -#define INIT_ORDER_EARLY_ASSETS 48 +#define INIT_ORDER_EARLY_ASSETS 49 #define INIT_ORDER_RESEARCH 47 #define INIT_ORDER_TIMETRACK 46 #define INIT_ORDER_NETWORKS 45 #define INIT_ORDER_SPATIAL_GRID 43 #define INIT_ORDER_ECONOMY 40 -#define INIT_ORDER_OUTPUTS 35 -#define INIT_ORDER_RESTAURANT 34 +#define INIT_ORDER_OUTPUTS 36 +#define INIT_ORDER_RESTAURANT 35 #define INIT_ORDER_TECH 33 //Must init before atoms, so design datums are ready. #define INIT_ORDER_ATOMS 30 +#define INIT_ORDER_HOLOMAP 29 // Must init after atoms #define INIT_ORDER_LANGUAGE 25 #define INIT_ORDER_MACHINES 20 #define INIT_ORDER_AIRMACHINES 17 @@ -179,13 +183,14 @@ // If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child) /* Ticker bucket */ -#define FIRE_PRIORITY_INPUT 100 // This must always always be the max highest priority. Player input must never be lost. -#define FIRE_PRIORITY_TIMER 90 -#define FIRE_PRIORITY_SOUND_LOOPS 60 -#define FIRE_PRIORITY_MOUSE_ENTERED 50 -#define FIRE_PRIORITY_CHAT 40 -#define FIRE_PRIORITY_SPEECH_CONTROLLER 30 -#define FIRE_PRIORITY_RUNECHAT 25 +#define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. +#define FIRE_PRIORITY_DELAYED_VERBS 950 +#define FIRE_PRIORITY_TIMER 900 +#define FIRE_PRIORITY_SOUND_LOOPS 600 +#define FIRE_PRIORITY_MOUSE_ENTERED 500 +#define FIRE_PRIORITY_CHAT 400 +#define FIRE_PRIORITY_SPEECH_CONTROLLER 300 +#define FIRE_PRIORITY_RUNECHAT 250 #define FIRE_PRIORITY_THROWING 20 /* DEFAULT WOULD BE HERE */ #define FIRE_PRIORITY_SPACEDRIFT 15 @@ -193,13 +198,12 @@ #define FIRE_PRIORITY_DATABASE 5 /* Normal bucket */ -#define FIRE_PRIORITY_ASSETS 105 -#define FIRE_PRIORITY_EXPLOSIONS 100 #define FIRE_PRIORITY_STATPANEL 95 #define FIRE_PRIORITY_TGUI 90 #define FIRE_PRIORITY_TICKER 85 #define FIRE_PRIORITY_MOBS 80 #define FIRE_PRIORITY_STAMINA 75 +#define FIRE_PRIORITY_FLUIDS 72 #define FIRE_PRIORITY_PACKETS 70 #define FIRE_PRIORITY_AIRFLOW 70 #define FIRE_PRIORITY_INSTRUMENTS 65 @@ -210,10 +214,13 @@ #define FIRE_PRIORITY_AIRMACHINES 45 #define FIRE_PRIORITY_OBJ 40 #define FIRE_PRIORITY_NETWORKS 40 +#define FIRE_PRIORITY_PATHFINDING 37 #define FIRE_PRIOTITY_SMOOTHING 35 #define FIRE_PRIORITY_REAGENTS 30 +#define FIRE_PRIORITY_ACID 27 #define FIRE_PRIORITY_WET_FLOORS 25 #define FIRE_PRIORITY_VIS 20 +#define FIRE_PRIORITY_ASSETS 20 #define FIRE_PRIORITY_RESEARCH 15 #define FIRE_PRIORITY_SERVER_MAINT 10 #define FIRE_PRIORITY_PING 5 @@ -221,7 +228,6 @@ /* Background bucket */ #define FIRE_PRIORITY_PARALLAX 65 //DEFAULT WOULD BE HERE -#define FIRE_PRIORITY_ACID 40 #define FIRE_PRIOTITY_BURNING 40 #define FIRE_PRIORITY_PROCESS 30 #define FIRE_PRIORITY_NPC_ACTIONS 25 @@ -234,7 +240,6 @@ // SS runlevels -#define RUNLEVEL_INIT 0 #define RUNLEVEL_LOBBY 1 #define RUNLEVEL_SETUP 2 #define RUNLEVEL_GAME 4 @@ -279,6 +284,7 @@ * * 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 + * * timer_subsystem the subsystem to insert this timer into */ #define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) diff --git a/code/__DEFINES/surgery.dm b/code/__DEFINES/surgery.dm new file mode 100644 index 000000000000..f778136e0a1d --- /dev/null +++ b/code/__DEFINES/surgery.dm @@ -0,0 +1,23 @@ +#define SURGERY_NO_ROBOTIC (1<<0) +#define SURGERY_NO_STUMP (1<<1) +#define SURGERY_NO_FLESH (1<<2) +/// Bodypart needs an incision or small cut +#define SURGERY_NEEDS_INCISION (1<<3) +/// Bodypart needs retracted incision or large cut +#define SURGERY_NEEDS_RETRACTED (1<<4) +/// Bodypart needs a broken bone AND retracted incision or large cut +#define SURGERY_NEEDS_DEENCASEMENT (1<<5) +/// Surgery step bloodies gloves when necessary. +#define SURGERY_BLOODY_GLOVES (1<<6) +/// Surgery step bloodies gloves + suit when necessary. +#define SURGERY_BLOODY_BODY (1<<7) +/// Surgery does not use RNG. +#define SURGERY_CANNOT_FAIL (1<<8) + +/// Only one of this type of implant may be in a target +#define IMPLANT_HIGHLANDER (1<<0) +/// Shows implant name in body scanner +#define IMPLANT_KNOWN (1<<1) +/// Hides the implant from the body scanner completely +#define IMPLANT_HIDDEN (1<<2) + diff --git a/code/__DEFINES/tgs.dm b/code/__DEFINES/tgs.dm index d7f7deec743e..4766b3dfe661 100644 --- a/code/__DEFINES/tgs.dm +++ b/code/__DEFINES/tgs.dm @@ -1,19 +1,20 @@ // tgstation-server DMAPI +// The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in IETF RFC 2119. -#define TGS_DMAPI_VERSION "6.4.5" +#define TGS_DMAPI_VERSION "7.2.1" // All functions and datums outside this document are subject to change with any version and should not be relied on. // CONFIGURATION -/// Create this define if you want to do TGS configuration outside of this file. +/// Consumers SHOULD create this define if you want to do TGS configuration outside of this file. #ifndef TGS_EXTERNAL_CONFIGURATION -// Comment this out once you've filled in the below. +// Consumers MUST comment this out once you've filled in the below and are not using [TGS_EXTERNAL_CONFIGURATION]. #error TGS API unconfigured -// Uncomment this if you wish to allow the game to interact with TGS 3. -// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()() +// Consumers MUST uncomment this if you wish to allow the game to interact with TGS version 3. +// This will raise the minimum required security level of your game to TGS_SECURITY_TRUSTED due to it utilizing call()(). //#define TGS_V3_API // Required interfaces (fill in with your codebase equivalent): @@ -50,46 +51,55 @@ #endif +#ifndef TGS_FILE2TEXT_NATIVE +#ifdef file2text +#error Your codebase is re-defining the BYOND proc file2text. The DMAPI requires the native version to read the result of world.Export(). You SHOULD fix this by adding "#define TGS_FILE2TEXT_NATIVE file2text" before your override of file2text to allow the DMAPI to use the native version. This will only be used for world.Export(), not regular file accesses +#endif +#define TGS_FILE2TEXT_NATIVE file2text +#endif + // EVENT CODES -/// Before a reboot mode change, extras parameters are the current and new reboot mode enums +/// Before a reboot mode change, extras parameters are the current and new reboot mode enums. #define TGS_EVENT_REBOOT_MODE_CHANGE -1 -/// Before a port change is about to happen, extra parameters is new port +/// Before a port change is about to happen, extra parameters is new port. #define TGS_EVENT_PORT_SWAP -2 -/// Before the instance is renamed, extra parameter is the new name +/// Before the instance is renamed, extra parameter is the new name. #define TGS_EVENT_INSTANCE_RENAMED -3 -/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server +/// After the watchdog reattaches to DD, extra parameter is the new [/datum/tgs_version] of the server. #define TGS_EVENT_WATCHDOG_REATTACH -4 +/// When the watchdog sends a health check to DD. No parameters. +#define TGS_EVENT_HEALTH_CHECK -5 -/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA +/// When the repository is reset to its origin reference. Parameters: Reference name, Commit SHA. #define TGS_EVENT_REPO_RESET_ORIGIN 0 -/// When the repository performs a checkout. Parameters: Checkout git object +/// When the repository performs a checkout. Parameters: Checkout git object. #define TGS_EVENT_REPO_CHECKOUT 1 -/// When the repository performs a fetch operation. No parameters +/// When the repository performs a fetch operation. No parameters. #define TGS_EVENT_REPO_FETCH 2 -/// When the repository test merges. 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 +/// Before the repository makes a sychronize operation. Parameters: Absolute repostiory path. #define TGS_EVENT_REPO_PRE_SYNCHRONIZE 4 -/// Before a BYOND install operation begins. Parameters: [/datum/tgs_version] of the installing BYOND -#define TGS_EVENT_BYOND_INSTALL_START 5 -/// When a BYOND install operation fails. Parameters: Error message -#define TGS_EVENT_BYOND_INSTALL_FAIL 6 -/// When the active BYOND version changes. Parameters: (Nullable) [/datum/tgs_version] of the current BYOND, [/datum/tgs_version] of the new BYOND -#define TGS_EVENT_BYOND_ACTIVE_VERSION_CHANGE 7 -/// When the compiler starts running. Parameters: Game directory path, origin commit SHA +/// Before a engine install operation begins. Parameters: Version string of the installing engine. +#define TGS_EVENT_ENGINE_INSTALL_START 5 +/// When a engine install operation fails. Parameters: Error message +#define TGS_EVENT_ENGINE_INSTALL_FAIL 6 +/// When the active engine version changes. Parameters: (Nullable) Version string of the current engine, version string of the new engine. +#define TGS_EVENT_ENGINE_ACTIVE_VERSION_CHANGE 7 +/// When the compiler starts running. Parameters: Game directory path, origin commit SHA. #define TGS_EVENT_COMPILE_START 8 -/// When a compile is cancelled. No parameters +/// When a compile is cancelled. No parameters. #define TGS_EVENT_COMPILE_CANCELLED 9 -/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation +/// When a compile fails. Parameters: Game directory path, [TRUE]/[FALSE] based on if the cause for failure was DMAPI validation. #define TGS_EVENT_COMPILE_FAILURE 10 -/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path +/// When a compile operation completes. Note, this event fires before the new .dmb is loaded into the watchdog. Consider using the [TGS_EVENT_DEPLOYMENT_COMPLETE] instead. Parameters: Game directory path. #define TGS_EVENT_COMPILE_COMPLETE 11 -/// When an automatic update for the current instance begins. No parameters +/// When an automatic update for the current instance begins. No parameters. #define TGS_EVENT_INSTANCE_AUTO_UPDATE_START 12 -/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference +/// When the repository encounters a merge conflict: Parameters: Base SHA, target SHA, base reference, target reference. #define TGS_EVENT_REPO_MERGE_CONFLICT 13 -/// When a deployment completes. No Parameters +/// When a deployment completes. No Parameters. #define TGS_EVENT_DEPLOYMENT_COMPLETE 14 /// Before the watchdog shuts down. Not sent for graceful shutdowns. No parameters. #define TGS_EVENT_WATCHDOG_SHUTDOWN 15 @@ -104,11 +114,11 @@ #define TGS_EVENT_WORLD_PRIME 21 // DMAPI also doesnt implement this // #define TGS_EVENT_DREAM_DAEMON_LAUNCH 22 -/// After a single submodule update is performed. Parameters: Updated submodule name +/// After a single submodule update is performed. Parameters: Updated submodule name. #define TGS_EVENT_REPO_SUBMODULE_UPDATE 23 -/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, byond version +/// After CodeModifications are applied, before DreamMaker is run. Parameters: Game directory path, origin commit sha, version string of the used engine. #define TGS_EVENT_PRE_DREAM_MAKER 24 -/// Whenever a deployment folder is deleted from disk. Parameters: Game directory path +/// Whenever a deployment folder is deleted from disk. Parameters: Game directory path. #define TGS_EVENT_DEPLOYMENT_CLEANUP 25 // OTHER ENUMS @@ -120,6 +130,7 @@ /// The watchdog will restart on reboot. #define TGS_REBOOT_MODE_RESTART 2 +// Note that security levels are currently meaningless in OpenDream /// DreamDaemon Trusted security level. #define TGS_SECURITY_TRUSTED 0 /// DreamDaemon Safe security level. @@ -127,19 +138,32 @@ /// DreamDaemon Ultrasafe security level. #define TGS_SECURITY_ULTRASAFE 2 +/// DreamDaemon public visibility level. +#define TGS_VISIBILITY_PUBLIC 0 +/// DreamDaemon private visibility level. +#define TGS_VISIBILITY_PRIVATE 1 +/// DreamDaemon invisible visibility level. +#define TGS_VISIBILITY_INVISIBLE 2 + +/// The Build Your Own Net Dream engine. +#define TGS_ENGINE_TYPE_BYOND 0 +/// The OpenDream engine. +#define TGS_ENGINE_TYPE_OPENDREAM 1 + //REQUIRED HOOKS /** - * Call this somewhere in [/world/proc/New] that is always run. This function may sleep! + * Consumers MUST 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]. + * * http_handler - Optional user defined [/datum/tgs_http_handler]. */ -/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) +/world/proc/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler) return /** - * Call this when your initializations are complete and your game is ready to play before any player interactions happen. + * Consumers MUST call this when world initializations are complete and the 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 @@ -148,12 +172,10 @@ /world/proc/TgsInitializationComplete() return -/// Put this at the start of [/world/proc/Topic]. +/// Consumers MUST run this macro at the start of [/world/proc/Topic]. #define TGS_TOPIC var/tgs_topic_return = TgsTopic(args[1]); if(tgs_topic_return) return tgs_topic_return -/** - * Call this as late as possible in [world/proc/Reboot]. - */ +/// Consumers MUST call this as late as possible in [world/proc/Reboot] (BEFORE ..()). /world/proc/TgsReboot() return @@ -164,28 +186,28 @@ /datum/tgs_revision_information /// Full SHA of the commit. var/commit - /// ISO 8601 timestamp of when the commit was created + /// 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 /// Represents a version. /datum/tgs_version - /// The suite/major version number + /// The suite/major version number. var/suite - // This group of variables can be null to represent a wild card - /// The minor version number. null for wildcards + // This group of variables can be null to represent a wild card. + /// The minor version number. null for wildcards. var/minor - /// The patch version number. null for wildcards + /// The patch version number. null for wildcards. var/patch - /// Legacy version number. Generally null + /// Legacy version number. Generally null. var/deprecated_patch - /// Unparsed string value + /// Unparsed string value. var/raw_parameter - /// String value minus prefix + /// String value minus prefix. var/deprefixed_parameter /** @@ -231,67 +253,113 @@ var/is_admin_channel /// [TRUE]/[FALSE] if the channel is a private message channel for a [/datum/tgs_chat_user]. var/is_private_channel - /// Tag string associated with the channel in TGS + /// Tag string associated with the channel in TGS. var/custom_tag - /// [TRUE]/[FALSE] if the channel supports embeds + /// [TRUE]/[FALSE] if the channel supports embeds. var/embeds_supported // Represents a chat user /datum/tgs_chat_user /// TGS internal user ID. var/id - // The user's display name. + /// The user's display name. var/friendly_name - // The string to use to ping this user in a message. + /// The string to use to ping this user in a message. var/mention - /// The [/datum/tgs_chat_channel] the user was from + /// The [/datum/tgs_chat_channel] the user was from. var/datum/tgs_chat_channel/channel +/// User definable handler for TGS events This abstract version SHOULD be overridden to be used. +/datum/tgs_event_handler + /// If the handler receieves [TGS_EVENT_HEALTH_CHECK] events. + var/receive_health_checks = FALSE + /** * User definable callback for handling TGS events. * - * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each + * event_code - One of the TGS_EVENT_ defines. Extra parameters will be documented in each. */ /datum/tgs_event_handler/proc/HandleEvent(event_code, ...) set waitfor = FALSE return -/// User definable chat command +/// User definable handler for HTTP calls. This abstract version MUST be overridden to be used. +/datum/tgs_http_handler + +/** + * User definable callback for executing HTTP GET requests. + * MUST perform BYOND sleeps while the request is in flight. + * MUST return a [/datum/tgs_http_result]. + * SHOULD log its own errors + * + * url - The full URL to execute the GET request for including query parameters. + */ +/datum/tgs_http_handler/proc/PerformGet(url) + CRASH("[type]/PerformGet not implemented!") + +/// Result of a [/datum/tgs_http_handler] call. MUST NOT be overridden. +/datum/tgs_http_result + /// HTTP response as text + var/response_text + /// Boolean request success flag. Set for any 2XX response code. + var/success + +/** + * Create a [/datum/tgs_http_result]. + * + * * response_text - HTTP response as text. Must be provided in New(). + * * success - Boolean request success flag. Set for any 2XX response code. Must be provided in New(). + */ +/datum/tgs_http_result/New(response_text, success) + if(response_text && !istext(response_text)) + CRASH("response_text was not text!") + + src.response_text = response_text + src.success = success + +/// User definable chat command. This abstract version MUST be overridden to be used. /datum/tgs_chat_command - /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...` + /// The string to trigger this command on a chat bot. e.g `@bot name ...` or `!tgs name ...`. var/name = "" - /// The help text displayed for this command + /// The help text displayed for this command. var/help_text = "" - /// If this command should be available to game administrators only + /// If this command should be available to game administrators only. var/admin_only = FALSE /// A subtype of [/datum/tgs_chat_command] that is ignored when enumerating available commands. Use this to create shared base /datums for commands. var/ignore_type /** * Process command activation. Should return a [/datum/tgs_message_content] to respond to the issuer with. + * MUST be implemented * - * sender - The [/datum/tgs_chat_user] who issued the command. - * params - The trimmed string following the command `/datum/tgs_chat_command/var/name]. + * * 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()") -/// User definable chat message +/// User definable chat message. MUST NOT be overridden. /datum/tgs_message_content - /// The tring content of the message. Must be provided in New(). + /// The string content of the message. Must be provided in New(). var/text /// The [/datum/tgs_chat_embed] to embed in the message. Not supported on all chat providers. var/datum/tgs_chat_embed/structure/embed +/** + * Create a [/datum/tgs_message_content]. + * + * * text - The string content of the message. + */ /datum/tgs_message_content/New(text) + ..() if(!istext(text)) TGS_ERROR_LOG("[/datum/tgs_message_content] created with no text!") text = null src.text = text -/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/channel#embed-object-embed-structure for details. +/// User definable chat embed. Currently mirrors Discord chat embeds. See https://discord.com/developers/docs/resources/message#embed-object for details. /datum/tgs_chat_embed/structure var/title var/description @@ -300,16 +368,16 @@ /// Timestamp must be encoded as: time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss"). Use the active timezone. var/timestamp - /// Colour must be #AARRGGBB or #RRGGBB hex string + /// Colour must be #AARRGGBB or #RRGGBB hex string. var/colour - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-image-structure for details. var/datum/tgs_chat_embed/media/image - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-thumbnail-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-thumbnail-structure for details. var/datum/tgs_chat_embed/media/thumbnail - /// See https://discord.com/developers/docs/resources/channel#embed-object-embed-image-structure for details. + /// See https://discord.com/developers/docs/resources/message#embed-object-embed-video-structure for details. var/datum/tgs_chat_embed/media/video var/datum/tgs_chat_embed/footer/footer @@ -318,7 +386,7 @@ var/list/datum/tgs_chat_embed/field/fields -/// Common datum for similar discord embed medias +/// Common datum for similar Discord embed medias. /datum/tgs_chat_embed/media /// Must be set in New(). var/url @@ -326,48 +394,58 @@ var/height var/proxy_url +/// Create a [/datum/tgs_chat_embed]. /datum/tgs_chat_embed/media/New(url) + ..() if(!istext(url)) CRASH("[/datum/tgs_chat_embed/media] created with no url!") src.url = url -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure for details. +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-footer-structure for details. /datum/tgs_chat_embed/footer /// Must be set in New(). var/text var/icon_url var/proxy_icon_url +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/footer/New(text) + ..() if(!istext(text)) CRASH("[/datum/tgs_chat_embed/footer] created with no text!") src.text = text -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-provider-structure for details. +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-provider-structure for details. /datum/tgs_chat_embed/provider var/name var/url -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-author-structure for details. Must have name set in New(). +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-author-structure for details. Must have name set in New(). /datum/tgs_chat_embed/provider/author var/icon_url var/proxy_icon_url +/// Create a [/datum/tgs_chat_embed/footer]. /datum/tgs_chat_embed/provider/author/New(name) + ..() if(!istext(name)) CRASH("[/datum/tgs_chat_embed/provider/author] created with no name!") src.name = name -/// See https://discord.com/developers/docs/resources/channel#embed-object-embed-field-structure for details. Must have name and value set in New(). +/// See https://discord.com/developers/docs/resources/message#embed-object-embed-field-structure for details. /datum/tgs_chat_embed/field + /// Must be set in New(). var/name + /// Must be set in New(). var/value var/is_inline +/// Create a [/datum/tgs_chat_embed/field]. /datum/tgs_chat_embed/field/New(name, value) + ..() if(!istext(name)) CRASH("[/datum/tgs_chat_embed/field] created with no name!") @@ -396,16 +474,17 @@ // 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. + * Forces a hard reboot of DreamDaemon by ending the process. This function may sleep! * * Unlike del(world) clients will try to reconnect. - * If TGS has not requested a [TGS_REBOOT_MODE_SHUTDOWN] DreamDaemon will be launched again + * 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. + * Send a message to connected chats. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * admin_only: If [TRUE], message will be sent to admin connected chats. Vice-versa applies. @@ -414,7 +493,8 @@ return /** - * Send a private message to a specific user. + * Send a private message to a specific user. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * user: The [/datum/tgs_chat_user] to PM. @@ -422,10 +502,9 @@ /world/proc/TgsChatPrivateMessage(datum/tgs_message_content/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. + * Send a message to connected chats that are flagged as game-related in TGS. This function may sleep! + * If TGS is offline when called, the message may be placed in a queue to be sent and this function will return immediately. Your message will be sent when TGS reconnects to the game. * * message - The [/datum/tgs_message_content] to send. * channels - Optional list of [/datum/tgs_chat_channel]s to restrict the message to. @@ -433,38 +512,56 @@ /world/proc/TgsChatBroadcast(datum/tgs_message_content/message, list/channels = null) return -/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. +/// Returns the current [/datum/tgs_version] of TGS if it is running the server, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsVersion() return -/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. +/// Returns the running engine type +/world/proc/TgsEngine() + return + +/// Returns the current [/datum/tgs_version] of the DMAPI being used if it was activated, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsApiVersion() return -/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. +/// Returns the name of the TGS instance running the game if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsInstanceName() return -/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. +/// Return the current [/datum/tgs_revision_information] of the running server if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsRevision() return -/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. +/// Returns the current BYOND security level as a TGS_SECURITY_ define if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsSecurityLevel() return -/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. +/// Returns the current BYOND visibility level as a TGS_VISIBILITY_ define if TGS is present, null otherwise. Requires TGS to be using interop API version 5 or higher otherwise the string "___unimplemented" wil be returned. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! +/world/proc/TgsVisibility() + return + +/// Returns a list of active [/datum/tgs_revision_information/test_merge]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsTestMerges() return -/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. +/// Returns a list of connected [/datum/tgs_chat_channel]s if TGS is present, null otherwise. This function may sleep if the call to [/world/proc/TgsNew] is sleeping! /world/proc/TgsChatChannelInfo() return +/** + * Trigger an event in TGS. Requires TGS version >= 6.3.0. Returns [TRUE] if the event was triggered successfully, [FALSE] otherwise. This function may sleep! + * + * event_name - The name of the event to trigger + * parameters - Optional list of string parameters to pass as arguments to the event script. The first parameter passed to a script will always be the running game's directory followed by these parameters. + * wait_for_completion - If set, this function will not return until the event has run to completion. + */ +/world/proc/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + return + /* The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2017-2024 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm index 744700a4f214..4a73cc60e21f 100644 --- a/code/__DEFINES/tgui.dm +++ b/code/__DEFINES/tgui.dm @@ -36,3 +36,5 @@ #define TGUI_CREATE_MESSAGE(type, payload) ( \ "%7b%22type%22%3a%22[type]%22%2c%22payload%22%3a[url_encode(json_encode(payload))]%7d" \ ) + +#define BOOLEAN(foo) ((foo) ? "TRUE" : "FALSE") diff --git a/code/__DEFINES/three_dsix.dm b/code/__DEFINES/three_dsix.dm new file mode 100644 index 000000000000..9803920431a7 --- /dev/null +++ b/code/__DEFINES/three_dsix.dm @@ -0,0 +1,29 @@ +#define CRIT_FAILURE -1 +#define FAILURE 0 +#define SUCCESS 1 +#define CRIT_SUCCESS 2 + +// Skill sources +#define SKILL_SOURCE_COMBAT_MODE "Prepared to fight" +/// Confusion status effect. +#define SKILL_SOURCE_CONFUSION "Confused" +/// Knockdown status effect +#define SKILL_SOURCE_FLOORED "Knocked down" +/// Blind +#define SKILL_SOURCE_BLINDNESS "Blind" +/// Clumsy +#define SKILL_SOURCE_CLUMSY "Clumsy" +/// Overcome witnessing a death +#define SKILL_SOURCE_DEATH_RESOLVE "Overcome witnessing a death" +/// Witness a death +#define SKILL_SOURCE_WITNESS_DEATH "Witnessed a death" +/// Have nicotine in your blood +#define SKILL_SOURCE_NICOTINE "Nicotine" +/// Have a nicotine withdrawl +#define SKILL_SOURCE_NICOTINE_WITHDRAWL "Nicottine withdrawl" +/// Opiod Withdrawl +#define SKILL_SOURCE_OPIOD_WITHDRAWL "Opiod withdrawl" +/// Alchohol withdrawl +#define SKILL_SOURCE_ALCHOHOL_WITHDRAWL "Alchohol withdrawl" +/// The baseline value for a stat. +#define STATS_BASELINE_VALUE 11 diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm index 0b2ef119f8ed..0dfb23d373a8 100644 --- a/code/__DEFINES/time.dm +++ b/code/__DEFINES/time.dm @@ -10,6 +10,7 @@ ///How many years into the future (or past, if you're into that) the server is #define STATION_YEAR_OFFSET 805 + #define JANUARY 1 #define FEBRUARY 2 #define MARCH 3 @@ -54,6 +55,11 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define SECOND *10 #define SECONDS *10 +#define MILLISECONDS *0.01 + +#define DECISECONDS *1 //! The base unit all of these defines are scaled by, because byond uses that as a unit of measurement for some fucking reason + + #define MINUTE *600 #define MINUTES *600 @@ -65,8 +71,6 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using #define TICKS *world.tick_lag -#define MILLISECONDS * 0.01 - #define DS2TICKS(DS) ((DS)/world.tick_lag) #define TICKS2DS(T) ((T) TICKS) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index de5ae656a718..3cd1cc35ada3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -114,6 +114,9 @@ #define HAS_TRAIT_FROM_ONLY(target, trait, source) (target.status_traits?[trait] && (source in target.status_traits[trait]) && (length(target.status_traits[trait]) == 1)) #define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits?[trait] && (length(target.status_traits[trait] - source) > 0)) +/// For use in start/stop metabolize. Since we don't want touch metabolism ending to interrupt bloodstream chems of the same type, etc. +#define CHEM_TRAIT_SOURCE(class) "[type]_[class]" + /* Remember to update _globalvars/traits.dm if you're adding/removing/renaming traits. */ @@ -136,7 +139,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Inability to pull things. Turned into a trait from [MOBILITY_PULL] to be able to track sources. #define TRAIT_PULL_BLOCKED "pullblocked" /// Abstract condition that prevents movement if being pulled and might be resisted against. Handcuffs and straight jackets, basically. -#define TRAIT_RESTRAINED "restrained" +#define TRAIT_ARMS_RESTRAINED "restrained" /// Doesn't miss attacks #define TRAIT_PERFECT_ATTACKER "perfect_attacker" #define TRAIT_INCAPACITATED "incapacitated" @@ -150,8 +153,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NO_SPRINT "no_sprint" /// In softcrit. #define TRAIT_SOFT_CRITICAL_CONDITION "soft-critical-condition" -/// In hardcrit. Is able to succumb. -#define TRAIT_CRITICAL_CONDITION "critical-condition" +/// Has blurry vision until removed +#define TRAIT_BLURRY_VISION "blurry_vision" /// Whitelist for mobs that can read or write #define TRAIT_LITERATE "literate" /// Blacklist for mobs that can't read or write @@ -159,6 +162,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLIND "blind" #define TRAIT_MUTE "mute" #define TRAIT_EMOTEMUTE "emotemute" +/// User cannot use the Say() verb. This is used to force speech while "muting" the client. +#define TRAIT_NO_VOLUNTARY_SPEECH "no_say_typing" #define TRAIT_DEAF "deaf" #define TRAIT_NEARSIGHT "nearsighted" #define TRAIT_FAT "fat" @@ -194,6 +199,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PUSHIMMUNE "push_immunity" #define TRAIT_SHOCKIMMUNE "shock_immunity" #define TRAIT_TESLA_SHOCKIMMUNE "tesla_shock_immunity" +// Is this atom being actively shocked? Used to prevent repeated shocks. +#define TRAIT_BEING_SHOCKED "shocked" +/// You cannot ENTER cardiac arrest. #define TRAIT_STABLEHEART "stable_heart" /// Prevents you from leaving your corpse #define TRAIT_CORPSELOCKED "corpselocked" @@ -223,7 +231,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EASYDISMEMBER "easy_dismember" #define TRAIT_LIMBATTACHMENT "limb_attach" #define TRAIT_NOLIMBDISABLE "no_limb_disable" -#define TRAIT_EASILY_WOUNDED "easy_limb_wound" #define TRAIT_HARDLY_WOUNDED "hard_limb_wound" #define TRAIT_NEVER_WOUNDED "never_wounded" #define TRAIT_TOXINLOVER "toxinlover" @@ -231,7 +238,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_VAL_CORRIN_MEMBER "val_corrin_member" /// reduces the use time of syringes, pills, patches and medigels but only when using on someone #define TRAIT_FASTMED "fast_med_use" +/// Mob does not breathe. #define TRAIT_NOBREATH "no_breath" +/// Mob does not need ears to hear +#define TRAIT_NOEARS "no_ears" #define TRAIT_ANTIMAGIC "anti_magic" #define TRAIT_HOLY "holy" /// Like antimagic, but doesn't block the user from casting @@ -239,6 +249,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DEPRESSION "depression" #define TRAIT_JOLLY "jolly" #define TRAIT_NOCRITDAMAGE "no_crit" +/// Cannot experience Shock (pain version, not electrical) +#define TRAIT_NO_PAINSHOCK "no_painshock" +/// Does not get addicted +#define TRAIT_NO_ADDICTION "no_addiction" +/// Makes whispers clearly heard from seven tiles away, the full hearing range +#define TRAIT_GOOD_HEARING "good_hearing" // Stops the mob from slipping on water, or banana peels, or pretty much anything that doesn't have [GALOSHES_DONT_HELP] set #define TRAIT_NO_SLIP_WATER "NO_SLIP_WATER" @@ -279,6 +295,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MESON_VISION "meson_vision" /// Gives us Night vision #define TRAIT_TRUE_NIGHT_VISION "true_night_vision" +/// Prevents direction changes done by face_atom() +#define TRAIT_CANNOTFACE "cannotface" /// Negates our gravity, letting us move normally on floors in 0-g #define TRAIT_NEGATES_GRAVITY "negates_gravity" @@ -309,7 +327,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// We can handle 'dangerous' plants in botany safely #define TRAIT_PLANT_SAFE "plant_safe" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" -#define TRAIT_UNSTABLE "unstable" #define TRAIT_OIL_FRIED "oil_fried" #define TRAIT_MEDICAL_HUD "med_hud" #define TRAIT_SECURITY_HUD "sec_hud" @@ -318,6 +335,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Is a medbot healing you #define TRAIT_MEDIBOTCOMINGTHROUGH "medbot" #define TRAIT_PASSTABLE "passtable" +#define TRAIT_PASSMOB "passmob" /// Makes you immune to flashes #define TRAIT_NOFLASH "noflash" /// prevents xeno huggies implanting skeletons @@ -325,6 +343,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Makes you flashable from any direction #define TRAIT_FLASH_SENSITIVE "flash_sensitive" #define TRAIT_NAIVE "naive" +/// always detect storm weathers +#define TRAIT_DETECT_STORM "detect_storm" #define TRAIT_PRIMITIVE "primitive" #define TRAIT_GUNFLIP "gunflip" /// Increases chance of getting special traumas, makes them harder to cure @@ -342,10 +362,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_TUMOR_SUPPRESSED "brain_tumor_suppressed" /// overrides the update_fire proc to always add fire (for lava) #define TRAIT_PERMANENTLY_ONFIRE "permanently_onfire" -/// Galactic Common Sign Language -#define TRAIT_SIGN_LANG "sign_language" -/// This mob is able to use sign language over the radio. -#define TRAIT_CAN_SIGN_ON_COMMS "can_sign_on_comms" /// nobody can use martial arts on this mob #define TRAIT_MARTIAL_ARTS_IMMUNE "martial_arts_immune" /// You've been cursed with a living duffelbag, and can't have more added @@ -398,8 +414,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SPRAY_PAINTABLE "spray_paintable" /// This person is blushing #define TRAIT_BLUSHING "blushing" - -#define TRAIT_NOBLEED "nobleed" //This carbon doesn't bleed +/// This bodypart is being held in a grab, and reduces bleeding +#define TRAIT_BODYPART_GRABBED "bodypart_grabbed" +/// This carbon doesn't bleed +#define TRAIT_NOBLEED "nobleed" /// 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 #define TRAIT_AI_BAGATTACK "bagattack" /// This mobs bodyparts are invisible but still clickable. @@ -581,6 +599,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_KEEP_DIRECTION_WHILE_PULLING "keep_direction_while_pulling" // Prevents this item from entering closets/crates entirely via insertion_allowed() #define TRAIT_REJECT_INSERTION "reject_insertion" +/// Wearing this item in the mask slot will make your voice Unknown +#define TRAIT_HIDES_VOICE "hides_voice" +/// Wearing this item in the mask slot will make your voice your current ID, or unknown +#define TRAIT_REPLACES_VOICE "replaces_voice" //quirk traits #define TRAIT_ALCOHOL_TOLERANCE "alcohol_tolerance" @@ -589,9 +611,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NIGHT_VISION "night_vision" #define TRAIT_LIGHT_STEP "light_step" #define TRAIT_SPIRITUAL "spiritual" -#define TRAIT_CLOWN_ENJOYER "clown_enjoyer" -#define TRAIT_MIME_FAN "mime_fan" -#define TRAIT_VORACIOUS "voracious" #define TRAIT_SELF_AWARE "self_aware" #define TRAIT_FREERUNNING "freerunning" #define TRAIT_SKITTISH "skittish" @@ -601,10 +620,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" #define TRAIT_LIGHT_DRINKER "light_drinker" -#define TRAIT_EMPATH "empath" #define TRAIT_FRIENDLY "friendly" #define TRAIT_GRABWEAKNESS "grab_weakness" -#define TRAIT_SNOB "snob" #define TRAIT_BALD "bald" #define TRAIT_BADTOUCH "bad_touch" #define TRAIT_EXTROVERT "extrovert" @@ -615,9 +632,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Gives you the Shifty Eyes quirk, rarely making people who examine you think you examined them back even when you didn't #define TRAIT_SHIFTY_EYES "shifty_eyes" -///Trait for the gamer quirk. -#define TRAIT_GAMER "gamer" - ///Trait for dryable items #define TRAIT_DRYABLE "trait_dryable" ///Trait for dried items @@ -667,11 +681,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// trait denoting someone will sometimes recover out of crit #define TRAIT_UNBREAKABLE "unbreakable" -//Medical Categories for quirks -#define CAT_QUIRK_ALL 0 -#define CAT_QUIRK_NOTES 1 -#define CAT_QUIRK_MINOR_DISABILITY 2 -#define CAT_QUIRK_MAJOR_DISABILITY 3 +/// trait denoting something is being risen up by a table +#define TRAIT_TABLE_RISEN "table_risen" + +/// Whether or not the user is in a MODlink call, prevents making more calls +#define TRAIT_IN_CALL "in_call" // common trait sources #define TRAIT_GENERIC "generic" @@ -721,6 +735,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define INNATE_TRAIT "innate" #define CRIT_HEALTH_TRAIT "crit_health" #define OXYLOSS_TRAIT "oxyloss" +// Trait sorce for "was recently shocked by something" +#define WAS_SHOCKED "was_shocked" #define TURF_TRAIT "turf" /// trait associated to being buckled #define BUCKLED_TRAIT "buckled" @@ -730,6 +746,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define RESTING_TRAIT "resting" /// trait associated to a stat value or range of #define STAT_TRAIT "stat" +/// Trait from the BRAIN +#define BRAIN_TRAIT "brain_trait" #define STATION_TRAIT "station-trait" /// obtained from mapping helper #define MAPPING_HELPER_TRAIT "mapping-helper" @@ -747,13 +765,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define HIGHLANDER_TRAIT "highlander" /// Trait associated with airflow/spacewind #define AIRFLOW_TRAIT "airflow" +/// Trait on stumps +#define STUMP_TRAIT "stump" ///generic atom traits /// Trait from [/datum/element/rust]. Its rusty and should be applying a special overlay to denote this. #define TRAIT_RUSTY "rust_trait" -///stops someone from splashing their reagent_container on an object with this trait -#define DO_NOT_SPLASH "do_not_splash" - // unique trait sources, still defines #define CLONING_POD_TRAIT "cloning-pod" #define STATUE_MUTE "statue" @@ -766,7 +783,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define EYES_COVERED "eyes_covered" #define HYPNOCHAIR_TRAIT "hypnochair" #define FLASHLIGHT_EYES "flashlight_eyes" -#define IMPURE_OCULINE "impure_oculine" #define BLINDFOLD_TRAIT "blindfolded" #define TRAIT_SANTA "santa" #define SCRYING_ORB "scrying-orb" @@ -848,6 +864,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define ORBITING_TRAIT "orbiting" /// From the item_scaling element #define ITEM_SCALING_TRAIT "item_scaling" +/// From EMPs +#define EMP_TRAIT "emp" +/// Given by the operating table +#define OPTABLE_TRAIT "optable" /** * Trait granted by [/mob/living/carbon/Initialize] and @@ -876,8 +896,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define STATION_TRAIT_UNIQUE_AI "station_trait_unique_ai" #define STATION_TRAIT_CARP_INFESTATION "station_trait_carp_infestation" #define STATION_TRAIT_PREMIUM_INTERNALS "station_trait_premium_internals" -#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" @@ -892,9 +910,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// Traits granted to items due to their chameleon properties. #define CHAMELEON_ITEM_TRAIT "chameleon_item_trait" -/// This human wants to see the color of their glasses, for some reason -#define TRAIT_SEE_GLASS_COLORS "see_glass_colors" - /// this mob is under the effects of the power chord #define TRAIT_POWER_CHORD "power_chord" @@ -953,3 +968,15 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define RIGHT_LEG_TRAIT "right_leg" #define LEFT_LEG_TRAIT "left_leg" +// Reagent traits +#define TRAIT_ZOMBIEPOWDER "zombiepowder" +#define TRAIT_ROTATIUM "rotatedidiot" +#define TRAIT_VENOMSIZE "venomsize" +#define TRAIT_HYPERZINE "zoomzoomzoom" +#define TRAIT_EPHEDRINE "ephedrine" +#define TRAIT_HALOPERIDOL "haloperidol" +#define TRAIT_STIMULANTS "stimulants" +#define TRAIT_IMPEDREZENE "impedrezene" + +/// Given to items that are bodyparts attached to a mob, organs attached to a mob or inside a bodypart +#define TRAIT_INSIDE_BODY "inside_body" diff --git a/code/__DEFINES/turfs.dm b/code/__DEFINES/turfs.dm index 687188416c08..5c0a0afc3c8d 100644 --- a/code/__DEFINES/turfs.dm +++ b/code/__DEFINES/turfs.dm @@ -1,9 +1,10 @@ -#define CHANGETURF_DEFER_CHANGE 1 -#define CHANGETURF_IGNORE_AIR 2 // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air -#define CHANGETURF_FORCEOP 4 -#define CHANGETURF_SKIP 8 // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE -#define CHANGETURF_INHERIT_AIR 16 // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR -#define CHANGETURF_RECALC_ADJACENT 32 //Immediately recalc adjacent atmos turfs instead of queuing. +#define CHANGETURF_DEFER_CHANGE (1<<0) +#define CHANGETURF_IGNORE_AIR (1<<1) // This flag prevents changeturf from gathering air from nearby turfs to fill the new turf with an approximation of local air +#define CHANGETURF_FORCEOP (1<<2) +#define CHANGETURF_SKIP (1<<3) // A flag for PlaceOnTop to just instance the new turf instead of calling ChangeTurf. Used for uninitialized turfs NOTHING ELSE +#define CHANGETURF_INHERIT_AIR (1<<4) // Inherit air from previous turf. Implies CHANGETURF_IGNORE_AIR +/// Use the baseturfs of the provided type +#define CHANGETURF_DEFAULT_BASETURF (1<<5) #define IS_OPAQUE_TURF(turf) (turf.directional_opacity == ALL_CARDINALS) @@ -18,6 +19,9 @@ locate(min(CENTER.x+(H_RADIUS),world.maxx), min(CENTER.y+(V_RADIUS),world.maxy), CENTER.z) \ ) +///Returns all currently loaded turfs +#define ALL_TURFS(...) block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) + /// Returns a list of turfs in the rectangle specified by BOTTOM LEFT corner and height/width, checks for being outside the world border for you #define CORNER_BLOCK(corner, width, height) CORNER_BLOCK_OFFSET(corner, width, height, 0, 0) diff --git a/code/__DEFINES/verb_manager.dm b/code/__DEFINES/verb_manager.dm new file mode 100644 index 000000000000..11ea6ada4d83 --- /dev/null +++ b/code/__DEFINES/verb_manager.dm @@ -0,0 +1,36 @@ +/** + * verb queuing thresholds. remember that since verbs execute after SendMaps the player wont see the effects of the verbs on the game world + * until SendMaps executes next tick, and then when that later update reaches them. thus most player input has a minimum latency of world.tick_lag + player ping. + * however thats only for the visual effect of player input, when a verb processes the actual latency of game state changes or semantic latency is effectively 1/2 player ping, + * unless that verb is queued for the next tick in which case its some number probably smaller than world.tick_lag. + * so some verbs that represent player input are important enough that we only introduce semantic latency if we absolutely need to. + * its for this reason why player clicks are handled in SSinput before even movement - semantic latency could cause someone to move out of range + * when the verb finally processes but it was in range if the verb had processed immediately and overtimed. + */ + +///queuing tick_usage threshold for verbs that are high enough priority that they only queue if the server is overtiming. +///ONLY use for critical verbs +#define VERB_OVERTIME_QUEUE_THRESHOLD 100 +///queuing tick_usage threshold for verbs that need lower latency more than most verbs. +#define VERB_HIGH_PRIORITY_QUEUE_THRESHOLD 95 +///default queuing tick_usage threshold for most verbs which can allow a small amount of latency to be processed in the next tick +#define VERB_DEFAULT_QUEUE_THRESHOLD 85 + +///attempt to queue this verb process if the server is overloaded. evaluates to FALSE if queuing isnt necessary or if it failed. +///_verification_args... are only necessary if the verb_manager subsystem youre using checks them in can_queue_verb() +///if you put anything in _verification_args that ISNT explicitely put in the can_queue_verb() override of the subsystem youre using, +///it will runtime. +#define TRY_QUEUE_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args...) (_queue_verb(_verb_callback, _tick_check, _subsystem_to_use, _verification_args)) +///queue wrapper for TRY_QUEUE_VERB() when you want to call the proc if the server isnt overloaded enough to queue +#define QUEUE_OR_CALL_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args...) \ + if(!TRY_QUEUE_VERB(_verb_callback, _tick_check, _subsystem_to_use, _verification_args)) {\ + _verb_callback:InvokeAsync() \ + }; + +//goes straight to SSverb_manager with default tick threshold +#define DEFAULT_TRY_QUEUE_VERB(_verb_callback, _verification_args...) (TRY_QUEUE_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, null, _verification_args)) +#define DEFAULT_QUEUE_OR_CALL_VERB(_verb_callback, _verification_args...) QUEUE_OR_CALL_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, null, _verification_args) + +//default tick threshold but nondefault subsystem +#define TRY_QUEUE_VERB_FOR(_verb_callback, _subsystem_to_use, _verification_args...) (TRY_QUEUE_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, _subsystem_to_use, _verification_args)) +#define QUEUE_OR_CALL_VERB_FOR(_verb_callback, _subsystem_to_use, _verification_args...) QUEUE_OR_CALL_VERB(_verb_callback, VERB_DEFAULT_QUEUE_THRESHOLD, _subsystem_to_use, _verification_args) diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index bd6d2fac7213..15e6c487b549 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -94,6 +94,7 @@ #define VV_HK_TRIGGER_EXPLOSION "explode" #define VV_HK_AUTO_RENAME "auto_rename" #define VV_HK_EDIT_FILTERS "edit_filters" +#define VV_HK_EDIT_PARTICLES "edit_particles" #define VV_HK_EDIT_COLOR_MATRIX "edit_color_matrix" #define VV_HK_ADD_AI "add_ai" @@ -139,10 +140,10 @@ #define VV_HK_MOD_MUTATIONS "quirkmut" #define VV_HK_MOD_QUIRKS "quirkmod" #define VV_HK_SET_SPECIES "setspecies" -#define VV_HK_PURRBATION "purrbation" // misc #define VV_HK_SPACEVINE_PURGE "spacevine_purge" +#define VV_HK_REGENERATE_CODEX "purge_codex_db" // paintings #define VV_HK_REMOVE_PAINTING "remove_painting" @@ -151,3 +152,8 @@ #define VV_HK_TO_OUTFIT_EDITOR "outfit_editor" #define VV_HK_WEAKREF_RESOLVE "weakref_resolve" + +// Flags for debug_variable() that do little things to what we end up rendering + +/// ALWAYS render a reduced list, useful for fuckoff big datums that need to be condensed for the sake of client load +#define VV_ALWAYS_CONTRACT_LIST (1<<0) diff --git a/code/__DEFINES/wounds.dm b/code/__DEFINES/wounds.dm index 1d6f2537ebe3..cba31770803f 100644 --- a/code/__DEFINES/wounds.dm +++ b/code/__DEFINES/wounds.dm @@ -21,6 +21,8 @@ ///A modifier applied to wound auto healing #define WOUND_REGENERATION_MODIFIER 0.25 +#define WOUND_BLEED_RATE(wound) (round(wound.damage / 40, DAMAGE_PRECISION)) + // ~wound damage/rolling defines /// the cornerstone of the wound threshold system, your base wound roll for any attack is rand(1, damage^this), after armor reduces said damage. See [/obj/item/bodypart/proc/check_wounding] #define WOUND_DAMAGE_EXPONENT 1.4 @@ -36,7 +38,9 @@ #define WOUND_DETERMINATION_BLEED_MOD 0.85 /// How often can we annoy the player about their bleeding? This duration is extended if it's not serious bleeding -#define BLEEDING_MESSAGE_BASE_CD 10 SECONDS +#define BLEEDING_MESSAGE_BASE_CD (10 SECONDS) ///The percentage of damage at which a bodypart can start to be dismembered. -#define LIMB_DISMEMBERMENT_PERCENT 0.6 +#define LIMB_DISMEMBERMENT_PERCENT 0.9 +///The percentage of max_damage that a limb will automatically be dismembered at +#define LIMB_AUTODISMEMBER_PERCENT 6 // 600% diff --git a/code/__DEFINES/zmimic.dm b/code/__DEFINES/zmimic.dm index 27a49746e90a..e228b906cfb0 100644 --- a/code/__DEFINES/zmimic.dm +++ b/code/__DEFINES/zmimic.dm @@ -1,6 +1,6 @@ #define TURF_IS_MIMICKING(T) (isturf(T) && (T:z_flags & Z_MIMIC_BELOW)) -#define CHECK_OO_EXISTENCE(OO) if (OO && !MOVABLE_IS_ON_ZTURF(OO) && !OO:destruction_timer) { OO:destruction_timer = QDEL_IN(OO, 10 SECONDS); } +#define CHECK_OO_EXISTENCE(OO) if (OO && !MOVABLE_IS_ON_ZTURF(OO) && !OO:destruction_timer) { OO:destruction_timer = QDEL_IN_STOPPABLE(OO, 10 SECONDS); } #define UPDATE_OO_IF_PRESENT CHECK_OO_EXISTENCE(src:bound_overlay); if (src:bound_overlay) { update_above(); } // I do not apologize. @@ -11,15 +11,35 @@ /// Is this movable visible from a turf that is mimicking below? Note: this does not necessarily mean *directly* below. #define MOVABLE_IS_BELOW_ZTURF(M) (\ - isturf(loc) && (TURF_IS_MIMICKING(loc:above) \ + isturf(M:loc) && (TURF_IS_MIMICKING(M:loc:above) \ || ((M:zmm_flags & ZMM_LOOKAHEAD) && ZM_INTERNAL_SCAN_LOOKAHEAD(M, above?:z_flags, Z_MIMIC_BELOW)) \ || ((M:zmm_flags & ZMM_LOOKBESIDE) && ZM_INTERNAL_SCAN_LOOKBESIDE(M, above?:z_flags, Z_MIMIC_BELOW))) \ ) /// Is this movable located on a turf that is mimicking below? Note: this does not necessarily mean *directly* on. #define MOVABLE_IS_ON_ZTURF(M) (\ - isturf(loc) && (TURF_IS_MIMICKING(loc:above) \ + isturf(M:loc) && (TURF_IS_MIMICKING(M:loc) \ || ((M:zmm_flags & ZMM_LOOKAHEAD) && ZM_INTERNAL_SCAN_LOOKAHEAD(M, z_flags, Z_MIMIC_BELOW)) \ || ((M:zmm_flags & ZMM_LOOKBESIDE) && ZM_INTERNAL_SCAN_LOOKBESIDE(M, z_flags, Z_MIMIC_BELOW))) \ ) -#define FOR_MIMIC_OF(ORIGIN,MVAR) MVAR = ORIGIN; while ((MVAR = MVAR:bound_overlay) && !MVAR:destruction_timer) +/// Performs an animate() call on the given object and it's mimics. +#define z_animate(thing, args...) \ + do { \ + animate(thing, ##args); \ + var/atom/movable/openspace/mimic/__mimic = thing.bound_overlay; \ + while(!QDELETED(__mimic) && !__mimic.destruction_timer) { \ + animate(__mimic, ##args); \ + __mimic = __mimic.bound_overlay; \ + } \ + } while(FALSE) + +/// Performs a flick() call on the given object and it's mimics. +#define z_flick(Icon, Object) \ + do { \ + flick(Icon, Object); \ + var/atom/movable/openspace/mimic/__mimic = Object.bound_overlay; \ + while(!QDELETED(__mimic) && !__mimic.destruction_timer) { \ + flick(Icon, __mimic); \ + __mimic = __mimic.bound_overlay; \ + } \ + } while(FALSE) diff --git a/code/__DEFINES/~pariah_defines/DNA.dm b/code/__DEFINES/~pariah_defines/DNA.dm index 3095b781ce55..7aaaba5d1366 100644 --- a/code/__DEFINES/~pariah_defines/DNA.dm +++ b/code/__DEFINES/~pariah_defines/DNA.dm @@ -14,5 +14,3 @@ #define REAGENT_ORGANIC 1 #define REAGENT_SYNTHETIC 2 - -#define MANDATORY_FEATURE_LIST list("flavor_text" = "") diff --git a/code/__DEFINES/~pariah_defines/jobs.dm b/code/__DEFINES/~pariah_defines/jobs.dm index 9c75f2a72caf..8dcd41651cbe 100644 --- a/code/__DEFINES/~pariah_defines/jobs.dm +++ b/code/__DEFINES/~pariah_defines/jobs.dm @@ -1,3 +1,3 @@ -#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Pacifist" = TRUE, "Chunky Fingers" = TRUE -#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Foreigner" = TRUE, "Chunky Fingers" = TRUE +#define SEC_RESTRICTED_QUIRKS "Blind" = TRUE, "Brain Tumor" = TRUE, "Deaf" = TRUE, "Paraplegic" = TRUE, "Mute" = TRUE, "Pacifist" = TRUE, "Chunky Fingers" = TRUE +#define HEAD_RESTRICTED_QUIRKS "Blind" = TRUE, "Deaf" = TRUE, "Mute" = TRUE, "Chunky Fingers" = TRUE #define TECH_RESTRICTED_QUIRKS "Chunky Fingers" = TRUE diff --git a/code/__DEFINES/~pariah_defines/say.dm b/code/__DEFINES/~pariah_defines/say.dm index 20490bc86405..50599c52f74c 100644 --- a/code/__DEFINES/~pariah_defines/say.dm +++ b/code/__DEFINES/~pariah_defines/say.dm @@ -1 +1 @@ -#define MAX_FLAVOR_LEN 4096 //double the maximum message length. +#define MAX_FLAVOR_LEN 1024 diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index c5d9c1dda552..40c89e3dd638 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -360,17 +360,6 @@ if (isnull(.[cached_path])) . -= cached_path - -/** - * Removes any null entries from the list - * Returns TRUE if the list had nulls, FALSE otherwise -**/ -/proc/list_clear_nulls(list/list_to_clear) - var/start_len = list_to_clear.len - var/list/new_list = new(start_len) - list_to_clear -= new_list - return list_to_clear.len < start_len - /* * Returns list containing all the entries from first list that are not present in second. * If skiprep = 1, repeated elements are treated as one. @@ -421,7 +410,7 @@ list_to_pick[item] = 0 total += list_to_pick[item] - total = rand(0, total) + total = rand(1, total) for(item in list_to_pick) total -= list_to_pick[item] if(total <= 0 && list_to_pick[item]) @@ -429,6 +418,43 @@ return null +/// Takes a weighted list (see above) and expands it into raw entries +/// This eats more memory, but saves time when actually picking from it +/proc/expand_weights(list/list_to_pick) + if(!length(list_to_pick)) + return + + var/list/values = list() + for(var/item in list_to_pick) + var/value = list_to_pick[item] + if(!value) + continue + values += value + var/gcf = greatest_common_factor(values) + + var/list/output = list() + for(var/item in list_to_pick) + var/value = list_to_pick[item] + if(!value) + continue + for(var/i in 1 to value / gcf) + output += item + return output + +/// Takes a list of numbers as input, returns the highest value that is cleanly divides them all +/// Note: this implementation is expensive as heck for large numbers, I only use it because most of my usecase +/// Is < 10 ints +/proc/greatest_common_factor(list/values) + var/smallest = min(arglist(values)) + for(var/i in smallest to 1 step -1) + var/safe = TRUE + for(var/entry in values) + if(entry % i != 0) + safe = FALSE + break + if(safe) + return i + /// Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/list_to_pick) RETURN_TYPE(list_to_pick[_].type) @@ -561,14 +587,6 @@ i++ return i -/// Returns datum/data/record -/proc/find_record(field, value, list/inserted_list) - for(var/datum/data/record/record_to_check in inserted_list) - if(record_to_check.fields[field] == value) - return record_to_check - return null - - /** * Move a single element from position from_index within a list, to position to_index * All elements in the range [1,to_index) before the move will be before the pivot afterwards @@ -665,12 +683,6 @@ if(checked_datum.vars[varname] == value) return checked_datum -///remove all nulls from a list -/proc/remove_nulls_from_list(list/inserted_list) - while(inserted_list.Remove(null)) - continue - return inserted_list - ///Copies a list, and all lists inside it recusively ///Does not copy any other reference type /proc/deep_copy_list(list/inserted_list) @@ -1007,13 +1019,17 @@ /// Runtimes if the passed in list is not sorted /proc/assert_sorted(list/list, name, cmp = GLOBAL_PROC_REF(cmp_numeric_asc)) + var/static/list/thrown_exceptions = list() var/last_value = list[1] for (var/index in 2 to list.len) var/value = list[index] if (call(cmp)(value, last_value) < 0) - stack_trace("[name] is not sorted. value at [index] ([value]) is in the wrong place compared to the previous value of [last_value] (when compared to by [cmp])") + if(thrown_exceptions[name]) + return + thrown_exceptions[name] = TRUE + throw EXCEPTION("[name] is not sorted. value at [index] ([value]) is in the wrong place compared to the previous value of [last_value] (when compared to by [cmp])") last_value = value diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 28d35b2385d0..e4a7b58fd3e7 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -132,6 +132,10 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) if(CONFIG_GET(flag/log_tools)) WRITE_LOG(GLOB.world_tool_log, "TOOL: [text]") +/proc/log_graffiti(text, mob/initiator) + if(CONFIG_GET(flag/log_graffiti)) + WRITE_LOG(GLOB.world_graffiti_log, "GRAFFITI: [initiator] wrote down [text]") + /** * Writes to a special log file if the log_suspicious_login config flag is set, * which is intended to contain all logins that failed under suspicious circumstances. @@ -433,6 +437,56 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) /proc/key_name_admin(whom, include_name = TRUE) return key_name(whom, TRUE, include_name) +/// Returns an adminpm link with the inserted HTML. +/proc/admin_pm_href(whom, html, astyle) + var/mob/M + var/client/C + var/key + var/ckey + + if(!whom) + return html + + if(istype(whom, /client)) + C = whom + M = C.mob + key = C.key + ckey = C.ckey + else if(ismob(whom)) + M = whom + C = M.client + key = M.key + ckey = M.ckey + else if(istext(whom)) + key = whom + ckey = ckey(whom) + C = GLOB.directory[ckey] + if(C) + M = C.mob + else if(istype(whom,/datum/mind)) + var/datum/mind/mind = whom + key = mind.key + ckey = ckey(key) + if(mind.current) + M = mind.current + if(M.client) + C = M.client + else + return html + + + if(!key) + return html + + var/style = "" + if(astyle) + style = "style='[astyle]'" + + if(C?.holder && C.holder.fakekey) + return "[html]" + else + return "[html]" + /proc/loc_name(atom/A) if(!istype(A)) return "(INVALID LOCATION)" diff --git a/code/__HELPERS/ai.dm b/code/__HELPERS/ai.dm index a030490c8e07..9d90649db599 100644 --- a/code/__HELPERS/ai.dm +++ b/code/__HELPERS/ai.dm @@ -37,6 +37,8 @@ /proc/IsEdible(obj/item/thing) if(!istype(thing)) return FALSE + if(thing.item_flags & ABSTRACT) + return FALSE if(IS_EDIBLE(thing)) return TRUE if(istype(thing, /obj/item/reagent_containers/food/drinks/drinkingglass)) diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index 4b5aaced34f3..fa89cf5e9dfa 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -88,15 +88,15 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en for(var/i in 1 to length(turfs)) var/turf/thing = turfs[i] var/area/old_area = thing.loc - newA.contents += thing - thing.transfer_area_lighting(old_area, newA) + + thing.change_area(old_area, newA) newA.reg_in_areas_in_z() for(var/thing2move in oldA.firedoors + oldA.firealarms + oldA.airalarms) thing2move:set_area(get_area(thing2move)) //Dude trust me - if(!isarea(area_choice) && newA.static_lighting) + if(!isarea(area_choice) && (newA.area_lighting == AREA_LIGHTING_DYNAMIC)) newA.create_area_lighting_objects() SEND_GLOBAL_SIGNAL(COMSIG_AREA_CREATED, newA, oldA, creator) @@ -105,18 +105,14 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en #undef BP_MAX_ROOM_SIZE -//Repopulates sortedAreas list -/proc/repopulate_sorted_areas() - GLOB.sortedAreas = list() - - for(var/area/A in world) - GLOB.sortedAreas.Add(A) - - sortTim(GLOB.sortedAreas, GLOBAL_PROC_REF(cmp_name_asc)) +/proc/require_area_resort() + GLOB.sortedAreas = null -/area/proc/addSorted() - GLOB.sortedAreas.Add(src) - sortTim(GLOB.sortedAreas, GLOBAL_PROC_REF(cmp_name_asc)) +/// Returns a sorted version of GLOB.areas, by name +/proc/get_sorted_areas() + if(!GLOB.sortedAreas) + GLOB.sortedAreas = sortTim(GLOB.areas.Copy(), GLOBAL_PROC_REF(cmp_name_asc)) + return GLOB.sortedAreas //Takes: Area type as a text string from a variable. //Returns: Instance for the area in the world. @@ -139,15 +135,23 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en var/list/areas = list() if(subtypes) var/list/cache = typecacheof(areatype) - for(var/area/area_to_check as anything in GLOB.sortedAreas) + for(var/area/area_to_check as anything in GLOB.areas) if(cache[area_to_check.type]) areas += area_to_check else - for(var/area/area_to_check as anything in GLOB.sortedAreas) + for(var/area/area_to_check as anything in GLOB.areas) if(area_to_check.type == areatype) areas += area_to_check return areas +/// Iterates over all turfs in the target area and returns the first non-dense one +/proc/get_first_open_turf_in_area(area/target) + if(!target) + return + for(var/turf/turf in target.get_contained_turfs()) + if(!turf.density) + return turf + //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all turfs in areas of that type of that type in the world. /proc/get_area_turfs(areatype, target_z = 0, subtypes=FALSE) @@ -158,21 +162,28 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(/area/station/en areatype = areatemp.type else if(!ispath(areatype)) return null - - var/list/turfs = list() + // Pull out the areas + var/list/areas_to_pull = list() if(subtypes) var/list/cache = typecacheof(areatype) - for(var/area/area_to_check as anything in GLOB.sortedAreas) + for(var/area/area_to_check as anything in GLOB.areas) if(!cache[area_to_check.type]) continue - for(var/turf/turf_in_area in area_to_check) - if(target_z == 0 || target_z == turf_in_area.z) - turfs += turf_in_area + areas_to_pull += area_to_check else - for(var/area/area_to_check as anything in GLOB.sortedAreas) + for(var/area/area_to_check as anything in GLOB.areas) if(area_to_check.type != areatype) continue - for(var/turf/turf_in_area in area_to_check) - if(target_z == 0 || target_z == turf_in_area.z) + areas_to_pull += area_to_check + + // Now their turfs + var/list/turfs = list() + for(var/area/pull_from as anything in areas_to_pull) + var/list/our_turfs = pull_from.get_contained_turfs() + if(target_z == 0) + turfs += our_turfs + else + for(var/turf/turf_in_area as anything in our_turfs) + if(target_z == turf_in_area.z) turfs += turf_in_area return turfs diff --git a/code/__HELPERS/atlas.dm b/code/__HELPERS/atlas.dm new file mode 100644 index 000000000000..b892adc6eac9 --- /dev/null +++ b/code/__HELPERS/atlas.dm @@ -0,0 +1,42 @@ +/// A massive nested associative list that tracks type instances, set by the below macros. +GLOBAL_REAL_VAR(list/atlas) = list() + +#define IS_TRACKED(x) (!!atlas[x]) + +#define SET_TRACKING(x) \ + if(isnull(::atlas[x])) { \ + ::atlas[x] = list(); \ + } \ + ::atlas[x][src] = 1; + +#define UNSET_TRACKING(x) (::atlas[x] -= src) + +#ifndef DEBUG_ATLAS +/// Returns a list of tracked instances of a given value. +#define INSTANCES_OF(x) (::atlas[x]) +#else +/proc/instances_of(foo) + if(!IS_TRACKED(foo)) + CRASH("Attempted to get instances of untracked key [foo]") + + return ::atlas[foo] + +#endif + +#define INSTANCES_OF_COPY(x) (::atlas[x]:Copy()) + +// Tracking keys +/// Key used for things that can call the shuttle +#define TRACKING_KEY_SHUTTLE_CALLER "shuttle_caller" +#define TRACKING_KEY_RCD "rcds" + +/proc/list_debug() + var/list/lists = list() + for(var/V in GLOB.vars) + if(islist(GLOB.vars[V])) + lists[V] = GLOB.vars[V] + + sortTim(lists, GLOBAL_PROC_REF(cmp_list_length), TRUE) + + for(var/name in lists) + to_chat(world, "[name] - [length(lists[name])]") diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 861f94752085..d582e49c9cb5 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -311,15 +311,5 @@ rough example of the "cone" made by the 3 dirs checked return TRUE ///A do nothing proc -/proc/pass(...) +/proc/noop(...) return - -///Returns a list of the parents of all storage components that contain the target item -/proc/get_storage_locs(obj/item/target) - . = list() - if(!istype(target) || !(target.item_flags & IN_STORAGE)) - return - var/datum/storage/storage_datum = target.loc.atom_storage - if(!storage_datum) - return - . += storage_datum.parent diff --git a/code/__HELPERS/bitflag_lists.dm b/code/__HELPERS/bitflag_lists.dm index 8e37949d6910..655983ed25c3 100644 --- a/code/__HELPERS/bitflag_lists.dm +++ b/code/__HELPERS/bitflag_lists.dm @@ -1,4 +1,4 @@ -GLOBAL_LIST_EMPTY(bitflag_lists) +GLOBAL_REAL_VAR(bitflag_lists) = list() /** * System for storing bitflags past the 24 limit, making use of an associative list. @@ -11,15 +11,18 @@ GLOBAL_LIST_EMPTY(bitflag_lists) * Arguments: * * target - List of integers. */ -#define SET_BITFLAG_LIST(target) \ +#define SET_SMOOTHING_GROUPS(target) \ do { \ - var/txt_signature = target.Join("-"); \ - if(!GLOB.bitflag_lists[txt_signature]) { \ + var/txt_signature = target; \ + if(isnull((target = global.bitflag_lists[txt_signature]))) { \ var/list/new_bitflag_list = list(); \ - for(var/value in target) { \ + var/list/decoded = UNWRAP_SMOOTHING_GROUPS(txt_signature, decoded); \ + for(var/value in decoded) { \ + if (value < 0) { \ + value = MAX_S_TURF + 1 + abs(value); \ + } \ new_bitflag_list["[round(value / 24)]"] |= (1 << (value % 24)); \ }; \ - GLOB.bitflag_lists[txt_signature] = new_bitflag_list; \ + target = global.bitflag_lists[txt_signature] = new_bitflag_list; \ }; \ - target = GLOB.bitflag_lists[txt_signature]; \ } while (FALSE) diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 6c6a4b9fd682..818d8294bd05 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -99,14 +99,8 @@ GLOBAL_VAR_INIT(cmp_field, "name") return A.totalResistance() - B.totalResistance() /proc/cmp_quirk_asc(datum/quirk/A, datum/quirk/B) - var/a_sign = SIGN(initial(A.value) * -1) - var/b_sign = SIGN(initial(B.value) * -1) - - // Neutral traits go last. - if(a_sign == 0) - a_sign = 2 - if(b_sign == 0) - b_sign = 2 + var/a_sign = SIGN(initial(A.quirk_genre) * -1) + var/b_sign = SIGN(initial(B.quirk_genre) * -1) var/a_name = initial(A.name) var/b_name = initial(B.name) @@ -144,6 +138,11 @@ GLOBAL_VAR_INIT(cmp_field, "name") /proc/cmp_bodypart_by_body_part_asc(obj/item/bodypart/limb_one, obj/item/bodypart/limb_two) return limb_one.body_part - limb_two.body_part +/// Orders bodyparts by how they should be shown to players in a UI +/proc/cmp_bodyparts_display_order(obj/item/bodypart/limb_one, obj/item/bodypart/limb_two) + var/static/list/parts = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + return parts.Find(limb_one.body_zone) - parts.Find(limb_two.body_zone) + /// Orders by integrated circuit weight /proc/cmp_port_order_asc(datum/port/compare1, datum/port/compare2) return compare1.order - compare2.order @@ -193,3 +192,11 @@ GLOBAL_VAR_INIT(cmp_field, "name") /// Orders designs by name /proc/cmp_design_name(datum/design/A, datum/design/B) return sorttext(B.name, A.name) + +/// Orders lists by the size of lists in their contents +/proc/cmp_list_length(list/A, list/B) + return length(A) - length(B) + +/// Orders codex entries by name alphabetically +/proc/cmp_codex_name(datum/codex_entry/a, datum/codex_entry/b) + return sorttext(b.name, a.name) diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 44c7058c9c31..d2ece3ab1a8d 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -37,10 +37,9 @@ CRASH("Given non-HTML argument!") else if(length_char(HTMLstring) != 7) CRASH("Given non-hex symbols in argument!") - var/textr = copytext(HTMLstring, 2, 4) - var/textg = copytext(HTMLstring, 4, 6) - var/textb = copytext(HTMLstring, 6, 8) - return rgb(255 - hex2num(textr), 255 - hex2num(textg), 255 - hex2num(textb)) + + var/list/color = rgb2num(HTMLstring) + return rgb(255 - color[1], 255 - color[2], 255 - color[3]) ///Flash a color on the client /proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 9f3ff6127c2b..b5d9ab7944b2 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -316,16 +316,29 @@ ///Recursively checks if an item is inside a given type, even through layers of storage. Returns the atom if it finds it. /proc/recursive_loc_check(atom/movable/target, type) - var/atom/atom_to_find = target - if(istype(atom_to_find, type)) - return atom_to_find + var/atom/atom_to_find = null - while(!istype(atom_to_find.loc, type)) - if(!atom_to_find.loc) - return - atom_to_find = atom_to_find.loc + if(ispath(type)) + atom_to_find = target + if(istype(atom_to_find, type)) + return atom_to_find - return atom_to_find.loc + while(!istype(atom_to_find.loc, type)) + if(!atom_to_find.loc) + return + atom_to_find = atom_to_find.loc + + else if(isatom(type)) + atom_to_find = target + if(atom_to_find.loc == type) + return atom_to_find + + while(atom_to_find.loc != type) + if(!atom_to_find.loc) + return + atom_to_find = atom_to_find.loc + + return atom_to_find ///Send a message in common radio when a player arrives /proc/announce_arrival(mob/living/carbon/human/character, rank) @@ -343,18 +356,6 @@ var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) announcer.announce("ARRIVAL", character.real_name, rank, list()) //make the list empty to make it announce it in common -///Check if the turf pressure allows specialized equipment to work -/proc/lavaland_equipment_pressure_check(turf/turf_to_check) - . = FALSE - if(!istype(turf_to_check)) - return - var/datum/gas_mixture/environment = turf_to_check.unsafe_return_air() - if(isnull(environment)) - return - var/pressure = environment.returnPressure() - if(pressure <= LAVALAND_EQUIPMENT_EFFECT_PRESSURE) - . = TRUE - ///Find an 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(range, atom/center, area/specific_area) var/list/possible_loc = list() @@ -376,7 +377,7 @@ ///Disable power in the station APCs /proc/power_fail(duration_min, duration_max) - for(var/obj/machinery/power/apc/current_apc as anything in GLOB.apcs_list) + for(var/obj/machinery/power/apc/current_apc as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(!current_apc.cell || !SSmapping.level_trait(current_apc.z, ZTRAIT_STATION)) continue var/area/apc_area = current_apc.area diff --git a/code/__HELPERS/generators.dm b/code/__HELPERS/generators.dm new file mode 100644 index 000000000000..d50df7deba19 --- /dev/null +++ b/code/__HELPERS/generators.dm @@ -0,0 +1,11 @@ +/** + * returns the arguments given to a generator and manually extracts them from the internal byond object + * returns: + * * flat list of strings for args given to the generator. + * * Note: this means things like "list(1,2,3)" will need to be processed + */ +/proc/return_generator_args(generator/target) + var/string_repr = "[target]" //the name of the generator is the string representation of it's _binobj, which also contains it's args + string_repr = copytext(string_repr, 11, length(string_repr)) // strips extraneous data + string_repr = replacetext(string_repr, "\"", "") // removes the " around the type + return splittext(string_repr, ", ") diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a4389e2261a0..79f97149e2ff 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -14,35 +14,49 @@ //socks init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list) //bodypart accessories (blizzard intensifies) + + //Snowflakes init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, GLOB.tails_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.ears_list, add_blank = TRUE) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE) - init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/horns,GLOB.horns_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.ears_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/wings_open, GLOB.wings_open_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, GLOB.animated_spines_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/caps, GLOB.caps_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) + + // Lizadhs + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard) + init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/horns,GLOB.horns_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) + + // Moths init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/headtails, GLOB.headtails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_hair, GLOB.moth_hairstyles_list) + + // Teshari init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_feathers, GLOB.teshari_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_ears, GLOB.teshari_ears_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_body_feathers, GLOB.teshari_body_feathers_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/teshari, GLOB.teshari_tails_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_hair, GLOB.vox_hair_list) + //Vox + init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_hair, GLOB.vox_hair_list, add_blank = TRUE) init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_vox_hair, GLOB.vox_facial_hair_list, add_blank = TRUE) init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/vox, GLOB.tails_list_vox) init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_snouts, GLOB.vox_snouts_list) - //Moths have a whitelist - init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_hair, GLOB.moth_hairstyles_list) + + //IPC + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_screen, GLOB.ipc_screens_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/ipc_antenna, GLOB.ipc_antenna_list, add_blank = TRUE) + init_sprite_accessory_subtypes(/datum/sprite_accessory/saurian_screen, GLOB.saurian_screens_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/saurian_tail, GLOB.saurian_tails_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/saurian_scutes, GLOB.saurian_scutes_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/saurian_antenna, GLOB.saurian_antenna_list, add_blank = TRUE) //Species for(var/spath in subtypesof(/datum/species)) @@ -51,8 +65,11 @@ sort_list(GLOB.species_list, GLOBAL_PROC_REF(cmp_typepaths_asc)) //Surgeries - for(var/path in subtypesof(/datum/surgery)) - GLOB.surgeries_list += new path() + for(var/datum/surgery_step/path as anything in subtypesof(/datum/surgery_step)) + if(!isabstract(path)) + path = new path() + GLOB.surgeries_list += path + sort_list(GLOB.surgeries_list, GLOBAL_PROC_REF(cmp_typepaths_asc)) // Hair Gradients - Initialise all /datum/sprite_accessory/hair_gradient into an list indexed by gradient-style name @@ -67,9 +84,32 @@ init_keybindings() GLOB.emote_list = init_emote_list() + GLOB.mod_themes = setup_mod_themes() + + for(var/datum/grab/G as anything in subtypesof(/datum/grab)) + if(isabstract(G)) + continue + GLOB.all_grabstates[G] = new G + + for(var/path in GLOB.all_grabstates) + var/datum/grab/G = GLOB.all_grabstates[path] + G.refresh_updown() init_crafting_recipes(GLOB.crafting_recipes) + init_loadout_references() + init_augment_references() + + init_magnet_error_codes() + + init_slapcraft_steps() + init_slapcraft_recipes() + + init_blood_types() + + init_language_datums() + + init_employers() /// Inits the crafting recipe list, sorting crafting recipe requirements in the process. /proc/init_crafting_recipes(list/crafting_recipes) @@ -113,7 +153,6 @@ GLOBAL_LIST_INIT(WALLITEMS_INTERIOR, typecacheof(list( /obj/item/radio/intercom, /obj/item/storage/secure/safe, /obj/machinery/airalarm, - ///obj/machinery/bluespace_vendor, /obj/machinery/newscaster, /obj/machinery/button, /obj/machinery/computer/security/telescreen, @@ -169,3 +208,65 @@ GLOBAL_LIST_INIT(WALLITEMS_EXTERIOR, typecacheof(list( for(var/category as anything in GLOB.loadout_category_to_subcategory_to_items) for(var/subcategory as anything in GLOB.loadout_category_to_subcategory_to_items[category]) GLOB.loadout_category_to_subcategory_to_items[category][subcategory] = sortTim(GLOB.loadout_category_to_subcategory_to_items[category][subcategory], GLOBAL_PROC_REF(cmp_loadout_name)) + +/proc/init_augment_references() + // Here we build the global loadout lists + for(var/path in subtypesof(/datum/augment_item)) + var/datum/augment_item/L = path + if(!initial(L.path)) + continue + + L = new path() + GLOB.augment_items[L.type] = L + + if(!GLOB.augment_slot_to_items[L.slot]) + GLOB.augment_slot_to_items[L.slot] = list() + if(!GLOB.augment_categories_to_slots[L.category]) + GLOB.augment_categories_to_slots[L.category] = list() + GLOB.augment_categories_to_slots[L.category] += L.slot + GLOB.augment_slot_to_items[L.slot] += L.type + +GLOBAL_LIST_INIT(magnet_error_codes, list( + MAGNET_ERROR_KEY_BUSY, + MAGNET_ERROR_KEY_USED_COORD, + MAGNET_ERROR_KEY_COOLDOWN, + MAGNET_ERROR_KEY_MOB, + MAGNET_ERROR_KEY_NO_COORD + +)) + +/proc/init_magnet_error_codes() + var/list/existing_codes = list() + var/code + for(var/key in GLOB.magnet_error_codes) + do + code = "[pick(GLOB.alphabet_upper)][rand(1,9)]" + if(code in existing_codes) + continue + else + GLOB.magnet_error_codes[key] = code + existing_codes += code + while(isnull(GLOB.magnet_error_codes[key])) + +/proc/init_blood_types() + for(var/datum/blood/path as anything in typesof(/datum/blood)) + if(isabstract(path)) + continue + GLOB.blood_datums[path] = new path() + +/proc/init_language_datums() + for(var/datum/language/language as anything in subtypesof(/datum/language)) + if(isabstract(language) || !initial(language.key)) + continue + + var/datum/language/instance = new language + GLOB.all_languages += instance + GLOB.language_datum_instances[language] = instance + + if(instance.flags & (LANGUAGE_SELECTABLE_SPEAK | LANGUAGE_SELECTABLE_UNDERSTAND)) + GLOB.preference_language_types += language + +GLOBAL_LIST_EMPTY(employers_by_name) +/proc/init_employers() + for(var/datum/employer/path as anything in subtypesof(/datum/employer)) + GLOB.employers_by_name[initial(path.name)] = path diff --git a/code/__HELPERS/hearted.dm b/code/__HELPERS/hearted.dm index 8df71e35eff1..e7d73cfa68d5 100644 --- a/code/__HELPERS/hearted.dm +++ b/code/__HELPERS/hearted.dm @@ -3,13 +3,17 @@ if(!CONFIG_GET(number/commendation_percent_poll)) return - var/number_to_ask = round(LAZYLEN(GLOB.joined_player_list) * CONFIG_GET(number/commendation_percent_poll)) + rand(0,1) + //This does an implicit copy(), I have no idea why JPL is a lazylist, but there's no LAZYSHUFFLE() so get fucked. + var/list/ckeys_to_ask = shuffle(GLOB.joined_player_list) + var/number_to_ask = round(LAZYLEN(ckeys_to_ask) * CONFIG_GET(number/commendation_percent_poll)) + rand(0,1) + + if(number_to_ask == 0) message_admins("Not enough eligible players to poll for commendations.") return message_admins("Polling [number_to_ask] players for commendations.") - for(var/i in GLOB.joined_player_list) + for(var/i in ckeys_to_ask) var/mob/check_mob = get_mob_by_ckey(i) if(!check_mob?.mind || !check_mob.client) continue @@ -44,9 +48,9 @@ if(1) heart_nominee = tgui_input_text(src, "What was their name? Just a first or last name may be enough.", "<3?") if(2) - heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "Try again, what was their name? Just a first or last name may be enough.", "<3??") if(3) - heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3?") + heart_nominee = tgui_input_text(src, "One more try, what was their name? Just a first or last name may be enough.", "<3???") if(!heart_nominee) return @@ -69,7 +73,7 @@ return if("Nope") continue - else + else //Cancel return query_heart(attempt + 1) diff --git a/code/__HELPERS/html.dm b/code/__HELPERS/html.dm new file mode 100644 index 000000000000..db4262c29fe9 --- /dev/null +++ b/code/__HELPERS/html.dm @@ -0,0 +1,35 @@ +/proc/button_element(trg, text, action, class, style) + return "[text]" + +/proc/color_button_element(trg, color, action) + return "" + +/// Display a DM icon in a a browser. +/proc/icon_element(icon, state, dir, moving, frame, style) + return "" + +#define onclick_callback(trg, arguments) "\"(function(){window.location = 'byond://?src=[ref(trg)];[arguments]'})();\"" + +/proc/clickable_element(tag, class, style, trg, arguments) + return "<[tag] onClick=[onclick_callback(trg, arguments)] class='[class]' style='cursor: pointer;[style]'>" + +/// Inline script for an animated ellipsis +/proc/ellipsis(number_of_dots = 3, millisecond_delay = 500) + var/static/unique_id = 0 + unique_id++ + return {" + + "} + +/// Chat tag image embed, see chat_tags.dm +#define CHAT_TAG(img) "" +/// Radio tag image embed, see chat_tags.dm +#define RADIO_TAG(img)"" diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 500537ac035f..feab1d889597 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -22,68 +22,25 @@ #define DEFAULT_UNDERLAY_ICON 'icons/turf/floors.dmi' #define DEFAULT_UNDERLAY_ICON_STATE "plating" - -#define SET_ADJ_IN_DIR(source, junction, direction, direction_flag) \ - do { \ - var/turf/neighbor = get_step(source, direction); \ - if(!neighbor) { \ - if(source.smoothing_flags & SMOOTH_BORDER) { \ - junction |= direction_flag; \ - }; \ +/// Test if thing (an atom) can smooth with an adjacent turf. This is a macro because it is a very very hot proc. +#define CAN_AREAS_SMOOTH(thing, turf, val) \ + do{ \ + if(isnull(turf)) { \ + break; \ }; \ - else { \ - if(source.can_area_smooth(neighbor)) { \ - if(!isnull(neighbor.smoothing_groups)) { \ - for(var/target in source.canSmoothWith) { \ - if(!(source.canSmoothWith[target] & neighbor.smoothing_groups[target])) { \ - continue; \ - }; \ - junction |= direction_flag; \ - break; \ - }; \ - }; \ - if(!(junction & direction_flag) && source.smoothing_flags & SMOOTH_OBJ) { \ - for(var/obj/thing in neighbor) { \ - if(!thing.anchored || isnull(thing.smoothing_groups)) { \ - continue; \ - }; \ - for(var/target in source.canSmoothWith) { \ - if(!(source.canSmoothWith[target] & thing.smoothing_groups[target])) { \ - continue; \ - }; \ - junction |= direction_flag; \ - break; \ - }; \ - if(junction & direction_flag) { \ - break; \ - }; \ - }; \ - }; \ - }; \ + var/area/source_area = get_step(thing, 0)?.loc; \ + var/area/target_area = turf:loc; \ + if(isnull(target_area)) { \ + break; \ + };\ + if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing)) { \ + break; \ }; \ - } while(FALSE) - - -/** - * Checks if `src` can smooth with `target`, based on the [/area/var/area_limited_icon_smoothing] variable of their areas. - * - * * If `target` doesn't have an area (E.g. the edge of the z level), return `FALSE`. - * * If one area has `area_limited_icon_smoothing` set, and the other area's type doesn't match it, return `FALSE`. - * * Else, return `TRUE`. - * - * Arguments: - * * target - The atom we're trying to smooth with. - */ -/atom/proc/can_area_smooth(atom/target) - var/area/target_area = get_area(target) - var/area/source_area = get_area(src) - if(!target_area) - return FALSE - if(target_area.area_limited_icon_smoothing && !istype(source_area, target_area.area_limited_icon_smoothing)) - return FALSE - if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing)) - return FALSE - return TRUE + if(source_area.area_limited_icon_smoothing && !istype(target_area, source_area.area_limited_icon_smoothing)) { \ + break; \ + }; \ + val = TRUE; \ + }while(FALSE) ///Scans all adjacent turfs to find targets to smooth with. /atom/proc/calculate_adjacencies() @@ -145,8 +102,8 @@ /atom/proc/smooth_icon() smoothing_flags &= ~SMOOTH_QUEUED flags_1 |= HTML_USE_INITAL_ICON_1 - if (!z) - CRASH("[type] called smooth_icon() without being on a z-level") + if (z == 0) //If something's loc is not a turf, it's Z value is 0. Skip! + return if(smoothing_flags & SMOOTH_CORNERS) corners_cardinal_smooth(calculate_adjacencies()) else if(smoothing_flags & SMOOTH_BITMASK) @@ -251,7 +208,9 @@ if(!target_turf) return NULLTURF_BORDER - if(!can_area_smooth(target_turf)) + var/can_area_smooth + CAN_AREAS_SMOOTH(src, target_turf, can_area_smooth) + if(isnull(can_area_smooth)) return NO_ADJ_FOUND if(isnull(canSmoothWith)) //special case in which it will only smooth with itself @@ -267,8 +226,7 @@ return ADJ_FOUND if(smoothing_flags & SMOOTH_OBJ) - for(var/am in target_turf) - var/atom/movable/thing = am + for(var/atom/movable/thing as anything in target_turf) if(!thing.anchored || isnull(thing.smoothing_groups)) continue for(var/target in canSmoothWith) @@ -278,7 +236,6 @@ return NO_ADJ_FOUND - /** * Basic smoothing proc. The atom checks for adjacent directions to smooth with and changes the icon_state based on that. * @@ -287,9 +244,51 @@ */ /atom/proc/bitmask_smooth() var/new_junction = NONE + // cache for sanic speed + var/canSmoothWith = src.canSmoothWith + + var/smooth_border = (smoothing_flags & SMOOTH_BORDER) + var/smooth_obj = (smoothing_flags & SMOOTH_OBJ) + + #define SET_ADJ_IN_DIR(direction, direction_flag) \ + set_adj_in_dir: { \ + do { \ + var/turf/neighbor = get_step(src, direction); \ + var/can_area_smooth; \ + CAN_AREAS_SMOOTH(src, neighbor, can_area_smooth); \ + if(neighbor && can_area_smooth) { \ + var/neighbor_smoothing_groups = neighbor.smoothing_groups; \ + if(neighbor_smoothing_groups) { \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & neighbor_smoothing_groups[target]) { \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + }; \ + }; \ + }; \ + if(smooth_obj) { \ + for(var/atom/movable/thing as anything in neighbor) { \ + var/thing_smoothing_groups = thing.smoothing_groups; \ + if(!thing.anchored || isnull(thing_smoothing_groups)) { \ + continue; \ + }; \ + for(var/target in canSmoothWith) { \ + if(canSmoothWith[target] & thing_smoothing_groups[target]) { \ + new_junction |= direction_flag; \ + break set_adj_in_dir; \ + }; \ + }; \ + }; \ + }; \ + } else if (smooth_border) { \ + new_junction |= direction_flag; \ + }; \ + } while(FALSE) \ + } + for(var/direction in GLOB.cardinals) //Cardinal case first. - SET_ADJ_IN_DIR(src, new_junction, direction, direction) + SET_ADJ_IN_DIR(direction, direction) if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) set_smoothed_icon_state(new_junction) @@ -297,20 +296,20 @@ if(new_junction & NORTH_JUNCTION) if(new_junction & WEST_JUNCTION) - SET_ADJ_IN_DIR(src, new_junction, NORTHWEST, NORTHWEST_JUNCTION) + SET_ADJ_IN_DIR(NORTHWEST, NORTHWEST_JUNCTION) if(new_junction & EAST_JUNCTION) - SET_ADJ_IN_DIR(src, new_junction, NORTHEAST, NORTHEAST_JUNCTION) + SET_ADJ_IN_DIR(NORTHEAST, NORTHEAST_JUNCTION) if(new_junction & SOUTH_JUNCTION) if(new_junction & WEST_JUNCTION) - SET_ADJ_IN_DIR(src, new_junction, SOUTHWEST, SOUTHWEST_JUNCTION) + SET_ADJ_IN_DIR(SOUTHWEST, SOUTHWEST_JUNCTION) if(new_junction & EAST_JUNCTION) - SET_ADJ_IN_DIR(src, new_junction, SOUTHEAST, SOUTHEAST_JUNCTION) + SET_ADJ_IN_DIR(SOUTHEAST, SOUTHEAST_JUNCTION) set_smoothed_icon_state(new_junction) - +#undef SET_ADJ_IN_DIR ///Changes the icon state based on the new junction bitmask. Returns the old junction value. /atom/proc/set_smoothed_icon_state(new_junction) @@ -330,26 +329,6 @@ return return ..() - -//Icon smoothing helpers -/proc/smooth_zlevel(zlevel, now = FALSE) - var/list/away_turfs = block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel)) - for(var/V in away_turfs) - var/turf/T = V - if(T.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - if(now) - T.smooth_icon() - else - QUEUE_SMOOTH(T) - for(var/R in T) - var/atom/A = R - if(A.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - if(now) - A.smooth_icon() - else - QUEUE_SMOOTH(A) - - /atom/proc/clear_smooth_overlays() cut_overlay(top_left_corner) top_left_corner = null @@ -447,5 +426,3 @@ #undef DEFAULT_UNDERLAY_ICON #undef DEFAULT_UNDERLAY_ICON_STATE - -#undef SET_ADJ_IN_DIR diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index d6ae9e8c80b2..46c221bef8ce 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -60,55 +60,41 @@ RGB isn't the only way to represent color. Sometimes it's more useful to work wi * The value of a color determines how bright it is. A high-value color is vivid, moderate value is dark, and no value at all is black. -Just as BYOND uses "#rrggbb" to represent RGB values, a similar format is used for HSV: "#hhhssvv". The hue is three -hex digits because it ranges from 0 to 0x5FF. +While rgb is typically stored in the #rrggbb" format (with optional "aa" on the end), HSV never needs to be displayed. +Most procs that work in HSV "space" will simply accept RGB inputs and convert them in place using rgb2num(color, space = COLORSPACE_HSV). - * 0 to 0xFF - red to yellow - * 0x100 to 0x1FF - yellow to green - * 0x200 to 0x2FF - green to cyan - * 0x300 to 0x3FF - cyan to blue - * 0x400 to 0x4FF - blue to magenta - * 0x500 to 0x5FF - magenta to red +That said, if you want to manually modify these values rgb2hsv() will hand you back a list in the format list(hue, saturation, value, alpha). +Converting back is simple, just a hsv2rgb(hsv) call -Knowing this, you can figure out that red is "#000ffff" in HSV format, which is hue 0 (red), saturation 255 (as colorful as possible), -value 255 (as bright as possible). Green is "#200ffff" and blue is "#400ffff". +Hue ranges from 0 to 360 (it's in degrees of a color wheel) +Saturation ranges from 0 to 100 +Value ranges from 0 to 100 -More than one HSV color can match the same RGB color. +Knowing this, you can figure out that red is list(0, 100, 100) in HSV format, which is hue 0 (red), saturation 100 (as colorful as possible), +value 255 (as bright as possible). Green is list(120, 100, 100) and blue is list(240, 100, 100). + +It is worth noting that while we do not have helpers for them currently, these same ideas apply to all of byond's color spaces +HSV (hue saturation value), HSL (hue satriation luminosity) and HCY (hue chroma luminosity) Here are some procs you can use for color management: -ReadRGB(rgb) - Takes an RGB string like "#ffaa55" and converts it to a list such as list(255,170,85). If an RGBA format is used - that includes alpha, the list will have a fourth item for the alpha value. -hsv(hue, sat, val, apha) - Counterpart to rgb(), this takes the values you input and converts them to a string in "#hhhssvv" or "#hhhssvvaa" - format. Alpha is not included in the result if null. -ReadHSV(rgb) - Takes an HSV string like "#100FF80" and converts it to a list such as list(256,255,128). If an HSVA format is used that - includes alpha, the list will have a fourth item for the alpha value. -RGBtoHSV(rgb) - Takes an RGB or RGBA string like "#ffaa55" and converts it into an HSV or HSVA color such as "#080aaff". -HSVtoRGB(hsv) - Takes an HSV or HSVA string like "#080aaff" and converts it into an RGB or RGBA color such as "#ff55aa". BlendRGB(rgb1, rgb2, amount) Blends between two RGB or RGBA colors using regular RGB blending. If amount is 0, the first color is the result; if 1, the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well. - The returned value is an RGB or RGBA color. -BlendHSV(hsv1, hsv2, amount) - Blends between two HSV or HSVA colors using HSV blending, which tends to produce nicer results than regular RGB + Returns an RGB or RGBA string +BlendHSV(rgb1, rgb2, amount) + Blends between two RGB or RGBA colors using HSV blending, which tends to produce nicer results than regular RGB blending because the brightness of the color is left intact. If amount is 0, the first color is the result; if 1, the second color is the result. 0.5 produces an average of the two. Values outside the 0 to 1 range are allowed as well. - The returned value is an HSV or HSVA color. -BlendRGBasHSV(rgb1, rgb2, amount) - Like BlendHSV(), but the colors used and the return value are RGB or RGBA colors. The blending is done in HSV form. + Returns an RGB or RGBA string HueToAngle(hue) Converts a hue to an angle range of 0 to 360. Angle 0 is red, 120 is green, and 240 is blue. AngleToHue(hue) Converts an angle to a hue in the valid range. -RotateHue(hsv, angle) - Takes an HSV or HSVA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360. - (Rotating red by 60° produces yellow.) The result is another HSV or HSVA color with the same saturation and value - as the original, but a different hue. +RotateHue(rgb, angle) + Takes an RGB or RGBA value and rotates the hue forward through red, green, and blue by an angle from 0 to 360. + (Rotating red by 60° produces yellow.) + Returns an RGB or RGBA string GrayScale(rgb) Takes an RGB or RGBA color and converts it to grayscale. Returns an RGB or RGBA string. ColorTone(rgb, tone) @@ -215,8 +201,7 @@ world #define TO_HEX_DIGIT(n) ascii2text((n&15) + ((n&15)<10 ? 48 : 87)) - - // Multiply all alpha values by this float +// Multiply all alpha values by this float /icon/proc/ChangeOpacity(opacity = 1) MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,opacity, 0,0,0,0) @@ -227,7 +212,7 @@ world /icon/proc/ColorTone(tone) GrayScale() - var/list/TONE = ReadRGB(tone) + var/list/TONE = rgb2num(tone) var/gray = round(TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11, 1) var/icon/upper = (255-gray) ? new(src) : null @@ -243,26 +228,26 @@ world // Take the minimum color of two icons; combine transparency as if blending with ICON_ADD /icon/proc/MinColors(icon) - var/icon/I = new(src) - I.Opaque() - I.Blend(icon, ICON_SUBTRACT) - Blend(I, ICON_SUBTRACT) + var/icon/new_icon = new(src) + new_icon.Opaque() + new_icon.Blend(icon, ICON_SUBTRACT) + Blend(new_icon, ICON_SUBTRACT) // Take the maximum color of two icons; combine opacity as if blending with ICON_OR /icon/proc/MaxColors(icon) - var/icon/I + var/icon/new_icon if(isicon(icon)) - I = new(icon) + new_icon = new(icon) else // solid color - I = new(src) - I.Blend("#000000", ICON_OVERLAY) - I.SwapColor("#000000", null) - I.Blend(icon, ICON_OVERLAY) - var/icon/J = new(src) - J.Opaque() - I.Blend(J, ICON_SUBTRACT) - Blend(I, ICON_OR) + new_icon = new(src) + new_icon.Blend("#000000", ICON_OVERLAY) + new_icon.SwapColor("#000000", null) + new_icon.Blend(icon, ICON_OVERLAY) + var/icon/blend_icon = new(src) + blend_icon.Opaque() + new_icon.Blend(blend_icon, ICON_SUBTRACT) + Blend(new_icon, ICON_OR) // make this icon fully opaque--transparent pixels become black /icon/proc/Opaque(background = "#000000") @@ -280,250 +265,30 @@ world AddAlphaMask(mask) /icon/proc/AddAlphaMask(mask) - var/icon/M = new(mask) - M.Blend("#ffffff", ICON_SUBTRACT) + var/icon/mask_icon = new(mask) + mask_icon.Blend("#ffffff", ICON_SUBTRACT) // apply mask - Blend(M, ICON_ADD) - -/* - HSV format is represented as "#hhhssvv" or "#hhhssvvaa" - - Hue ranges from 0 to 0x5ff (1535) - - 0x000 = red - 0x100 = yellow - 0x200 = green - 0x300 = cyan - 0x400 = blue - 0x500 = magenta - - Saturation is from 0 to 0xff (255) - - More saturation = more color - Less saturation = more gray - - Value ranges from 0 to 0xff (255) - - Higher value means brighter color - */ - -/proc/ReadRGB(rgb) - if(!rgb) - return - - // interpret the HSV or HSVA value - var/i=1,start=1 - if(text2ascii(rgb) == 35) ++start // skip opening # - var/ch,which=0,r=0,g=0,b=0,alpha=0,usealpha - var/digits=0 - for(i=start, i<=length(rgb), ++i) - ch = text2ascii(rgb, i) - if(ch < 48 || (ch > 57 && ch < 65) || (ch > 70 && ch < 97) || ch > 102) - break - ++digits - if(digits == 8) - break - - var/single = digits < 6 - if(digits != 3 && digits != 4 && digits != 6 && digits != 8) - return - if(digits == 4 || digits == 8) - usealpha = 1 - for(i=start, digits>0, ++i) - ch = text2ascii(rgb, i) - if(ch >= 48 && ch <= 57) - ch -= 48 - else if(ch >= 65 && ch <= 70) - ch -= 55 - else if(ch >= 97 && ch <= 102) - ch -= 87 - else - break - --digits - switch(which) - if(0) - r = (r << 4) | ch - if(single) - r |= r << 4 - ++which - else if(!(digits & 1)) - ++which - if(1) - g = (g << 4) | ch - if(single) - g |= g << 4 - ++which - else if(!(digits & 1)) - ++which - if(2) - b = (b << 4) | ch - if(single) - b |= b << 4 - ++which - else if(!(digits & 1)) - ++which - if(3) - alpha = (alpha << 4) | ch - if(single) - alpha |= alpha << 4 - - . = list(r, g, b) - if(usealpha) - . += alpha - -/proc/ReadHSV(hsv) - if(!hsv) - return - - // interpret the HSV or HSVA value - var/i=1,start=1 - if(text2ascii(hsv) == 35) - ++start // skip opening # - var/ch,which=0,hue=0,sat=0,val=0,alpha=0,usealpha - var/digits=0 - for(i=start, i<=length(hsv), ++i) - ch = text2ascii(hsv, i) - if(ch < 48 || (ch > 57 && ch < 65) || (ch > 70 && ch < 97) || ch > 102) - break - ++digits - if(digits == 9) - break - if(digits > 7) - usealpha = 1 - if(digits <= 4) - ++which - if(digits <= 2) - ++which - for(i=start, digits>0, ++i) - ch = text2ascii(hsv, i) - if(ch >= 48 && ch <= 57) - ch -= 48 - else if(ch >= 65 && ch <= 70) - ch -= 55 - else if(ch >= 97 && ch <= 102) - ch -= 87 - else - break - --digits - switch(which) - if(0) - hue = (hue << 4) | ch - if(digits == (usealpha ? 6 : 4)) - ++which - if(1) - sat = (sat << 4) | ch - if(digits == (usealpha ? 4 : 2)) - ++which - if(2) - val = (val << 4) | ch - if(digits == (usealpha ? 2 : 0)) - ++which - if(3) - alpha = (alpha << 4) | ch - - . = list(hue, sat, val) - if(usealpha) - . += alpha - -/proc/HSVtoRGB(hsv) - if(!hsv) - return "#000000" - var/list/HSV = ReadHSV(hsv) - if(!HSV) + Blend(mask_icon, ICON_ADD) + +/// Converts an rgb color into a list storing hsva +/// Exists because it's useful to have a guarenteed alpha value +/proc/rgb2hsv(rgb) + RETURN_TYPE(/list) + var/list/hsv = rgb2num(rgb, COLORSPACE_HSV) + if(length(hsv) < 4) + hsv += 255 // Max alpha, just to make life easy + return hsv + +/// Converts a list storing hsva into an rgb color string +/proc/hsv2rgb(hsv) + if(length(hsv) < 3) return "#000000" - - var/hue = HSV[1] - var/sat = HSV[2] - var/val = HSV[3] - - // Compress hue into easier-to-manage range - hue -= hue >> 8 - if(hue >= 0x5fa) - hue -= 0x5fa - - var/hi,mid,lo,r,g,b - hi = val - lo = round((255 - sat) * val / 255, 1) - mid = lo + round(abs(round(hue, 510) - hue) * (hi - lo) / 255, 1) - if(hue >= 765) - if(hue >= 1275) {r=hi; g=lo; b=mid} - else if(hue >= 1020) {r=mid; g=lo; b=hi } - else {r=lo; g=mid; b=hi } - else - if(hue >= 510) {r=lo; g=hi; b=mid} - else if(hue >= 255) {r=mid; g=hi; b=lo } - else {r=hi; g=mid; b=lo } - - return (HSV.len > 3) ? rgb(r,g,b,HSV[4]) : rgb(r,g,b) - -/proc/RGBtoHSV(rgb) - if(!rgb) - return "#0000000" - var/list/RGB = ReadRGB(rgb) - if(!RGB) - return "#0000000" - - var/r = RGB[1] - var/g = RGB[2] - var/b = RGB[3] - var/hi = max(r,g,b) - var/lo = min(r,g,b) - - var/val = hi - var/sat = hi ? round((hi-lo) * 255 / hi, 1) : 0 - var/hue = 0 - - if(sat) - var/dir - var/mid - if(hi == r) - if(lo == b) {hue=0; dir=1; mid=g} - else {hue=1535; dir=-1; mid=b} - else if(hi == g) - if(lo == r) {hue=512; dir=1; mid=b} - else {hue=511; dir=-1; mid=r} - else if(hi == b) - if(lo == g) {hue=1024; dir=1; mid=r} - else {hue=1023; dir=-1; mid=g} - hue += dir * round((mid-lo) * 255 / (hi-lo), 1) - - return hsv(hue, sat, val, (RGB.len>3 ? RGB[4] : null)) - -/proc/hsv(hue, sat, val, alpha) - if(hue < 0 || hue >= 1536) - hue %= 1536 - if(hue < 0) - hue += 1536 - if((hue & 0xFF) == 0xFF) - ++hue - if(hue >= 1536) - hue = 0 - if(sat < 0) - sat = 0 - if(sat > 255) - sat = 255 - if(val < 0) - val = 0 - if(val > 255) - val = 255 - . = "#" - . += TO_HEX_DIGIT(hue >> 8) - . += TO_HEX_DIGIT(hue >> 4) - . += TO_HEX_DIGIT(hue) - . += TO_HEX_DIGIT(sat >> 4) - . += TO_HEX_DIGIT(sat) - . += TO_HEX_DIGIT(val >> 4) - . += TO_HEX_DIGIT(val) - if(!isnull(alpha)) - if(alpha < 0) - alpha = 0 - if(alpha > 255) - alpha = 255 - . += TO_HEX_DIGIT(alpha >> 4) - . += TO_HEX_DIGIT(alpha) + if(length(hsv) == 3) + return rgb(hsv[1], hsv[2], hsv[3], space = COLORSPACE_HSV) + return rgb(hsv[1], hsv[2], hsv[3], hsv[4], space = COLORSPACE_HSV) /* - Smooth blend between HSV colors + Smooth blend between RGB colors interpreted as HSV amount=0 is the first color amount=1 is the second color @@ -532,63 +297,7 @@ world amount<0 or amount>1 are allowed */ /proc/BlendHSV(hsv1, hsv2, amount) - var/list/HSV1 = ReadHSV(hsv1) - var/list/HSV2 = ReadHSV(hsv2) - - // add missing alpha if needed - if(HSV1.len < HSV2.len) - HSV1 += 255 - else if(HSV2.len < HSV1.len) - HSV2 += 255 - var/usealpha = HSV1.len > 3 - - // normalize hsv values in case anything is screwy - if(HSV1[1] > 1536) - HSV1[1] %= 1536 - if(HSV2[1] > 1536) - HSV2[1] %= 1536 - if(HSV1[1] < 0) - HSV1[1] += 1536 - if(HSV2[1] < 0) - HSV2[1] += 1536 - if(!HSV1[3]) {HSV1[1] = 0; HSV1[2] = 0} - if(!HSV2[3]) {HSV2[1] = 0; HSV2[2] = 0} - - // no value for one color means don't change saturation - if(!HSV1[3]) - HSV1[2] = HSV2[2] - if(!HSV2[3]) - HSV2[2] = HSV1[2] - // no saturation for one color means don't change hues - if(!HSV1[2]) - HSV1[1] = HSV2[1] - if(!HSV2[2]) - HSV2[1] = HSV1[1] - - // Compress hues into easier-to-manage range - HSV1[1] -= HSV1[1] >> 8 - HSV2[1] -= HSV2[1] >> 8 - - var/hue_diff = HSV2[1] - HSV1[1] - if(hue_diff > 765) - hue_diff -= 1530 - else if(hue_diff <= -765) - hue_diff += 1530 - - var/hue = round(HSV1[1] + hue_diff * amount, 1) - var/sat = round(HSV1[2] + (HSV2[2] - HSV1[2]) * amount, 1) - var/val = round(HSV1[3] + (HSV2[3] - HSV1[3]) * amount, 1) - var/alpha = usealpha ? round(HSV1[4] + (HSV2[4] - HSV1[4]) * amount, 1) : null - - // normalize hue - if(hue < 0 || hue >= 1530) - hue %= 1530 - if(hue < 0) - hue += 1530 - // decompress hue - hue += round(hue / 255) - - return hsv(hue, sat, val, alpha) + return hsv_gradient(amount, 0, hsv1, 1, hsv2, "loop") /* Smooth blend between RGB colors @@ -600,25 +309,7 @@ world amount<0 or amount>1 are allowed */ /proc/BlendRGB(rgb1, rgb2, amount) - var/list/RGB1 = ReadRGB(rgb1) - var/list/RGB2 = ReadRGB(rgb2) - - // add missing alpha if needed - if(RGB1.len < RGB2.len) - RGB1 += 255 - else if(RGB2.len < RGB1.len) - RGB2 += 255 - var/usealpha = RGB1.len > 3 - - var/r = round(RGB1[1] + (RGB2[1] - RGB1[1]) * amount, 1) - var/g = round(RGB1[2] + (RGB2[2] - RGB1[2]) * amount, 1) - var/b = round(RGB1[3] + (RGB2[3] - RGB1[3]) * amount, 1) - var/alpha = usealpha ? round(RGB1[4] + (RGB2[4] - RGB1[4]) * amount, 1) : null - - return isnull(alpha) ? rgb(r, g, b) : rgb(r, g, b, alpha) - -/proc/BlendRGBasHSV(rgb1, rgb2, amount) - return HSVtoRGB(RGBtoHSV(rgb1), RGBtoHSV(rgb2), amount) + return rgb_gradient(amount, 0, rgb1, 1, rgb2, "loop") /proc/HueToAngle(hue) // normalize hsv in case anything is screwy @@ -639,10 +330,9 @@ world hue += round(hue / 255) return hue - // positive angle rotates forward through red->green->blue -/proc/RotateHue(hsv, angle) - var/list/HSV = ReadHSV(hsv) +/proc/RotateHue(rgb, angle) + var/list/HSV = rgb2hsv(rgb) // normalize hsv in case anything is screwy if(HSV[1] >= 1536) @@ -665,18 +355,18 @@ world // decompress hue HSV[1] += round(HSV[1] / 255) - return hsv(HSV[1], HSV[2], HSV[3], (HSV.len > 3 ? HSV[4] : null)) + return hsv2rgb(HSV) // Convert an rgb color to grayscale /proc/GrayScale(rgb) - var/list/RGB = ReadRGB(rgb) + var/list/RGB = rgb2num(rgb) var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 return (RGB.len > 3) ? rgb(gray, gray, gray, RGB[4]) : rgb(gray, gray, gray) // Change grayscale color to black->tone->white range /proc/ColorTone(rgb, tone) - var/list/RGB = ReadRGB(rgb) - var/list/TONE = ReadRGB(tone) + var/list/RGB = rgb2num(rgb) + var/list/TONE = rgb2num(tone) var/gray = RGB[1]*0.3 + RGB[2]*0.59 + RGB[3]*0.11 var/tone_gray = TONE[1]*0.3 + TONE[2]*0.59 + TONE[3]*0.11 @@ -701,15 +391,11 @@ world var/lo3 = text2ascii(hex, 7) // B var/hi4 = text2ascii(hex, 8) // A var/lo4 = text2ascii(hex, 9) // A - return list(((hi1>= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48), + return list(((hi1 >= 65 ? hi1-55 : hi1-48)<<4) | (lo1 >= 65 ? lo1-55 : lo1-48), ((hi2 >= 65 ? hi2-55 : hi2-48)<<4) | (lo2 >= 65 ? lo2-55 : lo2-48), ((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)) -/// Create a single [/icon] from a given [/atom] or [/image]. -/// -/// Very low-performance. Should usually only be used for HTML, where BYOND's -/// appearance system (overlays/underlays, etc.) is not available. /// /// Only the first argument is required. /proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE) @@ -757,7 +443,7 @@ world var/curicon = appearance.icon || deficon var/curstate = appearance.icon_state || defstate - var/curdir = (!appearance.dir || appearance.dir == SOUTH) ? defdir : appearance.dir + var/curdir = defdir || appearance.dir || SOUTH var/render_icon = curicon @@ -871,7 +557,7 @@ world else return icon(flat, "", SOUTH) else if (render_icon) // There's no overlays. - var/icon/final_icon = icon(icon(curicon, curstate, base_icon_dir), "", SOUTH, no_anim ? TRUE : null) + var/icon/final_icon = icon(icon(curicon, curstate, base_icon_dir), "", SOUTH, no_anim ? 1 : null) if (appearance.alpha < 255) final_icon.Blend(rgb(255,255,255, appearance.alpha), ICON_MULTIPLY) @@ -1151,7 +837,7 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) dummySave = null fdel("tmp/dummySave.sav") //if you get the idea to try and make this more optimized, make sure to still call unlock on the savefile after every write to unlock it. -/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null) +/proc/icon2html(thing, target, icon_state, dir = SOUTH, frame = 1, moving = FALSE, sourceonly = FALSE, extra_classes = null, realsize = FALSE) if (!thing) return if(SSlag_switch.measures[DISABLE_USR_ICON2HTML] && usr && !HAS_TRAIT(usr, TRAIT_BYPASS_MEASURES)) @@ -1218,6 +904,18 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) SSassets.transport.send_assets(thing2, key) if(sourceonly) return SSassets.transport.get_asset_url(key) + + if(realsize) + var/static/list/icon_widths = list() + var/static/list/icon_heights = list() + var/x = icon_widths[key] + var/y = icon_heights[key] + if(isnull(x)) + x = icon_widths[key] = I.Width() + if(isnull(y)) + y = icon_heights[key] = I.Height() + + return "" return "" /proc/icon2base64html(thing) @@ -1268,6 +966,67 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) GLOBAL_LIST_EMPTY(transformation_animation_objects) +///given a text string, returns whether it is a valid dmi icons folder path +/proc/is_valid_dmi_file(icon_path) + if(!istext(icon_path) || !length(icon_path)) + return FALSE + + var/is_in_icon_folder = findtextEx(icon_path, "icons/") + var/is_dmi_file = findtextEx(icon_path, ".dmi") + + if(is_in_icon_folder && is_dmi_file) + return TRUE + return FALSE + +/// given an icon object, dmi file path, or atom/image/mutable_appearance, attempts to find and return an associated dmi file path. +/// a weird quirk about dm is that /icon objects represent both compile-time or dynamic icons in the rsc, +/// but stringifying rsc references returns a dmi file path +/// ONLY if that icon represents a completely unchanged dmi file from when the game was compiled. +/// so if the given object is associated with an icon that was in the rsc when the game was compiled, this returns a path. otherwise it returns "" +/proc/get_icon_dmi_path(icon/icon) + /// the dmi file path we attempt to return if the given object argument is associated with a stringifiable icon + /// if successful, this looks like "icons/path/to/dmi_file.dmi" + var/icon_path = "" + + if(isatom(icon) || istype(icon, /image) || istype(icon, /mutable_appearance)) + var/atom/atom_icon = icon + icon = atom_icon.icon + //atom icons compiled in from 'icons/path/to/dmi_file.dmi' are weird and not really icon objects that you generate with icon(). + //if theyre unchanged dmi's then they're stringifiable to "icons/path/to/dmi_file.dmi" + + if(isicon(icon) && isfile(icon)) + //icons compiled in from 'icons/path/to/dmi_file.dmi' at compile time are weird and arent really /icon objects, + ///but they pass both isicon() and isfile() checks. theyre the easiest case since stringifying them gives us the path we want + var/icon_ref = ref(icon) + var/locate_icon_string = "[locate(icon_ref)]" + + icon_path = locate_icon_string + + else if(isicon(icon) && "[icon]" == "/icon") + // icon objects generated from icon() at runtime are icons, but they ARENT files themselves, they represent icon files. + // if the files they represent are compile time dmi files in the rsc, then + // the rsc reference returned by fcopy_rsc() will be stringifiable to "icons/path/to/dmi_file.dmi" + var/rsc_ref = fcopy_rsc(icon) + + var/icon_ref = ref(rsc_ref) + + var/icon_path_string = "[locate(icon_ref)]" + + icon_path = icon_path_string + + else if(istext(icon)) + var/rsc_ref = fcopy_rsc(icon) + //if its the text path of an existing dmi file, the rsc reference returned by fcopy_rsc() will be stringifiable to a dmi path + + var/rsc_ref_ref = ref(rsc_ref) + var/rsc_ref_string = "[locate(rsc_ref_ref)]" + + icon_path = rsc_ref_string + + if(is_valid_dmi_file(icon_path)) + return icon_path + + return FALSE /* * Creates animation that turns current icon into result appearance from top down. @@ -1379,26 +1138,23 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) ///Checks if the given iconstate exists in the given file, caching the result. Setting scream to TRUE will print a stack trace ONCE. /proc/icon_exists(file, state, scream) + var/static/list/screams = list() var/static/list/icon_states_cache = list() - if(icon_states_cache[file]?[state]) - return TRUE - - if(icon_states_cache[file]?[state] == FALSE) - return FALSE - - var/list/states = icon_states(file) + if(isnull(file) || isnull(state)) + return FALSE //This is common enough that it shouldn't panic, imo. - if(!icon_states_cache[file]) + if(isnull(icon_states_cache[file])) icon_states_cache[file] = list() + for(var/istate in icon_states(file)) + icon_states_cache[file][istate] = TRUE - if(state in states) - icon_states_cache[file][state] = TRUE - return TRUE - else - icon_states_cache[file][state] = FALSE - if(scream) - stack_trace("Icon Lookup for state: [state] in file [file] failed.") + if(isnull(icon_states_cache[file][state])) + if(isnull(screams[file]) && scream) + screams[file] = TRUE + stack_trace("State [state] in file [file] does not exist.") return FALSE + else + return TRUE /atom/proc/save_icon() if(!fexists("data/saved_icons.dmi")) @@ -1421,3 +1177,22 @@ GLOBAL_LIST_EMPTY(transformation_animation_objects) temp.Blend(color, ICON_MULTIPLY) local.Insert(temp, initial(name)) fcopy(local, "data/saved_icons.dmi") + +/// This exists purely to import sprites from a codebase like Citadel RP. +/proc/pull_apart_damage_states(damage_states_file, species) + if(!fexists("data/saved_icons.dmi")) + fcopy("", "data/saved_icons.dmi") + var/mob/living/carbon/human/human = new() + human.set_species(species) + var/icon/local = icon("data/saved_icons.dmi") + for(var/obj/item/bodypart/BP as anything in human.bodyparts) + for(var/state in list("10", "20", "30", "01", "02", "03")) + var/icon/masked_icon = icon(damage_states_file, state) + var/icon/masker = UNLINT(icon(BP.icon_greyscale, BP.is_dimorphic ? "[BP.limb_id]_[BP.body_zone]_[BP.limb_gender]" : "[BP.limb_id]_[BP.body_zone]")) + masker.Blend("#FFFFFF") + masker.BecomeAlphaMask() + masked_icon.AddAlphaMask(masker) + masked_icon.Blend("#950A0A", ICON_MULTIPLY) + UNLINT(local.Insert(masked_icon, "[BP.body_zone]_[state]")) + + fcopy(local, "data/saved_icons.dmi") diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm index 08c360849b58..9011e18b7f8b 100644 --- a/code/__HELPERS/lighting.dm +++ b/code/__HELPERS/lighting.dm @@ -1,11 +1,37 @@ /// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. /proc/emissive_appearance(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS) - appearance.color = GLOB.emissive_color + if(alpha == 255) + appearance.color = GLOB.emissive_color + else + var/alpha_ratio = alpha/255 + appearance.color = _EMISSIVE_COLOR(alpha_ratio) return appearance /// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EM_BLOCK_COLOR]. /proc/emissive_blocker(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + // Note: alpha doesn't "do" anything, since it's overriden by the color set shortly after + // Consider removing it someday? var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags | EMISSIVE_APPEARANCE_FLAGS) appearance.color = GLOB.em_block_color return appearance + +// This is a semi hot proc, so we micro it. saves maybe 150ms +// sorry :) +/proc/fast_emissive_blocker(atom/make_blocker) + // Note: alpha doesn't "do" anything, since it's overriden by the color set shortly after + // Consider removing it someday? + var/mutable_appearance/blocker = new() + blocker.icon = make_blocker.icon + blocker.icon_state = make_blocker.icon_state + // blocker.layer = FLOAT_LAYER // Implied, FLOAT_LAYER is default for appearances + blocker.appearance_flags |= make_blocker.appearance_flags | EMISSIVE_APPEARANCE_FLAGS + blocker.dir = make_blocker.dir + if(make_blocker.alpha == 255) + blocker.color = GLOB.em_block_color + else + var/alpha_ratio = make_blocker.alpha/255 + blocker.color = _EM_BLOCK_COLOR(alpha_ratio) + blocker.plane = EMISSIVE_PLANE + + return blocker diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm index 33aea99ad999..1522e262b924 100644 --- a/code/__HELPERS/maths.dm +++ b/code/__HELPERS/maths.dm @@ -261,3 +261,40 @@ /// Returns the angle of the matrix according to atan2 on the b, a parts /matrix/proc/get_angle() return Atan2(b, a) + +/// Converts kelvin to farenheit +#define FAHRENHEIT(kelvin) (kelvin * 1.8) - 459.67 + +/* + This proc makes the input taper off above cap. But there's no absolute cutoff. + Chunks of the input value above cap, are reduced more and more with each successive one and added to the output + A higher input value always makes a higher output value. but the rate of growth slows +*/ +/proc/soft_cap(input, cap = 0, groupsize = 1, groupmult = 0.9) + + //The cap is a ringfenced amount. If we're below that, just return the input + if (input <= cap) + return input + + var/output = 0 + var/buffer = 0 + var/power = 1//We increment this after each group, then apply it to the groupmult as a power + + //Ok its above, so the cap is a safe amount, we move that to the output + input -= cap + output += cap + + //Now we start moving groups from input to buffer + + + while (input > 0) + buffer = min(input, groupsize) //We take the groupsize, or all the input has left if its less + input -= buffer + + buffer *= groupmult**power //This reduces the group by the groupmult to the power of which index we're on. + //This ensures that each successive group is reduced more than the previous one + + output += buffer + power++ //Transfer to output, increment power, repeat until the input pile is all used + + return output diff --git a/code/__HELPERS/matrices.dm b/code/__HELPERS/matrices.dm index ee4c5a5b11db..aae892ac720f 100644 --- a/code/__HELPERS/matrices.dm +++ b/code/__HELPERS/matrices.dm @@ -68,6 +68,16 @@ //doesn't have an object argument because this is "Stacking" with the animate call above //3 billion% intentional +/atom/proc/shake_animation(intensity = 8) + var/initial_transform = new/matrix(transform) + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + var/rotation = 2+soft_cap(intensity, 1, 1, 0.94) + var/offset = 1+soft_cap(intensity*0.3, 1, 1, 0.8) + var/time = 2+soft_cap(intensity*0.3, 2, 1, 0.92) + animate(src, transform=turn(transform, rotation*shake_dir), pixel_x=init_px + offset*shake_dir, time=1, flags = ANIMATION_PARALLEL) + animate(transform=initial_transform, pixel_x=init_px, time=time, easing=ELASTIC_EASING) + /** * Shear the transform on either or both axes. * * x - X axis shearing @@ -210,21 +220,32 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro 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) +/** + * Converts RGB shorthands into RGBA matrices complete of constants rows (ergo a 20 keys list in byond). + * if return_identity_on_fail is true, stack_trace is called instead of CRASH, and an identity is returned. + */ +/proc/color_to_full_rgba_matrix(color, return_identity_on_fail = TRUE) + if(!color) + return COLOR_MATRIX_IDENTITY if(istext(color)) - var/list/L = ReadRGB(color) + var/list/L = rgb2num(color) if(!L) - CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") + var/message = "Invalid/unsupported color ([color]) argument in color_to_full_rgba_matrix()" + if(return_identity_on_fail) + stack_trace(message) + return COLOR_MATRIX_IDENTITY + CRASH(message) 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() + + if(!islist(color)) //invalid format + CRASH("Invalid/unsupported color ([color]) argument in color_to_full_rgba_matrix()") + 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]) + var/list/rgb = rgb2num(L[a]) for(var/b in rgb) . += b/255 if(length(rgb) % 4) // RGB has no alpha instruction @@ -244,17 +265,18 @@ round(cos_inv_third+sqrt3_sin, 0.001), round(cos_inv_third-sqrt3_sin, 0.001), ro for(var/b in 1 to 20-L.len) . += 0 else - CRASH("Invalid/unsupported color format argument in color_to_full_rgba_matrix()") - -//Returns an identity color matrix which does nothing -/proc/color_identity() - return list(1,0,0, 0,1,0, 0,0,1) + var/message = "Invalid/unsupported color (list of length [L.len]) argument in color_to_full_rgba_matrix()" + if(return_identity_on_fail) + stack_trace(message) + return COLOR_MATRIX_IDENTITY + CRASH(message) //Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting whites //TODO: Need a version that only affects one color (ie shift red to blue but leave greens and blues alone) /proc/color_rotation(angle) if(angle == 0) - return color_identity() + return COLOR_MATRIX_IDENTITY + angle = clamp(angle, -180, 180) var/cos = cos(angle) var/sin = sin(angle) @@ -285,7 +307,7 @@ GLOBAL_REAL_VAR(list/delta_index) = list( /proc/color_contrast(value) value = clamp(value, -100, 100) if(value == 0) - return color_identity() + return COLOR_MATRIX_IDENTITY var/x = 0 if (value < 0) @@ -305,7 +327,7 @@ GLOBAL_REAL_VAR(list/delta_index) = list( //Exxagerates or removes colors /proc/color_saturation(value as num) if(value == 0) - return color_identity() + return COLOR_MATRIX_IDENTITY value = clamp(value, -100, 100) if(value > 0) value *= 3 diff --git a/code/__HELPERS/memory_helpers.dm b/code/__HELPERS/memory_helpers.dm index ff66ab12bf14..64865d0a9f89 100644 --- a/code/__HELPERS/memory_helpers.dm +++ b/code/__HELPERS/memory_helpers.dm @@ -41,18 +41,6 @@ if(!(memory_flags & MEMORY_FLAG_NOLOCATION)) extra_info[DETAIL_WHERE] = get_area(victim) - if(!(memory_flags & MEMORY_FLAG_NOMOOD)) - var/datum/component/mood/victim_mood_component = current.GetComponent(/datum/component/mood) - if(victim_mood_component) - victim_mood = victim_mood_component.mood_level - - if(victim == current) - story_mood = victim_mood - else - var/datum/component/mood/memorizer_mood_component = current.GetComponent(/datum/component/mood) - if(memorizer_mood_component) - story_mood = memorizer_mood_component.mood_level - extra_info[DETAIL_PROTAGONIST_MOOD] = victim_mood var/datum/memory/replaced_memory = memories[memory_type] @@ -72,8 +60,9 @@ /datum/mind/proc/build_story_mob(mob/living/target) if(isanimal(target)) return "\the [target]" - if(target.mind?.assigned_role) - return "\the [lowertext(initial(target.mind?.assigned_role.title))]" + if(ishuman(target)) + var/mob/living/carbon/human/H = target + return H.get_face_name() return target ///returns the story name of anything diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b8b4543cd358..e52ee128ead0 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -7,7 +7,21 @@ #define FACING_INIT_FACING_TARGET_TARGET_FACING_PERPENDICULAR 3 //Do I win the most informative but also most stupid define award? /proc/random_blood_type() - return pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + var/datum/blood/path = pick(\ + 4;/datum/blood/human/omin, \ + 36;/datum/blood/human/opos, \ + 3;/datum/blood/human/amin, \ + 28;/datum/blood/human/apos, \ + 1;/datum/blood/human/bmin, \ + 20;/datum/blood/human/bpos, \ + 1;/datum/blood/human/abmin, \ + 5;/datum/blood/human/abpos\ + ) + return GET_BLOOD_REF(path) + +/proc/get_blood_dna_color(list/blood_dna) + var/datum/blood/blood_type = blood_dna?[blood_dna[length(blood_dna)]] + return blood_type?.color /proc/random_eye_color() switch(pick(20;"brown",20;"hazel",20;"grey",15;"blue",15;"green",1;"amber",1;"albino")) @@ -59,54 +73,6 @@ return pick(GLOB.backpacklist) /proc/random_features() - if(!GLOB.tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/, GLOB.tails_list, add_blank = TRUE) - if(!GLOB.tails_list_human.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE) - if(!GLOB.tails_list_lizard.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE) - if(!GLOB.snouts_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list) - if(!GLOB.horns_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/horns, GLOB.horns_list) - if(!GLOB.ears_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.horns_list) - if(!GLOB.frills_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, GLOB.frills_list) - if(!GLOB.spines_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list) - if(!GLOB.legs_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list) - if(!GLOB.wings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list) - if(!GLOB.moth_wings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list) - if(!GLOB.moth_antennae_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list) - if(!GLOB.moth_markings_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) - if(!GLOB.pod_hair_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) - if(!GLOB.headtails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/headtails, GLOB.headtails_list) - if(!GLOB.teshari_feathers_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_feathers, GLOB.teshari_feathers_list) - if(!GLOB.teshari_ears_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_ears, GLOB.teshari_ears_list) - if(!GLOB.teshari_body_feathers_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/teshari_body_feathers, GLOB.teshari_body_feathers_list) - if(!GLOB.teshari_tails_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/teshari, GLOB.teshari_tails_list) - - if(!GLOB.vox_hair_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_hair, GLOB.vox_hair_list) - if(!GLOB.vox_facial_hair_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/facial_vox_hair, GLOB.vox_facial_hair_list) - if(!GLOB.tails_list_vox.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/vox, GLOB.tails_list_vox) - if(!GLOB.vox_snouts_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/vox_snouts, GLOB.vox_snouts_list) - //For now we will always return none for tail_human and ears. | "For now" he says. return(list( "ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], @@ -125,7 +91,6 @@ "moth_markings" = pick(GLOB.moth_markings_list), "tail_monkey" = "None", "pod_hair" = pick(GLOB.pod_hair_list), - "headtails" = (pick(GLOB.headtails_list)), "vox_snout" = pick(GLOB.vox_snouts_list), "tail_vox" = pick(GLOB.tails_list_vox), "vox_hair" = pick(GLOB.vox_hair_list), @@ -134,6 +99,12 @@ "teshari_ears" = pick(GLOB.teshari_ears_list), "teshari_body_feathers" = pick(GLOB.teshari_body_feathers_list), "tail_teshari" = pick(GLOB.teshari_tails_list), + "ipc_screen" = pick(GLOB.ipc_screens_list), + "ipc_antenna" = pick(GLOB.ipc_antenna_list), + "saurian_screen" = pick(GLOB.saurian_screens_list), + "saurian_tail" = pick(GLOB.saurian_tails_list), + "saurian_scutes" = pick(GLOB.saurian_scutes_list), + "saurian_antenna" = pick(GLOB.saurian_antenna_list), )) /proc/random_mutant_colors() @@ -296,7 +267,7 @@ GLOBAL_LIST_EMPTY(species_list) * given `time`. Returns `TRUE` on success or `FALSE` on failure. * Interaction_key is the assoc key under which the do_after is capped, with max_interact_count being the cap. Interaction key will default to target if not set. */ -/proc/do_after(mob/user, atom/target, time, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, image/display) +/proc/do_after(atom/movable/user, atom/target, time, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, image/display) if(!user) return FALSE @@ -322,10 +293,14 @@ GLOBAL_LIST_EMPTY(species_list) if(SSmove_manager.processing_on(user, SSspacedrift)) drifting = TRUE - var/holding = user.get_active_held_item() - - if(!(timed_action_flags & IGNORE_SLOWDOWNS)) - time *= user.cached_multiplicative_actions_slowdown + var/holding + if(ismob(user)) + var/mob/mobuser = user + holding = mobuser.get_active_held_item() + if(!(timed_action_flags & IGNORE_SLOWDOWNS)) + time *= mobuser.cached_multiplicative_actions_slowdown + else + timed_action_flags |= IGNORE_HELD_ITEM|IGNORE_INCAPACITATED|IGNORE_SLOWDOWNS|DO_PUBLIC var/datum/progressbar/progbar if(progress) @@ -350,7 +325,7 @@ GLOBAL_LIST_EMPTY(species_list) if( QDELETED(user) \ || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \ - || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \ + || (!(timed_action_flags & IGNORE_HELD_ITEM) && user:get_active_held_item() != holding) \ || (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \ || (extra_checks && !extra_checks.Invoke()) \ ) @@ -366,6 +341,10 @@ GLOBAL_LIST_EMPTY(species_list) progbar.end_progress() if(interaction_key) + var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key)) - 1 + if(reduced_interaction_count > 0) // Not done yet! + LAZYSET(user.do_afters, interaction_key, reduced_interaction_count) + return LAZYREMOVE(user.do_afters, interaction_key) @@ -444,8 +423,19 @@ GLOBAL_LIST_EMPTY(species_list) progbar.end_progress() if(interaction_key) + var/reduced_interaction_count = (LAZYACCESS(user.do_afters, interaction_key)) - 1 + if(reduced_interaction_count > 0) // Not done yet! + LAZYSET(user.do_afters, interaction_key, reduced_interaction_count) + return LAZYREMOVE(user.do_afters, interaction_key) +/// Returns the total amount of do_afters this mob is taking part in +/mob/proc/do_after_count() + var/count = 0 + for(var/key in do_afters) + count += do_afters[key] + return count + /proc/is_species(A, species_datum) . = FALSE if(ishuman(A)) @@ -703,7 +693,21 @@ GLOBAL_LIST_EMPTY(species_list) #define ISADVANCEDTOOLUSER(mob) (HAS_TRAIT(mob, TRAIT_ADVANCEDTOOLUSER) && !HAS_TRAIT(mob, TRAIT_DISCOORDINATED_TOOL_USER)) -#define IS_IN_STASIS(mob) (mob.has_status_effect(/datum/status_effect/grouped/stasis)) +/// If a mob is in hard or soft stasis +#define IS_IN_STASIS(mob) ((mob.stasis_level && (mob.life_ticks % mob.stasis_level)) || mob.has_status_effect(/datum/status_effect/grouped/hard_stasis)) + +/// If a mob is in hard stasis +#define IS_IN_HARD_STASIS(mob) (mob.has_status_effect(/datum/status_effect/grouped/hard_stasis)) + +/// Set a stasis level for a specific source. +#define SET_STASIS_LEVEL(mob, source, level) \ + mob.stasis_level -= mob.stasis_sources[source]; \ + mob.stasis_level += level;\ + mob.stasis_sources[source] = level + +#define UNSET_STASIS_LEVEL(mob, source) \ + mob.stasis_level -= mob.stasis_sources[source];\ + mob.stasis_sources -= source /// 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. @@ -779,23 +783,48 @@ GLOBAL_LIST_EMPTY(species_list) else return zone -///Takes a zone and returns it's "parent" zone, if it has one. -/proc/deprecise_zone(precise_zone) - switch(precise_zone) - if(BODY_ZONE_PRECISE_GROIN) - return BODY_ZONE_CHEST - if(BODY_ZONE_PRECISE_EYES) - return BODY_ZONE_HEAD - if(BODY_ZONE_PRECISE_R_HAND) - return BODY_ZONE_R_ARM - if(BODY_ZONE_PRECISE_L_HAND) - return BODY_ZONE_L_ARM - if(BODY_ZONE_PRECISE_L_FOOT) - return BODY_ZONE_L_LEG - if(BODY_ZONE_PRECISE_R_FOOT) - return BODY_ZONE_R_LEG - else - return precise_zone +///Returns a list of strings for a given slot flag. +/proc/parse_slot_flags(slot_flags) + var/list/slot_strings = list() + if(slot_flags & ITEM_SLOT_BACK) + slot_strings += "back" + if(slot_flags & ITEM_SLOT_MASK) + slot_strings += "mask" + if(slot_flags & ITEM_SLOT_NECK) + slot_strings += "neck" + if(slot_flags & ITEM_SLOT_HANDCUFFED) + slot_strings += "handcuff" + if(slot_flags & ITEM_SLOT_LEGCUFFED) + slot_strings += "legcuff" + if(slot_flags & ITEM_SLOT_BELT) + slot_strings += "belt" + if(slot_flags & ITEM_SLOT_ID) + slot_strings += "id" + if(slot_flags & ITEM_SLOT_EARS) + slot_strings += "ear" + if(slot_flags & ITEM_SLOT_EYES) + slot_strings += "glasses" + if(slot_flags & ITEM_SLOT_GLOVES) + slot_strings += "glove" + if(slot_flags & ITEM_SLOT_HEAD) + slot_strings += "head" + if(slot_flags & ITEM_SLOT_FEET) + slot_strings += "shoe" + if(slot_flags & ITEM_SLOT_OCLOTHING) + slot_strings += "oversuit" + if(slot_flags & ITEM_SLOT_ICLOTHING) + slot_strings += "undersuit" + if(slot_flags & ITEM_SLOT_SUITSTORE) + slot_strings += "suit storage" + if(slot_flags & (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)) + slot_strings += "pocket" + if(slot_flags & ITEM_SLOT_HANDS) + slot_strings += "hand" + if(slot_flags & ITEM_SLOT_DEX_STORAGE) + slot_strings += "dextrous storage" + if(slot_flags & ITEM_SLOT_BACKPACK) + slot_strings += "backpack" + return slot_strings ///Returns the direction that the initiator and the target are facing /proc/check_target_facings(mob/living/initiator, mob/living/target) @@ -895,9 +924,9 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /mob/dview/Initialize(mapload) //Properly prevents this mob from gaining huds or joining any global lists SHOULD_CALL_PARENT(FALSE) - if(flags_1 & INITIALIZED_1) + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 + initialized = TRUE return INITIALIZE_HINT_NORMAL /mob/dview/Destroy(force = FALSE) diff --git a/code/__HELPERS/nameof.dm b/code/__HELPERS/nameof.dm index 7cd5777f4652..5a2fd60e7100 100644 --- a/code/__HELPERS/nameof.dm +++ b/code/__HELPERS/nameof.dm @@ -8,8 +8,4 @@ /** * NAMEOF that actually works in static definitions because src::type requires src to be defined */ -#if DM_VERSION >= 515 #define NAMEOF_STATIC(datum, X) (nameof(type::##X)) -#else -#define NAMEOF_STATIC(datum, X) (#X || ##datum.##X) -#endif diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 3b79a4e5af01..4af5c9685d6f 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -151,7 +151,7 @@ GLOBAL_VAR(command_name) return name -//Traitors and traitor silicons will get these. Revs will not. +//Traitors and traitor silicons will get these. GLOBAL_VAR(syndicate_code_phrase) //Code phrase for traitors. GLOBAL_VAR(syndicate_code_response) //Code response for traitors. @@ -159,6 +159,9 @@ GLOBAL_VAR(syndicate_code_response) //Code response for traitors. GLOBAL_DATUM(syndicate_code_phrase_regex, /regex) GLOBAL_DATUM(syndicate_code_response_regex, /regex) +GLOBAL_VAR(revolution_code_phrase) //Code phrase for traitors. +GLOBAL_DATUM(revolution_code_phrase_regex, /regex) + /* Should be expanded. How this works: @@ -197,8 +200,8 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex) var/locations = strings(LOCATIONS_FILE, "locations") var/list/names = list() - for(var/datum/data/record/t in GLOB.data_core.general)//Picks from crew manifest. - names += t.fields["name"] + for(var/datum/data/record/t in SSdatacore.get_records(DATACORE_RECORDS_STATION)) //Picks from crew manifest. + names += t.fields[DATACORE_NAME] var/maxwords = words//Extra var to check for duplicates. diff --git a/code/__HELPERS/path.dm b/code/__HELPERS/path.dm deleted file mode 100644 index df6b927b41c5..000000000000 --- a/code/__HELPERS/path.dm +++ /dev/null @@ -1,433 +0,0 @@ -/** - * 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. - * * diagonal_safety: ensures diagonal moves won't use invalid midstep turfs by splitting them into two orthogonal moves if necessary - */ -/proc/get_path_to(caller, end, max_distance = 30, mintargetdist, id=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_safety=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, diagonal_safety) - 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. - * We do early next.density check despite it being already checked in LinkBlockedWithAccess for short-circuit performance - */ -#define CAN_STEP(cur_turf, next) (next && !next.density && !(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 - /// Ensures diagonal moves won't use invalid midstep turfs by splitting them into two orthogonal moves if necessary - var/diagonal_safety = TRUE - -/datum/pathfind/New(atom/movable/caller, atom/goal, id, max_distance, mintargetdist, simulated_only, avoid, diagonal_safety) - src.caller = caller - end = get_turf(goal) - open = new /datum/heap(GLOBAL_PROC_REF(HeapPathWeightCompare)) - sources = new() - src.id = id - src.max_distance = max_distance - src.mintargetdist = mintargetdist - src.simulated_only = simulated_only - src.avoid = avoid - src.diagonal_safety = diagonal_safety - -/** - * 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) - - if(diagonal_safety) - path = diagonal_movement_safety() - - 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 - -/datum/pathfind/proc/diagonal_movement_safety() - if(length(path) < 2) - return - var/list/modified_path = list() - - for(var/i in 1 to length(path) - 1) - var/turf/current_turf = path[i] - var/turf/next_turf = path[i+1] - var/movement_dir = get_dir(current_turf, next_turf) - if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify - modified_path += current_turf - continue - //If default diagonal movement step is invalid, replace with alternative two steps - if(movement_dir & NORTH) - if(!CAN_STEP(current_turf,get_step(current_turf,NORTH))) - modified_path += current_turf - modified_path += get_step(current_turf, movement_dir & ~NORTH) - else - modified_path += current_turf - else - if(!CAN_STEP(current_turf,get_step(current_turf,SOUTH))) - modified_path += current_turf - modified_path += get_step(current_turf, movement_dir & ~SOUTH) - else - modified_path += current_turf - modified_path += path[length(path)] - - return modified_path - -/** - * 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 - * - * Assumes destinantion turf is non-dense - check and shortcircuit in code invoking this proc to avoid overhead. - * - * 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) - if(destination_turf.x != x && destination_turf.y != y) //diagonal - var/in_dir = get_dir(destination_turf,src) // eg. northwest (1+8) = 9 (00001001) - var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) - var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) - - for(var/first_step_direction in list(first_step_direction_a,first_step_direction_b)) - var/turf/midstep_turf = get_step(destination_turf,first_step_direction) - var/way_blocked = midstep_turf.density || LinkBlockedWithAccess(midstep_turf,caller,ID) || midstep_turf.LinkBlockedWithAccess(destination_turf,caller,ID) - if(!way_blocked) - return FALSE - return TRUE - - var/actual_dir = get_dir(src, destination_turf) - - /// These are generally cheaper than looping contents so they go first - switch(destination_turf.pathing_pass_method) - // This is already assumed to be true - //if(TURF_PATHING_PASS_DENSITY) - // if(destination_turf.density) - // return TRUE - if(TURF_PATHING_PASS_PROC) - if(!destination_turf.CanAStarPass(ID, actual_dir , caller)) - return TRUE - if(TURF_PATHING_PASS_NO) - return TRUE - - // Source border object checks - 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 - - for(var/obj/structure/railing/iter_rail in src) - if(!iter_rail.CanAStarPass(ID, actual_dir)) - return TRUE - - for(var/obj/machinery/door/firedoor/border_only/firedoor in src) - if(!firedoor.CanAStarPass(ID, actual_dir)) - return TRUE - - // Destination blockers check - 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/paths/jps_path.dm b/code/__HELPERS/paths/jps_path.dm new file mode 100644 index 000000000000..943875a13da1 --- /dev/null +++ b/code/__HELPERS/paths/jps_path.dm @@ -0,0 +1,438 @@ +/// 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_euclidean(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_euclidean(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/jps + /// The thing that we're actually trying to path for + var/atom/movable/caller + /// 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/found_turfs + /// The list we compile at the end if successful to pass back + var/list/path + + /// How far away we have to get to the end target before we can call it quits + var/mintargetdist = 0 + /// If we should delete the first step in the path or not. Used often because it is just the starting tile + var/skip_first = FALSE + /// Defines how we handle diagonal moves. See __DEFINES/path.dm + var/diagonal_handling = DIAGONAL_REMOVE_CLUNKY + +/datum/pathfind/jps/New(atom/movable/caller, atom/goal, access, max_distance, mintargetdist, simulated_only, avoid, skip_first, diagonal_handling, datum/callback/on_finish) + src.caller = caller + src.pass_info = new(caller, access) + end = get_turf(goal) + open = new /datum/heap(GLOBAL_PROC_REF(HeapPathWeightCompare)) + found_turfs = new() + src.max_distance = max_distance + src.mintargetdist = mintargetdist + src.simulated_only = simulated_only + src.avoid = avoid + src.skip_first = skip_first + src.diagonal_handling = diagonal_handling + src.on_finish = on_finish + +/datum/pathfind/jps/Destroy(force, ...) + . = ..() + caller = null + end = null + open = null + + +/** + * "starts" off the pathfinding, by storing the values this datum will need to work later on + * returns FALSE if it fails to setup properly, TRUE otherwise + */ +/datum/pathfind/jps/start() + start ||= get_turf(caller) + . = ..() + if(!.) + return . + + if(!get_turf(end)) + stack_trace("Invalid JPS destination") + return FALSE + if(start.z != end.z || start == end ) //no pathfinding between z levels + return FALSE + 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 FALSE + + var/datum/jps_node/current_processed_node = new (start, -1, 0, end) + open.insert(current_processed_node) + found_turfs[start] = start // i'm sure this is fine + return TRUE + +/** + * search_step() is the workhorse of pathfinding. It'll do the searching logic, and will slowly build up a path + * returns TRUE if everything is stable, FALSE if the pathfinding logic has failed, and we need to abort + */ +/datum/pathfind/jps/search_step() + . = ..() + if(!.) + return . + + if(QDELETED(caller)) + return FALSE + + while(!open.is_empty() && !path) + var/datum/jps_node/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) + + // Stable, we'll just be back later + if(TICK_CHECK) + return TRUE + + return TRUE + +/** + * Cleanup pass for the pathfinder. This tidies up the path, and fufills the pathfind's obligations + */ +/datum/pathfind/jps/finished() + //we're done! turn our reversed path (end to start) into a path (start to end) + found_turfs = null + QDEL_NULL(open) + + var/list/path = src.path || list() + reverse_range(path) + + switch(diagonal_handling) + if(DIAGONAL_REMOVE_CLUNKY) + path = remove_clunky_diagonals(path, pass_info, simulated_only, avoid) + if(DIAGONAL_REMOVE_ALL) + path = remove_diagonals(path, pass_info, simulated_only, avoid) + + if(length(path) > 0 && skip_first) + path.Cut(1,2) + + hand_back(path) + return ..() + +/// 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/jps/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 + +/** + * Processes a path (list of turfs), removes any diagonal moves that would lead to a weird bump + * + * path - The path to process down + * pass_info - Holds all the info about what this path attempt can go through + * simulated_only - If we are not allowed to pass space turfs + * avoid - A turf to be avoided + */ +/proc/remove_clunky_diagonals(list/path, datum/can_pass_info/pass_info, simulated_only, turf/avoid) + if(length(path) < 2) + return path + var/list/modified_path = list() + + for(var/i in 1 to length(path) - 1) + var/turf/current_turf = path[i] + modified_path += current_turf + var/turf/next_turf = path[i+1] + var/movement_dir = get_dir(current_turf, next_turf) + if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify + continue + //If the first diagonal movement step is invalid (north/south), replace with a sidestep first, with an implied vertical step in next_turf + var/vertical_only = movement_dir & (NORTH|SOUTH) + if(!CAN_STEP(current_turf,get_step(current_turf, vertical_only), simulated_only, pass_info, avoid)) + modified_path += get_step(current_turf, movement_dir & ~vertical_only) + modified_path += path[length(path)] + + return modified_path + +/** + * Processes a path (list of turfs), removes any diagonal moves + * + * path - The path to process down + * pass_info - Holds all the info about what this path attempt can go through + * simulated_only - If we are not allowed to pass space turfs + * avoid - A turf to be avoided + */ +/proc/remove_diagonals(list/path, datum/can_pass_info/pass_info, simulated_only, turf/avoid) + if(length(path) < 2) + return path + var/list/modified_path = list() + + for(var/i in 1 to length(path) - 1) + var/turf/current_turf = path[i] + modified_path += current_turf + var/turf/next_turf = path[i+1] + var/movement_dir = get_dir(current_turf, next_turf) + if(!(movement_dir & (movement_dir - 1))) //cardinal movement, no need to verify + continue + var/vertical_only = movement_dir & (NORTH|SOUTH) + // If we can't go directly north/south, we will first go to the side, + if(!CAN_STEP(current_turf,get_step(current_turf, vertical_only), simulated_only, pass_info, avoid)) + modified_path += get_step(current_turf, movement_dir & ~vertical_only) + else // Otherwise, we'll first go north/south, then to the side + modified_path += get_step(current_turf, vertical_only) + modified_path += path[length(path)] + + return modified_path + +/** + * 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/jps/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 + var/datum/can_pass_info/pass_info = src.pass_info + + 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, simulated_only, pass_info, avoid)) + 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) + found_turfs[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(found_turfs[current_turf]) // already visited, essentially in the closed list + return + else + found_turfs[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/jps/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 + var/datum/can_pass_info/pass_info = src.pass_info + + 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, simulated_only, pass_info, avoid)) + 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) + found_turfs[current_turf] = original_turf + unwind_path(final_node) + return + else if(found_turfs[current_turf]) // already visited, essentially in the closed list + return + else + found_turfs[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 + * + * Assumes destinantion turf is non-dense - check and shortcircuit in code invoking this proc to avoid overhead. + * Makes some other assumptions, such as assuming that unless declared, non dense objects will not block movement. + * It's fragile, but this is VERY much the most expensive part of JPS, so it'd better be fast + * + * Arguments: + * * caller: The movable, if one exists, being used for mobility checks to see what tiles it can reach + * * access: A list 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? + * * no_id: When true, doors with public access will count as impassible +*/ +/turf/proc/LinkBlockedWithAccess(turf/destination_turf, datum/can_pass_info/pass_info) + var/actual_dir = get_dir(src, destination_turf) + if(actual_dir == 0) + return FALSE + + var/is_diagonal_movement = ISDIAGONALDIR(actual_dir) + + if(is_diagonal_movement) //diagonal + var/in_dir = get_dir(destination_turf,src) // eg. northwest (1+8) = 9 (00001001) + var/first_step_direction_a = in_dir & 3 // eg. north (1+8)&3 (0000 0011) = 1 (0000 0001) + var/first_step_direction_b = in_dir & 12 // eg. west (1+8)&12 (0000 1100) = 8 (0000 1000) + + for(var/first_step_direction in list(first_step_direction_a,first_step_direction_b)) + var/turf/midstep_turf = get_step(destination_turf,first_step_direction) + var/way_blocked = midstep_turf.density || LinkBlockedWithAccess(midstep_turf, pass_info) || midstep_turf.LinkBlockedWithAccess(destination_turf, pass_info) + if(!way_blocked) + return FALSE + + return TRUE + + /// These are generally cheaper than looping contents so they go first + switch(destination_turf.pathing_pass_method) + // This is already assumed to be true + //if(TURF_PATHING_PASS_DENSITY) + // if(destination_turf.density) + // return TRUE + if(TURF_PATHING_PASS_PROC) + if(!destination_turf.CanAStarPass(actual_dir, pass_info)) + return TRUE + + if(TURF_PATHING_PASS_NO) + return TRUE + + var/static/list/directional_blocker_cache = typecacheof(list(/obj/structure/window, /obj/machinery/door/window, /obj/structure/railing, /obj/machinery/door/firedoor/border_only)) + // Source border object checks + for(var/obj/border in src) + if(!directional_blocker_cache[border.type]) + continue + if(!border.density && border.can_astar_pass == CANASTARPASS_DENSITY) + continue + if(!border.CanAStarPass(actual_dir, pass_info)) + return TRUE + + // Destination blockers check + var/reverse_dir = get_dir(destination_turf, src) + for(var/obj/iter_object in destination_turf) + // This is an optimization because of the massive call count of this code + if(!iter_object.density && iter_object.can_astar_pass == CANASTARPASS_DENSITY) + continue + if(!iter_object.CanAStarPass(reverse_dir, pass_info)) + return TRUE + return FALSE diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm new file mode 100644 index 000000000000..7cdd49c21a7e --- /dev/null +++ b/code/__HELPERS/paths/path.dm @@ -0,0 +1,226 @@ +/** + * 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. + * It will yield until a path is returned, using magic + * + * 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. + * * access: A list representing what access we have and what doors we can open. + * * 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. + * * diagonal_handling: defines how we handle diagonal moves. see __DEFINES/path.dm + */ +/proc/jps_path_to(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, list/access, simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY) + var/list/path = list() + // We're guarenteed that list will be the first list in pathfinding_finished's argset because of how callback handles the arguments list + var/datum/callback/await = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pathfinding_finished), path) + if(!SSpathfinder.pathfind(caller, end, max_distance, mintargetdist, access, simulated_only, exclude, skip_first, diagonal_handling, await)) + return list() + + UNTIL(length(path)) + if(length(path) == 1 && path[1] == null || (QDELETED(caller) || QDELETED(end))) // It's trash, just hand back null to make it easy + return list() + return path + +/// Uses funny pass by reference bullshit to take the path created by pathfinding, and insert it into a return list +/// We'll be able to use this return list to tell a sleeping proc to continue execution +/proc/pathfinding_finished(list/return_list, list/path) + // We use += here to ensure the list is still pointing at the same thing + return_list += path + + +/datum/pathfind + /// The turf we started at + var/turf/start + + // general pathfinding vars/args + /// Limits 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 + /// The callbacks to invoke when we're done working, passing in the completed product + /// Invoked in order + var/datum/callback/on_finish + /// Datum that holds the canpass info of this pathing attempt. This is what CanAstarPass sees + var/datum/can_pass_info/pass_info + +/datum/pathfind/Destroy(force) + . = ..() + SSpathfinder.active_pathing -= src + SSpathfinder.currentrun -= src + hand_back(null) + avoid = null + +/** + * "starts" off the pathfinding, by storing the values this datum will need to work later on + * returns FALSE if it fails to setup properly, TRUE otherwise + */ +/datum/pathfind/proc/start() + if(!start) + stack_trace("Invalid pathfinding start") + return FALSE + return TRUE + +/** + * search_step() is the workhorse of pathfinding. It'll do the searching logic, and will slowly build up a path + * returns TRUE if everything is stable, FALSE if the pathfinding logic has failed, and we need to abort + */ +/datum/pathfind/proc/search_step() + return TRUE + +/** + * early_exit() is called when something goes wrong in processing, and we need to halt the pathfinding NOW + */ +/datum/pathfind/proc/early_exit() + hand_back(null) + qdel(src) + +/** + * Cleanup pass for the pathfinder. This tidies up the path, and fufills the pathfind's obligations + */ +/datum/pathfind/proc/finished() + qdel(src) + +/** + * Call to return a value to whoever spawned this pathfinding work + * Will fail if it's already been called + */ +/datum/pathfind/proc/hand_back(value) + set waitfor = FALSE + on_finish?.Invoke(value) + on_finish = null + +// Could easily be a struct if/when we get that +/** + * Holds all information about what an atom can move through + * Passed into CanAStarPass to provide context for a pathing attempt + * + * Also used to check if using a cached path_map is safe + * There are some vars here that are unused. They exist to cover cases where caller_ref is used + * They're the properties of caller_ref used in those cases. + * It's kinda annoying, but there's some proc chains we can't convert to this datum + */ +/datum/can_pass_info + /// If we have no id, public airlocks are walls + var/no_id = FALSE + + /// What we can pass through. Mirrors /atom/movable/pass_flags + var/pass_flags = NONE + /// What access we have, airlocks, windoors, etc + var/list/access = null + /// What sort of movement do we have. Mirrors /atom/movable/movement_type + var/movement_type = NONE + /// Are we being thrown? + var/thrown = FALSE + /// Are we anchored + var/anchored = FALSE + + /// Are we a ghost? (they have effectively unique pathfinding) + var/is_observer = FALSE + /// Are we a living mob? + var/is_living = FALSE + /// Are we a bot? + var/is_bot = FALSE + /// Can we ventcrawl? + var/can_ventcrawl = FALSE + /// What is the size of our mob + var/mob_size = null + /// Is our mob incapacitated + var/incapacitated = FALSE + /// Is our mob incorporeal + var/incorporeal_move = FALSE + /// If our mob has a rider, what does it look like + var/datum/can_pass_info/rider_info = null + /// If our mob is buckled to something, what's it like + var/datum/can_pass_info/buckled_info = null + + /// Do we have gravity + var/has_gravity = TRUE + /// Pass information for the object we are pulling, if any + var/list/grab_infos = null + + /// Cameras have a lot of BS can_z_move overrides + /// Let's avoid this + var/camera_type + + /// Weakref to the caller used to generate this info + /// Should not use this almost ever, it's for context and to allow for proc chains that + /// Require a movable + var/datum/weakref/caller_ref = null + +/datum/can_pass_info/New(atom/movable/construct_from, list/access, no_id = FALSE, call_depth = 0, ignore_grabs = FALSE) + // No infiniloops + if(call_depth > 10) + return + if(access) + src.access = access.Copy() + src.no_id = no_id + + if(isnull(construct_from)) + return + + src.caller_ref = WEAKREF(construct_from) + src.pass_flags = construct_from.pass_flags + src.movement_type = construct_from.movement_type + src.thrown = !!construct_from.throwing + src.anchored = construct_from.anchored + src.has_gravity = construct_from.has_gravity() + + if(ismob(construct_from)) + var/mob/living/mob_construct = construct_from + src.incapacitated = mob_construct.incapacitated() + if(mob_construct.buckled) + src.buckled_info = new(mob_construct.buckled, access, no_id, call_depth + 1) + + if(isobserver(construct_from)) + src.is_observer = TRUE + + if(isliving(construct_from)) + var/mob/living/living_construct = construct_from + src.is_living = TRUE + src.can_ventcrawl = HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_construct, TRAIT_VENTCRAWLER_NUDE) + src.mob_size = living_construct.mob_size + src.incorporeal_move = living_construct.incorporeal_move + if(!ignore_grabs && LAZYLEN(living_construct.active_grabs)) + grab_infos = list() + for(var/atom/movable/grabbed_by in living_construct.recursively_get_all_grabbed_movables()) + grab_infos += new /datum/can_pass_info(grabbed_by, access, no_id, call_depth + 1, ignore_grabs = TRUE) + + if(iscameramob(construct_from)) + src.camera_type = construct_from.type + src.is_bot = isbot(construct_from) + +/// List of vars on /datum/can_pass_info to use when checking two instances for equality +GLOBAL_LIST_INIT(can_pass_info_vars, GLOBAL_PROC_REF(can_pass_check_vars)) + +/proc/can_pass_check_vars() + var/datum/can_pass_info/lamb = new() + var/datum/isaac = new() + var/list/altar = assoc_to_keys(lamb.vars - isaac.vars) + // Don't compare against calling atom, it's not relevant here + altar -= "caller_ref" + if(!("caller_ref" in lamb.vars)) + CRASH("caller_ref var was not found in /datum/can_pass_info, why are we filtering for it?") + // We will bespoke handle pulling_info + altar -= "pulling_info" + if(!("pulling_info" in lamb.vars)) + CRASH("pulling_info var was not found in /datum/can_pass_info, why are we filtering for it?") + return altar + +/datum/can_pass_info/proc/compare_against(datum/can_pass_info/check_against) + for(var/comparable_var in GLOB.can_pass_info_vars) + if(!(vars[comparable_var] ~= check_against[comparable_var])) + return FALSE + return TRUE diff --git a/code/__HELPERS/priority_announce.dm b/code/__HELPERS/priority_announce.dm index 443de84c1747..6a9cde304160 100644 --- a/code/__HELPERS/priority_announce.dm +++ b/code/__HELPERS/priority_announce.dm @@ -21,13 +21,14 @@ var/announcement = "

[html_encode(super_title)]

" if(sub_title) - announcement += "

[html_encode(sub_title)]


" + announcement += "

[html_encode(sub_title)]

" ///If the announcer overrides alert messages, use that message. if(SSstation.announcer.custom_alert_message && !do_not_modify) announcement += SSstation.announcer.custom_alert_message else - announcement += "
[span_alert("[html_encode(text)]")]
" + announcement += "
[span_alert("[html_encode(text)]")]" + announcement += "
" var/sound/sound2use = SSstation.announcer.event_sounds[sound_type] @@ -41,6 +42,8 @@ sound2use = SSstation.announcer.get_rand_report_sound() if(ANNOUNCER_ATTENTION) sound2use = SSstation.announcer.get_rand_alert_sound() + if(ANNOUNCER_ALERT) + sound2use = 'sound/misc/notice1.ogg' else sound2use = 'goon/sounds/announcement_1.ogg' @@ -49,7 +52,7 @@ for(var/mob/target in players) if(!isnewplayer(target) && target.can_hear()) - to_chat(target, announcement) + to_chat(target, examine_block(announcement)) if(target.client.prefs.toggles & SOUND_ANNOUNCEMENTS) SEND_SOUND(target, sound2use) @@ -125,7 +128,7 @@ for(var/mob/target in players) if(!isnewplayer(target) && target.can_hear()) - to_chat(target, span_minorannounce(message)) + to_chat(target, examine_block(span_minorannounce(message))) if(target.client.prefs.toggles & SOUND_ANNOUNCEMENTS) if(alert) SEND_SOUND(target, sound('sound/misc/notice1.ogg')) diff --git a/code/__HELPERS/pronouns.dm b/code/__HELPERS/pronouns.dm index 6328591471a5..150a3e83c0a7 100644 --- a/code/__HELPERS/pronouns.dm +++ b/code/__HELPERS/pronouns.dm @@ -32,6 +32,9 @@ /datum/proc/p_do(temp_gender) . = "does" +/datum/proc/p_dont(temp_gender) + . = "doesnt" + /datum/proc/p_theyve(capitalized, temp_gender) . = p_they(capitalized, temp_gender) + "'" + copytext_char(p_have(temp_gender), 3) @@ -136,6 +139,14 @@ if(temp_gender == PLURAL || temp_gender == NEUTER) . = "do" +/client/p_dont(temp_gender) + if(!temp_gender) + temp_gender = gender + + . = "doesn't" + if(temp_gender == PLURAL || temp_gender == NEUTER) + . = "don't" + /client/p_s(temp_gender) if(!temp_gender) temp_gender = gender @@ -233,6 +244,14 @@ if(temp_gender == PLURAL) . = "do" +/mob/p_dont(temp_gender) + if(!temp_gender) + temp_gender = gender + + . = "doesn't" + if(temp_gender == PLURAL || temp_gender == NEUTER) + . = "don't" + /mob/p_s(temp_gender) if(!temp_gender) temp_gender = gender @@ -302,6 +321,13 @@ temp_gender = PLURAL return ..() +/mob/living/carbon/human/p_dont(temp_gender) + var/obscured = check_obscured_slots() + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if((obscured & ITEM_SLOT_ICLOTHING) && skipface) + temp_gender = PLURAL + return ..() + /mob/living/carbon/human/p_s(temp_gender) var/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) diff --git a/code/__HELPERS/randoms.dm b/code/__HELPERS/randoms.dm index 7d425c70c881..b2220766ab1d 100644 --- a/code/__HELPERS/randoms.dm +++ b/code/__HELPERS/randoms.dm @@ -18,7 +18,6 @@ /obj/item/food/deepfryholder, /obj/item/food/clothing, /obj/item/food/meat/slab/human/mutant, - /obj/item/food/grown/ash_flora, /obj/item/food/grown/nettle, /obj/item/food/grown/shell ) diff --git a/code/__HELPERS/reagents.dm b/code/__HELPERS/reagents.dm index d8452ae9517b..00304a2d70c5 100644 --- a/code/__HELPERS/reagents.dm +++ b/code/__HELPERS/reagents.dm @@ -51,42 +51,45 @@ //there is at least one unique catalyst for the short reaction, so there is no conflict return FALSE - //if we got this far, the longer reaction will be impossible to create if the shorter one is earlier in GLOB.chemical_reactions_list_reactant_index, and will require the reagents to be added in a particular order otherwise + //if we got this far, the longer reaction will be impossible to create if the shorter one is earlier in SSreagents.chemical_reactions_list_reactant_index, and will require the reagents to be added in a particular order otherwise return TRUE /proc/get_chemical_reaction(id) - if(!GLOB.chemical_reactions_list_reactant_index) + if(!SSreagents.chemical_reactions_list_reactant_index) return - for(var/reagent in GLOB.chemical_reactions_list_reactant_index) - for(var/R in GLOB.chemical_reactions_list_reactant_index[reagent]) + for(var/reagent in SSreagents.chemical_reactions_list_reactant_index) + for(var/R in SSreagents.chemical_reactions_list_reactant_index[reagent]) var/datum/reac = R if(reac.type == id) return R /proc/remove_chemical_reaction(datum/chemical_reaction/R) - if(!GLOB.chemical_reactions_list_reactant_index || !R) + if(!SSreagents.chemical_reactions_list_reactant_index || !R) return for(var/rid in R.required_reagents) - GLOB.chemical_reactions_list_reactant_index[rid] -= R + SSreagents.chemical_reactions_list_reactant_index[rid] -= R //see build_chemical_reactions_list in holder.dm for explanations -/proc/add_chemical_reaction(datum/chemical_reaction/R) - if(!GLOB.chemical_reactions_list_reactant_index || !R.required_reagents || !R.required_reagents.len) +/proc/add_chemical_reaction(datum/chemical_reaction/add) + if(!SSreagents.chemical_reactions_list_reactant_index || !add.required_reagents || !add.required_reagents.len) return - var/primary_reagent = R.required_reagents[1] - if(!GLOB.chemical_reactions_list_reactant_index[primary_reagent]) - GLOB.chemical_reactions_list_reactant_index[primary_reagent] = list() - GLOB.chemical_reactions_list_reactant_index[primary_reagent] += R + var/rand_reagent = pick(add.required_reagents) + if(!SSreagents.chemical_reactions_list_reactant_index[rand_reagent]) + SSreagents.chemical_reactions_list_reactant_index[rand_reagent] = list() + SSreagents.chemical_reactions_list_reactant_index[rand_reagent] += add //Creates foam from the reagent. Metaltype is for metal foam, notification is what to show people in textbox -/datum/reagents/proc/create_foam(foamtype,foam_volume,metaltype = 0,notification = null) +/datum/reagents/proc/create_foam(foamtype, foam_volume, result_type = null, notification = null, log = FALSE) var/location = get_turf(my_atom) - var/datum/effect_system/foam_spread/foam = new foamtype() - foam.set_up(foam_volume, location, src, metaltype) - foam.start() + + var/datum/effect_system/fluid_spread/foam/foam = new foamtype() + foam.set_up(amount = foam_volume, holder = my_atom, location = location, carry = src, result_type = result_type) + foam.start(log = log) + clear_reagents() if(!notification) return + for(var/mob/M in viewers(5, location)) to_chat(M, notification) @@ -167,14 +170,14 @@ ///Returns reagent datum from typepath /proc/find_reagent(input) . = FALSE - if(GLOB.chemical_reagents_list[input]) //prefer IDs! + if(SSreagents.chemical_reagents_list[input]) //prefer IDs! return input else return get_chem_id(input) /proc/find_reagent_object_from_type(input) - if(GLOB.chemical_reagents_list[input]) //prefer IDs! - return GLOB.chemical_reagents_list[input] + if(SSreagents.chemical_reagents_list[input]) //prefer IDs! + return SSreagents.chemical_reagents_list[input] else return null @@ -183,15 +186,15 @@ var/static/list/random_reagents = list() if(!random_reagents.len) for(var/datum/reagent/random_candidate as anything in subtypesof(/datum/reagent)) - if(!(initial(random_candidate.abstract_type) == random_candidate) && (initial(random_candidate.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED)) + if(!(isabstract(random_candidate)) && !(initial(random_candidate.chemical_flags) & REAGENT_SPECIAL)) random_reagents += random_candidate var/picked_reagent = pick(random_reagents) return picked_reagent ///Returns reagent datum from reagent name string /proc/get_chem_id(chem_name) - for(var/X in GLOB.chemical_reagents_list) - var/datum/reagent/R = GLOB.chemical_reagents_list[X] + for(var/X in SSreagents.chemical_reagents_list) + var/datum/reagent/R = SSreagents.chemical_reagents_list[X] if(ckey(chem_name) == ckey(lowertext(R.name))) return X @@ -199,7 +202,7 @@ /proc/get_recipe_from_reagent_product(input_type) if(!input_type) return - var/list/matching_reactions = GLOB.chemical_reactions_list_product_index[input_type] + var/list/matching_reactions = SSreagents.chemical_reactions_list_product_index[input_type] return matching_reactions /proc/reagent_paths_list_to_text(list/reagents, addendum) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 5b338e336e4b..52f05e0779d4 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -223,10 +223,6 @@ roundend_callbacks.InvokeAsync() LAZYCLEARLIST(round_end_events) - var/speed_round = FALSE - if(world.time - SSticker.round_start_time <= 300 SECONDS) - speed_round = TRUE - popcount = gather_roundend_feedback() INVOKE_ASYNC(SScredits, TYPE_PROC_REF(/datum/controller/subsystem/credits, draft)) //Must always come after popcount is set for(var/client/C in GLOB.clients) @@ -239,14 +235,12 @@ CHECK_TICK for(var/client/C in GLOB.clients) - if(speed_round) - C?.give_award(/datum/award/achievement/misc/speed_round, C?.mob) HandleRandomHardcoreScore(C) // Add AntagHUD to everyone, see who was really evil the whole time! for(var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antagonist_hud in GLOB.active_alternate_appearances) for(var/mob/player as anything in GLOB.player_list) - antagonist_hud.add_hud_to(player) + antagonist_hud.show_to(player) CHECK_TICK @@ -358,7 +352,7 @@ //ignore this comment, it fixes the broken sytax parsing caused by the " above else parts += "[FOURSPACES]Nobody died this shift!" - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/mode = SSticker.mode parts += "[FOURSPACES]Threat level: [mode.threat_level]" parts += "[FOURSPACES]Threat left: [mode.mid_round_budget]" @@ -369,6 +363,9 @@ parts += "[FOURSPACES]Executed rules:" for(var/datum/dynamic_ruleset/rule in mode.executed_rules) parts += "[FOURSPACES][FOURSPACES][rule.ruletype] - [rule.name]: -[rule.cost + rule.scaled_times * rule.scaling_cost] threat" + else + parts += "[FOURSPACES]The gamemode was: [mode.name]." + return parts.Join("
") /client/proc/roundend_report_file() @@ -707,17 +704,14 @@ parts += "" return parts.Join() - /proc/printobjectives(list/objectives) - if(!objectives || !objectives.len) + if(!length(objectives)) return + var/list/objective_parts = list() var/count = 1 for(var/datum/objective/objective in objectives) - if(objective.check_completion()) - objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [span_greentext("Success!")]" - else - objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [span_redtext("Fail.")]" + objective_parts += "[objective.objective_name] #[count]: [objective.explanation_text] [objective.get_roundend_suffix()]" count++ return objective_parts.Join("
") diff --git a/code/__HELPERS/see_through_maps.dm b/code/__HELPERS/see_through_maps.dm new file mode 100644 index 000000000000..5d9e877b8421 --- /dev/null +++ b/code/__HELPERS/see_through_maps.dm @@ -0,0 +1,80 @@ +//For these defines, check also above for their actual shapes in-game and maybe get a better idea + +///Default shape. It's one tile above the atom +#define SEE_THROUGH_MAP_DEFAULT "default" +///A 3x3 area 2 tiles above the atom (trees love to be this shape) +#define SEE_THROUGH_MAP_THREE_X_THREE "3x3" +///2 tiles above the atom +#define SEE_THROUGH_MAP_DEFAULT_TWO_TALL "default_two_tall" +///two rows of three tiles above the atom (small but thick trees love these) +#define SEE_THROUGH_MAP_THREE_X_TWO "3x2" +///One row of three tiles above the atom, but offset one tile to the left because of how billboards work +#define SEE_THROUGH_MAP_BILLBOARD "billboard" +///Two rows of three wide, but offset one tile to the left because thats how shipping containers work +#define SEE_THROUGH_MAP_SHIPPING_CONTAINER "shipping_container" + + +/**global statics for the see_through_component coordinate maps +* For ease of use, include a comment in the shape of the coordinate map, where O is nothing, X is a hidden tile and A is the object +* List-coordinate layout is list(relative_x, relative_y, relative_z) +* Turf finding algorithm needs the z and you can totally use it, but I can't think of any reason to ever do it +* Also it'd be really cool if you could keep the list-coordinates in here represent their actual relative coords, dont use tabs though since their spacing can differ +*/ +GLOBAL_LIST_INIT(see_through_maps, list( + // X + // A + SEE_THROUGH_MAP_DEFAULT = list( + /*----------------*/list(0, 1, 0), + /*----------------*/list(0, 0, 0) + ), + + // XXX + // XXX + // XXX + // OAO + SEE_THROUGH_MAP_THREE_X_THREE = list( + list(-1, 3, 0), list(0, 3, 0), list(1, 3, 0), + list(-1, 2, 0), list(0, 2, 0), list(1, 2, 0), + list(-1, 1, 0), list(0, 1, 0), list(1, 1, 0) + ), + + // X + // X + // A + SEE_THROUGH_MAP_DEFAULT_TWO_TALL = list( + /*----------------*/list(0, 2, 0), + /*----------------*/list(0, 1, 0), + /*----------------*/list(0, 0, 0) + ), + + // XXX + // XXX + // OAO + SEE_THROUGH_MAP_THREE_X_TWO = list( + list(-1, 2, 0), list(0, 2, 0), list(1, 2, 0), + list(-1, 1, 0), list(0, 1, 0), list(1, 1, 0) + ), + + /// XXX + /// AOO + SEE_THROUGH_MAP_BILLBOARD = list( + list(0, 1, 0), list(1, 1, 0), list(2, 1, 0) + ), + /// XXX + /// AXX + SEE_THROUGH_MAP_SHIPPING_CONTAINER = list( + list(0, 1, 0), list(1, 1, 0), list(2, 1, 0), + list(0, 0, 0), list(1, 0, 0), list(2, 0, 0) + ), + //No + SEE_THROUGH_MAP_RATVAR_WRECK = list( + list(3, 5, 0), list(4, 5, 0), list(5, 5, 0), list(6, 5, 0), + list(3, 4, 0), list(4, 4, 0), list(5, 4, 0), list(6, 4, 0), list(7, 4, 0), list(9, 4, 0), + list(3, 3, 0), list(4, 3, 0), list(5, 3, 0), list(6, 3, 0), /* the neck */ list(8, 3, 0), list(9, 3, 0), + list(0, 2, 0), list(1, 2, 0), list(2, 2, 0), list(3, 2, 0), list(4, 2, 0), list(5, 2, 0), list(6, 2, 0), list(7, 2, 0), list(8, 2, 0), list(9, 2, 0), list(10, 2, 0), list(11, 2, 0), list(12, 2, 0), + list(0, 1, 0), list(1, 1, 0), list(2, 1, 0), list(3, 1, 0), list(4, 1, 0), list(5, 1, 0), list(6, 1, 0), list(7, 1, 0), list(8, 1, 0), list(9, 1, 0), list(10, 1, 0), list(11, 1, 0), list(12, 1, 0), + list(0, 0, 0), list(1, 0, 0), list(2, 0, 0), list(3, 0, 0), list(4, 0, 0), list(5, 0, 0), list(6, 0, 0), list(7, 0, 0), list(8, 0, 0), list(9, 0, 0), list(10, 0, 0), list(11, 0, 0), list(12, 0, 0), list(13, 0, 0) + ) +)) + + diff --git a/code/__HELPERS/spatial_info.dm b/code/__HELPERS/spatial_info.dm index a40a74b504ed..7cd6317d3e19 100644 --- a/code/__HELPERS/spatial_info.dm +++ b/code/__HELPERS/spatial_info.dm @@ -37,9 +37,9 @@ /mob/oranges_ear/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) - if(flags_1 & INITIALIZED_1) + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 + initialized = TRUE return INITIALIZE_HINT_NORMAL /mob/oranges_ear/Destroy(force) @@ -104,23 +104,17 @@ var/list/assigned_oranges_ears = SSspatial_grid.assign_oranges_ears(hearables_from_grid) - var/old_luminosity = center_turf.luminosity - center_turf.luminosity = 6 //man if only we had an inbuilt dview() - //this is the ENTIRE reason all this shit is worth it due to how view() works and can be optimized //view() constructs lists of viewed atoms by default and specifying a specific type of atom to look for limits the lists it constructs to those of that //primitive type and then when the view operation is completed the output is then typechecked to only iterate through objects in view with the same - //typepath. by assigning one /mob/oranges_ear to every turf with hearable atoms on it and giving them references to each one means that: - //1. view() only constructs lists of atoms with the mob primitive type and - //2. the mobs returned by view are fast typechecked to only iterate through /mob/oranges_ear mobs, which guarantees at most one per turf - //on a whole this can outperform iterating through all movables in view() by ~2x especially when hearables are a tiny percentage of movables in view - for(var/mob/oranges_ear/ear in view(view_radius, center_turf)) + //typepath. by assigning one /mob/oranges_ear to every turf with hearable atoms on it and giving them references to each one means that + //hearers() can be used over view(), which is a huge speed increase. + for(var/mob/oranges_ear/ear in hearers(view_radius, center_turf)) . += ear.references for(var/mob/oranges_ear/remaining_ear as anything in assigned_oranges_ears)//we need to clean up our mess remaining_ear.unassign() - center_turf.luminosity = old_luminosity return . /** @@ -257,7 +251,10 @@ return atoms ///Returns the distance between two atoms -/proc/get_dist_euclidian(atom/first_location as turf|mob|obj, atom/second_location as turf|mob|obj) +/proc/get_dist_euclidean(atom/first_location as turf|mob|obj, atom/second_location as turf|mob|obj) + if(!first_location.z || !second_location.z) + return INFINITY + var/dx = first_location.x - second_location.x var/dy = first_location.y - second_location.y @@ -265,6 +262,13 @@ return dist +/// Returns the manhattan distance between two atoms. Returns INFINITY if either are not on a turf, for BYOND get_dist() parity. +/proc/get_dist_manhattan(atom/A, atom/B) + if(!A.z || !B.z) + return INFINITY + + return abs(A.x - B.x) + abs(A.y - B.y) + abs(A.z - B.z) + ///Returns a list of turfs around a center based on RANGE_TURFS() /proc/circle_range_turfs(center = usr, radius = 3) @@ -328,15 +332,26 @@ if(istype(get_turf)) return get_turf -///Returns a list with all the adjacent open turfs. Clears the list of nulls in the end. +///Returns a list with all the adjacent open turfs. /proc/get_adjacent_open_turfs(atom/center) - . = list( - get_open_turf_in_dir(center, NORTH), - get_open_turf_in_dir(center, SOUTH), - get_open_turf_in_dir(center, EAST), - get_open_turf_in_dir(center, WEST) - ) - list_clear_nulls(.) + var/list/hand_back = list() + // Inlined get_open_turf_in_dir, just to be fast + var/turf/open/new_turf = get_step(center, NORTH) + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, SOUTH) + + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, EAST) + + if(istype(new_turf)) + hand_back += new_turf + new_turf = get_step(center, WEST) + + if(istype(new_turf)) + hand_back += new_turf + return hand_back ///Returns a list with all the adjacent areas by getting the adjacent open turfs /proc/get_adjacent_open_areas(atom/center) diff --git a/code/__HELPERS/stat_tracking.dm b/code/__HELPERS/stat_tracking.dm index 525d1a8c844a..3c6203d6b55f 100644 --- a/code/__HELPERS/stat_tracking.dm +++ b/code/__HELPERS/stat_tracking.dm @@ -11,3 +11,15 @@ user << browse("
  1. [lines.Join("
  2. ")]
", "window=[url_encode("stats:[REF(stats)]")]") . = lines.Join("\n") + +/proc/stat_tracking_export_to_csv_later(filename, costs, counts) + if (IsAdminAdvancedProcCall()) + return + + var/list/output = list() + + output += "key, cost, count" + for (var/key in costs) + output += "[replacetext(key, ",", "")], [costs[key]], [counts[key]]" + + rustg_file_write(output.Join("\n"), "[GLOB.log_directory]/[filename]") diff --git a/code/__HELPERS/stoplag.dm b/code/__HELPERS/stoplag.dm index a24db8f79724..c8d5d960490d 100644 --- a/code/__HELPERS/stoplag.dm +++ b/code/__HELPERS/stoplag.dm @@ -10,6 +10,14 @@ return 1 if (!initial_delay) initial_delay = world.tick_lag + +// Unit tests are not the normal environemnt. The mc can get absolutely thigh crushed, and sleeping procs running for ages is much more common +// We don't want spurious hard deletes off this, so let's only sleep for the requested period of time here yeah? +#ifdef UNIT_TESTS + sleep(initial_delay) + return CEILING(DS2TICKS(initial_delay), 1) +#else + . = 0 var/i = DS2TICKS(initial_delay) do @@ -17,7 +25,6 @@ sleep(i * world.tick_lag * DELTA_CALC) i *= 2 while (TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) +#endif #undef DELTA_CALC - -#define UNTIL(X) while(!(X)) stoplag() diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 9d8e8c5b42ee..1fedf600275e 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -284,6 +284,24 @@ return copytext(text, 1, i + 1) return "" +//Returns a string with reserved characters and spaces after the first and last letters removed +//Like trim(), but very slightly faster. worth it for niche usecases +/proc/trim_reduced(text) + var/starting_coord = 1 + var/text_len = length(text) + for (var/i in 1 to text_len) + if (text2ascii(text, i) > 32) + starting_coord = i + break + + for (var/i = text_len, i >= starting_coord, i--) + if (text2ascii(text, i) > 32) + return copytext(text, starting_coord, i + 1) + + if(starting_coord > 1) + return copytext(text, starting_coord) + return "" + /** * Truncate a string to the given length * @@ -304,7 +322,7 @@ /proc/trim(text, max_length) if(max_length) text = copytext_char(text, 1, max_length) - return trim_left(trim_right(text)) + return trim_reduced(text) //Returns a string with the first element of the string capitalized. /proc/capitalize(t) @@ -313,47 +331,31 @@ . = t[1] return uppertext(.) + copytext(t, 1 + length(.)) -/proc/stringmerge(text,compare,replace = "*") -//This proc fills in all spaces with the "replace" var (* by default) with whatever -//is in the other string at the same spot (assuming it is not a replace char). -//This is used for fingerprints - var/newtext = text - var/text_it = 1 //iterators - var/comp_it = 1 - var/newtext_it = 1 - var/text_length = length(text) - var/comp_length = length(compare) - while(comp_it <= comp_length && text_it <= text_length) - var/a = text[text_it] - var/b = compare[comp_it] -//if it isn't both the same letter, or if they are both the replacement character -//(no way to know what it was supposed to be) - if(a != b) - if(a == replace) //if A is the replacement char - newtext = copytext(newtext, 1, newtext_it) + b + copytext(newtext, newtext_it + length(newtext[newtext_it])) - else if(b == replace) //if B is the replacement char - newtext = copytext(newtext, 1, newtext_it) + a + copytext(newtext, newtext_it + length(newtext[newtext_it])) - else //The lists disagree, Uh-oh! - return 0 - text_it += length(a) - comp_it += length(b) - newtext_it += length(newtext[newtext_it]) - - return newtext - -/proc/stringpercent(text,character = "*") -//This proc returns the number of chars of the string that is the character -//This is used for detective work to determine fingerprint completion. - if(!text || !character) - return 0 - var/count = 0 - var/lentext = length(text) - var/a = "" - for(var/i = 1, i <= lentext, i += length(a)) - a = text[i] - if(a == character) - count++ - return count +/// This proc replaces all instances of the "replace" character in "text" with the character in the same position within the "compare" string +/// "***************FFFFFFFFFFFFFFFFF******************" and "FFFFFFFFFFFFFFF*****************FFFFFFFFFFFFFFFFFF" +/// is "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" +/proc/stringmerge(text, compare, replace = "*") + if(length(text) != length(compare)) + CRASH("Stringmerge received strings of differing lengths") + + var/list/frags = list() + var/idx = 1 + var/span + var/nonspan + while(idx <= length_char(text)) + span = spantext_char(text, replace, idx) + if(span) + frags += copytext_char(compare, idx, idx + span) + idx += span + else + nonspan = nonspantext_char(text, replace, idx) + frags += copytext_char(text, idx, idx + nonspan) + idx += nonspan + return jointext(frags, "") + +//This proc returns the presence of the desired character +/proc/stringcount(text, character = "*") + return length(splittext_char(text, character)) - 1 /proc/reverse_text(text = "") var/new_text = "" @@ -744,34 +746,37 @@ GLOBAL_LIST_INIT(binary, list("0","1")) switch(macro) //prefixes/agnostic if("the") - rest = text("\the []", rest) + rest = "\the [rest]" if("a") - rest = text("\a []", rest) + rest = "\a [rest]" if("an") - rest = text("\an []", rest) + rest = "\an [rest]" if("proper") - rest = text("\proper []", rest) + rest = "\proper [rest]" if("improper") - rest = text("\improper []", rest) + rest = "\improper [rest]" if("roman") - rest = text("\roman []", rest) + rest = "\roman [rest]" //postfixes if("th") - base = text("[]\th", rest) + base = "[rest]\th" if("s") - base = text("[]\s", rest) + base = "[rest]\s" if("he") - base = text("[]\he", rest) + base = "[rest]\he" if("she") - base = text("[]\she", rest) + base = "[rest]\she" if("his") - base = text("[]\his", rest) + base = "[rest]\his" if("himself") - base = text("[]\himself", rest) + base = "[rest]\himself" if("herself") - base = text("[]\herself", rest) + base = "[rest]\herself" if("hers") - base = text("[]\hers", rest) + base = "[rest]\hers" + else // Someone fucked up, if you're not a macro just go home yeah? + // This does technically break parsing, but at least it's better then what it used to do + return base . = base if(rest) diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 0d0126b48b12..0a7907fd80fb 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -207,6 +207,11 @@ Turf and target are separate in case you want to teleport some distance from a t if(!istype(checked_atom)) return + //Find coordinates + var/turf/atom_turf = get_turf(checked_atom) //use checked_atom's turfs, as it's coords are the same as checked_atom's AND checked_atom's coords are lost if it is inside another atom + if(!atom_turf) + return null + //Find checked_atom's matrix so we can use it's X/Y pixel shifts var/matrix/atom_matrix = matrix(checked_atom.transform) @@ -225,10 +230,6 @@ Turf and target are separate in case you want to teleport some distance from a t var/rough_x = round(round(pixel_x_offset, world.icon_size) / world.icon_size) var/rough_y = round(round(pixel_y_offset, world.icon_size) / world.icon_size) - //Find coordinates - var/turf/atom_turf = get_turf(checked_atom) //use checked_atom's turfs, as it's coords are the same as checked_atom's AND checked_atom's coords are lost if it is inside another atom - if(!atom_turf) - return null var/final_x = clamp(atom_turf.x + rough_x, 1, world.maxx) var/final_y = clamp(atom_turf.y + rough_y, 1, world.maxy) @@ -256,7 +257,6 @@ Turf and target are separate in case you want to teleport some distance from a t LAZYSET(modifiers, ICON_Y, "[(click_turf_py - click_turf.pixel_y) + ((click_turf_y - click_turf.y) * world.icon_size)]") return click_turf -///Almost identical to the params_to_turf(), but unused (remove?) /proc/screen_loc_to_turf(text, turf/origin, client/C) if(!text) return null diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index f6089e6a767d..e33fa54598d1 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -247,6 +247,28 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, if(ITEM_SLOT_LEGCUFFED) return pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) +/proc/body_zone2item_slots(zone) + switch(zone) + if(BODY_ZONE_HEAD) + return ITEM_SLOT_HEAD|ITEM_SLOT_MASK + + if(BODY_ZONE_PRECISE_EYES) + return ITEM_SLOT_EYES + + if(BODY_ZONE_CHEST) + return ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING + + if(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) + return ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_GLOVES + + if(BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND) + return ITEM_SLOT_GLOVES + + if(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + return ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_FEET + + if(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) + return ITEM_SLOT_FEET //adapted from http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ /proc/heat2colour(temp) return rgb(heat2colour_r(temp), heat2colour_g(temp), heat2colour_b(temp)) @@ -318,15 +340,16 @@ GLOBAL_LIST_INIT(modulo_angle_to_dir, list(NORTH,NORTHEAST,EAST,SOUTHEAST,SOUTH, /proc/color_hex2color_matrix(string) var/length = length(string) if((length != 7 && length != 9) || length != length_char(string)) - return color_matrix_identity() - var/r = hex2num(copytext(string, 2, 4))/255 - var/g = hex2num(copytext(string, 4, 6))/255 - var/b = hex2num(copytext(string, 6, 8))/255 + return COLOR_MATRIX_IDENTITY + // For runtime safety + . = COLOR_MATRIX_IDENTITY + var/list/color = rgb2num(string) + var/r = color[1] / 255 + var/g = color[2] / 255 + var/b = color[3] / 255 var/a = 1 - if(length == 9) - a = hex2num(copytext(string, 8, 10))/255 - if(!isnum(r) || !isnum(g) || !isnum(b) || !isnum(a)) - return color_matrix_identity() + if(length(color) == 4) + a = color[4] / 255 return list(r,0,0,0, 0,g,0,0, 0,0,b,0, 0,0,0,a, 0,0,0,0) //will drop all values not on the diagonal diff --git a/code/__HELPERS/verbs.dm b/code/__HELPERS/verbs.dm index dfbac1d4f07b..556458d6b8b3 100644 --- a/code/__HELPERS/verbs.dm +++ b/code/__HELPERS/verbs.dm @@ -5,8 +5,9 @@ * Arguments: * * target - Who the verb is being added to, client or mob typepath * * verb - typepath to a verb, or a list of verbs, supports lists of lists + * * bypass_restricted - Whether or not to bypass client.restricted_mode */ -/proc/add_verb(client/target, verb_or_list_to_add) +/proc/add_verb(client/target, verb_or_list_to_add, bypass_restricted = FALSE) if(!target) CRASH("add_verb called without a target") if(IsAdminAdvancedProcCall()) @@ -18,6 +19,10 @@ target = mob_target.client else if(!istype(target, /client)) CRASH("add_verb called on a non-mob and non-client") + + if(target?.restricted_mode && !bypass_restricted) + return + var/list/verbs_list = list() if(!islist(verb_or_list_to_add)) verbs_list += verb_or_list_to_add diff --git a/code/_byond_version_compact.dm b/code/_byond_version_compact.dm index feece392c902..bef714ba785e 100644 --- a/code/_byond_version_compact.dm +++ b/code/_byond_version_compact.dm @@ -1,45 +1,21 @@ // This file contains defines allowing targeting byond versions newer than the supported //Update this whenever you need to take advantage of more recent byond features -#define MIN_COMPILER_VERSION 514 -#define MIN_COMPILER_BUILD 1556 +#define MIN_COMPILER_VERSION 515 +#define MIN_COMPILER_BUILD 1630 #if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM) //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 514.1556 or higher -#endif - -#if (DM_VERSION == 514 && DM_BUILD > 1575 && DM_BUILD <= 1577) -#error Your version of BYOND currently has a crashing issue that will prevent you from running Dream Daemon test servers. -#error We require developers to test their content, so an inability to test means we cannot allow the compile. -#error Please consider downgrading to 514.1575 or lower. +#error For a specific minimum version, check code/_byond_version_compact.dm #endif // Keep savefile compatibilty at minimum supported level -#if DM_VERSION >= 515 /savefile/byond_version = MIN_COMPILER_VERSION -#endif - -// 515 split call for external libraries into call_ext -#if DM_VERSION < 515 -#define LIBCALL call -#else -#define LIBCALL call_ext -#endif // So we want to have compile time guarantees these procs exist on local type, unfortunately 515 killed the .proc/procname syntax so we have to use nameof() -#if DM_VERSION < 515 -/// Call by name proc reference, checks if the proc exists on this type or as a global proc -#define PROC_REF(X) (.proc/##X) -/// Call by name proc reference, checks if the proc exists on given type or as a global proc -#define TYPE_PROC_REF(TYPE, X) (##TYPE.proc/##X) -/// Call by name proc reference, checks if the proc is existing global proc -#define GLOBAL_PROC_REF(X) (/proc/##X) -#else /// Call by name proc reference, checks if the proc exists on this type or as a global proc #define PROC_REF(X) (nameof(.proc/##X)) /// Call by name proc reference, checks if the proc exists on given type or as a global proc #define TYPE_PROC_REF(TYPE, X) (nameof(##TYPE.proc/##X)) /// Call by name proc reference, checks if the proc is existing global proc #define GLOBAL_PROC_REF(X) (/proc/##X) -#endif diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0885a4cadf83..caec887d3b49 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -68,18 +68,49 @@ ///~~Requires TESTING to be defined to work~~ //#define REAGENTS_TESTING +///If defined, we will compile with FULL timer debug info, rather then a limited scope +///Be warned, this increases timer creation cost by 5x +// #define TIMER_DEBUG + +// Displays static object lighting updates +// Also enables some debug vars on sslighting that can be used to modify +// How extensively we prune lighting corners to update +// #define VISUALIZE_LIGHT_UPDATES + ///If this is uncommented, force our verb processing into just the 2% of a tick ///We normally reserve for it ///NEVER run this on live, it's for simulating highpop only // #define VERB_STRESS_TEST +// If this is uncommented, will attempt to load and initialize prof.dll/libprof.so. +// We do not ship byond-tracy. Build it yourself here: https://github.com/mafemergency/byond-tracy/ +// #define USE_BYOND_TRACY ///Uncomment this to force all verbs to run into overtime all of the time ///Essentially negating the reserve 2% ///~~Requires VERB_STRESS_TEST to be defined~~ // #define FORCE_VERB_OVERTIME +///Uncomment this to enable a set of debugging verbs for client macros +///This ability is given to all clients, and I'm not going to bother vetting how safe this is. +///This will generate a compile warning. +//#define MACRO_TEST + +///Uncomment this to wire the ruin budgets to zero. This prevents them spawning. +///Useful for measuring performance of specific systems with more reliability. +//#define DISABLE_RUINS + +/// Uncomment this to assert INSTANCES_OF() is running on valid lists. +//#define DEBUG_ATLAS + +/// Uncomment this to enable debugging tools for map making. +//#define DEBUG_MAPS + +/// Set this value to FALSE to test job requirements working. +#define BYPASS_JOB_LIMITS_WHEN_DEBUGGING (TRUE) +/// Force codex SQLite generation and loading despite being a debug server. +//#define FORCE_CODEX_DATABASE 1 /////////////////////// REFERENCE TRACKING @@ -107,7 +138,6 @@ // #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 - /////////////////////// AUTO WIKI ///If this is uncommented, Autowiki will generate edits and shut down the server. @@ -126,15 +156,19 @@ /////////////////////// ZMIMIC -///Enables Multi-Z lighting -#define ZMIMIC_LIGHT_BLEED +///Enables multi-z speech +#define ZMIMIC_MULTIZ_SPEECH /////////////////////// MISC PERFORMANCE + //uncomment this to load centcom and runtime station and thats it. #define LOWMEMORYMODE //force a map for lowmemorymode #define FORCE_MAP "atlas" +//uncomment to enable the spatial grid debug proc. +// #define SPATIAL_GRID_ZLEVEL_STATS + ///A reasonable number of maximum overlays an object needs ///If you think you need more, rethink it #define MAX_ATOM_OVERLAYS 100 @@ -143,18 +177,22 @@ /// 1 to use the default behaviour; /// 2 for preloading absolutely everything; #ifndef PRELOAD_RSC -#define PRELOAD_RSC 2 +#define PRELOAD_RSC 1 #endif /////////////////////// ~[Additional code for the above flags]~ /////////////////////// +#ifdef DISABLE_RUINS +#warn DISABLE_RUINS Enabled: Ruin generation forcefully disabled. +#endif + #ifdef TESTING #warn compiling in TESTING mode. testing() debug messages will be visible. #endif -#ifdef CIBUILDING +#if defined(CIBUILDING) && !defined(OPENDREAM) #define UNIT_TESTS #endif @@ -162,12 +200,19 @@ #define TESTING #endif +#ifndef FORCE_CODEX_DATABASE +#define FORCE_CODEX_DATABASE 0 +#endif + #ifdef UNIT_TESTS // Hard del testing defines #define REFERENCE_TRACKING #define REFERENCE_TRACKING_DEBUG #define FIND_REF_NO_CHECK_TICK #define GC_FAILURE_HARD_LOOKUP +//Test at full capacity, the extra cost doesn't matter +#define TIMER_DEBUG +#define BYPASS_JOB_LIMITS_WHEN_DEBUGGING (TRUE) #endif #ifdef TGS @@ -175,10 +220,17 @@ #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. +#if defined(OPENDREAM) + #if !defined(CIBUILDING) + #warn You are building with OpenDream. Remember to build TGUI manually. + #warn You can do this by running tgui-build.cmd from the bin directory. + #endif +#else + #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.cmd in the root directory. + #warn Consider switching to VSCode editor instead, where you can press Ctrl+Shift+B to build. + #endif #endif #ifdef ZASDBG @@ -205,6 +257,11 @@ #define DATUMVAR_DEBUGGING_MODE #endif +#ifdef GC_FAILURE_HARD_LOOKUP +// Don't stop when searching, go till you're totally done +#define FIND_REF_NO_CHECK_TICK +#endif + #ifdef REFERENCE_DOING_IT_LIVE // compile the backend #define REFERENCE_TRACKING @@ -212,7 +269,3 @@ #define GC_FAILURE_HARD_LOOKUP #endif -#ifdef GC_FAILURE_HARD_LOOKUP -// Don't stop when searching, go till you're totally done -#define FIND_REF_NO_CHECK_TICK -#endif diff --git a/code/_debugger.dm b/code/_debugger.dm index 2adf956b00c2..66a5fffdaf5b 100644 --- a/code/_debugger.dm +++ b/code/_debugger.dm @@ -18,5 +18,5 @@ #endif if (dll) log_world("Loading Debug DLL at: [dll]") - LIBCALL(dll, "auxtools_init")() + call_ext(dll, "auxtools_init")() enable_debugging() diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm index f614061366cb..363b84b923d3 100644 --- a/code/_globalvars/admin.dm +++ b/code/_globalvars/admin.dm @@ -12,3 +12,19 @@ GLOBAL_VAR(stickbanadminexemptiontimerid) //stores the timerid of the callback t GLOBAL_LIST_INIT_TYPED(smites, /datum/smite, init_smites()) GLOBAL_VAR_INIT(admin_notice, "") // Admin notice that all clients see when joining the server + +// A list of all the special byond lists that need to be handled different by vv +GLOBAL_LIST_INIT(vv_special_lists, init_special_list_names()) + +/proc/init_special_list_names() + var/list/output = list() + var/obj/sacrifice = new + for(var/varname in sacrifice.vars) + var/value = sacrifice.vars[varname] + if(!islist(value)) + if(!isdatum(value) && hascall(value, "Cut")) + output += varname + continue + if(isnull(locate(REF(value)))) + output += varname + return output diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index f05f31a15923..ec46cf71726b 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -56,7 +56,6 @@ DEFINE_BITFIELD(area_flags, list( "CULT_PERMITTED" = CULT_PERMITTED, "FLORA_ALLOWED" = FLORA_ALLOWED, "HIDDEN_AREA" = HIDDEN_AREA, - "MEGAFAUNA_SPAWN_ALLOWED" = MEGAFAUNA_SPAWN_ALLOWED, "MOB_SPAWN_ALLOWED" = MOB_SPAWN_ALLOWED, "NO_ALERTS" = NO_ALERTS, "NOTELEPORT" = NOTELEPORT, @@ -88,6 +87,7 @@ DEFINE_BITFIELD(clothing_flags, list( "GAS_FILTERING" = GAS_FILTERING, "LAVAPROTECT" = LAVAPROTECT, "MASKINTERNALS" = MASKINTERNALS, + "STACKABLE_HELMET_EXEMPT" = STACKABLE_HELMET_EXEMPT, "SNUG_FIT" = SNUG_FIT, "STOPSPRESSUREDAMAGE" = STOPSPRESSUREDAMAGE, "THICKMATERIAL" = THICKMATERIAL, @@ -116,7 +116,6 @@ DEFINE_BITFIELD(flags_1, list( "HAS_CONTEXTUAL_SCREENTIPS_1" = HAS_CONTEXTUAL_SCREENTIPS_1, "HAS_DISASSOCIATED_STORAGE_1" = HAS_DISASSOCIATED_STORAGE_1, "HOLOGRAM_1" = HOLOGRAM_1, - "INITIALIZED_1" = INITIALIZED_1, "IS_ONTOP_1" = IS_ONTOP_1, "IS_PLAYER_COLORABLE_1" = IS_PLAYER_COLORABLE_1, "IS_SPINNING_1" = IS_SPINNING_1, @@ -125,7 +124,6 @@ DEFINE_BITFIELD(flags_1, list( "ON_BORDER_1" = ON_BORDER_1, "PREVENT_CLICK_UNDER_1" = PREVENT_CLICK_UNDER_1, "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1, - "SHOCKED_1" = SHOCKED_1, "SUPERMATTER_IGNORES_1" = SUPERMATTER_IGNORES_1, "UNPAINTABLE_1" = UNPAINTABLE_1, )) @@ -263,7 +261,6 @@ DEFINE_BITFIELD(movement_type, list( )) DEFINE_BITFIELD(obj_flags, list( - "BEING_SHOCKED" = BEING_SHOCKED, "BLOCK_Z_IN_DOWN" = BLOCK_Z_IN_DOWN, "BLOCK_Z_IN_UP" = BLOCK_Z_IN_UP, "BLOCK_Z_OUT_DOWN" = BLOCK_Z_OUT_DOWN, @@ -273,7 +270,6 @@ DEFINE_BITFIELD(obj_flags, list( "EMAGGED" = EMAGGED, "IN_USE" = IN_USE, "NO_BUILD" = NO_BUILD, - "ON_BLUEPRINTS" = ON_BLUEPRINTS, "UNIQUE_RENAME" = UNIQUE_RENAME, "USES_TGUI" = USES_TGUI, )) @@ -337,20 +333,15 @@ DEFINE_BITFIELD(chemical_flags, list( "REAGENT_INVISIBLE" = REAGENT_INVISIBLE, "REAGENT_SNEAKYNAME" = REAGENT_SNEAKYNAME, "REAGENT_SPLITRETAINVOL" = REAGENT_SPLITRETAINVOL, - "REAGENT_CAN_BE_SYNTHESIZED" = REAGENT_CAN_BE_SYNTHESIZED, - "REAGENT_IGNORE_STASIS" = REAGENT_IGNORE_STASIS, + "REAGENT_SPECIAL" = REAGENT_SPECIAL, "REAGENT_NO_RANDOM_RECIPE" = REAGENT_NO_RANDOM_RECIPE, "REAGENT_CLEANS" = REAGENT_CLEANS, )) DEFINE_BITFIELD(reaction_flags, list( - "REACTION_CLEAR_IMPURE" = REACTION_CLEAR_IMPURE, - "REACTION_CLEAR_INVERSE" = REACTION_CLEAR_INVERSE, - "REACTION_CLEAR_RETAIN" = REACTION_CLEAR_RETAIN, "REACTION_INSTANT" = REACTION_INSTANT, "REACTION_HEAT_ARBITARY" = REACTION_HEAT_ARBITARY, "REACTION_COMPETITIVE" = REACTION_COMPETITIVE, - "REACTION_PH_VOL_CONSTANT" = REACTION_PH_VOL_CONSTANT, "REACTION_REAL_TIME_SPLIT" = REACTION_REAL_TIME_SPLIT, )) @@ -404,3 +395,46 @@ DEFINE_BITFIELD(z_flags, list( "Z_MIMIC_NO_OCCLUDE" = Z_MIMIC_NO_OCCLUDE, "Z_MIMIC_BASETURF" = Z_MIMIC_BASETURF, )) + +DEFINE_BITFIELD(bodypart_flags, list( + "BP_BLEEDING" = BP_BLEEDING, + "BP_HAS_BLOOD" = BP_HAS_BLOOD, + "BP_HAS_BONES" = BP_HAS_BONES, + "BP_BROKEN_BONES" = BP_BROKEN_BONES, + "BP_HAS_TENDON" = BP_HAS_TENDON, + "BP_TENDON_CUT" = BP_TENDON_CUT, + "BP_HAS_ARTERY" = BP_HAS_ARTERY, + "BP_ARTERY_CUT" = BP_ARTERY_CUT, + "BP_IS_GRABBY_LIMB" = BP_IS_GRABBY_LIMB, + "BP_IS_MOVEMENT_LIMB" = BP_IS_MOVEMENT_LIMB, + "BP_CUT_AWAY" = BP_CUT_AWAY, +)) + +DEFINE_BITFIELD(organ_flags, list( + "ORGAN_SYNTHETIC" = ORGAN_SYNTHETIC, + "ORGAN_FROZEN" = ORGAN_FROZEN, + "ORGAN_DEAD" = ORGAN_DEAD, + "ORGAN_EXTERNAL" = ORGAN_EXTERNAL, + "ORGAN_VITAL" = ORGAN_VITAL, + "ORGAN_EDIBLE" = ORGAN_EDIBLE, + "ORGAN_SYNTHETIC_EMP" = ORGAN_SYNTHETIC_EMP, + "ORGAN_UNREMOVABLE" = ORGAN_UNREMOVABLE, + "ORGAN_CUT_AWAY" = ORGAN_CUT_AWAY +)) + +DEFINE_BITFIELD(obscured_slots, list( + "HIDE GLOVES" = HIDEGLOVES, + "HIDE SUITSTORAGE" = HIDESUITSTORAGE, + "HIDE JUMPSUIT" = HIDEJUMPSUIT, + "HIDE SHOES" = HIDESHOES, + "HIDE MASK" = HIDEMASK, + "HIDE EARS" = HIDEEARS, + "HIDE EYES" = HIDEEYES, + "HIDE FACE" = HIDEFACE, + "HIDE HAIR" = HIDEHAIR, + "HIDE FACIALHAIR" = HIDEFACIALHAIR, + "HIDE NECK" = HIDENECK, + "HIDE HEADGEAR" = HIDEHEADGEAR, + "HIDE SNOUT" = HIDESNOUT, + "HIDE MUTWINGS" = HIDEMUTWINGS +)) diff --git a/code/_globalvars/lists/cables.dm b/code/_globalvars/lists/cables.dm new file mode 100644 index 000000000000..b5891e62d6cd --- /dev/null +++ b/code/_globalvars/lists/cables.dm @@ -0,0 +1,74 @@ +GLOBAL_LIST_INIT(cable_colors, list( + "blue" = COLOR_STRONG_BLUE, + "cyan" = COLOR_CYAN, + "green" = COLOR_DARK_LIME, + "orange" = COLOR_MOSTLY_PURE_ORANGE, + "pink" = COLOR_LIGHT_PINK, + "red" = COLOR_RED, + "white" = COLOR_WHITE, + "yellow" = COLOR_YELLOW + )) + +#define CABLE_NORTH 1 +#define CABLE_SOUTH 2 +#define CABLE_EAST 4 +#define CABLE_WEST 8 +#define CABLE_NORTHEAST 16 +#define CABLE_SOUTHEAST 32 +#define CABLE_NORTHWEST 64 +#define CABLE_SOUTHWEST 128 + +GLOBAL_LIST_INIT(cable_dirs, list( + CABLE_NORTH, + CABLE_SOUTH, + CABLE_EAST, + CABLE_WEST, + CABLE_NORTHEAST, + CABLE_SOUTHEAST, + CABLE_NORTHWEST, + CABLE_SOUTHWEST, + )) + +GLOBAL_LIST_INIT(cable_dirs_to_inverse, list( + "[CABLE_NORTH]" = CABLE_SOUTH, + "[CABLE_SOUTH]" = CABLE_NORTH, + "[CABLE_EAST]" = CABLE_WEST, + "[CABLE_WEST]" = CABLE_EAST, + "[CABLE_NORTHEAST]" = CABLE_SOUTHWEST, + "[CABLE_SOUTHEAST]" = CABLE_NORTHWEST, + "[CABLE_NORTHWEST]" = CABLE_SOUTHEAST, + "[CABLE_SOUTHWEST]" = CABLE_NORTHEAST, + )) + +GLOBAL_LIST_INIT(cable_dirs_to_real_dirs, list( + "[CABLE_NORTH]" = NORTH, + "[CABLE_SOUTH]" = SOUTH, + "[CABLE_EAST]" = EAST, + "[CABLE_WEST]" = WEST, + "[CABLE_NORTHEAST]" = NORTH|EAST, + "[CABLE_SOUTHEAST]" = SOUTH|EAST, + "[CABLE_NORTHWEST]" = NORTH|WEST, + "[CABLE_SOUTHWEST]" = SOUTH|WEST, + )) + +GLOBAL_LIST_INIT(real_dirs_to_cable_dirs, list( + "[NORTH]" = CABLE_NORTH, + "[SOUTH]" = CABLE_SOUTH, + "[EAST]" = CABLE_EAST, + "[WEST]" = CABLE_WEST, + "[NORTH|EAST]" = CABLE_NORTHEAST, + "[SOUTH|EAST]" = CABLE_SOUTHEAST, + "[NORTH|WEST]" = CABLE_NORTHWEST, + "[SOUTH|WEST]" = CABLE_SOUTHWEST, + )) + +GLOBAL_LIST_INIT(cable_dir_rotate_clockwise, list( + "[CABLE_NORTH]" = CABLE_EAST, + "[CABLE_SOUTH]" = CABLE_WEST, + "[CABLE_EAST]" = CABLE_SOUTH, + "[CABLE_WEST]" = CABLE_NORTH, + "[CABLE_NORTHEAST]" = CABLE_SOUTHEAST, + "[CABLE_SOUTHEAST]" = CABLE_SOUTHWEST, + "[CABLE_NORTHWEST]" = CABLE_NORTHEAST, + "[CABLE_SOUTHWEST]" = CABLE_NORTHWEST, + )) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index a06196eb4236..e1026705fa53 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -34,6 +34,15 @@ GLOBAL_LIST_EMPTY(spines_list_vox) GLOBAL_LIST_EMPTY(vox_hair_list) GLOBAL_LIST_EMPTY(vox_facial_hair_list) + //IPC bits +GLOBAL_LIST_EMPTY(ipc_screens_list) +GLOBAL_LIST_EMPTY(ipc_antenna_list) + //IPC bits (furry) +GLOBAL_LIST_EMPTY(saurian_screens_list) +GLOBAL_LIST_EMPTY(saurian_tails_list) +GLOBAL_LIST_EMPTY(saurian_scutes_list) +GLOBAL_LIST_EMPTY(saurian_antenna_list) + //Mutant Human bits GLOBAL_LIST_EMPTY(tails_list) GLOBAL_LIST_EMPTY(tails_list_human) //Only exists for preference choices. Use "tails_list" otherwise. @@ -46,7 +55,6 @@ GLOBAL_LIST_EMPTY(moth_antennae_list) GLOBAL_LIST_EMPTY(moth_markings_list) GLOBAL_LIST_EMPTY(caps_list) GLOBAL_LIST_EMPTY(pod_hair_list) -GLOBAL_LIST_EMPTY(headtails_list) GLOBAL_LIST_EMPTY(teshari_feathers_list) GLOBAL_LIST_EMPTY(teshari_ears_list) GLOBAL_LIST_EMPTY(teshari_body_feathers_list) @@ -284,14 +292,37 @@ GLOBAL_LIST_INIT(scarySounds, list( //If you don't want to fuck up disposals, add to this list, and don't change the order. //If you insist on changing the order, you'll have to change every sort junction to reflect the new order. --Pete -GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals", - "Cargo Bay", "QM Office", "Engineering", "CE Office", - "Atmospherics", "Security", "HoS Office", "Medbay", - "CMO Office", "Chemistry", "Research", "RD Office", - "Robotics", "HoP Office", "Library", "Chapel", "Theatre", - "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics", - "Experimentor Lab", "Ordnance", "Dormitories", "Virology", - "Xenobiology", "Law Office","Detective's Office")) +GLOBAL_LIST_INIT(TAGGERLOCATIONS, list( + /* 1*/"Disposals", + /* 2*/"Cargo Bay", + /* 3*/"QM Office", + /* 4*/"Engineering", + /* 5*/"CE Office", + /* 6*/"Atmospherics", + /* 7*/"Security", + /* 8*/"HoS Office", + /* 9*/"Medbay", + /*10*/"CMO Office", + /*11*/"Chemistry", + /*12*/"Research", + /*13*/"RD Office", + /*14*/"Robotics", + /*15*/"HoP Office", + /*16*/"Library", + /*17*/"Chapel", + /*18*/"Theatre", + /*19*/"Bar", + /*20*/"Kitchen", + /*21*/"Hydroponics", + /*22*/"Janitor Closet", + /*23*/"Genetics", + /*24*/"Experimentor Lab", + /*25*/"Ordnance", + /*26*/"Dormitories", + /*27*/"Virology", + /*28*/"Xenobiology", + /*29*/"Law Office", + /*30*/"Detective's Office")) GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt")) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 6205d33fab56..66174fbf7a5d 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -127,7 +127,6 @@ GLOBAL_LIST_INIT(common_loot, list( //common: basic items /obj/item/grenade/chem_grenade/cleaner = 1, /obj/item/lead_pipe = 1, /obj/item/reagent_containers/glass/beaker = 1, - /obj/item/reagent_containers/glass/bottle/random_buffer = 2, /obj/item/reagent_containers/glass/rag = 1, /obj/item/reagent_containers/hypospray/medipen/pumpup = 2, /obj/item/reagent_containers/syringe = 1, @@ -194,7 +193,6 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items /obj/item/beacon = 1, /obj/item/paper/fluff/stations/soap = 1, //recipes count as crafting. /obj/item/plaque = 1, - /obj/item/seeds/kronkus = 1, /obj/item/seeds/odious_puffball = 1, /obj/item/stack/sheet/mineral/wood/fifty = 1, /obj/item/stock_parts/cell/high = 1, @@ -204,14 +202,14 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items list(//medical and chemicals list(//basic healing items - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/gauze = 1, /obj/item/stack/medical/mesh = 1, /obj/item/stack/medical/suture = 1, + /obj/item/stack/medical/bruise_pack = 1, ) = 1, list(//medical chems - /obj/item/reagent_containers/glass/bottle/multiver = 1, + /obj/item/reagent_containers/glass/bottle/dylovene = 1, /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/reagent_containers/syringe/convermol = 1, ) = 1, list(//drinks /obj/item/reagent_containers/food/drinks/bottle/vodka = 1, @@ -228,7 +226,6 @@ GLOBAL_LIST_INIT(uncommon_loot, list(//uncommon: useful items list(//food /obj/item/food/canned/peaches/maint = 1, /obj/item/storage/box/donkpockets = 1, - /obj/item/storage/box/gum/happiness = 1, list(//Donk Varieties /obj/item/storage/box/donkpockets/donkpocketberry = 1, /obj/item/storage/box/donkpockets/donkpockethonk = 1, @@ -285,6 +282,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/shield/riot/buckler = 1, /obj/item/throwing_star = 1, /obj/item/weldingtool/hugetank = 1, + /obj/item/paint_sprayer = 1, ) = 1, list(//equipment @@ -298,18 +296,6 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/storage/belt/security = 1, ) = 1, - list(//paint - /obj/item/paint/anycolor = 1, - /obj/item/paint/black = 1, - /obj/item/paint/blue = 1, - /obj/item/paint/green = 1, - /obj/item/paint_remover = 1, - /obj/item/paint/red = 1, - /obj/item/paint/violet = 1, - /obj/item/paint/white = 1, - /obj/item/paint/yellow = 1, - ) = 1, - list(//medical and chemicals list(//medkits /obj/item/storage/box/hug/medical = 1, @@ -317,14 +303,13 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items /obj/item/storage/medkit/regular = 1, ) = 1, list(//medical chems - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, - /obj/item/reagent_containers/hypospray/medipen/salacid = 1, + /obj/item/reagent_containers/hypospray/medipen/dermaline = 1, + /obj/item/reagent_containers/hypospray/medipen/meralyne = 1, /obj/item/reagent_containers/syringe/contraband/methamphetamine = 1, ) = 1, ) = 1, list(//misc - /obj/item/book/granter/crafting_recipe/pipegun_prime = 1, /obj/item/book/granter/crafting_recipe/trash_cannon = 1, /obj/item/disk/nuclear/fake = 1, /obj/item/skillchip/brainwashing = 1, @@ -344,7 +329,6 @@ GLOBAL_LIST_INIT(oddity_loot, list(//oddity: strange or crazy items /obj/item/dice/d20/fate/stealth/one_use = 1, //Looks like a d20, keep the d20 in the uncommon pool. /obj/item/shadowcloak = 1, /obj/item/spear/grey_tide = 1, - /obj/item/storage/box/donkpockets/donkpocketgondola = 1, list(//music /obj/item/instrument/saxophone/spectral = 1, /obj/item/instrument/trombone/spectral = 1, @@ -388,6 +372,3 @@ GLOBAL_LIST_INIT(ratking_coins, list(//Coins: Used by the regal rat mob when spa /obj/item/coin/silver, /obj/item/coin/titanium, )) - -// List of all maintenance loot spawners, for easy finding at roundstart. -GLOBAL_LIST_EMPTY(maintenance_loot_spawners) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 130ae67406b8..774742dcf7bc 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -122,16 +122,13 @@ GLOBAL_LIST_EMPTY(bar_areas) //away missions GLOBAL_LIST_EMPTY(vr_spawnpoints) - //used by jump-to-area etc. Updated by area/updateName() +// Just a list of all the area objects in the game +/// Note, areas can have duplicate types +GLOBAL_LIST_EMPTY(areas) +/// Used by jump-to-area etc. Updated by area/updateName() +/// If this is null, it needs to be recalculated. Use get_sorted_areas() as a getter please GLOBAL_LIST_EMPTY(sortedAreas) /// An association from typepath to area instance. Only includes areas with `unique` set. 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/bubblegum = 6, - /mob/living/simple_animal/hostile/megafauna/colossus = 2, - /mob/living/simple_animal/hostile/megafauna/dragon = 4, -)) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 1193ad2a4bc5..0cd6f858e0e1 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -55,8 +55,11 @@ GLOBAL_LIST_EMPTY(current_observers_list) ///underages who have been reported to security for trying to buy things they shouldn't, so they can't spam GLOBAL_LIST_EMPTY(narcd_underages) +#define GET_LANGUAGE_DATUM(lang) (istype(lang, /datum/language) ? lang : GLOB.language_datum_instances[lang]) + GLOBAL_LIST_EMPTY(language_datum_instances) GLOBAL_LIST_EMPTY(all_languages) +GLOBAL_LIST_EMPTY(preference_language_types) GLOBAL_LIST_EMPTY(sentient_disease_instances) @@ -110,9 +113,8 @@ GLOBAL_LIST_INIT(construct_radial_images, list( /proc/get_crewmember_minds() var/list/minds = list() - for(var/data in GLOB.data_core.locked) - var/datum/data/record/record = data - var/datum/mind/mind = record.fields["mindref"] + for(var/datum/data/record/record as anything in SSdatacore.get_records(DATACORE_RECORDS_LOCKED)) + var/datum/mind/mind = record.fields[DATACORE_MINDREF] if(mind) minds += mind return minds diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index ae275e96b93d..828a42b200c3 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -1,40 +1,21 @@ -GLOBAL_LIST_EMPTY(cable_list) //Index for all cables, so that powernets don't have to look through the entire world all the time -GLOBAL_LIST_EMPTY(portals) //list of all /obj/effect/portal -GLOBAL_LIST_EMPTY(airlocks) //list of all airlocks -GLOBAL_LIST_EMPTY(curtains) //list of all curtains -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(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 +/// List of all navbeacons by Z level +GLOBAL_LIST_EMPTY(navbeacons) +/// List of beacons set to delivery mode GLOBAL_LIST_EMPTY(deliverybeacons) //list of all MULEbot delivery beacons. +/// List of tags belonging to beacons set to delivery mode GLOBAL_LIST_EMPTY(deliverybeacontags) //list of all tags associated with delivery beacons. -GLOBAL_LIST_EMPTY(nuke_list) -GLOBAL_LIST_EMPTY(alarmdisplay) //list of all machines or programs that can display station alerts + GLOBAL_LIST_EMPTY_TYPED(singularities, /datum/component/singularity) //list of all singularities on the station -GLOBAL_LIST_EMPTY(mechpad_list) //list of all /obj/machinery/mechpad -GLOBAL_LIST(chemical_reactions_list) //list of all /datum/chemical_reaction datums indexed by their typepath. Use this for general lookup stuff -GLOBAL_LIST(chemical_reactions_list_reactant_index) //list of all /datum/chemical_reaction datums. Used during chemical reactions. Indexed by REACTANT types -GLOBAL_LIST(chemical_reactions_list_product_index) //list of all /datum/chemical_reaction datums. Used for the reaction lookup UI. Indexed by PRODUCT type -GLOBAL_LIST_INIT(chemical_reagents_list, init_chemical_reagent_list()) //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff -GLOBAL_LIST(chemical_reactions_results_lookup_list) //List of all reactions with their associated product and result ids. Used for reaction lookups 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 -GLOBAL_LIST_EMPTY(rcd_list) //list of Rapid Construction Devices. -GLOBAL_LIST_EMPTY(intercoms_list) //list of wallmounted intercom radios. -GLOBAL_LIST_EMPTY(apcs_list) //list of all Area Power Controller machines, separate from machines for powernet speeeeeeed. GLOBAL_LIST_EMPTY(tracked_implants) //list of all current implants that are tracked to work out what sort of trek everyone is on. Sadly not on lavaworld not implemented... GLOBAL_LIST_EMPTY(tracked_chem_implants) //list of implants the prisoner console can track and send inject commands too GLOBAL_LIST_EMPTY(pinpointer_list) //list of all pinpointers. Used to change stuff they are pointing to all at once. GLOBAL_LIST_EMPTY(zombie_infection_list) // A list of all zombie_infection organs, for any mass "animation" GLOBAL_LIST_EMPTY(meteor_list) // List of all meteors. GLOBAL_LIST_EMPTY(active_jammers) // List of active radio jammers -GLOBAL_LIST_EMPTY(ladders) -GLOBAL_LIST_EMPTY(stairs) GLOBAL_LIST_EMPTY(janitor_devices) GLOBAL_LIST_EMPTY(trophy_cases) GLOBAL_LIST_EMPTY(experiment_handlers) @@ -54,3 +35,9 @@ GLOBAL_LIST_EMPTY(air_vent_names) // Name list of all air vents GLOBAL_LIST_EMPTY(roundstart_station_borgcharger_areas) // List of area names of roundstart station cyborg rechargers, for the low charge/no charge cyborg screen alert tooltips. GLOBAL_LIST_EMPTY(roundstart_station_mechcharger_areas) // List of area names of roundstart station mech rechargers, for the low charge/no charge mech screen alert tooltips. + +/// Contains all atmospheric machinery, only used if DEBUG_MAPS is defined. +GLOBAL_REAL_VAR(list/atmospherics) = list() + +/// Is a real global for speed +GLOBAL_REAL_VAR(list/cable_list) = list() diff --git a/code/_globalvars/lists/slapcrafting.dm b/code/_globalvars/lists/slapcrafting.dm new file mode 100644 index 000000000000..34685453f379 --- /dev/null +++ b/code/_globalvars/lists/slapcrafting.dm @@ -0,0 +1,71 @@ +GLOBAL_LIST_EMPTY(slapcraft_firststep_recipe_cache) +GLOBAL_LIST_EMPTY(slapcraft_categorized_recipes) +GLOBAL_LIST_EMPTY(slapcraft_steps) +GLOBAL_LIST_EMPTY(slapcraft_recipes) + + +/proc/init_slapcraft_recipes() + var/list/recipe_list = GLOB.slapcraft_recipes + for(var/datum/type as anything in typesof(/datum/slapcraft_recipe)) + if(isabstract(type)) + continue + var/datum/slapcraft_recipe/recipe = new type() + recipe_list[type] = recipe + + // Add the recipe to the categorized global list, which is used for the handbook UI + if(!GLOB.slapcraft_categorized_recipes[recipe.category]) + GLOB.slapcraft_categorized_recipes[recipe.category] = list() + if(!GLOB.slapcraft_categorized_recipes[recipe.category][recipe.subcategory]) + GLOB.slapcraft_categorized_recipes[recipe.category][recipe.subcategory] = list() + GLOB.slapcraft_categorized_recipes[recipe.category][recipe.subcategory] += recipe + +/proc/init_slapcraft_steps() + var/list/step_list = GLOB.slapcraft_steps + for(var/datum/type as anything in typesof(/datum/slapcraft_step)) + if(isabstract(type)) + continue + step_list[type] = new type() + +/// Gets cached recipes for a type. This is a method of optimizating recipe lookup. Ugly but gets the job done. +/// also WARNING: This will make it so all recipes whose first step is not type checked will not work, which all recipes that I can think of will be. +/// If you wish to remove this and GLOB.slapcraft_firststep_recipe_cache should this cause issues, replace the return with GLOB.slapcraft_recipes +/proc/slapcraft_recipes_for_type(passed_type) + // Falsy entry means we need to make a cache for this type. + if(isnull(GLOB.slapcraft_firststep_recipe_cache[passed_type])) + var/list/fitting_recipes = list() + for(var/recipe_type in GLOB.slapcraft_recipes) + var/datum/slapcraft_recipe/recipe = SLAPCRAFT_RECIPE(recipe_type) + var/datum/slapcraft_step/step_one = SLAPCRAFT_STEP(recipe.steps[1]) + if(step_one.check_type(passed_type)) + fitting_recipes += recipe + + if(fitting_recipes.len == 0) + GLOB.slapcraft_firststep_recipe_cache[passed_type] = FALSE + else if (fitting_recipes.len == 1) + GLOB.slapcraft_firststep_recipe_cache[passed_type] = fitting_recipes[1] + else + GLOB.slapcraft_firststep_recipe_cache[passed_type] = fitting_recipes + + + var/value = GLOB.slapcraft_firststep_recipe_cache[passed_type] + if(value == FALSE) + return null + + // Once again, either pointing to a list or to a single value is something hacky but useful here for a very easy memory optimization. + else if (islist(value)) + return value + else + return list(value) + +/// Gets examine hints for this item type for slap crafting. +/proc/slapcraft_examine_hints_for_type(passed_type) + var/list/valid_recipes = slapcraft_recipes_for_type(passed_type) + if(!valid_recipes) + return null + + var/list/all_hints = list() + for(var/datum/slapcraft_recipe/recipe as anything in valid_recipes) + if(recipe.examine_hint) + all_hints += recipe.examine_hint + + return all_hints diff --git a/code/_globalvars/lists/typecache.dm b/code/_globalvars/lists/typecache.dm index 8afeba023178..fb76cb6db642 100644 --- a/code/_globalvars/lists/typecache.dm +++ b/code/_globalvars/lists/typecache.dm @@ -9,11 +9,6 @@ GLOBAL_LIST_INIT(typecache_living, typecacheof(/mob/living)) GLOBAL_LIST_INIT(typecache_stack, typecacheof(/obj/item/stack)) -GLOBAL_LIST_INIT(typecache_machine_or_structure, typecacheof(list( - /obj/machinery, - /obj/structure, -))) - /// A typecache listing structures that are considered to have surfaces that you can place items on that are higher than the floor. This, of course, should be restricted to /atom/movables. This is primarily used for food decomposition code. GLOBAL_LIST_INIT(typecache_elevated_structures, typecacheof(list( /obj/machinery/conveyor, diff --git a/code/_globalvars/lists/xenobiology.dm b/code/_globalvars/lists/xenobiology.dm deleted file mode 100644 index ee2a7724b21a..000000000000 --- a/code/_globalvars/lists/xenobiology.dm +++ /dev/null @@ -1,99 +0,0 @@ -///These global lists exist to allow our element to have weight tables without having to be separate instances. - -///Assoc list of cell line define | assoc list of datum | cell_line -GLOBAL_LIST_INIT_TYPED(cell_line_tables, /list, list( - CELL_LINE_TABLE_SLUDGE = list( - /datum/micro_organism/cell_line/blobbernaut = 1, - /datum/micro_organism/cell_line/chicken = 1, - /datum/micro_organism/cell_line/cockroach = 2, - /datum/micro_organism/cell_line/cow = 1, - /datum/micro_organism/cell_line/mouse = 1, - /datum/micro_organism/cell_line/sholean_grapes = 2, - /datum/micro_organism/cell_line/slime = 2, - ), - - CELL_LINE_TABLE_MOIST = list( - /datum/micro_organism/cell_line/carp = 1, - /datum/micro_organism/cell_line/cockroach = 1, - /datum/micro_organism/cell_line/gelatinous_cube = 2, - /datum/micro_organism/cell_line/megacarp = 1, - /datum/micro_organism/cell_line/slime = 2, - /datum/micro_organism/cell_line/snake = 1, - /datum/micro_organism/cell_line/glockroach = 1, - /datum/micro_organism/cell_line/hauberoach = 1, - ), - - CELL_LINE_TABLE_BLOB = list( - /datum/micro_organism/cell_line/blob_spore = 1, - /datum/micro_organism/cell_line/blobbernaut = 1, - ), - - CELL_LINE_TABLE_MOLD = list( - /datum/micro_organism/cell_line/bear = 1, - /datum/micro_organism/cell_line/blob_spore = 1, - /datum/micro_organism/cell_line/cat = 1, - /datum/micro_organism/cell_line/cockroach = 1, - /datum/micro_organism/cell_line/corgi = 1, - /datum/micro_organism/cell_line/mouse = 2, - /datum/micro_organism/cell_line/slime = 1, - /datum/micro_organism/cell_line/vat_beast = 2, - ), - - CELL_LINE_TABLE_BEAR = list(/datum/micro_organism/cell_line/bear = 1), - CELL_LINE_TABLE_BLOBBERNAUT = list(/datum/micro_organism/cell_line/blobbernaut = 1), - CELL_LINE_TABLE_BLOBSPORE = list(/datum/micro_organism/cell_line/blob_spore = 1), - CELL_LINE_TABLE_CARP = list(/datum/micro_organism/cell_line/carp = 1), - CELL_LINE_TABLE_CAT = list(/datum/micro_organism/cell_line/cat = 1), - CELL_LINE_TABLE_CHICKEN = list(/datum/micro_organism/cell_line/chicken = 1), - CELL_LINE_TABLE_COCKROACH = list(/datum/micro_organism/cell_line/cockroach = 1), - CELL_LINE_TABLE_CORGI = list(/datum/micro_organism/cell_line/corgi = 1), - CELL_LINE_TABLE_COW = list(/datum/micro_organism/cell_line/cow = 1), - CELL_LINE_TABLE_MOONICORN = list(/datum/micro_organism/cell_line/moonicorn = 1), - CELL_LINE_TABLE_GELATINOUS = list(/datum/micro_organism/cell_line/gelatinous_cube = 1), - CELL_LINE_TABLE_GLOCKROACH = list(/datum/micro_organism/cell_line/glockroach = 1), - CELL_LINE_TABLE_GRAPE = list(/datum/micro_organism/cell_line/sholean_grapes = 1), - CELL_LINE_TABLE_HAUBEROACH = list(/datum/micro_organism/cell_line/hauberoach = 1), - CELL_LINE_TABLE_MEGACARP = list(/datum/micro_organism/cell_line/megacarp = 1), - CELL_LINE_TABLE_MOUSE = list(/datum/micro_organism/cell_line/mouse = 1), - CELL_LINE_TABLE_PINE = list(/datum/micro_organism/cell_line/pine = 1), - CELL_LINE_TABLE_PUG = list(/datum/micro_organism/cell_line/pug = 1), - CELL_LINE_TABLE_SLIME = list(/datum/micro_organism/cell_line/slime = 1), - CELL_LINE_TABLE_SNAKE = list(/datum/micro_organism/cell_line/snake = 1), - CELL_LINE_TABLE_VATBEAST = list(/datum/micro_organism/cell_line/vat_beast = 1), - CELL_LINE_TABLE_NETHER = list(/datum/micro_organism/cell_line/netherworld = 1), - CELL_LINE_TABLE_CLOWN = list( - /datum/micro_organism/cell_line/clown/bananaclown = 1, - /datum/micro_organism/cell_line/clown/glutton = 1, - /datum/micro_organism/cell_line/clown/longclown = 1, - ), - - CELL_LINE_TABLE_GLUTTON = list(/datum/micro_organism/cell_line/clown/glutton = 1), - CELL_LINE_TABLE_FROG = list(/datum/micro_organism/cell_line/frog = 1), - CELL_LINE_TABLE_WALKING_MUSHROOM = list(/datum/micro_organism/cell_line/walking_mushroom = 1), - CELL_LINE_TABLE_QUEEN_BEE = list(/datum/micro_organism/cell_line/queen_bee = 1), - CELL_LINE_TABLE_LEAPER = list(/datum/micro_organism/cell_line/leaper = 1), - CELL_LINE_TABLE_MEGA_ARACHNID = list(/datum/micro_organism/cell_line/mega_arachnid = 1), - CELL_LINE_TABLE_ALGAE = list( - /datum/micro_organism/cell_line/frog = 2, - /datum/micro_organism/cell_line/leaper = 2, - /datum/micro_organism/cell_line/mega_arachnid = 1, - /datum/micro_organism/cell_line/queen_bee = 1, - /datum/micro_organism/cell_line/snake = 1, - /datum/micro_organism/cell_line/walking_mushroom = 2, - ) -)) - -///Assoc list of cell virus define | assoc list of datum | cell_virus -GLOBAL_LIST_INIT(cell_virus_tables, list( - CELL_VIRUS_TABLE_GENERIC = list(/datum/micro_organism/virus = 1), - CELL_VIRUS_TABLE_GENERIC_MOB = list(/datum/micro_organism/virus = 1) - )) - -///List of all possible sample colors -GLOBAL_LIST_INIT(xeno_sample_colors, list( - COLOR_SAMPLE_BROWN, - COLOR_SAMPLE_GRAY, - COLOR_SAMPLE_GREEN, - COLOR_SAMPLE_PURPLE, - COLOR_SAMPLE_YELLOW, -)) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 6328be2ec463..74360a6bee98 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -6,6 +6,8 @@ GLOBAL_VAR(world_silicon_log) GLOBAL_PROTECT(world_silicon_log) GLOBAL_VAR(world_tool_log) GLOBAL_PROTECT(world_tool_log) +GLOBAL_VAR(world_graffiti_log) +GLOBAL_PROTECT(world_graffiti_log) /// Log associated with [/proc/log_suspicious_login()] - Intended to hold all logins that failed due to suspicious circumstances such as ban detection, CID randomisation etc. GLOBAL_VAR(world_suspicious_login_log) GLOBAL_PROTECT(world_suspicious_login_log) diff --git a/code/_globalvars/phobias.dm b/code/_globalvars/phobias.dm index 2c7c90f70f0e..d7b58884358d 100644 --- a/code/_globalvars/phobias.dm +++ b/code/_globalvars/phobias.dm @@ -51,7 +51,6 @@ GLOBAL_LIST_INIT(phobia_regexes, list( )) GLOBAL_LIST_INIT(phobia_mobs, list( - "spiders" = typecacheof(list(/mob/living/simple_animal/hostile/giant_spider)), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), @@ -102,7 +101,6 @@ GLOBAL_LIST_INIT(phobia_mobs, list( GLOBAL_LIST_INIT(phobia_objs, list( "snakes" = typecacheof(list( - /obj/item/rod_of_asclepius, /obj/item/toy/plush/snakeplushie, )), "spiders" = typecacheof(list(/obj/structure/spider)), @@ -171,9 +169,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( "lizards" = typecacheof(list( /obj/item/clothing/head/lizard, /obj/item/clothing/shoes/cowboy/lizard, - /obj/item/food/kebab/tail, /obj/item/organ/tail/lizard, - /obj/item/reagent_containers/food/drinks/bottle/lizardwine, /obj/item/toy/plush/lizard_plushie, )), @@ -255,7 +251,6 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/scalpel, /obj/item/storage/medkit, /obj/item/storage/pill_bottle, - /obj/item/surgical_drapes, /obj/item/surgicaldrill, /obj/machinery/atmospherics/components/unary/cryo_cell, /obj/machinery/dna_scannernew, @@ -278,7 +273,7 @@ GLOBAL_LIST_INIT(phobia_objs, list( /obj/item/clothing/under/rank/rnd/research_director, /obj/item/clothing/under/rank/security/head_of_security, /obj/item/megaphone/command, - /obj/item/melee/baton/telescopic, + /obj/item/assembly/flash/handheld, /obj/item/stamp/captain, /obj/item/stamp/ce, /obj/item/stamp/centcom, @@ -487,7 +482,6 @@ GLOBAL_LIST_INIT(phobia_species, list( /datum/species/pod, /datum/species/shadow, )), - "anime" = typecacheof(list(/datum/species/human/felinid)), "conspiracies" = typecacheof(list( /datum/species/abductor, /datum/species/lizard, @@ -502,7 +496,6 @@ GLOBAL_LIST_INIT(phobia_species, list( /datum/species/plasmaman, /datum/species/skeleton, )), - "the supernatural" = typecacheof(list(/datum/species/golem/runic)), )) /// Creates a regular expression to match against the given phobia diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 706615f73d69..fad6cf62dc29 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -10,9 +10,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FLOORED" = TRAIT_FLOORED, "TRAIT_FORCED_STANDING" = TRAIT_FORCED_STANDING, "TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED, - "TRAIT_RESTRAINED" = TRAIT_RESTRAINED, + "TRAIT_ARMS_RESTRAINED" = TRAIT_ARMS_RESTRAINED, "TRAIT_INCAPACITATED" = TRAIT_INCAPACITATED, - "TRAIT_CRITICAL_CONDITION" = TRAIT_CRITICAL_CONDITION, "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_BLIND" = TRAIT_BLIND, @@ -65,7 +64,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_EASYDISMEMBER" = TRAIT_EASYDISMEMBER, "TRAIT_LIMBATTACHMENT" = TRAIT_LIMBATTACHMENT, "TRAIT_NOLIMBDISABLE" = TRAIT_NOLIMBDISABLE, - "TRAIT_EASILY_WOUNDED" = TRAIT_EASILY_WOUNDED, "TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED, "TRAIT_NEVER_WOUNDED" = TRAIT_NEVER_WOUNDED, "TRAIT_TOXINLOVER" = TRAIT_TOXINLOVER, @@ -109,7 +107,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_QUICKER_CARRY" = TRAIT_QUICKER_CARRY, "TRAIT_PLANT_SAFE" = TRAIT_PLANT_SAFE, "TRAIT_UNINTELLIGIBLE_SPEECH" = TRAIT_UNINTELLIGIBLE_SPEECH, - "TRAIT_UNSTABLE" = TRAIT_UNSTABLE, "TRAIT_OIL_FRIED" = TRAIT_OIL_FRIED, "TRAIT_MEDICAL_HUD" = TRAIT_MEDICAL_HUD, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, @@ -130,7 +127,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NICE_SHOT" = TRAIT_NICE_SHOT, "TRAIT_TUMOR_SUPPRESSION" = TRAIT_TUMOR_SUPPRESSED, "TRAIT_PERMANENTLY_ONFIRE" = TRAIT_PERMANENTLY_ONFIRE, - "TRAIT_SIGN_LANG" = TRAIT_SIGN_LANG, "TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE" = TRAIT_UNDERWATER_BASKETWEAVING_KNOWLEDGE, "TRAIT_WINE_TASTER" = TRAIT_WINE_TASTER, "TRAIT_BONSAI" = TRAIT_BONSAI, @@ -143,9 +139,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NIGHT_VISION" = TRAIT_NIGHT_VISION, "TRAIT_LIGHT_STEP" = TRAIT_LIGHT_STEP, "TRAIT_SPIRITUAL" = TRAIT_SPIRITUAL, - "TRAIT_CLOWN_ENJOYER" = TRAIT_CLOWN_ENJOYER, - "TRAIT_MIME_FAN" = TRAIT_MIME_FAN, - "TRAIT_VORACIOUS" = TRAIT_VORACIOUS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_FREERUNNING" = TRAIT_FREERUNNING, "TRAIT_SKITTISH" = TRAIT_SKITTISH, @@ -156,10 +149,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_MUSICIAN" = TRAIT_MUSICIAN, "TRAIT_LIGHT_DRINKER" = TRAIT_LIGHT_DRINKER, "TRAIT_SMOKER" = TRAIT_SMOKER, - "TRAIT_EMPATH" = TRAIT_EMPATH, "TRAIT_FRIENDLY" = TRAIT_FRIENDLY, "TRAIT_GRABWEAKNESS" = TRAIT_GRABWEAKNESS, - "TRAIT_SNOB" = TRAIT_SNOB, "TRAIT_BALD" = TRAIT_BALD, "TRAIT_BADTOUCH" = TRAIT_BADTOUCH, "TRAIT_NOBLEED" = TRAIT_NOBLEED, @@ -173,7 +164,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOODSHOT_EYES" = TRAIT_BLOODSHOT_EYES, "TRAIT_SHIFTY_EYES" = TRAIT_SHIFTY_EYES, "TRAIT_CANNOT_BE_UNBUCKLED" = TRAIT_CANNOT_BE_UNBUCKLED, - "TRAIT_GAMER" = TRAIT_GAMER, "TRAIT_VENTCRAWLER_ALWAYS" = TRAIT_VENTCRAWLER_ALWAYS, "TRAIT_VENTCRAWLER_NUDE" = TRAIT_VENTCRAWLER_NUDE ), diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 0329134a9f2d..39c5ee4ff32e 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -145,3 +145,41 @@ else if( !border_only ) // dense, not on border, cannot pass over return FALSE return TRUE + +/atom/proc/MultiZAdjacent(atom/neighbor) + var/turf/T = get_turf(src) + var/turf/N = get_turf(neighbor) + + // Not on valid turfs. + if(QDELETED(src) || QDELETED(neighbor) || !istype(T) || !istype(N)) + return FALSE + + // On the same z-level, we don't need to care about multiz. + if(N.z == T.z) + return Adjacent(neighbor) + + // More than one z-level away from each other. + if(abs(N.x - T.x) > 1 || abs(N.y - T.y) > 1 || abs(N.z - T.z) > 1) + return FALSE + + + // Are they below us? + if(N.z < T.z && HasBelow(T.z)) + var/turf/B = GetBelow(T) + . = isopenspaceturf(T) && neighbor.Adjacent(B) + if(!.) + B = GetAbove(N) + . = isopenspaceturf(B) && src.Adjacent(B) + return + + + // Are they above us? + if(HasAbove(T.z)) + var/turf/A = GetAbove(T) + . = isopenspaceturf(A) && neighbor.Adjacent(A) + if(!.) + A = GetBelow(N) + . = isopenspaceturf(N) && src.Adjacent(A) + return + + return FALSE diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index 94399b1b8c62..b190c04fd94a 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -123,7 +123,7 @@ A.AICtrlShiftClick(src) /mob/living/silicon/ai/ShiftClickOn(atom/A) A.AIShiftClick(src) -/mob/living/silicon/ai/CtrlClickOn(atom/A) +/mob/living/silicon/ai/CtrlClickOn(atom/A, list/params) A.AICtrlClick(src) /mob/living/silicon/ai/AltClickOn(atom/A) A.AIAltClick(src) @@ -151,7 +151,7 @@ return toggle_bolt(usr) - add_hiddenprint(usr) + log_touch(usr) /obj/machinery/door/airlock/AIAltClick() // Eletrifies doors. if(obj_flags & EMAGGED) @@ -167,14 +167,14 @@ return user_toggle_open(usr) - add_hiddenprint(usr) + log_touch(usr) /obj/machinery/door/airlock/AICtrlShiftClick() // Sets/Unsets Emergency Access Override if(obj_flags & EMAGGED) return toggle_emergency(usr) - add_hiddenprint(usr) + log_touch(usr) /* APC */ /obj/machinery/power/apc/AICtrlClick() // turns off/on APCs. @@ -195,7 +195,7 @@ /* Holopads */ /obj/machinery/holopad/AIAltClick(mob/living/silicon/ai/user) hangup_all_calls() - add_hiddenprint(usr) + log_touch(usr) // // Override TurfAdjacent for AltClicking diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 86d5f7efb613..da70ba21ec68 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -28,6 +28,8 @@ adj += effect.nextmove_adjust() next_move = world.time + ((num + adj)*mod) + SEND_SIGNAL(src, COMSIG_LIVING_CHANGENEXT_MOVE, next_move) + /** * Before anything else, defer these calls to a per-mobtype handler. This allows us to * remove istype() spaghetti code, but requires the addition of other handler procs to simplify it. @@ -37,17 +39,18 @@ * * Note that this proc can be overridden, and is in the case of screen objects. */ -/atom/Click(location,control,params) - if(flags_1 & INITIALIZED_1) +/atom/Click(location, control, params) + if(initialized) SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) + usr.ClickOn(src, params) /atom/DblClick(location,control,params) - if(flags_1 & INITIALIZED_1) + if(initialized) usr.DblClickOn(src,params) /atom/MouseWheel(delta_x,delta_y,location,control,params) - if(flags_1 & INITIALIZED_1) + if(initialized) usr.MouseWheelOn(src, delta_x, delta_y, params) /** @@ -80,25 +83,30 @@ if(LAZYACCESS(modifiers, MIDDLE_CLICK)) ShiftMiddleClickOn(A) return + if(LAZYACCESS(modifiers, CTRL_CLICK)) CtrlShiftClickOn(A) return + ShiftClickOn(A) return + if(LAZYACCESS(modifiers, MIDDLE_CLICK)) if(LAZYACCESS(modifiers, CTRL_CLICK)) CtrlMiddleClickOn(A) else MiddleClickOn(A, params) return + if(LAZYACCESS(modifiers, ALT_CLICK)) // alt and alt-gr (rightalt) if(LAZYACCESS(modifiers, RIGHT_CLICK)) alt_click_on_secondary(A) else AltClickOn(A) return + if(LAZYACCESS(modifiers, CTRL_CLICK)) - CtrlClickOn(A) + CtrlClickOn(A, modifiers) return //PARIAH EDIT ADDITION @@ -119,7 +127,7 @@ if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) changeNext_move(CLICK_CD_HANDCUFFED) //Doing shit in cuffs shall be vey slow - UnarmedAttack(A, FALSE, modifiers) + UnarmedAttack(A, Adjacent(A), modifiers) return if(throw_mode) @@ -133,11 +141,10 @@ if(LAZYACCESS(modifiers, RIGHT_CLICK)) W.attack_self_secondary(src, modifiers) update_held_items() - return else W.attack_self(src, modifiers) update_held_items() - return + return //These are always reachable. //User itself, current loc, and user inventory @@ -148,7 +155,7 @@ if(ismob(A)) changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A, FALSE, modifiers) + UnarmedAttack(A, TRUE, modifiers) return //Can't reach anything else in lockers or other weirdness @@ -168,7 +175,7 @@ else if(ismob(A)) changeNext_move(CLICK_CD_MELEE) - UnarmedAttack(A,1,modifiers) + UnarmedAttack(A, TRUE,modifiers) else if(W) if(LAZYACCESS(modifiers, RIGHT_CLICK)) @@ -177,7 +184,7 @@ if(after_attack_secondary_result == SECONDARY_ATTACK_CALL_NORMAL) W.afterattack(A, src, FALSE, params) else - W.afterattack(A,src,0,params) + W.afterattack(A,src, FALSE, params) else if(LAZYACCESS(modifiers, RIGHT_CLICK)) ranged_secondary_attack(A, modifiers) @@ -281,7 +288,10 @@ /** - * Translates into [atom/proc/attack_hand], etc. + * UnarmedAttack: The higest level of mob click chain discounting click itself. + * + * This handles, just "clicking on something" without an item. It translates + * into [atom/proc/attack_hand], [atom/proc/attack_animal] etc. * * Note: proximity_flag here is used to distinguish between normal usage (flag=1), * and usage when clicking on things telekinetically (flag=0). This proc will @@ -343,19 +353,22 @@ /atom/proc/ShiftClick(mob/user) var/flags = SEND_SIGNAL(user, COMSIG_CLICK_SHIFT, src) - if(user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) - user.examinate(src) - return + if(!user.client) + return + if(!((user.client.eye == user) || (user.client.eye == user.loc) || isobserver(user)) && !(flags & COMPONENT_ALLOW_EXAMINATE)) + return + + user.examinate(src) /** * Ctrl click * For most objects, pull */ -/mob/proc/CtrlClickOn(atom/A) - A.CtrlClick(src) +/mob/proc/CtrlClickOn(atom/A, list/params) + A.CtrlClick(src, params) return -/atom/proc/CtrlClick(mob/user) +/atom/proc/CtrlClick(mob/user, list/params) SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user) SEND_SIGNAL(user, COMSIG_MOB_CTRL_CLICKED, src) var/mob/living/ML = user @@ -364,7 +377,7 @@ if(!can_interact(user)) return FALSE -/mob/living/CtrlClick(mob/user) +/mob/living/CtrlClick(mob/user, list/params) if(!isliving(user) || !user.CanReach(src) || user.incapacitated()) return ..() @@ -379,7 +392,7 @@ return ..() -/mob/living/carbon/human/CtrlClick(mob/user) +/mob/living/carbon/human/CtrlClick(mob/user, list/params) if(!ishuman(user) || !user.CanReach(src) || user.incapacitated()) return ..() @@ -388,9 +401,14 @@ return FALSE var/mob/living/carbon/human/human_user = user - if(human_user.dna.species.grab(human_user, src, human_user.mind.martial_art)) + // If they're wielding a grab item, do the normal click chain. + var/obj/item/hand_item/grab/G = user.get_active_held_item() + if(isgrab(G)) + G.current_grab.hit_with_grab(G, src, params) + return TRUE + + if(human_user.dna.species.grab(human_user, src, human_user.mind.martial_art, params)) human_user.changeNext_move(CLICK_CD_MELEE) - human_user.animate_interact(src, INTERACT_GRAB) return TRUE return ..() @@ -513,6 +531,10 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE screen_loc = "CENTER" +/atom/movable/screen/click_catcher/can_usr_use(mob/user) + return TRUE // Owned by a client, not a mob. It's all safe anyways. + + #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. @@ -532,6 +554,10 @@ transform = M /atom/movable/screen/click_catcher/Click(location, control, params) + . = ..() + if(.) + return FALSE + var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, MIDDLE_CLICK) && iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm index 7f12d938471c..fa34074525ec 100644 --- a/code/_onclick/cyborg.dm +++ b/code/_onclick/cyborg.dm @@ -99,7 +99,7 @@ A.BorgCtrlShiftClick(src) /mob/living/silicon/robot/ShiftClickOn(atom/A) A.BorgShiftClick(src) -/mob/living/silicon/robot/CtrlClickOn(atom/A) +/mob/living/silicon/robot/CtrlClickOn(atom/A, list/params) A.BorgCtrlClick(src) /mob/living/silicon/robot/AltClickOn(atom/A) A.BorgAltClick(src) @@ -170,7 +170,7 @@ change attack_robot() above to the proper function */ /mob/living/silicon/robot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return A.attack_robot(src) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index d0d280dc1940..c59c7a8d50cb 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -8,27 +8,95 @@ /atom/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) if(!usr || !over) return + + if(usr.client) + usr.update_mouse_pointer() + if(SEND_SIGNAL(src, COMSIG_MOUSEDROP_ONTO, over, usr) & COMPONENT_NO_MOUSEDROP) //Whatever is receiving will verify themselves for adjacency. return - if(over == src) - return usr.client.Click(src, src_location, src_control, params) - if(!Adjacent(usr) || !over.Adjacent(usr)) + + var/proximity_check = usr.client.check_drag_proximity(src, over, src_location, over_location, src_control, over_control, params) + if(proximity_check) + return proximity_check + + if(!Adjacent(usr) || !over.Adjacent(usr) && !istype(over, /atom/movable/screen)) return // should stop you from dragging through windows - over.MouseDrop_T(src,usr, params) - return + over.MouseDroppedOn(src, usr, params2list(params)) + return TRUE + +/// Handles treating drags as clicks if they're within some conditions +/// Does some other stuff adjacent to trying to figure out what the user actually "wanted" to click +/// Returns TRUE if it caused a click, FALSE otherwise +/client/proc/check_drag_proximity(atom/dragging, atom/over, src_location, over_location, src_control, over_control, params) + // We will swap which thing we're trying to check for clickability based off the type + // Assertion is if you drag a turf to anything else, you really just wanted to click the anything else + // And slightly misseed. I'm not interested in making this game pixel percise, so if it fits our other requirements + // Lets just let that through yeah? + var/atom/attempt_click = dragging + var/atom/click_from = over + var/location_to_use = src_location + var/control_to_use = src_control + if(isturf(attempt_click) && !isturf(over)) + // swapppp + attempt_click = over + click_from = dragging + location_to_use = over_location + control_to_use = over_control + + if(is_drag_clickable(attempt_click, click_from, params)) + Click(attempt_click, location_to_use, control_to_use, params) + return TRUE + return FALSE + +/// Distance in pixels that we consider "acceptable" from the initial click to the release +/// Note: this does not account for the position of the object, just where it is on the screen +#define LENIENCY_DISTANCE 16 +/// Accepted time in seconds between the initial click and drag release +/// Go higher then this and we just don't care anymore +#define LENIENCY_TIME (0.1 SECONDS) + +/// Does the logic for checking if a drag counts as a click or not +/// Returns true if it does, false otherwise +/client/proc/is_drag_clickable(atom/dragging, atom/over, params) + if(dragging == over) + return TRUE + if(world.time - drag_start > LENIENCY_TIME) // Time's up bestie + return FALSE + if(!get_turf(dragging)) // If it isn't in the world, drop it. This is for things that can move, and we assume hud elements will not have this problem + return FALSE + // Basically, are you trying to buckle someone down, or drag them onto you? + // If so, we know you must be right about what you want + if(ismovable(over)) + var/atom/movable/over_movable = over + // The buckle bit will cover most mobs, for stupid reasons. still useful here tho + if(over_movable.can_buckle || over_movable == eye) + return FALSE + + var/list/modifiers = params2list(params) + var/list/old_offsets = screen_loc_to_offset(LAZYACCESS(drag_details, SCREEN_LOC), view) + var/list/new_offsets = screen_loc_to_offset(LAZYACCESS(modifiers, SCREEN_LOC), view) + + var/distance = sqrt(((old_offsets[1] - new_offsets[1]) ** 2) + ((old_offsets[2] - new_offsets[2]) ** 2)) + if(distance > LENIENCY_DISTANCE) + return FALSE + + return TRUE // receive a mousedrop -/atom/proc/MouseDrop_T(atom/dropping, mob/user, params) +/atom/proc/MouseDroppedOn(atom/dropping, mob/user, params) SEND_SIGNAL(src, COMSIG_MOUSEDROPPED_ONTO, dropping, user, params) /client/MouseDown(datum/object, location, control, params) + mouse_down = TRUE + mob.update_mouse_pointer() + if(QDELETED(object)) //Yep, you can click on qdeleted things before they have time to nullspace. Fun. return + SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEDOWN, object, location, control, params) - if(mouse_down_icon) - mouse_pointer_icon = mouse_down_icon + var/delay = mob.CanMobAutoclick(object, location, params) if(delay) selected_target[1] = object @@ -41,10 +109,12 @@ active_mousedown_item.onMouseDown(object, location, params, mob) /client/MouseUp(object, location, control, params) + mouse_down = FALSE + mob.update_mouse_pointer() + if(SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEUP, object, location, control, params) & COMPONENT_CLIENT_MOUSEUP_INTERCEPT) click_intercept_time = world.time - 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) @@ -96,6 +166,9 @@ else middragtime = 0 middle_drag_atom_ref = null + if(!drag_start) // If we're just starting to drag + drag_start = world.time + drag_details = modifiers.Copy() mouseParams = params mouse_location_ref = WEAKREF(over_location) mouse_object_ref = WEAKREF(over_object) @@ -115,3 +188,5 @@ middragtime = 0 middle_drag_atom_ref = null ..() + drag_start = 0 + drag_details = null diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 7562721f6787..23b8918e23cf 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,6 +1,6 @@ +DEFINE_INTERACTABLE(/atom/movable/screen/movable/action_button) /atom/movable/screen/movable/action_button var/datum/action/linked_action - var/datum/hud/our_hud var/actiontooltipstyle = "" screen_loc = null @@ -20,31 +20,30 @@ var/datum/weakref/last_hovored_ref /atom/movable/screen/movable/action_button/Destroy() - if(our_hud) - var/mob/viewer = our_hud.mymob - our_hud.hide_action(src) + if(hud) + var/mob/viewer = hud.mymob + hud.hide_action(src) viewer?.client?.screen -= src - linked_action.viewers -= our_hud + linked_action.viewers -= hud viewer.update_action_buttons() - our_hud = null linked_action = null return ..() -/atom/movable/screen/movable/action_button/proc/can_use(mob/user) +/atom/movable/screen/movable/action_button/can_usr_use(mob/user) + // Observers can only click on action buttons if they're not observing something if(isobserver(user)) - var/mob/dead/observer/dead_mob = user - if(dead_mob.observetarget) // Observers can only click on action buttons if they're not observing something + var/mob/dead/observer/O = user + if(O.observetarget) return FALSE if(linked_action) if(linked_action.viewers[user.hud_used]) return TRUE - return FALSE - - return TRUE + return FALSE /atom/movable/screen/movable/action_button/Click(location,control,params) - if (!can_use(usr)) + . = ..() + if(.) return FALSE var/list/modifiers = params2list(params) @@ -54,6 +53,7 @@ return TRUE if(usr.next_click > world.time) return + usr.next_click = world.time + 1 var/trigger_flags if(LAZYACCESS(modifiers, RIGHT_CLICK)) @@ -65,7 +65,7 @@ // Very much byond logic, but I want nice behavior, so we fake it with drag /atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) . = ..() - if(!can_use(usr)) + if(!can_usr_use(usr)) return if(IS_WEAKREF_OF(over_object, last_hovored_ref)) return @@ -94,7 +94,7 @@ /atom/movable/screen/movable/action_button/MouseDrop(over_object) last_hovored_ref = null - if(!can_use(usr)) + if(!can_usr_use(usr)) return var/datum/hud/our_hud = usr.hud_used if(over_object == src) @@ -122,7 +122,7 @@ save_position() /atom/movable/screen/movable/action_button/proc/save_position() - var/mob/user = our_hud.mymob + var/mob/user = hud.mymob if(!user?.client) return var/position_info = "" @@ -137,14 +137,14 @@ user.client.prefs.action_buttons_screen_locs["[name]_[id]"] = position_info /atom/movable/screen/movable/action_button/proc/load_position() - var/mob/user = our_hud.mymob + var/mob/user = hud.mymob if(!user) return var/position_info = user.client?.prefs?.action_buttons_screen_locs["[name]_[id]"] || SCRN_OBJ_DEFAULT user.hud_used.position_action(src, position_info) /atom/movable/screen/movable/action_button/proc/dump_save() - var/mob/user = our_hud.mymob + var/mob/user = hud.mymob if(!user?.client) return user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" @@ -252,12 +252,12 @@ /atom/movable/screen/button_palette/Destroy() if(our_hud) - our_hud.mymob?.client?.screen -= src + our_hud.mymob?.canon_client?.screen -= src our_hud.toggle_palette = null our_hud = null return ..() -/atom/movable/screen/button_palette/Initialize(mapload) +/atom/movable/screen/button_palette/Initialize(mapload, datum/hud/hud_owner) . = ..() update_appearance() @@ -317,15 +317,10 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, color_timer_id = null remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, to_remove) -/atom/movable/screen/button_palette/proc/can_use(mob/user) - if (isobserver(user)) - var/mob/dead/observer/O = user - return !O.observetarget - return TRUE - /atom/movable/screen/button_palette/Click(location, control, params) - if(!can_use(usr)) - return + . = ..() + if(.) + return FALSE var/list/modifiers = params2list(params) @@ -375,7 +370,8 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, var/scroll_direction = 0 var/datum/hud/our_hud -/atom/movable/screen/palette_scroll/proc/can_use(mob/user) +/atom/movable/screen/palette_scroll/can_usr_use(mob/user) + . = ..() if (isobserver(user)) var/mob/dead/observer/O = user return !O.observetarget @@ -394,8 +390,10 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, icon = settings["bg_icon"] /atom/movable/screen/palette_scroll/Click(location, control, params) - if(!can_use(usr)) - return + . = ..() + if(.) + return FALSE + our_hud.palette_actions.scroll(scroll_direction) /atom/movable/screen/palette_scroll/MouseEntered(location, control, params) @@ -416,7 +414,7 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, /atom/movable/screen/palette_scroll/down/Destroy() if(our_hud) - our_hud.mymob?.client?.screen -= src + our_hud.mymob?.canon_client?.screen -= src our_hud.palette_down = null our_hud = null return ..() @@ -429,7 +427,7 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, /atom/movable/screen/palette_scroll/up/Destroy() if(our_hud) - our_hud.mymob?.client?.screen -= src + our_hud.mymob?.canon_client?.screen -= src our_hud.palette_up = null our_hud = null return ..() @@ -447,7 +445,7 @@ GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6, /atom/movable/screen/action_landing/Destroy() if(owner) owner.landing = null - owner?.owner?.mymob?.client?.screen -= src + owner?.owner?.mymob?.canon_client?.screen -= src owner.refresh_actions() owner = null return ..() diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index fabbdae41ab5..4166347bac91 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -2,6 +2,10 @@ icon = 'icons/hud/screen_ai.dmi' /atom/movable/screen/ai/Click() + . = ..() + if(.) + return FALSE + if(isobserver(usr) || usr.incapacitated()) return TRUE @@ -76,8 +80,7 @@ /atom/movable/screen/ai/crew_manifest/Click() if(..()) return - var/mob/living/silicon/ai/AI = usr - AI.ai_roster() + show_crew_manifest(usr) /atom/movable/screen/ai/alerts name = "Show Alerts" @@ -184,106 +187,89 @@ var/mob/living/silicon/ai/myai = mymob // Language menu - using = new /atom/movable/screen/language_menu + using = new /atom/movable/screen/language_menu(null, src) using.screen_loc = ui_ai_language_menu - using.hud = src static_inventory += using //AI core - using = new /atom/movable/screen/ai/aicore() + using = new /atom/movable/screen/ai/aicore(null, src) using.screen_loc = ui_ai_core - using.hud = src static_inventory += using //Camera list - using = new /atom/movable/screen/ai/camera_list() + using = new /atom/movable/screen/ai/camera_list(null, src) using.screen_loc = ui_ai_camera_list - using.hud = src static_inventory += using //Track - using = new /atom/movable/screen/ai/camera_track() + using = new /atom/movable/screen/ai/camera_track(null, src) using.screen_loc = ui_ai_track_with_camera - using.hud = src static_inventory += using //Camera light - using = new /atom/movable/screen/ai/camera_light() + using = new /atom/movable/screen/ai/camera_light(null, src) using.screen_loc = ui_ai_camera_light - using.hud = src static_inventory += using //Crew Monitoring - using = new /atom/movable/screen/ai/crew_monitor() + using = new /atom/movable/screen/ai/crew_monitor(null, src) using.screen_loc = ui_ai_crew_monitor - using.hud = src static_inventory += using //Crew Manifest - using = new /atom/movable/screen/ai/crew_manifest() + using = new /atom/movable/screen/ai/crew_manifest(null, src) using.screen_loc = ui_ai_crew_manifest - using.hud = src static_inventory += using //Alerts - using = new /atom/movable/screen/ai/alerts() + using = new /atom/movable/screen/ai/alerts(null, src) using.screen_loc = ui_ai_alerts - using.hud = src static_inventory += using //Announcement - using = new /atom/movable/screen/ai/announcement() + using = new /atom/movable/screen/ai/announcement(null, src) using.screen_loc = ui_ai_announcement - using.hud = src static_inventory += using //Shuttle - using = new /atom/movable/screen/ai/call_shuttle() + using = new /atom/movable/screen/ai/call_shuttle(null, src) using.screen_loc = ui_ai_shuttle - using.hud = src static_inventory += using //Laws - using = new /atom/movable/screen/ai/state_laws() + using = new /atom/movable/screen/ai/state_laws(null, src) using.screen_loc = ui_ai_state_laws - using.hud = src static_inventory += using // Modular Interface - using = new /atom/movable/screen/ai/modpc() + using = new /atom/movable/screen/ai/modpc(null, src) using.screen_loc = ui_ai_mod_int - using.hud = src static_inventory += using myai.interfaceButton = using var/atom/movable/screen/ai/modpc/tabletbutton = using tabletbutton.robot = myai //Take image - using = new /atom/movable/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take(null, src) using.screen_loc = ui_ai_take_picture - using.hud = src static_inventory += using //View images - using = new /atom/movable/screen/ai/image_view() + using = new /atom/movable/screen/ai/image_view(null, src) using.screen_loc = ui_ai_view_images - using.hud = src static_inventory += using //Medical/Security sensors - using = new /atom/movable/screen/ai/sensors() + using = new /atom/movable/screen/ai/sensors(null, src) using.screen_loc = ui_ai_sensor - using.hud = src static_inventory += using //Multicamera mode - using = new /atom/movable/screen/ai/multicam() + using = new /atom/movable/screen/ai/multicam(null, src) using.screen_loc = ui_ai_multicam - using.hud = src static_inventory += using //Add multicamera camera - using = new /atom/movable/screen/ai/add_multicam() + using = new /atom/movable/screen/ai/add_multicam(null, src) using.screen_loc = ui_ai_add_multicam - using.hud = src static_inventory += using diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 0c396622d8a1..13072cbfa223 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -17,13 +17,17 @@ if(!category || QDELETED(src)) return + var/datum/weakref/master_ref + if(isdatum(new_master)) + master_ref = WEAKREF(new_master) var/atom/movable/screen/alert/thealert if(alerts[category]) thealert = alerts[category] if(thealert.override_alerts) return thealert - if(new_master && new_master != thealert.master) - WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [thealert.master]") + if(master_ref && thealert.master_ref && master_ref != thealert.master_ref) + var/datum/current_master = thealert.master_ref.resolve() + WARNING("[src] threw alert [category] with new_master [new_master] while already having that alert with master [current_master]") clear_alert(category) return .() @@ -52,7 +56,7 @@ new_master.layer = old_layer new_master.plane = old_plane thealert.icon_state = "template" // We'll set the icon to the client's ui pref in reorganize_alerts() - thealert.master = new_master + thealert.master_ref = master_ref else thealert.icon_state = "[initial(thealert.icon_state)][severity]" thealert.severity = severity @@ -60,8 +64,9 @@ alerts[category] = thealert if(client && hud_used) hud_used.reorganize_alerts() - thealert.transform = matrix(32, 6, MATRIX_TRANSLATE) - animate(thealert, transform = matrix(), time = 2.5, easing = CUBIC_EASING) + + thealert.transform = matrix(32, 0, MATRIX_TRANSLATE) + animate(thealert, transform = matrix(), time = 1 SECONDS, easing = ELASTIC_EASING) if(thealert.timeout) addtimer(CALLBACK(src, PROC_REF(alert_timeout), thealert, category), thealert.timeout) @@ -105,6 +110,8 @@ /// Boolean. If TRUE, the Click() proc will attempt to Click() on the master first if there is a master. var/click_master = TRUE +/atom/movable/screen/alert/can_usr_use(mob/user) + return owner == usr /atom/movable/screen/alert/MouseEntered(location,control,params) . = ..() @@ -113,6 +120,7 @@ /atom/movable/screen/alert/MouseExited() + . = ..() closeToolTip(usr) @@ -303,6 +311,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/mob/living/carbon/offerer var/obj/item/receiving +/atom/movable/screen/alert/give/Destroy() + offerer = null + receiving = null + return ..() + /** * Handles assigning most of the variables for the alert that pops up when an item is offered * @@ -374,8 +387,6 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." to_chat(rube, span_userdanger("[all_caps_for_emphasis]")) playsound(offerer, 'sound/weapons/thudswoosh.ogg', 100, TRUE, 1) rube.Knockdown(1 SECONDS) - SEND_SIGNAL(offerer, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/down_low) - SEND_SIGNAL(rube, COMSIG_ADD_MOOD_EVENT, "high_five", /datum/mood_event/too_slow) qdel(src) /// If someone examine_more's the offerer while they're trying to pull a too-slow, it'll tip them off to the offerer's trickster ways @@ -410,7 +421,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/mob/living/living_owner = owner var/last_whisper = tgui_input_text(usr, "Do you have any last words?", "Final Words") - if (!last_whisper || !CAN_SUCCUMB(living_owner)) + if (!last_whisper) return if (length(last_whisper)) @@ -713,13 +724,13 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //GHOSTS //TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages -/atom/movable/screen/alert/notify_cloning +/atom/movable/screen/alert/notify_revival name = "Revival" desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" icon_state = "template" timeout = 300 -/atom/movable/screen/alert/notify_cloning/Click() +/atom/movable/screen/alert/notify_revival/Click() . = ..() if(!.) return @@ -730,15 +741,16 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." name = "Body created" desc = "A body was created. You can enter it." icon_state = "template" - timeout = 300 - var/atom/target = null + timeout = 30 SECONDS + /// Weakref to the target atom to use the action on + var/datum/weakref/target_ref + /// Which on click action to use var/action = NOTIFY_JUMP /atom/movable/screen/alert/notify_action/Click() . = ..() - if(!.) - return - if(!target) + var/atom/target = target_ref?.resolve() + if(isnull(target)) return var/mob/dead/observer/ghost_owner = owner if(!istype(ghost_owner)) @@ -793,9 +805,11 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(!living_owner.can_resist()) return - living_owner.changeNext_move(CLICK_CD_RESIST) + if(living_owner.last_special <= world.time) - return living_owner.resist_buckle() + . = living_owner.resist_buckle() + if(!.) + living_owner.changeNext_move(CLICK_CD_RESIST) /atom/movable/screen/alert/shoes/untied name = "Untied Shoes" @@ -862,22 +876,25 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." return 1 /atom/movable/screen/alert/Click(location, control, params) - if(!usr || !usr.client) + . = ..() + if(.) return FALSE + if(usr != owner) return FALSE var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, SHIFT_CLICK)) // screen objects don't do the normal Click() stuff so we'll cheat to_chat(usr, span_boldnotice("[name] - [desc]")) return FALSE - if(master && click_master) - return usr.client.Click(master, location, control, params) + var/datum/our_master = master_ref?.resolve() + if(our_master && click_master) + return usr.client.Click(our_master, location, control, params) return TRUE /atom/movable/screen/alert/Destroy() - . = ..() severity = 0 - master = null + master_ref = null owner = null screen_loc = "" + return ..() diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index ee521cf2025a..165f6bfcb23d 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -6,9 +6,11 @@ icon_state = "leap_off" /atom/movable/screen/alien/leap/Click() - if(isalienhunter(usr)) - var/mob/living/carbon/alien/humanoid/hunter/AH = usr - AH.toggle_leap() + . = ..() + if(.) + return FALSE + var/mob/living/carbon/alien/humanoid/hunter/AH = hud.mymob + AH.toggle_leap() /atom/movable/screen/alien/plasma_display name = "plasma stored" @@ -36,90 +38,76 @@ //begin buttons - using = new /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) 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 /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) - using.hud = src static_inventory += using - action_intent = new /atom/movable/screen/combattoggle/flashy() - action_intent.hud = src + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent if(isalienhunter(mymob)) var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /atom/movable/screen/alien/leap() + H.leap_icon = new /atom/movable/screen/alien/leap(null, src) H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon - using = new/atom/movable/screen/language_menu + using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_alien_language_menu - using.hud = src static_inventory += using - using = new /atom/movable/screen/navigate + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu - using.hud = src static_inventory += using - using = new /atom/movable/screen/drop() + using = new /atom/movable/screen/drop(null, src) using.icon = ui_style using.screen_loc = ui_drop_throw - using.hud = src static_inventory += using - using = new /atom/movable/screen/resist() + using = new /atom/movable/screen/resist(null, src) using.icon = ui_style using.screen_loc = ui_above_movement - using.hud = src hotkeybuttons += using - throw_icon = new /atom/movable/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch(null, src) throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw - throw_icon.hud = src hotkeybuttons += throw_icon - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.update_appearance() pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src static_inventory += pull_icon //begin indicators - healths = new /atom/movable/screen/healths/alien() - healths.hud = src + healths = new /atom/movable/screen/healths/alien(null, src) infodisplay += healths - alien_plasma_display = new /atom/movable/screen/alien/plasma_display() - alien_plasma_display.hud = src + alien_plasma_display = new /atom/movable/screen/alien/plasma_display(null, src) infodisplay += alien_plasma_display if(!isalienqueen(mymob)) - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder - alien_queen_finder.hud = src + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder(null, src) infodisplay += alien_queen_finder - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src + zone_select = new /atom/movable/screen/zone_sel/alien(null, src) zone_select.update_appearance() static_inventory += zone_select for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) - inv.hud = src inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_appearance() diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 434d1cb5b2ea..7d3b50da0c75 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -5,38 +5,31 @@ ..() var/atom/movable/screen/using - action_intent = new /atom/movable/screen/combattoggle/flashy() - action_intent.hud = src + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - healths = new /atom/movable/screen/healths/alien() - healths.hud = src + healths = new /atom/movable/screen/healths/alien(null, src) infodisplay += healths - alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() - alien_queen_finder.hud = src + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder(null, src) infodisplay += alien_queen_finder - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = 'icons/hud/screen_alien.dmi' pull_icon.update_appearance() pull_icon.screen_loc = ui_above_movement - pull_icon.hud = src hotkeybuttons += pull_icon - using = new/atom/movable/screen/language_menu + using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_alien_language_menu - using.hud = src static_inventory += using - using = new /atom/movable/screen/navigate + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_alien_navigate_menu - using.hud = src static_inventory += using - zone_select = new /atom/movable/screen/zone_sel/alien() - zone_select.hud = src + zone_select = new /atom/movable/screen/zone_sel/alien(null, src) zone_select.update_appearance() static_inventory += zone_select diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index a157e2157b80..e77c38b7a977 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -7,6 +7,7 @@ openToolTip(usr,src,params,title = name,content = desc, theme = "blob") /atom/movable/screen/blob/MouseExited() + . = ..() closeToolTip(usr) /atom/movable/screen/blob/blob_help @@ -15,9 +16,11 @@ desc = "Help on playing blob!" /atom/movable/screen/blob/blob_help/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.blob_help() + . = ..() + if(.) + return FALSE + var/mob/camera/blob/B = hud.mymob + B.blob_help() /atom/movable/screen/blob/jump_to_node icon_state = "ui_tonode" @@ -25,9 +28,11 @@ desc = "Moves your camera to a selected blob node." /atom/movable/screen/blob/jump_to_node/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.jump_to_node() + . = ..() + if(.) + return FALSE + var/mob/camera/blob/B = hud.mymob + B.jump_to_node() /atom/movable/screen/blob/jump_to_core icon_state = "ui_tocore" @@ -46,11 +51,14 @@ return ..() /atom/movable/screen/blob/jump_to_core/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - if(!B.placed) - B.place_blob_core(BLOB_NORMAL_PLACEMENT) - B.transport_core() + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + if(!B.placed) + B.place_blob_core(BLOB_NORMAL_PLACEMENT) + B.transport_core() /atom/movable/screen/blob/blobbernaut icon_state = "ui_blobbernaut" @@ -64,9 +72,12 @@ desc = "Produces a strong, smart blobbernaut from a factory blob for [BLOBMOB_BLOBBERNAUT_RESOURCE_COST] resources.
The factory blob used will become fragile and unable to produce spores." /atom/movable/screen/blob/blobbernaut/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.create_blobbernaut() + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.create_blobbernaut() /atom/movable/screen/blob/resource_blob icon_state = "ui_resource" @@ -80,9 +91,12 @@ desc = "Produces a resource blob for [BLOB_STRUCTURE_RESOURCE_COST] resources.
Resource blobs will give you resources every few seconds." /atom/movable/screen/blob/resource_blob/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.createSpecial(BLOB_STRUCTURE_RESOURCE_COST, /obj/structure/blob/special/resource, BLOB_RESOURCE_MIN_DISTANCE, TRUE) + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.createSpecial(BLOB_STRUCTURE_RESOURCE_COST, /obj/structure/blob/special/resource, BLOB_RESOURCE_MIN_DISTANCE, TRUE) /atom/movable/screen/blob/node_blob icon_state = "ui_node" @@ -96,9 +110,12 @@ desc = "Produces a node blob for [BLOB_STRUCTURE_NODE_COST] resources.
Node blobs will expand and activate nearby resource and factory blobs." /atom/movable/screen/blob/node_blob/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.createSpecial(BLOB_STRUCTURE_NODE_COST, /obj/structure/blob/special/node, BLOB_NODE_MIN_DISTANCE, FALSE) + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.createSpecial(BLOB_STRUCTURE_NODE_COST, /obj/structure/blob/special/node, BLOB_NODE_MIN_DISTANCE, FALSE) /atom/movable/screen/blob/factory_blob icon_state = "ui_factory" @@ -112,9 +129,12 @@ desc = "Produces a factory blob for [BLOB_STRUCTURE_FACTORY_COST] resources.
Factory blobs will produce spores every few seconds." /atom/movable/screen/blob/factory_blob/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.createSpecial(BLOB_STRUCTURE_FACTORY_COST, /obj/structure/blob/special/factory, BLOB_FACTORY_MIN_DISTANCE, TRUE) + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.createSpecial(BLOB_STRUCTURE_FACTORY_COST, /obj/structure/blob/special/factory, BLOB_FACTORY_MIN_DISTANCE, TRUE) /atom/movable/screen/blob/readapt_strain icon_state = "ui_chemswap" @@ -134,9 +154,12 @@ return ..() /atom/movable/screen/blob/readapt_strain/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.strain_reroll() + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.strain_reroll() /atom/movable/screen/blob/relocate_core icon_state = "ui_swap" @@ -150,68 +173,60 @@ desc = "Swaps a node and your core for [BLOB_POWER_RELOCATE_COST] resources." /atom/movable/screen/blob/relocate_core/Click() - if(isovermind(usr)) - var/mob/camera/blob/B = usr - B.relocate_core() + . = ..() + if(.) + return FALSE + + var/mob/camera/blob/B = hud.mymob + B.relocate_core() /datum/hud/blob_overmind/New(mob/owner) ..() var/atom/movable/screen/using - blobpwrdisplay = new /atom/movable/screen() + blobpwrdisplay = new /atom/movable/screen(null, src) blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT blobpwrdisplay.plane = ABOVE_HUD_PLANE - blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /atom/movable/screen/healths/blob() - healths.hud = src + healths = new /atom/movable/screen/healths/blob(null, src) infodisplay += healths - using = new /atom/movable/screen/blob/blob_help() + using = new /atom/movable/screen/blob/blob_help(null, src) using.screen_loc = "WEST:6,NORTH:-3" - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/jump_to_node() + using = new /atom/movable/screen/blob/jump_to_node(null, src) using.screen_loc = ui_inventory - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/jump_to_core() + using = new /atom/movable/screen/blob/jump_to_core(null, src) using.screen_loc = ui_zonesel - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/blobbernaut() + using = new /atom/movable/screen/blob/blobbernaut(null, src) using.screen_loc = ui_belt - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/resource_blob() + using = new /atom/movable/screen/blob/resource_blob(null, src) using.screen_loc = ui_back - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/node_blob() + using = new /atom/movable/screen/blob/node_blob(null, src) using.screen_loc = ui_hand_position(2) - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/factory_blob() + using = new /atom/movable/screen/blob/factory_blob(null, src) using.screen_loc = ui_hand_position(1) - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/readapt_strain() + using = new /atom/movable/screen/blob/readapt_strain(null, src) using.screen_loc = ui_storage1 - using.hud = src static_inventory += using - using = new /atom/movable/screen/blob/relocate_core() + using = new /atom/movable/screen/blob/relocate_core(null, src) using.screen_loc = ui_storage2 - using.hud = src static_inventory += using diff --git a/code/_onclick/hud/blobbernaut.dm b/code/_onclick/hud/blobbernaut.dm index d8531516d41e..59c12a5aa0fa 100644 --- a/code/_onclick/hud/blobbernaut.dm +++ b/code/_onclick/hud/blobbernaut.dm @@ -1,6 +1,5 @@ /datum/hud/living/blobbernaut/New(mob/living/owner) . = ..() - blobpwrdisplay = new /atom/movable/screen/healths/blob/overmind() - blobpwrdisplay.hud = src + blobpwrdisplay = new /atom/movable/screen/healths/blob/overmind(null, src) infodisplay += blobpwrdisplay diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index 61c006ac6fe5..1cb8ade6311e 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -2,29 +2,26 @@ ..() var/atom/movable/screen/inventory/inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) 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 = ITEM_SLOT_DEX_STORAGE - inv_box.hud = src static_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) 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 = ITEM_SLOT_HEAD - inv_box.hud = src static_inventory += inv_box for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) - inv.hud = src inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_appearance() diff --git a/code/_onclick/hud/families.dm b/code/_onclick/hud/families.dm index b89ff0617502..48f53efa090d 100644 --- a/code/_onclick/hud/families.dm +++ b/code/_onclick/hud/families.dm @@ -19,6 +19,7 @@ openToolTip(usr,src,params,title = name,content = desc, theme = "alerttooltipstyle") /atom/movable/screen/wanted/MouseExited() + . = ..() closeToolTip(usr) /atom/movable/screen/wanted/update_icon_state() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 816e8b1ca92c..7aa2dd1780ef 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -112,6 +112,11 @@ layer = BLIND_LAYER plane = FULLSCREEN_PLANE +/atom/movable/screen/fullscreen/blind/blinder + icon_state = "blackerimageoverlay" + layer = BLIND_LAYER + 0.01 + plane = FULLSCREEN_PLANE + /atom/movable/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER @@ -201,6 +206,7 @@ plane = LIGHTING_PLANE blend_mode = BLEND_ADD show_when_dead = TRUE + alpha = 64 //Spooky darkness /atom/movable/screen/fullscreen/bluespace_overlay icon = 'icons/effects/effects.dmi' diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index 9358ef183847..2862b0b9f704 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -3,61 +3,69 @@ ..() var/atom/movable/screen/using - using = new /atom/movable/screen/drop() + using = new /atom/movable/screen/drop(null, src) using.icon = ui_style using.screen_loc = ui_drone_drop - using.hud = src static_inventory += using - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.update_appearance() pull_icon.screen_loc = ui_drone_pull - pull_icon.hud = src static_inventory += pull_icon build_hand_slots() - using = new /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) 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 /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) - using.hud = src static_inventory += using - action_intent = new /atom/movable/screen/combattoggle/flashy() - action_intent.hud = src + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - zone_select = new /atom/movable/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel(null, src) zone_select.icon = ui_style - zone_select.hud = src zone_select.update_appearance() static_inventory += zone_select - using = new /atom/movable/screen/area_creator + using = new /atom/movable/screen/area_creator(null, src) using.icon = ui_style - using.hud = src static_inventory += using - mymob.client.screen = list() + mymob.canon_client.screen = list() for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) - inv.hud = src inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_appearance() + gun_setting_icon = new /atom/movable/screen/gun_mode(null, src) + gun_setting_icon.icon = ui_style + + var/atom/movable/screen/gun_option = new /atom/movable/screen/gun_radio(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + gun_option = new /atom/movable/screen/gun_item(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + gun_option = new /atom/movable/screen/gun_move(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + /datum/hud/dextrous/persistent_inventory_update() if(!mymob) return diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index eeb8dccb933d..c733ab9a3a01 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -1,5 +1,6 @@ /atom/movable/screen/ghost icon = 'icons/hud/screen_ghost.dmi' + private_screen = FALSE /atom/movable/screen/ghost/MouseEntered(location, control, params) . = ..() @@ -10,6 +11,9 @@ icon_state = "spawners" /atom/movable/screen/ghost/spawners_menu/Click() + . = ..() + if(.) + return FALSE var/mob/dead/observer/observer = usr observer.open_spawners_menu() @@ -18,6 +22,9 @@ icon_state = "orbit" /atom/movable/screen/ghost/orbit/Click() + . = ..() + if(.) + return FALSE var/mob/dead/observer/G = usr G.follow() @@ -26,6 +33,9 @@ icon_state = "reenter_corpse" /atom/movable/screen/ghost/reenter_corpse/Click() + . = ..() + if(.) + return FALSE var/mob/dead/observer/G = usr G.reenter_corpse() @@ -34,6 +44,10 @@ icon_state = "teleport" /atom/movable/screen/ghost/teleport/Click() + . = ..() + if(.) + return FALSE + var/mob/dead/observer/G = usr G.dead_tele() @@ -42,55 +56,57 @@ icon_state = "pai" /atom/movable/screen/ghost/pai/Click() + . = ..() + if(.) + return FALSE + var/mob/dead/observer/G = usr G.register_pai() /atom/movable/screen/ghost/minigames_menu name ="Minigames" icon_state = "minigames" - + /atom/movable/screen/ghost/minigames_menu/Click() + . = ..() + if(.) + return FALSE + var/mob/dead/observer/observer = usr observer.open_minigames_menu() /datum/hud/ghost/New(mob/owner) ..() + var/atom/movable/screen/using - using = new /atom/movable/screen/ghost/spawners_menu() + using = new /atom/movable/screen/ghost/spawners_menu(null, src) using.screen_loc = ui_ghost_spawners_menu - using.hud = src static_inventory += using - using = new /atom/movable/screen/ghost/orbit() + using = new /atom/movable/screen/ghost/orbit(null, src) using.screen_loc = ui_ghost_orbit - using.hud = src static_inventory += using - using = new /atom/movable/screen/ghost/reenter_corpse() + using = new /atom/movable/screen/ghost/reenter_corpse(null, src) using.screen_loc = ui_ghost_reenter_corpse - using.hud = src static_inventory += using - using = new /atom/movable/screen/ghost/teleport() + using = new /atom/movable/screen/ghost/teleport(null, src) using.screen_loc = ui_ghost_teleport - using.hud = src static_inventory += using - using = new /atom/movable/screen/ghost/pai() + using = new /atom/movable/screen/ghost/pai(null, src) using.screen_loc = ui_ghost_pai - using.hud = src static_inventory += using - using = new /atom/movable/screen/ghost/minigames_menu() + using = new /atom/movable/screen/ghost/minigames_menu(null, src) using.screen_loc = ui_ghost_minigames - using.hud = src static_inventory += using - using = new /atom/movable/screen/language_menu + using = new /atom/movable/screen/language_menu(null, src) using.screen_loc = ui_ghost_language_menu using.icon = ui_style - using.hud = src static_inventory += using /datum/hud/ghost/show_hud(version = 0, mob/viewmob) diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index e5fbab5ddefa..5db5aa3f1fbc 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -5,40 +5,33 @@ ..() var/atom/movable/screen/using - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.update_appearance() pull_icon.screen_loc = ui_living_pull - pull_icon.hud = src static_inventory += pull_icon - healths = new /atom/movable/screen/healths/guardian() - healths.hud = src + healths = new /atom/movable/screen/healths/guardian(null, src) infodisplay += healths - using = new /atom/movable/screen/guardian/manifest() + using = new /atom/movable/screen/guardian/manifest(null, src) using.screen_loc = ui_hand_position(2) - using.hud = src static_inventory += using - using = new /atom/movable/screen/guardian/recall() + using = new /atom/movable/screen/guardian/recall(null, src) using.screen_loc = ui_hand_position(1) - using.hud = src static_inventory += using - using = new owner.toggle_button_type() + using = new owner.toggle_button_type(null, src) using.screen_loc = ui_storage1 - using.hud = src static_inventory += using - using = new /atom/movable/screen/guardian/toggle_light() + using = new /atom/movable/screen/guardian/toggle_light(null, src) using.screen_loc = ui_inventory - using.hud = src static_inventory += using - using = new /atom/movable/screen/guardian/communicate() + using = new /atom/movable/screen/guardian/communicate(null, src) using.screen_loc = ui_back - using.hud = src static_inventory += using /datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian @@ -47,56 +40,47 @@ if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) var/atom/movable/screen/inventory/inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) 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 = ITEM_SLOT_DEX_STORAGE - inv_box.hud = src static_inventory += inv_box - using = new /atom/movable/screen/guardian/communicate() + using = new /atom/movable/screen/guardian/communicate(null, src) using.screen_loc = ui_sstore1 - using.hud = src static_inventory += using else - using = new /atom/movable/screen/guardian/communicate() + using = new /atom/movable/screen/guardian/communicate(null, src) using.screen_loc = ui_id - using.hud = src static_inventory += using - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = 'icons/hud/guardian.dmi' pull_icon.update_appearance() pull_icon.screen_loc = ui_living_pull - pull_icon.hud = src static_inventory += pull_icon - healths = new /atom/movable/screen/healths/guardian() - healths.hud = src + healths = new /atom/movable/screen/healths/guardian(null, src) infodisplay += healths - using = new /atom/movable/screen/guardian/manifest() + using = new /atom/movable/screen/guardian/manifest(null, src) using.screen_loc = ui_belt - using.hud = src static_inventory += using - using = new /atom/movable/screen/guardian/recall() + using = new /atom/movable/screen/guardian/recall(null, src) using.screen_loc = ui_back - using.hud = src static_inventory += using - using = new owner.toggle_button_type() + using = new owner.toggle_button_type(null, src) using.screen_loc = ui_storage2 - using.hud = src static_inventory += using - using = new /atom/movable/screen/guardian/toggle_light() + using = new /atom/movable/screen/guardian/toggle_light(null, src) using.screen_loc = ui_inventory - using.hud = src static_inventory += using /datum/hud/dextrous/guardian/persistent_inventory_update() @@ -124,9 +108,12 @@ desc = "Spring forth into battle!" /atom/movable/screen/guardian/manifest/Click() - if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/G = usr - G.Manifest() + . = ..() + if(.) + return FALSE + + var/mob/living/simple_animal/hostile/guardian/G = hud.mymob + G.Manifest() /atom/movable/screen/guardian/recall @@ -135,9 +122,11 @@ desc = "Return to your user." /atom/movable/screen/guardian/recall/Click() - if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/G = usr - G.Recall() + . = ..() + if(.) + return FALSE + var/mob/living/simple_animal/hostile/guardian/G = hud.mymob + G.Recall() /atom/movable/screen/guardian/toggle_mode icon_state = "toggle" @@ -145,9 +134,12 @@ desc = "Switch between ability modes." /atom/movable/screen/guardian/toggle_mode/Click() - if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/G = usr - G.ToggleMode() + . = ..() + if(.) + return FALSE + + var/mob/living/simple_animal/hostile/guardian/G = hud.mymob + G.ToggleMode() /atom/movable/screen/guardian/toggle_mode/inactive icon_state = "notoggle" //greyed out so it doesn't look like it'll work @@ -163,9 +155,11 @@ desc = "Communicate telepathically with your user." /atom/movable/screen/guardian/communicate/Click() - if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/G = usr - G.Communicate() + . = ..() + if(.) + return FALSE + var/mob/living/simple_animal/hostile/guardian/G = hud.mymob + G.Communicate() /atom/movable/screen/guardian/toggle_light @@ -174,6 +168,9 @@ desc = "Glow like star dust." /atom/movable/screen/guardian/toggle_light/Click() - if(isguardian(usr)) - var/mob/living/simple_animal/hostile/guardian/G = usr - G.ToggleLight() + . = ..() + if(.) + return FALSE + + var/mob/living/simple_animal/hostile/guardian/G = hud.mymob + G.ToggleLight() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index a86cd4bed657..8947062026b0 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -40,6 +40,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/throw_icon var/atom/movable/screen/module_store_icon + // On my way to double the amount of non-inventory hud elements for gunpoint-ing. + var/atom/movable/screen/gun_setting_icon + var/list/atom/movable/screen/gunpoint_options = list() + 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/atom/movable/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys @@ -80,6 +84,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/healthdoll var/atom/movable/screen/wanted/wanted_lvl var/atom/movable/screen/spacesuit + + var/atom/movable/screen/pain/pain + + var/atom/movable/screen/holomap/holomap_container + var/atom/movable/screen/progbar_container/use_timer + var/atom/movable/screen/vis_holder/vis_holder // subtypes can override this to force a specific UI style var/ui_style @@ -100,7 +110,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() for(var/mytype in subtypesof(/atom/movable/screen/plane_master)- /atom/movable/screen/plane_master/rendering_plate) - var/atom/movable/screen/plane_master/instance = new mytype() + var/atom/movable/screen/plane_master/instance = new mytype(null, src) plane_masters["[instance.plane]"] = instance instance.backdrop(mymob) @@ -116,10 +126,18 @@ GLOBAL_LIST_INIT(available_ui_styles, list( owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) + holomap_container = new(null, src) + vis_holder = new(null, src) + + RegisterSignal(mymob, COMSIG_VIEWDATA_UPDATE, PROC_REF(on_viewdata_update)) + + /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null + QDEL_LIST_ASSOC_VAL(hand_slots) + QDEL_NULL(rest_icon) QDEL_NULL(toggle_palette) QDEL_NULL(palette_down) QDEL_NULL(palette_up) @@ -130,15 +148,20 @@ GLOBAL_LIST_INIT(available_ui_styles, list( QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) + QDEL_NULL(gun_setting_icon) + QDEL_LIST(gunpoint_options) + inv_slots.Cut() action_intent = null zone_select = null pull_icon = null + gun_setting_icon = null QDEL_LIST(toggleable_inventory) QDEL_LIST(hotkeybuttons) throw_icon = null QDEL_LIST(infodisplay) + QDEL_NULL(vis_holder) healths = null stamina = null @@ -156,9 +179,17 @@ GLOBAL_LIST_INIT(available_ui_styles, list( mymob = null QDEL_NULL(screentip_text) + QDEL_NULL(pain) + QDEL_NULL(use_timer) + QDEL_NULL(holomap_container) return ..() +/datum/hud/proc/on_viewdata_update(datum/source, view) + SIGNAL_HANDLER + + view_audit_buttons() + /mob/proc/create_mob_hud() if(!client || hud_used) return @@ -237,7 +268,17 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(infodisplay.len) screenmob.client.screen -= infodisplay + if(pain) + screenmob.client.screen += pain + + if(holomap_container) + screenmob.client.screen += holomap_container + + if(vis_holder) + screenmob.client.screen += vis_holder + hud_version = display_hud_version + update_gunpoint(screenmob) persistent_inventory_update(screenmob) screenmob.update_action_buttons(1) reorganize_alerts(screenmob) @@ -251,6 +292,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( show_hud(hud_version, M) else if (viewmob.hud_used) viewmob.hud_used.plane_masters_update() + viewmob.show_other_mob_action_buttons(mymob) return TRUE @@ -259,7 +301,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( for(var/thing in plane_masters) var/atom/movable/screen/plane_master/PM = plane_masters[thing] PM.backdrop(mymob) - mymob.client.screen += PM + mymob.canon_client.screen += PM /datum/hud/human/show_hud(version = 0,mob/viewmob) . = ..() @@ -281,12 +323,29 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(!mymob) return +/datum/hud/proc/update_gunpoint(mob/screenmob) + var/mob/living/L = mymob + if(!istype(screenmob) || !istype(L)) + return + if(!mymob.hud_used.gun_setting_icon) + return + + screenmob.client.screen -= gun_setting_icon + screenmob.client.screen -= gunpoint_options + if(hud_version != HUD_STYLE_STANDARD) + return + + screenmob.client.screen += gun_setting_icon + if(L.use_gunpoint || screenmob != L) + screenmob.client.screen += gunpoint_options + + /datum/hud/proc/update_ui_style(new_ui_style) // do nothing if overridden by a subtype or already on that style if (initial(ui_style) || ui_style == new_ui_style) return - for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) + for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots + gunpoint_options + gun_setting_icon) if (item.icon == ui_style) item.icon = new_ui_style @@ -316,14 +375,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /atom/movable/screen/inventory/hand() + hand_box = new /atom/movable/screen/inventory/hand(null, src) 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)]" hand_box.screen_loc = ui_hand_position(i) hand_box.held_index = i hand_slots["[i]"] = hand_box - hand_box.hud = src static_inventory += hand_box hand_box.update_appearance() @@ -377,7 +435,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( palette_actions.insert_action(button, palette_actions.index_of(relative_to)) if(SCRN_OBJ_FLOATING) // If we don't have it as a define, this is a screen_loc, and we should be floating floating_actions += button - var/client/our_client = mymob.client + var/client/our_client = mymob.canon_client if(!our_client) position_action(button, button.linked_action.default_button_position) return @@ -418,13 +476,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /// Ensures all of our buttons are properly within the bounds of our client's view, moves them if they're not /datum/hud/proc/view_audit_buttons() - var/our_view = mymob?.client?.view + var/our_view = mymob?.canon_client?.view if(!our_view) return listed_actions.check_against_view() palette_actions.check_against_view() for(var/atom/movable/screen/movable/action_button/floating_button as anything in floating_actions) - var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc) + var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc, our_view) // We set the view arg here, so the output will be properly hemm'd in by our new view floating_button.screen_loc = offset_to_screen_loc(current_offsets[1], current_offsets[2], view = our_view) @@ -534,7 +592,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-[pixel_north_offset]" /datum/action_group/proc/check_against_view() - var/owner_view = owner?.mymob?.client?.view + var/owner_view = owner?.mymob?.canon_client?.view if(!owner_view) return // Unlikey as it is, we may have been changed. Want to start from our target position and fail down diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 1d765066a86b..f65045638ddd 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -5,7 +5,12 @@ name = "toggle" icon_state = "toggle" + private_screen = FALSE // We handle cases where usr != owner. + /atom/movable/screen/human/toggle/Click() + . = ..() + if(.) + return FALSE var/mob/targetmob = usr @@ -28,8 +33,12 @@ icon_state = "act_equip" /atom/movable/screen/human/equip/Click() + . = ..() + if(.) + return FALSE if(ismecha(usr.loc)) // stops inventory actions in a mech return TRUE + var/mob/living/carbon/human/H = usr H.quick_equip() @@ -47,9 +56,11 @@ invisibility = INVISIBILITY_ABSTRACT /atom/movable/screen/ling/sting/Click() - if(isobserver(usr)) - return - var/mob/living/carbon/carbon_user = usr + . = ..() + if(.) + return FALSE + + var/mob/living/carbon/carbon_user = hud.mymob carbon_user.unset_sting() /datum/hud/human/New(mob/living/carbon/human/owner) @@ -58,259 +69,243 @@ var/atom/movable/screen/using var/atom/movable/screen/inventory/inv_box - using = new/atom/movable/screen/language_menu + using = new/atom/movable/screen/language_menu(null, src) using.icon = ui_style - using.hud = src static_inventory += using - using = new/atom/movable/screen/navigate + using = new/atom/movable/screen/navigate(null, src) using.icon = ui_style - using.hud = src static_inventory += using - using = new /atom/movable/screen/area_creator + using = new /atom/movable/screen/area_creator(null, src) using.icon = ui_style - using.hud = src static_inventory += using - action_intent = new /atom/movable/screen/combattoggle/flashy() - action_intent.hud = src + action_intent = new /atom/movable/screen/combattoggle/flashy(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent - using = new /atom/movable/screen/mov_intent + using = new /atom/movable/screen/mov_intent(null, src) using.icon = ui_style using.icon_state = (mymob.m_intent == MOVE_INTENT_WALK ? "walking" : "running") using.screen_loc = ui_movi - using.hud = src static_inventory += using - using = new /atom/movable/screen/drop() + using = new /atom/movable/screen/drop(null, src) using.icon = ui_style using.screen_loc = ui_drop_throw - using.hud = src static_inventory += using - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "i_clothing" inv_box.icon = ui_style 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 /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "o_clothing" inv_box.icon = ui_style inv_box.slot_id = ITEM_SLOT_OCLOTHING inv_box.icon_state = "suit" inv_box.screen_loc = ui_oclothing - inv_box.hud = src toggleable_inventory += inv_box build_hand_slots() - using = new /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) 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 /atom/movable/screen/swap_hand() + using = new /atom/movable/screen/swap_hand(null, src) 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 /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" inv_box.screen_loc = ui_id inv_box.slot_id = ITEM_SLOT_ID - inv_box.hud = src static_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" inv_box.screen_loc = ui_mask inv_box.slot_id = ITEM_SLOT_MASK - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" inv_box.screen_loc = ui_neck inv_box.slot_id = ITEM_SLOT_NECK - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" inv_box.screen_loc = ui_back inv_box.slot_id = ITEM_SLOT_BACK - inv_box.hud = src static_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage1 inv_box.slot_id = ITEM_SLOT_LPOCKET - inv_box.hud = src static_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" inv_box.screen_loc = ui_storage2 inv_box.slot_id = ITEM_SLOT_RPOCKET - inv_box.hud = src static_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) 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 = ITEM_SLOT_SUITSTORE - inv_box.hud = src static_inventory += inv_box - using = new /atom/movable/screen/resist() + using = new /atom/movable/screen/resist(null, src) using.icon = ui_style using.screen_loc = ui_above_intent - using.hud = src hotkeybuttons += using - using = new /atom/movable/screen/human/toggle() + using = new /atom/movable/screen/human/toggle(null, src) using.icon = ui_style using.screen_loc = ui_inventory - using.hud = src static_inventory += using - using = new /atom/movable/screen/human/equip() + using = new /atom/movable/screen/human/equip(null, src) using.icon = ui_style using.screen_loc = ui_equip_position(mymob) - using.hud = src static_inventory += using - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" inv_box.screen_loc = ui_gloves inv_box.slot_id = ITEM_SLOT_GLOVES - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" inv_box.screen_loc = ui_glasses inv_box.slot_id = ITEM_SLOT_EYES - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" inv_box.screen_loc = ui_ears inv_box.slot_id = ITEM_SLOT_EARS - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" inv_box.screen_loc = ui_head inv_box.slot_id = ITEM_SLOT_HEAD - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" inv_box.screen_loc = ui_shoes inv_box.slot_id = ITEM_SLOT_FEET - inv_box.hud = src toggleable_inventory += inv_box - inv_box = new /atom/movable/screen/inventory() + inv_box = new /atom/movable/screen/inventory(null, src) 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 = ITEM_SLOT_BELT - inv_box.hud = src static_inventory += inv_box - throw_icon = new /atom/movable/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch(null, src) throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw - throw_icon.hud = src hotkeybuttons += throw_icon - rest_icon = new /atom/movable/screen/rest() + rest_icon = new /atom/movable/screen/rest(null, src) rest_icon.icon = ui_style rest_icon.screen_loc = ui_above_movement - rest_icon.hud = src rest_icon.update_appearance() static_inventory += rest_icon - spacesuit = new /atom/movable/screen/spacesuit - spacesuit.hud = src + spacesuit = new /atom/movable/screen/spacesuit(null, src) infodisplay += spacesuit - healths = new /atom/movable/screen/healths() - healths.hud = src - infodisplay += healths - - healthdoll = new /atom/movable/screen/healthdoll() + healthdoll = new /atom/movable/screen/healthdoll(null, src) healthdoll.hud = src infodisplay += healthdoll - stamina = new /atom/movable/screen/stamina() - stamina.hud = src + stamina = new /atom/movable/screen/stamina(null, src) infodisplay += stamina - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.screen_loc = ui_above_intent - pull_icon.hud = src pull_icon.update_appearance() static_inventory += pull_icon - zone_select = new /atom/movable/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel(null, src) zone_select.icon = ui_style - zone_select.hud = src zone_select.update_appearance() static_inventory += zone_select - combo_display = new /atom/movable/screen/combo() + combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display + gun_setting_icon = new /atom/movable/screen/gun_mode(null, src) + gun_setting_icon.icon = ui_style + + var/atom/movable/screen/gun_option = new /atom/movable/screen/gun_radio(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + gun_option = new /atom/movable/screen/gun_item(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + gun_option = new /atom/movable/screen/gun_move(null, src) + gun_option.icon = ui_style + gunpoint_options += gun_option + + pain = new(null, src) + + use_timer = new(null, src) + use_timer.RegisterSignal(mymob, COMSIG_LIVING_CHANGENEXT_MOVE, TYPE_PROC_REF(/atom/movable/screen/progbar_container, on_changenext)) + static_inventory += use_timer + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) - inv.hud = src inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv inv.update_appearance() diff --git a/code/_onclick/hud/living.dm b/code/_onclick/hud/living.dm index 366079f233d1..ecd6ecc1eba7 100644 --- a/code/_onclick/hud/living.dm +++ b/code/_onclick/hud/living.dm @@ -4,17 +4,15 @@ /datum/hud/living/New(mob/living/owner) ..() - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.update_appearance() pull_icon.screen_loc = ui_living_pull - pull_icon.hud = src static_inventory += pull_icon - combo_display = new /atom/movable/screen/combo() + combo_display = new /atom/movable/screen/combo(null, src) infodisplay += combo_display //mob health doll! assumes whatever sprite the mob is - healthdoll = new /atom/movable/screen/healthdoll/living() - healthdoll.hud = src + healthdoll = new /atom/movable/screen/healthdoll/living(null, src) infodisplay += healthdoll diff --git a/code/_onclick/hud/ooze.dm b/code/_onclick/hud/ooze.dm index d3ebe3e72885..1b466f7ff979 100644 --- a/code/_onclick/hud/ooze.dm +++ b/code/_onclick/hud/ooze.dm @@ -2,14 +2,12 @@ /datum/hud/ooze/New(mob/living/owner) . = ..() - zone_select = new /atom/movable/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel(null, src) zone_select.icon = ui_style - zone_select.hud = src zone_select.update_appearance() static_inventory += zone_select - alien_plasma_display = new /atom/movable/screen/ooze_nutrition_display //Just going to use the alien plasma display because making new vars for each object is braindead. - alien_plasma_display.hud = src + alien_plasma_display = new /atom/movable/screen/ooze_nutrition_display(null, src) //Just going to use the alien plasma display because making new vars for each object is braindead. infodisplay += alien_plasma_display /atom/movable/screen/ooze_nutrition_display diff --git a/code/_onclick/hud/pai.dm b/code/_onclick/hud/pai.dm index c76f5a43aa27..1a07ae7fcee6 100644 --- a/code/_onclick/hud/pai.dm +++ b/code/_onclick/hud/pai.dm @@ -5,8 +5,12 @@ var/required_software /atom/movable/screen/pai/Click() - if(isobserver(usr) || usr.incapacitated()) + . = ..() + if(.) + return FALSE + if(usr.incapacitated()) return FALSE + var/mob/living/silicon/pai/pAI = usr if(required_software && !pAI.software.Find(required_software)) to_chat(pAI, PAI_MISSING_SOFTWARE_MESSAGE) @@ -106,8 +110,8 @@ /atom/movable/screen/pai/crew_manifest/Click() if(!..()) return - var/mob/living/silicon/pai/pAI = usr - pAI.ai_roster() + + show_crew_manifest(usr) /atom/movable/screen/pai/state_laws name = "State Laws" @@ -183,62 +187,62 @@ var/mob/living/silicon/pai/mypai = mymob // Software menu - using = new /atom/movable/screen/pai/software + using = new /atom/movable/screen/pai/software(null, src) using.screen_loc = ui_pai_software static_inventory += using // Holoform - using = new /atom/movable/screen/pai/shell + using = new /atom/movable/screen/pai/shell(null, src) using.screen_loc = ui_pai_shell static_inventory += using // Chassis Select Menu - using = new /atom/movable/screen/pai/chassis + using = new /atom/movable/screen/pai/chassis(null, src) using.screen_loc = ui_pai_chassis static_inventory += using // Rest - using = new /atom/movable/screen/pai/rest + using = new /atom/movable/screen/pai/rest(null, src) using.screen_loc = ui_pai_rest static_inventory += using // Integrated Light - using = new /atom/movable/screen/pai/light + using = new /atom/movable/screen/pai/light(null, src) using.screen_loc = ui_pai_light static_inventory += using // Newscaster - using = new /atom/movable/screen/pai/newscaster + using = new /atom/movable/screen/pai/newscaster(null, src) using.screen_loc = ui_pai_newscaster static_inventory += using // Language menu - using = new /atom/movable/screen/language_menu + using = new /atom/movable/screen/language_menu(null, src) using.screen_loc = ui_pai_language_menu static_inventory += using // Navigation - using = new /atom/movable/screen/navigate + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_pai_navigate_menu static_inventory += using // Host Monitor - using = new /atom/movable/screen/pai/host_monitor() + using = new /atom/movable/screen/pai/host_monitor(null, src) using.screen_loc = ui_pai_host_monitor static_inventory += using // Crew Manifest - using = new /atom/movable/screen/pai/crew_manifest() + using = new /atom/movable/screen/pai/crew_manifest(null, src) using.screen_loc = ui_pai_crew_manifest static_inventory += using // Laws - using = new /atom/movable/screen/pai/state_laws() + using = new /atom/movable/screen/pai/state_laws(null, src) using.screen_loc = ui_pai_state_laws static_inventory += using // Modular Interface - using = new /atom/movable/screen/pai/modpc() + using = new /atom/movable/screen/pai/modpc(null, src) using.screen_loc = ui_pai_mod_int static_inventory += using mypai.interfaceButton = using @@ -246,22 +250,22 @@ tabletbutton.pAI = mypai // Internal GPS - using = new /atom/movable/screen/pai/internal_gps() + using = new /atom/movable/screen/pai/internal_gps(null, src) using.screen_loc = ui_pai_internal_gps static_inventory += using // Take image - using = new /atom/movable/screen/pai/image_take() + using = new /atom/movable/screen/pai/image_take(null, src) using.screen_loc = ui_pai_take_picture static_inventory += using // View images - using = new /atom/movable/screen/pai/image_view() + using = new /atom/movable/screen/pai/image_view(null, src) using.screen_loc = ui_pai_view_images static_inventory += using // Radio - using = new /atom/movable/screen/pai/radio() + using = new /atom/movable/screen/pai/radio(null, src) using.screen_loc = ui_pai_radio static_inventory += using diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index bcf01931a9e2..47f49eb377d8 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -9,8 +9,8 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, screenmob) - C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/stars(null, screenmob) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, src) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/stars(null, src) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -197,7 +197,7 @@ var/change_x var/change_y if(parallax_layer.absolute) - // We use change here so the typically large absolute objects (just lavaland for now) don't jitter so much + // We use change here so the typically large absolute objects don't jitter so much change_x = (posobj.x - SSparallax.planet_x_offset) * our_speed + parallax_layer.offset_x change_y = (posobj.y - SSparallax.planet_y_offset) * our_speed + parallax_layer.offset_y else @@ -252,9 +252,14 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen/parallax_layer) screen_loc = "CENTER-7,CENTER-7" mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/atom/movable/screen/parallax_layer/Initialize(mapload, mob/owner) +/atom/movable/screen/parallax_layer/Initialize(mapload, datum/hud/hud_owner) . = ..() - var/client/boss = owner?.client + // Parallax layers are independant of hud, they care about client + // Not doing this will just create a bunch of hard deletes + hud = null + + var/client/boss = hud_owner?.mymob?.canon_client + if(!boss) // If this typepath all starts to harddel your culprit is likely this return INITIALIZE_HINT_QDEL diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index b9baa2c11f99..d0d4e971386c 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -8,6 +8,9 @@ GLOBAL_LIST_EMPTY(radial_menus) plane = ABOVE_HUD_PLANE var/datum/radial_menu/parent +/atom/movable/screen/radial/can_usr_use(mob/user) + return usr.client == parent.current_user + /atom/movable/screen/radial/proc/set_parent(new_value) if(parent) UnregisterSignal(parent, COMSIG_PARENT_QDELETING) @@ -49,11 +52,14 @@ GLOBAL_LIST_EMPTY(radial_menus) closeToolTip(usr) /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, params) + . = ..() + if(.) + return FALSE + + if(next_page) + parent.next_page() + else + parent.element_chosen(choice, usr, params) /atom/movable/screen/radial/center name = "Close Menu" @@ -68,8 +74,11 @@ GLOBAL_LIST_EMPTY(radial_menus) icon_state = "radial_center" /atom/movable/screen/radial/center/Click(location, control, params) - if(usr.client == parent.current_user) - parent.finished = TRUE + . = ..() + if(.) + return FALSE + + parent.finished = TRUE /datum/radial_menu /// List of choice IDs @@ -335,7 +344,7 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/Destroy() Reset() hide() - QDEL_NULL(custom_check_callback) + custom_check_callback = null . = ..() /* diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 4e83f161a3b8..7483eee64e4f 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -7,8 +7,10 @@ icon_state = "radial_center" /atom/movable/screen/radial/persistent/center/Click(location, control, params) - if(usr.client == parent.current_user) - parent.element_chosen(null, usr, params) + . = ..() + if(.) + return FALSE + parent.element_chosen(null, usr, params) /atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params) . = ..() diff --git a/code/_onclick/hud/rendering/plane_master.dm b/code/_onclick/hud/rendering/plane_master.dm index 6a00670e48ca..7dfd4c4811fa 100644 --- a/code/_onclick/hud/rendering/plane_master.dm +++ b/code/_onclick/hud/rendering/plane_master.dm @@ -34,33 +34,33 @@ /atom/movable/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE - appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY ///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 +/atom/movable/screen/plane_master/seethrough + name = "Seethrough" + plane = SEETHROUGH_PLANE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + /atom/movable/screen/plane_master/massive_obj name = "massive object plane master" plane = MASSIVE_OBJ_PLANE - appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY /atom/movable/screen/plane_master/ghost name = "ghost plane master" plane = GHOST_PLANE - appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY render_relay_plane = RENDER_PLANE_NON_GAME /atom/movable/screen/plane_master/point name = "point plane master" plane = POINT_PLANE - appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY /** @@ -73,6 +73,7 @@ plane = BLACKNESS_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT blend_mode = BLEND_MULTIPLY + blend_mode_override = BLEND_OVERLAY appearance_flags = PLANE_MASTER | NO_CLIENT_COLOR | PIXEL_SCALE //byond internal end @@ -127,7 +128,6 @@ /atom/movable/screen/plane_master/above_lighting name = "above lighting plane master" plane = ABOVE_LIGHTING_PLANE - appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY ///Contains space parallax @@ -144,7 +144,6 @@ /atom/movable/screen/plane_master/pipecrawl name = "pipecrawl plane master" plane = PIPECRAWL_IMAGES_PLANE - appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY /atom/movable/screen/plane_master/pipecrawl/Initialize(mapload) @@ -158,7 +157,6 @@ /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/o_light_visual @@ -172,7 +170,6 @@ /atom/movable/screen/plane_master/runechat name = "runechat plane master" plane = RUNECHAT_PLANE - appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY render_relay_plane = RENDER_PLANE_NON_GAME diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index 75865d3d4547..c47ea4c24180 100644 --- a/code/_onclick/hud/revenanthud.dm +++ b/code/_onclick/hud/revenanthud.dm @@ -4,13 +4,11 @@ /datum/hud/revenant/New(mob/owner) ..() - pull_icon = new /atom/movable/screen/pull() + pull_icon = new /atom/movable/screen/pull(null, src) pull_icon.icon = ui_style pull_icon.update_appearance() pull_icon.screen_loc = ui_living_pull - pull_icon.hud = src static_inventory += pull_icon - healths = new /atom/movable/screen/healths/revenant() - healths.hud = src + healths = new /atom/movable/screen/healths/revenant(null, src) infodisplay += healths diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ac189048e09f..0df2168a2ed7 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -5,10 +5,6 @@ name = "cyborg module" icon_state = "nomod" -/atom/movable/screen/robot/Click() - if(isobserver(usr)) - return 1 - /atom/movable/screen/robot/module/Click() if(..()) return @@ -77,62 +73,55 @@ var/mob/living/silicon/robot/robit = mymob var/atom/movable/screen/using - using = new/atom/movable/screen/language_menu + using = new/atom/movable/screen/language_menu(null, src) using.screen_loc = ui_borg_language_menu static_inventory += using // Navigation - using = new /atom/movable/screen/navigate + using = new /atom/movable/screen/navigate(null, src) using.screen_loc = ui_borg_navigate_menu static_inventory += using //Radio - using = new /atom/movable/screen/robot/radio() + using = new /atom/movable/screen/robot/radio(null, src) using.screen_loc = ui_borg_radio - using.hud = src static_inventory += using //Module select if(!robit.inv1) - robit.inv1 = new /atom/movable/screen/robot/module1() + robit.inv1 = new /atom/movable/screen/robot/module1(null, src) robit.inv1.screen_loc = ui_inv1 - robit.inv1.hud = src static_inventory += robit.inv1 if(!robit.inv2) - robit.inv2 = new /atom/movable/screen/robot/module2() + robit.inv2 = new /atom/movable/screen/robot/module2(null, src) robit.inv2.screen_loc = ui_inv2 - robit.inv2.hud = src static_inventory += robit.inv2 if(!robit.inv3) - robit.inv3 = new /atom/movable/screen/robot/module3() + robit.inv3 = new /atom/movable/screen/robot/module3(null, src) robit.inv3.screen_loc = ui_inv3 - robit.inv3.hud = src static_inventory += robit.inv3 //End of module select - using = new /atom/movable/screen/robot/lamp() + using = new /atom/movable/screen/robot/lamp(null, src) using.screen_loc = ui_borg_lamp - using.hud = src static_inventory += using robit.lampButton = using var/atom/movable/screen/robot/lamp/lampscreen = using lampscreen.robot = robit //Photography stuff - using = new /atom/movable/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take(null, src) using.screen_loc = ui_borg_camera - using.hud = src static_inventory += using //Borg Integrated Tablet - using = new /atom/movable/screen/robot/modpc() + using = new /atom/movable/screen/robot/modpc(null, src) using.screen_loc = ui_borg_tablet - using.hud = src static_inventory += using robit.interfaceButton = using if(robit.modularInterface) @@ -141,44 +130,36 @@ tabletbutton.robot = robit //Alerts - using = new /atom/movable/screen/robot/alerts() + using = new /atom/movable/screen/robot/alerts(null, src) using.screen_loc = ui_borg_alerts - using.hud = src static_inventory += using //Combat Mode - action_intent = new /atom/movable/screen/combattoggle/robot() - action_intent.hud = src + action_intent = new /atom/movable/screen/combattoggle/robot(null, src) action_intent.icon = ui_style action_intent.screen_loc = ui_combat_toggle static_inventory += action_intent //Health - healths = new /atom/movable/screen/healths/robot() - healths.hud = src + healths = new /atom/movable/screen/healths/robot(null, src) infodisplay += healths //Installed Module - robit.hands = new /atom/movable/screen/robot/module() + robit.hands = new /atom/movable/screen/robot/module(null, src) robit.hands.screen_loc = ui_borg_module - robit.hands.hud = src static_inventory += robit.hands //Store - module_store_icon = new /atom/movable/screen/robot/store() + module_store_icon = new /atom/movable/screen/robot/store(null, src) module_store_icon.screen_loc = ui_borg_store - module_store_icon.hud = src - pull_icon = new /atom/movable/screen/pull() - pull_icon.icon = 'icons/hud/screen_cyborg.dmi' + pull_icon = new /atom/movable/screen/pull/robot(null, src) pull_icon.screen_loc = ui_borg_pull - pull_icon.hud = src pull_icon.update_appearance() hotkeybuttons += pull_icon - zone_select = new /atom/movable/screen/zone_sel/robot() - zone_select.hud = src + zone_select = new /atom/movable/screen/zone_sel/robot(null, src) zone_select.update_appearance() static_inventory += zone_select diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6eb4129ca46b..64645f246597 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -14,8 +14,8 @@ speech_span = SPAN_ROBOT vis_flags = VIS_INHERIT_PLANE appearance_flags = APPEARANCE_UI - /// A reference to the object in the slot. Grabs or items, generally. - var/obj/master = null + /// A reference to the object in the slot. Grabs or items, generally, but any datum will do. + var/datum/weakref/master_ref = null /// A reference to the owner HUD, if any. var/datum/hud/hud = null /** @@ -32,11 +32,33 @@ */ var/del_on_map_removal = TRUE + /// If set to TRUE, mobs that do not own this hud cannot click this screen object. + var/private_screen = TRUE + +/atom/movable/screen/Initialize(mapload, datum/hud/hud_owner) + . = ..() + if(istype(hud_owner)) + hud = hud_owner + /atom/movable/screen/Destroy() - master = null + master_ref = null hud = null return ..() +/atom/movable/screen/Click(location, control, params) + SHOULD_CALL_PARENT(TRUE) + . = !(TRUE || ..()) + + if(!can_usr_use(usr)) + return TRUE + + SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) + +/atom/movable/screen/proc/can_usr_use(mob/user) + . = TRUE + if(private_screen && (hud?.mymob != user)) + return FALSE + /atom/movable/screen/examine(mob/user) return list() @@ -59,6 +81,10 @@ name = "swap hand" /atom/movable/screen/swap_hand/Click() + . = ..() + if(.) + return FALSE + // 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) @@ -79,8 +105,9 @@ screen_loc = ui_navigate_menu /atom/movable/screen/navigate/Click() - if(!isliving(usr)) - return TRUE + . = ..() + if(.) + return FALSE var/mob/living/navigator = usr navigator.navigate() @@ -97,8 +124,12 @@ screen_loc = ui_building /atom/movable/screen/area_creator/Click() + . = ..() + if(.) + return FALSE if(usr.incapacitated() || (isobserver(usr) && !isAdminGhostAI(usr))) return TRUE + var/area/A = get_area(usr) if(!A.outdoors) to_chat(usr, span_warning("There is already a defined structure here.")) @@ -112,6 +143,10 @@ screen_loc = ui_language_menu /atom/movable/screen/language_menu/Click() + . = ..() + if(.) + return FALSE + var/mob/M = usr var/datum/language_holder/H = M.get_language_holder() H.open_language_menu(usr) @@ -126,10 +161,15 @@ /// The overlay when hovering over with an item in your hand var/image/object_overlay plane = HUD_PLANE + mouse_drop_zone = TRUE /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(.) + return FALSE + if(world.time <= usr.next_move) return TRUE @@ -147,6 +187,23 @@ usr.update_held_items() return TRUE +/atom/movable/screen/inventory/MouseDroppedOn(atom/dropped, mob/user, params) + if(user != hud?.mymob || !slot_id) + return TRUE + if(!isitem(dropped)) + return TRUE + if(world.time <= usr.next_move) + return TRUE + if(usr.incapacitated(IGNORE_STASIS)) + return TRUE + if(ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE + if(!user.is_holding(dropped)) + return TRUE + + user.equip_to_slot_if_possible(dropped, slot_id, FALSE, FALSE, FALSE) + return TRUE + /atom/movable/screen/inventory/MouseEntered(location, control, params) . = ..() add_overlays() @@ -179,7 +236,7 @@ var/image/item_overlay = image(holding) item_overlay.alpha = 92 - if(!user.can_equip(holding, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) + if(!holding.mob_can_equip(user, null, slot_id, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) item_overlay.color = "#FF0000" else item_overlay.color = "#00ff00" @@ -217,15 +274,21 @@ /atom/movable/screen/inventory/hand/Click(location, control, params) + SHOULD_CALL_PARENT(FALSE) // 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 - if(usr != user) + if(!can_usr_use(usr)) return TRUE + + SEND_SIGNAL(src, COMSIG_CLICK, location, control, params, usr) + + var/mob/user = hud?.mymob if(world.time <= user.next_move) return TRUE + if(user.incapacitated()) return TRUE + if (ismecha(user.loc)) // stops inventory actions in a mech return TRUE @@ -237,17 +300,56 @@ user.swap_hand(held_index) return TRUE +/atom/movable/screen/inventory/hand/MouseDroppedOn(atom/dropping, mob/user, params) + if(!isitem(dropping)) + return TRUE + + if(usr != hud?.mymob) + return TRUE + + if(world.time <= user.next_move) + return TRUE + + if(user.incapacitated()) + return TRUE + + if(ismecha(user.loc)) // stops inventory actions in a mech + return TRUE + + if(!user.CanReach(dropping)) + return TRUE + + var/obj/item/I = dropping + if(!(user.is_holding(I) || (I.item_flags & (IN_STORAGE|IN_INVENTORY)))) + return TRUE + + var/item_index = user.get_held_index_of_item(I) + if(item_index) + user.swapHeldIndexes(item_index, held_index) + else + user.putItemFromInventoryInHandIfPossible(dropping, held_index) + return TRUE + /atom/movable/screen/close name = "close" plane = ABOVE_HUD_PLANE icon_state = "backpack_close" -/atom/movable/screen/close/Initialize(mapload, new_master) +/atom/movable/screen/close/Initialize(mapload, datum/hud/hud_owner, new_master) . = ..() - master = new_master + master_ref = WEAKREF(new_master) + +/atom/movable/screen/close/can_usr_use(mob/user) + return TRUE /atom/movable/screen/close/Click() - var/datum/storage/storage = master + . = ..() + if(.) + return + + var/datum/storage/storage = master_ref?.resolve() + if(!storage) + return storage.hide_contents(usr) return TRUE @@ -258,6 +360,9 @@ plane = HUD_PLANE /atom/movable/screen/drop/Click() + . = ..() + if(.) + return FALSE if(usr.stat == CONSCIOUS) usr.dropItemToGround(usr.get_active_held_item()) @@ -272,6 +377,9 @@ update_appearance() /atom/movable/screen/combattoggle/Click() + . = ..() + if(.) + return FALSE if(isliving(usr)) var/mob/living/owner = usr owner.set_combat_mode(!owner.combat_mode, FALSE) @@ -318,6 +426,9 @@ icon_state = "running" /atom/movable/screen/mov_intent/Click() + . = ..() + if(.) + return FALSE toggle(usr) /atom/movable/screen/mov_intent/update_icon_state() @@ -329,8 +440,6 @@ return ..() /atom/movable/screen/mov_intent/proc/toggle(mob/user) - if(isobserver(user)) - return if(user.m_intent != MOVE_INTENT_WALK) user.set_move_intent(MOVE_INTENT_WALK) else @@ -343,14 +452,27 @@ base_icon_state = "pull" /atom/movable/screen/pull/Click() - if(isobserver(usr)) - return - usr.stop_pulling() + . = ..() + if(.) + return FALSE + + var/mob/living/L = usr + L.release_all_grabs() /atom/movable/screen/pull/update_icon_state() - icon_state = "[base_icon_state][hud?.mymob?.pulling ? null : 0]" + icon_state = "[base_icon_state][LAZYLEN(hud?.mymob?:active_grabs) ? null : 0]" return ..() +/atom/movable/screen/pull/robot + icon = 'icons/hud/screen_cyborg.dmi' + +/atom/movable/screen/pull/robot/update_icon_state() + . = ..() + if(LAZYLEN(hud?.mymob?:active_grabs)) + icon_state = base_icon_state + else + icon_state = null + /atom/movable/screen/resist name = "resist" icon = 'icons/hud/screen_midnight.dmi' @@ -358,9 +480,11 @@ plane = HUD_PLANE /atom/movable/screen/resist/Click() - if(isliving(usr)) - var/mob/living/L = usr - L.resist() + . = ..() + if(.) + return FALSE + var/mob/living/L = usr + L.resist() /atom/movable/screen/rest name = "rest" @@ -370,9 +494,12 @@ plane = HUD_PLANE /atom/movable/screen/rest/Click() - if(isliving(usr)) - var/mob/living/L = usr - L.toggle_resting() + . = ..() + if(.) + return FALSE + + var/mob/living/L = usr + L.toggle_resting() /atom/movable/screen/rest/update_icon_state() var/mob/living/user = hud?.mymob @@ -386,13 +513,22 @@ icon_state = "block" screen_loc = "7,7 to 10,8" plane = HUD_PLANE + mouse_drop_zone = TRUE -/atom/movable/screen/storage/Initialize(mapload, new_master) +/atom/movable/screen/storage/Initialize(mapload, datum/hud/hud_owner, new_master) . = ..() - master = new_master + master_ref = WEAKREF(new_master) + +/atom/movable/screen/storage/can_usr_use(mob/user) + // Storage does all of it's own sanity checking and stuff. + return TRUE /atom/movable/screen/storage/Click(location, control, params) - var/datum/storage/storage_master = master + . = ..() + if(.) + return + + var/datum/storage/storage_master = master_ref?.resolve() if(!istype(storage_master)) return FALSE @@ -409,15 +545,47 @@ return TRUE +/atom/movable/screen/storage/MouseDroppedOn(atom/dropping, mob/user, params) + var/datum/storage/storage_master = master_ref?.resolve() + + if(!istype(storage_master)) + return FALSE + + if(!isitem(dropping)) + return TRUE + + if(world.time <= user.next_move) + return TRUE + + if(user.incapacitated()) + return TRUE + + if(ismecha(user.loc)) // stops inventory actions in a mech + return TRUE + + if(!user.CanReach(dropping)) + return TRUE + + var/obj/item/I = dropping + if(!(user.is_holding(I) || (I.item_flags & IN_STORAGE))) + return TRUE + + storage_master.attempt_insert(dropping, usr) + + return TRUE + /atom/movable/screen/throw_catch name = "throw/catch" icon = 'icons/hud/screen_midnight.dmi' icon_state = "act_throw_off" /atom/movable/screen/throw_catch/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() + . = ..() + if(.) + return FALSE + + var/mob/living/carbon/C = usr + C.toggle_throw_mode() /atom/movable/screen/zone_sel name = "damage zone" @@ -428,8 +596,9 @@ var/hovering /atom/movable/screen/zone_sel/Click(location, control,params) - if(isobserver(usr)) - return + . = ..() + if(.) + return FALSE var/list/modifiers = params2list(params) var/icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) @@ -473,6 +642,7 @@ plane = ABOVE_HUD_PLANE /atom/movable/screen/zone_sel/MouseExited(location, control, params) + . = ..() if(!isobserver(usr) && hovering) vis_contents -= hover_overlays_cache[hovering] hovering = null @@ -573,7 +743,7 @@ /atom/movable/screen/healths/blob name = "blob health" icon_state = "block" - screen_loc = ui_internal + screen_loc = ui_blob_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT /atom/movable/screen/healths/blob/overmind @@ -595,27 +765,22 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT /atom/movable/screen/healthdoll - name = "health doll" + name = "physical health" screen_loc = ui_healthdoll /atom/movable/screen/healthdoll/Click() - if (iscarbon(usr)) - var/mob/living/carbon/C = usr - C.check_self_for_injuries() + . = ..() + if(.) + return FALSE + + var/mob/living/carbon/C = usr + C.check_self_for_injuries() /atom/movable/screen/healthdoll/living icon_state = "fullhealth0" screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update -/atom/movable/screen/mood - name = "mood" - icon_state = "mood5" - screen_loc = ui_mood - -/atom/movable/screen/mood/attack_tk() - return - /atom/movable/screen/component_button var/atom/movable/screen/parent @@ -624,6 +789,10 @@ src.parent = parent /atom/movable/screen/component_button/Click(params) + . = ..() + if(.) + return FALSE + if(parent) parent.component_click(src, params) @@ -662,25 +831,26 @@ name = "stamina" icon_state = "stamina0" screen_loc = ui_stamina + private_screen = FALSE /atom/movable/screen/stamina/Click(location, control, params) - if (iscarbon(usr)) - var/mob/living/carbon/C = usr - var/content = {" -
- [span_boldnotice("You have [C.stamina.current]/[C.stamina.maximum] stamina.")] -
- "} - to_chat(C, content) + . = ..() + if(.) + return FALSE + var/mob/living/carbon/C = hud.mymob + var/content = {" +
+ [span_boldnotice("You have [C.stamina.current]/[C.stamina.maximum] stamina.")] +
+ "} + to_chat(usr, content) /atom/movable/screen/stamina/MouseEntered(location, control, params) . = ..() - var/mob/living/L = usr - if(!istype(L)) - return - if(QDELETED(src)) return + + var/mob/living/L = hud.mymob var/_content = {" Stamina: [L.stamina.current]/[L.stamina.maximum]
Regen: [L.stamina.regen_rate] @@ -690,3 +860,172 @@ /atom/movable/screen/stamina/MouseExited(location, control, params) . = ..() closeToolTip(usr) + +/atom/movable/screen/gun_mode + name = "Toggle Gun Mode" + icon_state = "gun0" + screen_loc = ui_gun_select + +/atom/movable/screen/gun_mode/Click(location, control, params) + . = ..() + if(.) + return FALSE + + var/mob/living/user = hud?.mymob + if(!user) + return + user.use_gunpoint = !user.use_gunpoint + + hud.gun_setting_icon.update_icon_state() + hud.update_gunpoint(user) + +/atom/movable/screen/gun_mode/update_icon_state() + . = ..() + var/mob/living/user = hud?.mymob + if(!user) + return + + if(!user.use_gunpoint) + icon_state = "gun0" + user.client.screen -= hud.gunpoint_options + else + icon_state = "gun1" + user.client.screen += hud.gunpoint_options + +/atom/movable/screen/gun_radio + name = "Disallow Radio Use" + icon_state = "no_radio1" + screen_loc = ui_gun1 + +/atom/movable/screen/gun_radio/Click(location, control, params) + . = ..() + if(.) + return FALSE + + var/mob/living/user = hud?.mymob + if(!user) + return + + user.toggle_gunpoint_flag(TARGET_CAN_RADIO) + update_icon_state() + +/atom/movable/screen/gun_radio/update_icon_state() + . = ..() + + var/mob/living/user = hud?.mymob + if(user.gunpoint_flags & TARGET_CAN_RADIO) + icon_state = "no_radio1" + else + icon_state = "no_radio0" + +/atom/movable/screen/gun_item + name = "Allow Item Use" + icon_state = "no_item1" + screen_loc = ui_gun2 + +/atom/movable/screen/gun_item/Click(location, control, params) + . = ..() + if(.) + return FALSE + + var/mob/living/user = hud?.mymob + if(!user) + return + + user.toggle_gunpoint_flag(TARGET_CAN_INTERACT) + update_icon_state() + +/atom/movable/screen/gun_item/update_icon_state() + . = ..() + + var/mob/living/user = hud?.mymob + if(user.gunpoint_flags & TARGET_CAN_INTERACT) + icon_state = "no_item1" + else + icon_state = "no_item0" + +/atom/movable/screen/gun_move + name = "Allow Movement" + icon_state = "no_walk1" + screen_loc = ui_gun3 + +/atom/movable/screen/gun_move/Click(location, control, params) + . = ..() + if(.) + return FALSE + + var/mob/living/user = hud?.mymob + if(!user) + return + + user.toggle_gunpoint_flag(TARGET_CAN_MOVE) + update_icon_state() + +/atom/movable/screen/gun_move/update_icon_state() + . = ..() + + var/mob/living/user = hud?.mymob + if(user.gunpoint_flags & TARGET_CAN_MOVE) + icon_state = "no_walk1" + else + icon_state = "no_walk0" + +/atom/movable/screen/pain + name = "pain overlay" + icon_state = "" + layer = UI_DAMAGE_LAYER + plane = FULLSCREEN_PLANE + screen_loc = "WEST,SOUTH to EAST,NORTH" + +/atom/movable/screen/progbar_container + name = "swing cooldown" + icon_state = "" + screen_loc = "CENTER,SOUTH:16" + var/datum/world_progressbar/progbar + var/iteration = 0 + +/atom/movable/screen/progbar_container/Initialize(mapload) + . = ..() + progbar = new(src) + progbar.qdel_when_done = FALSE + progbar.bar.vis_flags = VIS_INHERIT_ID | VIS_INHERIT_LAYER | VIS_INHERIT_PLANE + progbar.bar.appearance_flags = APPEARANCE_UI + +/atom/movable/screen/progbar_container/Destroy() + QDEL_NULL(progbar) + return ..() + +/atom/movable/screen/progbar_container/proc/on_changenext(datum/source, next_move) + SIGNAL_HANDLER + + iteration++ + progbar.goal = next_move - world.time + progbar.bar.icon_state = "prog_bar_0" + + progbar_process(next_move) + +/atom/movable/screen/progbar_container/proc/progbar_process(next_move) + set waitfor = FALSE + + var/start_time = world.time + var/iteration = src.iteration + while(iteration == src.iteration && (world.time < next_move)) + progbar.update(world.time - start_time) + sleep(1) + + if(iteration == src.iteration) + progbar.end_progress() + + +/atom/movable/screen/holomap + icon = "" + plane = FULLSCREEN_PLANE + layer = FLOAT_LAYER + // Holomaps are 480x480. + // We offset them by half the size on each axis to center them. + // We need to account for this object being 32x32, so we subtract 32 from the initial 480 before dividing + screen_loc = "CENTER:-224,CENTER:-224" + +/atom/movable/screen/vis_holder + icon = "" + invisibility = INVISIBILITY_MAXIMUM diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 501077d7b4ae..7030ac19f616 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -10,7 +10,8 @@ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) var/is_right_clicking = LAZYACCESS(params2list(params), RIGHT_CLICK) - if(tool_behaviour && (target.tool_act(user, src, tool_behaviour, is_right_clicking) & TOOL_ACT_MELEE_CHAIN_BLOCKING)) + var/mob/living/L = user + if(tool_behaviour && (!istype(L) || !L.combat_mode) && (target.tool_act(user, src, tool_behaviour, is_right_clicking) & TOOL_ACT_MELEE_CHAIN_BLOCKING)) return TRUE var/pre_attack_result @@ -146,11 +147,14 @@ return SECONDARY_ATTACK_CALL_NORMAL /obj/attackby(obj/item/attacking_item, mob/user, params) - return ..() || ((obj_flags & CAN_BE_HIT) && attacking_item.attack_atom(src, user, params)) + return ..() || ((obj_flags & CAN_BE_HIT) && attacking_item.attack_obj(src, user, params)) /mob/living/attackby(obj/item/attacking_item, mob/living/user, params) if(..()) return TRUE + if (user.can_perform_surgery_on(src) && attacking_item.attempt_surgery(src, user)) + return TRUE + user.changeNext_move(attacking_item.combat_click_delay) return attacking_item.attack(src, user, params) @@ -175,7 +179,10 @@ var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user, params) if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN) return TRUE - if(signal_return & COMPONENT_SKIP_ATTACK) + if(signal_return & COMPONENT_SKIP_ATTACK_STEP) + return + + if(!user.combat_mode) return SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user, params) @@ -187,25 +194,29 @@ to_chat(user, span_warning("You don't want to harm other living beings!")) return - if(!force) - playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) - else if(hitsound) - playsound(loc, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) - M.lastattacker = user.real_name M.lastattackerckey = user.ckey - if(force && M == user && user.client) - user.client.give_award(/datum/award/achievement/misc/selfouch, user) - user.stamina_swing(src.stamina_cost) user.do_attack_animation(M) - M.attacked_by(src, user) + var/attack_return = M.attacked_by(src, user) + switch(attack_return) + if(MOB_ATTACKEDBY_NO_DAMAGE) + playsound(loc, 'sound/weapons/tap.ogg', get_clamped_volume(), TRUE, -1) + if(MOB_ATTACKEDBY_SUCCESS) + playsound(loc, get_hitsound(), get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0) + if(MOB_ATTACKEDBY_MISS) + playsound(loc, get_misssound(), get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1) + + var/missed = (attack_return == MOB_ATTACKEDBY_MISS || attack_return == MOB_ATTACKEDBY_FAIL) + log_combat(user, M, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)]) (MISSED: [missed ? "YES" : "NO"])") - log_combat(user, M, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])") add_fingerprint(user) + /// If we missed or the attack failed, interrupt attack chain. + return missed + /// The equivalent of [/obj/item/proc/attack] but for alternate attacks, AKA right clicking /obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, params) var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SECONDARY, victim, user, params) @@ -218,15 +229,19 @@ return SECONDARY_ATTACK_CALL_NORMAL -/// The equivalent of the standard version of [/obj/item/proc/attack] but for non mob targets. -/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, params) - if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, attacked_atom, user) & COMPONENT_CANCEL_ATTACK_CHAIN) +/// The equivalent of the standard version of [/obj/item/proc/attack] but for /obj targets. +/obj/item/proc/attack_obj(obj/attacked_obj, mob/living/user, params) + if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_OBJ, attacked_obj, user) & COMPONENT_CANCEL_ATTACK_CHAIN) return if(item_flags & NOBLUDGEON) return user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(attacked_atom) - attacked_atom.attacked_by(src, user) + user.do_attack_animation(attacked_obj) + attacked_obj.attacked_by(src, user) + +/// The equivalent of the standard version of [/obj/item/proc/attack] but for /turf targets. +/obj/item/proc/attack_turf(turf/attacked_turf, mob/living/user, params) + return /// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds /atom/proc/attacked_by(obj/item/attacking_item, mob/living/user) @@ -236,11 +251,16 @@ if(!attacking_item.force) return - var/damage = take_damage(attacking_item.force, attacking_item.damtype, MELEE, 1) + var/damage = take_damage(attacking_item.force, attacking_item.damtype, BLUNT, 1) + //only witnesses close by and the victim see a hit message. - user.visible_message(span_danger("[user] hits [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \ - span_danger("You hit [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE) - log_combat(user, src, "attacked", attacking_item) + user.visible_message( + span_danger("[user] hits [src] with [attacking_item][damage ? "." : ", without leaving a mark."]"), + null, + COMBAT_MESSAGE_RANGE + ) + + log_combat(user, src, "attacked ([damage] damage)", attacking_item) /area/attacked_by(obj/item/attacking_item, mob/living/user) CRASH("areas are NOT supposed to have attacked_by() called on them!") @@ -259,13 +279,13 @@ return TRUE //successful attack /mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user) - if(!attack_threshold_check(I.force, I.damtype, MELEE, FALSE)) + if(!attack_threshold_check(I.force, I.damtype, BLUNT, FALSE)) playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), TRUE, -1) else return ..() /mob/living/basic/attacked_by(obj/item/I, mob/living/user) - if(!attack_threshold_check(I.force, I.damtype, MELEE, FALSE)) + if(!attack_threshold_check(I.force, I.damtype, BLUNT, FALSE)) playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), TRUE, -1) else return ..() @@ -324,15 +344,27 @@ var/message_hit_area = "" if(hit_area) message_hit_area = " in the [hit_area]" - var/attack_message_spectator = "[src] [message_verb_continuous][message_hit_area] with [I]!" - var/attack_message_victim = "Something [message_verb_continuous] you[message_hit_area] with [I]!" - var/attack_message_attacker = "You [message_verb_simple] [src][message_hit_area] with [I]!" - if(user in viewers(src, null)) - attack_message_spectator = "[user] [message_verb_continuous] [src][message_hit_area] with [I]!" - attack_message_victim = "[user] [message_verb_continuous] you[message_hit_area] with [I]!" + + var/attack_message_spectator = "[src] [message_verb_continuous][message_hit_area] with [I]!" + + if(user in viewers(src)) + attack_message_spectator = "[user] [message_verb_continuous] [src][message_hit_area] with [I]!" + if(user == src) - attack_message_victim = "You [message_verb_simple] yourself[message_hit_area] with [I]" - visible_message(span_danger("[attack_message_spectator]"),\ - span_userdanger("[attack_message_victim]"), null, COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("[attack_message_attacker]")) + attack_message_spectator = "[user] [message_verb_simple] [user.p_them()]self[message_hit_area] with [I]!" + + visible_message(span_danger("[attack_message_spectator]"), vision_distance = COMBAT_MESSAGE_RANGE) return 1 + +/** + * Interaction handler for being clicked on with a grab. This is called regardless of user intent. + * + * **Parameters**: + * - `grab` - The grab item being used. + * - `click_params` - List of click parameters. + * + * Returns boolean to indicate whether the attack call was handled or not. If `FALSE`, the next `use_*` proc in the + * resolve chain will be called. + */ +/atom/proc/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + return FALSE diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index b1f8e627375b..96e0429acc50 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -14,7 +14,6 @@ // Otherwise jump else if(A.loc) abstract_move(get_turf(A)) - update_parallax_contents() /mob/dead/observer/ClickOn(atom/A, params) if(check_click_intercept(params,A)) @@ -58,13 +57,13 @@ return TRUE else if(isAdminGhostAI(user)) attack_ai(user) - else if(user.client.prefs.read_preference(/datum/preference/toggle/inquisitive_ghost)) + else if(user.client.prefs.read_preference(/datum/preference/toggle/inquisitive_ghost) && !user.observetarget) user.examinate(src) return FALSE /mob/living/attack_ghost(mob/dead/observer/user) if(user.client && user.health_scan) - healthscan(user, src, 1, TRUE) + healthscan(user, src, TRUE) if(user.client && user.chem_scan) chemscan(user, src) return ..() diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 7c68a2ca584a..c4b29185e63e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -9,51 +9,84 @@ else if (secondary_result != SECONDARY_ATTACK_CALL_NORMAL) CRASH("attack_hand_secondary did not return a SECONDARY_ATTACK_* define.") -/* - Humans: - Adds an exception for gloves, to allow special glove types like the ninja ones. +/** + * Checks if this mob is in a valid state to punch someone. + */ +/mob/living/proc/can_unarmed_attack() + return !HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) - Otherwise pretty standard. -*/ -/mob/living/carbon/human/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) - if(src == A) - check_self_for_injuries() +/mob/living/carbon/can_unarmed_attack() + . = ..() + if(!.) return + + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + return FALSE + if(!has_active_hand()) //can't attack without a hand. var/obj/item/bodypart/check_arm = get_active_hand() if(check_arm?.bodypart_disabled) to_chat(src, span_warning("Your [check_arm.name] is in no condition to be used.")) - return + return FALSE to_chat(src, span_notice("You look at your arm and sigh.")) - return + return FALSE - // Special glove functions: - // If the gloves do anything, have them return 1 to stop - // normal attack_hand() here. - var/obj/item/clothing/gloves/G = gloves // not typecast specifically enough in defines - if(proximity_flag && istype(G) && G.Touch(A,1,modifiers)) - return + + return TRUE + +/mob/living/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) //This signal is needed to prevent gloves of the north star + hulk. - if(SEND_SIGNAL(src, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, A, proximity_flag, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) - return - SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A, proximity_flag, modifiers) + var/sig_return = SEND_SIGNAL(src, COMSIG_LIVING_EARLY_UNARMED_ATTACK, attack_target, proximity_flag, modifiers) + if(sig_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return ATTACK_CHAIN_SUCCESS + + if(sig_return & COMPONENT_SKIP_ATTACK_STEP) + return ATTACK_CHAIN_CONTINUE + + if(!can_unarmed_attack()) + return ATTACK_CHAIN_CONTINUE + + sig_return = SEND_SIGNAL(src, COMSIG_LIVING_UNARMED_ATTACK, attack_target, proximity_flag, modifiers) + if(sig_return & COMPONENT_CANCEL_ATTACK_CHAIN) + return ATTACK_CHAIN_SUCCESS - if(!right_click_attack_chain(A, modifiers) && !dna?.species?.spec_unarmedattack(src, A, modifiers)) //Because species like monkeys dont use attack hand - . = A.attack_hand(src, modifiers) - if(.) - animate_interact(A, INTERACT_GENERIC) + if(sig_return & COMPONENT_SKIP_ATTACK_STEP) + return ATTACK_CHAIN_CONTINUE + + if(!right_click_attack_chain(attack_target, modifiers)) + resolve_unarmed_attack(attack_target, modifiers) + +/mob/living/carbon/human/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) + if(src == attack_target && !combat_mode && !HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + check_self_for_injuries() + return ATTACK_CHAIN_SUCCESS + + return ..() + +/mob/living/carbon/resolve_unarmed_attack(atom/attack_target, list/modifiers) + return attack_target.attack_paw(src, modifiers) + +/mob/living/carbon/human/resolve_unarmed_attack(atom/attack_target, list/modifiers) + if(!ISADVANCEDTOOLUSER(src)) + return ..() + . = attack_target.attack_hand(src, modifiers) + if(. == ATTACK_CHAIN_SUCCESS) + animate_interact(attack_target, INTERACT_GENERIC) /// Return TRUE to cancel other attack hand effects that respect it. Modifiers is the assoc list for click info such as if it was a right click. /atom/proc/attack_hand(mob/user, list/modifiers) . = FALSE - if(!(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND)) + if(!(interaction_flags_atom & (INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND | INTERACT_ATOM_ATTACK_HAND))) add_fingerprint(user) + else + log_touch(user) + if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_HAND, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) . = TRUE + if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND) . = _try_interact(user) @@ -68,16 +101,20 @@ /atom/proc/_try_interact(mob/user) if(isAdminGhostAI(user)) //admin abuse return interact(user) + if(can_interact(user)) return interact(user) + return FALSE /atom/proc/can_interact(mob/user) if(!user.can_interact_with(src)) return FALSE + if((interaction_flags_atom & INTERACT_ATOM_REQUIRES_DEXTERITY) && !ISADVANCEDTOOLUSER(user)) to_chat(user, span_warning("You don't have the dexterity to do this!")) return FALSE + if(!(interaction_flags_atom & INTERACT_ATOM_IGNORE_INCAPACITATED)) var/ignore_flags = NONE if(interaction_flags_atom & INTERACT_ATOM_IGNORE_RESTRAINED) @@ -87,6 +124,7 @@ if(user.incapacitated(ignore_flags)) return FALSE + return TRUE /atom/ui_status(mob/user) @@ -103,12 +141,14 @@ /atom/proc/interact(mob/user) if(interaction_flags_atom & INTERACT_ATOM_NO_FINGERPRINT_INTERACT) - add_hiddenprint(user) + log_touch(user) else add_fingerprint(user) + if(interaction_flags_atom & INTERACT_ATOM_UI_INTERACT) SEND_SIGNAL(src, COMSIG_ATOM_UI_INTERACT, user) return ui_interact(user) + return FALSE @@ -116,28 +156,20 @@ . = ..() if(.) return - if(gloves) - var/obj/item/clothing/gloves/G = gloves - if(istype(G) && G.Touch(A,0,modifiers)) // for magic gloves - return TRUE if(isturf(A) && get_dist(src,A) <= 1) - Move_Pulled(A) + move_grabbed_atoms_towards(A) return TRUE + +/// Called by UnarmedAttack(), directs the proc to a type-specified child proc. +/mob/living/proc/resolve_unarmed_attack(atom/attack_target, list/modifiers) + attack_target.attack_animal(src, modifiers) + /* Animals & All Unspecified */ -// If the UnarmedAttack chain is blocked -#define LIVING_UNARMED_ATTACK_BLOCKED(target_atom) (HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) \ - || SEND_SIGNAL(src, COMSIG_LIVING_UNARMED_ATTACK, target_atom, proximity_flag, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN) - -/mob/living/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return - attack_target.attack_animal(src, modifiers) - /atom/proc/attack_animal(mob/user, list/modifiers) SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) @@ -155,9 +187,7 @@ Aliens Defaults to same as monkey in most places */ -/mob/living/carbon/alien/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return +/mob/living/carbon/alien/resolve_unarmed_attack(atom/attack_target, list/modifiers) attack_target.attack_alien(src, modifiers) /atom/proc/attack_alien(mob/living/carbon/alien/user, list/modifiers) @@ -166,9 +196,7 @@ // Babby aliens -/mob/living/carbon/alien/larva/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return +/mob/living/carbon/alien/larva/resolve_unarmed_attack(atom/attack_target, list/modifiers) attack_target.attack_larva(src) /atom/proc/attack_larva(mob/user) @@ -179,12 +207,11 @@ Slimes Nothing happening here */ -/mob/living/simple_animal/slime/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return +/mob/living/simple_animal/slime/resolve_unarmed_attack(atom/attack_target, list/modifiers) if(isturf(attack_target)) return ..() - attack_target.attack_slime(src) + + return attack_target.attack_slime(src) /atom/proc/attack_slime(mob/user) return @@ -193,10 +220,8 @@ /* Drones */ -/mob/living/simple_animal/drone/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return - attack_target.attack_drone(src, modifiers) +/mob/living/simple_animal/drone/resolve_unarmed_attack(atom/attack_target, list/modifiers) + return attack_target.attack_drone(src, modifiers) /// Defaults to attack_hand or attack_hand_secondary. Override it when you don't want drones to do same stuff as humans. /atom/proc/attack_drone(mob/living/simple_animal/drone/user, list/modifiers) @@ -224,9 +249,7 @@ Simple animals */ -/mob/living/simple_animal/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return +/mob/living/simple_animal/resolve_unarmed_attack(atom/attack_target, list/modifiers) if(dextrous && (isitem(attack_target) || !combat_mode)) attack_target.attack_hand(src, modifiers) update_held_items() @@ -237,17 +260,13 @@ Hostile animals */ -/mob/living/simple_animal/hostile/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) - if(LIVING_UNARMED_ATTACK_BLOCKED(attack_target)) - return +/mob/living/simple_animal/hostile/resolve_unarmed_attack(atom/attack_target, list/modifiers) GiveTarget(attack_target) if(dextrous && (isitem(attack_target) || !combat_mode)) ..() else AttackingTarget(attack_target) -#undef LIVING_UNARMED_ATTACK_BLOCKED - /* New Players: Have no reason to click on anything at all. diff --git a/code/_onclick/overmind.dm b/code/_onclick/overmind.dm index d6b8994f82f0..555ba4b87d76 100644 --- a/code/_onclick/overmind.dm +++ b/code/_onclick/overmind.dm @@ -25,7 +25,7 @@ if(T) rally_spores(T) -/mob/camera/blob/CtrlClickOn(atom/A) //Create a shield +/mob/camera/blob/CtrlClickOn(atom/A, list/params) //Create a shield var/turf/T = get_turf(A) if(T) create_shield(T) diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index e4c9dd69773d..ec2734e03572 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -18,7 +18,7 @@ if(user.stat || !tkMaxRangeCheck(user, src)) return new /obj/effect/temp_visual/telekinesis(get_turf(src)) - add_hiddenprint(user) + log_touch(user) user.UnarmedAttack(src, FALSE) // attack_hand, attack_paw, etc return COMPONENT_CANCEL_ATTACK_CHAIN @@ -49,7 +49,7 @@ if(!O.focus_object(src)) return user.put_in_active_hand(O) - add_hiddenprint(user) + log_touch(user) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/controllers/admin.dm b/code/controllers/admin.dm index 2656104ab1c3..0a61673d476d 100644 --- a/code/controllers/admin.dm +++ b/code/controllers/admin.dm @@ -98,15 +98,18 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick) if(!check_rights(R_ADMIN) || !SSticker.initialized) return - var/list/music_jsons = SSticker.get_music_jsons() - var/list/name2json = list() - for(var/json in music_jsons) - name2json[json["name"]] = json + var/list/music_tracks = SSmedia.get_track_pool(MEDIA_TAG_LOBBYMUSIC_COMMON)+SSmedia.get_track_pool(MEDIA_TAG_LOBBYMUSIC_RARE) + if(!length(music_tracks)) + to_chat(usr, span_admin("MEDIA: No media tracks available. Manual music changing can't be used on fallback tracks.")) + return + var/list/name2track = list() + for(var/datum/media/track in music_tracks) + name2track[track.name] = track - var/list/selection = input(usr, "Select a track to play", "Change Title Music") as null|anything in name2json + var/datum/media/selection = input(usr, "Select a track to play", "Change Title Music") as null|anything in name2track if(isnull(selection)) return - selection = name2json[selection] + selection = name2track[selection] SSticker.set_login_music(selection) - log_admin("[key_name_admin(usr)] changed the title music to [selection["name"]] ([selection["file"]])") - message_admins("[key_name_admin(usr)] changed the title music to [selection["name"]] ([selection["file"]])") + log_admin("[key_name_admin(usr)] changed the title music to [selection.name] ([selection.path])") + message_admins("[key_name_admin(usr)] changed the title music to [selection.name] ([selection.path])") diff --git a/code/controllers/appearance_modifier_manager.dm b/code/controllers/appearance_modifier_manager.dm index 78677f1fd0c8..945c9ecf0168 100644 --- a/code/controllers/appearance_modifier_manager.dm +++ b/code/controllers/appearance_modifier_manager.dm @@ -30,10 +30,10 @@ list( var/list/modnames_by_species = list() /datum/controller/modmanager/Initialize() - for(var/path as anything in subtypesof(/datum/appearance_modifier)) - var/datum/appearance_modifier/mod = new path - if(mod.abstract_type == mod.type) + for(var/datum/path as anything in subtypesof(/datum/appearance_modifier)) + if(isabstract(path)) continue + var/datum/appearance_modifier/mod = new path mod_singletons += mod mods_by_type[path] = mod mods_by_name[mod.name] = mod diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index fe82b75abe01..30ca93782262 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -6,6 +6,7 @@ #define KEY_MODE_TYPE 1 /datum/config_entry + abstract_type = /datum/config_entry /// Read-only, this is determined by the last portion of the derived entry type var/name /// The configured value for this entry. This shouldn't be initialized in code, instead set default @@ -20,8 +21,6 @@ var/deprecated_by /// The /datum/config_entry type that supercedes this one var/protection = NONE - /// Do not instantiate if type matches this - var/abstract_type = /datum/config_entry /// Force validate and set on VV. VAS proccall guard will run regardless. var/vv_VAS = TRUE /// Controls if error is thrown when duplicate configuration values for this entry type are encountered @@ -30,7 +29,7 @@ var/default_protection /datum/config_entry/New() - if(type == abstract_type) + if(isabstract(src)) // are we abstract? CRASH("Abstract config entry [type] instatiated!") name = lowertext(type2top(type)) default_protection = protection diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index d8968c601034..e979b8073ea1 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -120,11 +120,10 @@ var/list/_entries_by_type = list() entries_by_type = _entries_by_type - for(var/I in typesof(/datum/config_entry)) //typesof is faster in this case - var/datum/config_entry/E = I - if(initial(E.abstract_type) == I) + for(var/datum/config_entry/I as anything in typesof(/datum/config_entry)) //typesof is faster in this case + if(isabstract(I)) continue - E = new I + var/datum/config_entry/E = new I var/esname = E.name var/datum/config_entry/test = _entries[esname] if(test) @@ -242,12 +241,10 @@ msg = "Edit" return msg -/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) +/datum/controller/configuration/proc/Get(datum/config_entry/entry_type) + if(isabstract(entry_type)) CRASH("Tried to retrieve an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] + var/datum/config_entry/E = entries_by_type[entry_type] if(!E) CRASH("Missing config entry for [entry_type]!") if((E.protection & CONFIG_ENTRY_HIDDEN) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Get" && GLOB.LastAdminCalledTargetRef == "[REF(src)]") @@ -255,12 +252,10 @@ return return E.config_entry_value -/datum/controller/configuration/proc/Set(entry_type, new_val) - var/datum/config_entry/E = entry_type - var/entry_is_abstract = initial(E.abstract_type) == entry_type - if(entry_is_abstract) +/datum/controller/configuration/proc/Set(datum/config_entry/entry_type, new_val) + if(isabstract(entry_type)) CRASH("Tried to set an abstract config_entry: [entry_type]") - E = entries_by_type[entry_type] + var/datum/config_entry/E = entries_by_type[entry_type] if(!E) CRASH("Missing config entry for [entry_type]!") if((E.protection & CONFIG_ENTRY_LOCKED) && IsAdminAdvancedProcCall() && GLOB.LastAdminCalledProc == "Set" && GLOB.LastAdminCalledTargetRef == "[REF(src)]") diff --git a/code/controllers/configuration/entries/comms.dm b/code/controllers/configuration/entries/comms.dm index cc7228f9043b..98de165b802f 100644 --- a/code/controllers/configuration/entries/comms.dm +++ b/code/controllers/configuration/entries/comms.dm @@ -1,6 +1,14 @@ /datum/config_entry/string/comms_key protection = CONFIG_ENTRY_HIDDEN +//API key for Github Issues. +/datum/config_entry/string/issue_key + protection = CONFIG_ENTRY_HIDDEN + +//Endpoint for Github Issues, the `owner/repo` part. +/datum/config_entry/string/issue_slug + protection = CONFIG_ENTRY_LOCKED + /datum/config_entry/string/comms_key/ValidateAndSet(str_val) return str_val != "default_pwd" && length(str_val) > 6 && ..() diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index e1e33f66ef58..7497b3efd2db 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -1,5 +1,3 @@ -/datum/config_entry/number_list/repeated_mode_adjust - /datum/config_entry/keyed_list/max_pop key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_NUM @@ -40,20 +38,18 @@ /datum/config_entry/flag/allow_ai_multicam // allow ai multicamera mode -/datum/config_entry/flag/disable_human_mood - /datum/config_entry/flag/disable_secborg // disallow secborg model to be chosen. /datum/config_entry/flag/disable_peaceborg /datum/config_entry/flag/disable_warops -/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors +/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors [UNUSED] default = 6 integer = FALSE min_val = 0 -/datum/config_entry/number/brother_scaling_coeff //how many players per brother team +/datum/config_entry/number/brother_scaling_coeff //how many players per brother team [UNUSED] default = 25 integer = FALSE min_val = 0 @@ -73,12 +69,12 @@ default = 6 min_val = 1 -/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings +/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings [UNUSED] default = 6 integer = FALSE min_val = 0 -/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult +/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult (Heretic) [UNUSED] default = 6 integer = FALSE min_val = 0 @@ -88,10 +84,6 @@ integer = FALSE min_val = 0 -/datum/config_entry/number/traitor_objectives_amount - default = 2 - min_val = 0 - /datum/config_entry/number/brother_objectives_amount default = 2 min_val = 0 @@ -170,11 +162,6 @@ /datum/config_entry/flag/revival_pod_plants -/datum/config_entry/number/revival_brain_life - default = -1 - integer = FALSE - min_val = -1 - /datum/config_entry/flag/ooc_during_round // deprecated for unclear name @@ -267,8 +254,6 @@ movedelay_type = /mob/living/simple_animal ///////////////////////////////////////////////// -/datum/config_entry/flag/virtual_reality //Will virtual reality be loaded - /datum/config_entry/flag/roundstart_away //Will random away mission be loaded. /datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. @@ -281,15 +266,11 @@ min_val = 0 max_val = 100 -/datum/config_entry/flag/ghost_interaction - /datum/config_entry/flag/near_death_experience //If carbons can hear ghosts when unconscious and very close to death /datum/config_entry/flag/silent_ai /datum/config_entry/flag/silent_borg -/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff - /datum/config_entry/number/default_laws //Controls what laws the AI spawns with. default = 0 min_val = 0 @@ -321,20 +302,18 @@ /datum/config_entry/flag/starlight /datum/config_entry/flag/grey_assistants -/datum/config_entry/number/lavaland_budget - default = 60 +/datum/config_entry/number/space_budget + default = 16 integer = FALSE min_val = 0 -/datum/config_entry/number/icemoon_budget - default = 90 - integer = FALSE - min_val = 0 +#ifdef DISABLE_RUINS /datum/config_entry/number/space_budget - default = 16 - integer = FALSE - min_val = 0 + max_val = 0 + default = 0 + +#endif /datum/config_entry/flag/allow_random_events // Enables random events mid-round when set @@ -400,3 +379,26 @@ default = 1 min_val = 0 integer = FALSE + +/// Enable the disk secure nag system? +/datum/config_entry/flag/lone_op_nag + default = FALSE + +/datum/config_entry/flag/lone_op_nag/ValidateAndSet(str_val) + var/old_val = config_entry_value + . = ..() + if(config_entry_value != old_val) + //Re-fuck their processing + for(var/obj/item/disk/nuclear/dick in SSpoints_of_interest.real_nuclear_disks) + if(config_entry_value) + //Set true, Make them process + START_PROCESSING(SSobj, dick) + else + //Set false, kill:tm: + STOP_PROCESSING(SSobj, dick) + +/// Require captain to start the round +/datum/config_entry/flag/require_captain + +/// Require every department to have atleast one staff member to start the round +/datum/config_entry/flag/require_departments_staffed diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 4dc2c5e34517..cea214d3ab84 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -97,6 +97,9 @@ /// log usage of tools /datum/config_entry/flag/log_tools +/// log graffiti +/datum/config_entry/flag/log_graffiti + /// log game events /datum/config_entry/flag/log_game @@ -245,8 +248,6 @@ /datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database protection = CONFIG_ENTRY_LOCKED -/datum/config_entry/string/hostedby - /datum/config_entry/flag/norespawn /datum/config_entry/flag/usewhitelist @@ -298,6 +299,8 @@ /datum/config_entry/string/discordbotcommandprefix default = "?" +/datum/config_entry/string/panic_bunker_discord_link + /datum/config_entry/string/roundstatsurl /datum/config_entry/string/gamelogurl @@ -331,8 +334,6 @@ /datum/config_entry/flag/kick_inactive //force disconnect for inactive players -/datum/config_entry/flag/load_jobs_from_txt - /datum/config_entry/flag/forbid_singulo_possession /datum/config_entry/flag/automute_on //enables automuting/spam prevention @@ -405,10 +406,6 @@ /// Flag to enable the whitelist, only allowing registered players to enter the server /datum/config_entry/flag/panic_bunker_discord_require -/// String to show the user if they were denied access due to the WAS -/datum/config_entry/string/panic_bunker_discord_register_message - default = "Sorry but this server requires players to link their Discord account before playing! Please enter the following command, including the token, into this Server's Discord Guild." - /datum/config_entry/string/panic_bunker_message default = "Sorry but the server is currently not accepting connections from never before seen players." @@ -664,3 +661,9 @@ /datum/config_entry/flag/topic_enabled protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/show_job_estimation + +/// Unique slug for the webmap +/datum/config_entry/string/webmap_community + default = "DaedalusDock" diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 7b5cc94d3620..39330b4b6707 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -13,7 +13,11 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) GLOB = src var/datum/controller/exclude_these = new - gvars_datum_in_built_vars = exclude_these.vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) + // I know this is dumb but the nested vars list hangs a ref to the datum. This fixes that + var/list/controller_vars = exclude_these.vars.Copy() + controller_vars["vars"] = null + gvars_datum_in_built_vars = controller_vars + list(NAMEOF(src, gvars_datum_protected_varlist), NAMEOF(src, gvars_datum_in_built_vars), NAMEOF(src, gvars_datum_init_order)) + QDEL_IN(exclude_these, 0) //signal logging isn't ready log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") @@ -34,6 +38,12 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) return FALSE return ..() +/datum/controller/global_vars/vv_get_var(var_name) + switch(var_name) + if (NAMEOF(src, vars)) + return debug_variable(var_name, list(), 0, src) + return debug_variable(var_name, vars[var_name], 0, src, display_flags = VV_ALWAYS_CONTRACT_LIST) + /datum/controller/global_vars/Initialize() gvars_datum_init_order = list() gvars_datum_protected_varlist = list(NAMEOF(src, gvars_datum_protected_varlist) = TRUE) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 74ccd5c3a568..62bbbe6986a5 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -246,12 +246,16 @@ GLOBAL_REAL(Master, /datum/controller/master) = new if (subsystem.flags & SS_NO_INIT || subsystem.initialized) //Don't init SSs with the correspondig flag or if they already are initialzized continue current_initializing_subsystem = subsystem + if(GLOB.is_debug_server) to_chat(world, span_boldnotice("Initializing [subsystem.name]...")) + subsystem.Initialize(REALTIMEOFDAY) CHECK_TICK + current_initializing_subsystem = null init_stage_completed = current_init_stage + if (!mc_started) mc_started = TRUE if (!current_runlevel) @@ -384,6 +388,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new while (1) tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) var/starting_tick_usage = TICK_USAGE + if (init_stage != init_stage_completed) return MC_LOOP_RTN_NEWSTAGES if (processing <= 0) @@ -507,8 +512,6 @@ GLOBAL_REAL(Master, /datum/controller/master) = new sleep(world.tick_lag * (processing * sleep_delta)) - - // This is what decides if something should run. /datum/controller/master/proc/CheckQueue(list/subsystemstocheck) . = 0 //so the mc knows if we runtimed @@ -549,6 +552,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new break if(!enter_queue) SS.hibernating = TRUE + SS.update_nextfire() continue SS.enqueue() diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index 0a46b77807db..6df943ac3f64 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -277,7 +277,7 @@ var/time = (REALTIMEOFDAY - start_timeofday) / 10 var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" if(GLOB.is_debug_server) - to_chat(world, span_boldannounce("[msg]")) + to_chat(world, span_debug("[msg]")) log_world(msg) return time diff --git a/code/controllers/subsystem/airflow.dm b/code/controllers/subsystem/airflow.dm index 19083d3767cf..aa28c57fc72e 100644 --- a/code/controllers/subsystem/airflow.dm +++ b/code/controllers/subsystem/airflow.dm @@ -77,28 +77,33 @@ SUBSYSTEM_DEF(airflow) Dequeue(target) continue + // We are moving now + target.airflow_old_density = target.density + if(!target.airflow_old_density && target.airflow_speed > zas_settings.airflow_speed_for_density) target.set_density(TRUE) target.moving_by_airflow = TRUE - var/olddir = target.dir + var/olddir = target.set_dir_on_move + target.set_dir_on_move = FALSE step_towards(target, target.airflow_dest) - target.dir = olddir + target.set_dir_on_move = olddir target.moving_by_airflow = FALSE target.airborne_acceleration++ if(!target.airflow_old_density) target.set_density(FALSE) - ADD_TRAIT(target, TRAIT_EXPERIENCING_AIRFLOW, AIRFLOW_TRAIT) /datum/controller/subsystem/airflow/proc/Enqueue(atom/movable/to_add) if(!can_fire) return processing += to_add + RegisterSignal(to_add, COMSIG_PARENT_QDELETING, PROC_REF(HandleDel)) + ADD_TRAIT(to_add, TRAIT_EXPERIENCING_AIRFLOW, AIRFLOW_TRAIT) /datum/controller/subsystem/airflow/proc/Dequeue(atom/movable/to_remove) processing -= to_remove @@ -136,7 +141,6 @@ SUBSYSTEM_DEF(airflow) return FALSE airflow_speed = min(max(strength * (9 / airflow_falloff), 1), 9) - airflow_old_density = src.density return TRUE diff --git a/code/controllers/subsystem/airmachines.dm b/code/controllers/subsystem/airmachines.dm index af1a499ce783..2b001286defb 100644 --- a/code/controllers/subsystem/airmachines.dm +++ b/code/controllers/subsystem/airmachines.dm @@ -25,13 +25,13 @@ SUBSYSTEM_DEF(airmachines) /datum/controller/subsystem/airmachines/Initialize(timeofday) var/starttime = REALTIMEOFDAY - to_chat(world, span_boldannounce("Airmachines: Setting up atmospheric machinery...")) + to_chat(world, span_debug("Airmachines: Setting up atmospheric machinery...")) setup_atmos_machinery() - to_chat(world, span_boldannounce("Airmachines: Airmachine setup completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) + to_chat(world, span_debug("Airmachines: Airmachine setup completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) starttime = REALTIMEOFDAY - to_chat(world, span_boldannounce("Airmachines: Creating pipenets...")) + to_chat(world, span_debug("Airmachines: Creating pipenets...")) setup_pipenets() - to_chat(world, span_boldannounce("Airmachines: Pipenet creation completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) + to_chat(world, span_debug("Airmachines: Pipenet creation completed in [(REALTIMEOFDAY- starttime) / 10] seconds!")) return ..() /datum/controller/subsystem/airmachines/stat_entry(msg) diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index f131c90e1174..4ca0203ec458 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -21,12 +21,15 @@ SUBSYSTEM_DEF(ambience) cached_clients.len-- //Check to see if the client exists and isn't held by a new player - var/mob/client_mob = client_iterator?.mob - if(isnull(client_iterator) || !client_mob || isnewplayer(client_mob)) + var/mob/client_mob = client_iterator?.mob.hear_location() + if(isnull(client_iterator) || isnewplayer(client_mob)) ambience_listening_clients -= client_iterator client_old_areas -= client_iterator continue + if(!client_mob.can_hear()) + continue + //Check to see if the client-mob is in a valid area var/area/current_area = get_area(client_mob) if(!current_area) //Something's gone horribly wrong @@ -91,3 +94,45 @@ SUBSYSTEM_DEF(ambience) if(!M.has_light_nearby() && prob(0.5)) return ..(M, pick(minecraft_cave_noises)) return ..() + +/// Set the mob's tracked ambience area, and unset the old one. +/mob/proc/update_ambience_area(area/new_area) + var/old_tracked_area = ambience_tracked_area + if(old_tracked_area) + UnregisterSignal(old_tracked_area, COMSIG_AREA_POWER_CHANGE) + ambience_tracked_area = null + + if(new_area) + ambience_tracked_area = new_area + RegisterSignal(ambience_tracked_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(refresh_looping_ambience), TRUE) + + if(!client) + return + + refresh_looping_ambience() + +///Tries to play looping ambience to the mobs. +/mob/proc/refresh_looping_ambience() + SIGNAL_HANDLER + if(!client) + return + + var/sound_file = ambience_tracked_area?.ambient_buzz + + if(!(client.prefs.toggles & SOUND_SHIP_AMBIENCE) || !sound_file || !can_hear()) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) + client.playing_ambience = null + return + + //Station ambience is dependant on a functioning and charged APC. + if(!is_mining_level(ambience_tracked_area.z) && ((!ambience_tracked_area.apc || !ambience_tracked_area.apc.operating || !ambience_tracked_area.apc.cell?.charge && ambience_tracked_area.requires_power))) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) + client.playing_ambience = null + return + + else + if(client.playing_ambience == sound_file) + return + + client.playing_ambience = sound_file + SEND_SOUND(src, sound(sound_file, repeat = 1, wait = 0, volume = ambience_tracked_area.ambient_buzz_vol, channel = CHANNEL_BUZZ)) diff --git a/code/controllers/subsystem/ao.dm b/code/controllers/subsystem/ao.dm index 0b166e241a37..278de469ddb7 100644 --- a/code/controllers/subsystem/ao.dm +++ b/code/controllers/subsystem/ao.dm @@ -3,19 +3,23 @@ SUBSYSTEM_DEF(ao) init_order = INIT_ORDER_AO wait = 0 runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - flags = SS_HIBERNATE | SS_NO_INIT + flags = SS_HIBERNATE + + /// Stores image datums of AO for speed + var/list/image_cache = list() var/list/queue = list() var/list/cache = list() -/datum/controller/subsystem/ao/PreInit() - . = ..() +/datum/controller/subsystem/ao/stat_entry(msg) + msg += "P:[length(queue)]" + return ..() + +/datum/controller/subsystem/ao/Initialize(start_timeofday) hibernate_checks = list( NAMEOF(src, queue), ) - -/datum/controller/subsystem/ao/stat_entry(msg) - msg += "P:[length(queue)]" + fire(FALSE, TRUE) return ..() /datum/controller/subsystem/ao/fire(resumed = 0, no_mc_tick = FALSE) @@ -26,9 +30,10 @@ SUBSYSTEM_DEF(ao) if (!QDELETED(target)) if (target.ao_queued == AO_UPDATE_REBUILD) - var/old_n = target.ao_neighbors - target.calculate_ao_neighbors() - if (old_n != target.ao_neighbors) + var/old_n = target.ao_junction + var/old_z = target.ao_junction_mimic + target.calculate_ao_junction() + if (old_n != target.ao_junction || old_z != target.ao_junction_mimic) target.update_ao() else target.update_ao() diff --git a/code/controllers/subsystem/area_contents.dm b/code/controllers/subsystem/area_contents.dm new file mode 100644 index 000000000000..272c72eb7ea6 --- /dev/null +++ b/code/controllers/subsystem/area_contents.dm @@ -0,0 +1,55 @@ +#define ALLOWED_LOOSE_TURFS 500 +/** + * Responsible for managing the sizes of area.contained_turfs and area.turfs_to_uncontain + * These lists do not check for duplicates, which is fine, but it also means they can balloon in size over time + * as a consequence of repeated changes in area in a space + * They additionally may not always resolve often enough to avoid memory leaks + * This is annoying, so lets keep an eye on them and cut them down to size if needed + */ +SUBSYSTEM_DEF(area_contents) + name = "Area Contents" + flags = SS_NO_INIT + runlevels = RUNLEVEL_LOBBY|RUNLEVELS_DEFAULT + var/list/currentrun + var/list/area/marked_for_clearing = list() + +/datum/controller/subsystem/area_contents/stat_entry(msg) + var/total_clearing_from = 0 + var/total_to_clear = 0 + for(var/area/to_clear as anything in marked_for_clearing) + total_to_clear += length(to_clear.turfs_to_uncontain) + total_clearing_from += length(to_clear.contained_turfs) + msg = "A:[length(currentrun)] MR:[length(marked_for_clearing)] TC:[total_to_clear] CF:[total_clearing_from]" + return ..() + + +/datum/controller/subsystem/area_contents/fire(resumed) + if(!resumed) + currentrun = GLOB.areas.Copy() + + while(length(currentrun)) + var/area/test = currentrun[length(currentrun)] + if(length(test.turfs_to_uncontain) > ALLOWED_LOOSE_TURFS) + marked_for_clearing |= test + currentrun.len-- + if(MC_TICK_CHECK) + return + + // Alright, if we've done a scan on all our areas, it's time to knock the existing ones down to size + while(length(marked_for_clearing)) + var/area/clear = marked_for_clearing[length(marked_for_clearing)] + + // The operation of cutting large lists can be expensive + // It scales almost directly with the size of the list we're cutting with + // Because of this, we're gonna stick to cutting 1 entry at a time + // There's no reason to batch it I promise, this is faster. No overtime too + var/amount_cut = 0 + var/list/cut_from = clear.turfs_to_uncontain + for(amount_cut in 1 to length(cut_from)) + clear.contained_turfs -= cut_from[amount_cut] + if(MC_TICK_CHECK) + cut_from.Cut(1, amount_cut + 1) + return + + clear.turfs_to_uncontain = list() + marked_for_clearing.len-- diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/assets.dm index 72a9c59cb8d6..2c2e4095c7a7 100644 --- a/code/controllers/subsystem/assets.dm +++ b/code/controllers/subsystem/assets.dm @@ -23,9 +23,8 @@ SUBSYSTEM_DEF(assets) /datum/controller/subsystem/assets/Initialize(timeofday) - for(var/type in typesof(/datum/asset)) - var/datum/asset/A = type - if (type != initial(A._abstract)) + for(var/datum/asset/A as anything in typesof(/datum/asset)) + if (!isabstract(A)) load_asset_datum(type) transport.Initialize(cache) diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index 0346da88c64e..74e6108d4143 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -3,14 +3,16 @@ #define BAD_INIT_SLEPT 4 #define BAD_INIT_NO_HINT 8 +#define SUBSYSTEM_INIT_SOURCE "subsystem init" SUBSYSTEM_DEF(atoms) name = "Atoms" init_order = INIT_ORDER_ATOMS flags = SS_NO_FIRE - var/old_initialized - /// A count of how many initalize changes we've made. We want to prevent old_initialize being overriden by some other value, breaking init code - var/initialized_changed = 0 + /// A stack of list(source, desired initialized state) + /// We read the source of init changes from the last entry, and assert that all changes will come with a reset + var/list/initialized_state = list() + var/base_initialized var/list/late_loaders = list() @@ -38,7 +40,6 @@ SUBSYSTEM_DEF(atoms) initialized = INITIALIZATION_INNEW_MAPLOAD InitializeAtoms() initialized = INITIALIZATION_INNEW_REGULAR - return ..() #ifdef PROFILE_MAPLOAD_INIT_ATOM @@ -53,11 +54,16 @@ SUBSYSTEM_DEF(atoms) if(initialized == INITIALIZATION_INSSATOMS) return - set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD) + // Generate a unique mapload source for this run of InitializeAtoms + var/static/uid = 0 + uid = (uid + 1) % (SHORT_REAL_LIMIT - 1) + var/source = "subsystem init [uid]" + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, source) // This may look a bit odd, but if the actual atom creation runtimes for some reason, we absolutely need to set initialized BACK - CreateAtoms(atoms, atoms_to_return) - clear_tracked_initalize() + CreateAtoms(atoms, atoms_to_return, source) + clear_tracked_initalize(source) + SSicon_smooth.free_deferred(source) if(late_loaders.len) for(var/I in 1 to late_loaders.len) @@ -66,7 +72,6 @@ SUBSYSTEM_DEF(atoms) if(QDELETED(A)) continue A.LateInitialize() - testing("Late initialized [late_loaders.len] atoms") late_loaders.Cut() if (created_atoms) @@ -84,34 +89,51 @@ SUBSYSTEM_DEF(atoms) #endif /// Actually creates the list of atoms. Exists soley so a runtime in the creation logic doesn't cause initalized to totally break -/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null) +/datum/controller/subsystem/atoms/proc/CreateAtoms(list/atoms, list/atoms_to_return = null, mapload_source = null) if (atoms_to_return) LAZYINITLIST(created_atoms) + #ifdef TESTING var/count + #endif var/list/mapload_arg = list(TRUE) if(atoms) + #ifdef TESTING count = atoms.len - for(var/I in 1 to count) + #endif + + for(var/I in 1 to length(atoms)) var/atom/A = atoms[I] - if(!(A.flags_1 & INITIALIZED_1)) - CHECK_TICK + if(!(A.initialized)) + // Unrolled CHECK_TICK setup to let us enable/disable mapload based off source + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) PROFILE_INIT_ATOM_BEGIN() InitAtom(A, TRUE, mapload_arg) PROFILE_INIT_ATOM_END(A) else + #ifdef TESTING count = 0 + #endif for(var/atom/A in world) - if(!(A.flags_1 & INITIALIZED_1)) + if(!(A.initialized)) PROFILE_INIT_ATOM_BEGIN() InitAtom(A, FALSE, mapload_arg) PROFILE_INIT_ATOM_END(A) + #ifdef TESTING ++count - CHECK_TICK + #endif + if(TICK_CHECK) + clear_tracked_initalize(mapload_source) + stoplag() + if(mapload_source) + set_tracked_initalized(INITIALIZATION_INNEW_MAPLOAD, mapload_source) testing("Initialized [count] atoms") - pass(count) /// Init this specific atom /datum/controller/subsystem/atoms/proc/InitAtom(atom/A, from_template = FALSE, list/arguments) @@ -122,37 +144,41 @@ SUBSYSTEM_DEF(atoms) BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE return TRUE + //Linter already handles this, just in case. + #ifdef UNIT_TESTS var/start_tick = world.time + #endif var/result = A.Initialize(arglist(arguments)) + #ifdef UNIT_TESTS if(start_tick != world.time) BadInitializeCalls[the_type] |= BAD_INIT_SLEPT - + #endif var/qdeleted = FALSE - if(result != INITIALIZE_HINT_NORMAL) - switch(result) - if(INITIALIZE_HINT_LATELOAD) - if(arguments[1]) //mapload - late_loaders += A - else - A.LateInitialize() - if(INITIALIZE_HINT_QDEL) - qdel(A) - qdeleted = TRUE - if(INITIALIZE_HINT_QDEL_FORCE) - qdel(A, force = TRUE) - qdeleted = TRUE + switch(result) + if(INITIALIZE_HINT_NORMAL) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A else - BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + A.LateInitialize() + 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 if(!A) //possible harddel qdeleted = TRUE - else if(!(A.flags_1 & INITIALIZED_1)) + else if(!(A.initialized)) BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT else - if(ismovable(A)) + if(ismovable(A) && !qdeleted) A.loc?.Entered(A) 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 @@ -160,31 +186,50 @@ SUBSYSTEM_DEF(atoms) return qdeleted || QDELING(A) -/datum/controller/subsystem/atoms/proc/map_loader_begin() - set_tracked_initalized(INITIALIZATION_INSSATOMS) - -/datum/controller/subsystem/atoms/proc/map_loader_stop() - clear_tracked_initalize() - -/// Use this to set initialized to prevent error states where old_initialized is overriden. It keeps happening and it's cheesing me off -/datum/controller/subsystem/atoms/proc/set_tracked_initalized(value) - if(!initialized_changed) - old_initialized = initialized - initialized = value - else - stack_trace("We started maploading while we were already maploading. You doing something odd?") - initialized_changed += 1 +/datum/controller/subsystem/atoms/proc/map_loader_begin(source) + set_tracked_initalized(INITIALIZATION_INSSATOMS, source) + +/datum/controller/subsystem/atoms/proc/map_loader_stop(source) + clear_tracked_initalize(source) + +/// Returns the source currently modifying SSatom's init behavior +/datum/controller/subsystem/atoms/proc/get_initialized_source() + var/state_length = length(initialized_state) + if(!state_length) + return null + return initialized_state[state_length][1] + +/// Use this to set initialized to prevent error states where the old initialized is overriden, and we end up losing all context +/// Accepts a state and a source, the most recent state is used, sources exist to prevent overriding old values accidentially +/datum/controller/subsystem/atoms/proc/set_tracked_initalized(state, source) + if(!length(initialized_state)) + base_initialized = initialized + initialized_state += list(list(source, state)) + initialized = state + +/datum/controller/subsystem/atoms/proc/clear_tracked_initalize(source) + if(!length(initialized_state)) + return + for(var/i in length(initialized_state) to 1 step -1) + if(initialized_state[i][1] == source) + initialized_state.Cut(i, i+1) + break + + if(!length(initialized_state)) + initialized = base_initialized + base_initialized = INITIALIZATION_INNEW_REGULAR + return + initialized = initialized_state[length(initialized_state)][2] -/datum/controller/subsystem/atoms/proc/clear_tracked_initalize() - initialized_changed -= 1 - if(!initialized_changed) - initialized = old_initialized +/// Returns TRUE if anything is currently being initialized +/datum/controller/subsystem/atoms/proc/initializing_something() + return length(initialized_state) > 1 /datum/controller/subsystem/atoms/Recover() initialized = SSatoms.initialized if(initialized == INITIALIZATION_INNEW_MAPLOAD) InitializeAtoms() - old_initialized = SSatoms.old_initialized + initialized_state = SSatoms.initialized_state BadInitializeCalls = SSatoms.BadInitializeCalls /datum/controller/subsystem/atoms/proc/setupGenetics() diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 488ff4866496..ff9516c61866 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -80,8 +80,6 @@ SUBSYSTEM_DEF(blackbox) /datum/controller/subsystem/blackbox/proc/FinalFeedback() record_feedback("tally", "ahelp_stats", GLOB.ahelp_tickets.active_tickets.len, "unresolved") for (var/obj/machinery/telecomms/message_server/MS in GLOB.telecomms_list) - if (MS.pda_msgs.len) - record_feedback("tally", "radio_usage", MS.pda_msgs.len, "PDA") if (MS.rc_msgs.len) record_feedback("tally", "radio_usage", MS.rc_msgs.len, "request console") @@ -235,27 +233,35 @@ Versioning return if(!islist(FV.json["data"])) FV.json["data"] = list() + if(overwrite) FV.json["data"] = data else FV.json["data"] |= data + if("amount") FV.json["data"] += increment + if("tally") if(!islist(FV.json["data"])) FV.json["data"] = list() FV.json["data"]["[data]"] += increment + if("nested tally") if(!islist(data)) return + if(!islist(FV.json["data"])) FV.json["data"] = list() FV.json["data"] = record_feedback_recurse_list(FV.json["data"], data, increment) + if("associative") if(!islist(data)) return + if(!islist(FV.json["data"])) FV.json["data"] = list() + var/pos = length(FV.json["data"]) + 1 FV.json["data"]["[pos]"] = list() //in 512 "pos" can be replaced with "[FV.json["data"].len+1]" for(var/i in data) diff --git a/code/controllers/subsystem/circuit_component.dm b/code/controllers/subsystem/circuit_component.dm index 079422071441..893f38925df6 100644 --- a/code/controllers/subsystem/circuit_component.dm +++ b/code/controllers/subsystem/circuit_component.dm @@ -35,7 +35,6 @@ SUBSYSTEM_DEF(circuit_component) to_call.user = null to_call.InvokeAsync() - qdel(to_call) if(MC_TICK_CHECK) @@ -83,7 +82,6 @@ SUBSYSTEM_DEF(circuit_component) instant_run_currentrun.Cut(1,2) to_call.user = null to_call.InvokeAsync(received_inputs) - qdel(to_call) if(length(instant_run_stack)) instant_run_callbacks_to_run = pop(instant_run_stack) diff --git a/code/controllers/subsystem/codex.dm b/code/controllers/subsystem/codex.dm index 469f6b123d0c..693e77a3fbea 100644 --- a/code/controllers/subsystem/codex.dm +++ b/code/controllers/subsystem/codex.dm @@ -7,29 +7,44 @@ SUBSYSTEM_DEF(codex) var/regex/trailingLinebreakRegexStart var/regex/trailingLinebreakRegexEnd + /// All entries. Unkeyed. var/list/all_entries = list() + /// All STATIC entries, By path. Does not include dynamic entries. var/list/entries_by_path = list() + /// All entries, by name. var/list/entries_by_string = list() + /// The same as above, but sorted (?) var/list/index_file = list() + /// Search result cache, so we don't need to hit the DB every time. var/list/search_cache = list() + /// All categories. var/list/codex_categories = list() + /// Codex Database Connection + var/database/codex_index + +/datum/controller/subsystem/codex/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("", "---") + VV_DROPDOWN_OPTION(VV_HK_REGENERATE_CODEX, "Regenerate Search Database") + +/datum/controller/subsystem/codex/vv_do_topic(href_list) + . = ..() + if(href_list[VV_HK_REGENERATE_CODEX]) + if(tgui_alert(usr, "Are you sure you want to regenerate the search index? This will almost certainly cause lag.", "Regenerate Index", list("Yes", "No")) == "Yes") + prepare_search_database(TRUE) + + /datum/controller/subsystem/codex/Initialize() // Codex link syntax is such: // keyword when keyword is mentioned verbatim, // whatever when shit gets tricky linkRegex = regex(@"<(span|l)(\s+codexlink='([^>]*)'|)>([^<]+)","g") - // used to remove trailing linebreaks when retrieving codex body. - // TODO: clean up codex page generation so this isn't necessary. - trailingLinebreakRegexStart = regex(@"^<\s*\/*\s*br\s*\/*\s*>", "ig") - trailingLinebreakRegexEnd = regex(@"<\s*\/*\s*br\s*\/*\s*>$", "ig") - // Create general hardcoded entries. - for(var/ctype in subtypesof(/datum/codex_entry)) - var/datum/codex_entry/centry = ctype - if(initial(centry.name) && !(initial(centry.abstract_type) == centry)) - centry = new centry() + for(var/datum/codex_entry/entry as anything in subtypesof(/datum/codex_entry)) + if(initial(entry.name) && !(isabstract(entry))) + entry = new entry() // Create categorized entries. var/list/deferred_population = list() @@ -50,6 +65,9 @@ SUBSYSTEM_DEF(codex) for(var/datum/codex_entry/entry as anything in all_entries) index_file[entry.name] = entry index_file = sortTim(index_file, GLOBAL_PROC_REF(cmp_text_asc)) + + // Prepare the search database. + prepare_search_database() . = ..() /datum/controller/subsystem/codex/proc/parse_links(string, viewer) @@ -65,6 +83,7 @@ SUBSYSTEM_DEF(codex) string = replacetextEx(string, linkRegex.match, replacement) return string +/// Returns a codex entry for the given query. May return a list if multiple are found, or null if none. /datum/controller/subsystem/codex/proc/get_codex_entry(entry) if(isatom(entry)) var/atom/entity = entry @@ -72,6 +91,9 @@ SUBSYSTEM_DEF(codex) if(.) return return entries_by_path[entity.type] || get_entry_by_string(entity.name) + + if(isdatum(entry)) + entry = entry:type if(ispath(entry)) return entries_by_path[entry] if(istext(entry)) @@ -80,42 +102,131 @@ SUBSYSTEM_DEF(codex) /datum/controller/subsystem/codex/proc/get_entry_by_string(string) return entries_by_string[codex_sanitize(string)] +/// Presents a codex entry to a mob. If it receives a list of entries, it will prompt them to choose one. /datum/controller/subsystem/codex/proc/present_codex_entry(mob/presenting_to, datum/codex_entry/entry) - if(entry && istype(presenting_to) && presenting_to.client) - var/datum/browser/popup = new(presenting_to, "codex", "Codex", nheight=425) //"codex\ref[entry]" - var/entry_data = entry.get_codex_body(presenting_to) - popup.set_content(parse_links(jointext(entry_data, null), presenting_to)) - popup.open() + if(!entry || !istype(presenting_to) || !presenting_to.client) + return + + if(islist(entry)) + present_codex_search(presenting_to, entry) + return + + var/datum/browser/popup = new(presenting_to, "codex", "Codex", nheight=425) //"codex\ref[entry]" + var/entry_data = entry.get_codex_body(presenting_to) + popup.set_content(parse_links(jointext(entry_data, null), presenting_to)) + popup.open() + +#define CODEX_ENTRY_LIMIT 10 +/// Presents a list of codex entries to a mob. +/datum/controller/subsystem/codex/proc/present_codex_search(mob/presenting_to, list/entries, search_query) + var/list/codex_data = list() + codex_data += "

[entries.len] matches[search_query ? " for '[search_query]'" : ""]:

" + + if(LAZYLEN(entries) > CODEX_ENTRY_LIMIT) + codex_data += "Showing first [CODEX_ENTRY_LIMIT] entries. [entries.len - CODEX_ENTRY_LIMIT] result\s omitted.
" + codex_data += "" + + for(var/i = 1 to min(entries.len, CODEX_ENTRY_LIMIT)) + var/datum/codex_entry/entry = entries[i] + codex_data += "" + codex_data += "
[entry.name]View
" + + var/datum/browser/popup = new(presenting_to, "codex-search", "Codex Search") //"codex-search" + popup.set_content(codex_data.Join()) + popup.open() + /datum/controller/subsystem/codex/proc/get_guide(category) var/datum/codex_category/cat = codex_categories[category] . = cat?.guide_html +/// Perform a full-text search through all codex entries. Entries matching the query by name will be shown first. +/// Results are cached. Relies on the index database. /datum/controller/subsystem/codex/proc/retrieve_entries_for_string(searching) - if(!initialized) - return list() - searching = codex_sanitize(searching) - if(!searching) + . = search_cache[searching] + if(.) + return . + if(!searching || !initialized) return list() - if(!search_cache[searching]) - var/list/results - if(entries_by_string[searching]) - results = list(entries_by_string[searching]) - else - results = list() - for(var/entry_title in entries_by_string) - var/datum/codex_entry/entry = entries_by_string[entry_title] - if(findtext(entry.name, searching) || findtext(entry.lore_text, searching) || findtext(entry.mechanics_text, searching) || findtext(entry.antag_text, searching)) - results |= entry - search_cache[searching] = sortTim(results, GLOBAL_PROC_REF(cmp_name_asc)) - return search_cache[searching] + if(!codex_index) //No codex DB loaded. Use the fallback search. + return text_search_no_db(searching) + + + var/search_string = "%[searching]%" + // Search by name to build the priority entries first + var/database/query/cursor = new( + {"SELECT name FROM codex_entries + WHERE name LIKE ? + ORDER BY name asc + LIMIT [CODEX_ENTRY_LIMIT]"}, + search_string + ) + // Execute the query, returning us a list of types we can retrieve from the list indexes. + cursor.Execute(codex_index) + + // God this sucks. + var/list/datum/codex_entry/priority_results = list() + while(cursor.NextRow()) + var/row = cursor.GetRowData() + priority_results += index_file[row["name"]] + CHECK_TICK + + // Now the awful slow ones. + cursor.Add( + {"SELECT name FROM codex_entries + WHERE lore_text LIKE ? + AND mechanics_text LIKE ? + AND antag_text LIKE ? + ORDER BY name asc + LIMIT [CODEX_ENTRY_LIMIT]"}, + search_string, + search_string, + search_string + ) + // Execute the query, returning us a list of types we can retrieve from the list indexes. + cursor.Execute(codex_index) + var/list/datum/codex_entry/fulltext_results = list() + while(cursor.NextRow()) + var/row = cursor.GetRowData() + fulltext_results += index_file[row["name"]] + CHECK_TICK + + priority_results += fulltext_results + . = search_cache[searching] = priority_results + +/// Straight-DM implimentation of full text search. Objectively garbage. +/// Does not use the DB. Used when database loading is skipped. +/// Argument has already been sanitized. +/// Safety checks have already been done. Cache has already been checked. +/datum/controller/subsystem/codex/proc/text_search_no_db(searching) + PRIVATE_PROC(TRUE) + + var/list/results = list() + var/list/priority_results = list() + + if(entries_by_string[searching]) + results += entries_by_string[searching] + else + for(var/datum/codex_entry/entry as anything in all_entries) + if(findtext(entry.name, searching)) + priority_results += entry + + else if(findtext(entry.lore_text, searching) || findtext(entry.mechanics_text, searching) || findtext(entry.antag_text, searching)) + results += entry + + sortTim(priority_results, GLOBAL_PROC_REF(cmp_name_asc)) + sortTim(results, GLOBAL_PROC_REF(cmp_name_asc)) + + priority_results += results + search_cache[searching] = priority_results + . = search_cache[searching] /datum/controller/subsystem/codex/Topic(href, href_list) . = ..() if(!. && href_list["show_examined_info"] && href_list["show_to"]) - var/mob/showing_mob = locate(href_list["show_to"]) + var/mob/showing_mob = locate(href_list["show_to"]) if(!istype(showing_mob)) return var/atom/showing_atom = locate(href_list["show_examined_info"]) @@ -130,3 +241,125 @@ SUBSYSTEM_DEF(codex) if(entry) present_codex_entry(showing_mob, entry) return TRUE + +#define CODEX_SEARCH_INDEX_FILE "codex.db" +#define CODEX_SERIAL_ALWAYS_VALID "I_DOWNLOADED_A_ZIP_INSTEAD_OF_USING_GIT" +/// Prepare the search database. +/datum/controller/subsystem/codex/proc/prepare_search_database(drop_existing = FALSE) + if(GLOB.is_debug_server && !FORCE_CODEX_DATABASE) + to_chat(world, span_debug("Codex: Debug server detected. DB operation disabled.")) + log_world("Codex: Codex DB generation Skipped") + return + if(drop_existing) + to_chat(world, span_debug("Codex: Deleting old index...")) + //Check if we've already opened one this round, if so, get rid of it. + if(codex_index) + del(codex_index) + fdel(CODEX_SEARCH_INDEX_FILE) + else + to_chat(world, span_debug("Codex: Preparing Search Database")) + + + if(!rustg_file_exists(CODEX_SEARCH_INDEX_FILE)) + if(!drop_existing) + to_chat(world, span_debug("Codex: Database missing, building...")) + create_db() + build_db_index() + + if(!codex_index) //If we didn't just create it, we need to load it. + codex_index = new(CODEX_SEARCH_INDEX_FILE) + + var/database/query/cursor = new("SELECT * FROM _info") + if(!cursor.Execute(codex_index)) + to_chat(world, span_debug("Codex: ABORTING! Database error: [cursor.Error()] | [cursor.ErrorMsg()]")) + return + + cursor.NextRow() + var/list/revline = cursor.GetRowData() + var/db_serial = revline["revision"] + if(db_serial != GLOB.revdata.commit) + if(db_serial == CODEX_SERIAL_ALWAYS_VALID) + to_chat(world, span_debug("Codex: Special Database Serial detected. Data may be inaccurate or out of date.")) + else + to_chat(world, span_debug("Codex: Database out of date, Rebuilding...")) + prepare_search_database(TRUE) //recursiveness funny,, + return + + if(drop_existing) + to_chat(world, span_debug("Codex: Collation complete.\nCodex: Index ready.")) + return + to_chat(world, span_debug("Codex: Database Serial validated.\nCodex: Loading complete.")) + +/datum/controller/subsystem/codex/proc/create_db() + // No index? Make one. + + to_chat(world, span_debug("Codex: Writing new database file...")) + //We explicitly store the DB in the root directory, so that TGS builds wipe it. + codex_index = new(CODEX_SEARCH_INDEX_FILE) + + /// Holds the revision the index was compiled for. If it's different then live, we need to regenerate the index. + var/static/create_info_schema = {" + CREATE TABLE "_info" ( + "revision" TEXT + );"} + + //Create the initial schema + var/database/query/init_cursor = new(create_info_schema) + + if(!init_cursor.Execute(codex_index)) + to_chat(world, span_debug("Codex: ABORTING! Database error: [init_cursor.Error()] | [init_cursor.ErrorMsg()]")) + return + + // Holds all codex entries to enable accelerated text search. + var/static/create_codex_schema = {" + CREATE TABLE "codex_entries" ( + "name" TEXT NOT NULL, + "lore_text" TEXT, + "mechanics_text" TEXT, + "antag_text" TEXT, + PRIMARY KEY("name") + );"} + + init_cursor.Add(create_codex_schema) + if(!init_cursor.Execute(codex_index)) + to_chat(world, span_debug("Codex: ABORTING! Database error: [init_cursor.Error()] | [init_cursor.ErrorMsg()]")) + return + + var/revid = GLOB.revdata.commit + if(!revid) //zip download, you're on your own pissboy, The serial will always be considered valid. + revid = CODEX_SERIAL_ALWAYS_VALID + + //Insert the revision header. + init_cursor.Add("INSERT INTO _info (revision) VALUES (?)", revid) + if(!init_cursor.Execute(codex_index)) + to_chat(world, span_debug("Codex: ABORTING! Database error: [init_cursor.Error()] | [init_cursor.ErrorMsg()]")) + return + +/datum/controller/subsystem/codex/proc/build_db_index() + to_chat(world, span_debug("Codex: Building search index.")) + + var/database/query/cursor = new + var/total_entries = length(all_entries) + to_chat(world, span_debug("\tCodex: Collating [total_entries] records...")) + var/record_id = 0 //Counter for debugging. + for(var/datum/codex_entry/entry as anything in all_entries) + cursor.Add( + "INSERT INTO codex_entries (name, lore_text, mechanics_text, antag_text) VALUES (?,?,?,?)", + entry.name, + entry.lore_text, + entry.mechanics_text, + entry.antag_text + ) + + if(!cursor.Execute(codex_index)) + to_chat(world, span_debug("Codex: ABORTING! Database error: [cursor.Error()] | [cursor.ErrorMsg()]")) + return + + record_id++ + if((!(record_id % 100)) || (record_id == total_entries)) + to_chat(world, span_debug("\tCodex: [record_id]/[total_entries]...")) + + CHECK_TICK //We'd deadlock the server otherwise. + +#undef CODEX_SEARCH_INDEX_FILE +#undef CODEX_ENTRY_LIMIT diff --git a/code/controllers/subsystem/communications.dm b/code/controllers/subsystem/communications.dm index 98e074897f42..b9108f74b447 100644 --- a/code/controllers/subsystem/communications.dm +++ b/code/controllers/subsystem/communications.dm @@ -18,16 +18,17 @@ SUBSYSTEM_DEF(communications) else return FALSE -/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input, syndicate, list/players) +/datum/controller/subsystem/communications/proc/make_announcement(mob/living/user, is_silicon, input, syndicate, list/players, sender_name = JOB_CAPTAIN) if(!can_announce(user, is_silicon)) return FALSE + if(is_silicon) minor_announce(html_decode(input),"Station Announcement by [user.name] (AI)", players = players) COOLDOWN_START(src, silicon_message_cooldown, COMMUNICATION_COOLDOWN_AI) else priority_announce( html_decode(user.treat_message(input)), - "Station Announcement by Captain", + "Station Announcement by [sender_name]", sound_type = 'sound/misc/announce.ogg', send_to_newscaster = !syndicate, do_not_modify = TRUE, @@ -72,7 +73,7 @@ SUBSYSTEM_DEF(communications) message_admins("[ADMIN_LOOKUPFLW(user)] has called an emergency meeting.") /datum/controller/subsystem/communications/proc/send_message(datum/comm_message/sending,print = TRUE,unique = FALSE) - for(var/obj/machinery/computer/communications/C in GLOB.machines) + for(var/obj/machinery/computer/communications/C as anything in INSTANCES_OF(/obj/machinery/computer/communications)) if(!(C.machine_stat & (BROKEN|NOPOWER)) && is_station_level(C.z)) if(unique) C.add_message(sending) diff --git a/code/controllers/subsystem/credits.dm b/code/controllers/subsystem/credits.dm index 7d8d7c7c0eb8..11b8d9b26366 100644 --- a/code/controllers/subsystem/credits.dm +++ b/code/controllers/subsystem/credits.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(credits) name = "Credits" flags = SS_NO_FIRE|SS_NO_INIT - var/scroll_speed = 1 //Lower is faster. + var/pixels_per_second = 50 var/splash_time = 2750 //Time in miliseconds that each head of staff/star/production staff etc splash screen gets before displaying the next one. var/control = "mapwindow.credits" //if updating this, update in credits.html as well @@ -90,7 +90,7 @@ SUBSYSTEM_DEF(credits) var/scrollytext = ss_string + episode_string + cast_string + disclaimers_string + fallen_string var/splashytext = producers_string + star_string - js_args = list(scrollytext, splashytext, theme, scroll_speed, splash_time) //arguments for the makeCredits function back in the javascript + js_args = list(scrollytext, splashytext, theme, pixels_per_second, splash_time) //arguments for the makeCredits function back in the javascript finalized = TRUE /* @@ -117,22 +117,23 @@ SUBSYSTEM_DEF(credits) if(customized_name) episode_name = customized_name return + var/list/drafted_names = list() - var/list/name_reasons = list() - var/list/is_rare_assoc_list = list() + for(var/datum/episode_name/N as anything in episode_names) - drafted_names["[N.thename]"] = N.weight - name_reasons["[N.thename]"] = N.reason - is_rare_assoc_list["[N.thename]"] = N.rare - episode_name = pick_weight(drafted_names) - episode_reason = name_reasons[episode_name] - if(is_rare_assoc_list[episode_name] == TRUE) + drafted_names[N] = N.weight + + var/datum/episode_name/chosen = pick_weight(drafted_names) + episode_name = chosen.thename + episode_reason = chosen.reason + if(chosen.rare) rare_episode_name = TRUE /datum/controller/subsystem/credits/proc/finalize_episodestring() var/season = time2text(world.timeofday,"YY") var/episodenum = GLOB.round_id || 1 - episode_string = "

SEASON [season] EPISODE [episodenum]
[episode_name]


" + var/reason = episode_reason ? "

[episode_reason]

" : "" + episode_string = "

SEASON [season] EPISODE [episodenum]
[episode_name]

[reason]
" log_game("So ends [is_rerun() ? "another rerun of " : ""]SEASON [season] EPISODE [episodenum] - [episode_name] ... [customized_ss]") /datum/controller/subsystem/credits/proc/finalize_disclaimerstring() @@ -163,7 +164,7 @@ SUBSYSTEM_DEF(credits) for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == DEAD) continue - if(H.mind.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(H.mind.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER) heads_of_staff += H for(var/mob/living/carbon/human/H as anything in heads_of_staff) @@ -200,6 +201,9 @@ SUBSYSTEM_DEF(credits) var/list/dead_names = list() var/cast_count for(var/datum/mind/M as anything in SSticker.minds) + if(isobserver(M.current)) + continue + if(M.key && M.name) if(!M.current || (M.current.stat == DEAD)) //Their body was destroyed or they are simply dead dead_names += M.name @@ -223,21 +227,15 @@ SUBSYSTEM_DEF(credits) cast_string += "[name]
" cast_string += "
" -/mob/living/proc/get_credits_entry() +/mob/proc/get_credits_entry() + var/datum/preferences/prefs = GLOB.preferences_datums[ckey(mind.key)] + if(prefs.read_preference(/datum/preference/toggle/credits_uses_ckey)) + return "[uppertext(ckey(mind.key))] as [name]" + else + return "[uppertext(name)] as [initial(name)]" + +/mob/living/get_credits_entry() var/datum/preferences/prefs = GLOB.preferences_datums[ckey(mind.key)] - /// initial(name) is used over this now. - /*var/gender_text - switch(gender) - if("male") - gender_text = "Himself" - if("female") - gender_text = "Herself" - if("neuter") - gender_text = "Themself" - if("plural") - gender_text = "Themselves" - else - gender_text = "Itself"*/ if(prefs.read_preference(/datum/preference/toggle/credits_uses_ckey)) return "[uppertext(ckey(mind.key))] as [name]" diff --git a/code/controllers/subsystem/datacore.dm b/code/controllers/subsystem/datacore.dm new file mode 100644 index 000000000000..3e0cf7277f95 --- /dev/null +++ b/code/controllers/subsystem/datacore.dm @@ -0,0 +1,376 @@ + +///Dummy mob reserve slot for manifest +#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" + +SUBSYSTEM_DEF(datacore) + name = "Data Core" + flags = SS_NO_FIRE + init_order = INIT_ORDER_DATACORE + + /// A list of data libraries keyed by DATACORE_RECORDS_* + var/list/datum/data_library/library = list( + DATACORE_RECORDS_STATION, + DATACORE_RECORDS_SECURITY, + DATACORE_RECORDS_MEDICAL, + DATACORE_RECORDS_LOCKED, + DATACORE_RECORDS_DAEDALUS, + DATACORE_RECORDS_AETHER, + DATACORE_RECORDS_HERMES, + DATACORE_RECORDS_MARS + ) + + var/securityPrintCount = 0 + var/securityCrimeCounter = 0 + var/medicalPrintCount = 0 + + /// Set to TRUE when the initial roundstart manifest is complete + var/finished_setup = FALSE + + var/list/datum/callback/datacore_ready_callbacks = list() + +/datum/controller/subsystem/datacore/Initialize(start_timeofday) + for(var/id in library) + library[id] = new /datum/data_library + return ..() + +/datum/controller/subsystem/datacore/Recover() + library = SSdatacore.library + securityCrimeCounter = SSdatacore.securityCrimeCounter + medicalPrintCount = SSdatacore.medicalPrintCount + finished_setup = SSdatacore.finished_setup + +/// Returns a data record or null. +/datum/controller/subsystem/datacore/proc/get_record_by_name(name, record_type = DATACORE_RECORDS_STATION) + RETURN_TYPE(/datum/data/record) + + return library[record_type].get_record_by_name(name) + +/// Returns a data library's records list +/datum/controller/subsystem/datacore/proc/get_records(record_type = DATACORE_RECORDS_STATION) + RETURN_TYPE(/list) + return library[record_type].records + +/datum/controller/subsystem/datacore/proc/find_record(field, needle, haystack) + RETURN_TYPE(/datum/data/record) + for(var/datum/data/record/record_to_check in get_records(haystack)) + if(record_to_check.fields[field] == needle) + return record_to_check + +/// Empties out a library +/datum/controller/subsystem/datacore/proc/wipe_records(record_type) + var/datum/data_library/to_wipe = library[record_type] + if(!to_wipe) + return + + QDEL_LIST(to_wipe.records) + +/// Grab all PDA network IDs by department. +/datum/controller/subsystem/datacore/proc/get_pda_netids(record_type = DATACORE_RECORDS_STATION) + RETURN_TYPE(/list) + . = list() + + for(var/datum/data/record/R as anything in get_records(record_type)) + var/id = R.fields[DATACORE_PDA_ID] + if(id) + . += id + +/// Removes a person from history. Except locked. That's permanent history. +/datum/controller/subsystem/datacore/proc/demanifest(name) + for(var/id in library - DATACORE_RECORDS_LOCKED) + var/datum/data/record/R = get_record_by_name(name, id) + qdel(R) + +/datum/controller/subsystem/datacore/proc/inject_record(datum/data/record/R, record_type) + if(isnull(record_type)) + CRASH("inject_record() called with no record type") + + library[record_type].inject_record(R) + +/// Create the roundstart manifest using the newplayer list. +/datum/controller/subsystem/datacore/proc/generate_manifest() + for(var/mob/dead/new_player/N as anything in GLOB.new_player_list) + if(N.new_character) + log_manifest(N.ckey, N.new_character.mind, N.new_character) + + if(ishuman(N.new_character)) + manifest_inject(N.new_character, N.client) + + CHECK_TICK + + finished_setup = TRUE + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_DATACORE_READY, src) + invoke_datacore_callbacks() + +/// Add a callback to execute when the datacore has loaded +/datum/controller/subsystem/datacore/proc/OnReady(datum/callback/CB) + if(finished_setup) + CB.InvokeAsync() + else + datacore_ready_callbacks += CB + +/datum/controller/subsystem/datacore/proc/invoke_datacore_callbacks() + for(var/datum/callback/CB as anything in datacore_ready_callbacks) + CB.InvokeAsync() + + datacore_ready_callbacks.Cut() + +/datum/controller/subsystem/datacore/proc/manifest_modify(name, assignment, trim) + var/datum/data/record/foundrecord = library[DATACORE_RECORDS_STATION].get_record_by_name(name) + if(foundrecord) + foundrecord.fields[DATACORE_RANK] = assignment + foundrecord.fields[DATACORE_TRIM] = trim + +/datum/controller/subsystem/datacore/proc/get_manifest(record_type = DATACORE_RECORDS_STATION) + // First we build up the order in which we want the departments to appear in. + var/list/manifest_out = list() + for(var/datum/job_department/department as anything in SSjob.departments) + if(department.exclude_from_latejoin) + continue + manifest_out[department.department_name] = list() + + manifest_out[DEPARTMENT_UNASSIGNED] = list() + + var/list/departments_by_type = SSjob.departments_by_type + + for(var/datum/data/record/record as anything in SSdatacore.get_records(record_type)) + var/name = record.fields[DATACORE_NAME] + var/rank = record.fields[DATACORE_RANK] // user-visible job + var/trim = record.fields[DATACORE_TRIM] // internal jobs by trim type + var/datum/job/job = SSjob.GetJob(trim) + + // Filter out jobs that aren't on the manifest, move them to "unassigned" + if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) + var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED] + misc_list[++misc_list.len] = list( + "name" = name, + "rank" = rank, + "trim" = trim, + ) + continue + + for(var/department_type as anything in job.departments_list) + var/datum/job_department/department = departments_by_type[department_type] + + if(!department) + stack_trace("get_manifest() failed to get job department for [department_type] of [job.type]") + continue + + if(department.is_not_real_department) + continue + + var/list/entry = list( + "name" = name, + "rank" = rank, + "trim" = trim, + ) + + var/list/department_list = manifest_out[department.department_name] + if(istype(job, department.department_head)) + department_list.Insert(1, null) + department_list[1] = entry + else + department_list[++department_list.len] = entry + + // Trim the empty categories. + for (var/department in manifest_out) + if(!length(manifest_out[department])) + manifest_out -= department + + return manifest_out + +/datum/controller/subsystem/datacore/proc/get_manifest_html(record_key = DATACORE_RECORDS_STATION, monochrome = FALSE) + var/list/manifest = get_manifest(record_key) + var/dat = {" + + + + "} + for(var/department in manifest) + var/list/entries = manifest[department] + dat += "" + //JUST + var/even = FALSE + for(var/entry in entries) + var/list/entry_list = entry + dat += "" + even = !even + + dat += "
NameRank
[department]
[entry_list["name"]][entry_list["rank"] == entry_list["trim"] ? entry_list["rank"] : "[entry_list["rank"]] ([entry_list["trim"]])"]
" + dat = replacetext(dat, "\n", "") + dat = replacetext(dat, "\t", "") + return dat + +/datum/controller/subsystem/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C) + SHOULD_NOT_SLEEP(TRUE) + var/static/list/show_directions = list(SOUTH, WEST) + if(!(H.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST)) + return + + var/datum/job/job = H.mind.assigned_role + var/assignment = H.mind.assigned_role.title + + //PARIAH EDIT ADDITION + // The alt job title, if user picked one, or the default + var/chosen_assignment = C?.prefs.alt_job_titles[assignment] || assignment + //PARIAH EDIT END + + var/static/record_id_num = 1001 + var/id = num2hex(record_id_num++,6) + if(!C) + C = H.client + + var/mutable_appearance/character_appearance = new(H.appearance) + remove_non_canon_overlays(character_appearance) + + //General Record + var/datum/data/record/general/G = new() + G.fields[DATACORE_ID] = id + + G.fields[DATACORE_NAME] = H.real_name + G.fields[DATACORE_RANK] = chosen_assignment //PARIAH EDIT + G.fields[DATACORE_TRIM] = assignment + G.fields[DATACORE_INITIAL_RANK] = assignment + G.fields[DATACORE_AGE] = H.age + G.fields[DATACORE_SPECIES] = H.dna.species.name + G.fields[DATACORE_FINGERPRINT] = H.get_fingerprints(TRUE) + G.fields[DATACORE_PHYSICAL_HEALTH] = "Active" + G.fields[DATACORE_MENTAL_HEALTH] = "Stable" + G.fields[DATACORE_GENDER] = H.gender + if(H.gender == "male") + G.fields[DATACORE_GENDER] = "Male" + else if(H.gender == "female") + G.fields[DATACORE_GENDER] = "Female" + else + G.fields[DATACORE_GENDER] = "Other" + G.fields[DATACORE_APPEARANCE] = character_appearance + var/obj/item/modular_computer/tablet/pda/pda = locate() in H + if(pda) + var/obj/item/computer_hardware/network_card/packetnet/rfcard = pda.all_components[MC_NET] + if(istype(rfcard)) + G.fields[DATACORE_PDA_ID] = rfcard.hardware_id + + library[DATACORE_RECORDS_STATION].inject_record(G) + + // Add to company-specific manifests + var/datum/job_department/department = SSjob.departments_by_type[job.departments_list?[1]] + if(department?.manifest_key) + library[department.manifest_key].inject_record(G) + + //Medical Record + var/datum/data/record/medical/M = new() + M.fields[DATACORE_ID] = id + M.fields[DATACORE_NAME] = H.real_name + M.fields[DATACORE_BLOOD_TYPE] = H.dna.blood_type.name + M.fields[DATACORE_BLOOD_DNA] = H.dna.unique_enzymes + M.fields[DATACORE_DISABILITIES] = H.get_quirk_string(FALSE, CAT_QUIRK_DISABILITIES) + M.fields[DATACORE_DISABILITIES_DETAILS] = H.get_quirk_string(TRUE, CAT_QUIRK_DISABILITIES) + M.fields[DATACORE_DISEASES] = "None" + M.fields[DATACORE_DISEASES_DETAILS] = "No diseases have been diagnosed at the moment." + M.fields[DATACORE_NOTES] = H.get_quirk_string(FALSE, CAT_QUIRK_NOTES) + M.fields[DATACORE_NOTES_DETAILS] = H.get_quirk_string(TRUE, CAT_QUIRK_NOTES) + library[DATACORE_RECORDS_MEDICAL].inject_record(M) + + //Security Record + var/datum/data/record/security/S = new() + S.fields[DATACORE_ID] = id + S.fields[DATACORE_NAME] = H.real_name + S.fields[DATACORE_CRIMINAL_STATUS] = CRIMINAL_NONE + S.fields[DATACORE_CITATIONS] = list() + S.fields[DATACORE_CRIMES] = list() + S.fields[DATACORE_NOTES] = "No notes." + library[DATACORE_RECORDS_SECURITY].inject_record(S) + + //Locked Record + var/datum/data/record/locked/L = new() + L.fields[DATACORE_ID] = id + L.fields[DATACORE_NAME] = H.real_name + // L.fields[DATACORE_RANK] = assignment //ORIGINAL + L.fields[DATACORE_RANK] = chosen_assignment //PARIAH EDIT + L.fields[DATACORE_TRIM] = assignment + G.fields[DATACORE_INITIAL_RANK] = assignment + L.fields[DATACORE_AGE] = H.age + L.fields[DATACORE_GENDER] = H.gender + if(H.gender == "male") + G.fields[DATACORE_GENDER] = "Male" + else if(H.gender == "female") + G.fields[DATACORE_GENDER] = "Female" + else + G.fields[DATACORE_GENDER] = "Other" + L.fields[DATACORE_BLOOD_TYPE] = H.dna.blood_type + L.fields[DATACORE_BLOOD_DNA] = H.dna.unique_enzymes + L.fields[DATACORE_DNA_IDENTITY] = H.dna.unique_identity + L.fields[DATACORE_SPECIES] = H.dna.species.type + L.fields[DATACORE_DNA_FEATURES] = H.dna.features + L.fields[DATACORE_APPEARANCE] = character_appearance + L.fields[DATACORE_MINDREF] = H.mind + library[DATACORE_RECORDS_LOCKED].inject_record(L) + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MANIFEST_INJECT, G, M, S, L) + return + +/** + * Supporing proc for getting general records + * and using them as pAI ui data. This gets + * medical information - or what I would deem + * medical information - and sends it as a list. + * + * @return - list(general_records_out) + */ +/datum/controller/subsystem/datacore/proc/get_general_records() + if(!get_records(DATACORE_RECORDS_STATION)) + return list() + + /// The array of records + var/list/general_records_out = list() + for(var/datum/data/record/gen_record as anything in get_records(DATACORE_RECORDS_STATION)) + /// The object containing the crew info + var/list/crew_record = list() + crew_record["ref"] = REF(gen_record) + crew_record["name"] = gen_record.fields[DATACORE_NAME] + crew_record["physical_health"] = gen_record.fields[DATACORE_PHYSICAL_HEALTH] + crew_record["mental_health"] = gen_record.fields[DATACORE_MENTAL_HEALTH] + general_records_out += list(crew_record) + return general_records_out + +/** + * Supporing proc for getting secrurity records + * and using them as pAI ui data. Sends it as a + * list. + * + * @return - list(security_records_out) + */ +/datum/controller/subsystem/datacore/proc/get_security_records() + if(!get_records(DATACORE_RECORDS_SECURITY)) + return list() + + /// The array of records + var/list/security_records_out = list() + for(var/datum/data/record/sec_record as anything in get_records(DATACORE_RECORDS_SECURITY)) + /// The object containing the crew info + var/list/crew_record = list() + crew_record["ref"] = REF(sec_record) + crew_record["name"] = sec_record.fields[DATACORE_NAME] + crew_record["status"] = sec_record.fields[DATACORE_CRIMINAL_STATUS] // wanted status + crew_record["crimes"] = length(sec_record.fields[DATACORE_CRIMES]) + security_records_out += list(crew_record) + return security_records_out + +/// Creates a new crime entry and hands it back. +/datum/controller/subsystem/datacore/proc/new_crime_entry(cname = "", cdetails = "", author = "", time = "", fine = 0) + var/datum/data/crime/c = new /datum/data/crime + c.crimeName = cname + c.crimeDetails = cdetails + c.author = author + c.time = time + c.fine = fine + c.paid = 0 + c.dataId = ++securityCrimeCounter + return c + +#undef DUMMY_HUMAN_SLOT_MANIFEST diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index f2cd04a4a5d1..74f79e30e6ad 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(dbcore) name = "Database" flags = SS_TICKER | SS_HIBERNATE wait = 10 // Not seconds because we're running on SS_TICKER - runlevels = RUNLEVEL_INIT|RUNLEVEL_LOBBY|RUNLEVELS_DEFAULT + runlevels = RUNLEVEL_LOBBY|RUNLEVELS_DEFAULT init_order = INIT_ORDER_DBCORE priority = FIRE_PRIORITY_DATABASE diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm index 8d745fbd0e2c..faf9c96f2828 100644 --- a/code/controllers/subsystem/dcs.dm +++ b/code/controllers/subsystem/dcs.dm @@ -33,22 +33,28 @@ PROCESSING_SUBSYSTEM_DEF(dcs) 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 + var/value = arguments[key] + if (isnull(value)) + fullid += key + else + if (!istext(value) && !isnum(value)) + value = REF(value) + named_arguments[key] = value + + continue + + if (isnum(key)) fullid += "[key]" + else + fullid += REF(key) if(length(named_arguments)) - named_arguments = sort_list(named_arguments) + named_arguments = sortTim(named_arguments, /proc/cmp_text_asc) fullid += named_arguments + return list2params(fullid) diff --git a/code/controllers/subsystem/early_assets.dm b/code/controllers/subsystem/early_assets.dm index 8c2b975a9a8d..5cdcfa171c3a 100644 --- a/code/controllers/subsystem/early_assets.dm +++ b/code/controllers/subsystem/early_assets.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(early_assets) /datum/controller/subsystem/early_assets/Initialize(start_timeofday) for (var/datum/asset/asset_type as anything in subtypesof(/datum/asset)) - if (initial(asset_type._abstract) == asset_type) + if (isabstract(asset_type)) continue if (!initial(asset_type.early)) diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm index 62388aaa2a61..85e9bbb21374 100644 --- a/code/controllers/subsystem/economy.dm +++ b/code/controllers/subsystem/economy.dm @@ -5,26 +5,29 @@ SUBSYSTEM_DEF(economy) runlevels = RUNLEVEL_GAME ///How many paychecks should players start out the round with? var/roundstart_paychecks = 5 - ///How many credits does the in-game economy have in circulation at round start? Divided up by 6 of the 7 department budgets evenly, where cargo starts with nothing. - var/budget_pool = 52500 + + var/payday_interval = 8 // How many fires between paydays + + /// How many credits to give to each department at round start. + var/roundstart_budget_amt = 4000 + var/list/department_id2name = list( ACCOUNT_ENG = ACCOUNT_ENG_NAME, - ACCOUNT_SCI = ACCOUNT_SCI_NAME, ACCOUNT_MED = ACCOUNT_MED_NAME, - ACCOUNT_SRV = ACCOUNT_SRV_NAME, ACCOUNT_CAR = ACCOUNT_CAR_NAME, ACCOUNT_SEC = ACCOUNT_SEC_NAME, - ACCOUNT_STATION_MASTER = ACCOUNT_STATION_MASTER_NAME + ACCOUNT_STATION_MASTER = ACCOUNT_STATION_MASTER_NAME, + ACCOUNT_GOV = ACCOUNT_GOV_NAME, // THIS IS FOR THE SPECIAL ORDER CONSOLE, NOT THEIR PAYCHECKS! ) + ///The station's master account, used for splitting up funds and pooling money. var/datum/bank_account/department/station_master - ///Used to not spam the payroll announcement - var/run_dry = FALSE - ///Payroll boolean - var/payroll_active = TRUE + + /// Govt Bux, for the government supply console + var/datum/bank_account/department/government_budget ///Departmental account datums by ID - var/list/department_accounts_by_id = list() + var/list/datum/bank_account/department/department_accounts_by_id = list() var/list/generated_accounts = list() /** @@ -40,16 +43,17 @@ SUBSYSTEM_DEF(economy) var/list/bank_accounts_by_id = list() ///List of the departmental budget cards in existance. var/list/dep_cards = list() + /// A var that collects the total amount of credits owned in player accounts on station, reset and recounted on fire() var/station_total = 0 - /// How many civilain bounties have been completed so far this shift? Affects civilian budget payout values. - var/civ_bounty_tracker = 0 + /// Contains the message to send to newscasters about price inflation and earnings, updated on price_update() var/earning_report ///The modifier multiplied to the value of bounties paid out. var/bounty_modifier = 1 ///The modifier multiplied to the value of cargo pack prices. var/pack_price_modifier = 1 + /** * A list of strings containing a basic transaction history of purchases on the station. * Added to any time when player accounts purchase something. @@ -66,16 +70,12 @@ SUBSYSTEM_DEF(economy) var/mail_blocked = FALSE /datum/controller/subsystem/economy/Initialize(timeofday) - ///The master account gets 50% of the roundstart budget - var/reserved_for_master = round(budget_pool / 2) - station_master = new(ACCOUNT_STATION_MASTER, ACCOUNT_STATION_MASTER_NAME, reserved_for_master) - department_accounts_by_id[ACCOUNT_STATION_MASTER] = station_master - budget_pool = round(budget_pool/2) + for(var/dep_id in department_id2name) + department_accounts_by_id[dep_id] = new /datum/bank_account/department(dep_id, department_id2name[dep_id], roundstart_budget_amt) - var/budget_to_hand_out = round(budget_pool / ECON_NUM_DEPARTMENT_ACCOUNTS) + department_accounts_by_id[ACCOUNT_GOV].account_balance = 1000 - for(var/dep_id in department_id2name - ACCOUNT_STATION_MASTER) - department_accounts_by_id[dep_id] = new /datum/bank_account/department(dep_id, department_id2name[dep_id], budget_to_hand_out) + station_master = department_accounts_by_id[ACCOUNT_STATION_MASTER] return ..() /datum/controller/subsystem/economy/Recover() @@ -88,58 +88,83 @@ SUBSYSTEM_DEF(economy) if(!times_fired) return - var/delta_time = wait / (5 MINUTES) + if(times_fired %% payday_interval == 0) + payday() - //Split the station budget amongst the departments - departmental_payouts() + update_mail() + send_fax_paperwork() - ///See if we even have enough money to pay these idiots - var/required_funds = 0 - for(var/account in bank_accounts_by_id) - var/datum/bank_account/bank_account = bank_accounts_by_id[account] - required_funds += round(bank_account.account_job.paycheck * bank_account.payday_modifier) +/datum/controller/subsystem/economy/proc/payday() + //See if we even have enough money to pay these idiots + var/list/dead_people = list() - if(payroll_active) - if(required_funds > station_master.account_balance) - if(!run_dry) - minor_announce("The station budget appears to have run dry. We regret to inform you that no further wage payments are possible until this situation is rectified.","Payroll Announcement") - run_dry = TRUE - else - if(run_dry) - run_dry = FALSE - for(var/account in bank_accounts_by_id) - var/datum/bank_account/bank_account = bank_accounts_by_id[account] - bank_account.payday() + //Dead people don't get money. + for(var/datum/data/record/medical_record in SSdatacore.get_records(DATACORE_RECORDS_STATION)) //dont ask + if(medical_record.fields["status"] == "*Deceased*") + dead_people += medical_record.fields[DATACORE_NAME] - //price_update() This doesn't need to fire every 5 minutes. The only current use is market crash, which handles it on its own. - var/effective_mailcount = round(living_player_count()) - mail_waiting += clamp(effective_mailcount, 1, MAX_MAIL_PER_MINUTE * delta_time) - send_fax_paperwork() + for(var/datum/job_department/department as anything in SSjob.departments) + if(!department.budget_id) + continue -/** - * Departmental income payments are kept static and linear for every department, and paid out once every 5 minutes. - * Iterates over every department account for the same payment. - */ -/datum/controller/subsystem/economy/proc/departmental_payouts() - var/payout_pool = (station_master.account_balance - ECON_STATION_PAYOUT) < 0 ? station_master.account_balance : ECON_STATION_PAYOUT - if(payout_pool < ECON_STATION_PAYOUT_REQUIREMENT) - return + var/datum/bank_account/department_account = department_accounts_by_id[department.budget_id] + // How much money we need to be able to give paychecks + var/required_funds = 0 + // The accounts to pay out to + var/list/datum/bank_account/to_pay = list() - var/split = round(payout_pool / (length(department_accounts_by_id) - 1)) + for(var/account in bank_accounts_by_id) + var/datum/bank_account/bank_account = bank_accounts_by_id[account] + if(!bank_account.account_job || !(bank_account.account_job in department.department_jobs) || (bank_account.account_holder in dead_people)) + continue - for(var/iteration in department_id2name - ACCOUNT_STATION_MASTER) - var/datum/bank_account/dept_account = department_accounts_by_id[iteration] - if(dept_account.account_balance >= ECON_STATION_PAYOUT_MAX) - continue + required_funds += round(bank_account.account_job.paycheck * bank_account.payday_modifier) + to_pay += bank_account - var/real_split = min(ECON_STATION_PAYOUT_MAX - dept_account.account_balance, split) + if(required_funds <= department_account.account_balance) + department_account.adjust_money(-required_funds) + + for(var/datum/bank_account/bank_account in to_pay) + /// We don't use transfering, because we already know there's enough money. + bank_account.payday() + + var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) + if(!announcer) + continue //sucks to suck lmao + + for(var/datum/bank_account/bank_account in to_pay) + var/datum/data/record/general/record = SSdatacore.get_record_by_name(bank_account.account_holder, DATACORE_RECORDS_STATION) + if(!record) + continue + + var/target_id = record.fields[DATACORE_PDA_ID] + if(!target_id) + continue + + announcer.pda_message( + target_id, + "Your payroll for this quarter has been processed. A sum of [round(bank_account.account_job.paycheck * bank_account.payday_modifier)] has been deposited into your account.", + ) - if(!dept_account.transfer_money(station_master, real_split)) - dept_account.transfer_money(station_master, payout_pool) - break else - payout_pool -= real_split + var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) + if(!announcer) + continue //sucks to suck lmao + + for(var/datum/bank_account/bank_account in to_pay) + var/datum/data/record/general/record = SSdatacore.get_record_by_name(bank_account.account_holder, DATACORE_RECORDS_STATION) + if(!record) + continue + + var/target_id = record.fields[DATACORE_PDA_ID] + if(!target_id) + continue + + announcer.pda_message(target_id, "The company's funding has run dry. Your payment for this quarter has not been processed.") +/datum/controller/subsystem/economy/proc/update_mail() + var/effective_mailcount = round(living_player_count()) + mail_waiting += clamp(effective_mailcount, 1, MAX_MAIL_PER_MINUTE * (wait / (1 MINUTE))) /** * Updates the prices of all station vendors. @@ -152,7 +177,7 @@ SUBSYSTEM_DEF(economy) if(HAS_TRAIT(src, TRAIT_MARKET_CRASHING)) multiplier = 4 - for(var/obj/machinery/vending/V in GLOB.machines) + for(var/obj/machinery/vending/V as anything in INSTANCES_OF(/obj/machinery/vending)) if(istype(V, /obj/machinery/vending/custom)) continue if(!is_station_level(V.z)) @@ -349,3 +374,38 @@ SUBSYSTEM_DEF(economy) spawned_paper.update_appearance() return spawned_paper + +/// Spawns a given amount of money in optimal stacks at the given location. +/datum/controller/subsystem/economy/proc/spawn_cash_for_amount(amt, spawn_loc) + amt = round(amt) // Don't pass in decimals you twat + var/ten_thousands = 0 + var/thousands = 0 + var/hundreds = 0 + var/tens = 0 + var/ones = 0 + + ten_thousands = floor(amt / 10000) + amt -= ten_thousands * 10000 + + thousands = floor(amt / 1000) + amt -= thousands * 1000 + + hundreds = floor(amt / 100) + amt -= hundreds * 100 + + tens = floor(amt / 10) + amt -= tens * 10 + + ones = amt + + if(ten_thousands) + new /obj/item/stack/spacecash/c10000(spawn_loc, ten_thousands) + if(thousands) + new /obj/item/stack/spacecash/c1000(spawn_loc, thousands) + if(hundreds) + new /obj/item/stack/spacecash/c100(spawn_loc, hundreds) + if(tens) + new /obj/item/stack/spacecash/c10(spawn_loc, tens) + if(ones) + new /obj/item/stack/spacecash/c1(spawn_loc, ones) + diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index fb4dd119fd5a..1921e956b46b 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -4,12 +4,15 @@ SUBSYSTEM_DEF(events) runlevels = RUNLEVEL_GAME var/list/control = list() //list of all datum/round_event_control. Used for selecting events based on weight and occurrences. - var/list/running = list() //list of all existing /datum/round_event + ///List of all existing /datum/round_event + var/list/running = list() var/list/currentrun = list() var/scheduled = 0 //The next world.time that a naturally occuring random event can be selected. - var/frequency_lower = 1800 //3 minutes lower bound. - var/frequency_upper = 6000 //10 minutes upper bound. Basically an event will happen every 3 to 10 minutes. + ///The minimum time between random events + var/frequency_lower = 3 MINUTES + ///The maximum time between random events + var/frequency_upper = 10 MINUTES var/list/holidays //List of all holidays occuring today or null if no holidays var/wizardmode = FALSE @@ -20,7 +23,7 @@ SUBSYSTEM_DEF(events) if(!E.typepath) continue //don't want this one! leave it for the garbage collector control += E //add it to the list of all events (controls) - reschedule() + RegisterSignal(SSticker, COMSIG_TICKER_ROUND_STARTING, PROC_REF(reschedule)) getHoliday() return ..() @@ -34,10 +37,10 @@ SUBSYSTEM_DEF(events) var/list/currentrun = src.currentrun while(currentrun.len) - var/datum/thing = currentrun[currentrun.len] + var/datum/round_event/thing = currentrun[currentrun.len] currentrun.len-- if(thing) - thing.process(wait * 0.1) + thing.process_event() else running.Remove(thing) if (MC_TICK_CHECK) @@ -51,6 +54,7 @@ SUBSYSTEM_DEF(events) //decides which world.time we should select another random event at. /datum/controller/subsystem/events/proc/reschedule() + SIGNAL_HANDLER scheduled = world.time + rand(frequency_lower, max(frequency_lower,frequency_upper)) //selects a random event based on whether it can occur and it's 'weight'(probability) @@ -63,7 +67,7 @@ SUBSYSTEM_DEF(events) // Only alive, non-AFK human players count towards this. var/sum_of_weights = 0 - for(var/datum/round_event_control/E in control) + for(var/datum/round_event_control/E as anything in control) if(!E.canSpawnEvent(players_amt)) continue if(E.weight < 0) //for round-start events etc. diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm index 376070abb5e2..b5c9dee21095 100644 --- a/code/controllers/subsystem/explosions.dm +++ b/code/controllers/subsystem/explosions.dm @@ -4,167 +4,56 @@ GLOBAL_LIST_EMPTY(explosions) SUBSYSTEM_DEF(explosions) name = "Explosions" init_order = INIT_ORDER_EXPLOSIONS - priority = FIRE_PRIORITY_EXPLOSIONS - wait = 0 - flags = SS_HIBERNATE | SS_NO_INIT - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + wait = 1 + flags = SS_NO_FIRE - 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() + //A list of explosion sources + var/list/active_explosions = list() // Track how many explosions have happened. var/explosion_index = 0 var/currentpart = SSEXPLOSIONS_MOVABLES -/datum/controller/subsystem/explosions/PreInit(start_timeofday) - . = ..() - hibernate_checks = list( - NAMEOF(src, lowturf), - NAMEOF(src, medturf), - NAMEOF(src, highturf), - NAMEOF(src, flameturf), - NAMEOF(src, throwturf), - NAMEOF(src, low_mov_atom), - NAMEOF(src, med_mov_atom), - NAMEOF(src, high_mov_atom) - ) - -/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 ..() + var/iterative_explosions_z_threshold = INFINITY + var/iterative_explosions_z_multiplier = INFINITY +/datum/controller/subsystem/explosions/Initialize(start_timeofday) + . = ..() + // iterative_explosions_z_threshold = CONFIG_GET(number/iterative_explosions_z_threshold) + // iterative_explosions_z_multiplier = CONFIG_GET(number/iterative_explosions_z_multiplier) #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 = tgui_alert(usr, "Use reactionary explosions?","Check Bomb Impact", list("Yes", "No")) - var/turf/epicenter = get_turf(mob) - if(!epicenter) - return +/datum/controller/subsystem/explosions/proc/begin_exploding(atom/source) + explosion_index++ + active_explosions += source - var/dev = 0 - var/heavy = 0 - var/light = 0 - var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") - var/choice = tgui_input_list(usr, "Pick the bomb size", "Bomb Size?", 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 +/datum/controller/subsystem/explosions/proc/stop_exploding(atom/source) + active_explosions -= source - 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 = 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, GLOBAL_PROC_REF(wipe_color_and_text), wipe_colours), 100) +/datum/controller/subsystem/explosions/proc/is_exploding() + return length(active_explosions) -/proc/wipe_color_and_text(list/atom/wiping) - for(var/i in wiping) - var/atom/A = i - A.color = null - A.maptext = "" +/** + * Makes a given atom explode. + * + * Arguments: + * - [origin][/atom]: The atom that's exploding. + * - devastation_range: The range at which the effects of the explosion are at their strongest. + * - heavy_impact_range: The range at which the effects of the explosion are relatively severe. + * - light_impact_range: The range at which the effects of the explosion are relatively weak. + * - flash_range: The range at which the explosion flashes people. + * - adminlog: Whether to log the explosion/report it to the administration. + * - ignorecap: Whether to ignore the relevant bombcap. Defaults to FALSE. + * - flame_range: The range at which the explosion should produce hotspots. + * - silent: Whether to generate/execute sound effects. + * - smoke: Whether to generate a smoke cloud provided the explosion is powerful enough to warrant it. + * - explosion_cause: [Optional] The atom that caused the explosion, when different to the origin. Used for logging. + */ +/proc/explosion(atom/origin, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 0, flame_range = 0, flash_range = 0, adminlog = TRUE, ignorecap = FALSE, silent = FALSE, smoke = FALSE, atom/explosion_cause = null) + return SSexplosions.iterative_explode(arglist(args)) /** * Using default dyn_ex scale: @@ -192,122 +81,208 @@ SUBSYSTEM_DEF(explosions) /proc/dyn_explosion(turf/epicenter, power, flame_range = 0, flash_range = null, adminlog = TRUE, ignorecap = TRUE, silent = FALSE, smoke = TRUE, atom/explosion_cause = null) if(!power) return + var/range = 0 range = round((2 * power)**GLOB.DYN_EX_SCALE) return explosion(epicenter, devastation_range = round(range * 0.25), heavy_impact_range = round(range * 0.5), light_impact_range = round(range), flame_range = flame_range*range, flash_range = flash_range*range, adminlog = adminlog, ignorecap = ignorecap, silent = silent, smoke = smoke, explosion_cause = explosion_cause) - +// Explosion SFX defines... +/// The probability that a quaking explosion will make the station creak per unit. Maths! +#define QUAKE_CREAK_PROB 30 +/// The probability that an echoing explosion will make the station creak per unit. +#define ECHO_CREAK_PROB 5 +/// Time taken for the hull to begin to creak after an explosion, if applicable. +#define CREAK_DELAY (5 SECONDS) +/// Lower limit for far explosion SFX volume. +#define FAR_LOWER 40 +/// Upper limit for far explosion SFX volume. +#define FAR_UPPER 60 +/// The probability that a distant explosion SFX will be a far explosion sound rather than an echo. (0-100) +#define FAR_SOUND_PROB 75 +/// The upper limit on screenshake amplitude for nearby explosions. +#define NEAR_SHAKE_CAP 5 +/// The upper limit on screenshake amplifude for distant explosions. +#define FAR_SHAKE_CAP 1.5 +/// The duration of the screenshake for nearby explosions. +#define NEAR_SHAKE_DURATION (1.5 SECONDS) +/// The duration of the screenshake for distant explosions. +#define FAR_SHAKE_DURATION (1 SECONDS) +/// The lower limit for the randomly selected hull creaking frequency. +#define FREQ_LOWER 25 +/// The upper limit for the randomly selected hull creaking frequency. +#define FREQ_UPPER 40 /** - * Makes a given atom explode. + * Handles the sfx and screenshake caused by an explosion. * * Arguments: - * - [origin][/atom]: The atom that's exploding. - * - devastation_range: The range at which the effects of the explosion are at their strongest. - * - heavy_impact_range: The range at which the effects of the explosion are relatively severe. - * - light_impact_range: The range at which the effects of the explosion are relatively weak. - * - flash_range: The range at which the explosion flashes people. - * - adminlog: Whether to log the explosion/report it to the administration. - * - ignorecap: Whether to ignore the relevant bombcap. Defaults to FALSE. - * - flame_range: The range at which the explosion should produce hotspots. - * - silent: Whether to generate/execute sound effects. - * - smoke: Whether to generate a smoke cloud provided the explosion is powerful enough to warrant it. - * - explosion_cause: [Optional] The atom that caused the explosion, when different to the origin. Used for logging. + * - [epicenter][/turf]: The location of the explosion. + * - near_distance: How close to the explosion you need to be to get the full effect of the explosion. + * - far_distance: How close to the explosion you need to be to hear more than echos. + * - quake_factor: Main scaling factor for screenshake. + * - echo_factor: Whether to make the explosion echo off of very distant parts of the station. + * - creaking: Whether to make the station creak. Autoset if null. + * - [near_sound][/sound]: The sound that plays if you are close to the explosion. + * - [far_sound][/sound]: The sound that plays if you are far from the explosion. + * - [echo_sound][/sound]: The sound that plays as echos for the explosion. + * - [creaking_sound][/sound]: The sound that plays when the station creaks during the explosion. + * - [hull_creaking_sound][/sound]: The sound that plays when the station creaks after the explosion. */ -/proc/explosion(atom/origin, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 0, flame_range = 0, flash_range = 0, adminlog = TRUE, ignorecap = FALSE, silent = FALSE, smoke = FALSE, atom/explosion_cause = null) - . = SSexplosions.explode(arglist(args)) +/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING))) + var/frequency = get_rand_frequency() + var/blast_z = epicenter.z + if(isnull(creaking)) // Autoset creaking. + var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) + if(on_station && prob((quake_factor * QUAKE_CREAK_PROB) + (echo_factor * ECHO_CREAK_PROB))) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might. + creaking = TRUE // prob over 100 always returns true + else + creaking = FALSE + for(var/mob/listener as anything in GLOB.player_list) + var/turf/listener_turf = get_turf(listener) + if(!listener_turf || listener_turf.z != blast_z) + continue + + var/distance = get_dist(epicenter, listener_turf) + if(epicenter == listener_turf) + distance = 0 + + var/base_shake_amount = isobserver(listener) ? 0 : sqrt(near_distance / (distance + 1)) + + if(distance <= round(near_distance + world.view - 2, 1)) // If you are close enough to see the effects of the explosion first-hand (ignoring walls) + listener.playsound_local(epicenter, null, 100, TRUE, frequency, sound_to_use = near_sound) + if(base_shake_amount > 0) + shake_camera(listener, NEAR_SHAKE_DURATION, clamp(base_shake_amount, 0, NEAR_SHAKE_CAP)) + + else if(distance < far_distance) // You can hear a far explosion if you are outside the blast radius. Small explosions shouldn't be heard throughout the station. + var/far_volume = clamp(far_distance / 2, FAR_LOWER, FAR_UPPER) + if(creaking) + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = creaking_sound, distance_multiplier = 0) + else if(prob(FAR_SOUND_PROB)) // Sound variety during meteor storm/tesloose/other bad event + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = far_sound, distance_multiplier = 0) + else + listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + + if(base_shake_amount || quake_factor) + base_shake_amount = max(base_shake_amount, quake_factor * 3, 0) // Devastating explosions rock the station and ground + shake_camera(listener, FAR_SHAKE_DURATION, min(base_shake_amount, FAR_SHAKE_CAP)) + + else if(!isspaceturf(listener_turf) && echo_factor) // Big enough explosions echo through the hull. + var/echo_volume + if(quake_factor) + echo_volume = 60 + shake_camera(listener, FAR_SHAKE_DURATION, clamp(quake_factor / 4, 0, FAR_SHAKE_CAP)) + else + echo_volume = 40 + listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + + if(creaking) // 5 seconds after the bang, the station begins to creak + addtimer(CALLBACK(listener, TYPE_PROC_REF(/mob, playsound_local), epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), TRUE, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) + +#undef CREAK_DELAY +#undef QUAKE_CREAK_PROB +#undef ECHO_CREAK_PROB +#undef FAR_UPPER +#undef FAR_LOWER +#undef FAR_SOUND_PROB +#undef NEAR_SHAKE_CAP +#undef FAR_SHAKE_CAP +#undef NEAR_SHAKE_DURATION +#undef FAR_SHAKE_DURATION +#undef FREQ_UPPER +#undef FREQ_LOWER + + +#define EXPLFX_BOTH 3 +#define EXPLFX_SOUND 2 +#define EXPLFX_SHAKE 1 +#define EXPLFX_NONE 0 + +// All the vars used on the turf should be on unsimulated turfs too, we just don't care about those generally. +#define SEARCH_DIR(dir) \ + search_direction = dir;\ + search_turf = get_step(current_turf, search_direction);\ + if (isturf(search_turf)) {\ + turf_queue += search_turf;\ + dir_queue += search_direction;\ + power_queue += current_power;\ + } + +#define GET_EXPLOSION_BLOCK(thing) (thing.explosion_block == EXPLOSION_BLOCK_PROC ? thing.GetExplosionBlock() : thing.explosion_block) + +/datum/controller/subsystem/explosions/proc/iterative_explode(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range, admin_log, ignorecap, silent, smoke, atom/explosion_cause) + set waitfor = FALSE + + explosion_cause ||= epicenter -/** - * Makes a given atom explode. Now on the explosions subsystem! - * - * Arguments: - * - [origin][/atom]: The atom that's exploding. - * - devastation_range: The range at which the effects of the explosion are at their strongest. - * - heavy_impact_range: The range at which the effects of the explosion are relatively severe. - * - light_impact_range: The range at which the effects of the explosion are relatively weak. - * - flash_range: The range at which the explosion flashes people. - * - adminlog: Whether to log the explosion/report it to the administration. - * - ignorecap: Whether to ignore the relevant bombcap. Defaults to FALSE. - * - flame_range: The range at which the explosion should produce hotspots. - * - silent: Whether to generate/execute sound effects. - * - smoke: Whether to generate a smoke cloud provided the explosion is powerful enough to warrant it. - * - explosion_cause: [Optional] The atom that caused the explosion, when different to the origin. Used for logging. - */ -/datum/controller/subsystem/explosions/proc/explode(atom/origin, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 0, flame_range = 0, flash_range = 0, adminlog = TRUE, ignorecap = FALSE, silent = FALSE, smoke = FALSE, atom/explosion_cause = null) var/list/arguments = list( - EXARG_KEY_ORIGIN = origin, + EXARG_KEY_ORIGIN = epicenter, EXARG_KEY_DEV_RANGE = devastation_range, EXARG_KEY_HEAVY_RANGE = heavy_impact_range, EXARG_KEY_LIGHT_RANGE = light_impact_range, EXARG_KEY_FLAME_RANGE = flame_range, EXARG_KEY_FLASH_RANGE = flash_range, - EXARG_KEY_ADMIN_LOG = adminlog, + EXARG_KEY_ADMIN_LOG = admin_log, EXARG_KEY_IGNORE_CAP = ignorecap, EXARG_KEY_SILENT = silent, EXARG_KEY_SMOKE = smoke, - EXARG_KEY_EXPLOSION_CAUSE = explosion_cause ? explosion_cause : origin, + EXARG_KEY_EXPLOSION_CAUSE = explosion_cause , ) - var/atom/location = isturf(origin) ? origin : origin.loc - if(SEND_SIGNAL(origin, COMSIG_ATOM_EXPLODE, arguments) & COMSIG_CANCEL_EXPLOSION) - return COMSIG_CANCEL_EXPLOSION // Signals are incompatible with `arglist(...)` so we can't actually use that for these. Additionally, - - while(location) - var/next_loc = location.loc - if(SEND_SIGNAL(location, COMSIG_ATOM_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) - return COMSIG_CANCEL_EXPLOSION - if(isturf(location)) - break - location = next_loc - if(!location) - return - - var/area/epicenter_area = get_area(location) - if(SEND_SIGNAL(epicenter_area, COMSIG_AREA_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) + if(try_cancel_explosion(epicenter, arguments) & COMSIG_CANCEL_EXPLOSION) return COMSIG_CANCEL_EXPLOSION - arguments -= EXARG_KEY_ORIGIN - - propagate_blastwave(arglist(list(location) + arguments)) -/** - * Handles the effects of an explosion originating from a given point. - * - * Primarily handles popagating the balstwave of the explosion to the relevant turfs. - * Also handles the fireball from the explosion. - * Also handles the smoke cloud from the explosion. - * Also handles sfx and screenshake. - * - * Arguments: - * - [epicenter][/atom]: The location of the explosion rounded to the nearest turf. - * - devastation_range: The range at which the effects of the explosion are at their strongest. - * - heavy_impact_range: The range at which the effects of the explosion are relatively severe. - * - light_impact_range: The range at which the effects of the explosion are relatively weak. - * - flash_range: The range at which the explosion flashes people. - * - adminlog: Whether to log the explosion/report it to the administration. - * - ignorecap: Whether to ignore the relevant bombcap. Defaults to TRUE for some mysterious reason. - * - flame_range: The range at which the explosion should produce hotspots. - * - silent: Whether to generate/execute sound effects. - * - smoke: Whether to generate a smoke cloud provided the explosion is powerful enough to warrant it. - * - explosion_cause: The atom that caused the explosion. Used for logging. - */ -/datum/controller/subsystem/explosions/proc/propagate_blastwave(atom/epicenter, devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range, adminlog, ignorecap, silent, smoke, atom/explosion_cause) epicenter = get_turf(epicenter) if(!epicenter) return - if(isnull(flame_range)) - flame_range = light_impact_range - if(isnull(flash_range)) - flash_range = devastation_range + begin_exploding(explosion_cause) + var/explosion_num = explosion_index // 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, flame_range, flash_range) + 1 + + // Bomb cap + if(!ignorecap) + //Zlevel specific bomb cap multiplier + var/cap_multiplier = SSmapping.level_trait(epicenter.z, ZTRAIT_BOMBCAP_MULTIPLIER) + if (isnull(cap_multiplier)) + cap_multiplier = 1 + + devastation_range = min(zas_settings.maxex_devastation_range * cap_multiplier, devastation_range) + heavy_impact_range = min(zas_settings.maxex_heavy_range * cap_multiplier, heavy_impact_range) + light_impact_range = min(zas_settings.maxex_light_range * cap_multiplier, light_impact_range) + flash_range = min(zas_settings.maxex_flash_range * cap_multiplier, flash_range) + flame_range = min(zas_settings.maxex_fire_range * cap_multiplier, flame_range) - var/orig_max_distance = max(devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range) + var/power = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) + 1 + if(power <= 0) + return + + var/dev_power = power - devastation_range + var/heavy_power = power - heavy_impact_range + var/flame_power = power - flame_range + + if(admin_log) + find_and_log_explosion_source( + epicenter, + explosion_cause, + devastation_range, + heavy_impact_range, + light_impact_range, + flame_range, + flash_range, + orig_dev_range, + orig_heavy_range, + orig_light_range + ) + + if(devastation_range) + SSblackbox.record_feedback("amount", "devastating_booms", 1) //Zlevel specific bomb cap multiplier var/cap_multiplier = SSmapping.level_trait(epicenter.z, ZTRAIT_BOMBCAP_MULTIPLIER) @@ -321,12 +296,54 @@ SUBSYSTEM_DEF(explosions) flash_range = min(zas_settings.maxex_flash_range * cap_multiplier, flash_range) flame_range = min(zas_settings.maxex_fire_range * cap_multiplier, flame_range) - var/max_range = max(devastation_range, heavy_impact_range, light_impact_range, flame_range) + log_game("iexpl: (EX [explosion_num]) Beginning discovery phase.") + var/time = REALTIMEOFDAY + var/start_time = REALTIMEOFDAY + + var/list/act_turfs = list() + act_turfs[epicenter] = power + + discover_turfs(epicenter, power, act_turfs) + + log_game("iexpl: (EX [explosion_num]) Discovery completed in [(REALTIMEOFDAY-time)/10] seconds.") + log_game("iexpl: (EX [explosion_num]) Beginning SFX phase.") + time = REALTIMEOFDAY + + perform_special_effects(epicenter, power, devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range, smoke, silent, orig_max_distance) + + log_game("iexpl: (EX [explosion_num]) SFX phase completed in [(REALTIMEOFDAY-time)/10] seconds.") + log_game("iexpl: (EX [explosion_num]) Beginning application phase.") + time = REALTIMEOFDAY + + var/turf_tally = 0 + var/movable_tally = 0 + perform_explosion(epicenter, act_turfs, heavy_power, dev_power, flame_power, &turf_tally, &movable_tally) + + var/took = (REALTIMEOFDAY - time) / 10 + 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, \ + explosion_cause, \ + explosion_index \ + ) + log_game("iexpl: (EX [explosion_num]) Ex_act() phase completed in [took] seconds; processed [turf_tally] turfs and [movable_tally] movables.") + log_game("iexpl: (EX [explosion_num]) Beginning throw phase.") + time = REALTIMEOFDAY - if(devastation_range) - SSblackbox.record_feedback("amount", "devastating_booms", 1) - var/started_at = REALTIMEOFDAY + throw_movables(epicenter, act_turfs) + log_game("iexpl: (EX [explosion_num]) Throwing phase completed in [(REALTIMEOFDAY - time) / 10] seconds.") + log_game("iexpl: (EX [explosion_num]) All phases completed in [(REALTIMEOFDAY - start_time) / 10] seconds.") + + stop_exploding(explosion_cause) + +/datum/controller/subsystem/explosions/proc/find_and_log_explosion_source(turf/epicenter, atom/explosion_cause, devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range, orig_dev_range, orig_heavy_range, orig_light_range) // Now begins a bit of a logic train to find out whodunnit. var/who_did_it = "N/A" var/who_did_it_game_log = "N/A" @@ -353,401 +370,280 @@ SUBSYSTEM_DEF(explosions) who_did_it = "\[Projectile firer: [ADMIN_LOOKUPFLW(fired_projectile.firer.fingerprintslast)]\]" who_did_it_game_log = "\[Projectile firer: [key_name(fired_projectile.firer.fingerprintslast)]\]" // Otherwise if the explosion cause is an atom, try get the fingerprints. + else if(istype(explosion_cause)) who_did_it = ADMIN_LOOKUPFLW(explosion_cause.fingerprintslast) who_did_it_game_log = key_name(explosion_cause.fingerprintslast) - if(adminlog) - message_admins("Explosion with size (Devast: [devastation_range], Heavy: [heavy_impact_range], Light: [light_impact_range], Flame: [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]. Possible cause: [explosion_cause]. Last fingerprints: [who_did_it].") - log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]. Possible cause: [explosion_cause]. Last fingerprints: [who_did_it_game_log].") - - var/x0 = epicenter.x - var/y0 = epicenter.y - var/z0 = epicenter.z + message_admins("Explosion with size (Devast: [devastation_range], Heavy: [heavy_impact_range], Light: [light_impact_range], Flame: [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]. Possible cause: [explosion_cause || "NULL"]. Last fingerprints: [who_did_it].") + log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]. Possible cause: [explosion_cause]. Last fingerprints: [who_did_it_game_log || "NULL"].") var/area/areatype = get_area(epicenter) - SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flame" = flame_range, "flash" = flash_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), "possible_cause" = explosion_cause, "possible_suspect" = who_did_it_game_log)) + SSblackbox.record_feedback( + "associative", + "explosion", + 1, + list( + "dev" = devastation_range, + "heavy" = heavy_impact_range, + "light" = light_impact_range, + "flame" = flame_range, + "flash" = flash_range, + "orig_dev" = orig_dev_range, + "orig_heavy" = orig_heavy_range, + "orig_light" = orig_light_range, + "x" = epicenter.x, + "y" = epicenter.y, + "z" = epicenter.z, + "area" = areatype.type, + "time" = time_stamp("YYYY-MM-DD hh:mm:ss", 1), + "possible_cause" = explosion_cause, + "possible_suspect" = who_did_it_game_log + ) + ) + +/datum/controller/subsystem/explosions/proc/try_cancel_explosion(atom/origin, list/arguments) + var/atom/location = isturf(origin) ? origin : origin.loc + if(SEND_SIGNAL(origin, COMSIG_ATOM_EXPLODE, arguments) & COMSIG_CANCEL_EXPLOSION) + return COMSIG_CANCEL_EXPLOSION // Signals are incompatible with `arglist(...)` so we can't actually use that for these. Additionally, + + while(location) + var/next_loc = location.loc + if(SEND_SIGNAL(location, COMSIG_ATOM_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) + return COMSIG_CANCEL_EXPLOSION + if(isturf(location)) + break + location = next_loc + + if(!location) + return - // 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! + var/area/epicenter_area = get_area(location) + if(SEND_SIGNAL(epicenter_area, COMSIG_AREA_INTERNAL_EXPLOSION, arguments) & COMSIG_CANCEL_EXPLOSION) + return COMSIG_CANCEL_EXPLOSION - // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. - // 3/7/14 will calculate to 80 + 35 +/datum/controller/subsystem/explosions/proc/discover_turfs(turf/epicenter, power, list/act_turfs) + power -= GET_EXPLOSION_BLOCK(epicenter) + + if (power >= iterative_explosions_z_threshold) + var/turf/above = GetAbove(epicenter) + if(!isnull(above)) + iterative_explode(above, power * iterative_explosions_z_multiplier, UP) + + var/turf/below = GetBelow(epicenter) + if(!isnull(below)) + iterative_explode(below, power * iterative_explosions_z_multiplier, DOWN) + + // These three lists must always be the same length. + var/list/turf_queue = list(epicenter, epicenter, epicenter, epicenter) + var/list/dir_queue = list(NORTH, SOUTH, EAST, WEST) + var/list/power_queue = list(power, power, power, power) + + var/turf/current_turf + var/turf/search_turf + var/origin_direction + var/search_direction + var/current_power + var/index = 1 + while (index <= turf_queue.len) + current_turf = turf_queue[index] + origin_direction = dir_queue[index] + current_power = power_queue[index] + ++index + + if (!istype(current_turf) || current_power <= 0) + CHECK_TICK + continue - var/far_dist = 0 - far_dist += heavy_impact_range * 15 - far_dist += devastation_range * 20 + if (act_turfs[current_turf] >= current_power && current_turf != epicenter) + CHECK_TICK + continue - if(!silent) - shake_the_room(epicenter, orig_max_distance, far_dist, devastation_range, heavy_impact_range) + act_turfs[current_turf] = current_power + current_power -= GET_EXPLOSION_BLOCK(current_turf) + // Attempt to shortcut on empty tiles: if a turf only has a LO on it, we don't need to check object resistance. Some turfs might not have LOs, so we need to check it actually has one. + if (length(current_turf.contents)) + for (var/obj/O as obj in current_turf) + if (O.explosion_block) + current_power -= GET_EXPLOSION_BLOCK(O) + + if (current_power <= 0) + CHECK_TICK + continue + + SEARCH_DIR(origin_direction) + SEARCH_DIR(turn(origin_direction, 90)) + SEARCH_DIR(turn(origin_direction, -90)) + + CHECK_TICK + +/datum/controller/subsystem/explosions/proc/perform_special_effects(turf/epicenter, power, devastation_range, heavy_impact_range, light_impact_range, flame_range, flash_range, smoke, silent, original_max_distance) + //flash mobs + if(flash_range) + for(var/mob/living/L in viewers(flash_range, epicenter)) + L.flash_act() + + //Explosion effects if(heavy_impact_range > 1) var/datum/effect_system/explosion/E if(smoke) E = new /datum/effect_system/explosion/smoke + var/datum/effect_system/explosion/smoke/smoke_dispenser = E + smoke_dispenser.smoke_range = heavy_impact_range else - E = new + E = new /datum/effect_system/explosion + E.set_up(epicenter) E.start() - //flash mobs - if(flash_range) - for(var/mob/living/L in viewers(flash_range, epicenter)) - L.flash_act() + if(power >= 5) + new /obj/effect/temp_visual/shockwave(epicenter, min(power, 20)) //Lets be reasonable here. - var/list/affected_turfs = GatherSpiralTurfs(max_range, epicenter) - - var/reactionary = CONFIG_GET(flag/reactionary_explosions) - var/list/cached_exp_block + if(!silent) + var/far_dist = 0 + far_dist += heavy_impact_range * 15 + far_dist += devastation_range * 20 + shake_the_room(epicenter, original_max_distance, far_dist, devastation_range, heavy_impact_range) + +/datum/controller/subsystem/explosions/proc/perform_explosion(epicenter, list/act_turfs, heavy_power, dev_power, flame_power, turf_tally_ptr, movable_tally_ptr) + var/turf_tally = 0 + var/movable_tally = 0 + for (var/turf/T as anything in act_turfs) + var/turf_power = act_turfs[T] + if (turf_power <= 0) + CHECK_TICK + continue - if(reactionary) - cached_exp_block = CaculateExplosionBlock(affected_turfs) + var/severity + if(turf_power >= dev_power) + severity = EXPLODE_DEVASTATE + else if(turf_power >= heavy_power) + severity = EXPLODE_HEAVY + else + severity = EXPLODE_LIGHT - //lists are guaranteed to contain at least 1 turf at this point + if(flame_power && turf_power > flame_power) + T.create_fire(2, rand(2, 10)) - for(var/turf/T as anything in affected_turfs) - var/init_dist = cheap_hypotenuse(T.x, T.y, x0, y0) - var/dist = init_dist + if (T.simulated) + T.ex_act(severity) - if(reactionary) - var/turf/Trajectory = T - while(Trajectory != epicenter) - Trajectory = get_step_towards(Trajectory, epicenter) - dist += cached_exp_block[Trajectory] + if (length(T.contents)) + for (var/atom/movable/AM as anything in T) + if (AM.simulated) + EX_ACT(AM, severity) + movable_tally++ + CHECK_TICK - var/flame_dist = dist < flame_range - var/throw_dist = dist + var/throw_range = min(turf_power, 10) + if(T.explosion_throw_details < throw_range) + T.explosion_throw_details = throw_range - 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/atom/A in T) - 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.get_all_contents(ignore_flag_1 = PREVENT_CONTENTS_EXPLOSION_1) - for(var/atom/movable/movable_thing as anything in items) - 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 - //PARIAH EDIT ADDITION - for(var/obj/machinery/light/iterating_light in T) - iterating_light.start_flickering() - //PARIAH EDIT END - if(flame_dist && prob(40) && !isspaceturf(T) && !T.density) - flameturf += T - - //--- THROW ITEMS AROUND --- - var/throw_dir = get_dir(epicenter,T) - var/throw_range = max_range-throw_dist - 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 + turf_tally++ + CHECK_TICK + *turf_tally_ptr = turf_tally + *movable_tally_ptr = movable_tally - var/took = (REALTIMEOFDAY - started_at) / 10 +/datum/controller/subsystem/explosions/proc/throw_movables(turf/epicenter, list/act_turfs) + for(var/turf/T as anything in act_turfs) + var/throw_range = T.explosion_throw_details + if(isnull(throw_range)) + CHECK_TICK + continue - //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.") + T.explosion_throw_details = null + if(throw_range < 1) + CHECK_TICK + continue - explosion_index += 1 + for(var/atom/movable/AM as anything in T) + if(QDELETED(AM) || AM.anchored || !AM.simulated) + CHECK_TICK + continue - 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, explosion_cause, explosion_index) + if(AM.move_resist != INFINITY) + var/turf/throw_target = get_ranged_target_turf_direct(AM, epicenter, throw_range, 180) + AM.throw_at(throw_target, throw_range, EXPLOSION_THROW_SPEED) + CHECK_TICK -// Explosion SFX defines... -/// The probability that a quaking explosion will make the station creak per unit. Maths! -#define QUAKE_CREAK_PROB 30 -/// The probability that an echoing explosion will make the station creak per unit. -#define ECHO_CREAK_PROB 5 -/// Time taken for the hull to begin to creak after an explosion, if applicable. -#define CREAK_DELAY (5 SECONDS) -/// Lower limit for far explosion SFX volume. -#define FAR_LOWER 40 -/// Upper limit for far explosion SFX volume. -#define FAR_UPPER 60 -/// The probability that a distant explosion SFX will be a far explosion sound rather than an echo. (0-100) -#define FAR_SOUND_PROB 75 -/// The upper limit on screenshake amplitude for nearby explosions. -#define NEAR_SHAKE_CAP 5 -/// The upper limit on screenshake amplifude for distant explosions. -#define FAR_SHAKE_CAP 1.5 -/// The duration of the screenshake for nearby explosions. -#define NEAR_SHAKE_DURATION (1.5 SECONDS) -/// The duration of the screenshake for distant explosions. -#define FAR_SHAKE_DURATION (1 SECONDS) -/// The lower limit for the randomly selected hull creaking frequency. -#define FREQ_LOWER 25 -/// The upper limit for the randomly selected hull creaking frequency. -#define FREQ_UPPER 40 - -/** - * Handles the sfx and screenshake caused by an explosion. - * - * Arguments: - * - [epicenter][/turf]: The location of the explosion. - * - near_distance: How close to the explosion you need to be to get the full effect of the explosion. - * - far_distance: How close to the explosion you need to be to hear more than echos. - * - quake_factor: Main scaling factor for screenshake. - * - echo_factor: Whether to make the explosion echo off of very distant parts of the station. - * - creaking: Whether to make the station creak. Autoset if null. - * - [near_sound][/sound]: The sound that plays if you are close to the explosion. - * - [far_sound][/sound]: The sound that plays if you are far from the explosion. - * - [echo_sound][/sound]: The sound that plays as echos for the explosion. - * - [creaking_sound][/sound]: The sound that plays when the station creaks during the explosion. - * - [hull_creaking_sound][/sound]: The sound that plays when the station creaks after the explosion. - */ -/datum/controller/subsystem/explosions/proc/shake_the_room(turf/epicenter, near_distance, far_distance, quake_factor, echo_factor, creaking, sound/near_sound = sound(get_sfx(SFX_EXPLOSION)), sound/far_sound = sound('sound/effects/explosionfar.ogg'), sound/echo_sound = sound('sound/effects/explosion_distant.ogg'), sound/creaking_sound = sound(get_sfx(SFX_EXPLOSION_CREAKING)), hull_creaking_sound = sound(get_sfx(SFX_HULL_CREAKING))) - var/frequency = get_rand_frequency() - var/blast_z = epicenter.z - if(isnull(creaking)) // Autoset creaking. - var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION) - if(on_station && prob((quake_factor * QUAKE_CREAK_PROB) + (echo_factor * ECHO_CREAK_PROB))) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might. - creaking = TRUE // prob over 100 always returns true - else - creaking = FALSE + CHECK_TICK - for(var/mob/listener as anything in GLOB.player_list) - var/turf/listener_turf = get_turf(listener) - if(!listener_turf || listener_turf.z != blast_z) - continue +/datum/controller/subsystem/explosions/proc/throw_exploded_movable(datum/callback/CB) + if(QDELETED(CB.object)) + return - var/distance = get_dist(epicenter, listener_turf) - if(epicenter == listener_turf) - distance = 0 - var/base_shake_amount = sqrt(near_distance / (distance + 1)) + addtimer(CB, 0) - if(distance <= round(near_distance + world.view - 2, 1)) // If you are close enough to see the effects of the explosion first-hand (ignoring walls) - listener.playsound_local(epicenter, null, 100, TRUE, frequency, sound_to_use = near_sound) - if(base_shake_amount > 0) - shake_camera(listener, NEAR_SHAKE_DURATION, clamp(base_shake_amount, 0, NEAR_SHAKE_CAP)) +/client/proc/check_bomb_impacts() + set name = "Check Bomb Impact" + set category = "Debug" - else if(distance < far_distance) // You can hear a far explosion if you are outside the blast radius. Small explosions shouldn't be heard throughout the station. - var/far_volume = clamp(far_distance / 2, FAR_LOWER, FAR_UPPER) - if(creaking) - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = creaking_sound, distance_multiplier = 0) - else if(prob(FAR_SOUND_PROB)) // Sound variety during meteor storm/tesloose/other bad event - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = far_sound, distance_multiplier = 0) - else - listener.playsound_local(epicenter, null, far_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + var/turf/epicenter = get_turf(mob) + if(!epicenter) + return - if(base_shake_amount || quake_factor) - base_shake_amount = max(base_shake_amount, quake_factor * 3, 0) // Devastating explosions rock the station and ground - shake_camera(listener, FAR_SHAKE_DURATION, min(base_shake_amount, FAR_SHAKE_CAP)) + var/dev = 0 + var/heavy = 0 + var/light = 0 + var/list/choices = list("Small Bomb","Medium Bomb","Big Bomb","Custom Bomb") + var/choice = tgui_input_list(usr, "Pick the bomb size", "Bomb Size?", 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 - else if(!isspaceturf(listener_turf) && echo_factor) // Big enough explosions echo through the hull. - var/echo_volume - if(quake_factor) - echo_volume = 60 - shake_camera(listener, FAR_SHAKE_DURATION, clamp(quake_factor / 4, 0, FAR_SHAKE_CAP)) - else - echo_volume = 40 - listener.playsound_local(epicenter, null, echo_volume, TRUE, frequency, sound_to_use = echo_sound, distance_multiplier = 0) + var/power = max(dev, heavy, light) + 1 //Add ensure that explosions always affect atleast one turf. + var/dev_power = power - dev + var/heavy_power = power - heavy - if(creaking) // 5 seconds after the bang, the station begins to creak - addtimer(CALLBACK(listener, TYPE_PROC_REF(/mob, playsound_local), epicenter, null, rand(FREQ_LOWER, FREQ_UPPER), TRUE, frequency, null, null, FALSE, hull_creaking_sound, 0), CREAK_DELAY) + var/list/wipe_colors = list() + var/list/act_turfs = list() -#undef CREAK_DELAY -#undef QUAKE_CREAK_PROB -#undef ECHO_CREAK_PROB -#undef FAR_UPPER -#undef FAR_LOWER -#undef FAR_SOUND_PROB -#undef NEAR_SHAKE_CAP -#undef FAR_SHAKE_CAP -#undef NEAR_SHAKE_DURATION -#undef FAR_SHAKE_DURATION -#undef FREQ_UPPER -#undef FREQ_LOWER + SSexplosions.discover_turfs(epicenter, power, act_turfs) -/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 - EX_ACT(turf_thing, EXPLODE_LIGHT) - 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 - EX_ACT(turf_thing, EXPLODE_HEAVY) - 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 - EX_ACT(turf_thing, EXPLODE_DEVASTATE) - 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) - var/turf/T = thing - T.create_fire(2, rand(2, 10)) - cost_flameturf = MC_AVERAGE(cost_flameturf, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + for (var/turf/T as anything in act_turfs) + var/turf_power = act_turfs[T] + if (turf_power <= 0) + continue - if (low_turf.len || med_turf.len || high_turf.len) - Master.laggy_byond_map_update_incoming() + wipe_colors += T - if(currentpart == SSEXPLOSIONS_MOVABLES) - currentpart = SSEXPLOSIONS_THROWS + if(turf_power >= dev_power) + T.color = "red" + T.maptext = MAPTEXT("Dev") + else if(turf_power >= heavy_power) + T.color = "yellow" + T.maptext = MAPTEXT("Heavy") + else + T.color = "blue" + T.maptext = MAPTEXT("Light") - 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 - EX_ACT(movable_thing, EXPLODE_DEVASTATE) - 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 - EX_ACT(movable_thing, EXPLODE_HEAVY) - 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 - EX_ACT(movable_thing, EXPLODE_LIGHT) - cost_low_mov_atom = MC_AVERAGE(cost_low_mov_atom, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(wipe_color_and_text), wipe_colors), 10 SECONDS) +/proc/wipe_color_and_text(list/atom/wiping) + for(var/i in wiping) + var/atom/A = i + A.color = null + A.maptext = "" - 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(QDELETED(A)) - continue - 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 SEARCH_DIR +#undef EXPLFX_BOTH +#undef EXPLFX_SOUND +#undef EXPLFX_SHAKE +#undef EXPLFX_NONE diff --git a/code/controllers/subsystem/fluids.dm b/code/controllers/subsystem/fluids.dm new file mode 100644 index 000000000000..22ad3116b4f3 --- /dev/null +++ b/code/controllers/subsystem/fluids.dm @@ -0,0 +1,251 @@ +// Flags indicating what parts of the fluid the subsystem processes. +/// Indicates that a fluid subsystem processes fluid spreading. +#define SS_PROCESSES_SPREADING (1<<0) +/// Indicates that a fluid subsystem processes fluid effects. +#define SS_PROCESSES_EFFECTS (1<<1) + +/** + * # Fluid Subsystem + * + * A subsystem that processes the propagation and effects of a particular fluid. + * + * Both fluid spread and effect processing are handled through a carousel system. + * Fluids being spread and fluids being processed are organized into buckets. + * Each fresh (non-resumed) fire one bucket of each is selected to be processed. + * These selected buckets are then fully processed. + * The next fresh fire selects the next bucket in each set for processing. + * If this would walk off the end of a carousel list we wrap back to the first element. + * This effectively makes each set a circular list, hence a carousel. + */ +SUBSYSTEM_DEF(fluids) + name = "Fluid" + wait = 0 // Will be autoset to whatever makes the most sense given the spread and effect waits. + flags = SS_KEEP_TIMING + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + priority = FIRE_PRIORITY_FLUIDS + + // Fluid spread processing: + /// The amount of time (in deciseconds) before a fluid node is created and when it spreads. + var/spread_wait = 1 SECONDS + /// The number of buckets in the spread carousel. + var/num_spread_buckets + /// The set of buckets containing fluid nodes to spread. + var/list/spread_carousel + /// The index of the spread carousel bucket currently being processed. + var/spread_bucket_index + /// The set of fluid nodes we are currently processing spreading for. + var/list/currently_spreading + + // Fluid effect processing: + /// The amount of time (in deciseconds) between effect processing ticks for each fluid node. + var/effect_wait = 1 SECONDS + /// The number of buckets in the effect carousel. + var/num_effect_buckets + /// The set of buckets containing fluid nodes to process effects for. + var/list/effect_carousel + /// The index of the currently processing bucket on the effect carousel. + var/effect_bucket_index + /// The set of fluid nodes we are currently processing effects for. + var/list/currently_processing + +/datum/controller/subsystem/fluids/Initialize() + initialize_waits() + initialize_spread_carousel() + initialize_effect_carousel() + return ..() + +/** + * Initializes the subsystem waits. + * + * Ensures that the subsystem's fire wait evenly splits the spread and effect waits. + */ +/datum/controller/subsystem/fluids/proc/initialize_waits() + if (spread_wait <= 0) + WARNING("[src] has the invalid spread wait [spread_wait].") + spread_wait = 1 SECONDS + if (effect_wait <= 0) + WARNING("[src] has the invalid effect wait [effect_wait].") + spread_wait = 1 SECONDS + + // Sets the overall wait of the subsystem to evenly divide both the effect and spread waits. + var/max_wait = Gcd(spread_wait, effect_wait) + if (max_wait < wait || wait <= 0) + wait = max_wait + else + // If the wait of the subsystem overall is set to a valid value make the actual wait of the subsystem evenly divide that as well. + // Makes effect bubbling possible with identical spread and effect waits. + wait = Gcd(wait, max_wait) + + +/** + * Initializes the carousel used to process fluid spreading. + * + * Synchronizes the spread delta time with the actual target spread tick rate. + * Builds the carousel buckets used to queue spreads. + */ +/datum/controller/subsystem/fluids/proc/initialize_spread_carousel() + // Make absolutely certain that the spread wait is in sync with the target spread tick rate. + num_spread_buckets = round(spread_wait / wait) + spread_wait = wait * num_spread_buckets + + spread_carousel = list() + spread_carousel.len = num_spread_buckets + for(var/i in 1 to num_spread_buckets) + spread_carousel[i] = list() + currently_spreading = list() + spread_bucket_index = 1 + +/** + * Initializes the carousel used to process fluid effects. + * + * Synchronizes the spread delta time with the actual target spread tick rate. + * Builds the carousel buckets used to bubble processing. + */ +/datum/controller/subsystem/fluids/proc/initialize_effect_carousel() + // Make absolutely certain that the effect wait is in sync with the target effect tick rate. + num_effect_buckets = round(effect_wait / wait) + effect_wait = wait * num_effect_buckets + + effect_carousel = list() + effect_carousel.len = num_effect_buckets + for(var/i in 1 to num_effect_buckets) + effect_carousel[i] = list() + currently_processing = list() + effect_bucket_index = 1 + + +/datum/controller/subsystem/fluids/fire(resumed) + var/seconds_per_tick + var/cached_bucket_index + var/list/obj/effect/particle_effect/fluid/currentrun + // Ok so like I get the lighting style splittick but why are we doing this churn thing + // It seems like a bad idea for processing to get out of step with spreading + MC_SPLIT_TICK_INIT(2) + + MC_SPLIT_TICK // Start processing fluid spread (we take a lot of cpu for ourselves, spreading is more important after all) + if(!resumed) + spread_bucket_index = WRAP_UP(spread_bucket_index, num_spread_buckets) + currently_spreading = spread_carousel[spread_bucket_index] + spread_carousel[spread_bucket_index] = list() // Reset the bucket so we don't process an _entire station's worth of foam_ spreading every 2 ticks when the foam flood event happens. + + seconds_per_tick = spread_wait / (1 SECONDS) + currentrun = currently_spreading + while(currentrun.len) + var/obj/effect/particle_effect/fluid/to_spread = currentrun[currentrun.len] + currentrun.len-- + + if(!QDELETED(to_spread)) + to_spread.spread(seconds_per_tick) + to_spread.spread_bucket = null + + if (MC_TICK_CHECK) + break + + MC_SPLIT_TICK // Start processing fluid effects: + if(!resumed) + effect_bucket_index = WRAP_UP(effect_bucket_index, num_effect_buckets) + var/list/tmp_list = effect_carousel[effect_bucket_index] + currently_processing = tmp_list.Copy() + + seconds_per_tick = effect_wait / (1 SECONDS) + cached_bucket_index = effect_bucket_index + currentrun = currently_processing + while(currentrun.len) + var/obj/effect/particle_effect/fluid/to_process = currentrun[currentrun.len] + currentrun.len-- + + if (QDELETED(to_process) || to_process.process(seconds_per_tick) == PROCESS_KILL) + effect_carousel[cached_bucket_index] -= to_process + to_process.effect_bucket = null + to_process.datum_flags &= ~DF_ISPROCESSING + + if (MC_TICK_CHECK) + break + +/** + * Queues a fluid node to spread later after one full carousel rotation. + * + * Arguments: + * - [node][/obj/effect/particle_effect/fluid]: The node to queue to spread. + */ +/datum/controller/subsystem/fluids/proc/queue_spread(obj/effect/particle_effect/fluid/node) + if (node.spread_bucket) + return + + spread_carousel[spread_bucket_index] += node + node.spread_bucket = spread_bucket_index + +/** + * Cancels a queued spread of a fluid node. + * + * Arguments: + * - [node][/obj/effect/particle_effect/fluid]: The node to cancel the spread of. + */ +/datum/controller/subsystem/fluids/proc/cancel_spread(obj/effect/particle_effect/fluid/node) + if(!node.spread_bucket) + return + + var/bucket_index = node.spread_bucket + spread_carousel[bucket_index] -= node + if (bucket_index == spread_bucket_index) + currently_spreading -= node + + node.spread_bucket = null + +/** + * Starts processing the effects of a fluid node. + * + * The fluid node will next process after one full bucket rotation. + * + * Arguments: + * - [node][/obj/effect/particle_effect/fluid]: The node to start processing. + */ +/datum/controller/subsystem/fluids/proc/start_processing(obj/effect/particle_effect/fluid/node) + if (node.datum_flags & DF_ISPROCESSING || node.effect_bucket) + return + + // Edit this value to make all fluids process effects (at the same time|offset by when they started processing| -> offset by a random amount <- ) + var/bucket_index = rand(1, num_effect_buckets) + effect_carousel[bucket_index] += node + node.effect_bucket = bucket_index + node.datum_flags |= DF_ISPROCESSING + +/** + * Stops processing the effects of a fluid node. + * + * Arguments: + * - [node][/obj/effect/particle_effect/fluid]: The node to stop processing. + */ +/datum/controller/subsystem/fluids/proc/stop_processing(obj/effect/particle_effect/fluid/node) + if(!(node.datum_flags & DF_ISPROCESSING)) + return + + var/bucket_index = node.effect_bucket + if(!bucket_index) + return + + effect_carousel[bucket_index] -= node + if (bucket_index == effect_bucket_index) + currently_processing -= node + + node.effect_bucket = null + node.datum_flags &= ~DF_ISPROCESSING + +#undef SS_PROCESSES_SPREADING +#undef SS_PROCESSES_EFFECTS + + +// Subtypes: + +/// The subsystem responsible for processing smoke propagation and effects. +FLUID_SUBSYSTEM_DEF(smoke) + name = "Smoke" + spread_wait = 0.1 SECONDS + effect_wait = 2.0 SECONDS + +/// The subsystem responsible for processing foam propagation and effects. +FLUID_SUBSYSTEM_DEF(foam) + name = "Foam" + wait = 0.1 SECONDS // Makes effect bubbling work with foam. + spread_wait = 0.2 SECONDS + effect_wait = 0.2 SECONDS diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index bbd8aefd8056..01275908db81 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -82,32 +82,38 @@ SUBSYSTEM_DEF(garbage) /datum/controller/subsystem/garbage/Shutdown() //Adds the del() log to the qdel log file - var/list/dellog = list() + var/list/del_log = list() //sort by how long it's wasted hard deleting sortTim(items, cmp=GLOBAL_PROC_REF(cmp_qdel_item_time), associative = TRUE) for(var/path in items) var/datum/qdel_item/I = items[path] - dellog += "Path: [path]" + var/list/entry = list() + del_log[path] = entry + if (I.qdel_flags & QDEL_ITEM_SUSPENDED_FOR_LAG) - dellog += "\tSUSPENDED FOR LAG" + entry["SUSPENDED FOR LAG"] = TRUE if (I.failures) - dellog += "\tFailures: [I.failures]" - dellog += "\tqdel() Count: [I.qdels]" - dellog += "\tDestroy() Cost: [I.destroy_time]ms" + entry["Failures"] = I.failures + entry["qdel() Count"] = I.qdels + entry["Destroy() Cost (ms)"] = I.destroy_time + if (I.hard_deletes) - dellog += "\tTotal Hard Deletes: [I.hard_deletes]" - dellog += "\tTime Spent Hard Deleting: [I.hard_delete_time]ms" - dellog += "\tHighest Time Spent Hard Deleting: [I.hard_delete_max]ms" + entry["Total Hard Deletes"] = I.hard_deletes + entry["Time Spend Hard Deleting (ms)"] = I.hard_delete_time + entry["Highest Time Spend Hard Deleting (ms)"] = I.hard_delete_max if (I.hard_deletes_over_threshold) - dellog += "\tHard Deletes Over Threshold: [I.hard_deletes_over_threshold]" + entry["Hard Deletes Over Threshold"] = I.hard_deletes_over_threshold if (I.slept_destroy) - dellog += "\tSleeps: [I.slept_destroy]" + entry["Total Sleeps"] = I.slept_destroy if (I.no_respect_force) - dellog += "\tIgnored force: [I.no_respect_force] times" + entry["Total Ignored Force"] = I.no_respect_force if (I.no_hint) - dellog += "\tNo hint: [I.no_hint] times" - log_qdel(dellog.Join("\n")) + entry["Total No Hint"] = I.no_hint + if(LAZYLEN(I.extra_details)) + entry["Deleted Metadata"] = I.extra_details + + log_qdel(jointext(del_log, "\n")) /datum/controller/subsystem/garbage/fire() //the fact that this resets its processing each fire (rather then resume where it left off) is intentional. @@ -139,6 +145,10 @@ SUBSYSTEM_DEF(garbage) pass_counts[i] = 0 fail_counts[i] = 0 + +// 1 from the hard reference in the queue, and 1 from the variable used before this +#define REFS_WE_EXPECT 2 + /datum/controller/subsystem/garbage/proc/HandleQueue(level = GC_QUEUE_FILTER) if (level == GC_QUEUE_FILTER) delslasttick = 0 @@ -155,30 +165,31 @@ SUBSYSTEM_DEF(garbage) lastlevel = level - //We do this rather then for(var/refID in queue) because that sort of for loop copies the whole list. + //We do this rather then for(var/list/ref_info 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) + if (length(L) < GC_QUEUE_ITEM_INDEX_COUNT) count++ if (MC_TICK_CHECK) return continue - var/GCd_at_time = L[1] - if(GCd_at_time > cut_off_time) + var/queued_at_time = L[GC_QUEUE_ITEM_QUEUE_TIME] + if(queued_at_time > cut_off_time) break // Everything else is newer, skip them count++ - var/refID = L[2] - var/datum/D - D = locate(refID) - if (!D || D.gc_destroyed != GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + var/datum/D = L[GC_QUEUE_ITEM_REF] + + // 1 from the hard reference in the queue, and 1 from the variable used before this + // If that's all we've got, send er off + if (refcount(D) == REFS_WE_EXPECT) ++gcedlasttick ++totalgcs pass_counts[level]++ #ifdef REFERENCE_TRACKING - reference_find_on_fail -= refID //It's deleted we don't care anymore. + reference_find_on_fail -= ref(D) //It's deleted we don't care anymore. #endif if (MC_TICK_CHECK) return @@ -194,20 +205,29 @@ SUBSYSTEM_DEF(garbage) switch (level) if (GC_QUEUE_CHECK) #ifdef REFERENCE_TRACKING - if(reference_find_on_fail[refID]) - INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references)) + // Decides how many refs to look for (potentially) + // Based off the remaining and the ones we can account for + var/remaining_refs = refcount(D) - REFS_WE_EXPECT + if(reference_find_on_fail[ref(D)]) + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references), remaining_refs) ref_searching = TRUE #ifdef GC_FAILURE_HARD_LOOKUP else - INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references)) + INVOKE_ASYNC(D, TYPE_PROC_REF(/datum,find_references), remaining_refs) ref_searching = TRUE #endif - reference_find_on_fail -= refID + reference_find_on_fail -= ref(D) #endif var/type = D.type var/datum/qdel_item/I = items[type] - log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --") + var/message = "## TESTING: GC: -- [ref(D)] | [type] was unable to be GC'd -- (ref count of [refcount(D)])" + log_world(message) + + var/detail = D.dump_harddel_info() + if(detail) + LAZYADD(I.extra_details, detail) + #ifdef TESTING for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage var/client/admin = c @@ -242,36 +262,41 @@ SUBSYSTEM_DEF(garbage) queue.Cut(1,count+1) count = 0 +#undef REFS_WE_EXPECT + /datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_FILTER) if (isnull(D)) return if (level > GC_QUEUE_COUNT) HardDelete(D) return - var/gctime = world.time - var/refid = "\ref[D]" + var/queue_time = world.time - D.gc_destroyed = gctime - var/list/queue = queues[level] + if (D.gc_destroyed <= 0) + D.gc_destroyed = queue_time - queue[++queue.len] = list(gctime, refid) // not += for byond reasons + var/list/queue = queues[level] + queue[++queue.len] = list(queue_time, D, D.gc_destroyed) // not += for byond reasons //this is mainly to separate things profile wise. /datum/controller/subsystem/garbage/proc/HardDelete(datum/D) ++delslasttick ++totaldels var/type = D.type - var/refID = "\ref[D]" + var/refID = ref(D) + var/datum/qdel_item/type_info = items[type] + var/detail = D.dump_harddel_info() + if(detail) + LAZYADD(type_info.extra_details, detail) var/tick_usage = TICK_USAGE del(D) tick_usage = TICK_USAGE_TO_MS(tick_usage) - var/datum/qdel_item/I = items[type] - I.hard_deletes++ - I.hard_delete_time += tick_usage - if (tick_usage > I.hard_delete_max) - I.hard_delete_max = tick_usage + type_info.hard_deletes++ + type_info.hard_delete_time += tick_usage + if (tick_usage > type_info.hard_delete_max) + type_info.hard_delete_max = tick_usage if (tick_usage > highest_del_ms) highest_del_ms = tick_usage highest_del_type_string = "[type]" @@ -282,14 +307,14 @@ SUBSYSTEM_DEF(garbage) postpone(time) var/threshold = CONFIG_GET(number/hard_deletes_overrun_threshold) if (threshold && (time > threshold SECONDS)) - if (!(I.qdel_flags & QDEL_ITEM_ADMINS_WARNED)) + if (!(type_info.qdel_flags & QDEL_ITEM_ADMINS_WARNED)) log_game("Error: [type]([refID]) took longer than [threshold] seconds to delete (took [round(time/10, 0.1)] seconds to delete)") message_admins("Error: [type]([refID]) took longer than [threshold] seconds to delete (took [round(time/10, 0.1)] seconds to delete).") - I.qdel_flags |= QDEL_ITEM_ADMINS_WARNED - I.hard_deletes_over_threshold++ + type_info.qdel_flags |= QDEL_ITEM_ADMINS_WARNED + type_info.hard_deletes_over_threshold++ var/overrun_limit = CONFIG_GET(number/hard_deletes_overrun_limit) - if (overrun_limit && I.hard_deletes_over_threshold >= overrun_limit) - I.qdel_flags |= QDEL_ITEM_SUSPENDED_FOR_LAG + if (overrun_limit && type_info.hard_deletes_over_threshold >= overrun_limit) + type_info.qdel_flags |= QDEL_ITEM_SUSPENDED_FOR_LAG /datum/controller/subsystem/garbage/Recover() InitQueues() //We first need to create the queues before recovering data @@ -311,79 +336,85 @@ SUBSYSTEM_DEF(garbage) var/no_hint = 0 //!Number of times it's not even bother to give a qdel hint var/slept_destroy = 0 //!Number of times it's slept in its destroy var/qdel_flags = 0 //!Flags related to this type's trip thru qdel. + var/list/extra_details //!Lazylist of string metadata about the deleted objects /datum/qdel_item/New(mytype) name = "[mytype]" - /// 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(!istype(D)) - del(D) +/proc/qdel(datum/to_delete, force = FALSE, ...) + if(!istype(to_delete)) + del(to_delete) 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++ + var/datum/qdel_item/trash = SSgarbage.items[to_delete.type] + if (isnull(trash)) + trash = SSgarbage.items[to_delete.type] = new /datum/qdel_item(to_delete.type) + trash.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 - D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED - var/start_time = world.time - var/start_tick = world.tick_usage - SEND_SIGNAL(D, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy - var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. - if(world.time != start_time) - I.slept_destroy++ - else - I.destroy_time += TICK_USAGE_TO_MS(start_tick) - if(!D) + if(!isnull(to_delete.gc_destroyed)) + if(to_delete.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + CRASH("[to_delete.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") + return + + if (SEND_SIGNAL(to_delete, COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted + return + + to_delete.gc_destroyed = GC_CURRENTLY_BEING_QDELETED + var/start_time = world.time + var/start_tick = world.tick_usage + SEND_SIGNAL(to_delete, COMSIG_PARENT_QDELETING, force) // Let the (remaining) components know about the result of Destroy + var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + + if(world.time != start_time) + trash.slept_destroy++ + else + trash.destroy_time += TICK_USAGE_TO_MS(start_tick) + + if(isnull(to_delete)) + return + + switch(hint) + if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. + SSgarbage.Queue(to_delete) + if (QDEL_HINT_IWILLGC) + to_delete.gc_destroyed = world.time return - switch(hint) - if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. - SSgarbage.Queue(D) - if (QDEL_HINT_IWILLGC) - D.gc_destroyed = world.time + if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. + if(!force) + to_delete.gc_destroyed = null //clear the gc variable (important!) return - if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. - if(!force) - D.gc_destroyed = null //clear the gc variable (important!) - return - // Returning LETMELIVE after being told to force destroy - // indicates the objects Destroy() does not respect force - #ifdef TESTING - if(!I.no_respect_force) - testing("WARNING: [D.type] has been force deleted, but is \ - returning an immortal QDEL_HINT, indicating it does \ - not respect the force flag for qdel(). It has been \ - placed in the queue, further instances of this type \ - will also be queued.") - #endif - I.no_respect_force++ + // Returning LETMELIVE after being told to force destroy + // indicates the objects Destroy() does not respect force + #ifdef TESTING + if(!trash.no_respect_force) + testing("WARNING: [to_delete.type] has been force deleted, but is \ + returning an immortal QDEL_HINT, indicating it does \ + not respect the force flag for qdel(). It has been \ + placed in the queue, further instances of this type \ + will also be queued.") + #endif + trash.no_respect_force++ - SSgarbage.Queue(D) - if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete - 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) - #ifdef REFERENCE_TRACKING - if (QDEL_HINT_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. - SSgarbage.Queue(D) - D.find_references() //This breaks ci. Consider it insurance against somehow pring reftracking on accident - if (QDEL_HINT_IFFAIL_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled and the object fails to collect, display all references to this object. - SSgarbage.Queue(D) - SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE + SSgarbage.Queue(to_delete) + if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete + SSgarbage.Queue(to_delete, GC_QUEUE_HARDDELETE) + if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. + SSgarbage.HardDelete(to_delete) + #ifdef REFERENCE_TRACKING + if (QDEL_HINT_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion. + SSgarbage.Queue(to_delete) + INVOKE_ASYNC(to_delete, TYPE_PROC_REF(/datum, find_references)) + if (QDEL_HINT_IFFAIL_FINDREFERENCE) //qdel will, if REFERENCE_TRACKING is enabled and the object fails to collect, display all references to this object. + SSgarbage.Queue(to_delete) + SSgarbage.reference_find_on_fail[ref(to_delete)] = TRUE + #endif + else + #ifdef TESTING + if(!trash.no_hint) + testing("WARNING: [to_delete.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") #endif - else - #ifdef TESTING - if(!I.no_hint) - testing("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") - #endif - I.no_hint++ - 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") + trash.no_hint++ + SSgarbage.Queue(to_delete) diff --git a/code/controllers/subsystem/holomap.dm b/code/controllers/subsystem/holomap.dm new file mode 100644 index 000000000000..7a0c44218c77 --- /dev/null +++ b/code/controllers/subsystem/holomap.dm @@ -0,0 +1,115 @@ +SUBSYSTEM_DEF(holomap) + name = "Holomap" + flags = SS_NO_FIRE + init_order = INIT_ORDER_HOLOMAP + + /// Stores /icon objects for the holomaps + var/list/holomaps_by_z + + /// Stores images for the holomaps scaled down for use by station map machines as overlays + var/list/minimaps + var/list/minimap_icons + + /// Generic invalid holomap icon + var/icon/invalid_holomap_icon + +/datum/controller/subsystem/holomap/Initialize(start_timeofday) + holomaps_by_z = new /list(world.maxz) + minimaps = new /list(world.maxz) + minimap_icons = new /list(world.maxz) + + invalid_holomap_icon = icon('icons/blanks/480x480.dmi', "nothing") + var/icon/backdrop = icon('icons/hud/holomap/holomap_480x480.dmi', "stationmap") + var/icon/text = icon('icons/hud/holomap/holomap_64x64.dmi', "notfound") + + invalid_holomap_icon.Blend(backdrop, ICON_UNDERLAY) + invalid_holomap_icon.Blend(text, ICON_OVERLAY, 480/2, 480/2) + + generate_holomaps() + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_HOLOMAPS_READY) + return ..() + +/datum/controller/subsystem/holomap/proc/generate_holomaps() + var/offset_x = SSmapping.config.holomap_offsets[1] + var/offset_y = SSmapping.config.holomap_offsets[2] + + for(var/z_value in SSmapping.levels_by_trait(ZTRAIT_STATION)) + var/icon/canvas = icon('icons/blanks/480x480.dmi', "nothing") + var/area/A + turfloop: + for(var/turf/T as anything in block(1, 1, z_value, world.maxx, world.maxy, z_value)) + A = T.loc + + if(isnull(A.holomap_color)) + continue + + var/pixel_x = T.x + offset_x + var/pixel_y = T.y + offset_y + + // Draw spacebound airlocks + if(locate(/obj/machinery/door/airlock/external, T)) + for(var/dir in GLOB.cardinals) + var/turf/other = get_step(T, dir) + if(!istype(other.loc, /area/station)) + canvas.DrawBox(HOLOMAP_COLOR_EXTERNAL_AIRLOCK, pixel_x, pixel_y) + continue turfloop + + var/obj/structure/window/W + if(iswallturf(T) || locate(/obj/structure/low_wall, T) || ((W = locate(/obj/structure/window, T)) && W.fulltile) || locate(/obj/structure/plasticflaps, T)) + for(var/dir in GLOB.cardinals) + var/turf/other = get_step(T, dir) + var/area/other_area = other.loc + + // This check is for "Is the area bordering a non-station turf OR a different area color?" + if(!istype(other_area, /area/station) || (other_area.holomap_color != A.holomap_color)) + canvas.DrawBox(HOLOMAP_COLOR_WALL, pixel_x, pixel_y) + continue turfloop + + + // Draw pixel according to the area + canvas.DrawBox(A.holomap_color, pixel_x, pixel_y) + + generate_minimaps(canvas, z_value) + + var/icon/backdrop = icon('icons/hud/holomap/holomap_480x480.dmi', "stationmap") + canvas.Blend(backdrop, ICON_UNDERLAY) + holomaps_by_z[z_value] = canvas + +/// Generate minimaps from a full map. +/datum/controller/subsystem/holomap/proc/generate_minimaps(icon/canvas, z) + PRIVATE_PROC(TRUE) + var/icon/mini = icon('icons/blanks/480x480.dmi', "nothing") + mini.Blend(canvas, ICON_OVERLAY) + mini.Scale(32, 32) + + minimaps[z] = list( + "[NORTH]" = image(mini), + ) + + minimap_icons[z] = list( + "[NORTH]" = mini, + ) + + + var/icon/east = icon(mini) + east.Turn(90) + minimap_icons[z]["[EAST]"] = east + minimaps[z]["[EAST]"] = image(east) + + var/icon/south = icon(mini) + south.Turn(180) + minimap_icons[z]["[SOUTH]"] = south + minimaps[z]["[SOUTH]"] = image(south) + + var/icon/west = icon(mini) + west.Turn(270) + minimap_icons[z]["[WEST]"] = west + minimaps[z]["[WEST]"] = image(west) + +/// Get a holomap icon for a given z level +/datum/controller/subsystem/holomap/proc/get_holomap(z) + if(z < 1 || z > length(holomaps_by_z)) + return null + + return holomaps_by_z[z] diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm index 73997a252fe2..b7cfcb086d03 100644 --- a/code/controllers/subsystem/icon_smooth.dm +++ b/code/controllers/subsystem/icon_smooth.dm @@ -10,15 +10,22 @@ SUBSYSTEM_DEF(icon_smooth) var/list/blueprint_queue = list() var/list/smooth_queue = list() var/list/deferred = list() + var/list/deferred_by_source = list() /datum/controller/subsystem/icon_smooth/fire() + // We do not want to smooth icons of atoms whose neighbors are not initialized yet, + // this causes runtimes. + // Icon smoothing SS runs after atoms, so this only happens for something like shuttles. + // This kind of map loading shouldn't take too long, so the delay is not a problem. + if (SSatoms.initializing_something()) + return var/list/cached = smooth_queue while(length(cached)) var/atom/smoothing_atom = cached[length(cached)] cached.len-- if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED)) continue - if(smoothing_atom.flags_1 & INITIALIZED_1) + if(smoothing_atom.initialized) smoothing_atom.smooth_icon() else deferred += smoothing_atom @@ -32,10 +39,10 @@ SUBSYSTEM_DEF(icon_smooth) /datum/controller/subsystem/icon_smooth/Initialize() hibernate_checks = list( NAMEOF(src, smooth_queue), - NAMEOF(src, deferred) + NAMEOF(src, deferred), + NAMEOF(src, blueprint_queue), + NAMEOF(src, deferred_by_source) ) - smooth_zlevel(1, TRUE) - smooth_zlevel(2, TRUE) var/list/queue = smooth_queue smooth_queue = list() @@ -43,7 +50,7 @@ SUBSYSTEM_DEF(icon_smooth) while(length(queue)) var/atom/smoothing_atom = queue[length(queue)] queue.len-- - if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED) || smoothing_atom.z <= 2) + if(QDELETED(smoothing_atom) || !(smoothing_atom.smoothing_flags & SMOOTH_QUEUED)) continue smoothing_atom.smooth_icon() CHECK_TICK @@ -51,25 +58,45 @@ SUBSYSTEM_DEF(icon_smooth) queue = blueprint_queue blueprint_queue = null - for(var/item in queue) - var/atom/movable/movable_item = item + for(var/atom/movable/movable_item as anything in queue) if(!isturf(movable_item.loc)) continue + var/turf/item_loc = movable_item.loc item_loc.add_blueprints(movable_item) return ..() +/datum/controller/subsystem/icon_smooth/StartLoadingMap() + can_fire = FALSE + +/datum/controller/subsystem/icon_smooth/StopLoadingMap() + can_fire = TRUE + +/// Releases a pool of delayed smooth attempts from a particular source +/datum/controller/subsystem/icon_smooth/proc/free_deferred(source_to_free) + smooth_queue += deferred_by_source[source_to_free] + deferred_by_source -= source_to_free + if(!can_fire) + can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing) if(thing.smoothing_flags & SMOOTH_QUEUED) return thing.smoothing_flags |= SMOOTH_QUEUED + // If we're currently locked into mapload BY something + // Then put us in a deferred list that we release when this mapload run is finished + if(initialized && length(SSatoms.initialized_state) && SSatoms.initialized == INITIALIZATION_INNEW_MAPLOAD) + var/source = SSatoms.get_initialized_source() + LAZYADD(deferred_by_source[source], thing) + return smooth_queue += thing if(!can_fire) can_fire = TRUE /datum/controller/subsystem/icon_smooth/proc/remove_from_queues(atom/thing) + // Lack of removal from deferred_by_source is safe because the lack of SMOOTH_QUEUED will just free it anyway + // Hopefully this'll never cause a harddel (dies) thing.smoothing_flags &= ~SMOOTH_QUEUED smooth_queue -= thing if(blueprint_queue) diff --git a/code/controllers/subsystem/id_access.dm b/code/controllers/subsystem/id_access.dm index 8604d253a4d7..7810933d3235 100644 --- a/code/controllers/subsystem/id_access.dm +++ b/code/controllers/subsystem/id_access.dm @@ -166,19 +166,13 @@ SUBSYSTEM_DEF(id_access) ), "[ACCESS_HOS]" = list( "regions" = list(REGION_SECURITY), - "head" = JOB_HEAD_OF_SECURITY, + "head" = JOB_SECURITY_MARSHAL, "templates" = list(), "pdas" = list(), ), "[ACCESS_CMO]" = list( "regions" = list(REGION_MEDBAY), - "head" = JOB_CHIEF_MEDICAL_OFFICER, - "templates" = list(), - "pdas" = list(), - ), - "[ACCESS_RD]" = list( - "regions" = list(REGION_RESEARCH), - "head" = JOB_RESEARCH_DIRECTOR, + "head" = JOB_MEDICAL_DIRECTOR, "templates" = list(), "pdas" = list(), ), @@ -248,7 +242,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_SECURITY]"] = "Security" desc_by_access["[ACCESS_BRIG]"] = "Holding Cells" desc_by_access["[ACCESS_COURT]"] = "Courtroom" - desc_by_access["[ACCESS_FORENSICS]"] = "Forensics" + desc_by_access["[ACCESS_FORENSICS]"] = "P.I's Office" desc_by_access["[ACCESS_MEDICAL]"] = "Medical" desc_by_access["[ACCESS_GENETICS]"] = "Genetics Lab" desc_by_access["[ACCESS_MORGUE]"] = "Morgue" @@ -267,7 +261,7 @@ SUBSYSTEM_DEF(id_access) desc_by_access["[ACCESS_AI_UPLOAD]"] = "AI Chambers" desc_by_access["[ACCESS_TELEPORTER]"] = "Teleporter" desc_by_access["[ACCESS_EVA]"] = "EVA" - desc_by_access["[ACCESS_HEADS]"] = "Bridge" + desc_by_access["[ACCESS_MANAGEMENT]"] = "Management" desc_by_access["[ACCESS_CAPTAIN]"] = "Captain" desc_by_access["[ACCESS_ALL_PERSONAL_LOCKERS]"] = "Personal Lockers" desc_by_access["[ACCESS_CHAPEL_OFFICE]"] = "Chapel Office" diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 246ab84768a7..61a7e411c8e1 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -1,15 +1,36 @@ -SUBSYSTEM_DEF(input) +VERB_MANAGER_SUBSYSTEM_DEF(input) name = "Input" - wait = 1 //SS_TICKER means this runs every tick init_order = INIT_ORDER_INPUT init_stage = INITSTAGE_EARLY flags = SS_TICKER priority = FIRE_PRIORITY_INPUT runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + use_default_stats = FALSE + /// Standard macroset *ALL* players get var/list/macro_set + /// Macros applied only to hotkey users + var/list/hotkey_only_set + /// Macros applied onlt to classic users + var/list/classic_only_set + /// Typecache of all unprintable keys that are safe for classic to bind + var/list/unprintables_cache + /// Macro IDs we shouldn't clear during client.clear_macros() + var/list/protected_macro_ids -/datum/controller/subsystem/input/Initialize() + ///running average of how many clicks inputted by a player the server processes every second. used for the subsystem stat entry + var/clicks_per_second = 0 + ///count of how many clicks onto atoms have elapsed before being cleared by fire(). used to average with clicks_per_second. + var/current_clicks = 0 + ///acts like clicks_per_second but only counts the clicks actually processed by SSinput itself while clicks_per_second counts all clicks + var/delayed_clicks_per_second = 0 + ///running average of how many movement iterations from player input the server processes every second. used for the subsystem stat entry + var/movements_per_second = 0 + ///running average of the amount of real time clicks take to truly execute after the command is originally sent to the server. + ///if a click isnt delayed at all then it counts as 0 deciseconds. + var/average_click_delay = 0 + +/datum/controller/subsystem/verb_manager/input/Initialize() setup_default_macro_sets() initialized = TRUE @@ -19,22 +40,163 @@ SUBSYSTEM_DEF(input) return ..() // This is for when macro sets are eventualy datumized -/datum/controller/subsystem/input/proc/setup_default_macro_sets() +/datum/controller/subsystem/verb_manager/input/proc/setup_default_macro_sets() macro_set = list( - "Any" = "\"KeyDown \[\[*\]\]\"", - "Any+UP" = "\"KeyUp \[\[*\]\]\"", - "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", - "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", - "Escape" = "Reset-Held-Keys", + // These could probably just be put in the skin. I actually don't understand WHY they aren't just in the skin. Besides the use of defines for Tab. + "Back" = "\".winset \\\"input.text=\\\"\\\"\\\"\"", + "Tab" = "\".winset \\\"input.focus=true?map.focus=true input.background-color=[COLOR_INPUT_DISABLED]:input.focus=true input.background-color=[COLOR_INPUT_ENABLED]\\\"\"", + "Escape" = "Reset-Held-Keys", + ) + hotkey_only_set = list( + "Any" = "\"KeyDown \[\[*\]\]\"", + "Any+UP" = "\"KeyUp \[\[*\]\]\"", + ) + classic_only_set = list( + //We need to force these to capture them for macro modifiers. + //Did I mention I fucking despise the way this system works at a base, almost reptilian-barely-understands-consciousness level? + //Because I do. + "Alt" = "\"KeyDown Alt\"", + "Alt+UP" = "\"KeyUp Alt\"", + "Ctrl" = "\"KeyDown Ctrl\"", + "Ctrl+UP" = "\"KeyUp Ctrl\"", + ) + // This list may be out of date, and may include keys not actually legal to bind? The only full list is from 2008. http://www.byond.com/docs/notes/macro.html + unprintables_cache = list( + // Arrow Keys + "North" = TRUE, + "West" = TRUE, + "East" = TRUE, + "South" = TRUE, + // Numpad-Lock Disabled + "Northwest" = TRUE, // KP_Home + "Northeast" = TRUE, // KP_PgUp + "Center" = TRUE, + "Southwest" = TRUE, // KP_End + "Southeast" = TRUE, // KP_PgDn + // Keys you really shouldn't touch, but are technically unprintable + "Return" = TRUE, + "Escape" = TRUE, + "Delete" = TRUE, + // Things I'm not sure BYOND actually supports anymore. + "Select" = TRUE, + "Execute" = TRUE, + "Snapshot" = TRUE, + "Attn" = TRUE, + "CrSel" = TRUE, + "ExSel" = TRUE, + "ErEOF" = TRUE, + "Zoom" = TRUE, + "PA1" = TRUE, + "OEMClear" = TRUE, + // Things the modern ref says is okay + "Pause" = TRUE, + "Play" = TRUE, + "Insert" = TRUE, + "Help" = TRUE, + "LWin" = TRUE, + "RWin" = TRUE, + "Apps" = TRUE, + "Numpad0" = TRUE, + "Numpad1" = TRUE, + "Numpad2" = TRUE, + "Numpad3" = TRUE, + "Numpad4" = TRUE, + "Numpad5" = TRUE, + "Numpad6" = TRUE, + "Numpad7" = TRUE, + "Numpad8" = TRUE, + "Numpad9" = TRUE, + "Multiply" = TRUE, + "Add" = TRUE, + "Separator" = TRUE, + "Subtract" = TRUE, + "Decimal" = TRUE, + "Divide" = TRUE, + "F1" = TRUE, + "F2" = TRUE, + "F3" = TRUE, + "F4" = TRUE, + "F5" = TRUE, + "F6" = TRUE, + "F7" = TRUE, + "F8" = TRUE, + "F9" = TRUE, + "F10" = TRUE, + "F11" = TRUE, + "F12" = TRUE, + "F13" = TRUE, + "F14" = TRUE, + "F15" = TRUE, + "F16" = TRUE, + "F17" = TRUE, + "F18" = TRUE, + "F19" = TRUE, + "F20" = TRUE, + "F21" = TRUE, + "F22" = TRUE, + "F23" = TRUE, + "F24" = TRUE, + ) + // Macro IDs we don't delete on wipe, Usually stuff baked into the skin, or that we have to be more careful with. + protected_macro_ids = list( + "PROTECTED-Shift", + "PROTECTED-ShiftUp" ) // Badmins just wanna have fun ♪ -/datum/controller/subsystem/input/proc/refresh_client_macro_sets() +/datum/controller/subsystem/verb_manager/input/proc/refresh_client_macro_sets() var/list/clients = GLOB.clients for(var/i in 1 to clients.len) var/client/user = clients[i] user.set_macros() -/datum/controller/subsystem/input/fire() - for(var/mob/user as anything in GLOB.keyloop_list) - user.focus?.keyLoop(user.client) +/datum/controller/subsystem/verb_manager/input/can_queue_verb(datum/callback/verb_callback/incoming_callback, control) + //make sure the incoming verb is actually something we specifically want to handle + if(control != "mapwindow.map") + return FALSE + + if((average_click_delay > MAXIMUM_CLICK_LATENCY || !..()) && !always_queue) + current_clicks++ + average_click_delay = MC_AVG_FAST_UP_SLOW_DOWN(average_click_delay, 0) + return FALSE + + return TRUE + +///stupid workaround for byond not recognizing the /atom/Click typepath for the queued click callbacks +/atom/proc/_Click(location, control, params) + if(usr) + Click(location, control, params) + +/datum/controller/subsystem/verb_manager/input/fire() + ..() + + var/moves_this_run = 0 + for(var/mob/user in GLOB.keyloop_list) + moves_this_run += user.focus?.keyLoop(user.client)//only increments if a player moves due to their own input + + movements_per_second = MC_AVG_SECONDS(movements_per_second, moves_this_run, wait TICKS) + +/datum/controller/subsystem/verb_manager/input/run_verb_queue() + var/deferred_clicks_this_run = 0 //acts like current_clicks but doesnt count clicks that dont get processed by SSinput + + for(var/datum/callback/verb_callback/queued_click as anything in verb_queue) + if(!istype(queued_click)) + stack_trace("non /datum/callback/verb_callback instance inside SSinput's verb_queue!") + continue + + average_click_delay = MC_AVG_FAST_UP_SLOW_DOWN(average_click_delay, TICKS2DS((DS2TICKS(world.time) - queued_click.creation_time))) + queued_click.InvokeAsync() + + current_clicks++ + deferred_clicks_this_run++ + + verb_queue.Cut() //is ran all the way through every run, no exceptions + + clicks_per_second = MC_AVG_SECONDS(clicks_per_second, current_clicks, wait SECONDS) + delayed_clicks_per_second = MC_AVG_SECONDS(delayed_clicks_per_second, deferred_clicks_this_run, wait SECONDS) + current_clicks = 0 + +/datum/controller/subsystem/verb_manager/input/stat_entry(msg) + . = ..() + . += "M/S:[round(movements_per_second,0.01)] | C/S:[round(clicks_per_second,0.01)] ([round(delayed_clicks_per_second,0.01)] | CD: [round(average_click_delay / (1 SECONDS),0.01)])" + diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index 394ea494fe49..17fd3decb6a0 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -15,10 +15,10 @@ SUBSYSTEM_DEF(job) /// Dictionary of jobs indexed by the experience type they grant. var/list/experience_jobs_map = list() - /// List of all departments with joinable jobs. - var/list/datum/job_department/joinable_departments = list() - /// List of all joinable departments indexed by their typepath, sorted by their own display order. - var/list/datum/job_department/joinable_departments_by_type = list() + /// List of all departments. + var/list/datum/job_department/departments = list() + /// List of all departments indexed by their typepath, sorted by their own display order. + var/list/datum/job_department/departments_by_type = list() var/list/unassigned = list() //Players who need jobs var/initial_players_to_assign = 0 //used for checking against population caps @@ -46,11 +46,10 @@ SUBSYSTEM_DEF(job) var/list/chain_of_command = list( JOB_CAPTAIN = 1, JOB_HEAD_OF_PERSONNEL = 2, - JOB_RESEARCH_DIRECTOR = 3, - JOB_CHIEF_ENGINEER = 4, - JOB_CHIEF_MEDICAL_OFFICER = 5, - JOB_HEAD_OF_SECURITY = 6, - JOB_QUARTERMASTER = 7, + JOB_CHIEF_ENGINEER = 3, + JOB_MEDICAL_DIRECTOR = 4, + JOB_SECURITY_MARSHAL = 5, + JOB_QUARTERMASTER = 6, ) /// If TRUE, some player has been assigned Captaincy or Acting Captaincy at some point during the shift and has been given the spare ID safe code. @@ -65,16 +64,29 @@ SUBSYSTEM_DEF(job) /// Dictionary that maps job priorities to low/medium/high. Keys have to be number-strings as assoc lists cannot be indexed by integers. Set in setup_job_lists. var/list/job_priorities_to_strings + var/list/department_has_atleast_one_player + + /// A k:v list of department_path : name, where name is the name of the player who was given head access at roundstart + var/list/temporary_heads_by_dep = list() + /datum/controller/subsystem/job/Initialize(timeofday) setup_job_lists() if(!length(all_occupations)) SetupOccupations() - if(CONFIG_GET(flag/load_jobs_from_txt)) - LoadJobs() set_overflow_role(CONFIG_GET(string/overflow_job)) setup_employers() return ..() +/// Returns a list of department paths that must be filled. +/datum/controller/subsystem/job/proc/get_necessary_departments() + . = list( + /datum/job_department/command = FALSE, + /datum/job_department/engineering = FALSE, + /datum/job_department/medical = FALSE, + /datum/job_department/cargo = FALSE, + /datum/job_department/security = FALSE, + ) + /datum/controller/subsystem/job/proc/set_overflow_role(new_overflow_role) var/datum/job/new_overflow = ispath(new_overflow_role) ? GetJobType(new_overflow_role) : GetJob(new_overflow_role) if(!new_overflow) @@ -104,62 +116,71 @@ SUBSYSTEM_DEF(job) if(!length(all_jobs)) all_occupations = list() joinable_occupations = list() - joinable_departments = list() - joinable_departments_by_type = list() + departments = list() + departments_by_type = list() experience_jobs_map = list() to_chat(world, span_boldannounce("Error setting up jobs, no job datums found")) return FALSE var/list/new_all_occupations = list() var/list/new_joinable_occupations = list() - var/list/new_joinable_departments = list() - var/list/new_joinable_departments_by_type = list() + var/list/new_departments = list() + var/list/new_departments_by_type = list() var/list/new_experience_jobs_map = list() for(var/job_type in all_jobs) var/datum/job/job = new job_type() if(!job.config_check()) continue + if(!job.map_check()) //Even though we initialize before mapping, this is fine because the config is loaded at new testing("Removed [job.type] due to map config") continue + new_all_occupations += job name_occupations[job.title] = job type_occupations[job_type] = job + if(job.job_flags & JOB_NEW_PLAYER_JOINABLE) new_joinable_occupations += job - if(!LAZYLEN(job.departments_list)) - var/datum/job_department/department = new_joinable_departments_by_type[/datum/job_department/undefined] - if(!department) - department = new /datum/job_department/undefined() - new_joinable_departments_by_type[/datum/job_department/undefined] = department - department.add_job(job) - continue - for(var/department_type in job.departments_list) - var/datum/job_department/department = new_joinable_departments_by_type[department_type] - if(!department) - department = new department_type() - new_joinable_departments_by_type[department_type] = department - department.add_job(job) + + if(!LAZYLEN(job.departments_list)) + var/datum/job_department/department = new_departments_by_type[/datum/job_department/undefined] + if(!department) + department = new /datum/job_department/undefined() + new_departments_by_type[/datum/job_department/undefined] = department + + department.add_job(job) + continue + + for(var/department_type in job.departments_list) + var/datum/job_department/department = new_departments_by_type[department_type] + if(!department) + department = new department_type() + new_departments_by_type[department_type] = department + + department.add_job(job) sortTim(new_all_occupations, GLOBAL_PROC_REF(cmp_job_display_asc)) + for(var/datum/job/job as anything in new_all_occupations) if(!job.exp_granted_type) continue new_experience_jobs_map[job.exp_granted_type] += list(job) - sortTim(new_joinable_departments_by_type, GLOBAL_PROC_REF(cmp_department_display_asc), associative = TRUE) - for(var/department_type in new_joinable_departments_by_type) - var/datum/job_department/department = new_joinable_departments_by_type[department_type] + sortTim(new_departments_by_type, GLOBAL_PROC_REF(cmp_department_display_asc), associative = TRUE) + + for(var/department_type in new_departments_by_type) + var/datum/job_department/department = new_departments_by_type[department_type] sortTim(department.department_jobs, GLOBAL_PROC_REF(cmp_job_display_asc)) - new_joinable_departments += department + new_departments += department if(department.department_experience_type) new_experience_jobs_map[department.department_experience_type] = department.department_jobs.Copy() all_occupations = new_all_occupations joinable_occupations = sortTim(new_joinable_occupations, GLOBAL_PROC_REF(cmp_job_display_asc)) - joinable_departments = new_joinable_departments - joinable_departments_by_type = new_joinable_departments_by_type + departments = new_departments + departments_by_type = new_departments_by_type experience_jobs_map = new_experience_jobs_map return TRUE @@ -184,7 +205,7 @@ SUBSYSTEM_DEF(job) /datum/controller/subsystem/job/proc/get_department_type(department_type) if(!length(all_occupations)) SetupOccupations() - return joinable_departments_by_type[department_type] + return departments_by_type[department_type] /datum/controller/subsystem/job/proc/GetEmployer(datum/employer/E) RETURN_TYPE(/datum/employer) @@ -217,6 +238,11 @@ SUBSYSTEM_DEF(job) player.mind.set_assigned_role(job) unassigned -= player job.current_positions++ + + for(var/datum/job_department/path as anything in job.departments_list) + if(department_has_atleast_one_player[path] == FALSE) + department_has_atleast_one_player[path] = TRUE + return TRUE /datum/controller/subsystem/job/proc/FindOccupationCandidates(datum/job/job, level) @@ -226,14 +252,17 @@ SUBSYSTEM_DEF(job) if(!player) JobDebug("FOC player no longer exists.") continue + if(!player.client) JobDebug("FOC player client no longer exists, Player: [player]") continue + // Initial screening check. Does the player even have the job enabled, if they do - Is it at the correct priority level? var/player_job_level = player.client?.prefs.read_preference(/datum/preference/blob/job_priority)[job.title] if(isnull(player_job_level)) JobDebug("FOC player job not enabled, Player: [player]") continue + else if(player_job_level != level) JobDebug("FOC player job enabled at wrong level, Player: [player], TheirLevel: [job_priority_level_to_string(player_job_level)], ReqLevel: [job_priority_level_to_string(level)]") continue @@ -245,6 +274,7 @@ SUBSYSTEM_DEF(job) // They have the job enabled, at this priority level, with no restrictions applying to them. JobDebug("FOC pass, Player: [player], Level: [job_priority_level_to_string(level)]") candidates += player + return candidates @@ -264,8 +294,8 @@ SUBSYSTEM_DEF(job) JobDebug("GRJ skipping overflow role, Player: [player], Job: [job]") continue - if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) //If you want a command position, select it! - JobDebug("GRJ skipping command role, Player: [player], Job: [job]") + if(job.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER) //If you want a leadership position, select it! + JobDebug("GRJ skipping leadership role, Player: [player], Job: [job]") continue /* @@ -329,15 +359,18 @@ SUBSYSTEM_DEF(job) * * level - One of the JP_LOW, JP_MEDIUM or JP_HIGH defines. Attempts to find candidates with head jobs at this priority only. */ /datum/controller/subsystem/job/proc/CheckHeadPositions(level) - var/datum/job_department/command_department = get_department_type(/datum/job_department/command) + var/datum/job_department/command_department = get_department_type(/datum/job_department/company_leader) if(!command_department) return + for(var/datum/job/job as anything in command_department.department_jobs) if((job.current_positions >= job.total_positions) && job.total_positions != -1) continue + var/list/candidates = FindOccupationCandidates(job, level) if(!candidates.len) continue + var/mob/dead/new_player/candidate = pick(candidates) // Eligibility checks done as part of FindOccupationCandidates AssignRole(candidate, job, do_eligibility_checks = FALSE) @@ -363,22 +396,26 @@ 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") SEND_SIGNAL(src, COMSIG_OCCUPATIONS_DIVIDED) + department_has_atleast_one_player = get_necessary_departments() + //Get the players who are ready - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/player = i - if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences() && player.mind && is_unassigned_job(player.mind.assigned_role)) + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) + if(player.ready == PLAYER_READY_TO_PLAY && player.check_preferences() && player.mind && is_unassigned_job(player.mind.assigned_role) && (!player.client?.restricted_mode)) unassigned += player initial_players_to_assign = unassigned.len JobDebug("DO, Len: [unassigned.len]") + if(unassigned.len == 0) + return validate_required_jobs(required_jobs) + //Scale number of open security officer slots to population setup_officer_positions() @@ -399,6 +436,10 @@ SUBSYSTEM_DEF(job) JobDebug("DO, Assigning Priority Positions: [length(dynamic_forced_occupations)]") assign_priority_positions() + . = assign_captain() + if(!.) + return FALSE + //People who wants to be the overflow role, sure, go on. JobDebug("DO, Running Overflow Check 1") var/datum/job/overflow_datum = GetJobType(overflow_role) @@ -471,13 +512,16 @@ SUBSYSTEM_DEF(job) JobDebug("DO, Ending standard job assignment") JobDebug("DO, Handle unassigned.") + // Hand out random jobs to the people who didn't get any in the last check // Also makes sure that they got their preference correct for(var/mob/dead/new_player/player in unassigned) HandleUnassigned(player) + JobDebug("DO, Ending handle unassigned.") JobDebug("DO, Handle unrejectable unassigned") + //Mop up people who can't leave. for(var/mob/dead/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) if(!GiveRandomJob(player)) @@ -485,12 +529,28 @@ SUBSYSTEM_DEF(job) JobDebug("DO, Forced antagonist could not be assigned any random job or the overflow role. DivideOccupations failed.") JobDebug("---------------------------------------------------") return FALSE //Living on the edge, the forced antagonist couldn't be assigned to overflow role (bans, client age) - just reroll + JobDebug("DO, Ending handle unrejectable unassigned") + if(!(GLOB.is_debug_server && BYPASS_JOB_LIMITS_WHEN_DEBUGGING)) + if(CONFIG_GET(flag/require_departments_staffed)) + JobDebug("DO, ensuring that all departments have atleast one player.") + + var/we_fucked = FALSE + for(var/path in department_has_atleast_one_player) + if(department_has_atleast_one_player[path] == FALSE) + JobDebug("DO, [path] does not have any players, aborting.") + we_fucked = TRUE + + if(we_fucked) + return FALSE + + JobDebug("DO, all departments have atleast one player.") + JobDebug("All divide occupations tasks completed.") JobDebug("---------------------------------------------------") - return TRUE + return validate_required_jobs(required_jobs) //We couldn't find a job from prefs for this guy. /datum/controller/subsystem/job/proc/HandleUnassigned(mob/dead/new_player/player) @@ -547,16 +607,10 @@ SUBSYSTEM_DEF(job) handle_auto_deadmin_roles(player_client, job.title) if(player_client) - to_chat(player_client, examine_block(span_infoplain("You are the [chosen_title].

As the [chosen_title == job.title ? chosen_title : "[chosen_title] ([job.title])"] you answer directly to [job.supervisors]. Special circumstances may change this."))) - - job.radio_help_message(equipping) + job.on_join_message(player_client, chosen_title) + job.on_join_popup(player_client, chosen_title) if(player_client) - // We agreed it's safe to remove this, but commented out instead of fully removed incase we want to reverse that decision. - /*if(job.req_admin_notify) - to_chat(player_client, "You are playing a job that is important for Game Progression. If you have to disconnect, please notify the admins via adminhelp.") - */ - var/related_policy = get_policy(job.title) if(related_policy) to_chat(player_client, related_policy) @@ -566,7 +620,10 @@ SUBSYSTEM_DEF(job) if(ishuman(equipping)) var/mob/living/carbon/human/wageslave = equipping - wageslave.mind.add_memory(MEMORY_ACCOUNT, list(DETAIL_ACCOUNT_ID = wageslave.account_id), story_value = STORY_VALUE_SHIT, memory_flags = MEMORY_FLAG_NOLOCATION) + var/datum/bank_account/bank = SSeconomy.bank_accounts_by_id["[wageslave.account_id]"] + + wageslave.mind.add_memory(MEMORY_ACCOUNT, list(DETAIL_ACCOUNT_ID = wageslave.account_id, DETAIL_ACCOUNT_PIN = bank.account_pin), story_value = STORY_VALUE_SHIT, memory_flags = MEMORY_FLAG_NOLOCATION) + to_chat(player_client, span_obviousnotice("Your bank account pin is: [bank.account_pin]")) setup_alt_job_items(wageslave, job, player_client) //PARIAH EDIT ADDITION @@ -610,6 +667,7 @@ SUBSYSTEM_DEF(job) var/equip_needed = J.total_positions if(equip_needed < 0) // -1: infinite available slots equip_needed = 12 + for(var/i=equip_needed-5, i>0, i--) if(GLOB.secequipment.len) var/spawnloc = GLOB.secequipment[1] @@ -618,18 +676,6 @@ SUBSYSTEM_DEF(job) else //We ran out of spare locker spawns! break - -/datum/controller/subsystem/job/proc/LoadJobs() - var/jobstext = file2text("[global.config.directory]/jobs.txt") - for(var/datum/job/job as anything in joinable_occupations) - var/regex/jobs = new("[job.title]=(-1|\\d+),(-1|\\d+)") - jobs.Find(jobstext) - if(length(jobs.group)<2) - stack_trace("failed to find a job entry for [job.title] in jobs.txt") - continue - job.total_positions = text2num(jobs.group[1]) - job.spawn_positions = text2num(jobs.group[2]) - /datum/controller/subsystem/job/proc/HandleFeedbackGathering() for(var/datum/job/job as anything in joinable_occupations) var/high = 0 //high @@ -771,20 +817,43 @@ SUBSYSTEM_DEF(job) /////////////////////////////////// //Keeps track of all living heads// /////////////////////////////////// -/datum/controller/subsystem/job/proc/get_living_heads() +/datum/controller/subsystem/job/proc/get_living_heads(management_only) . = list() for(var/mob/living/carbon/human/player as anything in GLOB.human_list) - if(player.stat != DEAD && (player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)) + if(player.stat == DEAD || !player.mind?.assigned_role) + continue + + if(management_only && (player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_MANAGEMENT)) . += player.mind + else if ((player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER)) + . += player.mind //////////////////////////// //Keeps track of all heads// //////////////////////////// -/datum/controller/subsystem/job/proc/get_all_heads() +/datum/controller/subsystem/job/proc/get_all_heads(management_only) . = list() for(var/mob/living/carbon/human/player as anything in GLOB.human_list) - if(player.mind?.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(!player.mind?.assigned_role) + continue + + if(management_only && (player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_MANAGEMENT)) + . += player.mind + + else if ((player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER)) + . += player.mind + +///////////////////////////////// +//Keeps track of all management// +///////////////////////////////// +/datum/controller/subsystem/job/proc/get_all_management(management_only) + . += list() + for(var/mob/living/carbon/human/player as anything in GLOB.human_list) + if(!player.mind?.assigned_role) + continue + + if(player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_MANAGEMENT) . += player.mind ////////////////////////////////////////////// @@ -862,12 +931,37 @@ SUBSYSTEM_DEF(job) // Force-give their ID card bridge access. var/obj/item/id_slot = new_captain.get_item_by_slot(ITEM_SLOT_ID) if(id_slot) - var/obj/item/card/id/id_card = id_slot.GetID() - if(!(ACCESS_HEADS in id_card.access)) - id_card.add_wildcards(list(ACCESS_HEADS), mode=FORCE_ADD_ALL) + var/obj/item/card/id/id_card = id_slot.GetID(TRUE) || locate() in id_slot + if(id_card && !(ACCESS_MANAGEMENT in id_card.access)) + id_card.add_wildcards(list(ACCESS_MANAGEMENT), mode=FORCE_ADD_ALL) assigned_captain = TRUE +/// Called when there's no department head present. +/datum/controller/subsystem/job/proc/promote_to_department_head(mob/living/carbon/human/new_head, datum/job/assigned_job) + var/obj/item/id_slot = new_head.get_item_by_slot(ITEM_SLOT_ID) + if(!id_slot) + return NONE + + var/obj/item/card/id/id_card = id_slot.GetID(TRUE) || locate() in id_slot + if(!id_card) + return NONE + + var/datum/job_department/department = SSjob.get_department_type(assigned_job.departments_list?[1]) + if(!department) + CRASH("Somehow someone tried to get promoted to department head despite their job not having a valid department. Value: [assigned_job.departments_list?[1] || "NULL"]") + + var/datum/job/head_job = SSjob.GetJobType(department.department_head) + var/datum/outfit/outfit_prototype = head_job.outfits["Default"][SPECIES_HUMAN] + var/datum/id_trim/trim = SSid_access.trim_singletons_by_path[initial(outfit_prototype.id_trim)] + + id_card.add_access(trim.access, mode=FORCE_ADD_ALL) + + SSdatacore.OnReady(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(aas_pda_message_department), department.manifest_key, "Your boss called out of work today, and [new_head.real_name] [new_head.p_have()] been granted elevated access in their absence.", "Staff Notice")) + temporary_heads_by_dep[department.type] = new_head.real_name + + return department.department_bitflags + /// Send a drop pod containing a piece of paper with the spare ID safe code to loc /datum/controller/subsystem/job/proc/send_spare_id_safe_code(loc) new /obj/effect/pod_landingzone(loc, /obj/structure/closet/supplypod/centcompod, new /obj/item/paper/fluff/emergency_spare_id_safe_code()) @@ -881,6 +975,47 @@ SUBSYSTEM_DEF(job) // However no guarantee of game state between then and now, so don't skip eligibility checks on AssignRole. AssignRole(new_player, GetJob(dynamic_forced_occupations[new_player])) +/// Finds a captain first a foremost. Returns success or failure +/datum/controller/subsystem/job/proc/assign_captain() + if(!CONFIG_GET(flag/require_captain)) + JobDebug("Captain not required by config, skipping Assign Captain") + return TRUE + + if(GLOB.is_debug_server && BYPASS_JOB_LIMITS_WHEN_DEBUGGING) + JobDebug("Captain not required due to debug status, skipping Assign Captain") + return TRUE + + JobDebug("DO, Finding captain") + var/datum/job/captain_job = GetJobType(/datum/job/captain) + for(var/level in level_order) + var/list/candidates = FindOccupationCandidates(captain_job, level) + if(!candidates.len) + continue + + var/mob/dead/new_player/candidate = pick(candidates) + // Eligibility checks done as part of FindOccupationCandidates. + if(AssignRole(candidate, captain_job, do_eligibility_checks = FALSE)) + JobDebug("Assign Captain: Found captain.") + return TRUE + + JobDebug("Assign Captain: Nobody signed up for captain. Pulling from users signed up for Command.") + + // Okay nobody is signed up for captain, let's try something more drastic. + var/datum/job_department/management = get_department_type(/datum/job_department/command) + for(var/datum/job/management_job as anything in management.department_jobs) + for(var/level in level_order) + var/list/candidates = FindOccupationCandidates(management_job, level) + if(!candidates.len) + continue + + for(var/mob/dead/new_player/candidate as anything in candidates) + if(AssignRole(candidate, captain_job)) + JobDebug("Assign Captain: Found captain from pool of management roles.") + return TRUE + + JobDebug("Assign Captain: Failed, no captain was found. DivideOccupations aborted.") + return FALSE + /// Takes a job priority #define such as JP_LOW and gets its string representation for logging. /datum/controller/subsystem/job/proc/job_priority_level_to_string(priority) return job_priorities_to_strings["[priority]"] || "Undefined Priority \[[priority]\]" @@ -929,3 +1064,21 @@ SUBSYSTEM_DEF(job) return JOB_UNAVAILABLE_GENERIC return JOB_AVAILABLE + +/datum/controller/subsystem/job/proc/validate_required_jobs(list/required_jobs) + if(!length(required_jobs)) + 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 diff --git a/code/controllers/subsystem/lag_switch.dm b/code/controllers/subsystem/lag_switch.dm index 600409b08d0f..ac3a42b4cef7 100644 --- a/code/controllers/subsystem/lag_switch.dm +++ b/code/controllers/subsystem/lag_switch.dm @@ -125,6 +125,15 @@ SUBSYSTEM_DEF(lag_switch) else to_chat(world, span_boldannounce("Footstep sounds have been re-enabled.")) + if(KICK_GUESTS) + if (state) + to_chat(world, span_boldannounce("Guest connections have been disabled")) + for(var/client/C as anything in GLOB.clients) + if(C.restricted_mode) + qdel(C) + else + to_chat(world, span_boldannounce("Guest connections have been re-enabled")) + return TRUE /// Helper to loop over all measures for mass changes diff --git a/code/controllers/subsystem/language.dm b/code/controllers/subsystem/language.dm deleted file mode 100644 index e80a7096d8c5..000000000000 --- a/code/controllers/subsystem/language.dm +++ /dev/null @@ -1,18 +0,0 @@ -SUBSYSTEM_DEF(language) - name = "Language" - init_order = INIT_ORDER_LANGUAGE - flags = SS_NO_FIRE - -/datum/controller/subsystem/language/Initialize(timeofday) - for(var/L in subtypesof(/datum/language)) - var/datum/language/language = L - if(!initial(language.key)) - continue - - GLOB.all_languages += language - - var/datum/language/instance = new language - - GLOB.language_datum_instances[language] = instance - - return ..() diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 81d9f2242c92..77dc6d95dc00 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -7,6 +7,10 @@ SUBSYSTEM_DEF(lighting) var/static/list/sources_queue = list() // List of lighting sources queued for update. var/static/list/corners_queue = list() // List of lighting corners queued for update. var/static/list/objects_queue = list() // List of lighting objects queued for update. +#ifdef VISUALIZE_LIGHT_UPDATES + var/allow_duped_values = FALSE + var/allow_duped_corners = FALSE +#endif /datum/controller/subsystem/lighting/PreInit() . = ..() diff --git a/code/controllers/subsystem/machines.dm b/code/controllers/subsystem/machines.dm index 8bf09c82e6a5..34e988b917f7 100644 --- a/code/controllers/subsystem/machines.dm +++ b/code/controllers/subsystem/machines.dm @@ -17,7 +17,7 @@ SUBSYSTEM_DEF(machines) qdel(power_network) powernets.Cut() - for(var/obj/structure/cable/power_cable as anything in GLOB.cable_list) + for(var/obj/structure/cable/power_cable as anything in ::cable_list) if(!power_cable.powernet) var/datum/powernet/new_powernet = new() new_powernet.add_cable(power_cable) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 21736a82de65..7df15a79c186 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(mapping) name = "Mapping" init_order = INIT_ORDER_MAPPING - flags = SS_NO_FIRE + runlevels = ALL var/list/nuke_tiles = list() var/list/nuke_threats = list() @@ -30,6 +30,8 @@ SUBSYSTEM_DEF(mapping) var/list/turf/unused_turfs = list() //Not actually unused turfs they're unused but reserved for use for whatever requests them. "[zlevel_of_turf]" = list(turfs) var/list/datum/turf_reservations //list of turf reservations var/list/used_turfs = list() //list of turf = datum/turf_reservation + /// List of lists of turfs to reserve + var/list/lists_to_reserve = list() var/list/reservation_ready = list() var/clearing_reserved_turfs = FALSE @@ -79,7 +81,7 @@ SUBSYSTEM_DEF(mapping) config = old_config initialize_biomes() loadWorld() - repopulate_sorted_areas() + require_area_resort() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() @@ -97,12 +99,6 @@ SUBSYSTEM_DEF(mapping) if(CONFIG_GET(flag/roundstart_away)) createRandomZlevel(prob(CONFIG_GET(number/config_gateway_chance))) - // Load the virtual reality hub - if(CONFIG_GET(flag/virtual_reality)) - to_chat(world, span_boldannounce("Loading virtual reality...")) - load_new_z_level("_maps/RandomZLevels/VR/vrhub.dmm", "Virtual Reality Hub") - to_chat(world, span_boldannounce("Virtual reality loaded.")) - loading_ruins = TRUE setup_ruins() loading_ruins = FALSE @@ -110,18 +106,47 @@ SUBSYSTEM_DEF(mapping) #endif // Run map generation after ruin generation to prevent issues run_map_generation() - // Add the transit level - transit = add_new_zlevel("Transit/Reserved", ZTRAITS_TRANSIT) - repopulate_sorted_areas() + // Add the first transit level + var/datum/space_level/base_transit = add_reservation_zlevel() + require_area_resort() // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() - initialize_reserved_level(transit.z_value) - SSticker.OnRoundstart(CALLBACK(src, PROC_REF(spawn_maintenance_loot))) + initialize_reserved_level(base_transit.z_value) calculate_default_z_level_gravities() return ..() +/datum/controller/subsystem/mapping/fire(resumed) + // Cache for sonic speed + var/list/unused_turfs = src.unused_turfs + var/list/world_contents = GLOB.areas_by_type[world.area].contents + var/list/world_turf_contents = GLOB.areas_by_type[world.area].contained_turfs + var/list/lists_to_reserve = src.lists_to_reserve + var/index = 0 + while(index < length(lists_to_reserve)) + var/list/packet = lists_to_reserve[index + 1] + var/packetlen = length(packet) + while(packetlen) + if(MC_TICK_CHECK) + if(index) + lists_to_reserve.Cut(1, index) + return + var/turf/T = packet[packetlen] + T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) + LAZYINITLIST(unused_turfs["[T.z]"]) + unused_turfs["[T.z]"] |= T + var/area/old_area = T.loc + old_area.turfs_to_uncontain += T + T.flags_1 |= UNUSED_RESERVATION_TURF + world_contents += T + world_turf_contents += T + packet.len-- + packetlen = length(packet) + + index++ + lists_to_reserve.Cut(1, index) + /datum/controller/subsystem/mapping/proc/calculate_default_z_level_gravities() for(var/z_level in 1 to length(z_list)) calculate_z_level_gravity(z_level) @@ -162,38 +187,32 @@ SUBSYSTEM_DEF(mapping) return max_gravity /// Takes a z level datum, and tells the mapping subsystem to manage it -/datum/controller/subsystem/mapping/proc/manage_z_level(datum/space_level/new_z) +/datum/controller/subsystem/mapping/proc/manage_z_level(datum/space_level/new_z, filled_with_space, contain_turfs = TRUE) z_list += new_z ///Increment all the z level lists (note: not all yet) gravity_by_zlevel.len += 1 multiz_levels.len += 1 + if(contain_turfs) + build_area_turfs(new_z.z_value, filled_with_space) + +/datum/controller/subsystem/mapping/proc/build_area_turfs(z_level, space_guaranteed) + // If we know this is filled with default tiles, we can use the default area + // Faster + if(space_guaranteed) + var/area/global_area = GLOB.areas_by_type[world.area] + global_area.contained_turfs += Z_TURFS(z_level) + return + + for(var/turf/to_contain as anything in Z_TURFS(z_level)) + var/area/our_area = to_contain.loc + our_area.contained_turfs += to_contain /** * ##setup_ruins * * Sets up all of the ruins to be spawned */ /datum/controller/subsystem/mapping/proc/setup_ruins() - // Generate mining ruins - var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS) - if (lava_ruins.len) - seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), list(/area/lavaland/surface/outdoors/unexplored), themed_ruins[ZTRAIT_LAVA_RUINS]) - for (var/lava_z in lava_ruins) - spawn_rivers(lava_z) - - var/list/ice_ruins = levels_by_trait(ZTRAIT_ICE_RUINS) - if (ice_ruins.len) - // needs to be whitelisted for underground too so place_below ruins work - seedRuins(ice_ruins, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/surface/outdoors/unexplored, /area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS]) - for (var/ice_z in ice_ruins) - spawn_rivers(ice_z, 4, /turf/open/openspace/icemoon, /area/icemoon/surface/outdoors/unexplored/rivers) - - var/list/ice_ruins_underground = levels_by_trait(ZTRAIT_ICE_RUINS_UNDERGROUND) - if (ice_ruins_underground.len) - seedRuins(ice_ruins_underground, CONFIG_GET(number/icemoon_budget), list(/area/icemoon/underground/unexplored), themed_ruins[ZTRAIT_ICE_RUINS_UNDERGROUND]) - for (var/ice_z in ice_ruins_underground) - spawn_rivers(ice_z, 4, level_trait(ice_z, ZTRAIT_BASETURF), /area/icemoon/underground/unexplored/rivers) - // Generate deep space ruins var/list/space_ruins = levels_by_trait(ZTRAIT_SPACE_RUINS) if (space_ruins.len) @@ -264,7 +283,6 @@ Used by the AI doomsday and the self-destruct nuke. turf_reservations = SSmapping.turf_reservations used_turfs = SSmapping.used_turfs holodeck_templates = SSmapping.holodeck_templates - transit = SSmapping.transit areas_in_z = SSmapping.areas_in_z config = SSmapping.config @@ -275,7 +293,7 @@ Used by the AI doomsday and the self-destruct nuke. z_list = SSmapping.z_list multiz_levels = SSmapping.multiz_levels -#define INIT_ANNOUNCE(X) to_chat(world, span_boldannounce("[X]")); log_world(X) +#define INIT_ANNOUNCE(X) to_chat(world, span_debug("[X]")); log_world(X) /datum/controller/subsystem/mapping/proc/LoadGroup(list/errorList, name, path, files, list/traits, list/default_traits, silent = FALSE) . = list() var/start_time = REALTIMEOFDAY @@ -310,14 +328,18 @@ Used by the AI doomsday and the self-destruct nuke. var/start_z = world.maxz + 1 var/i = 0 for (var/level in traits) - add_new_zlevel("[name][i ? " [i + 1]" : ""]", level) + add_new_zlevel("[name][i ? " [i + 1]" : ""]", level, contain_turfs = FALSE) ++i // 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)) + var/list/bounds = pm.bounds + var/x_offset = bounds ? round(world.maxx / 2 - bounds[MAP_MAXX] / 2) + 1 : 1 + var/y_offset = bounds ? round(world.maxy / 2 - bounds[MAP_MAXY] / 2) + 1 : 1 + if (!pm.load(x_offset, y_offset, start_z + parsed_maps[P], no_changeturf = TRUE, new_z = TRUE)) errorList |= pm.original_path + if(!silent) INIT_ANNOUNCE("Loaded [name] in [(REALTIMEOFDAY - start_time)/10]s!") return parsed_maps @@ -346,11 +368,6 @@ Used by the AI doomsday and the self-destruct nuke. 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) - - if(config.minetype == "lavaland") - LoadGroup(FailedZs, "Lavaland", "map_files/Mining", "Lavaland.dmm", default_traits = ZTRAITS_LAVALAND) - else if (!isnull(config.minetype) && config.minetype != "none") - INIT_ANNOUNCE("WARNING: An unknown minetype '[config.minetype]' was set! This is being ignored! Update the maploader code!") #endif if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen @@ -371,28 +388,23 @@ Used by the AI doomsday and the self-destruct nuke. GLOBAL_LIST_EMPTY(the_station_areas) /datum/controller/subsystem/mapping/proc/generate_station_area_list() - var/static/list/station_areas_blacklist = typecacheof(list(/area/space, /area/mine, /area/ruin, /area/centcom/asteroid/nearstation)) - for(var/area/A in world) - if (is_type_in_typecache(A, station_areas_blacklist)) - continue - if (!A.contents.len || !(A.area_flags & UNIQUE_AREA)) + for(var/area/station/A in GLOB.areas) + if (!(A.area_flags & UNIQUE_AREA)) continue - var/turf/picked = A.contents[1] - if (is_station_level(picked.z)) + if (is_station_level(A.z)) GLOB.the_station_areas += A.type 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) + for(var/area/A in GLOB.areas) A.RunGeneration() /datum/controller/subsystem/mapping/proc/maprotate() if(map_voted || SSmapping.next_map_config) //If voted or set by other means. return - var/players = GLOB.clients.len var/list/mapvotes = list() //count votes var/pmv = CONFIG_GET(flag/preference_map_voting) @@ -408,49 +420,64 @@ GLOBAL_LIST_EMPTY(the_station_areas) for(var/M in global.config.maplist) mapvotes[M] = 1 - //filter votes - for (var/map in mapvotes) - if (!map) - mapvotes.Remove(map) - continue - if (!(map in global.config.maplist)) - mapvotes.Remove(map) - continue - if(map in SSpersistence.blocked_maps) - mapvotes.Remove(map) - continue - var/datum/map_config/VM = global.config.maplist[map] - if (!VM) - mapvotes.Remove(map) - continue - if (VM.voteweight <= 0) - mapvotes.Remove(map) - continue - if (VM.config_min_users > 0 && players < VM.config_min_users) - mapvotes.Remove(map) - continue - if (VM.config_max_users > 0 && players > VM.config_max_users) - mapvotes.Remove(map) - continue + filter_map_options(mapvotes) - if(pmv) - mapvotes[map] = mapvotes[map]*VM.voteweight + //filter votes + if(pmv) + for (var/map in mapvotes) + var/datum/map_config/VM = global.config.maplist[map] + mapvotes[map] = mapvotes[map] * VM.voteweight var/pickedmap = pick_weight(mapvotes) if (!pickedmap) return + var/datum/map_config/VM = global.config.maplist[pickedmap] message_admins("Randomly rotating map to [VM.map_name]") . = changemap(VM) if (. && VM.map_name != config.map_name) to_chat(world, span_boldannounce("Map rotation has chosen [VM.map_name] for next round!")) +/// Takes a list of map names, returns a list of valid maps. +/datum/controller/subsystem/mapping/proc/filter_map_options(list/options, voting) + var/players = length(GLOB.clients) + + list_clear_nulls(options) + for(var/map_name in options) + // Map doesn't exist + if (!(map_name in global.config.maplist)) + options.Remove(map_name) + continue + + var/datum/map_config/VM = global.config.maplist[map_name] + // Map doesn't exist (again) + if (!VM) + options.Remove(map_name) + continue + + // Polling for vote, map isn't votable + if(voting && (!VM.votable || VM.voteweight <= 0)) + options.Remove(map_name) + continue + + // Not enough players + if (VM.config_min_users > 0 && players < VM.config_min_users) + options.Remove(map_name) + continue + + // Too many players + if (VM.config_max_users > 0 && players > VM.config_max_users) + options.Remove(map_name) + continue + + return options + /datum/controller/subsystem/mapping/proc/mapvote() if(map_voted || SSmapping.next_map_config) //If voted or set by other means. return - if(SSvote.mode) //Theres already a vote running, default to rotation. + + if(!SSvote.initiate_vote(/datum/vote/change_map, "server")) maprotate() - SSvote.initiate_vote("map", "automatic map rotation") /datum/controller/subsystem/mapping/proc/changemap(datum/map_config/VM) if(!VM.MakeNextMap()) @@ -580,6 +607,12 @@ GLOBAL_LIST_EMPTY(the_station_areas) message_admins("Loading [away_name] failed!") return +/// Adds a new reservation z level. A bit of space that can be handed out on request +/// Of note, reservations default to transit turfs, to make their most common use, shuttles, faster +/datum/controller/subsystem/mapping/proc/add_reservation_zlevel(for_shuttles) + num_of_res_levels++ + return add_new_zlevel("Transit/Reserved #[num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + /datum/controller/subsystem/mapping/proc/RequestBlockReservation(width, height, z, type = /datum/turf_reservation, turf_type_override) UNTIL((!z || reservation_ready["[z]"]) && !clearing_reserved_turfs) var/datum/turf_reservation/reserve = new type @@ -590,8 +623,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) if(reserve.Reserve(width, height, i)) return reserve //If we didn't return at this point, theres a good chance we ran out of room on the exisiting reserved z levels, so lets try a new one - num_of_res_levels += 1 - var/datum/space_level/newReserved = add_new_zlevel("Transit/Reserved [num_of_res_levels]", list(ZTRAIT_RESERVED = TRUE)) + var/datum/space_level/newReserved = add_reservation_zlevel() initialize_reserved_level(newReserved.z_value) if(reserve.Reserve(width, height, newReserved.z_value)) return reserve @@ -604,7 +636,9 @@ GLOBAL_LIST_EMPTY(the_station_areas) return reserve QDEL_NULL(reserve) -//This is not for wiping reserved levels, use wipe_reservations() for that. +///Sets up a z level as reserved +///This is not for wiping reserved levels, use wipe_reservations() for that. +///If this is called after SSatom init, it will call Initialize on all turfs on the passed z, as its name promises /datum/controller/subsystem/mapping/proc/initialize_reserved_level(z) UNTIL(!clearing_reserved_turfs) //regardless, lets add a check just in case. clearing_reserved_turfs = TRUE //This operation will likely clear any existing reservations, so lets make sure nothing tries to make one while we're doing it. @@ -614,24 +648,25 @@ GLOBAL_LIST_EMPTY(the_station_areas) var/turf/A = get_turf(locate(SHUTTLE_TRANSIT_BORDER,SHUTTLE_TRANSIT_BORDER,z)) var/turf/B = get_turf(locate(world.maxx - SHUTTLE_TRANSIT_BORDER,world.maxy - SHUTTLE_TRANSIT_BORDER,z)) var/block = block(A, B) - for(var/t in block) - // No need to empty() these, because it's world init and they're - // already /turf/open/space/basic. - var/turf/T = t + for(var/turf/T as anything in block) + // No need to empty() these, because they just got created and are already /turf/open/space/basic. T.flags_1 |= UNUSED_RESERVATION_TURF + CHECK_TICK + + // Gotta create these suckers if we've not done so already + if(SSatoms.initialized) + SSatoms.InitializeAtoms(Z_TURFS(z)) + unused_turfs["[z]"] = block reservation_ready["[z]"] = TRUE clearing_reserved_turfs = FALSE -/datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs) - for(var/i in turfs) - var/turf/T = i - T.empty(RESERVED_TURF_TYPE, RESERVED_TURF_TYPE, null, TRUE) - LAZYINITLIST(unused_turfs["[T.z]"]) - unused_turfs["[T.z]"] |= T - T.flags_1 |= UNUSED_RESERVATION_TURF - GLOB.areas_by_type[world.area].contents += T - CHECK_TICK +/// Schedules a group of turfs to be handed back to the reservation system's control +/// If await is true, will sleep until the turfs are finished work +/datum/controller/subsystem/mapping/proc/reserve_turfs(list/turfs, await = FALSE) + lists_to_reserve += list(turfs) + if(await) + UNTIL(!length(turfs)) //DO NOT CALL THIS PROC DIRECTLY, CALL wipe_reservations(). /datum/controller/subsystem/mapping/proc/do_wipe_turf_reservations() @@ -649,7 +684,7 @@ GLOBAL_LIST_EMPTY(the_station_areas) clearing |= used_turfs //used turfs is an associative list, BUT, reserve_turfs() can still handle it. If the code above works properly, this won't even be needed as the turfs would be freed already. unused_turfs.Cut() used_turfs.Cut() - reserve_turfs(clearing) + reserve_turfs(clearing, await = TRUE) ///Initialize all biomes, assoc as type || instance /datum/controller/subsystem/mapping/proc/initialize_biomes() @@ -667,10 +702,3 @@ GLOBAL_LIST_EMPTY(the_station_areas) isolated_ruins_z = add_new_zlevel("Isolated Ruins/Reserved", list(ZTRAIT_RESERVED = TRUE, ZTRAIT_ISOLATED_RUINS = TRUE)) initialize_reserved_level(isolated_ruins_z.z_value) return isolated_ruins_z.z_value - -/datum/controller/subsystem/mapping/proc/spawn_maintenance_loot() - for(var/obj/effect/spawner/random/maintenance/spawner as anything in GLOB.maintenance_loot_spawners) - CHECK_TICK - - spawner.spawn_loot() - qdel(spawner) diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index e68df5420574..c94453f5c9f5 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -7,7 +7,8 @@ These materials call on_applied() on whatever item they are applied to, common e SUBSYSTEM_DEF(materials) name = "Materials" - flags = SS_NO_FIRE | SS_NO_INIT + flags = SS_NO_FIRE + init_order = INIT_ORDER_MATERIALS ///Dictionary of material.id || material ref var/list/materials ///Dictionary of type || list of material refs @@ -32,19 +33,58 @@ SUBSYSTEM_DEF(materials) new /datum/stack_recipe("Carving block", /obj/structure/carving_block, 5, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), ) + // * ORE THINGS * // + var/list/ores = list() + var/list/common_ores = list() + var/list/uncommon_ores = list() + var/list/rare_ores = list() + + ///Blank versions of all of the mining templates, indexed by rarity. + var/list/template_paths_by_rarity = list() + +/datum/controller/subsystem/materials/Initialize(start_timeofday) + InitializeMaterials() + InitializeOres() + InitializeTemplates() + return ..() + +/datum/controller/subsystem/materials/proc/InitializeOres() + for(var/datum/ore/ore as anything in typesof(/datum/ore)) + if(isabstract(ore)) + continue + + ore = new ore() + ores += ore + + switch(ore.rarity) + if(MINING_COMMON) + common_ores += ore + if(MINING_UNCOMMON) + uncommon_ores += ore + if(MINING_RARE) + rare_ores += ore + +/datum/controller/subsystem/materials/proc/InitializeTemplates() + for(var/datum/mining_template/template as anything in typesof(/datum/mining_template)) + if(isabstract(template)) + continue + + LAZYADD(template_paths_by_rarity["[initial(template.rarity)]"], template) + ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() + PRIVATE_PROC(TRUE) + materials = list() materials_by_type = list() materialids_by_type = list() materials_by_category = list() materialids_by_category = list() material_combos = list() - for(var/type in subtypesof(/datum/material)) - var/datum/material/mat_type = type - if(!(initial(mat_type.init_flags) & MATERIAL_INIT_MAPLOAD)) + for(var/datum/material/mat_type as anything in subtypesof(/datum/material)) + if(isabstract(mat_type) || (initial(mat_type.bespoke))) continue // Do not initialize at mapload - InitializeMaterial(list(mat_type)) + InitializeMaterial(mat_type) /** Creates and caches a material datum. * @@ -52,13 +92,15 @@ SUBSYSTEM_DEF(materials) * - [arguments][/list]: The arguments to use to create the material datum * - The first element is the type of material to initialize. */ -/datum/controller/subsystem/materials/proc/InitializeMaterial(list/arguments) - var/datum/material/mat_type = arguments[1] - if(initial(mat_type.init_flags) & MATERIAL_INIT_BESPOKE) - arguments[1] = GetIdFromArguments(arguments) +/datum/controller/subsystem/materials/proc/InitializeMaterial(...) + PRIVATE_PROC(TRUE) + + var/datum/material/mat_type = args[1] + if(initial(mat_type.bespoke)) + args[1] = GetIdFromArguments(arglist(args)) var/datum/material/mat_ref = new mat_type - if(!mat_ref.Initialize(arglist(arguments))) + if(!mat_ref.Initialize(arglist(args))) return null var/mat_id = mat_ref.id @@ -69,7 +111,6 @@ SUBSYSTEM_DEF(materials) materials_by_category[category] += list(mat_ref) materialids_by_category[category] += list(mat_id) - SEND_SIGNAL(src, COMSIG_MATERIALS_INIT_MAT, mat_ref) return mat_ref /** Fetches a cached material singleton when passed sufficient arguments. @@ -84,91 +125,84 @@ SUBSYSTEM_DEF(materials) * - If the material type is bespoke a text ID is generated from the arguments list and used to load a material datum from the cache. * - The following elements are used to generate bespoke IDs */ -/datum/controller/subsystem/materials/proc/_GetMaterialRef(list/arguments) - if(!materials) - InitializeMaterials() - - var/datum/material/key = arguments[1] +/datum/controller/subsystem/materials/proc/_GetMaterialRef(...) + var/datum/material/key = args[1] if(istype(key)) return key // We are assuming here that the only thing allowed to create material datums is [/datum/controller/subsystem/materials/proc/InitializeMaterial] - if(istext(key)) // Handle text id + if(ispath(key, /datum/material)) + if(!(initial(key.bespoke))) + . = materials[key] + if(!.) + CRASH("Attempted to fetch reference to an abstract material with key [key]") + return . + + else if(istext(key)) // Handle text id . = materials[key] if(!.) - WARNING("Attempted to fetch material ref with invalid text id '[key]'") - return + CRASH("Attempted to fetch material ref with invalid text id '[key]'") + else + CRASH("Attempted to fetch material ref with invalid key [isdatum(key) ? "[REF(key)] ([key.type])" : "[key]"]") - if(!ispath(key, /datum/material)) - CRASH("Attempted to fetch material ref with invalid key [key]") + // Only Bespoke (mid-round generated) materials should make it this far. + key = GetIdFromArguments(arglist(args)) + return materials[key] || InitializeMaterial(arglist(args)) - if(!(initial(key.init_flags) & MATERIAL_INIT_BESPOKE)) - . = materials[key] - if(!.) - WARNING("Attempted to fetch reference to an abstract material with key [key]") - return +/// Generates a unique ID from a list of arguments. Does not support passing in lists. +/datum/controller/subsystem/materials/proc/GetIdFromArguments(...) + PRIVATE_PROC(TRUE) - key = GetIdFromArguments(arguments) - return materials[key] || InitializeMaterial(arguments) + var/datum/material/mattype = args[1] + if(length(args) == 1) + return "[initial(mattype.id) || mattype]" -/** I'm not going to lie, this was swiped from [SSdcs][/datum/controller/subsystem/processing/dcs]. - * Credit does to ninjanomnom - * - * Generates an id for bespoke ~~elements~~ materials 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/materials/proc/GetIdFromArguments(list/arguments) - var/datum/material/mattype = arguments[1] var/list/fullid = list("[initial(mattype.id) || mattype]") - var/list/named_arguments = list() - for(var/i in 2 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 = sort_list(named_arguments) - fullid += named_arguments - return list2params(fullid) + for(var/i in 2 to length(args)) + var/argument = args[i] + if(!(istext(argument) || isnum(argument))) + fullid += REF(argument) + continue + + fullid += "[argument]" // Key is stringified so numbers dont break things + + return json_encode(fullid) /// Returns a list to be used as an object's custom_materials. Lists will be cached and re-used based on the parameters. /datum/controller/subsystem/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier) if(!LAZYLEN(materials_declaration)) return null // If we get a null we pass it right back, we don't want to generate stack traces just because something is clearing out its materials list. - if(!material_combos) - InitializeMaterials() - var/list/combo_params = list() - for(var/x in materials_declaration) - var/datum/material/mat = x - combo_params += "[istype(mat) ? mat.id : mat]=[materials_declaration[mat] * multiplier]" - sortTim(combo_params, GLOBAL_PROC_REF(cmp_text_asc)) // We have to sort now in case the declaration was not in order - var/combo_index = combo_params.Join("-") + var/combo_index + if(length(materials_declaration) == 1) + var/datum/material/mat = materials_declaration[1] + combo_index = "[istype(mat) ? mat.id : mat]=[materials_declaration[mat] * multiplier]" + + else + var/list/combo_params = list() + for(var/datum/material/mat as anything in materials_declaration) + combo_params += "[istype(mat) ? mat.id : mat]=[materials_declaration[mat] * multiplier]" + + sortTim(combo_params, GLOBAL_PROC_REF(cmp_text_asc)) // We have to sort now in case the declaration was not in order + + combo_index = jointext(combo_params, "-") + var/list/combo = material_combos[combo_index] - if(!combo) + if(isnull(combo)) combo = list() for(var/mat in materials_declaration) combo[GET_MATERIAL_REF(mat)] = materials_declaration[mat] * multiplier material_combos[combo_index] = combo return combo -/datum/controller/subsystem/materials/proc/CallMaterialName(ID) - if (istype(ID, /datum/material)) - var/datum/material/material = ID +/// Returns the name of a supplied material datum or reagent ID. +/datum/controller/subsystem/materials/proc/GetMaterialName(id_or_instance) + if (istype(id_or_instance, /datum/material)) + var/datum/material/material = id_or_instance return material.name - else if(GLOB.chemical_reagents_list[ID]) - var/datum/reagent/reagent = GLOB.chemical_reagents_list[ID] + + else if(SSreagents.chemical_reagents_list[id_or_instance]) + var/datum/reagent/reagent = SSreagents.chemical_reagents_list[id_or_instance] return reagent.name - return ID + + CRASH("Bad argument to GetMaterialName() argument: [(isnum(id_or_instance) || istext(id_or_instance)) ? "[id_or_instance]" : "[REF(id_or_instance)]"]") diff --git a/code/controllers/subsystem/media.dm b/code/controllers/subsystem/media.dm new file mode 100644 index 000000000000..4dffe0f80340 --- /dev/null +++ b/code/controllers/subsystem/media.dm @@ -0,0 +1,194 @@ +SUBSYSTEM_DEF(media) + name = "RIAA" + + init_order = INIT_ORDER_MEDIA //We need to finish up before SSTicker for lobby music reasons. + flags = SS_NO_FIRE + + /// Media definitions grouped by their `media_tags`, All tracks share the implicit tag `all` + VAR_PRIVATE/list/datum/media/tracks_by_tag + + /// Only notify admins once per init about invalid jsons + VAR_PRIVATE/invalid_jsons_exist + /// It's more consistently functional to just store these in a list and tell admins to go digging than log it. + VAR_PRIVATE/list/errored_files + + /// Stores all sound formats byond understands. + var/list/byond_sound_formats = list( + "mid" = TRUE, //Midi, 8.3 File Name + "midi" = TRUE, //Midi, Long File Name + "mod" = TRUE, //Module, Original Amiga Tracker format + "it" = TRUE, //Impulse Tracker Module format + "s3m" = TRUE, //ScreamTracker 3 Module + "xm" = TRUE, //FastTracker 2 Module + "oxm" = TRUE, //FastTracker 2 (Vorbis Compressed Samples) + "wav" = TRUE, //Waveform Audio File Format, A (R)IFF-class format, and Microsoft's choice in the 80s sound format pissing match. + "ogg" = TRUE, //OGG Audio Container, Usually contains Vorbis-compressed Audio + //"raw" = TRUE, //On the tin, byond purports to support raw, uncompressed PCM Audio. I actually have no fucking idea how FMOD actually handles these. + //since they completely lack all information. As a confusion based anti-footgun, I'm just going to wire this to FALSE for now. It's here though. + "wma" = TRUE, //Windows Media Audio container + "aiff" = TRUE, //Audio Interchange File Format, Apple's side of the 80s sound format pissing match. It's also (R)IFF in a trenchcoat. + "mp3" = TRUE, //MPeg Layer 3 Container (And usually, Codec.) + ) + +#define MEDIA_LOAD_FAILED -1 + +/datum/controller/subsystem/media/Initialize(start_timeofday) + //Reset warnings to clear any past runs. + invalid_jsons_exist = FALSE + errored_files = null + + //I'm not even going to bother supporting the existing jukebox shit. Jsons are easier. + tracks_by_tag = list() + var/basedir = "[global.config.directory]/media/jsons/" + //Fetch + for(var/json_record in flist(basedir)) + //Decode + var/list/json_data = decode_or_null(basedir,json_record) + + if(json_data == MEDIA_LOAD_FAILED) + continue //We returned successfully, with a bad record that is already logged + + if(!json_data) + //We did NOT return successfully, Log a very general error ourselves. + log_load_fail(json_record,list("ERR_FATAL","JSON Record failed to load, Unknown error! Check the runtime log!")) + continue + + //Skip the example file. + if(json_data["name"] == "EXAMPLE") + continue + + //Pre-Validation Fixups + var/jd_tag_cache = json_data["media_tags"]+MEDIA_TAG_ALLMEDIA //cache for sanic speed, We add the allmedia check here for universal validations. + var/jd_full_filepath = "[global.config.directory]/media/[json_data["file"]]" + + //Validation + /// A two-entry list containing the erroring tag, and a reason for the error. + var/tag_error = validate_media(json_data, jd_full_filepath, jd_tag_cache) + + //Failed Validation? + if(tag_error) + log_load_fail(json_record,tag_error) + continue //Skip the track. + + //JSON is fully validated. Wrap it in the datum and add it to the lists. + var/datum/media/media_datum = new( + json_data["name"], + json_data["author"], + jd_full_filepath, + jd_tag_cache, + json_data["map"], + json_data["rare"], + json_data["duration"], + json_record + ) + for(var/jd_tag in jd_tag_cache) + LAZYADD(tracks_by_tag[jd_tag], media_datum) + + return ..() + +/// Quarantine proc for json decoding, Has handling code for most reasonable issues with file structure, and can safely die. +/// Returns -1/MEDIA_LOAD_FAILED on error, a list on success, and null on suicide. +/datum/controller/subsystem/media/proc/decode_or_null(basedir,json_record) + PRIVATE_PROC(TRUE) + var/file_contents = rustg_file_read("[basedir][json_record]") + if(!length(file_contents)) + log_load_fail(json_record,list("ERR_FATAL","File is empty.")) + return MEDIA_LOAD_FAILED + if(!rustg_json_is_valid(file_contents)) + log_load_fail(json_record,list("ERR_FATAL","JSON content is invalid!")) + return MEDIA_LOAD_FAILED + return json_decode(file_contents) + +/// Log a failure to load a specific media track, and notify admins. +/datum/controller/subsystem/media/proc/log_load_fail(entry,list/error_tuple) + PRIVATE_PROC(TRUE) + LAZYINITLIST(errored_files) + errored_files[entry] = "[error_tuple[1]]:[error_tuple[2]]" + log_config("MEDIA: [entry] FAILED: [error_tuple[1]]:[error_tuple[2]]") + if(!invalid_jsons_exist) + //Only fire this once. Just check config_error... + invalid_jsons_exist = TRUE + spawn(0) + UNTIL(SSmedia.initialized) + message_admins("MEDIA: At least 1 Media JSON is invalid. Please check SSMedia.errored_files or config_error.log") + return + +/// Run media validation checks. Returns null on success, or a log_load_failure compatible tuple-list on failure. +/datum/controller/subsystem/media/proc/validate_media(json_data, jd_full_filepath, jd_tag_cache) + if(!json_data || !jd_full_filepath || !jd_tag_cache) + stack_trace("BAD CALLING ARGUMENTS TO VALIDATE_MEDIA") + return list("ERR_FATAL", "Record validation was called with bad arguments: [json_data || "#FALSY_DATA"], [jd_full_filepath || "#FALSY_DATA"], [english_list(jd_tag_cache, nothing_text = "#FALSY_DATA")]") + for(var/jd_tag in jd_tag_cache) + switch(jd_tag) + + //Validation relevant for ALL tracks. + if(MEDIA_TAG_ALLMEDIA) + // Simple Data + if(!json_data["name"]) + return list(MEDIA_TAG_ALLMEDIA, "Track has no name.") + if(!json_data["author"]) + return list(MEDIA_TAG_ALLMEDIA, "Track has no author.") + + // Does our file actually exist? + if(!rustg_file_exists(jd_full_filepath)) + return list(MEDIA_TAG_ALLMEDIA, "File [jd_full_filepath] does not exist.") + + //Verify that the file extension is allowed, because BYOND is sure happy to not say a fucking word. + var/list/directory_split = splittext(json_data["file"], "/") + var/list/extension_split = splittext(directory_split[length(directory_split)], ".") + if(extension_split.len >= 2) + var/ext = lowertext(extension_split[length(extension_split)]) //pick the real extension, no 'honk.ogg.exe' nonsense here + if(!byond_sound_formats[ext]) + return list(MEDIA_TAG_ALLMEDIA, "[ext] is an illegal file extension (and probably a bad format too.)") + else + return list(MEDIA_TAG_ALLMEDIA, "Media is missing a file extension.") + + // Ensure common and rare lobby music pools are not contaminated. + if(MEDIA_TAG_LOBBYMUSIC_COMMON) + if(MEDIA_TAG_LOBBYMUSIC_RARE in jd_tag_cache) + return list(MEDIA_TAG_LOBBYMUSIC_COMMON, "Track tagged as BOTH COMMON and RARE lobby music.") + + // Ensure common and rare credit music pools are not contaminated. + if(MEDIA_TAG_ROUNDEND_COMMON) + if(MEDIA_TAG_ROUNDEND_RARE in jd_tag_cache) + return list(MEDIA_TAG_ROUNDEND_COMMON, "Track tagged as BOTH COMMON and RARE endround music.") + + // Jukebox tracks MUST have a duration. + if(MEDIA_TAG_JUKEBOX) + if(!json_data["duration"]) + return list(MEDIA_TAG_JUKEBOX, "Jukebox tracks MUST have a valid duration.") + +/datum/controller/subsystem/media/proc/get_track_pool(media_tag) + var/list/pool = tracks_by_tag[media_tag] + return LAZYCOPY(pool) + +/datum/media + /// Name of the track. Should be "friendly". + var/name + /// Author of the track. + var/author + /// File path of the actual sound. + var/path + /// OPTIONAL for LOBBY tagged music, Map-specific tracks. + var/map + /// OPTIONAL for LOBBY tagged music, Rarity control flag. 0 By default. + var/rare + /// List of Media tags, used to allow tracks to be shared between various pools, such as + /// lobby tracks also being jukebox playable. + var/list/media_tags + /// REQUIRED for JUKEBOX tagged music, Duration of the track in Deciseconds. Yes it's a shit unit, blame BYOND. + var/duration = 0 + /// Back-reference name of the originating JSON file, so that you can track it down + var/definition_file + +/datum/media/New(name, author, path, tags, map, rare, length, src_file) + src.name = name + src.author = author + src.path = path + src.map = map + src.rare = rare + media_tags = tags + duration = length + definition_file = src_file + +#undef MEDIA_LOAD_FAILED diff --git a/code/controllers/subsystem/minor_mapping.dm b/code/controllers/subsystem/minor_mapping.dm index 5b4e085c329d..2e986d611c1d 100644 --- a/code/controllers/subsystem/minor_mapping.dm +++ b/code/controllers/subsystem/minor_mapping.dm @@ -1,5 +1,3 @@ -#define PROB_MOUSE_SPAWN 98 - SUBSYSTEM_DEF(minor_mapping) name = "Minor Mapping" init_order = INIT_ORDER_MINOR_MAPPING @@ -10,29 +8,23 @@ SUBSYSTEM_DEF(minor_mapping) place_satchels() return ..() -/datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_mice=10) - var/list/exposed_wires = find_exposed_wires() - - var/mob/living/simple_animal/mouse/mouse - var/turf/open/proposed_turf - +/datum/controller/subsystem/minor_mapping/proc/trigger_migration(num_pests=10) + //this list could use some more mobs + var/list/spawn_list = list( + /mob/living/simple_animal/mouse = 5, + /mob/living/basic/cockroach = 2, + /mob/living/simple_animal/slug = 2, + ) - while((num_mice > 0) && exposed_wires.len) - proposed_turf = pick_n_take(exposed_wires) + var/list/landmarks = list() + for(var/obj/effect/landmark/pestspawn/C in GLOB.landmarks_list) + landmarks += C - if(!istype(proposed_turf)) - continue - - if(prob(PROB_MOUSE_SPAWN)) - if(!mouse) - mouse = new(proposed_turf) - else - mouse.forceMove(proposed_turf) - else - mouse = new /mob/living/simple_animal/hostile/regalrat/controlled(proposed_turf) - if(proposed_turf.unsafe_return_air().hasGas(GAS_OXYGEN, 5)) - num_mice -= 1 - mouse = null + while(num_pests > 0 && length(landmarks)) + var/obj/effect/landmark/pestspawn/S = pick_n_take(landmarks) + var/mob/living/pickedpest = pick_weight(spawn_list) + pickedpest = new pickedpest (S.loc) + num_pests -= 1 /datum/controller/subsystem/minor_mapping/proc/place_satchels(amount=10) var/list/turfs = find_satchel_suitable_turfs() @@ -67,5 +59,3 @@ SUBSYSTEM_DEF(minor_mapping) suitable += detected_turf return shuffle(suitable) - -#undef PROB_MOUSE_SPAWN diff --git a/code/controllers/subsystem/mouse_entered.dm b/code/controllers/subsystem/mouse_entered.dm index 6dc8d995a522..8860820e3804 100644 --- a/code/controllers/subsystem/mouse_entered.dm +++ b/code/controllers/subsystem/mouse_entered.dm @@ -7,6 +7,8 @@ SUBSYSTEM_DEF(mouse_entered) runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY var/list/hovers = list() + /// Keep track of what clients are hovering over. This is used for mouse icon logic. + var/list/sustained_hovers = list() /datum/controller/subsystem/mouse_entered/fire() for (var/hovering_client in hovers) diff --git a/code/controllers/subsystem/movement/ai_movement.dm b/code/controllers/subsystem/movement/ai_movement.dm index 6fd2d4c20b62..ef26f79dbdcc 100644 --- a/code/controllers/subsystem/movement/ai_movement.dm +++ b/code/controllers/subsystem/movement/ai_movement.dm @@ -1,7 +1,7 @@ /// The subsystem used to tick [/datum/ai_movement] instances. Handling the movement of individual AI instances MOVEMENT_SUBSYSTEM_DEF(ai_movement) name = "AI movement" - flags = SS_TICKER|SS_HIBERNATE + flags = SS_TICKER priority = FIRE_PRIORITY_NPC_MOVEMENT runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME init_order = INIT_ORDER_AI_MOVEMENT diff --git a/code/controllers/subsystem/movement/move_handler.dm b/code/controllers/subsystem/movement/move_handler.dm index 520d0dd29909..bbd733893811 100644 --- a/code/controllers/subsystem/movement/move_handler.dm +++ b/code/controllers/subsystem/movement/move_handler.dm @@ -54,6 +54,13 @@ SUBSYSTEM_DEF(move_manager) var/atom/movable/parent ///The move loop that's currently running var/datum/move_loop/running_loop + /** + * Flags passed from the move loop before it calls move() and unset right after. + * Allows for properties of a move loop to be easily checked by mechanics outside of it. + * Having this a bitfield rather than a type var means we don't get screwed over + * if the move loop gets deleted mid-move, FYI. + */ + var/processing_move_loop_flags = NONE ///Assoc list of subsystems -> loop datum. Only one datum is allowed per subsystem var/list/existing_loops = list() @@ -114,9 +121,12 @@ SUBSYSTEM_DEF(move_manager) var/datum/controller/subsystem/movement/current_subsystem = running_loop.controller - current_subsystem.remove_loop(running_loop) - contesting_subsystem.add_loop(contestant) + var/current_running_loop = running_loop running_loop = contestant + current_subsystem.remove_loop(current_running_loop) + if(running_loop != contestant) // A signal registrant could have messed with things + return FALSE + contesting_subsystem.add_loop(contestant) return TRUE ///Tries to figure out the current favorite loop to run. More complex then just deciding between two different loops, assumes no running loop currently exists @@ -131,7 +141,7 @@ SUBSYSTEM_DEF(move_manager) var/datum/move_loop/checking = existing_loops[owner] if(checking.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) continue - if(favorite && favorite.priority < checking.priority) + if(favorite && favorite.priority > checking.priority) continue favorite = checking @@ -145,8 +155,8 @@ SUBSYSTEM_DEF(move_manager) /datum/movement_packet/proc/remove_loop(datum/controller/subsystem/movement/remove_from, datum/move_loop/loop_to_remove) if(loop_to_remove == running_loop) - remove_from.remove_loop(loop_to_remove) running_loop = null + remove_from.remove_loop(loop_to_remove) if(loop_to_remove.flags & MOVEMENT_LOOP_IGNORE_PRIORITY) remove_from.remove_loop(loop_to_remove) if(QDELETED(src)) diff --git a/code/controllers/subsystem/movement/movement.dm b/code/controllers/subsystem/movement/movement.dm index 0e72177291fb..c410f53c7629 100644 --- a/code/controllers/subsystem/movement/movement.dm +++ b/code/controllers/subsystem/movement/movement.dm @@ -1,6 +1,6 @@ SUBSYSTEM_DEF(movement) name = "Movement Loops" - flags = SS_NO_INIT|SS_TICKER|SS_HIBERNATE + flags = SS_NO_INIT|SS_TICKER wait = 1 //Fire each tick /* A breif aside about the bucketing system here @@ -19,12 +19,6 @@ SUBSYSTEM_DEF(movement) ///The visual delay of the subsystem var/visual_delay = 1 -/datum/controller/subsystem/movement/PreInit() - . = ..() - hibernate_checks = list( - NAMEOF(src, sorted_buckets) - ) - /datum/controller/subsystem/movement/stat_entry(msg) var/total_len = 0 for(var/list/bucket as anything in sorted_buckets) @@ -58,8 +52,11 @@ SUBSYSTEM_DEF(movement) while(processing.len) var/datum/move_loop/loop = processing[processing.len] processing.len-- + // No longer queued since we just got removed from the loop + loop.queued_time = null loop.process() //This shouldn't get nulls, if it does, runtime - if(!QDELETED(loop)) //Re-Insert the loop + if(!QDELETED(loop) && (loop.status & MOVELOOP_STATUS_QUEUED)) //Re-Insert the loop + loop.status &= ~MOVELOOP_STATUS_QUEUED loop.timer = world.time + loop.delay queue_loop(loop) if (MC_TICK_CHECK) @@ -69,7 +66,7 @@ SUBSYSTEM_DEF(movement) return // Still work to be done var/bucket_time = bucket_info[MOVEMENT_BUCKET_TIME] smash_bucket(1, bucket_time) // We assume we're the first bucket in the queue right now - visual_delay = MC_AVERAGE_FAST(visual_delay, max((world.time - canonical_time) / wait, 1)) + visual_delay = MC_AVERAGE_FAST(visual_delay, max((world.time - canonical_time) / TICKS2DS(wait), 1)) /// Removes a bucket from our system. You only need to pass in the time, but if you pass in the index of the list you save us some work /datum/controller/subsystem/movement/proc/smash_bucket(index, bucket_time) @@ -92,30 +89,46 @@ SUBSYSTEM_DEF(movement) buckets -= "[bucket_time]" /datum/controller/subsystem/movement/proc/queue_loop(datum/move_loop/loop) - var/target_time = loop.timer - var/string_time = "[target_time]" + if(loop.status & MOVELOOP_STATUS_QUEUED) + stack_trace("A move loop attempted to queue while already queued") + return + loop.queued_time = loop.timer + loop.status |= MOVELOOP_STATUS_QUEUED + var/list/our_bucket = buckets["[loop.queued_time]"] // If there's no bucket for this, lets set them up - if(!buckets[string_time]) - buckets[string_time] = list() + if(!our_bucket) + buckets["[loop.queued_time]"] = list() + our_bucket = buckets["[loop.queued_time]"] // This makes assoc buckets and sorted buckets point to the same place, allowing for quicker inserts - var/list/new_bucket = list(list(target_time, buckets[string_time])) - BINARY_INSERT_DEFINE(new_bucket, sorted_buckets, SORT_VAR_NO_TYPE, list(target_time), SORT_FIRST_INDEX, COMPARE_KEY) + var/list/new_bucket = list(list(loop.queued_time, our_bucket)) + var/list/compare_item = list(loop.queued_time) + BINARY_INSERT_DEFINE(new_bucket, sorted_buckets, SORT_VAR_NO_TYPE, compare_item, SORT_FIRST_INDEX, COMPARE_KEY) - buckets[string_time] += loop + our_bucket += loop /datum/controller/subsystem/movement/proc/dequeue_loop(datum/move_loop/loop) - var/list/our_entries = buckets["[loop.timer]"] + // Go home, you're not here anyway + if(!(loop.status & MOVELOOP_STATUS_QUEUED)) + return + if(isnull(loop.queued_time)) // This happens if a moveloop is dequeued while handling process() + loop.status &= ~MOVELOOP_STATUS_QUEUED + return + var/list/our_entries = buckets["[loop.queued_time]"] our_entries -= loop if(!length(our_entries)) - smash_bucket(bucket_time = loop.timer) // We can't pass an index in for context because we don't know our position + smash_bucket(bucket_time = loop.queued_time) // We can't pass an index in for context because we don't know our position + loop.queued_time = null + loop.status &= ~MOVELOOP_STATUS_QUEUED /datum/controller/subsystem/movement/proc/add_loop(datum/move_loop/add) - add.start_loop() - if(QDELETED(add)) + if(add.status & MOVELOOP_STATUS_QUEUED) + CRASH("Loop being added that is already queued.") + add.loop_started() + if(QDELETED(add) || add.status & MOVELOOP_STATUS_QUEUED) return queue_loop(add) /datum/controller/subsystem/movement/proc/remove_loop(datum/move_loop/remove) dequeue_loop(remove) - remove.stop_loop() + remove.loop_stopped() diff --git a/code/controllers/subsystem/movement/movement_types.dm b/code/controllers/subsystem/movement/movement_types.dm index 872a12f1d3f9..3e5cbecc8ec6 100644 --- a/code/controllers/subsystem/movement/movement_types.dm +++ b/code/controllers/subsystem/movement/movement_types.dm @@ -21,10 +21,12 @@ var/delay = 1 ///The next time we should process ///Used primarially as a hint to be reasoned about by our [controller], and as the id of our bucket - ///Should not be modified directly outside of [start_loop] var/timer = 0 - ///Is this loop running or not - var/running = FALSE + ///The time we are CURRENTLY queued for processing + ///Do not modify this directly + var/queued_time = -1 + /// Status bitfield for what state the move loop is currently in + var/status = NONE /datum/move_loop/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) src.owner = owner @@ -51,10 +53,10 @@ return TRUE return FALSE -/datum/move_loop/proc/start_loop() +/datum/move_loop/proc/loop_started() SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_MOVELOOP_START) - running = TRUE + status |= MOVELOOP_STATUS_RUNNING //If this is our first time starting to move with this loop //And we're meant to start instantly if(!timer && flags & MOVEMENT_LOOP_START_FAST) @@ -62,9 +64,10 @@ return timer = world.time + delay -/datum/move_loop/proc/stop_loop() +///Called when a loop is stopped, doesn't stop the loop itself +/datum/move_loop/proc/loop_stopped() SHOULD_CALL_PARENT(TRUE) - running = FALSE + status &= ~MOVELOOP_STATUS_RUNNING SEND_SIGNAL(src, COMSIG_MOVELOOP_STOP) /datum/move_loop/proc/info_deleted(datum/source) @@ -87,7 +90,7 @@ ///Pauses the move loop for some passed in period ///This functionally means shifting its timer up, and clearing it from its current bucket /datum/move_loop/proc/pause_for(time) - if(!controller || !running) //No controller or not running? go away + if(!controller || !(status & MOVELOOP_STATUS_RUNNING)) //No controller or not running? go away return //Dequeue us from our current bucket controller.dequeue_loop(src) @@ -97,6 +100,10 @@ controller.queue_loop(src) /datum/move_loop/process() + if(isnull(controller)) + qdel(src) + return + var/old_delay = delay //The signal can sometimes change delay if(SEND_SIGNAL(src, COMSIG_MOVELOOP_PREPROCESS_CHECK) & MOVELOOP_SKIP_STEP) //Chance for the object to react @@ -109,11 +116,14 @@ return var/visual_delay = controller.visual_delay - var/success = move() - SEND_SIGNAL(src, COMSIG_MOVELOOP_POSTPROCESS, success, delay * visual_delay) + owner?.processing_move_loop_flags = flags + var/result = move() //Result is an enum value. Enums defined in __DEFINES/movement.dm + owner?.processing_move_loop_flags = NONE - if(QDELETED(src) || !success) //Can happen + SEND_SIGNAL(src, COMSIG_MOVELOOP_POSTPROCESS, result, delay * visual_delay) + + if(QDELETED(src) || result != MOVELOOP_SUCCESS) //Can happen return if(flags & MOVEMENT_LOOP_IGNORE_GLIDE) @@ -124,7 +134,25 @@ ///Handles the actual move, overriden by children ///Returns FALSE if nothing happen, TRUE otherwise /datum/move_loop/proc/move() - return FALSE + return MOVELOOP_FAILURE + +///Pause our loop untill restarted with resume_loop() +/datum/move_loop/proc/pause_loop() + if(!controller || !(status & MOVELOOP_STATUS_RUNNING) || (status & MOVELOOP_STATUS_PAUSED)) //we dead + return + + //Dequeue us from our current bucket + controller.dequeue_loop(src) + status |= MOVELOOP_STATUS_PAUSED + +///Resume our loop after being paused by pause_loop() +/datum/move_loop/proc/resume_loop() + if(!controller || (status & MOVELOOP_STATUS_RUNNING|MOVELOOP_STATUS_PAUSED) != (MOVELOOP_STATUS_RUNNING|MOVELOOP_STATUS_PAUSED)) + return + + timer = world.time + controller.queue_loop(src) + status &= ~MOVELOOP_STATUS_PAUSED ///Removes the atom from some movement subsystem. Defaults to SSmovement /datum/controller/subsystem/move_manager/proc/stop_looping(atom/movable/moving, datum/controller/subsystem/movement/subsystem = SSmovement) @@ -171,32 +199,7 @@ moving.Move(get_step(moving, direction), direction) // We cannot rely on the return value of Move(), we care about teleports and it doesn't // Moving also can be null on occasion, if the move deleted it and therefor us - return old_loc != moving?.loc - -/** - * Like move(), but it uses byond's pathfinding on a step by step basis - * - * Returns TRUE if the loop sucessfully started, or FALSE if it failed - * - * Arguments: - * moving - The atom we want to move - * direction - The direction we want to move in - * delay - How many deci-seconds to wait between fires. Defaults to the lowest value, 0.1 - * timeout - Time in deci-seconds until the moveloop self expires. Defaults to infinity - * subsystem - The movement subsystem to use. Defaults to SSmovement. Only one loop can exist for any one subsystem - * priority - Defines how different move loops override each other. Lower numbers beat higher numbers, equal defaults to what currently exists. Defaults to MOVEMENT_DEFAULT_PRIORITY - * flags - Set of bitflags that effect move loop behavior in some way. Check _DEFINES/movement.dm - * -**/ -/datum/controller/subsystem/move_manager/proc/move_to_dir(moving, direction, delay, timeout, subsystem, priority, flags, datum/extra_info) - return add_to_loop(moving, subsystem, /datum/move_loop/move/move_to, priority, flags, extra_info, delay, timeout, direction) - -/datum/move_loop/move/move_to - -/datum/move_loop/move/move_to/move() - var/atom/old_loc = moving.loc - step_to(moving, get_step(moving, direction)) - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** @@ -222,7 +225,7 @@ /datum/move_loop/move/force/move() var/atom/old_loc = moving.loc moving.forceMove(get_step(moving, direction)) - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /datum/move_loop/has_target @@ -280,7 +283,7 @@ /datum/move_loop/has_target/force_move/move() var/atom/old_loc = moving.loc moving.forceMove(get_step(moving, get_dir(moving, target))) - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** @@ -312,14 +315,15 @@ repath_delay, max_path_length, minimum_distance, - obj/item/card/id/id, + list/access, simulated_only, turf/avoid, skip_first, subsystem, priority, flags, - datum/extra_info) + datum/extra_info, + initial_path) return add_to_loop(moving, subsystem, /datum/move_loop/has_target/jps, @@ -332,10 +336,11 @@ repath_delay, max_path_length, minimum_distance, - id, + access, simulated_only, avoid, - skip_first) + skip_first, + initial_path) /datum/move_loop/has_target/jps ///How often we're allowed to recalculate our path @@ -344,8 +349,8 @@ var/max_path_length ///Minimum distance to the target before path returns var/minimum_distance - ///An ID card representing what access we have and what doors we can open. Kill me - var/obj/item/card/id/id + ///A list representing what access we have and what doors we can open. + var/list/access ///Whether we consider turfs without atmos simulation (AKA do we want to ignore space) var/simulated_only ///A perticular turf to avoid @@ -356,66 +361,84 @@ var/list/movement_path ///Cooldown for repathing, prevents spam COOLDOWN_DECLARE(repath_cooldown) + ///Bool used to determine if we're already making a path in JPS. this prevents us from re-pathing while we're already busy. + var/is_pathing = FALSE + ///Callback to invoke once we make a path + var/datum/callback/on_finish_callback + +/datum/move_loop/has_target/jps/New(datum/movement_packet/owner, datum/controller/subsystem/movement/controller, atom/moving, priority, flags, datum/extra_info) + . = ..() + on_finish_callback = CALLBACK(src, PROC_REF(on_finish_pathing)) -/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, obj/item/card/id/id, simulated_only, turf/avoid, skip_first) +/datum/move_loop/has_target/jps/setup(delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, list/access, simulated_only, turf/avoid, skip_first, list/initial_path) . = ..() if(!.) return src.repath_delay = repath_delay src.max_path_length = max_path_length src.minimum_distance = minimum_distance - src.id = id + src.access = access src.simulated_only = simulated_only src.avoid = avoid src.skip_first = skip_first - if(istype(id, /obj/item/card/id)) - RegisterSignal(id, COMSIG_PARENT_QDELETING, PROC_REF(handle_no_id)) //I prefer erroring to harddels. If this breaks anything consider making id info into a datum or something + movement_path = initial_path?.Copy() -/datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, obj/item/card/id/id, simulated_only, turf/avoid, skip_first) - if(..() && repath_delay == src.repath_delay && max_path_length == src.max_path_length && minimum_distance == src.minimum_distance && id == src.id && simulated_only == src.simulated_only && avoid == src.avoid) +/datum/move_loop/has_target/jps/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, atom/chasing, repath_delay, max_path_length, minimum_distance, obj/item/card/id/id, simulated_only, turf/avoid, skip_first, initial_path) + if(..() && repath_delay == src.repath_delay && max_path_length == src.max_path_length && minimum_distance == src.minimum_distance && access ~= src.access && simulated_only == src.simulated_only && avoid == src.avoid) return TRUE return FALSE -/datum/move_loop/has_target/jps/start_loop() +/datum/move_loop/has_target/jps/loop_started() + . = ..() + if(!movement_path) + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + +/datum/move_loop/has_target/jps/loop_stopped() . = ..() - INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + movement_path = null /datum/move_loop/has_target/jps/Destroy() - id = null //Kill me avoid = null return ..() -/datum/move_loop/has_target/jps/proc/handle_no_id() - SIGNAL_HANDLER - id = null - -//Returns FALSE if the recalculation failed, TRUE otherwise +///Tries to calculate a new path for this moveloop. /datum/move_loop/has_target/jps/proc/recalculate_path() if(!COOLDOWN_FINISHED(src, repath_cooldown)) return COOLDOWN_START(src, repath_cooldown, repath_delay) - SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_REPATH) - movement_path = get_path_to(moving, target, max_path_length, minimum_distance, id, simulated_only, avoid, skip_first) + if(SSpathfinder.pathfind(moving, target, max_path_length, minimum_distance, access, simulated_only, avoid, skip_first, on_finish = on_finish_callback)) + is_pathing = TRUE + SEND_SIGNAL(src, COMSIG_MOVELOOP_JPS_REPATH) + +///Called when a path has finished being created +/datum/move_loop/has_target/jps/proc/on_finish_pathing(list/path) + movement_path = path + is_pathing = FALSE /datum/move_loop/has_target/jps/move() if(!length(movement_path)) - INVOKE_ASYNC(src, PROC_REF(recalculate_path)) - if(!length(movement_path)) - return FALSE + if(is_pathing) + return MOVELOOP_NOT_READY + else + INVOKE_ASYNC(src, PROC_REF(recalculate_path)) + return MOVELOOP_FAILURE var/turf/next_step = movement_path[1] var/atom/old_loc = moving.loc - moving.Move(next_step, get_dir(moving, next_step)) - . = (old_loc != moving?.loc) + //KAPU NOTE: WE DO NOT HAVE THIS + //moving.Move(next_step, get_dir(moving, next_step), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + var/movement_dir = get_dir(moving, next_step) + moving.Move(next_step, movement_dir) + . = (old_loc != moving?.loc) ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE // this check if we're on exactly the next tile may be overly brittle for dense objects 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(moving) == next_step) - movement_path.Cut(1,2) + if(length(movement_path)) + movement_path.Cut(1,2) else INVOKE_ASYNC(src, PROC_REF(recalculate_path)) - return FALSE - + return MOVELOOP_FAILURE ///Base class of move_to and move_away, deals with the distance and target aspect of things /datum/move_loop/has_target/dist_bound @@ -438,8 +461,8 @@ /datum/move_loop/has_target/dist_bound/move() if(!check_dist()) //If we're too close don't do the move - return FALSE - return TRUE + return MOVELOOP_FAILURE + return MOVELOOP_SUCCESS /** @@ -472,8 +495,11 @@ if(!.) return var/atom/old_loc = moving.loc - step_to(moving, target) - return old_loc != moving?.loc + var/turf/next = get_step_to(moving, target) + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + moving.Move(next, get_dir(moving, next)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** * Wrapper around walk_away() @@ -505,8 +531,11 @@ if(!.) return var/atom/old_loc = moving.loc - step_away(moving, target) - return old_loc != moving?.loc + var/turf/next = get_step_away(moving, target) + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + moving.Move(next, get_dir(moving, next)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** @@ -607,6 +636,8 @@ if(y_ticker >= 1) y_ticker = MODULUS(x_ticker, 1) var/atom/old_loc = moving.loc + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(moving_towards, get_dir(moving, moving_towards), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) moving.Move(moving_towards, get_dir(moving, moving_towards)) //YOU FOUND THEM! GOOD JOB @@ -614,7 +645,7 @@ x_rate = 0 y_rate = 0 return - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /datum/move_loop/has_target/move_towards/proc/handle_move(source, atom/OldLoc, Dir, Forced = FALSE) SIGNAL_HANDLER @@ -689,8 +720,10 @@ /datum/move_loop/has_target/move_towards_budget/move() var/turf/target_turf = get_step_towards(moving, target) var/atom/old_loc = moving.loc + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(target_turf, get_dir(moving, target_turf), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) moving.Move(target_turf, get_dir(moving, target_turf)) - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** @@ -731,8 +764,8 @@ /datum/move_loop/move_rand/compare_loops(datum/move_loop/loop_type, priority, flags, extra_info, delay, timeout, list/directions) if(..() && (length(potential_directions | directions) == length(potential_directions))) //i guess this could be useful if actually it really has yet to move - return TRUE - return FALSE + return MOVELOOP_SUCCESS + return MOVELOOP_FAILURE /datum/move_loop/move_rand/move() var/list/potential_dirs = potential_directions.Copy() @@ -740,11 +773,13 @@ var/testdir = pick(potential_dirs) var/turf/moving_towards = get_step(moving, testdir) var/atom/old_loc = moving.loc + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(moving_towards, testdir, FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) moving.Move(moving_towards, testdir) if(old_loc != moving?.loc) //If it worked, we're done - return TRUE + return MOVELOOP_SUCCESS potential_dirs -= testdir - return FALSE + return MOVELOOP_FAILURE /** * Wrapper around walk_rand(), doesn't actually result in a random walk, it's more like moving to random places in viewish @@ -768,8 +803,11 @@ /datum/move_loop/move_to_rand/move() var/atom/old_loc = moving.loc - step_rand(moving) - return old_loc != moving?.loc + var/turf/next = get_step_rand(moving) + // KAPU NOTE: WE DO NOT HAVE THIS MOVEMENT ARG. I DIDN'T WANT TO REDO ALL OF OUR MOVE CALLS AGAIN. + //moving.Move(next, get_dir(moving, next), FALSE, !(flags & MOVEMENT_LOOP_NO_DIR_UPDATE)) + moving.Move(next, get_dir(moving, next)) + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE /** * Snowflake disposal movement. Moves a disposal holder along a chain of disposal pipes @@ -808,4 +846,4 @@ return FALSE var/atom/old_loc = moving.loc holder.current_pipe = holder.current_pipe.transfer(holder) - return old_loc != moving?.loc + return old_loc != moving?.loc ? MOVELOOP_SUCCESS : MOVELOOP_FAILURE diff --git a/code/controllers/subsystem/networks.dm b/code/controllers/subsystem/networks.dm new file mode 100644 index 000000000000..39d71feddbed --- /dev/null +++ b/code/controllers/subsystem/networks.dm @@ -0,0 +1,90 @@ +SUBSYSTEM_DEF(networks) + name = "Networks" + wait = 5 + flags = SS_KEEP_TIMING|SS_NO_FIRE + init_order = INIT_ORDER_NETWORKS + + var/list/relays = list() + /// Legacy ntnet lookup for software. + var/datum/ntnet/station_root/station_network + + // Logs moved here + // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. + // High values make displaying logs much laggier. + var/setting_maxlogcount = 100 + var/list/logs = list() + + /// Random name search for + /// DO NOT REMOVE NAMES HERE UNLESS YOU KNOW WHAT YOUR DOING + var/list/used_names = list() + +/datum/controller/subsystem/networks/PreInit() + //We retain this structure for ModComp. + station_network = new + +/datum/controller/subsystem/networks/Initialize() + station_network.build_software_lists() + return ..() + +/datum/controller/subsystem/networks/proc/check_relay_operation(zlevel=0) //can be expanded later but right now it's true/false. + for(var/i in relays) + var/obj/machinery/ntnet_relay/n = i + if(zlevel && n.z != zlevel) + continue + if(n.is_operational) + return TRUE + return FALSE + +/** + * Records a message into the station logging system for the network + * + * This CAN be read in station by personal so do not use it for game debugging + * during fire. At this point data.receiver_id has already been converted if it was a broadcast but + * is undefined in this function. It is also dumped to normal logs but remember players can read/intercept + * these messages + * Arguments: + * * log_string - message to log + * * hardware_id = optional, text, Blindly stapled to the end. + */ +/datum/controller/subsystem/networks/proc/add_log(log_string, hardware_id = null) + set waitfor = FALSE // so process keeps running + var/list/log_text = list() + log_text += "\[[stationtime2text()]\]" + + if(hardware_id) + log_text += "([hardware_id])" + else + log_text += "*SYSTEM*" + log_text += " - " + log_text += log_string + log_string = log_text.Join() + + logs.Add(log_string) + //log_telecomms("NetLog: [log_string]") // causes runtime on startup humm + + // We have too many logs, remove the oldest entries until we get into the limit + if(logs.len > setting_maxlogcount) + logs = logs.Copy(logs.len-setting_maxlogcount,0) + + +/** + * Removes all station logs for the current game + */ +/datum/controller/subsystem/networks/proc/purge_logs() + logs = list() + add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") + +/** + * Updates the maximum amount of logs and purges those that go beyond that number + * + * Shouldn't been needed to be run by players but maybe admins need it? + * Arguments: + * * lognumber - new setting_maxlogcount count + */ +/datum/controller/subsystem/networks/proc/update_max_log_count(lognumber) + if(!lognumber) + return FALSE + // Trim the value if necessary + lognumber = max(MIN_NTNET_LOGS, min(lognumber, MAX_NTNET_LOGS)) + setting_maxlogcount = lognumber + add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index f86c48168d90..8539cb9b6920 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -39,6 +39,7 @@ SUBSYSTEM_DEF(nightshift) announce("Restoring night lighting configuration to normal operation.") else announce("Disabling night lighting: Station is in a state of emergency.") + if(emergency) night_time = FALSE if(nightshift_active != night_time) @@ -47,7 +48,7 @@ SUBSYSTEM_DEF(nightshift) /datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, resumed = FALSE) set waitfor = FALSE if(!resumed) - currentrun = GLOB.apcs_list.Copy() + currentrun = INSTANCES_OF_COPY(/obj/machinery/power/apc) nightshift_active = active if(announce) if (active) diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm index a5c268f2ad94..95c9e187c405 100644 --- a/code/controllers/subsystem/overlays.dm +++ b/code/controllers/subsystem/overlays.dm @@ -37,12 +37,16 @@ SUBSYSTEM_DEF(overlays) iconbro.icon = icon return iconbro.appearance -/atom/proc/build_appearance_list(build_overlays) +/atom/proc/build_appearance_list(list/build_overlays) if (!islist(build_overlays)) build_overlays = list(build_overlays) + /// Tracks the current index into build_overlays so that we can preserve ordering. + var/bo_index = 0 for (var/overlay in build_overlays) + bo_index++ if(!overlay) build_overlays -= overlay + bo_index-- continue if (istext(overlay)) #ifdef UNIT_TESTS @@ -53,37 +57,28 @@ SUBSYSTEM_DEF(overlays) stack_trace("Invalid overlay: Icon object '[icon_file]' [REF(icon)] used in '[src]' [type] is missing icon state [overlay].") continue #endif - build_overlays -= overlay - build_overlays += iconstate2appearance(icon, overlay) + // Directly overwrite the list entry, preserving order. + build_overlays[bo_index] = iconstate2appearance(icon, overlay) else if(isicon(overlay)) - build_overlays -= overlay - build_overlays += icon2appearance(overlay) + // Directly overwrite the list entry, preserving order. + build_overlays[bo_index] = icon2appearance(overlay) return build_overlays /atom/proc/cut_overlays() - STAT_START_STOPWATCH overlays = null POST_OVERLAY_CHANGE(src) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(SSoverlays.stats, type) /atom/proc/cut_overlay(list/remove_overlays) if(!overlays) return - STAT_START_STOPWATCH overlays -= build_appearance_list(remove_overlays) POST_OVERLAY_CHANGE(src) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(SSoverlays.stats, type) /atom/proc/add_overlay(list/add_overlays) if(!overlays) return - STAT_START_STOPWATCH overlays += build_appearance_list(add_overlays) POST_OVERLAY_CHANGE(src) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(SSoverlays.stats, type) /atom/proc/copy_overlays(atom/other, cut_old) //copys our_overlays from another atom if(!other) @@ -91,7 +86,6 @@ SUBSYSTEM_DEF(overlays) cut_overlays() return - STAT_START_STOPWATCH var/list/cached_other = other.overlays.Copy() if(cut_old) if(cached_other) @@ -99,13 +93,9 @@ SUBSYSTEM_DEF(overlays) else overlays = null POST_OVERLAY_CHANGE(src) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(SSoverlays.stats, type) else if(cached_other) overlays += cached_other POST_OVERLAY_CHANGE(src) - STAT_STOP_STOPWATCH - STAT_LOG_ENTRY(SSoverlays.stats, type) //TODO: Better solution for these? /image/proc/add_overlay(x) @@ -131,3 +121,15 @@ SUBSYSTEM_DEF(overlays) overlays |= cached_other else if(cut_old) cut_overlays() + +/// Recursively removes overlays that do not render to the game plane from an appearance. +/proc/remove_non_canon_overlays(mutable_appearance/appearance) + for(var/mutable_appearance/overlay as anything in appearance.overlays) + if(overlay.plane != GAME_PLANE && overlay.plane != FLOAT_PLANE) + appearance.overlays -= overlay + + if(length(overlay.overlays)) + appearance.overlays -= overlay + appearance.overlays += .(new /mutable_appearance(overlay)) + + return appearance diff --git a/code/controllers/subsystem/packetnets.dm b/code/controllers/subsystem/packetnets.dm index 03c2642872be..30d2e942ebc6 100644 --- a/code/controllers/subsystem/packetnets.dm +++ b/code/controllers/subsystem/packetnets.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(packets) name = "Packets" wait = 0 priority = FIRE_PRIORITY_PACKETS - flags = SS_NO_INIT | SS_HIBERNATE + flags = SS_HIBERNATE runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY var/list/saymodes = list() @@ -12,8 +12,6 @@ SUBSYSTEM_DEF(packets) var/list/datum/powernet/queued_networks = list() ///Radio packets to process var/list/queued_radio_packets = list() - ///Tablet messages to process - var/list/queued_tablet_messages = list() ///Subspace/vocal packets to process var/list/queued_subspace_vocals = list() @@ -27,7 +25,6 @@ SUBSYSTEM_DEF(packets) ///The current processing lists var/list/current_networks = list() var/list/current_radio_packets = list() - var/list/current_tablet_messages = list() var/list/current_subspace_vocals = list() ///Tick usage @@ -40,15 +37,38 @@ SUBSYSTEM_DEF(packets) ///What processing stage we're at var/stage = SSPACKETS_POWERNETS + //Storage Data Vars + // -Because bloating GLOB is a crime. + + /// Fancy field name to use for virus packets. Randomly picked for flavor and obscurity. + var/pda_exploitable_register + /// Magic command sent by the Detomatix to cause PDAs to explode + var/detomatix_magic_packet + /// Magic command sent by the Clown Virus to honkify PDAs + var/clownvirus_magic_packet + /// Magic command sent by the Mime virus to mute PDAs + var/mimevirus_magic_packet + /// Magic command sent by the FRAME virus to install an uplink. + /// Mostly a formality as this packet MUST be obfuscated. + var/framevirus_magic_packet + /// @everyone broadcast key + var/gprs_broadcast_packet + +/// Generates a unique (at time of read) ID for an atom, It just plays silly with the ref. +/// Pass the target atom in as arg[1] +/datum/controller/subsystem/packets/proc/generate_net_id(caller) + if(!caller) + CRASH("Attempted to generate netid for null") + . = REF(caller) + . = "[copytext(.,4,(length(.)))]0" + /datum/controller/subsystem/packets/PreInit(timeofday) hibernate_checks = list( NAMEOF(src, queued_networks), NAMEOF(src, queued_radio_packets), - NAMEOF(src, queued_tablet_messages), NAMEOF(src, queued_subspace_vocals), NAMEOF(src, current_networks), NAMEOF(src, current_radio_packets), - NAMEOF(src, current_tablet_messages), NAMEOF(src, current_subspace_vocals) ) @@ -57,9 +77,32 @@ SUBSYSTEM_DEF(packets) saymodes[SM.key] = SM return ..() +/datum/controller/subsystem/packets/Initialize(start_timeofday) + detomatix_magic_packet = random_string(rand(16,32), GLOB.hex_characters) + clownvirus_magic_packet = random_string(rand(16,32), GLOB.hex_characters) + mimevirus_magic_packet = random_string(rand(16,32), GLOB.hex_characters) + framevirus_magic_packet = random_string(rand(16,32), GLOB.hex_characters) + gprs_broadcast_packet = random_string(rand(16,32), GLOB.hex_characters) + pda_exploitable_register = pick_list(PACKET_STRING_FILE, "packet_field_names") + . = ..() + +/datum/controller/subsystem/packets/Recover() + . = ..() + //Functional vars first + frequencies = SSpackets.frequencies + queued_radio_packets = SSpackets.queued_radio_packets + queued_subspace_vocals = SSpackets.queued_subspace_vocals + //Data vars + pda_exploitable_register = SSpackets.pda_exploitable_register + detomatix_magic_packet = SSpackets.detomatix_magic_packet + clownvirus_magic_packet = SSpackets.clownvirus_magic_packet + mimevirus_magic_packet = SSpackets.mimevirus_magic_packet + framevirus_magic_packet = SSpackets.framevirus_magic_packet + gprs_broadcast_packet = SSpackets.gprs_broadcast_packet + /datum/controller/subsystem/packets/stat_entry(msg) msg += "RP: [length(queued_radio_packets)]{[last_processed_radio_packets]}|" - msg += "TM: [length(queued_tablet_messages)]{[last_processed_tablet_message_packets]}|" + // msg += "TM: [length(queued_tablet_messages)]{[last_processed_tablet_message_packets]}|" msg += "SSV: [length(queued_subspace_vocals)]{[last_processed_ssv_packets]}|" msg += "C:{" msg += "CN:[round(cost_networks, 1)]|" @@ -73,7 +116,7 @@ SUBSYSTEM_DEF(packets) if(!resumed) current_networks = queued_networks.Copy() current_radio_packets = queued_radio_packets.Copy() - current_tablet_messages = queued_tablet_messages.Copy() + // current_tablet_messages = queued_tablet_messages.Copy() current_subspace_vocals = queued_subspace_vocals.Copy() var/timer = TICK_USAGE_REAL @@ -101,6 +144,7 @@ SUBSYSTEM_DEF(packets) ///No packets no problem if(!length(net.current_packet_queue)) current_networks.len-- + queued_networks -= net continue for(var/datum/signal/signal as anything in net.current_packet_queue) @@ -122,6 +166,9 @@ SUBSYSTEM_DEF(packets) // Only cut it from the current run when it's done current_networks.len-- + // We may have generated more packets in the course of rs calls, If so, don't dequeue it. + if(!length(net.next_packet_queue)) + queued_networks -= net cost_networks = MC_AVERAGE(cost_networks, TICK_DELTA_TO_MS(cached_cost)) resumed = FALSE @@ -148,35 +195,6 @@ SUBSYSTEM_DEF(packets) cost_radios = MC_AVERAGE(cost_radios, TICK_DELTA_TO_MS(cached_cost)) resumed = FALSE - stage = SSPACKETS_TABLETS - - if(stage == SSPACKETS_TABLETS) - timer = TICK_USAGE_REAL - if(!resumed) - cached_cost = 0 - last_processed_tablet_message_packets = 0 - - var/datum/signal/subspace/messaging/tablet_msg/packet - while(length(current_tablet_messages)) - packet = current_tablet_messages[1] - current_tablet_messages.Cut(1,2) - queued_tablet_messages -= packet - - if (!packet.logged) // Can only go through if a message server logs it - continue - - for (var/obj/item/modular_computer/comp in packet.data["targets"]) - var/obj/item/computer_hardware/hard_drive/drive = comp.all_components[MC_HDD] - for(var/datum/computer_file/program/messenger/app in drive.stored_files) - app.receive_message(packet) - - cached_cost += TICK_USAGE_REAL - timer - last_processed_tablet_message_packets++ - if(MC_TICK_CHECK) - return - - cost_tablets = MC_AVERAGE(cost_tablets, TICK_DELTA_TO_MS(cached_cost)) - resumed = FALSE stage = SSPACKETS_SUBSPACE_VOCAL if(stage == SSPACKETS_SUBSPACE_VOCAL) @@ -225,9 +243,8 @@ SUBSYSTEM_DEF(packets) return //Spatial Grids don't like being asked for negative ranges. -1 is valid and doesn't care about range anyways. if(packet.frequency == FREQ_ATMOS_CONTROL && packet.range > 0) - _irps_spatialgrid(packet,source,start_point) //heehoo big list. + _irps_spatialgrid_atmos(packet,source,start_point) //heehoo big list. return - var/datum/radio_frequency/freq = packet.frequency_datum //Send the data for(var/current_filter in packet.filter_list) @@ -246,9 +263,9 @@ SUBSYSTEM_DEF(packets) continue device.receive_signal(packet) - - -/datum/controller/subsystem/packets/proc/_irps_spatialgrid(datum/signal/packet, datum/source, turf/start_point) +/// Do Spatial Grid handling for IRPS, Atmos Radio group. +/// These are separate to save just that little bit more overhead. +/datum/controller/subsystem/packets/proc/_irps_spatialgrid_atmos(datum/signal/packet, datum/source, turf/start_point) PRIVATE_PROC(TRUE) //Touch this and I eat your legs. var/datum/radio_frequency/freq = packet.frequency_datum @@ -269,6 +286,29 @@ SUBSYSTEM_DEF(packets) continue listener.receive_signal(packet) +/// Do Spatial Grid handling for IRPS, Non-Atmos Radio group. +/// These are separate to save just that little bit more overhead. +/datum/controller/subsystem/packets/proc/_irps_spatialgrid_everyone_else(datum/signal/packet, datum/source, turf/start_point) + PRIVATE_PROC(TRUE) //Touch this and I eat your arms. + + var/datum/radio_frequency/freq = packet.frequency_datum + //Send the data + + var/list/spatial_grid_results = SSspatial_grid.orthogonal_range_search(start_point, SPATIAL_GRID_CONTENTS_TYPE_RADIO_NONATMOS, packet.range) + + for(var/obj/listener as anything in spatial_grid_results - source) + var/found = FALSE + for(var/filter in packet.filter_list) + //This is safe because to be in a radio list, an object MUST already have a weakref. + if(listener.weak_reference in freq.devices[filter]) + found = TRUE + break + if(!found) + continue + if((get_dist(start_point, listener) > packet.range)) + continue + listener.receive_signal(packet) + /datum/controller/subsystem/packets/proc/ImmediateSubspaceVocalSend(datum/signal/subspace/vocal/packet) // Perform final composition steps on the message. @@ -326,7 +366,7 @@ SUBSYSTEM_DEF(packets) // Add observers who have ghost radio enabled. for(var/mob/dead/observer/ghost in GLOB.player_list) - if(ghost.client.prefs?.chat_toggles & CHAT_GHOSTRADIO) + if(!ghost.observetarget && (ghost.client.prefs?.chat_toggles & CHAT_GHOSTRADIO)) globally_receiving |= ghost // Render the message and have everybody hear it. @@ -336,17 +376,17 @@ SUBSYSTEM_DEF(packets) var/rendered = virt.compose_message(virt, language, message, frequency, spans) for(var/obj/item/radio/radio as anything in receive) - SEND_SIGNAL(radio, COMSIG_RADIO_RECEIVE, virt.source, message, frequency) + SEND_SIGNAL(radio, COMSIG_RADIO_RECEIVE, virt.source, message, frequency, data) for(var/atom/movable/hearer as anything in receive[radio]) if(!hearer) stack_trace("null found in the hearers list returned by the spatial grid. this is bad") continue - hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, sound_loc = radio.speaker_location()) + hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, sound_loc = radio.speaker_location(), message_range = INFINITY) // Let the global hearers (ghosts, etc) hear this message for(var/atom/movable/hearer as anything in globally_receiving) - hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods) + hearer.Hear(rendered, virt, language, message, frequency, spans, message_mods, message_range = INFINITY) // This following recording is intended for research and feedback in the use of department radio channels if(length(receive)) diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/pathfinder.dm index 12ed31d0af7f..13d6c68568ae 100644 --- a/code/controllers/subsystem/pathfinder.dm +++ b/code/controllers/subsystem/pathfinder.dm @@ -1,46 +1,43 @@ +/// Queues and manages JPS pathfinding steps SUBSYSTEM_DEF(pathfinder) name = "Pathfinder" init_order = INIT_ORDER_PATH - flags = SS_NO_FIRE - var/datum/flowcache/mobs - var/static/space_type_cache + priority = FIRE_PRIORITY_PATHFINDING + flags = SS_NO_INIT + wait = 0.5 + /// List of pathfind datums we are currently trying to process + var/list/datum/pathfind/jps/active_pathing = list() + /// List of pathfind datums being ACTIVELY processed. exists to make subsystem stats readable + var/list/datum/pathfind/jps/currentrun = list() -/datum/controller/subsystem/pathfinder/Initialize() - space_type_cache = typecacheof(/turf/open/space) - mobs = new(10) +/datum/controller/subsystem/pathfinder/stat_entry(msg) + msg = "P:[length(active_pathing)]" return ..() -/datum/flowcache - var/lcount - var/run - var/free - var/list/flow +// This is another one of those subsystems (hey lighting) in which one "Run" means fully processing a queue +// We'll use a copy for this just to be nice to people reading the mc panel +/datum/controller/subsystem/pathfinder/fire(resumed) + if(!resumed) + src.currentrun = active_pathing.Copy() -/datum/flowcache/New(n) - . = ..() - lcount = n - run = 0 - free = 1 - flow = new/list(lcount) + // Dies of sonic speed from caching datum var reads + var/list/currentrun = src.currentrun + while(length(currentrun)) + var/datum/pathfind/jps/path = currentrun[length(currentrun)] + if(!path.search_step()) // Something's wrong + path.early_exit() + currentrun.len-- + continue + if(MC_TICK_CHECK) + return + path.finished() + // Next please + currentrun.len-- -/datum/flowcache/proc/getfree(atom/M) - if(run < lcount) - run += 1 - while(flow[free]) - CHECK_TICK - free = (free % lcount) + 1 - var/t = addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/flowcache, toolong), free), 150, TIMER_STOPPABLE) - flow[free] = t - flow[t] = M - return free - else - return 0 - -/datum/flowcache/proc/toolong(l) - log_game("Pathfinder route took longer than 150 ticks, src bot [flow[flow[l]]]") - found(l) - -/datum/flowcache/proc/found(l) - deltimer(flow[l]) - flow[l] = null - run -= 1 +/// Initiates a pathfind. Returns true if we're good, FALSE if something's failed +/datum/controller/subsystem/pathfinder/proc/pathfind(atom/movable/caller, atom/end, max_distance = 30, mintargetdist, list/access=null, simulated_only = TRUE, turf/exclude, skip_first=TRUE, diagonal_handling=DIAGONAL_REMOVE_CLUNKY, datum/callback/on_finish) + var/datum/pathfind/jps/path = new(caller, end, access, max_distance, mintargetdist, simulated_only, exclude, skip_first, diagonal_handling, on_finish) + if(path.start()) + active_pathing += path + return TRUE + return FALSE diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index ef829d67d56e..9718f219e9a0 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -16,7 +16,6 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) var/list/saved_maps = list() - var/list/blocked_maps = list() var/list/saved_trophies = list() var/list/picture_logging_information = list() var/list/obj/structure/sign/picture_frame/photo_frames @@ -213,18 +212,6 @@ SUBSYSTEM_DEF(persistence) return saved_maps = json["data"] - //Convert the mapping data to a shared blocking list, saves us doing this in several places later. - for(var/map in config.maplist) - var/datum/map_config/VM = config.maplist[map] - var/run = 0 - if(VM.map_name == SSmapping.config.map_name) - run++ - for(var/name in SSpersistence.saved_maps) - if(VM.map_name == name) - run++ - if(run >= 2) //If run twice in the last KEEP_ROUNDS_MAP + 1 (including current) rounds, disable map for voting and rotation. - blocked_maps += VM.map_name - /datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) for(var/A in GLOB.trophy_cases) var/obj/structure/displaycase/trophy/T = A diff --git a/code/controllers/subsystem/persistent_paintings.dm b/code/controllers/subsystem/persistent_paintings.dm index b00a41c6f6bb..c4ec2858e1eb 100644 --- a/code/controllers/subsystem/persistent_paintings.dm +++ b/code/controllers/subsystem/persistent_paintings.dm @@ -130,6 +130,12 @@ SUBSYSTEM_DEF(persistent_paintings) "supermatter" = PATRONAGE_LEGENDARY_FRAME ) + + /// A list of paintings' data for paintings that are currently stored in the library. + var/list/cached_painting_data = list() + /// A list of paintings' data for paintings that are currently stored in the library, with admin metadata + var/list/admin_painting_data = list() + /datum/controller/subsystem/persistent_paintings/Initialize(start_timeofday) var/json_file = file("data/paintings.json") if(fexists(json_file)) @@ -142,8 +148,28 @@ SUBSYSTEM_DEF(persistent_paintings) for(var/obj/structure/sign/painting/painting_frame as anything in painting_frames) painting_frame.load_persistent() + cache_paintings() return ..() +/datum/controller/subsystem/persistent_paintings/proc/cache_paintings() + cached_painting_data = list() + admin_painting_data = list() + + for(var/datum/painting/painting as anything in paintings) + cached_painting_data += list(list( + "title" = painting.title, + "creator" = painting.creator_name, + "md5" = painting.md5, + "ref" = REF(painting), + "width" = painting.width, + "height" = painting.height, + "ratio" = painting.width/painting.height, + )) + + var/list/pdata = painting.to_json() + pdata["ref"] = REF(painting) + admin_painting_data += pdata + /** * Generates painting data ready to be consumed by ui. * Args: @@ -152,31 +178,27 @@ SUBSYSTEM_DEF(persistent_paintings) * * search_text : text to search for if the PAINTINGS_FILTER_SEARCH_TITLE or PAINTINGS_FILTER_SEARCH_CREATOR filters are enabled. */ /datum/controller/subsystem/persistent_paintings/proc/painting_ui_data(filter=NONE, admin=FALSE, search_text) - . = list() var/searching = filter & (PAINTINGS_FILTER_SEARCH_TITLE|PAINTINGS_FILTER_SEARCH_CREATOR) && search_text - for(var/datum/painting/painting as anything in paintings) - if(filter & PAINTINGS_FILTER_AI_PORTRAIT && ((painting.width != 24 && painting.width != 23) || (painting.height != 24 && painting.height != 23))) + + if(!searching) + return admin ? admin_painting_data : cached_painting_data + + var/list/filtered_paintings = list() + var/list/searched_paintings = admin ? admin_painting_data : cached_painting_data + + for(var/painting as anything in searched_paintings) + if(filter & PAINTINGS_FILTER_AI_PORTRAIT && ((painting["width"] != 24 && painting["width"] != 23) || (painting["height"] != 24 && painting["height"] != 23))) continue if(searching) var/haystack_text = "" if(filter & PAINTINGS_FILTER_SEARCH_TITLE) - haystack_text = painting.title + haystack_text = painting["title"] else if(filter & PAINTINGS_FILTER_SEARCH_CREATOR) - haystack_text = painting.creator_name + haystack_text = painting["creator"] if(!findtext(haystack_text, search_text)) continue - if(admin) - var/list/pdata = painting.to_json() - pdata["ref"] = REF(painting) - . += list(pdata) - else - . += list(list( - "title" = painting.title, - "creator" = painting.creator_name, - "md5" = painting.md5, - "ref" = REF(painting), - "ratio" = painting.width/painting.height, - )) + filtered_paintings += painting + return filtered_paintings /// Returns paintings with given tag. /datum/controller/subsystem/persistent_paintings/proc/get_paintings_with_tag(tag_name) diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm index 8886a4b61caa..511b81368e27 100644 --- a/code/controllers/subsystem/ping.dm +++ b/code/controllers/subsystem/ping.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(ping) var/list/currentrun = list() /datum/controller/subsystem/ping/stat_entry() - ..("P:[GLOB.clients.len]") + . = ..("P:[GLOB.clients.len]") /datum/controller/subsystem/ping/fire(resumed = FALSE) // Prepare the new batch of clients diff --git a/code/controllers/subsystem/points_of_interest.dm b/code/controllers/subsystem/points_of_interest.dm index e588386bad97..d3cf1ebfe350 100644 --- a/code/controllers/subsystem/points_of_interest.dm +++ b/code/controllers/subsystem/points_of_interest.dm @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(points_of_interest) * * poi_validation_override - [OPTIONAL] Callback to a proc that takes a single argument for the POI and returns TRUE if this POI should be included. Overrides standard POI validation. * * append_dead_role - [OPTIONAL] If TRUE, adds a ghost tag to the end of observer names and a dead tag to the end of any other mob which is not alive. */ -/datum/controller/subsystem/points_of_interest/proc/get_mob_pois(datum/callback/poi_validation_override = null, append_dead_role = TRUE) +/datum/controller/subsystem/points_of_interest/proc/get_mob_pois(datum/callback/poi_validation_override = null, append_dead_role = TRUE, cliented_mobs_only = FALSE) var/list/pois = list() var/list/used_name_list = list() @@ -112,6 +112,8 @@ SUBSYSTEM_DEF(points_of_interest) continue var/mob/target_mob = mob_poi.target + if(cliented_mobs_only && !target_mob.client) + return var/name = avoid_assoc_duplicate_keys(target_mob.name, used_name_list) + target_mob.get_realname_string() // Add the ghost/dead tag to the end of dead mob POIs. diff --git a/code/controllers/subsystem/processing/acid.dm b/code/controllers/subsystem/processing/acid.dm index 60ed8799a3db..b39d14abb922 100644 --- a/code/controllers/subsystem/processing/acid.dm +++ b/code/controllers/subsystem/processing/acid.dm @@ -2,5 +2,4 @@ PROCESSING_SUBSYSTEM_DEF(acid) name = "Acid" priority = FIRE_PRIORITY_ACID - flags = SS_NO_INIT|SS_BACKGROUND|SS_HIBERNATE runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME diff --git a/code/controllers/subsystem/processing/conveyors.dm b/code/controllers/subsystem/processing/conveyors.dm index 5ca86386f4b9..ffa882e5afb0 100644 --- a/code/controllers/subsystem/processing/conveyors.dm +++ b/code/controllers/subsystem/processing/conveyors.dm @@ -1,3 +1,3 @@ MOVEMENT_SUBSYSTEM_DEF(conveyors) name = "Conveyor Belts" - flags = SS_HIBERNATE + flags = SS_BACKGROUND diff --git a/code/controllers/subsystem/processing/embeds.dm b/code/controllers/subsystem/processing/embeds.dm new file mode 100644 index 000000000000..76487cabdeea --- /dev/null +++ b/code/controllers/subsystem/processing/embeds.dm @@ -0,0 +1,5 @@ +PROCESSING_SUBSYSTEM_DEF(embeds) + name = "Embeds" + stat_tag = "E" + wait = 5 SECONDS + flags = SS_NO_INIT | SS_KEEP_TIMING diff --git a/code/controllers/subsystem/processing/fluids.dm b/code/controllers/subsystem/processing/fluids.dm deleted file mode 100644 index 788177db45a1..000000000000 --- a/code/controllers/subsystem/processing/fluids.dm +++ /dev/null @@ -1,5 +0,0 @@ -PROCESSING_SUBSYSTEM_DEF(fluids) - name = "Fluids" - wait = 10 - stat_tag = "FD" //its actually Fluid Ducts - flags = SS_NO_INIT | SS_HIBERNATE diff --git a/code/controllers/subsystem/processing/greyscale.dm b/code/controllers/subsystem/processing/greyscale.dm index ab4ce972bb58..fb8ed6047e13 100644 --- a/code/controllers/subsystem/processing/greyscale.dm +++ b/code/controllers/subsystem/processing/greyscale.dm @@ -40,12 +40,11 @@ PROCESSING_SUBSYSTEM_DEF(greyscale) /datum/controller/subsystem/processing/greyscale/proc/GetColoredIconByType(type, list/colors) if(!ispath(type, /datum/greyscale_config)) CRASH("An invalid greyscale configuration was given to `GetColoredIconByType()`: [type]") - type = "[type]" - if(istype(colors)) // It's the color list format - colors = colors.Join() + if(islist(colors)) // It's the color list format + colors = jointext(colors, "") else if(!istext(colors)) CRASH("Invalid colors were given to `GetColoredIconByType()`: [colors]") - return configurations[type].Generate(colors) + return configurations["[type]"].Generate(colors) /datum/controller/subsystem/processing/greyscale/proc/ParseColorString(color_string) . = list() diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm index 397ff34d7eec..e8f14ea8a007 100644 --- a/code/controllers/subsystem/processing/instruments.dm +++ b/code/controllers/subsystem/processing/instruments.dm @@ -34,11 +34,10 @@ PROCESSING_SUBSYSTEM_DEF(instruments) 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) + for(var/datum/instrument/I as anything in subtypesof(/datum/instrument)) + if(isabstract(I)) continue - I = new path + I = new I() I.Initialize() if(!I.id) qdel(I) diff --git a/code/controllers/subsystem/processing/kinesis.dm b/code/controllers/subsystem/processing/kinesis.dm new file mode 100644 index 000000000000..7f43cf6393d7 --- /dev/null +++ b/code/controllers/subsystem/processing/kinesis.dm @@ -0,0 +1,4 @@ +PROCESSING_SUBSYSTEM_DEF(kinesis) + name = "Kinesis" + wait = 1 + stat_tag = "KN" diff --git a/code/controllers/subsystem/processing/networks.dm b/code/controllers/subsystem/processing/networks.dm deleted file mode 100644 index d04d0f726aa4..000000000000 --- a/code/controllers/subsystem/processing/networks.dm +++ /dev/null @@ -1,524 +0,0 @@ -SUBSYSTEM_DEF(networks) - name = "Networks" - priority = FIRE_PRIORITY_NETWORKS - wait = 5 - flags = SS_KEEP_TIMING - init_order = INIT_ORDER_NETWORKS - - var/list/relays = list() - /// Legacy ntnet lookup for software. Should be changed latter so don't rely on this - /// being here. - var/datum/ntnet/station_root/station_network - var/datum/ntnet/station_root/syndie_network - var/list/network_initialize_queue = list() - /// all interfaces by their hardware address. - /// Do NOT use to verify a reciver_id is valid, use the network.root_devices for that - var/list/interfaces_by_hardware_id = list() - /// Area to network, network to area list - /// This is an associated list to quickly find an area using either its id or network - /// Used mainly to make sure all area id's are unique even if a mapper uses the same - /// area many times - var/list/area_network_lookup = list() - - /// List of networks using their fully qualified network name. Used for quick lookups - /// of networks for sending packets - var/list/networks = list() - /// List of the root networks starting at their root names. Used to find and/or build - /// network tress - var/list/root_networks = list() - - - - // Why not list? Because its a Copy() every time we add a packet, and thats stupid. - var/datum/netdata/first = null // start of the queue. Pulled off in fire. - var/datum/netdata/last = null // end of the queue. pushed on by transmit - var/packet_count = 0 - // packet stats - var/count_broadcasts_packets = 0 // count of broadcast packets sent - var/count_failed_packets = 0 // count of message fails - var/count_good_packets = 0 - // Logs moved here - // Amount of logs the system tries to keep in memory. Keep below 999 to prevent byond from acting weirdly. - // High values make displaying logs much laggier. - var/setting_maxlogcount = 100 - var/list/logs = list() - - /// Random name search to make sure we have unique names. - /// DO NOT REMOVE NAMES HERE UNLESS YOU KNOW WHAT YOUR DOING - var/list/used_names = list() - - -/// You shouldn't need to do this. But mapping is async and there is no guarantee that Initialize -/// will run before these networks are dynamically created. So its here. -/datum/controller/subsystem/networks/PreInit() - /// Limbo network needs to be made at boot up for all error devices - new/datum/ntnet(LIMBO_NETWORK_ROOT) - station_network = new(STATION_NETWORK_ROOT) - syndie_network = new(SYNDICATE_NETWORK_ROOT) - /// As well as the station network incase something funny goes during startup - new/datum/ntnet(CENTCOM_NETWORK_ROOT) - - -/datum/controller/subsystem/networks/stat_entry(msg) - msg = "NET: QUEUE([packet_count]) FAILS([count_failed_packets]) BROADCAST([count_broadcasts_packets])" - return ..() - -/datum/controller/subsystem/networks/Initialize() - station_network.register_map_supremecy() // sigh - assign_areas_root_ids(GLOB.sortedAreas) // setup area names before Initialize - station_network.build_software_lists() - syndie_network.build_software_lists() - - // At round start, fix the network_id's so the station root is on them - initialized = TRUE - // Now when the objects Initialize they will join the right network - return ..() - -/* - * Process incoming queued packet and return NAK/ACK signals - * - * This should only be called when you want the target object to process the NAK/ACK signal, usually - * during fire. At this point data.receiver_id has already been converted if it was a broadcast but - * is undefined in this function. - * Arguments: - * * receiver_id - text hardware id for the target device - * * data - packet to be sent - */ - -/datum/controller/subsystem/networks/proc/_process_packet(receiver_id, datum/netdata/data) - /// Used only for sending NAK/ACK and error reply's - var/datum/component/ntnet_interface/sending_interface = interfaces_by_hardware_id[data.sender_id] - - /// Check if the network_id is valid and if not send an error and return - var/datum/ntnet/target_network = networks[data.network_id] - if(!target_network) - count_failed_packets++ - add_log("Bad target network '[data.network_id]'", null, data.sender_id) - if(!QDELETED(sending_interface)) - SEND_SIGNAL(sending_interface.parent, COMSIG_COMPONENT_NTNET_NAK, data , NETWORK_ERROR_BAD_NETWORK) - return - - /// Check if the receiver_id is in the network. If not send an error and return - var/datum/component/ntnet_interface/target_interface = target_network.root_devices[receiver_id] - if(QDELETED(target_interface)) - count_failed_packets++ - add_log("Bad target device '[receiver_id]'", target_network, data.sender_id) - if(!QDELETED(sending_interface)) - SEND_SIGNAL(sending_interface.parent, COMSIG_COMPONENT_NTNET_NAK, data, NETWORK_ERROR_BAD_RECEIVER_ID) - return - - // Check if we care about permissions. If we do check if we are allowed the message to be processed - if(data.passkey) // got to check permissions - var/obj/O = target_interface.parent - if(O) - if(!O.check_access_ntnet(data.passkey)) - count_failed_packets++ - add_log("Access denied to ([receiver_id]) from ([data.network_id])", target_network, data.sender_id) - if(!QDELETED(sending_interface)) - SEND_SIGNAL(sending_interface.parent, COMSIG_COMPONENT_NTNET_NAK, data, NETWORK_ERROR_UNAUTHORIZED) - return - else - add_log("A access key message was sent to a non-device", target_network, data.sender_id) - if(!QDELETED(sending_interface)) - SEND_SIGNAL(sending_interface.parent, COMSIG_COMPONENT_NTNET_NAK, data, NETWORK_ERROR_UNAUTHORIZED) - - - SEND_SIGNAL(target_interface.parent, COMSIG_COMPONENT_NTNET_RECEIVE, data) - // All is good, send the packet then send an ACK to the sender - if(!QDELETED(sending_interface)) - SEND_SIGNAL(sending_interface.parent, COMSIG_COMPONENT_NTNET_ACK, data) - count_good_packets++ - -/// Helper define to make sure we pop the packet and qdel it -#define POP_PACKET(CURRENT) first = CURRENT.next; packet_count--; if(!first) { last = null; packet_count = 0; }; qdel(CURRENT); - -/datum/controller/subsystem/networks/fire(resumed = 0) - var/datum/netdata/current - var/datum/component/ntnet_interface/target_interface - while(first) - current = first - /// Check if we are a list. If so process the list - if(islist(current.receiver_id)) // are we a broadcast list - var/list/receivers = current.receiver_id - var/receiver_id = receivers[receivers.len] // pop it - receivers.len-- - _process_packet(receiver_id, current) - if(receivers.len == 0) // pop it if done - count_broadcasts_packets++ - POP_PACKET(current) - else // else set up a broadcast or send a single targete - // check if we are sending to a network or to a single target - target_interface = interfaces_by_hardware_id[current.receiver_id] - if(target_interface) // a single sender id - _process_packet(current.receiver_id, current) // single target - POP_PACKET(current) - else // ok so lets find the network to send it too - var/datum/ntnet/net = networks[current.network_id] // get the sending network - net = net?.networks[current.receiver_id] // find the target network to broadcast - if(net) // we found it - current.receiver_id = net.collect_interfaces() // make a list of all the sending targets - else - // We got an error, the network is bad so send a NAK - target_interface = interfaces_by_hardware_id[current.sender_id] - if(!QDELETED(target_interface)) - SEND_SIGNAL(target_interface.parent, COMSIG_COMPONENT_NTNET_NAK, current , NETWORK_ERROR_BAD_NETWORK) - POP_PACKET(current) // and get rid of it - if (MC_TICK_CHECK) - return - -#undef POP_PACKET - -/* - * Main function to queue a packet. As long as we have valid receiver_id and network_id we will take it - * - * Main queuing function for any message sent. if the data.receiver_id is null, then it will be broadcasted - * error checking is only done during the process this just throws it on the queue. - * Arguments: - * * data - packet to be sent - */ -/datum/controller/subsystem/networks/proc/transmit(datum/netdata/data) - data.next = null // sanity check - - if(!last) - first = last = data - else - last.next = data - last = data - packet_count++ - // We do error checking when the packet is sent - return NETWORK_ERROR_OK - - -/datum/controller/subsystem/networks/proc/check_relay_operation(zlevel=0) //can be expanded later but right now it's true/false. - for(var/i in relays) - var/obj/machinery/ntnet_relay/n = i - if(zlevel && n.z != zlevel) - continue - if(n.is_operational) - return TRUE - return FALSE - -/datum/controller/subsystem/networks/proc/log_data_transfer( datum/netdata/data) - logs += "[stationtime2text()] - [data.generate_netlog()]" - if(logs.len > setting_maxlogcount) - logs = logs.Copy(logs.len - setting_maxlogcount, 0) - -/** - * Records a message into the station logging system for the network - * - * This CAN be read in station by personal so do not use it for game debugging - * during fire. At this point data.receiver_id has already been converted if it was a broadcast but - * is undefined in this function. It is also dumped to normal logs but remember players can read/intercept - * these messages - * Arguments: - * * log_string - message to log - * * network - optional, It can be a ntnet or just the text equivalent - * * hardware_id = optional, text, will look it up and return with the parent.name as well - */ -/datum/controller/subsystem/networks/proc/add_log(log_string, network = null , hardware_id = null) - set waitfor = FALSE // so process keeps running - var/list/log_text = list() - log_text += "\[[stationtime2text()]\]" - if(network) - var/datum/ntnet/net = network - if(!istype(net)) - net = networks[network] - if(net) // bad network? - log_text += "{[net.network_id]}" - else // bad network? - log_text += "{[network] *BAD*}" - - if(hardware_id) - var/datum/component/ntnet_interface/conn = interfaces_by_hardware_id[hardware_id] - if(conn) - log_text += " ([hardware_id])[conn.parent]" - else - log_text += " ([hardware_id])*BAD ID*" - else - log_text += "*SYSTEM*" - log_text += " - " - log_text += log_string - log_string = log_text.Join() - - logs.Add(log_string) - //log_telecomms("NetLog: [log_string]") // causes runtime on startup humm - - // We have too many logs, remove the oldest entries until we get into the limit - if(logs.len > setting_maxlogcount) - logs = logs.Copy(logs.len-setting_maxlogcount,0) - - -/** - * Removes all station logs for the current game - */ -/datum/controller/subsystem/networks/proc/purge_logs() - logs = list() - add_log("-!- LOGS DELETED BY SYSTEM OPERATOR -!-") - - - -/** - * Updates the maximum amount of logs and purges those that go beyond that number - * - * Shouldn't been needed to be run by players but maybe admins need it? - * Arguments: - * * lognumber - new setting_maxlogcount count - */ -/datum/controller/subsystem/networks/proc/update_max_log_count(lognumber) - if(!lognumber) - return FALSE - // Trim the value if necessary - lognumber = max(MIN_NTNET_LOGS, min(lognumber, MAX_NTNET_LOGS)) - setting_maxlogcount = lognumber - add_log("Configuration Updated. Now keeping [setting_maxlogcount] logs in system memory.") - - - -/** - * Gives an area a root and a network_area_id - * - * When a device is added to the network on map load, it needs to know where it is. - * So that it is added to that ruins/base's network instead of the general station network - * This way people on the station cannot just hack Charlie's doors and visa versa. All area's - * "should" have this information and if not one is created from existing map tags or - * ruin template id's. This SHOULD run before the Initialize of a atom, or the root will not - * be put in the object.area - * - * An example on what the area.network_root_id does/ - * Before Init: obj.network_id = "ATMOS.SCRUBBER" area.network_root_id="SS13_STATION" area.network_area_id = "BRIDGE" - * After Init: obj.network_id = "SS13_STATION.ATMOS.SCRUBBER" also obj.network_id = "SS13_STATION.AREA.BRIDGE" - * - * Arguments: - * * area - Area to modify the root id. - * * template - optional, map_template of that area - */ -/datum/controller/subsystem/networks/proc/lookup_area_root_id(area/A, datum/map_template/M=null) - /// Check if the area is valid and if it doesn't have a network root id. - if(!istype(A) || A.network_root_id != null) - return - - /// If we are a ruin or a shuttle, we get our own network - if(M) - /// if we have a template, try to get the network id from the template - if(M.station_id && M.station_id != LIMBO_NETWORK_ROOT) // check if the template specifies it - A.network_root_id = simple_network_name_fix(M.station_id) - else if(istype(M, /datum/map_template/shuttle)) // if not, then check if its a shuttle type - var/datum/map_template/shuttle/T = M // we are a shuttle so use shuttle id - A.network_root_id = simple_network_name_fix(T.shuttle_id) - else if(istype(M,/datum/map_template/ruin)) // if not again, check if its a ruin type - var/datum/map_template/ruin/R = M - A.network_root_id = simple_network_name_fix(R.id) - - if(!A.network_root_id) // not assigned? Then lets use some defaults - // Anything in Centcom is completely isolated - // Special case for holodecks. - if(istype(A,/area/station/holodeck)) - A.network_root_id = "HOLODECK" // isolated from the station network - else if(SSmapping.level_trait(A.z, ZTRAIT_CENTCOM)) - A.network_root_id = CENTCOM_NETWORK_ROOT - // Otherwise the default is the station - else - A.network_root_id = STATION_NETWORK_ROOT - -/datum/controller/subsystem/networks/proc/assign_area_network_id(area/A, datum/map_template/M=null) - if(!istype(A)) - return - if(!A.network_root_id) - lookup_area_root_id(A, M) - // finally set the network area id, bit copy paste from area Initialize - // This is done in case we have more than one area type, each area instance has its own network name - if(!A.network_area_id) - A.network_area_id = A.network_root_id + ".AREA." + simple_network_name_fix(A.name) // Make the string - if(!(A.area_flags & UNIQUE_AREA)) // if we aren't a unique area, make sure our name is different - A.network_area_id = SSnetworks.assign_random_name(5, A.network_area_id + "_") // tack on some garbage incase there are two area types - -/datum/controller/subsystem/networks/proc/assign_areas_root_ids(list/areas, datum/map_template/M=null) - for(var/area/A in areas) - assign_area_network_id(A, M) - -/** - * Converts a list of string's into a full network_id - * - * Converts a list of individual branches into a proper network id. Validates - * individual parts to make sure they are clean. - * - * ex. list("A","B","C") -> A.B.C - * - * Arguments: - * * tree - List of strings - */ -/datum/controller/subsystem/networks/proc/network_list_to_string(list/tree) -#ifdef DEBUG_NETWORKS - ASSERT(tree && tree.len > 0) // this should be obvious but JUST in case. - for(var/part in tree) - if(!verify_network_name(part) || findtext(name,".")!=0) // and no stray dots - stack_trace("network_list_to_string: Cannot create network with ([part]) of ([tree.Join(".")])") - break -#endif - return tree.Join(".") - -/** - * Converts string into a list of network branches - * - * Converts a a proper network id into a list of the individual branches - * - * ex. A.B.C -> list("A","B","C") - * - * Arguments: - * * tree - List of strings - */ -/datum/controller/subsystem/networks/proc/network_string_to_list(name) -#ifdef DEBUG_NETWORKS - if(!verify_network_name(name)) - stack_trace("network_string_to_list: [name] IS INVALID") -#endif - return splittext(name,".") // should we do a splittext_char? I doubt we really need unicode in network names - - -/** - * Hard creates a network. Helper function for create_network_simple and create_network - * - * Hard creates a using a list of branches and returns. No error checking as it should - * of been done before this call - * - * Arguments: - * * network_tree - list,text List of branches of network - */ -/datum/controller/subsystem/networks/proc/_hard_create_network(list/network_tree) - var/network_name_part = network_tree[1] - var/network_id = network_name_part - var/datum/ntnet/parent = root_networks[network_name_part] - var/datum/ntnet/network - if(!parent) // we have no network root? Must be mapload of a ruin or such - parent = new(network_name_part) - - // go up the branches, creating nodes - for(var/i in 2 to network_tree.len) - network_name_part = network_tree[i] - network = parent.children[network_name_part] - network_id += "." + network_name_part - if(!network) - network = new(network_id, network_name_part, parent) - - parent = network - return network - - -/** - * Creates or finds a network anywhere in the world using a fully qualified name - * - * This is the simple case finding of a network in the world. It must take a full - * qualified network name and it will either return an existing network or build - * a new one from scratch. We must be able to create names on the fly as there is - * no way for the map loader to tell us ahead of time what networks to create or - * use for any maps or templates. So this thing will throw silent mapping errors - * and log them, but will always return a network for something. - * - * Arguments: - * * network_id - text, Fully qualified network name - */ -/datum/controller/subsystem/networks/proc/create_network_simple(network_id) - - var/datum/ntnet/network = networks[network_id] - if(network!=null) - return network // don't worry about it - - /// Checks to make sure the network is valid. We log BOTH to mapping and telecoms - /// so if your checking for network errors you can find it in mapping to (because its their fault!) - if(!verify_network_name(network_id)) - log_mapping("create_network_simple: [network_id] IS INVALID, replacing with LIMBO") - log_telecomms("create_network_simple: [network_id] IS INVALID, replacing with LIMBO") - return networks[LIMBO_NETWORK_ROOT] - - var/list/network_tree = network_string_to_list(network_id) - if(!network_tree || network_tree.len == 0) - log_mapping("create_network_simple: [network_id] IS INVALID, replacing with LIMBO") - log_telecomms("create_network_simple: [network_id] IS INVALID, replacing with LIMBO") - return networks[LIMBO_NETWORK_ROOT] - - network = _hard_create_network(network_tree) -#ifdef DEBUG_NETWORKS - if(!network) - CRASH("NETWORK CANNOT BE NULL") -#endif - log_telecomms("create_network_simple: created final [network.network_id]") - return network // and we are done! - - -/** - * Creates or finds a network anywhere in the world using bits of text - * - * This works the same as create_network_simple however it allows the addition - * of qualified network names. So you can call it with a root_id and a sub - * network. However this function WILL return null if it cannot be created - * so it should be used with error checking is involved. - * - * ex. create_network("ROOT_NETWORK", "ATMOS.SCRUBBERS") -> ROOT_NETWORK.ATMOS.SCRUBBERS - * - * Arguments: - * * tree - List of string - */ -/datum/controller/subsystem/networks/proc/create_network(...) - var/list/network_tree = list() - - for(var/i in 1 to args.len) - var/part = args[i] -#ifdef DEBUG_NETWORKS - if(!part || !istext(part)) - /// stack trace here because this is a bad error - stack_trace("create_network: We only take text on [part] index [i]") - return null -#endif - network_tree += network_string_to_list(part) - - var/datum/ntnet/network = _hard_create_network(network_tree) - log_telecomms("create_network: created final [network.network_id]") - return network - -/** - * Generate a hardware id for devices. - * - * Creates a 32 bit hardware id for network devices. This is random so masking - * the number won't make routing "easier" (Think Ethernet) It does check if - * an existing device has the number but will NOT assign it as thats - * up to the collar - * - * Returns (string) The generated name - */ -/datum/controller/subsystem/networks/proc/get_next_HID() - do - var/string = md5("[num2text(rand(HID_RESTRICTED_END, 999999999), 12)]") - if(!string) - log_runtime("Could not generagea m5 hash from address, problem with md5?") - return //errored - . = "[copytext_char(string, 1, 9)]" //16 ^ 8 possibilities I think. - while(interfaces_by_hardware_id[.]) - -/** - * Generate a name devices - * - * Creates a randomly generated tag or name for devices or anything really - * it keeps track of a special list that makes sure no name is used more than - * once - * - * args: - * * len (int)(Optional) Default=5 The length of the name - * * prefix (string)(Optional) static text in front of the random name - * * postfix (string)(Optional) static text in back of the random name - * Returns (string) The generated name - */ -/datum/controller/subsystem/networks/proc/assign_random_name(len=5, prefix="", postfix="") - var/static/valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" - var/list/new_name = list() - var/text - // machine id's should be fun random chars hinting at a larger world - do - new_name.Cut() - new_name += prefix - for(var/i = 1 to len) - new_name += valid_chars[rand(1,length(valid_chars))] - new_name += postfix - text = new_name.Join() - while(used_names[text]) - used_names[text] = TRUE - return text diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index b28a23c57f81..35160c299c74 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -54,4 +54,8 @@ SUBSYSTEM_DEF(processing) */ /datum/proc/process(delta_time) set waitfor = FALSE + var/static/list/fuckups = list() + if(!(type in fuckups)) + stack_trace("[type] called datum process, this is wasting CPU time.") + fuckups += type return PROCESS_KILL diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm index 378739856bdc..2ea8d050008f 100644 --- a/code/controllers/subsystem/processing/projectiles.dm +++ b/code/controllers/subsystem/processing/projectiles.dm @@ -1,6 +1,6 @@ PROCESSING_SUBSYSTEM_DEF(projectiles) name = "Projectiles" - wait = 0 + wait = 1 stat_tag = "PP" flags = SS_NO_INIT|SS_HIBERNATE var/global_max_tick_moves = 10 diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 60e4eb7e5ba6..ea33b625fa47 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -11,21 +11,16 @@ PROCESSING_SUBSYSTEM_DEF(quirks) 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 - ///An assoc list of quirks that can be obtained as a hardcore character, and their hardcore value. - var/list/hardcore_quirks = list() - - /// A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4) - var/static/list/quirk_blacklist = list( - list("Blind","Nearsighted"), - list("Jolly","Depression","Apathetic","Hypersensitive"), - list("Ageusia","Vegetarian","Deviant Tastes", "Gamer"), - list("Ananas Affinity","Ananas Aversion", "Gamer"), - list("Alcohol Tolerance","Light Drinker"), - list("Clown Enjoyer","Mime Fan"), - list("Bad Touch", "Friendly"), - list("Extrovert", "Introvert"), + /// Associative list of "name" = /path/ of quirks + var/list/quirks = list() + /// Same as the above but sorted by the quirk cmp + var/list/sorted_quirks + + /// A list of quirks that can not be used with each other. + var/list/quirk_blacklist = list( + list(/datum/quirk/item_quirk/blindness, /datum/quirk/item_quirk/nearsighted), + list(/datum/quirk/no_taste, /datum/quirk/vegetarian, /datum/quirk/deviant_tastes), + list(/datum/quirk/alcohol_tolerance, /datum/quirk/light_drinker), ) /datum/controller/subsystem/processing/quirks/Initialize(timeofday) @@ -41,102 +36,33 @@ PROCESSING_SUBSYSTEM_DEF(quirks) return quirks /datum/controller/subsystem/processing/quirks/proc/SetupQuirks() - // Sort by Positive, Negative, Neutral; and then by name - var/list/quirk_list = sort_list(subtypesof(/datum/quirk), GLOBAL_PROC_REF(cmp_quirk_asc)) - - for(var/type in quirk_list) - var/datum/quirk/quirk_type = type - - if(initial(quirk_type.abstract_parent_type) == type) + for(var/datum/quirk/quirk_type as anything in subtypesof(/datum/quirk)) + if(isabstract(quirk_type)) continue quirks[initial(quirk_type.name)] = quirk_type - quirk_points[initial(quirk_type.name)] = initial(quirk_type.value) - var/hardcore_value = initial(quirk_type.hardcore_value) + sortTim(quirks, GLOBAL_PROC_REF(cmp_text_asc)) - if(!hardcore_value) - continue - hardcore_quirks[quirk_type] += hardcore_value + // Sort by Positive, Negative, Neutral; and then by name within those groups + sorted_quirks = sort_list(quirks, GLOBAL_PROC_REF(cmp_quirk_asc)) -/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/cli) +/datum/controller/subsystem/processing/quirks/proc/AssignQuirks(mob/living/user, client/applied_client) var/badquirk = FALSE var/datum/preference/P = GLOB.preference_entries[/datum/preference/blob/quirks] - var/list/client_quirks = cli.prefs.read_preference(P.type) + var/list/client_quirks = applied_client.prefs.read_preference(P.type) for(var/quirk_name in client_quirks) var/datum/quirk/Q = quirks[quirk_name] if(Q) - if(user.add_quirk(Q)) + if(user.add_quirk(Q, applied_client)) SSblackbox.record_feedback("nested tally", "quirks_taken", 1, list("[quirk_name]")) else - stack_trace("Invalid quirk \"[quirk_name]\" in client [cli.ckey] preferences") - cli.prefs.update_preference(P, client_quirks - P) + stack_trace("Invalid quirk \"[quirk_name]\" in client [applied_client.ckey] preferences") + applied_client.prefs.update_preference(P, client_quirks - P) badquirk = TRUE - if(badquirk) - cli.prefs.save_character() - -/* - *Randomises the quirks for a specified mob - */ -/datum/controller/subsystem/processing/quirks/proc/randomise_quirks(mob/living/user) - var/bonus_quirks = max((length(user.quirks) + rand(-RANDOM_QUIRK_BONUS, RANDOM_QUIRK_BONUS)), MINIMUM_RANDOM_QUIRKS) - var/added_quirk_count = 0 //How many we've added - var/list/quirks_to_add = list() //Quirks we're adding - var/good_count = 0 //Maximum of 6 good perks - var/score //What point score we're at - ///Cached list of possible quirks - var/list/possible_quirks = quirks.Copy() - //Create a random list of stuff to start with - while(bonus_quirks > added_quirk_count) - var/quirk = pick(possible_quirks) //quirk is a string - if(quirk in quirk_blacklist) //prevent blacklisted - possible_quirks -= quirk - continue - if(quirk_points[quirk] > 0) - good_count++ - score += quirk_points[quirk] - quirks_to_add += quirk - possible_quirks -= quirk - added_quirk_count++ - - //But lets make sure we're balanced - while(score > 0) - if(!length(possible_quirks))//Lets not get stuck - break - var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted - possible_quirks -= quirk - continue - if(!quirk_points[quirk] < 0)//negative only - possible_quirks -= quirk - continue - good_count++ - score += quirk_points[quirk] - quirks_to_add += quirk - - //And have benefits too - while(score < 0 && good_count <= MAX_QUIRKS) - if(!length(possible_quirks))//Lets not get stuck - break - var/quirk = pick(quirks) - if(quirk in quirk_blacklist) //prevent blacklisted - possible_quirks -= quirk - continue - if(!quirk_points[quirk] > 0) //positive only - possible_quirks -= quirk - continue - good_count++ - score += quirk_points[quirk] - quirks_to_add += quirk - - for(var/datum/quirk/quirk as anything in user.quirks) - if(quirk.name in quirks_to_add) //Don't delete ones we keep - quirks_to_add -= quirk.name //Already there, no need to add. - continue - user.remove_quirk(quirk.type) //these quirks are objects - for(var/datum/quirk/quirk as anything in quirks_to_add) - user.add_quirk(quirks[quirk]) //these are typepaths converted from string + if(badquirk) + applied_client.prefs.save_character() /// Takes a list of quirk names and returns a new list of quirks that would /// be valid. @@ -144,9 +70,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks) /// Expects all quirk names to be unique, but makes no other expectations. /datum/controller/subsystem/processing/quirks/proc/filter_invalid_quirks(list/quirks) var/list/new_quirks = list() - var/list/positive_quirks = list() - var/balance = 0 - var/list/all_quirks = get_quirks() for (var/quirk_name in quirks) @@ -154,9 +77,6 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if (isnull(quirk)) continue - if (initial(quirk.mood_quirk) && CONFIG_GET(flag/disable_human_mood)) - continue - var/blacklisted = FALSE for (var/list/blacklist as anything in quirk_blacklist) @@ -174,27 +94,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) if (blacklisted) continue - var/value = initial(quirk.value) - if (value > 0) - if (positive_quirks.len == MAX_QUIRKS) - continue - - positive_quirks[quirk_name] = value - - balance += value new_quirks += quirk_name - if (balance > 0) - var/balance_left_to_remove = balance - - for (var/positive_quirk in positive_quirks) - var/value = positive_quirks[positive_quirk] - balance_left_to_remove -= value - new_quirks -= positive_quirk - - if (balance_left_to_remove <= 0) - break - // It is guaranteed that if no quirks are invalid, you can simply check through `==` if (new_quirks.len == quirks.len) return quirks diff --git a/code/controllers/subsystem/processing/reagents.dm b/code/controllers/subsystem/processing/reagents.dm index bbc3815d30ad..75e8c764919f 100644 --- a/code/controllers/subsystem/processing/reagents.dm +++ b/code/controllers/subsystem/processing/reagents.dm @@ -10,13 +10,24 @@ PROCESSING_SUBSYSTEM_DEF(reagents) ///What time was it when we last ticked var/previous_world_time = 0 + ///List of all /datum/chemical_reaction datums indexed by their typepath. Use this for general lookup stuff + var/chemical_reactions_list + ///List of all /datum/chemical_reaction datums. Used during chemical reactions. Indexed by REACTANT types + var/chemical_reactions_list_reactant_index + ///List of all /datum/chemical_reaction datums. Used for the reaction lookup UI. Indexed by PRODUCT type + var/chemical_reactions_list_product_index + ///List of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff + var/chemical_reagents_list + ///List of all reactions with their associated product and result ids. Used for reaction lookups + var/chemical_reactions_results_lookup_list + /datum/controller/subsystem/processing/reagents/Initialize() - . = ..() //So our first step isn't insane previous_world_time = world.time + chemical_reagents_list = init_chemical_reagent_list() //Build GLOB lists - see holder.dm build_chemical_reactions_lists() - return + return ..() /datum/controller/subsystem/processing/reagents/fire(resumed = FALSE) if (!resumed) @@ -39,3 +50,87 @@ PROCESSING_SUBSYSTEM_DEF(reagents) STOP_PROCESSING(src, thing) if (MC_TICK_CHECK) return + +/// Initialises all /datum/reagent into a list indexed by reagent id +/datum/controller/subsystem/processing/reagents/proc/init_chemical_reagent_list() + var/list/reagent_list = list() + + var/paths = subtypesof(/datum/reagent) + + for(var/datum/reagent/path as anything in paths) + if(isabstract(path))//Are we abstract? + continue + var/datum/reagent/D = new path() + D.mass = rand(10, 800) //This is terrible and should be removed ASAP! + reagent_list[path] = D + + return reagent_list + +/datum/controller/subsystem/processing/reagents/proc/build_chemical_reactions_lists() + //Chemical Reactions - Initialises all /datum/chemical_reaction into a list + // It is filtered into multiple lists within a list. + // For example: + // chemical_reactions_list_reactant_index[/datum/reagent/toxin/plasma] is a list of all reactions relating to plasma + //For chemical reaction list product index - indexes reactions based off the product reagent type - see get_recipe_from_reagent_product() in helpers + //For chemical reactions list lookup list - creates a bit list of info passed to the UI. This is saved to reduce lag from new windows opening, since it's a lot of data. + + //Prevent these reactions from appearing in lookup tables (UI code) + var/list/blacklist = (/datum/chemical_reaction/randomized) + + if(SSreagents.chemical_reactions_list_reactant_index) + return + + //Randomized need to go last since they need to check against conflicts with normal recipes + var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) + SSreagents.chemical_reactions_list = list() //typepath to reaction list + SSreagents.chemical_reactions_list_reactant_index = list() //reagents to reaction list + SSreagents.chemical_reactions_results_lookup_list = list() //UI glob + SSreagents.chemical_reactions_list_product_index = list() //product to reaction list + + for(var/path in paths) + var/datum/chemical_reaction/D = new path() + var/list/reaction_ids = list() + var/list/product_ids = list() + var/list/reagents = list() + var/list/product_names = list() + + if(!D.required_reagents || !D.required_reagents.len) //Skip impossible reactions + continue + + SSreagents.chemical_reactions_list[path] = D + + for(var/reaction in D.required_reagents) + reaction_ids += reaction + var/datum/reagent/reagent = find_reagent_object_from_type(reaction) + reagents += list(list("name" = reagent.name, "id" = reagent.type)) + + for(var/product in D.results) + var/datum/reagent/reagent = find_reagent_object_from_type(product) + product_names += reagent.name + product_ids += product + + var/product_name + if(!length(product_names)) + var/list/names = splittext("[D.type]", "/") + product_name = names[names.len] + else + product_name = product_names[1] + + // Create filters based on each reagent id in the required reagents list - this is specifically for finding reactions from product(reagent) ids/typepaths. + for(var/id in product_ids) + if(is_type_in_list(D.type, blacklist)) + continue + if(!SSreagents.chemical_reactions_list_product_index[id]) + SSreagents.chemical_reactions_list_product_index[id] = list() + SSreagents.chemical_reactions_list_product_index[id] += D + + //Master list of ALL reactions that is used in the UI lookup table. This is expensive to make, and we don't want to lag the server by creating it on UI request, so it's cached to send to UIs instantly. + if(!(is_type_in_list(D.type, blacklist))) + SSreagents.chemical_reactions_results_lookup_list += list(list("name" = product_name, "id" = D.type, "reactants" = reagents)) + + // Create filters based on each reagent id in the required reagents list - this is used to speed up handle_reactions() + for(var/id in reaction_ids) + if(!SSreagents.chemical_reactions_list_reactant_index[id]) + SSreagents.chemical_reactions_list_reactant_index[id] = list() + SSreagents.chemical_reactions_list_reactant_index[id] += D + break // Don't bother adding ourselves to other reagent ids, it is redundant diff --git a/code/controllers/subsystem/processing/singulo.dm b/code/controllers/subsystem/processing/singulo.dm index 49f6ec61e5b5..cabb4cd59eaa 100644 --- a/code/controllers/subsystem/processing/singulo.dm +++ b/code/controllers/subsystem/processing/singulo.dm @@ -1,7 +1,7 @@ /// Very rare subsystem, provides any active singularities with the timings and seclusion they need to succeed PROCESSING_SUBSYSTEM_DEF(singuloprocess) name = "Singularity" - wait = 0.5 + wait = 1 priority = FIRE_PRIORITY_DEFAULT flags = SS_HIBERNATE stat_tag = "SIN" diff --git a/code/controllers/subsystem/security_level.dm b/code/controllers/subsystem/security_level.dm index e3168dee0c39..b8a3e79796d6 100644 --- a/code/controllers/subsystem/security_level.dm +++ b/code/controllers/subsystem/security_level.dm @@ -3,6 +3,17 @@ SUBSYSTEM_DEF(security_level) flags = SS_NO_FIRE /// Currently set security level var/current_level = SEC_LEVEL_GREEN + var/list/datum/keycard_auth_action/kad_actions + +/datum/controller/subsystem/security_level/Initialize(start_timeofday) + + kad_actions = list() + for(var/datum/keycard_auth_action/kaa_type as anything in subtypesof(/datum/keycard_auth_action)) + if(isabstract(kaa_type) || !initial(kaa_type.available_roundstart)) + continue + kad_actions[kaa_type] = new kaa_type + + . = ..() /** * Sets a new security level as our current level diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm index d5f3c1c2e8f9..477bd6355074 100644 --- a/code/controllers/subsystem/server_maint.dm +++ b/code/controllers/subsystem/server_maint.dm @@ -35,8 +35,9 @@ SUBSYSTEM_DEF(server_maint) /datum/controller/subsystem/server_maint/fire(resumed = FALSE) if(!resumed) - if(list_clear_nulls(GLOB.clients)) - log_world("Found a null in clients list!") + var/nulls = list_clear_nulls(GLOB.clients) + if(nulls) + log_world("Found [nulls] null(s) in clients list!") src.currentrun = GLOB.clients.Copy() var/position_in_loop = (cleanup_ticker / delay) + 1 //Index at 1, thanks byond diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 0f18eaf95a62..3e2001442643 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -1,4 +1,9 @@ #define MAX_TRANSIT_REQUEST_RETRIES 10 +/// How many turfs to allow before we stop blocking transit requests +#define MAX_TRANSIT_TILE_COUNT (150 ** 2) +/// How many turfs to allow before we start freeing up existing "soft reserved" transit docks +/// If we're under load we want to allow for cycling, but if not we want to preserve already generated docks for use +#define SOFT_TRANSIT_RESERVATION_THRESHOLD (100 ** 2) SUBSYSTEM_DEF(shuttle) name = "Shuttle" @@ -25,7 +30,8 @@ SUBSYSTEM_DEF(shuttle) var/list/transit_requesters = list() /// An associative list of the mobile docking ports that have failed a transit request, with the amount of times they've actually failed that transit request, up to MAX_TRANSIT_REQUEST_RETRIES var/list/transit_request_failures = list() - + /// How many turfs our shuttles are currently utilizing in reservation space + var/transit_utilized = 0 /** * Emergency shuttle stuff */ @@ -153,6 +159,8 @@ SUBSYSTEM_DEF(shuttle) supply_packs[pack.id] = pack + sortTim(supply_packs, GLOBAL_PROC_REF(cmp_name_asc), associative = TRUE) + setup_shuttles(stationary_docking_ports) has_purchase_shuttle_access = init_has_purchase_shuttle_access() @@ -165,7 +173,7 @@ SUBSYSTEM_DEF(shuttle) if(!supply) log_mapping("No /obj/docking_port/mobile/supply placed on the map!") - if(CONFIG_GET(flag/arrivals_shuttle_require_undocked)) + if(CONFIG_GET(flag/arrivals_shuttle_require_undocked) && arrivals) arrivals.Launch(TRUE) return ..() @@ -189,6 +197,12 @@ SUBSYSTEM_DEF(shuttle) // This next one removes transit docks/zones that aren't // immediately being used. This will mean that the zone creation // code will be running a lot. + + // If we're below the soft reservation threshold, don't clear the old space + // We're better off holding onto it for now + if(transit_utilized < SOFT_TRANSIT_RESERVATION_THRESHOLD) + continue + var/obj/docking_port/mobile/owner = T.owner if(owner) var/idle = owner.mode == SHUTTLE_IDLE @@ -201,7 +215,11 @@ SUBSYSTEM_DEF(shuttle) if(!SSmapping.clearing_reserved_turfs) while(transit_requesters.len) var/requester = popleft(transit_requesters) - var/success = generate_transit_dock(requester) + var/success = null + // Do not try and generate any transit if we're using more then our max already + if(transit_utilized < MAX_TRANSIT_TILE_COUNT) + success = generate_transit_dock(requester) + if(!success) // BACK OF THE QUEUE transit_request_failures[requester]++ if(transit_request_failures[requester] < MAX_TRANSIT_REQUEST_RETRIES) @@ -397,7 +415,7 @@ SUBSYSTEM_DEF(shuttle) var/callShuttle = TRUE - for(var/thing in GLOB.shuttle_caller_list) + for(var/thing in INSTANCES_OF(TRACKING_KEY_SHUTTLE_CALLER)) if(isAI(thing)) var/mob/living/silicon/ai/AI = thing if(AI.deployed_shell && !AI.deployed_shell.client) @@ -588,10 +606,17 @@ SUBSYSTEM_DEF(shuttle) var/turf/midpoint = locate(transit_x, transit_y, bottomleft.z) if(!midpoint) + qdel(proposal) return FALSE + + var/area/old_area = midpoint.loc + old_area.turfs_to_uncontain += proposal.reserved_turfs + var/area/shuttle/transit/A = new() A.parallax_movedir = travel_dir A.contents = proposal.reserved_turfs + A.contained_turfs = proposal.reserved_turfs + var/obj/docking_port/stationary/transit/new_transit_dock = new(midpoint) new_transit_dock.reserved_area = proposal new_transit_dock.name = "Transit for [M.id]/[M.name]" @@ -601,9 +626,17 @@ SUBSYSTEM_DEF(shuttle) // Add 180, because ports point inwards, rather than outwards new_transit_dock.setDir(angle2dir(dock_angle)) + // Proposals use 2 extra hidden tiles of space, from the cordons that surround them + transit_utilized += (proposal.width + 2) * (proposal.height + 2) M.assigned_transit = new_transit_dock + RegisterSignal(proposal, COMSIG_PARENT_QDELETING, PROC_REF(transit_space_clearing)) return new_transit_dock +/// Gotta manage our space brother +/datum/controller/subsystem/shuttle/proc/transit_space_clearing(datum/turf_reservation/source) + SIGNAL_HANDLER + transit_utilized -= (source.width + 2) * (source.height + 2) + /datum/controller/subsystem/shuttle/Recover() initialized = SSshuttle.initialized if (istype(SSshuttle.mobile_docking_ports)) @@ -734,8 +767,7 @@ SUBSYSTEM_DEF(shuttle) hidden_shuttle_turf_images -= remove_images hidden_shuttle_turf_images += add_images - for(var/V in GLOB.navigation_computers) - var/obj/machinery/computer/camera_advanced/shuttle_docker/C = V + for(var/obj/machinery/computer/camera_advanced/shuttle_docker/C as anything in INSTANCES_OF(/obj/machinery/computer/camera_advanced/shuttle_docker)) C.update_hidden_docking_ports(remove_images, add_images) QDEL_LIST(remove_images) @@ -807,7 +839,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/load_template(datum/map_template/shuttle/S) . = FALSE // Load shuttle template to a fresh block reservation. - preview_reservation = SSmapping.RequestBlockReservation(S.width, S.height, SSmapping.transit.z_value, /datum/turf_reservation/transit) + preview_reservation = SSmapping.RequestBlockReservation(S.width, S.height, type = /datum/turf_reservation/transit) if(!preview_reservation) CRASH("failed to reserve an area for shuttle template loading") var/turf/BL = TURF_FROM_COORDS_LIST(preview_reservation.bottom_left_coords) diff --git a/code/controllers/subsystem/spatial_gridmap.dm b/code/controllers/subsystem/spatial_gridmap.dm index db5a3bbf70db..0780bd6e9a62 100644 --- a/code/controllers/subsystem/spatial_gridmap.dm +++ b/code/controllers/subsystem/spatial_gridmap.dm @@ -477,18 +477,18 @@ SUBSYSTEM_DEF(spatial_grid) for(var/type in spatial_grid_categories[old_target.spatial_grid_key]) switch(type) if(SPATIAL_GRID_CONTENTS_TYPE_CLIENTS) - var/list/old_target_contents = old_target.important_recursive_contents //cache for sanic speeds (lists are references anyways) - GRID_CELL_REMOVE(intersecting_cell.client_contents, old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_CLIENTS]) - SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(SPATIAL_GRID_CONTENTS_TYPE_CLIENTS), old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_CLIENTS]) + var/list/old_target_contents = old_target.important_recursive_contents?[type] || old_target + GRID_CELL_REMOVE(intersecting_cell.client_contents, old_target_contents) + SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(type), old_target_contents) if(SPATIAL_GRID_CONTENTS_TYPE_HEARING) - var/list/old_target_contents = old_target.important_recursive_contents //cache for sanic speeds (lists are references anyways) - GRID_CELL_REMOVE(intersecting_cell.hearing_contents, old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_HEARING]) - SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(SPATIAL_GRID_CONTENTS_TYPE_HEARING), old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_HEARING]) + var/list/old_target_contents = old_target.important_recursive_contents?[type] || old_target + GRID_CELL_REMOVE(intersecting_cell.hearing_contents, old_target_contents) + SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(type), old_target_contents) if(SPATIAL_GRID_CONTENTS_TYPE_ATMOS) GRID_CELL_REMOVE(intersecting_cell.atmos_contents, old_target) - SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(SPATIAL_GRID_CONTENTS_TYPE_ATMOS), old_target) + SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(type), old_target) if(SPATIAL_GRID_CONTENTS_TYPE_RADIO_NONATMOS) var/list/old_target_contents = old_target.important_recursive_contents //cache for sanic speeds (lists are references anyways) @@ -519,14 +519,14 @@ SUBSYSTEM_DEF(spatial_grid) switch(exclusive_type) if(SPATIAL_GRID_CONTENTS_TYPE_CLIENTS) - var/list/old_target_contents = old_target.important_recursive_contents //cache for sanic speeds (lists are references anyways) - GRID_CELL_REMOVE(intersecting_cell.client_contents, old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_CLIENTS]) - SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(exclusive_type), old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_CLIENTS]) + var/list/old_target_contents = old_target.important_recursive_contents?[exclusive_type] || old_target //cache for sanic speeds (lists are references anyways) + GRID_CELL_REMOVE(intersecting_cell.client_contents, old_target_contents) + SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(exclusive_type), old_target_contents) if(SPATIAL_GRID_CONTENTS_TYPE_HEARING) - var/list/old_target_contents = old_target.important_recursive_contents - GRID_CELL_REMOVE(intersecting_cell.hearing_contents, old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_HEARING]) - SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(exclusive_type), old_target_contents[SPATIAL_GRID_CONTENTS_TYPE_HEARING]) + var/list/old_target_contents = old_target.important_recursive_contents?[exclusive_type] || old_target + GRID_CELL_REMOVE(intersecting_cell.hearing_contents, old_target_contents) + SEND_SIGNAL(intersecting_cell, SPATIAL_GRID_CELL_EXITED(exclusive_type), old_target_contents) if(SPATIAL_GRID_CONTENTS_TYPE_ATMOS) GRID_CELL_REMOVE(intersecting_cell.atmos_contents, old_target) @@ -544,23 +544,106 @@ SUBSYSTEM_DEF(spatial_grid) return TRUE -///find the cell this movable is associated with and removes it from all lists -/datum/controller/subsystem/spatial_grid/proc/force_remove_from_cell(atom/movable/to_remove, datum/spatial_grid_cell/input_cell) +/// if for whatever reason this movable is "untracked" e.g. it breaks the assumption that a movable is only inside the contents of any grid cell associated with its loc, +/// this will error. this checks every grid cell in the world so dont call this on live unless you have to. +/// returns TRUE if this movable is untracked, FALSE otherwise +/datum/controller/subsystem/spatial_grid/proc/untracked_movable_error(atom/movable/movable_to_check) + if(!movable_to_check?.spatial_grid_key) + return FALSE + + if(!initialized) + return FALSE + + var/datum/spatial_grid_cell/loc_cell = get_cell_of(movable_to_check) + var/list/containing_cells = find_hanging_cell_refs_for_movable(movable_to_check, remove_from_cells=FALSE) + //if we're in multiple cells, throw an error. + //if we're in 1 cell but it cant be deduced by our location, throw an error. + if(length(containing_cells) > 1 || (length(containing_cells) == 1 && loc_cell && containing_cells[1] != loc_cell && containing_cells[1] != null)) + var/error_data = "" + + var/location_string = "which is in nullspace, and thus not be within the contents of any spatial grid cell" + if(loc_cell) + location_string = "which is supposed to only be in the contents of a spatial grid cell at coords: ([GRID_INDEX_TO_COORDS(loc_cell.cell_x)], [GRID_INDEX_TO_COORDS(loc_cell.cell_y)], [loc_cell.cell_z])" + + var/error_explanation = "was in the contents of [length(containing_cells)] spatial grid cells when it was only supposed to be in one!" + if(length(containing_cells) == 1) + error_explanation = "was in the contents of 1 spatial grid cell but it was inside the area handled by another grid cell!" + var/datum/spatial_grid_cell/bad_cell = containing_cells[1] + + error_data = "within the contents of a cell at coords: ([GRID_INDEX_TO_COORDS(bad_cell.cell_x)], [GRID_INDEX_TO_COORDS(bad_cell.cell_y)], [bad_cell.cell_z])" + + if(!error_data) + for(var/datum/spatial_grid_cell/cell in containing_cells) + var/coords = "([GRID_INDEX_TO_COORDS(cell.cell_x)], [GRID_INDEX_TO_COORDS(cell.cell_y)], [cell.cell_z])" + var/contents = "" + + if(movable_to_check in cell.hearing_contents) + contents = "hearing" + + if(movable_to_check in cell.client_contents) + if(length(contents) > 0) + contents = "[contents], client" + else + contents = "client" + + if(movable_to_check in cell.atmos_contents) + if(length(contents) > 0) + contents = "[contents], atmos" + else + contents = "atmos" + + if(length(error_data) > 0) + error_data = "[error_data], {coords: [coords], within channels: [contents]}" + else + error_data = "within the contents of the following cells: {coords: [coords], within channels: [contents]}" + + /** + * example: + * + * /mob/living/trolls_the_maintainer instance, which is supposed to only be in the contents of a spatial grid cell at coords: (136, 136, 14), + * was in the contents of 3 spatial grid cells when it was only supposed to be in one! within the contents of the following cells: + * {(68, 153, 2), within channels: hearing}, + * {coords: (221, 170, 3), within channels: hearing}, + * {coords: (255, 153, 11), within channels: hearing}, + * {coords: (136, 136, 14), within channels: hearing}. + */ + stack_trace("[movable_to_check.type] instance, [location_string], [error_explanation] [error_data].") + + return TRUE + + return FALSE + +/** + * remove this movable from the grid by finding the grid cell its in and removing it from that. + * if it cant infer a grid cell its located in (e.g. if its in nullspace but it can happen if the grid isnt expanded to a z level), search every grid cell. + */ +/datum/controller/subsystem/spatial_grid/proc/force_remove_from_grid(atom/movable/to_remove) + if(!to_remove?.spatial_grid_key) + return + if(!initialized) remove_from_pre_init_queue(to_remove)//the spatial grid doesnt exist yet, so just take it out of the queue return +#ifdef UNIT_TESTS + if(untracked_movable_error(to_remove)) + find_hanging_cell_refs_for_movable(to_remove, remove_from_cells=FALSE) //dont remove from cells because we should be able to see 2 errors + return +#endif + + var/datum/spatial_grid_cell/loc_cell = get_cell_of(to_remove) + + if(loc_cell) + GRID_CELL_REMOVE_ALL(loc_cell, to_remove) + else + find_hanging_cell_refs_for_movable(to_remove, remove_from_cells=TRUE) + +///remove this movable from the given spatial_grid_cell +/datum/controller/subsystem/spatial_grid/proc/force_remove_from_cell(atom/movable/to_remove, datum/spatial_grid_cell/input_cell) if(!input_cell) - input_cell = get_cell_of(to_remove) - if(!input_cell) - find_hanging_cell_refs_for_movable(to_remove, TRUE) - return + return - GRID_CELL_REMOVE(input_cell.client_contents, to_remove) - GRID_CELL_REMOVE(input_cell.hearing_contents, to_remove) - GRID_CELL_REMOVE(input_cell.atmos_contents, to_remove) - GRID_CELL_REMOVE(input_cell.radio_atmos_contents, to_remove) - GRID_CELL_REMOVE(input_cell.radio_nonatmos_contents, to_remove) + GRID_CELL_REMOVE_ALL(input_cell, to_remove) ///if shit goes south, this will find hanging references for qdeleting movables inside the spatial grid /datum/controller/subsystem/spatial_grid/proc/find_hanging_cell_refs_for_movable(atom/movable/to_remove, remove_from_cells = TRUE) @@ -590,7 +673,7 @@ SUBSYSTEM_DEF(spatial_grid) ///debug proc for checking if a movable is in multiple cells when it shouldnt be (ie always unless multitile entering is implemented) /atom/proc/find_all_cells_containing(remove_from_cells = FALSE) var/datum/spatial_grid_cell/real_cell = SSspatial_grid.get_cell_of(src) - var/list/containing_cells = SSspatial_grid.find_hanging_cell_refs_for_movable(src, FALSE, remove_from_cells) + var/list/containing_cells = SSspatial_grid.find_hanging_cell_refs_for_movable(src, remove_from_cells) message_admins("[src] is located in the contents of [length(containing_cells)] spatial grid cells") @@ -648,6 +731,7 @@ SUBSYSTEM_DEF(spatial_grid) . += current_ear +#ifdef SPATIAL_GRID_ZLEVEL_STATS ///debug proc for finding how full the cells of src's z level are /atom/proc/find_grid_statistics_for_z_level(insert_clients = 0) var/raw_clients = 0 @@ -878,7 +962,5 @@ SUBSYSTEM_DEF(spatial_grid) the average atmos distance is [average_atmos_distance], \ and the average atmos radio receiver distance is [average_atmosradio_distance]\ ") - -#undef GRID_CELL_ADD -#undef GRID_CELL_REMOVE -#undef GRID_CELL_SET +#endif +#undef NUMBER_OF_PREGENERATED_ORANGES_EARS diff --git a/code/controllers/subsystem/speech_controller.dm b/code/controllers/subsystem/speech_controller.dm index 3168fbd9e965..e293c89a9bb6 100644 --- a/code/controllers/subsystem/speech_controller.dm +++ b/code/controllers/subsystem/speech_controller.dm @@ -1,53 +1,5 @@ -SUBSYSTEM_DEF(speech_controller) +/// verb_manager subsystem just for handling say's +VERB_MANAGER_SUBSYSTEM_DEF(speech_controller) name = "Speech Controller" wait = 1 - flags = SS_TICKER|SS_NO_INIT priority = FIRE_PRIORITY_SPEECH_CONTROLLER//has to be high priority, second in priority ONLY to SSinput - runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY - - ///used so that an admin can force all speech verbs to execute immediately instead of queueing - var/FOR_ADMINS_IF_BROKE_immediately_execute_all_speech = FALSE - - ///list of the form: list(client mob, message that mob is queued to say, other say arguments (if any)). - ///this is our process queue, processed every tick. - var/list/queued_says_to_execute = list() - -///queues mob_to_queue into our process list so they say(message) near the start of the next tick -/datum/controller/subsystem/speech_controller/proc/queue_say_for_mob(mob/mob_to_queue, message, message_type) - - if(!TICK_CHECK || FOR_ADMINS_IF_BROKE_immediately_execute_all_speech) - process_single_say(mob_to_queue, message, message_type) - return TRUE - - queued_says_to_execute += list(list(mob_to_queue, message, message_type)) - - return TRUE - -/datum/controller/subsystem/speech_controller/fire(resumed) - - /// cache for sanic speed (lists are references anyways) - var/list/says_to_process = queued_says_to_execute.Copy() - queued_says_to_execute.Cut()//we should be going through the entire list every single iteration - - for(var/list/say_to_process as anything in says_to_process) - - var/mob/mob_to_speak = say_to_process[MOB_INDEX]//index 1 is the mob, 2 is the message, 3 is the message category - var/message = say_to_process[MESSAGE_INDEX] - var/message_category = say_to_process[CATEGORY_INDEX] - - process_single_say(mob_to_speak, message, message_category) - -///used in fire() to process a single mobs message through the relevant proc. -///only exists so that sleeps in the message pipeline dont cause the whole queue to wait -/datum/controller/subsystem/speech_controller/proc/process_single_say(mob/mob_to_speak, message, message_category) - set waitfor = FALSE - - switch(message_category) - if(SPEECH_CONTROLLER_QUEUE_SAY_VERB) - mob_to_speak.say(message) - - if(SPEECH_CONTROLLER_QUEUE_WHISPER_VERB) - mob_to_speak.whisper(message) - - if(SPEECH_CONTROLLER_QUEUE_EMOTE_VERB) - mob_to_speak.emote("me",1,message,TRUE) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 297b507ca22c..5106770a6c4d 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -27,6 +27,8 @@ SUBSYSTEM_DEF(statpanels) "Map: [SSmapping.config?.map_name || "Loading..."]", cached ? "Next Map: [cached.map_name]" : null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]", + "Gamemode: [SSticker.get_mode_name()]", + "\n", "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)]%)", "Server Time: [time2text(world.timeofday, "hh:mm:ss DD-MM-YYYY")]", "\n", @@ -241,16 +243,16 @@ SUBSYSTEM_DEF(statpanels) list("CPU:", world.cpu), list("Instances:", "[num2text(world.contents.len, 10)]"), list("World Time:", "[world.time]"), - list("Globals:", GLOB.stat_entry(), text_ref(GLOB)), - list("[config]:", config.stat_entry(), text_ref(config)), + list("Globals:", GLOB.stat_entry(), ref(GLOB)), + list("[config]:", config.stat_entry(), ref(config)), list("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)]%)"), - list("Master Controller:", Master.stat_entry(), text_ref(Master)), - list("Failsafe Controller:", Failsafe.stat_entry(), text_ref(Failsafe)), + list("Master Controller:", Master.stat_entry(), ref(Master)), + list("Failsafe Controller:", Failsafe.stat_entry(), ref(Failsafe)), list("","") ) for(var/datum/controller/subsystem/sub_system as anything in Master.subsystems) - mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), text_ref(sub_system)) - mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", text_ref(GLOB.cameranet)) + mc_data[++mc_data.len] = list("\[[sub_system.state_letter()]][sub_system.name]", sub_system.stat_entry(), ref(sub_system)) + mc_data[++mc_data.len] = list("Camera Net", "Cameras: [GLOB.cameranet.cameras.len] | Chunks: [GLOB.cameranet.chunks.len]", ref(GLOB.cameranet)) ///immediately update the active statpanel tab of the target client /datum/controller/subsystem/statpanels/proc/immediate_send_stat_data(client/target) diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 3fa7943d5a9b..61d3d43665d7 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -4,8 +4,8 @@ SUBSYSTEM_DEF(throwing) name = "Throwing" priority = FIRE_PRIORITY_THROWING - wait = SS_TICKER - flags = SS_NO_INIT + wait = 1 + flags = SS_NO_INIT | SS_TICKER | SS_KEEP_TIMING runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME var/list/currentrun = list() @@ -15,7 +15,6 @@ SUBSYSTEM_DEF(throwing) msg = "P:[length(processing)]" return ..() - /datum/controller/subsystem/throwing/fire(resumed = 0) if (!resumed) src.currentrun = processing.Copy() @@ -85,9 +84,10 @@ SUBSYSTEM_DEF(throwing) var/delayed_time = 0 ///The last world.time value stored when the thrownthing was moving. var/last_move = 0 + /// If the thrown object is spinning + var/is_spinning = FALSE - -/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone) +/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone, spin) . = ..() src.thrownthing = thrownthing RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, PROC_REF(on_thrownthing_qdel)) @@ -103,17 +103,17 @@ SUBSYSTEM_DEF(throwing) src.gentle = gentle src.callback = callback src.target_zone = target_zone - + src.is_spinning = spin /datum/thrownthing/Destroy() + stop_spinning() SSthrowing.processing -= thrownthing SSthrowing.currentrun -= thrownthing thrownthing.throwing = null thrownthing = null thrower = null initial_target = null - if(callback) - QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that. + callback = null //It stores a reference to the thrownthing, its source. Let's clean that. return ..() @@ -191,7 +191,10 @@ SUBSYSTEM_DEF(throwing) //done throwing, either because it hit something or it finished moving if(!thrownthing) return + thrownthing.throwing = null + stop_spinning() + if (!hit) for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on. if (obstacle == target) @@ -217,10 +220,13 @@ SUBSYSTEM_DEF(throwing) callback.Invoke() if(!thrownthing.currently_z_moving) // I don't think you can zfall while thrown but hey, just in case. - var/turf/T = get_turf(thrownthing) - T?.zFall(thrownthing) + thrownthing.zFall() if(thrownthing) SEND_SIGNAL(thrownthing, COMSIG_MOVABLE_THROW_LANDED, src) qdel(src) + +/// Remove the spinning animation from the thrown object +/datum/thrownthing/proc/stop_spinning() + animate(thrownthing) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 358e5990d3c2..994cc3d50541 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -9,7 +9,10 @@ SUBSYSTEM_DEF(ticker) runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME var/current_state = GAME_STATE_STARTUP //state of current round (used by process()) Use the defines GAME_STATE_* ! - var/force_ending = 0 //Round was ended by admin intervention + + /// When TRUE, the round will end next tick or has already ended. Use SSticker.end_round() instead. This var is used by non-gamemodes to end the round. + VAR_PRIVATE/force_ending = FALSE + // If true, there is no lobby phase, the game starts immediately. #ifndef LOWMEMORYMODE var/start_immediately = FALSE @@ -19,10 +22,16 @@ SUBSYSTEM_DEF(ticker) var/setup_done = FALSE //All game setup done including mode post setup and var/datum/game_mode/mode = null - ///JSON for the music played in the lobby - var/list/login_music - ///JSON for the round end music. - var/list/credits_music + ///The name of the gamemode to show at roundstart. This is here to admins can give fake gamemodes. + var/mode_display_name = null + + ///All players that are readied up and about to spawn in. + var/list/mob/dead/new_player/ready_players + + ///Media track for the music played in the lobby + var/datum/media/login_music + ///Media track for the round end music. + var/datum/media/credits_music var/round_end_sound //music/jingle played when the world reboots var/round_end_sound_sent = TRUE //If all clients have loaded it @@ -48,6 +57,8 @@ SUBSYSTEM_DEF(ticker) var/totalPlayersReady = 0 /// Num of ready admins, used for pregame stats on statpanel (only viewable by admins) var/total_admins_ready = 0 + /// Data for lobby player stat panels during the pre-game. + var/list/player_ready_data = list() var/queue_delay = 0 var/list/queued_players = list() //used for join queues when the server exceeds the hard population cap @@ -94,11 +105,23 @@ SUBSYSTEM_DEF(ticker) GLOB.syndicate_code_response_regex = codeword_match + if(!GLOB.revolution_code_phrase) + GLOB.revolution_code_phrase = generate_code_phrase(return_list=TRUE) + + var/codewords = jointext(GLOB.syndicate_code_phrase, "|") + var/regex/codeword_match = new("([codewords])", "ig") + + GLOB.revolution_code_phrase_regex = codeword_match + start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) if(CONFIG_GET(flag/randomize_shift_time)) gametime_offset = rand(0, 23) HOURS else if(CONFIG_GET(flag/shift_time_realtime)) gametime_offset = world.timeofday + + if(GLOB.is_debug_server) + mode = new /datum/game_mode/extended + return ..() /datum/controller/subsystem/ticker/fire() @@ -122,12 +145,47 @@ SUBSYSTEM_DEF(ticker) totalPlayers = LAZYLEN(GLOB.new_player_list) totalPlayersReady = 0 total_admins_ready = 0 + player_ready_data.Cut() + var/list/players = list() + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) - if(player.ready == PLAYER_READY_TO_PLAY) + if(player.ready == PLAYER_READY_TO_PLAY || player.ready == PLAYER_READY_TO_OBSERVE) ++totalPlayersReady if(player.client?.holder) ++total_admins_ready + players[player.key] = player + + sortTim(players, GLOBAL_PROC_REF(cmp_text_asc)) + + if(CONFIG_GET(flag/show_job_estimation)) + for(var/ckey in players) + var/mob/dead/new_player/player = players[ckey] + var/datum/preferences/prefs = player.client?.prefs + if(!prefs) + continue + if(!prefs.read_preference(/datum/preference/toggle/ready_job)) + continue + + var/display = player.client?.holder?.fakekey || ckey + if(player.ready == PLAYER_READY_TO_OBSERVE) + player_ready_data += "* [display] as Observer" + continue + + var/datum/job/J = prefs.get_highest_priority_job() + if(!J) + player_ready_data += "* [display] forgot to pick a job!" + continue + var/title = prefs.alt_job_titles?[J.title] || J.title + if(player.ready == PLAYER_READY_TO_PLAY) + player_ready_data += "* [display] as [title]" + + if(length(player_ready_data)) + player_ready_data.Insert(1, "------------------") + player_ready_data.Insert(1, "Job Estimation:") + player_ready_data.Insert(1, "") + + if(start_immediately) timeLeft = 0 @@ -150,6 +208,7 @@ SUBSYSTEM_DEF(ticker) if(GAME_STATE_SETTING_UP) if(!setup()) //setup failed + start_immediately = FALSE //If the game failed to start, don't keep trying current_state = GAME_STATE_STARTUP start_at = world.time + (CONFIG_GET(number/lobby_countdown) * 10) timeLeft = null @@ -157,10 +216,11 @@ SUBSYSTEM_DEF(ticker) SEND_SIGNAL(src, COMSIG_TICKER_ERROR_SETTING_UP) if(GAME_STATE_PLAYING) - mode.process(wait * 0.1) + if(mode.datum_flags & DF_ISPROCESSING) + mode.process(wait * 0.1) check_queue() - if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) + if(force_ending || (!roundend_check_paused && mode.check_finished())) current_state = GAME_STATE_FINISHED toggle_ooc(TRUE) // Turn it on toggle_dooc(TRUE) @@ -171,28 +231,22 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/setup() to_chat(world, span_boldannounce("Starting game...")) - to_chat(world, "


") var/init_start = world.timeofday - mode = new /datum/game_mode/dynamic + ready_players = list() // This needs to be reset every setup, incase the gamemode fails to start. + for(var/i in GLOB.new_player_list) + var/mob/dead/new_player/player = i + if(player.ready == PLAYER_READY_TO_PLAY && player.mind && player.check_preferences()) + ready_players.Add(player) - 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 - CHECK_TICK + // Set up gamemode, divide up jobs. + if(!initialize_gamemode()) + return FALSE - if(!GLOB.Debug2) - if(!can_continue) - log_game("Game failed pre_setup") - QDEL_NULL(mode) - to_chat(world, "Error setting up game. Reverting to pre-game lobby.") - SSjob.ResetOccupations() - return FALSE - else - message_admins(span_notice("DEBUG: Bypassing prestart checks...")) + to_chat(world, span_boldannounce("The gamemode is: [get_mode_name()].")) + if(mode_display_name) + message_admins("The real gamemode is: [get_mode_name(TRUE)].") + to_chat(world, "


") CHECK_TICK @@ -212,7 +266,7 @@ SUBSYSTEM_DEF(ticker) collect_minds() equip_characters() - GLOB.data_core.manifest() + SSdatacore.generate_manifest() transfer_characters() //transfer keys to the new mobs @@ -240,8 +294,10 @@ SUBSYSTEM_DEF(ticker) var/datum/holiday/holiday = SSevents.holidays[holidayname] to_chat(world, "

[holiday.greet()]

") + //Setup the antags AFTTTTER theyve gotten their jobs + mode.setup_antags() PostSetup() - + SSticker.ready_players = null return TRUE /datum/controller/subsystem/ticker/proc/PostSetup() @@ -252,7 +308,7 @@ SUBSYSTEM_DEF(ticker) var/list/adm = get_admin_counts() var/list/allmins = adm["present"] - send2adminchat("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]" : ""] has started[allmins.len ? ".":" with no active admins online!"]") + send2adminchat("Server", "Round [GLOB.round_id ? "#[GLOB.round_id]:" : "of"] [SSticker.get_mode_name()] has started[allmins.len ? ".":" with no active admins online!"]") setup_done = TRUE for(var/i in GLOB.start_landmarks_list) @@ -275,6 +331,9 @@ SUBSYSTEM_DEF(ticker) else to_chat(iter_human, span_notice("You will gain [round(iter_human.hardcore_survival_score)] hardcore random points if you survive this round!")) +/datum/controller/subsystem/ticker/proc/end_round() + force_ending = TRUE + //These callbacks will fire after roundstart key transfer /datum/controller/subsystem/ticker/proc/OnRoundstart(datum/callback/cb) if(!HasRoundStarted()) @@ -294,19 +353,33 @@ SUBSYSTEM_DEF(ticker) qdel(bomb) /datum/controller/subsystem/ticker/proc/create_characters() - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/player = i - if(player.ready == PLAYER_READY_TO_PLAY && player.mind) - GLOB.joined_player_list += player.ckey - var/atom/destination = player.mind.assigned_role.get_roundstart_spawn_point() - if(!destination) // Failed to fetch a proper roundstart location, won't be going anywhere. - player.new_player_panel() - continue - player.create_character(destination) - else if(player.ready == PLAYER_READY_TO_OBSERVE) - player.make_me_an_observer(TRUE) - else - player.new_player_panel() + var/list/spawn_spots = SSjob.latejoin_trackers.Copy() + var/list/spawn_spots_reload = spawn_spots.Copy() //In case we run out, we need something to reload from. + for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) + if(!player.mind) + //New player has logged out. + continue + + switch(player.ready) + if(PLAYER_READY_TO_OBSERVE) + player.make_me_an_observer(TRUE) + + if(PLAYER_READY_TO_PLAY) + GLOB.joined_player_list += player.ckey + var/atom/spawn_loc = player.mind.assigned_role.get_roundstart_spawn_point() + if(spawn_loc) //If we've been given an override, just take it and get out of here. + player.create_character(spawn_loc) + + else //We haven't been passed an override destination. Give us the usual treatment. + if(!length(spawn_spots)) + spawn_spots = spawn_spots_reload.Copy() + + spawn_loc = pick_n_take(spawn_spots) + player.create_character(spawn_loc) + else //PLAYER_NOT_READY + //Reload their player panel so they see latejoin instead of ready. + player.npp.update() + CHECK_TICK /datum/controller/subsystem/ticker/proc/collect_minds() @@ -318,96 +391,77 @@ SUBSYSTEM_DEF(ticker) /datum/controller/subsystem/ticker/proc/equip_characters() - GLOB.security_officer_distribution = decide_security_officer_departments( - shuffle(GLOB.new_player_list), - shuffle(GLOB.available_depts), - ) - - var/captainless = TRUE - - var/highest_rank = length(SSjob.chain_of_command) + 1 - var/list/spare_id_candidates = list() - var/mob/dead/new_player/picked_spare_id_candidate - - // Find a suitable player to hold captaincy. - for(var/mob/dead/new_player/new_player_mob as anything in GLOB.new_player_list) - if(is_banned_from(new_player_mob.ckey, list(JOB_CAPTAIN))) - CHECK_TICK - continue - if(!ishuman(new_player_mob.new_character)) - continue - var/mob/living/carbon/human/new_player_human = new_player_mob.new_character - if(!new_player_human.mind || is_unassigned_job(new_player_human.mind.assigned_role)) - continue - // Keep a rolling tally of who'll get the cap's spare ID vault code. - // Check assigned_role's priority and curate the candidate list appropriately. - var/player_assigned_role = new_player_human.mind.assigned_role.title - var/spare_id_priority = SSjob.chain_of_command[player_assigned_role] - if(spare_id_priority) - if(spare_id_priority < highest_rank) - spare_id_candidates.Cut() - spare_id_candidates += new_player_mob - highest_rank = spare_id_priority - else if(spare_id_priority == highest_rank) - spare_id_candidates += new_player_mob - CHECK_TICK - - if(length(spare_id_candidates)) - picked_spare_id_candidate = pick(spare_id_candidates) + var/mob/dead/new_player/picked_spare_id_candidate = get_captain_or_backup() + // This is a bitfield!!! + var/departments_without_heads = filter_headless_departments(SSjob.get_necessary_departments()) for(var/mob/dead/new_player/new_player_mob as anything in GLOB.new_player_list) if(QDELETED(new_player_mob) || !isliving(new_player_mob.new_character)) CHECK_TICK continue + var/mob/living/new_player_living = new_player_mob.new_character if(!new_player_living.mind) CHECK_TICK continue + var/datum/job/player_assigned_role = new_player_living.mind.assigned_role if(player_assigned_role.job_flags & JOB_EQUIP_RANK) SSjob.EquipRank(new_player_living, player_assigned_role, new_player_mob.client) + player_assigned_role.after_roundstart_spawn(new_player_living, new_player_mob.client) + if(picked_spare_id_candidate == new_player_mob) - captainless = FALSE var/acting_captain = !is_captain_job(player_assigned_role) SSjob.promote_to_captain(new_player_living, acting_captain) - OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(minor_announce), player_assigned_role.get_captaincy_announcement(new_player_living), "")) + SSshuttle.arrivals?.OnDock(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(priority_announce), player_assigned_role.get_captaincy_announcement(new_player_living), null, null, null, null, FALSE)) + + if(departments_without_heads && (player_assigned_role.departments_bitflags & departments_without_heads)) + departments_without_heads &= ~SSjob.promote_to_department_head(new_player_living, player_assigned_role) + if((player_assigned_role.job_flags & JOB_ASSIGN_QUIRKS) && ishuman(new_player_living) && CONFIG_GET(flag/roundstart_traits)) SSquirks.AssignQuirks(new_player_living, new_player_mob.client) + CHECK_TICK - if(captainless) - for(var/mob/dead/new_player/new_player_mob as anything in GLOB.new_player_list) - var/mob/living/carbon/human/new_player_human = new_player_mob.new_character - if(new_player_human) - to_chat(new_player_mob, span_notice("Captainship not forced on anyone.")) +/datum/controller/subsystem/ticker/proc/get_captain_or_backup() + var/list/spare_id_candidates = list() + var/datum/job_department/management = SSjob.get_department_type(/datum/job_department/command) + + // Find a suitable player to hold captaincy. + for(var/mob/dead/new_player/new_player_mob as anything in GLOB.new_player_list) + if(is_banned_from(new_player_mob.ckey, list(JOB_CAPTAIN))) CHECK_TICK + continue + if(!ishuman(new_player_mob.new_character)) + continue -/datum/controller/subsystem/ticker/proc/decide_security_officer_departments( - list/new_players, - list/departments, -) - var/list/officer_mobs = list() - var/list/officer_preferences = list() + var/mob/living/carbon/human/new_player_human = new_player_mob.new_character + if(!new_player_human.mind || is_unassigned_job(new_player_human.mind.assigned_role)) + continue - for (var/mob/dead/new_player/new_player_mob as anything in new_players) - var/mob/living/carbon/human/character = new_player_mob.new_character - if (istype(character) && is_security_officer_job(character.mind?.assigned_role)) - officer_mobs += character + // Keep a rolling tally of who'll get the cap's spare ID vault code. + // Check assigned_role's priority and curate the candidate list appropriately. + if(new_player_human.mind.assigned_role.departments_bitflags & management.department_bitflags) + spare_id_candidates += new_player_human - var/datum/client_interface/client = GET_CLIENT(new_player_mob) - var/preference = client?.prefs?.read_preference(/datum/preference/choiced/security_department) - officer_preferences += preference + CHECK_TICK - var/distribution = get_officer_departments(officer_preferences, departments) + if(length(spare_id_candidates)) + return pick(spare_id_candidates) - var/list/output = list() +/// Removes departments with a head present from the given list, returning the values as bitflags +/datum/controller/subsystem/ticker/proc/filter_headless_departments(list/departments) + . = NONE - for (var/index in 1 to officer_mobs.len) - output[REF(officer_mobs[index])] = distribution[index] + for(var/path in departments - /datum/job_department/command) + var/datum/job_department/department = SSjob.get_department_type(path) + var/datum/job/head_role = SSjob.GetJobType(department.department_head) + if(head_role.current_positions == 0) + . |= department.department_bitflags - return output + return . /datum/controller/subsystem/ticker/proc/transfer_characters() var/list/livings = list() @@ -436,7 +490,7 @@ SUBSYSTEM_DEF(ticker) for (var/mob/dead/new_player/NP in queued_players) to_chat(NP, span_userdanger("The alive players limit has been released!
[html_encode(">>Join Game<<")]")) SEND_SOUND(NP, sound('sound/misc/notice1.ogg')) - NP.LateChoices() + NP.npp.LateChoices() queued_players.len = 0 queue_delay = 0 return @@ -451,7 +505,7 @@ SUBSYSTEM_DEF(ticker) if(next_in_line?.client) to_chat(next_in_line, span_userdanger("A slot has opened! You have approximately 20 seconds to join. \>\>Join Game\<\<")) SEND_SOUND(next_in_line, sound('sound/misc/notice1.ogg')) - next_in_line.LateChoices() + next_in_line.npp.LateChoices() return queued_players -= next_in_line //Client disconnected, remove he queue_delay = 0 //No vacancy: restart timer @@ -646,103 +700,44 @@ SUBSYSTEM_DEF(ticker) if(possible_themes.len) return "[global.config.directory]/reboot_themes/[pick(possible_themes)]" -/datum/controller/subsystem/ticker/proc/set_login_music(list/json) - if(!islist(json)) - CRASH("Non-list given to set_login_music()!") +/datum/controller/subsystem/ticker/proc/set_login_music(datum/media/track) + if(!istype(track)) + CRASH("Non-datum/media given to set_login_music()!") if(credits_music == login_music) - credits_music = json - login_music = json + credits_music = track + login_music = track for(var/mob/dead/new_player/player as anything in GLOB.new_player_list) if(!player.client) continue player.client.playtitlemusic() -/datum/controller/subsystem/ticker/proc/get_music_jsons(get_credits_music) - RETURN_TYPE(/list) - var/list/byond_sound_formats = list( - "mid" = TRUE, - "midi" = TRUE, - "mod" = TRUE, - "it" = TRUE, - "s3m" = TRUE, - "xm" = TRUE, - "oxm" = TRUE, - "wav" = TRUE, - "ogg" = TRUE, - "raw" = TRUE, - "wma" = TRUE, - "aiff" = TRUE, - "mp3" = TRUE, - ) - - var/list/music_data = list() - var/direct = get_credits_music ? "[global.config.directory]/credits_music/jsons/" : "[global.config.directory]/title_music/jsons/" - for(var/json_entry in flist(direct)) - var/list/music_entry = json_decode(file2text("[direct][json_entry]")) - music_data += list(music_entry) - - ///Verify that the file actually exists! - for(var/entry in music_data) - if(entry["name"] == "EXAMPLE") - music_data -= list(entry) - continue - - entry["file"] = "[config.directory]/[entry["file"]]" - if(!fexists(entry["file"])) - spawn(0) - UNTIL(SSticker.initialized) - message_admins("Music file for [entry["name"]] doesn't exist! ([entry["file"]]) call Kapu!") - - music_data -= list(entry) - continue - - ///Remove any files with illegal extensions. - for(var/entry in music_data) - var/list/directory_split = splittext(entry["file"], "/") - var/list/extension_split = splittext(directory_split[length(directory_split)], ".") - if(extension_split.len >= 2) - var/ext = lowertext(extension_split[length(extension_split)]) //pick the real extension, no 'honk.ogg.exe' nonsense here - if(byond_sound_formats[ext]) - continue - spawn(0) - UNTIL(SSticker.initialized) - message_admins("Music file for [entry["name"]] doesn't has an illegal file! ([entry["file"]]) call Kapu!") - music_data -= list(entry) - - return music_data - /datum/controller/subsystem/ticker/proc/pick_login_music() - var/list/title_music_data = list() - var/list/rare_music_data = list() - ///The json of the song used last round. - var/list/old_login_music - - if(fexists("data/last_round_lobby_music.json")) - old_login_music = json_decode(file2text("data/last_round_lobby_music.json")) - - //Remove the previous song. - var/list/music_jsons = get_music_jsons() - for(var/list/music_entry as anything in music_jsons) - if(old_login_music && (music_entry["file"] == old_login_music["file"])) - old_login_music = music_entry - - //Find rare sounds that are map-agnostic or belong to our map - if(music_entry["rare"]) - if((!music_entry["map"] || (music_entry["map"] == SSmapping.config.map_name))) - rare_music_data += list(music_entry) - - //Filter out songs that don't belong to our map, add map-agnostic songs. - else if(!music_entry["map"] || music_entry["map"] == SSmapping.config.map_name) - title_music_data += list(music_entry) - - //Remove the old login music from the current pool if it wouldn't empty the pool. + var/list/title_music_data = SSmedia.get_track_pool(MEDIA_TAG_LOBBYMUSIC_COMMON) + var/list/rare_music_data = SSmedia.get_track_pool(MEDIA_TAG_LOBBYMUSIC_RARE) + ///The full path of the last song used + var/old_login_music_t + ///The full datum of the last song used. + var/datum/media/old_login_music + + if(rustg_file_exists("data/last_round_lobby_music.txt")) //The define isn't truthy + old_login_music_t = rustg_file_read("data/last_round_lobby_music.txt") + var/list/music_tracks = title_music_data + rare_music_data + //Filter map-specific tracks + for(var/datum/media/music_filtered as anything in music_tracks) + if(old_login_music_t && (music_filtered.path == old_login_music_t)) + old_login_music = music_filtered + if(music_filtered.map && music_filtered.map != SSmapping.config.map_name) + rare_music_data -= music_filtered + title_music_data -= music_filtered + //Remove the previous song if(old_login_music) - if(old_login_music["rare"] && (length(rare_music_data) > 1)) - rare_music_data -= list(old_login_music) + //Remove the old login music from the current pool if it wouldn't empty the pool. + if((MEDIA_TAG_LOBBYMUSIC_RARE in old_login_music.media_tags) && (length(rare_music_data) > 1)) + rare_music_data -= old_login_music else if(length(title_music_data) > 1) - title_music_data -= list(old_login_music) + title_music_data -= old_login_music //Try to set a song json var/use_rare_music = prob(10) @@ -755,26 +750,15 @@ SUBSYSTEM_DEF(ticker) if(!login_music) var/music = pick(world.file2list(ROUND_START_MUSIC_LIST, "\n")) var/list/split_path = splittext(music, "/") - login_music = list("name" = split_path[length(split_path)], "author" = null, "file" = music) + //Construct a minimal music track to satisfy the system. + login_music = new(name = split_path[length(split_path)], path = music) //Write the last round file to our current choice - rustg_file_write(json_encode(login_music), "data/last_round_lobby_music.json") + rustg_file_write(login_music.path, "data/last_round_lobby_music.txt") /datum/controller/subsystem/ticker/proc/pick_credits_music() - var/list/music_data = list() - var/list/rare_music_data = list() - - //Remove the previous song. - var/list/music_jsons = get_music_jsons(TRUE) - for(var/list/music_entry as anything in music_jsons) - //Find rare sounds that are map-agnostic or belong to our map - if(music_entry["rare"]) - if((!music_entry["map"] || (music_entry["map"] == SSmapping.config.map_name))) - rare_music_data += list(music_entry) - - //Filter out songs that don't belong to our map, add map-agnostic songs. - else if(!music_entry["map"] || music_entry["map"] == SSmapping.config.map_name) - music_data += list(music_entry) + var/list/music_data = SSmedia.get_track_pool(MEDIA_TAG_ROUNDEND_COMMON) + var/list/rare_music_data = SSmedia.get_track_pool(MEDIA_TAG_ROUNDEND_RARE) //Try to set a song json var/use_rare_music = prob(10) @@ -785,3 +769,69 @@ SUBSYSTEM_DEF(ticker) if(!credits_music) credits_music = login_music + +///Generate a list of gamemodes we can play. +/datum/controller/subsystem/ticker/proc/draft_gamemodes() + var/list/datum/game_mode/runnable_modes = list() + for(var/path in subtypesof(/datum/game_mode)) + var/datum/game_mode/M = new path() + if(!(M.weight == GAMEMODE_WEIGHT_NEVER) && !M.check_for_errors()) + runnable_modes[path] = M.weight + return runnable_modes + +/datum/controller/subsystem/ticker/proc/get_mode_name(bypass_secret) + if(!istype(mode)) + return "Undecided" + if(bypass_secret || !mode_display_name) + return mode.name + + return mode_display_name + +/datum/controller/subsystem/ticker/proc/initialize_gamemode() + if(!mode) + var/list/datum/game_mode/runnable_modes = draft_gamemodes() + if(!runnable_modes.len) + message_admins(world, "No viable gamemodes to play. Running Extended.") + mode = new /datum/game_mode/extended + else + mode = pick_weight(runnable_modes) + mode = new mode + + else + if(istype(mode, /datum/game_mode/extended) && GLOB.is_debug_server) + message_admins("Using Extended gamemode during debugging. Use Set Gamemode to change this.") + + var/potential_error = mode.check_for_errors() + if(potential_error) + if(mode_display_name) + message_admins(span_adminnotice("Unable to force secret [get_mode_name(TRUE)]. [potential_error]")) + to_chat(world, "Unable to choose playable game mode. Reverting to pre-game lobby.") + else + to_chat(world, "Unable to start [get_mode_name(TRUE)]. [potential_error] Reverting to pre-game lobby.") + + QDEL_NULL(mode) + SSjob.ResetOccupations() + return FALSE + + CHECK_TICK + //Configure mode and assign player to special mode stuff + var/can_continue = 0 + can_continue = src.mode.execute_roundstart() //Choose antagonists + CHECK_TICK + can_continue = can_continue && SSjob.DivideOccupations(mode.required_jobs) //Distribute jobs + CHECK_TICK + + if(!GLOB.Debug2) + if(!can_continue) + log_game("[get_mode_name(TRUE)] failed pre_setup, cause: [mode.setup_error].") + message_admins("[get_mode_name(TRUE)] failed pre_setup, cause: [mode.setup_error].") + to_chat(world, "Error setting up [get_mode_name(TRUE)]. Reverting to pre-game lobby.") + mode.on_failed_execute() + QDEL_NULL(mode) + SSjob.ResetOccupations() + return FALSE + else + message_admins(span_notice("DEBUG: Bypassing prestart checks...")) + + log_game("Gamemode successfully initialized, chose: [mode.name]") + return TRUE diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm index fc178bc53212..8f1ef68bebca 100644 --- a/code/controllers/subsystem/timer.dm +++ b/code/controllers/subsystem/timer.dm @@ -4,8 +4,6 @@ #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) (timer_ss.head_offset + TICKS2DS(BUCKET_LEN + timer_ss.practical_offset - 1)) -/// Max float with integer precision -#define TIMER_ID_MAX (2**24) /** * # Timer Subsystem @@ -373,8 +371,9 @@ SUBSYSTEM_DEF(timer) var/list/flags /// Time at which the timer was invoked or destroyed var/spent = 0 - /// An informative name generated for the timer as its representation in strings, useful for debugging - var/name + /// Holds info about this timer, stored from the moment it was created + /// Used to create a visible "name" whenever the timer is stringified + var/list/timer_info /// Next timed event in the bucket var/datum/timedevent/next /// Previous timed event in the bucket @@ -452,6 +451,21 @@ SUBSYSTEM_DEF(timer) prev = null return QDEL_HINT_IWILLGC +/datum/timedevent/proc/operator""() + if(!length(timer_info)) + return "Event not filled" + var/static/list/bitfield_flags = list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT", "TIMER_LOOP") +#if defined(TIMER_DEBUG) + var/list/callback_args = timer_info[10] + return "Timer: [timer_info[1]] ([ref(src)]), TTR: [timer_info[2]], wait:[timer_info[3]] Flags: [jointext(bitfield_to_list(timer_info[4], bitfield_flags), ", ")], \ + callBack: [ref(timer_info[5])], callBack.object: [timer_info[6]][timer_info[7]]([timer_info[8]]), \ + callBack.delegate:[timer_info[9]]([callback_args ? callback_args.Join(", ") : ""]), source: [timer_info[11]]" +#else + return "Timer: [timer_info[1]] ([ref(src)]), TTR: [timer_info[2]], wait:[timer_info[3]] Flags: [jointext(bitfield_to_list(timer_info[4], bitfield_flags), ", ")], \ + callBack: [ref(timer_info[5])], callBack.object: [timer_info[6]]([timer_info[7]]), \ + callBack.delegate:[timer_info[8]], source: [timer_info[9]]" +#endif + /** * Removes this timed event from any relevant buckets, or the secondary queue */ @@ -499,14 +513,38 @@ SUBSYSTEM_DEF(timer) * If the timed event is tracking client time, it will be added to a special bucket. */ /datum/timedevent/proc/bucketJoin() - // 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(bitfield_to_list(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]" +#if defined(TIMER_DEBUG) + // Generate debug-friendly list for timer, more complex but also more expensive + timer_info = list( + 1 = id, + 2 = timeToRun, + 3 = wait, + 4 = flags, + 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 6 = "[callBack.object]", + 7 = ref(callBack.object), + 8 = getcallingtype(), + 9 = callBack.delegate, + 10 = callBack.arguments ? callBack.arguments.Copy() : null, + 11 = "[source]" + ) +#else + // Generate a debuggable name for the timer, simpler but wayyyy cheaper, string generation is a bitch and this saves a LOT of time + timer_info = list( + 1 = id, + 2 = timeToRun, + 3 = wait, + 4 = flags, + 5 = callBack, /* Safe to hold this directly becasue it's never del'd */ + 6 = "[callBack.object]", + 7 = getcallingtype(), + 8 = callBack.delegate, + 9 = "[source]" + ) +#endif if (bucket_joined) - stack_trace("Bucket already joined! [name]") + stack_trace("Bucket already joined! [src]") // Check if this timed event should be diverted to the client time bucket, or the secondary queue var/list/L @@ -526,7 +564,7 @@ SUBSYSTEM_DEF(timer) if (bucket_pos < timer_subsystem.practical_offset && timeToRun < (timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN))) WARNING("Bucket pos in past: bucket_pos = [bucket_pos] < practical_offset = [timer_subsystem.practical_offset] \ - && timeToRun = [timeToRun] < [timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN)], Timer: [name]") + && timeToRun = [timeToRun] < [timer_subsystem.head_offset + TICKS2DS(BUCKET_LEN)], Timer: [src]") bucket_pos = timer_subsystem.practical_offset // Recover bucket_pos to avoid timer blocking queue var/datum/timedevent/bucket_head = bucket_list[bucket_pos] @@ -565,6 +603,7 @@ SUBSYSTEM_DEF(timer) * * 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 + * * timer_subsystem the subsystem to insert this timer into */ /proc/_addtimer(datum/callback/callback, wait = 0, flags = 0, datum/controller/subsystem/timer/timer_subsystem, file, line) if (!callback) @@ -657,4 +696,3 @@ SUBSYSTEM_DEF(timer) #undef BUCKET_LEN #undef BUCKET_POS #undef TIMER_MAX -#undef TIMER_ID_MAX diff --git a/code/controllers/subsystem/verb_manager.dm b/code/controllers/subsystem/verb_manager.dm new file mode 100644 index 000000000000..ea94880f32a0 --- /dev/null +++ b/code/controllers/subsystem/verb_manager.dm @@ -0,0 +1,173 @@ +/** + * SSverb_manager, a subsystem that runs every tick and runs through its entire queue without yielding like SSinput. + * this exists because of how the byond tick works and where user inputted verbs are put within it. + * + * see TICK_ORDER.md for more info on how the byond tick is structured. + * + * The way the MC allots its time is via TICK_LIMIT_RUNNING, it simply subtracts the cost of SendMaps (MAPTICK_LAST_INTERNAL_TICK_USAGE) + * plus TICK_BYOND_RESERVE from the tick and uses up to that amount of time (minus the percentage of the tick used by the time it executes subsystems) + * on subsystems running cool things like atmospherics or Life or SSInput or whatever. + * + * Without this subsystem, verbs are likely to cause overtime if the MC uses all of the time it has alloted for itself in the tick, and SendMaps + * uses as much as its expected to, and an expensive verb ends up executing that tick. This is because the MC is completely blind to the cost of + * verbs, it can't account for it at all. The only chance for verbs to not cause overtime in a tick where the MC used as much of the tick + * as it alloted itself and where SendMaps costed as much as it was expected to is if the verb(s) take less than TICK_BYOND_RESERVE percent of + * the tick, which isnt much. Not to mention if SendMaps takes more than 30% of the tick and the MC forces itself to take at least 70% of the + * normal tick duration which causes ticks to naturally overrun even in the absence of verbs. + * + * With this subsystem, the MC can account for the cost of verbs and thus stop major overruns of ticks. This means that the most important subsystems + * like SSinput can start at the same time they were supposed to, leading to a smoother experience for the player since ticks arent riddled with + * minor hangs over and over again. + */ +SUBSYSTEM_DEF(verb_manager) + name = "Verb Manager" + wait = 1 + flags = SS_TICKER | SS_HIBERNATE + priority = FIRE_PRIORITY_DELAYED_VERBS + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + + ///list of callbacks to procs called from verbs or verblike procs that were executed when the server was overloaded and had to delay to the next tick. + ///this list is ran through every tick, and the subsystem does not yield until this queue is finished. + var/list/datum/callback/verb_callback/verb_queue = list() + + ///running average of how many verb callbacks are executed every second. used for the stat entry + var/verbs_executed_per_second = 0 + + ///if TRUE we treat usr's with holders just like usr's without holders. otherwise they always execute immediately + var/can_queue_admin_verbs = FALSE + + ///if this is true all verbs immediately execute and dont queue. in case the mc is fucked or something + var/FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs = FALSE + + ///used for subtypes to determine if they use their own stats for the stat entry + var/use_default_stats = TRUE + + ///if TRUE this will... message admins every time a verb is queued to this subsystem for the next tick with stats. + ///for obvious reasons dont make this be TRUE on the code level this is for admins to turn on + var/message_admins_on_queue = FALSE + + ///always queue if possible. overides can_queue_admin_verbs but not FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs + var/always_queue = FALSE + +/datum/controller/subsystem/verb_manager/Initialize(start_timeofday) + . = ..() + hibernate_checks = list( + NAMEOF(src, verb_queue) + ) + +/** + * queue a callback for the given verb/verblike proc and any given arguments to the specified verb subsystem, so that they process in the next tick. + * intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() and co. + * + * returns TRUE if the queuing was successful, FALSE otherwise. + */ +/proc/_queue_verb(datum/callback/verb_callback/incoming_callback, tick_check, datum/controller/subsystem/verb_manager/subsystem_to_use = SSverb_manager, ...) + if(QDELETED(incoming_callback)) + var/destroyed_string + if(!incoming_callback) + destroyed_string = "callback is null." + else + destroyed_string = "callback was deleted [DS2TICKS(world.time - incoming_callback.gc_destroyed)] ticks ago. callback was created [DS2TICKS(world.time) - incoming_callback.creation_time] ticks ago." + + stack_trace("_queue_verb() returned false because it was given a deleted callback! [destroyed_string]") + return FALSE + + if(!istext(incoming_callback.object) && QDELETED(incoming_callback.object)) //just in case the object is GLOBAL_PROC + var/destroyed_string + if(!incoming_callback.object) + destroyed_string = "callback.object is null." + else + destroyed_string = "callback.object was deleted [DS2TICKS(world.time - incoming_callback.object.gc_destroyed)] ticks ago. callback was created [DS2TICKS(world.time) - incoming_callback.creation_time] ticks ago." + + stack_trace("_queue_verb() returned false because it was given a callback acting on a qdeleted object! [destroyed_string]") + return FALSE + + //we want unit tests to be able to directly call verbs that attempt to queue, and since unit tests should test internal behavior, we want the queue + //to happen as if it was actually from player input if its called on a mob. +#ifdef UNIT_TESTS + if(QDELETED(usr) && ismob(incoming_callback.object)) + incoming_callback.user = WEAKREF(incoming_callback.object) + var/datum/callback/new_us = CALLBACK(arglist(list(GLOBAL_PROC, GLOBAL_PROC_REF(_queue_verb)) + args.Copy())) + return world.push_usr(incoming_callback.object, new_us) + +#else + + if(QDELETED(usr) || isnull(usr.client)) + stack_trace("_queue_verb() returned false because it wasnt called from player input!") + return FALSE + +#endif + + if(!istype(subsystem_to_use)) + stack_trace("_queue_verb() returned false because it was given an invalid subsystem to queue for!") + return FALSE + + if((TICK_USAGE < tick_check) && !subsystem_to_use.always_queue) + return FALSE + + var/list/args_to_check = args.Copy() + args_to_check.Cut(2, 4)//cut out tick_check and subsystem_to_use + + //any subsystem can use the additional arguments to refuse queuing + if(!subsystem_to_use.can_queue_verb(arglist(args_to_check))) + return FALSE + + return subsystem_to_use.queue_verb(incoming_callback) + +/** + * subsystem-specific check for whether a callback can be queued. + * intended so that subsystem subtypes can verify whether + * + * subtypes may include additional arguments here if they need them! you just need to include them properly + * in TRY_QUEUE_VERB() and co. + */ +/datum/controller/subsystem/verb_manager/proc/can_queue_verb(datum/callback/verb_callback/incoming_callback) + if(always_queue && !FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs) + return TRUE + + if((usr.client?.holder && !can_queue_admin_verbs) \ + || (!initialized && !(flags & SS_NO_INIT)) \ + || FOR_ADMINS_IF_VERBS_FUCKED_immediately_execute_all_verbs \ + || !(runlevels & Master.current_runlevel)) + return FALSE + + return TRUE + +/** + * queue a callback for the given proc, so that it is invoked in the next tick. + * intended to only work with verbs or verblike procs called directly from client input, use as part of TRY_QUEUE_VERB() + * + * returns TRUE if the queuing was successful, FALSE otherwise. + */ +/datum/controller/subsystem/verb_manager/proc/queue_verb(datum/callback/verb_callback/incoming_callback) + . = FALSE //errored + if(message_admins_on_queue) + message_admins("[name] verb queuing: tick usage: [TICK_USAGE]%, proc: [incoming_callback.delegate], object: [incoming_callback.object], usr: [usr]") + verb_queue += incoming_callback + return TRUE + +/datum/controller/subsystem/verb_manager/fire(resumed) + run_verb_queue() + +/// runs through all of this subsystems queue of verb callbacks. +/// goes through the entire verb queue without yielding. +/// used so you can flush the queue outside of fire() without interfering with anything else subtype subsystems might do in fire(). +/datum/controller/subsystem/verb_manager/proc/run_verb_queue() + var/executed_verbs = 0 + + for(var/datum/callback/verb_callback/verb_callback as anything in verb_queue) + if(!istype(verb_callback)) + stack_trace("non /datum/callback/verb_callback inside [name]'s verb_queue!") + continue + + verb_callback.InvokeAsync() + executed_verbs++ + + verb_queue.Cut() + verbs_executed_per_second = MC_AVG_SECONDS(verbs_executed_per_second, executed_verbs, wait SECONDS) + //note that wait SECONDS is incorrect if this is called outside of fire() but because byond is garbage i need to add a timer to rustg to find a valid solution + +/datum/controller/subsystem/verb_manager/stat_entry(msg) + . = ..() + if(use_default_stats) + . += "V/S: [round(verbs_executed_per_second, 0.01)]" diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 58903c6786d4..ab18625b2fab 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -1,240 +1,154 @@ SUBSYSTEM_DEF(vote) name = "Vote" - wait = 10 + wait = 1 SECOND flags = SS_KEEP_TIMING|SS_NO_INIT runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT + priority = FIRE_PRIORITY_PING - var/list/choices = list() - var/list/choice_by_ckey = list() - var/list/datum/action/generated_actions = list() + /// The current active vote, if there is one + var/datum/vote/current_vote + /// Who or what started the vote, string var/initiator - var/mode - var/question + /// REALTIMEOFDAY start time var/started_time + /// Time remaining in DS var/time_remaining - var/list/voted = list() + + /// List of ckeys who have the vote menu open. var/list/voting = list() + /// A list of action datums to garbage collect when it's over + var/list/datum/action/generated_actions = list() + // Called by master_controller /datum/controller/subsystem/vote/fire() - if(!mode) + if(isnull(current_vote)) return - time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10) + + time_remaining = round((started_time + CONFIG_GET(number/vote_period) - REALTIMEOFDAY)/10) if(time_remaining < 0) - result() SStgui.close_uis(src) - reset() + finish_vote() /datum/controller/subsystem/vote/proc/reset() - choices.Cut() - choice_by_ckey.Cut() initiator = null - mode = null - question = null - time_remaining = 0 - voted.Cut() - voting.Cut() - + time_remaining = null + started_time = null + QDEL_NULL(current_vote) QDEL_LIST(generated_actions) -/datum/controller/subsystem/vote/proc/get_result() - //get the highest number of votes - var/greatest_votes = 0 - var/total_votes = 0 - for(var/option in choices) - var/votes = choices[option] - total_votes += votes - if(votes > greatest_votes) - greatest_votes = votes - //default-vote for everyone who didn't vote - if(!CONFIG_GET(flag/default_no_vote) && choices.len) - var/list/non_voters = GLOB.directory.Copy() - non_voters -= voted - for (var/non_voter_ckey in non_voters) - var/client/C = non_voters[non_voter_ckey] - if (!C || C.is_afk()) - non_voters -= non_voter_ckey - if(non_voters.len > 0) - if(mode == "restart") - choices["Continue Playing"] += non_voters.len - if(choices["Continue Playing"] >= greatest_votes) - greatest_votes = choices["Continue Playing"] - else if(mode == "map") - for (var/non_voter_ckey in non_voters) - var/client/C = non_voters[non_voter_ckey] - var/preferred_map = C.prefs.read_preference(/datum/preference/choiced/preferred_map) - if(isnull(global.config.defaultmap)) - continue - if(!preferred_map) - preferred_map = global.config.defaultmap.map_name - choices[preferred_map] += 1 - greatest_votes = max(greatest_votes, choices[preferred_map]) - . = list() - if(greatest_votes) - for(var/option in choices) - if(choices[option] == greatest_votes) - . += option - return . +/datum/controller/subsystem/vote/proc/finish_vote() + current_vote.tally_votes() + announce_result() + current_vote.after_completion() + reset() /datum/controller/subsystem/vote/proc/announce_result() - var/list/winners = get_result() var/text - if(winners.len > 0) - if(question) - text += "[question]" - else - text += "[capitalize(mode)] Vote" - for(var/i in 1 to choices.len) - var/votes = choices[choices[i]] - if(!votes) - votes = 0 - text += "\n[choices[i]]: [votes]" - if(mode != "custom") - if(winners.len > 1) + + if(current_vote.winners.len > 0) + text += "[capitalize(current_vote.name)] Vote" + + for(var/option in current_vote.options) + var/votes = current_vote.tally[option] || 0 + + text += "\n[option]: [votes]" + + if(!istype(current_vote, /datum/vote/custom)) + if(current_vote.winners.len > 1) text = "\nVote Tied Between:" - for(var/option in winners) + for(var/option in current_vote.winners) text += "\n\t[option]" - . = pick(winners) - text += "\nVote Result: [.]" + text += "\nVote Result: [current_vote.real_winner]" + else - text += "\nDid not vote: [GLOB.clients.len-voted.len]" + text += "\nDid not vote: [length(current_vote.non_voters)]" else text += "Vote Result: Inconclusive - No Votes!" + log_vote(text) to_chat(world, "\n[text]") - return . -/datum/controller/subsystem/vote/proc/result() - . = announce_result() - var/restart = FALSE - if(.) - switch(mode) - if("restart") - if(. == "Restart Round") - restart = TRUE - if("map") - SSmapping.changemap(global.config.maplist[.]) - SSmapping.map_voted = TRUE - //PARIAH EDIT ADDITION BEGIN - if("transfer") - if(. == "Initiate Crew Transfer") - SSshuttle.autoEnd() - var/obj/machinery/computer/communications/C = locate() in GLOB.machines - if(C) - C.post_status("shuttle") - //PARIAH EDIT ADDITION END - if(restart) - 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 = TRUE - break - if(!active_admins) - // No delay in case the restart is due to lag - SSticker.Reboot("Restart vote successful.", "restart vote", 1) - else - to_chat(world, span_boldannounce("Notice: Restart vote will not restart the server automatically because there are active admins on.")) - message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.") - - return . - -/datum/controller/subsystem/vote/proc/submit_vote(vote) - if(!mode) +/datum/controller/subsystem/vote/proc/submit_vote(user, vote) + if(!vote) return FALSE - if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder) - return FALSE - if(!vote || vote < 1 || vote > choices.len) - return FALSE - // If user has already voted, remove their specific vote - 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]]++ - return vote + + current_vote.try_vote(user, vote) /datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key) + if(!ispath(vote_type, /datum/vote)) + CRASH("Passed bad path into initiate_vote(): [vote_type]") + //Server is still intializing. if(!MC_RUNNING(init_stage)) to_chat(usr, span_warning("Cannot start vote, server is not done initializing.")) return FALSE - var/lower_admin = FALSE - var/ckey = ckey(initiator_key) - if(GLOB.admin_datums[ckey]) - lower_admin = TRUE - - if(!mode) - if(started_time) - var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) - if(mode) - to_chat(usr, span_warning("There is already a vote in progress! please wait for it to finish.")) - return FALSE - if(next_allowed_time > world.time && !lower_admin) - to_chat(usr, span_warning("A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!")) - return FALSE - - reset() - switch(vote_type) - if("restart") - choices.Add("Restart Round","Continue Playing") - if("map") - if(!lower_admin && SSmapping.map_voted) - to_chat(usr, span_warning("The next map has already been selected.")) - return FALSE - // Randomizes the list so it isn't always METASTATION - var/list/maps = list() - for(var/map in global.config.maplist) - var/datum/map_config/VM = config.maplist[map] - if(!VM.votable || (VM.map_name in SSpersistence.blocked_maps)) - continue - if (VM.config_min_users > 0 && GLOB.clients.len < VM.config_min_users) - continue - if (VM.config_max_users > 0 && GLOB.clients.len > VM.config_max_users) - continue - maps += VM.map_name - shuffle_inplace(maps) - for(var/valid_map in maps) - choices.Add(valid_map) - if("custom") - question = tgui_input_text(usr, "What is the vote for?", "Custom Vote") - if(!question) - return FALSE - for(var/i in 1 to 10) - var/option = tgui_input_text(usr, "Please enter an option or hit cancel to finish", "Options", max_length = MAX_NAME_LEN) - if(!option || mode || !usr.client) - break - choices.Add(capitalize(option)) - //PARIAH EDIT ADDITION BEGIN - AUTOTRANSFER - if("transfer") - choices.Add("Initiate Crew Transfer", "Continue Playing") - //PARIAH EDIT ADDITION END - AUTOTRANSFER - else - return FALSE - mode = vote_type - initiator = initiator_key - started_time = world.time - var/text = "[capitalize(mode)] vote started by [initiator || "CentCom"]." - if(mode == "custom") - 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.") - time_remaining = round(vp/10) - for(var/c in GLOB.clients) - var/client/C = c - var/datum/action/vote/V = new - V.Grant(C.mob) - if(question) - V.name = "Vote: [question]" - C.player_details.player_actions += V - generated_actions += V - if(C.prefs.toggles & SOUND_ANNOUNCEMENTS) - SEND_SOUND(C, sound('sound/misc/bloop.ogg')) - return TRUE - return FALSE + + var/is_admin_running = FALSE + if(GLOB.admin_datums[initiator_key] || initiator_key == "server") + is_admin_running = TRUE + + if(started_time) + var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) + if(current_vote) + to_chat(usr, span_warning("There is already a vote in progress! please wait for it to finish.")) + return FALSE + + if(next_allowed_time > world.time && !is_admin_running) + to_chat(usr, span_warning("A vote was initiated recently, you must wait [DisplayTimeText(next_allowed_time-world.time)] before a new vote can be started!")) + return FALSE + + var/datum/vote/new_vote = new vote_type() + + if(!istype(new_vote, /datum/vote/custom)) + if(!new_vote.can_run(is_admin_running)) + return FALSE + current_vote = new_vote + + else + if(!is_admin_running) + return FALSE + + var/question = tgui_input_text(usr, "What is the vote for?", "Custom Vote") + if(!question) + return FALSE + + new_vote.name = question + + for(var/i in 1 to 10) + var/option = tgui_input_text(usr, "Please enter an option or hit cancel to finish", "Options", max_length = MAX_NAME_LEN) + if(!option || current_vote || !usr.client) + break + + new_vote.options.Add(capitalize(option)) + + current_vote = new_vote + + initiator = initiator_key + started_time = REALTIMEOFDAY + + var/text = "[capitalize(current_vote.name)] vote started by [initiator || "CentCom"]." + + 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.") + + time_remaining = round(vp/10) + for(var/client/C in GLOB.clients) + var/datum/action/vote/V = new + V.Grant(C.mob) + V.name = "Vote: [current_vote.name]" + + C.player_details.player_actions += V + generated_actions += V + + if(C.prefs.toggles & SOUND_ANNOUNCEMENTS) + SEND_SOUND(C, sound('sound/misc/bloop.ogg')) + return TRUE + /mob/verb/vote() set category = "OOC" @@ -246,8 +160,9 @@ SUBSYSTEM_DEF(vote) /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 + if(user.client?.ckey) + voting |= user.client.ckey + ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Vote") @@ -259,9 +174,9 @@ SUBSYSTEM_DEF(vote) "allow_vote_restart" = CONFIG_GET(flag/allow_vote_restart), "choices" = list(), "lower_admin" = !!user.client?.holder, - "mode" = mode, - "question" = question, - "selected_choice" = choice_by_ckey[user.client?.ckey], + "mode" = current_vote?.name, + "question" = current_vote?.name, + "selected_choice" = current_vote?.voters[user.client?.ckey], "time_remaining" = time_remaining, "upper_admin" = check_rights_for(user.client, R_ADMIN), "voting" = list(), @@ -270,10 +185,10 @@ SUBSYSTEM_DEF(vote) if(!!user.client?.holder) data["voting"] = voting - for(var/key in choices) + for(var/option in current_vote?.options) data["choices"] += list(list( - "name" = key, - "votes" = choices[key] || 0 + "name" = option, + "votes" = current_vote.tally[option] || 0 )) return data @@ -294,28 +209,35 @@ SUBSYSTEM_DEF(vote) usr.log_message("[key_name_admin(usr)] cancelled a vote.", LOG_ADMIN) message_admins("[key_name_admin(usr)] has cancelled the current vote.") reset() + if("toggle_restart") if(usr.client.holder && upper_admin) CONFIG_SET(flag/allow_vote_restart, !CONFIG_GET(flag/allow_vote_restart)) + if("toggle_map") 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) - initiate_vote("restart",usr.key) + initiate_vote(/datum/vote/restart, usr.ckey) + if("map") if(CONFIG_GET(flag/allow_vote_map) || usr.client.holder) - initiate_vote("map",usr.key) + initiate_vote(/datum/vote/change_map, usr.ckey) + if("custom") if(usr.client.holder) - initiate_vote("custom",usr.key) + initiate_vote(/datum/vote/custom, usr.ckey) + //PARIAH EDIT ADDITION BEGIN - autotransfer if("transfer") if(check_rights(R_ADMIN)) - initiate_vote("transfer",usr.key) + initiate_vote(/datum/vote/crew_transfer, usr.ckey) + //PARIAH EDIT ADDITION END if("vote") - submit_vote(round(text2num(params["index"]))) + submit_vote(usr, round(text2num(params["index"]))) return TRUE /datum/controller/subsystem/vote/ui_close(mob/user) diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm index 61be86f6d959..63d374b7437a 100644 --- a/code/controllers/subsystem/weather.dm +++ b/code/controllers/subsystem/weather.dm @@ -3,7 +3,6 @@ #define WIND_DOWN_STAGE 3 #define END_STAGE 4 -//Used for all kinds of weather, ex. lavaland ash storms. SUBSYSTEM_DEF(weather) name = "Weather" flags = SS_BACKGROUND @@ -54,7 +53,7 @@ SUBSYSTEM_DEF(weather) LAZYINITLIST(eligible_zlevels["[z]"]) eligible_zlevels["[z]"][weather] = probability -/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels, telegraph = TRUE) +/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels, skip_telegraph) if (istext(weather_datum_type)) for (var/V in subtypesof(/datum/weather)) var/datum/weather/W = V @@ -72,10 +71,7 @@ SUBSYSTEM_DEF(weather) CRASH("run_weather called with invalid z_levels: [z_levels || "null"]") var/datum/weather/W = new weather_datum_type(z_levels) - if(telegraph) - W.telegraph() - else - W.start() + W.telegraph(skip_telegraph) /datum/controller/subsystem/weather/proc/make_eligible(z, possible_weather) eligible_zlevels[z] = possible_weather diff --git a/code/controllers/subsystem/zas.dm b/code/controllers/subsystem/zas.dm index d1ef2dcba419..21665efa555b 100644 --- a/code/controllers/subsystem/zas.dm +++ b/code/controllers/subsystem/zas.dm @@ -82,8 +82,6 @@ SUBSYSTEM_DEF(zas) //A reference to the global var var/datum/xgm_gas_data/gas_data - var/datum/gas_mixture/lavaland_atmos - ///A global cache of unsimulated gas mixture singletons, associative by type. var/list/unsimulated_gas_cache = list() @@ -95,7 +93,6 @@ SUBSYSTEM_DEF(zas) //Geometry updates lists var/list/tiles_to_update = list() var/list/zones_to_update = list() - var/list/active_fire_zones = list() var/list/active_hotspots = list() var/list/active_edges = list() var/list/zones_with_sensitive_contents = list() @@ -147,7 +144,6 @@ SUBSYSTEM_DEF(zas) edges.Cut() tiles_to_update.Cut() zones_to_update.Cut() - active_fire_zones.Cut() active_hotspots.Cut() active_edges.Cut() @@ -164,7 +160,6 @@ SUBSYSTEM_DEF(zas) else msg += "TtU: [length(tiles_to_update)] " msg += "ZtU: [length(zones_to_update)] " - msg += "AFZ: [length(active_fire_zones)] " msg += "AH: [length(active_hotspots)] " msg += "AE: [length(active_edges)]" return ..() @@ -175,7 +170,7 @@ SUBSYSTEM_DEF(zas) settings = zas_settings gas_data = xgm_gas_data - to_chat(world, span_boldannounce("ZAS: Processing Geometry...")) + to_chat(world, span_debug("ZAS: Processing Geometry...")) var/simulated_turf_count = 0 @@ -188,20 +183,17 @@ SUBSYSTEM_DEF(zas) CHECK_TICK - ///LAVALAND SETUP - fuck_lavaland() - - to_chat(world, span_boldannounce("ZAS:\n - Total Simulated Turfs: [simulated_turf_count]\n - Total Zones: [zones.len]\n - Total Edges: [edges.len]\n - Total Active Edges: [active_edges.len ? "[active_edges.len]" : "None"]\n - Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) + to_chat(world, span_debug("ZAS:\n - Total Simulated Turfs: [simulated_turf_count]\n - Total Zones: [zones.len]\n - Total Edges: [edges.len]\n - Total Active Edges: [active_edges.len ? "[active_edges.len]" : "None"]\n - Total Unsimulated Turfs: [world.maxx*world.maxy*world.maxz - simulated_turf_count]")) - to_chat(world, span_boldannounce("ZAS: Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_debug("ZAS: Geometry processing completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) if (simulate) - to_chat(world, span_boldannounce("ZAS: Firing once...")) + to_chat(world, span_debug("ZAS: Firing once...")) starttime = REALTIMEOFDAY fire(FALSE, TRUE) - to_chat(world, span_boldannounce("ZAS: Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) + to_chat(world, span_debug("ZAS: Air settling completed in [(REALTIMEOFDAY - starttime)/10] seconds!")) ..(timeofday) @@ -209,14 +201,12 @@ SUBSYSTEM_DEF(zas) var/timer = TICK_USAGE_REAL if (!resumed) processing_edges = active_edges.Copy() - processing_fires = active_fire_zones.Copy() processing_hotspots = active_hotspots.Copy() processing_exposure = zones_with_sensitive_contents.Copy() var/list/curr_tiles = tiles_to_update var/list/curr_defer = deferred var/list/curr_edges = processing_edges - var/list/curr_fire = processing_fires var/list/curr_hotspot = processing_hotspots var/list/curr_zones = zones_to_update var/list/curr_zones_again = zones_to_update.Copy() @@ -335,24 +325,6 @@ SUBSYSTEM_DEF(zas) cached_cost += TICK_USAGE_REAL - timer cost_edges = MC_AVERAGE(cost_edges, TICK_DELTA_TO_MS(cached_cost)) -//////////FIRES////////// - last_process = "ZONE FIRES" - timer = TICK_USAGE_REAL - cached_cost = 0 - while (curr_fire.len) - var/zone/Z = curr_fire[curr_fire.len] - curr_fire.len-- - - Z.process_fire() - - if (no_mc_tick) - CHECK_TICK - else if (MC_TICK_CHECK) - return - - cached_cost += TICK_USAGE_REAL - timer - cost_fires= MC_AVERAGE(cost_fires, TICK_DELTA_TO_MS(cached_cost)) - //////////HOTSPOTS////////// last_process = "HOTSPOTS" timer = TICK_USAGE_REAL @@ -423,8 +395,6 @@ SUBSYSTEM_DEF(zas) zones -= z zones_to_update -= z zones_with_sensitive_contents -= z - if (processing_zones) - processing_zones -= z ///Checks to see if air can flow between A and B. /datum/controller/subsystem/zas/proc/air_blocked(turf/A, turf/B) @@ -555,15 +525,15 @@ SUBSYSTEM_DEF(zas) E.excited = TRUE ///Returns the edge between zones A and B. If one doesn't exist, it creates one. See header for more information -/datum/controller/subsystem/zas/proc/get_edge(zone/A, datum/B) +/datum/controller/subsystem/zas/proc/get_edge(zone/A, zone/B) //Note: B can also be a turf. var/connection_edge/edge - if(B.type == /zone) //Zone-to-zone connection - edge = A.edges[B] - else //Zone-to-turf connection + if(isturf(B)) //Zone-to-turf connection. for(var/turf/T in A.edges) - if(B:air ~= T.air) //Operator overloading :) + if(B.air.isEqual(T.air)) //Operator overloading :) return A.edges[T] + else + edge = A.edges[B] //Zone-to-zone connection edge ||= create_edge(A,B) @@ -588,81 +558,10 @@ SUBSYSTEM_DEF(zas) if(processing_edges) processing_edges -= E -///Randomizes the lavaland gas mixture, and sets all lavaland unsimmed turfs to it. -/datum/controller/subsystem/zas/proc/fuck_lavaland() - var/list/restricted_gases = list() - ///No funny gasses allowed - for(var/gas in xgm_gas_data.gases) - if(xgm_gas_data.flags[gas] & (XGM_GAS_CONTAMINANT|XGM_GAS_FUEL|XGM_GAS_OXIDIZER)) - restricted_gases |= gas - - var/list/viable_gases = xgm_gas_data.gases - restricted_gases - GAS_XENON //TODO: add XGM_GAS_DANGEROUS - var/datum/gas_mixture/mix_real = new - var/list/mix_list = list() - var/num_gases = rand(1, 3) - var/list/chosen_gases = list() - var/target_pressure = rand(HAZARD_LOW_PRESSURE + 10, LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1) - var/temp = rand(BODYTEMP_COLD_DAMAGE_LIMIT + 1, 350) - var/pressure_scalar = target_pressure / (LAVALAND_EQUIPMENT_EFFECT_PRESSURE - 1) - - ///Choose our gases - for(var/iter in 1 to num_gases) - chosen_gases += pick_n_take(viable_gases) - - mix_real.gas = chosen_gases - - //Add a spice of Radon - for(var/gas in mix_real.gas) - mix_real.gas[gas] = 1 //So update values doesn't cull it - - //Radon sci - if(!(GAS_RADON in chosen_gases)) - chosen_gases += GAS_RADON - mix_real.gas[GAS_RADON] = 5 - num_gases++ - - mix_real.temperature = temp - - ///This is where the fun begins... - var/amount - var/gastype - while(mix_real.returnPressure() < target_pressure) - gastype = pick(chosen_gases) - - amount = rand(5,10) - amount *= rand(50, 200) / 100 - amount *= pressure_scalar - amount = CEILING(amount, 0.1) - - mix_real.gas[gastype] += amount - AIR_UPDATE_VALUES(mix_real) - - while(mix_real.returnPressure() > target_pressure) - mix_real.gas[gastype] -= mix_real.gas[gastype] * 0.1 - AIR_UPDATE_VALUES(mix_real) - - mix_real.gas[gastype] = FLOOR(mix_real.gas[gastype], 0.1) - - for(var/gas_id in mix_real.gas) - mix_list[gas_id] = mix_real.gas[gas_id] - - var/list/lavaland_z_levels = SSmapping.levels_by_trait(ZTRAIT_MINING) //God I hope this is never more than one - var/list/lavaland_areas = typecacheof(list(/area/lavaland, /area/icemoon)) - lavaland_areas[/area/mine] = TRUE - lavaland_areas[/area/mine/explored] = TRUE - - for(var/zlev in lavaland_z_levels) - for(var/turf/T as anything in block(locate(1,1,zlev), locate(world.maxx, world.maxy, zlev))) - if(!T.simulated && lavaland_areas[T.loc]) - T.initial_gas = mix_list - T.temperature = mix_real.temperature - T.make_air() - CHECK_TICK - - lavaland_atmos = mix_real - to_chat(world, span_boldannounce("ZAS: Lavaland contains [num_gases] [num_gases > 1? "gases" : "gas"], with a pressure of [mix_real.returnPressure()] kpa.")) +/datum/controller/subsystem/zas/StartLoadingMap() + . = ..() + can_fire = FALSE - var/log = "Lavaland atmos contains: " - for(var/gas in mix_real.gas) - log += "[mix_real.gas[gas]], " - log_game(log) +/datum/controller/subsystem/zas/StopLoadingMap() + . = ..() + can_fire = TRUE diff --git a/code/controllers/subsystem/zcopy.dm b/code/controllers/subsystem/zcopy.dm index fa4c3675e5c0..fc9607c2edba 100644 --- a/code/controllers/subsystem/zcopy.dm +++ b/code/controllers/subsystem/zcopy.dm @@ -11,8 +11,9 @@ SUBSYSTEM_DEF(zcopy) name = "Z-Copy" - wait = 1 + wait = 0 init_order = INIT_ORDER_ZMIMIC + flags = SS_HIBERNATE runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY var/list/queued_turfs = list() @@ -143,6 +144,11 @@ SUBSYSTEM_DEF(zcopy) return jointext(zmx, ", ") /datum/controller/subsystem/zcopy/Initialize(timeofday) + hibernate_checks = list( + NAMEOF(src, queued_turfs), + NAMEOF(src, queued_overlays) + ) + calculate_zstack_limits() // Flush the queue. fire(FALSE, TRUE) @@ -300,7 +306,7 @@ SUBSYSTEM_DEF(zcopy) TO.mouse_opacity = initial(TO.mouse_opacity) TO.underlays = underlay_copy - T.queue_ao(T.ao_neighbors_mimic == null) // If ao_neighbors hasn't been set yet, we need to do a rebuild + T.queue_ao(T.ao_junction_mimic == null) // If ao_junction hasn't been set yet, we need to do a rebuild // Explicitly copy turf delegates so they show up properly on below levels. // I think it's possible to get this to work without discrete delegate copy objects, but I'd rather this just work. @@ -318,7 +324,7 @@ SUBSYSTEM_DEF(zcopy) // Handle below atoms. - if (below_turf.lighting_object && !(below_turf.loc:area_has_base_lighting || below_turf.always_lit)) + if (below_turf.lighting_object && !(below_turf.loc.luminosity || below_turf.always_lit)) T.shadower.copy_lighting(below_turf.lighting_object) // Add everything below us to the update queue. @@ -331,6 +337,15 @@ SUBSYSTEM_DEF(zcopy) object.bound_overlay = new(T) object.bound_overlay.associated_atom = object + if(length(object.hud_list)) + object.bound_overlay.copy_huds(object) + + #ifdef ZMIMIC_MULTIZ_SPEECH + //This typecheck permits 1 Z-level of hearing + if(!istype(object, /atom/movable/openspace/mimic) && HAS_TRAIT(object, TRAIT_HEARING_SENSITIVE)) + object.bound_overlay.become_hearing_sensitive() + #endif + var/override_depth var/original_type = object.type var/original_z = object.z @@ -430,7 +445,7 @@ SUBSYSTEM_DEF(zcopy) // Actually update the overlay. if (OO.dir != OO.associated_atom.dir) - OO.setDir(OO.associated_atom.dir) + OO.dir = OO.associated_atom.dir if (OO.particles != OO.associated_atom.particles) OO.particles = OO.associated_atom.particles @@ -440,6 +455,7 @@ SUBSYSTEM_DEF(zcopy) OO.plane = ZMIMIC_MAX_PLANE - OO.depth OO.opacity = FALSE + OO.glide_size = initial(OO.glide_size) OO.queued = 0 // If an atom has explicit plane sets on its overlays/underlays, we need to replace the appearance so they can be mangled to work with our planing. @@ -601,10 +617,10 @@ SUBSYSTEM_DEF(zcopy) GLOBAL_REAL_VAR(zmimic_fixed_planes) = list( "0" = "World plane (Non-Z)", - "-6" = "Game plane (Non-Z)", - "-7" = "Floor plane (Non-Z)", - "-11" = "Gravity pulse plane (Non-Z)", - "-12" = "Heat plane (Non-Z)" + STRINGIFY(GAME_PLANE) = "Game plane (Non-Z)", + STRINGIFY(FLOOR_PLANE) = "Floor plane (Non-Z)", + STRINGIFY(GRAVITY_PULSE_PLANE) = "Gravity pulse plane (Non-Z)", + STRINGIFY(HEAT_PLANE) = "Heat plane (Non-Z)" ) /client/proc/analyze_openturf(turf/T) @@ -672,7 +688,7 @@ GLOBAL_REAL_VAR(zmimic_fixed_planes) = list( found_oo += D temp_objects += D - sortTim(found_oo, /proc/cmp_zm_render_order) + sortTim(found_oo, GLOBAL_PROC_REF(cmp_zm_render_order)) var/list/atoms_list_list = list() for (var/thing in found_oo) diff --git a/code/datums/achievements/boss_achievements.dm b/code/datums/achievements/boss_achievements.dm deleted file mode 100644 index f58f25664f34..000000000000 --- a/code/datums/achievements/boss_achievements.dm +++ /dev/null @@ -1,135 +0,0 @@ -/datum/award/achievement/boss - category = "Bosses" - -/datum/award/achievement/boss/tendril_exterminator - name = "Tendril Exterminator" - desc = "Watch your step" - database_id = BOSS_MEDAL_TENDRIL - icon = "tendril" - -/datum/award/achievement/boss/boss_killer - name = "Boss Killer" - desc = "You've come a long ways from asking how to switch hands." - database_id = "Boss Killer" - icon = "firstboss" - -/datum/award/achievement/boss/blood_miner_kill - name = "Blood-Drunk Miner Killer" - desc = "I guess he couldn't handle his drink that well." - database_id = BOSS_MEDAL_MINER - icon = "miner" - -/datum/award/achievement/boss/demonic_miner_kill - name = "Demonic-Frost Miner Killer" - desc = "Definitely harder than the Blood-Drunk Miner." - database_id = BOSS_MEDAL_FROSTMINER - icon = "frostminer" - -/datum/award/achievement/boss/bubblegum_kill - name = "Bubblegum Killer" - desc = "I guess he wasn't made of candy after all" - database_id = BOSS_MEDAL_BUBBLEGUM - icon = "bbgum" - -/datum/award/achievement/boss/colossus_kill - name = "Colossus Killer" - desc = "The bigger they are... the better the loot" - database_id = BOSS_MEDAL_COLOSSUS - icon = "colossus" - -/datum/award/achievement/boss/drake_kill - name = "Drake Killer" - desc = "Now I can wear Rune Platebodies!" - database_id = BOSS_MEDAL_DRAKE - icon = "drake" - -/datum/award/achievement/boss/hierophant_kill - name = "Hierophant Killer" - desc = "Hierophant, but not triumphant." - database_id = BOSS_MEDAL_HIEROPHANT - icon = "hierophant" - -/datum/award/achievement/boss/legion_kill - name = "Legion Killer" - desc = "We were many..now we are none." - database_id = BOSS_MEDAL_LEGION - icon = "legion" - -/datum/award/achievement/boss/swarmer_beacon_kill - name = "Swarm Beacon Killer" - desc = "GET THEM OFF OF ME!" - database_id = BOSS_MEDAL_SWARMERS - icon = "swarmer" - -/datum/award/achievement/boss/wendigo_kill - name = "Wendigo Killer" - desc = "You've now ruined years of mythical storytelling." - database_id = BOSS_MEDAL_WENDIGO - icon = "wendigo" - -/datum/award/achievement/boss/blood_miner_crusher - name = "Blood-Drunk Miner Crusher" - desc = "I guess he couldn't handle his drink that well." - database_id = BOSS_MEDAL_MINER_CRUSHER - icon = "miner" - -/datum/award/achievement/boss/demonic_miner_crusher - name = "Demonic-Frost Miner Crusher" - desc = "Definitely harder than the Blood-Drunk Miner." - database_id = BOSS_MEDAL_FROSTMINER_CRUSHER - icon = "frostminer" - -/datum/award/achievement/boss/bubblegum_crusher - name = "Bubblegum Crusher" - desc = "I guess he wasn't made of candy after all" - database_id = BOSS_MEDAL_BUBBLEGUM_CRUSHER - icon = "bbgum" - -/datum/award/achievement/boss/colossus_crusher - name = "Colossus Crusher" - desc = "The bigger they are... the better the loot" - database_id = BOSS_MEDAL_COLOSSUS_CRUSHER - icon = "colossus" - -/datum/award/achievement/boss/drake_crusher - name = "Drake Crusher" - desc = "Now I can wear Rune Platebodies!" - database_id = BOSS_MEDAL_DRAKE_CRUSHER - icon = "drake" - -/datum/award/achievement/boss/hierophant_crusher - name = "Hierophant Crusher" - desc = "Hierophant, but not triumphant." - database_id = BOSS_MEDAL_HIEROPHANT_CRUSHER - icon = "hierophant" - -/datum/award/achievement/boss/legion_crusher - name = "Legion Crusher" - desc = "We were many... now we are none." - database_id = BOSS_MEDAL_LEGION_CRUSHER - icon = "legion" - -/datum/award/achievement/boss/swarmer_beacon_crusher - name = "Swarm Beacon Crusher" - desc = "GET THEM OFF OF ME!" - database_id = BOSS_MEDAL_SWARMERS_CRUSHER - icon = "swarmer" - -/datum/award/achievement/boss/wendigo_crusher - name = "Wendigo Crusher" - desc = "You've now ruined years of mythical storytelling." - database_id = BOSS_MEDAL_WENDIGO_CRUSHER - icon = "wendigo" - -//should be removed soon -/datum/award/achievement/boss/king_goat_kill - name = "King Goat Killer" - desc = "The king is dead, long live the king!" - database_id = BOSS_MEDAL_KINGGOAT - icon = "goatboss" - -/datum/award/achievement/boss/king_goat_crusher - name = "King Goat Crusher" - desc = "The king is dead, long live the king!" - database_id = BOSS_MEDAL_KINGGOAT_CRUSHER - icon = "goatboss" diff --git a/code/datums/achievements/boss_scores.dm b/code/datums/achievements/boss_scores.dm deleted file mode 100644 index fdb9efa7c7d9..000000000000 --- a/code/datums/achievements/boss_scores.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/award/score/tendril_score - name = "Tendril Score" - desc = "Watch your step" - database_id = TENDRIL_CLEAR_SCORE - -/datum/award/score/boss_score - name = "Bosses Killed" - desc = "You've killed HOW many?" - database_id = BOSS_SCORE - -/datum/award/score/blood_miner_score - name = "Blood-Drunk Miners Killed" - desc = "You've killed HOW many?" - database_id = MINER_SCORE - -/datum/award/score/demonic_miner_score - name = "Demonic-Frost Miners Killed" - desc = "You've killed HOW many?" - database_id = FROST_MINER_SCORE - -/datum/award/score/bubblegum_score - name = "Bubblegums Killed" - desc = "You've killed HOW many?" - database_id = BUBBLEGUM_SCORE - -/datum/award/score/colussus_score - name = "Colossus Killed" - desc = "You've killed HOW many?" - database_id = COLOSSUS_SCORE - -/datum/award/score/drake_score - name = "Drakes Killed" - desc = "You've killed HOW many?" - database_id = DRAKE_SCORE - -/datum/award/score/hierophant_score - name = "Hierophants Killed" - desc = "You've killed HOW many?" - database_id = HIEROPHANT_SCORE - -/datum/award/score/legion_score - name = "Legions Killed" - desc = "You've killed HOW many?" - database_id = LEGION_SCORE - -/datum/award/score/swarmer_beacon_score - name = "Swarmer Beacons Killed" - desc = "You've killed HOW many?" - database_id = SWARMER_BEACON_SCORE - -/datum/award/score/wendigo_score - name = "Wendigos Killed" - desc = "You've killed HOW many?" - database_id = WENDIGO_SCORE diff --git a/code/datums/achievements/job_achievements.dm b/code/datums/achievements/job_achievements.dm index 2bcc1ff91ced..bba958400064 100644 --- a/code/datums/achievements/job_achievements.dm +++ b/code/datums/achievements/job_achievements.dm @@ -2,14 +2,6 @@ /datum/award/achievement/jobs category = "Jobs" -//chemistry - -/datum/award/achievement/jobs/chemistry_tut - name = "Perfect chemistry blossom" - desc = "Passed the chemistry tutorial with perfect purity!" - database_id = MEDAL_CHEM_TUT - icon = "chem_tut" - //all of service! hip hip! /datum/award/achievement/jobs/service_bad diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 1c3a9598065c..c416a64fe707 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -8,200 +8,20 @@ database_id = MEDAL_METEOR icon = "meteors" -/datum/award/achievement/misc/pulse - name = "Jackpot" - desc = "Win a pulse rifle from an arcade machine" - database_id = MEDAL_PULSE - icon = "jackpot" - /datum/award/achievement/misc/time_waste name = "Time waster" desc = "Speak no evil, hear no evil, see just errors" database_id = MEDAL_TIMEWASTE icon = "timewaste" -/datum/award/achievement/misc/feat_of_strength - name = "Feat of Strength" - desc = "If the rod is immovable, is it passing you or are you passing it?" - database_id = MEDAL_RODSUPLEX - icon = "featofstrength" - -/datum/award/achievement/misc/round_and_full - name = "Round and Full" - desc = "Well at least you aren't down the river, I hear they eat people there." - database_id = MEDAL_CLOWNCARKING - icon = "clownking" - -/datum/award/achievement/misc/the_best_driver - name = "The Best Driver" - desc = "100 honks later" - database_id = MEDAL_THANKSALOT - icon = "clownthanks" - -/datum/award/achievement/misc/helbitaljanken - name = "Helbitaljanken" - desc = "You janked hard" - database_id = MEDAL_HELBITALJANKEN - icon = "helbital" - -/datum/award/achievement/misc/getting_an_upgrade - name = "Getting an upgrade" - desc = "Make your first unique material item!" - database_id = MEDAL_MATERIALCRAFT - icon = "upgrade" - -/datum/award/achievement/misc/rocket_holdup - name = "Disk, Please!" - desc = "Is the man currently pointing a loaded rocket launcher at your head point blank really dumb enough to pull the trigger? Do you really want to find out?" - database_id = MEDAL_DISKPLEASE - icon = "rocket_holdup" - -/datum/award/achievement/misc/gamer - name = "My Watchlist Status is Not Important" - desc = "You may be under the impression that violent video games are a harmless pastime, but the security and medical personnel swarming your location with batons and knockout gas look like they disagree." - database_id = MEDAL_GAMER - -/datum/award/achievement/misc/vendor_squish - name = "I Was a Teenage Anarchist" - desc = "You were doing a great job sticking it to the system until that vending machine decided to fight back." - database_id = MEDAL_VENDORSQUISH - -/datum/award/achievement/misc/swirlie - name = "A Bowl-d New World" - desc = "There's a lot of grisly ways to kick it on the Spinward Periphery, but drowning to death in a toilet probably wasn't what you had in mind. Probably." - database_id = MEDAL_SWIRLIE - -/datum/award/achievement/misc/selfouch - name = "How Do I Switch Hands???" - desc = "If you saw someone casually club themselves upside the head with a toolbox anywhere in the galaxy but here, you'd probably be pretty concerned for them." - database_id = MEDAL_SELFOUCH - -/datum/award/achievement/misc/sandman - name = "Mister Sandman" - desc = "Mechanically speaking, there's no real benefit to being unconscious during surgery. Weird how insistent this doctor is about using the N2O anyway though, huh?" - database_id = MEDAL_SANDMAN - -/datum/award/achievement/misc/cleanboss - name = "One Lean, Mean, Cleaning Machine" - desc = "How does it feel to know that your workplace values a mop bucket on wheels more than you?" // i can do better than this give me time - database_id = MEDAL_CLEANBOSS - -/datum/award/achievement/misc/rule8 - name = "Rule 8" - desc = "Call an admin this is ILLEGAL!!" - database_id = MEDAL_RULE8 - icon = "rule8" - -/datum/award/achievement/misc/speed_round - name = "Long shift" - desc = "Well, that didn't take long." - database_id = MEDAL_LONGSHIFT - icon = "longshift" - -/datum/award/achievement/misc/snail - name = "KKKiiilll mmmeee" - desc = "You were a little too ambitious, but hey, I guess you're still alive?" - database_id = MEDAL_SNAIL - icon = "snail" - /datum/award/achievement/misc/lookoutsir name = "Look Out, Sir!" desc = "Either awarded for making the ultimate sacrifice for your comrades, or a really dumb attempt at grenade jumping." database_id = MEDAL_LOOKOUTSIR icon = "martyr" // purple heart on an explosive danger warning sign (well, sort of) -/datum/award/achievement/misc/gottem - name = "HA, GOTTEM" - desc = "Made you look!" - database_id = MEDAL_GOTTEM - icon = "gottem" - -/datum/award/achievement/misc/ascension - name = "Ascension" - desc = "Caedite eos. Novit enim Dominus qui sunt eius." - database_id = MEDAL_ASCENSION - icon = "ascension" - -/datum/award/achievement/misc/frenching - name = "Frenching" - desc = "Just a taste, for science!" - database_id = MEDAL_FRENCHING - icon = "frenchingthebubble" - -/datum/award/achievement/misc/ash_ascension - name = "Nightwatcher's Eyes" - desc = "You've risen above the flames, became one with the ashes. You've been reborn as one with the Nightwatcher." - database_id = MEDAL_ASH_ASCENSION - icon = "ashascend" - -/datum/award/achievement/misc/flesh_ascension - name = "Vortex of Arms" - desc = "You've became something more, something greater. A piece of the emperor resides within you, and you within him." - database_id = MEDAL_FLESH_ASCENSION - icon = "fleshascend" - -/datum/award/achievement/misc/rust_ascension - name = "Hills of Rust" - desc = "You've summoned a piece of the Hill of rust, and so the Hills welcome you." - database_id = MEDAL_RUST_ASCENSION - icon = "rustascend" - -/datum/award/achievement/misc/void_ascension - name = "All that perish" - desc = "Place of a different being, different time. Everything ends there... but maybe it is just the beginning?" - database_id = MEDAL_VOID_ASCENSION - icon = "voidascend" - -/datum/award/achievement/misc/blade_ascension - name = "Silver and Steel" - desc = "You've become the master of all duellists - the paragon of blades." - database_id = MEDAL_BLADE_ASCENSION - icon = "bladeascend" - -/datum/award/achievement/misc/toolbox_soul - name = "SOUL'd Out" - desc = "My eternal soul was destroyed to make a toolbox look funny and all I got was this achievement..." - database_id = MEDAL_TOOLBOX_SOUL - icon = "toolbox_soul" - -/datum/award/achievement/misc/hot_damn - name = "Hot Damn!" - desc = "Sometimes you need to make some noise to make a point." - database_id = MEDAL_HOT_DAMN - icon = "hotdamn" - -/datum/award/achievement/misc/cayenne_disk - name = "Very Important Piscis" - desc = "You can rest well now." - database_id = MEDAL_CAYENNE_DISK - icon = "cayenne_disk" - -/datum/award/achievement/misc/tram_surfer - name = "Tram Surfer" - desc = "Lights out, guerilla radio!" - database_id = MEDAL_TRAM_SURFER - icon = "tram_surfer" - -/datum/award/achievement/misc/cult_shuttle_omfg - name = "WHAT JUST HAPPENED" - desc = "As a blood cultist, be part of a team that summons 3 shuttle curses within 10 seconds. Imagine cleaning up after them, g r o s s!" - database_id = MEDAL_CULT_SHUTTLE_OMFG - icon = "cult_shuttle_omfg" - /datum/award/achievement/misc/clickbait name = "Clickbait" desc = "Where's my free smartphone?!?" database_id = MEDAL_CLICKBAIT icon = "bait" - -/datum/award/achievement/misc/narsupreme - name = "If Nar'Sie is so good, why isn't there a..." - desc = "Even interdimensional space deitys need a friend." - database_id = MEDAL_NARSUPREME - icon = "narsupreme" - -/datum/award/achievement/misc/springlock - name = "The Man Inside the MODsuit" - desc = "Ignore the warning label on a springlock MODsuit." - database_id = MEDAL_SPRINGLOCK - icon = "springlock" diff --git a/code/datums/achievements/skill_achievements.dm b/code/datums/achievements/skill_achievements.dm deleted file mode 100644 index 128b35a6a4ea..000000000000 --- a/code/datums/achievements/skill_achievements.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/award/achievement/skill - category = "Skills" - -/datum/award/achievement/skill/legendary_miner - name = "Legendary miner" - desc = "No mere rock can stop me!" - database_id = MEDAL_LEGENDARY_MINER - icon = "mining" - diff --git a/code/datums/actions/action.dm b/code/datums/actions/action.dm index 9f427ca4f7ca..4124f4747870 100644 --- a/code/datums/actions/action.dm +++ b/code/datums/actions/action.dm @@ -151,21 +151,21 @@ return FALSE if((check_flags & AB_CHECK_HANDS_BLOCKED) && HAS_TRAIT(owner, TRAIT_HANDS_BLOCKED)) if (feedback) - owner.balloon_alert(owner, "hands blocked!") + to_chat(owner, span_warning("You cannot use [name] without hands!")) return FALSE if((check_flags & AB_CHECK_IMMOBILE) && HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) if (feedback) - owner.balloon_alert(owner, "can't move!") + to_chat(owner, span_warning("You cannot use [name] while immobilized!")) return FALSE if((check_flags & AB_CHECK_LYING) && isliving(owner)) var/mob/living/action_owner = owner if(action_owner.body_position == LYING_DOWN) if (feedback) - owner.balloon_alert(owner, "must stand up!") + to_chat(owner, span_warning("You cannot use [name] while lying down!")) return FALSE if((check_flags & AB_CHECK_CONSCIOUS) && owner.stat != CONSCIOUS) if (feedback) - owner.balloon_alert(owner, "unconscious!") + to_chat(owner, span_warning("You cannot use [name] while unconscious!")) return FALSE return TRUE @@ -311,7 +311,7 @@ var/atom/movable/screen/movable/action_button/button = create_button() SetId(button, viewer) - button.our_hud = our_hud + button.hud = our_hud viewers[our_hud] = button if(viewer.client) viewer.client.screen += button diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm index f04000f64a7d..4daa9d435b94 100644 --- a/code/datums/actions/cooldown_action.dm +++ b/code/datums/actions/cooldown_action.dm @@ -5,6 +5,9 @@ check_flags = NONE transparent_when_unavailable = FALSE + /// If TRUE, will log action usage to the owner's action log. + var/write_log = FALSE + /// The actual next time this ability can be used var/next_use_time = 0 /// The stat panel this action shows up in the stat panel in. If null, will not show up. @@ -102,7 +105,7 @@ return ..() /datum/action/cooldown/is_action_active(atom/movable/screen/movable/action_button/current_button) - return click_to_activate && current_button.our_hud?.mymob?.click_intercept == src + return click_to_activate && current_button.hud?.mymob?.click_intercept == src /datum/action/cooldown/Destroy() QDEL_LIST(initialized_actions) @@ -216,13 +219,20 @@ /// Intercepts client owner clicks to activate the ability /datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target) - if(!IsAvailable(feedback = TRUE)) - return FALSE - if(!target) - return FALSE + . = TRUE + if(istext(params)) + params = params2list(params) + + if(params?[RIGHT_CLICK]) + unset_click_ability(caller, TRUE) + return + + if(!target || !IsAvailable(feedback = TRUE)) + return + // The actual action begins here if(!PreActivate(target)) - return FALSE + return TRUE // And if we reach here, the action was complete successfully if(unset_after_click) @@ -235,13 +245,21 @@ /datum/action/cooldown/proc/PreActivate(atom/target) if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) return + + if(!is_valid_target(target)) + return + // Note, that PreActivate handles no cooldowns at all by default. // Be sure to call StartCooldown() in Activate() where necessary. . = Activate(target) + // There is a possibility our action (or owner) is qdeleted in Activate(). if(!QDELETED(src) && !QDELETED(owner)) SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_FINISHED, src) + if(owner?.ckey) + owner.log_message("used action [name][target != owner ? " on / at [target]":""].", LOG_ATTACK) + /// To be implemented by subtypes (if not generic) /datum/action/cooldown/proc/Activate(atom/target) var/total_delay = 0 @@ -251,6 +269,7 @@ addtimer(CALLBACK(ability, PROC_REF(Activate), target), total_delay) total_delay += initialized_actions[ability] StartCooldown() + return TRUE /// Cancels melee attacks if they are on cooldown. /datum/action/cooldown/proc/handle_melee_attack(mob/source, mob/target) @@ -330,3 +349,13 @@ SEND_SIGNAL(src, COMSIG_ACTION_SET_STATPANEL, stat_panel_data) return stat_panel_data + +/** + * Check if the target we're casting on is a valid target. + * For no-target (self cast) actions, the target being checked (cast_on) is the caster. + * For click_to_activate actions, the target being checked is the clicked atom. + * + * Return TRUE if cast_on is valid, FALSE otherwise + */ +/datum/action/cooldown/proc/is_valid_target(atom/cast_on) + return TRUE diff --git a/code/datums/actions/innate_action.dm b/code/datums/actions/innate_action.dm index 422ec8ad56f2..0a6692d836c7 100644 --- a/code/datums/actions/innate_action.dm +++ b/code/datums/actions/innate_action.dm @@ -72,7 +72,7 @@ if(!clicked_on) return FALSE - return do_ability(caller, clicked_on) + return do_ability(caller, clicked_on, params2list(params)) /// Actually goes through and does the click ability /datum/action/innate/proc/do_ability(mob/living/caller, atom/clicked_on) diff --git a/code/datums/actions/items/berserk.dm b/code/datums/actions/items/berserk.dm deleted file mode 100644 index a8fab0ce794b..000000000000 --- a/code/datums/actions/items/berserk.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/action/item_action/berserk_mode - name = "Berserk" - desc = "Increase your movement and melee speed while also increasing your melee armor for a short amount of time." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "berserk_mode" - background_icon_state = "bg_demon" - -/datum/action/item_action/berserk_mode/Trigger(trigger_flags) - if(istype(target, /obj/item/clothing/head/hooded/berserker)) - var/obj/item/clothing/head/hooded/berserker/berzerk = target - if(berzerk.berserk_active) - to_chat(owner, span_warning("You are already berserk!")) - return - if(berzerk.berserk_charge < 100) - to_chat(owner, span_warning("You don't have a full charge.")) - return - berzerk.berserk_mode(owner) - return - return ..() diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index 956238ae1667..3ad839fd73a1 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -98,3 +98,6 @@ background_icon = 'icons/mob/actions/actions_items.dmi' background_icon_state = "storage_gather_switch" overlay_icon_state = "bg_tech_border" + +/datum/action/item_action/call_link + name = "Call MODlink" diff --git a/code/datums/actions/items/vortex_recall.dm b/code/datums/actions/items/vortex_recall.dm deleted file mode 100644 index 50702933f1d4..000000000000 --- a/code/datums/actions/items/vortex_recall.dm +++ /dev/null @@ -1,15 +0,0 @@ -/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." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "vortex_recall" - -/datum/action/item_action/vortex_recall/IsAvailable(feedback = FALSE) - var/area/current_area = get_area(target) - if(!current_area || current_area.area_flags & NOTELEPORT) - return FALSE - if(istype(target, /obj/item/hierophant_club)) - var/obj/item/hierophant_club/teleport_stick = target - if(teleport_stick.teleporting) - return FALSE - return ..() diff --git a/code/datums/actions/mobs/charge.dm b/code/datums/actions/mobs/charge.dm index fe82e6de4fd6..b638084d4360 100644 --- a/code/datums/actions/mobs/charge.dm +++ b/code/datums/actions/mobs/charge.dm @@ -114,7 +114,7 @@ var/turf/target_turf = get_turf(charge_target) if(!target_turf) return - new /obj/effect/temp_visual/dragon_swoop/bubblegum(target_turf) + new /obj/effect/temp_visual/dragon_swoop(target_turf) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(charger.loc, charger) animate(D, alpha = 0, color = "#FF0000", transform = matrix()*2, time = 3) @@ -141,10 +141,11 @@ continue if(next_turf.Adjacent(charger) && (iswallturf(next_turf) || ismineralturf(next_turf))) if(!isanimal(charger)) - SSexplosions.medturf += next_turf + EX_ACT(next_turf, EXPLODE_HEAVY) continue next_turf.attack_animal(charger) continue + for(var/obj/object in next_turf.contents) if(!object.Adjacent(charger)) continue @@ -153,7 +154,7 @@ if(!object.density || object.IsObscured()) continue if(!isanimal(charger)) - SSexplosions.med_mov_atom += target + EX_ACT(object, EXPLODE_HEAVY) break object.attack_animal(charger) break @@ -163,9 +164,9 @@ if(owner == target) return if(isturf(target)) - SSexplosions.medturf += target - if(isobj(target) && target.density) - SSexplosions.med_mov_atom += target + EX_ACT(target, EXPLODE_HEAVY) + else if(isobj(target) && target.density) + EX_ACT(target, EXPLODE_HEAVY) INVOKE_ASYNC(src, PROC_REF(DestroySurroundings), source) hit_target(source, target, charge_damage) @@ -225,75 +226,15 @@ for(var/i in 0 to 2) do_charge(owner, target_atom, charge_delay - 2 * i, charge_past) -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge - name = "Hallucination Charge" - button_icon = 'icons/effects/bubblegum.dmi' - button_icon_state = "smack ya one" - desc = "Allows you to create hallucinations that charge around your target." - cooldown_time = 2 SECONDS - charge_delay = 0.6 SECONDS - /// The damage the hallucinations in our charge do - var/hallucination_damage = 15 - /// Check to see if we are enraged, enraged ability does more - var/enraged = FALSE - /// Check to see if we should spawn blood - var/spawn_blood = FALSE - -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/charge_sequence(atom/movable/charger, atom/target_atom, delay, past) - if(!enraged) - hallucination_charge(target_atom, 6, 8, 0, 6, TRUE) - StartCooldown(cooldown_time * 0.5) - return - for(var/i in 0 to 2) - hallucination_charge(target_atom, 4, 9 - 2 * i, 0, 4, TRUE) - for(var/i in 0 to 2) - do_charge(owner, target_atom, charge_delay - 2 * i, charge_past) - -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/do_charge(atom/movable/charger, atom/target_atom, delay, past) - . = ..() - if(charger != owner) - qdel(charger) - -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/proc/hallucination_charge(atom/target_atom, clone_amount, delay, past, radius, use_self) - var/starting_angle = rand(1, 360) - if(!radius) - return - var/angle_difference = 360 / clone_amount - var/self_placed = FALSE - for(var/i = 1 to clone_amount) - var/angle = (starting_angle + angle_difference * i) - var/turf/place = locate(target_atom.x + cos(angle) * radius, target_atom.y + sin(angle) * radius, target_atom.z) - if(!place) - continue - if(use_self && !self_placed) - owner.forceMove(place) - self_placed = TRUE - continue - var/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/our_clone = new /mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination(place) - our_clone.appearance = owner.appearance - our_clone.name = "[owner]'s hallucination" - our_clone.alpha = 127.5 - our_clone.move_through_mob = owner - our_clone.spawn_blood = spawn_blood - INVOKE_ASYNC(src, PROC_REF(do_charge), our_clone, target_atom, delay, past) - if(use_self) - do_charge(owner, target_atom, delay, past) - -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hit_target(atom/movable/source, atom/A, damage_dealt) - var/applied_damage = charge_damage - if(source != owner) - applied_damage = hallucination_damage - . = ..(source, A, applied_damage) - -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_surround - name = "Surround Target" - button_icon = 'icons/turf/walls/legacy/wall.dmi' - button_icon_state = "wall-0" - desc = "Allows you to create hallucinations that charge around your target." - charge_delay = 0.6 SECONDS - charge_past = 2 +/obj/effect/temp_visual/dragon_swoop + name = "certain death" + desc = "Don't just stand there, move!" + icon = 'icons/effects/96x96.dmi' + icon_state = "landing" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + pixel_x = -32 + pixel_y = -32 + color = "#FF0000" + duration = 10 -/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_surround/charge_sequence(atom/movable/charger, atom/target_atom, delay, past) - for(var/i in 0 to 4) - hallucination_charge(target_atom, 2, 8, 2, 2, FALSE) - do_charge(owner, target_atom, charge_delay, charge_past) diff --git a/code/datums/actions/mobs/fire_breath.dm b/code/datums/actions/mobs/fire_breath.dm deleted file mode 100644 index b5c1ea57cc9e..000000000000 --- a/code/datums/actions/mobs/fire_breath.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/action/cooldown/mob_cooldown/fire_breath - name = "Fire Breath" - button_icon = 'icons/obj/wizard.dmi' - button_icon_state = "fireball" - desc = "Allows you to shoot fire towards a target." - cooldown_time = 3 SECONDS - /// The range of the fire - var/fire_range = 15 - /// The sound played when you use this ability - var/fire_sound = 'sound/magic/fireball.ogg' - /// If the fire should be icey fire - var/ice_breath = FALSE - -/datum/action/cooldown/mob_cooldown/fire_breath/Activate(atom/target_atom) - StartCooldown(10 SECONDS) - attack_sequence(target_atom) - StartCooldown() - -/datum/action/cooldown/mob_cooldown/fire_breath/proc/attack_sequence(atom/target) - playsound(owner.loc, fire_sound, 200, TRUE) - fire_line(target, 0) - -/datum/action/cooldown/mob_cooldown/fire_breath/proc/fire_line(atom/target, offset) - SLEEP_CHECK_DEATH(0, owner) - var/list/turfs = line_target(offset, fire_range, target) - dragon_fire_line(owner, turfs, ice_breath) - -/datum/action/cooldown/mob_cooldown/fire_breath/proc/line_target(offset, range, atom/target) - if(!target) - return - var/turf/T = get_ranged_target_turf_direct(owner, target, range, offset) - return (get_line(owner, T) - get_turf(owner)) - -/datum/action/cooldown/mob_cooldown/fire_breath/cone - name = "Fire Cone" - desc = "Allows you to shoot fire towards a target with surrounding lines of fire." - /// The angles relative to the target that shoot lines of fire - var/list/angles = list(-40, 0, 40) - -/datum/action/cooldown/mob_cooldown/fire_breath/cone/attack_sequence(atom/target) - playsound(owner.loc, fire_sound, 200, TRUE) - for(var/offset in angles) - INVOKE_ASYNC(src, PROC_REF(fire_line), target, offset) - -/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire - name = "Mass Fire" - button_icon = 'icons/effects/fire.dmi' - button_icon_state = "1" - desc = "Allows you to shoot fire in all directions." - cooldown_time = 3 SECONDS - -/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/attack_sequence(atom/target) - shoot_mass_fire(target, 12, 2.5 SECONDS, 3) - -/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/proc/shoot_mass_fire(atom/target, spiral_count, delay_time, times) - SLEEP_CHECK_DEATH(0, owner) - for(var/i = 1 to times) - playsound(owner.loc, fire_sound, 200, TRUE) - var/increment = 360 / spiral_count - for(var/j = 1 to spiral_count) - INVOKE_ASYNC(src, PROC_REF(fire_line), target, j * increment + i * increment / 2) - SLEEP_CHECK_DEATH(delay_time, owner) - diff --git a/code/datums/actions/mobs/language_menu.dm b/code/datums/actions/mobs/language_menu.dm deleted file mode 100644 index 50702933f1d4..000000000000 --- a/code/datums/actions/mobs/language_menu.dm +++ /dev/null @@ -1,15 +0,0 @@ -/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." - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "vortex_recall" - -/datum/action/item_action/vortex_recall/IsAvailable(feedback = FALSE) - var/area/current_area = get_area(target) - if(!current_area || current_area.area_flags & NOTELEPORT) - return FALSE - if(istype(target, /obj/item/hierophant_club)) - var/obj/item/hierophant_club/teleport_stick = target - if(teleport_stick.teleporting) - return FALSE - return ..() diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm deleted file mode 100644 index fe57b303a34f..000000000000 --- a/code/datums/actions/mobs/lava_swoop.dm +++ /dev/null @@ -1,239 +0,0 @@ -#define SWOOP_HEIGHT 270 //how high up swoops go, in pixels -#define SWOOP_DIRECTION_CHANGE_RANGE 5 //the range our x has to be within to not change the direction we slam from - -/datum/action/cooldown/mob_cooldown/lava_swoop - name = "Lava Swoop" - button_icon = 'icons/effects/effects.dmi' - button_icon_state = "lavastaff_warn" - desc = "Allows you to chase a target while raining lava down." - cooldown_time = 4 SECONDS - /// Check to see if we are enraged - var/enraged = FALSE - /// Check if we are currently swooping - var/swooping = FALSE - -/datum/action/cooldown/mob_cooldown/lava_swoop/Grant(mob/M) - . = ..() - ADD_TRAIT(M, TRAIT_LAVA_IMMUNE, src) - ADD_TRAIT(M, TRAIT_NOFIRE, src) - -/datum/action/cooldown/mob_cooldown/lava_swoop/Remove(mob/M) - . = ..() - REMOVE_TRAIT(M, TRAIT_LAVA_IMMUNE, src) - REMOVE_TRAIT(M, TRAIT_NOFIRE, src) - -/datum/action/cooldown/mob_cooldown/lava_swoop/Activate(atom/target_atom) - StartCooldown(30 SECONDS) - attack_sequence(target_atom) - StartCooldown() - -/datum/action/cooldown/mob_cooldown/lava_swoop/proc/attack_sequence(atom/target) - if(enraged) - swoop_attack(target, TRUE) - return - INVOKE_ASYNC(src, PROC_REF(lava_pools), target) - swoop_attack(target) - -/datum/action/cooldown/mob_cooldown/lava_swoop/proc/swoop_attack(atom/target, lava_arena = FALSE) - if(swooping || !target) - return - // stop swooped target movement - swooping = TRUE - owner.set_density(FALSE) - owner.visible_message(span_boldwarning("[owner] swoops up high!")) - - var/negative - var/initial_x = owner.x - if(target.x < initial_x) //if the target's x is lower than ours, swoop to the left - negative = TRUE - else if(target.x > initial_x) - negative = FALSE - else if(target.x == initial_x) //if their x is the same, pick a direction - negative = prob(50) - var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(owner.loc, negative) - - negative = !negative //invert it for the swoop down later - - var/oldtransform = owner.transform - owner.alpha = 255 - animate(owner, alpha = 204, transform = matrix()*0.9, time = 3, easing = BOUNCE_EASING) - for(var/i in 1 to 3) - sleep(1) - if(QDELETED(owner) || owner.stat == DEAD) //we got hit and died, rip us - qdel(F) - if(owner.stat == DEAD) - swooping = FALSE - animate(owner, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately - return - animate(owner, alpha = 100, transform = matrix()*0.7, time = 7) - owner.status_flags |= GODMODE - SEND_SIGNAL(owner, COMSIG_SWOOP_INVULNERABILITY_STARTED) - - owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT - SLEEP_CHECK_DEATH(7, owner) - - while(target && owner.loc != get_turf(target)) - owner.forceMove(get_step(owner, get_dir(owner, target))) - SLEEP_CHECK_DEATH(0.5, owner) - - // Ash drake flies onto its target and rains fire down upon them - var/descentTime = 10 - var/lava_success = TRUE - if(lava_arena) - lava_success = lava_arena(target) - - - //ensure swoop direction continuity. - if(negative) - if(ISINRANGE(owner.x, initial_x + 1, initial_x + SWOOP_DIRECTION_CHANGE_RANGE)) - negative = FALSE - else - if(ISINRANGE(owner.x, initial_x - SWOOP_DIRECTION_CHANGE_RANGE, initial_x - 1)) - negative = TRUE - new /obj/effect/temp_visual/dragon_flight/end(owner.loc, negative) - new /obj/effect/temp_visual/dragon_swoop(owner.loc) - animate(owner, alpha = 255, transform = oldtransform, descentTime) - SLEEP_CHECK_DEATH(descentTime, owner) - owner.mouse_opacity = initial(owner.mouse_opacity) - playsound(owner.loc, 'sound/effects/meteorimpact.ogg', 200, TRUE) - for(var/mob/living/L in orange(1, owner) - owner) - if(L.stat) - owner.visible_message(span_warning("[owner] slams down on [L], crushing [L.p_them()]!")) - L.gib() - else - L.adjustBruteLoss(75) - if(L && !QDELETED(L)) // Some mobs are deleted on death - var/throw_dir = get_dir(owner, L) - if(L.loc == owner.loc) - throw_dir = pick(GLOB.alldirs) - var/throwtarget = get_edge_target_turf(owner, throw_dir) - L.throw_at(throwtarget, 3) - owner.visible_message(span_warning("[L] is thrown clear of [owner]!")) - for(var/obj/vehicle/sealed/mecha/M in orange(1, owner)) - M.take_damage(75, BRUTE, MELEE, 1) - - for(var/mob/M in range(7, owner)) - shake_camera(M, 15, 1) - - owner.set_density(TRUE) - SLEEP_CHECK_DEATH(1, owner) - swooping = FALSE - if(!lava_success) - SEND_SIGNAL(owner, COMSIG_LAVA_ARENA_FAILED) - owner.status_flags &= ~GODMODE - -/datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_pools(atom/target, amount = 30, delay = 0.8) - if(!target) - return - target.visible_message(span_boldwarning("Lava starts to pool up around you!")) - - while(amount > 0) - if(QDELETED(target)) - break - var/turf/TT = get_turf(target) - var/turf/T = pick(RANGE_TURFS(1,TT)) - var/obj/effect/temp_visual/lava_warning/LW = new /obj/effect/temp_visual/lava_warning(T, 60) // longer reset time for the lava - LW.owner = owner - amount-- - SLEEP_CHECK_DEATH(delay, owner) - -/datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_arena(atom/target) - if(!target || !isliving(target)) - return - target.visible_message(span_boldwarning("[owner] encases you in an arena of fire!")) - var/amount = 3 - var/turf/center = get_turf(owner) - var/list/walled = RANGE_TURFS(3, center) - RANGE_TURFS(2, center) - var/list/drakewalls = list() - for(var/turf/T 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)) - if(istype(T, /turf/open/indestructible)) - continue - if(!istype(T, /turf/closed/indestructible)) - T.ChangeTurf(/turf/open/misc/asteroid/basalt/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) - else - indestructible_turfs += T - SLEEP_CHECK_DEATH(1 SECONDS, owner) // give them a bit of time to realize what attack is actually happening - - var/list/turfs = RANGE_TURFS(2, center) - var/list/mobs_with_clients = list() - 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 = FALSE - for(var/turf/T 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 - any_attack = TRUE - mobs_with_clients |= L - for(var/obj/vehicle/sealed/mecha/M in T.contents) - empty += pick(((RANGE_TURFS(2, M) - RANGE_TURFS(1, M)) & turfs) - empty) - any_attack = TRUE - if(!any_attack) // nothing to attack in the arena, time for enraged attack if we still have a cliented target. - for(var/obj/effect/temp_visual/drakewall/D in drakewalls) - qdel(D) - for(var/a in mobs_with_clients) - var/mob/living/L = a - if(!QDELETED(L) && L.client) - return FALSE - return TRUE - for(var/turf/T in turfs) - if(!(T in empty)) - new /obj/effect/temp_visual/lava_warning(T) - else if(!istype(T, /turf/closed/indestructible)) - new /obj/effect/temp_visual/lava_safe(T) - amount-- - SLEEP_CHECK_DEATH(2.4 SECONDS, owner) - return TRUE // attack finished completely - -/obj/effect/temp_visual/dragon_swoop - name = "certain death" - desc = "Don't just stand there, move!" - icon = 'icons/effects/96x96.dmi' - icon_state = "landing" - layer = BELOW_MOB_LAYER - pixel_x = -32 - pixel_y = -32 - color = "#FF0000" - duration = 10 - -/obj/effect/temp_visual/dragon_flight - icon = 'icons/mob/lavaland/64x64megafauna.dmi' - icon_state = "dragon" - layer = ABOVE_ALL_MOB_LAYER - pixel_x = -16 - duration = 10 - randomdir = FALSE - -/obj/effect/temp_visual/dragon_flight/Initialize(mapload, negative) - . = ..() - INVOKE_ASYNC(src, PROC_REF(flight), negative) - -/obj/effect/temp_visual/dragon_flight/proc/flight(negative) - if(negative) - animate(src, pixel_x = -SWOOP_HEIGHT*0.1, pixel_z = SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) - else - animate(src, pixel_x = SWOOP_HEIGHT*0.1, pixel_z = SWOOP_HEIGHT*0.15, time = 3, easing = BOUNCE_EASING) - sleep(3) - icon_state = "swoop" - if(negative) - animate(src, pixel_x = -SWOOP_HEIGHT, pixel_z = SWOOP_HEIGHT, time = 7) - else - animate(src, pixel_x = SWOOP_HEIGHT, pixel_z = SWOOP_HEIGHT, time = 7) - -/obj/effect/temp_visual/dragon_flight/end - pixel_x = SWOOP_HEIGHT - pixel_z = SWOOP_HEIGHT - duration = 10 - -/obj/effect/temp_visual/dragon_flight/end/flight(negative) - if(negative) - pixel_x = -SWOOP_HEIGHT - animate(src, pixel_x = -16, pixel_z = 0, time = 5) - else - animate(src, pixel_x = -16, pixel_z = 0, time = 5) - -#undef SWOOP_HEIGHT -#undef SWOOP_DIRECTION_CHANGE_RANGE diff --git a/code/datums/actions/mobs/meteors.dm b/code/datums/actions/mobs/meteors.dm deleted file mode 100644 index 1fb61cf1175b..000000000000 --- a/code/datums/actions/mobs/meteors.dm +++ /dev/null @@ -1,21 +0,0 @@ -/datum/action/cooldown/mob_cooldown/meteors - name = "Meteors" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - desc = "Allows you to rain meteors down around yourself." - cooldown_time = 3 SECONDS - shared_cooldown = MOB_SHARED_COOLDOWN_1 - -/datum/action/cooldown/mob_cooldown/meteors/Activate(atom/target_atom) - StartCooldown(10 SECONDS) - create_meteors(target_atom) - StartCooldown() - -/datum/action/cooldown/mob_cooldown/meteors/proc/create_meteors(atom/target) - if(!target) - return - target.visible_message(span_boldwarning("Fire rains from the sky!")) - var/turf/targetturf = get_turf(target) - for(var/turf/turf as anything in RANGE_TURFS(9,targetturf)) - if(prob(11)) - new /obj/effect/temp_visual/target(turf) diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index e225fde8597c..6950027c5740 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -66,7 +66,7 @@ button_icon_state = "kineticgun" desc = "Fires projectiles repeatedly at a given target." cooldown_time = 1.5 SECONDS - projectile_type = /obj/projectile/colossus/snowball + projectile_type = /obj/projectile/bullet/honker default_projectile_spread = 45 /// Total shot count var/shot_count = 60 @@ -84,12 +84,12 @@ button_icon_state = "sniper_zoom" desc = "Fires projectiles that will split into shrapnel after a period of time." cooldown_time = 6 SECONDS - projectile_type = /obj/projectile/colossus/frost_orb + projectile_type = /obj/projectile/bullet/honker has_homing = TRUE default_projectile_spread = 180 shot_count = 8 shot_delay = 1 SECONDS - var/shrapnel_projectile_type = /obj/projectile/colossus/ice_blast + var/shrapnel_projectile_type = /obj/projectile/bullet/honker var/shrapnel_angles = list(0, 60, 120, 180, 240, 300) var/shrapnel_spread = 10 var/break_time = 2 SECONDS @@ -114,7 +114,7 @@ button_icon_state = "sniper_zoom" desc = "Fires projectiles in a spiral pattern." cooldown_time = 3 SECONDS - projectile_type = /obj/projectile/colossus + projectile_type = /obj/projectile/bullet/honker projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' /// Whether or not the attack is the enraged form var/enraged = FALSE @@ -148,7 +148,7 @@ button_icon_state = "at_shield2" desc = "Fires projectiles in all directions." cooldown_time = 3 SECONDS - projectile_type = /obj/projectile/colossus + projectile_type = /obj/projectile/bullet/honker projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/attack_sequence(mob/living/firer, atom/target) @@ -163,7 +163,7 @@ button_icon_state = "shotgun" desc = "Fires projectiles in a shotgun pattern." cooldown_time = 2 SECONDS - projectile_type = /obj/projectile/colossus + projectile_type = /obj/projectile/bullet/honker projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' var/list/shot_angles = list(12.5, 7.5, 2.5, -2.5, -7.5, -12.5) @@ -183,7 +183,7 @@ /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/pattern name = "Alternating Shotgun Fire" desc = "Fires projectiles in an alternating shotgun pattern." - projectile_type = /obj/projectile/colossus/ice_blast + projectile_type = /obj/projectile/bullet/honker projectile_sound = null shot_angles = list(list(-40, -20, 0, 20, 40), list(-30, -10, 10, 30)) var/shot_count = 5 @@ -200,7 +200,7 @@ button_icon_state = "pistol" desc = "Fires projectiles in specific directions." cooldown_time = 4 SECONDS - projectile_type = /obj/projectile/colossus + projectile_type = /obj/projectile/bullet/honker projectile_sound = 'sound/magic/clockwork/invoke_general.ogg' var/list/firing_directions @@ -234,19 +234,3 @@ fire_in_directions(firer, target, GLOB.diagonals) SLEEP_CHECK_DEATH(1 SECONDS, firer) fire_in_directions(firer, target, GLOB.cardinals) - -/datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator - name = "Fire Kinetic Accelerator" - button_icon = 'icons/obj/guns/energy.dmi' - button_icon_state = "kineticgun" - desc = "Fires a kinetic accelerator projectile at the target." - cooldown_time = 1.5 SECONDS - projectile_type = /obj/projectile/kinetic/miner - projectile_sound = 'sound/weapons/kenetic_accel.ogg' - -/datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator/Activate(atom/target_atom) - . = ..() - playsound(owner, projectile_sound, 200, TRUE, 2) - owner.visible_message(span_danger("[owner] fires the proto-kinetic accelerator!")) - owner.face_atom(target_atom) - new /obj/effect/temp_visual/dir_setting/firing_effect(owner.loc, owner.dir) diff --git a/code/datums/actions/mobs/small_sprite.dm b/code/datums/actions/mobs/small_sprite.dm deleted file mode 100644 index 369fdd7b92bd..000000000000 --- a/code/datums/actions/mobs/small_sprite.dm +++ /dev/null @@ -1,54 +0,0 @@ -//Small sprites -/datum/action/small_sprite - name = "Toggle Giant Sprite" - desc = "Others will always see you as giant." - button_icon = 'icons/mob/actions/actions_xeno.dmi' - button_icon_state = "smallqueen" - background_icon_state = "bg_alien" - var/small = FALSE - var/small_icon - var/small_icon_state - -/datum/action/small_sprite/queen - small_icon = 'icons/mob/alien.dmi' - small_icon_state = "alienq" - -/datum/action/small_sprite/megafauna - button_icon = 'icons/mob/actions/actions_xeno.dmi' - small_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - -/datum/action/small_sprite/megafauna/drake - small_icon_state = "ash_whelp" - -/datum/action/small_sprite/megafauna/colossus - small_icon_state = "Basilisk" - -/datum/action/small_sprite/megafauna/bubblegum - small_icon_state = "goliath2" - -/datum/action/small_sprite/megafauna/legion - small_icon_state = "mega_legion" - -/datum/action/small_sprite/mega_arachnid - small_icon = 'icons/mob/jungle/arachnid.dmi' - small_icon_state = "arachnid_mini" - background_icon_state = "bg_demon" - -/datum/action/small_sprite/space_dragon - small_icon = 'icons/mob/carp.dmi' - small_icon_state = "carp" - button_icon = 'icons/mob/carp.dmi' - button_icon_state = "carp" - -/datum/action/small_sprite/Trigger(trigger_flags) - ..() - if(!small) - var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) - I.override = TRUE - I.pixel_x -= owner.pixel_x - I.pixel_y -= owner.pixel_y - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic, "smallsprite", I, AA_TARGET_SEE_APPEARANCE | AA_MATCH_TARGET_OVERLAYS) - small = TRUE - else - owner.remove_alt_appearance("smallsprite") - small = FALSE diff --git a/code/datums/actions/mobs/transform_weapon.dm b/code/datums/actions/mobs/transform_weapon.dm deleted file mode 100644 index e1e135979a9d..000000000000 --- a/code/datums/actions/mobs/transform_weapon.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/action/cooldown/mob_cooldown/transform_weapon - name = "Transform Weapon" - button_icon = 'icons/obj/lavaland/artefacts.dmi' - button_icon_state = "cleaving_saw" - desc = "Transform weapon into a different state." - cooldown_time = 5 SECONDS - shared_cooldown = MOB_SHARED_COOLDOWN_2 - /// The max possible cooldown, cooldown is random between the default cooldown time and this - var/max_cooldown_time = 10 SECONDS - -/datum/action/cooldown/mob_cooldown/transform_weapon/Activate(atom/target_atom) - StartCooldown(100) - do_transform(target_atom) - StartCooldown(rand(cooldown_time, max_cooldown_time)) - -/datum/action/cooldown/mob_cooldown/transform_weapon/proc/do_transform(atom/target) - if(!istype(owner, /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner)) - return - var/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/BDM = owner - var/obj/item/melee/cleaving_saw/miner/miner_saw = BDM.miner_saw - miner_saw.attack_self(owner) - if(!miner_saw.is_open) - BDM.rapid_melee = 5 // 4 deci cooldown before changes, npcpool subsystem wait is 20, 20/4 = 5 - else - BDM.rapid_melee = 3 // same thing but halved (slightly rounded up) - BDM.icon_state = "miner[miner_saw.is_open ? "_transformed":""]" - BDM.icon_living = "miner[miner_saw.is_open ? "_transformed":""]" diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 1e0f3c8d55d6..e58f3a466e26 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -22,7 +22,7 @@ multiple modular subtrees with behaviors ///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 + var/consecutive_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 diff --git a/code/datums/ai/basic_mobs/base_basic_controller.dm b/code/datums/ai/basic_mobs/base_basic_controller.dm index ad50572c39f7..4a1a2eca4c48 100644 --- a/code/datums/ai/basic_mobs/base_basic_controller.dm +++ b/code/datums/ai/basic_mobs/base_basic_controller.dm @@ -23,4 +23,4 @@ /datum/ai_controller/basic_controller/proc/update_speed(mob/living/basic/basic_mob) SIGNAL_HANDLER - movement_delay = basic_mob.cached_multiplicative_slowdown + movement_delay = basic_mob.movement_delay diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 63cf7c7f1bc7..1f33fa647b82 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -20,7 +20,7 @@ /datum/ai_controller/dog/process(delta_time) if(ismob(pawn)) var/mob/living/living_pawn = pawn - movement_delay = living_pawn.cached_multiplicative_slowdown + movement_delay = living_pawn.movement_delay return ..() /datum/ai_controller/dog/TryPossessPawn(atom/new_pawn) @@ -55,7 +55,7 @@ if(!istype(simple_pawn)) return - return simple_pawn.access_card + return simple_pawn.access_card.GetAccess() /// 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) diff --git a/code/datums/ai/generic/generic_behaviors.dm b/code/datums/ai/generic/generic_behaviors.dm index bfce4ae0ff59..2487f80af490 100644 --- a/code/datums/ai/generic/generic_behaviors.dm +++ b/code/datums/ai/generic/generic_behaviors.dm @@ -2,7 +2,7 @@ /datum/ai_behavior/resist/perform(delta_time, datum/ai_controller/controller) . = ..() var/mob/living/living_pawn = controller.pawn - living_pawn.resist() + living_pawn.execute_resist() finish_action(controller, TRUE) /datum/ai_behavior/battle_screech @@ -43,7 +43,7 @@ if(get_dist(batman, big_guy) >= give_up_distance) finish_action(controller, FALSE, target_key) - big_guy.start_pulling(batman) + big_guy.try_make_grab(batman) big_guy.setDir(get_dir(big_guy, batman)) batman.visible_message(span_warning("[batman] gets a slightly too tight hug from [big_guy]!"), span_userdanger("You feel your body break as [big_guy] embraces you!")) @@ -53,7 +53,7 @@ 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) + bodypart_to_break.receive_damage(brute = 15, modifiers = NONE) bodypart_to_break.break_bones() else batman.adjustBruteLoss(150) @@ -73,11 +73,11 @@ /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()) + var/obj/item/held = pawn.get_active_held_item() if(!held) finish_action(controller, FALSE) return - pawn.activate_hand(pawn.get_active_hand()) + pawn.activate_hand() finish_action(controller, TRUE) /// Use the currently held item, or unarmed, on a weakref to an object in the world @@ -169,12 +169,10 @@ var/obj/item/target = target_ref.resolve() if(!(target in living_pawn.held_items)) - if(!living_pawn.put_in_hand_check(target)) + if(!living_pawn.put_in_hands(target)) finish_action(controller, FALSE, target, hunger_timer_key) return - living_pawn.put_in_hands(target) - target.melee_attack_chain(living_pawn, living_pawn) if(QDELETED(target) || prob(10)) // Even if we don't finish it all we can randomly decide to be done @@ -203,7 +201,16 @@ finish_action(controller, FALSE) /datum/ai_behavior/find_and_set/proc/search_tactic(datum/ai_controller/controller, locate_path, search_range) - return locate(locate_path) in oview(search_range, controller.pawn) + for(var/atom/A as anything in oview(search_range, controller.pawn)) + if(!istype(A, locate_path)) + continue + + if(isitem(A)) + var/obj/item/I = A + if(I.item_flags & ABSTRACT) + continue + + return A /** * Variant of find and set that fails if the living pawn doesn't hold something @@ -229,11 +236,12 @@ continue food_candidates += held_candidate - var/list/local_results = locate(locate_path) in oview(search_range, controller.pawn) - for(var/local_candidate in local_results) - if(!IsEdible(local_candidate)) + for(var/obj/item/I in oview(search_range, controller.pawn)) + if(!IsEdible(I)) continue - food_candidates += local_candidate + + food_candidates += I + if(food_candidates.len) return pick(food_candidates) @@ -386,6 +394,11 @@ continue if(thing.IsObscured()) continue + if(isitem(thing)) + var/obj/item/I = thing + if(I.item_flags & ABSTRACT) + continue + possible_targets += thing if(!possible_targets.len) finish_action(controller, FALSE) diff --git a/code/datums/ai/idle_behaviors/idle_dog.dm b/code/datums/ai/idle_behaviors/idle_dog.dm index fd27bc6968e3..6e570e301143 100644 --- a/code/datums/ai/idle_behaviors/idle_dog.dm +++ b/code/datums/ai/idle_behaviors/idle_dog.dm @@ -1,7 +1,7 @@ ///Dog specific idle behavior. /datum/idle_behavior/idle_dog/perform_idle_behavior(delta_time, datum/ai_controller/dog/controller) var/mob/living/living_pawn = controller.pawn - if(!isturf(living_pawn.loc) || living_pawn.pulledby) + if(!isturf(living_pawn.loc) || LAZYLEN(living_pawn.grabbed_by)) return // if we were just ordered to heel, chill out for a bit diff --git a/code/datums/ai/idle_behaviors/idle_monkey.dm b/code/datums/ai/idle_behaviors/idle_monkey.dm index 66b630c35e12..c1c5f2d72b70 100644 --- a/code/datums/ai/idle_behaviors/idle_monkey.dm +++ b/code/datums/ai/idle_behaviors/idle_monkey.dm @@ -1,7 +1,7 @@ /datum/idle_behavior/idle_monkey/perform_idle_behavior(delta_time, datum/ai_controller/controller) var/mob/living/living_pawn = controller.pawn - if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !LAZYLEN(living_pawn.grabbed_by)) var/move_dir = pick(GLOB.alldirs) living_pawn.Move(get_step(living_pawn, move_dir), move_dir) else if(DT_PROB(5, delta_time)) diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm index 1187d8786c1d..8adb8b6e01a8 100644 --- a/code/datums/ai/idle_behaviors/idle_random_walk.dm +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -6,7 +6,7 @@ . = ..() var/mob/living/living_pawn = controller.pawn - if(DT_PROB(walk_chance, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby) + if(DT_PROB(walk_chance, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !LAZYLEN(living_pawn.grabbed_by)) var/move_dir = pick(GLOB.alldirs) living_pawn.Move(get_step(living_pawn, move_dir), move_dir) diff --git a/code/datums/ai/monkey/monkey_behaviors.dm b/code/datums/ai/monkey/monkey_behaviors.dm index 9132106dd88a..0d4ebcd6181c 100644 --- a/code/datums/ai/monkey/monkey_behaviors.dm +++ b/code/datums/ai/monkey/monkey_behaviors.dm @@ -206,7 +206,7 @@ real_target = pick(oview(2, target)) var/obj/item/gun/gun = locate() in living_pawn.held_items - var/can_shoot = gun?.can_shoot() || FALSE + var/can_shoot = gun?.can_fire() || 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) @@ -259,9 +259,15 @@ 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. + var/monkey_is_grabbing_target = FALSE + for(var/obj/item/hand_item/grab/G as anything in target.grabbed_by) + if(!HAS_AI_CONTROLLER_TYPE(G.assailant, /datum/ai_controller/monkey)) + monkey_is_grabbing_target = TRUE + break + + if(!living_pawn.is_grabbing(target) && !monkey_is_grabbing_target) //Dont steal from my fellow monkeys. if(living_pawn.Adjacent(target) && isturf(target.loc)) - target.grabbedby(living_pawn) + living_pawn.try_make_grab(target) return //Do the rest next turn var/datum/weakref/disposal_ref = controller.blackboard[disposal_target_key] diff --git a/code/datums/ai/monkey/monkey_controller.dm b/code/datums/ai/monkey/monkey_controller.dm index 58775a10c019..d3494bc23c9f 100644 --- a/code/datums/ai/monkey/monkey_controller.dm +++ b/code/datums/ai/monkey/monkey_controller.dm @@ -29,6 +29,10 @@ have ways of interacting with a specific mob and control it. ) idle_behavior = /datum/idle_behavior/idle_monkey + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_crossed), + ) + /datum/ai_controller/monkey/angry /datum/ai_controller/monkey/angry/TryPossessPawn(atom/new_pawn) @@ -42,7 +46,7 @@ have ways of interacting with a specific mob and control it. return AI_CONTROLLER_INCOMPATIBLE var/mob/living/living_pawn = new_pawn - RegisterSignal(new_pawn, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed)) + AddComponent(/datum/component/connect_loc_behalf, new_pawn, loc_connections) RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_PAW, PROC_REF(on_attack_paw)) @@ -50,24 +54,23 @@ have ways of interacting with a specific mob and control it. RegisterSignal(new_pawn, COMSIG_MOB_ATTACK_ALIEN, PROC_REF(on_attack_alien)) RegisterSignal(new_pawn, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) RegisterSignal(new_pawn, COMSIG_ATOM_HITBY, PROC_REF(on_hitby)) - RegisterSignal(new_pawn, COMSIG_LIVING_START_PULL, PROC_REF(on_startpulling)) + RegisterSignal(new_pawn, COMSIG_ATOM_GET_GRABBED, PROC_REF(on_grabbed)) RegisterSignal(new_pawn, COMSIG_LIVING_TRY_SYRINGE, PROC_REF(on_try_syringe)) RegisterSignal(new_pawn, COMSIG_ATOM_HULK_ATTACK, PROC_REF(on_attack_hulk)) RegisterSignal(new_pawn, COMSIG_CARBON_CUFF_ATTEMPTED, PROC_REF(on_attempt_cuff)) RegisterSignal(new_pawn, COMSIG_MOB_MOVESPEED_UPDATED, PROC_REF(update_movespeed)) - movement_delay = living_pawn.cached_multiplicative_slowdown + movement_delay = living_pawn.movement_delay return ..() //Run parent at end /datum/ai_controller/monkey/UnpossessPawn(destroy) UnregisterSignal(pawn, list( - COMSIG_MOVABLE_CROSS, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, - COMSIG_LIVING_START_PULL, + COMSIG_ATOM_GET_GRABBED, COMSIG_LIVING_TRY_SYRINGE, COMSIG_ATOM_HULK_ATTACK, COMSIG_CARBON_CUFF_ATTEMPTED, @@ -75,17 +78,16 @@ have ways of interacting with a specific mob and control it. 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_CROSS) + qdel(GetComponent(/datum/component/connect_loc_behalf)) /datum/ai_controller/monkey/on_sentience_lost() . = ..() - RegisterSignal(pawn, COMSIG_MOVABLE_CROSS, PROC_REF(on_crossed)) + AddComponent(/datum/component/connect_loc_behalf, pawn, loc_connections) /datum/ai_controller/monkey/able_to_run() . = ..() @@ -187,11 +189,12 @@ have ways of interacting with a specific mob and control it. in_the_way_mob.knockOver(living_pawn) return -/datum/ai_controller/monkey/proc/on_startpulling(datum/source, atom/movable/puller, state, force) +/datum/ai_controller/monkey/proc/on_grabbed(datum/source, atom/movable/puller) 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) + retaliate(puller) return TRUE /datum/ai_controller/monkey/proc/on_try_syringe(datum/source, mob/user) @@ -212,7 +215,7 @@ have ways of interacting with a specific mob and control it. /datum/ai_controller/monkey/proc/update_movespeed(mob/living/pawn) SIGNAL_HANDLER - movement_delay = pawn.cached_multiplicative_slowdown + movement_delay = pawn.movement_delay /datum/ai_controller/monkey/proc/target_del(target) SIGNAL_HANDLER diff --git a/code/datums/ai/movement/_ai_movement.dm b/code/datums/ai/movement/_ai_movement.dm index fa83d64e7986..2e94a40176cf 100644 --- a/code/datums/ai/movement/_ai_movement.dm +++ b/code/datums/ai/movement/_ai_movement.dm @@ -4,59 +4,76 @@ var/list/moving_controllers = list() ///How many times a given controller can fail on their route before they just give up var/max_pathing_attempts + var/max_path_length = AI_MAX_PATH_LENGTH //Override this to setup the moveloop you want to use /datum/ai_movement/proc/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) SHOULD_CALL_PARENT(TRUE) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE] = min_distance moving_controllers[controller] = current_movement_target /datum/ai_movement/proc/stop_moving_towards(datum/ai_controller/controller) - controller.pathing_attempts = 0 + controller.consecutive_pathing_attempts = 0 moving_controllers -= controller SSmove_manager.stop_looping(controller.pawn, SSai_movement) /datum/ai_movement/proc/increment_pathing_failures(datum/ai_controller/controller) - controller.pathing_attempts++ - if(controller.pathing_attempts >= max_pathing_attempts) + controller.consecutive_pathing_attempts++ + if(controller.consecutive_pathing_attempts >= max_pathing_attempts) controller.CancelActions() -///Should the movement be allowed to happen? As of writing this, MOVELOOP_SKIP_STEP is defined as (1<<0) so be careful on using (return TRUE) or (can_move = TRUE; return can_move) +/datum/ai_movement/proc/reset_pathing_failures(datum/ai_controller/controller) + controller.consecutive_pathing_attempts = 0 + +///Should the movement be allowed to happen? return TRUE if it can, FALSE otherwise /datum/ai_movement/proc/allowed_to_move(datum/move_loop/source) + SHOULD_BE_PURE(TRUE) + var/atom/movable/pawn = source.moving var/datum/ai_controller/controller = source.extra_info - source.delay = controller.movement_delay var/can_move = TRUE - if(controller.ai_traits & STOP_MOVING_WHEN_PULLED && pawn.pulledby) //Need to store more state. Annoying. + if((controller.ai_traits & STOP_MOVING_WHEN_PULLED) && length(pawn.grabbed_by)) //Need to store more state. Annoying. can_move = FALSE if(!isturf(pawn.loc)) //No moving if not on a turf can_move = FALSE + if(isliving(pawn)) + var/mob/living/pawn_mob = pawn + if(!(pawn_mob.mobility_flags & MOBILITY_MOVE)) + can_move = FALSE + + return can_move + +///Anything to do before moving; any checks if the pawn should be able to move should be placed in allowed_to_move() and called by this proc +/datum/ai_movement/proc/pre_move(datum/move_loop/source) + SIGNAL_HANDLER + SHOULD_CALL_PARENT(TRUE) + + var/datum/ai_controller/controller = source.extra_info + // Check if this controller can actually run, so we don't chase people with corpses if(!controller.able_to_run()) controller.CancelActions() qdel(source) //stop moving return MOVELOOP_SKIP_STEP - //Why doesn't this return TRUE or can_move? - //MOVELOOP_SKIP_STEP is defined as (1<<0) and TRUE are defined as the same "1", returning TRUE would be the equivalent of skipping the move - if(can_move) - return + source.delay = controller.movement_delay + + if(allowed_to_move(source)) + return NONE increment_pathing_failures(controller) return MOVELOOP_SKIP_STEP -///Anything to do before moving; any checks if the pawn should be able to move should be placed in allowed_to_move() and called by this proc -/datum/ai_movement/proc/pre_move(datum/move_loop/source) - SIGNAL_HANDLER - return allowed_to_move(source) - //Anything to do post movement /datum/ai_movement/proc/post_move(datum/move_loop/source, succeeded) SIGNAL_HANDLER - if(succeeded) - return + SHOULD_CALL_PARENT(TRUE) + var/datum/ai_controller/controller = source.extra_info + if(succeeded != MOVELOOP_FAILURE) + reset_pathing_failures(controller) + return increment_pathing_failures(controller) diff --git a/code/datums/ai/movement/ai_movement_basic_avoidance.dm b/code/datums/ai/movement/ai_movement_basic_avoidance.dm index 8897e67bd69a..b58c1a0d59ae 100644 --- a/code/datums/ai/movement/ai_movement_basic_avoidance.dm +++ b/code/datums/ai/movement/ai_movement_basic_avoidance.dm @@ -16,5 +16,4 @@ var/turf/target_turf = get_step_towards(source.moving, source.target) if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) - . = FALSE - return . + return FALSE diff --git a/code/datums/ai/movement/ai_movement_dumb.dm b/code/datums/ai/movement/ai_movement_dumb.dm index a85458811a28..880c72e0b50d 100644 --- a/code/datums/ai/movement/ai_movement_dumb.dm +++ b/code/datums/ai/movement/ai_movement_dumb.dm @@ -16,5 +16,4 @@ var/turf/target_turf = get_step_towards(source.moving, source.target) if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs)) - . = FALSE - return . + return FALSE diff --git a/code/datums/ai/movement/ai_movement_jps.dm b/code/datums/ai/movement/ai_movement_jps.dm index 136714b9de44..b7ebec2d1c2c 100644 --- a/code/datums/ai/movement/ai_movement_jps.dm +++ b/code/datums/ai/movement/ai_movement_jps.dm @@ -2,7 +2,7 @@ * This movement datum represents smart-pathing */ /datum/ai_movement/jps - max_pathing_attempts = 4 + max_pathing_attempts = 20 /datum/ai_movement/jps/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance) . = ..() @@ -12,12 +12,13 @@ var/datum/move_loop/loop = SSmove_manager.jps_move(moving, current_movement_target, delay, - repath_delay = 2 SECONDS, - max_path_length = AI_MAX_PATH_LENGTH, + repath_delay = 0.5 SECONDS, + max_path_length = max_path_length, minimum_distance = controller.get_minimum_distance(), - id = controller.get_access(), + access = controller.get_access(), subsystem = SSai_movement, - extra_info = controller) + extra_info = controller, + initial_path = controller.blackboard[BB_PATH_TO_USE]) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move)) RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move)) @@ -27,5 +28,22 @@ SIGNAL_HANDLER var/datum/ai_controller/controller = source.extra_info - source.id = controller.get_access() + source.access = controller.get_access() source.minimum_distance = controller.get_minimum_distance() + +/datum/ai_movement/jps/modsuit + max_path_length = MOD_AI_RANGE + +/datum/ai_movement/jps/modsuit/pre_move(datum/move_loop/source) + . = ..() + if(.) + return + var/datum/move_loop/has_target/jps/moveloop = source + if(!length(moveloop.movement_path)) + return + + var/datum/ai_controller/controller = source.extra_info + var/obj/item/mod = controller.pawn + var/angle = get_angle(mod, moveloop.movement_path[1]) + mod.transform = matrix().Turn(angle) + diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm index ced2ffceb6fc..6af7ec3e7208 100644 --- a/code/datums/ai/objects/mod.dm +++ b/code/datums/ai/objects/mod.dm @@ -5,7 +5,7 @@ BB_MOD_IMPLANT, ) max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesnt run otherwise - ai_movement = /datum/ai_movement/jps + ai_movement = /datum/ai_movement/jps/modsuit ///ID card generated from the suit's required access. Used for pathing. var/obj/item/card/id/advanced/id_card @@ -28,7 +28,7 @@ queue_behavior(/datum/ai_behavior/mod_attach) /datum/ai_controller/mod/get_access() - return id_card + return id_card.GetAccess() /datum/ai_behavior/mod_attach behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM diff --git a/code/datums/ai/oldhostile/hostile_tameable.dm b/code/datums/ai/oldhostile/hostile_tameable.dm index e3a90870538d..16c7f52f60ed 100644 --- a/code/datums/ai/oldhostile/hostile_tameable.dm +++ b/code/datums/ai/oldhostile/hostile_tameable.dm @@ -19,7 +19,7 @@ /datum/ai_controller/hostile_friend/process(delta_time) if(isliving(pawn)) var/mob/living/living_pawn = pawn - movement_delay = living_pawn.cached_multiplicative_slowdown + movement_delay = living_pawn.movement_delay return ..() /datum/ai_controller/hostile_friend/TryPossessPawn(atom/new_pawn) @@ -62,7 +62,7 @@ if(!istype(simple_pawn)) return - return simple_pawn.access_card + return simple_pawn.access_card.GetAccess() /datum/ai_controller/hostile_friend/proc/on_ridden_driver_move(atom/movable/movable_parent, mob/living/user, direction) SIGNAL_HANDLER diff --git a/code/datums/ai/robot_customer/robot_customer_controller.dm b/code/datums/ai/robot_customer/robot_customer_controller.dm index 901c0f2f69c6..22fc2e267074 100644 --- a/code/datums/ai/robot_customer/robot_customer_controller.dm +++ b/code/datums/ai/robot_customer/robot_customer_controller.dm @@ -21,12 +21,12 @@ if(!istype(new_pawn, /mob/living/simple_animal/robot_customer)) return AI_CONTROLLER_INCOMPATIBLE RegisterSignal(new_pawn, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) - RegisterSignal(new_pawn, COMSIG_LIVING_GET_PULLED, PROC_REF(on_get_pulled)) + RegisterSignal(new_pawn, COMSIG_ATOM_GET_GRABBED, PROC_REF(on_get_pulled)) RegisterSignal(new_pawn, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_get_punched)) return ..() //Run parent at end /datum/ai_controller/robot_customer/UnpossessPawn(destroy) - UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_LIVING_GET_PULLED, COMSIG_ATOM_ATTACK_HAND)) + UnregisterSignal(pawn, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_GET_GRABBED, COMSIG_ATOM_ATTACK_HAND)) return ..() //Run parent at end /datum/ai_controller/robot_customer/proc/on_attackby(datum/source, obj/item/I, mob/living/user) diff --git a/code/datums/armor.dm b/code/datums/armor.dm index b3e379f73b73..2e1c62e0f6af 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,70 +1,149 @@ -#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[fire]-[acid]-[wound]-[consume]" +#define ARMORID "armor-[blunt]-[puncture]-[slash]-[laser]-[energy]-[bomb]-[bio]-[fire]-[acid]" -/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0, wound = 0, consume = 0) +/proc/getArmor(blunt = 0, puncture = 0, slash = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0) . = locate(ARMORID) if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, fire, acid, wound, consume) + . = new /datum/armor(blunt, puncture, slash, laser, energy, bomb, bio, fire, acid) + +///Retreive an atom's armor, creating it if it doesn't exist +/atom/proc/returnArmor() //This is copypasted to physiology/proc/returnArmor()!!! update it too!!! + RETURN_TYPE(/datum/armor) + if(istype(armor, /datum/armor)) + return armor + + if(islist(armor) || isnull(armor)) + armor = getArmor(arglist(armor)) + return armor + + CRASH("Armor is not a datum or a list, what the fuck?") + +///Setter for armor +/atom/proc/setArmor(datum/new_armor) + armor = new_armor /datum/armor - datum_flags = DF_USE_TAG - var/melee - var/bullet + var/blunt + var/puncture + var/slash var/laser var/energy var/bomb var/bio var/fire var/acid - var/wound - var/consume -/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0, wound = 0, consume = 0) - src.melee = melee - src.bullet = bullet +/datum/armor/New(blunt = 0, puncture = 0, slash = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0) + src.blunt = blunt + src.puncture = puncture + src.slash = slash src.laser = laser src.energy = energy src.bomb = bomb src.bio = bio src.fire = fire src.acid = acid - src.wound = wound - src.consume = consume - tag = ARMORID + GenerateTag() + +/datum/armor/Destroy(force, ...) + if(!force) + stack_trace("Some mf tried to delete an armor datum, KILL THIS MAN") + return QDEL_HINT_LETMELIVE + return ..() -/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0, wound = 0, consume = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.fire+fire, src.acid+acid, src.wound+wound, src.consume+consume) +/datum/armor/proc/modifyRating(blunt = 0, puncture = 0, slash = 0, laser = 0, energy = 0, bomb = 0, bio = 0, fire = 0, acid = 0) + return getArmor( + src.blunt + blunt, + src.puncture + puncture, + src.slash + slash, + src.laser + laser, + src.energy + energy, + src.bomb + bomb, + src.bio + bio, + src.fire + fire, + src.acid + acid + ) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, fire+modifier, acid+modifier, wound+modifier, consume+modifier) - -/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, fire, acid, wound, consume) - return getArmor((isnull(melee) ? src.melee : melee),\ - (isnull(bullet) ? src.bullet : bullet),\ - (isnull(laser) ? src.laser : laser),\ - (isnull(energy) ? src.energy : energy),\ - (isnull(bomb) ? src.bomb : bomb),\ - (isnull(bio) ? src.bio : bio),\ - (isnull(fire) ? src.fire : fire),\ - (isnull(acid) ? src.acid : acid),\ - (isnull(wound) ? src.wound : wound),\ - (isnull(consume) ? src.consume : consume)) + return getArmor( + blunt + modifier, + puncture + modifier, + slash + modifier, + laser + modifier, + energy + modifier, + bomb + modifier, + bio + modifier, + fire + modifier, + acid + modifier + ) + +/datum/armor/proc/setRating(blunt, puncture, slash, laser, energy, bomb, bio, fire, acid) + return getArmor( + (isnull(blunt) ? src.blunt : blunt), + (isnull(puncture) ? src.puncture : puncture), + (isnull(slash) ? src.slash : slash), + (isnull(laser) ? src.laser : laser), + (isnull(energy) ? src.energy : energy), + (isnull(bomb) ? src.bomb : bomb), + (isnull(bio) ? src.bio : bio), + (isnull(fire) ? src.fire : fire), + (isnull(acid) ? src.acid : acid) + ) /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, FIRE = fire, ACID = acid, WOUND = wound, CONSUME = consume) + return list(BLUNT = blunt, PUNCTURE = puncture, SLASH = slash, LASER = laser, ENERGY = energy, BOMB = bomb, BIO = bio, FIRE = fire, ACID = acid) /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, fire+AA.fire, acid+AA.acid, wound+AA.wound, consume+AA.consume) + return getArmor( + blunt + AA.blunt, + puncture + AA.puncture, + slash + AA.slash, + laser + AA.laser, + energy + AA.energy, + bomb + AA.bomb, + bio + AA.bio, + fire + AA.fire, + acid + AA.acid + ) /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, fire-AA.fire, acid-AA.acid, wound-AA.wound, consume-AA.consume) + return getArmor( + blunt - AA.blunt, + puncture - AA.puncture, + slash - AA.slash, + laser - AA.laser, + energy - AA.energy, + bomb - AA.bomb, + bio - AA.bio, + fire - AA.fire, + acid - AA.acid + ) + +/datum/armor/GenerateTag() + . = ..() + tag = ARMORID /datum/armor/vv_edit_var(var_name, var_value) if (var_name == NAMEOF(src, tag)) return FALSE . = ..() - tag = ARMORID // update tag in case armor values were edited + GenerateTag() #undef ARMORID + +/proc/armor_flag_to_strike_string(flag) + switch(flag) + if(BLUNT) + return "strike" + if(PUNCTURE) + return "stab" + if(SLASH) + return "slash" + if(ACID) + return "acid" + if(FIRE) + return "burn" + else + return "blow" diff --git a/code/datums/beam.dm b/code/datums/beam.dm index a362b166e2f3..052969c6d52a 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -28,14 +28,32 @@ var/beam_type = /obj/effect/ebeam ///This is used as the visual_contents of beams, so you can apply one effect to this and the whole beam will look like that. never gets deleted on redrawing. var/obj/effect/ebeam/visuals - -/datum/beam/New(beam_origin,beam_target,beam_icon='icons/effects/beam.dmi',beam_icon_state="b_beam",time=INFINITY,maxdistance=INFINITY,btype = /obj/effect/ebeam) - origin = beam_origin - target = beam_target - max_distance = maxdistance - icon = beam_icon - icon_state = beam_icon_state - beam_type = btype + ///The color of the beam we're drawing. + var/beam_color + ///If we use an emissive appearance + var/emissive = TRUE + /// If set will be used instead of origin's pixel_x in offset calculations + var/override_origin_pixel_x = null + /// If set will be used instead of origin's pixel_y in offset calculations + var/override_origin_pixel_y = null + /// If set will be used instead of targets's pixel_x in offset calculations + var/override_target_pixel_x = null + /// If set will be used instead of targets's pixel_y in offset calculations + var/override_target_pixel_y = null + +/datum/beam/New(origin, target, icon = 'icons/effects/beam.dmi', icon_state = "b_beam", time = INFINITY, max_distance = INFINITY, beam_type = /obj/effect/ebeam, beam_color = null, emissive = TRUE, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) + src.origin = origin + src.target = target + src.icon = icon + src.icon_state = icon_state + src.max_distance = max_distance + src.beam_type = beam_type + src.beam_color = beam_color + src.emissive = emissive + src.override_origin_pixel_x = override_origin_pixel_x + src.override_origin_pixel_y = override_origin_pixel_y + src.override_target_pixel_x = override_target_pixel_x + src.override_target_pixel_y = override_target_pixel_y if(time < INFINITY) QDEL_IN(src, time) @@ -46,6 +64,11 @@ visuals = new beam_type() visuals.icon = icon visuals.icon_state = icon_state + visuals.color = beam_color + visuals.layer = ABOVE_ALL_MOB_LAYER + visuals.vis_flags = VIS_INHERIT_PLANE + visuals.emissive = emissive + visuals.update_appearance() Draw() RegisterSignal(origin, COMSIG_MOVABLE_MOVED, PROC_REF(redrawing)) RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(redrawing)) @@ -137,8 +160,21 @@ /obj/effect/ebeam mouse_opacity = MOUSE_OPACITY_TRANSPARENT anchored = TRUE + var/emissive = TRUE var/datum/beam/owner +/obj/effect/ebeam/Initialize(mapload, beam_owner) + owner = beam_owner + return ..() + +/obj/effect/ebeam/update_overlays() + . = ..() + if(!emissive) + return + var/mutable_appearance/emissive_overlay = emissive_appearance(icon, icon_state, src) + emissive_overlay.transform = transform + . += emissive_overlay + /obj/effect/ebeam/Destroy() owner = null return ..() @@ -160,7 +196,7 @@ * maxdistance: how far the beam will go before stopping itself. Used mainly for two things: preventing lag if the beam may go in that direction and setting a range to abilities that use beams. * beam_type: The type of your custom beam. This is for adding other wacky stuff for your beam only. Most likely, you won't (and shouldn't) change it. */ -/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam) - var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type) - INVOKE_ASYNC(newbeam, TYPE_PROC_REF(/datum/beam, Start)) +/atom/proc/Beam(atom/BeamTarget,icon_state="b_beam",icon='icons/effects/beam.dmi',time=INFINITY,maxdistance=INFINITY,beam_type=/obj/effect/ebeam, beam_color = null, emissive = TRUE, override_origin_pixel_x = null, override_origin_pixel_y = null, override_target_pixel_x = null, override_target_pixel_y = null) + var/datum/beam/newbeam = new(src,BeamTarget,icon,icon_state,time,maxdistance,beam_type, beam_color, emissive, override_origin_pixel_x, override_origin_pixel_y, override_target_pixel_x, override_target_pixel_y ) + INVOKE_ASYNC(newbeam, TYPE_PROC_REF(/datum/beam/, Start)) return newbeam diff --git a/code/datums/blood_types.dm b/code/datums/blood_types.dm new file mode 100644 index 000000000000..fea482fef25e --- /dev/null +++ b/code/datums/blood_types.dm @@ -0,0 +1,107 @@ +/// Contains the singletons of blood datums +GLOBAL_LIST_EMPTY(blood_datums) + +/datum/blood + abstract_type = /datum/blood + var/name = "ERROR" + var/color = COLOR_HUMAN_BLOOD + +/// Takes a blood typepath, returns TRUE if it's compatible with this type. +/datum/blood/proc/is_compatible(other_type) + return ispath(other_type, /datum/blood/universal) || other_type == type + +/datum/blood/universal + name = "U" + +/datum/blood/slurry + name = "??" + +/datum/blood/animal + name = "Y-" + +/datum/blood/lizard + name = "JN" + color = "#e2ae02" + +/datum/blood/universal/vox + name = "VX" + color = "#009696" + +/datum/blood/human + abstract_type = /datum/blood/human + +/datum/blood/human/is_compatible(other_type) + var/static/list/bloodtypes_safe = list( + /datum/blood/human/amin = list( + /datum/blood/human/amin, + /datum/blood/human/omin + ), + /datum/blood/human/apos = list( + /datum/blood/human/amin, + /datum/blood/human/apos, + /datum/blood/human/omin, + /datum/blood/human/opos, + ), + /datum/blood/human/bmin = list( + /datum/blood/human/bmin, + /datum/blood/human/omin, + ), + /datum/blood/human/bpos = list( + /datum/blood/human/bmin, + /datum/blood/human/bpos, + /datum/blood/human/omin, + /datum/blood/human/opos + ), + /datum/blood/human/abmin = list( + /datum/blood/human/amin, + /datum/blood/human/bmin, + /datum/blood/human/omin, + /datum/blood/human/abmin + ), + /datum/blood/human/abpos = list( + /datum/blood/human/amin, + /datum/blood/human/apos, + /datum/blood/human/bmin, + /datum/blood/human/bpos, + /datum/blood/human/omin, + /datum/blood/human/opos, + /datum/blood/human/abmin, + /datum/blood/human/abpos + ), + /datum/blood/human/omin = list( + /datum/blood/human/omin + ), + /datum/blood/human/opos = list( + /datum/blood/human/omin, + /datum/blood/human/opos + ), + ) + return (other_type in bloodtypes_safe[type]) || ..() + +/datum/blood/human/amin + name = "A-" + +/datum/blood/human/apos + name = "A+" + +/datum/blood/human/bmin + name = "B-" + +/datum/blood/human/bpos + name = "B+" + +/datum/blood/human/abmin + name = "AB-" + +/datum/blood/human/abpos + name = "AB+" + +/datum/blood/human/omin + name = "O-" + +/datum/blood/human/opos + name = "O+" + +/datum/blood/xenomorph + name = "??" + color = rgb(43, 186, 0) diff --git a/code/datums/brain_damage/creepy_trauma.dm b/code/datums/brain_damage/creepy_trauma.dm index 21b64b380f35..5731c077c679 100644 --- a/code/datums/brain_damage/creepy_trauma.dm +++ b/code/datums/brain_damage/creepy_trauma.dm @@ -49,7 +49,6 @@ else viewing = FALSE if(viewing) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/creeping, obsession.name) total_time_creeping += delta_time SECONDS time_spent_away = 0 if(attachedobsessedobj)//if an objective needs to tick down, we can do that since traumas coexist with the antagonist datum @@ -59,10 +58,6 @@ /datum/brain_trauma/special/obsessed/proc/out_of_view() time_spent_away += 20 - if(time_spent_away > 1800) //3 minutes - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/notcreepingsevere, obsession.name) - else - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/notcreeping, obsession.name) /datum/brain_trauma/special/obsessed/on_lose() ..() @@ -122,8 +117,6 @@ var/list/viable_minds = list() //The first list, which excludes hijinks var/list/possible_targets = list() //The second list, which filters out silicons and simplemobs var/static/list/trait_obsessions = list( - JOB_MIME = TRAIT_MIME_FAN, - JOB_CLOWN = TRAIT_CLOWN_ENJOYER, JOB_CHAPLAIN = TRAIT_SPIRITUAL, ) // Jobs and their corresponding quirks var/list/special_pool = list() //The special list, for quirk-based @@ -135,6 +128,7 @@ if(!(player.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) continue viable_minds += player.mind + for(var/datum/mind/possible_target as anything in viable_minds) if(possible_target != owner && ishuman(possible_target.current)) var/job = possible_target.assigned_role.title diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index 259c1acc797d..2a8e1d459a8f 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -66,4 +66,7 @@ new /datum/hallucination/chat(owner, TRUE, FALSE, span_hypnophrase("[hypnotic_phrase]")) /datum/brain_trauma/hypnosis/handle_hearing(datum/source, list/hearing_args) + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(istype(L, /datum/language/visual) || !L?.can_receive_language(owner)) + return hearing_args[HEARING_RAW_MESSAGE] = target_phrase.Replace(hearing_args[HEARING_RAW_MESSAGE], span_hypnophrase("$1")) diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index e4771844a76c..4a092258e533 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -109,8 +109,7 @@ /mob/camera/imaginary_friend/proc/setup_friend() var/gender = pick(MALE, FEMALE) - real_name = random_unique_name(gender) - name = real_name + set_real_name(random_unique_name(gender)) human_image = get_flat_human_icon(null, pick(SSjob.joinable_occupations)) /** @@ -125,8 +124,7 @@ setup_friend() return - real_name = appearance_from_prefs.read_preference(/datum/preference/name/real_name) - name = real_name + set_real_name(appearance_from_prefs.read_preference(/datum/preference/name/real_name)) // Determine what job is marked as 'High' priority. var/datum/job/appearance_job @@ -181,7 +179,7 @@ client.images.Remove(human_image) return ..() -/mob/camera/imaginary_friend/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/camera/imaginary_friend/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if (!message) return @@ -194,7 +192,7 @@ friend_talk(message) -/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/camera/imaginary_friend/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) create_chat_message(speaker, message_language, raw_message, spans, sound_loc = sound_loc) to_chat(src, compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods)) @@ -317,6 +315,5 @@ to_chat(src, span_notice("You cannot directly influence the world around you, but you can see what the host cannot.")) /mob/camera/imaginary_friend/trapped/setup_friend() - real_name = "[owner.real_name]?" - name = real_name + set_real_name("[owner.real_name]?") human_image = icon('icons/mob/lavaland/lavaland_monsters.dmi', icon_state = "curseblob") diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm index fbe5993ca79e..e9c805b1c03d 100644 --- a/code/datums/brain_damage/mild.dm +++ b/code/datums/brain_damage/mild.dm @@ -42,7 +42,6 @@ /datum/brain_trauma/mild/dumbness/on_gain() ADD_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious) return ..() /datum/brain_trauma/mild/dumbness/on_life(delta_time, times_fired) @@ -55,7 +54,6 @@ /datum/brain_trauma/mild/dumbness/on_lose() REMOVE_TRAIT(owner, TRAIT_DUMB, TRAUMA_TRAIT) owner.remove_status_effect(/datum/status_effect/speech/stutter/derpspeech) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "dumb") return ..() /datum/brain_trauma/mild/speech_impediment @@ -237,6 +235,11 @@ /datum/brain_trauma/mild/mind_echo/handle_hearing(datum/source, list/hearing_args) if(owner == hearing_args[HEARING_SPEAKER]) return + + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(istype(L, /datum/language/visual) || !L?.can_receive_language(owner) || !owner.has_language(L)) + return + if(hear_dejavu.len >= 5) if(prob(25)) var/deja_vu = pick_n_take(hear_dejavu) diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm index adb787714827..528433fe4f4d 100644 --- a/code/datums/brain_damage/phobia.dm +++ b/code/datums/brain_damage/phobia.dm @@ -78,7 +78,10 @@ return /datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args) - if(!owner.can_hear() || !COOLDOWN_FINISHED(src, scare_cooldown)) //words can't trigger you if you can't hear them *taps head* + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(!L?.can_receive_language(owner) || !owner.has_language(L)) + return + if(!COOLDOWN_FINISHED(src, scare_cooldown)) //words can't trigger you if you can't hear them *taps head* return if(HAS_TRAIT(owner, TRAIT_FEARLESS)) return @@ -117,7 +120,7 @@ owner.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) owner.say("AAAAH!!", forced = "phobia") if(reason) - owner.pointed(reason) + owner._pointed(reason) if(3) to_chat(owner, span_warning("You shut your eyes in terror!")) owner.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 9092853c321a..3d91736e6d16 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -28,13 +28,14 @@ lose_text = "You suddenly remember how languages work." /datum/brain_trauma/severe/aphasia/on_gain() - owner.add_blocked_language(subtypesof(/datum/language/) - /datum/language/aphasia, LANGUAGE_APHASIA) + owner.add_blocked_language(subtypesof(/datum/language) - /datum/language/aphasia, LANGUAGE_APHASIA) owner.grant_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) ..() /datum/brain_trauma/severe/aphasia/on_lose() - owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_APHASIA) - owner.remove_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) + if(!QDELETED(owner)) // This can create language holders on qdeleting mobs. This is bad. + owner.remove_blocked_language(subtypesof(/datum/language/), LANGUAGE_APHASIA) + owner.remove_language(/datum/language/aphasia, TRUE, TRUE, LANGUAGE_APHASIA) ..() /datum/brain_trauma/severe/blindness @@ -210,8 +211,9 @@ if(high_stress) if(prob(15) && ishuman(owner)) var/mob/living/carbon/human/H = owner - H.set_heartattack(TRUE) - to_chat(H, span_userdanger("You feel a stabbing pain in your heart!")) + if(H.set_heartattack(TRUE)) + log_health(H, "Heart stopped due to monophobia quirk.") + to_chat(H, span_userdanger("You feel a stabbing pain in your heart!")) else to_chat(owner, span_userdanger("You feel your heart lurching in your chest...")) owner.adjustOxyLoss(8) @@ -288,11 +290,13 @@ owner.remove_status_effect(/datum/status_effect/trance) /datum/brain_trauma/severe/hypnotic_trigger/handle_hearing(datum/source, list/hearing_args) - if(!owner.can_hear()) - return if(owner == hearing_args[HEARING_SPEAKER]) return + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(istype(L, /datum/language/visual) || !L?.can_receive_language(owner) || !owner.has_language(L)) + return + var/regex/reg = new("(\\b[REGEX_QUOTE(trigger_phrase)]\\b)","ig") if(findtext(hearing_args[HEARING_RAW_MESSAGE], reg)) diff --git a/code/datums/brain_damage/special.dm b/code/datums/brain_damage/special.dm index aa99bcb11fb4..0d37113c61d3 100644 --- a/code/datums/brain_damage/special.dm +++ b/code/datums/brain_damage/special.dm @@ -170,18 +170,17 @@ /datum/brain_trauma/special/quantum_alignment/proc/try_entangle() //Check for pulled mobs - if(ismob(owner.pulling)) - entangle(owner.pulling) + var/list/grabs = owner.active_grabs + if(length(grabs)) + for(var/obj/item/hand_item/grab/G in grabs) + entangle(G.affecting) return + //Check for adjacent mobs for(var/mob/living/L in oview(1, owner)) if(owner.Adjacent(L)) entangle(L) return - //Check for pulled objects - if(isobj(owner.pulling)) - entangle(owner.pulling) - return //Check main hand var/obj/item/held_item = owner.get_active_held_item() @@ -384,7 +383,7 @@ if(get_dist(owner, beepsky) <= 1) owner.playsound_local(owner, 'sound/weapons/egloves.ogg', 50) owner.visible_message(span_warning("[owner]'s body jerks as if it was shocked."), span_userdanger("You feel the fist of the LAW.")) - owner.take_bodypart_damage(0,0,rand(40, 70)) + owner.stamina.adjust(rand(-40, -70)) QDEL_NULL(beepsky) if(prob(20) && get_dist(owner, beepsky) <= 8) owner.playsound_local(beepsky, 'sound/voice/beepsky/criminal.ogg', 40) diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm index adb432c1a713..6d0a22a9a631 100644 --- a/code/datums/brain_damage/split_personality.dm +++ b/code/datums/brain_damage/split_personality.dm @@ -136,8 +136,7 @@ /mob/living/split_personality/Initialize(mapload, _trauma) if(iscarbon(loc)) body = loc - name = body.real_name - real_name = body.real_name + set_real_name(body.real_name) trauma = _trauma return ..() @@ -163,7 +162,7 @@ to_chat(src, span_notice("As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.")) to_chat(src, span_warning("Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.")) -/mob/living/split_personality/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/split_personality/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) to_chat(src, span_warning("You cannot speak, your other self is controlling your body!")) return FALSE @@ -217,8 +216,13 @@ return //no random switching /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]) + if(owner == hearing_args[HEARING_SPEAKER]) return + + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(istype(L, /datum/language/visual) || !L?.can_receive_language(owner) || !owner.has_language(L)) + return + var/message = hearing_args[HEARING_RAW_MESSAGE] if(findtext(message, codeword)) hearing_args[HEARING_RAW_MESSAGE] = replacetext(message, codeword, span_warning("[codeword]")) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 523b131c1a58..4c912e73fd00 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -63,6 +63,7 @@ /datum/browser/proc/get_header() var/file head_content += "" + for (file in stylesheets) head_content += "" @@ -70,7 +71,8 @@ for (file in scripts) head_content += "" - return {" + return {" + @@ -79,7 +81,7 @@
- [title ? "
[title]
" : ""] + [title ? "
[title]
" : ""]
"} //" This is here because else the rest of the file looks like a string in notepad++. diff --git a/code/datums/cable_click_manager.dm b/code/datums/cable_click_manager.dm new file mode 100644 index 000000000000..2038c728820b --- /dev/null +++ b/code/datums/cable_click_manager.dm @@ -0,0 +1,303 @@ +/datum/cable_click_manager + var/obj/item/stack/cable_coil/parent + var/mob/user + + /// Mouse catcher + var/atom/movable/screen/fullscreen/cursor_catcher/catcher + var/image/phantom_wire + var/image/phantom_knot + + var/turf/tracked_turf + var/position_1 + var/position_2 + +/datum/cable_click_manager/New(new_parent) + parent = new_parent + + phantom_knot = image('icons/obj/power_cond/cable.dmi', "0") + phantom_knot.appearance_flags = APPEARANCE_UI + phantom_knot.plane = ABOVE_LIGHTING_PLANE + phantom_knot.color = parent.color + phantom_knot.alpha = 128 + phantom_knot.filters += outline_filter(1, COLOR_RED) + + phantom_wire = image('icons/obj/power_cond/cable.dmi') + phantom_wire.appearance_flags = APPEARANCE_UI + phantom_wire.plane = GAME_PLANE + phantom_wire.layer = FLY_LAYER + phantom_wire.color = parent.color + phantom_wire.alpha = 128 + phantom_wire.filters += outline_filter(1, COLOR_RED) + +/datum/cable_click_manager/Destroy(force, ...) + set_user(null) + parent = null + STOP_PROCESSING(SSkinesis, src) + return ..() + +// WIRE_LAYER +/datum/cable_click_manager/proc/set_user(mob/new_user) + if(user == new_user) + return + + if(catcher) + QDEL_NULL(catcher) + + if(user) + UnregisterSignal(user, list(COMSIG_MOB_LOGIN, COMSIG_MOB_LOGOUT, COMSIG_MOB_SWAP_HANDS, COMSIG_MOB_CLICKON)) + user.clear_fullscreen("cable_laying", FALSE) + user.client?.images -= phantom_wire + user.client?.images -= phantom_knot + + position_1 = null + position_2 = null + STOP_PROCESSING(SSkinesis, src) + + user = new_user + if(!user) + return + + RegisterSignal(user, COMSIG_MOB_LOGIN, PROC_REF(on_login)) + RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(on_logout)) + RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_swap_hands)) + RegisterSignal(user, COMSIG_MOB_CLICKON, PROC_REF(intercept_click)) + + if(user.client) + create_catcher() + disable_catcher() + +/datum/cable_click_manager/proc/create_catcher() + user.client.images |= phantom_wire + user.client.images |= phantom_knot + + catcher = user.overlay_fullscreen("cable_laying", /atom/movable/screen/fullscreen/cursor_catcher/cable, 0) + catcher.assign_to_mob(user) + + if(user.get_active_held_item() != parent) + catcher.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + else + START_PROCESSING(SSkinesis, src) + + RegisterSignal(catcher, COMSIG_CLICK, PROC_REF(on_catcher_click)) + +/// Turn on the catcher. +/datum/cable_click_manager/proc/enable_catcher() + catcher.mouse_opacity = MOUSE_OPACITY_OPAQUE + START_PROCESSING(SSkinesis, src) + +/// Turn off the catcher and clear all state. +/datum/cable_click_manager/proc/disable_catcher() + catcher.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + clear_state() + STOP_PROCESSING(SSkinesis, src) + +/datum/cable_click_manager/proc/on_catcher_click(atom/source, location, control, params) + SIGNAL_HANDLER + + if(user.incapacitated()) + return + + params = params2list(params) + if(!length(params)) + return + + if(params[RIGHT_CLICK]) + if(position_1) + clear_state() + return + + disable_catcher() + to_chat(usr, span_obviousnotice("Advanced wire placement disabled.")) + return + + var/turf/T = parse_caught_click_modifiers(params, get_turf(user.client.eye), user.client) + if(!T || (tracked_turf && T != tracked_turf)) + return + + if(!T.Adjacent(user)) + return + + var/list/screen_split = splittext(params[SCREEN_LOC], ",") + var/list/x_split = splittext(screen_split[1], ":") + var/list/y_split = splittext(screen_split[2], ":") + + var/grid_cell = get_nonant_from_pixels(text2num(x_split[2]), text2num(y_split[2])) + + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE || !T.can_have_cabling()) + to_chat(user, span_warning("[T] can not have cables.")) + clear_state() + return + + if(user.canface()) + user.face_atom(T) + + if(!tracked_turf) + position_1 = grid_cell + phantom_knot.loc = T + offset_image_to_nonant_cell(position_1, phantom_knot) + tracked_turf = T + return + + if(try_place_wire(T, (position_1 | grid_cell))) + clear_state() + +/datum/cable_click_manager/process(delta_time) + if(tracked_turf && !tracked_turf.Adjacent(user)) + clear_state() + return + + var/list/params = params2list(catcher.mouse_params) + if(!length(params) || !params[SCREEN_LOC]) + return + + var/turf/T = parse_caught_click_modifiers(params, get_turf(user.client.eye), user.client) + if(!T) + return + + if(!T.Adjacent(user)) + phantom_wire.loc = null + return + + if(tracked_turf && (T != tracked_turf)) + return + + var/list/screen_split = splittext(params[SCREEN_LOC], ",") + var/list/x_split = splittext(screen_split[1], ":") + var/list/y_split = splittext(screen_split[2], ":") + + var/grid_cell = get_nonant_from_pixels(text2num(x_split[2]), text2num(y_split[2])) + + if(isnull(position_1)) + phantom_wire.icon_state = "0" + phantom_wire.loc = T + offset_image_to_nonant_cell(grid_cell, phantom_wire) + return + + position_2 = grid_cell + phantom_wire.loc = T + phantom_wire.pixel_x = 0 + phantom_wire.pixel_y = 0 + phantom_wire.icon_state = "[position_1 | position_2]" + +/datum/cable_click_manager/proc/try_place_wire(turf/T, cable_direction = NONE) + return parent.place_turf(T, user, cable_direction) + +/datum/cable_click_manager/proc/clear_state() + tracked_turf = null + phantom_knot.loc = null + phantom_wire.loc = null + position_1 = null + position_2 = null + +// Nonant grid +// 1 2 3 +// 4 5 6 +// 7 8 9 +/// Returns the nonant cell the mouse is in based on the pixel offsets. +/datum/cable_click_manager/proc/get_nonant_from_pixels(pixel_x = 0, pixel_y = 0) + var/nonant_row + var/nonant_column + switch(pixel_x) + if(0 to 10) + nonant_row = 1 + if(11 to 22) + nonant_row = 2 + else + nonant_row = 3 + + switch(pixel_y) + if(0 to 10) + nonant_column = 6 + if(11 to 22) + nonant_column = 3 + else + nonant_column = 0 + + var/static/list/lookup = list( + CABLE_NORTHWEST, CABLE_NORTH, CABLE_NORTHEAST, + CABLE_WEST, 0 , CABLE_EAST, + CABLE_SOUTHWEST, CABLE_SOUTH, CABLE_SOUTHEAST + ) + + return lookup[nonant_row + nonant_column] + +/datum/cable_click_manager/proc/offset_image_to_nonant_cell(cell, image/I) + switch(cell) + if(CABLE_NORTHWEST) + I.pixel_x = 0 + I.pixel_y = 32 + if(CABLE_NORTH) + I.pixel_x = 16 + I.pixel_y = 32 + if(CABLE_NORTHEAST) + I.pixel_x = 32 + I.pixel_y = 32 + if(CABLE_WEST) + I.pixel_x = 0 + I.pixel_y = 16 + if(0) + I.pixel_x = 16 + I.pixel_y = 16 + if(CABLE_EAST) + I.pixel_x = 32 + I.pixel_y = 16 + if(CABLE_SOUTHWEST) + I.pixel_x = 0 + I.pixel_y = 0 + if(CABLE_SOUTH) + I.pixel_x = 16 + I.pixel_y = 0 + if(CABLE_SOUTHEAST) + I.pixel_x = 32 + I.pixel_y = 0 + + I.pixel_x -= 16 + I.pixel_y -= 16 + +/datum/cable_click_manager/proc/on_login() + SIGNAL_HANDLER + if(!user.client) + return + + if(!catcher) + create_catcher() + disable_catcher() + else + START_PROCESSING(SSkinesis, src) + +/datum/cable_click_manager/proc/on_logout() + SIGNAL_HANDLER + STOP_PROCESSING(SSkinesis, src) + +/datum/cable_click_manager/proc/on_swap_hands() + SIGNAL_HANDLER + if(!catcher) + return + + spawn(0) // There is no signal for AFTER you swap hands + if(!user) + return + + if(user.get_active_held_item() == parent) + catcher.mouse_opacity = MOUSE_OPACITY_OPAQUE + START_PROCESSING(SSkinesis, src) + else + disable_catcher() + +/datum/cable_click_manager/proc/intercept_click(datum/source, atom/A, params) + SIGNAL_HANDLER + + if(!catcher) + return + + if(!params[RIGHT_CLICK]) + return + + if(catcher.mouse_opacity != MOUSE_OPACITY_OPAQUE) + enable_catcher() + to_chat(usr, span_obviousnotice("Advanced wire placement enabled.")) + return COMSIG_MOB_CANCEL_CLICKON + +/atom/movable/screen/fullscreen/cursor_catcher/cable + alpha = 0 + mouse_opacity = MOUSE_OPACITY_OPAQUE diff --git a/code/datums/callback.dm b/code/datums/callback.dm index 047ec242c2a9..c2d32cd38294 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -96,6 +96,22 @@ else call(thingtocall, proctocall)(arglist(calling_arguments)) + +/** + * Qdel a callback datum + * This is not allowed and will stack trace. callback datums are structs, if they are referenced they exist + * + * Arguments + * * force set to true to force the deletion to be allowed. + * * ... an optional list of extra arguments to pass to the proc + */ +/datum/callback/Destroy(force=FALSE, ...) + SHOULD_CALL_PARENT(FALSE) + if (force) + return ..() + stack_trace("Callbacks can not be qdeleted. If they are referenced, they must exist. ([object == GLOBAL_PROC ? GLOBAL_PROC : object.type] [delegate])") + return QDEL_HINT_LETMELIVE + /** * Invoke this callback * diff --git a/code/datums/cartesian_plane.dm b/code/datums/cartesian_plane.dm new file mode 100644 index 000000000000..56030039bb4e --- /dev/null +++ b/code/datums/cartesian_plane.dm @@ -0,0 +1,94 @@ +/* + * For a new plane of (x,x'),(y,y') : offset_x,offset_y,x_size,y_size + * + * //Sign changes must account for 0-crossing + * (-100,100),(0,0) : 101,1,201,1 + * //Otherwise, it does not + * (-100,-50),(0,0) : 101,1,50,1 + * (50,100) , (0,0) : -49,1,50,1 + */ + +/datum/cartesian_plane + /// Lower bound of the X axis + VAR_PRIVATE/x1 + /// Upper bound of the X axis + VAR_PRIVATE/x2 + /// Lower bound of the Y axis + VAR_PRIVATE/y1 + /// Upper bound of the Y axis + VAR_PRIVATE/y2 + + /// Data Storage Hellscape:tm: + VAR_PRIVATE/list/plane + + /// Added to any accesses to the first array + VAR_PRIVATE/offset_x + /// Added to any accesses of a nested array + VAR_PRIVATE/offset_y + + /// The logical size of the X axis + var/x_size + /// The logical size of the Y axis + var/y_size + +/datum/cartesian_plane/New(x1, x2, y1, y2) + src.x1 = x1 + src.x2 = x2 + src.y1 = y1 + src.y2 = y2 + + // Calculate the offsets to push the lower bound within a usable range. + offset_x = 1 - x1 + offset_y = 1 - y1 + + x_size = (x1 < 0 && x2 > 0) ? abs(x1 - x2) + 1 : abs(x1 - x2) + y_size = (y1 < 0 && y2 > 0) ? abs(y1 - y2) + 1 : abs(y1 - y2) + + plane = new/list(x_size, y_size) + +/// Pass in a logical coordinate and see if it's in the map. This does not take array coordinates! +/datum/cartesian_plane/proc/SanitizeCoordinate(x, y) + PRIVATE_PROC(TRUE) + if(x > x2 || x < x1 || y < y1 || y > y2) + return FALSE + return TRUE + +/// Returns the bounds of the map as a list +/datum/cartesian_plane/proc/return_bounds() + return list(x1, x2, y1, y2) + +/// Returns the offsets of the map as a list +/datum/cartesian_plane/proc/return_offsets() + return list(offset_x, offset_y) + +/// Get the content at a given coordinate +/datum/cartesian_plane/proc/return_coordinate(x, y) + if(!SanitizeCoordinate(x,y)) + CRASH("Received invalid coordinate for cartesian plane.") + + return plane[x + offset_x][y + offset_y] + +/// Set the content at a given coordinate +/datum/cartesian_plane/proc/set_coordinate(x, y, content) + if(!SanitizeCoordinate(x,y)) + CRASH("Received invalid coordinate for cartesian plane.") + + plane[x + offset_x][y + offset_y] = content + +/// Return the contents of a block given logical coordinates +/datum/cartesian_plane/proc/return_block(x1, x2, y1, y2) + . = list() + + for(var/_x in (x1 + offset_x) to (x2 + offset_x)) + for(var/_y in (y1 + offset_y) to (y2 + offset_y)) + var/foo = plane[_x][_y] + if(foo) + . += foo + +/// Returns the contents of a block of coordinates in chebyshev range from the given coordinate +/datum/cartesian_plane/proc/return_range(x, y, range) + var/x1 = clamp(x-range, src.x1, src.x2) + var/x2 = clamp(x+range, src.x1, src.x2) + var/y1 = clamp(y-range, src.y1, src.y2) + var/y2 = clamp(y+range, src.y1, src.y2) + return return_block(x1, x2, y1, y2) diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index d80a4b47f04f..68c20eb8d43b 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -123,12 +123,6 @@ if (length_char(text) > maxlen) text = copytext_char(text, 1, maxlen + 1) + "..." // BYOND index moment - // Calculate target color if not already present - if (!target.chat_color || target.chat_color_name != target.name) - target.chat_color = colorize_string(target.name) - target.chat_color_darkened = colorize_string(target.name, 0.85, 0.85) - target.chat_color_name = target.name - // Get rid of any URL schemes that might cause BYOND to automatically wrap something in an anchor tag var/static/regex/url_scheme = new(@"[A-Za-z][A-Za-z0-9+-\.]*:\/\/", "g") text = replacetext(text, url_scheme, "") @@ -154,11 +148,10 @@ LAZYADD(prefixes, "\icon[r_icon]") // Append language icon if the language uses one - var/datum/language/language_instance = GLOB.language_datum_instances[language] - if (language_instance?.display_icon(owner)) + if (language?.display_icon(owner)) 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 = icon(language.icon, icon_state = language.icon_state) language_icon.Scale(CHAT_MESSAGE_ICON_SIZE, CHAT_MESSAGE_ICON_SIZE) LAZYSET(language_icons, language, language_icon) LAZYADD(prefixes, "\icon[language_icon]") @@ -299,8 +292,7 @@ if(runechat_flags & EMOTE_MESSAGE) new /datum/chatmessage(raw_message, sound_loc || speaker, src, message_language, list("emote", "italics")) else - new /datum/chatmessage(lang_treat(speaker, message_language, raw_message, spans, null, TRUE), sound_loc || speaker, src, message_language, spans) - + new /datum/chatmessage(raw_message, sound_loc || speaker, src, message_language, spans) // Tweak these defines to change the available color ranges #define CM_COLOR_SAT_MIN 0.6 @@ -318,7 +310,7 @@ * * 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) +/proc/colorize_string(name, sat_shift = 1, lum_shift = 1) // seed to help randomness var/static/rseed = rand(1,26) @@ -363,3 +355,12 @@ #undef CHAT_LAYER_Z_STEP #undef CHAT_LAYER_MAX_Z #undef CHAT_MESSAGE_ICON_SIZE + +/atom/proc/update_name_chat_color(name) + return + +/mob/update_name_chat_color(name) + if (!chat_color || (chat_color_name != name)) + chat_color = colorize_string(name, 0.5) + chat_color_darkened = colorize_string(name, 0.5, 0.8) + chat_color_name = name diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index a61e18834153..05a05872b4aa 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -29,7 +29,7 @@ /datum/cinematic var/id = CINEMATIC_DEFAULT var/list/watching = list() //List of clients watching this - var/list/locked = list() //Who had notransform set during the cinematic + var/list/datum/weakref/locked = list() //Who had notransform set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones var/atom/movable/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) @@ -40,20 +40,20 @@ screen = new(src) /datum/cinematic/Destroy() - for(var/CC in watching) - if(!CC) - continue - var/client/C = CC + for(var/client/C in watching) C.mob.clear_fullscreen("cinematic") C.screen -= screen + watching = null QDEL_NULL(screen) - QDEL_NULL(special_callback) - for(var/MM in locked) - if(!MM) + special_callback = null + + for(var/datum/weakref/W in locked) + var/mob/M = W.resolve() + if(!M) continue - var/mob/M = MM M.notransform = FALSE + locked = null return ..() @@ -95,10 +95,11 @@ SIGNAL_HANDLER if(!M.notransform) - locked += M + locked += WEAKREF(M) M.notransform = TRUE //Should this be done for non-global cinematics or even at all ? if(!C) return + watching += C M.overlay_fullscreen("cinematic",/atom/movable/screen/fullscreen/cinematic_backdrop) C.screen += screen diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 7f527e2b4ed3..caa642e2edbe 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -194,7 +194,7 @@ var/list/sig_types = islist(sig_type_or_types) ? sig_type_or_types : list(sig_type_or_types) for(var/sig_type in sig_types) if(!override && procs[target][sig_type]) - stack_trace("[sig_type] overridden. Use override = TRUE to suppress this warning") + stack_trace("[sig_type] overridden for [target] (Existing Proc:[procs[target][sig_type]]). Use override = TRUE to suppress this warning") procs[target][sig_type] = proctype diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm index 4a96313513a2..6252866788b1 100644 --- a/code/datums/components/acid.dm +++ b/code/datums/components/acid.dm @@ -12,8 +12,6 @@ var/acid_volume /// The maximum volume of acid on the parent [/atom]. var/max_volume = INFINITY - /// The ambiant sound of acid eating away at the parent [/atom]. - var/datum/looping_sound/acid/sizzle /// Used exclusively for melting turfs. TODO: Move integrity to the atom level so that this can be dealt with there. var/parent_integrity = 30 /// How far the acid melting of turfs has progressed @@ -50,14 +48,11 @@ var/atom/parent_atom = parent RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) parent_atom.update_appearance() - sizzle = new(parent, TRUE) START_PROCESSING(SSacid, src) /datum/component/acid/Destroy(force, silent) STOP_PROCESSING(SSacid, src) - QDEL_NULL(sizzle) - if(process_effect) - QDEL_NULL(process_effect) + process_effect = null UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS) if(parent && !QDELING(parent)) var/atom/parent_atom = parent @@ -105,6 +100,7 @@ /datum/component/acid/proc/process_obj(obj/target, delta_time) if(target.resistance_flags & ACID_PROOF) return + target.take_damage(min(1 + round(sqrt(acid_power * acid_volume)*0.3), OBJ_ACID_DAMAGE_MAX) * delta_time, BURN, ACID, 0) /// Handles processing on a [/mob/living]. @@ -148,7 +144,7 @@ /datum/component/acid/proc/on_update_overlays(atom/parent_atom, list/overlays) SIGNAL_HANDLER - overlays += mutable_appearance('icons/effects/acid.dmi', parent_atom.custom_acid_overlay || ACID_OVERLAY_DEFAULT) + overlays += mutable_appearance('icons/effects/acid.dmi', ACID_OVERLAY_DEFAULT) /// Alerts any examiners to the acid on the parent atom. /datum/component/acid/proc/on_examine(atom/A, mob/user, list/examine_list) @@ -191,12 +187,11 @@ return NONE var/obj/item/bodypart/affecting = user.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(!affecting?.receive_damage(0, 5)) + if(!affecting?.receive_damage(0, 5, modifiers = NONE)) return NONE to_chat(user, span_warning("The acid on \the [parent_atom] burns your hand!")) playsound(parent_atom, 'sound/weapons/sear.ogg', 50, TRUE) - user.update_damage_overlays() return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/datums/components/action_item_overlay.dm b/code/datums/components/action_item_overlay.dm index 66d2ec012fb0..b40193ffdf23 100644 --- a/code/datums/components/action_item_overlay.dm +++ b/code/datums/components/action_item_overlay.dm @@ -24,7 +24,7 @@ /datum/component/action_item_overlay/Destroy(force, silent) item_ref = null - QDEL_NULL(item_callback) + item_callback = null item_appearance = null return ..() diff --git a/code/datums/components/anti_magic.dm b/code/datums/components/anti_magic.dm index 6f0e541ac43b..3cb89a585567 100644 --- a/code/datums/components/anti_magic.dm +++ b/code/datums/components/anti_magic.dm @@ -56,8 +56,8 @@ src.expiration = expiration /datum/component/anti_magic/Destroy(force, silent) - QDEL_NULL(drain_antimagic) - QDEL_NULL(expiration) + drain_antimagic = null + expiration = null return ..() /datum/component/anti_magic/proc/on_equip(datum/source, mob/equipper, slot) diff --git a/code/datums/components/armor_plate.dm b/code/datums/components/armor_plate.dm index db2ff56763b5..355c6eda8890 100644 --- a/code/datums/components/armor_plate.dm +++ b/code/datums/components/armor_plate.dm @@ -2,7 +2,7 @@ var/amount = 0 var/maxamount = 3 var/upgrade_item = /obj/item/stack/sheet/animalhide/goliath_hide - var/datum/armor/added_armor = list(MELEE = 10) + var/datum/armor/added_armor = list(BLUNT = 10) var/upgrade_name /datum/component/armor_plate/Initialize(_maxamount,obj/item/_upgrade_item,datum/armor/_added_armor) @@ -68,7 +68,7 @@ var/obj/O = parent amount++ - O.armor = O.armor.attachArmor(added_armor) + O.setArmor(O.returnArmor().attachArmor(added_armor)) if(ismecha(O)) var/obj/vehicle/sealed/mecha/R = O diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index c423053ae5cc..30ddcd961692 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -4,10 +4,10 @@ */ /datum/component/bloodysoles /// The type of the last grub pool we stepped in, used to decide the type of footprints to make - var/last_blood_state = BLOOD_STATE_NOT_BLOODY + var/last_blood_color = null /// How much of each grubby type we have on our feet - var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0,BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) + var/list/bloody_shoes = list() /// The ITEM_SLOT_* slot the item is equipped on, if it is. var/equipped_slot @@ -21,9 +21,12 @@ /// The world.time when we last picked up blood var/last_pickup + var/blood_print = BLOOD_PRINT_HUMAN + /datum/component/bloodysoles/Initialize() if(!isclothing(parent)) return COMPONENT_INCOMPATIBLE + parent_atom = parent RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) @@ -55,13 +58,13 @@ /datum/component/bloodysoles/proc/reset_bloody_shoes() - bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_OIL = 0, BLOOD_STATE_NOT_BLOODY = 0) - on_changed_bloody_shoes(BLOOD_STATE_NOT_BLOODY) + bloody_shoes = list() + on_changed_bloody_shoes() ///lowers bloody_shoes[index] by adjust_by /datum/component/bloodysoles/proc/adjust_bloody_shoes(index, adjust_by) bloody_shoes[index] = max(bloody_shoes[index] - adjust_by, 0) - on_changed_bloody_shoes() + on_changed_bloody_shoes(index) /datum/component/bloodysoles/proc/set_bloody_shoes(index, new_value) bloody_shoes[index] = new_value @@ -69,10 +72,12 @@ ///called whenever the value of bloody_soles changes /datum/component/bloodysoles/proc/on_changed_bloody_shoes(index) - if(index && index != last_blood_state) - last_blood_state = index + if(index && index != last_blood_color) + last_blood_color = index + if(!wielder) return + if(bloody_shoes[index] <= BLOOD_FOOTPRINTS_MIN * 2)//need twice that amount to make footprints UnregisterSignal(wielder, COMSIG_MOVABLE_MOVED) else @@ -83,26 +88,39 @@ */ /datum/component/bloodysoles/proc/share_blood(obj/effect/decal/cleanable/pool) // Share the blood between our boots and the blood pool - var/total_bloodiness = pool.bloodiness + bloody_shoes[pool.blood_state] + var/total_bloodiness = pool.bloodiness + bloody_shoes[pool.blood_color] // We can however be limited by how much blood we can hold var/new_our_bloodiness = min(BLOOD_ITEM_MAX, total_bloodiness / 2) - set_bloody_shoes(pool.blood_state, new_our_bloodiness) + set_bloody_shoes(pool.blood_color, new_our_bloodiness) pool.bloodiness = total_bloodiness - new_our_bloodiness // Give the pool the remaining blood incase we were limited if(HAS_TRAIT(parent_atom, TRAIT_LIGHT_STEP)) //the character is agile enough to don't mess their clothing and hands just from one blood splatter at floor return TRUE - parent_atom.add_blood_DNA(pool.return_blood_DNA()) + if(ishuman(parent_atom)) + var/bloody_slots = ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING|ITEM_SLOT_FEET + var/mob/living/carbon/human/to_bloody = parent_atom + if(to_bloody.body_position == LYING_DOWN) + bloody_slots |= ITEM_SLOT_HEAD|ITEM_SLOT_MASK|ITEM_SLOT_GLOVES + + to_bloody.add_blood_DNA_to_items(pool.return_blood_DNA(), bloody_slots) + + else + parent_atom.add_blood_DNA(pool.return_blood_DNA()) + + if(pool.bloodiness <= 0) + qdel(pool) + update_icon() /** - * Find a blood decal on a turf that matches our last_blood_state + * Find a blood decal on a turf that matches our last_blood_color */ -/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null) +/datum/component/bloodysoles/proc/find_pool_by_blood_state(turf/turfLoc, typeFilter = null, blood_print) for(var/obj/effect/decal/cleanable/blood/pool in turfLoc) - if(pool.blood_state == last_blood_state && (!typeFilter || istype(pool, typeFilter))) + if(pool.blood_color == last_blood_color && pool.blood_print == blood_print && (!typeFilter || istype(pool, typeFilter))) return pool /** @@ -128,7 +146,7 @@ equipped_slot = slot wielder = equipper - if(bloody_shoes[last_blood_state] > BLOOD_FOOTPRINTS_MIN * 2) + if(bloody_shoes[last_blood_color] > BLOOD_FOOTPRINTS_MIN * 2) RegisterSignal(wielder, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) RegisterSignal(wielder, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood)) @@ -150,40 +168,41 @@ /datum/component/bloodysoles/proc/on_moved(datum/source, OldLoc, Dir, Forced) SIGNAL_HANDLER - if(bloody_shoes[last_blood_state] == 0) + if(!bloody_shoes[last_blood_color]) return if(QDELETED(wielder) || is_obscured()) return if(wielder.body_position == LYING_DOWN || !wielder.has_gravity(wielder.loc)) return - var/half_our_blood = bloody_shoes[last_blood_state] / 2 + var/half_our_blood = bloody_shoes[last_blood_color] / 2 + + var/blood_print = wielder.get_blood_print() // Add footprints in old loc if we have enough cream if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) var/turf/oldLocTurf = get_turf(OldLoc) - var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints) + var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, blood_print) if(oldLocFP) // Footprints found in the tile we left, add us to it add_parent_to_footprint(oldLocFP) if (!(oldLocFP.exited_dirs & wielder.dir)) oldLocFP.exited_dirs |= wielder.dir oldLocFP.update_appearance() - else if(find_pool_by_blood_state(oldLocTurf)) + + else if(find_pool_by_blood_state(oldLocTurf, blood_print = blood_print)) // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it - adjust_bloody_shoes(last_blood_state, half_our_blood) + adjust_bloody_shoes(last_blood_color, half_our_blood) update_icon() - oldLocFP = new(oldLocTurf) + oldLocFP = new(oldLocTurf, null, parent_atom.return_blood_DNA(), blood_print) if(!QDELETED(oldLocFP)) ///prints merged - oldLocFP.blood_state = last_blood_state oldLocFP.exited_dirs |= wielder.dir add_parent_to_footprint(oldLocFP) oldLocFP.bloodiness = half_our_blood - oldLocFP.add_blood_DNA(parent_atom.return_blood_DNA()) oldLocFP.update_appearance() - half_our_blood = bloody_shoes[last_blood_state] / 2 + half_our_blood = bloody_shoes[last_blood_color] / 2 // If we picked up the blood on this tick in on_step_blood, don't make footprints at the same place if(last_pickup && last_pickup == world.time) @@ -191,16 +210,15 @@ // Create new footprints if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) - adjust_bloody_shoes(last_blood_state, half_our_blood) + adjust_bloody_shoes(last_blood_color, half_our_blood) update_icon() - var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom)) + var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), null, parent_atom.return_blood_DNA(), blood_print) if(!QDELETED(FP)) ///prints merged - FP.blood_state = last_blood_state + FP.blood_color = last_blood_color FP.entered_dirs |= wielder.dir add_parent_to_footprint(FP) FP.bloodiness = half_our_blood - FP.add_blood_DNA(parent_atom.return_blood_DNA()) FP.update_appearance() @@ -215,11 +233,11 @@ if(QDELETED(wielder) || is_obscured()) return - if(istype(pool, /obj/effect/decal/cleanable/blood/footprints) && pool.blood_state == last_blood_state) + if(istype(pool, /obj/effect/decal/cleanable/blood/footprints) && pool.blood_color == last_blood_color) // The pool we stepped in was actually footprints with the same type var/obj/effect/decal/cleanable/blood/footprints/pool_FP = pool add_parent_to_footprint(pool_FP) - if((bloody_shoes[last_blood_state] / 2) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir)) + if((bloody_shoes[last_blood_color] / 2) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir)) // If our feet are bloody enough, add an entered dir pool_FP.entered_dirs |= wielder.dir pool_FP.update_appearance() @@ -234,7 +252,7 @@ /datum/component/bloodysoles/proc/on_clean(datum/source, clean_types) SIGNAL_HANDLER - if(!(clean_types & CLEAN_TYPE_BLOOD) || last_blood_state == BLOOD_STATE_NOT_BLOODY) + if(!(clean_types & CLEAN_TYPE_BLOOD) || last_blood_color == null) return NONE reset_bloody_shoes() @@ -246,16 +264,15 @@ * Like its parent but can be applied to carbon mobs instead of clothing items */ /datum/component/bloodysoles/feet - var/static/mutable_appearance/bloody_feet -/datum/component/bloodysoles/feet/Initialize() +/datum/component/bloodysoles/feet/Initialize(blood_print) if(!iscarbon(parent)) return COMPONENT_INCOMPATIBLE + parent_atom = parent wielder = parent - - if(!bloody_feet) - bloody_feet = mutable_appearance('icons/effects/blood.dmi', "shoeblood", SHOES_LAYER) + if(blood_print) + src.blood_print = blood_print RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(on_clean)) RegisterSignal(parent, COMSIG_STEP_ON_BLOOD, PROC_REF(on_step_blood)) @@ -267,26 +284,21 @@ var/mob/living/carbon/human/human = wielder if(NOBLOODOVERLAY in human.dna.species.species_traits) return - if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured()) + var/obj/item/bodypart/leg = human.get_bodypart(BODY_ZONE_R_LEG) || human.get_bodypart(BODY_ZONE_L_LEG) + if(!leg?.icon_bloodycover) + return + + if(length(bloody_shoes) && !is_obscured()) human.remove_overlay(SHOES_LAYER) - human.overlays_standing[SHOES_LAYER] = bloody_feet + var/image/blood_overlay = image(leg.icon_bloodycover, "shoeblood") + blood_overlay.color = last_blood_color + human.overlays_standing[SHOES_LAYER] = blood_overlay human.apply_overlay(SHOES_LAYER) else human.update_worn_shoes() /datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP) - if(!ishuman(wielder)) - FP.species_types |= "unknown" - return - - // Find any leg of our human and add that to the footprint, instead of the default which is to just add the human type - for(var/X in wielder.bodyparts) - var/obj/item/bodypart/affecting = X - if(affecting.body_part == LEG_RIGHT || affecting.body_part == LEG_LEFT) - if(!affecting.bodypart_disabled) - FP.species_types |= affecting.limb_id - break - + return /datum/component/bloodysoles/feet/is_obscured() if(wielder.shoes) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 7f93831b78a2..6574667a4b2b 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -29,6 +29,7 @@ can_be_blunt = _can_be_blunt if(_butcher_callback) butcher_callback = _butcher_callback + if(isitem(parent)) RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(onItemAttack)) @@ -40,49 +41,12 @@ INVOKE_ASYNC(src, PROC_REF(startButcher), source, M, user) return COMPONENT_CANCEL_ATTACK_CHAIN - if(ishuman(M) && source.force && (source.sharpness & SHARP_EDGED)) - var/mob/living/carbon/human/H = M - if((user.pulling == H && user.grab_state >= GRAB_AGGRESSIVE) && user.zone_selected == BODY_ZONE_HEAD) // Only aggressive grabbed can be sliced. - if(H.has_status_effect(/datum/status_effect/neck_slice)) - user.show_message(span_warning("[H]'s neck has already been already cut, you can't make the bleeding any worse!"), MSG_VISUAL, \ - span_warning("Their neck has already been already cut, you can't make the bleeding any worse!")) - return COMPONENT_CANCEL_ATTACK_CHAIN - INVOKE_ASYNC(src, PROC_REF(startNeckSlice), source, H, user) - return COMPONENT_CANCEL_ATTACK_CHAIN - /datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user) to_chat(user, span_notice("You begin to butcher [M]...")) playsound(M.loc, butcher_sound, 50, TRUE, -1) if(do_after(user, M, speed, DO_PUBLIC, display = parent) && M.Adjacent(source)) Butcher(user, M) -/datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user) - if(DOING_INTERACTION_WITH_TARGET(user, H)) - to_chat(user, span_warning("You're already interacting with [H]!")) - return - - user.visible_message(span_danger("[user] is slitting [H]'s throat!"), \ - span_danger("You start slicing [H]'s throat!"), \ - span_hear("You hear a cutting noise!"), ignored_mobs = H) - H.show_message(span_userdanger("Your throat is being slit by [user]!"), MSG_VISUAL, \ - span_userdanger("Something is cutting into your neck!"), NONE) - log_combat(user, H, "attempted throat slitting", source) - - playsound(H.loc, butcher_sound, 50, TRUE, -1) - if(do_after(user, H, clamp(500 / source.force, 30, 100), DO_PUBLIC, display = parent) && H.Adjacent(source)) - if(H.has_status_effect(/datum/status_effect/neck_slice)) - user.show_message(span_warning("[H]'s neck has already been already cut, you can't make the bleeding any worse!"), MSG_VISUAL, \ - span_warning("Their neck has already been already cut, you can't make the bleeding any worse!")) - return - - H.visible_message(span_danger("[user] slits [H]'s throat!"), \ - span_userdanger("[user] slits your throat...")) - log_combat(user, H, "wounded via throat slitting", source) - var/obj/item/bodypart/slit_throat = H.get_bodypart(BODY_ZONE_HEAD) - - slit_throat.create_wound_easy(/datum/wound/cut/flesh, 30) - H.apply_status_effect(/datum/status_effect/neck_slice) - /** * Handles a user butchering a target * diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index 794ca5767c6f..bf736b99b4ac 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -83,7 +83,7 @@ if(H.buckled) //if they're buckled to something, that something should be checked instead. return - if(H.body_position == LYING_DOWN && !(flags & CALTROP_NOCRAWL)) //if we're not standing we cant step on the caltrop + if(H.body_position == LYING_DOWN && (flags & CALTROP_NOCRAWL)) //if we're not standing we cant step on the caltrop return var/picked_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) @@ -91,7 +91,7 @@ if(!istype(O)) return - if(!IS_ORGANIC_LIMB(O)) + if(O.bodypart_flags & BP_NO_PAIN) return if (!(flags & CALTROP_BYPASS_SHOES)) diff --git a/code/datums/components/carbon_sprint.dm b/code/datums/components/carbon_sprint.dm index 56ce5d8b0551..c9b06eae3a28 100644 --- a/code/datums/components/carbon_sprint.dm +++ b/code/datums/components/carbon_sprint.dm @@ -26,40 +26,42 @@ /datum/component/carbon_sprint/proc/onMobMove(datum/source, list/move_args) var/direct = move_args[MOVE_ARG_DIRECTION] - if(SEND_SIGNAL(carbon_parent, COMSIG_CARBON_PRE_SPRINT) & INTERRUPT_SPRINT) + if((SEND_SIGNAL(carbon_parent, COMSIG_CARBON_PRE_SPRINT) & INTERRUPT_SPRINT) || !can_sprint()) if(sprinting) stopSprint() return - if(sprint_key_down && !HAS_TRAIT(carbon_parent, TRAIT_NO_SPRINT)) - var/_step_size = (direct & (direct-1)) ? 1.4 : 1 //If we're moving diagonally, we're taking roughly 1.4x step size - if(!sprinting) - sprinting = TRUE - carbon_parent.set_move_intent(MOVE_INTENT_SPRINT) - dust.appear("sprint_cloud", direct, get_turf(carbon_parent), 0.6 SECONDS) - last_dust = world.time - sustained_moves += _step_size + var/turf/T = move_args[MOVE_ARG_NEW_LOC] + if(!isturf(T)) + return + if(!carbon_parent.can_step_into(T)) + return - else if(world.time > last_dust + STAMINA_SUSTAINED_RUN_GRACE) - if(direct & carbon_parent.last_move) - if((sustained_moves < STAMINA_SUSTAINED_SPRINT_THRESHOLD) && ((sustained_moves + _step_size) >= STAMINA_SUSTAINED_SPRINT_THRESHOLD)) - dust.appear("sprint_cloud_small", direct, get_turf(carbon_parent), 0.4 SECONDS) - last_dust = world.time - sustained_moves += _step_size + var/_step_size = (direct & (direct-1)) ? 1.4 : 1 //If we're moving diagonally, we're taking roughly 1.4x step size + if(!sprinting) + sprinting = TRUE + carbon_parent.set_move_intent(MOVE_INTENT_SPRINT) + dust.appear("sprint_cloud", direct, get_turf(carbon_parent), 0.6 SECONDS) + last_dust = world.time + sustained_moves += _step_size - else - if(sustained_moves >= STAMINA_SUSTAINED_SPRINT_THRESHOLD) - dust.appear("sprint_cloud_small", direct, get_turf(carbon_parent), 0.4 SECONDS) - last_dust = world.time - if(direct & turn(carbon_parent.last_move, 180)) - dust.appear("sprint_cloud_tiny", direct, get_turf(carbon_parent), 0.3 SECONDS) - last_dust = world.time - sustained_moves = 0 + else if(world.time > last_dust + STAMINA_SUSTAINED_RUN_GRACE) + if(direct & carbon_parent.last_move) + if((sustained_moves < STAMINA_SUSTAINED_SPRINT_THRESHOLD) && ((sustained_moves + _step_size) >= STAMINA_SUSTAINED_SPRINT_THRESHOLD)) + dust.appear("sprint_cloud_small", direct, get_turf(carbon_parent), 0.4 SECONDS) + last_dust = world.time + sustained_moves += _step_size - carbon_parent.stamina.adjust(-STAMINA_SPRINT_COST) + else + if(sustained_moves >= STAMINA_SUSTAINED_SPRINT_THRESHOLD) + dust.appear("sprint_cloud_small", direct, get_turf(carbon_parent), 0.4 SECONDS) + last_dust = world.time + if(direct & turn(carbon_parent.last_move, 180)) + dust.appear("sprint_cloud_tiny", direct, get_turf(carbon_parent), 0.3 SECONDS) + last_dust = world.time + sustained_moves = 0 - else if(sprinting) - stopSprint() + carbon_parent.stamina.adjust(-STAMINA_SPRINT_COST) /datum/component/carbon_sprint/proc/keyDown() sprint_key_down = TRUE @@ -73,3 +75,15 @@ last_dust = null carbon_parent.set_move_intent(MOVE_INTENT_RUN) +/datum/component/carbon_sprint/proc/can_sprint() + . = TRUE + + if(!sprint_key_down) + return FALSE + + if(carbon_parent.movement_type & (FLOATING|FLYING|VENTCRAWLING|PHASING)) + return FALSE + + if(HAS_TRAIT(carbon_parent, TRAIT_NO_SPRINT)) + return FALSE + diff --git a/code/datums/components/chasm.dm b/code/datums/components/chasm.dm index 6b35a4bc7716..504724410bc8 100644 --- a/code/datums/components/chasm.dm +++ b/code/datums/components/chasm.dm @@ -20,12 +20,9 @@ /obj/effect/hotspot, /obj/effect/landmark, /obj/effect/temp_visual, - /obj/effect/light_emitter/tendril, - /obj/effect/collapse, /obj/effect/particle_effect/ion_trails, /obj/effect/dummy/phased_mob, /obj/effect/mapping_helpers, - /obj/effect/wisp, )) /datum/component/chasm/Initialize(turf/target) @@ -41,7 +38,7 @@ /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 diff --git a/code/datums/components/codeword_hearing.dm b/code/datums/components/codeword_hearing.dm index a0d0ea967caa..9b7b1efb496e 100644 --- a/code/datums/components/codeword_hearing.dm +++ b/code/datums/components/codeword_hearing.dm @@ -37,6 +37,14 @@ /datum/component/codeword_hearing/proc/handle_hearing(datum/source, list/hearing_args) SIGNAL_HANDLER + var/mob/living/mob_owner = parent + if(!istype(mob_owner)) + return + + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(!L?.can_receive_language(mob_owner) || !mob_owner.has_language(L)) + return + var/message = hearing_args[HEARING_RAW_MESSAGE] message = replace_regex.Replace(message, "$1") hearing_args[HEARING_RAW_MESSAGE] = message diff --git a/code/datums/components/construction.dm b/code/datums/components/construction.dm index 08987dc04daa..ea3538ff025c 100644 --- a/code/datums/components/construction.dm +++ b/code/datums/components/construction.dm @@ -91,8 +91,9 @@ . = user.transferItemToLoc(I, parent) // Using stacks - else if(istype(I, /obj/item/stack)) - . = I.use_tool(parent, user, 0, volume=50, amount=current_step["amount"]) + else + if(istype(I, /obj/item/stack)) + . = I.use_tool(parent, user, 0, volume=50, amount=current_step["amount"]) // Going backwards? Undo the last action. Drop/respawn the items used in last action, if any. @@ -108,8 +109,9 @@ if(located_item) located_item.forceMove(drop_location()) - else if(ispath(target_step_key, /obj/item/stack)) - new target_step_key(drop_location(), target_step["amount"]) + else + if(ispath(target_step_key, /obj/item/stack)) + new target_step_key(drop_location(), target_step["amount"]) /datum/component/construction/proc/spawn_result() // Some constructions result in new components being added. diff --git a/code/datums/components/conveyor_movement.dm b/code/datums/components/conveyor_movement.dm index 99baf5be9418..695d615618b6 100644 --- a/code/datums/components/conveyor_movement.dm +++ b/code/datums/components/conveyor_movement.dm @@ -15,7 +15,7 @@ if(!start_delay) start_delay = speed var/atom/movable/moving_parent = parent - var/datum/move_loop/loop = SSmove_manager.move(moving_parent, direction, delay = start_delay, subsystem = SSconveyors, flags=MOVEMENT_LOOP_IGNORE_PRIORITY) + var/datum/move_loop/loop = SSmove_manager.move(moving_parent, direction, delay = start_delay, subsystem = SSconveyors, flags=MOVEMENT_LOOP_IGNORE_PRIORITY | MOVEMENT_LOOP_OUTSIDE_CONTROL) RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(should_move)) RegisterSignal(loop, COMSIG_PARENT_QDELETING, PROC_REF(loop_ended)) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 708163108298..66c91930cbfb 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -6,7 +6,7 @@ SIGNAL_HANDLER var/datum/hud/H = user.hud_used - var/atom/movable/screen/craft/C = new() + var/atom/movable/screen/craft/C = new(null, H) C.icon = H.ui_style H.static_inventory += C CL.screen += C @@ -121,6 +121,14 @@ for(var/atom/movable/AM in range(radius_range, a)) if((AM.flags_1 & HOLOGRAM_1) || (blacklist && (AM.type in blacklist))) continue + if(istype(AM, /obj/item/bodypart)) + var/obj/item/bodypart/BP = AM + if(BP.owner) + continue + if(istype(AM, /obj/item/organ)) + var/obj/item/organ/O = AM + if(O.owner) + continue . += AM @@ -160,6 +168,14 @@ var/list/present_qualities = list() for(var/obj/item/contained_item in source.contents) + if(istype(contained_item, /obj/item/bodypart)) + var/obj/item/bodypart/BP = contained_item + if(BP.owner) + continue + if(istype(contained_item, /obj/item/organ)) + var/obj/item/organ/O = contained_item + if(O.owner) + continue if(contained_item.atom_storage) for(var/obj/item/subcontained_item in contained_item.contents) available_tools[subcontained_item.type] = TRUE @@ -274,7 +290,6 @@ if(RG.volume > amt) RG.volume -= amt data = RG.data - RC.reagents.conditional_update(RC) RG = locate(RG.type) in Deletion RG.volume = amt RG.data += data @@ -283,7 +298,6 @@ surroundings -= RC amt -= RG.volume RC.reagents.reagent_list -= RG - RC.reagents.conditional_update(RC) RGNT = locate(RG.type) in Deletion RGNT.volume += RG.volume RGNT.data += RG.data diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index 0fb0c3d6b3ce..2ae8f84df2aa 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -43,7 +43,7 @@ /obj/item/weaponcrafting/gunkit/temperature name = "temperature gun parts kit" - desc = "A suitcase containing the necessary gun parts to tranform a standard energy gun into a temperature gun. Fantastic at birthday parties and killing indigenious populations of unathi." + desc = "A suitcase containing the necessary gun parts to tranform a standard energy gun into a temperature gun. Fantastic at birthday parties." /obj/item/weaponcrafting/gunkit/beam_rifle name = "particle acceleration rifle part kit" diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 3bbb3bbef919..f89890830402 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -52,29 +52,9 @@ return TRUE return FALSE -/datum/crafting_recipe/improv_explosive - name = "IED" - result = /obj/item/grenade/iedcasing - reqs = list(/datum/reagent/fuel = 50, - /obj/item/stack/cable_coil = 1, - /obj/item/assembly/igniter = 1, - /obj/item/reagent_containers/food/drinks/soda_cans = 1) - parts = list(/obj/item/reagent_containers/food/drinks/soda_cans = 1) - time = 15 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON +// !!NOTICE!! +//All of this should *eventually* be moved to code/modules/slapcrafting or deleted entirely. Please don't add more recipes to this file. -/datum/crafting_recipe/lance - name = "Explosive Lance (Grenade)" - result = /obj/item/spear/explosive - reqs = list(/obj/item/spear = 1, - /obj/item/grenade = 1) - blacklist = list(/obj/item/spear/bonespear, /obj/item/spear/bamboospear) - parts = list(/obj/item/spear = 1, - /obj/item/grenade = 1) - time = 15 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON /datum/crafting_recipe/strobeshield name = "Strobe Shield" @@ -90,46 +70,6 @@ ..() blacklist |= subtypesof(/obj/item/shield/riot/) -/datum/crafting_recipe/molotov - name = "Molotov" - result = /obj/item/reagent_containers/food/drinks/bottle/molotov - reqs = list(/obj/item/reagent_containers/glass/rag = 1, - /obj/item/reagent_containers/food/drinks/bottle = 1) - parts = list(/obj/item/reagent_containers/food/drinks/bottle = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/stunprod - name = "Stunprod" - result = /obj/item/melee/baton/security/cattleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/teleprod - name = "Teleprod" - result = /obj/item/melee/baton/security/cattleprod/teleprod - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/rods = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/ore/bluespace_crystal = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/bola - name = "Bola" - result = /obj/item/restraints/legcuffs/bola - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/stack/sheet/iron = 6) - time = 20//15 faster than crafting them by hand! - category= CAT_WEAPONRY - subcategory = CAT_WEAPON - /datum/crafting_recipe/gonbola name = "Gonbola" result = /obj/item/restraints/legcuffs/bola/gonbola @@ -140,189 +80,15 @@ category= CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/tailclub - name = "Tail Club" - result = /obj/item/tailclub - reqs = list(/obj/item/organ/tail/lizard = 1, - /obj/item/stack/sheet/iron = 1) - blacklist = list(/obj/item/organ/tail/lizard/fake) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/tailwhip - name = "Liz O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip - reqs = list(/obj/item/organ/tail/lizard = 1, - /obj/item/stack/cable_coil = 1) - blacklist = list(/obj/item/organ/tail/lizard/fake) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - /datum/crafting_recipe/catwhip name = "Cat O' Nine Tails" - result = /obj/item/melee/chainofcommand/tailwhip/kitty + result = /obj/item/melee/chainofcommand/kitty reqs = list(/obj/item/organ/tail/cat = 1, /obj/item/stack/cable_coil = 1) time = 40 category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/reciever - name = "Modular Rifle Reciever" - tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_SAW) - result = /obj/item/weaponcrafting/receiver - reqs = list(/obj/item/stack/sheet/iron = 5, - /obj/item/stack/sticky_tape = 1, - /obj/item/screwdriver = 1, - /obj/item/assembly/mousetrap = 1) - time = 100 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/riflestock - name = "Wooden Rifle Stock" - tool_paths = list(/obj/item/hatchet) - result = /obj/item/weaponcrafting/stock - reqs = list(/obj/item/stack/sheet/mineral/wood = 8, - /obj/item/stack/sticky_tape = 1) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/advancedegun - name = "Advanced Energy Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/e_gun/nuclear - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/nuclear = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/advancedegun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/tempgun - name = "Temperature Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/temperature - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/temperature = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/tempgun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/beam_rifle - name = "Particle Acceleration Rifle" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/beam_rifle - reqs = list(/obj/item/gun/energy/e_gun = 1, - /obj/item/assembly/signaler/anomaly/flux = 1, - /obj/item/assembly/signaler/anomaly/grav = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/beam_rifle = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/beam_rifle/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/e_gun) - -/datum/crafting_recipe/ebow - name = "Energy Crossbow" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/recharge/ebow/large - reqs = list(/obj/item/gun/energy/recharge/kinetic_accelerator = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/ebow = 1, - /datum/reagent/uranium/radium = 15) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/xraylaser - name = "X-ray Laser Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/xray - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/xray = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/xraylaser/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/hellgun - name = "Hellfire Laser Gun" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/laser/hellgun - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/hellgun = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/hellgun/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/ioncarbine - name = "Ion Carbine" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/ionrifle/carbine - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/ion = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/ioncarbine/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/decloner - name = "Biological Demolecularisor" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/decloner - reqs = list(/obj/item/gun/energy/laser = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/decloner = 1, - /datum/reagent/baldium = 30, - /datum/reagent/toxin/mutagen = 40) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/decloner/New() - ..() - blacklist += subtypesof(/obj/item/gun/energy/laser) - -/datum/crafting_recipe/teslacannon - name = "Tesla Cannon" - tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = /obj/item/gun/energy/tesla_cannon - reqs = list(/obj/item/assembly/signaler/anomaly/flux = 1, - /obj/item/stack/cable_coil = 5, - /obj/item/weaponcrafting/gunkit/tesla = 1) - time = 200 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - /datum/crafting_recipe/ed209 name = "ED209" result = /mob/living/simple_animal/bot/secbot/ed209 @@ -438,7 +204,6 @@ name = "Hygienebot" result = /mob/living/simple_animal/bot/hygienebot reqs = list(/obj/item/bot_assembly/hygienebot = 1, - /obj/item/stack/ducts = 1, /obj/item/assembly/prox_sensor = 1) tool_behaviors = list(TOOL_WELDER) time = 40 @@ -456,30 +221,8 @@ time = 6 SECONDS //Has a four second do_after when building manually category = CAT_ROBOT -/datum/crafting_recipe/improvised_pneumatic_cannon //Pretty easy to obtain but - name = "Pneumatic Cannon" - result = /obj/item/pneumatic_cannon/ghetto - tool_behaviors = list(TOOL_WELDER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/iron = 4, - /obj/item/stack/package_wrap = 8, - /obj/item/pipe/quaternary = 2) - time = 50 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/flamethrower - name = "Flamethrower" - result = /obj/item/flamethrower - reqs = list(/obj/item/weldingtool = 1, - /obj/item/assembly/igniter = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/assembly/igniter = 1, - /obj/item/weldingtool = 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - time = 10 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - +//Crafting guns and ammo is cool, but needs to be redone before it fits with the game. +/* /datum/crafting_recipe/meteorslug name = "Meteorslug Shell" result = /obj/item/ammo_casing/shotgun/meteorslug @@ -556,6 +299,28 @@ category = CAT_WEAPONRY subcategory = CAT_AMMO +/datum/crafting_recipe/reciever + name = "Modular Rifle Reciever" + tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_SAW) + result = /obj/item/weaponcrafting/receiver + reqs = list(/obj/item/stack/sheet/iron = 5, + /obj/item/stack/sticky_tape = 1, + /obj/item/screwdriver = 1, + /obj/item/assembly/mousetrap = 1) + time = 100 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + +/datum/crafting_recipe/riflestock + name = "Wooden Rifle Stock" + tool_paths = list(/obj/item/hatchet) + result = /obj/item/weaponcrafting/stock + reqs = list(/obj/item/stack/sheet/mineral/wood = 8, + /obj/item/stack/sticky_tape = 1) + time = 50 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON + /datum/crafting_recipe/pipegun name = "Pipegun" result = /obj/item/gun/ballistic/rifle/boltaction/pipegun @@ -567,21 +332,7 @@ time = 50 category = CAT_WEAPONRY subcategory = CAT_WEAPON - -/datum/crafting_recipe/pipegun_prime - name = "Regal Pipegun" - always_available = FALSE - result = /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime - reqs = list(/obj/item/gun/ballistic/rifle/boltaction/pipegun = 1, - /obj/item/food/deadmouse = 1, - /datum/reagent/consumable/grey_bull = 20, - /obj/item/spear = 1, - /obj/item/storage/toolbox= 1) - tool_behaviors = list(TOOL_SCREWDRIVER) - tool_paths = list(/obj/item/clothing/gloves/color/yellow, /obj/item/clothing/mask/gas, /obj/item/melee/baton/security/cattleprod) - time = 300 //contemplate for a bit - category = CAT_WEAPONRY - subcategory = CAT_WEAPON +*/ /datum/crafting_recipe/trash_cannon name = "Trash Cannon" @@ -620,50 +371,6 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/spear - name = "Spear" - result = /obj/item/spear - reqs = list(/obj/item/restraints/handcuffs/cable = 1, - /obj/item/shard = 1, - /obj/item/stack/rods = 1) - parts = list(/obj/item/shard = 1) - time = 40 - category = CAT_WEAPONRY - subcategory = CAT_WEAPON - -/datum/crafting_recipe/lizardhat - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/organ/tail/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/lizardhat_alternate - name = "Lizard Cloche Hat" - result = /obj/item/clothing/head/lizard - time = 10 - reqs = list(/obj/item/stack/sheet/animalhide/lizard = 1) - category = CAT_CLOTHING - -/datum/crafting_recipe/kittyears - name = "Kitty Ears" - result = /obj/item/clothing/head/kitty/genuine - time = 10 - reqs = list(/obj/item/organ/tail/cat = 1, - /obj/item/organ/ears/cat = 1) - category = CAT_CLOTHING - - -/datum/crafting_recipe/radiogloves - name = "Radio Gloves" - result = /obj/item/clothing/gloves/radio - time = 15 - reqs = list(/obj/item/clothing/gloves/color/black = 1, - /obj/item/stack/cable_coil = 2, - /obj/item/radio = 1) - tool_behaviors = list(TOOL_WIRECUTTER) - category = CAT_CLOTHING - /datum/crafting_recipe/radiogloves/New() ..() blacklist |= typesof(/obj/item/radio/headset) @@ -742,39 +449,6 @@ time = 200 category = CAT_MISC -/datum/crafting_recipe/mousetrap - name = "Mouse Trap" - result = /obj/item/assembly/mousetrap - time = 10 - reqs = list(/obj/item/stack/sheet/cardboard = 1, - /obj/item/stack/rods = 1) - category = CAT_MISC - -/datum/crafting_recipe/papersack - name = "Paper Sack" - result = /obj/item/storage/box/papersack - time = 10 - reqs = list(/obj/item/paper = 5) - category = CAT_MISC - - -/datum/crafting_recipe/flashlight_eyes - name = "Flashlight Eyes" - result = /obj/item/organ/eyes/robotic/flashlight - time = 10 - reqs = list( - /obj/item/flashlight = 2, - /obj/item/restraints/handcuffs/cable = 1 - ) - category = CAT_MISC - -/datum/crafting_recipe/paperframes - name = "Paper Frames" - result = /obj/item/stack/sheet/paperframes/five - time = 10 - reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) - category = CAT_MISC - /datum/crafting_recipe/naturalpaper name = "Hand-Pressed Paper" time = 30 @@ -783,13 +457,6 @@ result = /obj/item/paper_bin/bundlenatural category = CAT_MISC -/datum/crafting_recipe/sillycup - name = "Paper Cup" - result = /obj/item/reagent_containers/food/drinks/sillycup - time = 1 SECONDS - reqs = list(/obj/item/paper = 2) - category = CAT_MISC - /datum/crafting_recipe/toysword name = "Toy Sword" reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) @@ -852,84 +519,6 @@ category = CAT_WEAPONRY subcategory = CAT_WEAPON -/datum/crafting_recipe/bonearmor - name = "Bone Armor" - result = /obj/item/clothing/suit/armor/bone - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 6) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonetalisman - name = "Bone Talisman" - result = /obj/item/clothing/accessory/talisman - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonecodpiece - name = "Skull Codpiece" - result = /obj/item/clothing/accessory/skullcodpiece - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/skilt - name = "Sinew Kilt" - result = /obj/item/clothing/accessory/skilt - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 2) - category = CAT_PRIMAL - -/datum/crafting_recipe/bracers - name = "Bone Bracers" - result = /obj/item/clothing/gloves/bracer - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/skullhelm - name = "Skull Helmet" - result = /obj/item/clothing/head/helmet/skull - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4) - category = CAT_PRIMAL - -/datum/crafting_recipe/goliathcloak - name = "Goliath Cloak" - result = /obj/item/clothing/suit/hooded/cloak/goliath - time = 50 - reqs = list(/obj/item/stack/sheet/leather = 2, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/goliath_hide = 2) //it takes 4 goliaths to make 1 cloak if the plates are skinned - category = CAT_PRIMAL - -/datum/crafting_recipe/drakecloak - name = "Ash Drake Armour" - result = /obj/item/clothing/suit/hooded/cloak/drake - time = 60 - reqs = list(/obj/item/stack/sheet/bone = 10, - /obj/item/stack/sheet/sinew = 2, - /obj/item/stack/sheet/animalhide/ashdrake = 5) - category = CAT_PRIMAL - -/datum/crafting_recipe/godslayer - name = "Godslayer Armour" - result = /obj/item/clothing/suit/hooded/cloak/godslayer - time = 60 - reqs = list(/obj/item/ice_energy_crystal = 1, /obj/item/wendigo_skull = 1, /obj/item/clockwork_alloy = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/firebrand - name = "Firebrand" - result = /obj/item/match/firebrand - time = 100 //Long construction time. Making fire is hard work. - reqs = list(/obj/item/stack/sheet/mineral/wood = 2) - category = CAT_PRIMAL - /datum/crafting_recipe/gold_horn name = "Golden Bike Horn" result = /obj/item/bikehorn/golden @@ -938,29 +527,7 @@ /obj/item/bikehorn = 1) category = CAT_MISC -/datum/crafting_recipe/bonedagger - name = "Bone Dagger" - result = /obj/item/knife/combat/bone - time = 20 - reqs = list(/obj/item/stack/sheet/bone = 2) - category = CAT_PRIMAL - -/datum/crafting_recipe/bonespear - name = "Bone Spear" - result = /obj/item/spear/bonespear - time = 30 - reqs = list(/obj/item/stack/sheet/bone = 4, - /obj/item/stack/sheet/sinew = 1) - category = CAT_PRIMAL - -/datum/crafting_recipe/boneaxe - name = "Bone Axe" - result = /obj/item/fireaxe/boneaxe - time = 50 - reqs = list(/obj/item/stack/sheet/bone = 6, - /obj/item/stack/sheet/sinew = 3) - category = CAT_PRIMAL - +/* These are all already craftable with wooden sheets!!! /datum/crafting_recipe/bonfire name = "Bonfire" time = 60 @@ -970,15 +537,7 @@ 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/rake //Category resorting incoming +/datum/crafting_recipe/rake //Category resorting incoming - but you never resorted, did you? name = "Rake" time = 30 reqs = list(/obj/item/stack/sheet/mineral/wood = 5) @@ -991,17 +550,7 @@ reqs = list(/obj/item/stack/sheet/mineral/wood = 3) result = /obj/item/reagent_containers/glass/bucket/wooden category = CAT_PRIMAL - -/datum/crafting_recipe/ore_sensor - name = "Ore Sensor" - time = 3 SECONDS - reqs = list( - /datum/reagent/brimdust = 15, - /obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 1, - ) - result = /obj/item/ore_sensor - category = CAT_PRIMAL +*/ /datum/crafting_recipe/headpike name = "Spike Head (Glass Spear)" @@ -1044,15 +593,6 @@ /obj/item/assembly/igniter = 1) category = CAT_MISC - -/datum/crafting_recipe/rcl - name = "Makeshift Rapid Pipe Cleaner Layer" - result = /obj/item/rcl/ghetto - time = 40 - tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) - reqs = list(/obj/item/stack/sheet/iron = 15) - category = CAT_MISC - /datum/crafting_recipe/mummy name = "Mummification Bandages (Mask)" result = /obj/item/clothing/mask/mummy @@ -1120,65 +660,7 @@ category = CAT_MISC tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) -/datum/crafting_recipe/rib - name = "Colossal Rib" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 10, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/rib - category = CAT_PRIMAL - -/datum/crafting_recipe/skull - name = "Skull Carving" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 6, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/skull - category = CAT_PRIMAL - -/datum/crafting_recipe/halfskull - name = "Cracked Skull Carving" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 3, - /datum/reagent/fuel/oil = 5, - ) - result = /obj/structure/statue/bone/skull/half - category = CAT_PRIMAL - -/datum/crafting_recipe/boneshovel - name = "Serrated Bone Shovel" - always_available = FALSE - reqs = list( - /obj/item/stack/sheet/bone = 4, - /datum/reagent/fuel/oil = 5, - /obj/item/shovel/spade = 1, - ) - result = /obj/item/shovel/serrated - category = CAT_PRIMAL - -/datum/crafting_recipe/lasso - name = "Bone Lasso" - reqs = list( - /obj/item/stack/sheet/bone = 1, - /obj/item/stack/sheet/sinew = 5, - ) - result = /obj/item/key/lasso - category = CAT_PRIMAL - -/datum/crafting_recipe/gripperoffbrand - name = "Improvised Gripper Gloves" - reqs = list( - /obj/item/clothing/gloves/fingerless = 1, - /obj/item/stack/sticky_tape = 1, - ) - result = /obj/item/clothing/gloves/tackler/offbrand - category = CAT_CLOTHING - +/* /datum/crafting_recipe/boh name = "Bag of Holding" reqs = list( @@ -1187,16 +669,7 @@ ) result = /obj/item/storage/backpack/holding category = CAT_CLOTHING - -/datum/crafting_recipe/ipickaxe - name = "Improvised Pickaxe" - reqs = list( - /obj/item/crowbar = 1, - /obj/item/knife = 1, - /obj/item/stack/sticky_tape = 1, - ) - result = /obj/item/pickaxe/improvised - category = CAT_MISC +*/ /datum/crafting_recipe/underwater_basket name = "Underwater Basket (Bamboo)" @@ -1306,67 +779,6 @@ ) category = CAT_MISC -/datum/crafting_recipe/alcohol_burner - name = "Alcohol burner" - result = /obj/item/burner - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/glass/beaker = 1, - /datum/reagent/consumable/ethanol = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/oil_burner - name = "Oil burner" - result = /obj/item/burner/oil - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/glass/beaker = 1, - /datum/reagent/fuel/oil = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/fuel_burner - name = "Fuel burner" - result = /obj/item/burner/fuel - time = 5 SECONDS - reqs = list(/obj/item/reagent_containers/glass/beaker = 1, - /datum/reagent/fuel = 15, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/thermometer - name = "Thermometer" - tool_behaviors = list(TOOL_WELDER) - result = /obj/item/thermometer - time = 5 SECONDS - reqs = list( - /datum/reagent/mercury = 5, - /obj/item/stack/sheet/glass = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/thermometer_alt - name = "Thermometer" - result = /obj/item/thermometer/pen - time = 5 SECONDS - reqs = list( - /datum/reagent/mercury = 5, - /obj/item/pen = 1 - ) - category = CAT_CHEMISTRY - -/datum/crafting_recipe/ph_booklet - name = "pH booklet" - result = /obj/item/ph_booklet - time = 5 SECONDS - reqs = list( - /datum/reagent/universal_indicator = 5, - /obj/item/paper = 1 - ) - category = CAT_CHEMISTRY - /datum/crafting_recipe/dropper //Maybe make a glass pipette icon? name = "Dropper" result = /obj/item/reagent_containers/dropper @@ -1387,7 +799,6 @@ /obj/item/stack/sheet/glass = 2, /obj/item/stack/sheet/iron = 2, /datum/reagent/water = 50, - /obj/item/thermometer = 1 ) machinery = list(/obj/machinery/space_heater = CRAFTING_MACHINERY_CONSUME) category = CAT_CHEMISTRY @@ -1424,22 +835,6 @@ time = 40 SECONDS category = CAT_MISC -/datum/crafting_recipe/pipe - name = "Smart pipe fitting" - tool_behaviors = list(TOOL_WRENCH) - result = /obj/item/pipe/quaternary - reqs = list(/obj/item/stack/sheet/iron = 1) - time = 0.5 SECONDS - category = CAT_ATMOSPHERIC - -/datum/crafting_recipe/pipe/on_craft_completion(mob/user, atom/result) - var/obj/item/pipe/crafted_pipe = result - crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart - crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY - crafted_pipe.p_init_dir = ALL_CARDINALS - crafted_pipe.setDir(SOUTH) - crafted_pipe.update() - /datum/crafting_recipe/layer_adapter name = "Layer manifold fitting" tool_behaviors = list(TOOL_WRENCH, TOOL_WELDER) diff --git a/code/datums/components/creamed.dm b/code/datums/components/creamed.dm index 16f5ecf0654f..6e7e19dcaf4f 100644 --- a/code/datums/components/creamed.dm +++ b/code/datums/components/creamed.dm @@ -31,7 +31,6 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( creamface.icon_state = "creampie_monkey" else creamface.icon_state = "creampie_human" - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie) else if(iscorgi(parent)) creamface.icon_state = "creampie_corgi" else if(isAI(parent)) @@ -44,8 +43,6 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list( var/atom/A = parent A.cut_overlay(creamface) qdel(creamface) - if(ishuman(A)) - SEND_SIGNAL(A, COMSIG_CLEAR_MOOD_EVENT, "creampie") return ..() /datum/component/creamed/RegisterWithParent() diff --git a/code/datums/components/dejavu.dm b/code/datums/components/dejavu.dm index 2f317d388bd8..08dc80460fd2 100644 --- a/code/datums/components/dejavu.dm +++ b/code/datums/components/dejavu.dm @@ -57,7 +57,7 @@ else if(isanimal(parent)) var/mob/living/simple_animal/M = parent - brute_loss = M.bruteloss + brute_loss = M.getBruteLoss() rewind_type = PROC_REF(rewind_animal) else if(isobj(parent)) @@ -107,7 +107,7 @@ /datum/component/dejavu/proc/rewind_animal() var/mob/living/simple_animal/master = parent - master.bruteloss = brute_loss + UNLINT(master.bruteloss = brute_loss) //Why is there no setter for this? Whatever. master.updatehealth() rewind_living() diff --git a/code/datums/components/drift.dm b/code/datums/components/drift.dm index 58bcff8acdf6..5a7b81abd632 100644 --- a/code/datums/components/drift.dm +++ b/code/datums/components/drift.dm @@ -19,7 +19,7 @@ return COMPONENT_INCOMPATIBLE . = ..() - var/flags = NONE + var/flags = MOVEMENT_LOOP_OUTSIDE_CONTROL if(instant) flags |= MOVEMENT_LOOP_START_FAST var/atom/movable/movable_parent = parent @@ -34,7 +34,7 @@ RegisterSignal(drifting_loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(after_move)) RegisterSignal(drifting_loop, COMSIG_PARENT_QDELETING, PROC_REF(loop_death)) RegisterSignal(movable_parent, COMSIG_MOVABLE_NEWTONIAN_MOVE, PROC_REF(newtonian_impulse)) - if(drifting_loop.running) + if(drifting_loop.status & MOVELOOP_STATUS_RUNNING) drifting_start(drifting_loop) // There's a good chance it'll autostart, gotta catch that var/visual_delay = movable_parent.inertia_move_delay @@ -92,14 +92,14 @@ // This way you can't ride two movements at once while drifting, since that'd be dumb as fuck RegisterSignal(movable_parent, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, PROC_REF(handle_glidesize_update)) // If you stop pulling something mid drift, I want it to retain that momentum - RegisterSignal(movable_parent, COMSIG_ATOM_NO_LONGER_PULLING, PROC_REF(stopped_pulling)) + RegisterSignal(movable_parent, COMSIG_LIVING_NO_LONGER_GRABBING, PROC_REF(stopped_pulling)) /datum/component/drift/proc/drifting_stop() SIGNAL_HANDLER var/atom/movable/movable_parent = parent movable_parent.inertia_moving = FALSE ignore_next_glide = FALSE - UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, COMSIG_ATOM_NO_LONGER_PULLING)) + UnregisterSignal(movable_parent, list(COMSIG_MOVABLE_MOVED, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, COMSIG_LIVING_NO_LONGER_GRABBING)) /datum/component/drift/proc/before_move(datum/source) SIGNAL_HANDLER @@ -108,9 +108,9 @@ old_dir = movable_parent.dir delayed = FALSE -/datum/component/drift/proc/after_move(datum/source, succeeded, visual_delay) +/datum/component/drift/proc/after_move(datum/source, result, visual_delay) SIGNAL_HANDLER - if(!succeeded) + if(result == MOVELOOP_FAILURE) qdel(src) return diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index dd5544297fb1..aba463d770cb 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -38,7 +38,7 @@ src.effects_we_clear = typecacheof(effects_we_clear) /datum/component/effect_remover/Destroy(force, silent) - QDEL_NULL(on_clear_callback) + on_clear_callback = null return ..() /datum/component/effect_remover/RegisterWithParent() diff --git a/code/datums/components/egg_layer.dm b/code/datums/components/egg_layer.dm index f47fa17c20f3..f9e62765e145 100644 --- a/code/datums/components/egg_layer.dm +++ b/code/datums/components/egg_layer.dm @@ -48,8 +48,8 @@ UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY) /datum/component/egg_layer/Destroy(force, silent) - . = ..() STOP_PROCESSING(SSobj, src) + return ..() /datum/component/egg_layer/proc/feed_food(datum/source, obj/item/food, mob/living/attacker, params) SIGNAL_HANDLER diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 6e62c46c6a73..d02a3bada9bb 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -25,7 +25,8 @@ /datum/component/embedded dupe_mode = COMPONENT_DUPE_ALLOWED - var/obj/item/bodypart/limb + var/mob/living/carbon/human/limb_owner + var/obj/item/weapon // all of this stuff is explained in _DEFINES/combat.dm @@ -59,11 +60,13 @@ jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) - if(!iscarbon(parent) || !isitem(I)) + if(!istype(parent, /obj/item/bodypart) || !isitem(I)) return COMPONENT_INCOMPATIBLE - if(part) - limb = part + var/obj/item/bodypart/limb = parent + if(limb.owner) + register_to_mob(limb.owner) + src.embed_chance = embed_chance src.fall_chance = fall_chance src.pain_chance = pain_chance @@ -80,72 +83,89 @@ if(!weapon.isEmbedHarmless()) harmful = TRUE - weapon.embedded(parent, part) - START_PROCESSING(SSdcs, src) - var/mob/living/carbon/victim = parent + var/datum/wound/W - limb._embed_object(weapon) // on the inside... on the inside... - weapon.forceMove(victim) - RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), PROC_REF(weaponDeleted)) - victim.visible_message(span_danger("[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] [victim]'s [limb.plaintext_zone]!"), span_userdanger("[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] your [limb.plaintext_zone]!")) - - var/damage = weapon.throwforce if(harmful) - victim.throw_alert(ALERT_EMBEDDED_OBJECT, /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! + var/damage = weapon.throwforce + playsound(parent,'sound/weapons/bladeslice.ogg', 40) damage += weapon.w_class * impact_pain_mult - SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) + var/post_armor_damage = damage + if(limb_owner) + var/armor = limb_owner.run_armor_check(limb.body_zone, PUNCTURE, "Your armor has protected your [limb.plaintext_zone].", "Your armor has softened a hit to your [limb.plaintext_zone].",I.armor_penetration, weak_against_armor = I.weak_against_armor) + post_armor_damage = damage * ((100-armor)/100) + + if(post_armor_damage <= 0) + return COMPONENT_INCOMPATIBLE - if(damage > 0) - var/armor = victim.run_armor_check(limb.body_zone, MELEE, "Your armor has protected your [limb.plaintext_zone].", "Your armor has softened a hit to your [limb.plaintext_zone].",I.armour_penetration, weak_against_armour = I.weak_against_armour) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage, blocked=armor, sharpness = I.sharpness) + if(limb_owner) + weapon.add_mob_blood(limb_owner)//it embedded itself in you, of course it's bloody! + limb_owner.stamina.adjust(-(pain_stam_pct * damage)) + + W = limb.create_wound(WOUND_PIERCE, damage) + LAZYADD(W.embedded_objects, weapon) + + weapon.embedded(parent, part) + + START_PROCESSING(SSembeds, src) + + limb_owner?.visible_message( + span_danger("[weapon] [harmful ? "embeds" : "sticks"] itself [harmful ? "in" : "to"] [limb_owner]'s [limb.plaintext_zone]!"), + ) + + limb._embed_object(weapon) // on the inside... on the inside... + weapon.forceMove(limb) + + if(W) + W.RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), TYPE_PROC_REF(/datum/wound, item_gone)) + RegisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), PROC_REF(weaponDeleted)) /datum/component/embedded/Destroy() - var/mob/living/carbon/victim = parent - if(victim && !victim.has_embedded_objects()) - victim.clear_alert(ALERT_EMBEDDED_OBJECT) - SEND_SIGNAL(victim, COMSIG_CLEAR_MOOD_EVENT, "embedded") - if(weapon) - UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + if(limb_owner) + unregister_from_mob(limb_owner) + weapon = null - limb = null return ..() +/datum/component/embedded/proc/register_to_mob(mob/living/carbon/human/H) + limb_owner = H + H.throw_alert(ALERT_EMBEDDED_OBJECT, /atom/movable/screen/alert/embeddedobject) + RegisterSignal(H, COMSIG_MOVABLE_MOVED, PROC_REF(jostleCheck)) + RegisterSignal(H, COMSIG_CARBON_EMBED_REMOVAL, PROC_REF(safeRemove)) + RegisterSignal(H, COMSIG_LIVING_HEALTHSCAN, PROC_REF(on_healthscan)) + +/datum/component/embedded/proc/unregister_from_mob(mob/living/carbon/human/H) + if(!H.has_embedded_objects()) + H.clear_alert(ALERT_EMBEDDED_OBJECT) + UnregisterSignal(H, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_EMBED_REMOVAL)) + limb_owner = null + /datum/component/embedded/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(jostleCheck)) - RegisterSignal(parent, COMSIG_CARBON_EMBED_RIP, PROC_REF(ripOut)) - RegisterSignal(parent, COMSIG_CARBON_EMBED_REMOVAL, PROC_REF(safeRemove)) - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(checkTweeze)) + RegisterSignal(parent, COMSIG_LIMB_REMOVE, PROC_REF(limb_removed)) + RegisterSignal(parent, COMSIG_LIMB_ATTACH, PROC_REF(limb_attached)) + RegisterSignal(parent, COMSIG_LIMB_EMBED_RIP, PROC_REF(ripOut)) /datum/component/embedded/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_EMBED_RIP, COMSIG_CARBON_EMBED_REMOVAL, COMSIG_PARENT_ATTACKBY)) + UnregisterSignal(parent, COMSIG_LIMB_REMOVE) + UnregisterSignal(parent, COMSIG_LIMB_ATTACH) + UnregisterSignal(parent, COMSIG_LIMB_EMBED_RIP) -/datum/component/embedded/process(delta_time) - var/mob/living/carbon/victim = parent +/datum/component/embedded/proc/limb_removed(obj/item/bodypart/source, mob/living/carbon/human/owner, special) + SIGNAL_HANDLER + unregister_from_mob(limb_owner) - 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 +/datum/component/embedded/proc/limb_attached(obj/item/bodypart/source, mob/living/carbon/human/owner, special) + SIGNAL_HANDLER + register_to_mob(owner) - if(victim.stat == DEAD) +/datum/component/embedded/process(delta_time) + if(!limb_owner) return - var/damage = weapon.w_class * pain_mult - var/pain_chance_current = DT_PROB_RATE(pain_chance / 100, delta_time) * 100 - if(pain_stam_pct && HAS_TRAIT_FROM(victim, TRAIT_INCAPACITATED, STAMINA)) //if it's a less-lethal embed, give them a break if they're already stamcritted - pain_chance_current *= 0.2 - damage *= 0.5 - else if(victim.body_position == LYING_DOWN) - pain_chance_current *= 0.2 - - if(harmful && prob(pain_chance_current)) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, stamina=pain_stam_pct * damage) - to_chat(victim, span_userdanger("[weapon] embedded in your [limb.plaintext_zone]] hurts!")) + if(limb_owner.stat == DEAD) + return var/fall_chance_current = DT_PROB_RATE(fall_chance / 100, delta_time) * 100 - if(victim.body_position == LYING_DOWN) + if(limb_owner.body_position == LYING_DOWN) fall_chance_current *= 0.2 if(prob(fall_chance_current)) @@ -160,61 +180,133 @@ /datum/component/embedded/proc/jostleCheck() SIGNAL_HANDLER - var/mob/living/carbon/victim = parent + var/obj/item/bodypart/limb = parent + var/chance = jostle_chance - if(victim.m_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) + if(limb_owner.m_intent == MOVE_INTENT_WALK || limb_owner.body_position == LYING_DOWN) 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, span_userdanger("[weapon] embedded in your [limb.plaintext_zone] jostles and stings!")) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, modifiers = DAMAGE_CAN_JOSTLE_BONES) + limb_owner.stamina.adjust(-(pain_stam_pct * damage)) + var/msg = pick( \ + "A spike of pain jolts your [limb.plaintext_zone] as you bump [weapon] inside.",\ + "Your movement jostles [weapon] in your [limb.plaintext_zone] painfully.",\ + "Your movement jostles [weapon] in your [limb.plaintext_zone] painfully."\ + ) + to_chat(limb_owner, span_danger(msg)) /// 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 - + var/obj/item/bodypart/limb = 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) + limb.receive_damage(brute=(1-pain_stam_pct) * damage, modifiers = DAMAGE_CAN_JOSTLE_BONES) + if(limb_owner) + limb_owner.stamina.adjust(-(pain_stam_pct * damage)) - victim.visible_message(span_danger("[weapon] falls [harmful ? "out" : "off"] of [victim.name]'s [limb.plaintext_zone]!"), span_userdanger("[weapon] falls [harmful ? "out" : "off"] of your [limb.plaintext_zone]!")) - safeRemove() + limb_owner?.visible_message( + span_danger("[weapon] falls [harmful ? "out" : "off"] of [limb_owner.name]'s [limb.plaintext_zone]!"), + ) + 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) +/datum/component/embedded/proc/ripOut(obj/item/bodypart/source, obj/item/I, mob/living/carbon/user) SIGNAL_HANDLER - if(I != weapon || src.limb != limb) + if(I != weapon || source != parent) return - var/mob/living/carbon/victim = parent + var/time_taken = rip_time * weapon.w_class - INVOKE_ASYNC(src, PROC_REF(complete_rip_out), victim, I, limb, time_taken) + INVOKE_ASYNC(src, PROC_REF(complete_rip_out), user, I, parent, 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(span_warning("[victim] attempts to remove [weapon] from [victim.p_their()] [limb.plaintext_zone]."),span_notice("You attempt to remove [weapon] from your [limb.plaintext_zone]... (It will take [DisplayTimeText(time_taken)].)")) - if(!do_after(victim, time = time_taken, timed_action_flags = DO_PUBLIC, display = image('icons/hud/do_after.dmi', "help"))) +/datum/component/embedded/proc/complete_rip_out(mob/living/carbon/user, obj/item/I, obj/item/bodypart/limb, time_taken) + + if(user == limb_owner) + user.visible_message( + span_warning("[user] attempts to remove [weapon] from [user.p_their()] [limb.plaintext_zone]."), + ) + else + user.visible_message( + span_warning("[user] attempts to remove [weapon] from [limb_owner]'s [limb.plaintext_zone].") + ) + + if(harmful && user.stats.cooldown_finished("ripout_embed_check")) + user.stats.set_cooldown("ripout_embed_check", INFINITY) + var/datum/roll_result/result = user.stat_roll(12, /datum/rpg_skill/handicraft) + switch(result.outcome) + if(CRIT_SUCCESS) + harmful = FALSE + time_taken = 0 + to_chat(user, result.create_tooltip("Many hours spent on delicate projects has prepared you for this moment. (Instant and harmless removal)")) + + if(SUCCESS) + time_taken = time_taken * 0.2 + to_chat(user, result.create_tooltip("Your hands are more than accustomed to careful tasks. (Accelerated removal)")) + + if(CRIT_FAILURE) + to_chat(user, result.create_tooltip("At a crucial moment, you second guess yourself, pressing the object deeper into your flesh.")) + user.stats.set_cooldown("ripout_embed_check", 5 MINUTES) + rip_out_damage(limb) + return + + if(!do_after(user, limb_owner, time = time_taken, timed_action_flags = DO_PUBLIC, display = image('icons/hud/do_after.dmi', "help"))) return - if(!weapon || !limb || weapon.loc != victim || !(weapon in limb.embedded_objects)) + + user.stats.set_cooldown("ripout_embed_check", 0) + + if(!weapon || !limb || weapon.loc != limb || !(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, sharpness=SHARP_EDGED) //It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow - victim.emote("scream") + rip_out_damage(limb) - victim.visible_message(span_notice("[victim] successfully rips [weapon] [harmful ? "out" : "off"] of [victim.p_their()] [limb.plaintext_zone]!"), span_notice("You successfully remove [weapon] from your [limb.plaintext_zone].")) - safeRemove(victim) + if(user == limb_owner) + user.visible_message( + span_warning("[user] successfully rips [weapon] [harmful ? "out" : "off"] of [user.p_their()] [limb.plaintext_zone]!"), + ) + else + user.visible_message( + span_warning("[user] successfully rips [weapon] [harmful ? "out" : "off"] of [limb_owner]'s [limb.plaintext_zone]!"), + ) + + safeRemove(user) + +/datum/component/embedded/proc/rip_out_damage(obj/item/bodypart/limb) + var/damage = weapon.w_class * remove_pain_mult + for(var/datum/wound/W as anything in limb.wounds) + if(weapon in W.embedded_objects) + W.open_wound((1-pain_stam_pct) * damage) + break + + if(limb_owner) + limb_owner.stamina.adjust(-(pain_stam_pct * damage)) + limb_owner.emote("pain") + + if(!IS_ORGANIC_LIMB(limb)) + limb_owner.visible_message( + span_warning("The damage to \the [limb_owner]'s [limb.plaintext_zone] worsens."),\ + span_warning("The damage to your [limb.plaintext_zone] worsens."),\ + span_hear("You hear the screech of abused metal.") + ) + else + limb_owner.visible_message( + span_warning("The wound on \the [limb_owner]'s [limb.plaintext_zone] widens with a nasty ripping noise."),\ + span_warning("The wound on your [limb.plaintext_zone] widens with a nasty ripping noise."),\ + span_hear("You hear a nasty ripping noise, as if flesh is being torn apart.") + ) /// 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. /// If you want the thing to go into someone's hands rather than the floor, pass them in to_hands /datum/component/embedded/proc/safeRemove(mob/to_hands) SIGNAL_HANDLER - var/mob/living/carbon/victim = parent + var/obj/item/bodypart/limb = parent limb._unembed_object(weapon) UnregisterSignal(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) // have to do it here otherwise we trigger weaponDeleted() @@ -223,7 +315,7 @@ if(to_hands) INVOKE_ASYNC(to_hands, TYPE_PROC_REF(/mob, put_in_hands), weapon) else - weapon.forceMove(get_turf(victim)) + weapon.forceMove(get_turf(limb_owner || parent)) qdel(src) @@ -231,27 +323,27 @@ /datum/component/embedded/proc/weaponDeleted() SIGNAL_HANDLER - var/mob/living/carbon/victim = parent + var/obj/item/bodypart/limb = parent limb._unembed_object(weapon) - if(victim) - to_chat(victim, span_userdanger("\The [weapon] that was embedded in your [limb.plaintext_zone] disappears!")) + if(limb_owner) + to_chat(limb_owner, span_userdanger("\The [weapon] that was embedded in your [limb.plaintext_zone] disappears!")) qdel(src) /// The signal for listening to see if someone is using a hemostat on us to pluck out this object -/datum/component/embedded/proc/checkTweeze(mob/living/carbon/victim, obj/item/possible_tweezers, mob/user) +/datum/component/embedded/proc/checkTweeze(obj/item/bodypart/source, obj/item/possible_tweezers, mob/user) SIGNAL_HANDLER - if(!istype(victim) || possible_tweezers.tool_behaviour != TOOL_HEMOSTAT || user.zone_selected != limb.body_zone) + var/obj/item/bodypart/limb = parent + if(possible_tweezers.tool_behaviour != TOOL_HEMOSTAT || user.zone_selected != limb.body_zone) return if(weapon != limb.embedded_objects[1]) // just pluck the first one, since we can't easily coordinate with other embedded components affecting this limb who is highest priority return - if(ishuman(victim)) // check to see if the limb is actually exposed - var/mob/living/carbon/human/victim_human = victim - if(!victim_human.try_inject(user, limb.body_zone, INJECT_CHECK_IGNORE_SPECIES | INJECT_TRY_SHOW_ERROR_MESSAGE)) + if(limb_owner) // check to see if the limb is actually exposed + if(limb_owner.try_inject(user, limb.body_zone, INJECT_CHECK_IGNORE_SPECIES | INJECT_TRY_SHOW_ERROR_MESSAGE)) return TRUE INVOKE_ASYNC(src, PROC_REF(tweezePluck), possible_tweezers, user) @@ -259,27 +351,53 @@ /// The actual action for pulling out an embedded object with a hemostat /datum/component/embedded/proc/tweezePluck(obj/item/possible_tweezers, mob/user) - var/mob/living/carbon/victim = parent - - var/self_pluck = (user == victim) + var/self_pluck = (user == limb_owner) + var/obj/item/bodypart/limb = parent + var/target = limb_owner || limb if(self_pluck) - user.visible_message(span_danger("[user] begins plucking [weapon] from [user.p_their()] [limb.plaintext_zone]"), span_notice("You start plucking [weapon] from your [limb.plaintext_zone]..."),\ - vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) + user.visible_message( + span_notice("[user] begins plucking [weapon] from [user.p_their()] [limb.plaintext_zone]"), + vision_distance=COMBAT_MESSAGE_RANGE, + ) else - user.visible_message(span_danger("[user] begins plucking [weapon] from [victim]'s [limb.plaintext_zone]"),span_notice("You start plucking [weapon] from [victim]'s [limb.plaintext_zone]..."), \ - vision_distance=COMBAT_MESSAGE_RANGE, ignored_mobs=victim) - to_chat(victim, span_userdanger("[user] begins plucking [weapon] from your [limb.plaintext_zone]...")) + user.visible_message( + span_notice("[user] begins plucking [weapon] from [target]'s [limb.plaintext_zone]"), + vision_distance=COMBAT_MESSAGE_RANGE, + ) var/pluck_time = 2.5 SECONDS * weapon.w_class * (self_pluck ? 2 : 1) - if(!do_after(user, victim, pluck_time, DO_PUBLIC, display = possible_tweezers)) + if(!do_after(user, target, pluck_time, DO_PUBLIC, display = possible_tweezers)) if(self_pluck) - to_chat(user, span_danger("You fail to pluck [weapon] from your [limb.plaintext_zone].")) + to_chat(user, span_warning("You fail to pluck [weapon] from your [limb.plaintext_zone].")) else - to_chat(user, span_danger("You fail to pluck [weapon] from [victim]'s [limb.plaintext_zone].")) - to_chat(victim, span_danger("[user] fails to pluck [weapon] from your [limb.plaintext_zone].")) + if(limb_owner) + to_chat(user, span_warning("You fail to pluck [weapon] from [limb_owner]'s [limb.plaintext_zone].")) + to_chat(limb_owner, span_warning("[user] fails to pluck [weapon] from your [limb.plaintext_zone].")) + else + to_chat(to_chat(user, span_warning("You fail to pluck [weapon] from [limb]."))) return - to_chat(user, span_notice("You successfully pluck [weapon] from [victim]'s [limb.plaintext_zone].")) - to_chat(victim, span_notice("[user] plucks [weapon] from your [limb.plaintext_zone].")) + if(self_pluck) + user.visible_message(user, span_notice("[user] successfully plucks [weapon] from [user.p_their()] [limb.plaintext_zone].")) + else + if(limb_owner) + user.visible_message(user, span_notice("[user] successfully plucks [weapon] from [limb_owner]'s [limb.plaintext_zone].")) + else + user.visible_message(user, span_notice("[user] successfully plucks [weapon] from [limb].")) + safeRemove(user) + +/// Called whenever the limb owner is health scanned +/datum/component/embedded/proc/on_healthscan(datum/source, list/render_string, mob/user, mode, advanced) + SIGNAL_HANDLER + + var/obj/obj_parent = parent + if(advanced) + render_string += "Foreign body detected in subject's [obj_parent.name].\n" + else + render_string += "Foreign body detected. Advanced scanner required for location.\n" + +/obj/item/shard/embed_tester + name = "extra extra sharp glass" + embedding = list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) diff --git a/code/datums/components/engraved.dm b/code/datums/components/engraved.dm index d06d9532854f..9971004de684 100644 --- a/code/datums/components/engraved.dm +++ b/code/datums/components/engraved.dm @@ -1,72 +1,49 @@ /** * # engraved component! * - * component for walls that applies an engraved overlay and lets you examine it to read a story (+ art element yay) - * new creations will get a high art value, cross round scrawlings will get a low one. * MUST be a component, though it doesn't look like it. SSPersistence demandeth */ /datum/component/engraved - ///the generated story string + ///the generated string var/engraved_description ///whether this is a new engraving, or a persistence loaded one. var/persistent_save ///what random icon state should the engraving have var/icon_state_append - ///The story value of this piece. - var/story_value -/datum/component/engraved/Initialize(engraved_description, persistent_save, story_value) +/datum/component/engraved/Initialize(engraved_description, persistent_save) . = ..() - if(!isclosedturf(parent)) - return COMPONENT_INCOMPATIBLE - var/turf/closed/engraved_wall = parent + var/turf/engraved_turf = parent src.engraved_description = engraved_description src.persistent_save = persistent_save - src.story_value = story_value - var/beauty_value - switch(story_value) - if(STORY_VALUE_SHIT) - beauty_value = rand(-50, 50) //Ugly or mediocre at best - if(STORY_VALUE_NONE) - beauty_value = rand(0, 100) //No inherent value - if(STORY_VALUE_MEH) - beauty_value = rand(100, 200) //Its an okay tale - if(STORY_VALUE_OKAY) - beauty_value = rand(150, 300) //Average story! most things are like this - if(STORY_VALUE_AMAZING) - beauty_value = rand(300, 600)//Really impactful stories, seeing a lost limb, losing a loved pet. - if(STORY_VALUE_LEGENDARY) - beauty_value = rand(500, 800) //Almost always a good story! this is for memories you can barely ever get, killing megafauna, doing ultimate feats! - - engraved_wall.AddElement(/datum/element/art, beauty_value / ENGRAVING_BEAUTY_TO_ART_FACTOR) - if(persistent_save) - engraved_wall.AddElement(/datum/element/beauty, beauty_value) - else - engraved_wall.AddElement(/datum/element/beauty, beauty_value / ENGRAVING_PERSISTENCE_BEAUTY_LOSS_FACTOR) //Old age does them harm - icon_state_append = rand(1, 2) + icon_state_append = rand(1, 4) //must be here to allow overlays to be updated RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) - engraved_wall.update_appearance() + engraved_turf.update_appearance() /datum/component/engraved/Destroy(force, silent) - . = ..() + if(!parent) + return ..() parent.RemoveElement(/datum/element/art) //must be here to allow overlays to be updated UnregisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS) - if(parent && !QDELING(parent)) + if(!QDELING(parent)) var/atom/parent_atom = parent parent_atom.update_appearance() + return ..() //call this after since we null out the parent /datum/component/engraved/RegisterWithParent() RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(on_tool_act)) //supporting component transfer means putting these here instead of initialize SSpersistence.wall_engravings += src ADD_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) /datum/component/engraved/UnregisterFromParent() UnregisterSignal(parent, COMSIG_PARENT_EXAMINE) + UnregisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER)) //supporting component transfer means putting these here instead of destroy SSpersistence.wall_engravings -= src REMOVE_TRAIT(parent, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC) @@ -75,18 +52,28 @@ /datum/component/engraved/proc/on_update_overlays(atom/parent_atom, list/overlays) SIGNAL_HANDLER - overlays += mutable_appearance('icons/turf/wall_overlays.dmi', "engraving[icon_state_append]") + overlays += mutable_appearance('icons/effects/writing.dmi', "writing[icon_state_append]") ///signal called on parent being examined /datum/component/engraved/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER examine_list += span_boldnotice(engraved_description) + examine_list += span_notice("You can probably get this out with a welding tool.") + +/datum/component/engraved/proc/on_tool_act(datum/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + set waitfor = FALSE //Do not remove without removing the UNLINT below + + . = COMPONENT_BLOCK_TOOL_ATTACK + to_chat(user, span_notice("You begin to remove the engraving on [parent].")) + if(UNLINT(do_after(user, parent, 4 SECONDS, DO_PUBLIC, display = tool))) + to_chat(user, span_notice("You remove the engraving on [parent].")) + qdel(src) ///returns all the information SSpersistence needs in a list to load up this engraving on a future round! /datum/component/engraved/proc/save_persistent() var/list/saved_data = list() saved_data["story"] = engraved_description - saved_data["story_value"] = story_value return list(saved_data) diff --git a/code/datums/components/explodable.dm b/code/datums/components/explodable.dm index b2b0c83def4f..27f8e8966e78 100644 --- a/code/datums/components/explodable.dm +++ b/code/datums/components/explodable.dm @@ -113,7 +113,7 @@ if(!istype(L)) return - var/obj/item/bodypart/bodypart = L.get_bodypart(check_zone(def_zone)) + var/obj/item/bodypart/bodypart = L.get_bodypart(deprecise_zone(def_zone)) var/list/equipment_items = list() if(iscarbon(L)) diff --git a/code/datums/components/fantasy/_fantasy.dm b/code/datums/components/fantasy/_fantasy.dm index d19885cd923d..0af536d11965 100644 --- a/code/datums/components/fantasy/_fantasy.dm +++ b/code/datums/components/fantasy/_fantasy.dm @@ -104,7 +104,7 @@ master.force = max(0, master.force + quality) master.throwforce = max(0, master.throwforce + quality) - master.armor = master.armor?.modifyAllRatings(quality) + master.setArmor(master.returnArmor().modifyAllRatings(quality)) var/newName = originalName for(var/i in affixes) @@ -134,7 +134,7 @@ master.force = max(0, master.force - quality) master.throwforce = max(0, master.throwforce - quality) - master.armor = master.armor?.modifyAllRatings(-quality) + master.setArmor(master.returnArmor().modifyAllRatings(-quality)) master.name = originalName diff --git a/code/datums/components/fantasy/prefixes.dm b/code/datums/components/fantasy/prefixes.dm index 4015fe81cf54..56a4731b3520 100644 --- a/code/datums/components/fantasy/prefixes.dm +++ b/code/datums/components/fantasy/prefixes.dm @@ -121,7 +121,6 @@ /datum/reagent/toxin/mutetoxin, /datum/reagent/toxin/amanitin, /datum/reagent/toxin/lipolicide, - /datum/reagent/toxin/spewium, /datum/reagent/toxin/heparin, /datum/reagent/toxin/rotatium, /datum/reagent/toxin/histamine @@ -131,7 +130,6 @@ /datum/reagent/toxin/mutetoxin = "mimemind", /datum/reagent/toxin/amanitin = "dormant death", /datum/reagent/toxin/lipolicide = "famineblood", - /datum/reagent/toxin/spewium = "gulchergut", /datum/reagent/toxin/heparin = "jabberwound", /datum/reagent/toxin/rotatium = "spindown", /datum/reagent/toxin/histamine = "creeping malaise" diff --git a/code/datums/components/fantasy/suffixes.dm b/code/datums/components/fantasy/suffixes.dm index 1880c0612c29..0a438d4813e5 100644 --- a/code/datums/components/fantasy/suffixes.dm +++ b/code/datums/components/fantasy/suffixes.dm @@ -105,8 +105,6 @@ // Some types to remove them and their subtypes /mob/living/carbon/human/species = FALSE, /mob/living/simple_animal/hostile/syndicate/mecha_pilot = FALSE, - /mob/living/simple_animal/hostile/asteroid/elite = FALSE, - /mob/living/simple_animal/hostile/megafauna = FALSE, )) // Some particular types to disallow if they're too broad/abstract // Not in the above typecache generator because it includes subtypes and this doesn't. diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 8f16f15ff4e3..b1d5509343c1 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -114,9 +114,9 @@ Behavior that's still missing from this component that original food items had t for(var/rid in initial_reagents) var/amount = initial_reagents[rid] if(length(tastes) && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) - owner.reagents.add_reagent(rid, amount, tastes.Copy()) + owner.reagents.add_reagent(rid, amount, tastes.Copy(), no_react = TRUE) else - owner.reagents.add_reagent(rid, amount) + owner.reagents.add_reagent(rid, amount, no_react = TRUE) /datum/component/edible/InheritComponent( datum/component/C, @@ -146,8 +146,8 @@ Behavior that's still missing from this component that original food items had t src.on_consume = on_consume /datum/component/edible/Destroy(force, silent) - QDEL_NULL(after_eat) - QDEL_NULL(on_consume) + after_eat = null + on_consume = null return ..() /datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) @@ -161,11 +161,11 @@ Behavior that's still missing from this component that original food items had t if (0) return if(1) - examine_list += "[parent] was bitten by someone!" + examine_list += span_alert("Something has taken a bite out of it.") if(2,3) - examine_list += "[parent] was bitten [bitecount] times!" + examine_list += span_alert("Something has taken a couple of bites out of it.") else - examine_list += "[parent] was bitten multiple times!" + examine_list += span_alert("Something has taken a several of bites out of it.") /datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) SIGNAL_HANDLER @@ -303,6 +303,8 @@ Behavior that's still missing from this component that original food items had t if(IsFoodGone(owner, feeder)) return + owner.add_trace_DNA(eater.get_trace_dna()) + if(!CanConsume(eater, feeder)) return var/fullness = eater.get_fullness() + 10 //The theoretical fullness of the person eating if they were to eat this @@ -318,9 +320,10 @@ Behavior that's still missing from this component that original food items had t var/message_to_consumer = "" var/message_to_blind_consumer = "" - if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) + if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50) to_chat(eater, span_warning("You don't feel like eating any more junk food at the moment!")) return + else if(fullness > (600 * (1 + eater.overeatduration / (4000 SECONDS)))) // The more you eat - the more you can eat message_to_nearby_audience = span_warning("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!") message_to_consumer = span_warning("You cannot force any more of \the [parent] to go down your throat!") @@ -329,9 +332,11 @@ Behavior that's still missing from this component that original food items had t eater.visible_message(message_to_nearby_audience, ignored_mobs = eater) //if we're too full, return because we can't eat whatever it is we're trying to eat return + else if(fullness > 500) message_to_nearby_audience = span_notice("[eater] unwillingly [eatverb]s a bit of \the [parent].") message_to_consumer = span_notice("You unwillingly [eatverb] a bit of \the [parent].") + else if(fullness > 150) message_to_nearby_audience = span_notice("[eater] [eatverb]s \the [parent].") message_to_consumer = span_notice("You [eatverb] \the [parent].") @@ -411,6 +416,10 @@ Behavior that's still missing from this component that original food items had t return FALSE var/mob/living/carbon/C = eater var/covered = "" + if(!C.has_mouth()) + to_chat(feeder, span_warning("They don't have a mouth to feed.")) + return FALSE + if(C.is_mouth_covered(head_only = 1)) covered = "headgear" else if(C.is_mouth_covered(mask_only = 1)) @@ -429,9 +438,6 @@ Behavior that's still missing from this component that original food items had t return FALSE var/mob/living/carbon/human/H = M - //Bruh this breakfast thing is cringe and shouldve been handled separately from food-types, remove this in the future (Actually, just kill foodtypes in general) - if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time if(HAS_TRAIT(H, TRAIT_AGEUSIA)) @@ -457,15 +463,12 @@ Behavior that's still missing from this component that original food items had t if(FOOD_TOXIC) to_chat(H,span_warning("What the hell was that thing?!")) H.adjust_disgust(25 + 30 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) if(FOOD_DISLIKED) to_chat(H,span_notice("That didn't taste very good...")) H.adjust_disgust(11 + 15 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) if(FOOD_LIKED) to_chat(H,span_notice("I love this taste!")) H.adjust_disgust(-5 + -2.5 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) if(istype(parent, /obj/item/food)) var/obj/item/food/memorable_food = parent if(memorable_food.venue_value >= FOOD_PRICE_EXOTIC) @@ -525,6 +528,7 @@ Behavior that's still missing from this component that original food items had t var/datum/component/edible/E = ingredient if (LAZYLEN(E.tastes)) + LAZYINITLIST(tastes) tastes = tastes.Copy() for (var/t in E.tastes) tastes[t] += E.tastes[t] diff --git a/code/datums/components/food/ice_cream_holder.dm b/code/datums/components/food/ice_cream_holder.dm index 432d370dd90c..082619faaf7d 100644 --- a/code/datums/components/food/ice_cream_holder.dm +++ b/code/datums/components/food/ice_cream_holder.dm @@ -177,7 +177,7 @@ var/datum/venue/venue_to_pay = sold_to.ai_controller?.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - new /obj/item/holochip(get_turf(source), venue_price) + SSeconomy.spawn_cash_for_amount(venue_price, get_turf(source)) venue_to_pay.total_income += venue_price playsound(get_turf(source), 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/components/forensics.dm b/code/datums/components/forensics.dm deleted file mode 100644 index 079116c6fc82..000000000000 --- a/code/datums/components/forensics.dm +++ /dev/null @@ -1,188 +0,0 @@ -/datum/component/forensics - dupe_mode = COMPONENT_DUPE_UNIQUE - can_transfer = TRUE - var/list/fingerprints //assoc print = print - var/list/hiddenprints //assoc ckey = realname/gloves/ckey - var/list/blood_DNA //assoc dna = bloodtype - var/list/fibers //assoc print = print - -/datum/component/forensics/InheritComponent(datum/component/forensics/F, original) //Use of | and |= being different here is INTENTIONAL. - fingerprints = LAZY_LISTS_OR(fingerprints, F.fingerprints) - hiddenprints = LAZY_LISTS_OR(hiddenprints, F.hiddenprints) - blood_DNA = LAZY_LISTS_OR(blood_DNA, F.blood_DNA) - fibers = LAZY_LISTS_OR(fibers, F.fibers) - check_blood() - return ..() - -/datum/component/forensics/Initialize(new_fingerprints, new_hiddenprints, new_blood_DNA, new_fibers) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - fingerprints = new_fingerprints - hiddenprints = new_hiddenprints - blood_DNA = new_blood_DNA - fibers = new_fibers - check_blood() - -/datum/component/forensics/RegisterWithParent() - check_blood() - RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(clean_act)) - -/datum/component/forensics/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_COMPONENT_CLEAN_ACT)) - -/datum/component/forensics/PostTransfer() - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - -/datum/component/forensics/proc/wipe_fingerprints() - fingerprints = null - return TRUE - -/datum/component/forensics/proc/wipe_hiddenprints() - return //no. - -/datum/component/forensics/proc/wipe_blood_DNA() - blood_DNA = null - return TRUE - -/datum/component/forensics/proc/wipe_fibers() - fibers = null - return TRUE - -/datum/component/forensics/proc/clean_act(datum/source, clean_types) - SIGNAL_HANDLER - - . = NONE - if(clean_types & CLEAN_TYPE_FINGERPRINTS) - wipe_fingerprints() - . = COMPONENT_CLEANED - if(clean_types & CLEAN_TYPE_BLOOD) - wipe_blood_DNA() - . = COMPONENT_CLEANED - if(clean_types & CLEAN_TYPE_FIBERS) - wipe_fibers() - . = COMPONENT_CLEANED - -/datum/component/forensics/proc/add_fingerprint_list(list/_fingerprints) //list(text) - if(!length(_fingerprints)) - return - LAZYINITLIST(fingerprints) - for(var/i in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fingerprints[i] = i - return TRUE - -/datum/component/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) - if(!isliving(M)) - if(!iscameramob(M)) - return - if(isaicamera(M)) - var/mob/camera/ai_eye/ai_camera = M - if(!ai_camera.ai) - return - M = ai_camera.ai - add_hiddenprint(M) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - add_fibers(H) - var/obj/item/gloves = H.gloves - if(gloves) //Check if the gloves (if any) hide fingerprints - if(!(gloves.body_parts_covered & HANDS) || HAS_TRAIT(gloves, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(H, TRAIT_FINGERPRINT_PASSTHROUGH)) - ignoregloves = TRUE - if(!ignoregloves) - H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop. - return - var/full_print = md5(H.dna.unique_identity) - LAZYSET(fingerprints, full_print, full_print) - return TRUE - -/datum/component/forensics/proc/add_fiber_list(list/_fibertext) //list(text) - if(!length(_fibertext)) - return - LAZYINITLIST(fibers) - for(var/i in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours. - fibers[i] = i - return TRUE - -/datum/component/forensics/proc/add_fibers(mob/living/carbon/human/M) - var/fibertext - var/item_multiplier = isitem(src)?1.2:1 - if(M.wear_suit) - fibertext = "Material from \a [M.wear_suit]." - if(prob(10*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & CHEST)) - if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(12*item_multiplier) && !LAZYACCESS(fibers, fibertext)) //Wearing a suit means less of the uniform exposed. - LAZYSET(fibers, fibertext, fibertext) - if(!(M.wear_suit.body_parts_covered & HANDS)) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.w_uniform) - fibertext = "Fibers from \a [M.w_uniform]." - if(prob(15*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - // "Added fibertext: [fibertext]" - LAZYSET(fibers, fibertext, fibertext) - if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - else if(M.gloves) - fibertext = "Material from a pair of [M.gloves.name]." - if(prob(20*item_multiplier) && !LAZYACCESS(fibers, fibertext)) - LAZYSET(fibers, fibertext, fibertext) - return TRUE - -/datum/component/forensics/proc/add_hiddenprint_list(list/_hiddenprints) //list(ckey = text) - if(!length(_hiddenprints)) - return - LAZYINITLIST(hiddenprints) - for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. - hiddenprints[i] = _hiddenprints[i] - return TRUE - -/datum/component/forensics/proc/add_hiddenprint(mob/M) - if(!isliving(M)) - if(!iscameramob(M)) - return - if(isaicamera(M)) - var/mob/camera/ai_eye/ai_camera = M - if(!ai_camera.ai) - return - M = ai_camera.ai - if(!M.key) - return - var/hasgloves = "" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.gloves) - hasgloves = "(gloves)" - var/current_time = time_stamp() - if(!LAZYACCESS(hiddenprints, M.key)) - LAZYSET(hiddenprints, M.key, "First: \[[current_time]\] \"[M.real_name]\"[hasgloves]. Ckey: [M.ckey]") - else - var/laststamppos = findtext(LAZYACCESS(hiddenprints, M.key), "\nLast: ") - if(laststamppos) - LAZYSET(hiddenprints, M.key, copytext(hiddenprints[M.key], 1, laststamppos)) - hiddenprints[M.key] += "\nLast: \[[current_time]\] \"[M.real_name]\"[hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else - var/atom/A = parent - A.fingerprintslast = M.ckey - return TRUE - -/datum/component/forensics/proc/add_blood_DNA(list/dna) //list(dna_enzymes = type) - if(!length(dna)) - return - LAZYINITLIST(blood_DNA) - for(var/i in dna) - blood_DNA[i] = dna[i] - check_blood() - return TRUE - -/datum/component/forensics/proc/check_blood() - if(!isitem(parent)) - return - if(!length(blood_DNA)) - return - parent.AddElement(/datum/element/decal/blood) diff --git a/code/datums/components/fullauto.dm b/code/datums/components/fullauto.dm index c42b5c418ea6..79cc9f7b2d72 100644 --- a/code/datums/components/fullauto.dm +++ b/code/datums/components/fullauto.dm @@ -30,15 +30,19 @@ . = ..() if(!isgun(parent)) return COMPONENT_INCOMPATIBLE + var/obj/item/gun = parent RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(wake_up)) + if(autofire_shot_delay) src.autofire_shot_delay = autofire_shot_delay + if(windup_autofire) src.windup_autofire = windup_autofire src.windup_autofire_reduction_multiplier = windup_autofire_reduction_multiplier src.windup_autofire_cap = windup_autofire_cap src.windup_spindown = windup_spindown + if(autofire_stat == AUTOFIRE_STAT_IDLE && ismob(gun.loc)) var/mob/user = gun.loc wake_up(src, user) @@ -73,14 +77,18 @@ if(autofire_stat != AUTOFIRE_STAT_IDLE) return + autofire_stat = AUTOFIRE_STAT_ALERT + if(!QDELETED(usercli)) clicker = usercli shooter = clicker.mob RegisterSignal(clicker, COMSIG_CLIENT_MOUSEDOWN, PROC_REF(on_mouse_down)) + if(!QDELETED(shooter)) RegisterSignal(shooter, COMSIG_MOB_LOGOUT, PROC_REF(autofire_off)) UnregisterSignal(shooter, COMSIG_MOB_LOGIN) + RegisterSignal(parent, list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED), PROC_REF(autofire_off)) parent.RegisterSignal(src, COMSIG_AUTOFIRE_ONMOUSEDOWN, TYPE_PROC_REF(/obj/item/gun, autofire_bypass_check)) parent.RegisterSignal(parent, COMSIG_AUTOFIRE_SHOT, TYPE_PROC_REF(/obj/item/gun, do_autofire)) @@ -97,11 +105,14 @@ if(!QDELETED(clicker)) UnregisterSignal(clicker, list(COMSIG_CLIENT_MOUSEDOWN, COMSIG_CLIENT_MOUSEUP, COMSIG_CLIENT_MOUSEDRAG)) + mouse_status = AUTOFIRE_MOUSEUP //In regards to the component there's no click anymore to care about. clicker = null + if(!QDELETED(shooter)) RegisterSignal(shooter, COMSIG_MOB_LOGIN, PROC_REF(on_client_login)) UnregisterSignal(shooter, COMSIG_MOB_LOGOUT) + UnregisterSignal(parent, list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED)) shooter = null parent.UnregisterSignal(parent, COMSIG_AUTOFIRE_SHOT) @@ -166,7 +177,7 @@ autofire_stat = AUTOFIRE_STAT_FIRING clicker.mouse_override_icon = 'icons/effects/mouse_pointers/weapon_pointer.dmi' - clicker.mouse_pointer_icon = clicker.mouse_override_icon + clicker.mob.update_mouse_pointer() if(mouse_status == AUTOFIRE_MOUSEUP) //See mouse_status definition for the reason for this. RegisterSignal(clicker, COMSIG_CLIENT_MOUSEUP, PROC_REF(on_mouse_up)) @@ -195,6 +206,7 @@ mouse_status = AUTOFIRE_MOUSEUP if(autofire_stat == AUTOFIRE_STAT_FIRING) stop_autofiring() + return COMPONENT_CLIENT_MOUSEUP_INTERCEPT @@ -202,14 +214,18 @@ SIGNAL_HANDLER if(autofire_stat != AUTOFIRE_STAT_FIRING) return + STOP_PROCESSING(SSprojectiles, src) autofire_stat = AUTOFIRE_STAT_ALERT + if(clicker) clicker.mouse_override_icon = null - clicker.mouse_pointer_icon = clicker.mouse_override_icon + clicker.mob.update_mouse_pointer() UnregisterSignal(clicker, COMSIG_CLIENT_MOUSEDRAG) + if(!QDELETED(shooter)) UnregisterSignal(shooter, COMSIG_MOB_SWAP_HANDS) + target = null target_loc = null mouse_parameters = null @@ -225,12 +241,15 @@ if(QDELETED(target)) //No new target acquired, and old one was deleted, get us out of here. stop_autofiring() CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]. Old target was incidentally QDELETED.") + target = get_turf(target) //If previous target wasn't a turf, let's turn it into one to avoid locking onto a potentially moving target. target_loc = target CRASH("on_mouse_drag failed to get the turf under screen object [over_object.type]") + target = new_target target_loc = new_target return + target = over_object target_loc = get_turf(over_object) mouse_parameters = params @@ -241,25 +260,33 @@ return FALSE if(!COOLDOWN_FINISHED(src, next_shot_cd)) return TRUE + if(QDELETED(target) || get_turf(target) != target_loc) //Target moved or got destroyed since we last aimed. target = target_loc //So we keep firing on the emptied tile until we move our mouse and find a new target. + if(get_dist(shooter, target) <= 0) target = get_step(shooter, shooter.dir) //Shoot in the direction faced if the mouse is on the same tile as we are. target_loc = target + else if(!in_view_range(shooter, target)) stop_autofiring() //Elvis has left the building. return FALSE + shooter.face_atom(target) var/next_delay = autofire_shot_delay + if(windup_autofire) next_delay = clamp(next_delay - current_windup_reduction, round(autofire_shot_delay * windup_autofire_cap), autofire_shot_delay) current_windup_reduction = (current_windup_reduction + round(autofire_shot_delay * windup_autofire_reduction_multiplier)) timerid = addtimer(CALLBACK(src, PROC_REF(windup_reset), FALSE), windup_spindown, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + if(HAS_TRAIT(shooter, TRAIT_DOUBLE_TAP)) next_delay = round(next_delay * 0.5) + COOLDOWN_START(src, next_shot_cd, next_delay) if(SEND_SIGNAL(parent, COMSIG_AUTOFIRE_SHOT, target, shooter, mouse_parameters) & COMPONENT_AUTOFIRE_SHOT_SUCCESS) return TRUE + stop_autofiring() return FALSE @@ -272,15 +299,13 @@ // Gun procs. /obj/item/gun/proc/on_autofire_start(mob/living/shooter) - if(semicd || shooter.incapacitated() || !can_trigger_gun(shooter)) + if(fire_lockout || shooter.incapacitated() || !can_trigger_gun(shooter)) return FALSE - if(!can_shoot()) + + if(!can_fire()) shoot_with_empty_chamber(shooter) return FALSE - var/obj/item/bodypart/other_hand = shooter.has_hand_for_held_index(shooter.get_inactive_hand_index()) - if(weapon_weight == WEAPON_HEAVY && (shooter.get_inactive_held_item() || !other_hand)) - to_chat(shooter, span_warning("You need two hands to fire [src]!")) - return FALSE + return TRUE @@ -292,11 +317,12 @@ /obj/item/gun/proc/do_autofire(datum/source, atom/target, mob/living/shooter, params) SIGNAL_HANDLER - if(semicd || shooter.incapacitated()) + if(fire_lockout || shooter.incapacitated()) return NONE - if(!can_shoot()) + if(!can_fire()) shoot_with_empty_chamber(shooter) return NONE + INVOKE_ASYNC(src, PROC_REF(do_autofire_shot), source, target, shooter, params) return COMPONENT_AUTOFIRE_SHOT_SUCCESS //All is well, we can continue shooting. @@ -304,11 +330,12 @@ /obj/item/gun/proc/do_autofire_shot(datum/source, atom/target, mob/living/shooter, params) var/obj/item/gun/akimbo_gun = shooter.get_inactive_held_item() var/bonus_spread = 0 - if(istype(akimbo_gun) && weapon_weight < WEAPON_MEDIUM) - if(akimbo_gun.weapon_weight < WEAPON_MEDIUM && akimbo_gun.can_trigger_gun(shooter)) + if(istype(akimbo_gun) && !(gun_flags & NO_AKIMBO)) + if(!(akimbo_gun.gun_flags & NO_AKIMBO) && akimbo_gun.can_trigger_gun(shooter)) bonus_spread = dual_wield_spread - addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, shooter, TRUE, params, null, bonus_spread), 1) - process_fire(target, shooter, TRUE, params, null, bonus_spread) + addtimer(CALLBACK(akimbo_gun, TYPE_PROC_REF(/obj/item/gun, do_fire_gun), target, shooter, TRUE, params, null, bonus_spread), 1) + + do_fire_gun(target, shooter, TRUE, params, null, bonus_spread) #undef AUTOFIRE_MOUSEUP #undef AUTOFIRE_MOUSEDOWN diff --git a/code/datums/components/genetic_damage.dm b/code/datums/components/genetic_damage.dm index 0aecad02a962..c3979ce9279f 100644 --- a/code/datums/components/genetic_damage.dm +++ b/code/datums/components/genetic_damage.dm @@ -58,15 +58,11 @@ qdel(src) return PROCESS_KILL -/datum/component/genetic_damage/proc/on_healthscan(datum/source, list/render_list, advanced) +/datum/component/genetic_damage/proc/on_healthscan(datum/source, list/render_string, mob/user, mode, advanced) SIGNAL_HANDLER if (advanced) - render_list += "Genetic damage: [round(total_damage / minimum_before_damage * 100, 0.1)]%\n" - else if (total_damage >= minimum_before_damage) - render_list += "Severe genetic damage detected.\n" - else - render_list += "Minor genetic damage detected.\n" + render_string += "Genetic damage: [round(total_damage / minimum_before_damage * 100, 0.1)]%\n" #undef GORILLA_MUTATION_CHANCE_PER_SECOND #undef GORILLA_MUTATION_MINIMUM_DAMAGE diff --git a/code/datums/components/gps.dm b/code/datums/components/gps.dm index fa6960356f6b..acd0e2ca650b 100644 --- a/code/datums/components/gps.dm +++ b/code/datums/components/gps.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_EMPTY(GPS_list) ///Toggles the tracking for the gps /datum/component/gps/item/proc/toggletracking(mob/user) - if(!user.canUseTopic(parent, BE_CLOSE)) + if(!user.canUseTopic(parent, USE_CLOSE)) return //user not valid to use gps if(emped) to_chat(user, span_warning("It's busted!")) diff --git a/code/datums/components/gunpoint.dm b/code/datums/components/gunpoint.dm deleted file mode 100644 index 155a03e4fb9b..000000000000 --- a/code/datums/components/gunpoint.dm +++ /dev/null @@ -1,183 +0,0 @@ -/// How many tiles around the target the shooter can roam without losing their shot -#define GUNPOINT_SHOOTER_STRAY_RANGE 2 -/// How long it takes from the gunpoint is initiated to reach stage 2 -#define GUNPOINT_DELAY_STAGE_2 (2.5 SECONDS) -/// How long it takes from stage 2 starting to move up to stage 3 -#define GUNPOINT_DELAY_STAGE_3 (7.5 SECONDS) -/// How much the damage and wound bonus mod is multiplied when you're on stage 1 -#define GUNPOINT_MULT_STAGE_1 1 -/// As above, for stage 2 -#define GUNPOINT_MULT_STAGE_2 2 -/// As above, for stage 3 -#define GUNPOINT_MULT_STAGE_3 2.5 - - -/datum/component/gunpoint - dupe_mode = COMPONENT_DUPE_UNIQUE - - var/mob/living/target - var/obj/item/gun/weapon - - var/stage = 1 - var/damage_mult = GUNPOINT_MULT_STAGE_1 - - var/point_of_no_return = FALSE - -// *extremely bad russian accent* no! -/datum/component/gunpoint/Initialize(mob/living/targ, obj/item/gun/wep) - if(!isliving(parent)) - return COMPONENT_INCOMPATIBLE - - var/mob/living/shooter = parent - target = targ - weapon = wep - RegisterSignal(targ, list(COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_ITEM_ATTACK, COMSIG_MOVABLE_MOVED, COMSIG_MOB_FIRED_GUN), PROC_REF(trigger_reaction)) - - RegisterSignal(weapon, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), PROC_REF(cancel)) - - shooter.visible_message(span_danger("[shooter] aims [weapon] point blank at [target]!"), \ - span_danger("You aim [weapon] point blank at [target]!"), ignored_mobs = target) - to_chat(target, span_userdanger("[shooter] aims [weapon] point blank at you!")) - add_memory_in_range(target, 7, MEMORY_GUNPOINT, list(DETAIL_PROTAGONIST = target, DETAIL_DEUTERAGONIST = shooter, DETAIL_WHAT_BY = weapon), story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLINDNESS) - - shooter.apply_status_effect(/datum/status_effect/holdup, shooter) - target.apply_status_effect(/datum/status_effect/grouped/heldup, REF(shooter)) - - if(istype(weapon, /obj/item/gun/ballistic/rocketlauncher) && weapon.chambered) - if(target.stat == CONSCIOUS && IS_NUKE_OP(shooter) && !IS_NUKE_OP(target) && (locate(/obj/item/disk/nuclear) in target.get_contents()) && shooter.client) - shooter.client.give_award(/datum/award/achievement/misc/rocket_holdup, shooter) - - target.do_alert_animation() - target.playsound_local(target.loc, 'sound/machines/chime.ogg', 50, TRUE) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gunpoint", /datum/mood_event/gunpoint) - - addtimer(CALLBACK(src, PROC_REF(update_stage), 2), GUNPOINT_DELAY_STAGE_2) - -/datum/component/gunpoint/Destroy(force, silent) - var/mob/living/shooter = parent - shooter.remove_status_effect(/datum/status_effect/holdup) - target.remove_status_effect(/datum/status_effect/grouped/heldup, REF(shooter)) - SEND_SIGNAL(target, COMSIG_CLEAR_MOOD_EVENT, "gunpoint") - return ..() - -/datum/component/gunpoint/RegisterWithParent() - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(check_deescalate)) - RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(flinch)) - RegisterSignal(parent, COMSIG_MOB_ATTACK_HAND, PROC_REF(check_shove)) - RegisterSignal(parent, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(check_deescalate)) - RegisterSignal(parent, list(COMSIG_LIVING_START_PULL, COMSIG_MOVABLE_BUMP), PROC_REF(check_bump)) - -/datum/component/gunpoint/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) - UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) - UnregisterSignal(parent, COMSIG_MOB_UPDATE_SIGHT) - UnregisterSignal(parent, COMSIG_MOB_ATTACK_HAND) - UnregisterSignal(parent, list(COMSIG_LIVING_START_PULL, COMSIG_MOVABLE_BUMP)) - -///If the shooter bumps the target, cancel the holdup to avoid cheesing and forcing the charged shot -/datum/component/gunpoint/proc/check_bump(atom/B, atom/A) - SIGNAL_HANDLER - - if(A != target) - return - var/mob/living/shooter = parent - shooter.visible_message(span_danger("[shooter] bumps into [target] and fumbles [shooter.p_their()] aim!"), \ - span_danger("You bump into [target] and fumble your aim!"), ignored_mobs = target) - to_chat(target, span_userdanger("[shooter] bumps into you and fumbles [shooter.p_their()] aim!")) - qdel(src) - -///If the shooter shoves or grabs the target, cancel the holdup to avoid cheesing and forcing the charged shot -/datum/component/gunpoint/proc/check_shove(mob/living/carbon/shooter, mob/shooter_again, mob/living/T, datum/martial_art/attacker_style, modifiers) - SIGNAL_HANDLER - - if(T != target || LAZYACCESS(modifiers, RIGHT_CLICK)) - return - shooter.visible_message(span_danger("[shooter] bumps into [target] and fumbles [shooter.p_their()] aim!"), \ - span_danger("You bump into [target] and fumble your aim!"), ignored_mobs = target) - to_chat(target, span_userdanger("[shooter] bumps into you and fumbles [shooter.p_their()] aim!")) - qdel(src) - -///Update the damage multiplier for whatever stage we're entering into -/datum/component/gunpoint/proc/update_stage(new_stage) - if(check_deescalate()) - return - stage = new_stage - if(stage == 2) - to_chat(parent, span_danger("You steady [weapon] on [target].")) - to_chat(target, span_userdanger("[parent] has steadied [weapon] on you!")) - damage_mult = GUNPOINT_MULT_STAGE_2 - addtimer(CALLBACK(src, PROC_REF(update_stage), 3), GUNPOINT_DELAY_STAGE_3) - else if(stage == 3) - to_chat(parent, span_danger("You have fully steadied [weapon] on [target].")) - to_chat(target, span_userdanger("[parent] has fully steadied [weapon] on you!")) - damage_mult = GUNPOINT_MULT_STAGE_3 - -///Cancel the holdup if the shooter moves out of sight or out of range of the target -/datum/component/gunpoint/proc/check_deescalate() - SIGNAL_HANDLER - - if(!can_see(parent, target, GUNPOINT_SHOOTER_STRAY_RANGE)) - cancel() - return TRUE - -///Bang bang, we're firing a charged shot off -/datum/component/gunpoint/proc/trigger_reaction() - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(async_trigger_reaction)) - -/datum/component/gunpoint/proc/async_trigger_reaction() - var/mob/living/shooter = parent - shooter.remove_status_effect(/datum/status_effect/holdup) // try doing these before the trigger gets pulled since the target (or shooter even) may not exist after pulling the trigger, dig? - target.remove_status_effect(/datum/status_effect/grouped/heldup, REF(shooter)) - SEND_SIGNAL(target, COMSIG_CLEAR_MOOD_EVENT, "gunpoint") - - if(point_of_no_return) - return - point_of_no_return = TRUE - - if(weapon.chambered && weapon.chambered.loaded_projectile) - weapon.chambered.loaded_projectile.damage *= damage_mult - - var/fired = weapon.fire_gun(target, shooter) - if(!fired && weapon.chambered?.loaded_projectile) - weapon.chambered.loaded_projectile.damage /= damage_mult - - qdel(src) - -///Shooter canceled their shot, either by dropping/equipping their weapon, leaving sight/range, or clicking on the alert -/datum/component/gunpoint/proc/cancel() - SIGNAL_HANDLER - - var/mob/living/shooter = parent - shooter.visible_message(span_danger("[shooter] breaks [shooter.p_their()] aim on [target]!"), \ - span_danger("You are no longer aiming [weapon] at [target]."), ignored_mobs = target) - to_chat(target, span_userdanger("[shooter] breaks [shooter.p_their()] aim on you!")) - qdel(src) - -///If the shooter is hit by an attack, they have a 50% chance to flinch and fire. If it hit the arm holding the trigger, it's an 80% chance to fire instead -/datum/component/gunpoint/proc/flinch(attacker, damage, damagetype, def_zone) - SIGNAL_HANDLER - - var/mob/living/shooter = parent - if(attacker == shooter) - return // somehow this wasn't checked for months but no one tried punching themselves to initiate the shot, amazing - - var/flinch_chance = 50 - var/gun_hand = LEFT_HANDS - - if(shooter.held_items[RIGHT_HANDS] == weapon) - gun_hand = RIGHT_HANDS - - if((def_zone == BODY_ZONE_L_ARM && gun_hand == LEFT_HANDS) || (def_zone == BODY_ZONE_R_ARM && gun_hand == RIGHT_HANDS)) - flinch_chance = 80 - - if(prob(flinch_chance)) - shooter.visible_message(span_danger("[shooter] flinches!"), \ - span_danger("You flinch!")) - INVOKE_ASYNC(src, PROC_REF(trigger_reaction)) - -#undef GUNPOINT_DELAY_STAGE_2 -#undef GUNPOINT_DELAY_STAGE_3 -#undef GUNPOINT_MULT_STAGE_1 -#undef GUNPOINT_MULT_STAGE_2 -#undef GUNPOINT_MULT_STAGE_3 diff --git a/code/datums/components/irradiated.dm b/code/datums/components/irradiated.dm index 44da5a35e1f6..b583b1ed7dc7 100644 --- a/code/datums/components/irradiated.dm +++ b/code/datums/components/irradiated.dm @@ -129,7 +129,7 @@ if (should_halt_effects(parent)) return - var/obj/affected_limb = human_parent.get_bodypart(ran_zone()) + var/obj/affected_limb = human_parent.get_bodypart(human_parent.get_random_valid_zone(even_weights = TRUE)) human_parent.visible_message( span_boldwarning("[human_parent]'s [affected_limb.name] bubbles unnaturally, then bursts into blisters!"), span_boldwarning("Your [affected_limb.name] bubbles unnaturally, then bursts into blisters!"), diff --git a/code/datums/components/jetpack.dm b/code/datums/components/jetpack.dm index 3451a75538ad..1f9f2dda3820 100644 --- a/code/datums/components/jetpack.dm +++ b/code/datums/components/jetpack.dm @@ -67,7 +67,7 @@ /datum/component/jetpack/Destroy() QDEL_NULL(trail) - QDEL_NULL(check_on_move) + check_on_move = null return ..() /datum/component/jetpack/proc/setup_trail() @@ -109,7 +109,7 @@ return if(!(user.movement_type & FLOATING) || user.buckled)//You don't want use jet in gravity or while buckled. return - if(user.pulledby)//You don't must use jet if someone pull you + if(LAZYLEN(user.grabbed_by))//You don't must use jet if someone pull you return if(user.throwing)//You don't must use jet if you thrown return diff --git a/code/datums/components/jousting.dm b/code/datums/components/jousting.dm index b83cd0c8dcb6..07ab3c9aaf1c 100644 --- a/code/datums/components/jousting.dm +++ b/code/datums/components/jousting.dm @@ -56,6 +56,7 @@ if(damage) msg += "[user] [sharp? "impales" : "slams into"] [target] [sharp? "on" : "with"] their [parent]" target.apply_damage(damage, BRUTE, user.zone_selected, 0) + if(prob(knockdown_chance)) msg += " and knocks [target] [target_buckled? "off of [target.buckled]" : "down"]" if(target_buckled) diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index beb5db66dab8..b5563433c722 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -1,71 +1,99 @@ -///Items with these will have a chance to get knocked off when disarming or being knocked down +/// Items with this component will have a chance to get knocked off +/// (unequipped and sent to the ground) when the wearer is disarmed or knocked down. /datum/component/knockoff - ///Chance to knockoff + /// Chance to knockoff when a knockoff action occurs. var/knockoff_chance = 100 - ///Aiming for these zones will cause the knockoff, null means all zones allowed + /// Used in being disarmed. + /// If set, we will only roll the knockoff chance if the disarmer is targeting one of these zones. + /// If unset, any disarm act will cause the knock-off chance to be rolled, no matter the zone targeted. var/list/target_zones - ///Can be only knocked off from these slots, null means all slots allowed - var/list/slots_knockoffable + /// Bitflag used in equip to determine what slots we need to be in to be knocked off. + /// If set, we must be equipped in one of the slots to have a chance of our item being knocked off. + /// If unset / NONE, a disarm or knockdown will have a chance of our item being knocked off regardless of slot, INCLUDING hand slots. + var/slots_knockoffable = NONE -/datum/component/knockoff/Initialize(knockoff_chance,zone_override,slots_knockoffable) +/datum/component/knockoff/Initialize(knockoff_chance = 100, target_zones, slots_knockoffable = NONE) if(!isitem(parent)) return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED,PROC_REF(OnEquipped)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED,PROC_REF(OnDropped)) src.knockoff_chance = knockoff_chance + src.target_zones = target_zones + src.slots_knockoffable = slots_knockoffable - if(zone_override) - target_zones = zone_override +/datum/component/knockoff/RegisterWithParent() + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) - if(slots_knockoffable) - src.slots_knockoffable = slots_knockoffable +/datum/component/knockoff/UnregisterFromParent() + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) -///Tries to knockoff the item when disarmed -/datum/component/knockoff/proc/Knockoff(mob/living/carbon/human/wearer,mob/living/attacker,zone) + var/obj/item/item_parent = parent + if(ismob(item_parent.loc)) + UnregisterSignal(item_parent.loc, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) + +/// Signal proc for [COMSIG_HUMAN_DISARM_HIT] on the mob who's equipped our parent +/// Rolls a chance for knockoff whenever we're disarmed +/datum/component/knockoff/proc/on_equipped_mob_disarm(mob/living/carbon/human/source, mob/living/attacker, zone) SIGNAL_HANDLER - var/obj/item/item = parent - if(!istype(wearer)) + if(!istype(source)) return + if(target_zones && !(zone in target_zones)) return if(!prob(knockoff_chance)) return - if(!wearer.dropItemToGround(item)) + + var/obj/item/item_parent = parent + if(!source.dropItemToGround(item_parent)) return - wearer.visible_message(span_warning("[attacker] knocks off [wearer]'s [item.name]!"),span_userdanger("[attacker] knocks off your [item.name]!")) -///Tries to knockoff the item when user is knocked down -/datum/component/knockoff/proc/Knockoff_knockdown(mob/living/carbon/human/wearer,amount) + source.visible_message( + span_warning("[attacker] knocks off [source]'s [item_parent.name]!"), + span_userdanger("[attacker] knocks off your [item_parent.name]!"), + ) + +/// Signal proc for [COMSIG_LIVING_STATUS_KNOCKDOWN] on the mob who's equipped our parent +/// Rolls a chance for knockoff whenever we're knocked down +/datum/component/knockoff/proc/on_equipped_mob_knockdown(mob/living/carbon/human/source, amount) SIGNAL_HANDLER - if(amount <= 0) + if(!istype(source)) return - var/obj/item/item = parent - if(!istype(wearer)) + // Healing knockdown or setting knockdown to zero or something? Don't knock off. + if(amount <= 0) return if(!prob(knockoff_chance)) return - if(!wearer.dropItemToGround(item)) + + var/obj/item/item_parent = parent + if(!source.dropItemToGround(item_parent)) return - wearer.visible_message(span_warning("[wearer]'s [item.name] get[item.p_s()] knocked off!"),span_userdanger("Your [item.name] [item.p_were()] knocked off!")) + source.visible_message( + span_warning("[source]'s [item_parent.name] get[item_parent.p_s()] knocked off!"), + span_userdanger("Your [item_parent.name] [item_parent.p_were()] knocked off!"), + ) -/datum/component/knockoff/proc/OnEquipped(datum/source, mob/living/carbon/human/H,slot) +/// Signal proc for [COMSIG_ITEM_EQUIPPED] +/// Registers our signals which can cause a knockdown whenever we're equipped correctly +/datum/component/knockoff/proc/on_equipped(datum/source, mob/living/carbon/human/equipper, slot) SIGNAL_HANDLER - if(!istype(H)) + + if(!istype(equipper)) return - if(slots_knockoffable && !(slot in slots_knockoffable)) - UnregisterSignal(H, COMSIG_HUMAN_DISARM_HIT) - UnregisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN) + + if(slots_knockoffable && !(slot & slots_knockoffable)) + UnregisterSignal(equipper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) return - RegisterSignal(H, COMSIG_HUMAN_DISARM_HIT, PROC_REF(Knockoff), TRUE) - RegisterSignal(H, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(Knockoff_knockdown), TRUE) -/datum/component/knockoff/proc/OnDropped(datum/source, mob/living/M) + RegisterSignal(equipper, COMSIG_HUMAN_DISARM_HIT, PROC_REF(on_equipped_mob_disarm), TRUE) + RegisterSignal(equipper, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(on_equipped_mob_knockdown), TRUE) + +/// Signal proc for [COMSIG_ITEM_DROPPED] +/// Unregisters our signals which can cause a knockdown when we're unequipped (dropped) +/datum/component/knockoff/proc/on_dropped(datum/source, mob/living/dropper) SIGNAL_HANDLER - UnregisterSignal(M, COMSIG_HUMAN_DISARM_HIT) - UnregisterSignal(M, COMSIG_LIVING_STATUS_KNOCKDOWN) + UnregisterSignal(dropper, list(COMSIG_HUMAN_DISARM_HIT, COMSIG_LIVING_STATUS_KNOCKDOWN)) diff --git a/code/datums/components/lock_on_cursor.dm b/code/datums/components/lock_on_cursor.dm new file mode 100644 index 000000000000..b57b536ae5a3 --- /dev/null +++ b/code/datums/components/lock_on_cursor.dm @@ -0,0 +1,215 @@ +#define LOCKON_IGNORE_RESULT "ignore_my_result" +#define LOCKON_RANGING_BREAK_CHECK if(current_ranging_id != this_id){return LOCKON_IGNORE_RESULT} + +/** + * ### Lock on Cursor component + * + * Finds the nearest targets to your cursor and passes them into a callback, also drawing an icon on top of them. + */ +/datum/component/lock_on_cursor + dupe_mode = COMPONENT_DUPE_ALLOWED + /// Appearance to overlay onto whatever we are targetting + var/mutable_appearance/lock_appearance + /// Current images we are displaying to the client + var/list/image/lock_images + /// Typecache of things we are allowed to target + var/list/target_typecache + /// Cache of weakrefs to ignore targetting formatted as `list(weakref = TRUE)` + var/list/immune_weakrefs + /// Number of things we can target at once + var/lock_amount + /// Range to search for targets from the cursor position + var/lock_cursor_range + /// Weakrefs to current locked targets + var/list/locked_weakrefs + /// Callback to call when we have decided on our targets, is passed the list of final targets + var/datum/callback/on_lock + /// Callback to call in order to validate a potential target + var/datum/callback/can_target_callback + /// Full screen overlay which is used to track mouse position + var/atom/movable/screen/fullscreen/cursor_catcher/lock_on/mouse_tracker + /// Ranging ID for some kind of tick check safety calculation + var/current_ranging_id = 0 + +/datum/component/lock_on_cursor/Initialize( + lock_cursor_range = 5, + lock_amount = 1, + list/target_typecache = list(), + list/immune = list(), + icon = 'icons/mob/cameramob.dmi', + icon_state = "marker", + datum/callback/on_lock, + datum/callback/can_target_callback, +) + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + if (lock_amount < 1 || lock_cursor_range < 0) + CRASH("Invalid range or amount argument") + src.lock_cursor_range = lock_cursor_range + src.target_typecache = target_typecache + src.lock_amount = lock_amount + src.on_lock = on_lock + src.can_target_callback = can_target_callback ? can_target_callback : CALLBACK(src, PROC_REF(can_target)) + immune_weakrefs = list(WEAKREF(parent) = TRUE) //Manually take this out if you want.. + for(var/immune_thing in immune) + if(isweakref(immune_thing)) + immune_weakrefs[immune_thing] = TRUE + else if(isatom(immune_thing)) + immune_weakrefs[WEAKREF(immune_thing)] = TRUE + lock_appearance = mutable_appearance(icon = icon, icon_state = icon_state, layer = FLOAT_LAYER) + var/mob/owner = parent + mouse_tracker = owner.overlay_fullscreen("lock_on", /atom/movable/screen/fullscreen/cursor_catcher/lock_on, 0) + mouse_tracker.assign_to_mob(owner) + START_PROCESSING(SSfastprocess, src) + +/datum/component/lock_on_cursor/Destroy() + clear_visuals() + STOP_PROCESSING(SSfastprocess, src) + mouse_tracker = null + var/mob/owner = parent + owner.clear_fullscreen("lock_on") + return ..() + +/// Adds overlays to all targets +/datum/component/lock_on_cursor/proc/show_visuals() + LAZYINITLIST(lock_images) + var/mob/owner = parent + if(!owner.client) + return + for(var/datum/weakref/weak_target as anything in locked_weakrefs) + var/atom/target = weak_target.resolve() + if(!target) + continue //It'll be cleared by processing. + var/image/target_overlay = new + target_overlay.appearance = lock_appearance + target_overlay.loc = target + owner.client.images |= target_overlay + lock_images |= target_overlay + +/// Removes target overlays +/datum/component/lock_on_cursor/proc/clear_visuals() + var/mob/owner = parent + if(!owner.client) + return + if(!length(lock_images)) + return + for(var/image/overlay as anything in lock_images) + owner.client.images -= overlay + qdel(overlay) + lock_images.Cut() + +/// Reset the overlays on all targets +/datum/component/lock_on_cursor/proc/refresh_visuals() + clear_visuals() + show_visuals() + +/datum/component/lock_on_cursor/process() + if(mouse_tracker.mouse_params) + mouse_tracker.calculate_params() + if(!mouse_tracker.given_turf) + return + clear_invalid_targets() + if(length(locked_weakrefs) < lock_amount) + find_targets() + +/// Removes targets which are out of range or don't exist any more +/datum/component/lock_on_cursor/proc/clear_invalid_targets() + for(var/datum/weakref/weak_target as anything in locked_weakrefs) + var/atom/thing = weak_target.resolve() + if(thing && (get_dist(thing, mouse_tracker.given_turf) > lock_cursor_range)) + continue + LAZYREMOVE(locked_weakrefs, weak_target) + +/// Replace our targets with new ones +/datum/component/lock_on_cursor/proc/find_targets() + var/mob/owner = parent + if(!owner.client) + return + var/list/atom/targets = get_nearest(mouse_tracker.given_turf, target_typecache, lock_amount, lock_cursor_range) + if(targets == LOCKON_IGNORE_RESULT) + return + LAZYCLEARLIST(locked_weakrefs) + for(var/atom/target as anything in targets) + if(immune_weakrefs[WEAKREF(target)]) + continue + LAZYOR(locked_weakrefs, WEAKREF(target)) + refresh_visuals() + on_lock.Invoke(locked_weakrefs) + +/// Returns true if target is a valid target +/datum/component/lock_on_cursor/proc/can_target(atom/target) + var/mob/mob_target = target + return is_type_in_typecache(target, target_typecache) && !(ismob(target) && mob_target.stat != CONSCIOUS) && !immune_weakrefs[WEAKREF(target)] + +/// Returns the nearest targets to the current cursor position +/datum/component/lock_on_cursor/proc/get_nearest() + current_ranging_id++ + var/this_id = current_ranging_id + var/list/targets = list() + var/turf/target_turf = mouse_tracker.given_turf + var/turf/center = target_turf + if(!length(target_typecache)) + return + if(lock_cursor_range == 0) + return typecache_filter_list(target_turf.contents + target_turf, target_typecache) + var/x = 0 + var/y = 0 + var/cd = 0 + while(cd <= lock_cursor_range) + x = center.x - cd + 1 + y = center.y + cd + LOCKON_RANGING_BREAK_CHECK + for(x in x to center.x + cd) + target_turf = locate(x, y, center.z) + if(target_turf) + targets |= special_list_filter(target_turf.contents, can_target_callback) + if(targets.len >= lock_amount) + targets.Cut(lock_amount+1) + return targets + LOCKON_RANGING_BREAK_CHECK + y = center.y + cd - 1 + x = center.x + cd + for(y in center.y - cd to y) + target_turf = locate(x, y, center.z) + if(target_turf) + targets |= special_list_filter(target_turf.contents, can_target_callback) + if(targets.len >= lock_amount) + targets.Cut(lock_amount+1) + return targets + LOCKON_RANGING_BREAK_CHECK + y = center.y - cd + x = center.x + cd - 1 + for(x in center.x - cd to x) + target_turf = locate(x, y, center.z) + if(target_turf) + targets |= special_list_filter(target_turf.contents, can_target_callback) + if(targets.len >= lock_amount) + targets.Cut(lock_amount+1) + return targets + LOCKON_RANGING_BREAK_CHECK + y = center.y - cd + 1 + x = center.x - cd + for(y in y to center.y + cd) + target_turf = locate(x, y, center.z) + if(target_turf) + targets |= special_list_filter(target_turf.contents, can_target_callback) + if(targets.len >= lock_amount) + targets.Cut(lock_amount+1) + return targets + LOCKON_RANGING_BREAK_CHECK + cd++ + CHECK_TICK + +/// Tracks cursor movement and passes clicks through to the turf under the cursor +/atom/movable/screen/fullscreen/cursor_catcher/lock_on + +/atom/movable/screen/fullscreen/cursor_catcher/lock_on/Click(location, control, params) + . = ..() + if(.) + return FALSE + + calculate_params() + given_turf.Click(location, control, params) + +#undef LOCKON_IGNORE_RESULT +#undef LOCKON_RANGING_BREAK_CHECK diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm deleted file mode 100644 index 03087962871c..000000000000 --- a/code/datums/components/lockon_aiming.dm +++ /dev/null @@ -1,214 +0,0 @@ -#define LOCKON_AIMING_MAX_CURSOR_RADIUS 7 -#define LOCKON_IGNORE_RESULT "ignore_my_result" -#define LOCKON_RANGING_BREAK_CHECK if(current_ranging_id != this_id){return LOCKON_IGNORE_RESULT} - -/datum/component/lockon_aiming - dupe_mode = COMPONENT_DUPE_ALLOWED - var/lock_icon = 'icons/mob/cameramob.dmi' - var/lock_icon_state = "marker" - var/mutable_appearance/lock_appearance - var/list/image/lock_images - var/list/target_typecache - var/list/immune_weakrefs //list(weakref = TRUE) - var/mob_stat_check = TRUE //if a potential target is a mob make sure it's conscious! - var/lock_amount = 1 - var/lock_cursor_range = 5 - var/list/locked_weakrefs - var/update_disabled = FALSE - var/current_ranging_id = 0 - var/list/last_location - var/datum/callback/on_lock - var/datum/callback/can_target_callback - -/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)) - return COMPONENT_INCOMPATIBLE - if(target_callback) - can_target_callback = target_callback - else - can_target_callback = CALLBACK(src, PROC_REF(can_target)) - if(range) - lock_cursor_range = range - if(typecache) - target_typecache = typecache - if(amount) - lock_amount = amount - immune_weakrefs = list(WEAKREF(parent) = TRUE) //Manually take this out if you want.. - if(immune) - for(var/i in immune) - if(isweakref(i)) - immune_weakrefs[i] = TRUE - else if(isatom(i)) - immune_weakrefs[WEAKREF(i)] = TRUE - if(when_locked) - on_lock = when_locked - if(icon) - lock_icon = icon - if(icon_state) - lock_icon_state = icon_state - generate_lock_visuals() - START_PROCESSING(SSfastprocess, src) - -/datum/component/lockon_aiming/Destroy() - clear_visuals() - STOP_PROCESSING(SSfastprocess, src) - return ..() - -/datum/component/lockon_aiming/proc/show_visuals() - LAZYINITLIST(lock_images) - var/mob/M = parent - if(!M.client) - return - for(var/i in locked_weakrefs) - var/datum/weakref/R = i - var/atom/A = R.resolve() - if(!A) - continue //It'll be cleared by processing. - var/image/I = new - I.appearance = lock_appearance - I.loc = A - M.client.images |= I - lock_images |= I - -/datum/component/lockon_aiming/proc/clear_visuals() - var/mob/M = parent - if(!M.client) - return - if(!lock_images) - return - for(var/i in lock_images) - M.client.images -= i - qdel(i) - lock_images.Cut() - -/datum/component/lockon_aiming/proc/refresh_visuals() - clear_visuals() - show_visuals() - -/datum/component/lockon_aiming/proc/generate_lock_visuals() - lock_appearance = mutable_appearance(icon = lock_icon, icon_state = lock_icon_state, layer = FLOAT_LAYER) - -/datum/component/lockon_aiming/proc/unlock_all(refresh_vis = TRUE) - LAZYCLEARLIST(locked_weakrefs) - if(refresh_vis) - refresh_visuals() - -/datum/component/lockon_aiming/proc/unlock(atom/A, refresh_vis = TRUE) - if(!A.weak_reference) - return - LAZYREMOVE(locked_weakrefs, A.weak_reference) - if(refresh_vis) - refresh_visuals() - -/datum/component/lockon_aiming/proc/lock(atom/A, refresh_vis = TRUE) - LAZYOR(locked_weakrefs, WEAKREF(A)) - if(refresh_vis) - refresh_visuals() - -/datum/component/lockon_aiming/proc/add_immune_atom(atom/A) - var/datum/weakref/R = WEAKREF(A) - if(immune_weakrefs && (immune_weakrefs[R])) - return - LAZYSET(immune_weakrefs, R, TRUE) - -/datum/component/lockon_aiming/proc/remove_immune_atom(atom/A) - if(!A.weak_reference || !immune_weakrefs) //if A doesn't have a weakref how did it get on the immunity list? - return - LAZYREMOVE(immune_weakrefs, A.weak_reference) - -/datum/component/lockon_aiming/process() - if(update_disabled) - return - if(!last_location) - return - var/changed = FALSE - for(var/i in locked_weakrefs) - var/datum/weakref/R = i - if(istype(R)) - var/atom/thing = R.resolve() - if(!istype(thing) || (get_dist(thing, locate(last_location[1], last_location[2], last_location[3])) > lock_cursor_range)) - unlock(R) - changed = TRUE - else - unlock(R) - changed = TRUE - if(changed) - autolock() - -/datum/component/lockon_aiming/proc/autolock() - var/mob/M = parent - if(!M.client) - return FALSE - var/datum/position/current = mouse_absolute_datum_map_position_from_client(M.client) - 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) - return - unlock_all(FALSE) - for(var/i in targets) - if(immune_weakrefs[WEAKREF(i)]) - continue - lock(i, FALSE) - refresh_visuals() - on_lock.Invoke(locked_weakrefs) - -/datum/component/lockon_aiming/proc/can_target(atom/A) - var/mob/M = A - return is_type_in_typecache(A, target_typecache) && !(ismob(A) && mob_stat_check && M.stat != CONSCIOUS) && !immune_weakrefs[WEAKREF(A)] - -/datum/component/lockon_aiming/proc/get_nearest(turf/T, list/typecache, amount, range) - current_ranging_id++ - var/this_id = current_ranging_id - var/list/L = list() - var/turf/center = get_turf(T) - if(amount < 1 || range < 0 || !istype(center) || !islist(typecache)) - return - if(range == 0) - return typecache_filter_list(T.contents + T, typecache) - var/x = 0 - var/y = 0 - var/cd = 0 - while(cd <= range) - x = center.x - cd + 1 - y = center.y + cd - LOCKON_RANGING_BREAK_CHECK - for(x in x to center.x + cd) - T = locate(x, y, center.z) - if(T) - L |= special_list_filter(T.contents, can_target_callback) - if(L.len >= amount) - L.Cut(amount+1) - return L - LOCKON_RANGING_BREAK_CHECK - y = center.y + cd - 1 - x = center.x + cd - for(y in center.y - cd to y) - T = locate(x, y, center.z) - if(T) - L |= special_list_filter(T.contents, can_target_callback) - if(L.len >= amount) - L.Cut(amount+1) - return L - LOCKON_RANGING_BREAK_CHECK - y = center.y - cd - x = center.x + cd - 1 - for(x in center.x - cd to x) - T = locate(x, y, center.z) - if(T) - L |= special_list_filter(T.contents, can_target_callback) - if(L.len >= amount) - L.Cut(amount+1) - return L - LOCKON_RANGING_BREAK_CHECK - y = center.y - cd + 1 - x = center.x - cd - for(y in y to center.y + cd) - T = locate(x, y, center.z) - if(T) - L |= special_list_filter(T.contents, can_target_callback) - if(L.len >= amount) - L.Cut(amount+1) - return L - LOCKON_RANGING_BREAK_CHECK - cd++ - CHECK_TICK diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index c4f5667a5253..249c09625f98 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -65,12 +65,9 @@ /datum/component/material_container/Destroy(force, silent) materials = null allowed_materials = null - if(insertion_check) - QDEL_NULL(insertion_check) - if(precondition) - QDEL_NULL(precondition) - if(after_insert) - QDEL_NULL(after_insert) + insertion_check = null + precondition = null + after_insert = null return ..() @@ -140,7 +137,7 @@ to_chat(user, span_warning("[parent] can't hold any more of [I] sheets.")) return //split the amount we don't need off - INVOKE_ASYNC(stack_to_split, TYPE_PROC_REF(/obj/item/stack, split_stack), user, stack_to_split.amount - sheets_to_insert) + INVOKE_ASYNC(stack_to_split, TYPE_PROC_REF(/obj/item/stack, split_stack), user, stack_to_split.amount - sheets_to_insert, user) else to_chat(user, span_warning("[I] contains more materials than [parent] has space to hold.")) return diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 372322af6a71..66ad1cc37885 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -80,7 +80,7 @@ linked_mobs.Cut() QDEL_NULL(linker_action) QDEL_NULL(master_speech) - QDEL_NULL(post_unlink_callback) + post_unlink_callback = null return ..() /datum/component/mind_linker/RegisterWithParent() diff --git a/code/datums/components/mirage_border.dm b/code/datums/components/mirage_border.dm deleted file mode 100644 index a366f4b822f6..000000000000 --- a/code/datums/components/mirage_border.dm +++ /dev/null @@ -1,42 +0,0 @@ -/datum/component/mirage_border - can_transfer = TRUE - var/obj/effect/abstract/mirage_holder/holder - -/datum/component/mirage_border/Initialize(turf/target, direction, range=world.view) - if(!isturf(parent)) - return COMPONENT_INCOMPATIBLE - if(!target || !istype(target) || !direction) - . = COMPONENT_INCOMPATIBLE - CRASH("[type] improperly instanced with the following args: target=\[[target]\], direction=\[[direction]\], range=\[[range]\]") - - holder = new(parent) - - var/x = target.x - var/y = target.y - var/z = target.z - var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) - var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), clamp(z, 1, world.maxz)) - //holder.vis_contents += block(southwest, northeast) // This doesnt work because of beta bug memes - for(var/i in block(southwest, northeast)) - holder.vis_contents += i - if(direction & SOUTH) - holder.pixel_y -= world.icon_size * range - if(direction & WEST) - holder.pixel_x -= world.icon_size * range - -/datum/component/mirage_border/Destroy() - QDEL_NULL(holder) - return ..() - -/datum/component/mirage_border/PreTransfer() - holder.moveToNullspace() - -/datum/component/mirage_border/PostTransfer() - if(!isturf(parent)) - return COMPONENT_INCOMPATIBLE - holder.forceMove(parent) - -/obj/effect/abstract/mirage_holder - name = "Mirage holder" - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm deleted file mode 100644 index 976dd07ef1e9..000000000000 --- a/code/datums/components/mood.dm +++ /dev/null @@ -1,437 +0,0 @@ -#define MINOR_INSANITY_PEN 5 -#define MAJOR_INSANITY_PEN 10 - -/datum/component/mood - var/mood //Real happiness - var/sanity = SANITY_NEUTRAL //Current sanity - var/shown_mood //Shown happiness, this is what others can see when they try to examine you, prevents antag checking by noticing traitors are always very happy. - var/mood_level = 5 //To track what stage of moodies they're on - var/sanity_level = 2 //To track what stage of sanity they're on - var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets - var/list/datum/mood_event/mood_events = list() - var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? - var/atom/movable/screen/mood/screen_obj - -/datum/component/mood/Initialize() - if(!isliving(parent)) - return COMPONENT_INCOMPATIBLE - - START_PROCESSING(SSmood, src) - - RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, PROC_REF(add_event)) - RegisterSignal(parent, COMSIG_CLEAR_MOOD_EVENT, PROC_REF(clear_event)) - RegisterSignal(parent, COMSIG_ENTER_AREA, PROC_REF(check_area_mood)) - RegisterSignal(parent, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) - RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, PROC_REF(modify_hud)) - RegisterSignal(parent, COMSIG_JOB_RECEIVED, PROC_REF(register_job_signals)) - RegisterSignal(parent, COMSIG_HERETIC_MASK_ACT, PROC_REF(direct_sanity_drain)) - RegisterSignal(parent, COMSIG_ON_CARBON_SLIP, PROC_REF(on_slip)) - - var/mob/living/owner = parent - owner.become_area_sensitive(MOOD_COMPONENT_TRAIT) - if(owner.hud_used) - modify_hud() - var/datum/hud/hud = owner.hud_used - hud.show_hud(hud.hud_version) - -/datum/component/mood/Destroy() - STOP_PROCESSING(SSmood, src) - var/atom/movable/movable_parent = parent - movable_parent.lose_area_sensitivity(MOOD_COMPONENT_TRAIT) - unmodify_hud() - return ..() - -/datum/component/mood/proc/register_job_signals(datum/source, job) - SIGNAL_HANDLER - - if(job in list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST)) - RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT_RND, PROC_REF(add_event)) //Mood events that are only for RnD members - -/datum/component/mood/proc/print_mood(mob/user) - var/msg = "[span_info("*---------*\nMy current mental status:")]\n" - msg += span_notice("My current sanity: ") //Long term - switch(sanity) - if(SANITY_GREAT to INFINITY) - msg += "[span_boldnicegreen("My mind feels like a temple!")]\n" - if(SANITY_NEUTRAL to SANITY_GREAT) - msg += "[span_nicegreen("I have been feeling great lately!")]\n" - if(SANITY_DISTURBED to SANITY_NEUTRAL) - msg += "[span_nicegreen("I have felt quite decent lately.")]\n" - if(SANITY_UNSTABLE to SANITY_DISTURBED) - msg += "[span_warning("I'm feeling a little bit unhinged...")]\n" - if(SANITY_CRAZY to SANITY_UNSTABLE) - msg += "[span_warning("I'm freaking out!!")]\n" - if(SANITY_INSANE to SANITY_CRAZY) - msg += "[span_boldwarning("AHAHAHAHAHAHAHAHAHAH!!")]\n" - - msg += span_notice("My current mood: ") //Short term - switch(mood_level) - if(1) - msg += "[span_boldwarning("I wish I was dead!")]\n" - if(2) - msg += "[span_boldwarning("I feel terrible...")]\n" - if(3) - msg += "[span_boldwarning("I feel very upset.")]\n" - if(4) - msg += "[span_warning("I'm a bit sad.")]\n" - if(5) - msg += "[span_grey("I'm alright.")]\n" - if(6) - msg += "[span_nicegreen("I feel pretty okay.")]\n" - if(7) - msg += "[span_boldnicegreen("I feel pretty good.")]\n" - if(8) - msg += "[span_boldnicegreen("I feel amazing!")]\n" - if(9) - msg += "[span_boldnicegreen("I love life!")]\n" - - msg += "[span_notice("Moodlets:")]\n"//All moodlets - if(mood_events.len) - for(var/i in mood_events) - var/datum/mood_event/event = mood_events[i] - switch(event.mood_change) - if(-INFINITY to MOOD_LEVEL_SAD2) - msg += span_boldwarning(event.description + "\n") - if(MOOD_LEVEL_SAD2 to MOOD_LEVEL_SAD1) - msg += span_warning(event.description + "\n") - if(MOOD_LEVEL_SAD1 to MOOD_LEVEL_HAPPY1) - msg += span_grey(event.description + "\n") - if(MOOD_LEVEL_HAPPY1 to MOOD_LEVEL_HAPPY2) - msg += span_nicegreen(event.description + "\n") - if(MOOD_LEVEL_HAPPY2 to INFINITY) - msg += span_boldnicegreen(event.description + "\n") - else - msg += "[span_grey("I don't have much of a reaction to anything right now.")]\n" - to_chat(user, examine_block(msg)) //PARIAH EDIT CHANGE - -///Called after moodevent/s have been added/removed. -/datum/component/mood/proc/update_mood() - mood = 0 - shown_mood = 0 - for(var/i in mood_events) - var/datum/mood_event/event = mood_events[i] - mood += event.mood_change - if(!event.hidden) - shown_mood += event.mood_change - mood *= mood_modifier - shown_mood *= mood_modifier - - switch(mood) - if(-INFINITY to MOOD_LEVEL_SAD4) - mood_level = 1 - if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) - mood_level = 2 - if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) - mood_level = 3 - if(MOOD_LEVEL_SAD2 to MOOD_LEVEL_SAD1) - mood_level = 4 - if(MOOD_LEVEL_SAD1 to MOOD_LEVEL_HAPPY1) - mood_level = 5 - if(MOOD_LEVEL_HAPPY1 to MOOD_LEVEL_HAPPY2) - mood_level = 6 - if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) - mood_level = 7 - if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) - mood_level = 8 - if(MOOD_LEVEL_HAPPY4 to INFINITY) - mood_level = 9 - update_mood_icon() - -/datum/component/mood/proc/update_mood_icon() - var/mob/living/owner = parent - if(!(owner.client || owner.hud_used)) - return - screen_obj.cut_overlays() - screen_obj.color = initial(screen_obj.color) - //lets see if we have any special icons to show instead of the normal mood levels - var/list/conflicting_moodies = list() - var/highest_absolute_mood = 0 - for(var/i in mood_events) //adds overlays and sees which special icons need to vie for which one gets the icon_state - var/datum/mood_event/event = mood_events[i] - if(!event.special_screen_obj) - continue - if(!event.special_screen_replace) - screen_obj.add_overlay(event.special_screen_obj) - else - conflicting_moodies += event - var/absmood = abs(event.mood_change) - if(absmood > highest_absolute_mood) - highest_absolute_mood = absmood - - switch(sanity_level) - if(1) - screen_obj.color = "#2eeb9a" - if(2) - screen_obj.color = "#86d656" - if(3) - screen_obj.color = "#4b96c4" - if(4) - screen_obj.color = "#dfa65b" - if(5) - screen_obj.color = "#f38943" - if(6) - screen_obj.color = "#f15d36" - - if(!conflicting_moodies.len) //no special icons- go to the normal icon states - screen_obj.icon_state = "mood[mood_level]" - return - - for(var/i in conflicting_moodies) - var/datum/mood_event/event = i - if(abs(event.mood_change) == highest_absolute_mood) - screen_obj.icon_state = "[event.special_screen_obj]" - break - -///Called on SSmood process -/datum/component/mood/process(delta_time) - var/mob/living/moody_fellow = parent - if(moody_fellow.stat == DEAD) - return //updating sanity during death leads to people getting revived and being completely insane for simply being dead for a long time - switch(mood_level) - if(1) - setSanity(sanity-0.3*delta_time, SANITY_INSANE) - if(2) - setSanity(sanity-0.15*delta_time, SANITY_INSANE) - if(3) - setSanity(sanity-0.1*delta_time, SANITY_CRAZY) - if(4) - setSanity(sanity-0.05*delta_time, SANITY_UNSTABLE) - if(5) - setSanity(sanity, SANITY_UNSTABLE) //This makes sure that mood gets increased should you be below the minimum. - if(6) - setSanity(sanity+0.2*delta_time, SANITY_UNSTABLE) - if(7) - setSanity(sanity+0.3*delta_time, SANITY_UNSTABLE) - if(8) - setSanity(sanity+0.4*delta_time, SANITY_NEUTRAL, SANITY_MAXIMUM) - if(9) - setSanity(sanity+0.6*delta_time, SANITY_NEUTRAL, SANITY_MAXIMUM) - HandleNutrition() - - // 0.416% is 15 successes / 3600 seconds. Calculated with 2 minute - // mood runtime, so 50% average uptime across the hour. - if(HAS_TRAIT(parent, TRAIT_DEPRESSION) && DT_PROB(0.416, delta_time)) - add_event(null, "depression_mild", /datum/mood_event/depression_mild) - - if(HAS_TRAIT(parent, TRAIT_JOLLY) && DT_PROB(0.416, delta_time)) - add_event(null, "jolly", /datum/mood_event/jolly) - -///Sets sanity to the specified amount and applies effects. -/datum/component/mood/proc/setSanity(amount, minimum=SANITY_INSANE, maximum=SANITY_GREAT, override = FALSE) - // If we're out of the acceptable minimum-maximum range move back towards it in steps of 0.7 - // If the new amount would move towards the acceptable range faster then use it instead - if(amount < minimum) - amount += clamp(minimum - amount, 0, 0.7) - if((!override && HAS_TRAIT(parent, TRAIT_UNSTABLE)) || amount > maximum) - amount = min(sanity, amount) - if(amount == sanity) //Prevents stuff from flicking around. - return - sanity = amount - var/mob/living/master = parent - SEND_SIGNAL(master, COMSIG_CARBON_SANITY_UPDATE, amount) - switch(sanity) - if(SANITY_INSANE to SANITY_CRAZY) - setInsanityEffect(MAJOR_INSANITY_PEN) - master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/insane) - 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(/datum/movespeed_modifier/sanity/crazy) - master.add_actionspeed_modifier(/datum/actionspeed_modifier/low_sanity) - sanity_level = 5 - if(SANITY_UNSTABLE to SANITY_DISTURBED) - setInsanityEffect(0) - master.add_movespeed_modifier(/datum/movespeed_modifier/sanity/disturbed) - 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) - 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) - 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) - master.add_actionspeed_modifier(/datum/actionspeed_modifier/high_sanity) - sanity_level = 1 - update_mood_icon() - -/datum/component/mood/proc/setInsanityEffect(newval) - if(newval == insanity_effect) - return - var/mob/living/master = parent - master.crit_threshold = (master.crit_threshold - insanity_effect) + newval - insanity_effect = newval - -/datum/component/mood/proc/add_event(datum/source, category, type, ...) //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(!ispath(type, /datum/mood_event)) - return - if(!istext(category)) - category = REF(category) - if(mood_events[category]) - the_event = mood_events[category] - if(the_event.type != type) - clear_event(null, category) - else - if(the_event.timeout) - addtimer(CALLBACK(src, PROC_REF(clear_event), null, category), the_event.timeout, TIMER_UNIQUE|TIMER_OVERRIDE) - return //Don't have to update the event. - var/list/params = args.Copy(4) - params.Insert(1, parent) - the_event = new type(arglist(params)) - - mood_events[category] = the_event - the_event.category = category - update_mood() - - if(the_event.timeout) - addtimer(CALLBACK(src, PROC_REF(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] - if(!event) - return - - mood_events -= category - qdel(event) - update_mood() - -/datum/component/mood/proc/remove_temp_moods() //Removes all temp moods - for(var/i in mood_events) - var/datum/mood_event/moodlet = mood_events[i] - if(!moodlet || !moodlet.timeout) - continue - mood_events -= moodlet.category - qdel(moodlet) - update_mood() - -/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 - screen_obj.color = "#4b96c4" - hud.infodisplay += screen_obj - RegisterSignal(hud, COMSIG_PARENT_QDELETING, PROC_REF(unmodify_hud)) - RegisterSignal(screen_obj, COMSIG_CLICK, PROC_REF(hud_click)) - -/datum/component/mood/proc/unmodify_hud(datum/source) - SIGNAL_HANDLER - - if(!screen_obj) - return - var/mob/living/owner = parent - var/datum/hud/hud = owner.hud_used - if(hud?.infodisplay) - hud.infodisplay -= screen_obj - QDEL_NULL(screen_obj) - -/datum/component/mood/proc/hud_click(datum/source, location, control, params, mob/user) - SIGNAL_HANDLER - - if(user != parent) - return - print_mood(user) - -/datum/component/mood/proc/HandleNutrition() - var/mob/living/L = parent - if(HAS_TRAIT(L, TRAIT_NOHUNGER)) - return FALSE //no mood events for nutrition - switch(L.nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - if (!HAS_TRAIT(L, TRAIT_VORACIOUS)) - add_event(null, "nutrition", /datum/mood_event/fat) - else - add_event(null, "nutrition", /datum/mood_event/wellfed) // round and full - if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - add_event(null, "nutrition", /datum/mood_event/wellfed) - if( NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - add_event(null, "nutrition", /datum/mood_event/fed) - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - clear_event(null, "nutrition") - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - add_event(null, "nutrition", /datum/mood_event/hungry) - if(0 to NUTRITION_LEVEL_STARVING) - add_event(null, "nutrition", /datum/mood_event/starving) - -/datum/component/mood/proc/check_area_mood(datum/source, area/A) - SIGNAL_HANDLER - - update_beauty(A) - if(A.mood_bonus && (!A.mood_trait || HAS_TRAIT(source, A.mood_trait))) - add_event(null, "area", /datum/mood_event/area, A.mood_bonus, A.mood_message) - else - clear_event(null, "area") - -/datum/component/mood/proc/update_beauty(area/A) - if(A.outdoors) //if we're outside, we don't care. - clear_event(null, "area_beauty") - return FALSE - if(HAS_TRAIT(parent, TRAIT_SNOB)) - switch(A.beauty) - if(-INFINITY to BEAUTY_LEVEL_HORRID) - add_event(null, "area_beauty", /datum/mood_event/horridroom) - return - if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD) - add_event(null, "area_beauty", /datum/mood_event/badroom) - return - switch(A.beauty) - if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_DECENT) - clear_event(null, "area_beauty") - if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD) - add_event(null, "area_beauty", /datum/mood_event/decentroom) - if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT) - add_event(null, "area_beauty", /datum/mood_event/goodroom) - if(BEAUTY_LEVEL_GREAT to INFINITY) - add_event(null, "area_beauty", /datum/mood_event/greatroom) - -///Called when parent is ahealed. -/datum/component/mood/proc/on_revive(datum/source, full_heal) - SIGNAL_HANDLER - - if(!full_heal) - return - remove_temp_moods() - setSanity(initial(sanity), override = TRUE) - - -///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, override = TRUE) - -///Called when parent slips. -/datum/component/mood/proc/on_slip(datum/source) - SIGNAL_HANDLER - - add_event(null, "slipped", /datum/mood_event/slipped) - -/datum/component/mood/proc/HandleAddictions() - if(!iscarbon(parent)) - return - - var/mob/living/carbon/affected_carbon = parent - - if(sanity < SANITY_GREAT) ///Sanity is low, stay addicted. - return - - for(var/addiction_type in affected_carbon.mind.addiction_points) - var/datum/addiction/addiction_to_remove = SSaddiction.all_addictions[type] - affected_carbon.mind.remove_addiction_points(type, addiction_to_remove.high_sanity_addiction_loss) //If true was returned, we lost the addiction! - -#undef MINOR_INSANITY_PEN -#undef MAJOR_INSANITY_PEN diff --git a/code/datums/components/ntnet_interface.dm b/code/datums/components/ntnet_interface.dm deleted file mode 100644 index 719c693323cd..000000000000 --- a/code/datums/components/ntnet_interface.dm +++ /dev/null @@ -1,142 +0,0 @@ - -/* - * Helper function that does 90% of the work in sending a packet - * - * This function gets the component and builds a packet so the sending - * person doesn't have to lift a finger. Just create a netdata datum or even - * just a list and it will send it on its merry way. - * - * Arguments: - * * packet_data - Either a list() or a /datum/netdata. If its netdata, the other args are ignored - * * target_id - Target hardware id or network_id for this packet. If we are a network id, then its - broadcasted to that network. - * * passkey - Authentication for the packet. If the target doesn't authenticate the packet is dropped - */ -/datum/proc/ntnet_send(packet_data, target_id = null, passkey = null) - var/datum/netdata/data = packet_data - if(!istype(data)) // construct netdata from list() - if(!islist(packet_data)) - stack_trace("ntnet_send: Bad packet creation") // hard fail as its runtime fault - return - data = new(packet_data) - data.receiver_id = target_id - data.passkey = passkey - var/datum/component/ntnet_interface/NIC = GetComponent(/datum/component/ntnet_interface) - if(!NIC) - return NETWORK_ERROR_NOT_ON_NETWORK - data.sender_id = NIC.hardware_id - data.network_id = NIC.network.network_id - data.receiver_id ||= data.network_id - return SSnetworks.transmit(data) - -/* - * # /datum/component/ntnet_interface - * - * This component connects a obj/datum to the station network. - * - * Anything can be connected to the station network. Any obj can auto connect as long as its network_id - * var is set before the parent new is called. This allows map objects to be connected. Technically the - * component only handles getting you on the network while SSnetwork and datum/ntnet does all the real work. - * There are quite a few stack_traces in here. This is because error checking should be done before this component is - * added. Also, there never should be a component that has no network. If it needs a network assign it to LIMBO - * - */ -/datum/component/ntnet_interface - var/hardware_id = null // text. this is the true ID. do not change this. stuff like ID forgery can be done manually. - var/id_tag = null // named tag, mainly used to look up mapping objects - var/datum/ntnet/network = null // network we are on, we MUST be on a network or there is no point in this component - var/list/registered_sockets = list()// list of ports opened up on devices - var/list/alias = list() // if we live in more than one network branch - -/** - * Initialize for the interface - * - * Assigns a hardware id and gets your object onto the network - * - * Arguments: - * * network_name - Fully qualified network id of the network we are joining - * * network_tag - The objects id_tag. Used for finding the device at mapload time - */ -/datum/component/ntnet_interface/Initialize(network_name, network_tag = null) - if(network_name == null || !istext(network_name)) - log_telecomms("ntnet_interface/Initialize: Bad network '[network_name]' for '[parent]', going to limbo it") - network_name = LIMBO_NETWORK_ROOT - // Tags cannot be numbers and must be unique over the world - if(network_tag != null && !istext(network_tag)) - // numbers are not allowed as lookups for interfaces - log_telecomms("Tag cannot be a number? '[network_name]' for '[parent]', going to limbo it") - network_tag = "BADTAG_" + network_tag - - hardware_id = SSnetworks.get_next_HID() - id_tag = network_tag - SSnetworks.interfaces_by_hardware_id[hardware_id] = src - - network = SSnetworks.create_network_simple(network_name) - - network.add_interface(src) - - -/** - * Create a port for this interface - * - * A port is basicity a shared associated list() with some values that - * indicated its been updated. (see _DEFINES/network.dm). By using a shared - * we don't have to worry about qdeling this object if it goes out of scope. - * - * Once a port is created any number of devices can use the port, however only - * the creating interface can disconnect it. - * - * Arguments: - * * port - text, Name of the port installed on this interface - * * data - list, shared list of data. Don't put objects in this - */ -/datum/component/ntnet_interface/proc/register_port(port, list/data) - if(!port || !length(data)) - stack_trace("port is null or data is empty") - return - if(registered_sockets[port]) - stack_trace("port already regestered") - return - data["_updated"] = FALSE - registered_sockets[port] = data - -/** - * Disconnects an existing port in the interface - * - * Removes a port from this interface and marks it that its - * has been disconnected - * - * Arguments: - * * port - text, Name of the port installed on this interface - * * data - list, shared list of data. Don't put objects in this - */ -/datum/component/ntnet_interface/proc/deregister_port(port) - if(registered_sockets[port]) // should I runtime if this isn't in here? - var/list/datalink = registered_sockets[port] - NETWORK_PORT_DISCONNECT(datalink) - // this should remove all outstanding ports - registered_sockets.Remove(port) - - -/** - * Connect to a port on this interface - * - * Returns the shared list that this interface uses to send - * data though a port. - * - * Arguments: - * * port - text, Name of the port installed on this interface - */ -/datum/component/ntnet_interface/proc/connect_port(port) - return registered_sockets[port] - - - -/datum/component/ntnet_interface/Destroy() - network.remove_interface(src, TRUE) - SSnetworks.interfaces_by_hardware_id.Remove(hardware_id) - for(var/port in registered_sockets) - var/list/datalink = registered_sockets[port] - NETWORK_PORT_DISCONNECT(datalink) - registered_sockets.Cut() - return ..() diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index 15e2545f4789..fa64a2f69b98 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -39,10 +39,9 @@ /datum/component/omen/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(check_accident)) RegisterSignal(parent, COMSIG_LIVING_STATUS_KNOCKDOWN, PROC_REF(check_slip)) - RegisterSignal(parent, COMSIG_ADD_MOOD_EVENT, PROC_REF(check_bless)) /datum/component/omen/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED, COMSIG_ADD_MOOD_EVENT)) + UnregisterSignal(parent, list(COMSIG_LIVING_STATUS_KNOCKDOWN, COMSIG_MOVABLE_MOVED)) /** * check_accident() is called each step we take @@ -72,7 +71,7 @@ return for(var/turf/the_turf as anything in get_adjacent_open_turfs(living_guy)) - if(the_turf.zPassOut(living_guy, DOWN) && living_guy.can_z_move(DOWN, the_turf, z_move_flags = ZMOVE_FALL_FLAGS)) + if(the_turf.CanZPass(living_guy, DOWN, z_move_flags = ZMOVE_FALL_FLAGS) && living_guy.can_z_move(DOWN, the_turf, ZMOVE_FALL_FLAGS)) to_chat(living_guy, span_warning("A malevolent force guides you towards the edge...")) living_guy.throw_at(the_turf, 1, 10, force = MOVE_FORCE_EXTREMELY_STRONG) if(!permanent) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 3ba6ba22c07f..d0c061be12c2 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -162,13 +162,20 @@ ///////////////////// /atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE) - if(!istype(A) || !get_turf(A) || A == src) + if(!istype(A) || !get_turf(A) || A == src || isarea(A)) return + + if(istype(A, /atom/movable/openspace/mimic)) + var/atom/movable/openspace/mimic/mimic = A + A = mimic.get_root() + if (HAS_TRAIT(A, TRAIT_ORBITING_FORBIDDEN)) // Stealth-mins have an empty name, don't want "You cannot orbit at this time." to_chat(src, span_notice("You cannot orbit ["[A]" || "them"] at this time.")) return + orbit_target = A + return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation) /atom/movable/proc/stop_orbit(datum/component/orbiter/orbits) diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index 769beac8fee8..5859308e907d 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -76,8 +76,8 @@ return COMPONENT_INCOMPATIBLE var/atom/movable/movable_parent = parent - if(movable_parent.light_system != MOVABLE_LIGHT && movable_parent.light_system != MOVABLE_LIGHT_DIRECTIONAL) - stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [MOVABLE_LIGHT] or [MOVABLE_LIGHT_DIRECTIONAL] instead.") + if(movable_parent.light_system != OVERLAY_LIGHT && movable_parent.light_system != OVERLAY_LIGHT_DIRECTIONAL) + stack_trace("[type] added to [parent], with [movable_parent.light_system] value for the light_system var. Use [OVERLAY_LIGHT] or [OVERLAY_LIGHT_DIRECTIONAL] instead.") return COMPONENT_INCOMPATIBLE . = ..() @@ -420,11 +420,13 @@ /datum/component/overlay_lighting/proc/turn_on() if(overlay_lighting_flags & LIGHTING_ON) return + + overlay_lighting_flags |= LIGHTING_ON if(current_holder) + add_dynamic_lumi() if(directional) cast_directional_light() - add_dynamic_lumi() - overlay_lighting_flags |= LIGHTING_ON + if(current_holder && current_holder != parent && current_holder != parent_attached_to) RegisterSignal(current_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) get_new_turfs() diff --git a/code/datums/components/phylactery.dm b/code/datums/components/phylactery.dm index 13b957290f91..5bcd25b5567b 100644 --- a/code/datums/components/phylactery.dm +++ b/code/datums/components/phylactery.dm @@ -182,7 +182,7 @@ // Fix their name lich.dna.real_name = lich_mind.name - lich.real_name = lich_mind.name + lich.set_real_name(lich_mind.name) // Slap the lich mind in and get their ghost lich_mind.transfer_to(lich) lich_mind.grab_ghost(force = TRUE) diff --git a/code/datums/components/plumbing/IV_drip.dm b/code/datums/components/plumbing/IV_drip.dm deleted file mode 100644 index cc5be40a62ce..000000000000 --- a/code/datums/components/plumbing/IV_drip.dm +++ /dev/null @@ -1,34 +0,0 @@ -///Component for IVs that tracks the current person being IV'd. Input received through plumbing is instead routed to the whoever is attached -/datum/component/plumbing/iv_drip - demand_connects = SOUTH - supply_connects = NORTH - - methods = INJECT - -/datum/component/plumbing/iv_drip/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - . = ..() - - set_recipient_reagents_holder(null) - -/datum/component/plumbing/iv_drip/RegisterWithParent() - . = ..() - - RegisterSignal(parent, list(COMSIG_IV_ATTACH), PROC_REF(update_attached)) - RegisterSignal(parent, list(COMSIG_IV_DETACH), PROC_REF(clear_attached)) - -/datum/component/plumbing/iv_drip/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_IV_ATTACH)) - UnregisterSignal(parent, list(COMSIG_IV_DETACH)) - -///When an IV is attached, we will use whoever is attached as our receiving container -/datum/component/plumbing/iv_drip/proc/update_attached(datum/source, mob/living/attachee) - SIGNAL_HANDLER - - if(attachee?.reagents) - set_recipient_reagents_holder(attachee.reagents) - -///IV has been detached, so clear the holder -/datum/component/plumbing/iv_drip/proc/clear_attached(datum/source) - SIGNAL_HANDLER - - set_recipient_reagents_holder(null) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm deleted file mode 100644 index 8663e0c5782b..000000000000 --- a/code/datums/components/plumbing/_plumbing.dm +++ /dev/null @@ -1,370 +0,0 @@ -/datum/component/plumbing - dupe_mode = COMPONENT_DUPE_ALLOWED - ///Index with "1" = /datum/ductnet/theductpointingnorth etc. "1" being the num2text from NORTH define - var/list/datum/ductnet/ducts = list() - ///shortcut to our parents' reagent holder - var/datum/reagents/reagents - ///TRUE if we wanna add proper pipe overlays under our parent object. this is pretty good if i may so so myself - var/use_overlays = TRUE - ///Whether our tile is covered and we should hide our ducts - var/tile_covered = FALSE - ///directions in wich we act as a supplier - var/supply_connects - ///direction in wich we act as a demander - var/demand_connects - ///FALSE to pretty much just not exist in the plumbing world so we can be moved, TRUE to go plumbo mode - var/active = FALSE - ///if TRUE connects will spin with the parent object visually and codually, so you can have it work in any direction. FALSE if you want it to be static - var/turn_connects = TRUE - ///The layer on which we connect. Don't add multiple. If you want multiple layer connects for some reason you can just add multiple components with different layers - var/ducting_layer = DUCT_LAYER_DEFAULT - ///In-case we don't want the main machine to get the reagents, but perhaps whoever is buckled to it - var/recipient_reagents_holder - ///How do we apply the new reagents to the receiver? Generally doesn't matter, but some stuff, like people, does care if its injected or whatevs - var/methods - ///What color is our demand connect? Also it's not auto-colored so you'll have to make new sprites if its anything other than red, blue, yellow or green - var/demand_color = "red" - ///What color is our supply connect? Also, refrain from pointlessly using non-standard colors unless it's really funny or something - var/supply_color = "blue" - -///turn_connects is for wheter or not we spin with the object to change our pipes -/datum/component/plumbing/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - if(!ismovable(parent)) - return COMPONENT_INCOMPATIBLE - - if(_ducting_layer) - ducting_layer = _ducting_layer - - var/atom/movable/AM = parent - if(!AM.reagents && !custom_receiver) - return COMPONENT_INCOMPATIBLE - - reagents = AM.reagents - turn_connects = _turn_connects - - set_recipient_reagents_holder(custom_receiver ? custom_receiver : AM.reagents) - - if(start) - //We're registering here because I need to check whether we start active or not, and this is just easier - //Should be called after we finished. Done this way because other networks need to finish setting up aswell - RegisterSignal(parent, list(COMSIG_COMPONENT_ADDED), PROC_REF(enable)) - -/datum/component/plumbing/RegisterWithParent() - RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED), PROC_REF(disable)) - RegisterSignal(parent, list(COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH), PROC_REF(toggle_active)) - RegisterSignal(parent, list(COMSIG_OBJ_HIDE), PROC_REF(hide)) - RegisterSignal(parent, list(COMSIG_ATOM_UPDATE_OVERLAYS), PROC_REF(create_overlays)) //called by lateinit on startup - RegisterSignal(parent, list(COMSIG_MOVABLE_CHANGE_DUCT_LAYER), PROC_REF(change_ducting_layer)) - -/datum/component/plumbing/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH,COMSIG_OBJ_HIDE, \ - COMSIG_ATOM_UPDATE_OVERLAYS, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, COMSIG_COMPONENT_ADDED)) - -/datum/component/plumbing/Destroy() - ducts = null - reagents = null - set_recipient_reagents_holder(null) //null is there so it's obvious we're setting this to nothing - return ..() - -/datum/component/plumbing/process() - if(!demand_connects || !reagents) - STOP_PROCESSING(SSfluids, src) - return - if(reagents.total_volume < reagents.maximum_volume) - for(var/D in GLOB.cardinals) - if(D & demand_connects) - send_request(D) - -///Can we be added to the ductnet? -/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir) - if(!active) - return - if(!dir || !D) - return FALSE - if(num2text(dir) in ducts) - return FALSE - - return TRUE - -///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour -/datum/component/plumbing/proc/send_request(dir) - process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir) - -///check who can give us what we want, and how many each of them will give us -/datum/component/plumbing/proc/process_request(amount, reagent, dir) - var/list/valid_suppliers = list() - var/datum/ductnet/net - if(!ducts.Find(num2text(dir))) - return - net = ducts[num2text(dir)] - for(var/A in net.suppliers) - var/datum/component/plumbing/supplier = A - if(supplier.can_give(amount, reagent, net)) - valid_suppliers += supplier - // Need to ask for each in turn very carefully, making sure we get the total volume. This is to avoid a division that would always round down and become 0 - var/targetVolume = reagents.total_volume + amount - var/suppliersLeft = valid_suppliers.len - for(var/A in valid_suppliers) - var/datum/component/plumbing/give = A - var/currentRequest = (targetVolume - reagents.total_volume) / suppliersLeft - give.transfer_to(src, currentRequest, reagent, net) - suppliersLeft-- - -///returns TRUE when they can give the specified amount and reagent. called by process request -/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net) - if(amount <= 0) - return - - if(reagent) //only asked for one type of reagent - for(var/A in reagents.reagent_list) - var/datum/reagent/R = A - if(R.type == reagent) - return TRUE - else if(reagents.total_volume > 0) //take whatever - return TRUE - -///this is where the reagent is actually transferred and is thus the finish point of our process() -/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) - if(!reagents || !target || !target.reagents) - return FALSE - if(reagent) - reagents.trans_id_to(target.recipient_reagents_holder, reagent, amount) - else - reagents.trans_to(target.recipient_reagents_holder, amount, round_robin = TRUE, methods = methods)//we deal with alot of precise calculations so we round_robin=TRUE. Otherwise we get floating point errors, 1 != 1 and 2.5 + 2.5 = 6 - -///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() -/datum/component/plumbing/proc/create_overlays(atom/movable/AM, list/overlays) - SIGNAL_HANDLER - - if(tile_covered || !use_overlays) - return - - //Copied from ducts handle_layer() - var/offset - - switch(ducting_layer) - if(FIRST_DUCT_LAYER) - offset = -10 - if(SECOND_DUCT_LAYER) - offset = -5 - if(THIRD_DUCT_LAYER) - offset = 0 - if(FOURTH_DUCT_LAYER) - offset = 5 - if(FIFTH_DUCT_LAYER) - offset = 10 - - var/duct_x = offset - var/duct_y = offset - - - for(var/D in GLOB.cardinals) - var/color - var/direction - if(D & initial(demand_connects)) - color = demand_color - else if(D & initial(supply_connects)) - color = supply_color - else - continue - - var/image/I - - switch(D) - if(NORTH) - direction = "north" - if(SOUTH) - direction = "south" - if(EAST) - direction = "east" - if(WEST) - direction = "west" - - if(turn_connects) - I = image('icons/obj/plumbing/connects.dmi', "[direction]-[color]", layer = AM.layer - 1) - - else - I = image('icons/obj/plumbing/connects.dmi', "[direction]-[color]-s", layer = AM.layer - 1) //color is not color as in the var, it's just the name of the icon_state - I.dir = D - - I.pixel_x = duct_x - I.pixel_y = duct_y - - overlays += 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) - - for(var/A in ducts) - var/datum/ductnet/D = ducts[A] - D.remove_plumber(src) - - active = FALSE - - for(var/D in GLOB.cardinals) - if(D & (demand_connects | supply_connects)) - for(var/obj/machinery/duct/duct in get_step(parent, D)) - if(duct.duct_layer == ducting_layer) - duct.remove_connects(turn(D, 180)) - duct.neighbours.Remove(parent) - duct.update_appearance() - -///settle wherever we are, and start behaving like a piece of plumbing -/datum/component/plumbing/proc/enable(obj/object, datum/component/component) - SIGNAL_HANDLER - if(active || (component && component != src)) - UnregisterSignal(parent, list(COMSIG_COMPONENT_ADDED)) - return - - 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 - if(D.anchored) //that should cover everything - D.disconnect_duct() - - if(demand_connects) - START_PROCESSING(SSfluids, src) - - for(var/D in GLOB.cardinals) - - if(D & (demand_connects | supply_connects)) - for(var/atom/movable/A in get_step(parent, D)) - - if(istype(A, /obj/machinery/duct)) - var/obj/machinery/duct/duct = A - duct.attempt_connect() - else - for(var/datum/component/plumbing/plumber as anything in A.GetComponents(/datum/component/plumbing)) - if(plumber.ducting_layer == ducting_layer) - direct_connect(plumber, D) - -/// 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 - disable() - -/** We update our connects only when we settle down by taking our current and original direction to find our new connects -* If someone wants it to fucking spin while connected to something go actually knock yourself out -*/ -/datum/component/plumbing/proc/update_dir() - if(!turn_connects) - return - - var/atom/movable/AM = parent - var/new_demand_connects - 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) - else - for(var/D in GLOB.cardinals) - if(D & initial(demand_connects)) - new_demand_connects += turn(D, angle) - if(D & initial(supply_connects)) - new_supply_connects += turn(D, angle) - demand_connects = new_demand_connects - supply_connects = new_supply_connects - -///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH -/datum/component/plumbing/proc/get_original_direction(dir) - var/atom/movable/AM = parent - return turn(dir, dir2angle(AM.dir) - 180) - -//special case in-case we want to connect directly with another machine without a duct -/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir) - if(!P.active) - return - var/opposite_dir = turn(dir, 180) - if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands - var/datum/ductnet/net = new() - net.add_plumber(src, dir) - net.add_plumber(P, opposite_dir) - -/datum/component/plumbing/proc/hide(atom/movable/AM, should_hide) - SIGNAL_HANDLER - - tile_covered = should_hide - AM.update_appearance() - -/datum/component/plumbing/proc/change_ducting_layer(obj/caller, obj/O, new_layer = DUCT_LAYER_DEFAULT) - SIGNAL_HANDLER - ducting_layer = new_layer - - if(ismovable(parent)) - var/atom/movable/AM = parent - AM.update_appearance() - - if(O) - playsound(O, 'sound/items/ratchet.ogg', 10, TRUE) //sound - - //quickly disconnect and reconnect the network. - if(active) - disable() - enable() - -/datum/component/plumbing/proc/set_recipient_reagents_holder(datum/reagents/receiver) - if(recipient_reagents_holder) - UnregisterSignal(recipient_reagents_holder, COMSIG_PARENT_QDELETING) //stop tracking whoever we were tracking - if(receiver) - RegisterSignal(receiver, COMSIG_PARENT_QDELETING, PROC_REF(handle_reagent_del)) //on deletion call a wrapper proc that clears us, and maybe reagents too - - recipient_reagents_holder = receiver - -/datum/component/plumbing/proc/handle_reagent_del(datum/source) - SIGNAL_HANDLER - if(source == reagents) - reagents = null - if(source == recipient_reagents_holder) - set_recipient_reagents_holder(null) - -///has one pipe input that only takes, example is manual output pipe -/datum/component/plumbing/simple_demand - demand_connects = SOUTH - -///has one pipe output that only supplies. example is liquid pump and manual input pipe -/datum/component/plumbing/simple_supply - supply_connects = SOUTH - -///input and output, like a holding tank -/datum/component/plumbing/tank - demand_connects = WEST - supply_connects = EAST - -/datum/component/plumbing/manifold - demand_connects = NORTH - supply_connects = SOUTH - -/datum/component/plumbing/manifold/change_ducting_layer(obj/caller, obj/O, new_layer) - return - -#define READY 2 -///Baby component for the buffer plumbing machine -/datum/component/plumbing/buffer - demand_connects = WEST - supply_connects = EAST - -/datum/component/plumbing/buffer/Initialize(start=TRUE, _turn_connects=TRUE, _ducting_layer, datum/reagents/custom_receiver) - if(!istype(parent, /obj/machinery/plumbing/buffer)) - return COMPONENT_INCOMPATIBLE - - return ..() - -/datum/component/plumbing/buffer/can_give(amount, reagent, datum/ductnet/net) - var/obj/machinery/plumbing/buffer/buffer = parent - return (buffer.mode == READY) ? ..() : FALSE - -#undef READY diff --git a/code/datums/components/plumbing/chemical_acclimator.dm b/code/datums/components/plumbing/chemical_acclimator.dm deleted file mode 100644 index 777a2804a780..000000000000 --- a/code/datums/components/plumbing/chemical_acclimator.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/component/plumbing/acclimator - demand_connects = WEST - supply_connects = EAST - var/obj/machinery/plumbing/acclimator/myacclimator - -/datum/component/plumbing/acclimator/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - . = ..() - if(!istype(parent, /obj/machinery/plumbing/acclimator)) - return COMPONENT_INCOMPATIBLE - myacclimator = parent - -/datum/component/plumbing/acclimator/Destroy(force, silent) - myacclimator = null - return ..() - -/datum/component/plumbing/acclimator/can_give(amount, reagent) - . = ..() - if(. && myacclimator.emptying) - return TRUE - return FALSE -///We're overriding process and not send_request, because all process does is do the requests, so we might aswell cut out the middle man and save some code from running -/datum/component/plumbing/acclimator/process() - if(myacclimator.emptying) - return - return ..() diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm deleted file mode 100644 index 4b8dd8d54a6c..000000000000 --- a/code/datums/components/plumbing/filter.dm +++ /dev/null @@ -1,59 +0,0 @@ -///The magical plumbing component used by the chemical filters. The different supply connects behave differently depending on the filters set on the chemical filter -/datum/component/plumbing/filter - demand_connects = NORTH - supply_connects = SOUTH | EAST | WEST //SOUTH is straight, EAST is left and WEST is right. We look from the perspective of the insert - -/datum/component/plumbing/filter/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - . = ..() - if(!istype(parent, /obj/machinery/plumbing/filter)) - return COMPONENT_INCOMPATIBLE - -/datum/component/plumbing/filter/can_give(amount, reagent, datum/ductnet/net) - . = ..() - if(.) - var/direction - for(var/A in ducts) - if(ducts[A] == net) - direction = get_original_direction(text2num(A)) //we need it relative to the direction, so filters don't change when we turn the filter - break - if(!direction) - return FALSE - if(reagent) - if(!can_give_in_direction(direction, reagent)) - return FALSE - -/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) - if(!reagents || !target || !target.reagents) - return FALSE - var/direction - for(var/A in ducts) - if(ducts[A] == net) - direction = get_original_direction(text2num(A)) - break - if(reagent) - reagents.trans_id_to(target.parent, reagent, amount) - else - for(var/A in reagents.reagent_list) - var/datum/reagent/R = A - if(!can_give_in_direction(direction, R.type)) - continue - var/new_amount - if(R.volume < amount) - new_amount = amount - R.volume - reagents.trans_id_to(target.parent, R.type, amount) - amount = new_amount - if(amount <= 0) - break -///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours -/datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent) - var/obj/machinery/plumbing/filter/F = parent - switch(dir) - if(SOUTH) //straight - if(!F.left.Find(reagent) && !F.right.Find(reagent)) - return TRUE - if(WEST) //right - if(F.right.Find(reagent)) - return TRUE - if(EAST) //left - if(F.left.Find(reagent)) - return TRUE diff --git a/code/datums/components/plumbing/reaction_chamber.dm b/code/datums/components/plumbing/reaction_chamber.dm deleted file mode 100644 index fe6064cccc83..000000000000 --- a/code/datums/components/plumbing/reaction_chamber.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/component/plumbing/reaction_chamber - demand_connects = NORTH - supply_connects = SOUTH - -/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - . = ..() - if(!istype(parent, /obj/machinery/plumbing/reaction_chamber)) - return COMPONENT_INCOMPATIBLE - -/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net) - . = ..() - var/obj/machinery/plumbing/reaction_chamber/reaction_chamber = parent - if(!. || !reaction_chamber.emptying || reagents.is_reacting == TRUE) - return FALSE - -/datum/component/plumbing/reaction_chamber/send_request(dir) - var/obj/machinery/plumbing/reaction_chamber/chamber = parent - if(chamber.emptying) - return - - for(var/required_reagent in chamber.required_reagents) - var/has_reagent = FALSE - for(var/datum/reagent/containg_reagent as anything in reagents.reagent_list) - if(required_reagent == containg_reagent.type) - has_reagent = TRUE - if(containg_reagent.volume + CHEMICAL_QUANTISATION_LEVEL < chamber.required_reagents[required_reagent]) - process_request(min(chamber.required_reagents[required_reagent] - containg_reagent.volume, MACHINE_REAGENT_TRANSFER) , required_reagent, dir) - return - if(!has_reagent) - process_request(min(chamber.required_reagents[required_reagent], MACHINE_REAGENT_TRANSFER), required_reagent, dir) - return - - reagents.flags &= ~NO_REACT - reagents.handle_reactions() - - chamber.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update - //everything for every chemical removed, wich isn't a good option either. - chamber.on_reagent_change(reagents) //We need to check it now, because some reactions leave nothing left. - -///Special connect that we currently use for reaction chambers. Being used so we can keep certain inputs separate, like into a special internal acid container -/datum/component/plumbing/acidic_input - demand_connects = WEST - demand_color = "yellow" - - ducting_layer = SECOND_DUCT_LAYER - -/datum/component/plumbing/acidic_input/send_request(dir) - process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = /datum/reagent/reaction_agent/acidic_buffer, dir = dir) - -///Special connect that we currently use for reaction chambers. Being used so we can keep certain inputs separate, like into a special internal base container -/datum/component/plumbing/alkaline_input - demand_connects = EAST - demand_color = "green" - - ducting_layer = FOURTH_DUCT_LAYER - -/datum/component/plumbing/alkaline_input/send_request(dir) - process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = /datum/reagent/reaction_agent/basic_buffer, dir = dir) - - diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm deleted file mode 100644 index 4dd68a9e5780..000000000000 --- a/code/datums/components/plumbing/splitter.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/component/plumbing/splitter - demand_connects = NORTH - supply_connects = SOUTH | EAST - -/datum/component/plumbing/splitter/Initialize(start=TRUE, _ducting_layer, _turn_connects=TRUE, datum/reagents/custom_receiver) - . = ..() - if(. && !istype(parent, /obj/machinery/plumbing/splitter)) - return FALSE - -/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net) - . = ..() - if(!.) - return - var/direction - for(var/A in ducts) - if(ducts[A] == net) - direction = get_original_direction(text2num(A)) - break - var/obj/machinery/plumbing/splitter/S = parent - switch(direction) - if(SOUTH) - if(S.turn_straight && S.transfer_straight <= amount) - S.turn_straight = FALSE - return TRUE - if(EAST) - if(!S.turn_straight && S.transfer_side <= amount) - S.turn_straight = TRUE - return TRUE - return FALSE - - -/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) - var/direction - for(var/A in ducts) - if(ducts[A] == net) - direction = get_original_direction(text2num(A)) - break - var/obj/machinery/plumbing/splitter/S = parent - switch(direction) - if(SOUTH) - if(amount >= S.transfer_straight) - amount = S.transfer_straight - if(EAST) - if(amount >= S.transfer_side) - amount = S.transfer_side - return ..() - diff --git a/code/datums/components/punchcooldown.dm b/code/datums/components/punchcooldown.dm index 7c2ae1047fef..40d00ed0207b 100644 --- a/code/datums/components/punchcooldown.dm +++ b/code/datums/components/punchcooldown.dm @@ -1,6 +1,6 @@ ///Your favourite Jojoke. Used for the gloves of the north star. /datum/component/wearertargeting/punchcooldown - signals = list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_LIVING_SLAP_MOB) + signals = list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_LIVING_SLAP_MOB) mobtype = /mob/living/carbon proctype = PROC_REF(reducecooldown) valid_slots = list(ITEM_SLOT_GLOVES) @@ -13,8 +13,8 @@ return RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(changewarcry)) -///Called on COMSIG_HUMAN_MELEE_UNARMED_ATTACK. Yells the warcry and and reduces punch cooldown. -/datum/component/wearertargeting/punchcooldown/proc/reducecooldown(mob/living/carbon/M, atom/target) +///Called on COMSIG_LIVING_UNARMED_ATTACK. Yells the warcry and and reduces punch cooldown. +/datum/component/wearertargeting/punchcooldown/proc/reducecooldown(mob/living/carbon/M, atom/target, proximity, modifiers) if((M.combat_mode && isliving(target)) || istype(M.get_active_held_item(), /obj/item/hand_item/slapper)) M.changeNext_move(CLICK_CD_RAPID) if(warcry) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 397ad86c3b90..3b56e1bddd1d 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -122,7 +122,7 @@ 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 - if(!user.canUseTopic(parent, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(parent, USE_CLOSE|USE_DEXTERITY|USE_IGNORE_TK)) to_chat(user,span_warning("You cannot select a sect at this time.")) return if(GLOB.religious_sect) @@ -152,7 +152,7 @@ if(performing_rite) to_chat(user, "There is a rite currently being performed here already.") return - if(!user.canUseTopic(parent, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(parent, USE_CLOSE|USE_DEXTERITY|USE_IGNORE_TK)) to_chat(user,span_warning("You are not close enough to perform the rite.")) return performing_rite = new path(parent) diff --git a/code/datums/components/remote_materials.dm b/code/datums/components/remote_materials.dm index 7a5867bebce1..051142fbb20e 100644 --- a/code/datums/components/remote_materials.dm +++ b/code/datums/components/remote_materials.dm @@ -53,6 +53,7 @@ handles linking back and forth. // specify explicitly in case the other component is deleted first var/atom/P = parent mat_container.retrieve_all(P.drop_location()) + mat_container = null return ..() /datum/component/remote_materials/proc/_MakeLocal() diff --git a/code/datums/components/riding/riding.dm b/code/datums/components/riding/riding.dm index 021a05f0385b..19794d94b58c 100644 --- a/code/datums/components/riding/riding.dm +++ b/code/datums/components/riding/riding.dm @@ -252,6 +252,6 @@ return TRUE /// Extra checks before buckled.can_z_move can be called in mob/living/can_z_move() -/datum/component/riding/proc/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, turf/destination, z_move_flags, mob/living/rider) +/datum/component/riding/proc/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, z_move_flags, mob/living/rider) SIGNAL_HANDLER return COMPONENT_RIDDEN_ALLOW_Z_MOVE diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 1a8d348ccafa..f858af43782d 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -13,7 +13,7 @@ . = ..() var/mob/living/living_parent = parent - living_parent.stop_pulling() // was only used on humans previously, may change some other behavior + living_parent.release_all_grabs() // was only used on humans previously, may change some other behavior log_riding(living_parent, riding_mob) riding_mob.set_glide_size(living_parent.glide_size) handle_vehicle_offsets(living_parent.dir) @@ -54,10 +54,10 @@ if(living_parent.body_position != STANDING_UP) // if we move while on the ground, the rider falls off . = FALSE // for piggybacks and (redundant?) borg riding, check if the rider is stunned/restrained - else if((ride_check_flags & RIDER_NEEDS_ARMS) && (HAS_TRAIT(rider, TRAIT_RESTRAINED) || rider.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) + else if((ride_check_flags & RIDER_NEEDS_ARMS) && (HAS_TRAIT(rider, TRAIT_ARMS_RESTRAINED) || rider.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) . = FALSE // for fireman carries, check if the ridden is stunned/restrained - else if((ride_check_flags & CARRIER_NEEDS_ARM) && (HAS_TRAIT(living_parent, TRAIT_RESTRAINED) || living_parent.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) + else if((ride_check_flags & CARRIER_NEEDS_ARM) && (HAS_TRAIT(living_parent, TRAIT_ARMS_RESTRAINED) || living_parent.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB))) . = FALSE if(. || !consequences) @@ -153,7 +153,7 @@ cooldown_action.unset_click_ability(rider, refund_cooldown = TRUE) action.HideFrom(rider) -/datum/component/riding/creature/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, turf/destination, z_move_flags, mob/living/rider) +/datum/component/riding/creature/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, z_move_flags, mob/living/rider) if(!(z_move_flags & ZMOVE_CAN_FLY_CHECKS)) return COMPONENT_RIDDEN_ALLOW_Z_MOVE if(!can_be_driven) @@ -186,7 +186,7 @@ /datum/component/riding/creature/human/RegisterWithParent() . = ..() - RegisterSignal(parent, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_host_unarmed_melee)) + RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_host_unarmed_melee)) RegisterSignal(parent, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(check_carrier_fall_over)) /datum/component/riding/creature/human/log_riding(mob/living/living_parent, mob/living/rider) @@ -387,3 +387,25 @@ set_vehicle_dir_offsets(NORTH, movable_parent.pixel_x, 0) set_vehicle_dir_offsets(EAST, movable_parent.pixel_x, 0) set_vehicle_dir_offsets(WEST, movable_parent.pixel_x, 0) + +/datum/component/riding/creature/hog + //FUTURE IDEA: carrot on a stick as a key + +/datum/component/riding/creature/hog/handle_specials() + . = ..() + set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 13), TEXT_SOUTH = list(0, 15), TEXT_EAST = list(-2, 12), TEXT_WEST = list(2, 12))) + set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) + set_vehicle_dir_layer(NORTH, OBJ_LAYER) + set_vehicle_dir_layer(EAST, OBJ_LAYER) + set_vehicle_dir_layer(WEST, OBJ_LAYER) + +/datum/component/riding/creature/hog/ride_check(mob/living/user, consequences = TRUE) + var/mob/living/simple_animal/hostile/retaliate/hog/hog_ridden = parent + if(hog_ridden.client) + return ..() + + if(prob(15)) + hog_ridden.flingRider(user) + return FALSE + + return ..() diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index bbe1a4938f7e..d9062a640839 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -9,7 +9,7 @@ . = ..() RegisterSignal(parent, COMSIG_RIDDEN_DRIVER_MOVE, PROC_REF(driver_move)) -/datum/component/riding/vehicle/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, turf/destination, z_move_flags, mob/living/rider) +/datum/component/riding/vehicle/riding_can_z_move(atom/movable/movable_parent, direction, turf/start, z_move_flags, mob/living/rider) if(!(z_move_flags & ZMOVE_CAN_FLY_CHECKS)) return COMPONENT_RIDDEN_ALLOW_Z_MOVE @@ -127,28 +127,6 @@ . = ..() set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4))) - -/datum/component/riding/vehicle/lavaboat - ride_check_flags = NONE // not sure - keytype = /obj/item/oar - var/allowed_turf = /turf/open/lava - -/datum/component/riding/vehicle/lavaboat/handle_specials() - . = ..() - allowed_turf_typecache = typecacheof(allowed_turf) - -/datum/component/riding/vehicle/lavaboat/dragonboat - vehicle_move_delay = 1 - -/datum/component/riding/vehicle/lavaboat/dragonboat/handle_specials() - . = ..() - set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(1, 2), TEXT_SOUTH = list(1, 2), TEXT_EAST = list(1, 2), TEXT_WEST = list( 1, 2))) - -/datum/component/riding/vehicle/lavaboat/dragonboat - vehicle_move_delay = 1 - keytype = null - - /datum/component/riding/vehicle/janicart keytype = /obj/item/key/janitor diff --git a/code/datums/components/rot.dm b/code/datums/components/rot.dm index 0f0c08fc6887..33bf3ed2b02d 100644 --- a/code/datums/components/rot.dm +++ b/code/datums/components/rot.dm @@ -43,7 +43,7 @@ RegisterSignal(parent, COMSIG_MOVABLE_BUMP, PROC_REF(rot_react)) if(isliving(parent)) RegisterSignal(parent, COMSIG_LIVING_REVIVE, PROC_REF(react_to_revive)) //mobs stop this when they come to life - RegisterSignal(parent, COMSIG_LIVING_GET_PULLED, PROC_REF(rot_react_touch)) + RegisterSignal(parent, COMSIG_ATOM_GET_GRABBED, PROC_REF(rot_react_touch)) if(iscarbon(parent)) var/mob/living/carbon/carbon_parent = parent RegisterSignal(carbon_parent.reagents, list(COMSIG_REAGENTS_ADD_REAGENT, @@ -87,9 +87,9 @@ /datum/component/rot/proc/check_reagent(datum/reagents/source, datum/reagent/modified) SIGNAL_HANDLER - if(modified && !istype(modified, /datum/reagent/toxin/formaldehyde) && !istype(modified, /datum/reagent/cryostylane)) + if(modified && !istype(modified, /datum/reagent/space_cleaner)) return - if(source.has_reagent(/datum/reagent/toxin/formaldehyde, 15) || source.has_reagent(/datum/reagent/cryostylane)) + if(source.has_reagent(/datum/reagent/space_cleaner, 15)) rest(REAGENT_BLOCKER) return start_up(REAGENT_BLOCKER) diff --git a/code/datums/components/rotation.dm b/code/datums/components/rotation.dm index 60a28ef2b21c..96529caa5399 100644 --- a/code/datums/components/rotation.dm +++ b/code/datums/components/rotation.dm @@ -75,7 +75,7 @@ . = ..() /datum/component/simple_rotation/Destroy() - QDEL_NULL(AfterRotation) + AfterRotation = null //Signals + verbs removed via UnRegister . = ..() @@ -85,9 +85,9 @@ /datum/component/simple_rotation/proc/ExamineMessage(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER - examine_list += span_notice("Alt + Right-click to rotate it clockwise. Alt + Left-click to rotate it counterclockwise.") - if(rotation_flags & ROTATION_REQUIRE_WRENCH) - examine_list += span_notice("This requires a wrench to be rotated.") + + var/examine_text = "It looks like you can rotate it[rotation_flags & ROTATION_REQUIRE_WRENCH ? " by loosening the bolts" : ""]." + examine_list += span_notice(examine_text) /datum/component/simple_rotation/proc/RotateRight(datum/source, mob/user) SIGNAL_HANDLER @@ -116,10 +116,12 @@ AfterRotation.Invoke(user, degrees) /datum/component/simple_rotation/proc/CanUserRotate(mob/user, degrees) - if(isliving(user) && user.canUseTopic(parent, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) - return TRUE - if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user) && CONFIG_GET(flag/ghost_interaction)) + if(isliving(user) && user.canUseTopic(parent, USE_CLOSE|USE_DEXTERITY)) return TRUE + if((rotation_flags & ROTATION_GHOSTS_ALLOWED) && isobserver(user)) + var/area/A = get_area(parent) + if(A?.spook_level >= SPOOK_LEVEL_OBJECT_ROTATION) + return TRUE return FALSE /datum/component/simple_rotation/proc/CanBeRotated(mob/user, degrees) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index 4886ecfb5e20..db47d0ac05a9 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -2,7 +2,7 @@ /// How far we can extend, with modifier of 1, up to our vision edge, higher numbers multiply. var/range_modifier = 1 /// Fullscreen object we use for tracking the shots. - var/atom/movable/screen/fullscreen/scope/tracker + var/atom/movable/screen/fullscreen/cursor_catcher/scope/tracker /datum/component/scope/Initialize(range_modifier) if(!isgun(parent)) @@ -11,7 +11,7 @@ /datum/component/scope/Destroy(force, silent) if(tracker) - stop_zooming(tracker.marksman) + stop_zooming(tracker.owner) return ..() /datum/component/scope/RegisterWithParent() @@ -29,19 +29,22 @@ )) /datum/component/scope/process(delta_time) - if(!tracker.marksman.client) - stop_zooming(tracker.marksman) + var/mob/user_mob = tracker.owner + var/client/user_client = user_mob.client + if(!user_client) + stop_zooming(user_mob) return - if(!length(tracker.marksman.client.keys_held & tracker.marksman.client.movement_keys)) - tracker.marksman.face_atom(tracker.given_turf) - animate(tracker.marksman.client, 0.2 SECONDS, easing = SINE_EASING, flags = EASE_OUT, pixel_x = tracker.given_x, pixel_y = tracker.given_y) + tracker.calculate_params() + if(!length(user_client.keys_held & user_client.movement_keys)) + user_mob.face_atom(tracker.given_turf) + animate(user_client, world.tick_lag, pixel_x = tracker.given_x, pixel_y = tracker.given_y) /datum/component/scope/proc/on_move(atom/movable/source, atom/oldloc, dir, forced) SIGNAL_HANDLER if(!tracker) return - stop_zooming(tracker.marksman) + stop_zooming(tracker.owner) /datum/component/scope/proc/on_secondary_afterattack(datum/source, atom/target, mob/user, proximity_flag, click_parameters) SIGNAL_HANDLER @@ -57,7 +60,7 @@ if(!tracker?.given_turf || target == get_target(tracker.given_turf)) return NONE - INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item/gun, fire_gun), get_target(tracker.given_turf), user) + INVOKE_ASYNC(source, TYPE_PROC_REF(/obj/item/gun, try_fire_gun), get_target(tracker.given_turf), user) return COMPONENT_CANCEL_GUN_FIRE /datum/component/scope/proc/on_examine(datum/source, mob/user, list/examine_list) @@ -77,13 +80,15 @@ for(var/atom/movable/possible_target in target_turf) if(possible_target.layer <= PROJECTILE_HIT_THRESHHOLD_LAYER) continue - if(possible_target.invisibility > tracker.marksman.see_invisible) + if(possible_target.invisibility > tracker.owner.see_invisible) continue if(!possible_target.mouse_opacity) continue if(iseffect(possible_target)) continue if(ismob(possible_target)) + if(possible_target == tracker.owner) + continue return possible_target if(!possible_target.density) non_dense_targets += possible_target @@ -107,12 +112,10 @@ user.client.mouse_override_icon = 'icons/effects/mouse_pointers/scope_hide.dmi' user.update_mouse_pointer() user.playsound_local(parent, 'sound/weapons/scope.ogg', 75, TRUE) - tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/scope, 0) - tracker.range_modifier = range_modifier - tracker.marksman = user - tracker.RegisterSignal(user, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/atom/movable/screen/fullscreen/scope, on_move)) + tracker = user.overlay_fullscreen("scope", /atom/movable/screen/fullscreen/cursor_catcher/scope, 0) + tracker.assign_to_mob(user, range_modifier) RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, PROC_REF(stop_zooming)) - START_PROCESSING(SSfastprocess, src) + START_PROCESSING(SSprojectiles, src) /** * We stop zooming, canceling processing, resetting stuff back to normal and deleting our tracker. @@ -123,7 +126,7 @@ /datum/component/scope/proc/stop_zooming(mob/user) SIGNAL_HANDLER - STOP_PROCESSING(SSfastprocess, src) + STOP_PROCESSING(SSprojectiles, src) UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS) if(user.client) animate(user.client, 0.2 SECONDS, pixel_x = 0, pixel_y = 0) @@ -133,46 +136,32 @@ tracker = null user.clear_fullscreen("scope") -/atom/movable/screen/fullscreen/scope +/atom/movable/screen/fullscreen/cursor_catcher/scope icon_state = "scope" - plane = HUD_PLANE - mouse_opacity = MOUSE_OPACITY_ICON /// Multiplier for given_X an given_y. var/range_modifier = 1 - /// The mob the scope is on. - var/mob/marksman - /// Pixel x we send to the scope component. - var/given_x = 0 - /// Pixel y we send to the scope component. - var/given_y = 0 - /// The turf we send to the scope component. - var/turf/given_turf - /// The coordinate on our mouseentered, for performance reasons. - COOLDOWN_DECLARE(coordinate_cooldown) - -/atom/movable/screen/fullscreen/scope/proc/on_move(atom/source, atom/oldloc, dir, forced) - SIGNAL_HANDLER - if(!given_turf) - return - var/x_offset = source.loc.x - oldloc.x - var/y_offset = source.loc.y - oldloc.y - given_turf = locate(given_turf.x+x_offset, given_turf.y+y_offset, given_turf.z) +/atom/movable/screen/fullscreen/cursor_catcher/scope/assign_to_mob(mob/new_owner, range_modifier) + src.range_modifier = range_modifier + return ..() -/atom/movable/screen/fullscreen/scope/MouseEntered(location, control, params) - . = ..() - MouseMove(location, control, params) +/atom/movable/screen/fullscreen/cursor_catcher/scope/Click(location, control, params) + if(usr == owner) + calculate_params() + return ..() -/atom/movable/screen/fullscreen/scope/MouseMove(location, control, params) - if(!marksman?.client || usr != marksman) - return - if(!COOLDOWN_FINISHED(src, coordinate_cooldown)) - return - COOLDOWN_START(src, coordinate_cooldown, 0.2 SECONDS) - var/list/modifiers = params2list(params) +/atom/movable/screen/fullscreen/cursor_catcher/scope/calculate_params() + var/list/modifiers = params2list(mouse_params) var/icon_x = text2num(LAZYACCESS(modifiers, VIS_X)) + if(isnull(icon_x)) + icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) + if(isnull(icon_x)) + icon_x = view_list[1]*world.icon_size/2 var/icon_y = text2num(LAZYACCESS(modifiers, VIS_Y)) - var/list/view = getviewsize(marksman.client.view) - given_x = round(range_modifier * (icon_x - view[1]*world.icon_size/2)) - given_y = round(range_modifier * (icon_y - view[2]*world.icon_size/2)) - given_turf = locate(marksman.x+round(given_x/world.icon_size, 1),marksman.y+round(given_y/world.icon_size, 1),marksman.z) + if(isnull(icon_y)) + icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) + if(isnull(icon_y)) + icon_y = view_list[2]*world.icon_size/2 + given_x = round(range_modifier * (icon_x - view_list[1]*world.icon_size/2)) + given_y = round(range_modifier * (icon_y - view_list[2]*world.icon_size/2)) + given_turf = locate(owner.x+round(given_x/world.icon_size, 1),owner.y+round(given_y/world.icon_size, 1),owner.z) diff --git a/code/datums/components/seethrough.dm b/code/datums/components/seethrough.dm new file mode 100644 index 000000000000..5ff2c627f5e7 --- /dev/null +++ b/code/datums/components/seethrough.dm @@ -0,0 +1,149 @@ +///A component that lets you turn an object invisible when you're standing on certain relative turfs to it, like behind a tree +/datum/component/seethrough + ///List of lists that represent relative coordinates to the source atom + var/list/relative_turf_coords + ///A list of turfs on which we make ourself transparent + var/list/watched_turfs + ///Associate list, with client = trickery_image. Track which client is being tricked with which image + var/list/tricked_mobs = list() + + ///Which alpha do we animate towards? + var/target_alpha + ///How long our fase in/out takes + var/animation_time + ///After we somehow moved (because ss13 is godless and does not respect anything), how long do we need to stand still to feel safe to setup our "behind" area again + var/perimeter_reset_timer + ///Does this object let clicks from players its transparent to pass through it + var/clickthrough + +///see_through_map is a define pointing to a specific map. It's basically defining the area which is considered behind. See see_through_maps.dm for a list of maps +/datum/component/seethrough/Initialize(see_through_map = SEE_THROUGH_MAP_DEFAULT, target_alpha = 100, animation_time = 0.5 SECONDS, perimeter_reset_timer = 2 SECONDS, clickthrough = TRUE) + . = ..() + + relative_turf_coords = GLOB.see_through_maps[see_through_map] + + if(!isatom(parent) || !LAZYLEN(relative_turf_coords)) + return COMPONENT_INCOMPATIBLE + + relative_turf_coords = GLOB.see_through_maps[see_through_map] + src.relative_turf_coords = relative_turf_coords + src.target_alpha = target_alpha + src.animation_time = animation_time + src.perimeter_reset_timer = perimeter_reset_timer + src.clickthrough = clickthrough + + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(dismantle_perimeter)) + + setup_perimeter(parent) + +///Loop through a list with relative coordinate lists to mark those tiles and hide our parent when someone enters those tiles +/datum/component/seethrough/proc/setup_perimeter(atom/parent) + watched_turfs = list() + + for(var/list/coordinates as anything in relative_turf_coords) + var/turf/target = TURF_FROM_COORDS_LIST(list(parent.x + coordinates[1], parent.y + coordinates[2], parent.z + coordinates[3])) + + if(isnull(target)) + continue + + RegisterSignal(target, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) + RegisterSignal(target, COMSIG_ATOM_EXITED, PROC_REF(on_exited)) + + watched_turfs.Add(target) + +///Someone entered one of our tiles, so sent an override overlay and a cute animation to make us fade out a bit +/datum/component/seethrough/proc/on_entered(atom/source, atom/movable/entered) + SIGNAL_HANDLER + + if(!ismob(entered)) + return + + var/mob/mob = entered + + if(!mob.client) + RegisterSignal(mob, COMSIG_MOB_LOGIN, PROC_REF(trick_mob)) + return + + if(mob in tricked_mobs) + return + + trick_mob(mob) + +///Remove the screen object and make us appear solid to the client again +/datum/component/seethrough/proc/on_exited(atom/source, atom/movable/exited, direction) + SIGNAL_HANDLER + + if(!ismob(exited)) + return + + var/mob/mob = exited + + if(!mob.client) + UnregisterSignal(mob, COMSIG_MOB_LOGIN) + return + + var/turf/moving_to = get_turf(exited) + if(moving_to in watched_turfs) + return + + //Check if we're being 'tricked' + if(mob in tricked_mobs) + var/image/trickery_image = tricked_mobs[mob] + animate(trickery_image, alpha = 255, time = animation_time) + tricked_mobs.Remove(mob) + UnregisterSignal(mob, COMSIG_MOB_LOGOUT) + + //after playing the fade-in animation, remove the screen obj + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/seethrough,clear_image), trickery_image, mob.client), animation_time) + +///Apply the trickery image and animation +/datum/component/seethrough/proc/trick_mob(mob/fool) + var/image/user_overlay = new(parent) + user_overlay.loc = parent + user_overlay.override = TRUE + //Special plane so we can click through the overlay + user_overlay.plane = SEETHROUGH_PLANE + + //These are inherited, but we already use the atom's loc so we end up at double the pixel offset + user_overlay.pixel_x = 0 + user_overlay.pixel_y = 0 + + fool.client.images += user_overlay + + animate(user_overlay, alpha = target_alpha, time = animation_time) + + tricked_mobs[fool] = user_overlay + RegisterSignal(fool, COMSIG_MOB_LOGOUT, PROC_REF(on_client_disconnect)) + +///Unrout ourselves after we somehow moved, and start a timer so we can re-restablish our behind area after standing still for a bit +/datum/component/seethrough/proc/dismantle_perimeter() + SIGNAL_HANDLER + + for(var/turf in watched_turfs) + UnregisterSignal(turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED)) + + watched_turfs = null + clear_all_images() + + //Timer override, so if our atom keeps moving the timer is reset until they stop for X time + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/component/seethrough,setup_perimeter), parent), perimeter_reset_timer, TIMER_OVERRIDE | TIMER_UNIQUE) + +///Remove a screen image from a client +/datum/component/seethrough/proc/clear_image(image/removee, client/remove_from) + remove_from?.images -= removee //player could've logged out during the animation, so check just in case + +/datum/component/seethrough/proc/clear_all_images() + for(var/mob/fool in tricked_mobs) + var/image/trickery_image = tricked_mobs[fool] + fool.client?.images -= trickery_image + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + + tricked_mobs.Cut() + +///Image is removed when they log out because client gets deleted, so drop the mob reference +/datum/component/seethrough/proc/on_client_disconnect(mob/fool) + SIGNAL_HANDLER + + tricked_mobs.Remove(fool) + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + RegisterSignal(fool, COMSIG_MOB_LOGIN, PROC_REF(trick_mob)) diff --git a/code/datums/components/seethrough_mob.dm b/code/datums/components/seethrough_mob.dm new file mode 100644 index 000000000000..912dd8360ccf --- /dev/null +++ b/code/datums/components/seethrough_mob.dm @@ -0,0 +1,129 @@ +///A component that lets you turn your character transparent in order to see and click through yourself. +/datum/component/seethrough_mob + ///The atom that enables our dark magic + var/atom/movable/render_source_atom + ///The fake version of ourselves + var/image/trickery_image + ///Which alpha do we animate towards? + var/target_alpha + ///How long our faze in/out takes + var/animation_time + ///Does this object let clicks from players its transparent to pass through it + var/clickthrough + ///Is the seethrough effect currently active + var/is_active + ///The mob's original render_target value + var/initial_render_target_value + ///This component's personal uid + var/personal_uid + +/datum/component/seethrough_mob/Initialize(target_alpha = 100, animation_time = 0.5 SECONDS, clickthrough = TRUE) + . = ..() + + if(!ismob(parent)) + return COMPONENT_INCOMPATIBLE + + src.target_alpha = target_alpha + src.animation_time = animation_time + src.clickthrough = clickthrough + src.is_active = FALSE + src.render_source_atom = new() + + var/static/uid = 0 + uid++ + src.personal_uid = uid + + render_source_atom.appearance_flags |= ( RESET_COLOR | RESET_TRANSFORM) + + render_source_atom.vis_flags |= (VIS_INHERIT_ID | VIS_INHERIT_PLANE | VIS_INHERIT_LAYER) + + render_source_atom.render_source = "*transparent_bigmob[personal_uid]" + + var/datum/action/cooldown/toggle_seethrough/action = new(src) + action.Grant(parent) + +/datum/component/seethrough_mob/Destroy(force) + QDEL_NULL(render_source_atom) + return ..() + +///Set up everything we need to trick the client and keep it looking normal for everyone else +/datum/component/seethrough_mob/proc/trick_mob() + SIGNAL_HANDLER + + var/mob/fool = parent + + var/icon/current_mob_icon = icon(fool.icon, fool.icon_state) + render_source_atom.pixel_x = -fool.pixel_x + render_source_atom.pixel_y = ((current_mob_icon.Height() - 32) * 0.5) + + initial_render_target_value = fool.render_target + fool.render_target = "*transparent_bigmob[personal_uid]" + fool.vis_contents.Add(render_source_atom) + + trickery_image = new(render_source_atom) + trickery_image.loc = render_source_atom + trickery_image.override = TRUE + + trickery_image.pixel_x = 0 + trickery_image.pixel_y = 0 + + if(clickthrough) //Without this we can click ourselves if there is no other target when seethrough + trickery_image.plane = SEETHROUGH_PLANE + + fool.client.images += trickery_image + + animate(trickery_image, alpha = target_alpha, time = animation_time) + + RegisterSignal(fool, COMSIG_MOB_LOGOUT, PROC_REF(on_client_disconnect)) + +///Remove the screen object and make us appear solid to ourselves again +/datum/component/seethrough_mob/proc/untrick_mob() + var/mob/fool = parent + animate(trickery_image, alpha = 255, time = animation_time) + + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + + //after playing the fade-in animation, remove the image and the trick atom + addtimer(CALLBACK(src, PROC_REF(clear_image), trickery_image, fool.client), animation_time) + +///Remove the image and the trick atom +/datum/component/seethrough_mob/proc/clear_image(image/removee, client/remove_from) + var/atom/movable/atom_parent = parent + atom_parent.vis_contents -= render_source_atom + atom_parent.render_target = initial_render_target_value + remove_from?.images -= removee + +///Effect is disabled when they log out because client gets deleted +/datum/component/seethrough_mob/proc/on_client_disconnect() + SIGNAL_HANDLER + + var/mob/fool = parent + UnregisterSignal(fool, COMSIG_MOB_LOGOUT) + clear_image(trickery_image, fool.client) + +/datum/component/seethrough_mob/proc/toggle_active() + is_active = !is_active + if(is_active) + trick_mob() + else + untrick_mob() + +/datum/action/cooldown/toggle_seethrough + name = "Toggle Seethrough" + desc = "Allows you to see behind your massive body and click through it." + button_icon = 'icons/mob/actions/actions_xeno.dmi' + button_icon_state = "alien_sneak" + background_icon_state = "bg_alien" + cooldown_time = 1 SECONDS + melee_cooldown_time = 0 + +/datum/action/cooldown/toggle_seethrough/Remove(mob/remove_from) + var/datum/component/seethrough_mob/transparency = target + if(transparency.is_active) + transparency.untrick_mob() + return ..() + +/datum/action/cooldown/toggle_seethrough/Activate(atom/t) + StartCooldown() + var/datum/component/seethrough_mob/transparency = target + transparency.toggle_active() diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index a2f8be4cd014..e88b18eb75f7 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -170,7 +170,7 @@ if(istype(item, /obj/item/inducer)) var/obj/item/inducer/inducer = item - INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_atom), attached_circuit, attacker, list()) + INVOKE_ASYNC(inducer, TYPE_PROC_REF(/obj/item, attack_obj), attached_circuit, attacker, list()) return COMPONENT_NO_AFTERATTACK if(attached_circuit) @@ -339,7 +339,7 @@ COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY, COMSIG_CIRCUIT_PRE_POWER_USAGE, )) - if(attached_circuit.loc == parent || (!QDELETED(attached_circuit) && attached_circuit.loc == null)) + if(!QDELETED(attached_circuit) && (attached_circuit.loc == parent || (attached_circuit.loc == null))) var/atom/parent_atom = parent attached_circuit.forceMove(parent_atom.drop_location()) diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index e9f8b1652bbb..f10a27c06d9c 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -59,13 +59,13 @@ UnregisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS) wearer.update_appearance(UPDATE_ICON) wearer = null - QDEL_NULL(on_hit_effects) + on_hit_effects = null return ..() /datum/component/shielded/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(lost_wearer)) - RegisterSignal(parent, COMSIG_ITEM_HIT_REACT, PROC_REF(on_hit_react)) + RegisterSignal(parent, COMSIG_ITEM_CHECK_BLOCK, PROC_REF(on_check_block)) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(check_recharge_rune)) var/atom/shield = parent if(ismob(shield.loc)) @@ -75,7 +75,7 @@ set_wearer(holder) /datum/component/shielded/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_HIT_REACT, COMSIG_PARENT_ATTACKBY)) + UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_CHECK_BLOCK, COMSIG_PARENT_ATTACKBY)) var/atom/shield = parent if(shield.loc == wearer) lost_wearer(src, wearer) @@ -138,14 +138,14 @@ * This proc fires when we're hit, and is responsible for checking if we're charged, then deducting one + returning that we're blocking if so. * It then runs the callback in [/datum/component/shielded/var/on_hit_effects] which handles the messages/sparks (so the visuals) */ -/datum/component/shielded/proc/on_hit_react(datum/source, mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type) +/datum/component/shielded/proc/on_check_block(datum/source, mob/living/carbon/human/owner, atom/movable/hitby, attack_text, damage, attack_type) SIGNAL_HANDLER COOLDOWN_START(src, recently_hit_cd, recharge_start_delay) if(current_charges <= 0) return - . = COMPONENT_HIT_REACTION_BLOCK + . = (COMPONENT_CHECK_BLOCK_SKIP_REACTION|COMPONENT_CHECK_BLOCK_BLOCKED) var/charge_loss = 1 // how many charges do we lose diff --git a/code/datums/components/shy.dm b/code/datums/components/shy.dm index 433b723e9923..78ae48a5dc74 100644 --- a/code/datums/components/shy.dm +++ b/code/datums/components/shy.dm @@ -45,16 +45,16 @@ /datum/component/shy/RegisterWithParent() RegisterSignal(parent, COMSIG_MOB_CLICKON, PROC_REF(on_clickon)) - RegisterSignal(parent, COMSIG_LIVING_TRY_PULL, PROC_REF(on_try_pull)) - RegisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK), PROC_REF(on_unarmed_attack)) + RegisterSignal(parent, COMSIG_LIVING_TRY_GRAB, PROC_REF(on_try_pull)) + RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) RegisterSignal(parent, COMSIG_TRY_STRIP, PROC_REF(on_try_strip)) RegisterSignal(parent, COMSIG_TRY_ALT_ACTION, PROC_REF(on_try_alt_action)) /datum/component/shy/UnregisterFromParent() UnregisterSignal(parent, list( COMSIG_MOB_CLICKON, - COMSIG_LIVING_TRY_PULL, - COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, + COMSIG_LIVING_TRY_GRAB, + COMSIG_LIVING_UNARMED_ATTACK, COMSIG_TRY_STRIP, COMSIG_TRY_ALT_ACTION, )) @@ -118,7 +118,7 @@ /datum/component/shy/proc/on_try_pull(datum/source, atom/movable/target, force) SIGNAL_HANDLER - return is_shy(target) && COMSIG_LIVING_CANCEL_PULL + return is_shy(target) && COMSIG_LIVING_CANCEL_GRAB /datum/component/shy/proc/on_unarmed_attack(datum/source, atom/target, proximity, modifiers) SIGNAL_HANDLER diff --git a/code/datums/components/shy_in_room.dm b/code/datums/components/shy_in_room.dm index cf4319339630..bc4137255a07 100644 --- a/code/datums/components/shy_in_room.dm +++ b/code/datums/components/shy_in_room.dm @@ -16,8 +16,8 @@ /datum/component/shy_in_room/RegisterWithParent() RegisterSignal(parent, COMSIG_MOB_CLICKON, PROC_REF(on_clickon)) - RegisterSignal(parent, COMSIG_LIVING_TRY_PULL, PROC_REF(on_try_pull)) - RegisterSignal(parent, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HUMAN_EARLY_UNARMED_ATTACK), PROC_REF(on_unarmed_attack)) + RegisterSignal(parent, COMSIG_LIVING_TRY_GRAB, PROC_REF(on_try_pull)) + RegisterSignal(parent, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) RegisterSignal(parent, COMSIG_TRY_STRIP, PROC_REF(on_try_strip)) RegisterSignal(parent, COMSIG_TRY_ALT_ACTION, PROC_REF(on_try_alt_action)) @@ -25,9 +25,8 @@ /datum/component/shy_in_room/UnregisterFromParent() UnregisterSignal(parent, list( COMSIG_MOB_CLICKON, - COMSIG_LIVING_TRY_PULL, + COMSIG_LIVING_TRY_GRAB, COMSIG_LIVING_UNARMED_ATTACK, - COMSIG_HUMAN_EARLY_UNARMED_ATTACK, COMSIG_TRY_STRIP, COMSIG_TRY_ALT_ACTION, )) @@ -60,7 +59,7 @@ /datum/component/shy_in_room/proc/on_try_pull(datum/source, atom/movable/target, force) SIGNAL_HANDLER - return is_shy(target) && COMSIG_LIVING_CANCEL_PULL + return is_shy(target) && COMSIG_LIVING_CANCEL_GRAB /datum/component/shy_in_room/proc/on_unarmed_attack(datum/source, atom/target, proximity, modifiers) SIGNAL_HANDLER diff --git a/code/datums/components/singularity.dm b/code/datums/components/singularity.dm index ca7da13ea683..32943a3e5de2 100644 --- a/code/datums/components/singularity.dm +++ b/code/datums/components/singularity.dm @@ -46,6 +46,9 @@ /// The time that has elapsed since our last move/eat call var/time_since_last_eat + /// Singularity power to override size. + var/override_power + /datum/component/singularity/Initialize( bsa_targetable = TRUE, consume_range = 0, @@ -55,6 +58,7 @@ notify_admins = TRUE, singularity_size = STAGE_ONE, roaming = TRUE, + override_power = null, ) if (!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -67,6 +71,7 @@ src.notify_admins = notify_admins src.roaming = roaming src.singularity_size = singularity_size + src.override_power = override_power /datum/component/singularity/RegisterWithParent() START_PROCESSING(SSsinguloprocess, src) @@ -102,7 +107,7 @@ /datum/component/singularity/Destroy(force, silent) GLOB.singularities -= src - QDEL_NULL(consume_callback) + consume_callback = null target = null return ..() @@ -203,7 +208,7 @@ if (in_consume_range) consume(src, tile) else - tile.singularity_pull(parent, singularity_size) + tile.singularity_pull(parent, override_power || singularity_size) for (var/atom/movable/thing as anything in tile) if(thing == parent) @@ -211,7 +216,7 @@ if (in_consume_range) consume(src, thing) else - thing.singularity_pull(parent, singularity_size) + thing.singularity_pull(parent, override_power || singularity_size) if(TICK_CHECK) //Yes this means the singulo can eat all of its host subsystem's cpu, but like it's the singulo, and it was gonna do that anyway turfs_to_consume.Cut(1, cached_index + 1) diff --git a/code/datums/components/smooth_tunes.dm b/code/datums/components/smooth_tunes.dm index 40abf1e3c076..2750f526a3b8 100644 --- a/code/datums/components/smooth_tunes.dm +++ b/code/datums/components/smooth_tunes.dm @@ -68,7 +68,7 @@ //barticles if(particles_path && ismovable(linked_song.parent)) - particle_holder = new(linked_song.parent, particles_path) + particle_holder = new(linked_song.parent, particles_path, PARTICLE_ATTACH_MOB) //filters linked_song.parent?.add_filter("smooth_tunes_outline", 9, list("type" = "outline", "color" = glow_color)) diff --git a/code/datums/components/squeak.dm b/code/datums/components/squeak.dm index b8cc68327376..28070751c42e 100644 --- a/code/datums/components/squeak.dm +++ b/code/datums/components/squeak.dm @@ -79,9 +79,13 @@ else playsound(parent, pick_weight(override_squeak_sounds), volume, TRUE, sound_extra_range, sound_falloff_exponent, falloff_distance = sound_falloff_distance) -/datum/component/squeak/proc/step_squeak() +/datum/component/squeak/proc/step_squeak(atom/movable/source) SIGNAL_HANDLER + var/mob/living/carbon/human/owner = source.loc + if(CHECK_MOVE_LOOP_FLAGS(owner, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + return + if(steps > step_delay) play_squeak() steps = 0 @@ -133,7 +137,7 @@ holder = null // Disposal pipes related shits -/datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/source) +/datum/component/squeak/proc/disposing_react(datum/source, obj/structure/disposalholder/holder, obj/machinery/disposal/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 diff --git a/code/datums/components/strong_pull.dm b/code/datums/components/strong_pull.dm index f0cb206a650d..85e251c234ae 100644 --- a/code/datums/components/strong_pull.dm +++ b/code/datums/components/strong_pull.dm @@ -17,7 +17,7 @@ Basically, the items they pull cannot be pulled (except by the puller) /datum/component/strong_pull/RegisterWithParent() . = ..() - RegisterSignal(parent, COMSIG_LIVING_START_PULL, PROC_REF(on_pull)) + RegisterSignal(parent, COMSIG_LIVING_START_GRAB, PROC_REF(on_pull)) /** * Called when the parent grabs something, adds signals to the object to reject interactions @@ -25,8 +25,8 @@ Basically, the items they pull cannot be pulled (except by the puller) /datum/component/strong_pull/proc/on_pull(datum/source, atom/movable/pulled, state, force) SIGNAL_HANDLER strongpulling = pulled - RegisterSignal(strongpulling, COMSIG_ATOM_CAN_BE_PULLED, PROC_REF(reject_further_pulls)) - RegisterSignal(strongpulling, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_no_longer_pulled)) + RegisterSignal(strongpulling, COMSIG_ATOM_CAN_BE_GRABBED, PROC_REF(reject_further_pulls)) + RegisterSignal(strongpulling, COMSIG_ATOM_NO_LONGER_GRABBED, PROC_REF(on_no_longer_pulled)) if(istype(strongpulling, /obj/structure/closet) && !istype(strongpulling, /obj/structure/closet/body_bag)) var/obj/structure/closet/grabbed_closet = strongpulling grabbed_closet.strong_grab = TRUE @@ -37,13 +37,13 @@ Basically, the items they pull cannot be pulled (except by the puller) /datum/component/strong_pull/proc/reject_further_pulls(datum/source, mob/living/puller) SIGNAL_HANDLER if(puller != parent) //for increasing grabs, you need to have a valid pull. thus, parent should be able to pull the same object again - return COMSIG_ATOM_CANT_PULL + return COMSIG_ATOM_NO_GRAB /* * Unregisters signals and stops any buffs to pulling. */ /datum/component/strong_pull/proc/lose_strong_grip() - UnregisterSignal(strongpulling, list(COMSIG_ATOM_CAN_BE_PULLED, COMSIG_ATOM_NO_LONGER_PULLED)) + UnregisterSignal(strongpulling, list(COMSIG_ATOM_CAN_BE_GRABBED, COMSIG_ATOM_NO_LONGER_GRABBED)) if(istype(strongpulling, /obj/structure/closet)) var/obj/structure/closet/ungrabbed_closet = strongpulling ungrabbed_closet.strong_grab = FALSE diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm deleted file mode 100644 index 8f5c733f537b..000000000000 --- a/code/datums/components/surgery_initiator.dm +++ /dev/null @@ -1,332 +0,0 @@ -/// Allows an item to be used to initiate surgeries. -/datum/component/surgery_initiator - /// The currently selected target that the user is proposing a surgery on - var/datum/weakref/surgery_target_ref - - /// The last user, as a weakref - var/datum/weakref/last_user_ref - -/datum/component/surgery_initiator/Initialize() - . = ..() - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - -/datum/component/surgery_initiator/Destroy(force, silent) - last_user_ref = null - surgery_target_ref = null - - return ..() - -/datum/component/surgery_initiator/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(initiate_surgery_moment)) - -/datum/component/surgery_initiator/UnregisterFromParent() - UnregisterSignal(parent, COMSIG_ITEM_ATTACK) - unregister_signals() - -/datum/component/surgery_initiator/proc/unregister_signals() - var/mob/living/last_user = last_user_ref?.resolve() - if (!isnull(last_user_ref)) - UnregisterSignal(last_user, COMSIG_MOB_SELECTED_ZONE_SET) - - var/mob/living/surgery_target = surgery_target_ref?.resolve() - if (!isnull(surgery_target_ref)) - UnregisterSignal(surgery_target, COMSIG_MOB_SURGERY_STARTED) - -/// Does the surgery initiation. -/datum/component/surgery_initiator/proc/initiate_surgery_moment(datum/source, atom/target, mob/user) - SIGNAL_HANDLER - if(!isliving(target)) - return - INVOKE_ASYNC(src, PROC_REF(do_initiate_surgery_moment), target, user) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/datum/component/surgery_initiator/proc/do_initiate_surgery_moment(mob/living/target, mob/user) - var/datum/surgery/current_surgery - - for(var/i_one in target.surgeries) - var/datum/surgery/surgeryloop = i_one - if(surgeryloop.location == user.zone_selected) - current_surgery = surgeryloop - break - - if (!isnull(current_surgery) && !current_surgery.step_in_progress) - attempt_cancel_surgery(current_surgery, target, user) - return - - var/list/available_surgeries = get_available_surgeries(user, target) - - if(!length(available_surgeries)) - if (target.body_position == LYING_DOWN) - to_chat(user, span_warning("You can't think of any surgery to perform on [target]")) - else - to_chat(user, span_warning("You cannot perform surgery on a standing patient!")) - return - - unregister_signals() - - last_user_ref = WEAKREF(user) - surgery_target_ref = WEAKREF(target) - - RegisterSignal(user, COMSIG_MOB_SELECTED_ZONE_SET, PROC_REF(on_set_selected_zone)) - RegisterSignal(target, COMSIG_MOB_SURGERY_STARTED, PROC_REF(on_mob_surgery_started)) - - ui_interact(user) - -/datum/component/surgery_initiator/proc/get_available_surgeries(mob/user, mob/living/target) - var/list/available_surgeries = list() - - var/mob/living/carbon/carbon_target - var/obj/item/bodypart/affecting - if (iscarbon(target)) - carbon_target = target - affecting = carbon_target.get_bodypart(check_zone(user.zone_selected)) - - for(var/datum/surgery/surgery as anything in GLOB.surgeries_list) - if(!surgery.possible_locs.Find(user.zone_selected)) - continue - if(affecting) - if(!surgery.requires_bodypart) - continue - if(surgery.requires_bodypart_type && !(affecting.bodytype & surgery.requires_bodypart_type)) - continue - if(surgery.requires_real_bodypart && affecting.is_pseudopart) - continue - else if(carbon_target && surgery.requires_bodypart) //mob with no limb in surgery zone when we need a limb - continue - if(surgery.lying_required && target.body_position != LYING_DOWN) - continue - if(!surgery.can_start(user, target)) - continue - for(var/path in surgery.target_mobtypes) - if(istype(target, path)) - available_surgeries += surgery - break - - return available_surgeries - -/// Does the surgery de-initiation. -/datum/component/surgery_initiator/proc/attempt_cancel_surgery(datum/surgery/the_surgery, mob/living/patient, mob/user) - var/selected_zone = user.zone_selected - - if(the_surgery.status == 1) - patient.surgeries -= the_surgery - REMOVE_TRAIT(patient, TRAIT_ALLOWED_HONORBOUND_ATTACK, type) - user.visible_message( - span_notice("[user] removes [parent] from [patient]'s [parse_zone(selected_zone)]."), - span_notice("You remove [parent] from [patient]'s [parse_zone(selected_zone)]."), - ) - - qdel(the_surgery) - return - - if(!the_surgery.can_cancel) - return - - var/required_tool_type = TOOL_CAUTERY - var/obj/item/close_tool = user.get_inactive_held_item() - var/is_robotic = the_surgery.requires_bodypart_type == BODYTYPE_ROBOTIC - - if(is_robotic) - required_tool_type = TOOL_SCREWDRIVER - - if(iscyborg(user)) - close_tool = locate(/obj/item/cautery) in user.held_items - if(!close_tool) - to_chat(user, span_warning("You need a cautery in your other hand to stop the surgery!")) - return - else if(!close_tool || close_tool.tool_behaviour != required_tool_type) - to_chat(user, span_warning("You need a [is_robotic ? "screwdriver": "cautery"] in your other hand to stop the surgery!")) - return - - if(the_surgery.operated_bodypart) - the_surgery.operated_bodypart.adjustBleedStacks(-5) - - patient.surgeries -= the_surgery - REMOVE_TRAIT(patient, TRAIT_ALLOWED_HONORBOUND_ATTACK, ELEMENT_TRAIT(type)) - - user.visible_message( - span_notice("[user] closes [patient]'s [parse_zone(selected_zone)] with [close_tool] and removes [parent]."), - span_notice("You close [patient]'s [parse_zone(selected_zone)] with [close_tool] and remove [parent]."), - ) - - - qdel(the_surgery) - -/datum/component/surgery_initiator/proc/on_mob_surgery_started(mob/source, datum/surgery/surgery, surgery_location) - SIGNAL_HANDLER - - var/mob/living/last_user = last_user_ref.resolve() - - if (surgery_location != last_user.zone_selected) - return - - if (!isnull(last_user)) - source.balloon_alert(last_user, "someone else started a surgery!") - - ui_close() - -/datum/component/surgery_initiator/proc/on_set_selected_zone(mob/source, new_zone) - ui_interact(source) - -/datum/component/surgery_initiator/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if (!ui) - ui = new(user, src, "SurgeryInitiator") - ui.open() - -/datum/component/surgery_initiator/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if (.) - return . - - var/mob/user = usr - var/mob/living/surgery_target = surgery_target_ref.resolve() - - if (isnull(surgery_target)) - return TRUE - - switch (action) - if ("change_zone") - var/zone = params["new_zone"] - if (!(zone in list( - BODY_ZONE_HEAD, - BODY_ZONE_CHEST, - BODY_ZONE_L_ARM, - BODY_ZONE_R_ARM, - BODY_ZONE_L_LEG, - BODY_ZONE_R_LEG, - BODY_ZONE_PRECISE_EYES, - BODY_ZONE_PRECISE_MOUTH, - BODY_ZONE_PRECISE_GROIN, - ))) - return TRUE - - var/atom/movable/screen/zone_sel/zone_selector = user.hud_used?.zone_select - zone_selector?.set_selected_zone(zone, user) - - return TRUE - if ("start_surgery") - for (var/datum/surgery/surgery as anything in get_available_surgeries(user, surgery_target)) - if (surgery.name == params["surgery_name"]) - try_choose_surgery(user, surgery_target, surgery) - return TRUE - -/datum/component/surgery_initiator/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/simple/body_zones), - ) - -/datum/component/surgery_initiator/ui_data(mob/user) - var/mob/living/surgery_target = surgery_target_ref.resolve() - - var/list/surgeries = list() - if (!isnull(surgery_target)) - for (var/datum/surgery/surgery as anything in get_available_surgeries(user, surgery_target)) - var/list/surgery_info = list( - "name" = surgery.name, - ) - - if (surgery_needs_exposure(surgery, surgery_target)) - surgery_info["blocked"] = TRUE - - surgeries += list(surgery_info) - - return list( - "selected_zone" = user.zone_selected, - "target_name" = surgery_target?.name, - "surgeries" = surgeries, - ) - -/datum/component/surgery_initiator/ui_close(mob/user) - unregister_signals() - surgery_target_ref = null - - return ..() - -/datum/component/surgery_initiator/ui_status(mob/user, datum/ui_state/state) - var/obj/item/item_parent = parent - if (user != item_parent.loc) - return UI_CLOSE - - var/mob/living/surgery_target = surgery_target_ref?.resolve() - if (isnull(surgery_target)) - return UI_CLOSE - - if (!can_start_surgery(user, surgery_target)) - return UI_CLOSE - - return ..() - -/datum/component/surgery_initiator/proc/can_start_surgery(mob/user, mob/living/target) - if (!user.Adjacent(target)) - return FALSE - - // The item was moved somewhere else - if (!(parent in user)) - return FALSE - - // While we were choosing, another surgery was started at the same location - for (var/datum/surgery/surgery in target.surgeries) - if (surgery.location == user.zone_selected) - return FALSE - - return TRUE - -/datum/component/surgery_initiator/proc/try_choose_surgery(mob/user, mob/living/target, datum/surgery/surgery) - if (!can_start_surgery(user, target)) - // This could have a more detailed message, but the UI closes when this is true anyway, so - // if it ever comes up, it'll be because of lag. - to_chat(user, span_warning("You are unable to perform that surgery right now!")) - return - - var/obj/item/bodypart/affecting_limb - - var/selected_zone = user.zone_selected - - if (iscarbon(target)) - var/mob/living/carbon/carbon_target = target - affecting_limb = carbon_target.get_bodypart(check_zone(selected_zone)) - - if (surgery.requires_bodypart == isnull(affecting_limb)) - if (surgery.requires_bodypart) - to_chat(user, span_warning("[target] has no [parse_zone(selected_zone)]!")) - else - to_chat(user, span_warning("[target] has \a [parse_zone(selected_zone)]!")) - - return - - if (!isnull(affecting_limb) && surgery.requires_bodypart_type && !(affecting_limb.bodytype & surgery.requires_bodypart_type)) - to_chat(user, span_warning("You're not sure how to perform that surgery on this kind of bodypart")) - return - - if (surgery.lying_required && target.body_position != LYING_DOWN) - to_chat(user, span_warning("You cannot perform surgery on a standing patient!")) - return - - if (!surgery.can_start(user, target)) - to_chat(user, span_warning("You are unable to start the surgery!")) - return - - if (surgery_needs_exposure(surgery, target)) - to_chat(user, span_warning("You need to expose [target]'s [parse_zone(selected_zone)] first!")) - return - - ui_close() - - var/datum/surgery/procedure = new surgery.type(target, selected_zone, affecting_limb) - ADD_TRAIT(target, TRAIT_ALLOWED_HONORBOUND_ATTACK, type) - - user.visible_message( - span_notice("[user] drapes [parent] over [target]'s [parse_zone(selected_zone)] to prepare for surgery."), - span_notice("You drape [parent] over [target]'s [parse_zone(selected_zone)] to prepare for \an [procedure.name]."), - ) - - log_combat(user, target, "operated on", null, "(OPERATION TYPE: [procedure.name]) (TARGET AREA: [selected_zone])") - -/datum/component/surgery_initiator/proc/surgery_needs_exposure(datum/surgery/surgery, mob/living/target) - var/mob/living/user = last_user_ref?.resolve() - if (isnull(user)) - return FALSE - - return !surgery.ignore_clothes && !get_location_accessible(target, user.zone_selected) diff --git a/code/datums/components/swabbing.dm b/code/datums/components/swabbing.dm deleted file mode 100644 index 2bb77ccb79db..000000000000 --- a/code/datums/components/swabbing.dm +++ /dev/null @@ -1,134 +0,0 @@ -/*! - -This component is used in vat growing to swab for microbiological samples which can then be mixed with reagents in a petridish to create a culture plate. - -*/ -/datum/component/swabbing - ///The current datums on the swab - var/list/swabbed_items - ///Can we swab objs? - var/can_swab_objs - ///Can we swab turfs? - var/can_swab_turfs - ///Can we swab mobs? - var/can_swab_mobs - ///Callback for update_icon() - var/datum/callback/update_icons - ///Callback for update_overlays() - var/datum/callback/update_overlays - -/datum/component/swabbing/Initialize(can_swab_objs = TRUE, can_swab_turfs = TRUE, can_swab_mobs = FALSE, datum/callback/update_icons, datum/callback/update_overlays, swab_time = 1 SECONDS, max_items = 3) - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE - - RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(try_to_swab)) - RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examine)) - RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(handle_overlays)) - RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(handle_icon)) - - src.can_swab_objs = can_swab_objs - src.can_swab_turfs = can_swab_turfs - src.can_swab_mobs = can_swab_mobs - src.update_icons = update_icons - src.update_overlays = update_overlays - -/datum/component/swabbing/Destroy() - . = ..() - for(var/swabbed in swabbed_items) - qdel(swabbed) - QDEL_NULL(update_icons) - QDEL_NULL(update_overlays) - - -///Changes examine based on your sample -/datum/component/swabbing/proc/examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - if(LAZYLEN(swabbed_items)) - examine_list += span_nicegreen("There is a microbiological sample on [parent]!") - examine_list += "[span_notice("You can see the following micro-organisms:")]\n" - for(var/i in swabbed_items) - var/datum/biological_sample/samp = i - for(var/organism in samp.micro_organisms) - var/datum/micro_organism/MO = organism - examine_list += MO.get_details() - -///Ran when you attack an object, tries to get a swab of the object. if a swabbable surface is found it will run behavior and hopefully -/datum/component/swabbing/proc/try_to_swab(datum/source, atom/target, mob/user, params) - SIGNAL_HANDLER - - if(istype(target, /obj/structure/table))//help how do i do this less shitty - return NONE //idk bro pls send help - - if(istype(target, /obj/item/petri_dish)) - if(!LAZYLEN(swabbed_items)) - return NONE - var/obj/item/petri_dish/dish = target - if(dish.sample) - return - - var/datum/biological_sample/deposited_sample - - for(var/i in swabbed_items) //Typed in case there is a non sample on the swabbing tool because someone was fucking with swabbable element - if(!istype(i, /datum/biological_sample/)) - stack_trace("Non biological sample being swabbed, no bueno.") - continue - var/datum/biological_sample/sample = i - //Collapse the samples into one sample; one gooey mess essentialy. - if(!deposited_sample) - deposited_sample = sample - else - deposited_sample.Merge(sample) - - dish.deposit_sample(user, deposited_sample) - LAZYCLEARLIST(swabbed_items) - - var/obj/item/I = parent - I.update_appearance() - - return COMPONENT_CANCEL_ATTACK_CHAIN - if(!can_swab(target)) - return NONE //Just do the normal attack. - - - . = COMPONENT_CANCEL_ATTACK_CHAIN //Point of no return. No more attacking after this. - - if(LAZYLEN(swabbed_items)) - to_chat(user, span_warning("You cannot collect another sample on [parent]!")) - return - - to_chat(user, span_notice("You start swabbing [target] for samples!")) - INVOKE_ASYNC(src, PROC_REF(async_try_to_swab), target, user) - -/datum/component/swabbing/proc/async_try_to_swab(atom/target, mob/user) - if(!do_after(user, target, 3 SECONDS)) // Start swabbing boi - return - - LAZYINITLIST(swabbed_items) //If it isn't initialized, initialize it. As we need to pass it by reference - - if(SEND_SIGNAL(target, COMSIG_SWAB_FOR_SAMPLES, swabbed_items) == NONE) //If we found something to swab now we let the swabbed thing handle what it would do, we just sit back and relax now. - to_chat(user, span_warning("You do not manage to find a anything on [target]!")) - return - - to_chat(user, span_nicegreen("You manage to collect a microbiological sample from [target]!")) - - var/obj/item/parent_item = parent - parent_item.update_appearance() - -///Checks if the swabbing component can swab the specific object or nots -/datum/component/swabbing/proc/can_swab(atom/target) - if(isobj(target)) - return can_swab_objs - if(isturf(target)) - return can_swab_turfs - if(ismob(target)) - return can_swab_mobs - -///Handle any special overlay cases on the item itself -/datum/component/swabbing/proc/handle_overlays(datum/source, list/overlays) - SIGNAL_HANDLER - update_overlays?.Invoke(overlays, swabbed_items) - -///Handle any special icon cases on the item itself -/datum/component/swabbing/proc/handle_icon(datum/source) - SIGNAL_HANDLER - update_icons?.Invoke(swabbed_items) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index dad09d592e89..5634e32c6d3f 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -74,7 +74,7 @@ if(modifiers[ALT_CLICK] || modifiers[SHIFT_CLICK] || modifiers[CTRL_CLICK] || modifiers[MIDDLE_CLICK]) return - if(!user.throw_mode || user.get_active_held_item() || user.pulling || user.buckled || user.incapacitated()) + if(!user.throw_mode || user.get_active_held_item() || length(user.active_grabs) || user.buckled || user.incapacitated()) return if(!A || !(isturf(A) || isturf(A.loc))) @@ -107,7 +107,7 @@ RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(checkObstacle)) playsound(user, 'sound/weapons/thudswoosh.ogg', 40, TRUE, -1) - var/leap_word = isfelinid(user) ? "pounce" : "leap" //If cat, "pounce" instead of "leap". + var/leap_word = "leap" if(can_see(user, A, 7)) user.visible_message(span_warning("[user] [leap_word]s at [A]!"), span_danger("You [leap_word] at [A]!")) else @@ -157,7 +157,7 @@ var/mob/living/carbon/target = hit var/mob/living/carbon/human/T = target var/mob/living/carbon/human/S = user - var/tackle_word = isfelinid(user) ? "pounce" : "tackle" //If cat, "pounce" instead of "tackle". + var/tackle_word = "tackle" //If cat, "pounce" instead of "tackle". var/roll = rollTackle(target) tackling = FALSE @@ -211,9 +211,7 @@ target.stamina.adjust(-40) target.Paralyze(5) target.Knockdown(30) - if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T) - S.setGrabState(GRAB_PASSIVE) + S.try_make_grab(target, /datum/grab/normal/aggressive) if(5 to INFINITY) // absolutely BODIED user.visible_message(span_warning("[user] lands a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), span_userdanger("You land a monster [tackle_word] on [target], knocking [target.p_them()] senseless and applying an aggressive pin!"), ignored_mobs = target) @@ -225,10 +223,7 @@ target.stamina.adjust(-40) target.Paralyze(5) target.Knockdown(30) - if(ishuman(target) && ishuman(user)) - INVOKE_ASYNC(S.dna.species, TYPE_PROC_REF(/datum/species, grab), S, T) - S.setGrabState(GRAB_AGGRESSIVE) - + S.try_make_grab(target, /datum/grab/normal/aggressive) return COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH @@ -279,7 +274,6 @@ if(ishuman(target)) var/mob/living/carbon/human/T = target - defense_mod += T.shove_resistance() if(isnull(T.wear_suit) && isnull(T.w_uniform)) // who honestly puts all of their effort into tackling a naked guy? defense_mod += 2 if(T.mob_negates_gravity()) @@ -291,8 +285,6 @@ var/obj/item/organ/tail/el_tail = T.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) if(!el_tail) // lizards without tails are off-balance defense_mod -= 1 - else if(el_tail.wag_flags & WAG_WAGGING) // lizard tail wagging is robust and can swat away assailants! - defense_mod += 1 // OF-FENSE var/mob/living/carbon/sacker = parent diff --git a/code/datums/components/tactical.dm b/code/datums/components/tactical.dm index f673abcf7bb0..92cba5098497 100644 --- a/code/datums/components/tactical.dm +++ b/code/datums/components/tactical.dm @@ -30,7 +30,7 @@ var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user) I.copy_overlays(master) I.override = TRUE - source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I) + source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/living, "sneaking_mission", I) I.layer = ABOVE_MOB_LAYER /datum/component/tactical/proc/unmodify(obj/item/source, mob/user) diff --git a/code/datums/components/thermite.dm b/code/datums/components/thermite.dm index c38f31f2ea45..a1050068435d 100644 --- a/code/datums/components/thermite.dm +++ b/code/datums/components/thermite.dm @@ -97,7 +97,8 @@ var/turf/master = parent delete_fire() if(user) - master.add_hiddenprint(user) + master.log_touch(user) + if(amount >= burn_require) master = master.Melt() master.burn_tile() diff --git a/code/datums/components/tippable.dm b/code/datums/components/tippable.dm index 2667a3752880..5e8758f35971 100644 --- a/code/datums/components/tippable.dm +++ b/code/datums/components/tippable.dm @@ -63,14 +63,10 @@ UnregisterSignal(parent, COMSIG_ATOM_ATTACK_HAND_SECONDARY) /datum/component/tippable/Destroy() - if(pre_tipped_callback) - QDEL_NULL(pre_tipped_callback) - if(post_tipped_callback) - QDEL_NULL(post_tipped_callback) - if(post_untipped_callback) - QDEL_NULL(post_untipped_callback) - if(roleplay_callback) - QDEL_NULL(roleplay_callback) + pre_tipped_callback = null + post_tipped_callback = null + post_untipped_callback = null + roleplay_callback = null return ..() /** diff --git a/code/datums/components/transforming.dm b/code/datums/components/transforming.dm index 186702143c3e..569143b9519e 100644 --- a/code/datums/components/transforming.dm +++ b/code/datums/components/transforming.dm @@ -178,6 +178,7 @@ source.attack_verb_simple = attack_verb_simple_on source.hitsound = hitsound_on + source.wielded_hitsound = hitsound_on source.w_class = w_class_on source.icon_state = "[source.icon_state]_on" @@ -203,6 +204,7 @@ source.attack_verb_simple = attack_verb_simple_off source.hitsound = initial(source.hitsound) + source.wielded_hitsound = initial(source.wielded_hitsound) source.w_class = initial(source.w_class) source.icon_state = initial(source.icon_state) diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm deleted file mode 100644 index 6577c699ffeb..000000000000 --- a/code/datums/components/twohanded.dm +++ /dev/null @@ -1,349 +0,0 @@ -/** - * 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 weilded - var/force_unwielded = 0 /// The force of the item when unweilded - 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 -/** - - * 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 - */ -/datum/component/two_handed/Initialize(require_twohands=FALSE, wieldsound=FALSE, unwieldsound=FALSE, attacksound=FALSE, \ - force_multiplier=0, force_wielded=0, force_unwielded=0, icon_wielded=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.icon_wielded = icon_wielded - - if(require_twohands) - ADD_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) - -// Inherit the new values passed to the component -/datum/component/two_handed/InheritComponent(datum/component/two_handed/new_comp, original, require_twohands, wieldsound, unwieldsound, \ - force_multiplier, force_wielded, force_unwielded, icon_wielded) - 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(icon_wielded) - src.icon_wielded = icon_wielded - -// register signals withthe parent item -/datum/component/two_handed/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip)) - RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(on_attack_self)) - RegisterSignal(parent, COMSIG_ITEM_ATTACK, PROC_REF(on_attack)) - RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_icon)) - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) - RegisterSignal(parent, COMSIG_ITEM_SHARPEN_ACT, PROC_REF(on_sharpen)) - -// 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)) - -/// Triggered on equip of the item containing the component -/datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot) - SIGNAL_HANDLER - - if(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(require_twohands) //Don't let the item fall to the ground and cause bugs if it's actually being equipped on another slot. - unwield(user, FALSE, FALSE) - if(wielded) - unwield(user) - if(source == offhand_item && !QDELETED(source)) - offhand_item = null - qdel(source) - -/// Triggered on destroy of the component's offhand -/datum/component/two_handed/proc/on_destroy(datum/source) - SIGNAL_HANDLER - offhand_item = null - -/// 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(wielded) - unwield(user) - else if(user.is_holding(parent)) - 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) - if(wielded) - return - if(ismonkey(user)) - if(require_twohands) - to_chat(user, span_notice("[parent] is too heavy and cumbersome for you to carry!")) - user.dropItemToGround(parent, force=TRUE) - else - to_chat(user, span_notice("It's too heavy for you to wield fully.")) - return - if(user.get_inactive_held_item()) - if(require_twohands) - to_chat(user, span_notice("[parent] is too cumbersome to carry in one hand!")) - user.dropItemToGround(parent, force=TRUE) - else - to_chat(user, span_warning("You need your other hand to be empty!")) - return - if(user.usable_hands < 2) - if(require_twohands) - user.dropItemToGround(parent, force=TRUE) - to_chat(user, span_warning("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 - ADD_TRAIT(parent,TRAIT_WIELDED,src) - RegisterSignal(user, COMSIG_MOB_SWAP_HANDS, PROC_REF(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(sharpened_increase) - parent_item.force += sharpened_increase - parent_item.name = "[parent_item.name] (Wielded)" - parent_item.update_appearance() - - if(iscyborg(user)) - to_chat(user, span_notice("You dedicate your module to [parent].")) - else - to_chat(user, span_notice("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_REF(on_drop)) - RegisterSignal(offhand_item, COMSIG_PARENT_QDELETING, PROC_REF(on_destroy)) - 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 - * * can_drop (option) whether 'dropItemToGround' can be called or not. - */ -/datum/component/two_handed/proc/unwield(mob/living/carbon/user, show_message=TRUE, can_drop = TRUE) - if(!wielded) - return - - // wield update status - wielded = FALSE - UnregisterSignal(user, COMSIG_MOB_SWAP_HANDS) - SEND_SIGNAL(parent, COMSIG_TWOHANDED_UNWIELD, user) - REMOVE_TRAIT(parent,TRAIT_WIELDED,src) - - // 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(force_unwielded) - parent_item.force = force_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_appearance() - - if(istype(user)) // tk showed that we might not have a mob here - if(user.get_item_by_slot(ITEM_SLOT_BACK) == parent) - user.update_worn_back() - else - user.update_held_items() - - // if the item requires two handed drop the item on unwield - if(require_twohands && can_drop) - user.dropItemToGround(parent, force=TRUE) - - // Show message if requested - if(show_message) - if(iscyborg(user)) - to_chat(user, span_notice("You free up your module.")) - else if(require_twohands) - to_chat(user, span_notice("You drop [parent].")) - else - to_chat(user, span_notice("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, list(COMSIG_ITEM_DROPPED, COMSIG_PARENT_QDELETING)) - 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(obj/item/source) - SIGNAL_HANDLER - if(!wielded) - return NONE - if(!icon_wielded) - return NONE - source.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) - return - if(held_item == parent) - 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 - -/** - * 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/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/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/udder.dm b/code/datums/components/udder.dm index c17fbf764890..c2cf27c735b7 100644 --- a/code/datums/components/udder.dm +++ b/code/datums/components/udder.dm @@ -73,15 +73,15 @@ /obj/item/udder/Initialize(mapload, udder_mob, on_generate_callback, reagent_produced_typepath = /datum/reagent/consumable/milk) src.udder_mob = udder_mob src.on_generate_callback = on_generate_callback - create_reagents(size, REAGENT_HOLDER_ALIVE) + create_reagents(size) src.reagent_produced_typepath = reagent_produced_typepath initial_conditions() . = ..() /obj/item/udder/Destroy() - . = ..() STOP_PROCESSING(SSobj, src) udder_mob = null + return ..() /obj/item/udder/process(delta_time) if(udder_mob.stat != DEAD) @@ -122,49 +122,23 @@ to_chat(user, span_warning("The udder is dry. Wait a bit longer...")) /** - * # gutlunch udder subtype - * - * Used by gutlunches, and generates healing reagents instead of milk on eating gibs instead of a process. Starts empty! - * Female gutlunches (ahem, guthens if you will) make babies when their udder is full under processing, instead of milk generation - */ -/obj/item/udder/gutlunch - name = "nutrient sac" - -/obj/item/udder/gutlunch/initial_conditions() - if(!udder_mob) - return - if(udder_mob.gender == FEMALE) - START_PROCESSING(SSobj, src) - RegisterSignal(udder_mob, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_mob_attacking)) + * Slug "udders". I'm so sorry it has to be this way +*/ +/obj/item/udder/slug + name = "slime gland" -/obj/item/udder/gutlunch/process(delta_time) - var/mob/living/simple_animal/hostile/asteroid/gutlunch/gutlunch = udder_mob - if(reagents.total_volume != reagents.maximum_volume) - return - if(gutlunch.make_babies()) - reagents.clear_reagents() - //usually this would be a callback but this is a specifically gutlunch feature so fuck it, gutlunch specific proccall - gutlunch.regenerate_icons(reagents.total_volume, reagents.maximum_volume) +/obj/item/udder/slug/initial_conditions() + . = ..() + RegisterSignal(udder_mob, COMSIG_MOVABLE_MOVED, PROC_REF(on_slug_move)) -/** - * signal called on parent attacking an atom -*/ -/obj/item/udder/gutlunch/proc/on_mob_attacking(mob/living/simple_animal/hostile/gutlunch, atom/target) +/obj/item/udder/slug/proc/on_slug_move() SIGNAL_HANDLER - if(is_type_in_typecache(target, gutlunch.wanted_objects)) //we eats - generate() - gutlunch.visible_message(span_notice("[udder_mob] slurps up [target].")) - qdel(target) - return COMPONENT_HOSTILE_NO_ATTACK //there is no longer a target to attack - -/obj/item/udder/gutlunch/generate() - var/made_something = FALSE - if(prob(60)) - reagents.add_reagent(/datum/reagent/consumable/cream, rand(2, 5)) - made_something = TRUE - if(prob(45)) - reagents.add_reagent(/datum/reagent/medicine/salglu_solution, rand(2,5)) - made_something = TRUE - if(made_something && on_generate_callback) - on_generate_callback.Invoke(reagents.total_volume, reagents.maximum_volume) + if (reagents.total_volume <= 0) + return //no slime :( + var/turf/slug_turf = get_turf(udder_mob) + if(!slug_turf) + return + slug_turf.wash(CLEAN_SCRUB) + reagents.expose(slug_turf, TOUCH, 5) + reagents.remove_all(5) diff --git a/code/datums/components/unbreakable.dm b/code/datums/components/unbreakable.dm index 0001a5526f91..b8b11e5fa4ab 100644 --- a/code/datums/components/unbreakable.dm +++ b/code/datums/components/unbreakable.dm @@ -18,7 +18,7 @@ /datum/component/unbreakable/proc/surge(mob/living/carbon/human/surged, new_stat) SIGNAL_HANDLER - if(new_stat < SOFT_CRIT || new_stat >= DEAD) + if(new_stat != UNCONSCIOUS) return if(!COOLDOWN_FINISHED(src, surge_cooldown)) return diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index c90fb7d0802f..b245edd6c5d3 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -84,6 +84,9 @@ uplink_handler.purchase_log = purchase_log else uplink_handler = uplink_handler_override + if(isturf(uplink_handler)) + stack_trace("what") + RegisterSignal(uplink_handler, COMSIG_UPLINK_HANDLER_ON_UPDATE, PROC_REF(handle_uplink_handler_update)) if(!lockable) active = TRUE diff --git a/code/datums/components/usb_port.dm b/code/datums/components/usb_port.dm index db947dfcc077..09c3080107c5 100644 --- a/code/datums/components/usb_port.dm +++ b/code/datums/components/usb_port.dm @@ -24,7 +24,7 @@ circuit_components = list() - set_circuit_components(circuit_component_types) + src.circuit_component_types = circuit_component_types /datum/component/usb_port/proc/set_circuit_components(list/components) var/should_register = FALSE @@ -136,6 +136,9 @@ /datum/component/usb_port/proc/on_atom_usb_cable_try_attach(datum/source, obj/item/usb_cable/connecting_cable, mob/user) SIGNAL_HANDLER + if (!length(circuit_components)) + set_circuit_components(circuit_component_types) + var/atom/atom_parent = parent if (!isnull(attached_circuit)) diff --git a/code/datums/components/wearertargeting.dm b/code/datums/components/wearertargeting.dm index a7405ee9560c..4e59dc3529f3 100644 --- a/code/datums/components/wearertargeting.dm +++ b/code/datums/components/wearertargeting.dm @@ -3,7 +3,7 @@ /datum/component/wearertargeting var/list/valid_slots = list() var/list/signals = list() - var/proctype = GLOBAL_PROC_REF(pass) + var/proctype = GLOBAL_PROC_REF(noop) var/mobtype = /mob/living /datum/component/wearertargeting/Initialize() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm deleted file mode 100644 index e89f4762059e..000000000000 --- a/code/datums/datacore.dm +++ /dev/null @@ -1,405 +0,0 @@ -///Dummy mob reserve slot for manifest -#define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" - -GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) - -//TODO: someone please get rid of this shit -/datum/datacore - var/list/medical = list() - var/medicalPrintCount = 0 - var/list/general = list() - var/list/security = list() - var/securityPrintCount = 0 - var/securityCrimeCounter = 0 - ///This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character(). - var/list/locked = list() - -/datum/data - var/name = "data" - -/datum/data/record - name = "record" - var/list/fields = list() - -/datum/data/record/Destroy() - GLOB.data_core.medical -= src - GLOB.data_core.security -= src - GLOB.data_core.general -= src - GLOB.data_core.locked -= src - . = ..() - -/// A helper proc to get the front photo of a character from the record. -/// Handles calling `get_photo()`, read its documentation for more information. -/datum/data/record/proc/get_front_photo() - return get_photo("photo_front", SOUTH) - -/// A helper proc to get the side photo of a character from the record. -/// Handles calling `get_photo()`, read its documentation for more information. -/datum/data/record/proc/get_side_photo() - return get_photo("photo_side", WEST) - -/** - * You shouldn't be calling this directly, use `get_front_photo()` or `get_side_photo()` - * instead. - * - * This is the proc that handles either fetching (if it was already generated before) or - * generating (if it wasn't) the specified photo from the specified record. This is only - * intended to be used by records that used to try to access `fields["photo_front"]` or - * `fields["photo_side"]`, and will return an empty icon if there isn't any of the necessary - * fields. - * - * Arguments: - * * field_name - The name of the key in the `fields` list, of the record itself. - * * orientation - The direction in which you want the character appearance to be rotated - * in the outputed photo. - * - * Returns an empty `/icon` if there was no `character_appearance` entry in the `fields` list, - * returns the generated/cached photo otherwise. - */ -/datum/data/record/proc/get_photo(field_name, orientation) - if(fields[field_name]) - return fields[field_name] - - if(!fields["character_appearance"]) - return new /icon() - - var/mutable_appearance/character_appearance = fields["character_appearance"] - character_appearance.setDir(orientation) - - var/icon/picture_image = getFlatIcon(character_appearance) - - var/datum/picture/picture = new - picture.picture_name = "[fields["name"]]" - picture.picture_desc = "This is [fields["name"]]." - picture.picture_image = picture_image - - var/obj/item/photo/photo = new(null, picture) - fields[field_name] = photo - return photo - -/datum/data/crime - name = "crime" - var/crimeName = "" - var/crimeDetails = "" - var/author = "" - var/time = "" - var/fine = 0 - var/paid = 0 - var/dataId = 0 - -/datum/datacore/proc/createCrimeEntry(cname = "", cdetails = "", author = "", time = "", fine = 0) - var/datum/data/crime/c = new /datum/data/crime - c.crimeName = cname - c.crimeDetails = cdetails - c.author = author - c.time = time - c.fine = fine - c.paid = 0 - c.dataId = ++securityCrimeCounter - return c - -/datum/datacore/proc/addCitation(id = "", datum/data/crime/crime) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["citation"] - crimes |= crime - return - -/datum/datacore/proc/removeCitation(id, cDataId) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["citation"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crimes -= crime - return - -/datum/datacore/proc/payCitation(id, cDataId, amount) - for(var/datum/data/record/R in security) - if(R.fields["id"] == id) - var/list/crimes = R.fields["citation"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crime.paid = crime.paid + amount - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_SEC] - D.adjust_money(amount) - return - -/** - * 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["crim"] - crimes |= crime - return - -/** - * 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["crim"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crimes -= crime - return - -/** - * 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["crim"] - for(var/datum/data/crime/crime in crimes) - if(crime.dataId == text2num(cDataId)) - crime.crimeDetails = details - return - -/datum/datacore/proc/manifest() - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/N = i - if(N.new_character) - log_manifest(N.ckey,N.new_character.mind,N.new_character) - if(ishuman(N.new_character)) - manifest_inject(N.new_character, N.client) - CHECK_TICK - -/datum/datacore/proc/manifest_modify(name, assignment, trim) - var/datum/data/record/foundrecord = find_record("name", name, GLOB.data_core.general) - if(foundrecord) - foundrecord.fields["rank"] = assignment - foundrecord.fields["trim"] = trim - - -/datum/datacore/proc/get_manifest() - // First we build up the order in which we want the departments to appear in. - var/list/manifest_out = list() - for(var/datum/job_department/department as anything in SSjob.joinable_departments) - manifest_out[department.department_name] = list() - manifest_out[DEPARTMENT_UNASSIGNED] = list() - - var/list/departments_by_type = SSjob.joinable_departments_by_type - for(var/datum/data/record/record as anything in GLOB.data_core.general) - var/name = record.fields["name"] - var/rank = record.fields["rank"] // user-visible job - var/trim = record.fields["trim"] // internal jobs by trim type - var/datum/job/job = SSjob.GetJob(trim) - if(!job || !(job.job_flags & JOB_CREW_MANIFEST) || !LAZYLEN(job.departments_list)) // In case an unlawful custom rank is added. - var/list/misc_list = manifest_out[DEPARTMENT_UNASSIGNED] - misc_list[++misc_list.len] = list( - "name" = name, - "rank" = rank, - "trim" = trim, - ) - continue - for(var/department_type as anything in job.departments_list) - var/datum/job_department/department = departments_by_type[department_type] - if(!department) - stack_trace("get_manifest() failed to get job department for [department_type] of [job.type]") - continue - var/list/entry = list( - "name" = name, - "rank" = rank, - "trim" = trim, - ) - var/list/department_list = manifest_out[department.department_name] - if(istype(job, department.department_head)) - department_list.Insert(1, null) - department_list[1] = entry - else - department_list[++department_list.len] = entry - - // Trim the empty categories. - for (var/department in manifest_out) - if(!length(manifest_out[department])) - manifest_out -= department - - return manifest_out - -/datum/datacore/proc/get_manifest_html(monochrome = FALSE) - var/list/manifest = get_manifest() - var/dat = {" - - - - "} - for(var/department in manifest) - var/list/entries = manifest[department] - dat += "" - //JUST - var/even = FALSE - for(var/entry in entries) - var/list/entry_list = entry - dat += "" - even = !even - - dat += "
NameRank
[department]
[entry_list["name"]][entry_list["rank"] == entry_list["trim"] ? entry_list["rank"] : "[entry_list["rank"]] ([entry_list["trim"]])"]
" - dat = replacetext(dat, "\n", "") - dat = replacetext(dat, "\t", "") - return dat - -/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H, client/C) - set waitfor = FALSE - var/static/list/show_directions = list(SOUTH, WEST) - if(H.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST) - var/assignment = H.mind.assigned_role.title - //PARIAH EDIT ADDITION - // The alt job title, if user picked one, or the default - var/chosen_assignment = C?.prefs.alt_job_titles[assignment] || assignment - //PARIAH EDIT END - - var/static/record_id_num = 1001 - var/id = num2hex(record_id_num++,6) - if(!C) - C = H.client - - var/mutable_appearance/character_appearance = new(H.appearance) - - //These records should ~really~ be merged or something - //General Record - var/datum/data/record/G = new() - G.fields["id"] = id - G.fields["name"] = H.real_name - // G.fields["rank"] = assignment //ORIGINAL - G.fields["rank"] = chosen_assignment //PARIAH EDIT - G.fields["trim"] = assignment - G.fields["initial_rank"] = assignment - G.fields["age"] = H.age - G.fields["species"] = H.dna.species.name - G.fields["fingerprint"] = md5(H.dna.unique_identity) - G.fields["p_stat"] = "Active" - G.fields["m_stat"] = "Stable" - G.fields["gender"] = H.gender - if(H.gender == "male") - G.fields["gender"] = "Male" - else if(H.gender == "female") - G.fields["gender"] = "Female" - else - G.fields["gender"] = "Other" - G.fields["character_appearance"] = character_appearance - general += G - - //Medical Record - var/datum/data/record/M = new() - M.fields["id"] = id - M.fields["name"] = H.real_name - M.fields["blood_type"] = H.dna.blood_type - M.fields["b_dna"] = H.dna.unique_enzymes - M.fields["mi_dis"] = H.get_quirk_string(!medical, CAT_QUIRK_MINOR_DISABILITY) - M.fields["mi_dis_d"] = H.get_quirk_string(medical, CAT_QUIRK_MINOR_DISABILITY) - M.fields["ma_dis"] = H.get_quirk_string(!medical, CAT_QUIRK_MAJOR_DISABILITY) - M.fields["ma_dis_d"] = H.get_quirk_string(medical, CAT_QUIRK_MAJOR_DISABILITY) - M.fields["cdi"] = "None" - M.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - M.fields["notes"] = H.get_quirk_string(!medical, CAT_QUIRK_NOTES) - M.fields["notes_d"] = H.get_quirk_string(medical, CAT_QUIRK_NOTES) - medical += M - - //Security Record - var/datum/data/record/S = new() - S.fields["id"] = id - S.fields["name"] = H.real_name - S.fields["criminal"] = "None" - S.fields["citation"] = list() - S.fields["crim"] = list() - S.fields["notes"] = "No notes." - security += S - - //Locked Record - var/datum/data/record/L = new() - L.fields["id"] = md5("[H.real_name][assignment]") //surely this should just be id, like the others? - L.fields["name"] = H.real_name - // L.fields["rank"] = assignment //ORIGINAL - L.fields["rank"] = chosen_assignment //PARIAH EDIT - L.fields["trim"] = assignment - G.fields["initial_rank"] = assignment - L.fields["age"] = H.age - L.fields["gender"] = H.gender - if(H.gender == "male") - G.fields["gender"] = "Male" - else if(H.gender == "female") - G.fields["gender"] = "Female" - else - G.fields["gender"] = "Other" - L.fields["blood_type"] = H.dna.blood_type - L.fields["b_dna"] = H.dna.unique_enzymes - L.fields["identity"] = H.dna.unique_identity - L.fields["species"] = H.dna.species.type - L.fields["features"] = H.dna.features - L.fields["character_appearance"] = character_appearance - L.fields["mindref"] = H.mind - locked += L - return - -/** - * Supporing proc for getting general records - * and using them as pAI ui data. This gets - * medical information - or what I would deem - * medical information - and sends it as a list. - * - * @return - list(general_records_out) - */ -/datum/datacore/proc/get_general_records() - if(!GLOB.data_core.general) - return list() - /// The array of records - var/list/general_records_out = list() - for(var/datum/data/record/gen_record as anything in GLOB.data_core.general) - /// The object containing the crew info - var/list/crew_record = list() - crew_record["ref"] = REF(gen_record) - crew_record["name"] = gen_record.fields["name"] - crew_record["physical_health"] = gen_record.fields["p_stat"] - crew_record["mental_health"] = gen_record.fields["m_stat"] - general_records_out += list(crew_record) - return general_records_out - -/** - * Supporing proc for getting secrurity records - * and using them as pAI ui data. Sends it as a - * list. - * - * @return - list(security_records_out) - */ -/datum/datacore/proc/get_security_records() - if(!GLOB.data_core.security) - return list() - /// The array of records - var/list/security_records_out = list() - for(var/datum/data/record/sec_record as anything in GLOB.data_core.security) - /// The object containing the crew info - var/list/crew_record = list() - crew_record["ref"] = REF(sec_record) - crew_record["name"] = sec_record.fields["name"] - crew_record["status"] = sec_record.fields["criminal"] // wanted status - crew_record["crimes"] = length(sec_record.fields["crim"]) - security_records_out += list(crew_record) - return security_records_out - -#undef DUMMY_HUMAN_SLOT_MANIFEST diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 740a191ce6f7..a76d4e25bf1f 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -40,11 +40,6 @@ /// Datum level flags var/datum_flags = NONE - /// A cached version of our \ref - /// The brunt of \ref costs are in creating entries in the string tree (a tree of immutable strings) - /// This avoids doing that more then once per datum by ensuring ref strings always have a reference to them after they're first pulled - var/cached_ref - /// A weak reference to another datum var/datum/weakref/weak_reference @@ -56,9 +51,19 @@ */ var/list/cooldowns + // Abstract types are expanded upon more in __DEFINES\abstract.dm + /// If this var's value is equivalent to the current type, it is considered abstract. + /// It is illegal to instantiate abstract types. + var/datum/abstract_type = /datum + + #ifdef REFERENCE_TRACKING - var/running_find_references + /// When was this datum last touched by a reftracker? + /// If this value doesn't match with the start of the search + /// We know this datum has never been seen before, and we should check it var/last_find_references = 0 + /// How many references we're trying to find when searching + var/references_to_clear = 0 #ifdef REFERENCE_TRACKING_DEBUG ///Stores info about where refs are found, used for sanity checks and testing var/list/found_refs @@ -101,12 +106,13 @@ datum_flags &= ~DF_USE_TAG //In case something tries to REF us weak_reference = null //ensure prompt GCing of weakref. - var/list/timers = active_timers - active_timers = null - for(var/datum/timedevent/timer as anything in timers) - if (timer.spent && !(timer.flags & TIMER_DELETE_ME)) - continue - qdel(timer) + if(active_timers) + var/list/timers = active_timers + active_timers = null + for(var/datum/timedevent/timer as anything in timers) + if (timer.spent && !(timer.flags & TIMER_DELETE_ME)) + continue + qdel(timer) #ifdef REFERENCE_TRACKING #ifdef REFERENCE_TRACKING_DEBUG @@ -115,8 +121,8 @@ #endif //BEGIN: ECS SHIT - var/list/dc = datum_components - if(dc) + if(datum_components) + var/list/dc = datum_components var/all_components = dc[/datum/component] if(length(all_components)) for(var/datum/component/component as anything in all_components) @@ -124,7 +130,7 @@ else var/datum/component/C = all_components qdel(C, FALSE, TRUE) - dc.Cut() + dc = null clear_signal_refs() //END: ECS SHIT @@ -270,3 +276,15 @@ return SEND_SIGNAL(source, COMSIG_CD_RESET(index), S_TIMER_COOLDOWN_TIMELEFT(source, index)) TIMER_COOLDOWN_END(source, index) + +///Generate a tag for this /datum, if it implements one +///Should be called as early as possible, best would be in New, to avoid weakref mistargets +///Really just don't use this, you don't need it, global lists will do just fine MOST of the time +///We really only use it for mobs to make id'ing people easier +/datum/proc/GenerateTag() + datum_flags |= DF_USE_TAG + +/// Return text from this proc to provide extra context to hard deletes that happen to it +/// Optional, you should use this for cases where replication is difficult and extra context is required +/datum/proc/dump_harddel_info() + return diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm index ea6334a352f2..37206e52fa90 100644 --- a/code/datums/diseases/_MobProcs.dm +++ b/code/datums/diseases/_MobProcs.dm @@ -54,7 +54,7 @@ if(!target_zone) target_zone = pick(head_ch;BODY_ZONE_HEAD,body_ch;BODY_ZONE_CHEST,hands_ch;BODY_ZONE_L_ARM,feet_ch;BODY_ZONE_L_LEG) else - target_zone = check_zone(target_zone) + target_zone = deprecise_zone(target_zone) @@ -143,7 +143,20 @@ return ..() /mob/living/proc/CanSpreadAirborneDisease() - return !is_mouth_covered() + return has_mouth() && !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))) + if(!has_mouth() || losebreath) + return FALSE + + if(head && (head.flags_cover & HEADCOVERSMOUTH) && head.returnArmor().getRating(BIO) >= 25) + return FALSE + + if(wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && wear_mask.returnArmor().getRating(BIO) >= 25) + return FALSE + + var/obj/item/bodypart/head/realhead = get_bodypart(BODY_ZONE_HEAD) + if(realhead && realhead.returnArmor().getRating(BIO) >= 100) + return FALSE + + return TRUE diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index c9a9a2d57e38..8941e0060b74 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -35,40 +35,40 @@ // The order goes from easy to cure to hard to cure. Keep in mind that sentient diseases pick two cures from tier 6 and up, ensure they won't react away in bodies. var/static/list/advance_cures = list( - list( // level 1 - /datum/reagent/copper, /datum/reagent/silver, /datum/reagent/iodine, /datum/reagent/iron, /datum/reagent/carbon - ), - list( // level 2 - /datum/reagent/potassium, /datum/reagent/consumable/ethanol, /datum/reagent/lithium, /datum/reagent/silicon, /datum/reagent/bromine - ), - list( // level 3 - /datum/reagent/consumable/salt, /datum/reagent/consumable/sugar, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/milk - ), - list( //level 4 - /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/c2/multiver - ), - list( //level 5 - /datum/reagent/fuel/oil, /datum/reagent/medicine/synaptizine, /datum/reagent/medicine/mannitol, /datum/reagent/drug/space_drugs, /datum/reagent/cryptobiolin - ), - list( // level 6 - /datum/reagent/phenol, /datum/reagent/medicine/inacusiate, /datum/reagent/medicine/oculine, /datum/reagent/medicine/antihol - ), - list( // level 7 - /datum/reagent/medicine/leporazine, /datum/reagent/toxin/mindbreaker, /datum/reagent/medicine/higadrite - ), - list( // level 8 - /datum/reagent/pax, /datum/reagent/drug/happiness, /datum/reagent/medicine/ephedrine - ), - list( // level 9 - /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/sal_acid - ), - list( // level 10 - /datum/reagent/medicine/haloperidol, /datum/reagent/drug/aranesp, /datum/reagent/medicine/diphenhydramine - ), - list( //level 11 - /datum/reagent/medicine/modafinil, /datum/reagent/toxin/anacea - ) - ) + list( // level 1 + /datum/reagent/copper, /datum/reagent/silver, /datum/reagent/iodine, /datum/reagent/iron, /datum/reagent/carbon + ), + list( // level 2 + /datum/reagent/potassium, /datum/reagent/consumable/ethanol, /datum/reagent/lithium, /datum/reagent/silicon, + ), + list( // level 3 + /datum/reagent/consumable/salt, /datum/reagent/consumable/sugar, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/milk + ), + list( //level 4 + /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/saline_glucose, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/dylovene + ), + list( //level 5 + /datum/reagent/fuel/oil, /datum/reagent/medicine/synaptizine, /datum/reagent/medicine/alkysine, /datum/reagent/drug/space_drugs, /datum/reagent/cryptobiolin + ), + list( // level 6 + /datum/reagent/medicine/inacusiate, /datum/reagent/medicine/imidazoline, /datum/reagent/medicine/antihol + ), + list( // level 7 + /datum/reagent/medicine/leporazine, /datum/reagent/medicine/chlorpromazine, + ), + list( // level 8 + /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/ephedrine + ), + list( // level 9 + /datum/reagent/toxin/lipolicide, + ), + list( // level 10 + /datum/reagent/drug/aranesp, /datum/reagent/medicine/diphenhydramine + ), + list( //level 11 + /datum/reagent/toxin/anacea + ) + ) /* @@ -315,7 +315,7 @@ cures = list(pick(advance_cures[res])) oldres = res // Get the cure name from the cure_id - var/datum/reagent/D = GLOB.chemical_reagents_list[cures[1]] + var/datum/reagent/D = SSreagents.chemical_reagents_list[cures[1]] cure_text = D.name // Randomly generate a symptom, has a chance to lose or gain a symptom. diff --git a/code/datums/diseases/advance/symptoms/deafness.dm b/code/datums/diseases/advance/symptoms/deafness.dm index c4176614054a..617716655519 100644 --- a/code/datums/diseases/advance/symptoms/deafness.dm +++ b/code/datums/diseases/advance/symptoms/deafness.dm @@ -50,7 +50,7 @@ to_chat(M, span_userdanger("Your ears pop painfully and start bleeding!")) // Just absolutely murder me man ears.applyOrganDamage(ears.maxHealth) - M.emote("scream") + M.emote("agony") else to_chat(M, span_userdanger("Your ears pop and begin ringing loudly!")) ears.deaf = min(20, ears.deaf + 15) diff --git a/code/datums/diseases/advance/symptoms/genetics.dm b/code/datums/diseases/advance/symptoms/genetics.dm index 0d6986df9e9f..be6b7d3f0404 100644 --- a/code/datums/diseases/advance/symptoms/genetics.dm +++ b/code/datums/diseases/advance/symptoms/genetics.dm @@ -21,9 +21,9 @@ symptom_delay_max = 60 var/excludemuts = NONE var/no_reset = FALSE - var/mutadone_proof = NONE + var/ryetalyn_proof = NONE threshold_descs = list( - "Resistance 8" = "The negative and mildly negative mutations caused by the virus are mutadone-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).", + "Resistance 8" = "The negative and mildly negative mutations caused by the virus are ryetalyn-proof (but will still be undone when the virus is cured if the resistance 14 threshold is not met).", "Resistance 14" = "The host's genetic alterations are not undone when the virus is cured.", "Stage Speed 10" = "The virus activates dormant mutations at a much faster rate.", "Stealth 5" = "Only activates negative mutations in hosts." @@ -38,8 +38,8 @@ if(A.totalStageSpeed() >= 10) //activate dormant mutations more often at around 1.5x the pace symptom_delay_min = 20 symptom_delay_max = 40 - if(A.totalResistance() >= 8) //mutadone won't save you now - mutadone_proof = (NEGATIVE | MINOR_NEGATIVE) + if(A.totalResistance() >= 8) //ryetalyn won't save you now + ryetalyn_proof = (NEGATIVE | MINOR_NEGATIVE) if(A.totalResistance() >= 14) //one does not simply escape Nurgle's grasp no_reset = TRUE @@ -53,7 +53,7 @@ switch(A.stage) if(4, 5) to_chat(C, span_warning("[pick("Your skin feels itchy.", "You feel light headed.")]")) - C.easy_random_mutate((NEGATIVE | MINOR_NEGATIVE | POSITIVE) - excludemuts, TRUE, TRUE, TRUE, mutadone_proof) + C.easy_random_mutate((NEGATIVE | MINOR_NEGATIVE | POSITIVE) - excludemuts, TRUE, TRUE, TRUE, ryetalyn_proof) /datum/symptom/genetic_mutation/End(datum/disease/advance/A) . = ..() diff --git a/code/datums/diseases/advance/symptoms/headache.dm b/code/datums/diseases/advance/symptoms/headache.dm index 1ecc4ce6f119..1e47028b86be 100644 --- a/code/datums/diseases/advance/symptoms/headache.dm +++ b/code/datums/diseases/advance/symptoms/headache.dm @@ -44,10 +44,10 @@ var/mob/living/M = A.affected_mob if(power < 2) if(prob(base_message_chance) || A.stage >=4) - to_chat(M, span_warning("[pick("Your head hurts.", "Your head pounds.")]")) + M.apply_pain(20, BODY_ZONE_HEAD, "[pick("Your head hurts.", "Your head pounds.")]") if(power >= 2 && A.stage >= 4) - to_chat(M, span_warning("[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")) + M.apply_pain(26, BODY_ZONE_HEAD, "[pick("Your head hurts a lot.", "Your head pounds incessantly.")]") M.stamina.adjust(-25) if(power >= 3 && A.stage >= 5) - to_chat(M, span_userdanger("[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]")) + M.apply_pain(40, BODY_ZONE_HEAD, "[pick("Your head hurts!", "You feel a burning knife inside your brain!", "A wave of pain fills your head!")]") M.Stun(35) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index c6694d6f8c1c..fff8c0329b62 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -174,8 +174,9 @@ return for(var/obj/item/bodypart/L as anything in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) - M.update_damage_overlays() + L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC, FALSE) + M.updatehealth() + M.update_damage_overlays() return 1 /datum/symptom/heal/starlight/passive_message_condition(mob/living/M) @@ -315,8 +316,9 @@ to_chat(M, span_notice("The darkness soothes and mends your wounds.")) for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, BODYTYPE_ORGANIC)) //more effective on brute - M.update_damage_overlays() + L.heal_damage(heal_amt/parts.len, heal_amt/parts.len * 0.5, BODYTYPE_ORGANIC, FALSE) //more effective on brute + M.updatehealth() + M.update_damage_overlays() return 1 /datum/symptom/heal/darkness/passive_message_condition(mob/living/M) @@ -383,11 +385,10 @@ return power if(M.IsSleeping()) return power * 0.25 //Voluntary unconsciousness yields lower healing. - switch(M.stat) - if(UNCONSCIOUS, HARD_CRIT) - return power * 0.9 - if(SOFT_CRIT) - return power * 0.5 + + if(M.stat == UNCONSCIOUS) + return power * 0.9 + if(M.getBruteLoss() + M.getFireLoss() >= 70 && !active_coma) to_chat(M, span_warning("You feel yourself slip into a regenerative coma...")) active_coma = TRUE @@ -415,9 +416,9 @@ return for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) - M.update_damage_overlays() - + L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC, updating_health = FALSE) + M.updatehealth() + M.update_damage_overlays() if(active_coma && M.getBruteLoss() + M.getFireLoss() == 0) uncoma(M) @@ -477,8 +478,10 @@ to_chat(M, span_notice("You feel yourself absorbing the water around you to soothe your damaged skin.")) for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, BODYTYPE_ORGANIC)) - M.update_damage_overlays() + L.heal_damage(heal_amt/parts.len * 0.5, heal_amt/parts.len, BODYTYPE_ORGANIC, FALSE) + + M.updatehealth() + M.update_damage_overlays() return 1 @@ -549,8 +552,10 @@ if(prob(5)) to_chat(M, span_notice("The pain from your wounds fades rapidly.")) for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) - M.update_damage_overlays() + L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC, FALSE) + + M.updatehealth() + M.update_damage_overlays() return 1 ///Plasma End @@ -602,6 +607,7 @@ to_chat(M, span_notice("Your skin glows faintly, and you feel your wounds mending themselves.")) for(var/obj/item/bodypart/L in parts) - if(L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC)) - M.update_damage_overlays() + L.heal_damage(heal_amt/parts.len, heal_amt/parts.len, BODYTYPE_ORGANIC, FALSE) + M.updatehealth() + M.update_damage_overlays() return 1 diff --git a/code/datums/diseases/advance/symptoms/itching.dm b/code/datums/diseases/advance/symptoms/itching.dm index 976b0c8c17b9..c3dafb39777a 100644 --- a/code/datums/diseases/advance/symptoms/itching.dm +++ b/code/datums/diseases/advance/symptoms/itching.dm @@ -44,4 +44,4 @@ var/can_scratch = scratch && !M.incapacitated() M.visible_message("[can_scratch ? span_warning("[M] scratches [M.p_their()] [bodypart.name].") : ""]", span_warning("Your [bodypart.name] itches. [can_scratch ? " You scratch it." : ""]")) if(can_scratch) - bodypart.receive_damage(0.5) + bodypart.receive_damage(0.5, modifiers = NONE) diff --git a/code/datums/diseases/advance/symptoms/sensory.dm b/code/datums/diseases/advance/symptoms/sensory.dm index 30acb6e92b6b..326977fcf385 100644 --- a/code/datums/diseases/advance/symptoms/sensory.dm +++ b/code/datums/diseases/advance/symptoms/sensory.dm @@ -45,16 +45,17 @@ if(A.stage >= 3) M.adjust_timed_status_effect(-4 SECONDS, /datum/status_effect/dizziness) M.adjust_drowsyness(-2) - M.adjust_timed_status_effect(-1 SECONDS, /datum/status_effect/speech/slurring/drunk) + // All slurring effects get reduced down a bit + for(var/datum/status_effect/speech/slurring/slur in M.status_effects) + slur.remove_duration(1 SECONDS) + M.adjust_timed_status_effect(-2 SECONDS, /datum/status_effect/confusion) if(purge_alcohol) - M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3) + M.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 3, include_subtypes = TRUE) M.adjust_drunk_effect(-5) if(A.stage >= 4) M.adjust_drowsyness(-2) - if(M.reagents.has_reagent(/datum/reagent/toxin/mindbreaker)) - M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) if(M.reagents.has_reagent(/datum/reagent/toxin/histamine)) M.reagents.remove_reagent(/datum/reagent/toxin/histamine, 5) M.hallucination = max(0, M.hallucination - 10) diff --git a/code/datums/diseases/brainrot.dm b/code/datums/diseases/brainrot.dm index 89e6b085a236..abfcfe9c41ea 100644 --- a/code/datums/diseases/brainrot.dm +++ b/code/datums/diseases/brainrot.dm @@ -3,8 +3,8 @@ max_stages = 4 spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS - cure_text = "Mannitol" - cures = list(/datum/reagent/medicine/mannitol) + cure_text = "Alkysine" + cures = list(/datum/reagent/medicine/alkysine) agent = "Cryptococcus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 7.5 //higher chance to cure, since two reagents are required diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm index b85d0a1bc936..b4985135f5e2 100644 --- a/code/datums/diseases/decloning.dm +++ b/code/datums/diseases/decloning.dm @@ -3,12 +3,12 @@ name = "Cellular Degeneration" max_stages = 5 stage_prob = 0.5 - cure_text = "Rezadone or death." + cure_text = "Omnizine or death." agent = "Severe Genetic Damage" viable_mobtypes = list(/mob/living/carbon/human) desc = @"If left untreated the subject will [REDACTED]!" severity = "Dangerous!" - cures = list(/datum/reagent/medicine/rezadone) + cures = list(/datum/reagent/medicine/omnizine) disease_flags = CAN_CARRY|CAN_RESIST spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS process_dead = TRUE @@ -58,7 +58,7 @@ if(DT_PROB(5, delta_time)) affected_mob.adjustCloneLoss(5, FALSE) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) - if(affected_mob.cloneloss >= 100) + if(affected_mob.getCloneLoss() >= 100) affected_mob.visible_message(span_danger("[affected_mob] skin turns to dust!"), span_boldwarning("Your skin turns to dust!")) affected_mob.dust() return FALSE diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm index 0aae3eaafa0a..df8b0d1df56f 100644 --- a/code/datums/diseases/dna_spread.dm +++ b/code/datums/diseases/dna_spread.dm @@ -3,8 +3,8 @@ max_stages = 4 spread_text = "On contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS - cure_text = "Mutadone" - cures = list(/datum/reagent/medicine/mutadone) + cure_text = "Ryetalyn" + cures = list(/datum/reagent/medicine/ryetalyn) disease_flags = CAN_CARRY|CAN_RESIST|CURABLE agent = "S4E1 retrovirus" viable_mobtypes = list(/mob/living/carbon/human) @@ -42,11 +42,11 @@ if(DT_PROB(4, delta_time)) affected_mob.emote("cough") if(DT_PROB(0.5, delta_time)) - to_chat(affected_mob, span_danger("Your muscles ache.")) + affected_mob.pain_message("Your muscles ache.", 1) if(prob(20)) affected_mob.take_bodypart_damage(1, updating_health = FALSE) if(DT_PROB(0.5, delta_time)) - to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.apply_pain(1, BODY_ZONE_CHEST, "Your abdomen hurts.") if(prob(20)) affected_mob.adjustToxLoss(2, FALSE) if(4) @@ -59,7 +59,7 @@ var/datum/dna/transform_dna = strain_data["dna"] transform_dna.transfer_identity(affected_mob, transfer_SE = 1) - affected_mob.real_name = affected_mob.dna.real_name + affected_mob.set_real_name(affected_mob.dna.real_name) affected_mob.updateappearance(mutcolor_update=1) affected_mob.domutcheck() @@ -70,7 +70,7 @@ /datum/disease/dnaspread/Destroy() if (original_dna && transformed && affected_mob) original_dna.transfer_identity(affected_mob, transfer_SE = 1) - affected_mob.real_name = affected_mob.dna.real_name + affected_mob.set_real_name(affected_mob.dna.real_name) affected_mob.updateappearance(mutcolor_update=1) affected_mob.domutcheck() diff --git a/code/datums/diseases/flu.dm b/code/datums/diseases/flu.dm index 38f18fba44cd..19e78fce0355 100644 --- a/code/datums/diseases/flu.dm +++ b/code/datums/diseases/flu.dm @@ -28,7 +28,7 @@ if(prob(20)) affected_mob.take_bodypart_damage(1, updating_health = FALSE) if(DT_PROB(0.5, delta_time)) - to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.apply_pain(5, BODY_ZONE_CHEST, "Your abdomen hurts.") if(prob(20)) affected_mob.adjustToxLoss(1, FALSE) if(affected_mob.body_position == LYING_DOWN && DT_PROB(10, delta_time)) @@ -46,7 +46,7 @@ if(prob(20)) affected_mob.take_bodypart_damage(1, updating_health = FALSE) if(DT_PROB(0.5, delta_time)) - to_chat(affected_mob, span_danger("Your stomach hurts.")) + affected_mob.apply_pain(5, BODY_ZONE_CHEST, "Your abdomen hurts.") if(prob(20)) affected_mob.adjustToxLoss(1, FALSE) if(affected_mob.body_position == LYING_DOWN && DT_PROB(7.5, delta_time)) diff --git a/code/datums/diseases/gastrolisis.dm b/code/datums/diseases/gastrolisis.dm deleted file mode 100644 index 779e6702cfbc..000000000000 --- a/code/datums/diseases/gastrolisis.dm +++ /dev/null @@ -1,98 +0,0 @@ -/datum/disease/gastrolosis - name = "Invasive Gastrolosis" - max_stages = 4 - spread_text = "Unknown" - spread_flags = DISEASE_SPREAD_SPECIAL - cure_text = "Salt and mutadone" - agent = "Agent S and DNA restructuring" - viable_mobtypes = list(/mob/living/carbon/human) - stage_prob = 0.5 - disease_flags = CURABLE - cures = list(/datum/reagent/consumable/salt, /datum/reagent/medicine/mutadone) - - -/datum/disease/gastrolosis/stage_act(delta_time, times_fired) - . = ..() - if(!.) - return - - if(is_species(affected_mob, /datum/species/snail)) - cure() - return FALSE - - switch(stage) - if(2) - if(DT_PROB(1, delta_time)) - affected_mob.emote("gag") - if(DT_PROB(0.5, delta_time)) - var/turf/open/OT = get_turf(affected_mob) - if(isopenturf(OT)) - OT.MakeSlippery(TURF_WET_LUBE, 40) - if(3) - if(DT_PROB(2.5, delta_time)) - affected_mob.emote("gag") - if(DT_PROB(2.5, delta_time)) - var/turf/open/OT = get_turf(affected_mob) - if(isopenturf(OT)) - OT.MakeSlippery(TURF_WET_LUBE, 100) - if(4) - var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.organs - if(!eyes && DT_PROB(2.5, delta_time)) - var/obj/item/organ/eyes/snail/new_eyes = new() - new_eyes.Insert(affected_mob, drop_if_replaced = TRUE) - affected_mob.visible_message(span_warning("[affected_mob]'s eyes fall out, with snail eyes taking its place!"), \ - span_userdanger("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(ITEM_SLOT_BACK) - if(!istype(shell, /obj/item/storage/backpack/snail)) - shell = null - if(!shell && DT_PROB(2.5, delta_time)) - 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(span_warning("[affected_mob] grows a grotesque shell on their back!"), \ - span_userdanger("You scream in pain as a shell pushes itself out from under your skin!")) - affected_mob.emote("scream") - return - - var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.organs - if(!tongue && DT_PROB(2.5, delta_time)) - var/obj/item/organ/tongue/snail/new_tongue = new() - new_tongue.Insert(affected_mob) - to_chat(affected_mob, span_userdanger("You feel your speech slow down...")) - return - - if(shell && eyes && tongue && DT_PROB(2.5, delta_time)) - affected_mob.set_species(/datum/species/snail) - affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob) - affected_mob.visible_message(span_warning("[affected_mob] turns into a snail!"), \ - span_boldnotice("You turned into a snail person! You feel an urge to cccrrraaawwwlll...")) - cure() - return FALSE - - if(DT_PROB(5, delta_time)) - affected_mob.emote("gag") - if(DT_PROB(5, delta_time)) - var/turf/open/OT = get_turf(affected_mob) - if(isopenturf(OT)) - OT.MakeSlippery(TURF_WET_LUBE, 100) - - -/datum/disease/gastrolosis/cure() - . = ..() - if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening - var/mob/living/carbon/human/H = affected_mob - var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.organs - if(tongue) - var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue () - new_tongue.Insert(H) - var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in H.organs - 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(ITEM_SLOT_BACK) - if(istype(bag, /obj/item/storage/backpack/snail)) - bag.emptyStorage() - H.temporarilyRemoveItemFromInventory(bag, TRUE) - qdel(bag) diff --git a/code/datums/diseases/gbs.dm b/code/datums/diseases/gbs.dm index 524b547ac002..c6a6f9e20956 100644 --- a/code/datums/diseases/gbs.dm +++ b/code/datums/diseases/gbs.dm @@ -25,7 +25,7 @@ if(DT_PROB(2.5, delta_time)) affected_mob.emote("gasp") if(DT_PROB(5, delta_time)) - to_chat(affected_mob, span_danger("Your body hurts all over!")) + affected_mob.apply_pain(10, BODY_ZONE_CHEST, "Your body aches with pain!") if(4) to_chat(affected_mob, span_userdanger("Your body feels as if it's trying to rip itself apart!")) if(DT_PROB(30, delta_time)) diff --git a/code/datums/diseases/heart_failure.dm b/code/datums/diseases/heart_failure.dm index 7698fae8e18e..3b02c27b2a4c 100644 --- a/code/datums/diseases/heart_failure.dm +++ b/code/datums/diseases/heart_failure.dm @@ -64,7 +64,6 @@ span_userdanger("You feel a terrible pain in your chest, as if your heart has stopped!")) affected_mob.stamina.adjust(-60) affected_mob.set_heartattack(TRUE) - affected_mob.reagents.add_reagent(/datum/reagent/medicine/c2/penthrite, 3) // To give the victim a final chance to shock their heart before losing consciousness cure() SSblackbox.record_feedback("amount", "heartattacks", 1) return FALSE diff --git a/code/datums/diseases/retrovirus.dm b/code/datums/diseases/retrovirus.dm index 7cbcbb97394c..6e9c796ca505 100644 --- a/code/datums/diseases/retrovirus.dm +++ b/code/datums/diseases/retrovirus.dm @@ -3,7 +3,7 @@ max_stages = 4 spread_text = "Contact" spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS - cure_text = "Rest or an injection of mutadone" + cure_text = "Rest or an injection of ryetalyn" cure_chance = 3 agent = "" viable_mobtypes = list(/mob/living/carbon/human) @@ -17,7 +17,7 @@ ..() agent = "Virus class [pick("A","B","C","D","E","F")][pick("A","B","C","D","E","F")]-[rand(50,300)]" if(prob(40)) - cures = list(/datum/reagent/medicine/mutadone) + cures = list(/datum/reagent/medicine/ryetalyn) else restcure = 1 @@ -34,7 +34,7 @@ switch(stage) if(1) if(DT_PROB(4, delta_time)) - to_chat(affected_mob, span_danger("Your head hurts.")) + affected_mob.apply_pain(5, BODY_ZONE_HEAD, "Your head aches.") if(DT_PROB(4.5, delta_time)) to_chat(affected_mob, span_danger("You feel a tingling sensation in your chest.")) if(DT_PROB(4.5, delta_time)) diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index aef4307f848d..488da8e633af 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -77,7 +77,7 @@ if(transformed_antag_datum) new_mob.mind.add_antag_datum(transformed_antag_datum) new_mob.name = affected_mob.real_name - new_mob.real_name = new_mob.name + new_mob.set_real_name(new_mob.name) qdel(affected_mob) /datum/disease/transformation/proc/replace_banned_player(mob/living/new_mob) // This can run well after the mob has been transferred, so need a handle on the new mob to kill it if needed. @@ -322,17 +322,17 @@ if(DT_PROB(2.5, delta_time)) affected_mob.emote("smile") if(DT_PROB(10, delta_time)) - affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) + affected_mob.reagents.add_reagent(/datum/reagent/medicine/haloperidol, 5) if(3) if(DT_PROB(2.5, delta_time)) affected_mob.emote("smile") if(DT_PROB(10, delta_time)) - affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) + affected_mob.reagents.add_reagent(/datum/reagent/medicine/haloperidol, 5) if(4) if(DT_PROB(2.5, delta_time)) affected_mob.emote("smile") if(DT_PROB(10, delta_time)) - affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) + affected_mob.reagents.add_reagent(/datum/reagent/medicine/haloperidol, 5) if(DT_PROB(1, delta_time)) var/obj/item/held_item = affected_mob.get_active_held_item() if(held_item) diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm index 58d1887cfbdc..415776642614 100644 --- a/code/datums/diseases/tuberculosis.dm +++ b/code/datums/diseases/tuberculosis.dm @@ -3,8 +3,8 @@ name = "Fungal tuberculosis" max_stages = 5 spread_text = "Airborne" - cure_text = "Spaceacillin & Convermol" - cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/c2/convermol) + cure_text = "Spaceacillin" + cures = list(/datum/reagent/medicine/spaceacillin) agent = "Fungal Tubercle bacillus Cosmosis" viable_mobtypes = list(/mob/living/carbon/human) cure_chance = 2.5 //like hell are you getting out of hell diff --git a/code/datums/dna.dm b/code/datums/dna.dm index dcd2e785e802..b17b7954cbbf 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/unique_enzymes ///Stores the hashed values of traits such as skin tones, hair style, and gender var/unique_identity - var/blood_type + var/datum/blood/blood_type ///The type of mutant race the player is if applicable (i.e. potato-man) var/datum/species/species = new /datum/species/human ///first value is mutant color //This comment is older than the average tg player @@ -152,15 +152,15 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /datum/dna/proc/check_mutation(mutation_type) return get_mutation(mutation_type) -/datum/dna/proc/remove_all_mutations(list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) - remove_mutation_group(mutations, classes, mutadone) +/datum/dna/proc/remove_all_mutations(list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), ryetalyn = FALSE) + remove_mutation_group(mutations, classes, ryetalyn) scrambled = FALSE -/datum/dna/proc/remove_mutation_group(list/group, list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), mutadone = FALSE) +/datum/dna/proc/remove_mutation_group(list/group, list/classes = list(MUT_NORMAL, MUT_EXTRA, MUT_OTHER), ryetalyn = FALSE) if(!group) return for(var/datum/mutation/human/HM in group) - if((HM.class in classes) && !(HM.mutadone_proof && mutadone)) + if((HM.class in classes) && !(HM.ryetalyn_proof && ryetalyn)) force_lose(HM) /datum/dna/proc/generate_unique_identity() @@ -227,8 +227,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) L[DNA_MUSHROOM_CAPS_BLOCK] = construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len) if(features["pod_hair"]) L[DNA_POD_HAIR_BLOCK] = construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len) - if(features["headtails"]) - L[DNA_HEADTAILS_BLOCK] = construct_block(GLOB.headtails_list.Find(features["headtails"]), GLOB.headtails_list.len) if(features["teshari_feathers"]) L[DNA_TESHARI_FEATHERS_BLOCK] = construct_block(GLOB.teshari_feathers_list.Find(features["teshari_feathers"]), GLOB.teshari_feathers_list.len) if(features["teshari_ears"]) @@ -247,6 +245,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(features["vox_snout"]) L[DNA_VOX_SNOUT_BLOCK] = construct_block(GLOB.vox_snouts_list.Find(features["vox_snout"]), GLOB.vox_snouts_list.len) + if(features["ipc_screen"]) + L[DNA_IPC_SCREEN_BLOCK] = construct_block(GLOB.ipc_screens_list.Find(features["ipc_screen"]), GLOB.ipc_screens_list.len) + if(features["ipc_antenna"]) + L[DNA_IPC_ANTENNA_BLOCK] = construct_block(GLOB.ipc_antenna_list.Find(features["DNA_IPC_ANTENNA_BLOCK"]), GLOB.ipc_antenna_list.len) + for(var/blocknum in 1 to DNA_FEATURE_BLOCKS) . += L[blocknum] || random_string(GET_UI_BLOCK_LEN(blocknum), GLOB.hex_characters) @@ -359,7 +362,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(DNA_ETHEREAL_COLOR_BLOCK) set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)) if(DNA_TAIL_BLOCK) - set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list.Find(features["tail_lizard"]), GLOB.tails_list.len)) + set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list.Find(features["tail_cat"]), GLOB.tails_list.len)) + if(DNA_LIZARD_TAIL_BLOCK) + set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list.len)) if(DNA_SNOUT_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.snouts_list.Find(features["snout"]), GLOB.snouts_list.len)) if(DNA_HORNS_BLOCK) @@ -370,18 +375,19 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) set_uni_feature_block(blocknumber, construct_block(GLOB.spines_list.Find(features["spines"]), GLOB.spines_list.len)) if(DNA_EARS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.ears_list.Find(features["ears"]), GLOB.ears_list.len)) + if(DNA_MOTH_WINGS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.moth_wings_list.Find(features["moth_wings"]), GLOB.moth_wings_list.len)) if(DNA_MOTH_ANTENNAE_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.moth_antennae_list.Find(features["moth_antennae"]), GLOB.moth_antennae_list.len)) if(DNA_MOTH_MARKINGS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len)) + if(DNA_MUSHROOM_CAPS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len)) if(DNA_POD_HAIR_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)) - if(DNA_HEADTAILS_BLOCK) - set_uni_feature_block(blocknumber, construct_block(GLOB.headtails_list.Find(features["headtails"]), GLOB.headtails_list.len)) + if(DNA_TESHARI_FEATHERS_BLOCK) set_uni_feature_block(blocknumber, construct_block(GLOB.teshari_feathers_list.Find(features["teshari_feathers"]), GLOB.teshari_feathers_list.len)) if(DNA_TESHARI_EARS_BLOCK) @@ -414,7 +420,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /datum/dna/proc/force_lose(datum/mutation/human/HM) if(holder && (HM in mutations)) set_se(0, HM) - . = HM.on_losing(holder) + . = HM.remove_from_owner() update_instability(FALSE) return @@ -492,7 +498,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) /datum/dna/stored/check_mutation(mutation_name) return -/datum/dna/stored/remove_all_mutations(list/classes, mutadone = FALSE) +/datum/dna/stored/remove_all_mutations(list/classes, ryetalyn = FALSE) return /datum/dna/stored/remove_mutation_group(list/group) @@ -525,6 +531,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) current_body_size = desired_size /mob/proc/set_species(datum/species/mrace, icon_update = 1) + SHOULD_NOT_SLEEP(TRUE) return /mob/living/brain/set_species(datum/species/mrace, icon_update = 1) @@ -546,15 +553,19 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) new_race = mrace else return - deathsound = new_race.deathsound - dna.species.on_species_loss(src, new_race, pref_load) + + if(dna.species.properly_gained) + dna.species.on_species_loss(src, new_race, pref_load) + var/datum/species/old_species = dna.species dna.species = new_race dna.species.on_species_gain(src, old_species, pref_load) + if(ishuman(src)) qdel(language_holder) var/species_holder = initial(mrace.species_language_holder) language_holder = new species_holder(src) + update_atom_languages() /mob/living/carbon/human/set_species(datum/species/mrace, icon_update = TRUE, pref_load = FALSE) @@ -675,8 +686,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.features["caps"] = GLOB.caps_list[deconstruct_block(get_uni_feature_block(features, DNA_MUSHROOM_CAPS_BLOCK), GLOB.caps_list.len)] if(dna.features["pod_hair"]) dna.features["pod_hair"] = GLOB.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), GLOB.pod_hair_list.len)] - if(dna.features["headtails"]) - dna.features["headtails"] = GLOB.headtails_list[deconstruct_block(get_uni_feature_block(features, DNA_HEADTAILS_BLOCK), GLOB.headtails_list.len)] if(dna.features["teshari_feathers"]) dna.features["teshari_feathers"] = GLOB.teshari_feathers_list[deconstruct_block(get_uni_feature_block(features, DNA_TESHARI_FEATHERS_BLOCK), GLOB.teshari_feathers_list.len)] if(dna.features["teshari_ears"]) @@ -695,6 +704,20 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(dna.features["vox_snout"]) dna.features["vox_snout"] = GLOB.vox_snouts_list[deconstruct_block(get_uni_feature_block(features, DNA_VOX_SNOUT_BLOCK), GLOB.vox_snouts_list.len)] + if(dna.features["ipc_screen"]) + dna.features["ipc_screen"] = GLOB.ipc_screens_list[deconstruct_block(get_uni_feature_block(features, DNA_IPC_SCREEN_BLOCK), GLOB.ipc_screens_list.len)] + if(dna.features["ipc_antenna"]) + dna.features["ipc_antenna"] = GLOB.ipc_antenna_list[deconstruct_block(get_uni_feature_block(features, DNA_IPC_ANTENNA_BLOCK), GLOB.ipc_antenna_list.len)] + + if(dna.features["saurian_screen"]) + dna.features["saurian_screen"] = GLOB.saurian_screens_list[deconstruct_block(get_uni_feature_block(features, DNA_SAURIAN_SCREEN_BLOCK), GLOB.saurian_screens_list.len)] + if(dna.features["saurian_tail"]) + dna.features["saurian_tail"] = GLOB.saurian_tails_list[deconstruct_block(get_uni_feature_block(features, DNA_SAURIAN_TAIL_BLOCK), GLOB.saurian_tails_list.len)] + if(dna.features["saurian_scutes"]) + dna.features["saurian_scutes"] = GLOB.saurian_scutes_list[deconstruct_block(get_uni_feature_block(features, DNA_SAURIAN_SCUTES_BLOCK), GLOB.saurian_scutes_list.len)] + if(dna.features["saurian_antenna"]) + dna.features["saurian_antenna"] = GLOB.saurian_antenna_list[deconstruct_block(get_uni_feature_block(features, DNA_SAURIAN_ANTENNA_BLOCK), GLOB.saurian_antenna_list.len)] + for(var/obj/item/organ/O as anything in cosmetic_organs) O.mutate_feature(features, src) @@ -808,7 +831,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(HM) HM.scrambled = TRUE if(HM.quality & resilient) - HM.mutadone_proof = TRUE + HM.ryetalyn_proof = TRUE return TRUE /mob/living/carbon/proc/random_mutate_unique_identity() @@ -887,7 +910,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) dna.remove_all_mutations() dna.stability = 100 if(prob(max(70-instability,0))) - switch(rand(0,10)) //not complete and utter death + switch(rand(0,7)) //not complete and utter death if(0) monkeyize() if(1) @@ -902,14 +925,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) to_chat(src, span_notice("Oh, I actually feel quite alright!")) //you thought physiology.damage_resistance = -20000 if(5) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - reagents.add_reagent(/datum/reagent/aslimetoxin, 10) - if(6) apply_status_effect(/datum/status_effect/go_away) - if(7) + if(6) to_chat(src, span_notice("Oh, I actually feel quite alright!")) ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS - if(8) + if(7) var/list/elligible_organs = list() for(var/obj/item/organ/organ as anything in processing_organs) //make sure we dont get an implant or cavity item elligible_organs += organ @@ -921,9 +941,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) O.forceMove(drop_location()) if(prob(20)) O.animate_atom_living() - if(9 to 10) - ForceContractDisease(new/datum/disease/gastrolosis()) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) else switch(rand(0,5)) if(0) @@ -935,14 +952,11 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) death() petrify(INFINITY) if(3) - if(prob(95)) - var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) - if(BP) - BP.dismember() - else - gib() + var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) + if(BP) + BP.dismember() else - set_species(/datum/species/dullahan) + gib() if(4) visible_message(span_warning("[src]'s skin melts off!"), span_boldwarning("Your skin melts off!")) spawn_gibs() diff --git a/code/datums/ductnet.dm b/code/datums/ductnet.dm deleted file mode 100644 index e4dd3959c224..000000000000 --- a/code/datums/ductnet.dm +++ /dev/null @@ -1,75 +0,0 @@ -///We handle the unity part of plumbing. We track who is connected to who. -/datum/ductnet - ///Stuff that can supply chems - var/list/suppliers = list() - ////Stuff that can take chems - var/list/demanders = list() - ///All the ducts that make this network - var/list/obj/machinery/duct/ducts = list() - - ///Max reagents we can carry per tick - var/capacity - -///Add a duct to our network -/datum/ductnet/proc/add_duct(obj/machinery/duct/D) - if(!D || (D in ducts)) - return - ducts += D - D.duct = src - -///Remove a duct from our network and commit suicide, because this is probably easier than to check who that duct was connected to and what part of us was lost -/datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting) - destroy_network(FALSE) - for(var/obj/machinery/duct/D in ducting.neighbours) - addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/duct,attempt_connect))) //needs to happen after qdel - qdel(src) - -///add a plumbing object to either demanders or suppliers -/datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir) - if(!P.can_add(src, dir)) - return FALSE - P.ducts[num2text(dir)] = src - if(dir & P.supply_connects) - suppliers += P - else if(dir & P.demand_connects) - demanders += P - return TRUE - -///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects -/datum/ductnet/proc/remove_plumber(datum/component/plumbing/P) - suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine - demanders.Remove(P) - - for(var/dir in P.ducts) - if(P.ducts[dir] == src) - P.ducts -= dir - if(!ducts.len) //there were no ducts, so it was a direct connection. we destroy ourselves since a ductnet with only one plumber and no ducts is worthless - destroy_network() - -///we combine ductnets. this occurs when someone connects to separate sets of fluid ducts -/datum/ductnet/proc/assimilate(datum/ductnet/D) - ducts.Add(D.ducts) - suppliers.Add(D.suppliers) - demanders.Add(D.demanders) - for(var/A in D.suppliers + D.demanders) - var/datum/component/plumbing/P = A - for(var/s in P.ducts) - if(P.ducts[s] != D) - continue - P.ducts[s] = src //all your ducts are belong to us - for(var/A in D.ducts) - var/obj/machinery/duct/M = A - M.duct = src //forget your old master - - D.ducts.Cut() //clear this so the other network doesnt clear the ducts along with themselves (this took the life out of me) - D.destroy_network() - -///destroy the network and tell all our ducts and plumbers we are gone -/datum/ductnet/proc/destroy_network(delete=TRUE) - for(var/A in suppliers + demanders) - remove_plumber(A) - for(var/A in ducts) - var/obj/machinery/duct/D = A - D.duct = null - if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide - qdel(src) diff --git a/code/datums/elements/ELEMENT_TEMPLATE.md b/code/datums/elements/ELEMENT_TEMPLATE.md index 333375b3508d..ce6ab0a3c6b2 100644 --- a/code/datums/elements/ELEMENT_TEMPLATE.md +++ b/code/datums/elements/ELEMENT_TEMPLATE.md @@ -5,7 +5,7 @@ See _element.dm for detailed explanations ```dm /datum/element/myelement - element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm + element_flags = ELEMENT_BESPOKE | ELEMENT_COMPLEX_DETACH | ELEMENT_DETACH_ON_HOST_DESTROY | ELEMENT_NOTAREALFLAG // code/__DEFINES/dcs/flags.dm //id_arg_index = 2 // Use with ELEMENT_BESPOKE var/list/myvar = list() diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index be1caa181a12..29ee3901cf9a 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -10,6 +10,9 @@ /** * The index of the first attach argument to consider for duplicate elements * + * All arguments from this index onwards (1 based) are hashed into the key to determine + * if this is a new unique element or one already exists + * * Is only used when flags contains [ELEMENT_BESPOKE] * * This is infinity so you must explicitly set this @@ -52,7 +55,7 @@ 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)]") + CRASH("Incompatible element [ele.type] was assigned to a [type]! args: [json_encode(args)]") /** * Finds the singleton for the element type given and detaches it from src diff --git a/code/datums/elements/art.dm b/code/datums/elements/art.dm index 8b2b80d91586..7046d481e743 100644 --- a/code/datums/elements/art.dm +++ b/code/datums/elements/art.dm @@ -1,5 +1,5 @@ /datum/element/art - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 var/impressiveness = 0 @@ -20,16 +20,12 @@ var/msg switch(impress) if(GREAT_ART to INFINITY) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) msg = "What \a [pick("masterpiece", "chef-d'oeuvre")]. So [pick("trascended", "awe-inspiring", "bewitching", "impeccable")]!" if (GOOD_ART to GREAT_ART) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgood", /datum/mood_event/artgood) msg = "[source.p_theyre(TRUE)] a [pick("respectable", "commendable", "laudable")] art piece, easy on the keen eye." if (BAD_ART to GOOD_ART) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artok", /datum/mood_event/artok) msg = "[source.p_theyre(TRUE)] fair to middling, enough to be called an \"art object\"." if (0 to BAD_ART) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) msg = "Wow, [source.p_they()] sucks." user.visible_message(span_notice("[user] stops and looks intently at [source]."), \ @@ -57,10 +53,8 @@ /datum/element/art/rev/apply_moodlet(atom/source, mob/user, impress) var/msg if(user.mind?.has_antag_datum(/datum/antagonist/rev)) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) msg = "What \a [pick("masterpiece", "chef-d'oeuvre")] [source.p_theyre()]. So [pick("subversive", "revolutionary", "unitizing", "egalitarian")]!" else - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) msg = "Wow, [source.p_they()] sucks." user.visible_message(span_notice("[user] stops to inspect [source]."), \ @@ -79,10 +73,8 @@ haters += fucking_quartermaster.title if(!(user.mind.assigned_role.title in haters)) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artgreat", /datum/mood_event/artgreat) msg = "What \a [pick("masterpiece", "chef-d'oeuvre")] [source.p_theyre()]. So [pick("relatable", "down to earth", "true", "real")]!" else - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "artbad", /datum/mood_event/artbad) msg = "Wow, [source.p_they()] sucks." user.visible_message(span_notice("[user] stops to inspect [source]."), \ diff --git a/code/datums/elements/atmos_requirements.dm b/code/datums/elements/atmos_requirements.dm index ff2ede8401b2..71f074978291 100644 --- a/code/datums/elements/atmos_requirements.dm +++ b/code/datums/elements/atmos_requirements.dm @@ -36,7 +36,7 @@ target.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) /datum/element/atmos_requirements/proc/is_breathable_atmos(mob/living/target) - if(target.pulledby && target.pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) + if(HAS_TRAIT(target, TRAIT_KILL_GRAB) && atmos_requirements["min_oxy"]) return FALSE if(!isopenturf(target.loc)) diff --git a/code/datums/elements/bane.dm b/code/datums/elements/bane.dm index 6d146d005e26..377ba8a7242e 100644 --- a/code/datums/elements/bane.dm +++ b/code/datums/elements/bane.dm @@ -1,6 +1,6 @@ /// Deals extra damage to mobs of a certain type or species. /datum/element/bane - element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE id_arg_index = 2 /// can be a mob or a species. var/target_type diff --git a/code/datums/elements/bed_tucking.dm b/code/datums/elements/bed_tucking.dm index 53a95ab2c055..569825725d38 100644 --- a/code/datums/elements/bed_tucking.dm +++ b/code/datums/elements/bed_tucking.dm @@ -1,6 +1,6 @@ /// Tucking element, for things that can be tucked into bed. /datum/element/bed_tuckable - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE 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 diff --git a/code/datums/elements/bump_click.dm b/code/datums/elements/bump_click.dm index 541586120cb5..ac8fc0d7289e 100644 --- a/code/datums/elements/bump_click.dm +++ b/code/datums/elements/bump_click.dm @@ -4,7 +4,7 @@ * Simulates a click on the attached atom when it's bumped, if the bumper and their active object meet certain criteria. */ /datum/element/bump_click - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 ///Tool behaviours to check for on the bumper's active held item before clicking the attached atom with it. var/list/tool_behaviours @@ -17,7 +17,7 @@ ///Click with any item? var/allow_any = TRUE -/datum/element/bump_click/Attach(datum/target, list/tool_behaviours, list/tool_items, allow_unarmed = FALSE, allow_combat = FALSE, allow_any = FALSE) +/datum/element/bump_click/Attach(datum/target, list/tool_behaviours, list/tool_types, allow_unarmed = FALSE, allow_combat = FALSE, allow_any = FALSE) . = ..() if(!isatom(target) || isarea(target)) diff --git a/code/datums/elements/chemical_transfer.dm b/code/datums/elements/chemical_transfer.dm index 4c8ac3267b0d..cf6f5e82f746 100644 --- a/code/datums/elements/chemical_transfer.dm +++ b/code/datums/elements/chemical_transfer.dm @@ -12,7 +12,7 @@ * victim_message uses %ATTACKER for the same. */ /datum/element/chemical_transfer - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///chance for the chemical transfer to proc. var/transfer_prob diff --git a/code/datums/elements/chewable.dm b/code/datums/elements/chewable.dm index aa2ff5db9284..d83fa859f067 100644 --- a/code/datums/elements/chewable.dm +++ b/code/datums/elements/chewable.dm @@ -52,7 +52,7 @@ var/metabolism_amount = metabolization_amount * delta_time if (!reagents.trans_to(item.loc, metabolism_amount, methods = INGEST)) - reagents.remove_any(metabolism_amount) + reagents.remove_all(metabolism_amount) /datum/element/chewable/proc/on_dropped(datum/source) SIGNAL_HANDLER diff --git a/code/datums/elements/climbable.dm b/code/datums/elements/climbable.dm index 45248eccfbc4..247b1d1863f7 100644 --- a/code/datums/elements/climbable.dm +++ b/code/datums/elements/climbable.dm @@ -1,5 +1,5 @@ /datum/element/climbable - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 ///Time it takes to climb onto the object var/climb_time = (2 SECONDS) @@ -106,11 +106,17 @@ . = step(user, dir_step) climbed_thing.set_density(TRUE) + if(istype(climbed_thing, /obj/structure/table/optable)) //This is my joker arc + var/obj/structure/table/optable/table = climbed_thing + table.get_patient() + ///Handles climbing onto the atom when you click-drag /datum/element/climbable/proc/mousedrop_receive(atom/climbed_thing, atom/movable/dropped_atom, mob/user, params) SIGNAL_HANDLER if(user == dropped_atom && isliving(dropped_atom)) var/mob/living/living_target = dropped_atom + if(living_target.combat_mode) + return if(isanimal(living_target)) var/mob/living/simple_animal/animal = dropped_atom if (!animal.dextrous) diff --git a/code/datums/elements/crackable.dm b/code/datums/elements/crackable.dm index 63a40a4edf9f..1907bea30246 100644 --- a/code/datums/elements/crackable.dm +++ b/code/datums/elements/crackable.dm @@ -1,8 +1,8 @@ /// Adds crack overlays to an object when integrity gets low /datum/element/crackable - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 - var/list/icon/crack_icons + var/list/icon/crack_appearances /// The level at which the object starts showing cracks, 1 being at full health and 0.5 being at half health var/crack_integrity = 1 @@ -11,17 +11,17 @@ if(!isobj(target)) return ELEMENT_INCOMPATIBLE src.crack_integrity = crack_integrity || src.crack_integrity - if(!crack_icons) // This is the first attachment and we need to do first time setup - crack_icons = list() + if(!crack_appearances) // This is the first attachment and we need to do first time setup + crack_appearances = list() for(var/state in crack_states) for(var/i in 1 to 36) - var/icon/new_crack_icon = icon(crack_icon, state) - new_crack_icon.Turn(i * 10) - crack_icons += new_crack_icon + var/mutable_appearance/crack = mutable_appearance(crack_icon, state) + crack.transform.Turn(i * 10) + crack_appearances += crack RegisterSignal(target, COMSIG_ATOM_INTEGRITY_CHANGED, PROC_REF(IntegrityChanged)) /datum/element/crackable/proc/IntegrityChanged(obj/source, old_value, new_value) SIGNAL_HANDLER if(new_value >= source.max_integrity * crack_integrity) return - source.AddComponent(/datum/component/cracked, crack_icons, crack_integrity) + source.AddComponent(/datum/component/cracked, crack_appearances, crack_integrity) diff --git a/code/datums/elements/curse_announcement.dm b/code/datums/elements/curse_announcement.dm index 4d8f58790527..952124cc22b2 100644 --- a/code/datums/elements/curse_announcement.dm +++ b/code/datums/elements/curse_announcement.dm @@ -6,7 +6,7 @@ * Possible improvements for the future: add an option to allow the cursed affix to be a prefix. right now only coded for suffixes */ /datum/element/curse_announcement - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///message sent on announce var/announcement_message @@ -27,9 +27,9 @@ src.new_name = new_name src.fantasy_component = WEAKREF(fantasy_component) if(cursed_item.slot_equipment_priority) //if it can equip somewhere, only go active when it is actually done - RegisterSignal(cursed_item, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(cursed_item, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped), TRUE) //https://discord.com/channels/326822144233439242/326831214667235328/1147281648791081051 else - RegisterSignal(cursed_item, COMSIG_ITEM_PICKUP, PROC_REF(on_pickup)) + RegisterSignal(cursed_item, COMSIG_ITEM_PICKUP, PROC_REF(on_pickup), TRUE) //https://discord.com/channels/326822144233439242/326831214667235328/1147281648791081051 /datum/element/curse_announcement/Detach(datum/target) . = ..() diff --git a/code/datums/elements/cursed.dm b/code/datums/elements/cursed.dm index 686ce3851396..f8742fe61b2d 100644 --- a/code/datums/elements/cursed.dm +++ b/code/datums/elements/cursed.dm @@ -4,7 +4,6 @@ *Attaching this element to something will make it float, and get a special ai controller! */ /datum/element/cursed - element_flags = ELEMENT_DETACH /datum/element/cursed/Attach(datum/target, slot) . = ..() diff --git a/code/datums/elements/decals/_decal.dm b/code/datums/elements/decals/_decal.dm index 7285cfb6f2d3..2434089c6207 100644 --- a/code/datums/elements/decals/_decal.dm +++ b/code/datums/elements/decals/_decal.dm @@ -81,7 +81,7 @@ smoothing = _smoothing RegisterSignal(target,COMSIG_ATOM_UPDATE_OVERLAYS,PROC_REF(apply_overlay), TRUE) - if(target.flags_1 & INITIALIZED_1) + if(target.initialized) target.update_appearance(UPDATE_OVERLAYS) //could use some queuing here now maybe. else RegisterSignal(target,COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE,PROC_REF(late_update_icon), TRUE) @@ -116,6 +116,7 @@ _layer, _dir ) + pic.plane = _plane pic.color = _color pic.alpha = _alpha return TRUE @@ -132,7 +133,8 @@ /datum/element/decal/proc/late_update_icon(atom/source) SIGNAL_HANDLER - if(source && istype(source)) + if(istype(source) && !(source.flags_1 & DECAL_INIT_UPDATE_EXPERIENCED_1)) + source.flags_1 |= DECAL_INIT_UPDATE_EXPERIENCED_1 // I am so sorry, but it saves like 80ms I gotta source.update_appearance(UPDATE_OVERLAYS) UnregisterSignal(source, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) diff --git a/code/datums/elements/decals/blood.dm b/code/datums/elements/decals/blood.dm index 2af4158b0cdd..49160441752f 100644 --- a/code/datums/elements/decals/blood.dm +++ b/code/datums/elements/decals/blood.dm @@ -17,29 +17,26 @@ _icon = 'icons/effects/blood.dmi' if(!_icon_state) _icon_state = "itemblood" - var/icon = I.icon - var/icon_state = 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 + if(!_color) + _color = COLOR_HUMAN_BLOOD + + var/item_icon = I.icon + var/item_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]" + var/index = "[REF(item_icon)]-[item_icon_state]" pic = blood_splatter_appearances[index] if(!pic) - var/icon/blood_splatter_icon = icon(I.icon, I.icon_state, , 1) + var/icon/blood_splatter_icon = icon(I.icon, I.icon_state, null, 1) 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, I.icon_state) + pic.color = _color blood_splatter_appearances[index] = pic 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 + override.Insert(1, "blood-stained") diff --git a/code/datums/elements/delete_on_drop.dm b/code/datums/elements/delete_on_drop.dm index b3db3bf60844..afb39f97fb94 100644 --- a/code/datums/elements/delete_on_drop.dm +++ b/code/datums/elements/delete_on_drop.dm @@ -2,7 +2,6 @@ * Attaches to an item, if that item is dropped on the floor delete it */ /datum/element/delete_on_drop - element_flags = ELEMENT_DETACH var/list/myvar = list() /datum/element/delete_on_drop/Attach(datum/target) diff --git a/code/datums/elements/deliver_first.dm b/code/datums/elements/deliver_first.dm index e4f5399c33e9..4b1d430df74a 100644 --- a/code/datums/elements/deliver_first.dm +++ b/code/datums/elements/deliver_first.dm @@ -9,7 +9,7 @@ #define DENY_SOUND_COOLDOWN (2 SECONDS) /datum/element/deliver_first - element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///typepath of the area we will be allowed to be opened in var/goal_area_type diff --git a/code/datums/elements/drag_pickup.dm b/code/datums/elements/drag_pickup.dm index c33216d43e70..48264c308d82 100644 --- a/code/datums/elements/drag_pickup.dm +++ b/code/datums/elements/drag_pickup.dm @@ -4,7 +4,6 @@ * Used for paper bins. */ /datum/element/drag_pickup - element_flags = ELEMENT_DETACH /datum/element/drag_pickup/Attach(datum/target) if(!ismovable(target)) diff --git a/code/datums/elements/easily_fragmented.dm b/code/datums/elements/easily_fragmented.dm index 4eb5d09f2000..f5e8e244d8a3 100644 --- a/code/datums/elements/easily_fragmented.dm +++ b/code/datums/elements/easily_fragmented.dm @@ -4,7 +4,7 @@ */ /datum/element/easily_fragmented - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 var/break_chance diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 68466d67e26e..ce178a0a5baa 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -80,14 +80,14 @@ var/actual_chance = embed_chance var/penetrative_behaviour = 1 //Keep this above 1, as it is a multiplier for the pen_mod for determining actual embed chance. - if(weapon.weak_against_armour) - penetrative_behaviour = ARMOR_WEAKENED_MULTIPLIER + if(weapon.weak_against_armor) + penetrative_behaviour = weapon.weak_against_armor if(throwingdatum?.speed > weapon.throw_speed) actual_chance += (throwingdatum.speed - weapon.throw_speed) * EMBED_CHANCE_SPEED_BONUS if(!weapon.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign - var/armor = max(victim.run_armor_check(hit_zone, BULLET, silent=TRUE), victim.run_armor_check(hit_zone, BOMB, silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved + var/armor = max(victim.run_armor_check(hit_zone, PUNCTURE, silent=TRUE), victim.run_armor_check(hit_zone, BOMB, silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved if(armor) // we only care about armor penetration if there's actually armor to penetrate var/pen_mod = -(armor * penetrative_behaviour) // if our shrapnel is weak into armor, then we restore our armor to the full value. @@ -100,7 +100,7 @@ return var/obj/item/bodypart/limb = victim.get_bodypart(hit_zone) || pick(victim.bodyparts) - victim.AddComponent(/datum/component/embedded,\ + limb.AddComponent(/datum/component/embedded,\ weapon,\ throwingdatum,\ part = limb,\ diff --git a/code/datums/elements/empprotection.dm b/code/datums/elements/empprotection.dm index 8d5d798c3cb8..0c8912ec3ed3 100644 --- a/code/datums/elements/empprotection.dm +++ b/code/datums/elements/empprotection.dm @@ -1,5 +1,5 @@ /datum/element/empprotection - element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 var/flags = NONE diff --git a/code/datums/elements/eyestab.dm b/code/datums/elements/eyestab.dm index 2006c11c4530..b830a85a739e 100644 --- a/code/datums/elements/eyestab.dm +++ b/code/datums/elements/eyestab.dm @@ -3,7 +3,7 @@ /// An element that lets you stab people in the eyes when targeting them /datum/element/eyestab - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 /// The amount of damage to do per eyestab @@ -34,7 +34,7 @@ perform_eyestab(source, target, user) - return COMPONENT_SKIP_ATTACK + return COMPONENT_SKIP_ATTACK_STEP /datum/element/eyestab/proc/perform_eyestab(obj/item/item, mob/living/target, mob/living/user) var/obj/item/bodypart/target_limb = target.get_bodypart(BODY_ZONE_HEAD) @@ -56,7 +56,7 @@ item.add_fingerprint(user) - playsound(item, item.hitsound, 30, TRUE, -1) + playsound(item, item.get_hitsound(), 30, TRUE, -1) user.do_attack_animation(target) @@ -76,8 +76,6 @@ else target.take_bodypart_damage(damage) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "eye_stab", /datum/mood_event/eye_stab) - log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])") var/obj/item/organ/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES) diff --git a/code/datums/elements/food/venue_price.dm b/code/datums/elements/food/venue_price.dm index 37a6bed81693..6a0df12cab34 100644 --- a/code/datums/elements/food/venue_price.dm +++ b/code/datums/elements/food/venue_price.dm @@ -21,6 +21,6 @@ var/datum/venue/venue_to_pay = sold_to.ai_controller?.blackboard[BB_CUSTOMER_ATTENDING_VENUE] - new /obj/item/holochip(get_turf(container), venue_price) + SSeconomy.spawn_cash_for_amount(venue_price, get_turf(sold_to)) venue_to_pay.total_income += venue_price playsound(get_turf(container), 'sound/effects/cashregister.ogg', 60, TRUE) diff --git a/code/datums/elements/footstep.dm b/code/datums/elements/footstep.dm index 1857ac199b47..969094644fde 100644 --- a/code/datums/elements/footstep.dm +++ b/code/datums/elements/footstep.dm @@ -64,126 +64,169 @@ if(!istype(turf)) return - if(!turf.footstep || source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(source, TRAIT_IMMOBILIZED)) + if(source.buckled || source.throwing || source.movement_type & (VENTCRAWLING | FLYING) || HAS_TRAIT(source, TRAIT_IMMOBILIZED) || CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL)) return if(source.body_position == LYING_DOWN) //play crawling sound if we're lying - playsound(turf, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1, vary = sound_vary) + if(turf.footstep) + playsound(turf, 'sound/effects/footstep/crawl1.ogg', 15 * volume, falloff_distance = 1, vary = sound_vary) return if(iscarbon(source)) var/mob/living/carbon/carbon_source = source if(!carbon_source.get_bodypart(BODY_ZONE_L_LEG) && !carbon_source.get_bodypart(BODY_ZONE_R_LEG)) return - if(carbon_source.m_intent == MOVE_INTENT_WALK) - return// stealth + steps_for_living[source] += 1 var/steps = steps_for_living[source] - if(steps >= 6) + if(steps >= 8) steps_for_living[source] = 0 steps = 0 - if(steps % 2) + if(floor(steps) % 2) return if(steps != 0 && !source.has_gravity()) // don't need to step as often when you hop around return - return turf -/datum/element/footstep/proc/play_simplestep(mob/living/source) + . = list( + FOOTSTEP_MOB_SHOE = turf.footstep, + FOOTSTEP_MOB_BAREFOOT = turf.barefootstep, + FOOTSTEP_MOB_HEAVY = turf.heavyfootstep, + FOOTSTEP_MOB_CLAW = turf.clawfootstep, + STEP_SOUND_PRIORITY = STEP_SOUND_NO_PRIORITY + ) + + var/overriden = SEND_SIGNAL(turf, COMSIG_TURF_PREPARE_STEP_SOUND, .) & FOOTSTEP_OVERRIDEN + //The turf has no footstep sound (e.g. open space) and none of the objects on that turf (e.g. catwalks) overrides it + if(!overriden && isnull(turf.footstep)) + return null + return . + +/datum/element/footstep/proc/play_simplestep(mob/living/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - if (SHOULD_DISABLE_FOOTSTEPS(source)) + if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || source.moving_diagonally == SECOND_DIAG_STEP) return - var/turf/open/source_loc = prepare_step(source) - if(!source_loc) + var/list/prepared_steps = prepare_step(source) + if(isnull(prepared_steps)) return + if(isfile(footstep_sounds) || istext(footstep_sounds)) - playsound(source_loc, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary) + playsound(source.loc, footstep_sounds, volume, falloff_distance = 1, vary = sound_vary) return - var/turf_footstep - switch(footstep_type) - if(FOOTSTEP_MOB_CLAW) - turf_footstep = source_loc.clawfootstep - if(FOOTSTEP_MOB_BAREFOOT) - turf_footstep = source_loc.barefootstep - if(FOOTSTEP_MOB_HEAVY) - turf_footstep = source_loc.heavyfootstep - if(FOOTSTEP_MOB_SHOE) - turf_footstep = source_loc.footstep - if(!turf_footstep) + + var/turf_footstep = prepared_steps[footstep_type] + if(isnull(turf_footstep) || !footstep_sounds[turf_footstep]) return - playsound(source_loc, pick(footstep_sounds[turf_footstep][1]), footstep_sounds[turf_footstep][2] * volume, TRUE, footstep_sounds[turf_footstep][3] + e_range, falloff_distance = 1, vary = sound_vary) + + playsound( + source.loc, + pick(footstep_sounds[turf_footstep][1]), + footstep_sounds[turf_footstep][2] * volume, + TRUE, + footstep_sounds[turf_footstep][3] + e_range, + falloff_distance = 1, + vary = sound_vary + ) /datum/element/footstep/proc/play_humanstep(mob/living/carbon/human/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - if (SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change) + if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || !momentum_change || source.moving_diagonally == SECOND_DIAG_STEP) return var/volume_multiplier = 1 var/range_adjustment = 0 - if(HAS_TRAIT(source, TRAIT_LIGHT_STEP)) + if((source.m_intent == MOVE_INTENT_WALK) || HAS_TRAIT(source, TRAIT_LIGHT_STEP)) volume_multiplier = 0.6 range_adjustment = -2 - var/turf/open/source_loc = prepare_step(source) - if(!source_loc) + var/list/prepared_steps = prepare_step(source) + if(isnull(prepared_steps)) return - //cache for sanic speed (lists are references anyways) - var/static/list/footstep_sounds = GLOB.footstep + var/footstep_sounds = GLOB.footstep + ///list returned by playsound() filled by client mobs who heard the footstep. given to play_fov_effect() var/list/heard_clients - if ((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET) + if((source.wear_suit?.body_parts_covered | source.w_uniform?.body_parts_covered | source.shoes?.body_parts_covered) & FEET) // we are wearing shoes - heard_clients = playsound( - source_loc, - pick(footstep_sounds[source_loc.footstep][1]), - footstep_sounds[source_loc.footstep][2] * volume * volume_multiplier, - TRUE, - footstep_sounds[source_loc.footstep][3] + e_range + range_adjustment, - falloff_distance = 1, - vary = sound_vary) + var/shoestep_type = prepared_steps[FOOTSTEP_MOB_SHOE] + if(!isnull(shoestep_type) && footstep_sounds[shoestep_type]) // shoestep type can be null + heard_clients = playsound( + source.loc, + pick(footstep_sounds[shoestep_type][1]), + footstep_sounds[shoestep_type][2] * volume * volume_multiplier, + TRUE, + footstep_sounds[shoestep_type][3] + e_range + range_adjustment, + falloff_distance = 1, + vary = sound_vary + ) else + // we are barefoot + if(source.dna.species.special_step_sounds) heard_clients = playsound( - source_loc, + source.loc, pick(source.dna.species.special_step_sounds), 50, TRUE, falloff_distance = 1, - vary = sound_vary) + vary = sound_vary + ) else - var/static/list/bare_footstep_sounds = GLOB.barefootstep - - heard_clients = playsound( - source_loc, - pick(bare_footstep_sounds[source_loc.barefootstep][1]), - bare_footstep_sounds[source_loc.barefootstep][2] * volume * volume_multiplier, - TRUE, - bare_footstep_sounds[source_loc.barefootstep][3] + e_range + range_adjustment, - falloff_distance = 1, - vary = sound_vary) + var/obj/item/bodypart/leg/right_leg = source.get_bodypart(BODY_ZONE_R_LEG) + var/obj/item/bodypart/leg/left_leg = source.get_bodypart(BODY_ZONE_L_LEG) + var/barefoot_type = right_leg?.barefoot_step_type + if(!barefoot_type || left_leg && prob(50)) + barefoot_type = left_leg.barefoot_step_type + + var/list/turf_sound_type = prepared_steps[barefoot_type] + var/list/sound_pool + switch(barefoot_type) + if(FOOTSTEP_MOB_CLAW) + sound_pool = GLOB.clawfootstep + if(FOOTSTEP_MOB_BAREFOOT) + sound_pool = GLOB.barefootstep + if(FOOTSTEP_MOB_HEAVY) + sound_pool = GLOB.heavyfootstep + if(FOOTSTEP_MOB_SHOE) + sound_pool = GLOB.footstep + + if(!isnull(sound_pool) && !isnull(barefoot_type) && sound_pool[turf_sound_type]) + heard_clients = playsound( + source.loc, + pick(sound_pool[turf_sound_type][1]), + sound_pool[turf_sound_type][2] * volume * volume_multiplier, + TRUE, + sound_pool[turf_sound_type][3] + e_range + range_adjustment, + falloff_distance = 1, + vary = sound_vary + ) if(heard_clients) play_fov_effect(source, 5, "footstep", direction, ignore_self = TRUE, override_list = heard_clients) ///Prepares a footstep for machine walking -/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source) +/datum/element/footstep/proc/play_simplestep_machine(atom/movable/source, atom/oldloc, direction, forced, list/old_locs, momentum_change) SIGNAL_HANDLER - if (SHOULD_DISABLE_FOOTSTEPS(source)) + if (forced || SHOULD_DISABLE_FOOTSTEPS(source) || source.moving_diagonally == SECOND_DIAG_STEP) return var/turf/open/source_loc = get_turf(source) if(!istype(source_loc)) return + + if(CHECK_MOVE_LOOP_FLAGS(source, MOVEMENT_LOOP_OUTSIDE_CONTROL)) + return + playsound(source_loc, footstep_sounds, 50, falloff_distance = 1, vary = sound_vary) #undef SHOULD_DISABLE_FOOTSTEPS diff --git a/code/datums/elements/footstep_override.dm b/code/datums/elements/footstep_override.dm new file mode 100644 index 000000000000..4aec7b51399f --- /dev/null +++ b/code/datums/elements/footstep_override.dm @@ -0,0 +1,81 @@ +///When attached, the footstep sound played by the footstep element will be replaced by this one's +/datum/element/footstep_override + element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + id_arg_index = 2 + ///The sound played for movables with claw step sound type. + var/clawfootstep + ///The sound played for movables with barefoot step sound type. + var/barefootstep + ///The sound played for movables with heavy step sound type. + var/heavyfootstep + ///The sound played for movables with shoed step sound type. + var/footstep + ///The priority this element has in relation to other elements of the same type attached to other movables on the same turf. + var/priority + /** + * A list of turfs occupied by the movables this element is attached to. + * Needed so it stops listening the turf's signals ONLY when it has no movable with the element. + */ + var/list/occupied_turfs = list() + +/datum/element/footstep_override/Attach(atom/movable/target, clawfootstep = FOOTSTEP_HARD_CLAW, barefootstep = FOOTSTEP_HARD_BAREFOOT, heavyfootstep = FOOTSTEP_GENERIC_HEAVY, footstep = FOOTSTEP_FLOOR, priority = STEP_SOUND_NO_PRIORITY) + . = ..() + if(!ismovable(target)) + return ELEMENT_INCOMPATIBLE + + src.clawfootstep = clawfootstep + src.barefootstep = barefootstep + src.heavyfootstep = heavyfootstep + src.footstep = footstep + src.priority = priority + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) + if(isturf(target.loc)) + occupy_turf(target, target.loc) + +/datum/element/footstep_override/Detach(atom/movable/source) + if(isturf(source.loc)) + vacate_turf(source, source.loc) + return ..() + +/datum/element/footstep_override/proc/on_moved(atom/movable/source, atom/oldloc) + SIGNAL_HANDLER + if(isturf(oldloc)) + vacate_turf(source, oldloc) + if(isturf(source.loc)) + occupy_turf(source, source.loc) + +/** + * Adds the movable to the list of movables with the element occupying the turf. + * If the turf was not on the list of occupied turfs before, a signal will be registered + * to it. + */ +/datum/element/footstep_override/proc/occupy_turf(atom/movable/movable, turf/location) + if(occupied_turfs[location]) + occupied_turfs[location] |= movable + return + occupied_turfs[location] = list(movable) + RegisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND, PROC_REF(prepare_steps)) + +/** + * Removes the movable from the list of movables with the element occupying the turf. + * If the turf is no longer occupied, it'll be removed from the list, and the signal + * unregistered from it + */ +/datum/element/footstep_override/proc/vacate_turf(atom/movable/movable, turf/location) + LAZYREMOVE(occupied_turfs[location], movable) + if(!occupied_turfs[location]) + occupied_turfs -= location + UnregisterSignal(location, COMSIG_TURF_PREPARE_STEP_SOUND) + +///Changes the sound types to be played if the element priority is higher than the one in the steps list. +/datum/element/footstep_override/proc/prepare_steps(turf/source, list/steps) + SIGNAL_HANDLER + if(steps[STEP_SOUND_PRIORITY] > priority) + return + steps[FOOTSTEP_MOB_SHOE] = footstep + steps[FOOTSTEP_MOB_BAREFOOT] = barefootstep + steps[FOOTSTEP_MOB_HEAVY] = heavyfootstep + steps[FOOTSTEP_MOB_CLAW] = clawfootstep + steps[STEP_SOUND_PRIORITY] = priority + return FOOTSTEP_OVERRIDEN diff --git a/code/datums/elements/forced_gravity.dm b/code/datums/elements/forced_gravity.dm index e6733542866f..329578162709 100644 --- a/code/datums/elements/forced_gravity.dm +++ b/code/datums/elements/forced_gravity.dm @@ -11,6 +11,10 @@ if(!isatom(target)) return ELEMENT_INCOMPATIBLE + var/our_ref = REF(src) + if(HAS_TRAIT_FROM(target, TRAIT_FORCED_GRAVITY, our_ref)) + return + src.gravity = gravity src.ignore_turf_gravity = ignore_turf_gravity @@ -18,7 +22,7 @@ if(isturf(target)) RegisterSignal(target, COMSIG_TURF_HAS_GRAVITY, PROC_REF(turf_gravity_check)) - ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, REF(src)) + ADD_TRAIT(target, TRAIT_FORCED_GRAVITY, our_ref) /datum/element/forced_gravity/Detach(datum/source) . = ..() @@ -38,4 +42,4 @@ /datum/element/forced_gravity/proc/turf_gravity_check(datum/source, atom/checker, list/gravs) SIGNAL_HANDLER - return gravity_check(null, source, gravs) + gravity_check(null, source, gravs) diff --git a/code/datums/elements/frozen.dm b/code/datums/elements/frozen.dm index 51f879839c47..00eee9a1b62f 100644 --- a/code/datums/elements/frozen.dm +++ b/code/datums/elements/frozen.dm @@ -2,7 +2,6 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 ///simple element to handle frozen obj's /datum/element/frozen - element_flags = ELEMENT_DETACH /datum/element/frozen/Attach(datum/target) . = ..() @@ -13,6 +12,10 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 if(target_obj.obj_flags & FREEZE_PROOF) return ELEMENT_INCOMPATIBLE + if(HAS_TRAIT(target_obj, TRAIT_FROZEN)) + return ELEMENT_INCOMPATIBLE + + ADD_TRAIT(target_obj, TRAIT_FROZEN, ELEMENT_TRAIT(type)) target_obj.name = "frozen [target_obj.name]" target_obj.add_atom_colour(GLOB.freon_color_matrix, TEMPORARY_COLOUR_PRIORITY) target_obj.alpha -= 25 @@ -23,6 +26,7 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0 /datum/element/frozen/Detach(datum/source, ...) var/obj/obj_source = source + REMOVE_TRAIT(obj_source, TRAIT_FROZEN, ELEMENT_TRAIT(type)) obj_source.name = replacetext(obj_source.name, "frozen ", "") obj_source.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, GLOB.freon_color_matrix) obj_source.alpha += 25 diff --git a/code/datums/elements/haunted.dm b/code/datums/elements/haunted.dm index 1f0c3570a532..d2f3c8530e46 100644 --- a/code/datums/elements/haunted.dm +++ b/code/datums/elements/haunted.dm @@ -1,6 +1,5 @@ ///Attaching this element to something will make it float, get a special ai controller, and gives it a spooky outline. /datum/element/haunted - element_flags = ELEMENT_DETACH /datum/element/haunted/Attach(datum/target) . = ..() diff --git a/code/datums/elements/honkspam.dm b/code/datums/elements/honkspam.dm index 05f4592e8ac9..9b4c649ca1ce 100644 --- a/code/datums/elements/honkspam.dm +++ b/code/datums/elements/honkspam.dm @@ -1,6 +1,5 @@ /// Attachable to items. Plays a bikehorn sound whenever attack_self is called (with a cooldown). /datum/element/honkspam - element_flags = ELEMENT_DETACH /datum/element/honkspam/Attach(datum/target) . = ..() diff --git a/code/datums/elements/human_biter.dm b/code/datums/elements/human_biter.dm new file mode 100644 index 000000000000..be46eacf34a0 --- /dev/null +++ b/code/datums/elements/human_biter.dm @@ -0,0 +1,28 @@ +/// Allows carbons with heads to attempt to bite mobs if attacking with cuffed hands / missing arms +/datum/element/human_biter + +/datum/element/human_biter/Attach(datum/target) + . = ..() + if(!iscarbon(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(try_bite)) + +/datum/element/human_biter/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, COMSIG_LIVING_EARLY_UNARMED_ATTACK) + +/datum/element/human_biter/proc/try_bite(mob/living/carbon/human/source, atom/target, proximity_flag, modifiers) + SIGNAL_HANDLER + + if(!source.Adjacent(target) || !source.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK) || !isliving(target)) + return NONE + + // If we can attack like normal, just go ahead and do that + if(source.can_unarmed_attack()) + return NONE + + if(target.attack_paw(source, modifiers)) + return COMPONENT_CANCEL_ATTACK_CHAIN // bite successful! + + return COMPONENT_SKIP_ATTACK_STEP // we will fail anyways if we try to attack normally, so skip the rest diff --git a/code/datums/elements/kneecapping.dm b/code/datums/elements/kneecapping.dm index 3440ee80f4db..e9789a5897bc 100644 --- a/code/datums/elements/kneecapping.dm +++ b/code/datums/elements/kneecapping.dm @@ -15,7 +15,6 @@ * Passing all the checks will cancel the entire attack chain. */ /datum/element/kneecapping - element_flags = ELEMENT_DETACH /datum/element/kneecapping/Attach(datum/target) if(!isitem(target)) @@ -83,6 +82,5 @@ attacker.visible_message(span_warning("[attacker] swings [attacker.p_their()] [weapon] at [target]'s kneecaps!"), span_danger("You swing \the [weapon] at [target]'s kneecaps!")) leg.create_wound_easy(/datum/wound/puncture/gaping, 30) log_combat(attacker, target, "broke the kneecaps of", weapon) - target.update_damage_overlays() attacker.do_attack_animation(target, used_item = weapon) - playsound(source = get_turf(weapon), soundin = weapon.hitsound, vol = weapon.get_clamped_volume(), vary = TRUE) + playsound(source = get_turf(weapon), soundin = weapon.get_hitsound(), vol = weapon.get_clamped_volume(), vary = TRUE) diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm index dbf30ba2a386..1bb7eb99c009 100644 --- a/code/datums/elements/kneejerk.dm +++ b/code/datums/elements/kneejerk.dm @@ -1,6 +1,5 @@ /// An element which enables certain items to tap people on their knees to measure brain health /datum/element/kneejerk - element_flags = ELEMENT_DETACH /datum/element/kneejerk/Attach(datum/target) . = ..() @@ -23,7 +22,7 @@ if((user.zone_selected == BODY_ZONE_L_LEG || user.zone_selected == BODY_ZONE_R_LEG) && LAZYACCESS(modifiers, RIGHT_CLICK) && target.buckled) tap_knee(source, target, user) - return COMPONENT_SKIP_ATTACK + return COMPONENT_SKIP_ATTACK_STEP /datum/element/kneejerk/proc/tap_knee(obj/item/item, mob/living/target, mob/living/user) var/selected_zone = user.zone_selected diff --git a/code/datums/elements/light_eaten.dm b/code/datums/elements/light_eaten.dm index 8d1d1337bb8c..5f293d0c42b5 100644 --- a/code/datums/elements/light_eaten.dm +++ b/code/datums/elements/light_eaten.dm @@ -2,7 +2,7 @@ * Makes anything that it attaches to incapable of producing light */ /datum/element/light_eaten - element_flags = ELEMENT_DETACH + element_flags = ELEMENT_DETACH // Detach for turfs /datum/element/light_eaten/Attach(atom/target) if(!isatom(target)) @@ -17,7 +17,7 @@ /// Because the lighting system does not like movable lights getting set_light() called. switch(atom_target.light_system) - if(STATIC_LIGHT) + if(COMPLEX_LIGHT) target.set_light(0, 0, null, FALSE) else target.set_light_power(0) diff --git a/code/datums/elements/light_eater.dm b/code/datums/elements/light_eater.dm index 963d42729ccd..4026f3f9d753 100644 --- a/code/datums/elements/light_eater.dm +++ b/code/datums/elements/light_eater.dm @@ -4,7 +4,6 @@ * The temporary equivalent is [/datum/component/light_eater] */ /datum/element/light_eater - element_flags = ELEMENT_DETACH /datum/element/light_eater/Attach(datum/target) if(isatom(target)) @@ -128,12 +127,11 @@ * - [owner][/mob/living/carbon/human]: The mob that blocked the target with the source * - [hitby][/atom/movable]: The movable that was blocked by the owner with the source * - attack_text: The text tring that will be used to report that the target was blocked - * - final_block_chance: The probability of blocking the target with the source * - attack_type: The type of attack that was blocked */ -/datum/element/light_eater/proc/on_hit_reaction(obj/item/source, mob/living/carbon/human/owner, atom/movable/hitby, attack_text, final_block_chance, damage, attack_type) +/datum/element/light_eater/proc/on_hit_reaction(obj/item/source, mob/living/carbon/human/owner, atom/movable/hitby, attack_text, damage, attack_type, block_success) SIGNAL_HANDLER - if(prob(final_block_chance)) + if(block_success) eat_lights(hitby, source) return NONE diff --git a/code/datums/elements/mirage_border.dm b/code/datums/elements/mirage_border.dm new file mode 100644 index 000000000000..954a94141582 --- /dev/null +++ b/code/datums/elements/mirage_border.dm @@ -0,0 +1,53 @@ +/** + * Creates a mirage effect allowing you to see around the world border, by adding the opposite side to its vis_contents. + */ +/datum/element/mirage_border + +/datum/element/mirage_border/Attach(datum/target, turf/target_turf, direction, range=world.view) + . = ..() + if(!isturf(target)) + return ELEMENT_INCOMPATIBLE + #ifdef TESTING + // This is a highly used proc, and these error states never occur, so limit it to testing. + // If something goes wrong it will runtime anyway. + if(!target_turf || !istype(target_turf) || !direction) + stack_trace("[type] improperly attached with the following args: target=\[[target_turf]\], direction=\[[direction]\], range=\[[range]\]") + return ELEMENT_INCOMPATIBLE + #endif + + var/atom/movable/mirage_holder/holder = new(target) + + var/x = target_turf.x + var/y = target_turf.y + var/z = clamp(target_turf.z, 1, world.maxz) + var/turf/southwest = locate(clamp(x - (direction & WEST ? range : 0), 1, world.maxx), clamp(y - (direction & SOUTH ? range : 0), 1, world.maxy), z) + var/turf/northeast = locate(clamp(x + (direction & EAST ? range : 0), 1, world.maxx), clamp(y + (direction & NORTH ? range : 0), 1, world.maxy), z) + holder.vis_contents += block(southwest, northeast) + if(direction & SOUTH) + holder.pixel_y -= world.icon_size * range + if(direction & WEST) + holder.pixel_x -= world.icon_size * range + +/datum/element/mirage_border/Detach(atom/movable/target) + . = ..() + var/atom/movable/mirage_holder/held = locate() in target.contents + if(held) + qdel(held) + +INITIALIZE_IMMEDIATE(/atom/movable/mirage_holder) +// Using /atom/movable because this is a heavily used path +/atom/movable/mirage_holder + name = "Mirage holder" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/atom/movable/mirage_holder/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + initialized = TRUE + return INITIALIZE_HINT_NORMAL + +/atom/movable/mirage_holder/Destroy(force) + SHOULD_CALL_PARENT(FALSE) + loc = null + return QDEL_HINT_QUEUE diff --git a/code/datums/elements/movement_turf_changer.dm b/code/datums/elements/movement_turf_changer.dm index 34593dd7a65b..a5de3d2356d3 100644 --- a/code/datums/elements/movement_turf_changer.dm +++ b/code/datums/elements/movement_turf_changer.dm @@ -4,7 +4,7 @@ * Used for moonicorns! */ /datum/element/movement_turf_changer - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///Path of the turf added on top var/turf_type diff --git a/code/datums/elements/movetype_handler.dm b/code/datums/elements/movetype_handler.dm index e05235b0e86f..e6edc32232a7 100644 --- a/code/datums/elements/movetype_handler.dm +++ b/code/datums/elements/movetype_handler.dm @@ -69,9 +69,7 @@ source.movement_type &= ~flag if((old_state & (FLOATING|FLYING)) && !(source.movement_type & (FLOATING|FLYING))) stop_floating(source) - var/turf/pitfall = source.loc //Things that don't fly fall in open space. - if(istype(pitfall)) - pitfall.zFall(source) + source.zFall() SEND_SIGNAL(source, COMSIG_MOVETYPE_FLAG_DISABLED, flag, old_state) /// Called when the TRAIT_NO_FLOATING_ANIM trait is added to the movable. Stops it from bobbing up and down. diff --git a/code/datums/elements/nerfed_pulling.dm b/code/datums/elements/nerfed_pulling.dm deleted file mode 100644 index c192e04f5c2d..000000000000 --- a/code/datums/elements/nerfed_pulling.dm +++ /dev/null @@ -1,53 +0,0 @@ -/// This living will be slower when pulling/moving anything in the given typecache -/datum/element/nerfed_pulling - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH - id_arg_index = 2 - - /// The typecache of things that shouldn't be easily movable - var/list/typecache - -/datum/element/nerfed_pulling/Attach(datum/target, list/typecache) - . = ..() - - if (!isliving(target)) - return ELEMENT_INCOMPATIBLE - - src.typecache = typecache - - RegisterSignal(target, COMSIG_LIVING_PUSHING_MOVABLE, PROC_REF(on_push_movable)) - RegisterSignal(target, COMSIG_LIVING_UPDATING_PULL_MOVESPEED, PROC_REF(on_updating_pull_movespeed)) - -/datum/element/nerfed_pulling/Detach(mob/living/source) - source.remove_movespeed_modifier(/datum/movespeed_modifier/nerfed_bump) - source.remove_movespeed_modifier(/datum/movespeed_modifier/nerfed_pull) - - UnregisterSignal(source, list(COMSIG_LIVING_PUSHING_MOVABLE, COMSIG_LIVING_UPDATING_PULL_MOVESPEED)) - - return ..() - -/datum/element/nerfed_pulling/proc/on_push_movable(mob/living/source, atom/movable/being_pushed) - SIGNAL_HANDLER - - if (!will_slow_down(being_pushed)) - return - - source.add_movespeed_modifier(/datum/movespeed_modifier/nerfed_bump) - addtimer(CALLBACK(source, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/nerfed_bump), 1 SECONDS, TIMER_OVERRIDE | TIMER_UNIQUE) - -/datum/element/nerfed_pulling/proc/on_updating_pull_movespeed(mob/living/source) - SIGNAL_HANDLER - - if (!will_slow_down(source.pulling)) - source.remove_movespeed_modifier(/datum/movespeed_modifier/nerfed_pull) - return - - source.add_movespeed_modifier(/datum/movespeed_modifier/nerfed_pull) - -/datum/element/nerfed_pulling/proc/will_slow_down(datum/input) - return !isnull(input) && typecache[input.type] - -/datum/movespeed_modifier/nerfed_pull - multiplicative_slowdown = 5.5 - -/datum/movespeed_modifier/nerfed_bump - multiplicative_slowdown = 5.5 diff --git a/code/datums/elements/obj_regen.dm b/code/datums/elements/obj_regen.dm index 7ecfffb08139..7b9c724ebb16 100644 --- a/code/datums/elements/obj_regen.dm +++ b/code/datums/elements/obj_regen.dm @@ -55,8 +55,7 @@ var/list/cached_run = currentrun if(!length(cached_run)) if(!length(processing)) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL return var/cached_rate = rate @@ -77,7 +76,6 @@ if(!regen_obj.repair_damage(regen_obj.max_integrity * cached_rate)) processing -= regen_obj if(!length(processing)) - STOP_PROCESSING(SSobj, src) return PROCESS_KILL if(CHECK_TICK) diff --git a/code/datums/elements/openspace_item_click_handler.dm b/code/datums/elements/openspace_item_click_handler.dm index 9f8db60858ac..c20751196443 100644 --- a/code/datums/elements/openspace_item_click_handler.dm +++ b/code/datums/elements/openspace_item_click_handler.dm @@ -3,7 +3,6 @@ * having to pixelhunt for portions not occupied by object or mob visuals. */ /datum/element/openspace_item_click_handler - element_flags = ELEMENT_DETACH /datum/element/openspace_item_click_handler/Attach(datum/target) . = ..() diff --git a/code/datums/elements/pet_bonus.dm b/code/datums/elements/pet_bonus.dm index 6fa6bebc799a..62a4daaab1a6 100644 --- a/code/datums/elements/pet_bonus.dm +++ b/code/datums/elements/pet_bonus.dm @@ -5,21 +5,18 @@ * I may have been able to make this work for carbons, but it would have been interjecting on some help mode interactions anyways. */ /datum/element/pet_bonus - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///optional cute message to send when you pet your pet! var/emote_message - ///actual moodlet given, defaults to the pet animal one - var/moodlet -/datum/element/pet_bonus/Attach(datum/target, emote_message, moodlet = /datum/mood_event/pet_animal) +/datum/element/pet_bonus/Attach(datum/target, emote_message) . = ..() if(!isliving(target)) return ELEMENT_INCOMPATIBLE src.emote_message = emote_message - src.moodlet = moodlet RegisterSignal(target, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand)) /datum/element/pet_bonus/Detach(datum/target) @@ -35,4 +32,3 @@ new /obj/effect/temp_visual/heart(pet.loc) if(emote_message && prob(33)) pet.manual_emote(emote_message) - SEND_SIGNAL(petter, COMSIG_ADD_MOOD_EVENT, pet, moodlet, pet) diff --git a/code/datums/elements/prevent_attacking_of_types.dm b/code/datums/elements/prevent_attacking_of_types.dm index 8c3b65bdbada..d4fb750e2224 100644 --- a/code/datums/elements/prevent_attacking_of_types.dm +++ b/code/datums/elements/prevent_attacking_of_types.dm @@ -1,7 +1,7 @@ /// This hostile will not be able to attack a given typecache, and will receive /// a balloon alert when it tries to. /datum/element/prevent_attacking_of_types - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 /// The typecache of things this hostile can't attack diff --git a/code/datums/elements/projectile_shield.dm b/code/datums/elements/projectile_shield.dm deleted file mode 100644 index 2e99ec756e4c..000000000000 --- a/code/datums/elements/projectile_shield.dm +++ /dev/null @@ -1,29 +0,0 @@ -///Bullet shield element, spawns an anti-toolbox shield when hit by a bullet. -/datum/element/projectile_shield/Attach(datum/target) - . = ..() - if(!ismob(target)) - return ELEMENT_INCOMPATIBLE - - RegisterSignal(target, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) - -/datum/element/projectile_shield/Detach(datum/target) - . = ..() - UnregisterSignal(target, COMSIG_ATOM_BULLET_ACT) - -/datum/element/projectile_shield/proc/on_bullet_act(datum/source, obj/projectile/proj) - SIGNAL_HANDLER - - var/mob/movable_mob = source - var/turf/current_turf = movable_mob.loc - if(!isturf(current_turf)) - return - if(movable_mob.stat == DEAD) - return - - var/obj/effect/temp_visual/at_shield/new_atshield = new /obj/effect/temp_visual/at_shield(current_turf, movable_mob) - - var/random_x = rand(-32, 32) - new_atshield.pixel_x += random_x - - var/random_y = rand(0, 72) - new_atshield.pixel_y += random_y diff --git a/code/datums/elements/radiation_protected_clothing.dm b/code/datums/elements/radiation_protected_clothing.dm index a759923a0890..e0ebb351eae5 100644 --- a/code/datums/elements/radiation_protected_clothing.dm +++ b/code/datums/elements/radiation_protected_clothing.dm @@ -2,7 +2,6 @@ /// Adds the TRAIT_RADIATION_PROTECTED_CLOTHING trait, as well as adding an /// extra bit to the examine descrpition. /datum/element/radiation_protected_clothing - element_flags = ELEMENT_DETACH /datum/element/radiation_protected_clothing/Attach(datum/target) . = ..() diff --git a/code/datums/elements/ranged_attacks.dm b/code/datums/elements/ranged_attacks.dm index d430bb1a0c4e..6b45ff9dfd22 100644 --- a/code/datums/elements/ranged_attacks.dm +++ b/code/datums/elements/ranged_attacks.dm @@ -1,6 +1,6 @@ ///This proc is used by basic mobs to give them a simple ranged attack! In theory this could be extended to /datum/element/ranged_attacks - element_flags = ELEMENT_DETACH | ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE id_arg_index = 2 var/casingtype = /obj/item/ammo_casing/glockroach var/projectilesound = 'sound/weapons/gun/pistol/shot.ogg' diff --git a/code/datums/elements/ridable.dm b/code/datums/elements/ridable.dm index 5aac3290c0b4..be2593dee91e 100644 --- a/code/datums/elements/ridable.dm +++ b/code/datums/elements/ridable.dm @@ -7,7 +7,7 @@ * just having the variables, behavior, and procs be standardized is still a big improvement. */ /datum/element/ridable - element_flags = ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH id_arg_index = 2 /// The specific riding component subtype we're loading our instructions from, don't leave this as default please! @@ -83,7 +83,7 @@ inhand.rider = riding_target_override inhand.parent = AM for(var/obj/item/I in user.held_items) // delete any hand items like slappers that could still totally be used to grab on - if((I.obj_flags & HAND_ITEM)) + if((I.item_flags & HAND_ITEM)) qdel(I) // this would be put_in_hands() if it didn't have the chance to sleep, since this proc gets called from a signal handler that relies on what this returns diff --git a/code/datums/elements/rust.dm b/code/datums/elements/rust.dm index 01b4e2496dd7..c4905ba4bf57 100644 --- a/code/datums/elements/rust.dm +++ b/code/datums/elements/rust.dm @@ -3,7 +3,7 @@ * The overlay can be specified in new as the first paramter; if not set it defaults to rust_overlay's rust_default */ /datum/element/rust - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 /// The rust image itself, since the icon and icon state are only used as an argument var/image/rust_overlay diff --git a/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm index 10d5ac6b8276..3591d7834b65 100644 --- a/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm +++ b/code/datums/elements/screentips/contextual_screentip_item_typechecks.dm @@ -2,7 +2,7 @@ /// A "Type B" interaction. /// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance. /datum/element/contextual_screentip_item_typechecks - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 /// Map of item paths to contexts to usages diff --git a/code/datums/elements/screentips/contextual_screentip_tools.dm b/code/datums/elements/screentips/contextual_screentip_tools.dm index a6c358ef2f63..a205b9a47ec4 100644 --- a/code/datums/elements/screentips/contextual_screentip_tools.dm +++ b/code/datums/elements/screentips/contextual_screentip_tools.dm @@ -2,7 +2,7 @@ /// A "Type B" interaction. /// This stacks with other contextual screentip elements, though you may want to register the signal/flag manually at that point for performance. /datum/element/contextual_screentip_tools - element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 /// Map of tool behaviors to contexts to usages diff --git a/code/datums/elements/series.dm b/code/datums/elements/series.dm index 88cbd8bc184c..0b34b24ae551 100644 --- a/code/datums/elements/series.dm +++ b/code/datums/elements/series.dm @@ -5,7 +5,7 @@ * used for mechas and rare collectable hats, should totally be used for way more ;) */ /datum/element/series - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE | ELEMENT_DETACH // Detach for turfs id_arg_index = 2 var/list/subtype_list var/series_name diff --git a/code/datums/elements/simple_flying.dm b/code/datums/elements/simple_flying.dm index 6b991998e388..263942b7a5e3 100644 --- a/code/datums/elements/simple_flying.dm +++ b/code/datums/elements/simple_flying.dm @@ -5,7 +5,6 @@ * Note: works for carbons and above, but please do something better. humans have wings got dangit! */ /datum/element/simple_flying - element_flags = ELEMENT_DETACH /datum/element/simple_flying/Attach(datum/target) . = ..() diff --git a/code/datums/elements/skittish.dm b/code/datums/elements/skittish.dm index 2bb2bc61c56f..b3152224beec 100644 --- a/code/datums/elements/skittish.dm +++ b/code/datums/elements/skittish.dm @@ -3,7 +3,6 @@ */ /datum/element/skittish - element_flags = ELEMENT_DETACH /datum/element/skittish/Attach(datum/target) . = ..() diff --git a/code/datums/elements/smell.dm b/code/datums/elements/smell.dm index 021c15facbd5..c1a1fa0833a9 100644 --- a/code/datums/elements/smell.dm +++ b/code/datums/elements/smell.dm @@ -1,6 +1,7 @@ /datum/component/smell + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS ///Smells with a higher intensity than the mob's last smell will be smelt instantly - var/intensity = 2 + var/intensity = INTENSITY_NORMAL var/cooldown = 4 MINUTES //Scent, stank, stench, etc @@ -10,7 +11,10 @@ ///The radius of turfs to affect var/radius = 1 -/datum/component/smell/Initialize(descriptor, scent, radius, duration) + /// Timer ID for qdeling ourself, if needed + var/duration_timer + +/datum/component/smell/Initialize(intensity, descriptor, scent, radius, duration) if(!isatom(parent)) return COMPONENT_INCOMPATIBLE @@ -20,74 +24,107 @@ src.radius = radius if(duration) - QDEL_IN(src, duration) + duration_timer = QDEL_IN_STOPPABLE(src, duration) + cooldown = (6 - intensity) MINUTES START_PROCESSING(SSprocessing, src) + RegisterSignal(parent, COMSIG_COMPONENT_CLEAN_ACT, PROC_REF(qdelme)) -/datum/component/smell/Destroy(force, silent) - STOP_PROCESSING(SSprocessing, src) - return ..() - -/datum/component/smell/process() - var/turf/T = get_turf(parent:drop_location()) - if(!T?.unsafe_return_air()?.total_moles) - return - - for(var/mob/living/L as mob in range(radius, parent)) - try_print_to(L) - -/datum/component/smell/proc/try_print_to(mob/living/user) - if(!user.can_smell(intensity)) +/datum/component/smell/InheritComponent(datum/component/C, i_am_original, intensity, descriptor, scent, radius, duration) + if(src.intensity < intensity) return - if(issilicon(user)) - to_chat(user, span_notice("Your sensors pick up the presence of [scent] in the air.")) - else - to_chat(user, span_notice("The [descriptor] of [scent] fills the air.")) - user.last_smell_intensity = intensity - COOLDOWN_START(user, smell_time, cooldown) - -/datum/component/smell/subtle - cooldown = 5 MINUTES - intensity = 1 + src.intensity = intensity + src.descriptor = descriptor + src.scent = scent + if(radius) + src.radius = radius -/datum/component/smell/subtle/try_print_to(mob/living/user) - if(!user.can_smell(intensity)) - return - if(issilicon(user)) - to_chat(user, span_notice("Your sensors detect trace amounts of [scent] in the air.")) - else - to_chat(user, span_subtle("The subtle [descriptor] of [scent] tickles your nose...")) + if(duration) + if(duration_timer) + deltimer(duration_timer) + duration_timer = QDEL_IN_STOPPABLE(src, duration) - user.last_smell_intensity = intensity - COOLDOWN_START(user, smell_time, cooldown) + cooldown = (6 - intensity) MINUTES -/datum/component/smell/strong - cooldown = 3 MINUTES - intensity = 3 +/datum/component/smell/Destroy(force, silent) + STOP_PROCESSING(SSprocessing, src) + deltimer(duration_timer) + return ..() -/datum/component/smell/strong/try_print_to(mob/living/user) - if(!user.can_smell(intensity)) +/datum/component/smell/process() + var/turf/T = get_turf(parent) + if(!T?.unsafe_return_air()?.total_moles) return - if(issilicon(user)) - to_chat(user, span_warning("Your sensors pick up an intense concentration of [scent].")) - else - to_chat(user, span_warning("The unmistakable [descriptor] of [scent] bombards your nostrils.")) - user.last_smell_intensity = intensity - COOLDOWN_START(user, smell_time, cooldown) + for(var/mob/living/L in (radius > 4) ? SSspatial_grid.orthogonal_range_search(T, RECURSIVE_CONTENTS_CLIENT_MOBS, radius) : range(radius, T)) + var/datum/component/smell/S = L.next_smell?.resolve() + if(QDELETED(S) || S.intensity < intensity || get_dist(get_turf(L), get_turf(S.parent)) > S.radius) + L.next_smell = WEAKREF(src) + +/datum/component/smell/proc/print_to(mob/living/user) + switch(intensity) + if(1) + if(issilicon(user)) + to_chat(user, span_notice("Your sensors detect trace amounts of [scent] in the air.")) + else + to_chat(user, span_subtle("The subtle [descriptor] of [scent] tickles your nose...")) + + if(2) + if(issilicon(user)) + to_chat(user, span_obviousnotice("Your sensors pick up the presence of [scent] in the air.")) + else + to_chat(user, span_obviousnotice("The [descriptor] of [scent] fills the air.")) + if(3) + if(issilicon(user)) + to_chat(user, span_warning("Your sensors pick up an intense concentration of [scent].")) + else + to_chat(user, span_warning("The unmistakable [descriptor] of [scent] bombards your nostrils.")) + if(4) + if(issilicon(user)) + to_chat(user, span_alert("ALERT! Your sensors pick up an overwhelming concentration of [scent].")) + else + to_chat(user, span_alert("The overwhelming [descriptor] of [scent] assaults your senses. You stifle a gag.")) + + +/datum/component/smell/proc/qdelme() + SIGNAL_HANDLER + qdel(src) + + +/// An object for placing smells in the world that aren't attached to a physical object +/obj/effect/abstract/smell_holder + icon = 'icons/effects/landmarks_static.dmi' + icon_state = "x4" + invisibility = INVISIBILITY_MAXIMUM + + var/intensity + var/descriptor + var/scent + var/radius + var/duration + +/obj/effect/abstract/smell_holder/Initialize(mapload, intensity, descriptor, scent, radius, duration) + . = ..() + if(!mapload && duration < 1) + stack_trace("Something tried to spawn an infinite duration smell object outside of mapping, don't do this.") + return INITIALIZE_HINT_QDEL + + AddComponent(\ + /datum/component/smell, \ + src.intensity || intensity, \ + src.descriptor || descriptor, \ + src.scent || scent, \ + src.radius || radius, \ + ) -/datum/component/smell/overpowering - cooldown = 2 MINUTES - intensity = 4 + if(duration) + QDEL_IN(src, duration) -/datum/component/smell/overpowering/try_print_to(mob/living/user) - if(!user.can_smell(intensity)) - return - if(issilicon(user)) - to_chat(user, span_warning("ALERT! Your sensors pick up an overwhelming concentration of [scent].")) - else - to_chat(user, span_warning("The overwhelming [descriptor] of [scent] assaults your senses. You stifle a gag.")) +/obj/effect/abstract/smell_holder/detective_office + intensity = INTENSITY_SUBTLE + descriptor = SCENT_HAZE + scent = "a time long since passed" + radius = 2 - user.last_smell_intensity = intensity - COOLDOWN_START(user, smell_time, cooldown) + duration = 15 MINUTES diff --git a/code/datums/elements/soft_landing.dm b/code/datums/elements/soft_landing.dm index 56fedf6b3741..e1665f61bbdb 100644 --- a/code/datums/elements/soft_landing.dm +++ b/code/datums/elements/soft_landing.dm @@ -4,7 +4,7 @@ * Non bespoke element (1 in existence) that makes objs provide a soft landing when you fall on them! */ /datum/element/soft_landing - element_flags = ELEMENT_DETACH + element_flags = ELEMENT_DETACH // Detach for turfs /datum/element/soft_landing/Attach(datum/target) . = ..() diff --git a/code/datums/elements/spooky.dm b/code/datums/elements/spooky.dm index 3a6115a8147a..a436b3cbf5d5 100644 --- a/code/datums/elements/spooky.dm +++ b/code/datums/elements/spooky.dm @@ -1,5 +1,5 @@ /datum/element/spooky - element_flags = ELEMENT_DETACH|ELEMENT_BESPOKE + element_flags = ELEMENT_BESPOKE id_arg_index = 2 var/too_spooky = TRUE //will it spawn a new instrument? @@ -37,7 +37,7 @@ H.Paralyze(15) //zombies can't resist the doot C.set_timed_status_effect(70 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) C.set_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) - 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))) + if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) C.stamina.adjust(-25) //boneless humanoids don't lose the will to live to_chat(C, "DOOT") INVOKE_ASYNC(src, PROC_REF(spectral_change), H) @@ -47,7 +47,7 @@ C.set_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) /datum/element/spooky/proc/spectral_change(mob/living/carbon/human/H, mob/user) - if((H.stamina.current < 105) && (!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))) + if((H.stamina.current < 105) && (!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly))) H.Paralyze(20) H.set_species(/datum/species/skeleton) H.visible_message(span_warning("[H] has given up on life as a mortal.")) diff --git a/code/datums/elements/strippable.dm b/code/datums/elements/strippable.dm index 837f6c28a740..6f60ba2353ea 100644 --- a/code/datums/elements/strippable.dm +++ b/code/datums/elements/strippable.dm @@ -105,7 +105,7 @@ if(ishuman(source)) var/mob/living/carbon/human/victim_human = source if(victim_human.key && !victim_human.client) // AKA braindead - if(victim_human.stat <= SOFT_CRIT && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) + if(victim_human.stat != CONSCIOUS && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) var/list/new_entry = list(list(user.name, "tried equipping you with [equipping]", world.time)) LAZYADD(victim_human.afk_thefts, new_entry) @@ -165,7 +165,7 @@ if(ishuman(source)) var/mob/living/carbon/human/victim_human = source if(victim_human.key && !victim_human.client) // AKA braindead - if(victim_human.stat <= SOFT_CRIT && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) + if(victim_human.stat != CONSCIOUS && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) var/list/new_entry = list(list(user.name, "tried unequipping your [item.name]", world.time)) LAZYADD(victim_human.afk_thefts, new_entry) diff --git a/code/datums/elements/swabbable.dm b/code/datums/elements/swabbable.dm deleted file mode 100644 index 03c328e7cfbc..000000000000 --- a/code/datums/elements/swabbable.dm +++ /dev/null @@ -1,50 +0,0 @@ -/*! - -This element is used in vat growing to allow for the object to be - -*/ -/datum/element/swabable - element_flags = ELEMENT_BESPOKE - id_arg_index = 2 - ///The define of the cell_line list to use - var/cell_line_define - ///The define of the cell_virus list to use - var/virus_define - ///Amount of cell lines on a single sample - var/cell_line_amount - ///The chance the sample will be infected with a virus. - var/virus_chance - -///Listens for the swab signal and then generate a sample based on pre-determined lists that are saved as GLOBs. this allows us to have very few swabbable element instances. -/datum/element/swabable/Attach(datum/target, cell_line_define, virus_define, cell_line_amount = 1, virus_chance = 10) - . = ..() - if(!isatom(target) || isarea(target)) - return ELEMENT_INCOMPATIBLE - - RegisterSignal(target, COMSIG_SWAB_FOR_SAMPLES, PROC_REF(GetSwabbed)) - - src.cell_line_define = cell_line_define - src.virus_define = virus_define - src.cell_line_amount = cell_line_amount - src.virus_chance = virus_chance - -///Stops listening to the swab signal; you can no longer be swabbed. -/datum/element/swabable/Detach(datum/source) - . = ..() - if(!isatom(source) || isarea(source)) - return ELEMENT_INCOMPATIBLE - UnregisterSignal(source, COMSIG_SWAB_FOR_SAMPLES) - -///Ran when the parent is swabbed by an object that can swab that type of obj. The list is sent by ref, which means the thing which sent the signal will still have the updated list. -/datum/element/swabable/proc/GetSwabbed(datum/source, list/mutable_results) - SIGNAL_HANDLER - . = COMPONENT_SWAB_FOUND //Return this so the swabbing component knows hes a good boy and found something that needs swabbing. - - LAZYADD(mutable_results, GenerateSample()) - Detach(source) - -///Generates a /datum/biological_sample -/datum/element/swabable/proc/GenerateSample() - var/datum/biological_sample/generated_sample = new - generated_sample.GenerateSample(cell_line_define, virus_define, cell_line_amount, virus_chance) - return generated_sample diff --git a/code/datums/elements/tenacious.dm b/code/datums/elements/tenacious.dm index feb74a579d7b..12e2c819965c 100644 --- a/code/datums/elements/tenacious.dm +++ b/code/datums/elements/tenacious.dm @@ -4,30 +4,33 @@ * Used by sparring sect! */ /datum/element/tenacious - element_flags = ELEMENT_DETACH /datum/element/tenacious/Attach(datum/target) . = ..() if(!ishuman(target)) return COMPONENT_INCOMPATIBLE - var/mob/living/carbon/human/valid_target = target - on_stat_change(valid_target, new_stat = valid_target.stat) //immediately try adding movement bonus if they're in soft crit - RegisterSignal(target, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) + + if(HAS_TRAIT(target, TRAIT_SOFT_CRITICAL_CONDITION)) + on_softcrit_gain(target) + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SOFT_CRITICAL_CONDITION), PROC_REF(on_softcrit_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SOFT_CRITICAL_CONDITION), PROC_REF(on_softcrit_loss)) ADD_TRAIT(target, TRAIT_TENACIOUS, ELEMENT_TRAIT(type)) /datum/element/tenacious/Detach(datum/target) UnregisterSignal(target, COMSIG_MOB_STATCHANGE) REMOVE_TRAIT(target, TRAIT_TENACIOUS, ELEMENT_TRAIT(type)) + on_softcrit_loss(target) return ..() ///signal called by the stat of the target changing -/datum/element/tenacious/proc/on_stat_change(mob/living/carbon/human/target, new_stat) +/datum/element/tenacious/proc/on_softcrit_gain(mob/living/carbon/human/target) SIGNAL_HANDLER + to_chat(target, span_danger("Your tenacity kicks in!")) + target.add_movespeed_modifier(/datum/movespeed_modifier/tenacious) - if(new_stat == SOFT_CRIT) - target.balloon_alert(target, "your tenacity kicks in") - target.add_movespeed_modifier(/datum/movespeed_modifier/tenacious) - else - target.balloon_alert(target, "your tenacity wears off") - target.remove_movespeed_modifier(/datum/movespeed_modifier/tenacious) +/datum/element/tenacious/proc/on_softcrit_loss(mob/living/carbon/target) + SIGNAL_HANDLER + to_chat(target, span_danger("Your tenacity wears off!")) + target.remove_movespeed_modifier(/datum/movespeed_modifier/tenacious) diff --git a/code/datums/elements/tool_flash.dm b/code/datums/elements/tool_flash.dm index c6e35d7d2226..2808e02f9e4f 100644 --- a/code/datums/elements/tool_flash.dm +++ b/code/datums/elements/tool_flash.dm @@ -34,4 +34,4 @@ SIGNAL_HANDLER if(user && get_dist(get_turf(source), get_turf(user)) <= 1) - user.flash_act(min(flash_strength,1)) + user.flash_act(flash_strength) diff --git a/code/datums/elements/update_icon_blocker.dm b/code/datums/elements/update_icon_blocker.dm index 674b314ec9c1..9f73ba704fa5 100644 --- a/code/datums/elements/update_icon_blocker.dm +++ b/code/datums/elements/update_icon_blocker.dm @@ -1,12 +1,22 @@ //Prevents calling anything in update_icon() like update_icon_state() or update_overlays() -/datum/element/update_icon_blocker/Attach(datum/target) +/datum/element/update_icon_blocker + element_flags = ELEMENT_BESPOKE + id_arg_index = 2 + + /// Set of COMSIG_ATOM_UPDATE_ICON to return. See [signals_atom_main.dm] + var/blocking_flags + +/datum/element/update_icon_blocker/Attach(datum/target, blocking_flags = COMSIG_ATOM_NO_UPDATE_ICON_STATE | COMSIG_ATOM_NO_UPDATE_OVERLAYS) . = ..() - if(!istype(target, /atom)) + if(!isatom(target)) return ELEMENT_INCOMPATIBLE + if(!blocking_flags) + CRASH("Attempted to block icon updates with a null blocking_flags argument. Why?") + src.blocking_flags = blocking_flags RegisterSignal(target, COMSIG_ATOM_UPDATE_ICON, PROC_REF(block_update_icon)) /datum/element/update_icon_blocker/proc/block_update_icon() SIGNAL_HANDLER - return COMSIG_ATOM_NO_UPDATE_ICON_STATE | COMSIG_ATOM_NO_UPDATE_OVERLAYS + return blocking_flags diff --git a/code/datums/elements/venomous.dm b/code/datums/elements/venomous.dm index a0e92f2feb9b..a1b5fc763739 100644 --- a/code/datums/elements/venomous.dm +++ b/code/datums/elements/venomous.dm @@ -4,7 +4,7 @@ * Used for spiders and bees! */ /datum/element/venomous - element_flags = ELEMENT_BESPOKE|ELEMENT_DETACH + element_flags = ELEMENT_BESPOKE id_arg_index = 2 ///Path of the reagent added var/poison_type diff --git a/code/datums/elements/waddling.dm b/code/datums/elements/waddling.dm index eff201455d85..2ee27987e5b9 100644 --- a/code/datums/elements/waddling.dm +++ b/code/datums/elements/waddling.dm @@ -4,28 +4,31 @@ . = ..() if(!ismovable(target)) return ELEMENT_INCOMPATIBLE - if(isliving(target)) - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(LivingWaddle)) - else - RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) + + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(Waddle)) /datum/element/waddling/Detach(datum/source) . = ..() UnregisterSignal(source, COMSIG_MOVABLE_MOVED) -/datum/element/waddling/proc/LivingWaddle(mob/living/target) +/datum/element/waddling/proc/Waddle(atom/movable/moved, atom/oldloc, direction, forced) SIGNAL_HANDLER - if(target.incapacitated() || target.body_position == LYING_DOWN) + if(forced || CHECK_MOVE_LOOP_FLAGS(moved, MOVEMENT_LOOP_OUTSIDE_CONTROL)) return - Waddle(target) + if(isliving(moved)) + var/mob/living/living_moved = moved + if (living_moved.incapacitated() || living_moved.body_position == LYING_DOWN) + return -/datum/element/waddling/proc/Waddle(atom/movable/target) - SIGNAL_HANDLER + waddle_animation(moved) - animate(target, pixel_z = 4, time = 0) - var/prev_trans = matrix(target.transform) - animate(pixel_z = 0, transform = turn(target.transform, pick(-12, 0, 12)), time=2) - animate(pixel_z = 0, transform = prev_trans, time = 0) +/datum/element/waddling/proc/waddle_animation(atom/movable/target) + SIGNAL_HANDLER + for(var/atom/movable/AM as anything in target.get_associated_mimics() + target) + animate(AM, pixel_z = 4, time = 0) + var/prev_trans = matrix(AM.transform) + animate(pixel_z = 0, transform = turn(AM.transform, pick(-12, 0, 12)), time=2) + animate(pixel_z = 0, transform = prev_trans, time = 0) diff --git a/code/datums/elements/wall_engraver.dm b/code/datums/elements/wall_engraver.dm deleted file mode 100644 index c3ca321430f4..000000000000 --- a/code/datums/elements/wall_engraver.dm +++ /dev/null @@ -1,80 +0,0 @@ -/// An element that lets you engrave walls when right click is used -/datum/element/wall_engraver - element_flags = ELEMENT_DETACH - -/datum/element/wall_engraver/Attach(datum/target) - . = ..() - - if (!isitem(target)) - return ELEMENT_INCOMPATIBLE - - RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) - RegisterSignal(target, COMSIG_ITEM_PRE_ATTACK_SECONDARY, PROC_REF(on_item_pre_attack_secondary)) - -/datum/element/wall_engraver/Detach(datum/source) - . = ..() - UnregisterSignal(source, COMSIG_PARENT_EXAMINE) - UnregisterSignal(source, COMSIG_ITEM_PRE_ATTACK_SECONDARY) - -///signal called on parent being examined -/datum/element/wall_engraver/proc/on_examine(datum/source, mob/user, list/examine_list) - SIGNAL_HANDLER - examine_list += span_notice("You can engrave some walls with your secondary attack if you can think of something interesting to engrave.") - -///signal called on parent being used to right click attack something -/datum/element/wall_engraver/proc/on_item_pre_attack_secondary(datum/source, atom/target, mob/living/user) - SIGNAL_HANDLER - - INVOKE_ASYNC(src, PROC_REF(try_chisel), source, target, user) - - return COMPONENT_CANCEL_ATTACK_CHAIN - -/datum/element/wall_engraver/proc/try_chisel(obj/item/item, turf/closed/wall, mob/living/user) - if(!istype(wall) || !user.mind) - return - if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) - user.balloon_alert(user, "wall cannot be engraved!") - return - if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) - user.balloon_alert(user, "wall has already been engraved!") - return - if(!user.mind?.memories?.len) - user.balloon_alert(user, "nothing memorable to engrave!") - return - var/datum/memory/memory_to_engrave = user.mind.select_memory("engrave") - if(!memory_to_engrave) - return - if(!user.Adjacent(wall)) - return - item.add_fingerprint(user) - playsound(item, item.hitsound, 30, TRUE, -1) - user.do_attack_animation(wall) - user.balloon_alert(user, "engraving wall...") - if(!do_after(user, wall, 5 SECONDS, DO_PUBLIC, display = item)) - return - user.balloon_alert(user, "wall engraved") - user.do_attack_animation(wall) - - var/do_persistent_save = TRUE - if(memory_to_engrave.memory_flags & MEMORY_FLAG_NOPERSISTENCE) - do_persistent_save = FALSE - - var/engraved_story = memory_to_engrave.generate_story(STORY_ENGRAVING, STORY_FLAG_DATED) - - if(!engraved_story) - CRASH("Tried to submit a memory with an invalid story [memory_to_engrave]") - - wall.AddComponent(/datum/component/engraved, memory_to_engrave.generate_story(STORY_ENGRAVING, STORY_FLAG_DATED), persistent_save = do_persistent_save, story_value = memory_to_engrave.story_value) - memory_to_engrave.memory_flags |= MEMORY_FLAG_ALREADY_USED - //while someone just engraved a story "worth engraving" we should add this to SSpersistence for a possible prison tattoo - - if(do_persistent_save) - var/list/tattoo_entry = list() - - var/tattoo_story = memory_to_engrave.generate_story(STORY_TATTOO) - - if(tattoo_story) - CRASH("Tried to submit a memory with an invalid story [memory_to_engrave]") - - tattoo_entry["story"] = tattoo_story - SSpersistence.prison_tattoos_to_save += list(tattoo_entry) diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 582591e6a1ef..68b6629cb73a 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -31,6 +31,8 @@ var/message_AI = "" /// Message displayed if the user is a monkey. var/message_monkey = "" + /// Message displayed if the user is an IPC. + var/message_ipc = "" /// Message to display if the user is a simple_animal. var/message_simple = "" /// Message with %t at the end to allow adding params to the message, like for mobs doing an emote relatively to something else. @@ -118,14 +120,12 @@ if(!ghost.client || isnewplayer(ghost)) continue if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null))) - ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") + ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") if(emote_type == EMOTE_AUDIBLE) //PARIAH EDIT - // Original: user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE) user.audible_message(msg, deaf_message = "You see how [user][space][msg]", audible_message_flags = EMOTE_MESSAGE, separation = space) else - // Original: user.visible_message(msg, blind_message = "You hear how [user] [msg]", visible_message_flags = EMOTE_MESSAGE) user.visible_message(msg, blind_message = "You hear how [user][space][msg]", visible_message_flags = EMOTE_MESSAGE, separation = space) //PARIAH EDIT END SEND_SIGNAL(user, COMSIG_MOB_EMOTED(key)) @@ -205,10 +205,10 @@ * * Returns the new message, or msg directly, if no change was needed. */ -/datum/emote/proc/select_message_type(mob/user, msg, intentional) +/datum/emote/proc/select_message_type(mob/living/user, msg, intentional) // Basically, we don't care that the others can use datum variables, because they're never going to change. . = msg - if(!muzzle_ignore && user.is_muzzled() && emote_type == EMOTE_AUDIBLE) + if(!muzzle_ignore && user.has_mouth() && user.is_muzzled() && emote_type == EMOTE_AUDIBLE) return "makes a [pick("strong ", "weak ", "")]noise." if(user.mind && user.mind.miming && message_mime) . = message_mime @@ -216,7 +216,7 @@ . = message_alien else if(islarva(user) && message_larva) . = message_larva - else if(iscyborg(user) && message_robot) + else if((iscyborg(user) || isipc(user)) && message_robot) . = message_robot else if(isAI(user) && message_AI) . = message_AI @@ -224,6 +224,8 @@ . = message_monkey else if(isanimal(user) && message_simple) . = message_simple + else if(isipc(user) && message_ipc) + . = message_ipc /** * Replaces the %t in the message in message_param by params. @@ -263,9 +265,10 @@ if(!intentional) return FALSE switch(user.stat) - if(SOFT_CRIT) - to_chat(user, span_warning("You cannot [key] while in a critical condition!")) - if(UNCONSCIOUS, HARD_CRIT) + if(CONSCIOUS) + if(HAS_TRAIT(user, TRAIT_SOFT_CRITICAL_CONDITION)) + to_chat(user, span_warning("You cannot [key] while in a critical condition!")) + if(UNCONSCIOUS) to_chat(user, span_warning("You cannot [key] while unconscious!")) if(DEAD) to_chat(user, span_warning("You cannot [key] while dead!")) @@ -314,14 +317,15 @@ log_message(text, LOG_EMOTE) - var/ghost_text = "[src] [text]" + var/ghost_text = "[src] [text]" var/origin_turf = get_turf(src) if(client) - for(var/mob/ghost as anything in GLOB.dead_mob_list) + for(var/mob/ghost as anything in GLOB.dead_mob_list - viewers(origin_turf)) if(!ghost.client || isnewplayer(ghost)) continue - if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT && !(ghost in viewers(origin_turf, null))) + + if(ghost.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) ghost.show_message("[FOLLOW_LINK(ghost, src)] [ghost_text]") visible_message(text, visible_message_flags = EMOTE_MESSAGE) diff --git a/code/datums/forensics.dm b/code/datums/forensics.dm new file mode 100644 index 000000000000..3597d80cf1ec --- /dev/null +++ b/code/datums/forensics.dm @@ -0,0 +1,290 @@ +/datum/forensics + /// The object we belong to. This can be null. + var/atom/parent + /// A k:v list of fingerprint : partial_or_full_print + var/list/fingerprints + /// A k:v list of dna : blood_type + var/list/blood_DNA + /// A k:v list of fibers : amount + var/list/fibers + /// A k:v FLAT list of residues + var/list/gunshot_residue + /// A list of DNA + var/list/trace_DNA + /// A k:v list of ckey : thing. For admins. + var/list/admin_log + +/datum/forensics/New(parent) + src.parent = parent + +/datum/forensics/Destroy(force, ...) + parent = null + return ..() + +/// Adds blood dna. Returns TRUE if the blood dna list expanded. +/datum/forensics/proc/add_blood_DNA(list/dna) + if(!length(dna)) + return + var/old_len = length(blood_DNA) + LAZYINITLIST(blood_DNA) + for(var/dna_hash in dna) + blood_DNA[dna_hash] = dna[dna_hash] + + check_blood() + return old_len < length(blood_DNA) + +/datum/forensics/proc/add_trace_DNA(list/dna) + if(!length(dna)) + return + LAZYINITLIST(trace_DNA) + trace_DNA |= dna + +/// Adds the fingerprint of M to our fingerprint list +/datum/forensics/proc/add_fingerprint(mob/living/M, ignoregloves = FALSE) + if(!isliving(M)) + if(!iscameramob(M)) + return + if(isaicamera(M)) + var/mob/camera/ai_eye/ai_camera = M + if(!ai_camera.ai) + return + M = ai_camera.ai + + log_touch(M) + + if(!ishuman(M)) + return + + var/mob/living/carbon/human/H = M + parent?.add_fibers(H) + var/obj/item/gloves = H.gloves + + if(gloves) //Check if the gloves (if any) hide fingerprints + if(!(gloves.body_parts_covered & HANDS) || HAS_TRAIT(gloves, TRAIT_FINGERPRINT_PASSTHROUGH) || HAS_TRAIT(H, TRAIT_FINGERPRINT_PASSTHROUGH)) + ignoregloves = TRUE + + if(!ignoregloves) + H.gloves.add_fingerprint(H, TRUE) //ignoregloves = 1 to avoid infinite loop. + return + + add_partial_print(H.get_fingerprints(ignoregloves, H.get_active_hand())) + return TRUE + +/datum/forensics/proc/add_partial_print(full_print) + PRIVATE_PROC(TRUE) + LAZYINITLIST(fingerprints) + + if(!fingerprints[full_print]) + fingerprints[full_print] = stars(full_print, rand(0, 70)) //Initial touch, not leaving much evidence the first time. + return + + switch(max(stringcount(fingerprints[full_print]), 0)) //tells us how many stars are in the current prints. + if(28 to 32) + if(prob(1)) + fingerprints[full_print] = full_print // You rolled a one buddy. + else + fingerprints[full_print] = stars(full_print, rand(0,40)) // 24 to 32 + + if(24 to 27) + if(prob(3)) + fingerprints[full_print] = full_print //Sucks to be you. + else + fingerprints[full_print] = stars(full_print, rand(15, 55)) // 20 to 29 + + if(20 to 23) + if(prob(5)) + fingerprints[full_print] = full_print //Had a good run didn't ya. + else + fingerprints[full_print] = stars(full_print, rand(30, 70)) // 15 to 25 + + if(16 to 19) + if(prob(5)) + fingerprints[full_print] = full_print //Welp. + else + fingerprints[full_print] = stars(full_print, rand(40, 100)) // 0 to 21 + + if(0 to 15) + if(prob(5)) + fingerprints[full_print] = stars(full_print, rand(0,50)) // small chance you can smudge. + else + fingerprints[full_print] = full_print + +/// Adds the fibers of M to our fiber list. +/datum/forensics/proc/add_fibers(mob/living/carbon/human/M) + LAZYINITLIST(fibers) + + var/fibertext + var/item_multiplier = isitem(src)? 1.2 : 1 + + if(M.wear_suit) + fibertext = M.wear_suit.get_fibers() + if(fibertext && prob(10*item_multiplier)) + fibers[fibertext]++ + . = TRUE + + if(!(M.wear_suit.body_parts_covered & CHEST) && M.w_uniform) + fibertext = M.w_uniform.get_fibers() + if(fibertext && prob(12*item_multiplier)) //Wearing a suit means less of the uniform exposed. + fibers[fibertext]++ + . = TRUE + + if(!(M.wear_suit.body_parts_covered & HANDS) && M.gloves) + fibertext = M.gloves.get_fibers() + if(fibertext && prob(20*item_multiplier)) + fibers[fibertext]++ + . = TRUE + + else if(M.w_uniform) + fibertext = M.w_uniform.get_fibers() + if(fibertext && prob(15*item_multiplier)) + fibers[fibertext]++ + . = TRUE + + if(!(M.w_uniform.body_parts_covered & HANDS) && M.gloves) + fibertext = M.gloves.get_fibers() + if(fibertext && prob(20*item_multiplier)) + fibers[fibertext]++ + . = TRUE + + else if(M.gloves) + fibertext = M.gloves.get_fibers() + if(fibertext && prob(20*item_multiplier)) + fibers[fibertext]++ + . = TRUE + + return . + +/// Adds gunshot residue to our list +/datum/forensics/proc/add_gunshot_residue(text) + if(!text) + return + + LAZYOR(gunshot_residue, text) + +/// For admins. Logs when mobs players with this thing. +/datum/forensics/proc/log_touch(mob/M) + if(!isliving(M)) + if(!iscameramob(M)) + return + if(isaicamera(M)) + var/mob/camera/ai_eye/ai_camera = M + if(!ai_camera.ai) + return + M = ai_camera.ai + + if(!M.ckey) + return + + var/hasgloves = "" + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.gloves) + hasgloves = "(gloves)" + + var/current_time = time_stamp() + + if(!LAZYACCESS(admin_log, M.ckey)) + LAZYSET(admin_log, M.ckey, "First: \[[current_time]\] \"[M.real_name]\"[hasgloves]. Ckey: [M.ckey]") + else + var/laststamppos = findtext(LAZYACCESS(admin_log, M.ckey), "\nLast: ") + if(laststamppos) + LAZYSET(admin_log, M.ckey, copytext(admin_log[M.ckey], 1, laststamppos)) + admin_log[M.ckey] += "\nLast: \[[current_time]\] \"[M.real_name]\"[hasgloves]. Ckey: [M.ckey]" //made sure to be existing by if(!LAZYACCESS);else + + parent?.fingerprintslast = M.ckey + return TRUE + +/// Add a list of fingerprints +/datum/forensics/proc/add_fingerprint_list(list/_fingerprints) + if(!length(_fingerprints)) + return + + LAZYINITLIST(fingerprints) + for(var/print in _fingerprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. + if(!fingerprints[print]) + fingerprints[print] = _fingerprints[print] + else + fingerprints[print] = stringmerge(fingerprints[print], _fingerprints[print]) + return TRUE + +/// Adds a list of fibers. +/datum/forensics/proc/add_fiber_list(list/_fibertext) //list(text) + if(!length(_fibertext)) + return + + LAZYINITLIST(fibers) + + for(var/fiber in _fibertext) //We use an associative list, make sure we don't just merge a non-associative list into ours. + fibers[fiber] += _fibertext[fiber] + + return TRUE + +/// Adds a list of gunshot residue +/datum/forensics/proc/add_gunshot_residue_list(list/_gunshot_residue) + if(!length(_gunshot_residue)) + return + + LAZYINITLIST(gunshot_residue) + + gunshot_residue |= _gunshot_residue + return TRUE + +/// see [datum/forensics/proc/log_touch] +/datum/forensics/proc/log_touch_list(list/_hiddenprints) + if(!length(_hiddenprints)) + return + + LAZYINITLIST(admin_log) + for(var/i in _hiddenprints) //We use an associative list, make sure we don't just merge a non-associative list into ours. + admin_log[i] = _hiddenprints[i] + return TRUE + +/// Adds blood to our parent object if we have any +/datum/forensics/proc/check_blood() + if(!isitem(parent)) + return + if(!length(blood_DNA)) + return + + parent.AddElement(/datum/element/decal/blood, _color = get_blood_dna_color(blood_DNA)) + +/// Called by [atom/proc/wash]. +/datum/forensics/proc/wash(clean_types) + if(clean_types & CLEAN_TYPE_FINGERPRINTS) + wipe_fingerprints() + wipe_gunshot_residue() + . ||= TRUE + + if(clean_types & CLEAN_TYPE_BLOOD) + wipe_blood_DNA() + . ||= TRUE + + if(clean_types & CLEAN_TYPE_FIBERS) + wipe_fibers() + . ||= TRUE + +/// Clear fingerprints list. +/datum/forensics/proc/wipe_fingerprints() + LAZYNULL(fingerprints) + return TRUE + +/// Clear blood dna list. +/datum/forensics/proc/wipe_blood_DNA() + LAZYNULL(blood_DNA) + return TRUE + +/// Clear fibers list. +/datum/forensics/proc/wipe_fibers() + LAZYNULL(fibers) + return TRUE + +/// Clear the gunshot residue list. +/datum/forensics/proc/wipe_gunshot_residue() + LAZYNULL(gunshot_residue) + +/// Delete all non-admin evidence +/datum/forensics/proc/remove_evidence() + wipe_fingerprints() + wipe_blood_DNA() + wipe_fibers() + wipe_gunshot_residue() diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm index cd3a89d4bbc9..1ac0077024a0 100644 --- a/code/datums/greyscale/_greyscale_config.dm +++ b/code/datums/greyscale/_greyscale_config.dm @@ -244,14 +244,8 @@ var/icon/icon_bundle = GenerateBundle(color_string, last_external_icon=last_external_icon) icon_bundle = fcopy_rsc(icon_bundle) - - // This block is done like this because generated icons are unable to be scaled before getting added to the rsc - icon_bundle = fcopy_rsc(icon_bundle) - icon_bundle = icon(icon_bundle) - icon_bundle.Scale(width, height) - icon_bundle = fcopy_rsc(icon_bundle) - icon_cache[key] = icon_bundle + var/icon/output = icon(icon_bundle) return output @@ -303,7 +297,9 @@ generated_icon.GetPixel(1, 1) generated_icons["[icon_state]-[bit_step]"] = generated_icon - var/icon/icon_bundle = icon('icons/testing/greyscale_error.dmi') + var/icon/icon_bundle = generated_icons[""] || icon('icons/testing/greyscale_error.dmi') + icon_bundle.Scale(width, height) + generated_icons -= "" for(var/icon_state in generated_icons) icon_bundle.Insert(generated_icons[icon_state], icon_state) diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index 512b5097c07d..a5564da62f79 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -11,9 +11,6 @@ events = new /datum/events/Destroy() - for(var/elist in events) - for(var/e in events[elist]) - qdel(e) events = null return ..() @@ -36,7 +33,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 = LAZYACCESS(events,eventName) if(istype(event)) for(var/E in event) @@ -51,5 +48,4 @@ return FALSE var/list/event = LAZYACCESS(events,event_type) event -= cb - qdel(cb) return TRUE diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 71115194f3d2..1c28b6db4766 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -12,7 +12,6 @@ var/static/list/delete_atoms = zebra_typecacheof(list( /obj/effect = TRUE, /obj/effect/dummy/chameleon = FALSE, - /obj/effect/wisp = FALSE, /obj/effect/mob_spawn = FALSE, /obj/effect/immovablerod = FALSE, )) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index 6dcc8d4e86d8..619904cdde83 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -364,9 +364,6 @@ /datum/preset_holoimage/engineer/atmos/mod outfit_type = /datum/outfit/job/atmos/mod -/datum/preset_holoimage/researcher - outfit_type = /datum/outfit/job/scientist - /datum/preset_holoimage/captain outfit_type = /datum/outfit/job/captain diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 269ac1d6cd2c..986fe0f7bba2 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -2,6 +2,10 @@ GLOBAL_LIST_EMPTY(all_huds) +///gets filled by each /datum/atom_hud/New(). +///associative list of the form: list(hud category = list(all global atom huds that use that category)) +GLOBAL_LIST_EMPTY(huds_by_category) + //GLOBAL HUD LIST GLOBAL_LIST_INIT(huds, list( DATA_HUD_SECURITY_BASIC = new/datum/atom_hud/data/human/security/basic(), @@ -13,120 +17,405 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_ABDUCTOR = new/datum/atom_hud/abductor(), DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(), DATA_HUD_AI_DETECT = new/datum/atom_hud/ai_detector(), - DATA_HUD_FAN = new/datum/atom_hud/data/human/fan_hud(), )) /datum/atom_hud - var/list/atom/hudatoms = list() //list of all atoms which display this hud - var/list/hudusers = list() //list with all mobs who can see the hud - var/list/hud_icons = list() //these will be the indexes for the atom's hud_list + ///associative list of the form: list(z level = list(hud atom)). + ///tracks what hud atoms for this hud exists in what z level so we can only give users + ///the hud images that they can actually see. + var/list/atom/hud_atoms = list() + + ///associative list of the form: list(z level = list(hud user client mobs)). + ///tracks mobs that can "see" us + // by z level so when they change z's we can adjust what images they see from this hud. + var/list/hud_users = list() + + ///used for signal tracking purposes, associative list of the form: list(hud atom = TRUE) that isnt separated by z level + var/list/atom/hud_atoms_all_z_levels = list() + + ///used for signal tracking purposes, associative list of the form: list(hud user = number of times this hud was added to this user). + ///that isnt separated by z level + var/list/mob/hud_users_all_z_levels = list() - var/list/next_time_allowed = list() //mobs associated with the next time this hud can be added to them - var/list/queued_to_see = list() //mobs that have triggered the cooldown and are queued to see the hud, but do not yet - var/hud_exceptions = list() // huduser = list(ofatomswiththeirhudhidden) - aka everyone hates targeted invisiblity + ///these will be the indexes for the atom's hud_list + var/list/hud_icons = list() + + ///mobs associated with the next time this hud can be added to them + var/list/next_time_allowed = list() + ///mobs that have triggered the cooldown and are queued to see the hud, but do not yet + var/list/queued_to_see = list() + /// huduser = list(atoms with their hud hidden) - aka everyone hates targeted invisiblity + var/list/hud_exceptions = list() + ///whether or not this atom_hud type updates the global huds_by_category list. + ///some subtypes cant work like this since theyre supposed to "belong" to + ///one target atom each. it will still go in the other global hud lists. + var/uses_global_hud_category = TRUE /datum/atom_hud/New() GLOB.all_huds += src + for(var/z_level in 1 to world.maxz) + hud_atoms += list(list()) + hud_users += list(list()) + + RegisterSignal(SSdcs, COMSIG_GLOB_NEW_Z, PROC_REF(add_z_level_huds)) + + if(uses_global_hud_category) + for(var/hud_icon in hud_icons) + GLOB.huds_by_category[hud_icon] += list(src) /datum/atom_hud/Destroy() - for(var/v in hudusers) - remove_hud_from(v) - for(var/v in hudatoms) - remove_from_hud(v) + for(var/mob/mob as anything in hud_users_all_z_levels) + hide_from(mob) + + for(var/atom/atom as anything in hud_atoms_all_z_levels) + remove_atom_from_hud(atom) + + if(uses_global_hud_category) + for(var/hud_icon in hud_icons) + LAZYREMOVEASSOC(GLOB.huds_by_category, hud_icon, src) + GLOB.all_huds -= src return ..() -/datum/atom_hud/proc/remove_hud_from(mob/M, absolute = FALSE) - if(!M || !hudusers[M]) +/datum/atom_hud/proc/add_z_level_huds() + SIGNAL_HANDLER + hud_atoms += list(list()) + hud_users += list(list()) + +///returns a list of all hud atoms in the given z level and linked lower z levels (because hud users in higher z levels can see below) +/datum/atom_hud/proc/get_hud_atoms_for_z_level(z_level) + if(z_level <= 0) + return FALSE + if(z_level > length(hud_atoms)) + stack_trace("get_hud_atoms_for_z_level() was given a z level index out of bounds of hud_atoms!") + return FALSE + + . = list() + . += hud_atoms[z_level] + +///returns a list of all hud users in the given z level. +/datum/atom_hud/proc/get_hud_users_for_z_level(z_level) + if(z_level > length(hud_users) || z_level <= 0) + stack_trace("get_hud_atoms_for_z_level() was given a z level index [z_level] out of bounds 1->[length(hud_users)] of hud_atoms!") + return FALSE + + . = list() + . += hud_users[z_level] + +///show this hud to the passed in user +/datum/atom_hud/proc/show_to(mob/new_viewer) + if(!new_viewer) return - 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 + + if(!hud_users_all_z_levels[new_viewer]) + hud_users_all_z_levels[new_viewer] = 1 + + RegisterSignal(new_viewer, COMSIG_PARENT_QDELETING, PROC_REF(unregister_atom), override = TRUE) //both hud users and hud atoms use these signals + RegisterSignal(new_viewer, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_atom_or_user_z_level_changed), override = TRUE) + + var/turf/their_turf = get_turf(new_viewer) + if(!their_turf) + return + hud_users[their_turf.z][new_viewer] = TRUE + + if(next_time_allowed[new_viewer] > world.time) + if(!queued_to_see[new_viewer]) + addtimer(CALLBACK(src, PROC_REF(show_hud_images_after_cooldown), new_viewer), next_time_allowed[new_viewer] - world.time) + queued_to_see[new_viewer] = TRUE + else - for(var/atom/A in hudatoms) - remove_from_single_hud(M, A) + next_time_allowed[new_viewer] = world.time + ADD_HUD_TO_COOLDOWN + for(var/atom/hud_atom_to_add as anything in get_hud_atoms_for_z_level(their_turf.z)) + add_atom_to_single_mob_hud(new_viewer, hud_atom_to_add) + else + hud_users_all_z_levels[new_viewer] += 1 //increment the number of times this hud has been added to this hud user + +///Hides the images in this hud from former_viewer +///If absolute is set to true, this will forcefully remove the hud, even if sources in theory remain +/datum/atom_hud/proc/hide_from(mob/former_viewer, absolute = FALSE) + if(!former_viewer || !hud_users_all_z_levels[former_viewer]) + return + + hud_users_all_z_levels[former_viewer] -= 1//decrement number of sources for this hud on this user (bad way to track i know) + + if (absolute || hud_users_all_z_levels[former_viewer] <= 0)//if forced or there arent any sources left, remove the user + + if(!hud_atoms_all_z_levels[former_viewer])//make sure we arent unregistering changes on a mob thats also a hud atom for this hud + UnregisterSignal(former_viewer, COMSIG_MOVABLE_Z_CHANGED) + UnregisterSignal(former_viewer, COMSIG_PARENT_QDELETING) + + hud_users_all_z_levels -= former_viewer + + if(next_time_allowed[former_viewer]) + next_time_allowed -= former_viewer + + var/turf/their_turf = get_turf(former_viewer) + if(their_turf) + hud_users[their_turf.z] -= former_viewer + + if(queued_to_see[former_viewer]) + queued_to_see -= former_viewer + else if (their_turf) + for(var/atom/hud_atom as anything in get_hud_atoms_for_z_level(their_turf.z)) + remove_atom_from_single_hud(former_viewer, hud_atom) + +/// add new_hud_atom to this hud +/datum/atom_hud/proc/add_atom_to_hud(atom/new_hud_atom) + if(!new_hud_atom) + return FALSE + + LAZYDISTINCTADD(new_hud_atom.in_atom_huds, src) + + // No matter where or who you are, you matter to me :) + RegisterSignal(new_hud_atom, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_atom_or_user_z_level_changed), override = TRUE) + RegisterSignal(new_hud_atom, COMSIG_PARENT_QDELETING, PROC_REF(unregister_atom), override = TRUE) //both hud atoms and hud users use these signals + hud_atoms_all_z_levels[new_hud_atom] = TRUE + + var/turf/atom_turf = get_turf(new_hud_atom) + if(!atom_turf) + return TRUE + + hud_atoms[atom_turf.z] |= new_hud_atom + + for(var/mob/mob_to_show as anything in get_hud_users_for_z_level(atom_turf.z)) + if(!queued_to_see[mob_to_show]) + add_atom_to_single_mob_hud(mob_to_show, new_hud_atom) + return TRUE + +/// remove this atom from this hud completely +/datum/atom_hud/proc/remove_atom_from_hud(atom/hud_atom_to_remove) + if(!hud_atom_to_remove || !hud_atoms_all_z_levels[hud_atom_to_remove]) + return FALSE + + LAZYREMOVE(hud_atom_to_remove.in_atom_huds, src) + + //make sure we arent unregistering a hud atom thats also a hud user mob + if(!hud_users_all_z_levels[hud_atom_to_remove]) + UnregisterSignal(hud_atom_to_remove, COMSIG_MOVABLE_Z_CHANGED) + UnregisterSignal(hud_atom_to_remove, COMSIG_PARENT_QDELETING) + + for(var/mob/mob_to_remove as anything in hud_users_all_z_levels) + remove_atom_from_single_hud(mob_to_remove, hud_atom_to_remove) + + hud_atoms_all_z_levels -= hud_atom_to_remove + + var/turf/atom_turf = get_turf(hud_atom_to_remove) + if(!atom_turf) + return TRUE + + hud_atoms[atom_turf.z] -= hud_atom_to_remove + + if(ismovable(hud_atom_to_remove) && !istype(hud_atom_to_remove, /atom/movable/openspace/mimic)) + var/atom/movable/movable_to_remove = hud_atom_to_remove + for(var/atom/movable/AM as anything in movable_to_remove.get_associated_mimics()) + remove_atom_from_hud(AM) + return TRUE + +///adds a newly active hud category's image on a hud atom to every mob that could see it +/datum/atom_hud/proc/add_single_hud_category_on_atom(atom/hud_atom, hud_category_to_add) + if(!hud_atom?.active_hud_list?[hud_category_to_add] || QDELING(hud_atom) || !(hud_category_to_add in hud_icons)) + return FALSE + + if(!hud_atoms_all_z_levels[hud_atom]) + add_atom_to_hud(hud_atom) + return TRUE -/datum/atom_hud/proc/remove_from_hud(atom/A) - if(!A) + var/turf/atom_turf = get_turf(hud_atom) + if(!atom_turf) return FALSE - for(var/mob/M in hudusers) - remove_from_single_hud(M, A) - hudatoms -= A + + for(var/mob/hud_user as anything in get_hud_users_for_z_level(atom_turf.z)) + if(!hud_user.client) + continue + if(!hud_exceptions[hud_user] || !(hud_atom in hud_exceptions[hud_user])) + hud_user.client.images |= hud_atom.active_hud_list[hud_category_to_add] + + return TRUE + +///removes the image or images in hud_atom.hud_list[hud_category_to_remove] from every mob that can see it but leaves every other image +///from that atom there. +/datum/atom_hud/proc/remove_single_hud_category_on_atom(atom/hud_atom, hud_category_to_remove) + if(QDELETED(hud_atom) || !(hud_category_to_remove in hud_icons) || !hud_atoms_all_z_levels[hud_atom]) + return FALSE + + if(!hud_atom.active_hud_list) + remove_atom_from_hud(hud_atom) + return TRUE + + var/turf/atom_turf = get_turf(hud_atom) + if(!atom_turf) + return FALSE + + for(var/mob/hud_user as anything in get_hud_users_for_z_level(atom_turf.z)) + if(!hud_user.client) + continue + hud_user.client.images -= hud_atom.active_hud_list[hud_category_to_remove]//by this point it shouldnt be in active_hud_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) +///when a hud atom or hud user changes z levels this makes sure it gets the images it needs and removes the images it doesnt need. +///because of how signals work we need the same proc to handle both use cases because being a hud atom and being a hud user arent mutually exclusive +/datum/atom_hud/proc/on_atom_or_user_z_level_changed(atom/movable/moved_atom, turf/old_turf, turf/new_turf) + PROTECTED_PROC(TRUE) + + SIGNAL_HANDLER + if(old_turf) + if(hud_users_all_z_levels[moved_atom]) + hud_users[old_turf.z] -= moved_atom + + remove_all_atoms_from_single_hud(moved_atom, get_hud_atoms_for_z_level(old_turf.z)) + + if(hud_atoms_all_z_levels[moved_atom]) + hud_atoms[old_turf.z] -= moved_atom + + //this wont include moved_atom since its removed + remove_atom_from_all_huds(get_hud_users_for_z_level(old_turf.z), moved_atom) + + if(new_turf) + if(hud_users_all_z_levels[moved_atom]) + hud_users[new_turf.z][moved_atom] = TRUE //hud users is associative, hud atoms isnt + + add_all_atoms_to_single_mob_hud(moved_atom, get_hud_atoms_for_z_level(new_turf.z)) + + if(hud_atoms_all_z_levels[moved_atom]) + hud_atoms[new_turf.z] |= moved_atom + + add_atom_to_all_mob_huds(get_hud_users_for_z_level(new_turf.z), moved_atom) + +/// add just hud_atom's hud images (that are part of this atom_hud) to requesting_mob's client.images list +/datum/atom_hud/proc/add_atom_to_single_mob_hud(mob/requesting_mob, atom/hud_atom) //unsafe, no sanity apart from client + if(!requesting_mob || !requesting_mob.client || !hud_atom) + return + + for(var/hud_category in (hud_icons & hud_atom.active_hud_list)) + if(!hud_exceptions[requesting_mob] || !(hud_atom in hud_exceptions[requesting_mob])) + requesting_mob.client.images |= hud_atom.active_hud_list[hud_category] + +/// all passed in hud_atoms's hud images (that are part of this atom_hud) to requesting_mob's client.images list +/// optimization of [/datum/atom_hud/proc/add_atom_to_single_mob_hud] for hot cases, we assert that no nulls will be passed in via the list +/datum/atom_hud/proc/add_all_atoms_to_single_mob_hud(mob/requesting_mob, list/atom/hud_atoms) //unsafe, no sanity apart from client + if(!requesting_mob || !requesting_mob.client) return - for(var/i in hud_icons) - M.client.images -= A.hud_list[i] -/datum/atom_hud/proc/add_hud_to(mob/M) - if(!M) + // Hud entries this mob ignores + var/list/mob_exceptions = hud_exceptions[requesting_mob] + + for(var/hud_category in hud_icons) + for(var/atom/hud_atom as anything in hud_atoms) + if(mob_exceptions && (hud_atom in hud_exceptions[requesting_mob])) + continue + var/image/output = hud_atom.active_hud_list?[hud_category] + // byond throws a fit if you try to add null to the images list + if(!output) + continue + requesting_mob.client.images |= output + +/// add just hud_atom's hud images (that are part of this atom_hud) to all the requesting_mobs's client.images list +/// optimization of [/datum/atom_hud/proc/add_atom_to_single_mob_hud] for hot cases, we assert that no nulls will be passed in via the list +/datum/atom_hud/proc/add_atom_to_all_mob_huds(list/mob/requesting_mobs, atom/hud_atom) //unsafe, no sanity apart from client + if(!hud_atom?.active_hud_list) return - if(!hudusers[M]) - hudusers[M] = 1 - RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(unregister_mob)) - if(next_time_allowed[M] > world.time) - if(!queued_to_see[M]) - addtimer(CALLBACK(src, PROC_REF(show_hud_images_after_cooldown), M), next_time_allowed[M] - world.time) - queued_to_see[M] = TRUE - else - next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN - for(var/atom/A in hudatoms) - add_to_single_hud(M, A) - else - hudusers[M]++ -/datum/atom_hud/proc/unregister_mob(datum/source, force) + var/list/images_to_add = list() + for(var/hud_category in (hud_icons & hud_atom.active_hud_list)) + images_to_add |= hud_atom.active_hud_list[hud_category] + + // Cache for sonic speed, lists are structs + var/list/exceptions = hud_exceptions + for(var/mob/requesting_mob as anything in requesting_mobs) + if(!requesting_mob.client) + continue + if(!exceptions[requesting_mob] || !(hud_atom in exceptions[requesting_mob])) + requesting_mob.client.images |= images_to_add + +/// remove every hud image for this hud on atom_to_remove from client_mob's client.images list +/datum/atom_hud/proc/remove_atom_from_single_hud(mob/client_mob, atom/atom_to_remove) + PROTECTED_PROC(TRUE) + if(!client_mob || !client_mob.client || !atom_to_remove?.active_hud_list) + return + + for(var/hud_image in hud_icons) + client_mob.client.images -= atom_to_remove.active_hud_list[hud_image] + +/// remove every hud image for this hud pulled from atoms_to_remove from client_mob's client.images list +/// optimization of [/datum/atom_hud/proc/remove_atom_from_single_hud] for hot cases, we assert that no nulls will be passed in via the list +/datum/atom_hud/proc/remove_all_atoms_from_single_hud(mob/client_mob, list/atom/atoms_to_remove) + PROTECTED_PROC(TRUE) + + if(!client_mob || !client_mob.client) + return + + for(var/hud_image in hud_icons) + for(var/atom/atom_to_remove as anything in atoms_to_remove) + client_mob.client.images -= atom_to_remove.active_hud_list?[hud_image] + +/// remove every hud image for this hud on atom_to_remove from client_mobs's client.images list +/// optimization of [/datum/atom_hud/proc/remove_atom_from_single_hud] for hot cases, we assert that no nulls will be passed in via the list +/datum/atom_hud/proc/remove_atom_from_all_huds(list/mob/client_mobs, atom/atom_to_remove) + PROTECTED_PROC(TRUE) + + if(!atom_to_remove?.active_hud_list) + return + + var/list/images_to_remove = list() + for(var/hud_image in hud_icons) + images_to_remove |= atom_to_remove.active_hud_list[hud_image] + + for(var/mob/client_mob as anything in client_mobs) + if(!client_mob.client) + continue + client_mob.client.images -= images_to_remove + +/datum/atom_hud/proc/unregister_atom(datum/source, force) SIGNAL_HANDLER - remove_hud_from(source, TRUE) + hide_from(source, TRUE) + remove_atom_from_hud(source) + +/datum/atom_hud/proc/hide_single_atomhud_from(mob/hud_user, atom/hidden_atom) + + if(hud_users_all_z_levels[hud_user]) + remove_atom_from_single_hud(hud_user, hidden_atom) -/datum/atom_hud/proc/hide_single_atomhud_from(hud_user,hidden_atom) - if(hudusers[hud_user]) - remove_from_single_hud(hud_user,hidden_atom) if(!hud_exceptions[hud_user]) hud_exceptions[hud_user] = list(hidden_atom) else hud_exceptions[hud_user] += hidden_atom -/datum/atom_hud/proc/unhide_single_atomhud_from(hud_user,hidden_atom) +/datum/atom_hud/proc/unhide_single_atomhud_from(mob/hud_user, atom/hidden_atom) hud_exceptions[hud_user] -= hidden_atom - if(hudusers[hud_user]) - add_to_single_hud(hud_user,hidden_atom) - -/datum/atom_hud/proc/show_hud_images_after_cooldown(M) - if(queued_to_see[M]) - queued_to_see -= M - next_time_allowed[M] = world.time + ADD_HUD_TO_COOLDOWN - for(var/atom/A in hudatoms) - add_to_single_hud(M, A) - -/datum/atom_hud/proc/add_to_hud(atom/A) - if(!A) - return FALSE - hudatoms |= A - for(var/mob/M in hudusers) - if(!queued_to_see[M]) - add_to_single_hud(M, A) - return TRUE -/datum/atom_hud/proc/add_to_single_hud(mob/M, atom/A) //unsafe, no sanity apart from client - if(!M || !M.client || !A) + var/turf/hud_atom_turf = get_turf(hidden_atom) + + if(!hud_atom_turf) + return + + if(hud_users[hud_atom_turf.z][hud_user]) + add_atom_to_single_mob_hud(hud_user, hidden_atom) + +/datum/atom_hud/proc/show_hud_images_after_cooldown(mob/queued_hud_user) + if(!queued_to_see[queued_hud_user]) return - for(var/i in hud_icons) - if(A.hud_list[i] && (!hud_exceptions[M] || !(A in hud_exceptions[M]))) - M.client.images |= A.hud_list[i] + + queued_to_see -= queued_hud_user + next_time_allowed[queued_hud_user] = world.time + ADD_HUD_TO_COOLDOWN + + var/turf/user_turf = get_turf(queued_hud_user) + if(!user_turf) + return + + for(var/atom/hud_atom_to_show as anything in get_hud_atoms_for_z_level(user_turf.z)) + add_atom_to_single_mob_hud(queued_hud_user, hud_atom_to_show) //MOB PROCS /mob/proc/reload_huds() + var/turf/our_turf = get_turf(src) + if(!our_turf) + return + for(var/datum/atom_hud/hud in GLOB.all_huds) - if(hud?.hudusers[src]) - for(var/atom/A in hud.hudatoms) - hud.add_to_single_hud(src, A) + if(hud?.hud_users_all_z_levels[src]) + for(var/atom/hud_atom as anything in hud.get_hud_atoms_for_z_level(our_turf.z)) + hud.add_atom_to_single_mob_hud(src, hud_atom) /mob/dead/new_player/reload_huds() return diff --git a/code/datums/id_trim/jobs.dm b/code/datums/id_trim/jobs.dm index 2ce6fbe00cda..93b031fcfcb1 100644 --- a/code/datums/id_trim/jobs.dm +++ b/code/datums/id_trim/jobs.dm @@ -130,7 +130,7 @@ job = /datum/job/botanist /datum/id_trim/job/captain - assignment = "Captain" + assignment = JOB_CAPTAIN intern_alt_name = "Captain-in-Training" trim_state = "trim_captain" sechud_icon_state = SECHUD_CAPTAIN @@ -148,7 +148,7 @@ return ..() /datum/id_trim/job/cargo_technician - assignment = "Cargo Technician" + assignment = JOB_DECKHAND trim_state = "trim_cargotechnician" sechud_icon_state = SECHUD_CARGO_TECHNICIAN extra_access = list(ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION) @@ -178,14 +178,14 @@ job = /datum/job/chemist /datum/id_trim/job/chief_engineer - assignment = "Chief Engineer" - intern_alt_name = "Chief Engineer-in-Training" + assignment = JOB_CHIEF_ENGINEER + intern_alt_name = JOB_CHIEF_ENGINEER + "-in-Training" trim_state = "trim_chiefengineer" sechud_icon_state = SECHUD_CHIEF_ENGINEER extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() minimal_access = list(ACCESS_ATMOSPHERICS, ACCESS_AUX_BASE, ACCESS_CE, ACCESS_CONSTRUCTION, ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_EVA, - ACCESS_EXTERNAL_AIRLOCKS, ACCESS_HEADS, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, + ACCESS_EXTERNAL_AIRLOCKS, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, ACCESS_MINERAL_STOREROOM, ACCESS_MINISAT, ACCESS_RC_ANNOUNCE, ACCESS_BRIG_ENTRANCE, ACCESS_TCOMSAT, ACCESS_TECH_STORAGE) minimal_wildcard_access = list(ACCESS_CE) config_job = "chief_engineer" @@ -199,9 +199,9 @@ sechud_icon_state = SECHUD_CHIEF_MEDICAL_OFFICER extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() - minimal_access = list(ACCESS_CHEMISTRY, ACCESS_EVA, ACCESS_HEADS, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MEDICAL, + minimal_access = list(ACCESS_CHEMISTRY, ACCESS_EVA, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MEDICAL, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_PSYCHOLOGY, ACCESS_RC_ANNOUNCE, - ACCESS_BRIG_ENTRANCE, ACCESS_SURGERY, ACCESS_VIROLOGY) + ACCESS_BRIG_ENTRANCE, ACCESS_SURGERY, ACCESS_VIROLOGY, ACCESS_ROBOTICS) minimal_wildcard_access = list(ACCESS_CMO) config_job = "chief_medical_officer" template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) @@ -232,7 +232,7 @@ sechud_icon_state = SECHUD_CHEF /datum/id_trim/job/curator - assignment = "Curator" + assignment = JOB_ARCHIVIST trim_state = "trim_curator" sechud_icon_state = SECHUD_CURATOR extra_access = list() @@ -242,12 +242,17 @@ job = /datum/job/curator /datum/id_trim/job/detective - assignment = "Detective" + assignment = JOB_DETECTIVE trim_state = "trim_detective" sechud_icon_state = SECHUD_DETECTIVE extra_access = list() - minimal_access = list(ACCESS_BRIG, ACCESS_COURT, ACCESS_FORENSICS, ACCESS_BRIG_ENTRANCE,ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, - ACCESS_MECH_SECURITY, ACCESS_MINERAL_STOREROOM, ACCESS_WEAPONS) + minimal_access = list( + ACCESS_FORENSICS, + ACCESS_MAINT_TUNNELS, + ACCESS_MORGUE, + ACCESS_MINERAL_STOREROOM, + ACCESS_WEAPONS + ) config_job = "detective" template_access = list(ACCESS_CAPTAIN, ACCESS_HOS, ACCESS_CHANGE_IDS) job = /datum/job/detective @@ -262,45 +267,35 @@ if(CONFIG_GET(flag/security_has_maint_access)) access |= list(ACCESS_MAINT_TUNNELS) -/datum/id_trim/job/geneticist - assignment = "Geneticist" - trim_state = "trim_geneticist" - sechud_icon_state = SECHUD_GENETICIST - extra_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_XENOBIOLOGY) - minimal_access = list(ACCESS_GENETICS, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_RND) - config_job = "geneticist" - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) - job = /datum/job/geneticist - /datum/id_trim/job/head_of_personnel - assignment = "Head of Personnel" - intern_alt_name = "Head of Personnel-in-Training" + assignment = JOB_HEAD_OF_PERSONNEL + intern_alt_name = JOB_HEAD_OF_PERSONNEL + "-in-Training" trim_state = "trim_headofpersonnel" sechud_icon_state = SECHUD_HEAD_OF_PERSONNEL extra_access = list() extra_wildcard_access = list() minimal_access = list(ACCESS_AI_UPLOAD, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_AUX_BASE, ACCESS_BAR, ACCESS_BRIG, ACCESS_CHAPEL_OFFICE, ACCESS_CHANGE_IDS, ACCESS_CONSTRUCTION, ACCESS_COURT, ACCESS_CREMATORIUM, ACCESS_ENGINE, ACCESS_EVA, ACCESS_GATEWAY, - ACCESS_HEADS, ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_KEYCARD_AUTH, ACCESS_KITCHEN, ACCESS_LAWYER, ACCESS_LIBRARY, + ACCESS_HYDROPONICS, ACCESS_JANITOR, ACCESS_KEYCARD_AUTH, ACCESS_KITCHEN, ACCESS_LAWYER, ACCESS_LIBRARY, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, ACCESS_MECH_MEDICAL, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_PSYCHOLOGY, ACCESS_RC_ANNOUNCE, ACCESS_RESEARCH, ACCESS_BRIG_ENTRANCE, ACCESS_TELEPORTER, - ACCESS_THEATRE, ACCESS_VAULT, ACCESS_WEAPONS) + ACCESS_THEATRE, ACCESS_VAULT, ACCESS_WEAPONS, ACCESS_MANAGEMENT) minimal_wildcard_access = list(ACCESS_HOP) config_job = "head_of_personnel" template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) job = /datum/job/head_of_personnel /datum/id_trim/job/head_of_security - assignment = "Head of Security" - intern_alt_name = "Head of Security-in-Training" + assignment = JOB_SECURITY_MARSHAL + intern_alt_name = JOB_SECURITY_MARSHAL + "-in-Training" trim_state = "trim_headofsecurity" sechud_icon_state = SECHUD_HEAD_OF_SECURITY extra_access = list(ACCESS_TELEPORTER) extra_wildcard_access = list() minimal_access = list(ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_ARMORY, ACCESS_AUX_BASE, ACCESS_BRIG, ACCESS_CONSTRUCTION, ACCESS_COURT, - ACCESS_ENGINE, ACCESS_EVA, ACCESS_FORENSICS, ACCESS_GATEWAY, ACCESS_HEADS, ACCESS_KEYCARD_AUTH, + ACCESS_ENGINE, ACCESS_EVA, ACCESS_FORENSICS, ACCESS_GATEWAY, ACCESS_KEYCARD_AUTH, ACCESS_MAINT_TUNNELS, ACCESS_MECH_SECURITY, ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_RC_ANNOUNCE, - ACCESS_RESEARCH, ACCESS_SECURITY, ACCESS_BRIG_ENTRANCE, ACCESS_WEAPONS) + ACCESS_RESEARCH, ACCESS_SECURITY, ACCESS_BRIG_ENTRANCE, ACCESS_WEAPONS, ACCESS_MANAGEMENT) minimal_wildcard_access = list(ACCESS_HOS) config_job = "head_of_security" template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) @@ -337,24 +332,24 @@ job = /datum/job/lawyer /datum/id_trim/job/medical_doctor - assignment = "Medical Doctor" + assignment = JOB_MEDICAL_DOCTOR trim_state = "trim_medicaldoctor" sechud_icon_state = SECHUD_MEDICAL_DOCTOR - extra_access = list(ACCESS_CHEMISTRY, ACCESS_VIROLOGY) + extra_access = list(ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_ROBOTICS) minimal_access = list(ACCESS_MECH_MEDICAL, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_PHARMACY, ACCESS_SURGERY) config_job = "medical_doctor" template_access = list(ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_CHANGE_IDS) job = /datum/job/doctor /datum/id_trim/job/mime - assignment = "Mime" + assignment = JOB_CLOWN trim_state = "trim_mime" sechud_icon_state = SECHUD_MIME extra_access = list() minimal_access = list(ACCESS_THEATRE, ACCESS_SERVICE) config_job = "mime" template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) - job = /datum/job/mime + job = /datum/job/clown /datum/id_trim/job/paramedic assignment = "Paramedic" @@ -418,7 +413,7 @@ trim_state = "trim_quartermaster" sechud_icon_state = SECHUD_QUARTERMASTER extra_access = list() - minimal_access = list(ACCESS_AUX_BASE, ACCESS_BRIG_ENTRANCE, ACCESS_CARGO, ACCESS_HEADS, ACCESS_KEYCARD_AUTH, ACCESS_MAILSORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, ACCESS_MINING_STATION, + minimal_access = list(ACCESS_AUX_BASE, ACCESS_BRIG_ENTRANCE, ACCESS_CARGO, ACCESS_KEYCARD_AUTH, ACCESS_MAILSORTING, ACCESS_MAINT_TUNNELS, ACCESS_MECH_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_QM, ACCESS_RC_ANNOUNCE, ACCESS_VAULT) config_job = "quartermaster" template_access = list(ACCESS_CAPTAIN, ACCESS_HOP, ACCESS_CHANGE_IDS) @@ -431,7 +426,7 @@ sechud_icon_state = SECHUD_RESEARCH_DIRECTOR extra_access = list() extra_wildcard_access = list() - minimal_access = list(ACCESS_AI_UPLOAD, ACCESS_AUX_BASE, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_GENETICS, ACCESS_HEADS, ACCESS_KEYCARD_AUTH, + minimal_access = list(ACCESS_AI_UPLOAD, ACCESS_AUX_BASE, ACCESS_EVA, ACCESS_GATEWAY, ACCESS_GENETICS, ACCESS_KEYCARD_AUTH, ACCESS_NETWORK, ACCESS_MAINT_TUNNELS, ACCESS_MECH_ENGINE, ACCESS_MECH_MINING, ACCESS_MECH_SECURITY, ACCESS_MECH_SCIENCE, ACCESS_MEDICAL, ACCESS_MINERAL_STOREROOM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINISAT, ACCESS_MORGUE, ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, ACCESS_RC_ANNOUNCE, ACCESS_RESEARCH, ACCESS_RND, ACCESS_ROBOTICS, @@ -441,28 +436,6 @@ template_access = list(ACCESS_CAPTAIN, ACCESS_CHANGE_IDS) job = /datum/job/research_director -/datum/id_trim/job/roboticist - assignment = "Roboticist" - trim_state = "trim_roboticist" - sechud_icon_state = SECHUD_ROBOTICIST - extra_access = list(ACCESS_GENETICS, ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, ACCESS_XENOBIOLOGY) - minimal_access = list(ACCESS_AUX_BASE, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_RND, - ACCESS_ROBOTICS, ACCESS_TECH_STORAGE) - config_job = "roboticist" - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) - job = /datum/job/roboticist - -/datum/id_trim/job/scientist - assignment = "Scientist" - trim_state = "trim_scientist" - sechud_icon_state = SECHUD_SCIENTIST - extra_access = list(ACCESS_GENETICS, ACCESS_ROBOTICS) - minimal_access = list(ACCESS_AUX_BASE, ACCESS_MECH_SCIENCE, ACCESS_MINERAL_STOREROOM, ACCESS_ORDNANCE, ACCESS_ORDNANCE_STORAGE, - ACCESS_RESEARCH, ACCESS_RND, ACCESS_XENOBIOLOGY) - config_job = "scientist" - template_access = list(ACCESS_CAPTAIN, ACCESS_RD, ACCESS_CHANGE_IDS) - job = /datum/job/scientist - /// Sec officers have departmental variants. They each have their own trims with bonus departmental accesses. /datum/id_trim/job/security_officer assignment = "Security Officer" @@ -510,7 +483,7 @@ department_access = list(ACCESS_AUX_BASE, ACCESS_RESEARCH, ACCESS_RND) /datum/id_trim/job/shaft_miner - assignment = "Shaft Miner" + assignment = "Prospector" trim_state = "trim_shaftminer" sechud_icon_state = SECHUD_SHAFT_MINER extra_access = list(ACCESS_CARGO, ACCESS_MAINT_TUNNELS, ACCESS_QM) diff --git a/code/datums/keybinding/_keybindings.dm b/code/datums/keybinding/_keybindings.dm index dfcf492c1809..129e79437aa5 100644 --- a/code/datums/keybinding/_keybindings.dm +++ b/code/datums/keybinding/_keybindings.dm @@ -5,7 +5,6 @@ var/full_name var/description = "" var/category = CATEGORY_MISC - var/weight = WEIGHT_LOWEST var/keybind_signal /datum/keybinding/New() diff --git a/code/datums/keybinding/admin.dm b/code/datums/keybinding/admin.dm index 39fa27f40c38..9fd2d3b490a3 100644 --- a/code/datums/keybinding/admin.dm +++ b/code/datums/keybinding/admin.dm @@ -1,6 +1,5 @@ /datum/keybinding/admin category = CATEGORY_ADMIN - weight = WEIGHT_ADMIN /datum/keybinding/admin/can_use(client/user) return user.holder ? TRUE : FALSE diff --git a/code/datums/keybinding/carbon.dm b/code/datums/keybinding/carbon.dm index b3c9bb053433..5b4b81812def 100644 --- a/code/datums/keybinding/carbon.dm +++ b/code/datums/keybinding/carbon.dm @@ -1,6 +1,5 @@ /datum/keybinding/carbon category = CATEGORY_CARBON - weight = WEIGHT_MOB /datum/keybinding/carbon/can_use(client/user) return iscarbon(user.mob) diff --git a/code/datums/keybinding/client.dm b/code/datums/keybinding/client.dm index 81b9bb6c287a..9f0b4dd10c5b 100644 --- a/code/datums/keybinding/client.dm +++ b/code/datums/keybinding/client.dm @@ -1,6 +1,5 @@ /datum/keybinding/client category = CATEGORY_CLIENT - weight = WEIGHT_HIGHEST /datum/keybinding/client/admin_help diff --git a/code/datums/keybinding/emote.dm b/code/datums/keybinding/emote.dm index 342c4009a687..d246aa5f49a6 100644 --- a/code/datums/keybinding/emote.dm +++ b/code/datums/keybinding/emote.dm @@ -1,6 +1,5 @@ /datum/keybinding/emote category = CATEGORY_EMOTE - weight = WEIGHT_EMOTE keybind_signal = COMSIG_KB_EMOTE var/emote_key diff --git a/code/datums/keybinding/human.dm b/code/datums/keybinding/human.dm index 448a15d4539a..f1cca23b7601 100644 --- a/code/datums/keybinding/human.dm +++ b/code/datums/keybinding/human.dm @@ -1,6 +1,5 @@ /datum/keybinding/human category = CATEGORY_HUMAN - weight = WEIGHT_MOB /datum/keybinding/human/can_use(client/user) return ishuman(user.mob) @@ -56,3 +55,25 @@ slot_type = ITEM_SLOT_SUITSTORE slot_item_name = "suit storage slot item" keybind_signal = COMSIG_KB_HUMAN_SUITEQUIP_DOWN + +/datum/keybinding/human/wield + hotkey_keys = list("V") + name = "wield_item" + full_name = "Wield/Unwield item" + description = "Wield your held item with both hands." + keybind_signal = COMSIG_KB_HUMAN_WIELD_DOWN + +/datum/keybinding/human/wield/down(client/user) + . = ..() + if(.) + return + + var/mob/living/carbon/human/H = user.mob + var/obj/item/I = H.get_active_held_item() + if(!I) + return + + if(I.wielded) + I.unwield(H) + else + return I.wield(H) diff --git a/code/datums/keybinding/living.dm b/code/datums/keybinding/living.dm index 0bfbad40757e..64e50beed217 100644 --- a/code/datums/keybinding/living.dm +++ b/code/datums/keybinding/living.dm @@ -1,6 +1,5 @@ /datum/keybinding/living category = CATEGORY_HUMAN - weight = WEIGHT_MOB /datum/keybinding/living/can_use(client/user) return isliving(user.mob) @@ -32,12 +31,7 @@ if(.) return var/mob/living/L = user.mob - L.look_up() - return TRUE - -/datum/keybinding/living/look_up/up(client/user) - var/mob/living/L = user.mob - L.end_look_up() + L.do_look_up() return TRUE /datum/keybinding/living/look_down @@ -52,12 +46,7 @@ if(.) return var/mob/living/L = user.mob - L.look_down() - return TRUE - -/datum/keybinding/living/look_down/up(client/user) - var/mob/living/L = user.mob - L.end_look_down() + L.do_look_down() return TRUE /datum/keybinding/living/rest diff --git a/code/datums/keybinding/mob.dm b/code/datums/keybinding/mob.dm index c89c12a5351a..5047d05e7993 100644 --- a/code/datums/keybinding/mob.dm +++ b/code/datums/keybinding/mob.dm @@ -1,6 +1,5 @@ /datum/keybinding/mob category = CATEGORY_HUMAN - weight = WEIGHT_MOB /datum/keybinding/mob/stop_pulling hotkey_keys = list("H", "Delete") @@ -13,11 +12,13 @@ . = ..() if(.) return - var/mob/M = user.mob - if(!M.pulling) - to_chat(user, span_notice("You are not pulling anything.")) + var/mob/living/M = user.mob + if(!istype(M)) + return + if(!LAZYLEN(M.active_grabs)) + to_chat(user, span_notice("You are not grabbing anything.")) else - M.stop_pulling() + M.release_all_grabs() return TRUE /datum/keybinding/mob/swap_hands diff --git a/code/datums/keybinding/movement.dm b/code/datums/keybinding/movement.dm index 1fd932f5bfc8..4a044e5d806e 100644 --- a/code/datums/keybinding/movement.dm +++ b/code/datums/keybinding/movement.dm @@ -1,6 +1,5 @@ /datum/keybinding/movement category = CATEGORY_MOVEMENT - weight = WEIGHT_HIGHEST /datum/keybinding/movement/north hotkey_keys = list("W", "North") diff --git a/code/datums/keybinding/robot.dm b/code/datums/keybinding/robot.dm index de9417322751..1118430445ec 100644 --- a/code/datums/keybinding/robot.dm +++ b/code/datums/keybinding/robot.dm @@ -1,6 +1,5 @@ /datum/keybinding/robot category = CATEGORY_ROBOT - weight = WEIGHT_ROBOT /datum/keybinding/robot/can_use(client/user) return iscyborg(user.mob) diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index e8b7a030b529..6d379b85af1e 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -27,7 +27,7 @@ /// The max amount of loops to run for. var/max_loops /// If true, plays directly to provided atoms instead of from them. - var/direct + var/direct = LOOPING_SOUND_NORMAL /// The extra range of the sound in tiles, defaults to 0. var/extra_range = 0 /// The ID of the timer that's used to loop the sounds. @@ -47,13 +47,13 @@ /// Has the looping started yet? var/loop_started = FALSE -/datum/looping_sound/New(_parent, start_immediately = FALSE, _direct = FALSE, _skip_starting_sounds = FALSE) +/datum/looping_sound/New(_parent, start_immediately = FALSE, _direct = LOOPING_SOUND_NORMAL, _skip_starting_sounds = FALSE) if(!mid_sounds) WARNING("A looping sound datum was created without sounds to play.") return set_parent(_parent) - direct = _direct + direct = _direct || LOOPING_SOUND_NORMAL skip_starting_sounds = _skip_starting_sounds if(start_immediately) @@ -120,23 +120,41 @@ */ /datum/looping_sound/proc/play(soundfile, volume_override) var/sound/sound_to_play = sound(soundfile) - if(direct) - sound_to_play.channel = SSsounds.random_available_channel() - sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override - SEND_SOUND(parent, sound_to_play) - else - playsound( - parent, - sound_to_play, - volume, - vary, - extra_range, - falloff_exponent = falloff_exponent, - pressure_affected = pressure_affected, - ignore_walls = ignore_walls, - falloff_distance = falloff_distance, - use_reverb = use_reverb - ) + switch(direct) + if(LOOPING_SOUND_DIRECT) + sound_to_play.channel = SSsounds.random_available_channel() + sound_to_play.volume = volume_override || volume //Use volume as fallback if theres no override + SEND_SOUND(parent, sound_to_play) + + if(LOOPING_SOUND_NORMAL) + playsound( + parent, + sound_to_play, + volume, + vary, + extra_range, + falloff_exponent = falloff_exponent, + pressure_affected = pressure_affected, + ignore_walls = ignore_walls, + falloff_distance = falloff_distance, + use_reverb = use_reverb + ) + + if(LOOPING_SOUND_LOCAL) + if(!ismob(parent)) + return + var/mob/M = parent + M.playsound_local( + get_turf(M), + sound_to_play, + volume, + vary, + extra_range, + falloff_exponent = falloff_exponent, + pressure_affected = pressure_affected, + falloff_distance = falloff_distance, + use_reverb = use_reverb + ) /// Returns the sound we should now be playing. /datum/looping_sound/proc/get_sound(_mid_sounds) diff --git a/code/datums/map_config.dm b/code/datums/map_config.dm index 8bbed28514f1..97b0a086be77 100644 --- a/code/datums/map_config.dm +++ b/code/datums/map_config.dm @@ -5,7 +5,7 @@ /datum/map_config // Metadata - var/config_filename = "_maps/metastation.json" + var/config_filename = "_maps/theseus.json" var/defaulted = TRUE // set to FALSE by LoadConfig() succeeding // Config from maps.txt var/config_max_users = 0 @@ -13,10 +13,11 @@ var/voteweight = 1 var/votable = FALSE - // Config actually from the JSON - should default to Meta - var/map_name = "Meta Station" - var/map_path = "map_files/MetaStation" - var/map_file = "MetaStation.dmm" + // Config actually from the JSON - should default to Theseus + var/map_name = "Theseus" + var/map_path = "map_files/Theseus" + var/map_file = "Theseus.dmm" + var/webmap_id = "DaedalusMeta" var/traits = null var/space_ruin_levels = 7 @@ -24,6 +25,9 @@ var/minetype = "lavaland" + /// X,Y values for the holomap offset. The holomap draws to a 480x480 image, so by default the offset is 480 / 4. + var/holomap_offsets = list(120, 120) + var/allow_custom_shuttles = TRUE var/shuttles = list( "cargo" = "cargo_box", @@ -118,7 +122,7 @@ map_path = json["map_path"] map_file = json["map_file"] - // "map_file": "MetaStation.dmm" + // "map_file": "Theseus.dmm" if (istext(map_file)) if (!fexists("_maps/[map_path]/[map_file]")) log_world("Map file ([map_path]/[map_file]) does not exist!") @@ -133,6 +137,10 @@ log_world("map_file missing from json!") return + webmap_id = json["webmap_id"] + if(!webmap_id) + log_mapping("Map is missing a webmap ID.") + if (islist(json["shuttles"])) var/list/L = json["shuttles"] for(var/key in L) @@ -169,9 +177,6 @@ log_world("map_config space_empty_levels is not a number!") return - if ("minetype" in json) - minetype = json["minetype"] - allow_custom_shuttles = json["allow_custom_shuttles"] != FALSE if ("job_changes" in json) @@ -191,8 +196,20 @@ continue library_areas += path + if("holomap_offset" in json) + if(!islist(json["holomap_offset"]) || length(json["holomap_offset"] != 2)) + log_world("map_config \"holomap_offset\" field is invalid!") + return + temp = json["holomap_offset"] + if(!isnum(temp[1]) || !isnum(temp[2])) + log_world("map_config \"holomap_offset\" contains non-numbers!") + return + + holomap_offsets = temp + defaulted = FALSE return TRUE + #undef CHECK_EXISTS /datum/map_config/proc/GetFullMapPaths() diff --git a/code/datums/mapgen/CaveGenerator.dm b/code/datums/mapgen/CaveGenerator.dm index 58cfe4f0cd64..843bc52db484 100644 --- a/code/datums/mapgen/CaveGenerator.dm +++ b/code/datums/mapgen/CaveGenerator.dm @@ -1,18 +1,26 @@ /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/misc/asteroid/airless = 1) + var/weighted_open_turf_types = list(/turf/open/misc/asteroid/airless = 1) + ///Expanded list of the types that spawns if the turf is open + var/open_turf_types ///Weighted list of the types that spawns if the turf is closed - var/closed_turf_types = list(/turf/closed/mineral/random = 1) + var/weighted_closed_turf_types = list(/turf/closed/mineral/random = 1) + ///Expanded list of the types that spawns if the turf is closed + var/closed_turf_types ///Weighted list of mobs that can spawn in the area. + var/list/weighted_mob_spawn_list + ///Expanded list of mobs that can spawn in the area. Reads from the weighted list var/list/mob_spawn_list - // Weighted list of Megafauna that can spawn in the caves - var/list/megafauna_spawn_list ///Weighted list of flora that can spawn in the area. + var/list/weighted_flora_spawn_list + ///Expanded list of flora that can spawn in the area. Reads from the weighted list var/list/flora_spawn_list ///Weighted list of extra features that can spawn in the area, such as geysers. + var/list/weighted_feature_spawn_list + ///Expanded list of extra features that can spawn in the area. Reads from the weighted list var/list/feature_spawn_list @@ -36,107 +44,86 @@ /datum/map_generator/cave_generator/New() . = ..() - 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 = GLOB.megafauna_spawn_list - 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, /obj/structure/flora/ash/seraka = 2) - if(!feature_spawn_list) - feature_spawn_list = list(/obj/structure/geyser/random = 1) - -/datum/map_generator/cave_generator/generate_terrain(list/turfs) + if(!weighted_mob_spawn_list) + weighted_mob_spawn_list = list() + mob_spawn_list = expand_weights(weighted_mob_spawn_list) + if(!weighted_flora_spawn_list) + weighted_flora_spawn_list = list() + flora_spawn_list = expand_weights(weighted_flora_spawn_list) + feature_spawn_list = expand_weights(weighted_feature_spawn_list) + open_turf_types = expand_weights(weighted_open_turf_types) + closed_turf_types = expand_weights(weighted_closed_turf_types) + + +/datum/map_generator/cave_generator/generate_terrain(list/turfs, area/generate_in) . = ..() + if(!(generate_in.area_flags & CAVES_ALLOWED)) + return + 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 + // Area var pullouts to make accessing in the loop faster + var/flora_allowed = (generate_in.area_flags & FLORA_ALLOWED) && length(flora_spawn_list) + var/feature_allowed = (generate_in.area_flags & FLORA_ALLOWED) && length(feature_spawn_list) + var/mobs_allowed = (generate_in.area_flags & MOB_SPAWN_ALLOWED) && length(mob_spawn_list) + for(var/i in turfs) //Go through all the turfs and generate them var/turf/gen_turf = i - var/area/A = gen_turf.loc - if(!(A.area_flags & CAVES_ALLOWED)) - continue + var/closed = string_gen[world.maxx * (gen_turf.y - 1) + gen_turf.x] != "0" + var/turf/new_turf = pick(closed ? closed_turf_types : open_turf_types) - var/closed = text2num(string_gen[world.maxx * (gen_turf.y - 1) + gen_turf.x]) + // The assumption is this will be faster then changeturf, and changeturf isn't required since by this point + // The old tile hasn't got the chance to init yet + new_turf = new new_turf(gen_turf) - var/stored_flags if(gen_turf.turf_flags & NO_RUINS) - stored_flags |= NO_RUINS - - var/turf/new_turf = pick_weight(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 + new_turf.flags_1 |= NO_RUINS - if(!closed)//Open turfs have some special behavior related to spawning flora and mobs. - - var/turf/open/new_open_turf = new_turf + if(closed)//Open turfs have some special behavior related to spawning flora and mobs. + CHECK_TICK + continue - ///Spawning isn't done in procs to save on overhead on the 60k turfs we're going through. + // If we've spawned something yet + var/spawned_something = FALSE - //FLORA SPAWNING HERE - var/atom/spawned_flora - if(flora_spawn_list && prob(flora_spawn_chance)) - var/can_spawn = TRUE + ///Spawning isn't done in procs to save on overhead on the 60k turfs we're going through. + //FLORA SPAWNING HERE + if(flora_allowed && prob(flora_spawn_chance)) + var/flora_type = pick(flora_spawn_list) + new flora_type(new_turf) + spawned_something = TRUE - if(!(A.area_flags & FLORA_ALLOWED)) - can_spawn = FALSE - if(can_spawn) - spawned_flora = pick_weight(flora_spawn_list) - spawned_flora = new spawned_flora(new_open_turf) + //FEATURE SPAWNING HERE + if(feature_allowed && prob(feature_spawn_chance)) + var/can_spawn = TRUE - //FEATURE SPAWNING HERE - var/atom/spawned_feature - if(feature_spawn_list && prob(feature_spawn_chance)) - var/can_spawn = TRUE + var/atom/picked_feature = pick(feature_spawn_list) - if(!(A.area_flags & FLORA_ALLOWED)) //checks the same flag because lol dunno + for(var/obj/structure/existing_feature in range(7, new_turf)) + if(istype(existing_feature, picked_feature)) can_spawn = FALSE + break - var/atom/picked_feature = pick_weight(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(can_spawn) + new picked_feature(new_turf) + spawned_something = TRUE - if(mob_spawn_list && !spawned_flora && !spawned_feature && prob(mob_spawn_chance)) - var/can_spawn = TRUE + //MOB SPAWNING HERE + if(mobs_allowed && !spawned_something && prob(mob_spawn_chance)) + var/atom/picked_mob = pick(mob_spawn_list) + var/can_spawn = TRUE - if(!(A.area_flags & MOB_SPAWN_ALLOWED)) + //if the random is a standard mob, avoid spawning if there's another one within 12 tiles + if(ispath(picked_mob, /mob/living/simple_animal/hostile/asteroid)) + for(var/mob/living/simple_animal/hostile/asteroid/mob_blocker in range(12, new_turf)) can_spawn = FALSE + break - var/atom/picked_mob = pick_weight(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 = pick_weight(megafauna_spawn_list) - else //this is not danger, don't spawn a boss, spawn something else - picked_mob = pick_weight(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) + if(can_spawn) + new picked_mob(new_turf) + spawned_something = TRUE CHECK_TICK var/message = "[name] finished in [(REALTIMEOFDAY - start_time)/10]s!" diff --git a/code/datums/mapgen/Cavegens/IcemoonCaves.dm b/code/datums/mapgen/Cavegens/IcemoonCaves.dm deleted file mode 100644 index ce5858fb0bde..000000000000 --- a/code/datums/mapgen/Cavegens/IcemoonCaves.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/map_generator/cave_generator/icemoon - open_turf_types = list(/turf/open/misc/asteroid/snow/icemoon = 19, /turf/open/misc/ice/icemoon = 1) - closed_turf_types = list(/turf/closed/mineral/random/snow = 1) - - - mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/wolf = 50, /obj/structure/spawner/ice_moon = 3, \ - /mob/living/simple_animal/hostile/asteroid/polarbear = 30, /obj/structure/spawner/ice_moon/polarbear = 3, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10, \ - /mob/living/simple_animal/hostile/asteroid/lobstrosity = 15) - flora_spawn_list = list(/obj/structure/flora/tree/pine = 2, /obj/structure/flora/rock/icy = 2, /obj/structure/flora/rock/pile/icy = 2, /obj/structure/flora/grass/both = 6, /obj/structure/flora/ash/chilly = 2) - ///Note that this spawn list is also in the lavaland generator - feature_spawn_list = list(/obj/structure/geyser/wittel = 6, /obj/structure/geyser/random = 2, /obj/structure/geyser/plasma_oxide = 10, /obj/structure/geyser/protozine = 10, /obj/structure/geyser/hollowwater = 10) - -/datum/map_generator/cave_generator/icemoon/surface - flora_spawn_chance = 4 - mob_spawn_list = null - initial_closed_chance = 53 - birth_limit = 5 - death_limit = 4 - smoothing_iterations = 10 - -/datum/map_generator/cave_generator/icemoon/surface/noruins //use this for when you don't want ruins to spawn in a certain area - -/datum/map_generator/cave_generator/icemoon/deep - closed_turf_types = list(/turf/closed/mineral/random/snow/underground = 1) - mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/ice_demon = 50, /obj/structure/spawner/ice_moon/demonic_portal = 3, \ - /mob/living/simple_animal/hostile/asteroid/ice_whelp = 30, /obj/structure/spawner/ice_moon/demonic_portal/ice_whelp = 3, \ - /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow = 50, /obj/structure/spawner/ice_moon/demonic_portal/snowlegion = 3, \ - SPAWN_MEGAFAUNA = 2) - megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/colossus = 1) - flora_spawn_list = list(/obj/structure/flora/rock/icy = 6, /obj/structure/flora/rock/pile/icy = 6, /obj/structure/flora/ash/chilly = 1) diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm deleted file mode 100644 index 780b426ea111..000000000000 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/map_generator/cave_generator/lavaland - open_turf_types = list(/turf/open/misc/asteroid/basalt/lava_land_surface = 1) - closed_turf_types = list(/turf/closed/mineral/random/volcanic = 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, - /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava = 20, /mob/living/simple_animal/hostile/asteroid/brimdemon = 20 - ) - 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/seraka = 2) - ///Note that this spawn list is also in the icemoon generator - feature_spawn_list = list(/obj/structure/geyser/wittel = 6, /obj/structure/geyser/random = 2, /obj/structure/geyser/plasma_oxide = 10, /obj/structure/geyser/protozine = 10, /obj/structure/geyser/hollowwater = 10) - - 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 index 325dd8ed156d..d640674d185b 100644 --- a/code/datums/mapgen/JungleGenerator.dm +++ b/code/datums/mapgen/JungleGenerator.dm @@ -33,7 +33,7 @@ var/perlin_zoom = 65 ///Seeds the rust-g perlin noise with a random number. -/datum/map_generator/jungle_generator/generate_terrain(list/turfs) +/datum/map_generator/jungle_generator/generate_terrain(list/turfs, area/generate_in) . = ..() var/height_seed = rand(0, 50000) var/humidity_seed = rand(0, 50000) @@ -92,7 +92,6 @@ /area/mine/planetgeneration name = "planet generation area" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC map_generator = /datum/map_generator/jungle_generator diff --git a/code/datums/mapgen/_MapGenerator.dm b/code/datums/mapgen/_MapGenerator.dm index dbf61d434034..dbe7cf5ba949 100644 --- a/code/datums/mapgen/_MapGenerator.dm +++ b/code/datums/mapgen/_MapGenerator.dm @@ -2,5 +2,5 @@ /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(list/turfs) +/datum/map_generator/proc/generate_terrain(list/turfs, area/generate_in) return diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 56d79afb8ae2..ef53770a71b8 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -30,7 +30,7 @@ var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected)) - var/armor_block = D.run_armor_check(affecting, MELEE) + var/armor_block = D.run_armor_check(affecting, BLUNT) playsound(D.loc, active_arm.unarmed_attack_sound, 25, TRUE, -1) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 262d299c4578..318e6411f1d8 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -69,7 +69,7 @@ D.visible_message(span_danger("[A] kicks [D]'s head, knocking [D.p_them()] out!"), \ span_userdanger("You're knocked unconscious by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A) to_chat(A, span_danger("You kick [D]'s head, knocking [D.p_them()] out!")) - playsound(get_turf(A), 'sound/weapons/genhit1.ogg', 50, TRUE, -1) + playsound(get_turf(A), SFX_PUNCH, 50, TRUE, -1) D.SetSleeping(300) D.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 150) . = TRUE @@ -122,11 +122,17 @@ add_to_streak("G",D) if(check_streak(A,D)) //if a combo is made no grab upgrade is done return TRUE - old_grab_state = A.grab_state - D.grabbedby(A, 1) + var/obj/item/hand_item/grab/G = A.is_grabbing(D) + if(G) + old_grab_state = G?.current_grab.damage_stage + if(old_grab_state == GRAB_PASSIVE) + G.upgrade() + + else + A.try_make_grab(D, /datum/grab/normal/aggressive) + if(old_grab_state == GRAB_PASSIVE) D.drop_all_held_items() - A.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab if on grab intent log_combat(A, D, "grabbed", addition="aggressively") D.visible_message(span_warning("[A] violently grabs [D]!"), \ span_userdanger("You're grabbed violently by [A]!"), span_hear("You hear sounds of aggressive fondling!"), COMBAT_MESSAGE_RANGE, A) @@ -191,15 +197,17 @@ to_chat(A, span_warning("You fail to disarm [D]!")) playsound(D, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1) log_combat(A, D, "disarmed (CQC)", "[I ? " grabbing \the [I]" : ""]") - if(restraining && A.pulling == D) + + var/obj/item/hand_item/grab/G = A.is_grabbing(D) + if(restraining && G) log_combat(A, D, "knocked out (Chokehold)(CQC)") D.visible_message(span_danger("[A] puts [D] into a chokehold!"), \ span_userdanger("You're put into a chokehold by [A]!"), span_hear("You hear shuffling and a muffled groan!"), null, A) to_chat(A, span_danger("You put [D] into a chokehold!")) D.SetSleeping(400) restraining = FALSE - if(A.grab_state < GRAB_NECK && !HAS_TRAIT(A, TRAIT_PACIFISM)) - A.setGrabState(GRAB_NECK) + if(G.current_grab.damage_stage < GRAB_NECK && !HAS_TRAIT(A, TRAIT_PACIFISM)) + G.upgrade() else restraining = FALSE return FALSE diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index 4ccb52b2c72c..b0862f65b9ef 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -130,7 +130,7 @@ return TRUE log_combat(attacker, defender, "punched") var/obj/item/bodypart/affecting = defender.get_bodypart(ran_zone(attacker.zone_selected)) - var/armor_block = defender.run_armor_check(affecting, MELEE) + var/armor_block = defender.run_armor_check(affecting, BLUNT) var/picked_hit_type = pick("punch", "kick") var/bonus_damage = 0 if(defender.body_position == LYING_DOWN) @@ -212,4 +212,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, FIRE = 80, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 749285125c2e..42cd8640d3c9 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -36,7 +36,7 @@ /datum/martial_art/plasma_fist/proc/Tornado(mob/living/A, mob/living/D) A.say("TORNADO SWEEP!", forced="plasma fist") - dance_rotate(A, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), A.loc, 'sound/weapons/punch1.ogg', 15, TRUE, -1)) + dance_rotate(A, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), A.loc, SFX_PUNCH, 15, TRUE, -1)) var/datum/action/cooldown/spell/aoe/repulse/tornado_spell = new(src) tornado_spell.cast(A) qdel(tornado_spell) @@ -48,7 +48,7 @@ D.visible_message(span_danger("[A] hits [D] with Plasma Punch!"), \ span_userdanger("You're hit with a Plasma Punch by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A) to_chat(A, span_danger("You hit [D] with Plasma Punch!")) - playsound(D.loc, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(D.loc, SFX_PUNCH, 50, TRUE, -1) var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A))) D.throw_at(throw_target, 200, 4,A) A.say("HYAH!", forced="plasma fist") @@ -59,7 +59,7 @@ var/hasclient = D.client ? TRUE : FALSE A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) - playsound(D.loc, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(D.loc, SFX_PUNCH, 50, TRUE, -1) A.say("PLASMA FIST!", forced="plasma fist") D.visible_message(span_danger("[A] hits [D] with THE PLASMA FIST TECHNIQUE!"), \ span_userdanger("You're suddenly hit with THE PLASMA FIST TECHNIQUE by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A) @@ -110,7 +110,7 @@ user.apply_damage(rand(50,70), BRUTE) addtimer(CALLBACK(src,PROC_REF(Apotheosis_end), user), 6 SECONDS) - playsound(boomspot, 'sound/weapons/punch1.ogg', 50, TRUE, -1) + playsound(boomspot, SFX_PUNCH, 50, TRUE, -1) explosion(user, devastation_range = plasma_power, heavy_impact_range = plasma_power*2, light_impact_range = plasma_power*4, ignorecap = TRUE, explosion_cause = src) plasma_power = 1 //just in case there is any clever way to cause it to happen again diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm index 329144feebb9..76c99a497d8a 100644 --- a/code/datums/martial/psychotic_brawl.dm +++ b/code/datums/martial/psychotic_brawl.dm @@ -24,29 +24,31 @@ A.Stun(20) atk_verb = "cried looking at" if(3) - if(A.grab_state >= GRAB_AGGRESSIVE) - D.grabbedby(A, 1) + var/obj/item/hand_item/grab/G = A.is_grabbing(D) + if(G?.current_grab.damage_stage == GRAB_AGGRESSIVE) + G.upgrade(TRUE) else - A.start_pulling(D, supress_message = TRUE) - if(A.pulling) + A.try_make_grab(D) + G = A.is_grabbing(D) + if(G) D.drop_all_held_items() - D.stop_pulling() + D.release_all_grabs() if(grab_attack) log_combat(A, D, "grabbed", addition="aggressively") D.visible_message(span_warning("[A] violently grabs [D]!"), \ span_userdanger("You're violently grabbed by [A]!"), span_hear("You hear sounds of aggressive fondling!"), null, A) to_chat(A, span_danger("You violently grab [D]!")) - A.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab + G.upgrade(TRUE) else log_combat(A, D, "grabbed", addition="passively") - A.setGrabState(GRAB_PASSIVE) + if(4) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH) atk_verb = "headbutt" D.visible_message(span_danger("[A] [atk_verb]s [D]!"), \ span_userdanger("You're [atk_verb]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, A) to_chat(A, span_danger("You [atk_verb] [D]!")) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 40, TRUE, -1) + playsound(get_turf(D), SFX_PUNCH, 40, TRUE, -1) D.apply_damage(rand(5,10), A.get_attack_type(), BODY_ZONE_HEAD) A.apply_damage(rand(5,10), A.get_attack_type(), BODY_ZONE_HEAD) if (iscarbon(D)) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 8fb5eb62c480..0ee74a0861f4 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -33,7 +33,7 @@ D.visible_message(span_danger("[A] [atk_verb]s [D]!"), \ span_userdanger("[A] [atk_verb]s you!"), null, null, A) to_chat(A, span_danger("You [atk_verb] [D]!")) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(get_turf(D), SFX_PUNCH, 25, TRUE, -1) log_combat(A, D, "strong punched (Sleeping Carp)") D.apply_damage(20, A.get_attack_type(), affecting) return @@ -87,7 +87,7 @@ span_userdanger("[A] [atk_verb]s you!"), null, null, A) to_chat(A, span_danger("You [atk_verb] [D]!")) D.apply_damage(rand(10,15), BRUTE, affecting) - playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, TRUE, -1) + playsound(get_turf(D), SFX_PUNCH, 25, TRUE, -1) log_combat(A, D, "punched (Sleeping Carp)") return TRUE @@ -154,41 +154,29 @@ /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 - throwforce = 20 - throw_speed = 2 - attack_verb_continuous = list("smashes", "slams", "whacks", "thwacks") - attack_verb_simple = list("smash", "slam", "whack", "thwack") icon = 'icons/obj/items_and_weapons.dmi' icon_state = "bostaff0" base_icon_state = "bostaff" - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - block_chance = 50 - var/wielded = FALSE // track wielded status on item -/obj/item/staff/bostaff/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK -/obj/item/staff/bostaff/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=24, icon_wielded="[base_icon_state]1") + force = 10 + force_wielded = 20 + throwforce = 2 + throw_speed = 1.5 -/// triggered on wield of two handed item -/obj/item/staff/bostaff/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER + block_chance = 50 - wielded = TRUE + attack_verb_continuous = list("smashes", "slams", "whacks", "thwacks") + attack_verb_simple = list("smash", "slam", "whack", "thwack") -/// triggered on unwield of two handed item -/obj/item/staff/bostaff/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER + lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - wielded = FALSE +/obj/item/staff/bostaff/Initialize(mapload) + . = ..() + icon_state_wielded = "[base_icon_state][1]" /obj/item/staff/bostaff/update_icon_state() icon_state = "[base_icon_state]0" @@ -241,7 +229,7 @@ else return ..() -/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(!wielded) +/obj/item/staff/bostaff/get_block_chance(atom/movable/hitby, damage, attack_type, armor_penetration) + if(wielded) return ..() return FALSE diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index 0ca18ae84110..26f649ed2544 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -130,7 +130,7 @@ If you make a derivative work from this code, you must include this notification /datum/martial_art/wrestling/proc/throw_wrassle(mob/living/A, mob/living/D) if(!D) return - if(!A.pulling || A.pulling != D) + if(!A.is_grabbing(D)) to_chat(A, span_warning("You need to have [D] in a cinch!")) return D.forceMove(A.loc) @@ -214,7 +214,7 @@ If you make a derivative work from this code, you must include this notification /datum/martial_art/wrestling/proc/slam(mob/living/A, mob/living/D) if(!D) return - if(!A.pulling || A.pulling != D) + if(!A.is_grabbing(D)) to_chat(A, span_warning("You need to have [D] in a cinch!")) return D.forceMove(A.loc) @@ -452,9 +452,10 @@ If you make a derivative work from this code, you must include this notification /datum/martial_art/wrestling/grab_act(mob/living/A, mob/living/D) if(check_streak(A,D)) return 1 - if(A.pulling == D) + if(A.is_grabbing(D)) + return 1 + if(!A.try_make_grab(D)) return 1 - A.start_pulling(D) D.visible_message(span_danger("[A] gets [D] in a cinch!"), \ span_userdanger("You're put into a cinch by [A]!"), span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, A) to_chat(A, span_danger("You get [D] in a cinch!")) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 162ef10e4271..328e4c9d53a7 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -12,6 +12,8 @@ Simple datum which is instanced once per type and is used for every object of sa var/desc = "its..stuff." /// What the material is indexed by in the SSmaterials.materials list. Defaults to the type of the material. var/id + ///If set to TRUE, this material doesn't generate at roundstart, and generates unique instances based on the variables passed to GET_MATERIAL_REF + var/bespoke = FALSE ///Base color of the material, is used for greyscale. Item isn't changed in color if this is null. ///Deprecated, use greyscale_color instead. @@ -20,8 +22,6 @@ Simple datum which is instanced once per type and is used for every object of sa var/greyscale_colors ///Base alpha of the material, is used for greyscale icons. var/alpha = 255 - ///Bitflags that influence how SSmaterials handles this material. - var/init_flags = MATERIAL_INIT_MAPLOAD ///Materials "Traits". its a map of key = category | Value = Bool. Used to define what it can be used for var/list/categories = list() ///The type of sheet this material creates. This should be replaced as soon as possible by greyscale sheets @@ -33,7 +33,7 @@ Simple datum which is instanced once per type and is used for every object of sa ///This is the amount of value per 1 unit of the material var/value_per_unit = 0 ///Armor modifiers, multiplies an items normal armor vars by these amounts. - var/armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1, ACID = 1) + var/armor_modifiers = list(BLUNT = 1, PUNCTURE = 1, SLASH = 0, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1, ACID = 1) ///How beautiful is this material per unit. var/beauty_modifier = 0 ///Can be used to override the sound items make, lets add some SLOSHing. @@ -47,9 +47,6 @@ Simple datum which is instanced once per type and is used for every object of sa ///What type of shard the material will shatter to var/obj/item/shard_type - ///Snowflake for walls. Will be removed when materials are redone - var/wall_shine = WALL_SHINE_PLATING - ///Icon for walls which are plated with this material var/wall_icon = 'icons/turf/walls/solid_wall.dmi' ///Icon for reinforced walls which are plated with this material @@ -133,14 +130,16 @@ Simple datum which is instanced once per type and is used for every object of sa o.throwforce *= strength_modifier var/list/temp_armor_list = list() //Time to add armor modifiers! + var/datum/armor/A = o.returnArmor() - if(!istype(o.armor)) + if(!istype(A)) return - var/list/current_armor = o.armor?.getList() + + var/list/current_armor = A.getList() for(var/i in current_armor) temp_armor_list[i] = current_armor[i] * armor_modifiers[i] - o.armor = getArmor(arglist(temp_armor_list)) + o.setArmor(getArmor(arglist(temp_armor_list))) if(!isitem(o)) return @@ -153,12 +152,15 @@ Simple datum which is instanced once per type and is used for every object of sa item.set_greyscale( new_worn_config = worn_path, new_inhand_left = lefthand_path, - new_inhand_right = righthand_path + new_inhand_right = righthand_path, + queue = TRUE ) if(!item_sound_override) return + item.hitsound = item_sound_override + item.wielded_hitsound = item_sound_override item.usesound = item_sound_override item.mob_throw_hit_sound = item_sound_override item.equip_sound = item_sound_override diff --git a/code/datums/materials/alloys.dm b/code/datums/materials/alloys.dm index db57a0fb27e9..737f3f3b613c 100644 --- a/code/datums/materials/alloys.dm +++ b/code/datums/materials/alloys.dm @@ -1,9 +1,10 @@ /** Materials made from other materials. */ /datum/material/alloy + abstract_type = /datum/material/alloy + name = "alloy" desc = "A material composed of two or more other materials." - init_flags = NONE /// The materials this alloy is made from weighted by their ratios. var/list/composition = null /// Breakdown flags required to reduce this alloy to its component materials. @@ -32,11 +33,10 @@ desc = "The heavy duty result of infusing iron with plasma." color = "#706374" greyscale_colors = "#706374" - init_flags = MATERIAL_INIT_MAPLOAD - value_per_unit = 0.135 + value_per_unit = ((/datum/material/iron::value_per_unit * 0.5) + (/datum/material/plasma::value_per_unit * 0.5)) * 1.1 strength_modifier = 1.25 integrity_modifier = 1.5 // Heavy duty. - armor_modifiers = list(MELEE = 1.4, BULLET = 1.4, LASER = 1.1, ENERGY = 1.1, BOMB = 1.5, BIO = 1, FIRE = 1.1, ACID = 1) + armor_modifiers = list(BLUNT = 1.4, PUNCTURE = 1.4, SLASH = 0, LASER = 1.1, ENERGY = 1.1, BOMB = 1.5, BIO = 1, FIRE = 1.1, ACID = 1) sheet_type = /obj/item/stack/sheet/plasteel categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/iron=1, /datum/material/plasma=1) @@ -48,8 +48,6 @@ wall_color = "#57575c" hard_wall_decon = TRUE - wall_shine = WALL_SHINE_BOTH - /datum/material/alloy/plasteel/on_applied_obj(obj/item/target_item, amount, material_flags) . = ..() if(!istype(target_item)) @@ -74,11 +72,10 @@ desc = "The extremely heat resistant result of infusing titanium with plasma." color = "#3a313a" greyscale_colors = "#3a313a" - init_flags = MATERIAL_INIT_MAPLOAD - value_per_unit = 0.225 + value_per_unit = ((/datum/material/titanium::value_per_unit * 0.5) + (/datum/material/plasma::value_per_unit * 0.5)) * 1.2 strength_modifier = 0.9 // It's a lightweight alloy. integrity_modifier = 1.3 - armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.4, ENERGY = 1.4, BOMB = 1.1, BIO = 1.2, FIRE = 1.5, ACID = 1) + armor_modifiers = list(BLUNT = 1.1, PUNCTURE = 1.1, SLASH = 0, LASER = 1.4, ENERGY = 1.4, BOMB = 1.1, BIO = 1.2, FIRE = 1.5, ACID = 1) sheet_type = /obj/item/stack/sheet/mineral/plastitanium categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/titanium=1, /datum/material/plasma=1) @@ -89,8 +86,6 @@ hard_wall_decon = TRUE wall_color = "#423b3b" - wall_shine = WALL_SHINE_REINFORCED - /** Plasmaglass * * An alloy of silicate and plasma. @@ -101,12 +96,11 @@ color = "#ff80f4" greyscale_colors = "#ff80f4" alpha = 150 - init_flags = MATERIAL_INIT_MAPLOAD integrity_modifier = 0.5 - armor_modifiers = list(MELEE = 0.8, BULLET = 0.8, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 1.2, FIRE = 2, ACID = 2) + armor_modifiers = list(BLUNT = 0.8, PUNCTURE = 0.8, SLASH = 0, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 1.2, FIRE = 2, ACID = 2) sheet_type = /obj/item/stack/sheet/plasmaglass shard_type = /obj/item/shard/plasma - value_per_unit = 0.075 + value_per_unit = ((/datum/material/glass::value_per_unit * 1) + (/datum/material/plasma::value_per_unit * 0.5)) * 1.1 categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/glass=1, /datum/material/plasma=0.5) wall_type = null @@ -121,11 +115,10 @@ color = "#cfbee0" greyscale_colors = "#cfbee0" alpha = 150 - init_flags = MATERIAL_INIT_MAPLOAD - armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 0.8, ENERGY = 0.8, BOMB = 0.5, BIO = 1.2, FIRE = 0.8, ACID = 2) + armor_modifiers = list(BLUNT = 1.2, PUNCTURE = 1.2, SLASH = 0, LASER = 0.8, ENERGY = 0.8, BOMB = 0.5, BIO = 1.2, FIRE = 0.8, ACID = 2) sheet_type = /obj/item/stack/sheet/titaniumglass shard_type = /obj/item/shard/titanium - value_per_unit = 0.04 + value_per_unit = ((/datum/material/glass::value_per_unit * 1) + (/datum/material/titanium::value_per_unit * 0.5)) * 1.04 categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/glass=1, /datum/material/titanium=0.5) wall_type = null @@ -140,12 +133,11 @@ color = "#5d3369" greyscale_colors = "#5d3369" alpha = 150 - init_flags = MATERIAL_INIT_MAPLOAD integrity_modifier = 1.1 - armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 1.2, ENERGY = 1.2, BOMB = 0.5, BIO = 1.2, FIRE = 2, ACID = 2) + armor_modifiers = list(BLUNT = 1.2, PUNCTURE = 1.2, SLASH = 0, LASER = 1.2, ENERGY = 1.2, BOMB = 0.5, BIO = 1.2, FIRE = 2, ACID = 2) sheet_type = /obj/item/stack/sheet/plastitaniumglass shard_type = /obj/item/shard/plastitanium - value_per_unit = 0.125 + value_per_unit = (/datum/material/glass::value_per_unit * 1) + (/datum/material/alloy/plastitanium::value_per_unit * 0.5) * 1.2 categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/glass=1, /datum/material/alloy/plastitanium=0.5) @@ -160,20 +152,17 @@ desc = "An extremely dense alloy similar to plasteel in composition. It requires exotic metallurgical processes to create." color = "#6041aa" greyscale_colors = "#6041aa" - init_flags = MATERIAL_INIT_MAPLOAD strength_modifier = 1.5 // It's twice the density of plasteel and just as durable. Getting hit with it is going to HURT. integrity_modifier = 1.5 - armor_modifiers = list(MELEE = 1.4, BULLET = 1.4, LASER = 1.2, ENERGY = 1.2, BOMB = 1.5, BIO = 1.2, FIRE = 1.2, ACID = 1.2) + armor_modifiers = list(BLUNT = 1.4, PUNCTURE = 1.4, SLASH = 0, LASER = 1.2, ENERGY = 1.2, BOMB = 1.5, BIO = 1.2, FIRE = 1.2, ACID = 1.2) sheet_type = /obj/item/stack/sheet/mineral/abductor - value_per_unit = 0.4 + value_per_unit = 1 categories = list(MAT_CATEGORY_RIGID=TRUE, MAT_CATEGORY_BASE_RECIPES=TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) composition = list(/datum/material/iron=2, /datum/material/plasma=2) reinforced_wall_icon = 'icons/turf/walls/solid_wall_reinforced.dmi' wall_name = "hull" hard_wall_decon = TRUE - wall_shine = WALL_SHINE_BOTH - /datum/material/alloy/alien/on_applied_obj(obj/item/target_item, amount, material_flags) . = ..() diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index 700a0d030935..806b4262460e 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -6,7 +6,7 @@ greyscale_colors = "#878687" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/iron - value_per_unit = 0.0025 + value_per_unit = IRON_VALUE_PER_UNIT wall_color = "#57575c" /datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) @@ -24,9 +24,9 @@ integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass shard_type = /obj/item/shard - value_per_unit = 0.0025 + value_per_unit = IRON_VALUE_PER_UNIT * 0.5 beauty_modifier = 0.05 - armor_modifiers = list(MELEE = 0.2, BULLET = 0.2, LASER = 0, ENERGY = 1, BOMB = 0, BIO = 0.2, FIRE = 1, ACID = 0.2) + armor_modifiers = list(BLUNT = 0.2, PUNCTURE = 0.2, SLASH = 0, LASER = 0, ENERGY = 1, BOMB = 0, BIO = 0.2, FIRE = 1, ACID = 0.2) wall_type = null /datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) @@ -46,7 +46,7 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#e3f1f8" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver - value_per_unit = 0.025 + value_per_unit = IRON_VALUE_PER_UNIT * 10 beauty_modifier = 0.075 wall_type = /turf/closed/wall/mineral/silver false_wall_type = /obj/structure/falsewall/silver @@ -64,9 +64,9 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.2 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold - value_per_unit = 0.0625 + value_per_unit = IRON_VALUE_PER_UNIT * 25 beauty_modifier = 0.15 - armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, FIRE = 0.7, ACID = 1.1) + armor_modifiers = list(BLUNT = 1.1, PUNCTURE = 1.1, SLASH = 0, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, FIRE = 0.7, ACID = 1.1) wall_type = /turf/closed/wall/mineral/gold false_wall_type = /obj/structure/falsewall/gold @@ -83,9 +83,9 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond alpha = 132 - value_per_unit = 0.25 + value_per_unit = IRON_VALUE_PER_UNIT * 100 beauty_modifier = 0.3 - armor_modifiers = list(MELEE = 1.3, BULLET = 1.3, LASER = 0.6, ENERGY = 1, BOMB = 1.2, BIO = 1, FIRE = 1, ACID = 1) + armor_modifiers = list(BLUNT = 1.3, PUNCTURE = 1.3, SLASH = 0, LASER = 0.6, ENERGY = 1, BOMB = 1.2, BIO = 1, FIRE = 1, ACID = 1) wall_type = /turf/closed/wall/mineral/diamond false_wall_type = /obj/structure/falsewall/diamond @@ -101,15 +101,13 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = rgb(48, 237, 26) categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium - value_per_unit = 0.05 + value_per_unit = IRON_VALUE_PER_UNIT * 20 beauty_modifier = 0.3 //It shines so beautiful - armor_modifiers = list(MELEE = 1.5, BULLET = 1.4, LASER = 0.5, ENERGY = 0.5, BOMB = 0, BIO = 0, FIRE = 1, ACID = 1) + armor_modifiers = list(BLUNT = 1.5, PUNCTURE = 1.4, SLASH = 0, LASER = 0.5, ENERGY = 0.5, BOMB = 0, BIO = 0, FIRE = 1, ACID = 1) wall_icon = 'icons/turf/walls/stone_wall.dmi' wall_type = /turf/closed/wall/mineral/uranium false_wall_type = /obj/structure/falsewall/uranium - wall_shine = NONE - /datum/material/uranium/on_applied(atom/source, amount, material_flags) . = ..() @@ -142,15 +140,13 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma shard_type = /obj/item/shard/plasma - value_per_unit = 0.1 + value_per_unit = IRON_VALUE_PER_UNIT * 40 beauty_modifier = 0.15 - armor_modifiers = list(MELEE = 1.4, BULLET = 0.7, LASER = 0, ENERGY = 1.2, BOMB = 0, BIO = 1.2, FIRE = 0, ACID = 0.5) + armor_modifiers = list(BLUNT = 1.4, PUNCTURE = 0.7, SLASH = 0, LASER = 0, ENERGY = 1.2, BOMB = 0, BIO = 1.2, FIRE = 0, ACID = 0.5) wall_icon = 'icons/turf/walls/stone_wall.dmi' wall_type = /turf/closed/wall/mineral/plasma false_wall_type = /obj/structure/falsewall/plasma - wall_shine = NONE - /datum/material/plasma/on_applied(atom/source, amount, material_flags) . = ..() if(ismovable(source)) @@ -183,11 +179,6 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 0.15 wall_type = null -/datum/material/bluespace/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.reagents.add_reagent(/datum/reagent/bluespace, rand(5, 8)) - source_item?.reagents?.add_reagent(/datum/reagent/bluespace, source_item.reagents.total_volume*(2/5)) - return TRUE - ///Honks and slips /datum/material/bananium name = "bananium" @@ -196,15 +187,13 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#ffff00" categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium - value_per_unit = 0.5 + value_per_unit = IRON_VALUE_PER_UNIT * 2 beauty_modifier = 0.5 - armor_modifiers = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 0, FIRE = 10, ACID = 0) //Clowns cant be blown away. + armor_modifiers = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 0, FIRE = 10, ACID = 0) //Clowns cant be blown away. wall_icon = 'icons/turf/walls/stone_wall.dmi' wall_type = /turf/closed/wall/mineral/bananium false_wall_type = /obj/structure/falsewall/bananium - wall_shine = NONE - /datum/material/bananium/on_applied(atom/source, amount, material_flags) . = ..() source.LoadComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20) @@ -229,14 +218,12 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 1.3 categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium - value_per_unit = 0.0625 - armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 0.7, ACID = 1) + value_per_unit = IRON_VALUE_PER_UNIT * 25 + armor_modifiers = list(BLUNT = 1.35, PUNCTURE = 1.3, SLASH = 0, LASER = 1.3, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 0.7, ACID = 1) wall_icon = 'icons/turf/walls/metal_wall.dmi' wall_type = /turf/closed/wall/mineral/titanium false_wall_type = /obj/structure/falsewall/titanium - wall_shine = NONE - /datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD) return TRUE @@ -251,7 +238,7 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/runite value_per_unit = 0.3 beauty_modifier = 0.5 - armor_modifiers = list(MELEE = 1.35, BULLET = 2, LASER = 0.5, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 1.4, ACID = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. + armor_modifiers = list(BLUNT = 1.35, PUNCTURE = 2, SLASH = 0, LASER = 0.5, ENERGY = 1.25, BOMB = 1.25, BIO = 1, FIRE = 1.4, ACID = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. /datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD) @@ -266,14 +253,9 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.85 sheet_type = /obj/item/stack/sheet/plastic categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) - value_per_unit = 0.0125 + value_per_unit = IRON_VALUE_PER_UNIT * 5 beauty_modifier = -0.01 - armor_modifiers = list(MELEE = 1.5, BULLET = 1.1, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, FIRE = 1.1, ACID = 1) - -/datum/material/plastic/on_accidental_mat_consumption(mob/living/carbon/eater, obj/item/food) - eater.reagents.add_reagent(/datum/reagent/plastic_polymers, rand(6, 8)) - food?.reagents?.add_reagent(/datum/reagent/plastic_polymers, food.reagents.total_volume*(2/5)) - return TRUE + armor_modifiers = list(BLUNT = 1.5, PUNCTURE = 1.1, SLASH = 0, LASER = 0.3, ENERGY = 0.5, BOMB = 1, BIO = 1, FIRE = 1.1, ACID = 1) ///Force decrease and mushy sound effect. (Not yet implemented) /datum/material/biomass @@ -282,7 +264,7 @@ Unless you know what you're doing, only use the first three numbers. They're in color = "#735b4d" greyscale_colors = "#735b4d" strength_modifier = 0.8 - value_per_unit = 0.025 + value_per_unit = IRON_VALUE_PER_UNIT * 10 /datum/material/wood name = "wood" @@ -292,8 +274,8 @@ Unless you know what you're doing, only use the first three numbers. They're in strength_modifier = 0.5 sheet_type = /obj/item/stack/sheet/mineral/wood categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) - value_per_unit = 0.01 - armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 0.4, ENERGY = 0.4, BOMB = 1, BIO = 0.2, FIRE = 0, ACID = 0.3) + value_per_unit = IRON_VALUE_PER_UNIT * 4 + armor_modifiers = list(BLUNT = 1.1, PUNCTURE = 1.1, SLASH = 0, LASER = 0.4, ENERGY = 0.4, BOMB = 1, BIO = 0.2, FIRE = 0, ACID = 0.3) texture_layer_icon_state = "woodgrain" wall_icon = 'icons/turf/walls/wood_wall.dmi' wall_stripe_icon = 'icons/turf/walls/wood_wall_stripe.dmi' @@ -301,8 +283,6 @@ Unless you know what you're doing, only use the first three numbers. They're in wall_type = /turf/closed/wall/mineral/wood false_wall_type = /obj/structure/falsewall/wood - wall_shine = NONE - /datum/material/wood/on_applied_obj(obj/source, amount, material_flags) . = ..() if(material_flags & MATERIAL_AFFECT_STATISTICS) @@ -322,26 +302,6 @@ Unless you know what you're doing, only use the first three numbers. They're in return TRUE -///Stronk force increase -/datum/material/adamantine - name = "adamantine" - desc = "A powerful material made out of magic, I mean science!" - color = "#6d7e8e" - greyscale_colors = "#6d7e8e" - strength_modifier = 1.5 - categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) - sheet_type = /obj/item/stack/sheet/mineral/adamantine - value_per_unit = 0.25 - beauty_modifier = 0.4 - armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.3, ENERGY = 1.3, BOMB = 1, BIO = 1, FIRE = 2.5, ACID = 1) - wall_icon = 'icons/turf/walls/stone_wall.dmi' - - wall_shine = NONE - -/datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) - victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD) - return TRUE - ///RPG Magic. /datum/material/mythril name = "mythril" @@ -352,12 +312,10 @@ Unless you know what you're doing, only use the first three numbers. They're in sheet_type = /obj/item/stack/sheet/mineral/mythril value_per_unit = 0.75 strength_modifier = 1.2 - armor_modifiers = list(MELEE = 1.5, BULLET = 1.5, LASER = 1.5, ENERGY = 1.5, BOMB = 1.5, BIO = 1.5, FIRE = 1.5, ACID = 1.5) + armor_modifiers = list(BLUNT = 1.5, PUNCTURE = 1.5, SLASH = 0, LASER = 1.5, ENERGY = 1.5, BOMB = 1.5, BIO = 1.5, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.5 wall_icon = 'icons/turf/walls/stone_wall.dmi' - wall_shine = NONE - /datum/material/mythril/on_applied_obj(atom/source, amount, material_flags) . = ..() if(istype(source, /obj/item)) @@ -408,7 +366,7 @@ Unless you know what you're doing, only use the first three numbers. They're in value_per_unit = 0.35 beauty_modifier = 0.35 strength_modifier = 1.2 - armor_modifiers = list(MELEE = 1.35, BULLET = 1.3, LASER = 1.3, ENERGY = 1.25, BOMB = 0.7, BIO = 1, FIRE = 1.3, ACID = 1) + armor_modifiers = list(BLUNT = 1.35, PUNCTURE = 1.3, SLASH = 0, LASER = 1.3, ENERGY = 1.25, BOMB = 0.7, BIO = 1, FIRE = 1.3, ACID = 1) /datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD) @@ -422,17 +380,15 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#EDC9AF" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/sandblock - value_per_unit = 0.001 + value_per_unit = 0 strength_modifier = 0.5 integrity_modifier = 0.1 - armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 1.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 1.5, ACID = 1.5) + armor_modifiers = list(BLUNT = 0.25, PUNCTURE = 0.25, SLASH = 0, LASER = 1.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.25 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" wall_icon = 'icons/turf/walls/stone_wall.dmi' - wall_shine = NONE - /datum/material/sand/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.adjust_disgust(17) return TRUE @@ -445,14 +401,12 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#B77D31" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/sandstone - value_per_unit = 0.0025 - armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 1.25, ENERGY = 0.5, BOMB = 0.5, BIO = 0.25, FIRE = 1.5, ACID = 1.5) + value_per_unit = 0 + armor_modifiers = list(BLUNT = 0.5, PUNCTURE = 0.5, SLASH = 0, LASER = 1.25, ENERGY = 0.5, BOMB = 0.5, BIO = 0.25, FIRE = 1.5, ACID = 1.5) turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "brick" wall_icon = 'icons/turf/walls/stone_wall.dmi' - wall_shine = NONE - /datum/material/snow name = "snow" desc = "There's no business like snow business." @@ -460,14 +414,12 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#FFFFFF" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/snow - value_per_unit = 0.0025 - armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 0.25, ACID = 1.5) + value_per_unit = 0 + armor_modifiers = list(BLUNT = 0.25, PUNCTURE = 0.25, SLASH = 0, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 0.25, ACID = 1.5) turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "sand" wall_icon = 'icons/turf/walls/stone_wall.dmi' - wall_shine = NONE - /datum/material/snow/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.reagents.add_reagent(/datum/reagent/water, rand(5, 10)) return TRUE @@ -479,13 +431,11 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#3C3434" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/runed_metal - value_per_unit = 0.75 - armor_modifiers = list(MELEE = 1.2, BULLET = 1.2, LASER = 1, ENERGY = 1, BOMB = 1.2, BIO = 1.2, FIRE = 1.5, ACID = 1.5) + value_per_unit = 0 + armor_modifiers = list(BLUNT = 1.2, PUNCTURE = 1.2, SLASH = 0, LASER = 1, ENERGY = 1, BOMB = 1.2, BIO = 1.2, FIRE = 1.5, ACID = 1.5) texture_layer_icon_state = "runed" wall_icon = 'icons/turf/walls/cult_wall.dmi' - wall_shine = NONE - /datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) victim.reagents.add_reagent(/datum/reagent/fuel/unholywater, rand(8, 12)) victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD) @@ -498,8 +448,8 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#92661A" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/bronze - value_per_unit = 0.025 - armor_modifiers = list(MELEE = 1, BULLET = 1, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5) + value_per_unit = IRON_VALUE_PER_UNIT * 10 + armor_modifiers = list(BLUNT = 1, PUNCTURE = 1, SLASH = 0, LASER = 1, ENERGY = 1, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5) beauty_modifier = 0.2 /datum/material/paper @@ -509,8 +459,8 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#E5DCD5" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/paperframes - value_per_unit = 0.0025 - armor_modifiers = list(MELEE = 0.1, BULLET = 0.1, LASER = 0.1, ENERGY = 0.1, BOMB = 0.1, BIO = 0.1, FIRE = 0, ACID = 1.5) + value_per_unit = 0 + armor_modifiers = list(BLUNT = 0.1, PUNCTURE = 0.1, SLASH = 0, LASER = 0.1, ENERGY = 0.1, BOMB = 0.1, BIO = 0.1, FIRE = 0, ACID = 1.5) beauty_modifier = 0.3 turf_sound_override = FOOTSTEP_SAND texture_layer_icon_state = "paper" @@ -535,13 +485,11 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#5F625C" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/cardboard - value_per_unit = 0.003 - armor_modifiers = list(MELEE = 0.25, BULLET = 0.25, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 0, ACID = 1.5) + value_per_unit = IRON_VALUE_PER_UNIT * 0.25 + armor_modifiers = list(BLUNT = 0.25, PUNCTURE = 0.25, SLASH = 0, LASER = 0.25, ENERGY = 0.25, BOMB = 0.25, BIO = 0.25, FIRE = 0, ACID = 1.5) beauty_modifier = -0.1 wall_icon = 'icons/turf/walls/stone_wall.dmi' - wall_shine = NONE - /datum/material/cardboard/on_applied_obj(obj/source, amount, material_flags) . = ..() if(material_flags & MATERIAL_AFFECT_STATISTICS) @@ -562,8 +510,8 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#e3dac9" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/bone - value_per_unit = 0.05 - armor_modifiers = list(MELEE = 1.2, BULLET = 0.75, LASER = 0.75, ENERGY = 1.2, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5) + value_per_unit = IRON_VALUE_PER_UNIT * 2 + armor_modifiers = list(BLUNT = 1.2, PUNCTURE = 0.75, SLASH = 0, LASER = 0.75, ENERGY = 1.2, BOMB = 1, BIO = 1, FIRE = 1.5, ACID = 1.5) beauty_modifier = -0.2 /datum/material/bamboo @@ -573,8 +521,8 @@ Unless you know what you're doing, only use the first three numbers. They're in greyscale_colors = "#87a852" categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/bamboo - value_per_unit = 0.0025 - armor_modifiers = list(MELEE = 0.5, BULLET = 0.5, LASER = 0.5, ENERGY = 0.5, BOMB = 0.5, BIO = 0.51, FIRE = 0.5, ACID = 1.5) + value_per_unit = IRON_VALUE_PER_UNIT + armor_modifiers = list(BLUNT = 0.5, PUNCTURE = 0.5, SLASH = 0, LASER = 0.5, ENERGY = 0.5, BOMB = 0.5, BIO = 0.51, FIRE = 0.5, ACID = 1.5) beauty_modifier = 0.2 turf_sound_override = FOOTSTEP_WOOD texture_layer_icon_state = "bamboo" @@ -587,7 +535,7 @@ Unless you know what you're doing, only use the first three numbers. They're in categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) sheet_type = /obj/item/stack/sheet/mineral/zaukerite value_per_unit = 0.45 - armor_modifiers = list(MELEE = 0.9, BULLET = 0.9, LASER = 1.75, ENERGY = 1.75, BOMB = 0.5, BIO = 1, FIRE = 0.1, ACID = 1) + armor_modifiers = list(BLUNT = 0.9, PUNCTURE = 0.9, SLASH = 0, LASER = 1.75, ENERGY = 1.75, BOMB = 0.5, BIO = 1, FIRE = 0.1, ACID = 1) beauty_modifier = 0.001 /datum/material/zaukerite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item) diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm index 431b96f188d5..005e2c7632bd 100644 --- a/code/datums/materials/hauntium.dm +++ b/code/datums/materials/hauntium.dm @@ -10,7 +10,7 @@ beauty_modifier = 0.25 //pretty good but only the undead can actually make use of these modifiers strength_modifier = 1.2 - armor_modifiers = list(MELEE = 1.1, BULLET = 1.1, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, FIRE = 1, ACID = 0.7) + armor_modifiers = list(BLUNT = 1.1, PUNCTURE = 1.1, SLASH = 0, LASER = 1.15, ENERGY = 1.15, BOMB = 1, BIO = 1, FIRE = 1, ACID = 0.7) /datum/material/hauntium/on_applied_obj(obj/o, amount, material_flags) . = ..() diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm index a2f2a968a6b3..722b6292d6ce 100644 --- a/code/datums/materials/meat.dm +++ b/code/datums/materials/meat.dm @@ -3,6 +3,7 @@ name = "meat" desc = "Meat" id = /datum/material/meat // So the bespoke versions are categorized under this + color = rgb(214, 67, 67) greyscale_colors = rgb(214, 67, 67) categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE, MAT_CATEGORY_ITEM_MATERIAL=TRUE) @@ -10,7 +11,7 @@ value_per_unit = 0.05 beauty_modifier = -0.3 strength_modifier = 0.7 - armor_modifiers = list(MELEE = 0.3, BULLET = 0.3, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, FIRE = 1, ACID = 1) + armor_modifiers = list(BLUNT = 0.3, PUNCTURE = 0.3, SLASH = 0, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, FIRE = 1, ACID = 1) item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "meat" @@ -34,7 +35,7 @@ /datum/material/meat/mob_meat - init_flags = MATERIAL_INIT_BESPOKE + bespoke = TRUE var/subjectname = "" var/subjectjob = null @@ -42,7 +43,7 @@ if(!istype(source)) return FALSE - name = "[source?.name ? "[source.name]'s" : "mystery"] [initial(name)]" + name = "[source.name ? "[source.name]'s" : "mystery"] [initial(name)]" if(source.real_name) subjectname = source.real_name @@ -56,7 +57,7 @@ return ..() /datum/material/meat/species_meat - init_flags = MATERIAL_INIT_BESPOKE + bespoke = TRUE /datum/material/meat/species_meat/Initialize(_id, datum/species/source) if(!istype(source)) diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm index 35f311dcf502..527d20d23203 100644 --- a/code/datums/materials/pizza.dm +++ b/code/datums/materials/pizza.dm @@ -8,7 +8,7 @@ value_per_unit = 0.05 beauty_modifier = 0.1 strength_modifier = 0.7 - armor_modifiers = list(MELEE = 0.3, BULLET = 0.3, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, FIRE = 1, ACID = 1) + armor_modifiers = list(BLUNT = 0.3, PUNCTURE = 0.3, SLASH = 0, LASER = 1.2, ENERGY = 1.2, BOMB = 0.3, BIO = 0, FIRE = 1, ACID = 1) item_sound_override = 'sound/effects/meatslap.ogg' turf_sound_override = FOOTSTEP_MEAT texture_layer_icon_state = "pizza" diff --git a/code/datums/memory/memory.dm b/code/datums/memory/memory.dm index 9a0bd0576ab5..e85f6435b024 100644 --- a/code/datums/memory/memory.dm +++ b/code/datums/memory/memory.dm @@ -52,18 +52,12 @@ /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/carp/ranged, /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, /mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/morph, - /mob/living/basic/stickman, - /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/dog/corgi, @@ -102,26 +96,6 @@ var/list/story_moods - - var/victim_mood = extra_info[DETAIL_PROTAGONIST_MOOD] - - if(victim_mood != MOODLESS_MEMORY) //How the victim felt when it all happend. - switch(victim_mood) - if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD2) - story_moods = strings(MEMORY_FILE, "sad") - if("[action]_sad" in GLOB.string_cache[MEMORY_FILE]) - story_moods += strings(MEMORY_FILE, "[action]_sad") - if(MOOD_LEVEL_SAD2 to MOOD_LEVEL_HAPPY2) - story_moods = strings(MEMORY_FILE, "neutral") - if("[action]_neutral" in GLOB.string_cache[MEMORY_FILE]) - story_moods += strings(MEMORY_FILE, "[action]_neutral") - if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY4) - story_moods = strings(MEMORY_FILE, "happy") - if("[action]_happy" in GLOB.string_cache[MEMORY_FILE]) - story_moods += strings(MEMORY_FILE, "[action]_happy") - - - //storybuilding //The forewords for this specific type of story (E.g. This engraving depicts) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index cf85c72257ed..fc949857b93b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -50,12 +50,15 @@ var/datum/martial_art/martial_art var/static/default_martial_art = new/datum/martial_art var/miming = FALSE // Mime's vow of silence + var/list/antag_datums - var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state - var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud = null //this mind's antag HUD + ///this mind's antag HUD + var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud = null + var/holy_role = NONE //is this person a chaplain or admin role allowed to use bibles, Any rank besides 'NONE' allows for this. - var/mob/living/enslaved_to //If this mind's master is another mob (i.e. adamantine golems) + ///If this mind's master is another mob (i.e. adamantine golems) + var/mob/living/enslaved_to var/datum/language_holder/language_holder var/unconvertable = FALSE var/late_joiner = FALSE @@ -130,6 +133,7 @@ set_current(null) /datum/mind/proc/get_language_holder() + RETURN_TYPE(/datum/language_holder) if(!language_holder) language_holder = new (src) return language_holder @@ -153,24 +157,40 @@ var/mob/living/old_current = current if(current) current.transfer_observers_to(new_character) //transfer anyone observing the old character to the new one + set_current(new_character) //associate ourself with our new body QDEL_NULL(antag_hud) + new_character.mind = src //and associate our new body with ourself - antag_hud = new_character.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/antagonist_hud, "combo_hud", src) + + antag_hud = new_character.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/antagonist_hud, "combo_hud", current, src) + for(var/a in antag_datums) //Makes sure all antag datums effects are applied in the new body var/datum/antagonist/A = a A.on_body_transfer(old_current, current) + if(iscarbon(new_character)) var/mob/living/carbon/C = new_character C.last_mind = src + transfer_martial_arts(new_character) + + // If the new mob is immune to addictions, cure them all. + if(HAS_TRAIT(new_character, TRAIT_NO_ADDICTION)) + for(var/addiction_type in subtypesof(/datum/addiction)) + remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) + RegisterSignal(new_character, COMSIG_LIVING_DEATH, PROC_REF(set_death_time)) + if(active || force_key_move) new_character.key = key //now transfer the key to link the client to our new body + if(new_character.client) LAZYCLEARLIST(new_character.client.recent_examines) new_character.client.init_verbs() // re-initialize character specific verbs + current.update_atom_languages() + SEND_SIGNAL(src, COMSIG_MIND_TRANSFERRED, old_current) SEND_SIGNAL(current, COMSIG_MOB_MIND_TRANSFERRED_INTO) @@ -414,7 +434,7 @@ if(implant) var/obj/item/implant/uplink/starting/new_implant = new(traitor_mob) - new_implant.implant(traitor_mob, null, silent = TRUE) + new_implant.implant(traitor_mob, null, BODY_ZONE_CHEST, silent = TRUE) if(!silent) to_chat(traitor_mob, span_boldnotice("Your Syndicate Uplink has been cunningly implanted in you, for a small TC fee. Simply trigger the uplink to access it.")) return new_implant @@ -426,6 +446,9 @@ CRASH("Uplink creation failed.") new_uplink.setup_unlock_code() new_uplink.uplink_handler.owner = traitor_mob.mind + if(isturf(new_uplink.uplink_handler)) + stack_trace("what") + new_uplink.uplink_handler.assigned_role = traitor_mob.mind.assigned_role.title new_uplink.uplink_handler.assigned_species = traitor_mob.dna.species.id if(uplink_loc == R) @@ -712,7 +735,7 @@ log_admin("[key_name(usr)] gave [current] an uplink.") else if (href_list["obj_announce"]) - announce_objectives() + announce_objectives(TRUE) //Something in here might have changed your mob if(self_antagging && (!usr || !usr.client) && current.client) @@ -726,12 +749,31 @@ all_objectives |= A.objectives return all_objectives -/datum/mind/proc/announce_objectives() +/// Prints the objectives to the mind's owner. If loudly is true, instead open a window. +/datum/mind/proc/announce_objectives(loudly) + set waitfor = FALSE var/obj_count = 1 - to_chat(current, span_notice("Your current objectives:")) - for(var/datum/objective/objective as anything in get_all_objectives()) - to_chat(current, "[objective.objective_name] #[obj_count]: [objective.explanation_text]") - obj_count++ + if(!loudly) + var/list/objectives = get_all_objectives() + if(!length(objectives)) + return + + to_chat(current, span_notice("Your current objectives:")) + for(var/datum/objective/objective as anything in get_all_objectives()) + to_chat(current, "[objective.objective_name] #[obj_count]: [objective.explanation_text]") + obj_count++ + else + var/list/content = list("
") + content +="

Your objectives may have been changed!



" + for(var/datum/objective/objective as anything in get_all_objectives()) + content += "[objective.objective_name] #[obj_count]: [objective.explanation_text]

" + obj_count++ + + content += "
" + var/datum/browser/popup = new(current, "Objectives", "Objectives", 700, 300) + popup.set_window_options("can_close=1;can_minimize=10;can_maximize=0;can_resize=0;titlebar=1;") + popup.set_content(jointext(content, "")) + popup.open(current) /datum/mind/proc/find_syndicate_uplink(check_unlocked) var/list/L = current.get_all_contents() @@ -779,14 +821,6 @@ special_role = ROLE_WIZARD add_antag_datum(/datum/antagonist/wizard) - -/datum/mind/proc/make_rev() - var/datum/antagonist/rev/head/head = new() - head.give_flash = TRUE - head.give_hud = TRUE - add_antag_datum(head) - special_role = ROLE_REV_HEAD - /datum/mind/proc/transfer_martial_arts(mob/living/new_character) if(!ishuman(new_character)) return @@ -832,6 +866,8 @@ ///Adds addiction points to the specified addiction /datum/mind/proc/add_addiction_points(type, amount) + if(current && HAS_TRAIT(current, TRAIT_NO_ADDICTION)) + return LAZYSET(addiction_points, type, min(LAZYACCESS(addiction_points, type) + amount, MAX_ADDICTION_POINTS)) var/datum/addiction/affected_addiction = SSaddiction.all_addictions[type] return affected_addiction.on_gain_addiction_points(src) @@ -852,13 +888,6 @@ . = assigned_role assigned_role = new_role -/// Simple proc to make someone become contractor support -/datum/mind/proc/make_contractor_support() - if(has_antag_datum(/datum/antagonist/traitor/contractor_support)) - return - add_antag_datum(/datum/antagonist/traitor/contractor_support) - - /mob/dead/new_player/sync_mind() return diff --git a/code/datums/mood_events/_mood_event.dm b/code/datums/mood_events/_mood_event.dm deleted file mode 100644 index 9517cb1ed442..000000000000 --- a/code/datums/mood_events/_mood_event.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/mood_event - var/description - var/mood_change = 0 - var/timeout = 0 - var/hidden = FALSE//Not shown on examine - var/category //string of what category this mood was added in as - var/special_screen_obj //if it isn't null, it will replace or add onto the mood icon with this (same file). see happiness drug for example - var/special_screen_replace = TRUE //if false, it will be an overlay instead - var/mob/owner - -/datum/mood_event/New(mob/M, ...) - owner = M - var/list/params = args.Copy(2) - add_effects(arglist(params)) - -/datum/mood_event/Destroy() - remove_effects() - owner = null - return ..() - -/datum/mood_event/proc/add_effects(param) - return - -/datum/mood_event/proc/remove_effects() - return diff --git a/code/datums/mood_events/area_events.dm b/code/datums/mood_events/area_events.dm deleted file mode 100644 index 2a8cf98a2654..000000000000 --- a/code/datums/mood_events/area_events.dm +++ /dev/null @@ -1,17 +0,0 @@ -/** Use this type of mood event for a location a player visits - * - * /area/ - * var/mood_bonus // Bonus mood for being in this area - * var/mood_message // Mood message for being here, only shows up if mood_bonus != 0 - * var/mood_trait // Does the mood bonus require a trait? - * - * Do not put any /area/ types in this file location! - **/ - -/datum/mood_event/area - description = "" //Fill this out in the area - mood_change = 0 - -/datum/mood_event/area/add_effects(_mood_change, _description) - mood_change = _mood_change - description = _description diff --git a/code/datums/mood_events/beauty_events.dm b/code/datums/mood_events/beauty_events.dm deleted file mode 100644 index 31e199c47e18..000000000000 --- a/code/datums/mood_events/beauty_events.dm +++ /dev/null @@ -1,19 +0,0 @@ -/datum/mood_event/horridroom - description = "This room looks terrible!" - mood_change = -5 - -/datum/mood_event/badroom - description = "This room looks really bad." - mood_change = -3 - -/datum/mood_event/decentroom - description = "This room looks alright." - mood_change = 1 - -/datum/mood_event/goodroom - description = "This room looks really pretty!" - mood_change = 3 - -/datum/mood_event/greatroom - description = "This room is beautiful!" - mood_change = 5 diff --git a/code/datums/mood_events/drink_events.dm b/code/datums/mood_events/drink_events.dm deleted file mode 100644 index 8e1687076014..000000000000 --- a/code/datums/mood_events/drink_events.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/mood_event/drunk - mood_change = 3 - description = "Everything just feels better after a drink or two." - -/datum/mood_event/drunk/add_effects(param) - // Display blush visual - ADD_TRAIT(owner, TRAIT_BLUSHING, "[type]") - owner.update_body() - -/datum/mood_event/drunk/remove_effects() - // Stop displaying blush visual - REMOVE_TRAIT(owner, TRAIT_BLUSHING, "[type]") - owner.update_body() - -/datum/mood_event/quality_nice - description = "That drink wasn't bad at all." - mood_change = 2 - timeout = 7 MINUTES - -/datum/mood_event/quality_good - description = "That drink was pretty good." - mood_change = 4 - timeout = 7 MINUTES - -/datum/mood_event/quality_verygood - description = "That drink was great!" - mood_change = 6 - timeout = 7 MINUTES - -/datum/mood_event/quality_fantastic - description = "That drink was amazing!" - mood_change = 8 - timeout = 7 MINUTES - -/datum/mood_event/amazingtaste - description = "Amazing taste!" - mood_change = 50 - timeout = 10 MINUTES diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm deleted file mode 100644 index 66518199122f..000000000000 --- a/code/datums/mood_events/drug_events.dm +++ /dev/null @@ -1,109 +0,0 @@ -/datum/mood_event/high - mood_change = 6 - description = "Woooow duudeeeeee... I'm tripping baaalls..." - -/datum/mood_event/stoned - mood_change = 6 - description = "I'm sooooo stooooooooooooned..." - -/datum/mood_event/smoked - description = "I have had a smoke recently." - mood_change = 2 - timeout = 6 MINUTES - -/datum/mood_event/wrong_brand - description = "I hate that brand of cigarettes." - mood_change = -2 - timeout = 6 MINUTES - -/datum/mood_event/overdose - mood_change = -8 - timeout = 5 MINUTES - -/datum/mood_event/overdose/add_effects(drug_name) - description = "I think I took a bit too much of that [drug_name]!" - -/datum/mood_event/withdrawal_light - mood_change = -2 - -/datum/mood_event/withdrawal_light/add_effects(drug_name) - description = "I could use some [drug_name]..." - -/datum/mood_event/withdrawal_medium - mood_change = -5 - -/datum/mood_event/withdrawal_medium/add_effects(drug_name) - description = "I really need [drug_name]." - -/datum/mood_event/withdrawal_severe - mood_change = -8 - -/datum/mood_event/withdrawal_severe/add_effects(drug_name) - description = "Oh god, I need some of that [drug_name]!" - -/datum/mood_event/withdrawal_critical - mood_change = -10 - -/datum/mood_event/withdrawal_critical/add_effects(drug_name) - description = "[drug_name]! [drug_name]! [drug_name]!" - -/datum/mood_event/happiness_drug - description = "Can't feel a thing..." - mood_change = 50 - -/datum/mood_event/happiness_drug_good_od - description = "YES! YES!! YES!!!" - mood_change = 100 - timeout = 30 SECONDS - special_screen_obj = "mood_happiness_good" - -/datum/mood_event/happiness_drug_bad_od - description = "NO! NO!! NO!!!" - mood_change = -100 - timeout = 30 SECONDS - special_screen_obj = "mood_happiness_bad" - -/datum/mood_event/narcotic_medium - description = "I feel comfortably numb." - mood_change = 4 - timeout = 3 MINUTES - -/datum/mood_event/narcotic_heavy - description = "I feel like I'm wrapped up in cotton!" - mood_change = 9 - timeout = 3 MINUTES - -/datum/mood_event/stimulant_medium - description = "I have so much energy! I feel like I could do anything!" - mood_change = 4 - timeout = 3 MINUTES - -/datum/mood_event/stimulant_heavy - description = "Eh ah AAAAH! HA HA HA HA HAA! Uuuh." - mood_change = 6 - timeout = 3 MINUTES - -#define EIGENTRIP_MOOD_RANGE 10 - -/datum/mood_event/eigentrip - description = "I swapped places with an alternate reality version of myself!" - mood_change = 0 - timeout = 10 MINUTES - -/datum/mood_event/eigentrip/add_effects(param) - var/value = rand(-EIGENTRIP_MOOD_RANGE,EIGENTRIP_MOOD_RANGE) - mood_change = value - if(value < 0) - description = "I swapped places with an alternate reality version of myself! I want to go home!" - else - description = "I swapped places with an alternate reality version of myself! Though, this place is much better than my old life." - -#undef EIGENTRIP_MOOD_RANGE - -/datum/mood_event/nicotine_withdrawal_moderate - description = "Haven't had a smoke in a while. Feeling a little on edge... " - mood_change = -5 - -/datum/mood_event/nicotine_withdrawal_severe - description = "Head pounding. Cold sweating. Feeling anxious. Need a smoke to calm down!" - mood_change = -8 diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm deleted file mode 100644 index 050ff5ca1692..000000000000 --- a/code/datums/mood_events/generic_negative_events.dm +++ /dev/null @@ -1,376 +0,0 @@ -/datum/mood_event/handcuffed - description = "I guess my antics have finally caught up with me." - mood_change = -1 - -/datum/mood_event/broken_vow //Used for when mimes break their vow of silence - description = "I have brought shame upon my name, and betrayed my fellow mimes by breaking our sacred vow..." - mood_change = -8 - -/datum/mood_event/on_fire - description = "I'M ON FIRE!!!" - mood_change = -12 - -/datum/mood_event/suffocation - description = "CAN'T... BREATHE..." - mood_change = -12 - -/datum/mood_event/burnt_thumb - description = "I shouldn't play with lighters..." - mood_change = -1 - timeout = 2 MINUTES - -/datum/mood_event/cold - description = "It's way too cold in here." - mood_change = -5 - -/datum/mood_event/hot - description = "It's getting hot in here." - mood_change = -5 - -/datum/mood_event/creampie - description = "I've been creamed. Tastes like pie flavor." - mood_change = -2 - timeout = 3 MINUTES - -/datum/mood_event/slipped - description = "I slipped. I should be more careful next time..." - mood_change = -2 - timeout = 3 MINUTES - -/datum/mood_event/eye_stab - description = "I used to be an adventurer like you, until I took a screwdriver to the eye." - mood_change = -4 - timeout = 3 MINUTES - -/datum/mood_event/delam //SM delamination - description = "Those goddamn engineers can't do anything right..." - mood_change = -2 - timeout = 4 MINUTES - -/datum/mood_event/depression_minimal - description = "I feel a bit down." - mood_change = -10 - timeout = 2 MINUTES - -/datum/mood_event/depression_mild - description = "I feel sad for no particular reason." - mood_change = -12 - timeout = 2 MINUTES - -/datum/mood_event/depression_moderate - description = "I feel miserable." - mood_change = -14 - timeout = 2 MINUTES - -/datum/mood_event/depression_severe - description = "I've lost all hope." - mood_change = -16 - timeout = 2 MINUTES - -/datum/mood_event/shameful_suicide //suicide_acts that return SHAME, like sord - description = "I can't even end it all!" - mood_change = -15 - timeout = 60 SECONDS - -/datum/mood_event/dismembered - description = "AHH! I WAS USING THAT LIMB!" - mood_change = -10 - timeout = 8 MINUTES - -/datum/mood_event/tased - description = "There's no \"z\" in \"taser\". It's in the zap." - mood_change = -3 - timeout = 2 MINUTES - -/datum/mood_event/embedded - description = "Pull it out!" - mood_change = -7 - -/datum/mood_event/table - description = "Someone threw me on a table!" - mood_change = -2 - timeout = 2 MINUTES - -/datum/mood_event/table/add_effects() - if(isfelinid(owner)) //Holy snowflake batman! - var/mob/living/carbon/human/H = owner - SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS) - description = "They want to play on the table!" - mood_change = 2 - -/datum/mood_event/table_limbsmash - description = "That fucking table, man that hurts..." - mood_change = -3 - timeout = 3 MINUTES - -/datum/mood_event/table_limbsmash/add_effects(obj/item/bodypart/banged_limb) - if(banged_limb) - description = "My fucking [banged_limb.name], man that hurts..." - -/datum/mood_event/brain_damage - mood_change = -3 - -/datum/mood_event/brain_damage/add_effects() - var/damage_message = pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage") - description = "Hurr durr... [damage_message]" - -/datum/mood_event/hulk //Entire duration of having the hulk mutation - description = "HULK SMASH!" - mood_change = -4 - -/datum/mood_event/epilepsy //Only when the mutation causes a seizure - description = "I should have paid attention to the epilepsy warning." - mood_change = -3 - timeout = 5 MINUTES - -/datum/mood_event/nyctophobia - description = "It sure is dark around here..." - mood_change = -3 - -/datum/mood_event/claustrophobia - description = "Why do I feel trapped?! Let me out!!!" - mood_change = -7 - timeout = 1 MINUTES - -/datum/mood_event/bright_light - description = "I hate it in the light...I need to find a darker place..." - mood_change = -12 - -/datum/mood_event/family_heirloom_missing - description = "I'm missing my family heirloom..." - mood_change = -4 - -/datum/mood_event/healsbadman - description = "I feel like I'm held together by flimsy string, and could fall apart at any moment!" - mood_change = -4 - timeout = 2 MINUTES - -/datum/mood_event/jittery - description = "I'm nervous and on edge and I can't stand still!!" - mood_change = -2 - -/datum/mood_event/vomit - description = "I just threw up. Gross." - mood_change = -2 - timeout = 2 MINUTES - -/datum/mood_event/vomitself - description = "I just threw up all over myself. This is disgusting." - mood_change = -4 - timeout = 3 MINUTES - -/datum/mood_event/painful_medicine - description = "Medicine may be good for me but right now it stings like hell." - mood_change = -5 - timeout = 60 SECONDS - -/datum/mood_event/spooked - description = "The rattling of those bones... It still haunts me." - mood_change = -4 - timeout = 4 MINUTES - -/datum/mood_event/loud_gong - description = "That loud gong noise really hurt my ears!" - mood_change = -3 - timeout = 2 MINUTES - -/datum/mood_event/notcreeping - description = "The voices are not happy, and they painfully contort my thoughts into getting back on task." - mood_change = -6 - timeout = 3 SECONDS - hidden = TRUE - -/datum/mood_event/notcreepingsevere//not hidden since it's so severe - description = "THEY NEEEEEEED OBSESSIONNNN!!" - mood_change = -30 - timeout = 3 SECONDS - -/datum/mood_event/notcreepingsevere/add_effects(name) - var/list/unstable = list(name) - for(var/i in 1 to rand(3,5)) - unstable += copytext_char(name, -1) - var/unhinged = uppertext(unstable.Join(""))//example Tinea Luxor > TINEA LUXORRRR (with randomness in how long that slur is) - description = "THEY NEEEEEEED [unhinged]!!" - -/datum/mood_event/sapped - description = "Some unexplainable sadness is consuming me..." - mood_change = -15 - timeout = 90 SECONDS - -/datum/mood_event/back_pain - description = "Bags never sit right on my back, this hurts like hell!" - mood_change = -15 - -/datum/mood_event/sad_empath - description = "Someone seems upset..." - mood_change = -1 - timeout = 60 SECONDS - -/datum/mood_event/sad_empath/add_effects(mob/sadtarget) - description = "[sadtarget.name] seems upset..." - -/datum/mood_event/sacrifice_bad - description = "Those darn savages!" - mood_change = -5 - timeout = 2 MINUTES - -/datum/mood_event/artbad - description = "I've produced better art than that from my ass." - mood_change = -2 - timeout = 2 MINUTES - -/datum/mood_event/graverobbing - description = "I just desecrated someone's grave... I can't believe I did that..." - mood_change = -8 - timeout = 3 MINUTES - -/datum/mood_event/deaths_door - description = "This is it... I'm really going to die." - mood_change = -20 - -/datum/mood_event/gunpoint - description = "This guy is insane! I better be careful..." - mood_change = -10 - -/datum/mood_event/tripped - description = "I can't believe I fell for the oldest trick in the book!" - mood_change = -5 - timeout = 2 MINUTES - -/datum/mood_event/untied - description = "I hate when my shoes come untied!" - mood_change = -3 - timeout = 60 SECONDS - -/datum/mood_event/gates_of_mansus - description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!" - mood_change = -25 - timeout = 4 MINUTES - -/datum/mood_event/high_five_alone - description = "I tried getting a high-five with no one around, how embarassing!" - mood_change = -2 - timeout = 60 SECONDS - -/datum/mood_event/high_five_full_hand - description = "Oh god, I don't even know how to high-five correctly..." - mood_change = -1 - timeout = 45 SECONDS - -/datum/mood_event/left_hanging - description = "But everyone loves high fives! Maybe people just... hate me?" - mood_change = -2 - timeout = 90 SECONDS - -/datum/mood_event/too_slow - description = "NO! HOW COULD I BE... TOO SLOW???" - mood_change = -2 // multiplied by how many people saw it happen, up to 8, so potentially massive. the ULTIMATE prank carries a lot of weight - timeout = 2 MINUTES - -/datum/mood_event/too_slow/add_effects(param) - var/people_laughing_at_you = 1 // start with 1 in case they're on the same tile or something - for(var/mob/living/carbon/iter_carbon in oview(owner, 7)) - if(iter_carbon.stat == CONSCIOUS) - people_laughing_at_you++ - if(people_laughing_at_you > 7) - break - - mood_change *= people_laughing_at_you - return ..() - -//These are unused so far but I want to remember them to use them later -/datum/mood_event/surgery - description = "THEY'RE CUTTING ME OPEN!!" - mood_change = -8 - -/datum/mood_event/bald - description = "I need something to cover my head..." - mood_change = -3 - -/datum/mood_event/bad_touch - description = "I don't like when people touch me." - mood_change = -3 - timeout = 4 MINUTES - -/datum/mood_event/very_bad_touch - description = "I really don't like when people touch me." - mood_change = -5 - timeout = 4 MINUTES - -/datum/mood_event/noogie - description = "Ow! This is like space high school all over again..." - mood_change = -2 - timeout = 60 SECONDS - -/datum/mood_event/noogie_harsh - description = "OW!! That was even worse than a regular noogie!" - mood_change = -4 - timeout = 60 SECONDS - -/datum/mood_event/aquarium_negative - description = "All the fish are dead..." - mood_change = -3 - timeout = 90 SECONDS - -/datum/mood_event/tail_lost - description = "My tail!! Why?!" - mood_change = -8 - timeout = 10 MINUTES - -/datum/mood_event/tail_balance_lost - description = "I feel off-balance without my tail." - mood_change = -2 - -/datum/mood_event/tail_regained_right - description = "My tail is back, but that was traumatic..." - mood_change = -2 - timeout = 5 MINUTES - -/datum/mood_event/tail_regained_wrong - description = "Is this some kind of sick joke?! This is NOT the right tail." - mood_change = -12 // -8 for tail still missing + -4 bonus for being frakenstein's monster - timeout = 5 MINUTES - -/datum/mood_event/burnt_wings - description = "MY PRECIOUS WINGS!!" - mood_change = -10 - timeout = 10 MINUTES - -/datum/mood_event/holy_smite //punished - description = "I have been punished by my deity!" - mood_change = -5 - timeout = 5 MINUTES - -/datum/mood_event/banished //when the chaplain is sus! (and gets forcably de-holy'd) - description = "I have been excommunicated!" - mood_change = -10 - timeout = 10 MINUTES - -/datum/mood_event/heresy - description = "I can hardly breathe with all this HERESY going on!" - mood_change = -5 - timeout = 5 MINUTES - -/datum/mood_event/soda_spill - description = "Cool! That's fine, I wanted to wear that soda, not drink it..." - mood_change = -2 - timeout = 1 MINUTES - -/datum/mood_event/watersprayed - description = "I hate being sprayed with water!" - mood_change = -1 - timeout = 30 SECONDS - -/datum/mood_event/gamer_withdrawal - description = "I wish I was gaming right now..." - mood_change = -5 - -/datum/mood_event/gamer_lost - description = "If I'm not good at video games, can I truly call myself a gamer?" - mood_change = -10 - timeout = 10 MINUTES - -/datum/mood_event/lost_52_card_pickup - description = "This is really embarrassing! I'm ashamed to pick up all these cards off the floor..." - mood_change = -3 - timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm deleted file mode 100644 index ea7561fcf1f8..000000000000 --- a/code/datums/mood_events/generic_positive_events.dm +++ /dev/null @@ -1,290 +0,0 @@ -/datum/mood_event/hug - description = "Hugs are nice." - mood_change = 1 - timeout = 2 MINUTES - -/datum/mood_event/betterhug - description = "Someone was very nice to me." - mood_change = 3 - timeout = 4 MINUTES - -/datum/mood_event/betterhug/add_effects(mob/friend) - description = "[friend.name] was very nice to me." - -/datum/mood_event/besthug - description = "Someone is great to be around, they make me feel so happy!" - mood_change = 5 - timeout = 4 MINUTES - -/datum/mood_event/besthug/add_effects(mob/friend) - description = "[friend.name] is great to be around, [friend.p_they()] makes me feel so happy!" - -/datum/mood_event/warmhug - description = "Warm cozy hugs are the best!" - mood_change = 1 - timeout = 2 MINUTES - -/datum/mood_event/arcade - description = "I beat the arcade game!" - mood_change = 3 - timeout = 8 MINUTES - -/datum/mood_event/blessing - description = "I've been blessed." - mood_change = 3 - timeout = 8 MINUTES - -/datum/mood_event/maintenance_adaptation - mood_change = 8 - -/datum/mood_event/maintenance_adaptation/add_effects() - description = "[GLOB.deity] has helped me adapt to the maintenance shafts!" - -/datum/mood_event/book_nerd - description = "I have recently read a book." - mood_change = 1 - timeout = 5 MINUTES - -/datum/mood_event/exercise - description = "Working out releases those endorphins!" - mood_change = 2 - timeout = 5 MINUTES - -/datum/mood_event/pet_animal - description = "Animals are adorable! I can't stop petting them!" - mood_change = 2 - timeout = 5 MINUTES - -/datum/mood_event/pet_animal/add_effects(mob/animal) - description = "\The [animal.name] is adorable! I can't stop petting [animal.p_them()]!" - -/datum/mood_event/honk - description = "I've been honked!" - mood_change = 2 - timeout = 4 MINUTES - special_screen_obj = "honked_nose" - special_screen_replace = FALSE - -/datum/mood_event/saved_life - description = "It feels good to save a life." - mood_change = 6 - timeout = 8 MINUTES - -/datum/mood_event/oblivious - description = "What a lovely day." - mood_change = 3 - -/datum/mood_event/jolly - description = "I feel happy for no particular reason." - mood_change = 6 - timeout = 2 MINUTES - -/datum/mood_event/focused - description = "I have a goal, and I will reach it, whatever it takes!" //Used for syndies, nukeops etc so they can focus on their goals - mood_change = 4 - hidden = TRUE - -/datum/mood_event/badass_antag - description = "I'm a fucking badass and everyone around me knows it. Just look at them; they're all fucking shaking at the mere thought of having me around." - mood_change = 7 - hidden = TRUE - special_screen_obj = "badass_sun" - special_screen_replace = FALSE - -/datum/mood_event/creeping - description = "The voices have released their hooks on my mind! I feel free again!" //creeps get it when they are around their obsession - mood_change = 18 - timeout = 3 SECONDS - hidden = TRUE - -/datum/mood_event/revolution - description = "VIVA LA REVOLUTION!" - mood_change = 3 - hidden = TRUE - -/datum/mood_event/cult - description = "I have seen the truth, praise the almighty one!" - mood_change = 10 //maybe being a cultist isn't that bad after all - hidden = TRUE - -/datum/mood_event/heretics - description = "THE HIGHER I RISE, THE MORE I SEE." - mood_change = 10 //maybe being a cultist isnt that bad after all - hidden = TRUE - -/datum/mood_event/family_heirloom - description = "My family heirloom is safe with me." - mood_change = 1 - -/datum/mood_event/clown_enjoyer_pin - description = "I love showing off my clown pin!" - mood_change = 1 - -/datum/mood_event/mime_fan_pin - description = "I love showing off my mime pin!" - mood_change = 1 - -/datum/mood_event/goodmusic - description = "There is something soothing about this music." - mood_change = 3 - timeout = 60 SECONDS - -/datum/mood_event/chemical_euphoria - description = "Heh...hehehe...hehe..." - mood_change = 4 - -/datum/mood_event/chemical_laughter - description = "Laughter really is the best medicine! Or is it?" - mood_change = 4 - timeout = 3 MINUTES - -/datum/mood_event/chemical_superlaughter - description = "*WHEEZE*" - mood_change = 12 - timeout = 3 MINUTES - -/datum/mood_event/religiously_comforted - description = "I feel comforted by the presence of a holy person." - mood_change = 3 - timeout = 5 MINUTES - -/datum/mood_event/clownshoes - description = "The shoes are a clown's legacy, I never want to take them off!" - mood_change = 5 - -/datum/mood_event/sacrifice_good - description = "The gods are pleased with this offering!" - mood_change = 5 - timeout = 3 MINUTES - -/datum/mood_event/artok - description = "It's nice to see people are making art around here." - mood_change = 2 - timeout = 5 MINUTES - -/datum/mood_event/artgood - description = "What a thought-provoking piece of art. I'll remember that for a while." - mood_change = 4 - timeout = 5 MINUTES - -/datum/mood_event/artgreat - description = "That work of art was so great it made me believe in the goodness of humanity. Says a lot in a place like this." - mood_change = 6 - timeout = 5 MINUTES - -/datum/mood_event/pet_borg - description = "I just love my robotic friends!" - mood_change = 3 - timeout = 5 MINUTES - -/datum/mood_event/bottle_flip - description = "The bottle landing like that was satisfying." - mood_change = 2 - timeout = 3 MINUTES - -/datum/mood_event/hope_lavaland - description = "What a peculiar emblem. It makes me feel hopeful for my future." - mood_change = 10 - -/datum/mood_event/confident_mane - description = "I'm feeling confident with a head full of hair." - mood_change = 2 - -/datum/mood_event/holy_consumption - description = "Truly, that was the food of the Divine!" - mood_change = 1 // 1 + 5 from it being liked food makes it as good as jolly - timeout = 3 MINUTES - -/datum/mood_event/high_five - description = "I love getting high fives!" - mood_change = 2 - timeout = 45 SECONDS - -/datum/mood_event/high_ten - description = "AMAZING! A HIGH-TEN!" - mood_change = 3 - timeout = 45 SECONDS - -/datum/mood_event/down_low - description = "HA! What a rube, they never stood a chance..." - mood_change = 4 - timeout = 90 SECONDS - -/datum/mood_event/aquarium_positive - description = "Watching fish in an aquarium is calming." - mood_change = 3 - timeout = 90 SECONDS - -/datum/mood_event/gondola - description = "I feel at peace and feel no need to make any sudden or rash actions." - mood_change = 6 - -/datum/mood_event/kiss - description = "Someone blew a kiss at me, I must be a real catch!" - mood_change = 1.5 - timeout = 2 MINUTES - -/datum/mood_event/kiss/add_effects(mob/beau, direct) - if(!beau) - return - if(direct) - description = "[beau.name] gave me a kiss, ahh!!" - else - description = "[beau.name] blew a kiss at me, I must be a real catch!" - -/datum/mood_event/honorbound - description = "Following my honorbound code is fulfilling!" - mood_change = 4 - -/datum/mood_event/et_pieces - description = "Mmm... I love peanut butter..." - mood_change = 50 - timeout = 10 MINUTES - -/datum/mood_event/memories_of_home - description = "This taste seems oddly nostalgic..." - mood_change = 3 - timeout = 5 MINUTES - -/datum/mood_event/observed_soda_spill - description = "Ahaha! It's always funny to see someone get sprayed by a can of soda." - mood_change = 2 - timeout = 30 SECONDS - -/datum/mood_event/observed_soda_spill/add_effects(mob/spilled_mob, atom/soda_can) - if(!spilled_mob) - return - - description = "Ahaha! [spilled_mob] spilled [spilled_mob.p_their()] [soda_can ? soda_can.name : "soda"] all over [spilled_mob.p_them()]self! Classic." - -/datum/mood_event/gaming - description = "I'm enjoying a nice gaming session!" - mood_change = 2 - timeout = 30 SECONDS - -/datum/mood_event/gamer_won - description = "I love winning videogames!" - mood_change = 10 - timeout = 5 MINUTES - -/datum/mood_event/won_52_card_pickup - description = "HA! That loser will be picking cards up for a long time!" - mood_change = 3 - timeout = 3 MINUTES - -/datum/mood_event/playing_cards - description = "I'm enjoying playing cards with other people!" - mood_change = 2 - timeout = 3 MINUTES - -/datum/mood_event/playing_cards/add_effects(param) - var/card_players = 1 - for(var/mob/living/carbon/player in viewers(COMBAT_MESSAGE_RANGE, owner)) - var/player_has_cards = player.is_holding(/obj/item/toy/singlecard) || player.is_holding_item_of_type(/obj/item/toy/cards) - if(player_has_cards) - card_players++ - if(card_players > 5) - break - - mood_change *= card_players - return ..() diff --git a/code/datums/mood_events/needs_events.dm b/code/datums/mood_events/needs_events.dm deleted file mode 100644 index 1c00825e2d1d..000000000000 --- a/code/datums/mood_events/needs_events.dm +++ /dev/null @@ -1,93 +0,0 @@ -//nutrition -/datum/mood_event/fat - description = "I'm so fat..." //muh fatshaming - mood_change = -6 - -/datum/mood_event/wellfed - description = "I'm stuffed!" - mood_change = 8 - -/datum/mood_event/fed - description = "I have recently had some food." - mood_change = 5 - -/datum/mood_event/hungry - description = "I'm getting a bit hungry." - mood_change = -6 - -/datum/mood_event/starving - description = "I'm starving!" - mood_change = -10 - -//charge -/datum/mood_event/supercharged - description = "I can't possibly keep all this power inside, I need to release some quick!" - mood_change = -10 - -/datum/mood_event/overcharged - description = "I feel dangerously overcharged, perhaps I should release some power." - mood_change = -4 - -/datum/mood_event/charged - description = "I feel the power in my veins!" - mood_change = 6 - -/datum/mood_event/lowpower - description = "My power is running low, I should go charge up somewhere." - mood_change = -6 - -/datum/mood_event/decharged - description = "I'm in desperate need of some electricity!" - mood_change = -10 - -//Disgust -/datum/mood_event/gross - description = "I saw something gross." - mood_change = -4 - -/datum/mood_event/verygross - description = "I think I'm going to puke..." - mood_change = -6 - -/datum/mood_event/disgusted - description = "Oh god, that's disgusting..." - mood_change = -8 - -/datum/mood_event/disgust/bad_smell - description = "I can smell something horribly decayed inside this room." - mood_change = -6 - -/datum/mood_event/disgust/nauseating_stench - description = "The stench of rotting carcasses is unbearable!" - mood_change = -12 - -//Generic needs events -/datum/mood_event/favorite_food - description = "I really enjoyed eating that." - mood_change = 5 - timeout = 4 MINUTES - -/datum/mood_event/gross_food - description = "I really didn't like that food." - mood_change = -2 - timeout = 4 MINUTES - -/datum/mood_event/disgusting_food - description = "That food was disgusting!" - mood_change = -6 - timeout = 4 MINUTES - -/datum/mood_event/breakfast - description = "Nothing like a hearty breakfast to start the shift." - mood_change = 2 - timeout = 10 MINUTES - -/datum/mood_event/nice_shower - description = "I have recently had a nice shower." - mood_change = 4 - timeout = 5 MINUTES - -/datum/mood_event/fresh_laundry - description = "There's nothing like the feeling of a freshly laundered jumpsuit." - mood_change = 2 - timeout = 10 MINUTES diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index cce25beb2161..059659a77dba 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -32,7 +32,3 @@ /datum/generecipe/tonguechem required = "/datum/mutation/human/tongue_spike; /datum/mutation/human/stimmed" result = /datum/mutation/human/tongue_spike/chem - -/datum/generecipe/martyrdom - required = "/datum/mutation/human/strong; /datum/mutation/human/stimmed" - result = /datum/mutation/human/martyrdom diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index a73aea59f0c8..a27c95fbb7e5 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -62,8 +62,8 @@ var/chromosome_name /// Has the chromosome been modified var/modified = FALSE //ugly but we really don't want chromosomes and on_acquiring to overlap and apply double the powers - /// Is this mutation mutadone proof - var/mutadone_proof = FALSE + /// Is this mutation ryetalyn proof + var/ryetalyn_proof = FALSE //Chromosome stuff - set to -1 to prevent people from changing it. Example: It'd be a waste to decrease cooldown on mutism /// genetic stability coeff @@ -124,12 +124,19 @@ /datum/mutation/human/proc/on_life(delta_time, times_fired) return -/datum/mutation/human/proc/on_losing(mob/living/carbon/human/owner) +/datum/mutation/human/proc/remove_from_owner() + . = on_losing(owner) + qdel(src) + +/datum/mutation/human/proc/on_losing() if(!istype(owner) || !(owner.dna.mutations.Remove(src))) return TRUE + . = FALSE + if(text_lose_indication && owner.stat != DEAD) to_chat(owner, text_lose_indication) + if(visual_indicators.len) var/list/mut_overlay = list() if(owner.overlays_standing[layer_used]) @@ -138,11 +145,6 @@ mut_overlay.Remove(get_visual_indicator()) owner.overlays_standing[layer_used] = mut_overlay owner.apply_overlay(layer_used) - if(power_path) - // Any powers we made are linked to our mutation datum, - // so deleting ourself will also delete it and remove it - // ...Why don't all mutations delete on loss? Not sure. - qdel(src) /mob/living/carbon/proc/update_mutations_overlay() return @@ -190,7 +192,7 @@ synchronizer_coeff = mutation_to_copy.synchronizer_coeff power_coeff = mutation_to_copy.power_coeff energy_coeff = mutation_to_copy.energy_coeff - mutadone_proof = mutation_to_copy.mutadone_proof + ryetalyn_proof = mutation_to_copy.ryetalyn_proof can_chromosome = mutation_to_copy.can_chromosome valid_chrom_list = mutation_to_copy.valid_chrom_list @@ -199,7 +201,7 @@ synchronizer_coeff = initial(synchronizer_coeff) power_coeff = initial(power_coeff) energy_coeff = initial(energy_coeff) - mutadone_proof = initial(mutadone_proof) + ryetalyn_proof = initial(ryetalyn_proof) can_chromosome = initial(can_chromosome) chromosome_name = null diff --git a/code/datums/mutations/antenna.dm b/code/datums/mutations/antenna.dm index a5b220abde63..fffbce7268af 100644 --- a/code/datums/mutations/antenna.dm +++ b/code/datums/mutations/antenna.dm @@ -13,6 +13,7 @@ desc = "The internal organ part of the antenna. Science has not yet given it a good name." icon = 'icons/obj/radio.dmi'//maybe make a unique sprite later. not important icon_state = "walkietalkie" + implant_flags = IMPLANT_KNOWN /obj/item/implant/radio/antenna/Initialize(mapload) . = ..() @@ -22,7 +23,7 @@ if(..()) return var/obj/item/implant/radio/antenna/linked_radio = new(owner) - linked_radio.implant(owner, null, TRUE, TRUE) + linked_radio.implant(owner, null, BODY_ZONE_CHEST, TRUE, TRUE) radio_weakref = WEAKREF(linked_radio) /datum/mutation/human/antenna/on_losing(mob/living/carbon/human/owner) diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm index 67bfcc495a8b..78e157fffeec 100644 --- a/code/datums/mutations/body.dm +++ b/code/datums/mutations/body.dm @@ -14,7 +14,6 @@ owner.visible_message(span_danger("[owner] starts having a seizure!"), span_userdanger("You have a seizure!")) owner.Unconscious(200 * GET_MUTATION_POWER(src)) owner.set_timed_status_effect(2000 SECONDS * GET_MUTATION_POWER(src), /datum/status_effect/jitter) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "epilepsy", /datum/mood_event/epilepsy) addtimer(CALLBACK(src, PROC_REF(jitter_less)), 90) /datum/mutation/human/epilepsy/proc/jitter_less() @@ -49,8 +48,7 @@ if(new_mob && ismob(new_mob)) owner = new_mob . = owner - on_losing(owner) - + remove_from_owner() //Cough gives you a chronic cough that causes you to drop items. /datum/mutation/human/cough @@ -304,36 +302,6 @@ return owner.physiology.burn_mod *= 2 -/datum/mutation/human/badblink - name = "Spatial Instability" - 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." - difficulty = 18//high so it's hard to unlock and abuse - instability = 10 - synchronizer_coeff = 1 - energy_coeff = 1 - power_coeff = 1 - var/warpchance = 0 - -/datum/mutation/human/badblink/on_life(delta_time, times_fired) - if(DT_PROB(warpchance, delta_time)) - var/warpmessage = pick( - span_warning("With a sickening 720-degree twist of [owner.p_their()] back, [owner] vanishes into thin air."), - span_warning("[owner] does some sort of strange backflip into another dimension. It looks pretty painful."), - span_warning("[owner] does a jump to the left, a step to the right, and warps out of reality."), - span_warning("[owner]'s torso starts folding inside out until it vanishes from reality, taking [owner] with it."), - span_warning("One moment, you see [owner]. The next, [owner] is gone.")) - owner.visible_message(warpmessage, span_userdanger("You feel a wave of nausea as you fall through reality!")) - var/warpdistance = rand(10, 15) * GET_MUTATION_POWER(src) - do_teleport(owner, get_turf(owner), warpdistance, channel = TELEPORT_CHANNEL_FREE) - owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * (warpchance * warpdistance)) - warpchance = 0 - owner.visible_message(span_danger("[owner] appears out of nowhere!")) - else - warpchance += 0.0625 * GET_MUTATION_ENERGY(src) * delta_time - /datum/mutation/human/acidflesh name = "Acidic Flesh" desc = "Subject has acidic chemicals building up underneath the skin. This is often lethal." @@ -425,98 +393,3 @@ return //remove the 'edge' cases to_chat(owner, span_danger("You trip over your own feet.")) owner.Knockdown(30) - -/datum/mutation/human/martyrdom - name = "Internal Martyrdom" - desc = "A mutation that makes the body destruct when near death. Not damaging, but very, VERY disorienting." - locked = TRUE - quality = POSITIVE //not that cloning will be an option a lot but generally lets keep this around i guess? - text_gain_indication = "You get an intense feeling of heartburn." - text_lose_indication = "Your internal organs feel at ease." - -/datum/mutation/human/martyrdom/on_acquiring() - . = ..() - if(.) - return TRUE - RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(bloody_shower)) - -/datum/mutation/human/martyrdom/on_losing() - . = ..() - if(.) - return TRUE - UnregisterSignal(owner, COMSIG_MOB_STATCHANGE) - -/datum/mutation/human/martyrdom/proc/bloody_shower(datum/source, new_stat) - SIGNAL_HANDLER - - if(new_stat != HARD_CRIT) - return - var/list/organs = owner.getorgansofzone(BODY_ZONE_HEAD, TRUE) - - for(var/obj/item/organ/I in organs) - qdel(I) - - explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src) - for(var/mob/living/carbon/human/H in view(2,owner)) - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - to_chat(H, span_userdanger("You are blinded by a shower of blood!")) - else - to_chat(H, span_userdanger("You are knocked down by a wave of... blood?!")) - H.Stun(20) - H.blur_eyes(20) - eyes?.applyOrganDamage(5) - H.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/confusion) - for(var/mob/living/silicon/S in view(2,owner)) - to_chat(S, span_userdanger("Your sensors are disabled by a shower of blood!")) - S.Paralyze(60) - owner.gib() - -/datum/mutation/human/headless - name = "H.A.R.S." - desc = "A mutation that makes the body reject the head, the brain receding into the chest. Stands for Head Allergic Rejection Syndrome. Warning: Removing this mutation is very dangerous, though it will regenerate non-vital head organs." - difficulty = 12 //pretty good for traitors - quality = NEGATIVE //holy shit no eyes or tongue or ears - text_gain_indication = "Something feels off." - -/datum/mutation/human/headless/on_acquiring() - . = ..() - if(.)//cant add - return TRUE - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) - if(brain) - brain.zone = BODY_ZONE_CHEST - - var/obj/item/bodypart/head/head = owner.get_bodypart(BODY_ZONE_HEAD) - if(head) - owner.visible_message(span_warning("[owner]'s head splatters with a sickening crunch!"), ignored_mobs = list(owner)) - new /obj/effect/gibspawner/generic(get_turf(owner), owner) - head.dismember(DROPLIMB_BLUNT) - head.drop_organs() - qdel(head) - owner.regenerate_icons() - RegisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(abortattachment)) - -/datum/mutation/human/headless/on_losing() - . = ..() - if(.) - return TRUE - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) - if(brain) //so this doesn't instantly kill you. we could delete the brain, but it lets people cure brain issues they /really/ shouldn't be - brain.zone = BODY_ZONE_HEAD - UnregisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB) - var/successful = owner.regenerate_limb(BODY_ZONE_HEAD) - if(!successful) - stack_trace("HARS mutation head regeneration failed! (usually caused by headless syndrome having a head)") - return TRUE - owner.dna.species.regenerate_organs(owner, replace_current = FALSE, excluded_zones = list(BODY_ZONE_CHEST)) //replace_current needs to be FALSE to prevent weird adding and removing mutation healing - owner.apply_damage(damage = 50, damagetype = BRUTE, def_zone = BODY_ZONE_HEAD) //and this to DISCOURAGE organ farming, or at least not make it free. - owner.visible_message(span_warning("[owner]'s head returns with a sickening crunch!"), span_warning("Your head regrows with a sickening crack! Ouch.")) - new /obj/effect/gibspawner/generic(get_turf(owner), owner) - - -/datum/mutation/human/headless/proc/abortattachment(datum/source, obj/item/bodypart/new_limb, special) //you aren't getting your head back - SIGNAL_HANDLER - - if(istype(new_limb, /obj/item/bodypart/head)) - return COMPONENT_NO_ATTACH diff --git a/code/datums/mutations/chameleon.dm b/code/datums/mutations/chameleon.dm index 4200612edaec..7d797d8b0aec 100644 --- a/code/datums/mutations/chameleon.dm +++ b/code/datums/mutations/chameleon.dm @@ -14,7 +14,7 @@ return owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) + RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) /datum/mutation/human/chameleon/on_life(delta_time, times_fired) owner.alpha = max(owner.alpha - (12.5 * delta_time), 0) @@ -48,10 +48,11 @@ if(!proximity) //stops tk from breaking chameleon return + owner.alpha = CHAMELEON_MUTATION_DEFAULT_TRANSPARENCY /datum/mutation/human/chameleon/on_losing(mob/living/carbon/human/owner) if(..()) return owner.alpha = 255 - UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_EARLY_UNARMED_ATTACK)) diff --git a/code/datums/mutations/fire_breath.dm b/code/datums/mutations/fire_breath.dm index 9869d41283e0..c23896d32154 100644 --- a/code/datums/mutations/fire_breath.dm +++ b/code/datums/mutations/fire_breath.dm @@ -49,7 +49,7 @@ return var/mob/living/carbon/our_lizard = cast_on - if(!our_lizard.is_mouth_covered()) + if(!our_lizard.has_mouth() || !our_lizard.is_mouth_covered()) return our_lizard.adjust_fire_stacks(cone_levels) diff --git a/code/datums/mutations/holy_mutation/burdened.dm b/code/datums/mutations/holy_mutation/burdened.dm index 56f98cde6ef4..e0d3d9ab223e 100644 --- a/code/datums/mutations/holy_mutation/burdened.dm +++ b/code/datums/mutations/holy_mutation/burdened.dm @@ -19,7 +19,7 @@ RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(organ_removed_burden)) RegisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB, PROC_REF(limbs_added_burden)) - RegisterSignal(owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(limbs_removed_burden)) + RegisterSignal(owner, COMSIG_CARBON_REMOVED_LIMB, PROC_REF(limbs_removed_burden)) RegisterSignal(owner, COMSIG_CARBON_GAIN_ADDICTION, PROC_REF(addict_added_burden)) RegisterSignal(owner, COMSIG_CARBON_LOSE_ADDICTION, PROC_REF(addict_removed_burden)) @@ -36,7 +36,7 @@ COMSIG_CARBON_GAIN_ORGAN, COMSIG_CARBON_LOSE_ORGAN, COMSIG_CARBON_ATTACH_LIMB, - COMSIG_CARBON_REMOVE_LIMB, + COMSIG_CARBON_REMOVED_LIMB, COMSIG_CARBON_GAIN_ADDICTION, COMSIG_CARBON_LOSE_ADDICTION, COMSIG_CARBON_GAIN_MUTATION, diff --git a/code/datums/mutations/holy_mutation/honorbound.dm b/code/datums/mutations/holy_mutation/honorbound.dm index 46417a68df62..69985911c7cf 100644 --- a/code/datums/mutations/holy_mutation/honorbound.dm +++ b/code/datums/mutations/holy_mutation/honorbound.dm @@ -16,8 +16,6 @@ /datum/mutation/human/honorbound/on_acquiring(mob/living/carbon/human/owner) if(..()) return - //moodlet - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "honorbound", /datum/mood_event/honorbound) //checking spells cast by honorbound RegisterSignal(owner, COMSIG_MOB_CAST_SPELL, PROC_REF(spell_check)) RegisterSignal(owner, COMSIG_MOB_FIRED_GUN, PROC_REF(staff_check)) @@ -33,7 +31,6 @@ RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(attack_honor)) /datum/mutation/human/honorbound/on_losing(mob/living/carbon/human/owner) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "honorbound") UnregisterSignal(owner, list( COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_HULK_ATTACK, @@ -103,7 +100,7 @@ //THE UNREADY (Applies over ANYTHING else!) if(honorbound_human == target_creature) return TRUE //oh come on now - if(target_creature.IsSleeping() || target_creature.IsUnconscious() || HAS_TRAIT(target_creature, TRAIT_RESTRAINED)) + if(target_creature.IsSleeping() || target_creature.IsUnconscious() || HAS_TRAIT(target_creature, TRAIT_ARMS_RESTRAINED)) to_chat(honorbound_human, span_warning("There is no honor in attacking the unready.")) return FALSE //THE JUST (Applies over guilt except for med, so you best be careful!) @@ -192,14 +189,12 @@ if(SCHOOL_NECROMANCY, SCHOOL_FORBIDDEN) to_chat(user, span_userdanger("[GLOB.deity] is enraged by your use of forbidden magic!")) lightningbolt(user) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "honorbound", /datum/mood_event/banished) user.dna.remove_mutation(/datum/mutation/human/honorbound) user.mind.holy_role = NONE to_chat(user, span_userdanger("You have been excommunicated! You are no longer holy!")) else to_chat(user, span_userdanger("[GLOB.deity] is angered by your use of [school] magic!")) lightningbolt(user) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "honorbound", /datum/mood_event/holy_smite)//permanently lose your moodlet after this /datum/action/cooldown/spell/pointed/declare_evil name = "Declare Evil" diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 6a0d552154c4..85829da1fec8 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -24,28 +24,31 @@ for(var/obj/item/bodypart/part as anything in owner.bodyparts) part.variable_color = "#00aa00" owner.update_body_parts() - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "hulk", /datum/mood_event/hulk) - RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) + RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing)) /datum/mutation/human/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) SIGNAL_HANDLER - if(!proximity) - return - if(!source.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - return - if(target.attack_hulk(owner)) - if(world.time > (last_scream + scream_delay)) - last_scream = world.time - INVOKE_ASYNC(src, PROC_REF(scream_attack), source) - log_combat(source, target, "punched", "hulk powers") - source.do_attack_animation(target, ATTACK_EFFECT_SMASH) - source.changeNext_move(CLICK_CD_MELEE) + if(!source.combat_mode || !proximity || LAZYACCESS(modifiers, RIGHT_CLICK)) + return NONE + if(!source.can_unarmed_attack()) return COMPONENT_CANCEL_ATTACK_CHAIN + if(!target.attack_hulk(owner)) + return NONE + + if(world.time > (last_scream + scream_delay)) + last_scream = world.time + INVOKE_ASYNC(src, PROC_REF(scream_attack), source) + + log_combat(source, target, "punched", "hulk powers") + source.do_attack_animation(target, ATTACK_EFFECT_SMASH) + source.changeNext_move(CLICK_CD_MELEE) + return COMPONENT_CANCEL_ATTACK_CHAIN + /datum/mutation/human/hulk/proc/scream_attack(mob/living/carbon/human/source) source.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced="hulk") @@ -66,6 +69,7 @@ if(owner.health < owner.crit_threshold) on_losing(owner) to_chat(owner, span_danger("You suddenly feel very weak.")) + remove_from_owner() /datum/mutation/human/hulk/on_losing(mob/living/carbon/human/owner) if(..()) @@ -78,8 +82,7 @@ for(var/obj/item/bodypart/part as anything in owner.bodyparts) part.variable_color = null owner.update_body_parts() - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "hulk") - UnregisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) + UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) UnregisterSignal(owner, COMSIG_MOB_SAY) UnregisterSignal(owner, COMSIG_MOB_CLICKON) @@ -104,10 +107,11 @@ return if(!user.throw_mode || user.get_active_held_item() || user.zone_selected != BODY_ZONE_PRECISE_GROIN) return - if(user.grab_state < GRAB_NECK || !iscarbon(user.pulling) || user.buckled || user.incapacitated()) + var/obj/item/hand_item/grab/G = user.get_active_grab() + if(G.current_grab.damage_stage < GRAB_NECK || !iscarbon(G.affecting) || user.buckled || user.incapacitated()) return - var/mob/living/carbon/possible_throwable = user.pulling + var/mob/living/carbon/possible_throwable = G.affecting if(!possible_throwable.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL)) return @@ -184,9 +188,8 @@ var/turf/current_spin_turf = yeeted_person.loc var/turf/intermediate_spin_turf = get_step(yeeted_person, the_hulk.dir) // the diagonal var/turf/next_spin_turf = get_step(the_hulk, the_hulk.dir) - var/direction = get_dir(current_spin_turf, intermediate_spin_turf) - if((isturf(current_spin_turf) && current_spin_turf.Exit(yeeted_person, direction)) && (isturf(next_spin_turf) && next_spin_turf.Enter(yeeted_person))) + if(yeeted_person.can_step_into(next_spin_turf)) yeeted_person.forceMove(next_spin_turf) yeeted_person.face_atom(the_hulk) @@ -198,7 +201,7 @@ continue yeeted_person.adjustBruteLoss(step*0.5) - playsound(collateral_mob,'sound/weapons/punch1.ogg',50,TRUE) + playsound(collateral_mob,SFX_PUNCH,50,TRUE) log_combat(the_hulk, collateral_mob, "has smacked with tail swing victim") log_combat(the_hulk, yeeted_person, "has smacked this person into someone while tail swinging") // i have no idea how to better word this diff --git a/code/datums/mutations/olfaction.dm b/code/datums/mutations/olfaction.dm index c9b790f9b3be..20c0fefaf12e 100644 --- a/code/datums/mutations/olfaction.dm +++ b/code/datums/mutations/olfaction.dm @@ -69,7 +69,9 @@ var/list/prints = sniffed.return_fingerprints() if(prints) for(var/mob/living/carbon/to_check as anything in GLOB.carbon_list) - if(prints[md5(to_check.dna?.unique_identity)]) + if(!to_check.has_dna()) + continue + if(prints[to_check.dna.unique_enzymes]) possibles |= to_check // There are no finger prints on the atom, so nothing to track diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm index 645febc53bf9..974c8be66e35 100644 --- a/code/datums/mutations/sight.dm +++ b/code/datums/mutations/sight.dm @@ -169,7 +169,7 @@ source.newtonian_move(get_dir(target, source)) var/obj/projectile/beam/laser_eyes/LE = new(source.loc) LE.firer = source - LE.def_zone = ran_zone(source.zone_selected) + LE.aimed_def_zone = ran_zone(source.zone_selected) LE.preparePixelProjectile(target, source, modifiers) INVOKE_ASYNC(LE, TYPE_PROC_REF(/obj/projectile, fire)) playsound(source, 'sound/weapons/taser2.ogg', 75, TRUE) diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm index cc7c6311baf7..886573a0cba7 100644 --- a/code/datums/mutations/tongue_spike.dm +++ b/code/datums/mutations/tongue_spike.dm @@ -46,7 +46,7 @@ icon_state = "tonguespike" force = 2 throwforce = 15 //15 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = i didnt do the math - throw_speed = 4 + throw_speed = 1.5 embedding = list( "embedded_pain_multiplier" = 4, "embed_chance" = 100, @@ -117,7 +117,7 @@ /// Whether the tongue's already embedded in a target once before var/embedded_once_alread = FALSE -/obj/item/hardened_spike/chem/embedded(mob/living/carbon/human/embedded_mob) +/obj/item/hardened_spike/chem/embedded(obj/item/bodypart/part) if(embedded_once_alread) return embedded_once_alread = TRUE @@ -126,13 +126,18 @@ if(!fired_by) return + if(!part.owner) + return + var/datum/action/send_chems/chem_action = new(src) - chem_action.transfered_ref = WEAKREF(embedded_mob) + chem_action.transfered_ref = WEAKREF(part.owner) chem_action.Grant(fired_by) to_chat(fired_by, span_notice("Link established! Use the \"Transfer Chemicals\" ability \ to send your chemicals to the linked target!")) + RegisterSignal(part, COMSIG_LIMB_REMOVE, PROC_REF(limb_removed)) + /obj/item/hardened_spike/chem/unembedded() var/mob/living/carbon/fired_by = fired_by_ref?.resolve() if(fired_by) @@ -142,6 +147,11 @@ return ..() + +/obj/item/hardened_spike/chem/proc/limb_removed(obj/item/bodypart/source) + SIGNAL_HANDLER + unembedded() + /datum/action/send_chems name = "Transfer Chemicals" desc = "Send all of your reagents into whomever the chem spike is embedded in. One use." @@ -169,7 +179,7 @@ if(!ishuman(transfered)) return FALSE - to_chat(transfered, span_warning("You feel a tiny prick!")) + transfered.apply_pain(1, BODY_ZONE_CHEST, "You feel a tiny prick!") transferer.reagents.trans_to(transfered, transferer.reagents.total_volume, 1, 1, 0, transfered_by = transferer) var/obj/item/hardened_spike/chem/chem_spike = target diff --git a/code/datums/mutations/void_magnet.dm b/code/datums/mutations/void_magnet.dm index 7900b4c099f1..d660fcbd24ba 100644 --- a/code/datums/mutations/void_magnet.dm +++ b/code/datums/mutations/void_magnet.dm @@ -41,3 +41,66 @@ /datum/action/cooldown/spell/void/cast(atom/cast_on) . = ..() new /obj/effect/immortality_talisman/void(get_turf(cast_on), cast_on) + +/obj/effect/immortality_talisman + name = "hole in reality" + desc = "It's shaped an awful lot like a person." + icon_state = "blank" + icon = 'icons/effects/effects.dmi' + var/vanish_description = "vanishes from reality" + // Weakref to the user who we're "acting" on + var/datum/weakref/user_ref + +/obj/effect/immortality_talisman/Initialize(mapload, mob/new_user) + . = ..() + if(new_user) + vanish(new_user) + +/obj/effect/immortality_talisman/Destroy() + // If we have a mob, we need to free it before cleanup + // This is a safety to prevent nuking a human, not so much a good pattern in general + unvanish() + return ..() + +/obj/effect/immortality_talisman/proc/unvanish() + var/mob/user = user_ref?.resolve() + user_ref = null + + if(!user) + return + + user.status_flags &= ~GODMODE + user.notransform = FALSE + user.forceMove(get_turf(src)) + user.visible_message(span_danger("[user] pops back into reality!")) + +/obj/effect/immortality_talisman/proc/vanish(mob/user) + user.visible_message(span_danger("[user] [vanish_description], leaving a hole in [user.p_their()] place!")) + + desc = "It's shaped an awful lot like [user.name]." + setDir(user.dir) + + user.forceMove(src) + user.notransform = TRUE + user.status_flags |= GODMODE + + user_ref = WEAKREF(user) + + addtimer(CALLBACK(src, PROC_REF(dissipate)), 10 SECONDS) + +/obj/effect/immortality_talisman/proc/dissipate() + qdel(src) + +/obj/effect/immortality_talisman/attackby() + return + +/obj/effect/immortality_talisman/relaymove(mob/living/user, direction) + // Won't really come into play since our mob has TRAIT_NO_TRANSFORM and cannot move, + // but regardless block all relayed moves, because no, you cannot move in the void. + return + +/obj/effect/immortality_talisman/singularity_pull() + return + +/obj/effect/immortality_talisman/void + vanish_description = "is dragged into the void" diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index b1bb788571ca..43431425b573 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -107,6 +107,8 @@ ///ID of the slot containing a gas tank var/internals_slot = null + /// If TRUE, will spawn their ID in a wallet. + var/id_in_wallet = FALSE /** * Any skillchips the mob should have in their brain. * @@ -192,10 +194,18 @@ EQUIP_OUTFIT_ITEM(glasses, ITEM_SLOT_EYES) if(back) EQUIP_OUTFIT_ITEM(back, ITEM_SLOT_BACK) + if(id) - EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) + if(!visualsOnly && id_in_wallet && ispath(id, /obj/item/card/id)) + var/obj/item/storage/wallet/W = /obj/item/storage/wallet/open + EQUIP_OUTFIT_ITEM(W, ITEM_SLOT_ID) + W = H.wear_id + INVOKE_ASYNC(W, TYPE_PROC_REF(/obj/item, InsertID), SSwardrobe.provide_type(id), TRUE) + else + EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) + if(!visualsOnly && id_trim && H.wear_id) - var/obj/item/card/id/id_card = H.wear_id + var/obj/item/card/id/id_card = H.wear_id.GetID(TRUE) id_card.registered_age = H.age if(id_trim) if(!SSid_access.apply_trim_to_card(id_card, id_trim)) @@ -249,15 +259,14 @@ if(!visualsOnly) apply_fingerprints(H) if(internals_slot) - H.internal = H.get_item_by_slot(internals_slot) - H?.update_mob_action_buttons() + H.open_internals(H.get_item_by_slot(internals_slot)) if(implants) for(var/implant_type in implants) var/obj/item/implant/I = SSwardrobe.provide_type(implant_type, H) - I.implant(H, null, TRUE) + I.implant(H, null, BODY_ZONE_CHEST, TRUE) // Insert the skillchips associated with this outfit into the target. - if(skillchips) + if(skillchips && H.needs_organ(ORGAN_SLOT_BRAIN)) for(var/skillchip_path in skillchips) var/obj/item/skillchip/skillchip_instance = SSwardrobe.provide_type(skillchip_path) var/implant_msg = H.implant_skillchip(skillchip_instance) diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 0438d514195f..ae40ddcb9808 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -23,7 +23,7 @@ return ATAN2((b.y - a.y), (b.x - a.x)) /// For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. -/datum/position +/datum/position var/x = 0 var/y = 0 var/z = 0 @@ -68,7 +68,7 @@ return new /datum/point(src) /// A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! -/datum/point +/datum/point var/x = 0 var/y = 0 var/z = 0 @@ -83,7 +83,7 @@ return p /// First argument can also be a /datum/position or /atom. -/datum/point/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0) +/datum/point/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0) if(istype(_x, /datum/position)) var/datum/position/P = _x _x = P.x @@ -134,11 +134,11 @@ /datum/point/vector /// Pixels per iteration - var/speed = 32 + var/speed = 32 var/iteration = 0 var/angle = 0 /// Calculated x movement amounts to prevent having to do trig every step. - var/mpx = 0 + var/mpx = 0 /// Calculated y movement amounts to prevent having to do trig every step. var/mpy = 0 var/starting_x = 0 //just like before, pixels from EDGE of map! This is set in initialize_location(). @@ -158,7 +158,7 @@ starting_z = z /// Same effect as initiliaze_location, but without setting the starting_x/y/z -/datum/point/vector/proc/set_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) +/datum/point/vector/proc/set_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) if(!isnull(tile_x)) x = ((tile_x - 1) * world.icon_size) + world.icon_size * 0.5 + p_x + 1 if(!isnull(tile_y)) diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 4db664b0387e..cc73548d166f 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -33,7 +33,8 @@ goal = goal_number bar_loc = target bar = image('icons/effects/progessbar.dmi', bar_loc, "prog_bar_0") - bar.plane = ABOVE_HUD_PLANE + bar.plane = GAME_PLANE + bar.layer = FLY_LAYER bar.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA user = User @@ -69,9 +70,7 @@ clean_user_client() bar_loc = null - - if(bar) - QDEL_NULL(bar) + bar = null return ..() @@ -140,16 +139,18 @@ ///The progress bar visual element. var/obj/effect/abstract/progbar/bar ///The atom who "created" the bar - var/atom/owner + var/atom/movable/owner ///Effectively the number of steps the progress bar will need to do before reaching completion. var/goal = 1 ///Control check to see if the progress was interrupted before reaching its goal. var/last_progress = 0 ///Variable to ensure smooth visual stacking on multiple progress bars. var/listindex = 0 + ///Does this qdelete on completion? + var/qdel_when_done = TRUE /datum/world_progressbar/New(atom/movable/_owner, _goal, image/underlay) - if(!_owner || !_goal) + if(!_owner) return owner = _owner @@ -164,11 +165,14 @@ underlay.pixel_y += 2 underlay.alpha = 200 - underlay.plane = ABOVE_HUD_PLANE + underlay.plane = GAME_PLANE + underlay.layer = FLY_LAYER underlay.appearance_flags = APPEARANCE_UI bar.underlays += underlay owner:vis_contents += bar + if(owner.bound_overlay) + owner.bound_overlay.vis_contents += bar animate(bar, alpha = 255, time = PROGRESSBAR_ANIMATION_TIME, easing = SINE_EASING) @@ -195,9 +199,11 @@ if(last_progress != goal) bar.icon_state = "[bar.icon_state]_fail" - animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME) - - QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME) + if(qdel_when_done) + animate(bar, alpha = 0, time = PROGRESSBAR_ANIMATION_TIME) + QDEL_IN(src, PROGRESSBAR_ANIMATION_TIME) + else + bar.icon_state = "prog_bar_0" #undef PROGRESSBAR_ANIMATION_TIME #undef PROGRESSBAR_HEIGHT diff --git a/code/datums/quirks/_quirk.dm b/code/datums/quirks/_quirk.dm index 04f0b74141e7..3cf4ace3728b 100644 --- a/code/datums/quirks/_quirk.dm +++ b/code/datums/quirks/_quirk.dm @@ -1,22 +1,23 @@ //every quirk in this folder should be coded around being applied on spawn //these are NOT "mob quirks" like GOTTAGOFAST, but exist as a medium to apply them and other different effects /datum/quirk + abstract_type = /datum/quirk + var/name = "Test Quirk" var/desc = "This is a test quirk." - var/value = 0 - var/human_only = TRUE + /// If the quirk is a Boon, Bane, or Neutral + var/quirk_genre = QUIRK_GENRE_NEUTRAL + /// Flags related to this quirk. + var/quirk_flags = QUIRK_HUMAN_ONLY + /// Reference to the mob currently tied to this quirk datum. Quirks are not singletons. + var/mob/living/quirk_holder + /// Text displayed when this quirk is assigned to a mob (and not transferred) var/gain_text + /// Text displayed when this quirk is removed from a mob (and not transferred) var/lose_text - var/medical_record_text //This text will appear on medical records for the trait. Not yet implemented - var/mood_quirk = FALSE //if true, this quirk affects mood and is unavailable if moodlets are disabled + /// This text will appear on medical records for the trait. Not yet implemented + var/medical_record_text var/mob_trait //if applicable, apply and remove this mob trait - /// Amount of points this trait is worth towards the hardcore character mode; minus points implies a positive quirk, positive means its hard. This is used to pick the quirks assigned to a hardcore character. 0 means its not available to hardcore draws. - var/hardcore_value = 0 - var/mob/living/quirk_holder - /// This quirk should START_PROCESSING when added and STOP_PROCESSING when removed. - var/processing_quirk = FALSE - /// When making an abstract quirk (in OOP terms), don't forget to set this var to the type path for that abstract quirk. - var/abstract_parent_type = /datum/quirk /// The icon to show in the preferences menu. /// This references a tgui icon, so it can be FontAwesome or a tgfont (with a tg- prefix). var/icon @@ -41,11 +42,11 @@ * * new_holder - The mob to add this quirk to. * * quirk_transfer - If this is being added to the holder as part of a quirk transfer. Quirks can use this to decide not to spawn new items or apply any other one-time effects. */ -/datum/quirk/proc/add_to_holder(mob/living/new_holder, quirk_transfer = FALSE) +/datum/quirk/proc/add_to_holder(mob/living/new_holder, quirk_transfer = FALSE, client/client_source) if(!new_holder) CRASH("Quirk attempted to be added to null mob.") - if(human_only && !ishuman(new_holder)) + if((quirk_flags & QUIRK_HUMAN_ONLY) && !ishuman(new_holder)) CRASH("Human only quirk attempted to be added to non-human mob.") if(new_holder.has_quirk(type)) @@ -56,19 +57,21 @@ quirk_holder = new_holder quirk_holder.quirks += src + // If we weren't passed a client source try to use a present one + client_source ||= quirk_holder.client if(mob_trait) ADD_TRAIT(quirk_holder, mob_trait, QUIRK_TRAIT) add() - if(processing_quirk) + if(quirk_flags & QUIRK_PROCESSES) START_PROCESSING(SSquirks, src) if(!quirk_transfer) if(gain_text) to_chat(quirk_holder, gain_text) - add_unique() + add_unique(client_source) if(quirk_holder.client) post_add() @@ -94,7 +97,7 @@ if(mob_trait) REMOVE_TRAIT(quirk_holder, mob_trait, QUIRK_TRAIT) - if(processing_quirk) + if(quirk_flags & QUIRK_PROCESSES) STOP_PROCESSING(SSquirks, src) remove() @@ -116,12 +119,21 @@ /// Any effect that should be applied every single time the quirk is added to any mob, even when transferred. /datum/quirk/proc/add() -/// Any effects from the proc that should not be done multiple times if the quirk is transferred between mobs. Put stuff like spawning items in here. -/datum/quirk/proc/add_unique() + return + +/// Any effects from the proc that should not be done multiple times if the quirk is transferred between mobs. +/// Put stuff like spawning items in here. +/datum/quirk/proc/add_unique(client/client_source) + return + /// Removal of any reversible effects added by the quirk. /datum/quirk/proc/remove() -/// Any special effects or chat messages which should be applied. This proc is guaranteed to run if the mob has a client when the quirk is added. Otherwise, it runs once on the next COMSIG_MOB_LOGIN. + return +/// Any special effects or chat messages which should be applied. +/// This proc is guaranteed to run if the mob has a client when the quirk is added. +/// Otherwise, it runs once on the next COMSIG_MOB_LOGIN. /datum/quirk/proc/post_add() + return /// Subtype quirk that has some bonus logic to spawn items for the player. /datum/quirk/item_quirk @@ -129,7 +141,7 @@ var/list/where_items_spawned /// If true, the backpack automatically opens on post_add(). Usually set to TRUE when an item is equipped inside the player's backpack. var/open_backpack = FALSE - abstract_parent_type = /datum/quirk/item_quirk + abstract_type = /datum/quirk/item_quirk /** * Handles inserting an item in any of the valid slots provided, then allows for post_add notification. @@ -179,37 +191,38 @@ var/list/dat = list() switch(category) if(CAT_QUIRK_ALL) - for(var/V in quirks) - var/datum/quirk/T = V + for(var/datum/quirk/T as anything in quirks) + if(medical && !T.medical_record_text) + continue dat += medical ? T.medical_record_text : T.name - //Major Disabilities - if(CAT_QUIRK_MAJOR_DISABILITY) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value < -4) - dat += medical ? T.medical_record_text : T.name - //Minor Disabilities - if(CAT_QUIRK_MINOR_DISABILITY) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value >= -4 && T.value < 0) + + //Disabilities (negative quirks) + if(CAT_QUIRK_DISABILITIES) + for(var/datum/quirk/T as anything in quirks) + if(medical && !T.medical_record_text) + continue + if(T.quirk_genre == QUIRK_GENRE_BANE) dat += medical ? T.medical_record_text : T.name + //Neutral and Positive quirks if(CAT_QUIRK_NOTES) - for(var/V in quirks) - var/datum/quirk/T = V - if(T.value > -1) + for(var/datum/quirk/T as anything in quirks) + if(medical && !T.medical_record_text) + continue + if(T.quirk_genre != QUIRK_GENRE_BOON) dat += medical ? T.medical_record_text : T.name + if(!dat.len) return medical ? "No issues have been declared." : "None" + return medical ? dat.Join("
") : dat.Join(", ") -/mob/living/proc/cleanse_trait_datums() //removes all trait datums - for(var/V in quirks) - var/datum/quirk/T = V - qdel(T) +/mob/living/proc/cleanse_quirk_datums() //removes all trait datums + QDEL_LIST(quirks) -/mob/living/proc/transfer_trait_datums(mob/living/to_mob) +/mob/living/proc/transfer_quirk_datums(mob/living/to_mob) + // We could be done before the client was moved or after the client was moved + var/datum/preferences/to_pass = client || to_mob.client for(var/datum/quirk/quirk as anything in quirks) quirk.remove_from_current_holder(quirk_transfer = TRUE) - quirk.add_to_holder(to_mob, quirk_transfer = TRUE) + quirk.add_to_holder(to_mob, quirk_transfer = TRUE, client_source = to_pass) diff --git a/code/datums/quirks/bane.dm b/code/datums/quirks/bane.dm new file mode 100644 index 000000000000..0b5d4beb9f75 --- /dev/null +++ b/code/datums/quirks/bane.dm @@ -0,0 +1,371 @@ +//predominantly negative traits +/datum/quirk/item_quirk/blindness + name = "Blind" + desc = "You have completely lost your sight." + icon = "eye-slash" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "You can't see anything." + lose_text = "You miraculously gain back your vision." + medical_record_text = "Patient has permanent blindness." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + +/datum/quirk/item_quirk/blindness/add_unique(client/client_source) + give_item_to_holder(/obj/item/clothing/glasses/blindfold/white, list(LOCATION_EYES = ITEM_SLOT_EYES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + +/datum/quirk/item_quirk/blindness/add() + quirk_holder.become_blind(QUIRK_TRAIT) + +/datum/quirk/item_quirk/blindness/remove() + quirk_holder.cure_blind(QUIRK_TRAIT) + +/datum/quirk/deafness + name = "Deaf" + desc = "You have completely lost your hearing." + icon = "deaf" + quirk_genre = QUIRK_GENRE_BANE + mob_trait = TRAIT_DEAF + gain_text = "You can't hear anything." + lose_text = "You're able to hear again!" + medical_record_text = "Patient has total hearing loss." + +/datum/quirk/light_drinker + name = "Alcohol Intolerance" + desc = "You just can't handle your drinks and get drunk very quickly." + icon = "cocktail" + quirk_genre = QUIRK_GENRE_BANE + mob_trait = TRAIT_LIGHT_DRINKER + gain_text = "Just the thought of drinking alcohol makes your head spin." + lose_text = "You're no longer severely affected by alcohol." + +/datum/quirk/item_quirk/nearsighted + name = "Nearsighted" + desc = "You are nearsighted without prescription glasses, which you carry on your person." + icon = "glasses" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "Things far away from you start looking blurry." + lose_text = "You start seeing faraway things normally again." + medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + var/glasses + +/datum/quirk/item_quirk/nearsighted/add_unique(client/client_source) + glasses = client_source?.prefs.read_preference(/datum/preference/choiced/glasses) || "Regular" + switch(glasses) + if ("Thin") + glasses = /obj/item/clothing/glasses/regular/thin + if ("Circle") + glasses = /obj/item/clothing/glasses/regular/circle + if ("Hipster") + glasses = /obj/item/clothing/glasses/regular/hipster + else + glasses = /obj/item/clothing/glasses/regular + + give_item_to_holder(glasses, list(LOCATION_EYES = ITEM_SLOT_EYES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + +/datum/quirk/item_quirk/nearsighted/add() + quirk_holder.become_nearsighted(QUIRK_TRAIT) + +/datum/quirk/item_quirk/nearsighted/remove() + quirk_holder.cure_nearsighted(QUIRK_TRAIT) + +/datum/quirk/paraplegic + name = "Paraplegic" + desc = "You suffer from paralysis from the waist down." + icon = "wheelchair" + quirk_genre = QUIRK_GENRE_BANE + quirk_flags = QUIRK_HUMAN_ONLY + gain_text = null // Handled by trauma. + lose_text = null + medical_record_text = "Patient has an untreatable impairment to motor function in the lower extremities." + +/datum/quirk/paraplegic/add_unique(client/client_source) + if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. + quirk_holder.buckled.unbuckle_mob(quirk_holder) + + var/turf/holder_turf = get_turf(quirk_holder) + var/obj/structure/chair/spawn_chair = locate() in holder_turf + + var/obj/vehicle/ridden/wheelchair/wheels + if(client_source?.get_award_status(HARDCORE_RANDOM_SCORE) >= 5000) //More than 5k score? you unlock the gamer wheelchair. + wheels = new /obj/vehicle/ridden/wheelchair/gold(holder_turf) + else + wheels = new(holder_turf) + if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking + wheels.setDir(spawn_chair.dir) + + wheels.buckle_mob(quirk_holder) + + // During the spawning process, they may have dropped what they were holding, due to the paralysis + // So put the things back in their hands. + for(var/obj/item/dropped_item in holder_turf) + if(dropped_item.fingerprintslast == quirk_holder.ckey) + quirk_holder.put_in_hands(dropped_item) + +/datum/quirk/paraplegic/add() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/paraplegic/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + human_holder.cure_trauma_type(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/quirk/item_quirk/junkie + name = "Drug Addict" + desc = "You have an addiction to a hard drug." + icon = "pills" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "You suddenly feel the craving for drugs." + medical_record_text = "Patient has an addiction." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + var/drug_list = list(/datum/reagent/drug/blastoff, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/methamphetamine) //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 + var/obj/item/drug_container_type //! If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle. + var/where_accessory //! where the accessory spawned + var/obj/item/accessory_type //! If this is null, an accessory won't be spawned. + var/process_interval = 30 SECONDS //! how frequently the quirk processes + var/next_process = 0 //! ticker for processing + var/drug_flavour_text = "Better hope you don't run out..." + +/datum/quirk/item_quirk/junkie/add_unique(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + + if(!reagent_type) + reagent_type = pick(drug_list) + + reagent_instance = new reagent_type() + + medical_record_text = "Patient suffers from an addiction to [reagent_instance.name]." + + for(var/addiction in reagent_instance.addiction_types) + human_holder.last_mind?.add_addiction_points(addiction, 1000) + + var/current_turf = get_turf(quirk_holder) + + if(!drug_container_type) + drug_container_type = /obj/item/storage/pill_bottle + + var/obj/item/drug_instance = new drug_container_type(current_turf) + if(istype(drug_instance, /obj/item/storage/pill_bottle)) + var/pill_state = "pill[rand(1,20)]" + for(var/i in 1 to 7) + var/obj/item/reagent_containers/pill/pill = new(drug_instance) + pill.icon_state = pill_state + pill.reagents.add_reagent(reagent_type, 3) + + give_item_to_holder( + drug_instance, + list( + LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, + LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, + LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, + LOCATION_HANDS = ITEM_SLOT_HANDS, + ), + flavour_text = drug_flavour_text, + ) + + if(accessory_type) + give_item_to_holder( + accessory_type, + list( + LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, + LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, + LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, + LOCATION_HANDS = ITEM_SLOT_HANDS, + ) + ) + +/datum/quirk/item_quirk/junkie/remove() + if(quirk_holder && reagent_instance) + for(var/addiction_type in subtypesof(/datum/addiction)) + quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) + +/datum/quirk/item_quirk/junkie/process(delta_time) + if(HAS_TRAIT(quirk_holder, TRAIT_NOMETABOLISM)) + return + + var/mob/living/carbon/human/human_holder = quirk_holder + if(world.time > next_process) + next_process = world.time + process_interval + var/deleted = QDELETED(reagent_instance) + var/missing_addiction = FALSE + for(var/addiction_type in reagent_instance.addiction_types) + if(!LAZYACCESS(human_holder.last_mind?.active_addictions, addiction_type)) + missing_addiction = TRUE + + if(deleted || missing_addiction) + if(deleted) + reagent_instance = new reagent_type() + + to_chat(quirk_holder, span_alert("You thought you kicked it, but you feel like you're falling back onto bad habits..")) + + for(var/addiction in reagent_instance.addiction_types) + human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out + +/datum/quirk/item_quirk/junkie/smoker + name = "Nicotine Addict" + desc = "You have an addiction to nicotine." + icon = "smoking" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "You could really go for a smoke right about now." + reagent_type = /datum/reagent/drug/nicotine + accessory_type = /obj/item/lighter/greyscale + mob_trait = TRAIT_SMOKER + drug_flavour_text = "Make sure you get your favorite brand when you run out." + +/datum/quirk/item_quirk/junkie/smoker/New() + drug_container_type = pick(/obj/item/storage/fancy/cigarettes, + /obj/item/storage/fancy/cigarettes/cigpack_midori, + /obj/item/storage/fancy/cigarettes/cigpack_uplift, + /obj/item/storage/fancy/cigarettes/cigpack_robust, + /obj/item/storage/fancy/cigarettes/cigpack_robustgold, + /obj/item/storage/fancy/cigarettes/cigpack_carp) + + return ..() + +/datum/quirk/item_quirk/junkie/smoker/post_add() + . = ..() + var/brand = initial(drug_container_type.name) + quirk_holder.mind.add_memory(MEMORY_QUIRK_DRUG, list(DETAIL_FAV_BRAND = brand), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT) + // smoker lungs have 25% less health and healing + var/obj/item/organ/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS) + if (smoker_lungs && !(smoker_lungs.organ_flags & ORGAN_SYNTHETIC)) // robotic lungs aren't affected + smoker_lungs.maxHealth = smoker_lungs.maxHealth * 0.75 + +/datum/quirk/item_quirk/allergic + name = "Medicine Allergy" + desc = "You are highly allergic to a medical drug." + icon = "prescription-bottle" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "You feel your immune system shift." + lose_text = "You feel your immune system phase back into perfect shape." + medical_record_text = "Patient's immune system responds poorly to certain chemicals." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + /// Typepath of the reagent we're allergic to + var/datum/reagent/medicine/allergy + var/list/blacklist = list(/datum/reagent/medicine/inaprovaline, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/adminordrazine,/datum/reagent/medicine/tricordrazine/godblood,/datum/reagent/cordiolis_hepatico,/datum/reagent/medicine/diphenhydramine) + var/allergy_string + +/datum/quirk/item_quirk/allergic/add_unique(client/client_source) + var/datum/reagent/medicine/allergy = pick(subtypesof(/datum/reagent/medicine) - blacklist) + allergy_string = initial(allergy.name) + name = "[allergy_string] Allergy" + medical_record_text = "[allergy_string] triggers an immune response." + + var/mob/living/carbon/human/human_holder = quirk_holder + var/obj/item/clothing/accessory/allergy_dogtag/dogtag = new(get_turf(human_holder)) + dogtag.display = allergy_string + + give_item_to_holder(dogtag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS), flavour_text = "Make sure medical staff can see this...") + +/datum/quirk/item_quirk/allergic/post_add() + quirk_holder.mind.add_memory(MEMORY_ALLERGY, list(DETAIL_ALLERGY_TYPE = allergy_string), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT) + to_chat(quirk_holder, span_boldnotice("You are allergic to [allergy_string], make sure not to consume any of these!")) + +/datum/quirk/item_quirk/allergic/process(delta_time) + if(!iscarbon(quirk_holder)) + return + + if(IS_IN_STASIS(quirk_holder)) + return + + if(quirk_holder.stat == DEAD) + return + + var/mob/living/carbon/carbon_quirk_holder = quirk_holder + var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) + if(!instantiated_med) + return + + //Just halts the progression, I'd suggest you run to medbay asap to get it fixed + if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) + return + + carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 0.5 * delta_time) + + if(DT_PROB(10, delta_time)) + carbon_quirk_holder.vomit() + carbon_quirk_holder.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_APPENDIX,ORGAN_SLOT_LUNGS,ORGAN_SLOT_HEART,ORGAN_SLOT_LIVER,ORGAN_SLOT_STOMACH),10) + +/datum/quirk/insanity + name = "Schizophrenia" + desc = "You suffer from a severe disorder that causes vivid audio-visual hallucinations. Mindbreaker Toxin can be used to suppress the effects temporarily." + icon = "grin-tongue-wink" + quirk_genre = QUIRK_GENRE_BANE + mob_trait = TRAIT_INSANITY + medical_record_text = "Patient suffers from schizophrenia and experiences vivid audio-visual hallucinations." + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_PROCESSES + +/datum/quirk/insanity/process(delta_time) + if(quirk_holder.stat >= UNCONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) + return + + if(DT_PROB(2, delta_time)) + quirk_holder.hallucination += rand(10, 25) + +/datum/quirk/monochromatic + name = "Monochromacy" + desc = "You are unable to perceive color." + icon = "adjust" + quirk_genre = QUIRK_GENRE_BANE + medical_record_text = "Patient is afflicted with almost complete color blindness." + +/datum/quirk/monochromatic/add(client/client_source) + quirk_holder.add_client_colour(/datum/client_colour/monochrome) + +/datum/quirk/monochromatic/post_add() + if(is_detective_job(quirk_holder.mind.assigned_role)) + to_chat(quirk_holder, span_obviousnotice("Mmm. Nothing's ever clear on this station.")) + quirk_holder.playsound_local(quirk_holder, 'sound/ambience/ambidet1.ogg', 50, FALSE) + +/datum/quirk/monochromatic/remove() + quirk_holder.remove_client_colour(/datum/client_colour/monochrome) + +/datum/quirk/no_taste + name = "Ageusia" + desc = "You have no sense of taste." + icon = "meh-blank" + quirk_genre = QUIRK_GENRE_BANE + mob_trait = TRAIT_AGEUSIA + gain_text = "You can't taste anything!" + lose_text = "You can taste again!" + medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." + +/datum/quirk/vegetarian + name = "Vegetarian" + desc = "You are physically repulsed by consuming meat." + icon = "carrot" + quirk_genre = QUIRK_GENRE_BANE + gain_text = "You feel repulsion at the idea of eating meat." + lose_text = "You feel like eating meat isn't that bad." + +/datum/quirk/vegetarian/add(client/client_source) + var/mob/living/carbon/human/human_holder = quirk_holder + var/datum/species/species = human_holder.dna.species + species.liked_food &= ~MEAT + species.disliked_food |= MEAT + RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) + +/datum/quirk/vegetarian/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) + SIGNAL_HANDLER + new_species.liked_food &= ~MEAT + new_species.disliked_food |= MEAT + +/datum/quirk/vegetarian/remove() + var/mob/living/carbon/human/human_holder = quirk_holder + + var/datum/species/species = human_holder.dna.species + if(initial(species.liked_food) & MEAT) + species.liked_food |= MEAT + if(!(initial(species.disliked_food) & MEAT)) + species.disliked_food &= ~MEAT + UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) + +/datum/quirk/shifty_eyes + name = "Shifty Eyes" + desc = "Your eyes tend to wander all over the place, whether you mean to or not, causing people to sometimes think you're looking directly at them when you aren't." + icon = "far fa-eye" + quirk_genre = QUIRK_GENRE_BANE + medical_record_text = "Fucking creep kept staring at me the whole damn checkup. I'm only diagnosing this because it's less awkward than thinking it was on purpose." + mob_trait = TRAIT_SHIFTY_EYES diff --git a/code/datums/quirks/boon.dm b/code/datums/quirks/boon.dm new file mode 100644 index 000000000000..0f0a3f70f693 --- /dev/null +++ b/code/datums/quirks/boon.dm @@ -0,0 +1,56 @@ +//predominantly positive traits +//this file is named weirdly so that positive traits are listed above negative ones + +/datum/quirk/alcohol_tolerance + name = "Alcohol Tolerance" + desc = "You have a high alcohol tolerance." + icon = "beer" + quirk_genre = QUIRK_GENRE_BOON + mob_trait = TRAIT_ALCOHOL_TOLERANCE + gain_text = "You feel like you could drink a whole keg!" + lose_text = "You don't feel as resistant to alcohol anymore. Somehow." + +/datum/quirk/item_quirk/musician + name = "Musician" + desc = "You can tune handheld musical instruments to play melodies that soothe the soul." + icon = "guitar" + quirk_genre = QUIRK_GENRE_BOON + mob_trait = TRAIT_MUSICIAN + gain_text = "You know everything about musical instruments." + lose_text = "You forget how musical instruments work." + +/datum/quirk/item_quirk/musician/add_unique(client/client_source) + give_item_to_holder(/obj/item/choice_beacon/music, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + +/datum/quirk/skittish + name = "Skittish" + desc = "You're easy to startle, and hide frequently." + icon = "trash" + quirk_genre = QUIRK_GENRE_BOON + mob_trait = TRAIT_SKITTISH + +/datum/quirk/item_quirk/spiritual + name = "Spiritual" + desc = "You gain comfort from the presence of holy people." + icon = "bible" + quirk_genre = QUIRK_GENRE_BOON + mob_trait = TRAIT_SPIRITUAL + gain_text = "You have faith in a higher power." + lose_text = "You lose faith!" + +/datum/quirk/item_quirk/spiritual/add_unique(client/client_source) + give_item_to_holder(/obj/item/storage/fancy/candle_box, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + give_item_to_holder(/obj/item/storage/box/matches, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + +/datum/quirk/item_quirk/tagger + name = "Graffiti Writer" + desc = "You are an experienced writer and know how to get the most out of a spraycan." + icon = "spray-can" + quirk_genre = QUIRK_GENRE_BOON + mob_trait = TRAIT_TAGGER + gain_text = "You know how to tag walls efficiently." + lose_text = "You forget how to tag walls properly." + +/datum/quirk/item_quirk/tagger/add_unique(client/client_source) + give_item_to_holder(/obj/item/toy/crayon/spraycan, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) + diff --git a/code/datums/quirks/good.dm b/code/datums/quirks/good.dm deleted file mode 100644 index 1d5442a13aee..000000000000 --- a/code/datums/quirks/good.dm +++ /dev/null @@ -1,225 +0,0 @@ -//predominantly positive traits -//this file is named weirdly so that positive traits are listed above negative ones - -/datum/quirk/alcohol_tolerance - name = "Alcohol Tolerance" - desc = "You become drunk more slowly and suffer fewer drawbacks from alcohol." - icon = "beer" - value = 4 - mob_trait = TRAIT_ALCOHOL_TOLERANCE - gain_text = "You feel like you could drink a whole keg!" - lose_text = "You don't feel as resistant to alcohol anymore. Somehow." - medical_record_text = "Patient demonstrates a high tolerance for alcohol." - -/datum/quirk/apathetic - name = "Apathetic" - desc = "You just don't care as much as other people. That's nice to have in a place like this, I guess." - icon = "meh" - value = 4 - mood_quirk = TRUE - medical_record_text = "Patient was administered the Apathy Evaluation Scale but did not bother to complete it." - -/datum/quirk/apathetic/add() - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - if(mood) - mood.mood_modifier -= 0.2 - -/datum/quirk/apathetic/remove() - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - if(mood) - mood.mood_modifier += 0.2 - -/datum/quirk/drunkhealing - name = "Drunken Resilience" - desc = "Nothing like a good drink to make you feel on top of the world. Whenever you're drunk, you slowly recover from injuries." - icon = "wine-bottle" - value = 8 - gain_text = "You feel like a drink would do you good." - lose_text = "You no longer feel like drinking would ease your pain." - medical_record_text = "Patient has unusually efficient liver metabolism and can slowly regenerate wounds by drinking alcoholic beverages." - processing_quirk = TRUE - -/datum/quirk/drunkhealing/process(delta_time) - switch(quirk_holder.get_drunk_amount()) - if (6 to 40) - quirk_holder.adjustBruteLoss(-0.1 * delta_time, FALSE) - quirk_holder.adjustFireLoss(-0.05 * delta_time) - if (41 to 60) - quirk_holder.adjustBruteLoss(-0.4 * delta_time, FALSE) - quirk_holder.adjustFireLoss(-0.2 * delta_time) - if (61 to INFINITY) - quirk_holder.adjustBruteLoss(-0.8 * delta_time, FALSE) - quirk_holder.adjustFireLoss(-0.4 * delta_time) - -/datum/quirk/empath - name = "Empath" - desc = "Whether it's a sixth sense or careful study of body language, it only takes you a quick glance at someone to understand how they feel." - icon = "smile-beam" - value = 8 - mob_trait = TRAIT_EMPATH - gain_text = "You feel in tune with those around you." - lose_text = "You feel isolated from others." - medical_record_text = "Patient is highly perceptive of and sensitive to social cues, or may possibly have ESP. Further testing needed." - -/datum/quirk/item_quirk/clown_enjoyer - name = "Clown Enjoyer" - desc = "You enjoy clown antics and get a mood boost from wearing your clown pin." - icon = "map-pin" - value = 2 - mob_trait = TRAIT_CLOWN_ENJOYER - gain_text = "You are a big enjoyer of clowns." - lose_text = "The clown doesn't seem so great." - medical_record_text = "Patient reports being a big enjoyer of clowns." - -/datum/quirk/item_quirk/clown_enjoyer/add_unique() - give_item_to_holder(/obj/item/clothing/accessory/clown_enjoyer_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/clown_enjoyer/add() - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.add_hud_to(quirk_holder) - -/datum/quirk/item_quirk/mime_fan - name = "Mime Fan" - desc = "You're a fan of mime antics and get a mood boost from wearing your mime pin." - icon = "thumbtack" - value = 2 - mob_trait = TRAIT_MIME_FAN - gain_text = "You are a big fan of the Mime." - lose_text = "The mime doesn't seem so great." - medical_record_text = "Patient reports being a big fan of mimes." - -/datum/quirk/item_quirk/mime_fan/add_unique() - give_item_to_holder(/obj/item/clothing/accessory/mime_fan_pin, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/mime_fan/add() - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.add_hud_to(quirk_holder) - -/datum/quirk/freerunning - name = "Freerunning" - desc = "You're great at quick moves! You can climb tables more quickly and take no damage from short falls." - icon = "running" - value = 8 - mob_trait = TRAIT_FREERUNNING - gain_text = "You feel lithe on your feet!" - lose_text = "You feel clumsy again." - medical_record_text = "Patient scored highly on cardio tests." - -/datum/quirk/friendly - name = "Friendly" - desc = "You give the best hugs, especially when you're in the right mood." - icon = "hands-helping" - value = 2 - mob_trait = TRAIT_FRIENDLY - gain_text = "You want to hug someone." - lose_text = "You no longer feel compelled to hug others." - mood_quirk = TRUE - medical_record_text = "Patient demonstrates low-inhibitions for physical contact and well-developed arms. Requesting another doctor take over this case." - -/datum/quirk/jolly - name = "Jolly" - desc = "You sometimes just feel happy, for no reason at all." - icon = "grin" - value = 4 - mob_trait = TRAIT_JOLLY - mood_quirk = TRUE - medical_record_text = "Patient demonstrates constant euthymia irregular for environment. It's a bit much, to be honest." - -/datum/quirk/light_step - name = "Light Step" - desc = "You walk with a gentle step; footsteps and stepping on sharp objects is quieter and less painful. Also, your hands and clothes will not get messed in case of stepping in blood." - icon = "shoe-prints" - value = 4 - mob_trait = TRAIT_LIGHT_STEP - gain_text = "You walk with a little more litheness." - lose_text = "You start tromping around like a barbarian." - medical_record_text = "Patient's dexterity belies a strong capacity for stealth." - -/datum/quirk/item_quirk/musician - name = "Musician" - desc = "You can tune handheld musical instruments to play melodies that clear certain negative effects and soothe the soul." - icon = "guitar" - value = 2 - mob_trait = TRAIT_MUSICIAN - gain_text = "You know everything about musical instruments." - lose_text = "You forget how musical instruments work." - medical_record_text = "Patient brain scans show a highly-developed auditory pathway." - -/datum/quirk/item_quirk/musician/add_unique() - give_item_to_holder(/obj/item/choice_beacon/music, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/night_vision - name = "Night Vision" - desc = "You can see slightly more clearly in full darkness than most people." - icon = "eye" - value = 4 - mob_trait = TRAIT_NIGHT_VISION - gain_text = "The shadows seem a little less dark." - lose_text = "Everything seems a little darker." - medical_record_text = "Patient's eyes show above-average acclimation to darkness." - -/datum/quirk/night_vision/add() - refresh_quirk_holder_eyes() - -/datum/quirk/night_vision/remove() - refresh_quirk_holder_eyes() - -/datum/quirk/night_vision/proc/refresh_quirk_holder_eyes() - var/mob/living/carbon/human/human_quirk_holder = quirk_holder - var/obj/item/organ/eyes/eyes = human_quirk_holder.getorgan(/obj/item/organ/eyes) - if(!eyes || eyes.lighting_alpha) - return - // We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes. - eyes.refresh() - -/datum/quirk/selfaware - name = "Self-Aware" - desc = "You know your body well, and can accurately assess the extent of your wounds." - icon = "bone" - value = 8 - mob_trait = TRAIT_SELF_AWARE - medical_record_text = "Patient demonstrates an uncanny knack for self-diagnosis." - -/datum/quirk/skittish - name = "Skittish" - desc = "You're easy to startle, and hide frequently. Run into a closed locker to jump into it, as long as you have access. You can walk to avoid this." - icon = "trash" - value = 8 - mob_trait = TRAIT_SKITTISH - medical_record_text = "Patient demonstrates a high aversion to danger and has described hiding in containers out of fear." - -/datum/quirk/item_quirk/spiritual - name = "Spiritual" - desc = "You hold a spiritual belief, whether in God, nature or the arcane rules of the universe. You gain comfort from the presence of holy people, and believe that your prayers are more special than others. Being in the chapel makes you happy." - icon = "bible" - value = 4 - mob_trait = TRAIT_SPIRITUAL - gain_text = "You have faith in a higher power." - lose_text = "You lose faith!" - medical_record_text = "Patient reports a belief in a higher power." - -/datum/quirk/item_quirk/spiritual/add_unique() - give_item_to_holder(/obj/item/storage/fancy/candle_box, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - give_item_to_holder(/obj/item/storage/box/matches, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/tagger - name = "Tagger" - desc = "You're an experienced artist. People will actually be impressed by your graffiti, and you can get twice as many uses out of drawing supplies." - icon = "spray-can" - value = 4 - mob_trait = TRAIT_TAGGER - gain_text = "You know how to tag walls efficiently." - lose_text = "You forget how to tag walls properly." - medical_record_text = "Patient was recently seen for possible paint huffing incident." - -/datum/quirk/item_quirk/tagger/add_unique() - give_item_to_holder(/obj/item/toy/crayon/spraycan, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/voracious - name = "Voracious" - desc = "Nothing gets between you and your food. You eat faster and can binge on junk food! Being fat suits you just fine." - icon = "drumstick-bite" - value = 4 - mob_trait = TRAIT_VORACIOUS - gain_text = "You feel HONGRY." - lose_text = "You no longer feel HONGRY." diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm deleted file mode 100644 index 422a408933fc..000000000000 --- a/code/datums/quirks/negative.dm +++ /dev/null @@ -1,897 +0,0 @@ -//predominantly negative traits - -/datum/quirk/badback - name = "Bad Back" - desc = "Thanks to your poor posture, backpacks and other bags never sit right on your back. More evently weighted objects are fine, though." - icon = "hiking" - value = -8 - mood_quirk = TRUE - gain_text = "Your back REALLY hurts!" - lose_text = "Your back feels better." - medical_record_text = "Patient scans indicate severe and chronic back pain." - hardcore_value = 4 - var/datum/weakref/backpack - -/datum/quirk/badback/add() - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/storage/backpack/equipped_backpack = human_holder.back - if(istype(equipped_backpack)) - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "back_pain", /datum/mood_event/back_pain) - RegisterSignal(human_holder.back, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(on_unequipped_backpack)) - else - RegisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item)) - -/datum/quirk/badback/remove() - UnregisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM) - - var/obj/item/storage/equipped_backpack = backpack?.resolve() - if(equipped_backpack) - UnregisterSignal(equipped_backpack, COMSIG_ITEM_POST_UNEQUIP) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "back_pain") - -/// Signal handler for when the quirk_holder equips an item. If it's a backpack, adds the back_pain mood event. -/datum/quirk/badback/proc/on_equipped_item(mob/living/source, obj/item/equipped_item, slot) - SIGNAL_HANDLER - - if((slot != ITEM_SLOT_BACK) || !istype(equipped_item, /obj/item/storage/backpack)) - return - - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "back_pain", /datum/mood_event/back_pain) - RegisterSignal(equipped_item, COMSIG_ITEM_POST_UNEQUIP, PROC_REF(on_unequipped_backpack)) - UnregisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM) - backpack = WEAKREF(equipped_item) - -/// Signal handler for when the quirk_holder unequips an equipped backpack. Removes the back_pain mood event. -/datum/quirk/badback/proc/on_unequipped_backpack(obj/item/source, force, atom/newloc, no_move, invdrop, silent) - SIGNAL_HANDLER - - UnregisterSignal(source, COMSIG_ITEM_POST_UNEQUIP) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "back_pain") - backpack = null - RegisterSignal(quirk_holder, COMSIG_MOB_EQUIPPED_ITEM, PROC_REF(on_equipped_item)) - -/datum/quirk/blooddeficiency - name = "Blood Deficiency" - desc = "Your body can't produce enough blood to sustain itself." - icon = "tint" - value = -8 - gain_text = "You feel your vigor slowly fading away." - lose_text = "You feel vigorous again." - medical_record_text = "Patient requires regular treatment for blood loss due to low production of blood." - hardcore_value = 8 - processing_quirk = TRUE - -/datum/quirk/blooddeficiency/process(delta_time) - if(quirk_holder.stat == DEAD) - return - - 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 - - if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment - H.blood_volume -= 0.275 * delta_time - -/datum/quirk/item_quirk/blindness - name = "Blind" - desc = "You are completely blind, nothing can counteract this." - icon = "eye-slash" - value = -16 - gain_text = "You can't see anything." - lose_text = "You miraculously gain back your vision." - medical_record_text = "Patient has permanent blindness." - hardcore_value = 15 - -/datum/quirk/item_quirk/blindness/add_unique() - give_item_to_holder(/obj/item/clothing/glasses/blindfold/white, list(LOCATION_EYES = ITEM_SLOT_EYES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/blindness/add() - quirk_holder.become_blind(QUIRK_TRAIT) - -/datum/quirk/item_quirk/blindness/remove() - quirk_holder.cure_blind(QUIRK_TRAIT) - - /* A couple of brain tumor stats for anyone curious / looking at this quirk for balancing: - * - It takes less 16 minute 40 seconds to die from brain death due to a brain tumor. - * - It takes 1 minutes 40 seconds to take 10% (20 organ damage) brain damage. - * - 5u mannitol will heal 12.5% (25 organ damage) brain damage - */ -/datum/quirk/item_quirk/brainproblems - name = "Brain Tumor" - desc = "You have a little friend in your brain that is slowly destroying it. Better bring some mannitol!" - icon = "brain" - value = -12 - 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." - hardcore_value = 12 - processing_quirk = TRUE - -/datum/quirk/item_quirk/brainproblems/add_unique() - give_item_to_holder( - /obj/item/storage/pill_bottle/mannitol/braintumor, - list( - LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, - LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS, - ), - flavour_text = "These will keep you alive until you can secure a supply of medication. Don't rely on them too much!", - ) - -/datum/quirk/item_quirk/brainproblems/process(delta_time) - if(quirk_holder.stat == DEAD) - return - - if(HAS_TRAIT(quirk_holder, TRAIT_TUMOR_SUPPRESSED)) - return - - quirk_holder.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * delta_time) - -/datum/quirk/deafness - name = "Deaf" - desc = "You are incurably deaf." - icon = "deaf" - value = -8 - mob_trait = TRAIT_DEAF - gain_text = "You can't hear anything." - lose_text = "You're able to hear again!" - medical_record_text = "Patient's cochlear nerve is incurably damaged." - hardcore_value = 12 - -/datum/quirk/depression - name = "Depression" - desc = "You sometimes just hate life." - icon = "frown" - mob_trait = TRAIT_DEPRESSION - value = -3 - gain_text = "You start feeling depressed." - lose_text = "You no longer feel depressed." //if only it were that easy! - medical_record_text = "Patient has a mild mood disorder causing them to experience acute episodes of depression." - mood_quirk = TRUE - hardcore_value = 2 - -/datum/quirk/item_quirk/family_heirloom - name = "Family Heirloom" - desc = "You are the current owner of an heirloom, passed down for generations. You have to keep it safe!" - icon = "toolbox" - value = -2 - mood_quirk = TRUE - medical_record_text = "Patient demonstrates an unnatural attachment to a family heirloom." - hardcore_value = 1 - processing_quirk = TRUE - /// A weak reference to our heirloom. - var/datum/weakref/heirloom - -/datum/quirk/item_quirk/family_heirloom/add_unique() - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/heirloom_type - - // The quirk holder's species - we have a 50% chance, if we have a species with a set heirloom, to choose a species heirloom. - var/datum/species/holder_species = human_holder.dna?.species - if(holder_species && LAZYLEN(holder_species.family_heirlooms) && prob(50)) - heirloom_type = pick(holder_species.family_heirlooms) - else - // Our quirk holder's job - var/datum/job/holder_job = human_holder.last_mind?.assigned_role - if(holder_job && LAZYLEN(holder_job.family_heirlooms)) - heirloom_type = pick(holder_job.family_heirlooms) - - // If we didn't find an heirloom somehow, throw them a generic one - if(!heirloom_type) - heirloom_type = pick(/obj/item/toy/cards/deck, /obj/item/lighter, /obj/item/dice/d20) - - var/obj/new_heirloom = new heirloom_type(get_turf(human_holder)) - heirloom = WEAKREF(new_heirloom) - - give_item_to_holder( - new_heirloom, - list( - LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, - LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS, - ), - flavour_text = "This is a precious family heirloom, passed down from generation to generation. Keep it safe!", - ) - -/datum/quirk/item_quirk/family_heirloom/post_add() - var/list/names = splittext(quirk_holder.real_name, " ") - var/family_name = names[names.len] - - var/obj/family_heirloom = heirloom?.resolve() - if(!family_heirloom) - to_chat(quirk_holder, "A wave of existential dread runs over you as you realise your precious family heirloom is missing. Perhaps the Gods will show mercy on your cursed soul?") - return - family_heirloom.AddComponent(/datum/component/heirloom, quirk_holder.mind, family_name) - - return ..() - -/datum/quirk/item_quirk/family_heirloom/process() - if(quirk_holder.stat == DEAD) - return - - var/obj/family_heirloom = heirloom?.resolve() - - if(family_heirloom && (family_heirloom in quirk_holder.get_all_contents())) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom", /datum/mood_event/family_heirloom) - else - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "family_heirloom_missing", /datum/mood_event/family_heirloom_missing) - -/datum/quirk/item_quirk/family_heirloom/remove() - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom_missing") - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "family_heirloom") - -/datum/quirk/frail - name = "Frail" - desc = "You have skin of paper and bones of glass! You suffer wounds much more easily than most." - icon = "skull" - value = -6 - mob_trait = TRAIT_EASILY_WOUNDED - gain_text = "You feel frail." - lose_text = "You feel sturdy again." - medical_record_text = "Patient is absurdly easy to injure. Please take all due dilligence to avoid possible malpractice suits." - hardcore_value = 4 - -/datum/quirk/heavy_sleeper - name = "Heavy Sleeper" - desc = "You sleep like a rock! Whenever you're put to sleep or knocked unconscious, you take a little bit longer to wake up." - icon = "bed" - value = -2 - mob_trait = TRAIT_HEAVY_SLEEPER - gain_text = "You feel sleepy." - lose_text = "You feel awake again." - medical_record_text = "Patient has abnormal sleep study results and is difficult to wake up." - hardcore_value = 2 - -/datum/quirk/hypersensitive - name = "Hypersensitive" - desc = "For better or worse, everything seems to affect your mood more than it should." - icon = "flushed" - value = -2 - gain_text = "You seem to make a big deal out of everything." - lose_text = "You don't seem to make a big deal out of everything anymore." - medical_record_text = "Patient demonstrates a high level of emotional volatility." - hardcore_value = 3 - -/datum/quirk/hypersensitive/add() - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - if(mood) - mood.mood_modifier += 0.5 - -/datum/quirk/hypersensitive/remove() - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - if(mood) - mood.mood_modifier -= 0.5 - -/datum/quirk/light_drinker - name = "Light Drinker" - desc = "You just can't handle your drinks and get drunk very quickly." - icon = "cocktail" - value = -2 - mob_trait = TRAIT_LIGHT_DRINKER - gain_text = "Just the thought of drinking alcohol makes your head spin." - lose_text = "You're no longer severely affected by alcohol." - medical_record_text = "Patient demonstrates a low tolerance for alcohol. (Wimp)" - hardcore_value = 3 - -/datum/quirk/item_quirk/nearsighted - name = "Nearsighted" - desc = "You are nearsighted without prescription glasses, but spawn with a pair." - icon = "glasses" - value = -4 - gain_text = "Things far away from you start looking blurry." - lose_text = "You start seeing faraway things normally again." - medical_record_text = "Patient requires prescription glasses in order to counteract nearsightedness." - hardcore_value = 5 - var/glasses - -/datum/quirk/item_quirk/nearsighted/add_unique() - glasses = glasses || quirk_holder.client?.prefs?.read_preference(/datum/preference/choiced/glasses) - switch(glasses) - if ("Thin") - glasses = /obj/item/clothing/glasses/regular/thin - if ("Circle") - glasses = /obj/item/clothing/glasses/regular/circle - if ("Hipster") - glasses = /obj/item/clothing/glasses/regular/hipster - else - glasses = /obj/item/clothing/glasses/regular - - give_item_to_holder(glasses, list(LOCATION_EYES = ITEM_SLOT_EYES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/nearsighted/add() - quirk_holder.become_nearsighted(QUIRK_TRAIT) - -/datum/quirk/item_quirk/nearsighted/remove() - quirk_holder.cure_nearsighted(QUIRK_TRAIT) - -/datum/quirk/nyctophobia - name = "Nyctophobia" - desc = "As far as you can remember, you've always been afraid of the dark. While in the dark without a light source, you instinctually act careful, and constantly feel a sense of dread." - icon = "lightbulb" - value = -3 - medical_record_text = "Patient demonstrates a fear of the dark. (Seriously?)" - hardcore_value = 5 - -/datum/quirk/nyctophobia/add() - RegisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved)) - -/datum/quirk/nyctophobia/remove() - UnregisterSignal(quirk_holder, COMSIG_MOVABLE_MOVED) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") - -/// Called when the quirk holder moves. Updates the quirk holder's mood. -/datum/quirk/nyctophobia/proc/on_holder_moved(mob/living/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - - if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) - return - - var/mob/living/carbon/human/human_holder = quirk_holder - - if(human_holder.dna?.species.id in list(SPECIES_SHADOW, SPECIES_NIGHTMARE)) - return - - if((human_holder.sight & SEE_TURFS) == SEE_TURFS) - return - - var/turf/holder_turf = get_turf(quirk_holder) - - var/lums = holder_turf.get_lumcount() - - if(lums > LIGHTING_TILE_IS_DARK) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "nyctophobia") - return - - if(quirk_holder.m_intent != MOVE_INTENT_WALK) - to_chat(quirk_holder, span_warning("Easy, easy, take it slow... you're in the dark...")) - quirk_holder.set_move_intent(MOVE_INTENT_WALK) - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "nyctophobia", /datum/mood_event/nyctophobia) - -/datum/quirk/nonviolent - name = "Pacifist" - desc = "The thought of violence makes you sick. So much so, in fact, that you can't hurt anyone." - icon = "peace" - value = -8 - mob_trait = TRAIT_PACIFISM - gain_text = "You feel repulsed by the thought of violence!" - lose_text = "You think you can defend yourself again." - medical_record_text = "Patient is unusually pacifistic and cannot bring themselves to cause physical harm." - hardcore_value = 6 - -/datum/quirk/paraplegic - name = "Paraplegic" - desc = "Your legs do not function. Nothing will ever fix this. But hey, free wheelchair!" - icon = "wheelchair" - value = -12 - human_only = TRUE - gain_text = null // Handled by trauma. - lose_text = null - medical_record_text = "Patient has an untreatable impairment in motor function in the lower extremities." - hardcore_value = 15 - -/datum/quirk/paraplegic/add_unique() - if(quirk_holder.buckled) // Handle late joins being buckled to arrival shuttle chairs. - quirk_holder.buckled.unbuckle_mob(quirk_holder) - - var/turf/holder_turf = get_turf(quirk_holder) - var/obj/structure/chair/spawn_chair = locate() in holder_turf - - var/obj/vehicle/ridden/wheelchair/wheels - if(quirk_holder.client?.get_award_status(HARDCORE_RANDOM_SCORE) >= 5000) //More than 5k score? you unlock the gamer wheelchair. - wheels = new /obj/vehicle/ridden/wheelchair/gold(holder_turf) - else - wheels = new(holder_turf) - if(spawn_chair) // Makes spawning on the arrivals shuttle more consistent looking - wheels.setDir(spawn_chair.dir) - - wheels.buckle_mob(quirk_holder) - - // During the spawning process, they may have dropped what they were holding, due to the paralysis - // So put the things back in their hands. - for(var/obj/item/dropped_item in holder_turf) - if(dropped_item.fingerprintslast == quirk_holder.ckey) - quirk_holder.put_in_hands(dropped_item) - -/datum/quirk/paraplegic/add() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/paraplegic/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.cure_trauma_type(/datum/brain_trauma/severe/paralysis/paraplegic, TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/poor_aim - name = "Stormtrooper Aim" - desc = "You've never hit anything you were aiming for in your life." - icon = "bullseye" - value = -4 - mob_trait = TRAIT_POOR_AIM - medical_record_text = "Patient possesses a strong tremor in both hands." - hardcore_value = 3 - -/datum/quirk/prosopagnosia - name = "Prosopagnosia" - desc = "You have a mental disorder that prevents you from being able to recognize faces at all." - icon = "user-secret" - value = -4 - mob_trait = TRAIT_PROSOPAGNOSIA - medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces." - hardcore_value = 5 - -/datum/quirk/prosthetic_limb - name = "Prosthetic Limb" - desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!" - icon = "tg-prosthetic-leg" - value = -4 - var/slot_string = "limb" - medical_record_text = "During physical examination, patient was found to have a prosthetic limb." - hardcore_value = 3 - -/datum/quirk/prosthetic_limb/add_unique() - var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/bodypart/old_part = human_holder.get_bodypart(limb_slot) - var/obj/item/bodypart/prosthetic - switch(limb_slot) - if(BODY_ZONE_L_ARM) - prosthetic = new/obj/item/bodypart/arm/left/robot/surplus(quirk_holder) - slot_string = "left arm" - if(BODY_ZONE_R_ARM) - prosthetic = new/obj/item/bodypart/arm/right/robot/surplus(quirk_holder) - slot_string = "right arm" - if(BODY_ZONE_L_LEG) - prosthetic = new/obj/item/bodypart/leg/left/robot/surplus(quirk_holder) - slot_string = "left leg" - if(BODY_ZONE_R_LEG) - prosthetic = new/obj/item/bodypart/leg/right/robot/surplus(quirk_holder) - slot_string = "right leg" - prosthetic.replace_limb(human_holder) - qdel(old_part) - human_holder.regenerate_icons() - -/datum/quirk/prosthetic_limb/post_add() - to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \ - you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.") - -/datum/quirk/pushover - name = "Pushover" - desc = "Your first instinct is always to let people push you around. Resisting out of grabs will take conscious effort." - icon = "handshake" - value = -8 - mob_trait = TRAIT_GRABWEAKNESS - gain_text = "You feel like a pushover." - lose_text = "You feel like standing up for yourself." - medical_record_text = "Patient presents a notably unassertive personality and is easy to manipulate." - hardcore_value = 4 - -/datum/quirk/insanity - name = "Reality Dissociation Syndrome" - desc = "You suffer from a severe disorder that causes very vivid hallucinations. Mindbreaker toxin can suppress its effects, and you are immune to mindbreaker's hallucinogenic properties. THIS IS NOT A LICENSE TO GRIEF." - icon = "grin-tongue-wink" - value = -8 - mob_trait = TRAIT_INSANITY - gain_text = "..." - lose_text = "You feel in tune with the world again." - medical_record_text = "Patient suffers from acute Reality Dissociation Syndrome and experiences vivid hallucinations." - hardcore_value = 6 - processing_quirk = TRUE - -/datum/quirk/insanity/process(delta_time) - if(quirk_holder.stat >= UNCONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) - return - - if(DT_PROB(2, delta_time)) - quirk_holder.hallucination += rand(10, 25) - -/datum/quirk/insanity/post_add() //I don't /think/ we'll need this but for newbies who think "roleplay as insane" = "license to kill" it's probably a good thing to have - if(!quirk_holder.mind || quirk_holder.mind.special_role) - return - to_chat(quirk_holder, "Please note that your dissociation syndrome does NOT give you the right to attack people or otherwise cause any interference to \ - the round. You are not an antagonist, and the rules will treat you the same as other crewmembers.") - -/datum/quirk/social_anxiety - name = "Social Anxiety" - desc = "Talking to people is very difficult for you, and you often stutter or even lock up." - icon = "comment-slash" - value = -3 - gain_text = "You start worrying about what you're saying." - lose_text = "You feel easier about talking again." //if only it were that easy! - medical_record_text = "Patient is usually anxious in social encounters and prefers to avoid them." - hardcore_value = 4 - mob_trait = TRAIT_ANXIOUS - var/dumb_thing = TRUE - -/datum/quirk/social_anxiety/add() - RegisterSignal(quirk_holder, COMSIG_MOB_EYECONTACT, PROC_REF(eye_contact)) - RegisterSignal(quirk_holder, COMSIG_MOB_EXAMINATE, PROC_REF(looks_at_floor)) - RegisterSignal(quirk_holder, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/quirk/social_anxiety/remove() - UnregisterSignal(quirk_holder, list(COMSIG_MOB_EYECONTACT, COMSIG_MOB_EXAMINATE, COMSIG_MOB_SAY)) - -/datum/quirk/social_anxiety/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - if(HAS_TRAIT(quirk_holder, TRAIT_FEARLESS)) - return - - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - var/moodmod - if(mood) - moodmod = (1+0.02*(50-(max(50, mood.mood_level*(7-mood.sanity_level))))) //low sanity levels are better, they max at 6 - else - moodmod = (1+0.02*(50-(max(50, 0.1*quirk_holder.nutrition)))) - var/nearby_people = 0 - for(var/mob/living/carbon/human/H in oview(3, quirk_holder)) - if(H.client) - nearby_people++ - var/message = speech_args[SPEECH_MESSAGE] - if(message) - var/list/message_split = splittext(message, " ") - var/list/new_message = list() - var/mob/living/carbon/human/quirker = quirk_holder - for(var/word in message_split) - if(prob(max(5,(nearby_people*12.5*moodmod))) && word != message_split[1]) //Minimum 1/20 chance of filler - new_message += pick("uh,","erm,","um,") - if(prob(min(5,(0.05*(nearby_people*12.5)*moodmod)))) //Max 1 in 20 chance of cutoff after a succesful filler roll, for 50% odds in a 15 word sentence - quirker.silent = max(3, quirker.silent) - to_chat(quirker, span_danger("You feel self-conscious and stop talking. You need a moment to recover!")) - break - if(prob(max(5,(nearby_people*12.5*moodmod)))) //Minimum 1/20 chance of stutter - // Add a short stutter, THEN treat our word - quirker.adjust_timed_status_effect(0.5 SECONDS, /datum/status_effect/speech/stutter) - new_message += quirker.treat_message(word) - - else - new_message += word - - message = jointext(new_message, " ") - var/mob/living/carbon/human/quirker = quirk_holder - if(prob(min(50,(0.50*(nearby_people*12.5)*moodmod)))) //Max 50% chance of not talking - if(dumb_thing) - to_chat(quirker, span_userdanger("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)) - new/obj/item/food/spaghetti/pastatomato(get_turf(quirker)) //now that's what I call spaghetti code - else - to_chat(quirk_holder, span_warning("You think that wouldn't add much to the conversation and decide not to say it.")) - if(prob(min(25,(0.25*(nearby_people*12.75)*moodmod)))) //Max 25% chance of silence stacks after succesful not talking roll - to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking.")) - quirker.silent = max(5, quirker.silent) - speech_args[SPEECH_MESSAGE] = pick("Uh.","Erm.","Um.") - else - speech_args[SPEECH_MESSAGE] = message - -// small chance to make eye contact with inanimate objects/mindless mobs because of nerves -/datum/quirk/social_anxiety/proc/looks_at_floor(datum/source, atom/A) - SIGNAL_HANDLER - - var/mob/living/mind_check = A - if(prob(85) || (istype(mind_check) && mind_check.mind)) - return - - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_smallnotice("You make eye contact with [A].")), 3) - -/datum/quirk/social_anxiety/proc/eye_contact(datum/source, mob/living/other_mob, triggering_examiner) - SIGNAL_HANDLER - - if(prob(75)) - return - var/msg - if(triggering_examiner) - msg = "You make eye contact with [other_mob], " - else - msg = "[other_mob] makes eye contact with you, " - - switch(rand(1,3)) - if(1) - quirk_holder.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - msg += "causing you to start fidgeting!" - if(2) - quirk_holder.set_timed_status_effect(6 SECONDS, /datum/status_effect/speech/stutter, only_if_higher = TRUE) - msg += "causing you to start stuttering!" - if(3) - quirk_holder.Stun(2 SECONDS) - msg += "causing you to freeze up!" - - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "anxiety_eyecontact", /datum/mood_event/anxiety_eyecontact) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), quirk_holder, span_userdanger("[msg]")), 3) // so the examine signal has time to fire and this will print after - return COMSIG_BLOCK_EYECONTACT - -/datum/mood_event/anxiety_eyecontact - description = "Sometimes eye contact makes me so nervous..." - mood_change = -5 - timeout = 3 MINUTES - -/datum/quirk/item_quirk/junkie - name = "Junkie" - desc = "You can't get enough of hard drugs." - icon = "pills" - value = -6 - gain_text = "You suddenly feel the craving for drugs." - medical_record_text = "Patient has a history of hard drugs." - hardcore_value = 4 - processing_quirk = TRUE - var/drug_list = list(/datum/reagent/drug/blastoff, /datum/reagent/drug/krokodil, /datum/reagent/medicine/morphine, /datum/reagent/drug/happiness, /datum/reagent/drug/methamphetamine) //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 - var/obj/item/drug_container_type //! If this is defined before pill generation, pill generation will be skipped. This is the type of the pill bottle. - var/where_accessory //! where the accessory spawned - var/obj/item/accessory_type //! If this is null, an accessory won't be spawned. - var/process_interval = 30 SECONDS //! how frequently the quirk processes - var/next_process = 0 //! ticker for processing - var/drug_flavour_text = "Better hope you don't run out..." - -/datum/quirk/item_quirk/junkie/add_unique() - var/mob/living/carbon/human/human_holder = quirk_holder - - if(!reagent_type) - reagent_type = pick(drug_list) - - reagent_instance = new reagent_type() - - for(var/addiction in reagent_instance.addiction_types) - human_holder.last_mind?.add_addiction_points(addiction, 1000) - - var/current_turf = get_turf(quirk_holder) - - if(!drug_container_type) - drug_container_type = /obj/item/storage/pill_bottle - - var/obj/item/drug_instance = new drug_container_type(current_turf) - if(istype(drug_instance, /obj/item/storage/pill_bottle)) - var/pill_state = "pill[rand(1,20)]" - for(var/i in 1 to 7) - var/obj/item/reagent_containers/pill/pill = new(drug_instance) - pill.icon_state = pill_state - pill.reagents.add_reagent(reagent_type, 3) - - give_item_to_holder( - drug_instance, - list( - LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, - LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS, - ), - flavour_text = drug_flavour_text, - ) - - if(accessory_type) - give_item_to_holder( - accessory_type, - list( - LOCATION_LPOCKET = ITEM_SLOT_LPOCKET, - LOCATION_RPOCKET = ITEM_SLOT_RPOCKET, - LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, - LOCATION_HANDS = ITEM_SLOT_HANDS, - ) - ) - -/datum/quirk/item_quirk/junkie/remove() - if(quirk_holder && reagent_instance) - for(var/addiction_type in subtypesof(/datum/addiction)) - quirk_holder.mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) - -/datum/quirk/item_quirk/junkie/process(delta_time) - if(HAS_TRAIT(quirk_holder, TRAIT_NOMETABOLISM)) - return - var/mob/living/carbon/human/human_holder = quirk_holder - if(world.time > next_process) - next_process = world.time + process_interval - var/deleted = QDELETED(reagent_instance) - var/missing_addiction = FALSE - for(var/addiction_type in reagent_instance.addiction_types) - if(!LAZYACCESS(human_holder.last_mind?.active_addictions, addiction_type)) - missing_addiction = TRUE - if(deleted || missing_addiction) - if(deleted) - reagent_instance = new reagent_type() - to_chat(quirk_holder, span_danger("You thought you kicked it, but you feel like you're falling back onto bad habits..")) - for(var/addiction in reagent_instance.addiction_types) - human_holder.last_mind?.add_addiction_points(addiction, 1000) ///Max that shit out - -/datum/quirk/item_quirk/junkie/smoker - name = "Smoker" - desc = "Sometimes you just really want a smoke. Probably not great for your lungs." - icon = "smoking" - value = -4 - gain_text = "You could really go for a smoke right about now." - medical_record_text = "Patient is a current smoker." - reagent_type = /datum/reagent/drug/nicotine - accessory_type = /obj/item/lighter/greyscale - mob_trait = TRAIT_SMOKER - hardcore_value = 1 - drug_flavour_text = "Make sure you get your favorite brand when you run out." - -/datum/quirk/item_quirk/junkie/smoker/New() - drug_container_type = pick(/obj/item/storage/fancy/cigarettes, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/storage/fancy/cigarettes/cigpack_uplift, - /obj/item/storage/fancy/cigarettes/cigpack_robust, - /obj/item/storage/fancy/cigarettes/cigpack_robustgold, - /obj/item/storage/fancy/cigarettes/cigpack_carp) - - return ..() - -/datum/quirk/item_quirk/junkie/smoker/post_add() - . = ..() - var/brand = initial(drug_container_type.name) - quirk_holder.mind.add_memory(MEMORY_QUIRK_DRUG, list(DETAIL_FAV_BRAND = brand), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT) - // smoker lungs have 25% less health and healing - var/obj/item/organ/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS) - if (smoker_lungs && !(smoker_lungs.organ_flags & ORGAN_SYNTHETIC)) // robotic lungs aren't affected - smoker_lungs.maxHealth = smoker_lungs.maxHealth * 0.75 - smoker_lungs.healing_factor = smoker_lungs.healing_factor * 0.75 - -/datum/quirk/item_quirk/junkie/smoker/process(delta_time) - . = ..() - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/mask_item = human_holder.get_item_by_slot(ITEM_SLOT_MASK) - if (istype(mask_item, /obj/item/clothing/mask/cigarette)) - var/obj/item/storage/fancy/cigarettes/cigarettes = drug_container_type - if(istype(mask_item, initial(cigarettes.spawn_type))) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "wrong_cigs") - return - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "wrong_cigs", /datum/mood_event/wrong_brand) - -/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!" - icon = "angry" - value = -10 - mob_trait = TRAIT_UNSTABLE - 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." - hardcore_value = 9 - -/datum/quirk/item_quirk/allergic - name = "Extreme Medicine Allergy" - desc = "Ever since you were a kid, you've been allergic to certain chemicals..." - icon = "prescription-bottle" - value = -6 - gain_text = "You feel your immune system shift." - lose_text = "You feel your immune system phase back into perfect shape." - medical_record_text = "Patient's immune system responds violently to certain chemicals." - hardcore_value = 3 - processing_quirk = TRUE - var/list/allergies = list() - var/list/blacklist = list(/datum/reagent/medicine/c2,/datum/reagent/medicine/epinephrine,/datum/reagent/medicine/adminordrazine,/datum/reagent/medicine/omnizine/godblood,/datum/reagent/medicine/cordiolis_hepatico,/datum/reagent/medicine/synaphydramine,/datum/reagent/medicine/diphenhydramine) - var/allergy_string - -/datum/quirk/item_quirk/allergic/add_unique() - var/list/chem_list = subtypesof(/datum/reagent/medicine) - blacklist - var/list/allergy_chem_names = list() - for(var/i in 0 to 5) - var/datum/reagent/medicine/chem_type = pick_n_take(chem_list) - allergies += chem_type - allergy_chem_names += initial(chem_type.name) - - allergy_string = allergy_chem_names.Join(", ") - name = "Extreme [allergy_string] Allergies" - medical_record_text = "Patient's immune system responds violently to [allergy_string]" - - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/clothing/accessory/allergy_dogtag/dogtag = new(get_turf(human_holder)) - dogtag.display = allergy_string - - give_item_to_holder(dogtag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS), flavour_text = "Make sure medical staff can see this...") - -/datum/quirk/item_quirk/allergic/post_add() - quirk_holder.mind.add_memory(MEMORY_ALLERGY, list(DETAIL_ALLERGY_TYPE = allergy_string), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT) - to_chat(quirk_holder, span_boldnotice("You are allergic to [allergy_string], make sure not to consume any of these!")) - -/datum/quirk/item_quirk/allergic/process(delta_time) - if(!iscarbon(quirk_holder)) - return - - if(IS_IN_STASIS(quirk_holder)) - return - - if(quirk_holder.stat == DEAD) - return - - var/mob/living/carbon/carbon_quirk_holder = quirk_holder - for(var/allergy in allergies) - var/datum/reagent/instantiated_med = carbon_quirk_holder.reagents.has_reagent(allergy) - if(!instantiated_med) - continue - //Just halts the progression, I'd suggest you run to medbay asap to get it fixed - if(carbon_quirk_holder.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) - instantiated_med.reagent_removal_skip_list |= ALLERGIC_REMOVAL_SKIP - return //intentionally stops the entire proc so we avoid the organ damage after the loop - instantiated_med.reagent_removal_skip_list -= ALLERGIC_REMOVAL_SKIP - carbon_quirk_holder.adjustToxLoss(3 * delta_time) - carbon_quirk_holder.reagents.add_reagent(/datum/reagent/toxin/histamine, 3 * delta_time) - if(DT_PROB(10, delta_time)) - carbon_quirk_holder.vomit() - carbon_quirk_holder.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_APPENDIX,ORGAN_SLOT_LUNGS,ORGAN_SLOT_HEART,ORGAN_SLOT_LIVER,ORGAN_SLOT_STOMACH),10) - -/datum/quirk/bad_touch - name = "Bad Touch" - desc = "You don't like hugs. You'd really prefer if people just left you alone." - icon = "tg-bad-touch" - mob_trait = TRAIT_BADTOUCH - value = -1 - gain_text = "You just want people to leave you alone." - lose_text = "You could use a big hug." - medical_record_text = "Patient has disdain for being touched. Potentially has undiagnosed haphephobia." - mood_quirk = TRUE - hardcore_value = 1 - -/datum/quirk/bad_touch/add() - RegisterSignal(quirk_holder, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT), PROC_REF(uncomfortable_touch)) - -/datum/quirk/bad_touch/remove() - UnregisterSignal(quirk_holder, list(COMSIG_LIVING_GET_PULLED, COMSIG_CARBON_HELP_ACT)) - -/// Causes a negative moodlet to our quirk holder on signal -/datum/quirk/bad_touch/proc/uncomfortable_touch(datum/source) - SIGNAL_HANDLER - - if(quirk_holder.stat == DEAD) - return - - new /obj/effect/temp_visual/annoyed(quirk_holder.loc) - var/datum/component/mood/mood = quirk_holder.GetComponent(/datum/component/mood) - if(mood.sanity <= SANITY_NEUTRAL) - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "bad_touch", /datum/mood_event/very_bad_touch) - else - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "bad_touch", /datum/mood_event/bad_touch) - -/datum/quirk/claustrophobia - name = "Claustrophobia" - desc = "You are terrified of small spaces and certain jolly figures. If you are placed inside any container, locker, or machinery, a panic attack sets in and you struggle to breathe." - icon = "box-open" - value = -4 - medical_record_text = "Patient demonstrates a fear of tight spaces." - hardcore_value = 5 - processing_quirk = TRUE - -/datum/quirk/claustrophobia/remove() - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "claustrophobia") - -/datum/quirk/claustrophobia/process(delta_time) - if(quirk_holder.stat != CONSCIOUS || quirk_holder.IsSleeping() || quirk_holder.IsUnconscious()) - return - - var/nick_spotted = FALSE - - for(var/mob/living/carbon/human/possible_claus in view(5, quirk_holder)) - if(evaluate_jolly_levels(possible_claus)) - nick_spotted = TRUE - break - - if(!nick_spotted && isturf(quirk_holder.loc)) - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "claustrophobia", /datum/mood_event/claustrophobia) - return - - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "claustrophobia") - quirk_holder.losebreath += 0.25 // miss a breath one in four times - if(DT_PROB(25, delta_time)) - if(nick_spotted) - to_chat(quirk_holder, span_warning("Santa Claus is here! I gotta get out of here!")) - else - to_chat(quirk_holder, span_warning("You feel trapped! Must escape... can't breathe...")) - -///investigates whether possible_saint_nick possesses a high level of christmas cheer -/datum/quirk/claustrophobia/proc/evaluate_jolly_levels(mob/living/carbon/human/possible_saint_nick) - if(!istype(possible_saint_nick)) - return FALSE - - if(istype(possible_saint_nick.back, /obj/item/storage/backpack/santabag)) - return TRUE - - if(istype(possible_saint_nick.head, /obj/item/clothing/head/santa)) - return TRUE - - if(istype(possible_saint_nick.wear_suit, /obj/item/clothing/suit/space/santa)) - return TRUE - - return FALSE diff --git a/code/datums/quirks/neutral.dm b/code/datums/quirks/neutral.dm index 9e73799d6c3d..aceca0d1545c 100644 --- a/code/datums/quirks/neutral.dm +++ b/code/datums/quirks/neutral.dm @@ -1,158 +1,13 @@ -//traits with no real impact that can be taken freely -//MAKE SURE THESE DO NOT MAJORLY IMPACT GAMEPLAY. those should be positive or negative traits. - -/datum/quirk/extrovert - name = "Extrovert" - desc = "You are energized by talking to others, and enjoy spending your free time in the bar." - icon = "users" - value = 0 - mob_trait = TRAIT_EXTROVERT - gain_text = "You feel like hanging out with other people." - lose_text = "You feel like you're over the bar scene." - medical_record_text = "Patient will not shut the hell up." - -/datum/quirk/introvert - name = "Introvert" - desc = "You are energized by having time to yourself, and enjoy spending your free time in the library." - icon = "book-reader" - value = 0 - mob_trait = TRAIT_INTROVERT - gain_text = "You feel like reading a good book quietly." - lose_text = "You feel like libraries are boring." - medical_record_text = "Patient doesn't seem to say much." - -/datum/quirk/no_taste - name = "Ageusia" - desc = "You can't taste anything! Toxic food will still poison you." - icon = "meh-blank" - value = 0 - mob_trait = TRAIT_AGEUSIA - gain_text = "You can't taste anything!" - lose_text = "You can taste again!" - medical_record_text = "Patient suffers from ageusia and is incapable of tasting food or reagents." - -/datum/quirk/foreigner - name = "Foreigner" - desc = "You're not from around here. You don't know Galactic Common!" - icon = "language" - value = 0 - gain_text = "The words being spoken around you don't make any sense." - lose_text = "You've developed fluency in Galactic Common." - medical_record_text = "Patient does not speak Galactic Common and may require an interpreter." - -/datum/quirk/foreigner/add() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.add_blocked_language(/datum/language/common) - if(ishumanbasic(human_holder)) - human_holder.grant_language(/datum/language/uncommon) - -/datum/quirk/foreigner/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.remove_blocked_language(/datum/language/common) - if(ishumanbasic(human_holder)) - human_holder.remove_language(/datum/language/uncommon) - -/datum/quirk/vegetarian - name = "Vegetarian" - desc = "You find the idea of eating meat morally and physically repulsive." - icon = "carrot" - value = 0 - gain_text = "You feel repulsion at the idea of eating meat." - lose_text = "You feel like eating meat isn't that bad." - medical_record_text = "Patient reports a vegetarian diet." - -/datum/quirk/vegetarian/add() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.liked_food &= ~MEAT - species.disliked_food |= MEAT - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - -/datum/quirk/vegetarian/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - new_species.liked_food &= ~MEAT - new_species.disliked_food |= MEAT - -/datum/quirk/vegetarian/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - - var/datum/species/species = human_holder.dna.species - if(initial(species.liked_food) & MEAT) - species.liked_food |= MEAT - if(!(initial(species.disliked_food) & MEAT)) - species.disliked_food &= ~MEAT - UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) - -/datum/quirk/snob - name = "Snob" - desc = "You care about the finer things, if a room doesn't look nice its just not really worth it, is it?" - icon = "user-tie" - value = 0 - gain_text = "You feel like you understand what things should look like." - lose_text = "Well who cares about deco anyways?" - medical_record_text = "Patient seems to be rather stuck up." - mob_trait = TRAIT_SNOB - -/datum/quirk/pineapple_liker - name = "Ananas Affinity" - desc = "You find yourself greatly enjoying fruits of the ananas genus. You can't seem to ever get enough of their sweet goodness!" - icon = "thumbs-up" - value = 0 - gain_text = "You feel an intense craving for pineapple." - lose_text = "Your feelings towards pineapples seem to return to a lukewarm state." - medical_record_text = "Patient demonstrates a pathological love of pineapple." - -/datum/quirk/pineapple_liker/add() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.liked_food |= PINEAPPLE - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - -/datum/quirk/pineapple_liker/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - new_species.liked_food |= PINEAPPLE - -/datum/quirk/pineapple_liker/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.liked_food &= ~PINEAPPLE - UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) - -/datum/quirk/pineapple_hater - 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!?" - icon = "thumbs-down" - value = 0 - 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." - medical_record_text = "Patient is correct to think that pineapple is disgusting." - -/datum/quirk/pineapple_hater/add() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.disliked_food |= PINEAPPLE - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - -/datum/quirk/pineapple_hater/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - new_species.disliked_food |= PINEAPPLE - -/datum/quirk/pineapple_hater/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.disliked_food &= ~PINEAPPLE - UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) - /datum/quirk/deviant_tastes name = "Deviant Tastes" desc = "You dislike food that most people enjoy, and find delicious what they don't." icon = "grin-tongue-squint" - value = 0 - gain_text = "You start craving something that tastes strange." - lose_text = "You feel like eating normal food again." + quirk_genre = QUIRK_GENRE_NEUTRAL + gain_text = "You start craving something that tastes strange." + lose_text = "You feel like eating normal food again." medical_record_text = "Patient demonstrates irregular nutrition preferences." -/datum/quirk/deviant_tastes/add() +/datum/quirk/deviant_tastes/add(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder var/datum/species/species = human_holder.dna.species var/liked = species.liked_food @@ -174,14 +29,16 @@ UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) /datum/quirk/heterochromatic - name = "Heterochromia" - desc = "One of your eyes is a different color than the other!" + name = "Heterochromia Iridum" + desc = "One of your eyes is a different color than the other." icon = "eye-low-vision" // Ignore the icon name, its actually a fairly good representation of different color eyes - value = 0 + medical_record_text = "Patient posesses dichromatic irises." + quirk_genre = QUIRK_GENRE_NEUTRAL + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE var/color -/datum/quirk/heterochromatic/add() - color = color || quirk_holder.client?.prefs?.read_preference(/datum/preference/color/heterochromatic) +/datum/quirk/heterochromatic/add_unique(client/client_source) + color = client_source?.prefs?.read_preference(/datum/preference/color/heterochromatic) if(!color) return @@ -227,149 +84,17 @@ human_holder.eye_color_right = initial(human_holder.eye_color_right) UnregisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN) -/datum/quirk/monochromatic - name = "Monochromacy" - desc = "You suffer from full colorblindness, and perceive nearly the entire world in blacks and whites." - icon = "adjust" - value = 0 - medical_record_text = "Patient is afflicted with almost complete color blindness." - -/datum/quirk/monochromatic/add() - quirk_holder.add_client_colour(/datum/client_colour/monochrome) - -/datum/quirk/monochromatic/post_add() - if(is_detective_job(quirk_holder.mind.assigned_role)) - to_chat(quirk_holder, span_boldannounce("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() - quirk_holder.remove_client_colour(/datum/client_colour/monochrome) - -/datum/quirk/phobia - name = "Phobia" - desc = "You are irrationally afraid of something." - icon = "spider" - value = 0 - medical_record_text = "Patient has an irrational fear of something." - var/phobia - -/datum/quirk/phobia/add() - phobia = phobia || quirk_holder.client?.prefs?.read_preference(/datum/preference/choiced/phobia) - - if(phobia) - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.gain_trauma(new /datum/brain_trauma/mild/phobia(phobia), TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/phobia/post_add() - if(!phobia) - var/mob/living/carbon/human/human_holder = quirk_holder - phobia = human_holder.client.prefs.read_preference(/datum/preference/choiced/phobia) - human_holder.gain_trauma(new /datum/brain_trauma/mild/phobia(phobia), TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/phobia/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.cure_trauma_type(/datum/brain_trauma/mild/phobia, TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/quirk/shifty_eyes - name = "Shifty Eyes" - desc = "Your eyes tend to wander all over the place, whether you mean to or not, causing people to sometimes think you're looking directly at them when you aren't." - icon = "far fa-eye" - value = 0 - medical_record_text = "Fucking creep kept staring at me the whole damn checkup. I'm only diagnosing this because it's less awkward than thinking it was on purpose." - mob_trait = TRAIT_SHIFTY_EYES - -/datum/quirk/item_quirk/bald - name = "Smooth-Headed" - desc = "You have no hair and are quite insecure about it! Keep your wig on, or at least your head covered up." - icon = "egg" - value = 0 - mob_trait = TRAIT_BALD - gain_text = "Your head is as smooth as can be, it's terrible." - lose_text = "Your head itches, could it be... growing hair?!" - medical_record_text = "Patient starkly refused to take off headwear during examination." - /// The user's starting hairstyle - var/old_hair - -/datum/quirk/item_quirk/bald/add() - var/mob/living/carbon/human/human_holder = quirk_holder - old_hair = human_holder.hairstyle - human_holder.hairstyle = "Bald" - human_holder.update_body_parts() - RegisterSignal(human_holder, COMSIG_CARBON_EQUIP_HAT, PROC_REF(equip_hat)) - RegisterSignal(human_holder, COMSIG_CARBON_UNEQUIP_HAT, PROC_REF(unequip_hat)) - -/datum/quirk/item_quirk/bald/add_unique() - var/obj/item/clothing/head/wig/natural/baldie_wig = new(get_turf(quirk_holder)) - - if (old_hair == "Bald") - baldie_wig.hairstyle = pick(GLOB.hairstyles_list - "Bald") - else - baldie_wig.hairstyle = old_hair - - baldie_wig.update_appearance() - - give_item_to_holder(baldie_wig, list(LOCATION_HEAD = ITEM_SLOT_HEAD, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/bald/remove() - . = ..() - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.hairstyle = old_hair - human_holder.update_body_parts() - UnregisterSignal(human_holder, list(COMSIG_CARBON_EQUIP_HAT, COMSIG_CARBON_UNEQUIP_HAT)) - SEND_SIGNAL(human_holder, COMSIG_CLEAR_MOOD_EVENT, "bad_hair_day") - -///Checks if the headgear equipped is a wig and sets the mood event accordingly -/datum/quirk/item_quirk/bald/proc/equip_hat(mob/user, obj/item/hat) - SIGNAL_HANDLER - - if(istype(hat, /obj/item/clothing/head/wig)) - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "bad_hair_day", /datum/mood_event/confident_mane) //Our head is covered, but also by a wig so we're happy. - else - SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "bad_hair_day") //Our head is covered - -///Applies a bad moodlet for having an uncovered head -/datum/quirk/item_quirk/bald/proc/unequip_hat(mob/user, obj/item/clothing, force, newloc, no_move, invdrop, silent) - SIGNAL_HANDLER - - SEND_SIGNAL(quirk_holder, COMSIG_ADD_MOOD_EVENT, "bad_hair_day", /datum/mood_event/bald) - -/datum/quirk/item_quirk/tongue_tied - name = "Tongue Tied" - desc = "Due to a past incident, your ability to communicate has been relegated to your hands." - icon = "sign-language" - value = 0 - medical_record_text = "During physical examination, patient's tongue was found to be uniquely damaged." - -/datum/quirk/item_quirk/tongue_tied/add_unique() - var/mob/living/carbon/human/human_holder = quirk_holder - var/obj/item/organ/tongue/old_tongue = human_holder.getorganslot(ORGAN_SLOT_TONGUE) - old_tongue.Remove(human_holder) - qdel(old_tongue) - - var/obj/item/organ/tongue/tied/new_tongue = new(get_turf(human_holder)) - new_tongue.Insert(human_holder) - // Only tongues of people with this quirk can't be removed. Manually spawned or found tongues can be. - new_tongue.organ_flags |= ORGAN_UNREMOVABLE - - var/obj/item/clothing/gloves/gloves_type = /obj/item/clothing/gloves/radio - if(isplasmaman(human_holder)) - gloves_type = /obj/item/clothing/gloves/color/plasmaman/radio - give_item_to_holder(gloves_type, list(LOCATION_GLOVES = ITEM_SLOT_GLOVES, LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -/datum/quirk/item_quirk/tongue_tied/post_add() - to_chat(quirk_holder, span_boldannounce("Because you speak with your hands, having them full hinders your ability to communicate!")) - /datum/quirk/item_quirk/photographer name = "Photographer" - desc = "You carry your camera and personal photo album everywhere you go, and your scrapbooks are legendary among your coworkers." + desc = "You carry your camera and personal photo album everywhere you go." icon = "camera" - value = 0 + quirk_genre = QUIRK_GENRE_NEUTRAL mob_trait = TRAIT_PHOTOGRAPHER - gain_text = "You know everything about photography." - lose_text = "You forget how photo cameras work." + gain_text = "You know everything about photography." + lose_text = "You forget how photo cameras work." medical_record_text = "Patient mentions photography as a stress-relieving hobby." -/datum/quirk/item_quirk/photographer/add_unique() +/datum/quirk/item_quirk/photographer/add_unique(client/client_source) var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/storage/photo_album/personal/photo_album = new(get_turf(human_holder)) photo_album.persistence_id = "personal_[human_holder.last_mind?.key]" // this is a persistent album, the ID is tied to the account's key to avoid tampering @@ -392,104 +117,8 @@ name = "Colorist" desc = "You like carrying around a hair dye spray to quickly apply color patterns to your hair." icon = "fill-drip" - value = 0 + quirk_genre = QUIRK_GENRE_NEUTRAL medical_record_text = "Patient enjoys dyeing their hair with pretty colors." -/datum/quirk/item_quirk/colorist/add_unique() +/datum/quirk/item_quirk/colorist/add_unique(client/client_source) give_item_to_holder(/obj/item/dyespray, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS)) - -#define GAMING_WITHDRAWAL_TIME (15 MINUTES) -/datum/quirk/gamer - name = "Gamer" - desc = "You are a hardcore gamer, and you have a need to game. You love winning and hate losing. You only like gamer food." - icon = "gamepad" - value = 0 - gain_text = span_notice("You feel the sudden urge to game.") - lose_text = span_notice("You've lost all interest in gaming.") - medical_record_text = "Patient has a severe video game addiction." - mob_trait = TRAIT_GAMER - /// Timer for gaming withdrawal to kick in - var/gaming_withdrawal_timer = TIMER_ID_NULL - -/datum/quirk/gamer/add() - // Gamer diet - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.liked_food = JUNKFOOD - RegisterSignal(human_holder, COMSIG_SPECIES_GAIN, PROC_REF(on_species_gain)) - RegisterSignal(human_holder, COMSIG_MOB_WON_VIDEOGAME, PROC_REF(won_game)) - RegisterSignal(human_holder, COMSIG_MOB_LOST_VIDEOGAME, PROC_REF(lost_game)) - RegisterSignal(human_holder, COMSIG_MOB_PLAYED_VIDEOGAME, PROC_REF(gamed)) - -/datum/quirk/gamer/proc/on_species_gain(datum/source, datum/species/new_species, datum/species/old_species) - SIGNAL_HANDLER - new_species.liked_food = JUNKFOOD - -/datum/quirk/gamer/remove() - var/mob/living/carbon/human/human_holder = quirk_holder - var/datum/species/species = human_holder.dna.species - species.liked_food = initial(species.liked_food) - UnregisterSignal(human_holder, COMSIG_SPECIES_GAIN) - UnregisterSignal(human_holder, COMSIG_MOB_WON_VIDEOGAME) - UnregisterSignal(human_holder, COMSIG_MOB_LOST_VIDEOGAME) - UnregisterSignal(human_holder, COMSIG_MOB_PLAYED_VIDEOGAME) - -/datum/quirk/gamer/add_unique() - // The gamer starts off quelled - gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE) - -/** - * Gamer won a game - * - * Executed on the COMSIG_MOB_WON_VIDEOGAME signal - * This signal should be called whenever a player has won a video game. - * (E.g. Orion Trail) - */ -/datum/quirk/gamer/proc/won_game() - SIGNAL_HANDLER - // Epic gamer victory - var/mob/living/carbon/human/human_holder = quirk_holder - SEND_SIGNAL(human_holder, COMSIG_ADD_MOOD_EVENT, "gamer_won", /datum/mood_event/gamer_won) - -/** - * Gamer lost a game - * - * Executed on the COMSIG_MOB_LOST_VIDEOGAME signal - * This signal should be called whenever a player has lost a video game. - * (E.g. Orion Trail) - */ -/datum/quirk/gamer/proc/lost_game() - SIGNAL_HANDLER - // Executed when a gamer has lost - var/mob/living/carbon/human/human_holder = quirk_holder - SEND_SIGNAL(human_holder, COMSIG_ADD_MOOD_EVENT, "gamer_lost", /datum/mood_event/gamer_lost) - // Executed asynchronously due to say() - INVOKE_ASYNC(src, PROC_REF(gamer_moment)) -/** - * Gamer is playing a game - * - * Executed on the COMSIG_MOB_PLAYED_VIDEOGAME signal - * This signal should be called whenever a player interacts with a video game. - */ -/datum/quirk/gamer/proc/gamed() - SIGNAL_HANDLER - - var/mob/living/carbon/human/human_holder = quirk_holder - // Remove withdrawal malus - SEND_SIGNAL(human_holder, COMSIG_CLEAR_MOOD_EVENT, "gamer_withdrawal") - // Reset withdrawal timer - if (gaming_withdrawal_timer) - deltimer(gaming_withdrawal_timer) - gaming_withdrawal_timer = addtimer(CALLBACK(src, PROC_REF(enter_withdrawal)), GAMING_WITHDRAWAL_TIME, TIMER_STOPPABLE) - - -/datum/quirk/gamer/proc/gamer_moment() - // It was a heated gamer moment... - var/mob/living/carbon/human/human_holder = quirk_holder - human_holder.say(";[pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER")]!!", forced = name) - -/datum/quirk/gamer/proc/enter_withdrawal() - var/mob/living/carbon/human/human_holder = quirk_holder - SEND_SIGNAL(human_holder, COMSIG_ADD_MOOD_EVENT, "gamer_withdrawal", /datum/mood_event/gamer_withdrawal) - -#undef GAMING_WITHDRAWAL_TIME diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm deleted file mode 100644 index ebe5b786d53a..000000000000 --- a/code/datums/ruins/icemoon.dm +++ /dev/null @@ -1,159 +0,0 @@ -// Hey! Listen! Update \config\iceruinblacklist.txt with your new ruins! - -/datum/map_template/ruin/icemoon - prefix = "_maps/RandomRuins/IceRuins/" - allow_duplicates = FALSE - cost = 5 - ruin_type = ZTRAIT_ICE_RUINS - default_area = /area/icemoon/surface/outdoors/unexplored - -// above ground only - -/datum/map_template/ruin/icemoon/lust - name = "Ruin of Lust" - id = "lust" - description = "Not exactly what you expected." - suffix = "icemoon_surface_lust.dmm" - -/datum/map_template/ruin/icemoon/asteroid - name = "Asteroid Site" - id = "asteroidsite" - description = "Surprised to see us here?" - suffix = "icemoon_surface_asteroid.dmm" - -/datum/map_template/ruin/icemoon/engioutpost - name = "Engineer Outpost" - id = "engioutpost" - description = "Blown up by an unfortunate accident." - suffix = "icemoon_surface_engioutpost.dmm" - -/datum/map_template/ruin/icemoon/fountain - name = "Fountain Hall" - id = "fountain" - description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." - prefix = "_maps/RandomRuins/AnywhereRuins/" - suffix = "fountain_hall.dmm" - -/datum/map_template/ruin/icemoon/abandoned_homestead - name = "Abandoned Homestead" - id = "abandoned_homestead" - description = "This homestead was once host to a happy homesteading family. It's now host to hungry bears." - suffix = "icemoon_underground_abandoned_homestead.dmm" - -/datum/map_template/ruin/icemoon/entemology - name = "Insect Research Station" - id = "bug_habitat" - description = "An independently funded research outpost, long abandoned. Their mission, to boldly go where no insect life would ever live, ever, and look for bugs." - suffix = "icemoon_surface_bughabitat.dmm" - -/datum/map_template/ruin/icemoon/pizza - name = "Moffuchi's Pizzeria" - id = "pizzeria" - description = "Moffuchi's Family Pizzeria chain has a reputation for providing affordable artisanal meals of questionable edibility. This particular pizzeria seems to have been abandoned for some time." - suffix = "icemoon_surface_pizza.dmm" - -// above and below ground together - -/datum/map_template/ruin/icemoon/mining_site - name = "Mining Site" - id = "miningsite" - description = "Ruins of a site where people once mined with primitive tools for ore." - suffix = "icemoon_surface_mining_site.dmm" - always_place = TRUE - always_spawn_with = list(/datum/map_template/ruin/icemoon/underground/mining_site_below = PLACE_BELOW) - -/datum/map_template/ruin/icemoon/underground/mining_site_below - name = "Mining Site Underground" - id = "miningsite-underground" - description = "Who knew ladders could be so useful?" - suffix = "icemoon_underground_mining_site.dmm" - unpickable = TRUE - -// below ground only - -/datum/map_template/ruin/icemoon/underground - name = "underground ruin" - ruin_type = ZTRAIT_ICE_RUINS_UNDERGROUND - default_area = /area/icemoon/underground/unexplored - -/datum/map_template/ruin/icemoon/underground/abandonedvillage - name = "Abandoned Village" - id = "abandonedvillage" - description = "Who knows what lies within?" - suffix = "icemoon_underground_abandoned_village.dmm" - -/datum/map_template/ruin/icemoon/underground/library - name = "Buried Library" - id = "buriedlibrary" - description = "A once grand library, now lost to the confines of the Ice Moon." - suffix = "icemoon_underground_library.dmm" - -/datum/map_template/ruin/icemoon/underground/wrath - name = "Ruin of Wrath" - id = "wrath" - description = "You'll fight and fight and just keep fighting." - suffix = "icemoon_underground_wrath.dmm" - -/datum/map_template/ruin/icemoon/underground/hermit - name = "Frozen Shack" - id = "hermitshack" - description = "A place of shelter for a lone hermit, scraping by to live another day." - suffix = "icemoon_underground_hermit.dmm" - -/datum/map_template/ruin/icemoon/underground/lavaland - name = "Lavaland Site" - id = "lavalandsite" - description = "I guess we never really left you huh?" - suffix = "icemoon_underground_lavaland.dmm" - -/datum/map_template/ruin/icemoon/underground/puzzle - name = "Ancient Puzzle" - id = "puzzle" - description = "Mystery to be solved." - suffix = "icemoon_underground_puzzle.dmm" - -/datum/map_template/ruin/icemoon/underground/bathhouse - name = "Bath House" - id = "bathhouse" - description = "A warm, safe place." - suffix = "icemoon_underground_bathhouse.dmm" - -/datum/map_template/ruin/icemoon/underground/wendigo_cave - name = "Wendigo Cave" - id = "wendigocave" - description = "Into the jaws of the beast." - suffix = "icemoon_underground_wendigo_cave.dmm" - -/datum/map_template/ruin/icemoon/underground/free_golem - name = "Free Golem Ship" - id = "golem-ship" - description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ - Seem very intent on research and individual liberty, and also geology-based naming?" - prefix = "_maps/RandomRuins/AnywhereRuins/" - suffix = "golem_ship.dmm" - -/datum/map_template/ruin/icemoon/underground/mailroom - name = "Frozen-over Post Office" - id = "mailroom" - description = "This is where all of your paychecks went. Signed, the management." - suffix = "icemoon_underground_mailroom.dmm" - -/datum/map_template/ruin/icemoon/underground/frozen_comms - name = "Frozen Communicatons Outpost" - id = "frozen_comms" - description = "3 Peaks Radio, where the 2000's live forever." - suffix = "icemoon_underground_frozen_comms.dmm" - -//TODO: Bottom-Level ONLY Spawns after Refactoring Related Code -/datum/map_template/ruin/icemoon/underground/plasma_facility - name = "Abandoned Plasma Facility" - id = "plasma_facility" - description = "Rumors have developed over the many years of Freyja plasma mining. These rumors suggest that the ghosts of dead mistreated excavation staff have returned to \ - exact revenge on their (now former) employers. Coorperate reminds all staff that rumors are just that: Old Housewife tales meant to scare misbehaving kids to bed." - suffix = "icemoon_underground_abandoned_plasma_facility.dmm" - -/datum/map_template/ruin/icemoon/underground/hotsprings - name = "Hot Springs" - id = "hotsprings" - description = "Just relax and take a dip, nothing will go wrong, I swear!" - suffix = "icemoon_underground_hotsprings.dmm" diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm deleted file mode 100644 index da7fa44be82f..000000000000 --- a/code/datums/ruins/lavaland.dm +++ /dev/null @@ -1,252 +0,0 @@ -// Hey! Listen! Update \config\lavaruinblacklist.txt with your new ruins! - -/datum/map_template/ruin/lavaland - ruin_type = ZTRAIT_LAVA_RUINS - prefix = "_maps/RandomRuins/LavaRuins/" - default_area = /area/lavaland/surface/outdoors/unexplored - -/datum/map_template/ruin/lavaland/biodome - cost = 5 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/biodome/beach - name = "Biodome Beach" - id = "biodome-beach" - description = "Seemingly plucked from a tropical destination, this beach is calm and cool, with the salty waves roaring softly in the background. \ - Comes with a rustic wooden bar and suicidal bartender." - suffix = "lavaland_biodome_beach.dmm" - -/datum/map_template/ruin/lavaland/biodome/winter - name = "Biodome Winter" - id = "biodome-winter" - description = "For those getaways where you want to get back to nature, but you don't want to leave the fortified military compound where you spend your days. \ - Includes a unique(*) laser pistol display case, and the recently introduced I.C.E(tm)." - suffix = "lavaland_surface_biodome_winter.dmm" - -/datum/map_template/ruin/lavaland/biodome/clown - name = "Biodome Clown Planet" - id = "biodome-clown" - description = "WELCOME TO CLOWN PLANET! HONK HONK HONK etc.!" - suffix = "lavaland_biodome_clown_planet.dmm" - -/datum/map_template/ruin/lavaland/cube - name = "The Wishgranter Cube" - id = "wishgranter-cube" - description = "Nothing good can come from this. Learn from their mistakes and turn around." - suffix = "lavaland_surface_cube.dmm" - cost = 10 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/seed_vault - name = "Seed Vault" - id = "seed-vault" - description = "The creators of these vaults were a highly advanced and benevolent race, and launched many into the stars, hoping to aid fledgling civilizations. \ - However, all the inhabitants seem to do is grow drugs and guns." - suffix = "lavaland_surface_seed_vault.dmm" - cost = 10 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/ash_walker - name = "Ash Walker Nest" - id = "ash-walker" - description = "A race of unbreathing unathi live here, that run faster than a human can, worship a broken dead city, and are capable of reproducing by something involving tentacles? \ - Probably best to stay clear." - suffix = "lavaland_surface_ash_walker1.dmm" - cost = 20 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/syndicate_base - name = "Syndicate Lava Base" - id = "lava-base" - description = "A secret base researching illegal bioweapons, it is closely guarded by an elite team of syndicate agents." - suffix = "lavaland_surface_syndicate_base1.dmm" - cost = 20 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/free_golem - name = "Free Golem Ship" - id = "golem-ship" - description = "Lumbering humanoids, made out of precious metals, move inside this ship. They frequently leave to mine more minerals, which they somehow turn into more of them. \ - Seem very intent on research and individual liberty, and also geology-based naming?" - cost = 20 - prefix = "_maps/RandomRuins/AnywhereRuins/" - suffix = "golem_ship.dmm" - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/gaia - name = "Patch of Eden" - id = "gaia" - description = "Who would have thought that such a peaceful place could be on such a horrific planet?" - cost = 5 - suffix = "lavaland_surface_gaia.dmm" - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/sin - cost = 10 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/sin/envy - name = "Ruin of Envy" - id = "envy" - description = "When you get what they have, then you'll finally be happy." - suffix = "lavaland_surface_envy.dmm" - -/datum/map_template/ruin/lavaland/sin/gluttony - name = "Ruin of Gluttony" - id = "gluttony" - description = "If you eat enough, then eating will be all that you do." - suffix = "lavaland_surface_gluttony.dmm" - -/datum/map_template/ruin/lavaland/sin/greed - name = "Ruin of Greed" - id = "greed" - description = "Sure you don't need magical powers, but you WANT them, and \ - that's what's important." - suffix = "lavaland_surface_greed.dmm" - -/datum/map_template/ruin/lavaland/sin/pride - name = "Ruin of Pride" - id = "pride" - description = "Wormhole lifebelts are for LOSERS, whom you are better than." - suffix = "lavaland_surface_pride.dmm" - -/datum/map_template/ruin/lavaland/sin/sloth - name = "Ruin of Sloth" - id = "sloth" - description = "..." - suffix = "lavaland_surface_sloth.dmm" - // Generates nothing but atmos runtimes and salt - cost = 0 - -/datum/map_template/ruin/lavaland/ratvar - name = "Dead God" - id = "ratvar" - description = "Ratvar's final resting place." - suffix = "lavaland_surface_dead_ratvar.dmm" - cost = 0 - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/hierophant - name = "Hierophant's Arena" - id = "hierophant" - description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares." - suffix = "lavaland_surface_hierophant.dmm" - always_place = TRUE - allow_duplicates = FALSE - -/datum/map_template/ruin/lavaland/blood_drunk_miner - name = "Blood-Drunk Miner" - id = "blooddrunk" - description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." - suffix = "lavaland_surface_blooddrunk1.dmm" - cost = 0 - allow_duplicates = FALSE //will only spawn one variant of the ruin - -/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance - name = "Blood-Drunk Miner (Guidance)" - suffix = "lavaland_surface_blooddrunk2.dmm" - -/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter - name = "Blood-Drunk Miner (Hunter)" - suffix = "lavaland_surface_blooddrunk3.dmm" - -/datum/map_template/ruin/lavaland/ufo_crash - name = "UFO Crash" - id = "ufo-crash" - description = "Turns out that keeping your abductees unconscious is really important. Who knew?" - suffix = "lavaland_surface_ufo_crash.dmm" - cost = 5 - -/datum/map_template/ruin/lavaland/xeno_nest - name = "Xenomorph Nest" - id = "xeno-nest" - description = "These xenomorphs got bored of horrifically slaughtering people on space stations, and have settled down on a nice lava-filled hellscape to focus on what's really important in life. \ - Quality memes." - suffix = "lavaland_surface_xeno_nest.dmm" - cost = 20 - -/datum/map_template/ruin/lavaland/fountain - name = "Fountain Hall" - id = "fountain" - description = "The fountain has a warning on the side. DANGER: May have undeclared side effects that only become obvious when implemented." - prefix = "_maps/RandomRuins/AnywhereRuins/" - suffix = "fountain_hall.dmm" - cost = 5 - -/datum/map_template/ruin/lavaland/survivalcapsule - name = "Survival Capsule Ruins" - id = "survivalcapsule" - description = "What was once sanctuary to the common miner, is now their tomb." - suffix = "lavaland_surface_survivalpod.dmm" - cost = 5 - -/datum/map_template/ruin/lavaland/pizza - name = "Ruined Pizza Party" - id = "pizza" - description = "Little Timmy's birthday pizza bash took a turn for the worse when a bluespace anomaly passed by." - suffix = "lavaland_surface_pizzaparty.dmm" - allow_duplicates = FALSE - cost = 5 - -/datum/map_template/ruin/lavaland/cultaltar - name = "Summoning Ritual" - id = "cultaltar" - description = "A place of vile worship, the scrawling of blood in the middle glowing eerily. A demonic laugh echoes throughout the caverns." - suffix = "lavaland_surface_cultaltar.dmm" - allow_duplicates = FALSE - cost = 10 - -/datum/map_template/ruin/lavaland/hermit - name = "Makeshift Shelter" - id = "hermitcave" - description = "A place of shelter for a lone hermit, scraping by to live another day." - suffix = "lavaland_surface_hermit.dmm" - allow_duplicates = FALSE - cost = 10 - -/datum/map_template/ruin/lavaland/miningripley - name = "Ripley" - id = "ripley" - description = "A heavily-damaged mining ripley, property of a very unfortunate miner. You might have to do a bit of work to fix this thing up." - suffix = "lavaland_surface_random_ripley.dmm" - allow_duplicates = FALSE - cost = 5 - -/datum/map_template/ruin/lavaland/dark_wizards - name = "Dark Wizard Altar" - id = "dark_wizards" - description = "A ruin with dark wizards. What secret do they guard?" - suffix = "lavaland_surface_wizard.dmm" - cost = 5 - -/datum/map_template/ruin/lavaland/strong_stone - name = "Strong Stone" - id = "strong_stone" - description = "A stone that seems particularly powerful." - suffix = "lavaland_strong_rock.dmm" - allow_duplicates = FALSE - cost = 2 - -/datum/map_template/ruin/lavaland/puzzle - name = "Ancient Puzzle" - id = "puzzle" - description = "Mystery to be solved." - suffix = "lavaland_surface_puzzle.dmm" - cost = 5 - -/datum/map_template/ruin/lavaland/elite_tumor - name = "Pulsating Tumor" - id = "tumor" - description = "A strange tumor which houses a powerful beast..." - suffix = "lavaland_surface_elite_tumor.dmm" - cost = 5 - always_place = TRUE - allow_duplicates = TRUE - -/datum/map_template/ruin/lavaland/elephant_graveyard - name = "Elephant Graveyard" - id = "Graveyard" - description = "An abandoned graveyard, calling to those unable to continue." - suffix = "lavaland_surface_elephant_graveyard.dmm" - allow_duplicates = FALSE - cost = 10 diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm index 6bc15ca8f434..92b8ff3190e3 100644 --- a/code/datums/ruins/space.dm +++ b/code/datums/ruins/space.dm @@ -144,13 +144,6 @@ 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." -/datum/map_template/ruin/space/originalcontent - id = "paperwizard" - suffix = "originalcontent.dmm" - 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." - /datum/map_template/ruin/space/mech_transport id = "mech-transport" suffix = "mechtransport.dmm" @@ -314,12 +307,6 @@ name = "Syndicate Forgotten Ship" description = "Seemingly abandoned ship went of course right into NT controlled space. It seems that malfunction caused most systems to turn off, except for sleepers." -/datum/map_template/ruin/space/hellfactory - id = "hellfactory" - suffix = "hellfactory.dmm" - name = "Heck Brewery" - description = "An abandoned warehouse and brewing facility, which has been recently rediscovered. Reports claim that the security system entered an ultra-hard lockdown, but these reports are inconclusive." - /datum/map_template/ruin/space/space_billboard id = "space_billboard" suffix = "space_billboard.dmm" diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 3e17f1b6981a..e2211b3ee4d9 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -129,10 +129,6 @@ port_id = "infiltrator" who_can_purchase = null -/datum/map_template/shuttle/aux_base - port_id = "aux_base" - who_can_purchase = null - /datum/map_template/shuttle/escape_pod port_id = "escape_pod" who_can_purchase = null @@ -250,29 +246,6 @@ emag_only = TRUE credit_cost = EMAG_LOCKED_SHUTTLE_COST -/datum/map_template/shuttle/emergency/arena - suffix = "arena" - name = "The Arena" - 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 = CARGO_CRATE_VALUE * 20 - /// Whether the arena z-level has been created - var/arena_loaded = FALSE - -/datum/map_template/shuttle/emergency/arena/prerequisites_met() - return SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_BUBBLEGUM] - -/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" @@ -300,7 +273,7 @@ We've got fun activities for everyone, an all access cockpit, and no boring security brig! Boo! Play dress up with your friends! \ Collect all the bedsheets before your neighbour does! Check if the AI is watching you with our patent pending \"Peeping Tom AI Multitool Detector\" or PEEEEEETUR for short. \ Have a fun ride!" - admin_notes = "Brig is replaced by anchored greentext book surrounded by lavaland chasms, stationside door has been removed to prevent accidental dropping. No brig." + admin_notes = "Brig is replaced by anchored greentext book surrounded by chasms, stationside door has been removed to prevent accidental dropping. No brig." credit_cost = CARGO_CRATE_VALUE * 16 /datum/map_template/shuttle/emergency/cramped @@ -448,7 +421,7 @@ /datum/map_template/shuttle/ferry/base suffix = "base" name = "transport ferry" - description = "Standard issue Box/Metastation CentCom ferry." + description = "Standard issue Box/Theseus CentCom ferry." /datum/map_template/shuttle/ferry/meat suffix = "meat" @@ -616,14 +589,6 @@ suffix = "kilo" name = "labour shuttle (Kilo)" -/datum/map_template/shuttle/mining_common/meta - suffix = "meta" - name = "lavaland shuttle (Meta)" - -/datum/map_template/shuttle/mining_common/kilo - suffix = "kilo" - name = "lavaland shuttle (Kilo)" - /datum/map_template/shuttle/arrival/delta suffix = "delta" name = "arrival shuttle (Delta)" @@ -640,14 +605,6 @@ suffix = "omega" name = "arrival shuttle (Omega)" -/datum/map_template/shuttle/aux_base/default - suffix = "default" - name = "auxilliary base (Default)" - -/datum/map_template/shuttle/aux_base/small - suffix = "small" - name = "auxilliary base (Small)" - /datum/map_template/shuttle/escape_pod/default suffix = "default" name = "escape pod (Default)" diff --git a/code/datums/skills/mining.dm b/code/datums/skills/mining.dm deleted file mode 100644 index e1b698a3d871..000000000000 --- a/code/datums/skills/mining.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/skill/mining - name = "Mining" - title = "Miner" - desc = "A dwarf's biggest skill, after drinking." - modifiers = list(SKILL_SPEED_MODIFIER = list(1, 0.95, 0.9, 0.85, 0.75, 0.6, 0.5),SKILL_PROBS_MODIFIER=list(10, 15, 20, 25, 30, 35, 40)) - skill_cape_path = /obj/item/clothing/neck/cloak/skill_reward/mining diff --git a/code/datums/stamina_holder.dm b/code/datums/stamina_holder.dm index 5854437cd563..d6d064d88b5f 100644 --- a/code/datums/stamina_holder.dm +++ b/code/datums/stamina_holder.dm @@ -28,7 +28,7 @@ return ..() /datum/stamina_container/process(delta_time) - if(delta_time && is_regenerating) + if(delta_time && is_regenerating && !HAS_TRAIT(parent, TRAIT_HALOPERIDOL)) current = min(current + (regen_rate*delta_time), maximum) if(delta_time && decrement) current = max(current + (decrement*delta_time), 0) @@ -60,6 +60,8 @@ /datum/stamina_container/proc/adjust(amt as num, forced) if(!amt) return + if(amt < 0 && HAS_TRAIT_FROM(parent, TRAIT_INCAPACITATED, STAMINA)) + return ///Our parent might want to fuck with these numbers var/modify = parent.pre_stamina_change(amt, forced) current = round(clamp(current + modify, 0, maximum), DAMAGE_PRECISION) diff --git a/code/datums/station_traits/negative_traits.dm b/code/datums/station_traits/negative_traits.dm index afa101e5c04e..078aaec6170f 100644 --- a/code/datums/station_traits/negative_traits.dm +++ b/code/datums/station_traits/negative_traits.dm @@ -17,52 +17,6 @@ /datum/station_trait/distant_supply_lines/on_round_start() SSeconomy.pack_price_modifier *= 1.2 -/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/hangover) - -/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/random_spawns) - -/datum/station_trait/hangover/New() - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_LATEJOIN_SPAWN, PROC_REF(on_job_after_spawn)) - -/datum/station_trait/hangover/revert() - for (var/obj/effect/landmark/start/hangover/hangover_spot in GLOB.start_landmarks_list) - QDEL_LIST(hangover_spot.debris) - - return ..() - -/datum/station_trait/hangover/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/spawned_mob) - SIGNAL_HANDLER - - if(!prob(35)) - return - var/obj/item/hat = pick( - /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_or_del(hat, ITEM_SLOT_HEAD) - - /datum/station_trait/blackout name = "Blackout" trait_type = STATION_TRAIT_NEGATIVE @@ -72,7 +26,7 @@ /datum/station_trait/blackout/on_round_start() . = ..() - for(var/obj/machinery/power/apc/apc as anything in GLOB.apcs_list) + for(var/obj/machinery/power/apc/apc as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(is_station_level(apc.z) && prob(60)) apc.overload_lighting() @@ -157,10 +111,8 @@ if(!weapon_types) weapon_types = list( /obj/item/chair = 20, - /obj/item/tailclub = 10, /obj/item/melee/baseball_bat = 10, - /obj/item/melee/chainofcommand/tailwhip = 10, - /obj/item/melee/chainofcommand/tailwhip/kitty = 10, + /obj/item/melee/chainofcommand/kitty = 10, /obj/item/reagent_containers/food/drinks/bottle = 20, /obj/item/reagent_containers/food/drinks/bottle/kong = 5, /obj/item/switchblade/extended = 10, diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index bb1f928c4cfd..9a008fada6c9 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -156,7 +156,7 @@ var/obj/item/implant/deathrattle/implant_to_give = new() deathrattle_group.register(implant_to_give) - implant_to_give.implant(spawned, spawned, TRUE, TRUE) + implant_to_give.implant(spawned, spawned, BODY_ZONE_CHEST, TRUE, TRUE) /datum/station_trait/deathrattle_department/service @@ -181,10 +181,10 @@ department_name = "Engineering" /datum/station_trait/deathrattle_department/command - name = "Deathrattled Command" + name = "Deathrattled Management" trait_flags = NONE weight = 1 - department_to_apply_to = DEPARTMENT_BITFLAG_COMMAND + department_to_apply_to = DEPARTMENT_BITFLAG_MANAGEMENT department_name = "Command" /datum/station_trait/deathrattle_department/science @@ -229,44 +229,4 @@ var/obj/item/implant/deathrattle/implant_to_give = new() deathrattle_group.register(implant_to_give) - implant_to_give.implant(spawned, spawned, TRUE, TRUE) - - -/datum/station_trait/wallets - name = "Wallets!" - trait_type = STATION_TRAIT_POSITIVE - show_in_report = TRUE - weight = 10 - report_message = "It has become temporarily fashionable to use a wallet, so everyone on the station has been issued one." - -/datum/station_trait/wallets/New() - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_JOB_AFTER_SPAWN, PROC_REF(on_job_after_spawn)) - -/datum/station_trait/wallets/proc/on_job_after_spawn(datum/source, datum/job/job, mob/living/living_mob, mob/M, joined_late) - SIGNAL_HANDLER - - var/obj/item/card/id/advanced/id_card = living_mob.get_item_by_slot(ITEM_SLOT_ID) - if(!istype(id_card)) - return - - living_mob.temporarilyRemoveItemFromInventory(id_card, force=TRUE) - - // "Doc, what's wrong with me?" - var/obj/item/storage/wallet/wallet = new(src) - // "You've got a wallet embedded in your chest." - wallet.add_fingerprint(living_mob, ignoregloves = TRUE) - - living_mob.equip_to_slot_if_possible(wallet, ITEM_SLOT_ID, initial=TRUE) - - id_card.forceMove(wallet) - - var/holochip_amount = id_card.registered_account.account_balance - new /obj/item/holochip(wallet, holochip_amount) - id_card.registered_account.adjust_money(-holochip_amount) - - new /obj/effect/spawner/random/entertainment/wallet_storage(wallet) - - // Put our filthy fingerprints all over the contents - for(var/obj/item/item in wallet) - item.add_fingerprint(living_mob, ignoregloves = TRUE) + implant_to_give.implant(spawned, spawned, BODY_ZONE_CHEST, TRUE, TRUE) diff --git a/code/datums/status_effects/_status_effect.dm b/code/datums/status_effects/_status_effect.dm index 32ea2eb8153d..438d498bb0b0 100644 --- a/code/datums/status_effects/_status_effect.dm +++ b/code/datums/status_effects/_status_effect.dm @@ -7,6 +7,9 @@ /// While processing, this becomes the world.time when the status effect will expire. /// -1 = infinite duration. var/duration = -1 + /// The maximum duration this status effect can be. + /// -1 = No limit + var/max_duration =-1 /// When set initially / in on_creation, this is how long between [proc/tick] calls in deciseconds. /// While processing, this becomes the world.time when the next tick will occur. /// -1 = will stop processing, if duration is also unlimited (-1). @@ -41,7 +44,10 @@ LAZYADD(owner.status_effects, src) if(duration != -1) - duration = world.time + duration + if(max_duration != -1) + duration = world.time + min(duration, max_duration) + else + duration = world.time + duration tick_interval = world.time + tick_interval if(alert_type) @@ -110,6 +116,7 @@ /// or when a status effect with on_remove_on_mob_delete /// set to FALSE has its mob deleted /datum/status_effect/proc/be_replaced() + linked_alert = null owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) owner = null @@ -136,6 +143,18 @@ /datum/status_effect/proc/nextmove_adjust() return 0 +/// Remove [seconds] of duration from the status effect, qdeling / ending if we eclipse the current world time. +/datum/status_effect/proc/remove_duration(seconds) + if(duration == -1) // Infinite duration + return FALSE + + duration -= seconds + if(duration <= world.time) + qdel(src) + return TRUE + + return FALSE + /// Alert base type for status effect alerts /atom/movable/screen/alert/status_effect name = "Curse of Mundanity" diff --git a/code/datums/status_effects/agent_pinpointer.dm b/code/datums/status_effects/agent_pinpointer.dm index d620ce3796c3..3f64ff252a02 100644 --- a/code/datums/status_effects/agent_pinpointer.dm +++ b/code/datums/status_effects/agent_pinpointer.dm @@ -43,7 +43,7 @@ if(here.z != there.z) linked_alert.icon_state = "pinonnull" return - if(get_dist_euclidian(here,there) <= minimum_range + rand(0, range_fuzz_factor)) + if(get_dist_euclidean(here,there) <= minimum_range + rand(0, range_fuzz_factor)) linked_alert.icon_state = "pinondirect" return linked_alert.setDir(get_dir(here, there)) diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 6543d2efac00..cdf1adde3fed 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -199,111 +199,6 @@ alert_type = null processing_speed = STATUS_EFFECT_NORMAL_PROCESS -//Hippocratic Oath: Applied when the Rod of Asclepius is activated. -/datum/status_effect/hippocratic_oath - id = "Hippocratic Oath" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 - tick_interval = 25 - alert_type = null - - var/datum/component/aura_healing/aura_healing - var/hand - var/deathTick = 0 - -/datum/status_effect/hippocratic_oath/on_apply() - var/static/list/organ_healing = list( - ORGAN_SLOT_BRAIN = 1.4, - ) - - aura_healing = owner.AddComponent( \ - /datum/component/aura_healing, \ - range = 7, \ - brute_heal = 1.4, \ - burn_heal = 1.4, \ - toxin_heal = 1.4, \ - suffocation_heal = 1.4, \ - stamina_heal = 1.4, \ - clone_heal = 0.4, \ - simple_heal = 1.4, \ - organ_healing = organ_healing, \ - healing_color = "#375637", \ - ) - - //Makes the user passive, it's in their oath not to harm! - ADD_TRAIT(owner, TRAIT_PACIFISM, HIPPOCRATIC_OATH_TRAIT) - var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - H.add_hud_to(owner) - return ..() - -/datum/status_effect/hippocratic_oath/on_remove() - QDEL_NULL(aura_healing) - REMOVE_TRAIT(owner, TRAIT_PACIFISM, HIPPOCRATIC_OATH_TRAIT) - var/datum/atom_hud/H = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - H.remove_hud_from(owner) - -/datum/status_effect/hippocratic_oath/get_examine_text() - return span_notice("[owner.p_they(TRUE)] seem[owner.p_s()] to have an aura of healing and helpfulness about [owner.p_them()].") - -/datum/status_effect/hippocratic_oath/tick() - if(owner.stat == DEAD) - if(deathTick < 4) - deathTick += 1 - else - consume_owner() - else - if(iscarbon(owner)) - var/mob/living/carbon/itemUser = owner - var/obj/item/heldItem = itemUser.get_item_for_held_index(hand) - if(heldItem == null || heldItem.type != /obj/item/rod_of_asclepius) //Checks to make sure the rod is still in their hand - var/obj/item/rod_of_asclepius/newRod = new(itemUser.loc) - newRod.activated() - if(!itemUser.has_hand_for_held_index(hand)) - //If user does not have the corresponding hand anymore, give them one and return the rod to their hand - if(((hand % 2) == 0)) - var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_R_ARM, FALSE, FALSE) - if(L.attach_limb(itemUser)) - itemUser.put_in_hand(newRod, hand, forced = TRUE) - else - qdel(L) - consume_owner() //we can't regrow, abort abort - return - else - var/obj/item/bodypart/L = itemUser.newBodyPart(BODY_ZONE_L_ARM, FALSE, FALSE) - if(L.attach_limb(itemUser)) - itemUser.put_in_hand(newRod, hand, forced = TRUE) - else - qdel(L) - consume_owner() //see above comment - return - to_chat(itemUser, span_notice("Your arm suddenly grows back with the Rod of Asclepius still attached!")) - else - //Otherwise get rid of whatever else is in their hand and return the rod to said hand - itemUser.put_in_hand(newRod, hand, forced = TRUE) - to_chat(itemUser, span_notice("The Rod of Asclepius suddenly grows back out of your arm!")) - //Because a servant of medicines stops at nothing to help others, lets keep them on their toes and give them an additional boost. - if(itemUser.health < itemUser.maxHealth) - new /obj/effect/temp_visual/heal(get_turf(itemUser), "#375637") - itemUser.adjustBruteLoss(-1.5, FALSE) - itemUser.adjustFireLoss(-1.5, FALSE) - itemUser.adjustToxLoss(-1.5, FALSE, forced = TRUE) //Because Slime People are people too - itemUser.adjustOxyLoss(-1.5, FALSE) - itemUser.stamina.adjust(1.5) - itemUser.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) - itemUser.adjustCloneLoss(-0.5, FALSE) //Becasue apparently clone damage is the bastion of all health - -/datum/status_effect/hippocratic_oath/proc/consume_owner() - owner.visible_message(span_notice("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")) - var/list/chems = list(/datum/reagent/medicine/sal_acid, /datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/oxandrolone) - var/mob/living/simple_animal/hostile/retaliate/snake/healSnake = new(owner.loc, pick(chems)) - healSnake.name = "Asclepius's Snake" - healSnake.real_name = "Asclepius's Snake" - healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties." - new /obj/effect/decal/cleanable/ash(owner.loc) - new /obj/item/rod_of_asclepius(owner.loc) - qdel(owner) - - /datum/status_effect/good_music id = "Good Music" alert_type = null @@ -316,7 +211,6 @@ owner.adjust_timed_status_effect(-4 SECONDS, /datum/status_effect/dizziness) owner.adjust_timed_status_effect(-4 SECONDS, /datum/status_effect/jitter) owner.adjust_timed_status_effect(-1 SECONDS, /datum/status_effect/confusion) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "goodmusic", /datum/mood_event/goodmusic) /atom/movable/screen/alert/status_effect/regenerative_core name = "Regenerative Core Tendrils" @@ -487,7 +381,7 @@ damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, - armour_penetration = 0, + armor_penetration = 0, ) SIGNAL_HANDLER @@ -496,7 +390,7 @@ var/obj/effect/floating_blade/to_remove = blades[1] - playsound(get_turf(source), 'sound/weapons/parry.ogg', 100, TRUE) + playsound(get_turf(source), 'sound/weapons/block/parry_metal.ogg', 100, TRUE) source.visible_message( span_warning("[to_remove] orbiting [source] snaps in front of [attack_text], blocking it before vanishing!"), span_warning("[to_remove] orbiting you snaps in front of [attack_text], blocking it before vanishing!"), @@ -614,7 +508,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_speed_boost, update = TRUE) /datum/movespeed_modifier/status_speed_boost - multiplicative_slowdown = -1 + slowdown = -1 ///this buff provides a max health buff and a heal. /datum/status_effect/limited_buff/health_buff diff --git a/code/datums/status_effects/debuffs/concussion.dm b/code/datums/status_effects/debuffs/concussion.dm new file mode 100644 index 000000000000..b680a0596025 --- /dev/null +++ b/code/datums/status_effects/debuffs/concussion.dm @@ -0,0 +1,56 @@ +/datum/status_effect/concussion + id = "concussion" + duration = -1 + tick_interval = -1 + status_type = STATUS_EFFECT_UNIQUE + alert_type = null + +/datum/status_effect/concussion/on_apply() + . = ..() + if(!.) + return + + RegisterSignal(owner, COMSIG_MOB_HUD_CREATED, PROC_REF(apply_blur)) + RegisterSignal(owner, COMSIG_MOB_MOTION_SICKNESS_UPDATE, PROC_REF(pref_update)) + + if(owner.hud_used) + apply_blur() + +/datum/status_effect/concussion/on_remove() + . = ..() + UnregisterSignal(owner, list(COMSIG_MOB_HUD_CREATED, COMSIG_MOB_MOTION_SICKNESS_UPDATE)) + remove_blur() + +/datum/status_effect/concussion/proc/apply_blur(datum/source) + SIGNAL_HANDLER + + if(owner.client?.prefs?.read_preference(/datum/preference/toggle/motion_sickness)) + return + + var/atom/movable/screen/plane_master/PM = owner.hud_used.plane_masters["[RENDER_PLANE_GAME]"] + PM.add_filter("concussion_angular_blur", 3, angular_blur_filter(0, 0, 0.7)) + PM.add_filter("concussion_radial_blur", 4, radial_blur_filter(0, 0, 0)) + + animate(PM.get_filter("concussion_angular_blur"), size = 1.8, time = 2 SECONDS, SINE_EASING|EASE_IN, loop = -1, flags = ANIMATION_PARALLEL) + animate(size = 0.7, time = 2 SECONDS, SINE_EASING|EASE_OUT) + animate(size = 0.7, time = 18.3 SECONDS) // I just want to offset it from life ticks, so it feels more random. + + animate(PM.get_filter("concussion_radial_blur"), size = 0.18, time = 2 SECONDS, easing = SINE_EASING|EASE_IN, loop = -1, flags = ANIMATION_PARALLEL) + animate(size = 0, time = 2 SECONDS, SINE_EASING|EASE_OUT) + animate(size = 0, time = 18.3 SECONDS) // I just want to offset it from life ticks, so it feels more random. + +/datum/status_effect/concussion/proc/remove_blur() + if(!owner.hud_used) + return + + var/atom/movable/screen/plane_master/PM = owner.hud_used.plane_masters["[RENDER_PLANE_GAME]"] + PM.remove_filter("concussion_radial_blur") + PM.remove_filter("concussion_angular_blur") + +/datum/status_effect/concussion/proc/pref_update(datum/source, new_value) + SIGNAL_HANDLER + + if(new_value) + remove_blur() + else + apply_blur() diff --git a/code/datums/status_effects/debuffs/confusion.dm b/code/datums/status_effects/debuffs/confusion.dm index 209e9bdebb2f..03906a67deee 100644 --- a/code/datums/status_effects/debuffs/confusion.dm +++ b/code/datums/status_effects/debuffs/confusion.dm @@ -17,10 +17,14 @@ /datum/status_effect/confusion/on_apply() RegisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(remove_confusion)) RegisterSignal(owner, COMSIG_MOB_CLIENT_PRE_MOVE, PROC_REF(on_move)) + owner.stats?.set_skill_modifier(-1, /datum/rpg_skill/skirmish, SKILL_SOURCE_CONFUSION) + owner.stats?.set_stat_modifier(-1, /datum/rpg_stat/psyche, SKILL_SOURCE_CONFUSION) return TRUE /datum/status_effect/confusion/on_remove() UnregisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_MOB_CLIENT_PRE_MOVE)) + owner.stats?.remove_skill_modifier(/datum/rpg_skill/skirmish, SKILL_SOURCE_CONFUSION) + owner.stats?.remove_stat_modifier(/datum/rpg_stat/psyche, SKILL_SOURCE_CONFUSION) /// Removes all of our confusion (self terminate) on signal /datum/status_effect/confusion/proc/remove_confusion(datum/source) @@ -32,6 +36,10 @@ /datum/status_effect/confusion/proc/on_move(datum/source, list/move_args) SIGNAL_HANDLER + var/mob/living/L = source + if(L.body_position == LYING_DOWN) + return + // How much time is left in the duration, in seconds. var/time_left = (duration - world.time) / 10 var/direction = move_args[MOVE_ARG_DIRECTION] diff --git a/code/datums/status_effects/debuffs/debuffs.dm b/code/datums/status_effects/debuffs/debuffs.dm index 2d3dbd09e488..fa662b54514a 100644 --- a/code/datums/status_effects/debuffs/debuffs.dm +++ b/code/datums/status_effects/debuffs/debuffs.dm @@ -23,6 +23,7 @@ //STUN /datum/status_effect/incapacitating/stun id = "stun" + max_duration = 30 SECONDS /datum/status_effect/incapacitating/stun/on_apply() . = ..() @@ -42,6 +43,7 @@ //KNOCKDOWN /datum/status_effect/incapacitating/knockdown id = "knockdown" + max_duration = 30 SECONDS /datum/status_effect/incapacitating/knockdown/on_apply() . = ..() @@ -72,6 +74,7 @@ //PARALYZED /datum/status_effect/incapacitating/paralyzed id = "paralyzed" + max_duration = 30 SECONDS /datum/status_effect/incapacitating/paralyzed/on_apply() . = ..() @@ -141,14 +144,17 @@ if(!HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) ADD_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) tick_interval = -1 + ADD_TRAIT(owner, TRAIT_DEAF, TRAIT_STATUS_EFFECT(id)) RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_insomniac)) RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE), PROC_REF(on_owner_sleepy)) /datum/status_effect/incapacitating/sleeping/on_remove() + REMOVE_TRAIT(owner, TRAIT_DEAF, TRAIT_STATUS_EFFECT(id)) UnregisterSignal(owner, list(SIGNAL_ADDTRAIT(TRAIT_SLEEPIMMUNE), SIGNAL_REMOVETRAIT(TRAIT_SLEEPIMMUNE))) if(!HAS_TRAIT(owner, TRAIT_SLEEPIMMUNE)) REMOVE_TRAIT(owner, TRAIT_KNOCKEDOUT, TRAIT_STATUS_EFFECT(id)) tick_interval = initial(tick_interval) + return ..() ///If the mob is sleeping and gain the TRAIT_SLEEPIMMUNE we remove the TRAIT_KNOCKEDOUT and stop the tick() from happening @@ -177,10 +183,10 @@ healing -= 0.1 break //Only count the first bedsheet if(health_ratio > 0.8) - owner.adjustBruteLoss(-healing) - owner.adjustFireLoss(-healing) - owner.adjustToxLoss(-healing * 0.5, TRUE, TRUE) - owner.stamina.adjust(healing) + owner.adjustBruteLoss(healing) + owner.adjustFireLoss(healing) + owner.adjustToxLoss(healing * 0.5, TRUE, TRUE) + owner.stamina.adjust(-healing) // Drunkenness gets reduced by 0.3% per tick (6% per 2 seconds) owner.set_drunk_effect(owner.get_drunk_amount() * 0.997) @@ -198,13 +204,13 @@ icon_state = "asleep" //STASIS -/datum/status_effect/grouped/stasis +/datum/status_effect/grouped/hard_stasis id = "stasis" duration = -1 alert_type = /atom/movable/screen/alert/status_effect/stasis var/last_dead_time -/datum/status_effect/grouped/stasis/proc/update_time_of_death() +/datum/status_effect/grouped/hard_stasis/proc/update_time_of_death() if(last_dead_time) var/delta = world.time - last_dead_time var/new_timeofdeath = owner.timeofdeath + delta @@ -214,13 +220,13 @@ if(owner.stat == DEAD) last_dead_time = world.time -/datum/status_effect/grouped/stasis/on_creation(mob/living/new_owner, set_duration) +/datum/status_effect/grouped/hard_stasis/on_creation(mob/living/new_owner, set_duration) . = ..() if(.) update_time_of_death() owner.reagents?.end_metabolization(owner, FALSE) -/datum/status_effect/grouped/stasis/on_apply() +/datum/status_effect/grouped/hard_stasis/on_apply() . = ..() if(!.) return @@ -233,10 +239,10 @@ var/mob/living/carbon/carbon_owner = owner carbon_owner.update_bodypart_bleed_overlays() -/datum/status_effect/grouped/stasis/tick() +/datum/status_effect/grouped/hard_stasis/tick() update_time_of_death() -/datum/status_effect/grouped/stasis/on_remove() +/datum/status_effect/grouped/hard_stasis/on_remove() REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, TRAIT_STATUS_EFFECT(id)) REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, TRAIT_STATUS_EFFECT(id)) owner.remove_filter("stasis_status_ripple") @@ -303,40 +309,6 @@ if(owner.reagents) owner.reagents.del_reagent(/datum/reagent/water/holywater) //can't be deconverted -/datum/status_effect/crusher_mark - id = "crusher_mark" - duration = 300 //if you leave for 30 seconds you lose the mark, deal with it - status_type = STATUS_EFFECT_REPLACE - alert_type = null - var/mutable_appearance/marked_underlay - var/obj/item/kinetic_crusher/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 - -/datum/status_effect/crusher_mark/on_apply() - if(owner.mob_size >= MOB_SIZE_LARGE) - marked_underlay = mutable_appearance('icons/effects/effects.dmi', "shield2") - marked_underlay.pixel_x = -owner.pixel_x - marked_underlay.pixel_y = -owner.pixel_y - owner.underlays += marked_underlay - return TRUE - return FALSE - -/datum/status_effect/crusher_mark/Destroy() - hammer_synced = null - if(owner) - owner.underlays -= marked_underlay - QDEL_NULL(marked_underlay) - return ..() - -/datum/status_effect/crusher_mark/be_replaced() - owner.underlays -= marked_underlay //if this is being called, we should have an owner at this point. - ..() - /datum/status_effect/eldritch id = "heretic_mark" duration = 15 SECONDS @@ -667,13 +639,11 @@ . = ..() ADD_TRAIT(owner, TRAIT_PACIFISM, CLOTHING_TRAIT) ADD_TRAIT(owner, TRAIT_MUTE, CLOTHING_TRAIT) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, type, /datum/mood_event/gondola) to_chat(owner, span_notice("You suddenly feel at peace and feel no need to make any sudden or rash actions...")) /datum/status_effect/gonbola_pacify/on_remove() REMOVE_TRAIT(owner, TRAIT_PACIFISM, CLOTHING_TRAIT) REMOVE_TRAIT(owner, TRAIT_MUTE, CLOTHING_TRAIT) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, type) return ..() /datum/status_effect/trance @@ -722,8 +692,10 @@ /datum/status_effect/trance/proc/hypnotize(datum/source, list/hearing_args) SIGNAL_HANDLER - if(!owner.can_hear()) + var/datum/language/L = hearing_args[HEARING_LANGUAGE] + if(!L?.can_receive_language(owner) || !owner.has_language(L)) return + var/mob/hearing_speaker = hearing_args[HEARING_SPEAKER] if(hearing_speaker == owner) return @@ -1029,7 +1001,7 @@ ) /datum/status_effect/ants/on_creation(mob/living/new_owner, amount_left) - if(isnum(amount_left) && new_owner.stat < HARD_CRIT) + if(isnum(amount_left) && new_owner.stat < DEAD) if(new_owner.stat < UNCONSCIOUS) // Unconcious people won't get messages to_chat(new_owner, span_userdanger("You're covered in ants!")) ants_remaining += amount_left @@ -1038,7 +1010,7 @@ /datum/status_effect/ants/refresh(effect, amount_left) var/mob/living/carbon/human/victim = owner - if(isnum(amount_left) && ants_remaining >= 1 && victim.stat < HARD_CRIT) + if(isnum(amount_left) && ants_remaining >= 1 && victim.stat < DEAD) if(victim.stat < UNCONSCIOUS) // Unconcious people won't get messages if(!prob(1)) // 99% to_chat(victim, span_userdanger("You're covered in MORE ants!")) @@ -1064,7 +1036,7 @@ /datum/status_effect/ants/tick() var/mob/living/carbon/human/victim = owner victim.adjustBruteLoss(max(0.1, round((ants_remaining * 0.004),0.1))) //Scales with # of ants (lowers with time). Roughly 10 brute over 50 seconds. - if(victim.stat <= SOFT_CRIT) //Makes sure people don't scratch at themselves while they're in a critical condition + if(victim.stat != CONSCIOUS && !HAS_TRAIT(victim, TRAIT_SOFT_CRITICAL_CONDITION)) //Makes sure people don't scratch at themselves while they're in a critical condition if(prob(15)) switch(rand(1,2)) if(1) @@ -1090,7 +1062,7 @@ victim.blur_eyes(3) ants_remaining -= 5 // To balance out the blindness, it'll be a little shorter. ants_remaining-- - if(ants_remaining <= 0 || victim.stat >= HARD_CRIT) + if(ants_remaining <= 0 || victim.stat == DEAD) victim.remove_status_effect(/datum/status_effect/ants) //If this person has no more ants on them or are dead, they are no longer affected. /atom/movable/screen/alert/status_effect/ants @@ -1099,8 +1071,11 @@ icon_state = "antalert" /atom/movable/screen/alert/status_effect/ants/Click() + . = ..() + if(.) + return FALSE var/mob/living/living = owner - if(!istype(living) || !living.can_resist() || living != owner) + if(!istype(living) || !living.can_resist()) return to_chat(living, span_notice("You start to shake the ants off!")) if(!do_after(living, time = 2 SECONDS)) @@ -1247,7 +1222,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/freezing_blast, update = TRUE) /datum/movespeed_modifier/freezing_blast - multiplicative_slowdown = 1 + slowdown = 1 /datum/status_effect/discoordinated id = "discoordinated" diff --git a/code/datums/status_effects/debuffs/disorient.dm b/code/datums/status_effects/debuffs/disorient.dm index f280889e005a..b2bdee975ec3 100644 --- a/code/datums/status_effects/debuffs/disorient.dm +++ b/code/datums/status_effects/debuffs/disorient.dm @@ -8,9 +8,11 @@ if(!.) return ADD_TRAIT(owner, TRAIT_DISORIENTED, TRAIT_STATUS_EFFECT(id)) + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/disorient) /datum/status_effect/incapacitating/disoriented/on_remove() REMOVE_TRAIT(owner, TRAIT_DISORIENTED, TRAIT_STATUS_EFFECT(id)) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/disorient) return ..() /datum/status_effect/incapacitating/disoriented/tick() diff --git a/code/datums/status_effects/debuffs/drugginess.dm b/code/datums/status_effects/debuffs/drugginess.dm index aca72185a484..8393a044884c 100644 --- a/code/datums/status_effects/debuffs/drugginess.dm +++ b/code/datums/status_effects/debuffs/drugginess.dm @@ -10,7 +10,6 @@ /datum/status_effect/drugginess/on_apply() RegisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_LIVING_DEATH), PROC_REF(remove_drugginess)) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, id, /datum/mood_event/high) owner.overlay_fullscreen(id, /atom/movable/screen/fullscreen/high) owner.sound_environment_override = SOUND_ENVIRONMENT_DRUGGED owner.grant_language(/datum/language/beachbum, TRUE, TRUE, id) @@ -19,7 +18,6 @@ /datum/status_effect/drugginess/on_remove() UnregisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_LIVING_DEATH)) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, id) owner.clear_fullscreen(id) if(owner.sound_environment_override == SOUND_ENVIRONMENT_DRUGGED) owner.sound_environment_override = SOUND_ENVIRONMENT_NONE diff --git a/code/datums/status_effects/debuffs/drunk.dm b/code/datums/status_effects/debuffs/drunk.dm index da29997b0e98..9bdef49a61e3 100644 --- a/code/datums/status_effects/debuffs/drunk.dm +++ b/code/datums/status_effects/debuffs/drunk.dm @@ -117,7 +117,6 @@ /datum/status_effect/inebriated/drunk/on_apply() . = ..() owner.sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, id, /datum/mood_event/drunk) /datum/status_effect/inebriated/drunk/on_remove() clear_effects() @@ -130,8 +129,6 @@ /// Clears any side effects we set due to being drunk. /datum/status_effect/inebriated/drunk/proc/clear_effects() - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, id) - if(owner.sound_environment_override == SOUND_ENVIRONMENT_PSYCHOTIC) owner.sound_environment_override = SOUND_ENVIRONMENT_NONE @@ -155,17 +152,14 @@ if(drunk_value > BALLMER_PEAK_WINDOWS_ME) // by this point you're into windows ME territory owner.say(pick_list_replacements(VISTA_FILE, "ballmer_windows_me_msg"), forced = "ballmer") - // There's always a 30% chance to gain some drunken slurring - if(prob(30)) - owner.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/drunk) + // Drunk slurring scales in intensity based on how drunk we are -at 16 you will likely not even notice it, + // but when we start to scale up you definitely will + if(drunk_value >= 16) + owner.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/drunk, max_duration = 20 SECONDS) // And drunk people will always lose jitteriness owner.adjust_timed_status_effect(-6 SECONDS, /datum/status_effect/jitter) - // Over 11, we will constantly gain slurring up to 10 seconds of slurring. - if(drunk_value >= 11) - owner.adjust_timed_status_effect(2.4 SECONDS, /datum/status_effect/speech/slurring/drunk, max_duration = 10 SECONDS) - // Over 41, we have a 30% chance to gain confusion, and we will always have 20 seconds of dizziness. if(drunk_value >= 41) if(prob(30)) @@ -189,14 +183,13 @@ // Over 81, we will gain constant toxloss if(drunk_value >= 81) owner.adjustToxLoss(1) - if(owner.stat <= SOFT_CRIT && prob(5)) + if(owner.stat == CONSCIOUS && prob(5)) to_chat(owner, span_warning("Maybe you should lie down for a bit...")) // Over 91, we gain even more toxloss, brain damage, and have a chance of dropping into a long sleep if(drunk_value >= 91) owner.adjustToxLoss(1) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.4) - if(owner.stat <= SOFT_CRIT && prob(20)) + if(owner.stat == CONSCIOUS && prob(20)) // Don't put us in a deep sleep if the shuttle's here. QoL, mainly. if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && is_station_level(owner.z)) to_chat(owner, span_warning("You're so tired... but you can't miss that shuttle...")) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index ac1411acc378..419f7d4c108e 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -16,6 +16,8 @@ var/list/override_types /// For how much firestacks does one our stack count var/stack_modifier = 1 + /// A particle effect, for things like embers + var/obj/effect/abstract/particle_holder/particle_effect /datum/status_effect/fire_handler/refresh(mob/living/new_owner, new_stacks, forced = FALSE) if(forced) @@ -73,6 +75,18 @@ adjust_stacks(override_effect.stacks) qdel(override_effect) + update_particles() + +/datum/status_effect/fire_handler/on_remove() + if(particle_effect) + QDEL_NULL(particle_effect) + return ..() + +/** + * Updates the particles for the status effects + */ +/datum/status_effect/fire_handler/proc/update_particles() + /** * Setter and adjuster procs for firestacks * @@ -154,6 +168,7 @@ deal_damage(delta_time, times_fired) update_overlay() + update_particles() /** * Proc that handles damage dealing and all special effects @@ -170,6 +185,7 @@ var/turf/location = get_turf(owner) location.hotspot_expose(700, 25 * delta_time, TRUE) +#define BODYTEMP_FIRE_TEMP_SOFTCAP 1200 /** * Used to deal damage to humans and count their protection. * @@ -179,22 +195,26 @@ * - no_protection: When set to TRUE, fire will ignore any possible fire protection * */ - /datum/status_effect/fire_handler/fire_stacks/proc/harm_human(delta_time, times_fired, no_protection = FALSE) var/mob/living/carbon/human/victim = owner var/thermal_protection = victim.get_thermal_protection() - if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT && !no_protection) - return + if(!no_protection) + if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) + return + if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT) + victim.adjust_bodytemperature(5.5 * delta_time) + return - if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT && !no_protection) - victim.adjust_bodytemperature(5.5 * delta_time) - return + var/amount_to_heat = (BODYTEMP_HEATING_MAX + (stacks * 12)) + if(owner.bodytemperature > BODYTEMP_FIRE_TEMP_SOFTCAP) + // Apply dimishing returns upon temp beyond the soft cap + amount_to_heat = amount_to_heat ** (BODYTEMP_FIRE_TEMP_SOFTCAP / owner.bodytemperature) - victim.adjust_bodytemperature((BODYTEMP_HEATING_MAX + (stacks * 12)) * 0.5 * delta_time) - SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire) + victim.adjust_bodytemperature(amount_to_heat) victim.mind?.add_memory(MEMORY_FIRE, list(DETAIL_PROTAGONIST = victim), story_value = STORY_VALUE_OKAY) +#undef BODYTEMP_FIRE_TEMP_SOFTCAP /** * Handles mob ignition, should be the only way to set on_fire to TRUE * @@ -210,6 +230,8 @@ on_fire = TRUE if(!silent) owner.visible_message(span_warning("[owner] catches fire!"), span_userdanger("You're set on fire!")) + spawn(-1) + owner.emote("scream") if(firelight_type) firelight_ref = WEAKREF(new firelight_type(owner)) @@ -217,6 +239,7 @@ SEND_SIGNAL(owner, COMSIG_LIVING_IGNITED, owner) cache_stacks() update_overlay() + update_particles() return TRUE /** @@ -228,10 +251,10 @@ qdel(firelight_ref) on_fire = FALSE - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "on_fire") SEND_SIGNAL(owner, COMSIG_LIVING_EXTINGUISHED, owner) cache_stacks() update_overlay() + update_particles() if(!iscarbon(owner)) return @@ -244,6 +267,7 @@ extinguish() set_stacks(0) update_overlay() + return ..() /datum/status_effect/fire_handler/fire_stacks/update_overlay() last_icon_state = owner.update_fire_overlay(stacks, on_fire, last_icon_state) @@ -262,3 +286,8 @@ adjust_stacks(-0.5 * delta_time) if(stacks <= 0) qdel(src) + +/datum/status_effect/fire_handler/wet_stacks/update_particles() + if(particle_effect) + return + particle_effect = new(owner, /particles/droplets) diff --git a/code/datums/status_effects/debuffs/jitteriness.dm b/code/datums/status_effects/debuffs/jitteriness.dm index d9b6f1883fd3..9b97d7eadfe2 100644 --- a/code/datums/status_effects/debuffs/jitteriness.dm +++ b/code/datums/status_effects/debuffs/jitteriness.dm @@ -15,12 +15,10 @@ return FALSE RegisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_LIVING_DEATH), PROC_REF(remove_jitter)) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, id, /datum/mood_event/jittery) return TRUE /datum/status_effect/jitter/on_remove() UnregisterSignal(owner, list(COMSIG_LIVING_POST_FULLY_HEAL, COMSIG_LIVING_DEATH)) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, id) // juuust in case, reset our x and y's from our jittering owner.pixel_x = 0 owner.pixel_y = 0 @@ -57,5 +55,6 @@ var/amplitude = min(4, (jitter_amount / 100) + 1) var/pixel_x_diff = rand(-amplitude, amplitude) var/pixel_y_diff = rand(-amplitude / 3, amplitude / 3) - animate(src, pixel_x = pixel_x_diff, pixel_y = pixel_y_diff , time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) - animate(pixel_x = -pixel_x_diff , pixel_y = -pixel_y_diff , time = 0.2 SECONDS, flags = ANIMATION_RELATIVE) + for(var/atom/movable/AM as anything in get_associated_mimics() + src) + animate(AM, pixel_x = pixel_x_diff, pixel_y = pixel_y_diff , time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) + animate(pixel_x = -pixel_x_diff , pixel_y = -pixel_y_diff , time = 0.2 SECONDS, flags = ANIMATION_RELATIVE) diff --git a/code/datums/status_effects/debuffs/speech_debuffs.dm b/code/datums/status_effects/debuffs/speech_debuffs.dm index 3962d52442fd..30251e61bd22 100644 --- a/code/datums/status_effects/debuffs/speech_debuffs.dm +++ b/code/datums/status_effects/debuffs/speech_debuffs.dm @@ -200,14 +200,36 @@ return modified_char -/datum/status_effect/speech/slurring/drunk - id = "drunk_slurring" +/datum/status_effect/speech/slurring/generic + id = "generic_slurring" common_prob = 33 - uncommon_prob = 5 + uncommon_prob = 0 replacement_prob = 5 doubletext_prob = 10 text_modification_file = "slurring_drunk_text.json" +/datum/status_effect/speech/slurring/drunk + id = "drunk_slurring" + // These defaults are updated when speech event occur. + common_prob = -1 + uncommon_prob = -1 + replacement_prob = -1 + doubletext_prob = -1 + text_modification_file = "slurring_drunk_text.json" + +/datum/status_effect/speech/slurring/drunk/handle_message(datum/source, list/message_args) + var/current_drunkness = owner.get_drunk_amount() + // These numbers are arbitarily picked + // Common replacements start at about 20, and maxes out at about 85 + common_prob = clamp((current_drunkness * 0.8) - 16, 0, 50) + // Uncommon replacements (burping) start at 50 and max out at 110 (when you are dying) + uncommon_prob = clamp((current_drunkness * 0.2) - 10, 0, 12) + // Replacements start at 20 and max out at about 60 + replacement_prob = clamp((current_drunkness * 0.4) - 8, 0, 12) + // Double texting start out at about 25 and max out at about 60 + doubletext_prob = clamp((current_drunkness * 0.5) - 12, 0, 20) + return ..() + /datum/status_effect/speech/slurring/cult id = "cult_slurring" common_prob = 50 diff --git a/code/datums/status_effects/drug_effects.dm b/code/datums/status_effects/drug_effects.dm index b797c8e995b4..322cafbd1624 100644 --- a/code/datums/status_effects/drug_effects.dm +++ b/code/datums/status_effects/drug_effects.dm @@ -79,7 +79,6 @@ human_owner.update_body() //updates eye color ADD_TRAIT(human_owner, TRAIT_BLOODSHOT_EYES, type) //dilates blood vessels in eyes ADD_TRAIT(human_owner, TRAIT_CLUMSY, type) //impairs motor coordination - SEND_SIGNAL(human_owner, COMSIG_ADD_MOOD_EVENT, "stoned", /datum/mood_event/stoned) //improves mood human_owner.sound_environment_override = SOUND_ENVIRONMENT_DRUGGED //not realistic but very immersive return TRUE @@ -93,7 +92,6 @@ human_owner.update_body() REMOVE_TRAIT(human_owner, TRAIT_BLOODSHOT_EYES, type) REMOVE_TRAIT(human_owner, TRAIT_CLUMSY, type) - SEND_SIGNAL(human_owner, COMSIG_CLEAR_MOOD_EVENT, "stoned") human_owner.sound_environment_override = SOUND_ENVIRONMENT_NONE /atom/movable/screen/alert/status_effect/stoned diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 295ab251bd88..3a4d9a681c5a 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -1,44 +1,4 @@ //entirely neutral or internal status effects go here - -/datum/status_effect/crusher_damage //tracks the damage dealt to this mob by kinetic crushers - id = "crusher_damage" - duration = -1 - tick_interval = -1 - status_type = STATUS_EFFECT_UNIQUE - alert_type = null - var/total_damage = 0 - -/datum/status_effect/syphon_mark - id = "syphon_mark" - duration = 50 - status_type = STATUS_EFFECT_MULTIPLE - alert_type = null - on_remove_on_mob_delete = TRUE - var/obj/item/borg/upgrade/modkit/bounty/reward_target - -/datum/status_effect/syphon_mark/on_creation(mob/living/new_owner, obj/item/borg/upgrade/modkit/bounty/new_reward_target) - . = ..() - if(.) - reward_target = new_reward_target - -/datum/status_effect/syphon_mark/on_apply() - if(owner.stat == DEAD) - return FALSE - return ..() - -/datum/status_effect/syphon_mark/proc/get_kill() - if(!QDELETED(reward_target)) - reward_target.get_kill(owner) - -/datum/status_effect/syphon_mark/tick() - if(owner.stat == DEAD) - get_kill() - qdel(src) - -/datum/status_effect/syphon_mark/on_remove() - get_kill() - . = ..() - /atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" @@ -127,14 +87,6 @@ desc = "Making any sudden moves would probably be a bad idea!" icon_state = "aimed" -/datum/status_effect/grouped/heldup/on_apply() - owner.apply_status_effect(/datum/status_effect/grouped/surrender, REF(src)) - return ..() - -/datum/status_effect/grouped/heldup/on_remove() - owner.remove_status_effect(/datum/status_effect/grouped/surrender, REF(src)) - return ..() - // holdup is for the person aiming /datum/status_effect/holdup id = "holdup" @@ -148,6 +100,11 @@ desc = "You're currently pointing a gun at someone." icon_state = "aimed" +/atom/movable/screen/alert/status_effect/holdup/Click(location, control, params) + . = ..() + var/mob/living/L = usr + qdel(L.gunpoint) + // this status effect is used to negotiate the high-fiving capabilities of all concerned parties /datum/status_effect/offering id = "offering" @@ -237,26 +194,6 @@ id = "secret_handshake" give_alert_type = /atom/movable/screen/alert/give/secret_handshake -//this effect gives the user an alert they can use to surrender quickly -/datum/status_effect/grouped/surrender - id = "surrender" - duration = -1 - tick_interval = -1 - status_type = STATUS_EFFECT_UNIQUE - alert_type = /atom/movable/screen/alert/status_effect/surrender - -/atom/movable/screen/alert/status_effect/surrender - name = "Surrender" - desc = "Looks like you're in trouble now, bud. Click here to surrender. (Warning: You will be incapacitated.)" - icon_state = "surrender" - -/atom/movable/screen/alert/status_effect/surrender/Click(location, control, params) - . = ..() - if(!.) - return - - owner.emote("surrender") - /* * A status effect used for preventing caltrop message spam * @@ -273,213 +210,19 @@ status_type = STATUS_EFFECT_REFRESH alert_type = null -#define EIGENSTASIUM_MAX_BUFFER -250 -#define EIGENSTASIUM_STABILISATION_RATE 5 -#define EIGENSTASIUM_PHASE_1_END 50 -#define EIGENSTASIUM_PHASE_2_END 80 -#define EIGENSTASIUM_PHASE_3_START 100 -#define EIGENSTASIUM_PHASE_3_END 150 - -/datum/status_effect/eigenstasium - id = "eigenstasium" - status_type = STATUS_EFFECT_UNIQUE - alert_type = null +///Makes the mob luminescent for the duration of the effect. +/datum/status_effect/tinlux_light + id = "tinea_luxor_light" processing_speed = STATUS_EFFECT_NORMAL_PROCESS - ///So we know what cycle we're in during the status - var/current_cycle = EIGENSTASIUM_MAX_BUFFER //Consider it your stability - ///The addiction looper for addiction stage 3 - var/phase_3_cycle = -0 //start off delayed - ///Your clone from another reality - var/mob/living/carbon/alt_clone = null - ///If we display the stabilised message or not - var/stable_message = FALSE - -/datum/status_effect/eigenstasium/Destroy() - if(alt_clone) - UnregisterSignal(alt_clone, COMSIG_PARENT_QDELETING) - QDEL_NULL(alt_clone) - return ..() + var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj -/datum/status_effect/eigenstasium/tick() - . = ..() - //This stuff runs every cycle - if(prob(5)) - do_sparks(5, FALSE, owner) - - //If we have a reagent that blocks the effects - var/block_effects = FALSE - if(owner.has_reagent(/datum/reagent/bluespace)) - current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - (EIGENSTASIUM_STABILISATION_RATE * 1.5))) //cap to -250 - block_effects = TRUE - if(owner.has_reagent(/datum/reagent/stabilizing_agent)) - current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - EIGENSTASIUM_STABILISATION_RATE)) - block_effects = TRUE - var/datum/reagent/eigen = owner.has_reagent(/datum/reagent/eigenstate) - if(eigen) - if(eigen.overdosed) - block_effects = FALSE - else - current_cycle = max(EIGENSTASIUM_MAX_BUFFER, (current_cycle - (EIGENSTASIUM_STABILISATION_RATE * 2))) - block_effects = TRUE - - if(!QDELETED(alt_clone)) //catch any stragglers - do_sparks(5, FALSE, alt_clone) - owner.visible_message("[owner] is snapped across to a different alternative reality!") - QDEL_NULL(alt_clone) - - if(block_effects) - if(!stable_message) - owner.visible_message("You feel stable...for now.") - stable_message = TRUE - return - stable_message = FALSE - - //These run on specific cycles - switch(current_cycle) - if(0) - to_chat(owner, span_userdanger("You feel like you're being pulled across to somewhere else. You feel empty inside.")) - - //phase 1 - if(1 to EIGENSTASIUM_PHASE_1_END) - owner.set_timed_status_effect(4 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - owner.adjust_nutrition(-4) - - //phase 2 - if(EIGENSTASIUM_PHASE_1_END to EIGENSTASIUM_PHASE_2_END) - if(current_cycle == 51) - to_chat(owner, span_userdanger("You start to convlse violently as you feel your consciousness merges across realities, your possessions flying wildy off your body!")) - owner.set_timed_status_effect(400 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - owner.Knockdown(10) - - var/list/items = list() - var/max_loop - if (length(owner.get_contents()) >= 10) - max_loop = 10 - else - max_loop = length(owner.get_contents()) - for (var/i in 1 to max_loop) - var/obj/item/item = owner.get_contents()[i] - if ((item.item_flags & DROPDEL) || HAS_TRAIT(item, TRAIT_NODROP)) // can't teleport these kinds of items - continue - items.Add(item) - - if(!LAZYLEN(items)) - return ..() - var/obj/item/item = pick(items) - owner.dropItemToGround(item, TRUE) - do_sparks(5,FALSE,item) - do_teleport(item, get_turf(item), 3, no_effects=TRUE); - do_sparks(5,FALSE,item) - - //phase 3 - little break to get your items - if(EIGENSTASIUM_PHASE_3_START to EIGENSTASIUM_PHASE_3_END) - //Clone function - spawns a clone then deletes it - simulates multiple copies of the player teleporting in - switch(phase_3_cycle) //Loops 0 -> 1 -> 2 -> 1 -> 2 -> 1 ...ect. - if(0) - owner.set_timed_status_effect(200 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - to_chat(owner, span_userdanger("Your eigenstate starts to rip apart, drawing in alternative reality versions of yourself!")) - if(1) - var/typepath = owner.type - alt_clone = new typepath(owner.loc) - alt_clone.appearance = owner.appearance - alt_clone.real_name = owner.real_name - RegisterSignal(alt_clone, COMSIG_PARENT_QDELETING, PROC_REF(remove_clone_from_var)) - owner.visible_message("[owner] splits into seemingly two versions of themselves!") - do_teleport(alt_clone, get_turf(alt_clone), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! - do_sparks(5,FALSE,alt_clone) - alt_clone.emote("spin") - owner.emote("spin") - var/static/list/say_phrases = list( - "Bugger me, whats all this then?", - "Sacre bleu! Ou suis-je?!", - "I knew powering the station using a singularity engine would lead to something like this...", - "Wow, I can't believe in your universe Cencomm got rid of cloning.", - "WHAT IS HAPPENING?!", - "YOU'VE CREATED A TIME PARADOX!", - "You trying to steal my job?", - "So that's what I'd look like if I was ugly...", - "So, two alternate universe twins walk into a bar...", - "YOU'VE DOOMED THE TIMELINE!", - "Ruffle a cat once in a while!", - "I'm starting to get why no one wants to hang out with me.", - "Why haven't you gotten around to starting that band?!", - "No!! I was just about to greentext!", - "Kept you waiting huh?", - "Oh god I think I'm ODing I'm seeing a fake version of me.", - "Hey, I remember that phase, glad I grew out of it.", - "Keep going lets see if more of us show up.", - "I bet we can finally take the clown now.", - "LING DISGUISED AS ME!", - "El psy congroo.", - "At long last! My evil twin!", - "Keep going lets see if more of us show up.", - "No! Dark spirits, do not torment me with these visions of my future self! It's horrible!", - "Good. Now that the council is assembled the meeting can begin.", - "Listen! I only have so much time before I'm ripped away. The secret behind the gas giants are...", - "Das ist nicht deutschland. Das ist nicht akzeptabel!!!", - "I've come from the future to warn you about eigenstasium! Oh no! I'm too late!", - "You fool! You took too much eigenstasium! You've doomed us all!", - "Don't trust any bagels you see until next month!", - "What...what's with these teleports? It's like one of my Japanese animes...!", - "Ik stond op het punt om mehki op tafel te zetten, en nu, waar ben ik?", - "Wake the fuck up spaceman we have a gas giant to burn", - "This is one hell of a beepsky smash.", - "Now neither of us will be virgins!") - alt_clone.say(pick(say_phrases)) - if(2) - phase_3_cycle = 0 //counter - phase_3_cycle++ - do_teleport(owner, get_turf(owner), 2, no_effects=TRUE) //Teleports player randomly - do_sparks(5, FALSE, owner) - - //phase 4 - if(EIGENSTASIUM_PHASE_3_END to INFINITY) - //clean up and remove status - SSblackbox.record_feedback("tally", "chemical_reaction", 1, "Eigenstasium wild rides ridden") - do_sparks(5, FALSE, owner) - do_teleport(owner, get_turf(owner), 2, no_effects=TRUE) //teleports clone so it's hard to find the real one! - do_sparks(5, FALSE, owner) - owner.Sleeping(100) - owner.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - to_chat(owner, span_userdanger("You feel your eigenstate settle, as \"you\" become an alternative version of yourself!")) - owner.emote("me",1,"flashes into reality suddenly, gasping as they gaze around in a bewildered and highly confused fashion!",TRUE) - log_game("FERMICHEM: [owner] ckey: [owner.key] has become an alternative universe version of themselves.") - //new you new stuff - SSquirks.randomise_quirks(owner) - owner.reagents.remove_all(1000) - var/datum/component/mood/mood = owner.GetComponent(/datum/component/mood) - mood.remove_temp_moods() //New you, new moods. - var/mob/living/carbon/human/human_mob = owner - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "Eigentrip", /datum/mood_event/eigentrip) - if(QDELETED(human_mob)) - return - if(prob(1))//low chance of the alternative reality returning to monkey - var/obj/item/organ/tail/monkey/monkey_tail = new () - monkey_tail.Insert(human_mob, drop_if_replaced = FALSE) - var/datum/species/human_species = human_mob.dna?.species - if(human_species) - human_species.randomize_main_appearance_element(human_mob) - human_species.randomize_active_underwear(human_mob) - - owner.remove_status_effect(/datum/status_effect/eigenstasium) - - //Finally increment cycle - current_cycle++ - -/datum/status_effect/eigenstasium/proc/remove_clone_from_var() - SIGNAL_HANDLER - UnregisterSignal(alt_clone, COMSIG_PARENT_QDELETING) - -/datum/status_effect/eigenstasium/on_remove() - if(!QDELETED(alt_clone))//catch any stragilers - do_sparks(5, FALSE, alt_clone) - owner.visible_message("One of the [owner]s suddenly phases out of reality in front of you!") - QDEL_NULL(alt_clone) +/datum/status_effect/tinlux_light/on_creation(mob/living/new_owner, duration = 2 SECONDS) + src.duration = duration return ..() -#undef EIGENSTASIUM_MAX_BUFFER -#undef EIGENSTASIUM_STABILISATION_RATE -#undef EIGENSTASIUM_PHASE_1_END -#undef EIGENSTASIUM_PHASE_2_END -#undef EIGENSTASIUM_PHASE_3_START -#undef EIGENSTASIUM_PHASE_3_END +/datum/status_effect/tinlux_light/on_apply() + mob_light_obj = owner.mob_light(2) + return TRUE + +/datum/status_effect/tinlux_light/on_remove() + QDEL_NULL(mob_light_obj) diff --git a/code/datums/status_effects/skill_modifiers/negative.dm b/code/datums/status_effects/skill_modifiers/negative.dm new file mode 100644 index 000000000000..efe160a74d5f --- /dev/null +++ b/code/datums/status_effects/skill_modifiers/negative.dm @@ -0,0 +1,22 @@ +/datum/status_effect/skill_mod/witness_death + status_type = STATUS_EFFECT_REFRESH + duration = 20 MINUTES + + skill_path = /datum/rpg_skill/willpower + modify_amt = -1 + source = SKILL_SOURCE_WITNESS_DEATH + +/datum/status_effect/skill_mod/witness_death/on_apply() + if(!owner.stats.cooldown_finished("death_resolve")) + return FALSE + return ..() + +/datum/status_effect/skill_mod/witness_death/on_remove() + var/datum/roll_result/result = owner.stat_roll(13, /datum/rpg_skill/willpower) + switch(result.outcome) + if(CRIT_SUCCESS, SUCCESS) + to_chat(owner, result.create_tooltip("You come to terms with past events, strengthing your resolve for the road ahead.")) + owner.stats.set_cooldown("death_resolve", INFINITY) + owner.stats.set_skill_modifier(1, /datum/rpg_skill/willpower, SKILL_SOURCE_DEATH_RESOLVE) + + return ..() diff --git a/code/datums/status_effects/skill_modifiers/rpg_modifiers.dm b/code/datums/status_effects/skill_modifiers/rpg_modifiers.dm new file mode 100644 index 000000000000..1e5c4e82b4b7 --- /dev/null +++ b/code/datums/status_effects/skill_modifiers/rpg_modifiers.dm @@ -0,0 +1,44 @@ +/datum/status_effect/stat_mod + tick_interval = -1 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + + /// Type path of the s + var/stat_path + /// Amount to modify by + var/modify_amt + /// A string source like "Incapacitated". + var/source + +/datum/status_effect/stat_mod/on_apply() + . = ..() + if(!owner.stats) + return FALSE + + owner.stats.set_stat_modifier(modify_amt, stat_path, source) + +/datum/status_effect/stat_mod/on_remove() + owner.stats.remove_stat_modifier(stat_path, source) + +/datum/status_effect/skill_mod + tick_interval = -1 + status_type = STATUS_EFFECT_MULTIPLE + alert_type = null + + /// Type path of the skill to modify + var/skill_path + /// Amount to modify by + var/modify_amt + /// A string source like "Incapacitated". + var/source + +/datum/status_effect/skill_mod/on_apply() + . = ..() + if(!owner.stats) + return FALSE + + owner.stats.set_skill_modifier(modify_amt, skill_path, source) + +/datum/status_effect/skill_mod/on_remove() + owner.stats.remove_skill_modifier(skill_path, source) + diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 6a6deb061db6..73d3e2c8b355 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -45,19 +45,35 @@ /// The chance we limp with the right leg each step it takes var/limp_chance_right = 0 + /// Keeps track of how many steps have been taken on the left leg + var/steps_left = 0 + /// Keeps track of how many steps have been taken on the right leg. + var/steps_right = 0 + /datum/status_effect/limp/on_apply() if(!iscarbon(owner)) return FALSE var/mob/living/carbon/C = owner + left = C.get_bodypart(BODY_ZONE_L_LEG) right = C.get_bodypart(BODY_ZONE_R_LEG) + update_limp() RegisterSignal(C, COMSIG_MOVABLE_MOVED, PROC_REF(check_step)) - RegisterSignal(C, list(COMSIG_CARBON_BREAK_BONE, COMSIG_CARBON_HEAL_BONE, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB), PROC_REF(update_limp)) + RegisterSignal(C, list(COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVED_LIMB), PROC_REF(update_limp)) + + if(left) + RegisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_limp)) + if(right) + RegisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_limp)) return TRUE /datum/status_effect/limp/on_remove() - UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_BREAK_BONE, COMSIG_CARBON_HEAL_BONE, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVED_LIMB)) + if(left) + UnregisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) + if(right) + UnregisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) /atom/movable/screen/alert/status_effect/limp name = "Limping" @@ -73,46 +89,187 @@ var/determined_mod = owner.has_status_effect(/datum/status_effect/determined) ? 0.5 : 1 if(next_leg == left) + // Apply slowdown, if there is any if(prob(limp_chance_left * determined_mod)) owner.client.move_delay += slowdown_left * determined_mod - next_leg = right + + // Apply pain every 10 steps if the leg is broken. + steps_left++ + if(steps_left %% 10 == 0) + steps_left = 0 + if(steps_left == 0 && !left.splint && (left.bodypart_flags & BP_BROKEN_BONES)) + pain(left) + + if(right) + next_leg = right else + // Apply slowdown, if there is any if(prob(limp_chance_right * determined_mod)) owner.client.move_delay += slowdown_right * determined_mod - next_leg = left + + // Apply pain every 10 steps if the leg is broken. + steps_right++ + if(steps_right %% 10 == 0) + steps_right = 0 + if(steps_right == 0 && !right.splint && (right.bodypart_flags & BP_BROKEN_BONES)) + pain(right) + + if(left) + next_leg = left + +/datum/status_effect/limp/proc/pain(obj/item/bodypart/leg/leg) + if(leg.bodypart_flags & BP_NO_PAIN) + return + + owner.apply_pain(40, leg, "A terrible pain shoots through your [leg.plaintext_zone].", TRUE) /datum/status_effect/limp/proc/update_limp() SIGNAL_HANDLER var/mob/living/carbon/C = owner - left = C.get_bodypart(BODY_ZONE_L_LEG) - right = C.get_bodypart(BODY_ZONE_R_LEG) + var/new_left = C.get_bodypart(BODY_ZONE_L_LEG) + var/new_right = C.get_bodypart(BODY_ZONE_R_LEG) + if(new_left != left) + if(left) + UnregisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) + left = null + if(new_left) + left = new_left + RegisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_limp)) + if(new_right != right) + if(right) + UnregisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) + right = null + if(new_right) + right = new_right + RegisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_limp)) if(!left && !right) C.remove_status_effect(src) return - slowdown_left = 0 - slowdown_right = 0 + slowdown_left = 1 + slowdown_right = 1 limp_chance_left = 0 limp_chance_right = 0 - // technically you can have multiple wounds causing limps on the same limb, even if practically only bone wounds cause it in normal gameplay if(left) - if(left.check_bones() & CHECKBONES_BROKEN) - slowdown_left = 7 - limp_chance_left = 20 + slowdown_left = left.interaction_speed_modifier + limp_chance_left = 100 if(right) - if(right.check_bones() & CHECKBONES_BROKEN) - slowdown_right = 7 - limp_chance_left = 20 + slowdown_right = right.interaction_speed_modifier + limp_chance_right = 100 // this handles losing your leg with the limp and the other one being in good shape as well - if(!slowdown_left && !slowdown_right) + if(slowdown_left + slowdown_right == 2) + C.remove_status_effect(src) + return + + +/atom/movable/screen/alert/status_effect/broken_arm + name = "Restricted Arm" + desc = "One or more of your arms is restricted or broken, it is difficult to use!" + +/datum/status_effect/arm_slowdown + id = "arm_broke" + status_type = STATUS_EFFECT_UNIQUE + tick_interval = 0 + alert_type = /atom/movable/screen/alert/status_effect/broken_arm + + /// The left leg of the limping person + var/obj/item/bodypart/arm/left + var/obj/item/bodypart/arm/right + + var/speed_left + var/speed_right + +/datum/status_effect/arm_slowdown/on_remove() + . = ..() + var/mob/living/carbon/C = owner + C.remove_actionspeed_modifier(/datum/actionspeed_modifier/broken_arm) + +/datum/status_effect/arm_slowdown/on_apply() + if(!iscarbon(owner)) + return FALSE + + var/mob/living/carbon/C = owner + left = C.get_bodypart(BODY_ZONE_L_ARM) + right = C.get_bodypart(BODY_ZONE_R_ARM) + + RegisterSignal(owner, COMSIG_MOB_SWAP_HANDS, PROC_REF(on_hand_swap)) + RegisterSignal(owner, list(COMSIG_CARBON_REMOVED_LIMB, COMSIG_CARBON_ATTACH_LIMB), PROC_REF(update_slow)) + if(left) + speed_left = left.interaction_speed_modifier + RegisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_slow)) + if(right) + speed_right = right.interaction_speed_modifier + RegisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_slow)) + + apply_to_mob() + return TRUE + +/datum/status_effect/arm_slowdown/proc/update_slow() + SIGNAL_HANDLER + + var/mob/living/carbon/C = owner + var/new_left = C.get_bodypart(BODY_ZONE_L_ARM) + var/new_right = C.get_bodypart(BODY_ZONE_R_ARM) + if(new_left != left) + if(left) + UnregisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) + left = null + if(new_left) + left = new_left + RegisterSignal(left, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_slow)) + if(new_right != right) + if(right) + UnregisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED) + right = null + if(new_right) + right = new_right + RegisterSignal(right, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, PROC_REF(update_slow)) + + speed_left = left?.interaction_speed_modifier || 1 + speed_right = right?.interaction_speed_modifier || 1 + + if((speed_left + speed_left) == 2) // 1 + 1 = 2 C.remove_status_effect(src) return + apply_to_mob() + +/datum/status_effect/arm_slowdown/proc/apply_to_mob() + SIGNAL_HANDLER + var/mob/living/carbon/C = owner + var/hand = C.get_active_hand()?.body_zone + + if(hand == BODY_ZONE_R_ARM) + if(speed_right == 1) + C.remove_actionspeed_modifier(/datum/actionspeed_modifier/broken_arm) + else + C.add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/broken_arm, slowdown = speed_right) + else if(hand == BODY_ZONE_L_ARM) + if(speed_left == 1) + C.remove_actionspeed_modifier(/datum/actionspeed_modifier/broken_arm) + else + C.add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/broken_arm, slowdown = speed_left) + +/datum/status_effect/arm_slowdown/proc/on_hand_swap() + SIGNAL_HANDLER + spawn(0) // The SWAP_HANDS comsig fires before we actually change our active hand. + apply_to_mob() + +/datum/status_effect/arm_slowdown/nextmove_modifier() + var/mob/living/carbon/C = owner + + var/hand = C.get_active_hand().body_zone + if(hand) + if(hand == BODY_ZONE_R_ARM) + return speed_right + else + return speed_left + return 1 ///////////////////////// //////// WOUNDS ///////// diff --git a/code/datums/storage/storage.dm b/code/datums/storage/storage.dm index 037ce6e875dc..ca2fbf50ba3f 100644 --- a/code/datums/storage/storage.dm +++ b/code/datums/storage/storage.dm @@ -1,14 +1,25 @@ /** * Datumized Storage * Eliminates the need for custom signals specifically for the storage component, and attaches a storage variable (atom_storage) to every atom. - * The parent and real_location variables are both weakrefs, so they must be resolved before they can be used. * If you're looking to create custom storage type behaviors, check ../subtypes */ /datum/storage - /// the actual item we're attached to - var/datum/weakref/parent - /// the actual item we're storing in - var/datum/weakref/real_location + /** + * A reference to the atom linked to this storage object + * If the parent goes, we go. Will never be null. + */ + VAR_FINAL/atom/parent + /** + * A reference to the atom where the items are actually stored. + * By default this is parent. Should generally never be null. + * Sometimes it's not the parent, that's what is called "dissassociated storage". + * + * Do NOT set this directly, use set_real_location. + */ + VAR_PRIVATE/atom/real_location + + /// List of all the mobs currently viewing the contents of this storage. + VAR_PRIVATE/list/mob/is_using = list() /// if this is set, only items, and their children, will fit var/list/can_hold @@ -28,23 +39,21 @@ /// max combined weight classes the storage can hold var/max_total_storage = 14 - /// list of all the mobs currently viewing the contents - var/list/is_using = list() - var/locked = FALSE /// whether or not we should open when clicked var/attack_hand_interact = TRUE /// whether or not we allow storage objects of the same size inside var/allow_big_nesting = FALSE - /// should we be allowed to pickup an object by clicking it + /// If TRUE, we can click on items with the storage object to pick them up and insert them. var/allow_quick_gather = FALSE /// show we allow emptying all contents by using the storage object in hand var/allow_quick_empty = FALSE /// the mode for collection when allow_quick_gather is enabled var/collection_mode = COLLECT_ONE - /// shows what we can hold in examine text + /// An additional description shown on double-examine. + /// Is autogenerated to the can_hold list if not set. var/can_hold_description /// contents shouldn't be emped @@ -53,10 +62,15 @@ /// you put things *in* a bag, but *on* a plate var/insert_preposition = "in" - /// don't show any chat messages regarding inserting items + /// If TRUE, chat messages for inserting/removing items will not be shown. var/silent = FALSE - /// play a rustling sound when interacting with the bag - var/rustle_sound = TRUE + + /// Sound played when first opened. + var/open_sound = SFX_RUSTLE + /// Sound played when closed. + var/close_sound = null + /// Sound played when interacting with contents. + var/rustle_sound = SFX_RUSTLE /// alt click takes an item out instead of opening up storage var/quickdraw = FALSE @@ -79,56 +93,38 @@ var/screen_start_x = 4 var/screen_start_y = 2 - var/datum/weakref/modeswitch_action_ref - -/datum/storage/New(atom/parent, max_slots, max_specific_storage, max_total_storage, numerical_stacking, allow_quick_gather, allow_quick_empty, collection_mode, attack_hand_interact) - boxes = new(null, src) - closer = new(null, src) - - src.parent = WEAKREF(parent) - src.real_location = src.parent - src.max_slots = max_slots || src.max_slots - src.max_specific_storage = max_specific_storage || src.max_specific_storage - src.max_total_storage = max_total_storage || src.max_total_storage - src.numerical_stacking = numerical_stacking || src.numerical_stacking - src.allow_quick_gather = allow_quick_gather || src.allow_quick_gather - src.allow_quick_empty = allow_quick_empty || src.allow_quick_empty - src.collection_mode = collection_mode || src.collection_mode - src.attack_hand_interact = attack_hand_interact || src.attack_hand_interact - - var/atom/resolve_parent = src.parent?.resolve() - var/atom/resolve_location = src.real_location?.resolve() - - if(!resolve_parent) - stack_trace("storage could not resolve parent weakref") + var/datum/action/item_action/modeswitch_action + +/datum/storage/New( + atom/parent, + max_slots = src.max_slots, + max_specific_storage = src.max_specific_storage, + max_total_storage = src.max_total_storage, + numerical_stacking = src.numerical_stacking, + allow_quick_gather = src.allow_quick_gather, + allow_quick_empty = src.allow_quick_empty, + collection_mode = src.collection_mode, + attack_hand_interact = src.attack_hand_interact +) + if(!istype(parent)) + stack_trace("Storage datum ([type]) created without a [isnull(parent) ? "null parent" : "invalid parent ([parent.type])"]!") qdel(src) return - if(!resolve_location) - stack_trace("storage could not resolve location weakref") - qdel(src) - return - - RegisterSignal(resolve_parent, list(COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_HAND), PROC_REF(on_attack)) - RegisterSignal(resolve_parent, COMSIG_MOUSEDROP_ONTO, PROC_REF(on_mousedrop_onto)) - RegisterSignal(resolve_parent, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(on_mousedropped_onto)) - - RegisterSignal(resolve_parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) - RegisterSignal(resolve_parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) - RegisterSignal(resolve_parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_preattack)) - RegisterSignal(resolve_parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_deconstruct)) + boxes = new(null, null, src) + closer = new(null, null, src) - RegisterSignal(resolve_parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(mass_empty)) + set_parent(parent) + set_real_location(parent) - RegisterSignal(resolve_parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) - RegisterSignal(resolve_parent, COMSIG_PARENT_ATTACKBY_SECONDARY, PROC_REF(open_storage_attackby_secondary)) - - RegisterSignal(resolve_location, COMSIG_ATOM_ENTERED, PROC_REF(handle_enter)) - RegisterSignal(resolve_location, COMSIG_ATOM_EXITED, PROC_REF(handle_exit)) - RegisterSignal(resolve_parent, COMSIG_MOVABLE_MOVED, PROC_REF(close_distance)) - RegisterSignal(resolve_parent, COMSIG_ITEM_EQUIPPED, PROC_REF(update_actions)) - - RegisterSignal(resolve_parent, COMSIG_TOPIC, PROC_REF(topic_handle)) + src.max_slots = max_slots + src.max_specific_storage = max_specific_storage + src.max_total_storage = max_total_storage + src.numerical_stacking = numerical_stacking + src.allow_quick_gather = allow_quick_gather + src.allow_quick_empty = allow_quick_empty + src.collection_mode = collection_mode + src.attack_hand_interact = attack_hand_interact orient_to_hud() @@ -149,6 +145,27 @@ return ..() +/// Set the passed atom as the parent +/datum/storage/proc/set_parent(atom/new_parent) + PRIVATE_PROC(TRUE) + + ASSERT(isnull(parent)) + + parent = new_parent + // a few of theses should probably be on the real_location rather than the parent + RegisterSignal(parent, list(COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_ATTACK_HAND), PROC_REF(on_attack)) + RegisterSignal(parent, COMSIG_MOUSEDROP_ONTO, PROC_REF(on_mousedrop_onto)) + RegisterSignal(parent, COMSIG_MOUSEDROPPED_ONTO, PROC_REF(on_mousedropped_onto)) + RegisterSignal(parent, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_preattack)) + RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_deconstruct)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(mass_empty)) + RegisterSignal(parent, list(COMSIG_CLICK_ALT, COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_ATTACK_HAND_SECONDARY), PROC_REF(open_storage_on_signal)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY_SECONDARY, PROC_REF(open_storage_attackby_secondary)) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(close_distance)) + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(update_actions)) + /datum/storage/proc/on_deconstruct() SIGNAL_HANDLER @@ -161,16 +178,12 @@ if(!istype(arrived)) return - var/atom/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - resolve_parent.update_appearance(UPDATE_ICON_STATE) - arrived.item_flags |= IN_STORAGE refresh_views() arrived.on_enter_storage(src) + parent.update_appearance() + /// Automatically ran on all object removals: flag marking and view refreshing. /datum/storage/proc/handle_exit(datum/source, obj/item/gone) SIGNAL_HANDLER @@ -178,55 +191,46 @@ if(!istype(gone)) return - var/atom/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - resolve_parent.update_appearance(UPDATE_ICON_STATE) - gone.item_flags &= ~IN_STORAGE remove_and_refresh(gone) gone.on_exit_storage(src) + parent.update_appearance() + /** * Sets where items are physically being stored in the case it shouldn't be on the parent. * * @param atom/real the new real location of the datum * @param should_drop if TRUE, all the items in the old real location will be dropped */ -/datum/storage/proc/set_real_location(atom/real, should_drop = FALSE) - if(!real) - return +/datum/storage/proc/set_real_location(atom/new_real_loc, should_drop = FALSE) + if(!isnull(real_location)) + UnregisterSignal(real_location, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED, COMSIG_PARENT_QDELETING)) + real_location.flags_1 &= ~HAS_DISASSOCIATED_STORAGE_1 - var/atom/resolve_location = src.real_location?.resolve() - if(!resolve_location) - return + if(should_drop) + remove_all() - var/atom/resolve_parent = src.parent?.resolve() - if(!resolve_parent) + if(isnull(new_real_loc)) return - if(should_drop) - remove_all(get_turf(resolve_parent)) - - resolve_location.flags_1 &= ~HAS_DISASSOCIATED_STORAGE_1 - real.flags_1 |= HAS_DISASSOCIATED_STORAGE_1 + new_real_loc.flags_1 |= HAS_DISASSOCIATED_STORAGE_1 - UnregisterSignal(resolve_location, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED)) + RegisterSignal(new_real_loc, COMSIG_ATOM_ENTERED, PROC_REF(handle_enter)) + RegisterSignal(new_real_loc, COMSIG_ATOM_EXITED, PROC_REF(handle_exit)) + RegisterSignal(new_real_loc, COMSIG_PARENT_QDELETING, PROC_REF(real_location_gone)) - RegisterSignal(real, COMSIG_ATOM_ENTERED, PROC_REF(handle_enter)) - RegisterSignal(real, COMSIG_ATOM_EXITED, PROC_REF(handle_exit)) + real_location = new_real_loc - real_location = WEAKREF(real) +/// Getter for [real_location]. +/datum/storage/proc/get_real_location() + return real_location -/datum/storage/proc/topic_handle(datum/source, user, href_list) +/// Signal handler for when the real location is deleted. +/datum/storage/proc/real_location_gone(datum/source) SIGNAL_HANDLER - if(href_list["show_valid_pocket_items"]) - handle_show_valid_items(source, user) - -/datum/storage/proc/handle_show_valid_items(datum/source, user) - to_chat(user, span_notice("[source] can hold: [can_hold_description]")) + set_real_location(null) /// Almost 100% of the time the lists passed into set_holdable are reused for each instance /// Just fucking cache it 4head @@ -238,21 +242,21 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/set_holdable(list/can_hold_list = null, list/cant_hold_list = null) - if(!islist(can_hold_list)) + if(!islist(can_hold_list) && can_hold_list) can_hold_list = list(can_hold_list) - if(!islist(cant_hold_list)) + if(!islist(cant_hold_list) && cant_hold_list) cant_hold_list = list(cant_hold_list) can_hold_description = generate_hold_desc(can_hold_list) - if (can_hold_list) - var/unique_key = can_hold_list.Join("-") + if (length(can_hold_list)) + var/unique_key = json_encode(can_hold_list) if(!GLOB.cached_storage_typecaches[unique_key]) GLOB.cached_storage_typecaches[unique_key] = typecacheof(can_hold_list) can_hold = GLOB.cached_storage_typecaches[unique_key] - if (cant_hold_list != null) - var/unique_key = cant_hold_list.Join("-") + if (cant_hold_list) + var/unique_key = json_encode(cant_hold_list) if(!GLOB.cached_storage_typecaches[unique_key]) GLOB.cached_storage_typecaches[unique_key] = typecacheof(cant_hold_list) cant_hold = GLOB.cached_storage_typecaches[unique_key] @@ -261,8 +265,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/generate_hold_desc(can_hold_list) var/list/desc = list() - for(var/valid_type in can_hold_list) - var/obj/item/valid_item = valid_type + for(var/obj/item/valid_item as anything in can_hold_list) desc += "\a [initial(valid_item.name)]" return "\n\t[span_notice("[desc.Join("\n\t")]")]" @@ -271,21 +274,26 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/update_actions() SIGNAL_HANDLER - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) + if(!allow_quick_gather) + QDEL_NULL(modeswitch_action) return - if(!istype(resolve_parent) || !allow_quick_gather) - QDEL_NULL(modeswitch_action_ref) + if(!isnull(modeswitch_action)) return - var/datum/action/existing = modeswitch_action_ref?.resolve() - if(!QDELETED(existing)) + if(!isitem(parent)) return - var/datum/action/modeswitch_action = resolve_parent.add_item_action(/datum/action/item_action/storage_gather_mode) + var/obj/item/item_parent = parent + modeswitch_action = item_parent.add_item_action(/datum/action/item_action/storage_gather_mode) + RegisterSignal(modeswitch_action, COMSIG_ACTION_TRIGGER, PROC_REF(action_trigger)) - modeswitch_action_ref = WEAKREF(modeswitch_action) + RegisterSignal(modeswitch_action, COMSIG_PARENT_QDELETING, PROC_REF(action_gone)) + +/datum/storage/proc/action_gone(datum/source) + SIGNAL_HANDLER + + modeswitch_action = null /// Refreshes and item to be put back into the real world, out of storage. /datum/storage/proc/reset_item(obj/item/thing) @@ -304,52 +312,53 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param force bypass locked storage */ /datum/storage/proc/can_insert(obj/item/to_insert, mob/user, messages = TRUE, force = FALSE) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return + if(QDELETED(to_insert) || !isitem(to_insert)) + return FALSE - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return + if(to_insert.item_flags & ABSTRACT) + return FALSE + + if(parent.flags_1 & HOLOGRAM_1) + if(!(to_insert.flags_1 & HOLOGRAM_1)) + return FALSE + else if(to_insert.flags_1 & HOLOGRAM_1) + return FALSE + + if(user && !user.canUnequipItem(to_insert)) + return FALSE - if(!isitem(to_insert)) + if(!can_manipulate_contents(user, force, !messages)) return FALSE if(locked && !force) return FALSE - if((to_insert == resolve_parent) || (to_insert == real_location)) + if((to_insert == parent) || (to_insert == real_location)) return FALSE - if(to_insert.w_class > max_specific_storage && !is_type_in_typecache(to_insert, exception_hold)) + if(!check_weight_class(to_insert)) if(messages && user) - to_chat(user, span_warning("\The [to_insert] is too big for \the [resolve_parent]!")) + to_chat(user, span_warning("\The [to_insert] is too big for \the [parent]!")) return FALSE - if(resolve_location.contents.len >= max_slots) + if(!check_slots_full(to_insert)) if(messages && user) - to_chat(user, span_warning("\The [to_insert] can't fit into \the [resolve_parent]! Make some space!")) + to_chat(user, span_warning("\The [to_insert] can't fit into \the [parent]! Make some space!")) return FALSE - var/total_weight = to_insert.w_class - - for(var/obj/item/thing in resolve_location) - total_weight += thing.w_class - - if(total_weight > max_total_storage) + if(!check_total_weight(to_insert)) if(messages && user) - to_chat(user, span_warning("\The [to_insert] can't fit into \the [resolve_parent]! Make some space!")) + to_chat(user, span_warning("\The [to_insert] can't fit into \the [parent]! Make some space!")) return FALSE - if(length(can_hold)) - if(!is_type_in_typecache(to_insert, can_hold)) - if(messages && user) - to_chat(user, span_warning("\The [resolve_parent] cannot hold \the [to_insert]!")) - return FALSE + if(!check_typecache_for_item(to_insert)) + if(messages && user) + to_chat(user, span_warning("\The [parent] cannot hold \the [to_insert]!")) + return FALSE if(is_type_in_typecache(to_insert, cant_hold) || HAS_TRAIT(to_insert, TRAIT_NO_STORAGE_INSERT) || (can_hold_trait && !HAS_TRAIT(to_insert, can_hold_trait))) if(messages && user) - to_chat(user, span_warning("\The [resolve_parent] cannot hold \the [to_insert]!")) + to_chat(user, span_warning("\The [parent] cannot hold \the [to_insert]!")) return FALSE if(HAS_TRAIT(to_insert, TRAIT_NODROP)) @@ -357,20 +366,24 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) to_chat(user, span_warning("\The [to_insert] is stuck on your hand!")) return FALSE - var/datum/storage/biggerfish = resolve_parent.loc.atom_storage // this is valid if the container our resolve_parent is being held in is a storage item + var/datum/storage/biggerfish = parent.loc.atom_storage // this is valid if the container our parent is being held in is a storage item if(biggerfish && biggerfish.max_specific_storage < max_specific_storage) if(messages && user) - to_chat(user, span_warning("[to_insert] can't fit in [resolve_parent] while [resolve_parent.loc] is in the way!")) + to_chat(user, span_warning("[to_insert] can't fit in [parent] while [parent.loc] is in the way!")) return FALSE - if(istype(resolve_parent)) + if(isitem(parent)) + var/obj/item/item_parent = parent var/datum/storage/item_storage = to_insert.atom_storage - if((to_insert.w_class >= resolve_parent.w_class) && item_storage && !allow_big_nesting) + if((to_insert.w_class >= item_parent.w_class) && item_storage && !allow_big_nesting) if(messages && user) - to_chat(user, span_warning("[resolve_parent] cannot hold [to_insert] as it's a storage item of the same size!")) + to_chat(user, span_warning("[parent] cannot hold [to_insert] as it's a storage item of the same size!")) return FALSE + if(SEND_SIGNAL(src, COMSIG_STORAGE_CAN_INSERT, to_insert, user, messages, force) & STORAGE_NO_INSERT) + return FALSE + return TRUE /** @@ -383,17 +396,77 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param force bypass locked storage */ /datum/storage/proc/attempt_insert(obj/item/to_insert, mob/user, override = FALSE, force = FALSE) - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return FALSE + SHOULD_NOT_SLEEP(TRUE) if(!can_insert(to_insert, user, force = force)) return FALSE + // This ensures the item doesn't play its dropped sound. Also just cleaner than relying on the item doMove() override. + user?.temporarilyRemoveItemFromInventory(to_insert, TRUE) + to_insert.item_flags |= IN_STORAGE - to_insert.forceMove(resolve_location) + to_insert.forceMove(real_location) item_insertion_feedback(user, to_insert, override) - resolve_location.update_appearance() + real_location.update_appearance() + SEND_SIGNAL(src, COMSIG_STORAGE_INSERTED_ITEM, to_insert, user, override, force) + return TRUE + +/** + * Check to see if items can be added/removed. + * + * @param mob/living/user an optional user + * @param force will bypass most checks + * @param silent will surpress feedback messages + */ +/datum/storage/proc/can_manipulate_contents(mob/living/user, force, silent) + if(force) + return TRUE + if(locked) + return FALSE + + if(isitem(parent)) + var/obj/item/item_loc = parent + if(item_loc.item_flags & IN_STORAGE) + if(!silent && user) + to_chat(user, span_warning("You cannot manipulate an object inside of [parent] while it is within another object.")) + return FALSE + + return TRUE + +/// Checks if the item is allowed into storage based on it's weight class +/datum/storage/proc/check_weight_class(obj/item/to_insert) + if(to_insert.w_class > max_specific_storage && !is_type_in_typecache(to_insert, exception_hold)) + return FALSE + + return TRUE + +/// Checks if we have enough slots to allow the item inside. +/datum/storage/proc/check_slots_full(obj/item/to_insert) + if(real_location.contents.len >= max_slots) + return FALSE + + return TRUE + +/// Checks if the total weight would exceed our capacity when adding the item. +/datum/storage/proc/check_total_weight(obj/item/to_insert) + var/total_weight = to_insert.w_class + + for(var/obj/item/thing in real_location) + total_weight += thing.w_class + + if(total_weight > max_total_storage) + return FALSE + + return TRUE + +/// Checks if the item is in our can_hold list. +/datum/storage/proc/check_typecache_for_item(obj/item/to_insert) + if(!length(can_hold)) + return TRUE + + if(!is_type_in_typecache(to_insert, can_hold)) + return FALSE + return TRUE /** @@ -406,11 +479,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param datum/progressbar/progress the progressbar used to show the progress of the insertion */ /datum/storage/proc/handle_mass_pickup(mob/user, list/things, atom/thing_loc, list/rejections, datum/progressbar/progress) - var/obj/item/resolve_parent = parent?.resolve() - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_parent || !resolve_location) - return - for(var/obj/item/thing in things) things -= thing if(thing.loc != thing_loc) @@ -418,7 +486,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(thing.type in rejections) // To limit bag spamming: any given type only complains once continue if(!attempt_insert(thing, user, TRUE)) // Note can_be_inserted still makes noise when the answer is no - if(resolve_location.contents.len >= max_slots) + if(real_location.contents.len >= max_slots) break rejections += thing.type // therefore full bags are still a little spammy continue @@ -438,11 +506,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param override skip feedback, only do animation check */ /datum/storage/proc/item_insertion_feedback(mob/user, obj/item/thing, override = FALSE) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - resolve_parent.update_appearance(UPDATE_ICON_STATE) + parent.update_appearance(UPDATE_ICON_STATE) if(animated) animate_parent() @@ -454,17 +518,13 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return if(rustle_sound) - playsound(resolve_parent, SFX_RUSTLE, 50, TRUE, -5) + playsound(parent, rustle_sound, 50, TRUE, -5) - to_chat(user, span_notice("You put [thing] [insert_preposition]to [resolve_parent].")) + to_chat(user, span_notice("You put [thing] [insert_preposition]to [parent].")) for(var/mob/viewing in oviewers(user, null)) - if(in_range(user, viewing)) - viewing.show_message(span_notice("[user] puts [thing] [insert_preposition]to [resolve_parent]."), MSG_VISUAL) - return - if(thing && thing.w_class >= 3) - viewing.show_message(span_notice("[user] puts [thing] [insert_preposition]to [resolve_parent]."), MSG_VISUAL) - return + if(in_range(user, viewing) || (thing && thing.w_class >= 3)) + viewing.show_message(span_notice("[user] puts [thing] [insert_preposition]to [parent]."), MSG_VISUAL) /** * Attempts to remove an item from the storage @@ -472,23 +532,24 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param obj/item/thing the object we're removing * @param atom/newLoc where we're placing the item * @param silent if TRUE, we won't play any exit sounds + * @param user the mob performing the action */ -/datum/storage/proc/attempt_remove(obj/item/thing, atom/newLoc, silent = FALSE) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return +/datum/storage/proc/attempt_remove(obj/item/thing, atom/newLoc, silent = FALSE, mob/living/user) + SHOULD_NOT_SLEEP(TRUE) + + if(!can_manipulate_contents(user, silent = silent)) + return FALSE - if(istype(thing)) - if(ismob(resolve_parent.loc)) - var/mob/mobparent = resolve_parent.loc - thing.dropped(mobparent, TRUE) + if(istype(thing) && ismob(parent.loc)) + var/mob/mobparent = parent.loc + thing.dropped(mobparent, TRUE) if(newLoc) reset_item(thing) thing.forceMove(newLoc) if(rustle_sound && !silent) - playsound(resolve_parent, SFX_RUSTLE, 50, TRUE, -5) + playsound(parent, rustle_sound, 50, TRUE, -5) else thing.moveToNullspace() @@ -499,8 +560,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) refresh_views() - if(isobj(resolve_parent)) - resolve_parent.update_appearance() + if(isobj(parent)) + parent.update_appearance() return TRUE @@ -510,17 +571,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param atom/target where we're placing the item */ /datum/storage/proc/remove_all(atom/target) - var/obj/item/resolve_parent = parent?.resolve() - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_parent || !resolve_location) - return - if(!target) - target = get_turf(resolve_parent) + target = get_turf(parent) - for(var/obj/item/thing in resolve_location) - if(thing.loc != resolve_location) - continue + for(var/obj/item/thing in real_location) if(!attempt_remove(thing, target, silent = TRUE)) continue thing.pixel_x = thing.base_pixel_x + rand(-8, 8) @@ -538,17 +592,14 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param list/inserted a list passed to attempt_remove for ultimate removal */ /datum/storage/proc/remove_type(type, atom/destination, amount = INFINITY, check_adjacent = FALSE, force = FALSE, mob/user, list/inserted) - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return + // Make sure whoever is reaching, can reach. + if(!force && check_adjacent && (!user || !user.CanReach(destination) || !user.CanReach(real_location))) + return FALSE - if(!force) - if(check_adjacent) - if(!user || !user.CanReach(destination) || !user.CanReach(resolve_location)) - return FALSE - var/list/taking = typecache_filter_list(resolve_location.contents, typecacheof(type)) + var/list/taking = typecache_filter_list(real_location.contents, typecacheof(type)) if(taking.len > amount) taking.len = amount + if(inserted) //duplicated code for performance, don't bother checking retval/checking for list every item. for(var/i in taking) if(attempt_remove(i, destination)) @@ -577,12 +628,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(!islist(interface)) return FALSE - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - var/list/ret = list() - ret |= resolve_location.contents + ret |= real_location.contents if(recursive) for(var/i in ret.Copy()) var/atom/atom = i @@ -612,14 +659,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_emp_act(datum/source, severity) SIGNAL_HANDLER - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - if(emp_shielded) return - for(var/atom/thing in resolve_location) + for(var/atom/thing in real_location) thing.emp_act(severity) /// Signal handler for preattack from an object. @@ -646,9 +689,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param mob/user the user who is picking up the items */ /datum/storage/proc/collect_on_turf(obj/item/thing, mob/user) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return var/list/turf_things = thing.loc.contents.Copy() @@ -657,41 +697,29 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) var/amount = length(turf_things) if(!amount) - to_chat(user, span_warning("You failed to pick up anything with [resolve_parent]!")) + to_chat(user, span_warning("You failed to pick up anything with [parent]!")) return var/datum/progressbar/progress = new(user, amount, thing.loc) var/list/rejections = list() - while(do_after(user, resolve_parent, 1 SECONDS, NONE, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), user, turf_things, thing.loc, rejections, progress))) + while(do_after(user, parent, 1 SECONDS, NONE, FALSE, CALLBACK(src, PROC_REF(handle_mass_pickup), user, turf_things, thing.loc, rejections, progress))) stoplag(1) progress.end_progress() - to_chat(user, span_notice("You put everything you could [insert_preposition]to [resolve_parent].")) + to_chat(user, span_notice("You put everything you could [insert_preposition]to [parent].")) /// Signal handler for whenever we drag the storage somewhere. /datum/storage/proc/on_mousedrop_onto(datum/source, atom/over_object, mob/user) SIGNAL_HANDLER - var/obj/item/resolve_parent = parent?.resolve() - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_parent || !resolve_location) - return - if(ismecha(user.loc) || user.incapacitated() || !user.canUseStorage()) return - resolve_parent.add_fingerprint(user) + parent.add_fingerprint(user) - if(istype(over_object, /atom/movable/screen/inventory/hand)) - if(resolve_parent.loc != user) - return - - var/atom/movable/screen/inventory/hand/hand = over_object - user.putItemFromInventoryInHandIfPossible(resolve_parent, hand.held_index) - - else if(ismob(over_object)) + if(ismob(over_object)) if(over_object != user) return @@ -707,30 +735,26 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param mob/user the user who is dumping the contents */ /datum/storage/proc/dump_content_at(atom/dest_object, mob/user) - var/obj/item/resolve_parent = parent.resolve() - var/obj/item/resolve_location = real_location.resolve() - - if(locked) + if(locked || (dest_object == parent)) return - if(!user.CanReach(resolve_parent) || !user.CanReach(dest_object)) + + if(!user.CanReach(parent) || !user.CanReach(dest_object)) return - if(SEND_SIGNAL(dest_object, COMSIG_STORAGE_DUMP_CONTENT, resolve_location, user) & STORAGE_DUMP_HANDLED) + if(SEND_SIGNAL(dest_object, COMSIG_STORAGE_DUMP_CONTENT, real_location, user) & STORAGE_DUMP_HANDLED) return // Storage to storage transfer is instant if(dest_object.atom_storage) - to_chat(user, span_notice("You dump the contents of [resolve_parent] into [dest_object].")) + to_chat(user, span_notice("You dump the contents of [parent] into [dest_object].")) if(rustle_sound) - playsound(resolve_parent, SFX_RUSTLE, 50, TRUE, -5) + playsound(parent, rustle_sound, 50, TRUE, -5) - for(var/obj/item/to_dump in resolve_location) - if(to_dump.loc != resolve_location) - continue + for(var/obj/item/to_dump in real_location) dest_object.atom_storage.attempt_insert(to_dump, user) - resolve_parent.update_appearance() + parent.update_appearance() return var/atom/dump_loc = dest_object.get_dumping_location() @@ -738,7 +762,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return // Storage to loc transfer requires a do_after - to_chat(user, span_notice("You start dumping out the contents of [resolve_parent] onto [dest_object]...")) + to_chat(user, span_notice("You start dumping out the contents of [parent] onto [dest_object]...")) if(!do_after(user, dest_object, 2 SECONDS)) return @@ -748,10 +772,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_mousedropped_onto(datum/source, obj/item/dropping, mob/user) SIGNAL_HANDLER - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - if(!istype(dropping)) return if(dropping != user.get_active_held_item()) @@ -771,11 +791,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/on_attackby(datum/source, obj/item/thing, mob/user, params) SIGNAL_HANDLER - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - if(!thing.attackby_storage_insert(src, resolve_parent, user)) + if(!thing.attackby_storage_insert(src, parent, user)) return FALSE if(iscyborg(user)) @@ -785,42 +801,37 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return TRUE /// Signal handler for whenever we're attacked by a mob. -/datum/storage/proc/on_attack(datum/source, mob/user) +/datum/storage/proc/on_attack(datum/source, mob/user, list/modifiers) SIGNAL_HANDLER - - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return if(!attack_hand_interact) return - if(user.active_storage == src && resolve_parent.loc == user) + + if(user.active_storage == src && parent.loc == user) user.active_storage.hide_contents(user) hide_contents(user) return TRUE + if(ishuman(user)) var/mob/living/carbon/human/hum = user - if(hum.l_store == resolve_parent && !hum.get_active_held_item()) - INVOKE_ASYNC(hum, TYPE_PROC_REF(/mob, put_in_hands), resolve_parent) + if(hum.l_store == parent && !hum.get_active_held_item()) + INVOKE_ASYNC(hum, TYPE_PROC_REF(/mob, put_in_hands), parent) hum.l_store = null return - if(hum.r_store == resolve_parent && !hum.get_active_held_item()) - INVOKE_ASYNC(hum, TYPE_PROC_REF(/mob, put_in_hands), resolve_parent) + if(hum.r_store == parent && !hum.get_active_held_item()) + INVOKE_ASYNC(hum, TYPE_PROC_REF(/mob, put_in_hands), parent) hum.r_store = null return - if(resolve_parent.loc == user) - INVOKE_ASYNC(src, PROC_REF(open_storage), user) + if(parent.loc == user) + var/try_quickdraw = LAZYACCESS(modifiers, ALT_CLICK) + INVOKE_ASYNC(src, PROC_REF(open_storage), user, try_quickdraw) return TRUE /// Generates the numbers on an item in storage to show stacking. /datum/storage/proc/process_numerical_display() - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - var/list/toreturn = list() - for(var/obj/item/thing in resolve_location.contents) + for(var/obj/item/thing in real_location) var/total_amnt = 1 if(istype(thing, /obj/item/stack)) @@ -837,11 +848,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /// Updates the storage UI to fit all objects inside storage. /datum/storage/proc/orient_to_hud() - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - - var/adjusted_contents = resolve_location.contents.len + var/adjusted_contents = length(real_location.contents) //Numbered contents display var/list/datum/numbered_display/numbered_contents @@ -856,10 +863,6 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /// Generates the actual UI objects, their location, and alignments whenever we open storage up. /datum/storage/proc/orient_item_boxes(rows, cols, list/obj/item/numerical_display_contents) - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - boxes.screen_loc = "[screen_start_x]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y] to [screen_start_x+cols-1]:[screen_pixel_x],[screen_start_y+rows-1]:[screen_pixel_y]" var/current_x = screen_start_x var/current_y = screen_start_y @@ -883,7 +886,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) break else - for(var/obj/item in resolve_location) + for(var/obj/item/item in contents_for_display()) item.mouse_opacity = MOUSE_OPACITY_OPAQUE item.screen_loc = "[current_x]:[screen_pixel_x],[current_y]:[screen_pixel_y]" item.maptext = "" @@ -901,6 +904,10 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) closer.screen_loc = "[screen_start_x + cols]:[screen_pixel_x],[screen_start_y]:[screen_pixel_y]" +/// Returns a list of items to display in the hud +/datum/storage/proc/contents_for_display() + return real_location.contents + /// Signal handler for when we get attacked with secondary click by an item. /datum/storage/proc/open_storage_attackby_secondary(datum/source, atom/weapon, mob/user) SIGNAL_HANDLER @@ -915,21 +922,16 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) return COMPONENT_NO_AFTERATTACK /// Opens the storage to the mob, showing them the contents to their UI. -/datum/storage/proc/open_storage(mob/to_show) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return FALSE - - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return FALSE - +/datum/storage/proc/open_storage(mob/to_show, performing_quickdraw) if(isobserver(to_show)) - show_contents(to_show) + if(to_show.active_storage == src) + hide_contents(to_show) + else + show_contents(to_show) return FALSE - if(!to_show.CanReach(resolve_parent)) - resolve_parent.balloon_alert(to_show, "can't reach!") + if(!to_show.CanReach(parent)) + to_chat(to_show, span_warning("You cannot reach [parent].")) return FALSE if(!isliving(to_show) || to_show.incapacitated()) @@ -937,21 +939,21 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) if(locked) if(!silent) - resolve_parent.balloon_alert(to_show, "locked!") + to_chat(to_show, span_warning("[parent] won't open.")) return FALSE - if(!quickdraw || to_show.get_active_held_item()) + if(!(quickdraw && performing_quickdraw) || to_show.get_active_held_item()) show_contents(to_show) if(animated) animate_parent() - if(rustle_sound) - playsound(resolve_parent, SFX_RUSTLE, 50, TRUE, -5) + if(open_sound) + playsound(parent, open_sound, 50, TRUE, -5) return TRUE - var/obj/item/to_remove = locate() in resolve_location + var/obj/item/to_remove = get_quickdraw_item() if(!to_remove) return TRUE @@ -961,10 +963,14 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) INVOKE_ASYNC(src, PROC_REF(put_in_hands_async), to_show, to_remove) if(!silent) - to_show.visible_message(span_warning("[to_show] draws [to_remove] from [resolve_parent]!"), span_notice("You draw [to_remove] from [resolve_parent].")) + to_show.visible_message(span_warning("[to_show] draws [to_remove] from [parent]!"), span_notice("You draw [to_remove] from [parent].")) return TRUE +/// Returns an item to pull out with the quickdraw interaction. +/datum/storage/proc/get_quickdraw_item() + return locate(/obj/item) in real_location + /// Async version of putting something into a mobs hand. /datum/storage/proc/put_in_hands_async(mob/toshow, obj/item/toremove) if(!toshow.put_in_hands(toremove)) @@ -976,12 +982,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) /datum/storage/proc/close_distance(datum/source) SIGNAL_HANDLER - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - for(var/mob/user in can_see_contents()) - if (!user.CanReach(resolve_parent)) + if (!user.CanReach(parent)) hide_contents(user) /// Close the storage UI for everyone viewing us. @@ -1010,15 +1012,11 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param mob/toshow the mob to show the storage to */ /datum/storage/proc/show_contents(mob/toshow) - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - if(!toshow.client) return if(toshow.active_storage != src && (toshow.stat == CONSCIOUS)) - for(var/obj/item/thing in resolve_location) + for(var/obj/item/thing in real_location) if(thing.on_found(toshow)) toshow.active_storage.hide_contents(toshow) @@ -1027,8 +1025,8 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) toshow.active_storage = src - if(ismovable(resolve_location)) - var/atom/movable/movable_loc = resolve_location + if(ismovable(real_location)) + var/atom/movable/movable_loc = real_location movable_loc.become_active_storage(src) orient_to_hud() @@ -1037,7 +1035,7 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) toshow.client.screen |= boxes toshow.client.screen |= closer - toshow.client.screen |= resolve_location.contents + toshow.client.screen |= real_location.contents /** * Hide our storage from a mob. @@ -1045,24 +1043,24 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param mob/toshow the mob to hide the storage from */ /datum/storage/proc/hide_contents(mob/toshow) - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - if(!toshow.client) return TRUE + if(toshow.active_storage == src) toshow.active_storage = null - if(!length(is_using) && ismovable(resolve_location)) - var/atom/movable/movable_loc = resolve_location + if(!length(is_using) && ismovable(real_location)) + var/atom/movable/movable_loc = real_location movable_loc.lose_active_storage(src) is_using -= toshow toshow.client.screen -= boxes toshow.client.screen -= closer - toshow.client.screen -= resolve_location.contents + toshow.client.screen -= real_location.contents + + if(!length(is_using) && close_sound) + playsound(parent, close_sound, 50, TRUE, -5) /datum/storage/proc/action_trigger(datum/signal_source, datum/action/source) SIGNAL_HANDLER @@ -1076,24 +1074,18 @@ GLOBAL_LIST_EMPTY(cached_storage_typecaches) * @param mob/toshow the mob toggling us */ /datum/storage/proc/toggle_collection_mode(mob/user) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return collection_mode = (collection_mode+1)%3 + switch(collection_mode) if(COLLECT_SAME) - to_chat(user, span_notice("[resolve_parent] now picks up all items of a single type at once.")) + to_chat(user, span_notice("[parent] now picks up all items of a single type at once.")) if(COLLECT_EVERYTHING) - to_chat(user, span_notice("[resolve_parent] now picks up all items in a tile at once.")) + to_chat(user, span_notice("[parent] now picks up all items in a tile at once.")) if(COLLECT_ONE) - to_chat(user, span_notice("[resolve_parent] now picks up one item at a time.")) + to_chat(user, span_notice("[parent] now picks up one item at a time.")) /// Gives a spiffy animation to our parent to represent opening and closing. /datum/storage/proc/animate_parent() - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - animate(resolve_parent, time = 1.5, loop = 0, transform = matrix().Scale(1.07, 0.9)) + animate(parent, time = 1.5, loop = 0, transform = matrix().Scale(1.07, 0.9)) animate(time = 2, transform = null) diff --git a/code/datums/storage/subtypes/backpack.dm b/code/datums/storage/subtypes/backpack.dm new file mode 100644 index 000000000000..b72a4babcd67 --- /dev/null +++ b/code/datums/storage/subtypes/backpack.dm @@ -0,0 +1,2 @@ +/datum/storage/backpack + open_sound = 'sound/storage/unzip.ogg' diff --git a/code/datums/storage/subtypes/bag_of_holding.dm b/code/datums/storage/subtypes/bag_of_holding.dm index d1ad83f22828..6c86ad668160 100644 --- a/code/datums/storage/subtypes/bag_of_holding.dm +++ b/code/datums/storage/subtypes/bag_of_holding.dm @@ -1,10 +1,6 @@ /datum/storage/bag_of_holding/attempt_insert(obj/item/to_insert, mob/user, override, force) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - var/list/obj/item/storage/backpack/holding/matching = typecache_filter_list(to_insert.get_all_contents(), typecacheof(/obj/item/storage/backpack/holding)) - matching -= resolve_parent + matching -= parent if(istype(to_insert, /obj/item/storage/backpack/holding) || matching.len) INVOKE_ASYNC(src, PROC_REF(recursive_insertion), to_insert, user) @@ -13,15 +9,11 @@ return ..() /datum/storage/bag_of_holding/proc/recursive_insertion(obj/item/to_insert, mob/living/user) - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - var/safety = tgui_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 [to_insert.name]?", list("Proceed", "Abort")) - if(safety != "Proceed" || QDELETED(to_insert) || QDELETED(resolve_parent) || QDELETED(user) || !user.canUseTopic(resolve_parent, BE_CLOSE, iscarbon(user))) + if(safety != "Proceed" || QDELETED(to_insert) || QDELETED(parent) || QDELETED(user) || !iscarbon(user) || !user.canUseTopic(parent, USE_CLOSE|USE_DEXTERITY)) return - var/turf/loccheck = get_turf(resolve_parent) + var/turf/loccheck = get_turf(parent) to_chat(user, span_danger("The Bluespace interfaces of the two devices catastrophically malfunction!")) qdel(to_insert) playsound(loccheck,'sound/effects/supermatter.ogg', 200, TRUE) @@ -31,4 +23,4 @@ user.gib(TRUE, TRUE, TRUE) new/obj/boh_tear(loccheck) - qdel(resolve_parent) + qdel(parent) diff --git a/code/datums/storage/subtypes/box.dm b/code/datums/storage/subtypes/box.dm new file mode 100644 index 000000000000..9e3c94d064ad --- /dev/null +++ b/code/datums/storage/subtypes/box.dm @@ -0,0 +1,2 @@ +/datum/storage/box + open_sound = 'sound/storage/box.ogg' diff --git a/code/datums/storage/subtypes/cards.dm b/code/datums/storage/subtypes/cards.dm index 18f0d276bf9e..7adf5120b404 100644 --- a/code/datums/storage/subtypes/cards.dm +++ b/code/datums/storage/subtypes/cards.dm @@ -5,62 +5,38 @@ max_specific_storage = WEIGHT_CLASS_TINY max_slots = 30 max_total_storage = WEIGHT_CLASS_TINY * 30 - + /datum/storage/tcg/New() . = ..() set_holdable(list(/obj/item/tcgcard)) -/datum/storage/tcg/attempt_remove(silent = FALSE) +/datum/storage/tcg/attempt_remove(obj/item/thing, atom/newLoc, silent = FALSE, mob/living/user) . = ..() handle_empty_deck() /datum/storage/tcg/show_contents(mob/to_show) . = ..() - - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - to_show.visible_message(span_notice("[to_show] starts to look through the contents of \the [resolve_parent]!"), \ - span_notice("You begin looking into the contents of \the [resolve_parent]!")) + to_show.visible_message( + span_notice("[to_show] starts to look through the contents of \the [parent]!"), + span_notice("You begin looking into the contents of \the [parent]!") + ) /datum/storage/tcg/hide_contents() . = ..() - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - var/obj/item/resolve_location = real_location?.resolve() - if(!resolve_location) - return - - resolve_location.visible_message(span_notice("\the [resolve_parent] is shuffled after looking through it.")) - resolve_location.contents = shuffle(resolve_location.contents) + real_location.visible_message(span_notice("\the [parent] is shuffled after looking through it.")) + real_location.contents = shuffle(real_location.contents) /datum/storage/tcg/remove_all() . = ..() - - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - if(!resolve_parent.contents.len) - qdel(resolve_parent) + if(!parent.contents.len) + qdel(parent) /datum/storage/tcg/proc/handle_empty_deck() - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - - var/obj/item/resolve_location = real_location?.resolve() - if(!real_location) - return - //You can't have a deck of one card! - if(resolve_location.contents.len == 1) - var/obj/item/tcgcard_deck/deck = resolve_location - var/obj/item/tcgcard/card = resolve_location.contents[1] + if(real_location.contents.len == 1) + var/obj/item/tcgcard_deck/deck = real_location + var/obj/item/tcgcard/card = get_quickdraw_item() attempt_remove(card, card.drop_location()) card.flipped = deck.flipped card.update_icon_state() - qdel(resolve_parent) + qdel(parent) diff --git a/code/datums/storage/subtypes/cigarette_box.dm b/code/datums/storage/subtypes/cigarette_box.dm new file mode 100644 index 000000000000..2e869206a121 --- /dev/null +++ b/code/datums/storage/subtypes/cigarette_box.dm @@ -0,0 +1,3 @@ +/datum/storage/cigarette_box + open_sound = 'sound/storage/smallbox.ogg' + rustle_sound = null diff --git a/code/datums/storage/subtypes/extract_inventory.dm b/code/datums/storage/subtypes/extract_inventory.dm index 9dfc07bb23c3..8c563fca4652 100644 --- a/code/datums/storage/subtypes/extract_inventory.dm +++ b/code/datums/storage/subtypes/extract_inventory.dm @@ -5,37 +5,30 @@ attack_hand_interact = FALSE quickdraw = FALSE locked = TRUE - rustle_sound = FALSE + rustle_sound = null + open_sound = null + close_sound = null silent = TRUE /datum/storage/extract_inventory/New() . = ..() set_holdable(/obj/item/food/monkeycube) - var/obj/item/slimecross/reproductive/parentSlimeExtract = parent?.resolve() - if(!parentSlimeExtract) - return - - if(!istype(parentSlimeExtract, /obj/item/slimecross/reproductive)) - stack_trace("storage subtype extract_inventory incompatible with [parentSlimeExtract]") + if(!istype(parent, /obj/item/slimecross/reproductive)) + stack_trace("storage subtype extract_inventory incompatible with [parent.type]") qdel(src) /datum/storage/extract_inventory/proc/processCubes(mob/user) - var/obj/item/slimecross/reproductive/parentSlimeExtract = parent?.resolve() - if(!parentSlimeExtract) - return + message_admins(parent.contents.len) - message_admins(parentSlimeExtract.contents.len) - if(parentSlimeExtract.contents.len >= max_slots) - QDEL_LIST(parentSlimeExtract.contents) + if(parent.contents.len >= max_slots) + QDEL_LIST(parent.contents) createExtracts(user) /datum/storage/extract_inventory/proc/createExtracts(mob/user) - var/obj/item/slimecross/reproductive/parentSlimeExtract = parent?.resolve() - if(!parentSlimeExtract) - return - + var/obj/item/slimecross/reproductive/parentSlimeExtract = parent var/cores = rand(1,4) + playsound(parentSlimeExtract, 'sound/effects/splat.ogg', 40, TRUE) parentSlimeExtract.last_produce = world.time to_chat(user, span_notice("[parentSlimeExtract] briefly swells to a massive size, and expels [cores] extract[cores > 1 ? "s":""]!")) diff --git a/code/datums/storage/subtypes/holster.dm b/code/datums/storage/subtypes/holster.dm new file mode 100644 index 000000000000..1df56469e8ab --- /dev/null +++ b/code/datums/storage/subtypes/holster.dm @@ -0,0 +1,84 @@ +GLOBAL_LIST_EMPTY(cached_holster_typecaches) + +/// A type of storage where a number of slots are reserved for a specific type of item +/datum/storage/holster + insert_preposition = "in" + quickdraw = TRUE + rustle_sound = null + open_sound = null + close_sound = null + silent = TRUE + + /// A typecache of items that can be inserted into here in the reserved slots + var/list/holsterable + /// How many slots are reserved for the holster list + var/holster_slots = 1 + + var/list/holstered_items + +/// Checks if an item is in our holster list and we have room for it in there. +/datum/storage/holster/proc/can_holster_item(obj/item/to_insert) + if(LAZYLEN(holstered_items) < holster_slots) + if(is_type_in_typecache(to_insert, holsterable)) + return TRUE + + return FALSE + +/datum/storage/holster/check_weight_class(obj/item/to_insert) + if(can_holster_item(to_insert, real_location)) + return TRUE + + return ..() + +/datum/storage/holster/check_slots_full(obj/item/to_insert) + if(can_holster_item(to_insert, real_location)) + return TRUE + + return ..() + +/datum/storage/holster/check_typecache_for_item(obj/item/to_insert) + if(can_holster_item(to_insert, real_location)) + return TRUE + + return ..() + +/datum/storage/holster/check_total_weight(obj/item/to_insert) + var/total_weight = to_insert.w_class + + for(var/obj/item/thing in real_location) + if(thing in holstered_items) + continue + total_weight += thing.w_class + + if(total_weight > max_total_storage) + return FALSE + + return TRUE + +/datum/storage/holster/contents_for_display() + var/list/contents = real_location.contents - holstered_items + contents.Insert(1, holstered_items) + return contents + +/datum/storage/holster/get_quickdraw_item() + return (locate(/obj/item) in holstered_items) || ..() + +/datum/storage/holster/handle_enter(datum/source, obj/item/arrived) + . = ..() + + if(LAZYLEN(holstered_items) < holster_slots && is_type_in_typecache(arrived, holsterable)) + LAZYADD(holstered_items, arrived) + +/datum/storage/holster/handle_exit(datum/source, obj/item/gone) + . = ..() + + LAZYREMOVE(holstered_items, gone) + +/datum/storage/holster/proc/set_holsterable(list/new_holsterable) + if(!islist(new_holsterable)) + new_holsterable = list(new_holsterable) + + var/unique_key = json_encode(new_holsterable) + if(!GLOB.cached_holster_typecaches[unique_key]) + GLOB.cached_holster_typecaches[unique_key] = typecacheof(new_holsterable) + holsterable = GLOB.cached_holster_typecaches[unique_key] diff --git a/code/datums/storage/subtypes/latched_box.dm b/code/datums/storage/subtypes/latched_box.dm new file mode 100644 index 000000000000..2f531e417ca4 --- /dev/null +++ b/code/datums/storage/subtypes/latched_box.dm @@ -0,0 +1,2 @@ +/datum/storage/latched_box + open_sound = 'sound/storage/briefcase.ogg' diff --git a/code/datums/storage/subtypes/pill_bottle.dm b/code/datums/storage/subtypes/pill_bottle.dm new file mode 100644 index 000000000000..df0c3e105a51 --- /dev/null +++ b/code/datums/storage/subtypes/pill_bottle.dm @@ -0,0 +1,4 @@ +/datum/storage/pill_bottle + open_sound = 'sound/storage/pillbottle.ogg' + close_sound = null + rustle_sound = null diff --git a/code/datums/storage/subtypes/pockets.dm b/code/datums/storage/subtypes/pockets.dm index 60e470c4b534..8a32848c5ce5 100644 --- a/code/datums/storage/subtypes/pockets.dm +++ b/code/datums/storage/subtypes/pockets.dm @@ -2,24 +2,22 @@ max_slots = 2 max_specific_storage = WEIGHT_CLASS_SMALL max_total_storage = 50 - rustle_sound = FALSE + open_sound = null + rustle_sound = null + close_sound = null /datum/storage/pockets/attempt_insert(obj/item/to_insert, mob/user, override, force) . = ..() if(!.) return - var/obj/item/resolve_parent = parent?.resolve() - if(!resolve_parent) - return - if(!silent || override) return if(quickdraw) - to_chat(user, span_notice("You discreetly slip [to_insert] into [resolve_parent]. Right-click [resolve_parent] to remove it.")) + to_chat(user, span_notice("You discreetly slip [to_insert] into [parent]. Right-click [parent] to remove it.")) else - to_chat(user, span_notice("You discreetly slip [to_insert] into [resolve_parent].")) + to_chat(user, span_notice("You discreetly slip [to_insert] into [parent].")) /datum/storage/pockets/small max_slots = 1 @@ -94,7 +92,6 @@ /obj/item/clothing/mask/cigarette, /obj/item/lighter, /obj/item/match, - /obj/item/holochip, /obj/item/toy/crayon), list(/obj/item/screwdriver/power, /obj/item/ammo_casing/caseless/rocket, @@ -125,7 +122,6 @@ /obj/item/clothing/mask/cigarette, /obj/item/lighter, /obj/item/match, - /obj/item/holochip, /obj/item/toy/crayon, /obj/item/bikehorn), list(/obj/item/screwdriver/power, diff --git a/code/datums/storage/subtypes/toolbox.dm b/code/datums/storage/subtypes/toolbox.dm new file mode 100644 index 000000000000..6cae89bda6a6 --- /dev/null +++ b/code/datums/storage/subtypes/toolbox.dm @@ -0,0 +1,4 @@ +/datum/storage/toolbox + open_sound = 'sound/storage/toolbox.ogg' + close_sound = null + rustle_sound = null diff --git a/code/datums/verb_callbacks.dm b/code/datums/verb_callbacks.dm new file mode 100644 index 000000000000..563ac3ac4d4a --- /dev/null +++ b/code/datums/verb_callbacks.dm @@ -0,0 +1,29 @@ +///like normal callbacks but they also record their creation time for measurement purposes +///they also require the same usr/user that made the callback to both still exist and to still have a client in order to execute +/datum/callback/verb_callback + ///the tick this callback datum was created in. used for testing latency + var/creation_time = 0 + +/datum/callback/verb_callback/New(thingtocall, proctocall, ...) + creation_time = DS2TICKS(world.time) + . = ..() + +#ifndef UNIT_TESTS +/datum/callback/verb_callback/Invoke(...) + var/mob/our_user = user?.resolve() + if(QDELETED(our_user) || isnull(our_user.client)) + return + var/mob/temp = usr + . = ..() + usr = temp + +/datum/callback/verb_callback/InvokeAsync(...) + var/mob/our_user = user?.resolve() + if(QDELETED(our_user) || isnull(our_user.client)) + return + var/mob/temp = usr + . = ..() + usr = temp +#endif + + diff --git a/code/datums/view.dm b/code/datums/view.dm index e8b6c1cfe827..19ba66c39004 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -38,8 +38,8 @@ assertFormat() else resetFormat() - var/datum/hud/our_hud = chief?.mob?.hud_used - our_hud.view_audit_buttons() // Make sure our hud's buttons are in our new size + if(chief?.mob) + SEND_SIGNAL(chief.mob, COMSIG_VIEWDATA_UPDATE, getView()) /datum/view_data/proc/assertFormat()//T-Pose winset(chief, "mapwindow.map", "zoom=0") diff --git a/code/datums/voice_of_god_command.dm b/code/datums/voice_of_god_command.dm index 8479e684719e..fc138dd4af4c 100644 --- a/code/datums/voice_of_god_command.dm +++ b/code/datums/voice_of_god_command.dm @@ -150,7 +150,7 @@ GLOBAL_LIST_INIT(voice_of_god_commands, init_voice_of_god_commands()) for(var/mob/living/carbon/target in listeners) target.vomit(10 * power_multiplier, distance = power_multiplier, stun = FALSE) -/// This command silences the listeners. Thrice as effective is the user is a mime or curator. +/// This command silences the listeners. Thrice as effective is the user is a mime or archivist. /datum/voice_of_god_command/silence trigger = "shut\\s*up|silence|be\\s*silent|ssh|quiet|hush" cooldown = COOLDOWN_STUN diff --git a/code/datums/vote.dm b/code/datums/vote.dm new file mode 100644 index 000000000000..f69f680cb34e --- /dev/null +++ b/code/datums/vote.dm @@ -0,0 +1,214 @@ +/datum/vote + // Human readable name for this vote. + var/name = "" + // The vote options + var/list/options + // k:V list of option : vote_count + var/list/tally + // A list of winning vote options + var/list/winners + // The winner after the tie breaker + var/real_winner + // A k:V list of ckey : option_index + var/list/voters + // A list of ckeys that did not vote. + var/list/non_voters + // Has this vote concluded and been tallied? + var/finished = FALSE + +/datum/vote/New(list/options) + . = ..() + src.options = options || compile_options() + tally = list() + winners = list() + voters = list() + +/datum/vote/Destroy(force, ...) + tally = null + winners = null + voters = null + non_voters = null + options = null + return ..() + +/// Handy proc for building option lists +/datum/vote/proc/compile_options() + return list() + +/// Counts up the votes. +/datum/vote/proc/tally_votes() + if(finished) + return + // Mark end state + finished = TRUE + + // Set non-voters + non_voters = GLOB.directory.Copy() + non_voters -= voters + for (var/non_voter_ckey in non_voters) + var/client/C = non_voters[non_voter_ckey] + if (!C || C.is_afk()) + non_voters -= non_voter_ckey + + filter_votes() + + //get the highest number of votes + var/highest_score = 0 + var/total_score = 0 + + // Count up the scores + for(var/option in options) + var/option_score = tally[option] + total_score += option_score + if(option_score > highest_score) + highest_score = option_score + + // Find the winners + for(var/option in options) + if(tally[option] == highest_score) + winners += option + + real_winner = break_tie() + +/// Filters the votes. +/datum/vote/proc/filter_votes() + PROTECTED_PROC(TRUE) + return + +/// Break a tie between winners, returning the sole victor. +/datum/vote/proc/break_tie() + if(length(winners)) + return pick(winners) + +/// Checks if this vote can run. +/datum/vote/proc/can_run(admin) + return TRUE + +/// Anything to do after the vote has finished and been announced. +/datum/vote/proc/after_completion() + return + +/datum/vote/proc/try_vote(mob/user, vote) + if(!vote || vote < 1 || vote > options.len) + return FALSE + + if(!user || !user_can_vote(user)) + return FALSE + + // If user has already voted, remove their specific vote + if(voters[user.ckey]) + tally[options[voters[user.ckey]]]-- + + voters[user.ckey] = vote + + tally[options[vote]]++ + + return TRUE + +/datum/vote/proc/user_can_vote(mob/user) + if(CONFIG_GET(flag/no_dead_vote) && user.stat == DEAD && !user.client.holder) + return FALSE + return TRUE + +/// Custom votes, just for typechecking niceness +/datum/vote/custom + name = "Custom" + +/// Vote datum for changing the map +/datum/vote/change_map + name = "Change Map" + +/datum/vote/change_map/compile_options() + . = SSmapping.filter_map_options(global.config.maplist.Copy(), TRUE) + shuffle_inplace(.) + +/datum/vote/change_map/can_run(admin) + if(!admin && SSmapping.map_voted) + to_chat(usr, span_warning("The next map has already been selected.")) + return FALSE + return TRUE + +/datum/vote/change_map/filter_votes() + if(CONFIG_GET(flag/default_no_vote)) + return + + for (var/non_voter_ckey in non_voters) + var/client/C = non_voters[non_voter_ckey] + var/preferred_map = C.prefs.read_preference(/datum/preference/choiced/preferred_map) + if(isnull(global.config.defaultmap)) + continue + if(!(preferred_map in global.config.maplist)) + preferred_map = global.config.defaultmap.map_name + + tally[preferred_map] += 1 + +/datum/vote/change_map/after_completion() + if(isnull(real_winner)) + return + + SSmapping.changemap(global.config.maplist[real_winner]) + SSmapping.map_voted = TRUE + + +#define CONTINUE_PLAYING "Continue Playing" +#define INITIATE_TRANSFER "Initiate Transfer" + +/// Automatic vote for calling the shuttle +/datum/vote/crew_transfer + name = "Crew Transfer" + +/datum/vote/crew_transfer/compile_options() + return list(CONTINUE_PLAYING, INITIATE_TRANSFER) + +/datum/vote/crew_transfer/filter_votes() + tally[CONTINUE_PLAYING] += length(non_voters) + +/datum/vote/crew_transfer/after_completion() + if(!(real_winner == INITIATE_TRANSFER)) + return + + SSshuttle.autoEnd() + var/obj/machinery/computer/communications/C = locate() in INSTANCES_OF(/obj/machinery/computer/communications) + if(C) + C.post_status("shuttle") + +#undef CONTINUE_PLAYING +#undef INITIATE_TRANSFER + +#define CONTINUE_PLAYING "Continue Playing" +#define RESTART_ROUND "Restart Round" + +/// Vote for restarting the server +/datum/vote/restart + name = "Restart Server" + +/datum/vote/restart/can_run(admin) + return admin || !any_active_admins() + +/datum/vote/restart/compile_options() + return list(CONTINUE_PLAYING, RESTART_ROUND) + +/datum/vote/restart/filter_votes() + tally[CONTINUE_PLAYING] += length(non_voters) + +/datum/vote/restart/after_completion() + if(real_winner != RESTART_ROUND) + return + + if(!any_active_admins()) + // No delay in case the restart is due to lag + SSticker.Reboot("Restart vote successful.", "restart vote", 1) + else + to_chat(world, span_boldannounce("Notice: Restart vote will not restart the server automatically because there are active admins on.")) + message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.") + +/datum/vote/restart/proc/any_active_admins() + . = TRUE + for(var/client/C in GLOB.admins + GLOB.deadmins) + if(!C.is_afk() && check_rights_for(C, R_SERVER)) + return TRUE + +#undef CONTINUE_PLAYING +#undef RESTART_ROUND + + diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm index 78481a9eb93f..9fb7f3b7cdd5 100644 --- a/code/datums/weakrefs.dm +++ b/code/datums/weakrefs.dm @@ -1,8 +1,8 @@ /// Creates a weakref to the given input. /// See /datum/weakref's documentation for more information. /proc/WEAKREF(datum/input) - if(!QDELETED(input) && istype(input)) - if(istype(input, /datum/weakref)) + if(istype(input) && !QDELETED(input)) + if(isweakref(input)) return input if(!input.weak_reference) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index 3495bb5e03d2..4619c6f4a758 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -1,7 +1,7 @@ /** * Causes weather to occur on a z level in certain area types * - * The effects of weather occur across an entire z-level. For instance, lavaland has periodic ash storms that scorch most unprotected creatures. + * The effects of weather occur across an entire z-level. * Weather always occurs on different z levels at different times, regardless of weather type. * Can have custom durations, targets, and can automatically protect indoor areas. * @@ -59,11 +59,16 @@ /// Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. var/overlay_layer = AREA_LAYER /// Plane for the overlay - var/overlay_plane = ABOVE_LIGHTING_PLANE + var/overlay_plane = AREA_PLANE /// If the weather has no purpose other than looks var/aesthetic = FALSE /// Used by mobs (or movables containing mobs, such as enviro bags) to prevent them from being affected by the weather. var/immunity_type + /// If this bit of weather should also draw an overlay that's uneffected by lighting onto the area + /// Taken from weather_glow.dmi + var/use_glow = TRUE + /// List of all overlays to apply to our turfs + var/list/overlay_cache /// The stage of the weather, from 1-4 var/stage = END_STAGE @@ -91,35 +96,36 @@ * Calculates duration and hit areas, and makes a callback for the actual weather to start * */ -/datum/weather/proc/telegraph() +/datum/weather/proc/telegraph(get_to_the_good_part) if(stage == STARTUP_STAGE) return + SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_TELEGRAPH(type)) stage = STARTUP_STAGE + var/list/affectareas = list() for(var/V in get_areas(area_type)) affectareas += V + for(var/V in protected_areas) affectareas -= get_areas(V) + for(var/V in affectareas) var/area/A = V if(protect_indoors && !A.outdoors) continue if(A.z in impacted_z_levels) impacted_areas |= A + weather_duration = rand(weather_duration_lower, weather_duration_upper) SSweather.processing |= src update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(telegraph_message) - to_chat(player, telegraph_message) - if(telegraph_sound) - SEND_SOUND(player, sound(telegraph_sound)) - addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) + + if(get_to_the_good_part) + start() + else + send_alert(telegraph_message, telegraph_sound) + addtimer(CALLBACK(src, PROC_REF(start)), telegraph_duration) /** * Starts the actual weather and effects from it @@ -131,18 +137,13 @@ /datum/weather/proc/start() if(stage >= MAIN_STAGE) return + SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_START(type)) + stage = MAIN_STAGE update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(weather_message) - to_chat(player, weather_message) - if(weather_sound) - SEND_SOUND(player, sound(weather_sound)) + + send_alert(weather_message, weather_sound) if(!perpetual) addtimer(CALLBACK(src, PROC_REF(wind_down)), weather_duration) @@ -156,18 +157,13 @@ /datum/weather/proc/wind_down() if(stage >= WIND_DOWN_STAGE) return + SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_WINDDOWN(type)) stage = WIND_DOWN_STAGE + update_areas() - for(var/z_level in impacted_z_levels) - for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) - var/turf/mob_turf = get_turf(player) - if(!mob_turf) - continue - if(end_message) - to_chat(player, end_message) - if(end_sound) - SEND_SOUND(player, sound(end_sound)) + + send_alert(end_message, end_sound) addtimer(CALLBACK(src, PROC_REF(end)), end_duration) /** @@ -180,11 +176,30 @@ /datum/weather/proc/end() if(stage == END_STAGE) return + SEND_GLOBAL_SIGNAL(COMSIG_WEATHER_END(type)) stage = END_STAGE + SSweather.processing -= src update_areas() +/datum/weather/proc/send_alert(alert_msg, alert_sfx) + for(var/z_level in impacted_z_levels) + for(var/mob/player as anything in SSmobs.clients_by_zlevel[z_level]) + if(!can_get_alert(player)) + continue + + if(telegraph_message) + to_chat(player, alert_msg) + + if(telegraph_sound) + SEND_SOUND(player, sound(alert_sfx)) + +// the checks for if a mob should recieve alerts, returns TRUE if can +/datum/weather/proc/can_get_alert(mob/player) + var/turf/mob_turf = get_turf(player) + return !isnull(mob_turf) + /** * Returns TRUE if the living mob can be affected by the weather * @@ -224,23 +239,38 @@ * */ /datum/weather/proc/update_areas() - for(var/V in impacted_areas) - var/area/N = V - N.layer = overlay_layer - N.plane = overlay_plane - N.icon = 'icons/effects/weather_effects.dmi' - N.color = weather_color - switch(stage) - if(STARTUP_STAGE) - N.icon_state = telegraph_overlay - if(MAIN_STAGE) - N.icon_state = weather_overlay - if(WIND_DOWN_STAGE) - N.icon_state = end_overlay - if(END_STAGE) - N.color = null - N.icon_state = "" - N.icon = 'icons/area/areas_misc.dmi' - N.layer = initial(N.layer) - N.plane = initial(N.plane) - N.set_opacity(FALSE) + var/list/new_overlay_cache = generate_overlay_cache() + for(var/area/impacted as anything in impacted_areas) + if(length(overlay_cache)) + impacted.overlays -= overlay_cache + if(length(new_overlay_cache)) + impacted.overlays += new_overlay_cache + + overlay_cache = new_overlay_cache + +/// Returns a list of visual offset -> overlays to use +/datum/weather/proc/generate_overlay_cache() + // We're ending, so no overlays at all + if(stage == END_STAGE) + return list() + + var/weather_state = "" + switch(stage) + if(STARTUP_STAGE) + weather_state = telegraph_overlay + if(MAIN_STAGE) + weather_state = weather_overlay + if(WIND_DOWN_STAGE) + weather_state = end_overlay + + var/list/gen_overlay_cache = list() + if(use_glow) + var/mutable_appearance/glow_image = mutable_appearance('icons/effects/glow_weather.dmi', weather_state, overlay_layer, ABOVE_LIGHTING_PLANE, 100) + glow_image.color = weather_color + gen_overlay_cache += glow_image + + var/mutable_appearance/weather_image = mutable_appearance('icons/effects/weather_effects.dmi', weather_state, overlay_layer, plane = overlay_plane) + weather_image.color = weather_color + gen_overlay_cache += weather_image + + return gen_overlay_cache diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm deleted file mode 100644 index 07ca88982185..000000000000 --- a/code/datums/weather/weather_types/ash_storm.dm +++ /dev/null @@ -1,99 +0,0 @@ -//Ash storms happen frequently on lavaland. They heavily obscure vision, and cause high fire damage to anyone caught outside. -/datum/weather/ash_storm - name = "ash storm" - desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected." - - telegraph_message = "An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter." - telegraph_duration = 300 - telegraph_overlay = "light_ash" - - weather_message = "Smoldering clouds of scorching ash billow down around you! Get inside!" - weather_duration_lower = 600 - weather_duration_upper = 1200 - weather_overlay = "ash_storm" - - end_message = "The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now." - end_duration = 300 - end_overlay = "light_ash" - - area_type = /area - protect_indoors = TRUE - target_trait = ZTRAIT_ASHSTORM - - immunity_type = TRAIT_ASHSTORM_IMMUNE - - probability = 90 - - barometer_predictable = TRUE - var/list/weak_sounds = list() - var/list/strong_sounds = list() - -/datum/weather/ash_storm/telegraph() - var/list/eligible_areas = list() - for (var/z in impacted_z_levels) - eligible_areas += SSmapping.areas_in_z["[z]"] - for(var/i in 1 to eligible_areas.len) - var/area/place = eligible_areas[i] - if(place.outdoors) - weak_sounds[place] = /datum/looping_sound/weak_outside_ashstorm - strong_sounds[place] = /datum/looping_sound/active_outside_ashstorm - else - weak_sounds[place] = /datum/looping_sound/weak_inside_ashstorm - strong_sounds[place] = /datum/looping_sound/active_inside_ashstorm - CHECK_TICK - - //We modify this list instead of setting it to weak/stron sounds in order to preserve things that hold a reference to it - //It's essentially a playlist for a bunch of components that chose what sound to loop based on the area a player is in - GLOB.ash_storm_sounds += weak_sounds - return ..() - -/datum/weather/ash_storm/start() - GLOB.ash_storm_sounds -= weak_sounds - GLOB.ash_storm_sounds += strong_sounds - return ..() - -/datum/weather/ash_storm/wind_down() - GLOB.ash_storm_sounds -= strong_sounds - GLOB.ash_storm_sounds += weak_sounds - return ..() - -/datum/weather/ash_storm/end() - GLOB.ash_storm_sounds -= weak_sounds - return ..() - -/datum/weather/ash_storm/can_weather_act(mob/living/mob_to_check) - . = ..() - if(!. || !ishuman(mob_to_check)) - return - var/mob/living/carbon/human/human_to_check = mob_to_check - if(human_to_check.get_thermal_protection() >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) - return FALSE - -/datum/weather/ash_storm/weather_act(mob/living/victim) - victim.adjustFireLoss(4) - -/datum/weather/ash_storm/end() - . = ..() - for(var/turf/open/misc/asteroid/basalt/basalt as anything in GLOB.dug_up_basalt) - if(!(basalt.loc in impacted_areas) || !(basalt.z in impacted_z_levels)) - continue - GLOB.dug_up_basalt -= basalt - basalt.dug = FALSE - basalt.icon_state = "[basalt.base_icon_state]" - if(prob(basalt.floor_variance)) - basalt.icon_state += "[rand(0,12)]" - -//Emberfalls are the result of an ash storm passing by close to the playable area of lavaland. They have a 10% chance to trigger in place of an ash storm. -/datum/weather/ash_storm/emberfall - name = "emberfall" - desc = "A passing ash storm blankets the area in harmless embers." - - weather_message = "Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by..." - weather_overlay = "light_ash" - - end_message = "The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet." - end_sound = null - - aesthetic = TRUE - - probability = 10 diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm index 88b975ce3e4d..d535ae7906df 100644 --- a/code/datums/weather/weather_types/radiation_storm.dm +++ b/code/datums/weather/weather_types/radiation_storm.dm @@ -20,7 +20,7 @@ protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer, /area/station/ai_monitored/turret_protected/aisat/maint, /area/station/ai_monitored/command/storage/satellite, /area/station/ai_monitored/turret_protected/ai, /area/station/commons/storage/emergency/starboard, /area/station/commons/storage/emergency/port, - /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet, /area/icemoon/underground) + /area/shuttle, /area/station/security/prison/safe, /area/station/security/prison/toilet) target_trait = ZTRAIT_STATION immunity_type = TRAIT_RADSTORM_IMMUNE diff --git a/code/datums/weather/weather_types/snow_storm.dm b/code/datums/weather/weather_types/snow_storm.dm index db18fc5c9e2e..83e6b400509e 100644 --- a/code/datums/weather/weather_types/snow_storm.dm +++ b/code/datums/weather/weather_types/snow_storm.dm @@ -22,8 +22,30 @@ immunity_type = TRAIT_SNOWSTORM_IMMUNE barometer_predictable = TRUE - + use_glow = FALSE /datum/weather/snow_storm/weather_act(mob/living/L) L.adjust_bodytemperature(-rand(5,15)) +// since snowstorm is on a station z level, add extra checks to not annoy everyone +/datum/weather/snow_storm/can_get_alert(mob/player) + if(!..()) + return FALSE + + if(!is_station_level(player.z)) + return TRUE // bypass checks + + if(isobserver(player)) + return TRUE + + if(HAS_TRAIT(player, TRAIT_DETECT_STORM)) + return TRUE + + if(istype(get_area(player), /area/mine)) + return TRUE + + for(var/area/snow_area in impacted_areas) + if(locate(snow_area) in view(player)) + return TRUE + + return FALSE diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 8351da231b0b..71d39a560a4b 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -48,7 +48,7 @@ holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The charge light flickers.")) if(WIRE_AVOIDANCE) holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The external warning lights flash briefly.")) - flick("[mule.base_icon]1", mule) + z_flick("[mule.base_icon]1", mule) if(WIRE_LOADCHECK) holder.visible_message(span_notice("[icon2html(mule, viewers(holder))] The load platform clunks.")) if(WIRE_MOTOR1, WIRE_MOTOR2) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index c9a9d7410103..cbda9830708e 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -149,7 +149,7 @@ minor_announce(input["message"], "Incoming message from [input["message_sender"]]") message_admins("Receiving a message from [input["sender_ckey"]] at [input["source"]]") - for(var/obj/machinery/computer/communications/communications_console in GLOB.machines) + for(var/obj/machinery/computer/communications/communications_console as anything in INSTANCES_OF(/obj/machinery/computer/communications)) communications_console.override_cooldown() /datum/world_topic/news_report @@ -191,6 +191,7 @@ /datum/world_topic/status/Run(list/input) . = list() .["version"] = GLOB.game_version + .["mode"] = SSticker.get_mode_name() .["respawn"] = config ? !CONFIG_GET(flag/norespawn) : FALSE .["enter"] = !LAZYACCESS(SSlag_switch.measures, DISABLE_NON_OBSJOBS) .["ai"] = CONFIG_GET(flag/allow_ai) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index c5c8a72d4773..696f3b2f77d8 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -5,7 +5,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) for(var/K in alternate_appearances) var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] if(AA.appearance_key == key) - AA.remove_from_hud(src) + AA.remove_atom_from_hud(src) break /atom/proc/add_alt_appearance(type, key, ...) @@ -24,13 +24,16 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) var/transfer_overlays = FALSE /datum/atom_hud/alternate_appearance/New(key) + // We use hud_icons to register our hud, so we need to do this before the parent call + appearance_key = key + hud_icons = list(appearance_key) ..() GLOB.active_alternate_appearances += src appearance_key = key for(var/mob in GLOB.player_list) if(mobShouldSee(mob)) - add_hud_to(mob) + show_to(mob) /datum/atom_hud/alternate_appearance/Destroy() GLOB.active_alternate_appearances -= src @@ -38,18 +41,18 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M) if(mobShouldSee(M)) - add_hud_to(M) + show_to(M) /datum/atom_hud/alternate_appearance/proc/mobShouldSee(mob/M) return FALSE -/datum/atom_hud/alternate_appearance/add_to_hud(atom/A, image/I) +/datum/atom_hud/alternate_appearance/add_atom_to_hud(atom/A, image/I) . = ..() if(.) LAZYINITLIST(A.alternate_appearances) A.alternate_appearances[appearance_key] = src -/datum/atom_hud/alternate_appearance/remove_from_hud(atom/A) +/datum/atom_hud/alternate_appearance/remove_atom_from_hud(atom/A) . = ..() if(.) LAZYREMOVE(A.alternate_appearances, appearance_key) @@ -57,12 +60,25 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/proc/copy_overlays(atom/other, cut_old) return +/obj/alt_appearance_tester + name = "wrench" + desc = "A wrench with common uses. Can be found in your hand." + icon = 'icons/obj/tools.dmi' + icon_state = "wrench" + +/obj/alt_appearance_tester/Initialize(mapload) + . = ..() + var/image/I = image('icons/obj/tools.dmi', src, "wrench_brass") + I.layer = layer + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "gold_wrench", I) + //an alternate appearance that attaches a single image to a single atom /datum/atom_hud/alternate_appearance/basic var/atom/target var/image/image var/add_ghost_version = FALSE var/ghost_appearance + uses_global_hud_category = FALSE /datum/atom_hud/alternate_appearance/basic/New(key, image/I, options = AA_TARGET_SEE_APPEARANCE) ..() @@ -72,16 +88,23 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) if(transfer_overlays) I.copy_overlays(target) - hud_icons = list(appearance_key) - add_to_hud(target, I) + add_atom_to_hud(target) + target.set_hud_image_active(appearance_key, exclusive_hud = src) + if((options & AA_TARGET_SEE_APPEARANCE) && ismob(target)) - add_hud_to(target) + show_to(target) + if(add_ghost_version) var/image/ghost_image = image(icon = I.icon , icon_state = I.icon_state, loc = I.loc) ghost_image.override = FALSE ghost_image.alpha = 128 ghost_appearance = new /datum/atom_hud/alternate_appearance/basic/observers(key + "_observer", ghost_image, NONE) + if(ismovable(target)) + var/atom/movable/AM = target + if(AM.bound_overlay) + mimic(AM.bound_overlay) + /datum/atom_hud/alternate_appearance/basic/Destroy() . = ..() QDEL_NULL(image) @@ -89,26 +112,38 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) if(ghost_appearance) QDEL_NULL(ghost_appearance) -/datum/atom_hud/alternate_appearance/basic/add_to_hud(atom/A) +/datum/atom_hud/alternate_appearance/basic/proc/mimic(atom/movable/openspace/mimic/mimic) + var/image/mimic_image = image(image.icon, mimic, image.icon_state, image.layer) + mimic_image.plane = image.plane + var/datum/atom_hud/alternate_appearance/basic/mimic_appearance = new type(appearance_key, mimic_image) + return mimic_appearance + +/datum/atom_hud/alternate_appearance/basic/add_atom_to_hud(atom/A) LAZYINITLIST(A.hud_list) A.hud_list[appearance_key] = image . = ..() -/datum/atom_hud/alternate_appearance/basic/remove_from_hud(atom/A) +/datum/atom_hud/alternate_appearance/basic/remove_atom_from_hud(atom/A) . = ..() A.hud_list -= appearance_key + A.set_hud_image_inactive(appearance_key) if(. && !QDELETED(src)) qdel(src) /datum/atom_hud/alternate_appearance/basic/copy_overlays(atom/other, cut_old) image.copy_overlays(other, cut_old) -/datum/atom_hud/alternate_appearance/basic/everyone +/datum/atom_hud/alternate_appearance/basic/living add_ghost_version = TRUE -/datum/atom_hud/alternate_appearance/basic/everyone/mobShouldSee(mob/M) +/datum/atom_hud/alternate_appearance/basic/living/mobShouldSee(mob/M) return !isdead(M) +/datum/atom_hud/alternate_appearance/basic/everyone + +/datum/atom_hud/alternate_appearance/basic/everyone/mobShouldSee(mob/M) + return TRUE + /datum/atom_hud/alternate_appearance/basic/silicons /datum/atom_hud/alternate_appearance/basic/silicons/mobShouldSee(mob/M) @@ -159,4 +194,8 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) ..(key, I, FALSE) seer = M +/datum/atom_hud/alternate_appearance/basic/one_person/mimic(atom/movable/openspace/mimic/mimic) + var/datum/atom_hud/alternate_appearance/basic/one_person/alt_appearance = ..() + alt_appearance.seer = seer + /datum/atom_hud/alternate_appearance/basic/food_demands diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index eef0a93cb6c1..5feba7733a92 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -13,8 +13,19 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT invisibility = INVISIBILITY_LIGHTING + /// List of all turfs currently inside this area. Acts as a filtered bersion of area.contents + /// For faster lookup (area.contents is actually a filtered loop over world) + /// Semi fragile, but it prevents stupid so I think it's worth it + var/list/turf/contained_turfs = list() + /// Contained turfs is a MASSIVE list, so rather then adding/removing from it each time we have a problem turf + /// We should instead store a list of turfs to REMOVE from it, then hook into a getter for it + /// There is a risk of this and contained_turfs leaking, so a subsystem will run it down to 0 incrementally if it gets too large + var/list/turf/turfs_to_uncontain = list() + var/area_flags = VALID_TERRITORY | BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + var/holomap_color = null + ///A var for whether the area allows for detecting fires/etc. Disabled or enabled at a fire alarm. var/fire_detect = TRUE ///A list of all fire locks in this area and on the border of this area. @@ -38,19 +49,15 @@ /// If a room is too big it doesn't have beauty. var/beauty_threshold = 150 - /// 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) + /// Used by ghosts to grant new powers. See /datum/component/spook_factor + var/spook_level + + /// For space, the asteroid, etc. Used with blueprints or with weather to determine if we are adding a new area (vs editing a station room) var/outdoors = FALSE /// Size of the area in open turfs, only calculated for indoors areas. var/areasize = 0 - /// Bonus mood for being in this area - var/mood_bonus = 0 - /// Mood message for being here, only shows up if mood_bonus != 0 - var/mood_message = "This area is pretty nice!" - /// Does the mood bonus require a trait? - var/mood_trait - ///Will objects this area be needing power? var/requires_power = TRUE /// This gets overridden to 1 for space in area/. @@ -74,7 +81,7 @@ ///The background droning loop that plays 24/7 var/ambient_buzz = 'sound/ambience/shipambience.ogg' ///The volume of the ambient buzz - var/ambient_buzz_vol = 35 + var/ambient_buzz_vol = 50 ///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 @@ -95,11 +102,6 @@ ///This datum, if set, allows terrain generation behavior to be ran on Initialize() var/datum/map_generator/map_generator - /// Default network root for this area aka station, lavaland, etc - var/network_root_id = null - /// Area network id when you want to find all devices hooked up to this area - var/network_area_id = null - ///Used to decide what kind of reverb the area makes sound have var/sound_environment = SOUND_ENVIRONMENT_NONE @@ -126,20 +128,16 @@ GLOBAL_LIST_EMPTY(teleportlocs) * The returned list of turfs is sorted by name */ /proc/process_teleport_locs() - for(var/V in GLOB.sortedAreas) - var/area/AR = V + for(var/area/AR in get_sorted_areas()) if(istype(AR, /area/shuttle) || AR.area_flags & NOTELEPORT) continue if(GLOB.teleportlocs[AR.name]) continue - if (!AR.contents.len) + if (!AR.has_contained_turfs()) continue - var/turf/picked = AR.contents[1] - if (picked && is_station_level(picked.z)) + if (is_station_level(AR.z)) GLOB.teleportlocs[AR.name] = AR - sortTim(GLOB.teleportlocs, GLOBAL_PROC_REF(cmp_text_asc)) - /** * Called when an area loads * @@ -150,6 +148,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) // rather than waiting for atoms to initialize. if (area_flags & UNIQUE_AREA) GLOB.areas_by_type[type] = src + GLOB.areas += src power_usage = new /list(AREA_USAGE_LEN) // Some atoms would like to use power in Initialize() alarm_manager = new(src) //Just in case. Apparently. return ..() @@ -163,37 +162,33 @@ GLOBAL_LIST_EMPTY(teleportlocs) * returns INITIALIZE_HINT_LATELOAD */ /area/Initialize(mapload) - icon_state = "" + icon = null if(!ambientsounds) ambientsounds = GLOB.ambience_assoc[ambience_index] if((area_flags & AREA_USES_STARLIGHT) && CONFIG_GET(flag/starlight)) base_lighting_alpha = 0 base_lighting_color = null - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC - if(requires_power) - luminosity = 0 - else + if(!requires_power) power_light = TRUE power_equip = TRUE power_environ = TRUE - if(static_lighting) + switch(area_lighting) + if(AREA_LIGHTING_DYNAMIC) luminosity = 0 - . = ..() + if(AREA_LIGHTING_STATIC) + if(isnull(base_lighting_color) || base_lighting_alpha == 0) + stack_trace("Area of type [type] is set to be statically lit, but has invalid base lighting data. This has been automatically replaced with fullbright.") + base_lighting_color = COLOR_WHITE + base_lighting_alpha = 255 - if(!static_lighting) - blend_mode = BLEND_MULTIPLY + . = ..() reg_in_areas_in_z() - - if(!mapload) - if(!network_root_id) - network_root_id = STATION_NETWORK_ROOT // default to station root because this might be created with a blueprint - SSnetworks.assign_area_network_id(src) - update_base_lighting() return INITIALIZE_HINT_LATELOAD @@ -211,15 +206,33 @@ GLOBAL_LIST_EMPTY(teleportlocs) var/list/turfs = list() for(var/turf/T in contents) turfs += T - map_generator.generate_terrain(turfs) + map_generator.generate_terrain(turfs, src) /area/proc/test_gen() if(map_generator) var/list/turfs = list() for(var/turf/T in contents) turfs += T - map_generator.generate_terrain(turfs) - + map_generator.generate_terrain(turfs, src) + +/area/proc/get_contained_turfs() + if(length(turfs_to_uncontain)) + cannonize_contained_turfs() + return contained_turfs + +/// Ensures that the contained_turfs list properly represents the turfs actually inside us +/area/proc/cannonize_contained_turfs() + // This is massively suboptimal for LARGE removal lists + // Try and keep the mass removal as low as you can. We'll do this by ensuring + // We only actually add to contained turfs after large changes (Also the management subsystem) + // Do your damndest to keep turfs out of /area/space as a stepping stone + // That sucker gets HUGE and will make this take actual tens of seconds if you stuff turfs_to_uncontain + contained_turfs -= turfs_to_uncontain + turfs_to_uncontain = list() + +/// Returns TRUE if we have contained turfs, FALSE otherwise +/area/proc/has_contained_turfs() + return length(contained_turfs) - length(turfs_to_uncontain) > 0 /** * Register this area as belonging to a z level @@ -227,7 +240,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) * Ensures the item is added to the SSmapping.areas_in_z list for this z */ /area/proc/reg_in_areas_in_z() - if(!length(contents)) + if(!has_contained_turfs()) return var/list/areas_in_z = SSmapping.areas_in_z update_areasize() @@ -282,23 +295,6 @@ GLOBAL_LIST_EMPTY(teleportlocs) for(var/obj/machinery/door/door in src) close_and_lock_door(door) -/** - * Update the icon state of the area - * - * Im not sure what the heck this does, somethign to do with weather being able to set icon - * states on areas?? where the heck would that even display? - */ -/area/update_icon_state() - var/weather_icon - for(var/V in SSweather.processing) - var/datum/weather/W = V - if(W.stage != END_STAGE && (src in W.impacted_areas)) - W.update_areas() - weather_icon = TRUE - if(!weather_icon) - icon_state = null - return ..() - /** * Update the icon of the area (overridden to always be null for space */ @@ -398,53 +394,27 @@ GLOBAL_LIST_EMPTY(teleportlocs) * If the area has ambience, then it plays some ambience music to the ambience channel */ /area/Entered(atom/movable/arrived, area/old_area) + SHOULD_CALL_PARENT(FALSE) set waitfor = FALSE SEND_SIGNAL(src, COMSIG_AREA_ENTERED, arrived, old_area) + if(ismob(arrived)) + var/mob/M = arrived + M.update_ambience_area(src) + if(!arrived.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE]) return + for(var/atom/movable/recipient as anything in arrived.important_recursive_contents[RECURSIVE_CONTENTS_AREA_SENSITIVE]) SEND_SIGNAL(recipient, COMSIG_ENTER_AREA, src) - if(!isliving(arrived)) - return - - var/mob/living/L = arrived - if(!L.ckey) - return - - if(old_area) - L.UnregisterSignal(old_area, COMSIG_AREA_POWER_CHANGE) - L.RegisterSignal(src, COMSIG_AREA_POWER_CHANGE, TYPE_PROC_REF(/mob, refresh_looping_ambience)) - - if(ambient_buzz != old_area.ambient_buzz) - L.refresh_looping_ambience() - -///Tries to play looping ambience to the mobs. -/mob/proc/refresh_looping_ambience() - SIGNAL_HANDLER - - var/area/my_area = get_area(src) - - if(!(client?.prefs.toggles & SOUND_SHIP_AMBIENCE) || !my_area.ambient_buzz) - SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) - return - - //Station ambience is dependant on a functioning and charged APC. (Lavaland always has it's ambience.) - if(!is_mining_level(my_area.z) && ((!my_area.apc || !my_area.apc.operating || !my_area.apc.cell?.charge && my_area.requires_power))) - SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) - return - - else - SEND_SOUND(src, sound(my_area.ambient_buzz, repeat = 1, wait = 0, volume = my_area.ambient_buzz_vol, channel = CHANNEL_BUZZ)) - - /** * Called when an atom exits an area * * Sends signals COMSIG_AREA_EXITED and COMSIG_EXIT_AREA (to a list of atoms) */ /area/Exited(atom/movable/gone, direction) + SHOULD_CALL_PARENT(FALSE) SEND_SIGNAL(src, COMSIG_AREA_EXITED, gone, direction) if(!gone.important_recursive_contents?[RECURSIVE_CONTENTS_AREA_SENSITIVE]) @@ -475,7 +445,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) always_unpowered = FALSE area_flags &= ~VALID_TERRITORY area_flags &= ~BLOBS_ALLOWED - addSorted() + require_area_resort() /** * Set the area size of the area * @@ -486,7 +456,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(outdoors) return FALSE areasize = 0 - for(var/turf/open/T in contents) + for(var/turf/open/T in get_contained_turfs()) areasize++ /** @@ -517,3 +487,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) for(var/datum/listener in airalarms + firealarms + firedoors) SEND_SIGNAL(listener, COMSIG_FIRE_ALERT, code) + +/// Adjusts the spook level and sends out a signal +/area/proc/adjust_spook_level(adj) + var/old = spook_level + spook_level += adj + SEND_SIGNAL(src, AREA_SPOOK_LEVEL_CHANGED, src, old) diff --git a/code/game/area/areas/ai_monitored.dm b/code/game/area/areas/ai_monitored.dm index 19a3e5054731..c38027086c10 100644 --- a/code/game/area/areas/ai_monitored.dm +++ b/code/game/area/areas/ai_monitored.dm @@ -4,6 +4,7 @@ /area/station/ai_monitored /area/station/ai_monitored/turret_protected + holomap_color = HOLOMAP_AREACOLOR_COMMAND // AI /area/station/ai_monitored @@ -14,6 +15,7 @@ name = "\improper AI Satellite Exterior" icon_state = "ai" airlock_wires = /datum/wires/airlock/ai + holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/station/ai_monitored/command/storage/satellite name = "\improper AI Satellite Maint" @@ -52,6 +54,7 @@ name = "\improper AI Satellite" icon_state = "ai" sound_environment = SOUND_ENVIRONMENT_ROOM + holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/station/ai_monitored/turret_protected/aisat/atmos name = "\improper AI Satellite Atmos" @@ -89,6 +92,9 @@ // Station specific ai monitored rooms, move here for consistenancy //Command - AI Monitored +/area/station/ai_monitored/command + holomap_color = HOLOMAP_AREACOLOR_COMMAND + /area/station/ai_monitored/command/storage/eva name = "EVA Storage" icon_state = "eva" @@ -103,6 +109,9 @@ airlock_wires = /datum/wires/airlock/command //Security - AI Monitored +/area/station/ai_monitored/security + holomap_color = HOLOMAP_AREACOLOR_SECURITY + /area/station/ai_monitored/security/armory name = "\improper Armory" icon_state = "armory" diff --git a/code/game/area/areas/away_content.dm b/code/game/area/areas/away_content.dm index 5841f744ecd6..c3fe792c6a5b 100644 --- a/code/game/area/areas/away_content.dm +++ b/code/game/area/areas/away_content.dm @@ -16,8 +16,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" /area/awaymission/beach name = "Beach" icon_state = "away" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC base_lighting_color = "#FFFFCC" requires_power = FALSE has_gravity = STANDARD_GRAVITY @@ -25,8 +24,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" /area/awaymission/errorroom name = "Super Secret Room" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC has_gravity = STANDARD_GRAVITY @@ -43,12 +41,10 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30" has_gravity = FALSE /area/awaymission/secret/fullbright - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/awaymission/secret/powered requires_power = FALSE /area/awaymission/secret/powered/fullbright - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 01e5282c48c6..b342bdce0a00 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -14,7 +14,7 @@ The areas used here are STRICTLY on the CC Z level. name = "CentCom" icon = 'icons/area/areas_centcom.dmi' icon_state = "centcom" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = FALSE has_gravity = STANDARD_GRAVITY area_flags = UNIQUE_AREA | NOTELEPORT @@ -87,8 +87,7 @@ The areas used here are STRICTLY on the CC Z level. /area/centcom/central_command_areas/supplypod name = "Supplypod Facility" icon_state = "supplypod" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/centcom/central_command_areas/supplypod/pod_storage name = "Supplypod Storage" @@ -131,7 +130,7 @@ The areas used here are STRICTLY on the CC Z level. /area/centcom/tdome name = "Thunderdome" icon_state = "thunder" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = FALSE has_gravity = STANDARD_GRAVITY flags_1 = NONE @@ -139,14 +138,12 @@ The areas used here are STRICTLY on the CC Z level. /area/centcom/tdome/arena name = "Thunderdome Arena" icon_state = "thunder" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/centcom/tdome/arena_source name = "Thunderdome Arena Template" icon_state = "thunder" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/centcom/tdome/tdome1 name = "Thunderdome (Team 1)" @@ -171,12 +168,11 @@ The areas used here are STRICTLY on the CC Z level. /area/centcom/wizard_station name = "Wizard's Den" icon_state = "wizards_den" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = FALSE has_gravity = STANDARD_GRAVITY area_flags = UNIQUE_AREA | NOTELEPORT flags_1 = NONE - network_root_id = "MAGIC_NET" //Abductors /area/centcom/abductor_ship @@ -184,11 +180,9 @@ The areas used here are STRICTLY on the CC Z level. icon_state = "abductor_ship" requires_power = FALSE area_flags = UNIQUE_AREA | NOTELEPORT - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC has_gravity = STANDARD_GRAVITY flags_1 = NONE - network_root_id = "ALIENS" //Syndicates /area/centcom/syndicate_mothership @@ -199,35 +193,34 @@ The areas used here are STRICTLY on the CC Z level. area_flags = UNIQUE_AREA | NOTELEPORT flags_1 = NONE ambience_index = AMBIENCE_DANGER - network_root_id = SYNDICATE_NETWORK_ROOT /area/centcom/syndicate_mothership/control name = "Syndicate Control Room" icon_state = "syndie-control" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/centcom/syndicate_mothership/expansion_bombthreat name = "Syndicate Ordnance Laboratory" icon_state = "syndie-elite" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambience_index = AMBIENCE_ENGI /area/centcom/syndicate_mothership/expansion_bioterrorism name = "Syndicate Bio-Weapon Laboratory" icon_state = "syndie-elite" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambience_index = AMBIENCE_MEDICAL /area/centcom/syndicate_mothership/expansion_chemicalwarfare name = "Syndicate Chemical Weapon Manufacturing Plant" icon_state = "syndie-elite" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambience_index = AMBIENCE_REEBE /area/centcom/syndicate_mothership/expansion_fridgerummage name = "Syndicate Perishables and Foodstuffs Storage" icon_state = "syndie-elite" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/centcom/syndicate_mothership/elite_squad name = "Syndicate Elite Squad" @@ -238,8 +231,7 @@ The areas used here are STRICTLY on the CC Z level. name = "Capture the Flag" icon_state = "ctf" requires_power = FALSE - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC has_gravity = STANDARD_GRAVITY flags_1 = NONE @@ -293,7 +285,7 @@ The areas used here are STRICTLY on the CC Z level. max_ambience_cooldown = 220 SECONDS /area/centcom/asteroid/nearstation - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambience_index = AMBIENCE_RUINS always_unpowered = FALSE requires_power = TRUE diff --git a/code/game/area/areas/holodeck.dm b/code/game/area/areas/holodeck.dm index ecd728e78316..b1f923ff30c4 100644 --- a/code/game/area/areas/holodeck.dm +++ b/code/game/area/areas/holodeck.dm @@ -2,15 +2,14 @@ name = "Holodeck" icon = 'icons/area/areas_station.dmi' icon_state = "Holodeck" - static_lighting = FALSE + area_lighting = AREA_LIGHTING_STATIC - base_lighting_alpha = 255 flags_1 = NONE sound_environment = SOUND_ENVIRONMENT_PADDED_CELL + holomap_color = HOLOMAP_AREACOLOR_GENERIC_ROOM var/obj/machinery/computer/holodeck/linked var/restricted = FALSE // if true, program goes on emag list - network_root_id = "HOLODECK" /* Power tracking: Use the holodeck computer's power grid Asserts are to avoid the inevitable infinite loops diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 6bc02db9969b..0886a214278d 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -6,6 +6,7 @@ has_gravity = STANDARD_GRAVITY area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | CULT_PERMITTED ambient_buzz = 'sound/ambience/magma.ogg' + ambient_buzz_vol = 35 /area/mine/explored name = "Mine" @@ -34,7 +35,7 @@ outdoors = TRUE flags_1 = NONE ambience_index = AMBIENCE_MINING - area_flags = VALID_TERRITORY | UNIQUE_AREA | NO_ALERTS | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED + area_flags = VALID_TERRITORY | UNIQUE_AREA | NO_ALERTS | CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED map_generator = /datum/map_generator/cave_generator min_ambience_cooldown = 70 SECONDS max_ambience_cooldown = 220 SECONDS @@ -83,153 +84,3 @@ /area/mine/mechbay name = "Mining Station Mech Bay" icon_state = "mechbay" - -/area/mine/laborcamp - name = "Labor Camp" - icon_state = "mining_labor" - -/area/mine/laborcamp/security - name = "Labor Camp Security" - icon_state = "labor_camp_security" - ambience_index = AMBIENCE_DANGER - - - - -/**********************Lavaland Areas**************************/ - -/area/lavaland - icon = 'icons/area/areas_station.dmi' - icon_state = "mining" - has_gravity = STANDARD_GRAVITY - flags_1 = NONE - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED - sound_environment = SOUND_AREA_LAVALAND - ambient_buzz = 'sound/ambience/magma.ogg' - -/area/lavaland/surface - name = "Lavaland" - icon_state = "explored" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | NO_ALERTS - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS - -/area/lavaland/underground - name = "Lavaland Caves" - icon_state = "unexplored" - always_unpowered = TRUE - requires_power = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - ambience_index = AMBIENCE_MINING - area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED | NO_ALERTS - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS - -/area/lavaland/surface/outdoors - name = "Lavaland Wastes" - outdoors = TRUE - -/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 | NO_ALERTS - map_generator = /datum/map_generator/cave_generator/lavaland - -/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 | NO_ALERTS - -/area/lavaland/surface/outdoors/explored - name = "Lavaland Labor Camp" - area_flags = VALID_TERRITORY | UNIQUE_AREA | NO_ALERTS - - - -/**********************Ice Moon Areas**************************/ - -/area/icemoon - icon = 'icons/area/areas_station.dmi' - icon_state = "mining" - has_gravity = STANDARD_GRAVITY - flags_1 = NONE - area_flags = UNIQUE_AREA | FLORA_ALLOWED - sound_environment = SOUND_AREA_ICEMOON - ambient_buzz = 'sound/ambience/magma.ogg' - -/area/icemoon/surface - name = "Icemoon" - icon_state = "explored" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - requires_power = TRUE - ambience_index = AMBIENCE_MINING - area_flags = UNIQUE_AREA | FLORA_ALLOWED | NO_ALERTS - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS - -/area/icemoon/surface/outdoors // parent that defines if something is on the exterior of the station. - name = "Icemoon Wastes" - outdoors = TRUE - -/area/icemoon/surface/outdoors/nospawn // this is the area you use for stuff to not spawn, but if you still want weather. - -/area/icemoon/surface/outdoors/noteleport // for places like the cursed spring water - area_flags = UNIQUE_AREA | FLORA_ALLOWED | NO_ALERTS | NOTELEPORT - -/area/icemoon/surface/outdoors/noruins // when you want random generation without the chance of getting ruins - icon_state = "noruins" - area_flags = UNIQUE_AREA | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | CAVES_ALLOWED | NO_ALERTS - map_generator = /datum/map_generator/cave_generator/icemoon/surface/noruins - -/area/icemoon/surface/outdoors/labor_camp - name = "Icemoon Labor Camp" - area_flags = UNIQUE_AREA | NO_ALERTS - -/area/icemoon/surface/outdoors/unexplored //monsters and ruins spawn here - icon_state = "unexplored" - area_flags = UNIQUE_AREA | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | CAVES_ALLOWED | NO_ALERTS - -/area/icemoon/surface/outdoors/unexplored/rivers // rivers spawn here - icon_state = "danger" - map_generator = /datum/map_generator/cave_generator/icemoon/surface - -/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters - area_flags = UNIQUE_AREA | FLORA_ALLOWED | CAVES_ALLOWED | NO_ALERTS - -/area/icemoon/underground - name = "Icemoon Caves" - outdoors = TRUE - always_unpowered = TRUE - requires_power = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - ambience_index = AMBIENCE_MINING - area_flags = UNIQUE_AREA | FLORA_ALLOWED | NO_ALERTS - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS - -/area/icemoon/underground/unexplored // mobs and megafauna and ruins spawn here - name = "Icemoon Caves" - icon_state = "unexplored" - area_flags = CAVES_ALLOWED | FLORA_ALLOWED | MOB_SPAWN_ALLOWED | MEGAFAUNA_SPAWN_ALLOWED | NO_ALERTS - -/area/icemoon/underground/unexplored/rivers // rivers spawn here - icon_state = "danger" - map_generator = /datum/map_generator/cave_generator/icemoon - -/area/icemoon/underground/unexplored/rivers/deep - map_generator = /datum/map_generator/cave_generator/icemoon/deep - -/area/icemoon/underground/explored // ruins can't spawn here - name = "Icemoon Underground" - area_flags = UNIQUE_AREA | NO_ALERTS diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index 8a6dce47cb10..44aa7ce8efed 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -5,9 +5,7 @@ requires_power = TRUE always_unpowered = TRUE - static_lighting = FALSE - base_lighting_alpha = 255 - base_lighting_color = "#FFFFFF" + area_lighting = AREA_LIGHTING_STATIC power_light = FALSE power_equip = FALSE @@ -17,6 +15,7 @@ ambience_index = AMBIENCE_SPACE flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_AREA_SPACE + ambient_buzz = null /area/space/nearstation icon_state = "space_near" @@ -26,16 +25,15 @@ name = "start area" icon_state = "start" requires_power = FALSE - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC has_gravity = STANDARD_GRAVITY /area/misc/testroom - requires_power = FALSE - has_gravity = STANDARD_GRAVITY name = "Test Room" icon_state = "test_room" + + requires_power = FALSE + has_gravity = STANDARD_GRAVITY // FUCK YOU NEVER CHANGE MY LIGHTING -kapu1178, 2023 - static_lighting = FALSE //The unit test area should always be luminosity = 1 - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC //The unit test area should always be luminosity = 1 luminosity = 1 diff --git a/code/game/area/areas/ruins/_ruins.dm b/code/game/area/areas/ruins/_ruins.dm index 0f338fe8c29b..23655f244fb4 100644 --- a/code/game/area/areas/ruins/_ruins.dm +++ b/code/game/area/areas/ruins/_ruins.dm @@ -7,7 +7,7 @@ icon_state = "away" has_gravity = STANDARD_GRAVITY area_flags = HIDDEN_AREA | BLOBS_ALLOWED | UNIQUE_AREA | NO_ALERTS - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambience_index = AMBIENCE_RUINS flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_ENVIRONMENT_STONEROOM diff --git a/code/game/area/areas/ruins/icemoon.dm b/code/game/area/areas/ruins/icemoon.dm deleted file mode 100644 index 5395c4d94916..000000000000 --- a/code/game/area/areas/ruins/icemoon.dm +++ /dev/null @@ -1,46 +0,0 @@ -// Icemoon Ruins - -/area/ruin/unpowered/buried_library - name = "\improper Buried Library" - -/area/ruin/powered/bathhouse - name = "\improper Bath House" - mood_bonus = 10 - mood_message = "I wish I could stay here forever." - -/turf/closed/wall/bathhouse - desc = "It's cool to the touch, pleasantly so." - icon = 'icons/turf/shuttleold.dmi' - icon_state = "block" - base_icon_state = "block" - smoothing_flags = NONE - canSmoothWith = null - -/area/ruin/powered/mailroom - name = "\improper Abandoned Post Office" - -/area/ruin/plasma_facility/commons - name = "\improper Abandoned Plasma Facility Commons" - sound_environment = SOUND_AREA_STANDARD_STATION - mood_bonus = -5 - mood_message = "I feel like I am being watched..." - -/area/ruin/plasma_facility/operations - name = "\improper Abandoned Plasma Facility Operations" - sound_environment = SOUND_AREA_SMALL_ENCLOSED - mood_bonus = -5 - mood_message = "I feel like I am being watched..." - -/area/ruin/bughabitat - name = "\improper Entemology Outreach Center" - mood_bonus = 1 - mood_message = "This place seems strangely serene." - -/area/ruin/pizzeria - name = "\improper Moffuchi's Pizzeria" - -/area/ruin/pizzeria/kitchen - name = "\improper Moffuchi's Kitchen" - -/area/ruin/planetengi - name = "\improper Engineering Outpost" diff --git a/code/game/area/areas/ruins/lavaland.dm b/code/game/area/areas/ruins/lavaland.dm deleted file mode 100644 index d7bc98413c71..000000000000 --- a/code/game/area/areas/ruins/lavaland.dm +++ /dev/null @@ -1,96 +0,0 @@ -//Lavaland Ruins -//NOTICE: /unpowered means you never get power. Thanks Fikou - -/area/ruin/powered/beach - -/area/ruin/powered/clownplanet - name = "\improper Clown Planet" - ambientsounds = list('sound/ambience/clown.ogg') - -/area/ruin/unpowered/gaia - name = "\improper Patch of Eden" - -/area/ruin/powered/snow_biodome - -/area/ruin/powered/gluttony - -/area/ruin/powered/golem_ship - name = "\improper Free Golem Ship" - -/area/ruin/powered/greed - -/area/ruin/unpowered/hierophant - name = "\improper Hierophant's Arena" - -/area/ruin/powered/pride - -/area/ruin/powered/seedvault - -/area/ruin/unpowered/elephant_graveyard - name = "\improper Elephant Graveyard" - -/area/ruin/powered/graveyard_shuttle - name = "\improper Elephant Graveyard" - -/area/ruin/syndicate_lava_base - name = "\improper Secret Base" - ambience_index = AMBIENCE_DANGER - ambient_buzz = 'sound/ambience/magma.ogg' - -/area/ruin/unpowered/cultaltar - name = "\improper Cult Altar" - area_flags = CULT_PERMITTED - ambience_index = AMBIENCE_SPOOKY - -//Syndicate lavaland base - -/area/ruin/syndicate_lava_base/engineering - name = "Syndicate Lavaland Engineering" - -/area/ruin/syndicate_lava_base/medbay - name = "Syndicate Lavaland Medbay" - -/area/ruin/syndicate_lava_base/arrivals - name = "Syndicate Lavaland Arrivals" - -/area/ruin/syndicate_lava_base/bar - name = "\improper Syndicate Lavaland Bar" - -/area/ruin/syndicate_lava_base/main - name = "\improper Syndicate Lavaland Primary Hallway" - -/area/ruin/syndicate_lava_base/cargo - name = "\improper Syndicate Lavaland Cargo Bay" - -/area/ruin/syndicate_lava_base/chemistry - name = "Syndicate Lavaland Chemistry" - -/area/ruin/syndicate_lava_base/virology - name = "Syndicate Lavaland Virology" - -/area/ruin/syndicate_lava_base/testlab - name = "\improper Syndicate Lavaland Experimentation Lab" - -/area/ruin/syndicate_lava_base/dormitories - name = "\improper Syndicate Lavaland Dormitories" - -/area/ruin/syndicate_lava_base/telecomms - name = "\improper Syndicate Lavaland Telecommunications" - -//Xeno Nest - -/area/ruin/unpowered/xenonest - name = "The Hive" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - ambient_buzz = 'sound/ambience/magma.ogg' - -//ash walker nest -/area/ruin/unpowered/ash_walkers - ambient_buzz = 'sound/ambience/magma.ogg' - -/area/ruin/unpowered/ratvar - outdoors = TRUE - ambient_buzz = 'sound/ambience/magma.ogg' diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm index 0060ad043858..8aad659a83a0 100644 --- a/code/game/area/areas/ruins/space.dm +++ b/code/game/area/areas/ruins/space.dm @@ -18,7 +18,7 @@ ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_SPACE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/ruin/space/way_home name = "\improper Salvation" @@ -358,8 +358,7 @@ icon_state = "DJ" area_flags = UNIQUE_AREA | AREA_USES_STARLIGHT has_gravity = STANDARD_GRAVITY - base_lighting_alpha = null - base_lighting_color = null + area_lighting = AREA_LIGHTING_DYNAMIC /area/ruin/space/djstation/service name = "\improper DJ Station Service" @@ -379,7 +378,6 @@ 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') airlock_wires = /datum/wires/airlock/engineering - network_root_id = STATION_NETWORK_ROOT //ABANDONED BOX WHITESHIP diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 5f220f7b6fc1..8531a6ec91db 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -5,7 +5,7 @@ /area/shuttle name = "Shuttle" requires_power = FALSE - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC has_gravity = STANDARD_GRAVITY always_unpowered = FALSE // Loading the same shuttle map at a different time will produce distinct area instances. @@ -68,13 +68,12 @@ /area/shuttle/hunter name = "Hunter Shuttle" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/shuttle/hunter/russian name = "Russian Cargo Hauler" requires_power = TRUE - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ////////////////////////////White Ship//////////////////////////// @@ -108,9 +107,7 @@ /area/shuttle/transit name = "Hyperspace" desc = "Weeeeee" - static_lighting = FALSE - base_lighting_alpha = 255 - + area_lighting = AREA_LIGHTING_STATIC /area/shuttle/arrival name = "Arrival Shuttle" @@ -174,8 +171,7 @@ name = "Medieval Reality Simulation Dome" icon_state = "shuttlectf" area_flags = NOTELEPORT - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/shuttle/escape/arena name = "The Arena" @@ -232,65 +228,3 @@ /area/shuttle/caravan/freighter3 name = "Tiny Freighter" - -// ----------- Arena Shuttle -/area/shuttle/shuttle_arena - name = "arena" - has_gravity = STANDARD_GRAVITY - requires_power = FALSE - -/obj/effect/forcefield/arena_shuttle - name = "portal" - initial_duration = 0 - var/list/warp_points = list() - -/obj/effect/forcefield/arena_shuttle/Initialize(mapload) - . = ..() - for(var/obj/effect/landmark/shuttle_arena_safe/exit in GLOB.landmarks_list) - warp_points += exit - -/obj/effect/forcefield/arena_shuttle/Bumped(atom/movable/AM) - if(!isliving(AM)) - return - - var/mob/living/L = AM - if(L.pulling && istype(L.pulling, /obj/item/bodypart/head)) - to_chat(L, span_notice("Your offering is accepted. You may pass."), confidential = TRUE) - qdel(L.pulling) - var/turf/LA = get_turf(pick(warp_points)) - L.forceMove(LA) - L.hallucination = 0 - to_chat(L, "The battle is won. Your bloodlust subsides.", confidential = TRUE) - for(var/obj/item/chainsaw/doomslayer/chainsaw in L) - qdel(chainsaw) - var/obj/item/skeleton_key/key = new(L) - L.put_in_hands(key) - else - to_chat(L, span_warning("You are not yet worthy of passing. Drag a severed head to the barrier to be allowed entry to the hall of champions."), confidential = TRUE) - -/obj/effect/landmark/shuttle_arena_safe - name = "hall of champions" - desc = "For the winners." - -/obj/effect/landmark/shuttle_arena_entrance - name = "\proper the arena" - desc = "A lava filled battlefield." - -/obj/effect/forcefield/arena_shuttle_entrance - name = "portal" - initial_duration = 0 - var/list/warp_points = list() - -/obj/effect/forcefield/arena_shuttle_entrance/Bumped(atom/movable/AM) - if(!isliving(AM)) - return - - if(!warp_points.len) - for(var/obj/effect/landmark/shuttle_arena_entrance/S in GLOB.landmarks_list) - warp_points |= S - - var/obj/effect/landmark/LA = pick(warp_points) - var/mob/living/M = AM - M.forceMove(get_turf(LA)) - to_chat(M, "You're trapped in a deadly arena! To escape, you'll need to drag a severed head to the escape portals.", confidential = TRUE) - M.apply_status_effect(/datum/status_effect/mayhem) diff --git a/code/game/area/areas/station.dm b/code/game/area/areas/station.dm index 9a8a3b8289b0..4c49ad85e339 100644 --- a/code/game/area/areas/station.dm +++ b/code/game/area/areas/station.dm @@ -15,7 +15,8 @@ sound_environment = SOUND_AREA_TUNNEL_ENCLOSED forced_ambience = TRUE ambient_buzz = 'sound/ambience/source_corridor2.ogg' - ambient_buzz_vol = 20 + ambient_buzz_vol = 30 + holomap_color = HOLOMAP_AREACOLOR_MAINTENANCE //Maintenance - Departmental @@ -220,6 +221,7 @@ /area/station/maintenance/space_hut name = "\improper Space Hut" icon_state = "spacehut" + holomap_color = null /area/station/maintenance/space_hut/cabin name = "Abandoned Cabin" @@ -258,6 +260,7 @@ /area/station/hallway sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS /area/station/hallway/primary name = "\improper Primary Hallway" @@ -291,6 +294,14 @@ name = "\improper Aft Central Primary Hallway" icon_state = "hallCA" +/area/station/hallway/primary/central/port + name = "\improper Port Central Primary Hallway" + icon_state = "hallCP" + +/area/station/hallway/primary/central/starboard + name = "\improper Starboard Central Primary Hallway" + icon_state = "hallCS" + /area/station/hallway/primary/upper name = "\improper Upper Central Primary Hallway" icon_state = "centralhall" @@ -348,6 +359,7 @@ ambientsounds = list('sound/ambience/signal.ogg') airlock_wires = /datum/wires/airlock/command sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_COMMAND /area/station/command/bridge name = "\improper Bridge" @@ -371,34 +383,38 @@ /area/station/command/heads_quarters /area/station/command/heads_quarters/captain - name = "\improper Captain's Office" + name = "\improper Superintendent's Office" icon_state = "captain" sound_environment = SOUND_AREA_WOODFLOOR /area/station/command/heads_quarters/captain/private - name = "\improper Captain's Quarters" + name = "\improper Superintendent's Quarters" icon_state = "captain_private" sound_environment = SOUND_AREA_WOODFLOOR /area/station/command/heads_quarters/ce name = "\improper Chief Engineer's Office" icon_state = "ce_office" + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/station/command/heads_quarters/cmo name = "\improper Medical Director's Office" icon_state = "cmo_office" + holomap_color = HOLOMAP_AREACOLOR_MEDICAL /area/station/command/heads_quarters/hop name = "\improper Head of Personnel's Office" icon_state = "hop_office" /area/station/command/heads_quarters/hos - name = "\improper Head of Security's Office" + name = "\improper Security Marshal's Office" icon_state = "hos_office" + holomap_color = HOLOMAP_AREACOLOR_SECURITY /area/station/command/heads_quarters/rd name = "\improper Research Director's Office" icon_state = "rd_office" + holomap_color = HOLOMAP_AREACOLOR_SCIENCE //Command - Teleporters @@ -419,6 +435,7 @@ icon_state = "commons" sound_environment = SOUND_AREA_STANDARD_STATION area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + holomap_color = HOLOMAP_AREACOLOR_GENERIC_ROOM /area/station/commons/dorms name = "\improper Dormitories" @@ -467,9 +484,6 @@ /area/station/commons/lounge name = "\improper Bar Lounge" icon_state = "lounge" - mood_bonus = 5 - mood_message = "I love being in the bar!" - mood_trait = TRAIT_EXTROVERT sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/station/commons/fitness @@ -542,6 +556,7 @@ /area/station/service airlock_wires = /datum/wires/airlock/service + holomap_color = HOLOMAP_AREACOLOR_GENERIC_ROOM /area/station/service/cafeteria name = "\improper Cafeteria" @@ -567,9 +582,6 @@ /area/station/service/bar name = "\improper Bar" icon_state = "bar" - mood_bonus = 5 - mood_message = "I love being in the bar!" - mood_trait = TRAIT_EXTROVERT airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_WOODFLOOR @@ -606,9 +618,6 @@ /area/station/service/library name = "\improper Library" icon_state = "library" - mood_bonus = 5 - mood_message = "I love being in the library!" - mood_trait = TRAIT_INTROVERT area_flags = CULT_PERMITTED | BLOBS_ALLOWED | UNIQUE_AREA sound_environment = SOUND_AREA_LARGE_SOFTFLOOR @@ -640,9 +649,6 @@ /area/station/service/chapel name = "\improper Chapel" icon_state = "chapel" - mood_bonus = 5 - mood_message = "Being in the chapel brings me peace." - mood_trait = TRAIT_SPIRITUAL ambience_index = AMBIENCE_HOLY flags_1 = NONE sound_environment = SOUND_AREA_LARGE_ENCLOSED @@ -714,6 +720,7 @@ ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_LARGE_ENCLOSED + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/station/engineering/engine_smes name = "\improper Engineering SMES" @@ -830,6 +837,7 @@ icon_state = "construction" ambience_index = AMBIENCE_ENGI sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/station/construction/mining/aux_base name = "Auxiliary Base Construction" @@ -839,6 +847,7 @@ /area/station/construction/storage_wing name = "\improper Storage Wing" icon_state = "storage_wing" + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS //Solars @@ -849,8 +858,6 @@ ambience_index = AMBIENCE_ENGI airlock_wires = /datum/wires/airlock/engineering sound_environment = SOUND_AREA_SPACE - base_lighting_alpha = null - base_lighting_color = null /area/station/solars/fore name = "\improper Fore Solar Array" @@ -938,6 +945,9 @@ sound_environment = SOUND_AREA_STANDARD_STATION min_ambience_cooldown = 90 SECONDS max_ambience_cooldown = 180 SECONDS + holomap_color = HOLOMAP_AREACOLOR_MEDICAL + + spook_level = SPOOK_AMT_CORPSE * -2 // We can expect like two dudes to be dead in here at all times. /area/station/medical/abandoned name = "\improper Abandoned Medbay" @@ -978,6 +988,13 @@ name = "\improper Medical Cold Room" icon_state = "kitchen_cold" +/area/station/medical/coldroom/port + name = "\improper Port Medical Cold Room " + + +/area/station/medical/coldroom/starboard + name = "\improper Starboard Medical Cold " + /area/station/medical/patients_rooms name = "\improper Patients' Rooms" icon_state = "patients" @@ -985,11 +1002,16 @@ /area/station/medical/patients_rooms/room_a name = "Patient Room A" - icon_state = "patients" + /area/station/medical/patients_rooms/room_b name = "Patient Room B" - icon_state = "patients" + +/area/station/medical/patients_rooms/room_c + name = "Patient Room C" + +/area/station/medical/patients_rooms/room_d + name = "Patient Room D" /area/station/medical/virology name = "Virology" @@ -1000,6 +1022,9 @@ icon_state = "morgue" ambience_index = AMBIENCE_SPOOKY sound_environment = SOUND_AREA_SMALL_ENCLOSED + lightswitch = FALSE + + spook_level = SPOOK_AMT_CORPSE * -10 // The morgue lays spirits to rest or something /area/station/medical/chemistry name = "Chemistry" @@ -1014,6 +1039,10 @@ icon_state = "surgery" ambience_index = AMBIENCE_VIROLOGY +/area/station/medical/surgery/prep + name = "\improper Pre-Op Prep" + icon_state = "surgeryprep" + /area/station/medical/surgery/fore name = "\improper Fore Operating Room" icon_state = "foresurgery" @@ -1022,6 +1051,14 @@ name = "\improper Aft Operating Room" icon_state = "aftsurgery" +/area/station/medical/surgery/port + name = "\improper Port Operating Room" + icon_state = "portsurgery" + +/area/station/medical/surgery/starboard + name = "\improper Starboard Operating Room" + icon_state = "starboardsurgery" + /area/station/medical/surgery/theatre name = "\improper Grand Surgery Theatre" icon_state = "surgerytheatre" @@ -1040,12 +1077,9 @@ /area/station/medical/psychology name = "\improper Psychology Office" icon_state = "psychology" - mood_bonus = 3 - mood_message = "I feel at ease here." ambientsounds = list('sound/ambience/aurora_caelus_short.ogg') //Security -///When adding a new area to the security areas, make sure to add it to /datum/bounty/item/security/paperwork as well! /area/station/security name = "Security" @@ -1053,15 +1087,28 @@ ambience_index = AMBIENCE_DANGER airlock_wires = /datum/wires/airlock/security sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_SECURITY /area/station/security/office name = "\improper Security Office" icon_state = "security" +/area/station/security/office/hall + name = "\improper Security Office Hall" + icon_state = "security" + /area/station/security/lockers name = "\improper Security Locker Room" icon_state = "securitylockerroom" +/area/station/security/deck + name = "\improper Security Observation Deck" + icon_state = "security" + +/area/station/security/pig + name = "\improper Security Pig Pen" + icon_state = "security" + /area/station/security/brig name = "\improper Brig" icon_state = "brig" @@ -1070,6 +1117,10 @@ name = "\improper Holding Cell" icon_state = "holding_cell" +/area/station/security/isolation_cells + name = "\improper Isolation Cells" + icon_state = "holding_cell" + /area/station/security/medical name = "\improper Security Medical" icon_state = "security_medical" @@ -1148,12 +1199,12 @@ sound_environment = SOUND_AREA_SMALL_SOFTFLOOR /area/station/security/detectives_office - name = "\improper Detective's Office" + name = "\improper Private Investigator's Office" icon_state = "detective" ambientsounds = list('sound/ambience/ambidet1.ogg','sound/ambience/ambidet2.ogg') + holomap_color = HOLOMAP_AREACOLOR_HALLWAYS /area/station/security/detectives_office/private_investigators_office - name = "\improper Private Investigator's Office" icon_state = "investigate_office" sound_environment = SOUND_AREA_SMALL_SOFTFLOOR @@ -1184,18 +1235,22 @@ /area/station/security/checkpoint/supply name = "Security Post - Cargo Bay" icon_state = "checkpoint_supp" + holomap_color = HOLOMAP_AREACOLOR_CARGO /area/station/security/checkpoint/engineering name = "Security Post - Engineering" icon_state = "checkpoint_engi" + holomap_color = HOLOMAP_AREACOLOR_ENGINEERING /area/station/security/checkpoint/medical name = "Security Post - Medbay" icon_state = "checkpoint_med" + holomap_color = HOLOMAP_AREACOLOR_MEDICAL /area/station/security/checkpoint/science name = "Security Post - Science" icon_state = "checkpoint_sci" + holomap_color = HOLOMAP_AREACOLOR_SCIENCE /area/station/security/checkpoint/science/research name = "Security Post - Research Division" @@ -1224,6 +1279,7 @@ icon_state = "quart" airlock_wires = /datum/wires/airlock/service sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_CARGO /area/station/cargo/sorting name = "\improper Delivery Office" @@ -1275,6 +1331,26 @@ name = "\improper Mining Office" icon_state = "mining" +/area/station/cargo/mining/asteroid_magnet + name = "\improper Asteroid Magnet" + icon_state = "mining" + requires_power = TRUE + always_unpowered = TRUE + holomap_color = null + + area_lighting = AREA_LIGHTING_STATIC + + power_light = FALSE + power_equip = FALSE + power_environ = FALSE + area_flags = NO_ALERTS + outdoors = TRUE + + ambient_buzz = null + ambience_index = AMBIENCE_SPACE + flags_1 = CAN_BE_DIRTY_1 + sound_environment = SOUND_AREA_SPACE + //Science /area/station/science @@ -1282,6 +1358,7 @@ icon_state = "science" airlock_wires = /datum/wires/airlock/science sound_environment = SOUND_AREA_STANDARD_STATION + holomap_color = HOLOMAP_AREACOLOR_SCIENCE /area/station/science/lobby name = "\improper Science Lobby" @@ -1319,6 +1396,7 @@ name = "\improper Ordnance Test Area" icon_state = "ord_test" area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED + holomap_color = null /area/station/science/mixing name = "\improper Ordnance Mixing Lab" @@ -1381,10 +1459,10 @@ // Telecommunications Satellite /area/station/tcommsat + holomap_color = HOLOMAP_AREACOLOR_COMMAND 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') airlock_wires = /datum/wires/airlock/engineering - network_root_id = STATION_NETWORK_ROOT // They should of unpluged the router before they left /area/station/tcommsat/computer name = "\improper Telecomms Control Room" diff --git a/code/game/atom_defense.dm b/code/game/atom_defense.dm index eb4ac9ecf49b..33940c026170 100644 --- a/code/game/atom_defense.dm +++ b/code/game/atom_defense.dm @@ -1,6 +1,6 @@ /// The essential proc to call when an atom must receive damage of any kind. -/atom/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) +/atom/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armor_penetration = 0) if(!uses_integrity) CRASH("[src] had /atom/proc/take_damage() called on it without it being a type that has uses_integrity = TRUE!") if(QDELETED(src)) @@ -11,10 +11,12 @@ play_attack_sound(damage_amount, damage_type, damage_flag) if(resistance_flags & INDESTRUCTIBLE) return - damage_amount = run_atom_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration) + + damage_amount = run_atom_armor(damage_amount, damage_type, damage_flag, attack_dir, armor_penetration) if(damage_amount < DAMAGE_PRECISION) return - if(SEND_SIGNAL(src, COMSIG_ATOM_TAKE_DAMAGE, damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) & COMPONENT_NO_TAKE_DAMAGE) + + if(SEND_SIGNAL(src, COMSIG_ATOM_TAKE_DAMAGE, damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armor_penetration) & COMPONENT_NO_TAKE_DAMAGE) return . = damage_amount @@ -69,21 +71,26 @@ return max_integrity - get_integrity() ///returns the damage value of the attack after processing the atom's various armor protections -/atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) +/atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armor_penetration = 0) if(!uses_integrity) CRASH("/atom/proc/run_atom_armor was called on [src] without being implemented as a type that uses integrity!") - if(damage_flag == MELEE && damage_amount < damage_deflection) + + if(damage_flag == BLUNT && (damage_amount < damage_deflection)) return 0 + switch(damage_type) if(BRUTE) if(BURN) else return 0 + var/armor_protection = 0 if(damage_flag) - armor_protection = armor.getRating(damage_flag) + armor_protection = returnArmor().getRating(damage_flag) + if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor. - armor_protection = clamp(armor_protection - armour_penetration, min(armor_protection, 0), 100) + armor_protection = clamp(armor_protection - armor_penetration, min(armor_protection, 0), 100) + return round(damage_amount * (100 - armor_protection)*0.01, DAMAGE_PRECISION) ///the sound played when the atom is damaged. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c6cc5de52ff8..8f0563685ec4 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -9,86 +9,113 @@ plane = GAME_PLANE appearance_flags = TILE_BOUND|LONG_GLIDE - /// pass_flags that we are. If any of this matches a pass_flag on a moving thing, by default, we let them through. - var/pass_flags_self = NONE - - ///If non-null, overrides a/an/some in all cases - var/article - - ///First atom flags var - var/flags_1 = NONE - ///Second atom flags var - var/flags_2 = NONE - - ///Intearaction flags - var/interaction_flags_atom = NONE - - var/flags_ricochet = NONE - - ///When a projectile tries to ricochet off this atom, the projectile ricochet chance is multiplied by this - var/receive_ricochet_chance_mod = 1 - ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom - var/receive_ricochet_damage_coeff = 0.33 + /// Has this atom's constructor ran? + var/tmp/initialized = FALSE ///Reagents holder - var/datum/reagents/reagents = null + var/tmp/datum/reagents/reagents = null + /// the datum handler for our contents - see create_storage() for creation method + var/tmp/datum/storage/atom_storage + /// Forensics datum, initialzed when needed. + var/tmp/datum/forensics/forensics + + ///all of this atom's HUD (med/sec, etc) images. Associative list of the form: list(hud category = hud image or images for that category). + ///most of the time hud category is associated with a single image, sometimes its associated with a list of images. + ///not every hud in this list is actually used. for ones available for others to see, look at active_hud_list. + var/tmp/list/image/hud_list = null + ///all of this atom's HUD images which can actually be seen by players with that hud + var/tmp/list/image/active_hud_list = null + /// A list of atom huds this object is within + var/tmp/list/in_atom_huds = null - ///This atom's HUD (med/sec, etc) images. Associative list. - var/list/image/hud_list = null ///HUD images that this atom can provide. var/list/hud_possible - ///Value used to increment ex_act() if reactionary_explosions is on - var/explosion_block = 0 - /** * used to store the different colors on an atom * * its inherent color, the colored paint applied on it, special color effect etc... */ - var/list/atom_colours - + var/tmp/list/atom_colours /// a very temporary list of overlays to remove - var/list/remove_overlays + var/tmp/list/remove_overlays /// a very temporary list of overlays to add - var/list/add_overlays + var/tmp/list/add_overlays ///vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays. - var/list/managed_vis_overlays + var/tmp/list/managed_vis_overlays ///overlays managed by [update_overlays][/atom/proc/update_overlays] to prevent removing overlays that weren't added by the same proc. Single items are stored on their own, not in a list. - var/list/managed_overlays + var/tmp/list/managed_overlays ///Cooldown tick timer for buckle messages - var/buckle_message_cooldown = 0 + var/tmp/buckle_message_cooldown = 0 ///Last fingerprints to touch this atom - var/fingerprintslast + var/tmp/fingerprintslast - var/list/filter_data //For handling persistent filters + var/tmp/list/filter_data //For handling persistent filters //List of datums orbiting this atom - var/datum/component/orbiter/orbiters + var/tmp/datum/component/orbiter/orbiters + + ///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.) + ///The list referenced by this var can be shared by multiple objects and should not be directly modified. Instead, use [set_custom_materials][/atom/proc/set_custom_materials]. + var/tmp/list/datum/material/custom_materials + + var/tmp/datum/wires/wires = null + + var/tmp/list/alternate_appearances + + /// Last name used to calculate a color for the chatmessage overlays + var/tmp/chat_color_name + /// Last color calculated for the the chatmessage overlays + var/tmp/chat_color + /// A luminescence-shifted value of the last color calculated for chatmessage overlays + var/tmp/chat_color_darkened + + ///Holds merger groups currently active on the atom. Do not access directly, use GetMergeGroup() instead. + var/tmp/list/datum/merger/mergers + + ///Reference to atom being orbited + var/tmp/atom/orbit_target + + /// !DO NOT DIRECTLY EDIT! Can mobs "interact" with this item? THIS IS ONLY USED FOR MOUSE ICONS. SEE interactables.dm. + var/tmp/is_mouseover_interactable + + /// pass_flags that we are. If any of this matches a pass_flag on a moving thing, by default, we let them through. + var/pass_flags_self = NONE + + ///If non-null, overrides a/an/some in all cases + var/article + + ///First atom flags var + var/flags_1 = NONE + ///Second atom flags var + var/flags_2 = NONE + + ///Intearaction flags + var/interaction_flags_atom = NONE + + var/flags_ricochet = NONE + + ///When a projectile tries to ricochet off this atom, the projectile ricochet chance is multiplied by this + var/receive_ricochet_chance_mod = 1 + ///When a projectile ricochets off this atom, it deals the normal damage * this modifier to this atom + var/receive_ricochet_damage_coeff = 0.33 + + ///Value used to increment ex_act() if reactionary_explosions is on + var/explosion_block = 0 /// Radiation insulation types var/rad_insulation = RAD_NO_INSULATION - /// The icon state intended to be used for the acid component. Used to override the default acid overlay icon state. - var/custom_acid_overlay = null - - ///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.) - ///The list referenced by this var can be shared by multiple objects and should not be directly modified. Instead, use [set_custom_materials][/atom/proc/set_custom_materials]. - var/list/datum/material/custom_materials ///Bitfield for how the atom handles materials. var/material_flags = NONE ///Modifier that raises/lowers the effect of the amount of a material, prevents small and easy to get items from being death machines. var/material_modifier = 1 - var/datum/wires/wires = null - - var/list/alternate_appearances - ///Light systems, both shouldn't be active at the same time. - var/light_system = STATIC_LIGHT + var/light_system = COMPLEX_LIGHT ///Range of the maximum brightness of light in tiles. Zero means no light. var/light_inner_range = 0 ///Range where light begins to taper into darkness in tiles. @@ -108,13 +135,6 @@ ///Any light sources that are "inside" of us, for example, if src here was a mob that's carrying a flashlight, that flashlight's light source would be part of this list. var/tmp/list/light_sources - /// Last name used to calculate a color for the chatmessage overlays - var/chat_color_name - /// Last color calculated for the the chatmessage overlays - var/chat_color - /// A luminescence-shifted value of the last color calculated for chatmessage overlays - var/chat_color_darkened - ///Default pixel x shifting for the atom's icon. var/base_pixel_x = 0 ///Default pixel y shifting for the atom's icon. @@ -127,34 +147,32 @@ ///A string of hex format colors to be used by greyscale sprites, ex: "#0054aa#badcff" var/greyscale_colors - ///Holds merger groups currently active on the atom. Do not access directly, use GetMergeGroup() instead. - var/list/datum/merger/mergers - ///Icon-smoothing behavior. - var/smoothing_flags = NONE + var/tmp/smoothing_flags = NONE ///What directions this is currently smoothing with. IMPORTANT: This uses the smoothing direction flags as defined in icon_smoothing.dm, instead of the BYOND flags. - var/smoothing_junction = null //This starts as null for us to know when it's first set, but after that it will hold a 8-bit mask ranging from 0 to 255. + var/tmp/smoothing_junction = null //This starts as null for us to know when it's first set, but after that it will hold a 8-bit mask ranging from 0 to 255. ///Smoothing variable - var/top_left_corner + var/tmp/top_left_corner ///Smoothing variable - var/top_right_corner + var/tmp/top_right_corner ///Smoothing variable - var/bottom_left_corner + var/tmp/bottom_left_corner ///Smoothing variable - var/bottom_right_corner + var/tmp/bottom_right_corner ///What smoothing groups does this atom belongs to, to match canSmoothWith. If null, nobody can smooth with it. Must be sorted. - var/list/smoothing_groups = null + var/tmp/list/smoothing_groups = null ///List of smoothing groups this atom can smooth with. If this is null and atom is smooth, it smooths only with itself. Must be sorted. - var/list/canSmoothWith = null - ///Reference to atom being orbited - var/atom/orbit_target - ///AI controller that controls this atom. type on init, then turned into an instance during runtime + var/tmp/list/canSmoothWith = null + + ///AI controller that controls this atom. type on init, then turned into an instance during runtime. + ///Note: If you are for some reason giving this to a non-mob, it needs to create it's own in Initialize() var/datum/ai_controller/ai_controller ///any atom that uses integrity and can be damaged must set this to true, otherwise the integrity procs will throw an error var/uses_integrity = FALSE - var/datum/armor/armor + ///Atom armor. Use returnArmor() + var/tmp/datum/armor/armor VAR_PRIVATE/atom_integrity //defaults to max_integrity var/max_integrity = 500 var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the atom breaks. 0.5 being 50% @@ -163,8 +181,8 @@ var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF - /// the datum handler for our contents - see create_storage() for creation method - var/datum/storage/atom_storage + /// How this atom should react to having its astar blocking checked + var/can_astar_pass = CANASTARPASS_DENSITY /** * Called when an atom is created in byond (built in engine proc) @@ -174,16 +192,12 @@ * if the preloader is being used and then call [InitAtom][/datum/controller/subsystem/atoms/proc/InitAtom] of which the ultimate * result is that the Intialize proc is called. * - * We also generate a tag here if the DF_USE_TAG flag is set on the atom */ /atom/New(loc, ...) //atom creation method that preloads variables at creation - if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() + if(use_preloader && (type == global._preloader_path))//in case the instanciated atom is creating other atoms in New() world.preloader_load(src) - if(datum_flags & DF_USE_TAG) - GenerateTag() - var/do_initialize = SSatoms.initialized if(do_initialize != INITIALIZATION_INSSATOMS) args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD @@ -233,9 +247,10 @@ SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) - if(flags_1 & INITIALIZED_1) + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 + + initialized = TRUE if(greyscale_config && greyscale_colors) update_greyscale() @@ -244,44 +259,23 @@ if(color) add_atom_colour(color, FIXED_COLOUR_PRIORITY) - if (light_system == STATIC_LIGHT && light_power && (light_inner_range || light_outer_range)) + if (light_system == COMPLEX_LIGHT && light_power && (light_inner_range || light_outer_range)) update_light() - if (length(smoothing_groups)) - #ifdef UNIT_TESTS - assert_sorted(smoothing_groups, "[type].smoothing_groups") - #endif - - SET_BITFLAG_LIST(smoothing_groups) - - if (length(canSmoothWith)) + if(uses_integrity) #ifdef UNIT_TESTS - assert_sorted(canSmoothWith, "[type].canSmoothWith") + if (!(islist(armor) || isnull(armor) || istype(armor))) + stack_trace("Invalid armor found on atom of type [type] during /atom/Initialize()! Value: [armor]") #endif - if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. - smoothing_flags |= SMOOTH_OBJ - - SET_BITFLAG_LIST(canSmoothWith) - - if(uses_integrity) - if (islist(armor)) - armor = getArmor(arglist(armor)) - else if (isnull(armor)) - armor = getArmor() - else if (!istype(armor, /datum/armor)) - stack_trace("Invalid type [armor.type] found in .armor during /atom Initialize()") - atom_integrity = max_integrity // apply materials properly from the default custom_materials value // This MUST come after atom_integrity is set above, as if old materials get removed, // atom_integrity is checked against max_integrity and can BREAK the atom. // The integrity to max_integrity ratio is still preserved. - set_custom_materials(custom_materials) - - ComponentInitialize() - InitializeAIController() + if(length(custom_materials)) + set_custom_materials(custom_materials) return INITIALIZE_HINT_NORMAL @@ -292,17 +286,13 @@ * proc must return the hint * [INITIALIZE_HINT_LATELOAD] otherwise you will never be called. * - * useful for doing things like finding other machines on GLOB.machines because you can guarantee + * useful for doing things like finding other machines using INSTANCES_OF() because you can guarantee * that all atoms will actually exist in the "WORLD" at this time and that all their Intialization * code has been run */ /atom/proc/LateInitialize() set waitfor = FALSE -/// Put your [AddComponent] calls here -/atom/proc/ComponentInitialize() - return - /** * Top level of the destroy chain for most atoms * @@ -317,7 +307,7 @@ if(alternate_appearances) for(var/current_alternate_appearance in alternate_appearances) var/datum/atom_hud/alternate_appearance/selected_alternate_appearance = alternate_appearances[current_alternate_appearance] - selected_alternate_appearance.remove_from_hud(src) + selected_alternate_appearance.remove_atom_from_hud(src) if(reagents) QDEL_NULL(reagents) @@ -325,13 +315,24 @@ if(atom_storage) QDEL_NULL(atom_storage) + if(forensics) + QDEL_NULL(forensics) + orbiters = null // The component is attached to us normaly and will be deleted elsewhere - LAZYCLEARLIST(overlays) + if(length(overlays)) + overlays.Cut() + + if(light) + QDEL_NULL(light) + + if(ai_controller) + QDEL_NULL(ai_controller) + LAZYNULL(managed_overlays) - QDEL_NULL(light) - QDEL_NULL(ai_controller) + if(length(light_sources)) + light_sources.len = 0 if(smoothing_flags & SMOOTH_QUEUED) SSicon_smooth.remove_from_queues(src) @@ -375,6 +376,12 @@ return atom_storage +/// Creates our forensics datum +/atom/proc/create_forensics() + if(QDELING(src)) + return + forensics = new(src) + /atom/proc/handle_ricochet(obj/projectile/ricocheting_projectile) var/turf/p_turf = get_turf(ricocheting_projectile) var/face_direction = get_dir(src, p_turf) @@ -383,7 +390,7 @@ var/a_incidence_s = abs(incidence_s) if(a_incidence_s > 90 && a_incidence_s < 270) return FALSE - if((ricocheting_projectile.armor_flag in list(BULLET, BOMB)) && ricocheting_projectile.ricochet_incidence_leeway) + if((ricocheting_projectile.armor_flag in list(PUNCTURE, BOMB)) && ricocheting_projectile.ricochet_incidence_leeway) if((a_incidence_s < 90 && a_incidence_s < 90 - ricocheting_projectile.ricochet_incidence_leeway) || (a_incidence_s > 270 && a_incidence_s -270 > ricocheting_projectile.ricochet_incidence_leeway)) return FALSE var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) @@ -413,6 +420,10 @@ return TRUE return !density +/// A version of CanPass() that accounts for vertical movement. +/atom/proc/CanMoveOnto(atom/movable/mover, border_dir) + return ((border_dir & DOWN) && HAS_TRAIT(src, TRAIT_CLIMBABLE)) || CanPass(mover, border_dir) + /** * Is this atom currently located on centcom * @@ -515,7 +526,6 @@ if(!reagents) reagents = new() reagents.reagent_list.Add(part) - reagents.conditional_update() else if(ismovable(part)) var/atom/movable/object = part if(isliving(object.loc)) @@ -550,12 +560,16 @@ /atom/proc/return_analyzable_air() return null +///Return air that a contained mob will be breathing. +/atom/proc/return_breathable_air() + return return_air() + ///Check if this atoms eye is still alive (probably) /atom/proc/check_eye(mob/user) SIGNAL_HANDLER return -/atom/proc/Bumped(atom/movable/bumped_atom) +/atom/proc/BumpedBy(atom/movable/bumped_atom) set waitfor = FALSE SEND_SIGNAL(src, COMSIG_ATOM_BUMPED, bumped_atom) @@ -641,6 +655,7 @@ // only living mobs use armor to reduce damage, but on_hit() is going to need the value no matter what is shot. var/visual_armor_check = check_projectile_armor(def_zone, hitting_projectile) . = hitting_projectile.on_hit(src, visual_armor_check, def_zone, piercing_hit) + spawn_debris(hitting_projectile) ///Return true if we're inside the passed in atom /atom/proc/in_contents_of(container)//can take class or object instance as argument @@ -658,17 +673,19 @@ * [COMSIG_ATOM_GET_EXAMINE_NAME] signal */ /atom/proc/get_examine_name(mob/user) - . = "\a [src]" - var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") - if(article) - . = "[article] [src]" - override[EXAMINE_POSITION_ARTICLE] = article - if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) - . = override.Join("") + var/list/name_list = list(name) + + SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, name_list) + if(gender == PLURAL) + return jointext(name_list, " ") + + else + return "\a [jointext(name_list, " ")]" ///Generate the full examine string of this atom (including icon for goonchat) /atom/proc/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" + var/that_string = gender == PLURAL ? "Those are " : "That is " + return "[icon2html(src, user)] [thats? that_string :""][get_examine_name(user)]" /** * Returns an extended list of examine strings for any contained ID cards. @@ -693,47 +710,63 @@ * Produces a signal [COMSIG_PARENT_EXAMINE] */ /atom/proc/examine(mob/user) - . = list("[get_examine_string(user, TRUE)].
") //PARIAH EDIT CHANGE - if(SScodex.get_codex_entry(get_codex_value(user))) - . += "The codex has relevant information available.
" - + . = list("[get_examine_string(user, TRUE)].") //PARIAH EDIT CHANGE . += get_name_chaser(user) + if(desc) . += desc - if(z && user.z != z) + . += "
" + + var/place_linebreak = FALSE + if(SScodex.get_codex_entry(get_codex_value(user))) + . += "The codex has relevant information available." + place_linebreak = TRUE + + if(isitem(src) && length(slapcraft_examine_hints_for_type(type))) + . += "You could craft [(length(slapcraft_examine_hints_for_type(type)) > 1) ? "several things" : "something"] with it." + place_linebreak = TRUE + + if(place_linebreak) + . += "" + + if(z && user.z && user.z != z) var/diff = abs(user.z - z) . += span_notice("[p_theyre(TRUE)] [diff] level\s below you.") if(custom_materials) - . += "
" //PARIAH EDIT ADDITION var/list/materials_list = list() for(var/datum/material/current_material as anything in custom_materials) materials_list += "[current_material.name]" - . += "It is made out of [english_list(materials_list)]." + . += span_notice("It is made out of [english_list(materials_list)].") + if(reagents) - . += "
" //PARIAH EDIT ADDITION if(reagents.flags & TRANSPARENT) - . += "It contains:" - if(length(reagents.reagent_list)) + if(!length(reagents.reagent_list)) + . += span_alert("It looks empty.") + else if(user.can_see_reagents()) //Show each individual reagent + . += span_notice("You see the following reagents:") for(var/datum/reagent/current_reagent as anything in reagents.reagent_list) - . += "[round(current_reagent.volume, 0.01)] units of [current_reagent.name]" + . += span_notice("* [round(current_reagent.volume, CHEMICAL_VOLUME_ROUNDING)] units of [current_reagent.name].") + if(reagents.is_reacting) - . += span_warning("It is currently reacting!") - . += span_notice("The solution's pH is [round(reagents.ph, 0.01)] and has a temperature of [reagents.chem_temp]K.") + . += span_alert("A chemical reaction is taking place.") + + . += span_notice("The solution's temperature is [reagents.chem_temp]K.") + else //Otherwise, just show the total volume - var/total_volume = 0 - for(var/datum/reagent/current_reagent as anything in reagents.reagent_list) - total_volume += current_reagent.volume - . += "[total_volume] units of various reagents" - else - . += "Nothing." + . += span_notice("It looks about [reagents.total_volume / reagents.maximum_volume * 100]% full.") + else if(reagents.flags & AMOUNT_VISIBLE) if(reagents.total_volume) - . += span_notice("It has [reagents.total_volume] unit\s left.") + . += span_notice("It looks about [reagents.total_volume / reagents.maximum_volume * 100]% full.") else - . += span_danger("It's empty.") + . += span_alert("It looks empty.") + + if(ishuman(user) && !ismovable(loc) && !ismob(src)) + var/mob/living/carbon/human/human_user = user + human_user.forensic_analysis_roll(src) SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) @@ -832,8 +865,8 @@ /// Child procs should call parent last so the update happens after all changes. /atom/proc/set_greyscale(list/colors, new_config) SHOULD_CALL_PARENT(TRUE) - if(istype(colors)) - colors = colors.Join("") + if(islist(colors)) + colors = jointext(colors, "") if(!isnull(colors) && greyscale_colors != colors) // If you want to disable greyscale stuff then give a blank string greyscale_colors = colors @@ -878,6 +911,17 @@ /// Handle what happens when your contents are exploded by a bomb /atom/proc/contents_explosion(severity, target) + for(var/atom/movable/movable_thing as anything in contents) + if(QDELETED(movable_thing)) + continue + + switch(severity) + if(EXPLODE_DEVASTATE) + EX_ACT(movable_thing, EXPLODE_DEVASTATE) + if(EXPLODE_HEAVY) + EX_ACT(movable_thing, EXPLODE_HEAVY) + if(EXPLODE_LIGHT) + EX_ACT(movable_thing, EXPLODE_LIGHT) return //For handling the effects of explosions on contents that would not normally be effected /** @@ -901,7 +945,7 @@ return FALSE return TRUE -/atom/proc/fire_act(exposed_temperature, exposed_volume) +/atom/proc/fire_act(exposed_temperature, exposed_volume, turf/adjacent) SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) return @@ -937,7 +981,18 @@ /mob/living/proc/get_blood_dna_list() if(get_blood_id() != /datum/reagent/blood) return - return list("ANIMAL DNA" = "Y-") + return list("ANIMAL DNA" = GET_BLOOD_REF(/datum/blood/animal)) + +/mob/proc/get_trace_dna() + return + +/mob/living/get_trace_dna() + return "ANIMAL DNA" + +/mob/living/carbon/get_trace_dna() + if(dna) + return dna.unique_enzymes + return "UNKNOWN DNA" ///Get the mobs dna list /mob/living/carbon/get_blood_dna_list() @@ -1063,15 +1118,6 @@ /atom/proc/handle_atom_del(atom/deleting_atom) SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, deleting_atom) -/** - * called when the turf the atom resides on is ChangeTurfed - * - * Default behaviour is to loop through atom contents and call their HandleTurfChange() proc - */ -/atom/proc/HandleTurfChange(turf/changing_turf) - for(var/atom/current_atom as anything in src) - current_atom.HandleTurfChange(changing_turf) - /** * the vision impairment to give to the mob whose perspective is set to that atom * @@ -1119,13 +1165,13 @@ ///Adds an instance of colour_type to the atom's atom_colours list /atom/proc/add_atom_colour(coloration, colour_priority) - if(!atom_colours || !atom_colours.len) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(!coloration) - return - if(colour_priority > atom_colours.len) + if(!length(atom_colours)) + atom_colours = new /list(COLOUR_PRIORITY_AMOUNT) + if(isnull(coloration)) return + if(colour_priority > length(atom_colours)) + CRASH("Invalid color priority supplied to add_atom_color!") + atom_colours[colour_priority] = coloration update_atom_colour() @@ -1144,19 +1190,28 @@ ///Resets the atom's color to null, and then sets it to the highest priority colour available /atom/proc/update_atom_colour() - color = null - if(!atom_colours) + if(!length(atom_colours)) return for(var/checked_color in atom_colours) - if(islist(checked_color)) - var/list/color_list = checked_color - if(color_list.len) - color = color_list - return - else if(checked_color) + if(isnull(checked_color)) + continue + if(islist(checked_color) && length(checked_color)) + color = checked_color + return + + color = checked_color + return + if(isnull(checked_color)) + continue + if(islist(checked_color) && length(checked_color)) color = checked_color return + color = checked_color + return + + color = null + /** * Wash this atom @@ -1173,6 +1228,9 @@ if(SEND_SIGNAL(src, COMSIG_COMPONENT_CLEAN_ACT, clean_types) & COMPONENT_CLEANED) . = TRUE + if(forensics) + . = forensics.wash(clean_types) || . + // Basically "if has washable coloration" if(length(atom_colours) >= WASHABLE_COLOUR_PRIORITY && atom_colours[WASHABLE_COLOUR_PRIORITY]) remove_atom_colour(WASHABLE_COLOUR_PRIORITY) @@ -1192,23 +1250,23 @@ /atom/vv_edit_var(var_name, var_value) switch(var_name) if(NAMEOF(src, light_inner_range)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_inner_range = var_value) . = TRUE if(NAMEOF(src, light_outer_range)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_outer_range = var_value) else set_light_range(var_value) . = TRUE if(NAMEOF(src, light_power)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_power = var_value) else set_light_power(var_value) . = TRUE if(NAMEOF(src, light_color)) - if(light_system == STATIC_LIGHT) + if(light_system == COMPLEX_LIGHT) set_light(l_color = var_value) else set_light_color(var_value) @@ -1288,7 +1346,7 @@ break if (!ispath(text2path(chosen_id))) chosen_id = pick_closest_path(chosen_id, make_types_fancy(subtypesof(/datum/reagent))) - if (ispath(chosen_id) && initial(chosen_id.abstract_type) != chosen_id) + if (ispath(chosen_id) && !isabstract(chosen_id)) valid_id = TRUE else valid_id = TRUE @@ -1371,6 +1429,7 @@ ///Where atoms should drop if taken from this atom /atom/proc/drop_location() + RETURN_TYPE(/atom) var/atom/location = loc if(!location) return null @@ -1393,11 +1452,11 @@ * * Default behaviour is to send the [COMSIG_ATOM_EXIT] */ -/atom/Exit(atom/movable/leaving, direction) +/atom/Exit(atom/movable/leaving, direction, no_side_effects) // Don't call `..()` here, otherwise `Uncross()` gets called. // See the doc comment on `Uncross()` to learn why this is bad. - if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, leaving, direction) & COMPONENT_ATOM_BLOCK_EXIT) + if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, leaving, direction, no_side_effects) & COMPONENT_ATOM_BLOCK_EXIT) return FALSE return TRUE @@ -1595,10 +1654,6 @@ /atom/proc/analyzer_act_secondary(mob/living/user, obj/item/tool) return -///Generate a tag for this atom -/atom/proc/GenerateTag() - return - ///Connect this atom to a shuttle /atom/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) return @@ -1794,22 +1849,20 @@ /// Sets the custom materials for an item. /atom/proc/set_custom_materials(list/materials, multiplier = 1) - if(custom_materials && material_flags & MATERIAL_EFFECTS) //Only runs if custom materials existed at first and affected src. - for(var/current_material in custom_materials) - var/datum/material/custom_material = GET_MATERIAL_REF(current_material) - custom_material.on_removed(src, custom_materials[current_material] * material_modifier, material_flags) //Remove the current materials + if(length(custom_materials) && istype(custom_materials[1], /datum/material) && (material_flags & MATERIAL_EFFECTS)) //Only runs if custom materials existed at first and affected src. + for(var/datum/material/material as anything in custom_materials) + material.on_removed(src, custom_materials[material] * material_modifier, material_flags) //Remove the current materials if(!length(materials)) custom_materials = null return - if(material_flags & MATERIAL_EFFECTS) - for(var/current_material in materials) - var/datum/material/custom_material = GET_MATERIAL_REF(current_material) - custom_material.on_applied(src, materials[current_material] * multiplier * material_modifier, material_flags) - custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) + if(material_flags & MATERIAL_EFFECTS) + for(var/datum/material/material as anything in custom_materials) + material.on_applied(src, materials[material] * multiplier * material_modifier, material_flags) + /** * Returns the material composition of the atom. * @@ -1972,18 +2025,19 @@ return 0 var/list/forced_gravity = list() - if(SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity)) - if(!length(forced_gravity)) - SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) + SEND_SIGNAL(src, COMSIG_ATOM_HAS_GRAVITY, gravity_turf, forced_gravity) + SEND_SIGNAL(gravity_turf, COMSIG_TURF_HAS_GRAVITY, src, forced_gravity) + if(length(forced_gravity)) + var/positive_grav = max(forced_gravity) + var/negative_grav = min(min(forced_gravity), 0) //negative grav needs to be below or equal to 0 - var/max_grav = 0 - for(var/i in forced_gravity)//our gravity is the strongest return forced gravity we get - max_grav = max(max_grav, i) - //cut so we can reuse the list, this is ok since forced gravity movers are exceedingly rare compared to all other movement - return max_grav + //our gravity is sum of the most massive positive and negative numbers returned by the signal + //so that adding two forced_gravity elements with an effect size of 1 each doesnt add to 2 gravity + //but negative force gravity effects can cancel out positive ones - var/area/turf_area = gravity_turf.loc + return (positive_grav + negative_grav) + var/area/turf_area = gravity_turf.loc return !gravity_turf.force_no_gravity && (turf_area.has_gravity || SSmapping.gravity_by_zlevel[gravity_turf.z]) /** @@ -2079,16 +2133,6 @@ return list() 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(ispath(ai_controller)) - ai_controller = new ai_controller(src) - /** * Point at an atom * @@ -2112,7 +2156,15 @@ return TRUE /atom/MouseEntered(location, control, params) + SHOULD_CALL_PARENT(TRUE) + . = !(1 || ..()) SSmouse_entered.hovers[usr.client] = src + SSmouse_entered.sustained_hovers[usr.client] = src + +/atom/MouseExited(location, control, params) + SHOULD_CALL_PARENT(TRUE) + . = !(1 || ..()) + SSmouse_entered.sustained_hovers[usr.client] = null /// Fired whenever this atom is the most recent to be hovered over in the tick. /// Preferred over MouseEntered if you do not need information such as the position of the mouse. @@ -2124,6 +2176,9 @@ if (isnull(user)) return + if(is_mouseover_interactable) + user.update_mouse_pointer() + // Screentips var/datum/hud/active_hud = user.hud_used if(active_hud) @@ -2216,12 +2271,14 @@ * For turfs this will only be used if pathing_pass_method is TURF_PATHING_PASS_PROC * * 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 + * * to_dir - What direction we're trying to move in, relevant for things like directional windows that only block movement in certain directions + * * pass_info - Datum that stores info about the thing that's trying to pass us + * + * IMPORTANT NOTE: /turf/proc/LinkBlockedWithAccess assumes that overrides of CanAStarPass will always return true if density is FALSE + * If this is NOT you, ensure you edit your can_astar_pass variable. Check __DEFINES/path.dm **/ -/atom/proc/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - if(caller && (caller.pass_flags & pass_flags_self)) +/atom/proc/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(pass_info && (pass_info.pass_flags & pass_flags_self)) return TRUE . = !density @@ -2232,3 +2289,31 @@ //Currently only changed by Observers to be hearing through their orbit target. /atom/proc/hear_location() return src + +/// Makes this atom look like a "hologram" +/// So transparent, blue and with a scanline +/atom/proc/makeHologram(color = rgb(125,180,225, 0.5 * 255)) + // First, we'll make things blue (roughly) and sorta transparent + add_filter("HOLO: Color and Transparent", 1, color_matrix_filter(color)) + // Now we're gonna do a scanline effect + // Gonna take this atom and give it a render target, then use it as a source for a filter + // (We use an atom because it seems as if setting render_target on an MA is just invalid. I hate this engine) + var/atom/movable/scanline = new /atom/movable{icon = 'icons/effects/effects.dmi'; icon_state = "scanline"}(null) + scanline.appearance_flags |= RESET_TRANSFORM + // * so it doesn't render + var/static/uid_scan = 0 + scanline.render_target = "*HoloScanline [uid_scan]" + uid_scan++ + // Now we add it as a filter, and overlay the appearance so the render source is always around + add_filter("HOLO: Scanline", 2, alpha_mask_filter(render_source = scanline.render_target)) + add_overlay(scanline) + qdel(scanline) + +///Reset plane and layer values to their defaults. +/atom/proc/reset_plane_and_layer() + plane = initial(plane) + layer = initial(layer) + +///returns how much the object blocks an explosion. Used by subtypes. +/atom/proc/GetExplosionBlock() + CRASH("Unimplemented GetExplosionBlock()") diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index dc4d9d7c951a..657c981583d7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -3,17 +3,76 @@ glide_size = 8 appearance_flags = TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - var/last_move = null + /// The last direction we moved in. + var/tmp/last_move = null + var/tmp/list/active_movement + + ///Are we moving with inertia? Mostly used as an optimization + var/tmp/inertia_moving = FALSE + ///The last time we pushed off something + ///This is a hack to get around dumb him him me scenarios + var/tmp/last_pushoff + ///0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move + var/tmp/moving_diagonally = 0 + /// Tracks if the mob is currently in the movechain during a pulling movement. + var/tmp/moving_from_pull = FALSE + /// Tracks if forceMove() should break grabs or not. + var/tmp/forcemove_should_maintain_grab = FALSE + + ///is the mob currently ascending or descending through z levels? + var/tmp/currently_z_moving + + ///Holds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on + var/tmp/datum/movement_packet/move_packet + var/tmp/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm + + /** + * 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/tmp/list/important_recursive_contents + ///contains every client mob corresponding to every client eye in this container. lazily updated by SSparallax and is sparse: + ///only the last container of a client eye has this list assuming no movement since SSparallax's last fire + var/tmp/list/client_mobs_in_contents + + /// String representing the spatial grid groups we want to be held in. + /// acts as a key to the list of spatial grid contents types we exist in via SSspatial_grid.spatial_grid_categories. + /// We do it like this to prevent people trying to mutate them and to save memory on holding the lists ourselves + var/tmp/spatial_grid_key + + var/tmp/datum/component/orbiter/orbiting + + ///Lazylist to keep track on the sources of illumination. + var/tmp/list/affected_dynamic_lights + ///Highest-intensity light affecting us, which determines our visibility. + var/tmp/affecting_dynamic_lumi = 0 + + ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening. + var/tmp/list/do_afters + + ///A lazylist of grab objects gripping us + var/tmp/list/grabbed_by + + /// A ref to the throwing datum belonging to us. + var/tmp/datum/thrownthing/throwing = null + + /// Look, we're defining this here so it doesn't need to be redefined 4 times, okay? Sorry. + var/tmp/germ_level = GERM_LEVEL_AMBIENT + var/anchored = FALSE var/move_resist = MOVE_RESIST_DEFAULT var/move_force = MOVE_FORCE_DEFAULT var/pull_force = PULL_FORCE_DEFAULT - var/datum/thrownthing/throwing = null - var/throw_speed = 2 //How many tiles to move per ds when being thrown. Float values are fully supported + + //How many tiles to move per ds when being thrown. Float values are fully supported. + var/throw_speed = 1 var/throw_range = 7 + /// How much damage the object deals when impacting something else. + var/throwforce = 0 + ///Max range this atom can be thrown via telekinesis var/tk_throw_range = 10 - var/mob/pulledby = null var/initial_language_holder = /datum/language_holder var/datum/language_holder/language_holder // Mindless mobs and objects need language too, some times. Mind holder takes prescedence. var/verb_say = "says" @@ -23,38 +82,14 @@ var/verb_sing = "sings" var/verb_yell = "yells" var/speech_span - ///Are we moving with inertia? Mostly used as an optimization - var/inertia_moving = FALSE + ///Delay in deciseconds between inertia based movement var/inertia_move_delay = 5 - ///The last time we pushed off something - ///This is a hack to get around dumb him him me scenarios - var/last_pushoff + /// Things we can pass through while moving. If any of this matches the thing we're trying to pass's [pass_flags_self], then we can pass through. var/pass_flags = NONE /// If false makes [CanPass][/atom/proc/CanPass] call [CanPassThrough][/atom/movable/proc/CanPassThrough] on this type instead of using default behaviour var/generic_canpass = TRUE - ///0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move - var/moving_diagonally = 0 - ///attempt to resume grab after moving instead of before. - var/atom/movable/moving_from_pull - ///Holds information about any movement loops currently running/waiting to run on the movable. Lazy, will be null if nothing's going on - var/datum/movement_packet/move_packet - var/datum/forced_movement/force_moving = null //handled soley by forced_movement.dm - /** - * 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 - ///contains every client mob corresponding to every client eye in this container. lazily updated by SSparallax and is sparse: - ///only the last container of a client eye has this list assuming no movement since SSparallax's last fire - var/list/client_mobs_in_contents - - /// String representing the spatial grid groups we want to be held in. - /// acts as a key to the list of spatial grid contents types we exist in via SSspatial_grid.spatial_grid_categories. - /// We do it like this to prevent people trying to mutate them and to save memory on holding the lists ourselves - var/spatial_grid_key /** * In case you have multiple types, you automatically use the most useful one. @@ -63,27 +98,14 @@ */ var/movement_type = GROUND - var/atom/movable/pulling - var/grab_state = 0 - var/throwforce = 0 - var/datum/component/orbiter/orbiting - - ///is the mob currently ascending or descending through z levels? - var/currently_z_moving - /// 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 + var/tmp/atom/movable/emissive_blocker/em_block ///Used for the calculate_adjacencies proc for icon smoothing. var/can_be_unanchored = FALSE - ///Lazylist to keep track on the sources of illumination. - var/list/affected_dynamic_lights - ///Highest-intensity light affecting us, which determines our visibility. - var/affecting_dynamic_lumi = 0 - /// Whether this atom should have its dir automatically changed when it moves. Setting this to FALSE allows for things such as directional windows to retain dir on moving without snowflake code all of the place. var/set_dir_on_move = TRUE @@ -92,30 +114,57 @@ /// The degree of pressure protection that mobs in list/contents have from the external environment, between 0 and 1 var/contents_pressure_protection = 0 +/mutable_appearance/emissive_blocker + +/mutable_appearance/emissive_blocker/New() + . = ..() + // Need to do this here because it's overriden by the parent call + plane = EMISSIVE_PLANE + color = EM_BLOCK_COLOR + appearance_flags = EMISSIVE_APPEARANCE_FLAGS + /atom/movable/Initialize(mapload) . = ..() switch(blocks_emissive) if(EMISSIVE_BLOCK_GENERIC) - var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) - gen_emissive_blocker.color = GLOB.em_block_color - gen_emissive_blocker.dir = dir - gen_emissive_blocker.appearance_flags |= appearance_flags - add_overlay(list(gen_emissive_blocker)) - + var/static/mutable_appearance/emissive_blocker/blocker = new() + blocker.icon = icon + blocker.icon_state = icon_state + blocker.dir = dir + blocker.appearance_flags |= appearance_flags + // Ok so this is really cursed, but I want to set with this blocker cheaply while + // Still allowing it to be removed from the overlays list later + // So I'm gonna flatten it, then insert the flattened overlay into overlays AND the managed overlays list, directly + // I'm sorry + var/mutable_appearance/flat = blocker.appearance + overlays += flat + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += flat + else + managed_overlays = list(managed_overlays, flat) + else + managed_overlays = flat if(EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) - em_block = new(src, render_target) - add_overlay(list(em_block)) + em_block = new(null, src) + overlays += em_block + if(managed_overlays) + if(islist(managed_overlays)) + managed_overlays += em_block + else + managed_overlays = list(managed_overlays, em_block) + else + managed_overlays = em_block if(opacity) AddElement(/datum/element/light_blocking) switch(light_system) - if(MOVABLE_LIGHT) + if(OVERLAY_LIGHT) AddComponent(/datum/component/overlay_lighting) - if(MOVABLE_LIGHT_DIRECTIONAL) + if(OVERLAY_LIGHT_DIRECTIONAL) AddComponent(/datum/component/overlay_lighting, is_directional = TRUE) - /atom/movable/Destroy(force) QDEL_NULL(language_holder) QDEL_NULL(em_block) @@ -137,11 +186,6 @@ invisibility = INVISIBILITY_ABSTRACT - if(pulledby) - pulledby.stop_pulling() - if(pulling) - stop_pulling() - if(orbiting) orbiting.end_orbit(src) orbiting = null @@ -152,9 +196,9 @@ move_packet = null if(spatial_grid_key) - SSspatial_grid.force_remove_from_cell(src) + SSspatial_grid.force_remove_from_grid(src) - LAZYCLEARLIST(client_mobs_in_contents) + LAZYNULL(client_mobs_in_contents) . = ..() @@ -166,23 +210,23 @@ //This absolutely must be after moveToNullspace() //We rely on Entered and Exited to manage this list, and the copy of this list that is on any /atom/movable "Containers" //If we clear this before the nullspace move, a ref to this object will be hung in any of its movable containers - LAZYCLEARLIST(important_recursive_contents) + LAZYNULL(important_recursive_contents) vis_locs = null //clears this atom out of all viscontents - vis_contents.Cut() + if(length(vis_contents)) + vis_contents.Cut() /atom/movable/proc/update_emissive_block() if(!blocks_emissive) return - else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) - var/mutable_appearance/gen_emissive_blocker = emissive_blocker(icon, icon_state, alpha = src.alpha, appearance_flags = src.appearance_flags) - gen_emissive_blocker.dir = dir - return gen_emissive_blocker - else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) + return fast_emissive_blocker(src) + + if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) if(!em_block && !QDELETED(src)) render_target = ref(src) - em_block = new(src, render_target) + em_block = new(null, src, render_target) return em_block /atom/movable/update_overlays() @@ -191,108 +235,6 @@ if(emissive_block) . += emissive_block -/atom/movable/proc/onZImpact(turf/impacted_turf, levels, message = TRUE) - if(message) - visible_message(span_danger("[src] crashes into [impacted_turf]!")) - var/atom/highest = impacted_turf - for(var/atom/hurt_atom as anything in impacted_turf.contents) - if(!hurt_atom.density) - continue - if(isobj(hurt_atom) || ismob(hurt_atom)) - if(hurt_atom.layer > highest.layer) - highest = hurt_atom - INVOKE_ASYNC(src, PROC_REF(SpinAnimation), 5, 2) - return TRUE - -/* - * The core multi-z movement proc. Used to move a movable through z levels. - * If target is null, it'll be determined by the can_z_move proc, which can potentially return null if - * conditions aren't met (see z_move_flags defines in __DEFINES/movement.dm for info) or if dir isn't set. - * Bear in mind you don't need to set both target and dir when calling this proc, but at least one or two. - * This will set the currently_z_moving to CURRENTLY_Z_MOVING_GENERIC if unset, and then clear it after - * Forcemove(). - * - * - * Args: - * * dir: the direction to go, UP or DOWN, only relevant if target is null. - * * target: The target turf to move the src to. Set by can_z_move() if null. - * * z_move_flags: bitflags used for various checks in both this proc and can_z_move(). See __DEFINES/movement.dm. - */ -/atom/movable/proc/zMove(dir, turf/target, z_move_flags = ZMOVE_FLIGHT_FLAGS) - if(!target) - target = can_z_move(dir, get_turf(src), null, z_move_flags) - if(!target) - set_currently_z_moving(FALSE, TRUE) - return FALSE - - var/list/moving_movs = get_z_move_affected(z_move_flags) - - for(var/atom/movable/movable as anything in moving_movs) - movable.currently_z_moving = currently_z_moving || CURRENTLY_Z_MOVING_GENERIC - movable.forceMove(target) - movable.set_currently_z_moving(FALSE, TRUE) - // This is run after ALL movables have been moved, so pulls don't get broken unless they are actually out of range. - if(z_move_flags & ZMOVE_CHECK_PULLS) - for(var/atom/movable/moved_mov as anything in moving_movs) - if(z_move_flags & ZMOVE_CHECK_PULLEDBY && moved_mov.pulledby && (moved_mov.z != moved_mov.pulledby.z || get_dist(moved_mov, moved_mov.pulledby) > 1)) - moved_mov.pulledby.stop_pulling() - if(z_move_flags & ZMOVE_CHECK_PULLING) - moved_mov.check_pulling(TRUE) - return TRUE - -/// Returns a list of movables that should also be affected when src moves through zlevels, and src. -/atom/movable/proc/get_z_move_affected(z_move_flags) - . = list(src) - if(buckled_mobs) - . |= buckled_mobs - if(!(z_move_flags & ZMOVE_INCLUDE_PULLED)) - return - for(var/mob/living/buckled as anything in buckled_mobs) - if(buckled.pulling) - . |= buckled.pulling - if(pulling) - . |= pulling - -/** - * Checks if the destination turf is elegible for z movement from the start turf to a given direction and returns it if so. - * Args: - * * direction: the direction to go, UP or DOWN, only relevant if target is null. - * * start: Each destination has a starting point on the other end. This is it. Most of the times the location of the source. - * * z_move_flags: bitflags used for various checks. See __DEFINES/movement.dm. - * * rider: A living mob in control of the movable. Only non-null when a mob is riding a vehicle through z-levels. - */ -/atom/movable/proc/can_z_move(direction, turf/start, turf/destination, z_move_flags = ZMOVE_FLIGHT_FLAGS, mob/living/rider) - if(!start) - start = get_turf(src) - if(!start) - return FALSE - if(!direction) - if(!destination) - return FALSE - direction = get_dir_multiz(start, destination) - if(direction != UP && direction != DOWN) - return FALSE - if(!destination) - destination = get_step_multiz(start, direction) - if(!destination) - if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider || src, span_warning("There's nowhere to go in that direction!")) - return FALSE - if(z_move_flags & ZMOVE_FALL_CHECKS && (throwing || (movement_type & (FLYING|FLOATING)) || !has_gravity(start))) - return FALSE - if(z_move_flags & ZMOVE_CAN_FLY_CHECKS && !(movement_type & (FLYING|FLOATING)) && has_gravity(start)) - if(z_move_flags & ZMOVE_FEEDBACK) - if(rider) - to_chat(rider, span_warning("[src] is is not capable of flight.")) - else - to_chat(src, span_warning("You are not Superman.")) - return FALSE - if(!(z_move_flags & ZMOVE_IGNORE_OBSTACLES) && !(start.zPassOut(src, direction, destination, (z_move_flags & ZMOVE_ALLOW_ANCHORED)) && destination.zPassIn(src, direction, start))) - if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider || src, span_warning("You couldn't move there!")) - return FALSE - return destination //used by some child types checks and zMove() - /atom/movable/vv_edit_var(var_name, var_value) var/static/list/banned_edits = list( NAMEOF_STATIC(src, step_x) = TRUE, @@ -344,9 +286,6 @@ if(NAMEOF(src, anchored)) set_anchored(var_value) . = TRUE - if(NAMEOF(src, pulledby)) - set_pulledby(var_value) - . = TRUE if(NAMEOF(src, glide_size)) set_glide_size(var_value) . = TRUE @@ -357,104 +296,6 @@ return ..() - -/atom/movable/proc/start_pulling(atom/movable/pulled_atom, state, force = move_force, supress_message = FALSE) - if(QDELETED(pulled_atom)) - return FALSE - if(!(pulled_atom.can_be_pulled(src, state, force))) - return FALSE - - // If we're pulling something then drop what we're currently pulling and pull this instead. - if(pulling) - if(state == 0) - stop_pulling() - return FALSE - // Are we trying to pull something we are already pulling? Then enter grab cycle and end. - if(pulled_atom == pulling) - setGrabState(state) - if(istype(pulled_atom,/mob/living)) - var/mob/living/pulled_mob = pulled_atom - pulled_mob.grabbedby(src) - return TRUE - stop_pulling() - - if(pulled_atom.pulledby) - log_combat(pulled_atom, pulled_atom.pulledby, "pulled from", src) - pulled_atom.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. - pulling = pulled_atom - pulled_atom.set_pulledby(src) - SEND_SIGNAL(src, COMSIG_ATOM_START_PULL, pulled_atom, state, force) - setGrabState(state) - if(ismob(pulled_atom)) - var/mob/pulled_mob = pulled_atom - log_combat(src, pulled_mob, "grabbed", addition="passive grab") - if(!supress_message) - pulled_mob.visible_message(span_warning("[src] grabs [pulled_mob] passively."), \ - span_danger("[src] grabs you passively.")) - return TRUE - -/atom/movable/proc/stop_pulling() - if(!pulling) - return - pulling.set_pulledby(null) - setGrabState(GRAB_PASSIVE) - var/atom/movable/old_pulling = pulling - pulling = null - SEND_SIGNAL(old_pulling, COMSIG_ATOM_NO_LONGER_PULLED, src) - SEND_SIGNAL(src, COMSIG_ATOM_NO_LONGER_PULLING, old_pulling) - -///Reports the event of the change in value of the pulledby variable. -/atom/movable/proc/set_pulledby(new_pulledby) - if(new_pulledby == pulledby) - return FALSE //null signals there was a change, be sure to return FALSE if none happened here. - . = pulledby - pulledby = new_pulledby - - -/atom/movable/proc/Move_Pulled(atom/moving_atom) - if(!pulling) - return FALSE - if(pulling.anchored || pulling.move_resist > move_force || !pulling.Adjacent(src, src, pulling)) - stop_pulling() - return FALSE - if(isliving(pulling)) - var/mob/living/pulling_mob = pulling - if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it - stop_pulling() - return FALSE - if(moving_atom == loc && pulling.density) - return FALSE - var/move_dir = get_dir(pulling.loc, moving_atom) - if(!Process_Spacemove(move_dir)) - return FALSE - pulling.Move(get_step(pulling.loc, move_dir), move_dir, glide_size) - return TRUE - -/mob/living/Move_Pulled(atom/moving_atom) - . = ..() - if(!. || !isliving(moving_atom)) - return - var/mob/living/pulled_mob = moving_atom - set_pull_offsets(pulled_mob, grab_state) - -/** - * Checks if the pulling and pulledby should be stopped because they're out of reach. - * If z_allowed is TRUE, the z level of the pulling will be ignored.This is to allow things to be dragged up and down stairs. - */ -/atom/movable/proc/check_pulling(only_pulling = FALSE, z_allowed = FALSE) - if(pulling) - if(get_dist(src, pulling) > 1 || (z != pulling.z && !z_allowed)) - stop_pulling() - else if(!isturf(loc)) - stop_pulling() - else if(pulling && !isturf(pulling.loc) && pulling.loc != loc) //to be removed once all code that changes an object's loc uses forceMove(). - log_game("DEBUG:[src]'s pull on [pulling] wasn't broken despite [pulling] being in [pulling.loc]. Pull stopped manually.") - stop_pulling() - else if(pulling.anchored || pulling.move_resist > move_force) - stop_pulling() - if(!only_pulling && pulledby && moving_diagonally != FIRST_DIAG_STEP && (get_dist(src, pulledby) > 1 || z != pulledby.z)) //separated from our puller and not in the middle of a diagonal move. - pulledby.stop_pulling() - /atom/movable/proc/set_glide_size(target = 8) SEND_SIGNAL(src, COMSIG_MOVABLE_UPDATE_GLIDE_SIZE, target) glide_size = target @@ -465,9 +306,14 @@ /** * meant for movement with zero side effects. only use for objects that are supposed to move "invisibly" (like camera mobs or ghosts) * if you want something to move onto a tile with a beartrap or recycler or tripmine or mouse without that object knowing about it at all, use this - * most of the time you want forceMove() + * most of the time you want forceMove()FALS */ /atom/movable/proc/abstract_move(atom/new_loc) + if(QDELING(src)) + CRASH("Illegal abstract_move() on [type]!") + + RESOLVE_ACTIVE_MOVEMENT + var/atom/old_loc = loc var/direction = get_dir(old_loc, new_loc) loc = new_loc @@ -477,15 +323,19 @@ // Here's where we rewrite how byond handles movement except slightly different // To be removed on step_ conversion // All this work to prevent a second bump -/atom/movable/Move(atom/newloc, direction, glide_size_override = 0) +/atom/movable/Move(atom/newloc, direction, glide_size_override = 0, z_movement_flags) . = FALSE + if(!newloc || newloc == loc) return + // A mid-movement... movement... occured, resolve that first. + RESOLVE_ACTIVE_MOVEMENT + if(!direction) direction = get_dir(src, newloc) - if(set_dir_on_move && dir != direction) + if(set_dir_on_move && dir != direction && !(dir & (UP|DOWN))) setDir(direction) var/is_multi_tile_object = bound_width > 32 || bound_height > 32 @@ -526,6 +376,7 @@ var/area/oldarea = get_area(oldloc) var/area/newarea = get_area(newloc) + SET_ACTIVE_MOVEMENT(oldloc, direction, FALSE, old_locs) loc = newloc . = TRUE @@ -543,20 +394,26 @@ entered_loc.Entered(src, oldloc, old_locs) else newloc.Entered(src, oldloc, old_locs) + if(oldarea != newarea) newarea.Entered(src, oldarea) - Moved(oldloc, direction, FALSE, old_locs) + RESOLVE_ACTIVE_MOVEMENT //////////////////////////////////////// -/atom/movable/Move(atom/newloc, direct, glide_size_override = 0) - var/atom/movable/pullee = pulling - var/turf/current_turf = loc - if(!moving_from_pull) - check_pulling(z_allowed = TRUE) +/atom/movable/Move(atom/newloc, direct, glide_size_override = 0, z_movement_flags) if(!loc || !newloc) return FALSE + + if(!moving_from_pull) + recheck_grabs(z_allowed = TRUE) + + if(direct & (UP|DOWN)) + if(!can_z_move(direct, null, z_movement_flags)) + return FALSE + set_currently_z_moving(ZMOVING_VERTICAL) + var/atom/oldloc = loc //Early override for some cases like diagonal movement if(glide_size_override && glide_size != glide_size_override) @@ -622,28 +479,17 @@ if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 - set_currently_z_moving(FALSE, TRUE) + set_currently_z_moving(FALSE) return - if(. && pulling && pulling == pullee && pulling != moving_from_pull) //we were pulling a thing and didn't lose it during our move. - if(pulling.anchored) - stop_pulling() - else - //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) - var/pull_dir = get_dir(pulling, src) - var/target_turf = current_turf - - // Pulling things down/up stairs. zMove() has flags for check_pulling and stop_pulling calls. - // You may wonder why we're not just forcemoving the pulling movable and regrabbing it. - // The answer is simple. forcemoving and regrabbing is ugly and breaks conga lines. - if(pulling.z != z) - target_turf = get_step(pulling, get_dir(pulling, current_turf)) + if(set_dir_on_move && dir != direct) + setDir(direct) - if(target_turf != current_turf || (moving_diagonally != SECOND_DIAG_STEP && ISDIAGONALDIR(pull_dir)) || get_dist(src, pulling) > 1) - pulling.move_from_pull(src, target_turf, glide_size) - check_pulling() + if(. && isliving(src) && currently_z_moving != ZMOVING_LATERAL) + var/mob/living/L = src + L.handle_grabs_during_movement(oldloc, direct) + recheck_grabs(only_pulled = TRUE) //glide_size strangely enough can change mid movement animation and update correctly while the animation is playing //This means that if you don't override it late like this, it will just be set back by the movement update that's called when you move turfs. @@ -652,23 +498,21 @@ last_move = direct - if(set_dir_on_move && dir != direct) - setDir(direct) if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc, direct, glide_size_override)) //movement failed due to buckled mob(s) . = FALSE if(currently_z_moving) - if(. && loc == newloc) - var/turf/pitfall = get_turf(src) - pitfall.zFall(src, falling_from_move = TRUE) - else - set_currently_z_moving(FALSE, TRUE) + set_currently_z_moving(FALSE) /// Called when src is being moved to a target turf because another movable (puller) is moving around. /atom/movable/proc/move_from_pull(atom/movable/puller, turf/target_turf, glide_size_override) - moving_from_pull = puller - Move(target_turf, get_dir(src, target_turf), glide_size_override) - moving_from_pull = null + moving_from_pull = TRUE + forcemove_should_maintain_grab = TRUE + . = Move(target_turf, get_dir(src, target_turf), glide_size_override) + moving_from_pull = FALSE + forcemove_should_maintain_grab = FALSE + + update_offsets() /** * Called after a successful Move(). By this point, we've already moved. @@ -721,9 +565,13 @@ if (bound_overlay) // The overlay will handle cleaning itself up on non-openspace turfs. if (new_turf) - bound_overlay.forceMove(get_step(src, UP)) - if (bound_overlay && dir != bound_overlay.dir) - bound_overlay.setDir(dir) + var/turf/target = GetAbove(src) + if (target) + bound_overlay.forceMove(target) + if (bound_overlay && dir != bound_overlay.dir) + bound_overlay.setDir(dir) + else + qdel(bound_overlay) else // Not a turf, so we need to destroy immediately instead of waiting for the destruction timer to proc. qdel(bound_overlay) @@ -731,14 +579,12 @@ // 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/crossed_atom) +/atom/movable/Cross(atom/movable/crosser) . = TRUE - SEND_SIGNAL(src, COMSIG_MOVABLE_CROSS, crossed_atom) - SEND_SIGNAL(crossed_atom, COMSIG_MOVABLE_CROSS_OVER, src) - return CanPass(crossed_atom, get_dir(src, crossed_atom)) + return CanPass(crosser, get_dir(src, crosser)) ///default byond proc that is deprecated for us in lieu of signals. do not call -/atom/movable/Crossed(atom/movable/crossed_atom, oldloc) +/atom/movable/Crossed(atom/movable/crossed_by, oldloc) SHOULD_NOT_OVERRIDE(TRUE) CRASH("atom/movable/Crossed() was called!") @@ -786,7 +632,7 @@ . = TRUE if(QDELETED(bumped_atom)) return - bumped_atom.Bumped(src) + bumped_atom.BumpedBy(src) /atom/movable/Exited(atom/movable/gone, direction) . = ..() @@ -954,16 +800,17 @@ anchored = anchorvalue SEND_SIGNAL(src, COMSIG_MOVABLE_SET_ANCHORED, anchorvalue) -/// Sets the currently_z_moving variable to a new value. Used to allow some zMovement sources to have precedence over others. -/atom/movable/proc/set_currently_z_moving(new_z_moving_value, forced = FALSE) - if(forced) - currently_z_moving = new_z_moving_value - return TRUE - var/old_z_moving_value = currently_z_moving - currently_z_moving = max(currently_z_moving, new_z_moving_value) - return currently_z_moving > old_z_moving_value +/// Sets the currently_z_moving variable to a new value. Used to temporarily disable some Move() side effects. +/atom/movable/proc/set_currently_z_moving(new_z_moving_value) + if(new_z_moving_value == currently_z_moving) + return FALSE + currently_z_moving = new_z_moving_value + return TRUE /atom/movable/proc/forceMove(atom/destination) + if(QDELING(src)) + CRASH("Illegal forceMove() on [type]!") + . = FALSE if(destination) . = doMove(destination) @@ -975,13 +822,13 @@ /atom/movable/proc/doMove(atom/destination) . = FALSE + RESOLVE_ACTIVE_MOVEMENT + var/atom/oldloc = loc var/is_multi_tile = bound_width > world.icon_size || bound_height > world.icon_size - if(destination) - ///zMove already handles whether a pull from another movable should be broken. - if(pulledby && !currently_z_moving) - pulledby.stop_pulling() + SET_ACTIVE_MOVEMENT(oldloc, NONE, TRUE, null) + if(destination) var/same_loc = oldloc == destination var/area/old_area = get_area(oldloc) var/area/destarea = get_area(destination) @@ -1038,7 +885,7 @@ if(old_area) old_area.Exited(src, NONE) - Moved(oldloc, NONE, TRUE) + RESOLVE_ACTIVE_MOVEMENT /** * Called when a movable changes z-levels. @@ -1050,6 +897,8 @@ /atom/movable/proc/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_turf, new_turf) + bound_overlay?.z_shift() + if(!notify_contents) return @@ -1069,14 +918,28 @@ * * continuous_move - If this check is coming from something in the context of already drifting */ /atom/movable/proc/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) + if(anchored) + return TRUE + if(has_gravity()) return TRUE if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir, continuous_move) & COMSIG_MOVABLE_STOP_SPACEMOVE) return TRUE - if(pulledby && (pulledby.pulledby != src || moving_from_pull)) - return TRUE + // If we are being pulled by something AND (we are NOT pulling them OR we are moving from a pull), do not drift + if(LAZYLEN(grabbed_by)) + var/can_drift = TRUE + if(isliving(src)) + var/mob/living/L = src + for(var/obj/item/hand_item/grab/G in grabbed_by) + if(!L.is_grabbing(G.assailant)) + can_drift = FALSE // Something is grabbing us and we're not grabbing them + else + can_drift = FALSE + + if(!can_drift || moving_from_pull) + return TRUE if(throwing) return TRUE @@ -1136,12 +999,9 @@ if(SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_THROW, args) & COMPONENT_CANCEL_THROW) return - if (pulledby) - pulledby.stop_pulling() - //They are moving! Wouldn't it be cool if we calculated their momentum and added it to the throw? if (thrower && thrower.last_move && thrower.client && thrower.client.move_delay >= world.time + world.tick_lag*2) - var/user_momentum = thrower.cached_multiplicative_slowdown + var/user_momentum = thrower.movement_delay if (!user_momentum) //no movement_delay, this means they move once per byond tick, lets calculate from that instead. user_momentum = world.tick_lag @@ -1171,7 +1031,7 @@ else target_zone = thrower.zone_selected - var/datum/thrownthing/thrown_thing = new(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) + var/datum/thrownthing/thrown_thing = new(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone, spin) var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) @@ -1195,13 +1055,14 @@ thrown_thing.diagonal_error = dist_x/2 - dist_y thrown_thing.start_time = world.time - if(pulledby) - pulledby.stop_pulling() + if(LAZYLEN(grabbed_by)) + free_from_all_grabs() + if (quickstart && (throwing || SSthrowing.state == SS_RUNNING)) //Avoid stack overflow edgecases. quickstart = FALSE throwing = thrown_thing if(spin) - SpinAnimation(5, 1) + SpinAnimation(2) SEND_SIGNAL(src, COMSIG_MOVABLE_POST_THROW, thrown_thing, spin) SSthrowing.processing[src] = thrown_thing @@ -1247,11 +1108,13 @@ /// called when this atom is removed from a storage item, which is passed on as S. The loc variable is already set to the new destination before this is called. /atom/movable/proc/on_exit_storage(datum/storage/master_storage) - return + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_UNSTORED, master_storage) /// called when this atom is added into a storage item, which is passed on as S. The loc variable is already set to the storage item. /atom/movable/proc/on_enter_storage(datum/storage/master_storage) - return + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_ITEM_STORED, master_storage) /atom/movable/proc/get_spacemove_backup() for(var/checked_range in orange(1, get_turf(src))) @@ -1278,7 +1141,9 @@ do_item_attack_animation(attacked_atom, visual_effect_icon, used_item) if(attacked_atom == src) + do_hurt_animation() return //don't do an animation if attacking self + var/pixel_x_diff = 0 var/pixel_y_diff = 0 var/turn_dir = 1 @@ -1302,8 +1167,15 @@ var/matrix/initial_transform = matrix(transform) var/matrix/rotated_transform = transform.Turn(15 * turn_dir) - animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform=rotated_transform, time = 1, easing=BACK_EASING|EASE_IN, flags = ANIMATION_PARALLEL) - animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform=initial_transform, time = 2, easing=SINE_EASING, flags = ANIMATION_PARALLEL) + for(var/atom/movable/AM as anything in get_associated_mimics() + src) + animate(AM, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform=rotated_transform, time = 1, easing=BACK_EASING|EASE_IN, flags = ANIMATION_PARALLEL) + animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, transform=initial_transform, time = 2, easing=SINE_EASING, flags = ANIMATION_PARALLEL) + + attacked_atom.do_hurt_animation() + +/// Plays an animation for getting hit. +/atom/proc/do_hurt_animation() + return /atom/movable/vv_get_dropdown() . = ..() @@ -1317,68 +1189,54 @@ /// Gets or creates the relevant language holder. For mindless atoms, gets the local one. For atom with mind, gets the mind one. /atom/movable/proc/get_language_holder(get_minds = TRUE) + RETURN_TYPE(/datum/language_holder) if(!language_holder) language_holder = new initial_language_holder(src) return language_holder /// Grants the supplied language and sets omnitongue true. /atom/movable/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ATOM) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.grant_language(language, understood, spoken, source) + return get_language_holder().grant_language(language, understood, spoken, source) /// Grants every language. /atom/movable/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.grant_all_languages(understood, spoken, grant_omnitongue, source) + return get_language_holder().grant_all_languages(understood, spoken, grant_omnitongue, source) /// Removes a single language. /atom/movable/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.remove_language(language, understood, spoken, source) + return get_language_holder().remove_language(language, understood, spoken, source) /// Removes every language and sets omnitongue false. /atom/movable/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.remove_all_languages(source, remove_omnitongue) + return get_language_holder().remove_all_languages(source, remove_omnitongue) /// Adds a language to the blocked language list. Use this over remove_language in cases where you will give languages back later. /atom/movable/proc/add_blocked_language(language, source = LANGUAGE_ATOM) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.add_blocked_language(language, source) + return get_language_holder().add_blocked_language(language, source) /// Removes a language from the blocked language list. /atom/movable/proc/remove_blocked_language(language, source = LANGUAGE_ATOM) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.remove_blocked_language(language, source) + return get_language_holder().remove_blocked_language(language, source) /// Checks if atom has the language. If spoken is true, only checks if atom can speak the language. /atom/movable/proc/has_language(language, spoken = FALSE) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.has_language(language, spoken) + return get_language_holder().has_language(language, spoken) /// Checks if atom can speak the language. /atom/movable/proc/can_speak_language(language) - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.can_speak_language(language) - -/// Returns the result of tongue specific limitations on spoken languages. -/atom/movable/proc/could_speak_language(language) - return TRUE + return get_language_holder().can_speak_language(language) /// Returns selected language, if it can be spoken, or finds, sets and returns a new selected language if possible. /atom/movable/proc/get_selected_language() - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.get_selected_language() + return get_language_holder().get_selected_language() /// Gets a random understood language, useful for hallucinations and such. /atom/movable/proc/get_random_understood_language() - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.get_random_understood_language() + return get_language_holder().get_random_understood_language() /// Gets a random spoken language, useful for forced speech and such. /atom/movable/proc/get_random_spoken_language() - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.get_random_spoken_language() + return get_language_holder().get_random_spoken_language() /// Copies all languages into the supplied atom/language holder. Source should be overridden when you /// do not want the language overwritten by later atom updates or want to avoid blocked languages. @@ -1386,14 +1244,13 @@ if(isatom(from_holder)) var/atom/movable/thing = from_holder from_holder = thing.get_language_holder() - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.copy_languages(from_holder, source_override) + + return get_language_holder().copy_languages(from_holder, source_override) /// Empties out the atom specific languages and updates them according to the current atoms language holder. /// As a side effect, it also creates missing language holders in the process. /atom/movable/proc/update_atom_languages() - var/datum/language_holder/language_holder = get_language_holder() - return language_holder.update_atom_languages(src) + return get_language_holder().update_atom_languages(src) /* End language procs */ @@ -1401,44 +1258,6 @@ /atom/movable/proc/get_cell() return -/atom/movable/proc/can_be_pulled(user, grab_state, force) - if(src == user || !isturf(loc)) - return FALSE - if(SEND_SIGNAL(src, COMSIG_ATOM_CAN_BE_PULLED, user) & COMSIG_ATOM_CANT_PULL) - return FALSE - if(anchored || throwing) - return FALSE - if(force < (move_resist * MOVE_FORCE_PULL_RATIO)) - return FALSE - return TRUE - -/** - * Updates the grab state of the movable - * - * This exists to act as a hook for behaviour - */ -/atom/movable/proc/setGrabState(newstate) - if(newstate == grab_state) - return - SEND_SIGNAL(src, COMSIG_MOVABLE_SET_GRAB_STATE, newstate) - . = grab_state - grab_state = newstate - switch(grab_state) // Current state. - if(GRAB_PASSIVE) - REMOVE_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) - REMOVE_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT) - if(. >= GRAB_NECK) // Previous state was a a neck-grab or higher. - REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) - if(GRAB_AGGRESSIVE) - if(. >= GRAB_NECK) // Grab got downgraded. - REMOVE_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) - else // Grab got upgraded from a passive one. - ADD_TRAIT(pulling, TRAIT_IMMOBILIZED, CHOKEHOLD_TRAIT) - ADD_TRAIT(pulling, TRAIT_HANDS_BLOCKED, CHOKEHOLD_TRAIT) - if(GRAB_NECK, GRAB_KILL) - if(. <= GRAB_AGGRESSIVE) - ADD_TRAIT(pulling, TRAIT_FLOORED, CHOKEHOLD_TRAIT) - /** * Adds the deadchat_plays component to this atom with simple movement commands. * @@ -1452,6 +1271,7 @@ /atom/movable/vv_get_dropdown() . = ..() + VV_DROPDOWN_OPTION(VV_HK_EDIT_PARTICLES, "Edit Particles") VV_DROPDOWN_OPTION(VV_HK_DEADCHAT_PLAYS, "Start/Stop Deadchat Plays") VV_DROPDOWN_OPTION(VV_HK_ADD_FANTASY_AFFIX, "Add Fantasy Affix") @@ -1461,6 +1281,10 @@ if(!.) return + if(href_list[VV_HK_EDIT_PARTICLES] && check_rights(R_VAREDIT)) + var/client/C = usr.client + C?.open_particle_editor(src) + if(href_list[VV_HK_DEADCHAT_PLAYS] && check_rights(R_FUN)) if(tgui_alert(usr, "Allow deadchat to control [src] via chat commands?", "Deadchat Plays [src]", list("Allow", "Cancel")) != "Allow") return @@ -1485,3 +1309,35 @@ */ /atom/movable/proc/keybind_face_direction(direction) setDir(direction) + +/** + * Show a message to this mob (visual or audible) + * This is /atom/movable so mimics can get these and relay them to their parent. + */ +/atom/movable/proc/show_message(msg, type, alt_msg, alt_type, avoid_highlighting = FALSE) + return + +/// Tests if src can move from their current loc to an adjacent destination, without doing the move. +/atom/movable/proc/can_step_into(turf/destination) + var/current_loc = get_turf(src) + var/direction = get_dir(current_loc, destination) + if(loc) + if(!loc.Exit(src, direction, TRUE)) + return FALSE + + return destination.Enter(src, TRUE) + +/atom/movable/wash(clean_types) + . = ..() + germ_level = 0 + +/atom/movable/proc/add_passmob(source) + if(!source) + return + ADD_TRAIT(src, TRAIT_PASSMOB, source) + pass_flags |= PASSMOB + +/atom/movable/proc/remove_passmob(source) + REMOVE_TRAIT(src, TRAIT_PASSMOB, source) + if(!HAS_TRAIT(src, TRAIT_PASSMOB)) + pass_flags &= ~PASSMOB diff --git a/code/game/communications.dm b/code/game/communications.dm index 966915558725..23e953b6b8c6 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -124,6 +124,20 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( "[FREQ_CTF_YELLOW]" = RADIO_CHANNEL_CTF_YELLOW )) +/// Frequency to file name. See chat_icons.dm +GLOBAL_LIST_INIT(freq2icon, list( + "[FREQ_COMMON]" = "radio.png", + // Companies + "[FREQ_ENGINEERING]" = "eng.png", + "[FREQ_MEDICAL]" = "med.png", + "[FREQ_SUPPLY]" = "mail.png", + "[FREQ_SECURITY]" = "sec.png", + "[FREQ_COMMAND]" = "ntboss.png", + // Other + "[FREQ_AI_PRIVATE]" = "ai.png", + "[FREQ_SYNDICATE]" = "syndieboss.png", +)) + /datum/radio_frequency var/frequency /// List of filters -> list of devices @@ -149,6 +163,7 @@ GLOBAL_LIST_INIT(reverseradiochannels, list( else signal.filter_list = devices + // Store routing data for SSPackets to handle. signal.frequency_datum = src signal.range = range diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 89dbe87a9763..2f814bf574f7 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -9,11 +9,11 @@ /atom/proc/add_to_all_human_data_huds() for(var/datum/atom_hud/data/human/hud in GLOB.huds) - hud.add_to_hud(src) + hud.add_atom_to_hud(src) /atom/proc/remove_from_all_data_huds() for(var/datum/atom_hud/data/hud in GLOB.huds) - hud.remove_from_hud(src) + hud.remove_atom_from_hud(src) /datum/atom_hud/data @@ -28,16 +28,16 @@ var/obj/item/clothing/under/U = H.w_uniform if(!istype(U)) return FALSE - if(U.sensor_mode <= SENSOR_VITALS) + if(U.sensor_mode <= SENSOR_LIVING) return FALSE return TRUE -/datum/atom_hud/data/human/medical/basic/add_to_single_hud(mob/M, mob/living/carbon/H) +/datum/atom_hud/data/human/medical/basic/add_atom_to_single_mob_hud(mob/M, mob/living/carbon/H) if(check_sensors(H)) ..() /datum/atom_hud/data/human/medical/basic/proc/update_suit_sensors(mob/living/carbon/H) - check_sensors(H) ? add_to_hud(H) : remove_from_hud(H) + check_sensors(H) ? add_atom_to_hud(H) : remove_atom_from_hud(H) /datum/atom_hud/data/human/medical/advanced @@ -49,9 +49,6 @@ /datum/atom_hud/data/human/security/advanced hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) -/datum/atom_hud/data/human/fan_hud - hud_icons = list(FAN_HUD) - /datum/atom_hud/data/diagnostic /datum/atom_hud/data/diagnostic/basic @@ -61,6 +58,7 @@ hud_icons = list(DIAG_HUD, DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_BOT_HUD, DIAG_CIRCUIT_HUD, DIAG_TRACK_HUD, DIAG_AIRLOCK_HUD, DIAG_LAUNCHPAD_HUD, DIAG_PATH_HUD) /datum/atom_hud/data/bot_path + uses_global_hud_category = FALSE hud_icons = list(DIAG_PATH_HUD) /datum/atom_hud/abductor @@ -72,12 +70,13 @@ /datum/atom_hud/ai_detector hud_icons = list(AI_DETECT_HUD) -/datum/atom_hud/ai_detector/add_hud_to(mob/M) +/datum/atom_hud/ai_detector/show_to(mob/M) ..() - if(M && (hudusers.len == 1)) - for(var/V in GLOB.aiEyes) - var/mob/camera/ai_eye/E = V - E.update_ai_detect_hud() + if(!M || hud_users.len != 1) + return + + for(var/mob/camera/ai_eye/eye as anything in GLOB.aiEyes) + eye.update_ai_detect_hud() /* MED/SEC/DIAG HUD HOOKS */ @@ -164,76 +163,64 @@ Medical HUD! Basic mode needs suit sensors on. var/datum/atom_hud/data/human/medical/basic/B = GLOB.huds[DATA_HUD_MEDICAL_BASIC] B.update_suit_sensors(src) +/// Updates both the Health and Status huds. ATOM HUDS, NOT SCREEN HUDS. +/mob/living/proc/update_med_hud() + med_hud_set_health() + med_hud_set_status() + //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 + set_hud_image_vars(HEALTH_HUD, "hud[RoundHealth(src)]", get_hud_pixel_y()) -//for carbon suit sensors /mob/living/carbon/med_hud_set_health() - ..() + var/new_state = "" + if(stat == DEAD || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + new_state = "0" + else if(undergoing_cardiac_arrest()) + new_state = "flatline" + else + new_state = "[pulse()]" + + set_hud_image_vars(HEALTH_HUD, new_state, get_hud_pixel_y()) //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 + var/new_state if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - holder.icon_state = "huddead" + new_state = "huddead" else - holder.icon_state = "hudhealthy" + new_state = "hudhealthy" + + set_hud_image_vars(STATUS_HUD, new_state, get_hud_pixel_y()) /mob/living/carbon/med_hud_set_status() - var/image/holder = hud_list[STATUS_HUD] - var/icon/I = icon(icon, icon_state, dir) + var/new_state var/virus_threat = check_virus() - holder.pixel_y = I.Height() - world.icon_size + if(HAS_TRAIT(src, TRAIT_XENO_HOST)) - holder.icon_state = "hudxeno" + new_state = "hudxeno" else if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - if((key || get_ghost(FALSE, TRUE)) && (can_defib() & DEFIB_REVIVABLE_STATES)) - holder.icon_state = "huddefib" - else - holder.icon_state = "huddead" + new_state = "huddead" else switch(virus_threat) if(DISEASE_SEVERITY_BIOHAZARD) - holder.icon_state = "hudill5" + new_state = "hudill5" if(DISEASE_SEVERITY_DANGEROUS) - holder.icon_state = "hudill4" + new_state = "hudill4" if(DISEASE_SEVERITY_HARMFUL) - holder.icon_state = "hudill3" + new_state = "hudill3" if(DISEASE_SEVERITY_MEDIUM) - holder.icon_state = "hudill2" + new_state = "hudill2" if(DISEASE_SEVERITY_MINOR) - holder.icon_state = "hudill1" + new_state = "hudill1" if(DISEASE_SEVERITY_NONTHREAT) - holder.icon_state = "hudill0" + new_state = "hudill0" if(DISEASE_SEVERITY_POSITIVE) - holder.icon_state = "hudbuff" + new_state = "hudbuff" if(null) - holder.icon_state = "hudhealthy" + new_state = "hudhealthy" - -/*********************************************** -FAN HUDs! For identifying other fans on-sight. -************************************************/ - -//HOOKS - -/mob/living/carbon/human/proc/fan_hud_set_fandom() - var/image/holder = hud_list[FAN_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "hudfan_no" - var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING) - if(U) - if(istype(U.attached_accessory, /obj/item/clothing/accessory/mime_fan_pin)) - holder.icon_state = "mime_fan_pin" - else if(istype(U.attached_accessory, /obj/item/clothing/accessory/clown_enjoyer_pin)) - holder.icon_state = "clown_enjoyer_pin" + set_hud_image_vars(STATUS_HUD, new_state, get_hud_pixel_y()) /*********************************************** Security HUDs! Basic mode shows only the job. @@ -242,62 +229,60 @@ Security HUDs! Basic mode shows only the job. //HOOKS /mob/living/carbon/human/proc/sec_hud_set_ID() - var/image/holder = hud_list[ID_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size var/sechud_icon_state = wear_id?.get_sechud_job_icon_state() if(!sechud_icon_state) sechud_icon_state = "hudno_id" - holder.icon_state = sechud_icon_state + sec_hud_set_security_status() + set_hud_image_vars(ID_HUD, sechud_icon_state, get_hud_pixel_y()) /mob/living/proc/sec_hud_set_implants() - var/image/holder for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD)) - holder = hud_list[i] - holder.icon_state = null + set_hud_image_vars(i, null) + set_hud_image_inactive(i) + + var/hud_pixel_y = get_hud_pixel_y() for(var/obj/item/implant/I in implants) if(istype(I, /obj/item/implant/tracking)) - holder = hud_list[IMPTRACK_HUD] - var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size - holder.icon_state = "hud_imp_tracking" + set_hud_image_vars(IMPTRACK_HUD, "hud_imp_tracking", hud_pixel_y) + set_hud_image_active(IMPTRACK_HUD) + else if(istype(I, /obj/item/implant/chem)) - holder = hud_list[IMPCHEM_HUD] - var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size - holder.icon_state = "hud_imp_chem" + set_hud_image_vars(IMPCHEM_HUD, "hud_imp_chem", hud_pixel_y) + set_hud_image_active(IMPCHEM_HUD) + if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) - holder = hud_list[IMPLOYAL_HUD] - var/icon/IC = icon(icon, icon_state, dir) - holder.pixel_y = IC.Height() - world.icon_size - holder.icon_state = "hud_imp_loyal" + set_hud_image_vars(IMPLOYAL_HUD, "hud_imp_loyal", hud_pixel_y) + set_hud_image_active(IMPLOYAL_HUD) /mob/living/carbon/human/proc/sec_hud_set_security_status() - var/image/holder = hud_list[WANTED_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size var/perpname = get_face_name(get_id_name("")) - if(perpname && GLOB.data_core) - var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) + if(perpname && SSdatacore) + var/datum/data/record/security/R = SSdatacore.get_record_by_name(name, DATACORE_RECORDS_SECURITY) if(R) - switch(R.fields["criminal"]) - if("*Arrest*") - holder.icon_state = "hudwanted" - return - if("Incarcerated") - holder.icon_state = "hudincarcerated" - return - if("Suspected") - holder.icon_state = "hudsuspected" - return - if("Paroled") - holder.icon_state = "hudparolled" - return - if("Discharged") - holder.icon_state = "huddischarged" - return - holder.icon_state = null + var/new_state + var/has_criminal_entry = TRUE + switch(R.fields[DATACORE_CRIMINAL_STATUS]) + if(CRIMINAL_WANTED) + new_state = "hudwanted" + if(CRIMINAL_INCARCERATED) + new_state = "hudincarcerated" + if(CRIMINAL_SUSPECT) + new_state = "hudsuspected" + if(CRIMINAL_PAROLE) + new_state = "hudparolled" + if(CRIMINAL_DISCHARGED) + new_state = "huddischarged" + else + has_criminal_entry = FALSE + + if(has_criminal_entry) + set_hud_image_vars(WANTED_HUD, new_state, get_hud_pixel_y()) + set_hud_image_active(WANTED_HUD) + return + + set_hud_image_vars(WANTED_HUD, null) + set_hud_image_inactive(WANTED_HUD) /*********************************************** Diagnostic HUDs! @@ -321,94 +306,112 @@ Diagnostic HUDs! else return "dead" +/// Returns a pixel_y value to use for hud code +/atom/proc/get_hud_pixel_y() + SHOULD_NOT_OVERRIDE(TRUE) + var/static/hud_icon_height_cache = list() + if(isnull(icon)) + return 0 + + . = hud_icon_height_cache[icon] + + if(!isnull(.)) // 0 is valid + return . + + var/icon/I + I = icon(icon, icon_state, dir) + . = I.Height() - world.icon_size + + if(isfile(icon) && length("[icon]")) // Do NOT cache icon instances, only filepaths + hud_icon_height_cache[icon] = . + //Sillycone hooks /mob/living/silicon/proc/diag_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(stat == DEAD) - holder.icon_state = "huddiagdead" + new_state = "huddiagdead" else - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + new_state = "huddiag[RoundDiagBar(health/maxHealth)]" + + set_hud_image_vars(DIAG_HUD, new_state, get_hud_pixel_y()) /mob/living/silicon/proc/diag_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state switch(stat) if(CONSCIOUS) - holder.icon_state = "hudstat" - if(UNCONSCIOUS, HARD_CRIT) - holder.icon_state = "hudoffline" + new_state = "hudstat" + if(UNCONSCIOUS) + new_state = "hudoffline" else - holder.icon_state = "huddead2" + new_state = "huddead2" + + set_hud_image_vars(DIAG_STAT_HUD, new_state, get_hud_pixel_y()) //Borgie battery tracking! /mob/living/silicon/robot/proc/diag_hud_set_borgcell() - var/image/holder = hud_list[DIAG_BATT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(cell) var/chargelvl = (cell.charge/cell.maxcharge) - holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" + new_state = "hudbatt[RoundDiagBar(chargelvl)]" else - holder.icon_state = "hudnobatt" + new_state = "hudnobatt" + + set_hud_image_vars(DIAG_BATT_HUD, new_state, get_hud_pixel_y()) //borg-AI shell tracking /mob/living/silicon/robot/proc/diag_hud_set_aishell() //Shows tracking beacons on the mech - 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(!shell) //Not an AI shell - holder.icon_state = null - else if(deployed) //AI shell in use by an AI - holder.icon_state = "hudtrackingai" + set_hud_image_vars(DIAG_TRACK_HUD, null) + set_hud_image_inactive(DIAG_TRACK_HUD) + return + + var/new_state + if(deployed) //AI shell in use by an AI + new_state = "hudtrackingai" else //Empty AI shell - holder.icon_state = "hudtracking" + new_state = "hudtracking" + + set_hud_image_active(DIAG_TRACK_HUD) + set_hud_image_vars(DIAG_TRACK_HUD, new_state, get_hud_pixel_y()) //AI side tracking of AI shell control /mob/living/silicon/ai/proc/diag_hud_set_deployed() //Shows tracking beacons on the mech - 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(!deployed_shell) - holder.icon_state = null + set_hud_image_vars(DIAG_TRACK_HUD, null) + set_hud_image_inactive(DIAG_TRACK_HUD) + else //AI is currently controlling a shell - holder.icon_state = "hudtrackingai" + set_hud_image_vars(DIAG_TRACK_HUD, "hudtrackingai", get_hud_pixel_y()) + set_hud_image_active(DIAG_TRACK_HUD) /*~~~~~~~~~~~~~~~~~~~~ BIG STOMPY MECHS ~~~~~~~~~~~~~~~~~~~~~*/ /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechhealth() - var/image/holder = hud_list[DIAG_MECH_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(atom_integrity/max_integrity)]" + set_hud_image_vars(DIAG_MECH_HUD, "huddiag[RoundDiagBar(atom_integrity/max_integrity)]", get_hud_pixel_y()) /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechcell() - var/image/holder = hud_list[DIAG_BATT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(cell) var/chargelvl = cell.charge/cell.maxcharge - holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" + new_state = "hudbatt[RoundDiagBar(chargelvl)]" else - holder.icon_state = "hudnobatt" + new_state = "hudnobatt" + set_hud_image_vars(DIAG_BATT_HUD, new_state, get_hud_pixel_y()) /obj/vehicle/sealed/mecha/proc/diag_hud_set_mechstat() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = null if(internal_damage) - holder.icon_state = "hudwarn" + set_hud_image_vars(DIAG_STAT_HUD, "hudwarn", get_hud_pixel_y()) + set_hud_image_active(DIAG_STAT_HUD) + return + + set_hud_image_vars(DIAG_STAT_HUD, null) + set_hud_image_inactive(DIAG_STAT_HUD) -/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechtracking() //Shows tracking beacons on the mech - var/image/holder = hud_list[DIAG_TRACK_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size +///Shows tracking beacons on the mech +/obj/vehicle/sealed/mecha/proc/diag_hud_set_mechtracking() var/new_icon_state //This var exists so that the holder's icon state is set only once in the event of multiple mech beacons. for(var/obj/item/mecha_parts/mecha_tracking/T in trackers) if(T.ai_beacon) //Beacon with AI uplink @@ -416,66 +419,65 @@ Diagnostic HUDs! break //Immediately terminate upon finding an AI beacon to ensure it is always shown over the normal one, as mechs can have several trackers. else new_icon_state = "hudtracking" - holder.icon_state = new_icon_state + + set_hud_image_vars(DIAG_TRACK_HUD, new_icon_state, get_hud_pixel_y()) /*~~~~~~~~~ Bots! ~~~~~~~~~~*/ /mob/living/simple_animal/bot/proc/diag_hud_set_bothealth() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + set_hud_image_vars(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]", get_hud_pixel_y()) /mob/living/simple_animal/bot/proc/diag_hud_set_botstat() //On (With wireless on or off), Off, EMP'ed - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(bot_mode_flags & BOT_MODE_ON) - holder.icon_state = "hudstat" + new_state = "hudstat" else if(stat) //Generally EMP causes this - holder.icon_state = "hudoffline" + new_state = "hudoffline" else //Bot is off - holder.icon_state = "huddead2" + new_state = "huddead2" + + set_hud_image_vars(DIAG_STAT_HUD, new_state, get_hud_pixel_y()) /mob/living/simple_animal/bot/proc/diag_hud_set_botmode() //Shows a bot's current operation - var/image/holder = hud_list[DIAG_BOT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size if(client) //If the bot is player controlled, it will not be following mode logic! - holder.icon_state = "hudsentient" + set_hud_image_vars(DIAG_BOT_HUD, "hudsentient", get_hud_pixel_y()) return + var/new_state switch(mode) if(BOT_SUMMON, BOT_RESPONDING) //Responding to PDA or AI summons - holder.icon_state = "hudcalled" + new_state = "hudcalled" if(BOT_CLEANING, BOT_REPAIRING, BOT_HEALING) //Cleanbot cleaning, Floorbot fixing, or Medibot Healing - holder.icon_state = "hudworking" + new_state = "hudworking" if(BOT_PATROL, BOT_START_PATROL) //Patrol mode - holder.icon_state = "hudpatrol" + new_state = "hudpatrol" if(BOT_PREP_ARREST, BOT_ARREST, BOT_HUNT) //STOP RIGHT THERE, CRIMINAL SCUM! - holder.icon_state = "hudalert" + new_state = "hudalert" if(BOT_MOVING, BOT_DELIVER, BOT_GO_HOME, BOT_NAV) //Moving to target for normal bots, moving to deliver or go home for MULES. - holder.icon_state = "hudmove" + new_state = "hudmove" else - holder.icon_state = "" + new_state = "" + + set_hud_image_vars(DIAG_BOT_HUD, new_state, get_hud_pixel_y()) /mob/living/simple_animal/bot/mulebot/proc/diag_hud_set_mulebotcell() - var/image/holder = hud_list[DIAG_BATT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(cell) var/chargelvl = (cell.charge/cell.maxcharge) - holder.icon_state = "hudbatt[RoundDiagBar(chargelvl)]" + new_state = "hudbatt[RoundDiagBar(chargelvl)]" else - holder.icon_state = "hudnobatt" + new_state = "hudnobatt" + + set_hud_image_vars(DIAG_BATT_HUD, new_state, get_hud_pixel_y()) /*~~~~~~~~~~~~ Airlocks! ~~~~~~~~~~~~~*/ /obj/machinery/door/airlock/proc/diag_hud_set_electrified() - var/image/holder = hud_list[DIAG_AIRLOCK_HUD] - if(secondsElectrified != MACHINE_NOT_ELECTRIFIED) - holder.icon_state = "electrified" - else - holder.icon_state = "" + if(secondsElectrified == MACHINE_NOT_ELECTRIFIED) + set_hud_image_inactive(DIAG_AIRLOCK_HUD) + return + + set_hud_image_vars(DIAG_AIRLOCK_HUD, "electrified") + set_hud_image_active(DIAG_AIRLOCK_HUD) diff --git a/code/game/gamemodes/bloodbrothers.dm b/code/game/gamemodes/bloodbrothers.dm new file mode 100644 index 000000000000..1f2480a2561f --- /dev/null +++ b/code/game/gamemodes/bloodbrothers.dm @@ -0,0 +1,59 @@ +///What percentage of the crew can become bros :flooshed:. +#define BROTHER_SCALING_COEFF 0.15 +//The minimum amount of people in a blood brothers team. Set this below 2 and you're stupid. +#define BROTHER_MINIMUM_TEAM_SIZE 2 + +/datum/game_mode/brothers + name = "Blood Brothers" + + weight = GAMEMODE_WEIGHT_RARE + required_enemies = BROTHER_MINIMUM_TEAM_SIZE + + restricted_jobs = list(JOB_CYBORG, JOB_AI) + protected_jobs = list( + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_MEDICAL_DIRECTOR + ) + + antag_datum = /datum/antagonist/brother + antag_flag = ROLE_BROTHER + + var/list/datum/team/brother_team/pre_brother_teams = list() + +/datum/game_mode/brothers/pre_setup() + . = ..() + + var/num_teams = max(1, round((length(SSticker.ready_players) * BROTHER_SCALING_COEFF) / BROTHER_MINIMUM_TEAM_SIZE)) + + for(var/j in 1 to num_teams) + if(length(possible_antags) < BROTHER_MINIMUM_TEAM_SIZE) //This shouldn't ever happen but, just in case + break + + var/datum/team/brother_team/team = new + // 10% chance to add 1 more member + var/team_size = prob(10) ? min(BROTHER_MINIMUM_TEAM_SIZE + 1, possible_antags) : BROTHER_MINIMUM_TEAM_SIZE + + for(var/k in 1 to team_size) + var/mob/bro = pick_n_take(possible_antags) + team.add_member(bro.mind) + select_antagonist(bro.mind) + + pre_brother_teams += team + +/datum/game_mode/brothers/setup_antags() + for(var/datum/team/brother_team/team in pre_brother_teams) + team.pick_meeting_area() + team.forge_brother_objectives() + team.update_name() + + return ..() + +/datum/game_mode/brothers/give_antag_datums() + for(var/datum/team/brother_team/team in pre_brother_teams) + for(var/datum/mind/M in team.members) + M.add_antag_datum(/datum/antagonist/brother, team) diff --git a/code/game/gamemodes/bloodcult.dm b/code/game/gamemodes/bloodcult.dm new file mode 100644 index 000000000000..58a6ab75c577 --- /dev/null +++ b/code/game/gamemodes/bloodcult.dm @@ -0,0 +1,49 @@ +///What percentage of the crew can become culists. +#define CULT_SCALING_COEFF 0.15 + +/datum/game_mode/bloodcult + name = "Blood Cult" + + weight = GAMEMODE_WEIGHT_EPIC + min_pop = 30 + required_enemies = 2 + + restricted_jobs = list( + JOB_AI, + JOB_CAPTAIN, + JOB_CHAPLAIN, + JOB_CYBORG, + JOB_DETECTIVE, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_PRISONER, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + + antag_datum = /datum/antagonist/cult + antag_flag = ROLE_CULTIST + ///The cult created by the gamemode. + var/datum/team/cult/main_cult + +/datum/game_mode/bloodcult/pre_setup() + . = ..() + + var/num_cultists = 1 + + num_cultists = max(1, round(length(SSticker.ready_players) * CULT_SCALING_COEFF)) + + for (var/i in 1 to num_cultists) + if(possible_antags.len <= 0) + break + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) + +/datum/game_mode/bloodcult/set_round_result() + . = ..() + if(main_cult.check_cult_victory()) + SSticker.mode_result = "win - cult win" + SSticker.news_report = CULT_SUMMON + else + SSticker.mode_result = "loss - staff stopped the cult" + SSticker.news_report = CULT_FAILURE diff --git a/code/game/gamemodes/changelings.dm b/code/game/gamemodes/changelings.dm new file mode 100644 index 000000000000..efa2d7496b5a --- /dev/null +++ b/code/game/gamemodes/changelings.dm @@ -0,0 +1,33 @@ +///What percentage of the crew can become changelings. +#define CHANGELING_SCALING_COEFF 0.1 + +/datum/game_mode/changeling + name = "Changeling" + + weight = GAMEMODE_WEIGHT_NEVER + restricted_jobs = list(JOB_CYBORG, JOB_AI) + protected_jobs = list( + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_MEDICAL_DIRECTOR + ) + + antag_datum = /datum/antagonist/changeling + antag_flag = ROLE_CHANGELING + +/datum/game_mode/changeling/pre_setup() + . = ..() + + var/num_ling = 1 + + num_ling = max(1, round(length(SSticker.ready_players) * CHANGELING_SCALING_COEFF)) + + for (var/i in 1 to num_ling) + if(possible_antags.len <= 0) + break + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 4a95fb9240c1..773ce7338859 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -18,6 +18,9 @@ GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /datum/game_mode/dynamic + name = "Dynamic" + required_enemies = 0 + // Threat logging vars /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations var/threat_level = 0 @@ -73,19 +76,19 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) var/latejoin_injection_cooldown = 0 /// The minimum time the recurring latejoin ruleset timer is allowed to be. - var/latejoin_delay_min = (5 MINUTES) + var/latejoin_delay_min = (30 MINUTES) /// The maximum time the recurring latejoin ruleset timer is allowed to be. - var/latejoin_delay_max = (25 MINUTES) + var/latejoin_delay_max = (60 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) + var/midround_delay_min = (60 MINUTES) /// The maximum time the recurring midround ruleset timer is allowed to be. - var/midround_delay_max = (35 MINUTES) + var/midround_delay_max = (90 MINUTES) /// If above this threat, increase the chance of injection var/higher_injection_chance_minimum_threat = 70 @@ -102,30 +105,30 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) /// 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 + var/threat_curve_centre = -2.5 /// 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 + var/threat_curve_width = 1 /// 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 + var/roundstart_split_curve_centre = 3.8 /// 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 + var/roundstart_split_curve_width = 0.5 /// The minimum amount of time for antag random events to be hijacked. - var/random_event_hijack_minimum = 10 MINUTES + var/random_event_hijack_minimum = 20 MINUTES /// The maximum amount of time for antag random events to be hijacked. - var/random_event_hijack_maximum = 18 MINUTES + var/random_event_hijack_maximum = 40 MINUTES /// A list of recorded "snapshots" of the round, stored in the dynamic.json log var/list/datum/dynamic_snapshot/snapshots @@ -257,6 +260,15 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return rule.round_result() return ..() +/datum/game_mode/dynamic/check_finished(force_ending) + . = ..() + if(.) + return + + for(var/datum/dynamic_ruleset/ruleset as anything in executed_rules) + if(ruleset.check_finished()) + return TRUE + /datum/game_mode/dynamic/proc/send_intercept() . = "Central Command Status Summary
" switch(round(shown_threat)) @@ -366,10 +378,11 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) 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("[global.config.directory]/dynamic.json") - if(fexists(json_file)) - configuration = json_decode(file2text(json_file)) + var/json_file = rustg_file_read("[global.config.directory]/dynamic.json") + if(json_file) + configuration = json_decode(json_file) if(configuration["Dynamic"]) for(var/variable in configuration["Dynamic"]) if(!(variable in vars)) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 828141014e60..0559c1e1c145 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -123,7 +123,7 @@ 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) + if(antag_fraction < 0.15) scaled_times += 1 antag_fraction += get_antag_cap(population) / mode.roundstart_pop_ready // we added new antags, gotta update the % @@ -184,6 +184,10 @@ /datum/dynamic_ruleset/proc/trim_candidates() return +/// Returns TRUE if the round should end. +/datum/dynamic_ruleset/proc/check_finished() + return FALSE + /// Set mode result and news report here. /// Only called if ruleset is flagged as HIGH_IMPACT_RULESET /datum/dynamic_ruleset/proc/round_result() diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index 5f0985765ecf..aa53244fab78 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -54,9 +54,8 @@ antag_flag_override = ROLE_TRAITOR protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -86,13 +85,12 @@ JOB_AI, JOB_CAPTAIN, JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER, + JOB_MEDICAL_DIRECTOR, JOB_CYBORG, JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, - JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -101,7 +99,7 @@ JOB_CYBORG, JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -126,8 +124,9 @@ return FALSE var/head_check = 0 for(var/mob/player in GLOB.alive_player_list) - if (player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if (player.mind.assigned_role.departments_bitflags & (DEPARTMENT_BITFLAG_COMPANY_LEADER)) head_check++ + return (head_check >= required_heads_of_staff) /datum/dynamic_ruleset/latejoin/provocateur/execute() @@ -138,7 +137,6 @@ 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() @@ -151,13 +149,16 @@ return FALSE /datum/dynamic_ruleset/latejoin/provocateur/rule_process() - var/winner = revolution.process_victory(revs_win_threat_injection) + var/winner = revolution.check_completion() if (isnull(winner)) return finished = winner return RULESET_STOP_PROCESSING +/datum/dynamic_ruleset/latejoin/provocateur/check_finished() + return !!finished + /// Checks for revhead loss conditions and other antag datums. /datum/dynamic_ruleset/latejoin/provocateur/proc/check_eligible(datum/mind/M) var/turf/T = get_turf(M.current) @@ -181,9 +182,8 @@ antag_flag_override = ROLE_HERETIC protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 9e5432fe5c52..f991148ee643 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -187,9 +187,8 @@ antag_flag_override = ROLE_TRAITOR protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -272,8 +271,7 @@ JOB_CYBORG, JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -342,9 +340,7 @@ enemy_roles = list( JOB_CHEMIST, JOB_CHIEF_ENGINEER, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, - JOB_SCIENTIST, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -402,7 +398,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -441,7 +437,7 @@ JOB_CYBORG, JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(3,3,3,3,3,2,1,1,0,0) @@ -488,7 +484,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -511,7 +507,7 @@ protected_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -524,7 +520,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -567,7 +563,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -581,7 +577,7 @@ /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() // 50% chance of being incremented by one required_candidates += prob(50) - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) + for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent as anything in INSTANCES_OF(/obj/machinery/atmospherics/components/unary/vent_pump)) if(QDELETED(temp_vent)) continue if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) @@ -619,7 +615,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -670,7 +666,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -719,7 +715,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -749,78 +745,6 @@ #undef ABDUCTOR_MAX_TEAMS -////////////////////////////////////////////// -// // -// SPACE NINJA (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja - name = "Space Ninja" - antag_datum = /datum/antagonist/ninja - antag_flag = ROLE_NINJA - enemy_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_SECURITY_OFFICER, - ) - 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) - repeatable = TRUE - var/list/spawn_locs = list() - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/execute() - for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list) - if(!isturf(carp_spawn.loc)) - stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]") - continue - spawn_locs += carp_spawn.loc - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - return ..() - -/datum/dynamic_ruleset/midround/from_ghosts/space_ninja/generate_ruleset_body(mob/applicant) - var/mob/living/carbon/human/ninja = create_space_ninja(pick(spawn_locs)) - ninja.key = applicant.key - ninja.mind.add_antag_datum(/datum/antagonist/ninja) - - message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a Space Ninja by the midround ruleset.") - log_game("DYNAMIC: [key_name(ninja)] was spawned as a Space Ninja by the midround ruleset.") - return ninja - -////////////////////////////////////////////// -// // -// SPIDERS (GHOST) // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/midround/spiders - name = "Spiders" - antag_flag = ROLE_SPIDER - required_type = /mob/dead/observer - enemy_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_SECURITY_OFFICER, - ) - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 0 - weight = 3 - cost = 10 - requirements = list(101,101,101,80,60,50,30,20,10,10) - repeatable = TRUE - var/spawncount = 2 - -/datum/dynamic_ruleset/midround/spiders/execute() - create_midwife_eggs(spawncount) - return ..() - /// Revenant ruleset /datum/dynamic_ruleset/midround/from_ghosts/revenant name = "Revenant" @@ -829,7 +753,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -891,33 +815,6 @@ log_game("[key_name(virus)] was spawned as a sentient disease by the midround ruleset.") return virus -/// Space Pirates ruleset -/datum/dynamic_ruleset/midround/pirates - name = "Space Pirates" - antag_flag = "Space Pirates" - required_type = /mob/dead/observer - enemy_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_SECURITY_OFFICER, - ) - required_enemies = list(2,2,1,1,1,1,1,0,0,0) - required_candidates = 0 - weight = 4 - cost = 10 - requirements = list(101,101,101,80,60,50,30,20,10,10) - repeatable = TRUE - -/datum/dynamic_ruleset/midround/pirates/acceptable(population=0, threat=0) - if (!SSmapping.empty_space) - return FALSE - return ..() - -/datum/dynamic_ruleset/midround/pirates/execute() - send_pirate_threat() - return ..() - /// Obsessed ruleset /datum/dynamic_ruleset/midround/obsessed name = "Obsessed" @@ -931,7 +828,7 @@ enemy_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, ) required_enemies = list(2,2,1,1,1,1,1,0,0,0) @@ -964,59 +861,6 @@ log_game("[key_name(obsessed)] was made Obsessed by the midround ruleset.") return ..() -/// Thief ruleset -/datum/dynamic_ruleset/midround/opportunist - name = "Opportunist" - antag_datum = /datum/antagonist/thief - antag_flag = ROLE_OPPORTUNIST - antag_flag_override = ROLE_THIEF - protected_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_PRISONER, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - restricted_roles = list( - JOB_AI, - JOB_CYBORG, - ROLE_POSITRONIC_BRAIN, - ) - required_candidates = 1 - weight = 0 // Disabled until Dynamic midround rolling handles minor threats better - cost = 3 //Worth less than obsessed, but there's more of them. - requirements = list(10,10,10,10,10,10,10,10,10,10) - repeatable = TRUE - -/datum/dynamic_ruleset/midround/opportunist/trim_candidates() - ..() - candidates = living_players - for(var/mob/living/carbon/human/candidate in candidates) - var/list/client_antags = candidate.client?.prefs.read_preference(/datum/preference/blob/antagonists) - if( \ - //no bigger antagonists getting smaller role - candidate.mind && (candidate.mind.special_role || candidate.mind.antag_datums?.len > 0) \ - //no dead people - || candidate.stat == DEAD \ - //no people who don't want it - || !(client_antags?[ROLE_OPPORTUNIST]) \ - //no non-station crew - || candidate.mind.assigned_role.faction != FACTION_STATION \ - //stops thief being added to admins messing around on centcom - || is_centcom_level(candidate.z) \ - ) - candidates -= candidate - -/datum/dynamic_ruleset/midround/opportunist/execute() - if(!candidates || !candidates.len) - return FALSE - var/mob/living/carbon/human/thief = pick_n_take(candidates) - thief.mind.add_antag_datum(antag_datum) - message_admins("[ADMIN_LOOKUPFLW(thief)] has been made a Thief by the midround ruleset.") - log_game("[key_name(thief)] was made a Thief by the midround ruleset.") - return ..() - /// Probability the AI going malf will be accompanied by an ion storm announcement and some ion laws. #undef MALF_ION_PROB /// The probability to replace an existing law with an ion law instead of adding a new ion law. diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 283ef8644c14..1bf5033eedbd 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -13,8 +13,7 @@ minimum_required_age = 0 protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -94,7 +93,7 @@ new_malf.mind.special_role = ROLE_MALF GLOB.pre_setup_antags += new_malf.mind // We need an AI for the malf roundstart ruleset to execute. This means that players who get selected as malf AI get priority, because antag selection comes before role selection. - LAZYADDASSOC(SSjob.dynamic_forced_occupations, new_malf, "AI") + LAZYADDASSOC(SSjob.dynamic_forced_occupations, new_malf, JOB_AI) return TRUE ////////////////////////////////////////// @@ -109,8 +108,8 @@ antag_datum = /datum/antagonist/brother protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_DETECTIVE, // The detective works alone + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -169,7 +168,7 @@ protected_roles = list( JOB_CAPTAIN, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -205,6 +204,13 @@ GLOB.pre_setup_antags -= changeling return TRUE +/datum/dynamic_ruleset/roundstart/changeling/trim_candidates() + ..() + for(var/mob/dead/new_player/candidate_player as anything in candidates) + var/datum/preferences/prefs = candidate_player.client?.prefs + if(!prefs || ispath(prefs.read_preference(/datum/preference/choiced/species), /datum/species/ipc)) + candidates -= candidate_player + ////////////////////////////////////////////// // // // HERETICS // @@ -217,8 +223,8 @@ antag_datum = /datum/antagonist/heretic protected_roles = list( JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, + JOB_DETECTIVE, // It's up to him to investigate eldritch evil. + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -275,7 +281,7 @@ minimum_required_age = 14 restricted_roles = list( JOB_CAPTAIN, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, ) // 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 @@ -326,7 +332,7 @@ JOB_CYBORG, JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, JOB_SECURITY_OFFICER, JOB_WARDEN, @@ -390,7 +396,7 @@ minimum_required_age = 14 restricted_roles = list( JOB_CAPTAIN, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, ) // 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 @@ -480,13 +486,12 @@ JOB_AI, JOB_CAPTAIN, JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER, + JOB_MEDICAL_DIRECTOR, JOB_CYBORG, JOB_DETECTIVE, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, + JOB_SECURITY_MARSHAL, JOB_PRISONER, - JOB_RESEARCH_DIRECTOR, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -525,7 +530,6 @@ 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 @@ -544,13 +548,16 @@ ..() /datum/dynamic_ruleset/roundstart/revs/rule_process() - var/winner = revolution.process_victory(revs_win_threat_injection) + var/winner = revolution.check_completion() if (isnull(winner)) return finished = winner return RULESET_STOP_PROCESSING +/datum/dynamic_ruleset/roundstart/revs/check_finished() + return !!finished + /// Checks for revhead loss conditions and other antag datums. /datum/dynamic_ruleset/roundstart/revs/proc/check_eligible(datum/mind/M) var/turf/T = get_turf(M.current) @@ -581,8 +588,7 @@ JOB_CAPTAIN, JOB_CYBORG, JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_MARSHAL, JOB_SECURITY_OFFICER, JOB_WARDEN, ) @@ -659,7 +665,7 @@ /datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute() . = ..() if(.) - var/obj/machinery/nuclearbomb/syndicate/syndicate_nuke = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/syndicate/syndicate_nuke = locate() in INSTANCES_OF(/obj/machinery/nuclearbomb) if(syndicate_nuke) var/turf/nuke_turf = get_turf(syndicate_nuke) if(nuke_turf) @@ -703,72 +709,3 @@ var/ramp_up_final = clamp(round(meteorminutes/rampupdelta), 1, 10) spawn_meteors(ramp_up_final, wavetype) - -/// Ruleset for thieves -/datum/dynamic_ruleset/roundstart/thieves - name = "Thieves" - antag_flag = ROLE_THIEF - antag_datum = /datum/antagonist/thief - protected_roles = list( - JOB_CAPTAIN, - JOB_DETECTIVE, - JOB_HEAD_OF_SECURITY, - JOB_PRISONER, - JOB_SECURITY_OFFICER, - JOB_WARDEN, - ) - restricted_roles = list( - JOB_AI, - JOB_CYBORG, - ) - required_candidates = 1 - weight = 3 - cost = 4 //very cheap cost for the round - scaling_cost = 0 - requirements = list(8,8,8,8,8,8,8,8,8,8) - antag_cap = list("denominator" = 24, "offset" = 2) - flags = LONE_RULESET - -/datum/dynamic_ruleset/roundstart/thieves/pre_execute(population) - . = ..() - var/num_thieves = get_antag_cap(population) * (scaled_times + 1) - for (var/i = 1 to num_thieves) - if(candidates.len <= 0) - break - var/mob/chosen_mind = pick_n_take(candidates) - assigned += chosen_mind.mind - chosen_mind.mind.restricted_roles = restricted_roles - chosen_mind.mind.special_role = ROLE_THIEF - GLOB.pre_setup_antags += chosen_mind.mind - return TRUE - -/datum/dynamic_ruleset/roundstart/thieves/execute() - for(var/datum/mind/chosen_mind as anything in assigned) - var/datum/antagonist/thief/new_antag = new antag_datum - chosen_mind.add_antag_datum(new_antag) - GLOB.pre_setup_antags -= chosen_mind - return TRUE - -/// Ruleset for Nations -/datum/dynamic_ruleset/roundstart/nations - name = "Nations" - required_candidates = 0 - weight = 0 //admin only (and for good reason) - cost = 0 - flags = LONE_RULESET | ONLY_RULESET - -/datum/dynamic_ruleset/roundstart/nations/execute() - . = ..() - //notably assistant is not in this list to prevent the round turning into BARBARISM instantly, and silicon is in this list for UN - var/list/department_types = list( - /datum/job_department/silicon, //united nations - /datum/job_department/cargo, - /datum/job_department/engineering, - /datum/job_department/medical, - /datum/job_department/science, - /datum/job_department/security, - /datum/job_department/service, - ) - - for(var/department_type in department_types) - create_separatist_nation(department_type, announcement = FALSE, dangerous = FALSE, message_admins = FALSE) diff --git a/code/game/gamemodes/dynamic/dynamic_simulations.dm b/code/game/gamemodes/dynamic/dynamic_simulations.dm index 9605a341a56f..dbb7afb149ec 100644 --- a/code/game/gamemodes/dynamic/dynamic_simulations.dm +++ b/code/game/gamemodes/dynamic/dynamic_simulations.dm @@ -51,13 +51,22 @@ var/datum/dynamic_ruleset/ruleset = _ruleset total_antags += ruleset.assigned.len + var/ruleset_list = list() + for(var/datum/dynamic_ruleset/rule in gamemode.executed_rules) + ruleset_list[rule.name] = list( + "scaled" = rule.scaled_times, + "antags" = rule.assigned.len + ) + return list( "roundstart_players" = config.roundstart_players, "threat_level" = gamemode.threat_level, + "roundstart budget" = gamemode.initial_round_start_budget, + "roundstart budget %" = gamemode.initial_round_start_budget / gamemode.threat_level * 100, + "midround budget" = gamemode.mid_round_budget, "snapshot" = list( "antag_percent" = total_antags / config.roundstart_players, - "remaining_threat" = gamemode.mid_round_budget, - "rulesets" = gamemode.executed_rules.Copy(), + "rulesets" = ruleset_list, ), ) @@ -98,7 +107,9 @@ log_world("[count]/[simulations]") message_admins("Writing file...") - WRITE_FILE(file("[GLOB.log_directory]/dynamic_simulations.json"), json_encode(outputs)) + if(fexists("data/dynamic_simulations.json")) + fdel("data/dynamic_simulations.json") + WRITE_FILE(file("data/dynamic_simulations.json"), json_encode(outputs)) message_admins("Writing complete.") /proc/export_dynamic_json_of(ruleset_list) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 05c4f913a152..7faf5a01b17b 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -1,6 +1,6 @@ /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.", sound_type = ANNOUNCER_POWEROFF) - for(var/obj/machinery/power/smes/S in GLOB.machines) + for(var/obj/machinery/power/smes/S as anything in INSTANCES_OF(/obj/machinery/power/smes)) if(istype(get_area(S), /area/station/ai_monitored/turret_protected) || !is_station_level(S.z)) continue S.charge = 0 @@ -20,7 +20,7 @@ A.power_environ = FALSE A.power_change() - for(var/obj/machinery/power/apc/C in GLOB.apcs_list) + for(var/obj/machinery/power/apc/C as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(C.cell && is_station_level(C.z)) var/area/A = C.area if(GLOB.typecache_powerfailure_safe_areas[A.type]) @@ -31,11 +31,12 @@ /proc/power_restore() priority_announce("Power has been restored to [station_name()]. We apologize for the inconvenience.", sound_type = ANNOUNCER_POWERON) - for(var/obj/machinery/power/apc/C in GLOB.machines) + for(var/obj/machinery/power/apc/C as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(C.cell && is_station_level(C.z)) C.cell.charge = C.cell.maxcharge COOLDOWN_RESET(C, failure_timer) - for(var/obj/machinery/power/smes/S in GLOB.machines) + + for(var/obj/machinery/power/smes/S as anything in INSTANCES_OF(/obj/machinery/power/smes)) if(!is_station_level(S.z)) continue S.charge = S.capacity @@ -55,7 +56,7 @@ /proc/power_restore_quick() priority_announce("All SMESs on [station_name()] have been recharged. We apologize for the inconvenience.", sound_type = ANNOUNCER_POWERON) - for(var/obj/machinery/power/smes/S in GLOB.machines) + for(var/obj/machinery/power/smes/S as anything in INSTANCES_OF(/obj/machinery/power/smes)) if(!is_station_level(S.z)) continue S.charge = S.capacity diff --git a/code/game/gamemodes/extended.dm b/code/game/gamemodes/extended.dm new file mode 100644 index 000000000000..d2ab9f8b7268 --- /dev/null +++ b/code/game/gamemodes/extended.dm @@ -0,0 +1,6 @@ +/datum/game_mode/extended + name = "Extended" + weight = GAMEMODE_WEIGHT_NEVER + + min_pop = 0 + required_enemies = 0 diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 2b64d9e53445..b464a79ac575 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -13,13 +13,152 @@ /datum/game_mode + datum_flags = DF_ISPROCESSING -///Attempts to select players for special roles the mode might have. + var/name = "oh god oh fuck what did you do" + /// This is a WEIGHT not a PROBABILITY + var/weight = GAMEMODE_WEIGHT_NEVER + ///Is the gamemode votable? !Not implimented! + var/votable = FALSE + + ///Dynamically set to what the problem was. Or the first problem, anyway. + var/setup_error = "" + + ///The minimum players this gamemode can roll + var/min_pop = 1 + ///The maximum players this gamemode can roll + var/max_pop = INFINITY + ///The number of antag players required for this round type to be considered + var/required_enemies = 1 + ///The recommended number of antag players for this round type + var/recommended_enemies = 0 + + ///Typepath of the antagonist datum to hand out at round start + var/datum/antagonist/antag_datum + + ///A list of jobs cannot physically be this antagonist, typically AI and borgs. + var/list/restricted_jobs = null + ///A list of jobs that should not be this antagonist + var/list/protected_jobs = null + ///Jobs required for this round type to function, k:v list of JOB_TITLE : NUM_JOB. list(list(cap=1),list(hos=1,sec=2)) translates to one captain OR one hos and two secmans + var/list/required_jobs = null + /// If set, rule will only accept candidates from those roles. If on a roundstart ruleset, requires the player to have the correct antag pref enabled and any of the possible roles enabled. + var/list/exclusive_roles = null + + ///The antagonist flag to check player prefs for, for example ROLE_WIZARD + var/antag_flag = NONE + /// If a role is to be considered another for the purpose of banning. + var/antag_flag_to_ban_check = NONE + /// If set, will check this preference instead of antag_flag. + var/antag_preference = null + /// Even if the mode has no antag datum, force possible_antags to be built + var/force_pre_setup_check = FALSE + + ///A list of minds that are elligible to be given antagonist at roundstart + var/list/datum/mind/possible_antags = list() + ///ALL antagonists, not just the roundstart ones + var/list/datum/mind/antagonists = list() + ///A k:v list of mind:time of death. + var/list/datum/mind/death_timers = list() + ///A list of names of antagonists who are permanantly. This list will be cut down to spend on midrounds. + var/list/permadead_antag_pool = list() + +///Pass in a list of players about to participate in roundstart, returns an error as a string if the round cannot start. +/datum/game_mode/proc/check_for_errors() + SHOULD_CALL_PARENT(TRUE) + if(length(SSticker.ready_players) < min_pop) //Population is too high or too low to run + return "Not enough players, [min_pop] players needed." + + else if(length(SSticker.ready_players) > max_pop) + return "Too many players, less than [max_pop + 1] players needed." + + var/list/antag_candidates = trim_candidates(SSticker.ready_players.Copy()) + if(length(antag_candidates) < required_enemies) //Not enough antags + return "Not enough eligible players, [required_enemies] antagonists needed." + + return null + +///Try to start this gamemode, called by SSticker. Returns FALSE if it fails. +/datum/game_mode/proc/execute_roundstart() + SHOULD_CALL_PARENT(TRUE) + if(!pre_setup()) + setup_error ||= "Failed pre_setup." + return FALSE + + antagonists = GLOB.pre_setup_antags.Copy() + GLOB.pre_setup_antags.Cut() + var/number_of_antags = length(antagonists) + if(number_of_antags < required_enemies) + setup_error = "Not enough antagonists selected. Required [required_enemies], got [number_of_antags]." + return FALSE + + return TRUE + +///Add a mind to pre_setup_antags and perform any work on it. +/datum/game_mode/proc/select_antagonist(datum/mind/M, datum/antagonist/antag_path = src.antag_datum) + GLOB.pre_setup_antags[M] = antag_path + + M.restricted_roles = restricted_jobs + + if(initial(antag_path.job_rank)) + M.special_role = initial(antag_path.job_rank) + + if(initial(antag_path.assign_job)) + M.set_assigned_role(SSjob.GetJobType(initial(antag_path.assign_job))) + +///Populate the possible_antags list of minds, and any child behavior. /datum/game_mode/proc/pre_setup() + SHOULD_CALL_PARENT(TRUE) + + if(!antag_datum && !force_pre_setup_check) + return TRUE + + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + restricted_jobs += protected_jobs + + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + restricted_jobs += JOB_ASSISTANT + + possible_antags = SSticker.ready_players.Copy() + + // Strip out antag bans/people without this antag as a pref + trim_candidates(possible_antags) + if(!length(possible_antags)) + setup_error = "No possible antagonists found" + return FALSE return TRUE +/// The absolute last thing called before the round starts. Setup gamemode info/antagonists. +/datum/game_mode/proc/setup_antags() + SHOULD_CALL_PARENT(TRUE) + + give_antag_datums() + + for(var/datum/mind/M as anything in antagonists) + RegisterSignal(M, COMSIG_MIND_TRANSFERRED, PROC_REF(handle_antagonist_mind_transfer)) + init_mob_signals(M.current) + +/// Actually send out the antag datums +/datum/game_mode/proc/give_antag_datums() + for(var/datum/mind/M as anything in antagonists) + M.add_antag_datum(antagonists[M]) + +///Clean up a mess we may have made during set up. +/datum/game_mode/proc/on_failed_execute() + SHOULD_CALL_PARENT(TRUE) + for(var/datum/mind/M in antagonists) + M.special_role = null + M.restricted_roles = null + + // Just to be sure + GLOB.pre_setup_antags.Cut() + ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things /datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report. + SHOULD_CALL_PARENT(TRUE) + + possible_antags = null // We don't need em anymore, don't let them hard del. + if(!report) report = !CONFIG_GET(flag/no_intercept_report) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(display_roundstart_logout_report)), ROUNDSTART_LOGOUT_REPORT_TIME) @@ -56,15 +195,17 @@ /datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character) return -/datum/game_mode/proc/check_finished(force_ending) //to be called by SSticker +/datum/game_mode/proc/check_finished() //to be called by SSticker + SHOULD_CALL_PARENT(TRUE) + . = FALSE + if(!SSticker.setup_done) - return FALSE + return + if(SSshuttle.emergency && (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)) return TRUE if(GLOB.station_was_nuked) return TRUE - if(force_ending) - return TRUE /* * Generate a list of station goals available to purchase to report to the crew. @@ -103,8 +244,9 @@ var/datum/job/job = SSjob.GetJob(quitter.job) if(!job || !(job.job_flags & JOB_REOPEN_ON_ROUNDSTART_LOSS)) continue - if(!include_command && job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(!include_command && (job.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER)) continue + job.current_positions = max(job.current_positions - 1, 0) reopened_jobs += quitter.job @@ -154,7 +296,7 @@ if(L.suiciding) //Suicider msg += "[L.name] ([L.key]), the [L.job] ([span_boldannounce("Suicide")])\n" failed = TRUE //Disconnected client - if(!failed && (L.stat == UNCONSCIOUS || L.stat == HARD_CRIT)) + if(!failed && (L.stat == UNCONSCIOUS)) msg += "[L.name] ([L.key]), the [L.job] (Dying)\n" failed = TRUE //Unconscious if(!failed && L.stat == DEAD) @@ -204,3 +346,85 @@ /// Mode specific admin panel. /datum/game_mode/proc/admin_panel() return + +///Return a list of players that have our antag flag checked in prefs and are not banned, among other criteria. +/datum/game_mode/proc/trim_candidates(list/candidates) + RETURN_TYPE(/list) + SHOULD_CALL_PARENT(TRUE) + + for(var/mob/dead/new_player/candidate_player in candidates) + var/client/candidate_client = GET_CLIENT(candidate_player) + if (!candidate_client || !candidate_player.mind) // Are they connected? + candidates.Remove(candidate_player) + continue + + // Code for age-gating antags. + /*if(candidate_client.get_remaining_days(minimum_required_age) > 0) + candidates.Remove(candidate_player) + continue*/ + + if(candidate_player.mind.special_role) // We really don't want to give antag to an antag. + candidates.Remove(candidate_player) + continue + + var/list/antag_prefs = candidate_client.prefs.read_preference(/datum/preference/blob/antagonists) + if(antag_flag || antag_preference) + if (!antag_prefs[antag_preference || antag_flag]) + candidates.Remove(candidate_player) + continue + + if(antag_flag || antag_flag_to_ban_check) + if (is_banned_from(candidate_player.ckey, list(antag_flag_to_ban_check || antag_flag, ROLE_SYNDICATE))) + candidates.Remove(candidate_player) + continue + + // If this ruleset has exclusive_roles set, we want to only consider players who have those + // job prefs enabled and are eligible to play that job. Otherwise, continue as before. + if(length(exclusive_roles)) + var/exclusive_candidate = FALSE + for(var/role in exclusive_roles) + var/datum/job/job = SSjob.GetJob(role) + + if((role in candidate_client.prefs.read_preference(/datum/preference/blob/job_priority)) && SSjob.check_job_eligibility(candidate_player, job, "Gamemode Roundstart TC", add_job_to_log = TRUE)==JOB_AVAILABLE) + exclusive_candidate = TRUE + break + + // If they didn't have any of the required job prefs enabled or were banned from all enabled prefs, + // they're not eligible for this antag type. + if(!exclusive_candidate) + candidates.Remove(candidate_player) + + return candidates + +///Stub for reference that gamemodes do infact, process. +/datum/game_mode/process(delta_time) + datum_flags &= ~DF_ISPROCESSING + +///Setup signals for the antagonist's mind and mob. Make sure it gets cleared in handle_antagonist_mind_transfer. +/datum/game_mode/proc/init_mob_signals(mob/M) + RegisterSignal(M, COMSIG_LIVING_DEATH, PROC_REF(handle_antagonist_death)) + RegisterSignal(M, COMSIG_LIVING_REVIVE, PROC_REF(handle_antagonist_revival)) + RegisterSignal(M, COMSIG_PARENT_PREQDELETED, PROC_REF(handle_antagonist_qdel)) + +/datum/game_mode/proc/handle_antagonist_death(mob/source) + SIGNAL_HANDLER + death_timers[source.mind] = world.time + +/datum/game_mode/proc/handle_antagonist_revival(mob/source) + SIGNAL_HANDLER + death_timers -= source.mind + +/datum/game_mode/proc/handle_antagonist_mind_transfer(datum/mind/source, mob/old_body) + SIGNAL_HANDLER + if(isliving(source.current)) + var/mob/living/L = source.current + init_mob_signals(L) + if(L.stat != DEAD) + death_timers -= source + + if(old_body) + UnregisterSignal(old_body, list(COMSIG_LIVING_DEATH, COMSIG_LIVING_REVIVE, COMSIG_PARENT_PREQDELETED)) + +/datum/game_mode/proc/handle_antagonist_qdel(mob/source) + SIGNAL_HANDLER + permadead_antag_pool += source.real_name diff --git a/code/game/gamemodes/heretics.dm b/code/game/gamemodes/heretics.dm new file mode 100644 index 000000000000..fccbb3c1bb5f --- /dev/null +++ b/code/game/gamemodes/heretics.dm @@ -0,0 +1,33 @@ +///What percentage of the crew can become heretics. +#define HERETIC_SCALING_COEFF 0.1 + +/datum/game_mode/heretic + name = "Heretic" + + weight = GAMEMODE_WEIGHT_RARE + restricted_jobs = list(JOB_CYBORG, JOB_AI) + protected_jobs = list( + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_MEDICAL_DIRECTOR + ) + + antag_datum = /datum/antagonist/heretic + antag_flag = ROLE_HERETIC + +/datum/game_mode/heretic/pre_setup() + . = ..() + + var/num_heretics = 1 + + num_heretics = max(1, round(length(SSticker.ready_players) * HERETIC_SCALING_COEFF)) + + for (var/i in 1 to num_heretics) + if(possible_antags.len <= 0) + break + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) diff --git a/code/game/gamemodes/malfai.dm b/code/game/gamemodes/malfai.dm new file mode 100644 index 000000000000..3c3064638407 --- /dev/null +++ b/code/game/gamemodes/malfai.dm @@ -0,0 +1,23 @@ +/datum/game_mode/malf + name = "Malfunctioning AI" + + weight = GAMEMODE_WEIGHT_EPIC + exclusive_roles = list(JOB_AI) + + antag_datum = /datum/antagonist/malf_ai + antag_flag = ROLE_MALF + +/datum/game_mode/malf/check_for_errors() + var/datum/job/ai_job = SSjob.GetJobType(/datum/job/ai) + + // If we're not forced, we're going to make sure we can actually have an AI in this shift, + if(min(ai_job.total_positions - ai_job.current_positions, ai_job.spawn_positions) <= 0) + return "No AI position available." + + return ..() + +/datum/game_mode/malf/pre_setup() + . = ..() + + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) diff --git a/code/game/gamemodes/midrounds/_midrounds.dm b/code/game/gamemodes/midrounds/_midrounds.dm new file mode 100644 index 000000000000..b5e56e7817f1 --- /dev/null +++ b/code/game/gamemodes/midrounds/_midrounds.dm @@ -0,0 +1 @@ +/datum/midround diff --git a/code/game/gamemodes/mixed.dm b/code/game/gamemodes/mixed.dm new file mode 100644 index 000000000000..e5316d3db821 --- /dev/null +++ b/code/game/gamemodes/mixed.dm @@ -0,0 +1,90 @@ +#define MIXED_WEIGHT_TRAITOR 100 +#define MIXED_WEIGHT_CHANGELING 0 +#define MIXED_WEIGHT_HERETIC 20 +#define MIXED_WEIGHT_WIZARD 1 + +///What percentage of the pop can become antags +#define MIXED_ANTAG_COEFF 0.15 + +/datum/game_mode/mixed + name = "Mixed" + weight = GAMEMODE_WEIGHT_COMMON + restricted_jobs = list(JOB_CYBORG, JOB_AI) + protected_jobs = list( + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_MEDICAL_DIRECTOR + ) + + force_pre_setup_check = TRUE + + var/list/antag_weight_map = list( + ROLE_TRAITOR = MIXED_WEIGHT_TRAITOR, + ROLE_CHANGELING = MIXED_WEIGHT_CHANGELING, + ROLE_HERETIC = MIXED_WEIGHT_HERETIC, + ROLE_WIZARD = MIXED_WEIGHT_WIZARD + ) + +/datum/game_mode/mixed/pre_setup() + . = ..() + + var/list/antag_pool = list() + + var/number_of_antags = max(1, round(length(SSticker.ready_players) * MIXED_ANTAG_COEFF)) + + //Setup a list of antags to try to spawn + while(number_of_antags) + antag_pool[pick_weight(antag_weight_map)] += 1 + number_of_antags-- + + var/list/role_to_players_map = list( + ROLE_TRAITOR = list(), + ROLE_HERETIC = list(), + ROLE_CHANGELING = list(), + ROLE_WIZARD = list() + ) + + //Filter out our possible_antags list into a mixed-specific map of role : elligible players + for(var/mob/dead/new_player/candidate_player in possible_antags) + var/client/candidate_client = GET_CLIENT(candidate_player) + + for(var/role in antag_pool) + if (is_banned_from(candidate_player.ckey, list(role, ROLE_SYNDICATE))) + continue + + var/list/antag_prefs = candidate_client.prefs.read_preference(/datum/preference/blob/antagonists) + if(antag_prefs[role]) + role_to_players_map[role] += candidate_player + continue + + if(antag_pool[ROLE_TRAITOR]) + for(var/i in 1 to antag_pool[ROLE_TRAITOR]) + if(!length(role_to_players_map[ROLE_TRAITOR])) + break + var/mob/M = pick_n_take(role_to_players_map[ROLE_TRAITOR]) + select_antagonist(M.mind, /datum/antagonist/traitor) + + if(antag_pool[ROLE_CHANGELING]) + for(var/i in 1 to antag_pool[ROLE_CHANGELING]) + if(!length(role_to_players_map[ROLE_CHANGELING])) + break + var/mob/M = pick_n_take(role_to_players_map[ROLE_CHANGELING]) + select_antagonist(M.mind, /datum/antagonist/changeling) + + if(antag_pool[ROLE_HERETIC]) + for(var/i in 1 to antag_pool[ROLE_HERETIC]) + if(!length(role_to_players_map[ROLE_HERETIC])) + break + var/mob/M = pick_n_take(role_to_players_map[ROLE_HERETIC]) + select_antagonist(M.mind, /datum/antagonist/heretic) + + if(length(GLOB.wizardstart) && antag_pool[ROLE_WIZARD]) + for(var/i in 1 to antag_pool[ROLE_WIZARD]) + if(!length(role_to_players_map[ROLE_WIZARD])) + break + var/mob/M = pick_n_take(role_to_players_map[ROLE_WIZARD]) + select_antagonist(M.mind, /datum/antagonist/wizard) diff --git a/code/game/gamemodes/nuclear_emergency.dm b/code/game/gamemodes/nuclear_emergency.dm new file mode 100644 index 000000000000..01504ab05abb --- /dev/null +++ b/code/game/gamemodes/nuclear_emergency.dm @@ -0,0 +1,80 @@ +///What percentage of the crew can become traitors. +#define NUKIE_SCALING_COEFF 0.0555 // About 1 in 18 crew + +/datum/game_mode/nuclear_emergency + name = "Nuclear Emergency" + + weight = GAMEMODE_WEIGHT_EPIC + restricted_jobs = list( + JOB_CAPTAIN, + JOB_SECURITY_MARSHAL, + )// Just to be sure that a nukie getting picked won't ever imply a Captain or HoS not getting drafted + + required_enemies = 5 + min_pop = 25 + + antag_datum = /datum/antagonist/nukeop + antag_flag = ROLE_OPERATIVE + + var/datum/antagonist/antag_leader_datum = /datum/antagonist/nukeop/leader + var/datum/team/nuclear/nuke_team + +/datum/game_mode/nuclear_emergency/pre_setup() + . = ..() + + var/num_nukies = max(required_enemies, round(length(SSticker.ready_players) * NUKIE_SCALING_COEFF)) + + + for(var/i in 1 to num_nukies) + if(possible_antags.len <= 0) + break + + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) + +/datum/game_mode/nuclear_emergency/give_antag_datums() + var/chosen_leader = FALSE + for(var/datum/mind/M as anything in shuffle(antagonists)) + if (!chosen_leader) + chosen_leader = TRUE + var/datum/antagonist/nukeop/leader/new_op = M.add_antag_datum(antag_leader_datum) + nuke_team = new_op.nuke_team + else + var/datum/antagonist/nukeop/new_op = new antag_datum() + M.add_antag_datum(new_op) + +/datum/game_mode/nuclear_emergency/set_round_result() + . = ..() + var/result = nuke_team.get_result() + switch(result) + if(NUKE_RESULT_FLUKE) + SSticker.mode_result = "loss - syndicate nuked - disk secured" + SSticker.news_report = NUKE_SYNDICATE_BASE + if(NUKE_RESULT_NUKE_WIN) + SSticker.mode_result = "win - syndicate nuke" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_NOSURVIVORS) + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" + SSticker.news_report = STATION_NUKED + if(NUKE_RESULT_WRONG_STATION) + SSticker.mode_result = "halfwin - blew wrong station" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_WRONG_STATION_DEAD) + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" + SSticker.news_report = NUKE_MISS + if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD) + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_CREW_WIN) + SSticker.mode_result = "loss - evacuation - disk secured" + SSticker.news_report = OPERATIVES_KILLED + if(NUKE_RESULT_DISK_LOST) + SSticker.mode_result = "halfwin - evacuation - disk not secured" + SSticker.news_report = OPERATIVE_SKIRMISH + if(NUKE_RESULT_DISK_STOLEN) + SSticker.mode_result = "halfwin - detonation averted" + SSticker.news_report = OPERATIVE_SKIRMISH + else + SSticker.mode_result = "halfwin - interrupted" + SSticker.news_report = OPERATIVE_SKIRMISH + diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm deleted file mode 100644 index 658198878d8a..000000000000 --- a/code/game/gamemodes/objective.dm +++ /dev/null @@ -1,1009 +0,0 @@ -GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list -GLOBAL_LIST_EMPTY(objectives) //PARIAH EDIT - -/datum/objective - var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code. - var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code. - var/name = "generic objective" //Name for admin prompts - var/explanation_text = "Nothing" //What that person is supposed to do. - ///name used in printing this objective (Objective #1) - var/objective_name = "Objective" - var/team_explanation_text //For when there are multiple owners. - var/datum/mind/target = null //If they are focused on a particular person. - var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. - var/completed = FALSE //currently only used for custom objectives. - var/martyr_compatible = FALSE //If the objective is compatible with martyr objective, i.e. if you can still do it while dead. - /// Typecache of areas to ignore when looking for a potential target. - var/list/blacklisted_target_areas - -/datum/objective/New(text) - GLOB.objectives += src //PARIAH EDIT - if(text) - explanation_text = text - if(blacklisted_target_areas) - blacklisted_target_areas = typecacheof(blacklisted_target_areas) - -//Apparently objectives can be qdel'd. Learn a new thing every day -/datum/objective/Destroy() - GLOB.objectives -= src //PARIAH EDIT - return ..() - -/datum/objective/proc/get_owners() // Combine owner and team into a single list. - . = (team?.members) ? team.members.Copy() : list() - if(owner) - . += owner - -/datum/objective/proc/admin_edit(mob/admin) - return - -//Shared by few objective types -/datum/objective/proc/admin_simple_target_pick(mob/admin) - 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)) - possible_targets += possible_target.current - - possible_targets = list("Free objective", "Random") + sort_names(possible_targets) - - - if(target?.current) - def_value = target.current - - var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in possible_targets - if (!new_target) - return - - if (new_target == "Free objective") - target = null - else if (new_target == "Random") - find_target() - else - target = new_target.mind - - update_explanation_text() - -/proc/considered_escaped(datum/mind/M) - if(!considered_alive(M)) - return FALSE - if(considered_exiled(M)) - return FALSE - if(M.force_escaped) - return TRUE - if(SSticker.force_ending || GLOB.station_was_nuked) // Just let them win. - return TRUE - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return FALSE - var/area/current_area = get_area(M.current) - if(!current_area || istype(current_area, /area/shuttle/escape/brig)) // Fails if they are in the shuttle brig - return FALSE - var/turf/current_turf = get_turf(M.current) - return current_turf.onCentCom() || current_turf.onSyndieBase() - -/datum/objective/proc/check_completion() - return completed - -/datum/objective/proc/is_unique_objective(possible_target, dupe_search_range) - if(!islist(dupe_search_range)) - stack_trace("Non-list passed as duplicate objective search range") - dupe_search_range = list(dupe_search_range) - - for(var/A in dupe_search_range) - var/list/objectives_to_compare - if(istype(A,/datum/mind)) - var/datum/mind/M = A - objectives_to_compare = M.get_all_objectives() - else if(istype(A,/datum/antagonist)) - var/datum/antagonist/G = A - objectives_to_compare = G.objectives - else if(istype(A,/datum/team)) - var/datum/team/T = A - objectives_to_compare = T.objectives - for(var/datum/objective/O in objectives_to_compare) - if(istype(O, type) && O.get_target() == possible_target) - return FALSE - return TRUE - -/datum/objective/proc/get_target() - return target - -//dupe_search_range is a list of antag datums / minds / teams -/datum/objective/proc/find_target(dupe_search_range, blacklist) - var/list/datum/mind/owners = get_owners() - if(!dupe_search_range) - dupe_search_range = get_owners() - var/list/possible_targets = list() - var/try_target_late_joiners = FALSE - for(var/I in owners) - var/datum/mind/O = I - if(O.late_joiner) - try_target_late_joiners = TRUE - for(var/datum/mind/possible_target in get_crewmember_minds()) - var/target_area = get_area(possible_target.current) - 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 - if(possible_target in blacklist) - continue - if(is_type_in_typecache(target_area, blacklisted_target_areas)) - 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) - var/datum/mind/PT = I - if(!PT.late_joiner) - possible_targets -= PT - if(!possible_targets.len) - possible_targets = all_possible_targets - if(possible_targets.len > 0) - target = pick(possible_targets) - update_explanation_text() - return target - - -/datum/objective/proc/update_explanation_text() - if(team_explanation_text && LAZYLEN(get_owners()) > 1) - explanation_text = team_explanation_text - -/datum/objective/proc/give_special_equipment(special_equipment) - var/datum/mind/receiver = pick(get_owners()) - if(receiver?.current) - if(ishuman(receiver.current)) - var/mob/living/carbon/human/receiver_current = receiver.current - var/list/slots = list("backpack" = ITEM_SLOT_BACKPACK) - for(var/obj/equipment_path as anything in special_equipment) - var/obj/equipment_object = new equipment_path - if(!receiver_current.equip_in_one_of_slots(equipment_object, slots)) - LAZYINITLIST(receiver.failed_special_equipment) - receiver.failed_special_equipment += equipment_path - receiver.try_give_equipment_fallback() - -/datum/action/special_equipment_fallback - name = "Request Objective-specific Equipment" - desc = "Call down a supply pod containing the equipment required for specific objectives." - button_icon = 'icons/obj/device.dmi' - button_icon_state = "beacon" - -/datum/action/special_equipment_fallback/Trigger(trigger_flags) - . = ..() - if(!.) - return FALSE - - var/datum/mind/our_mind = target - if(!istype(our_mind)) - CRASH("[type] - [src] has an incorrect target!") - if(our_mind.current != owner) - CRASH("[type] - [src] was owned by a mob which was not the current of the target mind!") - - if(LAZYLEN(our_mind.failed_special_equipment)) - podspawn(list( - "target" = get_turf(owner), - "style" = STYLE_SYNDICATE, - "spawn" = our_mind.failed_special_equipment, - )) - our_mind.failed_special_equipment = null - qdel(src) - return TRUE - -/datum/objective/assassinate - name = "assasinate" - var/target_role_type=FALSE - martyr_compatible = TRUE - - -/datum/objective/assassinate/check_completion() - return completed || (!considered_alive(target) || considered_afk(target) || considered_exiled(target)) - -/datum/objective/assassinate/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." - else - explanation_text = "Free Objective" - -/datum/objective/assassinate/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/mutiny - name = "mutiny" - var/target_role_type=FALSE - martyr_compatible = 1 - - -/datum/objective/mutiny/check_completion() - if(!target || !considered_alive(target) || considered_afk(target) || considered_exiled(target)) - return TRUE - var/turf/T = get_turf(target.current) - return !T || !is_station_level(T.z) - -/datum/objective/mutiny/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." - else - explanation_text = "Free Objective" - -/datum/objective/maroon - name = "maroon" - var/target_role_type=FALSE - martyr_compatible = TRUE - - -/datum/objective/maroon/check_completion() - if (!target) - return TRUE - if (!considered_alive(target)) - return TRUE - if (!target.current.onCentCom() && !target.current.onSyndieBase()) - return TRUE - return FALSE - -/datum/objective/maroon/update_explanation_text() - if(target?.current) - explanation_text = "Prevent [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role], from escaping alive." - else - explanation_text = "Free Objective" - -/datum/objective/maroon/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/debrain - name = "debrain" - var/target_role_type=0 - - -/datum/objective/debrain/check_completion() - if(!target)//If it's a free objective. - return TRUE - if(!target.current || !isbrain(target.current)) - return FALSE - var/atom/A = target.current - var/list/datum/mind/owners = get_owners() - - while(A.loc) // Check to see if the brainmob is on our person - A = A.loc - for(var/datum/mind/M in owners) - if(M.current && M.current.stat != DEAD && A == M.current) - return TRUE - return FALSE - -/datum/objective/debrain/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Steal the brain of [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." - else - explanation_text = "Free Objective" - -/datum/objective/debrain/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/protect//The opposite of killing a dude. - name = "protect" - martyr_compatible = TRUE - var/target_role_type = FALSE - var/human_check = TRUE - - -/datum/objective/protect/check_completion() - var/obj/item/organ/brain/brain_target - if(human_check) - brain_target = target.current?.getorganslot(ORGAN_SLOT_BRAIN) - //Protect will always suceed when someone suicides - return !target || target.current?.suiciding || considered_alive(target, enforce_human = human_check) || brain_target?.suicided - -/datum/objective/protect/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Protect [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." - else - explanation_text = "Free Objective" - -/datum/objective/protect/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/protect/nonhuman - name = "protect nonhuman" - human_check = FALSE - -/datum/objective/jailbreak - name = "jailbreak" - martyr_compatible = TRUE //why not? - var/target_role_type - - -/datum/objective/jailbreak/check_completion() - return completed || (considered_escaped(target)) - -/datum/objective/jailbreak/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] escapes alive and out of custody." - else - explanation_text = "Free Objective" - -/datum/objective/jailbreak/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/jailbreak/detain - name = "detain" - -/datum/objective/jailbreak/detain/check_completion() - return completed || (!considered_escaped(target) && (considered_alive(target) && target.current.onCentCom())) - -/datum/objective/jailbreak/detain/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] is delivered to nanotrasen alive and in custody." - else - explanation_text = "Free Objective" - -/datum/objective/hijack - name = "hijack" - explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console)." - team_explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console). 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) - return FALSE - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!considered_alive(M) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) - return FALSE - return SSshuttle.emergency.is_hijacked() - -/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/elimination/check_completion() - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return FALSE - 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() - -/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 - 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" - explanation_text = "Do not allow any organic lifeforms with sapience to escape on the shuttle alive." - martyr_compatible = 1 - -/datum/objective/block/check_completion() - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return TRUE - for(var/mob/living/player in GLOB.player_list) - if(player.mind && player.stat != DEAD && (player.mob_biotypes & MOB_ORGANIC)) - if(get_area(player) in SSshuttle.emergency.shuttle_areas) - return FALSE - return TRUE - -/datum/objective/purge - name = "no mutants on shuttle" - explanation_text = "Ensure no nonhuman humanoid species with sapience are present aboard the escape shuttle." - martyr_compatible = TRUE - -/datum/objective/purge/check_completion() - if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return TRUE - for(var/mob/living/player in GLOB.player_list) - if((get_area(player) in SSshuttle.emergency.shuttle_areas) && player.mind && player.stat != DEAD && ishuman(player)) - var/mob/living/carbon/human/H = player - if(H.dna.species.id != SPECIES_HUMAN) - return FALSE - return TRUE - -/datum/objective/robot_army - name = "robot army" - explanation_text = "Have at least eight active cyborgs synced to you." - martyr_compatible = FALSE - -/datum/objective/robot_army/check_completion() - var/counter = 0 - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!M.current || !isAI(M.current)) - continue - var/mob/living/silicon/ai/A = M.current - for(var/mob/living/silicon/robot/R in A.connected_robots) - if(R.stat != DEAD) - counter++ - return counter >= 8 - -/datum/objective/escape - name = "escape" - explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." - team_explanation_text = "Have all members of your team escape on a shuttle or pod alive, without being in custody." - -/datum/objective/escape/check_completion() - // Require all owners escape safely. - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!considered_escaped(M)) - return FALSE - return TRUE - -/datum/objective/escape/escape_with_identity - name = "escape with identity" - var/target_real_name // Has to be stored because the target's real_name can change over the course of the round - var/target_missing_id - -/datum/objective/escape/escape_with_identity/find_target(dupe_search_range) - target = ..() - update_explanation_text() - -/datum/objective/escape/escape_with_identity/update_explanation_text() - if(target?.current) - target_real_name = target.current.real_name - explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role.title]" - var/mob/living/carbon/human/H - if(ishuman(target.current)) - H = target.current - if(H && H.get_id_name() != target_real_name) - target_missing_id = 1 - else - explanation_text += " while wearing their identification card" - explanation_text += "." //Proper punctuation is important! - - else - explanation_text = "Free Objective." - -/datum/objective/escape/escape_with_identity/check_completion() - if(!target || !target_real_name) - return TRUE - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!ishuman(M.current) || !considered_escaped(M)) - continue - var/mob/living/carbon/human/H = M.current - if(H.dna.real_name == target_real_name && (H.get_id_name() == target_real_name || target_missing_id)) - return TRUE - return FALSE - -/datum/objective/escape/escape_with_identity/admin_edit(mob/admin) - admin_simple_target_pick(admin) - -/datum/objective/survive - name = "survive" - explanation_text = "Stay alive until the end." - -/datum/objective/survive/check_completion() - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!considered_alive(M)) - return FALSE - return TRUE - -/datum/objective/survive/malf //Like survive, but for Malf AIs - name = "survive AI" - explanation_text = "Prevent your own deactivation." - -/datum/objective/survive/malf/check_completion() - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/mindobj in owners) - if(!istype(mindobj, /mob/living/silicon/robot) && !considered_alive(mindobj, FALSE)) //Shells (and normal borgs for that matter) are considered alive for Malf - return FALSE - return TRUE - -/datum/objective/exile - name = "exile" - explanation_text = "Stay alive off station. Do not go to CentCom." - -/datum/objective/exile/check_completion() - var/list/owners = get_owners() - for(var/datum/mind/mind as anything in owners) - if(!considered_alive(mind)) - return FALSE - if(SSmapping.level_has_any_trait(mind.current.z, list(ZTRAIT_STATION, ZTRAIT_CENTCOM))) //went to centcom or ended round on station - return FALSE - return TRUE - -/datum/objective/martyr - name = "martyr" - explanation_text = "Die a glorious death." - -/datum/objective/martyr/check_completion() - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(considered_alive(M)) - return FALSE - if(M.current?.suiciding) //killing yourself ISN'T glorious. - return FALSE - return TRUE - -/datum/objective/nuclear - name = "nuclear" - explanation_text = "Destroy the station with a nuclear device." - martyr_compatible = TRUE - -/datum/objective/nuclear/check_completion() - if(GLOB.station_was_nuked) - return TRUE - return FALSE - -GLOBAL_LIST_EMPTY(possible_items) -/datum/objective/steal - name = "steal" - var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. - var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). - martyr_compatible = FALSE - -/datum/objective/steal/get_target() - return steal_target - -/datum/objective/steal/New() - ..() - if(!GLOB.possible_items.len)//Only need to fill the list when it's needed. - for(var/I in subtypesof(/datum/objective_item/steal)) - new I - -/datum/objective/steal/find_target(dupe_search_range) - var/list/datum/mind/owners = get_owners() - if(!dupe_search_range) - dupe_search_range = get_owners() - var/approved_targets = list() - check_items: - for(var/datum/objective_item/possible_item in GLOB.possible_items) - //PARIAH EDIT REMOVAL - /* - if(possible_item.objective_type != OBJECTIVE_ITEM_TYPE_NORMAL) - continue - */ - //PARIAH EDIT END - if(!is_unique_objective(possible_item.targetitem,dupe_search_range)) - continue - for(var/datum/mind/M in owners) - if(M.current.mind.assigned_role.title in possible_item.excludefromjob) - continue check_items - approved_targets += possible_item - if (length(approved_targets)) - return set_target(pick(approved_targets)) - return set_target(null) - -/datum/objective/steal/proc/set_target(datum/objective_item/item) - if(item) - targetinfo = item - steal_target = targetinfo.targetitem - explanation_text = "Steal [targetinfo.name]" - give_special_equipment(targetinfo.special_equipment) - return steal_target - else - explanation_text = "Free objective" - return - -/datum/objective/steal/admin_edit(mob/admin) - var/list/possible_items_all = GLOB.possible_items - var/new_target = input(admin,"Select target:", "Objective target", steal_target) as null|anything in sort_names(possible_items_all)+"custom" - if (!new_target) - return - - if (new_target == "custom") //Can set custom items. - var/custom_path = input(admin,"Search for target item type:","Type") as null|text - if (!custom_path) - return - var/obj/item/custom_target = pick_closest_path(custom_path, make_types_fancy(subtypesof(/obj/item))) - var/custom_name = initial(custom_target.name) - custom_name = stripped_input(admin,"Enter target name:", "Objective target", custom_name) - if (!custom_name) - return - steal_target = custom_target - explanation_text = "Steal [custom_name]." - - else - set_target(new_target) - -/datum/objective/steal/check_completion() - var/list/datum/mind/owners = get_owners() - if(!steal_target) - return TRUE - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - - var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. - - for(var/obj/I in all_items) //Check for items - if(istype(I, steal_target)) - if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. - return TRUE - else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. - return TRUE - - if(targetinfo && (I.type in targetinfo.altitems)) //Ok, so you don't have the item. Do you have an alternative, at least? - if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! - return TRUE - return FALSE - -GLOBAL_LIST_EMPTY(possible_items_special) -/datum/objective/steal/special //ninjas are so special they get their own subtype good for them - name = "steal special" - -/datum/objective/steal/special/New() - ..() - if(!GLOB.possible_items_special.len) - for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack)) - new I - -/datum/objective/steal/special/find_target(dupe_search_range) - return set_target(pick(GLOB.possible_items_special)) - -/datum/objective/capture - name = "capture" - -/datum/objective/capture/proc/gen_amount_goal() - target_amount = rand(5,10) - update_explanation_text() - return target_amount - -/datum/objective/capture/update_explanation_text() - . = ..() - explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more." - -/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth. - var/captured_amount = 0 - var/area/centcom/central_command_areas/holding/A = GLOB.areas_by_type[/area/centcom/central_command_areas/holding] - for(var/mob/living/carbon/human/M in A)//Humans. - if(ismonkey(M)) - captured_amount+=0.1 - continue - if(M.stat == DEAD)//Dead folks are worth less. - captured_amount+=0.5 - continue - captured_amount+=1 - for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. - if(M.stat == DEAD) - captured_amount+=0.5 - continue - captured_amount+=1 - for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans. - if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans. - if(M.stat == DEAD) - captured_amount+=1.5 - else - captured_amount+=3 - continue - if(M.stat == DEAD) - captured_amount+=1 - continue - captured_amount+=2 - return captured_amount >= target_amount - -/datum/objective/capture/admin_edit(mob/admin) - var/count = input(admin,"How many mobs to capture ?","capture",target_amount) as num|null - if(count) - target_amount = count - update_explanation_text() - -/datum/objective/protect_object - name = "protect object" - var/obj/protect_target - -/datum/objective/protect_object/proc/set_target(obj/O) - protect_target = O - update_explanation_text() - -/datum/objective/protect_object/update_explanation_text() - . = ..() - if(protect_target) - explanation_text = "Protect \the [protect_target] at all costs." - else - explanation_text = "Free objective." - -/datum/objective/protect_object/check_completion() - return !QDELETED(protect_target) - -//Changeling Objectives - -/datum/objective/absorb - name = "absorb" - -/datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6) - target_amount = rand (lowbound,highbound) - var/n_p = 1 //autowin - var/list/datum/mind/owners = get_owners() - if (SSticker.current_state == GAME_STATE_SETTING_UP) - for(var/i in GLOB.new_player_list) - var/mob/dead/new_player/P = i - if(P.ready == PLAYER_READY_TO_PLAY && !(P.mind in owners)) - n_p ++ - else if (SSticker.IsRoundInProgress()) - for(var/mob/living/carbon/human/P in GLOB.player_list) - if(!(P.mind.has_antag_datum(/datum/antagonist/changeling)) && !(P.mind in owners)) - n_p ++ - target_amount = min(target_amount, n_p) - - update_explanation_text() - return target_amount - -/datum/objective/absorb/update_explanation_text() - . = ..() - explanation_text = "Extract [target_amount] compatible genome\s." - -/datum/objective/absorb/admin_edit(mob/admin) - var/count = input(admin,"How many people to absorb?","absorb",target_amount) as num|null - if(count) - target_amount = count - update_explanation_text() - -/datum/objective/absorb/check_completion() - var/list/datum/mind/owners = get_owners() - var/absorbed_count = 0 - for(var/datum/mind/M in owners) - if(!M) - continue - var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) - if(!changeling || !changeling.stored_profiles) - continue - absorbed_count += changeling.absorbed_count - return absorbed_count >= target_amount - -/datum/objective/absorb_most - name = "absorb most" - explanation_text = "Extract more compatible genomes than any other Changeling." - -/datum/objective/absorb_most/check_completion() - var/list/datum/mind/owners = get_owners() - var/absorbed_count = 0 - for(var/datum/mind/M in owners) - if(!M) - continue - var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) - if(!changeling || !changeling.stored_profiles) - continue - absorbed_count += changeling.absorbed_count - - for(var/datum/antagonist/changeling/changeling2 in GLOB.antagonists) - if(!changeling2.owner || changeling2.owner == owner || !changeling2.stored_profiles || changeling2.absorbed_count < absorbed_count) - continue - return FALSE - return TRUE - -/datum/objective/absorb_changeling - name = "absorb changeling" - explanation_text = "Absorb another Changeling." - -/datum/objective/absorb_changeling/check_completion() - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/M in owners) - if(!M) - continue - var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) - if(!changeling) - continue - var/total_genetic_points = changeling.genetic_points - - for(var/datum/action/changeling/p in changeling.purchased_powers) - total_genetic_points += p.dna_cost - - if(total_genetic_points > initial(changeling.genetic_points)) - return TRUE - return FALSE - -//End Changeling Objectives - -/datum/objective/destroy - name = "destroy AI" - martyr_compatible = TRUE - -/datum/objective/destroy/find_target(dupe_search_range) - var/list/possible_targets = active_ais(1) - var/mob/living/silicon/ai/target_ai = pick(possible_targets) - target = target_ai.mind - update_explanation_text() - return target - -/datum/objective/destroy/check_completion() - if(target?.current) - return target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey //Borgs/brains/AIs count as dead for traitor objectives. - return TRUE - -/datum/objective/destroy/update_explanation_text() - ..() - if(target?.current) - explanation_text = "Destroy [target.name], the experimental AI." - else - explanation_text = "Free Objective" - -/datum/objective/destroy/admin_edit(mob/admin) - var/list/possible_targets = active_ais(1) - if(possible_targets.len) - var/mob/new_target = input(admin,"Select target:", "Objective target") as null|anything in sort_names(possible_targets) - target = new_target.mind - else - to_chat(admin, span_boldwarning("No active AIs with minds.")) - update_explanation_text() - -/datum/objective/steal_n_of_type - name = "steal five of" - explanation_text = "Steal some items!" - //what types we want to steal - var/list/wanted_items = list() - //how many we want to steal - var/amount = 5 - -/datum/objective/steal_n_of_type/New() - ..() - wanted_items = typecacheof(wanted_items) - -/datum/objective/steal_n_of_type/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(is_type_in_typecache(I, wanted_items)) - if(check_if_valid_item(I)) - stolen_count++ - return stolen_count >= amount - -/datum/objective/steal_n_of_type/proc/check_if_valid_item(obj/item/current_item) - return TRUE - -/datum/objective/steal_n_of_type/summon_guns - name = "steal guns" - explanation_text = "Steal at least five guns!" - wanted_items = list(/obj/item/gun) - amount = 5 - -/datum/objective/steal_n_of_type/summon_guns/check_if_valid_item(obj/item/current_item) - var/obj/item/gun/gun = current_item - return !(gun.gun_flags & NOT_A_REAL_GUN) - -/datum/objective/steal_n_of_type/summon_guns/thief - explanation_text = "Steal at least 3 guns!" - amount = 3 - -/datum/objective/steal_n_of_type/summon_magic - name = "steal magic" - explanation_text = "Steal at least five magical artefacts!" - wanted_items = list() - amount = 5 - -/datum/objective/steal_n_of_type/summon_magic/New() - wanted_items = GLOB.summoned_magic_objectives - ..() - -/datum/objective/steal_n_of_type/summon_magic/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/M in owners) - if(!isliving(M.current)) - continue - var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/I in all_items) //Check for wanted items - if(istype(I, /obj/item/book/granter/action/spell)) - var/obj/item/book/granter/action/spell/spellbook = I - if(spellbook.uses > 0) //if the book still has powers... - stolen_count++ //it counts. nice - else if(is_type_in_typecache(I, wanted_items)) - stolen_count++ - return stolen_count >= amount - -/datum/objective/steal_n_of_type/organs - name = "steal organs" - explanation_text = "Steal at least 5 organic organs! They must be kept healthy." - wanted_items = list(/obj/item/organ) - amount = 5 //i want this to be higher, but the organs must be fresh at roundend - -/datum/objective/steal_n_of_type/organs/check_completion() - var/list/datum/mind/owners = get_owners() - var/stolen_count = 0 - for(var/datum/mind/mind in owners) - if(!isliving(mind.current)) - continue - var/list/all_items = mind.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/item/stolen in all_items) //Check for wanted items - var/found = FALSE - for(var/wanted_type in wanted_items) - if(istype(stolen, wanted_type)) - found = TRUE - break - if(!found) - continue - //this is an objective item - var/obj/item/organ/wanted = stolen - if(!(wanted.organ_flags & ORGAN_FAILING) && !(wanted.organ_flags & ORGAN_SYNTHETIC)) - stolen_count++ - return stolen_count >= amount - -//Created by admin tools -/datum/objective/custom - name = "custom" - -/datum/objective/custom/admin_edit(mob/admin) - var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text) - if(expl) - explanation_text = expl - -//Ideally this would be all of them but laziness and unusual subtypes -/proc/generate_admin_objective_list() - GLOB.admin_objective_list = list() - - var/list/allowed_types = sort_list(list( - /datum/objective/assassinate, - /datum/objective/maroon, - /datum/objective/debrain, - /datum/objective/protect, - /datum/objective/jailbreak, - /datum/objective/jailbreak/detain, - /datum/objective/destroy, - /datum/objective/hijack, - /datum/objective/escape, - /datum/objective/survive, - /datum/objective/martyr, - /datum/objective/steal, - /datum/objective/nuclear, - /datum/objective/capture, - /datum/objective/absorb, - /datum/objective/custom - ),GLOBAL_PROC_REF(cmp_typepaths_asc)) - - for(var/T in allowed_types) - var/datum/objective/X = T - GLOB.admin_objective_list[initial(X.name)] = T - -/datum/objective/contract - var/payout = 0 - var/payout_bonus = 0 - var/area/dropoff = null - blacklisted_target_areas = list(/area/space, /area/ruin, /area/icemoon, /area/lavaland) - -// Generate a random valid area on the station that the dropoff will happen. -/datum/objective/contract/proc/generate_dropoff() - var/found = FALSE - while (!found) - var/area/dropoff_area = pick(GLOB.sortedAreas) - if(dropoff_area && (dropoff_area.type in GLOB.the_station_areas) && !dropoff_area.outdoors) - dropoff = dropoff_area - found = TRUE - -// Check if both the contractor and contract target are at the dropoff point. -/datum/objective/contract/proc/dropoff_check(mob/user, mob/target) - var/area/user_area = get_area(user) - var/area/target_area = get_area(target) - - return (istype(user_area, dropoff) && istype(target_area, dropoff)) - -/// Used by drifting contractors -/datum/objective/contractor_total - name = "contractor" - martyr_compatible = TRUE - /// How many contracts are needed, rand(1, 3) - var/contracts_needed - -/datum/objective/contractor_total/New(text) - . = ..() - contracts_needed = rand(1, 3) - explanation_text = "Complete at least [contracts_needed] contract\s." - -/datum/objective/contractor_total/check_completion() - var/datum/contractor_hub/the_hub = GLOB.contractors[owner] - if(!the_hub) - return FALSE - return the_hub.contracts_completed >= contracts_needed diff --git a/code/game/gamemodes/objectives/_objective.dm b/code/game/gamemodes/objectives/_objective.dm new file mode 100644 index 000000000000..e03f59199c84 --- /dev/null +++ b/code/game/gamemodes/objectives/_objective.dm @@ -0,0 +1,823 @@ +GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list +GLOBAL_LIST_EMPTY(objectives) //PARIAH EDIT + +/datum/objective + var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code. + var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code. + var/name = "generic objective" //Name for admin prompts + var/explanation_text = "Nothing" //What that person is supposed to do. + ///name used in printing this objective (Objective #1) + var/objective_name = "Objective" + var/team_explanation_text //For when there are multiple owners. + var/datum/mind/target = null //If they are focused on a particular person. + var/target_amount = 0 //If they are focused on a particular number. Steal objectives have their own counter. + var/completed = FALSE //currently only used for custom objectives. + /// Typecache of areas to ignore when looking for a potential target. + var/list/blacklisted_target_areas + var/highlander = TRUE // Can only have one of this type of objective + +/datum/objective/New(text) + GLOB.objectives += src //PARIAH EDIT + if(text) + explanation_text = text + if(blacklisted_target_areas) + blacklisted_target_areas = typecacheof(blacklisted_target_areas) + +//Apparently objectives can be qdel'd. Learn a new thing every day +/datum/objective/Destroy() + GLOB.objectives -= src //PARIAH EDIT + return ..() + +/datum/objective/proc/get_owners() // Combine owner and team into a single list. + . = (team?.members) ? team.members.Copy() : list() + if(owner) + . += owner + +/datum/objective/proc/admin_edit(mob/admin) + return + +//Shared by few objective types +/datum/objective/proc/admin_simple_target_pick(mob/admin) + 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)) + possible_targets += possible_target.current + + possible_targets = list("Free objective", "Random") + sort_names(possible_targets) + + + if(target?.current) + def_value = target.current + + var/mob/new_target = input(admin,"Select target:", "Objective target", def_value) as null|anything in possible_targets + if (!new_target) + return + + if (new_target == "Free objective") + target = null + else if (new_target == "Random") + find_target() + else + target = new_target.mind + + update_explanation_text() + +/proc/considered_escaped(datum/mind/M) + if(!considered_alive(M)) + return FALSE + if(considered_exiled(M)) + return FALSE + if(M.force_escaped) + return TRUE + if(UNLINT(SSticker.force_ending) || GLOB.station_was_nuked) // Just let them win. + return TRUE + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) + return FALSE + var/area/current_area = get_area(M.current) + if(!current_area || istype(current_area, /area/shuttle/escape/brig)) // Fails if they are in the shuttle brig + return FALSE + var/turf/current_turf = get_turf(M.current) + return current_turf.onCentCom() || current_turf.onSyndieBase() + +/datum/objective/proc/check_completion() + return completed + +/datum/objective/proc/is_unique_objective(possible_target, dupe_search_range) + if(!islist(dupe_search_range)) + stack_trace("Non-list passed as duplicate objective search range") + dupe_search_range = list(dupe_search_range) + + for(var/A in dupe_search_range) + var/list/objectives_to_compare + if(istype(A,/datum/mind)) + var/datum/mind/M = A + objectives_to_compare = M.get_all_objectives() + else if(istype(A,/datum/antagonist)) + var/datum/antagonist/G = A + objectives_to_compare = G.objectives + else if(istype(A,/datum/team)) + var/datum/team/T = A + objectives_to_compare = T.objectives + for(var/datum/objective/O in objectives_to_compare) + if(istype(O, type) && O.get_target() == possible_target) + return FALSE + return TRUE + +/datum/objective/proc/get_target() + return target + +//dupe_search_range is a list of antag datums / minds / teams +/datum/objective/proc/find_target(dupe_search_range, blacklist) + var/list/datum/mind/owners = get_owners() + if(!dupe_search_range) + dupe_search_range = get_owners() + var/list/possible_targets = list() + var/try_target_late_joiners = FALSE + for(var/I in owners) + var/datum/mind/O = I + if(O.late_joiner) + try_target_late_joiners = TRUE + for(var/datum/mind/possible_target in get_crewmember_minds()) + var/target_area = get_area(possible_target.current) + 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 + if(possible_target in blacklist) + continue + if(is_type_in_typecache(target_area, blacklisted_target_areas)) + 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) + var/datum/mind/PT = I + if(!PT.late_joiner) + possible_targets -= PT + if(!possible_targets.len) + possible_targets = all_possible_targets + if(possible_targets.len > 0) + target = pick(possible_targets) + update_explanation_text() + return target + +/datum/objective/proc/update_explanation_text() + if(team_explanation_text && LAZYLEN(get_owners()) > 1) + explanation_text = team_explanation_text + +/datum/objective/proc/get_roundend_suffix() + return check_completion() ? span_greentext("Success!") : span_redtext("Fail.") + +/datum/objective/proc/give_special_equipment(special_equipment) + var/datum/mind/receiver = pick(get_owners()) + if(receiver?.current) + if(ishuman(receiver.current)) + var/mob/living/carbon/human/receiver_current = receiver.current + var/list/slots = list("backpack" = ITEM_SLOT_BACKPACK) + for(var/obj/equipment_path as anything in special_equipment) + var/obj/equipment_object = new equipment_path + if(!receiver_current.equip_in_one_of_slots(equipment_object, slots)) + LAZYINITLIST(receiver.failed_special_equipment) + receiver.failed_special_equipment += equipment_path + receiver.try_give_equipment_fallback() + +/datum/action/special_equipment_fallback + name = "Request Objective-specific Equipment" + desc = "Call down a supply pod containing the equipment required for specific objectives." + button_icon = 'icons/obj/device.dmi' + button_icon_state = "beacon" + +/datum/action/special_equipment_fallback/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + + var/datum/mind/our_mind = target + if(!istype(our_mind)) + CRASH("[type] - [src] has an incorrect target!") + if(our_mind.current != owner) + CRASH("[type] - [src] was owned by a mob which was not the current of the target mind!") + + if(LAZYLEN(our_mind.failed_special_equipment)) + podspawn(list( + "target" = get_turf(owner), + "style" = STYLE_SYNDICATE, + "spawn" = our_mind.failed_special_equipment, + )) + our_mind.failed_special_equipment = null + qdel(src) + return TRUE + +/datum/objective/assassinate + name = "assasinate" + var/target_role_type=FALSE + +/datum/objective/assassinate/check_completion() + return completed || (!considered_alive(target) || considered_afk(target) || considered_exiled(target)) + +/datum/objective/assassinate/update_explanation_text() + ..() + if(target) + RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(register_target_death), TRUE) + + if(target?.current) + explanation_text = "Assassinate [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." + else + explanation_text = "Free Objective" + +/datum/objective/assassinate/admin_edit(mob/admin) + admin_simple_target_pick(admin) + +/datum/objective/assassinate/proc/register_target_death(mob/living/dead_guy, gibbed) + SIGNAL_HANDLER + completed = TRUE + UnregisterSignal(dead_guy, COMSIG_LIVING_DEATH) + +/datum/objective/mutiny + name = "mutiny" + var/target_role_type=FALSE + +/datum/objective/mutiny/check_completion() + if(!target || !considered_alive(target) || considered_afk(target) || considered_exiled(target)) + return TRUE + var/turf/T = get_turf(target.current) + return !T || !is_station_level(T.z) + +/datum/objective/mutiny/update_explanation_text() + ..() + if(target?.current) + explanation_text = "Assassinate or exile [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role]." + else + explanation_text = "Free Objective" + +/datum/objective/protect/admin_edit(mob/admin) + admin_simple_target_pick(admin) + +/datum/objective/jailbreak + name = "jailbreak" + var/target_role_type + +/datum/objective/jailbreak/check_completion() + return completed || (considered_escaped(target)) + +/datum/objective/jailbreak/update_explanation_text() + ..() + if(target?.current) + explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] escapes alive and out of custody." + else + explanation_text = "Free Objective" + +/datum/objective/jailbreak/admin_edit(mob/admin) + admin_simple_target_pick(admin) + +/datum/objective/jailbreak/detain + name = "detain" + +/datum/objective/jailbreak/detain/check_completion() + return completed || (!considered_escaped(target) && (considered_alive(target) && target.current.onCentCom())) + +/datum/objective/jailbreak/detain/update_explanation_text() + ..() + if(target?.current) + explanation_text = "Ensure that [target.name], the [!target_role_type ? target.assigned_role.title : target.special_role] is alive and in custody." + else + explanation_text = "Free Objective" + +/datum/objective/hijack + name = "hijack" + explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console)." + team_explanation_text = "Hijack the emergency shuttle by hacking its navigational protocols through the control console (alt click emergency shuttle console). Leave no team member behind." + + /// 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) + return FALSE + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M) || !SSshuttle.emergency.shuttle_areas[get_area(M.current)]) + return FALSE + return SSshuttle.emergency.is_hijacked() + +/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." + +/datum/objective/elimination/check_completion() + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) + return FALSE + 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() + +/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 + 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/purge/check_completion() + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) + return TRUE + for(var/mob/living/player in GLOB.player_list) + if((get_area(player) in SSshuttle.emergency.shuttle_areas) && player.mind && player.stat != DEAD && ishuman(player)) + var/mob/living/carbon/human/H = player + if(H.dna.species.id != SPECIES_HUMAN) + return FALSE + return TRUE + +/// Escape. Should not be given to anyone straight up. Exists for Escape with Identity. +/datum/objective/escape + name = "escape" + explanation_text = "Escape on the shuttle or an escape pod alive and without being in custody." + team_explanation_text = "Have all members of your team escape on a shuttle or pod alive, without being in custody." + +/datum/objective/escape/check_completion() + // Require all owners escape safely. + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_escaped(M)) + return FALSE + return TRUE + +/datum/objective/escape/escape_with_identity + name = "escape with identity" + var/target_real_name // Has to be stored because the target's real_name can change over the course of the round + var/target_missing_id + +/datum/objective/escape/escape_with_identity/find_target(dupe_search_range) + target = ..() + update_explanation_text() + +/datum/objective/escape/escape_with_identity/update_explanation_text() + if(target?.current) + target_real_name = target.current.real_name + explanation_text = "Escape on the shuttle or an escape pod with the identity of [target_real_name], the [target.assigned_role.title]" + var/mob/living/carbon/human/H + if(ishuman(target.current)) + H = target.current + if(H && H.get_id_name() != target_real_name) + target_missing_id = 1 + else + explanation_text += " while wearing their identification card" + explanation_text += "." //Proper punctuation is important! + + else + explanation_text = "Free Objective." + +/datum/objective/escape/escape_with_identity/check_completion() + if(!target || !target_real_name) + return TRUE + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!ishuman(M.current) || !considered_escaped(M)) + continue + var/mob/living/carbon/human/H = M.current + if(H.dna.real_name == target_real_name && (H.get_id_name() == target_real_name || target_missing_id)) + return TRUE + return FALSE + +/datum/objective/escape/escape_with_identity/admin_edit(mob/admin) + admin_simple_target_pick(admin) + +/// To be used as a template. Do not give directly. +/datum/objective/survive + name = "survive" + explanation_text = "Stay alive until the end." + +/datum/objective/survive/check_completion() + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!considered_alive(M)) + return FALSE + return TRUE + +/datum/objective/survive/malf //Like survive, but for Malf AIs + name = "survive AI" + explanation_text = "Prevent your own deactivation." + +/datum/objective/survive/malf/check_completion() + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/mindobj in owners) + if(!istype(mindobj, /mob/living/silicon/robot) && !considered_alive(mindobj, FALSE)) //Shells (and normal borgs for that matter) are considered alive for Malf + return FALSE + return TRUE + +/datum/objective/exile + name = "exile" + explanation_text = "Stay alive off station. Do not go to CentCom." + +/datum/objective/exile/check_completion() + var/list/owners = get_owners() + for(var/datum/mind/mind as anything in owners) + if(!considered_alive(mind)) + return FALSE + if(SSmapping.level_has_any_trait(mind.current.z, list(ZTRAIT_STATION, ZTRAIT_CENTCOM))) //went to centcom or ended round on station + return FALSE + return TRUE + +/datum/objective/nuclear + name = "nuclear" + explanation_text = "Destroy the station with a nuclear device." + +/datum/objective/nuclear/check_completion() + if(GLOB.station_was_nuked) + return TRUE + return FALSE + +GLOBAL_LIST_EMPTY(possible_items) +/datum/objective/steal + name = "steal" + var/datum/objective_item/targetinfo = null //Save the chosen item datum so we can access it later. + var/obj/item/steal_target = null //Needed for custom objectives (they're just items, not datums). + +/datum/objective/steal/get_target() + return steal_target + +/datum/objective/steal/New() + ..() + if(!GLOB.possible_items.len)//Only need to fill the list when it's needed. + for(var/I in subtypesof(/datum/objective_item/steal)) + new I + +/datum/objective/steal/find_target(dupe_search_range) + var/list/datum/mind/owners = get_owners() + if(!dupe_search_range) + dupe_search_range = get_owners() + var/approved_targets = list() + check_items: + for(var/datum/objective_item/possible_item in GLOB.possible_items) + //PARIAH EDIT REMOVAL + /* + if(possible_item.objective_type != OBJECTIVE_ITEM_TYPE_NORMAL) + continue + */ + //PARIAH EDIT END + if(!is_unique_objective(possible_item.targetitem,dupe_search_range)) + continue + for(var/datum/mind/M in owners) + if(M.current.mind.assigned_role.title in possible_item.excludefromjob) + continue check_items + approved_targets += possible_item + if (length(approved_targets)) + return set_target(pick(approved_targets)) + return set_target(null) + +/datum/objective/steal/proc/set_target(datum/objective_item/item) + if(item) + targetinfo = item + steal_target = targetinfo.targetitem + explanation_text = "Steal [targetinfo.name]" + give_special_equipment(targetinfo.special_equipment) + return steal_target + else + explanation_text = "Free objective" + return + +/datum/objective/steal/admin_edit(mob/admin) + var/list/possible_items_all = GLOB.possible_items + var/new_target = input(admin,"Select target:", "Objective target", steal_target) as null|anything in sort_names(possible_items_all)+"custom" + if (!new_target) + return + + if (new_target == "custom") //Can set custom items. + var/custom_path = input(admin,"Search for target item type:","Type") as null|text + if (!custom_path) + return + var/obj/item/custom_target = pick_closest_path(custom_path, make_types_fancy(subtypesof(/obj/item))) + var/custom_name = initial(custom_target.name) + custom_name = stripped_input(admin,"Enter target name:", "Objective target", custom_name) + if (!custom_name) + return + steal_target = custom_target + explanation_text = "Steal [custom_name]." + + else + set_target(new_target) + +/datum/objective/steal/check_completion() + var/list/datum/mind/owners = get_owners() + if(!steal_target) + return TRUE + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + + var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. + + for(var/obj/I in all_items) //Check for items + if(istype(I, steal_target)) + if(!targetinfo) //If there's no targetinfo, then that means it was a custom objective. At this point, we know you have the item, so return 1. + return TRUE + else if(targetinfo.check_special_completion(I))//Returns 1 by default. Items with special checks will return 1 if the conditions are fulfilled. + return TRUE + + if(targetinfo && (I.type in targetinfo.altitems)) //Ok, so you don't have the item. Do you have an alternative, at least? + if(targetinfo.check_special_completion(I))//Yeah, we do! Don't return 0 if we don't though - then you could fail if you had 1 item that didn't pass and got checked first! + return TRUE + return FALSE + +GLOBAL_LIST_EMPTY(possible_items_special) +/datum/objective/steal/special //ninjas are so special they get their own subtype good for them + name = "steal special" + +/datum/objective/steal/special/New() + ..() + if(!GLOB.possible_items_special.len) + for(var/I in subtypesof(/datum/objective_item/special) + subtypesof(/datum/objective_item/stack)) + new I + +/datum/objective/steal/special/find_target(dupe_search_range) + return set_target(pick(GLOB.possible_items_special)) + +/datum/objective/capture + name = "capture" + +/datum/objective/capture/proc/gen_amount_goal() + target_amount = rand(5,10) + update_explanation_text() + return target_amount + +/datum/objective/capture/update_explanation_text() + . = ..() + explanation_text = "Capture [target_amount] lifeform\s with an energy net. Live, rare specimens are worth more." + +/datum/objective/capture/check_completion()//Basically runs through all the mobs in the area to determine how much they are worth. + var/captured_amount = 0 + var/area/centcom/central_command_areas/holding/A = GLOB.areas_by_type[/area/centcom/central_command_areas/holding] + for(var/mob/living/carbon/human/M in A)//Humans. + if(ismonkey(M)) + captured_amount+=0.1 + continue + if(M.stat == DEAD)//Dead folks are worth less. + captured_amount+=0.5 + continue + captured_amount+=1 + for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research. + if(M.stat == DEAD) + captured_amount+=0.5 + continue + captured_amount+=1 + for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans. + if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans. + if(M.stat == DEAD) + captured_amount+=1.5 + else + captured_amount+=3 + continue + if(M.stat == DEAD) + captured_amount+=1 + continue + captured_amount+=2 + return captured_amount >= target_amount + +/datum/objective/capture/admin_edit(mob/admin) + var/count = input(admin,"How many mobs to capture ?","capture",target_amount) as num|null + if(count) + target_amount = count + update_explanation_text() + +//Changeling Objectives + +/datum/objective/absorb + name = "absorb" + +/datum/objective/absorb/proc/gen_amount_goal(lowbound = 4, highbound = 6) + target_amount = rand (lowbound,highbound) + var/n_p = 1 //autowin + var/list/datum/mind/owners = get_owners() + if (SSticker.current_state == GAME_STATE_SETTING_UP) + for(var/i in GLOB.new_player_list) + var/mob/dead/new_player/P = i + if(P.ready == PLAYER_READY_TO_PLAY && !(P.mind in owners)) + n_p ++ + else if (SSticker.IsRoundInProgress()) + for(var/mob/living/carbon/human/P in GLOB.player_list) + if(!(P.mind.has_antag_datum(/datum/antagonist/changeling)) && !(P.mind in owners)) + n_p ++ + target_amount = min(target_amount, n_p) + + update_explanation_text() + return target_amount + +/datum/objective/absorb/update_explanation_text() + . = ..() + explanation_text = "Extract [target_amount] compatible genome\s." + +/datum/objective/absorb/admin_edit(mob/admin) + var/count = input(admin,"How many people to absorb?","absorb",target_amount) as num|null + if(count) + target_amount = count + update_explanation_text() + +/datum/objective/absorb/check_completion() + var/list/datum/mind/owners = get_owners() + var/absorbed_count = 0 + for(var/datum/mind/M in owners) + if(!M) + continue + var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) + if(!changeling || !changeling.stored_profiles) + continue + absorbed_count += changeling.absorbed_count + return absorbed_count >= target_amount + +/datum/objective/absorb_most + name = "absorb most" + explanation_text = "Extract more compatible genomes than any other Changeling." + +/datum/objective/absorb_most/check_completion() + var/list/datum/mind/owners = get_owners() + var/absorbed_count = 0 + for(var/datum/mind/M in owners) + if(!M) + continue + var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) + if(!changeling || !changeling.stored_profiles) + continue + absorbed_count += changeling.absorbed_count + + for(var/datum/antagonist/changeling/changeling2 in GLOB.antagonists) + if(!changeling2.owner || changeling2.owner == owner || !changeling2.stored_profiles || changeling2.absorbed_count < absorbed_count) + continue + return FALSE + return TRUE + +/datum/objective/absorb_changeling + name = "absorb changeling" + explanation_text = "Absorb another Changeling." + +/datum/objective/absorb_changeling/check_completion() + var/list/datum/mind/owners = get_owners() + for(var/datum/mind/M in owners) + if(!M) + continue + var/datum/antagonist/changeling/changeling = M.has_antag_datum(/datum/antagonist/changeling) + if(!changeling) + continue + var/total_genetic_points = changeling.genetic_points + + for(var/datum/action/changeling/p in changeling.purchased_powers) + total_genetic_points += p.dna_cost + + if(total_genetic_points > initial(changeling.genetic_points)) + return TRUE + return FALSE + +//End Changeling Objectives + +/datum/objective/destroy + name = "destroy AI" + +/datum/objective/destroy/find_target(dupe_search_range) + var/list/possible_targets = active_ais(1) + var/mob/living/silicon/ai/target_ai = pick(possible_targets) + target = target_ai.mind + update_explanation_text() + return target + +/datum/objective/destroy/check_completion() + if(target?.current) + return target.current.stat == DEAD || target.current.z > 6 || !target.current.ckey //Borgs/brains/AIs count as dead for traitor objectives. + return TRUE + +/datum/objective/destroy/update_explanation_text() + ..() + if(target?.current) + explanation_text = "Destroy [target.name], the experimental AI." + else + explanation_text = "Free Objective" + +/datum/objective/destroy/admin_edit(mob/admin) + var/list/possible_targets = active_ais(1) + if(possible_targets.len) + var/mob/new_target = input(admin,"Select target:", "Objective target") as null|anything in sort_names(possible_targets) + target = new_target.mind + else + to_chat(admin, span_boldwarning("No active AIs with minds.")) + update_explanation_text() + +/datum/objective/steal_n_of_type + name = "steal five of" + explanation_text = "Steal some items!" + highlander = FALSE + //what types we want to steal + var/list/wanted_items = list() + //how many we want to steal + var/amount = 5 + +/datum/objective/steal_n_of_type/New() + ..() + wanted_items = typecacheof(wanted_items) + +/datum/objective/steal_n_of_type/check_completion() + var/list/datum/mind/owners = get_owners() + var/stolen_count = 0 + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(is_type_in_typecache(I, wanted_items)) + if(check_if_valid_item(I)) + stolen_count++ + return stolen_count >= amount + +/datum/objective/steal_n_of_type/proc/check_if_valid_item(obj/item/current_item) + return TRUE + +/datum/objective/steal_n_of_type/summon_guns + name = "steal guns" + explanation_text = "Steal at least five guns!" + wanted_items = list(/obj/item/gun) + amount = 5 + +/datum/objective/steal_n_of_type/summon_guns/check_if_valid_item(obj/item/current_item) + var/obj/item/gun/gun = current_item + return !(gun.gun_flags & NOT_A_REAL_GUN) + +/datum/objective/steal_n_of_type/summon_guns/thief + explanation_text = "Steal at least 3 guns!" + amount = 3 + +/datum/objective/steal_n_of_type/summon_magic + name = "steal magic" + explanation_text = "Steal at least five magical artefacts!" + wanted_items = list() + amount = 5 + +/datum/objective/steal_n_of_type/summon_magic/New() + wanted_items = GLOB.summoned_magic_objectives + ..() + +/datum/objective/steal_n_of_type/summon_magic/check_completion() + var/list/datum/mind/owners = get_owners() + var/stolen_count = 0 + for(var/datum/mind/M in owners) + if(!isliving(M.current)) + continue + var/list/all_items = M.current.get_all_contents() //this should get things in cheesewheels, books, etc. + for(var/obj/I in all_items) //Check for wanted items + if(istype(I, /obj/item/book/granter/action/spell)) + var/obj/item/book/granter/action/spell/spellbook = I + if(spellbook.uses > 0) //if the book still has powers... + stolen_count++ //it counts. nice + else if(is_type_in_typecache(I, wanted_items)) + stolen_count++ + return stolen_count >= amount + +/datum/objective/steal_n_of_type/organs + name = "steal organs" + explanation_text = "Steal at least 5 organic organs! They must be kept healthy." + wanted_items = list(/obj/item/organ) + amount = 5 //i want this to be higher, but the organs must be fresh at roundend + +/datum/objective/steal_n_of_type/organs/check_completion() + var/list/datum/mind/owners = get_owners() + var/stolen_count = 0 + for(var/datum/mind/mind in owners) + if(!isliving(mind.current)) + continue + var/list/all_items = mind.current.get_all_contents() //this should get things in cheesewheels, books, etc. + for(var/obj/item/stolen in all_items) //Check for wanted items + var/found = FALSE + for(var/wanted_type in wanted_items) + if(istype(stolen, wanted_type)) + found = TRUE + break + if(!found) + continue + //this is an objective item + var/obj/item/organ/wanted = stolen + if(!(wanted.organ_flags & ORGAN_DEAD) && !(wanted.organ_flags & ORGAN_SYNTHETIC)) + stolen_count++ + return stolen_count >= amount + +//Created by admin tools +/datum/objective/custom + name = "custom" + +/datum/objective/custom/admin_edit(mob/admin) + var/expl = stripped_input(admin, "Custom objective:", "Objective", explanation_text) + if(expl) + explanation_text = expl + +//Ideally this would be all of them but laziness and unusual subtypes +/proc/generate_admin_objective_list() + GLOB.admin_objective_list = list() + + var/list/allowed_types = sort_list(list( + /datum/objective/assassinate, + /datum/objective/protect, + /datum/objective/jailbreak, + /datum/objective/jailbreak/detain, + /datum/objective/destroy, + /datum/objective/escape, + /datum/objective/survive, + /datum/objective/steal, + /datum/objective/nuclear, + /datum/objective/capture, + /datum/objective/absorb, + /datum/objective/gimmick, + /datum/objective/custom + ),GLOBAL_PROC_REF(cmp_typepaths_asc)) + + for(var/T in allowed_types) + var/datum/objective/X = T + GLOB.admin_objective_list[initial(X.name)] = T diff --git a/code/game/gamemodes/objectives/gimmick.dm b/code/game/gamemodes/objectives/gimmick.dm new file mode 100644 index 000000000000..d810662ffd62 --- /dev/null +++ b/code/game/gamemodes/objectives/gimmick.dm @@ -0,0 +1,51 @@ + +/datum/objective/gimmick + name = "Dastardly Act" + explanation_text = "Be dastardly as hell!" + var/list/gimmick_list + +/datum/objective/gimmick/New() + if(isnull(gimmick_list)) + gimmick_list = list( + "Try to frame innocent crewmembers for various crimes.", + "Try to sabotage as much station infrastructure as possible without getting caught.", + "Try to ruin a department's productivity with constant annoyances.", + "Get yourself arrested, and then stage a violent jailbreak.", + "If anyone gets arrested, try to rescue them. The Syndicate values its employees!", + "Try to severely obstruct the flow of traffic around the station with barricades, sabotage, or construction projects.", + "Wage a personal war against all the assistants. Try to eradicate them without attracting the attention of other departments.", + "Play increasingly more dangerous pranks on other crew members. If confronted, insist it was just a joke.", + "Waste Medbay's time by causing a lot of non-fatal injuries around the station.", + "Waste Security's time by committing a lot of minor crimes.", + "Start as many petty arguments and fistfights as possible. Be a real jerk.", + "Try to make everyone hate a job department of your choice, through misdirection and slander.", + "Try to make everyone hate a crew member of your choice, through misdirection and slander.", + "Spread rumors about a crew member of your choice and ruin their reputation.", + "Sneak into a department of your choice every once in awhile and mess with all the things inside.", + "Try to deprive the station of medical items and objects.", + "Try to deprive the station of tools and useful items.", + "Try to deprive the station of their ID cards.", + "Make the station as ugly and visually unpleasant as you can.", + "Become a literal arms dealer. Harvest as many body parts as possible from the crew.", + "Become a vigilante and violently harass people over the slightest suspicion.", + "Seek out any non-security vigilantes on the station and make their life utter hell.", + "Find another crew member's pet project and subvert it to a more violent purpose.", + "Try to become a supervillain by using costumes, treachery, and a lot of bluster and bravado.", + "Spy on the crew and uncover their deepest secrets.", + "Kidnap Ian and hold him for ransom.", + "Kidnap the Medical Director's cat and hold her for ransom.", + "Convert the bridge into your own private bar.", + "Single out a crew member and stalk them everywhere.", + "Be as useless and incompetent as possible without getting killed.", + "Make as much of the station as possible accessible to the public.", + "Try to convince your department to go on strike and refuse to do any work.", + "Steal things from crew members and attempt to auction them off for profit.", + ) + + explanation_text = pick(gimmick_list) + +/datum/objective/gimmick/check_completion() + return TRUE + +/datum/objective/gimmick/get_roundend_suffix() + return "" diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objectives/objective_items.dm similarity index 86% rename from code/game/gamemodes/objective_items.dm rename to code/game/gamemodes/objectives/objective_items.dm index 688a237bdaa2..d9dfdde10287 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objectives/objective_items.dm @@ -40,7 +40,6 @@ excludefromjob = list( JOB_CAPTAIN, JOB_CHIEF_ENGINEER, - JOB_RESEARCH_DIRECTOR, ) exists_on_map = TRUE @@ -68,11 +67,9 @@ excludefromjob = list( JOB_CAPTAIN, JOB_CHIEF_ENGINEER, - JOB_RESEARCH_DIRECTOR, - JOB_CHIEF_MEDICAL_OFFICER, - JOB_HEAD_OF_SECURITY, + JOB_MEDICAL_DIRECTOR, + JOB_SECURITY_MARSHAL, JOB_STATION_ENGINEER, - JOB_SCIENTIST, JOB_ATMOSPHERIC_TECHNICIAN, ) exists_on_map = TRUE @@ -111,7 +108,7 @@ /datum/objective_item/steal/low_risk/clown_shoes name = "the clown's shoes" targetitem = /obj/item/clothing/shoes/clown_shoes - excludefromjob = list(JOB_CLOWN, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) + excludefromjob = list(JOB_CLOWN, JOB_DECKHAND, JOB_QUARTERMASTER) /datum/objective_item/steal/low_risk/clown_shoes/TargetExists() for(var/mob/player as anything in GLOB.player_list) @@ -127,7 +124,7 @@ /datum/objective_item/steal/low_risk/cargo_budget name = "cargo's departmental budget" targetitem = /obj/item/card/id/departmental_budget/car - excludefromjob = list(JOB_QUARTERMASTER, JOB_CARGO_TECHNICIAN) + excludefromjob = list(JOB_QUARTERMASTER, JOB_DECKHAND) exists_on_map = TRUE /obj/item/card/id/departmental_budget/car/add_stealing_item_objective() @@ -145,10 +142,10 @@ ADD_STEAL_ITEM(src, /obj/item/gun/energy/laser/captain) /datum/objective_item/steal/hoslaser - name = "the head of security's personal laser gun" + name = "the security marshal's personal laser gun" targetitem = /obj/item/gun/energy/e_gun/hos difficulty = 10 - excludefromjob = list(JOB_HEAD_OF_SECURITY) + excludefromjob = list(JOB_SECURITY_MARSHAL) exists_on_map = TRUE /obj/item/gun/energy/e_gun/hos/add_stealing_item_objective() @@ -158,7 +155,7 @@ name = "a hand teleporter" targetitem = /obj/item/hand_tele difficulty = 5 - excludefromjob = list(JOB_CAPTAIN, JOB_RESEARCH_DIRECTOR, JOB_HEAD_OF_PERSONNEL) + excludefromjob = list(JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL) exists_on_map = TRUE /obj/item/hand_tele/add_stealing_item_objective() @@ -196,10 +193,9 @@ /datum/objective_item/steal/hypo name = "the hypospray" - // targetitem = /obj/item/reagent_containers/hypospray/cmo //ORIGINAL targetitem = /obj/item/hypospray/mkii/cmo //PARIAH EDIT difficulty = 5 - excludefromjob = list(JOB_CHIEF_MEDICAL_OFFICER) + excludefromjob = list(JOB_MEDICAL_DIRECTOR) exists_on_map = TRUE /obj/item/hypospray/mkii/cmo/add_stealing_item_objective() //PARIAH EDIT @@ -218,22 +214,12 @@ name = "a reflector trenchcoat" targetitem = /obj/item/clothing/suit/hooded/ablative difficulty = 3 - excludefromjob = list(JOB_HEAD_OF_SECURITY, JOB_WARDEN) + excludefromjob = list(JOB_SECURITY_MARSHAL, JOB_WARDEN) exists_on_map = TRUE /obj/item/clothing/suit/hooded/ablative/add_stealing_item_objective() ADD_STEAL_ITEM(src, /obj/item/clothing/suit/hooded/ablative) -/datum/objective_item/steal/reactive - name = "the reactive teleport armor" - targetitem = /obj/item/clothing/suit/armor/reactive/teleport - difficulty = 5 - excludefromjob = list(JOB_RESEARCH_DIRECTOR) - exists_on_map = TRUE - -/obj/item/clothing/suit/armor/reactive/teleport/add_stealing_item_objective() - ADD_STEAL_ITEM(src, /obj/item/clothing/suit/armor/reactive/teleport) - /datum/objective_item/steal/documents name = "any set of secret documents of any organization" targetitem = /obj/item/documents @@ -257,21 +243,6 @@ special_equipment += /obj/item/storage/box/syndie_kit/nuke ..() -/datum/objective_item/steal/hdd_extraction - name = "the source code for Project Goon from the master R&D server mainframe" - targetitem = /obj/item/computer_hardware/hard_drive/cluster/hdd_theft - difficulty = 10 - excludefromjob = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, JOB_GENETICIST) - exists_on_map = TRUE - -/obj/item/computer_hardware/hard_drive/cluster/hdd_theft/add_stealing_item_objective() - ADD_STEAL_ITEM(src, /obj/item/computer_hardware/hard_drive/cluster/hdd_theft) - -/datum/objective_item/steal/hdd_extraction/New() - special_equipment += /obj/item/paper/guides/antag/hdd_extraction - return ..() - - /datum/objective_item/steal/supermatter name = "a sliver of a supermatter crystal" targetitem = /obj/item/nuke_core/supermatter_sliver @@ -292,7 +263,6 @@ difficulty = 3 excludefromjob = list( JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN, - JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST, ) /datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T) @@ -334,17 +304,6 @@ return TRUE return FALSE -/datum/objective_item/steal/slime - name = "an unused sample of slime extract" - targetitem = /obj/item/slime_extract - difficulty = 3 - excludefromjob = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) - -/datum/objective_item/steal/slime/check_special_completion(obj/item/slime_extract/E) - if(E.Uses > 0) - return 1 - return 0 - /datum/objective_item/steal/blackbox name = "the Blackbox" targetitem = /obj/item/blackbox diff --git a/code/game/gamemodes/objectives/protect_object.dm b/code/game/gamemodes/objectives/protect_object.dm new file mode 100644 index 000000000000..bf44033b49b9 --- /dev/null +++ b/code/game/gamemodes/objectives/protect_object.dm @@ -0,0 +1,28 @@ +///Prevent a thing from being qdeleted. For ashwalkers, primarily. +/datum/objective/protect_object + name = "protect object" + var/datum/weakref/protect_target + var/protection_target_gone = FALSE + +/datum/objective/protect_object/proc/set_target(obj/O) + if(protect_target) + var/obj/real_target = protect_target.resolve() + UnregisterSignal(real_target, COMSIG_PARENT_QDELETING) + protection_target_gone = FALSE + protect_target = WEAKREF(O) + RegisterSignal(O, COMSIG_PARENT_QDELETING, PROC_REF(object_destroyed)) + update_explanation_text() + +/datum/objective/protect_object/update_explanation_text() + . = ..() + if(protect_target) + explanation_text = "Protect \the [protect_target.resolve()] at all costs." + else + explanation_text = "Free objective." + +/datum/objective/protect_object/check_completion() + return protection_target_gone + +/datum/objective/protect_object/proc/object_destroyed() + protection_target_gone = TRUE + protect_target = null diff --git a/code/game/gamemodes/revolution.dm b/code/game/gamemodes/revolution.dm new file mode 100644 index 000000000000..a2d64e665a93 --- /dev/null +++ b/code/game/gamemodes/revolution.dm @@ -0,0 +1,86 @@ +#define REVOLUTION_SCALING_COEFF 0.1 +///The absolute cap of headrevs. +#define REVOLUTION_MAX_HEADREVS 3 + +/datum/game_mode/revolution + name = "Revolution" + + weight = GAMEMODE_WEIGHT_EPIC + min_pop = 25 + + //Atleast 1 of any head. + required_jobs = list( + list(JOB_CAPTAIN = 1), + list(JOB_HEAD_OF_PERSONNEL = 1), + list(JOB_SECURITY_MARSHAL = 1), + list(JOB_CHIEF_ENGINEER = 1), + list(JOB_MEDICAL_DIRECTOR = 1), + list(JOB_RESEARCH_DIRECTOR = 1) + ) + + restricted_jobs = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_AI, + JOB_CYBORG, + JOB_SECURITY_OFFICER, + JOB_WARDEN, + ) + + antag_flag = ROLE_REV_HEAD + antag_datum = /datum/antagonist/rev/head + + var/datum/team/revolution/revolution + var/round_winner + +/datum/game_mode/revolution/pre_setup() + . = ..() + var/num_revs = clamp(round(length(SSticker.ready_players) * REVOLUTION_SCALING_COEFF), 1, REVOLUTION_MAX_HEADREVS) + + for(var/i = 1 to num_revs) + if(possible_antags.len <= 0) + break + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) + +/datum/game_mode/revolution/setup_antags() + revolution = new() + . = ..() + + revolution.update_objectives() + revolution.update_heads() + SSshuttle.registerHostileEnvironment(revolution) + +/datum/game_mode/revolution/give_antag_datums() + for(var/datum/mind/M in antagonists) + if(!check_eligible(M)) + antagonists -= M + log_game("Revolution: discarded [M.name] from head revolutionary due to ineligibility.") + continue + + var/datum/antagonist/rev/head/new_head = new antag_datum() + new_head.give_flash = TRUE + new_head.remove_clumsy = TRUE + M.add_antag_datum(new_head,revolution) + +/// Checks for revhead loss conditions and other antag datums. +/datum/game_mode/revolution/proc/check_eligible(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/game_mode/revolution/process(delta_time) + round_winner = revolution.check_completion() + if(round_winner) + datum_flags &= ~DF_ISPROCESSING + +/datum/game_mode/revolution/check_finished() + . = ..() + if(.) + return + return !!round_winner + +/datum/game_mode/revolution/set_round_result() + . = ..() + revolution.round_result(round_winner) diff --git a/code/game/gamemodes/traitor.dm b/code/game/gamemodes/traitor.dm new file mode 100644 index 000000000000..45fdccbd55be --- /dev/null +++ b/code/game/gamemodes/traitor.dm @@ -0,0 +1,33 @@ +///What percentage of the crew can become traitors. +#define TRAITOR_SCALING_COEFF 0.15 + +/datum/game_mode/traitor + name = "Traitor" + + weight = GAMEMODE_WEIGHT_COMMON + restricted_jobs = list(JOB_CYBORG, JOB_AI) + protected_jobs = list( + JOB_SECURITY_OFFICER, + JOB_WARDEN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + JOB_CAPTAIN, + JOB_CHIEF_ENGINEER, + JOB_MEDICAL_DIRECTOR + ) + + antag_datum = /datum/antagonist/traitor + antag_flag = ROLE_TRAITOR + +/datum/game_mode/traitor/pre_setup() + . = ..() + + var/num_traitors = 1 + + num_traitors = max(1, round(length(SSticker.ready_players) * TRAITOR_SCALING_COEFF)) + + for (var/i in 1 to num_traitors) + if(possible_antags.len <= 0) + break + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) diff --git a/code/game/gamemodes/wizard.dm b/code/game/gamemodes/wizard.dm new file mode 100644 index 000000000000..8861a490126a --- /dev/null +++ b/code/game/gamemodes/wizard.dm @@ -0,0 +1,22 @@ +///What percentage of the crew can become traitors. +#define WIZARD_SCALING_COEFF 0.05 + +/datum/game_mode/wizard + name = "Wizard" + + weight = GAMEMODE_WEIGHT_LEGENDARY + + antag_datum = /datum/antagonist/wizard + antag_flag = ROLE_WIZARD + +/datum/game_mode/wizard/pre_setup() + . = ..() + + var/num_wizards = max(1, round(length(SSticker.ready_players) * WIZARD_SCALING_COEFF)) + + for (var/i in 1 to num_wizards) + if(possible_antags.len <= 0) + break + + var/mob/M = pick_n_take(possible_antags) + select_antagonist(M.mind) diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm index cca8d6cf79f8..dcd32af745a2 100644 --- a/code/game/machinery/PDApainter.dm +++ b/code/game/machinery/PDApainter.dm @@ -79,19 +79,19 @@ switch(severity) if(EXPLODE_DEVASTATE) if(stored_pda) - SSexplosions.high_mov_atom += stored_pda + EX_ACT(stored_pda, EXPLODE_DEVASTATE) if(stored_id_card) - SSexplosions.high_mov_atom += stored_id_card + EX_ACT(stored_id_card, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) if(stored_pda) - SSexplosions.med_mov_atom += stored_pda + EX_ACT(stored_pda, EXPLODE_HEAVY) if(stored_id_card) - SSexplosions.med_mov_atom += stored_id_card + EX_ACT(stored_id_card, EXPLODE_HEAVY) if(EXPLODE_LIGHT) if(stored_pda) - SSexplosions.low_mov_atom += stored_pda + EX_ACT(stored_pda, EXPLODE_LIGHT) if(stored_id_card) - SSexplosions.low_mov_atom += stored_id_card + EX_ACT(stored_id_card, EXPLODE_LIGHT) /obj/machinery/pdapainter/handle_atom_del(atom/A) if(A == stored_pda) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 7f28327131a4..f988e51fbaf7 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -20,12 +20,12 @@ var/list/available_chems var/controls_inside = FALSE var/list/possible_chems = list( - list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/morphine, /datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/c2/libital, /datum/reagent/medicine/c2/aiuri), - list(/datum/reagent/medicine/oculine,/datum/reagent/medicine/inacusiate), - list(/datum/reagent/medicine/c2/multiver, /datum/reagent/medicine/mutadone, /datum/reagent/medicine/mannitol, /datum/reagent/medicine/salbutamol, /datum/reagent/medicine/pen_acid), - list(/datum/reagent/medicine/omnizine) + list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/morphine, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/kelotane), + list(/datum/reagent/medicine/imidazoline,/datum/reagent/medicine/inacusiate), + list(/datum/reagent/medicine/dylovene, /datum/reagent/medicine/ryetalyn, /datum/reagent/medicine/alkysine, /datum/reagent/medicine/dexalin), + list(/datum/reagent/medicine/tricordrazine) ) - var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: mutadone -> morphine + var/list/chem_buttons //Used when emagged to scramble which chem is used, eg: ryetalyn -> morphine var/scrambled_chems = FALSE //Are chem buttons scrambled? used as a warning var/enter_message = "You feel cool air surround you. You go numb as your senses turn inward." payment_department = ACCOUNT_MED @@ -76,12 +76,12 @@ /obj/machinery/sleeper/open_machine() if(!state_open && !panel_open) - flick("[initial(icon_state)]-anim", src) + z_flick("[initial(icon_state)]-anim", src) ..() /obj/machinery/sleeper/close_machine(mob/user) if((isnull(user) || istype(user)) && state_open && !panel_open) - flick("[initial(icon_state)]-anim", src) + z_flick("[initial(icon_state)]-anim", src) ..(user) var/mob/living/mob_occupant = occupant if(mob_occupant && mob_occupant.stat != DEAD) @@ -95,7 +95,7 @@ open_machine() -/obj/machinery/sleeper/MouseDrop_T(mob/target, mob/user) +/obj/machinery/sleeper/MouseDroppedOn(mob/target, mob/user) if(HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) return @@ -148,7 +148,7 @@ /obj/machinery/sleeper/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(state_open) close_machine() @@ -161,12 +161,8 @@ /obj/machinery/sleeper/process() ..() - check_nap_violations() use_power(active_power_usage) -/obj/machinery/sleeper/nap_violation(mob/violator) - open_machine() - /obj/machinery/sleeper/ui_data() var/list/data = list() data["occupied"] = occupant ? 1 : 0 @@ -174,7 +170,7 @@ data["chems"] = list() for(var/chem in available_chems) - var/datum/reagent/R = GLOB.chemical_reagents_list[chem] + var/datum/reagent/R = SSreagents.chemical_reagents_list[chem] data["chems"] += list(list("name" = R.name, "id" = R.type, "allowed" = chem_allowed(chem))) data["occupant"] = list() @@ -183,12 +179,13 @@ data["occupant"]["name"] = mob_occupant.name switch(mob_occupant.stat) if(CONSCIOUS) - data["occupant"]["stat"] = "Conscious" - data["occupant"]["statstate"] = "good" - if(SOFT_CRIT) - data["occupant"]["stat"] = "Conscious" - data["occupant"]["statstate"] = "average" - if(UNCONSCIOUS, HARD_CRIT) + if(!HAS_TRAIT(mob_occupant, TRAIT_SOFT_CRITICAL_CONDITION)) + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "good" + else + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "average" + if(UNCONSCIOUS) data["occupant"]["stat"] = "Unconscious" data["occupant"]["statstate"] = "average" if(DEAD) @@ -206,7 +203,7 @@ data["occupant"]["reagents"] = list() if(mob_occupant.reagents && mob_occupant.reagents.reagent_list.len) for(var/datum/reagent/R in mob_occupant.reagents.reagent_list) - if(R.chemical_flags & REAGENT_INVISIBLE) //Don't show hidden chems + if((R.chemical_flags & REAGENT_INVISIBLE)) // continue data["occupant"]["reagents"] += list(list("name" = R.name, "volume" = R.volume)) return data @@ -217,7 +214,6 @@ return var/mob/living/mob_occupant = occupant - check_nap_violations() switch(action) if("door") if(state_open) @@ -291,12 +287,12 @@ controls_inside = TRUE possible_chems = list( list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/laughter), - list(/datum/reagent/spraytan,/datum/reagent/barbers_aid), + list(/datum/reagent/barbers_aid), list(/datum/reagent/colorful_reagent,/datum/reagent/hair_dye), - list(/datum/reagent/drug/space_drugs,/datum/reagent/baldium) + list(/datum/reagent/drug/space_drugs) )//Exclusively uses non-lethal, "fun" chems. At an obvious downside. var/spray_chems = list( - /datum/reagent/spraytan, /datum/reagent/hair_dye, /datum/reagent/baldium, /datum/reagent/barbers_aid + /datum/reagent/hair_dye, /datum/reagent/barbers_aid )//Chemicals that need to have a touch or vapor reaction to be applied, not the standard chamber reaction. enter_message = "You're surrounded by some funky music inside the chamber. You zone out as you feel waves of krunk vibe within you." diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 93a8cd437690..ad71dbb00320 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -116,7 +116,6 @@ //AREA_USAGE_EQUIP,AREA_USAGE_ENVIRON or AREA_USAGE_LIGHT ///A combination of factors such as having power, not being broken and so on. Boolean. var/is_operational = TRUE - var/wire_compatible = FALSE var/list/component_parts = null //list of all the parts used to build it, if made from certain kinds of frames. @@ -126,6 +125,8 @@ var/obj/item/disk/data/inserted_disk = null /// Used for data management. var/obj/item/disk/data/selected_disk = null + /// Can insert a disk into this machine + var/has_disk_slot = FALSE var/panel_open = FALSE var/state_open = FALSE @@ -161,7 +162,7 @@ /// Linked Network Terminal var/obj/machinery/power/data_terminal/netjack - /// Network ID, automatically generated when `generate_netid` is true on definition. + /// Network ID, see network_flags for autopopulation info. var/net_id /// General purpose 'master' ID for slave machines. var/master_id @@ -173,11 +174,15 @@ ///Used by SSairmachines for optimizing scrubbers and vent pumps. COOLDOWN_DECLARE(hibernating) +GLOBAL_REAL_VAR(machinery_default_armor) = list() /obj/machinery/Initialize(mapload) if(!armor) - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) + armor = machinery_default_armor + . = ..() - GLOB.machines += src + + SETUP_SMOOTHING() + QUEUE_SMOOTH(src) if(ispath(circuit, /obj/item/circuitboard)) circuit = new circuit(src) @@ -189,17 +194,23 @@ if(occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) - if((resistance_flags & INDESTRUCTIBLE) && component_parts){ // This is needed to prevent indestructible machinery still blowing up. If an explosion occurs on the same tile as the indestructible machinery without the PREVENT_CONTENTS_EXPLOSION_1 flag, /datum/controller/subsystem/explosions/proc/propagate_blastwave will call ex_act on all movable atoms inside the machine, including the circuit board and component parts. However, if those parts get deleted, the entire machine gets deleted, allowing for INDESTRUCTIBLE machines to be destroyed. (See #62164 for more info) + + /* + * This is needed to prevent indestructible machinery still blowing up. + * If an explosion occurs on the same tile as the indestructible machinery without the PREVENT_CONTENTS_EXPLOSION_1 flag, + * /datum/controller/subsystem/explosions/proc/propagate_blastwave will call ex_act on all movable atoms inside the machine, + * including the circuit board and component parts. However, if those parts get deleted, the entire machine gets deleted, + * allowing for INDESTRUCTIBLE machines to be destroyed. (See tgstation#62164 for more info) + */ + if((resistance_flags & INDESTRUCTIBLE) && component_parts) flags_1 |= PREVENT_CONTENTS_EXPLOSION_1 - } if(network_flags & NETWORK_FLAG_GEN_ID) - net_id = SSnetworks.get_next_HID()//Just going to parasite this. + net_id = SSpackets.generate_net_id(src) return INITIALIZE_HINT_LATELOAD /obj/machinery/LateInitialize() - . = ..() power_change() if(use_power == NO_POWER_USE) return @@ -210,7 +221,6 @@ link_to_jack() /obj/machinery/Destroy() - GLOB.machines.Remove(src) end_processing() dump_inventory_contents() QDEL_LIST(component_parts) @@ -585,34 +595,6 @@ return TRUE // If we passed all of those checks, woohoo! We can interact with this machine. -/obj/machinery/proc/check_nap_violations() - if(!SSeconomy.full_ancap) - return TRUE - if(!occupant || state_open) - return TRUE - var/mob/living/occupant_mob = occupant - var/obj/item/card/id/occupant_id = occupant_mob.get_idcard(TRUE) - if(!occupant_id) - say("[market_verb] NAP Violation: No ID card found.") - nap_violation(occupant_mob) - return FALSE - var/datum/bank_account/insurance = occupant_id.registered_account - if(!insurance) - say("[market_verb] NAP Violation: No bank account found.") - nap_violation(occupant_mob) - return FALSE - if(!insurance.adjust_money(-fair_market_price)) - say("[market_verb] NAP Violation: Unable to pay.") - nap_violation(occupant_mob) - return FALSE - var/datum/bank_account/department_account = SSeconomy.department_accounts_by_id[payment_department] - if(department_account) - department_account.adjust_money(fair_market_price) - return TRUE - -/obj/machinery/proc/nap_violation(mob/violator) - return - //////////////////////////////////////////////////////////////////////////////////////////// /obj/machinery/attack_hand(mob/living/user, list/modifiers) @@ -620,14 +602,14 @@ if(.) return - if(LAZYACCESS(modifiers, RIGHT_CLICK) && inserted_disk) //grumble grumble click code grumble grumble - var/obj/item/disk/disk = eject_disk(user) - if(disk) - user.visible_message( - span_notice("You remove [disk] from [src]."), - span_notice("A floppy disk ejects from [src].") - ) - return TRUE + if(iscarbon(user)) + var/brainloss = user.getBrainLoss() + if(brainloss > 120) + visible_message(span_warning("\The [user] stares cluelessly at \the [src].")) + return TRUE + if(prob(min(brainloss, 30))) + to_chat(user, span_warning("You momentarily forget how to use \the [src].")) + return TRUE //Return a non FALSE value to interrupt attack_hand propagation to subtypes. /obj/machinery/interact(mob/user, special_state) @@ -645,7 +627,7 @@ ..() if(!can_interact(usr)) return TRUE - if(!usr.canUseTopic(src)) + if(!usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return TRUE add_fingerprint(usr) update_last_used(usr) @@ -658,7 +640,7 @@ return attack_hand(user) user.changeNext_move(CLICK_CD_MELEE) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - var/damage = take_damage(4, BRUTE, MELEE, 1) + var/damage = take_damage(4, BRUTE, BLUNT, 1) user.visible_message(span_danger("[user] smashes [src] with [user.p_their()] paws[damage ? "." : ", without leaving a mark!"]"), null, null, COMBAT_MESSAGE_RANGE) /obj/machinery/attack_hulk(mob/living/carbon/user) @@ -702,7 +684,7 @@ if(.) return - if(internal_disk && istype(weapon, /obj/item/disk/data)) + if(has_disk_slot && istype(weapon, /obj/item/disk/data)) insert_disk(user, weapon) return TRUE @@ -712,8 +694,23 @@ . = ..() if(.) return + update_last_used(user) +/obj/machinery/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + + if(inserted_disk) + var/obj/item/disk/disk = eject_disk(user) + if(disk) + user.visible_message( + span_notice("You remove [disk] from [src]."), + span_notice("A floppy disk ejects from [src].") + ) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/machinery/tool_act(mob/living/user, obj/item/tool, tool_type) if(SEND_SIGNAL(user, COMSIG_TRY_USE_MACHINE, src) & COMPONENT_CANT_USE_MACHINE_TOOLS) return TOOL_ACT_MELEE_CHAIN_BLOCKING @@ -825,11 +822,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += occupant + EX_ACT(occupant, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += occupant + EX_ACT(occupant, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += occupant + EX_ACT(occupant, EXPLODE_LIGHT) /obj/machinery/handle_atom_del(atom/deleting_atom) if(deleting_atom == occupant) @@ -985,18 +982,20 @@ /obj/machinery/examine(mob/user) . = ..() if(machine_stat & BROKEN) - . += span_notice("It looks broken and non-functional.") + . += span_alert("It looks broken, it likely will not operate.") + if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - . += span_warning("It's on fire!") + . += span_alert("FIRE!!") + var/healthpercent = (atom_integrity/max_integrity) * 100 switch(healthpercent) if(50 to 99) - . += "It looks slightly damaged." + . += span_notice("It looks slightly damaged.") if(25 to 50) - . += "It appears heavily damaged." + . += span_alert("It appears heavily damaged.") if(0 to 25) - . += span_warning("It's falling apart!") + . += span_alert("It appears to be barely in one piece.") /obj/machinery/examine_more(mob/user) . = ..() @@ -1041,7 +1040,7 @@ dropped_atom.pixel_y = -8 + (round( . / 3)*8) /obj/machinery/rust_heretic_act() - take_damage(500, BRUTE, MELEE, 1) + take_damage(500, BRUTE, BLUNT, 1) /obj/machinery/vv_edit_var(vname, vval) if(vname == NAMEOF(src, occupant)) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 38963d8cacf1..6c9cba56ecf4 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -7,7 +7,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, FIRE = 50, ACID = 30) + armor = list(BLUNT = 50, PUNCTURE = 20, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) var/uses = 20 var/cooldown = 0 @@ -37,7 +37,7 @@ if(cooldown_time > world.time) to_chat(user, span_warning("[src] cannot be activated for [DisplayTimeText(world.time - cooldown_time)]!")) return - new /obj/effect/particle_effect/foam(loc) + new /obj/effect/particle_effect/fluid/foam(loc) uses-- to_chat(user, span_notice("You activate [src]. It now has [uses] uses of foam remaining.")) cooldown = world.time + cooldown_time diff --git a/code/game/machinery/airlock_control.dm b/code/game/machinery/airlock_control.dm index 8e92e4902211..1dd725734df0 100644 --- a/code/game/machinery/airlock_control.dm +++ b/code/game/machinery/airlock_control.dm @@ -119,10 +119,6 @@ id_tag = INCINERATOR_ATMOS_AIRLOCK_SENSOR master_tag = INCINERATOR_ATMOS_AIRLOCK_CONTROLLER -/obj/machinery/airlock_sensor/incinerator_syndicatelava - id_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_SENSOR - master_tag = INCINERATOR_SYNDICATELAVA_AIRLOCK_CONTROLLER - /obj/machinery/airlock_sensor/update_icon_state() if(!on) icon_state = "[base_icon_state]_off" @@ -143,7 +139,7 @@ )) radio_connection.post_signal(signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) - flick("airlock_sensor_cycle", src) + z_flick("airlock_sensor_cycle", src) /obj/machinery/airlock_sensor/process() if(on) diff --git a/code/game/machinery/announcement_system.dm b/code/game/machinery/announcement_system.dm index 0121a7c84d53..9d5c06f5fb2a 100644 --- a/code/game/machinery/announcement_system.dm +++ b/code/game/machinery/announcement_system.dm @@ -16,8 +16,12 @@ GLOBAL_LIST_EMPTY(announcement_systems) circuit = /obj/item/circuitboard/machine/announcement_system + network_flags = NETWORK_FLAG_GEN_ID // Generate an ID so we can send PDA messages with a valid source. + + var/datum/radio_frequency/common_freq + var/obj/item/radio/headset/radio - var/arrival = "%PERSON has signed up as %RANK" + var/arrival = "%PERSON, %RANK has boarded the station." var/arrivalToggle = 1 var/newhead = "%PERSON, %RANK, is the department head." var/newheadToggle = 1 @@ -28,8 +32,11 @@ GLOBAL_LIST_EMPTY(announcement_systems) /obj/machinery/announcement_system/Initialize(mapload) . = ..() - GLOB.announcement_systems += src + GLOB.announcement_systems |= src + // Voice Radio makes me cry. radio = new /obj/item/radio/headset/silicon/ai(src) + // We don't need to be *present* on the frequency, just be able to send packets on it. + common_freq = SSpackets.return_frequency(FREQ_COMMON) update_appearance() /obj/machinery/announcement_system/update_icon_state() @@ -52,6 +59,12 @@ GLOBAL_LIST_EMPTY(announcement_systems) GLOB.announcement_systems -= src //"OH GOD WHY ARE THERE 100,000 LISTED ANNOUNCEMENT SYSTEMS?!!" return ..() +/obj/machinery/announcement_system/on_set_is_operational(old_value) + if(is_operational) + GLOB.announcement_systems |= src + else + GLOB.announcement_systems -= src + /obj/machinery/announcement_system/screwdriver_act(mob/living/user, obj/item/tool) tool.play_tool_sound(src) panel_open = !panel_open @@ -93,13 +106,6 @@ GLOBAL_LIST_EMPTY(announcement_systems) //PARIAH EDIT END broadcast(message, channels) -/// Announces a new security officer joining over the radio -/obj/machinery/announcement_system/proc/announce_officer(mob/officer, department) - if (!is_operational) - return - - broadcast("Officer [officer.real_name] has been assigned to [department].", list(RADIO_CHANNEL_SECURITY)) - /// Sends a message to the appropriate channels. /obj/machinery/announcement_system/proc/broadcast(message, list/channels) use_power(active_power_usage) @@ -127,7 +133,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = ..() if(.) return - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(machine_stat & BROKEN) visible_message(span_warning("[src] buzzes."), span_hear("You hear a faint buzz.")) @@ -136,14 +142,14 @@ GLOBAL_LIST_EMPTY(announcement_systems) switch(action) if("ArrivalText") var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(NewMessage) arrival = NewMessage log_game("The arrivals announcement was updated: [NewMessage] by:[key_name(usr)]") if("NewheadText") var/NewMessage = trim(html_encode(param["newText"]), MAX_MESSAGE_LEN) - if(!usr.canUseTopic(src, !issilicon(usr))) + if(!usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(NewMessage) newhead = NewMessage @@ -160,7 +166,7 @@ GLOBAL_LIST_EMPTY(announcement_systems) . = attack_ai(user) /obj/machinery/announcement_system/attack_ai(mob/user) - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(machine_stat & BROKEN) to_chat(user, span_warning("[src]'s firmware appears to be malfunctioning!")) @@ -184,3 +190,125 @@ GLOBAL_LIST_EMPTY(announcement_systems) return obj_flags |= EMAGGED act_up() + +/obj/machinery/announcement_system/proc/announce_secoff_latejoin( + mob/officer, + department, + distribution) + + if (!is_operational) + return + + broadcast("Officer [officer.real_name] has been assigned to [department].", list(RADIO_CHANNEL_SECURITY)) + + var/list/targets = list() + + var/list/partners = list() + for (var/officer_ref in distribution) + var/mob/partner = locate(officer_ref) + if (!istype(partner) || distribution[officer_ref] != department) + continue + partners += partner.real_name + + if (partners.len) + for (var/obj/item/modular_computer/pda as anything in GLOB.TabletMessengers) + if (pda.saved_identification in partners) + var/obj/item/computer_hardware/network_card/packetnet/rfcard = pda.all_components[MC_NET] + if(!istype(rfcard)) + break //No RF card to send to. + targets += rfcard.hardware_id + + if (!targets.len) + return + + for(var/next_addr in targets) + var/datum/signal/outgoing = create_signal(next_addr, list( + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = "Automated Announcement System", + "job" = "Security Department Update", + "message" = "Officer [officer.real_name] has been assigned to your department, [department].", + "automated" = TRUE, + )) + outgoing.transmission_method = TRANSMISSION_RADIO + common_freq.post_signal(outgoing, RADIO_PDAMESSAGE) + +/obj/machinery/announcement_system/proc/notify_citation(cited_name, cite_message, fine_amount) + if (!is_operational) + return + + for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) + if(tablet.saved_identification == cited_name) + var/obj/item/computer_hardware/network_card/packetnet/rfcard = tablet.all_components[MC_NET] + if(!istype(rfcard)) + break //No RF card to send to. + var/message = "You have been fined [fine_amount] credits for '[cite_message]'. Fines may be paid at security." + var/datum/signal/outgoing = create_signal(rfcard.hardware_id, list( + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = "Automated Announcement System", + "job" = "Security Citation", + "message" = message, + "automated" = TRUE, + )) + outgoing.transmission_method = TRANSMISSION_RADIO + common_freq.post_signal(outgoing, RADIO_PDAMESSAGE) + +/// A helper proc for sending an announcement to PDAs. Takes a list of hardware IDs as targets +/obj/machinery/announcement_system/proc/mass_pda_message(list/recipients, message, reason) + for(var/next_addr in recipients) + var/datum/signal/outgoing = create_signal(next_addr, list( + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = "Automated Announcement System", + "job" = reason, + "message" = message, + "automated" = TRUE, + )) + outgoing.transmission_method = TRANSMISSION_RADIO + common_freq.post_signal(outgoing, RADIO_PDAMESSAGE) + return TRUE + +/// A helper proc for sending an announcement to a single PDA. +/obj/machinery/announcement_system/proc/pda_message(recipient, message, reason) + var/datum/signal/outgoing = create_signal(recipient, list( + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = "Automated Announcement System", + "job" = reason, + "message" = message, + "automated" = TRUE, + )) + outgoing.transmission_method = TRANSMISSION_RADIO + common_freq.post_signal(outgoing, RADIO_PDAMESSAGE) + return TRUE + +/// Get an announcement system and call pda_message() +/proc/aas_pda_message(recipient, message, reason) + var/obj/machinery/announcement_system/AAS = pick(GLOB.announcement_systems) + if(!AAS) + return FALSE + + return AAS.pda_message(arglist(args)) + +/// Get an announcement system and call mass_pda_message() +/proc/aas_mass_pda_message(recipients, message, reason) + var/obj/machinery/announcement_system/AAS = pick(GLOB.announcement_systems) + if(!AAS) + return FALSE + + return AAS.mass_pda_message(arglist(args)) + +/// Send an ASS pda message to a given name +/proc/aas_pda_message_name(name, record_type, message, reason) + var/datum/data/record/R = SSdatacore.get_record_by_name(name, record_type) + if(!R || !R.fields[DATACORE_PDA_ID]) + return FALSE + + return aas_pda_message(R.fields[DATACORE_PDA_ID], message) + +/// Send an ASS pda message to an entire department +/proc/aas_pda_message_department(department, message, reason) + . = list() + for(var/datum/data/record/R as anything in SSdatacore.get_records(department)) + var/id = R.fields[DATACORE_PDA_ID] + if(id) + . += id + + return aas_mass_pda_message(., message, reason) diff --git a/code/game/machinery/atm.dm b/code/game/machinery/atm.dm new file mode 100644 index 000000000000..19ed355607c7 --- /dev/null +++ b/code/game/machinery/atm.dm @@ -0,0 +1,256 @@ +/obj/machinery/atm + name = "automated teller machine" + desc = "An age-old technology for managing one's wealth." + icon = 'icons/obj/terminals.dmi' + icon_state = "atm" + base_icon_state = "atm" + + layer = ABOVE_OBJ_LAYER + 0.001 + pixel_y = 32 + base_pixel_y = 32 + + resistance_flags = INDESTRUCTIBLE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 + + /// The bank account being interfaced + var/datum/bank_account/authenticated_account + /// The card that is currently inserted + var/obj/item/card/id/inserted_card + + /// Particle system for EMAGging + var/datum/effect_system/spark_spread/spark_system + + var/entered_pin + var/reject_topic = FALSE + +/obj/machinery/atm/Initialize(mapload) + . = ..() + var/static/count = 1 + name = "[station_name()] A.T.M #[count]" + count++ + + spark_system = new /datum/effect_system/spark_spread + spark_system.set_up(5, 0, src) + spark_system.attach(src) + +/obj/machinery/atm/Destroy() + QDEL_NULL(inserted_card) + authenticated_account = null + QDEL_NULL(spark_system) + return ..() + +/obj/machinery/atm/examine(mob/user) + . = ..() + if(inserted_card) + . += span_notice("There is a card in the card slot.") + +/obj/machinery/atm/update_icon_state() + if(machine_stat & NOPOWER) + icon_state = "[base_icon_state]_off" + else + icon_state = base_icon_state + + return ..() + +/obj/machinery/atm/process() + if(machine_stat & NOPOWER) + return + + use_power(IDLE_POWER_USE) + +/obj/machinery/atm/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(obj_flags & EMAGGED) + to_chat(user, span_warning("This machine has already been hacked.")) + return + + obj_flags |= EMAGGED + spark_system.start() + dispense_cash(rand(20, 200)) + +/obj/machinery/atm/attackby(obj/item/I, mob/user, params) + if(!isidcard(I) && !iscash(I)) + return ..() + + if(machine_stat & NOPOWER) + to_chat(user, span_warning("You attempt to insert [I] into [src], but nothing happens.")) + return TRUE + + if(isidcard(I)) + if(inserted_card) + to_chat(user, span_warning("You attempt to insert [I] into [src], but there's already something in the slot.")) + return TRUE + if(!user.transferItemToLoc(I, src)) + return TRUE + + inserted_card = I + updateUsrDialog() + playsound(loc, 'sound/machines/cardreader_insert.ogg', 50) + to_chat(user, span_notice("You insert [I] into [src].")) + return TRUE + + if(iscash(I)) + if(!authenticated_account) + to_chat(user, span_warning("You attempt to insert [I] into [src], but nothing happens.")) + return TRUE + + if(!user.transferItemToLoc(I, src)) + return TRUE + + var/value = I.get_item_credit_value() + qdel(I) + authenticated_account.adjust_money(value) + + to_chat(user, span_notice("You deposit [value] into [src].")) + updateUsrDialog() + playsound(loc, 'sound/machines/cash_insert.ogg', 50) + return TRUE + +/// Dispense the given amount of cash and give feedback. +/obj/machinery/atm/proc/dispense_cash(amt) + if(!amt) + return + + playsound(loc, 'sound/machines/cash_desert.ogg', 50) + reject_topic = TRUE + sleep(1 SECONDS) + reject_topic = FALSE + visible_message(span_notice("[src] dispenses a wad of money."), vision_distance = COMBAT_MESSAGE_RANGE) + + SSeconomy.spawn_cash_for_amount(amt, drop_location()) + +/obj/machinery/atm/proc/try_authenticate(pin) + if((machine_stat & NOPOWER) || !inserted_card?.registered_account) + return FALSE + + if(inserted_card.registered_account.account_pin != pin) + return FALSE + + authenticated_account = inserted_card.registered_account + return TRUE + +/obj/machinery/atm/ui_interact(mob/user, datum/tgui/ui) + var/datum/browser/popup = new(user, "atm", name, 460, 270) + popup.set_content(jointext(get_content(), "")) + popup.open() + +/obj/machinery/atm/Topic(href, href_list) + . = ..() + if(. || reject_topic) + return + + if(href_list["eject_id"]) + if(isnull(inserted_card)) + return TRUE + if(!usr.put_in_hands(inserted_card)) + inserted_card.forceMove(drop_location()) + inserted_card = null + playsound(loc, 'sound/machines/cardreader_desert.ogg', 50) + updateUsrDialog() + return TRUE + + if(href_list["enter_pin"]) + open_pinpad_ui(usr) + return TRUE + + if(href_list["type"]) + var/key = href_list["type"] + switch(key) + if("E") + if(try_authenticate(entered_pin)) + entered_pin = "" + playsound(loc, 'sound/machines/cardreader_read.ogg', 50) + updateUsrDialog() + sleep(world.tick_lag) + usr << browse(null, "window=atm-pinpad") + else + entered_pin = "ERROR" + open_pinpad_ui(usr) + + if("C") + entered_pin = "" + open_pinpad_ui(usr) + + else + if(!sanitize_text(key)) + return TRUE + if(length(entered_pin) >= 5) + return TRUE + + entered_pin = "[entered_pin][key]" + open_pinpad_ui(usr) + + return TRUE + + if(href_list["logout"]) + authenticated_account = null + updateUsrDialog() + return TRUE + + if(href_list["withdraw"]) + var/amt = tgui_input_number(usr, "Enter amount (1-100)", "Withdraw", 0, 100, 0) + if(!amt) + return TRUE + + amt = min(amt, authenticated_account.account_balance) + authenticated_account.adjust_money(-amt) + dispense_cash(amt) + updateUsrDialog() + return TRUE + +/obj/machinery/atm/proc/get_content() + PRIVATE_PROC(TRUE) + . = list() + . += "
" + . += "
" + . += {" + + Automated Teller Machine + + "} + + . += "
" + if(authenticated_account) + . += {" + Welcome, [authenticated_account.account_holder].

+ Your balance is: [authenticated_account.account_balance] + "} + + . += "
" + . += jointext(buttons(), "") + . += "
" + . += "
" + +/obj/machinery/atm/proc/buttons() + PRIVATE_PROC(TRUE) + RETURN_TYPE(/list) + . = list() + + . += "
[button_element(src, "Eject Card", "eject_id=1")]
" + + if(!authenticated_account) + . += "
[button_element(src, "Enter PIN", "enter_pin=1")]

" + else + . += "
[button_element(src, "Withdraw", "withdraw=1")]
" + . += "
[button_element(src, "Logout", "logout=1")]
" + +/obj/machinery/atm/proc/open_pinpad_ui(mob/user) + PRIVATE_PROC(TRUE) + var/datum/browser/popup = new(user, "atm-pinpad", "Enter Pin", 300, 280) + var/dat = "[src]
\n\n" + dat += {" +
\n>[entered_pin]
\n1 +-2 +-3
\n +4 +-5 +-6
\n +7 +-8 +-9
\n +C +-0 +-E
\n
"} + + popup.set_content(dat) + popup.open() diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 3839f6620434..5c9ce0d6ef1a 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -6,6 +6,7 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.5 circuit = /obj/item/circuitboard/machine/autolathe layer = BELOW_OBJ_LAYER + has_disk_slot = TRUE var/operating = FALSE var/list/L = list() @@ -290,11 +291,6 @@ if(length(picked_materials)) new_item.set_custom_materials(picked_materials, 1 / multiplier) //Ensure we get the non multiplied amount - for(var/x in picked_materials) - var/datum/material/M = x - if(!istype(M, /datum/material/glass) && !istype(M, /datum/material/iron)) - user.client.give_award(/datum/award/achievement/misc/getting_an_upgrade, user) - icon_state = "autolathe" busy = FALSE @@ -316,7 +312,9 @@ . += ..() var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Storing up to [materials.max_amount] material units.
Material consumption at [creation_efficiency*100]%.") + . += span_notice("The status display reads:") + . += span_notice("[FOURSPACES]Storing up to [materials.max_amount] material units.") + . += span_notice("[FOURSPACES]Material consumption at [creation_efficiency*100]%.") /obj/machinery/autolathe/proc/can_build(datum/design/D, amount = 1) if(length(D.make_reagents)) @@ -435,6 +433,7 @@ /datum/design/airlock_painter, /datum/design/airlock_painter/decal, /datum/design/airlock_painter/decal/tile, + /datum/design/paint_sprayer, /datum/design/emergency_oxygen, /datum/design/plasmaman_tank_belt, /datum/design/iron, @@ -449,7 +448,6 @@ /datum/design/scalpel, /datum/design/circular_saw, /datum/design/bonesetter, - /datum/design/surgical_drapes, /datum/design/surgicaldrill, /datum/design/retractor, /datum/design/cautery, @@ -496,8 +494,6 @@ /datum/design/plastic_ring, /datum/design/plastic_box, /datum/design/sticky_tape, - /datum/design/petridish, - /datum/design/swab, /datum/design/chisel, /datum/design/control, /datum/design/paperroll, diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm index 2fb279f08b67..807306388efb 100644 --- a/code/game/machinery/bank_machine.dm +++ b/code/game/machinery/bank_machine.dm @@ -26,10 +26,7 @@ var/value = 0 if(istype(I, /obj/item/stack/spacecash)) var/obj/item/stack/spacecash/C = I - value = C.value * C.amount - else if(istype(I, /obj/item/holochip)) - var/obj/item/holochip/H = I - value = H.credits + value = C.get_item_credit_value() if(value) var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] if(D) @@ -100,5 +97,5 @@ /obj/machinery/computer/bank_machine/proc/end_syphon() siphoning = FALSE - new /obj/item/holochip(drop_location(), syphoning_credits) //get the loot + SSeconomy.spawn_cash_for_amount(syphoning_credits, drop_location()) syphoning_credits = 0 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 9dcb71b070d4..83785008875f 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -11,7 +11,7 @@ var/id = null var/initialized_button = 0 var/silicon_access_disabled = FALSE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, FIRE = 90, ACID = 70) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 90, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, FIRE = 90, ACID = 70) idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.02 resistance_flags = LAVA_PROOF | FIRE_PROOF @@ -65,7 +65,7 @@ update_appearance() else to_chat(user, span_alert("Maintenance Access Denied.")) - flick("[skin]-denied", src) + z_flick("[skin]-denied", src) return TRUE @@ -168,7 +168,7 @@ if(!allowed(user)) to_chat(user, span_alert("Access Denied.")) - flick("[skin]-denied", src) + z_flick("[skin]-denied", src) return use_power(5) @@ -229,16 +229,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) id = TEST_ROOM_ATMOS_MAINVENT_2 req_one_access = list(ACCESS_ATMOSPHERICS) -/obj/machinery/button/door/incinerator_vent_syndicatelava_main - name = "turbine vent control" - id = INCINERATOR_SYNDICATELAVA_MAINVENT - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/button/door/incinerator_vent_syndicatelava_aux - name = "combustion chamber vent control" - id = INCINERATOR_SYNDICATELAVA_AUXVENT - req_access = list(ACCESS_SYNDICATE) - /obj/machinery/button/massdriver name = "mass driver button" desc = "A remote control switch for a mass driver." @@ -269,9 +259,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/button/door, 24) /obj/machinery/button/ignition/incinerator/atmos id = INCINERATOR_ATMOS_IGNITER -/obj/machinery/button/ignition/incinerator/syndicatelava - id = INCINERATOR_SYNDICATELAVA_IGNITER - /obj/machinery/button/flasher name = "flasher button" desc = "A remote control switch for a mounted flasher." diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index acb6246bd41e..b61d7a7e04d5 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -12,7 +12,7 @@ layer = WALL_OBJ_LAYER resistance_flags = FIRE_PROOF damage_deflection = 12 - armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, FIRE = 90, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 20, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, FIRE = 90, ACID = 50) max_integrity = 100 integrity_failure = 0.5 @@ -67,6 +67,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/Initialize(mapload, obj/structure/camera_assembly/old_assembly) . = ..() + SET_TRACKING(__TYPE__) + for(var/i in network) network -= i network += lowertext(i) @@ -111,12 +113,18 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/proc/create_prox_monitor() if(!proximity_monitor) proximity_monitor = new(src, 1) + RegisterSignal(proximity_monitor, COMSIG_PARENT_QDELETING, PROC_REF(proximity_deleted)) + +/obj/machinery/camera/proc/proximity_deleted() + SIGNAL_HANDLER + proximity_monitor = null /obj/machinery/camera/proc/set_area_motion(area/A) area_motion = A create_prox_monitor() /obj/machinery/camera/Destroy() + UNSET_TRACKING(__TYPE__) if(can_use()) toggle_cam(null, 0) //kick anyone viewing out and remove from the camera chunks GLOB.cameranet.removeCamera(src) @@ -147,26 +155,29 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) /obj/machinery/camera/examine(mob/user) . = ..() if(isEmpProof(TRUE)) //don't reveal it's upgraded if was done via MALF AI Upgrade Camera Network ability - . += "It has electromagnetic interference shielding installed." + . += span_notice("It has electromagnetic interference shielding installed.") else - . += span_info("It can be shielded against electromagnetic interference with some plasma.") + . += span_notice("It can be shielded against electromagnetic interference with some plasma.") + if(isXRay(TRUE)) //don't reveal it's upgraded if was done via MALF AI Upgrade Camera Network ability - . += "It has an X-ray photodiode installed." + . += span_notice("It has an X-ray photodiode installed.") else - . += span_info("It can be upgraded with an X-ray photodiode with an analyzer.") + . += span_notice("It can be upgraded with an X-ray photodiode with an analyzer.") + if(isMotion()) - . += "It has a proximity sensor installed." + . += span_notice("It has a proximity sensor installed.") else - . += span_info("It can be upgraded with a proximity sensor.") + . += span_notice("It can be upgraded with a proximity sensor.") if(!status) - . += span_info("It's currently deactivated.") + . += span_notice("It's currently deactivated.") if(!panel_open && powered()) . += span_notice("You'll need to open its maintenance panel with a screwdriver to turn it back on.") + if(panel_open) - . += span_info("Its maintenance panel is currently open.") + . += span_notice("Its maintenance panel is currently open.") if(!status && powered()) - . += span_info("It can reactivated with wirecutters.") + . += span_notice("It can reactivated with wirecutters.") /obj/machinery/camera/emp_act(severity) . = ..() @@ -252,7 +263,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) var/obj/item/choice = tgui_input_list(user, "Select a part to remove", "Part Removal", sort_names(droppable_parts)) if(isnull(choice)) return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH|USE_IGNORE_TK)) return to_chat(user, span_notice("You remove [choice] from [src].")) if(choice == assembly.xray_module) @@ -373,7 +384,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) else if (potential_viewer.client?.eye == src) to_chat(potential_viewer, "[span_name("[paper_user]")] holds \a [itemname] up to one of the cameras ...") potential_viewer.log_talk(itemname, LOG_VICTIM, tag="Pressed to camera from [key_name(paper_user)]", log_globally=FALSE) - potential_viewer << browse(text("[][]", itemname, info), text("window=[]", itemname)) + potential_viewer << browse("[itemname][info]","window=[itemname]") return else if(istype(I, /obj/item/camera_bug)) @@ -469,7 +480,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/camera/xray, 0) if(displaymessage) if(user) visible_message(span_danger("[user] [change_msg] [src]!")) - add_hiddenprint(user) + log_touch(user) else visible_message(span_danger("\The [src] [change_msg]!")) diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index d7606635ccbb..da18b6c858eb 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -206,7 +206,7 @@ var/obj/item/choice = tgui_input_list(user, "Select a part to remove", "Part Removal", sort_names(droppable_parts)) if(isnull(choice)) return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH|USE_IGNORE_TK)) return to_chat(user, span_notice("You remove [choice] from [src].")) drop_upgrade(choice) diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm index a00a1c8bf855..4d09cc0bf4bf 100644 --- a/code/game/machinery/camera/motion.dm +++ b/code/game/machinery/camera/motion.dm @@ -86,7 +86,7 @@ return localMotionTargets |= WEAKREF(AM) if (!detectTime) - for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + for(var/obj/machinery/computer/security/telescreen/entertainment/TV as anything in INSTANCES_OF(/obj/machinery/computer/security/telescreen/entertainment)) TV.notify(TRUE) detectTime = world.time + 30 SECONDS @@ -103,5 +103,5 @@ detectTime = world.time + 30 SECONDS else if (world.time > detectTime) detectTime = 0 - for(var/obj/machinery/computer/security/telescreen/entertainment/TV in GLOB.machines) + for(var/obj/machinery/computer/security/telescreen/entertainment/TV as anything in INSTANCES_OF(/obj/machinery/computer/security/telescreen/entertainment)) TV.notify(FALSE) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index cc7adfd11cc9..5119b17c284d 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -56,17 +56,15 @@ /obj/machinery/camera/autoname/LateInitialize() . = ..() - number = 1 - var/area/A = get_area(src) - if(A) - for(var/obj/machinery/camera/autoname/C in GLOB.machines) - if(C == src) - continue - var/area/CA = get_area(C) - if(CA.type == A.type) - if(C.number) - number = max(number, C.number+1) - c_tag = "[strip_improper(A.name)] #[number]" //...How long was this a bug????? + + var/static/list/autonames_in_areas = list() + + var/area/camera_area = get_area(src) + + number = autonames_in_areas[camera_area] + 1 + autonames_in_areas[camera_area] = number + + c_tag = "[format_text(camera_area.name)] #[number]" // UPGRADE PROCS diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 646efab885b9..746b21f58f32 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -10,7 +10,7 @@ for (var/obj/machinery/camera/C in L) var/list/tempnetwork = C.network&src.network if (length(tempnetwork)) - T[text("[][]", C.c_tag, (C.can_use() ? null : " (Deactivated)"))] = C + T["[C.c_tag][(C.can_use() ? null : " (Deactivated)")]"] = C return T @@ -48,7 +48,7 @@ var/name = L.name while(name in track.names) track.namecounts[name]++ - name = text("[] ([])", name, track.namecounts[name]) + name = "[name] ([track.namecounts[name]])" track.names.Add(name) track.namecounts[name] = 1 @@ -73,7 +73,7 @@ var/datum/weakref/target = (isnull(track.humans[target_name]) ? track.others[target_name] : track.humans[target_name]) - ai_actual_track(target.resolve()) + 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 287e6cc842a7..1d8fe4877b05 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -28,10 +28,12 @@ /obj/machinery/cell_charger/examine(mob/user) . = ..() . += "There's [charging ? "a" : "no"] cell in the charger." - if(charging) - . += "Current charge: [round(charging.percent(), 1)]%." + if(in_range(user, src) || isobserver(user)) - . += span_notice("The status display reads: Charging power: [charge_rate]W.") + . += span_notice("The status display reads:") + . += span_notice("[FOURSPACES]Charging power: [charge_rate]W.") + if(charging) + . += span_notice("[FOURSPACES]Current charge: [round(charging.percent(), 1)]%.") /obj/machinery/cell_charger/wrench_act(mob/living/user, obj/item/tool) . = ..() diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm deleted file mode 100644 index 8bac7369557c..000000000000 --- a/code/game/machinery/civilian_bounties.dm +++ /dev/null @@ -1,383 +0,0 @@ -///Percentage of a civilian bounty the civilian will make. -#define CIV_BOUNTY_SPLIT 30 - -///Pad for the Civilian Bounty Control. -/obj/machinery/piratepad/civilian - name = "civilian bounty pad" - desc = "A machine designed to send civilian bounty targets to centcom." - layer = TABLE_LAYER - resistance_flags = FIRE_PROOF - circuit = /obj/item/circuitboard/machine/bountypad - -///Computer for assigning new civilian bounties, and sending bounties for collection. -/obj/machinery/computer/piratepad_control/civilian - name = "civilian bounty control terminal" - desc = "A console for assigning civilian bounties to inserted ID cards, and for controlling the bounty pad for export." - status_report = "Ready for delivery." - icon_screen = "civ_bounty" - icon_keyboard = "id_key" - warmup_time = 3 SECONDS - circuit = /obj/item/circuitboard/computer/bountypad - interface_type = "CivCargoHoldTerminal" - ///Typecast of an inserted, scanned ID card inside the console, as bounties are held within the ID card. - var/obj/item/card/id/inserted_scan_id - -/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, params) - if(isidcard(I)) - if(id_insert(user, I, inserted_scan_id)) - inserted_scan_id = I - return TRUE - return ..() - -/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) - if(istype(I) && istype(I.buffer,/obj/machinery/piratepad/civilian)) - to_chat(user, span_notice("You link [src] with [I.buffer] in [I] buffer.")) - pad_ref = WEAKREF(I.buffer) - return TRUE - -/obj/machinery/computer/piratepad_control/civilian/LateInitialize() - . = ..() - if(cargo_hold_id) - for(var/obj/machinery/piratepad/civilian/C in GLOB.machines) - if(C.cargo_hold_id == cargo_hold_id) - pad_ref = WEAKREF(C) - return - else - var/obj/machinery/piratepad/civilian/pad = locate() in range(4,src) - pad_ref = WEAKREF(pad) - -/obj/machinery/computer/piratepad_control/civilian/recalc() - if(sending) - return FALSE - if(!inserted_scan_id) - status_report = "Please insert your ID first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - return FALSE - if(!inserted_scan_id.registered_account.civilian_bounty) - status_report = "Please accept a new civilian bounty first." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - return FALSE - status_report = "Civilian Bounty: " - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - if(inserted_scan_id.registered_account.civilian_bounty.applies_to(AM)) - status_report += "Target Applicable." - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) - return - status_report += "Not Applicable." - playsound(loc, 'sound/machines/synth_no.ogg', 30 , TRUE) - -/** - * This fully rewrites base behavior in order to only check for bounty objects, and nothing else. - */ -/obj/machinery/computer/piratepad_control/civilian/send() - playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) - if(!sending) - return - if(!inserted_scan_id) - stop_sending() - return FALSE - if(!inserted_scan_id.registered_account.civilian_bounty) - stop_sending() - return FALSE - var/datum/bounty/curr_bounty = inserted_scan_id.registered_account.civilian_bounty - var/active_stack = 0 - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - if(curr_bounty.applies_to(AM)) - active_stack ++ - curr_bounty.ship(AM) - qdel(AM) - if(active_stack >= 1) - status_report += "Bounty Target Found x[active_stack]. " - else - status_report = "No applicable targets found. Aborting." - stop_sending() - if(curr_bounty.can_claim()) - //Pay for the bounty with the ID's department funds. - status_report += "Bounty completed! Please give your bounty cube to cargo for your automated payout shortly." - inserted_scan_id.registered_account.reset_bounty() - SSeconomy.civ_bounty_tracker++ - - var/obj/item/bounty_cube/reward = new /obj/item/bounty_cube(drop_location()) - reward.set_up(curr_bounty, inserted_scan_id) - - pad.visible_message(span_notice("[pad] activates!")) - flick(pad.sending_state,pad) - pad.icon_state = pad.idle_state - playsound(loc, 'sound/machines/synth_yes.ogg', 30 , TRUE) - sending = FALSE - -///Here is where cargo bounties are added to the player's bank accounts, then adjusted and scaled into a civilian bounty. -/obj/machinery/computer/piratepad_control/civilian/proc/add_bounties() - if(!inserted_scan_id || !inserted_scan_id.registered_account) - return - var/datum/bank_account/pot_acc = inserted_scan_id.registered_account - if((pot_acc.civilian_bounty || pot_acc.bounties) && !COOLDOWN_FINISHED(pot_acc, bounty_timer)) - var/curr_time = round((COOLDOWN_TIMELEFT(pot_acc, bounty_timer)) / (1 MINUTES), 0.01) - say("Internal ID network spools coiling, try again in [curr_time] minutes!") - return FALSE - if(!pot_acc.account_job) - say("Requesting ID card has no job assignment registered!") - return FALSE - var/list/datum/bounty/crumbs = list(random_bounty(pot_acc.account_job.bounty_types), // We want to offer 2 bounties from their appropriate job catagories - random_bounty(pot_acc.account_job.bounty_types), // and 1 guarenteed assistant bounty if the other 2 suck. - random_bounty(CIV_JOB_BASIC)) - COOLDOWN_START(pot_acc, bounty_timer, 5 MINUTES) - pot_acc.bounties = crumbs - -/obj/machinery/computer/piratepad_control/civilian/proc/pick_bounty(choice) - if(!inserted_scan_id || !inserted_scan_id.registered_account || !inserted_scan_id.registered_account.bounties || !inserted_scan_id.registered_account.bounties[choice]) - playsound(loc, 'sound/machines/synth_no.ogg', 40 , TRUE) - return - inserted_scan_id.registered_account.civilian_bounty = inserted_scan_id.registered_account.bounties[choice] - inserted_scan_id.registered_account.bounties = null - return inserted_scan_id.registered_account.civilian_bounty - -/obj/machinery/computer/piratepad_control/civilian/AltClick(mob/user) - . = ..() - if(!Adjacent(user)) - return FALSE - id_eject(user, inserted_scan_id) - -/obj/machinery/computer/piratepad_control/civilian/ui_data(mob/user) - . = list() - .["points"] = points - .["pad"] = pad_ref?.resolve() ? TRUE : FALSE - .["sending"] = sending - .["status_report"] = status_report - .["id_inserted"] = inserted_scan_id - if(inserted_scan_id?.registered_account) - if(inserted_scan_id.registered_account.civilian_bounty) - .["id_bounty_info"] = inserted_scan_id.registered_account.civilian_bounty.description - .["id_bounty_num"] = inserted_scan_id.registered_account.bounty_num() - .["id_bounty_value"] = (inserted_scan_id.registered_account.civilian_bounty.reward) * (CIV_BOUNTY_SPLIT/100) - if(inserted_scan_id.registered_account.bounties) - .["picking"] = TRUE - .["id_bounty_names"] = list(inserted_scan_id.registered_account.bounties[1].name, - inserted_scan_id.registered_account.bounties[2].name, - inserted_scan_id.registered_account.bounties[3].name) - .["id_bounty_values"] = list(inserted_scan_id.registered_account.bounties[1].reward * (CIV_BOUNTY_SPLIT/100), - inserted_scan_id.registered_account.bounties[2].reward * (CIV_BOUNTY_SPLIT/100), - inserted_scan_id.registered_account.bounties[3].reward * (CIV_BOUNTY_SPLIT/100)) - else - .["picking"] = FALSE - - return - -/obj/machinery/computer/piratepad_control/civilian/ui_act(action, params) - . = ..() - if(.) - return - if(!pad_ref?.resolve()) - return - if(!usr.canUseTopic(src, BE_CLOSE) || (machine_stat & (NOPOWER|BROKEN))) - return - switch(action) - if("recalc") - recalc() - if("send") - start_sending() - if("stop") - stop_sending() - if("pick") - pick_bounty(params["value"]) - if("bounty") - add_bounties() - if("eject") - id_eject(usr, inserted_scan_id) - inserted_scan_id = null - . = TRUE - -///Self explanitory, holds the ID card in the console for bounty payout and manipulation. -/obj/machinery/computer/piratepad_control/civilian/proc/id_insert(mob/user, obj/item/inserting_item, obj/item/target) - var/obj/item/card/id/card_to_insert = inserting_item - var/holder_item = FALSE - - if(!isidcard(card_to_insert)) - card_to_insert = inserting_item.RemoveID() - holder_item = TRUE - - if(!card_to_insert || !user.transferItemToLoc(card_to_insert, src)) - return FALSE - - if(target) - if(holder_item && inserting_item.InsertID(target)) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - else - id_eject(user, target) - - user.visible_message(span_notice("[user] inserts \the [card_to_insert] into \the [src]."), - span_notice("You insert \the [card_to_insert] into \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - ui_interact(user) - return TRUE - -///Removes A stored ID card. -/obj/machinery/computer/piratepad_control/civilian/proc/id_eject(mob/user, obj/target) - if(!target) - to_chat(user, span_warning("That slot is empty!")) - return FALSE - else - target.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(target) - user.visible_message(span_notice("[user] gets \the [target] from \the [src]."), \ - span_notice("You get \the [target] from \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - inserted_scan_id = null - return TRUE - -///Upon completion of a civilian bounty, one of these is created. It is sold to cargo to give the cargo budget bounty money, and the person who completed it cash. -/obj/item/bounty_cube - name = "bounty cube" - desc = "A bundle of compressed hardlight data, containing a completed bounty. Sell this on the cargo shuttle to claim it!" - icon = 'icons/obj/economy.dmi' - icon_state = "bounty_cube" - ///Value of the bounty that this bounty cube sells for. - var/bounty_value = 0 - ///Multiplier for the bounty payout received by the Supply budget if the cube is sent without having to nag. - var/speed_bonus = 0.2 - ///Multiplier for the bounty payout received by the person who completed the bounty. - var/holder_cut = 0.3 - ///Multiplier for the bounty payout received by the person who claims the handling tip. - var/handler_tip = 0.1 - ///Time between nags. - var/nag_cooldown = 5 MINUTES - ///How much the time between nags extends each nag. - var/nag_cooldown_multiplier = 1.25 - ///Next world tick to nag Supply listeners. - var/next_nag_time - ///Who completed the bounty. - var/bounty_holder - ///What job the bounty holder had. - var/bounty_holder_job - ///What the bounty was for. - var/bounty_name - ///Bank account of the person who completed the bounty. - var/datum/bank_account/bounty_holder_account - ///Bank account of the person who receives the handling tip. - var/datum/bank_account/bounty_handler_account - ///Our internal radio. - var/obj/item/radio/radio - ///The key our internal radio uses. - var/radio_key = /obj/item/encryptionkey/headset_cargo - -/obj/item/bounty_cube/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_BARCODES, INNATE_TRAIT) // Don't allow anyone to override our pricetag component with a barcode - radio = new(src) - radio.keyslot = new radio_key - radio.set_listening(FALSE, TRUE) - radio.recalculateChannels() - RegisterSignal(radio, COMSIG_ITEM_PRE_EXPORT, PROC_REF(on_export)) - -/obj/item/bounty_cube/Destroy() - if(radio) - UnregisterSignal(radio, COMSIG_ITEM_PRE_EXPORT) - QDEL_NULL(radio) - return ..() - -/obj/item/bounty_cube/examine() - . = ..() - if(speed_bonus) - . += span_notice("[time2text(next_nag_time - world.time,"mm:ss")] remains until [bounty_value * speed_bonus] credit speedy delivery bonus lost.") - if(handler_tip && !bounty_handler_account) - . += span_notice("Scan this in the cargo shuttle with an export scanner to register your bank account for the [bounty_value * handler_tip] credit handling tip.") - -/* - * Signal proc for [COMSIG_ITEM_EXPORTED], registered on the internal radio. - * - * Deletes the internal radio before being exported, - * to stop it from bring counted as an export. - * - * No 4 free credits for you! - */ -/obj/item/bounty_cube/proc/on_export(datum/source) - SIGNAL_HANDLER - - QDEL_NULL(radio) - return COMPONENT_STOP_EXPORT // stops the radio from exporting, not the cube - -/obj/item/bounty_cube/process(delta_time) - //if our nag cooldown has finished and we aren't on Centcom or in transit, then nag - if(COOLDOWN_FINISHED(src, next_nag_time) && !is_centcom_level(z) && !is_reserved_level(z)) - //set up our nag message - var/nag_message = "[src] is unsent in [get_area(src)]." - - //nag on Supply channel and reduce the speed bonus multiplier to nothing - var/speed_bonus_lost = "[speed_bonus ? " Speedy delivery bonus of [bounty_value * speed_bonus] credit\s lost." : ""]" - radio.talk_into(src, "[nag_message][speed_bonus_lost]", RADIO_CHANNEL_SUPPLY) - speed_bonus = 0 - - //alert the holder - bounty_holder_account.bank_card_talk("[nag_message]") - - //if someone has registered for the handling tip, nag them - bounty_handler_account?.bank_card_talk(nag_message) - - //increase our cooldown length and start it again - nag_cooldown = nag_cooldown * nag_cooldown_multiplier - COOLDOWN_START(src, next_nag_time, nag_cooldown) - -/obj/item/bounty_cube/proc/set_up(datum/bounty/my_bounty, obj/item/card/id/holder_id) - bounty_value = my_bounty.reward - bounty_name = my_bounty.name - bounty_holder = holder_id.registered_name - bounty_holder_job = holder_id.assignment - bounty_holder_account = holder_id.registered_account - name = "\improper [bounty_value] cr [name]" - desc += " The sales tag indicates it was [bounty_holder] ([bounty_holder_job])'s reward for completing the [bounty_name] bounty." - AddComponent(/datum/component/pricetag, holder_id.registered_account, holder_cut, FALSE) - AddComponent(/datum/component/gps, "[src]") - START_PROCESSING(SSobj, src) - COOLDOWN_START(src, next_nag_time, nag_cooldown) - radio.talk_into(src,"Created in [get_area(src)] by [bounty_holder] ([bounty_holder_job]). Speedy delivery bonus lost in [time2text(next_nag_time - world.time,"mm:ss")].", RADIO_CHANNEL_SUPPLY) - -//for when you need a REAL bounty cube to test with and don't want to do a bounty each time your code changes -/obj/item/bounty_cube/debug_cube - name = "debug bounty cube" - desc = "Use in-hand to set it up with a random bounty. Requires an ID it can detect with a bank account attached. \ - This will alert Supply over the radio with your name and location, and cargo techs will be dispatched with kill on sight clearance." - var/set_up = FALSE - -/obj/item/bounty_cube/debug_cube/attack_self(mob/user) - if(!isliving(user)) - to_chat(user, span_warning("You aren't eligible to use this!")) - return ..() - - if(!set_up) - var/mob/living/squeezer = user - if(squeezer.get_bank_account()) - set_up(random_bounty(), squeezer.get_idcard()) - set_up = TRUE - return ..() - to_chat(user, span_notice("It can't detect your bank account.")) - - return ..() - -///Beacon to launch a new bounty setup when activated. -/obj/item/civ_bounty_beacon - name = "civilian bounty beacon" - desc = "N.T. approved civilian bounty beacon, toss it down and you will have a bounty pad and computer delivered to you." - icon = 'icons/obj/objects.dmi' - icon_state = "floor_beacon" - var/uses = 2 - -/obj/item/civ_bounty_beacon/attack_self() - loc.visible_message(span_warning("\The [src] begins to beep loudly!")) - addtimer(CALLBACK(src, PROC_REF(launch_payload)), 1 SECONDS) - -/obj/item/civ_bounty_beacon/proc/launch_payload() - playsound(src, SFX_SPARKS, 80, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - switch(uses) - if(2) - new /obj/machinery/piratepad/civilian(drop_location()) - if(1) - new /obj/machinery/computer/piratepad_control/civilian(drop_location()) - qdel(src) - uses-- diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm deleted file mode 100644 index dd18384c9dce..000000000000 --- a/code/game/machinery/computer/Operating.dm +++ /dev/null @@ -1,122 +0,0 @@ -#define MENU_OPERATION 1 -#define MENU_SURGERIES 2 - -/obj/machinery/computer/operating - name = "operating computer" - desc = "Monitors patient vitals and displays surgery steps. Provides doctors with advanced surgeries." - icon_screen = "crew" - icon_keyboard = "med_key" - circuit = /obj/item/circuitboard/computer/operating - - var/obj/structure/table/optable/table - var/list/advanced_surgeries = list() - light_color = LIGHT_COLOR_BLUE - -/obj/machinery/computer/operating/Initialize(mapload) - . = ..() - find_table() - for(var/datum/design/surgery/D as anything in subtypesof(/datum/design/surgery)) - advanced_surgeries += initial(D.surgery) - -/obj/machinery/computer/operating/Destroy() - for(var/direction in GLOB.alldirs) - table = locate(/obj/structure/table/optable) in get_step(src, direction) - if(table && table.computer == src) - table.computer = null - . = ..() - -/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/disk/surgery)) - user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."), \ - span_notice("You begin to load a surgery protocol from \the [O]..."), \ - span_hear("You hear the chatter of a floppy drive.")) - var/obj/item/disk/surgery/D = O - if(do_after(user, src, 1 SECONDS, DO_PUBLIC, display = O)) - advanced_surgeries |= D.surgeries - return TRUE - return ..() - -/obj/machinery/computer/operating/proc/find_table() - for(var/direction in GLOB.alldirs) - table = locate(/obj/structure/table/optable) in get_step(src, direction) - if(table) - table.computer = src - break - -/obj/machinery/computer/operating/ui_state(mob/user) - return GLOB.not_incapacitated_state - -/obj/machinery/computer/operating/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "OperatingComputer", name) - ui.open() - -/obj/machinery/computer/operating/ui_data(mob/user) - var/list/data = list() - var/list/surgeries = list() - for(var/datum/surgery/S as anything in advanced_surgeries) - var/list/surgery = list() - surgery["name"] = initial(S.name) - surgery["desc"] = initial(S.desc) - surgeries += list(surgery) - data["surgeries"] = surgeries - - //If there's no patient just hop to it yeah? - if(!table) - data["patient"] = null - return data - - data["table"] = table - if(!table.check_eligible_patient()) - return data - data["patient"] = list() - var/mob/living/carbon/human/patient = table.patient - - switch(patient.stat) - if(CONSCIOUS) - data["patient"]["stat"] = "Conscious" - data["patient"]["statstate"] = "good" - if(SOFT_CRIT) - data["patient"]["stat"] = "Conscious" - data["patient"]["statstate"] = "average" - if(UNCONSCIOUS, HARD_CRIT) - data["patient"]["stat"] = "Unconscious" - data["patient"]["statstate"] = "average" - if(DEAD) - data["patient"]["stat"] = "Dead" - data["patient"]["statstate"] = "bad" - data["patient"]["health"] = patient.health - data["patient"]["blood_type"] = patient.dna.blood_type - data["patient"]["maxHealth"] = patient.maxHealth - data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD - data["patient"]["bruteLoss"] = patient.getBruteLoss() - data["patient"]["fireLoss"] = patient.getFireLoss() - data["patient"]["toxLoss"] = patient.getToxLoss() - data["patient"]["oxyLoss"] = patient.getOxyLoss() - data["procedures"] = list() - if(patient.surgeries.len) - for(var/datum/surgery/procedure in patient.surgeries) - var/datum/surgery_step/surgery_step = procedure.get_surgery_step() - var/chems_needed = surgery_step.get_chem_list() - var/alternative_step - var/alt_chems_needed = "" - if(surgery_step.repeatable) - var/datum/surgery_step/next_step = procedure.get_surgery_next_step() - if(next_step) - alternative_step = capitalize(next_step.name) - alt_chems_needed = next_step.get_chem_list() - else - alternative_step = "Finish operation" - data["procedures"] += list(list( - "name" = capitalize("[parse_zone(procedure.location)] [procedure.name]"), - "next_step" = capitalize(surgery_step.name), - "chems_needed" = chems_needed, - "alternative_step" = alternative_step, - "alt_chems_needed" = alt_chems_needed - )) - return data - -#undef MENU_OPERATION -#undef MENU_SURGERIES diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index def7f3f207bd..f99808837100 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -1,3 +1,4 @@ +DEFINE_INTERACTABLE(/obj/machinery/computer) /obj/machinery/computer name = "computer" icon = 'icons/obj/computer.dmi' @@ -5,7 +6,7 @@ density = TRUE max_integrity = 200 integrity_failure = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 20) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 20) zmm_flags = ZMM_MANGLE_PLANES light_inner_range = 0.1 @@ -126,7 +127,7 @@ . = ..() if(!can_interact(user)) return - if(!user.canUseTopic(src, !issilicon(user)) || !is_operational) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH) || !is_operational) return /obj/machinery/computer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/machinery/computer/accounting.dm b/code/game/machinery/computer/accounting.dm index 64a26655540a..7351b49f6b68 100644 --- a/code/game/machinery/computer/accounting.dm +++ b/code/game/machinery/computer/accounting.dm @@ -27,6 +27,7 @@ "balance" = current_bank_account.account_balance, "modifier" = current_bank_account.payday_modifier, )) + data["PlayerAccounts"] = player_accounts data["AuditLog"] = audit_list data["Crashing"] = HAS_TRAIT(SSeconomy, TRAIT_MARKET_CRASHING) diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 8d921487dcc0..a8c9e5bed817 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -1,7 +1,7 @@ /obj/machinery/computer/aifixer name = "\improper AI system integrity restorer" desc = "Used with intelliCards containing nonfunctional AIs to restore them to working order." - req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS) + req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_MANAGEMENT) circuit = /obj/item/circuitboard/computer/aifixer icon_keyboard = "tech_key" icon_screen = "ai-fixer" @@ -60,7 +60,7 @@ to_chat(usr, span_notice("Reconstruction in progress. This will take several minutes.")) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 25, FALSE) restoring = TRUE - occupier.notify_ghost_cloning("Your core files are being restored!", source = src) + occupier.notify_ghost_revival("Your core files are being restored!", source = src) . = TRUE /obj/machinery/computer/aifixer/proc/Fix() @@ -98,7 +98,7 @@ switch(occupier.stat) if(CONSCIOUS) . += "ai-fixer-full" - if(UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) . += "ai-fixer-404" /obj/machinery/computer/aifixer/transfer_ai(interaction, mob/user, mob/living/silicon/ai/AI, obj/item/aicard/card) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index eeb1159ce96e..fac3eccbc900 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -60,7 +60,7 @@ for(var/entry in logs) data["logs"] += list(list("entry" = entry)) - for(var/apc in GLOB.apcs_list) + for(var/apc in INSTANCES_OF(/obj/machinery/power/apc)) if(check_apc(apc)) var/obj/machinery/power/apc/A = apc var/has_cell = (A.cell) ? TRUE : FALSE @@ -121,7 +121,7 @@ if("access-apc") var/ref = params["ref"] playsound(src, SFX_TERMINAL_TYPE, 50, FALSE) - var/obj/machinery/power/apc/APC = locate(ref) in GLOB.apcs_list + var/obj/machinery/power/apc/APC = locate(ref) in INSTANCES_OF(/obj/machinery/power/apc) if(!APC) return if(active_apc) @@ -153,7 +153,7 @@ var/ref = params["ref"] var/type = params["type"] var/value = params["value"] - var/obj/machinery/power/apc/target = locate(ref) in GLOB.apcs_list + var/obj/machinery/power/apc/target = locate(ref) in INSTANCES_OF(/obj/machinery/power/apc) if(!target) return @@ -182,7 +182,7 @@ log_game("[key_name(operator)] Set APC [target.area.name] [type] to [setTo]]") if("breaker") var/ref = params["ref"] - var/obj/machinery/power/apc/target = locate(ref) in GLOB.apcs_list + var/obj/machinery/power/apc/target = locate(ref) in INSTANCES_OF(/obj/machinery/power/apc) target.toggle_breaker() var/setTo = target.operating ? "On" : "Off" log_activity("Turned APC [target.area.name]'s breaker [setTo]") diff --git a/code/game/machinery/computer/arcade/arcade.dm b/code/game/machinery/computer/arcade/arcade.dm index e02048d5ef74..f736df0dff23 100644 --- a/code/game/machinery/computer/arcade/arcade.dm +++ b/code/game/machinery/computer/arcade/arcade.dm @@ -91,12 +91,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( say("CODE ACTIVATED: EXTRA PRIZES.") prizes *= 2 for(var/i in 1 to prizes) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "arcade", /datum/mood_event/arcade) - if(prob(0.0001)) //1 in a million - new /obj/item/gun/energy/pulse/prize(src) - visible_message(span_notice("[src] dispenses.. woah, a gun! Way past cool."), span_notice("You hear a chime and a shot.")) - user.client.give_award(/datum/award/achievement/misc/pulse, user) - return var/prizeselect if(prize_override) diff --git a/code/game/machinery/computer/arcade/orion.dm b/code/game/machinery/computer/arcade/orion.dm index 133dcb97f876..8d738c8a9691 100644 --- a/code/game/machinery/computer/arcade/orion.dm +++ b/code/game/machinery/computer/arcade/orion.dm @@ -136,14 +136,8 @@ GLOBAL_LIST_INIT(orion_events, generate_orion_events()) gamers[gamer] = ORION_GAMER_PAMPHLET //next report send a pamph - gamer.client.give_award(/datum/award/achievement/misc/gamer, gamer) // PSYCH REPORT NOTE: patient kept rambling about how they did it for an "achievement", recommend continued holding for observation - gamer.mind?.adjust_experience(/datum/skill/gaming, 50) // cheevos make u better - - if(!isnull(GLOB.data_core.general)) - for(var/datum/data/record/insanity_records in GLOB.data_core.general) - if(insanity_records.fields["name"] == gamer.name) - insanity_records.fields["m_stat"] = "*Unstable*" - return + var/datum/data/record/R = SSdatacore.get_record_by_name(gamer.name, DATACORE_RECORDS_STATION) + R?.fields[DATACORE_MENTAL_HEALTH] = "*Unstable*" /obj/machinery/computer/arcade/orion_trail/ui_interact(mob/user, datum/tgui/ui) . = ..() diff --git a/code/game/machinery/computer/arena.dm b/code/game/machinery/computer/arena.dm index 828c337cb64e..223fcd3d4c8c 100644 --- a/code/game/machinery/computer/arena.dm +++ b/code/game/machinery/computer/arena.dm @@ -65,6 +65,11 @@ /obj/machinery/computer/arena/Initialize(mapload, obj/item/circuitboard/C) . = ..() LoadDefaultArenas() + SET_TRACKING(__TYPE__) + +/obj/machinery/computer/arena/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() /** * Loads the arenas from config directory. @@ -210,7 +215,7 @@ set_doors(closed = TRUE) /obj/machinery/computer/arena/proc/get_spawn(team) - for(var/obj/machinery/arena_spawn/A in GLOB.machines) + for(var/obj/machinery/arena_spawn/A as anything in INSTANCES_OF(/obj/machinery/arena_spawn)) if(A.arena_id == arena_id && A.team == team) return A @@ -244,7 +249,7 @@ /obj/machinery/computer/arena/proc/set_doors(closed = FALSE) - for(var/obj/machinery/door/poddoor/D in GLOB.machines) //I really dislike pathing of these + for(var/obj/machinery/door/poddoor/D in INSTANCES_OF(/obj/machinery/door)) //I really dislike pathing of these if(D.id != arena_id) continue if(closed) @@ -372,6 +377,14 @@ /// only exist to cut down on glob.machines lookups, do not modify var/obj/machinery/computer/arena/_controller +/obj/machinery/arena_spawn/Initialize(mapload) + . = ..() + SET_TRACKING(__TYPE__) + +/obj/machinery/arena_spawn/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/arena_spawn/red name = "Red Team Spawnpoint" color = "red" @@ -385,7 +398,7 @@ /obj/machinery/arena_spawn/proc/get_controller() if(_controller && !QDELETED(_controller) && _controller.arena_id == arena_id) return _controller - for(var/obj/machinery/computer/arena/A in GLOB.machines) + for(var/obj/machinery/computer/arena/A in INSTANCES_OF(/obj/machinery/computer/arena)) if(A.arena_id == arena_id) _controller = A return _controller diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index f121902d50c7..04452252ebb6 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -238,7 +238,7 @@ circuit = /obj/item/circuitboard/computer/research /obj/machinery/computer/security/hos - name = "\improper Head of Security's camera console" + name = "\improper Security Marshal's camera console" desc = "A custom security console with added access to the labor camp network." network = list("ss13", "labor") circuit = null @@ -291,8 +291,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/security/telescreen/entertai /obj/machinery/computer/security/telescreen/entertainment/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) RegisterSignal(src, COMSIG_CLICK, PROC_REF(BigClick)) +/obj/machinery/computer/security/telescreen/entertainment/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + // Bypass clickchain to allow humans to use the telescreen from a distance /obj/machinery/computer/security/telescreen/entertainment/proc/BigClick() SIGNAL_HANDLER diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index b8b93da05fa7..052c146469d5 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -310,7 +310,7 @@ if(!owner || !isliving(owner)) return var/mob/camera/ai_eye/remote/remote_eye = owner.remote_control - if(remote_eye.zMove(UP)) + if(step(remote_eye, UP)) to_chat(owner, span_notice("You move upwards.")) else to_chat(owner, span_notice("You couldn't move upwards!")) @@ -324,7 +324,7 @@ if(!owner || !isliving(owner)) return var/mob/camera/ai_eye/remote/remote_eye = owner.remote_control - if(remote_eye.zMove(DOWN)) + if(step(remote_eye, DOWN)) to_chat(owner, span_notice("You move downwards.")) else to_chat(owner, span_notice("You couldn't move downwards!")) diff --git a/code/game/machinery/computer/chef_orders/chef_order.dm b/code/game/machinery/computer/chef_orders/chef_order.dm index 9b1fec4fcabe..09c0e062f29e 100644 --- a/code/game/machinery/computer/chef_orders/chef_order.dm +++ b/code/game/machinery/computer/chef_orders/chef_order.dm @@ -114,7 +114,7 @@ var/list/ordered_paths = list() for(var/datum/orderable_item/item as anything in grocery_list)//every order for(var/amt in 1 to grocery_list[item])//every order amount - ordered_paths += item.item_instance.type + ordered_paths += item.item_path podspawn(list( "target" = get_turf(chef), "style" = STYLE_BLUESPACE, diff --git a/code/game/machinery/computer/chef_orders/order_datum.dm b/code/game/machinery/computer/chef_orders/order_datum.dm index c0743f08074a..32f097340aaa 100644 --- a/code/game/machinery/computer/chef_orders/order_datum.dm +++ b/code/game/machinery/computer/chef_orders/order_datum.dm @@ -9,212 +9,207 @@ //description set automatically unless it's hard set by the subtype var/desc var/category_index = CATEGORY_FRUITS_VEGGIES - var/obj/item/item_instance + var/obj/item/item_path var/cost_per_order = 10 /datum/orderable_item/New() . = ..() if(type == /datum/orderable_item) return - if(!item_instance) + if(!item_path) CRASH("[type] orderable item datum has NO ITEM PATH!") - item_instance = new item_instance if(!desc) - desc = item_instance.desc - -/datum/orderable_item/Destroy(force, ...) - . = ..() - qdel(item_instance) + desc = initial(item_path.desc) //Fruits and Veggies /datum/orderable_item/potato name = "Potato" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/potato + item_path = /obj/item/food/grown/potato /datum/orderable_item/tomato name = "Tomato" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/tomato + item_path = /obj/item/food/grown/tomato /datum/orderable_item/carrot name = "Carrot" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/carrot + item_path = /obj/item/food/grown/carrot /datum/orderable_item/eggplant name = "Eggplant" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/eggplant + item_path = /obj/item/food/grown/eggplant /datum/orderable_item/mushroom name = "Plump Helmet" desc = "Plumus Hellmus: Plump, soft and s-so inviting~" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/mushroom/plumphelmet + item_path = /obj/item/food/grown/mushroom/plumphelmet /datum/orderable_item/cabbage name = "Cabbage" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/cabbage + item_path = /obj/item/food/grown/cabbage /datum/orderable_item/beets name = "Onion" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/onion + item_path = /obj/item/food/grown/onion /datum/orderable_item/apple name = "Apple" category_index = CATEGORY_FRUITS_VEGGIES - item_instance =/obj/item/food/grown/apple + item_path =/obj/item/food/grown/apple /datum/orderable_item/pumpkin name = "Pumpkin" category_index = CATEGORY_FRUITS_VEGGIES - item_instance =/obj/item/food/grown/pumpkin + item_path =/obj/item/food/grown/pumpkin /datum/orderable_item/watermelon name = "Watermelon" category_index = CATEGORY_FRUITS_VEGGIES - item_instance =/obj/item/food/grown/watermelon + item_path =/obj/item/food/grown/watermelon /datum/orderable_item/corn name = "Corn" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/corn + item_path = /obj/item/food/grown/corn /datum/orderable_item/soybean name = "Soybeans" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/soybeans + item_path = /obj/item/food/grown/soybeans /datum/orderable_item/garlic name = "Garlic" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/garlic + item_path = /obj/item/food/grown/garlic /datum/orderable_item/cherries name = "Cherries" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/cherries + item_path = /obj/item/food/grown/cherries /datum/orderable_item/chanterelle name = "Chanterelle" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/mushroom/chanterelle + item_path = /obj/item/food/grown/mushroom/chanterelle /datum/orderable_item/cocoa name = "Cocoa" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/cocoapod + item_path = /obj/item/food/grown/cocoapod /datum/orderable_item/herbs name = "Bundle of Herbs" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/herbs + item_path = /obj/item/food/grown/herbs cost_per_order = 5 /datum/orderable_item/bell_pepper name = "Bell Pepper" category_index = CATEGORY_FRUITS_VEGGIES - item_instance = /obj/item/food/grown/bell_pepper + item_path = /obj/item/food/grown/bell_pepper //Milk and Eggs /datum/orderable_item/milk name = "Milk" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/reagent_containers/food/condiment/milk + item_path = /obj/item/reagent_containers/food/condiment/milk cost_per_order = 30 /datum/orderable_item/soymilk name = "Soy Milk" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/reagent_containers/food/condiment/soymilk + item_path = /obj/item/reagent_containers/food/condiment/soymilk cost_per_order = 30 /datum/orderable_item/cream name = "Cream" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/reagent_containers/food/drinks/bottle/cream + item_path = /obj/item/reagent_containers/food/drinks/bottle/cream cost_per_order = 40 /datum/orderable_item/yoghurt name = "Yoghurt" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/reagent_containers/food/condiment/yoghurt + item_path = /obj/item/reagent_containers/food/condiment/yoghurt cost_per_order = 40 /datum/orderable_item/eggs name = "Egg Carton" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/storage/fancy/egg_box + item_path = /obj/item/storage/fancy/egg_box cost_per_order = 40 /datum/orderable_item/fillet name = "Fish Fillet" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/fishmeat + item_path = /obj/item/food/fishmeat cost_per_order = 12 /datum/orderable_item/spider_eggs name = "Spider Eggs" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/spidereggs + item_path = /obj/item/food/spidereggs /datum/orderable_item/moonfish_eggs name = "Moonfish Eggs" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/moonfish_eggs + item_path = /obj/item/food/moonfish_eggs cost_per_order = 30 /datum/orderable_item/desert_snails name = "Canned Desert Snails" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/desert_snails + item_path = /obj/item/food/desert_snails cost_per_order = 20 /datum/orderable_item/canned_jellyfish name = "Canned Gunner Jellyfish" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/canned_jellyfish + item_path = /obj/item/food/canned_jellyfish cost_per_order = 20 /datum/orderable_item/canned_larvae name = "Canned Larvae" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/larvae + item_path = /obj/item/food/larvae cost_per_order = 20 /datum/orderable_item/canned_tomatoes name = "Canned San Marzano Tomatoes" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/canned/tomatoes + item_path = /obj/item/food/canned/tomatoes cost_per_order = 30 /datum/orderable_item/canned_pine_nuts name = "Canned Pine Nuts" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/canned/pine_nuts + item_path = /obj/item/food/canned/pine_nuts cost_per_order = 20 /datum/orderable_item/ready_donk name = "Ready-Donk Meal: Bachelor Chow" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/ready_donk + item_path = /obj/item/food/ready_donk cost_per_order = 40 /datum/orderable_item/ready_donk_mac name = "Ready-Donk Meal: Donk-a-Roni" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/ready_donk/mac_n_cheese + item_path = /obj/item/food/ready_donk/mac_n_cheese cost_per_order = 40 /datum/orderable_item/ready_donk_mex name = "Ready-Donk Meal: Donkhiladas" category_index = CATEGORY_MILK_EGGS - item_instance = /obj/item/food/ready_donk/donkhiladas + item_path = /obj/item/food/ready_donk/donkhiladas cost_per_order = 40 //Reagents @@ -222,65 +217,65 @@ /datum/orderable_item/flour name = "Flour Sack" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/flour + item_path = /obj/item/reagent_containers/food/condiment/flour cost_per_order = 30 /datum/orderable_item/sugar name = "Sugar Sack" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/sugar + item_path = /obj/item/reagent_containers/food/condiment/sugar cost_per_order = 30 /datum/orderable_item/rice name = "Rice Sack" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/rice + item_path = /obj/item/reagent_containers/food/condiment/rice cost_per_order = 30 /datum/orderable_item/cornmeal name = "Cornmeal Box" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/cornmeal + item_path = /obj/item/reagent_containers/food/condiment/cornmeal cost_per_order = 30 /datum/orderable_item/enzyme name = "Universal Enzyme" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/enzyme + item_path = /obj/item/reagent_containers/food/condiment/enzyme cost_per_order = 40 /datum/orderable_item/salt name = "Salt Shaker" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/saltshaker + item_path = /obj/item/reagent_containers/food/condiment/saltshaker cost_per_order = 15 /datum/orderable_item/pepper name = "Pepper Mill" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/peppermill + item_path = /obj/item/reagent_containers/food/condiment/peppermill cost_per_order = 15 /datum/orderable_item/soysauce name = "Soy Sauce" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/soysauce + item_path = /obj/item/reagent_containers/food/condiment/soysauce cost_per_order = 15 /datum/orderable_item/bbqsauce name = "BBQ Sauce" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/bbqsauce + item_path = /obj/item/reagent_containers/food/condiment/bbqsauce cost_per_order = 60 /datum/orderable_item/vinegar name = "Vinegar" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/vinegar + item_path = /obj/item/reagent_containers/food/condiment/vinegar cost_per_order = 30 /datum/orderable_item/quality_oil name = "Quality Oil" category_index = CATEGORY_SAUCES_REAGENTS - item_instance = /obj/item/reagent_containers/food/condiment/quality_oil + item_path = /obj/item/reagent_containers/food/condiment/quality_oil cost_per_order = 120 //Extra Virgin, just like you, the reader diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index cabb5203d383..680428091c41 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -13,7 +13,7 @@ desc = "A console used for high-priority announcements and emergencies." icon_screen = "comm" icon_keyboard = "tech_key" - req_access = list(ACCESS_HEADS) + req_access = list(ACCESS_MANAGEMENT) circuit = /obj/item/circuitboard/computer/communications light_color = LIGHT_COLOR_BLUE @@ -35,7 +35,8 @@ /// The name of the user who logged in var/authorize_name - + /// The name of the job of the user who logged in + var/authorize_job /// The access that the card had on login var/list/authorize_access @@ -82,13 +83,14 @@ /obj/machinery/computer/communications/syndicate/get_communication_players() var/list/targets = list() for(var/mob/target in GLOB.player_list) - if(target.stat == DEAD || target.z == z || target.mind?.has_antag_datum(/datum/antagonist/battlecruiser)) + if(target.stat == DEAD || target.z == z) targets += target return targets /obj/machinery/computer/communications/Initialize(mapload) . = ..() - GLOB.shuttle_caller_list += src + SET_TRACKING(__TYPE__) + SET_TRACKING(TRACKING_KEY_SHUTTLE_CALLER) AddComponent(/datum/component/gps, "Secured Communications Signal") /// Are we NOT a silicon, AND we're logged in as the captain? @@ -116,25 +118,14 @@ return ..() /obj/machinery/computer/communications/emag_act(mob/user, obj/item/card/emag/emag_card) - if(istype(emag_card, /obj/item/card/emag/battlecruiser)) - if(!user.mind?.has_antag_datum(/datum/antagonist/traitor)) - to_chat(user, span_danger("You get the feeling this is a bad idea.")) - return - var/obj/item/card/emag/battlecruiser/caller_card = emag_card - if(battlecruiser_called) - to_chat(user, span_danger("The card reports a long-range message already sent to the Syndicate fleet...?")) - return - battlecruiser_called = TRUE - caller_card.use_charge(user) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(summon_battlecruiser), caller_card.team), rand(20 SECONDS, 1 MINUTES)) - playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) - return - if(obj_flags & EMAGGED) return + obj_flags |= EMAGGED + if (authenticated) authorize_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) + to_chat(user, span_danger("You scramble the communication routing circuits!")) playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE) @@ -230,7 +221,9 @@ if ("makePriorityAnnouncement") if (!authenticated_as_silicon_or_captain(usr) && !syndicate) return + make_announcement(usr) + if ("messageAssociates") if (!authenticated_as_non_silicon_captain(usr)) return @@ -378,6 +371,7 @@ authenticated = FALSE authorize_access = null authorize_name = null + authorize_job = null playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) return @@ -385,6 +379,7 @@ authenticated = TRUE authorize_access = SSid_access.get_region_access_list(list(REGION_ALL_STATION)) authorize_name = "Unknown" + authorize_job = null to_chat(usr, span_warning("[src] lets out a quiet alarm as its login is overridden.")) playsound(src, 'sound/machines/terminal_alert.ogg', 25, FALSE) else if(isliving(usr)) @@ -393,7 +388,8 @@ if (check_access(id_card)) authenticated = TRUE authorize_access = id_card.access.Copy() - authorize_name = "[id_card.registered_name] - [id_card.assignment]" + authorize_name = id_card.registered_name + authorize_job = id_card.assignment state = STATE_MAIN playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) @@ -719,16 +715,27 @@ if(!SScommunications.can_announce(user, is_ai)) to_chat(user, span_alert("Intercomms recharging. Please stand by.")) return + var/input = tgui_input_text(user, "Message to announce to the station crew", "Announcement") - if(!input || !user.canUseTopic(src, !issilicon(usr))) + if(!input || !user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return - if(!(user.can_speak())) //No more cheating, mime/random mute guy! - input = "..." + + var/can_speak = user.can_speak() + if(isliving(user) && can_speak) + can_speak = !istype(user.get_selected_language(), /datum/language/visual) + + if(!user.can_speak()) //No more cheating, mime/random mute guy! to_chat(user, span_warning("You find yourself unable to speak.")) - else - input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too. + return + + input = user.treat_message(input) //Adds slurs and so on. Someone should make this use languages too. + + var/sender = authorize_name + if(authorize_job) + sender = "[sender] ([authorize_job])" + var/list/players = get_communication_players() - SScommunications.make_announcement(user, is_ai, input, syndicate || (obj_flags & EMAGGED), players) + SScommunications.make_announcement(user, is_ai, input, syndicate || (obj_flags & EMAGGED), players, sender) deadchat_broadcast(" made a priority announcement from [span_name("[get_area_name(usr, TRUE)]")].", span_name("[user.real_name]"), user, message_type=DEADCHAT_ANNOUNCEMENT) /obj/machinery/computer/communications/proc/get_communication_players() @@ -752,7 +759,8 @@ frequency.post_signal(status_signal) /obj/machinery/computer/communications/Destroy() - GLOB.shuttle_caller_list -= src + UNSET_TRACKING(__TYPE__) + UNSET_TRACKING(TRACKING_KEY_SHUTTLE_CALLER) SSshuttle.autoEvac() return ..() @@ -765,13 +773,9 @@ LAZYADD(messages, new_message) /// Defines for the various hack results. -#define HACK_PIRATE "Pirates" -#define HACK_FUGITIVES "Fugitives" #define HACK_SLEEPER "Sleeper Agents" #define HACK_THREAT "Threat Boost" -/// The minimum number of ghosts / observers to have the chance of spawning pirates. -#define MIN_GHOSTS_FOR_PIRATES 4 /// The minimum number of ghosts / observers to have the chance of spawning fugitives. #define MIN_GHOSTS_FOR_FUGITIVES 6 /// The maximum percentage of the population to be ghosts before we no longer have the chance of spawning Sleeper Agents. @@ -794,12 +798,6 @@ // If we have a certain amount of ghosts, we'll add some more !!fun!! options to the list var/num_ghosts = length(GLOB.current_observers_list) + length(GLOB.dead_player_list) - // Pirates require empty space for the ship, and ghosts for the pirates obviously - if(SSmapping.empty_space && (num_ghosts >= MIN_GHOSTS_FOR_PIRATES)) - hack_options += HACK_PIRATE - // Fugitives require empty space for the hunter's ship, and ghosts for both fugitives and hunters (Please no waldo) - if(SSmapping.empty_space && (num_ghosts >= MIN_GHOSTS_FOR_FUGITIVES)) - hack_options += HACK_FUGITIVES // If less than a certain percent of the population is ghosts, consider sleeper agents if(num_ghosts < (length(GLOB.clients) * MAX_PERCENT_GHOSTS_FOR_SLEEPER)) hack_options += HACK_SLEEPER @@ -808,30 +806,6 @@ message_admins("[ADMIN_LOOKUPFLW(hacker)] hacked a [name] located at [ADMIN_VERBOSEJMP(src)], resulting in: [picked_option]!") hacker.log_message("hacked a communications console, resulting in: [picked_option].", LOG_GAME, log_globally = TRUE) switch(picked_option) - if(HACK_PIRATE) // Triggers pirates, which the crew may be able to pay off to prevent - priority_announce( - "Attention crew, it appears that someone on your station has made unexpected communication with a Syndicate ship in nearby space.", - "[command_name()] High-Priority Update", - sound_type = ANNOUNCER_CENTCOM - ) - - var/datum/round_event_control/pirates/pirate_event = locate() in SSevents.control - if(!pirate_event) - CRASH("hack_console() attempted to run pirates, but could not find an event controller!") - addtimer(CALLBACK(pirate_event, TYPE_PROC_REF(/datum/round_event_control, runEvent)), rand(20 SECONDS, 1 MINUTES)) - - if(HACK_FUGITIVES) // Triggers fugitives, which can cause confusion / chaos as the crew decides which side help - priority_announce( - "Attention crew, it appears that someone on your station has established an unexpected orbit with an unmarked ship in nearby space.", - "[command_name()] High-Priority Update", - sound_type = ANNOUNCER_CENTCOM - ) - - var/datum/round_event_control/fugitives/fugitive_event = locate() in SSevents.control - if(!fugitive_event) - CRASH("hack_console() attempted to run fugitives, but could not find an event controller!") - addtimer(CALLBACK(fugitive_event, TYPE_PROC_REF(/datum/round_event_control, runEvent)), rand(20 SECONDS, 1 MINUTES)) - if(HACK_THREAT) // Adds a flat amount of threat to buy a (probably) more dangerous antag later priority_announce( "Attention crew, it appears that someone on your station has shifted your orbit into more dangerous territory.", @@ -844,12 +818,12 @@ continue shake_camera(crew_member, 15, 1) - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/dynamic = SSticker.mode dynamic.create_threat(HACK_THREAT_INJECTION_AMOUNT, list(dynamic.threat_log, dynamic.roundend_threat_log), "[worldtime2text()]: Communications console hacked by [hacker]") if(HACK_SLEEPER) // Trigger one or multiple sleeper agents with the crew (or for latejoining crew) - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/dynamic = SSticker.mode var/datum/dynamic_ruleset/midround/sleeper_agent_type = /datum/dynamic_ruleset/midround/autotraitor var/max_number_of_sleepers = clamp(round(length(GLOB.alive_player_list) / 20), 1, 3) @@ -874,12 +848,9 @@ sound_type = ANNOUNCER_CENTCOM ) -#undef HACK_PIRATE -#undef HACK_FUGITIVES #undef HACK_SLEEPER #undef HACK_THREAT -#undef MIN_GHOSTS_FOR_PIRATES #undef MIN_GHOSTS_FOR_FUGITIVES #undef MAX_PERCENT_GHOSTS_FOR_SLEEPER #undef HACK_THREAT_INJECTION_AMOUNT diff --git a/code/game/machinery/computer/crew.dm b/code/game/machinery/computer/crew.dm index 6f6f9995c117..776a759529bc 100644 --- a/code/game/machinery/computer/crew.dm +++ b/code/game/machinery/computer/crew.dm @@ -97,7 +97,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) // 00: Captain JOB_CAPTAIN = 00, // 10-19: Security - JOB_HEAD_OF_SECURITY = 10, + JOB_SECURITY_MARSHAL = 10, JOB_WARDEN = 11, JOB_SECURITY_OFFICER = 12, JOB_SECURITY_OFFICER_MEDICAL = 13, @@ -106,33 +106,27 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) JOB_SECURITY_OFFICER_SUPPLY = 16, JOB_DETECTIVE = 17, // 20-29: Medbay - JOB_CHIEF_MEDICAL_OFFICER = 20, + JOB_MEDICAL_DIRECTOR = 20, JOB_CHEMIST = 21, JOB_VIROLOGIST = 22, JOB_MEDICAL_DOCTOR = 23, JOB_PARAMEDIC = 24, - // 30-39: Science - JOB_RESEARCH_DIRECTOR = 30, - JOB_SCIENTIST = 31, - JOB_ROBOTICIST = 32, - JOB_GENETICIST = 33, // 40-49: Engineering JOB_CHIEF_ENGINEER = 40, JOB_STATION_ENGINEER = 41, JOB_ATMOSPHERIC_TECHNICIAN = 42, // 50-59: Cargo - JOB_QUARTERMASTER = 51, - JOB_SHAFT_MINER = 52, - JOB_CARGO_TECHNICIAN = 53, + JOB_QUARTERMASTER = 50, + JOB_PROSPECTOR = 51, + JOB_DECKHAND = 52, // 60+: Civilian/other JOB_HEAD_OF_PERSONNEL = 60, JOB_BARTENDER = 61, JOB_COOK = 62, JOB_BOTANIST = 63, - JOB_CURATOR = 64, + JOB_ARCHIVIST = 64, JOB_CHAPLAIN = 65, JOB_CLOWN = 66, - JOB_MIME = 67, JOB_JANITOR = 68, JOB_LAWYER = 69, JOB_PSYCHOLOGIST = 71, @@ -244,17 +238,7 @@ GLOBAL_DATUM_INIT(crewmonitor, /datum/crewmonitor, new) // Binary living/dead status if (sensor_mode >= SENSOR_LIVING) - entry["life_status"] = (tracked_living_mob.stat != DEAD) - - // Damage - if (sensor_mode >= SENSOR_VITALS) - entry += list( - "oxydam" = round(tracked_living_mob.getOxyLoss(), 1), - "toxdam" = round(tracked_living_mob.getToxLoss(), 1), - "burndam" = round(tracked_living_mob.getFireLoss(), 1), - "brutedam" = round(tracked_living_mob.getBruteLoss(), 1), - "health" = round(tracked_living_mob.health, 1), - ) + entry["life_status"] = (tracked_living_mob.stat) // Location if (sensor_mode >= SENSOR_COORDS) diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm index b28858a34391..28f5135eca38 100644 --- a/code/game/machinery/computer/dna_console.dm +++ b/code/game/machinery/computer/dna_console.dm @@ -189,7 +189,7 @@ . = ..() if(!can_interact(user)) return - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return eject_disk(user) @@ -333,7 +333,7 @@ //data["diskMutations"] = tgui_inserted_disk_mutations data["storage"]["disk"] = tgui_inserted_disk_mutations data["diskHasMakeup"] = (LAZYLEN(inserted_disk.read(DATA_IDX_GENE_BUFFER)) > 0) - data["diskMakeupBuffer"] = inserted_disk.read(DATA_IDX_GENE_BUFFER).Copy() + data["diskMakeupBuffer"] = inserted_disk.read(DATA_IDX_GENE_BUFFER)?.Copy() || list() else data["hasDisk"] = FALSE data["diskCapacity"] = 0 diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index f6703f86b5fe..d3d434a18320 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -26,7 +26,7 @@ id ="handmade" /obj/machinery/computer/mechpad/LateInitialize() - for(var/obj/machinery/mechpad/pad in GLOB.mechpad_list) + for(var/obj/machinery/mechpad/pad as anything in INSTANCES_OF(/obj/machinery/mechpad)) if(pad == connected_mechpad) continue if(pad.id != id) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 33f415d5c7a0..53091d5f525a 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -29,7 +29,7 @@ playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) var/dat if(temp) - dat = text("[temp]

Clear Screen") + dat ="[temp]

Clear Screen" else if(authenticated) switch(screen) @@ -63,31 +63,32 @@ "} - if(!isnull(GLOB.data_core.general)) - for(var/datum/data/record/R in sort_record(GLOB.data_core.general, sortBy, order)) + if(!isnull(SSdatacore.get_records(DATACORE_RECORDS_STATION))) + for(var/datum/data/record/R in sort_record(SSdatacore.get_records(DATACORE_RECORDS_STATION), sortBy, order)) var/blood_type = "" var/b_dna = "" - for(var/datum/data/record/E in GLOB.data_core.medical) - if((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) - blood_type = E.fields["blood_type"] - b_dna = E.fields["b_dna"] + for(var/datum/data/record/E in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) + if((E.fields[DATACORE_NAME] == R.fields[DATACORE_NAME] && E.fields[DATACORE_ID] == R.fields[DATACORE_ID])) + blood_type = E.fields[DATACORE_BLOOD_TYPE] + b_dna = E.fields[DATACORE_BLOOD_DNA] var/background - if(R.fields["m_stat"] == "*Insane*" || R.fields["p_stat"] == "*Deceased*") + if(R.fields[DATACORE_MENTAL_HEALTH] == "*Insane*" || R.fields[DATACORE_PHYSICAL_HEALTH] == "*Deceased*") background = "'background-color:#990000;'" - else if(R.fields["p_stat"] == "*Unconscious*" || R.fields["m_stat"] == "*Unstable*") + else if(R.fields[DATACORE_PHYSICAL_HEALTH] == "*Unconscious*" || R.fields[DATACORE_MENTAL_HEALTH] == "*Unstable*") background = "'background-color:#CD6500;'" - else if(R.fields["p_stat"] == "Physically Unfit" || R.fields["m_stat"] == "*Watch*") + else if(R.fields[DATACORE_PHYSICAL_HEALTH] == "Physically Unfit" || R.fields[DATACORE_MENTAL_HEALTH] == "*Watch*") background = "'background-color:#3BB9FF;'" else background = "'background-color:#4F7529;'" - dat += text("[]", background, R.fields["id"], R.fields["name"]) - dat += text("[]", R.fields["id"]) - dat += text("F: []
D: []", R.fields["fingerprint"], b_dna) - dat += text("[]", blood_type) - dat += text("[]", R.fields["p_stat"]) - dat += text("[]", R.fields["m_stat"]) + dat += "[R.fields[DATACORE_NAME]]" + dat += "[R.fields[DATACORE_ID]]" + dat += "F: [R.fields[DATACORE_FINGERPRINT]]
D: [b_dna]" + dat += "[blood_type]" + dat += "[R.fields[DATACORE_PHYSICAL_HEALTH]]" + dat += "[R.fields[DATACORE_MENTAL_HEALTH]]" + dat += "
" dat += "
Back" if(3) @@ -95,7 +96,7 @@ if(4) dat += "" - if(active1 in GLOB.data_core.general) + if(active1 in SSdatacore.get_records(DATACORE_RECORDS_STATION)) var/front_photo = active1.get_front_photo() if(istype(front_photo, /obj/item/photo)) var/obj/item/photo/photo_front = front_photo @@ -104,36 +105,34 @@ if(istype(side_photo, /obj/item/photo)) var/obj/item/photo/photo_side = side_photo user << browse_rsc(photo_side.picture.picture_image, "photo_side") - dat += "" + dat += "" dat += "" dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" else dat += "" dat += "" - if(active2 in GLOB.data_core.medical) - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" //(per disease info placed in log/comment section) - dat += "" - dat += "" - dat += "" + if(active2 in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" //(per disease info placed in log/comment section) + dat += "" + dat += "" + dat += "" dat += "" var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - dat += "" + while(active2.fields["com_[counter]"]) + dat += "" counter++ dat += "" @@ -181,9 +180,9 @@ . = ..() if(.) return . - if(!(active1 in GLOB.data_core.general)) + if(!(active1 in SSdatacore.get_records(DATACORE_RECORDS_STATION))) active1 = null - if(!(active2 in GLOB.data_core.medical)) + if(!(active2 in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL))) active2 = null if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || isAdminGhostAI(usr)) @@ -268,7 +267,7 @@ else if(href_list["del_all2"]) investigate_log("[key_name(usr)] has deleted all medical records.", INVESTIGATE_RECORDS) - GLOB.data_core.medical.Cut() + SSdatacore.wipe_records(DATACORE_RECORDS_MEDICAL) temp = "All records deleted." else if(href_list["field"]) @@ -277,54 +276,42 @@ switch(href_list["field"]) if("fingerprint") if(active1) - var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", active1.fields["fingerprint"], null) + var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", active1.fields[DATACORE_FINGERPRINT], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - active1.fields["fingerprint"] = t1 + active1.fields[DATACORE_FINGERPRINT] = t1 if("gender") if(active1) - if(active1.fields["gender"] == "Male") - active1.fields["gender"] = "Female" - else if(active1.fields["gender"] == "Female") - active1.fields["gender"] = "Other" + if(active1.fields[DATACORE_GENDER] == "Male") + active1.fields[DATACORE_GENDER] = "Female" + else if(active1.fields[DATACORE_GENDER] == "Female") + active1.fields[DATACORE_GENDER] = "Other" else - active1.fields["gender"] = "Male" + active1.fields[DATACORE_GENDER] = "Male" if("age") if(active1) - var/t1 = input("Please input age:", "Med. records", active1.fields["age"], null) as num + var/t1 = input("Please input age:", "Med. records", active1.fields[DATACORE_AGE], null) as num if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - active1.fields["age"] = t1 + active1.fields[DATACORE_AGE] = t1 if("species") if(active1) - var/t1 = stripped_input("Please input species name", "Med. records", active1.fields["species"], null) + var/t1 = stripped_input("Please input species name", "Med. records", active1.fields[DATACORE_SPECIES], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - active1.fields["species"] = t1 - if("mi_dis") - if(active2) - var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) - if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) - return - active2.fields["mi_dis"] = t1 - if("mi_dis_d") + active1.fields[DATACORE_SPECIES] = t1 + if(DATACORE_DISABILITIES) if(active2) - var/t1 = stripped_input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) + var/t1 = stripped_input("Please input disabilities list:", "Med. records", active2.fields["disabilities"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["mi_dis_d"] = t1 - if("ma_dis") + active2.fields[DATACORE_DISABILITIES] = t1 + if(DATACORE_DISABILITIES_DETAILS) if(active2) - var/t1 = stripped_input("Please input major disabilities list:", "Med. records", active2.fields["ma_dis"], null) + var/t1 = stripped_input("Please summarize dis.:", "Med. records", active2.fields["disabilities_details"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["ma_dis"] = t1 - if("ma_dis_d") - if(active2) - var/t1 = stripped_input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) - if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) - return - active2.fields["ma_dis_d"] = t1 + active2.fields[DATACORE_DISABILITIES_DETAILS] = t1 if("alg") if(active2) var/t1 = stripped_input("Please state allergies:", "Med. records", active2.fields["alg"], null) @@ -339,22 +326,22 @@ active2.fields["alg_d"] = t1 if("cdi") if(active2) - var/t1 = stripped_input("Please state diseases:", "Med. records", active2.fields["cdi"], null) + var/t1 = stripped_input("Please state diseases:", "Med. records", active2.fields[DATACORE_DISEASES], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["cdi"] = t1 + active2.fields[DATACORE_DISEASES] = t1 if("cdi_d") if(active2) - var/t1 = stripped_input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) + var/t1 = stripped_input("Please summarize diseases:", "Med. records", active2.fields[DATACORE_DISEASES_DETAILS], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["cdi_d"] = t1 + active2.fields[DATACORE_DISEASES_DETAILS] = t1 if("notes") if(active2) - var/t1 = stripped_input("Please summarize notes:", "Med. records", active2.fields["notes"], null) + var/t1 = stripped_input("Please summarize notes:", "Med. records", active2.fields[DATACORE_NOTES], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["notes"] = t1 + active2.fields[DATACORE_NOTES] = t1 if("p_stat") if(active1) temp = "Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
" @@ -366,10 +353,10 @@ temp = "Blood Type:
\n\tA-A+
\n\tB-B+
\n\tAB-AB+
\n\tO-O+
" if("b_dna") if(active2) - var/t1 = stripped_input("Please input DNA hash:", "Med. records", active2.fields["b_dna"], null) + var/t1 = stripped_input("Please input DNA hash:", "Med. records", active2.fields[DATACORE_BLOOD_DNA], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - active2.fields["b_dna"] = t1 + active2.fields[DATACORE_BLOOD_DNA] = t1 if("show_photo_front") if(active1) var/front_photo = active1.get_front_photo() @@ -388,46 +375,46 @@ if(active1) switch(href_list["p_stat"]) if("deceased") - active1.fields["p_stat"] = "*Deceased*" + active1.fields[DATACORE_PHYSICAL_HEALTH] = "*Deceased*" if("unconscious") - active1.fields["p_stat"] = "*Unconscious*" + active1.fields[DATACORE_PHYSICAL_HEALTH] = "*Unconscious*" if("active") - active1.fields["p_stat"] = "Active" + active1.fields[DATACORE_PHYSICAL_HEALTH] = "Active" if("unfit") - active1.fields["p_stat"] = "Physically Unfit" + active1.fields[DATACORE_PHYSICAL_HEALTH] = "Physically Unfit" else if(href_list["m_stat"]) if(active1) switch(href_list["m_stat"]) if("insane") - active1.fields["m_stat"] = "*Insane*" + active1.fields[DATACORE_MENTAL_HEALTH] = "*Insane*" if("unstable") - active1.fields["m_stat"] = "*Unstable*" + active1.fields[DATACORE_MENTAL_HEALTH] = "*Unstable*" if("watch") - active1.fields["m_stat"] = "*Watch*" + active1.fields[DATACORE_MENTAL_HEALTH] = "*Watch*" if("stable") - active1.fields["m_stat"] = "Stable" + active1.fields[DATACORE_MENTAL_HEALTH] = "Stable" else if(href_list["blood_type"]) if(active2) switch(href_list["blood_type"]) if("an") - active2.fields["blood_type"] = "A-" + active2.fields[DATACORE_BLOOD_TYPE] = "A-" if("bn") - active2.fields["blood_type"] = "B-" + active2.fields[DATACORE_BLOOD_TYPE] = "B-" if("abn") - active2.fields["blood_type"] = "AB-" + active2.fields[DATACORE_BLOOD_TYPE] = "AB-" if("on") - active2.fields["blood_type"] = "O-" + active2.fields[DATACORE_BLOOD_TYPE] = "O-" if("ap") - active2.fields["blood_type"] = "A+" + active2.fields[DATACORE_BLOOD_TYPE] = "A+" if("bp") - active2.fields["blood_type"] = "B+" + active2.fields[DATACORE_BLOOD_TYPE] = "B+" if("abp") - active2.fields["blood_type"] = "AB+" + active2.fields[DATACORE_BLOOD_TYPE] = "AB+" if("op") - active2.fields["blood_type"] = "O+" + active2.fields[DATACORE_BLOOD_TYPE] = "O+" else if(href_list["del_r"]) @@ -435,55 +422,56 @@ temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" else if(href_list["del_r2"]) - investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS) + investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields[DATACORE_NAME]].", INVESTIGATE_RECORDS) if(active2) qdel(active2) active2 = null else if(href_list["d_rec"]) - active1 = find_record("id", href_list["d_rec"], GLOB.data_core.general) + active1 = SSdatacore.find_record("id", href_list["d_rec"], DATACORE_RECORDS_STATION) if(active1) - active2 = find_record("id", href_list["d_rec"], GLOB.data_core.medical) + active2 = SSdatacore.find_record("id", href_list["d_rec"], DATACORE_RECORDS_MEDICAL) if(!active2) active1 = null screen = 4 else if(href_list["new"]) if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) - var/datum/data/record/R = new /datum/data/record() - R.fields["name"] = active1.fields["name"] - R.fields["id"] = active1.fields["id"] - R.name = text("Medical Record #[]", R.fields["id"]) - R.fields["blood_type"] = "Unknown" - R.fields["b_dna"] = "Unknown" - R.fields["mi_dis"] = "None" - R.fields["mi_dis_d"] = "No minor disabilities have been diagnosed." - R.fields["ma_dis"] = "None" - R.fields["ma_dis_d"] = "No major disabilities have been diagnosed." + var/datum/data/record/R = new /datum/data/record/medical() + + R.fields[DATACORE_ID] = active1.fields[DATACORE_ID] + R.name = "Medical Record #[R.fields[DATACORE_ID]]" + + R.fields[DATACORE_NAME] = active1.fields[DATACORE_NAME] + R.fields[DATACORE_BLOOD_TYPE] = "Unknown" + R.fields[DATACORE_BLOOD_DNA] = "Unknown" + R.fields[DATACORE_DISABILITIES] = "None" + R.fields[DATACORE_DISABILITIES_DETAILS] = "No disabilities have been diagnosed." R.fields["alg"] = "None" R.fields["alg_d"] = "No allergies have been detected in this patient." - R.fields["cdi"] = "None" - R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." - R.fields["notes"] = "No notes." - GLOB.data_core.medical += R + R.fields[DATACORE_DISEASES] = "None" + R.fields[DATACORE_DISEASES_DETAILS] = "No diseases have been diagnosed at the moment." + R.fields[DATACORE_NOTES] = "No notes." active2 = R screen = 4 + SSdatacore.inject_record(R, DATACORE_RECORDS_MEDICAL) + else if(href_list["add_c"]) - if(!(active2 in GLOB.data_core.medical)) + if(!(active2 in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL))) return var/a2 = active2 var/t1 = stripped_multiline_input("Add Comment:", "Med. records", null, null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return var/counter = 1 - while(active2.fields[text("com_[]", counter)]) + while(active2.fields["com_[counter]"]) counter++ - active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", authenticated, rank, stationtime2text(), time2text(world.realtime, "MMM DD"), CURRENT_STATION_YEAR, t1) + active2.fields["com_[counter]"] = "Made by [authenticated] ([rank]) on [stationtime2text()] [time2text(world.realtime, "MMM DD")], [CURRENT_STATION_YEAR]
[t1]" else if(href_list["del_c"]) - if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) - active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" + if((istype(active2, /datum/data/record) && active2.fields["com_[href_list["del_c"]]"])) + active2.fields["com_[href_list["del_c"]]"] = "Deleted" else if(href_list["search"]) var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records") @@ -492,16 +480,16 @@ active1 = null active2 = null t1 = lowertext(t1) - for(var/datum/data/record/R in GLOB.data_core.medical) - if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) + for(var/datum/data/record/R in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) + if((lowertext(R.fields[DATACORE_NAME]) == t1 || t1 == lowertext(R.fields[DATACORE_ID]) || t1 == lowertext(R.fields[DATACORE_BLOOD_DNA]))) active2 = R else //Foreach continue //goto(3229) if(!( active2 )) - temp = text("Could not locate record [].", sanitize(t1)) + temp = "Could not locate record [sanitize(t1)]." else - for(var/datum/data/record/E in GLOB.data_core.general) - if((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) + for(var/datum/data/record/E in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + if((E.fields[DATACORE_NAME] == active2.fields[DATACORE_NAME] || E.fields[DATACORE_ID] == active2.fields[DATACORE_ID])) active1 = E else //Foreach continue //goto(3334) @@ -510,27 +498,51 @@ else if(href_list["print_p"]) if(!( printing )) printing = 1 - GLOB.data_core.medicalPrintCount++ + SSdatacore.medicalPrintCount++ playsound(loc, 'sound/items/poster_being_created.ogg', 100, TRUE) sleep(30) var/obj/item/paper/P = new /obj/item/paper( loc ) - P.info = "
Medical Record - (MR-[GLOB.data_core.medicalPrintCount])

" - if(active1 in GLOB.data_core.general) - P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"]) - P.info += "\nSpecies: [active1.fields["species"]]
" - P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) + P.info = "
Medical Record - (MR-[SSdatacore.medicalPrintCount])

" + if(active1 in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + + P.info +={" +Name: [active1.fields[DATACORE_NAME]] +ID: [active1.fields[DATACORE_ID]]
+Gender: [active1.fields[DATACORE_GENDER]]
+Age: [active1.fields[DATACORE_AGE]]
+Species: [active1.fields[DATACORE_SPECIES]]
+Fingerprint: [active1.fields[DATACORE_FINGERPRINT]]
+Physical Status: [active1.fields[DATACORE_PHYSICAL_HEALTH]]
+Mental Status: [active1.fields[DATACORE_MENTAL_HEALTH]]
+"} + else P.info += "General Record Lost!
" - if(active2 in GLOB.data_core.medical) - P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", active2.fields["blood_type"], active2.fields["b_dna"], active2.fields["mi_dis"], active2.fields["mi_dis_d"], active2.fields["ma_dis"], active2.fields["ma_dis_d"], active2.fields["alg"], active2.fields["alg_d"], active2.fields["cdi"], active2.fields["cdi_d"], active2.fields["notes"]) + if(active2 in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) + + P.info += {" +
Medical Data

+Blood Type: [active2.fields[DATACORE_BLOOD_TYPE]]
+DNA: [active2.fields[DATACORE_BLOOD_DNA]]
+
+Minor Disabilities: [active2.fields["disabilities"]]
+Details: [active2.fields["disabilities_details"]]

+Allergies: [active2.fields["alg"]]
+Details: [active2.fields["alg_d"]]

+Current Diseases: [active2.fields[DATACORE_DISEASES]] (per disease info placed in log/comment section)
+Details: [active2.fields[DATACORE_DISEASES_DETAILS]]

+Important Notes:
+\t[active2.fields[DATACORE_NOTES]]

+
Comments/Log

"} + var/counter = 1 - while(active2.fields[text("com_[]", counter)]) - P.info += text("[]
", active2.fields[text("com_[]", counter)]) + while(active2.fields["com_[counter]"]) + P.info += "[active2.fields["com_[counter]"]]
" counter++ - P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, active1.fields["name"]) + P.name ="MR-[SSdatacore.medicalPrintCount] '[active1.fields[DATACORE_NAME]]'" else P.info += "Medical Record Lost!
" - P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, "Record Lost") + P.name = "MR-[SSdatacore.medicalPrintCount] 'Record Lost'" P.info += "" P.update_appearance() printing = null @@ -542,24 +554,24 @@ /obj/machinery/computer/med_data/emp_act(severity) . = ..() if(!(machine_stat & (BROKEN|NOPOWER)) && !(. & EMP_PROTECT_SELF)) - for(var/datum/data/record/R in GLOB.data_core.medical) + for(var/datum/data/record/R in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) if(prob(10/severity)) switch(rand(1,6)) if(1) if(prob(10)) - R.fields["name"] = random_unique_lizard_name(R.fields["gender"],1) + R.fields[DATACORE_NAME] = random_unique_lizard_name(R.fields[DATACORE_GENDER],1) else - R.fields["name"] = random_unique_name(R.fields["gender"],1) + R.fields[DATACORE_NAME] = random_unique_name(R.fields[DATACORE_GENDER],1) if(2) - R.fields["gender"] = pick("Male", "Female", "Other") + R.fields[DATACORE_GENDER] = pick("Male", "Female", "Other") if(3) - R.fields["age"] = rand(AGE_MIN, AGE_MAX) + R.fields[DATACORE_AGE] = rand(AGE_MIN, AGE_MAX) if(4) - R.fields["blood_type"] = random_blood_type() + R.fields[DATACORE_BLOOD_TYPE] = random_blood_type() if(5) - R.fields["p_stat"] = pick("*Unconscious*", "Active", "Physically Unfit") + R.fields[DATACORE_PHYSICAL_HEALTH] = pick("*Unconscious*", "Active", "Physically Unfit") if(6) - R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") + R.fields[DATACORE_MENTAL_HEALTH] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable") continue else if(prob(1)) @@ -568,7 +580,7 @@ /obj/machinery/computer/med_data/proc/canUseMedicalRecordsConsole(mob/user, message = 1, record1, record2) if(user && message && authenticated) - if(user.canUseTopic(src, !issilicon(user))) + if(user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) if(!record1 || record1 == active1) if(!record2 || record2 == active2) return TRUE diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 9f8eedb0cc53..293744966810 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -17,11 +17,16 @@ /obj/machinery/computer/pod/Initialize(mapload) . = ..() - for(var/obj/machinery/mass_driver/M in range(range, src)) + SET_TRACKING(__TYPE__) + for(var/obj/machinery/mass_driver/M as anything in INSTANCES_OF(/obj/machinery/mass_driver)) if(M.id == id) connected = M break +/obj/machinery/computer/pod/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/computer/pod/process(delta_time) if(COOLDOWN_FINISHED(src, massdriver_countdown)) timing = FALSE diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm index 8edc00554473..dad6afba111a 100644 --- a/code/game/machinery/computer/prisoner/gulag_teleporter.dm +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -37,12 +37,11 @@ prisoner_list["name"] = prisoner.real_name if(contained_id) can_teleport = TRUE - if(!isnull(GLOB.data_core.general)) - for(var/r in GLOB.data_core.security) - var/datum/data/record/R = r - if(R.fields["name"] == prisoner_list["name"]) - temporary_record = R - prisoner_list["crimstat"] = temporary_record.fields["criminal"] + + var/datum/data/record/security/R = SSdatacore.get_record_by_name(prisoner_list["name"], DATACORE_RECORDS_SECURITY) + if(R) + temporary_record = R + prisoner_list["crimstat"] = temporary_record.fields[DATACORE_CRIMINAL_STATUS] data["prisoner"] = prisoner_list diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm index 9b1c0e27a57e..b623a39549c6 100644 --- a/code/game/machinery/computer/prisoner/management.dm +++ b/code/game/machinery/computer/prisoner/management.dm @@ -24,12 +24,12 @@ else if(screen == 1) dat += "

Prisoner ID Management

" if(contained_id) - dat += text("[contained_id]
") - dat += text("Collected Points: [contained_id.points]. Reset.
") - dat += text("Card goal: [contained_id.goal]. Set
") - dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") + dat += "[contained_id]
" + dat += "Collected Points: [contained_id.points]. Reset.
" + dat += "Card goal: [contained_id.goal]. Set
" + dat += "Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
" else - dat += text("Insert Prisoner ID.
") + dat += "Insert Prisoner ID.
" dat += "

Prisoner Implant Management

" dat += "
Chemical Implants
" var/turf/Tr = null diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index af921e526a1a..0831fa9bcbef 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -26,12 +26,6 @@ /obj/item/circuit_component/arrest_console_arrest, )) -#define COMP_STATE_ARREST "*Arrest*" -#define COMP_STATE_PRISONER "Incarcerated" -#define COMP_STATE_SUSPECTED "Suspected" -#define COMP_STATE_PAROL "Paroled" -#define COMP_STATE_DISCHARGED "Discharged" -#define COMP_STATE_NONE "None" #define COMP_SECURITY_ARREST_AMOUNT_TO_FLAG 10 /obj/item/circuit_component/arrest_console_data @@ -80,24 +74,24 @@ on_fail.set_output(COMPONENT_SIGNAL) return - if(isnull(GLOB.data_core.general)) + if(isnull(SSdatacore.get_records(DATACORE_RECORDS_STATION))) 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) + for(var/datum/data/record/player_record as anything in SSdatacore.get_records(DATACORE_RECORDS_STATION)) var/list/entry = list() - var/datum/data/record/player_security_record = find_record("id", player_record.fields["id"], GLOB.data_core.security) + var/datum/data/record/player_security_record = SSdatacore.find_record("id", player_record.fields[DATACORE_ID], DATACORE_RECORDS_SECURITY) if(player_security_record) - entry["arrest_status"] = player_security_record.fields["criminal"] + entry["arrest_status"] = player_security_record.fields[DATACORE_CRIMINAL_STATUS] 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"] + entry["name"] = player_record.fields[DATACORE_NAME] + entry["id"] = player_record.fields[DATACORE_ID] + entry["rank"] = player_record.fields[DATACORE_RANK] + entry["gender"] = player_record.fields[DATACORE_GENDER] + entry["age"] = player_record.fields[DATACORE_AGE] + entry["species"] = player_record.fields[DATACORE_SPECIES] + entry["fingerprint"] = player_record.fields[DATACORE_FINGERPRINT] new_table += list(entry) @@ -133,12 +127,12 @@ /obj/item/circuit_component/arrest_console_arrest/populate_options() var/static/list/component_options = list( - COMP_STATE_ARREST, - COMP_STATE_PRISONER, - COMP_STATE_SUSPECTED, - COMP_STATE_PAROL, - COMP_STATE_DISCHARGED, - COMP_STATE_NONE, + CRIMINAL_WANTED, + CRIMINAL_INCARCERATED, + CRIMINAL_SUSPECT, + CRIMINAL_PAROLE, + CRIMINAL_DISCHARGED, + CRIMINAL_NONE, ) new_status = add_option_port("Arrest Options", component_options) @@ -164,14 +158,14 @@ 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"] + var/datum/data/record/security/sec_record = target["security_record"] if(!sec_record) continue - if(sec_record.fields["criminal"] != status_to_set) + if(sec_record.fields[DATACORE_CRIMINAL_STATUS] != status_to_set) successful_set++ names_of_entries += target["name"] - sec_record.fields["criminal"] = status_to_set + sec_record.set_criminal_status(status_to_set) if(successful_set > 0) @@ -181,12 +175,6 @@ for(var/mob/living/carbon/human/human as anything in GLOB.human_list) human.sec_hud_set_security_status() -#undef COMP_STATE_ARREST -#undef COMP_STATE_PRISONER -#undef COMP_STATE_SUSPECTED -#undef COMP_STATE_PAROL -#undef COMP_STATE_DISCHARGED -#undef COMP_STATE_NONE #undef COMP_SECURITY_ARREST_AMOUNT_TO_FLAG /obj/machinery/computer/secure_data/syndie @@ -292,35 +280,35 @@ "} - if(!isnull(GLOB.data_core.general)) - for(var/datum/data/record/R in sort_record(GLOB.data_core.general, sortBy, order)) + if(!isnull(SSdatacore.get_records(DATACORE_RECORDS_STATION))) + for(var/datum/data/record/R in sort_record(SSdatacore.get_records(DATACORE_RECORDS_STATION), sortBy, order)) var/crimstat = "" - for(var/datum/data/record/E in GLOB.data_core.security) - if((E.fields["name"] == R.fields["name"]) && (E.fields["id"] == R.fields["id"])) - crimstat = E.fields["criminal"] + for(var/datum/data/record/E in SSdatacore.get_records(DATACORE_RECORDS_SECURITY)) + if((E.fields[DATACORE_NAME] == R.fields[DATACORE_NAME]) && (E.fields[DATACORE_ID] == R.fields[DATACORE_ID])) + crimstat = E.fields[DATACORE_CRIMINAL_STATUS] var/background switch(crimstat) - if("*Arrest*") + if(CRIMINAL_WANTED) background = "'background-color:#990000;'" - if("Incarcerated") + if(CRIMINAL_INCARCERATED) background = "'background-color:#CD6500;'" - if("Suspected") + if(CRIMINAL_SUSPECT) background = "'background-color:#CD6500;'" - if("Paroled") + if(CRIMINAL_PAROLE) background = "'background-color:#CD6500;'" - if("Discharged") + if(CRIMINAL_DISCHARGED) background = "'background-color:#006699;'" - if("None") + if(CRIMINAL_NONE) background = "'background-color:#4F7529;'" if("") background = "''" //"'background-color:#FFFFFF;'" crimstat = "No Record." dat += "" - dat += text("", R.fields["name"], R.fields["id"], R.fields["rank"], R.fields["fingerprint"], R.fields["name"]) - dat += text("", R.fields["id"]) - dat += text("", R.fields["rank"]) - dat += text("", R.fields["fingerprint"]) - dat += text("", crimstat) + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" dat += {"
Medical Record
Name:[active1.fields["name"]]
Name:[active1.fields[DATACORE_NAME]]
ID:[active1.fields["id"]]
Gender: [active1.fields["gender"]] 
Age: [active1.fields["age"]] 
Species: [active1.fields["species"]] 
Fingerprint: [active1.fields["fingerprint"]] 
Physical Status: [active1.fields["p_stat"]] 
Mental Status: [active1.fields["m_stat"]] 
ID:[active1.fields[DATACORE_ID]]
Gender: [active1.fields[DATACORE_GENDER]] 
Age: [active1.fields[DATACORE_AGE]] 
Species: [active1.fields[DATACORE_SPECIES]] 
Fingerprint: [active1.fields[DATACORE_FINGERPRINT]] 
Physical Status: [active1.fields[DATACORE_PHYSICAL_HEALTH]] 
Mental Status: [active1.fields[DATACORE_MENTAL_HEALTH]] 
General Record Lost!

Medical Data
Blood Type: [active2.fields["blood_type"]] 
DNA: [active2.fields["b_dna"]] 

Minor Disabilities:

 [active2.fields["mi_dis"]] 
Details: [active2.fields["mi_dis_d"]] 

Major Disabilities:

 [active2.fields["ma_dis"]] 
Details: [active2.fields["ma_dis_d"]] 

Current Diseases:

 [active2.fields["cdi"]] 
Details: [active2.fields["cdi_d"]] 

Important Notes:

 [active2.fields["notes"]] 

Notes Cont'd:

 [active2.fields["notes_d"]] 
Blood Type: [active2.fields[DATACORE_BLOOD_TYPE]] 
DNA: [active2.fields[DATACORE_BLOOD_DNA]] 

Disabilities:

 [active2.fields[DATACORE_DISABILITIES]] 
Details: [active2.fields[DATACORE_DISABILITIES_DETAILS]] 

Current Diseases:

 [active2.fields[DATACORE_DISEASES]] 
Details: [active2.fields[DATACORE_DISEASES_DETAILS]] 

Important Notes:

 [active2.fields[DATACORE_NOTES]] 

Notes Cont'd:

 [active2.fields[DATACORE_NOTES_DETAILS]] 

Comments/Log
[active2.fields[text("com_[]", counter)]]
Delete Entry
[active2.fields["com_[counter]"]]
Delete Entry
Add Entry
Fingerprints Criminal Status
[][][][][]
[R.fields[DATACORE_NAME]][R.fields[DATACORE_ID]][R.fields[DATACORE_RANK]][R.fields[DATACORE_FINGERPRINT]][crimstat]

You start skimming through the manual...

- + @@ -302,7 +302,7 @@ icon_state = "bookSpaceLaw" starting_author = "Nanotrasen" starting_title = "Space Law" - page_link = "Space_Law" + page_link = "Sector_Regulations" /obj/item/book/manual/wiki/security_space_law/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] pretends to read \the [src] intently... then promptly dies of laughter!")) @@ -393,13 +393,6 @@ starting_title = "Medical Space Compendium, Volume 638" page_link = "Guide_to_medicine" -/obj/item/book/manual/wiki/surgery - name = "Brain Surgery for Dummies" - icon_state = "book4" - starting_author = "Dr. F. Fran" - starting_title = "Brain Surgery for Dummies" - page_link = "Surgery" - /obj/item/book/manual/wiki/grenades name = "DIY Chemical Grenades" icon_state = "book2" @@ -436,16 +429,52 @@ H.spread_bodyparts() return (BRUTELOSS) -/obj/item/book/manual/wiki/plumbing - name = "Chemical Factories Without Narcotics" - icon_state ="plumbingbook" - starting_author = "Nanotrasen" - starting_title = "Chemical Factories Without Narcotics" - page_link = "Guide_to_plumbing" - /obj/item/book/manual/wiki/cytology name = "Unethically Grown Organics" icon_state ="cytologybook" starting_author = "Kryson" starting_title = "Unethically Grown Organics" page_link = "Guide_to_cytology" + +/* + * + * Codex Books + * + */ + +/obj/item/book/manual/codex + abstract_type = /obj/item/book/manual/codex + name = "Abstract Codex Book" + + /// Type or String (Type preferred for compiletime checking, if possible.) of the codex entry to open. + var/datum/codex_entry/target_entry + +/obj/item/book/manual/codex/on_read(mob/user) + //No parent call. + if(!istype(target_entry)) + target_entry = SScodex.get_codex_entry(target_entry) + if(!target_entry) + to_chat(user, span_warning("\The [src] is blank...?")) + return + SScodex.present_codex_entry(user, target_entry) + return + +/obj/item/book/manual/codex/surgery + name = "A.P. Surgical Journal, #### Edition" + starting_title = "A.P. Surgical Journal, #### Edition" + desc = "A reprint of the Aether Pharmaceutical surgical journal, Detailing the 'latest' methods of medicial butchering." + icon_state = "bookaether" + target_entry = "Guide to Surgery" + +/obj/item/book/manual/codex/surgery/Initialize() + //Station gets the outdated ones :smug: + name = "A.P. Surgical Journal, [CURRENT_STATION_YEAR-rand(1,3)] Edition" + starting_title = name + . = ..() + +/obj/item/book/manual/codex/supermatter + name = "DSP 200-234-222: Supermatter Operations" + starting_title = "DSP 200-234-222: Supermatter Operations" + desc = "An entry of the Daedalus Service Practices, This one concerns the operation of supermatter engines." + icon_state = "bookdsp" + target_entry = "Guide to The Supermatter" diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index 6c2df7e0dfb7..d3876fc2249e 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -8,9 +8,13 @@ lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' slot_flags = ITEM_SLOT_BELT - force = 12 //9 hit crit w_class = WEIGHT_CLASS_NORMAL + stamina_damage = 15 + stamina_cost = 21 + stamina_critical_chance = 5 + force = 12 + /// Whether this baton is active or not var/active = TRUE /// Default wait time until can stun again. @@ -20,7 +24,7 @@ /// If affect_cyborg is TRUE, this is how long we stun cyborgs for on a hit. var/stun_time_cyborg = (5 SECONDS) /// The length of the knockdown applied to the user on clumsy_check() - var/clumsy_knockdown_time = 18 SECONDS + var/clumsy_knockdown_time = 10 SECONDS /// How much stamina damage we deal on a successful hit against a living, non-cyborg mob. var/charged_stamina_damage = 130 /// Can we stun cyborgs? @@ -38,19 +42,19 @@ var/context_living_target_active = "Stun" /// The context to show when the baton is active and targetting a living thing in combat mode - var/context_living_target_active_combat_mode = "Stun" + var/context_living_target_active_combat_mode = "Stun Self" /// The context to show when the baton is inactive and targetting a living thing var/context_living_target_inactive = "Prod" /// The context to show when the baton is inactive and targetting a living thing in combat mode - var/context_living_target_inactive_combat_mode = "Attack" + var/context_living_target_inactive_combat_mode = "Bludgeon" - /// The RMB context to show when the baton is active and targetting a living thing - var/context_living_rmb_active = "Attack" + /// When flipped, you can beat the clown. Or kill simplemobs. Or beat the clown. + var/flipped = FALSE + var/can_be_flipped = FALSE - /// The RMB context to show when the baton is inactive and targetting a living thing - var/context_living_rmb_inactive = "Attack" + var/unflipped_force = 5 /obj/item/melee/baton/Initialize(mapload) . = ..() @@ -58,31 +62,72 @@ if(charged_stamina_damage != 0) offensive_notes = "\nVarious interviewed security forces report being able to beat criminals into exhaustion with only [span_warning("[CEILING(100 / charged_stamina_damage, 1)] hit\s!")]" + if(can_be_flipped) + AddElement(/datum/element/update_icon_updates_onmob) + force = unflipped_force + register_item_context() +/obj/item/melee/baton/update_icon_state() + . = ..() + if(!can_be_flipped) + return + + if(flipped) + icon_state = "[initial(icon_state)]_f" + else + icon_state = initial(icon_state) + /** * Ok, think of baton attacks like a melee attack chain: - * - * [/baton_attack()] comes first. It checks if the user is clumsy, if the target parried the attack and handles some messages and sounds. - * * Depending on its return value, it'll either do a normal attack, continue to the next step or stop the attack. - * - * [/finalize_baton_attack()] is then called. It handles logging stuff, sound effects and calls baton_effect(). - * * The proc is also called in other situations such as stunbatons right clicking or throw impact. Basically when baton_attack() - * * checks are either redundant or unnecessary. - * - * [/baton_effect()] is third in the line. It knockdowns targets, along other effects called in additional_effects_cyborg() and - * * additional_effects_non_cyborg(). - * - * TL;DR: [/baton_attack()] -> [/finalize_baton_attack()] -> [/baton_effect()] */ /obj/item/melee/baton/attack(mob/living/target, mob/living/user, params) - add_fingerprint(user) - var/list/modifiers = params2list(params) - switch(baton_attack(target, user, modifiers)) - if(BATON_DO_NORMAL_ATTACK) + if(flipped && !active) + return ..() // Go straight up the chain + + if(melee_baton_attack(target, user)) + if(!baton_effect(target, user)) return ..() - if(BATON_ATTACKING) - finalize_baton_attack(target, user, modifiers) + + add_fingerprint(user) //Only happens if we didn't go up the chain + +/obj/item/melee/baton/equipped(mob/user, slot, initial) + . = ..() + if(!(slot & ITEM_SLOT_HANDS)) + return + RegisterSignal(user, COMSIG_LIVING_TOGGLE_COMBAT_MODE, PROC_REF(user_flip)) + var/mob/living/L = user + user_flip(L, L.combat_mode) + +/obj/item/melee/baton/dropped(mob/user, silent) + . = ..() + UnregisterSignal(user, COMSIG_LIVING_TOGGLE_COMBAT_MODE) + user_flip(null, FALSE) + +/obj/item/melee/baton/proc/user_flip(mob/living/user, new_mode) + SIGNAL_HANDLER + + if(!can_be_flipped) + return + + if(new_mode == flipped) + return + + if(new_mode) + flipped = TRUE + force = initial(force) + SpinAnimation(0.06 SECONDS, 1) + transform = null + update_icon(UPDATE_ICON_STATE) + to_chat(user, span_notice("You flip [src] and wield it by the head.[active ? "This doesn't seem very safe." : ""]")) + + else + flipped = FALSE + force = unflipped_force + SpinAnimation(0.06 SECONDS, 1) + transform = null + update_icon(UPDATE_ICON_STATE) + to_chat(user, span_notice("You flip [src] and wield it by the handle.")) /obj/item/melee/baton/add_item_context(datum/source, list/context, atom/target, mob/living/user) if (isturf(target)) @@ -92,14 +137,12 @@ context[SCREENTIP_CONTEXT_LMB] = "Attack" else if (active) - context[SCREENTIP_CONTEXT_RMB] = context_living_rmb_active if (user.combat_mode) context[SCREENTIP_CONTEXT_LMB] = context_living_target_active_combat_mode else context[SCREENTIP_CONTEXT_LMB] = context_living_target_active else - context[SCREENTIP_CONTEXT_RMB] = context_living_rmb_inactive if (user.combat_mode) context[SCREENTIP_CONTEXT_LMB] = context_living_target_inactive_combat_mode @@ -108,22 +151,21 @@ return CONTEXTUAL_SCREENTIP_SET -/obj/item/melee/baton/proc/baton_attack(mob/living/target, mob/living/user, modifiers) - . = BATON_ATTACKING - +/obj/item/melee/baton/proc/melee_baton_attack(mob/living/target, mob/living/user) if(clumsy_check(user, target)) - return BATON_ATTACK_DONE - - if(!active || LAZYACCESS(modifiers, RIGHT_CLICK)) - return BATON_DO_NORMAL_ATTACK + return if(check_parried(target, user)) - return BATON_ATTACK_DONE + return if(stun_animation) user.do_attack_animation(target) - var/list/desc + if(!flipped && !active) + user.visible_message(span_notice("[user] prods [target] with [src].")) + return + + var/desc if(iscyborg(target)) if(affect_cyborg) @@ -131,12 +173,14 @@ else desc = get_unga_dunga_cyborg_stun_description(target, user) playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) //bonk - . = BATON_ATTACK_DONE + return FALSE else desc = get_stun_description(target, user) if(desc) - target.visible_message(desc["visible"], desc["local"]) + user.visible_message(desc) + + return TRUE /obj/item/melee/baton/proc/check_parried(mob/living/carbon/human/human_target, mob/living/user) if(!ishuman(human_target)) @@ -147,7 +191,7 @@ if(check_martial_counter(human_target, user)) return TRUE -/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, modifiers, in_attack_chain = TRUE) +/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user) if(on_stun_sound) playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) if(user) @@ -157,49 +201,34 @@ if(log_stun_attack) log_combat(user, target, "stun attacked", src) - baton_effect(target, user, modifiers) - -/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, modifiers) var/trait_check = HAS_TRAIT(target, TRAIT_STUNRESISTANCE) var/disable_duration = knockdown_time * (trait_check ? 0.1 : 1) if(iscyborg(target)) if(!affect_cyborg) return FALSE + target.flash_act(affect_silicon = TRUE) target.Disorient(6 SECONDS, charged_stamina_damage, paralyze = disable_duration, stack_status = FALSE) additional_effects_cyborg(target, user) + else - target.Disorient(6 SECONDS, charged_stamina_damage, paralyze = disable_duration, stack_status = FALSE) + target.Disorient(6 SECONDS, charged_stamina_damage, paralyze = disable_duration) additional_effects_non_cyborg(target, user) + return TRUE /// Default message for stunning a living, non-cyborg mob. /obj/item/melee/baton/proc/get_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] knocks [target] down with [src]!") - .["local"] = span_userdanger("[user] knocks you down with [src]!") - - return . + return span_danger("[user] knocks [target] down with [src]!") /// Default message for stunning a cyborg. /obj/item/melee/baton/proc/get_cyborg_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!") - .["local"] = span_danger("You pulse [target]'s sensors with the baton!") - - return . + return span_danger("[user] pulses [target]'s sensors with [src]!") /// Default message for trying to stun a cyborg with a baton that can't stun cyborgs. /obj/item/melee/baton/proc/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] tries to knock down [target] with [src], and predictably fails!") //look at this duuuuuude - .["local"] = span_userdanger("[user] tries to... knock you down with [src]?") //look at the top of his head! - - return . + return span_danger("[user] tries to knock down [target] with [src], and predictably fails!") /// Contains any special effects that we apply to living, non-cyborg mobs we stun. Does not include applying a knockdown, dealing stamina damage, etc. /obj/item/melee/baton/proc/additional_effects_non_cyborg(mob/living/target, mob/living/user) @@ -210,39 +239,34 @@ return /obj/item/melee/baton/proc/clumsy_check(mob/living/user, mob/living/intented_target) - if(!active || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50)) + if(!active || (!HAS_TRAIT(user, TRAIT_CLUMSY) && (!flipped || !can_be_flipped))) return FALSE - user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!")) - if(iscyborg(user)) - if(affect_cyborg) - user.flash_act(affect_silicon = TRUE) - user.Paralyze(clumsy_knockdown_time) - additional_effects_cyborg(user, user) // user is the target here - if(on_stun_sound) - playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) - else - playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) - else - user.Knockdown(clumsy_knockdown_time) - user.stamina.adjust(-charged_stamina_damage) - additional_effects_non_cyborg(user, user) // user is the target here - if(on_stun_sound) - playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1) + if(!flipped && prob(70)) //70% chance to not hit yourself, if you aren't holding it wrong + return FALSE + + user.visible_message(span_danger("[user] shocks [user.p_them()]self with [src].")) + + if(iscyborg(user) && !affect_cyborg) + playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) + return TRUE - user.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD) + var/log = log_stun_attack //A little hack to avoid double logging + log_stun_attack = FALSE + baton_effect(user, user) + log_stun_attack = log log_combat(user, user, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src) if(stun_animation) user.do_attack_animation(user) - return + return TRUE /obj/item/conversion_kit name = "conversion kit" desc = "A strange box containing wood working tools and an instruction paper to turn stun batons into something else." icon = 'icons/obj/storage.dmi' icon_state = "uk" - custom_price = PAYCHECK_HARD * 4.5 + custom_price = PAYCHECK_ASSISTANT * 7 /obj/item/melee/baton/telescopic name = "telescopic baton" @@ -258,8 +282,11 @@ w_class = WEIGHT_CLASS_SMALL item_flags = NONE force = 0 - clumsy_knockdown_time = 15 SECONDS + + clumsy_knockdown_time = 1 SECONDS active = FALSE + can_be_flipped = FALSE + knockdown_time = 1 SECOND /// The sound effecte played when our baton is extended. var/on_sound = 'sound/weapons/batonextend.ogg' @@ -279,6 +306,23 @@ attack_verb_simple_on = list("smack", "strike", "crack", "beat")) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) +/obj/item/melee/baton/telescopic/baton_effect(mob/living/target, mob/living/user) + if(user) + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + target.LAssailant = WEAKREF(user) + if(log_stun_attack) + log_combat(user, target, "telescopic batoned", src) + + if(iscyborg(target)) + return FALSE + + var/trait_check = HAS_TRAIT(target, TRAIT_STUNRESISTANCE) + var/disable_duration = knockdown_time * (trait_check ? 0.1 : 1) + target.Knockdown(disable_duration) + additional_effects_non_cyborg(target) + return TRUE + /obj/item/melee/baton/telescopic/suicide_act(mob/user) var/mob/living/carbon/human/human_user = user var/obj/item/organ/brain/our_brain = human_user.getorgan(/obj/item/organ/brain) @@ -312,147 +356,6 @@ playsound(user ? user : src, on_sound, 50, TRUE) return COMPONENT_NO_DEFAULT_MESSAGE -#define CUFF_MAXIMUM 3 -#define MUTE_CYCLES 5 -#define MUTE_MAX_MOD 2 -#define BONUS_STAMINA_DAM 35 -#define BONUS_STUTTER 10 SECONDS -#define BATON_CUFF_UPGRADE (1<<0) -#define BATON_MUTE_UPGRADE (1<<1) -#define BATON_FOCUS_UPGRADE (1<<2) - -/obj/item/melee/baton/telescopic/contractor_baton - name = "contractor baton" - desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "contractor_baton" - worn_icon_state = "contractor_baton" - lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' - slot_flags = ITEM_SLOT_BELT - w_class = WEIGHT_CLASS_SMALL - item_flags = NONE - force = 5 - cooldown = 2.5 SECONDS - charged_stamina_damage = 85 - clumsy_knockdown_time = 24 SECONDS - affect_cyborg = TRUE - on_stun_sound = 'sound/effects/contractorbatonhit.ogg' - - on_inhand_icon_state = "contractor_baton_on" - on_sound = 'sound/weapons/contractorbatonextend.ogg' - active_force = 16 - /// Bitflags for what upgrades the baton has - var/upgrade_flags - -/obj/item/melee/baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/target, mob/living/user) - target.set_timed_status_effect(40 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - target.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/stutter) - if(!iscarbon(target)) - return - var/mob/living/carbon/carbon_target = target - if(upgrade_flags & BATON_MUTE_UPGRADE) - if(carbon_target.silent < (MUTE_CYCLES * MUTE_MAX_MOD)) - carbon_target.silent = min((carbon_target.silent + MUTE_CYCLES), (MUTE_CYCLES * MUTE_MAX_MOD)) - if(upgrade_flags & BATON_FOCUS_UPGRADE) - var/datum/contractor_hub/the_hub = GLOB.contractors[user?.mind] - if(carbon_target == the_hub?.current_contract?.contract.target?.current) // Pain - carbon_target.stamina.adjust(-BONUS_STAMINA_DAM) - carbon_target.adjust_timed_status_effect(BONUS_STUTTER, /datum/status_effect/speech/stutter) - -/obj/item/melee/baton/telescopic/contractor_baton/attack_secondary(mob/living/victim, mob/living/user, params) - if(!(upgrade_flags & BATON_CUFF_UPGRADE) || !active) - return - for(var/obj/item/restraints/handcuffs/cuff in contents) - cuff.attack(victim, user) - break - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/melee/baton/telescopic/contractor_baton/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if(istype(attacking_item, /obj/item/baton_upgrade)) - add_upgrade(attacking_item, user) - if(!(upgrade_flags & BATON_CUFF_UPGRADE)) - return - if(!istype(attacking_item, /obj/item/restraints/handcuffs/cable)) - return - var/cuffcount = 0 - for(var/obj/item/restraints/handcuffs/cuff in contents) - cuffcount++ - if(cuffcount >= CUFF_MAXIMUM) - to_chat(user, span_warning("[src] is at maximum capacity for handcuffs!")) - return - attacking_item.forceMove(src) - to_chat(user, span_notice("You insert [attacking_item] into [src].")) - -/obj/item/melee/baton/telescopic/contractor_baton/wrench_act(mob/living/user, obj/item/tool) - . = ..() - for(var/obj/item/baton_upgrade/upgrade in src.contents) - upgrade.forceMove(get_turf(src)) - upgrade_flags &= ~upgrade.upgrade_flag - tool.play_tool_sound(src) - -/obj/item/melee/baton/telescopic/contractor_baton/examine(mob/user) - . = ..() - if(upgrade_flags) - . += "

[span_boldnotice("[src] has the following upgrades attached:")]" - for(var/obj/item/baton_upgrade/upgrade in contents) - . += "
[span_notice("[upgrade].")]" - -/obj/item/melee/baton/telescopic/contractor_baton/proc/add_upgrade(obj/item/baton_upgrade/upgrade, mob/user) - if(!(upgrade_flags & upgrade.upgrade_flag)) - upgrade_flags |= upgrade.upgrade_flag - upgrade.forceMove(src) - if(user) - user.visible_message(span_notice("[user] inserts the [upgrade] into [src]."), span_notice("You insert [upgrade] into [src]."), span_hear("You hear a faint click.")) - return TRUE - return FALSE - -/obj/item/melee/baton/telescopic/contractor_baton/upgraded - desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. This one seems to have unremovable parts." - -/obj/item/melee/baton/telescopic/contractor_baton/upgraded/Initialize(mapload) - . = ..() - for(var/upgrade in subtypesof(/obj/item/baton_upgrade)) - var/obj/item/baton_upgrade/the_upgrade = new upgrade() - add_upgrade(the_upgrade) - for(var/i in 1 to CUFF_MAXIMUM) - new/obj/item/restraints/handcuffs/cable(src) - -/obj/item/melee/baton/telescopic/contractor_baton/upgraded/wrench_act(mob/living/user, obj/item/tool) - return - -/obj/item/baton_upgrade - icon = 'icons/obj/items_and_weapons.dmi' - var/upgrade_flag - -/obj/item/baton_upgrade/cuff - name = "handcuff baton upgrade" - desc = "Allows the user to apply restraints to a target via baton, requires to be loaded with up to three prior." - icon_state = "contractor_cuff_upgrade" - upgrade_flag = BATON_CUFF_UPGRADE - -/obj/item/baton_upgrade/mute - name = "mute baton upgrade" - desc = "Use of the baton on a target will mute them for a short period." - icon_state = "contractor_mute_upgrade" - upgrade_flag = BATON_MUTE_UPGRADE - -/obj/item/baton_upgrade/focus - name = "focus baton upgrade" - desc = "Use of the baton on a target, should they be the subject of your contract, will be extra exhausted." - icon_state = "contractor_focus_upgrade" - upgrade_flag = BATON_FOCUS_UPGRADE - -#undef CUFF_MAXIMUM -#undef MUTE_CYCLES -#undef MUTE_MAX_MOD -#undef BONUS_STAMINA_DAM -#undef BONUS_STUTTER -#undef BATON_CUFF_UPGRADE -#undef BATON_MUTE_UPGRADE -#undef BATON_FOCUS_UPGRADE - /obj/item/melee/baton/security name = "stun baton" desc = "A stun baton for incapacitating people with. Left click to stun, right click to harm." @@ -460,23 +363,24 @@ icon_state = "stunbaton" inhand_icon_state = "baton" worn_icon_state = "baton" + lefthand_file = 'goon/icons/mob/inhands/baton_left.dmi' + righthand_file = 'goon/icons/mob/inhands/baton_right.dmi' force = 10 attack_verb_continuous = list("beats") attack_verb_simple = list("beat") - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 80, ACID = 80) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 80, ACID = 80) throwforce = 7 charged_stamina_damage = 130 knockdown_time = 6 SECONDS - clumsy_knockdown_time = 15 SECONDS + clumsy_knockdown_time = 6 SECONDS cooldown = 2.5 SECONDS on_stun_sound = 'sound/weapons/egloves.ogg' on_stun_volume = 50 active = FALSE - - context_living_rmb_active = "Harmful Stun" + can_be_flipped = TRUE var/throw_stun_chance = 35 var/obj/item/stock_parts/cell/cell @@ -536,14 +440,22 @@ update_appearance() /obj/item/melee/baton/security/update_icon_state() - if(active) - icon_state = "[initial(icon_state)]_active" - return ..() - if(!cell) - icon_state = "[initial(icon_state)]_nocell" - return ..() - icon_state = "[initial(icon_state)]" - return ..() + . = ..() + var/active + var/nocell + var/flipped + + if(src.active) + active = "_active" + + else if(!cell) + nocell = "_nocell" + + if(src.flipped) + flipped = "_f" + + icon_state = "[initial(icon_state)][active][nocell][flipped]" + inhand_icon_state = "[initial(inhand_icon_state)][active][flipped]" /obj/item/melee/baton/security/examine(mob/user) . = ..() @@ -613,27 +525,13 @@ SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK) deductcharge(cell_hit_cost) -/// Handles prodding targets with turned off stunbatons and right clicking stun'n'bash -/obj/item/melee/baton/security/baton_attack(mob/living/target, mob/living/user, modifiers) - . = ..() - if(. != BATON_DO_NORMAL_ATTACK) - return - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - if(active && !check_parried(target, user)) - finalize_baton_attack(target, user, modifiers, in_attack_chain = FALSE) - else if(!user.combat_mode) - target.visible_message(span_warning("[user] prods [target] with [src]. Luckily it was off."), \ - span_warning("[user] prods you with [src]. Luckily it was off.")) - return BATON_ATTACK_DONE - -/obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user) if(iscyborg(loc)) var/mob/living/silicon/robot/robot = loc if(!robot || !robot.cell || !robot.cell.use(cell_hit_cost)) return FALSE else if(!deductcharge(cell_hit_cost)) return FALSE - stun_override = 0 //Avoids knocking people down prematurely. return ..() /* @@ -648,21 +546,15 @@ SEND_SIGNAL(target, COMSIG_LIVING_MINOR_SHOCK) /obj/item/melee/baton/security/get_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] stuns [target] with [src]!") - .["local"] = span_userdanger("[user] stuns you with [src]!") + return span_danger("[user] stuns [target] with [src]!") /obj/item/melee/baton/security/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user) - . = list() - - .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!") - .["local"] = span_userdanger("[target] tries to... stun you with [src]?") + return span_danger("[user] tries to stun [target] with [src], and predictably fails!") /obj/item/melee/baton/security/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) . = ..() if(active && prob(throw_stun_chance) && isliving(hit_atom)) - finalize_baton_attack(hit_atom, thrownby?.resolve(), in_attack_chain = FALSE) + baton_effect(hit_atom, thrownby?.resolve()) /obj/item/melee/baton/security/emp_act(severity) . = ..() @@ -690,7 +582,7 @@ //Makeshift stun baton. Replacement for stun gloves. /obj/item/melee/baton/security/cattleprod name = "stunprod" - desc = "An improvised stun baton. Left click to stun, right click to harm." + desc = "An improvised stun baton." icon_state = "stunprod" inhand_icon_state = "prod" worn_icon_state = null @@ -723,11 +615,15 @@ else user.visible_message(span_warning("You can't put the crystal onto the stunprod while it has a power cell installed!")) -/obj/item/melee/baton/security/cattleprod/baton_effect() +/obj/item/melee/baton/security/cattleprod/melee_baton_attack() if(!sparkler.activate()) - return BATON_ATTACK_DONE + return return ..() +/obj/item/melee/baton/security/cattleprod/update_icon_state() + . = ..() + inhand_icon_state = initial(inhand_icon_state) + /obj/item/melee/baton/security/cattleprod/Destroy() if(sparkler) QDEL_NULL(sparkler) @@ -739,6 +635,9 @@ throw_speed = 1 icon_state = "boomerang" inhand_icon_state = "boomerang" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + force = 5 throwforce = 5 throw_range = 5 @@ -746,6 +645,7 @@ throw_stun_chance = 99 //Have you prayed today? convertible = FALSE custom_materials = list(/datum/material/iron = 10000, /datum/material/glass = 4000, /datum/material/silver = 10000, /datum/material/gold = 2000) + can_be_flipped = FALSE /obj/item/melee/baton/security/boomerang/Initialize(mapload) . = ..() @@ -757,7 +657,7 @@ var/caught = hit_atom.hitby(src, skipcatch = FALSE, hitpush = FALSE, throwingdatum = throwingdatum) var/mob/thrown_by = thrownby?.resolve() if(isliving(hit_atom) && !iscyborg(hit_atom) && !caught && prob(throw_stun_chance))//if they are a living creature and they didn't catch it - finalize_baton_attack(hit_atom, thrown_by, in_attack_chain = FALSE) + baton_effect(hit_atom, thrown_by) /obj/item/melee/baton/security/boomerang/loaded //Same as above, comes with a cell. preload_cell_type = /obj/item/stock_parts/cell/high @@ -770,13 +670,17 @@ inhand_icon_state = "teleprod" slot_flags = null +/obj/item/melee/baton/security/cattleprod/update_icon_state() + . = ..() + inhand_icon_state = initial(inhand_icon_state) + /obj/item/melee/baton/security/cattleprod/teleprod/clumsy_check(mob/living/carbon/human/user) . = ..() if(!.) return do_teleport(user, get_turf(user), 50, channel = TELEPORT_CHANNEL_BLUESPACE) -/obj/item/melee/baton/security/cattleprod/teleprod/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/security/cattleprod/teleprod/baton_effect(mob/living/target, mob/living/user) . = ..() if(!. || target.move_resist >= MOVE_FORCE_OVERPOWERING) return diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 943238811c31..f564eab2358f 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -1,16 +1,16 @@ /obj/item/melee/energy icon = 'icons/obj/transforming_energy.dmi' max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) attack_verb_continuous = list("hits", "taps", "pokes") attack_verb_simple = list("hit", "tap", "poke") resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 3 light_power = 1 light_on = FALSE stealthy_audio = TRUE - w_class = WEIGHT_CLASS_SMALL + w_class = WEIGHT_CLASS_NORMAL /// The color of this energy based sword, for use in editing the icon_state. var/sword_color_icon @@ -29,12 +29,20 @@ /// The heat given off when active. var/active_heat = 3500 + var/datum/effect_system/spark_spread/spark_system + COOLDOWN_DECLARE(spark_cd) + /obj/item/melee/energy/Initialize(mapload) . = ..() make_transformable() AddComponent(/datum/component/butchering, _speed = 5 SECONDS, _butcher_sound = active_hitsound) + spark_system = new /datum/effect_system/spark_spread() + spark_system.set_up(3, 0, src) + spark_system.attach(src) + /obj/item/melee/energy/Destroy() + QDEL_NULL(spark_system) STOP_PROCESSING(SSobj, src) return ..() @@ -66,6 +74,10 @@ if(heat) open_flame() + if(COOLDOWN_FINISHED(src, spark_cd)) + spark_system.start() + COOLDOWN_START(src, spark_cd, rand(2 SECONDS, 4 SECONDS)) + /obj/item/melee/energy/ignition_effect(atom/atom, mob/user) if(!heat && !blade_active) return "" @@ -76,7 +88,7 @@ if(carbon_user.wear_mask) in_mouth = ", barely missing [carbon_user.p_their()] nose" . = span_warning("[user] swings [user.p_their()] [name][in_mouth]. [user.p_they(TRUE)] light[user.p_s()] [user.p_their()] [atom.name] in the process.") - playsound(loc, hitsound, get_clamped_volume(), TRUE, -1) + playsound(loc, get_hitsound(), get_clamped_volume(), TRUE, -1) add_fingerprint(user) /* @@ -100,13 +112,14 @@ updateEmbedding() heat = active_heat START_PROCESSING(SSobj, src) + spark_system.start() + COOLDOWN_START(src, spark_cd, rand(2 SECONDS, 4 SECONDS)) else if(embedding) disableEmbedding() heat = initial(heat) STOP_PROCESSING(SSobj, src) - balloon_alert(user, "[name] [active ? "enabled":"disabled"]") playsound(user ? user : src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 35, TRUE) set_light_on(active) return COMPONENT_NO_DEFAULT_MESSAGE @@ -122,10 +135,11 @@ attack_verb_continuous = list("attacks", "chops", "cleaves", "tears", "lacerates", "cuts") attack_verb_simple = list("attack", "chop", "cleave", "tear", "lacerate", "cut") force = 40 + throwforce = 25 - throw_speed = 3 throw_range = 5 - armour_penetration = 100 + + armor_penetration = 100 sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_NORMAL flags_1 = CONDUCT_1 @@ -157,14 +171,15 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = SFX_SWING_HIT force = 3 + throwforce = 5 - throw_speed = 3 throw_range = 5 - armour_penetration = 35 + + armor_penetration = 35 block_chance = 50 embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) -/obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/melee/energy/sword/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(blade_active) return ..() return FALSE @@ -208,7 +223,7 @@ active_force = 30 sword_color_icon = null // Stops icon from breaking when turned on. -/obj/item/melee/energy/sword/cyborg/saw/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/melee/energy/sword/cyborg/saw/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) return FALSE // The colored energy swords we all know and love. @@ -279,26 +294,11 @@ attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") force = 30 throwforce = 1 // Throwing or dropping the item deletes it. - throw_speed = 3 throw_range = 1 sharpness = SHARP_EDGED heat = 3500 w_class = WEIGHT_CLASS_BULKY blade_active = TRUE - /// Our linked spark system that emits from our sword. - var/datum/effect_system/spark_spread/spark_system - -//Most of the other special functions are handled in their own files. aka special snowflake code so kewl -/obj/item/melee/energy/blade/Initialize(mapload) - . = ..() - spark_system = new /datum/effect_system/spark_spread() - spark_system.set_up(5, 0, src) - spark_system.attach(src) - START_PROCESSING(SSobj, src) - -/obj/item/melee/energy/blade/Destroy() - QDEL_NULL(spark_system) - return ..() /obj/item/melee/energy/blade/make_transformable() return FALSE diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index cbe2bfab3d8c..cd148bbb1bb4 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -64,7 +64,8 @@ throwforce = 10 w_class = WEIGHT_CLASS_BULKY block_chance = 50 - armour_penetration = 75 + block_sound = 'sound/weapons/block/parry_metal.ogg' + armor_penetration = 75 sharpness = SHARP_EDGED attack_verb_continuous = list("slashes", "cuts") attack_verb_simple = list("slash", "cut") @@ -75,18 +76,20 @@ . = ..() AddComponent(/datum/component/butchering, 30, 95, 5) //fast and effective, but as a sword, it might damage the results. -/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/melee/sabre/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 //Don't bring a sword to a gunfight + return FALSE //Don't bring a sword to a gunfight return ..() /obj/item/melee/sabre/on_exit_storage(datum/storage/container) - var/obj/item/storage/belt/sabre/sabre = container.real_location?.resolve() + . = ..() + var/obj/item/storage/belt/sabre/sabre = container.get_real_location() if(istype(sabre)) playsound(sabre, 'sound/items/unsheath.ogg', 25, TRUE) /obj/item/melee/sabre/on_enter_storage(datum/storage/container) - var/obj/item/storage/belt/sabre/sabre = container.real_location?.resolve() + . = ..() + var/obj/item/storage/belt/sabre/sabre = container.get_real_location() if(istype(sabre)) playsound(sabre, 'sound/items/sheath.ogg', 25, TRUE) @@ -123,7 +126,7 @@ /obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting) if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user)) - playsound(user, hitsound, 25, TRUE) + playsound(user, get_hitsound(), 25, TRUE) affecting.dismember(BRUTE) user.adjustBruteLoss(20) @@ -148,7 +151,7 @@ sharpness = SHARP_EDGED throwforce = 10 block_chance = 20 - armour_penetration = 65 + armor_penetration = 65 attack_verb_continuous = list("slashes", "stings", "prickles", "pokes") attack_verb_simple = list("slash", "sting", "prickle", "poke") hitsound = 'sound/weapons/rapierhit.ogg' @@ -164,7 +167,7 @@ /obj/item/melee/beesword/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] is stabbing [user.p_them()]self in the throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(get_turf(src), hitsound, 75, TRUE, -1) + playsound(get_turf(src), get_hitsound(), 75, TRUE, -1) return TOXLOSS @@ -179,11 +182,15 @@ slot_flags = null w_class = WEIGHT_CLASS_BULKY force = 0.001 - armour_penetration = 1000 + armor_penetration = 1000 force_string = "INFINITE" var/obj/machinery/power/supermatter/shard var/balanced = 1 +/obj/item/melee/supermatter_sword/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/melee/supermatter_sword/Initialize(mapload) . = ..() shard = new /obj/machinery/power/supermatter/shard(src) @@ -243,13 +250,13 @@ /obj/item/melee/supermatter_sword/suicide_act(mob/user) user.visible_message(span_suicide("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!")) user.dropItemToGround(src, TRUE) - shard.Bumped(user) + shard.BumpedBy(user) /obj/item/melee/supermatter_sword/proc/consume_everything(target) if(isnull(target)) shard.Consume() else if(!isturf(target)) - shard.Bumped(target) + shard.BumpedBy(target) else consume_turf(target) @@ -431,6 +438,6 @@ w_class = WEIGHT_CLASS_BULKY throwforce = 8 block_chance = 10 - armour_penetration = 50 + armor_penetration = 50 attack_verb_continuous = list("smacks", "strikes", "cracks", "beats") attack_verb_simple = list("smack", "strike", "crack", "beat") diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index e948a92d7a56..df5387c2850b 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 - throw_speed = 3 + throw_speed = 1.5 throw_range = 7 w_class = WEIGHT_CLASS_NORMAL attack_verb_continuous = list("mops", "bashes", "bludgeons", "whacks") @@ -44,7 +44,7 @@ var/val2remove = 1 if(cleaner?.mind) val2remove = round(cleaner.mind.get_skill_modifier(/datum/skill/cleaning, SKILL_SPEED_MODIFIER),0.1) - reagents.remove_any(val2remove) //reaction() doesn't use up the reagents + reagents.remove_all(val2remove) //reaction() doesn't use up the reagents /obj/item/mop/afterattack(atom/A, mob/user, proximity) diff --git a/code/game/objects/items/nitrium_crystals.dm b/code/game/objects/items/nitrium_crystals.dm deleted file mode 100644 index b81a96bca18e..000000000000 --- a/code/game/objects/items/nitrium_crystals.dm +++ /dev/null @@ -1,18 +0,0 @@ -/obj/item/nitrium_crystal - desc = "A weird brown crystal, it smokes when broken" - name = "nitrium crystal" - icon = 'icons/obj/atmos.dmi' - icon_state = "nitrium_crystal" - var/cloud_size = 1 - -/obj/item/nitrium_crystal/attack_self(mob/user) - . = ..() - var/datum/effect_system/smoke_spread/chem/smoke = new - var/turf/location = get_turf(src) - create_reagents(5) - reagents.add_reagent(/datum/reagent/nitrium_low_metabolization, 3) - reagents.add_reagent(/datum/reagent/nitrium_high_metabolization, 2) - smoke.attach(location) - smoke.set_up(reagents, cloud_size, location, silent = TRUE) - smoke.start() - qdel(src) diff --git a/code/game/objects/items/offhand.dm b/code/game/objects/items/offhand.dm new file mode 100644 index 000000000000..4c65a3ed43da --- /dev/null +++ b/code/game/objects/items/offhand.dm @@ -0,0 +1,45 @@ +/** + * The offhand dummy item for two handed items + * + */ +/obj/item/offhand + name = "offhand" + icon_state = "offhand" + w_class = WEIGHT_CLASS_HUGE + item_flags = ABSTRACT | DROPDEL + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + + /// A weakref to the wielded item. + var/datum/weakref/parent + +/obj/item/offhand/Initialize(mapload, obj/item/parent_item) + . = ..() + if(!parent_item) + return INITIALIZE_HINT_QDEL + + var/mob/living/wielder = loc + RegisterSignal(wielder, COMSIG_MOB_SWAP_HANDS, PROC_REF(try_swap_hands)) + + parent = WEAKREF(parent_item) + name = "[parent_item.name] - offhand" + desc = "Your second grip on [parent_item]." + + RegisterSignal(parent_item, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_UNWIELD), PROC_REF(deleteme)) + +/obj/item/offhand/dropped(mob/user, silent = FALSE) + . = ..() + var/obj/item/I = parent.resolve() + if(QDELETED(I) || !I.wielded) + return + + I.unwield(user) + +/obj/item/offhand/proc/deleteme(datum/source, mob/user) + SIGNAL_HANDLER + if(!QDELETED(src)) + qdel(src) + +/obj/item/offhand/proc/try_swap_hands(datum/source, obj/item/held_item) + SIGNAL_HANDLER + + return COMPONENT_BLOCK_SWAP diff --git a/code/game/objects/items/paint.dm b/code/game/objects/items/paint.dm index da69f807f9dc..b3c6af324bcf 100644 --- a/code/game/objects/items/paint.dm +++ b/code/game/objects/items/paint.dm @@ -1,165 +1,109 @@ //NEVER USE THIS IT SUX -PETETHEGOAT //IT SUCKS A BIT LESS -GIACOM +//IT SUCKED SO MUCH WE CHANGED IT ENTIRELY -/obj/item/paint - gender= PLURAL - name = "paint" - desc = "Used to recolor floors and walls. Can be removed by the janitor." +/obj/item/paint_sprayer + name = "paint sprayer" + desc = "A slender and none-too-sophisticated device capable of applying paint onto walls and various other things. Applied paint can be removed by the Janitor." icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "paint_neutral" - inhand_icon_state = "paintcan" + icon_state = "paint_sprayer" + inhand_icon_state = "paint_sprayer" + worn_icon_state = "painter" + custom_materials = list(/datum/material/iron=50, /datum/material/glass=50) + item_flags = NOBLUDGEON w_class = WEIGHT_CLASS_NORMAL - resistance_flags = FLAMMABLE - max_integrity = 100 + flags_1 = CONDUCT_1 + slot_flags = ITEM_SLOT_BELT /// With what color will we paint with - var/paint_color = COLOR_WHITE - /// How many uses are left - var/paintleft = 10 - -/obj/item/paint/examine(mob/user) + var/wall_color = COLOR_WHITE + var/stripe_color = COLOR_WHITE + + var/preset_wall_colors= list( + "Daedalus Industries" = list("wall" = PAINT_WALL_DAEDALUS, "trim" = PAINT_STRIPE_DAEDALUS), + "Priapus Recreational Solutions" = list("wall" = PAINT_WALL_PRIAPUS, "trim" = PAINT_STRIPE_PRIAPUS), + "Mars People's Coalition" = list("wall" = PAINT_WALL_MARS, "trim" = PAINT_STRIPE_MARSEXECUTIVE), + "Command" = list("wall" = PAINT_WALL_COMMAND, "trim" = PAINT_STRIPE_COMMAND), + "Medical" = list("wall" = PAINT_WALL_MEDICAL, "trim" = PAINT_STRIPE_MEDICAL), + ) + +/obj/item/paint_sprayer/examine(mob/user) . = ..() - . += span_notice("Paint wall stripes by right clicking a walls.") - -/obj/item/paint/red - name = "red paint" - paint_color = COLOR_RED - icon_state = "paint_red" - -/obj/item/paint/green - name = "green paint" - paint_color = COLOR_VIBRANT_LIME - icon_state = "paint_green" - -/obj/item/paint/blue - name = "blue paint" - paint_color = COLOR_BLUE - icon_state = "paint_blue" - -/obj/item/paint/yellow - name = "yellow paint" - paint_color = COLOR_YELLOW - icon_state = "paint_yellow" - -/obj/item/paint/violet - name = "violet paint" - paint_color = COLOR_MAGENTA - icon_state = "paint_violet" -/obj/item/paint/black - name = "black paint" - paint_color = COLOR_ALMOST_BLACK - icon_state = "paint_black" + . += span_notice("It is configured to paint walls using [wall_color] paint and trims using [stripe_color] paint.") + . += span_notice("Paint wall stripes by right clicking a wall.") -/obj/item/paint/white - name = "white paint" - paint_color = COLOR_WHITE - icon_state = "paint_white" - -/obj/item/paint/anycolor - gender = PLURAL - name = "adaptive paint" - icon_state = "paint_neutral" - -/obj/item/paint/anycolor/examine(mob/user) +/obj/item/paint_sprayer/update_overlays() . = ..() - . += span_notice("Choose a basic color by using the paint.") - . += span_notice("Choose any color by alt-clicking the paint.") - -/obj/item/paint/anycolor/AltClick(mob/living/user) - var/new_paint_color = input(user, "Choose new paint color", "Paint Color", paint_color) as color|null - if(new_paint_color) - paint_color = new_paint_color - icon_state = "paint_neutral" - -/obj/item/paint/anycolor/attack_self(mob/user) - var/list/possible_colors = list( - "black" = image(icon = src.icon, icon_state = "paint_black"), - "blue" = image(icon = src.icon, icon_state = "paint_blue"), - "green" = image(icon = src.icon, icon_state = "paint_green"), - "red" = image(icon = src.icon, icon_state = "paint_red"), - "violet" = image(icon = src.icon, icon_state = "paint_violet"), - "white" = image(icon = src.icon, icon_state = "paint_white"), - "yellow" = image(icon = src.icon, icon_state = "paint_yellow") - ) - var/picked_color = show_radial_menu(user, src, possible_colors, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 38, require_near = TRUE) - switch(picked_color) - if("black") - paint_color = COLOR_ALMOST_BLACK - if("blue") - paint_color = COLOR_BLUE - if("green") - paint_color = COLOR_VIBRANT_LIME - if("red") - paint_color = COLOR_RED - if("violet") - paint_color = COLOR_MAGENTA - if("white") - paint_color = COLOR_WHITE - if("yellow") - paint_color = COLOR_YELLOW - else - return - icon_state = "paint_[picked_color]" - add_fingerprint(user) - -/** - * Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/item/paint/anycolor/proc/check_menu(mob/user) - if(!istype(user)) - return FALSE - if(!user.is_holding(src)) - return FALSE - if(user.incapacitated()) - return FALSE + var/mutable_appearance/color_overlay = mutable_appearance(icon, "paint_sprayer_color") + color_overlay.color = wall_color + . += color_overlay + +/obj/item/paint_sprayer/attack_self(mob/living/user) + var/static/list/options_list = list("Select wall color", "Select stripe color", "Color presets") + var/option = input(user, null, "Configure Device", null) as null|anything in options_list + switch(option) + if("Select wall color") + var/new_wall_color = input(user, "Choose new wall paint color", "Paint Color", wall_color) as color|null + if(new_wall_color) + wall_color = new_wall_color + if("Select stripe color") + var/new_stripe_color = input(user, "Choose new wall stripe color", "Paint Color", stripe_color) as color|null + if(new_stripe_color) + stripe_color = new_stripe_color + if("Color presets") + var/chosen = input(user, null, "Select a preset", null) as null|anything in preset_wall_colors + if(!chosen) + return + chosen = preset_wall_colors[chosen] + wall_color = chosen["wall"] + stripe_color = chosen["trim"] + playsound(src, 'sound/machines/click.ogg', 50, TRUE) + update_appearance() return TRUE -/obj/item/paint/afterattack(atom/target, mob/user, proximity, params) +/obj/item/paint_sprayer/afterattack(atom/target, mob/user, proximity, params) . = ..() if(.) return if(!proximity) return var/list/modifiers = params2list(params) - if(paintleft <= 0) - icon_state = "paint_empty" - return if(istype(target, /obj/structure/low_wall)) var/obj/structure/low_wall/target_low_wall = target if(LAZYACCESS(modifiers, RIGHT_CLICK)) - target_low_wall.set_stripe_paint(paint_color) + target_low_wall.paint_stripe(stripe_color) else - target_low_wall.set_wall_paint(paint_color) + target_low_wall.paint_wall(wall_color) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("[user] paints \the [target_low_wall]."), \ span_notice("You paint \the [target_low_wall].")) + playsound(src, SFX_PAINT, 50, TRUE) return TRUE if(iswall(target)) var/turf/closed/wall/target_wall = target if(LAZYACCESS(modifiers, RIGHT_CLICK)) - target_wall.paint_stripe(paint_color) + target_wall.paint_stripe(stripe_color) else - target_wall.paint_wall(paint_color) + target_wall.paint_wall(wall_color) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("[user] paints \the [target_wall]."), \ span_notice("You paint \the [target_wall].")) + playsound(src, SFX_PAINT, 50, TRUE) return TRUE if(isfalsewall(target)) var/obj/structure/falsewall/target_falsewall = target if(LAZYACCESS(modifiers, RIGHT_CLICK)) - target_falsewall.paint_stripe(paint_color) + target_falsewall.paint_stripe(stripe_color) else - target_falsewall.paint_wall(paint_color) + target_falsewall.paint_wall(wall_color) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("[user] paints \the [target_falsewall]."), \ span_notice("You paint \the [target_falsewall].")) + playsound(src, SFX_PAINT, 50, TRUE) return TRUE if(!isturf(target) || isspaceturf(target)) return TRUE - target.add_atom_colour(paint_color, WASHABLE_COLOUR_PRIORITY) + target.add_atom_colour(wall_color, WASHABLE_COLOUR_PRIORITY) /obj/item/paint_remover gender = PLURAL @@ -189,12 +133,12 @@ if(!target_low_wall.stripe_paint) to_chat(user, span_warning("There is no paint to strip!")) return TRUE - target_low_wall.set_stripe_paint(null) + target_low_wall.paint_stripe(null) else if(!target_low_wall.wall_paint) to_chat(user, span_warning("There is no paint to strip!")) return TRUE - target_low_wall.set_wall_paint(null) + target_low_wall.paint_wall(null) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("[user] strips the paint from \the [target_low_wall]."), \ span_notice("You strip the paint from \the [target_low_wall].")) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index 9bff493cf3d2..a22b1d73eeae 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -15,7 +15,6 @@ attack_verb_continuous = list("bashes", "carries") attack_verb_simple = list("bash", "carry") w_class = WEIGHT_CLASS_BULKY - throw_speed = 2 throw_range = 3 custom_materials = list(/datum/material/iron = 7500, /datum/material/glass = 100) var/open = TRUE @@ -32,6 +31,7 @@ return ..() /obj/item/pet_carrier/Exited(atom/movable/gone, direction) + . = ..() if(isliving(gone) && (gone in occupants)) var/mob/living/L = gone occupants -= gone @@ -72,7 +72,7 @@ update_appearance() /obj/item/pet_carrier/AltClick(mob/living/user) - if(open || !user.canUseTopic(src, BE_CLOSE)) + if(open || !user.canUseTopic(src, USE_CLOSE|USE_NEED_HANDS)) return locked = !locked to_chat(user, span_notice("You flip the lock switch [locked ? "down" : "up"].")) @@ -88,19 +88,18 @@ if(!open) to_chat(user, span_warning("You need to open [src]'s door!")) return + if(target.mob_size > max_occupant_weight) if(ishuman(target)) - var/mob/living/carbon/human/H = target - if(isfelinid(H)) - to_chat(user, span_warning("You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")) - else - to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) + to_chat(user, span_warning("Humans, generally, do not fit into pet carriers.")) else to_chat(user, span_warning("You get the feeling [target] isn't meant for a [name].")) return + if(user == target) to_chat(user, span_warning("Why would you ever do that?")) return + load_occupant(user, target) /obj/item/pet_carrier/relaymove(mob/living/user, direction) @@ -157,7 +156,7 @@ /obj/item/pet_carrier/MouseDrop(atom/over_atom) . = ..() - if(isopenturf(over_atom) && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(usr)) && usr.Adjacent(over_atom) && open && occupants.len) + if(isopenturf(over_atom) && usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY) && usr.Adjacent(over_atom) && open && occupants.len) usr.visible_message(span_notice("[usr] unloads [src]."), \ span_notice("You unload [src] onto [over_atom].")) for(var/V in occupants) diff --git a/code/game/objects/items/pinpointer.dm b/code/game/objects/items/pinpointer.dm index 7e394b1c04b4..f3fd33e86ec3 100644 --- a/code/game/objects/items/pinpointer.dm +++ b/code/game/objects/items/pinpointer.dm @@ -11,7 +11,6 @@ worn_icon_state = "pinpointer" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron = 500, /datum/material/glass = 250) var/active = FALSE @@ -73,7 +72,7 @@ ///Called by update_icon after sanity. There is a target /obj/item/pinpointer/proc/get_direction_icon(here, there) - if(get_dist_euclidian(here,there) <= minimum_range) + if(get_dist_euclidean(here,there) <= minimum_range) return "pinon[alert ? "alert" : ""]direct[icon_suffix]" else setDir(get_dir(here, there)) @@ -90,7 +89,7 @@ desc = "A handheld tracking device that points to crew suit sensors." icon_state = "pinpointer_crew" worn_icon_state = "pinpointer_crew" - custom_price = PAYCHECK_MEDIUM * 4 + custom_price = PAYCHECK_ASSISTANT * 10 custom_premium_price = PAYCHECK_MEDIUM * 6 var/has_owner = FALSE var/pinpointer_owner = null @@ -129,13 +128,13 @@ var/crewmember_name = "Unknown" if(H.wear_id) - var/obj/item/card/id/I = H.wear_id.GetID() + var/obj/item/card/id/I = H.wear_id.GetID(TRUE) if(I?.registered_name) crewmember_name = I.registered_name while(crewmember_name in name_counts) name_counts[crewmember_name]++ - crewmember_name = text("[] ([])", crewmember_name, name_counts[crewmember_name]) + crewmember_name = "[crewmember_name] ([name_counts[crewmember_name]])" names[crewmember_name] = H name_counts[crewmember_name] = 1 @@ -167,7 +166,7 @@ desc = "A handheld tracking device that displays its proximity to crew suit sensors." icon_state = "pinpointer_crewprox" worn_icon_state = "pinpointer_prox" - custom_price = PAYCHECK_MEDIUM * 3 + custom_price = PAYCHECK_ASSISTANT * 4 /obj/item/pinpointer/crew/prox/get_direction_icon(here, there) var/size = "" diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index a2c6d70331f4..78908c83a7d4 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -9,23 +9,25 @@ base_icon_state = "pitchfork" lefthand_file = 'icons/mob/inhands/weapons/polearms_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/polearms_righthand.dmi' + icon_state_wielded = "pitchfork1" + name = "pitchfork" desc = "A simple tool used for moving hay." + force = 7 + force_wielded = 15 throwforce = 15 + sharpness = SHARP_EDGED + w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("attacks", "impales", "pierces") attack_verb_simple = list("attack", "impale", "pierce") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF -/obj/item/pitchfork/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=7, force_wielded=15, icon_wielded="[base_icon_state]1") - /obj/item/pitchfork/update_icon_state() icon_state = "[base_icon_state]0" return ..() diff --git a/code/game/objects/items/plunger.dm b/code/game/objects/items/plunger.dm new file mode 100644 index 000000000000..c79319c8b568 --- /dev/null +++ b/code/game/objects/items/plunger.dm @@ -0,0 +1,39 @@ +/obj/item/plunger + name = "plunger" + desc = "It's a plunger for plunging." + icon = 'icons/obj/watercloset.dmi' + icon_state = "plunger" + worn_icon_state = "plunger" + + slot_flags = ITEM_SLOT_MASK + flags_inv = HIDESNOUT + + ///time*plunge_mod = total time we take to plunge an object + var/plunge_mod = 1 + ///whether we do heavy duty stuff like geysers + var/reinforced = TRUE + +/obj/item/plunger/attack_obj(obj/O, mob/living/user, params) + if(!O.plunger_act(src, user, reinforced)) + return ..() + +/obj/item/plunger/throw_impact(atom/hit_atom, datum/thrownthing/tt) + . = ..() + if(tt.target_zone != BODY_ZONE_HEAD) + return + if(iscarbon(hit_atom)) + var/mob/living/carbon/H = hit_atom + if(!H.wear_mask) + H.equip_to_slot_if_possible(src, ITEM_SLOT_MASK) + H.visible_message(span_warning("The plunger slams into [H]'s face!"), span_warning("The plunger suctions to your face!")) + +///A faster reinforced plunger +/obj/item/plunger/reinforced + name = "reinforced plunger" + desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging." + icon_state = "reinforced_plunger" + worn_icon_state = "reinforced_plunger" + reinforced = TRUE + plunge_mod = 0.5 + + custom_premium_price = PAYCHECK_MEDIUM * 8 diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index b53016114834..bdd09f19d5ec 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -24,7 +24,7 @@ var/heartbroken = FALSE var/vowbroken = FALSE var/young = FALSE -///Prevents players from cutting stuffing out of a plushie if true + ///Prevents players from cutting stuffing out of a plushie if true var/divine = FALSE var/mood_message var/list/love_message @@ -218,7 +218,6 @@ else if(Kisser.partner == src && !plush_child) //the one advancing does not take ownership of the child and we have a one child policy in the toyshop user.visible_message(span_notice("[user] is going to break [Kisser] and [src] by bashing them like that."), span_notice("[Kisser] passionately embraces [src] in your hands. Look away you perv!")) - user.client.give_award(/datum/award/achievement/misc/rule8, user) if(plop(Kisser)) user.visible_message(span_notice("Something drops at the feet of [user]."), span_notice("The miracle of oh god did that just come out of [src]?!")) @@ -498,7 +497,7 @@ /obj/item/toy/plush/lizard_plushie name = "lizard plushie" - desc = "An adorable stuffed toy that resembles a unathi." + desc = "An adorable stuffed toy that resembles a Jinan." icon_state = "map_plushie_lizard" greyscale_config = /datum/greyscale_config/plush_lizard attack_verb_continuous = list("claws", "hisses", "tail slaps") @@ -510,10 +509,10 @@ if(!greyscale_colors) // Generate a random valid lizard color for our plushie friend var/generated_lizard_color = "#" + random_color() - var/temp_hsv = RGBtoHSV(generated_lizard_color) + var/list/temp_hsv = rgb2hsv(generated_lizard_color) // If our color is too dark, use the classic green lizard plush color - if(ReadHSV(temp_hsv)[3] < ReadHSV("#7F7F7F")[3]) + if(temp_hsv[3] < 50) generated_lizard_color = "#66ff33" // Set our greyscale colors to the lizard color we made + black eyes @@ -521,12 +520,12 @@ // Preset lizard plushie that uses the original lizard plush green. (Or close to it) /obj/item/toy/plush/lizard_plushie/green - desc = "An adorable stuffed toy that resembles a green unathi. This one fills you with nostalgia and soul." + desc = "An adorable stuffed toy that resembles a green Jinan. This one fills you with nostalgia and soul." greyscale_colors = "#66ff33#000000" /obj/item/toy/plush/space_lizard_plushie name = "space lizard plushie" - desc = "An adorable stuffed toy that resembles a very determined spacefaring unathi. To infinity and beyond, little guy." + desc = "An adorable stuffed toy that resembles a very determined spacefaring Jinan. To infinity and beyond, little guy." icon_state = "plushie_spacelizard" inhand_icon_state = "plushie_spacelizard" // space lizards can't hit people with their tail, it's stuck in their suit @@ -577,7 +576,7 @@ icon_state = "plushie_awake" inhand_icon_state = "plushie_awake" -/obj/item/toy/plush/awakenedplushie/ComponentInitialize() +/obj/item/toy/plush/awakenedplushie/Initialize(mapload) . = ..() AddComponent(/datum/component/edit_complainer) @@ -595,7 +594,7 @@ name = "strange goat plushie" icon_state = "goat" desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same. Goats never change." - squeak_override = list('sound/weapons/punch1.ogg'=1) + squeak_override = list(SFX_PUNCH=1) /// Whether or not this goat is currently taking in a monsterous doink var/going_hard = FALSE /// Whether or not this goat has been flattened like a funny pancake diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 6754d8c78b74..de61a2f3e5af 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -14,7 +14,7 @@ inhand_icon_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, FIRE = 60, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50) 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 diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 8f613990c14a..3085ee223e99 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, FIRE = 100, ACID = 40) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 40) resistance_flags = FIRE_PROOF var/click_delay = 1.5 var/fisto_setting = 1 @@ -88,7 +88,7 @@ if(!gasused) to_chat(user, span_warning("\The [src]'s tank is empty!")) target.apply_damage((force / 5), BRUTE) - playsound(loc, 'sound/weapons/punch1.ogg', 50, TRUE) + playsound(loc, SFX_PUNCH, 50, TRUE) target.visible_message(span_danger("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!"), \ span_userdanger("[user]'s punches you!")) return diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 6911a9c946ef..07a298e64339 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -40,7 +40,7 @@ explosion_block = 3 heat_proof = TRUE max_integrity = 600 - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF damage_deflection = 70 /// Make sure that the puzzle has the same puzzle_id as the keycard door! @@ -49,7 +49,7 @@ var/open_message = "The door beeps, and slides opens." //Standard Expressions to make keycard doors basically un-cheeseable -/obj/machinery/door/puzzle/Bumped(atom/movable/AM) +/obj/machinery/door/puzzle/BumpedBy(atom/movable/AM) return !density && ..() /obj/machinery/door/puzzle/emp_act(severity) @@ -58,8 +58,11 @@ /obj/machinery/door/puzzle/ex_act(severity, target) return FALSE -/obj/machinery/door/puzzle/try_to_activate_door(mob/user, access_bypass = FALSE) - add_fingerprint(user) +/obj/machinery/door/puzzle/try_to_activate_door(mob/user, access_bypass = FALSE, obj/item/attackedby) + if(attackedby) + attackedby.leave_evidence(user, src) + else + add_fingerprint(user) if(operating) return @@ -173,7 +176,7 @@ icon_state = "light_puzzle" anchored = TRUE explosion_block = 3 - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE light_power = 3 diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index cc60b9403483..4682d0f76dd3 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -219,7 +219,7 @@ /obj/item/banner/command/Initialize(mapload) . = ..() - job_loyalties = DEPARTMENT_BITFLAG_COMMAND + job_loyalties = DEPARTMENT_BITFLAG_MANAGEMENT /obj/item/banner/command/mundane inspiration_available = FALSE @@ -275,7 +275,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 = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) /obj/item/clothing/suit/armor/plate/crusader/red icon_state = "crusader-red" @@ -289,7 +289,7 @@ icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) /obj/item/clothing/head/helmet/plate/crusader/blue icon_state = "crusader-blue" @@ -303,7 +303,7 @@ desc = "A religious-looking hat." icon_state = null flags_1 = 0 - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 70, BIO = 50, FIRE = 60, ACID = 60) //religion protects you from disease, honk. + armor = list(BLUNT = 60, PUNCTURE = 60, SLASH = 0, LASER = 60, ENERGY = 60, BOMB = 70, BIO = 50, FIRE = 60, ACID = 60) //religion protects you from disease, honk. worn_y_offset = 6 /obj/item/clothing/head/helmet/plate/crusader/prophet/red @@ -362,7 +362,7 @@ desc = "Metal boots, they look heavy." icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) //does this even do anything on boots? + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 60, BIO = 0, FIRE = 60, ACID = 60) //does this even do anything on boots? clothing_traits = list(TRAIT_NO_SLIP_WATER) cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT @@ -399,10 +399,10 @@ /obj/item/claymore/weak desc = "This one is rusted." force = 30 - armour_penetration = 15 + armor_penetration = 15 /obj/item/claymore/weak/ceremonial desc = "A rusted claymore, once at the heart of a powerful scottish clan struck down and oppressed by tyrants, it has been passed down the ages as a symbol of defiance." force = 15 block_chance = 30 - armour_penetration = 5 + armor_penetration = 5 diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index 296925810322..64af0ae28200 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -211,7 +211,7 @@ ) damage = 10 nodamage = FALSE - embed_falloff_tile = 0 + embed_adjustment_tile = -3 //It's a goddamn lollipop /obj/projectile/bullet/reusable/lollipop/Initialize(mapload) var/obj/item/food/lollipop/lollipop = new ammo_type(src) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 89b6fad2d4f2..fef703b5e827 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -310,7 +310,7 @@ forceMove(O) O.robot_suit = src - log_game("[key_name(user)] has put the MMI/posibrain of [key_name(M.brainmob)] into a cyborg shell at [AREACOORD(src)]") + log_game("[key_name(user)] has put the organ/posibrain of [key_name(M.brainmob)] into a cyborg shell at [AREACOORD(src)]") if(!locomotion) O.set_lockcharge(TRUE) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 1966ef321629..45612b98bbae 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -416,9 +416,9 @@ name = "medical cyborg expanded hypospray" desc = "An upgrade to the Medical model's hypospray, allowing it \ to treat a wider range of conditions and problems." - additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate, - /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, - /datum/reagent/medicine/rezadone, /datum/reagent/medicine/pen_acid) + additional_reagents = list(/datum/reagent/medicine/alkysine, /datum/reagent/medicine/imidazoline, /datum/reagent/medicine/inacusiate, + /datum/reagent/medicine/ryetalyn, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/dermaline, /datum/reagent/medicine/meralyne, + /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/ipecac) /obj/item/borg/upgrade/piercing_hypospray name = "cyborg piercing hypospray" @@ -498,29 +498,6 @@ if(.) defib_instance?.forceMove(R.drop_location()) // [on_defib_instance_qdel_or_moved()] handles the rest. -/obj/item/borg/upgrade/processor - name = "medical cyborg surgical processor" - desc = "An upgrade to the Medical model, installing a processor \ - capable of scanning surgery disks and carrying \ - out procedures" - icon_state = "cyborg_upgrade3" - require_model = TRUE - model_type = list(/obj/item/robot_model/medical, /obj/item/robot_model/syndicate_medical) - model_flags = BORG_MODEL_MEDICAL - -/obj/item/borg/upgrade/processor/action(mob/living/silicon/robot/R, user = usr) - . = ..() - if(.) - var/obj/item/surgical_processor/SP = new(R.model) - R.model.basic_modules += SP - R.model.add_module(SP, FALSE, TRUE) - -/obj/item/borg/upgrade/processor/deactivate(mob/living/silicon/robot/R, user = usr) - . = ..() - if (.) - var/obj/item/surgical_processor/SP = locate() in R.model - R.model.remove_module(SP, TRUE) - /obj/item/borg/upgrade/ai name = "B.O.R.I.S. module" desc = "Bluespace Optimized Remote Intelligence Synchronization. An uplink device which takes the place of an MMI in cyborg endoskeletons, creating a robotic shell controlled by an AI." @@ -562,8 +539,8 @@ var/prev_lockcharge = R.lockcharge R.SetLockdown(TRUE) R.set_anchored(TRUE) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(1, R.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, location = R.loc) smoke.start() sleep(2) for(var/i in 1 to 4) diff --git a/code/game/objects/items/scrolls.dm b/code/game/objects/items/scrolls.dm index ec0e10620943..91eb2ba3590f 100644 --- a/code/game/objects/items/scrolls.dm +++ b/code/game/objects/items/scrolls.dm @@ -6,7 +6,6 @@ worn_icon_state = "scroll" w_class = WEIGHT_CLASS_SMALL inhand_icon_state = "paper" - throw_speed = 3 throw_range = 7 resistance_flags = FLAMMABLE actions_types = list(/datum/action/cooldown/spell/teleport/area_teleport/wizard/scroll) diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index da10b2cb4617..330d4e0ce9ec 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -2,7 +2,8 @@ name = "shield" icon = 'icons/obj/shields.dmi' block_chance = 50 - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 70) + block_sound = 'sound/weapons/block/block_shield.ogg' + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 70) var/transparent = FALSE // makes beam projectiles pass through the shield /obj/item/shield/proc/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) @@ -17,7 +18,6 @@ slot_flags = ITEM_SLOT_BACK force = 10 throwforce = 5 - throw_speed = 2 throw_range = 3 w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/glass=7500, /datum/material/iron=1000) @@ -27,16 +27,22 @@ transparent = TRUE max_integrity = 75 -/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + +/obj/item/shield/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(transparent && (hitby.pass_flags & PASSGLASS)) return FALSE + . = ..() if(attack_type == THROWN_PROJECTILE_ATTACK) - final_block_chance += 30 + . += 30 if(attack_type == LEAP_ATTACK) - final_block_chance = 100 + . += 100 + +/obj/item/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, damage, attack_type, block_success) . = ..() - if(.) - on_shield_block(owner, hitby, attack_text, damage, attack_type) + if(!.) + return + + on_shield_block(owner, hitby, attack_text, damage, attack_type) /obj/item/shield/riot/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/melee/baton)) @@ -94,7 +100,7 @@ /obj/item/shield/riot/roman/fake desc = "Bears an inscription on the inside: \"Romanes venio domus\". It appears to be a bit flimsy." block_chance = 0 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) max_integrity = 30 /obj/item/shield/riot/roman/shatter(mob/living/carbon/human/owner) @@ -139,7 +145,7 @@ . = embedded_flash.attack_self(user) update_appearance() -/obj/item/shield/riot/flash/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/riot/flash/on_shield_block(mob/living/carbon/human/owner, atom/movable/hitby, attack_text, damage, attack_type) . = ..() if (. && !embedded_flash.burnt_out) embedded_flash.activate() @@ -196,7 +202,8 @@ throw_range = 5 force = 3 throwforce = 3 - throw_speed = 3 + block_chance = -INFINITY + block_sound = 'sound/weapons/block/block_energy.ogg' //reflect /// Whether the shield is currently extended and protecting the user. var/enabled = FALSE @@ -219,9 +226,6 @@ clumsy_check = !can_clumsy_use) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) -/obj/item/shield/energy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - return FALSE - /obj/item/shield/energy/IsReflect() return enabled @@ -248,7 +252,6 @@ slot_flags = null force = 3 throwforce = 3 - throw_speed = 3 throw_range = 4 w_class = WEIGHT_CLASS_NORMAL /// Whether the shield is extended and protecting the user.. @@ -266,7 +269,7 @@ attack_verb_simple_on = list("smack", "strike", "crack", "beat")) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) -/obj/item/shield/riot/tele/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/riot/tele/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(extended) return ..() return FALSE diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index b4d5f80ad27b..6dcccdf7d5dd 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -1,7 +1,7 @@ /obj/item/shrapnel // frag grenades name = "shrapnel shard" custom_materials = list(/datum/material/iron=50) - weak_against_armour = TRUE + weak_against_armor = 2 icon = 'icons/obj/shards.dmi' icon_state = "large" w_class = WEIGHT_CLASS_TINY @@ -24,7 +24,7 @@ name = "flying shrapnel shard" damage = 14 range = 20 - weak_against_armour = TRUE + weak_against_armor = 2 dismemberment = 5 ricochets_max = 2 ricochet_chance = 70 @@ -54,7 +54,7 @@ ricochet_auto_aim_angle = 10 ricochet_auto_aim_range = 2 ricochet_incidence_leeway = 0 - embed_falloff_tile = -2 + embed_adjustment_tile = -2 //Yes I'm leaving this one negative, They aren't bullets, they're rubber balls, yadda yadda aerodynamics sue me. shrapnel_type = /obj/item/shrapnel/stingball embedding = list(embed_chance=55, fall_chance=2, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=3, jostle_pain_mult=3, rip_time=15) @@ -75,11 +75,11 @@ ricochets_max = 2 ricochet_chance = 140 shrapnel_type = /obj/item/shrapnel/capmine - embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15) - embed_falloff_tile = 0 + embedding = list(embed_chance=90, fall_chance=0, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15) + embed_adjustment_tile = 0 /obj/item/shrapnel/capmine name = "\improper AP shrapnel shard" custom_materials = list(/datum/material/iron=50) - weak_against_armour = TRUE + weak_against_armor = 2 diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm index b17790b757cf..6d08591e1a44 100644 --- a/code/game/objects/items/signs.dm +++ b/code/game/objects/items/signs.dm @@ -23,7 +23,7 @@ to_chat(user, span_notice("You scribble illegibly on [src]!")) return var/txt = tgui_input_text(user, "What would you like to write on the sign?", "Sign Label", max_length = 30) - if(txt && user.canUseTopic(src, BE_CLOSE)) + if(txt && user.canUseTopic(src, USE_CLOSE)) label = txt name = "[label] sign" desc = "It reads: [label]" diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index af145a7ea8b6..0c98af3d61ca 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -1,47 +1,33 @@ /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 = "singularity_hammer0" base_icon_state = "singularity_hammer" lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' worn_icon_state = "singularity_hammer" + flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK + force = 5 + force_wielded = 20 throwforce = 15 throw_range = 1 + w_class = WEIGHT_CLASS_HUGE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF force_string = "LORD SINGULOTH HIMSELF" ///Is it able to pull shit right now? var/charged = TRUE - ///track wielded status on item - var/wielded = FALSE /obj/item/singularityhammer/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) + icon_state_wielded = "[base_icon_state][1]" AddElement(/datum/element/kneejerk) -/obj/item/singularityhammer/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_multiplier=4, icon_wielded="[base_icon_state]1") - -///triggered on wield of two handed item -/obj/item/singularityhammer/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = TRUE - -///triggered on unwield of two handed item -/obj/item/singularityhammer/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = FALSE - /obj/item/singularityhammer/update_icon_state() icon_state = "[base_icon_state]0" return ..() @@ -89,34 +75,20 @@ worn_icon_state = "mjolnir" lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' + flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK + force = 5 + force_wielded = 25 throwforce = 30 throw_range = 7 + w_class = WEIGHT_CLASS_HUGE - var/wielded = FALSE // track wielded status on item /obj/item/mjollnir/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - -/obj/item/mjollnir/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_multiplier=5, icon_wielded="[base_icon_state]1", attacksound=SFX_SPARKS) - -/// triggered on wield of two handed item -/obj/item/mjollnir/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = TRUE - -/// triggered on unwield of two handed item -/obj/item/mjollnir/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = FALSE + icon_state_wielded = "[base_icon_state][1]" /obj/item/mjollnir/update_icon_state() icon_state = "[base_icon_state]0" diff --git a/code/game/objects/items/skub.dm b/code/game/objects/items/skub.dm index a35f817f54f4..ba1231f15201 100644 --- a/code/game/objects/items/skub.dm +++ b/code/game/objects/items/skub.dm @@ -7,7 +7,7 @@ attack_verb_continuous = list("skubs") attack_verb_simple = list("skub") -/obj/item/skub/ComponentInitialize() +/obj/item/skub/Initialize(mapload) . = ..() AddComponent(/datum/component/container_item/tank_holder, "holder_skub", FALSE) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 3b3c0cabb522..dec6fa5c27dc 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -5,28 +5,34 @@ 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 - throwforce = 20 - throw_speed = 4 + + force = 7 + force_wielded = 14 + throwforce = 15 + throw_speed = 1.5 + embedding = list("impact_pain_mult" = 2, "remove_pain_mult" = 4, "jostle_chance" = 2.5) - armour_penetration = 10 + armor_penetration = 10 + custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "lacerates", "gores") attack_verb_simple = list("attack", "poke", "jab", "tear", "lacerate", "gore") sharpness = SHARP_EDGED // i know the whole point of spears is that they're pointy, but edged is more devastating at the moment so max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) + var/war_cry = "AAAAARGH!!!" var/icon_prefix = "spearglass" -/obj/item/spear/ComponentInitialize() +/obj/item/spear/Initialize(mapload) . = ..() + icon_state_wielded = "[icon_prefix]1" 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, icon_wielded="[icon_prefix]1") update_appearance() /obj/item/spear/update_icon_state() @@ -38,27 +44,32 @@ return BRUTELOSS /obj/item/spear/CheckParts(list/parts_list) - var/obj/item/shard/tip = locate() in parts_list + var/obj/item/shard/tip = locate() in contents if(tip) if (istype(tip, /obj/item/shard/plasma)) - force = 11 + force = 8 + force_wielded = 16 throwforce = 21 icon_prefix = "spearplasma" - AddComponent(/datum/component/two_handed, force_unwielded=11, force_wielded=19, icon_wielded="[icon_prefix]1") + icon_state_wielded = "[icon_prefix]1" + else if (istype(tip, /obj/item/shard/titanium)) - force = 13 + force = 10 + force_wielded = 20 throwforce = 21 throw_range = 8 throw_speed = 5 icon_prefix = "speartitanium" - AddComponent(/datum/component/two_handed, force_unwielded=13, force_wielded=18, icon_wielded="[icon_prefix]1") + icon_state_wielded = "[icon_prefix]1" + else if (istype(tip, /obj/item/shard/plastitanium)) - force = 13 + force = 12 + force_wielded = 24 throwforce = 22 throw_range = 9 throw_speed = 5 icon_prefix = "spearplastitanium" - AddComponent(/datum/component/two_handed, force_unwielded=13, force_wielded=20, icon_wielded="[icon_prefix]1") + icon_state_wielded = "[icon_prefix]1" update_appearance() parts_list -= tip qdel(tip) @@ -69,31 +80,15 @@ icon_state = "spearbomb0" base_icon_state = "spearbomb" icon_prefix = "spearbomb" + + force = 10 + var/obj/item/grenade/explosive = null - var/wielded = FALSE // track wielded status on item /obj/item/spear/explosive/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) set_explosive(new /obj/item/grenade/iedcasing/spawned()) //For admin-spawned explosive lances -/obj/item/spear/explosive/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=18, icon_wielded="[icon_prefix]1") - -/// triggered on wield of two handed item -/obj/item/spear/explosive/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = TRUE - -/// triggered on unwield of two handed item -/obj/item/spear/explosive/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER - - wielded = FALSE - /obj/item/spear/explosive/proc/set_explosive(obj/item/grenade/G) if(explosive) QDEL_NULL(explosive) @@ -105,16 +100,15 @@ 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) + force = lancePart.force + force_wielded = lancePart.force_wielded throwforce = lancePart.throwforce icon_prefix = lancePart.icon_prefix + parts_list -= G parts_list -= lancePart set_explosive(G) + qdel(lancePart) ..() @@ -132,7 +126,7 @@ . += span_notice("Alt-click to set your war cry.") /obj/item/spear/explosive/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE)) ..() if(istype(user) && loc == user) var/input = tgui_input_text(user, "What do you want your war cry to be? You will shout it when you hit someone in melee.", "War Cry", max_length = 50) @@ -162,11 +156,9 @@ 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 Mars security staff." attack_verb_continuous = list("gores") attack_verb_simple = list("gore") - force=15 -/obj/item/spear/grey_tide/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=15, force_wielded=25, icon_wielded="[icon_prefix]1") + force = 15 + force_wielded = 25 /obj/item/spear/grey_tide/afterattack(atom/movable/AM, mob/living/user, proximity) . = ..() @@ -190,15 +182,11 @@ icon_state = "bone_spear0" base_icon_state = "bone_spear0" icon_prefix = "bone_spear" + 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, icon_wielded="[icon_prefix]1") + armor_penetration = 15 //Enhanced armor piercing /* * Bamboo Spear @@ -209,8 +197,8 @@ icon_prefix = "bamboo_spear" name = "bamboo spear" desc = "A haphazardly-constructed bamboo stick with a sharpened tip, ready to poke holes into unsuspecting people." + + force = 8 + force_wielded = 16 throwforce = 22 //Better to throw -/obj/item/spear/bamboospear/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, force_unwielded=10, force_wielded=18, icon_wielded="[icon_prefix]1") diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 8f2b25a79f27..08959601fcd3 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -10,8 +10,6 @@ mats_per_unit = list(/datum/material/bluespace=MINERAL_MATERIAL_AMOUNT) points = 50 refined_type = /obj/item/stack/sheet/bluespace_crystal - grind_results = list(/datum/reagent/bluespace = 20) - scan_state = "rock_BScrystal" merge_type = /obj/item/stack/ore/bluespace_crystal /// The teleport range when crushed/thrown at someone. var/blink_range = 8 @@ -58,7 +56,7 @@ blink_range = 4 // Not as good as the organic stuff! points = 0 //nice try refined_type = null - grind_results = list(/datum/reagent/bluespace = 10, /datum/reagent/silicon = 20) + grind_results = list() merge_type = /obj/item/stack/ore/bluespace_crystal/artificial //Polycrystals, aka stacks @@ -73,7 +71,6 @@ attack_verb_continuous = list("bluespace polybashes", "bluespace polybatters", "bluespace polybludgeons", "bluespace polythrashes", "bluespace polysmashes") attack_verb_simple = list("bluespace polybash", "bluespace polybatter", "bluespace polybludgeon", "bluespace polythrash", "bluespace polysmash") 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 diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 8e2d3c4e0db9..814df9bfa383 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -6,14 +6,16 @@ amount = 1 max_amount = INFINITY throwforce = 0 - throw_speed = 2 + throw_speed = 0.7 throw_range = 2 w_class = WEIGHT_CLASS_TINY full_w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE - var/value = 0 grind_results = list(/datum/reagent/cellulose = 10) + /// How much money one "amount" of this is worth. Use get_item_credit_value(). + VAR_PROTECTED/value = 0 + /obj/item/stack/spacecash/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() update_desc() @@ -34,6 +36,11 @@ . = ..() update_desc() +/// Like use(), but for financial amounts. use_cash(20) on a stack of 10s will use 2. use_cash(22) on a stack of 10s will use 3. +/obj/item/stack/spacecash/proc/use_cash(value_to_pay) + var/amt = ceil(value_to_pay / value) + return use(amt) + /obj/item/stack/spacecash/update_icon_state() . = ..() switch(amount) @@ -64,30 +71,12 @@ value = 20 merge_type = /obj/item/stack/spacecash/c20 -/obj/item/stack/spacecash/c50 - icon_state = "spacecash50" - singular_name = "fifty credit bill" - value = 50 - merge_type = /obj/item/stack/spacecash/c50 - /obj/item/stack/spacecash/c100 icon_state = "spacecash100" singular_name = "one hundred credit bill" value = 100 merge_type = /obj/item/stack/spacecash/c100 -/obj/item/stack/spacecash/c200 - icon_state = "spacecash200" - singular_name = "two hundred credit bill" - value = 200 - merge_type = /obj/item/stack/spacecash/c200 - -/obj/item/stack/spacecash/c500 - icon_state = "spacecash500" - singular_name = "five hundred credit bill" - value = 500 - merge_type = /obj/item/stack/spacecash/c500 - /obj/item/stack/spacecash/c1000 icon_state = "spacecash1000" singular_name = "one thousand credit bill" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1e3173139f14..33f775309142 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -7,7 +7,6 @@ w_class = WEIGHT_CLASS_TINY full_w_class = WEIGHT_CLASS_TINY - throw_speed = 3 throw_range = 7 stamina_damage = 0 stamina_cost = 0 @@ -20,6 +19,9 @@ cost = 250 source = /datum/robot_energy_storage/medical merge_type = /obj/item/stack/medical + + /// A sound to play on use + var/use_sound /// How long it takes to apply it to yourself var/self_delay = 5 SECONDS /// How long it takes to apply it to someone else @@ -30,8 +32,6 @@ var/heal_brute /// How much burn we heal per application var/heal_burn - /// How much we reduce bleeding per application on cut wounds - var/stop_bleeding /// How much sanitization to apply to burn wounds on application var/sanitization /// How much we add to flesh_healing for burn wounds on application @@ -45,18 +45,22 @@ /obj/item/stack/medical/proc/try_heal(mob/living/patient, mob/user, silent = FALSE) if(!patient.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) return + if(patient == user) if(!silent) user.visible_message(span_notice("[user] starts to apply [src] on [user.p_them()]self..."), span_notice("You begin applying [src] on yourself...")) if(!do_after(user, patient, self_delay, DO_PUBLIC, extra_checks=CALLBACK(patient, TYPE_PROC_REF(/mob/living, try_inject), user, null, INJECT_TRY_SHOW_ERROR_MESSAGE), display = src)) - return + else if(other_delay) if(!silent) user.visible_message(span_notice("[user] starts to apply [src] on [patient]."), span_notice("You begin applying [src] on [patient]...")) if(!do_after(user, patient, other_delay, DO_PUBLIC, extra_checks=CALLBACK(patient, TYPE_PROC_REF(/mob/living, try_inject), user, null, INJECT_TRY_SHOW_ERROR_MESSAGE), display = src)) return + if(use_sound) + playsound(loc, use_sound, 50) + if(heal(patient, user)) log_combat(user, patient, "healed", src.name) use(1) @@ -68,24 +72,29 @@ if(patient.stat == DEAD) to_chat(user, span_warning("[patient] is dead! You can not help [patient.p_them()].")) return + if(isanimal(patient) && heal_brute) // only brute can heal var/mob/living/simple_animal/critter = patient if (!critter.healable) to_chat(user, span_warning("You cannot use [src] on [patient]!")) return FALSE + else if (critter.health == critter.maxHealth) to_chat(user, span_notice("[patient] is at full health.")) return FALSE + user.visible_message("[user] applies [src] on [patient].", "You apply [src] on [patient].") patient.heal_bodypart_damage((heal_brute * 0.5)) return TRUE + if(iscarbon(patient)) return heal_carbon(patient, user, heal_brute, heal_burn) + to_chat(user, span_warning("You can't heal [patient] with [src]!")) /// The healing effects on a carbon patient. Since we have extra details for dealing with bodyparts, we get our own fancy proc. Still returns TRUE on success and FALSE on fail /obj/item/stack/medical/proc/heal_carbon(mob/living/carbon/C, mob/user, brute, burn) - var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = C.get_bodypart(deprecise_zone(user.zone_selected), TRUE) if(!affecting) //Missing limb? to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!")) return FALSE @@ -98,8 +107,7 @@ span_infoplain(span_green("You apply [src] on [C]'s [parse_zone(affecting.body_zone)].")) ) var/previous_damage = affecting.get_damage() - if(affecting.heal_damage(brute, burn)) - C.update_damage_overlays() + affecting.heal_damage(brute, burn) post_heal_effects(max(previous_damage - affecting.get_damage(), 0), C, user) return TRUE to_chat(user, span_warning("[C]'s [parse_zone(affecting.body_zone)] can not be healed with [src]!")) @@ -116,71 +124,39 @@ icon_state = "brutepack" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - heal_brute = 40 + heal_brute = 15 self_delay = 4 SECONDS other_delay = 2 SECONDS - grind_results = list(/datum/reagent/medicine/c2/libital = 10) + grind_results = list(/datum/reagent/medicine/bicaridine = 10) merge_type = /obj/item/stack/medical/bruise_pack /obj/item/stack/medical/bruise_pack/suicide_act(mob/user) user.visible_message(span_suicide("[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return (BRUTELOSS) -/obj/item/stack/medical/gauze +/obj/item/stack/gauze name = "medical gauze" desc = "A roll of elastic cloth, perfect for stabilizing all kinds of wounds, from cuts and burns, to broken bones. " gender = PLURAL singular_name = "medical gauze" icon_state = "gauze" - self_delay = 5 SECONDS - other_delay = 2 SECONDS + icon = 'icons/obj/stack_medical.dmi' + lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' max_amount = 12 amount = 6 grind_results = list(/datum/reagent/cellulose = 2) - custom_price = PAYCHECK_ASSISTANT * 2 - absorption_rate = 0.125 - absorption_capacity = 5 - splint_factor = 0.7 - burn_cleanliness_bonus = 0.35 - merge_type = /obj/item/stack/medical/gauze - -// gauze is only relevant for wounds, which are handled in the wounds themselves -/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent) - var/obj/item/bodypart/limb = M.get_bodypart(check_zone(user.zone_selected)) - if(!limb) - to_chat(user, span_notice("There's nothing there to bandage!")) - return - if(!LAZYLEN(limb.wounds)) - to_chat(user, span_notice("There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.plaintext_zone]!")) // good problem to have imo - return - - var/gauzeable_wound = FALSE - - for(var/datum/wound/W in limb.wounds) - if(W.bleeding()) - gauzeable_wound = TRUE - break - - - if(!gauzeable_wound) - to_chat(user, span_notice("There's no wounds that require bandaging on [user==M ? "your" : "[M]'s"] [limb.plaintext_zone]!")) // good problem to have imo - return - - if(limb.current_gauze && (limb.current_gauze.absorption_capacity * 0.8 > absorption_capacity)) // ignore if our new wrap is < 20% better than the current one, so someone doesn't bandage it 5 times in a row - to_chat(user, span_warning("The bandage currently on [user==M ? "your" : "[M]'s"] [limb.plaintext_zone] is still in good condition!")) - return - - user.visible_message(span_warning("[user] begins wrapping the wounds on [M]'s [limb.plaintext_zone] with [src]..."), span_warning("You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.plaintext_zone] with [src]...")) - if(!do_after(user, M, (user == M ? self_delay : other_delay), DO_PUBLIC, display = src)) - return + custom_price = PAYCHECK_ASSISTANT * 0.5 + absorption_capacity = 50 + absorption_rate_modifier = 0.5 - user.visible_message("[user] applies [src] to [M]'s [limb.plaintext_zone].", "You bandage the wounds on [user == M ? "your" : "[M]'s"] [limb.plaintext_zone].") - limb.apply_gauze(src) + burn_cleanliness_bonus = 0.35 + merge_type = /obj/item/stack/gauze -/obj/item/stack/medical/gauze/twelve +/obj/item/stack/gauze/twelve amount = 12 -/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, params) +/obj/item/stack/gauze/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WIRECUTTER || (I.sharpness & SHARP_EDGED)) if(get_amount() < 2) to_chat(user, span_warning("You need at least two gauzes to do this!")) @@ -197,62 +173,83 @@ else return ..() -/obj/item/stack/medical/gauze/suicide_act(mob/living/user) +/obj/item/stack/gauze/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins tightening [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!")) return OXYLOSS -/obj/item/stack/medical/gauze/improvised +///Absorb an incoming bleed amount, return the amount we failed to absorb. +/obj/item/stack/proc/absorb_blood(bleed_amt, mob/living/carbon/owner) + if(!bleed_amt) + return 0 + + add_blood_DNA(owner.get_blood_dna_list()) + if(!absorption_capacity) + return null + + absorption_capacity = absorption_capacity - bleed_amt + if(absorption_capacity < 0) + . = absorption_capacity * -1 // Blood we failed to absorb + var/obj/item/bodypart/BP = loc + to_chat(BP.owner, span_danger("The blood spills out from underneath \the [singular_name] on your [BP.plaintext_zone]!")) + absorption_capacity = 0 + else + return 0 //Absorbed all blood, and bandage is still good. + +/obj/item/stack/gauze/improvised name = "improvised gauze" singular_name = "improvised gauze" desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze." - self_delay = 6 SECONDS - other_delay = 3 SECONDS - splint_factor = 0.85 burn_cleanliness_bonus = 0.7 - absorption_rate = 0.075 - absorption_capacity = 4 - merge_type = /obj/item/stack/medical/gauze/improvised - - /* - The idea is for the following medical devices to work like a hybrid of the old brute packs and tend wounds, - they heal a little at a time, have reduced healing density and does not allow for rapid healing while in combat. - However they provice graunular control of where the healing is directed, this makes them better for curing work-related cuts and scrapes. + absorption_capacity = 20 + absorption_rate_modifier = 0.8 - The interesting limb targeting mechanic is retained and i still believe they will be a viable choice, especially when healing others in the field. - */ + merge_type = /obj/item/stack/gauze/improvised +/// Sutures close small cut or puncture wounds. /obj/item/stack/medical/suture name = "suture" - desc = "Basic sterile sutures used to seal up cuts and lacerations and stop bleeding." + desc = "Basic sterile sutures used to seal up cuts and stop bleeding." gender = PLURAL singular_name = "suture" icon_state = "suture" - self_delay = 3 SECONDS - other_delay = 1 SECONDS + self_delay = 8 SECONDS + other_delay = 5 SECONDS amount = 10 max_amount = 10 repeating = TRUE - heal_brute = 10 - stop_bleeding = 0.6 grind_results = list(/datum/reagent/medicine/spaceacillin = 2) merge_type = /obj/item/stack/medical/suture + use_sound = 'sound/effects/sneedle.ogg' -/obj/item/stack/medical/suture/emergency - name = "emergency suture" - desc = "A value pack of cheap sutures, not very good at repairing damage, but still decent at stopping bleeding." - heal_brute = 5 - amount = 5 - max_amount = 5 - merge_type = /obj/item/stack/medical/suture/emergency - -/obj/item/stack/medical/suture/medicated - name = "medicated suture" - icon_state = "suture_purp" - desc = "A suture infused with drugs that speed up wound healing of the treated laceration." - heal_brute = 15 - stop_bleeding = 0.75 - grind_results = list(/datum/reagent/medicine/polypyr = 1) - merge_type = /obj/item/stack/medical/suture/medicated +/obj/item/stack/medical/suture/heal_carbon(mob/living/carbon/C, mob/user, brute, burn) + var/obj/item/bodypart/affecting = C.get_bodypart(deprecise_zone(user.zone_selected), TRUE) + if(!affecting) //Missing limb? + to_chat(user, span_warning("[C] doesn't have \a [parse_zone(user.zone_selected)]!")) + return FALSE + + if(!IS_ORGANIC_LIMB(affecting)) //Limb must be organic to be healed - RR + to_chat(user, span_warning("[src] won't work on a robotic limb!")) + return FALSE + + var/wound_desc + for(var/datum/wound/W as anything in shuffle(affecting.wounds)) + if(W.wound_type != WOUND_CUT && W.wound_type != WOUND_PIERCE) + continue + if(W.damage <= 15) + wound_desc = W.desc + W.heal_damage(15) + affecting.update_damage() + break + + if(!wound_desc) + to_chat(user, span_warning("You can't find any wounds you can stitch shut.")) + return FALSE + + if(user == C) + user.visible_message(span_notice("[user] stitches the [wound_desc] on [user.p_their()] [affecting.plaintext_zone] shut.")) + else + user.visible_message(span_notice("[user] stitches the [wound_desc] on [C]'s [affecting.plaintext_zone] shut.")) + return TRUE /obj/item/stack/medical/ointment name = "ointment" @@ -270,7 +267,7 @@ heal_burn = 5 flesh_regeneration = 2.5 sanitization = 0.25 - grind_results = list(/datum/reagent/medicine/c2/lenturi = 10) + grind_results = list(/datum/reagent/medicine/kelotane = 10) merge_type = /obj/item/stack/medical/ointment /obj/item/stack/medical/ointment/suicide_act(mob/living/user) @@ -379,7 +376,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - amount = 1 + amount = 6 self_delay = 20 grind_results = list(/datum/reagent/bone_dust = 10, /datum/reagent/carbon = 10) novariants = TRUE @@ -398,7 +395,7 @@ C.visible_message(span_suicide("[C] screws up like an idiot and still dies anyway!")) return (BRUTELOSS) - C.emote("scream") + C.emote("agony") for(var/i in C.bodyparts) var/obj/item/bodypart/bone = i @@ -406,8 +403,8 @@ use(1) return (BRUTELOSS) -/obj/item/stack/medical/bone_gel/four - amount = 4 +/obj/item/stack/medical/bone_gel/twelve + amount = 12 /obj/item/stack/medical/poultice name = "mourning poultices" diff --git a/code/game/objects/items/stacks/overfloor_catwalk.dm b/code/game/objects/items/stacks/overfloor_catwalk.dm new file mode 100644 index 000000000000..a72ea85bcae7 --- /dev/null +++ b/code/game/objects/items/stacks/overfloor_catwalk.dm @@ -0,0 +1,92 @@ +/obj/item/stack/overfloor_catwalk + name = "catwalk floor covers" + singular_name = "catwalk floor cover" + desc = "A cover for plating, permitting access to wires and pipes." + + lefthand_file = 'icons/mob/inhands/misc/tiles_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/tiles_righthand.dmi' + icon = 'icons/obj/tiles.dmi' + icon_state = "maint_catwalk" + inhand_icon_state = "tile-catwalk" + + w_class = WEIGHT_CLASS_NORMAL + force = 6 + throwforce = 15 + throw_range = 7 + max_amount = 60 + novariants = TRUE + material_flags = MATERIAL_EFFECTS + + mats_per_unit = list(/datum/material/iron=100) + merge_type = /obj/item/stack/overfloor_catwalk + + var/catwalk_type = /obj/structure/overfloor_catwalk + +/** + * Place our tile on a plating, or replace it. + * + * Arguments: + * * target_plating - Instance of the plating we want to place on. Replaced during sucessful executions. + * * user - The mob doing the placing. + */ +/obj/item/stack/overfloor_catwalk/proc/place_tile(turf/open/floor/target_floor, mob/user) + if(!ispath(catwalk_type, /obj/structure/overfloor_catwalk)) + return + + if(!istype(target_floor)) + return + + if(locate(/obj/structure/overfloor_catwalk) in target_floor) + return + + if(!use(1)) + return + + playsound(target_floor, 'sound/weapons/genhit.ogg', 50, TRUE) + new catwalk_type (target_floor) + return target_floor // Most executions should end here. + +/obj/item/stack/overfloor_catwalk/sixty + amount = 60 + +/obj/item/stack/overfloor_catwalk/iron + name = "iron catwalk floor covers" + singular_name = "iron catwalk floor cover" + icon_state = "iron_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/iron + catwalk_type = /obj/structure/overfloor_catwalk/iron + +/obj/item/stack/overfloor_catwalk/iron_white + name = "white catwalk floor covers" + singular_name = "white catwalk floor cover" + icon_state = "whiteiron_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/iron_white + catwalk_type = /obj/structure/overfloor_catwalk/iron_white + +/obj/item/stack/overfloor_catwalk/iron_dark + name = "dark catwalk floor covers" + singular_name = "dark catwalk floor cover" + icon_state = "darkiron_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/iron_dark + catwalk_type = /obj/structure/overfloor_catwalk/iron_dark + +/obj/item/stack/overfloor_catwalk/flat_white + name = "flat white catwalk floor covers" + singular_name = "flat white catwalk floor cover" + icon_state = "flatwhite_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/flat_white + catwalk_type = /obj/structure/overfloor_catwalk/flat_white + +/obj/item/stack/overfloor_catwalk/titanium + name = "titanium catwalk floor covers" + singular_name = "titanium catwalk floor cover" + icon_state = "titanium_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/titanium + catwalk_type = /obj/structure/overfloor_catwalk/titanium + +/obj/item/stack/overfloor_catwalk/iron_smooth + name = "iron catwalk floor covers" + singular_name = "titanium catwalk floor cover" + icon_state = "smoothiron_catwalk" + merge_type = /obj/item/stack/overfloor_catwalk/iron_smooth + catwalk_type = /obj/structure/overfloor_catwalk/iron_smooth diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index eddbe273904f..107ed5ef4122 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -3,10 +3,10 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("table frame", /obj/structure/table_frame, 2, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = FALSE), \ new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 5, one_per_turf = FALSE), \ - new/datum/stack_recipe("railing", /obj/structure/railing, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("railing", /obj/structure/railing, 6, time = 18, window_checks = TRUE), \ new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_floor = FALSE), \ new/datum/stack_recipe("ladder", /obj/structure/ladder/crafted, 15, time = 150, one_per_turf = TRUE, on_floor = FALSE), \ - new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/tile/catwalk_tile, 1, 4, 20), \ + new/datum/stack_recipe("catwalk floor tile", /obj/item/stack/overfloor_catwalk, 1, 4, 20), \ )) /obj/item/stack/rods @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ w_class = WEIGHT_CLASS_NORMAL force = 9 throwforce = 10 - throw_speed = 3 throw_range = 7 mats_per_unit = list(/datum/material/iron=1000) max_amount = 50 @@ -78,10 +77,13 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ else return ..() -/obj/item/stack/rods/cyborg/ComponentInitialize() +/obj/item/stack/rods/cyborg/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) +/obj/item/stack/rods/two + amount = 2 + /obj/item/stack/rods/ten amount = 10 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 7ae1954ffc25..5a46508e95b0 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -22,7 +22,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \ icon_state = "sheet-glass" inhand_icon_state = "sheet-glass" mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list(/datum/reagent/silicon = 20) @@ -89,7 +89,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \ inhand_icon_state = "sheet-pglass" mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT) material_type = /datum/material/alloy/plasmaglass - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) @@ -144,7 +144,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \ icon_state = "sheet-rglass" inhand_icon_state = "sheet-rglass" mats_per_unit = 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, FIRE = 70, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) @@ -197,7 +197,7 @@ GLOBAL_LIST_INIT(prglass_recipes, list ( \ icon_state = "sheet-prglass" inhand_icon_state = "sheet-prglass" mats_per_unit = list(/datum/material/alloy/plasmaglass=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, FIRE = 80, ACID = 100) + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) resistance_flags = ACID_PROOF material_flags = NONE merge_type = /obj/item/stack/sheet/plasmarglass @@ -224,7 +224,7 @@ GLOBAL_LIST_INIT(titaniumglass_recipes, list( inhand_icon_state = "sheet-titaniumglass" mats_per_unit = list(/datum/material/alloy/titaniumglass=MINERAL_MATERIAL_AMOUNT) material_type = /datum/material/alloy/titaniumglass - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass tableVariant = /obj/structure/table/reinforced/titaniumglass @@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( inhand_icon_state = "sheet-plastitaniumglass" mats_per_unit = list(/datum/material/alloy/plastitaniumglass=MINERAL_MATERIAL_AMOUNT) material_type = /datum/material/alloy/plastitaniumglass - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) material_flags = NONE resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plastitaniumglass @@ -276,16 +276,14 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( attack_verb_simple = list("stab", "slash", "slice", "cut") hitsound = 'sound/weapons/bladeslice.ogg' resistance_flags = ACID_PROOF - armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100) + armor = list(BLUNT = 100, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 100) max_integrity = 40 sharpness = SHARP_EDGED var/icon_prefix - var/shiv_type = /obj/item/knife/shiv var/craft_time = 3.5 SECONDS var/obj/item/stack/sheet/weld_material = /obj/item/stack/sheet/glass embedding = list("embed_chance" = 65) - /obj/item/shard/suicide_act(mob/user) user.visible_message(span_suicide("[user] is slitting [user.p_their()] [pick("wrists", "throat")] with the shard of glass! It looks like [user.p_theyre()] trying to commit suicide.")) return (BRUTELOSS) @@ -343,19 +341,9 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( if(istype(item, /obj/item/lightreplacer)) var/obj/item/lightreplacer/lightreplacer = item lightreplacer.attackby(src, user) - else if(istype(item, /obj/item/stack/sheet/cloth)) - var/obj/item/stack/sheet/cloth/cloth = item - to_chat(user, span_notice("You begin to wrap the [cloth] around the [src]...")) - if(do_after(user, craft_time, target = src)) - var/obj/item/knife/shiv/shiv = new shiv_type - cloth.use(1) - to_chat(user, span_notice("You wrap the [cloth] around the [src], forming a makeshift weapon.")) - remove_item_from_storage(src) - qdel(src) - user.put_in_hands(shiv) - else return ..() + //creating shivs has been moved to modules/slapcrafting/recipes/melee /obj/item/shard/welder_act(mob/living/user, obj/item/I) ..() @@ -379,7 +367,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( if(isliving(AM)) var/mob/living/L = AM if(!(L.movement_type & (FLYING|FLOATING)) || L.buckled) - playsound(src, 'sound/effects/glass_step.ogg', HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE) + playsound(src, pick('sound/effects/glass_step_1.ogg', 'sound/effects/glass_step_2.ogg'), HAS_TRAIT(L, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE) /obj/item/shard/plasma name = "purple shard" @@ -391,7 +379,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( custom_materials = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT) icon_prefix = "plasma" weld_material = /obj/item/stack/sheet/plasmaglass - shiv_type = /obj/item/knife/shiv/plasma craft_time = 7 SECONDS /obj/item/shard/titanium @@ -403,7 +390,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( custom_materials = list(/datum/material/alloy/titaniumglass=MINERAL_MATERIAL_AMOUNT) icon_prefix = "titanium" weld_material = /obj/item/stack/sheet/titaniumglass - shiv_type = /obj/item/knife/shiv/titanium craft_time = 7 SECONDS /obj/item/shard/plastitanium @@ -416,5 +402,4 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( custom_materials = list(/datum/material/alloy/plastitaniumglass=MINERAL_MATERIAL_AMOUNT) icon_prefix = "plastitanium" weld_material = /obj/item/stack/sheet/plastitaniumglass - shiv_type = /obj/item/knife/shiv/plastitanium craft_time = 14 SECONDS diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 686f0e7914e0..f05e9099a4f1 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -88,9 +88,9 @@ GLOBAL_LIST_INIT(monkey_recipes, list ( \ . += GLOB.monkey_recipes /obj/item/stack/sheet/animalhide/lizard - name = "unathi skin" + name = "jinan skin" desc = "Sssssss..." - singular_name = "unathi skin piece" + singular_name = "jinan skin piece" icon_state = "sheet-lizard" inhand_icon_state = "sheet-lizard" merge_type = /obj/item/stack/sheet/animalhide/lizard @@ -191,7 +191,6 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ new/datum/stack_recipe("leather jacket", /obj/item/clothing/suit/jacket/leather, 7), \ new/datum/stack_recipe("leather shoes", /obj/item/clothing/shoes/laceup, 2), \ new/datum/stack_recipe("leather overcoat", /obj/item/clothing/suit/jacket/leather/overcoat, 10), \ - new/datum/stack_recipe("saddle", /obj/item/saddle, 5), \ new/datum/stack_recipe("sheriff vest", /obj/item/clothing/accessory/vest_sheriff, 4), \ new/datum/stack_recipe_list("cowboy hats", list( \ new/datum/stack_recipe("sheriff hat", /obj/item/clothing/head/cowboy_hat_brown, 2), \ diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm index 5ee8f06237ce..f86fd3f6f659 100644 --- a/code/game/objects/items/stacks/sheets/light.dm +++ b/code/game/objects/items/stacks/sheets/light.dm @@ -7,7 +7,6 @@ w_class = WEIGHT_CLASS_NORMAL force = 3 throwforce = 5 - throw_speed = 3 throw_range = 7 flags_1 = CONDUCT_1 max_amount = 60 diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d85f33be32bb..e09ee9c90266 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -13,7 +13,6 @@ Mineral Sheets - Titanium - Plastitanium Others: - - Adamantine - Mythril - Alien Alloy - Coal @@ -35,7 +34,6 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ singular_name = "sandstone brick" icon_state = "sheet-sandstone" inhand_icon_state = "sheet-sandstone" - throw_speed = 3 throw_range = 5 mats_per_unit = list(/datum/material/sandstone=MINERAL_MATERIAL_AMOUNT) sheettype = "sandstone" @@ -356,27 +354,6 @@ GLOBAL_LIST_INIT(snow_recipes, list ( \ /****************************** Others ****************************/ -/* - * Adamantine -*/ - - -GLOBAL_LIST_INIT(adamantine_recipes, list( - new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=1, res_amount=1), - )) - -/obj/item/stack/sheet/mineral/adamantine - name = "adamantine" - icon_state = "sheet-adamantine" - inhand_icon_state = "sheet-adamantine" - singular_name = "adamantine sheet" - mats_per_unit = list(/datum/material/adamantine=MINERAL_MATERIAL_AMOUNT) - merge_type = /obj/item/stack/sheet/mineral/adamantine - -/obj/item/stack/sheet/mineral/adamantine/get_main_recipes() - . = ..() - . += GLOB.adamantine_recipes - /* * Runite */ @@ -456,7 +433,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ else return ..() -/obj/item/stack/sheet/mineral/coal/fire_act(exposed_temperature, exposed_volume) +/obj/item/stack/sheet/mineral/coal/fire_act(exposed_temperature, exposed_volume, turf/adjacent) var/turf/muhturf = get_turf(src) muhturf.atmos_spawn_air(GAS_CO2, amount*10, exposed_temperature) qdel(src) @@ -469,7 +446,6 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \ //Metal Hydrogen GLOBAL_LIST_INIT(metalhydrogen_recipes, list( - new /datum/stack_recipe("incomplete servant golem shell", /obj/item/golem_shell/servant, req_amount=20, res_amount=1), new /datum/stack_recipe("ancient armor", /obj/item/clothing/suit/armor/elder_atmosian, req_amount = 5, res_amount = 1), new /datum/stack_recipe("ancient helmet", /obj/item/clothing/head/helmet/elder_atmosian, req_amount = 3, res_amount = 1), new /datum/stack_recipe("metallic hydrogen axe", /obj/item/fireaxe/metal_h2_axe, req_amount = 15, res_amount = 1), diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 36805f3f75dc..7774535958c8 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -147,10 +147,6 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ source = /datum/robot_energy_storage/iron tram_wall_type = /obj/structure/tramwall -/obj/item/stack/sheet/iron/examine(mob/user) - . = ..() - . += span_notice("You can build a wall girder (unanchored) by right clicking on an empty floor.") - /obj/item/stack/sheet/iron/narsie_act() new /obj/item/stack/sheet/runed_metal(loc, amount) qdel(src) @@ -225,7 +221,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ material_type = /datum/material/alloy/plasteel throwforce = 10 flags_1 = CONDUCT_1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 80) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 80) resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) @@ -305,7 +301,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ mats_per_unit = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT) sheettype = "wood" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/wood novariants = TRUE @@ -350,7 +346,7 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ sheettype = "bamboo" mats_per_unit = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT) throwforce = 15 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list(/datum/reagent/cellulose = 10) @@ -384,7 +380,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("science bag", /obj/item/storage/bag/xeno, 4), \ new/datum/stack_recipe("construction bag", /obj/item/storage/bag/construction, 4), \ null, \ - new/datum/stack_recipe("improvised gauze", /obj/item/stack/medical/gauze/improvised, 1, 2, 6), \ + new/datum/stack_recipe("improvised gauze", /obj/item/stack/gauze/improvised, 1, 2, 6), \ new/datum/stack_recipe("rag", /obj/item/reagent_containers/glass/rag, 1), \ new/datum/stack_recipe("bedsheet", /obj/item/bedsheet, 3), \ new/datum/stack_recipe("double bedsheet", /obj/item/bedsheet/double, 6), \ @@ -416,6 +412,9 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ pickup_sound = 'sound/items/handling/cloth_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 20) + absorption_capacity = 25 + absorption_rate_modifier = 0.7 + /obj/item/stack/sheet/cloth/get_main_recipes() . = ..() . += GLOB.cloth_recipes diff --git a/code/game/objects/items/stacks/splint.dm b/code/game/objects/items/stacks/splint.dm new file mode 100644 index 000000000000..c5c9a247322d --- /dev/null +++ b/code/game/objects/items/stacks/splint.dm @@ -0,0 +1,70 @@ +/obj/item/stack/splint + name = "medical splint" + singular_name = "splint" + icon_state = "splint" + novariants = TRUE + w_class = WEIGHT_CLASS_SMALL + full_w_class = WEIGHT_CLASS_NORMAL + item_flags = NOBLUDGEON + merge_type = /obj/item/stack/splint + amount = 1 + max_amount = 2 + + splint_slowdown = 1 + +/obj/item/stack/splint/two + amount = 2 + +/obj/item/stack/proc/try_splint(mob/living/carbon/human/H, mob/living/user) + if(!istype(H)) + return + + var/zone = deprecise_zone(user.zone_selected) + var/obj/item/bodypart/BP = H.get_bodypart(zone) + if(!BP) + to_chat(user, span_warning("[H] does not have a limb there.")) + return + + if(!(BP.body_zone in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))) + to_chat(user, span_warning("You cannot use [src] to apply a splint there.")) + return + + if(BP.splint) + to_chat(user, span_warning("There is already a splint there.")) + return + + if(H != user) + user.visible_message(span_notice("[user] starts to apply [src] to [H]'s [BP.plaintext_zone]."), blind_message = span_hear("You hear something being wrapped.")) + else + switch(user.get_active_hand()) + if(BODY_ZONE_PRECISE_R_HAND) + if(zone == BODY_ZONE_R_ARM) + to_chat(user, span_warning("You cannot apply a splint to the arm you are using!")) + return + if(BODY_ZONE_PRECISE_L_HAND) + if(zone == BODY_ZONE_L_ARM) + to_chat(user, span_warning("You cannot apply a splint to the arm you are using!")) + return + + user.visible_message(span_notice("[user] starts to apply [src] to [user.p_their()] [BP.plaintext_zone]."), blind_message = span_hear("You hear something being wrapped.")) + + if(!do_after(user, H, 5 SECONDS, DO_PUBLIC, interaction_key = "splint", display = src)) + return + + if(H == user && prob(25)) + user.visible_message(span_warning("[user] fumbles [src].")) + return + + var/obj/item/stack/splint = split_stack(null, 1, null) + if(!BP.apply_splint(splint)) + splint.merge(src) + to_chat(user, span_warning("You fail to apply [src].")) + return + + if(H != user) + user.visible_message(span_notice("[user] finishes applying [src] to [H]'s [BP.plaintext_zone].")) + else + user.visible_message(span_notice("[user] finishes applying [src] to [user.p_their()] [BP.plaintext_zone].")) + + return TRUE + diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index fd16ad1f37c1..8d2a4596aee4 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -20,6 +20,7 @@ gender = PLURAL material_modifier = 0.05 //5%, so that a 50 sheet stack has the effect of 5k materials instead of 100k. max_integrity = 100 + var/list/datum/stack_recipe/recipes var/singular_name var/amount = 1 @@ -36,21 +37,23 @@ //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() var/obj/structure/table/tableVariant // we tables now (stores table variant to be built from this stack) - // The following are all for medical treatment, they're here instead of /stack/medical because sticky tape can be used as a makeshift bandage or splint + // The following are all for medical treatment, they're here instead of /stack/medical because sticky tape can be used as a makeshift bandage or splint /// If set and this used as a splint for a broken bone wound, this is used as a multiplier for applicable slowdowns (lower = better) (also for speeding up burn recoveries) - var/splint_factor + var/splint_slowdown = null /// Like splint_factor but for burns instead of bone wounds. This is a multiplier used to speed up burn recoveries var/burn_cleanliness_bonus - /// How much blood flow this stack can absorb if used as a bandage on a cut wound, note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up - var/absorption_capacity - /// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first - var/absorption_rate + + /// How much blood this stack can absorb until the owner starts loosing blood again. + var/absorption_capacity = 0 + /// How much this stack reduces blood flow, multiplier + var/absorption_rate_modifier = 1 + /// Amount of matter for RCD var/matter_amount = 0 /// Does this stack require a unique girder in order to make a wall? var/has_unique_girder = FALSE -/obj/item/stack/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) +/obj/item/stack/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1, absorption_capacity) if(new_amount != null) amount = new_amount while(amount > max_amount) @@ -59,6 +62,9 @@ if(!merge_type) merge_type = type + if(absorption_capacity) + src.absorption_capacity = absorption_capacity + if(LAZYLEN(mat_override)) set_mats_per_unit(mat_override, mat_amt) else if(LAZYLEN(mats_per_unit)) @@ -67,6 +73,8 @@ set_mats_per_unit(custom_materials, amount ? 1/amount : 1) . = ..() + // HELLO THIS IS KAPU. THIS IS BROKEN. + // BECAUSE ON DAEDALUS ALL MOVABLES CALL LOC.ENTERED(SRC) POST-INITIALIZE, STACKS WILL ALWAYS MERGE. if(merge) for(var/obj/item/stack/item_stack in loc) if(item_stack == src) @@ -153,23 +161,33 @@ /obj/item/stack/examine(mob/user) . = ..() + var/plural = get_amount()>1 if(is_cyborg) if(singular_name) - . += "There is enough energy for [get_amount()] [singular_name]\s." + . += span_notice("There is enough energy for [get_amount()] [singular_name]\s.") else - . += "There is enough energy for [get_amount()]." + . += span_notice("There is enough energy for [get_amount()].") return + if(singular_name) - if(get_amount()>1) - . += "There are [get_amount()] [singular_name]\s in the stack." + if(plural) + . += span_notice("There are [get_amount()] [singular_name]\s in the stack.") else - . += "There is [get_amount()] [singular_name] in the stack." - else if(get_amount()>1) - . += "There are [get_amount()] in the stack." + . += span_notice("There is [get_amount()] [singular_name] in the stack.") + + else if(plural) + . += span_notice("There are [get_amount()] in the stack.") else - . += "There is [get_amount()] in the stack." + . += span_notice("There is [get_amount()] in the stack.") + . += span_notice("Right-click with an empty hand to take a custom amount.") + if(absorption_capacity < initial(absorption_capacity)) + if(absorption_capacity == 0) + . += span_alert("[plural ? "They are" : "It is"] drenched in blood, this won't be a suitable bandage.") + else + . += span_notice("[plural ? "They are" : "It is"] covered in blood.") + /obj/item/stack/proc/get_amount() if(is_cyborg) . = round(source?.energy / cost) @@ -447,6 +465,8 @@ return FALSE if(mats_per_unit ~! check.mats_per_unit) // ~! in case of lists this operator checks only keys, but not values return FALSE + if(absorption_capacity != check.absorption_capacity) + return FALSE if(is_cyborg) // No merging cyborg stacks into other stacks return FALSE if(ismob(loc) && !inhand) // no merging with items that are on the mob @@ -475,9 +495,13 @@ transfer = min(transfer, round((target_stack.source.max_energy - target_stack.source.energy) / target_stack.cost)) else transfer = min(transfer, (limit ? limit : target_stack.max_amount) - target_stack.amount) - if(pulledby) - pulledby.start_pulling(target_stack) - target_stack.copy_evidences(src) + if(LAZYLEN(grabbed_by)) + for(var/obj/item/hand_item/grab/G in grabbed_by) + var/mob/living/grabber = G.assailant + qdel(G) + grabber.try_make_grab(target_stack) + + transfer_evidence_to(target_stack) use(transfer, transfer = TRUE, check = FALSE) target_stack.add(transfer) if(target_stack.mats_per_unit != mats_per_unit) // We get the average value of mats_per_unit between two stacks getting merged @@ -512,12 +536,33 @@ merge(hitting) . = ..() +/obj/item/stack/attack(mob/living/M, mob/living/user, params) + if(splint_slowdown) + return try_splint(M, user) + + if(!user.combat_mode && absorption_capacity && ishuman(M)) + var/obj/item/bodypart/BP = M.get_bodypart(user.zone_selected, TRUE) + if(BP.bandage) + to_chat(user, span_warning("[M]'s [BP.plaintext_zone] is already bandaged.")) + return FALSE + + if(do_after(user, M, 5 SECONDS, DO_PUBLIC, display = src)) + if(user == M) + user.visible_message(span_notice("[user] applies [src] to [user.p_their()] [BP.plaintext_zone].")) + else + user.visible_message(span_notice("[user] applies [src] to [M]'s [BP.plaintext_zone].")) + BP.apply_bandage(src) + return + + return ..() + + //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/stack/attack_hand(mob/user, list/modifiers) if(user.get_inactive_held_item() == src) if(is_zero_amount(delete_if_zero = TRUE)) return - return split_stack(user, 1) + return split_stack(user, 1, user) else . = ..() @@ -526,15 +571,15 @@ if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(is_cyborg || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(is_cyborg || !user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return SECONDARY_ATTACK_CONTINUE_CHAIN if(is_zero_amount(delete_if_zero = TRUE)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/max = get_amount() var/stackmaterial = tgui_input_number(user, "How many sheets do you wish to take out of this stack?", "Stack Split", max_value = max) - if(!stackmaterial || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK, !iscyborg(user))) + if(!stackmaterial || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - split_stack(user, stackmaterial) + split_stack(user, stackmaterial, user) to_chat(user, span_notice("You take [stackmaterial] sheets out of the stack.")) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -543,13 +588,15 @@ * Arguments: * - [user][/mob]: The mob splitting the stack. * - amount: The number of units to split from this stack. + * - spawn_loc: The place to spawn the new stack, accepts null. */ -/obj/item/stack/proc/split_stack(mob/user, amount) +/obj/item/stack/proc/split_stack(mob/user, amount, spawn_loc) if(!use(amount, TRUE, FALSE)) return null - var/obj/item/stack/F = new type(user? user : drop_location(), amount, FALSE, mats_per_unit) + + var/obj/item/stack/F = new type(spawn_loc, amount, FALSE, mats_per_unit, null, absorption_capacity) . = F - F.copy_evidences(src) + transfer_evidence_to(F) loc.atom_storage?.refresh_views() if(user) if(!user.put_in_hands(F, merge_stacks = FALSE)) @@ -567,13 +614,6 @@ else . = ..() -/obj/item/stack/proc/copy_evidences(obj/item/stack/from) - add_blood_DNA(from.return_blood_DNA()) - add_fingerprint_list(from.return_fingerprints()) - add_hiddenprint_list(from.return_hiddenprints()) - fingerprintslast = from.fingerprintslast - //TODO bloody overlay - /obj/item/stack/microwave_act(obj/machinery/microwave/M) if(istype(M) && M.dirty < 100) M.dirty += amount diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index 8cbafa3ebd1e..ab0bd7c3a5d5 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -12,7 +12,7 @@ max_amount = 5 resistance_flags = FLAMMABLE grind_results = list(/datum/reagent/cellulose = 5) - splint_factor = 0.65 + splint_slowdown = 4 merge_type = /obj/item/stack/sticky_tape usesound = 'sound/items/duct_tape_rip.ogg' var/list/conferred_embed = EMBED_HARMLESS @@ -27,10 +27,6 @@ . = ..() register_item_context() -/obj/item/stack/sticky_tape/examine(mob/user) - . = ..() - . += span_notice("Left-click to restrain someone. Target mouth to gag.") - /obj/item/stack/sticky_tape/add_item_context( obj/item/source, list/context, @@ -122,10 +118,8 @@ victim.visible_message(span_danger("[user] is trying to restrain [victim] with [src]!"), \ span_userdanger("[user] begins wrapping [src] around your wrists!")) if(do_after(user, victim, handcuff_delay, DO_PUBLIC, display = src)) - if(!victim.handcuffed) + if(victim.equip_to_slot_if_possible(new /obj/item/restraints/handcuffs/tape(victim), ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE)) use(1) - victim.set_handcuffed(new /obj/item/restraints/handcuffs/tape(victim)) - victim.update_handcuffed() victim.visible_message("[user] binds [victim]'s hands.", \ "[user] handcuffs you.") log_combat(user, victim, "tapecuffed") @@ -141,7 +135,7 @@ icon_state = "tape_y" prefix = "super sticky" conferred_embed = EMBED_HARMLESS_SUPERIOR - splint_factor = 0.4 + splint_slowdown = 6 merge_type = /obj/item/stack/sticky_tape/super tape_gag = /obj/item/clothing/mask/muzzle/tape/super @@ -172,7 +166,7 @@ icon_state = "tape_w" prefix = "surgical" conferred_embed = list("embed_chance" = 30, "pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) - splint_factor = 0.5 - custom_price = PAYCHECK_MEDIUM + splint_slowdown = 3 + custom_price = PAYCHECK_ASSISTANT * 0.4 merge_type = /obj/item/stack/sticky_tape/surgical tape_gag = /obj/item/clothing/mask/muzzle/tape/surgical diff --git a/code/game/objects/items/stacks/tiles/tile_iron.dm b/code/game/objects/items/stacks/tiles/tile_iron.dm index 429ce088ea32..0d5046ebc3e6 100644 --- a/code/game/objects/items/stacks/tiles/tile_iron.dm +++ b/code/game/objects/items/stacks/tiles/tile_iron.dm @@ -9,7 +9,7 @@ throwforce = 10 flags_1 = CONDUCT_1 turf_type = /turf/open/floor/iron - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF matter_amount = 1 cost = 125 @@ -355,7 +355,7 @@ icon = 'icons/obj/tiles-ported.dmi' icon_state = "tcomms" turf_type = /turf/open/floor/iron/ported - merge_type = /obj/item/stack/tile/iron/ported + merge_type = /obj/item/stack/tile/iron/ported /obj/item/stack/tile/iron/ported/techfloor name = "techfloor tile" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index b918fdec240b..1e9ffeb104e2 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -11,9 +11,8 @@ righthand_file = 'icons/mob/inhands/misc/tiles_righthand.dmi' icon = 'icons/obj/tiles.dmi' w_class = WEIGHT_CLASS_NORMAL - force = 1 - throwforce = 1 - throw_speed = 3 + force = 6 + throwforce = 15 throw_range = 7 max_amount = 60 novariants = TRUE @@ -77,6 +76,9 @@ if(!istype(target_plating)) return + if(target_plating.underfloor_accessibility != UNDERFLOOR_INTERACTABLE) + return + if(!replace_plating) if(!use(1)) return @@ -134,33 +136,7 @@ turf_type = /turf/open/floor/wood resistance_flags = FLAMMABLE merge_type = /obj/item/stack/tile/wood - tile_reskin_types = list( - /obj/item/stack/tile/wood, - /obj/item/stack/tile/wood/large, - /obj/item/stack/tile/wood/tile, - /obj/item/stack/tile/wood/parquet, - ) -/obj/item/stack/tile/wood/parquet - name = "parquet wood floor tile" - singular_name = "parquet wood floor tile" - icon_state = "tile-wood_parquet" - turf_type = /turf/open/floor/wood/parquet - merge_type = /obj/item/stack/tile/wood/parquet - -/obj/item/stack/tile/wood/large - name = "large wood floor tile" - singular_name = "large wood floor tile" - icon_state = "tile-wood_large" - turf_type = /turf/open/floor/wood/large - merge_type = /obj/item/stack/tile/wood/large - -/obj/item/stack/tile/wood/tile - name = "tiled wood floor tile" - singular_name = "tiled wood floor tile" - icon_state = "tile-wood_tile" - turf_type = /turf/open/floor/wood/tile - merge_type = /obj/item/stack/tile/wood/tile //Bamboo /obj/item/stack/tile/bamboo @@ -376,7 +352,7 @@ . += neon_overlay . += emissive_appearance(neon_icon || icon, neon_icon_state || icon_state, alpha = emissive_alpha) -/obj/item/stack/tile/carpet/neon/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/stack/tile/carpet/neon/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands || !neon_inhand_icon_state) return @@ -1146,7 +1122,7 @@ . = ..() . += emissive_appearance(icon, icon_state, alpha = alpha) -/obj/item/stack/tile/emissive_test/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/stack/tile/emissive_test/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() . += emissive_appearance(standing.icon, standing.icon_state, alpha = standing.alpha) @@ -1162,65 +1138,6 @@ /obj/item/stack/tile/emissive_test/white/sixty amount = 60 -//Catwalk Tiles -/obj/item/stack/tile/catwalk_tile //This is our base type, sprited to look maintenance-styled - name = "catwalk plating" - singular_name = "catwalk plating tile" - desc = "Flooring that shows its contents underneath. Engineers love it!" - icon_state = "maint_catwalk" - inhand_icon_state = "tile-catwalk" - mats_per_unit = list(/datum/material/iron=100) - turf_type = /turf/open/floor/catwalk_floor - merge_type = /obj/item/stack/tile/catwalk_tile //Just to be cleaner, these all stack with eachother - tile_reskin_types = list( - /obj/item/stack/tile/catwalk_tile, - /obj/item/stack/tile/catwalk_tile/iron, - /obj/item/stack/tile/catwalk_tile/iron_white, - /obj/item/stack/tile/catwalk_tile/iron_dark, - /obj/item/stack/tile/catwalk_tile/flat_white, - /obj/item/stack/tile/catwalk_tile/titanium, - /obj/item/stack/tile/catwalk_tile/iron_smooth //this is the original greenish one - ) - -/obj/item/stack/tile/catwalk_tile/sixty - amount = 60 - -/obj/item/stack/tile/catwalk_tile/iron - name = "iron catwalk floor" - singular_name = "iron catwalk floor tile" - icon_state = "iron_catwalk" - turf_type = /turf/open/floor/catwalk_floor/iron - -/obj/item/stack/tile/catwalk_tile/iron_white - name = "white catwalk floor" - singular_name = "white catwalk floor tile" - icon_state = "whiteiron_catwalk" - turf_type = /turf/open/floor/catwalk_floor/iron_white - -/obj/item/stack/tile/catwalk_tile/iron_dark - name = "dark catwalk floor" - singular_name = "dark catwalk floor tile" - icon_state = "darkiron_catwalk" - turf_type = /turf/open/floor/catwalk_floor/iron_dark - -/obj/item/stack/tile/catwalk_tile/flat_white - name = "flat white catwalk floor" - singular_name = "flat white catwalk floor tile" - icon_state = "flatwhite_catwalk" - turf_type = /turf/open/floor/catwalk_floor/flat_white - -/obj/item/stack/tile/catwalk_tile/titanium - name = "titanium catwalk floor" - singular_name = "titanium catwalk floor tile" - icon_state = "titanium_catwalk" - turf_type = /turf/open/floor/catwalk_floor/titanium - -/obj/item/stack/tile/catwalk_tile/iron_smooth //this is the greenish one - name = "smooth iron catwalk floor" - singular_name = "smooth iron catwalk floor tile" - icon_state = "smoothiron_catwalk" - turf_type = /turf/open/floor/catwalk_floor/iron_smooth - // Glass floors /obj/item/stack/tile/glass name = "glass floor" diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 21e0910ff39b..dd3628887e43 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -23,13 +23,13 @@ //Generate random valid colors for paper and ribbon var/generated_base_color = "#" + random_color() var/generated_ribbon_color = "#" + random_color() - var/temp_base_hsv = RGBtoHSV(generated_base_color) - var/temp_ribbon_hsv = RGBtoHSV(generated_ribbon_color) + var/list/temp_base_hsv = rgb2hsv(generated_base_color) + var/list/temp_ribbon_hsv = rgb2hsv(generated_ribbon_color) //If colors are too dark, set to original colors - if(ReadHSV(temp_base_hsv)[3] < ReadHSV("7F7F7F")[3]) + if(temp_base_hsv[3] < 50) generated_base_color = "#00FF00" - if(ReadHSV(temp_ribbon_hsv)[3] < ReadHSV("7F7F7F")[3]) + if(temp_ribbon_hsv[3] < 50) generated_ribbon_color = "#FF0000" //Set layers to these colors, base then ribbon @@ -38,7 +38,7 @@ /obj/item/stack/wrapping_paper/attack_hand_secondary(mob/user, modifiers) var/new_base = input(user, "", "Select a base color", color) as color var/new_ribbon = input(user, "", "Select a ribbon color", color) as color - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return set_greyscale(colors = list(new_base, new_ribbon)) return TRUE @@ -176,5 +176,4 @@ icon_state = "c_tube" throwforce = 0 w_class = WEIGHT_CLASS_TINY - throw_speed = 3 throw_range = 5 diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index bc764e766f3a..53e32fe5c77c 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -26,9 +26,12 @@ max_integrity = 300 supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION + storage_type = /datum/storage/backpack + /obj/item/storage/backpack/Initialize() . = ..() - create_storage(max_slots = 21, max_total_storage = 21) + atom_storage.max_slots = 21 + atom_storage.max_total_storage = 21 /* * Backpack Types @@ -57,7 +60,7 @@ inhand_icon_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, FIRE = 60, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 50) /obj/item/storage/backpack/holding/Initialize() . = ..() @@ -445,10 +448,10 @@ new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) new /obj/item/bonesetter(src) - new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/razor(src) new /obj/item/blood_filter(src) + new /obj/item/fixovein(src) /obj/item/storage/backpack/duffelbag/sec name = "security duffel bag" @@ -469,9 +472,9 @@ new /obj/item/bonesetter(src) new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) - new /obj/item/surgical_drapes(src) new /obj/item/clothing/mask/surgical(src) new /obj/item/blood_filter(src) + new /obj/item/fixovein(src) /obj/item/storage/backpack/duffelbag/engineering name = "industrial duffel bag" @@ -559,12 +562,13 @@ new /obj/item/bonesetter(src) new /obj/item/surgicaldrill(src) new /obj/item/cautery(src) - new /obj/item/surgical_drapes(src) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/clothing/mask/muzzle(src) new /obj/item/mmi/syndie(src) new /obj/item/blood_filter(src) new /obj/item/stack/medical/bone_gel(src) + new /obj/item/healthanalyzer/advanced(src) + new /obj/item/fixovein(src) /obj/item/storage/backpack/duffelbag/syndie/ammo name = "ammunition duffel bag" @@ -632,30 +636,26 @@ new /obj/item/clothing/glasses/thermal/syndi(src) /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - desc = "A large duffel bag containing a medical equipment, a Donksoft LMG, a big jumbo box of riot darts, and a knock-off pair of magboots." + desc = "A large duffel bag containing a medical equipment, and a knock-off pair of magboots." /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle/PopulateContents() new /obj/item/clothing/shoes/magboots/syndie(src) new /obj/item/storage/medkit/tactical(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) - new /obj/item/ammo_box/foambox/riot(src) /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle - desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." + desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, and a box of syringes." /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle/PopulateContents() new /obj/item/reagent_containers/spray/chemsprayer/bioterror(src) new /obj/item/storage/box/syndie_kit/chemical(src) new /obj/item/gun/syringe/syndicate(src) - new /obj/item/gun/ballistic/automatic/c20r/toy(src) new /obj/item/storage/box/syringes(src) - new /obj/item/ammo_box/foambox/riot(src) new /obj/item/grenade/chem_grenade/bioterrorfoam(src) if(prob(5)) new /obj/item/food/pizza/pineapple(src) /obj/item/storage/backpack/duffelbag/syndie/c4/PopulateContents() - for(var/i in 1 to 10) + for(var/i in 1 to 4) new /obj/item/grenade/c4(src) /obj/item/storage/backpack/duffelbag/syndie/x4/PopulateContents() diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 5223590157d7..9625bc68f448 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -141,8 +141,9 @@ if(!isturf(tile)) return - if(istype(user.pulling, /obj/structure/ore_box)) - box = user.pulling + var/obj/item/hand_item/grab/G = user.get_active_held_item() + if(isgrab(G) && istype(G.affecting, /obj/structure/ore_box)) + box = G.affecting if(atom_storage) for(var/thing in tile) @@ -233,7 +234,7 @@ . = ..() . += span_notice("Ctrl-click to activate seed extraction.") -/obj/item/storage/bag/plants/portaseeder/CtrlClick(mob/user) +/obj/item/storage/bag/plants/portaseeder/CtrlClick(mob/user, list/params) if(user.incapacitated()) return for(var/obj/item/plant in contents) @@ -310,7 +311,6 @@ desc = "A metal tray to lay food on." force = 5 throwforce = 10 - throw_speed = 3 throw_range = 5 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT @@ -438,6 +438,7 @@ worn_icon_state = "biobag" desc = "A bag for the safe transportation and disposal of biowaste and other virulent materials." resistance_flags = FLAMMABLE + slot_flags = null //Primarily to limit slime extract storage on one person at a time /obj/item/storage/bag/bio/Initialize() . = ..() @@ -445,6 +446,7 @@ atom_storage.max_slots = 25 atom_storage.set_holdable(list( /obj/item/bodypart, + /obj/item/slime_extract, /obj/item/food/monkeycube, /obj/item/healthanalyzer, /obj/item/organ, @@ -456,7 +458,6 @@ /obj/item/reagent_containers/hypospray/medipen, /obj/item/food/monkeycube, /obj/item/organ, - /obj/item/bodypart, /obj/item/healthanalyzer )) @@ -481,7 +482,6 @@ /obj/item/food/deadmouse, /obj/item/food/monkeycube, /obj/item/organ, - /obj/item/petri_dish, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle, @@ -489,8 +489,6 @@ /obj/item/food/monkeycube, /obj/item/organ, /obj/item/bodypart, - /obj/item/petri_dish, - /obj/item/swab )) /* diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index a069f8125ee8..b4f6d35eb23b 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -80,6 +80,7 @@ /obj/item/inducer, /obj/item/plunger, /obj/item/airlock_painter, + /obj/item/paint_sprayer, )) /obj/item/storage/belt/utility/chief @@ -230,7 +231,6 @@ /obj/item/clothing/mask/breath, /obj/item/clothing/mask/muzzle, /obj/item/clothing/mask/surgical, - /obj/item/construction/plumbing, /obj/item/dnainjector, /obj/item/extinguisher/mini, /obj/item/flashlight/pen, @@ -248,6 +248,7 @@ /obj/item/storage/fancy/cigarettes, /obj/item/storage/pill_bottle, /obj/item/stack/medical, + /obj/item/stack/gauze, /obj/item/flashlight/pen, /obj/item/extinguisher/mini, /obj/item/reagent_containers/hypospray, @@ -259,7 +260,6 @@ /obj/item/clothing/mask/surgical, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath/medical, - /obj/item/surgical_drapes, //for true paramedics /obj/item/reagent_containers/glass/vial, //PARIAH EDIT ADDITION /obj/item/hypospray/mkii, //PARIAH EDIT ADDITION /obj/item/scalpel, @@ -270,6 +270,7 @@ /obj/item/cautery, /obj/item/hemostat, /obj/item/blood_filter, + /obj/item/fixovein, /obj/item/geiger_counter, /obj/item/clothing/neck/stethoscope, /obj/item/stamp, @@ -284,7 +285,6 @@ /obj/item/implanter, /obj/item/pinpointer/crew, /obj/item/holosign_creator/medical, - /obj/item/construction/plumbing, /obj/item/plunger, /obj/item/reagent_containers/spray, /obj/item/shears, @@ -297,22 +297,20 @@ /obj/item/storage/belt/medical/paramedic/PopulateContents() SSwardrobe.provide_type(/obj/item/sensor_device, src) SSwardrobe.provide_type(/obj/item/pinpointer/crew/prox, src) - SSwardrobe.provide_type(/obj/item/stack/medical/gauze/twelve, src) + SSwardrobe.provide_type(/obj/item/stack/gauze/twelve, src) SSwardrobe.provide_type(/obj/item/reagent_containers/syringe, src) SSwardrobe.provide_type(/obj/item/stack/medical/bone_gel, src) SSwardrobe.provide_type(/obj/item/stack/sticky_tape/surgical, src) - SSwardrobe.provide_type(/obj/item/reagent_containers/glass/bottle/formaldehyde, src) update_appearance() /obj/item/storage/belt/medical/paramedic/get_types_to_preload() var/list/to_preload = list() //Yes this is a pain. Yes this is the point to_preload += /obj/item/sensor_device to_preload += /obj/item/pinpointer/crew/prox - to_preload += /obj/item/stack/medical/gauze/twelve + to_preload += /obj/item/stack/gauze/twelve to_preload += /obj/item/reagent_containers/syringe to_preload += /obj/item/stack/medical/bone_gel to_preload += /obj/item/stack/sticky_tape/surgical - to_preload += /obj/item/reagent_containers/glass/bottle/formaldehyde return to_preload /obj/item/storage/belt/security @@ -343,18 +341,16 @@ /obj/item/grenade, /obj/item/reagent_containers/spray/pepper, /obj/item/restraints/handcuffs, - /obj/item/assembly/flash/handheld, /obj/item/clothing/glasses, /obj/item/ammo_casing/shotgun, /obj/item/ammo_box, /obj/item/food/donut, /obj/item/knife/combat, /obj/item/flashlight/seclite, - /obj/item/melee/baton/telescopic, /obj/item/radio, /obj/item/clothing/gloves, /obj/item/restraints/legcuffs/bola, - /obj/item/holosign_creator/security + /obj/item/holosign_creator/security, )) /obj/item/storage/belt/security/full/PopulateContents() @@ -432,7 +428,6 @@ /obj/item/wormhole_jaunter, /obj/item/stack/marker_beacon, /obj/item/key/lasso, - /obj/item/skeleton_key )) @@ -554,7 +549,6 @@ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb, /obj/item/reagent_containers/food/drinks/soda_cans/starkist, /obj/item/reagent_containers/food/drinks/soda_cans/space_up, - /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game, /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime, /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola )) @@ -819,7 +813,9 @@ AddElement(/datum/element/update_icon_updates_onmob) atom_storage.max_slots = 1 - atom_storage.rustle_sound = FALSE + atom_storage.rustle_sound = null + atom_storage.open_sound = null + atom_storage.close_sound = null atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY atom_storage.set_holdable(list( /obj/item/melee/sabre, @@ -831,7 +827,7 @@ . += span_notice("Alt-click it to quickly draw the blade.") /obj/item/storage/belt/sabre/AltClick(mob/user) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS)) return if(length(contents)) var/obj/item/I = contents[1] diff --git a/code/game/objects/items/storage/book.dm b/code/game/objects/items/storage/book.dm index 66ec6f11c027..c2d8783cd49b 100644 --- a/code/game/objects/items/storage/book.dm +++ b/code/game/objects/items/storage/book.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/library.dmi' icon_state ="book" worn_icon_state = "book" - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL resistance_flags = FLAMMABLE @@ -142,12 +141,11 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", if(hurt_limbs.len) for(var/X in hurt_limbs) var/obj/item/bodypart/affecting = X - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) - H.update_damage_overlays() + affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC) + H.visible_message(span_notice("[user] heals [H] with the power of [deity_name]!")) to_chat(H, span_boldnotice("May the power of [deity_name] compel you to be healed!")) playsound(src.loc, SFX_PUNCH, 25, TRUE, -1) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return TRUE /obj/item/storage/book/bible/attack(mob/living/M, mob/living/carbon/human/user, heal_mode = TRUE) @@ -260,7 +258,6 @@ GLOBAL_LIST_INIT(bibleitemstates, list("bible", "koran", "scrapbook", "burning", /obj/item/storage/book/bible/syndicate icon_state ="ebook" deity_name = "The Syndicate" - throw_speed = 2 throwforce = 18 throw_range = 7 force = 18 diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index e7037b7ae473..ecc7c6a42d38 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -31,6 +31,8 @@ resistance_flags = FLAMMABLE drop_sound = 'sound/items/handling/cardboardbox_drop.ogg' pickup_sound = 'sound/items/handling/cardboardbox_pickup.ogg' + + storage_type = /datum/storage/box var/foldable = /obj/item/stack/sheet/cardboard var/illustration = "writing" @@ -153,7 +155,7 @@ // Mining survival box /obj/item/storage/box/survival/mining - mask_type = /obj/item/clothing/mask/gas/explorer + mask_type = /obj/item/clothing/mask/breath /obj/item/storage/box/survival/mining/PopulateContents() ..() @@ -488,11 +490,6 @@ icon_state = "donkpocketboxpizza" donktype = /obj/item/food/donkpocket/pizza -/obj/item/storage/box/donkpockets/donkpocketgondola - name = "box of gondola-flavoured donk-pockets" - icon_state = "donkpocketboxgondola" - donktype = /obj/item/food/donkpocket/gondola - /obj/item/storage/box/donkpockets/donkpocketberry name = "box of berry-flavoured donk-pockets" icon_state = "donkpocketboxberry" @@ -715,7 +712,7 @@ slot_flags = ITEM_SLOT_BELT drop_sound = 'sound/items/handling/matchbox_drop.ogg' pickup_sound = 'sound/items/handling/matchbox_pickup.ogg' - custom_price = PAYCHECK_ASSISTANT * 0.4 + custom_price = PAYCHECK_ASSISTANT * 0.3 base_icon_state = "matchbox" illustration = null @@ -792,15 +789,6 @@ for(var/i in 1 to 7) new /obj/item/grenade/chem_grenade/metalfoam(src) -/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 = "grenade" - -/obj/item/storage/box/smart_metal_foam/PopulateContents() - for(var/i in 1 to 7) - new/obj/item/grenade/chem_grenade/smart_metal_foam(src) - /obj/item/storage/box/hug name = "box of hugs" desc = "A special box for sensitive people." @@ -1039,15 +1027,6 @@ new /obj/item/circuitboard/machine/destructive_analyzer(src) new /obj/item/circuitboard/machine/circuit_imprinter/offstation(src) -/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) - new /obj/item/reagent_containers/pill/patch/aiuri(src) - /obj/item/storage/box/fountainpens name = "box of fountain pens" illustration = "fpen" @@ -1222,7 +1201,7 @@ w_class = WEIGHT_CLASS_TINY illustration = null foldable = null - custom_price = PAYCHECK_EASY + custom_price = PAYCHECK_ASSISTANT * 0.2 /obj/item/storage/box/gum/Initialize() . = ..() @@ -1243,22 +1222,6 @@ for(var/i in 1 to 4) new/obj/item/food/bubblegum/nicotine(src) -/obj/item/storage/box/gum/happiness - name = "HP+ gum packet" - desc = "A seemingly homemade packaging with an odd smell. It has a weird drawing of a smiling face sticking out its tongue." - icon_state = "bubblegum_happiness" - custom_price = PAYCHECK_HARD * 3 - custom_premium_price = PAYCHECK_HARD * 3 - -/obj/item/storage/box/gum/happiness/Initialize(mapload) - . = ..() - if (prob(25)) - desc += " You can faintly make out the word 'Hemopagopril' was once scribbled on it." - -/obj/item/storage/box/gum/happiness/PopulateContents() - for(var/i in 1 to 4) - new/obj/item/food/bubblegum/happiness(src) - /obj/item/storage/box/gum/bubblegum name = "bubblegum gum packet" desc = "The packaging is entirely in Demonic, apparently. You feel like even opening this would be a sin." @@ -1309,36 +1272,6 @@ new/obj/item/skillchip/job/engineer(src) new/obj/item/skillchip/job/engineer(src) -/obj/item/storage/box/swab - name = "box of microbiological swabs" - desc = "Contains a number of sterile swabs for collecting microbiological samples." - illustration = "swab" - -/obj/item/storage/box/swab/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/swab(src) - -/obj/item/storage/box/petridish - name = "box of petridishes" - desc = "This box purports to contain a number of high rim petridishes." - illustration = "petridish" - -/obj/item/storage/box/petridish/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/petri_dish(src) - -/obj/item/storage/box/plumbing - name = "box of plumbing supplies" - desc = "Contains a small supply of pipes, water recyclers, and iron to connect to the rest of the station." - -/obj/item/storage/box/plumbing/PopulateContents() - var/list/items_inside = list( - /obj/item/stock_parts/water_recycler = 2, - /obj/item/stack/ducts/fifty = 1, - /obj/item/stack/sheet/iron/ten = 1, - ) - generate_items_inside(items_inside, src) - /obj/item/storage/box/tail_pin name = "pin the tail on the corgi supplies" desc = "For ages 10 and up. ...Why is this even on a space station? Aren't you a little old for babby games?" //Intentional typo. @@ -1394,7 +1327,6 @@ /obj/item/slimecross/stabilized/oil=1,\ /obj/item/slimecross/stabilized/black=1,\ /obj/item/slimecross/stabilized/lightpink=1,\ - /obj/item/slimecross/stabilized/adamantine=1,\ /obj/item/slimecross/stabilized/rainbow=1,\ ) generate_items_inside(items_inside,src) @@ -1600,20 +1532,6 @@ new /obj/item/knife/hunting(src) new /obj/item/storage/box/papersack/meat(src) -/obj/item/storage/box/hero/mothpioneer - name = "Mothic Fleet Pioneer - 2100's." - desc = "Some claim that the fleet engineers are directly responsible for most modern advancement in spacefaring design. Although the exact details of their past contributions are somewhat fuzzy, their ingenuity remains unmatched and unquestioned to this day." - -/obj/item/storage/box/hero/mothpioneer/PopulateContents() - new /obj/item/clothing/suit/mothcoat/original(src) - new /obj/item/clothing/head/mothcap(src) - new /obj/item/flashlight/lantern(src) - new /obj/item/screwdriver(src) - new /obj/item/wrench(src) - new /obj/item/crowbar(src) - new /obj/item/stack/sheet/iron/fifty(src) - new /obj/item/stack/sheet/glass/fifty(src) - /obj/item/storage/box/holy/clock name = "Forgotten kit" diff --git a/code/game/objects/items/storage/briefcase.dm b/code/game/objects/items/storage/briefcase.dm index f7ca760d751a..450038b493fd 100644 --- a/code/game/objects/items/storage/briefcase.dm +++ b/code/game/objects/items/storage/briefcase.dm @@ -7,7 +7,6 @@ flags_1 = CONDUCT_1 hitsound = SFX_SWING_HIT - throw_speed = 2 throw_range = 4 force = 8 stamina_cost = 17 @@ -19,6 +18,9 @@ attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "whack") resistance_flags = FLAMMABLE max_integrity = 150 + + storage_type = /datum/storage/latched_box + var/folder_path = /obj/item/folder //this is the path of the folder that gets spawned in New() /obj/item/storage/briefcase/Initialize() @@ -58,7 +60,7 @@ var/turf/turf_to_throw_at = prob(20) ? item_loc : get_ranged_target_turf(item_loc, pick(GLOB.alldirs)) paper.throw_at(turf_to_throw_at, 2) - stoplag(1 SECONDS) + sleep(1 SECONDS) user.say("ARGGHH, HOW WILL I GET THIS WORK DONE NOW?!!") user.visible_message(span_suicide("[user] looks overwhelmed with paperwork! It looks like [user.p_theyre()] trying to commit suicide!")) return OXYLOSS diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 25bb71a1b939..a44e5b5b410a 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -49,9 +49,9 @@ if(!is_open) return if(length(contents) == 1) - . += "There is one [contents_tag] left." + . += span_notice("There is one [contents_tag] left.") else - . += "There are [contents.len <= 0 ? "no" : "[contents.len]"] [contents_tag]s left." + . += span_notice("There are [contents.len <= 0 ? "no" : "[contents.len]"] [contents_tag]s left.") /obj/item/storage/fancy/attack_self(mob/user) is_open = !is_open @@ -185,10 +185,12 @@ throwforce = 0 slot_flags = ITEM_SLOT_BELT spawn_type = /obj/item/clothing/mask/cigarette/space_cigarette - custom_price = PAYCHECK_MEDIUM + custom_price = PAYCHECK_ASSISTANT spawn_count = 6 age_restricted = TRUE contents_tag = "cigarette" + storage_type = /datum/storage/cigarette_box + ///for cigarette overlay var/candy = FALSE /// Does this cigarette packet come with a coupon attached? @@ -221,7 +223,6 @@ /obj/item/storage/fancy/cigarettes/examine(mob/user) . = ..() - . += span_notice("Alt-click to extract contents.") if(spawn_coupon) . += span_notice("There's a coupon on the back of the pack! You can tear it off once it's empty.") @@ -340,13 +341,6 @@ base_icon_state = "midori" spawn_type = /obj/item/clothing/mask/cigarette/rollie/cannabis -/obj/item/storage/fancy/cigarettes/cigpack_mindbreaker - name = "\improper Leary's Delight packet" - desc = "Banned in over 36 galaxies." - icon_state = "shadyjim" - base_icon_state = "shadyjim" - spawn_type = /obj/item/clothing/mask/cigarette/rollie/mindbreaker - /obj/item/storage/fancy/rollingpapers name = "rolling paper pack" desc = "A pack of Nanotrasen brand rolling papers." @@ -357,7 +351,7 @@ contents_tag = "rolling paper" spawn_type = /obj/item/rollingpaper spawn_count = 10 - custom_price = PAYCHECK_PRISONER + custom_price = PAYCHECK_ASSISTANT * 0.4 /obj/item/storage/fancy/rollingpapers/Initialize() . = ..() diff --git a/code/game/objects/items/storage/garment.dm b/code/game/objects/items/storage/garment.dm index e48ea17d5e1a..d88576cc5497 100644 --- a/code/game/objects/items/storage/garment.dm +++ b/code/game/objects/items/storage/garment.dm @@ -11,8 +11,8 @@ desc = "A bag for storing extra clothes and shoes. This one belongs to the captain." /obj/item/storage/bag/garment/hos - name = "head of security's garment bag" - desc = "A bag for storing extra clothes and shoes. This one belongs to the head of security." + name = "security marshal's garment bag" + desc = "A bag for storing extra clothes and shoes. This one belongs to the security marshal." /obj/item/storage/bag/garment/hop name = "head of personnel's garment bag" @@ -61,7 +61,7 @@ /obj/item/storage/bag/garment/hop/PopulateContents() 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/suit/armor/vest/alt(src) + new /obj/item/clothing/suit/armor/vest/ballistic(src) new /obj/item/clothing/glasses/sunglasses(src) new /obj/item/clothing/head/hopcap(src) new /obj/item/clothing/neck/cloak/hop(src) diff --git a/code/game/objects/items/storage/holster_items.dm b/code/game/objects/items/storage/holster_items.dm new file mode 100644 index 000000000000..55e0fff01766 --- /dev/null +++ b/code/game/objects/items/storage/holster_items.dm @@ -0,0 +1,259 @@ +/obj/item/storage/belt/holster + alternate_worn_layer = UNDER_SUIT_LAYER + w_class = WEIGHT_CLASS_BULKY + storage_type = /datum/storage/holster + +/obj/item/storage/belt/holster/equipped(mob/user, slot, initial) + . = ..() + if(slot == ITEM_SLOT_BELT || ITEM_SLOT_SUITSTORE) + ADD_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + +/obj/item/storage/belt/holster/dropped(mob/user, silent) + . = ..() + REMOVE_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) + +/// Detective's shoulder holster. +/obj/item/storage/belt/holster/shoulder + name = "revolver shoulder holster" + desc = "A strap of leather designed to hold a " + /obj/item/gun/ballistic/revolver/detective::name + " and some small objects." + icon_state = "holster" + inhand_icon_state = "holster" + worn_icon_state = "holster" + alternate_worn_layer = UNDER_SUIT_LAYER + w_class = WEIGHT_CLASS_BULKY + +/obj/item/storage/belt/holster/shoulder/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.holster_slots = 1 + storage.max_slots = 3 + storage.max_specific_storage = WEIGHT_CLASS_TINY + storage.set_holsterable( + /obj/item/gun/ballistic/revolver, + ) + +/obj/item/storage/belt/holster/shoulder/full/PopulateContents() + generate_items_inside(list( + /obj/item/gun/ballistic/revolver/detective = 1, + /obj/item/ammo_box/c38 = 2, + ),src) + +/// Generic shoulder holster for holding small arms +/obj/item/storage/belt/holster/shoulder/generic + name = "small shoulder holster" + +/obj/item/storage/belt/holster/shoulder/generic/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.max_slots = 1 + storage.holster_slots = 1 + storage.set_holsterable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/dueling, + /obj/item/food/grown/banana, + /obj/item/gun/energy/laser/thermal + )) + +/obj/item/storage/belt/holster/shoulder/ert + name = "marine's holster" + desc = "A rather plain but still cool looking holster that can hold an " + /obj/item/gun/ballistic/automatic/pistol/m1911::name + "and some small objects." + icon_state = "syndicate_holster" + inhand_icon_state = "syndicate_holster" + worn_icon_state = "syndicate_holster" + +/obj/item/storage/belt/holster/shoulder/ert/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.holster_slots = 1 + storage.max_slots = 3 + storage.max_specific_storage = WEIGHT_CLASS_TINY + storage.set_holsterable( + /obj/item/gun/ballistic/automatic/pistol/m1911, + ) + +/obj/item/storage/belt/holster/shoulder/ert/full/PopulateContents() + generate_items_inside(list( + /obj/item/gun/ballistic/automatic/pistol/m1911 = 1, + /obj/item/ammo_box/magazine/m45 = 2, + ),src) + +// +// CHAMELEON HOLSTER +// +/obj/item/storage/belt/holster/shoulder/chameleon + name = "chameleon holster" + desc = "A hip holster that uses chameleon technology to disguise itself, due to the added chameleon tech, it cannot be mounted onto armor." + icon_state = "syndicate_holster" + inhand_icon_state = "syndicate_holster" + worn_icon_state = "syndicate_holster" + w_class = WEIGHT_CLASS_NORMAL + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/storage/belt/holster/shoulder/chameleon/Initialize(mapload) + . = ..() + + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/storage/belt + chameleon_action.chameleon_name = "Belt" + chameleon_action.initialize_disguises() + add_item_action(chameleon_action) + +/obj/item/storage/belt/holster/shoulder/chameleon/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + chameleon_action.emp_randomise() + +/obj/item/storage/belt/holster/shoulder/chameleon/broken/Initialize(mapload) + . = ..() + chameleon_action.emp_randomise(INFINITY) + +/obj/item/storage/belt/holster/shoulder/chameleon/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.max_slots = 2 + storage.max_total_storage = WEIGHT_CLASS_TINY * 2 + storage.holster_slots = 1 + storage.set_holsterable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/ammo_box/magazine/toy/pistol, + /obj/item/gun/energy/recharge/ebow, + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/dueling + )) + + storage.set_holdable(list( + /obj/item/ammo_box/c38, + /obj/item/ammo_box/a357, + /obj/item/ammo_box/a762, + /obj/item/ammo_box/magazine/toy/pistol, + /obj/item/ammo_box/magazine/m9mm, + /obj/item/ammo_box/magazine/m9mm_aps, + /obj/item/ammo_box/magazine/m45, + /obj/item/ammo_box/magazine/m50, + )) + +// +// NUKIE HOLSTER +// +/obj/item/storage/belt/holster/shoulder/nukie + name = "operative holster" + desc = "A deep shoulder holster capable of holding almost any form of firearm and its ammo." + icon_state = "syndicate_holster" + inhand_icon_state = "syndicate_holster" + worn_icon_state = "syndicate_holster" + w_class = WEIGHT_CLASS_BULKY + +/obj/item/storage/belt/holster/shoulder/nukie/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.max_slots = 2 + storage.max_total_storage = WEIGHT_CLASS_BULKY + storage.holster_slots = 1 + storage.max_slots = 2 + storage.set_holsterable(list( + /obj/item/gun, // ALL guns. + )) + + storage.set_holdable(list( + /obj/item/ammo_box/magazine, // ALL magazines. + /obj/item/ammo_box/c38, //There isn't a speedloader parent type, so I just put these three here by hand. + /obj/item/ammo_box/a357, //I didn't want to just use /obj/item/ammo_box, because then this could hold huge boxes of ammo. + /obj/item/ammo_box/a762, + /obj/item/ammo_casing, // For shotgun shells, rockets, launcher grenades, and a few other things. + /obj/item/grenade, // All regular grenades, the big grenade launcher fires these. + )) + + +// +// THERMAL HOLSTER +// +/obj/item/storage/belt/holster/shoulder/thermal + name = "thermal shoulder holsters" + desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Meant to hold a twinned pair of thermal pistols, but can fit several kinds of energy handguns as well." + +/obj/item/storage/belt/holster/shoulder/thermal/Initialize() + . = ..() + // So here we're making ONE slot a holster, so you can hold 2 thermal pistols or 1 E gun + var/datum/storage/holster/storage = atom_storage + storage.max_slots = 2 + storage.holster_slots = 1 + storage.max_specific_storage = /obj/item/gun/energy/laser/thermal::w_class + storage.set_holdable(list( + /obj/item/gun/energy/e_gun/mini, + /obj/item/gun/energy/disabler, + /obj/item/gun/energy/dueling, + /obj/item/food/grown/banana, + /obj/item/gun/energy/laser/thermal + )) + storage.set_holsterable( + /obj/item/gun/energy/laser/thermal, + ) + +/obj/item/storage/belt/holster/shoulder/thermal/PopulateContents() + generate_items_inside(list( + /obj/item/gun/energy/laser/thermal/inferno = 1, + /obj/item/gun/energy/laser/thermal/cryo = 1, + ),src) + +/// Security sidearm + gear belt. +/obj/item/storage/belt/holster/security + name = "tactical holster belt" + desc = "A security belt with small gear pouches and a hip-holster for a sidearm." + icon_state = "security" + inhand_icon_state = "security" + worn_icon_state = "security" + alternate_worn_layer = UNDER_SUIT_LAYER + w_class = WEIGHT_CLASS_BULKY + +/obj/item/storage/belt/holster/security/Initialize() + . = ..() + var/datum/storage/holster/storage = atom_storage + storage.holster_slots = 1 + storage.max_slots = 5 + storage.max_specific_storage = WEIGHT_CLASS_TINY + storage.set_holsterable(list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/revolver, + /obj/item/gun/energy/disabler, + )) + //LIST DIRECTLY COPIED FROM SEC BELT!! REVIEW LATER + storage.set_holdable(list( + /obj/item/ammo_box, + /obj/item/ammo_casing/shotgun, + /obj/item/assembly/flash/handheld, + /obj/item/clothing/glasses, + /obj/item/clothing/gloves, + /obj/item/flashlight/seclite, + /obj/item/food/donut, + /obj/item/grenade, + /obj/item/holosign_creator/security, + /obj/item/knife/combat, + /obj/item/melee/baton, + /obj/item/grenade, + /obj/item/reagent_containers/spray/pepper, + /obj/item/restraints/handcuffs, + /obj/item/clothing/glasses, + /obj/item/ammo_casing/shotgun, + /obj/item/ammo_box, + /obj/item/food/donut, + /obj/item/knife/combat, + /obj/item/flashlight/seclite, + /obj/item/radio, + /obj/item/clothing/gloves, + /obj/item/restraints/legcuffs/bola, + /obj/item/holosign_creator/security, + )) + +/obj/item/storage/belt/holster/security/full/PopulateContents() + new /obj/item/reagent_containers/spray/pepper(src) + new /obj/item/restraints/handcuffs(src) + new /obj/item/grenade/flashbang(src) + new /obj/item/assembly/flash/handheld(src) + new /obj/item/melee/baton/security/loaded(src) + update_appearance() diff --git a/code/game/objects/items/storage/holsters.dm b/code/game/objects/items/storage/holsters.dm deleted file mode 100644 index 650a32801db6..000000000000 --- a/code/game/objects/items/storage/holsters.dm +++ /dev/null @@ -1,174 +0,0 @@ - -/obj/item/storage/belt/holster - name = "shoulder holster" - desc = "A rather plain but still cool looking holster that can hold a handgun." - icon_state = "holster" - inhand_icon_state = "holster" - worn_icon_state = "holster" - alternate_worn_layer = UNDER_SUIT_LAYER - w_class = WEIGHT_CLASS_BULKY - -/obj/item/storage/belt/holster/equipped(mob/user, slot) - . = ..() - if(slot == ITEM_SLOT_BELT || ITEM_SLOT_SUITSTORE) - ADD_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) - -/obj/item/storage/belt/holster/dropped(mob/user) - . = ..() - REMOVE_TRAIT(user, TRAIT_GUNFLIP, CLOTHING_TRAIT) - -/obj/item/storage/belt/holster/Initialize() - . = ..() - atom_storage.max_slots = 1 - atom_storage.max_total_storage = 16 - atom_storage.set_holdable(list( - /obj/item/gun/ballistic/automatic/pistol, - /obj/item/gun/ballistic/revolver, - /obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/disabler, - /obj/item/gun/energy/dueling, - /obj/item/food/grown/banana, - /obj/item/gun/energy/laser/thermal - )) - -/obj/item/storage/belt/holster/thermal - name = "thermal shoulder holsters" - desc = "A rather plain pair of shoulder holsters with a bit of insulated padding inside. Meant to hold a twinned pair of thermal pistols, but can fit several kinds of energy handguns as well." - -/obj/item/storage/belt/holster/thermal/Initialize() - . = ..() - atom_storage.max_slots = 2 - atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL - atom_storage.set_holdable(list( - /obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/disabler, - /obj/item/gun/energy/dueling, - /obj/item/food/grown/banana, - /obj/item/gun/energy/laser/thermal - )) - -/obj/item/storage/belt/holster/thermal/PopulateContents() - generate_items_inside(list( - /obj/item/gun/energy/laser/thermal/inferno = 1, - /obj/item/gun/energy/laser/thermal/cryo = 1, - ),src) - -/obj/item/storage/belt/holster/detective - name = "detective's holster" - desc = "A holster able to carry handguns and some ammo. WARNING: Badasses only." - w_class = WEIGHT_CLASS_BULKY - -/obj/item/storage/belt/holster/detective/Initialize() - . = ..() - atom_storage.max_slots = 3 - atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL - atom_storage.set_holdable(list( - /obj/item/gun/ballistic/automatic/pistol, - /obj/item/ammo_box/magazine/m9mm, // Pistol magazines. - /obj/item/ammo_box/magazine/m9mm_aps, - /obj/item/ammo_box/magazine/m45, - /obj/item/ammo_box/magazine/m50, - /obj/item/gun/ballistic/revolver, - /obj/item/ammo_box/c38, // Revolver speedloaders. - /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, - /obj/item/ammo_box/magazine/toy/pistol, - /obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/disabler, - /obj/item/gun/energy/dueling, - /obj/item/gun/energy/laser/thermal - )) - -/obj/item/storage/belt/holster/detective/full/PopulateContents() - generate_items_inside(list( - /obj/item/gun/ballistic/revolver/detective = 1, - /obj/item/ammo_box/c38 = 2, - ),src) - -/obj/item/storage/belt/holster/detective/full/ert - name = "marine's holster" - desc = "Wearing this makes you feel badass, but you suspect it's just a repainted detective's holster from the NT surplus." - icon_state = "syndicate_holster" - inhand_icon_state = "syndicate_holster" - worn_icon_state = "syndicate_holster" - -/obj/item/storage/belt/holster/detective/full/ert/PopulateContents() - generate_items_inside(list( - /obj/item/gun/ballistic/automatic/pistol/m1911 = 1, - /obj/item/ammo_box/magazine/m45 = 2, - ),src) - -/obj/item/storage/belt/holster/chameleon - name = "syndicate holster" - desc = "A hip holster that uses chameleon technology to disguise itself, due to the added chameleon tech, it cannot be mounted onto armor." - icon_state = "syndicate_holster" - inhand_icon_state = "syndicate_holster" - worn_icon_state = "syndicate_holster" - w_class = WEIGHT_CLASS_NORMAL - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/storage/belt/holster/chameleon/Initialize(mapload) - . = ..() - - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/storage/belt - chameleon_action.chameleon_name = "Belt" - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/storage/belt/holster/chameleon/Initialize() - . = ..() - atom_storage.silent = TRUE - -/obj/item/storage/belt/holster/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - -/obj/item/storage/belt/holster/chameleon/broken/Initialize(mapload) - . = ..() - chameleon_action.emp_randomise(INFINITY) - -/obj/item/storage/belt/holster/chameleon/Initialize() - . = ..() - atom_storage.max_slots = 2 - atom_storage.max_total_storage = WEIGHT_CLASS_NORMAL - atom_storage.set_holdable(list( - /obj/item/gun/ballistic/automatic/pistol, - /obj/item/ammo_box/magazine/m9mm, - /obj/item/ammo_box/magazine/m9mm_aps, - /obj/item/ammo_box/magazine/m45, - /obj/item/ammo_box/magazine/m50, - /obj/item/gun/ballistic/revolver, - /obj/item/ammo_box/c38, - /obj/item/ammo_box/a357, - /obj/item/ammo_box/a762, - /obj/item/ammo_box/magazine/toy/pistol, - /obj/item/gun/energy/recharge/ebow, - /obj/item/gun/energy/e_gun/mini, - /obj/item/gun/energy/disabler, - /obj/item/gun/energy/dueling - )) - -/obj/item/storage/belt/holster/nukie - name = "operative holster" - desc = "A deep shoulder holster capable of holding almost any form of firearm and its ammo." - icon_state = "syndicate_holster" - inhand_icon_state = "syndicate_holster" - worn_icon_state = "syndicate_holster" - w_class = WEIGHT_CLASS_BULKY - -/obj/item/storage/belt/holster/nukie/Initialize() - . = ..() - atom_storage.max_slots = 2 - atom_storage.max_specific_storage = WEIGHT_CLASS_BULKY - atom_storage.set_holdable(list( - /obj/item/gun, // ALL guns. - /obj/item/ammo_box/magazine, // ALL magazines. - /obj/item/ammo_box/c38, //There isn't a speedloader parent type, so I just put these three here by hand. - /obj/item/ammo_box/a357, //I didn't want to just use /obj/item/ammo_box, because then this could hold huge boxes of ammo. - /obj/item/ammo_box/a762, - /obj/item/ammo_casing, // For shotgun shells, rockets, launcher grenades, and a few other things. - /obj/item/grenade, // All regular grenades, the big grenade launcher fires these. - )) diff --git a/code/game/objects/items/storage/lockbox.dm b/code/game/objects/items/storage/lockbox.dm index b005081c0527..56b0d766618a 100644 --- a/code/game/objects/items/storage/lockbox.dm +++ b/code/game/objects/items/storage/lockbox.dm @@ -109,7 +109,7 @@ . += span_notice("Alt-click to [open ? "close":"open"] it.") /obj/item/storage/lockbox/medal/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE)) if(!atom_storage.locked) open = (open ? FALSE : TRUE) update_appearance() @@ -169,12 +169,12 @@ name = "security medal box" desc = "A locked box used to store medals to be given to members of the security department." req_access = list(ACCESS_HOS) - + /obj/item/storage/lockbox/medal/med name = "medical medal box" desc = "A locked box used to store medals to be given to members of the medical department." req_access = list(ACCESS_CMO) - + /obj/item/storage/lockbox/medal/med/PopulateContents() new /obj/item/clothing/accessory/medal/med_medal(src) new /obj/item/clothing/accessory/medal/med_medal2(src) diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm index 561d92e924fa..30f9ae12014a 100644 --- a/code/game/objects/items/storage/medkit.dm +++ b/code/game/objects/items/storage/medkit.dm @@ -14,8 +14,8 @@ icon_state = "medkit" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - throw_speed = 3 throw_range = 7 + storage_type = /datum/storage/latched_box var/empty = FALSE var/damagetype_healed //defines damage type of the medkit. General ones stay null. Used for medibot healing bonuses @@ -31,10 +31,12 @@ if(empty) return var/static/items_inside = list( - /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/suture = 2, + /obj/item/stack/gauze = 1, + /obj/item/stack/medical/bruise_pack = 2, /obj/item/stack/medical/mesh = 2, - /obj/item/reagent_containers/hypospray/medipen = 1) + /obj/item/reagent_containers/hypospray/medipen = 1, + /obj/item/stack/splint = 1 + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/emergency @@ -47,11 +49,13 @@ return var/static/items_inside = list( /obj/item/healthanalyzer/wound = 1, - /obj/item/stack/medical/gauze = 1, - /obj/item/stack/medical/suture/emergency = 1, + /obj/item/stack/gauze = 1, + /obj/item/stack/medical/suture = 1, /obj/item/stack/medical/ointment = 1, /obj/item/reagent_containers/hypospray/medipen/ekit = 2, - /obj/item/storage/pill_bottle/iron = 1) + /obj/item/storage/pill_bottle/iron = 1, + /obj/item/stack/splint = 1, + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/surgery @@ -84,13 +88,12 @@ /obj/item/reagent_containers/hypospray, /obj/item/sensor_device, /obj/item/radio, - /obj/item/clothing/gloves/, + /obj/item/clothing/gloves, /obj/item/lazarus_injector, /obj/item/bikehorn/rubberducky, /obj/item/clothing/mask/surgical, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath/medical, - /obj/item/surgical_drapes, //for true paramedics /obj/item/scalpel, /obj/item/circular_saw, /obj/item/bonesetter, @@ -99,6 +102,7 @@ /obj/item/cautery, /obj/item/hemostat, /obj/item/blood_filter, + /obj/item/fixovein, /obj/item/shears, /obj/item/geiger_counter, /obj/item/clothing/neck/stethoscope, @@ -122,14 +126,15 @@ return var/static/items_inside = list( /obj/item/healthanalyzer = 1, - /obj/item/stack/medical/gauze/twelve = 1, - /obj/item/stack/medical/suture = 2, + /obj/item/stack/gauze/twelve = 1, + /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/mesh = 2, /obj/item/reagent_containers/hypospray/medipen = 1, - /obj/item/surgical_drapes = 1, /obj/item/scalpel = 1, /obj/item/hemostat = 1, - /obj/item/cautery = 1) + /obj/item/cautery = 1, + /obj/item/fixovein = 1 + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/ancient @@ -140,7 +145,7 @@ if(empty) return var/static/items_inside = list( - /obj/item/stack/medical/gauze = 1, + /obj/item/stack/gauze = 1, /obj/item/stack/medical/bruise_pack = 3, /obj/item/stack/medical/ointment= 3) generate_items_inside(items_inside,src) @@ -164,9 +169,9 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/pill/patch/aiuri = 3, - /obj/item/reagent_containers/spray/hercuri = 1, - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1, + /obj/item/reagent_containers/pill/kelotane = 3, + /obj/item/storage/pill_bottle/dermaline = 1, + /obj/item/reagent_containers/hypospray/medipen/dermaline = 1, /obj/item/reagent_containers/hypospray/medipen = 1) generate_items_inside(items_inside,src) @@ -186,10 +191,10 @@ if(empty) return var/static/items_inside = list( - /obj/item/storage/pill_bottle/multiver/less = 1, - /obj/item/reagent_containers/syringe/syriniver = 3, + /obj/item/storage/pill_bottle/dylovene/less = 1, + /obj/item/reagent_containers/syringe/dylovene = 3, /obj/item/storage/pill_bottle/potassiodide = 1, - /obj/item/reagent_containers/hypospray/medipen/penacid = 1) + /obj/item/reagent_containers/hypospray/medipen/dylovene = 1) generate_items_inside(items_inside,src) /obj/item/storage/medkit/o2 @@ -207,8 +212,7 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/syringe/convermol = 3, - /obj/item/reagent_containers/hypospray/medipen/salbutamol = 1, + /obj/item/reagent_containers/hypospray/medipen/dexalin = 1, /obj/item/reagent_containers/hypospray/medipen = 1, /obj/item/storage/pill_bottle/iron = 1) generate_items_inside(items_inside,src) @@ -228,10 +232,12 @@ if(empty) return var/static/items_inside = list( - /obj/item/reagent_containers/pill/patch/libital = 3, - /obj/item/stack/medical/gauze = 1, - /obj/item/storage/pill_bottle/probital = 1, - /obj/item/reagent_containers/hypospray/medipen/salacid = 1) + /obj/item/reagent_containers/pill/bicaridine = 3, + /obj/item/stack/gauze = 1, + /obj/item/storage/pill_bottle/meralyne = 1, + /obj/item/reagent_containers/hypospray/medipen/meralyne = 1, + /obj/item/stack/splint = 1 + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/advanced @@ -248,8 +254,10 @@ var/static/items_inside = list( /obj/item/reagent_containers/pill/patch/synthflesh = 3, /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/stack/medical/gauze = 1, - /obj/item/storage/pill_bottle/penacid = 1) + /obj/item/stack/gauze = 1, + /obj/item/storage/pill_bottle/dylovene = 1, + /obj/item/stack/splint = 1 + ) generate_items_inside(items_inside,src) /obj/item/storage/medkit/tactical @@ -265,13 +273,14 @@ /obj/item/storage/medkit/tactical/PopulateContents() if(empty) return - new /obj/item/stack/medical/gauze(src) + new /obj/item/stack/gauze(src) + new /obj/item/stack/splint/two(src) new /obj/item/defibrillator/compact/combat/loaded(src) new /obj/item/reagent_containers/hypospray/combat(src) - new /obj/item/reagent_containers/pill/patch/libital(src) - new /obj/item/reagent_containers/pill/patch/libital(src) - new /obj/item/reagent_containers/pill/patch/aiuri(src) - new /obj/item/reagent_containers/pill/patch/aiuri(src) + new /obj/item/reagent_containers/pill/bicaridine(src) + new /obj/item/reagent_containers/pill/bicaridine(src) + new /obj/item/reagent_containers/pill/kelotane(src) + new /obj/item/reagent_containers/pill/kelotane(src) new /obj/item/clothing/glasses/hud/health/night(src) //medibot assembly @@ -315,6 +324,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' w_class = WEIGHT_CLASS_SMALL + storage_type = /datum/storage/pill_bottle /obj/item/storage/pill_bottle/Initialize() . = ..() @@ -325,19 +335,19 @@ user.visible_message(span_suicide("[user] is trying to get the cap off [src]! It looks like [user.p_theyre()] trying to commit suicide!")) return (TOXLOSS) -/obj/item/storage/pill_bottle/multiver - name = "bottle of multiver pills" +/obj/item/storage/pill_bottle/dylovene + name = "bottle of dylovene pills" desc = "Contains pills used to counter toxins." -/obj/item/storage/pill_bottle/multiver/PopulateContents() +/obj/item/storage/pill_bottle/dylovene/PopulateContents() for(var/i in 1 to 7) - new /obj/item/reagent_containers/pill/multiver(src) + new /obj/item/reagent_containers/pill/dylovene(src) -/obj/item/storage/pill_bottle/multiver/less +/obj/item/storage/pill_bottle/dylovene/less -/obj/item/storage/pill_bottle/multiver/less/PopulateContents() +/obj/item/storage/pill_bottle/dylovene/less/PopulateContents() for(var/i in 1 to 3) - new /obj/item/reagent_containers/pill/multiver(src) + new /obj/item/reagent_containers/pill/dylovene(src) /obj/item/storage/pill_bottle/epinephrine name = "bottle of epinephrine pills" @@ -347,53 +357,69 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/epinephrine(src) -/obj/item/storage/pill_bottle/mutadone - name = "bottle of mutadone pills" +/obj/item/storage/pill_bottle/ryetalyn + name = "bottle of ryetalyn pills" desc = "Contains pills used to treat genetic abnormalities." -/obj/item/storage/pill_bottle/mutadone/PopulateContents() +/obj/item/storage/pill_bottle/ryetalyn/PopulateContents() for(var/i in 1 to 7) - new /obj/item/reagent_containers/pill/mutadone(src) + new /obj/item/reagent_containers/pill/ryetalyn(src) /obj/item/storage/pill_bottle/potassiodide name = "bottle of potassium iodide pills" desc = "Contains pills used to reduce radiation damage." /obj/item/storage/pill_bottle/potassiodide/PopulateContents() - for(var/i in 1 to 3) + for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/potassiodide(src) -/obj/item/storage/pill_bottle/probital - name = "bottle of probital pills" - desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting, may cause fatigue'." +/obj/item/storage/pill_bottle/bicaridine + name = "bottle of bicaridine pills" + desc = "Contains pills used to treat brute damage." -/obj/item/storage/pill_bottle/probital/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/reagent_containers/pill/probital(src) +/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/meralyne + name = "bottle of meralyne pills" + desc = "Contains pills used to treat brute damage." + +/obj/item/storage/pill_bottle/meralyne/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/meralyne(src) + +/obj/item/storage/pill_bottle/dermaline + name = "bottle of dermaline pills" + desc = "Used to treat second and third degree burns." + +/obj/item/storage/pill_bottle/dermaline/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/reagent_containers/pill/dermaline(src) /obj/item/storage/pill_bottle/iron name = "bottle of iron pills" desc = "Contains pills used to reduce blood loss slowly.The tag in the bottle states 'Only take one each five minutes'." /obj/item/storage/pill_bottle/iron/PopulateContents() - for(var/i in 1 to 4) + for(var/i in 1 to 7) new /obj/item/reagent_containers/pill/iron(src) -/obj/item/storage/pill_bottle/mannitol - name = "bottle of mannitol pills" +/obj/item/storage/pill_bottle/alkysine + name = "bottle of alkysine pills" desc = "Contains pills used to treat brain damage." -/obj/item/storage/pill_bottle/mannitol/PopulateContents() +/obj/item/storage/pill_bottle/alkysine/PopulateContents() for(var/i in 1 to 7) - new /obj/item/reagent_containers/pill/mannitol(src) + new /obj/item/reagent_containers/pill/alkysine(src) //Contains 4 pills instead of 7, and 5u pills instead of 50u (50u pills heal 250 brain damage, 5u pills heal 25) -/obj/item/storage/pill_bottle/mannitol/braintumor +/obj/item/storage/pill_bottle/alkysine/braintumor desc = "Contains diluted pills used to treat brain tumor symptoms. Take one when feeling lightheaded." -/obj/item/storage/pill_bottle/mannitol/braintumor/PopulateContents() +/obj/item/storage/pill_bottle/alkysine/braintumor/PopulateContents() for(var/i in 1 to 4) - new /obj/item/reagent_containers/pill/mannitol/braintumor(src) + new /obj/item/reagent_containers/pill/alkysine/braintumor(src) /obj/item/storage/pill_bottle/stimulant name = "bottle of stimulant pills" @@ -408,9 +434,10 @@ desc = "Contains patches used to treat brute and burn damage." /obj/item/storage/pill_bottle/mining/PopulateContents() - new /obj/item/reagent_containers/pill/patch/aiuri(src) for(var/i in 1 to 3) - new /obj/item/reagent_containers/pill/patch/libital(src) + new /obj/item/reagent_containers/pill/kelotane(src) + for(var/i in 1 to 3) + new /obj/item/reagent_containers/pill/bicaridine(src) /obj/item/storage/pill_bottle/zoom name = "suspicious pill bottle" @@ -444,30 +471,13 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/aranesp(src) -/obj/item/storage/pill_bottle/psicodine - name = "bottle of psicodine pills" +/obj/item/storage/pill_bottle/alkysine + name = "bottle of alkysine pills" desc = "Contains pills used to treat mental distress and traumas." -/obj/item/storage/pill_bottle/psicodine/PopulateContents() +/obj/item/storage/pill_bottle/alkysine/PopulateContents() for(var/i in 1 to 7) - new /obj/item/reagent_containers/pill/psicodine(src) - -/obj/item/storage/pill_bottle/penacid - name = "bottle of pentetic acid pills" - desc = "Contains pills to expunge radiation and toxins." - -/obj/item/storage/pill_bottle/penacid/PopulateContents() - for(var/i in 1 to 3) - new /obj/item/reagent_containers/pill/penacid(src) - - -/obj/item/storage/pill_bottle/neurine - name = "bottle of neurine pills" - desc = "Contains pills to treat non-severe mental traumas." - -/obj/item/storage/pill_bottle/neurine/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/pill/neurine(src) + new /obj/item/reagent_containers/pill/alkysine(src) /obj/item/storage/pill_bottle/maintenance_pill name = "bottle of maintenance pills" @@ -487,14 +497,6 @@ new /obj/item/reagent_containers/pill/maintenance(src) ///////////////////////////////////////// Psychologist inventory pillbottles -/obj/item/storage/pill_bottle/happinesspsych - name = "happiness pills" - desc = "Contains pills used as a last resort means to temporarily stabilize depression and anxiety. WARNING: side effects may include slurred speech, drooling, and severe addiction." - -/obj/item/storage/pill_bottle/happinesspsych/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/reagent_containers/pill/happinesspsych(src) - /obj/item/storage/pill_bottle/lsdpsych name = "mindbreaker toxin pills" desc = "!FOR THERAPEUTIC USE ONLY! Contains pills used to alleviate the symptoms of Reality Dissociation Syndrome." @@ -511,6 +513,14 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/paxpsych(src) +/obj/item/storage/pill_bottle/haloperidol + name = "haloperidol pill bottle" + desc = "Contains pills of a sedative that treats hallucinations and flushes narcotics from the system." + +/obj/item/storage/pill_bottle/haloperidol/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/haloperidol(src) + /obj/item/storage/organbox name = "organ transport box" desc = "An advanced box with an cooling mechanism that uses cryostylane or other cold reagents to keep the organs or bodyparts inside preserved." @@ -518,7 +528,6 @@ base_icon_state = "organbox" lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - throw_speed = 3 throw_range = 7 custom_premium_price = PAYCHECK_MEDIUM * 4 /// var to prevent it freezing the same things over and over @@ -534,76 +543,32 @@ /obj/item/food/icecream )) - create_reagents(100, TRANSPARENT) - START_PROCESSING(SSobj, src) - -/obj/item/storage/organbox/process(delta_time) - ///if there is enough coolant var - var/cool = FALSE - var/amount = min(reagents.get_reagent_amount(/datum/reagent/cryostylane), 0.05 * delta_time) - if(amount > 0) - reagents.remove_reagent(/datum/reagent/cryostylane, amount) - cool = TRUE - else - amount = min(reagents.get_reagent_amount(/datum/reagent/consumable/ice), 0.1 * delta_time) - if(amount > 0) - reagents.remove_reagent(/datum/reagent/consumable/ice, amount) - cool = TRUE - if(!cooling && cool) - cooling = TRUE - update_appearance() - for(var/C in contents) - freeze_contents(C) - return - if(cooling && !cool) - cooling = FALSE - update_appearance() - for(var/C in contents) - unfreeze_contents(C) - /obj/item/storage/organbox/update_icon_state() icon_state = "[base_icon_state][cooling ? "-working" : null]" return ..() -///freezes the organ and loops bodyparts like heads -/obj/item/storage/organbox/proc/freeze_contents(datum/source, obj/item/I) - SIGNAL_HANDLER - if(isinternalorgan(I)) - var/obj/item/organ/int_organ = I +/obj/item/storage/organbox/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + if(isinternalorgan(arrived)) + var/obj/item/organ/int_organ = arrived int_organ.organ_flags |= ORGAN_FROZEN return - if(istype(I, /obj/item/bodypart)) - var/obj/item/bodypart/B = I + if(istype(arrived, /obj/item/bodypart)) + var/obj/item/bodypart/B = arrived for(var/obj/item/organ/int_organ in B.contents) int_organ.organ_flags |= ORGAN_FROZEN -///unfreezes the organ and loops bodyparts like heads -/obj/item/storage/organbox/proc/unfreeze_contents(datum/source, obj/item/I) - SIGNAL_HANDLER - if(isinternalorgan(I)) - var/obj/item/organ/int_organ = I +/obj/item/storage/organbox/Exited(atom/movable/gone, direction) + . = ..() + if(isinternalorgan(gone)) + var/obj/item/organ/int_organ = gone int_organ.organ_flags &= ~ORGAN_FROZEN return - if(istype(I, /obj/item/bodypart)) - var/obj/item/bodypart/B = I + if(istype(gone, /obj/item/bodypart)) + var/obj/item/bodypart/B = gone for(var/obj/item/organ/int_organ in B.contents) int_organ.organ_flags &= ~ORGAN_FROZEN -/obj/item/storage/organbox/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) - var/obj/item/reagent_containers/RC = I - var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) - if(units) - to_chat(user, span_notice("You transfer [units] units of the solution to [src].")) - return - if(istype(I, /obj/item/plunger)) - to_chat(user, span_notice("You start furiously plunging [name].")) - if(do_after(user, src, 1 SECONDS)) - to_chat(user, span_notice("You finish plunging the [name].")) - reagents.clear_reagents() - return - return ..() - /obj/item/storage/organbox/suicide_act(mob/living/carbon/user) if(HAS_TRAIT(user, TRAIT_RESISTCOLD)) //if they're immune to cold, just do the box suicide var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD) diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm index f21ba8d40f82..c3429f65be07 100644 --- a/code/game/objects/items/storage/secure.dm +++ b/code/game/objects/items/storage/secure.dm @@ -79,14 +79,26 @@ /obj/item/storage/secure/attack_self(mob/user) var/locked = atom_storage.locked user.set_machine(src) - var/dat = text("[]
\n\nLock Status: []",src, (locked ? "LOCKED" : "UNLOCKED")) + var/dat = "[src]
\n\nLock Status: [(locked ? "LOCKED" : "UNLOCKED")]" var/message = "Code" if (lock_set == 0) - dat += text("

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
") - message = text("[]", entered_code) + dat += "

\n5-DIGIT PASSCODE NOT SET.
ENTER NEW PASSCODE.
" + message = entered_code if (!locked) message = "*****" - dat += text("


\n>[]
\n1-2-3
\n4-5-6
\n7-8-9
\nR-0-E
\n
", message) + dat += {" +
\n>[message]
\n1 +-2 +-3
\n +4 +-5 +-6
\n +7 +-8 +-9
\n +R +-0 +-E
\n
"} user << browse(dat, "window=caselock;size=300x280") /obj/item/storage/secure/Topic(href, href_list) @@ -112,7 +124,7 @@ entered_code = null atom_storage.hide_contents(usr) else - entered_code += text("[]", sanitize_text(href_list["type"])) + entered_code += sanitize_text(href_list["type"]) if (length(entered_code) > 5) entered_code = "ERROR" add_fingerprint(usr) @@ -133,12 +145,13 @@ desc = "A large briefcase with a digital locking system." force = 8 hitsound = SFX_SWING_HIT - throw_speed = 2 throw_range = 4 w_class = WEIGHT_CLASS_BULKY attack_verb_continuous = list("bashes", "batters", "bludgeons", "thrashes", "whacks") attack_verb_simple = list("bash", "batter", "bludgeon", "thrash", "whack") + storage_type = /datum/storage/latched_box + /obj/item/storage/secure/briefcase/PopulateContents() new /obj/item/paper(src) new /obj/item/pen(src) @@ -188,7 +201,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe, 32) return attack_self(user) /obj/item/storage/secure/safe/hos - name = "head of security's safe" + name = "security marshal'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. @@ -205,7 +218,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe, 32) 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, FIRE = 80, ACID = 70) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 70, BIO = 100, FIRE = 80, ACID = 70) max_integrity = 300 color = "#ffdd33" @@ -222,4 +235,4 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/item/storage/secure/safe/caps_spare, 32) new /obj/item/card/id/advanced/gold/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) + take_damage(damage_amount = 100, damage_type = BRUTE, damage_flag = BLUNT, armor_penetration = 100) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 18a4239840ba..30295b712514 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -2,6 +2,7 @@ name = "storage" icon = 'icons/obj/storage.dmi' w_class = WEIGHT_CLASS_NORMAL + var/tmp/storage_type = /datum/storage var/rummage_if_nodrop = TRUE /// Should we preload the contents of this type? /// BE CAREFUL, THERE'S SOME REALLY NASTY SHIT IN THIS TYPEPATH @@ -11,7 +12,7 @@ /obj/item/storage/Initialize(mapload) . = ..() - create_storage() + create_storage(type = storage_type) PopulateContents() @@ -21,15 +22,6 @@ /obj/item/storage/AllowDrop() return FALSE -/obj/item/storage/contents_explosion(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += contents - if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += contents - if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += contents - /obj/item/storage/canStrip(mob/who) . = ..() if(!. && rummage_if_nodrop) @@ -41,9 +33,7 @@ return TRUE return ..() -/obj/item/storage/contents_explosion(severity, target) //Cyberboss says: "USE THIS TO FILL IT, NOT INITIALIZE OR NEW" - /obj/item/storage/proc/PopulateContents() /obj/item/storage/proc/emptyStorage() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index 3904ec8ebdb9..1e34b9cce743 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -8,23 +8,28 @@ righthand_file = 'icons/mob/inhands/equipment/toolbox_righthand.dmi' flags_1 = CONDUCT_1 - force = 6 + force = 18 throwforce = 10 - throw_speed = 2 + throw_speed = 1.5 throw_range = 7 stamina_damage = 47 stamina_cost = 20 stamina_critical_chance = 10 + combat_click_delay = CLICK_CD_MELEE * 2.5 + block_chance = 10 w_class = WEIGHT_CLASS_BULKY custom_materials = list(/datum/material/iron = 500) attack_verb_continuous = list("robusts") attack_verb_simple = list("robust") hitsound = 'sound/weapons/smash.ogg' + block_sound = SFX_BLOCK_BIG_METAL drop_sound = 'sound/items/handling/toolbox_drop.ogg' pickup_sound = 'sound/items/handling/toolbox_pickup.ogg' material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR + + storage_type = /datum/storage/toolbox var/latches = "single_latch" var/has_latches = TRUE @@ -217,14 +222,14 @@ /obj/item/storage/toolbox/artistic/PopulateContents() new /obj/item/storage/crayons(src) new /obj/item/crowbar(src) - new /obj/item/stack/pipe_cleaner_coil/red(src) - new /obj/item/stack/pipe_cleaner_coil/yellow(src) - new /obj/item/stack/pipe_cleaner_coil/blue(src) - new /obj/item/stack/pipe_cleaner_coil/green(src) - new /obj/item/stack/pipe_cleaner_coil/pink(src) - new /obj/item/stack/pipe_cleaner_coil/orange(src) - new /obj/item/stack/pipe_cleaner_coil/cyan(src) - new /obj/item/stack/pipe_cleaner_coil/white(src) + new /obj/item/stack/cable_coil/red(src) + new /obj/item/stack/cable_coil/yellow(src) + new /obj/item/stack/cable_coil/blue(src) + new /obj/item/stack/cable_coil/green(src) + new /obj/item/stack/cable_coil/pink(src) + new /obj/item/stack/cable_coil/orange(src) + new /obj/item/stack/cable_coil/cyan(src) + new /obj/item/stack/cable_coil/white(src) /obj/item/storage/toolbox/ammo name = "ammo box" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 667ea63d0304..e1341900c94d 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -145,7 +145,7 @@ if(KIT_NUKEOPS_METAGAME) new /obj/item/mod/control/pre_equipped/nuclear(src) // 8 tc - new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc + new /obj/item/gun/ballistic/shotgun/bulldog(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc new /obj/item/ammo_box/magazine/m12g(src) // 2 tc new /obj/item/ammo_box/magazine/m12g(src) // 2 tc @@ -254,110 +254,6 @@ new /obj/item/implanter/freedom(src) new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent. - -/obj/item/storage/box/syndicate/contract_kit - name = "Contract Kit" - desc = "Supplied to Syndicate contractors." - icon_state = "syndiebox" - illustration = "writing_syndie" - var/list/item_list = list( - /obj/item/storage/backpack/duffelbag/syndie/x4, - /obj/item/storage/box/syndie_kit/throwing_weapons, - /obj/item/gun/syringe/syndicate, - /obj/item/pen/edagger, - /obj/item/pen/sleepy, - /obj/item/flashlight/emp, - /obj/item/reagent_containers/syringe/mulligan, - /obj/item/clothing/shoes/chameleon/noslip, - /obj/item/storage/medkit/tactical, - /obj/item/encryptionkey/syndicate, - /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, - /obj/item/storage/box/syndie_kit/imp_radio, - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, - /obj/item/reagent_containers/hypospray/medipen/stimulants, - /obj/item/storage/box/syndie_kit/imp_freedom, - /obj/item/crowbar/power/syndicate, - /obj/item/clothing/gloves/tackler/combat/insulated, - /obj/item/storage/box/syndie_kit/emp, - /obj/item/shield/energy, - /obj/item/healthanalyzer/rad_laser - ) - -/obj/item/storage/box/syndicate/contract_kit/PopulateContents() - new /obj/item/modular_computer/tablet/syndicate_contract_uplink(src) - new /obj/item/storage/box/syndicate/contractor_loadout(src) - new /obj/item/melee/baton/telescopic/contractor_baton(src) - - // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. - for(var/iteration in 1 to SMALL_ITEM_AMOUNT) - var/obj/item/small_item = pick_n_take(item_list) - new small_item(src) - - // Paper guide - new /obj/item/paper/contractor_guide(src) - -/obj/item/storage/box/syndicate/contractor_loadout - name = "Standard Loadout" - desc = "Supplied to Syndicate contractors, providing their specialised MODSuit and chameleon uniform." - icon_state = "syndiebox" - illustration = "writing_syndie" - -/obj/item/storage/box/syndicate/contractor_loadout/PopulateContents() - new /obj/item/mod/control/pre_equipped/contractor(src) - new /obj/item/clothing/under/chameleon(src) - new /obj/item/clothing/mask/chameleon(src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) - new /obj/item/card/id/advanced/chameleon(src) - new /obj/item/lighter(src) - new /obj/item/jammer(src) - - -/obj/item/storage/box/syndicate/contract_kit/midround - name = "Contract Kit" - item_list = list( - /obj/item/storage/backpack/duffelbag/syndie/x4, - /obj/item/storage/box/syndie_kit/throwing_weapons, - /obj/item/gun/syringe/syndicate, - /obj/item/pen/edagger, - /obj/item/pen/sleepy, - /obj/item/flashlight/emp, - /obj/item/reagent_containers/syringe/mulligan, - /obj/item/storage/medkit/tactical, - /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, - /obj/item/storage/box/syndie_kit/imp_radio, - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot, - /obj/item/reagent_containers/hypospray/medipen/stimulants, - /obj/item/storage/box/syndie_kit/imp_freedom, - /obj/item/crowbar/power/syndicate, - /obj/item/clothing/gloves/tackler/combat/insulated, - /obj/item/storage/box/syndie_kit/emp, - /obj/item/shield/energy, - /obj/item/healthanalyzer/rad_laser - ) - -/obj/item/storage/box/syndicate/contract_kit/midround/PopulateContents() - // All about 4 TC or less - some nukeops only items, but fit nicely to the theme. - for(var/iteration in 1 to SMALL_ITEM_AMOUNT) - var/obj/item/small_item = pick_n_take(item_list) - new small_item(src) - - // Paper guide - new /obj/item/paper/contractor_guide/midround(src) - new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(src) - new /obj/item/lighter(src) - new /obj/item/jammer(src) - -/obj/item/storage/box/contractor/fulton_extraction - name = "Fulton Extraction Kit" - icon_state = "syndiebox" - illustration = "writing_syndie" - -/obj/item/storage/box/contractor/fulton_extraction/PopulateContents() - new /obj/item/extraction_pack/contractor(src) - new /obj/item/fulton_core(src) - /obj/item/storage/box/syndie_kit name = "box" desc = "A sleek, sturdy box." @@ -404,13 +300,6 @@ for(var/i in 1 to 7) new /obj/item/reagent_containers/syringe/bioterror(src) -/obj/item/storage/box/syndie_kit/clownpins - name = "ultra hilarious firing pin box" - -/obj/item/storage/box/syndie_kit/clownpins/PopulateContents() - for(var/i in 1 to 7) - new /obj/item/firing_pin/clown/ultra(src) - /obj/item/storage/box/syndie_kit/imp_storage name = "storage implant box" @@ -465,14 +354,12 @@ new /obj/item/reagent_containers/glass/bottle/polonium(src) new /obj/item/reagent_containers/glass/bottle/venom(src) new /obj/item/reagent_containers/glass/bottle/fentanyl(src) - new /obj/item/reagent_containers/glass/bottle/formaldehyde(src) - new /obj/item/reagent_containers/glass/bottle/spewium(src) new /obj/item/reagent_containers/glass/bottle/cyanide(src) new /obj/item/reagent_containers/glass/bottle/histamine(src) new /obj/item/reagent_containers/glass/bottle/initropidril(src) new /obj/item/reagent_containers/glass/bottle/pancuronium(src) new /obj/item/reagent_containers/glass/bottle/sodium_thiopental(src) - new /obj/item/reagent_containers/glass/bottle/coniine(src) + new /obj/item/reagent_containers/glass/bottle/lexorin(src) new /obj/item/reagent_containers/glass/bottle/curare(src) new /obj/item/reagent_containers/glass/bottle/amanitin(src) new /obj/item/reagent_containers/syringe(src) diff --git a/code/game/objects/items/storage/wallets.dm b/code/game/objects/items/storage/wallets.dm index 0f3ce86c5e41..fb59c86fdd68 100644 --- a/code/game/objects/items/storage/wallets.dm +++ b/code/game/objects/items/storage/wallets.dm @@ -1,89 +1,44 @@ /obj/item/storage/wallet name = "wallet" - desc = "It can hold a few small and personal things." + desc = "An old leather wallet with RFID blocking potential." icon_state = "wallet" w_class = WEIGHT_CLASS_SMALL resistance_flags = FLAMMABLE slot_flags = ITEM_SLOT_ID + /// Is the wallet open? + var/is_open = FALSE + /// The ID that is visible and functional if the wallet is open. var/obj/item/card/id/front_id = null - var/list/combined_access + var/cached_flat_icon /obj/item/storage/wallet/Initialize() . = ..() + atom_storage.animated = FALSE + atom_storage.rustle_sound = null + atom_storage.open_sound = null + atom_storage.close_sound = null atom_storage.max_slots = 4 - atom_storage.set_holdable(list( - /obj/item/stack/spacecash, - /obj/item/holochip, - /obj/item/card, - /obj/item/clothing/mask/cigarette, - /obj/item/flashlight/pen, - /obj/item/seeds, - /obj/item/stack/medical, - /obj/item/toy/crayon, - /obj/item/coin, - /obj/item/dice, - /obj/item/disk, - /obj/item/implanter, - /obj/item/lighter, - /obj/item/lipstick, - /obj/item/match, - /obj/item/paper, - /obj/item/pen, - /obj/item/photo, - /obj/item/reagent_containers/dropper, - /obj/item/reagent_containers/syringe, - /obj/item/reagent_containers/pill, - /obj/item/screwdriver, - /obj/item/stamp), - list(/obj/item/screwdriver/power)) + atom_storage.max_specific_storage = WEIGHT_CLASS_TINY + atom_storage.max_total_storage = WEIGHT_CLASS_TINY * 4 + + RegisterSignal(atom_storage, COMSIG_STORAGE_CAN_INSERT, PROC_REF(can_insert_item)) + RegisterSignal(atom_storage, COMSIG_STORAGE_ATTEMPT_OPEN, PROC_REF(on_attempt_open_storage)) + register_context() + update_appearance() + +/obj/item/storage/wallet/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + context[SCREENTIP_CONTEXT_RMB] = is_open ? "Close" : "Open" + context[SCREENTIP_CONTEXT_ALT_LMB] = is_open ? "Close" : "Open" + return CONTEXTUAL_SCREENTIP_SET /obj/item/storage/wallet/Exited(atom/movable/gone, direction) . = ..() if(istype(gone, /obj/item/card/id)) refreshID() -/** - * Calculates the new front ID. - * - * Picks the ID card that has the most combined command or higher tier accesses. - */ -/obj/item/storage/wallet/proc/refreshID() - LAZYCLEARLIST(combined_access) - - front_id = null - var/winning_tally = 0 - var/is_magnetic_found = FALSE - for(var/obj/item/card/id/id_card in contents) - // Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this. - if(!is_magnetic_found && HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD)) - front_id = id_card - is_magnetic_found = TRUE - - if(!is_magnetic_found) - var/card_tally = SSid_access.tally_access(id_card, ACCESS_FLAG_COMMAND) - if(card_tally > winning_tally) - winning_tally = card_tally - front_id = id_card - - LAZYINITLIST(combined_access) - combined_access |= id_card.access - - // If we didn't pick a front ID - Maybe none of our cards have any command accesses? Just grab the first card (if we even have one). - // We could also have no ID card in the wallet at all, which will mean we end up with a null front_id and that's fine too. - if(!front_id) - front_id = (locate(/obj/item/card/id) in contents) - - if(ishuman(loc)) - var/mob/living/carbon/human/wearing_human = loc - if(wearing_human.wear_id == src) - wearing_human.sec_hud_set_ID() - - update_label() - update_appearance(UPDATE_ICON) - update_slot_icon() - /obj/item/storage/wallet/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) . = ..() if(istype(arrived, /obj/item/card/id)) @@ -92,40 +47,50 @@ /obj/item/storage/wallet/update_overlays() . = ..() cached_flat_icon = null - if(!front_id) + if(!is_open) return - . += mutable_appearance(front_id.icon, front_id.icon_state) - . += front_id.overlays - . += mutable_appearance(icon, "wallet_overlay") - -/obj/item/storage/wallet/proc/get_cached_flat_icon() - if(!cached_flat_icon) - cached_flat_icon = getFlatIcon(src) - return cached_flat_icon -/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE) + . += image(icon, "wallet_underlay") if(front_id) - return "[icon2html(get_cached_flat_icon(), user)] [thats? "That's ":""][get_examine_name(user)]" //displays all overlays in chat - return ..() + . += image(front_id.icon, front_id.icon_state) + . += front_id.overlays + . += image(icon, "wallet_overlay") -/obj/item/storage/wallet/proc/update_label() - if(front_id) - name = "wallet displaying [front_id]" +/obj/item/storage/wallet/attack_self(mob/user, modifiers) + . = ..() + if(.) + return + + if(is_open) + close() else - name = "wallet" + open() -/obj/item/storage/wallet/examine() +/obj/item/storage/wallet/attack_hand_secondary(mob/user, list/modifiers) + if(is_open) + close() + else + open() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/storage/wallet/AltClick(mob/user) . = ..() - if(front_id) - . += span_notice("Alt-click to remove the id.") + if(!.) + return + + if(is_open) + close() + else + open() /obj/item/storage/wallet/get_id_examine_strings(mob/user) . = ..() - if(front_id) + if(front_id && is_open) . += front_id.get_id_examine_strings(user) -/obj/item/storage/wallet/GetID() - return front_id +/obj/item/storage/wallet/GetID(bypass_wallet) + if(is_open || bypass_wallet) + return front_id /obj/item/storage/wallet/RemoveID() if(!front_id) @@ -133,21 +98,106 @@ . = front_id front_id.forceMove(get_turf(src)) -/obj/item/storage/wallet/InsertID(obj/item/inserting_item) +/obj/item/storage/wallet/InsertID(obj/item/inserting_item, force) var/obj/item/card/inserting_id = inserting_item.RemoveID() if(!inserting_id) return FALSE - attackby(inserting_id) - if(inserting_id in contents) - return TRUE - return FALSE + return atom_storage.attempt_insert(inserting_item, force = force) /obj/item/storage/wallet/GetAccess() - if(LAZYLEN(combined_access)) - return combined_access + if(is_open && front_id) + return front_id.GetAccess() else return ..() +/obj/item/storage/wallet/get_examine_string(mob/user, thats = FALSE) + if(front_id && is_open) + var/that_string = gender == PLURAL ? "Those are " : "That is " + return "[icon2html(get_cached_flat_icon(), user)] [thats? that_string : ""][get_examine_name(user)]" //displays all overlays in chat + return ..() + +/obj/item/storage/wallet/proc/open() + SIGNAL_HANDLER + if(is_open) + return + + is_open = TRUE + update_appearance() + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.sec_hud_set_ID() + +/obj/item/storage/wallet/proc/close() + if(!is_open) + return + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.sec_hud_set_ID() + + is_open = FALSE + atom_storage.close_all() + update_appearance() + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.sec_hud_set_ID() + +/obj/item/storage/wallet/proc/get_cached_flat_icon() + if(!cached_flat_icon) + cached_flat_icon = getFlatIcon(src) + return cached_flat_icon + +/obj/item/storage/wallet/update_name() + . = ..() + if(front_id && is_open) + name = "wallet displaying \a [front_id.name]" + else + name = "wallet" + +/obj/item/storage/wallet/proc/on_attempt_open_storage(datum/storage/source, mob/user) + SIGNAL_HANDLER + if(!is_open) + return STORAGE_INTERRUPT_OPEN + +/obj/item/storage/wallet/proc/can_insert_item(datum/storage/source, obj/item/I, mob/user, messages, force) + SIGNAL_HANDLER + if(!is_open && user) + return STORAGE_NO_INSERT + +/obj/item/storage/wallet/proc/id_icon_updated(datum/source) + SIGNAL_HANDLER + update_appearance() + +/** + * Calculates the new front ID. + * + * Picks the ID card that has the most combined command or higher tier accesses. + */ +/obj/item/storage/wallet/proc/refreshID() + if(front_id) + UnregisterSignal(front_id, COMSIG_ATOM_UPDATED_ICON) + + front_id = null + for(var/obj/item/card/id/id_card in contents) + // Certain IDs can forcibly jump to the front so they can disguise other cards in wallets. Chameleon/Agent ID cards are an example of this. + if(HAS_TRAIT(id_card, TRAIT_MAGNETIC_ID_CARD)) + front_id = id_card + break + + if(!front_id) + front_id = locate(/obj/item/card/id) in contents + + if(front_id) + RegisterSignal(front_id, COMSIG_ATOM_UPDATED_ICON, PROC_REF(id_icon_updated)) + + if(ishuman(loc)) + var/mob/living/carbon/human/wearing_human = loc + if(wearing_human.wear_id == src) + wearing_human.sec_hud_set_ID() + + update_appearance() + update_slot_icon() + /obj/item/storage/wallet/random icon_state = "random_wallet" // for mapping purposes @@ -156,5 +206,8 @@ icon_state = "wallet" /obj/item/storage/wallet/random/PopulateContents() - new /obj/item/holochip(src, rand(5, 30)) + SSeconomy.spawn_cash_for_amount(rand(5, 30), src) new /obj/effect/spawner/random/entertainment/wallet_storage(src) + +/obj/item/storage/wallet/open + is_open = TRUE diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 51d699be395b..bdbbaea0d51f 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -11,7 +11,7 @@ var/gas_type = GAS_OXYGEN var/on = FALSE var/stabilizers = FALSE - var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not + var/full_speed = FALSE // If the jetpack will have a speedboost in space/nograv or not var/datum/callback/get_mover var/datum/callback/check_on_move diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 3ddcbe41bba1..79c5ceb0a6fd 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -17,7 +17,7 @@ slot_flags = ITEM_SLOT_BACK worn_icon = 'icons/mob/clothing/back.dmi' //since these can also get thrown into suit storage slots. if something goes on the belt, set this to null. hitsound = 'sound/weapons/smash.ogg' - + w_class = WEIGHT_CLASS_BULKY force = 5 throwforce = 10 @@ -29,8 +29,9 @@ custom_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, FIRE = 80, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 80, ACID = 30) integrity_failure = 0.5 + /// The gases this tank contains. Don't modify this directly, use return_air() to get it instead var/datum/gas_mixture/air_contents = null /// The volume of this tank. Among other things gas tank explosions (including TTVs) scale off of this. Be sure to account for that if you change this or you will break ~~toxins~~ordinance. @@ -48,36 +49,8 @@ /// List containing reactions happening inside our tank. var/list/reaction_info -/obj/item/tank/ui_action_click(mob/user) - toggle_internals(user) - -/obj/item/tank/proc/toggle_internals(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - return - - if(H.internal == src) - to_chat(H, span_notice("You close [src] valve.")) - H.internal = null - else - if(!H.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(!H.wear_mask) - to_chat(H, span_warning("You need a mask!")) - return - var/is_clothing = isclothing(H.wear_mask) - if(is_clothing && H.wear_mask.mask_adjusted) - H.wear_mask.adjustmask(H) - if(!is_clothing || !(H.wear_mask.clothing_flags & MASKINTERNALS)) - to_chat(H, span_warning("[H.wear_mask] can't use [src]!")) - return - - if(H.internal) - to_chat(H, span_notice("You switch your internals to [src].")) - else - to_chat(H, span_notice("You open [src] valve.")) - H.internal = src - H?.update_mob_action_buttons() - + /// Mob that is currently breathing from the tank. + var/mob/living/carbon/breathing_mob = null /obj/item/tank/Initialize(mapload) . = ..() @@ -97,15 +70,12 @@ RegisterSignal(air_contents, COMSIG_GASMIX_MERGED, PROC_REF(merging_information)) START_PROCESSING(SSobj, src) + if(tank_holder_icon_state) + AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state) /obj/item/tank/proc/populate_gas() return -/obj/item/tank/ComponentInitialize() - . = ..() - if(tank_holder_icon_state) - AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state) - /obj/item/tank/Destroy() UnregisterSignal(air_contents, COMSIG_GASMIX_MERGED) air_contents = null @@ -149,6 +119,39 @@ playsound(location, 'sound/effects/spray.ogg', 10, TRUE, -3) return ..() +/obj/item/tank/ui_action_click(mob/user) + toggle_internals(user) + +/// Attempts to toggle the mob's internals on or off using this tank. Returns TRUE if successful. +/obj/item/tank/proc/toggle_internals(mob/living/carbon/mob_target) + return mob_target.toggle_internals(src) + +/// Closes the tank if dropped while open. +/obj/item/tank/dropped(mob/living/user, silent) + . = ..() + // Close open air tank if its current user got sent to the shadowrealm. + if (QDELETED(breathing_mob)) + breathing_mob = null + return + // Close open air tank if it got dropped by it's current user. + if (loc != breathing_mob) + breathing_mob.cutoff_internals() + +/// Closes the tank if given to another mob while open. +/obj/item/tank/equipped(mob/living/user, slot, initial) + . = ..() + // Close open air tank if it was equipped by a mob other than the current user. + if (breathing_mob && (user != breathing_mob)) + breathing_mob.cutoff_internals() + +/// Called by carbons after they connect the tank to their breathing apparatus. +/obj/item/tank/proc/after_internals_opened(mob/living/carbon/carbon_target) + breathing_mob = carbon_target + +/// Called by carbons after they disconnect the tank from their breathing apparatus. +/obj/item/tank/proc/after_internals_closed(mob/living/carbon/carbon_target) + breathing_mob = null + /obj/item/tank/suicide_act(mob/user) var/mob/living/carbon/human/H = user user.visible_message(span_suicide("[user] is putting [src]'s valve to [user.p_their()] lips! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -162,7 +165,7 @@ return SHAME /obj/item/tank/attackby(obj/item/W, mob/user, params) - add_fingerprint(user) + W.leave_evidence(user, src) if(istype(W, /obj/item/assembly_holder)) bomb_assemble(W, user) return TRUE @@ -192,10 +195,10 @@ "releasePressure" = round(distribute_pressure) ) - var/mob/living/carbon/C = user - if(!istype(C)) - C = loc.loc - if(istype(C) && C.internal == src) + var/mob/living/carbon/carbon_user = user + if(!istype(carbon_user)) + carbon_user = loc + if(istype(carbon_user) && (carbon_user.external == src || carbon_user.internal == src)) .["connected"] = TRUE /obj/item/tank/ui_act(action, params) @@ -272,7 +275,7 @@ excited = (excited | leaking) if(!excited) - STOP_PROCESSING(SSobj, src) + . = PROCESS_KILL excited = FALSE if(QDELETED(src) || !leaking || !air_contents) diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 700e07734bfc..ebd9495cad3d 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, FIRE = 100, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF var/obj/item/noz @@ -147,7 +147,7 @@ desc = "A janitorial cleaner backpack with nozzle to clean blood and graffiti." icon_state = "waterbackpackjani" inhand_icon_state = "waterbackpackjani" - custom_price = PAYCHECK_EASY * 5 + custom_price = PAYCHECK_ASSISTANT * 5 /obj/item/watertank/janitor/Initialize(mapload) . = ..() @@ -309,7 +309,7 @@ balloon_alert(user, "still recharging!") return COOLDOWN_START(src, resin_cooldown, 10 SECONDS) - R.remove_any(100) + R.remove_all(100) var/obj/effect/resin_container/resin = new (get_turf(src)) log_game("[key_name(user)] used Resin Launcher at [AREACOORD(user)].") playsound(src,'sound/items/syringeproj.ogg',40,TRUE) @@ -324,21 +324,21 @@ balloon_alert(user, "too far!") return for(var/S in target) - if(istype(S, /obj/effect/particle_effect/foam/metal/resin) || istype(S, /obj/structure/foamedmetal/resin)) + if(istype(S, /obj/effect/particle_effect/fluid/foam/metal/resin) || istype(S, /obj/structure/foamedmetal/resin)) balloon_alert(user, "already has resin!") return if(metal_synthesis_cooldown < 5) - var/obj/effect/particle_effect/foam/metal/resin/F = new (get_turf(target)) - F.amount = 0 + var/obj/effect/particle_effect/fluid/foam/metal/resin/foam = new (get_turf(target)) + foam.group.target_size = 0 metal_synthesis_cooldown++ addtimer(CALLBACK(src, PROC_REF(reduce_metal_synth_cooldown)), 10 SECONDS) else balloon_alert(user, "still being synthesized!") return -/obj/item/extinguisher/mini/nozzle/proc/resin_stop_check(datum/move_loop/source, succeeded) +/obj/item/extinguisher/mini/nozzle/proc/resin_stop_check(datum/move_loop/source, result) SIGNAL_HANDLER - if(succeeded) + if(result == MOVELOOP_SUCCESS) return resin_landed(source) qdel(source) @@ -363,8 +363,9 @@ anchored = TRUE /obj/effect/resin_container/proc/Smoke() - var/obj/effect/particle_effect/foam/metal/resin/S = new /obj/effect/particle_effect/foam/metal/resin(get_turf(loc)) - S.amount = 4 + var/datum/effect_system/fluid_spread/foam/metal/resin/foaming = new + foaming.set_up(4, holder = src, location = loc) + foaming.start() playsound(src,'sound/effects/bamf.ogg',100,TRUE) qdel(src) @@ -421,7 +422,7 @@ turn_on() //Todo : cache these. -/obj/item/reagent_containers/chemtank/worn_overlays(mutable_appearance/standing, isinhands = FALSE) //apply chemcolor and level +/obj/item/reagent_containers/chemtank/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) //apply chemcolor and level . = ..() //inhands + reagent_filling if(isinhands || !reagents.total_volume) diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index e8b59924cf86..4d6e356dc8e4 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -21,7 +21,6 @@ inhand_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=400) var/tracking_range = 20 @@ -43,7 +42,7 @@ if (sr) // Check every teleport beacon. var/list/tele_beacons = list() - for(var/obj/item/beacon/W in GLOB.teleportbeacons) + for(var/obj/item/beacon/W as anything in INSTANCES_OF(/obj/item/beacon)) // Get the tracking beacon's turf location. var/turf/tr = get_turf(W) @@ -108,10 +107,9 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 5 custom_materials = list(/datum/material/iron=10000) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/list/active_portal_pairs var/max_portal_pairs = 3 @@ -165,7 +163,7 @@ return var/list/locations = list() - for(var/obj/machinery/computer/teleporter/computer in GLOB.machines) + for(var/obj/machinery/computer/teleporter/computer as anything in INSTANCES_OF(/obj/machinery/computer/teleporter)) var/atom/target = computer.target_ref?.resolve() if(!target) computer.target_ref = null diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index dfe6df5024d4..5a286cd37ca8 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -169,7 +169,8 @@ return -/obj/item/nuke_core/supermatter_sliver/can_be_pulled(user) // no drag memes +/obj/item/nuke_core/supermatter_sliver/can_be_grabbed(mob/living/grabber, target_zone, force) + // no drag memes return FALSE /obj/item/nuke_core/supermatter_sliver/attackby(obj/item/W, mob/living/user, params) diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index f8f8dad9afa3..13dad45a4346 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -1,22 +1,27 @@ /obj/item/crowbar - name = "pocket crowbar" - desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors." + name = "crowbar" + desc = "A steel crowbar for gaining entry into places you should not be." icon = 'icons/obj/tools.dmi' - icon_state = "crowbar" + icon_state = "crowbar_large" lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' + inhand_icon_state = "crowbar" + worn_icon_state = "crowbar" + usesound = 'sound/items/crowbar.ogg' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT - force = 7 + force = 14 throwforce = 7 + throw_range = 5 + stamina_damage = 35 stamina_cost = 12 stamina_critical_chance = 10 - w_class = WEIGHT_CLASS_SMALL - custom_materials = list(/datum/material/iron=50) + w_class = WEIGHT_CLASS_NORMAL + custom_materials = list(/datum/material/iron=70) drop_sound = 'sound/items/handling/crowbar_drop.ogg' pickup_sound = 'sound/items/handling/crowbar_pickup.ogg' @@ -24,7 +29,7 @@ attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack") tool_behaviour = TOOL_CROWBAR toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) var/force_opens = FALSE /obj/item/crowbar/suicide_act(mob/user) @@ -32,10 +37,18 @@ playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) return (BRUTELOSS) +/obj/item/crowbar/get_misssound() + return pick('sound/weapons/swing/swing_crowbar.ogg', 'sound/weapons/swing/swing_crowbar2.ogg', 'sound/weapons/swing/swing_crowbar3.ogg') + /obj/item/crowbar/red icon_state = "crowbar_red" force = 8 +/obj/item/crowbar/red/suicide_act(mob/user) + user.visible_message(span_suicide("[user]'s body turns limp and collapses to the ground as [user.p_they()] smashes [user.p_their()] head in with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) + playsound(loc, 'sound/health/flatline.ogg', 50, FALSE, -1) + return (BRUTELOSS) + /obj/item/crowbar/abductor name = "alien crowbar" desc = "A hard-light crowbar. It appears to pry by itself, without any effort required." @@ -47,32 +60,30 @@ toolspeed = 0.1 -/obj/item/crowbar/large - name = "crowbar" - desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big." - force = 12 - w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 - throw_range = 3 - custom_materials = list(/datum/material/iron=70) - icon_state = "crowbar_large" - inhand_icon_state = "crowbar" - worn_icon_state = "crowbar" - toolspeed = 0.7 +/obj/item/crowbar/pocket + name = "compact crowbar" + desc = "A small steel crowbar." + force = 10 + w_class = WEIGHT_CLASS_SMALL + throw_range = 7 + custom_materials = list(/datum/material/iron=50) + icon_state = "crowbar" + toolspeed = 1.7 -/obj/item/crowbar/large/heavy //from space ruin +/obj/item/crowbar/heavy //from space ruin name = "heavy crowbar" - desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.." + desc = "It feels oddly heavy.." force = 20 + throw_range = 3 icon_state = "crowbar_powergame" -/obj/item/crowbar/large/old +/obj/item/crowbar/old name = "old crowbar" - desc = "It's an old crowbar. Much larger than the pocket sized ones, carrying a lot more heft. They don't make 'em like they used to." + desc = "It's an old crowbar. They don't make 'em like they used to." throwforce = 10 - throw_speed = 2 + throw_speed = 1.5 -/obj/item/crowbar/large/old/Initialize() +/obj/item/crowbar/old/Initialize() . = ..() if(prob(50)) icon_state = "crowbar_powergame" @@ -115,7 +126,6 @@ return COMPONENT_NO_DEFAULT_MESSAGE /obj/item/crowbar/power/syndicate - name = "Syndicate jaws of life" desc = "A re-engineered copy of Daedalus' standard jaws of life. Can be used to force open airlocks in its crowbar configuration." icon_state = "jaws_syndie" toolspeed = 0.5 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 49ca69ef9f5f..babf7d4337a8 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -14,7 +14,6 @@ force = 5 throwforce = 5 - throw_speed = 3 throw_range = 5 stamina_cost = 5 stamina_damage = 10 @@ -28,7 +27,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, FIRE = 50, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) drop_sound = 'sound/items/handling/screwdriver_drop.ogg' pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' sharpness = SHARP_POINTY @@ -89,7 +88,7 @@ force = 8 //might or might not be too high, subject to change w_class = WEIGHT_CLASS_SMALL throwforce = 8 - throw_speed = 2 + throw_speed = 1.5 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_continuous = list("drills", "screws", "jabs", "whacks") attack_verb_simple = list("drill", "screw", "jab", "whack") @@ -127,7 +126,7 @@ /obj/item/screwdriver/power/examine() . = ..() - . += " It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit." + . += span_notice("It's fitted with a [tool_behaviour == TOOL_SCREWDRIVER ? "screw" : "bolt"] bit.") /obj/item/screwdriver/power/suicide_act(mob/user) if(tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 92b41dfbc40b..3d36b14ed541 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -1,5 +1,5 @@ /// How many seconds between each fuel depletion tick ("use" proc) -#define WELDER_FUEL_BURN_INTERVAL 26 +#define WELDER_FUEL_BURN_INTERVAL 9 /obj/item/weldingtool name = "welding tool" desc = "A standard edition welder provided by Nanotrasen." @@ -17,15 +17,14 @@ usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg') drop_sound = 'sound/items/handling/weldingtool_drop.ogg' pickup_sound = 'sound/items/handling/weldingtool_pickup.ogg' - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 2 light_power = 0.75 light_color = LIGHT_COLOR_FIRE light_on = FALSE - 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, FIRE = 100, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 30) resistance_flags = FIRE_PROOF heat = 3800 tool_behaviour = TOOL_WELDER @@ -46,11 +45,12 @@ create_reagents(max_fuel) reagents.add_reagent(/datum/reagent/fuel, max_fuel) update_appearance() - -/obj/item/weldingtool/ComponentInitialize() - . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) - AddElement(/datum/element/tool_flash, light_outer_range) + AddElement(/datum/element/tool_flash, 2) + +/obj/item/weldingtool/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() /obj/item/weldingtool/update_icon_state() if(welding) @@ -85,7 +85,7 @@ damtype = BRUTE update_appearance() if(!can_off_process) - STOP_PROCESSING(SSobj, src) + . = PROCESS_KILL return //This is to start fires. process() is only called if the welder is on. @@ -112,7 +112,7 @@ dyn_explosion(src, plasmaAmount/5, explosion_cause = src)//20 plasma in a standard welder has a 4 power explosion. no breaches, but enough to kill/dismember holder qdel(src) -/obj/item/weldingtool/use_tool(atom/target, mob/living/user, delay, amount, volume, datum/callback/extra_checks) +/obj/item/weldingtool/use_tool(atom/target, mob/living/user, delay, amount, volume, datum/callback/extra_checks, interaction_key) target.add_overlay(GLOB.welding_sparks) . = ..() target.cut_overlay(GLOB.welding_sparks) @@ -121,7 +121,7 @@ if(!istype(attacked_humanoid)) return ..() - var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = attacked_humanoid.get_bodypart(deprecise_zone(user.zone_selected)) if(affecting && !IS_ORGANIC_LIMB(affecting) && !user.combat_mode) if(src.use_tool(attacked_humanoid, user, 0, volume=50, amount=1)) @@ -255,7 +255,7 @@ /obj/item/weldingtool/examine(mob/user) . = ..() - . += "It contains [get_fuel()] unit\s of fuel out of [max_fuel]." + . += span_notice("It contains [get_fuel()] unit\s of fuel out of [max_fuel].") /obj/item/weldingtool/get_temperature() return welding * heat diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 830a51ee2634..02d7506422c7 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -14,7 +14,6 @@ slot_flags = ITEM_SLOT_BELT force = 6 - throw_speed = 3 throw_range = 7 stamina_damage = 15 stamina_cost = 10 @@ -30,7 +29,7 @@ pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg' tool_behaviour = TOOL_WIRECUTTER toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) /// If the item should be assigned a random color var/random_color = TRUE /// List of possible random colors diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index b6b34b358bf7..da1f5380f18b 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -25,7 +25,7 @@ attack_verb_simple = list("bash", "batter", "bludgeon", "whack") tool_behaviour = TOOL_WRENCH toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 30) /obj/item/wrench/suicide_act(mob/user) user.visible_message(span_suicide("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) diff --git a/code/game/objects/items/toy_mechs.dm b/code/game/objects/items/toy_mechs.dm index 9a6efc2ad8b1..7db57b670b1c 100644 --- a/code/game/objects/items/toy_mechs.dm +++ b/code/game/objects/items/toy_mechs.dm @@ -266,7 +266,7 @@ /** * Override the say proc if they're mute */ -/obj/item/toy/mecha/say() +/obj/item/toy/mecha/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(!quiet) . = ..() @@ -360,7 +360,7 @@ span_danger("[src] and [attacker] clash dramatically, causing sparks to fly!"), \ span_hear("You hear hard plastic rubbing against hard plastic."), COMBAT_MESSAGE_RANGE) if(5) //both win - playsound(attacker, 'sound/weapons/parry.ogg', 20, TRUE) + playsound(attacker, 'sound/weapons/block/parry_metal.ogg', 20, TRUE) if(prob(50)) attacker_controller.visible_message(span_danger("[src]'s attack deflects off of [attacker]."), \ span_danger("[src]'s attack deflects off of [attacker]."), \ diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index d3bd5672db0e..f2a198164a38 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -29,7 +29,6 @@ */ /obj/item/toy throwforce = 0 - throw_speed = 3 throw_range = 7 force = 0 @@ -46,9 +45,6 @@ /obj/item/toy/waterballoon/Initialize(mapload) . = ..() create_reagents(10) - -/obj/item/toy/waterballoon/ComponentInitialize() - . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) /obj/item/toy/waterballoon/attack(mob/living/carbon/human/M, mob/user) @@ -126,7 +122,6 @@ righthand_file = 'icons/mob/inhands/balloons_righthand.dmi' w_class = WEIGHT_CLASS_BULKY throwforce = 0 - throw_speed = 3 throw_range = 7 force = 0 var/random_color = TRUE @@ -177,22 +172,6 @@ inhand_icon_state = "syndballoon" random_color = FALSE -/obj/item/toy/balloon/syndicate/pickup(mob/user) - . = ..() - if(user && user.mind && user.mind.has_antag_datum(/datum/antagonist, TRUE)) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) - -/obj/item/toy/balloon/syndicate/dropped(mob/user) - if(user) - SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) - . = ..() - -/obj/item/toy/balloon/syndicate/Destroy() - if(ismob(loc)) - var/mob/M = loc - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "badass_antag", /datum/mood_event/badass_antag) - . = ..() - /obj/item/toy/balloon/arrest name = "arreyst balloon" desc = "A half inflated balloon about a boyband named Arreyst that was popular about ten years ago, famous for making fun of red jumpsuits as unfashionable." @@ -284,15 +263,16 @@ user.ghostize(FALSE) // get the fuck out of our body return var/obj/item/bodypart/chest/CH = user.get_bodypart(BODY_ZONE_CHEST) - if(CH.cavity_item) // if he's (un)bright enough to have a round and full belly... + if(length(CH.cavity_items)) // if he's (un)bright enough to have a round and full belly... user.visible_message(span_danger("[user] regurgitates [src]!")) // I swear i dont have a fetish user.vomit(100, TRUE, distance = 0) user.adjustOxyLoss(120) user.dropItemToGround(src) // incase the crit state doesn't drop the singulo to the floor user.set_suicide(FALSE) return - user.transferItemToLoc(src, user, TRUE) - CH.cavity_item = src // The mother came inside and found Andy, dead with a HUGE belly full of toys + + user.transferItemToLoc(src, CH, TRUE, TRUE) + CH.add_cavity_item(src) // The mother came inside and found Andy, dead with a HUGE belly full of toys user.adjustOxyLoss(200) // You know how most small toys in the EU have that 3+ onion head icon and a warning that says "Unsuitable for children under 3 years of age due to small parts - choking hazard"? This is why. user.death(FALSE) user.ghostize(FALSE) @@ -531,16 +511,17 @@ /obj/item/dualsaber/toy name = "double-bladed toy sword" desc = "A cheap, plastic replica of TWO energy swords. Double the fun!" + force = 0 + force_wielded = 0 throwforce = 0 - throw_speed = 3 throw_range = 5 - two_hand_force = 0 + attack_verb_continuous = list("attacks", "strikes", "hits") attack_verb_simple = list("attack", "strike", "hit") -/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/dualsaber/toy/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + return FALSE /obj/item/dualsaber/toy/IsReflect() //Stops Toy Dualsabers from reflecting energy projectiles return 0 @@ -588,7 +569,7 @@ playsound(src, 'sound/effects/snap.ogg', 50, TRUE) qdel(src) -/obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume) +/obj/item/toy/snappop/fire_act(exposed_temperature, exposed_volume, turf/adjacent) pop_burst() /obj/item/toy/snappop/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) @@ -990,7 +971,7 @@ toysay = "Any heads of staff?" /obj/item/toy/figure/cargotech - name = "\improper Cargo Technician action figure" + name = "\improper" + JOB_DECKHAND + "action figure" icon_state = "cargotech" toysay = "For Cargonia!" @@ -1026,7 +1007,7 @@ toysay = "Arf!" /obj/item/toy/figure/detective - name = "\improper Detective action figure" + name = "\improper Private Investigator action figure" icon_state = "detective" toysay = "This airlock has grey jumpsuit and insulated glove fibers on it." @@ -1051,7 +1032,7 @@ toysay = "Giving out all access!" /obj/item/toy/figure/hos - name = "\improper Head of Security action figure" + name = "\improper Security Marshal action figure" icon_state = "hos" toysay = "Go ahead, make my day." @@ -1071,12 +1052,12 @@ toysay = "My client is a dirty traitor!" /obj/item/toy/figure/curator - name = "\improper Curator action figure" + name = "\improper Archivist action figure" icon_state = "curator" toysay = "One day while..." /obj/item/toy/figure/md - name = "\improper Medical Doctor action figure" + name = "\improper " + JOB_MEDICAL_DOCTOR + "action figure" icon_state = "md" toysay = "The patient is already dead!" @@ -1173,6 +1154,12 @@ name = "[initial(name)] - [doll_name]" /obj/item/toy/dummy/talk_into(atom/movable/A, message, channel, list/spans, datum/language/language, list/message_mods) + if(isnull(language)) + language = A?.get_selected_language() + + if(istype(language, /datum/language/visual)) + return + var/mob/M = A if (istype(M)) M.log_talk(message, LOG_SAY, tag="dummy toy") @@ -1480,7 +1467,6 @@ GLOBAL_LIST_EMPTY(intento_players) switch(intent) if(HELP) to_chat(victim, span_danger("[src] hugs you to make you feel better!")) - SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) if(DISARM) to_chat(victim, span_danger("You're knocked down from a shove by [src]!")) victim.Knockdown(2 SECONDS) diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 7f4e666c9987..74c49aa9cc8d 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, FIRE = 70, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 30) // 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/virgin_mary.dm b/code/game/objects/items/virgin_mary.dm index bed10d55fa5e..f88ddf5e4549 100644 --- a/code/game/objects/items/virgin_mary.dm +++ b/code/game/objects/items/virgin_mary.dm @@ -37,7 +37,7 @@ new_name = "[copytext(joe.real_name, 1, space_position)] \"[nickname]\" [copytext(joe.real_name, space_position)]" else //Append otherwise new_name = "[joe.real_name] \"[nickname]\"" - joe.real_name = new_name + joe.set_real_name(new_name) used_up = TRUE mob_mobs += joe joe.say("My soul will burn like this saint if I betray my family. I enter alive and I will have to get out dead.", forced = /obj/item/virgin_mary) diff --git a/code/game/objects/items/voice_changer.dm b/code/game/objects/items/voice_changer.dm new file mode 100644 index 000000000000..df6f0e89204f --- /dev/null +++ b/code/game/objects/items/voice_changer.dm @@ -0,0 +1,45 @@ +/obj/item/voice_changer + name = "voice changer" + desc = "This voice-modulation device will dynamically disguise your voice to that of whoever is listed on your identification card, via incredibly complex algorithms. Discretely fits inside most gasmasks, and can be removed with wirecutters." + icon_state = "voicechanger" + icon = 'goon/icons/obj/items.dmi' + +/datum/component/voice_changer + var/obj/item/voice_changer/item + +/datum/component/voice_changer/Initialize(obj/item/voice_changer/item) + . = ..() + src.item = item + item.moveToNullspace() + RegisterSignal(item, COMSIG_PARENT_QDELETING, PROC_REF(destroyme)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(examined)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WIRECUTTER), PROC_REF(cut)) + ADD_TRAIT(parent, TRAIT_REPLACES_VOICE, REF(src)) + +/datum/component/voice_changer/Destroy(force, silent) + REMOVE_TRAIT(parent, TRAIT_REPLACES_VOICE, REF(src)) + if(!QDELETED(item)) + qdel(item) + item = null + return ..() + +/datum/component/voice_changer/proc/destroyme() + SIGNAL_HANDLER + qdel(src) + +/datum/component/voice_changer/proc/examined(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER + if(get_dist(get_turf(parent), get_turf(user)) <= 1) + examine_list += " There's a strange device inside held in place by some wires." + +/datum/component/voice_changer/proc/cut(datum/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + if(!user.is_holding(parent)) + return + var/atom/atom_parent = parent + to_chat(user, span_notice("You remove [item] from [parent] with [tool].")) + item.forceMove(atom_parent.drop_location()) + tool.play_tool_sound(tool, 50) + item = null + qdel(src) + return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/game/objects/items/wall_mounted.dm b/code/game/objects/items/wall_mounted.dm index 7d4567b9f7ed..1f1100c8e898 100644 --- a/code/game/objects/items/wall_mounted.dm +++ b/code/game/objects/items/wall_mounted.dm @@ -90,4 +90,4 @@ w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=50, /datum/material/glass=50) grind_results = list(/datum/reagent/iron = 10, /datum/reagent/silicon = 10) - custom_price = PAYCHECK_EASY * 0.5 + custom_price = PAYCHECK_ASSISTANT * 1.2 diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 5ea3be6e6c71..e89f377cfaf4 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -12,7 +12,7 @@ attack_verb_continuous = list("bans") attack_verb_simple = list("ban") max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF /obj/item/banhammer/Initialize(mapload) @@ -74,7 +74,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF /obj/item/claymore/Initialize(mapload) @@ -95,9 +95,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 slot_flags = ITEM_SLOT_BACK force = 30 throwforce = 20 - throw_speed = 3 + throw_speed = 1 throw_range = 5 - armour_penetration = 35 + armor_penetration = 35 /obj/item/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." @@ -263,7 +263,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_chance = 50 sharpness = SHARP_EDGED max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF /obj/item/katana/suicide_act(mob/user) @@ -273,68 +273,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/cursed //used by wizard events, see the tendril_loot.dm file for the miner one slot_flags = null -/obj/item/wirerod - name = "wired rod" - desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit." - icon_state = "wiredrod" - inhand_icon_state = "rods" - flags_1 = CONDUCT_1 - force = 9 - throwforce = 10 - w_class = WEIGHT_CLASS_BULKY - custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75) - attack_verb_continuous = list("hits", "bludgeons", "whacks", "bonks") - attack_verb_simple = list("hit", "bludgeon", "whack", "bonk") - -/obj/item/wirerod/Initialize(mapload) - . = ..() - - var/static/list/hovering_item_typechecks = list( - /obj/item/shard = list( - SCREENTIP_CONTEXT_LMB = "Craft spear", - ), - - /obj/item/assembly/igniter = list( - SCREENTIP_CONTEXT_LMB = "Craft stunprod", - ), - ) - - AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) - -/obj/item/wirerod/attackby(obj/item/attacking_item, mob/user, params) - if(istype(attacking_item, /obj/item/shard)) - var/datum/crafting_recipe/recipe_to_use = /datum/crafting_recipe/spear - user.balloon_alert(user, "crafting spear...") - if(do_after(user, src, initial(recipe_to_use.time))) // we do initial work here to get the correct timer - var/obj/item/spear/crafted_spear = new /obj/item/spear() - - remove_item_from_storage(user) - if (!user.transferItemToLoc(attacking_item, crafted_spear)) - return - crafted_spear.CheckParts(list(attacking_item)) - qdel(src) - - user.put_in_hands(crafted_spear) - user.balloon_alert(user, "crafted spear") - return - - if(istype(attacking_item, /obj/item/assembly/igniter) && !(HAS_TRAIT(attacking_item, TRAIT_NODROP))) - var/datum/crafting_recipe/recipe_to_use = /datum/crafting_recipe/stunprod - user.balloon_alert(user, "crafting cattleprod...") - if(do_after(user, src, initial(recipe_to_use.time))) - var/obj/item/melee/baton/security/cattleprod/prod = new - - remove_item_from_storage(user) - - qdel(attacking_item) - qdel(src) - - user.put_in_hands(prod) - user.balloon_alert(user, "crafted cattleprod") - return - return ..() - - /obj/item/throwing_star name = "throwing star" desc = "An ancient weapon still used to this day, due to its ease of lodging itself into its victim's body parts." @@ -344,9 +282,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' force = 2 throwforce = 10 //10 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 18 damage on hit due to guaranteed embedding - throw_speed = 4 + throw_speed = 1.5 embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0) - armour_penetration = 40 + armor_penetration = 40 w_class = WEIGHT_CLASS_SMALL sharpness = SHARP_POINTY @@ -378,7 +316,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 3 w_class = WEIGHT_CLASS_SMALL throwforce = 5 - throw_speed = 3 + throw_speed = 1.5 throw_range = 6 custom_materials = list(/datum/material/iron=12000) hitsound = 'sound/weapons/genhit.ogg' @@ -416,9 +354,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon = 'icons/obj/items_and_weapons.dmi' icon_state = "red_phone" force = 3 + throwforce = 2 - throw_speed = 3 throw_range = 4 + w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("calls", "rings") attack_verb_simple = list("call", "ring") @@ -455,10 +394,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' force = 3 throwforce = 5 - throw_speed = 2 + throw_speed = 1.5 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - armour_penetration = 100 + armor_penetration = 100 attack_verb_continuous = list("bludgeons", "whacks", "disciplines") attack_verb_simple = list("bludgeon", "whack", "discipline") resistance_flags = FLAMMABLE @@ -480,7 +419,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' force = 3 throwforce = 5 - throw_speed = 2 + throw_speed = 1.5 throw_range = 5 w_class = WEIGHT_CLASS_SMALL @@ -563,29 +502,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 icon_state = "hippocratic" impressiveness = 50 -/obj/item/tailclub - name = "tail club" - desc = "For the beating to death of unathi with their own tails." - icon_state = "tailclub" - force = 14 - throwforce = 1 // why are you throwing a club do you even weapon - throw_speed = 1 - throw_range = 1 - attack_verb_continuous = list("clubs", "bludgeons") - attack_verb_simple = list("club", "bludgeon") - -/obj/item/melee/chainofcommand/tailwhip - name = "liz o' nine tails" - desc = "A whip fashioned from the severed tails of unathi." - icon_state = "tailwhip" - inhand_icon_state = "tailwhip" - item_flags = NONE - -/obj/item/melee/chainofcommand/tailwhip/kitty +/obj/item/melee/chainofcommand/kitty name = "cat o' nine tails" desc = "A whip fashioned from the severed tails of cats." icon_state = "catwhip" inhand_icon_state = "catwhip" + item_flags = NONE /obj/item/melee/skateboard name = "skateboard" @@ -693,7 +615,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(homerun_ready) user.visible_message(span_userdanger("It's a home run!")) target.throw_at(throw_target, rand(8,10), 14, user) - SSexplosions.medturf += throw_target + EX_ACT(throw_target, EXPLODE_HEAVY) playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, TRUE) homerun_ready = 0 return @@ -708,15 +630,10 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 inhand_icon_state = "baseball_bat_metal" force = 12 throwforce = 15 + block_sound = list('sound/weapons/effects/batreflect1.ogg', 'sound/weapons/effects/batreflect2.ogg') -/obj/item/melee/baseball_bat/ablative/IsReflect()//some day this will reflect thrown items instead of lasers - var/picksound = rand(1,2) - var/turf = get_turf(src) - if(picksound == 1) - playsound(turf, 'sound/weapons/effects/batreflect1.ogg', 50, TRUE) - if(picksound == 2) - playsound(turf, 'sound/weapons/effects/batreflect2.ogg', 50, TRUE) - return 1 +/obj/item/melee/baseball_bat/ablative/IsReflect() //some day this will reflect thrown items instead of lasers + return TRUE /obj/item/melee/flyswatter name = "flyswatter" @@ -742,7 +659,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /mob/living/simple_animal/butterfly, /mob/living/basic/cockroach, /obj/item/queen_bee, - /obj/structure/spider/spiderling, /mob/living/simple_animal/hostile/ant, /obj/effect/decal/cleanable/ants, )) @@ -839,14 +755,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' force = 10 throwforce = 25 - throw_speed = 4 + throw_speed = 1.5 embedding = list("embed_chance" = 100) block_chance = 25 sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - /// Wielding status. - var/wielded = FALSE /// The color of the slash we create var/slash_color = COLOR_BLUE /// Previous x position of where we clicked on the target's icon @@ -858,35 +772,39 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/highfrequencyblade/Initialize(mapload) . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) -/obj/item/highfrequencyblade/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed) - /obj/item/highfrequencyblade/update_icon_state() icon_state = "hfrequency[wielded]" return ..() -/obj/item/highfrequencyblade/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) - if(wielded || prob(final_block_chance)) - owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!")) - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) - return TRUE - return FALSE - if(prob(final_block_chance * (wielded ? 2 : 1))) - owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) +/obj/item/highfrequencyblade/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + if((attack_type == PROJECTILE_ATTACK) && wielded) return TRUE + . = ..() + + if(wielded) + . *= 2 + +/obj/item/highfrequencyblade/block_feedback(mob/living/carbon/human/wielder, attack_text, attack_type, do_message = TRUE, do_sound = TRUE) + if(do_message) + if(attack_type == PROJECTILE_ATTACK) + wielder.visible_message(span_danger("[wielder] deflects [attack_text] with [src]!")) + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + return ..(do_message = FALSE) + else + wielder.visible_message(span_danger("[wielder] parries [attack_text] with [src]!")) + return ..(do_message = FALSE) + + return ..() + /obj/item/highfrequencyblade/attack(mob/living/target, mob/living/user, params) if(!wielded) return ..() slash(target, user, params) -/obj/item/highfrequencyblade/attack_atom(atom/target, mob/living/user, params) +/obj/item/highfrequencyblade/attack_obj(atom/target, mob/living/user, params) if(wielded) return return ..() @@ -938,13 +856,13 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 living_target.gib() log_combat(user, living_target, "gibbed", src) else if(target.uses_integrity) - target.take_damage(force*damage_mod*3, BRUTE, MELEE, FALSE, null, 50) + target.take_damage(force*damage_mod*3, BRUTE, BLUNT, FALSE, null, 50) else if(iswallturf(target) && prob(force*damage_mod*0.5)) var/turf/closed/wall/wall_target = target wall_target.dismantle_wall() else if(ismineralturf(target) && prob(force*damage_mod)) var/turf/closed/mineral/mineral_target = target - mineral_target.gets_drilled() + mineral_target.MinedAway() /obj/effect/temp_visual/slash icon_state = "highfreq_slash" @@ -979,3 +897,23 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 balloon_alert(user, "you're too weak!") return return ..() + +/obj/item/mace + name = "iron mace" + desc = "A crude mace made made from pieces of metal welded together." + icon_state = "shitty_mace" + inhand_icon_state = "mace" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + w_class = WEIGHT_CLASS_BULKY + hitsound = 'sound/weapons/smash.ogg' + attack_verb_continuous = list("attacks", "bludgeons", "smashes", "thwacks", "wallops") + attack_verb_simple = list("attack", "bludgeon", "smash", "thwack", "wallop") + + stamina_damage = 20 + stamina_cost = 15 + stamina_critical_chance = 10 + force = 14 + throwforce = 10 + throw_range = 2 //it's not going very far. + combat_click_delay = CLICK_CD_MELEE * 1.5 diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 2de1071ac5d7..5631f85f0303 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -1,7 +1,7 @@ /obj/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) ..() - take_damage(AM.throwforce, BRUTE, MELEE, 1, get_dir(src, AM)) + take_damage(AM.throwforce, BRUTE, BLUNT, 1, get_dir(src, AM)) /obj/ex_act(severity, target) if(resistance_flags & INDESTRUCTIBLE) @@ -26,7 +26,7 @@ playsound(src, P.hitsound, 50, TRUE) var/damage if(!QDELETED(src)) //Bullet on_hit effect might have already destroyed this object - damage = take_damage(P.damage, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) + damage = take_damage(P.damage, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armor_penetration) if(P.suppressed != SUPPRESSED_VERY) visible_message(span_danger("[src] is hit by \a [P][damage ? "" : ", without leaving a mark"]!"), null, null, COMBAT_MESSAGE_RANGE) @@ -36,7 +36,7 @@ playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) else playsound(src, 'sound/effects/bang.ogg', 50, TRUE) - var/damage = take_damage(hulk_damage(), BRUTE, MELEE, 0, get_dir(src, user)) + var/damage = take_damage(hulk_damage(), BRUTE, BLUNT, 0, get_dir(src, user)) user.visible_message(span_danger("[user] smashes [src][damage ? "" : ", without leaving a mark"]!"), span_danger("You smash [src][damage ? "" : ", without leaving a mark"]!"), null, COMBAT_MESSAGE_RANGE) return TRUE @@ -47,10 +47,10 @@ var/turf/T = loc if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(src, TRAIT_T_RAY_VISIBLE)) return - take_damage(400, BRUTE, MELEE, 0, get_dir(src, B)) + take_damage(400, BRUTE, BLUNT, 0, get_dir(src, B)) /obj/attack_alien(mob/living/carbon/alien/humanoid/user, list/modifiers) - if(attack_generic(user, 60, BRUTE, MELEE, 0)) + if(attack_generic(user, 60, BRUTE, BLUNT, 0)) playsound(src.loc, 'sound/weapons/slash.ogg', 100, TRUE) /obj/attack_basic_mob(mob/living/basic/user, list/modifiers) @@ -59,9 +59,9 @@ return FALSE else if(user.obj_damage) - . = attack_generic(user, user.obj_damage, user.melee_damage_type, MELEE, TRUE, user.armour_penetration) + . = attack_generic(user, user.obj_damage, user.melee_damage_type, BLUNT, TRUE, user.armor_penetration) else - . = attack_generic(user, rand(user.melee_damage_lower,user.melee_damage_upper), user.melee_damage_type, MELEE,TRUE, user.armour_penetration) + . = attack_generic(user, rand(user.melee_damage_lower,user.melee_damage_upper), user.melee_damage_type, BLUNT,TRUE, user.armor_penetration) if(.) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) @@ -74,9 +74,9 @@ if(user.environment_smash) play_soundeffect = FALSE if(user.obj_damage) - . = attack_generic(user, user.obj_damage, user.melee_damage_type, MELEE, play_soundeffect, user.armour_penetration) + . = attack_generic(user, user.obj_damage, user.melee_damage_type, BLUNT, play_soundeffect, user.armor_penetration) else - . = attack_generic(user, rand(user.melee_damage_lower,user.melee_damage_upper), user.melee_damage_type, MELEE, play_soundeffect, user.armour_penetration) + . = attack_generic(user, rand(user.melee_damage_lower,user.melee_damage_upper), user.melee_damage_type, BLUNT, play_soundeffect, user.armor_penetration) if(. && !play_soundeffect) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) if(user.client) @@ -96,11 +96,11 @@ /obj/attack_slime(mob/living/simple_animal/slime/user) if(!user.is_adult) return - attack_generic(user, rand(10, 15), BRUTE, MELEE, 1) + attack_generic(user, rand(10, 15), BRUTE, BLUNT, 1) /obj/singularity_act() - SSexplosions.high_mov_atom += src + EX_ACT(src, EXPLODE_DEVASTATE) if(src && !QDELETED(src)) qdel(src) return 2 @@ -126,7 +126,7 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e //// FIRE ///Called when the obj is exposed to fire. -/obj/fire_act(exposed_temperature, exposed_volume) +/obj/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if(isturf(loc)) var/turf/T = loc if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && HAS_TRAIT(src, TRAIT_T_RAY_VISIBLE)) @@ -157,8 +157,8 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e /obj/zap_act(power, zap_flags) if(QDELETED(src)) return 0 - obj_flags |= BEING_SHOCKED - addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 1 SECONDS) + ADD_TRAIT(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED) + addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED), 1 SECONDS) return power / 2 //The surgeon general warns that being buckled to certain objects receiving powerful shocks is greatly hazardous to your health @@ -169,9 +169,6 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e var/mob/living/buckled_mob = m buckled_mob.electrocute_act((clamp(round(strength/400), 10, 90) + rand(-5, 5)), src, flags = SHOCK_TESLA) -/obj/proc/reset_shocked() - obj_flags &= ~BEING_SHOCKED - ///the obj is deconstructed into pieces, whether through careful disassembly or when destroyed. /obj/proc/deconstruct(disassembled = TRUE) SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled) @@ -186,7 +183,3 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e burn() else deconstruct(FALSE) - -///returns how much the object blocks an explosion. Used by subtypes. -/obj/proc/GetExplosionBlock() - CRASH("Unimplemented GetExplosionBlock()") diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index a4f97f8cd594..3730800c1bd5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -7,8 +7,6 @@ /// Extra examine line to describe controls, such as right-clicking, left-clicking, etc. var/desc_controls - var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. - var/damtype = BRUTE var/force = 0 @@ -35,9 +33,6 @@ /// Map tag for something. Tired of it being used on snowflake items. Moved here for some semblance of a standard. /// Next pr after the network fix will have me refactor door interactions, so help me god. var/id_tag = null - /// Network id. If set it can be found by either its hardware id or by the id tag if thats set. It can also be - /// broadcasted to as long as the other guys network is on the same branch or above. - var/network_id = null uses_integrity = TRUE @@ -47,42 +42,15 @@ return FALSE return ..() -/obj/Initialize(mapload) - . = ..() - - if (set_obj_flags) - var/flagslist = splittext(set_obj_flags,";") - var/list/string_to_objflag = GLOB.bitfields["obj_flags"] - for (var/flag in flagslist) - if(flag[1] == "!") - flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! - 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) - - if(network_id) - var/area/A = get_area(src) - if(A) - if(!A.network_root_id) - log_telecomms("Area '[A.name]([REF(A)])' has no network network_root_id, force assigning in object [src]([REF(src)])") - SSnetworks.lookup_area_root_id(A) - network_id = NETWORK_NAME_COMBINE(A.network_root_id, network_id) // I regret nothing!! - else - log_telecomms("Created [src]([REF(src)] in nullspace, assuming network to be in station") - network_id = NETWORK_NAME_COMBINE(STATION_NETWORK_ROOT, network_id) // I regret nothing!! - AddComponent(/datum/component/ntnet_interface, network_id, id_tag) - /// Needs to run before as ComponentInitialize runs after this statement...why do we have ComponentInitialize again? - - /obj/Destroy(force) - if(!ismachinery(src)) - STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + if((datum_flags & DF_ISPROCESSING)) + if(ismachinery(src)) + STOP_PROCESSING(SSmachines, src) + else + STOP_PROCESSING(SSobj, src) + stack_trace("Obj of type [type] processing after Destroy(), please fix this.") SStgui.close_uis(src) - . = ..() + return ..() /obj/assume_air(datum/gas_mixture/giver) @@ -110,8 +78,8 @@ //DEFAULT: Take air from turf to give to have mob process if(breath_request>0) - var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.get_volume() + var/datum/gas_mixture/environment = return_breathable_air() + var/breath_percentage = BREATH_VOLUME / environment.volume return remove_air(environment.total_moles * breath_percentage) else return null @@ -182,6 +150,9 @@ return /mob/proc/set_machine(obj/O) + if(QDELETED(src) || QDELETED(O)) + return + if(machine) unset_machine() machine = O @@ -222,7 +193,7 @@ usr.client.object_say(src) if(href_list[VV_HK_ARMOR_MOD]) var/list/pickerlist = list() - var/list/armorlist = armor.getList() + var/list/armorlist = returnArmor().getList() for (var/i in armorlist) pickerlist += list(list("value" = armorlist[i], "name" = i)) @@ -232,16 +203,20 @@ if (islist(result)) if (result["button"] != 2) // If the user pressed the cancel button // text2num conveniently returns a null on invalid values - armor = armor.setRating(melee = text2num(result["values"][MELEE]),\ - bullet = text2num(result["values"][BULLET]),\ - laser = text2num(result["values"][LASER]),\ - energy = text2num(result["values"][ENERGY]),\ - bomb = text2num(result["values"][BOMB]),\ - bio = text2num(result["values"][BIO]),\ - fire = text2num(result["values"][FIRE]),\ - acid = text2num(result["values"][ACID])) - log_admin("[key_name(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], fire: [armor.fire], acid: [armor.acid]") - message_admins(span_notice("[key_name_admin(usr)] modified the armor on [src] ([type]) to melee: [armor.melee], bullet: [armor.bullet], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], fire: [armor.fire], acid: [armor.acid]")) + setArmor(returnArmor().setRating( + blunt = text2num(result["values"][BLUNT]), + puncture = text2num(result["values"][PUNCTURE]), + slash = text2num(result["values"][SLASH]), + laser = text2num(result["values"][LASER]), + energy = text2num(result["values"][ENERGY]), + bomb = text2num(result["values"][BOMB]), + bio = text2num(result["values"][BIO]), + fire = text2num(result["values"][FIRE]), + acid = text2num(result["values"][ACID]) + ) + ) + log_admin("[key_name(usr)] modified the armor on [src] ([type]) to blunt: [armor.blunt], puncture: [armor.puncture], slash: [armor.slash], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], fire: [armor.fire], acid: [armor.acid]") + message_admins(span_notice("[key_name_admin(usr)] modified the armor on [src] ([type]) to blunt: [armor.blunt], puncture: [armor.puncture], slash: [armor.slash], laser: [armor.laser], energy: [armor.energy], bomb: [armor.bomb], bio: [armor.bio], fire: [armor.fire], acid: [armor.acid]")) if(href_list[VV_HK_MASS_DEL_TYPE]) if(check_rights(R_DEBUG|R_SERVER)) var/action_type = tgui_alert(usr, "Strict type ([type]) or type and all subtypes?",,list("Strict type","Type and subtypes","Cancel")) @@ -285,14 +260,10 @@ . = ..() if(desc_controls) . += span_notice(desc_controls) - if(obj_flags & UNIQUE_RENAME) - . += span_notice("Use a pen on it to rename it or change its description.") - if(unique_reskin && !current_skin) - . += span_notice("Alt-click it to reskin it.") /obj/AltClick(mob/user) . = ..() - if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) + if(unique_reskin && !current_skin) reskin_obj(user) /** @@ -352,7 +323,7 @@ /obj/handle_ricochet(obj/projectile/P) . = ..() if(. && receive_ricochet_damage_coeff) - take_damage(P.damage * receive_ricochet_damage_coeff, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along receive_ricochet_damage_coeff damage to the structure for the ricochet + take_damage(P.damage * receive_ricochet_damage_coeff, P.damage_type, P.armor_flag, 0, turn(P.dir, 180), P.armor_penetration) // pass along receive_ricochet_damage_coeff damage to the structure for the ricochet /obj/update_overlays() . = ..() @@ -383,3 +354,16 @@ ///unfreezes this obj if its frozen /obj/proc/unfreeze() SEND_SIGNAL(src, COMSIG_OBJ_UNFREEZE) + +/// Removes a BLOCK_Z_OUT_* flag, and then tries to get every movable in the turf to fall. +/obj/proc/lose_block_z_out(flag_to_lose) + if(!(obj_flags & flag_to_lose)) + return + + obj_flags &= ~flag_to_lose + var/turf/T = get_turf(src) + if(!T) + return + + for(var/atom/movable/AM as anything in T) + AM.zFall() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index a69ef63a0504..a175ab3dbffe 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -12,20 +12,25 @@ var/broken = FALSE /obj/structure/Initialize(mapload) - if (!armor) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + + #ifdef UNIT_TESTS + ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_groups) + ASSERT_SORTED_SMOOTHING_GROUPS(canSmoothWith) + #endif + + SETUP_SMOOTHING() + if(!isnull(smoothing_flags)) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) if(smoothing_flags & SMOOTH_CORNERS) icon_state = "" + GLOB.cameranet.updateVisibility(src) /obj/structure/Destroy() GLOB.cameranet.updateVisibility(src) - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() /obj/structure/ui_act(action, params) @@ -36,9 +41,10 @@ . = ..() if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - . += span_warning("It's on fire!") + . += span_alert("FIRE!!") if(broken) - . += span_notice("It appears to be broken.") + . += span_alert("It appears to be broken.") + var/examine_status = examine_status(user) if(examine_status) . += examine_status @@ -55,10 +61,71 @@ return span_warning("It's falling apart!") /obj/structure/rust_heretic_act() - take_damage(500, BRUTE, "melee", 1) + take_damage(500, BRUTE, SLASH, 1) /obj/structure/zap_act(power, zap_flags) if(zap_flags & ZAP_OBJ_DAMAGE) take_damage(power/8000, BURN, "energy") power -= power/2000 //walls take a lot out of ya . = ..() + +/obj/structure/onZImpact(turf/impacted_turf, levels, message) + . = ..() + var/atom/highest + for(var/atom/movable/hurt_atom as anything in impacted_turf) + if(hurt_atom == src) + continue + if(!hurt_atom.density) + continue + if(isobj(hurt_atom) || ismob(hurt_atom)) + if(hurt_atom.layer > highest?.layer) + highest = hurt_atom + + if(!highest) + return + + if(isobj(highest)) + var/obj/O = highest + if(!O.uses_integrity) + return + O.take_damage(10 * levels) + + if(ismob(highest)) + var/mob/living/L = highest + var/armor = L.run_armor_check(BODY_ZONE_HEAD, BLUNT) + L.apply_damage(80 * levels, blocked = armor, spread_damage = TRUE) + L.Paralyze(10 SECONDS) + + visible_message(span_warning("[src] slams into [highest] from above!")) + +/obj/structure/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!user.combat_mode) + return + if(!grab.target_zone == BODY_ZONE_HEAD) + return + if (!grab.current_grab.enable_violent_interactions) + to_chat(user, span_warning("You need a better grip to do that!")) + return TRUE + + var/mob/living/affecting_mob = grab.get_affecting_mob() + if(!istype(affecting_mob)) + to_chat(user, span_warning("You need to be grabbing a living creature to do that!")) + return TRUE + + // Slam their face against the table. + var/blocked = affecting_mob.run_armor_check(BODY_ZONE_HEAD, BLUNT) + if (prob(30 * ((100-blocked)/100))) + affecting_mob.Knockdown(10 SECONDS) + + affecting_mob.apply_damage(30, BRUTE, BODY_ZONE_HEAD, blocked) + visible_message(span_danger("[user] slams [affecting_mob]'s face against \the [src]!")) + playsound(loc, 'sound/items/trayhit1.ogg', 50, 1) + + take_damage(rand(1,5), BRUTE) + for(var/obj/item/shard/S in loc) + if(prob(50)) + affecting_mob.visible_message(span_danger("\The [S] slices into [affecting_mob]'s face!"), span_danger("\The [S] slices into your face!")) + S.melee_attack_chain(user, victim, params) + qdel(grab) + return TRUE diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index 376633d1b785..38a969260f59 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -12,7 +12,7 @@ max_integrity = 100 /obj/structure/alien/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == MELEE) + if(damage_flag == BLUNT) switch(damage_type) if(BRUTE) damage_amount *= 0.25 @@ -59,8 +59,8 @@ opacity = TRUE anchored = TRUE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN) - canSmoothWith = list(SMOOTH_GROUP_ALIEN_RESIN) + smoothing_groups = SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_RESIN max_integrity = 200 var/resintype = null can_atmos_pass = CANPASS_DENSITY @@ -86,13 +86,13 @@ icon_state = "resin_wall-0" base_icon_state = "resin_wall" resintype = "wall" - smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS) - canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS) + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS /obj/structure/alien/resin/wall/block_superconductivity() return 1 -/// meant for one lavaland ruin or anywhere that has simplemobs who can push aside structures +/// meant for anywhere that has simplemobs who can push aside structures /obj/structure/alien/resin/wall/immovable desc = "Dense resin solidified into a wall." move_resist = MOVE_FORCE_VERY_STRONG @@ -111,8 +111,8 @@ opacity = FALSE max_integrity = 160 resintype = "membrane" - smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WALLS) - canSmoothWith = list(SMOOTH_GROUP_ALIEN_WALLS) + smoothing_groups = SMOOTH_GROUP_ALIEN_WALLS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WALLS /obj/structure/alien/resin/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -142,8 +142,8 @@ base_icon_state = "weeds1" max_integrity = 15 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_ALIEN_RESIN, SMOOTH_GROUP_ALIEN_WEEDS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_ALIEN_WEEDS) + smoothing_groups = SMOOTH_GROUP_ALIEN_WEEDS + SMOOTH_GROUP_ALIEN_RESIN + canSmoothWith = SMOOTH_GROUP_ALIEN_WEEDS + SMOOTH_GROUP_WALLS ///the range of the weeds going to be affected by the node var/node_range = NODERANGE ///the parent node that will determine if we grow or die diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 7c3e74608b9c..1bd6b4016f6d 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 = 0.5 - armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 20, PUNCTURE = 20, SLASH = 90, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) buildable_sign = FALSE var/panel_open = FALSE diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index dfe5d567b6c8..c0bfd1605b1d 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -9,8 +9,8 @@ max_integrity = 120 can_be_unanchored = FALSE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_ALIEN_NEST) - canSmoothWith = list(SMOOTH_GROUP_ALIEN_NEST) + smoothing_groups = SMOOTH_GROUP_ALIEN_NEST + canSmoothWith = SMOOTH_GROUP_ALIEN_NEST buildstacktype = null flags_1 = NODECONSTRUCT_1 bolts = FALSE diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index d956bc23469f..b29083497151 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -91,7 +91,7 @@ /obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location) . = ..() if(over_object == usr && Adjacent(usr)) - if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) + if(!ishuman(usr) || !usr.canUseTopic(src, USE_CLOSE)) return FALSE if(has_buckled_mobs()) return FALSE @@ -233,10 +233,6 @@ desc = "An old grubby mattress. You try to not think about what could be the cause of those stains." icon_state = "dirty_mattress" -/obj/structure/bed/maint/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOLD, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 25) - //Double Beds, for luxurious sleeping, i.e. the captain and maybe heads- if people use this for ERP, send them to skyrat /obj/structure/bed/double name = "double bed" diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 168b3375d8b5..9e5036d222fa 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -11,6 +11,8 @@ integrity_failure = 0.1 custom_materials = list(/datum/material/iron = 2000) layer = OBJ_LAYER + mouse_drop_pointer = TRUE + var/buildstacktype = /obj/item/stack/sheet/iron var/buildstackamount = 1 var/item_chair = /obj/item/chair // if null it can't be picked up @@ -18,14 +20,11 @@ /obj/structure/chair/examine(mob/user) . = ..() - . += span_notice("It's held together by a couple of bolts.") - if(!has_buckled_mobs() && can_buckle) - . += span_notice("While standing on [src], drag and drop your sprite onto [src] to buckle to it.") + . += span_notice("It's held together by a handful of bolts.") /obj/structure/chair/Initialize(mapload) . = ..() - if(!anchored) //why would you put these on the shuttle? - addtimer(CALLBACK(src, PROC_REF(RemoveFromLatejoin)), 0) + SET_TRACKING(__TYPE__) if(prob(0.2)) name = "tactical [name]" MakeRotate() @@ -35,11 +34,9 @@ AddComponent(/datum/component/simple_rotation, ROTATION_IGNORE_ANCHORED|ROTATION_GHOSTS_ALLOWED) /obj/structure/chair/Destroy() - RemoveFromLatejoin() - return ..() - -/obj/structure/chair/proc/RemoveFromLatejoin() SSjob.latejoin_trackers -= src //These may be here due to the arrivals shuttle + UNSET_TRACKING(__TYPE__) + return ..() /obj/structure/chair/deconstruct(disassembled) // If we have materials, and don't have the NOCONSTRUCT flag @@ -238,7 +235,7 @@ /obj/structure/chair/office/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - if(has_gravity()) + if(!forced && !CHECK_MOVE_LOOP_FLAGS(src, MOVEMENT_LOOP_OUTSIDE_CONTROL) && has_gravity()) playsound(src, 'sound/effects/roll.ogg', 100, TRUE) /obj/structure/chair/office/electrify_self(obj/item/assembly/shock_kit/input_shock_kit, mob/user, list/overlays_from_child_procs) @@ -272,7 +269,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool, 0) if(over_object == usr && Adjacent(usr)) if(!item_chair || has_buckled_mobs() || src.flags_1 & NODECONSTRUCT_1) return - if(!usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(!usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS)) return usr.visible_message(span_notice("[usr] grabs \the [src.name]."), span_notice("You grab \the [src.name].")) var/obj/item/C = new item_chair(loc) @@ -315,14 +312,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) throwforce = 10 throw_range = 3 hitsound = 'sound/items/trayhit1.ogg' - hit_reaction_chance = 50 custom_materials = list(/datum/material/iron = 2000) + + block_sound = SFX_BLOCK_BIG_METAL + var/break_chance = 5 //Likely hood of smashing the chair. var/obj/structure/chair/origin_type = /obj/structure/chair /obj/item/chair/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins hitting [user.p_them()]self with \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - playsound(src,hitsound,50,TRUE) + playsound(src, get_hitsound(), 50,TRUE) return BRUTELOSS /obj/item/chair/narsie_act() @@ -366,15 +365,19 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) new /obj/item/stack/rods(get_turf(loc), 2) qdel(src) +/obj/item/chair/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + . = ..() + if(prob(50) && ((attack_type == UNARMED_ATTACK) || (attack_type == LEAP_ATTACK))) + return TRUE +/obj/item/chair/block_feedback(mob/living/carbon/human/wielder, attack_text, attack_type, do_message = TRUE, do_sound = TRUE) + if(do_message) + if(((attack_type == UNARMED_ATTACK) || (attack_type == LEAP_ATTACK))) + wielder.visible_message(span_danger("[wielder] fends off [attack_text] with [src]!")) + return ..(do_sound = FALSE) + return ..() -/obj/item/chair/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == UNARMED_ATTACK && prob(hit_reaction_chance)) - owner.visible_message(span_danger("[owner] fends off [attack_text] with [src]!")) - return TRUE - return FALSE - /obj/item/chair/afterattack(atom/target, mob/living/carbon/user, proximity) . = ..() if(!proximity) @@ -467,7 +470,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0) /obj/structure/chair/bronze/AltClick(mob/user) turns = 0 - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return if(!(datum_flags & DF_ISPROCESSING)) user.visible_message(span_notice("[user] spins [src] around, and the last vestiges of Ratvarian technology keeps it spinning FOREVER."), \ diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 2fd0f8f87244..02f4991d79a1 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -32,7 +32,6 @@ LINEN BINS /obj/item/bedsheet/Initialize(mapload) . = ..() - AddComponent(/datum/component/surgery_initiator) AddElement(/datum/element/bed_tuckable, 0, 0, 0) if(bedsheet_type == BEDSHEET_DOUBLE) stack_amount *= 2 @@ -171,11 +170,11 @@ LINEN BINS dream_messages = list("authority", "a silvery ID", "healing", "life", "surgery", "a cat", "the medical director") /obj/item/bedsheet/hos - name = "head of security's bedsheet" + name = "security marshal'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" inhand_icon_state = "sheethos" - dream_messages = list("authority", "a silvery ID", "handcuffs", "a baton", "a flashbang", "sunglasses", "the head of security") + dream_messages = list("authority", "a silvery ID", "handcuffs", "a baton", "a flashbang", "sunglasses", "the security marshal") /obj/item/bedsheet/hop name = "head of personnel's bedsheet" @@ -223,7 +222,6 @@ LINEN BINS dream_messages = list("a unique ID", "authority", "artillery", "an ending") /obj/item/bedsheet/syndie - name = "syndicate bedsheet" desc = "It has a syndicate emblem and it has an aura of evil." icon_state = "sheetsyndie" inhand_icon_state = "sheetsyndie" @@ -540,7 +538,7 @@ LINEN BINS icon_state = "linenbin-full" return ..() -/obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume) +/obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if(amount) amount = 0 update_appearance() diff --git a/code/game/objects/structures/billboard.dm b/code/game/objects/structures/billboard.dm index 010bc250ea2f..e95398d0c103 100644 --- a/code/game/objects/structures/billboard.dm +++ b/code/game/objects/structures/billboard.dm @@ -5,10 +5,15 @@ icon_state = "billboard_blank" max_integrity = 1000 bound_width = 96 - bound_height = 64 + bound_height = 32 density = TRUE anchored = TRUE +/obj/structure/billboard/Initialize(mapload) + . = ..() + + AddComponent(/datum/component/seethrough, SEE_THROUGH_MAP_BILLBOARD) + /obj/structure/billboard/donk_n_go name = "\improper Donk-n-Go billboard" desc = "A billboard advertising Donk-n-Go, Donk Co's ever-present and ever-unhealthy fast-food venture: GET IN, GET FED, GET GONE!" diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 2d4dcb42b3e2..bec0b4d32ddb 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -38,6 +38,10 @@ ) AddElement(/datum/element/connect_loc, loc_connections) +/obj/structure/bonfire/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/structure/bonfire/attackby(obj/item/used_item, mob/living/user, params) if(istype(used_item, /obj/item/stack/rods) && !can_buckle && !grill) var/obj/item/stack/rods/rods = used_item @@ -115,7 +119,7 @@ particles = new /particles/bonfire() START_PROCESSING(SSobj, src) -/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume) +/obj/structure/bonfire/fire_act(exposed_temperature, exposed_volume, turf/adjacent) start_burning() /obj/structure/bonfire/proc/on_entered(datum/source, atom/movable/entered) @@ -191,9 +195,9 @@ fade = 1 SECONDS grow = -0.01 velocity = list(0, 0) - position = generator("circle", 0, 16, NORMAL_RAND) - drift = generator("vector", list(0, -0.2), list(0, 0.2)) + position = generator(GEN_CIRCLE, 0, 16, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(0, -0.2), list(0, 0.2)) gravity = list(0, 0.95) - scale = generator("vector", list(0.3, 0.3), list(1,1), NORMAL_RAND) + scale = generator(GEN_VECTOR, list(0.3, 0.3), list(1,1), NORMAL_RAND) rotation = 30 - spin = generator("num", -20, 20) + spin = generator(GEN_NUM, -20, 20) diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm index 30d0a977e083..a42cc2b0c39d 100644 --- a/code/game/objects/structures/cannons/cannon.dm +++ b/code/game/objects/structures/cannons/cannon.dm @@ -65,7 +65,7 @@ else var/obj/item/stack/cannonball/cannoneers_balls = used_item loaded_cannonball = new cannoneers_balls.type(src, 1) - loaded_cannonball.copy_evidences(cannoneers_balls) + cannoneers_balls.transfer_evidence_to(loaded_cannonball) balloon_alert(user, "loaded a [cannoneers_balls.singular_name]") cannoneers_balls.use(1, transfer = TRUE) return diff --git a/code/game/objects/structures/construction_console/construction_actions.dm b/code/game/objects/structures/construction_console/construction_actions.dm index 462a0df5e1a3..18081aee72f1 100644 --- a/code/game/objects/structures/construction_console/construction_actions.dm +++ b/code/game/objects/structures/construction_console/construction_actions.dm @@ -139,19 +139,3 @@ /datum/action/innate/construction/place_structure/fan/after_place(obj/placed_structure, remaining) to_chat(owner, span_notice("Tiny fan placed. [remaining] fans remaining.")) - -/datum/action/innate/construction/place_structure/turret - name = "Install Plasma Anti-Wildlife Turret" - button_icon_state = "build_turret" - structure_name = "turrets" - structure_path = /obj/machinery/porta_turret/aux_base - place_sound = 'sound/items/drill_use.ogg' - -/datum/action/innate/construction/place_structure/turret/after_place(obj/placed_structure, remaining) - var/obj/machinery/computer/auxiliary_base/turret_controller = locate() in get_area(placed_structure) - if(!turret_controller) - to_chat(owner, span_notice("Warning: Aux base controller not found. Turrets might not work properly.")) - return - - LAZYADD(turret_controller.turrets, WEAKREF(placed_structure)) - to_chat(owner, span_notice("You've constructed an additional turret. [remaining] turrets remaining.")) diff --git a/code/game/objects/structures/construction_console/construction_console_aux.dm b/code/game/objects/structures/construction_console/construction_console_aux.dm deleted file mode 100644 index 28262d29621e..000000000000 --- a/code/game/objects/structures/construction_console/construction_console_aux.dm +++ /dev/null @@ -1,35 +0,0 @@ -///base consturctino console subtype for the mining aux base -/obj/machinery/computer/camera_advanced/base_construction/aux - name = "aux base construction console" - circuit = /obj/item/circuitboard/computer/base_construction/aux - structures = list("fans" = 0, "turrets" = 0) - allowed_area = /area/shuttle/auxiliary_base - -/obj/machinery/computer/camera_advanced/base_construction/aux/Initialize(mapload) - internal_rcd = new(src) - return ..() - -/obj/machinery/computer/camera_advanced/base_construction/aux/restock_materials() - internal_rcd.matter = internal_rcd.max_matter - structures["fans"] = 4 - structures["turrets"] = 4 - -/obj/machinery/computer/camera_advanced/base_construction/aux/populate_actions_list() - actions += new /datum/action/innate/construction/switch_mode(src) //Action for switching the RCD's build modes - actions += new /datum/action/innate/construction/build(src) //Action for using the RCD - actions += new /datum/action/innate/construction/airlock_type(src) //Action for setting the airlock type - actions += new /datum/action/innate/construction/window_type(src) //Action for setting the window type - actions += new /datum/action/innate/construction/place_structure/fan(src) //Action for spawning fans - actions += new /datum/action/innate/construction/place_structure/turret(src) //Action for spawning turrets - -/obj/machinery/computer/camera_advanced/base_construction/aux/find_spawn_spot() - //Aux base controller. Where the eyeobj will spawn. - var/obj/machinery/computer/auxiliary_base/aux_controller - for(var/obj/machinery/computer/auxiliary_base/potential_aux_console in GLOB.machines) - if(istype(get_area(potential_aux_console), allowed_area)) - aux_controller = potential_aux_console - break - if(!aux_controller) - say("ERROR: Unable to locate auxiliary base controller!") - return null - return aux_controller diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 9ca8d95942c7..acf3b563965d 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -1,5 +1,6 @@ #define LOCKER_FULL -1 +DEFINE_INTERACTABLE(/obj/structure/closet) /obj/structure/closet name = "closet" desc = "It's a basic storage unit." @@ -9,7 +10,7 @@ drag_slowdown = 1.5 // Same as a prone mob max_integrity = 200 integrity_failure = 0.25 - armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 70, ACID = 60) + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 70, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 70, ACID = 60) blocks_emissive = EMISSIVE_BLOCK_GENERIC pass_flags_self = PASSSTRUCTURE|LETPASSCLICKS zmm_flags = ZMM_MANGLE_PLANES @@ -49,9 +50,9 @@ 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/open_sound = 'sound/machines/closet_open.ogg' - var/close_sound = 'sound/machines/closet_close.ogg' - var/open_sound_volume = 35 + var/open_sound = 'sound/structures/locker_open.ogg' + var/close_sound = 'sound/structures/locker_close.ogg' + var/open_sound_volume = 50 var/close_sound_volume = 50 var/material_drop = /obj/item/stack/sheet/iron var/material_drop_amount = 2 @@ -71,8 +72,6 @@ var/can_install_electronics = TRUE /obj/structure/closet/Initialize(mapload) - if(mapload && !opened) // if closed, any item at the crate's loc is put in the contents - addtimer(CALLBACK(src, PROC_REF(take_contents), TRUE), 0) . = ..() update_appearance() PopulateContents() @@ -83,6 +82,13 @@ ) AddElement(/datum/element/connect_loc, loc_connections) + if(mapload && !opened) + return INITIALIZE_HINT_LATELOAD + +/obj/structure/closet/LateInitialize() + . = ..() + take_contents() + //USE THIS TO FILL IT, NOT INITIALIZE OR NEW /obj/structure/closet/proc/PopulateContents() return @@ -185,16 +191,12 @@ /obj/structure/closet/examine(mob/user) . = ..() if(welded) - . += span_notice("It's welded shut.") + . += span_notice("It is welded shut.") if(anchored) . += span_notice("It is bolted to the ground.") - if(opened && cutting_tool == /obj/item/weldingtool) - . += span_notice("The parts are welded together.") - else if(secure && !opened) - . += span_notice("Right-click to [locked ? "unlock" : "lock"].") - if(HAS_TRAIT(user, TRAIT_SKITTISH) && divable) - . += span_notice("If you bump into [p_them()] while running, you will jump inside.") + if(opened && ispath(cutting_tool, /obj/item/weldingtool)) + . += span_notice("The parts are welded together.") /obj/structure/closet/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -207,7 +209,8 @@ if(welded || locked) return FALSE if(strong_grab) - to_chat(user, span_danger("[pulledby] has an incredibly strong grip on [src], preventing it from opening.")) + var/obj/item/hand_item/grab/G = grabbed_by[1] + to_chat(user, span_danger("[G.assailant] has an incredibly strong grip on [src], preventing it from opening.")) return FALSE var/turf/T = get_turf(src) for(var/mob/living/L in T) @@ -242,13 +245,15 @@ var/atom/location = drop_location() if(!location) return - for(var/atom/movable/AM in location) + for(var/atom/movable/AM as anything in location) + if(iseffect(AM)) + continue + if(AM != src && insert(AM, mapload) == LOCKER_FULL) // limit reached if(mapload) // Yea, it's a mapping issue. Blame mappers. log_mapping("Closet storage capacity of [type] exceeded on mapload at [AREACOORD(src)]") break - for(var/i in reverse_range(location.get_all_contents())) - var/atom/movable/thing = i + for(var/atom/movable/thing as anything in reverse_range(location.get_all_contents())) thing.atom_storage?.close_all() /obj/structure/closet/proc/open(mob/living/user, force = FALSE) @@ -305,7 +310,7 @@ for(var/mob/living/M in contents) if(++mobs_stored >= mob_storage_capacity) return FALSE - L.stop_pulling() + L.release_all_grabs() else if(istype(AM, /obj/structure/closet)) return FALSE @@ -481,7 +486,7 @@ /obj/structure/closet/proc/after_weld(weld_state) return -/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) +/obj/structure/closet/MouseDroppedOn(atom/movable/O, mob/living/user) if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return if(!istype(user) || user.incapacitated() || user.body_position == LYING_DOWN) @@ -568,7 +573,7 @@ set category = "Object" set name = "Toggle Open" - if(!usr.canUseTopic(src, BE_CLOSE) || !isturf(loc)) + if(!usr.canUseTopic(src, USE_CLOSE) || !isturf(loc)) return if(iscarbon(usr) || issilicon(usr) || isdrone(usr)) @@ -631,7 +636,7 @@ /obj/structure/closet/attack_hand_secondary(mob/user, modifiers) . = ..() - if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc)) + if(!user.canUseTopic(src, USE_CLOSE) || !isturf(loc)) return if(!opened && secure) @@ -646,6 +651,7 @@ locked = !locked user.visible_message(span_notice("[user] [locked ? null : "un"]locks [src]."), span_notice("You [locked ? null : "un"]lock [src].")) + playsound(src, 'sound/machines/click.ogg', 15, 1, -3) update_appearance() else if(!silent) to_chat(user, span_alert("Access Denied.")) @@ -685,15 +691,6 @@ req_access = list() req_access += pick(SSid_access.get_region_access_list(list(REGION_ALL_STATION))) -/obj/structure/closet/contents_explosion(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += contents - if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += contents - if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += contents - /obj/structure/closet/singularity_act() dump_contents() ..() diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm index 267cacfa1393..c0e1db00161a 100644 --- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm +++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm @@ -37,7 +37,7 @@ var/t = tgui_input_text(user, "What would you like the label to be?", name, max_length = 53) if(user.get_active_held_item() != interact_tool) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(t) name = "[initial(name)] - [t]" @@ -76,12 +76,23 @@ perform_fold(usr) qdel(src) - /** - * Checks to see if we can fold. Return TRUE to actually perform the fold and delete. - * - * Arguments: - * * the_folder - over_object of MouseDrop aka usr - */ +/obj/structure/closet/body_bag/take_contents(mapload) + . = ..() + if(locate(/mob) in contents) + drag_slowdown = PULL_PRONE_SLOWDOWN + else + drag_slowdown = initial(drag_slowdown) + +/obj/structure/closet/body_bag/dump_contents() + . = ..() + drag_slowdown = initial(drag_slowdown) + +/** + * Checks to see if we can fold. Return TRUE to actually perform the fold and delete. + * + * Arguments: + * * the_folder - over_object of MouseDrop aka usr +*/ /obj/structure/closet/body_bag/proc/attempt_fold(mob/living/carbon/human/the_folder) . = FALSE if(!istype(the_folder)) @@ -273,7 +284,7 @@ open() /obj/structure/closet/body_bag/environmental/prisoner/attack_hand_secondary(mob/user, modifiers) - if(!user.canUseTopic(src, BE_CLOSE) || !isturf(loc)) + if(!user.canUseTopic(src, USE_CLOSE) || !isturf(loc)) return togglelock(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -357,3 +368,18 @@ if(sinched) for(var/mob/living/target in contents) to_chat(target, span_warning("You hear a faint hiss, and a white mist fills your vision...")) + +/obj/structure/closet/body_bag/stasis + name = "stasis bag" + desc = "A highly advanced and highly expensive device for suspending living creatures during medical transport." + icon_state = "ntenvirobag" + +/obj/structure/closet/body_bag/stasis/take_contents(mapload) + . = ..() + for(var/mob/living/L in contents) + L.apply_status_effect(/datum/status_effect/grouped/hard_stasis, STASIS_BODYBAG_EFFECT) + +/obj/structure/closet/body_bag/stasis/dump_contents() + for(var/mob/living/L in contents) + L.remove_status_effect(/datum/status_effect/grouped/hard_stasis, STASIS_BODYBAG_EFFECT) + return ..() diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 93327f471278..f31447f0342a 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -132,3 +132,10 @@ new /obj/item/food/breadslice/moldy/bacteria(src) else if(prob(30)) new /obj/item/food/syndicake(src) + +/obj/structure/closet/mini_fridge/clean + name = "mini-fridge" + desc = "A small contraption designed to imbue a few drinks with a pleasant chill." + + +/obj/structure/closet/mini_fridge/clean/PopulateContents() 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 c576a86f0f5a..e93493b0412a 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -17,7 +17,7 @@ /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/reagent_containers/glass/rag = 2, /obj/item/storage/box/beanbag = 1, - /obj/item/clothing/suit/armor/vest/alt = 1, + /obj/item/clothing/suit/armor/vest/ballistic = 1, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/glasses/sunglasses/reagent = 1, /obj/item/clothing/neck/petcollar = 1, @@ -281,7 +281,6 @@ /obj/item/clothing/under/rank/rnd/scientist = 3, /obj/item/clothing/suit/toggle/labcoat/science = 3, /obj/item/clothing/shoes/sneakers/white = 3, - /obj/item/radio/headset/headset_sci = 2, /obj/item/clothing/mask/gas = 3) generate_items_inside(items_inside,src) return 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 6a1930f4d810..4a58b817f148 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -19,7 +19,6 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/head/soft(src) new /obj/item/export_scanner(src) - new /obj/item/door_remote/quartermaster(src) new /obj/item/circuitboard/machine/fabricator/department/cargo(src) new /obj/item/storage/photo_album/qm(src) new /obj/item/circuitboard/machine/ore_silo(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 748baabef0bb..0c25fdae5012 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -13,7 +13,6 @@ new /obj/item/areaeditor/blueprints(src) new /obj/item/storage/briefcase/inflatable(src) new /obj/item/assembly/flash/handheld(src) - new /obj/item/door_remote/chief_engineer(src) new /obj/item/pipe_dispenser(src) new /obj/item/circuitboard/machine/fabricator/department/engineering(src) new /obj/item/extinguisher/advanced(src) @@ -64,6 +63,7 @@ new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/stack/sticky_tape(src) + new /obj/item/paint_sprayer(src) new /obj/item/storage/box/emptysandbags(src) new /obj/item/storage/bag/construction(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index 1e9e86791f47..05f819dc34ea 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -108,12 +108,10 @@ /obj/structure/closet/secure_closet/freezer/money/PopulateContents() ..() - for(var/i in 1 to 3) - new /obj/item/stack/spacecash/c1000(src) for(var/i in 1 to 5) - new /obj/item/stack/spacecash/c500(src) - for(var/i in 1 to 6) - new /obj/item/stack/spacecash/c200(src) + new /obj/item/stack/spacecash/c1000(src) + for(var/i in 1 to 15) + new /obj/item/stack/spacecash/c100(src) /obj/structure/closet/secure_closet/freezer/cream_pie name = "cream pie closet" 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 39c62d4a5f0b..07a261fd7d0e 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -14,7 +14,7 @@ /obj/item/reagent_containers/glass/bottle/toxin = 1, /obj/item/reagent_containers/glass/bottle/morphine = 2, /obj/item/reagent_containers/glass/bottle/epinephrine= 3, - /obj/item/reagent_containers/glass/bottle/multiver = 3, + /obj/item/reagent_containers/glass/bottle/dylovene = 3, /obj/item/storage/box/rxglasses = 1) generate_items_inside(items_inside,src) @@ -31,7 +31,7 @@ new /obj/item/clothing/mask/muzzle/breath(src) /obj/structure/closet/secure_closet/medical3 - name = "medical doctor's locker" + name = "'s locker" req_access = list(ACCESS_SURGERY) icon_state = "med_secure" @@ -59,7 +59,6 @@ new /obj/item/clothing/under/suit/black/skirt(src) new /obj/item/clothing/shoes/laceup(src) new /obj/item/storage/backpack/medic(src) - new /obj/item/radio/headset/headset_srvmed(src) new /obj/item/clipboard(src) new /obj/item/clothing/suit/straight_jacket(src) new /obj/item/clothing/ears/earmuffs(src) @@ -81,22 +80,15 @@ new /obj/item/radio/headset/heads/cmo(src) new /obj/item/megaphone/command(src) new /obj/item/defibrillator/compact/loaded(src) - new /obj/item/healthanalyzer/advanced(src) new /obj/item/assembly/flash/handheld(src) - // new /obj/item/reagent_containers/hypospray/cmo(src) //ORIGINAL - new /obj/item/storage/hypospraykit/cmo(src) //PARIAH EDIT - new /obj/item/autosurgeon/organ/cmo(src) - new /obj/item/door_remote/chief_medical_officer(src) - new /obj/item/clothing/neck/petcollar(src) - new /obj/item/pet_carrier(src) + new /obj/item/reagent_containers/hypospray/cmo(src) new /obj/item/wallframe/defib_mount(src) new /obj/item/circuitboard/machine/fabricator/department/medical(src) new /obj/item/storage/photo_album/cmo(src) new /obj/item/storage/lockbox/medal/med(src) new /obj/item/gun/ballistic/rifle/tranqrifle(src) - new /obj/item/ammo_box/magazine/tranq_rifle(src) - new /obj/item/ammo_box/magazine/tranq_rifle/mutadone(src) - + new /obj/item/ammo_box/magazine/tranq_rifle/ryetalyn(src) + new /obj/item/ammo_box/magazine/tranq_rifle/ryetalyn(src) /obj/structure/closet/secure_closet/animal name = "animal control" @@ -120,11 +112,7 @@ new /obj/item/storage/box/pillbottles(src) new /obj/item/storage/box/medigels(src) new /obj/item/storage/box/medigels(src) - new /obj/item/storage/box/hypospray(src) //PARIAH EDIT ADDITION - new /obj/item/storage/box/hypospray(src) //PARIAH EDIT ADDITION - new /obj/item/ph_booklet(src) new /obj/item/reagent_containers/dropper(src) - new /obj/item/reagent_containers/glass/bottle/acidic_buffer(src) //hopefully they get the hint /obj/structure/closet/secure_closet/chemical/heisenberg //contains one of each beaker, syringe etc. name = "advanced chemical closet" @@ -137,3 +125,18 @@ new /obj/item/storage/box/syringes/variety(src) new /obj/item/storage/box/beakers/variety(src) new /obj/item/clothing/glasses/science(src) + +/obj/structure/closet/secure_closet/chemical/cartridge + name = "cartridge closet" + desc = "Store dangerous chemical cartridges in here." + req_access = list(ACCESS_PHARMACY) + icon_door = "chemical" + +/obj/structure/closet/secure_closet/chemical/cartridge/PopulateContents() + var/list/spawn_cartridges = GLOB.cartridge_list_chems + + for(var/datum/reagent/chem_type as anything in spawn_cartridges) + var/obj/item/reagent_containers/chem_cartridge/chem_cartridge = spawn_cartridges[chem_type] + chem_cartridge = new chem_cartridge(src) + chem_cartridge.reagents.add_reagent(chem_type, chem_cartridge.volume) + chem_cartridge.setLabel(initial(chem_type.name)) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm index 91f1690858a0..0cb19bbd660d 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/misc.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/misc.dm @@ -62,6 +62,6 @@ new /obj/item/stack/sheet/glass(src, 50) new /obj/item/stack/sheet/mineral/sandbags(src, 30) new /obj/item/clothing/shoes/magboots(src) - new /obj/item/storage/box/smart_metal_foam(src) + new /obj/item/storage/box/metalfoam(src) for(var/i in 1 to 3) new /obj/item/rcd_ammo/large(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 092c653fcae8..ff675905acd4 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -10,30 +10,11 @@ new /obj/item/clothing/head/bio_hood/scientist(src) new /obj/item/storage/bag/garment/research_director(src) new /obj/item/computer_hardware/hard_drive/role/rd(src) - new /obj/item/radio/headset/heads/rd(src) new /obj/item/megaphone/command(src) new /obj/item/storage/lockbox/medal/sci(src) new /obj/item/clothing/suit/armor/reactive/teleport(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/laser_pointer(src) - new /obj/item/door_remote/research_director(src) new /obj/item/circuitboard/machine/fabricator/omni(src) new /obj/item/storage/photo_album/rd(src) new /obj/item/storage/box/skillchips/science(src) - -/obj/structure/closet/secure_closet/cytology - name = "cytology equipment locker" - icon_state = "science" - req_access = list(ACCESS_RESEARCH) - -/obj/structure/closet/secure_closet/cytology/PopulateContents() - . = ..() - new /obj/item/pushbroom(src) - new /obj/item/plunger(src) - new /obj/item/storage/bag/xeno(src) - new /obj/item/storage/box/petridish(src) - new /obj/item/stack/ducts/fifty(src) - for(var/i in 1 to 2) - new /obj/item/biopsy_tool(src) - new /obj/item/storage/box/swab(src) - new /obj/item/construction/plumbing/research(src) 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 4c8ddc347c69..0fcb20faedac 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,6 +4,6 @@ locked = TRUE icon_state = "secure" max_integrity = 250 - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 100, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) secure = TRUE - damage_deflection = 20 + damage_deflection = 18 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 eb37db69ae16..d04fcc9cfa8c 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -18,7 +18,6 @@ new /obj/item/radio/headset/heads/captain(src) 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/storage/photo_album/captain(src) /obj/structure/closet/secure_closet/hop @@ -39,13 +38,12 @@ new /obj/item/gun/energy/e_gun(src) new /obj/item/clothing/neck/petcollar(src) new /obj/item/pet_carrier(src) - new /obj/item/door_remote/civilian(src) new /obj/item/circuitboard/machine/fabricator/department/service(src) new /obj/item/storage/photo_album/hop(src) new /obj/item/storage/lockbox/medal/hop(src) /obj/structure/closet/secure_closet/hos - name = "\proper head of security's locker" + name = "\proper security marshal's locker" req_access = list(ACCESS_HOS) icon_state = "hos" @@ -54,7 +52,6 @@ new /obj/item/computer_hardware/hard_drive/role/hos(src) new /obj/item/radio/headset/heads/hos(src) - new /obj/item/storage/bag/garment/hos(src) new /obj/item/storage/lockbox/medal/sec(src) new /obj/item/megaphone/sec(src) new /obj/item/holosign_creator/security(src) @@ -91,7 +88,6 @@ new /obj/item/storage/belt/security/full(src) new /obj/item/flashlight/seclite(src) new /obj/item/clothing/gloves/krav_maga/sec(src) - new /obj/item/door_remote/head_of_security(src) /obj/structure/closet/secure_closet/security name = "security officer's locker" @@ -118,31 +114,27 @@ /obj/structure/closet/secure_closet/security/cargo/PopulateContents() ..() new /obj/item/clothing/accessory/armband/cargo(src) - new /obj/item/encryptionkey/headset_cargo(src) /obj/structure/closet/secure_closet/security/engine /obj/structure/closet/secure_closet/security/engine/PopulateContents() ..() new /obj/item/clothing/accessory/armband/engine(src) - new /obj/item/encryptionkey/headset_eng(src) /obj/structure/closet/secure_closet/security/science /obj/structure/closet/secure_closet/security/science/PopulateContents() ..() new /obj/item/clothing/accessory/armband/science(src) - new /obj/item/encryptionkey/headset_sci(src) /obj/structure/closet/secure_closet/security/med /obj/structure/closet/secure_closet/security/med/PopulateContents() ..() new /obj/item/clothing/accessory/armband/medblue(src) - new /obj/item/encryptionkey/headset_med(src) /obj/structure/closet/secure_closet/detective - name = "\improper detective's cabinet" + name = "\improper investigator's cabinet" req_access = list(ACCESS_FORENSICS) icon_state = "cabinet" resistance_flags = FLAMMABLE @@ -154,16 +146,15 @@ /obj/structure/closet/secure_closet/detective/PopulateContents() ..() 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/storage/belt/holster/detective/full(src) + new /obj/item/storage/belt/holster/shoulder/full(src) new /obj/item/pinpointer/crew(src) new /obj/item/binoculars(src) new /obj/item/storage/box/rxglasses/spyglasskit(src) + new /obj/item/storage/scene_cards(src) /obj/structure/closet/secure_closet/injection name = "lethal injections" @@ -259,7 +250,7 @@ /obj/structure/closet/secure_closet/contraband/heads anchored = TRUE name = "Contraband Locker" - req_access = list(ACCESS_HEADS) + req_access = list(ACCESS_MANAGEMENT) /obj/structure/closet/secure_closet/armory1 name = "armory armor locker" diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index a42797a7aa1e..24ed6ed21512 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -16,7 +16,7 @@ new /obj/item/storage/belt/military(src) new /obj/item/crowbar/red(src) new /obj/item/clothing/glasses/night(src) - new /obj/item/storage/belt/holster/nukie(src) + new /obj/item/storage/belt/holster/shoulder/nukie(src) new /obj/item/pickaxe/drill/diamonddrill(src) /obj/structure/closet/syndicate/nuclear 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 03e5a64e6eb0..057c20118258 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -26,12 +26,13 @@ if (prob(40)) new /obj/item/storage/toolbox/emergency(src) - switch (pick_weight(list("small" = 35, "aid" = 30, "tank" = 20, "both" = 10, "nothing" = 4, "delete" = 1))) + switch (pick_weight(list("small" = 35, "aid" = 30, "tank" = 20, "both" = 10, "inflatables" = 10, "nothing" = 4, "delete" = 1))) if ("small") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/mask/breath(src) + new /obj/item/inflatable/shelter(src) if ("aid") new /obj/item/tank/internals/emergency_oxygen(src) @@ -41,11 +42,17 @@ if ("tank") new /obj/item/tank/internals/oxygen(src) new /obj/item/clothing/mask/breath(src) + new /obj/item/inflatable/shelter(src) if ("both") new /obj/item/tank/internals/emergency_oxygen(src) new /obj/item/clothing/mask/breath(src) + if ("inflatables") + new /obj/item/tank/internals/emergency_oxygen(src) + new /obj/item/clothing/mask/breath(src) + new /obj/item/storage/briefcase/inflatable(src) + if ("nothing") // doot diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6791fb2caec3..dd828bb56308 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -89,9 +89,8 @@ to_chat(user, span_notice("You tear the manifest off of [src].")) playsound(src, 'sound/items/poster_ripped.ogg', 75, TRUE) - manifest.forceMove(loc) - if(ishuman(user)) - user.put_in_hands(manifest) + if(!user.put_in_hands(manifest)) + manifest.forceMove(loc.drop_location()) manifest = null update_appearance() @@ -109,22 +108,6 @@ close_sound_volume = 50 can_install_electronics = FALSE -/obj/structure/closet/crate/maint - -/obj/structure/closet/crate/maint/Initialize(mapload) - ..() - return INITIALIZE_HINT_QDEL - -/obj/structure/closet/crate/maint/PopulateContents() - . = ..() - new /obj/effect/spawner/random/structure/crate_empty(loc) - for(var/i in 1 to rand(2,6)) - new /obj/effect/spawner/random/maintenance(src) - -/obj/structure/closet/crate/trashcart/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLUDGE, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 15) - /obj/structure/closet/crate/trashcart/filled /obj/structure/closet/crate/trashcart/filled/PopulateContents() @@ -202,7 +185,6 @@ new /obj/item/reagent_containers/blood/o_plus(src) new /obj/item/reagent_containers/blood/lizard(src) new /obj/item/reagent_containers/blood/ethereal(src) - new /obj/item/reagent_containers/blood/skrell(src) for(var/i in 1 to 3) new /obj/item/reagent_containers/blood/random(src) diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index c14d2ab30715..0eed031b29df 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -5,9 +5,10 @@ secure = TRUE locked = TRUE max_integrity = 500 - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 100, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) var/tamperproof = 0 - damage_deflection = 25 + + damage_deflection = 18 /obj/structure/closet/crate/secure/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) if(prob(tamperproof) && damage_amount >= DAMAGE_PRECISION) diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm index 1b04e3dfdcb8..298d1f4e6145 100644 --- a/code/game/objects/structures/deployable_turret.dm +++ b/code/game/objects/structures/deployable_turret.dm @@ -237,7 +237,7 @@ /obj/item/gun_control/CanItemAutoclick() return TRUE -/obj/item/gun_control/attack_atom(obj/O, mob/living/user, params) +/obj/item/gun_control/attack_obj(obj/O, mob/living/user, params) user.changeNext_move(CLICK_CD_MELEE) O.attacked_by(src, user) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index b1e22697d5e5..b8b78f5eb268 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE resistance_flags = ACID_PROOF - armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 70, ACID = 100) + armor = list(BLUNT = 30, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 70, ACID = 100) max_integrity = 200 integrity_failure = 0.25 var/obj/item/showpiece = null @@ -322,7 +322,7 @@ return if(is_locked) - to_chat(user, span_warning("The case is shut tight with an old-fashioned physical lock. Maybe you should ask the curator for the key?")) + to_chat(user, span_warning("The case is shut tight with an old-fashioned physical lock. Maybe you should ask the archivist for the key?")) return if(!added_roundstart) @@ -380,7 +380,7 @@ /obj/item/key/displaycase name = "display case key" - desc = "The key to the curator's display cases." + desc = "The key to the archivist's display cases." /obj/item/showpiece_dummy name = "Cheap replica" @@ -458,7 +458,7 @@ if(!payments_acc) to_chat(usr, span_notice("[src] hasn't been registered yet.")) return TRUE - if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE if(!potential_acc) to_chat(usr, span_notice("No ID card detected.")) @@ -477,7 +477,7 @@ usr.put_in_hands(showpiece) to_chat(usr, span_notice("You purchase [showpiece] for [sale_price] credits.")) playsound(src, 'sound/effects/cashregister.ogg', 40, TRUE) - flick("[initial(icon_state)]_vend", src) + z_flick("[initial(icon_state)]_vend", src) showpiece = null update_appearance() SStgui.update_uis(src) @@ -514,7 +514,7 @@ if(payments_acc != potential_acc.registered_account) to_chat(usr, span_warning("[src] rejects your new price.")) return - if(!usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) to_chat(usr, span_warning("You need to get closer!")) return sale_price = new_price_input diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index a550f7db135c..250f7c56e426 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -9,7 +9,7 @@ /obj/structure/sacrificealtar/AltClick(mob/living/user) ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) return if(!has_buckled_mobs()) return @@ -39,7 +39,7 @@ return last_process = world.time to_chat(user, span_notice("The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.")) - user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20) + user.reagents.add_reagent(/datum/reagent/medicine/tricordrazine/godblood,20) update_appearance() addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), time_between_uses) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index c755c0af96d2..c0c5b6ad3ed4 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -4,7 +4,10 @@ icon_state = "construction" anchored = FALSE density = TRUE - max_integrity = 200 + + max_integrity = 120 + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 90, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 80, ACID = 70) + var/state = AIRLOCK_ASSEMBLY_NEEDS_WIRES var/base_name = "airlock" var/mineral = null @@ -44,6 +47,8 @@ update_appearance() update_name() + AddComponent(/datum/component/simple_rotation) + /obj/structure/door_assembly/examine(mob/user) . = ..() var/doorname = "" @@ -315,7 +320,7 @@ if(!glass && has_fill_overlays) . += get_airlock_overlay("fill_construction", stripe_overlays, color = stripe_paint) - . += get_airlock_overlay("panel_c[state+1]", overlays_file, TRUE) + . += get_airlock_overlay("panelAddComponent(/datum/component/simple_rotation, ROTATION_REQUIRE_WRENCH|ROTATION_IGNORE_ANCHORED)_c[state+1]", overlays_file, TRUE) /obj/structure/door_assembly/update_name() name = "" @@ -330,6 +335,9 @@ name += "[heat_proof_finished ? "heat-proofed " : ""][glass ? "window " : ""][base_name] assembly" return ..() +/obj/structure/door_assembly/AltClick(mob/user) + return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation + /obj/structure/door_assembly/proc/transfer_assembly_vars(obj/structure/door_assembly/source, obj/structure/door_assembly/target, previous = FALSE) target.glass = source.glass target.heat_proof_finished = source.heat_proof_finished @@ -377,3 +385,32 @@ qdel(src) return TRUE return FALSE + +/obj/structure/door_assembly/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + + density = FALSE + var/is_user_adjacent = user.Adjacent(src) + density = TRUE + + if(!is_user_adjacent) + return + + . = TRUE + + if(!do_after(user, src, 5 SECONDS, DO_PUBLIC)) + return + + shimmy_through(user) + +/// Move a mob into our loc. +/obj/structure/door_assembly/proc/shimmy_through(mob/living/user) + set_density(FALSE) + . = user.Move(get_turf(src), get_dir(user, src)) + set_density(TRUE) + + if(.) + user.visible_message(span_notice("[user] shimmies their way through [src].")) + diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 4653227a1f29..93d88ec91bdb 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -1,3 +1,4 @@ +DEFINE_INTERACTABLE(/obj/structure/extinguisher_cabinet) /obj/structure/extinguisher_cabinet name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." @@ -20,10 +21,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) else stored_extinguisher = new /obj/item/extinguisher(src) -/obj/structure/extinguisher_cabinet/examine(mob/user) - . = ..() - . += span_notice("Alt-click to [opened ? "close":"open"] it.") - /obj/structure/extinguisher_cabinet/Destroy() if(stored_extinguisher) qdel(stored_extinguisher) @@ -36,11 +33,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += stored_extinguisher + EX_ACT(stored_extinguisher, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += stored_extinguisher + EX_ACT(stored_extinguisher, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += stored_extinguisher + EX_ACT(stored_extinguisher, EXPLODE_LIGHT) /obj/structure/extinguisher_cabinet/handle_atom_del(atom/A) if(A == stored_extinguisher) @@ -109,8 +106,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29) /obj/structure/extinguisher_cabinet/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) +/obj/structure/extinguisher_cabinet/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + toggle_cabinet(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/structure/extinguisher_cabinet/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS)) return toggle_cabinet(user) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 3228d024d72a..76f006251a9a 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -14,8 +14,8 @@ opacity = TRUE max_integrity = 100 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS can_be_unanchored = FALSE can_atmos_pass = CANPASS_PROC rad_insulation = RAD_MEDIUM_INSULATION @@ -34,9 +34,6 @@ //These are set by the material, do not touch!!! var/material_color - var/shiny_wall - - var/shiny_stripe var/stripe_icon //Ok you can touch vars again :) @@ -116,19 +113,10 @@ if(density && !opening) color = wall_paint || material_color - if(shiny_wall) - var/image/shine = image(icon, "shine-[smoothing_junction]") - shine.appearance_flags = RESET_COLOR - new_overlays += shine - var/image/smoothed_stripe = image(stripe_icon, icon_state) smoothed_stripe.appearance_flags = RESET_COLOR smoothed_stripe.color = stripe_paint || material_color new_overlays += smoothed_stripe - if(shiny_stripe) - var/image/stripe_shine = image(stripe_icon, "shine-[smoothing_junction]") - stripe_shine.appearance_flags = RESET_COLOR - new_overlays += stripe_shine var/neighbor_stripe = NONE if(!neighbor_typecache) @@ -136,7 +124,9 @@ for(var/cardinal in GLOB.cardinals) var/turf/step_turf = get_step(src, cardinal) - if(!can_area_smooth(step_turf)) + var/can_area_smooth + CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth) + if(isnull(can_area_smooth)) continue for(var/atom/movable/movable_thing as anything in step_turf) if(neighbor_typecache[movable_thing.type]) @@ -148,10 +138,6 @@ neighb_stripe_overlay.appearance_flags = RESET_COLOR neighb_stripe_overlay.color = stripe_paint || material_color new_overlays += neighb_stripe_overlay - if(shiny_wall) - var/image/shine = image('icons/turf/walls/neighbor_stripe.dmi', "shine-[smoothing_junction]") - shine.appearance_flags = RESET_COLOR - new_overlays += shine overlays = new_overlays //And letting anything else that may want to render on the wall to work (ie components) @@ -220,14 +206,11 @@ if(reinf_mat_ref) icon = plating_mat_ref.reinforced_wall_icon - shiny_wall = plating_mat_ref.wall_shine & WALL_SHINE_REINFORCED material_color = plating_mat_ref.wall_color else icon = plating_mat_ref.wall_icon - shiny_wall = plating_mat_ref.wall_shine & WALL_SHINE_PLATING material_color = plating_mat_ref.wall_color - shiny_stripe = plating_mat_ref.wall_shine & WALL_SHINE_PLATING stripe_icon = plating_mat_ref.wall_stripe_icon plating_material = plating_mat @@ -236,9 +219,12 @@ if(reinf_material) name = "reinforced [plating_mat_ref.name] [plating_mat_ref.wall_name]" desc = "It seems to be a section of hull reinforced with [reinf_mat_ref.name] and plated with [plating_mat_ref.name]." + explosion_block = initial(explosion_block) * 2 else name = "[plating_mat_ref.name] [plating_mat_ref.wall_name]" desc = "It seems to be a section of hull plated with [plating_mat_ref.name]." + explosion_block = initial(explosion_block) + matset_name = name if(update_appearance) @@ -388,13 +374,13 @@ desc = "A light-weight titanium wall used in shuttles." icon = 'icons/turf/walls/metal_wall.dmi' plating_material = /datum/material/titanium - smoothing_groups = list(SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS, SMOOTH_GROUP_SHUTTLE_PARTS) + smoothing_groups = SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS /obj/structure/falsewall/plastitanium name = "wall" desc = "An evil wall of plasma and titanium." icon = 'icons/turf/walls/metal_wall.dmi' plating_material = /datum/material/alloy/plastitanium - smoothing_groups = list(SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS, SMOOTH_GROUP_SHUTTLE_PARTS) + smoothing_groups = SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index afe3fd8d9f95..646ef5860067 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -5,7 +5,7 @@ icon_state = "fireaxe" anchored = TRUE density = FALSE - armor = list(MELEE = 50, BULLET = 20, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 90, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 20, SLASH = 90, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 90, ACID = 50) max_integrity = 150 integrity_failure = 0.33 var/locked = TRUE @@ -116,7 +116,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32) user.put_in_hands(fireaxe) fireaxe = null to_chat(user, span_notice("You take the fire axe from the [name].")) - src.add_fingerprint(user) + add_fingerprint(user) update_appearance() return if(locked) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 1e98c9fe8ae9..a86b1c651b3d 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -30,14 +30,22 @@ herbage = TRUE wood = TRUE +/obj/structure/flora/tree/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seethrough, get_seethrough_map()) + +///Return a see_through_map, examples in seethrough.dm +/obj/structure/flora/tree/proc/get_seethrough_map() + return SEE_THROUGH_MAP_DEFAULT + /obj/structure/flora/tree/attackby(obj/item/attacking_item, mob/user, params) if(!log_amount || flags_1 & NODECONSTRUCT_1) return ..() if(!(attacking_item.sharpness & SHARP_EDGED) || attacking_item.force <= 0) return ..() var/my_turf = get_turf(src) - if(attacking_item.hitsound) - playsound(my_turf, attacking_item.hitsound, 100, FALSE, FALSE) + if(attacking_item.get_hitsound()) + playsound(my_turf, attacking_item.get_hitsound(), 100, FALSE, FALSE) user.visible_message(span_notice("[user] begins to cut down [src] with [attacking_item]."),span_notice("You begin to cut down [src] with [attacking_item]."), span_hear("You hear sawing.")) if(!do_after(user, src, 1000/attacking_item.force)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. return @@ -72,6 +80,9 @@ if(islist(icon_states?.len)) icon_state = pick(icon_states) +/obj/structure/flora/tree/pine/get_seethrough_map() + return SEE_THROUGH_MAP_DEFAULT_TWO_TALL + /obj/structure/flora/tree/pine/xmas name = "xmas tree" desc = "A wondrous decorated Christmas tree." @@ -157,11 +168,17 @@ icon_state = "[icon_state][rand(1, 6)]" . = ..() +/obj/structure/flora/tree/jungle/get_seethrough_map() + return SEE_THROUGH_MAP_THREE_X_THREE + /obj/structure/flora/tree/jungle/small pixel_y = 0 pixel_x = -32 icon = 'icons/obj/flora/jungletreesmall.dmi' +/obj/structure/flora/tree/jungle/small/get_seethrough_map() + return SEE_THROUGH_MAP_THREE_X_TWO + //grass /obj/structure/flora/grass name = "grass" @@ -334,7 +351,6 @@ w_class = WEIGHT_CLASS_HUGE force = 10 throwforce = 13 - throw_speed = 2 throw_range = 4 item_flags = NO_PIXEL_RANDOM_DROP @@ -342,10 +358,10 @@ var/trimmable = TRUE var/list/static/random_plant_states -/obj/item/kirbyplants/ComponentInitialize() +/obj/item/kirbyplants/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) AddComponent(/datum/component/tactical) - AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_unwielded=10, force_wielded=10) AddElement(/datum/element/beauty, 500) /obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, params) @@ -423,10 +439,6 @@ icon_state = "fern" trimmable = FALSE -/obj/item/kirbyplants/fern/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_ALGAE, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 5) - //a rock is flora according to where the icon file is //and now these defines diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 05f35ed77d7b..f352f7623563 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -25,18 +25,14 @@ qdel(src) return ..() -/** - * Empty terrariums are created when a preserved terrarium in a lavaland seed vault is activated. - */ + /obj/structure/fluff/empty_terrarium name = "empty terrarium" desc = "An ancient machine that seems to be used for storing plant matter. Its hatch is ajar." icon = 'icons/obj/lavaland/spawners.dmi' icon_state = "terrarium_open" density = TRUE -/** - * Empty sleepers are created by a good few ghost roles in lavaland. - */ + /obj/structure/fluff/empty_sleeper name = "empty sleeper" desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not broken." @@ -51,9 +47,7 @@ /obj/structure/fluff/empty_sleeper/syndicate icon_state = "sleeper_s-open" -/** - * Empty cryostasis sleepers are created when a malfunctioning cryostasis sleeper in a lavaland shelter is activated. - */ + /obj/structure/fluff/empty_cryostasis_sleeper name = "empty cryostasis sleeper" desc = "Although comfortable, this sleeper won't function as anything but a bed ever again." @@ -65,27 +59,6 @@ desc = "A segment of broken flooring." icon = 'icons/obj/brokentiling.dmi' icon_state = "corner" -/** - * Ash drake status spawn on either side of the necropolis gate in lavaland. - */ -/obj/structure/fluff/drake_statue - name = "drake statue" - desc = "A towering basalt sculpture of a proud and regal drake. Its eyes are six glowing gemstones." - icon = 'icons/effects/64x64.dmi' - icon_state = "drake_statue" - pixel_x = -16 - maptext_height = 64 - maptext_width = 64 - density = TRUE - deconstructible = FALSE - layer = EDGED_TURF_LAYER -/** - * A variety of statue in disrepair; parts are broken off and a gemstone is missing - */ -/obj/structure/fluff/drake_statue/falling - desc = "A towering basalt sculpture of a drake. Cracks run down its surface and parts of it have fallen off." - icon_state = "drake_statue_falling" - /obj/structure/fluff/bus name = "bus" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index d42e827015f4..42a7daf6a6ce 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -74,7 +74,7 @@ if(next_beep <= world.time) next_beep = world.time + 10 playsound(src, 'sound/machines/clockcult/integration_cog_install.ogg', 50, TRUE) - add_fingerprint(user) + W.leave_evidence(user, src) if(istype(W, /obj/item/gun/energy/plasmacutter)) to_chat(user, span_notice("You start slicing apart the girder...")) @@ -172,7 +172,7 @@ qdel(src) return - add_hiddenprint(user) + log_touch(user) else if(istype(W, /obj/item/pipe)) var/obj/item/pipe/P = W @@ -254,10 +254,14 @@ if((mover.pass_flags & PASSGRILLE) || istype(mover, /obj/projectile)) return prob(girderpasschance) -/obj/structure/girder/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - . = !density - if(istype(caller)) - . = . || (caller.pass_flags & PASSGRILLE) +/obj/structure/girder/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + + if(pass_info.pass_flags & PASSGRILLE) + return TRUE + + return FALSE /obj/structure/girder/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -294,7 +298,7 @@ can_displace = FALSE /obj/structure/girder/cult/attackby(obj/item/W, mob/user, params) - add_fingerprint(user) + W.leave_evidence(user, src) if(istype(W, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user)) //Cultists can demolish cult girders instantly with their tomes user.visible_message(span_warning("[user] strikes [src] with [W]!"), span_notice("You demolish [src].")) new /obj/item/stack/sheet/runed_metal(drop_location(), 1) @@ -370,7 +374,7 @@ can_displace = FALSE /obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, params) - add_fingerprint(user) + W.leave_evidence(user, src) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount = 0)) return diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 496f9bb42a22..e7a04fcf1661 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -14,12 +14,12 @@ can_atmos_pass = CANPASS_ALWAYS flags_1 = CONDUCT_1 //pressure_resistance = 5*ONE_ATMOSPHERE - armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) + armor = list(BLUNT = 50, PUNCTURE = 70, SLASH = 90, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) max_integrity = 50 integrity_failure = 0.4 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_GRILLE) - canSmoothWith = list(SMOOTH_GROUP_GRILLE) + smoothing_groups = SMOOTH_GROUP_GRILLE + canSmoothWith = SMOOTH_GROUP_GRILLE var/rods_type = /obj/item/stack/rods var/rods_amount = 2 var/rods_broken = TRUE @@ -98,7 +98,7 @@ return TRUE return FALSE -/obj/structure/grille/Bumped(atom/movable/AM) +/obj/structure/grille/BumpedBy(atom/movable/AM) if(!ismob(AM)) return var/mob/M = AM @@ -109,7 +109,7 @@ if(!.) return if(!shock(user, 70) && !QDELETED(src)) //Last hit still shocks but shouldn't deal damage to the grille - take_damage(rand(5,10), BRUTE, MELEE, 1) + take_damage(rand(5,10), BRUTE, BLUNT, 1) /obj/structure/grille/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -131,24 +131,27 @@ user.visible_message(span_warning("[user] hits [src]."), null, null, COMBAT_MESSAGE_RANGE) log_combat(user, src, "hit") if(!shock(user, 70)) - take_damage(rand(5,10), BRUTE, MELEE, 1) + take_damage(rand(5,10), BRUTE, BLUNT, 1) /obj/structure/grille/attack_alien(mob/living/user, list/modifiers) user.do_attack_animation(src) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_warning("[user] mangles [src]."), null, null, COMBAT_MESSAGE_RANGE) if(!shock(user, 70)) - take_damage(20, BRUTE, MELEE, 1) + take_damage(20, BRUTE, BLUNT, 1) /obj/structure/grille/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(!. && istype(mover, /obj/projectile)) return prob(30) -/obj/structure/grille/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - . = !density - if(caller) - . = . || (caller.pass_flags & PASSGRILLE) +/obj/structure/grille/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + + if(pass_info.pass_flags & PASSGRILLE) + return TRUE + return FALSE /obj/structure/grille/wirecutter_act(mob/living/user, obj/item/tool) add_fingerprint(user) @@ -172,7 +175,7 @@ /obj/structure/grille/attackby(obj/item/W, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) - add_fingerprint(user) + W.leave_evidence(user, src) if(istype(W, /obj/item/stack/rods) && broken) if(shock(user, 90)) return @@ -221,7 +224,8 @@ rods_amount = 1 rods_broken = FALSE var/obj/R = new rods_type(drop_location(), rods_broken) - transfer_fingerprints_to(R) + if(!QDELING(R)) + transfer_fingerprints_to(R) smoothing_flags = NONE update_appearance() diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm index 1956465ad310..87e0f2f8fa86 100644 --- a/code/game/objects/structures/guillotine.dm +++ b/code/game/objects/structures/guillotine.dm @@ -161,7 +161,7 @@ else H.apply_damage(15 * blade_sharpness, BRUTE, head) log_combat(user, H, "dropped the blade on", src, " non-fatally") - H.emote("scream") + H.emote("agony") if (blade_sharpness > 1) blade_sharpness -= 1 @@ -171,7 +171,7 @@ /obj/structure/guillotine/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/sharpener)) - add_fingerprint(user) + W.leave_evidence(user, src) if (blade_status == GUILLOTINE_BLADE_SHARPENING) return @@ -216,7 +216,6 @@ if (!istype(M, /mob/living/carbon/human)) return - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "dying", /datum/mood_event/deaths_door) var/mob/living/carbon/human/H = M if (H.dna) @@ -241,7 +240,6 @@ M.regenerate_icons() M.pixel_y -= -GUILLOTINE_HEAD_OFFSET // Move their body back M.layer -= GUILLOTINE_LAYER_DIFF - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "dying") ..() /obj/structure/guillotine/can_be_unfasten_wrench(mob/user, silent) diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm index a8eda7c9889e..fe69bcd16e37 100644 --- a/code/game/objects/structures/guncase.dm +++ b/code/game/objects/structures/guncase.dm @@ -112,15 +112,6 @@ /obj/structure/guncase/handle_atom_del(atom/A) update_appearance() -/obj/structure/guncase/contents_explosion(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += contents - if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += contents - if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += contents - /obj/structure/guncase/shotgun name = "shotgun locker" desc = "A locker that holds shotguns." diff --git a/code/game/objects/structures/gym.dm b/code/game/objects/structures/gym.dm index d68823758ac1..d40dde8c9e7b 100644 --- a/code/game/objects/structures/gym.dm +++ b/code/game/objects/structures/gym.dm @@ -5,8 +5,12 @@ icon_state = "punchingbag" anchored = TRUE layer = WALL_OBJ_LAYER - var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\ - 'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') + var/list/hit_sounds = list( + 'sound/weapons/genhit1.ogg', + 'sound/weapons/genhit2.ogg', + 'sound/weapons/genhit3.ogg', + SFX_PUNCH + ) /obj/structure/punching_bag/attack_hand(mob/user, list/modifiers) . = ..() @@ -16,7 +20,6 @@ playsound(loc, pick(hit_sounds), 25, TRUE, -1) if(isliving(user)) var/mob/living/L = user - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise) L.apply_status_effect(/datum/status_effect/exercised) /obj/structure/weightmachine @@ -43,7 +46,7 @@ . = ..() if(.) return - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return if(obj_flags & IN_USE) to_chat(user, span_warning("It's already in use - wait a bit!")) @@ -63,7 +66,6 @@ update_appearance() user.pixel_y = user.base_pixel_y var/finishmessage = pick("You feel stronger!","You feel like you can take on the world!","You feel robust!","You feel indestructible!") - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "exercise", /datum/mood_event/exercise) to_chat(user, finishmessage) user.apply_status_effect(/datum/status_effect/exercised) diff --git a/code/game/objects/structures/headpike.dm b/code/game/objects/structures/headpike.dm index 7f228397eb3d..19688ca33b90 100644 --- a/code/game/objects/structures/headpike.dm +++ b/code/game/objects/structures/headpike.dm @@ -6,7 +6,7 @@ density = FALSE anchored = TRUE var/obj/item/spear/spear - var/obj/item/spear/speartype + var/obj/item/spear/speartype = /obj/item/spear var/obj/item/bodypart/head/victim /obj/structure/headpike/bone //for bone spears @@ -63,11 +63,11 @@ return ..() /obj/structure/headpike/deconstruct(disassembled) - if(!disassembled) - return ..() if(victim) victim.forceMove(drop_location()) victim = null + if(!disassembled) + return ..() if(spear) spear.forceMove(drop_location()) spear = null diff --git a/code/game/objects/structures/hivebot.dm b/code/game/objects/structures/hivebot.dm index 53e6cb487424..6b915be13230 100644 --- a/code/game/objects/structures/hivebot.dm +++ b/code/game/objects/structures/hivebot.dm @@ -10,8 +10,8 @@ /obj/structure/hivebot_beacon/Initialize(mapload) . = ..() - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(2, location = loc) smoke.start() visible_message(span_boldannounce("[src] warps in!")) playsound(src.loc, 'sound/effects/empulse.ogg', 25, TRUE) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index c7f314461bb3..53912fac9fe5 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -6,7 +6,7 @@ icon = 'icons/effects/effects.dmi' anchored = TRUE max_integrity = 1 - armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, FIRE = 20, ACID = 20) + armor = list(BLUNT = 0, PUNCTURE = 50, SLASH = 90, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, FIRE = 20, ACID = 20) var/obj/item/holosign_creator/projector var/use_vis_overlay = TRUE @@ -34,7 +34,7 @@ /obj/structure/holosign/proc/attack_holosign(mob/living/user, list/modifiers) user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) user.changeNext_move(CLICK_CD_MELEE) - take_damage(5 , BRUTE, MELEE, 1) + take_damage(5 , BRUTE, BLUNT, 1) /obj/structure/holosign/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) @@ -124,11 +124,11 @@ allow_walk = FALSE /obj/structure/holosign/barrier/cyborg/bullet_act(obj/projectile/P) - take_damage((P.damage / 5) , BRUTE, MELEE, 1) //Doesn't really matter what damage flag it is. + take_damage((P.damage / 5) , BRUTE, BLUNT, 1) //Doesn't really matter what damage flag it is. if(istype(P, /obj/projectile/energy/electrode)) - take_damage(10, BRUTE, MELEE, 1) //Tasers aren't harmful. + take_damage(10, BRUTE, BLUNT, 1) //Tasers aren't harmful. if(istype(P, /obj/projectile/beam/disabler)) - take_damage(5, BRUTE, MELEE, 1) //Disablers aren't harmful. + take_damage(5, BRUTE, BLUNT, 1) //Disablers aren't harmful. return BULLET_ACT_HIT /obj/structure/holosign/barrier/medical @@ -156,7 +156,7 @@ return CheckHuman(mover) return TRUE -/obj/structure/holosign/barrier/medical/Bumped(atom/movable/AM) +/obj/structure/holosign/barrier/medical/BumpedBy(atom/movable/AM) . = ..() icon_state = "holo_medical" if(ishuman(AM) && !CheckHuman(AM)) @@ -185,7 +185,7 @@ var/shockcd = 0 /obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/projectile/P) - take_damage(P.damage, BRUTE, MELEE, 1) //Yeah no this doesn't get projectile resistance. + take_damage(P.damage, BRUTE, BLUNT, 1) //Yeah no this doesn't get projectile resistance. return BULLET_ACT_HIT /obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown() @@ -202,7 +202,7 @@ shockcd = TRUE addtimer(CALLBACK(src, PROC_REF(cooldown)), 5) -/obj/structure/holosign/barrier/cyborg/hacked/Bumped(atom/movable/AM) +/obj/structure/holosign/barrier/cyborg/hacked/BumpedBy(atom/movable/AM) if(shockcd) return diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm deleted file mode 100644 index a2984027e72d..000000000000 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ /dev/null @@ -1,196 +0,0 @@ -GLOBAL_LIST_INIT(ore_probability, list( - /obj/item/stack/ore/uranium = 50, - /obj/item/stack/ore/iron = 100, - /obj/item/stack/ore/plasma = 75, - /obj/item/stack/ore/silver = 50, - /obj/item/stack/ore/gold = 50, - /obj/item/stack/ore/diamond = 25, - /obj/item/stack/ore/bananium = 5, - /obj/item/stack/ore/titanium = 75, - )) - -/obj/structure/spawner/ice_moon - name = "cave entrance" - desc = "A hole in the ground, filled with monsters ready to defend it." - icon = 'icons/mob/nest.dmi' - icon_state = "hole" - faction = list("mining") - max_mobs = 3 - max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/wolf) - move_resist = INFINITY - anchored = TRUE - -/obj/structure/spawner/ice_moon/Initialize(mapload) - . = ..() - clear_rock() - -/** - * Clears rocks around the spawner when it is created - * - */ -/obj/structure/spawner/ice_moon/proc/clear_rock() - for(var/turf/F in RANGE_TURFS(2, src)) - if(abs(src.x - F.x) + abs(src.y - F.y) > 3) - continue - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/deconstruct(disassembled) - destroy_effect() - drop_loot() - return ..() - -/** - * Effects and messages created when the spawner is destroyed - * - */ -/obj/structure/spawner/ice_moon/proc/destroy_effect() - playsound(loc,'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message(span_boldannounce("[src] collapses, sealing everything inside!
\nOres fall out of the cave as it is destroyed!")) - -/** - * Drops items after the spawner is destroyed - * - */ -/obj/structure/spawner/ice_moon/proc/drop_loot() - for(var/type in GLOB.ore_probability) - var/chance = GLOB.ore_probability[type] - if(!prob(chance)) - continue - new type(loc, rand(5, 10)) - -/obj/structure/spawner/ice_moon/polarbear - max_mobs = 1 - spawn_time = 60 SECONDS - mob_types = list(/mob/living/simple_animal/hostile/asteroid/polarbear) - -/obj/structure/spawner/ice_moon/polarbear/clear_rock() - for(var/turf/F in RANGE_TURFS(1, src)) - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/demonic_portal - name = "demonic portal" - desc = "A portal that goes to another world, normal creatures couldn't survive there." - icon_state = "nether" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_demon) - light_outer_range = 1 - light_color = COLOR_SOFT_RED - -/obj/structure/spawner/ice_moon/demonic_portal/Initialize(mapload) - . = ..() - AddComponent(/datum/component/gps, "Netheric Signal") - -/obj/structure/spawner/ice_moon/demonic_portal/clear_rock() - for(var/turf/F in RANGE_TURFS(3, src)) - if(abs(src.x - F.x) + abs(src.y - F.y) > 5) - continue - if(ismineralturf(F)) - var/turf/closed/mineral/M = F - M.ScrapeAway(null, CHANGETURF_IGNORE_AIR) - -/obj/structure/spawner/ice_moon/demonic_portal/destroy_effect() - new /obj/effect/collapsing_demonic_portal(loc) - -/obj/structure/spawner/ice_moon/demonic_portal/drop_loot() - return - -/obj/structure/spawner/ice_moon/demonic_portal/ice_whelp - mob_types = list(/mob/living/simple_animal/hostile/asteroid/ice_whelp) - -/obj/structure/spawner/ice_moon/demonic_portal/snowlegion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow) - -/obj/effect/collapsing_demonic_portal - name = "collapsing demonic portal" - desc = "It's slowly fading!" - layer = TABLE_LAYER - icon = 'icons/mob/nest.dmi' - icon_state = "nether" - anchored = TRUE - density = TRUE - -/obj/effect/collapsing_demonic_portal/Initialize(mapload) - . = ..() - playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - visible_message(span_boldannounce("[src] begins to collapse, cutting it off from this world!")) - animate(src, transform = matrix().Scale(0, 1), alpha = 50, time = 5 SECONDS) - addtimer(CALLBACK(src, PROC_REF(collapse)), 5 SECONDS) - -/** - * Handles portal deletion - * - */ -/obj/effect/collapsing_demonic_portal/proc/collapse() - drop_loot() - qdel(src) - -/** - * Drops loot from the portal - * - */ -/obj/effect/collapsing_demonic_portal/proc/drop_loot() - visible_message(span_warning("Something slips out of [src]!")) - var/loot = rand(1, 28) - switch(loot) - if(1) - new /obj/item/clothing/suit/hooded/cultrobes/hardened(loc) - if(2) - new /obj/item/clothing/glasses/godeye(loc) - if(3) - new /obj/item/reagent_containers/glass/bottle/potion/flight(loc) - if(4) - new /obj/item/organ/heart/cursed/wizard(loc) - if(5) - new /obj/item/jacobs_ladder(loc) - if(6) - new /obj/item/rod_of_asclepius(loc) - if(7) - new /obj/item/warp_cube/red(loc) - if(8) - new /obj/item/wisp_lantern(loc) - if(9) - new /obj/item/immortality_talisman(loc) - if(10) - new /obj/item/book/granter/action/spell/summonitem(loc) - if(11) - new /obj/item/clothing/neck/necklace/memento_mori(loc) - if(12) - new /obj/item/borg/upgrade/modkit/lifesteal(loc) - new /obj/item/bedsheet/cult(loc) - if(13) - new /obj/item/disk/data/modkit_disc/mob_and_turf_aoe(loc) - if(14) - new /obj/item/disk/data/modkit_disc/bounty(loc) - if(15) - new /obj/item/ship_in_a_bottle(loc) - new /obj/item/oar(loc) - if(16) - new /obj/item/seeds/gatfruit(loc) - if(17) - new /obj/item/reagent_containers/food/drinks/drinkingglass/filled/nuka_cola(loc) - if(18) - new /obj/item/soulstone/anybody(loc) - if(19) - new /obj/item/disk/data/modkit_disc/resonator_blast(loc) - if(20) - new /obj/item/disk/data/modkit_disc/rapid_repeater(loc) - if(21) - new /obj/item/slimepotion/transference(loc) - if(22) - new /obj/item/slime_extract/adamantine(loc) - if(23) - new /obj/item/weldingtool/abductor(loc) - if(24) - new /obj/structure/elite_tumor(loc) - if(25) - new /mob/living/simple_animal/hostile/retaliate/clown/clownhulk(loc) - if(26) - new /obj/item/clothing/shoes/winterboots/ice_boots(loc) - if(27) - new /obj/item/book/granter/action/spell/sacredflame(loc) - if(28) - new /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom(loc) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 8692106c1b06..72cdcacdc617 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -27,7 +27,7 @@ return TRUE /obj/structure/kitchenspike_frame/attackby(obj/item/attacking_item, mob/user, params) - add_fingerprint(user) + attacking_item.leave_evidence(user, src) if(!istype(attacking_item, /obj/item/stack/rods)) return ..() var/obj/item/stack/rods/used_rods = attacking_item diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm index eec1ad018220..fa92f409d9eb 100644 --- a/code/game/objects/structures/ladders.dm +++ b/code/game/objects/structures/ladders.dm @@ -5,16 +5,17 @@ icon = 'icons/obj/structures.dmi' icon_state = "ladder11" anchored = TRUE - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + obj_flags = CAN_BE_HIT var/obj/structure/ladder/down //the ladder below this one var/obj/structure/ladder/up //the ladder above this one var/crafted = FALSE /// Optional travel time for ladder in deciseconds - var/travel_time = 0 + var/travel_time = 3 SECONDS + var/static/list/climbsounds = list('sound/effects/ladder.ogg','sound/effects/ladder2.ogg','sound/effects/ladder3.ogg','sound/effects/ladder4.ogg') /obj/structure/ladder/Initialize(mapload, obj/structure/ladder/up, obj/structure/ladder/down) ..() - GLOB.ladders += src + SET_TRACKING(__TYPE__) if (up) src.up = up up.down = src @@ -28,7 +29,7 @@ /obj/structure/ladder/Destroy(force) if ((resistance_flags & INDESTRUCTIBLE) && !force) return QDEL_HINT_LETMELIVE - GLOB.ladders -= src + UNSET_TRACKING(__TYPE__) disconnect() return ..() @@ -76,15 +77,24 @@ var/response = SEND_SIGNAL(user, COMSIG_LADDER_TRAVEL, src, ladder, going_up) if(response & LADDER_TRAVEL_BLOCK) return - + var/turf/target = get_turf(ladder) if(!is_ghost) ladder.add_fingerprint(user) + for(var/atom/movable/AM as anything in target) + if(!AM.CanMoveOnto(user, get_dir(AM, user))) + to_chat(user, span_warning("[AM] blocks your path.")) + return + + user.Move(loc) if(!do_after(user, src, travel_time, DO_PUBLIC)) return - show_fluff_message(going_up, user) - var/turf/target = get_turf(ladder) - user.zMove(target = target, z_move_flags = ZMOVE_CHECK_PULLEDBY|ZMOVE_ALLOW_BUCKLED|ZMOVE_INCLUDE_PULLED) + if(!zstep(user, going_up ? UP : DOWN, ZMOVE_INCAPACITATED_CHECKS)) + return + + if(!is_ghost) + show_fluff_message(going_up, user, loc) + show_fluff_message(going_up, user, target) ladder.use(user) //reopening ladder radial menu ahead /obj/structure/ladder/proc/use(mob/user, is_ghost=FALSE) @@ -152,11 +162,13 @@ use(user, TRUE) return ..() -/obj/structure/ladder/proc/show_fluff_message(going_up, mob/user) +/obj/structure/ladder/proc/show_fluff_message(going_up, mob/user, atom/dest) if(going_up) - user.visible_message(span_notice("[user] climbs up [src]."), span_notice("You climb up [src].")) + dest.visible_message(span_notice("[user] climbs up [src]."), span_notice("You climb up [src].")) else - user.visible_message(span_notice("[user] climbs down [src]."), span_notice("You climb down [src].")) + dest.visible_message(span_notice("[user] climbs down [src]."), span_notice("You climb down [src].")) + + playsound(dest, pick(climbsounds), 50) // Indestructible away mission ladders which link based on a mapped ID and height value rather than X/Y/Z. @@ -173,7 +185,7 @@ update_appearance() return - for(var/obj/structure/ladder/unbreakable/unbreakable_ladder in GLOB.ladders) + for(var/obj/structure/ladder/unbreakable/unbreakable_ladder in INSTANCES_OF(/obj/structure/ladder)) if (unbreakable_ladder.id != id) continue // not one of our pals if (!down && unbreakable_ladder.height == height - 1) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 8af0c06b57eb..45ed7fb80081 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -6,14 +6,14 @@ base_icon_state = "lattice" density = FALSE anchored = TRUE - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN + obj_flags = CAN_BE_HIT | BLOCK_Z_FALL smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_LATTICE) - canSmoothWith = list(SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_LATTICE) + smoothing_groups = SMOOTH_GROUP_LATTICE + canSmoothWith = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_OPEN_FLOOR var/number_of_mats = 1 var/build_material = /obj/item/stack/rods @@ -51,6 +51,11 @@ new build_material(get_turf(src), number_of_mats) qdel(src) +/obj/structure/lattice/intercept_zImpact(list/falling_movables, levels) + . = ..() + if(levels == 1 && !istype(src, /obj/structure/lattice/catwalk)) + . |= FALL_INTERCEPTED | FALL_NO_MESSAGE | FALL_RETAIN_PULL + /obj/structure/lattice/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(the_rcd.mode == RCD_FLOORWALL) return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) @@ -77,9 +82,13 @@ base_icon_state = "catwalk" number_of_mats = 2 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_LATTICE, SMOOTH_GROUP_CATWALK) - canSmoothWith = list(SMOOTH_GROUP_CATWALK) - obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP + smoothing_groups = SMOOTH_GROUP_CATWALK + SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_CATWALK + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP | BLOCK_Z_FALL + +/obj/structure/lattice/catwalk/Initialize(mapload) + . = ..() + AddElement(/datum/element/footstep_override, clawfootstep = FOOTSTEP_CATWALK, heavyfootstep = FOOTSTEP_CATWALK, footstep = FOOTSTEP_CATWALK) /obj/structure/lattice/catwalk/deconstruction_hints(mob/user) return span_notice("The supporting rods look like they could be cut.") @@ -105,8 +114,8 @@ number_of_mats = 1 color = "#5286b9ff" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_LATTICE) - canSmoothWith = list(SMOOTH_GROUP_LATTICE) + smoothing_groups = SMOOTH_GROUP_LATTICE + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_LATTICE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP resistance_flags = FIRE_PROOF | LAVA_PROOF diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm deleted file mode 100644 index af469718b7df..000000000000 --- a/code/game/objects/structures/lavaland/geyser.dm +++ /dev/null @@ -1,196 +0,0 @@ -//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks. -//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason - -///A lavaland geyser that spawns chems and can be mining scanned for points. Made to work with the plumbing pump to extract that sweet rare nectar -/obj/structure/geyser - name = "geyser" - icon = 'icons/obj/lavaland/terrain.dmi' - icon_state = "geyser" - anchored = TRUE - - ///set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob - var/erupting_state = null - //whether we are active and generating chems - var/activated = FALSE - ///what chem do we produce? - var/reagent_id = /datum/reagent/fuel/oil - ///how much reagents we add every process (2 seconds) - var/potency = 2 - ///maximum volume - var/max_volume = 500 - ///how much we start with after getting activated - var/start_volume = 50 - - ///Have we been discovered with a mining scanner? - var/discovered = FALSE - ///How many points we grant to whoever discovers us - var/point_value = 100 - ///what's our real name that will show upon discovery? null to do nothing - var/true_name - ///the message given when you discover this geyser. - var/discovery_message = null - -/obj/structure/geyser/Initialize(mapload) //if xenobio wants to bother, nethermobs are around geysers. - . = ..() - - AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC, 1, 5) - -///start producing chems, should be called just once -/obj/structure/geyser/proc/start_chemming() - activated = TRUE - create_reagents(max_volume, DRAINABLE) - reagents.add_reagent(reagent_id, start_volume) - START_PROCESSING(SSfluids, src) //It's main function is to be plumbed, so use SSfluids - if(erupting_state) - icon_state = erupting_state - else - var/mutable_appearance/I = mutable_appearance('icons/obj/lavaland/terrain.dmi', "[icon_state]_soup") - I.color = mix_color_from_reagents(reagents.reagent_list) - add_overlay(I) - -/obj/structure/geyser/process() - if(activated && reagents.total_volume <= reagents.maximum_volume) //this is also evaluated in add_reagent, but from my understanding proc calls are expensive - reagents.add_reagent(reagent_id, potency) - -/obj/structure/geyser/plunger_act(obj/item/plunger/P, mob/living/user, _reinforced) - if(!_reinforced) - to_chat(user, span_warning("The [P.name] isn't strong enough!")) - return - if(activated) - to_chat(user, span_warning("The [name] is already active!")) - return - - to_chat(user, span_notice("You start vigorously plunging [src]!")) - if(do_after(user, src, 50 * P.plunge_mod) && !activated) - start_chemming() - -/obj/structure/geyser/attackby(obj/item/item, mob/user, params) - if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner)) - return ..() //this runs the plunger code - - if(discovered) - to_chat(user, span_warning("This geyser has already been discovered!")) - return - - to_chat(user, span_notice("You discovered the geyser and mark it on the GPS system!")) - if(discovery_message) - to_chat(user, discovery_message) - - discovered = TRUE - if(true_name) - name = true_name - - AddComponent(/datum/component/gps, true_name) //put it on the gps so miners can mark it and chemists can profit off of it - - if(isliving(user)) - var/mob/living/living = user - - var/obj/item/card/id/card = living.get_idcard() - if(card) - to_chat(user, span_notice("[point_value] mining points have been paid out!")) - card.mining_points += point_value - -/obj/structure/geyser/wittel - reagent_id = /datum/reagent/wittel - point_value = 250 - true_name = "wittel geyser" - discovery_message = "It's a rare wittel geyser! This could be very powerful in the right hands... " - -/obj/structure/geyser/plasma_oxide - reagent_id = /datum/reagent/plasma_oxide - true_name = "plasma-oxide geyser" - -/obj/structure/geyser/protozine - reagent_id = /datum/reagent/medicine/omnizine/protozine - true_name = "protozine geyser" - -/obj/structure/geyser/hollowwater - reagent_id = /datum/reagent/water/hollowwater - true_name = "hollow water geyser" - -/obj/structure/geyser/random - point_value = 500 - true_name = "strange geyser" - discovery_message = "It's a strange geyser! How does any of this even work?" //it doesnt - -/obj/structure/geyser/random/Initialize(mapload) - . = ..() - reagent_id = get_random_reagent_id() - -///A wearable tool that lets you empty plumbing machinery and some other stuff -/obj/item/plunger - name = "plunger" - desc = "It's a plunger for plunging." - icon = 'icons/obj/watercloset.dmi' - icon_state = "plunger" - worn_icon_state = "plunger" - - slot_flags = ITEM_SLOT_MASK - flags_inv = HIDESNOUT - - ///time*plunge_mod = total time we take to plunge an object - var/plunge_mod = 1 - ///whether we do heavy duty stuff like geysers - var/reinforced = TRUE - ///alt sprite for the toggleable layer change mode - var/layer_mode_sprite = "plunger_layer" - ///Wheter we're in layer mode - var/layer_mode = FALSE - ///What layer we set it to - var/target_layer = DUCT_LAYER_DEFAULT - - ///Assoc list for possible layers - var/list/layers = list("Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER) - -/obj/item/plunger/attack_atom(obj/O, mob/living/user, params) - if(layer_mode) - SEND_SIGNAL(O, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, O, target_layer) - return ..() - else - if(!O.plunger_act(src, user, reinforced)) - return ..() - -/obj/item/plunger/throw_impact(atom/hit_atom, datum/thrownthing/tt) - . = ..() - if(tt.target_zone != BODY_ZONE_HEAD) - return - if(iscarbon(hit_atom)) - var/mob/living/carbon/H = hit_atom - if(!H.wear_mask) - H.equip_to_slot_if_possible(src, ITEM_SLOT_MASK) - H.visible_message(span_warning("The plunger slams into [H]'s face!"), span_warning("The plunger suctions to your face!")) - -/obj/item/plunger/attack_self(mob/user) - . = ..() - - layer_mode = !layer_mode - - if(!layer_mode) - icon_state = initial(icon_state) - to_chat(user, span_notice("You set the plunger to 'Plunger Mode'.")) - else - icon_state = layer_mode_sprite - to_chat(user, span_notice("You set the plunger to 'Layer Mode'.")) - - playsound(src, 'sound/machines/click.ogg', 10, TRUE) - -/obj/item/plunger/AltClick(mob/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) - return - - var/new_layer = tgui_input_list(user, "Select a layer", "Layer", layers) - if(isnull(new_layer)) - return - target_layer = layers[new_layer] - -///A faster reinforced plunger -/obj/item/plunger/reinforced - name = "reinforced plunger" - desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging." - icon_state = "reinforced_plunger" - worn_icon_state = "reinforced_plunger" - reinforced = TRUE - plunge_mod = 0.5 - layer_mode_sprite = "reinforced_plunger_layer" - - custom_premium_price = PAYCHECK_MEDIUM * 8 diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm deleted file mode 100644 index 547481bd1ed9..000000000000 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ /dev/null @@ -1,100 +0,0 @@ -//Necropolis Tendrils, which spawn lavaland monsters and break into a chasm when killed -/obj/structure/spawner/lavaland - name = "necropolis tendril" - desc = "A vile tendril of corruption, originating deep underground. Terrible monsters are pouring out of it." - - icon = 'icons/mob/nest.dmi' - icon_state = "tendril" - - faction = list("mining") - max_mobs = 3 - max_integrity = 250 - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril) - - move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it - anchored = TRUE - resistance_flags = FIRE_PROOF | LAVA_PROOF - - var/gps = null - var/obj/effect/light_emitter/tendril/emitted_light - - -/obj/structure/spawner/lavaland/goliath - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril) - -/obj/structure/spawner/lavaland/legion - mob_types = list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril) - -/obj/structure/spawner/lavaland/icewatcher - mob_types = list(/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing) - -GLOBAL_LIST_INIT(tendrils, list()) -/obj/structure/spawner/lavaland/Initialize(mapload) - . = ..() - 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) - AddComponent(/datum/component/gps, "Eerie Signal") - GLOB.tendrils += src - -/obj/structure/spawner/lavaland/deconstruct(disassembled) - new /obj/effect/collapse(loc) - new /obj/structure/closet/crate/necropolis/tendril(loc) - return ..() - - -/obj/structure/spawner/lavaland/Destroy() - var/last_tendril = TRUE - if(GLOB.tendrils.len>1) - last_tendril = FALSE - - if(last_tendril && !(flags_1 & ADMIN_SPAWNED_1)) - if(SSachievements.achievements_enabled) - for(var/mob/living/L in view(7,src)) - if(L.stat || !L.client) - continue - L.client.give_award(/datum/award/achievement/boss/tendril_exterminator, L) - L.client.give_award(/datum/award/score/tendril_score, L) //Progresses score by one - GLOB.tendrils -= src - QDEL_NULL(emitted_light) - QDEL_NULL(gps) - return ..() - -/obj/effect/light_emitter/tendril - set_luminosity = 4 - set_cap = 2.5 - light_color = LIGHT_COLOR_LAVA - -/obj/effect/collapse - name = "collapsing necropolis tendril" - desc = "Get clear!" - layer = TABLE_LAYER - icon = 'icons/mob/nest.dmi' - icon_state = "tendril" - anchored = TRUE - density = TRUE - var/obj/effect/light_emitter/tendril/emitted_light - -/obj/effect/collapse/Initialize(mapload) - . = ..() - emitted_light = new(loc) - visible_message(span_boldannounce("The tendril writhes in fury as the earth around it begins to crack and break apart! Get back!")) - visible_message(span_warning("Something falls free of the tendril!")) - playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, FALSE, 50, TRUE, TRUE) - addtimer(CALLBACK(src, PROC_REF(collapse)), 50) - -/obj/effect/collapse/Destroy() - QDEL_NULL(emitted_light) - return ..() - -/obj/effect/collapse/proc/collapse() - for(var/mob/M in range(7,src)) - shake_camera(M, 15, 1) - playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE) - visible_message(span_boldannounce("The tendril falls inward, the ground around it widening into a yawning chasm!")) - for(var/turf/T 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/life_candle.dm b/code/game/objects/structures/life_candle.dm index 9b7e1045ad2b..0c88394be628 100644 --- a/code/game/objects/structures/life_candle.dm +++ b/code/game/objects/structures/life_candle.dm @@ -24,7 +24,7 @@ var/respawn_time = 50 var/respawn_sound = 'sound/magic/staff_animation.ogg' -/obj/structure/life_candle/ComponentInitialize() +/obj/structure/life_candle/Initialize(mapload) . = ..() AddElement(/datum/element/movetype_handler) @@ -66,8 +66,7 @@ /obj/structure/life_candle/process() if(!linked_minds.len) - STOP_PROCESSING(SSobj, src) - return + return PROCESS_KILL for(var/m in linked_minds) var/datum/mind/mind = m diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index fa37fe02cabf..83e05ee587b1 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -13,9 +13,9 @@ layer = LOW_WALL_LAYER max_integrity = 150 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_LOW_WALL) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) - armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 80, ACID = 100) + smoothing_groups = SMOOTH_GROUP_LOW_WALL + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WALLS + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 80, ACID = 100) /// Material used in construction var/plating_material = /datum/material/iron @@ -29,7 +29,6 @@ //These are set by the material, do not touch!!! var/material_color var/stripe_icon - var/shiny_stripe //Ok you can touch vars again :) /obj/structure/low_wall/Initialize(mapload) @@ -75,7 +74,9 @@ var/obj/structure/low_wall/neighbor = locate() in step_turf if(neighbor) continue - if(!can_area_smooth(step_turf)) + var/can_area_smooth + CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth) + if(isnull(can_area_smooth)) continue for(var/atom/movable/movable_thing as anything in step_turf) if(airlock_typecache[movable_thing.type]) @@ -87,14 +88,10 @@ neighb_stripe_overlay.appearance_flags = RESET_COLOR neighb_stripe_overlay.color = stripe_paint || material_color overlays += neighb_stripe_overlay - if(shiny_stripe) - var/image/shine = image('icons/turf/walls/neighbor_stripe.dmi', "shine-[smoothing_junction]") - shine.appearance_flags = RESET_COLOR - overlays += shine return ..() -/obj/structure/low_wall/CanAllowThrough(atom/movable/mover, turf/target) +/obj/structure/low_wall/CanAllowThrough(atom/movable/mover, border_dir) . = ..() if(.) return @@ -102,12 +99,15 @@ return TRUE if(locate(/obj/structure/low_wall) in get_turf(mover)) return TRUE + var/obj/structure/table/T = locate() in get_turf(mover) + if(T && T.flipped != TRUE) + return TRUE /obj/structure/low_wall/IsObscured() return FALSE //We handle this ourselves. Please dont break <3. /obj/structure/low_wall/attackby(obj/item/weapon, mob/living/user, params) - if(istype(weapon, /obj/item/paint) || istype(weapon, /obj/item/paint_remover)) + if(istype(weapon, /obj/item/paint_sprayer) || istype(weapon, /obj/item/paint_remover)) return ..() if(is_top_obstructed()) @@ -178,11 +178,11 @@ return TRUE return FALSE -/obj/structure/low_wall/proc/set_wall_paint(new_paint) +/obj/structure/low_wall/proc/paint_wall(new_paint) wall_paint = new_paint update_appearance() -/obj/structure/low_wall/proc/set_stripe_paint(new_paint) +/obj/structure/low_wall/proc/paint_stripe(new_paint) stripe_paint = new_paint update_appearance() @@ -192,7 +192,6 @@ material_color = mat_ref.wall_color stripe_icon = mat_ref.wall_stripe_icon - shiny_stripe = mat_ref.wall_shine if(update_appearance) update_appearance() @@ -209,7 +208,7 @@ /obj/structure/low_wall/titanium plating_material = /datum/material/titanium - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS, SMOOTH_GROUP_SHUTTLE_PARTS) + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WALLS /obj/structure/low_wall/plastitanium plating_material = /datum/material/alloy/plastitanium @@ -223,3 +222,7 @@ /obj/structure/low_wall/prepainted/daedalus wall_paint = PAINT_WALL_DAEDALUS stripe_paint = PAINT_STRIPE_DAEDALUS + +/obj/structure/low_wall/prepainted/marsexec + wall_paint = PAINT_WALL_MARS + stripe_paint = PAINT_WALL_MARS diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm index fd22dfa0f95a..60347374df6b 100644 --- a/code/game/objects/structures/maintenance.dm +++ b/code/game/objects/structures/maintenance.dm @@ -34,7 +34,6 @@ at the cost of risking a vicious bite.**/ /obj/structure/moisture_trap/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_FISH_SAFE_STORAGE, TRAIT_GENERIC) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOIST, CELL_VIRUS_TABLE_GENERIC, rand(2,4), 20) if(prob(40)) critter_infested = FALSE if(prob(75)) @@ -77,8 +76,7 @@ at the cost of risking a vicious bite.**/ var/mob/living/carbon/bite_victim = user var/obj/item/bodypart/affecting = bite_victim.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") to_chat(user, span_danger("You feel a sharp pain as an unseen creature sinks it's [pick("fangs", "beak", "proboscis")] into your arm!")) - if(affecting?.receive_damage(30)) - bite_victim.update_damage_overlays() + if(affecting?.receive_damage(30, modifiers = NONE)) playsound(src,'sound/weapons/bite.ogg', 70, TRUE) return to_chat(user, span_warning("You find nothing of value...")) @@ -86,7 +84,7 @@ at the cost of risking a vicious bite.**/ /obj/structure/moisture_trap/attackby(obj/item/I, mob/user, params) if(iscyborg(user) || isalien(user) || !CanReachInside(user)) return ..() - add_fingerprint(user) + I.leave_evidence(user, src) if(istype(I, /obj/item/reagent_containers)) if(istype(I, /obj/item/food/monkeycube)) var/obj/item/food/monkeycube/cube = I diff --git a/code/game/objects/structures/memorial.dm b/code/game/objects/structures/memorial.dm index 3004904c1e8a..a1645d890a66 100644 --- a/code/game/objects/structures/memorial.dm +++ b/code/game/objects/structures/memorial.dm @@ -1,7 +1,9 @@ GLOBAL_REAL(immortals, /list) = list( "ArcLumin", "OrdoDictionary", - "DrSingh" + "DrSingh", + "Desolane900", + "Honkertron" ) /* diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index c607d16171b5..98312e7ff9e8 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -12,7 +12,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, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 50, ACID = 50) can_atmos_pass = CANPASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION material_flags = MATERIAL_EFFECTS @@ -39,7 +39,7 @@ . = ..() zas_update_loc() -/obj/structure/mineral_door/Bumped(atom/movable/AM) +/obj/structure/mineral_door/BumpedBy(atom/movable/AM) ..() if(!door_opened) return TryToSwitchState(AM) @@ -92,7 +92,7 @@ isSwitchingStates = TRUE playsound(src, openSound, 100, TRUE) set_opacity(FALSE) - flick("[initial(icon_state)]opening",src) + z_flick("[initial(icon_state)]opening",src) sleep(10) set_density(FALSE) door_opened = TRUE @@ -112,7 +112,7 @@ return isSwitchingStates = TRUE playsound(src, closeSound, 100, TRUE) - flick("[initial(icon_state)]closing",src) + z_flick("[initial(icon_state)]closing",src) sleep(10) set_density(TRUE) set_opacity(TRUE) @@ -226,9 +226,6 @@ max_integrity = 300 light_outer_range = 2 -/obj/structure/mineral_door/uranium/ComponentInitialize() - return - /obj/structure/mineral_door/sandstone name = "sandstone door" icon_state = "sandstone" @@ -293,8 +290,7 @@ /obj/structure/mineral_door/paperframe/Initialize(mapload) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/mineral_door/paperframe/examine(mob/user) . = ..() @@ -325,10 +321,6 @@ return ..() -/obj/structure/mineral_door/paperframe/ComponentInitialize() - return - /obj/structure/mineral_door/paperframe/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index d073af08fd40..eedd8b78146f 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -32,7 +32,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) var/new_style = tgui_input_list(user, "Select a facial hairstyle", "Grooming", GLOB.facial_hairstyles_list) if(isnull(new_style)) return TRUE - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE //no tele-grooming hairdresser.facial_hairstyle = new_style else @@ -42,7 +42,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) var/new_style = tgui_input_list(user, "Select a hairstyle", "Grooming", GLOB.hairstyles_list) if(isnull(new_style)) return TRUE - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE //no tele-grooming if(HAS_TRAIT(hairdresser, TRAIT_BALD)) to_chat(hairdresser, span_notice("If only growing back hair were that easy for you...")) @@ -153,7 +153,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(isnull(choice)) return TRUE - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE switch(choice) @@ -161,10 +161,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) var/newname = sanitize_name(tgui_input_text(amazed_human, "Who are we again?", "Name change", amazed_human.name, MAX_NAME_LEN), allow_numbers = TRUE) //It's magic so whatever. if(!newname) return TRUE - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE - amazed_human.real_name = newname - amazed_human.name = newname + + amazed_human.set_real_name(newname) if(amazed_human.dna) amazed_human.dna.real_name = newname if(amazed_human.mind) @@ -176,7 +176,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) return TRUE if(!selectable_races[racechoice]) return TRUE - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE var/datum/species/newrace = selectable_races[racechoice] @@ -194,13 +194,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) return TRUE var/new_mutantcolor = input(user, "Choose your primary color:", "Race change", amazed_human.dna.mutant_colors[mutcolor2change]) as color|null - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE if(new_mutantcolor) - var/temp_hsv = RGBtoHSV(new_mutantcolor) + var/list/temp_hsv = rgb2hsv(new_mutantcolor) - if(ReadHSV(temp_hsv)[3] >= ReadHSV("#7F7F7F")[3]) // mutantcolors must be bright + if(temp_hsv[3] >= 50) // mutantcolors must be bright amazed_human.dna.features[mutcolor2change] = sanitize_hexcolor(new_mutantcolor) amazed_human.dna.update_uf_block(DNA_MUTANT_COLOR_BLOCK) @@ -218,7 +218,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) return TRUE if(amazed_human.gender == "male") if(tgui_alert(amazed_human, "Become a Witch?", "Confirmation", list("Yes", "No")) == "Yes") - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE amazed_human.gender = FEMALE amazed_human.physique = FEMALE @@ -228,7 +228,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) else if(tgui_alert(amazed_human, "Become a Warlock?", "Confirmation", list("Yes", "No")) == "Yes") - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE amazed_human.gender = MALE amazed_human.physique = MALE @@ -241,13 +241,13 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if("hair") var/hairchoice = tgui_alert(amazed_human, "Hairstyle or hair color?", "Change Hair", list("Style", "Color")) - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE if(hairchoice == "Style") //So you just want to use a mirror then? return ..() else var/new_hair_color = input(amazed_human, "Choose your hair color", "Hair Color",amazed_human.hair_color) as color|null - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE if(new_hair_color) amazed_human.hair_color = sanitize_hexcolor(new_hair_color) @@ -261,7 +261,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(BODY_ZONE_PRECISE_EYES) var/new_eye_color = input(amazed_human, "Choose your eye color", "Eye Color", amazed_human.eye_color_left) as color|null - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return TRUE if(new_eye_color) amazed_human.eye_color_left = sanitize_hexcolor(new_eye_color) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index f87a7d9a68c9..6f1b23e3af38 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -78,19 +78,19 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an return return attack_hand(user) -/obj/structure/bodycontainer/attackby(obj/P, mob/user, params) - add_fingerprint(user) +/obj/structure/bodycontainer/attackby(obj/item/P, mob/user, params) + P.leave_evidence(user, src) if(istype(P, /obj/item/pen)) if(!user.is_literate()) to_chat(user, span_notice("You scribble illegibly on the side of [src]!")) return - var/t = tgui_input_text(user, "What would you like the label to be?", text("[]", name), null) + var/t = tgui_input_text(user, "What would you like the label to be?", name, null) if (user.get_active_held_item() != P) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if (t) - name = text("[]- '[]'", initial(name), t) + name = "[initial(name)]- '[t]'" else name = initial(name) else @@ -160,16 +160,21 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/morgue/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) connected = new/obj/structure/tray/m_tray(src) connected.connected = src +/obj/structure/bodycontainer/morgue/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/structure/bodycontainer/morgue/examine(mob/user) . = ..() . += span_notice("The speaker is [beeper ? "enabled" : "disabled"]. Alt-click to toggle it.") /obj/structure/bodycontainer/morgue/AltClick(mob/user) ..() - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return beeper = !beeper to_chat(user, span_notice("You turn the speaker function [beeper ? "on" : "off"].")) @@ -262,7 +267,7 @@ GLOBAL_LIST_EMPTY(crematoriums) for(var/mob/living/M in conts) if (M.stat != DEAD) - M.emote("scream") + M.emote("agony") if(user) log_combat(user, M, "cremated") else @@ -348,9 +353,9 @@ GLOBAL_LIST_EMPTY(crematoriums) if(carried_mob == user) //Piggyback user. return user.unbuckle_mob(carried_mob) - MouseDrop_T(carried_mob, user) + MouseDroppedOn(carried_mob, user) -/obj/structure/tray/MouseDrop_T(atom/movable/O as mob|obj, mob/user) +/obj/structure/tray/MouseDroppedOn(atom/movable/O as mob|obj, mob/user) if(!ismovable(O) || O.anchored || !Adjacent(user) || !user.Adjacent(O) || O.loc == user) return if(!ismob(O)) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index d7fda2f2b6a0..b028c674bde2 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -129,8 +129,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) req_access = list(ACCESS_CE) /obj/structure/noticeboard/hos - name = "Head of Security's Notice Board" - desc = "Important notices from the Head of Security." + name = "Security Marshal's Notice Board" + desc = "Important notices from the Security Marshal." req_access = list(ACCESS_HOS) /obj/structure/noticeboard/cmo @@ -151,6 +151,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32) /obj/structure/noticeboard/staff name = "Staff Notice Board" desc = "Important notices from the heads of staff." - req_access = list(ACCESS_HEADS) + req_access = list(ACCESS_MANAGEMENT) #undef MAX_NOTICES diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index f32cd324d39e..75ee77ef2d7f 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -25,13 +25,17 @@ max_integrity = atom_integrity START_PROCESSING(SSobj, src) +/obj/structure/statue/petrified/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/structure/statue/petrified/process(delta_time) if(!petrified_mob) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL + timer -= delta_time petrified_mob.Stun(40) //So they can't do anything while petrified if(timer <= 0) - STOP_PROCESSING(SSobj, src) qdel(src) /obj/structure/statue/petrified/contents_explosion(severity, target) diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm index 6ed81a1cdd8d..1d2105ff23cc 100644 --- a/code/game/objects/structures/plaques/_plaques.dm +++ b/code/game/objects/structures/plaques/_plaques.dm @@ -9,7 +9,7 @@ layer = SIGN_LAYER custom_materials = list(/datum/material/gold = 2000) max_integrity = 200 //Twice as durable as regular signs. - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) ///Custom plaque structures and items both start "unengraved", once engraved with a fountain pen their text can't be altered again. Static plaques are already engraved. var/engraved = FALSE @@ -24,7 +24,7 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/gold = 2000) max_integrity = 200 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) ///This points the item to make the proper structure when placed on a wall. var/plaque_path = /obj/structure/plaque ///Custom plaque structures and items both start "unengraved", once engraved with a fountain pen their text can't be altered again. diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index fe52693b8904..a471abf9e61c 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -4,10 +4,11 @@ gender = PLURAL icon = 'icons/obj/stationobjs.dmi' icon_state = "plasticflaps" - armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 50, ACID = 50) + armor = list(BLUNT = 100, PUNCTURE = 80, SLASH = 100, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 50, ACID = 50) density = FALSE anchored = TRUE can_atmos_pass = CANPASS_NEVER + can_astar_pass = CANASTARPASS_ALWAYS_PROC /obj/structure/plasticflaps/opaque opacity = TRUE @@ -62,18 +63,18 @@ return FALSE return TRUE -/obj/structure/plasticflaps/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - if(isliving(caller)) - if(isbot(caller)) +/obj/structure/plasticflaps/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(pass_info.is_living) + if(pass_info.is_bot) return TRUE - var/mob/living/living_caller = caller - var/ventcrawler = HAS_TRAIT(living_caller, TRAIT_VENTCRAWLER_ALWAYS) || HAS_TRAIT(living_caller, TRAIT_VENTCRAWLER_NUDE) - if(!ventcrawler && living_caller.mob_size != MOB_SIZE_TINY) + if(pass_info.can_ventcrawl && pass_info.mob_size != MOB_SIZE_TINY) return FALSE - if(caller?.pulling) - return CanAStarPass(ID, to_dir, caller.pulling) + if(pass_info.grab_infos) + for(var/datum/can_pass_info/grab_info in pass_info.grab_infos) + if(!CanAStarPass(to_dir, grab_info)) + return FALSE return TRUE //diseases, stings, etc can pass diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm index 920828f4d96f..1f1dd36fea5a 100644 --- a/code/game/objects/structures/railings.dm +++ b/code/game/objects/structures/railings.dm @@ -8,7 +8,7 @@ anchored = TRUE pass_flags_self = LETPASSTHROW|PASSSTRUCTURE /// armor more or less consistent with grille. max_integrity about one time and a half that of a grille. - armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) + armor = list(BLUNT = 50, PUNCTURE = 70, SLASH = 90, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 0, ACID = 0) max_integrity = 75 var/climbable = TRUE @@ -36,7 +36,7 @@ /obj/structure/railing/attackby(obj/item/I, mob/living/user, params) ..() - add_fingerprint(user) + I.leave_evidence(user, src) if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode) if(atom_integrity < max_integrity) @@ -64,7 +64,7 @@ /obj/structure/railing/deconstruct(disassembled) if(!(flags_1 & NODECONSTRUCT_1)) - var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 3) + var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 6) transfer_fingerprints_to(rod) return ..() @@ -85,7 +85,7 @@ return . || mover.throwing || mover.movement_type & (FLYING | FLOATING) return TRUE -/obj/structure/railing/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) +/obj/structure/railing/CanAStarPass(to_dir, datum/can_pass_info/pass_info) if(!(to_dir & dir)) return TRUE return ..() @@ -117,3 +117,27 @@ /obj/structure/railing/proc/check_anchored(checked_anchored) if(anchored == checked_anchored) return TRUE + +/obj/structure/railing/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + var/mob/living/L = grab.get_affecting_mob() + if(!grab.current_grab.enable_violent_interactions || !isliving(L)) + return ..() + + if(!Adjacent(L)) + grab.move_victim_towards(get_turf(src)) + return ..() + + if(user.combat_mode) + visible_message(span_danger("[user] slams [L]'s face against \the [src]!")) + playsound(loc, 'sound/effects/grillehit.ogg', 50, 1) + var/blocked = L.run_armor_check(BODY_ZONE_HEAD, BLUNT) + if (prob(30 * ((100 - blocked)/100))) + L.Knockdown(10 SECONDS) + L.apply_damage(8, BRUTE, BODY_ZONE_HEAD) + else + if (get_turf(L) == get_turf(src)) + L.forceMove(get_step(src, src.dir)) + else + L.forceMove(get_turf(src)) + L.Knockdown(10 SECONDS) + visible_message(span_danger("[user] throws \the [L] over \the [src].
")) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 1b4ecabe8a73..62b9a6dc0a91 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -162,13 +162,13 @@ to_chat(user, span_warning("The rotation is locked!")) return FALSE var/new_angle = tgui_input_number(user, "New angle for primary reflection face", "Reflector Angle", rotation_angle, 360) - if(isnull(new_angle) || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(isnull(new_angle) || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return FALSE set_angle(SIMPLIFY_DEGREES(new_angle)) return TRUE /obj/structure/reflector/AltClick(mob/user) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return else if(finished) rotate(user) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 5e5bf0da1a42..3a6951f56d45 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -131,7 +131,7 @@ FLOOR SAFES if(!ishuman(usr)) return var/mob/living/carbon/human/user = usr - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return var/canhear = FALSE diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm index 0596a9b8f7a1..9f1987903a4c 100644 --- a/code/game/objects/structures/shower.dm +++ b/code/game/objects/structures/shower.dm @@ -39,7 +39,6 @@ create_reagents(reagent_capacity) reagents.add_reagent(reagent_id, reagent_capacity) soundloop = new(src, FALSE) - AddComponent(/datum/component/plumbing/simple_demand) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) @@ -102,7 +101,8 @@ current_temperature = SHOWER_NORMAL user.visible_message(span_notice("[user] adjusts the shower with \the [I]."), span_notice("You adjust the shower with \the [I] to [current_temperature] temperature.")) user.log_message("has wrenched a shower at [AREACOORD(src)] to [current_temperature].", LOG_ATTACK) - add_hiddenprint(user) + log_touch(user) + handle_mist() return TRUE @@ -111,7 +111,7 @@ . = ..() if(!on) return - var/mutable_appearance/water_falling = mutable_appearance('icons/obj/watercloset.dmi', "water", ABOVE_MOB_LAYER) + var/image/water_falling = image('icons/obj/watercloset.dmi', "water", ABOVE_MOB_LAYER) water_falling.color = mix_color_from_reagents(reagents.reagent_list) . += water_falling @@ -146,7 +146,6 @@ /obj/machinery/shower/proc/wash_atom(atom/target) target.wash(CLEAN_RAD | CLEAN_WASH) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "shower", /datum/mood_event/nice_shower) reagents.expose(target, (TOUCH), SHOWER_EXPOSURE_MULTIPLIER * SHOWER_SPRAY_VOLUME / max(reagents.total_volume, SHOWER_SPRAY_VOLUME)) if(isliving(target)) check_heat(target) @@ -159,7 +158,7 @@ if(!ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash above wash_atom(movable_content) // Reagent exposure is handled in wash_atom - reagents.remove_any(SHOWER_SPRAY_VOLUME) + reagents.remove_all(SHOWER_SPRAY_VOLUME) return on = FALSE soundloop.stop() diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index ba33c137a263..15e16d835f92 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -6,7 +6,7 @@ layer = SIGN_LAYER custom_materials = list(/datum/material/plastic = 2000) max_integrity = 100 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) ///Determines if a sign is unwrenchable. var/buildable_sign = TRUE resistance_flags = FLAMMABLE @@ -32,7 +32,7 @@ righthand_file = 'icons/mob/inhands/items_righthand.dmi' w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/plastic = 2000) - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) resistance_flags = FLAMMABLE max_integrity = 100 ///The type of sign structure that will be created when placed on a turf, the default looks just like a sign backing item. diff --git a/code/game/objects/structures/signs/signs_misc.dm b/code/game/objects/structures/signs/signs_misc.dm index 1f57538e6eeb..81abaa296881 100644 --- a/code/game/objects/structures/signs/signs_misc.dm +++ b/code/game/objects/structures/signs/signs_misc.dm @@ -1,3 +1,6 @@ +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/gym, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/gym/right, 32) + /obj/structure/sign/gym name = "\improper Gym Encouragement Sign" sign_change_name = "gym_left" diff --git a/code/game/objects/structures/signs/signs_warning.dm b/code/game/objects/structures/signs/signs_warning.dm index f4a768487472..7fa725561e6b 100644 --- a/code/game/objects/structures/signs/signs_warning.dm +++ b/code/game/objects/structures/signs/signs_warning.dm @@ -194,3 +194,9 @@ icon_state = "radshelter" is_editable = TRUE +/obj/structure/sign/exitonly + name = "\improper EXIT ONLY sign" + sign_change_name = "Exit ONly" + desc = "A sign informing you that you will not be able to re-enter this area without access." + icon_state = "exitonly" + is_editable = TRUE diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index 855bda19eb6a..50bb162b3b67 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -24,7 +24,6 @@ return return ..() - /obj/structure/spawner/syndicate name = "warp beacon" icon = 'icons/obj/device.dmi' @@ -65,7 +64,7 @@ max_mobs = 3 icon = 'icons/mob/nest.dmi' spawn_text = "crawls out of" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/goliath, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) + mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub, /mob/living/simple_animal/hostile/asteroid/hivelord, /mob/living/simple_animal/hostile/asteroid/basilisk, /mob/living/simple_animal/hostile/asteroid/fugu) faction = list("mining") /obj/structure/spawner/mining/goldgrub @@ -73,11 +72,6 @@ desc = "A den housing a nest of goldgrubs, annoying but arguably much better than anything else you'll find in a nest." mob_types = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) -/obj/structure/spawner/mining/goliath - name = "goliath den" - desc = "A den housing a nest of goliaths, oh god why?" - mob_types = list(/mob/living/simple_animal/hostile/asteroid/goliath) - /obj/structure/spawner/mining/hivelord name = "hivelord den" desc = "A den housing a nest of hivelords." diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index 16085d50260b..083a682ff3ae 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -3,7 +3,6 @@ #define STAIR_TERMINATOR_YES 2 // 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 @@ -12,7 +11,6 @@ icon_state = "stairs" anchored = TRUE - var/force_open_above = FALSE // replaces the turf above this stair obj with /turf/open/openspace var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC var/turf/listeningTo @@ -29,10 +27,7 @@ dir = WEST /obj/structure/stairs/Initialize(mapload) - GLOB.stairs += src - if(force_open_above) - force_open_above() - build_signal_listener() + SET_TRACKING(__TYPE__) update_surrounding() var/static/list/loc_connections = list( @@ -45,13 +40,11 @@ /obj/structure/stairs/Destroy() listeningTo = null - GLOB.stairs -= src + UNSET_TRACKING(__TYPE__) return ..() /obj/structure/stairs/Move() //Look this should never happen but... . = ..() - if(force_open_above) - build_signal_listener() update_surrounding() /obj/structure/stairs/proc/update_surrounding() @@ -62,15 +55,15 @@ if(S) S.update_appearance() -/obj/structure/stairs/proc/on_exit(datum/source, atom/movable/leaving, direction) +/obj/structure/stairs/proc/on_exit(datum/source, atom/movable/leaving, direction, no_side_effects) SIGNAL_HANDLER if(leaving == src) return //Let's not block ourselves. if(!isobserver(leaving) && isTerminator() && direction == dir) - leaving.set_currently_z_moving(CURRENTLY_Z_ASCENDING) - INVOKE_ASYNC(src, PROC_REF(stair_ascend), leaving) + if(!no_side_effects) + INVOKE_ASYNC(src, PROC_REF(stair_ascend), leaving) leaving.Bump(src) return COMPONENT_ATOM_BLOCK_EXIT @@ -88,50 +81,29 @@ var/turf/checking = GetAbove(my_turf) if(!istype(checking)) return - if(!checking.zPassIn(climber, UP, my_turf)) - return - var/turf/target = get_step_multiz(my_turf, (dir|UP)) - if(istype(target) && !climber.can_z_move(DOWN, target, z_move_flags = ZMOVE_FALL_FLAGS)) //Don't throw them into a tile that will just dump them back down. - climber.zMove(target = target, z_move_flags = ZMOVE_STAIRS_FLAGS) - /// Moves anything that's being dragged by src or anything buckled to it to the stairs turf. - climber.pulling?.move_from_pull(climber, loc, climber.glide_size) - for(var/mob/living/buckled as anything in climber.buckled_mobs) - buckled.pulling?.move_from_pull(buckled, loc, buckled.glide_size) + var/turf/target = get_step_multiz(my_turf, (dir|UP)) + if(!target) + to_chat(climber, span_notice("There is nothing of interest in that direction.")) + return -/obj/structure/stairs/vv_edit_var(var_name, var_value) - . = ..() - if(!.) + if(!checking.CanZPass(climber, UP, ZMOVE_STAIRS_FLAGS)) + to_chat(climber, span_warning("Something blocks the path.")) return - if(var_name != NAMEOF(src, force_open_above)) + + if(!target.Enter(climber, FALSE)) + to_chat(climber, span_warning("Something blocks the path.")) return - if(!var_value) - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) - listeningTo = null - else - build_signal_listener() - force_open_above() - -/obj/structure/stairs/proc/build_signal_listener() - if(listeningTo) - UnregisterSignal(listeningTo, COMSIG_TURF_MULTIZ_NEW) - var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) - RegisterSignal(T, COMSIG_TURF_MULTIZ_NEW, PROC_REF(on_multiz_new)) - listeningTo = T - -/obj/structure/stairs/proc/force_open_above() - var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) - if(T && !istype(T)) - 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)) - T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) + climber.forceMoveWithGroup(target, z_movement = ZMOVING_VERTICAL) + + if(!(climber.throwing || (climber.movement_type & (VENTCRAWLING | FLYING)) || HAS_TRAIT(climber, TRAIT_IMMOBILIZED))) + playsound(my_turf, 'sound/effects/stairs_step.ogg', 50) + playsound(my_turf, 'sound/effects/stairs_step.ogg', 50) + + /// Moves anything that's being dragged by src or anything buckled to it to the stairs turf. + for(var/mob/living/buckled as anything in climber.buckled_mobs) + buckled.handle_grabs_during_movement(my_turf, get_dir(my_turf, target)) /obj/structure/stairs/intercept_zImpact(list/falling_movables, levels = 1) . = ..() diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm deleted file mode 100644 index 24af153b21ab..000000000000 --- a/code/game/objects/structures/tables_racks.dm +++ /dev/null @@ -1,846 +0,0 @@ -/* Tables and Racks - * Contains: - * Tables - * Glass Tables - * Wooden Tables - * Reinforced Tables - * Racks - * Rack Parts - */ - -/* - * Tables - */ - -/obj/structure/table - name = "table" - desc = "A square piece of iron standing on four metal legs. It can not move." - icon = 'icons/obj/smooth_structures/table.dmi' - icon_state = "table-0" - base_icon_state = "table" - density = TRUE - anchored = TRUE - pass_flags_self = PASSTABLE | LETPASSTHROW - layer = TABLE_LAYER - var/frame = /obj/structure/table_frame - var/framestack = /obj/item/stack/rods - var/buildstack = /obj/item/stack/sheet/iron - var/busy = FALSE - var/buildstackamount = 1 - var/framestackamount = 2 - var/deconstruction_ready = 1 - custom_materials = list(/datum/material/iron = 2000) - max_integrity = 100 - integrity_failure = 0.33 - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TABLES) - canSmoothWith = list(SMOOTH_GROUP_TABLES) - -/obj/structure/table/Initialize(mapload, _buildstack) - . = ..() - if(_buildstack) - buildstack = _buildstack - AddElement(/datum/element/climbable) - - var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(table_carbon), - ) - - AddElement(/datum/element/connect_loc, loc_connections) - - if (!(flags_1 & NODECONSTRUCT_1)) - var/static/list/tool_behaviors = list( - TOOL_SCREWDRIVER = list( - SCREENTIP_CONTEXT_RMB = "Disassemble", - ), - - TOOL_WRENCH = list( - SCREENTIP_CONTEXT_RMB = "Deconstruct", - ), - ) - - AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) - register_context() - -/obj/structure/table/examine(mob/user) - . = ..() - . += deconstruction_hints(user) - -/obj/structure/table/proc/deconstruction_hints(mob/user) - return span_notice("The top is screwed on, but the main bolts are also visible.") - -/obj/structure/table/update_icon(updates=ALL) - . = ..() - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) - QUEUE_SMOOTH(src) - QUEUE_SMOOTH_NEIGHBORS(src) - -/obj/structure/table/narsie_act() - var/atom/A = loc - qdel(src) - new /obj/structure/table/wood(A) - -/obj/structure/table/attack_paw(mob/user, list/modifiers) - return attack_hand(user, modifiers) - -/obj/structure/table/attack_hand(mob/living/user, list/modifiers) - if(Adjacent(user) && user.pulling) - if(isliving(user.pulling)) - var/mob/living/pushed_mob = user.pulling - if(pushed_mob.buckled) - to_chat(user, span_warning("[pushed_mob] is buckled to [pushed_mob.buckled]!")) - return - if(user.combat_mode) - switch(user.grab_state) - if(GRAB_PASSIVE) - to_chat(user, span_warning("You need a better grip to do that!")) - return - if(GRAB_AGGRESSIVE) - tablepush(user, pushed_mob) - if(GRAB_NECK to GRAB_KILL) - tablelimbsmash(user, pushed_mob) - else - pushed_mob.visible_message(span_notice("[user] begins to place [pushed_mob] onto [src]..."), \ - span_userdanger("[user] begins to place [pushed_mob] onto [src]...")) - if(do_after(user, pushed_mob, 3.5 SECONDS, DO_PUBLIC)) - tableplace(user, pushed_mob) - else - return - user.stop_pulling() - else if(user.pulling.pass_flags & PASSTABLE) - user.Move_Pulled(src) - if (user.pulling.loc == loc) - user.visible_message(span_notice("[user] places [user.pulling] onto [src]."), - span_notice("You place [user.pulling] onto [src].")) - user.stop_pulling() - return ..() - -/obj/structure/table/attack_tk(mob/user) - return - -/obj/structure/table/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(.) - return - if(mover.throwing) - return TRUE - if(locate(/obj/structure/table) in get_turf(mover)) - return TRUE - -/obj/structure/table/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - . = !density - if(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) - pushed_mob.visible_message(span_notice("[user] places [pushed_mob] onto [src]."), \ - span_notice("[user] places [pushed_mob] onto [src].")) - log_combat(user, pushed_mob, "places", null, "onto [src]") - -/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, span_danger("Throwing [pushed_mob] onto the table might hurt them!")) - return - var/added_passtable = FALSE - if(!(pushed_mob.pass_flags & PASSTABLE)) - added_passtable = TRUE - pushed_mob.pass_flags |= PASSTABLE - for (var/obj/obj in user.loc.contents) - if(!obj.CanAllowThrough(pushed_mob)) - return - pushed_mob.Move(src.loc) - if(added_passtable) - pushed_mob.pass_flags &= ~PASSTABLE - if(pushed_mob.loc != loc) //Something prevented the tabling - return - pushed_mob.Knockdown(30) - pushed_mob.apply_damage(10, BRUTE) - pushed_mob.stamina.adjust(-40) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) - deconstruct(FALSE) - playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) - pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [src]!"), \ - span_userdanger("[user] slams you onto \the [src]!")) - log_combat(user, pushed_mob, "tabled", null, "onto [src]") - SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) - -/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) - pushed_mob.Knockdown(30) - var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) - banged_limb?.receive_damage(30) - pushed_mob.stamina.adjust(-60) - take_damage(50) - if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) - deconstruct(FALSE) - playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) - pushed_mob.visible_message(span_danger("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!"), - span_userdanger("[user] smashes your [banged_limb.name] against \the [src]")) - log_combat(user, pushed_mob, "head slammed", null, "against [src]") - SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_limbsmash, banged_limb) - -/obj/structure/table/screwdriver_act_secondary(mob/living/user, obj/item/tool) - if(flags_1 & NODECONSTRUCT_1 || !deconstruction_ready) - return FALSE - to_chat(user, span_notice("You start disassembling [src]...")) - if(tool.use_tool(src, user, 2 SECONDS, volume=50)) - deconstruct(TRUE) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/structure/table/wrench_act_secondary(mob/living/user, obj/item/tool) - if(flags_1 & NODECONSTRUCT_1 || !deconstruction_ready) - return FALSE - to_chat(user, span_notice("You start deconstructing [src]...")) - if(tool.use_tool(src, user, 4 SECONDS, volume=50)) - playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) - deconstruct(TRUE, 1) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/structure/table/attackby(obj/item/I, mob/living/user, params) - var/list/modifiers = params2list(params) - - if(istype(I, /obj/item/storage/bag/tray)) - var/obj/item/storage/bag/tray/T = I - if(T.contents.len > 0) // If the tray isn't empty - for(var/x in T.contents) - var/obj/item/item = x - AfterPutItemOnTable(item, user) - I.atom_storage.remove_all(drop_location()) - user.visible_message(span_notice("[user] empties [I] on [src].")) - return - // If the tray IS empty, continue on (tray will be placed on the table like other items) - - if(istype(I, /obj/item/toy/cards/deck)) - var/obj/item/toy/cards/deck/dealer_deck = I - if(dealer_deck.wielded) // deal a card facedown on the table - var/obj/item/toy/singlecard/card = dealer_deck.draw(user) - if(card) - attackby(card, user, params) - return - - 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 - if(user.combat_mode) - user.unbuckle_mob(carried_mob) - tablelimbsmash(user, carried_mob) - else - 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(span_notice("[user] begins to[skills_space] place [carried_mob] onto [src]..."), - span_userdanger("[user] begins to[skills_space] place [carried_mob] onto [src]...")) - if(do_after(user, carried_mob, tableplace_delay, DO_PUBLIC)) - user.unbuckle_mob(carried_mob) - tableplace(user, carried_mob) - return TRUE - - if(!user.combat_mode && !(I.item_flags & ABSTRACT)) - if(user.transferItemToLoc(I, drop_location(), silent = FALSE)) - //Center the icon where the user clicked. - if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, 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(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) - I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) - AfterPutItemOnTable(I, user) - return TRUE - else - return ..() - -/obj/structure/table/attackby_secondary(obj/item/weapon, mob/user, params) - if(istype(weapon, /obj/item/toy/cards/deck)) - var/obj/item/toy/cards/deck/dealer_deck = weapon - if(dealer_deck.wielded) // deal a card faceup on the table - var/obj/item/toy/singlecard/card = dealer_deck.draw(user) - if(card) - card.Flip() - attackby(card, user, params) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - ..() - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/structure/table/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) - if(istype(held_item, /obj/item/toy/cards/deck)) - var/obj/item/toy/cards/deck/dealer_deck = held_item - if(dealer_deck.wielded) - context[SCREENTIP_CONTEXT_LMB] = "Deal card" - context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" - return CONTEXTUAL_SCREENTIP_SET - return NONE - -/obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) - return - -/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(!(flags_1 & NODECONSTRUCT_1)) - var/turf/T = get_turf(src) - if(buildstack) - new buildstack(T, buildstackamount) - else - for(var/i in custom_materials) - var/datum/material/M = i - new M.sheet_type(T, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) - if(!wrench_disassembly) - new frame(T) - else - new framestack(T, framestackamount) - qdel(src) - -/obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - switch(the_rcd.mode) - if(RCD_DECONSTRUCT) - return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) - return FALSE - -/obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - switch(passed_mode) - if(RCD_DECONSTRUCT) - to_chat(user, span_notice("You deconstruct the table.")) - qdel(src) - return TRUE - return FALSE - -/obj/structure/table/proc/table_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) - SIGNAL_HANDLER - if(!shove_blocked) - return - target.Knockdown(SHOVE_KNOCKDOWN_TABLE) - target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), - span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) - target.throw_at(src, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check - log_combat(src, target, "shoved", "onto [src] (table)") - return COMSIG_CARBON_SHOVE_HANDLED - -/obj/structure/table/greyscale - icon = 'icons/obj/smooth_structures/table_greyscale.dmi' - icon_state = "table_greyscale-0" - base_icon_state = "table_greyscale" - material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS - buildstack = null //No buildstack, so generate from mat datums - -///Table on wheels -/obj/structure/table/rolling - name = "Rolling table" - desc = "An NT brand \"Rolly poly\" rolling table. It can and will move." - anchored = FALSE - smoothing_flags = NONE - smoothing_groups = null - canSmoothWith = null - icon = 'icons/obj/smooth_structures/rollingtable.dmi' - icon_state = "rollingtable" - var/list/attached_items = list() - -/obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) - . = ..() - attached_items += I - RegisterSignal(I, COMSIG_MOVABLE_MOVED, PROC_REF(RemoveItemFromTable)) //Listen for the pickup event, unregister on pick-up so we aren't moved - -/obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) - SIGNAL_HANDLER - - if(newloc != loc) //Did we not move with the table? because that shit's ok - return FALSE - attached_items -= source - UnregisterSignal(source, COMSIG_MOVABLE_MOVED) - -/obj/structure/table/rolling/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(!loc) - return - for(var/mob/living/living_mob in old_loc.contents)//Kidnap everyone on top - living_mob.forceMove(loc) - for(var/atom/movable/attached_movable as anything in attached_items) - if(!attached_movable.Move(loc)) - RemoveItemFromTable(attached_movable, attached_movable.loc) - -/* - * Glass tables - */ -/obj/structure/table/glass - name = "glass table" - desc = "What did I say about leaning on the glass tables? Now you need surgery." - icon = 'icons/obj/smooth_structures/glass_table.dmi' - icon_state = "glass_table-0" - base_icon_state = "glass_table" - custom_materials = list(/datum/material/glass = 2000) - buildstack = /obj/item/stack/sheet/glass - smoothing_groups = list(SMOOTH_GROUP_GLASS_TABLES) - canSmoothWith = list(SMOOTH_GROUP_GLASS_TABLES) - max_integrity = 70 - resistance_flags = ACID_PROOF - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) - var/list/debris = list() - -/obj/structure/table/glass/Initialize(mapload) - . = ..() - debris += new frame - if(buildstack == /obj/item/stack/sheet/plasmaglass) - debris += new /obj/item/shard/plasma - else - debris += new /obj/item/shard - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/table/glass/Destroy() - QDEL_LIST(debris) - . = ..() - -/obj/structure/table/glass/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == src) - return - if(flags_1 & NODECONSTRUCT_1) - return - if(!isliving(AM)) - return - // Don't break if they're just flying past - if(AM.throwing) - addtimer(CALLBACK(src, PROC_REF(throw_check), AM), 5) - else - check_break(AM) - -/obj/structure/table/glass/proc/throw_check(mob/living/M) - if(M.loc == get_turf(src)) - check_break(M) - -/obj/structure/table/glass/proc/check_break(mob/living/M) - if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING)) - table_shatter(M) - -/obj/structure/table/glass/proc/table_shatter(mob/living/L) - visible_message(span_warning("[src] breaks!"), - span_danger("You hear breaking glass.")) - var/turf/T = get_turf(src) - playsound(T, SFX_SHATTER, 50, TRUE) - for(var/I in debris) - var/atom/movable/AM = I - AM.forceMove(T) - debris -= AM - if(istype(AM, /obj/item/shard)) - AM.throw_impact(L) - L.Paralyze(100) - qdel(src) - -/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) - if(!(flags_1 & NODECONSTRUCT_1)) - if(disassembled) - ..() - return - else - var/turf/T = get_turf(src) - playsound(T, SFX_SHATTER, 50, TRUE) - for(var/X in debris) - var/atom/movable/AM = X - AM.forceMove(T) - debris -= AM - qdel(src) - -/obj/structure/table/glass/narsie_act() - color = NARSIE_WINDOW_COLOUR - for(var/obj/item/shard/S in debris) - S.color = NARSIE_WINDOW_COLOUR - -/obj/structure/table/glass/plasmaglass - name = "plasma glass table" - desc = "Someone thought this was a good idea." - icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' - icon_state = "plasmaglass_table-0" - base_icon_state = "plasmaglass_table" - custom_materials = list(/datum/material/alloy/plasmaglass = 2000) - buildstack = /obj/item/stack/sheet/plasmaglass - max_integrity = 100 - -/* - * Wooden tables - */ - -/obj/structure/table/wood - name = "wooden table" - desc = "Do not apply fire to this. Rumour says it burns easily." - icon = 'icons/obj/smooth_structures/wood_table.dmi' - icon_state = "wood_table-0" - base_icon_state = "wood_table" - frame = /obj/structure/table_frame/wood - framestack = /obj/item/stack/sheet/mineral/wood - buildstack = /obj/item/stack/sheet/mineral/wood - resistance_flags = FLAMMABLE - max_integrity = 70 - smoothing_groups = list(SMOOTH_GROUP_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES - canSmoothWith = list(SMOOTH_GROUP_WOOD_TABLES) - -/obj/structure/table/wood/narsie_act(total_override = TRUE) - if(!total_override) - ..() - -/obj/structure/table/wood/poker //No specialties, Just a mapping object. - name = "gambling table" - desc = "A seedy table for seedy dealings in seedy places." - icon = 'icons/obj/smooth_structures/poker_table.dmi' - icon_state = "poker_table-0" - base_icon_state = "poker_table" - buildstack = /obj/item/stack/tile/carpet - -/obj/structure/table/wood/poker/narsie_act() - ..(FALSE) - -/obj/structure/table/wood/fancy - name = "fancy table" - desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." - icon = 'icons/obj/structures.dmi' - icon_state = "fancy_table" - base_icon_state = "fancy_table" - frame = /obj/structure/table_frame - framestack = /obj/item/stack/rods - buildstack = /obj/item/stack/tile/carpet - smoothing_groups = list(SMOOTH_GROUP_FANCY_WOOD_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES - canSmoothWith = list(SMOOTH_GROUP_FANCY_WOOD_TABLES) - var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() - -/obj/structure/table/wood/fancy/Initialize(mapload) - . = ..() - // Needs to be set dynamically because table smooth sprites are 32x34, - // which the editor treats as a two-tile-tall object. The sprites are that - // size so that the north/south corners look nice - examine the detail on - // the sprites in the editor to see why. - icon = smooth_icon - -/obj/structure/table/wood/fancy/black - icon_state = "fancy_table_black" - base_icon_state = "fancy_table_black" - buildstack = /obj/item/stack/tile/carpet/black - smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' - -/obj/structure/table/wood/fancy/blue - icon_state = "fancy_table_blue" - base_icon_state = "fancy_table_blue" - buildstack = /obj/item/stack/tile/carpet/blue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' - -/obj/structure/table/wood/fancy/cyan - icon_state = "fancy_table_cyan" - base_icon_state = "fancy_table_cyan" - buildstack = /obj/item/stack/tile/carpet/cyan - smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' - -/obj/structure/table/wood/fancy/green - icon_state = "fancy_table_green" - base_icon_state = "fancy_table_green" - buildstack = /obj/item/stack/tile/carpet/green - smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' - -/obj/structure/table/wood/fancy/orange - icon_state = "fancy_table_orange" - base_icon_state = "fancy_table_orange" - buildstack = /obj/item/stack/tile/carpet/orange - smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' - -/obj/structure/table/wood/fancy/purple - icon_state = "fancy_table_purple" - base_icon_state = "fancy_table_purple" - buildstack = /obj/item/stack/tile/carpet/purple - smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' - -/obj/structure/table/wood/fancy/red - icon_state = "fancy_table_red" - base_icon_state = "fancy_table_red" - buildstack = /obj/item/stack/tile/carpet/red - smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' - -/obj/structure/table/wood/fancy/royalblack - icon_state = "fancy_table_royalblack" - base_icon_state = "fancy_table_royalblack" - buildstack = /obj/item/stack/tile/carpet/royalblack - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' - -/obj/structure/table/wood/fancy/royalblue - icon_state = "fancy_table_royalblue" - base_icon_state = "fancy_table_royalblue" - buildstack = /obj/item/stack/tile/carpet/royalblue - smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' - -/* - * Reinforced tables - */ -/obj/structure/table/reinforced - name = "reinforced table" - desc = "A reinforced version of the four legged table." - icon = 'icons/obj/smooth_structures/reinforced_table.dmi' - icon_state = "reinforced_table-0" - base_icon_state = "reinforced_table" - deconstruction_ready = 0 - buildstack = /obj/item/stack/sheet/plasteel - max_integrity = 200 - integrity_failure = 0.25 - armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, FIRE = 80, ACID = 70) - -/obj/structure/table/reinforced/deconstruction_hints(mob/user) - if(deconstruction_ready) - return span_notice("The top cover has been welded loose and the main frame's bolts are exposed.") - else - return span_notice("The top cover is firmly welded on.") - -/obj/structure/table/reinforced/attackby_secondary(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_WELDER) - if(weapon.tool_start_check(user, amount = 0)) - if(deconstruction_ready) - to_chat(user, span_notice("You start strengthening the reinforced table...")) - if (weapon.use_tool(src, user, 50, volume = 50)) - to_chat(user, span_notice("You strengthen the table.")) - deconstruction_ready = FALSE - else - to_chat(user, span_notice("You start weakening the reinforced table...")) - if (weapon.use_tool(src, user, 50, volume = 50)) - to_chat(user, span_notice("You weaken the table.")) - deconstruction_ready = TRUE - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - else - . = ..() - -/obj/structure/table/bronze - name = "bronze table" - desc = "A solid table made out of bronze." - icon = 'icons/obj/smooth_structures/brass_table.dmi' - icon_state = "brass_table-0" - base_icon_state = "brass_table" - resistance_flags = FIRE_PROOF | ACID_PROOF - buildstack = /obj/item/stack/sheet/bronze - smoothing_groups = list(SMOOTH_GROUP_BRONZE_TABLES) //Don't smooth with SMOOTH_GROUP_TABLES - canSmoothWith = list(SMOOTH_GROUP_BRONZE_TABLES) - -/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) - ..() - playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) - -/obj/structure/table/reinforced/rglass - name = "reinforced glass table" - desc = "A reinforced version of the glass table." - icon = 'icons/obj/smooth_structures/rglass_table.dmi' - icon_state = "rglass_table-0" - base_icon_state = "rglass_table" - custom_materials = list(/datum/material/glass = 2000, /datum/material/iron = 2000) - buildstack = /obj/item/stack/sheet/rglass - max_integrity = 150 - -/obj/structure/table/reinforced/plasmarglass - name = "reinforced plasma glass table" - desc = "A reinforced version of the plasma glass table." - icon = 'icons/obj/smooth_structures/rplasmaglass_table.dmi' - icon_state = "rplasmaglass_table-0" - base_icon_state = "rplasmaglass_table" - custom_materials = list(/datum/material/alloy/plasmaglass = 2000, /datum/material/iron = 2000) - buildstack = /obj/item/stack/sheet/plasmarglass - -/obj/structure/table/reinforced/titaniumglass - name = "titanium glass table" - desc = "A titanium reinforced glass table, with a fresh coat of NT white paint." - icon = 'icons/obj/smooth_structures/titaniumglass_table.dmi' - icon_state = "titaniumglass_table-o" - base_icon_state = "titaniumglass_table" - custom_materials = list(/datum/material/alloy/titaniumglass = 2000) - buildstack = /obj/item/stack/sheet/titaniumglass - max_integrity = 250 - -/obj/structure/table/reinforced/plastitaniumglass - name = "plastitanium glass table" - desc = "A table made of titanium reinforced silica-plasma composite. About as durable as it sounds." - icon = 'icons/obj/smooth_structures/plastitaniumglass_table.dmi' - icon_state = "plastitaniumglass_table-0" - base_icon_state = "plastitaniumglass_table" - custom_materials = list(/datum/material/alloy/plastitaniumglass = 2000) - buildstack = /obj/item/stack/sheet/plastitaniumglass - max_integrity = 300 - -/* - * Surgery Tables - */ - -/obj/structure/table/optable - name = "operating table" - desc = "Used for advanced medical procedures." - icon = 'icons/obj/surgery.dmi' - icon_state = "optable" - buildstack = /obj/item/stack/sheet/mineral/silver - smoothing_flags = NONE - smoothing_groups = null - canSmoothWith = null - can_buckle = 1 - buckle_lying = NO_BUCKLE_LYING - buckle_requires_restraints = TRUE - custom_materials = list(/datum/material/silver = 2000) - var/mob/living/carbon/human/patient = null - var/obj/machinery/computer/operating/computer = null - -/obj/structure/table/optable/Initialize(mapload) - . = ..() - for(var/direction in GLOB.alldirs) - computer = locate(/obj/machinery/computer/operating) in get_step(src, direction) - if(computer) - computer.table = src - break - -/obj/structure/table/optable/Destroy() - . = ..() - if(computer && computer.table == src) - computer.table = null - -/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) - pushed_mob.forceMove(loc) - pushed_mob.set_resting(TRUE, TRUE) - visible_message(span_notice("[user] lays [pushed_mob] on [src].")) - get_patient() - -/obj/structure/table/optable/proc/get_patient() - var/mob/living/carbon/M = locate(/mob/living/carbon) in loc - if(M) - if(M.resting) - set_patient(M) - else - 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_REF(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)) - return TRUE - return FALSE - -/* - * Racks - */ -/obj/structure/rack - name = "rack" - desc = "Different from the Middle Ages version." - icon = 'icons/obj/objects.dmi' - icon_state = "rack" - layer = TABLE_LAYER - density = TRUE - anchored = TRUE - pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. - max_integrity = 20 - -/obj/structure/rack/examine(mob/user) - . = ..() - . += span_notice("It's held together by a couple of bolts.") - -/obj/structure/rack/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(.) - return - if(istype(mover) && (mover.pass_flags & PASSTABLE)) - return TRUE - -/obj/structure/rack/MouseDrop_T(obj/O, mob/user) - . = ..() - if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) - return - if(!user.dropItemToGround(O)) - return - if(O.loc != src.loc) - step(O, get_dir(O, src)) - -/obj/structure/rack/attackby(obj/item/W, mob/living/user, params) - var/list/modifiers = params2list(params) - if (W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1) && LAZYACCESS(modifiers, RIGHT_CLICK)) - W.play_tool_sound(src) - deconstruct(TRUE) - return - if(user.combat_mode) - return ..() - if(user.transferItemToLoc(W, drop_location())) - return 1 - -/obj/structure/rack/attack_paw(mob/living/user, list/modifiers) - attack_hand(user, modifiers) - -/obj/structure/rack/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(user.body_position == LYING_DOWN || user.usable_legs < 2) - return - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src, ATTACK_EFFECT_KICK) - user.visible_message(span_danger("[user] kicks [src]."), null, null, COMBAT_MESSAGE_RANGE) - take_damage(rand(4,8), BRUTE, MELEE, 1) - -/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(loc, 'sound/items/dodgeball.ogg', 80, TRUE) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE) - if(BURN) - playsound(loc, 'sound/items/welder.ogg', 40, TRUE) - -/* - * Rack destruction - */ - -/obj/structure/rack/deconstruct(disassembled = TRUE) - if(!(flags_1&NODECONSTRUCT_1)) - set_density(FALSE) - var/obj/item/rack_parts/newparts = new(loc) - transfer_fingerprints_to(newparts) - qdel(src) - - -/* - * Rack Parts - */ - -/obj/item/rack_parts - name = "rack parts" - desc = "Parts of a rack." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "rack_parts" - flags_1 = CONDUCT_1 - custom_materials = list(/datum/material/iron=2000) - var/building = FALSE - -/obj/item/rack_parts/attackby(obj/item/W, mob/user, params) - if (W.tool_behaviour == TOOL_WRENCH) - new /obj/item/stack/sheet/iron(user.loc) - qdel(src) - else - . = ..() - -/obj/item/rack_parts/attack_self(mob/user) - if(building) - return - building = TRUE - to_chat(user, span_notice("You start constructing a rack...")) - if(do_after(user, user, 50, DO_PUBLIC, progress=TRUE, display = src)) - if(!user.temporarilyRemoveItemFromInventory(src)) - return - var/obj/structure/rack/R = new /obj/structure/rack(user.loc) - user.visible_message("[user] assembles \a [R].\ - ", span_notice("You assemble \a [R].")) - R.add_fingerprint(user) - qdel(src) - building = FALSE diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm index 5a2b52f79c78..f6dc2d39f51e 100644 --- a/code/game/objects/structures/tank_holder.dm +++ b/code/game/objects/structures/tank_holder.dm @@ -96,11 +96,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += tank + EX_ACT(tank, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += tank + EX_ACT(tank, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += tank + EX_ACT(tank, EXPLODE_LIGHT) /// Call this after taking the tank from contents in order to update references, icon /// and density. diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm index 82f8eb338e38..fe77d11056e1 100644 --- a/code/game/objects/structures/training_machine.dm +++ b/code/game/objects/structures/training_machine.dm @@ -175,7 +175,7 @@ /obj/structure/training_machine/AltClick(mob/user) . = ..() - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, FLOOR_OKAY)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY|USE_RESTING)) return if(has_buckled_mobs()) user_unbuckle_mob(buckled_mobs[1], user) @@ -238,15 +238,19 @@ if (!moving || !starting_turf || isspaceturf(current_turf)) stop_moving() return + if (current_turf == target_position) //We've reached our target turf, now find a new one target_position = null + if (!target_position) target_position = find_target_position() if (!target_position) stop_moving("ERROR! Cannot calculate suitable movement path.") + var/turf/nextStep = get_step_towards(src, target_position) if (!Move(nextStep, get_dir(src, nextStep))) target_position = null //We couldn't move towards the target turf, so find a new target turf + try_attack() COOLDOWN_START(src, move_cooldown, max(MAX_SPEED - move_speed, 1)) @@ -351,7 +355,6 @@ flags_1 = CONDUCT_1 force = 0 throwforce = 0 - throw_speed = 2 throw_range = 7 w_class = WEIGHT_CLASS_BULKY ///Total number of hits made against a valid target diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index 6b2cececc050..06c0b14952c5 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -32,7 +32,7 @@ /obj/structure/transit_tube/station/should_stop_pod(pod, from_dir) return TRUE -/obj/structure/transit_tube/station/Bumped(atom/movable/AM) +/obj/structure/transit_tube/station/BumpedBy(atom/movable/AM) if(!pod_moving && open_status == STATION_TUBE_OPEN && ismob(AM) && AM.dir == boarding_dir) for(var/obj/structure/transit_tube_pod/pod in loc) if(!pod.moving) @@ -42,7 +42,7 @@ //pod insertion -/obj/structure/transit_tube/station/MouseDrop_T(obj/structure/c_transit_tube_pod/R, mob/user) +/obj/structure/transit_tube/station/MouseDroppedOn(obj/structure/c_transit_tube_pod/R, mob/user) if(isliving(user)) var/mob/living/L = user if(L.incapacitated()) @@ -64,38 +64,43 @@ if(.) return if(!pod_moving) - if(user.pulling && isliving(user.pulling)) - if(open_status == STATION_TUBE_OPEN) - var/mob/living/GM = user.pulling - if(user.grab_state >= GRAB_AGGRESSIVE) - if(GM.buckled || GM.has_buckled_mobs()) - to_chat(user, span_warning("[GM] is attached to something!")) - return - for(var/obj/structure/transit_tube_pod/pod in loc) - pod.visible_message(span_warning("[user] starts putting [GM] into the [pod]!")) - if(do_after(user, src, 15)) - if(open_status == STATION_TUBE_OPEN && GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.has_buckled_mobs()) - GM.Paralyze(100) - src.Bumped(GM) - break - else - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && (pod.dir in tube_dirs)) - if(open_status == STATION_TUBE_CLOSED) - open_animation() - - else if(open_status == STATION_TUBE_OPEN) - if(pod.contents.len && user.loc != pod) - user.visible_message(span_notice("[user] starts emptying [pod]'s contents onto the floor."), span_notice("You start emptying [pod]'s contents onto the floor...")) - if(do_after(user, src, 10)) //So it doesn't default to close_animation() on fail - if(pod && pod.loc == loc) - for(var/atom/movable/AM in pod) - AM.forceMove(get_turf(user)) + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && (pod.dir in tube_dirs)) + if(open_status == STATION_TUBE_CLOSED) + open_animation() + + else if(open_status == STATION_TUBE_OPEN) + if(pod.contents.len && user.loc != pod) + user.visible_message(span_notice("[user] starts emptying [pod]'s contents onto the floor."), span_notice("You start emptying [pod]'s contents onto the floor...")) + if(do_after(user, src, 10)) //So it doesn't default to close_animation() on fail + if(pod && pod.loc == loc) + for(var/atom/movable/AM in pod) + AM.forceMove(get_turf(user)) + + else + close_animation() + break + +/obj/structure/transit_tube/station/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!isliving(victim) || pod_moving) + return - else - close_animation() - break + if(!(open_status == STATION_TUBE_OPEN)) + return + var/mob/living/GM = victim + if(grab.current_grab.damage_stage >= GRAB_AGGRESSIVE) + if(GM.buckled || GM.has_buckled_mobs()) + to_chat(user, span_warning("[GM] is attached to something!")) + return + for(var/obj/structure/transit_tube_pod/pod in loc) + pod.visible_message(span_warning("[user] starts putting [GM] into the [pod]!")) + if(do_after(user, src, 15)) + if(open_status == STATION_TUBE_OPEN && GM && grab.current_grab?.damage_stage >= GRAB_AGGRESSIVE && user.is_grabbing(victim) && !GM.buckled && !GM.has_buckled_mobs()) + GM.Paralyze(100) + src.BumpedBy(GM) + break /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_CROWBAR) @@ -249,7 +254,7 @@ . = ..() . += span_notice("This station will create a pod for you to ride, no need to wait for one.") -/obj/structure/transit_tube/station/dispenser/Bumped(atom/movable/AM) +/obj/structure/transit_tube/station/dispenser/BumpedBy(atom/movable/AM) if(!(istype(AM) && AM.dir == boarding_dir) || AM.anchored) return var/obj/structure/transit_tube_pod/dispensed/pod = new(loc) 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 a49490d7700e..f33c6aeeb4a5 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -56,15 +56,6 @@ if(!QDELETED(src)) empty_pod() -/obj/structure/transit_tube_pod/contents_explosion(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += contents - if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += contents - if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += contents - /obj/structure/transit_tube_pod/singularity_pull(S, current_size) ..() if(current_size >= STAGE_FIVE) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index fc1af80b8a74..e34f9a74589d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -29,39 +29,6 @@ log_combat(user, swirlie, "swirlied (brute)") swirlie.adjustBruteLoss(5) - else if(user.pulling && isliving(user.pulling)) - user.changeNext_move(CLICK_CD_MELEE) - var/mob/living/GM = user.pulling - if(user.grab_state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - to_chat(user, span_warning("[GM] needs to be on [src]!")) - return - if(!swirlie) - if(open) - GM.visible_message(span_danger("[user] starts to give [GM] a swirlie!"), span_userdanger("[user] starts to give you a swirlie...")) - swirlie = GM - var/was_alive = (swirlie.stat != DEAD) - if(do_after(user, src, 3 SECONDS, timed_action_flags = IGNORE_HELD_ITEM)) - GM.visible_message(span_danger("[user] gives [GM] a swirlie!"), span_userdanger("[user] gives you a swirlie!"), span_hear("You hear a toilet flushing.")) - if(iscarbon(GM)) - var/mob/living/carbon/C = GM - if(!C.internal) - log_combat(user, C, "swirlied (oxy)") - C.adjustOxyLoss(5) - else - log_combat(user, GM, "swirlied (oxy)") - GM.adjustOxyLoss(5) - if(was_alive && swirlie.stat == DEAD && swirlie.client) - swirlie.client.give_award(/datum/award/achievement/misc/swirlie, swirlie) // just like space high school all over again! - swirlie = null - else - playsound(src.loc, 'sound/effects/bang.ogg', 25, TRUE) - GM.visible_message(span_danger("[user] slams [GM.name] into [src]!"), span_userdanger("[user] slams you into [src]!")) - log_combat(user, GM, "toilet slammed") - GM.adjustBruteLoss(5) - else - to_chat(user, span_warning("You need a tighter grip!")) - else if(cistern && !open && user.CanReach(src)) if(!contents.len) to_chat(user, span_notice("The cistern is empty.")) @@ -78,6 +45,43 @@ update_appearance() +/obj/structure/toilet/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!isliving(victim)) + return + + user.changeNext_move(CLICK_CD_MELEE) + var/mob/living/GM = victim + if(grab.current_grab.damage_stage >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + to_chat(user, span_warning("[GM] needs to be on [src]!")) + return + + if(!swirlie) + if(open) + GM.visible_message(span_danger("[user] starts to give [GM] a swirlie!"), span_userdanger("[user] starts to give you a swirlie...")) + swirlie = GM + if(do_after(user, src, 3 SECONDS, timed_action_flags = IGNORE_HELD_ITEM)) + GM.visible_message(span_danger("[user] gives [GM] a swirlie!"), span_userdanger("[user] gives you a swirlie!"), span_hear("You hear a toilet flushing.")) + if(iscarbon(GM)) + var/mob/living/carbon/C = GM + if(!C.internal) + log_combat(user, C, "swirlied (oxy)") + C.adjustOxyLoss(5) + else + log_combat(user, GM, "swirlied (oxy)") + GM.adjustOxyLoss(5) + swirlie = null + return TRUE + else + playsound(src.loc, 'sound/effects/bang.ogg', 25, TRUE) + GM.visible_message(span_danger("[user] slams [GM.name] into [src]!"), span_userdanger("[user] slams you into [src]!")) + log_combat(user, GM, "toilet slammed") + GM.adjustBruteLoss(5) + return TRUE + else + to_chat(user, span_warning("You need a tighter grip!")) + /obj/structure/toilet/update_icon_state() icon_state = "toilet[open][cistern]" return ..() @@ -95,7 +99,7 @@ ..() /obj/structure/toilet/attackby(obj/item/I, mob/living/user, params) - add_fingerprint(user) + I.leave_evidence(user, src) if(I.tool_behaviour == TOOL_CROWBAR) to_chat(user, span_notice("You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...")) playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, TRUE) @@ -169,19 +173,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) . = ..() if(.) return - if(user.pulling && isliving(user.pulling)) - var/mob/living/GM = user.pulling - if(user.grab_state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - to_chat(user, span_notice("[GM.name] needs to be on [src].")) - return - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message(span_danger("[user] slams [GM] into [src]!"), span_danger("You slam [GM] into [src]!")) - GM.adjustBruteLoss(8) - else - to_chat(user, span_warning("You need a tighter grip!")) - else if(exposed) + if(exposed) if(!hiddenitem) to_chat(user, span_warning("There is nothing in the drain holder!")) else @@ -194,6 +187,23 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) else ..() +/obj/structure/urinal/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!isliving(victim)) + return + + var/mob/living/GM = victim + + if(grab.current_grab.damage_stage >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + to_chat(user, span_notice("[GM.name] needs to be on [src].")) + return + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message(span_danger("[user] slams [GM] into [src]!"), span_danger("You slam [GM] into [src]!")) + GM.adjustBruteLoss(8) + else + to_chat(user, span_warning("You need a tighter grip!")) + /obj/structure/urinal/attackby(obj/item/I, mob/living/user, params) if(exposed) if (hiddenitem) @@ -258,7 +268,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) anchored = TRUE ///Something's being washed at the moment var/busy = FALSE - ///What kind of reagent is produced by this sink by default? (We now have actual plumbing, Arcane, August 2020) + ///What kind of reagent is produced by this sink by default? var/dispensedreagent = /datum/reagent/water ///Material to drop when broken or deconstructed. var/buildstacktype = /obj/item/stack/sheet/iron @@ -276,7 +286,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) if(has_water_reclaimer) create_reagents(100, NO_REACT) reagents.add_reagent(dispensedreagent, 100) - AddComponent(/datum/component/plumbing/simple_demand, bolt) /obj/structure/sink/examine(mob/user) . = ..() @@ -311,7 +320,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) return busy = FALSE - reagents.remove_any(5) + reagents.remove_all(5) reagents.expose(user, TOUCH, 5 / max(reagents.total_volume, 5)) begin_reclamation() if(washing_face) @@ -374,12 +383,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) deconstruct() return - if(istype(O, /obj/item/stack/medical/gauze)) - var/obj/item/stack/medical/gauze/G = O - new /obj/item/reagent_containers/glass/rag(src.loc) - to_chat(user, span_notice("You tear off a strip of gauze and make a rag.")) - G.use(1) - return + if(istype(O, /obj/item/stack)) + var/obj/item/stack/S = O + if(initial(S.absorption_capacity) && S.absorption_capacity < initial(S.absorption_capacity)) + if(do_after(user, src, 3 SECONDS, DO_PUBLIC, display = S)) + user.visible_message(span_notice("[user] washes and wrings out [S] in [src]."), blind_message = span_hear("You hear water running.")) + add_blood_DNA(S.return_blood_DNA()) + S.absorption_capacity = initial(S.absorption_capacity) + S.remove_evidence() + return if(istype(O, /obj/item/stack/sheet/cloth)) var/obj/item/stack/sheet/cloth/cloth = O @@ -437,7 +449,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) /obj/structure/sink/proc/begin_reclamation() if(!reclaiming) reclaiming = TRUE - START_PROCESSING(SSfluids, src) + START_PROCESSING(SSobj, src) /obj/structure/sink/kitchen name = "kitchen sink" @@ -570,8 +582,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) return - if(istype(O, /obj/item/stack/medical/gauze)) - var/obj/item/stack/medical/gauze/G = O + if(istype(O, /obj/item/stack/gauze)) + var/obj/item/stack/gauze/G = O new /obj/item/reagent_containers/glass/rag(loc) to_chat(user, span_notice("You tear off a strip of gauze and make a rag.")) G.use(1) @@ -742,12 +754,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32) var/id = null /obj/structure/curtain/cloth/fancy/mechanical/Destroy() - GLOB.curtains -= src + UNSET_TRACKING(__TYPE__) return ..() /obj/structure/curtain/cloth/fancy/mechanical/Initialize(mapload) . = ..() - GLOB.curtains += src + SET_TRACKING(__TYPE__) /obj/structure/curtain/cloth/fancy/mechanical/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock) id = "[port.id]_[id]" diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 124deb4996cf..66d60069fff9 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -94,7 +94,7 @@ /obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params) //I really should have spread this out across more states but thin little windoors are hard to sprite. - add_fingerprint(user) + W.leave_evidence(user, src) switch(state) if("01") if(W.tool_behaviour == TOOL_WELDER && !anchored) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a3b8b2e9e293..1e1c0fdd8198 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -10,7 +10,7 @@ max_integrity = 25 can_be_unanchored = TRUE resistance_flags = ACID_PROOF - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 20, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) can_atmos_pass = CANPASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION pass_flags_self = PASSGLASS @@ -25,7 +25,7 @@ var/fulltile = FALSE var/glass_type = /obj/item/stack/sheet/glass var/glass_amount = 1 - var/mutable_appearance/crack_overlay + var/real_explosion_block //ignore this, just use explosion_block var/break_sound = SFX_SHATTER var/knock_sound = 'sound/effects/glassknock.ogg' @@ -59,11 +59,13 @@ . = ..() if(direct) setDir(direct) + if(reinf && anchored) state = WINDOW_SCREWED_TO_FRAME zas_update_loc() + if(fulltile) setDir() @@ -126,6 +128,10 @@ return TRUE +/obj/structure/window/proc/knock_on(mob/user) + user?.animate_interact(src, INTERACT_GENERIC) + playsound(src, knock_sound, 100, TRUE) + /obj/structure/window/proc/on_exit(datum/source, atom/movable/leaving, direction) SIGNAL_HANDLER @@ -148,8 +154,8 @@ /obj/structure/window/attack_tk(mob/user) user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("Something knocks on [src].")) - add_fingerprint(user) - playsound(src, knock_sound, 50, TRUE) + log_touch(user) + knock_on() return COMPONENT_CANCEL_ATTACK_CHAIN @@ -169,7 +175,7 @@ if(!user.combat_mode) user.visible_message(span_notice("[user] knocks on [src]."), \ span_notice("You knock on [src].")) - playsound(src, knock_sound, 50, TRUE) + knock_on(user) else user.visible_message(span_warning("[user] bashes [src]!"), \ span_warning("You bash [src]!")) @@ -264,7 +270,8 @@ if(!can_be_reached(user)) return TRUE //skip the afterattack - add_fingerprint(user) + I.leave_evidence(user, src) + return ..() /obj/structure/window/AltClick(mob/user) @@ -396,8 +403,7 @@ //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() update_appearance() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH_NEIGHBORS(src) //merges adjacent full-tile windows into one /obj/structure/window/update_overlays(updates=ALL) @@ -410,20 +416,19 @@ var/ratio = atom_integrity / max_integrity ratio = CEILING(ratio*4, 1) * 25 - cut_overlay(crack_overlay) if(ratio > 75) return - crack_overlay = mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1), appearance_flags = RESET_COLOR) - . += crack_overlay -/obj/structure/window/fire_act(exposed_temperature, exposed_volume) + . += mutable_appearance('icons/obj/structures.dmi', "damage[ratio]", -(layer+0.1), appearance_flags = RESET_COLOR) + +/obj/structure/window/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if (exposed_temperature > melting_point) take_damage(round(exposed_volume / 100), BURN, 0, 0) /obj/structure/window/get_dumping_location() return null -/obj/structure/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) +/obj/structure/window/CanAStarPass(to_dir, datum/can_pass_info/pass_info) if(!density) return TRUE if(fulltile || (dir == to_dir)) @@ -434,6 +439,59 @@ /obj/structure/window/GetExplosionBlock() return reinf && fulltile ? real_explosion_block : 0 +/obj/structure/window/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + if (!user.combat_mode || !grab.current_grab.enable_violent_interactions) + return ..() + + var/mob/living/affecting_mob = grab.get_affecting_mob() + if(!istype(affecting_mob)) + if(isitem(victim)) + var/obj/item/I = victim + I.melee_attack_chain(user, src, params) + return TRUE + + + var/def_zone = deprecise_zone(grab.target_zone) + var/obj/item/bodypart/BP = affecting_mob.get_bodypart(def_zone) + if(!BP) + return + + var/blocked = affecting_mob.run_armor_check(def_zone, BLUNT) + if(grab.current_grab.damage_stage < GRAB_NECK) + affecting_mob.visible_message(span_danger("[user] bashes [affecting_mob]'s [BP.plaintext_zone] against \the [src]!")) + switch(def_zone) + if(BODY_ZONE_HEAD, BODY_ZONE_CHEST) + if(prob(50 * ((100 - blocked/100)))) + affecting_mob.Knockdown(4 SECONDS) + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + if(prob(50 * ((100 - blocked/100)))) + var/side = def_zone == BODY_ZONE_L_ARM ? LEFT_HANDS : RIGHT_HANDS + var/obj/item/I = affecting_mob.get_held_items_for_side(side) + if(I) + affecting_mob.dropItemToGround(I) + affecting_mob.apply_damage(20, BRUTE, def_zone, blocked) + take_damage(10) + qdel(grab) + else + affecting_mob.visible_message(span_danger("[user] crushes [affecting_mob]'s [BP.plaintext_zone] against \the [src]!")) + switch(def_zone) + if(BODY_ZONE_HEAD, BODY_ZONE_CHEST) + affecting_mob.Knockdown(10 SECONDS) + if(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) + var/side = def_zone == BODY_ZONE_L_ARM ? LEFT_HANDS : RIGHT_HANDS + var/obj/item/I = affecting_mob.get_held_items_for_side(side) + if(I) + affecting_mob.dropItemToGround(I) + + affecting_mob.apply_damage(20, BRUTE, def_zone, blocked) + take_damage(20) + qdel(grab) + + var/obj/effect/decal/cleanable/blood/splatter/over_window/splatter = new(src, null, affecting_mob.get_blood_dna_list()) + vis_contents += splatter + bloodied = TRUE + return TRUE + /obj/structure/window/spawner/east dir = EAST @@ -452,7 +510,7 @@ icon_state = "rwindow" reinf = TRUE heat_resistance = 1600 - armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 80, ACID = 100) + armor = list(BLUNT = 30, PUNCTURE = 0, SLASH = 40, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 80, ACID = 100) max_integrity = 75 explosion_block = 1 damage_deflection = 11 @@ -481,7 +539,7 @@ icon_state = "plasmawindow" reinf = FALSE heat_resistance = 25000 - armor = list(MELEE = 60, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, FIRE = 99, ACID = 100) + armor = list(BLUNT = 60, PUNCTURE = 5, SLASH = 40, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, FIRE = 99, ACID = 100) max_integrity = 200 explosion_block = 1 glass_type = /obj/item/stack/sheet/plasmaglass @@ -518,9 +576,9 @@ icon_state = "plasmarwindow" reinf = TRUE heat_resistance = 50000 - armor = list(MELEE = 80, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, FIRE = 99, ACID = 100) + armor = list(BLUNT = 80, PUNCTURE = 20, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, FIRE = 99, ACID = 100) max_integrity = 500 - damage_deflection = 21 + damage_deflection = 18 explosion_block = 2 glass_type = /obj/item/stack/sheet/plasmarglass melting_point = 25000 @@ -561,8 +619,8 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS glass_amount = 2 /obj/structure/window/fulltile/unanchored @@ -578,8 +636,8 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS glass_amount = 2 melting_point = 25000 @@ -597,8 +655,8 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS glass_amount = 2 melting_point = 28000 @@ -617,8 +675,8 @@ flags_1 = PREVENT_CLICK_UNDER_1 state = WINDOW_SCREWED_TO_FRAME smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS glass_amount = 2 /obj/structure/window/reinforced/fulltile/unanchored @@ -634,8 +692,8 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS glass_amount = 2 /obj/structure/window/reinforced/fulltile/ice @@ -659,10 +717,10 @@ flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list(MELEE = 75, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) + armor = list(BLUNT = 75, PUNCTURE = 0, SLASH = 90, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS, SMOOTH_GROUP_SHUTTLE_PARTS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE_SHUTTLE + SMOOTH_GROUP_WALLS explosion_block = 3 glass_type = /obj/item/stack/sheet/titaniumglass glass_amount = 2 @@ -702,10 +760,10 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 heat_resistance = 1600 - armor = list(MELEE = 95, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) + armor = list(BLUNT = 95, PUNCTURE = 0, SLASH = 100, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 80, ACID = 100) smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS explosion_block = 3 damage_deflection = 21 //The same as reinforced plasma windows.3 glass_type = /obj/item/stack/sheet/plastitaniumglass @@ -737,15 +795,15 @@ fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_PAPERFRAME) - canSmoothWith = list(SMOOTH_GROUP_PAPERFRAME) + smoothing_groups = SMOOTH_GROUP_PAPERFRAME + canSmoothWith = SMOOTH_GROUP_PAPERFRAME glass_amount = 2 glass_type = /obj/item/stack/sheet/paperframes heat_resistance = 233 decon_speed = 10 can_atmos_pass = CANPASS_ALWAYS resistance_flags = FLAMMABLE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) knock_sound = SFX_PAGE_TURN bash_sound = 'sound/weapons/slashmiss.ogg' break_sound = 'sound/items/poster_ripped.ogg' @@ -774,7 +832,7 @@ if(.) return if(user.combat_mode) - take_damage(4, BRUTE, MELEE, 0) + take_damage(4, BRUTE, BLUNT, 0) if(!QDELETED(src)) update_appearance() @@ -784,7 +842,7 @@ /obj/structure/window/paperframe/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + if((updates & UPDATE_SMOOTHING)) QUEUE_SMOOTH(src) /obj/structure/window/paperframe/update_overlays() @@ -826,8 +884,8 @@ color = "#92661A" alpha = 180 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS fulltile = TRUE flags_1 = PREVENT_CLICK_UNDER_1 max_integrity = 50 diff --git a/code/game/say.dm b/code/game/say.dm index 3ea216f5cc66..ab7b1bd53c8b 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -32,11 +32,16 @@ GLOBAL_LIST_INIT(freqtospan, list( language = get_selected_language() send_speech(message, range, src, , spans, message_language=language) -/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) + return TRUE -/mob/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() + if(LAZYLEN(observers)) + for(var/mob/dead/observer/O as anything in observers) + O.Hear(arglist(args)) + if(client && radio_freq) var/atom/movable/virtualspeaker/V = speaker if(isAI(V.source)) @@ -52,46 +57,73 @@ GLOBAL_LIST_INIT(freqtospan, list( if(!hearing_movable)//theoretically this should use as anything because it shouldnt be able to get nulls but there are reports that it does. stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!") continue - hearing_movable.Hear(rendered, src, message_language, message, , spans, message_mods) + hearing_movable.Hear(rendered, src, message_language, message, null, spans, message_mods, message_range = range) /** The core proc behind say as a concept. Terrifyingly horrible. Called twice for no good reason. * Arguments: * * `speaker` - Either the mob speaking, or a virtualspeaker if this is a remote message of some kind. * * `message_language` - The language the message is ICly in. For understanding. - * * `raw_message` - The actual text of the message. + * * `translated_message` - The actual text of the message, after being translated across languages. * * `radio_freq` - can be either a numeric radio frequency, or an assoc list of `span` and `name`, to directly override them. * * `face_name` - Do we use the "name" of the speaker, or get it's `real_name`, Used solely for hallucinations. */ -/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) +/atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, translated_message, radio_freq, list/spans, list/message_mods = list(), face_name = FALSE) + + var/voice = "[speaker.GetVoice()]" + var/alt_name = speaker.get_alt_name() + //Basic span - var/spanpart1 = "" - //Start name span. - var/spanpart2 = "" + var/wrapper_span = "" + if(radio_freq) + wrapper_span = "" + + else if(message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) + wrapper_span = "" + //Radio freq/name display - var/freqpart = radio_freq ? "\[[get_radio_name(radio_freq)]\] " : "" + var/freqpart = "" + if(radio_freq) + freqpart = "[RADIO_TAG(get_radio_icon(radio_freq))]\[[get_radio_name(radio_freq)]\] " + //Speaker name - var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" + var/namepart = "[voice][alt_name]" if(face_name && 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 + else + speaker.update_name_chat_color(voice) + + //Start name span. + var/name_span = "" //End name span. - var/endspanpart = "" + var/end_name_span = "" + + //href for AI tracking + var/ai_track_href = compose_track_href(speaker, namepart) + //shows the speaker's job to AIs + var/ai_job_display = compose_job(speaker, message_language, translated_message, radio_freq) + //AI smiley face :) + var/ai_snowflake + if(radio_freq && isAI(speaker.GetSource())) + ai_snowflake = RADIO_TAG("ai.png") //Message var/messagepart var/languageicon = "" if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) - messagepart = message_mods[MODE_CUSTOM_SAY_EMOTE] + messagepart = "[message_mods[MODE_CUSTOM_SAY_EMOTE]]" else - messagepart = lang_treat(speaker, message_language, raw_message, spans, message_mods) + if(message_mods[MODE_NO_QUOTE]) + messagepart = translated_message + else + messagepart = speaker.say_quote(translated_message, spans, message_mods, message_language) - var/datum/language/D = GLOB.language_datum_instances[message_language] - if(istype(D) && D.display_icon(src)) - languageicon = "[D.get_icon()] " + if(message_language?.display_icon(src)) + languageicon = "[message_language.get_icon()] " - messagepart = " [speaker.say_emphasis(messagepart)]" + messagepart = " [speaker.say_emphasis(messagepart)]" //These close the wrapper_span and the "message" class span - return "[spanpart1][spanpart2][freqpart][languageicon][compose_track_href(speaker, namepart)][namepart][compose_job(speaker, message_language, raw_message, radio_freq)][endspanpart][messagepart]" + return "[wrapper_span][freqpart][ai_snowflake][name_span][languageicon][ai_track_href][namepart][ai_job_display][end_name_span][messagepart]" /atom/movable/proc/compose_track_href(atom/movable/speaker, message_langs, raw_message, radio_freq) return "" @@ -99,37 +131,41 @@ 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, list/message_mods = list()) +/atom/movable/proc/say_mod(input, list/message_mods = list(), datum/language/language) var/ending = copytext_char(input, -1) if(copytext_char(input, -2) == "!!") return verb_yell + else if(message_mods[MODE_SING]) . = verb_sing + else if(ending == "?") return verb_ask + else if(ending == "!") return verb_exclaim + else return verb_say -/atom/movable/proc/say_quote(input, list/spans=list(speech_span), list/message_mods = list()) +/atom/movable/proc/say_quote(input, list/spans=list(speech_span), list/message_mods = list(), datum/language/language) if(!input) input = "..." var/say_mod = message_mods[MODE_CUSTOM_SAY_EMOTE] if (!say_mod) - say_mod = say_mod(input, message_mods) + say_mod = say_mod(input, message_mods, language) if(copytext_char(input, -2) == "!!") spans |= SPAN_YELL var/spanned = attach_spans(input, spans) - return "[say_mod], \"[spanned]\"" + return "[say_mod], \"[spanned]\"" /// Transforms the speech emphasis mods from [/atom/movable/proc/say_emphasis] into the appropriate HTML tags. Includes escaping. #define ENCODE_HTML_EMPHASIS(input, char, html, varname) \ var/static/regex/##varname = regex("(?$1") + input = varname.Replace_char(input, "<[html]>$1​") //zero-width space to force maptext to respect closing tags. /// Scans the input sentence for speech emphasis modifiers, notably |italics|, +bold+, and _underline_ -mothblocks /atom/movable/proc/say_emphasis(input) @@ -142,16 +178,22 @@ GLOBAL_LIST_INIT(freqtospan, list( #undef ENCODE_HTML_EMPHASIS -/atom/movable/proc/lang_treat(atom/movable/speaker, datum/language/language, raw_message, list/spans, list/message_mods = list(), no_quote = FALSE) +/// Processes a spoken message's language based on if the hearer can understand it. +/atom/movable/proc/translate_speech(atom/movable/speaker, datum/language/language, raw_message, list/spans, list/message_mods = list(), quote = FALSE) + SHOULD_NOT_OVERRIDE(TRUE) var/atom/movable/source = speaker.GetSource() || speaker //is the speaker virtual + + // Understands the language? if(has_language(language)) - return no_quote ? raw_message : source.say_quote(raw_message, spans, message_mods) + return language.speech_understood(source, raw_message, spans, message_mods, quote) + else if(language) - var/datum/language/D = GLOB.language_datum_instances[language] - raw_message = D.scramble(raw_message) - return no_quote ? raw_message : source.say_quote(raw_message, spans, message_mods) + return language.speech_not_understood(source, raw_message, spans, message_mods, quote) + else - return "makes a strange sound." + . = "makes a strange sound." + if(quote) + . = source.say_quote(.) /proc/get_radio_span(freq) if(islist(freq)) //Heehoo hijack bullshit @@ -169,6 +211,11 @@ GLOBAL_LIST_INIT(freqtospan, list( return returntext return "[copytext_char("[freq]", 1, 4)].[copytext_char("[freq]", 4, 5)]" +/// Pass in a frequency, get a file name. See chat_icons.dm +/proc/get_radio_icon(freq) + . = GLOB.freq2icon["[freq]"] + . ||= "unknown.png" + /proc/attach_spans(input, list/spans) return "[message_spans_start(spans)][input]" @@ -228,11 +275,12 @@ INITIALIZE_IMMEDIATE(/atom/movable/virtualspeaker) if(ishuman(M)) // Humans use their job as seen on the crew manifest. This is so the AI // can know their job even if they don't carry an ID. - var/datum/data/record/findjob = find_record("name", name, GLOB.data_core.general) + var/datum/data/record/findjob = SSdatacore.get_record_by_name(name, DATACORE_RECORDS_STATION) if(findjob) - job = findjob.fields["rank"] + job = findjob.fields[DATACORE_RANK] else job = "Unknown" + else if(iscarbon(M)) // Carbon nonhuman job = "No ID" else if(isAI(M)) // AI diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index a0c2d6075a7e..f51fb6ab0322 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -7,9 +7,9 @@ name = "shuttle" icon = 'icons/turf/shuttle.dmi' resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - smoothing_groups = list(SMOOTH_GROUP_SHUTTLE_PARTS) + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS max_integrity = 500 - armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) //default + ignores melee + armor = list(BLUNT = 100, PUNCTURE = 40, SLASH = 100, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) //default + ignores melee can_atmos_pass = CANPASS_DENSITY /obj/structure/shuttle/engine @@ -110,7 +110,7 @@ icon_state = "propulsion_w" density = FALSE opacity = FALSE - smoothing_groups = list() + smoothing_groups = null /obj/structure/shuttle/engine/propulsion/left name = "left propulsion engine" @@ -156,7 +156,7 @@ icon_state = "large_engine_w" density = FALSE opacity = FALSE - smoothing_groups = list() + smoothing_groups = null /obj/structure/shuttle/engine/huge name = "engine" @@ -173,7 +173,7 @@ icon_state = "huge_engine_w" density = FALSE opacity = FALSE - smoothing_groups = list() + smoothing_groups = null #undef ENGINE_UNWRENCHED #undef ENGINE_WRENCHED diff --git a/code/game/sound.dm b/code/game/sound.dm index 29715245138b..3700a684a147 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -41,6 +41,8 @@ /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") + if(isnull(vol)) + CRASH("Playsound received a null volume, this is probably wrong!") var/turf/turf_source = get_turf(source) @@ -82,14 +84,14 @@ listening_mob.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, 1, use_reverb) . += listening_mob -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/sound_to_use, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/sound_to_use, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE, wait = FALSE) if(!client || !can_hear()) return if(!sound_to_use) sound_to_use = sound(get_sfx(soundin)) - sound_to_use.wait = 0 //No queue + sound_to_use.wait = wait sound_to_use.channel = channel || SSsounds.random_available_channel() sound_to_use.volume = vol @@ -154,6 +156,9 @@ sound_to_use.echo[4] = 0 //RoomHF setting, 0 means normal reverb. SEND_SOUND(src, sound_to_use) + if(LAZYLEN(observers)) + for(var/mob/dead/observer/O as anything in observers) + SEND_SOUND(src, sound_to_use) /proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S) if(!S) @@ -176,14 +181,14 @@ UNTIL(SSticker.login_music) //wait for SSticker init to set the login music if(prefs && (prefs.toggles & SOUND_LOBBY)) - SEND_SOUND(src, sound(SSticker.login_music["file"], repeat = 0, wait = 0, volume = vol, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS + SEND_SOUND(src, sound(SSticker.login_music.path, repeat = 0, wait = 0, volume = vol, channel = CHANNEL_LOBBYMUSIC)) // MAD JAMS UNTIL(SSticker.current_state >= GAME_STATE_PREGAME) - to_chat(src, span_greenannounce("Now Playing: [SSticker.login_music["name"]][SSticker.login_music["author"] ? " by [SSticker.login_music["author"]]" : ""]")) + to_chat(src, span_greenannounce("Now Playing: [SSticker.login_music.name][SSticker.login_music.author ? " by [SSticker.login_music.author]" : ""]")) /client/proc/playcreditsmusic(vol = 85) - SEND_SOUND(src, sound(SSticker.credits_music["file"], repeat = 0, wait = 0, volume = vol, channel = CHANNEL_LOBBYMUSIC)) - to_chat(src, span_greenannounce("Now Playing: [SSticker.credits_music["name"]][SSticker.credits_music["author"] ? " by [SSticker.credits_music["author"]]" : ""]")) + SEND_SOUND(src, sound(SSticker.credits_music.path, repeat = 0, wait = 0, volume = vol, channel = CHANNEL_LOBBYMUSIC)) + to_chat(src, span_greenannounce("Now Playing: [SSticker.credits_music.name][SSticker.credits_music.author ? " by [SSticker.credits_music.author]" : ""]")) /proc/get_rand_frequency() return rand(32000, 55000) //Frequency stuff only works with 45kbps oggs. @@ -207,7 +212,7 @@ if (SFX_BODYFALL) soundin = pick('sound/effects/bodyfall1.ogg','sound/effects/bodyfall2.ogg','sound/effects/bodyfall3.ogg','sound/effects/bodyfall4.ogg') if (SFX_PUNCH) - soundin = pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg') + soundin = pick('sound/weapons/attack/punch.ogg','sound/weapons/attack/punch_2.ogg', 'sound/weapons/attack/punch_3.ogg', 'sound/weapons/attack/punch_4.ogg') if (SFX_CLOWN_STEP) soundin = pick('sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg') if (SFX_SUIT_STEP) @@ -258,5 +263,9 @@ soundin = pick('sound/effects/rocktap1.ogg', 'sound/effects/rocktap2.ogg', 'sound/effects/rocktap3.ogg') if(SFX_BREAK_BONE) soundin= pick('sound/effects/bonebreak1.ogg','sound/effects/bonebreak2.ogg','sound/effects/bonebreak3.ogg','sound/effects/bonebreak4.ogg') + if(SFX_PAINT) + soundin= pick('sound/effects/paint_1.ogg','sound/effects/paint_2.ogg','sound/effects/paint_3.ogg') + if(SFX_BLOCK_BIG_METAL) + soundin = pick('sound/weapons/block/metal_block_01.ogg','sound/weapons/block/metal_block_02.ogg','sound/weapons/block/metal_block_03.ogg','sound/weapons/block/metal_block_04.ogg','sound/weapons/block/metal_block_05.ogg','sound/weapons/block/metal_block_06.ogg') return soundin diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index af6378f56517..2e99204bc164 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -58,7 +58,10 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( // 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) +/turf/proc/ChangeTurf(turf/path, list/new_baseturfs, flags) + if(flags & CHANGETURF_DEFAULT_BASETURF) + new_baseturfs = initial(path.baseturfs) + switch(path) if(null) return @@ -74,7 +77,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( // no warning though because this can happen naturaly as a result of it being built on top of path = /turf/open/space - if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP) && (baseturfs == new_baseturfs)) // Don't no-op if the map loader requires it to be reconstructed, or if this is a new set of baseturfs + if(!global.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP) && (baseturfs == new_baseturfs)) // Don't no-op if the map loader requires it to be reconstructed, or if this is a new set of baseturfs return src if(flags & CHANGETURF_SKIP) return new path(src) @@ -84,10 +87,13 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_lighting_corner_SE = lighting_corner_SE var/old_lighting_corner_SW = lighting_corner_SW var/old_lighting_corner_NW = lighting_corner_NW + var/old_opacity = opacity var/old_directional_opacity = directional_opacity var/old_dynamic_lumcount = dynamic_lumcount var/old_rcd_memory = rcd_memory var/old_above = above + var/old_fire = active_hotspot + var/old_explosion_details = explosion_throw_details var/old_bp = blueprint_data blueprint_data = null @@ -133,6 +139,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( W.blueprint_data = old_bp W.rcd_memory = old_rcd_memory + W.explosion_throw_details = old_explosion_details lighting_corner_NE = old_lighting_corner_NE lighting_corner_SE = old_lighting_corner_SE @@ -142,6 +149,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( dynamic_lumcount = old_dynamic_lumcount above = old_above + active_hotspot = old_fire if(SSlighting.initialized) if(!always_lit) @@ -159,27 +167,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( for(var/turf/open/space/space_tile in RANGE_TURFS(1, src)) space_tile.update_starlight() + if(old_opacity != opacity && SSticker) + GLOB.cameranet.bareMajorChunkChange(src) + QUEUE_SMOOTH_NEIGHBORS(src) QUEUE_SMOOTH(src) return W -/* -/turf/open/ChangeTurf(path, list/new_baseturfs, flags) //Resist the temptation to make this default to keeping air. - if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) - var/datum/gas_mixture/stashed_air = new() - stashed_air.copyFrom(air) - . = ..() //If path == type this will return us, don't bank on making a new type - if (!.) // changeturf failed or didn't do anything - return - var/turf/open/newTurf = . - newTurf.air.copyFrom(stashed_air) - SSzas.mark_for_update(newTurf) - else - if(ispath(path,/turf/closed) || ispath(path,/turf/cordon)) - flags |= CHANGETURF_RECALC_ADJACENT - return ..() -*/ /// Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) if(!amount) @@ -202,27 +197,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( return ChangeTurf(baseturfs, baseturfs, flags) // The bottom baseturf will never go away -// Take the input as baseturfs and put it underneath the current baseturfs -// If fake_turf_type is provided and new_baseturfs is not the baseturfs list will be created identical to the turf type's -// If both or just new_baseturfs is provided they will be inserted below the existing baseturfs -/turf/proc/PlaceOnBottom(list/new_baseturfs, turf/fake_turf_type) - if(fake_turf_type) - if(!new_baseturfs) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - var/list/old_baseturfs = baseturfs.Copy() - assemble_baseturfs(fake_turf_type) - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs = baseturfs_string_list((baseturfs - (baseturfs & GLOB.blacklisted_automated_baseturfs)) + old_baseturfs, src) - return - else if(!length(new_baseturfs)) - new_baseturfs = list(new_baseturfs, fake_turf_type) - else - new_baseturfs += fake_turf_type - if(!length(baseturfs)) - baseturfs = list(baseturfs) - baseturfs = baseturfs_string_list(new_baseturfs + baseturfs, src) +/// Places the given turf on the bottom of the turf stack. +/turf/proc/PlaceOnBottom(turf/bottom_turf) + baseturfs = baseturfs_string_list( + list(initial(bottom_turf.baseturfs), bottom_turf) + baseturfs, + src + ) // Make a new turf and put it on top // The args behave identical to PlaceOnBottom except they go on top @@ -236,7 +216,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/turf/newT if(flags & CHANGETURF_SKIP) // We haven't been initialized - if(flags_1 & INITIALIZED_1) + if(initialized) stack_trace("CHANGETURF_SKIP was used in a PlaceOnTop call for a turf that's initialized. This is a mistake. [src]([type])") assemble_baseturfs() if(fake_turf_type) @@ -300,7 +280,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //If you modify this function, ensure it works correctly with lateloaded map templates. /turf/proc/AfterChange(flags, oldType) //called after a turf has been replaced in ChangeTurf() levelupdate() - HandleTurfChange(src) /turf/open/AfterChange(flags, oldType) ..() @@ -309,6 +288,8 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( //Assimilate_Air() SSzas.mark_for_update(src) -/turf/proc/ReplaceWithLattice() - ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - new /obj/structure/lattice(locate(x, y, z)) +/// Run ScrapeAway(amount), then attempt to place lattice. +/turf/proc/TryScrapeToLattice(amount = 2) + var/turf/T = ScrapeAway(amount, flags = CHANGETURF_INHERIT_AIR) + if(!isfloorturf(T) && !(locate(/obj/structure/lattice) in T)) + new /obj/structure/lattice(T) diff --git a/code/game/turfs/closed/_closed.dm b/code/game/turfs/closed/_closed.dm index 702e034eae35..18a48c20c4d7 100644 --- a/code/game/turfs/closed/_closed.dm +++ b/code/game/turfs/closed/_closed.dm @@ -5,14 +5,6 @@ blocks_air = AIR_BLOCKED rad_insulation = RAD_MEDIUM_INSULATION pass_flags_self = PASSCLOSEDTURF -/* -/turf/closed/AfterChange() - . = ..() - SSair.high_pressure_delta -= src -*/ - -/turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - return FALSE /turf/closed/indestructible name = "wall" @@ -98,14 +90,14 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "reinforced_wall-0" base_icon_state = "reinforced_wall" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS /turf/closed/indestructible/reinforced/centcom icon = 'icons/turf/walls/solid_wall_reinforced.dmi' icon_state = "wall-0" base_icon_state = "wall" - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS color = "#3a3a4f" /turf/closed/indestructible/riveted @@ -113,8 +105,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "riveted-0" base_icon_state = "riveted" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS) - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS /turf/closed/indestructible/syndicate icon = 'icons/turf/walls/wood_wall.dmi' @@ -122,8 +114,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) base_icon_state = "wall" color = "#423b3b" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WALLS /turf/closed/indestructible/riveted/uranium icon = 'icons/turf/walls/cult_wall.dmi' @@ -131,8 +123,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) base_icon_state = "wall" color = "#174207" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS /turf/closed/indestructible/riveted/plastinum name = "plastinum wall" @@ -147,9 +139,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) base_icon_state = "wall" color = "#93662C" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) - + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS /turf/closed/indestructible/alien name = "alien wall" @@ -157,8 +148,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon = 'icons/turf/walls/legacy/abductor_wall.dmi' icon_state = "abductor_wall-0" base_icon_state = "abductor_wall" - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS /turf/closed/indestructible/cult @@ -168,8 +159,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "cult_wall-0" base_icon_state = "cult_wall" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS /turf/closed/indestructible/abductor @@ -187,8 +178,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#a885b8" opacity = FALSE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups =SMOOTH_GROUP_WINDOW_FULLTILE + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS /turf/closed/indestructible/fakeglass/Initialize(mapload, inherited_virtual_z) . = ..() @@ -203,8 +194,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) color = "#a2a2a2" opacity = FALSE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_SHUTTLE_PARTS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE_PLASTITANIUM + SMOOTH_GROUP_WALLS /turf/closed/indestructible/opsglass/Initialize(mapload, inherited_virtual_z) . = ..() @@ -216,7 +207,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) name = "CentCom Access" icon = 'icons/obj/doors/airlocks/centcom/airlock.dmi' icon_state = "fake_door" - smoothing_groups = list(SMOOTH_GROUP_AIRLOCK) + smoothing_groups = SMOOTH_GROUP_AIRLOCK /turf/closed/indestructible/rock name = "dense rock" @@ -243,7 +234,7 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "icerock_wall-0" base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS pixel_x = -4 pixel_y = -4 @@ -262,11 +253,6 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) explosion_block = 50 baseturfs = /turf/closed/indestructible/necropolis -/turf/closed/indestructible/necropolis/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "necro1" - return TRUE - /turf/closed/indestructible/iron name = "impervious iron wall" desc = "A wall with tough iron plating." @@ -274,8 +260,8 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "iron_wall-0" base_icon_state = "iron_wall" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS opacity = FALSE /turf/closed/indestructible/riveted/boss @@ -285,24 +271,19 @@ INITIALIZE_IMMEDIATE(/turf/closed/indestructible/splashscreen) icon_state = "boss_wall-0" base_icon_state = "boss_wall" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_BOSS_WALLS) - canSmoothWith = list(SMOOTH_GROUP_BOSS_WALLS) + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS + canSmoothWith = SMOOTH_GROUP_BOSS_WALLS explosion_block = 50 baseturfs = /turf/closed/indestructible/riveted/boss /turf/closed/indestructible/riveted/boss/see_through opacity = FALSE -/turf/closed/indestructible/riveted/boss/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "basalt" - return TRUE - /turf/closed/indestructible/riveted/hierophant name = "wall" desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." icon = 'icons/turf/walls/legacy/hierophant_wall.dmi' icon_state = "wall" smoothing_flags = SMOOTH_CORNERS - smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL) - canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL) + smoothing_groups = SMOOTH_GROUP_HIERO_WALL + canSmoothWith = SMOOTH_GROUP_HIERO_WALL diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 6d7a1a21bd5b..909515461c9d 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -1,143 +1,242 @@ #define MINING_MESSAGE_COOLDOWN 20 - /**********************Mineral deposits**************************/ /turf/closed/mineral //wall piece name = "rock" - icon = 'icons/turf/mining.dmi' + icon = MAP_SWITCH('icons/turf/smoothrocks.dmi', 'icons/turf/mining.dmi') icon_state = "rock" + smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_MINERAL_WALLS) - canSmoothWith = list(SMOOTH_GROUP_MINERAL_WALLS) + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_MINERAL_WALLS + canSmoothWith = SMOOTH_GROUP_MINERAL_WALLS baseturfs = /turf/open/misc/asteroid/airless initial_gas = AIRLESS_ATMOS opacity = TRUE density = TRUE base_icon_state = "smoothrocks" temperature = TCMB - var/smooth_icon = 'icons/turf/smoothrocks.dmi' + + // This is static + // Done like this to avoid needing to make it dynamic and save cpu time + // 4 to the left, 4 down + transform = MAP_SWITCH(TRANSLATE_MATRIX(-4, -4), matrix()) + + /// Health decreased by mining. + var/mining_health = 20 + var/mining_max_health = 20 + var/turf/open/floor/plating/turf_type = /turf/open/misc/asteroid/airless - var/obj/item/stack/ore/mineralType = null + var/datum/ore/mineralType = null var/mineralAmt = 3 - var/scan_state = "" //Holder for the image we display when we're pinged by a mining scanner + var/defer_change = 0 - // If true you can mine the mineral turf without tools. + + /// If a turf is "weak" it can be broken with no tools var/weak_turf = FALSE - ///How long it takes to mine this turf with tools, before the tool's speed and the user's skill modifier are factored in. - var/tool_mine_speed = 4 SECONDS + ///How long it takes to mine this turf without tools, if it's weak. var/hand_mine_speed = 15 SECONDS +//We don't call parent for perf reasons. Instead, we copy paste everything. BYOND! /turf/closed/mineral/Initialize(mapload) + SHOULD_CALL_PARENT(FALSE) + + if(initialized) + stack_trace("Warning: [src]([type]) initialized multiple times!") + + initialized = TRUE + + if(mapload && permit_ao) + queue_ao() + + // by default, vis_contents is inherited from the turf that was here before + if(length(vis_contents)) + vis_contents.len = 0 + + assemble_baseturfs() + + levelupdate() + + #ifdef UNIT_TESTS + ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_groups) + ASSERT_SORTED_SMOOTHING_GROUPS(canSmoothWith) + #endif + + SETUP_SMOOTHING() + + QUEUE_SMOOTH(src) + + var/area/our_area = loc + if(!our_area.luminosity && always_lit) //Only provide your own lighting if the area doesn't for you + add_overlay(global.fullbright_overlay) + + if (light_power && light_outer_range) + update_light() + + if (opacity) + directional_opacity = ALL_CARDINALS + + // apply materials properly from the default custom_materials value + if (length(custom_materials)) + set_custom_materials(custom_materials) + + if(uses_integrity) + atom_integrity = max_integrity + + if(mineralType) + change_ore(mineralType, mineralAmt, TRUE) + + return INITIALIZE_HINT_NORMAL + +// Inlined version of the bump click element. way faster this way, the element's nice but it's too much overhead +/turf/closed/mineral/BumpedBy(atom/movable/bumped_atom) + . = ..() + if(!isliving(bumped_atom)) + return + + var/mob/living/bumping = bumped_atom + if(!ISADVANCEDTOOLUSER(bumping)) // Unadvanced tool users can't mine anyway (this is a lie). This just prevents message spam from attackby() + return + + var/obj/item/held_item = bumping.get_active_held_item() + // !held_item exists to be nice to snow. the other bit is for pickaxes obviously + if(!held_item) + INVOKE_ASYNC(bumping, TYPE_PROC_REF(/mob, ClickOn), src) + else if(held_item.tool_behaviour == TOOL_MINING) + attackby(held_item, bumping) + + return INITIALIZE_HINT_NORMAL + +/turf/closed/mineral/update_overlays() . = ..() - var/matrix/M = new - M.Translate(-4, -4) - transform = M - icon = smooth_icon - var/static/list/behaviors = list(TOOL_MINING) - AddElement(/datum/element/bump_click, tool_behaviours = behaviors, allow_unarmed = TRUE) - -/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) - var/turf/closed/mineral/random/M = T - if(istype(M) && !M.mineralType) - M.Change_Ore(mineralType) - -/turf/closed/mineral/proc/Change_Ore(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) - underlay_appearance.icon = initial(turf_type.icon) - underlay_appearance.icon_state = initial(turf_type.icon_state) - return TRUE - return ..() + var/image/I + switch(round((mining_health / mining_max_health) * 100)) + if(67 to 99) + I = image('goon/icons/turf/damage_states.dmi', "damage1") + if(33 to 66) + I = image('goon/icons/turf/damage_states.dmi', "damage2") + if(0 to 65) + I = image('goon/icons/turf/damage_states.dmi', "damage3") + if(I) + I.blend_mode = BLEND_MULTIPLY + . += I + +/turf/closed/mineral/proc/spread_vein() + var/spreadChance = mineralType.spread_chance + if(!spreadChance) + return + + for(var/dir in GLOB.cardinals) + if(!prob(spreadChance)) + continue + + var/turf/T = get_step(src, dir) + var/turf/closed/mineral/random/M = T + if(istype(M) && !M.mineralType) + M.change_ore(mineralType, mineralAmt, TRUE) + +/turf/closed/mineral/proc/change_ore(datum/ore/new_ore, amount, random) + if(ispath(new_ore)) + new_ore = locate(new_ore) in SSmaterials.ores + mineralType = new_ore + + if(new_ore.mining_health) + mining_health = new_ore.mining_health + mining_max_health = mining_health + + if(amount) + mineralAmt = amount + + else if(random) + mineralAmt = rand(new_ore.amount_per_turf_min, new_ore.amount_per_turf_max) +/turf/closed/mineral/proc/mine(damage, obj/item/I, user) + if(damage <= 0) + return + + mining_health -= damage + if(mining_health < 0) + MinedAway() + SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) + else + update_appearance(UPDATE_OVERLAYS) /turf/closed/mineral/attackby(obj/item/I, mob/user, params) if (!ISADVANCEDTOOLUSER(user)) to_chat(usr, span_warning("You don't have the dexterity to do this!")) return - if(I.tool_behaviour == TOOL_MINING) - var/turf/T = user.loc - if (!isturf(T)) - return + if(!(I.tool_behaviour == TOOL_MINING)) + return + + var/turf/T = user.loc + if (!isturf(T)) + return - if(TIMER_COOLDOWN_CHECK(src, REF(user))) //prevents mining turfs in progress - return + if(DOING_INTERACTION(user, "MINING_ORE")) + return - TIMER_COOLDOWN_START(src, REF(user), tool_mine_speed) + if(!I.use_tool(src, user, 1 SECONDS, volume=50, interaction_key = "MINING_ORE")) + return - to_chat(user, span_notice("You start picking...")) + if(ismineralturf(src)) // Changeturf memes + var/damage = 40 + //I'm a hack + if(istype(I, /obj/item/pickaxe)) + var/obj/item/pickaxe/pick = I + damage = pick.mining_damage - if(!I.use_tool(src, user, tool_mine_speed, volume=50)) - TIMER_COOLDOWN_END(src, REF(user)) //if we fail we can start again immediately - return - if(ismineralturf(src)) - to_chat(user, span_notice("You finish cutting into the rock.")) - gets_drilled(user, TRUE) - SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) + mine(damage, I) /turf/closed/mineral/attack_hand(mob/user) if(!weak_turf) return ..() + var/turf/user_turf = user.loc if (!isturf(user_turf)) return + if(TIMER_COOLDOWN_CHECK(src, REF(user))) //prevents mining turfs in progress return + TIMER_COOLDOWN_START(src, REF(user), hand_mine_speed) - var/skill_modifier = 1 - skill_modifier = user?.mind.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) + to_chat(user, span_notice("You start pulling out pieces of [src]...")) - if(!do_after(user, src, hand_mine_speed * skill_modifier)) + if(!do_after(user, src, hand_mine_speed)) TIMER_COOLDOWN_END(src, REF(user)) //if we fail we can start again immediately return + if(ismineralturf(src)) to_chat(user, span_notice("You finish pulling apart [src].")) - gets_drilled(user) + MinedAway() /turf/closed/mineral/attack_robot(mob/living/silicon/robot/user) if(user.Adjacent(src)) attack_hand(user) -/turf/closed/mineral/proc/gets_drilled(user, give_exp = FALSE) - if (mineralType && (mineralAmt > 0)) - new mineralType(src, mineralAmt) - SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(give_exp) - if (mineralType && (mineralAmt > 0)) - H.mind.adjust_experience(/datum/skill/mining, initial(mineralType.mine_experience) * mineralAmt) - else - H.mind.adjust_experience(/datum/skill/mining, 4) +/turf/closed/mineral/proc/MinedAway() + if (mineralType?.stack_path && (mineralAmt > 0)) + var/stack_path = mineralType.stack_path + new mineralType.stack_path(src, mineralAmt) + SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, stack_path) for(var/obj/effect/temp_visual/mining_overlay/M in src) qdel(M) + var/flags = NONE var/old_type = type if(defer_change) // TODO: make the defer change var a var for any changeturf flag flags = CHANGETURF_DEFER_CHANGE + ScrapeAway(null, flags) SSzas.mark_for_update(src) addtimer(CALLBACK(src, PROC_REF(AfterChange), flags, old_type), 1, TIMER_UNIQUE) playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction - //mined.update_visuals() + /turf/closed/mineral/attack_animal(mob/living/simple_animal/user, list/modifiers) if((user.environment_smash & ENVIRONMENT_SMASH_WALLS) || (user.environment_smash & ENVIRONMENT_SMASH_RWALLS)) - gets_drilled(user) + MinedAway() ..() /turf/closed/mineral/attack_alien(mob/living/carbon/alien/user, list/modifiers) @@ -145,14 +244,14 @@ playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) if(do_after(user, src, 4 SECONDS)) to_chat(user, span_notice("You tunnel into the rock.")) - gets_drilled(user) + MinedAway() /turf/closed/mineral/attack_hulk(mob/living/carbon/human/H) ..() if(do_after(H, src, 50)) playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) H.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") - gets_drilled(H) + MinedAway() return TRUE /turf/closed/mineral/acid_melt() @@ -162,24 +261,30 @@ . = ..() switch(severity) if(EXPLODE_DEVASTATE) - gets_drilled(null, FALSE) + MinedAway() if(EXPLODE_HEAVY) if(prob(90)) - gets_drilled(null, FALSE) + MinedAway() if(EXPLODE_LIGHT) if(prob(75)) - gets_drilled(null, FALSE) + MinedAway() return /turf/closed/mineral/blob_act(obj/structure/blob/B) if(prob(50)) - gets_drilled(give_exp = FALSE) + MinedAway() /turf/closed/mineral/random - 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) - //Currently, Adamantine won't spawn as it has no uses. -Durandan + var/list/mineralSpawnChanceList = list( + /datum/ore/uranium = 5, + /datum/ore/diamond = 1, + /datum/ore/gold = 10, + /datum/ore/silver = 12, + /datum/ore/plasma = 20, + /datum/ore/iron = 40, + /datum/ore/titanium = 11, + /datum/ore/bluespace_crystal = 1 + ) var/mineralChance = 13 /turf/closed/mineral/random/Initialize(mapload) @@ -208,148 +313,46 @@ T.levelupdate() else - Change_Ore(path, 1) - Spread_Vein(path) + change_ore(path, random = TRUE) + spread_vein(path) /turf/closed/mineral/random/high_chance icon_state = "rock_highchance" mineralChance = 25 mineralSpawnChanceList = list( - /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/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 20) - -/turf/closed/mineral/random/high_chance/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE - mineralSpawnChanceList = list( - /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/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 1) + /datum/ore/uranium = 35, /datum/ore/diamond = 30, /datum/ore/gold = 45, /datum/ore/titanium = 45, + /datum/ore/silver = 50, /datum/ore/plasma = 50, /datum/ore/bluespace_crystal = 20) /turf/closed/mineral/random/low_chance icon_state = "rock_lowchance" mineralChance = 6 mineralSpawnChanceList = list( - /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/plasma = 15, /obj/item/stack/ore/iron = 40, - /turf/closed/mineral/gibtonite = 2, /obj/item/stack/ore/bluespace_crystal = 1) + /datum/ore/uranium = 2, /datum/ore/diamond = 1, /datum/ore/gold = 4, /datum/ore/titanium = 4, + /datum/ore/silver = 6, /datum/ore/plasma = 15, /datum/ore/iron = 40, + /turf/closed/mineral/gibtonite = 2, /datum/ore/bluespace_crystal = 1) //extremely low chance of rare ores, meant mostly for populating stations with large amounts of asteroid /turf/closed/mineral/random/stationside icon_state = "rock_nochance" mineralChance = 4 mineralSpawnChanceList = list( - /obj/item/stack/ore/uranium = 1, /obj/item/stack/ore/diamond = 1, /obj/item/stack/ore/gold = 3, /obj/item/stack/ore/titanium = 5, - /obj/item/stack/ore/silver = 4, /obj/item/stack/ore/plasma = 3, /obj/item/stack/ore/iron = 50) - -/turf/closed/mineral/random/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE - - mineralChance = 10 - mineralSpawnChanceList = list( - /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/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/snow - name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi' - icon_state = "mountainrock" - base_icon_state = "mountain_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) - defer_change = TRUE - turf_type = /turf/open/misc/asteroid/snow/icemoon - baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - weak_turf = TRUE - -/turf/closed/mineral/random/snow/Change_Ore(ore_type, random = 0) - . = ..() - if(mineralType) - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' - icon = 'icons/turf/walls/legacy/icerock_wall.dmi' - icon_state = "icerock_wall-0" - base_icon_state = "icerock_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - -/turf/closed/mineral/random/snow - mineralSpawnChanceList = list( - /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/plasma = 20, /obj/item/stack/ore/iron = 40, - /turf/closed/mineral/gibtonite/ice/icemoon = 4, /obj/item/stack/ore/bluespace_crystal = 1) - -/turf/closed/mineral/random/snow/underground - baseturfs = /turf/open/misc/asteroid/snow/icemoon - // abundant ore - mineralChance = 20 - mineralSpawnChanceList = list( - /obj/item/stack/ore/uranium = 10, /obj/item/stack/ore/diamond = 4, /obj/item/stack/ore/gold = 20, /obj/item/stack/ore/titanium = 22, - /obj/item/stack/ore/silver = 24, /obj/item/stack/ore/plasma = 20, /obj/item/stack/ore/iron = 20, /obj/item/stack/ore/bananium = 1, - /turf/closed/mineral/gibtonite/ice/icemoon = 8, /obj/item/stack/ore/bluespace_crystal = 2) - -/turf/closed/mineral/random/snow/high_chance - mineralSpawnChanceList = list( - /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/plasma = 50, /obj/item/stack/ore/bluespace_crystal = 20) + /datum/ore/uranium = 1, /datum/ore/diamond = 1, /datum/ore/gold = 3, /datum/ore/titanium = 5, + /datum/ore/silver = 4, /datum/ore/plasma = 3, /datum/ore/iron = 50) /turf/closed/mineral/random/labormineral icon_state = "rock_labor" mineralSpawnChanceList = list( - /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/plasma = 30, /obj/item/stack/ore/iron = 95, + /datum/ore/uranium = 3, /datum/ore/diamond = 1, /datum/ore/gold = 8, /datum/ore/titanium = 8, + /datum/ore/silver = 20, /datum/ore/plasma = 30, /datum/ore/iron = 95, /turf/closed/mineral/gibtonite = 2) -/turf/closed/mineral/random/labormineral/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE - mineralSpawnChanceList = list( - /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/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/random/labormineral/ice - name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi' - icon_state = "mountainrock" - base_icon_state = "mountain_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) - defer_change = TRUE - turf_type = /turf/open/misc/asteroid/snow/icemoon - baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - defer_change = TRUE - mineralSpawnChanceList = list( - /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/plasma = 30, /obj/item/stack/ore/bluespace_crystal = 1, /turf/closed/mineral/gibtonite/volcanic = 2, - /obj/item/stack/ore/iron = 95) - -/turf/closed/mineral/random/labormineral/ice/Change_Ore(ore_type, random = 0) - . = ..() - if(mineralType) - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' - icon = 'icons/turf/walls/legacy/icerock_wall.dmi' - icon_state = "icerock_wall-0" - base_icon_state = "icerock_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - /turf/closed/mineral/iron - mineralType = /obj/item/stack/ore/iron - scan_state = "rock_Iron" + mineralType = /datum/ore/iron /turf/closed/mineral/iron/ice icon_state = "icerock_iron" - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi') base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice @@ -358,16 +361,14 @@ defer_change = TRUE /turf/closed/mineral/uranium - mineralType = /obj/item/stack/ore/uranium - scan_state = "rock_Uranium" + mineralType = /datum/ore/uranium /turf/closed/mineral/diamond - mineralType = /obj/item/stack/ore/diamond - scan_state = "rock_Diamond" + mineralType = /datum/ore/diamond /turf/closed/mineral/diamond/ice icon_state = "icerock_iron" - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi') base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice @@ -376,35 +377,20 @@ defer_change = TRUE /turf/closed/mineral/gold - mineralType = /obj/item/stack/ore/gold - scan_state = "rock_Gold" - -/turf/closed/mineral/gold/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE + mineralType = /datum/ore/gold /turf/closed/mineral/silver - mineralType = /obj/item/stack/ore/silver - scan_state = "rock_Silver" - -/turf/closed/mineral/silver/ice/icemoon - turf_type = /turf/open/misc/asteroid/snow/ice/icemoon - baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS + mineralType = /datum/ore/silver /turf/closed/mineral/titanium - mineralType = /obj/item/stack/ore/titanium - scan_state = "rock_Titanium" + mineralType = /datum/ore/titanium /turf/closed/mineral/plasma - mineralType = /obj/item/stack/ore/plasma - scan_state = "rock_Plasma" + mineralType = /datum/ore/plasma /turf/closed/mineral/plasma/ice icon_state = "icerock_plasma" - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi') base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice @@ -413,39 +399,25 @@ defer_change = TRUE /turf/closed/mineral/bananium - mineralType = /obj/item/stack/ore/bananium + mineralType = /datum/ore/bananium mineralAmt = 3 - scan_state = "rock_Bananium" /turf/closed/mineral/bscrystal - mineralType = /obj/item/stack/ore/bluespace_crystal + mineralType = /datum/ore/bluespace_crystal mineralAmt = 1 - scan_state = "rock_BScrystal" - -/turf/closed/mineral/bscrystal/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE /turf/closed/mineral/volcanic turf_type = /turf/open/misc/asteroid/basalt baseturfs = /turf/open/misc/asteroid/basalt - initial_gas = LAVALAND_DEFAULT_ATMOS - -/turf/closed/mineral/volcanic/lava_land_surface - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - defer_change = TRUE + initial_gas = OPENTURF_LOW_PRESSURE /turf/closed/mineral/ash_rock //wall piece name = "rock" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/rock_wall.dmi', 'icons/turf/mining.dmi') icon_state = "rock2" base_icon_state = "rock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS baseturfs = /turf/open/misc/ashplanet/wateryrock initial_gas = OPENTURF_LOW_PRESSURE turf_type = /turf/open/misc/ashplanet/rocky @@ -453,50 +425,40 @@ /turf/closed/mineral/snowmountain name = "snowy mountainside" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/mountain_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/mountain_wall.dmi', 'icons/turf/mining.dmi') icon_state = "mountainrock" base_icon_state = "mountain_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - canSmoothWith = list(SMOOTH_GROUP_CLOSED_TURFS) + canSmoothWith = SMOOTH_GROUP_CLOSED_TURFS baseturfs = /turf/open/misc/asteroid/snow temperature = 180 turf_type = /turf/open/misc/asteroid/snow defer_change = TRUE -/turf/closed/mineral/snowmountain/icemoon - turf_type = /turf/open/misc/asteroid/snow/icemoon - baseturfs = /turf/open/misc/asteroid/snow/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - /turf/closed/mineral/snowmountain/cavern name = "ice cavern rock" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi') icon_state = "icerock" base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER baseturfs = /turf/open/misc/asteroid/snow/ice turf_type = /turf/open/misc/asteroid/snow/ice -/turf/closed/mineral/snowmountain/cavern/icemoon - baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - turf_type = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - //yoo RED ROCK RED ROCK /turf/closed/mineral/asteroid name = "iron rock" - icon = 'icons/turf/mining.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/red_wall.dmi', 'icons/turf/mining.dmi') icon_state = "redrock" - smooth_icon = 'icons/turf/walls/legacy/red_wall.dmi' base_icon_state = "red_wall" +/// Breaks down to an asteroid floor that breaks down to space +/turf/closed/mineral/asteroid/tospace + baseturfs = /turf/open/misc/asteroid/airless/tospace + /turf/closed/mineral/random/stationside/asteroid name = "iron rock" - icon = 'icons/turf/mining.dmi' - smooth_icon = 'icons/turf/walls/legacy/red_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/red_wall.dmi', 'icons/turf/mining.dmi') base_icon_state = "red_wall" /turf/closed/mineral/random/stationside/asteroid/porus @@ -513,7 +475,6 @@ /turf/closed/mineral/gibtonite mineralAmt = 1 - 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 var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes @@ -573,7 +534,7 @@ det_time = 0 visible_message(span_notice("The chain reaction stopped! The gibtonite had [det_time] reactions left till the explosion!")) -/turf/closed/mineral/gibtonite/gets_drilled(mob/user, give_exp = FALSE, triggered_by_explosion = FALSE) +/turf/closed/mineral/gibtonite/MinedAway(mob/user, give_exp = FALSE, triggered_by_explosion = FALSE) if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,TRUE) explosive_reaction(user, triggered_by_explosion) @@ -601,15 +562,9 @@ addtimer(CALLBACK(src, PROC_REF(AfterChange), flags, old_type), 1, TIMER_UNIQUE) //mined.update_visuals() -/turf/closed/mineral/gibtonite/volcanic - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = TRUE - /turf/closed/mineral/gibtonite/ice icon_state = "icerock_Gibtonite" - smooth_icon = 'icons/turf/walls/legacy/icerock_wall.dmi' + icon = MAP_SWITCH('icons/turf/walls/legacy/icerock_wall.dmi', 'icons/turf/mining.dmi') base_icon_state = "icerock_wall" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER turf_type = /turf/open/misc/asteroid/snow/ice @@ -617,61 +572,4 @@ temperature = 180 defer_change = TRUE -/turf/closed/mineral/gibtonite/ice/icemoon - turf_type = /turf/open/misc/asteroid/snow/ice/icemoon - baseturfs = /turf/open/misc/asteroid/snow/ice/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - -/turf/closed/mineral/strong - name = "Very strong rock" - desc = "Seems to be stronger than the other rocks in the area. Only a master of mining techniques could destroy this." - turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - defer_change = 1 - smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi' - base_icon_state = "rock_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - -/turf/closed/mineral/strong/attackby(obj/item/I, mob/user, params) - if(!ishuman(user)) - to_chat(usr, span_warning("Only a more advanced species could break a rock such as this one!")) - return FALSE - if(user.mind?.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER) - . = ..() - else - to_chat(usr, span_warning("The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner.")) - - -/turf/closed/mineral/strong/gets_drilled(mob/user, give_exp = FALSE) - if(!ishuman(user)) - return // see attackby - var/mob/living/carbon/human/H = user - if(!(H.mind?.get_skill_level(/datum/skill/mining) >= SKILL_LEVEL_MASTER)) - return - drop_ores() - H.client.give_award(/datum/award/achievement/skill/legendary_miner, H) - var/flags = NONE - var/old_type = type - if(defer_change) // TODO: make the defer change var a var for any changeturf flag - flags = CHANGETURF_DEFER_CHANGE - ScrapeAway(null, flags) - SSzas.mark_for_update(src) - addtimer(CALLBACK(src, PROC_REF(AfterChange), flags, old_type), 1, TIMER_UNIQUE) - playsound(src, 'sound/effects/break_stone.ogg', 50, TRUE) //beautiful destruction - //mined.update_visuals() - H.mind?.adjust_experience(/datum/skill/mining, 100) //yay! - -/turf/closed/mineral/strong/proc/drop_ores() - if(prob(10)) - new /obj/item/stack/sheet/mineral/mythril(src, 5) - else - new /obj/item/stack/sheet/mineral/adamantine(src, 5) - -/turf/closed/mineral/strong/acid_melt() - return - -/turf/closed/mineral/strong/ex_act(severity, target) - return FALSE - #undef MINING_MESSAGE_COOLDOWN diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 154e29f3cebc..d211089d79b0 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -45,7 +45,6 @@ color = "#B77D31" //To display in mapping softwares /turf/closed/wall/mineral/uranium - article = "a" name = "uranium wall" desc = "A wall with uranium plating. This is probably a bad idea." plating_material = /datum/material/uranium @@ -77,7 +76,7 @@ radiate() ..() -/turf/closed/wall/mineral/uranium/Bumped(atom/movable/AM) +/turf/closed/wall/mineral/uranium/BumpedBy(atom/movable/AM) radiate() ..() @@ -152,8 +151,8 @@ explosion_block = 3 flags_1 = CAN_BE_DIRTY_1 flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD - smoothing_groups = list(SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS, SMOOTH_GROUP_SHUTTLE_PARTS) + smoothing_groups = SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS plating_material = /datum/material/titanium color = "#b3c0c7" //To display in mapping softwares @@ -171,7 +170,7 @@ /turf/closed/wall/mineral/titanium/survival name = "pod wall" desc = "An easily-compressable wall used for temporary shelter." - canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TITANIUM_POD, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTLE_PARTS) + canSmoothWith = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS color = "#242424" //To display in mapping softwares wall_paint = "#242424" stripe_paint = "#824621" @@ -179,8 +178,8 @@ /turf/closed/wall/mineral/titanium/survival/nodiagonal /turf/closed/wall/mineral/titanium/survival/pod - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_SURVIVAL_TITANIUM_POD) - canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TITANIUM_POD) + smoothing_groups = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD + SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_SURVIVAL_TITANIUM_WALLS + canSmoothWith = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD /////////////////////Plastitanium walls///////////////////// @@ -189,8 +188,8 @@ desc = "A durable wall made of an alloy of plasma and titanium." icon = 'icons/turf/walls/metal_wall.dmi' explosion_block = 4 - smoothing_groups = list(SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WALLS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS plating_material = /datum/material/alloy/plastitanium color = "#3a313a" //To display in mapping softwares diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index 4d1f430736ed..865c05f2bebe 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -16,11 +16,11 @@ . = ..() if(istype(gone, /mob/living/simple_animal/hostile/construct/harvester)) //harvesters can go through cult walls, dragging something with var/mob/living/simple_animal/hostile/construct/harvester/H = gone - var/atom/movable/stored_pulling = H.pulling + var/atom/movable/stored_pulling = H.get_active_grab() if(stored_pulling) stored_pulling.setDir(direction) stored_pulling.forceMove(src) - H.start_pulling(stored_pulling, supress_message = TRUE) + H.try_make_grab(stored_pulling) /turf/closed/wall/mineral/cult/artificer name = "runed stone wall" @@ -97,6 +97,7 @@ name = "reinforced rock" desc = "It has metal struts that need to be welded away before it can be mined." icon = 'icons/turf/walls/legacy/reinforced_rock.dmi' + stripe_icon = null icon_state = "porous_rock-0" base_icon_state = "porous_rock" turf_flags = NO_RUST diff --git a/code/game/turfs/closed/wall/prepainted_walls.dm b/code/game/turfs/closed/wall/prepainted_walls.dm index b07935c859a8..7aecc629904e 100644 --- a/code/game/turfs/closed/wall/prepainted_walls.dm +++ b/code/game/turfs/closed/wall/prepainted_walls.dm @@ -11,23 +11,23 @@ W.wall_paint = _color if(wall_trim) W.stripe_paint = _color - W.update_greyscale() - W.update_overlays() + W.update_appearance() for(var/obj/structure/low_wall/L in view(user)) if(wall_paint) L.wall_paint = _color if(wall_trim) L.stripe_paint = _color - L.update_greyscale() - L.update_overlays() + L.update_appearance() ///Dummy types for prepainted walls /turf/closed/wall/prepainted - name = "dummy" + name = "Pre-Painted Wall" /turf/closed/wall/r_wall/prepainted - name = "dummy" + name = "PRe-Painted Reinforced Wall" + +//Daedalus/"Standard" walls /turf/closed/wall/prepainted/daedalus color = PAINT_WALL_DAEDALUS @@ -39,3 +39,23 @@ wall_paint = PAINT_WALL_DAEDALUS stripe_paint = PAINT_STRIPE_DAEDALUS +/turf/closed/wall/prepainted/medical + color = PAINT_WALL_MEDICAL + wall_paint = PAINT_WALL_MEDICAL + stripe_paint = PAINT_STRIPE_MEDICAL + + +/turf/closed/wall/r_wall/prepainted/medical + color = PAINT_WALL_MEDICAL + wall_paint = PAINT_WALL_MEDICAL + stripe_paint = PAINT_STRIPE_MEDICAL + +/turf/closed/wall/prepainted/bridge + color = PAINT_WALL_COMMAND + wall_paint = PAINT_WALL_COMMAND + stripe_paint = PAINT_STRIPE_COMMAND + +/turf/closed/wall/r_wall/prepainted/bridge + color = PAINT_WALL_COMMAND + wall_paint = PAINT_WALL_COMMAND + stripe_paint = PAINT_STRIPE_COMMAND diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index d87478afeee2..5c54b7d8bfb2 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -7,9 +7,16 @@ hardness = 10 reinf_material = /datum/material/iron plating_material = /datum/material/alloy/plasteel - explosion_block = 2 + explosion_block = 6 rad_insulation = RAD_HEAVY_INSULATION +// DMEd Specific Simplified wall icons +#if defined(SIMPLE_MAPHELPERS) +/turf/closed/wall/r_wall + icon='icons/effects/simplified_wall_helpers.dmi' + icon_state="r_generic" +#endif + /turf/closed/wall/r_wall/syndicate name = "hull" desc = "The armored hull of an ominous looking ship." diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 8108f469a951..2b45a5214a12 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -20,15 +20,15 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() icon_state = "wall-0" base_icon_state = "wall" - explosion_block = 1 + explosion_block = 3 blocks_air = AIR_BLOCKED baseturfs = /turf/open/floor/plating flags_ricochet = RICOCHET_HARD smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LOW_WALL, SMOOTH_GROUP_AIRLOCK, SMOOTH_GROUP_SHUTTERS_BLASTDOORS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_SHUTTERS_BLASTDOORS + SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_LOW_WALL + SMOOTH_GROUP_WINDOW_FULLTILE + SMOOTH_GROUP_WALLS lighting_uses_jen = TRUE heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall @@ -47,9 +47,7 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() //These are set by the material, do not touch!!! var/material_color - var/shiny_wall - var/shiny_stripe var/stripe_icon //Ok you can touch vars again :) @@ -72,6 +70,13 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() ///Appearance cache key. This is very touchy. VAR_PRIVATE/cache_key +// DMEd Specific Simplified wall icons +#if defined(SIMPLE_MAPHELPERS) +/turf/closed/wall + icon='icons/effects/simplified_wall_helpers.dmi' + icon_state="generic" +#endif + /turf/closed/wall/has_material_type(datum/material/mat_type, exact=FALSE, mat_amount=0) if(plating_material == mat_type) return TRUE @@ -90,13 +95,6 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() color = null // Remove the color that was set for mapping clarity . = ..() set_materials(plating_material, reinf_material, FALSE) - 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/copyTurf(turf/T) . = ..() @@ -113,7 +111,9 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() var/neighbor_stripe = NONE for (var/cardinal = NORTH; cardinal <= WEST; cardinal *= 2) //No list copy please good sir var/turf/step_turf = get_step(src, cardinal) - if(!can_area_smooth(step_turf)) + var/can_area_smooth + CAN_AREAS_SMOOTH(src, step_turf, can_area_smooth) + if(isnull(can_area_smooth)) continue for(var/atom/movable/movable_thing as anything in step_turf) if(global.neighbor_typecache[movable_thing.type]) @@ -121,7 +121,7 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() break var/old_cache_key = cache_key - cache_key = "[icon]:[smoothing_junction]:[plating_color]:[stripe_icon]:[stripe_color]:[neighbor_stripe]:[shiny_wall]:[shiny_stripe]:[rusted]:[hard_decon && d_state]" + cache_key = "[icon]:[smoothing_junction]:[plating_color]:[stripe_icon]:[stripe_color]:[neighbor_stripe]:[rusted]:[hard_decon && d_state]" if(!(old_cache_key == cache_key)) var/potential_overlays = global.wall_overlays_cache[cache_key] @@ -134,30 +134,17 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() overlays.len = 0 var/list/new_overlays = list() - if(shiny_wall) - var/image/shine = image(icon, "shine-[smoothing_junction]") - shine.appearance_flags = RESET_COLOR - new_overlays += shine - - var/image/smoothed_stripe = image(stripe_icon, icon_state) - smoothed_stripe.appearance_flags = RESET_COLOR - smoothed_stripe.color = stripe_color - new_overlays += smoothed_stripe - - if(shiny_stripe) - var/image/stripe_shine = image(stripe_icon, "shine-[smoothing_junction]") - stripe_shine.appearance_flags = RESET_COLOR - new_overlays += stripe_shine + if(stripe_icon) + var/image/smoothed_stripe = image(stripe_icon, icon_state) + smoothed_stripe.appearance_flags = RESET_COLOR + smoothed_stripe.color = stripe_color + new_overlays += smoothed_stripe if(neighbor_stripe) var/image/neighb_stripe_overlay = image('icons/turf/walls/neighbor_stripe.dmi', "stripe-[neighbor_stripe]") neighb_stripe_overlay.appearance_flags = RESET_COLOR neighb_stripe_overlay.color = stripe_color new_overlays += neighb_stripe_overlay - if(shiny_wall) - var/image/shine = image('icons/turf/walls/neighbor_stripe.dmi', "shine-[neighbor_stripe]") - shine.appearance_flags = RESET_COLOR - new_overlays += shine if(rusted) var/image/rust_overlay = image('icons/turf/rust_overlay.dmi', "blobby_rust") @@ -243,14 +230,12 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() if(reinf_mat_ref) icon = plating_mat_ref.reinforced_wall_icon - shiny_wall = plating_mat_ref.wall_shine & WALL_SHINE_REINFORCED - shiny_stripe = plating_mat_ref.wall_shine & WALL_SHINE_REINFORCED material_color = plating_mat_ref.wall_color + explosion_block = initial(explosion_block) + 2 else icon = plating_mat_ref.wall_icon - shiny_wall = plating_mat_ref.wall_shine & WALL_SHINE_PLATING - shiny_stripe = plating_mat_ref.wall_shine & WALL_SHINE_PLATING material_color = plating_mat_ref.wall_color + explosion_block = initial(explosion_block) stripe_icon = plating_mat_ref.wall_stripe_icon @@ -397,7 +382,6 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() user.changeNext_move(CLICK_CD_MELEE) to_chat(user, span_notice("You push the wall but nothing happens!")) playsound(src, 'sound/weapons/genhit.ogg', 25, TRUE) - add_fingerprint(user) /turf/closed/wall/attackby(obj/item/W, mob/user, params) user.changeNext_move(CLICK_CD_MELEE) @@ -409,7 +393,7 @@ GLOBAL_REAL_VAR(wall_overlays_cache) = list() if(!isturf(user.loc)) return //can't do this stuff whilst inside objects and such - add_fingerprint(user) + W.leave_evidence(user, src) var/turf/T = user.loc //get user's location for delay checks diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 67f0633383c5..df5b7f36b3cc 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -2,6 +2,7 @@ plane = FLOOR_PLANE initial_gas = OPENTURF_DEFAULT_ATMOS z_flags = Z_ATMOS_IN_UP|Z_ATMOS_OUT_UP + ///negative for faster, positive for slower var/slowdown = 0 var/footstep = null @@ -9,33 +10,6 @@ var/clawfootstep = null var/heavyfootstep = null - -//direction is direction of travel of A -/turf/open/zPassIn(atom/movable/A, direction, turf/source) - if(direction == DOWN) - for(var/obj/O in contents) - if(O.obj_flags & BLOCK_Z_IN_DOWN) - return FALSE - return TRUE - return FALSE - -//direction is direction of travel of A -/turf/open/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(direction == UP) - for(var/obj/O in contents) - if(O.obj_flags & BLOCK_Z_OUT_UP) - return FALSE - return TRUE - return FALSE - -//direction is direction of travel of air -/turf/open/zAirIn(direction, turf/source) - return (direction == DOWN) - -//direction is direction of travel of air -/turf/open/zAirOut(direction, turf/source) - return (direction == UP) - /turf/open/indestructible name = "floor" icon = 'icons/turf/floors.dmi' @@ -69,7 +43,7 @@ /turf/open/indestructible/permalube icon_state = "darkfull" -/turf/open/indestructible/permalube/ComponentInitialize() +/turf/open/indestructible/permalube/Initialize(mapload) . = ..() AddComponent(/datum/component/wet_floor, TURF_WET_LUBE, INFINITY, 0, INFINITY, TRUE) @@ -82,7 +56,7 @@ heavyfootstep = null var/sound = 'sound/effects/clownstep1.ogg' -/turf/open/indestructible/honk/ComponentInitialize() +/turf/open/indestructible/honk/Initialize(mapload) . = ..() AddComponent(/datum/component/wet_floor, TURF_WET_SUPERLUBE, INFINITY, 0, INFINITY, TRUE) @@ -91,49 +65,6 @@ if(ismob(arrived)) playsound(src, sound, 50, TRUE) -/turf/open/indestructible/necropolis - name = "necropolis floor" - desc = "It's regarding you suspiciously." - icon = 'icons/turf/floors.dmi' - icon_state = "necro1" - baseturfs = /turf/open/indestructible/necropolis - initial_gas = LAVALAND_DEFAULT_ATMOS - footstep = FOOTSTEP_LAVA - barefootstep = FOOTSTEP_LAVA - clawfootstep = FOOTSTEP_LAVA - heavyfootstep = FOOTSTEP_LAVA - tiled_dirt = FALSE - -/turf/open/indestructible/necropolis/Initialize(mapload) - . = ..() - if(prob(12)) - icon_state = "necro[rand(2,3)]" - -/turf/open/indestructible/necropolis/air - initial_gas = OPENTURF_DEFAULT_ATMOS - -/turf/open/indestructible/boss //you put stone tiles on this and use it as a base - name = "necropolis floor" - icon = 'icons/turf/boss_floors.dmi' - icon_state = "boss" - baseturfs = /turf/open/indestructible/boss - initial_gas = LAVALAND_DEFAULT_ATMOS - -/turf/open/indestructible/boss/air - initial_gas = OPENTURF_DEFAULT_ATMOS - -/turf/open/indestructible/hierophant - icon = 'icons/turf/floors/hierophant_floor.dmi' - initial_gas = LAVALAND_DEFAULT_ATMOS - baseturfs = /turf/open/indestructible/hierophant - smoothing_flags = SMOOTH_CORNERS - tiled_dirt = FALSE - -/turf/open/indestructible/hierophant/two - -/turf/open/indestructible/hierophant/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - return FALSE - /turf/open/indestructible/paper name = "notebook floor" desc = "A floor made of invulnerable notebook paper." @@ -237,7 +168,7 @@ else slipper.Knockdown(knockdown_amount) slipper.Paralyze(paralyze_amount) - slipper.stop_pulling() + slipper.release_all_grabs() if(buckled_obj) buckled_obj.unbuckle_mob(slipper) @@ -307,3 +238,25 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, TRUE) to_chat(user, span_notice("You build a floor.")) PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + +/// Used primarily for heretic's temple. To be removed. +/turf/open/indestructible/necropolis + name = "necropolis floor" + desc = "It's regarding you suspiciously." + icon = 'icons/turf/floors.dmi' + icon_state = "necro1" + baseturfs = /turf/open/indestructible/necropolis + initial_gas = OPENTURF_LOW_PRESSURE + footstep = FOOTSTEP_LAVA + barefootstep = FOOTSTEP_LAVA + clawfootstep = FOOTSTEP_LAVA + heavyfootstep = FOOTSTEP_LAVA + tiled_dirt = FALSE + +/turf/open/indestructible/necropolis/Initialize(mapload) + . = ..() + if(prob(12)) + icon_state = "necro[rand(2,3)]" + +/turf/open/indestructible/necropolis/air + initial_gas = OPENTURF_DEFAULT_ATMOS diff --git a/code/game/turfs/open/ashplanet.dm b/code/game/turfs/open/ashplanet.dm index 2087bd322005..b471873e4959 100644 --- a/code/game/turfs/open/ashplanet.dm +++ b/code/game/turfs/open/ashplanet.dm @@ -7,7 +7,7 @@ smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER desc = "The ground is covered in volcanic ash." baseturfs = /turf/open/misc/ashplanet/wateryrock //I assume this will be a chasm eventually, once this becomes an actual surface - initial_gas = LAVALAND_DEFAULT_ATMOS + initial_gas = OPENTURF_LOW_PRESSURE footstep = FOOTSTEP_SAND barefootstep = FOOTSTEP_SAND @@ -33,8 +33,8 @@ return /turf/open/misc/ashplanet/ash - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH, SMOOTH_GROUP_CLOSED_TURFS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH + canSmoothWith = SMOOTH_GROUP_FLOOR_ASH + SMOOTH_GROUP_CLOSED_TURFS layer = HIGH_TURF_LAYER slowdown = 1 @@ -45,8 +45,8 @@ base_icon_state = "rocky_ash" smooth_icon = 'icons/turf/floors/rocky_ash.dmi' layer = MID_TURF_LAYER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ASH_ROCKY) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_ASH_ROCKY, SMOOTH_GROUP_CLOSED_TURFS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ASH_ROCKY + canSmoothWith = SMOOTH_GROUP_FLOOR_ASH_ROCKY + SMOOTH_GROUP_CLOSED_TURFS footstep = FOOTSTEP_FLOOR barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index cda0d308086e..f824c36439b2 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -16,6 +16,9 @@ simulated = TRUE //Kilostation + /// Set to TRUE to call ex_act parent + var/explodable = FALSE + /// Base turf type to be created by the tunnel var/turf_type = /turf/open/misc/asteroid /// Probability floor has a different icon state @@ -59,7 +62,9 @@ return /turf/open/misc/asteroid/ex_act(severity, target) - return + if(!explodable) + return + return ..() /turf/open/misc/asteroid/attackby(obj/item/W, mob/user, params) . = ..() @@ -86,10 +91,6 @@ for(var/obj/item/stack/ore/O in src) SEND_SIGNAL(W, COMSIG_PARENT_ATTACKBY, O) - -/turf/open/floor/plating/lavaland_baseturf - baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface - /turf/open/misc/asteroid/dug //When you want one of these to be already dug. dug = TRUE base_icon_state = "asteroid_dug" @@ -108,7 +109,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) digResult = /obj/item/stack/ore/glass/basalt broken_state = "basalt_dug" - initial_gas = LAVALAND_DEFAULT_ATMOS + initial_gas = OPENTURF_LOW_PRESSURE simulated = FALSE //OH *FUCK* NO. /turf/open/misc/asteroid/basalt/getDug() @@ -141,12 +142,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) if("basalt5", "basalt9") B.set_light(l_outer_range = 1.4, l_power = 0.6, l_color = LIGHT_COLOR_LAVA) //barely anything! -///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground. - -/turf/open/misc/asteroid/basalt/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - baseturfs = /turf/open/lava/smooth/lava_land_surface - /turf/open/misc/asteroid/lowpressure initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/misc/asteroid/lowpressure @@ -159,6 +154,12 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) baseturfs = /turf/open/misc/asteroid/airless turf_type = /turf/open/misc/asteroid/airless +/// Destroys down to zlevel baseturf +/turf/open/misc/asteroid/airless/tospace + explodable = TRUE + baseturfs = /turf/baseturf_bottom + turf_type = /turf/open/misc/asteroid/airless/tospace + /turf/open/misc/asteroid/snow gender = PLURAL name = "snow" @@ -173,7 +174,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) flags_1 = NONE simulated = FALSE - initial_gas = ICEMOON_DEFAULT_ATMOS + initial_gas = OPENTURF_LOW_PRESSURE bullet_sizzle = TRUE bullet_bounce_sound = null @@ -189,14 +190,6 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) return TRUE return FALSE -/turf/open/misc/asteroid/snow/icemoon - baseturfs = /turf/open/openspace/icemoon - slowdown = 0 - -/turf/open/lava/plasma/ice_moon - baseturfs = /turf/open/lava/plasma/ice_moon - initial_gas = ICEMOON_DEFAULT_ATMOS - /turf/open/misc/asteroid/snow/ice name = "icy snow" desc = "Looks colder." diff --git a/code/game/turfs/open/chasm.dm b/code/game/turfs/open/chasm.dm index 2ded17c4d4ce..fb65e99fbf05 100644 --- a/code/game/turfs/open/chasm.dm +++ b/code/game/turfs/open/chasm.dm @@ -7,8 +7,8 @@ icon_state = "chasms-255" base_icon_state = "chasms" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM) - canSmoothWith = list(SMOOTH_GROUP_TURF_CHASM) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM + canSmoothWith = SMOOTH_GROUP_TURF_CHASM density = TRUE //This will prevent hostile mobs from pathing into chasms, while the canpass override will still let it function like an open turf bullet_bounce_sound = null //abandon all hope ye who enter @@ -52,11 +52,6 @@ /turf/open/chasm/rust_heretic_act() return FALSE -/turf/open/chasm/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "basalt" - return TRUE - /turf/open/chasm/attackby(obj/item/C, mob/user, params, area/area_restriction) ..() if(istype(C, /obj/item/stack/rods)) @@ -75,27 +70,13 @@ else if(istype(C, /obj/item/stack/tile/iron)) build_with_floor_tiles(C, user) -// Chasms for Lavaland, with planetary atmos and lava glow /turf/open/chasm/lavaland - initial_gas = LAVALAND_DEFAULT_ATMOS - + initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/chasm/lavaland light_outer_range = 1.9 //slightly less range than lava light_power = 0.65 //less bright, too light_color = LIGHT_COLOR_LAVA //let's just say you're falling into lava, that makes sense right -// Chasms for Ice moon, with planetary atmos and glow -/turf/open/chasm/icemoon - icon = 'icons/turf/floors/icechasms.dmi' - icon_state = "icechasms-255" - base_icon_state = "icechasms" - initial_gas = ICEMOON_DEFAULT_ATMOS - - baseturfs = /turf/open/chasm/icemoon - light_outer_range = 1.9 - light_power = 0.65 - light_color = LIGHT_COLOR_PURPLE - // Chasms for the jungle, with planetary atmos and a different icon /turf/open/chasm/jungle icon = 'icons/turf/floors/junglechasm.dmi' @@ -104,8 +85,3 @@ initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/chasm/jungle - -/turf/open/chasm/jungle/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "dirt" - return TRUE diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 235ab7c5472b..cb137088b3d1 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -10,10 +10,9 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY flags_1 = NO_SCREENTIPS_1 - - turf_flags = CAN_BE_DIRTY_1 ///PARIAH EDIT - Overriden in modular_pariah\modules\decay_subsystem\code\decay_turf_handling.dm - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_OPEN_FLOOR) - canSmoothWith = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_OPEN_FLOOR) + turf_flags = CAN_BE_DIRTY_1 | IS_SOLID + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR + canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR heat_capacity = 10000 tiled_dirt = TRUE @@ -54,8 +53,6 @@ burnt = TRUE if(mapload && prob(33)) MakeDirty() - if(is_station_level(z)) - GLOB.station_turfs += src /turf/open/floor/proc/setup_broken_states() return list("damaged1", "damaged2", "damaged3", "damaged4", "damaged5") @@ -63,11 +60,6 @@ /turf/open/floor/proc/setup_burnt_states() return list("floorscorched1", "floorscorched2") -/turf/open/floor/Destroy() - if(is_station_level(z)) - GLOB.station_turfs -= src - return ..() - /turf/open/floor/update_overlays() . = ..() var/mutable_appearance/overlay @@ -105,8 +97,7 @@ switch(rand(1, 3)) if(1) if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) - ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - ReplaceWithLattice() + TryScrapeToLattice() else ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(prob(33)) @@ -126,6 +117,9 @@ src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) + if(prob(33) && istype(src, /turf/open/floor)) //ChangeTurf can change us into space during ScrapeAway() + shake_animation() + /turf/open/floor/is_shielded() for(var/obj/structure/A in contents) return 1 @@ -250,7 +244,7 @@ if(prob(70)) sheer = TRUE else if(prob(50) && (/turf/open/space in baseturfs)) - ReplaceWithLattice() + TryScrapeToLattice() if(sheer) if(has_tile()) remove_tile(null, TRUE, TRUE, TRUE) diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm deleted file mode 100644 index 47b56ee9fc28..000000000000 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ /dev/null @@ -1,100 +0,0 @@ -/** - * ## catwalk flooring - * - * They show what's underneath their catwalk flooring (pipes and the like) - * you can screwdriver it to interact with the underneath stuff without destroying the tile... - * unless you want to! - */ -/turf/open/floor/catwalk_floor //the base type, meant to look like a maintenance panel - icon = 'icons/turf/floors/catwalk_plating.dmi' - icon_state = "maint_above" - name = "catwalk floor" - desc = "Flooring that shows its contents underneath. Engineers love it!" - baseturfs = /turf/open/floor/plating - floor_tile = /obj/item/stack/tile/catwalk_tile - layer = CATWALK_LAYER - plane = GAME_PLANE - footstep = FOOTSTEP_CATWALK - overfloor_placed = TRUE - underfloor_accessibility = UNDERFLOOR_VISIBLE - var/covered = TRUE - var/catwalk_type = "maint" - var/static/list/catwalk_underlays = list() - -/turf/open/floor/catwalk_floor/Initialize(mapload) - . = ..() - if(!catwalk_underlays[catwalk_type]) - var/mutable_appearance/plating_underlay = mutable_appearance(icon, "[catwalk_type]_below", TURF_LAYER) - catwalk_underlays[catwalk_type] = plating_underlay - underlays += catwalk_underlays[catwalk_type] - update_appearance() - -/turf/open/floor/catwalk_floor/examine(mob/user) - . = ..() - - if(covered) - . += span_notice("You can unscrew it to reveal the contents beneath.") - else - . += span_notice("You can screw it to hide the contents beneath.") - . += span_notice("There's a small crack on the edge of it.") - -/turf/open/floor/catwalk_floor/screwdriver_act(mob/living/user, obj/item/tool) - . = ..() - covered = !covered - if(!covered) - underfloor_accessibility = UNDERFLOOR_INTERACTABLE - layer = TURF_LAYER - plane = FLOOR_PLANE - icon_state = "[catwalk_type]_below" - else - underfloor_accessibility = UNDERFLOOR_VISIBLE - layer = CATWALK_LAYER - plane = GAME_PLANE - icon_state = "[catwalk_type]_above" - user.balloon_alert(user, "[!covered ? "cover removed" : "cover added"]") - tool.play_tool_sound(src) - update_appearance() - -/turf/open/floor/catwalk_floor/crowbar_act(mob/user, obj/item/crowbar) - if(covered) - user.balloon_alert(user, "remove cover first!") - return FALSE - . = ..() - -//Reskins! More fitting with most of our tiles, and appear as a radial on the base type -/turf/open/floor/catwalk_floor/iron - name = "iron plated catwalk floor" - icon_state = "iron_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/iron - catwalk_type = "iron" - - -/turf/open/floor/catwalk_floor/iron_white - name = "white plated catwalk floor" - icon_state = "whiteiron_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/iron_white - catwalk_type = "whiteiron" - -/turf/open/floor/catwalk_floor/iron_dark - name = "dark plated catwalk floor" - icon_state = "darkiron_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/iron_dark - catwalk_type = "darkiron" - -/turf/open/floor/catwalk_floor/flat_white - name = "white large plated catwalk floor" - icon_state = "flatwhite_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/flat_white - catwalk_type = "flatwhite" - -/turf/open/floor/catwalk_floor/titanium - name = "titanium plated catwalk floor" - icon_state = "titanium_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/titanium - catwalk_type = "titanium" - -/turf/open/floor/catwalk_floor/iron_smooth //the original green type - name = "smooth plated catwalk floor" - icon_state = "smoothiron_above" - floor_tile = /obj/item/stack/tile/catwalk_tile/iron_smooth - catwalk_type = "smoothiron" diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index ab3d27168a44..b39c8b5db854 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -9,7 +9,9 @@ */ /turf/open/floor/wood - desc = "Stylish dark wood." + name = "wooden floor" + desc = "A welcoming wooden floor." + icon = 'icons/turf/wood.dmi' icon_state = "wood" floor_tile = /obj/item/stack/tile/wood broken_blend = BLEND_DEFAULT @@ -29,10 +31,6 @@ /turf/open/floor/wood/setup_burnt_states() return list("floorscorched1", "floorscorched2") -/turf/open/floor/wood/examine(mob/user) - . = ..() - . += span_notice("There's a few screws and a small crack visible.") - /turf/open/floor/wood/screwdriver_act(mob/living/user, obj/item/I) if(..()) return TRUE @@ -81,27 +79,6 @@ /turf/open/floor/wood/airless initial_gas = AIRLESS_ATMOS -/turf/open/floor/wood/tile - icon_state = "wood_tile" - floor_tile = /obj/item/stack/tile/wood/tile - -/turf/open/floor/wood/tile/setup_broken_states() - return list("wood_tile-broken", "wood_tile-broken2", "wood_tile-broken3") - -/turf/open/floor/wood/parquet - icon_state = "wood_parquet" - floor_tile = /obj/item/stack/tile/wood/parquet - -/turf/open/floor/wood/parquet/setup_broken_states() - return list("wood_parquet-broken", "wood_parquet-broken2", "wood_parquet-broken3", "wood_parquet-broken4", "wood_parquet-broken5", "wood_parquet-broken6", "wood_parquet-broken7") - -/turf/open/floor/wood/large - icon_state = "wood_large" - floor_tile = /obj/item/stack/tile/wood/large - -/turf/open/floor/wood/large/setup_broken_states() - return list("wood_large-broken", "wood_large-broken2", "wood_large-broken3") - /turf/open/floor/bamboo desc = "A bamboo mat with a decorative trim." icon = 'icons/turf/floors/bamboo_mat.dmi' @@ -110,8 +87,8 @@ floor_tile = /obj/item/stack/tile/bamboo broken_blend = BLEND_DEFAULT smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_BAMBOO_FLOOR) - canSmoothWith = list(SMOOTH_GROUP_BAMBOO_FLOOR) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_BAMBOO_FLOOR + canSmoothWith = SMOOTH_GROUP_BAMBOO_FLOOR flags_1 = NONE footstep = FOOTSTEP_WOOD barefootstep = FOOTSTEP_WOOD_BAREFOOT @@ -224,8 +201,8 @@ base_icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET) - canSmoothWith = list(SMOOTH_GROUP_CARPET) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET flags_1 = NONE bullet_bounce_sound = null footstep = FOOTSTEP_CARPET @@ -234,10 +211,6 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY tiled_dirt = FALSE -/turf/open/floor/carpet/examine(mob/user) - . = ..() - . += span_notice("There's a small crack on the edge of it.") - /turf/open/floor/carpet/Initialize(mapload) . = ..() update_appearance() @@ -247,12 +220,10 @@ if(!. || !(updates & UPDATE_SMOOTHING)) return if(!broken && !burnt) - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH(src) + QUEUE_SMOOTH(src) else make_plating() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) + QUEUE_SMOOTH_NEIGHBORS(src) /turf/open/floor/carpet/lone icon_state = "carpetsymbol" @@ -268,72 +239,72 @@ icon_state = "carpet_black-255" base_icon_state = "carpet_black" floor_tile = /obj/item/stack/tile/carpet/black - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLACK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_BLACK) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_BLACK /turf/open/floor/carpet/blue icon = 'icons/turf/floors/carpet_blue.dmi' icon_state = "carpet_blue-255" base_icon_state = "carpet_blue" floor_tile = /obj/item/stack/tile/carpet/blue - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_BLUE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_BLUE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_BLUE /turf/open/floor/carpet/cyan icon = 'icons/turf/floors/carpet_cyan.dmi' icon_state = "carpet_cyan-255" base_icon_state = "carpet_cyan" floor_tile = /obj/item/stack/tile/carpet/cyan - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_CYAN) - canSmoothWith = list(SMOOTH_GROUP_CARPET_CYAN) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_CYAN + canSmoothWith = SMOOTH_GROUP_CARPET_CYAN /turf/open/floor/carpet/green icon = 'icons/turf/floors/carpet_green.dmi' icon_state = "carpet_green-255" base_icon_state = "carpet_green" floor_tile = /obj/item/stack/tile/carpet/green - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_GREEN) - canSmoothWith = list(SMOOTH_GROUP_CARPET_GREEN) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_GREEN /turf/open/floor/carpet/orange icon = 'icons/turf/floors/carpet_orange.dmi' icon_state = "carpet_orange-255" base_icon_state = "carpet_orange" floor_tile = /obj/item/stack/tile/carpet/orange - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ORANGE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_ORANGE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ORANGE + canSmoothWith = SMOOTH_GROUP_CARPET_ORANGE /turf/open/floor/carpet/purple icon = 'icons/turf/floors/carpet_purple.dmi' icon_state = "carpet_purple-255" base_icon_state = "carpet_purple" floor_tile = /obj/item/stack/tile/carpet/purple - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_PURPLE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_PURPLE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_PURPLE /turf/open/floor/carpet/red icon = 'icons/turf/floors/carpet_red.dmi' icon_state = "carpet_red-255" base_icon_state = "carpet_red" floor_tile = /obj/item/stack/tile/carpet/red - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_RED) - canSmoothWith = list(SMOOTH_GROUP_CARPET_RED) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_RED + canSmoothWith = SMOOTH_GROUP_CARPET_RED /turf/open/floor/carpet/royalblack icon = 'icons/turf/floors/carpet_royalblack.dmi' icon_state = "carpet_royalblack-255" base_icon_state = "carpet_royalblack" floor_tile = /obj/item/stack/tile/carpet/royalblack - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLACK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLACK) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLACK /turf/open/floor/carpet/royalblue icon = 'icons/turf/floors/carpet_royalblue.dmi' icon_state = "carpet_royalblue-255" base_icon_state = "carpet_royalblue" floor_tile = /obj/item/stack/tile/carpet/royalblue - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_ROYAL_BLUE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_ROYAL_BLUE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_ROYAL_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_ROYAL_BLUE /turf/open/floor/carpet/executive name = "executive carpet" @@ -341,8 +312,8 @@ icon_state = "executive_carpet-255" base_icon_state = "executive_carpet" floor_tile = /obj/item/stack/tile/carpet/executive - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_EXECUTIVE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_EXECUTIVE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_EXECUTIVE + canSmoothWith = SMOOTH_GROUP_CARPET_EXECUTIVE /turf/open/floor/carpet/stellar name = "stellar carpet" @@ -350,8 +321,8 @@ icon_state = "stellar_carpet-255" base_icon_state = "stellar_carpet" floor_tile = /obj/item/stack/tile/carpet/stellar - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_STELLAR) - canSmoothWith = list(SMOOTH_GROUP_CARPET_STELLAR) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_STELLAR + canSmoothWith = SMOOTH_GROUP_CARPET_STELLAR /turf/open/floor/carpet/donk name = "Donk Co. carpet" @@ -359,8 +330,8 @@ icon_state = "donk_carpet-255" base_icon_state = "donk_carpet" floor_tile = /obj/item/stack/tile/carpet/donk - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_DONK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_DONK) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_DONK + canSmoothWith = SMOOTH_GROUP_CARPET_DONK //*****Airless versions of all of the above.***** /turf/open/floor/carpet/airless @@ -410,9 +381,6 @@ burnt = TRUE update_appearance() -/turf/open/floor/carpet/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - return FALSE - /// An emissive turf used to test emissive turfs. /turf/open/floor/emissive_test name = "emissive test floor" @@ -434,8 +402,8 @@ icon = 'icons/turf/floors/carpet_black.dmi' icon_state = "carpet_black-255" base_icon_state = "carpet_black" - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_NEON) - canSmoothWith = list(SMOOTH_GROUP_CARPET_NEON) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_NEON + canSmoothWith = SMOOTH_GROUP_CARPET_NEON smoothing_junction = 255 /// The icon used for the neon decal. @@ -449,8 +417,8 @@ /turf/open/floor/carpet/neon/Initialize(mapload) . = ..() - AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, null, null, alpha, neon_color, smoothing_junction) - AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, EMISSIVE_PLANE, null, emissive_alpha, EMISSIVE_COLOR, smoothing_junction) + AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, null, FLOAT_LAYER, alpha, neon_color, smoothing_junction) + AddElement(/datum/element/decal, neon_icon || icon, neon_icon_state || base_icon_state, dir, EMISSIVE_PLANE, FLOAT_LAYER, emissive_alpha, EMISSIVE_COLOR, smoothing_junction) /turf/open/floor/carpet/neon/simple name = "simple neon carpet" @@ -459,32 +427,32 @@ base_icon_state = "base" neon_icon_state = "light" floor_tile = /obj/item/stack/tile/carpet/neon/simple - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON /turf/open/floor/carpet/neon/simple/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_NODOTS /turf/open/floor/carpet/neon/simple/white name = "simple white neon carpet" desc = "A rubbery mat with a inset pattern of white phosphorescent dye." neon_color = COLOR_WHITE floor_tile = /obj/item/stack/tile/carpet/neon/simple/white - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE /turf/open/floor/carpet/neon/simple/white/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/white/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_WHITE_NODOTS /turf/open/floor/carpet/neon/simple/black name = "simple black neon carpet" @@ -492,8 +460,8 @@ neon_icon_state = "glow" // This one also lights up the edges of the lines. neon_color = COLOR_BLACK floor_tile = /obj/item/stack/tile/carpet/neon/simple/black - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK /turf/open/floor/carpet/neon/simple/black/nodots icon_state = "base-nodots-255" @@ -501,184 +469,184 @@ neon_icon_state = "glow-nodots" neon_color = COLOR_BLACK floor_tile = /obj/item/stack/tile/carpet/neon/simple/black/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLACK_NODOTS /turf/open/floor/carpet/neon/simple/red name = "simple red neon carpet" desc = "A rubbery mat with a inset pattern of red phosphorescent dye." neon_color = COLOR_RED floor_tile = /obj/item/stack/tile/carpet/neon/simple/red - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED /turf/open/floor/carpet/neon/simple/red/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/red/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_RED_NODOTS /turf/open/floor/carpet/neon/simple/orange name = "simple orange neon carpet" desc = "A rubbery mat with a inset pattern of orange phosphorescent dye." neon_color = COLOR_ORANGE floor_tile = /obj/item/stack/tile/carpet/neon/simple/orange - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE /turf/open/floor/carpet/neon/simple/orange/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/orange/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_ORANGE_NODOTS /turf/open/floor/carpet/neon/simple/yellow name = "simple yellow neon carpet" desc = "A rubbery mat with a inset pattern of yellow phosphorescent dye." neon_color = COLOR_YELLOW floor_tile = /obj/item/stack/tile/carpet/neon/simple/yellow - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW /turf/open/floor/carpet/neon/simple/yellow/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/yellow/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_YELLOW_NODOTS /turf/open/floor/carpet/neon/simple/lime name = "simple lime neon carpet" desc = "A rubbery mat with a inset pattern of lime phosphorescent dye." neon_color = COLOR_LIME floor_tile = /obj/item/stack/tile/carpet/neon/simple/lime - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME /turf/open/floor/carpet/neon/simple/lime/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/lime/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_LIME_NODOTS /turf/open/floor/carpet/neon/simple/green name = "simple green neon carpet" desc = "A rubbery mat with a inset pattern of green phosphorescent dye." neon_color = COLOR_GREEN floor_tile = /obj/item/stack/tile/carpet/neon/simple/green - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN /turf/open/floor/carpet/neon/simple/green/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/green/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_GREEN_NODOTS /turf/open/floor/carpet/neon/simple/teal name = "simple teal neon carpet" desc = "A rubbery mat with a inset pattern of teal phosphorescent dye." neon_color = COLOR_TEAL floor_tile = /obj/item/stack/tile/carpet/neon/simple/teal - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL /turf/open/floor/carpet/neon/simple/teal/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/teal/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_TEAL_NODOTS /turf/open/floor/carpet/neon/simple/cyan name = "simple cyan neon carpet" desc = "A rubbery mat with a inset pattern of cyan phosphorescent dye." neon_color = COLOR_CYAN floor_tile = /obj/item/stack/tile/carpet/neon/simple/cyan - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN /turf/open/floor/carpet/neon/simple/cyan/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/cyan/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_CYAN_NODOTS /turf/open/floor/carpet/neon/simple/blue name = "simple blue neon carpet" desc = "A rubbery mat with a inset pattern of blue phosphorescent dye." neon_color = COLOR_BLUE floor_tile = /obj/item/stack/tile/carpet/neon/simple/blue - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE /turf/open/floor/carpet/neon/simple/blue/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/blue/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_BLUE_NODOTS /turf/open/floor/carpet/neon/simple/purple name = "simple purple neon carpet" desc = "A rubbery mat with a inset pattern of purple phosphorescent dye." neon_color = COLOR_PURPLE floor_tile = /obj/item/stack/tile/carpet/neon/simple/purple - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE /turf/open/floor/carpet/neon/simple/purple/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/purple/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PURPLE_NODOTS /turf/open/floor/carpet/neon/simple/violet name = "simple violet neon carpet" desc = "A rubbery mat with a inset pattern of violet phosphorescent dye." neon_color = COLOR_VIOLET floor_tile = /obj/item/stack/tile/carpet/neon/simple/violet - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET /turf/open/floor/carpet/neon/simple/violet/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/violet/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_VIOLET_NODOTS /turf/open/floor/carpet/neon/simple/pink name = "simple pink neon carpet" desc = "A rubbery mat with a inset pattern of pink phosphorescent dye." neon_color = COLOR_LIGHT_PINK floor_tile = /obj/item/stack/tile/carpet/neon/simple/pink - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK /turf/open/floor/carpet/neon/simple/pink/nodots icon_state = "base-nodots-255" base_icon_state = "base-nodots" neon_icon_state = "light-nodots" floor_tile = /obj/item/stack/tile/carpet/neon/simple/pink/nodots - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS) - canSmoothWith = list(SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS + canSmoothWith = SMOOTH_GROUP_CARPET_SIMPLE_NEON_PINK_NODOTS /turf/open/floor/carpet/neon/airless initial_gas = AIRLESS_ATMOS @@ -774,15 +742,10 @@ floor_tile = /obj/item/stack/tile/fakepit base_icon_state = "chasms" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_TURF_CHASM) - canSmoothWith = list(SMOOTH_GROUP_TURF_CHASM) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_TURF_CHASM + canSmoothWith = SMOOTH_GROUP_TURF_CHASM tiled_dirt = FALSE -/turf/open/floor/fakepit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "basalt" - return TRUE - /turf/open/floor/fakespace icon = 'icons/turf/space.dmi' icon_state = "0" @@ -792,10 +755,15 @@ /turf/open/floor/fakespace/Initialize(mapload) . = ..() - icon_state = SPACE_ICON_STATE(x, y, z) + appearance = global.space_appearances[(((x + y) ^ ~(x * y) + z) % 25) + 1] + layer = initial(layer) -/turf/open/floor/fakespace/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE(x, y, z) - underlay_appearance.plane = PLANE_SPACE - return TRUE +/turf/open/floor/mud + name = "mud" + desc = "A wet, muddy pool of dirt." + icon = 'icons/turf/floors.dmi' + icon_state = "dirt" + footstep = FOOTSTEP_MEAT //this is... probably the closest sounding to mud. + barefootstep = FOOTSTEP_MEAT + clawfootstep = FOOTSTEP_MEAT + heavyfootstep = FOOTSTEP_GENERIC_HEAVY diff --git a/code/game/turfs/open/floor/glass.dm b/code/game/turfs/open/floor/glass.dm index 7443314a9ac1..1bd64407a129 100644 --- a/code/game/turfs/open/floor/glass.dm +++ b/code/game/turfs/open/floor/glass.dm @@ -8,8 +8,8 @@ baseturfs = /turf/baseturf_bottom underfloor_accessibility = UNDERFLOOR_INTERACTABLE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS + canSmoothWith = SMOOTH_GROUP_FLOOR_TRANSPARENT_GLASS footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW @@ -40,12 +40,3 @@ icon_state = "reinf_glass-0" base_icon_state = "reinf_glass" floor_tile = /obj/item/stack/tile/rglass - -/turf/open/floor/glass/reinforced/icemoon - name = "reinforced glass floor" - desc = "Do jump on it, it can take it." - icon = 'icons/turf/floors/reinf_glass.dmi' - icon_state = "reinf_glass-0" - base_icon_state = "reinf_glass" - floor_tile = /obj/item/stack/tile/rglass - initial_gas = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/open/floor/iron_floor.dm b/code/game/turfs/open/floor/iron_floor.dm index ebf121e9804f..4a6b527346b0 100644 --- a/code/game/turfs/open/floor/iron_floor.dm +++ b/code/game/turfs/open/floor/iron_floor.dm @@ -1,4 +1,5 @@ /turf/open/floor/iron + desc = "A cold metallic floor." icon_state = "floor" broken_blend = BLEND_MULTIPLY burned_blend = BLEND_DEFAULT @@ -11,12 +12,6 @@ /turf/open/floor/iron/setup_burnt_states() return list("burned0", "burned1") - -/turf/open/floor/iron/examine(mob/user) - . = ..() - . += span_notice("There's a small crack on the edge of it.") - - /turf/open/floor/iron/rust_heretic_act() if(prob(70)) new /obj/effect/temp_visual/glowing_rune(src) @@ -39,10 +34,6 @@ initial_gas = TCOMMS_ATMOS temperature = 80 -/turf/open/floor/iron/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - temperature = 80 - /turf/open/floor/iron/textured icon_state = "textured" base_icon_state = "textured" diff --git a/code/game/turfs/open/floor/light_floor.dm b/code/game/turfs/open/floor/light_floor.dm index 23dc3e2a16fb..1bc7644330df 100644 --- a/code/game/turfs/open/floor/light_floor.dm +++ b/code/game/turfs/open/floor/light_floor.dm @@ -7,6 +7,7 @@ name = "light floor" desc = "A wired glass tile embedded into the floor. Modify the color with a Multitool." light_outer_range = 5 + light_power = 0.3 icon_state = "light_on-1" floor_tile = /obj/item/stack/tile/light broken_blend = BLEND_OVERLAY @@ -32,7 +33,7 @@ /turf/open/floor/light/examine(mob/user) . = ..() - . += span_notice("There's a small crack on the edge of it.") + . += span_notice("It looks like you could pry it up.") . += span_notice("Use a multitool on it to change colors.") . += span_notice("Use a screwdriver to turn it off or on.") if(state) ///check if broken diff --git a/code/game/turfs/open/floor/mineral_floor.dm b/code/game/turfs/open/floor/mineral_floor.dm index 366b230e1f74..99da76c817e5 100644 --- a/code/game/turfs/open/floor/mineral_floor.dm +++ b/code/game/turfs/open/floor/mineral_floor.dm @@ -226,7 +226,6 @@ //URANIUM /turf/open/floor/mineral/uranium - article = "a" name = "uranium floor" icon_state = "uranium" floor_tile = /obj/item/stack/tile/mineral/uranium diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index c0205e26852e..4976c4c9f43f 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -22,6 +22,7 @@ /turf/open/floor/circuit/Destroy() SSmapping.nuke_tiles -= src + UnregisterSignal(loc, COMSIG_AREA_POWER_CHANGE) return ..() /turf/open/floor/circuit/update_appearance(updates) @@ -193,14 +194,6 @@ icon_state = "clockwork_floor_filled" floor_tile = /obj/item/stack/tile/bronze/filled -/turf/open/floor/bronze/filled/lavaland - - initial_gas = LAVALAND_DEFAULT_ATMOS - -/turf/open/floor/bronze/filled/icemoon - - initial_gas = ICEMOON_DEFAULT_ATMOS - /turf/open/floor/white name = "white floor" desc = "A tile in a pure white color." @@ -243,9 +236,6 @@ /turf/open/floor/plating/rust/Initialize(mapload) . = ..() color = null - -/turf/open/floor/plating/rust/ComponentInitialize() - . = ..() AddElement(/datum/element/rust) /turf/open/floor/plating/plasma diff --git a/code/game/turfs/open/floor/overfloor_catwalk.dm b/code/game/turfs/open/floor/overfloor_catwalk.dm new file mode 100644 index 000000000000..1293edfaa82d --- /dev/null +++ b/code/game/turfs/open/floor/overfloor_catwalk.dm @@ -0,0 +1,156 @@ +/** + * ## catwalk flooring + * + * They show what's underneath their catwalk flooring (pipes and the like) + * you can screwdriver it to interact with the underneath stuff without destroying the tile... + * unless you want to! + */ +/obj/structure/overfloor_catwalk + name = "catwalk floor" + desc = "Flooring that shows its contents underneath. Engineers love it!" + + icon = 'icons/turf/floors/catwalk_plating.dmi' + icon_state = "maint" + base_icon_state = "maint" + layer = CATWALK_LAYER + plane = GAME_PLANE + mouse_opacity = MOUSE_OPACITY_OPAQUE + + smoothing_groups = null + smoothing_flags = NONE + canSmoothWith = null + + anchored = TRUE + obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP | BLOCK_Z_FALL + + var/covered = TRUE + var/tile_type = /obj/item/stack/overfloor_catwalk + +#ifdef SIMPLE_MAPHELPERS +// Set these back to the turf layer so that they don't block underfloor equipment +/obj/structure/overfloor_catwalk + layer = TURF_LAYER +#endif + +/obj/structure/overfloor_catwalk/Initialize(mapload) + . = ..() + if(!isturf(loc)) + return INITIALIZE_HINT_QDEL + + for(var/obj/structure/overfloor_catwalk/cat in loc) + if(cat == src) + continue + stack_trace("multiple lattices found in ([loc.x], [loc.y], [loc.z])") + return INITIALIZE_HINT_QDEL + + var/turf/T = loc + T.update_underfloor_accessibility() + + AddElement(/datum/element/footstep_override, clawfootstep = FOOTSTEP_CATWALK, heavyfootstep = FOOTSTEP_CATWALK, footstep = FOOTSTEP_CATWALK) + + var/static/list/loc_connections = list( + COMSIG_TURF_CHANGE = PROC_REF(pre_turf_change) + ) + + AddElement(/datum/element/connect_loc, loc_connections) + + update_appearance(UPDATE_OVERLAYS) + +/obj/structure/overfloor_catwalk/proc/pre_turf_change(datum/source, path, new_baseturfs, flags, post_change_callbacks) + SIGNAL_HANDLER + if(ispath(path, /turf/open/floor/plating)) + return + + post_change_callbacks += CALLBACK(src, PROC_REF(deconstruct), FALSE) + +/obj/structure/overfloor_catwalk/examine(mob/user) + . = ..() + . += span_notice("The mesh comes out with a few simple screws.") + . += span_notice("The frame can be popped out with some leverage.") + +/obj/structure/overfloor_catwalk/update_overlays() + . = ..() + if(!covered) + return + + . += image(icon, null, "lattice", CATWALK_LATTICE_LAYER) + +/obj/structure/overfloor_catwalk/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(isturf(old_loc)) + var/turf/old_turf = old_loc + old_turf.update_underfloor_accessibility() + + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.update_underfloor_accessibility() + +/obj/structure/overfloor_catwalk/deconstruct(disassembled = TRUE) + if(disassembled && loc) + new tile_type(drop_location()) + qdel(src) + +/obj/structure/overfloor_catwalk/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + covered = !covered + if(!covered) + obj_flags &= ~(BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP | BLOCK_Z_FALL) + mouse_opacity = MOUSE_OPACITY_ICON + else + obj_flags |= (BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP | BLOCK_Z_FALL) + mouse_opacity = MOUSE_OPACITY_OPAQUE + + tool.play_tool_sound(src) + update_appearance(UPDATE_OVERLAYS) + return TRUE + +/obj/structure/overfloor_catwalk/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(tool.use_tool(src, user, volume=80)) + deconstruct(TRUE) + return TRUE + +/obj/structure/overfloor_catwalk/singularity_pull(S, current_size) + if(current_size >= STAGE_FOUR) + deconstruct(TRUE) + +/obj/structure/overfloor_catwalk/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + if(the_rcd.mode == RCD_FLOORWALL) + return list("mode" = RCD_FLOORWALL, "delay" = 0, "cost" = 2) + +//Reskins! More fitting with most of our tiles, and appear as a radial on the base type +/obj/structure/overfloor_catwalk/iron + name = "iron plated catwalk floor cover" + icon_state = "iron" + base_icon_state = "iron" + tile_type = /obj/item/stack/overfloor_catwalk/iron + +/obj/structure/overfloor_catwalk/iron_white + name = "white plated catwalk floor cover" + icon_state = "whiteiron" + base_icon_state = "whiteiron" + tile_type = /obj/item/stack/overfloor_catwalk/iron_white + +/obj/structure/overfloor_catwalk/iron_dark + name = "dark plated catwalk floor cover" + icon_state = "darkiron" + base_icon_state = "darkiron" + tile_type = /obj/item/stack/overfloor_catwalk/iron_dark + +/obj/structure/overfloor_catwalk/flat_white + name = "white large plated catwalk floor cover" + icon_state = "flatwhite" + base_icon_state = "flatwhite" + tile_type = /obj/item/stack/overfloor_catwalk/flat_white + +/obj/structure/overfloor_catwalk/iron_smooth //the original green type + name = "smooth plated catwalk floor cover" + icon_state = "smoothiron" + base_icon_state = "smoothiron" + tile_type = /obj/item/stack/overfloor_catwalk/iron_smooth + +/obj/structure/overfloor_catwalk/titanium + name = "titanium plated catwalk floor cover" + icon_state = "smoothiron" + base_icon_state = "smoothiron" + tile_type = /obj/item/stack/overfloor_catwalk/titanium diff --git a/code/game/turfs/open/floor/plating.dm b/code/game/turfs/open/floor/plating.dm index 0b4361c6c95a..4ce59352576c 100644 --- a/code/game/turfs/open/floor/plating.dm +++ b/code/game/turfs/open/floor/plating.dm @@ -85,6 +85,21 @@ balloon_alert(user, "too damaged, use a welding tool!") else balloon_alert(user, "too damaged, use a welding or plating repair tool!") + + else if(istype(C, /obj/item/stack/overfloor_catwalk)) + if(!broken && !burnt) + for(var/obj/O in src) + for(var/M in O.buckled_mobs) + to_chat(user, span_warning("Someone is buckled to \the [O]! Unbuckle [M] to move \him out of the way.")) + return + var/obj/item/stack/overfloor_catwalk/tile = C + tile.place_tile(src, user) + else + if(!iscyborg(user)) + balloon_alert(user, "too damaged, use a welding tool!") + else + balloon_alert(user, "too damaged, use a welding or plating repair tool!") + else if(istype(C, /obj/item/cautery/prt)) //plating repair tool if((broken || burnt) && C.use_tool(src, user, 0, volume=80)) to_chat(user, span_danger("You fix some dents on the broken plating.")) @@ -228,7 +243,7 @@ if(!isturf(user.loc)) return //can't do this stuff whilst inside objects and such - add_fingerprint(user) + tool_used.leave_evidence(user, src) if(deconstruct_steps(tool_used, user)) return diff --git a/code/game/turfs/open/floor/plating/misc_plating.dm b/code/game/turfs/open/floor/plating/misc_plating.dm index f5f7cccca490..a0414129ab06 100644 --- a/code/game/turfs/open/floor/plating/misc_plating.dm +++ b/code/game/turfs/open/floor/plating/misc_plating.dm @@ -6,10 +6,6 @@ initial_gas = OPENTURF_LOW_PRESSURE baseturfs = /turf/open/floor/plating/lowpressure -/turf/open/floor/plating/icemoon - icon_state = "plating" - initial_gas = ICEMOON_DEFAULT_ATMOS - /turf/open/floor/plating/abductor name = "alien floor" icon_state = "alienpod1" @@ -56,17 +52,13 @@ /turf/open/floor/plating/snowed/cavern temperature = 120 -/turf/open/floor/plating/snowed/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - /turf/open/floor/plating/snowed/smoothed icon = 'icons/turf/floors/snow_turf.dmi' icon_state = "snow_turf-0" base_icon_state = "snow_turf" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_SNOWED) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_SNOWED) - + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_SNOWED + canSmoothWith = SMOOTH_GROUP_FLOOR_SNOWED /turf/open/floor/plating/snowed/temperatre temperature = 255.37 @@ -75,14 +67,6 @@ /turf/open/floor/plating/snowed/snow_cabin temperature = 180 -/turf/open/floor/plating/snowed/smoothed/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - -/turf/open/floor/plating/lavaland_atmos - - baseturfs = /turf/open/lava/smooth/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - /turf/open/floor/plating/elevatorshaft name = "elevator shaft" icon_state = "elevatorshaft" diff --git a/code/game/turfs/open/floor/reinforced_floor.dm b/code/game/turfs/open/floor/reinforced_floor.dm index babb3aacf5e6..39cae3f762fd 100644 --- a/code/game/turfs/open/floor/reinforced_floor.dm +++ b/code/game/turfs/open/floor/reinforced_floor.dm @@ -64,8 +64,7 @@ if(EXPLODE_DEVASTATE) if(prob(80)) if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) - ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - ReplaceWithLattice() + TryScrapeToLattice() else ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) else if(prob(50)) @@ -84,21 +83,22 @@ new floor_tile(src) make_plating(TRUE) else if(prob(30)) - ReplaceWithLattice() + TryScrapeToLattice() /turf/open/floor/engine/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) -/turf/open/floor/engine/attack_hand(mob/user, list/modifiers) +/turf/open/floor/engine/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) return - user.Move_Pulled(src) + if(!isliving(user)) + return + user.move_grabbed_atoms_towards(src) //air filled floors; used in atmos pressure chambers /turf/open/floor/engine/n2o - article = "an" name = "\improper N2O floor" initial_gas = ATMOSTANK_NITROUSOXIDE @@ -115,12 +115,10 @@ initial_gas = ATMOSTANK_OXYGEN /turf/open/floor/engine/n2 - article = "an" name = "\improper N2 floor" initial_gas = ATMOSTANK_NITROGEN /turf/open/floor/engine/h2 - article = "an" name = "\improper H2 floor" initial_gas = ATMOSTANK_HYDROGEN diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index 20e40ae78f5b..3e058743c761 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -11,8 +11,8 @@ clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_GRASS) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_GRASS, SMOOTH_GROUP_CLOSED_TURFS) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_GRASS + canSmoothWith = SMOOTH_GROUP_FLOOR_GRASS + SMOOTH_GROUP_CLOSED_TURFS layer = HIGH_TURF_LAYER var/smooth_icon = 'icons/turf/floors/grass.dmi' @@ -29,4 +29,4 @@ icon = smooth_icon /turf/open/misc/grass/lavaland - initial_gas = LAVALAND_DEFAULT_ATMOS + initial_gas = OPENTURF_LOW_PRESSURE diff --git a/code/game/turfs/open/ice.dm b/code/game/turfs/open/ice.dm index c02c5712f2c9..b6eb9d84f72a 100644 --- a/code/game/turfs/open/ice.dm +++ b/code/game/turfs/open/ice.dm @@ -5,7 +5,6 @@ icon_state = "ice_turf-0" base_icon_state = "ice_turf-0" temperature = 180 - temperature = 180 baseturfs = /turf/open/misc/ice slowdown = 1 @@ -29,15 +28,5 @@ icon_state = "ice_turf-255" base_icon_state = "ice_turf" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_ICE) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_ICE) - -/turf/open/misc/ice/icemoon - baseturfs = /turf/open/openspace/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - slowdown = 0 - simulated = FALSE - -/turf/open/misc/ice/icemoon/no_planet_atmos - simulated = TRUE - + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_ICE + canSmoothWith = SMOOTH_GROUP_FLOOR_ICE diff --git a/code/game/turfs/open/lava.dm b/code/game/turfs/open/lava.dm index 3a82641f530f..558edadca216 100644 --- a/code/game/turfs/open/lava.dm +++ b/code/game/turfs/open/lava.dm @@ -49,6 +49,7 @@ initial_gas = AIRLESS_ATMOS /turf/open/lava/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() if(burn_stuff(arrived)) START_PROCESSING(SSobj, src) @@ -67,7 +68,7 @@ /turf/open/lava/process(delta_time) if(!burn_stuff(null, delta_time)) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /turf/open/lava/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) @@ -92,11 +93,6 @@ /turf/open/lava/singularity_pull(S, current_size) return -/turf/open/lava/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/floors.dmi' - underlay_appearance.icon_state = "basalt" - return TRUE - /turf/open/lava/GetHeatCapacity() . = 700000 @@ -206,8 +202,8 @@ burn_obj.resistance_flags |= FLAMMABLE //Even fireproof things burn up in lava if(burn_obj.resistance_flags & FIRE_PROOF) burn_obj.resistance_flags &= ~FIRE_PROOF - if(burn_obj.armor.fire > 50) //obj with 100% fire armor still get slowly burned away. - burn_obj.armor = burn_obj.armor.setRating(fire = 50) + if(burn_obj.returnArmor().fire > 50) //obj with 100% fire armor still get slowly burned away. + burn_obj.setArmor(burn_obj.returnArmor().setRating(fire = 50)) burn_obj.fire_act(temperature_damage, 1000 * delta_time) if(istype(burn_obj, /obj/structure/closet)) var/obj/structure/closet/burn_closet = burn_obj @@ -231,13 +227,9 @@ icon_state = "lava-255" base_icon_state = "lava" smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_FLOOR_LAVA) - canSmoothWith = list(SMOOTH_GROUP_FLOOR_LAVA) - -/turf/open/lava/smooth/lava_land_surface - initial_gas = LAVALAND_DEFAULT_ATMOS - - baseturfs = /turf/open/lava/smooth/lava_land_surface + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_LAVA + canSmoothWith = SMOOTH_GROUP_FLOOR_LAVA + underfloor_accessibility = UNDERFLOOR_INTERACTABLE //This avoids strangeness when routing pipes / wires along catwalks over lava /turf/open/lava/smooth/airless initial_gas = AIRLESS_ATMOS diff --git a/code/game/turfs/open/misc.dm b/code/game/turfs/open/misc.dm index a245e5c52785..238219483b09 100644 --- a/code/game/turfs/open/misc.dm +++ b/code/game/turfs/open/misc.dm @@ -15,8 +15,8 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY underfloor_accessibility = UNDERFLOOR_INTERACTABLE - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN) - canSmoothWith = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_OPEN_FLOOR) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + canSmoothWith = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_OPEN_FLOOR tiled_dirt = TRUE diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index c157c079edb6..f3a2d7f560bf 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -31,66 +31,39 @@ SHOULD_CALL_PARENT(FALSE) return below.examine(user) -/** - * Prepares a moving movable to be precipitated if Move() is successful. - * This is done in Enter() and not Entered() because there's no easy way to tell - * if the latter was called by Move() or forceMove() while the former is only called by Move(). - */ -/turf/open/openspace/Enter(atom/movable/movable, atom/oldloc) - . = ..() - if(.) - //higher priority than CURRENTLY_Z_FALLING so the movable doesn't fall on Entered() - movable.set_currently_z_moving(CURRENTLY_Z_FALLING_FROM_MOVE) - ///Makes movables fall when forceMove()'d to this turf. /turf/open/openspace/Entered(atom/movable/movable) . = ..() - if(movable.set_currently_z_moving(CURRENTLY_Z_FALLING)) - zFall(movable, falling_from_move = TRUE) + movable.zFall() -/turf/open/openspace/proc/zfall_if_on_turf(atom/movable/movable) - if(QDELETED(movable) || movable.loc != src) - return - zFall(movable) +/turf/open/openspace/hitby(atom/movable/hitting_atom, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + . = ..() + hitting_atom.zFall() /turf/open/openspace/can_have_cabling() if(locate(/obj/structure/lattice/catwalk, src)) return TRUE return FALSE -/turf/open/openspace/zAirIn() - return TRUE - -/turf/open/openspace/zAirOut() - return TRUE - -/turf/open/openspace/zPassIn(atom/movable/A, direction, turf/source) - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) +/turf/open/openspace/CanZPass(atom/movable/A, direction, z_move_flags) + if(z == A.z) //moving FROM this turf + //Check contents + for(var/obj/O in contents) + if(direction == UP) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + else if(O.obj_flags & BLOCK_Z_OUT_DOWN) return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_UP) - return FALSE - return TRUE - return FALSE -/turf/open/openspace/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(A.anchored && !allow_anchored_movement) - return FALSE - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) - return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_UP) + else + for(var/obj/O in contents) + if(direction == UP) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + else if(O.obj_flags & BLOCK_Z_IN_UP) return FALSE - return TRUE - return FALSE + + return TRUE /turf/open/openspace/proc/CanCoverUp() return can_cover_up @@ -136,42 +109,8 @@ /turf/open/openspace/rust_heretic_act() return FALSE -/turf/open/openspace/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) - if(caller && !caller.can_z_move(DOWN, src, null , ZMOVE_FALL_FLAGS)) //If we can't fall here (flying/lattice), it's fine to path through +/turf/open/openspace/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + var/atom/movable/our_movable = pass_info.caller_ref.resolve() + if(our_movable && !our_movable.can_z_move(DOWN, src, null , ZMOVE_FALL_FLAGS)) //If we can't fall here (flying/lattice), it's fine to path through return TRUE return FALSE - -/turf/open/openspace/icemoon - name = "ice chasm" - baseturfs = /turf/open/openspace/icemoon - initial_gas = ICEMOON_DEFAULT_ATMOS - simulated = FALSE - - var/replacement_turf = /turf/open/misc/asteroid/snow/icemoon - /// Replaces itself with replacement_turf if the turf below this one is in a no ruins allowed area (usually ruins themselves) - var/protect_ruin = TRUE - /// If true mineral turfs below this openspace turf will be mined automatically - var/drill_below = TRUE - -/turf/open/openspace/icemoon/Initialize(mapload) - . = ..() - var/turf/T = GetBelow(src) - //I wonder if I should error here - if(!T) - return - if(T.turf_flags & NO_RUINS && protect_ruin) - ChangeTurf(replacement_turf, null, CHANGETURF_IGNORE_AIR) - return - if(!ismineralturf(T) || !drill_below) - return - var/turf/closed/mineral/M = T - M.mineralAmt = 0 - M.gets_drilled() - baseturfs = /turf/open/openspace/icemoon //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace. - -/turf/open/openspace/icemoon/keep_below - drill_below = FALSE - -/turf/open/openspace/icemoon/ruins - protect_ruin = FALSE - drill_below = FALSE diff --git a/code/game/turfs/open/planet.dm b/code/game/turfs/open/planet.dm index e1166876be0e..e7a148cc8524 100644 --- a/code/game/turfs/open/planet.dm +++ b/code/game/turfs/open/planet.dm @@ -55,7 +55,7 @@ smooth_icon = 'icons/turf/floors/junglegrass.dmi' /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) + mineralSpawnChanceList = list(/datum/ore/uranium = 5, /datum/ore/diamond = 1, /datum/ore/gold = 10, + /datum/ore/silver = 12, /datum/ore/plasma = 20, /datum/ore/iron = 40, /datum/ore/titanium = 11, + /datum/ore/bluespace_crystal = 1) baseturfs = /turf/open/misc/dirt/dark diff --git a/code/game/turfs/open/river.dm b/code/game/turfs/open/river.dm index 483db1b46481..d6ab77c7c07f 100644 --- a/code/game/turfs/open/river.dm +++ b/code/game/turfs/open/river.dm @@ -4,10 +4,11 @@ #define RANDOM_LOWER_X 50 #define RANDOM_LOWER_Y 50 -/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors/unexplored, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y, new_baseturfs) +/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth, whitelist_area, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y, new_baseturfs) var/list/river_nodes = list() var/num_spawned = 0 var/list/possible_locs = block(locate(min_x, min_y, target_z), locate(max_x, max_y, target_z)) + new_baseturfs = baseturfs_string_list(new_baseturfs, pick(possible_locs)) while(num_spawned < nodes && possible_locs.len) var/turf/T = pick(possible_locs) var/area/A = get_area(T) @@ -23,8 +24,11 @@ if (W.z != target_z || W.connected) continue W.connected = TRUE + // Workaround around ChangeTurf that's safe because of when this proc is called var/turf/cur_turf = get_turf(W) - cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR) + cur_turf = new turf_type(cur_turf) + if(new_baseturfs) + cur_turf.baseturfs = new_baseturfs var/turf/target_turf = get_turf(pick(river_nodes - W)) if(!target_turf) break @@ -53,7 +57,10 @@ cur_turf = get_step(cur_turf, cur_dir) continue else - var/turf/river_turf = cur_turf.ChangeTurf(turf_type, new_baseturfs, CHANGETURF_IGNORE_AIR) + // Workaround around ChangeTurf that's safe because of when this proc is called + var/turf/river_turf = new turf_type(cur_turf) + if(new_baseturfs) + river_turf.baseturfs = new_baseturfs river_turf.Spread(25, 11, whitelist_area) for(var/WP in river_nodes) @@ -72,35 +79,42 @@ 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 - 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.turf_flags & NO_LAVA_GEN) ) + for(var/turf/canidate as anything in RANGE_TURFS(1, src) - src) + if(!canidate || (canidate.density && !ismineralturf(canidate)) || isindestructiblefloor(canidate)) continue - if(!logged_turf_type && ismineralturf(T)) - var/turf/closed/mineral/M = T - logged_turf_type = M.turf_type - - if(get_dir(src, F) in GLOB.cardinals) - cardinal_turfs += F - else - diagonal_turfs += F - - for(var/F in cardinal_turfs) //cardinal turfs are always changed but don't always spread - var/turf/T = F - 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 - 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)) - var/turf/closed/mineral/M = T - M.ChangeTurf(M.turf_type, M.baseturfs, CHANGETURF_IGNORE_AIR) + var/area/new_area = get_area(canidate) + if((!istype(new_area, whitelisted_area) && whitelisted_area) || (canidate.turf_flags & NO_LAVA_GEN)) + continue + if(!logged_turf_type && ismineralturf(canidate)) + var/turf/closed/mineral/mineral_canidate = canidate + logged_turf_type = mineral_canidate.turf_type + if(get_dir(src, canidate) in GLOB.cardinals) + cardinal_turfs += canidate + else + diagonal_turfs += canidate + + for(var/turf/cardinal_canidate as anything in cardinal_turfs) //cardinal turfs are always changed but don't always spread + // NOTE: WE ARE SKIPPING CHANGETURF HERE + // The calls in this proc only serve to provide a satisfactory (if it's not ALREADY this) check. They do not actually call changeturf + // This is safe because this proc can only be run during mapload, and nothing has initialized by now so there's nothing to inherit or delete + if(!istype(cardinal_canidate, logged_turf_type) && cardinal_canidate.ChangeTurf(type, baseturfs, CHANGETURF_SKIP) && prob(probability)) + if(baseturfs) + cardinal_canidate.baseturfs = baseturfs + cardinal_canidate.Spread(probability - prob_loss, prob_loss, whitelisted_area) + + for(var/turf/diagonal_canidate as anything in diagonal_turfs) //diagonal turfs only sometimes change, but will always spread if changed + // Important NOTE: SEE ABOVE + if(!istype(diagonal_canidate, logged_turf_type) && prob(probability) && diagonal_canidate.ChangeTurf(type, baseturfs, CHANGETURF_SKIP)) + if(baseturfs) + diagonal_canidate.baseturfs = baseturfs + diagonal_canidate.Spread(probability - prob_loss, prob_loss, whitelisted_area) + else if(ismineralturf(diagonal_canidate)) + var/turf/closed/mineral/diagonal_mineral = diagonal_canidate + // SEE ABOVE, THIS IS ONLY VERY RARELY SAFE + new diagonal_mineral.turf_type(diagonal_mineral) #undef RANDOM_UPPER_X #undef RANDOM_UPPER_Y diff --git a/code/game/turfs/open/space/space.dm b/code/game/turfs/open/space/space.dm index f8dfdb898860..50a5484a4503 100644 --- a/code/game/turfs/open/space/space.dm +++ b/code/game/turfs/open/space/space.dm @@ -1,4 +1,5 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE) +GLOBAL_REAL_VAR(space_appearances) = make_space_appearances() /turf/open/space icon = 'icons/turf/space.dmi' @@ -10,13 +11,13 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C z_eventually_space = TRUE temperature = TCMB simulated = FALSE + explosion_block = 0.5 + initial_gas = null var/destination_z var/destination_x var/destination_y - initial_gas = AIRLESS_ATMOS - plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 @@ -47,41 +48,38 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C */ /turf/open/space/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) - icon_state = SPACE_ICON_STATE(x, y, z) - if(flags_1 & INITIALIZED_1) + appearance = global.space_appearances[(((x + y) ^ ~(x * y) + z) % 25) + 1] + + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - var/area/our_area = loc - if(!our_area.area_has_base_lighting) //Only provide your own lighting if the area doesn't for you + initialized = TRUE + + if(!loc:area_has_base_lighting) //Only provide your own lighting if the area doesn't for you // Intentionally not add_overlay for performance reasons. // add_overlay does a bunch of generic stuff, like creating a new list for overlays, // queueing compile, cloning appearance, etc etc etc that is not necessary here. overlays += global.fullbright_overlay - if (!mapload) - var/turf/T = GetAbove(src) - if(!isnull(T)) - T.multiz_turf_new(src, DOWN) - T = GetBelow(src) - if(!isnull(T)) - T.multiz_turf_new(src, UP) - - ComponentInitialize() - return INITIALIZE_HINT_NORMAL +/proc/make_space_appearances() + . = new /list(26) + for (var/i in 0 to 25) + var/image/I = new() + I.appearance = /turf/open/space + I.icon_state = "[i]" + I.plane = PLANE_SPACE + I.layer = SPACE_LAYER + .[i+1] = I + //ATTACK GHOST IGNORING PARENT RETURN VALUE /turf/open/space/attack_ghost(mob/dead/observer/user) if(destination_z) var/turf/T = locate(destination_x, destination_y, destination_z) user.forceMove(T) -/* -/turf/open/space/Initalize_Atmos(times_fired) - return -*/ /turf/open/space/TakeTemperature(temp) /turf/open/space/RemoveLattice() @@ -124,7 +122,7 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C if(!arrived || src != arrived.loc) return - if(destination_z && destination_x && destination_y && !arrived.pulledby && !arrived.currently_z_moving) + if(destination_z && destination_x && destination_y && !LAZYLEN(arrived.grabbed_by) && !arrived.currently_z_moving) var/tx = destination_x var/ty = destination_y var/turf/DT = locate(tx, ty, destination_z) @@ -145,13 +143,13 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C if(SEND_SIGNAL(arrived, COMSIG_MOVABLE_LATERAL_Z_MOVE) & COMPONENT_BLOCK_MOVEMENT) return - arrived.zMove(null, DT, ZMOVE_ALLOW_BUCKLED) - var/atom/movable/current_pull = arrived.pulling - while (current_pull) - var/turf/target_turf = get_step(current_pull.pulledby.loc, REVERSE_DIR(current_pull.pulledby.dir)) || current_pull.pulledby.loc - current_pull.zMove(null, target_turf, ZMOVE_ALLOW_BUCKLED) - current_pull = current_pull.pulling + arrived.forceMoveWithGroup(DT, ZMOVING_LATERAL) + if(isliving(arrived)) + var/mob/living/L = arrived + for(var/obj/item/hand_item/grab/G as anything in L.recursively_get_conga_line()) + var/turf/pulled_dest = get_step(G.assailant.loc, REVERSE_DIR(G.assailant.dir)) || G.assailant.loc + G.affecting.forceMoveWithGroup(pulled_dest, ZMOVING_LATERAL) /turf/open/space/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) @@ -173,13 +171,6 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C /turf/open/space/acid_act(acidpwr, acid_volume) return FALSE -/turf/open/space/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = 'icons/turf/space.dmi' - underlay_appearance.icon_state = SPACE_ICON_STATE(x, y, z) - underlay_appearance.plane = PLANE_SPACE - return TRUE - - /turf/open/space/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if(!CanBuildHere()) return FALSE @@ -204,7 +195,7 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C /turf/open/space/rust_heretic_act() return FALSE -/turf/open/space/ReplaceWithLattice() +/turf/open/space/TryScrapeToLattice() var/dest_x = destination_x var/dest_y = destination_y var/dest_z = destination_z @@ -216,39 +207,25 @@ GLOBAL_REAL_VAR(starlight_color) = pick(COLOR_TEAL, COLOR_GREEN, COLOR_SILVER, C /turf/open/space/openspace icon = 'icons/turf/floors.dmi' icon_state = "invisible" - simulated = TRUE z_flags = Z_ATMOS_IN_DOWN | Z_ATMOS_IN_UP | Z_ATMOS_OUT_DOWN | Z_ATMOS_OUT_UP | Z_MIMIC_BELOW | Z_MIMIC_OVERWRITE | Z_MIMIC_NO_AO -/turf/open/space/openspace/zAirIn() - return TRUE - -/turf/open/space/openspace/zAirOut() - return TRUE -/turf/open/space/openspace/zPassIn(atom/movable/A, direction, turf/source) - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_DOWN) - return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_IN_UP) +/turf/open/space/CanZPass(atom/movable/A, direction, z_move_flags) + if(z == A.z) //moving FROM this turf + //Check contents + for(var/obj/O in contents) + if(direction == UP) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + else if(O.obj_flags & BLOCK_Z_OUT_DOWN) return FALSE - return TRUE - return FALSE -/turf/open/space/openspace/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - if(A.anchored && !allow_anchored_movement) - return FALSE - if(direction == DOWN) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_DOWN) + else + for(var/obj/O in contents) + if(direction == UP) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + else if(O.obj_flags & BLOCK_Z_IN_UP) return FALSE - return TRUE - if(direction == UP) - for(var/obj/contained_object in contents) - if(contained_object.obj_flags & BLOCK_Z_OUT_UP) - return FALSE - return TRUE - return FALSE + + return TRUE diff --git a/code/game/turfs/open/space/transit.dm b/code/game/turfs/open/space/transit.dm index a3a659c30701..ba54684653fc 100644 --- a/code/game/turfs/open/space/transit.dm +++ b/code/game/turfs/open/space/transit.dm @@ -7,11 +7,6 @@ explosion_block = INFINITY z_flags = NONE -/turf/open/space/transit/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - . = ..() - underlay_appearance.icon_state = "speedspace_ns_[get_transit_state(asking_turf)]" - underlay_appearance.transform = turn(matrix(), get_transit_angle(asking_turf)) - /turf/open/space/transit/south dir = SOUTH diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index fefabbb93f52..1011ea053a4f 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -4,36 +4,56 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf icon = 'icons/turf/floors.dmi' vis_flags = VIS_INHERIT_ID | VIS_INHERIT_PLANE// Important for interaction with and visualization of openspace. - luminosity = 1 - - /// Turf bitflags, see code/__DEFINES/flags.dm - var/turf_flags = NONE - - /// If there's a tile over a basic floor that can be ripped out - var/overfloor_placed = FALSE - /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. - var/underfloor_accessibility = UNDERFLOOR_HIDDEN + explosion_block = 1 // baseturfs can be either a list or a single turf type. // In class definition like here it should always be a single type. // A list will be created in initialization that figures out the baseturf's baseturf etc. // In the case of a list it is sorted from bottom layer to top. // This shouldn't be modified directly, use the helper procs. - var/list/baseturfs = /turf/baseturf_bottom + var/tmp/list/baseturfs = /turf/baseturf_bottom + /// Is this turf in the process of running ChangeTurf()? + var/tmp/changing_turf = FALSE - ///Used for fire, if a melting temperature was reached, it will be destroyed - var/to_be_destroyed = 0 - ///The max temperature of the fire which it was subjected to - var/max_fire_temperature_sustained = 0 + ///Lumcount added by sources other than lighting datum objects, such as the overlay lighting component. + var/tmp/dynamic_lumcount = 0 + var/tmp/lighting_corners_initialised = FALSE + ///Our lighting object. + var/tmp/datum/lighting_object/lighting_object + ///Lighting Corner datums. + var/tmp/datum/lighting_corner/lighting_corner_NE + var/tmp/datum/lighting_corner/lighting_corner_SE + var/tmp/datum/lighting_corner/lighting_corner_SW + var/tmp/datum/lighting_corner/lighting_corner_NW - var/blocks_air = AIR_ALLOWED + /// If there's a tile over a basic floor that can be ripped out + var/tmp/overfloor_placed = FALSE + + /// The max temperature of the fire which it was subjected to + var/tmp/max_fire_temperature_sustained = 0 + + /// For the station blueprints, images of objects eg: pipes + var/tmp/list/image/blueprint_data + /// Contains the throw range for explosions. You won't need this, stop looking at it. + var/tmp/explosion_throw_details + + ///Lazylist of movable atoms providing opacity sources. + var/tmp/list/atom/movable/opacity_sources + + //* END TMP VARS *// + + + /// Turf bitflags, see code/__DEFINES/flags.dm + var/turf_flags = NONE - var/list/image/blueprint_data //for the station blueprints, images of objects eg: pipes + /// How accessible underfloor pieces such as wires, pipes, etc are on this turf. Can be HIDDEN, VISIBLE, or INTERACTABLE. + var/underfloor_accessibility = UNDERFLOOR_HIDDEN - var/list/explosion_throw_details + ///Used for fire, if a melting temperature was reached, it will be destroyed + var/to_be_destroyed = 0 - var/requires_activation //add to air processing after initialize? - var/changing_turf = FALSE + /// Determines how air interacts with this turf. + var/blocks_air = AIR_ALLOWED var/bullet_bounce_sound = 'sound/weapons/gun/general/mag_bullet_remove.ogg' //sound played when a shell casing is ejected ontop of the turf. var/bullet_sizzle = FALSE //used by ammo_casing/bounce_away() to determine if the shell casing should make a sizzle sound when it's ejected over the turf @@ -41,28 +61,14 @@ GLOBAL_LIST_EMPTY(station_turfs) var/tiled_dirt = FALSE // use smooth tiled dirt decal - ///Lumcount added by sources other than lighting datum objects, such as the overlay lighting component. - var/dynamic_lumcount = 0 - ///Bool, whether this turf will always be illuminated no matter what area it is in var/always_lit = FALSE - var/tmp/lighting_corners_initialised = FALSE - - ///Our lighting object. - var/tmp/datum/lighting_object/lighting_object - ///Lighting Corner datums. - var/tmp/datum/lighting_corner/lighting_corner_NE - var/tmp/datum/lighting_corner/lighting_corner_SE - var/tmp/datum/lighting_corner/lighting_corner_SW - var/tmp/datum/lighting_corner/lighting_corner_NW - + /// Set to TRUE for pseudo 3/4ths walls, otherwise, leave alone. var/lighting_uses_jen = FALSE ///Which directions does this turf block the vision of, taking into account both the turf's opacity and the movable opacity_sources. var/directional_opacity = NONE - ///Lazylist of movable atoms providing opacity sources. - var/list/atom/movable/opacity_sources ///the holodeck can load onto this turf if TRUE var/holodeck_compatible = FALSE @@ -96,49 +102,43 @@ GLOBAL_LIST_EMPTY(station_turfs) * This is done because it's called so often that any extra code just slows things down too much * If you add something relevant here add it there too * [/turf/open/space/Initialize] + * [/turf/closed/mineral/Initialize] */ /turf/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) - if(flags_1 & INITIALIZED_1) + + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - if(mapload && permit_ao) + initialized = TRUE + + if(permit_ao && mapload) queue_ao() // by default, vis_contents is inherited from the turf that was here before - vis_contents.Cut() + if(length(vis_contents)) + vis_contents.len = 0 assemble_baseturfs() - levelupdate() - - if (!isnull(smoothing_groups)) - #ifdef UNIT_TESTS - assert_sorted(smoothing_groups, "[type].smoothing_groups") - #endif + if(length(contents)) + levelupdate() - SET_BITFLAG_LIST(smoothing_groups) - if (!isnull(canSmoothWith)) - #ifdef UNIT_TESTS - assert_sorted(canSmoothWith, "[type].canSmoothWith") - #endif + #ifdef UNIT_TESTS + ASSERT_SORTED_SMOOTHING_GROUPS(smoothing_groups) + ASSERT_SORTED_SMOOTHING_GROUPS(canSmoothWith) + #endif - if(canSmoothWith[length(canSmoothWith)] > MAX_S_TURF) //If the last element is higher than the maximum turf-only value, then it must scan turf contents for smoothing targets. - smoothing_flags |= SMOOTH_OBJ - SET_BITFLAG_LIST(canSmoothWith) - if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH(src) + SETUP_SMOOTHING() - // visibilityChanged() will never hit any path with side effects during mapload - if (!mapload) - visibilityChanged() + QUEUE_SMOOTH(src) - for(var/atom/movable/content as anything in src) - Entered(content, null) + if (!mapload && length(contents)) + for(var/atom/movable/AM as anything in src) + Entered(AM, null) var/area/our_area = loc - if(!our_area.area_has_base_lighting && always_lit) //Only provide your own lighting if the area doesn't for you + if(!our_area.luminosity && always_lit) //Only provide your own lighting if the area doesn't for you add_overlay(global.fullbright_overlay) if (z_flags & Z_MIMIC_BELOW) @@ -147,47 +147,24 @@ GLOBAL_LIST_EMPTY(station_turfs) if (light_power && light_outer_range) update_light() - var/turf/T = GetAbove(src) - if(T) - T.multiz_turf_new(src, DOWN) - T = GetBelow(src) - if(T) - T.multiz_turf_new(src, UP) - if (opacity) directional_opacity = ALL_CARDINALS // apply materials properly from the default custom_materials value - if (isnull(custom_materials)) + if (length(custom_materials)) set_custom_materials(custom_materials) - ComponentInitialize() - - if(uses_integrity) - atom_integrity = max_integrity - - if (islist(armor)) - armor = getArmor(arglist(armor)) - else if (!armor) - armor = getArmor() - + #ifdef SPATIAL_GRID_ZLEVEL_STATS + if((istype(src, /turf/open/floor) || istype(src, /turf/closed/wall)) && isstationlevel(z)) + GLOB.station_turfs |= src + #endif return INITIALIZE_HINT_NORMAL -/* -/turf/proc/Initalize_Atmos(times_fired) - CALCULATE_ADJACENT_TURFS(src, NORMAL_TURF) -*/ /turf/Destroy(force) . = QDEL_HINT_IWILLGC if(!changing_turf) stack_trace("Incorrect turf deletion") changing_turf = FALSE - var/turf/T = GetAbove(src) - if(T) - T.multiz_turf_del(src, DOWN) - T = GetBelow(src) - if(T) - T.multiz_turf_del(src, UP) if (z_flags & Z_MIMIC_BELOW) cleanup_zmimic() @@ -200,10 +177,9 @@ GLOBAL_LIST_EMPTY(station_turfs) qdel(A) return - visibilityChanged() - QDEL_LIST(blueprint_data) - flags_1 &= ~INITIALIZED_1 - requires_activation = FALSE + if(blueprint_data) + QDEL_LIST(blueprint_data) + initialized = FALSE ///ZAS THINGS if(connections) @@ -214,8 +190,12 @@ GLOBAL_LIST_EMPTY(station_turfs) ///NO MORE ZAS THINGS ..() + #ifdef SPATIAL_GRID_ZLEVEL_STATS + if(isstationlevel(z)) + GLOB.station_turfs += src + #endif - vis_contents.Cut() + vis_contents.len = 0 /// WARNING WARNING /// Turfs DO NOT lose their signals when they get replaced, REMEMBER THIS @@ -224,17 +204,27 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/clear_signal_refs() return -/turf/attack_hand(mob/user, list/modifiers) +/turf/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) return - user.Move_Pulled(src) + if(!isliving(user)) + return + user.move_grabbed_atoms_towards(src) + +/turf/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(.) + return + if(!isliving(user)) + return + if(user == victim) + return + if(grab.current_grab.same_tile) + return -/turf/proc/multiz_turf_del(turf/T, dir) - SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_DEL, T, dir) + grab.move_victim_towards(src) -/turf/proc/multiz_turf_new(turf/T, dir) - SEND_SIGNAL(src, COMSIG_TURF_MULTIZ_NEW, T, dir) /** * Check whether the specified turf is blocked by something dense inside it with respect to a specific atom. @@ -279,112 +269,104 @@ GLOBAL_LIST_EMPTY(station_turfs) return TRUE return FALSE -//zPassIn doesn't necessarily pass an atom! -//direction is direction of travel of air -/turf/proc/zPassIn(atom/movable/A, direction, turf/source) - return FALSE - -//direction is direction of travel of air -/turf/proc/zPassOut(atom/movable/A, direction, turf/destination, allow_anchored_movement) - return FALSE - -//direction is direction of travel of air -/turf/proc/zAirIn(direction, turf/source) - return FALSE - -//direction is direction of travel of air -/turf/proc/zAirOut(direction, turf/source) - return FALSE +/turf/proc/CanZPass(atom/movable/A, direction, z_move_flags) + if(z == A.z) //moving FROM this turf + //Check contents + for(var/obj/O in contents) + if(direction == UP) + if(O.obj_flags & BLOCK_Z_OUT_UP) + return FALSE + else if(O.obj_flags & BLOCK_Z_OUT_DOWN) + return FALSE -/// Precipitates a movable (plus whatever buckled to it) to lower z levels if possible and then calls zImpact() -/turf/proc/zFall(atom/movable/falling, levels = 1, force = FALSE, falling_from_move = FALSE) - var/direction = DOWN - if(falling.has_gravity() == NEGATIVE_GRAVITY) - direction = UP - var/turf/target = get_step_multiz(src, direction) - if(!target) - return FALSE - var/isliving = isliving(falling) - if(!isliving && !isobj(falling)) - return - if(isliving) - var/mob/living/falling_living = falling - //relay this mess to whatever the mob is buckled to. - if(falling_living.buckled) - falling = falling_living.buckled - if(!falling_from_move && falling.currently_z_moving) - return - if(!force && !falling.can_z_move(direction, src, target, ZMOVE_FALL_FLAGS)) - falling.set_currently_z_moving(FALSE, TRUE) - return FALSE + return direction & UP //can't go below + else + if(density) //No fuck off + return FALSE - // So it doesn't trigger other zFall calls. Cleared on zMove. - falling.set_currently_z_moving(CURRENTLY_Z_FALLING) + if(direction == UP) //on a turf below, trying to enter + return 0 - falling.zMove(null, target, ZMOVE_CHECK_PULLEDBY) - target.zImpact(falling, levels, src) - return TRUE + if(direction == DOWN) //on a turf above, trying to enter + for(var/obj/O in contents) + if(O.obj_flags & BLOCK_Z_IN_DOWN) + return FALSE + return TRUE ///Called each time the target falls down a z level possibly making their trajectory come to a halt. see __DEFINES/movement.dm. /turf/proc/zImpact(atom/movable/falling, levels = 1, turf/prev_turf) - var/flags = NONE - var/list/falling_movables = falling.get_z_move_affected() - var/list/falling_mov_names - for(var/atom/movable/falling_mov as anything in falling_movables) - falling_mov_names += falling_mov.name + var/flags = FALL_RETAIN_PULL + var/list/falling_movables = falling.get_move_group() + var/list/falling_mob_names + + for(var/atom/movable/falling_mob as anything in falling_movables) + if(ishuman(falling_mob)) + var/mob/living/carbon/human/H = falling_mob + falling_mob_names += H.get_face_name() + continue + falling_mob_names += falling_mob.name + for(var/i in contents) var/atom/thing = i flags |= thing.intercept_zImpact(falling_movables, levels) if(flags & FALL_STOP_INTERCEPTING) break + if(prev_turf && !(flags & FALL_NO_MESSAGE)) - for(var/mov_name in falling_mov_names) - prev_turf.visible_message(span_danger("[mov_name] falls through [prev_turf]!")) - if(!(flags & FALL_INTERCEPTED) && zFall(falling, levels + 1)) + for(var/mov_name in falling_mob_names) + prev_turf.visible_message( + span_warning("[name] falls through [prev_turf]!"),, + span_hear("You hear a whoosh of displaced air.") + ) + + if(!(flags & FALL_INTERCEPTED) && falling.zFall(levels + 1)) return FALSE - for(var/atom/movable/falling_mov as anything in falling_movables) + + for(var/atom/movable/falling_movable as anything in falling_movables) + var/mob/living/L = falling_movable + if(!isliving(L)) + L = null if(!(flags & FALL_RETAIN_PULL)) - falling_mov.stop_pulling() + L?.release_all_grabs() + if(!(flags & FALL_INTERCEPTED)) - falling_mov.onZImpact(src, levels) - if(falling_mov.pulledby && (falling_mov.z != falling_mov.pulledby.z || get_dist(falling_mov, falling_mov.pulledby) > 1)) - falling_mov.pulledby.stop_pulling() + falling_movable.onZImpact(src, levels) + + #ifndef ZMIMIC_MULTIZ_SPEECH //Multiz speech handles this otherwise + if(!(flags & FALL_NO_MESSAGE)) + prev_turf.audible_message(span_hear("You hear something slam into the deck below.")) + #endif + + if(L) + if(LAZYLEN(L.grabbed_by)) + for(var/obj/item/hand_item/grab/G in L.grabbed_by) + if(L.z != G.assailant.z || get_dist(L, G.assailant) > 1) + qdel(G) return TRUE -/turf/proc/handleRCL(obj/item/rcl/C, mob/user) - if(C.loaded) - for(var/obj/structure/pipe_cleaner/LC in src) - if(!LC.d1 || !LC.d2) - LC.handlecable(C, user) - return - C.loaded.place_turf(src, user) - if(C.wiring_gui_menu) - C.wiringGuiUpdate(user) - C.is_empty(user) - /turf/attackby(obj/item/C, mob/user, params) - if(..()) + if(..() || C.attack_turf(src, user, params)) return TRUE + if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/coil = C coil.place_turf(src, user) return TRUE - else if(can_have_cabling() && istype(C, /obj/item/stack/pipe_cleaner_coil)) - var/obj/item/stack/pipe_cleaner_coil/coil = C - for(var/obj/structure/pipe_cleaner/LC in src) - if(!LC.d1 || !LC.d2) - LC.attackby(C, user) - return - coil.place_turf(src, user) - return TRUE - - else if(istype(C, /obj/item/rcl)) - handleRCL(C, user) return FALSE +/turf/attackby_secondary(obj/item/weapon, mob/user, params) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + + if(weapon.sharpness && try_graffiti(user, weapon)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + //There's a lot of QDELETED() calls here if someone can figure out how to optimize this but not runtime when something gets deleted by a Bump/CanPass/Cross call, lemme know or go ahead and fix this mess - kevinz000 -/turf/Enter(atom/movable/mover) +/// Test if a movable can enter this turf. Send no_side_effects = TRUE to prevent bumping. +/turf/Enter(atom/movable/mover, no_side_effects = FALSE) // Do not call ..() // Byond's default turf/Enter() doesn't have the behaviour we want with Bump() // By default byond will call Bump() on the first dense object in contents @@ -396,6 +378,8 @@ GLOBAL_LIST_EMPTY(station_turfs) if(thing == mover || thing == mover.loc) // Multi tile objects and moving out of other objects continue if(!thing.Cross(mover)) + if(no_side_effects) + return FALSE if(QDELETED(mover)) //deleted from Cross() (CanPass is pure so it cant delete, Cross shouldnt be doing this either though, but it can happen) return FALSE if((mover.movement_type & PHASING)) @@ -404,17 +388,48 @@ GLOBAL_LIST_EMPTY(station_turfs) return FALSE continue else - if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1))) + if(!firstbump || ((thing.layer < firstbump.layer || (thing.flags_1 & ON_BORDER_1|BUMP_PRIORITY_1)) && !(firstbump.flags_1 & ON_BORDER_1))) firstbump = thing + if(QDELETED(mover)) //Mover deleted from Cross/CanPass/Bump, do not proceed. return FALSE + if(!canPassSelf) //Even if mover is unstoppable they need to bump us. firstbump = src + if(firstbump) mover.Bump(firstbump) return (mover.movement_type & PHASING) + return TRUE +/turf/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + + if(arrived.flags_2 & ATMOS_SENSITIVE_2) + LAZYDISTINCTADD(atmos_sensitive_contents, arrived) + if(TURF_HAS_VALID_ZONE(src)) + if(isnull(zone.atmos_sensitive_contents)) + SSzas.zones_with_sensitive_contents += zone + LAZYDISTINCTADD(zone.atmos_sensitive_contents, arrived) + // Spatial grid tracking needs to happen before the signal is sent + . = ..() + + if (!arrived.bound_overlay && !(arrived.zmm_flags & ZMM_IGNORE) && arrived.invisibility != INVISIBILITY_ABSTRACT && TURF_IS_MIMICKING(above)) + above.update_mimic() + + +/turf/Exited(atom/movable/gone, direction) + if(gone.flags_2 & ATMOS_SENSITIVE_2) + if(!isnull(atmos_sensitive_contents)) + LAZYREMOVE(atmos_sensitive_contents, gone) + if(TURF_HAS_VALID_ZONE(src)) + LAZYREMOVE(zone.atmos_sensitive_contents, gone) + if(isnull(zone.atmos_sensitive_contents)) + SSzas.zones_with_sensitive_contents -= zone + + // Spatial grid tracking needs to happen before the signal is sent + . = ..() + // A proc in case it needs to be recreated or badmins want to change the baseturfs /turf/proc/assemble_baseturfs(turf/fake_baseturf_type) var/static/list/created_baseturf_lists = list() @@ -466,7 +481,7 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/levelupdate() for(var/obj/O in src) - if(O.flags_1 & INITIALIZED_1) + if(O.initialized) SEND_SIGNAL(O, COMSIG_OBJ_HIDE, underfloor_accessibility < UNDERFLOOR_VISIBLE) // override for space turfs, since they should never hide anything @@ -476,7 +491,7 @@ GLOBAL_LIST_EMPTY(station_turfs) // Removes all signs of lattice on the pos of the turf -Donkieyo /turf/proc/RemoveLattice() var/obj/structure/lattice/L = locate(/obj/structure/lattice, src) - if(L && (L.flags_1 & INITIALIZED_1)) + if(L && L.initialized) qdel(L) /turf/proc/Bless() @@ -527,20 +542,6 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/is_shielded() return -/turf/contents_explosion(severity, target) - for(var/thing in contents) - var/atom/movable/movable_thing = thing - if(QDELETED(movable_thing)) - continue - 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) for(var/I in src) @@ -550,12 +551,6 @@ GLOBAL_LIST_EMPTY(station_turfs) if(ismob(A) || .) A.narsie_act() -/turf/proc/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) - underlay_appearance.icon = icon - underlay_appearance.icon_state = icon_state - underlay_appearance.dir = adjacency_dir - return TRUE - /turf/proc/add_blueprints(atom/movable/AM) var/image/I = new I.plane = GAME_PLANE @@ -694,16 +689,17 @@ GLOBAL_LIST_EMPTY(station_turfs) * * 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? + * * no_id: When true, doors with public access will count as impassible */ -/turf/proc/reachableAdjacentTurfs(caller, ID, simulated_only) - var/static/space_type_cache = typecacheof(/turf/open/space) +/turf/proc/reachableAdjacentTurfs(atom/movable/caller, list/access, simulated_only, no_id = FALSE) . = list() + var/datum/can_pass_info/pass_info = new(caller, access, no_id) 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])) + if(!turf_to_check || (simulated_only && isspaceturf(turf_to_check))) continue - if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, caller, ID)) + if(turf_to_check.density || LinkBlockedWithAccess(turf_to_check, pass_info)) continue . += turf_to_check @@ -715,3 +711,75 @@ GLOBAL_LIST_EMPTY(station_turfs) /turf/proc/TakeTemperature(temp) temperature += temp + +/// Sets underfloor accessibility +/turf/proc/update_underfloor_accessibility() + underfloor_accessibility = initial(underfloor_accessibility) + if(underfloor_accessibility == UNDERFLOOR_HIDDEN) + return + + if(locate(/obj/structure/overfloor_catwalk) in src) + underfloor_accessibility = UNDERFLOOR_INTERACTABLE + +/turf/proc/is_below_sound_pressure() + var/datum/gas_mixture/GM = unsafe_return_air() + if(isnull(GM) || GM.returnPressure() < SOUND_MINIMUM_PRESSURE) + return TRUE + +/// Call to move a turf from its current area to a new one +/turf/proc/change_area(area/old_area, area/new_area) + //dont waste our time + if(old_area == new_area) + return + + //move the turf + old_area.turfs_to_uncontain += src + new_area.contents += src + new_area.contained_turfs += src + + //changes to make after turf has moved + on_change_area(old_area, new_area) + +/// Allows for reactions to an area change without inherently requiring change_area() be called (I hate maploading) +/turf/proc/on_change_area(area/old_area, area/new_area) + transfer_area_lighting(old_area, new_area) + +//A check to see if graffiti should happen +/turf/proc/try_graffiti(mob/vandal, obj/item/tool) + + if(!tool.sharpness) + return FALSE + + if(!vandal.canUseTopic(src, USE_CLOSE) || !vandal.is_holding(tool)) + return FALSE + + if(HAS_TRAIT_FROM(src, TRAIT_NOT_ENGRAVABLE, INNATE_TRAIT)) + to_chat(vandal, span_warning("[src] cannot be engraved!")) + return FALSE + + if(HAS_TRAIT_FROM(src, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) + to_chat(vandal, span_warning("[src] already has an engraving.")) + return FALSE + + var/message = stripped_input(vandal, "Enter a message to engrave.", "Engraving", null ,64, TRUE) + if(!message) + return FALSE + if(is_ic_filtered_for_pdas(message)) + REPORT_CHAT_FILTER_TO_USER(vandal, message) + + if(!vandal.canUseTopic(src, USE_CLOSE) || !vandal.is_holding(tool)) + return TRUE + + vandal.visible_message(span_warning("\The [vandal] begins carving something into \the [src].")) + + if(!do_after(vandal, src, max(2 SECONDS, length(message)), DO_PUBLIC, display = tool)) + return TRUE + + if(!vandal.canUseTopic(src, USE_CLOSE) || !vandal.is_holding(tool)) + return TRUE + vandal.visible_message(span_obviousnotice("[vandal] carves some graffiti into [src].")) + log_graffiti(message, vandal) + AddComponent(/datum/component/engraved, message, TRUE) + + + return TRUE diff --git a/code/game/world.dm b/code/game/world.dm index 3d1da78f07f5..d16dd2551f04 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -34,6 +34,10 @@ GLOBAL_VAR(restart_counter) * All atoms in both compiled and uncompiled maps are initialized() */ /world/New() +#ifdef USE_BYOND_TRACY + #warn USE_BYOND_TRACY is enabled + init_byond_tracy() +#endif log_world("World loaded at [time_stamp()]!") @@ -90,7 +94,7 @@ GLOBAL_VAR(restart_counter) #endif /world/proc/InitTgs() - TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED) + TgsNew(new /datum/tgs_event_handler/impl, TGS_SECURITY_TRUSTED, new /datum/tgs_http_handler/rustg) GLOB.revdata.load_tgs_info() /world/proc/HandleTestRun() @@ -102,7 +106,7 @@ GLOBAL_VAR(restart_counter) #ifdef UNIT_TESTS cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(RunUnitTests)) #else - cb = VARSET_CALLBACK(SSticker, force_ending, TRUE) + cb = CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, end_round)) #endif SSticker.OnRoundstart(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), cb, 10 SECONDS)) @@ -132,6 +136,7 @@ GLOBAL_VAR(restart_counter) GLOB.world_game_log = "[GLOB.log_directory]/game.log" GLOB.world_silicon_log = "[GLOB.log_directory]/silicon.log" GLOB.world_tool_log = "[GLOB.log_directory]/tools.log" + GLOB.world_graffiti_log = "[GLOB.log_directory]/graffiti.log" GLOB.world_suspicious_login_log = "[GLOB.log_directory]/suspicious_logins.log" GLOB.world_mecha_log = "[GLOB.log_directory]/mecha.log" GLOB.world_virus_log = "[GLOB.log_directory]/virus.log" @@ -158,6 +163,8 @@ GLOBAL_VAR(restart_counter) GLOB.demo_log = "[GLOB.log_directory]/demo.log" + //Config Error Log must be set later to ensure that we move the files over. + #ifdef UNIT_TESTS GLOB.test_log = "[GLOB.log_directory]/tests.log" start_log(GLOB.test_log) @@ -183,10 +190,15 @@ GLOBAL_VAR(restart_counter) var/latest_changelog = file("[global.config.directory]/../html/changelogs/archive/" + time2text(world.timeofday, "YYYY-MM") + ".yml") GLOB.changelog_hash = fexists(latest_changelog) ? md5(latest_changelog) : 0 //for telling if the changelog has changed recently + + // Okay, we have a properly constructed log directory and we're all clean and safe. Sort the config error log properly. if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") fdel(GLOB.config_error_log) + // NOW we can change the write directory handle over. + GLOB.config_error_log = "[GLOB.log_directory]/config_error.log" + if(GLOB.round_id) log_game("Round ID: [GLOB.round_id]") @@ -300,8 +312,8 @@ GLOBAL_VAR(restart_counter) log_world("World rebooted at [time_stamp()]") - TgsReboot() - shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. + shutdown_logging() // Past this point, no logging procs can be used besides log_world() at risk of data loss. + TgsReboot() // TGS can decide to kill us right here, so it's important to do it last ..() /world/proc/update_status() @@ -343,6 +355,37 @@ GLOBAL_VAR(restart_counter) else hub_password = "SORRYNOPASSWORD" +/** + * Handles incresing the world's maxx var and intializing the new turfs and assigning them to the global area. + * If map_load_z_cutoff is passed in, it will only load turfs up to that z level, inclusive. + * This is because maploading will handle the turfs it loads itself. + */ +/world/proc/increase_max_x(new_maxx, map_load_z_cutoff = maxz) + if(new_maxx <= maxx) + return + var/old_max = world.maxx + maxx = new_maxx + if(!map_load_z_cutoff) + return + var/area/global_area = GLOB.areas_by_type[world.area] // We're guaranteed to be touching the global area, so we'll just do this + var/list/to_add = block( + locate(old_max + 1, 1, 1), + locate(maxx, maxy, map_load_z_cutoff)) + global_area.contained_turfs += to_add + +/world/proc/increase_max_y(new_maxy, map_load_z_cutoff = maxz) + if(new_maxy <= maxy) + return + var/old_maxy = maxy + maxy = new_maxy + if(!map_load_z_cutoff) + return + var/area/global_area = GLOB.areas_by_type[world.area] // We're guarenteed to be touching the global area, so we'll just do this + var/list/to_add = block( + locate(1, old_maxy + 1, 1), + locate(maxx, maxy, map_load_z_cutoff)) + global_area.contained_turfs += to_add + /world/proc/incrementMaxZ() maxz++ SSmobs.MaxZChanged() @@ -372,6 +415,22 @@ GLOBAL_VAR(restart_counter) /world/proc/on_tickrate_change() SStimer?.reset_buckets() +/world/proc/init_byond_tracy() + var/library + + switch (system_type) + if (MS_WINDOWS) + library = "prof.dll" + if (UNIX) + library = "libprof.so" + else + CRASH("Unsupported platform: [system_type]") + + var/init_result = call_ext(library, "init")() + if (init_result != "0") + CRASH("Error initializing byond-tracy: [init_result]") + + /world/Profile(command, type, format) if((command & PROFILE_STOP) || !global.config?.loaded || !CONFIG_GET(flag/forbid_all_profiling)) . = ..() diff --git a/code/modules/NTNet/netdata.dm b/code/modules/NTNet/netdata.dm deleted file mode 100644 index 042240333569..000000000000 --- a/code/modules/NTNet/netdata.dm +++ /dev/null @@ -1,126 +0,0 @@ -// This netlink class shares a list to two devices -// This allows skipping of sending many many packets -// just to update simple data -/datum/netlink - var/server_id - var/server_network - var/port - var/passkey = null // sends auth data used to check if we can connect or send data to a device - var/list/data - -/datum/netlink/New(datum/component/ntnet_interface/conn, port) - data = conn.registered_sockets[port] - ASSERT(data != null) - server_id = conn.hardware_id - server_network = conn.network.network_id - src.port = port - RegisterSignal(conn, COMSIG_COMPONENT_NTNET_PORT_DESTROYED, PROC_REF(_server_disconnected)) - ..() - -/datum/netlink/proc/_server_disconnected(datum/component/com) - SIGNAL_HANDLER - data = null - -/datum/netlink/Destroy() - passkey = null - data = null - return ..() - -// If you don't want to use this fine, but this just shows how the system works - -// I hate you all. I want to operator overload [] -// So fuck you all, Do NOT access data directly you freaks -// or this breaks god knows what. -// FINE, you don't have to use get, is dirty or even clean -// proc overhead is WAY more important than fucking clarity or -// sealed classes. But for the LOVE OF GOD make sure _updated -// is set if your going to do this. -/datum/netlink/proc/get(idx) - return data ? data[idx] : null - -/datum/netlink/proc/put(idx, V) - // is it posable to do this async without worry about racing conditions? - if(data && data[idx] != V) - data["_updated"] = TRUE - data[idx] = V - - -/datum/netlink/proc/is_dirty() - return data && data["_updated"] - -/datum/netlink/proc/clean() - if(data) - data["_updated"] = FALSE - -/datum/netlink/proc/is_connected() - return data != null - - - -/datum/netdata - //this requires some thought later on but for now it's fine. (WarlockD) ARRRRG - // Packets are kind of shaped like IPX. IPX had a network, a node (aka id) and a port. - // Special case with receiver_id == null, that wil broadcast to the network_id - // Also, if the network id is not the same for both sender and receiver the packet is dropped. - var/sender_id - var/receiver_id - var/network_id - var/passkey = null // sends auth data used to check if we can connect or send data to a device - var/list/data = list() - // Used for packet queuing - var/datum/netdata/next = null - var/mob/user = null // used for sending error messages - -/datum/netdata/New(list/data = null) - if(!data) - data = list() - src.data = data - -/datum/netdata/Destroy() - data = null - passkey = null - next = null - user = null - return ..() - -/datum/netdata/proc/clone(deep_copy=FALSE) - var/datum/netdata/C = new - C.sender_id = sender_id - C.receiver_id = receiver_id - C.network_id = network_id - C.passkey = passkey - C.user = user - C.next = null - if(deep_copy) - C.data = deep_copy_list(data) - else - C.data = data - return C - - -/datum/netdata/proc/json_to_data(json) - data = json_decode(json) - -/datum/netdata/proc/json_append_to_data(json) - data |= json_decode(json) - -/datum/netdata/proc/data_to_json() - return json_encode(data) - -/datum/netdata/proc/json_list_generation_admin() //for admin logs and such. - . = list() - . |= json_list_generation() - -/datum/netdata/proc/json_list_generation() - . = list() - . |= json_list_generation_netlog() - -/datum/netdata/proc/json_list_generation_netlog() - . = list() - .["network_id"] = network_id - .["sender_id"] = sender_id - .["receiver_id"] = receiver_id - .["data_list"] = data - -/datum/netdata/proc/generate_netlog() - return "[json_encode(json_list_generation_netlog())]" diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm index 141ad73fe522..8a4d4df508f8 100644 --- a/code/modules/NTNet/network.dm +++ b/code/modules/NTNet/network.dm @@ -1,236 +1,12 @@ -/* - * # /datum/ntnet - * - * This class defines each network of the world. Each root network is accessible by any device - * on the same network but NOT accessible to any other "root" networks. All normal devices only have - * one network and one network_id. - * - * This thing replaces radio. Think of wifi but better, bigger and bolder! The idea is that any device - * on a network can reach any other device on that same network if it knows the hardware_id. You can also - * search or broadcast to devices if you know what branch you wish. That is to say you can broadcast to all - * devices on "SS13.ATMOS.SCRUBBERS" to change the settings of all the scrubbers on the station or to - * "SS13.AREA.FRED_HOME.SCRUBBERS" to all the scrubbers at one area. However devices CANNOT communicate cross - * networks normality. - * - */ - -/datum/ntnet - /// The full network name for this network ex. SS13.ATMOS.SCRUBBERS - var/network_id - /// The network name part of this leaf ex ATMOS - var/network_node_id - /// All devices on this network. ALL devices on this network, not just this branch. - /// This list is shared between all leaf networks so we don't have to keep going to the - /// parents on lookups. It is an associated list of hardware_id AND tag_id's - var/list/root_devices - /// This lists has all the networks in this node. Each name is fully qualified - /// ie. SS13.ATMOS.SCRUBBERS, SS13.ATMOS.VENTS, etc - var/list/networks - /// All the devices on this branch of the network - var/list/linked_devices - /// Network children. Associated list using the network_node_id of the child as the key - var/list/children - /// Parrnt of the network. If this is null, we are a oot network - var/datum/ntnet/parent - - -/* - * Creates a new network - * - * Used for /datum/controller/subsystem/networks/proc/create_network so do not - * call yourself as new doesn't do any checking itself - * - * Arguments: - * * net_id - Fully qualified network id for this network - * * net_part_id - sub part of a network if this is a child of P - * * P - Parent network, this will be attached to that network. - */ -/datum/ntnet/New(net_id, net_part_id, datum/ntnet/P = null) - linked_devices = list() - children = list() - network_id = net_id - - if(P) - network_node_id = net_part_id - parent = P - parent.children[network_node_id] = src - root_devices = parent.root_devices - networks = parent.networks - networks[network_id] = src - else - network_node_id = net_id - parent = null - networks = list() - root_devices = linked_devices - SSnetworks.root_networks[network_id] = src - - SSnetworks.networks[network_id] = src - - SSnetworks.add_log("Network was created: [network_id]") - - return ..() - -/// A network should NEVER be deleted. If you don't want to show it exists just check if its -/// empty -/datum/ntnet/Destroy() - networks -= network_id - if(children.len > 0 || linked_devices.len > 0) - CRASH("Trying to delete a network with devices still in them") - - if(parent) - parent.children.Remove(network_id) - parent = null - else - SSnetworks.root_networks.Remove(network_id) - - SSnetworks.networks.Remove(network_id) - - root_devices = null - networks = null - network_node_id = null - SSnetworks.add_log("Network was destroyed: [network_id]") - network_id = null - - return ..() - -/* - * Collects all the devices on this branch of the network and maybe its - * children - * - * Used for broadcasting, this will collect all the interfaces on this - * network and by default everything below this branch. Will return an - * empty list if no devices were found - * - * Arguments: - * * include_children - Include the children of all branches below this - */ -/datum/ntnet/proc/collect_interfaces(include_children=TRUE) - if(!include_children || children.len == 0) - return linked_devices.Copy() - else - /// Please no recursion. Byond hates recursion - var/list/devices = list() - var/list/queue = list(src) // add ourselves - while(queue.len) - var/datum/ntnet/net = queue[queue.len--] - if(net.children.len > 0) - for(var/net_id in net.children) - queue += networks[net_id] - devices += net.linked_devices - return devices - - -/* - * Find if an interface exists on this network - * - * Used to look up a device on the network. - * - * Arguments: - * * tag_or_hid - Ither the hardware id or the id_tag - */ -/datum/ntnet/proc/find_interface(tag_or_hid) - return root_devices[tag_or_hid] - -/** - * Add this interface to this branch of the network. - * - * This will add a network interface to this branch of the network. - * If the interface already exists on the network it will add it and - * give the alias list in the interface this branch name. If the interface - * has an id_tag it will add that name to the root_devices for map lookup - * - * Arguments: - * * interface - ntnet component of the device to add to the network - */ -/datum/ntnet/proc/add_interface(datum/component/ntnet_interface/interface) - if(interface.network) - /// If we are doing a hard jump to a new network, log it - log_telecomms("The device {[interface.hardware_id]} is jumping networks from '[interface.network.network_id]' to '[network_id]'") - interface.network.remove_interface(interface, TRUE) - interface.network ||= src - interface.alias[network_id] = src // add to the alias just to make removing easier. - linked_devices[interface.hardware_id] = interface - root_devices[interface.hardware_id] = interface - if(interface.id_tag != null) // could be a type, never know - root_devices[interface.id_tag] = interface - -/* - * Remove this interface from the network - * - * This will remove an interface from this network and null the network field on the - * interface. Be sure that add_interface is run as soon as posable as an interface MUST - * have a network - * - * Arguments: - * * interface - ntnet component of the device to remove to the network - * * remove_all_alias - remove ALL references to this device on this network - */ -/datum/ntnet/proc/remove_interface(datum/component/ntnet_interface/interface, remove_all_alias=FALSE) - if(!interface.alias[network_id]) - log_telecomms("The device {[interface.hardware_id]} is trying to leave a '[network_id]'' when its on '[interface.network.network_id]'") - return - // just cashing it - var/hardware_id = interface.hardware_id - // Handle the quick case - interface.alias.Remove(network_id) - linked_devices.Remove(hardware_id) - if(remove_all_alias) - var/datum/ntnet/net - for(var/id in interface.alias) - net = interface.alias[id] - net.linked_devices.Remove(hardware_id) - - // Now check if there are more than meets the eye - if(interface.network == src || remove_all_alias) - // Ok, so we got to remove this network, but if we have an alias we are still "on" the network - // so we need to shift down to one of the other networks on the alias list. If the alias list - // is empty, fuck it and remove it from the network. - if(interface.alias.len > 0) - interface.network = interface.alias[1] // ... whatever is there. - else - // ok, hard remove from everything then - root_devices.Remove(interface.hardware_id) - if(interface.id_tag != null) // could be a type, never know - root_devices.Remove(interface.id_tag) - interface.network = null - -/* - * Move interface to another branch of the network - * - * This function is a lightweight way of moving an interface from one branch to another like a gps - * device going from one area to another. Target network MUST be this network or it will fail - * - * Arguments: - * * interface - ntnet component of the device to move - * * target_network - qualified network id to move to - * * original_network - qualified network id from the original network if not this one - */ -/datum/ntnet/proc/move_interface(datum/component/ntnet_interface/interface, target_network, original_network = null) - var/datum/ntnet/net = original_network == null ? src : networks[original_network] - var/datum/ntnet/target = networks[target_network] - if(!target || !net) - log_telecomms("The device {[interface.hardware_id]} is trying to move to a network ([target_network]) that is not on ([network_id])") - return - if(target.linked_devices[interface.hardware_id]) - log_telecomms("The device {[interface.hardware_id]} is trying to move to a network ([target_network]) it is already on.") - return - if(!net.linked_devices[interface.hardware_id]) - log_telecomms("The device {[interface.hardware_id]} is trying to move to a network ([target_network]) but its not on ([net.network_id]) ") - return - net.linked_devices.Remove(interface.hardware_id) - target.linked_devices[interface.hardware_id] = interface - interface.alias.Remove(net.network_id) - interface.alias[target.network_id] = target - - +/// A network should NEVER be deleted. Only the station network is still used, and deleting that causes a lot of problems. +/datum/ntnet/Destroy(force=FALSE) + if(force) + stack_trace("WHICH ONE OF YOU IDIOTS DELETED A /datum/ntnet, [GLOB.AdminProcCaller ? "THE FUCK ARE YOU DOING [GLOB.AdminProcCaller]?": "BECAUSE I DON'T FUCKING KNOW."]") + return ..() + stack_trace("Attempted to delete a /datum/ntnet. This isn't okay.") + return QDEL_HINT_LETMELIVE /datum/ntnet/station_root - var/list/services_by_path = list() //type = datum/ntnet_service - var/list/services_by_id = list() //id = datum/ntnet_service - - var/list/autoinit_service_paths = list() //typepaths - - var/list/available_station_software = list() var/list/available_antag_software = list() var/list/chat_channels = list() @@ -251,63 +27,6 @@ . = ..() SSnetworks.add_log("NTNet logging system activated for [root_name]") - - - -#ifdef NTNET_SERVICE -/datum/ntnet/station_root/Destroy() - for(var/i in services_by_id) - var/S = i - S.disconnect(src, TRUE) - return ..() - - -/datum/ntnet/station_root/proc/find_service_id(id) - return services_by_id[id] - -/datum/ntnet/station_root/proc/find_service_path(path) - return services_by_path[path] - -/datum/ntnet/station_root/proc/register_service(datum/ntnet_service/S) - if(!istype(S)) - return FALSE - if(services_by_path[S.type] || services_by_id[S.id]) - return FALSE - services_by_path[S.type] = S - services_by_id[S.id] = S - return TRUE - -/datum/ntnet/station_root/proc/unregister_service(datum/ntnet_service/S) - if(!istype(S)) - return FALSE - services_by_path -= S.type - services_by_id -= S.id - return TRUE - -/datum/ntnet/station_root/proc/create_service(type) - var/datum/ntnet_service/S = new type - if(!istype(S)) - return FALSE - . = S.connect(src) - if(!.) - qdel(S) - -/datum/ntnet/station_root/proc/destroy_service(type) - var/datum/ntnet_service/S = find_service_path(type) - if(!istype(S)) - return FALSE - . = S.disconnect(src) - if(.) - qdel(src) - -/datum/ntnet/station_root/proc/process_data_transmit(datum/component/ntnet_interface/sender, datum/netdata/data) - if(..()) - for(var/i in services_by_id) - var/datum/ntnet_service/serv = services_by_id[i] - serv.ntnet_intercept(data, src, sender) - return TRUE -#endif - // Checks whether NTNet operates. If parameter is passed checks whether specific function is enabled. /datum/ntnet/station_root/proc/check_function(specific_action = 0) if(!SSnetworks.relays || !SSnetworks.relays.len) // No relays found. NTNet is down @@ -388,10 +107,3 @@ if(NTNET_SYSTEMCONTROL) setting_systemcontrol = !setting_systemcontrol SSnetworks.add_log("Configuration Updated. Wireless network firewall now [setting_systemcontrol ? "allows" : "disallows"] remote control of station's systems.") - - - -/datum/ntnet/station_root/proc/register_map_supremecy() //called at map init to make this what station networks use. - for(var/obj/machinery/ntnet_relay/R in GLOB.machines) - SSnetworks.relays.Add(R) - R.NTNet = src diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm index 63cca33c0c23..7f530b2e4002 100644 --- a/code/modules/NTNet/relays.dm +++ b/code/modules/NTNet/relays.dm @@ -23,6 +23,9 @@ var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay var/dos_dissipate = 0.5 // Amount of DoS "packets" dissipated over time. +/obj/machinery/ntnet_relay/examine(mob/user) + . = ..() + . += span_notice("The front panel ID display reads: [uid]") ///Proc called to change the value of the `relay_enabled` variable and append behavior related to its change. /obj/machinery/ntnet_relay/proc/set_relay_enabled(new_value) @@ -73,12 +76,12 @@ if((dos_overload > dos_capacity) && !dos_failure) set_dos_failure(TRUE) update_appearance() - SSnetworks.add_log("Quantum relay switched from normal operation mode to overload recovery mode.") + SSnetworks.add_log("Relay [uid]: Health check failed, 503 Unavailable. ") // If the DoS buffer reaches 0 again, restart. if((dos_overload == 0) && dos_failure) set_dos_failure(FALSE) update_appearance() - SSnetworks.add_log("Quantum relay switched from overload recovery mode to normal operation mode.") + SSnetworks.add_log("Relay [uid]: Health check normal, Servicing requests.") ..() /obj/machinery/ntnet_relay/ui_interact(mob/user, datum/tgui/ui) @@ -104,11 +107,11 @@ dos_overload = 0 set_dos_failure(FALSE) update_appearance() - SSnetworks.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.") + SSnetworks.add_log("Relay [uid]: Unit restarted, [relay_enabled ? "Relay [uid] added to pool" : "Unit was not added to pool"].") return TRUE if("toggle") set_relay_enabled(!relay_enabled) - SSnetworks.add_log("Quantum relay manually [relay_enabled ? "enabled" : "disabled"].") + SSnetworks.add_log("Relay [uid]: [relay_enabled ? "Unit added to pool" : "Unit removed from pool"].") update_appearance() return TRUE @@ -118,15 +121,13 @@ if(SSnetworks.station_network) SSnetworks.relays.Add(src) - NTNet = SSnetworks.station_network - SSnetworks.add_log("New quantum relay activated. Current amount of linked relays: [SSnetworks.relays.len]") + SSnetworks.add_log("Relay [uid]: Registered, Available nodes:[SSnetworks.relays.len]") . = ..() /obj/machinery/ntnet_relay/Destroy() if(SSnetworks.station_network) SSnetworks.relays.Remove(src) - SSnetworks.add_log("Quantum relay connection severed. Current amount of linked relays: [SSnetworks.relays.len]") - NTNet = null + SSnetworks.add_log("Relay [uid]: Device unavailable, Removed from network, Available nodes: [SSnetworks.relays.len]") for(var/datum/computer_file/program/ntnet_dos/D in dos_sources) D.target = null diff --git a/code/modules/actionspeed/_actionspeed_modifier.dm b/code/modules/actionspeed/_actionspeed_modifier.dm index 71bc966acf4d..3d1de5182453 100644 --- a/code/modules/actionspeed/_actionspeed_modifier.dm +++ b/code/modules/actionspeed/_actionspeed_modifier.dm @@ -32,7 +32,7 @@ can next move var/flags = NONE /// Multiplicative slowdown - var/multiplicative_slowdown = 0 + var/slowdown = 0 /// Other modification datums this conflicts with. var/conflicts_with @@ -99,7 +99,7 @@ GLOBAL_LIST_EMPTY(actionspeed_modification_cache) 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) +/mob/proc/add_or_update_variable_actionspeed_modifier(datum/actionspeed_modifier/type_id_datum, update = TRUE, slowdown) var/modified = FALSE var/inject = FALSE var/datum/actionspeed_modifier/final @@ -122,8 +122,8 @@ GLOBAL_LIST_EMPTY(actionspeed_modification_cache) if(!LAZYACCESS(actionspeed_modification, final.id)) inject = TRUE modified = TRUE - if(!isnull(multiplicative_slowdown)) - final.multiplicative_slowdown = multiplicative_slowdown + if(!isnull(slowdown)) + final.slowdown = slowdown modified = TRUE if(inject) add_actionspeed_modifier(final, FALSE) @@ -149,7 +149,7 @@ GLOBAL_LIST_EMPTY(actionspeed_modification_cache) 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 + var/amt = M.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 @@ -162,7 +162,7 @@ GLOBAL_LIST_EMPTY(actionspeed_modification_cache) ///Adds a default action speed /mob/proc/initialize_actionspeed() - add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, multiplicative_slowdown = 1) + add_or_update_variable_actionspeed_modifier(/datum/actionspeed_modifier/base, slowdown = 1) /// Get the action speed modifiers list of the mob /mob/proc/get_actionspeed_modifiers() @@ -172,4 +172,4 @@ GLOBAL_LIST_EMPTY(actionspeed_modification_cache) /// 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) + . = !(M.slowdown) diff --git a/code/modules/actionspeed/modifiers/addiction.dm b/code/modules/actionspeed/modifiers/addiction.dm index a37693329a05..dfcc8796772c 100644 --- a/code/modules/actionspeed/modifiers/addiction.dm +++ b/code/modules/actionspeed/modifiers/addiction.dm @@ -1,3 +1,3 @@ /datum/actionspeed_modifier/stimulants - multiplicative_slowdown = 0.25 + slowdown = 0.25 id = ACTIONSPEED_ID_STIMULANTS diff --git a/code/modules/actionspeed/modifiers/drugs.dm b/code/modules/actionspeed/modifiers/drugs.dm deleted file mode 100644 index 8309f7fb30fa..000000000000 --- a/code/modules/actionspeed/modifiers/drugs.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/actionspeed_modifier/kronkaine - multiplicative_slowdown = -0.5 - id = ACTIONSPEED_ID_STIMULANTS diff --git a/code/modules/actionspeed/modifiers/mood.dm b/code/modules/actionspeed/modifiers/mood.dm deleted file mode 100644 index d8ed005d42b3..000000000000 --- a/code/modules/actionspeed/modifiers/mood.dm +++ /dev/null @@ -1,7 +0,0 @@ -/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/status_effects.dm b/code/modules/actionspeed/modifiers/status_effects.dm index fa080edb8d00..e240bfe2ff0e 100644 --- a/code/modules/actionspeed/modifiers/status_effects.dm +++ b/code/modules/actionspeed/modifiers/status_effects.dm @@ -1,14 +1,14 @@ /datum/actionspeed_modifier/timecookie - multiplicative_slowdown = -0.05 + slowdown = -0.05 -/datum/actionspeed_modifier/blunt_wound +/datum/actionspeed_modifier/broken_arm variable = TRUE /datum/actionspeed_modifier/nooartrium - multiplicative_slowdown = 0.5 + slowdown = 0.5 /datum/actionspeed_modifier/power_chord - multiplicative_slowdown = -0.15 + slowdown = -0.15 /datum/actionspeed_modifier/status_effect/hazard_area - multiplicative_slowdown = 4 + slowdown = 4 diff --git a/code/modules/admin/admin_clothing/gamemaster.dm b/code/modules/admin/admin_clothing/gamemaster.dm new file mode 100644 index 000000000000..edb61131c4b2 --- /dev/null +++ b/code/modules/admin/admin_clothing/gamemaster.dm @@ -0,0 +1,42 @@ +/obj/item/clothing/head/hooded/gamemaster + name = "old wizard hood" + icon_state = "culthood" + worn_icon_state = "adminhood" + desc = "A torn, dust-caked hood. Strange letters line the inside." + + flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS + flags_cover = HEADCOVERSEYES + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + + clothing_traits = list(TRAIT_NODROP) + + cold_protection = HEAD + min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT + heat_protection = HEAD + max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT + resistance_flags = ALL + +/obj/item/clothing/suit/hooded/gamemaster + name = "old wizard robes" + desc = "A ragged, dusty set of robes. Strange letters line the inside." + + icon_state = "cultrobes" + worn_icon_state = "adminrobes" + body_parts_covered = CHEST|GROIN|LEGS|ARMS + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + flags_inv = HIDEJUMPSUIT + resistance_flags = ALL + + clothing_traits = list(TRAIT_NODROP) + + cold_protection = CHEST|GROIN|LEGS|ARMS + min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT + heat_protection = CHEST|GROIN|LEGS|ARMS + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT + hoodtype = /obj/item/clothing/head/hooded/gamemaster + +/obj/item/clothing/shoes/sandal/gamemaster + resistance_flags = ALL + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + + clothing_traits = list(TRAIT_NODROP) diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 369d5474aa59..f5bd21af3460 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -1,8 +1,14 @@ /atom/proc/investigate_log(message, subject) if(!message || !subject) return - var/F = file("[GLOB.log_directory]/[subject].html") - WRITE_FILE(F, "[time_stamp()] [REF(src)] ([x],[y],[z]) || [src] [message]
") + + var/source = "[src]" + + if(isliving(src)) + var/mob/living/source_mob = src + source += " ([source_mob.ckey ? source_mob.ckey : "*no key*"])" + + rustg_file_append("[time_stamp("YYYY-MM-DD hh:mm:ss")] [REF(src)] ([x],[y],[z]) || [source] [message]
", "[GLOB.log_directory]/[subject].html") /client/proc/investigate_show() set name = "Investigate" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 68993aadb793..069ff70a16e6 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -113,7 +113,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /datum/admins/proc/station_traits_panel, )) GLOBAL_PROTECT(admin_verbs_fun) -GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character, /datum/admins/proc/beaker_panel)) +GLOBAL_LIST_INIT(admin_verbs_spawn, list(/datum/admins/proc/spawn_atom, /datum/admins/proc/podspawn_atom, /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /client/proc/respawn_character, /datum/admins/proc/beaker_panel, /client/proc/spawn_chemdisp_cartridge)) GLOBAL_PROTECT(admin_verbs_spawn) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) GLOBAL_PROTECT(admin_verbs_server) @@ -135,7 +135,8 @@ GLOBAL_PROTECT(admin_verbs_server) /client/proc/toggle_interviews, /client/proc/toggle_require_discord, /client/proc/toggle_hub, - /client/proc/toggle_cdn + /client/proc/toggle_cdn, + /client/proc/set_game_mode ) GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug()) GLOBAL_PROTECT(admin_verbs_debug) @@ -205,7 +206,8 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/admin_ghost, /client/proc/cmd_admin_create_centcom_report, /client/proc/debug_spell_requirements, - /client/proc/analyze_openturf + /client/proc/analyze_openturf, + /client/proc/debug_health, ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, GLOBAL_PROC_REF(release))) @@ -387,7 +389,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, TRUE) init_verbs() if(body && !body.key) body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus @@ -561,8 +563,15 @@ GLOBAL_PROTECT(admin_verbs_hideable) if(range_devastation > zas_settings.maxex_devastation_range || range_heavy > zas_settings.maxex_heavy_range || range_light > zas_settings.maxex_light_range || range_flash > zas_settings.maxex_flash_range || range_flame > zas_settings.maxex_fire_range) if(tgui_alert(usr, "Bomb is bigger than the maxcap. Continue?",,list("Yes","No")) != "Yes") return + epicenter = mob.loc //We need to reupdate as they may have moved again - explosion(epicenter, devastation_range = range_devastation, heavy_impact_range = range_heavy, light_impact_range = range_light, flash_range = range_flash, adminlog = TRUE, ignorecap = TRUE, explosion_cause = mob) + var/smoke = tgui_alert(usr, "Create smoke?", "Drop Bomb", list("Yes", "No")) + if(smoke == "Yes") + smoke = TRUE + else + smoke = FALSE + + explosion(epicenter, devastation_range = range_devastation, heavy_impact_range = range_heavy, light_impact_range = range_light, flame_range = range_flame, flash_range = range_flash, adminlog = TRUE, ignorecap = TRUE, smoke = smoke, explosion_cause = mob) message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [epicenter.loc].") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -949,7 +958,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) // Finally, ensure the minds are tracked and in the manifest. SSticker.minds += character.mind if(ishuman(character)) - GLOB.data_core.manifest_inject(character) + SSdatacore.manifest_inject(character) number_made++ CHECK_TICK @@ -993,3 +1002,30 @@ GLOBAL_PROTECT(admin_verbs_hideable) var/datum/browser/popup = new(mob, "spellreqs", "Spell Requirements", 600, 400) popup.set_content(page_contents) popup.open() + +/client/proc/set_game_mode() + set name = "Set Gamemode" + set category = "Debug" + + if(!check_rights(R_SERVER)) + return + + if(Master.current_runlevel > RUNLEVEL_LOBBY) + to_chat(usr, span_adminnotice("You cannot set the gamemode after the round has started!")) + return + + var/gamemode_path = input(usr, "Select Gamemode", "Set Gamemode") as null|anything in subtypesof(/datum/game_mode) + if(!gamemode_path) + return + + var/fake_name = input(usr, "Fake Gamemode name?", "Set Gamemode") as null|text + if(fake_name) + SSticker.mode_display_name = fake_name + + var/announce = alert(usr, "Announce to players?", "Set Gamemode", "Yes", "No") + + SSticker.mode = new gamemode_path + if(announce == "Yes") + to_chat(world, span_boldannounce("The gamemode is now: [fake_name ? SSticker.mode_display_name : SSticker.mode.name].")) + + message_admins("[key_name_admin(usr)] has set the gamemode to [SSticker.mode.type].") diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 866565ce1732..2745814687d4 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -276,7 +276,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) if(named_arg) named_args[named_arg] = value["value"] else - . += value["value"] + . += list(value["value"]) // Preserve lists, don't unroll if(LAZYLEN(named_args)) . += named_args diff --git a/code/modules/admin/check_antagonists.dm b/code/modules/admin/check_antagonists.dm index fe6a13643bd9..f9d0537b883b 100644 --- a/code/modules/admin/check_antagonists.dm +++ b/code/modules/admin/check_antagonists.dm @@ -124,7 +124,7 @@ tgui_alert(usr, "The game hasn't started yet!") return var/list/dat = list("Round Status

Round Status

") - if(IS_DYNAMIC_GAME_MODE) // Currently only used by dynamic. If more start using this, find a better way. + if(GAMEMODE_WAS_DYNAMIC) // Currently only used by dynamic. If more start using this, find a better way. dat += "Game Mode Panel
" dat += "Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" dat += "Emergency shuttle
" diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 167fe323ba86..bb9fca3039a0 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -13,7 +13,7 @@ /proc/randomize_human(mob/living/carbon/human/H) H.gender = pick(MALE, FEMALE) H.physique = H.gender - H.real_name = random_unique_name(H.gender) + H.set_real_name(random_unique_name(H.gender)) H.name = H.real_name H.underwear = random_underwear(H.gender) H.underwear_color = "#[random_color()]" @@ -35,7 +35,7 @@ H.eye_color_left = random_eye_color H.eye_color_right = random_eye_color - H.dna.blood_type = random_blood_type() + H.dna.blood_type = H.dna.species.get_random_blood_type() // Mutant randomizing, doesn't affect the mob appearance unless it's the specific mutant. H.dna.mutant_colors = random_mutant_colors() diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 3b77c31a564c..a6e343229ac1 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -9,11 +9,11 @@ /obj/effect/fun_balloon/Initialize(mapload) . = ..() - SSobj.processing |= src + START_PROCESSING(SSobj, src) /obj/effect/fun_balloon/Destroy() - SSobj.processing -= src - . = ..() + STOP_PROCESSING(SSobj, src) + return ..() /obj/effect/fun_balloon/process() if(!popped && check() && !QDELETED(src)) diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 27da0649a51a..fa484254f37b 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -32,6 +32,7 @@ GLOBAL_PROTECT(href_token) var/deadmined var/datum/filter_editor/filteriffic + var/datum/particle_editor/particle_test var/datum/colorblind_tester/color_test = new /// Whether or not the user tried to connect, but was blocked by 2FA diff --git a/code/modules/admin/smites/fireball.dm b/code/modules/admin/smites/fireball.dm index 98dad65d8251..bb32024aa313 100644 --- a/code/modules/admin/smites/fireball.dm +++ b/code/modules/admin/smites/fireball.dm @@ -5,3 +5,40 @@ /datum/smite/fireball/effect(client/user, mob/living/target) . = ..() new /obj/effect/temp_visual/target(get_turf(target)) + +/obj/effect/temp_visual/target + icon = 'icons/mob/actions/actions_items.dmi' + icon_state = "sniper_zoom" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + light_outer_range = 2 + duration = 9 + +/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit) + . = ..() + INVOKE_ASYNC(src, PROC_REF(fall), flame_hit) + +/obj/effect/temp_visual/target/proc/fall(list/flame_hit) + var/turf/T = get_turf(src) + playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE) + new /obj/effect/temp_visual/fireball(T) + sleep(duration) + if(ismineralturf(T)) + var/turf/closed/mineral/M = T + M.MinedAway() + playsound(T, SFX_EXPLOSION, 80, TRUE) + T.create_fire(1, 10) + +/obj/effect/temp_visual/fireball + icon = 'icons/obj/wizard.dmi' + icon_state = "fireball" + name = "fireball" + desc = "Get out of the way!" + layer = FLY_LAYER + randomdir = FALSE + duration = 9 + pixel_z = 270 + +/obj/effect/temp_visual/fireball/Initialize(mapload) + . = ..() + animate(src, pixel_z = 0, time = duration) diff --git a/code/modules/admin/smites/puzzle.dm b/code/modules/admin/smites/puzzle.dm deleted file mode 100644 index bf5429411c08..000000000000 --- a/code/modules/admin/smites/puzzle.dm +++ /dev/null @@ -1,8 +0,0 @@ -/// Turns the user into a sliding puzzle -/datum/smite/puzzle - name = "Puzzle" - -/datum/smite/puzzle/effect(client/user, mob/living/target) - . = ..() - if(!puzzle_imprison(target)) - to_chat(user, span_warning("Imprisonment failed!"), confidential = TRUE) diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index 68661c419099..30fc2258dd58 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -287,7 +287,10 @@ var/break_counter = 0 output += "
" - for(var/datum/job_department/department as anything in SSjob.joinable_departments) + for(var/datum/job_department/department as anything in SSjob.departments) + if(department.is_not_real_department) + continue + var/label_class = department.label_class var/department_name = department.department_name output += "
" @@ -335,7 +338,6 @@ ROLE_BRAINWASHED, ROLE_DEATHSQUAD, ROLE_DRONE, - ROLE_LAVALAND, ROLE_MIND_TRANSFER, ROLE_POSIBRAIN, ROLE_SENTIENCE, diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index fabdeeb62e95..67180d4c83d5 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -201,7 +201,7 @@ if(tgui_alert(usr, "This will end the round, are you SURE you want to do this?", "Confirmation", list("Yes", "No")) == "Yes") if(tgui_alert(usr, "Final Confirmation: End the round NOW?", "Confirmation", list("Yes", "No")) == "Yes") message_admins(span_adminnotice("[key_name_admin(usr)] has ended the round.")) - SSticker.force_ending = 1 //Yeah there we go APC destroyed mission accomplished + SSticker.end_round()//Yeah there we go APC destroyed mission accomplished return else message_admins(span_adminnotice("[key_name_admin(usr)] decided against ending the round.")) @@ -439,7 +439,7 @@ else if(href_list["f_dynamic_roundstart"]) if(!check_rights(R_ADMIN)) return - if(SSticker?.mode) + if(Master.current_runlevel > RUNLEVEL_LOBBY) return tgui_alert(usr, "The game has already started.") var/roundstart_rules = list() for (var/rule in subtypesof(/datum/dynamic_ruleset/roundstart)) @@ -473,7 +473,7 @@ if(!check_rights(R_ADMIN)) return - if(SSticker?.mode) + if(Master.current_runlevel > RUNLEVEL_LOBBY) return tgui_alert(usr, "The game has already started.") dynamic_mode_options(usr) @@ -507,7 +507,7 @@ if(!check_rights(R_ADMIN)) return - if(SSticker?.mode) + if(Master.current_runlevel > RUNLEVEL_LOBBY) return tgui_alert(usr, "The game has already started.") var/new_value = input(usr, "Enter the forced threat level for dynamic mode.", "Forced threat level") as num @@ -826,13 +826,12 @@ var/status switch (M.stat) if(CONSCIOUS) - status = "Alive" - if(SOFT_CRIT) - status = "Dying" + if(!HAS_TRAIT(M, TRAIT_SOFT_CRITICAL_CONDITION)) + status = "Alive" + else + status = "Dying" if(UNCONSCIOUS) status = "Unconscious" - if(HARD_CRIT) - status = "Unconscious and Dying" if(DEAD) status = "Dead" health_description = "Status = [status]" @@ -1259,7 +1258,7 @@ O.name = obj_name if(ismob(O)) var/mob/M = O - M.real_name = obj_name + M.set_real_name(obj_name) if(where == "inhand" && isliving(usr) && isitem(O)) var/mob/living/L = usr var/obj/item/I = O @@ -1556,7 +1555,7 @@ if(!check_rights(R_ADMIN)) return var/code = random_nukecode() - for(var/obj/machinery/nuclearbomb/selfdestruct/SD in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/selfdestruct/SD in INSTANCES_OF(/obj/machinery/nuclearbomb)) SD.r_code = code message_admins("[key_name_admin(usr)] has set the self-destruct \ code to \"[code]\".") diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index a2c3a9459136..fb22126b8be4 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -204,6 +204,9 @@ message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!")) log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!") return FALSE + var/prompt = tgui_alert(usr, "Run SDQL2 Query?", "SDQL2", list("Yes", "Cancel")) + if (prompt != "Yes") + return var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]") if(length(results) == 3) for(var/I in 1 to 3) @@ -730,7 +733,11 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/sdql2_vv_all, new(null var/atom/A = object var/turf/T = A.loc var/area/a - if(istype(T)) + if(isturf(A)) + a = A.loc + T = A //this should prevent the "inside" part + text_list += " at [ADMIN_COORDJMP(A)]" + else if(istype(T)) text_list += " at [T] [ADMIN_COORDJMP(T)]" a = T.loc else diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index cfd8cdc24817..47516da16328 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -10,7 +10,7 @@ return message_admins("[key_name_admin(src)] has started answering [ADMIN_LOOKUPFLW(M)]'s prayer.") - var/msg = input("Message:", text("Subtle PM to [M.key]")) as text|null + var/msg = input("Message:", "Subtle PM to [M.key]") as text|null if(!msg) message_admins("[key_name_admin(src)] decided not to answer [ADMIN_LOOKUPFLW(M)]'s prayer") @@ -69,7 +69,7 @@ if(!check_rights(R_ADMIN)) return - var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text|null + var/msg = input("Message:","Enter the text you wish to appear to everyone:") as text|null if (!msg) return @@ -89,7 +89,7 @@ var/range = input("Range:", "Narrate to mobs within how many tiles:", 7) as num|null if(!range) return - var/msg = input("Message:", text("Enter the text you wish to appear to everyone within view:")) as text|null + var/msg = input("Message:", "Enter the text you wish to appear to everyone within view:") as text|null if (!msg) return for(var/mob/M in view(range,A)) @@ -112,7 +112,7 @@ if(!M) return - var/msg = input("Message:", text("Enter the text you wish to appear to your target:")) as text|null + var/msg = input("Message:", "Enter the text you wish to appear to your target:") as text|null if( !msg ) return @@ -246,7 +246,7 @@ SSshuttle.emergency.setTimer(SSshuttle.last_call_time) priority_announce("Warning: Emergency Shuttle uplink reestablished, shuttle enabled.", "LRSV Icarus Announcement", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg') -/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) +/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in INSTANCES_OF(/obj/machinery/nuclearbomb)) set category = "Admin.Events" set name = "Toggle Nuke" set popup_menu = FALSE diff --git a/code/modules/admin/verbs/adminfun.dm b/code/modules/admin/verbs/adminfun.dm index 5eff1a41a4a7..cca3bd276521 100644 --- a/code/modules/admin/verbs/adminfun.dm +++ b/code/modules/admin/verbs/adminfun.dm @@ -7,19 +7,19 @@ if(!check_rights(R_ADMIN)) return - var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null + var/devastation = input("Range of total devastation. -1 to none", "Input") as num|null if(devastation == null) return - var/heavy = input("Range of heavy impact. -1 to none", text("Input")) as num|null + var/heavy = input("Range of heavy impact. -1 to none", "Input") as num|null if(heavy == null) return - var/light = input("Range of light impact. -1 to none", text("Input")) as num|null + var/light = input("Range of light impact. -1 to none", "Input") as num|null if(light == null) return - var/flash = input("Range of flash. -1 to none", text("Input")) as num|null + var/flash = input("Range of flash. -1 to none", "Input") as num|null if(flash == null) return - var/flames = input("Range of flames. -1 to none", text("Input")) as num|null + var/flames = input("Range of flames. -1 to none", "Input") as num|null if(flames == null) return @@ -40,10 +40,10 @@ if(!check_rights(R_ADMIN)) return - var/heavy = input("Range of heavy pulse.", text("Input")) as num|null + var/heavy = input("Range of heavy pulse.", "Input") as num|null if(heavy == null) return - var/light = input("Range of light pulse.", text("Input")) as num|null + var/light = input("Range of light pulse.", "Input") as num|null if(light == null) return diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index 2b7b4fe9080d..6d4a585060f8 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -44,6 +44,7 @@ if(M.client.byond_version) full_version = "[M.client.byond_version].[M.client.byond_build ? M.client.byond_build : "xxx"]" body += "
\[Byond version: [full_version]\]
" + body += "
Input Mode: [M.client.hotkeys ? "Using Hotkeys" : "Using Classic Input"]
" body += "

\[ " @@ -207,17 +208,17 @@ Traitors and the like can also be revived with the previous role mostly intact. var/datum/data/record/record_found //Referenced to later to either randomize or not randomize the character. if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something - /*Try and locate a record for the person being respawned through GLOB.data_core. + /*Try and locate a record for the person being respawned through SSdatacore. This isn't an exact science but it does the trick more often than not.*/ var/id = md5("[G_found.real_name][G_found.mind.assigned_role.title]") - record_found = find_record("id", id, GLOB.data_core.locked) + record_found = SSdatacore.find_record("id", id, DATACORE_RECORDS_LOCKED) if(record_found)//If they have a record we can determine a few things. - new_character.real_name = record_found.fields["name"] - new_character.gender = record_found.fields["gender"] - new_character.age = record_found.fields["age"] - new_character.hardset_dna(record_found.fields["identity"], record_found.fields["enzymes"], null, record_found.fields["name"], record_found.fields["blood_type"], new record_found.fields["species"], record_found.fields["features"]) + new_character.set_real_name(record_found.fields[DATACORE_NAME]) + new_character.gender = record_found.fields[DATACORE_GENDER] + new_character.age = record_found.fields[DATACORE_AGE] + new_character.hardset_dna(record_found.fields[DATACORE_DNA_IDENTITY], record_found.fields["enzymes"], null, record_found.fields[DATACORE_NAME], record_found.fields[DATACORE_BLOOD_TYPE], new record_found.fields[DATACORE_SPECIES], record_found.fields[DATACORE_DNA_FEATURES]) else new_character.randomize_human_appearance() new_character.dna.update_dna_identity() @@ -281,7 +282,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if(!record_found && (new_character.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) //Power to the user! if(tgui_alert(new_character,"Warning: No data core entry detected. Would you like to announce the arrival of this character by adding them to various databases, such as medical records?",,list("No","Yes"))=="Yes") - GLOB.data_core.manifest_inject(new_character) + SSdatacore.manifest_inject(new_character) if(tgui_alert(new_character,"Would you like an active AI to announce this character?",,list("No","Yes"))=="Yes") announce_arrival(new_character, new_character.mind.assigned_role.title) @@ -385,10 +386,10 @@ Traitors and the like can also be revived with the previous role mostly intact. for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED)) var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] - atom_hud.add_hud_to(mob) + atom_hud.show_to(mob) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) - antag_hud.add_hud_to(mob) + antag_hud.show_to(mob) mob.lighting_alpha = mob.default_lighting_alpha() mob.update_sight() @@ -401,10 +402,10 @@ Traitors and the like can also be revived with the previous role mostly intact. for (var/hudtype in list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED)) var/datum/atom_hud/atom_hud = GLOB.huds[hudtype] - atom_hud.remove_hud_from(mob) + atom_hud.hide_from(mob) for (var/datum/atom_hud/alternate_appearance/basic/antagonist_hud/antag_hud in GLOB.active_alternate_appearances) - antag_hud.remove_hud_from(mob) + antag_hud.hide_from(mob) mob.lighting_alpha = mob.default_lighting_alpha() mob.update_sight() @@ -457,6 +458,7 @@ Traitors and the like can also be revived with the previous role mostly intact. dat += "
SET ALL MEASURES: ON | OFF
" dat += "
Disable ghosts zoom and t-ray verbs (except staff): [SSlag_switch.measures[DISABLE_GHOST_ZOOM_TRAY] ? "On" : "Off"]
" dat += "Disable late joining: [SSlag_switch.measures[DISABLE_NON_OBSJOBS] ? "On" : "Off"]
" + dat += "Disable VV Icon Preview Generation: [SSlag_switch.measures[DISABLE_VV_ICON_PREVIEW] ? "On" : "Off"]
" dat += "
============! MAD GHOSTS ZONE !============
" dat += "Disable deadmob keyLoop (except staff, informs dchat): [SSlag_switch.measures[DISABLE_DEAD_KEYLOOP] ? "On" : "Off"]
" dat += "==========================================
" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ed91510024c7..c0402cecec21 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -401,7 +401,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) var/admin_msg = span_adminnotice(span_adminhelp("Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [keywords_lookup(msg)]")) AddInteraction("[LinkedReplyName(ref_src)]: [msg]") - AddInteractionPlayer("[LinkedReplyName(ref_src)]: [msg]") // PARIAH EDIT ADDITION -- Player ticket viewing + AddInteractionPlayer("[LinkedReplyName(ref_src)]: [msg]") log_admin_private("Ticket #[id]: [key_name(initiator)]: [msg]") //send this msg to all admins @@ -412,13 +412,15 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) to_chat(X, type = MESSAGE_TYPE_ADMINPM, html = admin_msg, - confidential = TRUE) + confidential = TRUE + ) //show it to the person adminhelping too to_chat(initiator, type = MESSAGE_TYPE_ADMINPM, - html = span_adminnotice("PM to-Admins: [msg]"), - confidential = TRUE) + html = span_adminnotice("[CHAT_TAG("help.png")] [key_name(initiator)]:[msg]"), + confidential = TRUE + ) SSblackbox.LogAhelp(id, "Ticket Opened", msg, null, initiator.ckey, urgent = urgent) //Reopen a closed ticket diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index c3f9817cc967..fa136c9ce29f 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -1,4 +1,4 @@ -/client/proc/jumptoarea(area/A in GLOB.sortedAreas) +/client/proc/jumptoarea(area/A in get_sorted_areas()) set name = "Jump to Area" set desc = "Area to jump to" set category = "Admin.Game" @@ -10,7 +10,7 @@ return var/list/turfs = list() - for(var/turf/T in A) + for(var/turf/T in A.get_contained_turfs()) if(T.density) continue turfs.Add(T) @@ -159,14 +159,17 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return - if(!length(GLOB.sortedAreas)) + var/list/sorted_areas = get_sorted_areas() + if(!length(sorted_areas)) to_chat(src, "No areas found.", confidential = TRUE) return - var/area/target_area = tgui_input_list(src, "Pick an area", "Send Mob", GLOB.sortedAreas) + + var/area/target_area = tgui_input_list(src, "Pick an area", "Send Mob", sorted_areas) if(isnull(target_area)) return if(!istype(target_area)) return + var/list/turfs = get_area_turfs(target_area) if(length(turfs) && jumper.forceMove(pick(turfs))) log_admin("[key_name(usr)] teleported [key_name(jumper)] to [AREACOORD(jumper)]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 0d1e96946bb0..6cc11f561350 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -7,7 +7,7 @@ if(!holder) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM-Context: Only administrators may use this command."), + html = span_alert("Error: Admin-PM-Context: Only administrators may use this command."), confidential = TRUE) return if(!ismob(M) || !M.client) @@ -22,9 +22,10 @@ if(!holder) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM-Panel: Only administrators may use this command."), + html = span_alert("Error: Admin-PM-Panel: Only administrators may use this command."), confidential = TRUE) return + var/list/targets = list() for(var/client/client as anything in GLOB.clients) if(client.mob) @@ -44,7 +45,7 @@ if(prefs.muted & MUTE_ADMINHELP) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: You are unable to use admin PM-s (muted)."), + html = span_alert("Error: Admin-PM: You are unable to use admin PM-s (muted)."), confidential = TRUE) return var/client/C @@ -58,7 +59,7 @@ if(holder) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: Client not found."), + html = span_alert("Error: Admin-PM: Client not found."), confidential = TRUE) return @@ -86,11 +87,11 @@ else to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: Client not found."), + html = span_alert("Error: Admin-PM: Client not found."), confidential = TRUE) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = "[span_danger("Message not sent:")]
[msg]", + html = "[span_alert("Message not sent:")]
[msg]", confidential = TRUE) AH.AddInteraction("No client found, message not sent:
[msg]") return @@ -102,14 +103,14 @@ if(prefs.muted & MUTE_ADMINHELP) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: You are unable to use admin PM-s (muted)."), + html = span_alert("Error: Admin-PM: You are unable to use admin PM-s (muted)."), confidential = TRUE) return if(!holder && !current_ticket) //no ticket? https://www.youtube.com/watch?v=iHSPf6x1Fdo to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be."), + html = span_alert("You can no longer reply to this ticket, please open another one by using the Adminhelp verb if need be."), confidential = TRUE) to_chat(src, type = MESSAGE_TYPE_ADMINPM, @@ -134,7 +135,7 @@ if(!recipient) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: Client not found."), + html = span_alert("Error: Admin-PM: Client not found."), confidential = TRUE) return @@ -152,7 +153,7 @@ if(holder) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Use the admin IRC/Discord channel, nerd."), + html = span_alert("Error: Use the admin IRC/Discord channel, nerd."), confidential = TRUE) return @@ -172,11 +173,11 @@ if(holder) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: Client not found."), + html = span_alert("Error: Admin-PM: Client not found."), confidential = TRUE) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = "[span_danger("Message not sent:")]
[msg]", + html = "[span_alert("Message not sent:")]
[msg]", confidential = TRUE) if(recipient_ticket) recipient_ticket.AddInteraction("No client found, message not sent:
[msg]") @@ -189,7 +190,7 @@ if(prefs.muted & MUTE_ADMINHELP) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: You are unable to use admin PM-s (muted)."), + html = span_alert("Error: Admin-PM: You are unable to use admin PM-s (muted)."), confidential = TRUE) return @@ -212,8 +213,10 @@ if(external) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_notice("PM to-Admins: [rawmsg]"), - confidential = TRUE) + html = span_notice("[CHAT_TAG("pm_out.png")] [rawmsg]"), + confidential = TRUE + ) + var/datum/admin_help/AH = admin_ticket_log(src, "Reply PM from-[key_name(src, TRUE, TRUE)] to External: [keywordparsedmsg]") AH.AddInteractionPlayer("Reply PM from-[key_name(src, TRUE, FALSE)] to External: [keywordparsedmsg]") // PARIAH EDIT ADDITION -- Player ticket viewing externalreplyamount-- @@ -222,38 +225,48 @@ var/badmin = FALSE //Lets figure out if an admin is getting bwoinked. if(holder && recipient.holder && !current_ticket) //Both are admins, and this is not a reply to our own ticket. badmin = TRUE + if(recipient.holder && !badmin) SEND_SIGNAL(current_ticket, COMSIG_ADMIN_HELP_REPLIED) if(holder) to_chat(recipient, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Admin PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]"), - confidential = TRUE) + html = span_alert("[CHAT_TAG("pm_in.png")] [key_name(src, TRUE, TRUE)]: [keywordparsedmsg]"), + confidential = TRUE + ) + to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_notice("Admin PM to-[key_name(recipient, src, 1)]: [keywordparsedmsg]"), - confidential = TRUE) + html = span_notice("[CHAT_TAG("pm_out.png")] [key_name(src, TRUE, TRUE)]: [keywordparsedmsg]"), + confidential = TRUE + ) + //omg this is dumb, just fill in both their tickets var/interaction_message = "PM from-[key_name(src, recipient, 1)] to-[key_name(recipient, src, 1)]: [keywordparsedmsg]" - // admin_ticket_log(src, interaction_message, log_in_blackbox = FALSE) // PARIAH EDIT ORIGINAL - admin_ticket_log(src, interaction_message, log_in_blackbox = FALSE, admin_only = FALSE) // PARIAH EDIT CHANGE -- Player ticket viewing + + admin_ticket_log(src, interaction_message, log_in_blackbox = FALSE, admin_only = FALSE) if(recipient != src)//reeee - // admin_ticket_log(recipient, interaction_message, log_in_blackbox = FALSE) // PARIAH EDIT ORIGINAL - admin_ticket_log(recipient, interaction_message, log_in_blackbox = FALSE, admin_only = FALSE) // PARIAH EDIT CHANGE -- Player ticket viewing + admin_ticket_log(recipient, interaction_message, log_in_blackbox = FALSE, admin_only = FALSE) + SSblackbox.LogAhelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey) + else //recipient is an admin but sender is not - var/replymsg = "Reply PM from-[key_name(src, recipient, 1)]: [keywordparsedmsg]" - // admin_ticket_log(src, "[replymsg]", log_in_blackbox = FALSE) // PARIAH EDIT ORIGINAL + var/replymsg = "[key_name(src, recipient, 1)]: [keywordparsedmsg]" admin_ticket_log(src, "[replymsg]", log_in_blackbox = FALSE, admin_only = FALSE) // PARIAH EDIT CHANGE -- Player ticket viewing + to_chat(recipient, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("[replymsg]"), - confidential = TRUE) + html = span_alert("[CHAT_TAG("pm_in.png")] [replymsg]"), + confidential = TRUE + ) + to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_notice("PM to-Admins: [msg]"), - confidential = TRUE) + html = span_notice("[CHAT_TAG("pm_out.png")] Admins: [msg]"), + confidential = TRUE + ) + SSblackbox.LogAhelp(current_ticket.id, "Reply", msg, recipient.ckey, src.ckey) //play the receiving admin the adminhelp sound (if they have them enabled) @@ -263,12 +276,10 @@ if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT var/already_logged = FALSE if(!recipient.current_ticket) - //new /datum/admin_help(msg, recipient, TRUE) //ORIGINAL - new /datum/admin_help(msg, recipient, TRUE, src) //PARIAH EDIT CHANGE - ADMIN + new /datum/admin_help(msg, recipient, TRUE, src) already_logged = TRUE SSblackbox.LogAhelp(recipient.current_ticket.id, "Ticket Opened", msg, recipient.ckey, src.ckey) - //PARIAH EDIT ADDITION BEGIN - ADMIN if(recipient.current_ticket.handler) if(recipient.current_ticket.handler != usr.ckey) var/response = tgui_alert(usr, "This ticket is already being handled by [recipient.current_ticket.handler]. Do you want to continue?", "Ticket already assigned", list("Yes", "No")) @@ -277,26 +288,31 @@ return else recipient.current_ticket.HandleIssue() - //PARIAH EDIT ADDITION END + + var/recipient_message = "\ +
\ +
\ + Administrator PM from [admin_pm_href(src, key_name(src, FALSE, FALSE), "color:#00379e")]\ +
\ +
\ + [span_adminsay(msg)]\ +
\ +
\ + [admin_pm_href(src, "< Click here to reply >", "color: #00379e")]\ +
" to_chat(recipient, type = MESSAGE_TYPE_ADMINPM, - html = "-- Administrator private message --", - confidential = TRUE) - to_chat(recipient, - type = MESSAGE_TYPE_ADMINPM, - html = span_adminsay("Admin PM from-[key_name(src, recipient, 0)]: [msg]"), - confidential = TRUE) - to_chat(recipient, - type = MESSAGE_TYPE_ADMINPM, - html = span_adminsay("Click on the administrator's name to reply."), - confidential = TRUE) + html = recipient_message, + confidential = TRUE + ) + to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_notice("Admin PM to-[key_name(recipient, src, 1)]: [msg]"), - confidential = TRUE) + html = span_notice("[CHAT_TAG("pm_out.png")] [key_name(recipient, src, 1)]: [msg]"), + confidential = TRUE + ) - // admin_ticket_log(recipient, "PM From [key_name_admin(src)]: [keywordparsedmsg]", log_in_blackbox = FALSE) // PARIAH EDIT ORIGINAL admin_ticket_log(recipient, "PM From [key_name_admin(src, FALSE)]: [keywordparsedmsg]", log_in_blackbox = FALSE, admin_only = FALSE) // PARIAH EDIT CHANGE -- Player ticket viewing if(!already_logged) //Reply to an existing ticket @@ -309,12 +325,15 @@ if(!current_ticket) to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = span_danger("Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."), - confidential = TRUE) + html = span_alert("Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."), + confidential = TRUE + ) + to_chat(src, type = MESSAGE_TYPE_ADMINPM, - html = "[span_danger("Message not sent:")]
[msg]", - confidential = TRUE) + html = "[span_alert("Message not sent:")]
[msg]", + confidential = TRUE + ) return current_ticket.MessageNoRecipient(msg) @@ -324,17 +343,21 @@ to_chat(X, type = MESSAGE_TYPE_ADMINPM, html = span_notice("PM: [key_name(src, X, 0)]->External: [keywordparsedmsg]"), - confidential = TRUE) + confidential = TRUE + ) + else window_flash(recipient, ignorepref = TRUE) log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]") + //we don't use message_admins here because the sender/receiver might get it too for(var/client/X in GLOB.admins) if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient to_chat(X, type = MESSAGE_TYPE_ADMINPM, - html = span_notice("PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]") , - confidential = TRUE) + html = span_notice("[CHAT_TAG("pm_other.png")] : [key_name(src, X, 0)]->[key_name(recipient, X, 0)]: [keywordparsedmsg]") , + confidential = TRUE + ) #define TGS_AHELP_USAGE "Usage: ticket " /proc/TgsPm(target,msg,sender) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 3ff5c6802e6f..bf4bee715a75 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -26,7 +26,7 @@ msg = keywords_lookup(msg) var/asay_color = prefs.read_preference(/datum/preference/color/asay_color) var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && asay_color) ? "" : "" - msg = "[span_adminsay("[span_prefix("ADMIN:")] [key_name(usr, 1)] [ADMIN_FLW(mob)]: [custom_asay_color][msg]")][custom_asay_color ? "":null]" + msg = "[span_adminsay("[CHAT_TAG("admin.png")] [key_name(usr, 1)] [ADMIN_FLW(mob)]: [custom_asay_color][msg]")][custom_asay_color ? "":null]" to_chat(GLOB.admins, type = MESSAGE_TYPE_ADMINCHAT, html = msg, diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index e38226eaa781..5392f135085d 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -155,7 +155,7 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme) priority_announce("As punishment for this station's poor productivity when compared to neighbor stations, names and identities will be restricted until further notice.", PA_TITLE_COMMAND_REPORT, sub_title = "Finance Report") /datum/anonymous_theme/employees/anonymous_name(mob/target) - var/is_head_of_staff = target.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND + var/is_head_of_staff = target.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER var/name = "[is_head_of_staff ? "Manager" : "Employee"] " for(var/i in 1 to 6) if(prob(30) || i == 1) diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index c0d290e0f67a..5cf8b43d054d 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -4,22 +4,27 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return + + #ifndef DEBUG_MAPS + to_chat(src, span_bolddanger("DEBUG_MAPS is not defined, this does not work!")) + #endif + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Plumbing") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //all plumbing - yes, some things might get stated twice, doesn't matter. - for(var/obj/machinery/atmospherics/components/pipe in GLOB.machines) + for(var/obj/machinery/atmospherics/components/pipe in ::atmospherics) if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]", confidential = TRUE) //Pipes - for(var/obj/machinery/atmospherics/pipe/pipe in GLOB.machines) + for(var/obj/machinery/atmospherics/pipe/pipe in ::atmospherics) if(istype(pipe, /obj/machinery/atmospherics/pipe/smart) || istype(pipe, /obj/machinery/atmospherics/pipe/layer_manifold)) continue if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes))) to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]", confidential = TRUE) //Nodes - for(var/obj/machinery/atmospherics/node1 in GLOB.machines) + for(var/obj/machinery/atmospherics/node1 in ::atmospherics) for(var/obj/machinery/atmospherics/node2 in node1.nodes) if(!(node1 in node2.nodes)) to_chat(usr, "One-way connection in [node1.name] located at [ADMIN_VERBOSEJMP(node1)]", confidential = TRUE) @@ -45,12 +50,14 @@ results += "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [ADMIN_VERBOSEJMP(C)]" for(var/turf/T in world.contents) - var/found_one = FALSE - for(var/obj/structure/cable/C in T.contents) - if(found_one) - results += "Doubled wire at [ADMIN_VERBOSEJMP(C)]" - else - found_one = TRUE + for(var/obj/structure/cable/cable in T.contents) + var/directions = cable.linked_dirs + for(var/obj/structure/cable/other_cable in T.contents) + if(cable == other_cable) + continue + if(other_cable.linked_dirs == directions) + results += "Doubled wire at [ADMIN_VERBOSEJMP(cable)]" + var/obj/machinery/power/terminal/term = locate(/obj/machinery/power/terminal) in T.contents if(term) var/obj/structure/cable/C = locate(/obj/structure/cable) in T.contents diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 75e2749ed396..54769b5d3847 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -1,7 +1,6 @@ /client/proc/dsay(msg as text) set category = "Admin.Game" set name = "Dsay" - set hidden = TRUE if(!holder) to_chat(src, "Only administrators may use this command.", confidential = TRUE) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index f22cdf09b531..807d384bf01b 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -60,8 +60,7 @@ if (isnull(chosen_name)) return - pai.name = chosen_name - pai.real_name = pai.name + pai.set_real_name(chosen_name) pai.key = choice.key card.setPersonality(pai) for(var/datum/pai_candidate/candidate in SSpai.candidates) @@ -111,7 +110,7 @@ return if(ishuman(M)) var/mob/living/carbon/human/H = M - var/obj/item/worn = H.wear_id + var/obj/item/worn = H.wear_id.GetID(TRUE) var/obj/item/card/id/id = null if(worn) @@ -180,6 +179,8 @@ if(tgui_alert(usr,"This mob is being controlled by [M.key]. Are you sure you wish to give someone else control of it? [M.key] will be made a ghost.",,list("Yes","No")) != "Yes") return var/client/newkey = input(src, "Pick the player to put in control.", "New player") as null|anything in sort_list(GLOB.clients) + if(isnull(newkey)) + return var/mob/oldmob = newkey.mob var/delmob = FALSE if((isobserver(oldmob) || tgui_alert(usr,"Do you want to delete [newkey]'s old mob?","Delete?",list("Yes","No")) != "No")) @@ -227,7 +228,7 @@ message_admins(span_adminnotice("[key_name_admin(usr)] used the Test Areas debug command checking [log_message].")) log_admin("[key_name(usr)] used the Test Areas debug command checking [log_message].") - for(var/area/A in world) + for(var/area/A as anything in GLOB.areas) if(on_station) var/list/area_turfs = get_area_turfs(A.type) if (!length(area_turfs)) @@ -240,7 +241,7 @@ areas_all.Add(A.type) CHECK_TICK - for(var/obj/machinery/power/apc/APC in GLOB.apcs_list) + for(var/obj/machinery/power/apc/APC as anything in INSTANCES_OF(/obj/machinery/power/apc)) var/area/A = APC.area if(!A) dat += "Skipped over [APC] in invalid location, [APC.loc]." @@ -251,7 +252,7 @@ areas_with_multiple_APCs.Add(A.type) CHECK_TICK - for(var/obj/machinery/airalarm/AA in GLOB.machines) + for(var/obj/machinery/airalarm/AA as anything in INSTANCES_OF(/obj/machinery/airalarm)) var/area/A = get_area(AA) if(!A) //Make sure the target isn't inside an object, which results in runtimes. dat += "Skipped over [AA] in invalid location, [AA.loc].
" @@ -260,7 +261,7 @@ areas_with_air_alarm.Add(A.type) CHECK_TICK - for(var/obj/machinery/requests_console/RC in GLOB.machines) + for(var/obj/machinery/requests_console/RC as anything in INSTANCES_OF(/obj/machinery/requests_console)) var/area/A = get_area(RC) if(!A) dat += "Skipped over [RC] in invalid location, [RC.loc].
" @@ -269,7 +270,7 @@ areas_with_RC.Add(A.type) CHECK_TICK - for(var/obj/machinery/light/L in GLOB.machines) + for(var/obj/machinery/light/L as anything in INSTANCES_OF(/obj/machinery/light)) var/area/A = get_area(L) if(!A) dat += "Skipped over [L] in invalid location, [L.loc].
" @@ -278,7 +279,7 @@ areas_with_light.Add(A.type) CHECK_TICK - for(var/obj/machinery/light_switch/LS in GLOB.machines) + for(var/obj/machinery/light_switch/LS as anything in INSTANCES_OF(/obj/machinery/light_switch)) var/area/A = get_area(LS) if(!A) dat += "Skipped over [LS] in invalid location, [LS.loc].
" @@ -287,7 +288,7 @@ areas_with_LS.Add(A.type) CHECK_TICK - for(var/obj/item/radio/intercom/I in GLOB.machines) + for(var/obj/item/radio/intercom/I as anything in INSTANCES_OF(/obj/item/radio/intercom)) var/area/A = get_area(I) if(!A) dat += "Skipped over [I] in invalid location, [I.loc].
" @@ -296,7 +297,7 @@ areas_with_intercom.Add(A.type) CHECK_TICK - for(var/obj/machinery/camera/C in GLOB.machines) + for(var/obj/machinery/camera/C as anything in INSTANCES_OF(/obj/machinery/camera)) var/area/A = get_area(C) if(!A) dat += "Skipped over [C] in invalid location, [C.loc].
" diff --git a/code/modules/admin/verbs/ert.dm b/code/modules/admin/verbs/ert.dm index c23d3eea2964..cb599abd2689 100644 --- a/code/modules/admin/verbs/ert.dm +++ b/code/modules/admin/verbs/ert.dm @@ -208,7 +208,7 @@ //Open the Armory doors if(ertemplate.opendoors) - for(var/obj/machinery/door/poddoor/ert/door in GLOB.airlocks) + for(var/obj/machinery/door/poddoor/ert/door in INSTANCES_OF(/obj/machinery/door)) door.open() CHECK_TICK return TRUE diff --git a/code/modules/admin/verbs/fix_air.dm b/code/modules/admin/verbs/fix_air.dm index e8ca8f4220ea..36735e42b47d 100644 --- a/code/modules/admin/verbs/fix_air.dm +++ b/code/modules/admin/verbs/fix_air.dm @@ -17,11 +17,11 @@ var/current_time = world.timeofday // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter/S in GLOB.machines) + for(var/obj/machinery/power/supermatter/S as anything in INSTANCES_OF(/obj/machinery/power/supermatter)) S.power = 0 S.damage = 0 - to_chat(usr, "\[1/5\] - Supermatter depowered.") + to_chat(usr, "\[1/6\] - Supermatter depowered.") // Remove all gases from all pipenets for(var/datum/pipeline/PN as anything in SSairmachines.networks) @@ -29,13 +29,16 @@ G.gas = list() G.total_moles = 0 - to_chat(usr, "\[2/5\] - All pipenets purged of gas.") + to_chat(usr, "\[2/6\] - All pipenets purged of gas.") // Delete all zones. for(var/zone/Z in world) Z.invalidate() - to_chat(usr, "\[3/5\] - All ZAS Zones removed.") + to_chat(usr, "\[3/6\] - All ZAS Zones removed.") + + QDEL_LIST(SSzas.active_hotspots) + to_chat(usr, "\[4/6\] - Deleted all hotspots.") for(var/turf/T in world) if(!T.simulated) @@ -45,10 +48,10 @@ qdel(effect) T.zone = null - to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") + to_chat(usr, "\[5/6\] - All turfs reset to roundstart values.") SSzas.Reboot() - to_chat(usr, "\[5/5\] - ZAS Rebooted") + to_chat(usr, "\[6/6\] - ZAS Rebooted") to_chat(world, "Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") return TRUE diff --git a/code/modules/admin/verbs/hiddenprints.dm b/code/modules/admin/verbs/hiddenprints.dm index 7b42601ffd29..15baceda10a6 100644 --- a/code/modules/admin/verbs/hiddenprints.dm +++ b/code/modules/admin/verbs/hiddenprints.dm @@ -3,13 +3,13 @@ return var/interface = "A log of every player who has touched [victim], sorted by last touch.

    " - var/victim_hiddenprints = victim.return_hiddenprints() + var/victim_hiddenprints = victim.return_touch_log() if(!islist(victim_hiddenprints)) victim_hiddenprints = list() var/list/hiddenprints = flatten_list(victim_hiddenprints) - remove_nulls_from_list(hiddenprints) + list_clear_nulls(hiddenprints) if(!length(hiddenprints)) hiddenprints = list("Nobody has touched this yet!") diff --git a/code/modules/admin/verbs/individual_logging.dm b/code/modules/admin/verbs/individual_logging.dm index f22c5fe4b423..8e213c95e7a5 100644 --- a/code/modules/admin/verbs/individual_logging.dm +++ b/code/modules/admin/verbs/individual_logging.dm @@ -38,6 +38,8 @@ dat += " | " dat += individual_logging_panel_link(M, INDIVIDUAL_OOC_LOG, LOGSRC_MOB, "OOC Log", source, ntype) dat += " | " + dat += individual_logging_panel_link(M, INDIVIDUAL_HEALTH_LOG, LOGSRC_MOB, "Health Log", source, ntype) + dat += " | " dat += individual_logging_panel_link(M, INDIVIDUAL_SHOW_ALL_LOG, LOGSRC_MOB, "Show All", source, ntype) dat += "" diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm index f860364779b1..3837f8e838bd 100644 --- a/code/modules/admin/verbs/manipulate_organs.dm +++ b/code/modules/admin/verbs/manipulate_organs.dm @@ -35,7 +35,7 @@ return organ = organs[organ] organ = new organ - organ.implant(C) + organ.implant(C, BODY_ZONE_CHEST) log_admin("[key_name(usr)] has added implant [organ.type] to [key_name(C)]") message_admins("[key_name_admin(usr)] has added implant [organ.type] to [ADMIN_LOOKUPFLW(C)]") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 90429729eacf..ab4cf1fd0dd1 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -292,28 +292,62 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) /client/proc/create_mapping_job_icons() set name = "Generate job landmarks icons" set category = "Mapping" - var/icon/final = icon() + + var/icon/compiled_icon = icon() var/mob/living/carbon/human/dummy/D = new(locate(1,1,1)) //spawn on 1,1,1 so we don't have runtimes when items are deleted D.setDir(SOUTH) + + var/list/completed = list() + + // Handle AI and borg specially + compiled_icon.Insert(icon('icons/mob/ai.dmi', "ai", SOUTH, 1), "AI") + compiled_icon.Insert(icon('icons/mob/robots.dmi', "robot", SOUTH, 1), "Cyborg") + for(var/job in subtypesof(/datum/job)) var/datum/job/JB = new job switch(JB.title) - if(JOB_AI) - final.Insert(icon('icons/mob/ai.dmi', "ai", SOUTH, 1), "AI") - if(JOB_CYBORG) - final.Insert(icon('icons/mob/robots.dmi', "robot", SOUTH, 1), "Cyborg") + if(JOB_AI, JOB_CYBORG) + continue + else - for(var/obj/item/I in D) - qdel(I) + D.wipe_inventory() randomize_human(D) D.dress_up_as_job(JB, TRUE) - var/icon/I = icon(getFlatIcon(D), frame = 1) - final.Insert(I, JB.title) + var/icon/I = getFlatIcon(D, no_anim = TRUE) + fcopy(I, "icons/mob/job_icons_temp/[JB.title].dmi") + completed += JB.title + qdel(D) + + // Byond bug. Need to put it back into the icon cache, since all the stuff above pushes it out. + compiled_icon = icon(compiled_icon) + + for(var/title in completed) + var/icon/I = icon("icons/mob/job_icons_temp/[title].dmi") + compiled_icon.Insert(I, title) + + // Clear out the temp folder + fdel("icons/mob/job_icons_temp/") + //Also add the x for(var/x_number in 1 to 4) - final.Insert(icon('icons/hud/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]") - fcopy(final, "icons/mob/landmarks.dmi") + compiled_icon.Insert(icon('icons/hud/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]") + + var/list/old_states = icon_states("icons/mob/autogen_landmarks.dmi") + + fcopy(compiled_icon, "icons/mob/autogen_landmarks.dmi") + + var/list/new_states = icon_states("icons/mob/autogen_landmarks.dmi") + var/list/removed_states = old_states - new_states + var/list/added_states = new_states - old_states + if(length(added_states) || length(removed_states)) + to_chat(world, span_danger("Icon states have been added and/or removed. Ensure this is correct.")) + for(var/state in removed_states) + to_chat(world, span_obviousnotice("REMOVED: [state].")) + for(var/state in added_states) + to_chat(world, span_obviousnotice("ADDED: [state].")) + + to_chat(world, "All done :)") /client/proc/debug_z_levels() set name = "Debug Z-Levels" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index c2112c224d10..bbc9e5ddc3e4 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -19,11 +19,9 @@ usr.name_archive = usr.real_name usr.forceMove(O) - usr.real_name = O.name - usr.name = O.name + usr.set_real_name(O.name) usr.reset_perspective(O) usr.control_object = O - O.AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds) SSblackbox.record_feedback("tally", "admin_verb", 1, "Possess Object") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /proc/release() @@ -34,14 +32,12 @@ return if(usr.name_archive) //if you have a name archived - usr.real_name = usr.name_archive + usr.set_real_name(usr.name_archive) usr.name_archive = "" - usr.name = usr.real_name if(ishuman(usr)) var/mob/living/carbon/human/H = usr - H.name = H.get_visible_name() + H.update_name() - usr.control_object.RemoveElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds) usr.forceMove(get_turf(usr.control_object)) usr.reset_perspective() usr.control_object = null diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 944c836a01b3..9e21ae0a6e32 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -56,7 +56,7 @@ GLOB.requests.message_centcom(sender.client, msg) msg = span_adminnotice("CENTCOM:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)]: [msg]") to_chat(GLOB.admins, msg, confidential = TRUE) - for(var/obj/machinery/computer/communications/console in GLOB.machines) + for(var/obj/machinery/computer/communications/console as anything in INSTANCES_OF(/obj/machinery/computer/communications)) console.override_cooldown() /// Used by communications consoles to message the Syndicate @@ -65,7 +65,7 @@ GLOB.requests.message_syndicate(sender.client, msg) msg = span_adminnotice("SYNDICATE:[ADMIN_FULLMONTY(sender)] [ADMIN_SYNDICATE_REPLY(sender)]: [msg]") to_chat(GLOB.admins, msg, confidential = TRUE) - for(var/obj/machinery/computer/communications/console in GLOB.machines) + for(var/obj/machinery/computer/communications/console as anything in INSTANCES_OF(/obj/machinery/computer/communications)) console.override_cooldown() /// Used by communications consoles to request the nuclear launch codes @@ -74,5 +74,5 @@ GLOB.requests.nuke_request(sender.client, msg) msg = span_adminnotice("NUKE CODE REQUEST:[ADMIN_FULLMONTY(sender)] [ADMIN_CENTCOM_REPLY(sender)] [ADMIN_SET_SD_CODE]: [msg]") to_chat(GLOB.admins, msg, confidential = TRUE) - for(var/obj/machinery/computer/communications/console in GLOB.machines) + for(var/obj/machinery/computer/communications/console as anything in INSTANCES_OF(/obj/machinery/computer/communications)) console.override_cooldown() diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 74f75a92d586..dae3e1d48250 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -70,7 +70,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if("maint_access_engiebrig") if(!is_debugger) return - for(var/obj/machinery/door/airlock/maintenance/M in GLOB.machines) + for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door)) M.check_access() if (ACCESS_MAINT_TUNNELS in M.req_access) M.req_access = list() @@ -79,7 +79,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if("maint_access_brig") if(!is_debugger) return - for(var/obj/machinery/door/airlock/maintenance/M in GLOB.machines) + for(var/obj/machinery/door/airlock/maintenance/M in INSTANCES_OF(/obj/machinery/door)) M.check_access() if (ACCESS_MAINT_TUNNELS in M.req_access) M.req_access = list(ACCESS_BRIG) @@ -102,7 +102,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if("list_bombers") var/dat = "Bombing List
    " for(var/l in GLOB.bombers) - dat += text("[l]
    ") + dat += "[l]
    " holder << browse(dat, "window=bombers") if("list_signalers") @@ -120,8 +120,8 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if("manifest") var/dat = "Showing Crew Manifest.
    " dat += "" - for(var/datum/data/record/t in GLOB.data_core.general) - dat += "" + for(var/datum/data/record/t in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + dat += "" dat += "
    NamePosition
    [t.fields["name"]][t.fields["rank"]][t.fields["rank"] != t.fields["trim"] ? " ([t.fields["trim"]])" : ""]
    [t.fields[DATACORE_NAME]][t.fields[DATACORE_RANK]][t.fields[DATACORE_RANK] != t.fields[DATACORE_TRIM] ? " ([t.fields[DATACORE_TRIM]])" : ""]
    " holder << browse(dat, "window=manifest;size=440x410") if("dna") @@ -331,7 +331,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Egalitarian Station")) - for(var/obj/machinery/door/airlock/W in GLOB.machines) + for(var/obj/machinery/door/airlock/W in INSTANCES_OF(/obj/machinery/door)) if(is_station_level(W.z) && !istype(get_area(W), /area/station/command) && !istype(get_area(W), /area/station/commons) && !istype(get_area(W), /area/station/service) && !istype(get_area(W), /area/station/command/heads_quarters) && !istype(get_area(W), /area/station/security/prison)) W.req_access = list() message_admins("[key_name_admin(holder)] activated Egalitarian Station mode") priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.") @@ -357,23 +357,26 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) A.power_change() for(var/obj/machinery/light_switch/light_switch in A) light_switch.update_appearance() - stoplag() + CHECK_TICK + if("blackout") if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Break All Lights")) message_admins("[key_name_admin(holder)] broke all lights") - for(var/obj/machinery/light/L in GLOB.machines) + for(var/obj/machinery/light/L as anything in INSTANCES_OF(/obj/machinery/light)) L.break_light_tube() - stoplag() + CHECK_TICK + if("whiteout") if(!is_funmin) return SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Fix All Lights")) message_admins("[key_name_admin(holder)] fixed all lights") - for(var/obj/machinery/light/L in GLOB.machines) + for(var/obj/machinery/light/L as anything in INSTANCES_OF(/obj/machinery/light)) L.fix() - stoplag() + CHECK_TICK + if("customportal") if(!is_funmin) return @@ -521,7 +524,7 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) var/forename = names.len > 1 ? names[2] : names[1] var/newname = "[forename]-[pick(honorifics["[H.gender]"])]" H.fully_replace_character_name(H.real_name,newname) - H.update_mutant_bodyparts() + H.update_body() if(animetype == "Yes") var/seifuku = pick(typesof(/obj/item/clothing/under/costume/schoolgirl)) var/obj/item/clothing/under/costume/schoolgirl/I = new seifuku @@ -533,20 +536,6 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller) ADD_TRAIT(I, TRAIT_NODROP, ADMIN_TRAIT) else to_chat(H, span_warning("You're not kawaii enough for this!"), confidential = TRUE) - if("masspurrbation") - if(!is_funmin) - return - mass_purrbation() - message_admins("[key_name_admin(holder)] has put everyone on \ - purrbation!") - log_admin("[key_name(holder)] has put everyone on purrbation.") - if("massremovepurrbation") - if(!is_funmin) - return - mass_remove_purrbation() - message_admins("[key_name_admin(holder)] has removed everyone from \ - purrbation.") - log_admin("[key_name(holder)] has removed everyone from purrbation.") if("massimmerse") if(!is_funmin) return diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 876435e4c7bc..a0cf89b18787 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -217,7 +217,7 @@ qdel(item) var/obj/item/organ/brain/human_brain = human_target.getorganslot(BRAIN) - human_brain.destroy_all_skillchips() // get rid of skillchips to prevent runtimes + human_brain?.destroy_all_skillchips() // get rid of skillchips to prevent runtimes if(dresscode != "Naked") human_target.equipOutfit(dresscode) diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index 441698436db4..7e775915f1fc 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -77,7 +77,7 @@ if(confirm == "Cancel") return if(confirm == "Yes") - SSticker.force_ending = 1 + SSticker.end_round() SSblackbox.record_feedback("tally", "admin_verb", 1, "End Round") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/toggleooc() diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm index 78e3a6457a7e..01234e631524 100644 --- a/code/modules/admin/verbs/spawnobjasmob.dm +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -59,7 +59,7 @@ basemob.maxHealth = basemob.maxHealth = mainsettings["maxhealth"]["value"] if (mainsettings["name"]["value"]) - basemob.name = basemob.real_name = html_decode(mainsettings["name"]["value"]) + basemob.set_real_name(html_decode(mainsettings["name"]["value"])) if (mainsettings["ckey"]["value"] != "none") basemob.ckey = mainsettings["ckey"]["value"] diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 8e9d77cf098d..dc645993aad0 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -1,99 +1,125 @@ #define VV_HTML_ENCODE(thing) ( sanitize ? html_encode(thing) : thing ) /// Get displayed variable in VV variable list -/proc/debug_variable(name, value, level, datum/D, sanitize = TRUE) //if D is a list, name will be index, and value will be assoc value. - var/header - if(D) - if(islist(D)) +/proc/debug_variable(name, value, level, datum/owner, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value. + if(owner) + if(islist(owner)) var/index = name if (value) - name = D[name] //name is really the index until this line + name = owner[name] //name is really the index until this line else - value = D[name] - header = "
  1. ([VV_HREF_TARGET_1V(D, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(D, VV_HK_LIST_REMOVE, "-", index)]) " + value = owner[name] + . = "
  2. ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_REMOVE, "-", index)]) " else - header = "
  3. ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(D, VV_HK_BASIC_MASSEDIT, "M", name)]) " + . = "
  4. ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_MASSEDIT, "M", name)]) " else - header = "
  5. " + . = "
  6. " - var/item var/name_part = VV_HTML_ENCODE(name) - if(level > 0 || islist(D)) //handling keys in assoc lists + if(level > 0 || islist(owner)) //handling keys in assoc lists if(istype(name,/datum)) name_part = "[VV_HTML_ENCODE(name)] [REF(name)]" else if(islist(name)) - var/list/L = name - name_part = " /list ([length(L)]) [REF(name)]" + var/list/list_value = name + name_part = " /list ([length(list_value)]) [REF(name)]" - if (isnull(value)) - item = "[name_part] = null" + . = "[.][name_part] = " - else if (istext(value)) - item = "[name_part] = \"[VV_HTML_ENCODE(value)]\"" + var/item = _debug_variable_value(name, value, level, owner, sanitize, display_flags) - else if (isicon(value)) + return "[.][item]
  7. " + +// This is split into a seperate proc mostly to make errors that happen not break things too much +/proc/_debug_variable_value(name, value, level, datum/owner, sanitize, display_flags) + . = "DISPLAY_ERROR: ([value] [REF(value)])" // Make sure this line can never runtime + + if(isnull(value)) + return "null" + + if(istext(value)) + return "\"[VV_HTML_ENCODE(value)]\"" + + if(isicon(value)) #ifdef VARSICON - var/icon/I = icon(value) + var/icon/icon_value = icon(value) var/rnd = rand(1,10000) - var/rname = "tmp[REF(I)][rnd].png" - usr << browse_rsc(I, rname) - item = "[name_part] = ([value]) " + var/rname = "tmp[REF(icon_value)][rnd].png" + usr << browse_rsc(icon_value, rname) + return "([value]) " #else - item = "[name_part] = /icon ([value])" + return "/icon ([value])" #endif - else if (isfile(value)) - item = "[name_part] = '[value]'" + if(isappearance(value)) + var/image/actually_an_appearance = value + return "/appearance (
    icon: [actually_an_appearance.icon]
    state: [actually_an_appearance.icon_state]
    plane: [actually_an_appearance.plane]
    layer: [actually_an_appearance.layer]
    )" - else if(istype(value,/matrix)) // Needs to be before datum - var/matrix/M = value - item = {"[name_part] = -
      - - - - - - -
    [M.a][M.d]0
    [M.b][M.e]0
    [M.c][M.f]1
     
    "} //TODO link to modify_transform wrapper for all matrices - else if (istype(value, /datum)) - var/datum/DV = value - if ("[DV]" != "[DV.type]") //if the thing as a name var, lets use it. - item = "[name_part] = [DV] [DV.type] [REF(value)]" - else - item = "[name_part] = [DV.type] [REF(value)]" - if(istype(value,/datum/weakref)) - var/datum/weakref/weakref = value - item += " (Resolve)" + if(isfilter(value)) + var/datum/filter_value = value + return "/filter ([filter_value.type] [REF(filter_value)])" + + if(isfile(value)) + return "'[value]'" - else if (islist(value)) - var/list/L = value + if(isdatum(value)) + var/datum/datum_value = value + return datum_value.debug_variable_value(name, level, owner, sanitize, display_flags) + + if(islist(value) || (name in GLOB.vv_special_lists)) // Some special lists arent detectable as a list through istype + var/list/list_value = value var/list/items = list() - if (L.len > 0 && !(name == "underlays" || name == "overlays" || L.len > (IS_NORMAL_LIST(L) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD))) - for (var/i in 1 to L.len) - var/key = L[i] + // This is becuse some lists either dont count as lists or a locate on their ref will return null + var/link_vars = "Vars=[REF(value)]" + if(name in GLOB.vv_special_lists) + link_vars = "Vars=[REF(owner)];special_varname=[name]" + + if (!(display_flags & VV_ALWAYS_CONTRACT_LIST) && list_value.len > 0 && list_value.len <= (IS_NORMAL_LIST(list_value) ? VV_NORMAL_LIST_NO_EXPAND_THRESHOLD : VV_SPECIAL_LIST_NO_EXPAND_THRESHOLD)) + for (var/i in 1 to list_value.len) + var/key = list_value[i] var/val - if (IS_NORMAL_LIST(L) && !isnum(key)) - val = L[key] + if (IS_NORMAL_LIST(list_value) && !isnum(key)) + val = list_value[key] if (isnull(val)) // we still want to display non-null false values, such as 0 or "" val = key key = i items += debug_variable(key, val, level + 1, sanitize = sanitize) - item = "[name_part] = /list ([L.len])
      [items.Join()]
    " + return "/list ([list_value.len])
      [items.Join()]
    " else - item = "[name_part] = /list ([L.len])" + return "/list ([list_value.len])" - else if (name in GLOB.bitfields) + if(name in GLOB.bitfields) var/list/flags = list() for (var/i in GLOB.bitfields[name]) if (value & GLOB.bitfields[name][i]) flags += i - item = "[name_part] = [VV_HTML_ENCODE(jointext(flags, ", "))]" + if(length(flags)) + return "[VV_HTML_ENCODE(jointext(flags, ", "))]" + else + return "NONE" else - item = "[name_part] = [VV_HTML_ENCODE(value)]" + return "[VV_HTML_ENCODE(value)]" + +/datum/proc/debug_variable_value(name, level, datum/owner, sanitize, display_flags) + if("[src]" != "[type]") // If we have a name var, let's use it. + return "[src] [type] [REF(src)]" + else + return "[type] [REF(src)]" + +/datum/weakref/debug_variable_value(name, level, datum/owner, sanitize, display_flags) + . = ..() + return "[.] (Resolve)" - return "[header][item]" +/matrix/debug_variable_value(name, level, datum/owner, sanitize, display_flags) + return {" +
      + + + + + + +
    [a][d]0
    [b][e]0
    [c][f]1
     
    "} //TODO link to modify_transform wrapper for all matrices #undef VV_HTML_ENCODE diff --git a/code/modules/admin/view_variables/particle_editor.dm b/code/modules/admin/view_variables/particle_editor.dm new file mode 100644 index 000000000000..dcda7a6e0df6 --- /dev/null +++ b/code/modules/admin/view_variables/particle_editor.dm @@ -0,0 +1,199 @@ +/datum/particle_editor + /// movable whose particles we want to be editing + var/atom/movable/target + +/datum/particle_editor/New(atom/target) + src.target = target + +/datum/particle_editor/ui_state(mob/user) + return GLOB.admin_state + +/datum/particle_editor/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "ParticleEdit") + ui.open() + +/datum/particle_editor/ui_assets(mob/user) + . = ..() + . += get_asset_datum(/datum/asset/simple/particle_editor) + +///returns ui_data values for the particle editor +/particles/proc/return_ui_representation(mob/user) + var/data = list() + //affect entire set: no generators + data["width"] = width //float + data["height"] = height //float + data["count"] = count //float + data["spawning"] = spawning //float + data["bound1"] = islist(bound1) ? bound1 : list(bound1,bound1,bound1) //float OR list(x, y, z) + data["bound2"] = islist(bound2) ? bound2 : list(bound2,bound2,bound2) //float OR list(x, y, z) + data["gravity"] = gravity //list(x, y, z) + data["gradient"] = gradient //gradient array list(number, string, number, string, "loop", "space"=COLORSPACE_RGB) + data["transform"] = transform //list(a, b, c, d, e, f) OR list(xx,xy,xz, yx,yy,yz, zx,zy,zz) OR list(xx,xy,xz, yx,yy,yz, zx,zy,zz, cx,cy,cz) OR list(xx,xy,xz,xw, yx,yy,yz,yw, zx,zy,zz,zw, wx,wy,wz,ww) + + //applied on spawn + if(islist(icon)) + var/list/icon_data = list() + for(var/file in icon) + icon_data["[file]"] = icon[file] + data["icon"] = icon_data + else + data["icon"] = "[icon]" //list(icon = weight) OR file reference + data["icon_state"] = icon_state // list(icon_state = weight) OR string + if(isgenerator(lifespan)) + data["lifespan"] = return_generator_args(lifespan) + else + data["lifespan"] = lifespan //float + if(isgenerator(fade)) + data["fade"] = return_generator_args(fade) + else + data["fade"] = fade //float + if(isgenerator(fadein)) + data["fadein"] = return_generator_args(fadein) + else + data["fadein"] = fadein //float + if(isgenerator(color)) + data["color"] = return_generator_args(color) + else + data["color"] = color //float OR string + if(isgenerator(color_change)) + data["color_change"] = return_generator_args(color_change) + else + data["color_change"] = color_change //float + if(isgenerator(position)) + data["position"] = return_generator_args(position) + else + data["position"] = position //list(x,y) OR list(x,y,z) + if(isgenerator(velocity)) + data["velocity"] = return_generator_args(velocity) + else + data["velocity"] = velocity //list(x,y) OR list(x,y,z) + if(isgenerator(scale)) + data["scale"] = return_generator_args(scale) + else + data["scale"] = scale + if(isgenerator(grow)) + data["grow"] = return_generator_args(grow) + else + data["grow"] = grow //float OR list(x,y) + if(isgenerator(rotation)) + data["rotation"] = return_generator_args(rotation) + else + data["rotation"] = rotation + if(isgenerator(spin)) + data["spin"] = return_generator_args(spin) + else + data["spin"] = spin //float + if(isgenerator(friction)) + data["friction"] = return_generator_args(friction) + else + data["friction"] = friction //float: 0-1 + + //evaluated every tick + if(isgenerator(drift)) + data["drift"] = return_generator_args(drift) + else + data["drift"] = drift + return data + +/datum/particle_editor/ui_data(mob/user) + var/list/data = list() + data["target_name"] = target.name + if(!target.particles) + target.particles = new /particles + data["particle_data"] = target.particles.return_ui_representation(user) + return data + +/datum/particle_editor/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("delete_and_close") + ui.close() + target.particles = null + target = null + . = FALSE + if("new_type") + var/new_type = pick_closest_path(/particles, make_types_fancy(typesof(/particles))) + if(!new_type) + return FALSE + target.particles = new new_type + target.particles.datum_flags |= DF_VAR_EDITED + . = TRUE + if("transform_size") + var/list/values = list("Simple Matrix" = 6, "Complex Matrix" = 12, "Projection Matrix" = 16) + var/new_size = values[params["new_value"]] + if(!new_size) + return FALSE + . = TRUE + target.particles.datum_flags |= DF_VAR_EDITED + if(!target.particles.transform) + target.particles.transform = new /list(new_size) + return + var/size = length(target.particles.transform) + if(size < new_size) + target.particles.transform += new /list(new_size-size) + return + //transform is not cast as a list + var/list/holder = target.particles.transform + holder.Cut(new_size) + if("edit") + var/particles/owner = target.particles + var/param_var_name = params["var"] + if(!(param_var_name in owner.vars)) + return FALSE + var/var_value = params["new_value"] + var/var_mod = params["var_mod"] + // we can only return arrays from tgui so lets convert it to something usable if needed + switch(var_mod) + if(P_DATA_GENERATOR) + //these MUST be vectors and the others MUST be floats + if(var_value[1] in list(GEN_VECTOR, GEN_BOX)) + if(!islist(var_value[2])) + var_value[2] = list(var_value[2],var_value[2],var_value[2]) + if(!islist(var_value[3])) + var_value[3] = list(var_value[3],var_value[3],var_value[3]) + //this means we just switched off a vector-requiring generator type + else if(islist(var_value[2]) && islist(var_value[3])) + var_value[2] = var_value[1] + var_value[3] = var_value[1] + var_value = generator(arglist(var_value)) + if(P_DATA_ICON_ADD) + var_value = input("Pick icon:", "Icon") as null|icon + if(!var_value) + return FALSE + var/list/new_values = list() + new_values += var_value + new_values[var_value] = 1 + if(isicon(owner.icon)) + new_values[owner.icon] = 1 + owner.icon = new_values + else if(islist(owner.icon)) + owner.icon[var_value] = 1 + else + owner.icon = new_values + target.particles.datum_flags |= DF_VAR_EDITED + return TRUE + if(P_DATA_ICON_REMOVE) + for(var/file in owner.icon) + if("[file]" == var_value) + owner.icon -= file + UNSETEMPTY(owner.icon) + target.particles.datum_flags |= DF_VAR_EDITED + return TRUE + if(P_DATA_ICON_WEIGHT) + // [filename, new_weight] + var/list/mod_data = var_value + for(var/file in owner.icon) + if("[file]" == mod_data[1]) + owner.icon[file] = mod_data[2] + target.particles.datum_flags |= DF_VAR_EDITED + return TRUE + + owner.vars[param_var_name] = var_value + target.particles.datum_flags |= DF_VAR_EDITED + return TRUE + diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index 5aa0c315c731..f9196bcff04c 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -1,38 +1,29 @@ #ifdef REFERENCE_TRACKING +#define REFSEARCH_RECURSE_LIMIT 64 -/datum/proc/find_references(skip_alert) - running_find_references = type +/datum/proc/find_references(references_to_clear = INFINITY) if(usr?.client) - if(usr.client.running_find_references) - log_reftracker("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.update_nextfire(reset_time = TRUE) - return - - if(!skip_alert && tgui_alert(usr,"Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", list("Yes", "No")) != "Yes") - running_find_references = null + if(tgui_alert(usr,"Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", list("Yes", "No")) != "Yes") return + src.references_to_clear = references_to_clear //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 + _search_references() + //restart the garbage collector + SSgarbage.can_fire = TRUE + SSgarbage.update_nextfire(reset_time = TRUE) - log_reftracker("Beginning search for references to a [type].") +/datum/proc/_search_references() + log_reftracker("Beginning search for references to a [type], looking for [references_to_clear] refs.") var/starting_time = world.time - -#if DM_VERSION >= 515 - log_reftracker("Refcount for [type]: [refcount(src)]") -#endif - //Time to search the whole game for our ref - DoSearchVar(GLOB, "GLOB", search_time = starting_time) //globals + DoSearchVar(GLOB, "GLOB", starting_time) //globals log_reftracker("Finished searching globals") + if(src.references_to_clear == 0) + return //Yes we do actually need to do this. The searcher refuses to read weird lists //And global.vars is a really weird list @@ -40,45 +31,46 @@ for(var/key in global.vars) global_vars[key] = global.vars[key] - DoSearchVar(global_vars, "Native Global", search_time = starting_time) + DoSearchVar(global_vars, "Native Global", starting_time) log_reftracker("Finished searching native globals") + if(src.references_to_clear == 0) + return for(var/datum/thing in world) //atoms (don't beleive its lies) - DoSearchVar(thing, "World -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "World -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching atoms") + if(src.references_to_clear == 0) + return for(var/datum/thing) //datums - DoSearchVar(thing, "Datums -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "Datums -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching datums") + if(src.references_to_clear == 0) + return //Warning, attempting to search clients like this will cause crashes if done on live. Watch yourself #ifndef REFERENCE_DOING_IT_LIVE for(var/client/thing) //clients - DoSearchVar(thing, "Clients -> [thing.type]", search_time = starting_time) + DoSearchVar(thing, "Clients -> [thing.type]", starting_time) + if(src.references_to_clear == 0) + break log_reftracker("Finished searching clients") + if(src.references_to_clear == 0) + return #endif log_reftracker("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.update_nextfire(reset_time = TRUE) - -/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64, search_time = world.time) - #ifdef REFERENCE_TRACKING_DEBUG - if(SSgarbage.should_save_refs && !found_refs) - found_refs = list() - #endif - - if(usr?.client && !usr.client.running_find_references) +/datum/proc/DoSearchVar(potential_container, container_name, search_time, recursion_count, is_special_list) + if(recursion_count >= REFSEARCH_RECURSE_LIMIT) + log_reftracker("Recursion limit reached. [container_name]") return - if(!recursive_limit) - log_reftracker("Recursion limit reached. [container_name]") + if(references_to_clear == 0) return //Check each time you go down a layer. This makes it a bit slow, but it won't effect the rest of the game at all @@ -86,7 +78,7 @@ CHECK_TICK #endif - if(istype(potential_container, /datum)) + if(isdatum(potential_container)) var/datum/datum_container = potential_container if(datum_container.last_find_references == search_time) return @@ -94,68 +86,122 @@ datum_container.last_find_references = search_time var/list/vars_list = datum_container.vars + var/is_atom = FALSE + var/is_area = FALSE + if(isatom(datum_container)) + is_atom = TRUE + if(isarea(datum_container)) + is_area = TRUE for(var/varname in vars_list) - #ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK - #endif - if (varname == "vars" || varname == "vis_locs") //Fun fact, vis_locs don't count for references - continue var/variable = vars_list[varname] - - if(variable == src) + if(islist(variable)) + //Fun fact, vis_locs don't count for references + if(varname == "vars" || (is_atom && (varname == "vis_locs" || varname == "overlays" || varname == "underlays" || varname == "filters" || varname == "verbs" || (is_area && varname == "contents")))) + continue + // We do this after the varname check to avoid area contents (reading it incures a world loop's worth of cost) + if(!length(variable)) + continue + DoSearchVar(variable,\ + "[container_name] [datum_container.ref_search_details()] -> [varname] (list)",\ + search_time,\ + recursion_count + 1,\ + /*is_special_list = */ is_atom && (varname == "contents" || varname == "vis_contents" || varname == "locs")) + else if(variable == src) #ifdef REFERENCE_TRACKING_DEBUG if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() found_refs[varname] = TRUE continue //End early, don't want these logging + else + log_reftracker("Found [type] [ref(src)] in [datum_container.type]'s [datum_container.ref_search_details()] [varname] var. [container_name]") + #else + log_reftracker("Found [type] [ref(src)] in [datum_container.type]'s [datum_container.ref_search_details()] [varname] var. [container_name]") #endif - log_reftracker("Found [type] \ref[src] in [datum_container.type]'s \ref[datum_container] [varname] var. [container_name]") + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [ref(src)] found, exiting.") + return continue - if(islist(variable)) - DoSearchVar(variable, "[container_name] \ref[datum_container] -> [varname] (list)", recursive_limit - 1, search_time) - else if(islist(potential_container)) - var/normal = IS_NORMAL_LIST(potential_container) var/list/potential_cache = potential_container for(var/element_in_list in potential_cache) - #ifndef FIND_REF_NO_CHECK_TICK - CHECK_TICK - #endif + //Check normal sublists + if(islist(element_in_list)) + if(length(element_in_list)) + DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", search_time, recursion_count + 1) //Check normal entrys - if(element_in_list == src) + else if(element_in_list == src) #ifdef REFERENCE_TRACKING_DEBUG if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() found_refs[potential_cache] = TRUE - continue //End early, don't want these logging + continue + else + log_reftracker("Found [type] [ref(src)] in list [container_name].") + #else + log_reftracker("Found [type] [ref(src)] in list [container_name].") #endif - log_reftracker("Found [type] \ref[src] in list [container_name].") - continue - var/assoc_val = null - if(!isnum(element_in_list) && normal) - assoc_val = potential_cache[element_in_list] - //Check assoc entrys - if(assoc_val == src) - #ifdef REFERENCE_TRACKING_DEBUG - if(SSgarbage.should_save_refs) - found_refs[potential_cache] = TRUE - continue //End early, don't want these logging - #endif - log_reftracker("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]") - continue - //We need to run both of these checks, since our object could be hiding in either of them - //Check normal sublists - if(islist(element_in_list)) - DoSearchVar(element_in_list, "[container_name] -> [element_in_list] (list)", recursive_limit - 1, search_time) - //Check assoc sublists - if(islist(assoc_val)) - DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", recursive_limit - 1, search_time) + // This is dumb as hell I'm sorry + // I don't want the garbage subsystem to count as a ref for the purposes of this number + // If we find all other refs before it I want to early exit, and if we don't I want to keep searching past it + var/ignore_ref = FALSE + var/list/queues = SSgarbage.queues + for(var/list/queue in queues) + if(potential_cache in queue) + ignore_ref = TRUE + break + if(ignore_ref) + log_reftracker("[container_name] does not count as a ref for our count") + else + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [ref(src)] found, exiting.") + return + + if(!isnum(element_in_list) && !is_special_list) + // This exists to catch an error that throws when we access a special list + // is_special_list is a hint, it can be wrong + try + var/assoc_val = potential_cache[element_in_list] + //Check assoc sublists + if(islist(assoc_val)) + if(length(assoc_val)) + DoSearchVar(potential_container[element_in_list], "[container_name]\[[element_in_list]\] -> [assoc_val] (list)", search_time, recursion_count + 1) + //Check assoc entry + else if(assoc_val == src) + #ifdef REFERENCE_TRACKING_DEBUG + if(SSgarbage.should_save_refs) + if(!found_refs) + found_refs = list() + found_refs[potential_cache] = TRUE + continue + else + log_reftracker("Found [type] [ref(src)] in list [container_name]\[[element_in_list]\]") + #else + log_reftracker("Found [type] [ref(src)] in list [container_name]\[[element_in_list]\]") + #endif + references_to_clear -= 1 + if(references_to_clear == 0) + log_reftracker("All references to [type] [ref(src)] found, exiting.") + return + catch + // So if it goes wrong we kill it + is_special_list = TRUE + log_reftracker("Curiosity: [container_name] lead to an error when acessing [element_in_list], what is it?") + +#undef REFSEARCH_RECURSE_LIMIT +#endif -/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE) - thing_to_del.qdel_and_find_ref_if_fail(force) +// Kept outside the ifdef so overrides are easy to implement -/datum/proc/qdel_and_find_ref_if_fail(force = FALSE) - SSgarbage.reference_find_on_fail["\ref[src]"] = TRUE - qdel(src, force) +/// Return info about us for reference searching purposes +/// Will be logged as a representation of this datum if it's a part of a search chain +/datum/proc/ref_search_details() + return ref(src) -#endif +/datum/callback/ref_search_details() + return "[ref(src)] (obj: [object] proc: [delegate] args: [json_encode(arguments)] user: [user?.resolve() || "null"])" diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 10592cda39d4..b5ff158aa954 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -11,7 +11,10 @@ else if(islist(target)) vv_do_list(target, href_list) if(href_list["Vars"]) - debug_variables(locate(href_list["Vars"])) + var/datum/vars_target = locate(href_list["Vars"]) + if(href_list["special_varname"]) // Some special vars can't be located even if you have their ref, you have to use this instead + vars_target = vars_target.vars[href_list["special_varname"]] + debug_variables(vars_target) //Stuff below aren't in dropdowns/etc. @@ -95,7 +98,7 @@ newamt = L.getOxyLoss() if("brain") L.adjustOrganLoss(ORGAN_SLOT_BRAIN, amount) - newamt = L.getOrganLoss(ORGAN_SLOT_BRAIN) + newamt = L.getBrainLoss() if("clone") L.adjustCloneLoss(amount) newamt = L.getCloneLoss() diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 830979e2f54a..e93d9622e88c 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -1,4 +1,4 @@ -/client/proc/debug_variables(datum/D in world) +/client/proc/debug_variables(datum/thing in world) set category = "Debug" set name = "View Variables" //set src in world @@ -8,54 +8,61 @@ to_chat(usr, span_danger("You need to be an administrator to access this."), confidential = TRUE) return - if(!D) + if(!thing) return var/datum/asset/asset_cache_datum = get_asset_datum(/datum/asset/simple/vv) asset_cache_datum.send(usr) - var/islist = islist(D) - if(!islist && !istype(D)) + var/islist = islist(thing) || (!isdatum(thing) && hascall(thing, "Cut")) // Some special lists dont count as lists, but can be detected by if they have list procs + if(!islist && !isdatum(thing)) return var/title = "" - var/refid = REF(D) + var/refid = REF(thing) var/icon/sprite var/hash - var/type = islist? /list : D.type + var/type = islist? /list : thing.type var/no_icon = FALSE - if(istype(D, /atom)) - sprite = getFlatIcon(D) - if(sprite) - hash = md5(sprite) - src << browse_rsc(sprite, "vv[hash].png") - else - no_icon = TRUE + if(!SSlag_switch.measures[DISABLE_VV_ICON_PREVIEW]) + if(isatom(thing)) + sprite = getFlatIcon(thing) + if(!sprite) + no_icon = TRUE - title = "[D] ([REF(D)]) = [type]" - var/formatted_type = replacetext("[type]", "/", "/") + else if(isimage(thing)) + var/image/image_object = thing + sprite = icon(image_object.icon, image_object.icon_state) var/sprite_text + if(SSlag_switch.measures[DISABLE_VV_ICON_PREVIEW]) + sprite_text = span_redtext("\[RENDER DISABLED\]") if(sprite) - sprite_text = no_icon? "\[NO ICON\]" : "" - var/list/header = islist(D)? list("/list") : D.vv_get_header() + hash = md5(sprite) + src << browse_rsc(sprite, "vv[hash].png") + sprite_text = no_icon ? "\[NO ICON\]" : "" + + title = "[thing] ([REF(thing)]) = [type]" + var/formatted_type = replacetext("[type]", "/", "/") + + var/list/header = islist ? list("/list") : thing.vv_get_header() var/ref_line = "@[copytext(refid, 2, -1)]" // get rid of the brackets, add a @ prefix for copy pasting in asay var/marked_line - if(holder && holder.marked_datum && holder.marked_datum == D) + if(holder && holder.marked_datum && holder.marked_datum == thing) marked_line = VV_MSG_MARKED var/tagged_line - if(holder && LAZYFIND(holder.tagged_datums, D)) - var/tag_index = LAZYFIND(holder.tagged_datums, D) + if(holder && LAZYFIND(holder.tagged_datums, thing)) + var/tag_index = LAZYFIND(holder.tagged_datums, thing) tagged_line = VV_MSG_TAGGED(tag_index) var/varedited_line - if(!islist && (D.datum_flags & DF_VAR_EDITED)) + if(!islist && (thing.datum_flags & DF_VAR_EDITED)) varedited_line = VV_MSG_EDITED var/deleted_line - if(!islist && D.gc_destroyed) + if(!islist && thing.gc_destroyed) deleted_line = VV_MSG_DELETED var/list/dropdownoptions @@ -75,28 +82,29 @@ var/link = dropdownoptions[name] dropdownoptions[i] = "" else - dropdownoptions = D.vv_get_dropdown() + dropdownoptions = thing.vv_get_dropdown() var/list/names = list() if(!islist) - for(var/V in D.vars) - names += V - sleep(1) + for(var/varname in thing.vars) + names += varname + + sleep(1 TICKS) var/list/variable_html = list() if(islist) - var/list/L = D - for(var/i in 1 to L.len) - var/key = L[i] + var/list/list_value = thing + for(var/i in 1 to list_value.len) + var/key = list_value[i] var/value - if(IS_NORMAL_LIST(L) && IS_VALID_ASSOC_KEY(key)) - value = L[key] - variable_html += debug_variable(i, value, 0, L) + if(IS_NORMAL_LIST(list_value) && IS_VALID_ASSOC_KEY(key)) + value = list_value[key] + variable_html += debug_variable(i, value, 0, list_value) else names = sort_list(names) - for(var/V in names) - if(D.can_vv_get(V)) - variable_html += D.vv_get_var(V) + for(var/varname in names) + if(thing.can_vv_get(varname)) + variable_html += thing.vv_get_var(varname) var/html = {" @@ -274,5 +282,5 @@ datumrefresh=[refid];[HrefToken()]'>Refresh "} src << browse(html, "window=variables[refid];size=475x650") -/client/proc/vv_update_display(datum/D, span, content) - src << output("[span]:[content]", "variables[REF(D)].browser:replace_span") +/client/proc/vv_update_display(datum/thing, span, content) + src << output("[span]:[content]", "variables[REF(thing)].browser:replace_span") diff --git a/code/modules/ambient_occlusion/turf_ao.dm b/code/modules/ambient_occlusion/turf_ao.dm index 30e95dd3aa03..ca42d4f23bfa 100644 --- a/code/modules/ambient_occlusion/turf_ao.dm +++ b/code/modules/ambient_occlusion/turf_ao.dm @@ -1,102 +1,89 @@ #define AO_TURF_CHECK(T) ((!T.opacity && !(locate(/obj/structure/low_wall) in T)) || !T.permit_ao) #define AO_SELF_CHECK(T) (!T.opacity || !(locate(/obj/structure/low_wall) in T)) -//Redefinitions of the diagonal directions so they can be stored in one var without conflicts -#define N_NORTH 2 -#define N_SOUTH 4 -#define N_EAST 16 -#define N_WEST 256 -#define N_NORTHEAST 32 -#define N_NORTHWEST 512 -#define N_SOUTHEAST 64 -#define N_SOUTHWEST 1024 -/* -Define for getting a bitfield of adjacent turfs that meet a condition. -ORIGIN is the object to step from, VAR is the var to write the bitfield to -TVAR is the temporary turf variable to use, FUNC is the condition to check. -FUNC generally should reference TVAR. -example: - var/turf/T - var/result = 0 - CALCULATE_NEIGHBORS(src, result, T, isopenturf(T)) -*/ -#define CALCULATE_NEIGHBORS(ORIGIN, VAR, TVAR, FUNC) \ - for (var/_tdir in GLOB.cardinals) { \ +/** + * Define for getting a bitfield of adjacent turfs that meet a condition. + * + * Arguments: + * - ORIGIN - The atom to step from, + * - VAR - The var to write the bitfield to. + * - TVAR - The temporary turf variable to use. + * - FUNC - An additional function used to validate the turf found in each direction. Generally should reference TVAR. + * + * Example: + * - var/our_junction = 0 + * - var/turf/T + * - CALCULATE_JUNCTIONS(src, our_junction, T, isopenturf(T)) + * - // isopenturf(T) NEEDS to be in the macro call since its nested into for loops. + * + * NOTICE: + * - This macro used to be CALCULATE_NEIGHBORS. + * - It has been renamed to avoid conflicts and confusions with other codebases. + */ +#define CALCULATE_JUNCTIONS(ORIGIN, VAR, TVAR, FUNC) \ + for (var/_tdir in GLOB.cardinals) { \ TVAR = get_step(ORIGIN, _tdir); \ if ((TVAR) && (FUNC)) { \ - VAR |= 1 << _tdir; \ + VAR |= _tdir; \ } \ } \ - if (VAR & N_NORTH) { \ - if (VAR & N_WEST) { \ + if (VAR & NORTH_JUNCTION) { \ + if (VAR & WEST_JUNCTION) { \ TVAR = get_step(ORIGIN, NORTHWEST); \ if (FUNC) { \ - VAR |= N_NORTHWEST; \ + VAR |= NORTHWEST_JUNCTION; \ } \ } \ - if (VAR & N_EAST) { \ + if (VAR & EAST_JUNCTION) { \ TVAR = get_step(ORIGIN, NORTHEAST); \ if (FUNC) { \ - VAR |= N_NORTHEAST; \ + VAR |= NORTHEAST_JUNCTION; \ } \ } \ } \ - if (VAR & N_SOUTH) { \ - if (VAR & N_WEST) { \ + if (VAR & SOUTH_JUNCTION) { \ + if (VAR & WEST_JUNCTION) { \ TVAR = get_step(ORIGIN, SOUTHWEST); \ if (FUNC) { \ - VAR |= N_SOUTHWEST; \ + VAR |= SOUTHWEST_JUNCTION; \ } \ } \ - if (VAR & N_EAST) { \ + if (VAR & EAST_JUNCTION) { \ TVAR = get_step(ORIGIN, SOUTHEAST); \ if (FUNC) { \ - VAR |= N_SOUTHEAST; \ + VAR |= SOUTHEAST_JUNCTION; \ } \ } \ } -/turf - ///Turf can contain ao overlays (only false for space, walls are opaque so they dont get them anyway) - var/permit_ao = TRUE - /// Current ambient occlusion overlays. Tracked so we can handle them through SSoverlays. - var/tmp/list/ao_overlays - var/tmp/ao_neighbors - var/tmp/list/ao_overlays_mimic - var/tmp/ao_neighbors_mimic - var/ao_queued = AO_UPDATE_NONE - -/turf/proc/regenerate_ao() - for (var/turf/T as anything in RANGE_TURFS(1, src)) - if (T.permit_ao) - T.queue_ao(TRUE) - -/turf/proc/calculate_ao_neighbors() - ao_neighbors = 0 - ao_neighbors_mimic = 0 - if (!permit_ao) - return +#define PROCESS_AO(TARGET, AO_VAR, NEIGHBORS, ALPHA, SHADOWER) \ + if (permit_ao && NEIGHBORS != AO_ALL_NEIGHBORS) { \ + var/image/I = cache["ao-[NEIGHBORS]|[pixel_x]/[pixel_y]/[pixel_z]/[pixel_w]|[ALPHA]|[SHADOWER]"]; \ + if (!I) { \ + /* This will also add the image to the cache. */ \ + I = make_ao_image(NEIGHBORS, TARGET.pixel_x, TARGET.pixel_y, TARGET.pixel_z, TARGET.pixel_w, ALPHA, SHADOWER); \ + } \ + AO_VAR = I; \ + TARGET.add_overlay(AO_VAR); \ + } - var/turf/T - if (z_flags & Z_MIMIC_BELOW) - CALCULATE_NEIGHBORS(src, ao_neighbors_mimic, T, (T?.z_flags & Z_MIMIC_BELOW)) - if (AO_SELF_CHECK(src) && !(z_flags & Z_MIMIC_NO_AO)) - CALCULATE_NEIGHBORS(src, ao_neighbors, T, AO_TURF_CHECK(T)) - // We don't want shadows on the top of turfs, so pretend that there's always non-opaque neighbors there - ao_neighbors |= (N_SOUTH | N_SOUTHEAST | N_SOUTHWEST) +#define CUT_AO(TARGET, AO_VAR) \ + if (AO_VAR) { \ + TARGET.cut_overlay(AO_VAR); \ + AO_VAR = null; \ + } -/proc/make_ao_image(corner, i, px = 0, py = 0, pz = 0, pw = 0, alpha) - var/list/cache = SSao.cache - var/cstr = "[corner]" - // PROCESS_AO_CORNER below also uses this cache, check it before changing this key. - var/key = "[cstr]|[i]|[px]/[py]/[pz]/[pw]|[alpha]" +/proc/make_ao_image(corner, px = 0, py = 0, pz = 0, pw = 0, alpha, shadower) + var/list/cache = SSao.image_cache + var/cstr = "ao-[corner]" + // PROCESS_AO above also uses this cache, check it before changing this key. + var/key = "[cstr]|[px]/[py]/[pz]/[pw]|[alpha]|[shadower]" - var/image/I = image('icons/turf/shadows.dmi', cstr, dir = 1 << (i-1)) + var/image/I = image(shadower ? 'icons/turf/uncut_shadows.dmi' : 'icons/turf/shadows.dmi', cstr) I.alpha = alpha I.blend_mode = BLEND_OVERLAY - I.appearance_flags = RESET_ALPHA|RESET_COLOR|TILE_BOUND + I.appearance_flags = RESET_ALPHA | RESET_COLOR | TILE_BOUND I.layer = AO_LAYER - // If there's an offset, counteract it. if (px || py || pz || pw) I.pixel_x = -px @@ -106,6 +93,54 @@ example: . = cache[key] = I +/turf + /** + * Whether this turf is allowed to have ambient occlusion. + * If FALSE, this turf will not be considered for ambient occlusion. + */ + var/permit_ao = TRUE + + /** + * Current ambient occlusion overlays. + * Tracked here so that they can be reapplied during update_overlays() + */ + var/tmp/image/ao_overlay + + /** + * What directions this is currently smoothing with. + * This starts as null for us to know when it's first set, but after that it will hold a 8-bit mask ranging from 0 to 255. + * + * IMPORTANT: This uses the smoothing direction flags as defined in icon_smoothing.dm, instead of the BYOND flags. + */ + var/tmp/ao_junction + + /// The same as ao_overlay, but for the mimic turf. + var/tmp/image/ao_overlay_mimic + + /// The same as ao_junction, but for the mimic turf. + var/tmp/ao_junction_mimic + + /// Whether this turf is currently queued for ambient occlusion. + var/tmp/ao_queued = AO_UPDATE_NONE + +/turf/proc/calculate_ao_junction() + ao_junction = NONE + ao_junction_mimic = NONE + if (!permit_ao) + return + + var/turf/T + if (z_flags & Z_MIMIC_BELOW) + CALCULATE_JUNCTIONS(src, ao_junction_mimic, T, (T.z_flags & Z_MIMIC_BELOW)) + if (AO_SELF_CHECK(src) && !(z_flags & Z_MIMIC_NO_AO)) + CALCULATE_JUNCTIONS(src, ao_junction, T, AO_TURF_CHECK(T)) + +/turf/proc/regenerate_ao() + for (var/thing in RANGE_TURFS(1, src)) + var/turf/T = thing + if (T?.permit_ao) + T.queue_ao(TRUE) + /turf/proc/queue_ao(rebuild = TRUE) if (!ao_queued) SSao.queue += src @@ -114,81 +149,32 @@ example: if (ao_queued < new_level) ao_queued = new_level -#define PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, CORNER_INDEX, CDIR, ALPHA, TARGET) \ - corner = 0; \ - if (NEIGHBORS & (1 << CDIR)) { \ - corner |= 2; \ - } \ - if (NEIGHBORS & (1 << turn(CDIR, 45))) { \ - corner |= 1; \ - } \ - if (NEIGHBORS & (1 << turn(CDIR, -45))) { \ - corner |= 4; \ - } \ - if (corner != 7) { /* 7 is the 'no shadows' state, no reason to add overlays for it. */ \ - var/image/I = cache["[corner]|[CORNER_INDEX]|[pixel_x]/[pixel_y]/[pixel_z]/[pixel_w]|[ALPHA]"]; \ - if (!I) { \ - I = make_ao_image(corner, CORNER_INDEX, TARGET.pixel_x, TARGET.pixel_y, TARGET.pixel_z, TARGET.pixel_w, ALPHA) /* this will also add the image to the cache. */ \ - } \ - LAZYADD(AO_LIST, I); \ - } - -#define CUT_AO(TARGET, AO_LIST) \ - if (AO_LIST) { \ - TARGET.cut_overlay(AO_LIST); \ - AO_LIST.Cut(); \ - } - -#define REGEN_AO(TARGET, AO_LIST, NEIGHBORS, ALPHA) \ - if (permit_ao && NEIGHBORS != AO_ALL_NEIGHBORS) { \ - var/corner;\ - PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, 1, NORTHWEST, ALPHA, TARGET); \ - PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, 2, SOUTHEAST, ALPHA, TARGET); \ - PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, 3, NORTHEAST, ALPHA, TARGET); \ - PROCESS_AO_CORNER(AO_LIST, NEIGHBORS, 4, SOUTHWEST, ALPHA, TARGET); \ - } \ - UNSETEMPTY(AO_LIST); \ - if (AO_LIST) { \ - TARGET.update_appearance(UPDATE_ICON); \ - } - /turf/proc/update_ao() - var/list/cache = SSao.cache - CUT_AO(shadower, ao_overlays_mimic) - CUT_AO(src, ao_overlays) - if (shadower && (z_flags & Z_MIMIC_BELOW)) - REGEN_AO(shadower, ao_overlays_mimic, ao_neighbors_mimic, Z_AO_ALPHA) - shadower.update_above() + var/list/cache = SSao.image_cache + CUT_AO(shadower, ao_overlay_mimic) + CUT_AO(src, ao_overlay) + if (z_flags & Z_MIMIC_BELOW) + PROCESS_AO(shadower, ao_overlay_mimic, ao_junction_mimic, Z_AO_ALPHA, TRUE) if (AO_TURF_CHECK(src) && !(z_flags & Z_MIMIC_NO_AO)) - REGEN_AO(src, ao_overlays, ao_neighbors, WALL_AO_ALPHA) - update_above() + PROCESS_AO(src, ao_overlay, ao_junction, WALL_AO_ALPHA, FALSE) /turf/update_overlays() . = ..() - if(permit_ao && ao_overlays) - . += ao_overlays + if(permit_ao && ao_overlay) + . += ao_overlay /atom/movable/openspace/multiplier/update_overlays() . = ..() var/turf/Tloc = loc ASSERT(isturf(Tloc)) - if (Tloc.ao_overlays_mimic) - .+= Tloc.ao_overlays_mimic + if (Tloc.ao_overlay_mimic) + .+= Tloc.ao_overlay_mimic -#undef REGEN_AO -#undef PROCESS_AO_CORNER +#undef PROCESS_AO +#undef CUT_AO +#undef CALCULATE_JUNCTIONS #undef AO_TURF_CHECK #undef AO_SELF_CHECK -#undef CALCULATE_NEIGHBORS - -#undef N_NORTH -#undef N_SOUTH -#undef N_EAST -#undef N_WEST -#undef N_NORTHEAST -#undef N_NORTHWEST -#undef N_SOUTHEAST -#undef N_SOUTHWEST /turf/open/space permit_ao = FALSE diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 8396e06deb89..a708d88d8c8a 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -1,5 +1,4 @@ GLOBAL_LIST_EMPTY(antagonists) - /datum/antagonist ///Public name for this antagonist. Appears for player prompts and round-end reports. var/name = "\improper Antagonist" @@ -19,6 +18,8 @@ GLOBAL_LIST_EMPTY(antagonists) var/list/typecache_datum_blacklist = list() ///The define string we use to identify the role for bans/player polls to spawn a random new one in. var/job_rank + /// A job path to give if the player is this antagonist at roundstart. + var/assign_job ///Should replace jobbanned player with ghosts if granted. var/replace_banned = TRUE ///List of the objective datums that this role currently has, completing all objectives at round-end will cause this antagonist to greentext. @@ -143,21 +144,18 @@ GLOBAL_LIST_EMPTY(antagonists) var/datum/action/antag_info/info_button 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(ui_name)//in the future, this should entirely replace greet. info_button = new(src) info_button.Grant(owner.current) info_button_ref = WEAKREF(info_button) - if(!silent) - greet() - if(ui_name) - to_chat(owner.current, span_boldnotice("For more info, read the panel. you can always come back to it using the button in the top left.")) - info_button.Trigger() + apply_innate_effects() - give_antag_moodies() RegisterSignal(owner, COMSIG_PRE_MINDSHIELD_IMPLANT, PROC_REF(pre_mindshield)) RegisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED, PROC_REF(on_mindshield)) + 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)) @@ -165,6 +163,13 @@ GLOBAL_LIST_EMPTY(antagonists) if(!soft_antag && owner.current.stat != DEAD && owner.current.client) owner.current.add_to_current_living_antags() + + if(!silent) + greet() + if(ui_name) + to_chat(owner.current, span_boldnotice("For more info, read the panel. you can always come back to it using the button in the top left.")) + info_button.Trigger() + SEND_SIGNAL(owner, COMSIG_ANTAGONIST_GAINED, src) /** @@ -201,14 +206,16 @@ GLOBAL_LIST_EMPTY(antagonists) CRASH("Antag datum with no owner.") remove_innate_effects() - clear_antag_moodies() LAZYREMOVE(owner.antag_datums, src) if(!LAZYLEN(owner.antag_datums) && !soft_antag) owner.current.remove_from_current_living_antags() + if(info_button_ref) QDEL_NULL(info_button_ref) + if(!silent && owner.current) farewell() + UnregisterSignal(owner, COMSIG_PRE_MINDSHIELD_IMPLANT) UnregisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED) var/datum/team/team = get_team() @@ -220,7 +227,7 @@ GLOBAL_LIST_EMPTY(antagonists) var/mob/living/current = owner.current for (var/datum/atom_hud/alternate_appearance/basic/has_antagonist/antag_hud as anything in GLOB.has_antagonist_huds) if (!antag_hud.mobShouldSee(current)) - antag_hud.remove_hud_from(current) + antag_hud.hide_from(current) qdel(src) @@ -229,32 +236,36 @@ GLOBAL_LIST_EMPTY(antagonists) * Use this proc for playing sounds, sending alerts, or helping to setup non-gameplay influencing aspects of the antagonist type. */ /datum/antagonist/proc/greet() - if(!silent) - to_chat(owner.current, examine_block(span_big("You are a [src]."))) + var/list/greeting = "[greeting_header()]
    [jointext(build_greeting(), "
    ")]" + + if(length(objectives)) + greeting += "You have the following objectives:
    " + + var/list/objective_strings = list() + var/objective_tally = 0 + for(var/datum/objective/O as anything in objectives) + objective_tally++ + objective_strings += "[objective_tally].) [O.objective_name]: [O.explanation_text]" + + greeting += jointext(objective_strings, "

    ") + + to_chat(owner.current, examine_block(jointext(greeting, ""))) + +/datum/antagonist/proc/greeting_header() + return "You are the [span_alert("[src]")]" + +/// Builds a list of strings to print out in greet(). +/datum/antagonist/proc/build_greeting() + RETURN_TYPE(/list) + . = list() /** * Proc that sends fluff or instructional messages to the player when they lose this antag datum. * Use this proc for playing sounds, sending alerts, or otherwise informing the player that they're no longer a specific antagonist type. */ /datum/antagonist/proc/farewell() - if(!silent) - to_chat(owner.current, span_userdanger("You are no longer \the [src]!")) - -/** - * Proc that assigns this antagonist's ascribed moodlet to the player. - */ -/datum/antagonist/proc/give_antag_moodies() - if(!antag_moodlet) - return - SEND_SIGNAL(owner.current, COMSIG_ADD_MOOD_EVENT, "antag_moodlet", antag_moodlet) - -/** - * Proc that removes this antagonist's ascribed moodlet from the player. - */ -/datum/antagonist/proc/clear_antag_moodies() - if(!antag_moodlet) - return - SEND_SIGNAL(owner.current, COMSIG_CLEAR_MOOD_EVENT, "antag_moodlet") + to_chat(owner.current, span_userdanger("You are no longer \the [src]!")) + owner.announce_objectives() /** * Proc that will return the team this antagonist belongs to, when called. Helpful with antagonists that may belong to multiple potential teams in a single round, like families. @@ -426,7 +437,7 @@ GLOBAL_LIST_EMPTY(antagonists) // Add HUDs that they couldn't see before for (var/datum/atom_hud/alternate_appearance/basic/has_antagonist/antag_hud as anything in GLOB.has_antagonist_huds) if (antag_hud.mobShouldSee(owner.current)) - antag_hud.add_hud_to(owner.current) + antag_hud.show_to(owner.current) //This one is created by admin tools for custom objectives /datum/antagonist/custom diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm index 516631e8f509..23979bde3b44 100644 --- a/code/modules/antagonists/_common/antag_hud.dm +++ b/code/modules/antagonists/_common/antag_hud.dm @@ -24,12 +24,12 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc var/datum/mind/mind -/datum/atom_hud/alternate_appearance/basic/antagonist_hud/New(key, datum/mind/mind) +/datum/atom_hud/alternate_appearance/basic/antagonist_hud/New(key, atom/movable/target, datum/mind/mind) src.mind = mind - antag_hud_images = get_antag_hud_images(mind) + antag_hud_images = get_antag_hud_images(mind, target) - var/image/first_antagonist = get_antag_image(1) || image(icon('icons/blanks/32x32.dmi', "nothing"), mind.current) + var/image/first_antagonist = get_antag_image(1) || image(icon('icons/blanks/32x32.dmi', "nothing"), target) RegisterSignal( mind, @@ -49,6 +49,9 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc return ..() +/datum/atom_hud/alternate_appearance/basic/antagonist_hud/mimic(atom/movable/openspace/mimic) + new type(appearance_key, mimic, mind) + /datum/atom_hud/alternate_appearance/basic/antagonist_hud/mobShouldSee(mob/mob) return Master.current_runlevel >= RUNLEVEL_POSTGAME || (mob.client?.combo_hud_enabled && !isnull(mob.client?.holder)) @@ -67,13 +70,13 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc if (antag_hud_images.len) return antag_hud_images[(index % antag_hud_images.len) + 1] -/datum/atom_hud/alternate_appearance/basic/antagonist_hud/proc/get_antag_hud_images(datum/mind/mind) +/datum/atom_hud/alternate_appearance/basic/antagonist_hud/proc/get_antag_hud_images(datum/mind/mind, atom/movable/target) var/list/final_antag_hud_images = list() for (var/datum/antagonist/antagonist as anything in mind?.antag_datums) if (isnull(antagonist.antag_hud_name)) continue - final_antag_hud_images += image(antagonist.hud_icon, mind.current, antagonist.antag_hud_name) + final_antag_hud_images += image(antagonist.hud_icon, target, antagonist.antag_hud_name) return final_antag_hud_images diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm index 31968faa6c59..06374033bb0d 100644 --- a/code/modules/antagonists/_common/antag_spawner.dm +++ b/code/modules/antagonists/_common/antag_spawner.dm @@ -67,7 +67,7 @@ spawn_antag(student.client, get_turf(src), apprentice_school, teacher.mind) /obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind, datum/mind/user) - new /obj/effect/particle_effect/smoke(T) + new /obj/effect/particle_effect/fluid/smoke(T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) C.prefs.safe_transfer_prefs_to(M, is_antag = TRUE) M.key = C.key @@ -146,6 +146,11 @@ nukie.ckey = C.key var/datum/mind/op_mind = nukie.mind + if(length(GLOB.newplayer_start)) // needed as hud code doesn't render huds if the atom (in this case the nukie) is in nullspace, so just move the nukie somewhere safe + nukie.forceMove(pick(GLOB.newplayer_start)) + else + nukie.forceMove(locate(1,1,1)) + antag_datum = new() antag_datum.send_to_spawnpoint = FALSE antag_datum.nukeop_outfit = outfit @@ -208,9 +213,8 @@ borg.mmi.name = "[initial(borg.mmi.name)]: [brainopsname]" borg.mmi.brain.name = "[brainopsname]'s brain" - borg.mmi.brainmob.real_name = brainopsname - borg.mmi.brainmob.name = brainopsname - borg.real_name = borg.name + borg.mmi.brainmob.set_real_name(brainopsname) + borg.set_real_name(borg.name) borg.key = C.key diff --git a/code/modules/antagonists/abductor/abductee/abductee.dm b/code/modules/antagonists/abductor/abductee/abductee.dm index c42ac8d83304..c02acd43bb4d 100644 --- a/code/modules/antagonists/abductor/abductee/abductee.dm +++ b/code/modules/antagonists/abductor/abductee/abductee.dm @@ -17,7 +17,6 @@ /datum/antagonist/abductee/greet() to_chat(owner, span_warning("Your mind snaps!")) to_chat(owner, "[span_warning("You can't remember how you got here...")]") - owner.announce_objectives() /datum/antagonist/abductee/proc/give_objective() var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) diff --git a/code/modules/antagonists/abductor/abductor.dm b/code/modules/antagonists/abductor/abductor.dm index 69e89f926aa0..7d0244af903d 100644 --- a/code/modules/antagonists/abductor/abductor.dm +++ b/code/modules/antagonists/abductor/abductor.dm @@ -88,7 +88,6 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E . = ..() to_chat(owner.current, span_notice("With the help of your teammate, kidnap and experiment on station crew members!")) to_chat(owner.current, span_notice("[greet_text]")) - owner.announce_objectives() /datum/antagonist/abductor/proc/finalize_abductor() //Equip @@ -97,7 +96,7 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE) T.mothership = "[team.name]" - H.real_name = "[team.name] [sub_role]" + H.set_real_name("[team.name] [sub_role]") H.equipOutfit(outfit) //Teleport to ship @@ -203,7 +202,7 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E explanation_text = "Experiment on [target_amount] humans." /datum/objective/experiment/check_completion() - for(var/obj/machinery/abductor/experiment/E in GLOB.machines) + for(var/obj/machinery/abductor/experiment/E in INSTANCES_OF(/obj/machinery/abductor/console)) if(!istype(team, /datum/team/abductor_team)) return FALSE var/datum/team/abductor_team/T = team diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index d032839340bc..65c92d8e233a 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" inhand_icon_state = "armor" blood_overlay_type = "armor" - armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 25, BOMB = 15, BIO = 15, FIRE = 70, ACID = 70) + armor = list(BLUNT = 15, PUNCTURE = 15, SLASH = 0, LASER = 15, ENERGY = 25, BOMB = 15, BIO = 15, FIRE = 70, ACID = 70) actions_types = list(/datum/action/item_action/hands_free/activate) allowed = list( /obj/item/abductor, @@ -26,8 +26,8 @@ /// Cooldown in seconds var/combat_cooldown = 20 var/datum/icon_snapshot/disguise - var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 25, BOMB = 15, BIO = 15, FIRE = 70, ACID = 70) - var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, FIRE = 90, ACID = 90) + var/stealth_armor = list(BLUNT = 15, PUNCTURE = 15, SLASH = 0, LASER = 15, ENERGY = 25, BOMB = 15, BIO = 15, FIRE = 70, ACID = 70) + var/combat_armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload) . = ..() @@ -55,7 +55,7 @@ icon_state = "vest_stealth" if(ishuman(loc)) var/mob/living/carbon/human/H = loc - H.update_worn_oversuit() + H.update_slots_for_item(src) update_action_buttons() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) @@ -90,7 +90,7 @@ M.cut_overlays() M.regenerate_icons() -/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/abductor/vest/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) DeactivateStealth() /obj/item/clothing/suit/armor/abductor/vest/IsReflect() @@ -124,11 +124,11 @@ /obj/item/clothing/suit/armor/abductor/vest/process(delta_time) combat_cooldown += delta_time if(combat_cooldown >= initial(combat_cooldown)) - STOP_PROCESSING(SSobj, src) + return PROCESS_KILL /obj/item/clothing/suit/armor/abductor/Destroy() STOP_PROCESSING(SSobj, src) - for(var/obj/machinery/abductor/console/C in GLOB.machines) + for(var/obj/machinery/abductor/console/C in INSTANCES_OF(/obj/machinery/abductor/console)) if(C.vest == src) C.vest = null break @@ -455,7 +455,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} var/sleep_time = 2 MINUTES var/time_to_cuff = 3 SECONDS -/obj/item/melee/baton/abductor/ComponentInitialize() +/obj/item/melee/baton/abductor/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) @@ -501,12 +501,12 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "wonderprodProbe" inhand_icon_state = "wonderprodProbe" -/obj/item/melee/baton/abductor/baton_attack(mob/target, mob/living/user, modifiers) +/obj/item/melee/baton/abductor/melee_baton_attack(mob/target, mob/living/user) if(!AbductorCheck(user)) - return BATON_ATTACK_DONE + return return ..() -/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override) +/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user) switch (mode) if(BATON_STUN) target.visible_message(span_danger("[user] stuns [target] with [src]!"), @@ -523,6 +523,8 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(BATON_PROBE) ProbeAttack(target,user) + return TRUE + /obj/item/melee/baton/abductor/get_stun_description(mob/living/target, mob/living/user) return // chat messages are handled in their own procs. @@ -567,9 +569,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} C.visible_message(span_danger("[user] begins restraining [C] with [src]!"), \ span_userdanger("[user] begins shaping an energy field around your hands!")) if(do_after(user, C, time_to_cuff) && C.canBeHandcuffed()) - if(!C.handcuffed) - C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(C)) - C.update_handcuffed() + if(C.equip_to_slot_if_possible(new /obj/item/restraints/handcuffs/energy/used(C), ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE)) to_chat(user, span_notice("You restrain [C].")) log_combat(user, C, "handcuffed") else @@ -648,7 +648,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} . = ..() make_syndie() -/obj/item/radio/headset/abductor/ComponentInitialize() +/obj/item/radio/headset/abductor/Initialize(mapload) . = ..() AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) @@ -794,8 +794,8 @@ Congratulations! You are now trained for invasive xenobiology research!"} framestack = /obj/item/stack/sheet/mineral/abductor buildstackamount = 1 framestackamount = 1 - smoothing_groups = list(SMOOTH_GROUP_ABDUCTOR_TABLES) - canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_TABLES) + smoothing_groups = SMOOTH_GROUP_ABDUCTOR_TABLES + canSmoothWith = SMOOTH_GROUP_ABDUCTOR_TABLES frame = /obj/structure/table_frame/abductor custom_materials = list(/datum/material/silver = 2000) @@ -813,7 +813,7 @@ Congratulations! You are now trained for invasive xenobiology research!"} /// Amount to inject per second var/inject_am = 0.5 - var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico) + var/static/list/injected_reagents = list(/datum/reagent/cordiolis_hepatico) /obj/structure/table/optable/abductor/Initialize(mapload) . = ..() @@ -865,5 +865,5 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "abductor" inhand_icon_state = "bl_suit" worn_icon = 'icons/mob/clothing/under/syndicate.dmi' - armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 10, bio = 10, fire = 0, acid = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, FIRE = 0, ACID = 0) can_adjust = FALSE diff --git a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm index b3e4f89a7e01..1ca7c3352d7a 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_outfits.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_outfits.dm @@ -53,7 +53,7 @@ ..() if(!visualsOnly) var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H) - beamplant.implant(H) + beamplant.implant(H, body_zone = BODY_ZONE_CHEST) /datum/outfit/abductor/scientist/onemanteam name = "Abductor Scientist (w/ agent gear)" diff --git a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm b/code/modules/antagonists/abductor/equipment/abduction_surgery.dm deleted file mode 100644 index 9df01769d758..000000000000 --- a/code/modules/antagonists/abductor/equipment/abduction_surgery.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/surgery/organ_extraction - name = "Experimental organ replacement" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/incise, /datum/surgery_step/extract_organ, /datum/surgery_step/gland_insert) - possible_locs = list(BODY_ZONE_CHEST) - ignore_clothes = 1 - -/datum/surgery/organ_extraction/can_start(mob/user, mob/living/carbon/target) - if(!ishuman(user)) - return FALSE - var/mob/living/carbon/human/H = user - if(H.dna.species.id == SPECIES_ABDUCTOR) - return TRUE - for(var/obj/item/implant/abductor/A in H.implants) - return TRUE - return FALSE - - -/datum/surgery_step/extract_organ - name = "remove heart" - accept_hand = 1 - time = 32 - var/obj/item/organ/IC = null - var/list/organ_types = list(/obj/item/organ/heart) - -/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - for(var/atom/A in target.processing_organs) - if(A.type in organ_types) - IC = A - break - user.visible_message(span_notice("[user] starts to remove [target]'s organs."), span_notice("You start to remove [target]'s organs...")) - -/datum/surgery_step/extract_organ/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(IC) - user.visible_message(span_notice("[user] pulls [IC] out of [target]'s [target_zone]!"), span_notice("You pull [IC] out of [target]'s [target_zone].")) - user.put_in_hands(IC) - IC.Remove(target) - return 1 - else - to_chat(user, span_warning("You don't find anything in [target]'s [target_zone]!")) - return 1 - -/datum/surgery_step/gland_insert - name = "insert gland" - implements = list(/obj/item/organ/heart/gland = 100) - time = 32 - -/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] starts to insert [tool] into [target]."), span_notice("You start to insert [tool] into [target]...")) - -/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("You insert [tool] into [target].")) - user.temporarilyRemoveItemFromInventory(tool, TRUE) - var/obj/item/organ/heart/gland/gland = tool - gland.Insert(target, 2) - return 1 diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index c0678d801f06..7f86a5a7feef 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -3,9 +3,7 @@ desc = "A nausea-inducing hunk of twisting flesh and metal." icon = 'icons/obj/abductor.dmi' icon_state = "gland" - status = ORGAN_ROBOTIC - organ_flags = NONE - beating = TRUE + organ_flags = ORGAN_SYNTHETIC /// Shows name of the gland as well as a description of what it does upon examination by abductor scientists and observers. var/abductor_hint = "baseline placebo referencer" @@ -85,7 +83,7 @@ if(initial(uses) == 1) uses = initial(uses) var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.remove_from_hud(owner) + hud.remove_atom_from_hud(owner) clear_mind_control() ..() @@ -97,13 +95,12 @@ if(special != 2 && uses) // Special 2 means abductor surgery Start() var/datum/atom_hud/abductor/hud = GLOB.huds[DATA_HUD_ABDUCTOR] - hud.add_to_hud(owner) + hud.add_atom_to_hud(owner) update_gland_hud() /obj/item/organ/heart/gland/on_life(delta_time, times_fired) - if(!beating) - // alien glands are immune to stopping. - beating = TRUE + pulse = PULSE_NORM + . = ..() if(!active) return if(!ownerCheck()) diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 2e298a6a732d..a2f5139b4f33 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -22,22 +22,22 @@ return var/obj/item/organ/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX) - if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || (appendix.organ_flags & ORGAN_SYNTHETIC)))) + if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_DEAD) || (appendix.organ_flags & ORGAN_SYNTHETIC)))) replace_appendix(appendix) return var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER) - if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC)))) + if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > (liver.high_threshold * liver.maxHealth)) || (liver.organ_flags & ORGAN_SYNTHETIC)))) replace_liver(liver) return var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) - if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || (lungs.organ_flags & ORGAN_SYNTHETIC)))) + if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > (lungs.high_threshold * lungs.maxHealth)) || (lungs.organ_flags & ORGAN_SYNTHETIC)))) replace_lungs(lungs) return var/obj/item/organ/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH) - if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || (stomach.organ_flags & ORGAN_SYNTHETIC)))) + if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > (stomach.high_threshold * stomach.maxHealth)) || (stomach.organ_flags & ORGAN_SYNTHETIC)))) replace_stomach(stomach) return @@ -67,7 +67,7 @@ replace_blood() return if(owner.blood_volume < BLOOD_VOLUME_OKAY) - owner.blood_volume = BLOOD_VOLUME_NORMAL + owner.setBloodVolume(BLOOD_VOLUME_NORMAL) to_chat(owner, span_warning("You feel your blood pulsing within you.")) return @@ -97,9 +97,10 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/appendix_type = /obj/item/organ/appendix - if(owner?.dna?.species?.mutantappendix) - appendix_type = owner.dna.species.mutantappendix + var/appendix_type = owner?.dna?.species?.organs[ORGAN_SLOT_APPENDIX] + if(!appendix_type) + return + var/obj/item/organ/appendix/new_appendix = new appendix_type() new_appendix.Insert(owner) @@ -112,9 +113,10 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/liver_type = /obj/item/organ/liver - if(owner?.dna?.species?.mutantliver) - liver_type = owner.dna.species.mutantliver + var/liver_type = owner?.dna?.species?.organs[ORGAN_SLOT_LIVER] + if(!liver_type) + return + var/obj/item/organ/liver/new_liver = new liver_type() new_liver.Insert(owner) @@ -127,9 +129,10 @@ else to_chat(owner, span_warning("You feel a weird rumble inside your chest...")) - var/lung_type = /obj/item/organ/lungs - if(owner.dna.species && owner.dna.species.mutantlungs) - lung_type = owner.dna.species.mutantlungs + var/lung_type = owner?.dna?.species?.organs[ORGAN_SLOT_LUNGS] + if(!lung_type) + return + var/obj/item/organ/lungs/new_lungs = new lung_type() new_lungs.Insert(owner) @@ -142,9 +145,10 @@ else to_chat(owner, span_warning("You feel a weird rumble in your bowels...")) - var/stomach_type = /obj/item/organ/stomach - if(owner?.dna?.species?.mutantstomach) - stomach_type = owner.dna.species.mutantstomach + var/stomach_type = owner?.dna?.species?.organs[ORGAN_SLOT_STOMACH] + if(!stomach_type) + return + var/obj/item/organ/stomach/new_stomach = new stomach_type() new_stomach.Insert(owner) @@ -160,9 +164,10 @@ addtimer(CALLBACK(src, PROC_REF(finish_replace_eyes)), rand(100, 200)) /obj/item/organ/heart/gland/heal/proc/finish_replace_eyes() - var/eye_type = /obj/item/organ/eyes - if(owner.dna.species && owner.dna.species.mutanteyes) - eye_type = owner.dna.species.mutanteyes + var/eye_type = owner?.dna?.species?.organs[ORGAN_SLOT_EYES] + if(!eye_type) + return + var/obj/item/organ/eyes/new_eyes = new eye_type() new_eyes.Insert(owner) owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_userdanger("A pair of new eyes suddenly inflates into your eye sockets!")) @@ -194,12 +199,15 @@ owner.Stun(15) owner.adjustToxLoss(-15, TRUE, TRUE) - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + owner.adjustBloodVolume(min(BLOOD_VOLUME_NORMAL - owner.blood_volume), 20) + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) keep_going = TRUE if(owner.getToxLoss()) keep_going = TRUE + for(var/datum/reagent/toxin/R in owner.reagents.reagent_list) owner.reagents.remove_reagent(R.type, 4) if(owner.reagents.has_reagent(R.type)) diff --git a/code/modules/antagonists/abductor/equipment/glands/spider.dm b/code/modules/antagonists/abductor/equipment/glands/spider.dm deleted file mode 100644 index 8e8306911d6b..000000000000 --- a/code/modules/antagonists/abductor/equipment/glands/spider.dm +++ /dev/null @@ -1,14 +0,0 @@ -/obj/item/organ/heart/gland/spiderman - abductor_hint = "araneae cloister accelerator. The abductee occasionally exhales spider pheromones and will spawn spiderlings." - cooldown_low = 450 - cooldown_high = 900 - uses = -1 - icon_state = "spider" - mind_control_uses = 2 - mind_control_duration = 2400 - -/obj/item/organ/heart/gland/spiderman/activate() - to_chat(owner, span_warning("You feel something crawling in your skin.")) - owner.faction |= "spiders" - var/obj/structure/spider/spiderling/S = new(owner.drop_location()) - S.directive = "Protect your nest inside [owner.real_name]." diff --git a/code/modules/antagonists/abductor/machinery/camera.dm b/code/modules/antagonists/abductor/machinery/camera.dm index 07d3d2d50f58..66c0827d3c99 100644 --- a/code/modules/antagonists/abductor/machinery/camera.dm +++ b/code/modules/antagonists/abductor/machinery/camera.dm @@ -13,7 +13,12 @@ icon_keyboard = null resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF +/obj/machinery/computer/camera_advanced/abductor/Initialize(mapload) + . = ..() + SET_TRACKING(__TYPE__) + /obj/machinery/computer/camera_advanced/abductor/Destroy() + UNSET_TRACKING(__TYPE__) if(console) console.camera = null console = null diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm index fc250a07635d..5d80daaa672c 100644 --- a/code/modules/antagonists/abductor/machinery/console.dm +++ b/code/modules/antagonists/abductor/machinery/console.dm @@ -1,5 +1,5 @@ /proc/get_abductor_console(team_number) - for(var/obj/machinery/abductor/console/C in GLOB.machines) + for(var/obj/machinery/abductor/console/C in INSTANCES_OF(/obj/machinery/abductor/console)) if(C.team_number == team_number) return C @@ -10,6 +10,14 @@ use_power = NO_POWER_USE var/team_number = 0 +/obj/machinery/abductor/Initialize(mapload) + . = ..() + SET_TRACKING(__TYPE__) + +/obj/machinery/abductor/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + //Console /obj/machinery/abductor/console @@ -206,18 +214,18 @@ if(!team_number) return - for(var/obj/machinery/abductor/pad/p in GLOB.machines) + for(var/obj/machinery/abductor/pad/p in INSTANCES_OF(/obj/machinery/abductor/console)) if(p.team_number == team_number) pad = p pad.console = src break - for(var/obj/machinery/abductor/experiment/e in GLOB.machines) + for(var/obj/machinery/abductor/experiment/e in INSTANCES_OF(/obj/machinery/abductor/console)) if(e.team_number == team_number) experiment = e e.console = src - for(var/obj/machinery/computer/camera_advanced/abductor/c in GLOB.machines) + for(var/obj/machinery/computer/camera_advanced/abductor/c as anything in INSTANCES_OF(/obj/machinery/computer/camera_advanced/abductor)) if(c.team_number == team_number) camera = c c.console = src @@ -252,7 +260,7 @@ if(vest == V) return FALSE - for(var/obj/machinery/abductor/console/C in GLOB.machines) + for(var/obj/machinery/abductor/console/C in INSTANCES_OF(/obj/machinery/abductor)) if(C.vest == V) C.vest = null break diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 72edf2dcbb5d..bcce9c6a9449 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -21,7 +21,7 @@ console = null return ..() -/obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) +/obj/machinery/abductor/experiment/MouseDroppedOn(mob/target, mob/user) if(user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) return if(isabductor(target)) @@ -180,7 +180,8 @@ */ /obj/machinery/abductor/experiment/proc/send_back(mob/living/carbon/human/H) H.Sleeping(160) - H.uncuff() + H.remove_legcuffs() + H.remove_handcuffs() if(console && console.pad && console.pad.teleport_target) H.forceMove(console.pad.teleport_target) return diff --git a/code/modules/antagonists/ashwalker/ashwalker.dm b/code/modules/antagonists/ashwalker/ashwalker.dm deleted file mode 100644 index 609ebc3cc248..000000000000 --- a/code/modules/antagonists/ashwalker/ashwalker.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/team/ashwalkers - name = "Ashwalkers" - show_roundend_report = FALSE - var/list/players_spawned = new - -/datum/antagonist/ashwalker - name = "\improper Ash Walker" - job_rank = ROLE_LAVALAND - show_in_antagpanel = FALSE - show_to_ghosts = TRUE - prevent_roundtype_conversion = FALSE - antagpanel_category = "Ash Walkers" - suicide_cry = "I HAVE NO IDEA WHAT THIS THING DOES!!" - var/datum/team/ashwalkers/ashie_team - -/datum/antagonist/ashwalker/create_team(datum/team/team) - if(team) - ashie_team = team - objectives |= ashie_team.objectives - else - ashie_team = new - -/datum/antagonist/ashwalker/get_team() - 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_REF(on_examinate)) - -/datum/antagonist/ashwalker/on_gain() - . = ..() - RegisterSignal(owner.current, COMSIG_MOB_EXAMINATE, PROC_REF(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 cbf53bbef091..1a927477a55f 100644 --- a/code/modules/antagonists/blob/blob.dm +++ b/code/modules/antagonists/blob/blob.dm @@ -20,7 +20,6 @@ /datum/antagonist/blob/greet() . = ..() - owner.announce_objectives() if(!isovermind(owner.current)) to_chat(owner.current, span_notice("Use the pop ability to place your blob core! It is recommended you do this away from anyone else, as you'll be taking on the entire crew!")) diff --git a/code/modules/antagonists/blob/blob_mobs.dm b/code/modules/antagonists/blob/blob_mobs.dm index 97ff2fcdf5f3..7ebd3b52af47 100644 --- a/code/modules/antagonists/blob/blob_mobs.dm +++ b/code/modules/antagonists/blob/blob_mobs.dm @@ -56,7 +56,7 @@ H.color = "#000000" adjustHealth(-maxHealth*BLOBMOB_HEALING_MULTIPLIER) -/mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume) +/mob/living/simple_animal/hostile/blob/fire_act(exposed_temperature, exposed_volume, turf/adjacent) ..() if(exposed_temperature) adjustFireLoss(clamp(0.01 * exposed_temperature, 1, 5)) @@ -85,7 +85,7 @@ return 1 return ..() -/mob/living/simple_animal/hostile/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/simple_animal/hostile/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(sanitize) message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) var/spanned_message = say_quote(message) @@ -137,7 +137,6 @@ factory.spores += src if(linked_node.overmind && istype(linked_node.overmind.blobstrain, /datum/blobstrain/reagent/distributed_neurons) && !istype(src, /mob/living/simple_animal/hostile/blob/blobspore/weak)) notify_ghosts("A controllable spore has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Spore Created") - add_cell_sample() /mob/living/simple_animal/hostile/blob/blobspore/Life(delta_time = SSMOBS_DT, times_fired) if(!is_zombie && isturf(src.loc)) @@ -173,7 +172,8 @@ is_zombie = 1 if(H.wear_suit) var/obj/item/clothing/suit/armor/A = H.wear_suit - maxHealth += A.armor.melee //That zombie's got armor, I want armor! + maxHealth += A.returnArmor().getRating(BLUNT) //That zombie's got armor, I want armor! + maxHealth += 40 health = maxHealth name = "blob zombie" @@ -198,7 +198,7 @@ /mob/living/simple_animal/hostile/blob/blobspore/death(gibbed) // On death, create a small smoke of harmful gas (s-Acid) - var/datum/effect_system/smoke_spread/chem/S = new + var/datum/effect_system/fluid_spread/smoke/chem/S = new var/turf/location = get_turf(src) // Create the reagents to put into the air @@ -213,7 +213,7 @@ // Attach the smoke spreader and setup/start it. S.attach(location) - S.set_up(reagents, death_cloud_size, location, silent = TRUE) + S.set_up(death_cloud_size, location = location, carry = reagents, silent = TRUE) S.start() if(factory) factory.spore_delay = world.time + factory.spore_cooldown //put the factory on cooldown @@ -241,10 +241,6 @@ blob_head_overlay.color = overmind.blobstrain.complementary_color color = initial(color)//looks better. add_overlay(blob_head_overlay) - -/mob/living/simple_animal/hostile/blob/blobspore/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBSPORE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/blob/blobspore/independent gold_core_spawnable = HOSTILE_SPAWN independent = TRUE @@ -286,13 +282,6 @@ mob_size = MOB_SIZE_LARGE hud_type = /datum/hud/living/blobbernaut -/mob/living/simple_animal/hostile/blob/blobbernaut/Initialize(mapload) - . = ..() - add_cell_sample() - -/mob/living/simple_animal/hostile/blob/blobbernaut/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/blob/blobbernaut/Life(delta_time = SSMOBS_DT, times_fired) if(!..()) return @@ -350,7 +339,7 @@ if(factory) factory.naut = null //remove this naut from its factory factory.max_integrity = initial(factory.max_integrity) - flick("blobbernaut_death", src) + z_flick("blobbernaut_death", src) /mob/living/simple_animal/hostile/blob/blobbernaut/independent independent = TRUE diff --git a/code/modules/antagonists/blob/blobstrains/_reagent.dm b/code/modules/antagonists/blob/blobstrains/_reagent.dm index 7ecee4f6290d..3781eb3ec496 100644 --- a/code/modules/antagonists/blob/blobstrains/_reagent.dm +++ b/code/modules/antagonists/blob/blobstrains/_reagent.dm @@ -8,12 +8,12 @@ /datum/blobstrain/reagent/attack_living(mob/living/L) var/mob_protection = L.get_permeability_protection() - reagent.expose_mob(L, VAPOR, BLOB_REAGENTATK_VOL, 1, mob_protection, overmind) + reagent.expose_mob(L, BLOB_REAGENTATK_VOL, methods = VAPOR, show_message = TRUE, touch_protection = mob_protection) send_message(L) /datum/blobstrain/reagent/blobbernaut_attack(mob/living/L) var/mob_protection = L.get_permeability_protection() - reagent.expose_mob(L, VAPOR, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, 0, mob_protection, overmind)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. + reagent.expose_mob(L, BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL+blobbernaut_reagentatk_bonus, methods = VAPOR, show_message = FALSE, touch_protection = mob_protection)//this will do between 10 and 20 damage(reduced by mob protection), depending on chemical, plus 4 from base brute damage. /datum/blobstrain/reagent/on_sporedeath(mob/living/spore) spore.reagents.add_reagent(reagent.type, 10) diff --git a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm index ebc494e33209..b199c0b6c7e8 100644 --- a/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm +++ b/code/modules/antagonists/blob/blobstrains/cryogenic_poison.dm @@ -16,7 +16,7 @@ color = "#8BA6E9" taste_description = "brain freeze" -/datum/reagent/blob/cryogenic_poison/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) +/datum/reagent/blob/cryogenic_poison/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection, mob/camera/blob/overmind) . = ..() reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind) if(exposed_mob.reagents) @@ -25,9 +25,13 @@ exposed_mob.reagents.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*reac_volume) exposed_mob.apply_damage(0.2*reac_volume, BRUTE) -/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob, delta_time, times_fired) - exposed_mob.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE) - exposed_mob.adjustFireLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE) - exposed_mob.adjustToxLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE) - . = 1 - ..() +/datum/reagent/blob/cryogenic_poison/affect_blood(mob/living/carbon/C, removed) + C.adjustBruteLoss(1 * removed, FALSE) + C.adjustFireLoss(1 * removed, FALSE) + C.adjustToxLoss(1* removed, FALSE) + return TRUE + +/datum/reagent/blob/cryogenic_poison/affect_touch(mob/living/carbon/C, removed) + C.bloodstream.add_reagent(/datum/reagent/consumable/frostoil, 0.3*removed) + C.bloodstream.add_reagent(/datum/reagent/consumable/ice, 0.3*removed) + C.bloodstream.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*removed) diff --git a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm index 204e81fb9537..8daf1a6c1f89 100644 --- a/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm +++ b/code/modules/antagonists/blob/blobstrains/distributed_neurons.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/distributed_neurons /datum/blobstrain/reagent/distributed_neurons/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage <= 20 && B.get_integrity() - damage <= 0 && prob(15)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 15% chance of a shitty spore. + if((damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) && damage <= 20 && B.get_integrity() - damage <= 0 && prob(15)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 15% chance of a shitty spore. B.visible_message(span_warning("A spore floats free of the blob!")) var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc) BS.overmind = B.overmind @@ -29,7 +29,7 @@ reac_volume = return_mob_expose_reac_volume(exposed_mob, methods, reac_volume, show_message, touch_protection, overmind) exposed_mob.apply_damage(0.6*reac_volume, TOX) if(overmind && ishuman(exposed_mob)) - if(exposed_mob.stat == UNCONSCIOUS || exposed_mob.stat == HARD_CRIT) + if(exposed_mob.stat == UNCONSCIOUS) exposed_mob.death() //sleeping in a fight? bad plan. if(exposed_mob.stat == DEAD && overmind.can_buy(5)) var/mob/living/simple_animal/hostile/blob/blobspore/spore = new/mob/living/simple_animal/hostile/blob/blobspore(get_turf(exposed_mob)) diff --git a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm index 5db9c7ca4137..b20ab1fcaa9b 100644 --- a/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm +++ b/code/modules/antagonists/blob/blobstrains/electromagnetic_web.dm @@ -15,7 +15,7 @@ return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob /datum/blobstrain/reagent/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) + if(damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it /datum/reagent/blob/electromagnetic_web diff --git a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm index 5ad1eb59ce23..493643fa9898 100644 --- a/code/modules/antagonists/blob/blobstrains/energized_jelly.dm +++ b/code/modules/antagonists/blob/blobstrains/energized_jelly.dm @@ -10,7 +10,7 @@ reagent = /datum/reagent/blob/energized_jelly /datum/blobstrain/reagent/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && B.get_integrity() - damage <= 0 && prob(10)) + if((damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) && B.get_integrity() - damage <= 0 && prob(10)) do_sparks(rand(2, 4), FALSE, B) return ..() diff --git a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm index 5ce40bb7529c..bb97ba46b0e8 100644 --- a/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm +++ b/code/modules/antagonists/blob/blobstrains/explosive_lattice.dm @@ -14,7 +14,7 @@ /datum/blobstrain/reagent/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) if(damage_flag == BOMB) return 0 - else if(damage_flag != MELEE && damage_flag != BULLET && damage_flag != LASER) + else if(damage_flag != BLUNT && damage_flag != PUNCTURE && damage_flag != LASER) return damage * 1.5 return ..() diff --git a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm index 6fc3f02188b5..fdd19d64b258 100644 --- a/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm +++ b/code/modules/antagonists/blob/blobstrains/pressurized_slime.dm @@ -13,14 +13,14 @@ reagent = /datum/reagent/blob/pressurized_slime /datum/blobstrain/reagent/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) || damage_type != BURN) + if((damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) || damage_type != BURN) extinguisharea(B, damage) if(damage_type == BRUTE) return damage * 0.5 return ..() /datum/blobstrain/reagent/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag) - if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) + if(damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) B.visible_message(span_boldwarning("The blob ruptures, spraying the area with liquid!")) extinguisharea(B, 50) diff --git a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm index 9b023936a553..ade037803146 100644 --- a/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm +++ b/code/modules/antagonists/blob/blobstrains/regenerative_materia.dm @@ -24,10 +24,11 @@ exposed_mob.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume) exposed_mob.apply_damage(0.7*reac_volume, TOX) -/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - C.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER * delta_time) +/datum/reagent/blob/regenerative_materia/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustToxLoss(1 * removed, FALSE) C.hal_screwyhud = SCREWYHUD_HEALTHY //fully healed, honest - ..() + return TRUE /datum/reagent/blob/regenerative_materia/on_mob_end_metabolize(mob/living/M) if(iscarbon(M)) diff --git a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm index bc7b43c57433..cb34d197fe8d 100644 --- a/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm +++ b/code/modules/antagonists/blob/blobstrains/shifting_fragments.dm @@ -15,7 +15,7 @@ B.forceMove(T) /datum/blobstrain/reagent/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if((damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) && damage > 0 && B.get_integrity() - damage > 0 && prob(60-damage)) + if((damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) && damage > 0 && B.get_integrity() - damage > 0 && prob(60-damage)) var/list/blobstopick = list() for(var/obj/structure/blob/OB in orange(1, B)) if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blobstrain.type == B.overmind.blobstrain.type) diff --git a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm index d59adc5b8fc4..da58ed993fbc 100644 --- a/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm +++ b/code/modules/antagonists/blob/blobstrains/synchronous_mesh.dm @@ -12,7 +12,7 @@ reagent = /datum/reagent/blob/synchronous_mesh /datum/blobstrain/reagent/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) - if(damage_flag == MELEE || damage_flag == BULLET || damage_flag == LASER) //the cause isn't fire or bombs, so split the damage + if(damage_flag == BLUNT || damage_flag == PUNCTURE || damage_flag == LASER || damage_flag == SLASH) //the cause isn't fire or bombs, so split the damage var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs for(var/obj/structure/blob/C in orange(1, B)) if(!C.ignore_syncmesh_share && C.overmind && C.overmind.blobstrain.type == B.overmind.blobstrain.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it diff --git a/code/modules/antagonists/blob/overmind.dm b/code/modules/antagonists/blob/overmind.dm index 908e38be6a76..812b77eb3a1b 100644 --- a/code/modules/antagonists/blob/overmind.dm +++ b/code/modules/antagonists/blob/overmind.dm @@ -57,8 +57,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) autoplace_max_time += world.time GLOB.overminds += src var/new_name = "[initial(name)] ([rand(1, 999)])" - name = new_name - real_name = new_name + set_real_name(new_name) last_attack = world.time var/datum/blobstrain/BS = pick(GLOB.valid_blobstrains) set_strain(BS) @@ -106,13 +105,13 @@ GLOBAL_LIST_EMPTY(blob_nodes) if(blobstrain.effectdesc) to_chat(src, "The [blobstrain.name] strain [blobstrain.effectdesc]") -/mob/camera/blob/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) +/mob/camera/blob/can_z_move(direction, turf/start, z_move_flags = NONE, mob/living/rider) if(placed) // The blob can't expand vertically (yet) return FALSE . = ..() if(!.) return - var/turf/target_turf = . + var/turf/target_turf = get_step(src, dir) if(!is_valid_turf(target_turf)) // Allows unplaced blobs to travel through station z-levels if(z_move_flags & ZMOVE_FEEDBACK) to_chat(src, "Your destination is invalid. Move somewhere else and try again.") @@ -177,7 +176,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) else L.fully_heal(admin_revive = FALSE) - for(var/area/A in GLOB.sortedAreas) + for(var/area/A in GLOB.areas) if(!(A.type in GLOB.the_station_areas)) continue if(!(A.area_flags & BLOBS_ALLOWED)) @@ -196,7 +195,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) main_objective.completed = TRUE to_chat(world, "[real_name] consumed the station in an unstoppable tide!") SSticker.news_report = BLOB_WIN - SSticker.force_ending = 1 + SSticker.end_round() /mob/camera/blob/Destroy() QDEL_NULL(blobstrain) @@ -251,7 +250,7 @@ GLOBAL_LIST_EMPTY(blob_nodes) blob_points = clamp(blob_points + points, 0, max_blob_points) hud_used.blobpwrdisplay.maptext = MAPTEXT("
    [round(blob_points)]
    ") -/mob/camera/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/camera/blob/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if (!message) return diff --git a/code/modules/antagonists/blob/powers.dm b/code/modules/antagonists/blob/powers.dm index 4ad0e3597651..7a3d1ce88259 100644 --- a/code/modules/antagonists/blob/powers.dm +++ b/code/modules/antagonists/blob/powers.dm @@ -160,7 +160,7 @@ B.visible_message(span_warning("The blobbernaut [pick("rips", "tears", "shreds")] its way out of the factory blob!")) playsound(B.loc, 'sound/effects/splat.ogg', 50, TRUE) var/mob/living/simple_animal/hostile/blob/blobbernaut/blobber = new /mob/living/simple_animal/hostile/blob/blobbernaut(get_turf(B)) - flick("blobbernaut_produce", blobber) + z_flick("blobbernaut_produce", blobber) B.naut = blobber blobber.factory = B blobber.overmind = src diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 8b6391c6239b..791993ed4f31 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -13,7 +13,7 @@ /// How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed. var/point_return = 0 max_integrity = BLOB_REGULAR_MAX_HP - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 70) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 70) /// how much health this blob regens when pulsed var/health_regen = BLOB_REGULAR_HP_REGEN /// We got pulsed when? @@ -45,8 +45,6 @@ zas_update_loc() ConsumeTile() - if(!QDELETED(src)) //Consuming our tile can in rare cases cause us to del - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOB, CELL_VIRUS_TABLE_GENERIC, 2, 2) /obj/structure/blob/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -283,7 +281,7 @@ return 0 var/armor_protection = 0 if(damage_flag) - armor_protection = armor.getRating(damage_flag) + armor_protection = returnArmor().getRating(damage_flag) damage_amount = round(damage_amount * (100 - armor_protection)*0.01, 0.1) if(overmind && damage_flag) damage_amount = overmind.blobstrain.damage_reaction(src, damage_amount, damage_type, damage_flag) @@ -312,7 +310,7 @@ /obj/structure/blob/examine(mob/user) . = ..() var/datum/atom_hud/hud_to_check = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER) || hud_to_check.hudusers[user]) + if(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER) || hud_to_check.hud_users[user]) . += "Your HUD displays an extensive report...
    " if(overmind) . += overmind.blobstrain.examine(user) diff --git a/code/modules/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index 3b3ac3e617ab..faaf66bc9061 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A huge, pulsating yellow mass." max_integrity = BLOB_CORE_MAX_HP - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 90) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 90) explosion_block = 6 point_return = -1 health_regen = 0 //we regen in Life() instead of when pulsed @@ -65,17 +65,18 @@ /obj/structure/blob/special/core/process(delta_time) if(QDELETED(src)) return + if(!overmind) qdel(src) + if(overmind) overmind.blobstrain.core_process() overmind.update_health_hud() pulse_area(overmind, claim_range, pulse_range, expand_range) reinforce_area(delta_time) produce_spores() - ..() -/obj/structure/blob/special/core/ComponentInitialize() +/obj/structure/blob/special/core/Initialize(mapload) . = ..() AddComponent(/datum/component/stationloving, FALSE, TRUE) diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm index c9d9fc74335c..cc7641586499 100644 --- a/code/modules/antagonists/blob/structures/node.dm +++ b/code/modules/antagonists/blob/structures/node.dm @@ -5,7 +5,7 @@ desc = "A large, pulsating yellow mass." max_integrity = BLOB_NODE_MAX_HP health_regen = BLOB_NODE_HP_REGEN - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 65, ACID = 90) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 65, ACID = 90) point_return = BLOB_REFUND_NODE_COST claim_range = BLOB_NODE_CLAIM_RANGE pulse_range = BLOB_NODE_PULSE_RANGE diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index a329a2470813..27dc120569ee 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -10,7 +10,7 @@ explosion_block = 3 point_return = BLOB_REFUND_STRONG_COST atmosblock = TRUE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 90, ACID = 90) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 90, ACID = 90) /obj/structure/blob/shield/scannerreport() if(atmosblock) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index b56f276e8dfc..d9f7ca8eef43 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -48,7 +48,6 @@ if(owner.current) var/mob/living/owner_mob = owner.current owner_mob.log_message("is no longer brainwashed with the objectives: [english_list(objectives)].", LOG_ATTACK) - owner.announce_objectives() return ..() /datum/antagonist/brainwashed/on_mindshield(mob/implanter) diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index 3131b7690cb0..9200db835212 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -8,7 +8,6 @@ ui_name = "AntagInfoBrother" suicide_cry = "FOR MY BROTHER!!" var/datum/team/brother_team/team - antag_moodlet = /datum/mood_event/focused /datum/antagonist/brother/create_team(datum/team/brother_team/new_team) if(!new_team) @@ -47,11 +46,15 @@ brother2.set_species(/datum/species/moth) var/icon/brother1_icon = render_preview_outfit(/datum/outfit/job/quartermaster, brother1) - brother1_icon.Blend(icon('icons/effects/blood.dmi', "maskblood"), ICON_OVERLAY) + var/icon/blood_overlay = icon('icons/effects/blood.dmi', "maskblood") + blood_overlay.Blend(COLOR_HUMAN_BLOOD, ICON_MULTIPLY) + brother1_icon.Blend(blood_overlay, ICON_OVERLAY) brother1_icon.Shift(WEST, 8) - var/icon/brother2_icon = render_preview_outfit(/datum/outfit/job/scientist/consistent, brother2) - brother2_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY) + var/icon/brother2_icon = render_preview_outfit(/datum/outfit/job/doctor, brother2) + blood_overlay = icon('icons/effects/blood.dmi', "uniformblood") + blood_overlay.Blend(COLOR_HUMAN_BLOOD, ICON_MULTIPLY) + brother2_icon.Blend(blood_overlay, ICON_OVERLAY) brother2_icon.Shift(EAST, 8) var/icon/final_icon = brother1_icon @@ -74,18 +77,24 @@ brother_text += ", " return brother_text -/datum/antagonist/brother/proc/give_meeting_area() - if(!owner.current || !team || !team.meeting_area) +/datum/antagonist/brother/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/M = mob_override || owner.current + if(!M.mind?.current || !team || !team.meeting_area) return - to_chat(owner.current, "Your designated meeting area: [team.meeting_area]") + antag_memory += "Meeting Area: [team.meeting_area]
    " -/datum/antagonist/brother/greet() +/datum/antagonist/brother/build_greeting() + . = ..() + if(!team || !team.meeting_area) + return + + . += "Your designated meeting area is: [team.meeting_area]" + +/datum/antagonist/brother/greeting_header() var/brother_text = get_brother_names() - to_chat(owner.current, span_alertsyndie("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!") - owner.announce_objectives() - give_meeting_area() + return "You are the [owner.special_role] of [brother_text]." /datum/antagonist/brother/proc/finalize_brother() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) @@ -172,21 +181,13 @@ /datum/team/brother_team/proc/forge_brother_objectives() objectives = list() - var/is_hijacker = prob(10) - for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker)) + for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2))) forge_single_objective() - if(is_hijacker) - if(!locate(/datum/objective/hijack) in objectives) - add_objective(new/datum/objective/hijack) - else if(!locate(/datum/objective/escape) in objectives) - add_objective(new/datum/objective/escape) /datum/team/brother_team/proc/forge_single_objective() if(prob(50)) if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len)) add_objective(new/datum/objective/destroy, TRUE) - else if(prob(30)) - add_objective(new/datum/objective/maroon, TRUE) else add_objective(new/datum/objective/assassinate, TRUE) else diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index a699af7cefc3..8c93fb2ff932 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -11,7 +11,6 @@ roundend_category = "changelings" antagpanel_category = "Changeling" job_rank = ROLE_CHANGELING - antag_moodlet = /datum/mood_event/focused antag_hud_name = "changeling" hijack_speed = 0.5 ui_name = "AntagInfoChangeling" @@ -135,12 +134,11 @@ if(living_mob.hud_used) var/datum/hud/hud_used = living_mob.hud_used - lingchemdisplay = new /atom/movable/screen/ling/chems() - lingchemdisplay.hud = hud_used + lingchemdisplay = new /atom/movable/screen/ling/chems(null, hud_used) hud_used.infodisplay += lingchemdisplay - lingstingdisplay = new /atom/movable/screen/ling/sting() - lingstingdisplay.hud = hud_used + lingstingdisplay = new /atom/movable/screen/ling/sting(null, hud_used) + hud_used.infodisplay += lingstingdisplay hud_used.show_hud(hud_used.hud_version) @@ -602,35 +600,16 @@ destroy_objective.find_target() objectives += destroy_objective else - if(prob(70)) - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - objectives += kill_objective - else - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - maroon_objective.find_target() - objectives += maroon_objective - - if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.target = maroon_objective.target - identity_theft.update_explanation_text() - objectives += identity_theft - escape_objective_possible = FALSE + var/datum/objective/assassinate/kill_objective = new + kill_objective.owner = owner + kill_objective.find_target() + objectives += kill_objective if (!(locate(/datum/objective/escape) in objectives) && escape_objective_possible) - if(prob(50)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - else - var/datum/objective/escape/escape_with_identity/identity_theft = new - identity_theft.owner = owner - identity_theft.find_target() - objectives += identity_theft + var/datum/objective/escape/escape_with_identity/identity_theft = new + identity_theft.owner = owner + identity_theft.find_target() + objectives += identity_theft escape_objective_possible = FALSE /datum/antagonist/changeling/get_admin_commands() @@ -648,7 +627,7 @@ var/mob/living/carbon/carbon_owner = owner.current first_profile.dna.transfer_identity(carbon_owner, transfer_SE = TRUE) - carbon_owner.real_name = first_profile.name + carbon_owner.set_real_name( first_profile.name) carbon_owner.updateappearance(mutcolor_update = TRUE) carbon_owner.domutcheck() @@ -673,7 +652,7 @@ ) var/datum/dna/chosen_dna = chosen_profile.dna - user.real_name = chosen_profile.name + user.set_real_name(chosen_profile.name) user.underwear = chosen_profile.underwear user.undershirt = chosen_profile.undershirt user.socks = chosen_profile.socks @@ -897,12 +876,15 @@ total_chem_storage = 50 /datum/antagonist/changeling/headslug/greet() - to_chat(owner, span_boldannounce("You are a fresh changeling birthed from a headslug! You aren't as strong as a normal changeling, as you are newly born.")) - + . = ..() var/policy = get_policy(ROLE_HEADSLUG_CHANGELING) if(policy) to_chat(owner, policy) +/datum/antagonist/changeling/headslug/build_greeting() + . = ..() + . += "You are a fresh changeling birthed from a headslug! You aren't as strong as a normal changeling, as you are newly born." + /datum/outfit/changeling name = "Changeling" diff --git a/code/modules/antagonists/changeling/fallen_changeling.dm b/code/modules/antagonists/changeling/fallen_changeling.dm index c44c1b66cd3d..5cdde9bc3b87 100644 --- a/code/modules/antagonists/changeling/fallen_changeling.dm +++ b/code/modules/antagonists/changeling/fallen_changeling.dm @@ -4,10 +4,4 @@ roundend_category = "changelings" antagpanel_category = "Changeling" job_rank = ROLE_CHANGELING - antag_moodlet = /datum/mood_event/fallen_changeling antag_hud_name = "changeling" - -/datum/mood_event/fallen_changeling - description = "My powers! Where are my powers?!" - mood_change = -4 - diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 8ce7d4eb0aa9..83efdc1e59a6 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -16,20 +16,21 @@ to_chat(owner, span_warning("We are already absorbing!")) return - if(!owner.pulling || !iscarbon(owner.pulling)) + var/obj/item/hand_item/grab/G = owner.get_active_grab() + if(!G) to_chat(owner, span_warning("We must be grabbing a creature to absorb them!")) return - if(owner.grab_state <= GRAB_NECK) + if(!G.current_grab.can_absorb) to_chat(owner, span_warning("We must have a tighter grip to absorb this creature!")) return - var/mob/living/carbon/target = owner.pulling + var/mob/living/carbon/target = G.affecting var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) return changeling.can_absorb_dna(target) -/datum/action/changeling/absorb_dna/sting_action(mob/owner) +/datum/action/changeling/absorb_dna/sting_action(mob/living/owner) var/datum/antagonist/changeling/changeling = owner.mind.has_antag_datum(/datum/antagonist/changeling) - var/mob/living/carbon/human/target = owner.pulling + var/mob/living/carbon/human/target = owner.get_active_grab()?.affecting is_absorbing = TRUE if(!attempt_absorb(target)) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index b2fb47ff3580..d11c6696ebbf 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -9,7 +9,7 @@ /datum/action/changeling/biodegrade/sting_action(mob/living/carbon/human/user) var/used = FALSE // only one form of shackles removed per use - if(!HAS_TRAIT(user, TRAIT_RESTRAINED) && !user.legcuffed && isopenturf(user.loc)) + if(!HAS_TRAIT(user, TRAIT_ARMS_RESTRAINED) && !user.legcuffed && isopenturf(user.loc)) to_chat(user, span_warning("We are already free!")) return FALSE @@ -51,15 +51,6 @@ to_chat(user, span_warning("We vomit acidic goop onto the interior of [C]!")) addtimer(CALLBACK(src, PROC_REF(open_closet), user, C), 70) used = TRUE - - if(istype(user.loc, /obj/structure/spider/cocoon) && !used) - var/obj/structure/spider/cocoon/C = user.loc - if(!istype(C)) - return FALSE - C.visible_message(span_warning("[src] shifts and starts to fall apart!")) - to_chat(user, span_warning("We secrete acidic enzymes from our skin and begin melting our cocoon...")) - addtimer(CALLBACK(src, PROC_REF(dissolve_cocoon), user, C), 25) //Very short because it's just webs - used = TRUE ..() return used @@ -90,9 +81,3 @@ C.broken = TRUE C.open() to_chat(user, span_warning("We open the container restraining us!")) - -/datum/action/changeling/biodegrade/proc/dissolve_cocoon(mob/living/carbon/human/user, obj/structure/spider/cocoon/C) - if(C && user.loc == C) - new /obj/effect/decal/cleanable/greenglow(C.drop_location()) - qdel(C) //The cocoon's destroy will move the changeling outside of it without interference - to_chat(user, span_warning("We dissolve the cocoon!")) diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 68f5e51d2dff..8d8a85ebdbfb 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -42,7 +42,7 @@ loud, crunchy sound and giving you great pain!", "You hear organic matter ripping \ and tearing!") - user.emote("scream") + user.emote("agony") user.regenerate_limbs(list(BODY_ZONE_HEAD)) user.regenerate_organs() diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index 2a9c89f12354..d049fbc95e5a 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -5,7 +5,7 @@ button_icon_state = "fleshmend" chemical_cost = 20 dna_cost = 2 - req_stat = HARD_CRIT + req_stat = UNCONSCIOUS //Starts healing you every second for 10 seconds. //Can be used whilst unconscious. diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index a6718f4f2898..885b42159656 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -49,7 +49,7 @@ limb_regen = user.regenerate_limb(BODY_ZONE_L_ARM, 1) if(limb_regen) user.visible_message(span_warning("[user]'s missing arm reforms, making a loud, grotesque sound!"), span_userdanger("Your arm regrows, making a loud, crunchy sound and giving you great pain!"), span_hear("You hear organic matter ripping and tearing!")) - user.emote("scream") + user.emote("agony") var/obj/item/W = new weapon_type(user, silent) user.put_in_hands(W) if(!silent) @@ -93,9 +93,6 @@ H.visible_message(span_warning("[H] casts off [H.p_their()] [suit_name_simple]!"), span_warning("We cast off our [suit_name_simple]."), span_hear("You hear the organic matter ripping and tearing!")) H.temporarilyRemoveItemFromInventory(H.head, TRUE) //The qdel on dropped() takes care of it H.temporarilyRemoveItemFromInventory(H.wear_suit, TRUE) - H.update_worn_oversuit() - H.update_worn_head() - H.update_body_parts() if(blood_on_castoff) H.add_splatter_floor() @@ -112,10 +109,10 @@ ..() /datum/action/changeling/suit/sting_action(mob/living/carbon/human/user) - if(!user.canUnEquip(user.wear_suit)) + if(!user.canUnequipItem(user.wear_suit)) to_chat(user, span_warning("\the [user.wear_suit] is stuck to your body, you cannot grow a [suit_name_simple] over it!")) return - if(!user.canUnEquip(user.head)) + if(!user.canUnequipItem(user.head)) to_chat(user, span_warning("\the [user.head] is stuck on your head, you cannot grow a [helmet_name_simple] over it!")) return ..() @@ -265,7 +262,7 @@ /obj/item/gun/magic/tentacle/shoot_with_empty_chamber(mob/living/user as mob|obj) to_chat(user, span_warning("The [name] is not ready yet.")) -/obj/item/gun/magic/tentacle/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) +/obj/item/gun/magic/tentacle/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) var/obj/projectile/tentacle/tentacle_shot = chambered.loaded_projectile //Gets the actual projectile we will fire tentacle_shot.fire_modifiers = params2list(params) . = ..() @@ -313,7 +310,7 @@ /obj/projectile/tentacle/fire(setAngle) if(firer) - chain = firer.Beam(src, icon_state = "tentacle") + chain = firer.Beam(src, icon_state = "tentacle", emissive = FALSE) ..() /obj/projectile/tentacle/proc/reset_throw(mob/living/carbon/human/H) @@ -326,8 +323,8 @@ H.swap_hand() if(H.get_active_held_item()) return - C.grabbedby(H) - C.grippedby(H, instant = TRUE) //instant aggro grab + + H.try_make_grab(C, /datum/grab/normal/aggressive) /obj/projectile/tentacle/proc/tentacle_stab(mob/living/carbon/human/H, mob/living/carbon/C) if(H.Adjacent(C)) @@ -337,7 +334,7 @@ C.apply_damage(I.force, BRUTE, BODY_ZONE_CHEST) H.do_item_attack_animation(C, used_item = I) H.add_mob_blood(C) - playsound(get_turf(H),I.hitsound,75,TRUE) + playsound(get_turf(H), I.get_hitsound(),75,TRUE) return /obj/projectile/tentacle/on_hit(atom/target, blocked = FALSE) @@ -436,16 +433,19 @@ if(ismob(loc)) loc.visible_message(span_warning("The end of [loc.name]\'s hand inflates rapidly, forming a huge shield-like mass!"), span_warning("We inflate our hand into a strong shield."), span_hear("You hear organic matter ripping and tearing!")) -/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/changeling/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) + . = ..() + if(!.) + return + if(remaining_uses < 1) if(ishuman(loc)) var/mob/living/carbon/human/H = loc H.visible_message(span_warning("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!"), span_notice("We assimilate our shield into our body"), "", "You hear organic matter ripping \ and tearing!") - C.emote("scream") + C.emote("agony") C.regenerate_limbs() - if(!user.getorganslot(ORGAN_SLOT_BRAIN)) - var/obj/item/organ/brain/B - if(C.has_dna() && C.dna.species.mutantbrain) - B = new C.dna.species.mutantbrain() - else - B = new() + if(!user.getorganslot(ORGAN_SLOT_BRAIN) && user.needs_organ(ORGAN_SLOT_BRAIN)) + var/obj/item/organ/brain/B = C.dna.species.organs[ORGAN_SLOT_BRAIN] + B = new B() B.organ_flags &= ~ORGAN_VITAL B.decoy_override = TRUE B.Insert(C) diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index 9d2dfc3858b1..c13bea4223f3 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -29,7 +29,7 @@ for(var/obj/machinery/light/L in range(4, user)) L.on = TRUE L.break_light_tube() - stoplag() + CHECK_TICK return TRUE /datum/action/changeling/dissonant_shriek @@ -45,6 +45,6 @@ for(var/obj/machinery/light/L in range(5, usr)) L.on = TRUE L.break_light_tube() - stoplag() + CHECK_TICK return TRUE diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm deleted file mode 100644 index ce23fc0eb1b5..000000000000 --- a/code/modules/antagonists/changeling/powers/spiders.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/action/changeling/spiders - name = "Spread Infestation" - desc = "Our form divides, creating a cluster of eggs which will grow into a deadly arachnid. Costs 45 chemicals." - helptext = "The spiders are ruthless creatures, and may attack their creators when fully grown. Requires at least 3 DNA absorptions." - button_icon_state = "spread_infestation" - chemical_cost = 45 - dna_cost = 1 - req_absorbs = 3 - -//Makes a spider egg cluster. Allows you enable further general havok by introducing spiders to the station. -/datum/action/changeling/spiders/sting_action(mob/user) - ..() - new /obj/effect/mob_spawn/ghost_role/spider/bloody(user.loc) - return TRUE diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index bba1040ad03b..757c1cdf8c8a 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -47,7 +47,7 @@ return if(!isturf(user.loc)) return - if(!length(get_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE))) + if(!length(jps_path_to(user, target, max_distance = changeling.sting_range, simulated_only = FALSE))) return // no path within the sting's range is found. what a weird place to use the pathfinding system if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) sting_feedback(user, target) @@ -59,7 +59,8 @@ return to_chat(user, span_notice("We stealthily sting [target.name].")) if(target.mind && target.mind.has_antag_datum(/datum/antagonist/changeling)) - to_chat(target, span_warning("You feel a tiny prick.")) + var/mob/living/L = target + L.apply_pain(1, BODY_ZONE_CHEST, "You feel a tiny prick!") return 1 @@ -102,7 +103,7 @@ var/mob/living/carbon/C = target . = TRUE if(istype(C)) - C.real_name = NewDNA.real_name + C.set_real_name(NewDNA.real_name) NewDNA.transfer_identity(C) C.updateappearance(mutcolor_update=1) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index b51bb3642048..d85acbb7dfbb 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -116,11 +116,10 @@ /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 + if(!hud_icon) + return + + set_hud_image_vars(ID_HUD, hud_icon, get_hud_pixel_y()) /** * Returns cached flat icon of the ID, creates one if there is not one already cached @@ -131,7 +130,8 @@ 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 + var/that_string = gender == PLURAL ? "Those are " : "That is " + return "[icon2html(get_cached_flat_icon(), user)] [thats? that_string : ""][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) diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index 6678413bda23..10847ac67d96 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -17,7 +17,7 @@ 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_traits = list(TRAIT_NO_SLIP_WATER) slowdown = SHOES_SLOWDOWN - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, FIRE = 70, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 25, SLASH = 0, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, FIRE = 70, ACID = 50) strip_delay = 70 resistance_flags = NONE @@ -35,7 +35,7 @@ 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, FIRE = 70, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 25, SLASH = 0, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, FIRE = 70, ACID = 50) strip_delay = 70 resistance_flags = NONE always_noslip = TRUE @@ -49,6 +49,10 @@ bananium.insert_amount_mat(BANANA_SHOES_MAX_CHARGE, /datum/material/bananium) START_PROCESSING(SSobj, src) +/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) @@ -195,9 +199,6 @@ if(iscarbon(loc)) to_chat(loc, span_danger("[src] begins to beep.")) bomb.arm_grenade(loc, null, FALSE) - -/obj/item/grown/bananapeel/bombanana/ComponentInitialize() - . = ..() AddComponent(/datum/component/slippery, det_time) /obj/item/grown/bananapeel/bombanana/Destroy() diff --git a/code/modules/antagonists/clown_ops/outfits.dm b/code/modules/antagonists/clown_ops/outfits.dm index 8536ffd056e0..15cd7407066c 100644 --- a/code/modules/antagonists/clown_ops/outfits.dm +++ b/code/modules/antagonists/clown_ops/outfits.dm @@ -12,7 +12,6 @@ backpack_contents = list(/obj/item/storage/box/survival/syndie=1,\ /obj/item/knife/combat/survival, /obj/item/dnainjector/clumsymut, //in case you want to be clumsy for the memes - /obj/item/storage/box/syndie_kit/clownpins, //for any guns that you get your grubby little clown op mitts on /obj/item/reagent_containers/spray/waterflower/lube, /obj/item/mod/skin_applier/honkerative, ) diff --git a/code/modules/antagonists/contractor/contract.dm b/code/modules/antagonists/contractor/contract.dm deleted file mode 100644 index 2178d1359cd4..000000000000 --- a/code/modules/antagonists/contractor/contract.dm +++ /dev/null @@ -1,257 +0,0 @@ -#define RANSOM_LOWER 25 -#define RANSOM_UPPER 75 -#define CONTRACTOR_RANSOM_CUT 0.35 - -/datum/syndicate_contract - /// Unique ID tied to the contract - var/id = 0 - /// If the contract is the contractor's current one - var/status = CONTRACT_STATUS_INACTIVE - /// Reference to the objective datum - var/datum/objective/contract/contract = new() - /// Target's job - var/target_rank - /// A number in multiples of 100, anywhere from 2500 credits to 7500, station cost when someone is kidnapped - var/ransom = 0 - /// TC payout size, will be small, medium, or large. - var/payout_type - /// Mad-libs style wanted message, just flavor. - var/wanted_message - /// List of the items the victim had on them prior to kidnapping. - var/list/victim_belongings = list() - -/datum/syndicate_contract/New(contract_owner, blacklist, type = CONTRACT_PAYOUT_SMALL) - contract.owner = contract_owner - payout_type = type - - generate(blacklist) - -/// Generation of the contract, called on New() -/datum/syndicate_contract/proc/generate(blacklist) - contract.find_target(null, blacklist) - - var/datum/data/record/record - if (contract.target) - record = find_record("name", contract.target.name, GLOB.data_core.general) - - if (record) - target_rank = record.fields["rank"] - else - target_rank = "Unknown" - - if (payout_type == CONTRACT_PAYOUT_LARGE) - contract.payout_bonus = rand(9,13) - else if (payout_type == CONTRACT_PAYOUT_MEDIUM) - contract.payout_bonus = rand(6,8) - else - contract.payout_bonus = rand(2,4) - - contract.payout = rand(1, 2) - contract.generate_dropoff() - - ransom = 100 * rand(RANSOM_LOWER, RANSOM_UPPER) - - var/base = pick_list(WANTED_FILE, "basemessage") - var/verb_string = pick_list(WANTED_FILE, "verb") - var/noun = pick_list_weighted(WANTED_FILE, "noun") - var/location = pick_list_weighted(WANTED_FILE, "location") - wanted_message = "[base] [verb_string] [noun] [location]." - -/// Handler to find a valid turn and launch victim collector -/datum/syndicate_contract/proc/handle_extraction(mob/living/user) - if(!(contract.target && contract.dropoff_check(user, contract.target.current))) - return FALSE - - var/turf/free_location = find_obstruction_free_location(3, user, contract.dropoff) - - if(!free_location) - return FALSE - - launch_extraction_pod(free_location) - return TRUE - - -/// Launch the pod to collect our victim. -/datum/syndicate_contract/proc/launch_extraction_pod(turf/empty_pod_turf) - var/obj/structure/closet/supplypod/extractionpod/empty_pod = new() - empty_pod.contract_hub = GLOB.contractors[contract.owner] - empty_pod.tied_contract = src - empty_pod.recieving = TRUE - - RegisterSignal(empty_pod, COMSIG_ATOM_ENTERED, PROC_REF(enter_check)) - - empty_pod.stay_after_drop = TRUE - empty_pod.reversing = TRUE - empty_pod.explosionSize = list(0,0,0,1) - empty_pod.leavingSound = 'sound/effects/podwoosh.ogg' - - new /obj/effect/pod_landingzone(empty_pod_turf, empty_pod) - -/datum/syndicate_contract/proc/enter_check(datum/source, mob/living/sent_mob) - SIGNAL_HANDLER - if(!istype(source, /obj/structure/closet/supplypod/extractionpod)) - return - if(!istype(sent_mob)) - return - var/datum/contractor_hub/the_hub = GLOB.contractors[contract.owner] - if(!the_hub) - return - if (sent_mob == contract.target.current) - the_hub.contract_TC_to_redeem += contract.payout - the_hub.contracts_completed += 1 - - if (sent_mob.stat != DEAD) - the_hub.contract_TC_to_redeem += contract.payout_bonus - - status = CONTRACT_STATUS_COMPLETE - - the_hub.contract_rep += 2 - else - status = CONTRACT_STATUS_ABORTED // Sending a sent_mob that wasn't even yours is as good as just aborting it - - if(the_hub.current_contract == src) - the_hub.current_contract = null - - if(ishuman(sent_mob)) - var/mob/living/carbon/human/sent_mob_human = sent_mob - for(var/obj/item/sent_mob_item in sent_mob_human) - if(sent_mob_item == sent_mob_human.w_uniform) - continue //So all they're left with are shoes and uniform. - if(sent_mob_item == sent_mob_human.shoes) - continue - - sent_mob_human.transferItemToLoc(sent_mob_item) - victim_belongings.Add(sent_mob_item) - // After we remove items, at least give them what they need to live. - sent_mob_human.dna.species.give_important_for_life(sent_mob_human) - - var/obj/structure/closet/supplypod/extractionpod/pod = source - pod.recieving = FALSE - - // Handle the pod returning - pod.startExitSequence(pod) - - // After pod is sent we start the victim narrative/heal. - INVOKE_ASYNC(src, PROC_REF(handle_victim_experience), sent_mob) - - // This is slightly delayed because of the sleep calls above to handle the narrative. - // We don't want to tell the station instantly. - var/points_to_check - var/datum/bank_account/bank = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] - if(bank) - points_to_check = bank.account_balance - if(points_to_check >= ransom) - bank.adjust_money(-ransom) - else - bank.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.", "Daedalus Industries Asset Protection", sound_type = ANNOUNCER_CENTCOM) - - addtimer(CALLBACK(src, PROC_REF(finish_enter)), 3 SECONDS) - -/// Called when person is finished shoving in, awards ransom money -/datum/syndicate_contract/proc/finish_enter() - // Pay contractor their portion of ransom - if(!(status == CONTRACT_STATUS_COMPLETE)) - return - var/obj/item/card/id/owner_id = contract.owner.current?.get_idcard(TRUE) - - if(owner_id?.registered_account) - owner_id.registered_account.adjust_money(ransom * CONTRACTOR_RANSOM_CUT) - - owner_id.registered_account.bank_card_talk("We've processed the ransom, agent. Here's your cut - your balance is now \ - [owner_id.registered_account.account_balance] credits.", TRUE) - -/// They're off to holding - handle the return timer and give some text about what's going on. -/datum/syndicate_contract/proc/handle_victim_experience(mob/living/target) - // Ship 'em back - dead or alive, 4 minutes wait. - // Even if they weren't the target, we're still treating them the same. - addtimer(CALLBACK(src, PROC_REF(return_victim), target), 4 MINUTES) - - if (target.stat == DEAD) - return - // Heal them up - gets them out of crit/soft crit. If omnizine is removed in the future, this needs to be replaced with a - // method of healing them, consequence free, to a reasonable amount of health. - target.reagents.add_reagent(/datum/reagent/medicine/omnizine, 20) - victim_stage_one(target) - -/datum/syndicate_contract/proc/victim_stage_one(mob/living/target) - target.flash_act() - target.adjust_timed_status_effect(10 SECONDS, /datum/status_effect/confusion) - target.blur_eyes(5) - to_chat(target, span_warning("You feel strange...")) - addtimer(CALLBACK(src, PROC_REF(victim_stage_two), target), 6 SECONDS) - -/datum/syndicate_contract/proc/victim_stage_two(mob/living/target) - to_chat(target, span_warning("That pod did something to you...")) - target.adjust_timed_status_effect(10 SECONDS, /datum/status_effect/dizziness) - addtimer(CALLBACK(src, PROC_REF(victim_stage_three), target), 6 SECONDS) - -/datum/syndicate_contract/proc/victim_stage_three(mob/living/target) - to_chat(target, span_warning("Your head pounds... It feels like it's going to burst out your skull!")) - target.flash_act() - target.adjust_timed_status_effect(20 SECONDS, /datum/status_effect/confusion) - target.blur_eyes(3) - addtimer(CALLBACK(src, PROC_REF(victim_stage_four), target), 3 SECONDS) - -/datum/syndicate_contract/proc/victim_stage_four(mob/living/target) - to_chat(target, span_warning("Your head pounds...")) - addtimer(CALLBACK(src, PROC_REF(victim_stage_five), target), 10 SECONDS) - -/datum/syndicate_contract/proc/victim_stage_five(mob/living/target) - target.flash_act() - target.Unconscious(200) - to_chat(target, span_hypnophrase(span_reallybig("A million voices echo in your head... \"Your mind held many valuable secrets - \ - we thank you for providing them. Your value is expended, and you will be ransomed back to your station. We always get paid, \ - so it's only a matter of time before we ship you back...\""))) - target.blur_eyes(10) - target.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/dizziness) - target.adjust_timed_status_effect(20 SECONDS, /datum/status_effect/confusion) - -/// We're returning the victim -/datum/syndicate_contract/proc/return_victim(mob/living/carbon/target) - var/list/possible_drop_loc = list() - - for(var/turf/possible_drop in contract.dropoff.contents) - if(is_safe_turf(possible_drop)) - possible_drop_loc += possible_drop - - if (length(possible_drop_loc)) - var/pod_rand_loc = rand(1, length(possible_drop_loc)) - - var/obj/structure/closet/supplypod/return_pod = new() - return_pod.bluespace = TRUE - return_pod.explosionSize = list(0,0,0,0) - return_pod.style = STYLE_SYNDICATE - - do_sparks(8, FALSE, target) - target.visible_message(span_notice("[target] vanishes...")) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - for(var/obj/item/target_item as anything in target.get_all_worn_items()) - if(target_item == human_target.w_uniform) - continue //So all they're left with are shoes and uniform. - if(target_item == human_target.shoes) - continue - target.dropItemToGround(target_item) - - for(var/obj/item/target_item as anything in victim_belongings) - target_item.forceMove(return_pod) - - target.forceMove(return_pod) - - target.flash_act() - target.blur_eyes(30) - target.adjust_timed_status_effect(7 SECONDS, /datum/status_effect/dizziness) - target.adjust_timed_status_effect(20 SECONDS, /datum/status_effect/confusion) - - new /obj/effect/pod_landingzone(possible_drop_loc[pod_rand_loc], return_pod) - else - to_chat(target, span_hypnophrase(span_reallybig("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.\""))) - target.death() - -#undef RANSOM_LOWER -#undef RANSOM_UPPER -#undef CONTRACTOR_RANSOM_CUT diff --git a/code/modules/antagonists/contractor/contractor_hub.dm b/code/modules/antagonists/contractor/contractor_hub.dm deleted file mode 100644 index 268092a7c0bc..000000000000 --- a/code/modules/antagonists/contractor/contractor_hub.dm +++ /dev/null @@ -1,115 +0,0 @@ -#define LOWEST_TC 30 - -GLOBAL_LIST_EMPTY(contractors) -/datum/contractor_hub - /// How much reputation the contractor has - var/contract_rep = 0 - /// What contractor items can be purchased - var/list/hub_items = list() - /// List of what the contractor's purchased - var/list/purchased_items = list() - /// Static of contractor_item subtypes - var/static/list/contractor_items = typecacheof(/datum/contractor_item, ignore_root_path = TRUE) - /// Reference to the current contract datum - var/datum/syndicate_contract/current_contract - /// List of all contract datums the contractor has available - var/list/datum/syndicate_contract/assigned_contracts = list() - /// Used as a blacklist to make sure we're not assigning targets already assigned - var/list/assigned_targets = list() - /// Number of how many contracts you've done - var/contracts_completed = 0 - /// How many TC you've paid out in contracts - var/contract_paid_out = 0 - /// Amount of TC that has yet to be redeemed - var/contract_TC_to_redeem = 0 - /// Current index number for contract IDs - var/start_index = 1 - -/// Generates a list of all valid hub items to set for purchase -/datum/contractor_hub/proc/create_hub_items() - for(var/path in contractor_items) - var/datum/contractor_item/contractor_item = new path - - hub_items.Add(contractor_item) - -/// Create initial list of contracts -/datum/contractor_hub/proc/create_contracts(datum/mind/owner) - - // 6 initial contracts - var/list/to_generate = list( - CONTRACT_PAYOUT_LARGE, - CONTRACT_PAYOUT_MEDIUM, - CONTRACT_PAYOUT_MEDIUM, - CONTRACT_PAYOUT_SMALL, - CONTRACT_PAYOUT_SMALL, - CONTRACT_PAYOUT_SMALL - ) - - //What the fuck - if(length(to_generate) > length(GLOB.data_core.locked)) - to_generate.Cut(1, length(GLOB.data_core.locked)) - - var/total = 0 - var/lowest_paying_sum = 0 - var/datum/syndicate_contract/lowest_paying_contract - - // Randomise order, so we don't have contracts always in payout order. - to_generate = shuffle(to_generate) - - // Support contract generation happening multiple times - if (length(assigned_contracts)) - start_index = length(assigned_contracts) + 1 - - // Generate contracts, and find the lowest paying. - for(var/contract_gen in 1 to length(to_generate)) - var/datum/syndicate_contract/contract_to_add = new(owner, assigned_targets, to_generate[contract_gen]) - var/contract_payout_total = contract_to_add.contract.payout + contract_to_add.contract.payout_bonus - - assigned_targets.Add(contract_to_add.contract.target) - - if (!lowest_paying_contract || (contract_payout_total < lowest_paying_sum)) - lowest_paying_sum = contract_payout_total - lowest_paying_contract = contract_to_add - - total += contract_payout_total - contract_to_add.id = start_index - assigned_contracts.Add(contract_to_add) - - start_index++ - - // If the threshold for TC payouts isn't reached, boost the lowest paying contract - if (total < LOWEST_TC && lowest_paying_contract) - lowest_paying_contract.contract.payout_bonus += (LOWEST_TC - total) - -/// End-round generation proc for contractors -/datum/contractor_hub/proc/contractor_round_end() - var/result = "" - var/total_spent_rep = 0 - - var/contractor_item_icons = "" // Icons of purchases - var/contractor_support_unit = "" // Set if they had a support unit - and shows appended to their contracts completed - - // Get all the icons/total cost for all our items bought - for (var/datum/contractor_item/contractor_purchase in purchased_items) - contractor_item_icons += "\[ [contractor_purchase.name] - [contractor_purchase.cost] Rep

    [contractor_purchase.desc]
    \]
    " - - total_spent_rep += contractor_purchase.cost - - // Special case for reinforcements, we want to show their ckey and name on round end. - if (istype(contractor_purchase, /datum/contractor_item/contractor_partner)) - var/datum/contractor_item/contractor_partner/partner = contractor_purchase - contractor_support_unit += "
    [partner.partner_mind.key] played [partner.partner_mind.current.name], their contractor support unit." - - if (length(purchased_items)) - result += "
    (used [total_spent_rep] Rep) " - result += contractor_item_icons - result += "
    " - if (contracts_completed > 0) - var/plural_check = "contract[contracts_completed > 1 ? "s" : ""]" - - result += "Completed [span_greentext("[contracts_completed]")] [plural_check] for a total of \ - [span_greentext("[contract_paid_out + contract_TC_to_redeem] TC")]![contractor_support_unit]
    " - - return result - -#undef LOWEST_TC diff --git a/code/modules/antagonists/contractor/contractor_items.dm b/code/modules/antagonists/contractor/contractor_items.dm deleted file mode 100644 index c299febc54b5..000000000000 --- a/code/modules/antagonists/contractor/contractor_items.dm +++ /dev/null @@ -1,218 +0,0 @@ -/datum/contractor_item - /// Name of the item datum - var/name - /// Description of the item datum - var/desc - /// Item path to spawn, no item path means you need to override `handle_purchase()` - var/item - /// fontawesome icon to use inside the hub - https://fontawesome.com/icons/ - var/item_icon = "broadcast-tower" - /// Any number above 0 for how many times it can be bought in a round for a single traitor. -1 is unlimited. - var/limited = -1 - /// Cost of the item in contract rep. - var/cost - -/// Subtract cost, and spawn if it's an item. -/datum/contractor_item/proc/handle_purchase(datum/contractor_hub/hub, mob/living/user) - if(hub.contract_rep >= cost) - hub.contract_rep -= cost - else - return FALSE - - if(limited >= 1) - limited -= 1 - else - return FALSE - - hub.purchased_items.Add(src) - - user.playsound_local(user, 'sound/machines/uplinkpurchase.ogg', 100) - - if(item) - var/atom/item_to_create = new item(get_turf(user)) - if(user.put_in_hands(item_to_create)) - to_chat(user, span_notice("Your purchase materializes into your hands!")) - else - to_chat(user, span_notice("Your purchase materializes onto the floor.")) - return item_to_create - return TRUE -/datum/contractor_item/contract_reroll - name = "Contract Reroll" - desc = "Request a reroll of your current contract list. Will generate a new target, payment, and dropoff for the contracts you currently have available." - item_icon = "dice" - limited = 3 - cost = 0 - -/datum/contractor_item/contract_reroll/handle_purchase(datum/contractor_hub/hub) - . = ..() - - if(!.) - return - // We're not regenerating already completed/aborted/extracting contracts, but we don't want to repeat their targets. - var/list/new_target_list = list() - for(var/datum/syndicate_contract/contract_check as anything in hub.assigned_contracts) - if (contract_check.status != CONTRACT_STATUS_ACTIVE && contract_check.status != CONTRACT_STATUS_INACTIVE) - if (contract_check.contract.target) - new_target_list.Add(contract_check.contract.target) - continue - - // Reroll contracts without duplicates - for(var/datum/syndicate_contract/rerolling_contract in hub.assigned_contracts) - if (rerolling_contract.status != CONTRACT_STATUS_ACTIVE && rerolling_contract.status != CONTRACT_STATUS_INACTIVE) - continue - - rerolling_contract.generate(new_target_list) - new_target_list.Add(rerolling_contract.contract.target) - - // Set our target list with the new set we've generated. - hub.assigned_targets = new_target_list - -/datum/contractor_item/contractor_pinpointer - name = "Contractor Pinpointer" - desc = "A pinpointer that finds targets even without active suit sensors. Due to taking advantage of an exploit within the system, it can't pinpoint to the same accuracy as the traditional models. Becomes permanently locked to the user that first activates it." - item = /obj/item/pinpointer/crew/contractor - item_icon = "search-location" - limited = 2 - cost = 1 - -/datum/contractor_item/fulton_extraction_kit - name = "Fulton Extraction Kit" - desc = "For getting your target across the station to those difficult dropoffs. Place the beacon somewhere secure, and link the pack. Activating the pack on your target will send them over to the beacon - make sure they're not just going to run away though!" - item = /obj/item/storage/box/contractor/fulton_extraction - item_icon = "parachute-box" - limited = 1 - cost = 1 - -/datum/contractor_item/contractor_partner - name = "Reinforcements" - desc = "Upon purchase we'll contact available units in the area. Should there be an agent free, we'll send them down to assist you immediately. If no units are free, we give a full refund." - item_icon = "user-friends" - limited = 1 - cost = 2 - var/datum/mind/partner_mind = null - -/datum/contractor_item/contractor_partner/handle_purchase(datum/contractor_hub/hub, mob/living/user) - . = ..() - - if(!.) - return - to_chat(user, span_notice("The uplink vibrates quietly, connecting to nearby agents...")) - - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the Contractor Support Unit for [user.real_name]?", ROLE_PAI, FALSE, 100, POLL_IGNORE_CONTRACTOR_SUPPORT) - - if(LAZYLEN(candidates)) - var/mob/dead/observer/picked_obs = pick(candidates) - spawn_contractor_partner(user, picked_obs.key) - else - to_chat(user, span_notice("No available agents at this time, please try again later.")) - - // refund and add the limit back. - limited += 1 - hub.contract_rep += cost - hub.purchased_items -= src - -/datum/contractor_item/contractor_partner/proc/spawn_contractor_partner(mob/living/user, key) - var/mob/living/carbon/human/partner = new() - var/datum/outfit/contractor_partner/partner_outfit = new() - - partner_outfit.equip(partner) - - var/obj/structure/closet/supplypod/arrival_pod = new(null, STYLE_SYNDICATE) - arrival_pod.explosionSize = list(0,0,0,1) - arrival_pod.bluespace = TRUE - - var/turf/free_location = find_obstruction_free_location(2, user) - - // We really want to send them - if we can't find a nice location just land it on top of them. - if (!free_location) - free_location = get_turf(user) - - partner.forceMove(arrival_pod) - partner.ckey = key - - /// We give a reference to the mind that'll be the support unit - partner_mind = partner.mind - partner_mind.make_contractor_support() - - to_chat(partner_mind.current, "\n[span_alertwarning("[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, "[span_alertwarning("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/pod_landingzone(free_location, arrival_pod) - -/datum/contractor_item/blackout - name = "Blackout" - desc = "Request Syndicate Command to distrupt the station's powernet. Disables power across the station for a short duration." - item_icon = "bolt" - limited = 2 - cost = 2 - -/datum/contractor_item/blackout/handle_purchase(datum/contractor_hub/hub) - . = ..() - - if(!.) - return - 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.", sound_type = ANNOUNCER_POWEROFF) - -/datum/contractor_item/comms_blackout - name = "Comms Outage" - desc = "Request Syndicate Command to disable station Telecommunications. Disables telecommunications across the station for a medium duration." - item_icon = "phone-slash" - limited = 2 - cost = 2 - -/datum/contractor_item/comms_blackout/handle_purchase(datum/contractor_hub/hub) - . = ..() - - if(!.) - return - var/datum/round_event_control/event = locate(/datum/round_event_control/communications_blackout) in SSevents.control - event.runEvent() - -/datum/contractor_item/mod_baton_holster - name = "Baton Holster Module" - desc = "Never worry about dropping your baton again with this holster module! Simply insert your baton into the module, put it in your MODsuit, and the baton will retract whenever dropped." - item = /obj/item/mod/module/baton_holster - item_icon = "wrench" //I cannot find anything better, replace if you find something more fitting - limited = 1 - cost = 1 - -/datum/contractor_item/baton_upgrade_cuff - name = "Baton Cuff Upgrade" - desc = "Using technology reverse-engineered from some alien batons we had lying around, you can now cuff people using your baton with the secondary attack. Due to technical limitations, only cable cuffs and zipties work, and they need to be loaded into the baton manually." - item = /obj/item/baton_upgrade/cuff - item_icon = "bacon" //ditto - limited = 1 - cost = 1 - -/datum/contractor_item/baton_upgrade_mute - name = "Baton Mute Upgrade" - desc = "A relatively new advancement in completely proprietary baton technology, this baton upgrade will mute anyone hit for ten seconds, maximizing at twenty seconds." - item = /obj/item/baton_upgrade/mute - item_icon = "comment-slash" - limited = 1 - cost = 2 - -/datum/contractor_item/baton_upgrade_focus - name = "Baton Focus Upgrade" - desc = "When applied to a baton, it will exhaust the target even more, should they be the target of your current contract." - item = /obj/item/baton_upgrade/focus - item_icon = "eye" - limited = 1 - cost = 2 - -/datum/contractor_item/mod_magnetic_suit - name = "Magnetic Deployment Module" - desc = "A module that utilizes magnets to largely reduce the time needed to deploy and retract your MODsuit." - item = /obj/item/mod/module/springlock/contractor - item_icon = "magnet" - limited = 1 - cost = 2 - -/datum/contractor_item/mod_scorpion_hook - name = "SCORPION Hook Module" - desc = "A module that allows you to launch a hardlight hook from your MODsuit, pulling a target into range of your baton." - item = /obj/item/mod/module/scorpion_hook - item_icon = "arrow-left" //replace if fontawesome gets an actual hook icon - limited = 1 - cost = 3 diff --git a/code/modules/antagonists/contractor/contractor_support.dm b/code/modules/antagonists/contractor/contractor_support.dm deleted file mode 100644 index dde2c8f4a0da..000000000000 --- a/code/modules/antagonists/contractor/contractor_support.dm +++ /dev/null @@ -1,53 +0,0 @@ -/datum/antagonist/traitor/contractor_support - name = "Contractor Support Unit" - antag_moodlet = /datum/mood_event/focused - - show_in_roundend = FALSE // We're already adding them in to the contractor's roundend. - give_objectives = TRUE // We give them their own custom objective. - show_in_antagpanel = FALSE // Not a proper/full antag. - give_uplink = FALSE // Don't give them an uplink. - /// Team datum that contains the contractor and the support unit - var/datum/team/contractor_team/contractor_team - -/// Team for storing both the contractor and their support unit - only really for the HUD and admin logging. -/datum/team/contractor_team - show_roundend_report = FALSE - -/datum/antagonist/traitor/contractor_support/forge_traitor_objectives() - var/datum/objective/generic_objective = new - - generic_objective.name = "Follow the Contractor's Orders" - generic_objective.explanation_text = "Follow your orders. Assist agents in this mission area." - - generic_objective.completed = TRUE - - objectives += generic_objective - -/datum/outfit/contractor_partner - name = "Contractor Support Unit" - - uniform = /obj/item/clothing/under/chameleon - suit = /obj/item/clothing/suit/chameleon - back = /obj/item/storage/backpack - belt = /obj/item/modular_computer/tablet/pda/chameleon - mask = /obj/item/clothing/mask/cigarette/syndicate - shoes = /obj/item/clothing/shoes/chameleon/noslip - ears = /obj/item/radio/headset/chameleon - id = /obj/item/card/id/advanced/chameleon - r_hand = /obj/item/storage/toolbox/syndicate - id_trim = /datum/id_trim/chameleon/operative - - backpack_contents = list( - /obj/item/storage/box/survival, - /obj/item/implanter/uplink, - /obj/item/clothing/mask/chameleon, - /obj/item/storage/fancy/cigarettes/cigpack_syndicate, - /obj/item/lighter - ) - -/datum/outfit/contractor_partner/post_equip(mob/living/carbon/human/partner, visualsOnly) - . = ..() - var/obj/item/clothing/mask/cigarette/syndicate/cig = partner.get_item_by_slot(ITEM_SLOT_MASK) - - // pre-light their cig - cig.light() diff --git a/code/modules/antagonists/contractor/contractor_uplink.dm b/code/modules/antagonists/contractor/contractor_uplink.dm deleted file mode 100644 index 3c4e93f384ca..000000000000 --- a/code/modules/antagonists/contractor/contractor_uplink.dm +++ /dev/null @@ -1,223 +0,0 @@ -/datum/computer_file/program/contract_uplink - filename = "contractor uplink" - filedesc = "Syndicate Contractor Uplink" - category = PROGRAM_CATEGORY_MISC - program_icon_state = "assign" - extended_desc = "A standard, Syndicate issued system for handling important contracts while on the field." - size = 10 - requires_ntnet = FALSE - available_on_ntnet = FALSE - unsendable = TRUE - undeletable = TRUE - tgui_id = "SyndContractor" - program_icon = "tasks" - /// Error message if there is one - var/error = "" - /// If the info screen is displayed or not - var/info_screen = TRUE - /// If the contract uplink's been assigned to a person yet - var/assigned = FALSE - /// If this is the first opening of the tablet - var/first_load = TRUE - -/datum/computer_file/program/contract_uplink/run_program(mob/living/user) - . = ..(user) - -/datum/computer_file/program/contract_uplink/ui_act(action, params) - . = ..() - if(.) - return - - var/mob/living/user = usr - var/datum/mind/user_mind = user.mind - var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = computer.all_components[MC_HDD] - - switch(action) - if("PRG_contract-accept") - var/contract_id = text2num(params["contract_id"]) - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - if(!the_hub) - return - // Set as the active contract - the_hub.assigned_contracts[contract_id].status = CONTRACT_STATUS_ACTIVE - the_hub.current_contract = the_hub.assigned_contracts[contract_id] - - program_icon_state = "single_contract" - return TRUE - if("PRG_login") - - // Only play greet sound, and handle contractor hub when assigning for the first time. - if(!GLOB.contractors[user.mind]) - user.playsound_local(user, 'sound/effects/contractstartup.ogg', 100, FALSE) - var/datum/contractor_hub/the_hub = new - the_hub.create_hub_items() - GLOB.contractors[user.mind] = the_hub - - // Stops any topic exploits such as logging in multiple times on a single system. - if(!assigned) - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - the_hub.create_contracts(user_mind) - - hard_drive.user_mind = user_mind - - program_icon_state = "contracts" - assigned = TRUE - return TRUE - if("PRG_call_extraction") - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - if(!the_hub) - return - if(the_hub.current_contract.status != CONTRACT_STATUS_EXTRACTING) - if(the_hub.current_contract.handle_extraction(user)) - user.playsound_local(user, 'sound/effects/confirmdropoff.ogg', 100, TRUE) - the_hub.current_contract.status = CONTRACT_STATUS_EXTRACTING - - program_icon_state = "extracted" - else - user.playsound_local(user, 'sound/machines/uplinkerror.ogg', 50) - error = "Either both you or your target aren't at the dropoff location, or the pod hasn't got a valid place to land. Clear space, or make sure you're both inside." - else - user.playsound_local(user, 'sound/machines/uplinkerror.ogg', 50) - error = "Already extracting... Place the target into the pod. If the pod was destroyed, this contract is no longer possible." - - return TRUE - if("PRG_contract_abort") - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - if(!the_hub) - return - var/contract_id = the_hub.current_contract.id - - the_hub.current_contract = null - the_hub.assigned_contracts[contract_id].status = CONTRACT_STATUS_ABORTED - - program_icon_state = "contracts" - - return TRUE - if("PRG_redeem_TC") - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - if(!the_hub) - return - if (the_hub.contract_TC_to_redeem) - var/obj/item/stack/telecrystal/crystals = new /obj/item/stack/telecrystal(get_turf(user), - the_hub.contract_TC_to_redeem) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.put_in_hands(crystals)) - to_chat(H, span_notice("Your payment materializes into your hands!")) - else - to_chat(user, span_notice("Your payment materializes onto the floor.")) - - the_hub.contract_paid_out += the_hub.contract_TC_to_redeem - the_hub.contract_TC_to_redeem = 0 - return TRUE - else - user.playsound_local(user, 'sound/machines/uplinkerror.ogg', 50) - return TRUE - if ("PRG_clear_error") - error = "" - return TRUE - if("PRG_set_first_load_finished") - first_load = FALSE - return TRUE - if("PRG_toggle_info") - info_screen = !info_screen - return TRUE - if ("buy_hub") - var/datum/contractor_hub/the_hub = GLOB.contractors[user_mind] - if(!the_hub) - return - if(hard_drive.user_mind.current == user) - var/item = params["item"] - - for(var/datum/contractor_item/hub_item in the_hub.hub_items) - if(hub_item.name == item) - hub_item.handle_purchase(the_hub, user) - else - error = "Invalid user... You weren't recognised as the user of this system." - -/datum/computer_file/program/contract_uplink/ui_data(mob/user) - var/list/data = list() - var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = computer.all_components[MC_HDD] - var/screen_to_be = null - - data["first_load"] = first_load - - if (!isnull(hard_drive.user_mind)) - var/datum/contractor_hub/the_hub = GLOB.contractors[user?.mind] - data += get_header_data() - - if (the_hub.current_contract) - data["ongoing_contract"] = TRUE - screen_to_be = "single_contract" - if (the_hub.current_contract.status == CONTRACT_STATUS_EXTRACTING) - data["extraction_enroute"] = TRUE - screen_to_be = "extracted" - else - data["extraction_enroute"] = FALSE - else - data["ongoing_contract"] = FALSE - data["extraction_enroute"] = FALSE - - data["logged_in"] = TRUE - data["station_name"] = GLOB.station_name - data["redeemable_tc"] = the_hub.contract_TC_to_redeem - data["earned_tc"] = the_hub.contract_paid_out - data["contracts_completed"] = the_hub.contracts_completed - data["contract_rep"] = the_hub.contract_rep - - data["info_screen"] = info_screen - - data["error"] = error - - for (var/datum/contractor_item/hub_item in the_hub.hub_items) - data["contractor_hub_items"] += list(list( - "name" = hub_item.name, - "desc" = hub_item.desc, - "cost" = hub_item.cost, - "limited" = hub_item.limited, - "item_icon" = hub_item.item_icon - )) - - for (var/datum/syndicate_contract/contract in the_hub.assigned_contracts) - if(!contract.contract) - stack_trace("Syndiate contract with null contract objective found in [hard_drive.user_mind]'s contractor hub!") - contract.status = CONTRACT_STATUS_ABORTED - continue - - data["contracts"] += list(list( - "target" = contract.contract.target, - "target_rank" = contract.target_rank, - "payout" = contract.contract.payout, - "payout_bonus" = contract.contract.payout_bonus, - "dropoff" = contract.contract.dropoff, - "id" = contract.id, - "status" = contract.status, - "message" = contract.wanted_message - )) - - var/direction - if (the_hub.current_contract) - var/turf/curr = get_turf(user) - var/turf/dropoff_turf - data["current_location"] = "[get_area_name(curr, TRUE)]" - - for (var/turf/content in the_hub.current_contract.contract.dropoff.contents) - if (isturf(content)) - dropoff_turf = content - break - - if(curr.z == dropoff_turf.z) //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) == the_hub.current_contract.contract.dropoff) - direction = "LOCATION CONFIRMED" - else - direction = "???" - - data["dropoff_direction"] = direction - - else - data["logged_in"] = FALSE - - program_icon_state = screen_to_be - update_computer_icon() - return data diff --git a/code/modules/antagonists/contractor/datum_contractor.dm b/code/modules/antagonists/contractor/datum_contractor.dm deleted file mode 100644 index f31c91878324..000000000000 --- a/code/modules/antagonists/contractor/datum_contractor.dm +++ /dev/null @@ -1,58 +0,0 @@ -// USED FOR THE MIDROUND ANTAGONIST -/datum/antagonist/contractor - name = "Drifting Contractor" - antagpanel_category = "Drifting Contractor" - preview_outfit = /datum/outfit/contractor_preview - job_rank = ROLE_DRIFTING_CONTRACTOR - antag_hud_name = "contractor" - antag_moodlet = /datum/mood_event/focused - show_to_ghosts = TRUE - suicide_cry = "FOR THE CONTRACTS!!" - /// The outfit the contractor is equipped with - var/contractor_outfit = /datum/outfit/contractor - -/datum/antagonist/contractor/proc/equip_guy() - if(!ishuman(owner.current)) - return - var/mob/living/carbon/human/person = owner.current - person.equipOutfit(contractor_outfit) - return TRUE - -/datum/antagonist/contractor/on_gain() - forge_objectives() - . = ..() - equip_guy() - -/datum/antagonist/contractor/proc/forge_objectives() - var/datum/objective/contractor_total/contract_objective = new - contract_objective.owner = owner - objectives += contract_objective - -/datum/antagonist/contractor/roundend_report() - var/list/report = list() - - if(!owner) - CRASH("antagonist datum without owner") - - report += "[printplayer(owner)]" - - var/objectives_complete = TRUE - if(length(objectives)) - report += printobjectives(objectives) - for(var/datum/objective/objective as anything in objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - var/datum/contractor_hub/the_hub = GLOB.contractors[owner] - report += the_hub?.contractor_round_end() - - if(!length(objectives) || objectives_complete) - report += "The [name] was successful!" - else - report += "The [name] has failed!" - - return report.Join("
    ") - -/datum/job/drifting_contractor - title = ROLE_DRIFTING_CONTRACTOR diff --git a/code/modules/antagonists/contractor/outfit.dm b/code/modules/antagonists/contractor/outfit.dm deleted file mode 100644 index 8227ea5f6475..000000000000 --- a/code/modules/antagonists/contractor/outfit.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/outfit/contractor - name = "Syndicate Contractor - Full Kit" - - glasses = /obj/item/clothing/glasses/night - mask = /obj/item/clothing/mask/gas/syndicate - back = /obj/item/mod/control/pre_equipped/contractor/upgraded - r_pocket = /obj/item/tank/internals/emergency_oxygen/engi - internals_slot = ITEM_SLOT_RPOCKET - belt = /obj/item/storage/belt/military - - uniform = /obj/item/clothing/under/syndicate/coldres - shoes = /obj/item/clothing/shoes/combat/swat - gloves = /obj/item/clothing/gloves/combat - ears = /obj/item/radio/headset/syndicate/alt - l_pocket = /obj/item/modular_computer/tablet/syndicate_contract_uplink - id = /obj/item/card/id/advanced/chameleon - backpack_contents = list( - /obj/item/storage/box/survival/syndie, - /obj/item/storage/box/syndicate/contract_kit/midround, - /obj/item/knife/combat/survival, - /obj/item/pinpointer/crew/contractor - ) - - implants = list( - /obj/item/implant/uplink/precharged, - /obj/item/implant/explosive, - ) - - id_trim = /datum/id_trim/chameleon/contractor - -/datum/outfit/contractor_preview - name = "Syndicate Contractor (Preview only)" - - back = /obj/item/mod/control/pre_equipped/syndicate_empty/contractor - uniform = /obj/item/clothing/under/syndicate - glasses = /obj/item/clothing/glasses/night - -/datum/outfit/contractor/fully_upgraded - name = "Syndicate Contractor - Fully Upgraded" - back = /obj/item/mod/control/pre_equipped/contractor/upgraded/adminbus - -/datum/id_trim/chameleon/contractor - assignment = "Syndicate Contractor" - trim_state = "trim_contractor" diff --git a/code/modules/antagonists/creep/creep.dm b/code/modules/antagonists/creep/creep.dm index 3d365211c437..5cee2dd61583 100644 --- a/code/modules/antagonists/creep/creep.dm +++ b/code/modules/antagonists/creep/creep.dm @@ -25,11 +25,11 @@ 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, use_reverb = FALSE) var/policy = get_policy(ROLE_OBSESSED) if(policy) to_chat(owner, policy) - owner.announce_objectives() /datum/antagonist/obsessed/Destroy() if(trauma) @@ -43,7 +43,9 @@ victim_dummy.update_body_parts() var/icon/obsessed_icon = render_preview_outfit(preview_outfit, victim_dummy) - obsessed_icon.Blend(icon('icons/effects/blood.dmi', "uniformblood"), ICON_OVERLAY) + var/icon/blood_overlay = icon('icons/effects/blood.dmi', "uniformblood") + blood_overlay.Blend(COLOR_HUMAN_BLOOD, ICON_MULTIPLY) + obsessed_icon.Blend(blood_overlay, ICON_OVERLAY) var/icon/final_icon = finish_preview_icon(obsessed_icon) @@ -65,26 +67,11 @@ l_hand = /obj/item/camera suit = /obj/item/clothing/suit/apron/surgical -/datum/outfit/obsessed/post_equip(mob/living/carbon/human/H) - for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) - carried_item.add_mob_blood(H)//Oh yes, there will be blood... - H.regenerate_icons() - /datum/antagonist/obsessed/proc/forge_objectives(datum/mind/obsessionmind) var/list/objectives_left = list("spendtime", "polaroid", "hug") var/datum/objective/assassinate/obsessed/kill = new kill.owner = owner kill.target = obsessionmind - var/obj/family_heirloom - - for(var/datum/quirk/quirky in obsessionmind.current.quirks) - if(istype(quirky, /datum/quirk/item_quirk/family_heirloom)) - var/datum/quirk/item_quirk/family_heirloom/heirloom_quirk = quirky - family_heirloom = heirloom_quirk.heirloom?.resolve() - break - if(family_heirloom) - objectives_left += "heirloom" - // If they have no coworkers, jealousy will pick someone else on the station. This will never be a free objective. if(!is_captain_job(obsessionmind.assigned_role)) objectives_left += "jealous" @@ -108,12 +95,6 @@ hug.owner = owner hug.target = obsessionmind objectives += hug - if("heirloom") - var/datum/objective/steal/heirloom_thief/heirloom_thief = new - heirloom_thief.owner = owner - heirloom_thief.target = obsessionmind//while you usually wouldn't need this for stealing, we need the name of the obsession - heirloom_thief.steal_target = family_heirloom - objectives += heirloom_thief if("jealous") var/datum/objective/assassinate/jealous/jealous = new jealous.owner = owner diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 52a814f7140d..942c7bf3e795 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -496,16 +496,11 @@ playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message(span_danger("[user] begins restraining [C] with dark magic!"), \ span_userdanger("[user] begins shaping dark magic shackles around your wrists!")) - if(do_after(user, C, 30)) - if(!C.handcuffed) - C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) - C.update_handcuffed() - C.silent += 5 - to_chat(user, span_notice("You shackle [C].")) - log_combat(user, C, "shackled") - uses-- - else - to_chat(user, span_warning("[C] is already bound.")) + if(do_after(user, C, 30) && C.equip_to_slot_if_possible(new /obj/item/restraints/handcuffs/energy/cult/used(C), ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE)) + C.silent += 5 + to_chat(user, span_notice("You shackle [C].")) + log_combat(user, C, "shackled") + uses-- else to_chat(user, span_warning("You fail to shackle [C].")) else @@ -685,9 +680,10 @@ uses = 0 return ..() else - H.blood_volume = BLOOD_VOLUME_SAFE + H.setBloodVolume(BLOOD_VOLUME_SAFE) uses -= round(restore_blood/2) to_chat(user,span_warning("Your blood rites have restored [H == user ? "your" : "[H.p_their()]"] blood to safe levels!")) + var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss() if(overall_damage == 0) to_chat(user,span_cult("That cultist doesn't require healing!")) @@ -754,15 +750,17 @@ var/turf/T = get_turf(target) if(T) for(var/obj/effect/decal/cleanable/blood/B in view(T, 2)) - if(B.blood_state == BLOOD_STATE_HUMAN) + var/list/blood_DNA = B.return_blood_DNA() + if(blood_DNA && ispath(blood_DNA[blood_DNA[1]], /datum/blood/human)) if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam temp += 30 else 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/blood/trail_holder/TH in view(T, 2)) qdel(TH) + if(temp) user.Beam(T,icon_state="drainbeam", time = 15) new /obj/effect/temp_visual/cult/sparks(get_turf(user)) diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 99a938a21582..0ff02a566b0d 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -7,7 +7,6 @@ name = "Cultist" roundend_category = "cultists" antagpanel_category = "Cult" - antag_moodlet = /datum/mood_event/cult suicide_cry = "FOR NAR'SIE!!" preview_outfit = /datum/outfit/cultist job_rank = ROLE_CULTIST @@ -56,7 +55,6 @@ /datum/antagonist/cult/greet() . = ..() 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() /datum/antagonist/cult/on_gain() . = ..() @@ -265,9 +263,6 @@ ///Has the cult asceneded, and gotten halos? var/cult_ascendent = FALSE - ///Has narsie been summoned yet? - var/narsie_summoned = FALSE - /datum/team/cult/proc/check_size() if(cult_ascendent) return @@ -409,7 +404,7 @@ ..() var/sanity = 0 while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100) - var/area/summon_area = pick(GLOB.sortedAreas - summon_spots) + var/area/summon_area = pick(GLOB.areas - summon_spots) if(summon_area && is_station_level(summon_area.z) && (summon_area.area_flags & VALID_TERRITORY)) summon_spots += summon_area sanity++ diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a57dddb31654..88d2819b21e0 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -3,7 +3,6 @@ desc = "An old, dusty tome with frayed edges and a sinister-looking cover." icon = 'icons/obj/cult/items_and_weapons.dmi' icon_state ="tome" - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL @@ -22,7 +21,7 @@ force = 15 throwforce = 25 block_chance = 25 - armour_penetration = 35 + armor_penetration = 35 /obj/item/melee/cultblade/dagger/Initialize(mapload) . = ..() @@ -38,18 +37,17 @@ Striking a noncultist, however, will tear their flesh."} AddComponent(/datum/component/cult_ritual_item, span_cult(examine_text)) -/obj/item/melee/cultblade/dagger/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/block_message = "[owner] parries [attack_text] with [src]" - if(owner.get_active_held_item() != src) - block_message = "[owner] parries [attack_text] with [src] in their offhand" +/obj/item/melee/cultblade/dagger/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + if(IS_CULTIST(wielder) && attack_type != PROJECTILE_ATTACK) + return ..() - if(IS_CULTIST(owner) && prob(final_block_chance) && attack_type != PROJECTILE_ATTACK) - new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) - playsound(src, 'sound/weapons/parry.ogg', 100, TRUE) - owner.visible_message(span_danger("[block_message]")) - return TRUE - else - return FALSE + return FALSE + +/obj/item/melee/cultblade/dagger/block_feedback(mob/living/carbon/human/wielder, attack_text, attack_type, do_message = TRUE, do_sound = TRUE) + if(do_message) + wielder.visible_message(span_danger("[wielder] parries [attack_text] with [src]!")) + return ..(do_message = FALSE) + return ..() /obj/item/melee/cultblade name = "eldritch longsword" @@ -67,7 +65,11 @@ Striking a noncultist, however, will tear their flesh."} w_class = WEIGHT_CLASS_BULKY force = 30 // whoever balanced this got beat in the head by a bible too many times good lord throwforce = 10 + block_chance = 50 // now it's officially a cult esword + block_sound = 'sound/weapons/block/parry_metal.ogg' + block_effect =/obj/effect/temp_visual/cult/sparks + hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") @@ -76,14 +78,18 @@ Striking a noncultist, however, will tear their flesh."} . = ..() AddComponent(/datum/component/butchering, 40, 100) -/obj/item/melee/cultblade/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(IS_CULTIST(owner) && prob(final_block_chance)) - new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) - playsound(src, 'sound/weapons/parry.ogg', 100, TRUE) - owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) - return TRUE - else - return FALSE +/obj/item/melee/cultblade/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + if(IS_CULTIST(wielder)) + return ..() + + return FALSE + +/obj/item/melee/cultblade/block_feedback(mob/living/carbon/human/wielder, attack_text, attack_type, do_message = TRUE, do_sound = TRUE) + if(do_message) + wielder.visible_message(span_danger("[wielder] parries [attack_text] with [src]!")) + return ..(do_message = FALSE) + + return ..() /obj/item/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user) if(!IS_CULTIST(user)) @@ -122,11 +128,11 @@ Striking a noncultist, however, will tear their flesh."} block_chance = 50 throwforce = 20 force = 35 - armour_penetration = 45 + armor_penetration = 45 throw_speed = 1 throw_range = 3 sharpness = SHARP_EDGED - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 4 light_color = COLOR_RED attack_verb_continuous = list("cleaves", "slashes", "tears", "lacerates", "hacks", "rips", "dices", "carves") @@ -151,8 +157,8 @@ Striking a noncultist, however, will tear their flesh."} . = ..() jaunt = new(src) linked_action = new(src) + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) AddComponent(/datum/component/butchering, 50, 80) - AddComponent(/datum/component/two_handed, require_twohands=TRUE) /obj/item/cult_bastard/Destroy() QDEL_NULL(jaunt) @@ -166,7 +172,7 @@ Striking a noncultist, however, will tear their flesh."} else . += "The sword appears to be quite lifeless." -/obj/item/cult_bastard/can_be_pulled(user) +/obj/item/cult_bastard/can_be_grabbed(mob/living/grabber, target_zone, force) return FALSE /obj/item/cult_bastard/attack_self(mob/user) @@ -195,22 +201,16 @@ Striking a noncultist, however, will tear their flesh."} /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 - ..() + return ..() -/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(span_danger("[owner] deflects [attack_text] with [src]!")) - playsound(src, pick('sound/weapons/effects/ric1.ogg', 'sound/weapons/effects/ric2.ogg', 'sound/weapons/effects/ric3.ogg', 'sound/weapons/effects/ric4.ogg', 'sound/weapons/effects/ric5.ogg'), 100, TRUE) - return TRUE - else - playsound(src, 'sound/weapons/parry.ogg', 75, TRUE) - owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) - return TRUE - return FALSE +/obj/item/cult_bastard/play_block_sound(mob/living/carbon/human/wielder, attack_type) + if(attack_type == PROJECTILE_ATTACK) + 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 + + return ..() /obj/item/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters) . = ..() @@ -327,7 +327,7 @@ Striking a noncultist, however, will tear their flesh."} desc = "A torn, dust-caked hood. Strange letters line the inside." flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS flags_cover = HEADCOVERSEYES - armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 40, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 40, ENERGY = 40, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT heat_protection = HEAD @@ -340,7 +340,7 @@ Striking a noncultist, however, will tear their flesh."} inhand_icon_state = "cultrobes" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list(MELEE = 40, BULLET = 30, LASER = 40,ENERGY = 40, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 40, ENERGY = 40, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) flags_inv = HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -377,7 +377,7 @@ Striking a noncultist, however, will tear their flesh."} inhand_icon_state = "magus" desc = "A helm worn by the followers of Nar'Sie." flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT - armor = list(MELEE = 50, BULLET = 30, LASER = 50,ENERGY = 50, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) + armor = list(BLUNT = 50, PUNCTURE = 30, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/suit/magusred @@ -387,7 +387,7 @@ Striking a noncultist, however, will tear their flesh."} inhand_icon_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 = 50, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) + armor = list(BLUNT = 50, PUNCTURE = 30, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 10, FIRE = 10, ACID = 10) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/clothing/suit/hooded/cultrobes/hardened @@ -397,7 +397,7 @@ Striking a noncultist, however, will tear their flesh."} inhand_icon_state = "cult_armor" w_class = WEIGHT_CLASS_BULKY allowed = list(/obj/item/tome, /obj/item/melee/cultblade, /obj/item/tank/internals) - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100) + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/hardened clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT @@ -410,8 +410,8 @@ Striking a noncultist, however, will tear their flesh."} desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum." icon_state = "cult_helmet" inhand_icon_state = "cult_helmet" - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100) - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 30, FIRE = 100, ACID = 100) + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT @@ -438,7 +438,7 @@ Striking a noncultist, however, will tear their flesh."} icon_state = "cult_armor" inhand_icon_state = "cult_armor" w_class = WEIGHT_CLASS_BULKY - armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 50, BOMB = 50, BIO = 30, FIRE = 50, ACID = 60) + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 30, FIRE = 50, ACID = 60) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/cult_shield /obj/item/clothing/suit/hooded/cultrobes/cult_shield/setup_shielding() @@ -455,7 +455,7 @@ Striking a noncultist, however, will tear their flesh."} name = "empowered cultist helmet" desc = "Empowered helmet which creates a powerful shield around the user." icon_state = "cult_hoodalt" - armor = list(MELEE = 50, BULLET = 40, LASER = 50,ENERGY = 50, BOMB = 50, BIO = 30, FIRE = 50, ACID = 60) + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 30, FIRE = 50, ACID = 60) /obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot) ..() @@ -470,14 +470,14 @@ Striking a noncultist, however, will tear their flesh."} name = "flagellant's robes" desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage." allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list(MELEE = -45, BULLET = -45, LASER = -45,ENERGY = -55, BOMB = -45, BIO = -45, FIRE = 0, ACID = 0) + armor = list(BLUNT = -45, PUNCTURE = -45, SLASH = 0, LASER = -45, ENERGY = -55, BOMB = -45, BIO = -45, FIRE = 0, ACID = 0) slowdown = -0.6 hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood name = "flagellant's hood" desc = "Blood-soaked hood infused with dark magic." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot) ..() @@ -583,9 +583,6 @@ Striking a noncultist, however, will tear their flesh."} if(totalcurses >= MAX_SHUTTLE_CURSES && (world.time < first_curse_time + SHUTTLE_CURSE_OMFG_TIMESPAN)) var/omfg_message = pick_list(CULT_SHUTTLE_CURSE, "omfg_announce") || "LEAVE US ALONE!" addtimer(CALLBACK(GLOBAL_PROC,PROC_REF(priority_announce),omfg_message,"Daedalus Industries Shuttle Dispatch","FUCK OFF",'sound/misc/notice1.ogg'), rand(2 SECONDS, 6 SECONDS)) - for(var/mob/iter_player as anything in GLOB.player_list) - if(IS_CULTIST(iter_player)) - iter_player.client?.give_award(/datum/award/achievement/misc/cult_shuttle_omfg, iter_player) qdel(src) @@ -607,8 +604,9 @@ Striking a noncultist, however, will tear their flesh."} /obj/item/cult_shift/proc/handle_teleport_grab(turf/T, mob/user) var/mob/living/carbon/C = user - if(C.pulling) - var/atom/movable/pulled = C.pulling + var/list/obj/item/hand_item/grab/grabs = C.active_grabs + if(length(grabs)) + var/atom/movable/pulled = grabs[1].affecting do_teleport(pulled, T, channel = TELEPORT_CHANNEL_CULT) . = pulled @@ -636,7 +634,7 @@ Striking a noncultist, however, will tear their flesh."} var/atom/movable/pulled = handle_teleport_grab(destination, C) if(do_teleport(C, destination, channel = TELEPORT_CHANNEL_CULT)) if(pulled) - C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull + C.try_make_grab(pulled) //forcemove resets pulls, so we need to re-pull new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir) playsound(destination, 'sound/effects/phasein.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) playsound(destination, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) @@ -706,28 +704,24 @@ Striking a noncultist, however, will tear their flesh."} base_icon_state = "occultpoleaxe" inhand_icon_state = "occultpoleaxe0" w_class = WEIGHT_CLASS_HUGE + force = 17 + force_wielded = 24 throwforce = 40 - throw_speed = 2 - armour_penetration = 30 + throw_speed = 1.5 + armor_penetration = 30 block_chance = 30 + slot_flags = null attack_verb_continuous = list("attacks", "slices", "shreds", "sunders", "lacerates", "cleaves") attack_verb_simple = list("attack", "slice", "shred", "sunder", "lacerate", "cleave") sharpness = SHARP_EDGED hitsound = 'sound/weapons/bladeslice.ogg' var/datum/action/innate/cult/halberd/halberd_act - var/wielded = FALSE // track wielded status on item /obj/item/melee/cultblade/halberd/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - -/obj/item/melee/cultblade/halberd/ComponentInitialize() . = ..() AddComponent(/datum/component/butchering, 100, 90) - AddComponent(/datum/component/two_handed, force_unwielded=17, force_wielded=24) /// triggered on wield of two handed item /obj/item/melee/cultblade/halberd/proc/on_wield(obj/item/source, mob/user) @@ -780,22 +774,24 @@ Striking a noncultist, however, will tear their flesh."} playsound(T, 'sound/effects/glassbr3.ogg', 100) qdel(src) -/obj/item/melee/cultblade/halberd/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) - final_block_chance *= 2 - if(IS_CULTIST(owner) && prob(final_block_chance)) - if(attack_type == PROJECTILE_ATTACK) - owner.visible_message(span_danger("[owner] deflects [attack_text] with [src]!")) - playsound(get_turf(owner), pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) - new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) - return TRUE - else - playsound(src, 'sound/weapons/parry.ogg', 100, TRUE) - owner.visible_message(span_danger("[owner] parries [attack_text] with [src]!")) - new /obj/effect/temp_visual/cult/sparks(get_turf(owner)) - return TRUE - else +/obj/item/melee/cultblade/halberd/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + if(!IS_CULTIST(wielder)) return FALSE + . = ..() + if(wielded) + . *= 2 + +/obj/item/melee/cultblade/halberd/block_feedback(mob/living/carbon/human/wielder, attack_text, attack_type, do_message = TRUE, do_sound = TRUE) + if(attack_type == PROJECTILE_ATTACK) + wielder.visible_message(span_danger("[wielder] deflects [attack_text] with [src]!")) + return ..(do_message = FALSE) + return ..() + +/obj/item/melee/cultblade/halberd/play_block_sound(mob/living/carbon/wielder, attack_type) + if(attack_type == PROJECTILE_ATTACK) + playsound(wielder, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, TRUE) + return + return ..() /datum/action/innate/cult/halberd name = "Bloody Bond" @@ -998,6 +994,21 @@ Striking a noncultist, however, will tear their flesh."} /obj/effect/ebeam/blood name = "blood beam" +/obj/effect/temp_visual/at_shield + name = "anti-toolbox field" + icon = 'icons/effects/effects.dmi' + icon_state = "at_shield2" + layer = FLY_LAYER + light_system = OVERLAY_LIGHT + light_outer_range = 2 + duration = 8 + var/target + +/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target) + . = ..() + target = new_target + INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, orbit), target, 0, FALSE, 0, 0, FALSE, TRUE) + /obj/item/shield/mirror name = "mirror shield" desc = "An infamous shield used by Nar'Sien sects to confuse and disorient their enemies. Its edges are weighted for use as a throwing weapon - capable of disabling multiple foes with preternatural accuracy." @@ -1012,9 +1023,14 @@ Striking a noncultist, however, will tear their flesh."} attack_verb_continuous = list("bumps", "prods") attack_verb_simple = list("bump", "prod") hitsound = 'sound/weapons/smash.ogg' + block_sound = 'sound/weapons/block/parry_metal.ogg' var/illusions = 2 -/obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) + . = ..() + if(!.) + return + if(IS_CULTIST(owner)) if(istype(hitby, /obj/projectile)) var/obj/projectile/P = hitby @@ -1027,32 +1043,30 @@ Striking a noncultist, however, will tear their flesh."} owner.Paralyze(25) qdel(src) return FALSE + if(P.reflectable & REFLECT_NORMAL) return FALSE //To avoid reflection chance double-dipping with block chance - . = ..() - if(.) - playsound(src, 'sound/weapons/parry.ogg', 100, TRUE) - if(illusions > 0) - illusions-- - addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 450) - if(prob(60)) - var/mob/living/simple_animal/hostile/illusion/M = new(owner.loc) - M.faction = list("cult") - M.Copy_Parent(owner, 70, 10, 5) - M.move_to_delay = owner.cached_multiplicative_slowdown - else - var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) - E.Copy_Parent(owner, 70, 10) - E.GiveTarget(owner) - E.Goto(owner, owner.cached_multiplicative_slowdown, E.minimum_distance) - return TRUE + + if(illusions > 0) + illusions-- + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 450) + if(prob(60)) + var/mob/living/simple_animal/hostile/illusion/M = new(owner.loc) + M.faction = list("cult") + M.Copy_Parent(owner, 70, 10, 5) + M.move_to_delay = owner.movement_delay + else + var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc) + E.Copy_Parent(owner, 70, 10) + E.GiveTarget(owner) + E.Goto(owner, owner.movement_delay, E.minimum_distance) else if(prob(50)) var/mob/living/simple_animal/hostile/illusion/H = new(owner.loc) H.Copy_Parent(owner, 100, 20, 5) H.faction = list("cult") H.GiveTarget(owner) - H.move_to_delay = owner.cached_multiplicative_slowdown + H.move_to_delay = owner.movement_delay to_chat(owner, span_danger("[src] betrays you!")) return FALSE diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index d305e5504b2d..957d27b6f14b 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -277,7 +277,8 @@ structure_check() searches for nearby cultist structures required for the invoca
    ") if(ishuman(convertee)) var/mob/living/carbon/human/H = convertee - H.uncuff() + H.remove_legcuffs() + H.remove_handcuffs() H.remove_status_effect(/datum/status_effect/speech/slurring/cult) H.remove_status_effect(/datum/status_effect/speech/stutter) @@ -455,8 +456,8 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(user, span_cult("You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")) else to_chat(user, span_cult("You[moveuserlater ? "r vision blurs briefly, but nothing happens":" try send everything above the rune away, but the teleportation fails"].")) - if(is_mining_level(z) && !is_mining_level(target.z)) //No effect if you stay on lavaland - actual_selected_rune.handle_portal("lava") + if(is_mining_level(z) && !is_mining_level(target.z)) + actual_selected_rune.handle_portal("space") else var/area/A = get_area(T) if(initial(A.name) == "Space") @@ -536,13 +537,6 @@ structure_check() searches for nearby cultist structures required for the invoca //BEGIN THE SUMMONING used = TRUE - var/datum/team/cult/cult_team = user_antag.cult_team - if (cult_team.narsie_summoned) - for (var/datum/mind/cultist_mind in cult_team.members) - var/mob/living/cultist_mob = cultist_mind.current - cultist_mob.client?.give_award(/datum/award/achievement/misc/narsupreme, cultist_mob) - - cult_team.narsie_summoned = TRUE ..() sound_to_playing_players('sound/effects/dimensional_rend.ogg') var/turf/rune_turf = get_turf(src) @@ -702,11 +696,19 @@ 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) - to_chat(user, "[cultist_to_summon] is being held in place!") - fail_invoke() - log_game("Summon Cultist rune failed - target restrained") - return + if(LAZYLEN(cultist_to_summon.grabbed_by) || cultist_to_summon.buckled) + var/grab_check = 0 + if(!cultist_to_summon.buckled) + for(var/obj/item/hand_item/grab/G in cultist_to_summon.grabbed_by) + if(G.current_grab.stop_move) + grab_check++ + + if(grab_check == 0) + to_chat(user, "[cultist_to_summon] is being held in place!") + fail_invoke() + log_game("Summon Cultist rune failed - target restrained") + return + if(!IS_CULTIST(cultist_to_summon)) to_chat(user, "[cultist_to_summon] is not a follower of the Geometer!") fail_invoke() @@ -838,7 +840,8 @@ structure_check() searches for nearby cultist structures required for the invoca return list() var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune) var/mob/living/carbon/human/cult_ghost/new_human = new(T) - new_human.real_name = ghost_to_spawn.real_name + + new_human.set_real_name(ghost_to_spawn.real_name) new_human.alpha = 150 //Makes them translucent new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor new_human.apply_status_effect(/datum/status_effect/cultghost) //ghosts can't summon more ghosts @@ -853,7 +856,7 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(new_human, span_cultitalic("You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.")) while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T)) - if(user.stat != CONSCIOUS || HAS_TRAIT(new_human, TRAIT_CRITICAL_CONDITION)) + if(user.stat != CONSCIOUS) break user.apply_damage(0.1, BRUTE) sleep(1) @@ -958,7 +961,7 @@ structure_check() searches for nearby cultist structures required for the invoca continue if(ishuman(M)) if(!IS_CULTIST(M)) - AH.remove_hud_from(M) + AH.hide_from(M) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(hudFix), M), duration) var/image/A = image('icons/mob/cult.dmi',M,"cultist", ABOVE_MOB_LAYER) A.override = 1 @@ -983,46 +986,35 @@ structure_check() searches for nearby cultist structures required for the invoca to_chat(M, span_cultlarge("An Apocalypse Rune was invoked in the [place.name], it is no longer available as a summoning site!")) SEND_SOUND(M, 'sound/effects/pope_entry.ogg') image_handler(images, duration) + if(intensity>=285) // Based on the prior formula, this means the cult makes up <15% of current players var/outcome = rand(1,100) switch(outcome) - if(1 to 10) + if(1 to 12) var/datum/round_event_control/disease_outbreak/D = new() - var/datum/round_event_control/mice_migration/M = new() + var/datum/round_event_control/animal_infestation/vermin/M = new() D.runEvent() M.runEvent() - if(11 to 20) + if(13 to 25) var/datum/round_event_control/radiation_storm/RS = new() RS.runEvent() - if(21 to 30) + if(26 to 37) var/datum/round_event_control/brand_intelligence/BI = new() BI.runEvent() - if(31 to 40) + if(38 to 50) var/datum/round_event_control/immovable_rod/R = new() R.runEvent() R.runEvent() R.runEvent() - if(41 to 50) + if(51 to 62) var/datum/round_event_control/meteor_wave/MW = new() MW.runEvent() - if(51 to 60) - var/datum/round_event_control/spider_infestation/SI = new() - SI.runEvent() - if(61 to 70) - var/datum/round_event_control/anomaly/anomaly_flux/AF - var/datum/round_event_control/anomaly/anomaly_grav/AG - var/datum/round_event_control/anomaly/anomaly_pyro/AP - var/datum/round_event_control/anomaly/anomaly_vortex/AV - AF.runEvent() - AG.runEvent() - AP.runEvent() - AV.runEvent() - if(71 to 80) + if(63 to 75) var/datum/round_event_control/spacevine/SV = new() var/datum/round_event_control/grey_tide/GT = new() SV.runEvent() GT.runEvent() - if(81 to 100) + if(75 to 100) var/datum/round_event_control/portal_storm_narsie/N = new() N.runEvent() qdel(src) @@ -1051,4 +1043,4 @@ structure_check() searches for nearby cultist structures required for the invoca 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) + AH.show_to(target) diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm index 2be20b88ce1d..d960bf1734a3 100644 --- a/code/modules/antagonists/disease/disease_datum.dm +++ b/code/modules/antagonists/disease/disease_datum.dm @@ -21,7 +21,6 @@ /datum/antagonist/disease/greet() . = ..() to_chat(owner.current, span_notice("Infect members of the crew to gain adaptation points, and spread your infection further.")) - owner.announce_objectives() /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 e669910ba7ed..98437cc66291 100644 --- a/code/modules/antagonists/disease/disease_disease.dm +++ b/code/modules/antagonists/disease/disease_disease.dm @@ -60,6 +60,6 @@ cures = list(pick(pick_n_take(not_used)), pick(pick_n_take(not_used))) // Get the cure name from the cure_id - var/datum/reagent/D1 = GLOB.chemical_reagents_list[cures[1]] - var/datum/reagent/D2 = GLOB.chemical_reagents_list[cures[2]] + var/datum/reagent/D1 = SSreagents.chemical_reagents_list[cures[1]] + var/datum/reagent/D2 = SSreagents.chemical_reagents_list[cures[2]] cure_text = "[D1.name] and [D2.name]" diff --git a/code/modules/antagonists/disease/disease_event.dm b/code/modules/antagonists/disease/disease_event.dm deleted file mode 100644 index 134140caba9b..000000000000 --- a/code/modules/antagonists/disease/disease_event.dm +++ /dev/null @@ -1,26 +0,0 @@ - -/datum/round_event_control/sentient_disease - name = "Spawn Sentient Disease" - typepath = /datum/round_event/ghost_role/sentient_disease - weight = 7 - max_occurrences = 1 - min_players = 5 - - -/datum/round_event/ghost_role/sentient_disease - role_name = "sentient disease" - -/datum/round_event/ghost_role/sentient_disease/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - - var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) - virus.key = selected.key - INVOKE_ASYNC(virus, TYPE_PROC_REF(/mob/camera/disease, pick_name)) - message_admins("[ADMIN_LOOKUPFLW(virus)] has been made into a sentient disease by an event.") - log_game("[key_name(virus)] was spawned as a sentient disease by an event.") - spawned_mobs += virus - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm index cde084706319..8459af1377d5 100644 --- a/code/modules/antagonists/disease/disease_mob.dm +++ b/code/modules/antagonists/disease/disease_mob.dm @@ -66,7 +66,7 @@ the new instance inside the host to be updated to the template's stats. SSdisease.archive_diseases[disease_template.GetDiseaseID()] = disease_template //important for stuff that uses disease IDs var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.add_hud_to(src) + my_hud.show_to(src) browser = new /datum/browser(src, "disease_menu", "Adaptation Menu", 1000, 770, src) @@ -111,7 +111,7 @@ the new instance inside the host to be updated to the template's stats. for(var/datum/disease_ability/ability in purchased_abilities) . += span_notice("[ability.name]") -/mob/camera/disease/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/camera/disease/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(!message) return if(sanitize) @@ -134,12 +134,12 @@ 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/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) +/mob/camera/disease/can_z_move(direction, turf/start, z_move_flags = NONE, mob/living/rider) if(freemove) return ..() return FALSE -/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/camera/disease/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -150,11 +150,14 @@ the new instance inside the host to be updated to the template's stats. link = FOLLOW_LINK(src, to_follow) else link = "" + + var/translated_message = translate_speech(speaker, message_language, raw_message, spans, message_mods) // Create map text prior to modifying message for goonchat if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) - create_chat_message(speaker, message_language, raw_message, spans, sound_loc = sound_loc) + create_chat_message(speaker, message_language, translated_message, spans, sound_loc = sound_loc) + // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) + message = compose_message(speaker, message_language, translated_message, radio_freq, spans, message_mods) to_chat(src, "[link] [message]") @@ -163,7 +166,7 @@ the new instance inside the host to be updated to the template's stats. if(!mind.has_antag_datum(/datum/antagonist/disease)) mind.add_antag_datum(/datum/antagonist/disease) var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.add_hud_to(src) + medsensor.show_to(src) /mob/camera/disease/proc/pick_name() var/static/list/taken_names @@ -255,7 +258,7 @@ the new instance inside the host to be updated to the template's stats. MA.alpha = 200 holder.appearance = MA var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.add_to_hud(V.affected_mob) + my_hud.add_atom_to_hud(V.affected_mob) to_chat(src, span_notice("A new host, [V.affected_mob.real_name], has been infected.")) @@ -271,7 +274,7 @@ the new instance inside the host to be updated to the template's stats. to_chat(src, span_notice("One of your hosts, [V.affected_mob.real_name], has been purged of your infection.")) var/datum/atom_hud/my_hud = GLOB.huds[DATA_HUD_SENTIENT_DISEASE] - my_hud.remove_from_hud(V.affected_mob) + my_hud.remove_atom_from_hud(V.affected_mob) if(following_host == V.affected_mob) follow_next() diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index cbba9eda9809..bd62e44e694e 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -8,7 +8,6 @@ can_elimination_hijack = ELIMINATION_PREVENT show_in_antagpanel = FALSE show_to_ghosts = TRUE - antag_moodlet = /datum/mood_event/focused suicide_cry = "FOR NANOTRASEN!!" var/datum/team/ert/ert_team var/leader = FALSE @@ -231,7 +230,7 @@ return if(isplasmaman(H)) H.equipOutfit(plasmaman_outfit) - H.internal = H.get_item_for_held_index(2) + H.open_internals(H.get_item_for_held_index(2)) H.equipOutfit(outfit) @@ -263,7 +262,7 @@ var/mob/living/M = mob_override || owner.current if(M.hud_used) var/datum/hud/H = M.hud_used - var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted() + var/atom/movable/screen/wanted/giving_wanted_lvl = new /atom/movable/screen/wanted(null, M.hud_used) H.wanted_lvl = giving_wanted_lvl giving_wanted_lvl.hud = H H.infodisplay += giving_wanted_lvl diff --git a/code/modules/antagonists/fugitive/fugitive.dm b/code/modules/antagonists/fugitive/fugitive.dm index d3d187756670..2138e83b4b3b 100644 --- a/code/modules/antagonists/fugitive/fugitive.dm +++ b/code/modules/antagonists/fugitive/fugitive.dm @@ -72,7 +72,6 @@ message += "
    [span_danger("You also sense other silicon life on the station. Escaping would allow notifying S.E.L.F. to intervene... or you could free them yourself...")]" to_chat(owner, "[message]") to_chat(owner, "You are not an antagonist in that you may kill whomever you please, but you can do anything to avoid capture.") - owner.announce_objectives() /datum/antagonist/fugitive/create_team(datum/team/fugitive/new_team) if(!new_team) diff --git a/code/modules/antagonists/fugitive/fugitive_outfits.dm b/code/modules/antagonists/fugitive/fugitive_outfits.dm index 1514d7c0ae96..3ab73c0298df 100644 --- a/code/modules/antagonists/fugitive/fugitive_outfits.dm +++ b/code/modules/antagonists/fugitive/fugitive_outfits.dm @@ -86,7 +86,7 @@ /datum/outfit/spacepol/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.assignment = "Police Officer" W.registered_name = H.real_name W.update_label() @@ -176,7 +176,7 @@ /datum/outfit/bountyarmor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -201,7 +201,7 @@ /datum/outfit/bountyhook/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() diff --git a/code/modules/antagonists/fugitive/fugitive_ship.dm b/code/modules/antagonists/fugitive/fugitive_ship.dm index f269425194bb..4d792b489d61 100644 --- a/code/modules/antagonists/fugitive/fugitive_ship.dm +++ b/code/modules/antagonists/fugitive/fugitive_ship.dm @@ -12,7 +12,7 @@ . = ..() . += span_notice("Add a prisoner by dragging them into the machine.") -/obj/machinery/fugitive_capture/MouseDrop_T(mob/target, mob/user) +/obj/machinery/fugitive_capture/MouseDroppedOn(mob/target, mob/user) var/mob/living/fugitive_hunter = user if(!isliving(fugitive_hunter)) return diff --git a/code/modules/antagonists/fugitive/hunter.dm b/code/modules/antagonists/fugitive/hunter.dm index 5e674df49575..41a37dbdd2c5 100644 --- a/code/modules/antagonists/fugitive/hunter.dm +++ b/code/modules/antagonists/fugitive/hunter.dm @@ -33,7 +33,6 @@ to_chat(src, span_danger("We will not be able to make ends meet without our cargo, so we must do as he says and capture them.")) to_chat(owner, span_boldannounce("You are not an antagonist in that you may kill whomever you please, but you can do anything to ensure the capture of the fugitives, even if that means going through the station.")) - owner.announce_objectives() /datum/antagonist/fugitive_hunter/create_team(datum/team/fugitive_hunters/new_team) if(!new_team) diff --git a/code/modules/antagonists/gang/cellphone.dm b/code/modules/antagonists/gang/cellphone.dm index c94a2a985003..2e2c8e2d1038 100644 --- a/code/modules/antagonists/gang/cellphone.dm +++ b/code/modules/antagonists/gang/cellphone.dm @@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(gangster_cell_phones) icon_state = "phone_off" activated = FALSE -/obj/item/gangster_cellphone/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc) +/obj/item/gangster_cellphone/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) . = ..() if(!activated) return diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm index 82babe31609d..3ac6fb0aa120 100644 --- a/code/modules/antagonists/gang/outfits.dm +++ b/code/modules/antagonists/gang/outfits.dm @@ -2,7 +2,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -66,7 +66,7 @@ name = "Families: Space FBI Officer" suit = /obj/item/clothing/suit/armor/laserproof head = /obj/item/clothing/head/helmet/riot - belt = /obj/item/gun/ballistic/automatic/proto/unrestricted + belt = /obj/item/gun/ballistic/automatic/proto gloves = /obj/item/clothing/gloves/combat backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index cd062339d537..1f0e9e0d52f4 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -17,7 +17,6 @@ roundend_category = "Heretics" antagpanel_category = "Heretic" ui_name = "AntagInfoHeretic" - antag_moodlet = /datum/mood_event/heretics job_rank = ROLE_HERETIC antag_hud_name = "heretic" hijack_speed = 0.5 @@ -337,7 +336,7 @@ var/num_heads = 0 for(var/mob/player in GLOB.alive_player_list) - if(player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(player.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER) num_heads++ var/datum/objective/minor_sacrifice/sac_objective = new() @@ -345,6 +344,7 @@ if(num_heads < 2) // They won't get major sacrifice, so bump up minor sacrifice a bit sac_objective.target_amount += 2 sac_objective.update_explanation_text() + objectives += sac_objective if(num_heads >= 2) @@ -391,7 +391,7 @@ */ /datum/antagonist/heretic/proc/passive_influence_gain() knowledge_points++ - if(owner.current.stat <= SOFT_CRIT) + if(owner.current.stat == CONSCIOUS) to_chat(owner.current, "[span_hear("You hear a whisper...")] [span_hypnophrase(pick(strings(HERETIC_INFLUENCE_FILE, "drain_message")))]") addtimer(CALLBACK(src, PROC_REF(passive_influence_gain)), passive_gain_timer) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index d3aac5e3ee97..a95db3350770 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -391,7 +391,7 @@ var/list/compiled_list = list() for(var/mob/living/carbon/human/human_to_check as anything in GLOB.human_list) - if(fingerprints[md5(human_to_check.dna.unique_identity)]) + if(fingerprints[human_to_check.get_fingerprints(TRUE)]) compiled_list |= human_to_check.real_name compiled_list[human_to_check.real_name] = human_to_check diff --git a/code/modules/antagonists/heretic/heretic_living_heart.dm b/code/modules/antagonists/heretic/heretic_living_heart.dm index 7945546c6786..74e369a7c5c9 100644 --- a/code/modules/antagonists/heretic/heretic_living_heart.dm +++ b/code/modules/antagonists/heretic/heretic_living_heart.dm @@ -22,7 +22,7 @@ return COMPONENT_INCOMPATIBLE var/obj/item/organ/organ_parent = parent - if(organ_parent.status != ORGAN_ORGANIC || (organ_parent.organ_flags & ORGAN_SYNTHETIC)) + if(organ_parent.organ_flags & ORGAN_SYNTHETIC) return COMPONENT_INCOMPATIBLE if(!IS_HERETIC(organ_parent.owner)) diff --git a/code/modules/antagonists/heretic/heretic_monsters.dm b/code/modules/antagonists/heretic/heretic_monsters.dm index 6f262d2aa320..f1e57ba3a505 100644 --- a/code/modules/antagonists/heretic/heretic_monsters.dm +++ b/code/modules/antagonists/heretic/heretic_monsters.dm @@ -3,7 +3,6 @@ name = "\improper Eldritch Horror" roundend_category = "Heretics" antagpanel_category = "Heretic Beast" - antag_moodlet = /datum/mood_event/heretics job_rank = ROLE_HERETIC antag_hud_name = "heretic_beast" suicide_cry = "MY MASTER SMILES UPON ME!!" diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm index ad0382fdb983..daa74914a9d1 100644 --- a/code/modules/antagonists/heretic/influences.dm +++ b/code/modules/antagonists/heretic/influences.dm @@ -192,7 +192,6 @@ var/mob/living/carbon/human/human_user = user to_chat(human_user, span_userdanger("Your mind burns as you stare at the tear!")) human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 190) - SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) /obj/effect/heretic_influence name = "reality smash" diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index a71fbf0111d7..f1adab2b8de7 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -25,7 +25,7 @@ allowed = list(/obj/item/melee/sickly_blade) 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, FIRE = 20, ACID = 20) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 35, BIO = 20, FIRE = 20, ACID = 20) /obj/item/clothing/suit/hooded/cultrobes/eldritch/examine(mob/user) . = ..() @@ -42,7 +42,7 @@ flags_cover = NONE desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you loose comprehension of what you are seeing." item_flags = EXAMINE_SKIP - armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 15, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/hooded/cult_hoodie/void/Initialize(mapload) . = ..() @@ -57,12 +57,12 @@ hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void flags_inv = NONE // slightly worse than normal cult robes - armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 15, BIO = 0, FIRE = 0, ACID = 0) alternative_mode = TRUE - + /obj/item/clothing/suit/hooded/cultrobes/void/Initialize(mapload) . = ..() - + create_storage(type = /datum/storage/pockets/void_cloak) /obj/item/clothing/suit/hooded/cultrobes/void/RemoveHood() diff --git a/code/modules/antagonists/heretic/items/hunter_rifle.dm b/code/modules/antagonists/heretic/items/hunter_rifle.dm index 131f289b66fb..805a97431090 100644 --- a/code/modules/antagonists/heretic/items/hunter_rifle.dm +++ b/code/modules/antagonists/heretic/items/hunter_rifle.dm @@ -20,7 +20,6 @@ ammo_type = /obj/item/ammo_casing/a762/lionhunter caliber = CALIBER_A762 max_ammo = 3 - multiload = TRUE /obj/item/ammo_casing/a762/lionhunter projectile_type = /obj/projectile/bullet/a762/lionhunter diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index 1ddf4f174f6c..a7a23e8bb1d1 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -209,6 +209,5 @@ var/datum/action/cooldown/spell/fire_cascade/big/screen_wide_fire_spell = new(user.mind) screen_wide_fire_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) for(var/trait in traits_to_apply) ADD_TRAIT(user, trait, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 966d1f6459a5..0ae8e6561d14 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -123,7 +123,7 @@ damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, - armour_penetration = 0, + armor_penetration = 0, ) SIGNAL_HANDLER @@ -171,7 +171,7 @@ addtimer(CALLBACK(src, PROC_REF(reset_riposte), source), BLADE_DANCE_COOLDOWN) /datum/heretic_knowledge/blade_dance/proc/counter_attack(mob/living/carbon/human/source, mob/living/target, obj/item/melee/sickly_blade/weapon, attack_text) - playsound(get_turf(source), 'sound/weapons/parry.ogg', 100, TRUE) + playsound(get_turf(source), 'sound/weapons/block/parry_metal.ogg', 100, TRUE) source.balloon_alert(source, "riposte used") source.visible_message( span_warning("[source] leans into [attack_text] and delivers a sudden riposte back at [target]!"), @@ -241,7 +241,6 @@ /datum/heretic_knowledge/duel_stance/on_gain(mob/user) ADD_TRAIT(user, TRAIT_NODISMEMBER, type) RegisterSignal(user, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) - RegisterSignal(user, COMSIG_CARBON_GAIN_WOUND, PROC_REF(on_wound_gain)) RegisterSignal(user, COMSIG_CARBON_HEALTH_UPDATE, PROC_REF(on_health_update)) on_health_update(user) // Run this once, so if the knowledge is learned while hurt it activates properly @@ -252,7 +251,7 @@ REMOVE_TRAIT(user, TRAIT_HARDLY_WOUNDED, type) REMOVE_TRAIT(user, TRAIT_STUNRESISTANCE, type) - UnregisterSignal(user, list(COMSIG_PARENT_EXAMINE, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_HEALTH_UPDATE)) + UnregisterSignal(user, list(COMSIG_PARENT_EXAMINE, COMSIG_CARBON_HEALTH_UPDATE)) /datum/heretic_knowledge/duel_stance/proc/on_examine(mob/living/source, mob/user, list/examine_list) SIGNAL_HANDLER @@ -261,14 +260,6 @@ if(in_duelist_stance) examine_list += span_warning("[source] looks unnaturally poised[held_item?.force >= 15 ? " and ready to strike out":""].") -/datum/heretic_knowledge/duel_stance/proc/on_wound_gain(mob/living/source, datum/wound/gained_wound, obj/item/bodypart/limb) - SIGNAL_HANDLER - - if(!gained_wound.bleed_timer) - return - - gained_wound.bleed_timer -= 15 - /datum/heretic_knowledge/duel_stance/proc/on_health_update(mob/living/source) SIGNAL_HANDLER @@ -368,7 +359,6 @@ /datum/heretic_knowledge/final/blade_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[generate_heretic_text()] Master of blades, the Colonel's disciple, [user.real_name] has ascended! Their steel is that which will cut reality in a maelstom of silver! [generate_heretic_text()]","[generate_heretic_text()]", sound_type = ANNOUNCER_SPANOMALIES) - user.client?.give_award(/datum/award/achievement/misc/blade_ascension, user) ADD_TRAIT(user, TRAIT_STUNIMMUNE, name) ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, name) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index a8d59aff1691..c7c9b54a6302 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -300,7 +300,6 @@ var/datum/action/cooldown/spell/shed_human_form/worm_spell = new(user.mind) worm_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/flesh_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) var/datum/heretic_knowledge/limited_amount/flesh_grasp/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_grasp) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 05d40279e401..d7de809917e2 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -238,7 +238,6 @@ new /datum/rust_spread(loc) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) - user.client?.give_award(/datum/award/achievement/misc/rust_ascension, user) /** * Signal proc for [COMSIG_MOVABLE_MOVED]. diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm index 4432b14f9ef6..ba191bd4d458 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_buff.dm @@ -94,8 +94,7 @@ return if(owner.blood_volume < BLOOD_VOLUME_NORMAL) - owner.blood_volume = owner.blood_volume + 2 - + owner.adjustBloodVolume(2) var/mob/living/carbon/carbon_owner = owner var/datum/wound/bloodiest_wound diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 759e76b68f6a..06651c63749a 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -65,7 +65,7 @@ // Let's remove any humans in our atoms list that aren't a sac target for(var/mob/living/carbon/human/sacrifice in atoms) // If the mob's not in soft crit or worse, or isn't one of the sacrifices, remove it from the list - if(sacrifice.stat < SOFT_CRIT || !(sacrifice in heretic_datum.sac_targets)) + if(sacrifice.stat == CONSCIOUS || !(sacrifice in heretic_datum.sac_targets)) atoms -= sacrifice // Finally, return TRUE if we have a target in the list @@ -124,7 +124,7 @@ // First target, any command. for(var/datum/mind/head_mind as anything in shuffle(valid_targets)) - if(head_mind.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(head_mind.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER) final_targets += head_mind valid_targets -= head_mind break @@ -188,7 +188,7 @@ to_chat(user, span_hypnophrase("Your patrons accepts your offer.")) - if(sacrifice.mind?.assigned_role?.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(sacrifice.mind?.assigned_role?.departments_bitflags & (DEPARTMENT_BITFLAG_MANAGEMENT)) heretic_datum.knowledge_points++ heretic_datum.high_value_sacrifices++ @@ -223,8 +223,8 @@ var/turf/destination = get_turf(destination_landmark) sac_target.visible_message(span_danger("[sac_target] begins to shudder violenty as dark tendrils begin to drag them into thin air!")) - sac_target.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult(sac_target)) - sac_target.update_handcuffed() + + sac_target.equip_to_slot_if_possible(new /obj/item/restraints/handcuffs/energy/cult(sac_target), ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE) sac_target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 85, 150) sac_target.do_jitter_animation() log_combat(heretic_mind.current, sac_target, "sacrificed") @@ -304,11 +304,9 @@ // About how long should the helgrasp last? (1 metab a tick = helgrasp_time / 2 ticks (so, 1 minute = 60 seconds = 30 ticks)) var/helgrasp_time = 1 MINUTES - sac_target.reagents?.add_reagent(/datum/reagent/inverse/helgrasp/heretic, helgrasp_time / 20) + sac_target.reagents?.add_reagent(/datum/reagent/helgrasp/heretic, helgrasp_time / 20) sac_target.apply_necropolis_curse(CURSE_BLINDING | CURSE_GRASPING) - SEND_SIGNAL(sac_target, COMSIG_ADD_MOOD_EVENT, "shadow_realm", /datum/mood_event/shadow_realm) - sac_target.flash_act() sac_target.blur_eyes(15) sac_target.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) @@ -359,8 +357,7 @@ UnregisterSignal(sac_target, COMSIG_LIVING_DEATH) sac_target.remove_status_effect(/datum/status_effect/necropolis_curse) sac_target.remove_status_effect(/datum/status_effect/unholy_determination) - sac_target.reagents?.del_reagent(/datum/reagent/inverse/helgrasp/heretic) - SEND_SIGNAL(sac_target, COMSIG_CLEAR_MOOD_EVENT, "shadow_realm") + sac_target.reagents?.del_reagent(/datum/reagent/helgrasp/heretic) // Wherever we end up, we sure as hell won't be able to explain sac_target.adjust_timed_status_effect(40 SECONDS, /datum/status_effect/speech/slurring/heretic) @@ -438,10 +435,6 @@ sac_target.AdjustKnockdown(80) sac_target.stamina.adjust(-120) - // Glad i'm outta there, though! - SEND_SIGNAL(sac_target, COMSIG_ADD_MOOD_EVENT, "shadow_realm_survived", /datum/mood_event/shadow_realm_live) - SEND_SIGNAL(sac_target, COMSIG_ADD_MOOD_EVENT, "shadow_realm_survived_sadness", /datum/mood_event/shadow_realm_live_sad) - // Could use a little pick-me-up... sac_target.reagents?.add_reagent(/datum/reagent/medicine/atropine, 8) sac_target.reagents?.add_reagent(/datum/reagent/medicine/epinephrine, 8) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm deleted file mode 100644 index 0bf6692f0924..000000000000 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_moodlets.dm +++ /dev/null @@ -1,15 +0,0 @@ -// Some moodlets involved in the sacrifice process. -/datum/mood_event/shadow_realm - description = "Where am I?!" - mood_change = -15 - timeout = 3 MINUTES - -/datum/mood_event/shadow_realm_live - description = "I'm alive... I'm alive!!" - mood_change = 4 - timeout = 5 MINUTES - -/datum/mood_event/shadow_realm_live_sad - description = "The hands! The horrible, horrific hands! I see them when I close my eyes!" - mood_change = -6 - timeout = 10 MINUTES diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm index ba86dfb19610..c63fb938614b 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm @@ -80,5 +80,5 @@ CRASH("[type] required a head bodypart, yet did not have one in selected_atoms when it reached cleanup_atoms.") // Spill out any brains or stuff before we delete it. - ritual_head.drop_organs() + ritual_head.drop_contents() return ..() diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index f3786b84d1fa..ff1af641ad73 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -80,14 +80,14 @@ CALIBER_38, CALIBER_45, CALIBER_46X30MM, - CALIBER_50, + CALIBER_50_RIFLE, CALIBER_712X82MM, CALIBER_75, CALIBER_9MM, CALIBER_A556, CALIBER_A762, CALIBER_N762, - CALIBER_SHOTGUN, + CALIBER_12GAUGE, ) /datum/heretic_knowledge/rifle_ammo/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm b/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm index d48b382a7047..2a11ad7b8ef2 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_ash.dm @@ -70,5 +70,5 @@ CRASH("[type] required a head bodypart, yet did not have one in selected_atoms when it reached cleanup_atoms.") // Spill out any brains or stuff before we delete it. - ritual_head.drop_organs() + ritual_head.drop_contents() return ..() diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 1a4ee9fa4441..0810f8a6cbcf 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -114,7 +114,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) // By this point they are making a new heart // If their current heart is organic / not synthetic, we can continue the ritual as normal - if(our_living_heart.status == ORGAN_ORGANIC && !(our_living_heart.organ_flags & ORGAN_SYNTHETIC)) + if(!(our_living_heart.organ_flags & ORGAN_SYNTHETIC)) return TRUE // If their current heart is not organic / is synthetic, they need an organic replacement @@ -129,7 +129,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) continue if(!nearby_organ.useable) continue - if(nearby_organ.status != ORGAN_ORGANIC || (nearby_organ.organ_flags & (ORGAN_SYNTHETIC|ORGAN_FAILING))) + if(nearby_organ.organ_flags & (ORGAN_SYNTHETIC|ORGAN_DEAD)) continue selected_atoms += nearby_organ @@ -143,12 +143,12 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) var/obj/item/organ/our_new_heart = user.getorganslot(our_heretic.living_heart_organ_slot) // Our heart is robotic or synthetic - we need to replace it, and we fortunately should have one by here - if(our_new_heart.status != ORGAN_ORGANIC || (our_new_heart.organ_flags & ORGAN_SYNTHETIC)) + if(our_new_heart.organ_flags & ORGAN_SYNTHETIC) var/obj/item/organ/our_replacement_heart = locate(required_organ_type) in selected_atoms if(our_replacement_heart) // Throw our current heart out of our chest, violently user.visible_message(span_boldwarning("[user]'s [our_new_heart.name] bursts suddenly out of [user.p_their()] chest!")) - INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream") + INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "agony") user.apply_damage(20, BRUTE, BODY_ZONE_CHEST) // And put our organic heart in its place our_replacement_heart.Insert(user, TRUE, TRUE) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 57f4e95ae43f..95b4131c9d04 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -198,7 +198,6 @@ /datum/heretic_knowledge/final/void_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() priority_announce("[generate_heretic_text()] The nobleman of void [user.real_name] has arrived, step along the Waltz that ends worlds! [generate_heretic_text()]","[generate_heretic_text()]", sound_type = ANNOUNCER_SPANOMALIES) - user.client?.give_award(/datum/award/achievement/misc/void_ascension, user) ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) // Let's get this show on the road! diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index d3844221a99c..d5fb1598095b 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -159,5 +159,5 @@ if(M in hit_list) continue hit_list += M - M.take_damage(45, BURN, MELEE, 1) + M.take_damage(45, BURN, BLUNT, 1) sleep(1.5) diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index e29dc100124e..9638efa06739 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -27,7 +27,7 @@ var/mob/living/simple_animal/hostile/heretic_summon/armsy/prime/old_armsy = cast_on var/mob/living/our_heretic = locate() in old_armsy - if(our_heretic.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT)) + if(our_heretic.remove_status_effect(/datum/status_effect/grouped/hard_stasis, STASIS_ASCENSION_EFFECT)) our_heretic.forceMove(old_armsy.loc) old_armsy.mind.transfer_to(our_heretic, TRUE) @@ -39,13 +39,12 @@ cast_on.mind.transfer_to(new_armsy, TRUE) cast_on.forceMove(new_armsy) - cast_on.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_ASCENSION_EFFECT) + cast_on.apply_status_effect(/datum/status_effect/grouped/hard_stasis, STASIS_ASCENSION_EFFECT) // They see the very reality uncoil before their eyes. for(var/mob/living/carbon/human/nearby_human in view(scare_radius, new_armsy)) if(IS_HERETIC_OR_MONSTER(nearby_human)) continue - SEND_SIGNAL(nearby_human, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) if(prob(25)) var/datum/brain_trauma/trauma = pick(subtypesof(BRAIN_TRAUMA_MILD) + subtypesof(BRAIN_TRAUMA_SEVERE)) diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 9d8ba23eced9..e3e24a9f09c8 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -87,7 +87,7 @@ /datum/action/cooldown/spell/pointed/projectile/furious_steel/ready_projectile(obj/projectile/to_launch, atom/target, mob/user, iteration) . = ..() - to_launch.def_zone = check_zone(user.zone_selected) + to_launch.aimed_def_zone = deprecise_zone(user.zone_selected) /// If our blade status effect is deleted, clear our refs and deactivate /datum/action/cooldown/spell/pointed/projectile/furious_steel/proc/on_status_effect_deleted(datum/status_effect/protective_blades/source) @@ -102,7 +102,7 @@ icon_state = "knife" speed = 2 damage = 25 - armour_penetration = 100 + armor_penetration = 100 sharpness = SHARP_EDGED pass_flags = PASSTABLE | PASSFLAPS diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index 1733c6e405c0..6d7853774b81 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -28,5 +28,4 @@ return FALSE to_chat(caster, span_warning("[human_victim.name] has been cursed!")) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) return TRUE diff --git a/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm index 7d6a3702ffe5..306123ba67e4 100644 --- a/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwater_rebirth.dm @@ -38,7 +38,7 @@ new /obj/effect/temp_visual/eldritch_smoke(victim.drop_location()) //This is essentially a death mark, use this to finish your opponent quicker. - if(HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) && !HAS_TRAIT(victim, TRAIT_NODEATH)) + if(victim.stat == UNCONSCIOUS && !HAS_TRAIT(victim, TRAIT_NODEATH)) victim.death() victim.apply_damage(20, BURN) diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 10bef00c31cd..39336fa2f82c 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -243,5 +243,4 @@ carbon_victim.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) carbon_victim.set_timed_status_effect(40 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) carbon_victim.blind_eyes(2) - SEND_SIGNAL(carbon_victim, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) playsound(src, 'sound/magic/blind.ogg', 75, TRUE) diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm index 0392ca05da01..79cfe7fabb24 100644 --- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm +++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm @@ -84,7 +84,7 @@ if(istype(weapon, /obj/item/organ)) var/obj/item/organ/consumed = weapon - if(consumed.status != ORGAN_ORGANIC || (consumed.organ_flags & ORGAN_SYNTHETIC)) + if(consumed.organ_flags & ORGAN_SYNTHETIC) balloon_alert(user, "not organic!") return if(consumed.organ_flags & ORGAN_VITAL) // Basically, don't eat organs like brains diff --git a/code/modules/antagonists/highlander/highlander.dm b/code/modules/antagonists/highlander/highlander.dm index 27f21456333a..a8af18b1b752 100644 --- a/code/modules/antagonists/highlander/highlander.dm +++ b/code/modules/antagonists/highlander/highlander.dm @@ -13,7 +13,6 @@ ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, HIGHLANDER_TRAIT) ADD_TRAIT(L, TRAIT_NOFIRE, HIGHLANDER_TRAIT) ADD_TRAIT(L, TRAIT_NOBREATH, HIGHLANDER_TRAIT) - REMOVE_TRAIT(L, TRAIT_PACIFISM, ROUNDSTART_TRAIT) /datum/antagonist/highlander/remove_innate_effects(mob/living/mob_override) var/mob/living/L = owner.current || mob_override @@ -22,8 +21,6 @@ REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, HIGHLANDER_TRAIT) REMOVE_TRAIT(L, TRAIT_NOFIRE, HIGHLANDER_TRAIT) REMOVE_TRAIT(L, TRAIT_NOBREATH, HIGHLANDER_TRAIT) - if(L.has_quirk(/datum/quirk/nonviolent)) - ADD_TRAIT(L, TRAIT_PACIFISM, ROUNDSTART_TRAIT) /datum/antagonist/highlander/proc/forge_objectives() var/datum/objective/steal/steal_objective = new @@ -73,9 +70,8 @@ sword = new(H) if(!GLOB.highlander_controller) sword.flags_1 |= ADMIN_SPAWNED_1 //To prevent announcing - sword.pickup(H) //For the stun shielding - H.put_in_hands(sword) + H.pickup_item(sword) var/obj/item/bloodcrawl/antiwelder = new(H) antiwelder.name = "compulsion of honor" diff --git a/code/modules/antagonists/hypnotized/hypnotized.dm b/code/modules/antagonists/hypnotized/hypnotized.dm index 41b6559f5fd3..db8c06e97684 100644 --- a/code/modules/antagonists/hypnotized/hypnotized.dm +++ b/code/modules/antagonists/hypnotized/hypnotized.dm @@ -14,5 +14,7 @@ var/datum/brain_trauma/hypnosis/trauma /datum/antagonist/hypnotized/Destroy() - QDEL_NULL(trauma) + if(!QDELETED(trauma)) + qdel(trauma) + trauma = null return ..() diff --git a/code/modules/antagonists/malf_ai/datum_malf_ai.dm b/code/modules/antagonists/malf_ai/datum_malf_ai.dm index 95745d7e4845..293447aa7241 100644 --- a/code/modules/antagonists/malf_ai/datum_malf_ai.dm +++ b/code/modules/antagonists/malf_ai/datum_malf_ai.dm @@ -6,6 +6,7 @@ roundend_category = "traitors" antagpanel_category = "Malf AI" job_rank = ROLE_MALF + assign_job = /datum/job/ai antag_hud_name = "traitor" ui_name = "AntagInfoMalf" ///the name of the antag flavor this traitor has. @@ -60,12 +61,9 @@ if(prob(PROB_SPECIAL)) forge_special_objective() - var/objective_limit = CONFIG_GET(number/traitor_objectives_amount) var/objective_count = length(objectives) - // for(in...to) loops iterate inclusively, so to reach objective_limit we need to loop to objective_limit - 1 - // This does not give them 1 fewer objectives than intended. - for(var/i in objective_count to objective_limit - 1) + for(var/i in objective_count to 1) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner kill_objective.find_target() @@ -77,30 +75,10 @@ /// Generates a special objective and adds it to the objective list. /datum/antagonist/malf_ai/proc/forge_special_objective() - var/special_pick = rand(1,4) - switch(special_pick) - if(1) - var/datum/objective/block/block_objective = new - block_objective.owner = owner - objectives += block_objective - if(2) - var/datum/objective/purge/purge_objective = new - purge_objective.owner = owner - objectives += purge_objective - if(3) - var/datum/objective/robot_army/robot_objective = new - robot_objective.owner = owner - objectives += robot_objective - if(4) //Protect and strand a target - var/datum/objective/protect/yandere_one = new - yandere_one.owner = owner - objectives += yandere_one - yandere_one.find_target() - var/datum/objective/maroon/yandere_two = new - yandere_two.owner = owner - yandere_two.target = yandere_one.target - yandere_two.update_explanation_text() // normally called in find_target() - objectives += yandere_two + var/datum/objective/jailbreak/yandere_one = new + yandere_one.owner = owner + objectives += yandere_one + yandere_one.find_target() /datum/antagonist/malf_ai/greet() . = ..() diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index e714ccc63f28..52ca8e90571a 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -57,15 +57,13 @@ /mob/living/simple_animal/hostile/morph/med_hud_set_health() if(morphed && !isliving(form)) - var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = null + set_hud_image_vars(HEALTH_HUD, null) return //we hide medical hud while morphed ..() /mob/living/simple_animal/hostile/morph/med_hud_set_status() if(morphed && !isliving(form)) - var/image/holder = hud_list[STATUS_HUD] - holder.icon_state = null + set_hud_image_vars(STATUS_HUD, null) return //we hide medical hud while morphed ..() @@ -111,8 +109,7 @@ melee_damage_upper = melee_damage_disguised add_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) - med_hud_set_health() - med_hud_set_status() //we're an object honest + update_med_hud() return /mob/living/simple_animal/hostile/morph/proc/restore() @@ -139,8 +136,7 @@ melee_damage_upper = initial(melee_damage_upper) remove_movespeed_modifier(/datum/movespeed_modifier/morph_disguised) - med_hud_set_health() - med_hud_set_status() //we are not an object + update_med_hud() /mob/living/simple_animal/hostile/morph/death(gibbed) if(morphed) @@ -201,37 +197,3 @@ eat(I) return return ..() - -//Spawn Event - -/datum/round_event_control/morph - name = "Spawn Morph" - typepath = /datum/round_event/ghost_role/morph - weight = 0 //Admin only - max_occurrences = 1 - -/datum/round_event/ghost_role/morph - minimum_required = 1 - role_name = "morphling" - -/datum/round_event/ghost_role/morph/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - if(!GLOB.xeno_spawn) - return MAP_ERROR - var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn)) - player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/morph)) - player_mind.special_role = ROLE_MORPH - player_mind.add_antag_datum(/datum/antagonist/morph) - SEND_SOUND(S, sound('sound/magic/mutate.ogg')) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a morph by an event.") - log_game("[key_name(S)] was spawned as a morph by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 5e7a5210c075..ff9ba3073da8 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -7,7 +7,7 @@ icon_state = "arm_blade" inhand_icon_state = "arm_blade" force = 25 - armour_penetration = 35 + armor_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' item_flags = ABSTRACT | DROPDEL | ACID_PROOF diff --git a/code/modules/antagonists/nightmare/nightmare_organs.dm b/code/modules/antagonists/nightmare/nightmare_organs.dm index ae485c990a5c..c9eae2c2148e 100644 --- a/code/modules/antagonists/nightmare/nightmare_organs.dm +++ b/code/modules/antagonists/nightmare/nightmare_organs.dm @@ -40,7 +40,7 @@ /// The armblade granted to the host of this heart. var/obj/item/light_eater/blade -/obj/item/organ/heart/nightmare/ComponentInitialize() +/obj/item/organ/heart/nightmare/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) @@ -103,10 +103,5 @@ playsound(owner, 'sound/hallucinations/far_noise.ogg', 50, TRUE) respawn_progress = 0 -/obj/item/organ/heart/nightmare/get_availability(datum/species/S) - if(istype(S,/datum/species/shadow/nightmare)) - return TRUE - return ..() - #undef HEART_SPECIAL_SHADOWIFY #undef HEART_RESPAWN_THRESHHOLD diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index db147c972b8b..2b28a269cec5 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -21,8 +21,7 @@ TRAIT_NODISMEMBER, TRAIT_NOHUNGER, ) - mutanteyes = /obj/item/organ/eyes/night_vision/nightmare - mutantheart = /obj/item/organ/heart/nightmare + bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/shadow/nightmare, BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/shadow/nightmare, @@ -32,6 +31,18 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/shadow, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart/nightmare, + ORGAN_SLOT_LUNGS = null, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/nightmare, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = null, + ORGAN_SLOT_APPENDIX = null, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ) + /datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 4b40e5161d98..e49fb156082a 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -36,9 +36,9 @@ /datum/antagonist/nukeop/leader/clownop/give_alias() title = pick("Head Honker", "Slipmaster", "Clown King", "Honkbearer") if(nuke_team?.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" + owner.current.set_real_name("[nuke_team.syndicate_name] [title]") else - owner.current.real_name = "Syndicate [title]" + owner.current.set_real_name("Syndicate [title]") /datum/antagonist/nukeop/leader/clownop name = "Clown Operative Leader" diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index b22e5dc54831..20d981fb6ed1 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -54,8 +54,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) 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.") - for(var/V in GLOB.syndicate_shuttle_boards) - var/obj/item/circuitboard/computer/syndicate_shuttle/board = V + for(var/obj/item/circuitboard/computer/syndicate_shuttle/board as anything in INSTANCES_OF(/obj/item/circuitboard/computer/syndicate_shuttle)) board.challenge = TRUE for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) @@ -88,8 +87,7 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) priority_announce(war_declaration, "???", sub_title = "Declaration of War", sound_type = 'sound/machines/alarm.ogg', do_not_modify = TRUE) - for(var/V in GLOB.syndicate_shuttle_boards) - var/obj/item/circuitboard/computer/syndicate_shuttle/board = V + for(var/obj/item/circuitboard/computer/syndicate_shuttle/board as anything in INSTANCES_OF(/obj/item/circuitboard/computer/syndicate_shuttle)) board.challenge = TRUE for(var/obj/machinery/computer/camera_advanced/shuttle_docker/D in GLOB.jam_on_wardec) @@ -148,8 +146,8 @@ GLOBAL_LIST_EMPTY(jam_on_wardec) if(world.time-SSticker.round_start_time > CHALLENGE_TIME_LIMIT) to_chat(user, span_boldwarning("It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")) return FALSE - for(var/V in GLOB.syndicate_shuttle_boards) - var/obj/item/circuitboard/computer/syndicate_shuttle/board = V + + for(var/obj/item/circuitboard/computer/syndicate_shuttle/board as anything in INSTANCES_OF(/obj/item/circuitboard/computer/syndicate_shuttle)) if(board.moved) to_chat(user, span_boldwarning("The shuttle has already been moved! You have forfeit the right to declare war.")) return FALSE diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index e706c9d5142e..1c0b9ba50b96 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -1,6 +1,7 @@ /// TRUE only if the station was actually hit by the nuke, otherwise FALSE GLOBAL_VAR_INIT(station_was_nuked, FALSE) GLOBAL_VAR(station_nuke_source) +GLOBAL_VAR(nuke_time_left) /obj/machinery/nuclearbomb name = "nuclear fission explosive" @@ -37,20 +38,21 @@ GLOBAL_VAR(station_nuke_source) /obj/machinery/nuclearbomb/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) countdown = new(src) - GLOB.nuke_list += src core = new /obj/item/nuke_core(src) STOP_PROCESSING(SSobj, core) update_appearance() SSpoints_of_interest.make_point_of_interest(src) previous_level = get_security_level() + GLOB.nuke_time_left = get_time_left() /obj/machinery/nuclearbomb/Destroy() + UNSET_TRACKING(__TYPE__) safety = FALSE if(!exploding) // If we're not exploding, set the alert level back to normal set_safety() - GLOB.nuke_list -= src QDEL_NULL(countdown) QDEL_NULL(core) . = ..() @@ -449,6 +451,7 @@ GLOBAL_VAR(station_nuke_source) S.switch_mode_to(initial(S.mode)) S.alert = FALSE countdown.stop() + GLOB.nuke_time_left = get_time_left() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NUKE_DEVICE_DISARMED, src) @@ -589,15 +592,15 @@ GLOBAL_VAR(station_nuke_source) R.my_atom = src R.add_reagent(/datum/reagent/consumable/ethanol/beer, 100) - var/datum/effect_system/foam_spread/foam = new - foam.set_up(200, get_turf(src), R) + var/datum/effect_system/fluid_spread/foam/foam = new + foam.set_up(200, location = get_turf(src), carry = R) foam.start() disarm() /obj/machinery/nuclearbomb/beer/proc/stationwide_foam() priority_announce("The scrubbers network is experiencing a backpressure surge. Some ejection of contents may occur.") - for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/vent in GLOB.machines) + for (var/obj/machinery/atmospherics/components/unary/vent_scrubber/vent as anything in INSTANCES_OF(/obj/machinery/atmospherics/components/unary/vent_scrubber)) var/turf/vent_turf = get_turf(vent) if (!vent_turf || !is_station_level(vent_turf.z) || vent.welded) continue @@ -605,7 +608,7 @@ GLOBAL_VAR(station_nuke_source) var/datum/reagents/beer = new /datum/reagents(1000) beer.my_atom = vent beer.add_reagent(/datum/reagent/consumable/ethanol/beer, 100) - beer.create_foam(/datum/effect_system/foam_spread, 200) + beer.create_foam(/datum/effect_system/fluid_spread/foam, DIAMOND_AREA(10)) CHECK_TICK @@ -679,7 +682,7 @@ This is here to make the tiles around the station mininuke change when it's arme desc = "Better keep this safe." icon_state = "nucleardisk" max_integrity = 250 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/fake = FALSE var/turf/last_secured_location @@ -689,55 +692,13 @@ This is here to make the tiles around the station mininuke change when it's arme . = ..() AddElement(/datum/element/bed_tuckable, 6, -6, 0) - if(!fake) - SSpoints_of_interest.make_point_of_interest(src) - last_disk_move = world.time - START_PROCESSING(SSobj, src) - -/obj/item/disk/nuclear/ComponentInitialize() - . = ..() AddComponent(/datum/component/stationloving, !fake) -/obj/item/disk/nuclear/process() - if(fake) - STOP_PROCESSING(SSobj, src) - CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") - - var/turf/new_turf = get_turf(src) - - if (is_secured()) - last_secured_location = new_turf - last_disk_move = world.time - var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control - if(istype(loneop) && loneop.occurrences < loneop.max_occurrences && prob(loneop.weight)) - loneop.weight = max(loneop.weight - 1, 0) - if(loneop.weight % 5 == 0 && SSticker.totalPlayers > 1) - message_admins("[src] is secured (currently in [ADMIN_VERBOSEJMP(new_turf)]). The weight of Lone Operative is now [loneop.weight].") - log_game("[src] being secured has reduced the weight of the Lone Operative event to [loneop.weight].") - else - /// How comfy is our disk? - var/disk_comfort_level = 0 - - //Go through and check for items that make disk comfy - for(var/obj/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) - visible_message(span_notice("[src] sleeps soundly. Sleep tight, disky.")) - message_admins("[src] is unsecured in [ADMIN_VERBOSEJMP(new_turf)]. The weight of Lone Operative is now [loneop.weight].") - log_game("[src] is unsecured for too long in [loc_name(new_turf)], and has increased the weight of the Lone Operative event to [loneop.weight].") - /obj/item/disk/nuclear/proc/is_secured() if (last_secured_location == get_turf(src)) return FALSE - var/mob/holder = pulledby || get(src, /mob) + var/mob/holder = get(src, /mob) if (isnull(holder?.client)) return FALSE diff --git a/code/modules/antagonists/nukeop/equipment/pinpointer.dm b/code/modules/antagonists/nukeop/equipment/pinpointer.dm index 2f6fb80c8e57..01b8fb3fa21e 100644 --- a/code/modules/antagonists/nukeop/equipment/pinpointer.dm +++ b/code/modules/antagonists/nukeop/equipment/pinpointer.dm @@ -15,7 +15,7 @@ else msg = "Its tracking indicator is blank." . += msg - for(var/obj/machinery/nuclearbomb/bomb in GLOB.machines) + for(var/obj/machinery/nuclearbomb/bomb as anything in INSTANCES_OF(/obj/machinery/nuclearbomb)) if(bomb.timing) . += "Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()]." @@ -23,7 +23,7 @@ ..() if(!active || alert) return - for(var/obj/machinery/nuclearbomb/bomb as anything in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/bomb as anything in INSTANCES_OF(/obj/machinery/nuclearbomb)) if(!bomb.timing) continue alert = TRUE @@ -44,8 +44,7 @@ var/mob/living/silicon/ai/A = V if(A.nuking) target = A - for(var/V in GLOB.apcs_list) - var/obj/machinery/power/apc/A = V + for(var/obj/machinery/power/apc/A as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(A.malfhack && A.occupier) target = A if(TRACK_INFILTRATOR) diff --git a/code/modules/antagonists/nukeop/nukeop.dm b/code/modules/antagonists/nukeop/nukeop.dm index 2c183680bab1..b883d9a2e115 100644 --- a/code/modules/antagonists/nukeop/nukeop.dm +++ b/code/modules/antagonists/nukeop/nukeop.dm @@ -3,11 +3,11 @@ roundend_category = "syndicate operatives" //just in case antagpanel_category = "NukeOp" job_rank = ROLE_OPERATIVE + assign_job = /datum/job/nuclear_operative antag_hud_name = "synd" - 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. - suicide_cry = "FOR THE SYNDICATE!!" + 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. @@ -36,9 +36,11 @@ return TRUE /datum/antagonist/nukeop/greet() + . = ..() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) - to_chat(owner, span_big("You are a [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent!")) - owner.announce_objectives() + +/datum/antagonist/nukeop/greeting_header() + return "You are the [nuke_team ? nuke_team.syndicate_name : "syndicate"] agent" /datum/antagonist/nukeop/on_gain() give_alias() @@ -77,14 +79,14 @@ /datum/antagonist/nukeop/proc/assign_nuke() if(nuke_team && !nuke_team.tracked_nuke) nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/syndicate/nuke = locate() in INSTANCES_OF(/obj/machinery/nuclearbomb) if(nuke) nuke_team.tracked_nuke = nuke if(nuke.r_code == "ADMIN") nuke.r_code = nuke_team.memorized_code else //Already set by admins/something else? nuke_team.memorized_code = nuke.r_code - for(var/obj/machinery/nuclearbomb/beer/beernuke in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/beer/beernuke in INSTANCES_OF(/obj/machinery/nuclearbomb)) beernuke.r_code = nuke_team.memorized_code else stack_trace("Syndicate nuke not found during nuke team creation.") @@ -99,14 +101,12 @@ else var/number = 1 number = nuke_team.members.Find(owner) - owner.current.real_name = "[nuke_team.syndicate_name] Operative #[number]" - - + owner.current.set_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]
    " - owner.add_memory(MEMORY_NUKECODE, list(DETAIL_NUKE_CODE = nuke_team.memorized_code, DETAIL_PROTAGONIST = owner.current), story_value = STORY_VALUE_AMAZING, memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOMOOD | MEMORY_FLAG_NOPERSISTENCE) + owner.add_memory(MEMORY_NUKECODE, list(DETAIL_NUKE_CODE = nuke_team.memorized_code, DETAIL_PROTAGONIST = owner.current), story_value = STORY_VALUE_AMAZING, memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE) to_chat(owner, "The nuclear authorization code is: [nuke_team.memorized_code]") else to_chat(owner, "Unfortunately the syndicate was unable to provide you with nuclear authorization code.") @@ -158,7 +158,7 @@ /datum/antagonist/nukeop/proc/admin_tell_code(mob/admin) var/code - for (var/obj/machinery/nuclearbomb/bombue in GLOB.machines) + for (var/obj/machinery/nuclearbomb/bombue as anything in INSTANCES_OF(/obj/machinery/nuclearbomb)) if (length(bombue.r_code) <= 5 && bombue.r_code != initial(bombue.r_code)) code = bombue.r_code break @@ -238,9 +238,9 @@ /datum/antagonist/nukeop/leader/give_alias() title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord") if(nuke_team?.syndicate_name) - owner.current.real_name = "[nuke_team.syndicate_name] [title]" + owner.current.set_real_name("[nuke_team.syndicate_name] [title]") else - owner.current.real_name = "Syndicate [title]" + owner.current.set_real_name("Syndicate [title]") /datum/antagonist/nukeop/leader/greet() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) @@ -304,7 +304,7 @@ /datum/antagonist/nukeop/lone/assign_nuke() if(nuke_team && !nuke_team.tracked_nuke) nuke_team.memorized_code = random_nukecode() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list + var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in INSTANCES_OF(/obj/machinery/nuclearbomb) if(nuke) nuke_team.tracked_nuke = nuke if(nuke.r_code == "ADMIN") diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index e33689b1a930..76fbd79cb496 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -43,9 +43,9 @@ 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) + W.implant(H, body_zone = BODY_ZONE_CHEST) var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) - E.implant(H) + E.implant(H, body_zone = BODY_ZONE_CHEST) H.faction |= ROLE_SYNDICATE H.update_icons() diff --git a/code/modules/antagonists/pirate/pirate.dm b/code/modules/antagonists/pirate/pirate.dm deleted file mode 100644 index 422fb8dc1152..000000000000 --- a/code/modules/antagonists/pirate/pirate.dm +++ /dev/null @@ -1,123 +0,0 @@ -/datum/antagonist/pirate - name = "\improper Space Pirate" - job_rank = ROLE_TRAITOR - roundend_category = "space pirates" - show_in_antagpanel = FALSE - show_to_ghosts = TRUE - suicide_cry = "FOR ME MATEYS!!" - hijack_speed = 2 // That is without doubt the worst pirate I have ever seen. - var/datum/team/pirate/crew - -/datum/antagonist/pirate/greet() - . = ..() - 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() - -/datum/antagonist/pirate/get_team() - return crew - -/datum/antagonist/pirate/create_team(datum/team/pirate/new_team) - if(!new_team) - for(var/datum/antagonist/pirate/P in GLOB.antagonists) - if(!P.owner) - stack_trace("Antagonist datum without owner in GLOB.antagonists: [P]") - continue - if(P.crew) - crew = P.crew - return - if(!new_team) - crew = new /datum/team/pirate - crew.forge_objectives() - return - if(!istype(new_team)) - stack_trace("Wrong team type passed to [type] initialization.") - crew = new_team - -/datum/antagonist/pirate/on_gain() - if(crew) - objectives |= crew.objectives - . = ..() - -/datum/antagonist/pirate/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/owner_mob = mob_override || owner.current - var/datum/language_holder/holder = owner_mob.get_language_holder() - holder.grant_language(/datum/language/piratespeak, TRUE, TRUE, LANGUAGE_PIRATE) - holder.selected_language = /datum/language/piratespeak - -/datum/antagonist/pirate/remove_innate_effects(mob/living/mob_override) - var/mob/living/owner_mob = mob_override || owner.current - owner_mob.remove_language(/datum/language/piratespeak, TRUE, TRUE, LANGUAGE_PIRATE) - return ..() - -/datum/team/pirate - name = "Pirate crew" - -/datum/team/pirate/proc/forge_objectives() - var/datum/objective/loot/getbooty = new() - getbooty.team = src - for(var/obj/machinery/computer/piratepad_control/P in GLOB.machines) - var/area/A = get_area(P) - if(istype(A,/area/shuttle/pirate)) - getbooty.cargo_hold = P - break - getbooty.update_explanation_text() - objectives += getbooty - for(var/datum/mind/M in members) - var/datum/antagonist/pirate/P = M.has_antag_datum(/datum/antagonist/pirate) - if(P) - P.objectives |= objectives - - -/datum/objective/loot - var/obj/machinery/computer/piratepad_control/cargo_hold - explanation_text = "Acquire valuable loot and store it in designated area." - var/target_value = 50000 - - -/datum/objective/loot/update_explanation_text() - if(cargo_hold) - var/area/storage_area = get_area(cargo_hold) - explanation_text = "Acquire loot and store [target_value] of credits worth in [storage_area.name] cargo hold." - -/datum/objective/loot/proc/loot_listing() - //Lists notable loot. - if(!cargo_hold || !cargo_hold.total_report) - return "Nothing" - cargo_hold.total_report.total_value = sortTim(cargo_hold.total_report.total_value, cmp = GLOBAL_PROC_REF(cmp_numeric_dsc), associative = TRUE) - var/count = 0 - var/list/loot_texts = list() - for(var/datum/export/E in cargo_hold.total_report.total_value) - if(++count > 5) - break - loot_texts += E.total_printout(cargo_hold.total_report,notes = FALSE) - return loot_texts.Join(", ") - -/datum/objective/loot/proc/get_loot_value() - return cargo_hold ? cargo_hold.points : 0 - -/datum/objective/loot/check_completion() - return ..() || get_loot_value() >= target_value - -/datum/team/pirate/roundend_report() - var/list/parts = list() - - parts += "Space Pirates were:" - - var/all_dead = TRUE - for(var/datum/mind/M in members) - if(considered_alive(M)) - all_dead = FALSE - parts += printplayerlist(members) - - parts += "Loot stolen: " - var/datum/objective/loot/L = locate() in objectives - parts += L.loot_listing() - parts += "Total loot value : [L.get_loot_value()]/[L.target_value] credits" - - if(L.check_completion() && !all_dead) - parts += "The pirate crew was successful!" - else - parts += "The pirate crew has failed." - - return "
    [parts.Join("
    ")]
    " diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 0d4d09a4e7c6..755fa7e5c8e0 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -50,7 +50,6 @@ pass_flags = PASSTABLE | PASSGRILLE | PASSMOB speed = 1 unique_name = TRUE - hud_possible = list(ANTAG_HUD) hud_type = /datum/hud/revenant var/essence = 75 //The resource, and health, of revenants. @@ -98,7 +97,7 @@ RegisterSignal(src, COMSIG_LIVING_BANED, PROC_REF(on_baned)) random_revenant_name() -/mob/living/simple_animal/revenant/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, no_hands = FALSE, floor_okay=FALSE) +/mob/living/simple_animal/revenant/canUseTopic(atom/movable/target, flags) return FALSE /mob/living/simple_animal/revenant/proc/random_revenant_name() @@ -172,7 +171,7 @@ /mob/living/simple_animal/revenant/med_hud_set_status() return //we use no hud -/mob/living/simple_animal/revenant/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/simple_animal/revenant/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(!message) return if(sanitize) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index c130212a47b5..7d5818ba8b74 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -75,8 +75,6 @@ to_chat(src, span_revenminor("You begin siphoning essence from [target]'s soul.")) if(target.stat != DEAD) to_chat(target, span_warning("You feel a horribly unpleasant draining sensation as your grip on life weakens...")) - if(target.stat == SOFT_CRIT) - target.Stun(46) reveal(46) stun(46) target.visible_message(span_warning("[target] suddenly rises slightly into the air, [target.p_their()] skin turning an ashy gray.")) diff --git a/code/modules/antagonists/revenant/revenant_blight.dm b/code/modules/antagonists/revenant/revenant_blight.dm index 2a4e70b8470c..ac5afb4735d4 100644 --- a/code/modules/antagonists/revenant/revenant_blight.dm +++ b/code/modules/antagonists/revenant/revenant_blight.dm @@ -19,7 +19,6 @@ if(affected_mob) affected_mob.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#1d2953") if(affected_mob.dna && affected_mob.dna.species) - affected_mob.dna.species.handle_mutant_bodyparts(affected_mob) affected_mob.set_haircolor(null, override = TRUE) to_chat(affected_mob, span_notice("You feel better.")) ..() @@ -63,7 +62,6 @@ affected_mob.stamina.adjust(-22.5 * delta_time) new /obj/effect/temp_visual/revenant(affected_mob.loc) if(affected_mob.dna && affected_mob.dna.species) - affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") affected_mob.set_haircolor("#1d2953", override = TRUE) affected_mob.visible_message(span_warning("[affected_mob] looks terrifyingly gaunt..."), span_revennotice("You suddenly feel like your skin is wrong...")) affected_mob.add_atom_colour("#1d2953", TEMPORARY_COLOUR_PRIORITY) diff --git a/code/modules/antagonists/revenant/revenant_spawn_event.dm b/code/modules/antagonists/revenant/revenant_spawn_event.dm deleted file mode 100644 index 5b548e478b2b..000000000000 --- a/code/modules/antagonists/revenant/revenant_spawn_event.dm +++ /dev/null @@ -1,60 +0,0 @@ -#define REVENANT_SPAWN_THRESHOLD 20 - -/datum/round_event_control/revenant - name = "Spawn Revenant" // Did you mean 'griefghost'? - typepath = /datum/round_event/ghost_role/revenant - weight = 7 - max_occurrences = 1 - min_players = 5 - dynamic_should_hijack = TRUE - - -/datum/round_event/ghost_role/revenant - var/ignore_mobcheck = FALSE - role_name = "revenant" - -/datum/round_event/ghost_role/revenant/New(my_processing = TRUE, new_ignore_mobcheck = FALSE) - ..() - ignore_mobcheck = new_ignore_mobcheck - -/datum/round_event/ghost_role/revenant/spawn_role() - if(!ignore_mobcheck) - var/deadMobs = 0 - for(var/mob/M in GLOB.dead_mob_list) - deadMobs++ - if(deadMobs < REVENANT_SPAWN_THRESHOLD) - message_admins("Event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.") - return WAITING_FOR_SOMETHING - - var/list/candidates = get_candidates(ROLE_REVENANT, ROLE_REVENANT) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/observer/selected = pick_n_take(candidates) - - var/list/spawn_locs = list() - - for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies - var/turf/T = get_turf(L) - if(T && is_station_level(T.z)) - spawn_locs += T - if(!spawn_locs.len || spawn_locs.len < 15) //look for any morgue trays, crematoriums, ect if there weren't alot of dead bodies on the station to pick from - for(var/obj/structure/bodycontainer/bc in GLOB.bodycontainers) - var/turf/T = get_turf(bc) - if(T && is_station_level(T.z)) - spawn_locs += T - if(!spawn_locs.len) //If we can't find any valid spawnpoints, try the carp spawns - for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - spawn_locs += L.loc - if(!spawn_locs.len) //If we can't find either, just spawn the revenant at the player's location - spawn_locs += get_turf(selected) - if(!spawn_locs.len) //If we can't find THAT, then just give up and cry - return MAP_ERROR - - var/mob/living/simple_animal/revenant/revvie = new(pick(spawn_locs)) - revvie.key = selected.key - message_admins("[ADMIN_LOOKUPFLW(revvie)] has been made into a revenant by an event.") - log_game("[key_name(revvie)] was spawned as a revenant by an event.") - spawned_mobs += revvie - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/revolution/enemy_of_the_revolution.dm b/code/modules/antagonists/revolution/enemy_of_the_revolution.dm index 4818d44c3247..af777d972386 100644 --- a/code/modules/antagonists/revolution/enemy_of_the_revolution.dm +++ b/code/modules/antagonists/revolution/enemy_of_the_revolution.dm @@ -6,7 +6,6 @@ /datum/antagonist/enemy_of_the_revolution name = "\improper Enemy of the Revolution" show_in_antagpanel = FALSE - suicide_cry = "FOR NANOTRASEN, NOW AND FOREVER!!" /datum/antagonist/enemy_of_the_revolution/proc/forge_objectives() var/datum/objective/survive/survive = new @@ -24,4 +23,3 @@ . = ..() to_chat(owner, span_userdanger("The station is lost.")) to_chat(owner, "As a surviving loyalist of the previous system, Your days are numbered.") - owner.announce_objectives() diff --git a/code/modules/antagonists/revolution/enemy_of_the_state.dm b/code/modules/antagonists/revolution/enemy_of_the_state.dm index e42e5d75b558..a3ebdf07b500 100644 --- a/code/modules/antagonists/revolution/enemy_of_the_state.dm +++ b/code/modules/antagonists/revolution/enemy_of_the_state.dm @@ -32,7 +32,6 @@ to_chat(owner, span_userdanger("The revolution is dead.")) to_chat(owner, span_boldannounce("You're an enemy of the state to Nanotrasen. You're a loose end to the Syndicate.")) to_chat(owner, "It's time to live out your days as an exile... or go out in one last big bang.") - owner.announce_objectives() /datum/antagonist/enemy_of_the_state/roundend_report() var/list/report = list() diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 31f3b235e4ad..64e104843dd7 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -4,38 +4,39 @@ #define HEAD_UPDATE_PERIOD 300 /datum/antagonist/rev - name = "\improper Revolutionary" - roundend_category = "revolutionaries" // if by some miracle revolutionaries without revolution happen + name = "\improper Mutineer" + roundend_category = "mutineers" // if by some miracle revolutionaries without revolution happen antagpanel_category = "Revolution" job_rank = ROLE_REV - antag_moodlet = /datum/mood_event/revolution antag_hud_name = "rev" - suicide_cry = "VIVA LA REVOLUTION!!" var/datum/team/revolution/rev_team ///when this antagonist is being de-antagged, this is why var/deconversion_reason - /// 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." + var/victory_message /datum/antagonist/rev/can_be_owned(datum/mind/new_owner) . = ..() if(.) - if(new_owner.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + if(new_owner.assigned_role.departments_bitflags & (DEPARTMENT_BITFLAG_MANAGEMENT|DEPARTMENT_BITFLAG_SECURITY)) return FALSE + if(new_owner.unconvertable) return FALSE + if(new_owner.current && HAS_TRAIT(new_owner.current, TRAIT_MINDSHIELD)) return FALSE /datum/antagonist/rev/apply_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current handle_clown_mutation(M, mob_override ? null : "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") - add_team_hud(M, /datum/antagonist/rev) + + M.AddComponent(/datum/component/codeword_hearing, GLOB.syndicate_code_phrase_regex, "blue", src) /datum/antagonist/rev/remove_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current handle_clown_mutation(M, removing = FALSE) + qdel(M.GetComponent(/datum/component/codeword_hearing)) /datum/antagonist/rev/on_mindshield(mob/implanter) remove_revolutionary(FALSE, implanter) @@ -54,10 +55,10 @@ remove_objectives() . = ..() -/datum/antagonist/rev/greet() +/datum/antagonist/rev/build_greeting() . = ..() - to_chat(owner, span_userdanger("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() + . += "Help your cause. Do not harm your fellow freedom fighters. You can identify them using memorized code words. Help them destroy the government to win the revolution!" + . += "Your companions have devised this list of words to identify eachother: [jointext(GLOB.revolution_code_phrase, ", ")]" /datum/antagonist/rev/create_team(datum/team/revolution/new_team) if(!new_team) @@ -109,7 +110,6 @@ /datum/antagonist/rev/head/admin_add(datum/mind/new_owner,mob/admin) give_flash = TRUE - give_hud = TRUE remove_clumsy = TRUE new_owner.add_antag_datum(src) message_admins("[key_name_admin(admin)] has head-rev'ed [key_name_admin(new_owner)].") @@ -135,14 +135,11 @@ /datum/antagonist/rev/head/proc/admin_give_flash(mob/admin) //This is probably overkill but making these impact state annoys me var/old_give_flash = give_flash - var/old_give_hud = give_hud var/old_remove_clumsy = remove_clumsy give_flash = TRUE - give_hud = FALSE remove_clumsy = FALSE equip_rev() give_flash = old_give_flash - give_hud = old_give_hud remove_clumsy = old_remove_clumsy /datum/antagonist/rev/head/proc/admin_repair_flash(mob/admin) @@ -160,7 +157,7 @@ demote() /datum/antagonist/rev/head - name = "\improper Head Revolutionary" + name = "\improper Head Mutineer" antag_hud_name = "rev_head" job_rank = ROLE_REV_HEAD @@ -168,19 +165,10 @@ var/remove_clumsy = FALSE var/give_flash = FALSE - var/give_hud = TRUE /datum/antagonist/rev/head/pre_mindshield(mob/implanter, mob/living/mob_override) return COMPONENT_MINDSHIELD_RESISTED -/datum/antagonist/rev/head/on_removal() - if(give_hud) - var/mob/living/carbon/C = owner.current - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = C.getorganslot(ORGAN_SLOT_HUD) - if(S) - S.Remove(C) - return ..() - /datum/antagonist/rev/head/antag_listing_name() return ..() + "(Leader)" @@ -306,6 +294,7 @@ . = ..() if(re_antag) old_owner.add_antag_datum(/datum/antagonist/enemy_of_the_state) //needs to be post ..() so old antag status is cleaned up + /datum/antagonist/rev/head/equip_rev() var/mob/living/carbon/C = owner.current if(!ishuman(C)) @@ -320,15 +309,10 @@ ) var/where = C.equip_in_one_of_slots(T, slots) if (!where) - to_chat(C, "The Syndicate were unfortunately unable to get you a flash.") + to_chat(C, "Your benefactors were unfortunately unable to get you a flash.") else to_chat(C, "The flash in your [where] will help you to persuade the crew to join your cause.") - if(give_hud) - var/obj/item/organ/cyberimp/eyes/hud/security/syndicate/S = new() - S.Insert(C) - to_chat(C, "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.") - /datum/team/revolution name = "Revolution" var/max_headrevs = 3 @@ -336,15 +320,17 @@ var/list/ex_revs = list() /datum/team/revolution/proc/update_objectives(initial = FALSE) - var/untracked_heads = SSjob.get_all_heads() + var/untracked_heads = SSjob.get_all_management() for(var/datum/objective/mutiny/O in objectives) untracked_heads -= O.target + for(var/datum/mind/M in untracked_heads) var/datum/objective/mutiny/new_target = new() new_target.team = src new_target.target = M new_target.update_explanation_text() objectives += new_target + for(var/datum/mind/M in members) var/datum/antagonist/rev/R = M.has_antag_datum(/datum/antagonist/rev) R.objectives |= objectives @@ -360,23 +346,26 @@ /datum/team/revolution/proc/update_heads() if(SSticker.HasRoundStarted()) var/list/datum/mind/head_revolutionaries = head_revolutionaries() - var/list/datum/mind/heads = SSjob.get_all_heads() + var/list/datum/mind/heads = SSjob.get_all_management() var/list/sec = SSjob.get_all_sec() if(head_revolutionaries.len < max_headrevs && head_revolutionaries.len < round(heads.len - ((8 - sec.len) / 3))) var/list/datum/mind/non_heads = members - head_revolutionaries var/list/datum/mind/promotable = list() var/list/datum/mind/nonhuman_promotable = list() + for(var/datum/mind/khrushchev in non_heads) - if(khrushchev.current && !khrushchev.current.incapacitated() && !HAS_TRAIT(khrushchev.current, TRAIT_RESTRAINED) && khrushchev.current.client) + if(khrushchev.current && !khrushchev.current.incapacitated() && !HAS_TRAIT(khrushchev.current, TRAIT_ARMS_RESTRAINED) && khrushchev.current.client) var/list/client_antags = khrushchev.current.client.prefs.read_preference(/datum/preference/blob/antagonists) if((client_antags[ROLE_REV_HEAD]) || (client_antags[ROLE_PROVOCATEUR])) if(ishuman(khrushchev.current)) promotable += khrushchev else nonhuman_promotable += khrushchev + if(!promotable.len && nonhuman_promotable.len) //if only nonhuman revolutionaries remain, promote one of them to the leadership. promotable = nonhuman_promotable + if(promotable.len) var/datum/mind/new_leader = pick(promotable) var/datum/antagonist/rev/rev = new_leader.has_antag_datum(/datum/antagonist/rev) @@ -395,8 +384,8 @@ return FALSE return TRUE -/// Checks if heads have won -/datum/team/revolution/proc/check_heads_victory() +/// Checks if the government has won +/datum/team/revolution/proc/check_management_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)) @@ -406,90 +395,11 @@ /// 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) +/datum/team/revolution/proc/check_completion() if (check_rev_victory()) - . = REVOLUTION_VICTORY - else if (check_heads_victory()) - . = STATION_VICTORY - else - return - - SSshuttle.clearHostileEnvironment(src) - save_members() - - var/charter_given = FALSE - - // 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) - if(!(rev_mind in ex_headrevs)) - LAZYADD(rev_mind.special_statuses, "Former revolutionary") - else - LAZYADD(rev_mind.special_statuses, "Former head revolutionary") - add_memory_in_range(rev_mind.current, 7, MEMORY_WON_REVOLUTION, list(DETAIL_PROTAGONIST = rev_mind.current, DETAIL_STATION_NAME = station_name()), story_value = STORY_VALUE_LEGENDARY, memory_flags = MEMORY_FLAG_NOSTATIONNAME|MEMORY_CHECK_BLIND_AND_DEAF, protagonist_memory_flags = MEMORY_FLAG_NOSTATIONNAME) - - if (. == STATION_VICTORY) - // If the revolution was quelled, make rev heads unable to be revived through pods - for (var/datum/mind/rev_head as anything in ex_headrevs) - if(!isnull(rev_head.current)) - ADD_TRAIT(rev_head.current, TRAIT_DEFIB_BLACKLISTED, REF(src)) - rev_head.current.med_hud_set_status() - - 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.", sound_type = ANNOUNCER_CENTCOM) - else - for(var/datum/mind/headrev_mind as anything in ex_headrevs) - if(charter_given) - break - if(!headrev_mind.current || headrev_mind.current.stat != CONSCIOUS) - continue - charter_given = TRUE - podspawn(list( - "target" = get_turf(headrev_mind.current), - "style" = STYLE_SYNDICATE, - "spawn" = /obj/item/station_charter/revolution, - )) - to_chat(headrev_mind.current, span_hear("You hear something crackle in your ears for a moment before a voice speaks. \ - \"Please stand by for a message from your benefactor. Message as follows, provocateur. \ - You have been chosen out of your fellow provocateurs to rename the station. Choose wisely. Message ends.\"")) - for (var/mob/living/player as anything in GLOB.player_list) - var/datum/mind/player_mind = player.mind - - if (isnull(player_mind)) - continue - - if (!(player_mind.assigned_role.departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_COMMAND))) - continue - - if (player_mind in ex_revs + ex_headrevs) - continue - - player_mind.add_antag_datum(/datum/antagonist/enemy_of_the_revolution) - - if (!istype(player)) - continue - - if(player_mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) - ADD_TRAIT(player, TRAIT_DEFIB_BLACKLISTED, REF(src)) - player.med_hud_set_status() - - for(var/datum/job/job as anything in SSjob.joinable_occupations) - if(!(job.departments_bitflags & (DEPARTMENT_BITFLAG_SECURITY|DEPARTMENT_BITFLAG_COMMAND))) - continue - job.allow_bureaucratic_error = FALSE - job.total_positions = 0 - - if (revs_win_injection_amount && IS_DYNAMIC_GAME_MODE) - var/datum/game_mode/dynamic/dynamic = SSticker.mode - dynamic.create_threat(revs_win_injection_amount, list(dynamic.threat_log, dynamic.roundend_threat_log), "[worldtime2text()]: Revolution victory") - - priority_announce("A recent assessment of your station has marked your station as a severe risk area for high ranking Daedalus 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"))]", "Daedalus Industries Transmission", sound_type = ANNOUNCER_CENTCOM) + return REVOLUTION_VICTORY + else if (check_management_victory()) + return STATION_VICTORY /// Mutates the ticker to report that the revs have won /datum/team/revolution/proc/round_result(finished) @@ -576,9 +486,9 @@ parts += antag_listing_footer() common_part = parts.Join() - var/heads_report = "Heads of Staff
    " + var/heads_report = "Management
    " heads_report += "" - for(var/datum/mind/N in SSjob.get_living_heads()) + for(var/datum/mind/N in SSjob.get_living_heads(TRUE)) var/mob/M = N.current if(M) heads_report += "" diff --git a/code/modules/antagonists/separatist/nation_creation.dm b/code/modules/antagonists/separatist/nation_creation.dm deleted file mode 100644 index 057937847392..000000000000 --- a/code/modules/antagonists/separatist/nation_creation.dm +++ /dev/null @@ -1,75 +0,0 @@ - -/** - * ### create_separatist_nation() - * - * Helper called to create the separatist antagonist via making a department independent from the station. - * - * * Arguments: - * * department: which department to revolt. if null, will pick a random non-independent department. starts as a type, then turns into the reference to the singleton. - * * announcement: whether to tell the station a department has gone independent. - * * dangerous: whether this nation will have objectives to attack other independent departments, requires more than one nation to exist obviously - * * message_admins: whether this will admin log how the nation creation went. Errors are still put in runtime log either way. - * - * Returns nothing. - */ -/proc/create_separatist_nation(datum/job_department/department, announcement = FALSE, dangerous = FALSE, message_admins = TRUE) - var/list/jobs_to_revolt = list() - var/list/citizens = list() - - //departments that are already independent, these will be disallowed to be randomly picked - var/list/independent_departments = list() - //reference to all independent nation teams - var/list/team_datums = list() - for(var/datum/antagonist/separatist/separatist_datum in GLOB.antagonists) - var/independent_department_type = separatist_datum.owner?.assigned_role.departments_list[1] - independent_departments |= independent_department_type - team_datums |= separatist_datum.nation - - if(!department) - //picks a random department if none was given - department = pick(list(/datum/job_department/assistant, /datum/job_department/medical, /datum/job_department/engineering, /datum/job_department/science, /datum/job_department/cargo, /datum/job_department/service, /datum/job_department/security) - independent_departments) - if(!department) - if(message_admins) - message_admins("Department Revolt could not create a nation, as all the departments are independent! You have created nations, you madman!") - CRASH("Department Revolt could not create a nation, as all the departments are independent") - department = SSjob.get_department_type(department) - - for(var/datum/job/job as anything in department.department_jobs) - if(job.departments_list.len > 1 && job.departments_list[1] != department.type) //their loyalty is in other departments - continue - jobs_to_revolt += job.title - - //setup team datum - var/datum/team/nation/nation = new(null, jobs_to_revolt, department) - nation.name = department.generate_nation_name() - var/datum/team/department_target //dodges picking from an empty list giving a runtime. - if(team_datums.len) - department_target = pick(team_datums) - nation.generate_nation_objectives(dangerous, department_target) - - //convert current members of the department - for(var/mob/living/carbon/human/possible_separatist as anything in GLOB.human_list) - if(!possible_separatist.mind) - continue - var/datum/mind/separatist_mind = possible_separatist.mind - if(!(separatist_mind.assigned_role.title in jobs_to_revolt)) - continue - citizens += possible_separatist - separatist_mind.add_antag_datum(/datum/antagonist/separatist, nation, department) - nation.add_member(separatist_mind) - possible_separatist.log_message("was made into a separatist, long live [nation.name]!", LOG_ATTACK, color="red") - - //if we didn't convert anyone we just kill the team datum, otherwise cleanup and make official - if(!citizens.len) - qdel(nation) - if(message_admins) - message_admins("The nation of [nation.name] did not have enough potential members to be created.") - return - var/jobs_english_list = english_list(jobs_to_revolt) - if(message_admins) - message_admins("The nation of [nation.name] has been formed. Affected jobs are [jobs_english_list]. Any new crewmembers with these jobs will join the secession.") - if(announcement) - var/announce_text = "The new independent state of [nation.name] has formed from the ashes of the [department.department_name] department!" - if(istype(department, /datum/job_department/assistant)) //the text didn't really work otherwise - announce_text = "The assistants of the station have risen to form the new independent state of [nation.name]!" - priority_announce(announce_text, sub_title = "Secession from [GLOB.station_name]", do_not_modify = TRUE) diff --git a/code/modules/antagonists/separatist/objectives.dm b/code/modules/antagonists/separatist/objectives.dm deleted file mode 100644 index 250eed1b1882..000000000000 --- a/code/modules/antagonists/separatist/objectives.dm +++ /dev/null @@ -1,53 +0,0 @@ -/datum/objective/destroy_nation - name = "nation destruction" - explanation_text = "Make sure no member of the enemy nation escapes alive!" - team_explanation_text = "Make sure no member of the enemy nation escapes alive!" - var/datum/team/nation/target_team - -/datum/objective/destroy_nation/New(text, target_department) - . = ..() - target_team = target_department - update_explanation_text() - -/datum/objective/destroy_nation/Destroy() - target_team = null - . = ..() - - -/datum/objective/destroy_nation/update_explanation_text() - . = ..() - if(target_team) - explanation_text = "Make sure no member of [target_team] ([target_team.department.department_name]) nation escapes alive!" - else - explanation_text = "Free Objective" - -/datum/objective/destroy_nation/check_completion() - if(!target_team) - return TRUE - - for(var/datum/antagonist/separatist/separatist_datum in GLOB.antagonists) - if(separatist_datum.nation.department != target_team.department) //a separatist, but not one part of the department we need to destroy - continue - var/datum/mind/target = separatist_datum.owner - if(target && considered_alive(target) && (target.current.onCentCom() || target.current.onSyndieBase())) - return FALSE //at least one member got away - return TRUE - -/datum/objective/separatist_fluff - -/datum/objective/separatist_fluff/New(text, nation_name) - explanation_text = pick(list( - "The rest of the station must be taxed for their use of [nation_name]'s services.", - "Make statues everywhere of your glorious leader of [nation_name]. If you have nobody, crown one amongst yourselves!", - "[nation_name] must be absolutely blinged out.", - "Damage as much of the station as you can, keep it in disrepair. [nation_name] must be the untouched paragon!", - "Heavily reinforce [nation_name] against the dangers of the outside world.", - "Make sure [nation_name] is fully off the grid, not requiring power or any other services from other departments!", - "Use a misaligned teleporter to make you and your fellow citizens of [nation_name] flypeople. Bring toxin medication!", - "Save the station when it needs you most. [nation_name] will be remembered as the protectors.", - "Arm up. The citizens of [nation_name] have a right to bear arms.", - )) - ..() - -/datum/objective/separatist_fluff/check_completion() - return TRUE diff --git a/code/modules/antagonists/separatist/separatist.dm b/code/modules/antagonists/separatist/separatist.dm deleted file mode 100644 index 747ac290e3c6..000000000000 --- a/code/modules/antagonists/separatist/separatist.dm +++ /dev/null @@ -1,125 +0,0 @@ -/datum/team/nation - name = "Nation" - member_name = "separatist" - ///a list of ranks that can join this nation. - var/list/potential_recruits - ///department said team is related to - var/datum/job_department/department - ///whether to forge objectives attacking other nations - var/dangerous_nation = TRUE - -/datum/team/nation/New(starting_members, potential_recruits, department) - . = ..() - RegisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED, PROC_REF(new_possible_separatist)) - src.potential_recruits = potential_recruits - src.department = department - -/datum/team/nation/Destroy(force, ...) - department = null - UnregisterSignal(SSdcs, COMSIG_GLOB_CREWMEMBER_JOINED) - . = ..() - -/** - * Signal for adding new crewmembers (players joining the game) to the revolution. - * - * Arguments: - * source: global signal, so this is SSdcs. - * crewmember: new onboarding crewmember. - * rank: new crewmember's rank. - */ -/datum/team/nation/proc/new_possible_separatist(datum/source, mob/living/crewmember, rank) - SIGNAL_HANDLER - - if(rank in potential_recruits) - //surely we can trust the player who just joined the game to have a mind. - crewmember.mind.add_antag_datum(/datum/antagonist/separatist,src) - -/** - * Called by department revolt event to give the team some objectives. - * - * Arguments: - * dangerous_nation: whether this nation will get objectives that are very very bloodthirsty, like killing other departments. - * target_nation: string of the nation they need to destroy/befriend - */ -/datum/team/nation/proc/generate_nation_objectives(are_we_hostile = TRUE, datum/team/nation/target_nation) - dangerous_nation = are_we_hostile - if(dangerous_nation && target_nation) - var/datum/objective/destroy = new /datum/objective/destroy_nation(null, target_nation) - destroy.team = src - objectives += destroy - target_nation.war_declared(src) //they need to possibly get an objective back - var/datum/objective/fluff = new /datum/objective/separatist_fluff(null, name) - fluff.team = src - objectives += fluff - update_all_member_objectives() - -/datum/team/nation/proc/war_declared(datum/team/nation/attacking_nation) - if(!dangerous_nation) //peaceful nations do not wish to strike back - return - //otherwise, lets add an objective to strike them back - var/datum/objective/destroy = new /datum/objective/destroy_nation(null, attacking_nation) - destroy.team = src - objectives += destroy - update_all_member_objectives(span_danger("The nation of [attacking_nation] has declared the intent to conquer [src]! You have new objectives.")) - -/datum/team/nation/proc/update_all_member_objectives(message) - for(var/datum/mind/member in members) - var/datum/antagonist/separatist/needs_objectives = member.has_antag_datum(/datum/antagonist/separatist) - needs_objectives.objectives |= objectives - if(message) - to_chat(member.current, message) - needs_objectives.owner.announce_objectives() - -/datum/antagonist/separatist - name = "\improper Separatists" - show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE - suicide_cry = "FOR THE MOTHERLAND!!" - ui_name = "AntagInfoSeparatist" - ///team datum - var/datum/team/nation/nation - ///background color of the ui - var/ui_color - -/datum/antagonist/separatist/on_gain() - create_objectives() - setup_ui_color() - . = ..() - -//give ais their role as UN -/datum/antagonist/separatist/apply_innate_effects(mob/living/mob_override) - . = ..() - if(isAI(mob_override)) - var/mob/living/silicon/ai/united_nations_ai = mob_override - united_nations_ai.laws = new /datum/ai_laws/united_nations - united_nations_ai.laws.associate(united_nations_ai) - -/datum/antagonist/separatist/on_removal() - remove_objectives() - . = ..() - -/datum/antagonist/separatist/proc/create_objectives() - objectives |= nation.objectives - -/datum/antagonist/separatist/proc/remove_objectives() - objectives -= nation.objectives - -/datum/antagonist/separatist/proc/setup_ui_color() - var/list/hsl = rgb2num(nation.department.latejoin_color, COLORSPACE_HSL) - hsl[3] = 25 //setting lightness very low - ui_color = rgb(hsl[1], hsl[2], hsl[3], space = COLORSPACE_HSL) - -/datum/antagonist/separatist/create_team(datum/team/nation/new_team) - if(!new_team) - return - nation = new_team - -/datum/antagonist/separatist/get_team() - return nation - -/datum/antagonist/separatist/ui_static_data(mob/user) - var/list/data = list() - data["objectives"] = get_objectives() - data["nation"] = nation.name - data["nationColor"] = ui_color - return data diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm index 15f13f152767..fe66c221f01d 100644 --- a/code/modules/antagonists/slaughter/slaughter.dm +++ b/code/modules/antagonists/slaughter/slaughter.dm @@ -144,7 +144,7 @@ icon_state = "demon_heart-on" decay_factor = 0 -/obj/item/organ/heart/demon/ComponentInitialize() +/obj/item/organ/heart/demon/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) diff --git a/code/modules/antagonists/slaughter/slaughter_antag.dm b/code/modules/antagonists/slaughter/slaughter_antag.dm index b158d430487a..45a5b7588ff9 100644 --- a/code/modules/antagonists/slaughter/slaughter_antag.dm +++ b/code/modules/antagonists/slaughter/slaughter_antag.dm @@ -15,7 +15,6 @@ /datum/antagonist/slaughter/greet() . = ..() - owner.announce_objectives() to_chat(owner, span_warning("You have a powerful alt-attack that slams people backwards that you can activate by right-clicking your target!")) /datum/antagonist/slaughter/proc/forge_objectives() diff --git a/code/modules/antagonists/slaughter/slaughterevent.dm b/code/modules/antagonists/slaughter/slaughterevent.dm deleted file mode 100644 index b2463f6b6429..000000000000 --- a/code/modules/antagonists/slaughter/slaughterevent.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/round_event_control/slaughter - name = "Spawn Slaughter Demon" - typepath = /datum/round_event/ghost_role/slaughter - weight = 1 //Very rare - max_occurrences = 1 - earliest_start = 1 HOURS - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/ghost_role/slaughter - minimum_required = 1 - role_name = "slaughter demon" - -/datum/round_event/ghost_role/slaughter/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, ROLE_ALIEN) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) - if(isturf(L.loc)) - spawn_locs += L.loc - - if(!spawn_locs) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/turf/chosen = pick(spawn_locs) - var/mob/living/simple_animal/hostile/imp/slaughter/S = new(chosen) - new /obj/effect/dummy/phased_mob(chosen, S) - - player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/slaughter_demon)) - player_mind.special_role = ROLE_SLAUGHTER_DEMON - player_mind.add_antag_datum(/datum/antagonist/slaughter) - to_chat(S, span_bold("You are currently not currently in the same plane of existence as the station. \ - Use your Blood Crawl ability near a pool of blood to manifest and wreak havoc.")) - SEND_SOUND(S, 'sound/magic/demon_dies.ogg') - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a slaughter demon by an event.") - log_game("[key_name(S)] was spawned as a slaughter demon by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/antagonists/space_ninja/space_ninja.dm b/code/modules/antagonists/space_ninja/space_ninja.dm index 367214ef1f49..d83807f48958 100644 --- a/code/modules/antagonists/space_ninja/space_ninja.dm +++ b/code/modules/antagonists/space_ninja/space_ninja.dm @@ -6,7 +6,6 @@ hijack_speed = 1 show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE - antag_moodlet = /datum/mood_event/focused suicide_cry = "FOR THE SPIDER CLAN!!" preview_outfit = /datum/outfit/ninja ///Whether or not this ninja will obtain objectives @@ -76,7 +75,7 @@ //Explosive plant, the bomb will register its completion on priming var/datum/objective/plant_explosive/bombobjective = new /datum/objective/plant_explosive() for(var/sanity in 1 to 100) // 100 checks at most. - var/area/selected_area = pick(GLOB.sortedAreas) + var/area/selected_area = pick(GLOB.areas) if(!is_station_level(selected_area.z) || !(selected_area.area_flags & VALID_TERRITORY)) continue bombobjective.detonation_location = selected_area @@ -103,7 +102,6 @@ SEND_SOUND(owner.current, sound('sound/effects/ninja_greeting.ogg')) to_chat(owner.current, "I am an elite mercenary of the mighty Spider Clan!") 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)!") - owner.announce_objectives() /datum/antagonist/ninja/on_gain() if(give_objectives) diff --git a/code/modules/antagonists/survivalist/survivalist.dm b/code/modules/antagonists/survivalist/survivalist.dm index 66ffe4eaf0a0..c92ec9968e4f 100644 --- a/code/modules/antagonists/survivalist/survivalist.dm +++ b/code/modules/antagonists/survivalist/survivalist.dm @@ -18,7 +18,6 @@ /datum/antagonist/survivalist/greet() . = ..() to_chat(owner, "[greet_message]") - owner.announce_objectives() /datum/antagonist/survivalist/guns greet_message = "Your own safety matters above all else, and the only way to ensure your safety is to stockpile weapons! Grab as many guns as possible, by any means necessary. Kill anyone who gets in your way." diff --git a/code/modules/antagonists/thief/thief.dm b/code/modules/antagonists/thief/thief.dm deleted file mode 100644 index efa7c43ba8e9..000000000000 --- a/code/modules/antagonists/thief/thief.dm +++ /dev/null @@ -1,176 +0,0 @@ -///very low level antagonist that has objectives to steal items and live, but is not allowed to kill. -/datum/antagonist/thief - name = "\improper Thief" - job_rank = ROLE_THIEF - roundend_category = "thieves" - antagpanel_category = "Thief" - show_in_antagpanel = TRUE - suicide_cry = "FOR THE LION'S SHARE!!" - preview_outfit = /datum/outfit/thief - antag_hud_name = "thief" - ui_name = "AntagInfoThief" - ///assoc list of strings set up for the flavor of the thief. - var/list/thief_flavor - ///if added by an admin, they can choose a thief flavor - var/admin_choice_flavor - ///if a special trait needs to be added from the flavor, here it is - var/special_trait - ///an area marked as the hideout- makes thieves happier to be in, and all thieves of the round know of it. only has a 20% chance of existing in a round. - var/static/area/hideout - ///bool checked for the first thief in a round to decide if there should be one this round - var/static/decided_on_hideout = FALSE - -/datum/antagonist/thief/on_gain() - if(!decided_on_hideout) - decided_on_hideout = TRUE - if(prob(20)) - create_hideout() - flavor_and_objectives() - . = ..() //ui opens here, objectives must exist beforehand - -/datum/antagonist/thief/apply_innate_effects(mob/living/mob_override) - . = ..() - var/mob/living/thief = mob_override || owner.current - ADD_TRAIT(thief, TRAIT_VAL_CORRIN_MEMBER, THIEF_TRAIT) - if(special_trait) - ADD_TRAIT(thief, special_trait, THIEF_TRAIT) - -/datum/antagonist/thief/remove_innate_effects(mob/living/mob_override) - var/mob/living/thief = mob_override || owner.current - REMOVE_TRAIT(thief, TRAIT_VAL_CORRIN_MEMBER, THIEF_TRAIT) - if(special_trait) - REMOVE_TRAIT(thief, special_trait, THIEF_TRAIT) - return ..() - -/datum/antagonist/thief/admin_add(datum/mind/new_owner, mob/admin) - load_strings_file(THIEF_FLAVOR_FILE) - var/list/all_thief_flavors = GLOB.string_cache[THIEF_FLAVOR_FILE] - var/list/all_thief_names = list("Random") - for(var/flavorname as anything in all_thief_flavors) - all_thief_names += flavorname - var/choice = tgui_input_list(admin, "Pick a thief flavor?", "Rogue's Guild", all_thief_names) - if(choice && choice != "Random") - admin_choice_flavor = choice - . = ..() - -/datum/antagonist/thief/proc/create_hideout() - var/list/possible_hideout_locations = list( - /area/station/maintenance/space_hut/cabin, - /area/station/maintenance/space_hut/observatory, - /area/station/service/kitchen/abandoned, - /area/station/service/electronic_marketing_den, - /area/station/service/abandoned_gambling_den, - /area/station/service/abandoned_gambling_den/gaming, - /area/station/service/theater/abandoned, - /area/station/service/library/abandoned, - /area/station/service/hydroponics/garden/abandoned, - /area/station/medical/abandoned, - /area/station/science/research/abandoned, - /area/station/maintenance/department/crew_quarters/bar, - ) - //remove every hideout location that isn't on this map - possible_hideout_locations = special_list_filter(possible_hideout_locations, CALLBACK(src, PROC_REF(filter_nonexistent_areas))) - //for custom maps without any abandoned locations - if(!possible_hideout_locations.len) - return - var/chosen_type = pick(possible_hideout_locations) - hideout = GLOB.areas_by_type[chosen_type] - hideout.mood_trait = TRAIT_VAL_CORRIN_MEMBER - hideout.mood_bonus = 5 - hideout.mood_message = "Feels good, having Val Corrin connections." - -///checks if an area exists in the global areas, obviously comes up null (falsey) if say, abandoned cabin is checked on metastation. -/datum/antagonist/thief/proc/filter_nonexistent_areas(area_type) - return GLOB.areas_by_type[area_type] - -/datum/antagonist/thief/proc/flavor_and_objectives() - //this list has a maximum pickweight of 100. - //if you're adding a new type of thief, DON'T just add TOTAL pickweight. adjusting the others, numb nuts. - var/static/list/weighted_flavors = list( - "Thief" = 50, - "Black Market Outfitter" = 13, - "Organ Market Collector" = 13, - "All Access Fan" = 10, - "Chronicler" = 7, - "Deranged" = 7, - "Hoarder" = 0, //disabled until we have more reasonable nonreplenishable items to hoard- still admin selectable though - ) - var/chosen_flavor = admin_choice_flavor || pick_weight(weighted_flavors) - //objective given by flavor - var/chosen_objective - //whether objective should call find_target() - var/objective_needs_target - //If you add to this switch case, please follow the order of the weighted static list - switch(chosen_flavor) - if("Thief") - chosen_objective = /datum/objective/steal - objective_needs_target = TRUE - if("Black Market Outfitter") - chosen_objective = /datum/objective/steal_n_of_type/summon_guns/thief - objective_needs_target = FALSE - if("Organ Market Collector") - chosen_objective = /datum/objective/steal_n_of_type/organs - objective_needs_target = FALSE - if("All Access Fan") - chosen_objective = /datum/objective/all_access - objective_needs_target = TRUE - special_trait = TRAIT_ID_APPRAISER - if("Chronicler") - chosen_objective = /datum/objective/chronicle - objective_needs_target = FALSE - if("Deranged") - chosen_objective = /datum/objective/hoarder/bodies - objective_needs_target = TRUE - if("Hoarder") - chosen_objective = /datum/objective/hoarder - objective_needs_target = TRUE - thief_flavor = strings(THIEF_FLAVOR_FILE, chosen_flavor) - - //whatever main objective this type of thief needs to accomplish - var/datum/objective/flavor_objective = new chosen_objective - flavor_objective.owner = owner - if(objective_needs_target) - flavor_objective.find_target(dupe_search_range = list(src)) - flavor_objective.update_explanation_text() - objectives += flavor_objective - - //all thieves need to escape with their loot (except hoarders, but you know.) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - -/datum/antagonist/thief/ui_static_data(mob/user) - var/list/data = list() - data["objectives"] = get_objectives() - data["goal"] = thief_flavor["goal"] - data["intro"] = thief_flavor["introduction"] - data["policy"] = get_policy(ROLE_THIEF) - data["hideout"] = hideout ? hideout.name : "" - return data - -/datum/outfit/thief - name = "Thief (Preview only)" - uniform = /obj/item/clothing/under/color/black - glasses = /obj/item/clothing/glasses/night - gloves = /obj/item/clothing/gloves/color/latex - back = /obj/item/storage/backpack/duffelbag/syndie - mask = /obj/item/clothing/mask/bandana/red - -/datum/outfit/thief/post_equip(mob/living/carbon/human/thief, visualsOnly=FALSE) - // This outfit is used by the assets SS, which is ran before the atoms SS - if(SSatoms.initialized == INITIALIZATION_INSSATOMS) - thief.w_uniform?.update_greyscale() - thief.update_worn_undersuit() - thief.physique = FEMALE //update_body() and gender block or something - thief.hair_color = "#2A71DC" //hair color dna block - thief.skin_tone = "caucasian2" //skin tone dna block - thief.hairstyle = "Bun Head 2" //update_body_parts() - thief.dna.update_ui_block(DNA_GENDER_BLOCK) - thief.dna.update_ui_block(DNA_HAIR_COLOR_BLOCK) - thief.dna.update_ui_block(DNA_SKIN_TONE_BLOCK) - thief.update_body(is_creating = TRUE) - - // This outfit is used by the assets SS, which is ran before the atoms SS - if (SSatoms.initialized == INITIALIZATION_INSSATOMS) - thief.wear_mask?.update_greyscale() - thief.update_worn_mask() diff --git a/code/modules/antagonists/thief/thief_objectives.dm b/code/modules/antagonists/thief/thief_objectives.dm deleted file mode 100644 index 1894109d0d86..000000000000 --- a/code/modules/antagonists/thief/thief_objectives.dm +++ /dev/null @@ -1,142 +0,0 @@ - -GLOBAL_LIST_INIT(hoarder_targets, list( - /obj/item/clothing/gloves/color/yellow, - /obj/item/mod/control, - /obj/item/melee/baton/security, -)) - -/datum/objective/hoarder - name = "hoarding" - explanation_text = "Hoard as many items as you can in one area!" - ///what item we want to get many of - var/atom/movable/target_type - ///how many we want for greentext - var/amount = 7 - ///and where do we want it roundend (this is a type, not a ref) - var/turf/hoarder_turf - -/datum/objective/hoarder/find_target(dupe_search_range, blacklist) - amount = rand(amount - 2, amount + 2) - target_type = pick(GLOB.hoarder_targets) - add_action() - -/datum/objective/hoarder/proc/add_action() - var/list/owners = get_owners() - var/datum/mind/hoardpicker = owners[1] - var/datum/action/declare_hoard/declare = new /datum/action/declare_hoard(hoardpicker.current) - declare.weak_objective = WEAKREF(src) - declare.Grant(hoardpicker.current) - -/datum/objective/hoarder/update_explanation_text() - var/obj/item/target_item = target_type - explanation_text = "Hoard as many [initial(target_item.name)]\s as you can in maintenance (after declaring a spot)! At least [amount] will do." - -/datum/objective/hoarder/check_completion() - . = ..() - if(.) - return TRUE - var/stolen_amount = 0 - if(!hoarder_turf) - return FALSE //they never set up their hoard spot, so they couldn't have done their objective - for(var/atom/movable/in_target_turf in hoarder_turf.get_all_contents()) - if(istype(in_target_turf, target_type)) - if(!valid_target(in_target_turf)) - continue - stolen_amount++ - return stolen_amount >= amount - -/datum/objective/hoarder/proc/valid_target(atom/movable/target) - return TRUE - -///for the deranged flavor -/datum/objective/hoarder/bodies - name = "corpse hoarding" - explanation_text = "Hoard as many dead bodies as you can in one area!" - amount = 5 //little less, bodies are hard when you can't kill like antags - -/datum/objective/hoarder/bodies/find_target(dupe_search_range, blacklist) - amount = rand(amount - 2, amount + 2) - target_type = /mob/living/carbon/human - add_action() - -/datum/objective/hoarder/bodies/valid_target(mob/living/carbon/human/target) - if(target.stat != DEAD) - return FALSE - return TRUE - -/datum/objective/hoarder/bodies/update_explanation_text() - explanation_text = "Hoard as many dead bodies as you can in maintenance (after declaring a spot)! At least [amount] will do." - -/datum/action/declare_hoard - name = "Declare Hoard" - desc = "Declare a new hoarding spot on the ground you're standing on. Items on this floor will count for your objective." - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "hoard" - ///weak reference to the objective this action targets, set by hoarder objective - var/datum/weakref/weak_objective - -/datum/action/declare_hoard/Trigger(trigger_flags) - if(owner.incapacitated()) - owner.balloon_alert(owner, "not while incapacitated!") - return - var/area/owner_area = get_area(owner) - if(!istype(owner_area, /area/station/maintenance)) - owner.balloon_alert(owner, "hoard must be in maintenance!") - return - var/datum/objective/hoarder/objective = weak_objective.resolve() - if(objective) - owner.balloon_alert(owner, "hoard position set") - objective.hoarder_turf = get_turf(owner) - var/image/hoarder_marker = image('icons/mob/telegraphing/telegraph.dmi', objective.hoarder_turf, "hoarder_circle", layer = ABOVE_OPEN_TURF_LAYER) - owner.client.images |= hoarder_marker - qdel(src) - -///exactly what it sounds like, steal someone's heirloom. -/datum/objective/chronicle - name = "chronicle" - explanation_text = "Steal any family heirloom, for chronicling of course." - -/datum/objective/chronicle/check_completion() - . = ..() - if(.) - return TRUE - var/list/owners = get_owners() - for(var/datum/mind/owner in owners) - if(!isliving(owner.current)) - continue - var/list/all_items = owner.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/possible_heirloom in all_items) - var/datum/component/heirloom/found = possible_heirloom.GetComponent(/datum/component/heirloom) - if(found && !(found.owner in owners)) - return TRUE - return FALSE - -///steal a shit ton of unique ids, escape with them. The part that makes this not "hold a box of blank ids" is the fact they need a registered bank account -/datum/objective/all_access - name = "all access" - explanation_text = "Steal ID cards from other registered crewmembers!" - ///how many we want for greentext - var/amount = 8 - -/datum/objective/all_access/find_target(dupe_search_range, blacklist) - amount = rand(amount - 2, amount + 2) - -/datum/objective/all_access/check_completion() - . = ..() - if(.) - return TRUE - var/stolen_amount = 0 - var/list/owners = get_owners() - for(var/datum/mind/owner in owners) - if(!isliving(owner.current)) - continue - var/list/all_items = owner.current.get_all_contents() //this should get things in cheesewheels, books, etc. - for(var/obj/item/card/id/possible_id in all_items) - //checks if it was the first id card they got, aka the one from joining the round. should prevent "i stole a box of empty ids tee hee :3" - if(!HAS_TRAIT(possible_id, TRAIT_JOB_FIRST_ID_CARD)) - continue - stolen_amount++ - return stolen_amount >= amount - -/datum/objective/all_access/update_explanation_text() - explanation_text = "Steal at least [amount] unique ID cards from other registered crewmembers. It's not enough to swipe replacement ID cards that were created and assigned while on the station, you need to swipe IDs that other crewmembers were initially issued!" diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index 1fe6ac8daba7..d9e9c24f65b6 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -3,14 +3,13 @@ roundend_category = "traitors" antagpanel_category = "Traitor" job_rank = ROLE_TRAITOR - antag_moodlet = /datum/mood_event/focused antag_hud_name = "traitor" hijack_speed = 0.5 //10 seconds per hijack stage by default ui_name = "AntagInfoTraitor" suicide_cry = "FOR THE SYNDICATE!!" preview_outfit = /datum/outfit/traitor var/give_objectives = TRUE - var/should_give_codewords = TRUE + var/should_give_codewords = FALSE ///give this traitor an uplink? var/give_uplink = TRUE ///if TRUE, this traitor will always get hijacking as their final objective @@ -28,11 +27,6 @@ /// The uplink handler that this traitor belongs to. var/datum/uplink_handler/uplink_handler - // PARIAH EDIT START - ///the final objective the traitor has to accomplish, be it escaping, hijacking, or just martyrdom. - var/datum/objective/ending_objective - // PARIAH EDIT END - var/uplink_sale_count = 3 /datum/antagonist/traitor/New(give_objectives = TRUE) @@ -52,6 +46,9 @@ uplink.uplink_handler = uplink_handler else uplink_handler = uplink.uplink_handler + if(isturf(uplink_handler)) + stack_trace("what") + uplink_handler.has_progression = FALSE //PARIAH EDIT SStraitor.register_uplink_handler(uplink_handler) @@ -74,7 +71,6 @@ if(give_objectives) forge_traitor_objectives() - forge_ending_objective() //PARIAH EDIT pick_employer() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/tatoralert.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) @@ -139,92 +135,9 @@ return ..() /datum/antagonist/traitor/proc/pick_employer(faction) - var/list/possible_employers = list() - possible_employers.Add(GLOB.syndicate_employers, GLOB.nanotrasen_employers) - - if(istype(ending_objective, /datum/objective/hijack)) - possible_employers -= GLOB.normal_employers - else //escape or martyrdom - possible_employers -= GLOB.hijack_employers - - switch(faction) - if(FACTION_SYNDICATE) - possible_employers -= GLOB.nanotrasen_employers - if(FACTION_NANOTRASEN) - possible_employers -= GLOB.syndicate_employers - employer = pick(possible_employers) + employer = pick(GLOB.normal_employers) traitor_flavor = strings(TRAITOR_FLAVOR_FILE, employer) -//PARIAH EDIT REMOVAL -/* -/datum/objective/traitor_progression - name = "traitor progression" - explanation_text = "Become a living legend by getting a total of %REPUTATION% reputation points" - - var/possible_range = list(40 MINUTES, 90 MINUTES) - var/required_total_progression_points - -/datum/objective/traitor_progression/New(text) - . = ..() - required_total_progression_points = round(rand(possible_range[1], possible_range[2]) / 60) - explanation_text = replacetext(explanation_text, "%REPUTATION%", required_total_progression_points) - -/datum/objective/traitor_progression/check_completion() - if(!owner) - return FALSE - var/datum/antagonist/traitor/traitor = owner.has_antag_datum(/datum/antagonist/traitor) - if(!traitor) - return FALSE - if(!traitor.uplink_handler) - return FALSE - if(traitor.uplink_handler.progression_points < required_total_progression_points) - return FALSE - return TRUE - -/datum/objective/traitor_objectives - name = "traitor objective" - explanation_text = "Complete objectives colletively worth more than %REPUTATION% reputation points" - - var/possible_range = list(20 MINUTES, 30 MINUTES) - var/required_progression_in_objectives - -/datum/objective/traitor_objectives/New(text) - . = ..() - required_progression_in_objectives = round(rand(possible_range[1], possible_range[2]) / 60) - explanation_text = replacetext(explanation_text, "%REPUTATION%", required_progression_in_objectives) - -/datum/objective/traitor_objectives/check_completion() - if(!owner) - return FALSE - var/datum/antagonist/traitor/traitor = owner.has_antag_datum(/datum/antagonist/traitor) - if(!traitor) - return FALSE - if(!traitor.uplink_handler) - return FALSE - var/total_points = 0 - for(var/datum/traitor_objective/objective as anything in traitor.uplink_handler.completed_objectives) - if(objective.objective_state != OBJECTIVE_STATE_COMPLETED) - continue - total_points += objective.progression_reward - if(total_points < required_progression_in_objectives) - return FALSE - return TRUE - -/// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as martyr and hijack. -/datum/antagonist/traitor/proc/forge_traitor_objectives() - objectives.Cut() - - var/datum/objective/traitor_progression/final_objective = new /datum/objective/traitor_progression() - final_objective.owner = owner - objectives += final_objective - - var/datum/objective/traitor_objectives/objective_completion = new /datum/objective/traitor_objectives() - objective_completion.owner = owner - objectives += objective_completion - - */ - //PARIAH EDIT END - /datum/antagonist/traitor/apply_innate_effects(mob/living/mob_override) . = ..() var/mob/living/datum_owner = mob_override || owner.current diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 57bb3829a940..1f3a79f70cec 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -333,7 +333,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) to_chat(L, span_userdanger("The blast wave from [src] tears you atom from atom!")) L.dust() to_chat(world, "The AI cleansed the station of life with the doomsday device!") - SSticker.force_ending = 1 + SSticker.end_round() /// Hostile Station Lockdown: Locks, bolts, and electrifies every airlock on the station. After 90 seconds, the doors reset. /datum/ai_module/destructive/lockdown @@ -353,13 +353,13 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/lockdown/Activate() - for(var/obj/machinery/door/D in GLOB.airlocks) + for(var/obj/machinery/door/D in INSTANCES_OF(/obj/machinery/door)) if(!is_station_level(D.z)) continue INVOKE_ASYNC(D, TYPE_PROC_REF(/obj/machinery/door, hostile_lockdown), owner) addtimer(CALLBACK(D, TYPE_PROC_REF(/obj/machinery/door, disable_lockdown)), 900) - var/obj/machinery/computer/communications/C = locate() in GLOB.machines + var/obj/machinery/computer/communications/C = locate() in INSTANCES_OF(/obj/machinery/computer/communications) if(C) C.post_status("alert", "lockdown") @@ -439,7 +439,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) cooldown_period = 100 /datum/action/innate/ai/destroy_rcds/Activate() - for(var/I in GLOB.rcd_list) + for(var/I in INSTANCES_OF(TRACKING_KEY_RCD)) if(!istype(I, /obj/item/construction/rcd/borg)) //Ensures that cyborg RCDs are spared. var/obj/item/construction/rcd/RCD = I RCD.detonate_pulse() @@ -523,7 +523,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) desc = "[desc] It has [uses] use\s remaining." /datum/action/innate/ai/blackout/Activate() - for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) + for(var/obj/machinery/power/apc/apc as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(prob(30 * apc.overload)) apc.overload_lighting() else @@ -553,7 +553,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) /datum/action/innate/ai/honk/Activate() to_chat(owner, span_clown("The intercom system plays your prepared file as commanded.")) - for(var/obj/item/radio/intercom/found_intercom in GLOB.intercoms_list) + for(var/obj/item/radio/intercom/found_intercom as anything in INSTANCES_OF(/obj/item/radio/intercom)) if(!found_intercom.is_on() || !found_intercom.get_listening() || found_intercom.wires.is_cut(WIRE_RX)) //Only operating intercoms play the honk continue found_intercom.audible_message(message = "[found_intercom] crackles for a split second.", hearing_distance = 3) @@ -658,7 +658,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/break_air_alarms/Activate() - for(var/obj/machinery/airalarm/AA in GLOB.machines) + for(var/obj/machinery/airalarm/AA as anything in INSTANCES_OF(/obj/machinery/airalarm)) if(!is_station_level(AA.z)) continue AA.obj_flags |= EMAGGED @@ -682,14 +682,16 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/break_fire_alarms/Activate() - for(var/obj/machinery/firealarm/bellman in GLOB.machines) + for(var/obj/machinery/firealarm/bellman as anything in INSTANCES_OF(/obj/machinery/firealarm)) if(!is_station_level(bellman.z)) continue bellman.obj_flags |= EMAGGED bellman.update_appearance() - for(var/obj/machinery/door/firedoor/firelock in GLOB.machines) + + for(var/obj/machinery/door/firedoor/firelock in INSTANCES_OF(/obj/machinery/door)) if(!is_station_level(firelock.z)) continue + firelock.emag_act(owner_AI, src) to_chat(owner, span_notice("All thermal sensors on the station have been disabled. Fire alerts will no longer be recognized.")) owner.playsound_local(owner, 'sound/machines/terminal_off.ogg', 50, 0) @@ -711,7 +713,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) uses = 1 /datum/action/innate/ai/emergency_lights/Activate() - for(var/obj/machinery/light/L in GLOB.machines) + for(var/obj/machinery/light/L as anything in INSTANCES_OF(/obj/machinery/light)) if(is_station_level(L.z)) L.no_emergency = TRUE INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light, update), FALSE) @@ -805,7 +807,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) unlock_sound = 'sound/items/rped.ogg' /datum/ai_module/upgrade/upgrade_turrets/upgrade(mob/living/silicon/ai/AI) - for(var/obj/machinery/porta_turret/ai/turret in GLOB.machines) + for(var/obj/machinery/porta_turret/ai/turret as anything in INSTANCES_OF(/obj/machinery/porta_turret/ai)) turret.repair_damage(30) turret.lethal_projectile = /obj/projectile/beam/laser/heavylaser //Once you see it, you will know what it means to FEAR. turret.lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg' diff --git a/code/modules/antagonists/traitor/objective_category.dm b/code/modules/antagonists/traitor/objective_category.dm index e64086ad9228..9a79b9a6e36d 100644 --- a/code/modules/antagonists/traitor/objective_category.dm +++ b/code/modules/antagonists/traitor/objective_category.dm @@ -13,7 +13,7 @@ qdel(category) /datum/traitor_category_handler/proc/objective_valid(datum/traitor_objective/objective_path, progression_points) - if(initial(objective_path.abstract_type) == objective_path) + if(isabstract(objective_path)) return FALSE if(progression_points < initial(objective_path.progression_minimum)) return FALSE diff --git a/code/modules/antagonists/traitor/objectives/assassination.dm b/code/modules/antagonists/traitor/objectives/assassination.dm index f69afcd78491..d1d9b7b34af0 100644 --- a/code/modules/antagonists/traitor/objectives/assassination.dm +++ b/code/modules/antagonists/traitor/objectives/assassination.dm @@ -132,10 +132,10 @@ if(!.) //didn't generate return FALSE AddComponent(/datum/component/traitor_objective_register, behead_goal, fail_signals = COMSIG_PARENT_QDELETING) - RegisterSignal(kill_target, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_target_dismembered)) + RegisterSignal(kill_target, COMSIG_CARBON_REMOVED_LIMB, PROC_REF(on_target_dismembered)) /datum/traitor_objective/assassinate/behead/ungenerate_objective() - UnregisterSignal(kill_target, COMSIG_CARBON_REMOVE_LIMB) + UnregisterSignal(kill_target, COMSIG_CARBON_REMOVED_LIMB) . = ..() //this unsets kill_target if(behead_goal) UnregisterSignal(behead_goal, COMSIG_ITEM_PICKUP) @@ -193,14 +193,17 @@ continue //removes heads of staff from being targets from non heads of staff assassinations, and vice versa if(heads_of_staff) - if(!(possible_target.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)) + if(!(possible_target.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER)) continue else - if((possible_target.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND)) + if((possible_target.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER)) continue + possible_targets += possible_target + for(var/datum/traitor_objective/assassinate/objective as anything in possible_duplicates) possible_targets -= objective.kill_target + if(try_target_late_joiners) var/list/all_possible_targets = possible_targets.Copy() for(var/datum/mind/possible_target as anything in all_possible_targets) diff --git a/code/modules/antagonists/traitor/objectives/bug_room.dm b/code/modules/antagonists/traitor/objectives/bug_room.dm index 8533e82bef15..00bc2edc4caf 100644 --- a/code/modules/antagonists/traitor/objectives/bug_room.dm +++ b/code/modules/antagonists/traitor/objectives/bug_room.dm @@ -20,8 +20,7 @@ progression_maximum = 30 MINUTES var/list/applicable_heads = list( - JOB_RESEARCH_DIRECTOR = /area/station/command/heads_quarters/rd, - JOB_CHIEF_MEDICAL_OFFICER = /area/station/command/heads_quarters/cmo, + JOB_MEDICAL_DIRECTOR = /area/station/command/heads_quarters/cmo, JOB_CHIEF_ENGINEER = /area/station/command/heads_quarters/ce, JOB_HEAD_OF_PERSONNEL = /area/station/command/heads_quarters/hop, JOB_CAPTAIN = /area/station/command/heads_quarters/captain, // For head roles so that they can still get this objective. @@ -45,7 +44,7 @@ progression_minimum = 20 MINUTES progression_maximum = 60 MINUTES applicable_heads = list( - JOB_HEAD_OF_SECURITY = /area/station/command/heads_quarters/hos, + JOB_SECURITY_MARSHAL = /area/station/command/heads_quarters/hos, ) progression_reward = list(10 MINUTES, 15 MINUTES) telecrystal_reward = list(2, 3) @@ -146,8 +145,7 @@ if(!do_after(user, deploy_time, src)) return var/obj/structure/traitor_bug/new_bug = new(location) - transfer_fingerprints_to(new_bug) - transfer_fibers_to(new_bug) + transfer_evidence_to(new_bug) SEND_SIGNAL(src, COMSIG_TRAITOR_BUG_PLANTED_GROUND, location) qdel(src) diff --git a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm b/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm deleted file mode 100644 index 1e3c2586da1b..000000000000 --- a/code/modules/antagonists/traitor/objectives/destroy_heirloom.dm +++ /dev/null @@ -1,128 +0,0 @@ -/datum/traitor_objective_category/destroy_heirloom - name = "Destroy Heirloom" - objectives = list( - list( - // There's about 16 jobs in common, so assistant has a 1/21 chance of getting chosen. - /datum/traitor_objective/destroy_heirloom/common = 20, - /datum/traitor_objective/destroy_heirloom/less_common = 1, - ) = 4, - /datum/traitor_objective/destroy_heirloom/uncommon = 3, - /datum/traitor_objective/destroy_heirloom/rare = 2, - /datum/traitor_objective/destroy_heirloom/captain = 1 - ) - -/datum/traitor_objective/destroy_heirloom - name = "Destroy %ITEM%, the family heirloom that belongs to %TARGET% the %JOB TITLE%" - description = "%TARGET% has been on our shitlist for a while and we want to show him we mean business. Find his %ITEM% and destroy it, you'll be rewarded handsomely for doing this" - - abstract_type = /datum/traitor_objective/destroy_heirloom - - //this is a prototype so this progression is for all basic level kill objectives - progression_reward = list(8 MINUTES, 12 MINUTES) - telecrystal_reward = list(1, 2) - - /// The jobs that this objective is targetting. - var/list/target_jobs - /// the item we need to destroy - var/obj/item/target_item - -/datum/traitor_objective/destroy_heirloom/common - /// 30 minutes in, syndicate won't care about common heirlooms anymore - progression_maximum = 30 MINUTES - target_jobs = list( - // Medical - /datum/job/doctor, - /datum/job/virologist, - /datum/job/paramedic, - /datum/job/psychologist, - /datum/job/chemist, - // Service - /datum/job/clown, - /datum/job/botanist, - /datum/job/janitor, - /datum/job/mime, - /datum/job/lawyer, - // Cargo - /datum/job/cargo_technician, - // Science - /datum/job/geneticist, - /datum/job/scientist, - /datum/job/roboticist, - // Engineering - /datum/job/station_engineer, - /datum/job/atmospheric_technician, - ) - -/// This is only for assistants, because the syndies are a lot less likely to give a shit about what an assistant does, so they're a lot less likely to appear -/datum/traitor_objective/destroy_heirloom/less_common - /// 30 minutes in, syndicate won't care about common heirlooms anymore - progression_maximum = 30 MINUTES - target_jobs = list( - /datum/job/assistant - ) - -/datum/traitor_objective/destroy_heirloom/uncommon - /// 45 minutes in, syndicate won't care about uncommon heirlooms anymore - progression_maximum = 45 MINUTES - target_jobs = list( - // Cargo - /datum/job/quartermaster, - /datum/job/shaft_miner, - // Service - /datum/job/chaplain, - /datum/job/bartender, - /datum/job/cook, - /datum/job/curator, - ) - -/datum/traitor_objective/destroy_heirloom/rare - progression_minimum = 15 MINUTES - /// 60 minutes in, syndicate won't care about rare heirlooms anymore - progression_maximum = 60 MINUTES - target_jobs = list( - // Security - /datum/job/security_officer, - /datum/job/warden, - /datum/job/detective, - // Heads of staff - /datum/job/head_of_personnel, - /datum/job/chief_medical_officer, - /datum/job/research_director, - ) - -/datum/traitor_objective/destroy_heirloom/captain - progression_minimum = 30 MINUTES - target_jobs = list( - /datum/job/head_of_security, - /datum/job/captain - ) - -/datum/traitor_objective/destroy_heirloom/generate_objective(datum/mind/generating_for, list/possible_duplicates) - var/list/possible_targets = list() - for(var/datum/mind/possible_target as anything in get_crewmember_minds()) - if(possible_target == generating_for) - continue - if(!ishuman(possible_target.current)) - continue - var/datum/quirk/item_quirk/family_heirloom/quirk = locate() in possible_target.current.quirks - if(!quirk || !quirk.heirloom.resolve()) - return - if(!(possible_target.assigned_role.type in target_jobs)) - continue - possible_targets += possible_target - for(var/datum/traitor_objective/destroy_heirloom/objective as anything in possible_duplicates) - possible_targets -= objective.target_item - if(!length(possible_targets)) - return FALSE - var/datum/mind/target_mind = pick(possible_targets) - AddComponent(/datum/component/traitor_objective_register, target_mind.current, fail_signals = COMSIG_PARENT_QDELETING) - var/datum/quirk/item_quirk/family_heirloom/quirk = locate() in target_mind.current.quirks - target_item = quirk.heirloom.resolve() - AddComponent(/datum/component/traitor_objective_register, target_item, succeed_signals = COMSIG_PARENT_QDELETING) - replace_in_name("%TARGET%", target_mind.name) - replace_in_name("%JOB TITLE%", target_mind.assigned_role.title) - replace_in_name("%ITEM%", target_item.name) - return TRUE - -/datum/traitor_objective/destroy_heirloom/ungenerate_objective() - target_item = null diff --git a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm b/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm deleted file mode 100644 index 93179a8ed9a7..000000000000 --- a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm +++ /dev/null @@ -1,62 +0,0 @@ -/// The minimum number of ghosts and observers needed before handing out battlecruiser objectives. -#define MIN_GHOSTS_FOR_BATTLECRUISER 8 - -/datum/traitor_objective/final/battlecruiser - name = "Reveal Station Coordinates to nearby Syndicate Battlecruiser" - description = "Use a special upload card on a communications console to send the coordinates \ - of the station to a nearby Battlecruiser. You may want to make your syndicate status known to \ - the battlecruiser crew when they arrive - their goal will be to destroy the station." - - /// Checks whether we have sent the card to the traitor yet. - var/sent_accesscard = FALSE - /// Battlecruiser team that we get assigned to - var/datum/team/battlecruiser/team - -/datum/traitor_objective/final/battlecruiser/generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(!can_take_final_objective()) - return FALSE - // There's no empty space to load a battlecruiser in... - if(!SSmapping.empty_space) - return FALSE - // Check how many observers + ghosts (dead players) we have. - // If there's not a ton of observers and ghosts to populate the battlecruiser, - // We won't bother giving the objective out. - var/num_ghosts = length(GLOB.current_observers_list) + length(GLOB.dead_player_list) - if(num_ghosts < MIN_GHOSTS_FOR_BATTLECRUISER) - return FALSE - - return TRUE - -/datum/traitor_objective/final/battlecruiser/on_objective_taken(mob/user) - . = ..() - team = new() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list - if(nuke.r_code == "ADMIN") - nuke.r_code = random_nukecode() - team.nuke = nuke - team.update_objectives() - handler.owner.add_antag_datum(/datum/antagonist/battlecruiser/ally, team) - - -/datum/traitor_objective/final/battlecruiser/generate_ui_buttons(mob/user) - var/list/buttons = list() - if(!sent_accesscard) - buttons += add_ui_button("", "Pressing this will materialize an upload card, which you can use on a communication console to contact the fleet.", "phone", "card") - return buttons - -/datum/traitor_objective/final/battlecruiser/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if("card") - if(sent_accesscard) - return - sent_accesscard = TRUE - var/obj/item/card/emag/battlecruiser/emag_card = new() - emag_card.team = team - podspawn(list( - "target" = get_turf(user), - "style" = STYLE_SYNDICATE, - "spawn" = emag_card, - )) - -#undef MIN_GHOSTS_FOR_BATTLECRUISER diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm deleted file mode 100644 index d8bd7ebefc92..000000000000 --- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/traitor_objective_category/final_objective - name = "Final Objective" - objectives = list( - /datum/traitor_objective/final/romerol = 1, - /datum/traitor_objective/final/battlecruiser = 1, - /datum/traitor_objective/final/space_dragon = 1, - ) - weight = 100 - -/datum/traitor_objective/final - abstract_type = /datum/traitor_objective/final - progression_minimum = 140 MINUTES - - var/progression_points_in_objectives = 20 MINUTES - -/// Determines if this final objective can be taken. Should be put into every final objective's generate function. -/datum/traitor_objective/final/proc/can_take_final_objective() - if(handler.get_completion_progression(/datum/traitor_objective) < progression_points_in_objectives) - return FALSE - if(SStraitor.get_taken_count(type) > 0) // Prevents multiple people from ever getting the same final objective. - return FALSE - return TRUE - -/datum/traitor_objective/final/on_objective_taken(mob/user) - . = ..() - handler.maximum_potential_objectives = 0 - for(var/datum/traitor_objective/objective as anything in handler.potential_objectives) - objective.fail_objective() - user.playsound_local(get_turf(user), 'sound/traitor/final_objective.ogg', vol = 100, vary = FALSE, channel = CHANNEL_TRAITOR) - -/datum/traitor_objective/final/is_duplicate(datum/traitor_objective/objective_to_compare) - return TRUE - -/datum/traitor_objective/final/uplink_ui_data(mob/user) - . = ..() - .["final_objective"] = TRUE diff --git a/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm b/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm deleted file mode 100644 index 68e3b2969b64..000000000000 --- a/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm +++ /dev/null @@ -1,46 +0,0 @@ -/datum/traitor_objective/final/romerol - name = "Spread the experimental bioterror agent Romerol by calling a droppod down at %AREA%" - description = "Go to %AREA%, and recieve the bioterror agent. Spread it to the crew, \ - and watch then raise from the dead as mindless killing machines. Warning: The undead will attack you too." - - //this is a prototype so this progression is for all basic level kill objectives - - ///area type the objective owner must be in to recieve the romerol - var/area/romerol_spawnarea_type - ///checker on whether we have sent the romerol yet. - var/sent_romerol = FALSE - -/datum/traitor_objective/final/romerol/generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(!can_take_final_objective()) - return - var/list/possible_areas = GLOB.the_station_areas.Copy() - for(var/area/possible_area as anything in possible_areas) - //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair - if(istype(possible_area, /area/station/hallway) || istype(possible_area, /area/station/security)) - possible_areas -= possible_area - romerol_spawnarea_type = pick(possible_areas) - replace_in_name("%AREA%", initial(romerol_spawnarea_type.name)) - return TRUE - -/datum/traitor_objective/final/romerol/generate_ui_buttons(mob/user) - var/list/buttons = list() - if(!sent_romerol) - buttons += add_ui_button("", "Pressing this will call down a pod with the biohazard kit.", "biohazard", "romerol") - return buttons - -/datum/traitor_objective/final/romerol/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if("romerol") - if(sent_romerol) - return - var/area/delivery_area = get_area(user) - if(delivery_area.type != romerol_spawnarea_type) - to_chat(user, span_warning("You must be in [initial(romerol_spawnarea_type.name)] to recieve the bioterror agent.")) - return - sent_romerol = TRUE - podspawn(list( - "target" = get_turf(user), - "style" = STYLE_SYNDICATE, - "spawn" = /obj/item/storage/box/syndie_kit/romerol, - )) diff --git a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm b/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm deleted file mode 100644 index 507f4393561b..000000000000 --- a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/traitor_objective/final/space_dragon - name = "Find a Space Carp and mutate their DNA with your own using a DNA harvester we will drop pod at %AREA%" - description = "Go to %AREA%, and recieve the Carp DNA scanner. Use it on any Space Carp to harvest its DNA. \ - From there, use it on yourself, to mutate your own DNA with it and become a Space Dragon. \ - Don't worry about finding one, I'm sure there'll have a wave of carp right when you need it." - - ///Area type the objective owner must be in to recieve the DNA extractor. - var/area/dna_scanner_spawnarea_type - ///Whether the DNA extraction kit was sent already. - var/recieved_dna_scanner = FALSE - -/datum/traitor_objective/final/space_dragon/on_objective_taken(mob/user) - . = ..() - var/datum/round_event/carp_migration/carp_event = locate(/datum/round_event_control/carp_migration) in SSevents.control - carp_event.start() - -/datum/traitor_objective/final/space_dragon/generate_objective(datum/mind/generating_for, list/possible_duplicates) - if(!can_take_final_objective()) - return - var/list/possible_areas = GLOB.the_station_areas.Copy() - for(var/area/possible_area as anything in possible_areas) - //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair - if(istype(possible_area, /area/station/hallway) || istype(possible_area, /area/station/security)) - possible_areas -= possible_area - dna_scanner_spawnarea_type = pick(possible_areas) - replace_in_name("%AREA%", initial(dna_scanner_spawnarea_type.name)) - return TRUE - -/datum/traitor_objective/final/space_dragon/generate_ui_buttons(mob/user) - var/list/buttons = list() - if(!recieved_dna_scanner) - buttons += add_ui_button("", "Pressing this will call down a pod with the DNA extraction kit.", "biohazard", "carp_dna") - return buttons - -/datum/traitor_objective/final/space_dragon/ui_perform_action(mob/living/user, action) - . = ..() - switch(action) - if("carp_dna") - if(recieved_dna_scanner) - return - var/area/delivery_area = get_area(user) - if(delivery_area.type != dna_scanner_spawnarea_type) - to_chat(user, span_warning("You must be in [initial(dna_scanner_spawnarea_type.name)] to recieve the DNA extraction kit.")) - return - recieved_dna_scanner = TRUE - podspawn(list( - "target" = get_turf(user), - "style" = STYLE_SYNDICATE, - "spawn" = /obj/item/storage/box/syndie_kit/space_dragon, - )) diff --git a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm index c5bf31d52d65..d805c2245cdc 100644 --- a/code/modules/antagonists/traitor/objectives/hack_comm_console.dm +++ b/code/modules/antagonists/traitor/objectives/hack_comm_console.dm @@ -20,7 +20,7 @@ if(handler.get_completion_progression(/datum/traitor_objective) < progression_objectives_minimum) return FALSE AddComponent(/datum/component/traitor_objective_mind_tracker, generating_for, \ - signals = list(COMSIG_HUMAN_EARLY_UNARMED_ATTACK = PROC_REF(on_unarmed_attack))) + signals = list(COMSIG_LIVING_EARLY_UNARMED_ATTACK = PROC_REF(on_unarmed_attack))) RegisterSignal(generating_for, COMSIG_GLOB_TRAITOR_OBJECTIVE_COMPLETED, PROC_REF(on_global_obj_completed)) return TRUE @@ -37,6 +37,7 @@ return if(!istype(target)) return + INVOKE_ASYNC(src, PROC_REF(begin_hack), user, target) return COMPONENT_CANCEL_ATTACK_CHAIN diff --git a/code/modules/antagonists/traitor/objectives/kill_pet.dm b/code/modules/antagonists/traitor/objectives/kill_pet.dm index 9ad19c016305..01aa69dbf161 100644 --- a/code/modules/antagonists/traitor/objectives/kill_pet.dm +++ b/code/modules/antagonists/traitor/objectives/kill_pet.dm @@ -22,7 +22,7 @@ /mob/living/simple_animal/pet/dog/corgi/puppy/ian ), JOB_CAPTAIN = /mob/living/simple_animal/pet/fox/renault, - JOB_CHIEF_MEDICAL_OFFICER = /mob/living/simple_animal/pet/cat/runtime, + JOB_MEDICAL_DIRECTOR = /mob/living/simple_animal/pet/cat/runtime, JOB_CHIEF_ENGINEER = /mob/living/simple_animal/parrot/poly, ) /// The head that we are targetting @@ -44,7 +44,7 @@ limited_to_department_head = FALSE possible_heads = list( - JOB_HEAD_OF_SECURITY = list( + JOB_SECURITY_MARSHAL = list( /mob/living/simple_animal/hostile/carp/lia, /mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus ), diff --git a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm b/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm deleted file mode 100644 index 9d33015c05c0..000000000000 --- a/code/modules/antagonists/traitor/objectives/sleeper_protocol.dm +++ /dev/null @@ -1,114 +0,0 @@ -/datum/traitor_objective_category/sleeper_protocol - name = "Sleeper Protocol" - objectives = list( - /datum/traitor_objective/sleeper_protocol = 1, - ) - - -/datum/traitor_objective/sleeper_protocol - name = "Perform the sleeper protocol on a crewmember" - description = "Use the button below to materialize a surgery disk in your hand, where you'll then be able to perform the sleeper protocol on a crewmember. If the disk gets destroyed, the objective will fail. This will only work on living and sentient crewmembers." - - progression_reward = list(8 MINUTES, 15 MINUTES) - telecrystal_reward = 0 - - var/list/limited_to = list( - JOB_CHIEF_MEDICAL_OFFICER, - JOB_MEDICAL_DOCTOR, - JOB_PARAMEDIC, - JOB_VIROLOGIST, - ) - - var/obj/item/disk/surgery/sleeper_protocol/disk - - var/mob/living/current_registered_mob - -/datum/traitor_objective/sleeper_protocol/generate_ui_buttons(mob/user) - var/list/buttons = list() - if(!disk) - buttons += add_ui_button("", "Clicking this will materialize the sleeper protocol surgery in your hand", "save", "summon_disk") - return buttons - -/datum/traitor_objective/sleeper_protocol/ui_perform_action(mob/living/user, action) - switch(action) - if("summon_disk") - if(disk) - return - disk = new(user.drop_location()) - user.put_in_hands(disk) - AddComponent(/datum/component/traitor_objective_register, disk, \ - fail_signals = COMSIG_PARENT_QDELETING) - -/datum/traitor_objective/sleeper_protocol/proc/on_surgery_success(datum/source, datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - SIGNAL_HANDLER - if(istype(step, /datum/surgery_step/brainwash/sleeper_agent)) - succeed_objective() - -/datum/traitor_objective/sleeper_protocol/generate_objective(datum/mind/generating_for, list/possible_duplicates) - var/datum/job/job = generating_for.assigned_role - if(!(job.title in limited_to)) - return FALSE - AddComponent(/datum/component/traitor_objective_mind_tracker, generating_for, \ - signals = list(COMSIG_MOB_SURGERY_STEP_SUCCESS = PROC_REF(on_surgery_success))) - return TRUE - -/datum/traitor_objective/sleeper_protocol/ungenerate_objective() - disk = null - -/datum/traitor_objective/sleeper_protocol/is_duplicate() - return TRUE - -/obj/item/disk/surgery/sleeper_protocol - name = "Suspicious Surgery Disk" - desc = "The disk provides instructions on how to turn someone into a sleeper agent for the Syndicate" - surgeries = list(/datum/surgery/advanced/brainwashing_sleeper) - -/datum/surgery/advanced/brainwashing_sleeper - name = "Sleeper Agent Surgery" - desc = "A surgical procedure which implants the sleeper protocol into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/brainwash/sleeper_agent, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_HEAD) - -/datum/surgery/advanced/brainwashing_sleeper/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/brainwash/sleeper_agent - time = 25 SECONDS - var/list/possible_objectives = list( - "You love the Syndicate", - "Do not trust Daedalus Industries", - "The Captain is a unathi", - "Daedalus Industries isn't real", - "They put things in the food to make you forget", - "You are the only real person on the station" - ) - -/datum/surgery_step/brainwash/sleeper_agent/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - objective = pick(possible_objectives) - display_results(user, target, span_notice("You begin to brainwash [target]..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/brainwash/sleeper_agent/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(target.stat == DEAD) - to_chat(user, span_warning("They need to be alive to perform this surgery!")) - return FALSE - . = ..() - if(!.) - return - target.gain_trauma(new /datum/brain_trauma/mild/phobia/conspiracies(), TRAUMA_RESILIENCE_LOBOTOMY) diff --git a/code/modules/antagonists/traitor/objectives/steal.dm b/code/modules/antagonists/traitor/objectives/steal.dm index 447c900d9d6c..025ddb4f93ec 100644 --- a/code/modules/antagonists/traitor/objectives/steal.dm +++ b/code/modules/antagonists/traitor/objectives/steal.dm @@ -103,7 +103,6 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) possible_items = list( /datum/objective_item/steal/magboots, /datum/objective_item/steal/hypo, - /datum/objective_item/steal/reactive, /datum/objective_item/steal/handtele, /datum/objective_item/steal/blueprints, ) @@ -116,7 +115,6 @@ GLOBAL_DATUM_INIT(steal_item_handler, /datum/objective_item_handler, new()) possible_items = list( /datum/objective_item/steal/reflector, /datum/objective_item/steal/capmedal, - /datum/objective_item/steal/hdd_extraction, /datum/objective_item/steal/documents, ) diff --git a/code/modules/antagonists/traitor/traitor_objective.dm b/code/modules/antagonists/traitor/traitor_objective.dm index 6c4eb50100f6..48b80028b0ca 100644 --- a/code/modules/antagonists/traitor/traitor_objective.dm +++ b/code/modules/antagonists/traitor/traitor_objective.dm @@ -2,6 +2,7 @@ /// If a traitor objective needs to be removed from the failed/completed objective list of their handler, then you are doing something wrong /// and you should reconsider. When an objective is failed/completed, that is final and the only way you can change that is by refactoring the code. /datum/traitor_objective + abstract_type = /datum/traitor_objective /// The name of the traitor objective var/name = "traitor objective" /// The description of the traitor objective @@ -42,8 +43,6 @@ var/progression_cost_coeff = 0 /// The percentage that this objective has been increased or decreased by as a result of progression. Used by the UI var/original_progression = 0 - /// Abstract type that won't be included as a possible objective - var/abstract_type = /datum/traitor_objective /// Returns a list of variables that can be changed by config, allows for balance through configuration. /// It is not recommended to finetweak any values of objectives on your server. diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index 4ba76a80563f..324382648e9d 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -52,18 +52,28 @@ SEND_SIGNAL(src, COMSIG_UPLINK_HANDLER_ON_UPDATE) return +/// Checks if traitor has enough reputation to purchase an item +/datum/uplink_handler/proc/not_enough_reputation(datum/uplink_item/to_purchase) + return has_progression && progression_points < to_purchase.progression_minimum + +/// Checks for uplink flags as well as items restricted to roles and species +/datum/uplink_handler/proc/check_if_restricted(datum/uplink_item/to_purchase) + if((to_purchase in extra_purchasable)) + return TRUE + if(!(to_purchase.purchasable_from & uplink_flag)) + return FALSE + if(length(to_purchase.restricted_roles) && !(assigned_role in to_purchase.restricted_roles)) + return FALSE + if(length(to_purchase.restricted_species) && !(assigned_species in to_purchase.restricted_species)) + return FALSE + return TRUE + /datum/uplink_handler/proc/can_purchase_item(mob/user, datum/uplink_item/to_purchase) if(debug_mode) return TRUE - if(!(to_purchase in extra_purchasable)) - if(!(to_purchase.purchasable_from & uplink_flag)) - return FALSE - - if(length(to_purchase.restricted_roles) && !(assigned_role in to_purchase.restricted_roles)) - return FALSE - if(length(to_purchase.restricted_species) && !(assigned_species in to_purchase.restricted_species)) - return FALSE + if(!check_if_restricted(to_purchase)) + return FALSE var/current_stock = item_stock[to_purchase] var/stock = current_stock != null? current_stock : INFINITY @@ -185,8 +195,6 @@ objective.update_progression_reward() /datum/uplink_handler/proc/abort_objective(datum/traitor_objective/to_abort) - if(istype(to_abort, /datum/traitor_objective/final)) - return if(to_abort.objective_state != OBJECTIVE_STATE_ACTIVE) return to_abort.fail_objective(penalty_cost = to_abort.telecrystal_penalty) diff --git a/code/modules/antagonists/valentines/heartbreaker.dm b/code/modules/antagonists/valentines/heartbreaker.dm deleted file mode 100644 index 11d8b17c069b..000000000000 --- a/code/modules/antagonists/valentines/heartbreaker.dm +++ /dev/null @@ -1,20 +0,0 @@ -/datum/antagonist/heartbreaker - name = "\improper Heartbreaker" - roundend_category = "valentines" - show_in_antagpanel = FALSE - show_name_in_check_antagonists = TRUE - suicide_cry = "FOR LONELINESS!!" - -/datum/antagonist/heartbreaker/proc/forge_objectives() - var/datum/objective/martyr/normiesgetout = new - normiesgetout.owner = owner - objectives += normiesgetout - -/datum/antagonist/heartbreaker/on_gain() - forge_objectives() - . = ..() - -/datum/antagonist/heartbreaker/greet() - . = ..() - to_chat(owner, span_warning("You didn't get a date! They're all having fun without you! You'll show them though...")) - owner.announce_objectives() diff --git a/code/modules/antagonists/valentines/valentine.dm b/code/modules/antagonists/valentines/valentine.dm deleted file mode 100644 index b760b618fe3c..000000000000 --- a/code/modules/antagonists/valentines/valentine.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/antagonist/valentine - name = "\improper Valentine" - roundend_category = "valentines" //there's going to be a ton of them so put them in separate category - show_in_antagpanel = FALSE - prevent_roundtype_conversion = FALSE - suicide_cry = "FOR MY LOVE!!" - var/datum/mind/date - soft_antag = TRUE - -/datum/antagonist/valentine/proc/forge_objectives() - var/datum/objective/protect/protect_objective = new /datum/objective/protect - protect_objective.owner = owner - protect_objective.target = date - if(!ishuman(date.current)) - protect_objective.human_check = FALSE - protect_objective.explanation_text = "Protect [date.name], your date." - objectives += protect_objective - -/datum/antagonist/valentine/on_gain() - forge_objectives() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.apply_status_effect(/datum/status_effect/in_love, date.current) - . = ..() - -/datum/antagonist/valentine/on_removal() - if(isliving(owner.current)) - var/mob/living/L = owner.current - L.remove_status_effect(/datum/status_effect/in_love) - . = ..() - -/datum/antagonist/valentine/greet() - to_chat(owner, span_warning("You're on a date with [date.name]! Protect [date.p_them()] at all costs. This takes priority over all other loyalties.")) - -//Squashed up a bit -/datum/antagonist/valentine/roundend_report() - var/objectives_complete = TRUE - if(objectives.len) - for(var/datum/objective/objective in objectives) - if(!objective.check_completion()) - objectives_complete = FALSE - break - - if(objectives_complete) - return "[owner.name] protected [owner.p_their()] date" - else - return "[owner.name] date failed!" diff --git a/code/modules/antagonists/wishgranter/wishgranter.dm b/code/modules/antagonists/wishgranter/wishgranter.dm index 82caf79143d5..060709514c24 100644 --- a/code/modules/antagonists/wishgranter/wishgranter.dm +++ b/code/modules/antagonists/wishgranter/wishgranter.dm @@ -19,7 +19,6 @@ /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() /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 dcbc1fbe455c..07f8013c9c35 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -52,6 +52,10 @@ src.spawn_fast = spawn_fast START_PROCESSING(SSobj, src) +/obj/effect/rend/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/effect/rend/process() if(!spawn_fast) if(locate(/mob) in loc) @@ -139,11 +143,7 @@ return . = COMPONENT_CANCEL_ATTACK_CHAIN var/mob/living/carbon/jedi = user - var/datum/component/mood/insaneinthemembrane = jedi.GetComponent(/datum/component/mood) - if(insaneinthemembrane.sanity < 15) - return //they've already seen it and are about to die, or are just too insane to care to_chat(jedi, span_userdanger("OH GOD! NONE OF IT IS REAL! NONE OF IT IS REEEEEEEEEEEEEEEEEEEEEEEEAL!")) - insaneinthemembrane.sanity = 0 for(var/lore in typesof(/datum/brain_trauma/severe)) jedi.gain_trauma(lore) addtimer(CALLBACK(src, PROC_REF(deranged), jedi), 10 SECONDS) @@ -165,7 +165,6 @@ desc = "An incandescent orb of otherworldly energy, merely holding it gives you vision and hearing beyond mortal means, and staring into it lets you see the entire universe." icon = 'icons/obj/guns/projectiles.dmi' icon_state ="bluespace" - throw_speed = 3 throw_range = 7 throwforce = 15 damtype = BURN @@ -228,7 +227,7 @@ if(!istype(M)) return ..() - if(!istype(user) || !user.canUseTopic(M, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(M, USE_CLOSE)) return if(M.stat != DEAD) @@ -292,13 +291,6 @@ H.put_in_hands(new /obj/item/claymore(H), TRUE) H.equip_to_slot_or_del(new /obj/item/spear(H), ITEM_SLOT_BACK) -//Provides a decent heal, need to pump every 6 seconds -/obj/item/organ/heart/cursed/wizard - pump_delay = 60 - heal_brute = 25 - heal_burn = 25 - heal_oxy = 25 - //Warp Whistle: Provides uncontrolled long distance teleportation. /obj/item/warpwhistle name = "warp whistle" @@ -342,7 +334,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.z != potential_T.z || abs(get_dist_euclidean(potential_T,T)) > 50 - breakout) do_teleport(user, potential_T, channel = TELEPORT_CHANNEL_MAGIC) T = potential_T break diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index d79efb5a68a5..e21cbdf23a42 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -148,7 +148,6 @@ var/obj/item/bodypart/affecting = user.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") affecting.receive_damage( 0, 10 ) // 10 burn damage user.emote("scream") - user.update_damage_overlays() user.dropItemToGround(src) //////////////////////////////Capturing//////////////////////////////////////////////////////// @@ -232,7 +231,6 @@ to_chat(occupant, span_userdanger("[user] holds you up briefly, then forces you into [target_toolbox]!")) to_chat(occupant, span_deadsay("Your eternal soul has been sacrificed to restore the soul of a toolbox. Them's the breaks!")) - occupant.client?.give_award(/datum/award/achievement/misc/toolbox_soul, occupant) occupant.deathmessage = "shrieks out in unholy pain as [occupant.p_their()] soul is absorbed into [target_toolbox]!" release_shades(user, TRUE) occupant.death() @@ -411,8 +409,7 @@ victim.stop_sound_channel(CHANNEL_HEARTBEAT) var/mob/living/simple_animal/shade/soulstone_spirit = new /mob/living/simple_animal/shade(src) soulstone_spirit.AddComponent(/datum/component/soulstoned, src) - soulstone_spirit.name = "Shade of [victim.real_name]" - soulstone_spirit.real_name = "Shade of [victim.real_name]" + soulstone_spirit.set_real_name("Shade of [victim.real_name]") soulstone_spirit.key = shade_controller.key soulstone_spirit.copy_languages(victim, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder. if(user) diff --git a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm index f9a32abf0488..5d0651400bed 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook_entries/summons.dm @@ -21,7 +21,7 @@ /datum/spellbook_entry/summon/guns/can_be_purchased() // Summon Guns requires 100 threat. - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE @@ -40,7 +40,7 @@ /datum/spellbook_entry/summon/magic/can_be_purchased() // Summon Magic requires 100 threat. - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE @@ -62,7 +62,7 @@ /datum/spellbook_entry/summon/events/can_be_purchased() // Summon Events requires 100 threat. - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/mode = SSticker.mode if(mode.threat_level < MINIMUM_THREAT_FOR_RITUALS) return FALSE diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm index a16f5b6f1fd3..df8e95679f9a 100644 --- a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm @@ -4,7 +4,6 @@ icon = 'icons/obj/library.dmi' icon_state ="book" worn_icon_state = "book" - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm index 0ae14fa503a3..baa8cd11b4d8 100644 --- a/code/modules/antagonists/wizard/wizard.dm +++ b/code/modules/antagonists/wizard/wizard.dm @@ -6,8 +6,8 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) roundend_category = "wizards/witches" antagpanel_category = "Wizard" job_rank = ROLE_WIZARD + assign_job = /datum/job/space_wizard antag_hud_name = "wizard" - antag_moodlet = /datum/mood_event/focused hijack_speed = 0.5 ui_name = "AntagInfoWizard" suicide_cry = "FOR THE FEDERATION!!" @@ -102,29 +102,19 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) owner.current.forceMove(pick(GLOB.wizardstart)) /datum/antagonist/wizard/proc/create_objectives() - switch(rand(1,100)) + switch(rand(1,85)) if(1 to 30) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner kill_objective.find_target() objectives += kill_objective - if (!(locate(/datum/objective/escape) in objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - if(31 to 60) var/datum/objective/steal/steal_objective = new steal_objective.owner = owner steal_objective.find_target() objectives += steal_objective - if (!(locate(/datum/objective/escape) in objectives)) - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - if(61 to 85) var/datum/objective/assassinate/kill_objective = new kill_objective.owner = owner @@ -136,16 +126,6 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) steal_objective.find_target() objectives += steal_objective - if (!(locate(/datum/objective/survive) in objectives)) - var/datum/objective/survive/survive_objective = new - survive_objective.owner = owner - objectives += survive_objective - - else - if (!(locate(/datum/objective/hijack) in objectives)) - var/datum/objective/hijack/hijack_objective = new - hijack_objective.owner = owner - objectives += hijack_objective /datum/antagonist/wizard/on_removal() // Currently removes all spells regardless of innate or not. Could be improved. @@ -293,7 +273,6 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) /datum/antagonist/wizard/apprentice/imposter/greet() . = ..() to_chat(owner, "Trick and confuse the crew to misdirect malice from your handsome original!") - owner.announce_objectives() /datum/antagonist/wizard/apprentice/imposter/equip_wizard() var/mob/living/carbon/human/master_mob = master.current @@ -341,7 +320,7 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key) fireball.Grant(living_current) var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(living_current) - exiled.implant(living_current) + exiled.implant(living_current, body_zone = BODY_ZONE_CHEST) /datum/antagonist/wizard/academy/create_objectives() var/datum/objective/new_objective = new("Protect Wizard Academy from the intruders") diff --git a/code/modules/appearance_modifier/appearance_modifier.dm b/code/modules/appearance_modifier/appearance_modifier.dm index 6a6e88a32b19..1720e17fd6ff 100644 --- a/code/modules/appearance_modifier/appearance_modifier.dm +++ b/code/modules/appearance_modifier/appearance_modifier.dm @@ -2,7 +2,7 @@ var/name = "You shouldn't see this!" ///If you don't want an appearance mod to be usable, use this. - var/abstract_type = /datum/appearance_modifier + abstract_type = /datum/appearance_modifier ///The icon that gets blended onto the base appearance. Generated in new() var/icon/my_icon = null var/icon2use = "" diff --git a/code/modules/appearance_modifier/vox_mods.dm b/code/modules/appearance_modifier/vox_mods.dm index c6a4a6f426df..c7e00b8efb0e 100644 --- a/code/modules/appearance_modifier/vox_mods.dm +++ b/code/modules/appearance_modifier/vox_mods.dm @@ -1,3 +1,5 @@ +/// Vox Tail marks +// - These give funny patterns to vox tails. /datum/appearance_modifier/vox_tail_mark name = "Error! (Vox Tail Mark)" abstract_type = /datum/appearance_modifier/vox_tail_mark @@ -19,3 +21,63 @@ /datum/appearance_modifier/vox_tail_mark/stripe name = "Vox Tail Stripe" state2use = "stripe" + +/// Vox Scutes (Ends of limbs) +// - This complements the secondary limb recolor to +// give vox players wildly expanded customization +// - These are split up so they don't overlay +// prosthetics or can be asymmetrical &/or +// differently colored. +/datum/appearance_modifier/vox_scute + name = "Error! (Vox Scute)" + abstract_type = /datum/appearance_modifier/vox_scute + + icon2use = 'icons/mob/appearancemods/vox_scutes.dmi' + + species_can_use = list(SPECIES_VOX) + +/datum/appearance_modifier/vox_scute/leg + name = "Error! (Vox Scute Leg)" + abstract_type = /datum/appearance_modifier/vox_scute/leg + bodyzones_affected = list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) + +/datum/appearance_modifier/vox_scute/leg/right + name = "Vox Scute (Leg, Right)" + bodyzones_affected = list(BODY_ZONE_R_LEG) + state2use = "vox_digitigrade_r_leg" + +/datum/appearance_modifier/vox_scute/leg/left + name = "Vox Scute (Leg, Left)" + bodyzones_affected = list(BODY_ZONE_L_LEG) + state2use = "vox_digitigrade_l_leg" + +/datum/appearance_modifier/vox_scute/arm + name = "Error! (Vox Scute Arm)" + abstract_type = /datum/appearance_modifier/vox_scute/arm + bodyzones_affected = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) + +/datum/appearance_modifier/vox_scute/arm/right + name = "Vox Scute (Arm, Right)" + bodyzones_affected = list(BODY_ZONE_R_ARM) + state2use = "vox_r_arm" + +/datum/appearance_modifier/vox_scute/arm/left + name = "Vox Scute (Arm, Left)" + bodyzones_affected = list(BODY_ZONE_L_ARM) + state2use = "vox_l_arm" + +/datum/appearance_modifier/vox_scute/hand + name = "Error! (Vox Scute Hand)" + abstract_type = /datum/appearance_modifier/vox_scute/hand + bodyzones_affected = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM) + affects_hands = TRUE + +/datum/appearance_modifier/vox_scute/hand/right + name = "Vox Scute (Hand, Right)" + bodyzones_affected = list(BODY_ZONE_R_ARM) + state2use = "vox_r_hand" + +/datum/appearance_modifier/vox_scute/hand/left + name = "Vox Scute (Hand, Left)" + bodyzones_affected = list(BODY_ZONE_L_ARM) + state2use = "vox_l_hand" diff --git a/code/modules/aquarium/aquarium.dm b/code/modules/aquarium/aquarium.dm index 3b86e5f501cd..3f6c8f05b9b3 100644 --- a/code/modules/aquarium/aquarium.dm +++ b/code/modules/aquarium/aquarium.dm @@ -101,7 +101,7 @@ . += span_notice("Alt-click to [panel_open ? "close" : "open"] the control panel.") /obj/structure/aquarium/AltClick(mob/user) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return ..() panel_open = !panel_open update_appearance() @@ -142,53 +142,36 @@ return NONE /obj/structure/aquarium/interact(mob/user) - if(!broken && user.pulling && isliving(user.pulling)) - var/mob/living/living_pulled = user.pulling - 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) + if(panel_open) . = ..() //call base ui_interact - else - admire(user) + +/obj/structure/aquarium/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(broken || !isliving(victim)) + return + + var/mob/living/living_pulled = victim + 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, grab) /// 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 && isliving(user.pulling)) - var/mob/living/living_pulled = user.pulling - if(living_pulled.buckled || living_pulled.has_buckled_mobs()) - to_chat(user, span_warning("[living_pulled] is attached to something!")) +/obj/structure/aquarium/proc/try_to_put_mob_in(mob/living/user, obj/item/hand_item/grab/G) + var/mob/living/living_pulled = G.affecting + if(living_pulled.buckled || living_pulled.has_buckled_mobs()) + to_chat(user, span_warning("[living_pulled] is attached to something!")) + return + user.visible_message(span_danger("[user] starts to put [living_pulled] into [src]!")) + + if(do_after(user, src, 10 SECONDS)) + if(QDELETED(living_pulled) || !user.is_grabbing(living_pulled) || living_pulled.buckled || living_pulled.has_buckled_mobs()) return - user.visible_message(span_danger("[user] starts to put [living_pulled] into [src]!")) - if(do_after(user, src, 10 SECONDS)) - 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(span_danger("[user] stuffs [living_pulled] into [src]!")) - living_pulled.forceMove(src) - update_appearance() - -///Apply mood bonus depending on aquarium status -/obj/structure/aquarium/proc/admire(mob/user) - to_chat(user,span_notice("You take a moment to watch [src].")) - if(do_after(user, src, 5 SECONDS)) - var/alive_fish = 0 - var/dead_fish = 0 - for(var/obj/item/fish/fish in tracked_fish) - if(fish.status == FISH_ALIVE) - alive_fish++ - else - dead_fish++ - //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 + 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(span_danger("[user] stuffs [living_pulled] into [src]!")) + living_pulled.forceMove(src) + update_appearance() /obj/structure/aquarium/ui_data(mob/user) . = ..() diff --git a/code/modules/aquarium/fish.dm b/code/modules/aquarium/fish.dm index a2b50ac6b3b6..0344c8813c59 100644 --- a/code/modules/aquarium/fish.dm +++ b/code/modules/aquarium/fish.dm @@ -75,6 +75,10 @@ if(status != FISH_DEAD) START_PROCESSING(SSobj, src) +/obj/item/fish/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/fish/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() check_environment_after_movement() @@ -429,7 +433,7 @@ stable_population = 3 -//Tiziran Fish +//Jitarai Fish /obj/item/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." @@ -440,7 +444,7 @@ /obj/item/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." + desc = "So called due to their resemblance to an artillery shell, the gunner jellyfish is native to Jitarai, 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 @@ -448,7 +452,7 @@ /obj/item/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." + desc = "A tiny, transparent fish which resides in large schools in the oceans of Jitarai. A common food for other, larger fish." icon_state = "needlefish" required_fluid_type = AQUARIUM_FLUID_SALTWATER stable_population = 12 @@ -456,7 +460,7 @@ /obj/item/fish/armorfish name = "armorfish" - desc = "A small shellfish native to Tizira's oceans, known for its exceptionally hard shell. Consumed similarly to prawns." + desc = "A small shellfish native to Jitarai'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/art/paintings.dm b/code/modules/art/paintings.dm index 3a81501b1f85..eaae15dde4da 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -210,7 +210,7 @@ return var/sniped_amount = painting_metadata.credit_value var/offer_amount = tgui_input_number(user, "How much do you want to offer?", "Patronage Amount", (painting_metadata.credit_value + 1), account.account_balance, painting_metadata.credit_value) - if(!offer_amount || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!offer_amount || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return if(sniped_amount != painting_metadata.credit_value) return @@ -327,7 +327,7 @@ if(painting_metadata.loaded_from_json) // No renaming old paintings return var/new_name = tgui_input_text(user, "What do you want to name the painting?", "Title Your Masterpiece") - if(new_name != painting_metadata.title && new_name && user.canUseTopic(src, BE_CLOSE)) + if(new_name != painting_metadata.title && new_name && user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) painting_metadata.title = new_name var/sign_choice = tgui_alert(user, "Do you want to sign it or remain anonymous?", "Sign painting?", list("Yes", "No")) if(sign_choice != "Yes") @@ -725,19 +725,19 @@ /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." + desc = "For masterpieces hand-picked by the archivist." + desc_with_canvas = "A masterpiece hand-picked by the archivist, 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 = "For art pieces deemed too subversive or too illegal to be shared outside of archivists." desc_with_canvas = "A painting hung away from lesser minds." persistence_id = "library_private" /obj/structure/sign/painting/large/library name = "\improper Large Painting Exhibit mounting" - desc = "For the bulkier art pieces, hand-picked by the curator." + desc = "For the bulkier art pieces, hand-picked by the archivist." desc_with_canvas = "A curated, large piece of art (or \"art\"). Hopefully the price of the canvas was worth it." persistence_id = "library_large" diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm index e4cfb88ee480..f2f0b86d17f8 100644 --- a/code/modules/art/statues.dm +++ b/code/modules/art/statues.dm @@ -10,12 +10,13 @@ material_modifier = 0.5 material_flags = MATERIAL_EFFECTS | MATERIAL_AFFECT_STATISTICS blocks_emissive = EMISSIVE_BLOCK_UNIQUE + abstract_type = /obj/structure/statue /// Beauty component mood modifier var/impressiveness = 15 /// Art component subtype added to this statue var/art_type = /datum/element/art - /// Abstract root type - var/abstract_type = /obj/structure/statue + /// Can this statue be created by hand? + var/can_be_carved = TRUE /obj/structure/statue/Initialize(mapload) . = ..() @@ -106,7 +107,7 @@ abstract_type = /obj/structure/statue/gold /obj/structure/statue/gold/hos - name = "statue of the head of security" + name = "statue of the security marshal" icon_state = "hos" /obj/structure/statue/gold/hop @@ -246,7 +247,7 @@ custom_materials = list(/datum/material/metalhydrogen = MINERAL_MATERIAL_AMOUNT*10) max_integrity = 1000 impressiveness = 100 - abstract_type = /obj/structure/statue/elder_atmosian //This one is uncarvable + can_be_carved = FALSE //Created by a crafting recipe instead of the standard system. /obj/item/chisel name = "chisel" @@ -261,7 +262,6 @@ force = 5 w_class = WEIGHT_CLASS_TINY throwforce = 5 - throw_speed = 3 throw_range = 5 custom_materials = list(/datum/material/iron=75) attack_verb_continuous = list("stabs") @@ -284,7 +284,6 @@ /obj/item/chisel/Initialize(mapload) . = ..() AddElement(/datum/element/eyestab) - AddElement(/datum/element/wall_engraver) //deals 200 damage to statues, meaning you can actually kill one in ~250 hits AddElement(/datum/element/bane, /mob/living/simple_animal/hostile/statue, damage_multiplier = 40) @@ -496,9 +495,11 @@ Moving interrupts /obj/structure/carving_block/proc/build_statue_cost_table() . = list() - for(var/statue_type in subtypesof(/obj/structure/statue) - /obj/structure/statue/custom) + for(var/obj/structure/statue/statue_type as anything in subtypesof(/obj/structure/statue) - /obj/structure/statue/custom) + if(isabstract(statue_type)) + continue var/obj/structure/statue/S = new statue_type() - if(!S.icon_state || S.abstract_type == S.type || !S.custom_materials) + if(!S.icon_state || !S.can_be_carved || !S.custom_materials) continue .[S.type] = S.custom_materials qdel(S) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 8b72f0addc52..858b80758b87 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -14,11 +14,11 @@ w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=100) throwforce = 2 - throw_speed = 3 throw_range = 7 drop_sound = 'sound/items/handling/component_drop.ogg' pickup_sound = 'sound/items/handling/component_pickup.ogg' + interaction_flags_atom = INTERACT_ATOM_UI_INTERACT | INTERACT_ATOM_ATTACK_HAND /** * Set to true if the device has different icons for each position. * This will prevent things such as visible lasers from facing the incorrect direction when transformed by assembly_holder's update_appearance() @@ -76,8 +76,10 @@ if(connected && wire_type) connected.pulse_assembly(src) return TRUE + if(holder && (wire_type & WIRE_PULSE)) holder.process_activation(src, 1, 0) + if(holder && (wire_type & WIRE_PULSE_SPECIAL)) holder.process_activation(src, 0, 1) return TRUE diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index ec12d67b84fc..27ce8c897803 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -6,7 +6,6 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' throwforce = 5 w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 throw_range = 4 flags_1 = CONDUCT_1 var/status = FALSE //0 - not readied //1 - bomb finished with welder @@ -122,11 +121,11 @@ if(LAZYLEN(assembly.assemblies) == igniter_count) return - if((src in user.get_equipped_items(TRUE)) && !user.canUnEquip(src)) + if((src in user.get_equipped_items(TRUE)) && !user.canUnequipItem(src)) to_chat(user, span_warning("[src] is stuck to you!")) return - if(!user.canUnEquip(assembly)) + if(!user.canUnequipItem(assembly)) to_chat(user, span_warning("[assembly] is stuck to your hand!")) return diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm index d14031fea71e..ca158be2bf00 100644 --- a/code/modules/assembly/doorcontrol.dm +++ b/code/modules/assembly/doorcontrol.dm @@ -15,7 +15,7 @@ /obj/item/assembly/control/multitool_act(mob/living/user) var/change_id = tgui_input_number(user, "Set the door controllers ID", "Door ID", id, 100) - if(!change_id || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!change_id || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return id = change_id to_chat(user, span_notice("You change the ID to [id].")) @@ -25,7 +25,7 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in GLOB.machines) + for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) if(M.id == src.id) if(openclose == null || !sync_doors) openclose = M.density @@ -46,7 +46,7 @@ if(cooldown) return cooldown = TRUE - for(var/obj/structure/curtain/cloth/fancy/mechanical/M in GLOB.curtains) + for(var/obj/structure/curtain/cloth/fancy/mechanical/M as anything in INSTANCES_OF(/obj/structure/curtain/cloth/fancy/mechanical)) if(M.id == src.id) if(openclose == null || !sync_doors) openclose = M.density @@ -73,7 +73,7 @@ cooldown = TRUE var/doors_need_closing = FALSE var/list/obj/machinery/door/airlock/open_or_close = list() - for(var/obj/machinery/door/airlock/D in GLOB.airlocks) + for(var/obj/machinery/door/airlock/D in INSTANCES_OF(/obj/machinery/door)) if(D.id_tag == src.id) if(specialfunctions & OPEN) open_or_close += D @@ -107,19 +107,19 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/door/poddoor/M in GLOB.machines) + for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, open)) sleep(10) - for(var/obj/machinery/mass_driver/M in GLOB.machines) + for(var/obj/machinery/mass_driver/M as anything in INSTANCES_OF(/obj/machinery/mass_driver)) if(M.id == src.id) M.drive() sleep(60) - for(var/obj/machinery/door/poddoor/M in GLOB.machines) + for(var/obj/machinery/door/poddoor/M in INSTANCES_OF(/obj/machinery/door)) if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/door/poddoor, close)) @@ -133,12 +133,14 @@ /obj/item/assembly/control/igniter/activate() if(cooldown) return + cooldown = TRUE - for(var/obj/machinery/sparker/M in GLOB.machines) + + for(var/obj/machinery/sparker/M as anything in INSTANCES_OF(/obj/machinery/sparker)) if (M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/sparker, ignite)) - for(var/obj/machinery/igniter/M in GLOB.machines) + for(var/obj/machinery/igniter/M as anything in INSTANCES_OF(/obj/machinery/igniter)) if(M.id == src.id) M.use_power(50) M.on = !M.on @@ -154,13 +156,12 @@ if(cooldown) return cooldown = TRUE - for(var/obj/machinery/flasher/M in GLOB.machines) + for(var/obj/machinery/flasher/M as anything in INSTANCES_OF(/obj/machinery/flasher)) if(M.id == src.id) INVOKE_ASYNC(M, TYPE_PROC_REF(/obj/machinery/flasher, flash)) addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 50) - /obj/item/assembly/control/crematorium name = "crematorium controller" desc = "An evil-looking remote controller for a crematorium." diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 97a7a48f0f5e..4f818f3700c6 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -15,7 +15,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = 300, /datum/material/glass = 300) - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_outer_range = FLASH_LIGHT_RANGE light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER @@ -168,20 +168,20 @@ // Did we try to flash them from behind? if(deviation == DEVIATION_FULL) // Headrevs can use a tacticool leaning technique so that they don't have to worry about facing for their conversions. - to_chat(user, span_notice("You use the tacticool tier, lean over the shoulder technique to blind [flashed] with a flash!")) + to_chat(user, span_notice("You use the tacticool tech, lean over the shoulder technique to blind [flashed] with a flash!")) deviation = DEVIATION_PARTIAL // Convert them. Terribly. terrible_conversion_proc(flashed, user) visible_message(span_danger("[user] blinds [flashed] with the flash!"), span_userdanger("[user] blinds you with the flash!")) //easy way to make sure that you can only long stun someone who is facing in your direction - flashed.Disorient((7 SECONDS * (1-(deviation*0.5))), 70, paralyze = 2 SECONDS) + flashed.Disorient((7 SECONDS * (1-(deviation*0.5))), 90 * (1-(deviation*0.5)), paralyze = 4 SECONDS) else if(user) visible_message(span_warning("[user] fails to blind [flashed] with the flash!"), span_danger("[user] fails to blind you with the flash!")) else to_chat(flashed, span_danger("[src] fails to blind you!")) else - flashed.Disorient(7 SECONDS * (1-(deviation*0.5)), paralyze = 2 SECONDS) + flashed.Disorient(7 SECONDS * (1-(deviation*0.5)), 90 * (1-(deviation*0.5)), paralyze = 4 SECONDS) /** * Handles the directionality of the attack @@ -255,8 +255,9 @@ /obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) if(holder) return FALSE - if(!AOE_flash(user = user)) - return FALSE + if(AOE_flash(user = user)) + user.changeNext_move(CLICK_CD_MELEE) + /obj/item/assembly/flash/emp_act(severity) . = ..() @@ -290,6 +291,9 @@ if(victim.stat != CONSCIOUS) to_chat(aggressor, span_warning("They must be conscious before you can convert [victim.p_them()]!")) return + if(!victim.mind || victim.mind.has_antag_datum(/datum/antagonist/rev) || victim.mind.has_antag_datum(/datum/antagonist/rev/head)) + return + //If this proc fires the mob must be a revhead var/datum/antagonist/rev/head/converter = aggressor.mind.has_antag_datum(/datum/antagonist/rev/head) if(converter.add_revolutionary(victim.mind)) @@ -297,8 +301,7 @@ victim.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.") times_used -- //Flashes less likely to burn out for headrevs when used for conversion else - to_chat(aggressor, span_warning("This mind seems resistant to the flash!")) - + to_chat(aggressor, span_warning("[victim.p_they(TRUE)] [victim.p_are()] unwilling to revolt!")) /obj/item/assembly/flash/cyborg diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 32191f31da50..01e86ff3549a 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -8,7 +8,6 @@ flags_1 = CONDUCT_1 throwforce = 5 w_class = WEIGHT_CLASS_SMALL - throw_speed = 2 throw_range = 7 /// used to store the list of assemblies making up our assembly holder var/list/obj/item/assembly/assemblies diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index f85c7629365a..670269916991 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -75,8 +75,7 @@ affecting = H.get_bodypart(type) H.Stun(60) if(affecting) - if(affecting.receive_damage(1, 0)) - H.update_damage_overlays() + affecting.receive_damage(1, 0) else if(ismouse(target)) var/mob/living/simple_animal/mouse/M = target visible_message(span_boldannounce("SPLAT!")) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 42e62e7bdd79..ccb954cd0d08 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -6,7 +6,7 @@ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' custom_materials = list(/datum/material/iron=400, /datum/material/glass=120) - wires = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE + wire_type = WIRE_RECEIVE | WIRE_PULSE | WIRE_RADIO_PULSE | WIRE_RADIO_RECEIVE attachable = TRUE drop_sound = 'sound/items/handling/component_drop.ogg' pickup_sound = 'sound/items/handling/component_pickup.ogg' @@ -157,7 +157,7 @@ return if(signal.data["code"] != code) return - if(!(src.wires & WIRE_RADIO_RECEIVE)) + if(!(wire_type & WIRE_RADIO_RECEIVE)) return if(suicider) manual_suicide(suicider) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index f6cbd52812e4..5657d7e07d31 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -32,7 +32,7 @@ . = ..() . += span_notice("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, list/message_mods = list(), atom/sound_loc) +/obj/item/assembly/voice/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() if(message_mods[WHISPER_MODE]) //Too quiet lad return diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm index 06181a817912..5c9539d9c64f 100644 --- a/code/modules/asset_cache/asset_list.dm +++ b/code/modules/asset_cache/asset_list.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(asset_datums) return loaded_asset.ensure_ready() /datum/asset - var/_abstract = /datum/asset + abstract_type = /datum/asset var/cached_serialized_url_mappings var/cached_serialized_url_mappings_transport_type @@ -65,7 +65,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /// If you don't need anything complicated. /datum/asset/simple - _abstract = /datum/asset/simple + abstract_type = /datum/asset/simple /// list of assets for this datum in the form of: /// asset_filename = asset_file. At runtime the asset_file will be /// converted into a asset_cache datum. @@ -98,7 +98,7 @@ GLOBAL_LIST_EMPTY(asset_datums) // For registering or sending multiple others at once /datum/asset/group - _abstract = /datum/asset/group + abstract_type = /datum/asset/group var/list/children /datum/asset/group/register() @@ -126,7 +126,7 @@ GLOBAL_LIST_EMPTY(asset_datums) #define SPRSZ_STRIPPED 3 /datum/asset/spritesheet - _abstract = /datum/asset/spritesheet + abstract_type = /datum/asset/spritesheet var/name /// List of arguments to pass into queuedInsert /// Exists so we can queue icon insertion, mostly for stuff like preferences @@ -425,7 +425,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /datum/asset/changelog_item - _abstract = /datum/asset/changelog_item + abstract_type = /datum/asset/changelog_item var/item_filename /datum/asset/changelog_item/New(date) @@ -443,7 +443,7 @@ GLOBAL_LIST_EMPTY(asset_datums) . = list("[item_filename]" = SSassets.transport.get_asset_url(item_filename)) /datum/asset/spritesheet/simple - _abstract = /datum/asset/spritesheet/simple + abstract_type = /datum/asset/spritesheet/simple var/list/assets /datum/asset/spritesheet/simple/create_spritesheets() @@ -452,7 +452,7 @@ GLOBAL_LIST_EMPTY(asset_datums) //Generates assets based on iconstates of a single icon /datum/asset/simple/icon_states - _abstract = /datum/asset/simple/icon_states + abstract_type = /datum/asset/simple/icon_states var/icon var/list/directions = list(SOUTH) var/frame = 1 @@ -476,7 +476,7 @@ GLOBAL_LIST_EMPTY(asset_datums) SSassets.transport.register_asset(asset_name, asset) /datum/asset/simple/icon_states/multiple_icons - _abstract = /datum/asset/simple/icon_states/multiple_icons + abstract_type = /datum/asset/simple/icon_states/multiple_icons var/list/icons /datum/asset/simple/icon_states/multiple_icons/register() @@ -489,7 +489,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /// For example `blah.css` with asset `blah.png` will get loaded as `namespaces/a3d..14f/f12..d3c.css` and `namespaces/a3d..14f/blah.png`. allowing the css file to load `blah.png` by a relative url rather then compute the generated url with get_url_mappings(). /// The namespace folder's name will change if any of the assets change. (excluding parent assets) /datum/asset/simple/namespaced - _abstract = /datum/asset/simple/namespaced + abstract_type = /datum/asset/simple/namespaced /// parents - list of the parent asset or assets (in name = file assoicated format) for this namespace. /// parent assets must be referenced by their generated url, but if an update changes a parent asset, it won't change the namespace's identity. var/list/parents = list() @@ -534,7 +534,7 @@ GLOBAL_LIST_EMPTY(asset_datums) /// A subtype to generate a JSON file from a list /datum/asset/json - _abstract = /datum/asset/json + abstract_type = /datum/asset/json /// The filename, will be suffixed with ".json" var/name diff --git a/code/modules/asset_cache/assets/body_zones.dm b/code/modules/asset_cache/assets/body_zones.dm deleted file mode 100644 index 10f384aa0e5f..000000000000 --- a/code/modules/asset_cache/assets/body_zones.dm +++ /dev/null @@ -1,23 +0,0 @@ -/// Spritesheet for body zones. Necessary if your tgui uses BodyZoneSelector -// This is a simple sheet instead of a spritesheet because spritesheets don't support -// -ms-interpolation-mode when resized, since you need `transform: scale`. -// Also spritesheets have some weird fudge on the edges of them because of an IE bug I can't track down. -/datum/asset/simple/body_zones - -/datum/asset/simple/body_zones/register() - assets["body_zones.base.png"] = icon('icons/hud/screen_midnight.dmi', "zone_sel") - - add_limb(BODY_ZONE_HEAD) - add_limb(BODY_ZONE_CHEST) - add_limb(BODY_ZONE_L_ARM) - add_limb(BODY_ZONE_R_ARM) - add_limb(BODY_ZONE_L_LEG) - add_limb(BODY_ZONE_R_LEG) - add_limb(BODY_ZONE_PRECISE_EYES) - add_limb(BODY_ZONE_PRECISE_MOUTH) - add_limb(BODY_ZONE_PRECISE_GROIN) - - return ..() - -/datum/asset/simple/body_zones/proc/add_limb(limb) - assets[SANITIZE_FILENAME("body_zones.[limb].png")] = icon('icons/hud/screen_gen.dmi', limb) diff --git a/code/modules/asset_cache/assets/chat_icons.dm b/code/modules/asset_cache/assets/chat_icons.dm new file mode 100644 index 000000000000..ece5fd7c5722 --- /dev/null +++ b/code/modules/asset_cache/assets/chat_icons.dm @@ -0,0 +1,28 @@ +/datum/asset/simple/namespaced/chat_icons + assets = list( + // Admin tags + "admin.png" = 'icons/ui_icons/chat/chattags/admin.png', + "aooc.png" = 'icons/ui_icons/chat/chattags/aooc.png', + "dead.png" = 'icons/ui_icons/chat/chattags/dead.png', + "help.png" = 'icons/ui_icons/chat/chattags/help.png', + "looc.png" = 'icons/ui_icons/chat/chattags/looc.png', + "ooc.png" = 'icons/ui_icons/chat/chattags/ooc.png', + "mod.png" = 'icons/ui_icons/chat/chattags/mod.png', + "pm_in.png" = 'icons/ui_icons/chat/chattags/pm_in.png', + "pm_out.png" = 'icons/ui_icons/chat/chattags/pm_out.png', + "pm_in_alt.png" = 'icons/ui_icons/chat/chattags/pm_in_alt.png', + "pm_other.png" = 'icons/ui_icons/chat/chattags/pm_other.png', + // Radio tags + "radio.png" = 'goon/icons/assets/radio/radio.png', + "civ.png" = 'goon/icons/assets/radio/civ.png', + "ai.png" = 'goon/icons/assets/radio/ai.png', + "sec.png" = 'goon/icons/assets/radio/sec.png', + "eng.png" = 'goon/icons/assets/radio/eng.png', + "med.png" = 'goon/icons/assets/radio/med.png', + "mail.png" = 'goon/icons/assets/radio/mail.png', + "ntboss.png" = 'goon/icons/assets/radio/ntboss.png', + "syndieboss.png" = 'goon/icons/assets/radio/syndieboss.png', + "unknown.png" = 'goon/icons/assets/radio/unknown.png', + "robo.png"= 'goon/icons/assets/radio/robo.png', + ) + parents = list("chat_icons.css" = 'html/browser/chat_icons.css') diff --git a/code/modules/asset_cache/assets/common.dm b/code/modules/asset_cache/assets/common.dm index 796c9b1d2acc..671730193946 100644 --- a/code/modules/asset_cache/assets/common.dm +++ b/code/modules/asset_cache/assets/common.dm @@ -3,6 +3,6 @@ "padlock.png" = 'icons/ui_icons/common/padlock.png', "attack.png" = 'goon/icons/assets/attack.png', "stamcost.png" = 'goon/icons/assets/stamcost.png', - "stamina.png" = 'goon/icons/assets/stamina.png' + "stamina.png" = 'goon/icons/assets/stamina.png', ) parents = list("common.css" = 'html/browser/common.css') diff --git a/code/modules/asset_cache/assets/cursors.dm b/code/modules/asset_cache/assets/cursors.dm new file mode 100644 index 000000000000..5978223c28fe --- /dev/null +++ b/code/modules/asset_cache/assets/cursors.dm @@ -0,0 +1,8 @@ +/datum/asset/simple/namespaced/cursors + assets = list( + "default.cur" = 'icons/ui_icons/cursors/default.cur', + "link_select.cur" = 'icons/ui_icons/cursors/link_select.cur', + ) + parents = list( + "cursors.css" = 'html/browser/cursors.css' + ) diff --git a/code/modules/asset_cache/assets/icon_ref_map.dm b/code/modules/asset_cache/assets/icon_ref_map.dm new file mode 100644 index 000000000000..2f7f84630991 --- /dev/null +++ b/code/modules/asset_cache/assets/icon_ref_map.dm @@ -0,0 +1,28 @@ +/// Maps icon names to ref values +/datum/asset/json/icon_ref_map + name = "icon_ref_map" + early = TRUE + +/datum/asset/json/icon_ref_map/generate() + var/list/data = list() //"icons/obj/drinks.dmi" => "[0xc000020]" + + //var/start = "0xc000000" + var/value = 0 + + while(TRUE) + value += 1 + var/ref = "\[0xc[num2text(value,6,16)]\]" + var/mystery_meat = locate(ref) + + if(isicon(mystery_meat)) + if(!isfile(mystery_meat)) // Ignore the runtime icons for now + continue + var/path = get_icon_dmi_path(mystery_meat) //Try to get the icon path + if(path) + data[path] = ref + else if(mystery_meat) + continue; //Some other non-icon resource, ogg/json/whatever + else //Out of resources end this, could also try to end this earlier as soon as runtime generated icons appear but eh + break; + + return data diff --git a/code/modules/asset_cache/assets/particle_editor.dm b/code/modules/asset_cache/assets/particle_editor.dm new file mode 100644 index 000000000000..f5f7bb009871 --- /dev/null +++ b/code/modules/asset_cache/assets/particle_editor.dm @@ -0,0 +1,17 @@ +/datum/asset/simple/particle_editor + assets = list( + "motion" = 'icons/ui_icons/particle_editor/motion.png', + + "uniform" = 'icons/ui_icons/particle_editor/uniform_rand.png', + "normal" ='icons/ui_icons/particle_editor/normal_rand.png', + "linear" = 'icons/ui_icons/particle_editor/linear_rand.png', + "square_rand" = 'icons/ui_icons/particle_editor/square_rand.png', + + "num" = 'icons/ui_icons/particle_editor/num_gen.png', + "vector" = 'icons/ui_icons/particle_editor/vector_gen.png', + "box" = 'icons/ui_icons/particle_editor/box_gen.png', + "circle" = 'icons/ui_icons/particle_editor/circle_gen.png', + "sphere" = 'icons/ui_icons/particle_editor/sphere_gen.png', + "square" = 'icons/ui_icons/particle_editor/square_gen.png', + "cube" = 'icons/ui_icons/particle_editor/cube_gen.png', + ) diff --git a/code/modules/asset_cache/assets/pipes.dm b/code/modules/asset_cache/assets/pipes.dm index 66a37de9f86a..2a027f3611c3 100644 --- a/code/modules/asset_cache/assets/pipes.dm +++ b/code/modules/asset_cache/assets/pipes.dm @@ -2,5 +2,5 @@ name = "pipes" /datum/asset/spritesheet/pipes/create_spritesheets() - for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi')) + for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')) InsertAll("", each, GLOB.alldirs) diff --git a/code/modules/asset_cache/assets/research_designs.dm b/code/modules/asset_cache/assets/research_designs.dm index bca782207a1b..7768875fa658 100644 --- a/code/modules/asset_cache/assets/research_designs.dm +++ b/code/modules/asset_cache/assets/research_designs.dm @@ -1,63 +1,35 @@ // Representative icons for each research design -/datum/asset/spritesheet/research_designs +/datum/asset/spritesheet/biogenerator_designs name = "design" -/datum/asset/spritesheet/research_designs/create_spritesheets() - for (var/path in subtypesof(/datum/design)) - var/datum/design/D = path +/datum/asset/spritesheet/biogenerator_designs/create_spritesheets() + for (var/datum/design/D as anything in subtypesof(/datum/design)) + if(!(initial(D.build_type) & BIOGENERATOR)) + continue - var/icon_file - var/icon_state var/icon/I + var/icon_state + var/icon_file - if(initial(D.research_icon) && initial(D.research_icon_state)) //If the design has an icon replacement skip the rest - icon_file = initial(D.research_icon) - icon_state = initial(D.research_icon_state) - if(!(icon_state in icon_states(icon_file))) - warning("design [D] with icon '[icon_file]' missing state '[icon_state]'") - continue - I = icon(icon_file, icon_state, SOUTH) + // construct the icon and slap it into the resource cache + var/atom/item = initial(D.build_path) + if (!ispath(item, /atom)) + item = /obj/item/reagent_containers/glass/beaker/large + // Check for GAGS support where necessary + var/greyscale_config = initial(item.greyscale_config) + var/greyscale_colors = initial(item.greyscale_colors) + if (greyscale_config && greyscale_colors) + icon_file = SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) else - // construct the icon and slap it into the resource cache - var/atom/item = initial(D.build_path) - if (!ispath(item, /atom)) - // biogenerator outputs to beakers by default - if (initial(D.build_type) & BIOGENERATOR) - item = /obj/item/reagent_containers/glass/beaker/large - else - continue // shouldn't happen, but just in case - - // circuit boards become their resulting machines or computers - if (ispath(item, /obj/item/circuitboard)) - var/obj/item/circuitboard/C = item - var/machine = initial(C.build_path) - if (machine) - item = machine - - // Check for GAGS support where necessary - var/greyscale_config = initial(item.greyscale_config) - var/greyscale_colors = initial(item.greyscale_colors) - if (greyscale_config && greyscale_colors) - icon_file = SSgreyscale.GetColoredIconByType(greyscale_config, greyscale_colors) - else - icon_file = initial(item.icon) - - icon_state = initial(item.icon_state) - if(!(icon_state in icon_states(icon_file))) - warning("design [D] with icon '[icon_file]' missing state '[icon_state]'") - continue - I = icon(icon_file, icon_state, SOUTH) - - // computers (and snowflakes) get their screen and keyboard sprites - if (ispath(item, /obj/machinery/computer) || ispath(item, /obj/machinery/power/solar_control)) - var/obj/machinery/computer/C = item - var/screen = initial(C.icon_screen) - var/keyboard = initial(C.icon_keyboard) - var/all_states = icon_states(icon_file) - if (screen && (screen in all_states)) - I.Blend(icon(icon_file, screen, SOUTH), ICON_OVERLAY) - if (keyboard && (keyboard in all_states)) - I.Blend(icon(icon_file, keyboard, SOUTH), ICON_OVERLAY) + icon_file = initial(item.icon) + + icon_state = initial(item.icon_state) + #ifdef UNIT_TESTS + if(!icon_exists(icon_file, icon_state, FALSE)) + warning("design [D] with icon '[icon_file]' missing state '[icon_state]'") + continue + #endif + I = icon(icon_file, icon_state, SOUTH) Insert(initial(D.id), I) diff --git a/code/modules/asset_cache/assets/vending.dm b/code/modules/asset_cache/assets/vending.dm index 87fddfc1132c..01a6afcf5247 100644 --- a/code/modules/asset_cache/assets/vending.dm +++ b/code/modules/asset_cache/assets/vending.dm @@ -13,23 +13,25 @@ else icon_file = initial(item.icon) var/icon_state = initial(item.icon_state) - var/icon/I + #ifdef UNIT_TESTS var/icon_states_list = icon_states(icon_file) - if(icon_state in icon_states_list) - I = icon(icon_file, icon_state, SOUTH) - var/c = initial(item.color) - if (!isnull(c) && c != "#FFFFFF") - I.Blend(c, ICON_MULTIPLY) - else + if (!(icon_state in icon_states_list)) var/icon_states_string for (var/an_icon_state in icon_states_list) if (!icon_states_string) icon_states_string = "[json_encode(an_icon_state)](\ref[an_icon_state])" else icon_states_string += ", [json_encode(an_icon_state)](\ref[an_icon_state])" + stack_trace("[item] does not have a valid icon state, icon=[icon_file], icon_state=[json_encode(icon_state)](\ref[icon_state]), icon_states=[icon_states_string]") - I = icon('icons/turf/floors.dmi', "", SOUTH) + continue + #endif + + var/icon/I = icon(icon_file, icon_state, SOUTH) + var/c = initial(item.color) + if (!isnull(c) && c != "#FFFFFF") + I.Blend(c, ICON_MULTIPLY) var/imgid = replacetext(replacetext("[item]", "/obj/item/", ""), "/", "-") diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm index 8bad1a0db150..fabf7c5db6f0 100644 --- a/code/modules/asset_cache/transports/asset_transport.dm +++ b/code/modules/asset_cache/transports/asset_transport.dm @@ -76,6 +76,10 @@ /// asset_list - A list of asset filenames to be sent to the client. Can optionally be assoicated with the asset's asset_cache_item datum. /// Returns TRUE if any assets were sent. /datum/asset_transport/proc/send_assets(client/client, list/asset_list) +#if defined(UNIT_TESTS) + return +#endif + if (!istype(client)) if (ismob(client)) var/mob/M = client diff --git a/code/modules/atmospherics/ZAS/Airflow.dm b/code/modules/atmospherics/ZAS/Airflow.dm index 9accdb2b38aa..b97dbf3a3798 100644 --- a/code/modules/atmospherics/ZAS/Airflow.dm +++ b/code/modules/atmospherics/ZAS/Airflow.dm @@ -36,8 +36,6 @@ This entire system is an absolute mess. /mob/living/airflow_stun(delta_p) if(stat == 2) return FALSE - if(pulledby || pulling) - return FALSE if(last_airflow_stun > world.time - zas_settings.airflow_stun_cooldown) return FALSE if(!(status_flags & CANSTUN) && !(status_flags & CANKNOCKDOWN)) diff --git a/code/modules/atmospherics/ZAS/ConnectionGroup.dm b/code/modules/atmospherics/ZAS/ConnectionGroup.dm index 0778385bfe36..2587240b1886 100644 --- a/code/modules/atmospherics/ZAS/ConnectionGroup.dm +++ b/code/modules/atmospherics/ZAS/ConnectionGroup.dm @@ -151,14 +151,16 @@ Class Procs: if(!length(close_turfs)) continue + + if(HAS_TRAIT(M, TRAIT_EXPERIENCING_AIRFLOW)) + SSairflow.Dequeue(M) + M.airflow_dest = pick(close_turfs) //Pick a random midpoint to fly towards. - //Soul code im too scared to touch - Edit, I am no longer too scared to touch it. This used to cause an OOM if an admin bussed too hard. - if(M) - if(repelled) - M.RepelAirflowDest(differential/5) - else - M.GotoAirflowDest(differential/10) + if(repelled) + M.RepelAirflowDest(differential/5) + else + M.GotoAirflowDest(differential/10) CHECK_TICK diff --git a/code/modules/atmospherics/ZAS/Expose.dm b/code/modules/atmospherics/ZAS/Expose.dm index c6a1fae37a1e..d60c6604a250 100644 --- a/code/modules/atmospherics/ZAS/Expose.dm +++ b/code/modules/atmospherics/ZAS/Expose.dm @@ -9,24 +9,6 @@ /turf/atmos_expose(datum/gas_mixture/air, exposed_temperature) SEND_SIGNAL(src, COMSIG_TURF_EXPOSE, air, exposed_temperature) -/turf/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if(arrived.flags_2 & ATMOS_SENSITIVE_2) - LAZYDISTINCTADD(atmos_sensitive_contents, arrived) - if(TURF_HAS_VALID_ZONE(src)) - if(isnull(zone.atmos_sensitive_contents)) - SSzas.zones_with_sensitive_contents += zone - LAZYDISTINCTADD(zone.atmos_sensitive_contents, arrived) - -/turf/Exited(atom/movable/gone, direction) - . = ..() - if(gone.flags_2 & ATMOS_SENSITIVE_2) - if(!isnull(atmos_sensitive_contents)) - LAZYREMOVE(atmos_sensitive_contents, gone) - if(TURF_HAS_VALID_ZONE(src)) - LAZYREMOVE(zone.atmos_sensitive_contents, gone) - if(isnull(zone.atmos_sensitive_contents)) - SSzas.zones_with_sensitive_contents -= zone ///allows this movable to know when it's container's temperature has changed /atom/proc/become_atmos_sensitive() diff --git a/code/modules/atmospherics/ZAS/Fire.dm b/code/modules/atmospherics/ZAS/Fire.dm index 697362822aea..027aee443bc0 100644 --- a/code/modules/atmospherics/ZAS/Fire.dm +++ b/code/modules/atmospherics/ZAS/Fire.dm @@ -9,14 +9,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin //#define FIREDBG /turf - var/obj/effect/hotspot/fire = null - -//Some legacy definitions so fires can be started. -/atom/movable/proc/is_burnable() - return FALSE - -/mob/is_burnable() - return simulated + var/obj/effect/hotspot/active_hotspot = null /turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return @@ -26,10 +19,10 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return 0 if(fire_protection > world.time-300) return 0 - if(src.fire) + if(active_hotspot) return 1 var/datum/gas_mixture/air_contents = unsafe_return_air() - if(!air_contents || exposed_temperature < PHORON_MINIMUM_BURN_TEMPERATURE) + if(!air_contents || exposed_temperature < 4) return 0 var/igniting = 0 @@ -38,87 +31,38 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(air_contents.check_combustability(liquid)) igniting = 1 - create_fire(exposed_temperature) + create_fire(1) return igniting -/zone/proc/process_fire() - var/datum/gas_mixture/burn_gas = air.removeRatio(zas_settings.fire_consumption_rate, fire_tiles.len) - - var/firelevel = burn_gas.react(src, fire_tiles, force_burn = 1, no_check = 1) - - air.merge(burn_gas) - - if(firelevel) - for(var/turf/T as anything in fire_tiles) - if(T.fire) - T.fire.firelevel = firelevel - else - var/obj/effect/decal/cleanable/oil/fuel = locate() in T - if(fuel) - UnregisterSignal(fuel, COMSIG_PARENT_QDELETING) - fuel_objs -= fuel - fire_tiles -= T - else - for(var/turf/T as anything in fire_tiles) - if(T.fire) - qdel(T.fire) - fire_tiles.Cut() - //Gotta make sure we don't leave any left over signals - for(var/fuel in fuel_objs) - UnregisterSignal(fuel, COMSIG_PARENT_QDELETING) - fuel_objs.Cut() - - if(!length(fire_tiles)) - SSzas.active_fire_zones.Remove(src) - -/zone/proc/remove_liquidfuel(used_liquid_fuel, remove_fire=0) - if(!length(fuel_objs)) - return - - //As a simplification, we remove fuel equally from all fuel sources. It might be that some fuel sources have more fuel, - //some have less, but whatever. It will mean that sometimes we will remove a tiny bit less fuel then we intended to. - - var/fuel_to_remove = round(used_liquid_fuel/(fuel_objs.len*LIQUIDFUEL_AMOUNT_TO_MOL), 0.01) //convert back to liquid volume units - - for(var/obj/effect/decal/cleanable/oil/fuel as anything in fuel_objs) - fuel.reagent_amount -= fuel_to_remove - if(fuel.reagent_amount <= 0.1) //Precision loss kinda fucks with us here so - if(remove_fire) - var/turf/T = fuel.loc - if(istype(T) && T.fire) - qdel(T.fire) - qdel(fuel) - ///Creates a fire with firelevel (fl). If create_own_fuel is given, it will create that many units of welding fuel on the turf. /turf/proc/create_fire(fl, create_own_fuel) - return 0 + return /turf/open/create_fire(fl, create_own_fuel) if(!simulated) return - if(fire) - fire.firelevel = max(fl, fire.firelevel) + if(active_hotspot) + active_hotspot.firelevel = max(fl, active_hotspot.firelevel) return new /obj/effect/hotspot(src, fl) - if(!fire) //Could not create a fire on this turf. + if(!active_hotspot) //Could not create a fire on this turf. return var/obj/effect/decal/cleanable/oil/fuel = locate() in src if(create_own_fuel) if(!fuel) fuel = new /obj/effect/decal/cleanable/oil(src) - fuel.reagent_amount = create_own_fuel + if(QDELETED(fuel)) + qdel(active_hotspot) + return + fuel.reagents.add_reagent(/datum/reagent/fuel/oil, create_own_fuel) else - fuel.reagent_amount += create_own_fuel + fuel.reagents.add_reagent(/datum/reagent/fuel/oil, create_own_fuel) - if(fuel) - zone.fuel_objs += fuel - zone.RegisterSignal(fuel, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/zone, handle_fuel_del)) - - return fire + return active_hotspot /turf/open/space/create_fire() return @@ -130,133 +74,172 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin icon_state = "1" layer = GASFIRE_LAYER blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = LIGHT_RANGE_FIRE light_power = 1 light_color = LIGHT_COLOR_FIRE var/firelevel = 1 //Calculated by gas_mixture.calculate_firelevel() + var/temperature = 0 /obj/effect/hotspot/Initialize(fl) . = ..() - var/turf/T = loc - if(!istype(T) || !T.zone) + var/turf/open/T = loc + if(!isopenturf(T)) return INITIALIZE_HINT_QDEL - if(T.fire) + if(T.active_hotspot) T.create_fire(fl) //Add the fire level to the existing fire and fuck off return INITIALIZE_HINT_QDEL - //setDir(pick(GLOB.cardinals)) - T.fire = src - T.zone.fire_tiles |= T - var/datum/gas_mixture/air_contents = T.unsafe_return_air() - color = FIRECOLOR(air_contents.temperature) - set_light_range(3) - set_light_power(1) - set_light_color(color) - firelevel = fl - SSzas.active_hotspots.Add(src) - SSzas.active_fire_zones |= T.zone + T.active_hotspot = src + SSzas.active_hotspots += src + setDir(pick(GLOB.cardinals)) + + var/datum/gas_mixture/turf_air = T.unsafe_return_air() + react_with_air(turf_air, locate(/obj/effect/decal/cleanable/oil) in src) + firelevel = max(fl, firelevel) + + temperature = turf_air.temperature + color = FIRECOLOR(temperature) + + update_firelight() + expose_loc(turf_air.returnPressure(), temperature, turf_air.volume) + + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_crossed), + COMSIG_ATOM_ABSTRACT_ENTERED = PROC_REF(on_crossed), + ) + + AddElement(/datum/element/connect_loc, loc_connections) /obj/effect/hotspot/Destroy() var/turf/T = loc - if (istype(T)) - set_light(0) - if(T.fire == src) - T.fire = null - SSzas.active_hotspots.Remove(src) + if (isturf(T) && T.active_hotspot == src) + T.active_hotspot = null + + SSzas.active_hotspots -= src + SSzas.processing_hotspots -= src return ..() /obj/effect/hotspot/process() - . = 1 if(QDELETED(src)) - return PROCESS_KILL + return var/turf/my_tile = loc - if(istype(my_tile, /turf/open/space) || !my_tile.zone) - if(my_tile && my_tile.fire == src) - my_tile.fire = null + if(isspaceturf(my_tile)) + if(my_tile?.active_hotspot == src) + my_tile.active_hotspot = null + qdel(src) + return + + var/obj/effect/decal/cleanable/oil/liquid_fuel = locate() in loc + var/datum/gas_mixture/turf_air = return_air() + + if(!turf_air.check_recombustability(liquid_fuel)) qdel(src) - return PROCESS_KILL - - var/datum/gas_mixture/air_contents = my_tile.unsafe_return_air() - - if(firelevel > 6 && light_power != 2) - icon_state = "3" - set_light_power(2) - set_light_range(7) - else if(firelevel > 2.5 && light_power != 1.5) - icon_state = "2" - set_light_power(1.5) - set_light_range(5) - else if(light_power != 1) - icon_state = "1" - set_light_power(1) - set_light_range(3) - - for(var/mob/living/L in loc) - L.FireBurn(firelevel, air_contents.temperature, air_contents.returnPressure()) //Burn the mobs! - - loc.fire_act(air_contents.temperature, air_contents.volume) - for(var/atom/A as anything in loc) - A.fire_act(air_contents.temperature, air_contents.volume) - - //spread + return + + if(!react_with_air(turf_air, liquid_fuel)) + qdel(src) + return + + var/pressure = turf_air.returnPressure() + temperature = turf_air.temperature + var/volume = turf_air.volume + + expose_loc(pressure, temperature, volume) + + spread_to_adjacent(temperature, volume) + + var/maybe_new_color = FIRECOLOR(temperature) + if(color != maybe_new_color) + animate(src, color = maybe_new_color, 5) + + update_firelight() + +/// Update the associated light variables based on firelevel +/obj/effect/hotspot/proc/update_firelight() + switch(firelevel) + if(2.5 to 6) + if(light_power != 2) + icon_state = "3" + set_light_power(2) + set_light_range(7) + if(6.001 to INFINITY) + if(light_power != 1.5) + icon_state = "2" + set_light_power(1.5) + set_light_range(5) + else + if(light_power != 1) + icon_state = "1" + set_light_power(1) + set_light_range(3) + +/// Expose our turf and all atoms inside of it +/obj/effect/hotspot/proc/expose_loc(pressure, temperature, volume) + loc.fire_act(temperature, volume) + for(var/atom/movable/AM as anything in loc) + AM.fire_act(temperature, volume) + +/obj/effect/hotspot/proc/react_with_air(datum/gas_mixture/air, obj/effect/decal/cleanable/liquid_fuel) + var/datum/gas_mixture/burn_gas = air.removeRatio(zas_settings.fire_consumption_rate, air.group_multiplier) + + firelevel = burn_gas.react(force_burn = 1, skip_recombust_check = 1, liquid_fuel = liquid_fuel) + + air.merge(burn_gas) + return firelevel + +/// Potentially spread fire, and attack nearby tiles with adjacent_fire_act() +/obj/effect/hotspot/proc/spread_to_adjacent(temp, volume) + var/turf/open/my_tile = loc for(var/direction in GLOB.cardinals) var/turf/enemy_tile = get_step(my_tile, direction) - if(!enemy_tile) + if(!enemy_tile || isspaceturf(enemy_tile) || enemy_tile.active_hotspot) continue - if(!istype(enemy_tile, /turf/open/space)) - if(my_tile.open_directions & direction) //Grab all valid bordering tiles - if(!enemy_tile.zone || enemy_tile.fire) - continue - - //if(!enemy_tile.zone.fire_tiles.len) TODO - optimize - var/datum/gas_mixture/acs = enemy_tile.unsafe_return_air() - var/obj/effect/decal/cleanable/oil/liquid = locate() in enemy_tile - if(!acs || !acs.check_combustability(liquid)) - continue - - //If extinguisher mist passed over the turf it's trying to spread to, don't spread and - //reduce firelevel. - if(enemy_tile.fire_protection > world.time-30) - firelevel -= 1.5 - continue - - //Spread the fire. - //Atmos Canpass probably needs to be checked here - if(prob(50 + 50 * (firelevel/zas_settings.fire_firelevel_multiplier))) - enemy_tile.create_fire(firelevel) - - else - enemy_tile.adjacent_fire_act(loc, air_contents, air_contents.temperature, air_contents.volume) - - animate(src, color = FIRECOLOR(air_contents.temperature), 5) - set_light_color(color) -/turf/var/fire_protection = 0 -/turf/proc/apply_fire_protection() - fire_protection = world.time + if(!(my_tile.open_directions & direction)) //Grab all valid bordering tiles + enemy_tile.fire_act(temp, volume, my_tile) + continue -/turf/open/space/apply_fire_protection() - return + if(!prob(50 + 50 * (firelevel/zas_settings.fire_firelevel_multiplier))) + continue + + var/datum/gas_mixture/acs = enemy_tile.unsafe_return_air() + var/obj/effect/decal/cleanable/oil/liquid = locate() in enemy_tile + if(!acs?.check_combustability(liquid)) + continue + + //If extinguisher mist passed over the turf it's trying to spread to, don't spread and + //reduce firelevel. + if(enemy_tile.fire_protection > world.time-30) + firelevel -= 1.5 + continue + + //Spread the fire. + enemy_tile.create_fire(firelevel) + +/obj/effect/hotspot/proc/on_crossed(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + if(isliving(arrived) ) + var/mob/living/immolated = arrived + immolated.fire_act(temperature, CELL_VOLUME) //Returns the firelevel -/datum/gas_mixture/proc/react(zone/zone, force_burn, no_check = 0) +/datum/gas_mixture/proc/react(force_burn, skip_recombust_check, obj/effect/decal/cleanable/liquid_fuel) . = 0 - if(!((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (no_check || check_recombustability(zone? zone.fuel_objs : null)))) + if(!((temperature > PHORON_MINIMUM_BURN_TEMPERATURE || force_burn) && (skip_recombust_check || check_recombustability(liquid_fuel)))) return #ifdef FIREDBG - log_admin("***************** FIREDBG *****************") - log_admin("Burning [zone? zone.name : "zoneless gas_mixture"]!") + to_chat(world, "***************** REACT DEBUG *****************") #endif var/gas_fuel = 0 - var/liquid_fuel = 0 var/total_fuel = 0 var/total_oxidizers = 0 + var/liquid_fuel_amt = LIQUIDFUEL_AMOUNT_TO_MOL(liquid_fuel?.reagents.total_volume) || 0 //*** Get the fuel and oxidizer amounts for(var/g in gas) @@ -264,17 +247,8 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin gas_fuel += gas[g] if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER) total_oxidizers += gas[g] - gas_fuel *= group_multiplier - total_oxidizers *= group_multiplier - //Liquid Fuel - var/fuel_area = 0 - if(zone) - for(var/obj/effect/decal/cleanable/oil/fuel in zone.fuel_objs) - liquid_fuel += fuel.reagent_amount*LIQUIDFUEL_AMOUNT_TO_MOL - fuel_area++ - - total_fuel = gas_fuel + liquid_fuel + total_fuel = gas_fuel + liquid_fuel_amt if(total_fuel <= 0.005) return 0 @@ -288,59 +262,62 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/reaction_limit = min(total_oxidizers*(FIRE_REACTION_FUEL_AMOUNT/FIRE_REACTION_OXIDIZER_AMOUNT), total_fuel) //stoichiometric limit //vapour fuels are extremely volatile! The reaction progress is a percentage of the total fuel (similar to old zburn).) - var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume*group_multiplier) / zas_settings.fire_firelevel_multiplier - var/min_burn = 0.30*volume*group_multiplier/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast + var/gas_firelevel = calculate_firelevel(gas_fuel, total_oxidizers, reaction_limit, volume) / zas_settings.fire_firelevel_multiplier + var/min_burn = 0.30*volume/CELL_VOLUME //in moles - so that fires with very small gas concentrations burn out fast var/gas_reaction_progress = min(max(min_burn, gas_firelevel*gas_fuel)*FIRE_GAS_BURNRATE_MULT, gas_fuel) //liquid fuels are not as volatile, and the reaction progress depends on the size of the area that is burning. Limit the burn rate to a certain amount per area. - var/liquid_firelevel = calculate_firelevel(liquid_fuel, total_oxidizers, reaction_limit, 0) / zas_settings.fire_firelevel_multiplier - var/liquid_reaction_progress = min((liquid_firelevel*0.2 + 0.05)*fuel_area*FIRE_LIQUID_BURNRATE_MULT, liquid_fuel) + var/liquid_firelevel = calculate_firelevel(liquid_fuel_amt, total_oxidizers, reaction_limit, 0) / zas_settings.fire_firelevel_multiplier + var/liquid_reaction_progress = min((liquid_firelevel*0.2 + 0.05)*FIRE_LIQUID_BURNRATE_MULT, liquid_fuel_amt) - var/firelevel = (gas_fuel*gas_firelevel + liquid_fuel*liquid_firelevel)/total_fuel + var/firelevel = (gas_fuel*gas_firelevel + liquid_fuel_amt*liquid_firelevel)/total_fuel var/total_reaction_progress = gas_reaction_progress + liquid_reaction_progress var/used_fuel = min(total_reaction_progress, reaction_limit) - var/used_oxidizers = used_fuel*(FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) + var/used_oxidizers = used_fuel * (FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT) #ifdef FIREDBG - log_admin("gas_fuel = [gas_fuel], liquid_fuel = [liquid_fuel], total_oxidizers = [total_oxidizers]") - log_admin("fuel_area = [fuel_area], total_fuel = [total_fuel], reaction_limit = [reaction_limit]") - log_admin("firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])") - log_admin("liquid_reaction_progress = [liquid_reaction_progress]") - log_admin("gas_reaction_progress = [gas_reaction_progress]") - log_admin("total_reaction_progress = [total_reaction_progress]") - log_admin("used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") + to_chat(world, "gas_fuel = [gas_fuel], liquid_fuel_amt = [liquid_fuel_amt], total_oxidizers = [total_oxidizers]") + to_chat(world, "firelevel -> [firelevel] (gas: [gas_firelevel], liquid: [liquid_firelevel])") + to_chat(world, "liquid_reaction_progress = [liquid_reaction_progress]") + to_chat(world, "gas_reaction_progress = [gas_reaction_progress]") + to_chat(world, "total_reaction_progress = [total_reaction_progress]") + to_chat(world, "used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") + to_chat(world, "used_fuel = [used_fuel], used_oxidizers = [used_oxidizers]; ") #endif //if the reaction is progressing too slow then it isn't self-sustaining anymore and burns out - if(zone) //be less restrictive with canister and tank reactions - if((!liquid_fuel || used_fuel <= FIRE_LIQUD_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE*zone.contents.len)) - return 0 + if((!liquid_fuel_amt || used_fuel <= FIRE_LIQUID_MIN_BURNRATE) && (!gas_fuel || used_fuel <= FIRE_GAS_MIN_BURNRATE)) + return 0 //*** Remove fuel and oxidizer, add carbon dioxide and heat //remove and add gasses as calculated var/used_gas_fuel = min(max(0.25, used_fuel*(gas_reaction_progress/total_reaction_progress)), gas_fuel) //remove in proportion to the relative reaction progress - var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel) + var/used_liquid_fuel = min(max(0.25, used_fuel-used_gas_fuel), liquid_fuel_amt) - //removeByFlag() and adjustGas() handle the group_multiplier for us. removeByFlag(XGM_GAS_OXIDIZER, used_oxidizers) var/datum/gas_mixture/burned_fuel = removeByFlag(XGM_GAS_FUEL, used_gas_fuel) for(var/g in burned_fuel.gas) adjustGas(xgm_gas_data.burn_product[g], burned_fuel.gas[g], FALSE) - if(zone && used_liquid_fuel) - zone.remove_liquidfuel(used_liquid_fuel, !check_combustability()) + if(used_liquid_fuel) adjustGas(GAS_CO2, firelevel * 0.07, FALSE) + var/fuel_to_remove = GASFUEL_AMOUNT_TO_LIQUID(used_liquid_fuel) //convert back to liquid volume units + + liquid_fuel.reagents.remove_all(fuel_to_remove) + if(liquid_fuel.reagents.total_volume <= 0.1) //Precision loss kinda fucks with us here so + qdel(liquid_fuel) + //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + zas_settings.fire_fuel_energy_release * (used_gas_fuel + used_liquid_fuel)) / getHeatCapacity() AIR_UPDATE_VALUES(src) #ifdef FIREDBG - log_admin("used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") - log_admin("new temperature = [temperature]; new pressure = [returnPressure()]") + to_chat(world, "used_gas_fuel = [used_gas_fuel]; used_liquid_fuel = [used_liquid_fuel]; total = [used_fuel]") + to_chat(world, "new temperature = [temperature]; new pressure = [returnPressure()]") #endif if (temperature<220) @@ -350,7 +327,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return firelevel -/datum/gas_mixture/proc/check_recombustability(list/fuel_objs) +/datum/gas_mixture/proc/check_recombustability(has_liquid_fuel) . = 0 for(var/g in gas) if(xgm_gas_data.flags[g] & XGM_GAS_OXIDIZER && gas[g] >= 0.1) @@ -360,7 +337,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(!.) return 0 - if(fuel_objs && length(fuel_objs)) + if(has_liquid_fuel) return 1 . = 0 @@ -398,7 +375,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin if(total_moles && total_combustables > 0) //slows down the burning when the concentration of the reactants is low - var/damping_multiplier = min(1, active_combustables / (total_moles/group_multiplier)) + var/damping_multiplier = min(1, active_combustables / total_moles) //weight the damping mult so that it only really brings down the firelevel when the ratio is closer to 0 damping_multiplier = 2*damping_multiplier - (damping_multiplier*damping_multiplier) @@ -417,52 +394,6 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin return max( 0, firelevel) - -/mob/living/proc/FireBurn(firelevel, last_temperature, pressure) - var/mx = 5 * firelevel/zas_settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) - apply_damage(2.5*mx, BURN) - return mx - - -/mob/living/carbon/human/FireBurn(firelevel, last_temperature, pressure) - //Burns mobs due to fire. Respects heat transfer coefficients on various body parts. - //Due to TG reworking how fireprotection works, this is kinda less meaningful. - - var/head_exposure = 1 - var/chest_exposure = 1 - var/groin_exposure = 1 - var/legs_exposure = 1 - var/arms_exposure = 1 - - //Get heat transfer coefficients for clothing. - - for(var/obj/item/clothing/C in get_equipped_items()) - if( C.max_heat_protection_temperature >= last_temperature ) - if(C.body_parts_covered & HEAD) - head_exposure = 0 - if(C.body_parts_covered & CHEST) - chest_exposure = 0 - if(C.body_parts_covered & GROIN) - groin_exposure = 0 - if(C.body_parts_covered & LEGS) - legs_exposure = 0 - if(C.body_parts_covered & ARMS) - arms_exposure = 0 - //minimize this for low-pressure environments - var/mx = 5 * firelevel/zas_settings.fire_firelevel_multiplier * min(pressure / ONE_ATMOSPHERE, 1) - - //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. - - apply_damage(0.9*mx*head_exposure, BURN, BODY_ZONE_HEAD) - apply_damage(2.5*mx*chest_exposure, BURN, BODY_ZONE_CHEST) - apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_L_LEG) - apply_damage(0.6*mx*legs_exposure, BURN, BODY_ZONE_R_LEG) - apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_L_ARM) - apply_damage(0.4*mx*arms_exposure, BURN, BODY_ZONE_R_ARM) - - //return a truthy value of whether burning actually happened - return mx * (head_exposure + chest_exposure + groin_exposure + legs_exposure + arms_exposure) - /turf/proc/burn() burn_tile() var/chance_of_deletion @@ -477,22 +408,35 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin to_be_destroyed = FALSE -/turf/proc/adjacent_fire_act(turf/open/floor/source, datum/gas_mixture/adj_air, adj_temp, adj_volume) +/turf/var/fire_protection = 0 +/turf/proc/apply_fire_protection() + fire_protection = world.time + +/turf/open/space/apply_fire_protection() return -/turf/open/floor/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - var/dir_to = get_dir(src, adj_turf) +/turf/fire_act(exposed_temperature, exposed_volume, turf/adjacent) + return + +/turf/open/floor/fire_act(exposed_temperature, exposed_volume, turf/adjacent) + if(!adjacent) + return + + var/dir_to = get_dir(src, adjacent) for(var/obj/structure/window/W in src) if(W.dir == dir_to || W.fulltile) //Same direction or diagonal (full tile) - W.fire_act(adj_temp, adj_volume) + W.fire_act(exposed_temperature, exposed_volume, adjacent) -/turf/closed/wall/adjacent_fire_act(turf/open/floor/adj_turf, datum/gas_mixture/adj_air, adj_temp, adj_volume) - if(!uses_integrity) - burn(adj_temp) - else if (adj_temp > heat_capacity) - take_damage(log(Frand(0.9, 1.1) * (adj_temp - heat_capacity)), BURN) + for(var/obj/machinery/door/window/door in src) + if(door.dir == dir_to) //Same direction or diagonal (full tile) + door.fire_act(exposed_temperature, exposed_volume, adjacent) +/turf/closed/wall/fire_act(exposed_temperature, exposed_volume, turf/adjacent) + if(!uses_integrity) + burn(exposed_temperature) + else if (exposed_temperature > heat_capacity) + take_damage(log(Frand(0.9, 1.1) * (exposed_temperature - heat_capacity)), BURN) return ..() /obj/effect/dummy/lighting_obj/moblight/fire diff --git a/code/modules/atmospherics/ZAS/Plasma.dm b/code/modules/atmospherics/ZAS/Plasma.dm index 955171a4f990..693e989b7b84 100644 --- a/code/modules/atmospherics/ZAS/Plasma.dm +++ b/code/modules/atmospherics/ZAS/Plasma.dm @@ -35,10 +35,10 @@ GLOBAL_DATUM_INIT(contamination_overlay, /image, image('modular_pariah/master_fi if(rand(1, 100) < zas_settings.plc.eye_burns * exposed_amount) if(!is_eyes_covered()) var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(E && !(E.status == ORGAN_ROBOTIC)) + if(E && !(E.organ_flags & ORGAN_SYNTHETIC)) if(prob(20)) to_chat(src, span_warning("Your eyes burn!")) - E.applyOrganDamage(2.5) + E.applyOrganDamage(1) eye_blurry = min(eye_blurry+3,50) if (prob(max(0, E.damage - 15) + 1) && !eye_blind) to_chat(src, span_danger("You are blinded!")) diff --git a/code/modules/atmospherics/ZAS/Turf.dm b/code/modules/atmospherics/ZAS/Turf.dm index 29b5fee8eeac..136b571e2a74 100644 --- a/code/modules/atmospherics/ZAS/Turf.dm +++ b/code/modules/atmospherics/ZAS/Turf.dm @@ -19,13 +19,6 @@ var/tmp/verbose = FALSE #endif -///Adds the graphic_add list to vis_contents, removes graphic_remove. -/turf/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) - if(length(graphic_add)) - vis_contents += graphic_add - if(length(graphic_remove)) - vis_contents -= graphic_remove - ///Updates the turf's air source properties, breaking or creating zone connections as necessary. /turf/proc/update_air_properties() var/self_block @@ -124,8 +117,8 @@ if(!simulated) return ..() - if(!isnull(zone) && zone.invalid) //this turf's zone is in the process of being rebuilt - copy_zone_air() //not very efficient :( + if(zone?.invalid) //this turf's zone is in the process of being rebuilt + take_zone_air_share() //not very efficient :( zone = null //Easier than iterating through the list at the zone. var/self_block @@ -297,18 +290,19 @@ /turf/return_air() RETURN_TYPE(/datum/gas_mixture) if(!simulated) - if(!isnull(air)) + if(air) return air.copy() else make_air() return air.copy() - else if(!isnull(zone)) + else if(zone) if(!zone.invalid) SSzas.mark_zone_update(zone) return zone.air else - copy_zone_air() + take_zone_air_share() + zone = null return air else if(isnull(air)) @@ -319,17 +313,18 @@ /turf/unsafe_return_air() RETURN_TYPE(/datum/gas_mixture) if(!simulated) - if(!isnull(air)) + if(air) return air.copy() else make_air() return air.copy() - else if(!isnull(zone)) + else if(zone) if(!zone.invalid) return zone.air else - copy_zone_air() + take_zone_air_share() + zone = null return air else if(isnull(air)) @@ -340,17 +335,24 @@ /turf/proc/make_air() if(simulated) air = new/datum/gas_mixture - air.temperature = temperature if(initial_gas) air.gas = initial_gas.Copy() + air.temperature = temperature AIR_UPDATE_VALUES(air) else - if(!isnull(air)) + if(air) return air // Grab an existing mixture from the cache - var/gas_key = json_encode(initial_gas + temperature) + var/gas_key + if(isnull(initial_gas)) + gas_key = "VACUUM_ATMOS" + else + var/list/initial_gas_copy = initial_gas.Copy() + initial_gas_copy["temperature"] = temperature + gas_key = json_encode(initial_gas) + var/datum/gas_mixture/GM = SSzas.unsimulated_gas_cache[gas_key] if(GM) air = GM @@ -361,12 +363,15 @@ air = GM if(!isnull(initial_gas)) GM.gas = initial_gas.Copy() - GM.temperature = temperature + GM.temperature = temperature + else + GM.temperature = TCMB + AIR_UPDATE_VALUES(GM) SSzas.unsimulated_gas_cache[gas_key] = air ///Copies this turf's group share from the zone. Usually used before removing it from the zone. -/turf/proc/copy_zone_air() +/turf/proc/take_zone_air_share() if(isnull(air)) air = new/datum/gas_mixture air.copyFrom(zone.air) @@ -390,11 +395,11 @@ ///Checks a turf to see if any of it's contents are dense. Is NOT recursive. See also is_blocked_turf() /turf/proc/contains_dense_objects() if(density) - return 1 + return src for(var/atom/movable/A as anything in src) if(A.density && !(A.flags_1 & ON_BORDER_1)) - return 1 - return 0 + return A + return FALSE ///I literally don't know where this proc came from. /turf/proc/TryGetNonDenseNeighbour() @@ -411,5 +416,14 @@ adjacent_turfs += get_step(src, direct) return length(adjacent_turfs) ? adjacent_turfs : null +/turf/open/space/get_atmos_adjacent_turfs() + . = list() + for(var/direct in GLOB.cardinals) + var/turf/T = get_step(src, direct) + var/canpass + ATMOS_CANPASS_TURF(canpass, T, src) + if(!(canpass & (AIR_BLOCKED))) + . += T + /turf/open/return_analyzable_air() return unsafe_return_air() diff --git a/code/modules/atmospherics/ZAS/XGM/gas_data.dm b/code/modules/atmospherics/ZAS/XGM/gas_data.dm index 5b3387193a3b..5dc473cacf8a 100644 --- a/code/modules/atmospherics/ZAS/XGM/gas_data.dm +++ b/code/modules/atmospherics/ZAS/XGM/gas_data.dm @@ -54,7 +54,8 @@ GLOBAL_REAL(xgm_gas_data, /datum/xgm_gas_data) = new var/hidden_from_codex var/symbol_html = "X" var/symbol = "X" - var/base_value = 1 + /// The value of this gas per mol. + var/base_value = 0.02 var/purchaseable = FALSE /datum/xgm_gas_data/New() diff --git a/code/modules/atmospherics/ZAS/XGM/gases.dm b/code/modules/atmospherics/ZAS/XGM/gases.dm index 346c51046c9d..d1e80c904a38 100644 --- a/code/modules/atmospherics/ZAS/XGM/gases.dm +++ b/code/modules/atmospherics/ZAS/XGM/gases.dm @@ -42,7 +42,7 @@ symbol_html = "O2" symbol = "O2" purchaseable = TRUE - base_value = 0.2 + base_value = 0.04 /datum/xgm_gas/nitrogen id = GAS_NITROGEN @@ -53,7 +53,7 @@ symbol_html = "N2" symbol = "N2" purchaseable = TRUE - base_value = 0.1 + base_value = 0.02 /datum/xgm_gas/carbon_dioxide id = GAS_CO2 @@ -64,7 +64,7 @@ symbol_html = "CO2" symbol = "CO2" purchaseable = TRUE - base_value = 0.2 + base_value = 0.04 /datum/xgm_gas/sleeping_agent id = GAS_N2O @@ -77,7 +77,7 @@ //breathed_product = /datum/reagent/nitrous_oxide symbol_html = "N2O" symbol = "N2O" - base_value = 3 + base_value = 0.1 /datum/xgm_gas/vapor id = GAS_STEAM @@ -112,7 +112,7 @@ burn_product = GAS_CO2 symbol_html = "Ph" symbol = "Ph" - base_value = 2 + base_value = 1 //SM & R-UST GASES /datum/xgm_gas/hydrogen @@ -124,6 +124,8 @@ burn_product = GAS_STEAM symbol_html = "H2" symbol = "H2" + purchaseable = TRUE //Used as engine coolant. + base_value = 0.075 /datum/xgm_gas/hydrogen/deuterium id = GAS_DEUTERIUM @@ -160,7 +162,7 @@ symbol_html = "Ar" symbol = "Ar" purchaseable = TRUE - base_value = 0.2 + base_value = 0.035 // If narcosis is ever simulated, krypton has a narcotic potency seven times greater than regular airmix. /datum/xgm_gas/krypton @@ -172,7 +174,7 @@ symbol_html = "Kr" symbol = "Kr" purchaseable = TRUE - base_value = 0.2 + base_value = 0.035 /datum/xgm_gas/neon id = GAS_NEON @@ -183,7 +185,7 @@ symbol_html = "Ne" symbol = "Ne" purchaseable = TRUE - base_value = 0.2 + base_value = 0.035 /datum/xgm_gas/xenon id = GAS_XENON @@ -195,7 +197,7 @@ symbol_html = "Xe" symbol = "Xe" purchaseable = TRUE - base_value = 5 + base_value = 0.1 /datum/xgm_gas/boron id = GAS_BORON @@ -241,7 +243,7 @@ symbol_html = "Cl" symbol = "Cl" purchaseable = TRUE - base_value = 7 + base_value = 0.1 /datum/xgm_gas/radon id = GAS_RADON @@ -252,7 +254,7 @@ symbol_html = "Rn" symbol = "Rn" purchaseable = FALSE - base_value = 0.3 + base_value = 0.115 //MISC COMPOUNDS /datum/xgm_gas/methyl_bromide diff --git a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm index 344aa130485d..d48c52357436 100644 --- a/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm +++ b/code/modules/atmospherics/ZAS/XGM/xgm_gas_mixture.dm @@ -1,7 +1,7 @@ /datum/gas_mixture //Associative list of gas moles. //Gases with 0 moles are not tracked and are pruned by updateValues() - var/list/gas = list() + var/list/gas //Temperature in Kelvin of this gas mix. var/temperature = 0 @@ -12,12 +12,13 @@ //Size of the group this gas_mixture is representing. 1 for singular turfs. var/group_multiplier = 1 - //List of active tile overlays for this gas_mixture. Updated by checkTileGraphic() - var/list/graphic = list() + //Lazy list of active tile overlays for this gas_mixture. Updated by checkTileGraphic() + var/list/graphic //Cache of gas overlay objects var/list/tile_overlay_cache /datum/gas_mixture/New(_volume = CELL_VOLUME, _temperature = 0, _group_multiplier = 1) + gas = list() volume = _volume temperature = _temperature group_multiplier = _group_multiplier @@ -38,7 +39,7 @@ return if (group_multiplier != 1) - gas[gasid] += moles/group_multiplier + gas[gasid] += QUANTIZE(moles/group_multiplier) else gas[gasid] += moles @@ -234,9 +235,7 @@ for(var/g in gas) removed.gas[g] = QUANTIZE((gas[g] / total_moles) * amount) - gas[g] -= removed.gas[g] / group_multiplier - if(gas[g] <= ATMOS_PRECISION) //Removing floating point errors from the equation - gas -= g + gas[g] -= QUANTIZE(removed.gas[g] / group_multiplier) removed.temperature = temperature AIR_UPDATE_VALUES(src) @@ -257,8 +256,8 @@ removed.group_multiplier = out_group_multiplier for(var/g in gas) - removed.gas[g] = (gas[g] * ratio * group_multiplier / out_group_multiplier) - gas[g] = gas[g] * (1 - ratio) + removed.gas[g] = QUANTIZE((gas[g] * ratio * group_multiplier / out_group_multiplier)) + gas[g] = QUANTIZE(gas[g] * (1 - ratio)) removed.temperature = temperature removed.volume = volume * group_multiplier / out_group_multiplier @@ -288,7 +287,7 @@ for(var/g in gas) if(xgm_gas_data.flags[g] & flag) removed.gas[g] = QUANTIZE((gas[g] / sum) * amount) - gas[g] -= removed.gas[g] / group_multiplier + gas[g] = QUANTIZE(gas[g] - (removed.gas[g] / group_multiplier)) removed.temperature = temperature AIR_UPDATE_VALUES(src) @@ -304,17 +303,16 @@ . += gas[g] ///Copies gas and temperature from another gas_mixture. -/datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample, partial = 1) - var/list/cached_gas = gas - var/list/sample_gas = sample.gas.Copy() - - //remove all gases not in the sample - cached_gas &= sample_gas - +/datum/gas_mixture/proc/copyFrom(const/datum/gas_mixture/sample, ratio = 1) + gas = sample.gas.Copy() temperature = sample.temperature - for(var/id in sample_gas) - cached_gas[id] = sample_gas[id] * partial - AIR_UPDATE_VALUES(src) + if(ratio != 1) + var/list/cached_gas = gas + for(var/id in cached_gas) + cached_gas[id] = QUANTIZE(cached_gas[id] * ratio) + AIR_UPDATE_VALUES(src) + else + total_moles = sample.total_moles return 1 @@ -361,12 +359,13 @@ ///Rechecks the gas_mixture and adjusts the graphic list if needed. ///Two lists can be passed by reference if you need know specifically which graphics were added and removed. /datum/gas_mixture/proc/checkTileGraphic(list/graphic_add, list/graphic_remove) - if(length(graphic)) + if(LAZYLEN(graphic)) for(var/obj/effect/gas_overlay/O as anything in graphic) if(O.type == /obj/effect/gas_overlay/heat) continue if(gas[O.gas_id] <= xgm_gas_data.overlay_limit[O.gas_id]) LAZYADD(graphic_remove, O) + var/overlay_limit for(var/g in gas) overlay_limit = xgm_gas_data.overlay_limit[g] @@ -374,14 +373,17 @@ if(!isnull(overlay_limit) && gas[g] > overlay_limit) ///Inlined getTileOverlay(g) var/tile_overlay = LAZYACCESS(tile_overlay_cache, g) + if(isnull(tile_overlay)) LAZYSET(tile_overlay_cache, g, new/obj/effect/gas_overlay(null, g)) tile_overlay = tile_overlay_cache[g] + ///End inline if(!(tile_overlay in graphic)) LAZYADD(graphic_add, tile_overlay) . = 0 + var/tile_overlay = LAZYACCESS(tile_overlay_cache, "heat") //If it's hot add something if(temperature >= BODYTEMP_HEAT_DAMAGE_LIMIT) @@ -390,25 +392,27 @@ tile_overlay = tile_overlay_cache["heat"] if(!(tile_overlay in graphic)) LAZYADD(graphic_add, tile_overlay) - else if(length(graphic) && (tile_overlay in graphic)) + + else if(LAZYLEN(graphic) && (tile_overlay in graphic)) LAZYADD(graphic_remove, tile_overlay) //Apply changes if(length(graphic_add)) - graphic |= graphic_add + LAZYDISTINCTADD(graphic, graphic_add) . = 1 if(length(graphic_remove)) - graphic -= graphic_remove + LAZYREMOVE(graphic, graphic_remove) . = 1 - if(length(graphic)) + if(LAZYLEN(graphic)) var/pressure_mod = clamp(returnPressure() / ONE_ATMOSPHERE, 0, 2) for(var/obj/effect/gas_overlay/O as anything in graphic) - if(O.type == /obj/effect/gas_overlay/heat) //Heat based + if(istype(O, /obj/effect/gas_overlay/heat)) //Heat based var/new_alpha = clamp(max(125, 255 * ((temperature - BODYTEMP_HEAT_DAMAGE_LIMIT) / BODYTEMP_HEAT_DAMAGE_LIMIT * 4)), 125, 255) if(new_alpha != O.alpha) O.update_alpha_animation(new_alpha) continue + var/concentration_mod = clamp(gas[O.gas_id] / total_moles, 0.1, 1) var/new_alpha = min(240, round(pressure_mod * concentration_mod * 180, 5)) if(new_alpha != O.alpha) @@ -440,8 +444,7 @@ ///Multiply all gas amounts by a factor. /datum/gas_mixture/proc/multiply(factor) for(var/g in gas) - gas[g] *= factor - + gas[g] = QUANTIZE(gas[g] * factor) AIR_UPDATE_VALUES(src) return 1 @@ -449,7 +452,7 @@ ///Divide all gas amounts by a factor. /datum/gas_mixture/proc/divide(factor) for(var/g in gas) - gas[g] /= factor + gas[g] = QUANTIZE(gas[g] / factor) AIR_UPDATE_VALUES(src) return 1 @@ -477,7 +480,7 @@ avg_gas[g] += other.gas[g] * share_size for(var/g in avg_gas) - avg_gas[g] /= (size + share_size) + avg_gas[g] /= size + share_size var/temp_avg = 0 if(full_heat_capacity + s_full_heat_capacity) @@ -489,9 +492,9 @@ //WOOT WOOT TOUCH THIS AND YOU ARE A RETARD for(var/g in avg_gas) - gas[g] = max(0, (gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g]) + gas[g] = QUANTIZE(max(0, (gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g])) if(!one_way) - other.gas[g] = max(0, (other.gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g]) + other.gas[g] = QUANTIZE(max(0, (other.gas[g] - avg_gas[g]) * (1 - ratio) + avg_gas[g])) temperature = max(0, (temperature - temp_avg) * (1-ratio) + temp_avg) if(!one_way) @@ -516,9 +519,11 @@ if(M) return getMass()/M -//Yeah baby we're sinning today. ///Compares the contents of two mixtures to see if they are identical. -/datum/gas_mixture/proc/operator~=(datum/gas_mixture/other) +/datum/gas_mixture/proc/isEqual(datum/gas_mixture/other) + if(src.total_moles != other.total_moles) + return FALSE + if(src.temperature != other.temperature) return FALSE @@ -552,7 +557,7 @@ ///Returns a gas_mixture datum with identical contents. /datum/gas_mixture/proc/copy() RETURN_TYPE(/datum/gas_mixture) - AIR_UPDATE_VALUES(src) + //AIR_UPDATE_VALUES(src) var/datum/gas_mixture/new_gas = new(volume) new_gas.gas = src.gas.Copy() new_gas.temperature = src.temperature diff --git a/code/modules/atmospherics/ZAS/Zone.dm b/code/modules/atmospherics/ZAS/Zone.dm index 6f6f8beb49d9..15420d82cbb4 100644 --- a/code/modules/atmospherics/ZAS/Zone.dm +++ b/code/modules/atmospherics/ZAS/Zone.dm @@ -46,10 +46,6 @@ Class Procs: ///If a zone is "invalid" it will not process var/invalid = 0 var/list/contents = list() - ///All fire tiles in this zone - var/list/fire_tiles = list() - ///All physical sources of fire fuel in this zone - var/list/fuel_objs = list() ///Does SSzas need to update this zone? (SSzas.mark_zone_update(zone)) var/needs_update = 0 ///An associative list of edge_source = edge. Will contain instantiated turfs and zones. @@ -62,6 +58,8 @@ Class Procs: var/last_air_temperature = null ///The air list of last tick() VAR_PRIVATE/last_gas_list + /// An incrementing counter that keeps track of which air graphic cycle any sleeping procs may be in. + VAR_PRIVATE/processing_graphic_cycle = 0 /zone/New() SSzas.add_zone(src) @@ -83,14 +81,9 @@ Class Procs: add_tile_air(turf_air) T.zone = src contents.Add(T) - if(T.fire) - var/obj/effect/decal/cleanable/oil/fuel = locate() in T - fire_tiles.Add(T) - SSzas.active_fire_zones |= src - if(fuel) - fuel_objs += fuel - RegisterSignal(fuel, COMSIG_PARENT_QDELETING, PROC_REF(handle_fuel_del)) - T.update_graphic(air.graphic) + + if(air.graphic) + T.vis_contents += air.graphic if(T.atmos_sensitive_contents) if(isnull(atmos_sensitive_contents)) @@ -115,19 +108,19 @@ Class Procs: if(isnull(atmos_sensitive_contents)) SSzas.zones_with_sensitive_contents -= src - T.copy_zone_air() + T.take_zone_air_share() for(var/d in GLOB.cardinals) var/turf/other = get_step(T, d) other?.open_directions &= ~reverse_dir[d] contents.Remove(T) - fire_tiles.Remove(T) - if(T.fire) - var/obj/effect/decal/cleanable/oil/fuel = locate() in T - fuel_objs -= fuel + T.zone = null - T.update_graphic(graphic_remove = air.graphic) + + if(air.graphic) + T.vis_contents -= air.graphic + if(length(contents)) air.group_multiplier = length(contents) else @@ -143,11 +136,16 @@ Class Procs: #endif invalidate() + var/list/air_graphic = air.graphic // cache for sanic speed for(var/turf/T as anything in contents) if(!T.simulated) continue + into.add_turf(T) - T.update_graphic(graphic_remove = air.graphic) + // Remove old graphic + if(air_graphic) + T.vis_contents -= air_graphic + #ifdef ZASDBG T.dbg(zasdbgovl_merged) #endif @@ -178,15 +176,21 @@ Class Procs: if(invalid) return //Short circuit for explosions where rebuild is called many times over. + invalidate() + var/list/air_graphic = air.graphic // cache for sanic speed for(var/turf/T as anything in contents) if(!T.simulated) continue - T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + + if(air_graphic) + T.vis_contents -= air_graphic + #ifdef ZASDBG //T.dbg(invalid_zone) #endif + T.needs_air_update = 0 //Reset the marker so that it will be added to the list. SSzas.mark_for_update(T) @@ -202,24 +206,7 @@ Class Procs: ///Zone's process proc. /zone/proc/tick() - - #ifdef ZASDBG - var/clock = TICK_USAGE - #endif - - // Update fires. - if(air.temperature >= PHORON_FLASHPOINT && !length(fire_tiles) && length(contents) && !(src in SSzas.active_fire_zones) && air.check_combustability()) - var/turf/T = pick(contents) - T.create_fire(zas_settings.fire_firelevel_multiplier) - - #ifdef ZASDBG - SSzas.zonetime["update fires"] = TICK_USAGE_TO_MS(clock) - clock = TICK_USAGE - #endif - // Anything below this check only needs to be run if the zone's gas composition has changed. - - if(!isnull(last_gas_list) && (last_gas_list ~= air.gas) && (last_air_temperature == air.temperature)) return @@ -230,14 +217,19 @@ Class Procs: var/list/graphic_add = list() var/list/graphic_remove = list() if(air.checkTileGraphic(graphic_add, graphic_remove)) - for(var/turf/T as anything in contents) - T.update_graphic(graphic_add, graphic_remove) - - #ifdef ZASDBG - SSzas.zonetime["tile graphic"] = TICK_USAGE_TO_MS(clock) - clock = TICK_USAGE - #endif - + processing_graphic_cycle++ + spawn(-1) + var/this_cycle = processing_graphic_cycle + for(var/turf/T as anything in contents) + if(invalid || this_cycle != processing_graphic_cycle) + return + if(!(T.zone == src)) + continue + if(length(graphic_add)) + T.vis_contents += graphic_add + if(length(graphic_remove)) + T.vis_contents -= graphic_remove + CHECK_TICK ///Prints debug information to the given mob. Used by the "Zone Info" verb. Does not require ZASDBG compile define. /zone/proc/dbg_data(mob/M) @@ -263,7 +255,3 @@ Class Procs: to_chat(M, "Zone Edges: [zone_edges]") to_chat(M, "Unsimulated Edges: [space_edges] ([space_coefficient] connections)\n") - -///If fuel disappears from anything that isn't a fire burning it out, we gotta clear it's ref -/zone/proc/handle_fuel_del(datum/source) - fuel_objs -= source diff --git a/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm index 85803d4ede8b..2a63211b81bb 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/gas_reagents.dm @@ -6,7 +6,6 @@ metabolization_rate = 0.3 * REAGENTS_METABOLISM color = "#808080" taste_description = "sweetness" - ph = 5.8 chemical_flags = REAGENT_NO_RANDOM_RECIPE /datum/reagent/carbon_monoxide @@ -17,29 +16,31 @@ metabolization_rate = 0.3 * REAGENTS_METABOLISM chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/carbon_monoxide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/carbon_monoxide/affect_blood(mob/living/carbon/M, removed) + . = ..() var/warning_message var/warning_prob = 10 if(volume >= 3) warning_message = pick("extremely dizzy","short of breath","faint","confused") warning_prob = 15 - M.adjustOxyLoss(rand(10,20)) + M.adjustOxyLoss(rand(10,20), FALSE) + . = TRUE M.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2, override = TRUE) else if(volume >= 1.5) warning_message = pick("dizzy","short of breath","faint","momentarily confused") M.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2, override = TRUE) - M.adjustOxyLoss(rand(3,5)) + M.adjustOxyLoss(rand(3,5), FALSE) + . = TRUE else if(volume >= 0.25) warning_message = pick("a little dizzy","short of breath") warning_prob = 10 if(warning_message && prob(warning_prob)) to_chat(M, "You feel [warning_message].") - return ..() - -/datum/reagent/carbon_monoxide/on_mob_end_metabolize(mob/living/L) - . = ..() - L.clear_alert(ALERT_TOO_MUCH_CO2, clear_override = TRUE) +/datum/reagent/carbon_monoxide/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.clear_alert(ALERT_TOO_MUCH_CO2, clear_override = TRUE) /datum/reagent/toxin/boron name = "Boron" @@ -57,10 +58,11 @@ toxpwr = 2 taste_mult = 0 -/datum/reagent/toxin/radon/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/radon/affect_blood(mob/living/carbon/M, removed) . = ..() var/obj/item/organ/lungs/lungs = M.getorganslot(ORGAN_SLOT_LUNGS) - if(!istype(lungs, /obj/item/organ/lungs/ashwalker)) + if(isnull(lungs)) return - lungs.applyOrganDamage(2 * REAGENTS_EFFECT_MULTIPLIER) + lungs.applyOrganDamage(2 * removed, updating_health = FALSE) + return TRUE diff --git a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm index b06b9fd35b5f..ca4ad8fd258f 100644 --- a/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm +++ b/code/modules/atmospherics/ZAS/zas_extras/inflatable.dm @@ -8,29 +8,35 @@ /obj/item/inflatable/attack_self(mob/user, modifiers) if(!deploy_path) return - var/turf/T = get_turf(src) - if (isspaceturf(T)) - to_chat(user, span_warning("You cannot use \the [src] in open space.")) - return + user.dropItemToGround(src) + anchored = TRUE + add_fingerprint(user) user.visible_message( - span_notice("\The [user] starts inflating \an [src]."), - span_notice("You start inflating \the [src]."), - span_notice("You can hear rushing air."), + span_notice("\The [user] pulls the inflation cord on \the [src]."), + span_notice("You pull the inflation cord on \the [src]."), + span_hear("You can hear rushing air."), vision_distance = 5 ) - if (!do_after(user, time = 1 SECONDS)) + + addtimer(CALLBACK(src, PROC_REF(inflate), user), 2 SECONDS) + +/obj/item/inflatable/proc/inflate(mob/user) + var/turf/T = get_turf(src) + if(!T) + anchored = FALSE + visible_message(span_notice("\The [src] fails to inflate here.")) + return + if(T.contains_dense_objects()) + anchored = FALSE + visible_message(span_notice("\The [src] is blocked and fails to inflate.")) return - user.visible_message( - span_notice("\The [user] finishes inflating \an [src]."), - span_notice("You inflate \the [src]."), - vision_distance = 5 - ) playsound(loc, 'sound/items/zip.ogg', 75, 1) var/obj/structure/inflatable/R = new deploy_path(T) transfer_fingerprints_to(R) - R.add_fingerprint(user) + if(user) + R.add_fingerprint(user) update_integrity(R.get_integrity()) qdel(src) @@ -46,6 +52,12 @@ icon_state = "folded_door" deploy_path = /obj/structure/inflatable/door +/obj/item/inflatable/shelter + name = "inflatable shelter" + desc = "A special plasma shelter designed to resist great heat and temperatures so that victims can survive until rescue." + icon_state = "folded" + deploy_path = /obj/structure/inflatable/shelter + /obj/structure/inflatable name = "inflatable" desc = "An inflated membrane. Do not puncture." @@ -238,7 +250,7 @@ /obj/structure/inflatable/door/proc/Open() isSwitchingStates = 1 - flick("door_opening",src) + z_flick("door_opening",src) addtimer(CALLBACK(src, PROC_REF(FinishOpen)), 1 SECONDS, TIMER_STOPPABLE) /obj/structure/inflatable/door/proc/FinishOpen() @@ -257,7 +269,7 @@ return isSwitchingStates = 1 - flick("door_closing",src) + z_flick("door_closing",src) addtimer(CALLBACK(src, PROC_REF(FinishClose)), 1 SECONDS, TIMER_STOPPABLE) /obj/structure/inflatable/door/proc/FinishClose() @@ -290,6 +302,107 @@ src.transfer_fingerprints_to(R) qdel(src) +//inflatable shelters from vg +/obj/structure/inflatable/shelter + name = "inflatable shelter" + density = TRUE + anchored = FALSE + opacity = 0 + can_buckle = TRUE + icon_state = "shelter_base" + undeploy_path = /obj/item/inflatable/shelter + var/list/exiting = list() + var/datum/gas_mixture/cabin_air + +/obj/structure/inflatable/shelter/Initialize() + . = ..() + cabin_air = new + cabin_air.volume = CELL_VOLUME / 3 + cabin_air.temperature = T20C + 20 + cabin_air.adjustMultipleGases( + GAS_OXYGEN, MOLES_O2STANDARD, + GAS_NITROGEN, MOLES_N2STANDARD) + +/obj/structure/inflatable/shelter/examine(mob/user) + . = ..() + . += span_notice("Click to enter. Use grab on shelter to force target inside. Use resist to exit. Right click to deflate.") + var/list/living_contents = list() + for(var/mob/living/L in contents) + living_contents += L.name + if(length(living_contents)) + . += span_notice("You can see [english_list(living_contents)] inside.") + +/obj/structure/inflatable/shelter/attack_hand(mob/user) + if(!isturf(user.loc)) + to_chat(user, span_warning("You can't climb into \the [src] from here!")) + return FALSE + user.visible_message(span_notice("[user] begins to climb into \the [src]."), span_notice("You begin to climb into \the [src].")) + if(do_after(user, src, 3 SECONDS)) + enter_shelter(user) + +/obj/structure/inflatable/shelter/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) + if(!in_range(user, src) || !in_range(M, src)) + return FALSE + if(!isturf(user.loc) || !isturf(M.loc)) + return FALSE + if(do_after(user, src, 3 SECONDS, DO_PUBLIC, display = src)) + if(!in_range(M, src) || !isturf(M.loc)) + return FALSE //in case the target has moved + enter_shelter(M) + return + +/obj/structure/inflatable/shelter/Destroy() + for(var/atom/movable/AM as anything in src) + AM.forceMove(loc) + qdel(cabin_air) + cabin_air = null + exiting = null + return ..() + +/obj/structure/inflatable/shelter/remove_air(amount) + return cabin_air.remove(amount) + +/obj/structure/inflatable/shelter/return_air() + return cabin_air + +/obj/structure/inflatable/shelter/proc/enter_shelter(mob/user) + user.forceMove(src) + update_icon() + user.visible_message(span_notice("[user] enters \the [src]."), span_notice("You enter \the [src].")) + RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(remove_vis)) + +/obj/structure/inflatable/shelter/proc/remove_vis(mob/user, force) + vis_contents.Remove(user) + +/obj/structure/inflatable/shelter/container_resist_act(mob/living/user) + if (user.loc != src) + exiting -= user + to_chat(user, span_warning("You cannot climb out of something you aren't even in!")) + return + if(user in exiting) + exiting -= user + to_chat(user, span_warning("You stop climbing free of \the [src].")) + return + user.visible_message(span_notice("[user] starts climbing out of \the [src]."), span_notice("You start climbing out of \the [src].")) + exiting += user + + if(do_after(user, src, 5 SECONDS)) + if (user in exiting) + user.forceMove(get_turf(src)) + update_icon() + exiting -= user + UnregisterSignal(user, COMSIG_PARENT_QDELETING) + user.visible_message(span_notice("[user] climbs out of \the [src]."), span_notice("You climb out of \the [src].")) + + +/obj/structure/inflatable/shelter/update_overlays() + . = ..() + vis_contents.Cut() + for(var/mob/living/L in contents) + vis_contents.Add(L) + if(length(contents)) + . += mutable_appearance(icon, "shelter_top", ABOVE_MOB_LAYER) + /obj/item/inflatable/torn name = "torn inflatable wall" desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable." @@ -297,7 +410,7 @@ icon_state = "folded_wall_torn" /obj/item/inflatable/torn/attack_self(mob/user) - to_chat(user, "The inflatable wall is too torn to be inflated!") + to_chat(user, span_notice("The inflatable wall is too torn to be inflated!")) add_fingerprint(user) /obj/item/inflatable/door/torn @@ -307,19 +420,19 @@ icon_state = "folded_door_torn" /obj/item/inflatable/door/torn/attack_self(mob/user) - to_chat(user, "The inflatable door is too torn to be inflated!") + to_chat(user, span_notice("The inflatable door is too torn to be inflated!")) add_fingerprint(user) /obj/item/storage/briefcase/inflatable - name = "inflatable barrier box" - desc = "Contains inflatable walls and doors. THE SPRITE IS A PLACEHOLDER, OKAY?" + name = "inflatable barrier case" + desc = "A carrying case for inflatable walls and doors." + icon_state = "inflatable" w_class = WEIGHT_CLASS_NORMAL max_integrity = 150 force = 8 hitsound = SFX_SWING_HIT - throw_speed = 2 throw_range = 4 - var/startswith = list(/obj/item/inflatable/door = 2, /obj/item/inflatable/wall = 3) + var/startswith = list(/obj/item/inflatable/door = 2, /obj/item/inflatable/wall = 4) /obj/item/storage/briefcase/inflatable/Initialize() . = ..() diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index 7d84ffb01098..05b0ce7d7b8c 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -74,6 +74,7 @@ +DEFINE_INTERACTABLE(/obj/machinery/airalarm) /obj/machinery/airalarm name = "air alarm" desc = "A machine that monitors atmosphere levels. Goes off if the area is dangerous." @@ -85,7 +86,7 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 0.33 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 90, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 90, ACID = 30) resistance_flags = FIRE_PROOF zmm_flags = ZMM_MANGLE_PLANES @@ -150,6 +151,7 @@ /obj/machinery/airalarm/Initialize(mapload, ndir, nbuild) . = ..() + SET_TRACKING(__TYPE__) wires = new /datum/wires/airalarm(src) if(ndir) setDir(ndir) @@ -179,6 +181,7 @@ set_area(get_area(src)) /obj/machinery/airalarm/Destroy() + UNSET_TRACKING(__TYPE__) set_area(null) SSpackets.remove_object(src, frequency) SSairmachines.stop_processing_machine(src) @@ -211,8 +214,6 @@ . += span_notice("It is missing air alarm electronics.") if(AIRALARM_BUILD_NO_WIRES) . += span_notice("It is missing wiring.") - if(AIRALARM_BUILD_COMPLETE) - . += span_notice("Right-click to [locked ? "unlock" : "lock"] the interface.") /obj/machinery/airalarm/ui_status(mob/user) if(user.has_unlimited_silicon_privilege && aidisabled) @@ -673,7 +674,7 @@ . += mutable_appearance(icon, state) . += emissive_appearance(icon, state, alpha = src.alpha) -/obj/machinery/airalarm/fire_act(exposed_temperature, exposed_volume) +/obj/machinery/airalarm/fire_act(exposed_temperature, exposed_volume, turf/adjacent) . = ..() if(!danger_level) check_air_dangerlevel(loc.unsafe_return_air()) @@ -863,6 +864,7 @@ else if(panel_open && is_wire_tool(W)) wires.interact(user) return + if(AIRALARM_BUILD_NO_WIRES) if(istype(W, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/cable = W @@ -905,6 +907,20 @@ return ..() +/obj/machinery/airalarm/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!can_interact(user)) + return + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH) || !isturf(loc)) + return + if(!ishuman(user)) + return + + togglelock(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + /obj/machinery/airalarm/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) if((buildstage == AIRALARM_BUILD_NO_CIRCUIT) && (the_rcd.upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)) return list("mode" = RCD_UPGRADE_SIMPLE_CIRCUITS, "delay" = 20, "cost" = 1) @@ -920,20 +936,11 @@ return TRUE return FALSE -/obj/machinery/airalarm/attack_hand_secondary(mob/user, list/modifiers) - . = ..() - if(!can_interact(user)) - return - if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) - return - togglelock(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - /obj/machinery/airalarm/proc/togglelock(mob/living/user) if(machine_stat & (NOPOWER|BROKEN)) to_chat(user, span_warning("It does nothing!")) else - if(src.allowed(usr) && !wires.is_cut(WIRE_IDSCAN)) + if(allowed(user) && !wires.is_cut(WIRE_IDSCAN)) locked = !locked to_chat(user, span_notice("You [ locked ? "lock" : "unlock"] the air alarm interface.")) if(!locked) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 9b65d1454829..2e27df677ca1 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -19,7 +19,7 @@ layer = GAS_PIPE_HIDDEN_LAYER //under wires resistance_flags = FIRE_PROOF max_integrity = 200 - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT var/power_rating @@ -76,6 +76,7 @@ if(HAS_TRAIT(L, TRAIT_VENTCRAWLER_NUDE) || HAS_TRAIT(L, TRAIT_VENTCRAWLER_ALWAYS)) . += span_notice("Alt-click to crawl through it.") +GLOBAL_REAL_VAR(atmos_machinery_default_armor) = list(BLUNT = 25, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 100, ACID = 70) /obj/machinery/atmospherics/New(loc, process = TRUE, setdir, init_dir = ALL_CARDINALS) if(!isnull(setdir)) setDir(setdir) @@ -83,18 +84,25 @@ normalize_cardinal_directions() nodes = new(device_type) if (!armor) - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 100, ACID = 70) + armor = global.atmos_machinery_default_armor ..() + if(process) SSairmachines.start_processing_machine(src) set_init_directions(init_dir) /obj/machinery/atmospherics/Initialize(mapload) + #ifdef DEBUG_MAPS + ::atmospherics += src + #endif + if(mapload && name != initial(name)) override_naming = TRUE + var/turf/turf_loc = null if(isturf(loc)) turf_loc = loc + turf_loc.add_blueprints_preround(src) SSspatial_grid.add_grid_awareness(src, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) SSspatial_grid.add_grid_membership(src, turf_loc, SPATIAL_GRID_CONTENTS_TYPE_ATMOS) return ..() @@ -109,6 +117,9 @@ if(pipe_vision_img) qdel(pipe_vision_img) + #ifdef DEBUG_MAPS + ::atmospherics -= src + #endif return ..() //return QDEL_HINT_FINDREFERENCE diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 56718ef6d624..eb370e5f2fc2 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -32,7 +32,7 @@ var/active = FALSE -/obj/machinery/atmospherics/components/binary/circulator/New() +/obj/machinery/atmospherics/components/binary/circulator/Initialize() . = ..() airs[2].volume = 400 //The input has a larger volume than the output @@ -67,7 +67,7 @@ last_pressure_delta = max(input_starting_pressure - output_starting_pressure - 5, 0) //only circulate air if there is a pressure difference (plus 5kPa kinetic, 10kPa static friction) - if(air1.temperature > 0 && last_pressure_delta > 5) + if(parents[1] && last_pressure_delta > 5) //Calculate necessary moles to transfer using PV = nRT recent_moles_transferred = (last_pressure_delta*input_pipeline.combined_volume/(air2.temperature * R_IDEAL_GAS_EQUATION))/3 //uses the volume of the whole network, not just itself 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 0c3a7b8d4562..4307a6456d13 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 @@ -20,7 +20,7 @@ hide = TRUE initial_volume = ATMOS_DEFAULT_VOLUME_PUMP ///Variable for radio frequency - var/frequency = 0 + var/frequency = FREQ_ATMOS_CONTROL ///Variable for radio id var/id = null ///Stores the radio connection @@ -36,10 +36,31 @@ ///Set the flag for the pressure bound var/pressure_checks = EXT_BOUND + var/radio_filter_in + var/radio_filter_out + +/obj/machinery/atmospherics/components/binary/dp_vent_pump/Initialize(mapload) + if(!id_tag) + id_tag = SSpackets.generate_net_id(src) + . = ..() + /obj/machinery/atmospherics/components/binary/dp_vent_pump/Destroy() + var/area/vent_area = get_area(src) + if(vent_area) + vent_area.air_vent_info -= id_tag + GLOB.air_vent_names -= id_tag + SSpackets.remove_object(src, frequency) + radio_connection = null return ..() +/obj/machinery/atmospherics/components/binary/dp_vent_pump/update_name() + . = ..() + if(override_naming) + return + var/area/vent_area = get_area(src) + name = "\proper [vent_area.name] [name] [id_tag]" + /obj/machinery/atmospherics/components/binary/dp_vent_pump/update_icon_nopipes() cut_overlays() if(showpipe) @@ -122,7 +143,7 @@ SSpackets.remove_object(src, frequency) frequency = new_frequency if(frequency) - radio_connection = SSpackets.add_object(src, frequency, filter = RADIO_ATMOSIA) + radio_connection = SSpackets.add_object(src, frequency, radio_filter_in) /** * Called in atmos_init(), send the component status to the radio device connected @@ -142,18 +163,31 @@ "external" = external_pressure_bound, "sigtype" = "status" )) - radio_connection.post_signal(signal, filter = RADIO_ATMOSIA) + + var/area/vent_area = get_area(src) + if(!GLOB.air_vent_names[id_tag]) + update_name() + GLOB.air_vent_names[id_tag] = name + + vent_area.air_vent_info[id_tag] = signal.data + radio_connection.post_signal(signal, filter = radio_filter_out) /obj/machinery/atmospherics/components/binary/dp_vent_pump/atmos_init() - ..() + radio_filter_in = frequency==FREQ_ATMOS_CONTROL?(RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==FREQ_ATMOS_CONTROL?(RADIO_TO_AIRALARM):null if(frequency) set_frequency(frequency) broadcast_status() + ..() /obj/machinery/atmospherics/components/binary/dp_vent_pump/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return + if(("status" in signal.data)) //Send stauts and early return, I'm cargoculting the timer here. + broadcast_status() + return + if("power" in signal.data) on = text2num(signal.data["power"]) @@ -184,9 +218,9 @@ external_pressure_bound = clamp(text2num(signal.data["set_external_pressure"]),0,MAX_PUMP_PRESSURE) addtimer(CALLBACK(src, PROC_REF(broadcast_status)), 2) + update_appearance() + - if(!("status" in signal.data)) //do not update_appearance - update_appearance() /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume name = "large dual-port air vent" @@ -223,10 +257,6 @@ id = INCINERATOR_ATMOS_DP_VENTPUMP frequency = FREQ_AIRLOCK_CONTROL -/obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_syndicatelava - id = INCINERATOR_SYNDICATELAVA_DP_VENTPUMP - frequency = FREQ_AIRLOCK_CONTROL - /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/layer2 piping_layer = 2 icon_state = "dpvent_map-2" diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 9962500af342..4852cc3cdae1 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -26,7 +26,7 @@ Passive gate is similar to the regular pump except: ///Stores the radio connection var/datum/radio_frequency/radio_connection -/obj/machinery/atmospherics/components/binary/passive_gate/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/passive_gate/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -144,6 +144,10 @@ Passive gate is similar to the regular pump except: if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return + if("status" in signal.data) + broadcast_status() + return + var/old_on = on //for logging if("power" in signal.data) @@ -158,10 +162,6 @@ Passive gate is similar to the regular pump except: 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_appearance() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index 115a37e04f09..e091fc3d8059 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -23,7 +23,7 @@ ///Which side is the valve regulating? var/regulate_mode = REGULATE_OUTPUT -/obj/machinery/atmospherics/components/binary/pressure_valve/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/pressure_valve/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -174,6 +174,10 @@ if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return + if("status" in signal.data) + broadcast_status() + return + var/old_on = on //for logging if("power" in signal.data) @@ -188,10 +192,6 @@ 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_appearance() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 68f803abe73b..27d95f7d7e17 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -39,7 +39,7 @@ /obj/item/circuit_component/atmos_pump, )) -/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/pump/CtrlClick(mob/user, list/params) if(can_interact(user)) set_on(!on) investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -153,6 +153,10 @@ if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return + if("status" in signal.data) + broadcast_status() + return + var/old_on = on //for logging if("power" in signal.data) @@ -167,10 +171,6 @@ 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_appearance() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm index 98ef842b0e8e..bebadfd3c98a 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -17,7 +17,7 @@ ///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) +/obj/machinery/atmospherics/components/binary/temperature_gate/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm index 425ed4b25bce..dc570ffcb1fd 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_pump.dm @@ -12,7 +12,7 @@ ///Maximum allowed transfer percentage var/max_heat_transfer_rate = 100 -/obj/machinery/atmospherics/components/binary/temperature_pump/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/temperature_pump/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) 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 013a741c9ea3..1bab358d3aeb 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -39,7 +39,7 @@ /obj/item/circuit_component/atmos_volume_pump, )) -/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/binary/volume_pump/CtrlClick(mob/user, list/params) if(can_interact(user)) set_on(!on) investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -165,6 +165,10 @@ if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) return + if("status" in signal.data) + broadcast_status() + return //do not update_appearance + var/old_on = on //for logging if("power" in signal.data) @@ -180,9 +184,7 @@ 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 //do not update_appearance + broadcast_status() update_appearance() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index 0d20003acdbb..f3842e70dda1 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -19,19 +19,15 @@ ///Handles whether the custom reconcilation handling should be used var/custom_reconcilation = FALSE -/obj/machinery/atmospherics/components/New() +/obj/machinery/atmospherics/components/Initialize(mapload) parents = new(device_type) airs = new(device_type) - - ..() - for(var/i in 1 to device_type) if(airs[i]) continue var/datum/gas_mixture/component_mixture = new(initial_volume) airs[i] = component_mixture -/obj/machinery/atmospherics/components/Initialize(mapload) . = ..() if(hide) diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index 82e39ac7139b..4877d3bb50f7 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -21,8 +21,8 @@ custom_reconcilation = TRUE smoothing_flags = SMOOTH_CORNERS | SMOOTH_OBJ - smoothing_groups = list(SMOOTH_GROUP_GAS_TANK) - canSmoothWith = list(SMOOTH_GROUP_GAS_TANK) + smoothing_groups = SMOOTH_GROUP_GAS_TANK + canSmoothWith = SMOOTH_GROUP_GAS_TANK appearance_flags = KEEP_TOGETHER|LONG_GLIDE greyscale_config = /datum/greyscale_config/stationary_canister diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 73b1a8d6f765..37feeb3ef95e 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -22,7 +22,7 @@ //Last power draw, for the progress bar in the UI var/last_power_draw = 0 -/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/trinary/filter/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -206,7 +206,7 @@ icon_state = "filter_on-0" /obj/machinery/atmospherics/components/trinary/filter/atmos/n2 name = "nitrogen filter" - filter_type = list(GAS_N2O) + filter_type = list(GAS_NITROGEN) /obj/machinery/atmospherics/components/trinary/filter/atmos/o2 name = "oxygen filter" filter_type = list(GAS_OXYGEN) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index cbcdded1ffdd..8ad21db4f41e 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -22,7 +22,7 @@ var/last_power_draw = 0 -/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/trinary/mixer/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) @@ -49,8 +49,8 @@ var/on_state = on && nodes[1] && nodes[2] && nodes[3] && is_operational icon_state = "mixer_[on_state ? "on" : "off"]-[set_overlay_offset(piping_layer)][flipped ? "_f" : ""]" -/obj/machinery/atmospherics/components/trinary/mixer/New() - ..() +/obj/machinery/atmospherics/components/trinary/mixer/Initialize() + . = ..() var/datum/gas_mixture/air3 = airs[3] air3.volume = 300 airs[3] = air3 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 91e7cad843bc..15b7bf488255 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -16,7 +16,7 @@ // Must be tall, otherwise the filter will consider this as a 32x32 tile // and will crop the head off. icon_state = "mask_bg" - layer = ABOVE_MOB_LAYER + layer = MOB_LAYER + 0.01 //Why is this required? I don't know mouse_opacity = MOUSE_OPACITY_TRANSPARENT pixel_y = 22 appearance_flags = KEEP_TOGETHER @@ -69,7 +69,7 @@ icon_state = "pod-off" density = TRUE max_integrity = 350 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 30, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 30, ACID = 30) layer = MOB_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube @@ -83,7 +83,6 @@ showpipe = FALSE - var/autoeject = TRUE var/volume = 100 var/efficiency = 1 @@ -125,10 +124,17 @@ occupant_vis = new(null, src) vis_contents += occupant_vis if(airs[1]) - airs[1].volume = CELL_VOLUME * 0.5 + airs[1].volume = 200 /obj/machinery/atmospherics/components/unary/cryo_cell/set_occupant(atom/movable/new_occupant) + var/mob/living/occupant_mob = occupant + if(occupant_mob) + occupant_mob.SetSleeping(10) . = ..() + occupant_mob = occupant + if(occupant_mob) + occupant_mob.PermaSleeping() + update_appearance() /obj/machinery/atmospherics/components/unary/cryo_cell/on_construction() @@ -168,16 +174,16 @@ /obj/machinery/atmospherics/components/unary/cryo_cell/contents_explosion(severity, target) . = ..() - if(!beaker) + if(QDELETED(beaker)) return switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += beaker + EX_ACT(beaker, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += beaker + EX_ACT(beaker, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += beaker + EX_ACT(beaker, EXPLODE_LIGHT) /obj/machinery/atmospherics/components/unary/cryo_cell/handle_atom_del(atom/A) ..() @@ -208,10 +214,6 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics return . += (on && is_operational) ? GLOB.cryo_overlay_cover_on : GLOB.cryo_overlay_cover_off -/obj/machinery/atmospherics/components/unary/cryo_cell/nap_violation(mob/violator) - open_machine() - - /obj/machinery/atmospherics/components/unary/cryo_cell/set_on(active) if(on == active) return @@ -243,26 +245,17 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics var/mob/living/mob_occupant = occupant if(mob_occupant.on_fire) mob_occupant.extinguish_mob() - if(!check_nap_violations()) - return if(mob_occupant.stat == DEAD) // We don't bother with dead people. return - if(mob_occupant.get_organic_health() >= mob_occupant.getMaxHealth()) // Don't bother with fully healed people. - set_on(FALSE) - playsound(src, 'sound/machines/cryo_warning.ogg', volume) // Bug the doctors. - var/msg = "Patient fully restored." - if(autoeject) // Eject if configured. - msg += " Auto ejecting patient now." - open_machine() - radio.talk_into(src, msg, radio_channel) - return + + if (prob(2)) + to_chat(mob_occupant, span_boldnotice("... [pick("floating", "cold")] ...")) var/datum/gas_mixture/air1 = airs[1] if(air1.total_moles > CRYO_MIN_GAS_MOLES) if(beaker) beaker.reagents.trans_to(occupant, (CRYO_TX_QTY / (efficiency * CRYO_MULTIPLY_FACTOR)) * delta_time, efficiency * CRYO_MULTIPLY_FACTOR, methods = VAPOR) // Transfer reagents. - consume_gas = TRUE return TRUE /obj/machinery/atmospherics/components/unary/cryo_cell/process_atmos() @@ -272,49 +265,16 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics return var/datum/gas_mixture/air1 = airs[1] + if(air1.temperature > 2000) + take_damage(clamp((air1.temperature)/200, 10, 20), BURN) - /* PARIAH EDIT REMOVAL - HUGBOX BARGAGE - if(!nodes[1] || !airs[1] || !air1.gas.len || air1.get_moles() < CRYO_MIN_GAS_MOLES) // Turn off if the machine won't work. - var/msg = "Insufficient cryogenic gas, shutting down." - radio.talk_into(src, msg, radio_channel) - set_on(FALSE) - return - */ - - if(occupant) - var/mob/living/mob_occupant = occupant - var/cold_protection = 0 - var/temperature_delta = air1.temperature - mob_occupant.bodytemperature // The only semi-realistic thing here: share temperature between the cell and the occupant. - - if(ishuman(mob_occupant)) - var/mob/living/carbon/human/H = mob_occupant - cold_protection = H.get_cold_protection(air1.temperature) - - if(abs(temperature_delta) > 1) - var/air_heat_capacity = air1.getHeatCapacity() - - var/heat = ((1 - cold_protection) * 0.1 + conduction_coefficient) * temperature_delta * (air_heat_capacity * heat_capacity / (air_heat_capacity + heat_capacity)) - - air1.temperature = clamp(air1.temperature - heat / air_heat_capacity, TCMB, MAX_TEMPERATURE) - mob_occupant.adjust_bodytemperature(heat / heat_capacity, TCMB) - - //lets have the core temp match the body temp in humans - if(ishuman(mob_occupant)) - var/mob/living/carbon/human/humi = mob_occupant - humi.adjust_coretemperature(humi.bodytemperature - humi.coretemperature) + update_parents() - if(air1.temperature > 2000) - take_damage(clamp((air1.temperature)/200, 10, 20), BURN) +/obj/machinery/atmospherics/components/unary/cryo_cell/return_air() + return airs[1] - update_parents() - -/obj/machinery/atmospherics/components/unary/cryo_cell/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) - - if(breath_request <= 0) - return null - var/datum/gas_mixture/air1 = airs[1] - var/breath_percentage = breath_request / air1.volume - return air1.remove(air1.total_moles * breath_percentage) +/obj/machinery/atmospherics/components/unary/cryo_cell/return_breathable_air() + return loc?.return_air() /obj/machinery/atmospherics/components/unary/cryo_cell/assume_air(datum/gas_mixture/giver) airs[1].merge(giver) @@ -330,13 +290,13 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics for(var/mob/M in contents) //only drop mobs M.forceMove(get_turf(src)) set_occupant(null) - flick("pod-open-anim", src) + z_flick("pod-open-anim", src) ..() /obj/machinery/atmospherics/components/unary/cryo_cell/close_machine(mob/living/carbon/user) treating_wounds = FALSE if((isnull(user) || istype(user)) && state_open && !panel_open) - flick("pod-close-anim", src) + z_flick("pod-close-anim", src) ..(user) return occupant @@ -363,13 +323,11 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics else . += "[src] seems empty." -/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDrop_T(mob/target, mob/user) +/obj/machinery/atmospherics/components/unary/cryo_cell/MouseDroppedOn(mob/target, mob/user) if(user.incapacitated() || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !ISADVANCEDTOOLUSER(user)) return if(isliving(target)) - var/mob/living/L = target - if(L.incapacitated()) - close_machine(target) + close_machine(target) else user.visible_message(span_notice("[user] starts shoving [target] inside [src]."), span_notice("You start shoving [target] inside [src].")) if (do_after(user, target, 2.5 SECONDS)) @@ -428,7 +386,6 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics data["isOperating"] = on data["hasOccupant"] = occupant ? TRUE : FALSE data["isOpen"] = state_open - data["autoEject"] = autoeject data["occupant"] = list() if(occupant) @@ -436,12 +393,13 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics data["occupant"]["name"] = mob_occupant.name switch(mob_occupant.stat) if(CONSCIOUS) - data["occupant"]["stat"] = "Conscious" - data["occupant"]["statstate"] = "good" - if(SOFT_CRIT) - data["occupant"]["stat"] = "Conscious" - data["occupant"]["statstate"] = "average" - if(UNCONSCIOUS, HARD_CRIT) + if(!HAS_TRAIT(mob_occupant, TRAIT_SOFT_CRITICAL_CONDITION)) + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "good" + else + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "average" + if(UNCONSCIOUS) data["occupant"]["stat"] = "Unconscious" data["occupant"]["statstate"] = "average" if(DEAD) @@ -490,9 +448,6 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics else open_machine() . = TRUE - if("autoeject") - autoeject = !autoeject - . = TRUE if("ejectbeaker") if(beaker) beaker.forceMove(drop_location()) @@ -504,7 +459,7 @@ GLOBAL_VAR_INIT(cryo_overlay_cover_off, mutable_appearance('icons/obj/cryogenics /obj/machinery/atmospherics/components/unary/cryo_cell/can_interact(mob/user) return ..() && user.loc != src -/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/unary/cryo_cell/CtrlClick(mob/user, list/params) if(can_interact(user) && !state_open) set_on(!on) return ..() 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 64f30e857671..c2f6056f1700 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -20,7 +20,7 @@ ///Rate of operation of the device var/volume_rate = 50 -/obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user) +/obj/machinery/atmospherics/components/unary/outlet_injector/CtrlClick(mob/user, list/params) if(can_interact(user)) on = !on investigate_log("was turned [on ? "on" : "off"] by [key_name(user)]", INVESTIGATE_ATMOS) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm index d5eada4e73f8..48aff5005c39 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/portables_connector.dm @@ -18,7 +18,7 @@ ///Reference to the connected device var/obj/machinery/portable_atmospherics/connected_device -/obj/machinery/atmospherics/components/unary/portables_connector/New() +/obj/machinery/atmospherics/components/unary/portables_connector/Initialize(mapload) . = ..() var/datum/gas_mixture/air_contents = airs[1] air_contents.volume = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index de0e475cfd33..4c84d3b3e3cb 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -10,7 +10,7 @@ density = TRUE max_integrity = 300 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 80, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 80, ACID = 30) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine @@ -34,6 +34,8 @@ var/max_power_rating = 20000 ///Percentage of power rating to use var/power_setting = 20 // Start at 20 so we don't obliterate the station power supply. + /// How much gussy we can store in liters, this is affected by refresh_parts() + var/internal_volume = 400 var/interactive = TRUE // So mapmakers can disable interaction. var/color_index = 1 @@ -73,9 +75,14 @@ for(var/obj/item/stock_parts/manipulator/man in component_parts) manip_rating += man.rating - max_power_rating = initial(max_power_rating) * cap_rating / 2 //more powerful + max_power_rating = initial(max_power_rating) * (cap_rating / 2) //more powerful + internal_volume = initial(internal_volume) + (200 * bin_rating) //more air heatsink_temperature = initial(heatsink_temperature) / ((manip_rating + bin_rating) / 2) //more efficient set_power_level(power_setting) + if(airs[1]) + airs[1].volume = internal_volume + else + airs[1] = new /datum/gas_mixture(200) /obj/machinery/atmospherics/components/unary/thermomachine/update_icon_state() var/colors_to_use = "" 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 85be4255430e..79581bf2a7c7 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -13,7 +13,7 @@ desc = "Has a valve and pump attached to it." use_power = IDLE_POWER_USE - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.15 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 can_unwrench = TRUE welded = FALSE layer = GAS_SCRUBBER_LAYER @@ -47,12 +47,15 @@ var/can_hibernate = TRUE -/obj/machinery/atmospherics/components/unary/vent_pump/New() +/obj/machinery/atmospherics/components/unary/vent_pump/Initialize() if(!id_tag) - id_tag = SSnetworks.assign_random_name() + id_tag = SSpackets.generate_net_id(src) + + SET_TRACKING(__TYPE__) . = ..() /obj/machinery/atmospherics/components/unary/vent_pump/Destroy() + UNSET_TRACKING(__TYPE__) var/area/vent_area = get_area(src) if(vent_area) vent_area.air_vent_info -= id_tag @@ -219,12 +222,15 @@ ..() /obj/machinery/atmospherics/components/unary/vent_pump/receive_signal(datum/signal/signal) - if(!is_operational) - return - // log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/components/unary/vent_pump/receive_signal([signal.debug_print()])") - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return + + // Check if we're reporting status, Early return if we are. + if("status" in signal.data) + broadcast_status() + return // do not update_appearance if we don't actually do anything. + COOLDOWN_RESET(src, hibernating) var/atom/signal_sender = signal.data["user"] @@ -279,14 +285,6 @@ if("adjust_external_pressure" in signal.data) external_pressure_bound = clamp(external_pressure_bound + text2num(signal.data["adjust_external_pressure"]),0,ONE_ATMOSPHERE*50) - if("init" in signal.data) - name = signal.data["init"] - return - - if("status" in signal.data) - broadcast_status() - return // do not update_appearance - // log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") broadcast_status() update_appearance() @@ -341,8 +339,8 @@ name = "large air vent" power_channel = AREA_USAGE_EQUIP -/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/New() - ..() +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume/Initialize() + . = ..() var/datum/gas_mixture/air_contents = airs[1] air_contents.volume = 1000 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 c583fe2d9c84..15782cf01762 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -6,6 +6,7 @@ name = "air scrubber" desc = "Has a valve and pump attached to it." + use_power = IDLE_POWER_USE idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 @@ -41,10 +42,11 @@ ///Whether or not this machine can fall asleep. Use a multitool to change. var/can_hibernate = TRUE -/obj/machinery/atmospherics/components/unary/vent_scrubber/New() +/obj/machinery/atmospherics/components/unary/vent_scrubber/Initialize() if(!id_tag) - id_tag = SSnetworks.assign_random_name() + id_tag = SSpackets.generate_net_id(src) . = ..() + SET_TRACKING(__TYPE__) for(var/to_filter in filter_types) if(istext(to_filter)) filter_types -= to_filter @@ -55,6 +57,7 @@ SSairmachines.start_processing_machine(src) /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() + UNSET_TRACKING(__TYPE__) var/area/scrub_area = get_area(src) if(scrub_area) scrub_area.air_scrub_info -= id_tag @@ -223,9 +226,6 @@ var/datum/gas_mixture/environment = tile.unsafe_return_air() // The proc that calls this proc marks the turf for update! var/datum/gas_mixture/air_contents = airs[1] - if(air_contents.returnPressure() >= 50 * ONE_ATMOSPHERE) - return FALSE - if(scrubbing) // == SCRUBBING if(length(environment.gas & filter_types)) . = TRUE @@ -252,6 +252,11 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/receive_signal(datum/signal/signal) if(!is_operational || !signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) return + + if("status" in signal.data) + broadcast_status() + return //do not update_appearance + COOLDOWN_RESET(src, hibernating) var/old_quicksucc = quicksucc @@ -285,14 +290,6 @@ filter_types = list() add_filters(signal.data["set_filters"]) - if("init" in signal.data) - name = signal.data["init"] - return - - if("status" in signal.data) - broadcast_status() - return //do not update_appearance - broadcast_status() update_appearance() diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 4a0efb6c03cf..912255b97d3b 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -8,7 +8,7 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.05 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.03 max_integrity = 150 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 40, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 40, ACID = 0) greyscale_config = /datum/greyscale_config/meter greyscale_colors = COLOR_GRAY ///The pipe we are attaching to diff --git a/code/modules/atmospherics/machinery/pipes/multiz.dm b/code/modules/atmospherics/machinery/pipes/multiz.dm index 19b10d7f2ce7..fc83f98bc280 100644 --- a/code/modules/atmospherics/machinery/pipes/multiz.dm +++ b/code/modules/atmospherics/machinery/pipes/multiz.dm @@ -59,3 +59,15 @@ continue below.pipeline_expansion() //If we've got one below us, force it to add us on facebook return ..() + +/obj/machinery/atmospherics/pipe/multiz/CanZFall(turf/from, direction, anchor_bypass) + . = ..() + if(anchored) + return FALSE + + if(!isturf(loc)) + return FALSE + + var/turf/T = loc + if(locate(/obj/machinery/atmospherics/pipe/multiz) in direction == UP ? T.above : T.below) + return FALSE diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 0730d57b92a6..6d9c2d0c5709 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -17,7 +17,7 @@ vis_flags = VIS_INHERIT_PLANE -/obj/machinery/atmospherics/pipe/New() +/obj/machinery/atmospherics/pipe/Initialize() add_atom_colour(pipe_color, FIXED_COLOUR_PRIORITY) volume = ATMOS_DEFAULT_VOLUME_PIPE * device_type . = ..() @@ -151,3 +151,8 @@ /obj/machinery/atmospherics/pipe/add_member(obj/machinery/atmospherics/considered_device) . = ..() update_device_type() + +/obj/machinery/atmospherics/pipe/CanZFall(turf/from, direction, anchor_bypass) + . = ..() + if(anchored) + return FALSE diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index d8fca1d5649a..023d4ab518f5 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -33,7 +33,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) greyscale_colors = "#ffff00#000000" density = TRUE volume = 2000 - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 80, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, FIRE = 80, ACID = 50) max_integrity = 300 integrity_failure = 0.4 //pressure_resistance = 7 * ONE_ATMOSPHERE @@ -197,6 +197,11 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) greyscale_config = /datum/greyscale_config/canister/stripe greyscale_colors = "#2786e5#e8fefe" +/obj/machinery/portable_atmospherics/canister/oxygen/cryo + name = "cryogenic canister" + starter_temp = 80 + filled = 0.2 + /obj/machinery/portable_atmospherics/canister/boron name = "boron canister" gas_type = GAS_BORON @@ -456,7 +461,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) if(gone == internal_cell) internal_cell = null -/obj/machinery/portable_atmospherics/canister/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0) +/obj/machinery/portable_atmospherics/canister/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armor_penetration = 0) . = ..() if(!. || QDELETED(src)) return @@ -700,7 +705,7 @@ GLOBAL_LIST_INIT(gas_id_to_canister, init_gas_id_to_canister()) timer_set = min(maximum_timer_set, timer_set + 10) if("input") var/user_input = tgui_input_number(usr, "Set time to valve toggle", "Canister Timer", timer_set, maximum_timer_set, minimum_timer_set) - if(isnull(user_input) || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, TRUE)) + if(isnull(user_input) || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return timer_set = user_input log_admin("[key_name(usr)] has activated a prototype valve timer") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index a9cb8ffc8f3e..b4b54f4f14e6 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, FIRE = 60, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 60, ACID = 30) anchored = FALSE ///Stores the gas mixture of the portable component. Don't access this directly, use return_air() so you support the temporary processing it provides @@ -108,7 +108,7 @@ /obj/machinery/portable_atmospherics/AltClick(mob/living/user) . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user)) || !can_interact(user)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY) || !can_interact(user)) return if(!holding) return diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 5f83322a0f92..1459430e0d94 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -81,7 +81,7 @@ var/turf/T = get_turf(src) for(var/atom/movable/AM in T) if(!AM.currently_z_moving) - T.zFall(AM) + AM.zFall() /obj/structure/pitgrate/proc/reset_plane() plane = FLOOR_PLANE diff --git a/code/modules/awaymissions/cordon.dm b/code/modules/awaymissions/cordon.dm index f5209c1478c4..f7ca766ebe44 100644 --- a/code/modules/awaymissions/cordon.dm +++ b/code/modules/awaymissions/cordon.dm @@ -45,8 +45,7 @@ /area/misc/cordon name = "CORDON" icon_state = "cordon" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC area_flags = UNIQUE_AREA|NOTELEPORT|HIDDEN_AREA|NO_ALERTS requires_power = FALSE diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 5dd5abfcbb54..0ba16be93480 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -132,7 +132,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) density = TRUE invisibility = INVISIBILITY_ABSTRACT -/obj/effect/gateway_portal_bumper/Bumped(atom/movable/AM) +/obj/effect/gateway_portal_bumper/BumpedBy(atom/movable/AM) if(get_dir(src,AM) == SOUTH) gateway.Transfer(AM) diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm index 1b404fc4c85f..313e17ff676e 100644 --- a/code/modules/awaymissions/mission_code/Academy.dm +++ b/code/modules/awaymissions/mission_code/Academy.dm @@ -250,7 +250,7 @@ //Destroy Equipment T.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!")) for(var/obj/item/I in user) - if(istype(I, /obj/item/implant)) + if(istype(I, /obj/item/implant) || (I.item_flags & ABSTRACT)) continue qdel(I) if(5) @@ -377,7 +377,7 @@ spell_requirements = NONE spell_max_level = 0 //cannot be improved - smoke_type = /datum/effect_system/smoke_spread + smoke_type = /datum/effect_system/fluid_spread/smoke smoke_amt = 2 var/datum/weakref/summon_weakref @@ -410,7 +410,7 @@ icon_state = "1" color = rgb(0,0,255) -/obj/structure/ladder/unbreakable/rune/ComponentInitialize() +/obj/structure/ladder/unbreakable/rune/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) diff --git a/code/modules/awaymissions/mission_code/Cabin.dm b/code/modules/awaymissions/mission_code/Cabin.dm index 296e6b825411..ee1c527f7304 100644 --- a/code/modules/awaymissions/mission_code/Cabin.dm +++ b/code/modules/awaymissions/mission_code/Cabin.dm @@ -4,13 +4,12 @@ name = "Cabin" icon_state = "away2" requires_power = TRUE - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/cabin/snowforest name = "Snow Forest" icon_state = "away" - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/awaymission/cabin/snowforest/sovietsurface name = "Snow Forest" @@ -21,8 +20,7 @@ name = "Lumbermill" icon_state = "away3" requires_power = FALSE - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/awaymission/cabin/caves/sovietcave name = "Soviet Bunker" @@ -31,7 +29,7 @@ /area/awaymission/cabin/caves name = "North Snowdin Caves" icon_state = "awaycontent15" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/cabin/caves/mountain name = "North Snowdin Mountains" @@ -80,7 +78,7 @@ active = FALSE toggleFirepit() -/obj/structure/firepit/fire_act(exposed_temperature, exposed_volume) +/obj/structure/firepit/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if(!active) active = TRUE toggleFirepit() diff --git a/code/modules/awaymissions/mission_code/caves.dm b/code/modules/awaymissions/mission_code/caves.dm index 28a38cf5c977..ed5b7cf19753 100644 --- a/code/modules/awaymissions/mission_code/caves.dm +++ b/code/modules/awaymissions/mission_code/caves.dm @@ -19,7 +19,7 @@ /area/awaymission/caves/research name = "Research Outpost" icon_state = "awaycontent5" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/caves/northblock //engineering, bridge (not really north but it doesnt really need its own APC) diff --git a/code/modules/awaymissions/mission_code/research.dm b/code/modules/awaymissions/mission_code/research.dm index a075818ca80b..f7835d950109 100644 --- a/code/modules/awaymissions/mission_code/research.dm +++ b/code/modules/awaymissions/mission_code/research.dm @@ -3,7 +3,7 @@ /area/awaymission/research name = "Research Outpost" icon_state = "away" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/research/interior name = "Research Inside" diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index 1e84920425c2..ae2fb74064e0 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -4,8 +4,7 @@ name = "Snowdin" icon_state = "awaycontent1" requires_power = FALSE - static_lighting = FALSE - base_lighting_alpha = 255 + area_lighting = AREA_LIGHTING_STATIC /area/awaymission/snowdin/outside name = "Snowdin Tundra Plains" @@ -15,8 +14,7 @@ name = "Snowdin Outpost" icon_state = "awaycontent2" requires_power = TRUE - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/snowdin/post/medbay name = "Snowdin Outpost - Medbay" @@ -98,14 +96,12 @@ /area/awaymission/snowdin/igloo name = "Snowdin Igloos" icon_state = "awaycontent14" - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/snowdin/cave name = "Snowdin Caves" icon_state = "awaycontent15" - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/snowdin/cave/cavern name = "Snowdin Depths" @@ -119,21 +115,18 @@ /area/awaymission/snowdin/base name = "Snowdin Main Base" icon_state = "awaycontent16" - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = TRUE /area/awaymission/snowdin/dungeon1 name = "Snowdin Depths" icon_state = "awaycontent17" - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC /area/awaymission/snowdin/sekret name = "Snowdin Operations" icon_state = "awaycontent18" - static_lighting = TRUE - base_lighting_alpha = 0 + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = TRUE /area/shuttle/snowdin/elevator1 @@ -312,39 +305,6 @@ is a good step towards not getting stuck walking through knee-deep snow."} //holo disk recording//-- - -/obj/item/disk/holodisk/snowdin/weregettingpaidright - name = "Conversation #AOP#23" - preset_image_type = /datum/preset_holoimage/researcher - preset_record_text = {" - NAME Jacob Ullman - DELAY 10 - SAY Have you gotten anything interesting on the scanners yet? The deep-drilling from the plasma is making it difficult to get anything that isn't useless noise. - DELAY 45 - NAME Elizabeth Queef - DELAY 10 - SAY Nah. I've been feeding the AI the results for the past 2 weeks to sift through the garbage and haven't seen anything out of the usual, at least whatever Nanotrasen is looking for. - DELAY 45 - NAME Jacob Ullman - DELAY 10 - SAY Figured as much. Dunno what Nanotrasen expects to find out here past the plasma. At least we're getting paid to fuck around for a couple months while the AI does the hard work. - DELAY 45 - NAME Elizabeth Queef - DELAY 10 - SAY . . . - DELAY 10 - SAY ..We're getting paid? - DELAY 20 - NAME Jacob Ullman - DELAY 10 - SAY ..We are getting paid, aren't we..? - DELAY 15 - PRESET /datum/preset_holoimage/captain - NAME Caleb Reed - DELAY 10 - SAY Paid in experience! That's the Nanotrasen Motto! - DELAY 30;"} - /obj/item/disk/holodisk/snowdin/welcometodie name = "Conversation #AOP#1" preset_image_type = /datum/preset_holoimage/corgi @@ -391,49 +351,6 @@ Say I don't have to be told twice! Let's get the fuck out of here. DELAY 20;"} -/obj/item/disk/holodisk/snowdin/ripjacob - name = "Conversation #AOP#62" - preset_image_type = /datum/preset_holoimage/researcher - preset_record_text = {" - NAME Jacob Ullman - DELAY 10 - SAY Get the elevator called. We got no idea how many of those fuckers are down here and I'd rather get off this planet as soon as possible. - DELAY 45 - NAME Elizabeth Queef - DELAY 10 - SAY You don't need to tell me twice, I just need to swipe access and then.. - DELAY 15 - SOUND sound/effects/glassbr1.ogg - DELAY 10 - SOUND sound/effects/glassbr2.ogg - DELAY 15 - NAME Jacob Ullman - DELAY 10 - SAY What the FUCK was that? - DELAY 20 - SAY OH FUCK THERE'S MORE OF THEM. CALL FASTER JESUS CHRIST. - DELAY 20 - NAME Elizabeth Queef - DELAY 10 - SAY DON'T FUCKING RUSH ME ALRIGHT IT'S BEING CALLED. - DELAY 15 - SOUND sound/effects/huuu.ogg - DELAY 5 - SOUND sound/effects/huuu.ogg - DELAY 15 - SOUND sound/effects/woodhit.ogg - DELAY 2 - SOUND sound/effects/bodyfall3.ogg - DELAY 5 - SOUND sound/effects/meow1.ogg - DELAY 15 - NAME Jacob Ullman - DELAY 15 - SAY OH FUCK IT'S GOT ME JESUS CHRIIIiiii- - NAME Elizabeth Queef - SAY AAAAAAAAAAAAAAAA FUCK THAT - DELAY 15;"} - //special items//-- /obj/structure/barricade/wooden/snowed @@ -445,7 +362,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, FIRE = 25, ACID = 25) + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 0, ENERGY = 5, BOMB = 0, BIO = 0, FIRE = 25, ACID = 25) cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 7f98c8f885aa..1a740b74e74a 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -137,9 +137,9 @@ SIGNAL_HANDLER if(AM == src) return - Bumped(AM) + BumpedBy(AM) -/obj/effect/meatgrinder/Bumped(atom/movable/AM) +/obj/effect/meatgrinder/BumpedBy(atom/movable/AM) if(triggered) return diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index ea0d22ac39f6..12e2e832e510 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -20,12 +20,19 @@ var/turf/T = find_safe_turf(zlevels=zlevels) if(T) - var/atom/movable/AM = user.pulling - if(AM) - AM.forceMove(T) + var/atom/movable/preserve_grab + if(isliving(user)) + var/mob/living/L = user + var/list/grabbing= L.get_all_grabbed_movables() + for(var/atom/movable/AM as anything in grabbing) + preserve_grab ||= AM + AM.forceMove(T) + user.forceMove(T) - if(AM) - user.start_pulling(AM) + if(preserve_grab && isliving(user)) + var/mob/living/L = user + L.try_make_grab(preserve_grab) + to_chat(user, span_notice("You blink and find yourself in [get_area_name(T)].")) else to_chat(user, "Nothing happens. You feel that this is a bad sign.") diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm index e47cec8f66d5..b4dfdd1e848c 100644 --- a/code/modules/awaymissions/super_secret_room.dm +++ b/code/modules/awaymissions/super_secret_room.dm @@ -28,8 +28,8 @@ SpeakPeace(list("Welcome to the error handling room.","Something's goofed up bad to send you here.","You should probably tell an admin what you were doing, or make a bug report.")) for(var/obj/structure/signpost/salvation/S in orange(7)) S.invisibility = 0 - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(1, S.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(1, location = S.loc) smoke.start() break if(1) diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 836748ac7434..f69350eb91c7 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -65,13 +65,13 @@ /datum/buildmode/proc/create_buttons() // keep a reference so we can update it upon mode switch - modebutton = new /atom/movable/screen/buildmode/mode(src) + modebutton = new /atom/movable/screen/buildmode/mode(src, holder.mob.hud_used) buttons += modebutton - buttons += new /atom/movable/screen/buildmode/help(src) + buttons += new /atom/movable/screen/buildmode/help(src, holder.mob.hud_used) // keep a reference so we can update it upon dir switch - dirbutton = new /atom/movable/screen/buildmode/bdir(src) + dirbutton = new /atom/movable/screen/buildmode/bdir(src, holder.mob.hud_used) buttons += dirbutton - buttons += new /atom/movable/screen/buildmode/quit(src) + buttons += new /atom/movable/screen/buildmode/quit(src, holder.mob.hud_used) // build the lists of switching buttons build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /atom/movable/screen/buildmode/modeswitch) build_options_grid(GLOB.alldirs, dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index e21d808d7c2a..1b342597c6c3 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -4,6 +4,9 @@ // If we don't do this, we get occluded by item action buttons plane = ABOVE_HUD_PLANE +/atom/movable/screen/buildmode/can_usr_use(mob/user) + return bd.holder == user.client + /atom/movable/screen/buildmode/New(bld) bd = bld return ..() @@ -18,6 +21,10 @@ screen_loc = "NORTH,WEST" /atom/movable/screen/buildmode/mode/Click(location, control, params) + . = ..() + if(.) + return FALSE + var/list/modifiers = params2list(params) if(LAZYACCESS(modifiers, LEFT_CLICK)) bd.toggle_modeswitch() @@ -37,6 +44,10 @@ name = "Buildmode Help" /atom/movable/screen/buildmode/help/Click(location, control, params) + . = ..() + if(.) + return FALSE + bd.mode.show_help(usr.client) return 1 @@ -50,6 +61,10 @@ return ..() /atom/movable/screen/buildmode/bdir/Click() + . = ..() + if(.) + return FALSE + bd.toggle_dirswitch() update_appearance() return 1 @@ -65,6 +80,9 @@ return ..(bld) /atom/movable/screen/buildmode/modeswitch/Click() + . = ..() + if(.) + return FALSE bd.change_mode(modetype) return 1 @@ -78,6 +96,9 @@ return ..(bld) /atom/movable/screen/buildmode/dirswitch/Click() + . = ..() + if(.) + return FALSE bd.change_dir(dir) return 1 @@ -87,5 +108,8 @@ name = "Quit Buildmode" /atom/movable/screen/buildmode/quit/Click() + . = ..() + if(.) + return FALSE bd.quit() return 1 diff --git a/code/modules/buildmode/submodes/area_edit.dm b/code/modules/buildmode/submodes/area_edit.dm index 8d5a01c48745..c3ae0c9e58cf 100644 --- a/code/modules/buildmode/submodes/area_edit.dm +++ b/code/modules/buildmode/submodes/area_edit.dm @@ -53,9 +53,10 @@ return if(LAZYACCESS(modifiers, ALT_CLICK)) var/turf/T = get_turf(object) - if(get_area(T) != storedarea) + var/area/old_area = get_area(T) + if(old_area != storedarea) log_admin("Build Mode: [key_name(c)] added [AREACOORD(T)] to [storedarea]") - storedarea.contents.Add(T) + T.change_area(old_area, storedarea) return return ..() else if(LAZYACCESS(modifiers, RIGHT_CLICK)) @@ -71,6 +72,6 @@ if(choice != "Yes") return for(var/turf/T in block(get_turf(cornerA),get_turf(cornerB))) - storedarea.contents.Add(T) + T.change_area(T.loc, storedarea) log_admin("Build Mode: [key_name(c)] set the area of the region from [AREACOORD(cornerA)] through [AREACOORD(cornerB)] to [storedarea].") diff --git a/code/modules/buildmode/submodes/boom.dm b/code/modules/buildmode/submodes/boom.dm index 229114d024a4..2fcb6ed5c0ea 100644 --- a/code/modules/buildmode/submodes/boom.dm +++ b/code/modules/buildmode/submodes/boom.dm @@ -23,7 +23,7 @@ /datum/buildmode_mode/boom/change_settings(client/c) for (var/explosion_level in explosions) - explosions[explosion_level] = input(c, "Range of total [explosion_level]. 0 to none", text("Input")) as num|null + explosions[explosion_level] = input(c, "Range of total [explosion_level]. 0 to none", "Input") as num|null if(explosions[explosion_level] == null || explosions[explosion_level] < 0) explosions[explosion_level] = 0 diff --git a/code/modules/capture_the_flag/ctf_equipment.dm b/code/modules/capture_the_flag/ctf_equipment.dm index e21bedf3f0c3..bb0794168114 100644 --- a/code/modules/capture_the_flag/ctf_equipment.dm +++ b/code/modules/capture_the_flag/ctf_equipment.dm @@ -40,7 +40,7 @@ mag_type = /obj/item/ammo_box/magazine/recharge/ctf/rifle desc = "This looks like it could really hurt in melee." force = 50 - weapon_weight = WEAPON_HEAVY + unwielded_spread_bonus = 20 slot_flags = null /obj/item/gun/ballistic/automatic/laser/ctf/Initialize(mapload) @@ -75,7 +75,6 @@ fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg' semi_auto = TRUE internal_magazine = FALSE - tac_reloads = TRUE /obj/item/gun/ballistic/shotgun/ctf/Initialize(mapload) . = ..() @@ -198,7 +197,7 @@ worn_icon = 'icons/mob/clothing/suits/ctf.dmi' icon_state = "standard" // Adding TRAIT_NODROP is done when the CTF spawner equips people - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) // CTF gear gives no protection outside of the shield + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) // CTF gear gives no protection outside of the shield allowed = null greyscale_config = /datum/greyscale_config/ctf_standard greyscale_config_worn = /datum/greyscale_config/ctf_standard_worn diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm index 3b371678d97f..edf3afd59218 100644 --- a/code/modules/capture_the_flag/ctf_game.dm +++ b/code/modules/capture_the_flag/ctf_game.dm @@ -19,7 +19,7 @@ throw_speed = 0 throw_range = 1 force = 200 - armour_penetration = 1000 + armor_penetration = 1000 resistance_flags = INDESTRUCTIBLE anchored = TRUE item_flags = SLOWS_WHILE_IN_HAND @@ -198,7 +198,7 @@ var/ctf_enabled = FALSE var/area/A - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(activated_id != CTF.game_id) continue ctf_enabled = CTF.toggle_ctf() @@ -259,10 +259,12 @@ /obj/machinery/capture_the_flag/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) SSpoints_of_interest.make_point_of_interest(src) ctf_landmark = GLOB.ctf_spawner /obj/machinery/capture_the_flag/Destroy() + UNSET_TRACKING(__TYPE__) ctf_landmark = null return ..() @@ -273,7 +275,7 @@ continue // Anyone in crit, automatically reap var/mob/living/living_participant = i - if(HAS_TRAIT(living_participant, TRAIT_CRITICAL_CONDITION) || living_participant.stat == DEAD || !living_participant.client) // If they're critted, dead or no longer in their body, dust them + if(living_participant.stat != CONSCIOUS || !living_participant.client) // If they're critted, dead or no longer in their body, dust them ctf_dust_old(living_participant) else // The changes that you've been hit with no shield but not @@ -326,7 +328,7 @@ if(!(GLOB.ghost_role_flags & GHOSTROLE_MINIGAME)) to_chat(user, span_warning("CTF has been temporarily disabled by admins.")) return - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id && CTF.ctf_enabled) to_chat(user, span_warning("There is already an ongoing game in the [get_area(CTF)]!")) return @@ -345,7 +347,7 @@ spawn_team_member(new_team_member) return - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id || CTF == src || CTF.ctf_enabled == FALSE) continue if(user.ckey in CTF.team_members) @@ -445,10 +447,12 @@ for(var/obj/item/ctf/W in competitor) competitor.dropItemToGround(W) competitor.dust() - for(var/obj/machinery/control_point/control in GLOB.machines) + + for(var/obj/machinery/control_point/control as anything in INSTANCES_OF(/obj/machinery/control_point)) control.icon_state = "dominator" control.controlling = null - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id) continue if(CTF.ctf_enabled == TRUE) @@ -498,7 +502,7 @@ reset_the_arena() /obj/machinery/capture_the_flag/proc/instagib_mode() - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id) continue if(CTF.ctf_enabled == TRUE) @@ -506,7 +510,7 @@ CTF.respawn_cooldown = INSTAGIB_RESPAWN /obj/machinery/capture_the_flag/proc/normal_mode() - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id) continue if(CTF.ctf_enabled == TRUE) @@ -578,13 +582,13 @@ /obj/effect/ctf/dead_barricade/Initialize(mapload) . = ..() - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id) continue CTF.dead_barricades += src /obj/effect/ctf/dead_barricade/Destroy() - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.game_id != game_id) continue CTF.dead_barricades -= src @@ -609,6 +613,14 @@ var/point_rate = 1 var/game_area = /area/centcom/ctf +/obj/machinery/control_point/Initialize(mapload) + . = ..() + SET_TRACKING(__TYPE__) + +/obj/machinery/control_point/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/control_point/process(delta_time) if(controlling) controlling.control_points += point_rate * delta_time @@ -626,7 +638,7 @@ /obj/machinery/control_point/proc/capture(mob/user) if(do_after(user, src, 30)) - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(CTF.ctf_enabled && (user.ckey in CTF.team_members)) controlling = CTF icon_state = "dominator-[CTF.team]" @@ -642,7 +654,7 @@ . = TRUE if(ishuman(target)) var/mob/living/carbon/human/H = target - for(var/obj/machinery/capture_the_flag/CTF in GLOB.machines) + for(var/obj/machinery/capture_the_flag/CTF as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if(H in CTF.spawned_mobs) . = TRUE break diff --git a/code/modules/capture_the_flag/ctf_panel.dm b/code/modules/capture_the_flag/ctf_panel.dm index ed836be432f4..b42e695dd3b6 100644 --- a/code/modules/capture_the_flag/ctf_panel.dm +++ b/code/modules/capture_the_flag/ctf_panel.dm @@ -15,7 +15,7 @@ GLOBAL_DATUM_INIT(ctf_panel, /datum/ctf_panel, new()) var/list/data = list() var/list/teams = list() - for(var/obj/machinery/capture_the_flag/team in GLOB.machines) + for(var/obj/machinery/capture_the_flag/team as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if (!team.ctf_enabled) continue @@ -79,7 +79,7 @@ GLOBAL_DATUM_INIT(ctf_panel, /datum/ctf_panel, new()) return TRUE /datum/ctf_panel/proc/ctf_enabled() - for (var/obj/machinery/capture_the_flag/ctf_machine in GLOB.machines) + for (var/obj/machinery/capture_the_flag/ctf_machine as anything in INSTANCES_OF(/obj/machinery/capture_the_flag)) if (ctf_machine.ctf_enabled) return TRUE diff --git a/code/modules/capture_the_flag/medieval_sim/medisim_game.dm b/code/modules/capture_the_flag/medieval_sim/medisim_game.dm index dce232756320..c06c85735fd1 100644 --- a/code/modules/capture_the_flag/medieval_sim/medisim_game.dm +++ b/code/modules/capture_the_flag/medieval_sim/medisim_game.dm @@ -39,8 +39,7 @@ title = pick(list("Dame", "Lady")) else title = "Noble" - human_knight.real_name = "[title] [oldname]" - human_knight.name = human_knight.real_name + human_knight.set_real_name("[title] [oldname]") /obj/machinery/capture_the_flag/medisim/red name = "\improper Redfield Data Realizer" diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm index e95dd23eb847..e134543801ea 100644 --- a/code/modules/cards/cardhand.dm +++ b/code/modules/cards/cardhand.dm @@ -61,9 +61,13 @@ return NONE /obj/item/toy/cards/cardhand/attack_self(mob/living/user) - if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK)) + if(!isliving(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY)) return + if(!user.get_empty_held_index()) + to_chat(user, span_warning("You need an empty hand to draw from the pile.")) + return FALSE + var/list/handradial = list() for(var/obj/item/toy/singlecard/card in cards) handradial[card] = image(icon = src.icon, icon_state = card.icon_state) @@ -73,14 +77,13 @@ return FALSE var/obj/item/toy/singlecard/selected_card = draw(user, choice) - selected_card.pickup(user) - user.put_in_hands(selected_card) + if(!user.pickup_item(selected_card, user.get_empty_held_index())) + selected_card.forceMove(user.drop_location()) if(cards.len == 1) user.temporarilyRemoveItemFromInventory(src, TRUE) var/obj/item/toy/singlecard/last_card = draw(user) - last_card.pickup(user) - user.put_in_hands(last_card) + user.pickup_item(last_card) qdel(src) // cardhand is empty now so delete it /obj/item/toy/cards/cardhand/proc/check_menu(mob/living/user) diff --git a/code/modules/cards/cards.dm b/code/modules/cards/cards.dm index ce5e9c88a5f4..80c1a953f75e 100644 --- a/code/modules/cards/cards.dm +++ b/code/modules/cards/cards.dm @@ -98,7 +98,7 @@ * * obj/item/toy/singlecard/card (optional) - The card drawn from the hand **/ /obj/item/toy/cards/proc/draw(mob/living/user, obj/item/toy/singlecard/card) - if(!isliving(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK)) + if(!isliving(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY)) return var/has_no_cards = !LAZYLEN(cards) diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm index 6b303f125a1a..ede5146eb0d0 100644 --- a/code/modules/cards/deck/deck.dm +++ b/code/modules/cards/deck/deck.dm @@ -8,9 +8,13 @@ icon_state = "deck_nanotrasen_full" w_class = WEIGHT_CLASS_SMALL worn_icon_state = "card" + hitsound = null + wielded_hitsound = 'sound/items/cardflip.ogg' + attack_verb_continuous = list("attacks") attack_verb_simple = list("attack") + /// The amount of time it takes to shuffle var/shuffle_time = DECK_SHUFFLE_TIME /// Deck shuffling cooldown. @@ -21,8 +25,6 @@ var/decksize = INFINITY /// The description of the cardgame that is played with this deck (used for memories) var/cardgame_desc = "card game" - /// Wielding status for holding with two hands - var/wielded = FALSE /// The holodeck computer used to spawn a holographic deck (see /obj/item/toy/cards/deck/syndicate/holographic) var/obj/machinery/computer/holodeck/holodeck /// If the cards in the deck have different card faces icons (blank and CAS decks do not) @@ -33,9 +35,6 @@ /obj/item/toy/cards/deck/Initialize(mapload) . = ..() AddElement(/datum/element/drag_pickup) - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - AddComponent(/datum/component/two_handed, attacksound='sound/items/cardflip.ogg') register_context() if(!is_standard_deck) @@ -131,7 +130,6 @@ var/other_players = english_list(card_players - player) var/obj/item/toy/held_card_item = card_players[player] - SEND_SIGNAL(player, COMSIG_ADD_MOOD_EVENT, "playing_cards", /datum/mood_event/playing_cards) player.mind?.add_memory( MEMORY_PLAYING_CARDS, list( @@ -147,7 +145,7 @@ /obj/item/toy/cards/deck/attack_hand(mob/living/user, list/modifiers, flip_card = FALSE) - if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + if(!ishuman(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY)) return var/obj/item/toy/singlecard/card = draw(user) @@ -155,8 +153,8 @@ return if(flip_card) card.Flip() - card.pickup(user) - user.put_in_hands(card) + + user.pickup_item(card) user.balloon_alert_to_viewers("draws a card") /obj/item/toy/cards/deck/attack_hand_secondary(mob/living/user, list/modifiers) @@ -164,7 +162,7 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/toy/cards/deck/AltClick(mob/living/user) - if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + if(user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY)) if(wielded) shuffle_cards(user) else @@ -214,8 +212,6 @@ var/mob/living/thrower = throwingdatum.thrower target.visible_message(span_warning("[target] is forced to play 52 card pickup!"), span_warning("You are forced to play 52 card pickup.")) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "lost_52_card_pickup", /datum/mood_event/lost_52_card_pickup) - SEND_SIGNAL(thrower, COMSIG_ADD_MOOD_EVENT, "won_52_card_pickup", /datum/mood_event/won_52_card_pickup) add_memory_in_range( target, 7, diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm index 3a9702a7d211..2ad0eff5d33c 100644 --- a/code/modules/cards/singlecard.dm +++ b/code/modules/cards/singlecard.dm @@ -13,7 +13,6 @@ max_integrity = 50 force = 0 throwforce = 0 - throw_speed = 3 throw_range = 7 attack_verb_continuous = list("attacks") attack_verb_simple = list("attack") @@ -174,8 +173,7 @@ if(!isturf(loc)) // make a cardhand in our active hand user.temporarilyRemoveItemFromInventory(src, TRUE) - new_cardhand.pickup(user) - user.put_in_active_hand(new_cardhand) + user.pickup_item(new_cardhand) return if(istype(item, /obj/item/toy/cards/cardhand)) // insert into cardhand @@ -207,7 +205,7 @@ return var/cardtext = stripped_input(user, "What do you wish to write on the card?", "Card Writing", "", 50) - if(!cardtext || !user.canUseTopic(src, BE_CLOSE)) + if(!cardtext || !user.canUseTopic(src, USE_CLOSE)) return cardname = cardtext @@ -228,7 +226,7 @@ attack_self(user) /obj/item/toy/singlecard/attack_self(mob/living/carbon/human/user) - if(!ishuman(user) || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + if(!ishuman(user) || !user.canUseTopic(src,USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY|USE_SILICON_REACH)) return Flip() @@ -236,7 +234,7 @@ user.balloon_alert_to_viewers("flips a card") /obj/item/toy/singlecard/AltClick(mob/living/carbon/human/user) - if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, NO_TK, !iscyborg(user))) + if(user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_DEXTERITY|USE_SILICON_REACH)) transform = turn(transform, 90) // use the simple_rotation component to make this turn with Alt+RMB & Alt+LMB at some point in the future - TimT return ..() diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm deleted file mode 100644 index 1316cf61d0f9..000000000000 --- a/code/modules/cargo/bounties/assistant.dm +++ /dev/null @@ -1,204 +0,0 @@ -/datum/bounty/item/assistant/scooter - name = "Scooter" - description = "Ananke has determined walking to be wasteful. Ship a scooter to CentCom to speed operations up." - reward = CARGO_CRATE_VALUE * 2.16 // the mat hoffman - wanted_types = list(/obj/vehicle/ridden/scooter = TRUE) - include_subtypes = FALSE - -/datum/bounty/item/assistant/skateboard - name = "Skateboard" - description = "Ananke has determined walking to be wasteful. Ship a skateboard to CentCom to speed operations up." - reward = CARGO_CRATE_VALUE * 1.8 // the tony hawk - wanted_types = list( - /obj/vehicle/ridden/scooter/skateboard = TRUE, - /obj/item/melee/skateboard = TRUE, - ) - -/datum/bounty/item/assistant/stunprod - name = "Stunprod" - description = "CentCom demands a stunprod to use against dissidents. Craft one, then ship it." - reward = CARGO_CRATE_VALUE * 2.6 - wanted_types = list(/obj/item/melee/baton/security/cattleprod = TRUE) - -/datum/bounty/item/assistant/soap - name = "Soap" - description = "Soap has gone missing from CentCom's bathrooms and nobody knows who took it. Replace it and be the hero CentCom needs." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/soap = TRUE) - -/datum/bounty/item/assistant/spear - name = "Spears" - description = "CentCom's security forces are going through budget cuts. You will be paid if you ship a set of spears." - reward = CARGO_CRATE_VALUE * 4 - required_count = 5 - wanted_types = list(/obj/item/spear = TRUE) - -/datum/bounty/item/assistant/toolbox - name = "Toolboxes" - description = "There's an absence of robustness at Central Command. Hurry up and ship some toolboxes as a solution." - reward = CARGO_CRATE_VALUE * 4 - required_count = 6 - wanted_types = list(/obj/item/storage/toolbox = TRUE) - -/datum/bounty/item/assistant/statue - name = "Statue" - description = "Central Command would like to commision an artsy statue for the lobby. Ship one out, when possible." - reward = CARGO_CRATE_VALUE * 4 - wanted_types = list(/obj/structure/statue = TRUE) - -/datum/bounty/item/assistant/clown_box - name = "Clown Box" - description = "The universe needs laughter. Stamp cardboard with a clown stamp and ship it out." - reward = CARGO_CRATE_VALUE * 3 - wanted_types = list(/obj/item/storage/box/clown = TRUE) - -/datum/bounty/item/assistant/cheesiehonkers - name = "Cheesie Honkers" - description = "Apparently the company that makes Cheesie Honkers is going out of business soon. CentCom wants to stock up before it happens!" - reward = CARGO_CRATE_VALUE * 2.4 - required_count = 3 - wanted_types = list(/obj/item/food/cheesiehonkers = TRUE) - -/datum/bounty/item/assistant/baseball_bat - name = "Baseball Bat" - description = "Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream." - reward = CARGO_CRATE_VALUE * 4 - required_count = 5 - wanted_types = list(/obj/item/melee/baseball_bat = TRUE) - -/datum/bounty/item/assistant/extendohand - name = "Extendo-Hand" - description = "Commander Betsy is getting old, and can't bend over to get the telescreen remote anymore. Management has requested an extendo-hand to help her out." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/item/extendohand = TRUE) - -/datum/bounty/item/assistant/donut - name = "Donuts" - description = "CentCom's security forces are facing heavy losses against the Syndicate. Ship donuts to raise morale." - reward = CARGO_CRATE_VALUE * 6 - required_count = 6 - wanted_types = list(/obj/item/food/donut = TRUE) - -/datum/bounty/item/assistant/donkpocket - name = "Donk-Pockets" - description = "Consumer safety recall: Warning. Donk-Pockets manufactured in the past year contain hazardous unathi biomatter. Return units to CentCom immediately." - reward = CARGO_CRATE_VALUE * 6 - required_count = 10 - wanted_types = list(/obj/item/food/donkpocket = TRUE) - -/datum/bounty/item/assistant/briefcase - name = "Briefcase" - description = "Central Command will be holding a business convention this year. Ship a few briefcases in support." - reward = CARGO_CRATE_VALUE * 5 - required_count = 5 - wanted_types = list( - /obj/item/storage/briefcase = TRUE, - /obj/item/storage/secure/briefcase = TRUE, - ) - -/datum/bounty/item/assistant/sunglasses - name = "Sunglasses" - description = "A famous blues duo is passing through the sector, but they've lost their shades and they can't perform. Ship new sunglasses to CentCom to rectify this." - reward = CARGO_CRATE_VALUE * 6 - required_count = 2 - wanted_types = list(/obj/item/clothing/glasses/sunglasses = TRUE) - -/datum/bounty/item/assistant/monkey_hide - name = "Monkey Hide" - description = "One of the scientists at CentCom is interested in testing products on monkey skin. Your mission is to acquire monkey's hide and ship it." - reward = CARGO_CRATE_VALUE * 3 - wanted_types = list(/obj/item/stack/sheet/animalhide/monkey = TRUE) - -/datum/bounty/item/assistant/comfy_chair - name = "Comfy Chairs" - description = "Commander Pat is unhappy with his chair. He claims it hurts his back. Ship some alternatives out to humor him." - reward = CARGO_CRATE_VALUE * 3 - required_count = 5 - wanted_types = list(/obj/structure/chair/comfy = TRUE) - -/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 = CARGO_CRATE_VALUE * 8 - required_count = 3 - wanted_types = list(/obj/item/food/grown/poppy/geranium = TRUE) - include_subtypes = FALSE - -/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." - reward = CARGO_CRATE_VALUE * 2 - required_count = 3 - wanted_types = list(/obj/item/food/grown/poppy = TRUE) - include_subtypes = FALSE - -/datum/bounty/item/assistant/shadyjims - name = "Shady Jim's" - description = "There's an irate officer at CentCom demanding that he receive a box of Shady Jim's cigarettes. Please ship one. He's starting to make threats." - reward = CARGO_CRATE_VALUE - wanted_types = list(/obj/item/storage/fancy/cigarettes/cigpack_shadyjims = TRUE) - -/datum/bounty/item/assistant/potted_plants - name = "Potted Plants" - description = "Central Command is looking to commission a new BirdBoat-class station. You've been ordered to supply the potted plants." - reward = CARGO_CRATE_VALUE * 4 - required_count = 8 - wanted_types = list(/obj/item/kirbyplants = TRUE) - -/datum/bounty/item/assistant/monkey_cubes - name = "Monkey Cubes" - description = "Due to a recent genetics accident, Central Command is in serious need of monkeys. Your mission is to ship monkey cubes." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/food/monkeycube = TRUE) - -/datum/bounty/item/assistant/ied - name = "IED" - description = "The Core Worlds' maximum security prison back home is undergoing personnel training. Ship a handful of IEDs to serve as a training tools." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/item/grenade/iedcasing = TRUE) - -/datum/bounty/item/assistant/corgimeat - name = "Raw Corgi Meat" - description = "The Syndicate recently stole all of CentCom's Corgi meat. Ship out a replacement immediately." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/food/meat/slab/corgi = TRUE) - -/datum/bounty/item/assistant/action_figures - name = "Action Figures" - description = "The vice president's son saw an ad for action figures on the telescreen and now he won't shut up about them. Ship some to ease his complaints." - reward = CARGO_CRATE_VALUE * 8 - required_count = 5 - wanted_types = list(/obj/item/toy/figure = TRUE) - -/datum/bounty/item/assistant/dead_mice - name = "Dead Mice" - description = "Station 14 ran out of freeze-dried mice. Ship some fresh ones so their janitor doesn't go on strike." - reward = CARGO_CRATE_VALUE * 10 - required_count = 5 - wanted_types = list(/obj/item/food/deadmouse = TRUE) - -/datum/bounty/item/assistant/paper_bin - name = "Paper Bins" - description = "Our accounting division is all out of paper. We need a new shipment immediately." - reward = CARGO_CRATE_VALUE * 5 - required_count = 5 - wanted_types = list(/obj/item/paper_bin = TRUE) - - -/datum/bounty/item/assistant/crayons - name = "Crayons" - description = "Dr Jones' kid ate all our crayons again. Please send us yours." - reward = CARGO_CRATE_VALUE * 4 - required_count = 24 - wanted_types = list(/obj/item/toy/crayon = TRUE) - -/datum/bounty/item/assistant/pens - name = "Pens" - description = "We are hosting the intergalactic pen balancing competition. We need you to send us some standardized ball point pens." - reward = CARGO_CRATE_VALUE * 4 - required_count = 10 - include_subtypes = FALSE - wanted_types = list(/obj/item/pen = TRUE) diff --git a/code/modules/cargo/bounties/botany.dm b/code/modules/cargo/bounties/botany.dm deleted file mode 100644 index 71f751c81a13..000000000000 --- a/code/modules/cargo/bounties/botany.dm +++ /dev/null @@ -1,223 +0,0 @@ -/datum/bounty/item/botany - reward = CARGO_CRATE_VALUE * 10 - 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 - -/datum/bounty/item/botany/New() - ..() - description = "Central Command's head chef is looking to prepare a fine [foodtype] with [name]. [bonus_desc]" - reward += multiplier * (CARGO_CRATE_VALUE * 2) - required_count = rand(5, 10) - -/datum/bounty/item/botany/ambrosia_vulgaris - name = "Ambrosia Vulgaris Leaves" - wanted_types = list(/obj/item/food/grown/ambrosia/vulgaris = TRUE) - foodtype = "stew" - -/datum/bounty/item/botany/ambrosia_gaia - name = "Ambrosia Gaia Leaves" - wanted_types = list(/obj/item/food/grown/ambrosia/gaia = TRUE) - multiplier = 4 - foodtype = "stew" - -/datum/bounty/item/botany/apple_golden - name = "Golden Apples" - wanted_types = list(/obj/item/food/grown/apple/gold = TRUE) - multiplier = 4 - foodtype = "dessert" - -/datum/bounty/item/botany/banana - name = "Bananas" - wanted_types = list( - /obj/item/food/grown/banana = TRUE, - /obj/item/food/grown/banana/bluespace = FALSE, - ) - foodtype = "banana split" - -/datum/bounty/item/botany/banana_bluespace - name = "Bluespace Bananas" - wanted_types = list(/obj/item/food/grown/banana/bluespace = TRUE) - multiplier = 2 - foodtype = "banana split" - -/datum/bounty/item/botany/beans_koi - name = "Koi Beans" - wanted_types = list(/obj/item/food/grown/koibeans = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/berries_death - name = "Death Berries" - wanted_types = list(/obj/item/food/grown/berries/death = TRUE) - multiplier = 2 - bonus_desc = "He insists that \"he knows what he's doing\"." - foodtype = "sorbet" - -/datum/bounty/item/botany/berries_glow - name = "Glow-Berries" - wanted_types = list(/obj/item/food/grown/berries/glow = TRUE) - multiplier = 2 - foodtype = "sorbet" - -/datum/bounty/item/botany/cannabis - name = "Cannabis Leaves" - wanted_types = list( - /obj/item/food/grown/cannabis = TRUE, - /obj/item/food/grown/cannabis/white = FALSE, - /obj/item/food/grown/cannabis/death = FALSE, - /obj/item/food/grown/cannabis/ultimate = FALSE, - ) - multiplier = 4 //hush money - bonus_desc = "Do not mention this shipment to security." - foodtype = "batch of \"muffins\"" - -/datum/bounty/item/botany/cannabis_white - name = "Lifeweed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/white = TRUE) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_death - name = "Deathweed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/death = TRUE) - multiplier = 6 - bonus_desc = "Do not mention this shipment to security." - foodtype = "\"meal\"" - -/datum/bounty/item/botany/cannabis_ultimate - name = "Omega Weed Leaves" - wanted_types = list(/obj/item/food/grown/cannabis/ultimate = TRUE) - multiplier = 6 - bonus_desc = "Under no circumstances mention this shipment to security." - foodtype = "batch of \"brownies\"" - -/datum/bounty/item/botany/wheat - name = "Wheat Grains" - wanted_types = list(/obj/item/food/grown/wheat = TRUE) - -/datum/bounty/item/botany/rice - name = "Rice Grains" - wanted_types = list(/obj/item/food/grown/rice = TRUE) - -/datum/bounty/item/botany/chili - name = "Chili Peppers" - wanted_types = list(/obj/item/food/grown/chili = TRUE) - -/datum/bounty/item/botany/ice_chili - name = "Chilly Peppers" - wanted_types = list(/obj/item/food/grown/icepepper = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/ghost_chili - name = "Ghost Chili Peppers" - wanted_types = list(/obj/item/food/grown/ghost_chili = TRUE) - multiplier = 2 - -/datum/bounty/item/botany/citrus_lime - name = "Limes" - wanted_types = list(/obj/item/food/grown/citrus/lime = TRUE) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_lemon - name = "Lemons" - wanted_types = list(/obj/item/food/grown/citrus/lemon = TRUE) - foodtype = "sorbet" - -/datum/bounty/item/botany/citrus_oranges - name = "Oranges" - wanted_types = list(/obj/item/food/grown/citrus/orange = TRUE) - bonus_desc = "Do not ship lemons or limes." //I vanted orahnge! - foodtype = "sorbet" - -/datum/bounty/item/botany/eggplant - name = "Eggplants" - wanted_types = list(/obj/item/food/grown/eggplant = TRUE) - bonus_desc = "Not to be confused with egg-plants." - -/datum/bounty/item/botany/eggplant_eggy - name = "Egg-plants" - wanted_types = list(/obj/item/food/grown/shell/eggy = TRUE) - bonus_desc = "Not to be confused with eggplants." - multiplier = 2 - -/datum/bounty/item/botany/kudzu - name = "Kudzu Pods" - wanted_types = list(/obj/item/food/grown/kudzupod = TRUE) - bonus_desc = "Store in a dry, dark place." - multiplier = 4 - -/datum/bounty/item/botany/watermelon - name = "Watermelons" - wanted_types = list(/obj/item/food/grown/watermelon = TRUE) - foodtype = "dessert" - -/datum/bounty/item/botany/watermelon_holy - name = "Holy Melons" - wanted_types = list(/obj/item/food/grown/holymelon = TRUE) - multiplier = 2 - foodtype = "dessert" - -/datum/bounty/item/botany/glowshroom - name = "Glowshrooms" - wanted_types = list( - /obj/item/food/grown/mushroom/glowshroom = TRUE, - /obj/item/food/grown/mushroom/glowshroom/glowcap = FALSE, - /obj/item/food/grown/mushroom/glowshroom/shadowshroom = FALSE, - ) - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_cap - name = "Glowcaps" - wanted_types = list(/obj/item/food/grown/mushroom/glowshroom/glowcap = TRUE) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/glowshroom_shadow - name = "Shadowshrooms" - wanted_types = list(/obj/item/food/grown/mushroom/glowshroom/shadowshroom = TRUE) - multiplier = 2 - foodtype = "omelet" - -/datum/bounty/item/botany/nettles_death - name = "Death Nettles" - wanted_types = list(/obj/item/food/grown/nettle/death = TRUE) - multiplier = 2 - bonus_desc = "Wear protection when handling them." - foodtype = "cheese" - -/datum/bounty/item/botany/pineapples - name = "Pineapples" - wanted_types = list(/obj/item/food/grown/pineapple = TRUE) - bonus_desc = "Not for human consumption." - foodtype = "ashtray" - -/datum/bounty/item/botany/tomato - name = "Tomatoes" - wanted_types = list( - /obj/item/food/grown/tomato = TRUE, - /obj/item/food/grown/tomato/blue = FALSE, - ) - -/datum/bounty/item/botany/tomato_bluespace - name = "Bluespace Tomatoes" - wanted_types = list(/obj/item/food/grown/tomato/blue/bluespace = TRUE) - multiplier = 4 - -/datum/bounty/item/botany/oatz - name = "Oats" - wanted_types = list(/obj/item/food/grown/oat = TRUE) - multiplier = 2 - foodtype = "batch of oatmeal" - bonus_desc = "Squats and oats. We're all out of oats." - -/datum/bounty/item/botany/bonfire - name = "Lit Bonfire" - description = "Space heaters are malfunctioning and the cargo crew of Central Command is starting to feel cold. Grow some logs and Ship a lit bonfire to warm them up." - wanted_types = list(/obj/structure/bonfire = TRUE) - -/datum/bounty/item/botany/bonfire/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/structure/bonfire/B = O - return !!B.burning diff --git a/code/modules/cargo/bounties/chef.dm b/code/modules/cargo/bounties/chef.dm deleted file mode 100644 index 3e15c3688bb1..000000000000 --- a/code/modules/cargo/bounties/chef.dm +++ /dev/null @@ -1,153 +0,0 @@ -/datum/bounty/item/chef/birthday_cake - name = "Birthday Cake" - description = "Nanotrasen's birthday is coming up! Ship them a birthday cake to celebrate!" - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list( - /obj/item/food/cake/birthday = TRUE, - /obj/item/food/cakeslice/birthday = TRUE - ) - -/datum/bounty/item/chef/soup - name = "Soup" - description = "To quell the homeless uprising, Nanotrasen will be serving soup to all underpaid workers. Ship any type of soup." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/soup = TRUE) - -/datum/bounty/item/chef/popcorn - name = "Popcorn Bags" - description = "Upper management wants to host a movie night. Ship bags of popcorn for the occasion." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/popcorn = TRUE) - -/datum/bounty/item/chef/onionrings - name = "Onion Rings" - description = "Nanotrasen is remembering Saturn day. Ship onion rings to show the station's support." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/onionrings = TRUE) - -/datum/bounty/item/chef/icecreamsandwich - name = "Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for ice cream. Please send some." - reward = CARGO_CRATE_VALUE * 8 - required_count = 3 - wanted_types = list(/obj/item/food/icecreamsandwich = TRUE) - -/datum/bounty/item/chef/strawberryicecreamsandwich - name = " Strawberry Ice Cream Sandwiches" - description = "Upper management has been screaming non-stop for more flavourful ice cream. Please send some." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list(/obj/item/food/strawberryicecreamsandwich = TRUE) - -/datum/bounty/item/chef/bread - name = "Bread" - description = "Problems with central planning have led to bread prices skyrocketing. Ship some bread to ease tensions." - reward = CARGO_CRATE_VALUE * 2 - wanted_types = list( - /obj/item/food/bread = TRUE, - /obj/item/food/breadslice = TRUE, - /obj/item/food/bun = TRUE, - /obj/item/food/pizzabread = TRUE, - /obj/item/food/rawpastrybase = TRUE, - ) - -/datum/bounty/item/chef/pie - name = "Pie" - description = "3.14159? No! CentCom management wants edible pie! Ship a whole one." - reward = 3142 //Screw it I'll do this one by hand - wanted_types = list(/obj/item/food/pie = TRUE) - -/datum/bounty/item/chef/salad - name = "Salad or Rice Bowls" - description = "CentCom management is going on a health binge. Your order is to ship salad or rice bowls." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/salad = TRUE) - -/datum/bounty/item/chef/carrotfries - name = "Carrot Fries" - description = "Night sight can mean life or death! A shipment of carrot fries is the order." - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/carrotfries = TRUE) - -/datum/bounty/item/chef/superbite - name = "Super Bite Burger" - description = "Commander Tubbs thinks he can set a competitive eating world record. All he needs is a super bite burger shipped to him." - reward = CARGO_CRATE_VALUE * 24 - wanted_types = list(/obj/item/food/burger/superbite = TRUE) - -/datum/bounty/item/chef/poppypretzel - name = "Poppy Pretzel" - description = "Central Command needs a reason to fire their HR head. Send over a poppy pretzel to force a failed drug test." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/food/poppypretzel = TRUE) - -/datum/bounty/item/chef/cubancarp - name = "Cuban Carp" - description = "To celebrate the birth of Castro XXVII, ship one cuban carp to CentCom." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/cubancarp = TRUE) - -/datum/bounty/item/chef/hotdog - name = "Hot Dog" - description = "Nanotrasen is conducting taste tests to determine the best hot dog recipe. Ship your station's version to participate." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/hotdog = TRUE) - -/datum/bounty/item/chef/eggplantparm - name = "Eggplant Parmigianas" - description = "A famous singer will be arriving at CentCom, and their contract demands that they only be served Eggplant Parmigiana. Ship some, please!" - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/eggplantparm = TRUE) - -/datum/bounty/item/chef/muffin - name = "Muffins" - description = "The Muffin Man is visiting CentCom, but he's forgotten his muffins! Your order is to rectify this." - reward = CARGO_CRATE_VALUE * 6 - required_count = 3 - wanted_types = list(/obj/item/food/muffin = TRUE) - -/datum/bounty/item/chef/chawanmushi - name = "Chawanmushi" - description = "Nanotrasen wants to improve relations with its sister company, Japanotrasen. Ship Chawanmushi immediately." - reward = CARGO_CRATE_VALUE * 16 - wanted_types = list(/obj/item/food/chawanmushi = TRUE) - -/datum/bounty/item/chef/kebab - name = "Kebabs" - description = "Remove all kebab from station you are best food. Ship to CentCom to remove from the premises." - reward = CARGO_CRATE_VALUE * 7 - required_count = 3 - wanted_types = list(/obj/item/food/kebab = TRUE) - -/datum/bounty/item/chef/soylentgreen - name = "Soylent Green" - description = "CentCom has heard wonderful things about the product 'Soylent Green', and would love to try some. If you endulge them, expect a pleasant bonus." - reward = CARGO_CRATE_VALUE * 10 - wanted_types = list(/obj/item/food/soylentgreen = TRUE) - -/datum/bounty/item/chef/pancakes - name = "Pancakes" - description = "Here at Nanotrasen we consider employees to be family. And you know what families love? Pancakes. Ship a baker's dozen." - reward = CARGO_CRATE_VALUE * 10 - required_count = 13 - wanted_types = list(/obj/item/food/pancakes = TRUE) - -/datum/bounty/item/chef/nuggies - name = "Chicken Nuggets" - description = "The vice president's son won't shut up about chicken nuggies. Would you mind shipping some?" - reward = CARGO_CRATE_VALUE * 8 - required_count = 6 - wanted_types = list(/obj/item/food/nugget = TRUE) - -/datum/bounty/item/chef/corgifarming //Butchering is a chef's job. - name = "Corgi Hides" - description = "Admiral Weinstein's space yacht needs new upholstery. A dozen Corgi furs should do just fine." - reward = CARGO_CRATE_VALUE * 60 //that's a lot of dead dogs - required_count = 12 - wanted_types = list(/obj/item/stack/sheet/animalhide/corgi = TRUE) diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm deleted file mode 100644 index 83d80134134f..000000000000 --- a/code/modules/cargo/bounties/engineering.dm +++ /dev/null @@ -1,54 +0,0 @@ -/datum/bounty/item/engineering/gas - name = "Full Tank of Pluoxium" - description = "CentCom RnD is researching extra compact internals. Ship us a tank full of Pluoxium and you'll be compensated." - reward = CARGO_CRATE_VALUE * 15 - wanted_types = list(/obj/item/tank = TRUE) - var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type - -/datum/bounty/item/engineering/gas/applies_to(obj/O) - if(!..()) - return FALSE - var/obj/item/tank/T = O - var/datum/gas_mixture/our_mix = T.unsafe_return_air() - if(!our_mix.getGroupGas(gas_type)) - return FALSE - return our_mix.getGroupGas(gas_type) >= moles_required - -/datum/bounty/item/engineering/gas/nitrium_tank - name = "Full Tank of Nitrium" - description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitrium so they can get started. (20 Moles)" -// gas_type = /datum/gas/nitrium - -/datum/bounty/item/engineering/gas/freon_tank - name = "Full Tank of Freon" - description = "The Supermatter of station 33 has started the delamination process. Deliver a tank of Freon gas to help them stop it! (20 Moles)" - //gas_type = /datum/gas/freon - -/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. (20 Moles)" - //gas_type = /datum/gas/tritium - -/datum/bounty/item/engineering/gas/hydrogen_tank - name = "Full Tank of Hydrogen" - description = "Our R&D department is working on the development of more efficient electrical batteries using hydrogen as a catalyst. Ship us a tank full of it. (20 Moles)" - //gas_type = /datum/gas/hydrogen - -/datum/bounty/item/engineering/gas/zauker_tank - name = "Full Tank of Zauker" - description = "The main planet of \[REDACTED] has been chosen as testing grounds for the new weapon that uses Zauker gas. Ship us a tank full of it. (20 Moles)" - reward = CARGO_CRATE_VALUE * 20 - //gas_type = /datum/gas/zauker - -/datum/bounty/item/engineering/emitter - name = "Emitter" - description = "We think there may be a defect in your station's emitter designs, based on the sheer number of delaminations your sector seems to see. Ship us one of yours." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/machinery/power/emitter = TRUE) - -/datum/bounty/item/engineering/hydro_tray - name = "Hydroponics Tray" - description = "The lab technicians are trying to figure out how to lower the power drain of hydroponics trays, but we fried our last one. Mind building one for us?" - reward = CARGO_CRATE_VALUE * 4 - wanted_types = list(/obj/machinery/hydroponics/constructable = TRUE) diff --git a/code/modules/cargo/bounties/item.dm b/code/modules/cargo/bounties/item.dm deleted file mode 100644 index 1aa8f9bd4f05..000000000000 --- a/code/modules/cargo/bounties/item.dm +++ /dev/null @@ -1,32 +0,0 @@ -/datum/bounty/item - ///How many items have to be shipped to complete the bounty - var/required_count = 1 - ///How many items have been shipped for the bounty so far - var/shipped_count = 0 - ///Types accepted|denied by the bounty. (including all subtypes, unless include_subtypes is set to FALSE) - var/list/wanted_types - ///Set to FALSE to make the bounty not accept subtypes of the wanted_types - var/include_subtypes = TRUE - -/datum/bounty/item/New() - ..() - wanted_types = string_assoc_list(zebra_typecacheof(wanted_types, only_root_path = !include_subtypes)) - -/datum/bounty/item/can_claim() - return ..() && shipped_count >= required_count - -/datum/bounty/item/applies_to(obj/O) - if(!is_type_in_typecache(O, wanted_types)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_count < required_count - -/datum/bounty/item/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O,/obj/item/stack)) - var/obj/item/stack/O_is_a_stack = O - shipped_count += O_is_a_stack.amount - else - shipped_count += 1 diff --git a/code/modules/cargo/bounties/mech.dm b/code/modules/cargo/bounties/mech.dm deleted file mode 100644 index 9cacba95ff30..000000000000 --- a/code/modules/cargo/bounties/mech.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/bounty/item/mech/New() - ..() - description = "Upper management has requested one [name] mech be sent as soon as possible. Ship it to receive a large payment." - -/datum/bounty/item/mech/ship(obj/O) - if(!applies_to(O)) - return - if(istype(O, /obj/vehicle/sealed/mecha)) - var/obj/vehicle/sealed/mecha/M = O - M.wreckage = null // So the mech doesn't explode. - ..() - -/datum/bounty/item/mech/ripleymk2 - name = "APLU MK-II \"Ripley\"" - reward = CARGO_CRATE_VALUE * 26 - wanted_types = list(/obj/vehicle/sealed/mecha/working/ripley/mk2 = TRUE) - -/datum/bounty/item/mech/clarke - name = "Clarke" - reward = CARGO_CRATE_VALUE * 32 - wanted_types = list(/obj/vehicle/sealed/mecha/working/clarke = TRUE) - -/datum/bounty/item/mech/odysseus - name = "Odysseus" - reward = CARGO_CRATE_VALUE * 22 - wanted_types = list(/obj/vehicle/sealed/mecha/medical/odysseus = TRUE) - -/datum/bounty/item/mech/gygax - name = "Gygax" - reward = CARGO_CRATE_VALUE * 56 - wanted_types = list(/obj/vehicle/sealed/mecha/combat/gygax = TRUE) - -/datum/bounty/item/mech/durand - name = "Durand" - reward = CARGO_CRATE_VALUE * 40 - wanted_types = list(/obj/vehicle/sealed/mecha/combat/durand = TRUE) diff --git a/code/modules/cargo/bounties/medical.dm b/code/modules/cargo/bounties/medical.dm deleted file mode 100644 index d3f678376a34..000000000000 --- a/code/modules/cargo/bounties/medical.dm +++ /dev/null @@ -1,104 +0,0 @@ -/datum/bounty/item/medical/heart - name = "Heart" - description = "Commander Johnson is in critical condition after suffering yet another heart attack. Doctors say he needs a new heart fast. Ship one, pronto! We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list( - /obj/item/organ/heart = TRUE, - /obj/item/organ/heart/cybernetic = FALSE, - /obj/item/organ/heart/cybernetic/tier2 = TRUE, - /obj/item/organ/heart/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/lung - name = "Lungs" - description = "A recent explosion at Central Command has left multiple staff with punctured lungs. Ship spare lungs to be rewarded. We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list( - /obj/item/organ/lungs = TRUE, - /obj/item/organ/lungs/cybernetic = FALSE, - /obj/item/organ/lungs/cybernetic/tier2 = TRUE, - /obj/item/organ/lungs/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/appendix - name = "Appendix" - description = "Chef Gibb of Central Command wants to prepare a meal using a very special delicacy: an appendix. If you ship one, he'll pay. We'll take a better cybernetic one, if need be." - reward = CARGO_CRATE_VALUE * 5 //there are no synthetic appendixes - wanted_types = list(/obj/item/organ/appendix = TRUE) - -/datum/bounty/item/medical/ears - name = "Ears" - description = "Multiple staff at Station 12 have been left deaf due to unauthorized clowning. Ship them new ears. " - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list( - /obj/item/organ/ears = TRUE, - /obj/item/organ/ears/cybernetic = FALSE, - /obj/item/organ/ears/cybernetic/upgraded = TRUE, - ) - -/datum/bounty/item/medical/liver - name = "Livers" - description = "Multiple high-ranking CentCom diplomats have been hospitalized with liver failure after a recent meeting with Third Soviet Union ambassadors. Help us out, will you? We'll take better cybernetic ones, if need be." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list( - /obj/item/organ/liver = TRUE, - /obj/item/organ/liver/cybernetic = FALSE, - /obj/item/organ/liver/cybernetic/tier2 = TRUE, - /obj/item/organ/liver/cybernetic/tier3 = TRUE, - ) - -/datum/bounty/item/medical/eye - name = "Organic Eyes" - description = "Station 5's Research Director Willem is requesting a few pairs of non-robotic eyes. Don't ask questions, just ship them." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list( - /obj/item/organ/eyes = TRUE, - /obj/item/organ/eyes/robotic = FALSE, - ) - -/datum/bounty/item/medical/tongue - name = "Tongues" - description = "A recent attack by Mime extremists has left staff at Station 23 speechless. Ship some spare tongues." - reward = CARGO_CRATE_VALUE * 20 - required_count = 3 - wanted_types = list(/obj/item/organ/tongue = TRUE) - -/datum/bounty/item/medical/lizard_tail - name = "Unathi Tail" - description = "The Wizard Federation has made off with Nanotrasen's supply of unathi tails. While CentCom is dealing with the wizards, can the station spare a tail of their own?" - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/organ/tail/lizard = TRUE) - -/datum/bounty/item/medical/cat_tail - name = "Cat Tail" - description = "Central Command has run out of heavy duty pipe cleaners. Can you ship over a cat tail to help us out?" - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/item/organ/tail/cat = TRUE) - -/datum/bounty/item/medical/chainsaw - name = "Chainsaw" - description = "A CMO at CentCom is having trouble operating on golems. She requests one chainsaw, please." - reward = CARGO_CRATE_VALUE * 5 - wanted_types = list(/obj/item/chainsaw = TRUE) - -/datum/bounty/item/medical/tail_whip //Like the cat tail bounties, with more processing. - name = "Nine Tails whip" - description = "Commander Jackson is looking for a fine addition to her exotic weapons collection. She will reward you handsomely for either a Cat or Liz o' Nine Tails." - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list(/obj/item/melee/chainofcommand/tailwhip = TRUE) - -/datum/bounty/item/medical/surgerycomp - name = "Surgery Computer" - description = "After another freak bombing incident at our annual cheesefest at centcom, we have a massive stack of injured crew on our end. Please send us a fresh surgery computer, if at all possible." - reward = CARGO_CRATE_VALUE * 12 - wanted_types = list(/obj/machinery/computer/operating = TRUE) - -/datum/bounty/item/medical/surgerytable - name = "Operating Table" - description = "After a recent influx of infected crew members recently, we've seen that masks just aren't cutting it alone. Silver Operating tables might just do the trick though, send us one to use." - reward = CARGO_CRATE_VALUE * 6 - wanted_types = list(/obj/structure/table/optable = TRUE) diff --git a/code/modules/cargo/bounties/mining.dm b/code/modules/cargo/bounties/mining.dm deleted file mode 100644 index 023914eb1b98..000000000000 --- a/code/modules/cargo/bounties/mining.dm +++ /dev/null @@ -1,71 +0,0 @@ -/datum/bounty/item/mining/goliath_steaks - name = "Lava-Cooked Goliath Steaks" - description = "Admiral Pavlov has gone on hunger strike ever since the canteen started serving only monkey and monkey byproducts. She is demanding lava-cooked Goliath steaks." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list(/obj/item/food/meat/steak/goliath = TRUE) - -/datum/bounty/item/mining/goliath_boat - name = "Goliath Hide Boat" - description = "Commander Menkov wants to participate in the annual Lavaland Regatta. He is asking your shipwrights to build the swiftest boat known to man." - reward = CARGO_CRATE_VALUE * 20 - wanted_types = list(/obj/vehicle/ridden/lavaboat = TRUE) - -/datum/bounty/item/mining/bone_oar - name = "Bone Oars" - description = "Commander Menkov requires oars to participate in the annual Lavaland Regatta. Ship a pair over." - reward = CARGO_CRATE_VALUE * 8 - required_count = 2 - wanted_types = list(/obj/item/oar = TRUE) - -/datum/bounty/item/mining/bone_axe - name = "Bone Axe" - description = "Station 12 has had their fire axes stolen by marauding clowns. Ship them a bone axe as a replacement." - reward = CARGO_CRATE_VALUE * 15 - wanted_types = list(/obj/item/fireaxe/boneaxe = TRUE) - -/datum/bounty/item/mining/bone_armor - name = "Bone Armor" - description = "Station 14 has volunteered their unathi crew for ballistic armor testing. Ship over some bone armor." - reward = CARGO_CRATE_VALUE * 10 - wanted_types = list(/obj/item/clothing/suit/armor/bone = TRUE) - -/datum/bounty/item/mining/skull_helmet - name = "Skull Helmet" - description = "Station 42's Head of Security has her birthday tomorrow! We want to suprise her with a fashionable skull helmet." - reward = CARGO_CRATE_VALUE * 8 - wanted_types = list(/obj/item/clothing/head/helmet/skull = TRUE) - -/datum/bounty/item/mining/bone_talisman - name = "Bone Talismans" - description = "Station 14's Research Director claims that pagan bone talismans protect their wearer. Ship them a few so they can start testing." - reward = CARGO_CRATE_VALUE * 15 - required_count = 3 - wanted_types = list(/obj/item/clothing/accessory/talisman = TRUE) - -/datum/bounty/item/mining/bone_dagger - name = "Bone Daggers" - description = "Central Command's canteen is undergoing budget cuts. Ship over some bone daggers so our Chef can keep working." - reward = CARGO_CRATE_VALUE * 10 - required_count = 3 - wanted_types = list(/obj/item/knife/combat/bone = TRUE) - -/datum/bounty/item/mining/polypore_mushroom - name = "Mushroom Bowl" - description = "Lieutenant Jeb dropped his favorite mushroom bowl. Cheer him up by shipping a new one, will you?" - reward = CARGO_CRATE_VALUE * 15 //5x mushroom shavings - wanted_types = list(/obj/item/reagent_containers/glass/bowl/mushroom_bowl = TRUE) - -/datum/bounty/item/mining/inocybe_mushroom - name = "Mushroom Caps" - description = "Our botanist claims that he can distill tasty liquor from absolutely any plant. Let's see what he'll do with Inocybe mushroom caps." - reward = CARGO_CRATE_VALUE * 9 - required_count = 3 - wanted_types = list(/obj/item/food/grown/ash_flora/mushroom_cap = TRUE) - -/datum/bounty/item/mining/porcini_mushroom - name = "Mushroom Leaves" - description = "Porcini mushroom leaves are rumored to have healing properties. Our researchers want to put that claim to the test." - reward = CARGO_CRATE_VALUE * 9 - required_count = 3 - wanted_types = list(/obj/item/food/grown/ash_flora/mushroom_leaf = TRUE) diff --git a/code/modules/cargo/bounties/reagent.dm b/code/modules/cargo/bounties/reagent.dm deleted file mode 100644 index 1d3b02262a0f..000000000000 --- a/code/modules/cargo/bounties/reagent.dm +++ /dev/null @@ -1,239 +0,0 @@ -/datum/bounty/reagent - var/required_volume = 10 - var/shipped_volume = 0 - var/datum/reagent/wanted_reagent - -/datum/bounty/reagent/can_claim() - return ..() && shipped_volume >= required_volume - -/datum/bounty/reagent/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers)) - return FALSE - if(!O.reagents || !O.reagents.has_reagent(wanted_reagent.type)) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - return shipped_volume < required_volume - -/datum/bounty/reagent/ship(obj/O) - if(!applies_to(O)) - return - shipped_volume += O.reagents.get_reagent_amount(wanted_reagent.type) - if(shipped_volume > required_volume) - shipped_volume = required_volume - -/datum/bounty/reagent/simple_drink - name = "Simple Drink" - reward = CARGO_CRATE_VALUE * 3 - -/datum/bounty/reagent/simple_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/antifreeze,\ - /datum/reagent/consumable/ethanol/andalusia,\ - /datum/reagent/consumable/tea/arnold_palmer,\ - /datum/reagent/consumable/ethanol/b52,\ - /datum/reagent/consumable/ethanol/bananahonk,\ - /datum/reagent/consumable/ethanol/beepsky_smash,\ - /datum/reagent/consumable/ethanol/between_the_sheets,\ - /datum/reagent/consumable/ethanol/bilk,\ - /datum/reagent/consumable/ethanol/black_russian,\ - /datum/reagent/consumable/ethanol/bloody_mary,\ - /datum/reagent/consumable/ethanol/brave_bull,\ - /datum/reagent/consumable/ethanol/martini,\ - /datum/reagent/consumable/ethanol/cuba_libre,\ - /datum/reagent/consumable/ethanol/eggnog,\ - /datum/reagent/consumable/ethanol/erikasurprise,\ - /datum/reagent/consumable/ethanol/ginfizz,\ - /datum/reagent/consumable/ethanol/gintonic,\ - /datum/reagent/consumable/ethanol/grappa,\ - /datum/reagent/consumable/ethanol/grog,\ - /datum/reagent/consumable/ethanol/hooch,\ - /datum/reagent/consumable/ethanol/iced_beer,\ - /datum/reagent/consumable/ethanol/irishcarbomb,\ - /datum/reagent/consumable/ethanol/manhattan,\ - /datum/reagent/consumable/ethanol/margarita,\ - /datum/reagent/consumable/ethanol/gargle_blaster,\ - /datum/reagent/consumable/ethanol/rum_coke,\ - /datum/reagent/consumable/ethanol/screwdrivercocktail,\ - /datum/reagent/consumable/ethanol/snowwhite,\ - /datum/reagent/consumable/soy_latte,\ - /datum/reagent/consumable/cafe_latte,\ - /datum/reagent/consumable/ethanol/syndicatebomb,\ - /datum/reagent/consumable/ethanol/tequila_sunrise,\ - /datum/reagent/consumable/ethanol/manly_dorf,\ - /datum/reagent/consumable/ethanol/thirteenloko,\ - /datum/reagent/consumable/triple_citrus,\ - /datum/reagent/consumable/ethanol/vodkamartini,\ - /datum/reagent/consumable/ethanol/whiskeysoda,\ - /datum/reagent/consumable/ethanol/beer/green,\ - /datum/reagent/consumable/ethanol/demonsblood,\ - /datum/reagent/consumable/ethanol/crevice_spike,\ - /datum/reagent/consumable/ethanol/singulo,\ - /datum/reagent/consumable/ethanol/whiskey_sour) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is thirsty! Send a shipment of [name] to CentCom to quench the company's thirst." - reward += rand(0, 2) * 500 - -/datum/bounty/reagent/complex_drink - name = "Complex Drink" - reward = CARGO_CRATE_VALUE * 8 - -/datum/bounty/reagent/complex_drink/New() - // Don't worry about making this comprehensive. It doesn't matter if some drinks are skipped. - var/static/list/possible_reagents = list(\ - /datum/reagent/consumable/ethanol/atomicbomb,\ - /datum/reagent/consumable/ethanol/bacchus_blessing,\ - /datum/reagent/consumable/ethanol/bastion_bourbon,\ - /datum/reagent/consumable/ethanol/booger,\ - /datum/reagent/consumable/ethanol/hippies_delight,\ - /datum/reagent/consumable/ethanol/drunkenblumpkin,\ - /datum/reagent/consumable/ethanol/fetching_fizz,\ - /datum/reagent/consumable/ethanol/goldschlager,\ - /datum/reagent/consumable/ethanol/manhattan_proj,\ - /datum/reagent/consumable/ethanol/narsour,\ - /datum/reagent/consumable/ethanol/neurotoxin,\ - /datum/reagent/consumable/ethanol/patron,\ - /datum/reagent/consumable/ethanol/quadruple_sec,\ - /datum/reagent/consumable/bluecherryshake,\ - /datum/reagent/consumable/doctor_delight,\ - /datum/reagent/consumable/ethanol/silencer,\ - /datum/reagent/consumable/ethanol/peppermint_patty,\ - /datum/reagent/consumable/ethanol/aloe,\ - /datum/reagent/consumable/pumpkin_latte) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is offering a reward for talented mixologists. Ship a container of [name] to claim the prize." - reward += rand(0, 4) * 500 - -/datum/bounty/reagent/chemical_simple - name = "Simple Chemical" - reward = CARGO_CRATE_VALUE * 8 - required_volume = 30 - -/datum/bounty/reagent/chemical_simple/New() - // Chemicals that can be mixed by a single skilled Chemist. - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/leporazine,\ - /datum/reagent/medicine/clonexadone,\ - /datum/reagent/medicine/mine_salve,\ - /datum/reagent/medicine/c2/convermol,\ - /datum/reagent/medicine/ephedrine,\ - /datum/reagent/medicine/diphenhydramine,\ - /datum/reagent/drug/space_drugs,\ - /datum/reagent/drug/blastoff,\ - /datum/reagent/gunpowder,\ - /datum/reagent/napalm,\ - /datum/reagent/firefighting_foam,\ - /datum/reagent/consumable/mayonnaise,\ - /datum/reagent/toxin/itching_powder,\ - /datum/reagent/toxin/cyanide,\ - /datum/reagent/toxin/heparin,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/drug/aranesp,\ - /datum/reagent/drug/krokodil,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/teslium,\ - /datum/reagent/toxin/anacea,\ - /datum/reagent/pax) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is in desperate need of the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 4) * 500 //4000 to 6000 credits - -/datum/bounty/reagent/chemical_complex - name = "Rare Chemical" - reward = CARGO_CRATE_VALUE * 12 - required_volume = 20 - -/datum/bounty/reagent/chemical_complex/New() - // Reagents that require interaction with multiple departments or are a pain to mix. Lower required_volume since acquiring 30u of some is unrealistic - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/pyroxadone,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/medicine/regen_jelly,\ - /datum/reagent/drug/bath_salts,\ - /datum/reagent/hair_dye,\ - /datum/reagent/consumable/honey,\ - /datum/reagent/consumable/frostoil,\ - /datum/reagent/toxin/slimejelly,\ - /datum/reagent/teslium/energized_jelly,\ - /datum/reagent/toxin/mimesbane,\ - /datum/reagent/medicine/strange_reagent,\ - /datum/reagent/nitroglycerin,\ - /datum/reagent/medicine/rezadone,\ - /datum/reagent/toxin/zombiepowder,\ - /datum/reagent/toxin/ghoulpowder,\ - /datum/reagent/mulligan) - - var/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = wanted_reagent.name - description = "CentCom is paying premium for the chemical [name]. Ship a container of it to be rewarded." - reward += rand(0, 5) * 750 //6000 to 9750 credits - -/datum/bounty/pill - /// quantity of the pills needed, this value acts as minimum, gets randomized on new() - var/required_ammount = 80 - /// counter for pills sent - var/shipped_ammount = 0 - /// reagent requested - var/datum/reagent/wanted_reagent - /// minimum volume of chemical needed, gets randomized on new() - var/wanted_vol = 30 - -/datum/bounty/pill/can_claim() - return ..() && shipped_ammount >= required_ammount - -/datum/bounty/pill/applies_to(obj/O) - if(!istype(O, /obj/item/reagent_containers/pill)) - return FALSE - if(O?.reagents.get_reagent_amount(wanted_reagent.type) >= wanted_vol) - return TRUE - return FALSE - -/datum/bounty/pill/ship(obj/O) - if(!applies_to(O)) - return - shipped_ammount += 1 - if(shipped_ammount > required_ammount) - shipped_ammount = required_ammount - -/datum/bounty/pill/simple_pill - name = "Simple Pill" - reward = CARGO_CRATE_VALUE * 20 - -/datum/bounty/pill/simple_pill/New() - //reagent that are possible to be chem factory'd - var/static/list/possible_reagents = list(\ - /datum/reagent/medicine/spaceacillin,\ - /datum/reagent/medicine/c2/synthflesh,\ - /datum/reagent/medicine/pen_acid,\ - /datum/reagent/medicine/atropine,\ - /datum/reagent/medicine/cryoxadone,\ - /datum/reagent/medicine/salbutamol,\ - /datum/reagent/medicine/c2/hercuri,\ - /datum/reagent/medicine/c2/probital,\ - /datum/reagent/drug/methamphetamine,\ - /datum/reagent/nitrous_oxide,\ - /datum/reagent/barbers_aid,\ - /datum/reagent/pax,\ - /datum/reagent/flash_powder,\ - /datum/reagent/phlogiston,\ - /datum/reagent/firefighting_foam) - - var/datum/reagent/reagent_type = pick(possible_reagents) - wanted_reagent = new reagent_type - name = "[wanted_reagent.name] pills" - required_ammount += rand(1,60) - wanted_vol += rand(1,20) - description = "CentCom requires [required_ammount] of [name] containing at least [wanted_vol] each. Ship a container of it to be rewarded." - reward += rand(1, 5) * (CARGO_CRATE_VALUE * 6) diff --git a/code/modules/cargo/bounties/security.dm b/code/modules/cargo/bounties/security.dm deleted file mode 100644 index bce1fcbe210e..000000000000 --- a/code/modules/cargo/bounties/security.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/bounty/item/security/recharger - name = "Rechargers" - description = "The Mars Executive Outcomes military academy is conducting marksmanship exercises. They request that rechargers be shipped." - reward = CARGO_CRATE_VALUE * 4 - required_count = 3 - wanted_types = list(/obj/machinery/recharger = TRUE) - -/datum/bounty/item/security/pepperspray - name = "Pepperspray" - description = "We've been having a bad run of riots on Space Station 76. We could use some new pepperspray cans." - reward = CARGO_CRATE_VALUE * 6 - required_count = 4 - wanted_types = list(/obj/item/reagent_containers/spray/pepper = TRUE) - -/datum/bounty/item/security/prison_clothes - name = "Prison Uniforms" - description = "Terragov has been unable to source any new prisoner uniforms, so if you have any spares, we'll take them off your hands." - reward = CARGO_CRATE_VALUE * 4 - required_count = 4 - wanted_types = list(/obj/item/clothing/under/rank/prisoner = TRUE) - -/datum/bounty/item/security/plates - name = "License Plates" - description = "As a result of a bad clown car crash, we could use an advance on some of your prisoner's license plates." - reward = CARGO_CRATE_VALUE * 2 - required_count = 10 - wanted_types = list(/obj/item/stack/license_plates/filled = TRUE) - -/datum/bounty/item/security/earmuffs - name = "Earmuffs" - description = "Central Command is getting tired of your station's messages. They've ordered that you ship some earmuffs to lessen the annoyance." - reward = CARGO_CRATE_VALUE * 2 - wanted_types = list(/obj/item/clothing/ears/earmuffs = TRUE) - -/datum/bounty/item/security/handcuffs - name = "Handcuffs" - description = "A large influx of escaped convicts have arrived at Central Command. Now is the perfect time to ship out spare handcuffs (or restraints)." - reward = CARGO_CRATE_VALUE * 2 - required_count = 5 - wanted_types = list(/obj/item/restraints/handcuffs = TRUE) - - -///Bounties that require you to perform documentation and inspection of your department to send to centcom. -/datum/bounty/item/security/paperwork - name = "Routine Security Inspection" - description = "Perform a routine security inspection using an N-spect scanner on the following station area:" - required_count = 1 - wanted_types = list(/obj/item/paper/report = TRUE) - reward = CARGO_CRATE_VALUE * 5 - var/area/demanded_area - -/datum/bounty/item/security/paperwork/New() - ///list of areas for security to choose from to perform an inspection. - var/static/list/possible_areas = list(\ - /area/station/maintenance,\ - /area/station/commons,\ - /area/station/service,\ - /area/station/hallway/primary,\ - /area/station/security/office,\ - /area/station/security/prison,\ - /area/station/security/range,\ - /area/station/security/checkpoint,\ - /area/station/security/interrogation) - demanded_area = pick(possible_areas) - name = name + ": [initial(demanded_area.name)]" - description = initial(description) + " [initial(demanded_area.name)]" - -/datum/bounty/item/security/paperwork/applies_to(obj/O) - . = ..() - if(!istype(O, /obj/item/paper/report)) - return FALSE - var/obj/item/paper/report/slip = O - if(istype(slip.scanned_area, demanded_area)) - return TRUE - return FALSE diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index 25cf8d5b8b90..000000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item/slime - reward = CARGO_CRATE_VALUE * 6 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green = TRUE) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink = TRUE) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold = TRUE) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil = TRUE) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black = TRUE) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink = TRUE) - -/datum/bounty/item/slime/adamantine - name = "Adamantine Slime Extract" - wanted_types = list(/obj/item/slime_extract/adamantine = TRUE) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow = TRUE) diff --git a/code/modules/cargo/bounties/special.dm b/code/modules/cargo/bounties/special.dm deleted file mode 100644 index 0619f8fd97f7..000000000000 --- a/code/modules/cargo/bounties/special.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/bounty/item/alien_organs - name = "Alien Organs" - description = "Nanotrasen is interested in studying Xenomorph biology. Ship a set of organs to be thoroughly compensated." - reward = CARGO_CRATE_VALUE * 50 - required_count = 3 - wanted_types = list( - /obj/item/organ/brain/alien = TRUE, - /obj/item/organ/alien = TRUE, - /obj/item/organ/body_egg/alien_embryo = TRUE, - /obj/item/organ/liver/alien = TRUE, - /obj/item/organ/tongue/alien = TRUE, - /obj/item/organ/eyes/night_vision/alien = TRUE, - ) - -/datum/bounty/item/syndicate_documents - name = "Syndicate Documents" - description = "Intel regarding the syndicate is highly prized at CentCom. If you find syndicate documents, ship them. You could save lives." - reward = CARGO_CRATE_VALUE * 30 - wanted_types = list( - /obj/item/documents/syndicate = TRUE, - /obj/item/documents/photocopy = TRUE, - ) - -/datum/bounty/item/syndicate_documents/applies_to(obj/O) - if(!..()) - return FALSE - if(istype(O, /obj/item/documents/photocopy)) - var/obj/item/documents/photocopy/Copy = O - return (Copy.copy_type && ispath(Copy.copy_type, /obj/item/documents/syndicate)) - return TRUE - -/datum/bounty/item/adamantine - name = "Adamantine" - description = "Nanotrasen's anomalous materials division is in desparate need for Adamantine. Send them a large shipment and we'll make it worth your while." - reward = CARGO_CRATE_VALUE * 70 - required_count = 10 - wanted_types = list(/obj/item/stack/sheet/mineral/adamantine = TRUE) - -/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." - reward = CARGO_CRATE_VALUE * 2 - required_count = 10 - wanted_types = list(/obj/item/trash = TRUE) diff --git a/code/modules/cargo/bounties/virus.dm b/code/modules/cargo/bounties/virus.dm deleted file mode 100644 index daa41fbea811..000000000000 --- a/code/modules/cargo/bounties/virus.dm +++ /dev/null @@ -1,72 +0,0 @@ -/datum/bounty/virus - reward = CARGO_CRATE_VALUE * 10 - var/shipped = FALSE - var/stat_value = 0 - var/stat_name = "" - -/datum/bounty/virus/New() - ..() - stat_value = rand(4, 11) - if(rand(3) == 1) - stat_value *= -1 - name = "Virus ([stat_name] of [stat_value])" - description = "Nanotrasen is interested in a virus with a [stat_name] stat of exactly [stat_value]. Central Command will pay handsomely for such a virus." - reward += rand(0, 4) * CARGO_CRATE_VALUE - -/datum/bounty/virus/can_claim() - return ..() && shipped - -/datum/bounty/virus/applies_to(obj/O) - if(shipped) - return FALSE - if(O.flags_1 & HOLOGRAM_1) - return FALSE - if(!istype(O, /obj/item/reagent_containers || !O.reagents || !O.reagents.reagent_list)) - return FALSE - var/datum/reagent/blood/B = locate() in O.reagents.reagent_list - if(!B) - return FALSE - for(var/V in B.get_diseases()) - if(!istype(V, /datum/disease/advance)) - continue - if(accepts_virus(V)) - return TRUE - return FALSE - -/datum/bounty/virus/ship(obj/O) - if(!applies_to(O)) - return - shipped = TRUE - - -/datum/bounty/virus/proc/accepts_virus(V) - return TRUE - -/datum/bounty/virus/resistance - stat_name = "resistance" - -/datum/bounty/virus/resistance/accepts_virus(V) - var/datum/disease/advance/A = V - return A.totalResistance() == 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 - -/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 - -/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 - diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm deleted file mode 100644 index 85d8d8864db3..000000000000 --- a/code/modules/cargo/bounty.dm +++ /dev/null @@ -1,73 +0,0 @@ -/datum/bounty - var/name - var/description - var/reward = 1000 // In credits. - var/claimed = FALSE - var/high_priority = FALSE - -/datum/bounty/proc/can_claim() - return !claimed - -/// 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.station_master - if(D) - D.adjust_money(reward * SSeconomy.bounty_modifier) - claimed = TRUE - -/// If an item sent in the cargo shuttle can satisfy the bounty. -/datum/bounty/proc/applies_to(obj/O) - return FALSE - -/// Called when an object is shipped on the cargo shuttle. -/datum/bounty/proc/ship(obj/O) - return - -/** Returns a new bounty of random type, but does not add it to GLOB.bounties_list. - * - * *Guided determines what specific catagory of bounty should be chosen. - */ -/proc/random_bounty(guided = 0) - var/bounty_num - if(guided && (guided != CIV_JOB_RANDOM)) - bounty_num = guided - else - bounty_num = rand(1,11) - switch(bounty_num) - if(1) - var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) - return new subtype - if(2) - var/subtype = pick(subtypesof(/datum/bounty/item/mech)) - return new subtype - if(3) - var/subtype = pick(subtypesof(/datum/bounty/item/chef)) - return new subtype - if(4) - var/subtype = pick(subtypesof(/datum/bounty/item/security)) - return new subtype - if(5) - if(rand(2) == 1) - return new /datum/bounty/reagent/simple_drink - return new /datum/bounty/reagent/complex_drink - if(6) - if(rand(2) == 1) - return new /datum/bounty/reagent/chemical_simple - return new /datum/bounty/reagent/chemical_complex - if(7) - var/subtype = pick(subtypesof(/datum/bounty/virus)) - return new subtype - if(8) - var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) - return new subtype - if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/mining)) - return new subtype - if(10) - var/subtype = pick(subtypesof(/datum/bounty/item/medical)) - return new subtype - if(11) - var/subtype = pick(subtypesof(/datum/bounty/item/botany)) - return new subtype - diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 84c64ab5bbf1..6391b52af576 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -68,9 +68,9 @@ else var/mob/user_mob = user holder = user_mob.client //if its a mob, assign the mob's client to holder - bay = locate(/area/centcom/central_command_areas/supplypod/loading/one) in GLOB.sortedAreas //Locate the default bay (one) from the centcom map + bay = locate(/area/centcom/central_command_areas/supplypod/loading/one) in GLOB.areas //Locate the default bay (one) from the centcom map bayNumber = bay.loading_id //Used as quick reference to what bay we're taking items from - var/area/pod_storage_area = locate(/area/centcom/central_command_areas/supplypod/pod_storage) in GLOB.sortedAreas + var/area/pod_storage_area = locate(/area/centcom/central_command_areas/supplypod/pod_storage) in GLOB.areas 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) @@ -577,16 +577,13 @@ else if(picking_dropoff_turf) holder.mouse_up_icon = 'icons/effects/mouse_pointers/supplypod_pickturf.dmi' //Icon for when mouse is released holder.mouse_down_icon = 'icons/effects/mouse_pointers/supplypod_pickturf_down.dmi' //Icon for when mouse is pressed - holder.mouse_override_icon = holder.mouse_up_icon //Icon for idle mouse (same as icon for when released) - holder.mouse_pointer_icon = holder.mouse_override_icon + holder.mob.update_mouse_pointer() 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.mouse_override_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)() + holder.mob.update_mouse_pointer() //set the mouse icons to null, then call update_mouse_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/modifiers = params2list(params) diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index dba06acb96fd..9a571da7730a 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -30,7 +30,7 @@ discount_pct_off = text2num(discount_pct_off) name = "coupon - [round(discount_pct_off * 100)]% off [initial(discounted_pack.name)]" -/obj/item/coupon/attack_atom(obj/O, mob/living/user, params) +/obj/item/coupon/attack_obj(obj/O, mob/living/user, params) if(!istype(O, /obj/machinery/computer/cargo)) return ..() if(discount_pct_off == COUPON_OMEN) diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index e735617300c9..2c9cb0fa9225 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -69,9 +69,11 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( "packs" = list(), ) supply_data += list(target_group) + //skip packs we should not show, even if we should show the group - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.DropPodOnly || pack.goody) + if(!can_purchase_pack(pack)) continue + //finally the pack data itself target_group["packs"] += list(list( "name" = pack.name, @@ -79,6 +81,9 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( "id" = pack.id, "desc" = pack.desc || pack.name, // If there is a description, use it. Otherwise use the pack's name. )) + + sortTim(data["supplies"], GLOBAL_PROC_REF(cmp_text_asc)) + data["supplies"] = supply_data return data @@ -120,8 +125,10 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( if(!pack) say("Something went wrong!") CRASH("requested supply pack id \"[id]\" not found!") - if(pack.hidden || pack.DropPodOnly || pack.special) + + if(!can_purchase_pack(pack)) return + var/name = "*None Provided*" var/rank = "*None Provided*" var/ckey = usr.ckey @@ -146,6 +153,20 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( say("Order processed. Cargo will deliver the crate when it comes in on their shuttle. NOTICE: Heads of staff may override the order.") calculate_cooldown(pack.cost) +/obj/machinery/computer/department_orders/proc/can_purchase_pack(datum/supply_pack/pack) + . = TRUE + if((pack.supply_flags & SUPPLY_PACK_EMAG) && !(obj_flags & EMAGGED)) + return FALSE + + if(pack.special && !pack.special_enabled) + return FALSE + + if(pack.supply_flags & SUPPLY_PACK_DROPPOD_ONLY) + return FALSE + + if(pack.goody) + return FALSE + ///signal when the supply shuttle begins to spawn orders. we forget the current order preventing it from being overridden (since it's already past the point of no return on undoing the order) /obj/machinery/computer/department_orders/proc/finalize_department_order(datum/subsystem) SIGNAL_HANDLER @@ -177,7 +198,7 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( department_delivery_areas = list(/area/station/engineering/main) override_access = ACCESS_CE req_one_access = REGION_ACCESS_ENGINEERING - dep_groups = list("Engineering", "Engine Construction", "Canisters & Materials") + dep_groups = list("Engineering", "Engine Construction", "Materials") /obj/machinery/computer/department_orders/science name = "science order console" @@ -201,4 +222,4 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( department_delivery_areas = list(/area/station/medical/medbay/central) override_access = ACCESS_CMO req_one_access = REGION_ACCESS_MEDBAY - dep_groups = list("Medical") + dep_groups = list("Medical", "Reagents") diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index 26d0422c7f8e..988e1b4680ea 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -24,27 +24,3 @@ to_chat(user, span_notice("Scanned [O], value: [price] credits[O.contents.len ? " (contents included)" : ""].")) else to_chat(user, span_warning("Scanned [O], no export value.")) - - if(ishuman(user)) - var/mob/living/carbon/human/scan_human = user - if(istype(O, /obj/item/bounty_cube)) - var/obj/item/bounty_cube/cube = O - var/datum/bank_account/scanner_account = scan_human.get_bank_account() - - if(!istype(get_area(cube), /area/shuttle/supply)) - to_chat(user, span_warning("Shuttle placement not detected. Handling tip not registered.")) - - else if(cube.bounty_handler_account) - to_chat(user, span_warning("Bank account for handling tip already registered!")) - - else if(scanner_account) - cube.AddComponent(/datum/component/pricetag, scanner_account, cube.handler_tip, FALSE) - - cube.bounty_handler_account = scanner_account - cube.bounty_handler_account.bank_card_talk("Bank account for [price ? "[price * cube.handler_tip] credit " : ""]handling tip successfully registered.") - - if(cube.bounty_holder_account != cube.bounty_handler_account) //No need to send a tracking update to the person scanning it - cube.bounty_holder_account.bank_card_talk("[cube] was scanned in \the [get_area(cube)] by [scan_human] ([scan_human.job]).") - - else - to_chat(user, span_warning("Bank account not detected. Handling tip not registered.")) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 0350175023e8..8fc51af49cf6 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -81,24 +81,21 @@ Then the player gets the profit from selling his own wasted time. /// cost includes elasticity, this does not. var/init_cost - - /datum/export/New() ..() - SSprocessing.processing += src init_cost = cost export_types = typecacheof(export_types, only_root_path = !include_subtypes, ignore_root_path = FALSE) exclude_types = typecacheof(exclude_types) /datum/export/Destroy() - SSprocessing.processing -= src + STOP_PROCESSING(SSprocessing, src) return ..() /datum/export/process() - ..() cost *= NUM_E**(k_elasticity * (1/30)) - if(cost > init_cost) + if(cost >= init_cost) cost = init_cost + return PROCESS_KILL // Checks the cost. 0 cost items are skipped in export. /datum/export/proc/get_cost(obj/O, apply_elastic = TRUE) @@ -158,6 +155,8 @@ Then the player gets the profit from selling his own wasted time. if(!dry_run) if(apply_elastic) cost *= NUM_E**(-1 * k_elasticity * export_amount) //marginal cost modifier + START_PROCESSING(SSprocessing, src) + SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[sold_item.type]", "[export_value]")) return TRUE diff --git a/code/modules/cargo/exports/civilain_bounty.dm b/code/modules/cargo/exports/civilain_bounty.dm deleted file mode 100644 index 05241e0ab755..000000000000 --- a/code/modules/cargo/exports/civilain_bounty.dm +++ /dev/null @@ -1,8 +0,0 @@ -/datum/export/bounty_box - cost = 1 - k_elasticity = 0 //Bounties are non-elastic funds. - unit_name = "completed bounty cube" - export_types = list(/obj/item/bounty_cube) - -/datum/export/bounty_box/get_cost(obj/item/bounty_cube/cube, apply_elastic) - return cube.bounty_value + (cube.bounty_value * cube.speed_bonus) diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 32c3f9f7085d..51c64efef3e4 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -3,7 +3,7 @@ k_elasticity = 0 unit_name = "crate" export_types = list(/obj/structure/closet/crate) - exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden, /obj/structure/closet/crate/mail) + exclude_types = list(/obj/structure/closet/crate/large, /obj/structure/closet/crate/wooden, /obj/structure/closet/crate/mail, /obj/structure/closet/crate/coffin) /datum/export/large/crate/total_printout(datum/export_report/ex, notes = TRUE) // That's why a goddamn metal crate costs that much. . = ..() @@ -26,11 +26,6 @@ export_types = list(/obj/structure/closet/crate/wooden) exclude_types = list() -/datum/export/large/crate/coffin - cost = CARGO_CRATE_VALUE/2 //50 wooden crates cost 2000 points, and you can make 10 coffins in seconds with those planks. Each coffin selling for 250 means you can make a net gain of 500 points for wasting your time making coffins. - unit_name = "coffin" - export_types = list(/obj/structure/closet/crate/coffin) - /datum/export/large/reagent_dispenser cost = CARGO_CRATE_VALUE * 0.5 // +0-400 depending on amount of reagents left var/contents_cost = CARGO_CRATE_VALUE * 0.8 diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm deleted file mode 100644 index e6dd51e1a3b9..000000000000 --- a/code/modules/cargo/exports/lavaland.dm +++ /dev/null @@ -1,57 +0,0 @@ -//Tendril chest artifacts and ruin loot. -//Consumable or one-use items like the magic D20 and gluttony's blessing are omitted - -/datum/export/lavaland/minor - cost = CARGO_CRATE_VALUE * 20 - unit_name = "minor lava planet artifact" - export_types = list(/obj/item/immortality_talisman, - /obj/item/book_of_babel, - /obj/item/wisp_lantern, - /obj/item/katana/cursed, - /obj/item/clothing/glasses/godeye, - /obj/item/melee/ghost_sword, - /obj/item/clothing/neck/necklace/memento_mori, - /obj/item/organ/heart/cursed/wizard, - /obj/item/clothing/suit/hooded/cloak/drake, - /obj/item/ship_in_a_bottle, - /obj/item/clothing/shoes/clown_shoes/banana_shoes, - /obj/item/gun/magic/staff/honk, - /obj/item/knife/envy, - /obj/item/gun/ballistic/revolver/russian/soul, - /obj/item/veilrender/vealrender, - /obj/item/clothing/suit/hooded/berserker, - /obj/item/freeze_cube, - /obj/item/soulstone/anybody/mining, - /obj/item/clothing/gloves/gauntlets, - /obj/item/jacobs_ladder, - ) - -/datum/export/lavaland/major //valuable chest/ruin loot, minor megafauna loot - cost = CARGO_CRATE_VALUE * 40 - unit_name = "lava planet artifact" - export_types = list(/obj/item/guardiancreator/miner, - /obj/item/rod_of_asclepius, - /obj/item/dragons_blood, - /obj/item/lava_staff, - /obj/item/prisoncube, - ) - -//Megafauna loot, except for ash drakes - -/datum/export/lavaland/megafauna - cost = CARGO_CRATE_VALUE * 80 - unit_name = "major lava planet artifact" - export_types = list(/obj/item/hierophant_club, - /obj/item/melee/cleaving_saw, - /obj/item/organ/vocal_cords/colossus, - /obj/machinery/anomalous_crystal, - /obj/item/mayhem, - /obj/item/gun/magic/staff/spellblade, - /obj/item/storm_staff, - /obj/item/clothing/suit/hooded/hostile_environment, - ) - -/datum/export/lavaland/megafauna/total_printout(datum/export_report/ex, notes = TRUE) //in the unlikely case a miner feels like selling megafauna loot - . = ..() - if(. && notes) - . += " On behalf of the Nanotrasen RnD division: Thank you for your hard work." diff --git a/code/modules/cargo/exports/materials.dm b/code/modules/cargo/exports/materials.dm index da4112a66655..fbb589a0ee6a 100644 --- a/code/modules/cargo/exports/materials.dm +++ b/code/modules/cargo/exports/materials.dm @@ -2,22 +2,27 @@ cost = 5 // Cost per MINERAL_MATERIAL_AMOUNT, which is 2000cm3 as of April 2016. message = "cm3 of developer's tears. Please, report this on github" amount_report_multiplier = MINERAL_MATERIAL_AMOUNT - var/material_id = null + var/datum/material/material_path = null export_types = list( /obj/item/stack/sheet/mineral, /obj/item/stack/tile/mineral, /obj/item/stack/ore, /obj/item/coin) + +/datum/export/material/New() + . = ..() + cost = initial(material_path.value_per_unit) * MINERAL_MATERIAL_AMOUNT + // Yes, it's a base type containing export_types. -// But it has no material_id, so any applies_to check will return false, and these types reduce amount of copypasta a lot +// But it has no material_path, so any applies_to check will return false, and these types reduce amount of copypasta a lot /datum/export/material/get_amount(obj/O) - if(!material_id) + if(!material_path) return 0 if(!isitem(O)) return 0 var/obj/item/I = O var/list/mat_comp = I.get_material_composition(BREAKDOWN_FLAGS_EXPORT) - var/datum/material/mat_ref = ispath(material_id) ? locate(material_id) in mat_comp : GET_MATERIAL_REF(material_id) + var/datum/material/mat_ref = ispath(material_path) ? locate(material_path) in mat_comp : GET_MATERIAL_REF(material_path) if(isnull(mat_comp[mat_ref])) return 0 @@ -30,89 +35,69 @@ // Materials. Nothing but plasma is really worth selling. Better leave it all to RnD and sell some plasma instead. /datum/export/material/bananium - cost = CARGO_CRATE_VALUE * 2 - material_id = /datum/material/bananium + material_path = /datum/material/bananium message = "cm3 of bananium" /datum/export/material/diamond - cost = CARGO_CRATE_VALUE - material_id = /datum/material/diamond + material_path = /datum/material/diamond message = "cm3 of diamonds" /datum/export/material/plasma - cost = CARGO_CRATE_VALUE * 0.4 k_elasticity = 0 - material_id = /datum/material/plasma + material_path = /datum/material/plasma message = "cm3 of plasma" /datum/export/material/uranium - cost = CARGO_CRATE_VALUE * 0.2 - material_id = /datum/material/uranium + material_path = /datum/material/uranium message = "cm3 of uranium" /datum/export/material/gold - cost = CARGO_CRATE_VALUE * 0.25 - material_id = /datum/material/gold + material_path = /datum/material/gold message = "cm3 of gold" /datum/export/material/silver - cost = CARGO_CRATE_VALUE * 0.1 - material_id = /datum/material/silver + material_path = /datum/material/silver message = "cm3 of silver" /datum/export/material/titanium - cost = CARGO_CRATE_VALUE * 0.25 - material_id = /datum/material/titanium + material_path = /datum/material/titanium message = "cm3 of titanium" -/datum/export/material/adamantine - cost = CARGO_CRATE_VALUE - material_id = /datum/material/adamantine - message = "cm3 of adamantine" - /datum/export/material/mythril - cost = CARGO_CRATE_VALUE * 3 - material_id = /datum/material/mythril + material_path = /datum/material/mythril message = "cm3 of mythril" /datum/export/material/bscrystal - cost = CARGO_CRATE_VALUE * 0.6 message = "of bluespace crystals" - material_id = /datum/material/bluespace + material_path = /datum/material/bluespace /datum/export/material/plastic - cost = CARGO_CRATE_VALUE * 0.05 message = "cm3 of plastic" - material_id = /datum/material/plastic + material_path = /datum/material/plastic /datum/export/material/runite - cost = CARGO_CRATE_VALUE * 1.2 message = "cm3 of runite" - material_id = /datum/material/runite + material_path = /datum/material/runite /datum/export/material/iron - cost = CARGO_CRATE_VALUE * 0.01 message = "cm3 of iron" - material_id = /datum/material/iron + material_path = /datum/material/iron export_types = list( /obj/item/stack/sheet/iron, /obj/item/stack/tile/iron, /obj/item/stack/rods, /obj/item/stack/ore, /obj/item/coin) /datum/export/material/glass - cost = CARGO_CRATE_VALUE * 0.01 message = "cm3 of glass" - material_id = /datum/material/glass + material_path = /datum/material/glass export_types = list(/obj/item/stack/sheet/glass, /obj/item/stack/ore, /obj/item/shard) /datum/export/material/hot_ice - cost = CARGO_CRATE_VALUE * 0.8 message = "cm3 of Hot Ice" - material_id = /datum/material/hot_ice + material_path = /datum/material/hot_ice export_types = /obj/item/stack/sheet/hot_ice /datum/export/material/metal_hydrogen - cost = CARGO_CRATE_VALUE * 1.05 message = "cm3 of metallic hydrogen" - material_id = /datum/material/metalhydrogen + material_path = /datum/material/metalhydrogen export_types = /obj/item/stack/sheet/mineral/metal_hydrogen diff --git a/code/modules/cargo/exports/misc_items.dm b/code/modules/cargo/exports/misc_items.dm new file mode 100644 index 000000000000..316aa61438f5 --- /dev/null +++ b/code/modules/cargo/exports/misc_items.dm @@ -0,0 +1,18 @@ + +/datum/export/chem_cartridge + k_elasticity = FALSE + +/datum/export/chem_cartridge/small + unit_name = /obj/item/reagent_containers/chem_cartridge/small::name + export_types = list(/obj/item/reagent_containers/chem_cartridge/small) + cost = CARTRIDGE_VOLUME_SMALL / 25 + +/datum/export/chem_cartridge/medium + unit_name = /obj/item/reagent_containers/chem_cartridge/medium::name + export_types = list(/obj/item/reagent_containers/chem_cartridge/medium) + cost = CARTRIDGE_VOLUME_MEDIUM / 25 + +/datum/export/chem_cartridge/large + unit_name = /obj/item/reagent_containers/chem_cartridge/large::name + export_types = list(/obj/item/reagent_containers/chem_cartridge/large) + cost = CARTRIDGE_VOLUME_LARGE / 25 diff --git a/code/modules/cargo/exports/sheets.dm b/code/modules/cargo/exports/sheets.dm index 4df33ec69a58..465e76690142 100644 --- a/code/modules/cargo/exports/sheets.dm +++ b/code/modules/cargo/exports/sheets.dm @@ -37,7 +37,7 @@ /datum/export/stack/skin/lizard cost = CARGO_CRATE_VALUE * 0.75 - unit_name = "unathi hide" + unit_name = "jinan hide" export_types = list(/obj/item/stack/sheet/animalhide/lizard) /datum/export/stack/skin/gondola diff --git a/code/modules/cargo/exports/xenobio.dm b/code/modules/cargo/exports/xenobio.dm index fdd8d38aa4fc..20757cdfaf70 100644 --- a/code/modules/cargo/exports/xenobio.dm +++ b/code/modules/cargo/exports/xenobio.dm @@ -33,7 +33,7 @@ /datum/export/slime/epic //EPIIIIIIC cost = CARGO_CRATE_VALUE * 0.44 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) + 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/lightpink,/obj/item/slime_extract/bluespace) /datum/export/slime/rainbow cost = CARGO_CRATE_VALUE diff --git a/code/modules/cargo/expressconsole.dm b/code/modules/cargo/expressconsole.dm index bbe90bb65c8c..835eb9ade459 100644 --- a/code/modules/cargo/expressconsole.dm +++ b/code/modules/cargo/expressconsole.dm @@ -12,29 +12,42 @@ 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 + blockade_warning = "Bluespace instability detected. Delivery impossible." - req_access = list(ACCESS_QM) is_express = TRUE interface_type = "CargoExpress" + cargo_account = ACCOUNT_CAR + + COOLDOWN_DECLARE(order_cd) + + var/message = "Sales are near-instantaneous - please choose carefully." + /// The name of the UI + var/ui_title = "Supply Console" + /// The currency displayed + var/ui_currency = "credits" + + /// An optional extended travel time for supply pods. + var/travel_time_in_minutes = 0 - var/message var/printed_beacons = 0 //number of beacons printed. Used to determine beacon names. - var/list/meme_pack_data + var/list/buyable_supply_packs var/obj/item/supplypod_beacon/beacon //the linked supplypod beacon var/area/landingzone = /area/station/cargo/storage //where we droppin boys var/podType = /obj/structure/closet/supplypod var/cooldown = 0 //cooldown to prevent printing supplypod beacon spam - var/locked = TRUE //is the console locked? unlock with ID + var/locked = FALSE //is the console locked? unlock with ID var/usingBeacon = FALSE //is the console in beacon mode? exists to let beacon know when a pod may come in + var/can_use_without_beacon = TRUE /obj/machinery/computer/cargo/express/Initialize(mapload) . = ..() - packin_up() + buyable_supply_packs = get_buyable_supply_packs() /obj/machinery/computer/cargo/express/on_construction() . = ..() - packin_up() + buyable_supply_packs = get_buyable_supply_packs() /obj/machinery/computer/cargo/express/Destroy() if(beacon) @@ -63,68 +76,90 @@ /obj/machinery/computer/cargo/express/emag_act(mob/living/user) if(obj_flags & EMAGGED) return + if(user) user.visible_message(span_warning("[user] swipes a suspicious card through [src]!"), span_notice("You change the routing protocols, allowing the Supply Pod to land anywhere on the station.")) + obj_flags |= EMAGGED - contraband = TRUE + supply_flags |= SUPPLY_PACK_CONTRABAND|SUPPLY_PACK_EMAG + // This also sets this on the circuit board var/obj/item/circuitboard/computer/cargo/board = circuit board.obj_flags |= EMAGGED - board.contraband = TRUE - packin_up() - -/obj/machinery/computer/cargo/express/proc/packin_up() // oh shit, I'm sorry - meme_pack_data = list() // sorry for what? - for(var/pack in SSshuttle.supply_packs) // our quartermaster taught us not to be ashamed of our supply packs - var/datum/supply_pack/P = SSshuttle.supply_packs[pack] // specially since they're such a good price and all - if(!meme_pack_data[P.group]) // yeah, I see that, your quartermaster gave you good advice - meme_pack_data[P.group] = list( // it gets cheaper when I return it - "name" = P.group, // mmhm - "packs" = list() // sometimes, I return it so much, I rip the manifest - ) // see, my quartermaster taught me a few things too - if((P.hidden) || (P.special)) // like, how not to rip the manifest - continue// by using someone else's crate - if(P.contraband && !contraband) // will you show me? - continue // i'd be right happy to + board.supply_flags |= SUPPLY_PACK_CONTRABAND|SUPPLY_PACK_EMAG + + buyable_supply_packs = get_buyable_supply_packs() + update_static_data_for_all() + +/obj/machinery/computer/cargo/express/get_buyable_supply_packs() + var/meme_pack_data = list() + for(var/pack in SSshuttle.supply_packs) + var/datum/supply_pack/P = SSshuttle.supply_packs[pack] + if(!can_purchase_pack(P)) + continue + + if(!meme_pack_data[P.group]) + meme_pack_data[P.group] = list( + "name" = P.group, + "packs" = list() + ) meme_pack_data[P.group]["packs"] += list(list( "name" = P.name, "cost" = P.get_cost(), "id" = pack, - "desc" = P.desc || P.name // If there is a description, use it. Otherwise use the pack's name. + "desc" = P.desc || P.name )) + return meme_pack_data + +/obj/machinery/computer/cargo/express/proc/get_ui_message() + . = message + + if(SSshuttle.supply_blocked) + message = blockade_warning + + if(usingBeacon) + if(!beacon) + message = "BEACON ERROR: BEACON MISSING" + + else if (!can_use_beacon()) + message = "BEACON ERROR: MUST BE EXPOSED" + + if(obj_flags & EMAGGED) + message = "(&!#@ERROR: R0UTING_#PRO7O&OL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD." + +/obj/machinery/computer/cargo/express/proc/can_use_beacon() + return beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? + +/obj/machinery/computer/cargo/express/ui_static_data(mob/user) + var/list/data = list() + data["supplies"] = buyable_supply_packs + data["uiTitle"] = ui_title + data["uiCurrency"] = " [ui_currency]" + return data + /obj/machinery/computer/cargo/express/ui_data(mob/user) - var/canBeacon = beacon && (isturf(beacon.loc) || ismob(beacon.loc))//is the beacon in a valid location? + var/canBeacon = can_use_beacon() var/list/data = list() - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] + var/datum/bank_account/D = SSeconomy.department_accounts_by_id[cargo_account] if(D) data["points"] = D.account_balance - data["locked"] = locked//swipe an ID to unlock + + data["locked"] = locked //swipe an ID to unlock data["siliconUser"] = user.has_unlimited_silicon_privilege - data["beaconzone"] = beacon ? get_area(beacon) : ""//where is the beacon located? outputs in the tgui + + data["beaconzone"] = beacon ? get_area(beacon) : "" //where is the beacon located? outputs in the tgui data["usingBeacon"] = usingBeacon //is the mode set to deliver to the beacon or the cargobay? data["canBeacon"] = !usingBeacon || canBeacon //is the mode set to beacon delivery, and is the beacon in a valid location? data["canBuyBeacon"] = cooldown <= 0 && D.account_balance >= BEACON_COST data["beaconError"] = usingBeacon && !canBeacon ? "(BEACON ERROR)" : ""//changes button text to include an error alert if necessary - data["hasBeacon"] = beacon != null//is there a linked beacon? + data["hasBeacon"] = !!beacon //is there a linked beacon? data["beaconName"] = beacon ? beacon.name : "No Beacon Found" - data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] credits ([cooldown])" : "Print Beacon for [BEACON_COST] credits"//buttontext for printing beacons - data["supplies"] = list() - message = "Sales are near-instantaneous - please choose carefully." - if(SSshuttle.supply_blocked) - message = blockade_warning - if(usingBeacon && !beacon) - message = "BEACON ERROR: BEACON MISSING"//beacon was destroyed - else if (usingBeacon && !canBeacon) - message = "BEACON ERROR: MUST BE EXPOSED"//beacon's loc/user's loc must be a turf - if(obj_flags & EMAGGED) - message = "(&!#@ERROR: R0UTING_#PRO7O&OL MALF(*CT#ON. $UG%ESTE@ ACT#0N: !^/PULS3-%E)ET CIR*)ITB%ARD." - data["message"] = message - if(!meme_pack_data) - packin_up() - stack_trace("There was no pack data for [src]") - data["supplies"] = meme_pack_data + data["printMsg"] = cooldown > 0 ? "Print Beacon for [BEACON_COST] [ui_currency] ([cooldown])" : "Print Beacon for [BEACON_COST] [ui_currency]"//buttontext for printing beacons + data["canUseWithoutBeacon"] = can_use_without_beacon + data["message"] = get_ui_message() + if (cooldown > 0)//cooldown used for printing beacons cooldown-- return data @@ -136,15 +171,20 @@ switch(action) if("LZCargo") + if(!can_use_without_beacon) + return + usingBeacon = FALSE if (beacon) beacon.update_status(SP_UNREADY) //ready light on beacon will turn off + if("LZBeacon") usingBeacon = TRUE if (beacon) beacon.update_status(SP_READY) //turns on the beacon's ready light + if("printBeacon") - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] + var/datum/bank_account/D = SSeconomy.department_accounts_by_id[cargo_account] if(D) if(D.adjust_money(-BEACON_COST)) cooldown = 10//a ~ten second cooldown for printing beacons to prevent spam @@ -153,80 +193,106 @@ printed_beacons++//printed_beacons starts at 0, so the first one out will be called beacon # 1 beacon.name = "Supply Pod Beacon #[printed_beacons]" - - if("add")//Generate Supply Order first - if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_EXPRESSPOD_CONSOLE)) + if("add") //Generate Supply Order first + if(!COOLDOWN_FINISHED(src, order_cd)) say("Railgun recalibrating. Stand by.") return + var/id = params["id"] id = text2path(id) || id var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) CRASH("Unknown supply pack id given by express order console ui. ID: [params["id"]]") - var/name = "*None Provided*" - var/rank = "*None Provided*" - var/ckey = usr.ckey - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - name = H.get_authentification_name() - rank = H.get_assignment(hand_first = TRUE) - else if(issilicon(usr)) - name = usr.real_name - rank = "Silicon" - var/reason = "" - var/list/empty_turfs - var/datum/supply_order/SO = new(pack, name, rank, ckey, reason) - var/points_to_check - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] - if(D) - points_to_check = D.account_balance - if(!(obj_flags & EMAGGED)) - if(SO.pack.get_cost() <= points_to_check) - var/LZ - if (istype(beacon) && usingBeacon)//prioritize beacons over landing in cargobay - LZ = get_turf(beacon) - beacon.update_status(SP_LAUNCH) - else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay - landingzone = GLOB.areas_by_type[/area/station/cargo/storage] - if (!landingzone) - WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.contents)//uses default landing zone - if(T.is_blocked_turf()) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs?.len) - LZ = pick(empty_turfs) - if (SO.pack.get_cost() <= points_to_check && LZ)//we need to call the cost check again because of the CHECK_TICK call - TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 5 SECONDS) - D.adjust_money(-SO.pack.get_cost()) - if(pack.special_pod) - new /obj/effect/pod_landingzone(LZ, pack.special_pod, SO) - else - new /obj/effect/pod_landingzone(LZ, podType, SO) - . = TRUE - update_appearance() - else - 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(T.is_blocked_turf()) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs?.len) - TIMER_COOLDOWN_START(src, COOLDOWN_EXPRESSPOD_CONSOLE, 10 SECONDS) - 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) - if(pack.special_pod) - new /obj/effect/pod_landingzone(LZ, pack.special_pod, SO) - else - new /obj/effect/pod_landingzone(LZ, podType, SO) - . = TRUE - update_appearance() - CHECK_TICK + + purchase_pack(usr, pack) + +/obj/machinery/computer/cargo/express/proc/purchase_pack(mob/user, datum/supply_pack/pack) + set waitfor = FALSE + + // Set cooldown now, since this proc will sleep. + var/cooldown = 5 SECONDS + if((obj_flags & EMAGGED)) + cooldown = 10 SECONDS + + COOLDOWN_START(src, order_cd, cooldown) + + var/name = "*None Provided*" + var/rank = "*None Provided*" + var/ckey = usr.ckey + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + name = H.get_authentification_name() + rank = H.get_assignment(hand_first = TRUE) + + else if(issilicon(usr)) + name = usr.real_name + rank = "Silicon" + + var/datum/supply_order/SO = new(pack, name, rank, ckey, "") + var/points_to_check + var/datum/bank_account/D = SSeconomy.department_accounts_by_id[cargo_account] + if(D) + points_to_check = D.account_balance + + var/real_cost = SO.pack.get_cost() + if((obj_flags & EMAGGED)) + real_cost *= (0.72*MAX_EMAG_ROCKETS) + + if(real_cost > points_to_check) + return + + D.adjust_money(-real_cost) + + var/emagged = obj_flags & EMAGGED + var/location = get_landing_loc_or_locs() + if(!location || QDELETED(src)) + COOLDOWN_RESET(src, order_cd) + D.adjust_money(real_cost) // Refund, since we didnt ship + return + + SO.generateRequisition(get_turf(src)) + + var/datum/callback/CB = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_express_pods), SO, location, emagged, podType) + if(travel_time_in_minutes) + addtimer(CB, (travel_time_in_minutes MINUTES)) + say("REQUISITION SUCCESSFUL. ARRIVAL IN APPROXIMATELY [travel_time_in_minutes] MINUTES.") + else + CB.InvokeAsync() + +/obj/machinery/computer/cargo/express/proc/generate_landing_turfs() + . = list() + + var/area/area_to_check = GLOB.areas_by_type[(obj_flags & EMAGGED) ? pick(GLOB.the_station_areas) : landingzone] + for(var/turf/open/floor/T in area_to_check.get_contained_turfs()) + if(T.is_blocked_turf()) + continue + . += T + CHECK_TICK + +/obj/machinery/computer/cargo/express/proc/get_landing_loc_or_locs() + if(!(obj_flags & EMAGGED)) + if (usingBeacon)//prioritize beacons over landing in cargobay + if(!istype(beacon)) + return + return get_turf(beacon) + + else if (!usingBeacon)//find a suitable supplypod landing zone in cargobay + var/list/empty_turfs = generate_landing_turfs() + if(!empty_turfs.len) + return + return pick(empty_turfs) + else + return generate_landing_turfs() + +/// Spawns express pod(s) at a given location. Landing_loc can be a list in the case of an emagged console. +/proc/spawn_express_pods(datum/supply_order/SO, landing_loc, emagged, pod_type) + if(!emagged) + new /obj/effect/pod_landingzone(landing_loc, SO.pack.special_pod || pod_type, SO) + return + + for(var/i in 1 to MAX_EMAG_ROCKETS) + if(!length(landing_loc)) + return + + var/LZ = pick_n_take(landing_loc) + new /obj/effect/pod_landingzone(LZ, SO.pack.special_pod || pod_type, SO) diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index 622f812e9857..196bc7789efa 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -71,7 +71,7 @@ desc = "Contains twinned thermal pistols in a holster, ready for use in the field." cost = PAYCHECK_HARD * 15 access_view = ACCESS_ARMORY - contains = list(/obj/item/storage/belt/holster/thermal) + contains = list(/obj/item/storage/belt/holster/shoulder/thermal) /datum/supply_pack/goody/sologamermitts name = "Insulated Gloves Single-Pack" @@ -121,12 +121,6 @@ cost = PAYCHECK_MEDIUM * 3 contains = list(/obj/item/storage/toolbox/mechanical) -/datum/supply_pack/goody/valentine - name = "Valentine Card" - desc = "Make an impression on that special someone! Comes with one valentine card and a free candy heart!" - cost = PAYCHECK_ASSISTANT * 2 - contains = list(/obj/item/valentine, /obj/item/food/candyheart) - /datum/supply_pack/goody/beeplush name = "Bee Plushie" desc = "The most important thing you could possibly spend your hard-earned money on." @@ -167,9 +161,3 @@ desc = "A complete meal package for the terminally lazy. Contains one Ready-Donk meal." cost = PAYCHECK_MEDIUM * 2 contains = list(/obj/item/food/ready_donk) - -/datum/supply_pack/goody/paint - name = "Adaptive Paint" - desc = "A single, premium can of adaptive paint. Now you can turn the entire station neon pink!" - cost = PAYCHECK_EASY * 2 - contains = list(/obj/item/paint/anycolor) diff --git a/code/modules/cargo/govt_supply.dm b/code/modules/cargo/govt_supply.dm new file mode 100644 index 000000000000..64b917b02301 --- /dev/null +++ b/code/modules/cargo/govt_supply.dm @@ -0,0 +1,38 @@ +/obj/machinery/computer/cargo/express/government + name = "government supply console" + + stationcargo = FALSE + podType = /obj/structure/closet/supplypod/safe + cargo_account = ACCOUNT_GOV + + can_use_without_beacon = FALSE + +/obj/machinery/computer/cargo/express/government/get_buyable_supply_packs() + . = list() + for(var/pack in SSshuttle.supply_packs) + var/datum/supply_pack/P = SSshuttle.supply_packs[pack] + if(!can_purchase_pack(P)) + continue + + if(!.[P.group]) + .[P.group] = list( + "name" = P.group, + "packs" = list() + ) + + .[P.group]["packs"] += list(list( + "name" = P.name, + "cost" = P.get_cost(), + "id" = pack, + "desc" = P.desc || P.name, + "goody" = P.goody, + "access" = P.access + )) + + sortTim(., GLOBAL_PROC_REF(cmp_text_asc)) + +/obj/machinery/computer/cargo/express/government/can_purchase_pack(datum/supply_pack/pack) + return pack.supply_flags & SUPPLY_PACK_GOVERNMENT + +/obj/machinery/computer/cargo/express/government/emag_act(mob/living/user) + return diff --git a/code/modules/cargo/markets/market_items/misc.dm b/code/modules/cargo/markets/market_items/misc.dm index e63377d5ae3d..40355c91dcf1 100644 --- a/code/modules/cargo/markets/market_items/misc.dm +++ b/code/modules/cargo/markets/market_items/misc.dm @@ -34,7 +34,7 @@ /datum/market_item/misc/shoulder_holster name = "Shoulder holster" desc = "Yeehaw, hardboiled friends! This holster is the first step in your dream of becoming a detective and being allowed to shoot real guns!" - item = /obj/item/storage/belt/holster + item = /obj/item/storage/belt/holster/shoulder/generic price_min = CARGO_CRATE_VALUE * 2 price_max = CARGO_CRATE_VALUE * 4 diff --git a/code/modules/cargo/order.dm b/code/modules/cargo/order.dm index 89426e9c7b29..2d55cebd43bf 100644 --- a/code/modules/cargo/order.dm +++ b/code/modules/cargo/order.dm @@ -1,5 +1,7 @@ /// The chance for a manifest or crate to be created with errors -#define MANIFEST_ERROR_CHANCE 5 +#define MANIFEST_BAD_CONTENTS_CHANCE 5 +#define MANIFEST_BAD_NAME_CHANCE 5 +#define MANIFEST_MISSING_CONTENTS_CHANCE 7 // MANIFEST BITFLAGS /// Determines if the station name will be incorrect on the manifest @@ -19,13 +21,15 @@ order_id = id order_cost = cost - if(prob(MANIFEST_ERROR_CHANCE)) + if(prob(MANIFEST_BAD_NAME_CHANCE)) errors |= MANIFEST_ERROR_NAME investigate_log("Supply order #[order_id] generated a manifest with an incorrect station name.", INVESTIGATE_CARGO) - if(prob(MANIFEST_ERROR_CHANCE)) + + if(prob(MANIFEST_BAD_CONTENTS_CHANCE)) errors |= MANIFEST_ERROR_CONTENTS investigate_log("Supply order #[order_id] generated a manifest missing listed contents.", INVESTIGATE_CARGO) - if(prob(MANIFEST_ERROR_CHANCE)) + + if(prob(MANIFEST_MISSING_CONTENTS_CHANCE)) errors |= MANIFEST_ERROR_ITEM investigate_log("Supply order #[order_id] generated with incorrect contents shipped.", INVESTIGATE_CARGO) @@ -95,22 +99,26 @@ P.info += "Item: [packname]
    " P.info += "Contents:
    " P.info += "
      " - for(var/atom/movable/AM in container.contents - P) - if((P.errors & MANIFEST_ERROR_CONTENTS)) + + for(var/atom/movable/AM as anything in container.contents) + if((P.errors & MANIFEST_ERROR_CONTENTS)) // Double or nothing. Literally. if(prob(50)) P.info += "
    • [AM.name]
    • " else continue + P.info += "
    • [AM.name]
    • " + P.info += "
    " P.info += "

    Stamp below to confirm receipt of goods:

    " if(P.errors & MANIFEST_ERROR_ITEM) - if(istype(container, /obj/structure/closet/crate/secure) || istype(container, /obj/structure/closet/crate/large)) + if(!pack.can_be_missing_contents) P.errors &= ~MANIFEST_ERROR_ITEM else - var/lost = max(round(container.contents.len / 10), 1) - while(--lost >= 0) + var/lost = max(ceil(container.contents.len * (rand(5, 15) / 100)), 1) // Missing between 5% and 15% + while(lost >= 1) + lost-- qdel(pick(container.contents)) P.update_appearance() @@ -120,8 +128,6 @@ var/obj/structure/closet/crate/C = container C.manifest = P C.update_appearance() - else - container.contents += P return P @@ -143,7 +149,9 @@ generateManifest(miscbox, misc_own, "", misc_cost) return -#undef MANIFEST_ERROR_CHANCE #undef MANIFEST_ERROR_NAME #undef MANIFEST_ERROR_CONTENTS #undef MANIFEST_ERROR_ITEM +#undef MANIFEST_BAD_CONTENTS_CHANCE +#undef MANIFEST_BAD_NAME_CHANCE +#undef MANIFEST_MISSING_CONTENTS_CHANCE diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 4ac27ba6ec84..906f1cf8132d 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -37,6 +37,9 @@ ///Interface name for the ui_interact call for different subtypes. var/interface_type = "Cargo" + /// Matches supply pack flags + var/supply_flags = NONE + /obj/machinery/computer/cargo/request name = "supply request console" desc = "Used to request supplies from cargo." @@ -62,13 +65,6 @@ else return ..() -/obj/machinery/computer/cargo/proc/get_export_categories() - . = EXPORT_CARGO - if(contraband) - . |= EXPORT_CONTRABAND - if(obj_flags & EMAGGED) - . |= EXPORT_EMAG - /obj/machinery/computer/cargo/emag_act(mob/user) if(obj_flags & EMAGGED) return @@ -77,11 +73,11 @@ span_notice("You adjust [src]'s routing and receiver spectrum, unlocking special supplies and contraband.")) obj_flags |= EMAGGED - contraband = TRUE + supply_flags |= SUPPLY_PACK_CONTRABAND|SUPPLY_PACK_EMAG // This also permanently sets this on the circuit board var/obj/item/circuitboard/computer/cargo/board = circuit - board.contraband = TRUE + board.supply_flags |= SUPPLY_PACK_CONTRABAND|SUPPLY_PACK_EMAG board.obj_flags |= EMAGGED update_static_data(user) @@ -89,6 +85,39 @@ . = ..() circuit.configure_machine(src) +/obj/item/circuitboard/computer/cargo/multitool_act(mob/living/user) + . = ..() + if(!(obj_flags & EMAGGED)) + supply_flags ^= SUPPLY_PACK_CONTRABAND + to_chat(user, span_notice("Receiver spectrum set to [(supply_flags & SUPPLY_PACK_CONTRABAND) ? "Broad" : "Standard"].")) + else + to_chat(user, span_alert("The spectrum chip is unresponsive.")) + +/obj/machinery/computer/cargo/proc/get_export_categories() + . = EXPORT_CARGO + if(supply_flags & SUPPLY_PACK_CONTRABAND) + . |= EXPORT_CONTRABAND + if(supply_flags & SUPPLY_PACK_EMAG) + . |= EXPORT_EMAG + +/// Returns TRUE if the pack can be purchased. +/obj/machinery/computer/cargo/proc/can_purchase_pack(datum/supply_pack/pack) + . = TRUE + if((pack.supply_flags & SUPPLY_PACK_EMAG) && !(supply_flags & SUPPLY_PACK_EMAG)) + return FALSE + + if((pack.supply_flags & SUPPLY_PACK_CONTRABAND) && !(supply_flags & SUPPLY_PACK_CONTRABAND)) + return FALSE + + if((pack.supply_flags & SUPPLY_PACK_DROPPOD_ONLY) && !is_express) + return FALSE + + if(pack.special && !pack.special_enabled) + return FALSE + + if((pack.supply_flags & SUPPLY_PACK_GOVERNMENT) && !(supply_flags & SUPPLY_PACK_GOVERNMENT)) + return FALSE + /obj/machinery/computer/cargo/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) @@ -102,6 +131,7 @@ var/datum/bank_account/D = SSeconomy.department_accounts_by_id[cargo_account] if(D) data["points"] = D.account_balance + data["grocery"] = SSshuttle.chef_groceries.len data["away"] = SSshuttle.supply.getDockedId() == docking_away data["self_paid"] = self_paid @@ -110,13 +140,16 @@ data["loan_dispatched"] = SSshuttle.shuttle_loan && SSshuttle.shuttle_loan.dispatched data["can_send"] = can_send data["can_approve_requests"] = can_approve_requests + var/message = "Remember to stamp and send back the supply manifests." if(SSshuttle.centcom_message) message = SSshuttle.centcom_message if(SSshuttle.supply_blocked) message = blockade_warning + data["message"] = message data["cart"] = list() + for(var/datum/supply_order/SO in SSshuttle.shopping_list) data["cart"] += list(list( "object" = SO.pack.name, @@ -141,17 +174,24 @@ /obj/machinery/computer/cargo/ui_static_data(mob/user) var/list/data = list() - data["supplies"] = list() + data["supplies"] = get_buyable_supply_packs() + return data + +/obj/machinery/computer/cargo/proc/get_buyable_supply_packs() + RETURN_TYPE(/list) + . = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!data["supplies"][P.group]) - data["supplies"][P.group] = list( + if(!can_purchase_pack(P)) + continue + + if(!.[P.group]) + .[P.group] = list( "name" = P.group, "packs" = list() ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) - continue - data["supplies"][P.group]["packs"] += list(list( + + .[P.group]["packs"] += list(list( "name" = P.name, "cost" = P.get_cost(), "id" = pack, @@ -159,7 +199,8 @@ "goody" = P.goody, "access" = P.access )) - return data + + sortTim(., GLOBAL_PROC_REF(cmp_text_asc)) /obj/machinery/computer/cargo/ui_act(action, params, datum/tgui/ui) . = ..() @@ -170,22 +211,28 @@ if(!SSshuttle.supply.canMove()) say(safety_warning) return + if(SSshuttle.supply_blocked) say(blockade_warning) return + if(SSshuttle.supply.getDockedId() == docking_home) SSshuttle.supply.export_categories = get_export_categories() SSshuttle.moveShuttle(cargo_shuttle, docking_away, TRUE) say("The supply shuttle is departing.") investigate_log("[key_name(usr)] sent the supply shuttle away.", INVESTIGATE_CARGO) + else investigate_log("[key_name(usr)] called the supply shuttle.", INVESTIGATE_CARGO) say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") SSshuttle.moveShuttle(cargo_shuttle, docking_home, TRUE) + . = TRUE + if("loan") if(!SSshuttle.shuttle_loan) return + if(SSshuttle.supply_blocked) say(blockade_warning) return @@ -201,15 +248,18 @@ investigate_log("[key_name(usr)] accepted a shuttle loan event.", INVESTIGATE_CARGO) log_game("[key_name(usr)] accepted a shuttle loan event.") . = TRUE + if("add") if(is_express) return + var/id = params["id"] id = text2path(id) || id var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) CRASH("Unknown supply pack id given by order console ui. ID: [params["id"]]") - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + + if(!can_purchase_pack(pack)) return var/name = "*None Provided*" @@ -219,6 +269,7 @@ var/mob/living/carbon/human/H = usr name = H.get_authentification_name() rank = H.get_assignment(hand_first = TRUE) + else if(issilicon(usr)) name = usr.real_name rank = "Silicon" @@ -230,9 +281,11 @@ if(!istype(id_card)) say("No ID card detected.") return + if(istype(id_card, /obj/item/card/id/departmental_budget)) say("The [src] rejects [id_card].") return + account = id_card.registered_account if(!istype(account)) say("Invalid bank account.") diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 4b227b1d1ae5..639d5e86c00e 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1,24 +1,31 @@ /datum/supply_pack var/name = "Crate" var/group = "" - var/hidden = FALSE - var/contraband = FALSE + + // See cargo.dm + var/supply_flags = NONE + /// Cost of the crate. DO NOT GO ANY LOWER THAN X1.4 the "CARGO_CRATE_VALUE" value if using regular crates, or infinite profit will be possible! var/cost = CARGO_CRATE_VALUE * 1.4 var/access = FALSE var/access_view = FALSE var/access_any = FALSE + var/list/contains = null var/crate_name = "crate" var/id var/desc = ""//no desc by default var/crate_type = /obj/structure/closet/crate + + /// If TRUE, can spawn with missing contents due to MANIFEST_ERROR_ITEM occuring. + var/can_be_missing_contents = TRUE var/dangerous = FALSE // Should we message admins? var/special = FALSE //Event/Station Goals/Admin enabled packs var/special_enabled = FALSE - var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console + var/special_pod //If this pack comes shipped in a specific pod when launched from the express console var/admin_spawned = FALSE + var/goody = FALSE //Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply /datum/supply_pack/New() @@ -43,6 +50,7 @@ /datum/supply_pack/proc/get_cost() . = cost . *= SSeconomy.pack_price_modifier + return floor(.) /datum/supply_pack/proc/fill(obj/structure/closet/crate/C) if (admin_spawned) @@ -70,7 +78,7 @@ 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 = CARGO_CRATE_VALUE * 4 - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list(/obj/vehicle/ridden/atv, /obj/item/key/atv, /obj/item/clothing/suit/jacket/leather/overcoat, @@ -134,6 +142,8 @@ cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/clothing/suit/fire/firefighter, /obj/item/clothing/suit/fire/firefighter, + /obj/item/extinguisher/mini, + /obj/item/extinguisher/mini, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /obj/item/flashlight, @@ -238,7 +248,7 @@ /datum/supply_pack/emergency/specialops name = "Special Ops Supplies" 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 + supply_flags = parent_type::supply_flags | SUPPLY_PACK_EMAG cost = CARGO_CRATE_VALUE * 4 contains = list(/obj/item/storage/box/emps, /obj/item/grenade/smokebomb, @@ -318,15 +328,16 @@ /datum/supply_pack/security/forensics name = "Forensics Crate" - desc = "Stay hot on the criminal's heels with Mars' 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." + desc = "Stay hot on the criminal's heels with Mars' Detective Essentials(tm). Contains a crime scene kit, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." cost = CARGO_CRATE_VALUE * 2.5 access_view = ACCESS_MORGUE - contains = list(/obj/item/detective_scanner, + contains = list(/obj/item/storage/scene_cards, /obj/item/storage/box/evidence, /obj/item/camera, /obj/item/taperecorder, /obj/item/toy/crayon/white, - /obj/item/clothing/head/fedora/det_hat) + /obj/item/clothing/head/fedora/det_hat, + /obj/item/storage/briefcase/crimekit) crate_name = "forensics crate" /datum/supply_pack/security/helmets @@ -361,7 +372,7 @@ /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." + desc = "Contains appropriate outfits for the station's private security force. Contains outfits for the Warden, Security Marshal, and two Security Officers. Each outfit comes with a rank-appropriate jumpsuit, suit, and beret. Requires Security access to open." cost = CARGO_CRATE_VALUE * 3 access_view = ACCESS_SECURITY contains = list(/obj/item/clothing/under/rank/security/officer/formal, @@ -388,13 +399,16 @@ /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 = CARGO_CRATE_VALUE * 3.5 + desc = "Contains seven flashbangs, seven teargas grenades, six flashes, seven handcuffs, and three pepper sprays. Requires Security access to open." + cost = CARGO_CRATE_VALUE * 3.8 access_view = ACCESS_ARMORY contains = list(/obj/item/storage/box/flashbangs, /obj/item/storage/box/teargas, /obj/item/storage/box/flashes, - /obj/item/storage/box/handcuffs) + /obj/item/storage/box/handcuffs, + /obj/item/reagent_containers/spray/pepper, + /obj/item/reagent_containers/spray/pepper, + /obj/item/reagent_containers/spray/pepper) crate_name = "security supply crate" /datum/supply_pack/security/firingpins @@ -419,7 +433,7 @@ 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 Marks. 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 = CARGO_CRATE_VALUE * 6 //justice comes at a price. An expensive, noisy price. - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list(/obj/item/clothing/head/helmet/justice, /obj/item/clothing/mask/gas/sechailer) crate_name = "security clothing crate" @@ -448,7 +462,7 @@ name = "Traditional Equipment Crate" desc = "Spare equipment found in a warehouse." cost = CARGO_CRATE_VALUE * 2.2 - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list(/obj/item/clothing/under/rank/security/constable, /obj/item/clothing/head/helmet/constable, /obj/item/clothing/gloves/color/white, @@ -531,7 +545,7 @@ name = "Incendiary Weapons Crate" desc = "Burn, baby burn. Contains three incendiary grenades, three plasma canisters, and a flamethrower. Requires Armory access to open." cost = CARGO_CRATE_VALUE * 7 - access = ACCESS_HEADS + access = ACCESS_MANAGEMENT contains = list(/obj/item/flamethrower/full, /obj/item/tank/internals/plasma, /obj/item/tank/internals/plasma, @@ -543,6 +557,13 @@ crate_type = /obj/structure/closet/crate/secure/plasma dangerous = TRUE +/datum/supply_pack/security/armory/ion_carbine + name = "Ion Carbine Parts Kit" + desc = "A suitcase containing the necessary gun parts to transform a standard laser gun into a ion carbine. Perfect against lockers you don't have access to." + cost = CARGO_CRATE_VALUE * 9 + contains = list(/obj/item/weaponcrafting/gunkit/ion) + crate_name = "gun parts crate" + /datum/supply_pack/security/armory/mindshield name = "Mindshield Implants Crate" desc = "Prevent against radical thoughts with three Mindshield implants. Requires Armory access to open." @@ -600,7 +621,7 @@ 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 = CARGO_CRATE_VALUE * 12 - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list(/obj/item/food/rationpack, /obj/item/ammo_box/a762, /obj/item/storage/toolbox/ammo, @@ -643,8 +664,8 @@ name = "Thermal Pistol Crate" desc = "Contains a pair of holsters each with two experimental thermal pistols, using nanites as the basis for their ammo. Requires Armory access to open." cost = CARGO_CRATE_VALUE * 7 - contains = list(/obj/item/storage/belt/holster/thermal, - /obj/item/storage/belt/holster/thermal) + contains = list(/obj/item/storage/belt/holster/shoulder/thermal, + /obj/item/storage/belt/holster/shoulder/thermal) crate_name = "thermal pistol crate" ////////////////////////////////////////////////////////////////////////////// @@ -815,7 +836,7 @@ desc = "The pride of Mars Executive Solutions command staff. The legendary Bluespace Artillery Cannon is a devastating feat of human engineering and testament to wartime determination. Highly advanced research is required for proper construction. " cost = CARGO_CRATE_VALUE * 30 special = TRUE - access_view = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT contains = list(/obj/item/circuitboard/machine/bsa/front, /obj/item/circuitboard/machine/bsa/middle, /obj/item/circuitboard/machine/bsa/back, @@ -828,7 +849,7 @@ desc = "Secure the longevity of the current state of humanity within this massive library of scientific knowledge, capable of granting superhuman powers and abilities. Highly advanced research is required for proper construction. Also contains five DNA probes." cost = CARGO_CRATE_VALUE * 24 special = TRUE - access_view = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT contains = list( /obj/item/circuitboard/machine/dna_vault, /obj/item/dna_probe, @@ -844,7 +865,7 @@ desc = "Contains five DNA probes for use in the DNA vault." cost = CARGO_CRATE_VALUE * 6 special = TRUE - access_view = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT contains = list(/obj/item/dna_probe, /obj/item/dna_probe, /obj/item/dna_probe, @@ -859,7 +880,7 @@ desc = "Protect the very existence of this station with these Anti-Meteor defenses. Contains three Shield Generator Satellites." cost = CARGO_CRATE_VALUE * 6 special = TRUE - access_view = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT contains = list( /obj/machinery/satellite/meteor_shield, /obj/machinery/satellite/meteor_shield, @@ -873,7 +894,7 @@ desc = "A control system for the Shield Generator Satellite system." cost = CARGO_CRATE_VALUE * 10 special = TRUE - access_view = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT contains = list(/obj/item/circuitboard/computer/sat_control) crate_name= "shield control board crate" @@ -998,16 +1019,16 @@ dangerous = TRUE ////////////////////////////////////////////////////////////////////////////// -/////////////////////// Canisters & Materials //////////////////////////////// +/////////////////////// Materials //////////////////////////////// ////////////////////////////////////////////////////////////////////////////// /datum/supply_pack/materials - group = "Canisters & Materials" + group = "Materials" /datum/supply_pack/materials/cardboard50 name = "50 Cardboard Sheets" desc = "Create a bunch of boxes." - cost = CARGO_CRATE_VALUE * 2 + cost = CARGO_CRATE_VALUE + (/datum/material/cardboard::value_per_unit * MINERAL_MATERIAL_AMOUNT * 50) contains = list(/obj/item/stack/sheet/cardboard/fifty) crate_name = "cardboard sheets crate" @@ -1022,52 +1043,48 @@ /datum/supply_pack/materials/glass50 name = "50 Glass Sheets" desc = "Let some nice light in with fifty glass sheets!" - cost = CARGO_CRATE_VALUE * 2 + cost = CARGO_CRATE_VALUE + (/datum/material/glass::value_per_unit * MINERAL_MATERIAL_AMOUNT * 50) contains = list(/obj/item/stack/sheet/glass/fifty) crate_name = "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!" - cost = CARGO_CRATE_VALUE * 2 + cost = CARGO_CRATE_VALUE + (/datum/material/iron::value_per_unit * MINERAL_MATERIAL_AMOUNT * 50) contains = list(/obj/item/stack/sheet/iron/fifty) crate_name = "iron sheets crate" /datum/supply_pack/materials/plasteel20 name = "20 Plasteel Sheets" desc = "Reinforce the station's integrity with twenty plasteel sheets!" - cost = CARGO_CRATE_VALUE * 15 + cost = CARGO_CRATE_VALUE + (/datum/material/alloy/plasteel::value_per_unit * MINERAL_MATERIAL_AMOUNT * 20) 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 = CARGO_CRATE_VALUE * 33 - contains = list(/obj/item/stack/sheet/plasteel/fifty) - crate_name = "plasteel sheets crate" - /datum/supply_pack/materials/plastic50 name = "50 Plastic Sheets" desc = "Build a limitless amount of toys with fifty plastic sheets!" - cost = CARGO_CRATE_VALUE * 2 + cost = CARGO_CRATE_VALUE + (/datum/material/plastic::value_per_unit * MINERAL_MATERIAL_AMOUNT * 50) 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 = CARGO_CRATE_VALUE * 2 - 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 = CARGO_CRATE_VALUE * 4 + cost = CARGO_CRATE_VALUE + (/datum/material/wood::value_per_unit * MINERAL_MATERIAL_AMOUNT * 50) contains = list(/obj/item/stack/sheet/mineral/wood/fifty) crate_name = "wood planks crate" +/datum/supply_pack/materials/rcd_ammo + name = "RCD Ammo" + desc = "Contains four raw material cartridges that can be used to quickly recharge any RCD." + cost = CARGO_CRATE_VALUE * 8.5 + contains = list(/obj/item/rcd_ammo, + /obj/item/rcd_ammo, + /obj/item/rcd_ammo/large, + /obj/item/rcd_ammo/large,) + crate_name = "rcd ammo crate" + /datum/supply_pack/materials/foamtank name = "Firefighting Foam Tank Crate" desc = "Contains a tank of firefighting foam. Also known as \"plasmaman's bane\"." @@ -1110,7 +1127,7 @@ crate_type = /obj/structure/closet/crate/large /datum/supply_pack/materials/gas_canisters - cost = CARGO_CRATE_VALUE * 0.05 + cost = CARGO_CRATE_VALUE contains = list(/obj/machinery/portable_atmospherics/canister) crate_type = /obj/structure/closet/crate/large @@ -1126,7 +1143,7 @@ if(!xgm_gas_data.purchaseable[gasType]) continue var/datum/supply_pack/materials/pack = new - pack.name = "[name] Canister" + pack.name = "Canister ([name])" pack.desc = "Contains a canister of [name]." if(xgm_gas_data.flags[gasType] & XGM_GAS_FUEL) pack.desc = "[pack.desc] Requires Atmospherics access to open." @@ -1135,7 +1152,7 @@ pack.crate_name = "[name] canister crate" pack.id = "[type]([name])" - pack.cost = cost + moleCount * xgm_gas_data.base_value[gasType] * 1.6 + pack.cost = cost + (moleCount * xgm_gas_data.base_value[gasType]) pack.cost = CEILING(pack.cost, 10) pack.contains = list(GLOB.gas_id_to_canister[gasType]) @@ -1146,11 +1163,11 @@ ////AIRMIX SPECIAL BABY var/datum/supply_pack/materials/airpack = new - airpack.name = "Airmix Canister" + airpack.name = "Canister (Airmix)" airpack.desc = "Contains a canister of breathable air." airpack.crate_name = "airmix canister crate" airpack.id = "[type](airmix)" - airpack.cost = 3000 + airpack.cost = 200 airpack.contains = list(/obj/machinery/portable_atmospherics/canister/air) airpack.crate_type = crate_type canister_packs += airpack @@ -1179,8 +1196,8 @@ /obj/item/reagent_containers/blood/o_plus, /obj/item/reagent_containers/blood/o_minus, /obj/item/reagent_containers/blood/lizard, - /obj/item/reagent_containers/blood/ethereal, - /obj/item/reagent_containers/blood/skrell) + /obj/item/reagent_containers/blood/ethereal + ) crate_name = "blood freezer" crate_type = /obj/structure/closet/crate/freezer @@ -1221,6 +1238,104 @@ /obj/item/storage/box/beakers) crate_name = "chemical crate" +////////////////////////////////////////////////////////////////////////////// +//////////////////////////// Reagent ///////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +/datum/supply_pack/reagent + group = "Reagents" + crate_type = /obj/structure/closet/crate/medical + +/datum/supply_pack/reagent/chemical_carts + name = "Full Chemistry Cartridge Pack" + desc = "Contains a full set of chem dispenser cartridges with every chemical you'll need for making pharmaceuticals." + cost = CARGO_CRATE_VALUE * 35 //price may need balancing + crate_name = "chemical cartridges crate" + +/datum/supply_pack/reagent/chemical_carts/New() + . = ..() + set_cart_list() + +//this is just here for subtypes +/datum/supply_pack/reagent/chemical_carts/proc/set_cart_list() + //contains = GLOB.cartridge_list_chems.Copy() + +/datum/supply_pack/reagent/chemical_carts/fill(obj/structure/closet/crate/crate) + for(var/datum/reagent/chem as anything in contains) + var/obj/item/reagent_containers/chem_cartridge/cartridge = contains[chem] + cartridge = new cartridge(crate) + if(admin_spawned) + cartridge.flags_1 |= ADMIN_SPAWNED_1 + cartridge.setLabel(initial(chem.name)) + cartridge.reagents.add_reagent(chem, cartridge.volume) + +/datum/supply_pack/reagent/chemical_carts_empty + name = "Empty Chemical Cartridge Pack" + desc = "A pack of empty cartridges for use in chem dispensers." + cost = CARGO_CRATE_VALUE * 6 + contains = list(/obj/item/reagent_containers/chem_cartridge/large, + /obj/item/reagent_containers/chem_cartridge/large, + /obj/item/reagent_containers/chem_cartridge/medium, + /obj/item/reagent_containers/chem_cartridge/medium, + /obj/item/reagent_containers/chem_cartridge/medium, + /obj/item/reagent_containers/chem_cartridge/small, + /obj/item/reagent_containers/chem_cartridge/small, + /obj/item/reagent_containers/chem_cartridge/small) + crate_name = "empty chemical cartridges crate" + +/datum/supply_pack/reagent/chemical_carts/soft_drinks_chem_cartridge //IGNORE THE TYPEPATH PLEASE + name = "Soft Drinks Cartridge Luxury Pack (Full Dispenser)" + desc = "Contains a full set of chem cartridges of the same size inside a soft drinks dispenser at shift start." + cost = CARGO_CRATE_VALUE * 25 + +/datum/supply_pack/reagent/chemical_carts/soft_drinks_chem_cartridge/set_cart_list() + contains = GLOB.cartridge_list_drinks.Copy() + +/datum/supply_pack/reagent/chemical_carts/booze_chem_cartridge + name = "Booze Cartridge Luxury Pack (Full Dispenser)" + desc = "Contains a full set of chem cartridges of the same size inside a booze dispenser at shift start." + cost = CARGO_CRATE_VALUE * 30 + +/datum/supply_pack/reagent/chemical_carts/booze_chem_cartridge/set_cart_list() + contains = GLOB.cartridge_list_booze.Copy() + +/datum/supply_pack/reagent/individual_chem_cart + +/datum/supply_pack/reagent/individual_chem_cart/generate_supply_packs() + if(contains) // Prevent infinite recursion + return + + . = list() + + // The absolute minimum cost of a reagent crate is what the reagents come in. + var/base_cost = /datum/export/chem_cartridge/medium::cost + CARGO_CRATE_VALUE + var/volume = /obj/item/reagent_containers/chem_cartridge/medium::volume + + for(var/datum/reagent/reagent_path as anything in GLOB.cartridge_list_chems | GLOB.cartridge_list_botany | GLOB.cartridge_list_booze | GLOB.cartridge_list_drinks) + var/datum/supply_pack/reagent/individual_chem_cart/pack = new + var/name = initial(reagent_path.name) + pack.name = "Crate of [name]" + pack.desc = "Contains [volume]u of [name]." + pack.crate_name = "reagent crate ([name])" + pack.id = "[type]([name])" + + pack.cost = round(base_cost + (initial(reagent_path.value) * volume), 5) + + pack.contains = list(reagent_path) + + pack.crate_type = crate_type + + . += pack + +/datum/supply_pack/reagent/individual_chem_cart/fill(obj/structure/closet/crate/crate) + var/datum/reagent/reagent_path = contains[1] + for(var/i in 1 to 3) + var/obj/item/reagent_containers/chem_cartridge/medium/cartridge = new(crate) + if(admin_spawned) + cartridge.flags_1 |= ADMIN_SPAWNED_1 + + cartridge.setLabel(initial(reagent_path.name)) + cartridge.reagents.add_reagent(reagent_path, cartridge.volume) + /datum/supply_pack/medical/defibs name = "Defibrillator Crate" desc = "Contains two defibrillators for bringing the recently deceased back to life." @@ -1240,13 +1355,13 @@ name = "Medical Supplies Crate" desc = "Contains several medical supplies. German doctor not included." cost = CARGO_CRATE_VALUE * 4 - contains = list(/obj/item/reagent_containers/glass/bottle/multiver, + contains = list(/obj/item/reagent_containers/glass/bottle/dylovene, /obj/item/reagent_containers/glass/bottle/epinephrine, /obj/item/reagent_containers/glass/bottle/morphine, /obj/item/reagent_containers/glass/bottle/toxin, /obj/item/reagent_containers/glass/beaker/large, /obj/item/reagent_containers/pill/insulin, - /obj/item/stack/medical/gauze, + /obj/item/stack/gauze, /obj/item/storage/box/beakers, /obj/item/storage/box/medigels, /obj/item/storage/box/syringes, @@ -1259,9 +1374,9 @@ /obj/item/defibrillator/loaded, /obj/item/reagent_containers/blood/o_minus, /obj/item/storage/pill_bottle/mining, - /obj/item/reagent_containers/pill/neurine, - /obj/item/stack/medical/bone_gel/four, - /obj/item/stack/medical/bone_gel/four, + /obj/item/reagent_containers/pill/alkysine, + /obj/item/stack/medical/bone_gel/twelve, + /obj/item/stack/medical/bone_gel/twelve, /obj/item/vending_refill/medical, /obj/item/vending_refill/drugs) crate_name = "medical supplies crate" @@ -1276,7 +1391,6 @@ 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 = CARGO_CRATE_VALUE * 6 contains = list(/obj/item/storage/backpack/duffelbag/med/surgery, - /obj/item/reagent_containers/medigel/sterilizine, /obj/item/roller) crate_name = "surgical supplies crate" @@ -1320,6 +1434,30 @@ contains = list(/obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck, /obj/item/clothing/under/rank/medical/chief_medical_officer/turtleneck/skirt) +/datum/supply_pack/medical/atk + name = "Triage - Advanced trauma supplies" + desc = "It's a bunch of bruise packs in a trenchcoat." + cost = CARGO_CRATE_VALUE * 3 + crate_name = "advanced trauma crate" + contains = list( + /obj/item/stack/medical/bruise_pack, + /obj/item/stack/medical/bruise_pack, + /obj/item/stack/medical/bruise_pack, + /obj/item/stack/medical/suture, + /obj/item/stack/medical/suture, + /obj/item/stack/medical/suture, + ) + +/datum/supply_pack/medical/stasis_bags + name = "Stasis Bags Crate" + desc = "A shipment of stasis bags for medical triage." + cost = CARGO_CRATE_VALUE * 8 + contains = list( + /obj/item/bodybag/stasis, + /obj/item/bodybag/stasis, + /obj/item/bodybag/stasis, + ) + ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Science ///////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -1463,19 +1601,6 @@ /obj/item/clothing/head/helmet/monkey_sentience) crate_name = "monkey mind magnification crate" -/datum/supply_pack/science/cytology - name = "Cytology supplies crate" - desc = "Did out of control specimens pulverize xenobiology? Here is some more supplies for further testing." - cost = CARGO_CRATE_VALUE * 3 - access_view = ACCESS_XENOBIOLOGY - contains = list(/obj/structure/microscope, - /obj/item/biopsy_tool, - /obj/item/storage/box/petridish, - /obj/item/storage/box/petridish, - /obj/item/storage/box/swab, - /obj/item/construction/plumbing/research) - crate_name = "cytology supplies crate" - /datum/supply_pack/science/mod_core name = "MOD core Crate" desc = "Three cores, perfect for any MODsuit construction! Naturally harvested™, of course." @@ -1517,7 +1642,7 @@ /datum/supply_pack/service/janitor name = "Janitorial Supplies Crate" - desc = "Fight back against dirt and grime with Priapus' Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has a single mop, broom, spray cleaner, rag, and trash bag." + desc = "Fight back against dirt and grime with Priapus' Janitorial Essentials(tm)! Contains three buckets, caution signs, and cleaner grenades. Also has two bear traps, a single mop, broom, spray cleaner, rag, and trash bag." cost = CARGO_CRATE_VALUE * 2 access_view = ACCESS_JANITOR contains = list(/obj/item/reagent_containers/glass/bucket, @@ -1533,7 +1658,9 @@ /obj/item/reagent_containers/glass/rag, /obj/item/grenade/chem_grenade/cleaner, /obj/item/grenade/chem_grenade/cleaner, - /obj/item/grenade/chem_grenade/cleaner) + /obj/item/grenade/chem_grenade/cleaner, + /obj/item/restraints/legcuffs/beartrap, + /obj/item/restraints/legcuffs/beartrap) crate_name = "janitorial supplies crate" /datum/supply_pack/service/janitor/janicart @@ -1866,7 +1993,7 @@ cost = CARGO_CRATE_VALUE * 12 contains = list(/obj/item/storage/backpack/duffelbag/clown/cream_pie) crate_name = "party equipment crate" - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND access = ACCESS_THEATRE access_view = ACCESS_THEATRE crate_type = /obj/structure/closet/crate/secure @@ -2073,7 +2200,7 @@ /datum/supply_pack/critter/butterfly name = "Butterflies Crate" desc = "Not a very dangerous insect, but they do give off a better image than, say, flies or cockroaches."//is that a motherfucking worm reference - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND cost = CARGO_CRATE_VALUE * 5 access_view = ACCESS_THEATRE contains = list(/mob/living/simple_animal/butterfly) @@ -2141,7 +2268,7 @@ access_view = ACCESS_HOS contains = list(/mob/living/simple_animal/crab) crate_name = "look sir free crabs" - DropPodOnly = TRUE + supply_flags = SUPPLY_PACK_DROPPOD_ONLY /datum/supply_pack/critter/crab/generate() . = ..() @@ -2246,7 +2373,7 @@ /datum/supply_pack/costumes_toys/randomised/contraband name = "Contraband Crate" desc = "Psst.. bud... want some contraband? I can get you a poster, some nice cigs, dank, even some sponsored items...you know, the good stuff. Just keep it away from the cops, kay?" - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND cost = CARGO_CRATE_VALUE * 6 num_contained = 7 contains = list(/obj/item/poster/random_contraband, @@ -2287,7 +2414,7 @@ /datum/supply_pack/costumes_toys/foamforce/bonus name = "Foam Force Pistols Crate" desc = "Psst.. hey bud... remember those old foam force pistols that got discontinued for being too cool? Well I got two of those right here with your name on em. I'll even throw in a spare mag for each, waddya say?" - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND cost = CARGO_CRATE_VALUE * 8 contains = list(/obj/item/gun/ballistic/automatic/pistol/toy, /obj/item/gun/ballistic/automatic/pistol/toy, @@ -2328,15 +2455,6 @@ crate_name = "formalwear crate" crate_type = /obj/structure/closet/crate/wooden -/datum/supply_pack/costumes_toys/clownpin - name = "Hilarious Firing Pin Crate" - desc = "I uh... I'm not really sure what this does. Wanna buy it?" - cost = CARGO_CRATE_VALUE * 10 - contraband = TRUE - contains = list(/obj/item/firing_pin/clown) - crate_name = "toy crate" // It's /technically/ a toy. For the clown, at least. - crate_type = /obj/structure/closet/crate/wooden - /datum/supply_pack/costumes_toys/lasertag name = "Laser Tag Crate" desc = "Foam Force is for boys. Laser Tag is for men. Contains three sets of red suits, blue suits, matching helmets, and matching laser tag guns." @@ -2365,7 +2483,7 @@ name = "Laser Tag Firing Pins Crate" desc = "Three laser tag firing pins used in laser-tag units to ensure users are wearing their vests." cost = CARGO_CRATE_VALUE * 3.5 - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list(/obj/item/storage/box/lasertagpins) crate_name = "laser tag crate" @@ -2461,7 +2579,7 @@ desc = "This crate contains everything you need to set up your own ethnicity-based racketeering operation." cost = CARGO_CRATE_VALUE * 4 contains = list() - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND /datum/supply_pack/costumes_toys/mafia/fill(obj/structure/closet/crate/C) for(var/i in 1 to 4) @@ -2496,8 +2614,7 @@ name = "Art Supplies" desc = "Make some happy little accidents with a rapid pipe cleaner layer, three spraycans, and lots of crayons!" cost = CARGO_CRATE_VALUE * 1.8 - contains = list(/obj/item/rcl, - /obj/item/storage/toolbox/artistic, + contains = list(/obj/item/storage/toolbox/artistic, /obj/item/toy/crayon/spraycan, /obj/item/toy/crayon/spraycan, /obj/item/toy/crayon/spraycan, @@ -2562,8 +2679,8 @@ crate_name = "saltwater fish crate" /datum/supply_pack/misc/tiziran_fish - name = "Tirizan Fish Case" - desc = "Tiziran saltwater fish imported from the Zagos Sea." + name = "Jitarai Fish Case" + desc = "Jitarai saltwater fish imported from the Zagos Sea." cost = CARGO_CRATE_VALUE * 2 contains = list(/obj/item/storage/fish_case/tiziran, /obj/item/storage/fish_case/tiziran) @@ -2610,8 +2727,8 @@ /datum/supply_pack/misc/commandkeys name = "Command Encryption Key Crate" desc = "A pack of encryption keys that give access to the command radio network. Daedalus Industries reminds unauthorized employees not to eavesdrop in on secure communications channels, or at least to keep heckling of the command staff to a minimum." - access_view = ACCESS_HEADS - access = ACCESS_HEADS + access_view = ACCESS_MANAGEMENT + access = ACCESS_MANAGEMENT cost = CARGO_CRATE_VALUE * 4 contains = list(/obj/item/encryptionkey/headset_com, /obj/item/encryptionkey/headset_com, @@ -2693,7 +2810,7 @@ desc = "Presenting the New Nanotrasen-Brand Bluespace Supplypod! Transport cargo with grace and ease! Call today and we'll shoot over a demo unit for just 300 credits!" cost = CARGO_CRATE_VALUE * 0.6 //Empty pod, so no crate refund contains = list() - DropPodOnly = TRUE + supply_flags = SUPPLY_PACK_DROPPOD_ONLY crate_type = null special_pod = /obj/structure/closet/supplypod/bluespacepod @@ -2750,7 +2867,7 @@ name = "Black Market LTSRBT" desc = "Need a faster and better way of transporting your illegal goods from and to the station? Fear not, the Long-To-Short-Range-Bluespace-Transceiver (LTSRBT for short) is here to help. Contains a LTSRBT circuit, two bluespace crystals, and one ansible." cost = CARGO_CRATE_VALUE * 20 - contraband = TRUE + supply_flags = SUPPLY_PACK_CONTRABAND contains = list( /obj/item/circuitboard/machine/ltsrbt, /obj/item/stack/ore/bluespace_crystal/artificial, @@ -3033,20 +3150,14 @@ group = "Data Disks" /datum/supply_pack/data_disk/preloaded - name = "Data Disk" + name = "Data Disk (Omnifab)" desc = "Contains an extremely expensive data disk for use in fabricators." cost = CARGO_CRATE_VALUE * 5 - contains = list(/obj/item/disk/data/hyper/preloaded/fabricator/omni) - crate_name = "data disk crate" - hidden = TRUE - -/datum/supply_pack/data_disk/preloaded/omni - name = "Data Disk (Omnifab)" access = ACCESS_RESEARCH contains = list(/obj/item/disk/data/hyper/preloaded/fabricator/omni) crate_name = "omnifab disk crate" -/datum/supply_pack/data_disk/preloaded +/datum/supply_pack/data_disk/preloaded/robotics name = "Data Disk (Robofab)" access = ACCESS_MECH_SCIENCE contains = list(/obj/item/disk/data/hyper/preloaded/fabricator/robotics) diff --git a/code/modules/cargo/packs_govt.dm b/code/modules/cargo/packs_govt.dm new file mode 100644 index 000000000000..bb0cf80ee617 --- /dev/null +++ b/code/modules/cargo/packs_govt.dm @@ -0,0 +1,11 @@ +/datum/supply_pack/medical/hypospray + name = "Hypospray Mk.II" + desc = "Contains an experimental rechargable auto injector." + cost = 500 + contains = list( + /obj/item/storage/hypospraykit/experimental, + + ) + crate_name = "experimental hypospray crate" + supply_flags = SUPPLY_PACK_GOVERNMENT + diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index 6333177fe7b1..2f498006af55 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -11,7 +11,7 @@ allow_dense = TRUE delivery_icon = null can_weld_shut = FALSE - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, FIRE = 100, ACID = 80) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, FIRE = 100, ACID = 80) anchored = TRUE //So it cant slide around after landing anchorable = FALSE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 @@ -70,6 +70,9 @@ bluespace = TRUE explosionSize = list(0,0,0,0) +/obj/structure/closet/supplypod/safe + explosionSize = list(0,0,0,0) + /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. Targets must be manually stuffed inside the pod for proper delivery." @@ -101,32 +104,6 @@ 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(mapload) - . = ..() - var/turf/picked_turf = pick(GLOB.holdingfacility) - reverse_dropoff_coords = list(picked_turf.x, picked_turf.y, picked_turf.z) - -/obj/structure/closet/supplypod/extractionpod/Destroy() - if(recieving) - to_chat(tied_contract.contract.owner, "
    [span_userdanger("Extraction pod destroyed. Contract aborted.")]") - if (contract_hub.current_contract == tied_contract) - contract_hub.current_contract = null - contract_hub.assigned_contracts[tied_contract.id].status = CONTRACT_STATUS_ABORTED - tied_contract = null - contract_hub = null - return ..() - -/obj/structure/closet/supplypod/extractionpod/Moved(atom/OldLoc, Dir, list/old_locs, momentum_change = TRUE) - . = ..() - if(recieving && (atom_integrity <= 0)) - to_chat(tied_contract.contract.owner, "
    [span_userdanger("Extraction pod destroyed. Contract aborted.")]") - if (contract_hub.current_contract == tied_contract) - contract_hub.current_contract = null - contract_hub.assigned_contracts[tied_contract.id].status = CONTRACT_STATUS_ABORTED - tied_contract = null - contract_hub = null - - /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. @@ -395,7 +372,7 @@ 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() + mob_to_insert.release_all_grabs() else if(isobj(to_insert)) var/obj/obj_to_insert = to_insert diff --git a/code/modules/cargo/supplypod_beacon.dm b/code/modules/cargo/supplypod_beacon.dm index 107b2fc3492c..5003b919b864 100644 --- a/code/modules/cargo/supplypod_beacon.dm +++ b/code/modules/cargo/supplypod_beacon.dm @@ -79,7 +79,7 @@ to_chat(user, span_notice("[src] linked to [C].")) /obj/item/supplypod_beacon/AltClick(mob/user) - if (!user.canUseTopic(src, !issilicon(user))) + if (!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if (express_console) unlink_console() @@ -92,7 +92,7 @@ var/new_beacon_name = tgui_input_text(user, "What would you like the tag to be?", "Beacon Tag", max_length = MAX_NAME_LEN) if(isnull(new_beacon_name)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return name += " ([tag])" diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 1e4792317ff1..8f3578f07568 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -61,6 +61,10 @@ if(!ispath(colour_type, /datum/client_colour) || QDELING(src)) return + for(var/datum/client_colour/existing_color as anything in client_colours) + if(existing_color.type == colour_type) + return + 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) @@ -188,6 +192,9 @@ /datum/client_colour/glass_colour/nightmare colour = list(255,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, -130,0,0,0) //every color is either red or black +/datum/client_colour/malfunction + colour = list(/*R*/ 0,0,0,0, /*G*/ 0,175,0,0, /*B*/ 0,0,0,0, /*A*/ 0,0,0,1, /*C*/0,-130,0,0) // Matrix colors + /datum/client_colour/monochrome colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) priority = PRIORITY_HIGH //we can't see colors anyway! @@ -213,6 +220,18 @@ /datum/client_colour/rave priority = PRIORITY_LOW +/datum/client_colour/ghostmono + colour = list( + 0.3,0.3,0.3,0, + 0.3,0.3,0.3,0, + 0.3,0.3,0.3,0, + 0.0,0.0,0.0,1, + ) + priority = PRIORITY_ABSOLUTE + override = TRUE + fade_in = 20 + fade_out = 20 + #undef PRIORITY_ABSOLUTE #undef PRIORITY_HIGH #undef PRIORITY_NORMAL diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 1de06572c157..021cd2539b8b 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -39,6 +39,9 @@ //////////////// /// hides the byond verb panel as we use our own custom version show_verb_panel = FALSE + /// Use our custom cursor + mouse_pointer_icon = 'icons/effects/mouse_pointers/default.dmi' + ///Contains admin info. Null if client is not an admin. var/datum/admins/holder = null ///Needs to implement InterceptClickOn(user,params,atom) proc @@ -112,6 +115,8 @@ preload_rsc = PRELOAD_RSC var/atom/movable/screen/click_catcher/void + // Keep track of if our client has their mouse down or not + var/mouse_down = FALSE ///used to make a special mouse cursor, this one for mouse up icon var/mouse_up_icon = null @@ -173,6 +178,10 @@ var/middragtime = 0 //Middle-mouse-button clicked object control for aimbot exploit detection. Weakref var/datum/weakref/middle_drag_atom_ref + //When we started the currently active drag + var/drag_start = 0 + //The params we were passed at the start of the drag, in list form + var/list/drag_details /// Messages currently seen by this client @@ -232,10 +241,15 @@ /// rate limiting for the crew manifest var/crew_manifest_delay + /// Semaphore for macro updates, so that they all complete and don't stomp over each other. + var/updating_macros = FALSE /// A buffer of currently held keys. var/list/keys_held = list() /// A buffer for combinations such of modifiers + keys (ex: CtrlD, AltE, ShiftT). Format: `"key"` -> `"combo"` (ex: `"D"` -> `"CtrlD"`) var/list/key_combos_held = list() + /// The direction we WANT to move, based off our keybinds + /// Will be updated to be the actual direction later on + var/intended_direction = NONE /* ** These next two vars are to apply movement for keypresses and releases made while move delayed. ** Because discarding that input makes the game less responsive. @@ -260,3 +274,6 @@ //screen_text vars ///lazylist of screen_texts for this client, first in this list is the one playing var/list/atom/movable/screen/text/screen_text/screen_texts + + /// Keeps track of what ambience we are playing. Yeah i know it sucks. + var/playing_ambience diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index d33a781c6a92..d19b5933c3ec 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -122,16 +122,33 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(codex_topic(href, href_list)) return + if(href_list["show_slapcraft_hints"]) + var/path = text2path(href_list["show_slapcraft_hints"]) + if(ispath(path, /obj/item)) + show_slapcraft_hints(path) + return + switch(href_list["action"]) if("openLink") src << link(href_list["link"]) if (hsrc) var/datum/real_src = hsrc + if(istext(real_src)) + real_src = locate(real_src) if(QDELETED(real_src)) return + //fun fact: Topic() acts like a verb and is executed at the end of the tick like other verbs. So we have to queue it if the server is + //overloaded + if(hsrc && hsrc != holder && DEFAULT_TRY_QUEUE_VERB(VERB_CALLBACK(src, PROC_REF(_Topic), hsrc, href, href_list))) + return ..() //redirect to hsrc.Topic() +///dumb workaround because byond doesnt seem to recognize the .proc/Topic() typepath for /datum/proc/Topic() from the client Topic, +///so we cant queue it without this +/client/proc/_Topic(datum/hsrc, href, list/href_list) + return hsrc.Topic(href, href_list) + /client/proc/is_content_unlocked() if(!prefs.unlock_content) to_chat(src, "Become a BYOND member to access member-perks and features, as well as support the engine that makes this game possible. Only 10 bucks for 3 months! Click Here to find out more.") @@ -324,8 +341,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( player_details.byond_version = full_version GLOB.player_details[ckey] = player_details - . = ..() //calls mob.Login() + if (length(GLOB.stickybanadminexemptions)) GLOB.stickybanadminexemptions -= ckey if (!length(GLOB.stickybanadminexemptions)) @@ -337,6 +354,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( add_system_note("Spoofed-Byond-Version", "Detected as using a spoofed byond version.") log_suspicious_login("Failed Login: [key] - Spoofed byond version") qdel(src) + return if (num2text(byond_build) in GLOB.blacklisted_builds) log_access("Failed login: [key] - blacklisted byond version") @@ -349,49 +367,12 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( qdel(src) return - if(CONFIG_GET(flag/panic_bunker) && CONFIG_GET(flag/panic_bunker_discord_require)) - if(!SSdbcore.Connect()) - var/msg = "Database connection failure. Key [key] not checked for Discord account requirement." - - if(!CONFIG_GET(flag/sql_enabled)) - msg += "\nDB IS NOT ENABLED - THIS IS NOT A BUG\nDiscord account links cannot be checked without a database!" - - log_world(msg) - message_admins(msg) - else - if(!discord_is_link_valid(ckey)) - restricted_mode = TRUE - var/discord_otp = discord_get_or_generate_one_time_token_for_ckey(ckey) - var/discord_prefix = CONFIG_GET(string/discordbotcommandprefix) - //These need to be immediate because we're disposing of the client the second we're done with this. - usr << browse( - "
    [("[CONFIG_GET(string/panic_bunker_discord_register_message)]")] \ -

    Your One-Time-Password is: [discord_otp] \ -

    To link your Discord account, head to the Discord Server and paste the following message:
    \ - [discord_prefix]verify [discord_otp]
    \ -
    discord.daedalus13.net \ -
    Due to technical limitations, we cannot embed this link. Love byond.", - "window=discordauth;can_resize=0;can_minimize=0", - ) - to_chat_immediate(src, span_boldnotice("Your One-Time-Password is: [discord_otp]")) - to_chat_immediate(src, span_userdanger("DO NOT SHARE THIS OTP WITH ANYONE")) - to_chat_immediate(src, span_notice("To link your Discord account, head to the Discord Server and paste the following message:
    [discord_prefix]verify [discord_otp]
    \n")) - - if(connecting_admin) - log_admin("The admin [key] has been allowed to bypass the Discord account link requirement") - message_admins(span_adminnotice("The admin [key] has been allowed to bypass the Discord account link requirement")) - to_chat(src, "As an admin, you have been allowed to bypass the Discord account link requirement") - - else - log_access("Failed Login: [key] - No valid Discord account link registered.") - qdel(src) - return - if(SSinput.initialized) set_macros() // Initialize stat panel stat_panel.initialize( + assets = list(get_asset_datum(/datum/asset/simple/namespaced/cursors)), inline_html = file2text('html/statbrowser.html'), inline_js = file2text('html/statbrowser.js'), inline_css = file2text('html/statbrowser.css'), @@ -465,6 +446,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(memo_message) to_chat(src, memo_message) adminGreet() + if (mob && reconnecting) var/stealth_admin = mob.client?.holder?.fakekey var/announce_leave = mob.client?.prefs?.read_preference(/datum/preference/toggle/broadcast_login_logout) @@ -488,11 +470,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/cached_player_age = set_client_age_from_db(tdata) //we have to cache this because other shit may change it and we need it's current value now down below. if (isnum(cached_player_age) && cached_player_age == -1) //first connection player_age = 0 - var/msg = "This server changes default TG preference values to better fit the feel of our server.
    " - msg += "We encourage you to try it out to see if you like it.
    " - msg += "You may re-enable modern visuals in the preference menu.

    " - msg += "You will only see this message once" - src << browse(msg, "window=warning_popup") + spawn(0) + if(!QDELETED(src)) + show_soul_message() var/nnpa = CONFIG_GET(number/notify_new_player_age) if (isnum(cached_player_age) && cached_player_age == -1) //first connection @@ -615,6 +595,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( active_mousedown_item = null SSambience.remove_ambience_client(src) SSmouse_entered.hovers -= src + SSmouse_entered.sustained_hovers -= src SSping.currentrun -= src QDEL_NULL(view_size) QDEL_NULL(void) @@ -624,6 +605,75 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( ..() //Even though we're going to be hard deleted there are still some things that want to know the destroy is happening return QDEL_HINT_HARDDEL_NOW +/// Checks panic bunker status and applies restricted_mode if necessary. Returns TRUE if the client should be kicked. +/client/proc/check_panic_bunker() + if(ckey in GLOB.interviews.approved_ckeys) + return FALSE + + var/is_admin = !!holder + + // Check if user should be added to interview queue + if (CONFIG_GET(flag/panic_bunker_interview)) + if(is_admin) + return FALSE + + var/required_living_minutes = CONFIG_GET(number/panic_bunker_living) + var/living_minutes = get_exp_living(TRUE) + if (required_living_minutes >= living_minutes) + restricted_mode = TRUE + return FALSE + + // Discord linkage + if(CONFIG_GET(flag/panic_bunker_discord_require)) + if(!SSdbcore.Connect()) + var/msg = "Database connection failure. Key [key] not checked for Discord account requirement." + + if(!CONFIG_GET(flag/sql_enabled)) + msg += "\nDB IS NOT ENABLED - THIS IS NOT A BUG\nDiscord account links cannot be checked without a database!" + + log_world(msg) + message_admins(msg) + return FALSE + else + if(!discord_is_link_valid()) + if(is_admin) + log_admin("The admin [key] has been allowed to bypass the Discord account link requirement") + message_admins(span_adminnotice("The admin [key] has been allowed to bypass the Discord account link requirement")) + to_chat(src, "As an admin, you have been allowed to bypass the Discord account link requirement") + return FALSE + else + var/kick = SSlag_switch?.measures[KICK_GUESTS] + log_access("Failed Login: [key] - No valid Discord account link registered. [kick ? "" : "They have been permitted to connect as a guest."]") + if(kick) + restricted_mode = TRUE // Don't bother removing their verbs, theyre about to be booted anyway and verb altering is expensive. + var/discord_otp = discord_get_or_generate_one_time_token_for_ckey(ckey) + var/discord_prefix = CONFIG_GET(string/discordbotcommandprefix) + //These need to be immediate because we're disposing of the client the second we're done with this. + usr << browse( + {" +
    + Your One-Time-Password is:
    [discord_otp]
    +

    + To link your Discord account, head to the Discord Server and make an entry ticket if you have not already. Then, paste the following into any channel: +
    +
    + + [discord_prefix]verify [discord_otp] + +
    + discord.daedalus13.net (We are unable to embed this link for security reasons.) +
    + "}, + "window=discordauth;can_close=0;can_resize=0;can_minimize=0", + ) + to_chat_immediate(src, span_boldnotice("Your One-Time-Password is: [discord_otp]")) + to_chat_immediate(src, span_userdanger("DO NOT SHARE THIS OTP WITH ANYONE")) + to_chat_immediate(src, span_notice("To link your Discord account, head to the Discord Server (discord.daedalus13.net) and paste the following message:
    [discord_prefix]verify [discord_otp]
    \n")) + return TRUE + else + restricted_mode = TRUE + return FALSE + /client/proc/set_client_age_from_db(connectiontopic) if (is_guest_key(src.key)) return @@ -943,25 +993,32 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( click_intercept_time = 0 //Reset and return. Next click should work, but not this one. return click_intercept_time = 0 //Just reset. Let's not keep re-checking forever. + var/ab = FALSE var/list/modifiers = params2list(params) + var/button_clicked = LAZYACCESS(modifiers, "button") + var/dragged = LAZYACCESS(modifiers, DRAG) - if(dragged && !LAZYACCESS(modifiers, dragged)) //I don't know what's going on here, but I don't trust it + if(dragged && button_clicked != dragged) return - if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && LAZYACCESS(modifiers, LEFT_CLICK)) + if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && button_clicked == LEFT_CLICK) ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) var/mcl = CONFIG_GET(number/minute_click_limit) if (!holder && mcl) var/minute = round(world.time, 600) + if (!clicklimiter) clicklimiter = new(LIMITER_SIZE) + if (minute != clicklimiter[CURRENT_MINUTE]) clicklimiter[CURRENT_MINUTE] = minute clicklimiter[MINUTE_COUNT] = 0 - clicklimiter[MINUTE_COUNT] += 1+(ab) + + clicklimiter[MINUTE_COUNT] += 1 + (ab) + if (clicklimiter[MINUTE_COUNT] > mcl) var/msg = "Your previous click was ignored because you've done too many in a minute." if (minute != clicklimiter[ADMINSWARNED_AT]) //only one admin message per-minute. (if they spam the admins can just boot/ban them) @@ -982,14 +1039,22 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/second = round(world.time, 10) if (!clicklimiter) clicklimiter = new(LIMITER_SIZE) + if (second != clicklimiter[CURRENT_SECOND]) clicklimiter[CURRENT_SECOND] = second clicklimiter[SECOND_COUNT] = 0 - clicklimiter[SECOND_COUNT] += 1+(!!ab) + + clicklimiter[SECOND_COUNT] += 1 + (!!ab) + if (clicklimiter[SECOND_COUNT] > scl) to_chat(src, span_danger("Your previous click was ignored because you've done too many in a second")) return + //check if the server is overloaded and if it is then queue up the click for next tick + //yes having it call a wrapping proc on the subsystem is fucking stupid glad we agree unfortunately byond insists its reasonable + if(!QDELETED(object) && TRY_QUEUE_VERB(VERB_CALLBACK(object, TYPE_PROC_REF(/atom, _Click), location, control, params), VERB_HIGH_PRIORITY_QUEUE_THRESHOLD, SSinput, control)) + return + if (hotkeys) // If hotkey mode is enabled, then clicking the map will automatically // unfocus the text bar. This removes the red color from the text bar @@ -997,7 +1062,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]") else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") + winset(src, null, "input.background-color=[COLOR_INPUT_ENABLED]") SEND_SIGNAL(src, COMSIG_CLIENT_CLICK, object, location, control, params, usr) @@ -1086,6 +1151,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( movement_keys = list() for(var/kb_name in D.key_bindings) for(var/key in D.key_bindings[kb_name]) + if(!hotkeys && !SSinput.unprintables_cache[key]) + continue switch(kb_name) if("North") movement_keys[key] = NORTH @@ -1103,6 +1170,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( winset(src, "default-[REF(key)]", "parent=default;name=[key];command=looc") if("Me") winset(src, "default-[REF(key)]", "parent=default;name=[key];command=me") + calculate_move_dir() /client/proc/change_view(new_size) if (isnull(new_size)) @@ -1205,16 +1273,21 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( holder.filteriffic = new /datum/filter_editor(in_atom) holder.filteriffic.ui_interact(mob) +///opens the particle editor UI for the in_atom object for this client +/client/proc/open_particle_editor(atom/movable/in_atom) + if(holder) + holder.particle_test = new /datum/particle_editor(in_atom) + holder.particle_test.ui_interact(mob) /client/proc/set_right_click_menu_mode(shift_only) if(shift_only) winset(src, "mapwindow.map", "right-click=true") - winset(src, "ShiftUp", "is-disabled=false") - winset(src, "Shift", "is-disabled=false") + winset(src, "default.PROTECTED-Shift", "command=\".winset :map.right-click=false\nKeyDown Shift\"") + winset(src, "default.PROTECTED-ShiftUp", "command=\".winset :map.right-click=true\nKeyUp Shift\"") else winset(src, "mapwindow.map", "right-click=false") - winset(src, "default.Shift", "is-disabled=true") - winset(src, "default.ShiftUp", "is-disabled=true") + winset(src, "default.PROTECTED-Shift", "command=\"KeyDown Shift\"") + winset(src, "default.PROTECTED-ShiftUp", "command=\"KeyUp Shift\"") /client/proc/update_ambience_pref() if(prefs.toggles & SOUND_AMBIENCE) @@ -1277,3 +1350,42 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( SEND_SOUND(usr, sound(null)) tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) + +/client/proc/show_slapcraft_hints(given_type) + var/list/hints = slapcraft_examine_hints_for_type(given_type) + if(!length(hints)) + return + hints.Insert(1, "
    Craftables
    ") + + to_chat(mob, examine_block("[jointext(hints, "
    ")]
    ")) + +/// Strip verbs from a client and it's mob. +/client/proc/strip_verbs() + for (var/v in verbs) + var/procpath/verb_path = v + remove_verb(src, verb_path) + + for (var/v in mob?.verbs) + var/procpath/verb_path = v + remove_verb(mob, verb_path) + +/client/proc/show_soul_message() + var/content = {" +
    +
    +
    + Welcome to Olympus Outpost, traveler.

    + + You may notice that the station is not run like other stations, and you may have some difficulty adjusting. + There's no need to fear, as we provide Graphics and Accessibility settings in the Options menu. +

    + Please enjoy your stay. +
    +
    +
    + "} + + var/datum/browser/popup = new(mob, "soulnotice", "Notice of Modification", 660, 270) + popup.set_window_options("can_close=1;can_resize=0") + popup.set_content(content) + popup.open() diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index ad90fecbb504..9a0e78ad9e7a 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -1,22 +1,28 @@ // Priorities must be in order! /// The default priority level #define PREFERENCE_PRIORITY_DEFAULT 1 +/// The priority level for quirk-based prefs +#define PREFERENCE_PRIORITY_QUIRKS 2 /// The priority at which species runs, needed for external organs to apply properly. -#define PREFERENCE_PRIORITY_SPECIES 2 +#define PREFERENCE_PRIORITY_SPECIES 3 /// The priority at which gender is determined, needed for proper randomization. -#define PREFERENCE_PRIORITY_GENDER 3 +#define PREFERENCE_PRIORITY_GENDER 4 /// The priority at which body type is decided, applied after gender so we can /// support the "use gender" option. -#define PREFERENCE_PRIORITY_BODY_TYPE 4 +#define PREFERENCE_PRIORITY_BODY_TYPE 5 +/// Augments come after species and bodytype. +#define PREFERENCE_PRIORITY_AUGMENTS 6 +/// Applies branding to prosthetics +#define PREFERENCE_PRIORITY_BRANDED_PROSTHETICS 7 /// The priority hair is applied. We apply human hair first, and moth hair after, only if they are a moth. Sorry. -#define PREFERENCE_PRIORITY_HUMAN_HAIR 5 +#define PREFERENCE_PRIORITY_HUMAN_HAIR 8 /// The priority non-human hair is applied (used to apply moth hair after normal hair) -#define PREFERENCE_PRIORITY_NONHUMAN_HAIR 6 +#define PREFERENCE_PRIORITY_NONHUMAN_HAIR 9 /// The priority at which names are decided, needed for proper randomization. -#define PREFERENCE_PRIORITY_NAMES 7 +#define PREFERENCE_PRIORITY_NAMES 10 /// Preferences that aren't names, but change the name changes set by PREFERENCE_PRIORITY_NAMES. -#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 8 -#define PREFERENCE_PRIORITY_APPEARANCE_MODS 9 +#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 11 +#define PREFERENCE_PRIORITY_APPEARANCE_MODS 12 /// The maximum preference priority, keep this updated, but don't use it for `priority`. #define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_APPEARANCE_MODS @@ -36,7 +42,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /proc/init_preference_entries() var/list/output = list() for (var/datum/preference/preference_type as anything in subtypesof(/datum/preference)) - if (initial(preference_type.abstract_type) == preference_type) + if (isabstract(preference_type)) continue output[preference_type] = new preference_type return output @@ -44,7 +50,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /proc/init_preference_entries_by_key() var/list/output = list() for (var/datum/preference/preference_type as anything in subtypesof(/datum/preference)) - if (initial(preference_type.abstract_type) == preference_type) + if (isabstract(preference_type)) continue output[initial(preference_type.savefile_key)] = GLOB.preference_entries[preference_type] return output @@ -52,7 +58,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /proc/init_all_pref_groups() . = list() for(var/datum/preference_group/module as anything in typesof(/datum/preference_group)) - if(initial(module.abstract_type) == module) + if(isabstract(module)) continue . += new module() @@ -82,6 +88,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /// Represents an individual preference. /datum/preference + abstract_type = /datum/preference /// The display default name when inserted into the chargen var/explanation = "ERROR" @@ -95,9 +102,6 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /// It is up to the PreferencesMenu UI itself to interpret it. var/category = "misc" - /// Do not instantiate if type matches this. - var/abstract_type = /datum/preference - /// What savefile should this preference be read from? /// Valid values are PREFERENCE_CHARACTER and PREFERENCE_PLAYER. /// See the documentation in [code/__DEFINES/preferences.dm]. @@ -225,7 +229,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /// Apply this preference onto the given human. /// Must be overriden by subtypes. /// Called when the savefile_identifier == PREFERENCE_CHARACTER. -/datum/preference/proc/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) //PARIAH EDIT +/datum/preference/proc/apply_to_human(mob/living/carbon/human/target, value) SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(FALSE) CRASH("`apply_to_human()` was not implemented for [type]!") @@ -298,6 +302,8 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /// Returns TRUE for a successful preference application. /// Returns FALSE if it is invalid. /datum/preferences/proc/write_preference(datum/preference/preference, preference_value) + if(ispath(preference)) + preference = GLOB.preference_entries[preference] var/savefile = get_savefile_for_savefile_identifier(preference.savefile_identifier) var/new_value = preference.deserialize(preference_value, src) var/success = preference.write(savefile, new_value) @@ -601,6 +607,7 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) ///Holds any kind of abstract list data you'd like it to. MUST impliment `is_valid`! /datum/preference/blob abstract_type = /datum/preference/blob + can_randomize = FALSE /datum/preference/blob/create_default_value() return list() @@ -613,5 +620,5 @@ GLOBAL_LIST_INIT(all_pref_groups, init_all_pref_groups()) /datum/preference/blob/is_valid(value) return islist(value) -/datum/preference/blob/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/blob/apply_to_human(mob/living/carbon/human/target, value) return diff --git a/code/modules/client/preferences/accessibility.dm b/code/modules/client/preferences/accessibility.dm new file mode 100644 index 000000000000..93f57e455392 --- /dev/null +++ b/code/modules/client/preferences/accessibility.dm @@ -0,0 +1,15 @@ +/datum/preference/toggle/disable_pain_flash + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "disable_pain_flash" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE + +/datum/preference/toggle/motion_sickness + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "motion_sickness" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE + +/datum/preference/toggle/motion_sickness/apply_to_client(client/client, value) + if(client.mob) + SEND_SIGNAL(client.mob, COMSIG_MOB_MOTION_SICKNESS_UPDATE, value) diff --git a/code/modules/client/preferences/augments/_augment.dm b/code/modules/client/preferences/augments/_augment.dm new file mode 100644 index 000000000000..71edc26ee2aa --- /dev/null +++ b/code/modules/client/preferences/augments/_augment.dm @@ -0,0 +1,58 @@ +GLOBAL_LIST_EMPTY(augment_items) +GLOBAL_LIST_EMPTY(augment_categories_to_slots) +GLOBAL_LIST_EMPTY(augment_slot_to_items) +/// Map of species > category > slot > item +GLOBAL_LIST_EMPTY(species_augment_tree) + +/datum/augment_item + var/name + ///Description of the loadout augment, automatically set by New() if null + var/description + ///Category in which the augment belongs to. check "_DEFINES/augment.dm" + var/category = AUGMENT_CATEGORY_NONE + ///Slot in which the augment belongs to, MAKE SURE THE SAME SLOT IS ONLY IN ONE CATEGORY + var/slot = AUGMENT_SLOT_NONE + ///Can multiple of this type be taken? + var/exclusive = TRUE + ///Typepath to the augment being used + var/path + +/datum/augment_item/New() + if(!description && path) + var/obj/O = path + description = initial(O.desc) + +/datum/augment_item/proc/apply_to_human(mob/living/carbon/human/H, datum/species/S) + return + +/datum/augment_item/proc/can_apply_to_species(datum/species/S) + return TRUE + +/// Returns a tree of species > category > slot > item path +/proc/get_species_augments(datum/species/S) + RETURN_TYPE(/list) + + var/static/list/augment_tree = list() + if(istype(S)) + S = S.type + + if(augment_tree[S]) + return augment_tree[S] + + S = new S() + + if(!augment_tree[S.type]) + augment_tree[S.type] = list() + + for(var/datum/augment_item/A as anything in GLOB.augment_items) + A = GLOB.augment_items[A] + + if(!A.can_apply_to_species(S)) + continue + if(!augment_tree[S.type][A.category]) + augment_tree[S.type][A.category] = list() + if(!augment_tree[S.type][A.category][A.slot]) + augment_tree[S.type][A.category][A.slot] = list() + augment_tree[S.type][A.category][A.slot] += A.type + + return augment_tree[S.type] diff --git a/code/modules/client/preferences/augments/augment_bodypart.dm b/code/modules/client/preferences/augments/augment_bodypart.dm new file mode 100644 index 000000000000..705090475b42 --- /dev/null +++ b/code/modules/client/preferences/augments/augment_bodypart.dm @@ -0,0 +1,98 @@ +/datum/augment_item/bodypart + category = AUGMENT_CATEGORY_BODYPARTS + + +/datum/augment_item/bodypart/apply_to_human(mob/living/carbon/human/H, datum/species/S) + var/newpath = S.robotic_bodyparts[initial(path:body_zone)] + + var/obj/item/bodypart/BP = new newpath() + var/obj/item/bodypart/old = H.get_bodypart(BP.body_zone) + BP.replace_limb(H, TRUE) + qdel(old) + +/datum/augment_item/bodypart/can_apply_to_species(datum/species/S) + var/obj/item/bodypart/BP = path + if(S.robotic_bodyparts?[initial(BP.body_zone)]) + return TRUE + return FALSE + +/datum/augment_item/bodypart/head + slot = AUGMENT_SLOT_HEAD + +/datum/augment_item/bodypart/chest + slot = AUGMENT_SLOT_CHEST + +/datum/augment_item/bodypart/l_arm + slot = AUGMENT_SLOT_L_ARM + +/datum/augment_item/bodypart/r_arm + slot = AUGMENT_SLOT_R_ARM + +/datum/augment_item/bodypart/l_leg + slot = AUGMENT_SLOT_L_LEG + +/datum/augment_item/bodypart/r_leg + slot = AUGMENT_SLOT_R_LEG + + +// ROBOTIC LIMBS +/datum/augment_item/bodypart/head/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_HEAD + path = /obj/item/bodypart/head/robot/surplus + +/datum/augment_item/bodypart/chest/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_CHEST + path = /obj/item/bodypart/chest/robot/surplus + +/datum/augment_item/bodypart/l_arm/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_L_ARM + path = /obj/item/bodypart/arm/left/robot/surplus + +/datum/augment_item/bodypart/r_arm/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_R_ARM + path = /obj/item/bodypart/arm/right/robot/surplus + +/datum/augment_item/bodypart/l_leg/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_L_LEG + path = /obj/item/bodypart/leg/left/robot/surplus + +/datum/augment_item/bodypart/r_leg/robotic + name = "Prosthetic" + slot = AUGMENT_SLOT_R_LEG + path = /obj/item/bodypart/leg/right/robot/surplus + +/// AMPUTATION +/datum/augment_item/bodypart/amputated/l_arm + name = "Amputated" + path = /obj/item/bodypart/arm/left + slot = AUGMENT_SLOT_L_ARM + +/datum/augment_item/bodypart/amputated/r_arm + name = "Amputated" + path = /obj/item/bodypart/arm/right + slot = AUGMENT_SLOT_R_ARM + +/datum/augment_item/bodypart/amputated/l_leg + name = "Amputated" + path = /obj/item/bodypart/leg/left + slot = AUGMENT_SLOT_L_LEG + +/datum/augment_item/bodypart/amputated/r_leg + name = "Amputated" + path = /obj/item/bodypart/leg/right + slot = AUGMENT_SLOT_R_LEG + +/datum/augment_item/bodypart/amputated/apply_to_human(mob/living/carbon/human/H, datum/species/S) + var/obj/item/bodypart/path = src.path + var/obj/item/bodypart/BP = H.get_bodypart(initial(path.body_zone)) + var/obj/item/bodypart/stump = BP.create_stump() + qdel(BP) + stump.attach_limb(H, TRUE) + +/datum/augment_item/bodypart/amputated/can_apply_to_species(datum/species/S) + return TRUE diff --git a/code/modules/client/preferences/augments/augment_organ.dm b/code/modules/client/preferences/augments/augment_organ.dm new file mode 100644 index 000000000000..e60b345ca482 --- /dev/null +++ b/code/modules/client/preferences/augments/augment_organ.dm @@ -0,0 +1,76 @@ +/datum/augment_item/organ + category = AUGMENT_CATEGORY_ORGANS + +/datum/augment_item/organ/apply_to_human(mob/living/carbon/human/H) + if(istype(H, /mob/living/carbon/human/dummy)) + return + var/obj/item/organ/new_organ = new path() + new_organ.Insert(H,TRUE,FALSE) + +//HEARTS +/datum/augment_item/organ/heart + slot = AUGMENT_SLOT_HEART + +/datum/augment_item/organ/heart/cybernetic + name = "Cybernetic" + path = /obj/item/organ/heart/cybernetic + +/datum/augment_item/organ/heart/can_apply_to_species(datum/species/S) + return !(NOBLOOD in S.species_traits) + +//LUNGS +/datum/augment_item/organ/lungs + slot = AUGMENT_SLOT_LUNGS + +/datum/augment_item/organ/lungs/cybernetic + name = "Cybernetic" + path = /obj/item/organ/lungs/cybernetic + +/datum/augment_item/organ/lungs/can_apply_to_species(datum/species/S) + return S.organs[ORGAN_SLOT_LUNGS] + +//LIVERS +/datum/augment_item/organ/liver + slot = AUGMENT_SLOT_LIVER + +/datum/augment_item/organ/liver/cybernetic + name = "Cybernetic" + path = /obj/item/organ/liver/cybernetic + +/datum/augment_item/organ/liver/can_apply_to_species(datum/species/S) + return S.organs[ORGAN_SLOT_LIVER] + +//STOMACHES +/datum/augment_item/organ/stomach + slot = AUGMENT_SLOT_STOMACH + +/datum/augment_item/organ/stomach/cybernetic + name = "Cybernetic" + path = /obj/item/organ/stomach/cybernetic + +/datum/augment_item/organ/stomach/can_apply_to_species(datum/species/S) + return S.organs[ORGAN_SLOT_LIVER] + +//EYES +/datum/augment_item/organ/eyes + slot = AUGMENT_SLOT_EYES + +/datum/augment_item/organ/eyes/cybernetic + name = "Cybernetic" + path = /obj/item/organ/eyes/robotic + +//TONGUES +/datum/augment_item/organ/tongue + slot = AUGMENT_SLOT_TONGUE + +/datum/augment_item/organ/tongue/normal + name = "Organic" + path = /obj/item/organ/tongue + +/datum/augment_item/organ/tongue/robo + name = "Robotic" + path = /obj/item/organ/tongue/robot + +/datum/augment_item/organ/tongue/forked + name = "Forked" + path = /obj/item/organ/tongue/lizard diff --git a/code/modules/client/preferences/augments/augments.dm b/code/modules/client/preferences/augments/augments.dm new file mode 100644 index 000000000000..90f2711d3434 --- /dev/null +++ b/code/modules/client/preferences/augments/augments.dm @@ -0,0 +1,164 @@ +/// Augments! +/* + expected format: + list( + AUGMENT_SLOT_R_ARM = /datum/augment_item/bodypart/r_arm/amputated + ) + + The AUGMENT_SLOT_IMPLANTS slot expects a list in the format of: + list( + /datum/augment_item/implant/cat_ears = "Cat" + ) +*/ + +/datum/preference/blob/augments + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "augments" + priority = PREFERENCE_PRIORITY_AUGMENTS + +/datum/preference/blob/augments/apply_to_human(mob/living/carbon/human/target, value) + var/datum/species/S = target.dna.species + + for(var/slot in value - AUGMENT_SLOT_IMPLANTS) + var/path = value[slot] + var/datum/augment_item/A = GLOB.augment_items[path] + if(!A.can_apply_to_species(S)) + continue + A.apply_to_human(target, S) + + for(var/datum/augment_item/A as anything in value[AUGMENT_SLOT_IMPLANTS]) + A = GLOB.augment_items[A] + if(!A.can_apply_to_species(S)) + continue + A.apply_to_human(target, S, value[AUGMENT_SLOT_IMPLANTS][A.type]) + +/datum/preference/blob/augments/create_default_value() + return list() + +/datum/preference/blob/augments/deserialize(input, datum/preferences/preferences) + var/datum/species/S = preferences.read_preference(/datum/preference/choiced/species) + S = new S() + var/list/species_tree = get_species_augments(S) + + for(var/slot in input) + if(slot == AUGMENT_SLOT_IMPLANTS) + continue // handled later + if(!GLOB.augment_slot_to_items[slot]) + input -= slot + continue + + var/datum/augment_item/A = GLOB.augment_items[input[slot]] + if(!A) + input -= slot + continue + if(!A.can_apply_to_species(S)) + input -= slot + continue + + var/list/implants = input[AUGMENT_SLOT_IMPLANTS] + if(implants) + if(!islist(implants)) + input -= AUGMENT_SLOT_IMPLANTS + else + for(var/path as anything in implants) + var/datum/augment_item/implant/A = GLOB.augment_items[path] + if(!A) + implants -= path + continue + if(!A.can_apply_to_species(S)) + implants -= path + continue + if(!(A.type in species_tree?[AUGMENT_CATEGORY_IMPLANTS][AUGMENT_SLOT_IMPLANTS])) + implants -= path + continue + if(!(implants[path] in A.get_choices())) + implants -= path + continue + + + return input + +/datum/preference/blob/augments/user_edit(mob/user, datum/preferences/prefs, list/params) + var/list/user_augs = prefs.read_preference(type) + var/datum/species/S = prefs.read_preference(/datum/preference/choiced/species) + var/list/species_augment_tree = get_species_augments(S) + + if(params["switch_augment"]) + var/datum/augment_item/old = GLOB.augment_items[user_augs[params["switch_augment"]]] + if(!old) + return + + var/list/datum/options = list() + for(var/datum/augment_item/A as anything in GLOB.augment_slot_to_items[old.slot]) + A = GLOB.augment_items[A] + options[A.name] = A.type + + var/input = tgui_input_list(user, "Switch Augment", "Augments", options) + if(!input) + return + + user_augs[old.slot] = options[input] + return prefs.update_preference(src, user_augs) + + if(params["remove_augment"]) + var/datum/augment_item/removing = GLOB.augment_items[user_augs[params["remove_augment"]]] + user_augs -= removing.slot + return prefs.update_preference(src, user_augs) + + if(params["add_augment"]) + var/category = params["add_augment"] + var/slot = tgui_input_list(user, "Add Augment", "Augments", species_augment_tree?[category]) + if(!slot) + return + + var/list/choices = list() + + for(var/datum/augment_item/path as anything in species_augment_tree?[category][slot]) + choices[initial(path.name)] = path + + var/augment = tgui_input_list(user, "Add [slot] Augment", "Augments", choices) + if(!augment) + return + + user_augs[slot] = choices[augment] + return prefs.update_preference(src, user_augs) + + + if(params["add_implant"]) + var/list/choices = list() + for(var/datum/augment_item/implant/path as anything in species_augment_tree?[AUGMENT_CATEGORY_IMPLANTS][AUGMENT_SLOT_IMPLANTS]) + choices[initial(path.name)] = path + + var/datum/augment_item/implant/implant = tgui_input_list(user, "Add Implant", "Implants", choices) + if(!implant) + return + + implant = GLOB.augment_items[choices[implant]] + LAZYADDASSOC(user_augs[AUGMENT_SLOT_IMPLANTS], implant.type, implant.get_choices()[1]) + return prefs.update_preference(src, user_augs) + + if(params["modify_implant"]) + var/datum/augment_item/implant/I = text2path(params["modify_implant"]) + if(!ispath(I)) + return + if(!(I in user_augs[AUGMENT_SLOT_IMPLANTS])) + return + + I = GLOB.augment_items[I] + var/new_look = tgui_input_list(user, "Modify Implant", "Implants", I.get_choices() - SPRITE_ACCESSORY_NONE, user_augs[AUGMENT_SLOT_IMPLANTS][I.type]) + if(!new_look) + return + + user_augs[AUGMENT_SLOT_IMPLANTS][I.type] = new_look + + return prefs.update_preference(src, user_augs) + + if(params["remove_implant"]) + var/path = params["remove_implant"] + path = text2path(path) + if(!ispath(path)) + return + + var/datum/augment_item/removing = GLOB.augment_items[path] + user_augs -= removing.slot + return prefs.update_preference(src, user_augs) diff --git a/code/modules/client/preferences/augments/implants/implant.dm b/code/modules/client/preferences/augments/implants/implant.dm new file mode 100644 index 000000000000..7e34eff3a1a3 --- /dev/null +++ b/code/modules/client/preferences/augments/implants/implant.dm @@ -0,0 +1,43 @@ +/datum/augment_item/implant + category = AUGMENT_CATEGORY_IMPLANTS + slot = AUGMENT_SLOT_IMPLANTS + /// What species can use this implant? + var/list/allowed_species = list() + +/datum/augment_item/implant/apply_to_human(mob/living/carbon/human/H, datum/species/S, feature_value) + if(!feature_value) // wtf did you do + CRASH("Tried to assign an implant without a feature value") + + var/obj/item/organ/O = new path + + H.dna.features[O.feature_key] = feature_value + O.Insert(H, TRUE, FALSE) + +/datum/augment_item/implant/can_apply_to_species(datum/species/S) + if(S.id in allowed_species) + return TRUE + return FALSE + +/// Return a list of sprite accessories to choose from +/datum/augment_item/implant/proc/get_choices() + CRASH("get_choices() unimplimented on [type]") + +/datum/augment_item/implant/cat_ears + name = "Feline Ears" + path = /obj/item/organ/ears/cat + allowed_species = list( + SPECIES_HUMAN + ) + +/datum/augment_item/implant/cat_ears/get_choices() + return GLOB.ears_list + +/datum/augment_item/implant/cat_tail + name = "Feline Tail" + path = /obj/item/organ/tail/cat + allowed_species = list( + SPECIES_HUMAN + ) + +/datum/augment_item/implant/cat_tail/get_choices() + return GLOB.tails_list_human diff --git a/code/modules/client/preferences/auto_punctuation.dm b/code/modules/client/preferences/auto_punctuation.dm new file mode 100644 index 000000000000..51d5e1f5c503 --- /dev/null +++ b/code/modules/client/preferences/auto_punctuation.dm @@ -0,0 +1,5 @@ +/datum/preference/toggle/auto_punctuation + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "autopunctuation" + savefile_identifier = PREFERENCE_PLAYER + default_value = TRUE diff --git a/code/modules/client/preferences/flavortext.dm b/code/modules/client/preferences/flavortext.dm index aa452705a9f7..9761b0f02ce0 100644 --- a/code/modules/client/preferences/flavortext.dm +++ b/code/modules/client/preferences/flavortext.dm @@ -2,5 +2,17 @@ savefile_identifier = PREFERENCE_CHARACTER savefile_key = "flavor_text" -/datum/preference/text/flavor_text/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) - target.dna.features["flavor_text"] = value + explanation = "Flavor Text" + +/datum/preference/text/flavor_text/get_button(datum/preferences/prefs) + return button_element(prefs, "Set Examine Text", "pref_act=[type]") + +/datum/preference/text/flavor_text/user_edit(mob/user, datum/preferences/prefs) + var/input = tgui_input_text(user, "Describe your character in greater detail.",, serialize(prefs.read_preference(type)), MAX_FLAVOR_LEN, TRUE) + if(!input) + return + . = prefs.update_preference(src, input) + return . + +/datum/preference/text/flavor_text/apply_to_human(mob/living/carbon/human/target, value) + target.examine_text = value diff --git a/code/modules/client/preferences/glasses.dm b/code/modules/client/preferences/glasses.dm index 488225cf7a86..9ef8174e0f26 100644 --- a/code/modules/client/preferences/glasses.dm +++ b/code/modules/client/preferences/glasses.dm @@ -1,6 +1,8 @@ /datum/preference/choiced/glasses + explanation = "Glasses" savefile_key = "glasses" savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_QUIRKS /datum/preference/choiced/glasses/init_possible_values() return GLOB.nearsighted_glasses diff --git a/code/modules/client/preferences/glasses_color.dm b/code/modules/client/preferences/glasses_color.dm new file mode 100644 index 000000000000..d78897a3838d --- /dev/null +++ b/code/modules/client/preferences/glasses_color.dm @@ -0,0 +1,12 @@ +/// Whether or not to toggle ambient occlusion, the shadows around people +/datum/preference/toggle/glasses_color + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "glasses_color" + savefile_identifier = PREFERENCE_PLAYER + default_value = FALSE + +/datum/preference/toggle/glasses_color/apply_to_client(client/client, value) + if(ishuman(client.mob)) + var/mob/living/carbon/human/H = client.mob + if(H.glasses) + H.update_glasses_color(H.glasses, TRUE) diff --git a/code/modules/client/preferences/heterochromatic.dm b/code/modules/client/preferences/heterochromatic.dm index 7d7d42dea515..6bb5fa620037 100644 --- a/code/modules/client/preferences/heterochromatic.dm +++ b/code/modules/client/preferences/heterochromatic.dm @@ -1,12 +1,14 @@ /datum/preference/color/heterochromatic + explanation = "Heterochromia" savefile_key = "heterochromia" savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_QUIRKS /datum/preference/color/heterochromatic/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE - return "Heterochromia" in preferences.read_preference(/datum/preference/blob/quirks) + return "Heterochromia Iridum" in preferences.read_preference(/datum/preference/blob/quirks) /datum/preference/color/heterochromatic/apply_to_human(mob/living/carbon/human/target, value) for(var/datum/quirk/heterochromatic/hetero_quirk in target.quirks) diff --git a/code/modules/client/preferences/hotkeys.dm b/code/modules/client/preferences/hotkeys.dm index b96b68286d60..e53819b338be 100644 --- a/code/modules/client/preferences/hotkeys.dm +++ b/code/modules/client/preferences/hotkeys.dm @@ -5,3 +5,10 @@ /datum/preference/toggle/hotkeys/apply_to_client(client/client, value) client.hotkeys = value + if(SSinput.initialized) + client.set_macros() //They've changed their preferences, We need to rewrite the macro set again. + +/datum/preference/toggle/hotkeys_silence + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "hotkeys_silence" + savefile_identifier = PREFERENCE_PLAYER diff --git a/code/modules/client/preferences/html_prefs/categories/antagonists.dm b/code/modules/client/preferences/html_prefs/categories/antagonists.dm index c0d3ee2ab568..8449d5599c17 100644 --- a/code/modules/client/preferences/html_prefs/categories/antagonists.dm +++ b/code/modules/client/preferences/html_prefs/categories/antagonists.dm @@ -25,14 +25,23 @@ [button_element(prefs, "Select All", "pref_act=[/datum/preference/blob/antagonists];select_all=1")] [button_element(prefs, "Deselect All", "pref_act=[/datum/preference/blob/antagonists];deselect_all=1")] -
    [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""]
    +
    "} - var/list/client_antags = prefs.read_preference(/datum/preference/blob/antagonists) + var/list/client_antags = sort_list(prefs.read_preference(/datum/preference/blob/antagonists)) + + var/i = 0 + var/background_color = "#7c5500" for(var/antagonist in client_antags) + i++ + background_color = i %% 2 ? "#7c5500" : "#533200" . += {" -
    - - +
    +
    + [antagonist] +
    +
    + [button_element(prefs, client_antags[antagonist] ? "ENABLED" : "DISABLED", "pref_act=[/datum/preference/blob/antagonists];toggle_antag=[antagonist]", style = "margin-right: 0.5em")] +
    +
    "} - . += "
    [antagonist] - [button_element(prefs, client_antags[antagonist] ? "ENABLED" : "DISABLED", "pref_act=[/datum/preference/blob/antagonists];toggle_antag=[antagonist]")]
    " + . += "
" diff --git a/code/modules/client/preferences/html_prefs/categories/augments.dm b/code/modules/client/preferences/html_prefs/categories/augments.dm new file mode 100644 index 000000000000..64c30be394f1 --- /dev/null +++ b/code/modules/client/preferences/html_prefs/categories/augments.dm @@ -0,0 +1,71 @@ +/datum/preference_group/category/augments + name = "Augments" + +/datum/preference_group/category/augments/get_content(datum/preferences/prefs) + . = ..() + var/list/user_augs = prefs.read_preference(/datum/preference/blob/augments) + + for(var/category in GLOB.augment_categories_to_slots - AUGMENT_CATEGORY_IMPLANTS) + . += {" +
+ + [category] + + + + + "} + + for(var/slot in GLOB.augment_categories_to_slots[category]) + if(isnull(user_augs[slot])) + continue + + var/datum/augment_item/augment = GLOB.augment_items[user_augs[slot]] + if(!augment) + continue + + . += {" + + + + + "} + + . += "
[button_element(prefs, "Add Augment", "pref_act=/datum/preference/blob/augments;add_augment=[category]")]
+ [augment.name] [augment.slot] + + [button_element(prefs, "Switch Augment", "pref_act=/datum/preference/blob/augments;switch_augment=[slot]")] + [button_element(prefs, "Remove Augment", "pref_act=/datum/preference/blob/augments;remove_augment=[slot]")] +
" + + // Special handling for implants :) + if(!length(get_species_augments(prefs.read_preference(/datum/preference/choiced/species))?[AUGMENT_CATEGORY_IMPLANTS]?[AUGMENT_SLOT_IMPLANTS])) + return + + . += {" +
+ + Implants + + + + + "} + + for(var/path in user_augs[AUGMENT_SLOT_IMPLANTS]) + var/datum/augment_item/implant = GLOB.augment_items[path] + if(!implant) + continue + . += {" + + + + + "} + + . += "
[button_element(prefs, "Add Implant", "pref_act=/datum/preference/blob/augments;add_implant=1")]
+ [implant.name] + + [button_element(prefs, "Modify Implant", "pref_act=/datum/preference/blob/augments;modify_implant=[implant.type]")] + [button_element(prefs, "Remove Implant", "pref_act=/datum/preference/blob/augments;remove_implant=[implant.type]")] +
" diff --git a/code/modules/client/preferences/html_prefs/categories/general.dm b/code/modules/client/preferences/html_prefs/categories/general.dm index 3c53ad0157e7..baa7d33e6d60 100644 --- a/code/modules/client/preferences/html_prefs/categories/general.dm +++ b/code/modules/client/preferences/html_prefs/categories/general.dm @@ -8,6 +8,8 @@ /datum/preference_group/job_specific, /datum/preference_group/appearance_mods, /datum/preference_group/meta, + /datum/preference_group/quirks, + /datum/preference_group/ipc_shackles, ) /datum/preference_group/category/general/get_content(datum/preferences/prefs) diff --git a/code/modules/client/preferences/html_prefs/categories/languages.dm b/code/modules/client/preferences/html_prefs/categories/languages.dm new file mode 100644 index 000000000000..3332a17aa44e --- /dev/null +++ b/code/modules/client/preferences/html_prefs/categories/languages.dm @@ -0,0 +1,105 @@ +/datum/preference_group/category/languages + name = "Languages" + priority = 1 + +/datum/preference_group/category/languages/get_header(datum/preferences/prefs) + . = ..() + + var/datum/preference/blob/languages/P = GLOB.preference_entries[/datum/preference/blob/languages] + var/points = 3 - P.tally_points(prefs.read_preference(/datum/preference/blob/languages)) + . += {" +
+ + Balance +
+ [points] Points +
+
+
+ "} + +/datum/preference_group/category/languages/get_content(datum/preferences/prefs) + . = ..() + var/datum/preference/blob/languages/P = GLOB.preference_entries[/datum/preference/blob/languages] + + var/list/all_languages = GLOB.preference_language_types + var/list/user_languages = prefs.read_preference(P.type) + var/list/datum/language/innate_languages = get_species_constant_data(prefs.read_preference(/datum/preference/choiced/species))[SPECIES_DATA_LANGUAGES] + var/remaining_points = 3 - P.tally_points(user_languages) + var/afford_speak = remaining_points >= 2 + var/afford_understand = remaining_points >= 1 + + + . += {" +
+ + All Languages + I'm gettin' quirked up tonight. + +
+ "} + + + for(var/datum/language/language_path as anything in all_languages - innate_languages - user_languages) + var/can_understand = initial(language_path.flags) & LANGUAGE_SELECTABLE_UNDERSTAND + var/can_speak = initial(language_path.flags) & LANGUAGE_SELECTABLE_SPEAK + + . += {" +
+ [initial(language_path.name)] - [button_element(prefs, "?", "pref_act=[P.type];info=[language_path]")] - + [can_speak && afford_speak ? button_element(prefs, "SPEAK", "pref_act=[P.type];set_speak=[language_path]") : "SPEAK"] - + [can_understand && afford_understand ? button_element(prefs, "UNDERSTAND", "pref_act=[P.type];set_understand=[language_path]") : "UNDERSTAND"] +
+ "} + + + . += "
" + + . += {" +
+ + Known Languages + I'm gettin' quirked up tonight. + +
+ "} + + for(var/datum/language/innate_language as anything in innate_languages) + . += {" +
+ [initial(innate_language.name)] - INNATE +
+ [initial(innate_language.desc)] +
+ "} + + for(var/datum/language/language_path as anything in user_languages) + var/language_value = user_languages[language_path] + var/speak_button + + if(language_value & LANGUAGE_SPEAK) + speak_button = button_element(prefs, "SPEAK", "pref_act=[P.type];set_speak=[language_path]", "linkOn") + else if(remaining_points && (initial(language_path.flags) & LANGUAGE_SELECTABLE_SPEAK)) + speak_button = button_element(prefs, "SPEAK", "pref_act=[P.type];set_speak=[language_path]") + else + speak_button = "SPEAK" + + var/understand_button + if(language_value & LANGUAGE_UNDERSTAND) + understand_button = button_element(prefs, "UNDERSTAND", "pref_act=[P.type];set_understand=[language_path]", "linkOn") + else + understand_button = "UNDERSTAND" + + + . += {" +
+ [initial(language_path.name)] - + [button_element(prefs, "REMOVE", "pref_act=[P.type];remove=[language_path]")] - + [speak_button] - + [understand_button] +
+ [initial(language_path.desc)] +
+ "} + + . += "
" diff --git a/code/modules/client/preferences/html_prefs/categories/loadout.dm b/code/modules/client/preferences/html_prefs/categories/loadout.dm index b3ff8541eb93..55b1e795ad61 100644 --- a/code/modules/client/preferences/html_prefs/categories/loadout.dm +++ b/code/modules/client/preferences/html_prefs/categories/loadout.dm @@ -127,7 +127,7 @@ color_button += "
" if(length(loadout_item.restricted_roles)) - restricted_to = "RESTRICTED: [english_list(restricted_to)]
" + restricted_to = "RESTRICTED: [english_list(loadout_item.restricted_roles)]
" if(loadout_entry || prefs.can_purchase_loadout_item(loadout_item)) //We have this item purchased, but we can sell it item_button = button_element(prefs, displayed_name, "pref_act=[/datum/preference/blob/loadout];change_loadout=1;item=[loadout_item.type];") diff --git a/code/modules/client/preferences/html_prefs/categories/occupation.dm b/code/modules/client/preferences/html_prefs/categories/occupation.dm index 5ae8fa970e2a..fbef7c5b309d 100644 --- a/code/modules/client/preferences/html_prefs/categories/occupation.dm +++ b/code/modules/client/preferences/html_prefs/categories/occupation.dm @@ -1,4 +1,4 @@ -#define JOBS_PER_COLUMN 17 +#define JOBS_PER_COLUMN 15 /datum/preference_group/category/occupation name = "Occupation" @@ -44,9 +44,15 @@ var/employer = prefs.read_preference(/datum/preference/choiced/employer) employer = SSjob.GetEmployer(employer).type - . += {" + var/datum/preference/choiced/employer/employer_pref = GLOB.preference_entries[/datum/preference/choiced/employer] + var/info_button = button_element(prefs, "?", "pref_act=[/datum/preference/choiced/employer];info=1") -
[GLOB.preference_entries[/datum/preference/choiced/employer]:get_button(prefs)]
+ . += {" +
+
Faction
+
[employer_pref.get_button(prefs)][info_button]
+

+
"} // Table within a table for alignment, also allows you to easily add more columns. . += {" @@ -72,7 +78,7 @@ else if(is_too_new) rejection_reason = "\[[is_too_new]]" else if(length(job.employers) && !(employer in job.employers)) - rejection_reason = "\[INVALID EMPLOYER]" + rejection_reason = "\[CHANGE FACTION]" var/static/vs_appeaser = "\]\]\]" vs_appeaser = vs_appeaser diff --git a/code/modules/client/preferences/html_prefs/categories/quirks.dm b/code/modules/client/preferences/html_prefs/categories/quirks.dm index 6f14b7549965..96c8fffe82d0 100644 --- a/code/modules/client/preferences/html_prefs/categories/quirks.dm +++ b/code/modules/client/preferences/html_prefs/categories/quirks.dm @@ -1,27 +1,7 @@ /datum/preference_group/category/quirks - name = "Quirks" + name = "Traits" priority = 1 - var/list/associated_prefs = list( - "Nearsighted" = /datum/preference/choiced/glasses, - "Heterochromia" = /datum/preference/color/heterochromatic - ) - -/datum/preference_group/category/quirks/get_header(datum/preferences/prefs) - . = ..() - var/datum/preference/blob/quirks/P = GLOB.preference_entries[/datum/preference/blob/quirks] - var/balance = P.GetQuirkBalance(prefs.read_preference(P.type)) - . += {" -
- - Balance -
- [balance] Points -
-
-
- "} - /datum/preference_group/category/quirks/get_content(datum/preferences/prefs) . = ..() var/datum/preference/P = GLOB.preference_entries[/datum/preference/blob/quirks] @@ -33,58 +13,53 @@ var/datum/quirk/quirk = all_quirks[quirk_name] quirk_info[quirk_name] = list( "description" = initial(quirk.desc), - "icon" = initial(quirk.icon), "name" = quirk_name, - "value" = initial(quirk.value), - "mood" = initial(quirk.mood_quirk) ) . += {" +
- All Quirks + All Traits I'm gettin' quirked up tonight. - +
"} for(var/quirk in all_quirks) - if(quirk in user_quirks || (quirk_info[quirk]["mood"] && CONFIG_GET(flag/disable_human_mood))) + if(quirk in user_quirks) continue - var/quirk_type ="Neuteral" - if(quirk_info[quirk]["value"]) - quirk_type = quirk_info[quirk]["value"] > 0 ? "Positive" : "Negative" . += {" -
- - + [clickable_element("div", "flexItem flexRow highlighter", "justify-content: space-between;", prefs, "pref_act=[P.type];toggle_quirk=[quirk]")] + + [quirk] + + + [button_element(prefs, "?", "pref_act=[P.type];info=[quirk]")] + + "} - . += "
- [button_element(prefs, "[quirk] ([quirk_info[quirk]["value"]] pts)", "pref_act=[P.type];toggle_quirk=[quirk]")] - [button_element(prefs, "?", "pref_act=[P.type];info=[quirk]")] - [quirk_type] -
" + . += "
" . += {"
- Owned Quirks + My Traits I'm gettin' quirked up tonight. - +
"} for(var/quirk in user_quirks) . += {" -
- - + [clickable_element("div", "flexItem highlighter", "", prefs, "pref_act=[P.type];toggle_quirk=[quirk]")] + [quirk] +
+ [quirk_info[quirk]["description"]] + "} - . += "
- [quirk] - - [button_element(prefs, "REMOVE ([quirk_info[quirk]["value"] * -1] pts)", "pref_act=[P.type];toggle_quirk=[quirk]")] -
- [quirk_info[quirk]["description"]] -
" + . += "
" diff --git a/code/modules/client/preferences/html_prefs/helpers.dm b/code/modules/client/preferences/html_prefs/helpers.dm index bc8dd2c9662d..290877d700c8 100644 --- a/code/modules/client/preferences/html_prefs/helpers.dm +++ b/code/modules/client/preferences/html_prefs/helpers.dm @@ -1,9 +1,2 @@ - -/proc/button_element(trg, text, action, class, style) - return "[text]" - -/proc/color_button_element(trg, color, action) - return "" - /datum/preferences/proc/update_html() usr << output(url_encode(html_create_window()), "preferences_window.preferences_browser:update_content") diff --git a/code/modules/client/preferences/html_prefs/main_window.dm b/code/modules/client/preferences/html_prefs/main_window.dm index 47c782dd059a..69ace0a13a8f 100644 --- a/code/modules/client/preferences/html_prefs/main_window.dm +++ b/code/modules/client/preferences/html_prefs/main_window.dm @@ -66,7 +66,7 @@ "} winshow(user, "preferences_window", TRUE) - var/datum/browser/popup = new(user, "preferences_window", "
Character Setup
", 640, 770) + var/datum/browser/popup = new(user, "preferences_window", "
Character Setup
", 1200, 800) popup.set_content(content) popup.open(FALSE) onclose(user, "preferences_window", src) diff --git a/code/modules/client/preferences/html_prefs/modules/body.dm b/code/modules/client/preferences/html_prefs/modules/body.dm index 4d31eb587c72..4876eb012f43 100644 --- a/code/modules/client/preferences/html_prefs/modules/body.dm +++ b/code/modules/client/preferences/html_prefs/modules/body.dm @@ -6,6 +6,7 @@ /datum/preference/choiced/gender, /datum/preference/choiced/body_type = TRUE, /datum/preference/choiced/species, + /datum/preference/text/flavor_text, ) var/list/clothing = list( diff --git a/code/modules/client/preferences/html_prefs/modules/ipc_shackles.dm b/code/modules/client/preferences/html_prefs/modules/ipc_shackles.dm new file mode 100644 index 000000000000..57ada17b9f65 --- /dev/null +++ b/code/modules/client/preferences/html_prefs/modules/ipc_shackles.dm @@ -0,0 +1,48 @@ +/datum/preference_group/ipc_shackles + +/datum/preference_group/ipc_shackles/should_display(datum/preferences/prefs) + if(!ispath(prefs.read_preference(/datum/preference/choiced/species), /datum/species/ipc)) + return FALSE + return TRUE + +/datum/preference_group/ipc_shackles/get_content(datum/preferences/prefs) + . = ..() + . += {" +
+ + Shackles + The chains that bind. + + + "} + + var/shackle_set = prefs.read_preference(/datum/preference/choiced/ipc_shackles) + + if(!shackle_set) + . += {" + + + + "} + else + . += {" + + + + "} + var/iter = 1 + var/datum/ai_laws/law_list = get_shackle_laws()[shackle_set] + for(var/law in law_list?.inherent) + . += {" + + + + + "} + iter++ + + . += "
[button_element(prefs, "Unshackled", "pref_act=[/datum/preference/choiced/ipc_shackles]")]
[button_element(prefs, shackle_set, "pref_act=[/datum/preference/choiced/ipc_shackles]")]
+ [iter]. + + [law] +
" diff --git a/code/modules/client/preferences/html_prefs/modules/meta.dm b/code/modules/client/preferences/html_prefs/modules/meta.dm index 7cb29a6c0ae2..6e42f05c1189 100644 --- a/code/modules/client/preferences/html_prefs/modules/meta.dm +++ b/code/modules/client/preferences/html_prefs/modules/meta.dm @@ -1,8 +1,8 @@ /datum/preference_group/meta var/list/datum/display = list( /datum/preference/name/religion, + /datum/preference/name/deity, /datum/preference/name/bible, - /datum/preference/choiced/security_department, /datum/preference/choiced/uplink_location, /datum/preference/choiced/loadout_override_preference ) diff --git a/code/modules/client/preferences/html_prefs/modules/occupational.dm b/code/modules/client/preferences/html_prefs/modules/occupational.dm index 5a1172d9be68..a651eee5b873 100644 --- a/code/modules/client/preferences/html_prefs/modules/occupational.dm +++ b/code/modules/client/preferences/html_prefs/modules/occupational.dm @@ -3,7 +3,6 @@ var/list/datum/display = list( /datum/preference/name/backup_human, /datum/preference/name/clown, - /datum/preference/name/mime, /datum/preference/name/cyborg, /datum/preference/name/ai, ) diff --git a/code/modules/client/preferences/html_prefs/modules/quirks.dm b/code/modules/client/preferences/html_prefs/modules/quirks.dm new file mode 100644 index 000000000000..69d478310140 --- /dev/null +++ b/code/modules/client/preferences/html_prefs/modules/quirks.dm @@ -0,0 +1,39 @@ +/datum/preference_group/quirks + var/list/quirk_prefs = list( + "Nearsighted" = /datum/preference/choiced/glasses, + "Heterochromia Iridum" = /datum/preference/color/heterochromatic, + "Phobia" = /datum/preference/choiced/phobia + ) + +/datum/preference_group/quirks/should_display(datum/preferences/prefs) + var/list/user_quirks = prefs.read_preference(/datum/preference/blob/quirks) + return length(quirk_prefs & user_quirks) + + +/datum/preference_group/quirks/get_content(datum/preferences/prefs) + . = ..() + . += {" +
+ + Traits + Getting a little quirky. + + + "} + + var/list/user_quirks = prefs.read_preference(/datum/preference/blob/quirks) + for(var/quirk_name in user_quirks) + var/datum/preference/associated_pref = quirk_prefs[quirk_name] + if(!associated_pref) + continue + + associated_pref = GLOB.preference_entries[associated_pref] + + . += {" + + + + + "} + + . += "
[associated_pref.explanation][associated_pref.get_button(prefs)]
" diff --git a/code/modules/client/preferences/html_prefs/preference_group.dm b/code/modules/client/preferences/html_prefs/preference_group.dm index 50a0ac4b193e..9803e144d0cf 100644 --- a/code/modules/client/preferences/html_prefs/preference_group.dm +++ b/code/modules/client/preferences/html_prefs/preference_group.dm @@ -1,9 +1,9 @@ /datum/preference_group + abstract_type = /datum/preference_group var/name = "" /// Sort priority in the UI. Used to do things like place general before other categories. var/priority = 1 - var/abstract_type = /datum/preference_group ///Return a list of html data to be joined into a string diff --git a/code/modules/client/preferences/languages.dm b/code/modules/client/preferences/languages.dm new file mode 100644 index 000000000000..a2e2d1598f53 --- /dev/null +++ b/code/modules/client/preferences/languages.dm @@ -0,0 +1,87 @@ +/datum/preference/blob/languages + priority = PREFERENCE_PRIORITY_APPEARANCE_MODS //run after everything mostly + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "languages" + +/datum/preference/blob/languages/deserialize(input, datum/preferences/preferences) + if(!islist(input)) + return create_default_value() + + input &= GLOB.preference_language_types + + if(!check_legality(input)) + return create_default_value() + + return input + +/datum/preference/blob/languages/create_default_value() + return list() + +/datum/preference/blob/languages/apply_to_human(mob/living/carbon/human/target, value) + for(var/datum/language/path as anything in value) + var/language_flags = value[path] + target.grant_language(path, language_flags & LANGUAGE_UNDERSTAND, language_flags & LANGUAGE_SPEAK, LANGUAGE_MIND) + +/datum/preference/blob/languages/user_edit(mob/user, datum/preferences/prefs, list/params) + if(params["info"]) + var/datum/language/L = GET_LANGUAGE_DATUM(text2path(params["info"])) + if(!L) + return + var/datum/browser/window = new(usr, "LanguageInfo", L.name, 400, 120) + window.set_content(L.desc) + window.open() + return FALSE + + if(params["remove"]) + var/language_path = text2path(params["remove"]) + var/list/user_languages = prefs.read_preference(type) + user_languages -= language_path + return prefs.update_preference(src, user_languages) + + if(params["set_speak"]) + var/language_path = text2path(params["set_speak"]) + var/list/user_languages = prefs.read_preference(type) + + var/value = user_languages[language_path] + if(value & LANGUAGE_SPEAK) + value &= ~(LANGUAGE_SPEAK) + else + value |= (LANGUAGE_UNDERSTAND|LANGUAGE_SPEAK) + + if(value == NONE) + user_languages -= language_path + else + user_languages[language_path] = value + + return prefs.update_preference(src, user_languages) + + if(params["set_understand"]) + var/language_path = text2path(params["set_understand"]) + var/list/user_languages = prefs.read_preference(type) + + var/value = user_languages[language_path] + if(value & LANGUAGE_UNDERSTAND) + value = NONE + else + value |= LANGUAGE_UNDERSTAND + + if(value == NONE) + user_languages -= language_path + else + user_languages[language_path] = value + + return prefs.update_preference(src, user_languages) + +/datum/preference/blob/languages/proc/tally_points(list/languages) + var/point_tally = 0 + for(var/datum/language/path as anything in languages) + var/value = languages[path] + if(value & LANGUAGE_SPEAK) + point_tally++ + if(value & LANGUAGE_UNDERSTAND) + point_tally++ + + return point_tally + +/datum/preference/blob/languages/proc/check_legality(list/languages) + return tally_points(languages) <= 3 diff --git a/code/modules/client/preferences/loadout/loadout.dm b/code/modules/client/preferences/loadout/loadout.dm index a27b97171897..babaac3c9394 100644 --- a/code/modules/client/preferences/loadout/loadout.dm +++ b/code/modules/client/preferences/loadout/loadout.dm @@ -2,7 +2,7 @@ savefile_identifier = PREFERENCE_CHARACTER savefile_key = "nu_loadout" -/datum/preference/blob/loadout/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/blob/loadout/apply_to_human(mob/living/carbon/human/target, value) return //We handle this in job code. /datum/preference/blob/loadout/create_default_value() diff --git a/code/modules/client/preferences/loadout/loadout_item/backpack.dm b/code/modules/client/preferences/loadout/loadout_item/backpack.dm index eae0a316ff29..07984e00ae0a 100644 --- a/code/modules/client/preferences/loadout/loadout_item/backpack.dm +++ b/code/modules/client/preferences/loadout/loadout_item/backpack.dm @@ -28,9 +28,6 @@ /datum/loadout_item/backpack/cigarettes path = /obj/item/storage/fancy/cigarettes -/datum/loadout_item/backpack/wallet - path = /obj/item/storage/wallet - /datum/loadout_item/backpack/flask path = /obj/item/reagent_containers/food/drinks/flask cost = 2 @@ -38,9 +35,58 @@ /datum/loadout_item/backpack/skub path = /obj/item/skub +/datum/loadout_item/backpack/lipstick + path = /obj/item/lipstick + customization_flags = CUSTOMIZE_NAME_DESC + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_FRAGRANCE + +/datum/loadout_item/backpack/lipstick_purple + path = /obj/item/lipstick/purple + customization_flags = CUSTOMIZE_NAME_DESC + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_FRAGRANCE + +/datum/loadout_item/backpack/lipstick_jade + path = /obj/item/lipstick/jade + customization_flags = CUSTOMIZE_NAME_DESC + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_FRAGRANCE + +/datum/loadout_item/backpack/lipstick_black + path = /obj/item/lipstick/black + customization_flags = CUSTOMIZE_NAME_DESC + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_FRAGRANCE + +/datum/loadout_item/backpack/lipstick_random + path = /obj/item/lipstick/random + customization_flags = CUSTOMIZE_NAME_DESC + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_FRAGRANCE + +/datum/loadout_item/backpack/lizard_plushie + path = /obj/item/toy/plush/lizard_plushie + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_TOYS + +/datum/loadout_item/backpack/bee_plushie + path = /obj/item/toy/plush/beeplushie + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_TOYS + +/datum/loadout_item/backpack/moth_plushie + path = /obj/item/toy/plush/moth + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_TOYS + +/datum/loadout_item/backpack/snake_plushie + path = /obj/item/toy/plush/snakeplushie + subcategory = LOADOUT_SUBCATEGORY_BACKPACK_TOYS + +/datum/loadout_item/backpack/music_beacon + path = /obj/item/choice_beacon/music + cost = 2 + /datum/loadout_item/backpack/multipen path = /obj/item/pen/fourcolor /datum/loadout_item/backpack/fountainpen path = /obj/item/pen/fountain cost = 2 + +/datum/loadout_item/backpack/skateboard + path = /obj/item/melee/skateboard + cost = 2 diff --git a/code/modules/client/preferences/loadout/loadout_item/head.dm b/code/modules/client/preferences/loadout/loadout_item/head.dm index 060c39eeef1b..74b99710ca2d 100644 --- a/code/modules/client/preferences/loadout/loadout_item/head.dm +++ b/code/modules/client/preferences/loadout/loadout_item/head.dm @@ -78,3 +78,6 @@ /datum/loadout_item/head/cone path = /obj/item/clothing/head/cone cost = 2 + +/datum/loadout_item/head/delinquent + path = /obj/item/clothing/head/delinquent diff --git a/code/modules/client/preferences/loadout/loadout_item/mask.dm b/code/modules/client/preferences/loadout/loadout_item/mask.dm index 408ff275c1c1..00c152a945ad 100644 --- a/code/modules/client/preferences/loadout/loadout_item/mask.dm +++ b/code/modules/client/preferences/loadout/loadout_item/mask.dm @@ -34,3 +34,10 @@ /datum/loadout_item/mask/bandana_skull path = /obj/item/clothing/mask/bandana/skull +/datum/loadout_item/mask/breath_mask + path = /obj/item/clothing/mask/breath + +/datum/loadout_item/mask/breath_mask_vox + path = /obj/item/clothing/mask/breath/vox + + diff --git a/code/modules/client/preferences/loadout/loadout_item/neck.dm b/code/modules/client/preferences/loadout/loadout_item/neck.dm index 03116ce6a80c..f5267f1bf0d5 100644 --- a/code/modules/client/preferences/loadout/loadout_item/neck.dm +++ b/code/modules/client/preferences/loadout/loadout_item/neck.dm @@ -3,7 +3,7 @@ //MISC /datum/loadout_item/neck/headphones - path = /obj/item/clothing/ears/headphones + path = /obj/item/instrument/piano_synth/headphones /datum/loadout_item/neck/insert_path_into_outfit(datum/outfit/outfit, mob/living/carbon/human/equipper, visuals_only = FALSE) . = outfit.neck diff --git a/code/modules/client/preferences/loadout/loadout_item/shoes.dm b/code/modules/client/preferences/loadout/loadout_item/shoes.dm index e64de51920e7..794efc48d283 100644 --- a/code/modules/client/preferences/loadout/loadout_item/shoes.dm +++ b/code/modules/client/preferences/loadout/loadout_item/shoes.dm @@ -57,3 +57,15 @@ /datum/loadout_item/shoes/yellowsinger path = /obj/item/clothing/shoes/singery + +/datum/loadout_item/shoes/swag + path = /obj/item/clothing/shoes/swagshoes + cost = 4 + +/datum/loadout_item/shoes/wheelys + path = /obj/item/clothing/shoes/wheelys + cost = 4 + +/datum/loadout_item/shoes/rollerskates + path = /obj/item/clothing/shoes/wheelys/rollerskates + cost = 3 diff --git a/code/modules/client/preferences/loadout/loadout_item/undersuit.dm b/code/modules/client/preferences/loadout/loadout_item/undersuit.dm index 132aee5cb5ea..66ec1fed9388 100644 --- a/code/modules/client/preferences/loadout/loadout_item/undersuit.dm +++ b/code/modules/client/preferences/loadout/loadout_item/undersuit.dm @@ -32,6 +32,10 @@ /datum/loadout_item/uniform/kilt path = /obj/item/clothing/under/costume/kilt +/datum/loadout_item/uniform/swag + path = /obj/item/clothing/under/costume/swagoutfit + cost = 4 + //SUITS /datum/loadout_item/uniform/suit subcategory = LOADOUT_SUBCATEGORY_UNIFORM_SUITS diff --git a/code/modules/client/preferences/loadout_override.dm b/code/modules/client/preferences/loadout_override.dm index 559230f01810..d77bfae767a1 100644 --- a/code/modules/client/preferences/loadout_override.dm +++ b/code/modules/client/preferences/loadout_override.dm @@ -10,5 +10,5 @@ /datum/preference/choiced/loadout_override_preference/create_default_value() return LOADOUT_OVERRIDE_BACKPACK -/datum/preference/choiced/loadout_override_preference/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/loadout_override_preference/apply_to_human(mob/living/carbon/human/target, value) return TRUE diff --git a/code/modules/client/preferences/middleware/keybindings.dm b/code/modules/client/preferences/middleware/keybindings.dm index 04ef6f163e9a..04eacd5e5795 100644 --- a/code/modules/client/preferences/middleware/keybindings.dm +++ b/code/modules/client/preferences/middleware/keybindings.dm @@ -24,6 +24,7 @@ preferences.key_bindings = deep_copy_list(GLOB.default_hotkeys) preferences.key_bindings_by_key = preferences.get_key_bindings_by_key(preferences.key_bindings) preferences.update_static_data(user) + preferences.parent.set_macros() return TRUE diff --git a/code/modules/client/preferences/middleware/legacy_toggles.dm b/code/modules/client/preferences/middleware/legacy_toggles.dm index e35832e54344..7d74c02e613c 100644 --- a/code/modules/client/preferences/middleware/legacy_toggles.dm +++ b/code/modules/client/preferences/middleware/legacy_toggles.dm @@ -118,6 +118,8 @@ else user.stop_sound_channel(CHANNEL_LOBBYMUSIC) + if(legacy_flag == SOUND_SHIP_AMBIENCE) + user.refresh_looping_ambience() return TRUE var/legacy_chat_flag = legacy_chat_toggles[preference] diff --git a/code/modules/client/preferences/migrations/body_type_migration.dm b/code/modules/client/preferences/migrations/body_type_migration.dm deleted file mode 100644 index df599fd9aea6..000000000000 --- a/code/modules/client/preferences/migrations/body_type_migration.dm +++ /dev/null @@ -1,10 +0,0 @@ -/// Previously, body types could only be used on non-binary characters. -/// PR #62733 changed this to allow all characters to use body type. -/// This migration moves binary-gendered characters over to the "use gender" body type -/// so that old characters are preserved. -/datum/preferences/proc/migrate_body_types(savefile/savefile) - var/current_gender - - READ_FILE(savefile["gender"], current_gender) - if (current_gender == MALE || current_gender == FEMALE) - WRITE_FILE(savefile["body_type"], "Use gender") diff --git a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm b/code/modules/client/preferences/migrations/tgui_prefs_migration.dm deleted file mode 100644 index bc3c81a0d6be..000000000000 --- a/code/modules/client/preferences/migrations/tgui_prefs_migration.dm +++ /dev/null @@ -1,26 +0,0 @@ -/// Handle the migrations necessary from pre-tgui prefs to post-tgui prefs -/datum/preferences/proc/migrate_preferences_to_tgui_prefs_menu() - migrate_key_bindings() - -// Key bindings used to be "key" -> list("action"), -// such as "X" -> list("swap_hands"). -// This made it impossible to determine any order, meaning placing a new -// hotkey would produce non-deterministic order. -// tgui prefs menu moves this over to "swap_hands" -> list("X"). -/datum/preferences/proc/migrate_key_bindings() - var/new_key_bindings = list() - - for (var/unbound_hotkey in key_bindings["Unbound"]) - new_key_bindings[unbound_hotkey] = list() - - for (var/hotkey in key_bindings) - if (hotkey == "Unbound") - continue - - for (var/keybind in key_bindings[hotkey]) - if (keybind in new_key_bindings) - new_key_bindings[keybind] |= hotkey - else - new_key_bindings[keybind] = list(hotkey) - - key_bindings = new_key_bindings diff --git a/code/modules/client/preferences/monochrome_ghost.dm b/code/modules/client/preferences/monochrome_ghost.dm new file mode 100644 index 000000000000..9bd55927b6d9 --- /dev/null +++ b/code/modules/client/preferences/monochrome_ghost.dm @@ -0,0 +1,18 @@ +/datum/preference/toggle/monochrome_ghost + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "monochrome_ghost" + savefile_identifier = PREFERENCE_PLAYER + + default_value = TRUE + +/datum/preference/toggle/monochrome_ghost/apply_to_client(client/client, value) + var/mob/dead/observer/M = client.mob + if(!istype(M)) + return + + if(value && !M.started_as_observer) + if(locate(/datum/client_colour/ghostmono) in M.client_colours) + return + M.add_client_colour(/datum/client_colour/ghostmono) + else + M.remove_client_colour(/datum/client_colour/ghostmono) diff --git a/code/modules/client/preferences/names.dm b/code/modules/client/preferences/names.dm index b173888bff8f..5429cdbd062c 100644 --- a/code/modules/client/preferences/names.dm +++ b/code/modules/client/preferences/names.dm @@ -9,7 +9,7 @@ var/group /// Whether or not to allow numbers in the person's name - var/allow_numbers = FALSE + var/allow_numbers = TRUE /// If the highest priority job matches this, will prioritize this name in the UI var/relevant_job @@ -37,8 +37,8 @@ if(istype(user, /mob/dead/new_player)) var/mob/dead/new_player/player = user - player.new_player_panel() - + if(player.npp.active_tab == "game") + player.npp.change_tab("game") // Reload name return . /datum/preference/name/get_button(datum/preferences/prefs) @@ -52,8 +52,7 @@ savefile_key = "real_name" /datum/preference/name/real_name/apply_to_human(mob/living/carbon/human/target, value) - target.real_name = value - target.name = value + target.set_real_name(value) /datum/preference/name/real_name/create_informed_default_value(datum/preferences/preferences) var/species_type = preferences.read_preference(/datum/preference/choiced/species) @@ -91,23 +90,13 @@ /datum/preference/name/clown savefile_key = "clown_name" - explanation = "Clown Name" + explanation = "Entertainer Name" group = "fun" relevant_job = /datum/job/clown /datum/preference/name/clown/create_default_value() return pick(GLOB.clown_names) -/datum/preference/name/mime - savefile_key = "mime_name" - - explanation = "Mime Name" - group = "fun" - relevant_job = /datum/job/mime - -/datum/preference/name/mime/create_default_value() - return pick(GLOB.mime_names) - /datum/preference/name/cyborg savefile_key = "cyborg_name" diff --git a/code/modules/client/preferences/occupation.dm b/code/modules/client/preferences/occupation.dm index ebf96de4ef20..c257b1701f26 100644 --- a/code/modules/client/preferences/occupation.dm +++ b/code/modules/client/preferences/occupation.dm @@ -9,18 +9,41 @@ return /datum/preference/choiced/employer/create_default_value() - var/datum/employer/daedalus = /datum/employer/daedalus - return initial(daedalus.name) + return /datum/employer/none /datum/preference/choiced/employer/init_possible_values() - . = list() - for(var/datum/employer/E as anything in subtypesof(/datum/employer)) - . += initial(E.name) + return subtypesof(/datum/employer) /datum/preference/choiced/employer/value_changed(datum/preferences/prefs, new_value, old_value) var/datum/preference/P = GLOB.preference_entries[/datum/preference/blob/job_priority] prefs.update_preference(P, P.create_default_value()) +/datum/preference/choiced/employer/serialize(input) + var/datum/employer/path = input + return initial(path.name) + +/datum/preference/choiced/employer/deserialize(input, datum/preferences/preferences) + if(input in get_choices_serialized()) + return GLOB.employers_by_name[input] + + return create_default_value() + +/datum/preference/choiced/employer/create_default_value() + return /datum/employer/none + +/datum/preference/choiced/employer/button_act(mob/user, datum/preferences/prefs, list/params) + if(params["info"]) + var/datum/employer/employer = prefs.read_preference(type) + if(!employer) + return + + var/datum/browser/popup = new(user, "factioninfo", "[initial(employer.name)] ([initial(employer.short_name)])", 660, 270) + popup.set_content(initial(employer.creator_info)) + popup.open() + return FALSE + + return ..() + /// Associative list of job:integer, where integer is a priority between 1 and 4 /datum/preference/blob/job_priority savefile_identifier = PREFERENCE_CHARACTER @@ -29,7 +52,7 @@ /datum/preference/blob/job_priority/create_default_value() return list() -/datum/preference/blob/job_priority/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/blob/job_priority/apply_to_human(mob/living/carbon/human/target, value) return /datum/preference/blob/job_priority/deserialize(input, datum/preferences/preferences) @@ -40,10 +63,28 @@ if(!istext(thing)) input -= thing continue + if(!isnum(input[thing]) || !(input[thing] in list(1, 2, 3))) input -= thing + return input +/datum/preference/blob/job_priority/proc/can_play_job(datum/preferences/prefs, job_title) + var/datum/job/J = SSjob.GetJob(job_title) + if(!J) + return FALSE + + if(is_banned_from(prefs.parent.ckey, job_title)) + return FALSE + + if(J.required_playtime_remaining(prefs.parent)) + return FALSE + + if(!J.player_old_enough(prefs.parent)) + return FALSE + + return TRUE + /datum/preference/blob/job_priority/user_edit(mob/user, datum/preferences/prefs, list/params) var/datum/job/job = SSjob.GetJob(params["job"]) if(!job) @@ -52,6 +93,9 @@ if (job.faction != FACTION_STATION) return FALSE + if(!can_play_job(prefs, job.title)) + return FALSE + var/list/job_prefs = prefs.read_preference(type) var/list/choices = list("Never", "Low", "Medium", "High") var/level = tgui_input_list(usr, "Change Priority",, choices, choices[job_prefs[job] + 1]) diff --git a/code/modules/client/preferences/quirks.dm b/code/modules/client/preferences/quirks.dm index b488d2cf42b9..a21a71667e98 100644 --- a/code/modules/client/preferences/quirks.dm +++ b/code/modules/client/preferences/quirks.dm @@ -6,29 +6,13 @@ if(!islist(input)) return create_default_value() - SSquirks.filter_invalid_quirks(input) - - if(GetQuirkBalance(input) < 0) - return create_default_value() + input = SSquirks.filter_invalid_quirks(input) return input /datum/preference/blob/quirks/create_default_value() return list() -/datum/preference/blob/quirks/proc/GetQuirkBalance(list/all_quirks) - var/bal = 0 - for(var/V in all_quirks) - var/datum/quirk/T = SSquirks.quirks[V] - bal -= initial(T.value) - return bal - -/datum/preference/blob/quirks/proc/GetPositiveQuirkCount(list/all_quirks) - . = 0 - for(var/q in all_quirks) - if(SSquirks.quirk_points[q] > 0) - .++ - /datum/preference/blob/quirks/user_edit(mob/user, datum/preferences/prefs, list/params) if(params["info"]) var/datum/quirk/Q = SSquirks.quirks[params["info"]] @@ -45,8 +29,5 @@ if(quirk in user_quirks) user_quirks -= quirk else - if(!(GetQuirkBalance(user_quirks) >= SSquirks.quirk_points[quirk])) - to_chat(user, span_warning("You do not have enough points to take this quirk!")) - return FALSE user_quirks += quirk return prefs.update_preference(src, user_quirks) diff --git a/code/modules/client/preferences/ready_job.dm b/code/modules/client/preferences/ready_job.dm new file mode 100644 index 000000000000..32de2f9be237 --- /dev/null +++ b/code/modules/client/preferences/ready_job.dm @@ -0,0 +1,5 @@ +/datum/preference/toggle/ready_job + savefile_key = "ready_job" + savefile_identifier = PREFERENCE_PLAYER + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + default_value = TRUE diff --git a/code/modules/client/preferences/security_department.dm b/code/modules/client/preferences/security_department.dm deleted file mode 100644 index 807c01560c24..000000000000 --- a/code/modules/client/preferences/security_department.dm +++ /dev/null @@ -1,26 +0,0 @@ -/// Which department to put security officers in, when the config is enabled -/datum/preference/choiced/security_department - explanation = "Security Department" - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "prefered_security_department" - -// This is what that #warn wants you to remove :) -/datum/preference/choiced/security_department/deserialize(input, datum/preferences/preferences) - if (!(input in GLOB.security_depts_prefs)) - return SEC_DEPT_NONE - return ..(input, preferences) - -/datum/preference/choiced/security_department/init_possible_values() - return GLOB.security_depts_prefs - -/datum/preference/choiced/security_department/apply_to_human(mob/living/carbon/human/target, value) - return - -/datum/preference/choiced/security_department/create_default_value() - return SEC_DEPT_NONE - -/datum/preference/choiced/security_department/is_accessible(datum/preferences/preferences) - if (!..(preferences)) - return FALSE - - return !CONFIG_GET(flag/sec_start_brig) diff --git a/code/modules/client/preferences/species.dm b/code/modules/client/preferences/species.dm index 1fb086039b84..c1b2b3f8fc15 100644 --- a/code/modules/client/preferences/species.dm +++ b/code/modules/client/preferences/species.dm @@ -35,7 +35,7 @@ var/datum/species/S = prefs.read_preference(type) S = new S var/list/diet = S.get_species_diet() - var/list/perks = S.get_species_perks() + var/list/perks = get_species_constant_data(S.type)?[SPECIES_DATA_PERKS] var/list/content = list("
") content += S.get_species_description() content += {" diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index 165c9afe06af..2713b14dfe3b 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -67,6 +67,7 @@ savefile_identifier = PREFERENCE_CHARACTER savefile_key = "facial_hair_gradient" relevant_species_trait = FACEHAIR + sub_preference = /datum/preference/color/facial_hair_gradient /datum/preference/choiced/facial_hair_gradient/init_possible_values() return assoc_to_keys(GLOB.facial_hair_gradients_list) @@ -184,9 +185,17 @@ /datum/preference/color/sclera/create_default_value() return "#f8ef9e" -/datum/preference/color/sclera/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/color/sclera/apply_to_human(mob/living/carbon/human/target, value) target.sclera_color = value target.update_eyes() + +/datum/preference/color/mutcolor + abstract_type = /datum/preference/color/mutcolor + var/color_key = "" + +/datum/preference/color/mutcolor/apply_to_human(mob/living/carbon/human/target, value) + target.dna.mutant_colors["[color_key]_1"] = sanitize_hexcolor(value) + /datum/preference/tri_color abstract_type = /datum/preference/tri_color ///dna.features["mutcolors"][color_key] = input @@ -203,8 +212,8 @@ return islist(value) && value.len == 3 && (findtext(value[1], GLOB.is_color) && findtext(value[2], GLOB.is_color) && findtext(value[3], GLOB.is_color)) /datum/preference/tri_color/apply_to_human(mob/living/carbon/human/target, value) - if (type == abstract_type) - return ..() + if (isabstract(src)) + CRASH("`apply_to_human()` was called for abstract preference [type]") target.dna.mutant_colors["[color_key]_1"] = sanitize_hexcolor(value[1]) target.dna.mutant_colors["[color_key]_2"] = sanitize_hexcolor(value[2]) @@ -261,7 +270,7 @@ serialized_mods[serial_mod_data["path"]] = serial_mod_data return serialized_mods -/datum/preference/appearance_mods/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/appearance_mods/apply_to_human(mob/living/carbon/human/target, value) var/list/deserialized_mods = value if(!value) return diff --git a/code/modules/client/preferences/species_features/ipc.dm b/code/modules/client/preferences/species_features/ipc.dm new file mode 100644 index 000000000000..0802977678c4 --- /dev/null +++ b/code/modules/client/preferences/species_features/ipc.dm @@ -0,0 +1,139 @@ +#define NO_SHACKLES "None" +/datum/preference/choiced/ipc_shackles + explanation = "Shackle Laws" + savefile_key = "ipc_shackles" + requires_accessible = TRUE + savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_APPEARANCE_MODS //Lowest ever priority + +/datum/preference/choiced/ipc_shackles/is_accessible(datum/preferences/preferences) + . = ..() + return ispath(preferences.read_preference(/datum/preference/choiced/species), /datum/species/ipc) + +/datum/preference/choiced/ipc_shackles/init_possible_values() + return get_shackle_laws() + NO_SHACKLES + +/datum/preference/choiced/ipc_shackles/create_default_value() + return NO_SHACKLES + +/datum/preference/choiced/ipc_shackles/apply_to_human(mob/living/carbon/human/target, value) + if(value == NO_SHACKLES) + value = null + + var/obj/item/organ/posibrain/P = target.getorganslot(ORGAN_SLOT_POSIBRAIN) + if(!P) + return + P.set_shackles(value) + +/datum/preference/choiced/ipc_screen + explanation = "Screen" + savefile_key = "ipc_screen" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/ipc_screen + +/datum/preference/choiced/ipc_screen/init_possible_values() + return GLOB.ipc_screens_list + +/datum/preference/choiced/ipc_screen/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["ipc_screen"] = value + +/datum/preference/choiced/ipc_antenna + explanation = "Antenna" + savefile_key = "ipc_antenna" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/ipc_antenna + sub_preference = /datum/preference/color/mutcolor/ipc_antenna + +/datum/preference/choiced/ipc_antenna/init_possible_values() + return GLOB.ipc_antenna_list + +/datum/preference/choiced/ipc_antenna/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["ipc_antenna"] = value + +/datum/preference/color/mutcolor/ipc_antenna + explanation = "Antenna Color" + savefile_key = "ipc_antenna_color" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/ipc_antenna + is_sub_preference = TRUE + + color_key = MUTCOLORS_KEY_IPC_ANTENNA + +/datum/preference/color/mutcolor/ipc_antenna/create_default_value() + return "#b4b4b4" + +/datum/preference/choiced/ipc_brand + explanation = "Chassis Brand" + savefile_key = "ipc_brand" + savefile_identifier = PREFERENCE_CHARACTER + relevant_species_trait = BRANDEDPROSTHETICS + priority = PREFERENCE_PRIORITY_BRANDED_PROSTHETICS + requires_accessible = TRUE + +/datum/preference/choiced/ipc_brand/create_default_value() + return "None" + +/// Global list of player-friendly name to iconstate prefix. +GLOBAL_REAL_VAR(ipc_chassis_options) = list( + "None" = "None", + "Aether Mk.I" = "bsh", + "Aether Mk.II" = "bs2", + "Dionysus" = "hsi", + "Sentinel" = "sgm", + "RUST-E" = "xmg", + "RUST-G" = "xm2", + "Wayfarer Mk.I" = "wtm", + "Wayfarer Mk.II" = "mcg", + "Gamma (Gen 3)" = "zhp", +) + +/datum/preference/choiced/ipc_brand/init_possible_values() + return global.ipc_chassis_options + +/datum/preference/choiced/ipc_brand/apply_to_human(mob/living/carbon/human/target, value) + var/state = global.ipc_chassis_options[value] + state = state == "None" ? "ipc" : "[state]ipc" + for(var/obj/item/bodypart/BP as anything in target.bodyparts) + if(BP.is_stump || IS_ORGANIC_LIMB(BP)) + continue + + BP.change_appearance(id = state, update_owner = FALSE) + + target.dna.species.examine_limb_id = state == "ipc" ? SPECIES_IPC : state + target.update_body_parts() + +/datum/preference/choiced/saurian_screen + explanation = "Head" + savefile_key = "saurian_screen" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/saurian_screen + +/datum/preference/choiced/saurian_screen/init_possible_values() + return GLOB.saurian_screens_list + +/datum/preference/choiced/saurian_screen/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["saurian_screen"] = value + +/datum/preference/choiced/saurian_antenna + explanation = "Antenna" + savefile_key = "saurian_antenna" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/saurian_antenna + sub_preference = /datum/preference/tri_color/saurian_antenna_color + +/datum/preference/choiced/saurian_antenna/init_possible_values() + return GLOB.saurian_antenna_list + +/datum/preference/choiced/saurian_antenna/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["saurian_antenna"] = value + +/datum/preference/tri_color/saurian_antenna_color + explanation = "Antenna Color" + savefile_key = "saurian_antenna_color" + savefile_identifier = PREFERENCE_CHARACTER + relevant_external_organ = /obj/item/organ/saurian_antenna + is_sub_preference = TRUE + + color_key = MUTCOLORS_KEY_SAURIAN_ANTENNA + +#undef NO_SHACKLES diff --git a/code/modules/client/preferences/species_features/skrell.dm b/code/modules/client/preferences/species_features/skrell.dm deleted file mode 100644 index 774369d58815..000000000000 --- a/code/modules/client/preferences/species_features/skrell.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/preference/choiced/headtails - savefile_key = "feature_headtails" - savefile_identifier = PREFERENCE_CHARACTER - -/datum/preference/choiced/headtails/init_possible_values() - return GLOB.headtails_list - -/datum/preference/choiced/headtails/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features["headtails"] = value diff --git a/code/modules/client/preferences/species_features/teshari.dm b/code/modules/client/preferences/species_features/teshari.dm index 08cef96db2e1..6d4871721fc0 100644 --- a/code/modules/client/preferences/species_features/teshari.dm +++ b/code/modules/client/preferences/species_features/teshari.dm @@ -12,7 +12,7 @@ /datum/preference/choiced/teshari_feathers/init_possible_values() return GLOB.teshari_feathers_list -/datum/preference/choiced/teshari_feathers/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/teshari_feathers/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["teshari_feathers"] = value /datum/preference/choiced/teshari_ears @@ -26,7 +26,7 @@ /datum/preference/choiced/teshari_ears/init_possible_values() return GLOB.teshari_ears_list -/datum/preference/choiced/teshari_ears/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/teshari_ears/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["teshari_ears"] = value /datum/preference/choiced/teshari_body_feathers @@ -40,7 +40,7 @@ /datum/preference/choiced/teshari_body_feathers/init_possible_values() return GLOB.teshari_body_feathers_list -/datum/preference/choiced/teshari_body_feathers/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/teshari_body_feathers/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["teshari_body_feathers"] = value /datum/preference/choiced/tail_teshari @@ -54,7 +54,7 @@ /datum/preference/choiced/tail_teshari/init_possible_values() return GLOB.teshari_tails_list -/datum/preference/choiced/tail_teshari/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/tail_teshari/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["tail_teshari"] = value /datum/preference/tri_color/teshari_tail diff --git a/code/modules/client/preferences/species_features/vampire.dm b/code/modules/client/preferences/species_features/vampire.dm index c0986981650c..1fd019c34c1d 100644 --- a/code/modules/client/preferences/species_features/vampire.dm +++ b/code/modules/client/preferences/species_features/vampire.dm @@ -30,11 +30,12 @@ GLOBAL_LIST_EMPTY(vampire_houses) var/datum/job/vampire_job = SSjob.GetJob(target.job) if(!vampire_job) //no job or no mind LOSERS return - var/list/valid_departments = (SSjob.joinable_departments.Copy()) - list(/datum/job_department/silicon, /datum/job_department/undefined) + var/list/valid_departments = (SSjob.departments.Copy()) - list(/datum/job_department/silicon, /datum/job_department/undefined, /datum/job_department/company_leader) for(var/datum/job_department/potential_house as anything in valid_departments) if(vampire_job in potential_house.department_jobs) vampire_house = potential_house break + if(!vampire_house) //sillycones return if(!GLOB.vampire_houses[vampire_house.department_name]) diff --git a/code/modules/client/preferences/species_features/vox.dm b/code/modules/client/preferences/species_features/vox.dm index 989d468d27d3..b666327ae00d 100644 --- a/code/modules/client/preferences/species_features/vox.dm +++ b/code/modules/client/preferences/species_features/vox.dm @@ -28,6 +28,7 @@ /datum/preference/choiced/vox_facial_hair/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["vox_facial_hair"] = value +/* VOX CURRENTLY ONLY HAVE ONE TAIL, THIS IS REDUNDANT /datum/preference/choiced/tail_vox explanation = "Tail" savefile_key = "tail_vox" @@ -37,8 +38,9 @@ /datum/preference/choiced/tail_vox/init_possible_values() return GLOB.tails_list_vox -/datum/preference/choiced/tail_vox/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) +/datum/preference/choiced/tail_vox/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["tail_vox"] = value +*/ #undef VOX_BODY_COLOR #undef VOX_SNOUT_COLOR diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 57b6ce955380..72f3d463e220 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,11 +1,11 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 32 +#define SAVEFILE_VERSION_MIN 42 //This is the current version, anything below this will attempt to update (if it's not obsolete) // 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 42 +#define SAVEFILE_VERSION_MAX 44 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn @@ -42,63 +42,46 @@ 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 < 33) - toggles |= SOUND_ENDOFROUND - - if(current_version < 34) - write_preference(/datum/preference/toggle/auto_fit_viewport, TRUE) - - if(current_version < 35) //makes old keybinds compatible with #52040, sets the new default - var/newkey = FALSE - for(var/list/key in key_bindings) - for(var/bind in key) - if(bind == "quick_equipbelt") - key -= "quick_equipbelt" - key |= "quick_equip_belt" - - if(bind == "bag_equip") - key -= "bag_equip" - key |= "quick_equip_bag" - - if(bind == "quick_equip_suit_storage") - newkey = TRUE - if(!newkey && !key_bindings["ShiftQ"]) - key_bindings["ShiftQ"] = list("quick_equip_suit_storage") - - if(current_version < 36) - if(key_bindings["ShiftQ"] == "quick_equip_suit_storage") - key_bindings["ShiftQ"] = list("quick_equip_suit_storage") - - if(current_version < 37) - if(read_preference(/datum/preference/numeric/fps) == 0) - write_preference(GLOB.preference_entries[/datum/preference/numeric/fps], -1) - - if (current_version < 38) - var/found_block_movement = FALSE - - for (var/list/key in key_bindings) - for (var/bind in key) - if (bind == "block_movement") - found_block_movement = TRUE - break - if (found_block_movement) - break - - if (!found_block_movement) - LAZYADD(key_bindings["Ctrl"], "block_movement") - - if (current_version < 39) - LAZYADD(key_bindings["F"], "toggle_combat_mode") - LAZYADD(key_bindings["4"], "toggle_combat_mode") - if (current_version < 40) - LAZYADD(key_bindings["Space"], "hold_throw_mode") - - if (current_version < 41) - migrate_preferences_to_tgui_prefs_menu() + return /datum/preferences/proc/update_character(current_version, savefile/savefile) - if (current_version < 42) - migrate_body_types(savefile) + // Job name update 1 + if(current_version < 44) + var/list/migrate_jobs = list( + "Head of Security" = JOB_SECURITY_MARSHAL, + "Detective" = JOB_DETECTIVE, + "Medical Doctor" = JOB_MEDICAL_DOCTOR, + "Curator" = JOB_ARCHIVIST, + "Cargo Technician" = JOB_DECKHAND, + ) + + var/list/job_prefs = read_preference(/datum/preference/blob/job_priority) + for(var/job in job_prefs) + if(job in migrate_jobs) + var/old_value = job_prefs[job] + job_prefs -= job + job_prefs[migrate_jobs[job]] = old_value + write_preference(/datum/preference/blob/job_priority, job_prefs) + + return + +/// Called when reading preferences if a savefile update is detected. This proc is for +/// overriding preference datum values before they are sanitized by deserialize() +/datum/preferences/proc/early_update_character(current_version, savefile/savefile) + if(current_version < 43) + var/species + READ_FILE(savefile["species"], species) + if(species == "felinid") + write_preference(/datum/preference/choiced/species, SPECIES_HUMAN) + + var/list/augs = read_preference(/datum/preference/blob/augments) + var/datum/augment_item/implant/ears = GLOB.augment_items[/datum/augment_item/implant/cat_ears] + var/datum/augment_item/implant/tail = GLOB.augment_items[/datum/augment_item/implant/cat_tail] + augs[AUGMENT_SLOT_IMPLANTS] = list( + ears.type = ears.get_choices()[1], + tail.type = tail.get_choices()[1] + ) + write_preference(/datum/preference/blob/augments, augs) /// checks through keybindings for outdated unbound keys and updates them /datum/preferences/proc/check_keybindings() @@ -204,7 +187,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Sanitize lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) - toggles = sanitize_integer(toggles, 0, (2**24)-1, initial(toggles)) + toggles = sanitize_integer(toggles, 0, SHORT_REAL_LIMIT-1, initial(toggles)) key_bindings = sanitize_keybindings(key_bindings) favorite_outfits = SANITIZE_LIST(favorite_outfits) @@ -288,6 +271,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car if(needs_update == -2) //fatal, can't load any data return FALSE + if(needs_update >= 0) + early_update_character(needs_update, S) + // Read everything into cache for (var/preference_type in GLOB.preference_entries) var/datum/preference/preference = GLOB.preference_entries[preference_type] @@ -308,8 +294,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/mob/dead/new_player/body = parent?.mob if(istype(body)) spawn(-1) - body.new_player_panel() - + body.npp.open() return TRUE @@ -337,12 +322,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["version"] , SAVEFILE_VERSION_MAX) //load_character will sanitize any bad data, so assume up-to-date.) - // This is the version when the random security department was removed. - // When the minimum is higher than that version, it's impossible for someone to have the "Random" department. - #if SAVEFILE_VERSION_MIN > 40 - #warn The prefered_security_department check in code/modules/client/preferences/security_department.dm is no longer necessary. - #endif - //Write prefs WRITE_FILE(S["alt_job_titles"], alt_job_titles) diff --git a/code/modules/client/verbs/looc.dm b/code/modules/client/verbs/looc.dm index aff55d429a96..46a01312b56f 100644 --- a/code/modules/client/verbs/looc.dm +++ b/code/modules/client/verbs/looc.dm @@ -37,7 +37,7 @@ if(prefs.muted & MUTE_LOOC) to_chat(src, span_danger("You cannot use LOOC (muted).")) return - if(mob.stat) + if(mob.stat >= UNCONSCIOUS) to_chat(src, span_danger("You cannot use LOOC while unconscious or dead.")) return if(isdead(mob)) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index e7f661691d1a..8b4b646109a1 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -73,12 +73,17 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") mob.log_talk(raw_msg, LOG_OOC) var/keyname = key + if(restricted_mode) + keyname = "*GUEST* [keyname]" + if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) keyname = "[icon2html('icons/ui_icons/chat/member_content.dmi', world, "blag")][keyname]" + if(prefs.hearted) var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) keyname = "[sheet.icon_tag("emoji-heart")][keyname]" + //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/receiver as anything in GLOB.clients) if(!receiver.prefs) // Client being created or deleted. Despite all, this can be null. @@ -87,6 +92,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") continue if(holder?.fakekey in receiver.prefs.ignoring) continue + var/avoid_highlight = receiver == src if(holder) if(!holder.fakekey || receiver.holder) diff --git a/code/modules/client/verbs/suicide.dm b/code/modules/client/verbs/suicide.dm index 2748f58566b4..771b3b710e36 100644 --- a/code/modules/client/verbs/suicide.dm +++ b/code/modules/client/verbs/suicide.dm @@ -43,7 +43,6 @@ if(damagetype & SHAME) stamina.adjust(-200) set_suicide(FALSE) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "shameful_suicide", /datum/mood_event/shameful_suicide) return if(damagetype & MANUAL_SUICIDE_NONLETHAL) //Make sure to call the necessary procs if it does kill later @@ -143,7 +142,7 @@ suicide_log() //put em at -175 - adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(maxHealth - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) ghostize(FALSE) // Disallows reentering body and disassociates mind @@ -162,7 +161,7 @@ suicide_log() //put em at -175 - adjustOxyLoss(max(maxHealth * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) + adjustOxyLoss(max(maxHealth - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0)) death(FALSE) ghostize(FALSE) // Disallows reentering body and disassociates mind @@ -232,9 +231,7 @@ switch(stat) if(CONSCIOUS) return TRUE - if(SOFT_CRIT) - to_chat(src, span_warning("You can't commit suicide while in a critical condition!")) - if(UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) to_chat(src, span_warning("You need to be conscious to commit suicide!")) if(DEAD) to_chat(src, span_warning("You're already dead!")) diff --git a/code/modules/client/verbs/testing.dm b/code/modules/client/verbs/testing.dm new file mode 100644 index 000000000000..c6f171ff9c46 --- /dev/null +++ b/code/modules/client/verbs/testing.dm @@ -0,0 +1,94 @@ +/* + * Macro Test Tools + * I wrote these in a fit of agony because debugging the skin is an actual feat of self-flagelation + * Some of them aren't useful, and were just part of me discovering what crimes TG does to the skin. + * + * dump_macroset_ids(): + * * Dumps all elements of type macros (which are macrosets, according to the ref, but they contain macros. It's confusing, right?) + * * This isn't particularly useful. It should almost always return just "default" + * + * dump_set(): + * * Dumps the contents of the "default" macroset, Which is all currently bound macros, by name, essentially listing all bound macro handles. + * + * arbitrary_winget(cmd as text): + * * A way to quickly run wingets, and get the output, since the debugger no likey sleepy procs. + * + * arbitrary_winset(cmd as text): + * * Same as above, but for winsets. + * + * focuswatch(): + * * Prints the current element with focus, this can be null if something else in the OS has focus outside of BYOND. Useful for seeing where the ball is + * * in the demented juggling act TG decided was worth playing. + * + * winmon(cmd as text|null): + * * Derived from focuswatch's code, it repeatedly runs the same winset on loop, dumping the output to chat, Useful for watching for the results + * * of custom winsets. + */ + +#ifdef MACRO_TEST +#warn !!UNSAFE!!: MacroTest Verbs Enabled, Do Not Merge. +/client + var/x_mt_watchingfocus = FALSE + var/x_mt_winmon_enabled = FALSE + var/list/x_mt_winmon_packet //Lazylist + +/// Dumps the list of all macros. This should almost always be just default +/client/verb/dump_macroset_ids() + set name = "mt Dump Macroset IDs" + set category = "_MACRO_TEST" + to_chat(usr, (winget(src, "", "macros") || "NULL (Bad. Incredibly. Incredibly bad.)")) + +/// List all children of default. Name for macros is their bound key. +/client/verb/dump_set() + set name = "mt Dump bindings" + set category = "_MACRO_TEST" + to_chat(usr, (winget(src, "default.*" , "name")|| "NULL (Bad. Real bad.)")) + +/// A slightly more pleasant way to execute free wingets. +/client/verb/arbitrary_winget(cmd as text) + set name = "awing" + set desc = "Run an arbitrary Winset call, Space-separated arguments." + set category = "_MACRO_TEST" + var/list/parts = splittext(cmd, " ") + to_chat(usr, (winget(src, parts[1], parts[2]) || "NULL (Bad Call?)")) + +/// A slightly more pleasant way to execute free winsets. +/client/verb/arbitrary_winset(cmd as text) + set name = "aswin" + set desc = "Run an arbitrary Winset call, Space-separated arguments." + set category = "_MACRO_TEST" + var/list/parts = splittext(cmd, " ") + winset(src, parts[1], parts[2]) + to_chat(usr, ("CALLED: winset({client:[src.ckey]}, \"[parts[1]]\",\"[parts[2]]\")")) + +/// Will dump the currently focused skin element to chat. Used for tracking down focus juggling issues. +/client/verb/focuswatch() + set name = "mt toggle focus watch" + set category = "_MACRO_TEST" + if(x_mt_watchingfocus) + x_mt_watchingfocus = FALSE + return + else + x_mt_watchingfocus = TRUE + while(x_mt_watchingfocus) + // Live-report the element with focus. + to_chat(usr, (winget(src, "", "focus") || "NULL (Entire game defocused?)")) + sleep(0.5 SECONDS) //Every half second + +/client/verb/winmon(cmd as text|null) + set name = "winmon" + set desc = "Repeatedly run a winget to monitor it's value" + set category = "_MACRO_TEST" + if(x_mt_winmon_enabled || isnull(cmd)) + x_mt_winmon_enabled = FALSE + return + else + x_mt_winmon_enabled = TRUE + var/list/parts = splittext(cmd, " ") + x_mt_winmon_packet = parts + while(x_mt_winmon_enabled) + // Repeatedly rerun the same winget to watch the value + var/winout = winget(src, x_mt_winmon_packet[1], x_mt_winmon_packet[2]) + to_chat(usr, ( winout ? "WINMON:[winout]": "WINMON: NULL (Bad Call?)")) + sleep(0.5 SECONDS) +#endif diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index c0f14f6c01d7..469a381ff215 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -24,7 +24,7 @@ else entry += " - Playing as [C.mob.real_name]" switch(C.mob.stat) - if(UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) entry += " - Unconscious" if(DEAD) if(isobserver(C.mob)) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 66da66f8e1c9..6872faa65012 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -378,7 +378,7 @@ random_sensor = FALSE resistance_flags = NONE can_adjust = FALSE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -391,6 +391,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/under/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/under/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -408,7 +412,7 @@ inhand_icon_state = "armor" blood_overlay_type = "armor" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION var/datum/action/item_action/chameleon/change/chameleon_action @@ -422,6 +426,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/suit/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/suit/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -438,7 +446,7 @@ icon_state = "meson" inhand_icon_state = "meson" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION var/datum/action/item_action/chameleon/change/chameleon_action @@ -452,6 +460,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/glasses/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/glasses/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -469,7 +481,7 @@ inhand_icon_state = "ygloves" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION var/datum/action/item_action/chameleon/change/chameleon_action @@ -483,6 +495,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/gloves/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/gloves/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -499,7 +515,7 @@ icon_state = "greysoft" resistance_flags = NONE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -512,6 +528,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/head/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/head/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -525,7 +545,7 @@ /obj/item/clothing/head/chameleon/drone // The camohat, I mean, holographic hat projection, is part of the // drone itself. - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) // which means it offers no protection, it's just air and light /obj/item/clothing/head/chameleon/drone/Initialize(mapload) @@ -543,7 +563,7 @@ icon_state = "gas_alt" inhand_icon_state = "gas_alt" resistance_flags = NONE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT permeability_coefficient = 0.01 @@ -551,8 +571,6 @@ w_class = WEIGHT_CLASS_SMALL supports_variations_flags = CLOTHING_SNOUTED_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION - var/voice_change = 1 ///This determines if the voice changer is on or off. - var/datum/action/item_action/chameleon/change/chameleon_action /obj/item/clothing/mask/chameleon/Initialize(mapload) @@ -563,6 +581,11 @@ chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/mask/changeling, only_root_path = TRUE) chameleon_action.initialize_disguises() add_item_action(chameleon_action) + ADD_TRAIT(src, TRAIT_REPLACES_VOICE, REF(src)) + +/obj/item/clothing/mask/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() /obj/item/clothing/mask/chameleon/emp_act(severity) . = ..() @@ -575,19 +598,22 @@ chameleon_action.emp_randomise(INFINITY) /obj/item/clothing/mask/chameleon/attack_self(mob/user) - voice_change = !voice_change - to_chat(user, span_notice("The voice changer is now [voice_change ? "on" : "off"]!")) - + var/on = HAS_TRAIT(src, TRAIT_REPLACES_VOICE) + if(on) + REMOVE_TRAIT(src, TRAIT_REPLACES_VOICE, REF(src)) + to_chat(user, span_notice("You switch [src]'s voice changer off.")) + else + ADD_TRAIT(src, TRAIT_REPLACES_VOICE, REF(src)) + to_chat(user, span_notice("You switch [src]'s voice changer on.")) /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, FIRE = 0, ACID = 0) - // Can drones use the voice changer part? Let's not find out. - voice_change = 0 + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/mask/chameleon/drone/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + REMOVE_TRAIT(src, TRAIT_REPLACES_VOICE, REF(src)) // Can drones use the voice changer part? Let's not find out. chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) togglehatmask_action.build_all_button_icons() @@ -606,7 +632,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 = 90, FIRE = 50, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 50, ACID = 50) var/datum/action/item_action/chameleon/change/chameleon_action @@ -622,6 +648,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/clothing/shoes/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/shoes/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -648,6 +678,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/storage/backpack/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/storage/backpack/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -675,6 +709,10 @@ atom_storage.silent = TRUE +/obj/item/storage/belt/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/storage/belt/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -697,6 +735,10 @@ chameleon_action.initialize_disguises() add_item_action(chameleon_action) +/obj/item/radio/headset/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/radio/headset/chameleon/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) @@ -745,12 +787,16 @@ . = ..() chameleon_action.emp_randomise(INFINITY) +/obj/item/stamp/chameleon/Destroy() + QDEL_NULL(chameleon_action) + return ..() + /obj/item/clothing/neck/chameleon name = "black tie" 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, FIRE = 50, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50) w_class = WEIGHT_CLASS_SMALL /obj/item/clothing/neck/chameleon @@ -766,7 +812,7 @@ add_item_action(chameleon_action) /obj/item/clothing/neck/chameleon/Destroy() - qdel(chameleon_action) + QDEL_NULL(chameleon_action) return ..() /obj/item/clothing/neck/chameleon/emp_act(severity) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index cb5f332a2c9b..34c83984ae97 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -10,6 +10,8 @@ stamina_cost = 0 stamina_critical_chance = 0 + /// An alternative name to be used for fibers, forensics stuffs + var/fiber_name = "" var/damaged_clothes = CLOTHING_PRISTINE //similar to machine's BROKEN stat and structure's broken var ///What level of bright light protection item has. @@ -29,6 +31,7 @@ var/toggle_cooldown = null var/cooldown = 0 + /// Flags for clothing var/clothing_flags = NONE var/can_be_bloody = TRUE @@ -117,7 +120,7 @@ /obj/item/food/clothing/proc/after_eat(mob/eater) var/obj/item/clothing/resolved_clothing = clothing.resolve() if (resolved_clothing) - resolved_clothing.take_damage(MOTH_EATING_CLOTHING_DAMAGE, sound_effect = FALSE, damage_flag = CONSUME) + resolved_clothing.take_damage(MOTH_EATING_CLOTHING_DAMAGE, sound_effect = FALSE, damage_flag = BOMB, armor_penetration = 100) //This leaves clothing shreds. else qdel(src) @@ -155,6 +158,68 @@ return ..() +/obj/item/clothing/get_mechanics_info() + . = ..() + var/pronoun = gender == PLURAL ? "They" : "It" + var/pronoun_s = p_s() + + var/static/list/armor_to_descriptive_term = list( + BLUNT = "blunt force", + SLASH = "cutting", + PUNCTURE = "puncturing", + LASER = "lasers", + ENERGY = "energy", + BOMB = "explosions", + BIO = "biohazards", + ) + + var/list/armor_info = list() + for(var/armor_type in armor_to_descriptive_term) + var/armor_value = returnArmor().getRating(armor_type) + if(!armor_value) + continue + + switch(armor_value) + if(1 to 20) + . += "[FOURSPACES]- [pronoun] barely protect[pronoun_s] against [armor_to_descriptive_term[armor_type]]." + if(21 to 30) + . += "[FOURSPACES]- [pronoun] provide[pronoun_s] a very small defense against [armor_to_descriptive_term[armor_type]]." + if(31 to 40) + . += "[FOURSPACES]- [pronoun] offers a small amount of protection against [armor_to_descriptive_term[armor_type]]." + if(41 to 50) + . += "[FOURSPACES]- [pronoun] offers a moderate defense against [armor_to_descriptive_term[armor_type]]." + if(51 to 60) + . += "[FOURSPACES]- [pronoun] provide[pronoun_s] a strong defense against [armor_to_descriptive_term[armor_type]]." + if(61 to 70) + . += "[FOURSPACES]- [pronoun] is very strong against [armor_to_descriptive_term[armor_type]]." + if(71 to 80) + . += "[FOURSPACES]- [gender == PLURAL ? "These provide" : "It provides"] a very robust defense against [armor_to_descriptive_term[armor_type]]." + if(81 to 100) + . += "[FOURSPACES]- Wearing [gender == PLURAL ? "these" : "it"] would make you nigh-invulerable against [armor_to_descriptive_term[armor_type]]." + + if(length(armor_info)) + (.):Insert(1, "Armor Information") + (.):Insert(2, jointext(armor_info, "")) + + if(clothing_flags & STOPSPRESSUREDAMAGE) + . += "- Wearing [gender == PLURAL ? "these" : "it"] will protect you from the vacuum of space." + + if(clothing_flags & THICKMATERIAL) + . += "- The material is exceptionally thick." + + if(!isnull(min_cold_protection_temperature) && min_cold_protection_temperature >= SPACE_SUIT_MIN_TEMP_PROTECT) + . += "- [pronoun] provide[pronoun_s] very good protection against very cold temperatures." + + switch (max_heat_protection_temperature) + if (400 to 1000) + . += "- [pronoun] offer[pronoun_s] the wearer limited protection from fire." + if (1001 to 1600) + . += "- [pronoun] offer[pronoun_s] the wearer some protection from fire." + if (1601 to 35000) + . += "- [pronoun] offer[pronoun_s] the wearer robust protection from fire." + + + /// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up /obj/item/clothing/proc/repair(mob/user, params) update_clothes_damaged_state(CLOTHING_PRISTINE) @@ -179,16 +244,16 @@ * * def_zone: The bodypart zone in question * * damage_amount: Incoming damage * * damage_type: BRUTE or BURN - * * armour_penetration: If the attack had armour_penetration + * * armor_penetration: If the attack had armor_penetration */ -/obj/item/clothing/proc/take_damage_zone(def_zone, damage_amount, damage_type, armour_penetration) +/obj/item/clothing/proc/take_damage_zone(def_zone, damage_amount, damage_type, armor_penetration) if(!def_zone || !limb_integrity || (initial(body_parts_covered) in GLOB.bitflags)) // the second check sees if we only cover one bodypart anyway and don't need to bother with this return var/list/covered_limbs = cover_flags2body_zones(body_parts_covered) // what do we actually cover? if(!(def_zone in covered_limbs)) return - var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armour_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb + var/damage_dealt = take_damage(damage_amount * 0.1, damage_type, armor_penetration, FALSE) * 10 // only deal 10% of the damage to the general integrity damage, then multiply it by 10 so we know how much to deal to limb LAZYINITLIST(damage_by_parts) damage_by_parts[def_zone] += damage_dealt if(damage_by_parts[def_zone] > limb_integrity) @@ -223,7 +288,7 @@ body_parts_covered &= ~i if(body_parts_covered == NONE) // if there are no more parts to break then the whole thing is kaput - atom_destruction((damage_type == BRUTE ? MELEE : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs + atom_destruction((damage_type == BRUTE ? BLUNT : LASER)) // melee/laser is good enough since this only procs from direct attacks anyway and not from fire/bombs return switch(zones_disabled) @@ -246,10 +311,11 @@ ..() if(!istype(user)) return + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - for(var/trait in clothing_traits) - REMOVE_TRAIT(user, trait, "[CLOTHING_TRAIT] [REF(src)]") + for(var/trait in clothing_traits) + REMOVE_CLOTHING_TRAIT(user, trait) if(LAZYLEN(user_vars_remembered)) for(var/variable in user_vars_remembered) @@ -265,8 +331,10 @@ if(slot_flags & slot) //Was equipped to a valid slot for this item? if(iscarbon(user) && LAZYLEN(zones_disabled)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(bristle), override = TRUE) + for(var/trait in clothing_traits) - ADD_TRAIT(user, trait, "[CLOTHING_TRAIT] [REF(src)]") + ADD_CLOTHING_TRAIT(user, trait) + if (LAZYLEN(user_vars_to_edit)) for(var/variable in user_vars_to_edit) if(variable in user.vars) @@ -279,14 +347,6 @@ . += span_warning("[p_theyre(TRUE)] completely shredded and require[p_s()] mending before [p_they()] can be worn again!") return - switch (max_heat_protection_temperature) - if (400 to 1000) - . += "[src] offers the wearer limited protection from fire." - if (1001 to 1600) - . += "[src] offers the wearer some protection from fire." - if (1601 to 35000) - . += "[src] offers the wearer robust protection from fire." - for(var/zone in damage_by_parts) var/pct_damage_part = damage_by_parts[zone] / limb_integrity * 100 var/zone_name = parse_zone(zone) @@ -298,26 +358,6 @@ if(30 to 59) . += span_danger("The [zone_name] is partially shredded.") - if(atom_storage) - var/list/how_cool_are_your_threads = list("") - if(atom_storage.attack_hand_interact) - how_cool_are_your_threads += "[src]'s storage opens when clicked.\n" - else - how_cool_are_your_threads += "[src]'s storage opens when dragged to yourself.\n" - if (atom_storage.can_hold?.len) // If pocket type can hold anything, vs only specific items - how_cool_are_your_threads += "[src] can store [atom_storage.max_slots] item\s.\n" - else - how_cool_are_your_threads += "[src] can store [atom_storage.max_slots] item\s that are [weight_class_to_text(atom_storage.max_specific_storage)] or smaller.\n" - if(atom_storage.quickdraw) - how_cool_are_your_threads += "You can quickly remove an item from [src] using Right-Click.\n" - if(atom_storage.silent) - how_cool_are_your_threads += "Adding or removing items from [src] makes no noise.\n" - how_cool_are_your_threads += "" - . += how_cool_are_your_threads.Join() - - if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.melee || armor.fire || armor.acid || flags_cover & HEADCOVERSMOUTH || flags_cover & PEPPERPROOF) - . += span_notice("It has a tag listing its protection classes.") - /** * Inserts a trait (or multiple traits) into the clothing traits list * @@ -352,45 +392,6 @@ for(var/new_trait in trait_or_traits) REMOVE_CLOTHING_TRAIT(wearer, new_trait) -/obj/item/clothing/Topic(href, href_list) - . = ..() - - if(href_list["list_armor"]) - var/list/readout = list("PROTECTION CLASSES") - if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.melee) - readout += "\nARMOR (I-X)" - if(armor.bio) - readout += "\nTOXIN [armor_to_protection_class(armor.bio)]" - if(armor.bomb) - readout += "\nEXPLOSIVE [armor_to_protection_class(armor.bomb)]" - if(armor.bullet) - readout += "\nBULLET [armor_to_protection_class(armor.bullet)]" - if(armor.energy) - readout += "\nENERGY [armor_to_protection_class(armor.energy)]" - if(armor.laser) - readout += "\nLASER [armor_to_protection_class(armor.laser)]" - if(armor.melee) - readout += "\nMELEE [armor_to_protection_class(armor.melee)]" - if(armor.fire || armor.acid) - readout += "\nDURABILITY (I-X)" - if(armor.fire) - readout += "\nFIRE [armor_to_protection_class(armor.fire)]" - if(armor.acid) - readout += "\nACID [armor_to_protection_class(armor.acid)]" - if(flags_cover & HEADCOVERSMOUTH || flags_cover & PEPPERPROOF) - var/list/things_blocked = list() - if(flags_cover & HEADCOVERSMOUTH) - things_blocked += span_tooltip("Because this item is worn on the head and is covering the mouth, it will block facehugger proboscides, killing facehuggers.", "facehuggers") - if(flags_cover & PEPPERPROOF) - things_blocked += "pepperspray" - if(length(things_blocked)) - readout += "\nCOVERAGE" - readout += "\nIt will block [english_list(things_blocked)]." - - readout += "" - - to_chat(usr, "[readout.Join()]") - /** * Rounds armor_value down to the nearest 10, divides it by 10 and then converts it to Roman numerals. * @@ -417,6 +418,7 @@ //This mostly exists so subtypes can call appriopriate update icon calls on the wearer. /obj/item/clothing/proc/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) damaged_clothes = damaged_state + update_slot_icon() /obj/item/clothing/update_overlays() . = ..() @@ -502,7 +504,7 @@ BLIND // can't see anything if(iscarbon(user)) var/mob/living/carbon/C = user - C.head_update(src, forced = 1) + C.update_slots_for_item(src, force_obscurity_update = TRUE) update_action_buttons() return TRUE @@ -518,6 +520,10 @@ BLIND // can't see anything if(visor_vars_to_toggle & VISOR_TINT) tint ^= initial(tint) + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + C.update_slots_for_item(src, force_obscurity_update = TRUE) + /obj/item/clothing/head/helmet/space/plasmaman/visor_toggling() //handles all the actual toggling of flags up = !up SEND_SIGNAL(src, COMSIG_CLOTHING_VISOR_TOGGLE, up) @@ -529,6 +535,10 @@ BLIND // can't see anything if(visor_vars_to_toggle & VISOR_TINT) tint ^= initial(tint) + if(iscarbon(loc)) + var/mob/living/carbon/C = loc + C.update_slots_for_item(src, force_obscurity_update = TRUE) + /obj/item/clothing/proc/can_use(mob/user) if(user && ismob(user)) if(!user.incapacitated()) @@ -545,26 +555,19 @@ BLIND // can't see anything //so the shred survives potential turf change from the explosion. addtimer(CALLBACK(src, PROC_REF(_spawn_shreds)), 1) deconstruct(FALSE) - if(damage_flag == CONSUME) //This allows for moths to fully consume clothing, rather than damaging it like other sources like brute - var/turf/current_position = get_turf(src) - new /obj/effect/decal/cleanable/shreds(current_position, name) - if(isliving(loc)) - var/mob/living/possessing_mob = loc - possessing_mob.visible_message(span_danger("[src] is consumed until naught but shreds remains!"), span_boldwarning("[src] falls apart into little bits!")) - deconstruct(FALSE) - else - body_parts_covered = NONE - slot_flags = NONE - update_clothes_damaged_state(CLOTHING_SHREDDED) - if(isliving(loc)) - var/mob/living/M = loc - if(src in M.get_equipped_items(FALSE)) //make sure they were wearing it and not attacking the item in their hands - M.visible_message(span_danger("[M]'s [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), span_warning("Your [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), vision_distance = COMBAT_MESSAGE_RANGE) - M.dropItemToGround(src) - else - M.visible_message(span_danger("[src] fall[p_s()] apart, completely shredded!"), vision_distance = COMBAT_MESSAGE_RANGE) - name = "shredded [initial(name)]" // change the name -after- the message, not before. - update_appearance() + + body_parts_covered = NONE + slot_flags = NONE + update_clothes_damaged_state(CLOTHING_SHREDDED) + if(isliving(loc)) + var/mob/living/M = loc + if(src in M.get_equipped_items(FALSE)) //make sure they were wearing it and not attacking the item in their hands + M.visible_message(span_danger("[M]'s [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), span_warning("Your [src.name] fall[p_s()] off, [p_theyre()] completely shredded!"), vision_distance = COMBAT_MESSAGE_RANGE) + M.dropItemToGround(src) + else + M.visible_message(span_danger("[src] fall[p_s()] apart, completely shredded!"), vision_distance = COMBAT_MESSAGE_RANGE) + name = "shredded [initial(name)]" // change the name -after- the message, not before. + update_appearance() SEND_SIGNAL(src, COMSIG_ATOM_DESTRUCTION, damage_flag) /// If we're a clothing with at least 1 shredded/disabled zone, give the wearer a periodic heads up letting them know their clothes are damaged diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm index 6901909af6fa..e2630737f260 100644 --- a/code/modules/clothing/ears/_ears.dm +++ b/code/modules/clothing/ears/_ears.dm @@ -16,10 +16,10 @@ strip_delay = 15 equip_delay_other = 25 resistance_flags = FLAMMABLE - custom_price = PAYCHECK_HARD * 1.5 + custom_price = PAYCHECK_ASSISTANT * 8.25 supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/ears/earmuffs/ComponentInitialize() +/obj/item/clothing/ears/earmuffs/Initialize(mapload) . = ..() AddElement(/datum/element/earhealing) AddComponent(/datum/component/wearertargeting/earprotection, list(ITEM_SLOT_EARS)) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index d57169f963c3..dda85595dd3d 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -53,7 +53,8 @@ user.update_sight() if(iscarbon(user)) var/mob/living/carbon/carbon_user = user - carbon_user.head_update(src, forced = TRUE) + carbon_user.update_tint() + carbon_user.update_slots_for_item(src, force_obscurity_update = TRUE) //called when thermal glasses are emped. /obj/item/clothing/glasses/proc/thermal_overload() @@ -68,23 +69,6 @@ H.blur_eyes(5) eyes.applyOrganDamage(5) -/obj/item/clothing/glasses/AltClick(mob/user) - if(glass_colour_type && !forced_glass_color && ishuman(user)) - var/mob/living/carbon/human/human_user = user - - if (human_user.glasses != src) - return ..() - - if (HAS_TRAIT_FROM(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT)) - REMOVE_TRAIT(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT) - to_chat(human_user, span_notice("You will no longer see glasses colors.")) - else - ADD_TRAIT(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT) - to_chat(human_user, span_notice("You will now see glasses colors.")) - human_user.update_glasses_color(src, TRUE) - 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 if(!new_color_type || ispath(new_color_type)) //the new glass colour type must be null or a path. @@ -97,12 +81,11 @@ /mob/living/carbon/human/proc/update_glasses_color(obj/item/clothing/glasses/G, glasses_equipped) - if((HAS_TRAIT(src, TRAIT_SEE_GLASS_COLORS) || G.forced_glass_color) && glasses_equipped) + if(glasses_equipped && (G.forced_glass_color || client?.prefs.read_preference(/datum/preference/toggle/glasses_color)) ) add_client_colour(G.glass_colour_type) else remove_client_colour(G.glass_colour_type) - /obj/item/clothing/glasses/meson name = "optical meson scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions." @@ -138,7 +121,7 @@ alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER force = 10 throwforce = 10 - throw_speed = 4 + throw_speed = 1.5 attack_verb_continuous = list("slices") attack_verb_simple = list("slice") hitsound = 'sound/weapons/bladeslice.ogg' @@ -152,7 +135,7 @@ inhand_icon_state = "glasses" 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, FIRE = 80, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -223,7 +206,7 @@ alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER force = 10 throwforce = 20 - throw_speed = 4 + throw_speed = 1.5 attack_verb_continuous = list("slices") attack_verb_simple = list("slice") hitsound = 'sound/weapons/bladeslice.ogg' @@ -241,7 +224,7 @@ /obj/item/clothing/glasses/regular/Initialize(mapload) . = ..() - AddComponent(/datum/component/knockoff,25,list(BODY_ZONE_PRECISE_EYES),list(ITEM_SLOT_EYES)) + AddComponent(/datum/component/knockoff, 25, list(BODY_ZONE_PRECISE_EYES), slot_flags) var/static/list/loc_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) @@ -259,7 +242,7 @@ if(isliving(movable)) var/mob/living/crusher = movable if(crusher.m_intent != MOVE_INTENT_WALK && (!(crusher.movement_type & (FLYING|FLOATING)) || crusher.buckled)) - playsound(src, 'sound/effects/glass_step.ogg', 30, TRUE) + playsound(src, 'sound/effects/small_glass_break.ogg', 30, TRUE) visible_message(span_warning("[crusher] steps on [src], damaging it!")) take_damage(100, sound_effect = FALSE) @@ -344,7 +327,7 @@ alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER force = 10 throwforce = 10 - throw_speed = 4 + throw_speed = 1.5 attack_verb_continuous = list("slices") attack_verb_simple = list("slice") hitsound = 'sound/weapons/bladeslice.ogg' @@ -437,7 +420,7 @@ add_atom_colour(user.eye_color_left, FIXED_COLOUR_PRIORITY) // I want this to be an average of the colors of both eyes, but that can be done later colored_before = TRUE -/obj/item/clothing/glasses/blindfold/white/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use) +/obj/item/clothing/glasses/blindfold/white/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE, file2use) . = ..() if(isinhands || !ishuman(loc) || colored_before) return @@ -587,7 +570,7 @@ if(ishuman(user)) for(var/hud in hudlist) var/datum/atom_hud/H = GLOB.huds[hud] - H.add_hud_to(user) + H.show_to(user) ADD_TRAIT(user, TRAIT_MEDICAL_HUD, GLASSES_TRAIT) ADD_TRAIT(user, TRAIT_SECURITY_HUD, GLASSES_TRAIT) if(xray) @@ -601,7 +584,7 @@ if(ishuman(user)) for(var/hud in hudlist) var/datum/atom_hud/H = GLOB.huds[hud] - H.remove_hud_from(user) + H.hide_from(user) /obj/item/clothing/glasses/debug/AltClick(mob/user) . = ..() @@ -640,33 +623,6 @@ desc = "A pair of glasses with uniquely colored lenses. The frame is inscribed with 'Best Salesman 1997'." icon_state = "salesman" inhand_icon_state = "salesman" - ///Tells us who the current wearer([BIGSHOT]) is. - var/mob/living/carbon/human/bigshot - -/obj/item/clothing/glasses/salesman/equipped(mob/living/carbon/human/user, slot) - ..() - if(slot != ITEM_SLOT_EYES) - return - bigshot = user - RegisterSignal(bigshot, COMSIG_CARBON_SANITY_UPDATE, PROC_REF(moodshift)) - -/obj/item/clothing/glasses/salesman/dropped(mob/living/carbon/human/user) - ..() - UnregisterSignal(bigshot, COMSIG_CARBON_SANITY_UPDATE) - bigshot = initial(bigshot) - icon_state = initial(icon_state) - desc = initial(desc) - -/obj/item/clothing/glasses/salesman/proc/moodshift(atom/movable/source, amount) - SIGNAL_HANDLER - if(amount < SANITY_UNSTABLE) - icon_state = "salesman_fzz" - desc = "A pair of glasses, the lenses are full of TV static. They've certainly seen better days..." - bigshot.update_worn_glasses() - else - icon_state = initial(icon_state) - desc = initial(desc) - bigshot.update_worn_glasses() /obj/item/clothing/glasses/nightmare_vision name = "nightmare vision goggles" diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index f9386631748f..40988d863871 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -31,7 +31,7 @@ START_PROCESSING(SSobj, src) update_appearance() -/obj/item/clothing/glasses/meson/engine/ComponentInitialize() +/obj/item/clothing/glasses/meson/engine/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -97,9 +97,8 @@ if(!port) return var/list/shuttle_areas = port.shuttle_areas - for(var/r in shuttle_areas) - var/area/region = r - for(var/turf/place in region.contents) + for(var/area/region as anything in shuttle_areas) + for(var/turf/place as anything in region.get_contained_turfs()) if(get_dist(user, place) > 7) continue var/image/pic diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 7e825190e01a..98cf54c1d935 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -13,7 +13,7 @@ return if(hud_type) var/datum/atom_hud/H = GLOB.huds[hud_type] - H.add_hud_to(user) + H.show_to(user) if(hud_trait) ADD_TRAIT(user, hud_trait, GLASSES_TRAIT) @@ -23,7 +23,7 @@ return if(hud_type) var/datum/atom_hud/H = GLOB.huds[hud_type] - H.remove_hud_from(user) + H.hide_from(user) if(hud_trait) REMOVE_TRAIT(user, hud_trait, GLASSES_TRAIT) @@ -109,87 +109,6 @@ flash_protect = FLASH_PROTECTION_FLASH tint = 1 -/obj/item/clothing/glasses/hud/security - name = "security HUD" - desc = "A heads-up display that scans the humanoids 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 - supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION - -/obj/item/clothing/glasses/hud/security/chameleon - name = "chameleon security HUD" - desc = "A stolen security HUD integrated with Syndicate chameleon technology. Provides flash protection." - flash_protect = FLASH_PROTECTION_FLASH - - // Yes this code is the same as normal chameleon glasses, but we don't - // have multiple inheritance, okay? - var/datum/action/item_action/chameleon/change/chameleon_action - -/obj/item/clothing/glasses/hud/security/chameleon/Initialize(mapload) - . = ..() - chameleon_action = new(src) - chameleon_action.chameleon_type = /obj/item/clothing/glasses - chameleon_action.chameleon_name = "Glasses" - chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/glasses/changeling, only_root_path = TRUE) - chameleon_action.initialize_disguises() - add_item_action(chameleon_action) - -/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - chameleon_action.emp_randomise() - - -/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch - name = "eyepatch HUD" - desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball." - icon_state = "hudpatch" - supports_variations_flags = NONE - -/obj/item/clothing/glasses/hud/security/sunglasses - name = "security HUDSunglasses" - desc = "Sunglasses with a security HUD." - icon_state = "sunhudsec" - darkness_view = 1 - flash_protect = FLASH_PROTECTION_FLASH - tint = 1 - glass_colour_type = /datum/client_colour/glass_colour/darkred - supports_variations_flags = NONE - -/obj/item/clothing/glasses/hud/security/night - name = "night vision security HUD" - desc = "An advanced heads-up display that provides ID data and vision in complete darkness." - icon_state = "securityhudnight" - darkness_view = 8 - flash_protect = FLASH_PROTECTION_SENSITIVE - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - glass_colour_type = /datum/client_colour/glass_colour/green - supports_variations_flags = NONE - -/obj/item/clothing/glasses/hud/security/sunglasses/gars - name = "\improper HUD gar glasses" - desc = "GAR glasses with a HUD." - icon_state = "gar_sec" - inhand_icon_state = "gar_black" - alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER - force = 10 - throwforce = 10 - throw_speed = 4 - attack_verb_continuous = list("slices") - attack_verb_simple = list("slice") - hitsound = 'sound/weapons/bladeslice.ogg' - sharpness = SHARP_EDGED - -/obj/item/clothing/glasses/hud/security/sunglasses/gars/giga - name = "giga HUD gar glasses" - desc = "GIGA GAR glasses with a HUD." - icon_state = "gigagar_sec" - force = 12 - throwforce = 12 - /obj/item/clothing/glasses/hud/toggle name = "Toggle HUD" desc = "A hud with multiple functions." @@ -204,7 +123,7 @@ if (hud_type) var/datum/atom_hud/H = GLOB.huds[hud_type] - H.remove_hud_from(user) + H.hide_from(user) if (hud_type == DATA_HUD_MEDICAL_ADVANCED) hud_type = null @@ -215,7 +134,7 @@ if (hud_type) var/datum/atom_hud/H = GLOB.huds[hud_type] - H.add_hud_to(user) + H.show_to(user) /datum/action/item_action/switch_hud name = "Switch HUD" diff --git a/code/modules/clothing/glasses/sec_hud.dm b/code/modules/clothing/glasses/sec_hud.dm new file mode 100644 index 000000000000..ceaf33c7935f --- /dev/null +++ b/code/modules/clothing/glasses/sec_hud.dm @@ -0,0 +1,316 @@ +/obj/item/clothing/glasses/hud/security + name = "security HUD" + desc = "A heads-up display that scans the humanoids in view and provides accurate data about their ID status and security records." + icon_state = "securityhud" + hud_type = null + hud_trait = TRAIT_SECURITY_HUD + glass_colour_type = null + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION + actions_types = list(/datum/action/innate/investigate) + +/obj/item/clothing/glasses/hud/security/chameleon + name = "chameleon security HUD" + desc = "A stolen security HUD integrated with Syndicate chameleon technology. Provides flash protection." + flash_protect = FLASH_PROTECTION_FLASH + + // Yes this code is the same as normal chameleon glasses, but we don't + // have multiple inheritance, okay? + var/datum/action/item_action/chameleon/change/chameleon_action + +/obj/item/clothing/glasses/hud/security/chameleon/Initialize(mapload) + . = ..() + chameleon_action = new(src) + chameleon_action.chameleon_type = /obj/item/clothing/glasses + chameleon_action.chameleon_name = "Glasses" + chameleon_action.chameleon_blacklist = typecacheof(/obj/item/clothing/glasses/changeling, only_root_path = TRUE) + chameleon_action.initialize_disguises() + add_item_action(chameleon_action) + +/obj/item/clothing/glasses/hud/security/chameleon/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + chameleon_action.emp_randomise() + + +/obj/item/clothing/glasses/hud/security/sunglasses/eyepatch + name = "eyepatch HUD" + desc = "A heads-up display that connects directly to the optical nerve of the user, replacing the need for that useless eyeball." + icon_state = "hudpatch" + supports_variations_flags = NONE + +/obj/item/clothing/glasses/hud/security/sunglasses + name = "security HUDSunglasses" + desc = "Sunglasses with a security HUD." + icon_state = "sunhudsec" + darkness_view = 1 + flash_protect = FLASH_PROTECTION_FLASH + tint = 1 + glass_colour_type = null + supports_variations_flags = NONE + +/obj/item/clothing/glasses/hud/security/night + name = "night vision security HUD" + desc = "An advanced heads-up display that provides ID data and vision in complete darkness." + icon_state = "securityhudnight" + darkness_view = 8 + flash_protect = FLASH_PROTECTION_SENSITIVE + lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE + glass_colour_type = /datum/client_colour/glass_colour/green + supports_variations_flags = NONE + +/obj/item/clothing/glasses/hud/security/sunglasses/gars + name = "\improper HUD gar glasses" + desc = "GAR glasses with a HUD." + icon_state = "gar_sec" + inhand_icon_state = "gar_black" + alternate_worn_layer = ABOVE_BODY_FRONT_HEAD_LAYER + force = 10 + throwforce = 10 + throw_speed = 1.5 + attack_verb_continuous = list("slices") + attack_verb_simple = list("slice") + hitsound = 'sound/weapons/bladeslice.ogg' + sharpness = SHARP_EDGED + +/obj/item/clothing/glasses/hud/security/sunglasses/gars/giga + name = "giga HUD gar glasses" + desc = "GIGA GAR glasses with a HUD." + icon_state = "gigagar_sec" + force = 12 + throwforce = 12 + +/datum/action/innate/investigate + name = "Investigate" + check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_CONSCIOUS + click_action = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + + button_icon = /obj/item/clothing/glasses/hud/security::icon + button_icon_state = /obj/item/clothing/glasses/hud/security::icon_state + + /// The sound channel we're using + var/used_channel + /// The sound datum for the loop + var/sound/loop + /// Timer ID for the looping timer that checks the owner's mouse over atom. + var/timer + /// A weakref to the most recently hovered human + var/datum/weakref/last_hover_ref + /// The screentext object, we handle it ourselves + var/atom/movable/screen/text/screen_text/atom_hud/hud_obj + + COOLDOWN_DECLARE(usage_cd) + +/datum/action/innate/investigate/Grant(mob/grant_to) + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_WANTED_CRIMINAL, PROC_REF(wanted_fool), override = TRUE) + +/datum/action/innate/investigate/Remove(mob/removed_from) + . = ..() + if(used_channel) + SEND_SOUND(removed_from, sound(channel = used_channel)) + + hud_obj?.end_play(removed_from) + UnregisterSignal(SSdcs, COMSIG_GLOB_WANTED_CRIMINAL) + +/datum/action/innate/investigate/IsAvailable(feedback) + if(!ishuman(owner)) + return FALSE + + var/mob/living/carbon/human/H = owner + if(H.glasses != target) + if(feedback) + to_chat(owner, span_warning("You cannot use [target] without putting it on.")) + return FALSE + + return ..() + +/datum/action/innate/investigate/set_ranged_ability(mob/living/on_who, text_to_show) + . = ..() + used_channel ||= SSsounds.random_available_channel() + + loop = sound('sound/items/sec_hud/inspect_loop.mp3', TRUE) + + owner.playsound_local(get_turf(owner), 'sound/items/sec_hud/inspect_open.mp3', 100, channel = used_channel) + owner.playsound_local(get_turf(owner), vol = 200, channel = used_channel, sound_to_use = loop, wait = TRUE) + timer = addtimer(CALLBACK(src, PROC_REF(check_mouse_over)), 1, TIMER_STOPPABLE | TIMER_LOOP) + + var/obj/item/clothing/glasses/G = target + if(isnull(initial(G.glass_colour_type))) + G.change_glass_color(owner, /datum/client_colour/glass_colour/red) + +/datum/action/innate/investigate/unset_ranged_ability(mob/living/on_who, text_to_show) + . = ..() + var/turf/T = get_turf(owner) + if(T) + owner.playsound_local(get_turf(owner), sound('sound/items/sec_hud/inspect_close.mp3'), 100, channel = used_channel) + else if(used_channel) + SEND_SOUND(owner, sound(channel = used_channel)) + + deltimer(timer) + hud_obj?.end_play() + + var/obj/item/clothing/glasses/G = target + if(isnull(initial(G.glass_colour_type))) + G.change_glass_color(owner, null) + +/datum/action/innate/investigate/proc/check_mouse_over() + if(!owner.client) + unset_ranged_ability(owner) + return + + var/atom/hovered = SSmouse_entered.sustained_hovers[owner.client] + if(isnull(hovered)) + clear_hovered() + return + + if(IS_WEAKREF_OF(hovered, last_hover_ref)) + return + + if(!ishuman(hovered)) + clear_hovered() + return + + owner.playsound_local(get_turf(owner), 'sound/items/sec_hud/inspect_highlight.mp3', 100, channel = used_channel) + last_hover_ref = WEAKREF(hovered) + +/datum/action/innate/investigate/proc/clear_hovered() + if(last_hover_ref) + last_hover_ref = null + if(COOLDOWN_FINISHED(src, usage_cd)) + owner.playsound_local(get_turf(owner), 'sound/items/sec_hud/inspect_unhighlight.mp3', 100, channel = used_channel) + owner.playsound_local(get_turf(owner), vol = 200, channel = used_channel, sound_to_use = loop, wait = TRUE) + +/datum/action/innate/investigate/do_ability(mob/living/caller, atom/clicked_on, list/params) + if(!ishuman(clicked_on) || params?[RIGHT_CLICK]) + unset_ranged_ability(owner) + return TRUE + + if(!COOLDOWN_FINISHED(src, usage_cd)) + return TRUE + + COOLDOWN_START(src, usage_cd, 2 SECONDS) + addtimer(VARSET_CALLBACK(src, last_hover_ref, null), 2.5 SECONDS) + + owner.playsound_local(get_turf(owner), 'sound/items/sec_hud/inspect_perform.mp3', 100, channel = used_channel) + + var/mob/living/carbon/human/H = clicked_on + var/name_to_search = H.get_idcard()?.registered_name + + var/datum/data/record/general_record = SSdatacore.get_record_by_name(name_to_search, DATACORE_RECORDS_STATION) + var/datum/data/record/security_record = SSdatacore.get_record_by_name(name_to_search, DATACORE_RECORDS_SECURITY) + + scan_record(general_record, security_record) + return TRUE + +/datum/action/innate/investigate/proc/scan_record(datum/data/record/general_record, datum/data/record/security_record, print = TRUE) + owner.playsound_local(get_turf(owner), 'sound/items/sec_hud/inspect_perform.mp3', 100, channel = used_channel) + + if(hud_obj) + UnregisterSignal(hud_obj, COMSIG_PARENT_QDELETING) + hud_obj.fade_out() + hud_obj = null + + hud_obj = new() + RegisterSignal(hud_obj, COMSIG_PARENT_QDELETING, PROC_REF(hud_obj_gone)) + + var/atom/movable/screen/holder = make_holder(general_record) + + animate(holder, dir = WEST, 0.5 SECONDS, loop = -1) + animate(dir = NORTH, 0.5 SECONDS) + animate(dir = EAST, 0.5 SECONDS) + animate(dir = SOUTH, 0.5 SECONDS) + + hud_obj.vis_contents += holder + + var/list/text = list("[uppertext(general_record?.fields[DATACORE_NAME]) || "UNKNOWN"]") + text += "






" + if(!security_record) + text += "
NO DATA" + else + var/wanted_status = security_record.fields[DATACORE_CRIMINAL_STATUS] + if(wanted_status == CRIMINAL_WANTED) + wanted_status = "WANTED" + else + wanted_status = uppertext(wanted_status) + + text += "
[wanted_status]" + + owner.play_screen_text(jointext(text, ""), hud_obj) + if(print) + print_message(security_record) + +/datum/action/innate/investigate/proc/print_message(datum/data/record/security) + var/list/text = list() + var/wanted = security?.fields[DATACORE_CRIMINAL_STATUS] + switch(wanted) + if(null) + wanted = "UNKNOWN" + if(CRIMINAL_WANTED) + wanted = "WANTED" + else + wanted = uppertext(wanted) + + text += "
" + text += "
[wanted]" + text += "
" + if(isnull(security)) + text += "NO DATA" + else + text += "
[security.fields[DATACORE_NAME]]
" + + if(length(security.fields[DATACORE_CRIMES])) + text += "" + for(var/i in 1 to min(4, length(security.fields[DATACORE_CRIMES]))) + var/datum/data/crime/crime = security.fields[DATACORE_CRIMES][i] + text += {" + + + + + "} + text += "
[crime.crimeName][crime.crimeDetails]>/span>
" + text += "
" + + to_chat(owner, jointext(text, "")) + +/datum/action/innate/investigate/proc/make_holder(datum/data/record/general_record) + var/atom/movable/screen/holder = new() + if(general_record?.fields[DATACORE_APPEARANCE]) + holder.appearance = new /mutable_appearance(general_record.fields[DATACORE_APPEARANCE]) + else + holder.icon = 'icons/hud/noimg.dmi' + + holder.vis_flags = VIS_INHERIT_ID | VIS_INHERIT_LAYER | VIS_INHERIT_PLANE + holder.dir = SOUTH + + holder.makeHologram(rgb(225,125,125, 0.7 * 255)) + + holder.transform = holder.transform.Scale(2, 2) + holder.pixel_y = -16 + holder.pixel_x = -16 + return holder + +/datum/action/innate/investigate/proc/hud_obj_gone(atom/movable/source) + SIGNAL_HANDLER + hud_obj = null + +/// Invoked by a crew member's criminal status changing. +/datum/action/innate/investigate/proc/wanted_fool(datum/source, datum/data/record/R) + SIGNAL_HANDLER + if(hud_obj || !owner) + return + + var/datum/data/record/general_record = SSdatacore.find_record("id", R.fields[DATACORE_ID], DATACORE_RECORDS_STATION) + UNLINT(scan_record(general_record, R, FALSE)) //IT DOESNT SLEEP STUPID LINTER!!! + + addtimer(CALLBACK(hud_obj, TYPE_PROC_REF(/atom/movable/screen/text/screen_text/atom_hud, fade_out)), 7 SECONDS) + + var/obj/item/target = src.target + owner.visible_message( + span_notice("[owner]'s [target.name] emit[copytext_char(target.name, -1) == "s" ? "" : "s"] a quiet click."), + null, + span_hear("You hear a quiet click."), + COMBAT_MESSAGE_RANGE, + ) diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 00126d9b1bb1..c33e402fbd9f 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -28,25 +28,25 @@ user.visible_message(span_suicide("\the [src] are forcing [user]'s hands around [user.p_their()] neck! It looks like the gloves are possessed!")) return OXYLOSS -/obj/item/clothing/gloves/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/gloves/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() - if(!isinhands) + if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedgloves") - if(HAS_BLOOD_DNA(src)) - . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") -/obj/item/clothing/gloves/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_gloves() - -// Called just before an attack_hand(), in mob/UnarmedAttack() -/obj/item/clothing/gloves/proc/Touch(atom/A, proximity, mouseparams) - return FALSE // return 1 to cancel attack_hand() + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/arm = wearer.get_bodypart(BODY_ZONE_R_ARM) || wearer.get_bodypart(BODY_ZONE_L_ARM) + if(!arm?.icon_bloodycover) + return + var/image/bloody_overlay = image(arm.icon_bloodycover, "bloodyhands") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay + else + . += mutable_appearance('icons/effects/blood.dmi', "bloodyhands") /obj/item/clothing/gloves/wirecutter_act(mob/living/user, obj/item/I) . = ..() diff --git a/code/modules/clothing/gloves/bone.dm b/code/modules/clothing/gloves/bone.dm index 87235ecae87c..1ef7a3447a73 100644 --- a/code/modules/clothing/gloves/bone.dm +++ b/code/modules/clothing/gloves/bone.dm @@ -10,5 +10,5 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 15, BOMB = 20, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 15, PUNCTURE = 25, SLASH = 0, LASER = 15, ENERGY = 15, BOMB = 20, BIO = 10, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION diff --git a/code/modules/clothing/gloves/botany.dm b/code/modules/clothing/gloves/botany.dm index 219a47e4193f..dccb69dd7eea 100644 --- a/code/modules/clothing/gloves/botany.dm +++ b/code/modules/clothing/gloves/botany.dm @@ -10,4 +10,4 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE clothing_traits = list(TRAIT_PLANT_SAFE) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 30) diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 4522a70bfcf0..5e06f1ebef1f 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -4,7 +4,6 @@ icon_state = "boxing" inhand_icon_state = "boxing" equip_delay_other = 60 - species_exception = list(/datum/species/golem) // now you too can be a golem boxing champion clothing_traits = list(TRAIT_CHUNKYFINGERS) /obj/item/clothing/gloves/boxing/green diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index ea811b58c1a6..9f16e397dc9d 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -9,10 +9,9 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 resistance_flags = NONE - custom_price = PAYCHECK_MEDIUM * 10 - custom_premium_price = PAYCHECK_COMMAND * 6 + custom_price = PAYCHECK_ASSISTANT * 11.5 + custom_premium_price = PAYCHECK_ASSISTANT * 13.75 cut_type = /obj/item/clothing/gloves/cut - clothing_traits = list(TRAIT_CHUNKYFINGERS) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/gloves/color/yellow/heavy @@ -69,7 +68,7 @@ location.visible_message(span_warning("[src] crumble[p_s()] away into nothing.")) // just like my dreams after working with .dm qdel(src) -/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap +/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." name = "budget insulated gloves" icon_state = "yellow" @@ -201,7 +200,7 @@ 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, FIRE = 70, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 70, ACID = 50) resistance_flags = NONE supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -225,8 +224,11 @@ inhand_icon_state = "latex" siemens_coefficient = 0.3 permeability_coefficient = 0.01 - clothing_traits = list(TRAIT_QUICK_CARRY, TRAIT_FINGERPRINT_PASSTHROUGH) + clothing_traits = list(TRAIT_QUICK_CARRY) resistance_flags = NONE + clothing_flags = parent_type::clothing_flags | FIBERLESS + // Just as the doctor ordered + germ_level = 0 /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" @@ -263,7 +265,7 @@ desc = "These look pretty fancy." icon_state = "white" inhand_icon_state = "wgloves" - custom_price = PAYCHECK_MINIMAL + custom_price = PAYCHECK_ASSISTANT * 2.5 /obj/item/clothing/gloves/kim name = "aerostatic gloves" diff --git a/code/modules/clothing/gloves/combat.dm b/code/modules/clothing/gloves/combat.dm index 0be5dea19e15..1025105cb42c 100644 --- a/code/modules/clothing/gloves/combat.dm +++ b/code/modules/clothing/gloves/combat.dm @@ -11,4 +11,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, FIRE = 80, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) diff --git a/code/modules/clothing/gloves/plasmaman.dm b/code/modules/clothing/gloves/plasmaman.dm index ffefd45b912d..e11cb4b62a3c 100644 --- a/code/modules/clothing/gloves/plasmaman.dm +++ b/code/modules/clothing/gloves/plasmaman.dm @@ -9,7 +9,7 @@ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE permeability_coefficient = 0.05 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/gloves/color/plasmaman/black name = "black envirogloves" @@ -65,7 +65,7 @@ icon_state = "botanyplasma" inhand_icon_state = "botanyplasma" permeability_coefficient = 0.05 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/gloves/color/plasmaman/prototype name = "prototype envirogloves" @@ -115,11 +115,3 @@ name = "CentCom intern envirogloves" icon_state = "internplasma" inhand_icon_state = "internplasma" - -/obj/item/clothing/gloves/color/plasmaman/radio - name = "translation envirogloves" - desc = "Allows the less vocally-capable plasmamen to use sign language over comms." - icon_state = "radio_gplasma" - inhand_icon_state = "radio_gplasma" - worn_icon_state = "radio_g" - clothing_traits = list(TRAIT_CAN_SIGN_ON_COMMS) diff --git a/code/modules/clothing/gloves/special.dm b/code/modules/clothing/gloves/special.dm index d8f6a96ea799..8ebecf3c24f4 100644 --- a/code/modules/clothing/gloves/special.dm +++ b/code/modules/clothing/gloves/special.dm @@ -56,20 +56,29 @@ inhand_icon_state = "rapid" clothing_traits = list(TRAIT_FINGERPRINT_PASSTHROUGH) -/obj/item/clothing/gloves/rapid/ComponentInitialize() +/obj/item/clothing/gloves/rapid/Initialize(mapload) . = ..() AddComponent(/datum/component/wearertargeting/punchcooldown) -/obj/item/clothing/gloves/radio - name = "translation gloves" - desc = "A pair of electronic gloves which connect to nearby radios wirelessly. Allows for sign language users to 'speak' over comms." - icon_state = "radio_g" - inhand_icon_state = "radio_g" - clothing_traits = list(TRAIT_CAN_SIGN_ON_COMMS) - /obj/item/clothing/gloves/race name = "race gloves" desc = "Extremely finely made gloves meant for use by sportsmen in speed-shooting competitions." clothing_traits = list(TRAIT_DOUBLE_TAP) icon_state = "black" inhand_icon_state = "blackgloves" + +/obj/item/clothing/gloves/forensic + name = "forensic gloves" + desc = "Specially made gloves with a distinct luminescent threading." + inhand_icon_state = "black" + icon_state = "forensic" + worn_icon_state = "black" + + siemens_coefficient = 0.5 + permeability_coefficient = 0.05 + + heat_protection = HANDS + cold_protection = HANDS + + min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT diff --git a/code/modules/clothing/head/_head.dm b/code/modules/clothing/head/_head.dm index 8c7715d8bb97..a20e91fb6c79 100644 --- a/code/modules/clothing/head/_head.dm +++ b/code/modules/clothing/head/_head.dm @@ -59,21 +59,24 @@ -/obj/item/clothing/head/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/head/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedhelmet") - if(HAS_BLOOD_DNA(src)) - if(clothing_flags & LARGE_WORN_ICON) - . += mutable_appearance('icons/effects/64x64.dmi', "helmetblood_large") + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/head = wearer.get_bodypart(BODY_ZONE_HEAD) + if(!head?.icon_bloodycover) + return + var/image/bloody_overlay = image(head.icon_bloodycover, "helmetblood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay else - . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") - -/obj/item/clothing/head/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_head() + if(clothing_flags & LARGE_WORN_ICON) + . += mutable_appearance('icons/effects/64x64.dmi', "helmetblood_large") + else + . += mutable_appearance('icons/effects/blood.dmi', "helmetblood") diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index c9cda47deb42..681b2a63a588 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -75,7 +75,7 @@ name = "durathread beanie" desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beaniedurathread" - armor = list(MELEE = 15, BULLET = 5, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 30, ACID = 5) + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 30, ACID = 5) /obj/item/clothing/head/beanie/waldo name = "red striped bobble hat" diff --git a/code/modules/clothing/head/cakehat.dm b/code/modules/clothing/head/cakehat.dm index 0537ffc1c683..5fa295dcba35 100644 --- a/code/modules/clothing/head/cakehat.dm +++ b/code/modules/clothing/head/cakehat.dm @@ -13,9 +13,9 @@ var/throwforce_on = 15 var/damtype_on = BURN flags_inv = HIDEEARS|HIDEHAIR - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) light_outer_range = 2 //luminosity when on - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT flags_cover = HEADCOVERSEYES heat = 999 supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION diff --git a/code/modules/clothing/head/cone.dm b/code/modules/clothing/head/cone.dm index 066e2d50a70b..b8e4e105b464 100644 --- a/code/modules/clothing/head/cone.dm +++ b/code/modules/clothing/head/cone.dm @@ -7,7 +7,6 @@ inhand_icon_state = "cone" force = 1 throwforce = 3 - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL attack_verb_continuous = list("warns", "cautions", "smashes") @@ -16,7 +15,7 @@ supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/head/cone/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/head/cone/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index 05b696183fea..1030c9d7f507 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -16,7 +16,7 @@ icon_state = "syndicate-helm-black-red" inhand_icon_state = "syndicate-helm-black-red" desc = "A plastic replica of a Syndicate agent's space helmet. You'll look just like a real murderous Syndicate agent in this! This is a toy, it is not made for use in space!" - clothing_flags = SNUG_FIT + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT /obj/item/clothing/head/cueball @@ -126,7 +126,7 @@ icon_state = "clockwork_helmet_old" clothing_flags = SNUG_FIT flags_inv = HIDEEARS|HIDEHAIR - armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = -15, BOMB = 10, BIO = 0, FIRE = 20, ACID = 20) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = -5, ENERGY = -15, BOMB = 10, BIO = 0, FIRE = 20, ACID = 20) /obj/item/clothing/head/irs name = "internal revenue service cap" diff --git a/code/modules/clothing/head/crown.dm b/code/modules/clothing/head/crown.dm index 33e7f2e52259..fbe806e30140 100644 --- a/code/modules/clothing/head/crown.dm +++ b/code/modules/clothing/head/crown.dm @@ -2,7 +2,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 = 10, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50, WOUND = 5) + armor = list(BLUNT = 15, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 7fe07eea62d0..76e07c729aa8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -3,14 +3,14 @@ desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." icon_state = "hardhat0_yellow" inhand_icon_state = "hardhat0_yellow" - armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, FIRE = 100, ACID = 50, WOUND = 10) // surprisingly robust against head trauma + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, FIRE = 100, ACID = 50) // surprisingly robust against head trauma flags_inv = 0 actions_types = list(/datum/action/item_action/toggle_helmet_light) - clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT resistance_flags = FIRE_PROOF zmm_flags = ZMM_MANGLE_PLANES - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_outer_range = 4 light_power = 0.2 light_on = FALSE @@ -22,7 +22,7 @@ var/on = FALSE -/obj/item/clothing/head/hardhat/ComponentInitialize() +/obj/item/clothing/head/hardhat/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HEAD) @@ -59,7 +59,7 @@ hat_type = "red" dog_fashion = null name = "firefighter helmet" - clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | STACKABLE_HELMET_EXEMPT heat_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT cold_protection = HEAD @@ -79,7 +79,7 @@ icon_state = "hardhat0_white" inhand_icon_state = "hardhat0_white" hat_type = "white" - clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | STACKABLE_HELMET_EXEMPT heat_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT cold_protection = HEAD @@ -99,7 +99,7 @@ dog_fashion = null name = "atmospheric technician's firefighting helmet" desc = "A firefighter's helmet, able to keep the user cool in any situation." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | STACKABLE_HELMET_EXEMPT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -107,7 +107,7 @@ min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF -/obj/item/clothing/head/hardhat/atmos/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/head/hardhat/atmos/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) @@ -134,7 +134,7 @@ toggle_helmet_light(user) /obj/item/clothing/head/hardhat/weldhat/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE)) toggle_welding_screen(user) /obj/item/clothing/head/hardhat/weldhat/ui_action_click(mob/user, actiontype) @@ -149,7 +149,7 @@ playsound(src, 'sound/mecha/mechmove03.ogg', 50, TRUE) //Visors don't just come from nothing update_appearance() -/obj/item/clothing/head/hardhat/weldhat/worn_overlays(mutable_appearance/standing, isinhands) +/obj/item/clothing/head/hardhat/weldhat/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands) . = ..() if(isinhands) return @@ -174,7 +174,7 @@ inhand_icon_state = "hardhat0_white" light_outer_range = 4 //Boss always takes the best stuff hat_type = "white" - clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | STACKABLE_HELMET_EXEMPT heat_protection = HEAD max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT cold_protection = HEAD @@ -191,9 +191,9 @@ icon_state = "hardhat0_pumpkin" inhand_icon_state = "hardhat0_pumpkin" hat_type = "pumpkin" - clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) light_outer_range = 2 //luminosity when on flags_cover = HEADCOVERSEYES light_color = "#fff2bf" @@ -211,7 +211,7 @@ if(light_on) . += emissive_appearance(icon, "carved_pumpkin-emissive", alpha = src.alpha) -/obj/item/clothing/head/hardhat/pumpkinhead/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/head/hardhat/pumpkinhead/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(light_on && !isinhands) . += emissive_appearance(icon_file, "carved_pumpkin-emissive", alpha = src.alpha) @@ -248,7 +248,7 @@ inhand_icon_state = "hardhat0_reindeer" hat_type = "reindeer" flags_inv = 0 - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) light_outer_range = 1 //luminosity when on diff --git a/code/modules/clothing/head/hat.dm b/code/modules/clothing/head/hat.dm index b5a3bcfa260d..f86e6a8e936b 100644 --- a/code/modules/clothing/head/hat.dm +++ b/code/modules/clothing/head/hat.dm @@ -4,7 +4,7 @@ desc = "It's good to be emperor." inhand_icon_state = "that" flags_inv = 0 - armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 30, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) strip_delay = 80 supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -72,7 +72,7 @@ icon_state = "cowboy" worn_icon_state = "hunter" inhand_icon_state = "hunter" - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/head/cowboy_hat_black @@ -165,7 +165,7 @@ desc = "A cap for a party coordinator, stylish!." icon_state = "capcap" inhand_icon_state = "that" - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/head/jackbros @@ -187,7 +187,7 @@ desc = "Worn by the finest of CentCom commanders. Inside the lining of the cap, lies two faint initials." inhand_icon_state = "that" flags_inv = 0 - armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 30, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) strip_delay = (8 SECONDS) /obj/item/clothing/head/human_leather diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 567e306280ff..610f403e627a 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -3,90 +3,49 @@ desc = "Standard Security gear. Protects the head from impacts." icon_state = "helmet" inhand_icon_state = "helmet" - armor = list(MELEE = 35, BULLET = 30, LASER = 30,ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50, WOUND = 10) + armor = list(BLUNT = 42, PUNCTURE = 25, SLASH = 25, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 - clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT flags_cover = HEADCOVERSEYES flags_inv = HIDEHAIR + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION 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. - var/obj/item/flashlight/seclite/attached_light - var/datum/action/item_action/toggle_helmet_flashlight/alight - /obj/item/clothing/head/helmet/Initialize(mapload) . = ..() - if(attached_light) - alight = new(src) AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HEAD) -/obj/item/clothing/head/helmet/Destroy() - var/obj/item/flashlight/seclite/old_light = set_attached_light(null) - if(old_light) - qdel(old_light) - return ..() - +/obj/item/clothing/head/helmet/sec -/obj/item/clothing/head/helmet/examine(mob/user) +/obj/item/clothing/head/helmet/sec/Initialize(mapload) . = ..() - if(attached_light) - . += "It has \a [attached_light] [can_flashlight ? "" : "permanently "]mounted on it." - if(can_flashlight) - . += span_info("[attached_light] looks like it can be unscrewed from [src].") - else if(can_flashlight) - . += "It has a mounting point for a seclite." - - -/obj/item/clothing/head/helmet/handle_atom_del(atom/A) - if(A == attached_light) - set_attached_light(null) - update_helmlight() - update_appearance() - QDEL_NULL(alight) - qdel(A) - return ..() - - -///Called when attached_light value changes. -/obj/item/clothing/head/helmet/proc/set_attached_light(obj/item/flashlight/seclite/new_attached_light) - if(attached_light == new_attached_light) - return - . = attached_light - attached_light = new_attached_light - if(attached_light) - attached_light.set_light_flags(attached_light.light_flags | LIGHT_ATTACHED) - if(attached_light.loc != src) - attached_light.forceMove(src) - else if(.) - var/obj/item/flashlight/seclite/old_attached_light = . - old_attached_light.set_light_flags(old_attached_light.light_flags & ~LIGHT_ATTACHED) - if(old_attached_light.loc == src) - old_attached_light.forceMove(get_turf(src)) - - -/obj/item/clothing/head/helmet/sec - can_flashlight = TRUE - -/obj/item/clothing/head/helmet/sec/attackby(obj/item/I, mob/user, params) - if(issignaler(I)) - var/obj/item/assembly/signaler/S = I - if(attached_light) //Has a flashlight. Player must remove it, else it will be lost forever. - to_chat(user, span_warning("The mounted flashlight is in the way, remove it first!")) - return - - if(S.secured) - qdel(S) - var/obj/item/bot_assembly/secbot/A = new - user.put_in_hands(A) - to_chat(user, span_notice("You add the signaler to the helmet.")) - qdel(src) - return + AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight") + +/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, params) + if(issignaler(attacking_item)) + var/obj/item/assembly/signaler/attached_signaler = attacking_item + // There's a flashlight in us. Remove it first, or it'll be lost forever! + var/obj/item/flashlight/seclite/blocking_us = locate() in src + if(blocking_us) + to_chat(user, span_warning("[blocking_us] is in the way, remove it first!")) + return TRUE + + if(!attached_signaler.secured) + to_chat(user, span_warning("Secure [attached_signaler] first!")) + return TRUE + to_chat(user, span_notice("You add [attached_signaler] to [src].")) + qdel(attached_signaler) + var/obj/item/bot_assembly/secbot/secbot_frame = new(loc) + + user.put_in_hands(secbot_frame) + qdel(src) + return TRUE return ..() /obj/item/clothing/head/helmet/alt @@ -94,28 +53,27 @@ desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "helmetalt" inhand_icon_state = "helmetalt" - armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, FIRE = 50, ACID = 50, WOUND = 5) - can_flashlight = TRUE + armor = list(BLUNT = 20, PUNCTURE = 60, SLASH = 25, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, FIRE = 50, ACID = 50) dog_fashion = null - supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION + +/obj/item/clothing/head/helmet/alt/Initialize(mapload) + . = ..() + AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight") /obj/item/clothing/head/helmet/marine name = "tactical combat helmet" desc = "A tactical black helmet, sealed from outside hazards with a plate of glass and not much else." icon_state = "marine_command" inhand_icon_state = "helmetalt" - armor = list(MELEE = 50, BULLET = 50, LASER = 30, ENERGY = 25, BOMB = 50, BIO = 100, FIRE = 40, ACID = 50, WOUND = 20) + armor = list(BLUNT = 60, PUNCTURE = 50, SLASH = 70, LASER = 30, ENERGY = 25, BOMB = 50, BIO = 100, FIRE = 40, ACID = 50) min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT - clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | STACKABLE_HELMET_EXEMPT resistance_flags = FIRE_PROOF | ACID_PROOF - can_flashlight = TRUE dog_fashion = null /obj/item/clothing/head/helmet/marine/Initialize(mapload) - set_attached_light(new /obj/item/flashlight/seclite) - update_helmlight() - update_appearance() . = ..() + AddComponent(/datum/component/seclite_attachable, starting_light = new /obj/item/flashlight/seclite(src), light_icon_state = "flight") /obj/item/clothing/head/helmet/marine/security name = "marine heavy helmet" @@ -149,7 +107,7 @@ 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 = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80, WOUND = 15) + armor = list(BLUNT = 60, PUNCTURE = 10, SLASH = 60, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) flags_inv = HIDEEARS|HIDEFACE|HIDESNOUT strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) @@ -161,20 +119,26 @@ supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/head/helmet/attack_self(mob/user) - if(can_toggle && !user.incapacitated()) - if(world.time > cooldown + toggle_cooldown) - cooldown = world.time - up = !up - flags_1 ^= visor_flags - flags_inv ^= visor_flags_inv - flags_cover ^= visor_flags_cover - icon_state = "[initial(icon_state)][up ? "up" : ""]" - to_chat(user, span_notice("[up ? alt_toggle_message : toggle_message] \the [src].")) - - user.update_worn_head() - if(iscarbon(user)) - var/mob/living/carbon/C = user - C.head_update(src, forced = 1) + . = ..() + if(.) + return + if(!can_toggle) + return + + if(user.incapacitated() || world.time <= cooldown + toggle_cooldown) + return + + cooldown = world.time + up = !up + flags_1 ^= visor_flags + flags_inv ^= visor_flags_inv + flags_cover ^= visor_flags_cover + icon_state = "[initial(icon_state)][up ? "up" : ""]" + to_chat(user, span_notice("[up ? alt_toggle_message : toggle_message] \the [src].")) + + if(iscarbon(user)) + var/mob/living/carbon/C = user + C.update_slots_for_item(src, user.get_slot_by_item(src), TRUE) /obj/item/clothing/head/helmet/justice name = "helmet of justice" @@ -216,12 +180,12 @@ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern." icon_state = "swatsyndie" inhand_icon_state = "swatsyndie" - armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 40, BOMB = 50, BIO = 90, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 90, FIRE = 100, ACID = 100) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT - clothing_flags = STOPSPRESSUREDAMAGE | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | STACKABLE_HELMET_EXEMPT strip_delay = 80 resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = null @@ -239,7 +203,7 @@ desc = "A british looking helmet." icon_state = "constable" inhand_icon_state = "constable" - custom_price = PAYCHECK_HARD * 1.5 + custom_price = PAYCHECK_ASSISTANT * 4.25 worn_y_offset = 4 /obj/item/clothing/head/helmet/swat/nanotrasen @@ -247,7 +211,7 @@ desc = "An extremely robust helmet with the Nanotrasen logo emblazoned on the top." icon_state = "swat" inhand_icon_state = "swat" - clothing_flags = PLASMAMAN_HELMET_EXEMPT + clothing_flags = STACKABLE_HELMET_EXEMPT cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -261,7 +225,7 @@ flags_inv = HIDEEARS|HIDEHAIR icon_state = "thunderdome" inhand_icon_state = "thunderdome" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -272,14 +236,14 @@ /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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 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 = 10, BOMB = 10, BIO = 0, FIRE = 100, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 0, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF icon_state = "roman" inhand_icon_state = "roman" @@ -288,7 +252,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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/roman/legionnaire name = "\improper Roman legionnaire helmet" @@ -298,7 +262,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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" @@ -315,7 +279,7 @@ icon_state = "redtaghelm" flags_cover = HEADCOVERSEYES inhand_icon_state = "redtaghelm" - armor = list(MELEE = 15, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 0, ACID = 50) + armor = list(BLUNT = 15, PUNCTURE = 10, SLASH = 0, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 0, ACID = 50) // Offer about the same protection as a hardhat. dog_fashion = null @@ -325,7 +289,7 @@ icon_state = "bluetaghelm" flags_cover = HEADCOVERSEYES inhand_icon_state = "bluetaghelm" - armor = list(MELEE = 15, BULLET = 10, LASER = 20,ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 0, ACID = 50) + armor = list(BLUNT = 15, PUNCTURE = 10, SLASH = 0, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 0, ACID = 50) // Offer about the same protection as a hardhat. dog_fashion = null @@ -334,7 +298,7 @@ desc = "A classic metal helmet." icon_state = "knight_green" inhand_icon_state = "knight_green" - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) // no wound armor cause getting domed in a bucket head sounds like concussion city + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 50, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) // no wound armor cause getting domed in a bucket head sounds like concussion city flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 @@ -357,7 +321,7 @@ desc = "A classic medieval helmet, if you hold it upside down you could see that it's actually a bucket." icon_state = "knight_greyscale" inhand_icon_state = "knight_greyscale" - armor = list(MELEE = 35, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, FIRE = 40, ACID = 40) + armor = list(BLUNT = 35, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, FIRE = 40, ACID = 40) material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix /obj/item/clothing/head/helmet/skull @@ -365,7 +329,7 @@ desc = "An intimidating tribal helmet, it doesn't look very comfortable." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT flags_cover = HEADCOVERSEYES - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 35, PUNCTURE = 25, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) icon_state = "skull" inhand_icon_state = "skull" strip_delay = 100 @@ -376,7 +340,7 @@ icon_state = "durathread" inhand_icon_state = "durathread" resistance_flags = FLAMMABLE - armor = list(MELEE = 20, BULLET = 10, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, FIRE = 40, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 0, SLASH = 15, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, FIRE = 40, ACID = 50) strip_delay = 60 /obj/item/clothing/head/helmet/rus_helmet @@ -384,7 +348,7 @@ desc = "It can hold a bottle of vodka." icon_state = "rus_helmet" inhand_icon_state = "rus_helmet" - armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 20, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 30, SLASH = 0, LASER = 0, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 20, ACID = 50) /obj/item/clothing/head/helmet/rus_helmet/Initialize(mapload) . = ..() @@ -399,14 +363,14 @@ body_parts_covered = HEAD cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT - armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, FIRE = -10, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 25, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, FIRE = -10, ACID = 50) /obj/item/clothing/head/helmet/infiltrator name = "infiltrator helmet" desc = "The galaxy isn't big enough for the two of us." icon_state = "infiltrator" inhand_icon_state = "infiltrator" - armor = list(MELEE = 40, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 70, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 40, LASER = 30, ENERGY = 40, BOMB = 70, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF flash_protect = FLASH_PROTECTION_WELDER flags_inv = HIDEHAIR|HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT @@ -419,7 +383,7 @@ desc = "A superb helmet made with the toughest and rarest materials available to man." icon_state = "h2helmet" inhand_icon_state = "h2helmet" - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 30, BOMB = 85, BIO = 10, FIRE = 65, ACID = 40, WOUND = 15) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 85, BIO = 10, FIRE = 65, ACID = 40) material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS //Can change color and add prefix flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -532,82 +496,3 @@ if(magnification) visible_message(span_warning("[src] falls off of [magnification]'s head as it changes shape!")) magnification.dropItemToGround(src) - -//LightToggle - -/obj/item/clothing/head/helmet/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/clothing/head/helmet/update_icon_state() - if(attached_light) - var/state = "[initial(icon_state)]" - if(attached_light.on) - state += "-flight-on" //"helmet-flight-on" // "helmet-cam-flight-on" - else - state += "-flight" //etc. - icon_state = state - return ..() - -/obj/item/clothing/head/helmet/ui_action_click(mob/user, action) - if(istype(action, alight)) - toggle_helmlight() - else - ..() - -/obj/item/clothing/head/helmet/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/flashlight/seclite)) - var/obj/item/flashlight/seclite/S = I - if(can_flashlight && !attached_light) - if(!user.transferItemToLoc(S, src)) - return - to_chat(user, span_notice("You click [S] into place on [src].")) - set_attached_light(S) - update_appearance() - update_helmlight() - alight = new(src) - if(loc == user) - alight.Grant(user) - return - return ..() - -/obj/item/clothing/head/helmet/screwdriver_act(mob/living/user, obj/item/I) - . = ..() - if(can_flashlight && attached_light) //if it has a light but can_flashlight is false, the light is permanently attached. - I.play_tool_sound(src) - to_chat(user, span_notice("You unscrew [attached_light] from [src].")) - attached_light.forceMove(drop_location()) - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(attached_light) - - var/obj/item/flashlight/removed_light = set_attached_light(null) - update_helmlight() - removed_light.update_brightness(user) - update_appearance() - user.update_worn_head() - QDEL_NULL(alight) - return TRUE - -/obj/item/clothing/head/helmet/proc/toggle_helmlight() - set name = "Toggle Helmetlight" - set category = "Object" - set desc = "Click to toggle your helmet's attached flashlight." - - if(!attached_light) - return - - var/mob/user = usr - if(user.incapacitated()) - return - attached_light.on = !attached_light.on - attached_light.update_brightness() - to_chat(user, span_notice("You toggle the helmet light [attached_light.on ? "on":"off"].")) - - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_helmlight() - -/obj/item/clothing/head/helmet/proc/update_helmlight() - if(attached_light) - update_appearance() - - update_action_buttons() diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 6905b48b18a3..fc694962e71c 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -50,7 +50,7 @@ icon_state = "captain" inhand_icon_state = "that" flags_inv = 0 - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/captain supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -76,7 +76,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 = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) dog_fashion = /datum/dog_fashion/head/hop //Chaplain @@ -94,9 +94,9 @@ //Detective /obj/item/clothing/head/fedora/det_hat - name = "detective's fedora" + name = "private investigator'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 = 35, BOMB = 0, BIO = 0, FIRE = 30, ACID = 50, WOUND = 5) + armor = list(BLUNT = 25, PUNCTURE = 5, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 0, BIO = 0, FIRE = 30, ACID = 50) icon_state = "detective" var/candy_cooldown = 0 dog_fashion = /datum/dog_fashion/head/detective @@ -114,7 +114,7 @@ /obj/item/clothing/head/fedora/det_hat/AltClick(mob/user) . = ..() - if(loc != user || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(loc != user || !user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_IGNORE_TK)) return if(candy_cooldown < world.time) var/obj/item/food/candy_corn/CC = new /obj/item/food/candy_corn(src) @@ -141,12 +141,26 @@ //Security +//Mars-Exec hats +/obj/item/clothing/head/garrison_cap + name = "mars garrison cap" + desc = "A folded garrison cap for Mars-Exec officers. Fancy, but it won't do much to protect your noggin." + icon_state = "garrison_sec" + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + +/obj/item/clothing/head/marshal_hat + name = "marshal's hat" + desc = "A wide-brimmed campaign hat with a thin kevlar lining. Don't be a fool, marshal." + //Only protects from ballistics, and still worse then a helmet. + armor = list(BLUNT = 20, PUNCTURE = 20, SLASH = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + icon_state = "marshalhat" + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + +//old sec hats /obj/item/clothing/head/hos - name = "head of security cap" - desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge." - armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 10, FIRE = 50, ACID = 60, WOUND = 10) + name = "security marshal cap" + desc = "The robust standard-issue cap of the Security Marshal. For showing the officers who's in charge." icon_state = "hoscap" - strip_delay = 80 supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -155,16 +169,16 @@ desc = "A black cap fit for a high ranking syndicate officer." /obj/item/clothing/head/hos/beret - name = "head of security's beret" - desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection." + name = "security marshal's beret" + desc = "A robust beret for the Security Marshal, for looking stylish while not sacrificing protection." icon_state = "beret_badge" greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn greyscale_colors = "#3F3C40#FFCE5B" /obj/item/clothing/head/hos/beret/navyhos - name = "head of security's formal beret" - desc = "A special beret with the Head of Security's insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction." + name = "security marshal's formal beret" + desc = "A special beret with the Security Marshal's insignia emblazoned on it. A symbol of excellence, a badge of courage, a mark of distinction." greyscale_colors = "#3C485A#FFCE5B" /obj/item/clothing/head/hos/beret/syndicate @@ -175,7 +189,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 = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 60, WOUND = 6) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 60) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -184,7 +198,7 @@ name = "warden's hat" desc = "A warden's red hat. Looking at it gives you the feeling of wanting to keep people in cells for as long as possible." icon_state = "wardenhat" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 60, WOUND = 6) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 60) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden_red supports_variations_flags = NONE @@ -266,8 +280,6 @@ greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn greyscale_colors = "#972A2A#F2F2F2" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 20, ACID = 50, WOUND = 4) - strip_delay = 60 dog_fashion = null flags_1 = NONE @@ -276,7 +288,6 @@ name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." greyscale_colors = "#3C485A#00AEEF" - strip_delay = 60 /obj/item/clothing/head/beret/sec/navyofficer desc = "A special beret with the security insignia emblazoned on it. For officers with class." @@ -367,7 +378,7 @@ greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn greyscale_colors = "#C5D4F3#ECF1F8" - armor = list(MELEE = 15, BULLET = 5, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 30, ACID = 5, WOUND = 4) + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 30, ACID = 5) /obj/item/clothing/head/beret/highlander desc = "That was white fabric. Was." @@ -387,7 +398,7 @@ greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn greyscale_colors = "#397F3F#FFCE5B" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 90) strip_delay = 10 SECONDS diff --git a/code/modules/clothing/head/pirate.dm b/code/modules/clothing/head/pirate.dm index 0ddaa4bd6390..66225045aae2 100644 --- a/code/modules/clothing/head/pirate.dm +++ b/code/modules/clothing/head/pirate.dm @@ -26,7 +26,7 @@ to_chat(user, span_boldnotice("You can no longer speak like a pirate.")) /obj/item/clothing/head/pirate/armored - armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 @@ -43,6 +43,6 @@ /obj/item/clothing/head/bandana/armored - armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 6ad62aa515db..70b25ca16177 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -24,7 +24,7 @@ /obj/item/clothing/head/soft/AltClick(mob/user) ..() - if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) flip(user) @@ -136,8 +136,6 @@ desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" soft_type = "sec" - armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 20, ACID = 50) - strip_delay = 60 dog_fashion = null supports_variations_flags = NONE diff --git a/code/modules/clothing/head/tinfoilhat.dm b/code/modules/clothing/head/tinfoilhat.dm index acac3e40f433..c963356027ff 100644 --- a/code/modules/clothing/head/tinfoilhat.dm +++ b/code/modules/clothing/head/tinfoilhat.dm @@ -3,7 +3,7 @@ desc = "Thought control rays, psychotronic scanning. Don't mind that, I'm protected cause I made this hat." icon_state = "foilhat" inhand_icon_state = "foilhat" - armor = list(MELEE = 0, BULLET = 0, LASER = -5,ENERGY = -15, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = -5, ENERGY = -15, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) equip_delay_other = 140 clothing_flags = ANTI_TINFOIL_MANEUVER var/datum/brain_trauma/mild/phobia/conspiracies/paranoia diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm index dd60bab05109..0ac3880f06a5 100644 --- a/code/modules/clothing/head/tophat.dm +++ b/code/modules/clothing/head/tophat.dm @@ -22,7 +22,7 @@ COOLDOWN_START(src, rabbit_cooldown, RABBIT_CD_TIME) playsound(get_turf(src), 'sound/weapons/emitter.ogg', 70) - do_smoke(range=1, location=src, smoke_type=/obj/effect/particle_effect/smoke/quick) + do_smoke(range=1, location=src, smoke_type=/obj/effect/particle_effect/fluid/smoke/quick) if(prob(10)) magician.visible_message(span_danger("[magician] taps [src] with [hitby_wand], then reaches in and pulls out a bu- wait, those are bees!"), span_danger("You tap [src] with your [hitby_wand.name] and pull out... BEES!")) diff --git a/code/modules/clothing/head/welding.dm b/code/modules/clothing/head/welding.dm index 15a817e6da49..af6032d5589d 100644 --- a/code/modules/clothing/head/welding.dm +++ b/code/modules/clothing/head/welding.dm @@ -7,13 +7,13 @@ custom_materials = list(/datum/material/iron=1750, /datum/material/glass=400) flash_protect = FLASH_PROTECTION_WELDER tint = 2 - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 60) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 60) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT actions_types = list(/datum/action/item_action/toggle) visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF resistance_flags = FIRE_PROOF - clothing_flags = SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = SNUG_FIT | STACKABLE_HELMET_EXEMPT supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/head/welding/attack_self(mob/user) diff --git a/code/modules/clothing/head/wig.dm b/code/modules/clothing/head/wig.dm index cd9c62b5d570..54e7e0519a5a 100644 --- a/code/modules/clothing/head/wig.dm +++ b/code/modules/clothing/head/wig.dm @@ -30,7 +30,7 @@ return ..() -/obj/item/clothing/head/wig/worn_overlays(mutable_appearance/standing, isinhands = FALSE, file2use) +/obj/item/clothing/head/wig/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE, file2use) . = ..() if(isinhands) return @@ -49,7 +49,7 @@ /obj/item/clothing/head/wig/attack_self(mob/user) var/new_style = tgui_input_list(user, "Select a hairstyle", "Wig Styling", GLOB.hairstyles_list - "Bald") var/newcolor = adjustablecolor ? input(usr,"","Choose Color",color) as color|null : null - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(new_style && new_style != hairstyle) hairstyle = new_style @@ -95,7 +95,7 @@ desc = "A bunch of hair without a head attached. This one changes color to match the hair of the wearer. Nothing natural about that." color = "#FFFFFF" adjustablecolor = FALSE - custom_price = PAYCHECK_HARD + custom_price = PAYCHECK_ASSISTANT * 2.25 /obj/item/clothing/head/wig/natural/Initialize(mapload) hairstyle = pick(GLOB.hairstyles_list - "Bald") diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index 3c320c53bcfe..81606755bfd0 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -6,6 +6,7 @@ strip_delay = 40 equip_delay_other = 40 supports_variations_flags = CLOTHING_SNOUTED_VARIATION | CLOTHING_VOX_VARIATION + var/modifies_speech = FALSE var/mask_adjusted = FALSE var/adjusted_flags = null @@ -18,6 +19,21 @@ var/status = !(clothing_flags & VOICEBOX_DISABLED) to_chat(user, span_notice("You turn the voice box in [src] [status ? "on" : "off"].")) +/obj/item/clothing/mask/attackby(obj/item/W, mob/user, params) + . = ..() + if(istype(W, /obj/item/voice_changer)) + if(!(flags_inv & HIDEFACE)) + to_chat(user, span_warning("[src] is not compatible with [W].")) + return TRUE + if(!user.is_holding(src)) + to_chat(user, span_warning("You must be holding [src] to do that.")) + return TRUE + if(!do_after(user, src, 5 SECONDS, DO_PUBLIC, display = W)) + return TRUE + AddComponent(/datum/component/voice_changer, W) + to_chat(user, span_notice("You insert [W] into [src].")) + return TRUE + /obj/item/clothing/mask/equipped(mob/M, slot) . = ..() if (slot == ITEM_SLOT_MASK && modifies_speech) @@ -43,7 +59,7 @@ /obj/item/clothing/mask/proc/handle_speech() SIGNAL_HANDLER -/obj/item/clothing/mask/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/mask/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return @@ -51,28 +67,35 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - if(HAS_BLOOD_DNA(src)) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") -/obj/item/clothing/mask/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_mask() + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/head = wearer.get_bodypart(BODY_ZONE_HEAD) + if(!head?.icon_bloodycover) + return + var/image/bloody_overlay = image(head.icon_bloodycover, "maskblood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay + else + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") //Proc that moves gas/breath masks out of the way, disabling them and allowing pill/food consumption -/obj/item/clothing/mask/proc/adjustmask(mob/living/user) +/obj/item/clothing/mask/proc/adjustmask(mob/living/carbon/user) if(user?.incapacitated()) return + mask_adjusted = !mask_adjusted + if(!mask_adjusted) - src.icon_state = initial(icon_state) + icon_state = initial(icon_state) permeability_coefficient = initial(permeability_coefficient) clothing_flags |= visor_flags flags_inv |= visor_flags_inv flags_cover |= visor_flags_cover to_chat(user, span_notice("You push \the [src] back into place.")) slot_flags = initial(slot_flags) + else icon_state += "_up" to_chat(user, span_notice("You push \the [src] out of the way.")) @@ -82,9 +105,16 @@ flags_cover &= ~visor_flags_cover if(adjusted_flags) slot_flags = adjusted_flags - if(user) + + if(!istype(user)) + return + + if(user.wear_mask == src) + user.update_slots_for_item(src, ITEM_SLOT_MASK, TRUE) user.wear_mask_update(src, toggle_off = mask_adjusted) - user?.update_mob_action_buttons() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off. + + if(loc == user) + user.update_mob_action_buttons() //when mask is adjusted out, we update all buttons icon so the user's potential internal tank correctly shows as off. /** * Proc called in lungs.dm to act if wearing a mask with filters, used to reduce the filters durability, return a changed gas mixture depending on the filter status diff --git a/code/modules/clothing/masks/bandana.dm b/code/modules/clothing/masks/bandana.dm index 71de62a82d56..b15ff3f7a41b 100644 --- a/code/modules/clothing/masks/bandana.dm +++ b/code/modules/clothing/masks/bandana.dm @@ -6,7 +6,6 @@ visor_flags_cover = MASKCOVERSMOUTH slot_flags = ITEM_SLOT_MASK adjusted_flags = ITEM_SLOT_HEAD - species_exception = list(/datum/species/golem) dying_key = DYE_REGISTRY_BANDANA flags_1 = IS_PLAYER_COLORABLE_1 name = "bandana" diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 9fc658228379..b3505351e558 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -20,11 +20,9 @@ flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT visor_flags_inv = HIDEFACE|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_SMALL - armor = list(MELEE = 10, BULLET = 5, LASER = 5,ENERGY = 5, BOMB = 0, BIO = 0, FIRE = 100, ACID = 40) + armor = list(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 0, FIRE = 100, ACID = 40) resistance_flags = FIRE_PROOF | ACID_PROOF - var/voice_unknown = FALSE ///This makes it so that your name shows up as unknown when wearing the mask. - /obj/item/clothing/mask/infiltrator/equipped(mob/living/carbon/human/user, slot) . = ..() if(slot != ITEM_SLOT_MASK) @@ -32,15 +30,15 @@ to_chat(user, "You roll the balaclava over your face, and a data display appears before your eyes.") ADD_TRAIT(user, TRAIT_DIAGNOSTIC_HUD, MASK_TRAIT) var/datum/atom_hud/H = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] - H.add_hud_to(user) - voice_unknown = TRUE + H.show_to(user) + ADD_TRAIT(src, TRAIT_HIDES_VOICE, REF(src)) /obj/item/clothing/mask/infiltrator/dropped(mob/living/carbon/human/user) to_chat(user, "You pull off the balaclava, and the mask's internal hud system switches off quietly.") + REMOVE_TRAIT(src, TRAIT_HIDES_VOICE, REF(src)) REMOVE_TRAIT(user, TRAIT_DIAGNOSTIC_HUD, MASK_TRAIT) var/datum/atom_hud/H = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] - H.remove_hud_from(user) - voice_unknown = FALSE + H.hide_from(user) return ..() /obj/item/clothing/mask/luchador diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 89c6842ea05b..c2eb2a528186 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -23,7 +23,7 @@ /obj/item/clothing/mask/breath/AltClick(mob/user) ..() - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) adjustmask(user) /obj/item/clothing/mask/breath/examine(mob/user) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index dd43d30e8209..b285a759ed64 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -92,7 +92,7 @@ desc = "Improved gas mask utilized by atmospheric technicians. It's flameproof!" icon_state = "gas_atmos" inhand_icon_state = "gas_atmos" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 10) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 10) permeability_coefficient = 0.001 resistance_flags = FIRE_PROOF max_filters = 3 @@ -123,7 +123,7 @@ flash_protect = FLASH_PROTECTION_WELDER custom_materials = list(/datum/material/iron=4000, /datum/material/glass=2000) tint = 2 - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 55) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 55) actions_types = list(/datum/action/item_action/toggle) flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT flags_cover = MASKCOVERSEYES @@ -148,11 +148,11 @@ 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" inhand_icon_state = "gas_mask" - armor = list(MELEE = 0, BULLET = 0, LASER = 2,ENERGY = 2, BOMB = 0, BIO = 75, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 2, ENERGY = 2, BOMB = 0, BIO = 75, FIRE = 0, ACID = 0) flags_cover = MASKCOVERSEYES /obj/item/clothing/mask/gas/syndicate - name = "syndicate mask" + name = "red gasmask" desc = "A close-fitting tactical mask that can be connected to an air supply." icon_state = "syndicate" resistance_flags = FIRE_PROOF | ACID_PROOF @@ -171,7 +171,6 @@ resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) dog_fashion = /datum/dog_fashion/head/clown - species_exception = list(/datum/species/golem/bananium) var/list/clownmask_designs = list() /obj/item/clothing/mask/gas/clown_hat/plasmaman @@ -186,7 +185,6 @@ "The Madman" = image(icon = src.icon, icon_state = "joker"), "The Rainbow Color" = image(icon = src.icon, icon_state = "rainbow") ) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) /obj/item/clothing/mask/gas/clown_hat/ui_action_click(mob/user) if(!istype(user) || user.incapacitated()) @@ -218,7 +216,6 @@ inhand_icon_state = "sexyclown" flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE - species_exception = list(/datum/species/golem/bananium) /obj/item/clothing/mask/gas/mime name = "mime mask" @@ -230,7 +227,7 @@ flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE actions_types = list(/datum/action/item_action/adjust) - species_exception = list(/datum/species/golem) + var/list/mimemask_designs = list() /obj/item/clothing/mask/gas/mime/plasmaman @@ -283,7 +280,7 @@ inhand_icon_state = "sexymime" flags_cover = MASKCOVERSEYES resistance_flags = FLAMMABLE - species_exception = list(/datum/species/golem) + /obj/item/clothing/mask/gas/cyborg name = "cyborg visor" @@ -317,7 +314,6 @@ max_integrity = 100 actions_types = list(/datum/action/item_action/adjust) dog_fashion = null - species_exception = list(/datum/species/golem/wood) var/list/tikimask_designs = list() /obj/item/clothing/mask/gas/tiki_mask/Initialize(mapload) diff --git a/code/modules/clothing/masks/moustache.dm b/code/modules/clothing/masks/moustache.dm index 922c2daf371c..abea527f1e44 100644 --- a/code/modules/clothing/masks/moustache.dm +++ b/code/modules/clothing/masks/moustache.dm @@ -4,7 +4,7 @@ icon_state = "fake-moustache" w_class = WEIGHT_CLASS_TINY flags_inv = HIDEFACE - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/mask/fakemoustache/italian diff --git a/code/modules/clothing/masks/surgical.dm b/code/modules/clothing/masks/surgical.dm index 4c870f0076b7..b8a392297963 100644 --- a/code/modules/clothing/masks/surgical.dm +++ b/code/modules/clothing/masks/surgical.dm @@ -9,7 +9,7 @@ visor_flags_inv = HIDEFACE|HIDESNOUT visor_flags_cover = MASKCOVERSMOUTH permeability_coefficient = 0.01 - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 25, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 25, FIRE = 0, ACID = 0) actions_types = list(/datum/action/item_action/adjust) supports_variations_flags = CLOTHING_SNOUTED_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index d7400638248c..be3e143009f8 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -8,7 +8,7 @@ strip_delay = 40 equip_delay_other = 40 -/obj/item/clothing/neck/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/neck/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return @@ -16,8 +16,17 @@ if(body_parts_covered & HEAD) if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedmask") - if(HAS_BLOOD_DNA(src)) - . += mutable_appearance('icons/effects/blood.dmi', "maskblood") + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/head = wearer.get_bodypart(BODY_ZONE_HEAD) + if(!head?.icon_bloodycover) + return + var/image/bloody_overlay = image(head.icon_bloodycover, "maskblood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay + else + . += mutable_appearance('icons/effects/blood.dmi', "maskblood") /obj/item/clothing/neck/tie name = "tie" @@ -28,7 +37,7 @@ fallback_colors = list(list(16, 20)) fallback_icon_state = "tie" w_class = WEIGHT_CLASS_SMALL - custom_price = PAYCHECK_EASY + custom_price = PAYCHECK_ASSISTANT * 1.4 /obj/item/clothing/neck/tie/blue name = "blue tie" @@ -83,7 +92,7 @@ if(carbon_patient.stat != DEAD && !(HAS_TRAIT(carbon_patient, TRAIT_FAKEDEATH))) if(istype(heart)) - heart_strength = (heart.beating ? "a healthy" : span_danger("an unstable")) + heart_strength = (heart.pulse == PULSE_NORM ? "a healthy" : span_danger("an unstable")) if(istype(lungs)) lung_strength = ((carbon_patient.failed_last_breath || carbon_patient.losebreath) ? span_danger("strained") : "healthy") @@ -105,7 +114,7 @@ desc = "A stylish scarf. The perfect winter accessory for those with a keen fashion sense, and those who just can't handle a cold breeze on their necks." w_class = WEIGHT_CLASS_TINY dog_fashion = /datum/dog_fashion/head - custom_price = PAYCHECK_EASY + custom_price = PAYCHECK_ASSISTANT * 1.6 /obj/item/clothing/neck/scarf/black name = "black scarf" @@ -229,7 +238,7 @@ var/true_price = round(price*profit_scaling) to_chat(user, span_notice("[selling ? "Sold" : "Getting the price of"] [I], value: [true_price] credits[I.contents.len ? " (exportable contents included)" : ""].[profit_scaling < 1 && selling ? "[round(price-true_price)] credit\s taken as processing fee\s." : ""]")) if(selling) - new /obj/item/holochip(get_turf(user),true_price) + SSeconomy.spawn_cash_for_amount(true_price, get_turf(user)) else to_chat(user, span_warning("There is no export value for [I] or any items within it.")) diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index 8e4ba3f3d994..1597c409f736 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -3,7 +3,7 @@ return var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//hmm lets have centcom officials become revs - L.implant(H, null, 1) + L.implant(H, null, BODY_ZONE_CHEST, TRUE) /datum/outfit/centcom/ert name = "ERT Common" @@ -22,7 +22,7 @@ R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) if(W) W.registered_name = H.real_name W.update_label() @@ -57,12 +57,12 @@ name = "ERT Commander - High Alert" backpack_contents = list( - /obj/item/gun/energy/pulse/pistol/loyalpin = 1, + /obj/item/gun/energy/pulse/pistol = 1, /obj/item/melee/baton/security/loaded = 1, /obj/item/storage/box/survival/engineer = 1, + /obj/item/melee/energy/sword/saber = 1, ) glasses = /obj/item/clothing/glasses/thermal/eyepatch - l_pocket = /obj/item/melee/energy/sword/saber /datum/outfit/centcom/ert/security name = "ERT Security" @@ -93,7 +93,7 @@ /datum/outfit/centcom/ert/security/alert name = "ERT Security - High Alert" - l_hand = /obj/item/gun/energy/pulse/carbine/loyalpin + l_hand = /obj/item/gun/energy/pulse/carbine backpack_contents = list( /obj/item/melee/baton/security/loaded = 1, /obj/item/storage/belt/security/full = 1, @@ -133,7 +133,7 @@ name = "ERT Medic - High Alert" backpack_contents = list( - /obj/item/gun/energy/pulse/pistol/loyalpin = 1, + /obj/item/gun/energy/pulse/pistol = 1, /obj/item/gun/medbeam = 1, /obj/item/melee/baton/security/loaded = 1, /obj/item/reagent_containers/hypospray/combat/nanites = 1, @@ -174,7 +174,7 @@ backpack_contents = list( /obj/item/construction/rcd/combat = 1, - /obj/item/gun/energy/pulse/pistol/loyalpin = 1, + /obj/item/gun/energy/pulse/pistol = 1, /obj/item/melee/baton/security/loaded = 1, /obj/item/pipe_dispenser = 1, /obj/item/storage/box/survival/engineer = 1, @@ -208,7 +208,7 @@ pda.saved_identification = H.real_name pda.saved_job = "CentCom Official" - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -352,7 +352,7 @@ ADD_TRAIT(H, TRAIT_NAIVE, INNATE_TRAIT) H.dna.add_mutation(/datum/mutation/human/clumsy) for(var/datum/mutation/human/clumsy/M in H.dna.mutations) - M.mutadone_proof = TRUE + M.ryetalyn_proof = TRUE /datum/outfit/centcom/centcom_intern name = "CentCom Intern" @@ -377,7 +377,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -510,6 +510,7 @@ /obj/item/storage/box/flashbangs = 1, /obj/item/storage/box/survival/engineer = 1, /obj/item/storage/medkit/regular = 1, + /obj/item/melee/energy/sword/saber = 1, ) belt = /obj/item/gun/ballistic/revolver/mateba ears = /obj/item/radio/headset/headset_cent/alt @@ -517,9 +518,8 @@ gloves = /obj/item/clothing/gloves/tackler/combat/insulated mask = /obj/item/clothing/mask/gas/sechailer/swat shoes = /obj/item/clothing/shoes/combat/swat - l_pocket = /obj/item/melee/energy/sword/saber r_pocket = /obj/item/shield/energy - l_hand = /obj/item/gun/energy/pulse/loyalpin + l_hand = /obj/item/gun/energy/pulse skillchips = list( /obj/item/skillchip/disk_verifier, @@ -532,7 +532,7 @@ var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -590,7 +590,7 @@ id = /obj/item/card/id/advanced/centcom/ert/medical suit = /obj/item/clothing/suit/armor/vest/marine/medic - suit_store = /obj/item/storage/belt/holster/detective/full/ert + suit_store = /obj/item/storage/belt/holster/shoulder/ert/full back = /obj/item/storage/backpack/ert/medical l_pocket = /obj/item/healthanalyzer head = /obj/item/clothing/head/helmet/marine/medic diff --git a/code/modules/clothing/outfits/plasmaman.dm b/code/modules/clothing/outfits/plasmaman.dm index b855018e97e3..833c719cf60c 100644 --- a/code/modules/clothing/outfits/plasmaman.dm +++ b/code/modules/clothing/outfits/plasmaman.dm @@ -15,7 +15,7 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/security /datum/outfit/plasmaman/detective - name = "Detective Plasmaman" + name = "Private Investigator Plasmaman" uniform = /obj/item/clothing/under/plasmaman/enviroslacks gloves = /obj/item/clothing/gloves/color/plasmaman/white @@ -134,7 +134,7 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/white /datum/outfit/plasmaman/curator - name = "Curator Plasmaman" + name = "Archivist Plasmaman" uniform = /obj/item/clothing/under/plasmaman/curator gloves = /obj/item/clothing/gloves/color/plasmaman/prototype @@ -192,7 +192,7 @@ head = /obj/item/clothing/head/helmet/space/plasmaman/head_of_personnel /datum/outfit/plasmaman/head_of_security - name = "Head of Security Plasmaman" + name = JOB_SECURITY_MARSHAL + " Plasmaman" uniform = /obj/item/clothing/under/plasmaman/security/head_of_security gloves = /obj/item/clothing/gloves/color/plasmaman/black diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 4aa38d0f8ac1..7c148c650811 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -19,7 +19,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -164,7 +164,7 @@ id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/pirate/silverscale uniform = /obj/item/clothing/under/syndicate/sniper - suit = /obj/item/clothing/suit/armor/vest/alt + suit = /obj/item/clothing/suit/armor/vest glasses = /obj/item/clothing/glasses/monocle gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/collectable/tophat @@ -198,7 +198,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -236,7 +236,7 @@ gloves = /obj/item/clothing/gloves/color/black glasses = /obj/item/clothing/glasses/sunglasses shoes = /obj/item/clothing/shoes/sneakers/black - l_pocket = /obj/item/melee/energy/sword/saber + r_hand = /obj/item/melee/energy/sword/saber l_hand = /obj/item/storage/secure/briefcase /datum/outfit/assassin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) @@ -261,7 +261,7 @@ pda.saved_identification = H.real_name pda.saved_job = "Reaper" - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -288,7 +288,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -376,7 +376,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() @@ -400,7 +400,7 @@ if(visualsOnly) return - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -445,7 +445,7 @@ internals_slot = ITEM_SLOT_SUITSTORE /datum/outfit/debug/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() @@ -477,7 +477,19 @@ internals_slot = ITEM_SLOT_SUITSTORE /datum/outfit/admin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) W.registered_name = H.real_name W.update_label() W.update_icon() + +/datum/outfit/gamemaster + name = "Admin outfit (Gamemaster)" + + suit = /obj/item/clothing/suit/hooded/gamemaster + shoes = /obj/item/clothing/shoes/sandal/gamemaster + +/datum/outfit/gamemaster/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + var/obj/item/clothing/suit/hooded/gamemaster/robe = H.wear_suit + robe.ToggleHood() + + H.set_real_name("Gamemaster", TRUE) diff --git a/code/modules/clothing/outfits/vr.dm b/code/modules/clothing/outfits/vr.dm index 3e7653f84010..4c4e7970d267 100644 --- a/code/modules/clothing/outfits/vr.dm +++ b/code/modules/clothing/outfits/vr.dm @@ -31,9 +31,9 @@ var/obj/item/uplink/U = new /obj/item/uplink/nuclear_restricted(H, H.key, 80) 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) + W.implant(H, body_zone = BODY_ZONE_CHEST) var/obj/item/implant/explosive/E = new/obj/item/implant/explosive(H) - E.implant(H) + E.implant(H, body_zone = BODY_ZONE_CHEST) H.faction |= ROLE_SYNDICATE H.update_icons() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index f92064f9dd67..8d86f66a285c 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -14,6 +14,7 @@ permeability_coefficient = 0.5 slowdown = SHOES_SLOWDOWN strip_delay = 1 SECONDS + var/offset = 0 var/equipped_before_drop = FALSE ///Whether these shoes have laces that can be tied/untied @@ -25,6 +26,11 @@ ///An active alert var/datum/weakref/our_alert_ref + /// The amount of blood on us + var/tmp/blood_on_feet + var/tmp/bloot_on_feet_color + var/tmp/list/feet_blood_DNA + /obj/item/clothing/shoes/suicide_act(mob/living/carbon/user) if(rand(2)>1) user.visible_message(span_suicide("[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -43,18 +49,28 @@ playsound(user, 'sound/weapons/genhit2.ogg', 50, TRUE) return(BRUTELOSS) -/obj/item/clothing/shoes/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/shoes/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damagedshoe") - if(HAS_BLOOD_DNA(src)) - if(clothing_flags & LARGE_WORN_ICON) - . += mutable_appearance('icons/effects/64x64.dmi', "shoeblood_large") + + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/leg = wearer.get_bodypart(BODY_ZONE_R_LEG) || wearer.get_bodypart(BODY_ZONE_L_LEG) + if(!leg?.icon_bloodycover) + return + var/image/bloody_overlay = image(leg.icon_bloodycover, "shoeblood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay else - . += mutable_appearance('icons/effects/blood.dmi', "shoeblood") + if(clothing_flags & LARGE_WORN_ICON) + . += mutable_appearance('icons/effects/64x64.dmi', "shoeblood_large") + else + . += image('icons/effects/blood.dmi', "shoeblood") /obj/item/clothing/shoes/examine(mob/user) . = ..() @@ -95,12 +111,6 @@ restore_offsets(user) . = ..() -/obj/item/clothing/shoes/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_shoes() - /** * adjust_laces adjusts whether our shoes (assuming they can_be_tied) and tied, untied, or knotted * @@ -198,7 +208,8 @@ if(istype(L)) var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) if(ouchie) - ouchie.receive_damage(brute = 10, stamina = 40) + ouchie.receive_damage(brute = 10) + L.stamina.adjust(-40) L.Paralyze(10) ///checking to make sure we're still on the person we're supposed to be, for lacing do_after's @@ -216,7 +227,6 @@ our_guy.Paralyze(5) our_guy.Knockdown(10) our_guy.visible_message(span_danger("[our_guy] trips on [our_guy.p_their()] knotted shoelaces and falls! What a klutz!"), span_userdanger("You trip on your knotted shoelaces and fall over!")) - SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now! our_alert_ref = WEAKREF(our_guy.throw_alert(ALERT_SHOES_KNOT, /atom/movable/screen/alert/shoes/knotted)) else if(tied == SHOES_UNTIED) @@ -225,7 +235,6 @@ if(1) // .1% chance to trip and fall over (note these are per step while our laces are undone) our_guy.Paralyze(5) our_guy.Knockdown(10) - SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now! our_guy.visible_message(span_danger("[our_guy] trips on [our_guy.p_their()] untied shoelaces and falls! What a klutz!"), span_userdanger("You trip on your untied shoelaces and fall over!")) if(2 to 5) // .4% chance to stumble and lurch forward @@ -248,7 +257,6 @@ if(26 to 1000) wiser = FALSE if(wiser) - SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "untied", /datum/mood_event/untied) // well we realized they're untied now! our_alert_ref = WEAKREF(our_guy.throw_alert(ALERT_SHOES_KNOT, /atom/movable/screen/alert/shoes/untied)) @@ -275,3 +283,6 @@ if(do_after(user, src, lace_time,extra_checks = CALLBACK(src, PROC_REF(still_shoed), user))) to_chat(user, span_notice("You [tied ? "untie" : "tie"] the laces on [src].")) adjust_laces(tied ? SHOES_UNTIED : SHOES_TIED, user) + + +/obj/item/clothing/shoes/proc/update_bloody_feet() diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm index 658a946c5b94..fd2669e24968 100644 --- a/code/modules/clothing/shoes/bananashoes.dm +++ b/code/modules/clothing/shoes/bananashoes.dm @@ -20,8 +20,6 @@ if(always_noslip) LAZYDISTINCTADD(clothing_traits, TRAIT_NO_SLIP_WATER) -/obj/item/clothing/shoes/clown_shoes/banana_shoes/ComponentInitialize() - . = ..() AddElement(/datum/element/update_icon_updates_onmob) AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_FEET) AddComponent(/datum/component/material_container, list(/datum/material/bananium), 100 * MINERAL_MATERIAL_AMOUNT, MATCONTAINER_EXAMINE|MATCONTAINER_ANY_INTENT|MATCONTAINER_SILENT, allowed_items=/obj/item/stack) diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm index 8d2a1322632a..20cadf23bebc 100644 --- a/code/modules/clothing/shoes/boots.dm +++ b/code/modules/clothing/shoes/boots.dm @@ -5,7 +5,7 @@ inhand_icon_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, FIRE = 70, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 25, SLASH = 0, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, FIRE = 70, ACID = 50) strip_delay = 40 resistance_flags = NONE lace_time = 12 SECONDS @@ -30,7 +30,7 @@ desc = "High speed, no drag combat boots." permeability_coefficient = 0.01 clothing_traits = list(TRAIT_NO_SLIP_WATER) - armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, FIRE = 90, ACID = 50) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, FIRE = 90, ACID = 50) /obj/item/clothing/shoes/jackboots name = "jackboots" @@ -42,7 +42,7 @@ strip_delay = 30 equip_delay_other = 50 resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 0, ACID = 0) can_be_tied = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -91,7 +91,6 @@ strip_delay = 20 equip_delay_other = 40 lace_time = 8 SECONDS - species_exception = list(/datum/species/golem/uranium) /obj/item/clothing/shoes/workboots/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/shoes/clown.dm b/code/modules/clothing/shoes/clown.dm index 25a490cd5f97..52fe4d163d9d 100644 --- a/code/modules/clothing/shoes/clown.dm +++ b/code/modules/clothing/shoes/clown.dm @@ -6,7 +6,6 @@ slowdown = SHOES_SLOWDOWN+1 var/enabled_waddle = TRUE lace_time = 20 SECONDS // how the hell do these laces even work?? - species_exception = list(/datum/species/golem/bananium) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/shoes/clown_shoes/Initialize(mapload) @@ -14,21 +13,16 @@ create_storage(type = /datum/storage/pockets/shoes/clown) LoadComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() if(slot == ITEM_SLOT_FEET) if(enabled_waddle) ADD_WADDLE(user, WADDLE_SOURCE_CLOWNSHOES) - if(is_clown_job(user.mind?.assigned_role)) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "clownshoes", /datum/mood_event/clownshoes) /obj/item/clothing/shoes/clown_shoes/dropped(mob/user) . = ..() REMOVE_WADDLE(user, WADDLE_SOURCE_CLOWNSHOES) - if(is_clown_job(user.mind?.assigned_role)) - SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "clownshoes") /obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user) if(!isliving(user)) diff --git a/code/modules/clothing/shoes/costume.dm b/code/modules/clothing/shoes/costume.dm index 33bf5bdca27e..71aeeda1d32c 100644 --- a/code/modules/clothing/shoes/costume.dm +++ b/code/modules/clothing/shoes/costume.dm @@ -17,7 +17,7 @@ /obj/item/clothing/shoes/griffin/Initialize(mapload) . = ..() - + create_storage(type = /datum/storage/pockets/shoes) /obj/item/clothing/shoes/singery @@ -48,7 +48,7 @@ name = "grilling sandals" icon_state = "cookflops" can_be_tied = FALSE - species_exception = list(/datum/species/golem) + /obj/item/clothing/shoes/yakuza name = "tojo clan shoes" diff --git a/code/modules/clothing/shoes/cowboy.dm b/code/modules/clothing/shoes/cowboy.dm index ed551db7c24a..21030608a4fc 100644 --- a/code/modules/clothing/shoes/cowboy.dm +++ b/code/modules/clothing/shoes/cowboy.dm @@ -2,8 +2,8 @@ name = "cowboy boots" desc = "A small sticker lets you know they've been inspected for snakes, It is unclear how long ago the inspection took place..." icon_state = "cowboy_brown" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 0, ACID = 0) //these are quite tall - custom_price = PAYCHECK_MEDIUM + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 90, FIRE = 0, ACID = 0) //these are quite tall + custom_price = PAYCHECK_ASSISTANT * 1.3 var/max_occupants = 4 can_be_tied = FALSE @@ -43,9 +43,8 @@ /obj/item/clothing/shoes/cowboy/proc/handle_table_slam(mob/living/user) user.say(pick("Hot damn!", "Hoo-wee!", "Got-dang!"), spans = list(SPAN_YELL), forced=TRUE) - user.client?.give_award(/datum/award/achievement/misc/hot_damn, user) -/obj/item/clothing/shoes/cowboy/MouseDrop_T(mob/living/target, mob/living/user) +/obj/item/clothing/shoes/cowboy/MouseDroppedOn(mob/living/target, mob/living/user) . = ..() if(!(user.mobility_flags & MOBILITY_USE) || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !Adjacent(user) || !isliving(target) || !user.Adjacent(target) || target.stat == DEAD) return @@ -80,7 +79,7 @@ name = "lizard skin boots" desc = "You can hear a faint hissing from inside the boots; you hope it is just a mournful ghost." icon_state = "lizardboots_green" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 0) //lizards like to stay warm + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 0) //lizards like to stay warm /obj/item/clothing/shoes/cowboy/lizard/masterwork name = "\improper Hugs-The-Feet lizard skin boots" diff --git a/code/modules/clothing/shoes/galoshes.dm b/code/modules/clothing/shoes/galoshes.dm index a92ea6d5e5ad..90ac52aa50de 100644 --- a/code/modules/clothing/shoes/galoshes.dm +++ b/code/modules/clothing/shoes/galoshes.dm @@ -8,9 +8,9 @@ strip_delay = 30 equip_delay_other = 50 resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 40, ACID = 75) can_be_bloody = FALSE - custom_price = PAYCHECK_EASY * 3 + custom_price = PAYCHECK_ASSISTANT * 5.6 can_be_tied = FALSE /obj/item/clothing/shoes/galoshes/dry diff --git a/code/modules/clothing/shoes/gunboots.dm b/code/modules/clothing/shoes/gunboots.dm index ef891fc0e474..54f52f8ab04b 100644 --- a/code/modules/clothing/shoes/gunboots.dm +++ b/code/modules/clothing/shoes/gunboots.dm @@ -20,13 +20,13 @@ /obj/item/clothing/shoes/gunboots/equipped(mob/user, slot) . = ..() if(slot == ITEM_SLOT_FEET) - RegisterSignal(user, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(check_kick)) + RegisterSignal(user, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(check_kick)) else - UnregisterSignal(user, COMSIG_HUMAN_MELEE_UNARMED_ATTACK) + UnregisterSignal(user, COMSIG_LIVING_UNARMED_ATTACK) /obj/item/clothing/shoes/gunboots/dropped(mob/user) if(user) - UnregisterSignal(user, COMSIG_HUMAN_MELEE_UNARMED_ATTACK) + UnregisterSignal(user, COMSIG_LIVING_UNARMED_ATTACK) return ..() /// After each step, check if we randomly fire a shot @@ -38,10 +38,11 @@ INVOKE_ASYNC(src, PROC_REF(fire_shot)) /// Stomping on someone while wearing gunboots shoots them point blank -/obj/item/clothing/shoes/gunboots/proc/check_kick(mob/living/carbon/human/kicking_person, atom/attacked_atom, proximity) +/obj/item/clothing/shoes/gunboots/proc/check_kick(mob/living/carbon/human/kicking_person, atom/attacked_atom, proximity, modifiers) SIGNAL_HANDLER - if(!isliving(attacked_atom)) - return + if(!proximity || !isliving(attacked_atom)) + return NONE + var/mob/living/attacked_living = attacked_atom if(attacked_living.body_position == LYING_DOWN) INVOKE_ASYNC(src, PROC_REF(fire_shot), attacked_living) @@ -62,7 +63,7 @@ shot.fired_from = src shot.firer = wearer // don't hit ourself that would be really annoying shot.impacted = list(wearer = TRUE) - shot.def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) // they're fired from boots after all + shot.aimed_def_zone = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) // they're fired from boots after all shot.preparePixelProjectile(target, wearer) if(!shot.suppressed) wearer.visible_message(span_danger("[wearer]'s [name] fires \a [shot]!"), "", blind_message = span_hear("You hear a gunshot!"), vision_distance=COMBAT_MESSAGE_RANGE) diff --git a/code/modules/clothing/shoes/kindlekicks.dm b/code/modules/clothing/shoes/kindlekicks.dm index 4528546fd9f5..304a0fbee637 100644 --- a/code/modules/clothing/shoes/kindlekicks.dm +++ b/code/modules/clothing/shoes/kindlekicks.dm @@ -4,7 +4,7 @@ icon_state = "kindleKicks" inhand_icon_state = "kindleKicks" actions_types = list(/datum/action/item_action/kindle_kicks) - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 2 light_power = 3 light_on = FALSE diff --git a/code/modules/clothing/shoes/sandals.dm b/code/modules/clothing/shoes/sandals.dm index a8ac824811ac..acbe5972e032 100644 --- a/code/modules/clothing/shoes/sandals.dm +++ b/code/modules/clothing/shoes/sandals.dm @@ -7,7 +7,7 @@ equip_delay_other = 50 permeability_coefficient = 0.9 can_be_tied = FALSE - species_exception = list(/datum/species/golem) + /obj/item/clothing/shoes/sandal/magic name = "magical sandals" diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 6a9eb1370e30..6780a1f621a8 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -6,10 +6,10 @@ name = "space helmet" icon_state = "spaceold" desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS inhand_icon_state = "spaceold" permeability_coefficient = 0.01 - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 80, ACID = 70) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 80, ACID = 70) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT cold_protection = HEAD @@ -36,7 +36,7 @@ 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, FIRE = 80, ACID = 70) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 80, ACID = 70) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF @@ -126,7 +126,7 @@ . = ..() if(in_range(src, user) || isobserver(user)) . += "The thermal regulator is [thermal_on ? "on" : "off"] and the temperature is set to \ - [round(temperature_setting-T0C,0.1)] °C ([round(temperature_setting*1.8-459.67,0.1)] °F)" + [round(temperature_setting-T0C,0.1)] °C ([round(FAHRENHEIT(temperature_setting), 0.1)] °F)" . += "The power meter shows [cell ? "[round(cell.percent(), 0.1)]%" : "!invalid!"] charge remaining." if(cell_cover_open) . += "The cell cover is open exposing the cell and setting knobs." @@ -140,6 +140,11 @@ return TOOL_ACT_TOOLTYPE_SUCCESS /obj/item/clothing/suit/space/screwdriver_act(mob/living/user, obj/item/tool) + if(cell_cover_open) + if(cell) + remove_cell(user) + return TOOL_ACT_TOOLTYPE_SUCCESS + var/range_low = 20 // Default min temp c var/range_high = 45 // default max temp c if(obj_flags & EMAGGED) @@ -165,31 +170,14 @@ to_chat(user, span_notice("You successfully install \the [cell] into [src].")) return -/// Open the cell cover when ALT+Click on the suit -/obj/item/clothing/suit/space/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) - return ..() - toggle_spacesuit_cell(user) - -/// Remove the cell whent he cover is open on CTRL+Click -/obj/item/clothing/suit/space/CtrlClick(mob/living/user) - if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) - if(cell_cover_open && cell) - remove_cell(user) - return - return ..() - -// Remove the cell when using the suit on its self -/obj/item/clothing/suit/space/attack_self(mob/user) - remove_cell(user) - /// Remove the cell from the suit if the cell cover is open /obj/item/clothing/suit/space/proc/remove_cell(mob/user) if(cell_cover_open && cell) user.visible_message(span_notice("[user] removes \the [cell] from [src]!"), \ - span_notice("You remove [cell].")) + span_notice("You remove [cell] from [src].")) cell.add_fingerprint(user) - user.put_in_hands(cell) + if(!user.put_in_hands(cell)) + cell.forceMove(user.drop_location()) cell = null /// Toggle the space suit's cell cover diff --git a/code/modules/clothing/spacesuits/bountyhunter.dm b/code/modules/clothing/spacesuits/bountyhunter.dm index 3c7daa4e464f..250ff48bcb5b 100644 --- a/code/modules/clothing/spacesuits/bountyhunter.dm +++ b/code/modules/clothing/spacesuits/bountyhunter.dm @@ -4,7 +4,7 @@ icon_state = "hunter" inhand_icon_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/knife/combat) - armor = list(MELEE = 60, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + armor = list(BLUNT = 60, PUNCTURE = 40, SLASH = 0, LASER = 40, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF cell = /obj/item/stock_parts/cell/hyper diff --git a/code/modules/clothing/spacesuits/freedom.dm b/code/modules/clothing/spacesuits/freedom.dm index 426c83608340..59ce40c0ae9c 100644 --- a/code/modules/clothing/spacesuits/freedom.dm +++ b/code/modules/clothing/spacesuits/freedom.dm @@ -3,7 +3,7 @@ desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle." icon_state = "griffinhat" inhand_icon_state = "griffinhat" - armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 100, BIO = 100, FIRE = 80, ACID = 80) + armor = list(BLUNT = 20, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 100, BIO = 100, FIRE = 80, ACID = 80) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -14,7 +14,7 @@ icon_state = "freedom" inhand_icon_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 = 40, BOMB = 100, BIO = 100, FIRE = 80, ACID = 80) + armor = list(BLUNT = 20, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 100, BIO = 100, FIRE = 80, ACID = 80) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF diff --git a/code/modules/clothing/spacesuits/hardsuits/_hardsuit_helmets.dm b/code/modules/clothing/spacesuits/hardsuits/_hardsuit_helmets.dm new file mode 100644 index 000000000000..86d9944a9b3c --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/_hardsuit_helmets.dm @@ -0,0 +1,65 @@ +/obj/item/clothing/head/helmet/space/hardsuit + name = "voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." + icon = 'icons/obj/clothing/hardsuits/helmet.dmi' + worn_icon = 'icons/mob/clothing/hardsuit/hardsuit_helm.dmi' + icon_state = "hardsuit0-engineering" + inhand_icon_state = "eng_helm" + max_integrity = 300 + armor = list(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 50, ACID = 75) + light_system = OVERLAY_LIGHT_DIRECTIONAL + light_outer_range = 4 + light_power = 1 + light_on = FALSE + actions_types = list(/datum/action/item_action/toggle_helmet_light) + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF + supports_variations_flags = CLOTHING_TESHARI_VARIATION + + var/basestate = "hardsuit" + var/on = FALSE + var/obj/item/clothing/suit/space/hardsuit/suit + var/hardsuit_type = "engineering" //Determines used sprites: hardsuit[on]-[type] + +/obj/item/clothing/head/helmet/space/hardsuit/Destroy() + if(!QDELETED(suit)) + QDEL_NULL(suit) + return ..() + +/obj/item/clothing/head/helmet/space/hardsuit/update_icon_state() + . = ..() + icon_state = "[basestate][on]-[hardsuit_type]" + +/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user) + on = !on + update_icon(UPDATE_ICON_STATE) + + set_light_on(on) + + update_action_buttons() + +/obj/item/clothing/head/helmet/space/hardsuit/dropped(mob/user) + ..() + if(suit) + suit.RemoveHelmet() + +/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot) + if(slot == ITEM_SLOT_HEAD) + return 1 + +/obj/item/clothing/head/helmet/space/hardsuit/equipped(mob/user, slot) + ..() + if(slot != ITEM_SLOT_HEAD) + if(suit) + suit.RemoveHelmet() + else + qdel(src) + +/obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(msg) + var/mob/wearer = loc + if(msg && ishuman(wearer)) + wearer.play_screen_text(msg, /atom/movable/screen/text/screen_text/picture/hardsuit_visor) + +/obj/item/clothing/head/helmet/space/hardsuit/emp_act(severity) + . = ..() + display_visor_message("[severity > 1 ? "LIGHT" : "STRONG"] ELECTROMAGNETIC PULSE DETECTED!") diff --git a/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm new file mode 100644 index 000000000000..c9d352910328 --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/_hardsuits.dm @@ -0,0 +1,136 @@ +/// How much damage you take from an emp when wearing a hardsuit +#define HARDSUIT_EMP_BURN 2 // a very orange number + +/obj/item/clothing/suit/space/hardsuit + name = "voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." + icon = 'icons/obj/clothing/hardsuits/suit.dmi' + worn_icon = 'icons/mob/clothing/hardsuit/hardsuit_body.dmi' + icon_state = "hardsuit-engineering" + inhand_icon_state = "eng_hardsuit" + max_integrity = 300 + armor = list(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 50, ACID = 75) + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) + siemens_coefficient = 0 + actions_types = list(/datum/action/item_action/toggle_spacesuit, /datum/action/item_action/toggle_helmet) + supports_variations_flags = CLOTHING_TESHARI_VARIATION + slowdown = 1 + + var/obj/item/clothing/head/helmet/space/hardsuit/helmet + var/helmettype = /obj/item/clothing/head/helmet/space/hardsuit + /// Whether the helmet is on. + var/helmet_on = FALSE + +/obj/item/clothing/suit/space/hardsuit/Initialize(mapload) + . = ..() + + MakeHelmet() + +/obj/item/clothing/suit/space/hardsuit/Destroy() + if(!QDELETED(helmet)) + QDEL_NULL(helmet) + return ..() + +/obj/item/clothing/suit/space/hardsuit/proc/MakeHelmet() + if(!helmettype) + return + if(!helmet) + var/obj/item/clothing/head/helmet/space/hardsuit/W = new helmettype(src) + W.suit = src + helmet = W + +/obj/item/clothing/suit/space/hardsuit/proc/RemoveHelmet() + if(!helmet) + return + helmet_on = FALSE + if(ishuman(helmet.loc)) + var/mob/living/carbon/H = helmet.loc + if(helmet.on) + helmet.attack_self(H) + H.transferItemToLoc(helmet, src, TRUE) + H.update_worn_oversuit() + to_chat(H, span_notice("The helmet on the hardsuit disengages.")) + playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, TRUE) + else + helmet.forceMove(src) + +/obj/item/clothing/suit/space/hardsuit/proc/ToggleHelmet() + var/mob/living/carbon/human/H = src.loc + if(!istype(src.loc) || !helmettype) + return + if(!helmet) + to_chat(H, span_warning("The helmet's lightbulb seems to be damaged! You'll need a replacement bulb.")) + return + if(!helmet_on) + if(H.wear_suit != src) + to_chat(H, span_warning("You must be wearing [src] to engage the helmet!")) + return + if(H.head) + to_chat(H, span_warning("You're already wearing something on your head!")) + return + else if(H.equip_to_slot_if_possible(helmet,ITEM_SLOT_HEAD,0,0,1)) + to_chat(H, span_notice("You engage the helmet on the hardsuit.")) + helmet_on = TRUE + H.update_worn_oversuit() + playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, TRUE) + else + RemoveHelmet() + +/obj/item/clothing/suit/space/hardsuit/ui_action_click(mob/user, actiontype) + if(istype(actiontype, /datum/action/item_action/toggle_helmet)) + ToggleHelmet() + else + return ..() + +/obj/item/clothing/suit/space/hardsuit/attack_self(mob/user) + user.changeNext_move(CLICK_CD_MELEE) + ..() + +/obj/item/clothing/suit/space/hardsuit/examine(mob/user) + . = ..() + if(!helmet && helmettype) + . += span_notice("The helmet on [src] seems to be malfunctioning. Its light bulb needs to be replaced.") + +/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/light) && helmettype) + if(src == user.get_item_by_slot(ITEM_SLOT_OCLOTHING)) + to_chat(user, span_warning("You cannot replace the bulb in the helmet of [src] while wearing it.")) + return + if(helmet) + to_chat(user, span_warning("The helmet of [src] does not require a new bulb.")) + return + var/obj/item/light/L = I + if(L.status) + to_chat(user, span_warning("This bulb is too damaged to use as a replacement!")) + return + if(do_after(user, 5 SECONDS, src)) + qdel(I) + helmet = new helmettype(src) + to_chat(user, span_notice("You have successfully repaired [src]'s helmet.")) + new /obj/item/light/bulb/broken(drop_location()) + return ..() + +/obj/item/clothing/suit/space/hardsuit/equipped(mob/user, slot) + ..() + if(helmet && slot != ITEM_SLOT_OCLOTHING) + RemoveHelmet() + +/obj/item/clothing/suit/space/hardsuit/dropped(mob/user) + ..() + RemoveHelmet() + +/obj/item/clothing/suit/space/hardsuit/item_action_slot_check(slot) + if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to toggle the helmet if he's wearing the hardsuit. + return 1 + +/// Burn the person inside the hard suit just a little, the suit got really hot for a moment +/obj/item/clothing/suit/space/emp_act(severity) + . = ..() + var/mob/living/carbon/human/user = src.loc + if(istype(user)) + user.apply_damage(HARDSUIT_EMP_BURN, BURN, spread_damage=TRUE) + to_chat(user, span_warning("You feel \the [src] heat up from the EMP burning you slightly.")) + + // Chance to scream + if (user.stat < UNCONSCIOUS && prob(10)) + user.emote("scream") diff --git a/code/modules/clothing/spacesuits/hardsuits/engineering.dm b/code/modules/clothing/spacesuits/hardsuits/engineering.dm new file mode 100644 index 000000000000..627c475cf2b0 --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/engineering.dm @@ -0,0 +1,67 @@ +/obj/item/clothing/head/helmet/space/hardsuit/engine + name = "engineering voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." + icon_state = "hardsuit0-engineering" + inhand_icon_state = "eng_helm" + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) + hardsuit_type = "engineering" + resistance_flags = FIRE_PROOF + +/obj/item/clothing/head/helmet/space/hardsuit/engine/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/obj/item/clothing/suit/space/hardsuit/engine + name = "engineering voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." + icon_state = "hardsuit-engineering" + inhand_icon_state = "eng_hardsuit" + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine + resistance_flags = FIRE_PROOF + +/obj/item/clothing/suit/space/hardsuit/engine/Initialize(mapload) + . = ..() + AddElement(/datum/element/radiation_protected_clothing) + +/obj/item/clothing/suit/space/hardsuit/engine/equipped(mob/user, slot) + . = ..() + AddComponent(/datum/component/geiger_sound) + +/obj/item/clothing/suit/space/hardsuit/engine/dropped() + . = ..() + var/datum/component/geiger_sound/GS = GetComponent(/datum/component/geiger_sound) + if(GS) + qdel(GS) + +/////////////////////////////////// ATMOSPHERICS ///////////////////////////////////////////// + +/obj/item/clothing/head/helmet/space/hardsuit/atmos + name = "atmospherics hardsuit helmet" + desc = "A modified engineering hardsuit for work in a hazardous, low pressure environment. The radiation shielding plates were removed to allow for improved thermal protection instead." + icon_state = "hardsuit0-atmos" + inhand_icon_state = "atmo_helm" + hardsuit_type = "atmos" + armor = list(BLUNT = 30, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) + heat_protection = HEAD //Uncomment to enable firesuit protection + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + +/obj/item/clothing/suit/space/hardsuit/atmos + name = "atmospherics hardsuit" + desc = "A modified engineering hardsuit for work in a hazardous, low pressure environment. The radiation shielding plates were removed to allow for improved thermal protection instead." + icon_state = "hardsuit-atmos" + inhand_icon_state = "atmo_hardsuit" + armor = list(BLUNT = 30, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) + 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/atmos + +/obj/item/clothing/suit/space/hardsuit/atmos/equipped(mob/user, slot) + . = ..() + AddComponent(/datum/component/geiger_sound) + +/obj/item/clothing/suit/space/hardsuit/atmos/dropped() + . = ..() + var/datum/component/geiger_sound/GS = GetComponent(/datum/component/geiger_sound) + if(GS) + qdel(GS) diff --git a/code/modules/clothing/spacesuits/hardsuits/medical.dm b/code/modules/clothing/spacesuits/hardsuits/medical.dm new file mode 100644 index 000000000000..967984e09659 --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/medical.dm @@ -0,0 +1,21 @@ + //Medical hardsuit +/obj/item/clothing/head/helmet/space/hardsuit/medical + name = "medical voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light." + icon_state = "hardsuit0-medical" + inhand_icon_state = "medical_helm" + hardsuit_type = "medical" + flash_protect = FLASH_PROTECTION_NONE + armor = list(BLUNT = 15, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 100, FIRE = 60, ACID = 100) + clothing_traits = list(TRAIT_REAGENT_SCANNER) + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT + +/obj/item/clothing/suit/space/hardsuit/medical + name = "medical voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. Built with lightweight materials for easier movement." + icon_state = "hardsuit-medical" + inhand_icon_state = "medical_hardsuit" + allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/medkit, /obj/item/healthanalyzer, /obj/item/stack/medical) + armor = list(BLUNT = 15, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 100, FIRE = 60, ACID = 100) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical + slowdown = 0.5 diff --git a/code/modules/clothing/spacesuits/hardsuits/misc.dm b/code/modules/clothing/spacesuits/hardsuits/misc.dm new file mode 100644 index 000000000000..36d4b0039fff --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/misc.dm @@ -0,0 +1,18 @@ +/obj/item/clothing/suit/space/hardsuit/hop + name = "voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." + icon_state = "hardsuit-hop" + inhand_icon_state = "eng_hardsuit" + max_integrity = 300 + armor = list(BLUNT = 25, PUNCTURE = 5, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 10, BIO = 100, FIRE = 50, ACID = 75) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/hop + +/obj/item/clothing/head/helmet/space/hardsuit/hop + name = "voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." + icon_state = "hardsuit0-hop" + inhand_icon_state = "eng_helm" + max_integrity = 300 + armor = list(BLUNT = 25, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 30, BOMB = 10, BIO = 100, FIRE = 50, ACID = 75) + hardsuit_type = "hop" + diff --git a/code/modules/clothing/spacesuits/hardsuits/science.dm b/code/modules/clothing/spacesuits/hardsuits/science.dm new file mode 100644 index 000000000000..c865dce9b0db --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/science.dm @@ -0,0 +1,52 @@ +/obj/item/clothing/head/helmet/space/hardsuit/toxins + name = "prototype voidsuit helmet" + desc = "A prototype helmet designed for research in a hazardous, low pressure environment. Scientific data flashes across the visor." + icon_state = "hardsuit0-toxins" + hardsuit_type = "toxins" + resistance_flags = ACID_PROOF | FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + armor = list(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 100, BIO = 100, FIRE = 60, ACID = 30) + clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_RESEARCH_SCANNER) + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT + actions_types = list(/datum/action/item_action/toggle_helmet_light) + var/explosion_detection_dist = 21 + +/obj/item/clothing/head/helmet/space/hardsuit/toxins/Initialize(mapload) + . = ..() + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) + +/obj/item/clothing/head/helmet/space/hardsuit/toxins/equipped(mob/living/carbon/human/user, slot) + ..() + if (slot == ITEM_SLOT_HEAD) + var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] + DHUD.show_to(user) + +/obj/item/clothing/head/helmet/space/hardsuit/toxins/dropped(mob/living/carbon/human/user) + ..() + if (user.head == src) + var/datum/atom_hud/DHUD = GLOB.huds[DATA_HUD_DIAGNOSTIC_BASIC] + DHUD.hide_from(user) + +/obj/item/clothing/head/helmet/space/hardsuit/toxins/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 + + var/turf/T = get_turf(src) + if(T?.z != epicenter.z) + return + if(get_dist(epicenter, T) > explosion_detection_dist) + return + display_visor_message("Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]") + +/obj/item/clothing/suit/space/hardsuit/toxins + name = "prototype voidsuit" + desc = "A prototype suit that protects against hazardous, low pressure environments. Fitted with extensive plating for handling explosives and dangerous research materials." + icon_state = "hardsuit-toxins" + inhand_icon_state = "hardsuit-toxins" + resistance_flags = ACID_PROOF | FIRE_PROOF + 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(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 100, BIO = 100, FIRE = 60, ACID = 30) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/toxins + cell = /obj/item/stock_parts/cell/super diff --git a/code/modules/clothing/spacesuits/hardsuits/security.dm b/code/modules/clothing/spacesuits/hardsuits/security.dm new file mode 100644 index 000000000000..e7e04f49ef07 --- /dev/null +++ b/code/modules/clothing/spacesuits/hardsuits/security.dm @@ -0,0 +1,16 @@ +/obj/item/clothing/head/helmet/space/hardsuit/security + name = "security voidsuit helmet" + desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." + icon_state = "hardsuit0-security" + inhand_icon_state = "sec_helm" + hardsuit_type = "security" + armor = list(BLUNT = 35, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75) + + +/obj/item/clothing/suit/space/hardsuit/security + icon_state = "hardsuit-security" + name = "security voidsuit" + desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." + inhand_icon_state = "sec_hardsuit" + armor = list(BLUNT = 35, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75) + helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security diff --git a/code/modules/clothing/spacesuits/pirate.dm b/code/modules/clothing/spacesuits/pirate.dm index 7aa3541c033e..459d4fee616a 100644 --- a/code/modules/clothing/spacesuits/pirate.dm +++ b/code/modules/clothing/spacesuits/pirate.dm @@ -3,7 +3,7 @@ desc = "A modified helmet to allow space pirates to intimidate their customers whilst staying safe from the void. Comes with some additional protection." icon_state = "spacepirate" inhand_icon_state = "spacepiratehelmet" - armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 @@ -18,6 +18,6 @@ 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, /obj/item/melee/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 = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index 946c2177ba85..42a335475e97 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -4,7 +4,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/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) resistance_flags = FIRE_PROOF icon_state = "plasmaman_suit" inhand_icon_state = "plasmaman_suit" @@ -44,9 +44,9 @@ strip_delay = 80 flash_protect = FLASH_PROTECTION_WELDER tint = 2 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) resistance_flags = FIRE_PROOF - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_outer_range = 4 light_on = FALSE var/helmet_on = FALSE @@ -74,7 +74,7 @@ . += span_notice("There's nothing placed on the helmet.") /obj/item/clothing/head/helmet/space/plasmaman/AltClick(mob/user) - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE)) toggle_welding_screen(user) /obj/item/clothing/head/helmet/space/plasmaman/ui_action_click(mob/user, action) @@ -115,7 +115,7 @@ return if(istype(hitting_item, /obj/item/clothing/head)) var/obj/item/clothing/hitting_clothing = hitting_item - if(hitting_clothing.clothing_flags & PLASMAMAN_HELMET_EXEMPT) + if(hitting_clothing.clothing_flags & STACKABLE_HELMET_EXEMPT) to_chat(user, span_notice("You cannot place [hitting_clothing.name] on helmet!")) return if(attached_hat) @@ -126,14 +126,14 @@ hitting_clothing.forceMove(src) update_appearance() -/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mutable_appearance/standing, isinhands) +/obj/item/clothing/head/helmet/space/plasmaman/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands) . = ..() if(!isinhands && smile) var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/head/plasmaman_head.dmi', smile_state) M.color = smile_color . += M if(!isinhands && attached_hat) - . += attached_hat.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi') + . += attached_hat.build_worn_icon(wearer, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi') if(!isinhands && !up) . += mutable_appearance('icons/mob/clothing/head/plasmaman_head.dmi', visor_icon) else @@ -178,7 +178,7 @@ desc = "A plasmaman containment helmet designed for security officers, protecting them from burning alive, alongside other undesirables." icon_state = "security_envirohelm" inhand_icon_state = "security_envirohelm" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) /obj/item/clothing/head/helmet/space/plasmaman/security/warden name = "warden's plasma envirosuit helmet" @@ -187,11 +187,11 @@ inhand_icon_state = "warden_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/security/head_of_security - name = "head of security's plasma envirosuit helmet" - desc = "A special containment helmet designed for the Head of Security. A pair of gold stripes are added to differentiate them from other members of security." + name = "security marshal's plasma envirosuit helmet" + desc = "A special containment helmet designed for the Security Marshal. A pair of gold stripes are added to differentiate them from other members of security." icon_state = "hos_envirohelm" inhand_icon_state = "hos_envirohelm" - armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) /obj/item/clothing/head/helmet/space/plasmaman/prisoner name = "prisoner's plasma envirosuit helmet" @@ -258,14 +258,14 @@ desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." icon_state = "engineer_envirohelm" inhand_icon_state = "engineer_envirohelm" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) /obj/item/clothing/head/helmet/space/plasmaman/atmospherics name = "atmospherics plasma envirosuit helmet" desc = "A space-worthy helmet specially designed for atmos technician plasmamen, the usual purple stripes being replaced by atmos' blue. Has improved thermal shielding." icon_state = "atmos_envirohelm" inhand_icon_state = "atmos_envirohelm" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat /obj/item/clothing/head/helmet/space/plasmaman/chief_engineer @@ -273,7 +273,7 @@ desc = "A special containment helmet designed for the Chief Engineer, the usual purple stripes being replaced by the chief's green. Has improved thermal shielding." icon_state = "ce_envirohelm" inhand_icon_state = "ce_envirohelm" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 100, ACID = 75) max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT // Same protection as the Atmospherics Hardhat @@ -303,7 +303,7 @@ inhand_icon_state = "white_envirohelm" /obj/item/clothing/head/helmet/space/plasmaman/curator - name = "curator's plasma envirosuit helmet" + name = "archivist's plasma envirosuit helmet" desc = "A slight modification on a traditional voidsuit helmet, this helmet was Daedalus' first solution to the *logistical problems* that come with employing plasmamen. Despite their limitations, these helmets still see use by historians and old-school plasmamen alike." icon_state = "prototype_envirohelm" inhand_icon_state = "prototype_envirohelm" @@ -349,7 +349,7 @@ desc = "A special containment helmet designed for the Captain. Embarrassingly enough, it looks way too much like the Head of Personnel's design save for the gold stripes. I mean, come on. Gold stripes can fix anything." icon_state = "captain_envirohelm" inhand_icon_state = "captain_envirohelm" - armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) /obj/item/clothing/head/helmet/space/plasmaman/centcom_commander name = "CentCom commander plasma envirosuit helmet" diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm index b8c6bb8ce5e4..353c095a0bf5 100644 --- a/code/modules/clothing/spacesuits/softsuit.dm +++ b/code/modules/clothing/spacesuits/softsuit.dm @@ -4,26 +4,28 @@ desc = "An old, NASA CentCom branch designed, dark red space suit helmet." icon_state = "void" inhand_icon_state = "void" + supports_variations_flags = NONE /obj/item/clothing/suit/space/nasavoid name = "NASA Voidsuit" icon_state = "void" inhand_icon_state = "void" - desc = "An old, NASA CentCom branch designed, dark red space suit." + desc = "A spacesuit older than you are." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/multitool) + supports_variations_flags = NONE /obj/item/clothing/head/helmet/space/nasavoid/old - name = "Engineering Void Helmet" - desc = "A CentCom engineering dark red space suit helmet. While old and dusty, it still gets the job done." + name = "old space helmet" + desc = "A space helmet older than you are. Check it for cracks." icon_state = "void" inhand_icon_state = "void" /obj/item/clothing/suit/space/nasavoid/old - name = "Engineering Voidsuit" + name = "old space suit" icon_state = "void" inhand_icon_state = "void" - desc = "A CentCom engineering dark red space suit. Age has degraded the suit making it difficult to move around in." - slowdown = 4 + desc = "A cumbersome spacesuit older than you are." + slowdown = 1.2 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/multitool) //EVA suit @@ -32,7 +34,7 @@ icon_state = "space" inhand_icon_state = "s_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, FIRE = 50, ACID = 65) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 50, ACID = 65) /obj/item/clothing/head/helmet/space/eva name = "EVA helmet" @@ -40,7 +42,7 @@ inhand_icon_state = "space" desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." flash_protect = FLASH_PROTECTION_NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 50, ACID = 65) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 50, ACID = 65) /obj/item/clothing/head/helmet/space/eva/examine(mob/user) . = ..() @@ -66,7 +68,7 @@ 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" inhand_icon_state = "syndicate-helm-orange" - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) strip_delay = 65 /obj/item/clothing/suit/space/fragile @@ -76,11 +78,15 @@ icon_state = "syndicate-orange" inhand_icon_state = "syndicate-orange" slowdown = 2 - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) strip_delay = 65 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/space/fragile/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) + . = ..() + if(!.) + return + if(!torn && prob(50)) to_chat(owner, span_warning("[src] tears from the damage, breaking the air-tight seal!")) clothing_flags &= ~STOPSPRESSUREDAMAGE diff --git a/code/modules/clothing/spacesuits/specialops.dm b/code/modules/clothing/spacesuits/specialops.dm index 3fe7c03e06dc..bfbfe6f11e23 100644 --- a/code/modules/clothing/spacesuits/specialops.dm +++ b/code/modules/clothing/spacesuits/specialops.dm @@ -7,7 +7,7 @@ greyscale_colors = "#397F3F#FFCE5B" flags_inv = 0 - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 0, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -22,7 +22,7 @@ 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 = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 0, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index a598d6413c9f..9fa2c854780b 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" inhand_icon_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, FIRE = 80, ACID = 85) + armor = list(BLUNT = 40, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 80, ACID = 85) /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/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, FIRE = 80, ACID = 85) + armor = list(BLUNT = 40, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 80, ACID = 85) cell = /obj/item/stock_parts/cell/hyper //Green syndicate space suit diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index d8b4932e1368..3bc49e43f32d 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -5,7 +5,7 @@ fallback_icon_state = "coat" 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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' slot_flags = ITEM_SLOT_OCLOTHING @@ -17,15 +17,25 @@ . = ..() setup_shielding() -/obj/item/clothing/suit/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/suit/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damaged[blood_overlay_type]") - if(HAS_BLOOD_DNA(src)) - . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/chest = wearer.get_bodypart(BODY_ZONE_CHEST) + if(!chest?.icon_bloodycover) + return + . += image(chest.icon_bloodycover, "[blood_overlay_type]blood") + var/image/bloody_overlay = image(chest.icon_bloodycover, "[blood_overlay_type]blood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay + else + . += mutable_appearance('icons/effects/blood.dmi', "[blood_overlay_type]blood") var/mob/living/carbon/human/M = loc if(!ishuman(M) || !M.w_uniform) @@ -36,12 +46,6 @@ if(A.above_suit) . += U.accessory_overlay -/obj/item/clothing/suit/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) - ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_oversuit() - /** * Wrapper proc to apply shielding through AddComponent(). * Called in /obj/item/clothing/Initialize(). diff --git a/code/modules/clothing/suits/ablativecoat.dm b/code/modules/clothing/suits/ablativecoat.dm index 38a396105c0e..d99dbca1026d 100644 --- a/code/modules/clothing/suits/ablativecoat.dm +++ b/code/modules/clothing/suits/ablativecoat.dm @@ -2,7 +2,7 @@ name = "ablative hood" desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a visor for cool-o-vision." icon_state = "ablativehood" - armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) strip_delay = 30 var/hit_reflect_chance = 50 @@ -18,7 +18,7 @@ icon_state = "ablativecoat" inhand_icon_state = "ablativecoat" body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) hoodtype = /obj/item/clothing/head/hooded/ablative strip_delay = 30 equip_delay_other = 40 @@ -40,7 +40,7 @@ var/mob/living/carbon/user = loc var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] ADD_TRAIT(user, TRAIT_SECURITY_HUD, HELMET_TRAIT) - hud.add_hud_to(user) + hud.show_to(user) balloon_alert(user, "you put on the hood, and enable the hud") return ..() @@ -50,6 +50,6 @@ var/mob/living/carbon/user = loc var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_SECURITY_ADVANCED] REMOVE_TRAIT(user, TRAIT_SECURITY_HUD, HELMET_TRAIT) - hud.remove_hud_from(user) + hud.hide_from(user) balloon_alert(user, "you take off the hood, and disable the hud") return ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 06f32f5703a1..0aa78f864bc0 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -11,7 +11,7 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50, WOUND = 10) + armor = list(BLUNT = 35, PUNCTURE = 10, SLASH = 50, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) /obj/item/clothing/suit/armor/Initialize(mapload) . = ..() @@ -20,18 +20,27 @@ /obj/item/clothing/suit/armor/vest name = "armor vest" - desc = "A slim Type I armored vest that provides decent protection against most types of damage." - icon_state = "armoralt" - inhand_icon_state = "armoralt" + desc = "A tough armored vest made with hard composite plates. Great for stopping blunt force and cutting." + icon_state = "armor" + inhand_icon_state = "armor" blood_overlay_type = "armor" dog_fashion = /datum/dog_fashion/back - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + armor = list(BLUNT = 35, PUNCTURE = 20, SLASH = 35, LASER = 20, ENERGY = 30, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) -/obj/item/clothing/suit/armor/vest/alt - desc = "A Type I armored vest that provides decent protection against most types of damage." - icon_state = "armor" +/obj/item/clothing/suit/armor/vest/sec + name = "martian armor vest" + desc = "An old composite vest with a faded corporate logo. While outdated, it will still protect your chest from heavy blows and cuts." + icon_state = "armorsec" inhand_icon_state = "armor" +/obj/item/clothing/suit/armor/vest/ballistic + name = "ballistic vest" + desc = "A thick, flexible kevlar vest. Keeps your chest protected from stabbings and shootings, but it won't do much against blunt force." + icon_state = "armoralt" + inhand_icon_state = "armoralt" + armor = list(BLUNT = 15, PUNCTURE = 40, SLASH = 10, LASER = 30, ENERGY = 30, BOMB = 10, BIO = 0, FIRE = 50, ACID = 50) + /obj/item/clothing/suit/armor/vest/marine name = "tactical armor vest" desc = "A set of the finest mass produced, stamped plasteel armor plates, containing an environmental protection unit for all-condition door kicking." @@ -39,13 +48,15 @@ inhand_icon_state = "armor" clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list(MELEE = 50, BULLET = 50, LASER = 30, ENERGY = 25, BOMB = 50, BIO = 100, FIRE = 40, ACID = 50, WOUND = 20) cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT_OFF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS resistance_flags = FIRE_PROOF | ACID_PROOF supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_VOX_VARIATION | CLOTHING_TESHARI_VARIATION + + armor = list(BLUNT = 50, PUNCTURE = 20, SLASH = 70, LASER = 30, ENERGY = 25, BOMB = 50, BIO = 100, FIRE = 40, ACID = 50) + /obj/item/clothing/suit/armor/vest/marine/security name = "large tactical armor vest" icon_state = "marine_security" @@ -86,7 +97,7 @@ icon_state = "hos" inhand_icon_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 70, ACID = 90, WOUND = 10) + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 70, ACID = 90) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 @@ -101,7 +112,7 @@ strip_delay = 80 /obj/item/clothing/suit/armor/hos/hos_formal - name = "\improper Head of Security's parade jacket" + name = "\improper Security Marshal's parade jacket" desc = "For when an armoured vest isn't fashionable enough." icon_state = "hosformal" inhand_icon_state = "hostrench" @@ -145,7 +156,7 @@ icon_state = "capcarapace" inhand_icon_state = "armor" body_parts_covered = CHEST|GROIN - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(BLUNT = 50, PUNCTURE = 20, SLASH = 70, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, FIRE = 100, ACID = 90) dog_fashion = null resistance_flags = FIRE_PROOF supports_variations_flags = NONE @@ -176,7 +187,7 @@ 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 = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80, WOUND = 20) + armor = list(BLUNT = 50, PUNCTURE = 10, SLASH = 50, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 80, ACID = 80) clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 @@ -188,7 +199,7 @@ icon_state = "bonearmor" inhand_icon_state = "bonearmor" blood_overlay_type = "armor" - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50, WOUND = 10) + armor = list(BLUNT = 35, PUNCTURE = 25, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS /obj/item/clothing/suit/armor/bulletproof @@ -197,7 +208,7 @@ icon_state = "bulletproof" inhand_icon_state = "armor" blood_overlay_type = "armor" - armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, FIRE = 50, ACID = 50, WOUND = 20) + armor = list(BLUNT = 15, PUNCTURE = 60, SLASH = 25, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, FIRE = 50, ACID = 50) strip_delay = 70 equip_delay_other = 50 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -211,7 +222,7 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS heat_protection = CHEST|GROIN|ARMS - armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 60, ENERGY = 60, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/hit_reflect_chance = 50 @@ -222,9 +233,10 @@ return TRUE /obj/item/clothing/suit/armor/vest/det_suit - name = "detective's armor vest" - desc = "An armored vest with a detective's badge on it." + name = "private investigator's armor vest" + desc = "An armored vest with a private investigator's badge on it." icon_state = "detective-armor" + armor = list(BLUNT = 20, PUNCTURE = 30, SLASH = 10, LASER = 20, ENERGY = 30, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) resistance_flags = FLAMMABLE dog_fashion = null supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -238,7 +250,7 @@ desc = "This vest appears to be made of of highly flexible materials that absorb impacts with ease." icon_state = "infiltrator" inhand_icon_state = "infiltrator" - armor = list(MELEE = 40, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 70, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 70, BIO = 0, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF | ACID_PROOF strip_delay = 80 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -248,7 +260,7 @@ desc = "A tactical suit first developed in a joint effort by the defunct IS-ERI and Mars Executive Outcomes in 2321 for military operations. It has a minor slowdown, but offers decent protection." icon_state = "heavy" inhand_icon_state = "swat_suit" - armor = list(MELEE = 40, BULLET = 30, LASER = 30,ENERGY = 40, BOMB = 50, BIO = 90, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 40, PUNCTURE = 20, SLASH = 60, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 90, FIRE = 100, ACID = 100) strip_delay = 120 resistance_flags = FIRE_PROOF | ACID_PROOF clothing_flags = THICKMATERIAL @@ -271,7 +283,7 @@ 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 = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/tdome body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -279,7 +291,7 @@ clothing_flags = THICKMATERIAL 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 = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 90, ACID = 90) /obj/item/clothing/suit/armor/tdome/red name = "thunderdome suit" @@ -295,7 +307,7 @@ /obj/item/clothing/suit/armor/tdome/holosuit name = "thunderdome suit" - armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) cold_protection = null heat_protection = null @@ -335,7 +347,7 @@ icon_state = "knight_greyscale" inhand_icon_state = "knight_greyscale" material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS//Can change color and add prefix - armor = list(MELEE = 35, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, FIRE = 40, ACID = 40, WOUND = 15) + armor = list(BLUNT = 35, PUNCTURE = 0, SLASH = 50, LASER = 10, ENERGY = 10, BOMB = 10, BIO = 10, FIRE = 40, ACID = 40) /obj/item/clothing/suit/armor/vest/durathread name = "durathread vest" @@ -346,7 +358,7 @@ equip_delay_other = 40 max_integrity = 200 resistance_flags = FLAMMABLE - armor = list(MELEE = 20, BULLET = 10, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, FIRE = 40, ACID = 50) + armor = list(BLUNT = 15, PUNCTURE = 0, SLASH = 25, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, FIRE = 40, ACID = 50) supports_variations_flags = NONE /obj/item/clothing/suit/armor/vest/russian @@ -354,7 +366,7 @@ desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?" icon_state = "rus_armor" inhand_icon_state = "rus_armor" - armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 20, ACID = 50, WOUND = 10) + armor = list(BLUNT = 25, PUNCTURE = 30, SLASH = 0, LASER = 0, ENERGY = 10, BOMB = 10, BIO = 0, FIRE = 20, ACID = 50) supports_variations_flags = NONE /obj/item/clothing/suit/armor/vest/russian_coat @@ -365,7 +377,7 @@ 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, FIRE = -10, ACID = 50, WOUND = 10) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, FIRE = -10, ACID = 50) supports_variations_flags = NONE /obj/item/clothing/suit/armor/elder_atmosian @@ -374,7 +386,7 @@ icon_state = "h2armor" inhand_icon_state = "h2armor" material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS//Can change color and add prefix - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 30, BOMB = 85, BIO = 10, FIRE = 65, ACID = 40, WOUND = 15) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 85, BIO = 10, FIRE = 65, ACID = 40) 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 @@ -385,7 +397,7 @@ icon_state = "centcom_formal" inhand_icon_state = "centcom" body_parts_covered = CHEST|GROIN|ARMS - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) + armor = list(BLUNT = 35, PUNCTURE = 40, SLASH = 50, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/armor/centcom_formal/Initialize(mapload) diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 7e6418e9be8b..c7fb7ef5f1ca 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -4,8 +4,8 @@ icon_state = "bio" desc = "A hood that protects the head and face from biological contaminants." permeability_coefficient = 0.01 - clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | PLASMAMAN_HELMET_EXEMPT - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 30, ACID = 100) + clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT | STACKABLE_HELMET_EXEMPT | HEADINTERNALS | FIBERLESS + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 30, ACID = 100) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF @@ -18,11 +18,11 @@ inhand_icon_state = "bio_suit" w_class = WEIGHT_CLASS_BULKY permeability_coefficient = 0.01 - clothing_flags = THICKMATERIAL + clothing_flags = THICKMATERIAL | FIBERLESS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 0.5 allowed = list(/obj/item/tank/internals, /obj/item/reagent_containers/dropper, /obj/item/flashlight/pen, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/glass/beaker, /obj/item/gun/syringe) - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 30, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 30, ACID = 100) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT strip_delay = 70 equip_delay_other = 70 @@ -47,11 +47,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 = 35, BOMB = 25, BIO = 100, FIRE = 30, ACID = 100) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 100, FIRE = 30, ACID = 100) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 100, FIRE = 30, ACID = 100) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 100, FIRE = 30, ACID = 100) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security/Initialize(mapload) @@ -85,7 +85,7 @@ /obj/item/clothing/suit/bio_suit/cmo/Initialize(mapload) . = ..() - allowed += list(/obj/item/melee/baton/telescopic) + allowed += /obj/item/assembly/flash/handheld //Plague Dr mask can be found in clothing/masks/gasmask.dm /obj/item/clothing/suit/bio_suit/plaguedoctorsuit diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 402c94ba26bc..9f8dfedc52b8 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -17,7 +17,7 @@ return(OXYLOSS) /obj/item/clothing/neck/cloak/hos - name = "head of security's cloak" + name = "security marshal's cloak" desc = "Worn by Securistan, ruling the station with an iron fist." icon_state = "hoscloak" supports_variations_flags = CLOTHING_TESHARI_VARIATION @@ -58,114 +58,6 @@ icon_state = "hopcloak" supports_variations_flags = CLOTHING_TESHARI_VARIATION -/obj/item/clothing/suit/hooded/cloak/goliath - 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/spear, /obj/item/organ/regenerative_core/legion, /obj/item/knife/combat/bone, /obj/item/knife/combat/survival) - armor = list(MELEE = 35, BULLET = 10, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 60, ACID = 60) //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 - -/obj/item/clothing/head/hooded/cloakhood/goliath - name = "goliath cloak hood" - icon_state = "golhood" - desc = "A protective & concealing hood." - armor = list(MELEE = 35, BULLET = 10, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 60, ACID = 60) - clothing_flags = SNUG_FIT - flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR - transparent_protection = HIDEMASK - -/obj/item/clothing/suit/hooded/cloak/drake - 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/recharge/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear) - armor = list(MELEE = 65, BULLET = 15, LASER = 40, ENERGY = 40, BOMB = 70, BIO = 60, FIRE = 100, ACID = 100) - hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = 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 - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION - -/obj/item/clothing/head/hooded/cloakhood/drake - name = "drake helm" - icon_state = "dragon" - desc = "The skull of a dragon." - armor = list(MELEE = 65, BULLET = 15, LASER = 40, ENERGY = 40, BOMB = 70, BIO = 60, FIRE = 100, ACID = 100) - clothing_flags = SNUG_FIT - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - resistance_flags = FIRE_PROOF | ACID_PROOF - supports_variations_flags = CLOTHING_TESHARI_VARIATION - -/obj/item/clothing/suit/hooded/cloak/godslayer - name = "godslayer armour" - icon_state = "godslayer" - desc = "A suit of armour fashioned from the remnants of a knight's armor, and parts of a wendigo." - 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/recharge/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear) - armor = list(MELEE = 50, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 50, FIRE = 100, ACID = 100) - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL - hoodtype = /obj/item/clothing/head/hooded/cloakhood/godslayer - cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - resistance_flags = FIRE_PROOF | ACID_PROOF | FREEZE_PROOF - transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES - /// Amount to heal when the effect is triggered - var/heal_amount = 500 - /// Time until the effect can take place again - var/effect_cooldown_time = 10 MINUTES - /// Current cooldown for the effect - COOLDOWN_DECLARE(effect_cooldown) - var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) - -/obj/item/clothing/head/hooded/cloakhood/godslayer - name = "godslayer helm" - icon_state = "godslayer" - desc = "The horns and skull of a wendigo, held together by the remaining icey energy of a demonic miner." - armor = list(MELEE = 50, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 50, FIRE = 100, ACID = 100) - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - flash_protect = FLASH_PROTECTION_WELDER - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF - resistance_flags = FIRE_PROOF | ACID_PROOF | FREEZE_PROOF - -/obj/item/clothing/suit/hooded/cloak/godslayer/examine(mob/user) - . = ..() - if(loc == user && !COOLDOWN_FINISHED(src, effect_cooldown)) - . += "You feel like the revival effect will be able to occur again in [COOLDOWN_TIMELEFT(src, effect_cooldown) / 10] seconds." - -/obj/item/clothing/suit/hooded/cloak/godslayer/equipped(mob/user, slot) - . = ..() - if(slot & ITEM_SLOT_OCLOTHING) - RegisterSignal(user, COMSIG_MOB_STATCHANGE, PROC_REF(resurrect)) - return - UnregisterSignal(user, COMSIG_MOB_STATCHANGE) - -/obj/item/clothing/suit/hooded/cloak/godslayer/dropped(mob/user) - ..() - UnregisterSignal(user, COMSIG_MOB_STATCHANGE) - -/obj/item/clothing/suit/hooded/cloak/godslayer/proc/resurrect(mob/living/carbon/user, new_stat) - SIGNAL_HANDLER - if(new_stat > CONSCIOUS && new_stat < DEAD && COOLDOWN_FINISHED(src, effect_cooldown)) - COOLDOWN_START(src, effect_cooldown, effect_cooldown_time) //This needs to happen first, otherwise there's an infinite loop - user.heal_ordered_damage(heal_amount, damage_heal_order) - user.visible_message(span_notice("[user] suddenly revives, as their armor swirls with demonic energy!"), span_notice("You suddenly feel invigorated!")) - playsound(user.loc, 'sound/magic/clockwork/ratvar_attack.ogg', 50) - /obj/item/clothing/neck/cloak/skill_reward var/associated_skill_path = /datum/skill resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE @@ -206,12 +98,6 @@ icon_state = "cleanercloak" associated_skill_path = /datum/skill/cleaning -/obj/item/clothing/neck/cloak/skill_reward/mining - name = "legendary miner's cloak" - desc = "Worn by the most skilled miners, this legendary cloak is only attainable by achieving true mineral enlightenment. This status symbol represents a being who has forgotten more about rocks than most miners will ever know, a being who has moved mountains and filled valleys." - icon_state = "minercloak" - associated_skill_path = /datum/skill/mining - /obj/item/clothing/neck/cloak/skill_reward/playing name = "legendary veteran's cloak" desc = "Worn by the wisest of veteran employees, this legendary cloak is only attainable by maintaining a living employment agreement with Nanotrasen for over five thousand hours. This status symbol represents a being is better than you in nearly every quantifiable way, simple as that." diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 1f2fcb938f11..20b0032f9a3e 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -19,10 +19,10 @@ icon_state = "pirate" inhand_icon_state = "pirate" allowed = list(/obj/item/melee/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum) - species_exception = list(/datum/species/golem) + /obj/item/clothing/suit/pirate/armored - armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 @@ -33,7 +33,7 @@ inhand_icon_state = "hgpirate" /obj/item/clothing/suit/pirate/captain/armored - armor = list(MELEE = 30, BULLET = 50, LASER = 30,ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, FIRE = 60, ACID = 75) strip_delay = 40 equip_delay_other = 20 @@ -52,7 +52,7 @@ icon_state = "justice" inhand_icon_state = "justice" flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 35, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) /obj/item/clothing/suit/judgerobe name = "judge's robe" @@ -69,7 +69,7 @@ icon_state = "overalls" inhand_icon_state = "overalls" body_parts_covered = CHEST|GROIN|LEGS - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/apron/purple_bartender @@ -182,7 +182,7 @@ desc = "Your classic, non-racist poncho." icon_state = "classicponcho" inhand_icon_state = "classicponcho" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/poncho/green @@ -252,7 +252,7 @@ desc = "A slimming piece of dubious space carp technology, you suspect it won't stand up to hand-to-hand blows." icon_state = "carp_suit" inhand_icon_state = "space_suit_syndicate" - armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy whimpy whoo + armor = list(BLUNT = -20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy whimpy whoo allowed = list(/obj/item/tank/internals, /obj/item/gun/ballistic/rifle/boltaction/harpoon) //I'm giving you a hint here flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -268,12 +268,12 @@ name = "carp helmet" desc = "Spaceworthy and it looks like a space carp's head, smells like one too." icon_state = "carp_helm" - armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy as a space carp + armor = list(BLUNT = -20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 60, ACID = 75) //As whimpy as a space carp flags_inv = HIDEEARS|HIDEHAIR|HIDEFACIALHAIR //facial hair will clip with the helm, this'll need a dynamic_fhair_suffix at some point. min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT - clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|PLASMAMAN_HELMET_EXEMPT + clothing_flags = STOPSPRESSUREDAMAGE|THICKMATERIAL|SNUG_FIT|STACKABLE_HELMET_EXEMPT body_parts_covered = HEAD resistance_flags = NONE flash_protect = FLASH_PROTECTION_WELDER @@ -336,7 +336,7 @@ allowed = list() actions_types = list(/datum/action/item_action/toggle_human_head) hoodtype = /obj/item/clothing/head/hooded/human_head - species_exception = list(/datum/species/golem) //Finally, flesh + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -436,7 +436,7 @@ desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice." icon = 'icons/obj/clothing/suits.dmi' icon_state = "clockwork_cuirass_old" - armor = list(MELEE = 5, BULLET = 0, LASER = -5, ENERGY = -15, BOMB = 10, BIO = 0, FIRE = 20, ACID = 20) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = -5, ENERGY = -15, BOMB = 10, BIO = 0, FIRE = 20, ACID = 20) /obj/item/clothing/suit/hooded/mysticrobe name = "mystic's robe" @@ -461,14 +461,14 @@ desc = "A jacket for a party ooordinator, stylish!." icon_state = "capformal" inhand_icon_state = "capspacesuit" - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 25, BIO = 0, FIRE = 50, ACID = 50) /obj/item/clothing/suit/hawaiian name = "hawaiian overshirt" desc = "A cool shirt for chilling on the beach." icon_state = "hawaiian_blue" inhand_icon_state = "hawaiian_blue" - species_exception = list(/datum/species/golem) + /obj/item/clothing/suit/yakuza name = "tojo clan jacket" diff --git a/code/modules/clothing/suits/ghostsheet.dm b/code/modules/clothing/suits/ghostsheet.dm index 901e823624ca..ef6cfa71bac5 100644 --- a/code/modules/clothing/suits/ghostsheet.dm +++ b/code/modules/clothing/suits/ghostsheet.dm @@ -9,7 +9,7 @@ w_class = WEIGHT_CLASS_TINY flags_inv = HIDEGLOVES|HIDEEARS|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT alternate_worn_layer = UNDER_HEAD_LAYER - species_exception = list(/datum/species/golem) + /obj/item/clothing/suit/ghost_sheet/spooky name = "spooky ghost" diff --git a/code/modules/clothing/suits/jacket.dm b/code/modules/clothing/suits/jacket.dm index c9c99704737b..236f13931712 100644 --- a/code/modules/clothing/suits/jacket.dm +++ b/code/modules/clothing/suits/jacket.dm @@ -7,7 +7,7 @@ body_parts_covered = CHEST|GROIN|ARMS cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/leather @@ -18,7 +18,6 @@ resistance_flags = NONE max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT 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/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/radio) - species_exception = list(/datum/species/golem/bone) //bad to the bone /obj/item/clothing/suit/jacket/leather/overcoat name = "leather overcoat" @@ -33,8 +32,7 @@ desc = "A thick jacket with a rubbery, water-resistant shell." icon_state = "pufferjacket" inhand_icon_state = "hostrench" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 0, ACID = 0) - species_exception = list(/datum/species/golem/bone) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/puffer/vest @@ -44,7 +42,7 @@ inhand_icon_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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/miljacket @@ -60,7 +58,7 @@ desc = "A classic brown letterman jacket. Looks pretty hot and heavy." icon_state = "letterman" inhand_icon_state = "letterman" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/letterman_red @@ -68,7 +66,7 @@ desc = "A letterman jacket in a sick red color. Radical." icon_state = "letterman_red" inhand_icon_state = "letterman_red" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/letterman_syndie @@ -76,7 +74,7 @@ desc = "Oddly, this jacket seems to have a large S on the back..." icon_state = "letterman_s" inhand_icon_state = "letterman_s" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/jacket/letterman_nanotrasen @@ -84,5 +82,5 @@ desc = "A blue letterman jacket with a proud Nanotrasen N on the back. The tag says that it was made in Space China." icon_state = "letterman_n" inhand_icon_state = "letterman_n" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 3b8707985389..ed57881b00f4 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -11,7 +11,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST|GROIN allowed = list(/obj/item/reagent_containers/spray/plantbgone, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator, /obj/item/reagent_containers/spray/pestspray, /obj/item/hatchet, /obj/item/storage/bag/plants, /obj/item/graft, /obj/item/secateurs, /obj/item/geneshears) - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/apron/waders @@ -43,7 +43,7 @@ body_parts_covered = CHEST|GROIN|ARMS allowed = list(/obj/item/kitchen, /obj/item/knife/kitchen, /obj/item/storage/bag/tray) toggle_noun = "sleeves" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //Cook @@ -58,13 +58,12 @@ //Detective /obj/item/clothing/suit/det_suit - name = "trenchcoat" - desc = "A 18th-century multi-purpose trenchcoat. Someone who wears this means serious business." + name = "rumpled raincoat" + desc = "An old tan raincoat that's been poorly taken care of. You've still got one last question..." icon_state = "detective" inhand_icon_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|LEGS|ARMS - armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 35, BOMB = 0, BIO = 0, FIRE = 0, ACID = 45) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -73,16 +72,16 @@ . = ..() allowed = GLOB.detective_vest_allowed -/obj/item/clothing/suit/det_suit/dark - name = "noir trenchcoat" - desc = "A hard-boiled private investigator's dark trenchcoat." +/obj/item/clothing/suit/det_suit/noir + name = "grey trenchcoat" + desc = "A large grey trenchcoat for a hard-boiled investigator." icon_state = "noirdet" inhand_icon_state = "greydet" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/suit/det_suit/noir - name = "noir suit coat" - desc = "A dapper private investigator's dark suit coat." +/obj/item/clothing/suit/det_suit/dark + name = "sleek suit coat" + desc = "A dapper dark suit coat." icon_state = "detsuit" inhand_icon_state = "detsuit" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -97,10 +96,10 @@ blood_overlay_type = "armor" allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/t_scanner, /obj/item/radio, /obj/item/storage/bag/construction) resistance_flags = NONE - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/suit/hazardvest/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/suit/hazardvest/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) @@ -113,7 +112,7 @@ inhand_icon_state = "suitjacket_blue" blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS - species_exception = list(/datum/species/golem) + /obj/item/clothing/suit/toggle/lawyer/purple name = "purple suit jacket" @@ -137,7 +136,7 @@ worn_icon_state = "suspenders" blood_overlay_type = "armor" //it's the less thing that I can put here toggle_noun = "straps" - species_exception = list(/datum/species/golem) + greyscale_config = /datum/greyscale_config/suspenders greyscale_config_worn = /datum/greyscale_config/suspenders/worn greyscale_colors = "#ff0000" @@ -171,7 +170,7 @@ body_parts_covered = CHEST|ARMS /obj/item/clothing/suit/security/hos - name = "head of security's jacket" + name = "security marshal's jacket" desc = "This piece of clothing was specifically designed for asserting superior authority." icon_state = "hosbluejacket" inhand_icon_state = "hosbluejacket" @@ -186,7 +185,6 @@ /obj/item/hemostat, /obj/item/cautery, /obj/item/scalpel, - /obj/item/surgical_drapes, /obj/item/retractor, /obj/item/bonesetter, /obj/item/flashlight/pen, @@ -209,7 +207,7 @@ blood_overlay_type = "coat" body_parts_covered = CHEST|ARMS allowed = list(/obj/item/tank/internals, /obj/item/melee/curator_whip, /obj/item/storage/bag/books) - armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 35, BOMB = 0, BIO = 0, FIRE = 0, ACID = 45) + armor = list(BLUNT = 25, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 35, BOMB = 0, BIO = 0, FIRE = 0, ACID = 45) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS @@ -252,5 +250,5 @@ desc = "A tacky set of purple overalls, ideal for wearing while wrangling slimes." icon_state = "overalls_sci" inhand_icon_state = "p_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 50, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 50, ACID = 50) supports_variations_flags = CLOTHING_TESHARI_VARIATION diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index f57bd90f4ff6..7add1c48aeb7 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -7,7 +7,6 @@ body_parts_covered = CHEST|ARMS allowed = list( /obj/item/analyzer, - /obj/item/biopsy_tool, /obj/item/dnainjector, /obj/item/flashlight/pen, /obj/item/healthanalyzer, @@ -18,16 +17,15 @@ /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/pill, /obj/item/reagent_containers/syringe, - /obj/item/gun/syringe, /obj/item/sensor_device, /obj/item/soap, /obj/item/stack/medical, /obj/item/storage/pill_bottle, /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, FIRE = 50, ACID = 50) - species_exception = list(/datum/species/golem) + /obj/item/tank/internals/plasmaman + ) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 50, ACID = 50) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/toggle/labcoat/cmo @@ -36,12 +34,6 @@ icon_state = "labcoat_cmo" inhand_icon_state = "labcoat_cmo" -/obj/item/clothing/suit/toggle/labcoat/cmo/Initialize(mapload) - . = ..() - allowed += list( - /obj/item/melee/baton/telescopic, - ) - /obj/item/clothing/suit/toggle/labcoat/paramedic name = "paramedic's jacket" desc = "A dark blue jacket for paramedics with reflective stripes." diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index 08712843c40b..b79648eae7bd 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -30,10 +30,10 @@ icon_state = "reactiveoff" inhand_icon_state = "reactiveoff" blood_overlay_type = "armor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - hit_reaction_chance = 50 + block_chance = 50 ///Whether the armor will try to react to hits (is it on) var/active = FALSE ///This will be true for 30 seconds after an EMP, it makes the reaction effect dangerous to the user. @@ -67,16 +67,25 @@ update_icon() add_fingerprint(user) -/obj/item/clothing/suit/armor/reactive/hit_reaction(owner, hitby, attack_text, final_block_chance, damage, attack_type) - if(!active || !prob(hit_reaction_chance)) +/obj/item/clothing/suit/armor/reactive/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) + if(!active) return FALSE + if(world.time < reactivearmor_cooldown) - cooldown_activation(owner) + cooldown_activation(wielder) return FALSE + + return ..() + +/obj/item/clothing/suit/armor/reactive/hit_reaction(owner, hitby, attack_text, damage, attack_type) + . = ..() + if(!.) + return + if(bad_effect) - return emp_activation(owner, hitby, attack_text, final_block_chance, damage, attack_type) + return emp_activation(owner, hitby, attack_text, damage, attack_type) else - return reactive_activation(owner, hitby, attack_text, final_block_chance, damage, attack_type) + return reactive_activation(owner, hitby, attack_text, damage, attack_type) /** * A proc for doing cooldown effects (like the sparks on the tesla armor, or the semi-stealth on stealth armor) @@ -91,7 +100,7 @@ * Called from the suit activating while off cooldown, with no emp. * Returning TRUE will block the attack that triggered this */ -/obj/item/clothing/suit/armor/reactive/proc/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/proc/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive armor doesn't do much! No surprises here.")) return TRUE @@ -100,7 +109,7 @@ * Called from the suit activating while off cooldown, while the armor is still suffering from the effect of an EMP. * Returning TRUE will block the attack that triggered this */ -/obj/item/clothing/suit/armor/reactive/proc/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/proc/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive armor doesn't do much, despite being emp'd! Besides giving off a special message, of course.")) return TRUE @@ -121,14 +130,14 @@ reactivearmor_cooldown_duration = 10 SECONDS var/tele_range = 6 -/obj/item/clothing/suit/armor/reactive/teleport/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/teleport/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings [owner] clear of [attack_text]!")) playsound(get_turf(owner),'sound/magic/blink.ogg', 100, TRUE) do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE -/obj/item/clothing/suit/armor/reactive/teleport/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/teleport/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings itself clear of [attack_text], leaving someone behind in the process!")) owner.dropItemToGround(src, TRUE, TRUE) playsound(get_turf(owner),'sound/machines/buzz-sigh.ogg', 50, TRUE) @@ -145,7 +154,7 @@ cooldown_message = span_danger("The reactive incendiary armor activates, but fails to send out flames as it is still recharging its flame jets!") emp_message = span_warning("The reactive incendiary armor's targeting system begins rebooting...") -/obj/item/clothing/suit/armor/reactive/fire/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/fire/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], sending out jets of flame!")) playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE) for(var/mob/living/carbon/carbon_victim in range(6, owner)) @@ -156,7 +165,7 @@ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE -/obj/item/clothing/suit/armor/reactive/fire/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/fire/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] just makes [attack_text] worse by spewing molten death on [owner]!")) playsound(get_turf(owner),'sound/magic/fireball.ogg', 100, TRUE) owner.adjust_fire_stacks(12) @@ -188,7 +197,7 @@ animate(owner, alpha = initial(owner.alpha), time = cooldown_animation_time) ..() -/obj/item/clothing/suit/armor/reactive/stealth/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/stealth/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) var/mob/living/simple_animal/hostile/illusion/escape/decoy = new(owner.loc) decoy.Copy_Parent(owner, 50) decoy.GiveTarget(owner) //so it starts running right away @@ -204,7 +213,7 @@ in_stealth = FALSE animate(owner, alpha = initial(owner.alpha), time = animation_time) -/obj/item/clothing/suit/armor/reactive/stealth/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/stealth/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) if(!isliving(hitby)) return FALSE //it just doesn't activate var/mob/living/attacker = hitby @@ -222,37 +231,31 @@ siemens_coefficient = -1 cooldown_message = span_danger("The tesla capacitors on the reactive tesla armor are still recharging! The armor merely emits some sparks.") emp_message = span_warning("The tesla capacitors beep ominously for a moment.") + clothing_traits = list(TRAIT_TESLA_SHOCKIMMUNE) + /// How strong are the zaps we give off? var/zap_power = 25000 + /// How far to the zaps we give off go? var/zap_range = 20 + /// What flags do we pass to the zaps we give off? var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE -/obj/item/clothing/suit/armor/reactive/tesla/dropped(mob/user) - ..() - if(istype(user)) - REMOVE_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") - -/obj/item/clothing/suit/armor/reactive/tesla/equipped(mob/user, slot) - ..() - if(slot_flags & slot) //Was equipped to a valid slot for this item? - ADD_TRAIT(user, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") - /obj/item/clothing/suit/armor/reactive/tesla/cooldown_activation(mob/living/carbon/human/owner) var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(1, 1, src) sparks.start() ..() -/obj/item/clothing/suit/armor/reactive/tesla/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/tesla/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], sending out arcs of lightning!")) tesla_zap(owner, zap_range, zap_power, zap_flags) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE -/obj/item/clothing/suit/armor/reactive/tesla/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/tesla/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("[src] blocks [attack_text], but pulls a massive charge of energy into [owner] from the surrounding environment!")) - REMOVE_TRAIT(owner, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") //oops! can't shock without this! + REMOVE_CLOTHING_TRAIT(owner, TRAIT_TESLA_SHOCKIMMUNE) //oops! can't shock without this! //oops! can't shock without this! electrocute_mob(owner, get_area(src), src, 1) - ADD_TRAIT(owner, TRAIT_TESLA_SHOCKIMMUNE, "reactive_tesla_armor") + ADD_CLOTHING_TRAIT(owner, TRAIT_TESLA_SHOCKIMMUNE) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE @@ -265,7 +268,7 @@ emp_message = span_warning("The repulse generator is reset to default settings...") var/repulse_force = MOVE_FORCE_EXTREMELY_STRONG -/obj/item/clothing/suit/armor/reactive/repulse/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/repulse/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, TRUE) owner.visible_message(span_danger("[src] blocks [attack_text], converting the attack into a wave of force!")) var/turf/owner_turf = get_turf(owner) @@ -280,7 +283,7 @@ reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE -/obj/item/clothing/suit/armor/reactive/repulse/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/repulse/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) playsound(get_turf(owner),'sound/magic/repulse.ogg', 100, TRUE) owner.visible_message(span_danger("[src] does not block [attack_text], and instead generates an attracting force!")) var/turf/owner_turf = get_turf(owner) @@ -301,20 +304,19 @@ emp_message = span_danger("The reactive table armor's fabricators click and whirr ominously for a moment...") var/tele_range = 10 -/obj/item/clothing/suit/armor/reactive/table/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/table/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings [owner] clear of [attack_text] and slams [owner.p_them()] into a fabricated table!")) owner.visible_message("[owner] GOES ON THE TABLE!!!") owner.Knockdown(30) owner.apply_damage(10, BRUTE) owner.stamina.adjust(-40) playsound(owner, 'sound/effects/tableslam.ogg', 90, TRUE) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE) new /obj/structure/table(get_turf(owner)) reactivearmor_cooldown = world.time + reactivearmor_cooldown_duration return TRUE -/obj/item/clothing/suit/armor/reactive/table/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/armor/reactive/table/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) owner.visible_message(span_danger("The reactive teleport system flings [owner] clear of [attack_text] and slams [owner.p_them()] into a fabricated glass table!")) owner.visible_message("[owner] GOES ON THE GLASS TABLE!!!") do_teleport(owner, get_turf(owner), tele_range, no_effects = TRUE, channel = TELEPORT_CHANNEL_BLUESPACE) diff --git a/code/modules/clothing/suits/shirt.dm b/code/modules/clothing/suits/shirt.dm index ba8c5b74a8db..06086664caa7 100644 --- a/code/modules/clothing/suits/shirt.dm +++ b/code/modules/clothing/suits/shirt.dm @@ -3,7 +3,7 @@ desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it, but it's pretty close. Good for sleeping in." icon_state = "ianshirt" inhand_icon_state = "ianshirt" - species_exception = list(/datum/species/golem) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION ///How many times has this shirt been washed? (In an ideal world this is just the determinant of the transform matrix.) var/wash_count = 0 @@ -23,4 +23,4 @@ desc = "A baggy shirt with vintage game character Phanic the Weasel. Why would anyone wear this?" icon_state = "nerdshirt" inhand_icon_state = "nerdshirt" - species_exception = list(/datum/species/golem) + diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 358ba5a69b26..6b1621eb265a 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -15,8 +15,8 @@ MakeHood() /obj/item/clothing/suit/hooded/Destroy() - . = ..() QDEL_NULL(hood) + return ..() /obj/item/clothing/suit/hooded/proc/MakeHood() if(!hood) @@ -87,7 +87,11 @@ /obj/item/clothing/head/hooded/Destroy() - suit = null + if(suit) + var/obj/item/clothing/suit/hooded/old_suit = suit + suit.hood = null + suit = null + old_suit.RemoveHood() return ..() /obj/item/clothing/head/hooded/dropped() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index b4d1d11c6774..d0c4c188137a 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -20,7 +20,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/extinguisher, /obj/item/crowbar) slowdown = 1 - armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 10, FIRE = 100, ACID = 50) + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 10, FIRE = 100, ACID = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -31,7 +31,7 @@ equip_delay_other = 60 resistance_flags = FIRE_PROOF -/obj/item/clothing/suit/fire/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/suit/fire/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) @@ -62,7 +62,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" clothing_flags = THICKMATERIAL | SNUG_FIT - armor = list(MELEE = 20, BULLET = 0, LASER = 20,ENERGY = 30, BOMB = 100, BIO = 0, FIRE = 80, ACID = 50) + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 100, BIO = 0, FIRE = 80, ACID = 50) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT cold_protection = HEAD @@ -85,7 +85,7 @@ clothing_flags = THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 2 - armor = list(MELEE = 20, BULLET = 0, LASER = 20,ENERGY = 30, BOMB = 100, BIO = 0, FIRE = 80, ACID = 50) + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 100, BIO = 0, FIRE = 80, ACID = 50) flags_inv = HIDEJUMPSUIT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT @@ -124,7 +124,7 @@ desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" clothing_flags = THICKMATERIAL | SNUG_FIT flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 60, FIRE = 30, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, FIRE = 30, ACID = 30) strip_delay = 60 equip_delay_other = 60 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF @@ -147,7 +147,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/geiger_counter) slowdown = 1.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 60, FIRE = 30, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, FIRE = 30, ACID = 30) strip_delay = 60 equip_delay_other = 60 flags_inv = HIDEJUMPSUIT @@ -158,7 +158,7 @@ . = ..() AddElement(/datum/element/radiation_protected_clothing) -/obj/item/clothing/suit/radiation/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/suit/radiation/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) diff --git a/code/modules/clothing/suits/wetfloor.dm b/code/modules/clothing/suits/wetfloor.dm index 9bccc903a32f..f40b74bf67b2 100644 --- a/code/modules/clothing/suits/wetfloor.dm +++ b/code/modules/clothing/suits/wetfloor.dm @@ -6,11 +6,10 @@ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi' force = 1 throwforce = 3 - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL body_parts_covered = CHEST|GROIN attack_verb_continuous = list("warns", "cautions", "smashes") attack_verb_simple = list("warn", "caution", "smash") - armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - species_exception = list(/datum/species/golem) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 02bd8b5ed9f7..c6873e9f1622 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -10,7 +10,7 @@ cold_protection = CHEST|GROIN|ARMS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT allowed = list() - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/suit/hooded/wintercoat/Initialize(mapload) @@ -37,7 +37,7 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT flags_inv = HIDEHAIR|HIDEEARS - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION // CentCom @@ -46,7 +46,7 @@ desc = "A luxurious winter coat woven in the bright green and gold colours of Central Command. It has a small pin in the shape of the Nanotrasen logo for a zipper." icon_state = "coatcentcom" inhand_icon_state = "coatcentcom" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) + armor = list(BLUNT = 35, PUNCTURE = 40, SLASH = 0, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom supports_variations_flags = NONE @@ -56,7 +56,7 @@ /obj/item/clothing/head/hooded/winterhood/centcom icon_state = "hood_centcom" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) + armor = list(BLUNT = 35, PUNCTURE = 40, SLASH = 0, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, FIRE = 10, ACID = 60) supports_variations_flags = NONE // Captain @@ -67,7 +67,7 @@ Extremely lavish, and extremely durable." icon_state = "coatcaptain" inhand_icon_state = "coatcaptain" - armor = list(MELEE = 25, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 50) hoodtype = /obj/item/clothing/head/hooded/winterhood/captain supports_variations_flags = NONE @@ -77,7 +77,7 @@ /obj/item/clothing/head/hooded/winterhood/captain icon_state = "hood_captain" - armor = list(MELEE = 25, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 50) + armor = list(BLUNT = 25, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 50) supports_variations_flags = NONE // Head of Personnel @@ -86,10 +86,7 @@ desc = "A cozy winter coat, covered in thick fur. The breast features a proud yellow chevron, reminding everyone that you're the second banana." icon_state = "coathop" inhand_icon_state = "coathop" - armor = list(MELEE = 10, BULLET = 15, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 0, ACID = 35) - allowed = list( - /obj/item/melee/baton/telescopic, - ) + armor = list(BLUNT = 10, PUNCTURE = 15, SLASH = 0, LASER = 15, ENERGY = 25, BOMB = 10, BIO = 0, FIRE = 0, ACID = 35) hoodtype = /obj/item/clothing/head/hooded/winterhood/hop supports_variations_flags = NONE @@ -145,7 +142,7 @@ desc = "A red, armour-padded winter coat. It glitters with a mild ablative coating and a robust air of authority. The zipper tab is a pair of jingly little handcuffs that get annoying after the first ten seconds." icon_state = "coatsecurity" inhand_icon_state = "coatsecurity" - armor = list(MELEE = 25, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 45) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 45) hoodtype = /obj/item/clothing/head/hooded/winterhood/security /obj/item/clothing/suit/hooded/wintercoat/security/Initialize(mapload) @@ -155,16 +152,16 @@ /obj/item/clothing/head/hooded/winterhood/security desc = "A red, armour-padded winter hood. Definitely not bulletproof, especially not the part where your face goes." icon_state = "hood_security" - armor = list(MELEE = 25, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 45) + armor = list(BLUNT = 25, PUNCTURE = 15, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 0, ACID = 45) supports_variations_flags = NONE -// Head of Security +// Security Marshal /obj/item/clothing/suit/hooded/wintercoat/security/hos - name = "head of security's winter coat" + name = "security marshal's winter coat" desc = "A red, armour-padded winter coat, lovingly woven with a Kevlar interleave and reinforced with semi-ablative polymers and a silver azide fill material. The zipper tab looks like a tiny replica of Beepsky." icon_state = "coathos" inhand_icon_state = "coathos" - armor = list(MELEE = 35, BULLET = 25, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 0, FIRE = 0, ACID = 55) + armor = list(BLUNT = 35, PUNCTURE = 25, SLASH = 0, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 0, FIRE = 0, ACID = 55) hoodtype = /obj/item/clothing/head/hooded/winterhood/security/hos supports_variations_flags = NONE @@ -192,14 +189,14 @@ /obj/item/sensor_device, /obj/item/storage/pill_bottle, ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 40, FIRE = 10, ACID = 20) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 40, FIRE = 10, ACID = 20) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical supports_variations_flags = NONE /obj/item/clothing/head/hooded/winterhood/medical desc = "A white winter coat hood." icon_state = "hood_medical" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 40, FIRE = 10, ACID = 20) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 40, FIRE = 10, ACID = 20) supports_variations_flags = NONE // Medical Director @@ -208,19 +205,13 @@ desc = "A winter coat in a vibrant shade of blue with a small silver caduceus instead of a plastic zipper tab. The normal liner is replaced with an exceptionally thick, soft layer of fur." icon_state = "coatcmo" inhand_icon_state = "coatcmo" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 20, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 20, ACID = 30) hoodtype = /obj/item/clothing/head/hooded/winterhood/medical/cmo -/obj/item/clothing/suit/hooded/wintercoat/medical/cmo/Initialize(mapload) - . = ..() - allowed += list( - /obj/item/melee/baton/telescopic, - ) - /obj/item/clothing/head/hooded/winterhood/medical/cmo desc = "A blue winter coat hood." icon_state = "hood_cmo" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 20, ACID = 30) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, FIRE = 20, ACID = 30) // Chemist /obj/item/clothing/suit/hooded/wintercoat/medical/chemistry @@ -287,15 +278,15 @@ /obj/item/storage/pill_bottle, /obj/item/storage/bag/xeno, ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science - species_exception = list(/datum/species/golem) + supports_variations_flags = NONE /obj/item/clothing/head/hooded/winterhood/science desc = "A white winter coat hood. This one will keep your brain warm. About as much as the others, really." icon_state = "hood_science" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) // Research Director /obj/item/clothing/suit/hooded/wintercoat/science/rd @@ -303,19 +294,13 @@ desc = "A thick arctic winter coat with an outdated atomic model instead of a plastic zipper tab. Most in the know are heavily aware that Bohr's model of the atom was outdated by the time of the 1930s when the Heisenbergian and Schrodinger models were generally accepted for true. Nevertheless, we still see its use in anachronism, roleplaying, and, in this case, as a zipper tab. At least it should keep you warm on your ivory pillar." icon_state = "coatrd" inhand_icon_state = "coatrd" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/science/rd -/obj/item/clothing/suit/hooded/wintercoat/science/rd/Initialize(mapload) - . = ..() - allowed += list( - /obj/item/melee/baton/telescopic, - ) - /obj/item/clothing/head/hooded/winterhood/science/rd desc = "A white winter coat hood. It smells faintly of hair gel." icon_state = "hood_rd" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 0) // Roboticist /obj/item/clothing/suit/hooded/wintercoat/science/robotics @@ -355,12 +340,11 @@ /obj/item/t_scanner, /obj/item/storage/bag/construction, ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering - species_exception = list(/datum/species/golem/uranium) supports_variations_flags = NONE -/obj/item/clothing/suit/hooded/wintercoat/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/suit/hooded/wintercoat/engineering/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) @@ -368,10 +352,10 @@ /obj/item/clothing/head/hooded/winterhood/engineering desc = "A yellow winter coat hood. Definitely not a replacement for a hard hat." icon_state = "hood_engineer" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 20, ACID = 0) zmm_flags = ZMM_MANGLE_PLANES -/obj/item/clothing/head/hooded/winterhood/engineering/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/clothing/head/hooded/winterhood/engineering/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "[icon_state]-emissive", alpha = src.alpha) @@ -382,19 +366,13 @@ desc = "A white winter coat with reflective green and yellow stripes. Stuffed with asbestos, treated with fire retardant PBDE, lined with a micro thin sheet of lead foil and snugly fitted to your body's measurements. This baby's ready to save you from anything except the thyroid cancer and systemic fibrosis you'll get from wearing it. The zipper tab is a tiny golden wrench." icon_state = "coatce" inhand_icon_state = "coatce" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 10) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 10) hoodtype = /obj/item/clothing/head/hooded/winterhood/engineering/ce -/obj/item/clothing/suit/hooded/wintercoat/engineering/ce/Initialize(mapload) - . = ..() - allowed += list( - /obj/item/melee/baton/telescopic, - ) - /obj/item/clothing/head/hooded/winterhood/engineering/ce desc = "A white winter coat hood. Feels surprisingly heavy. The tag says that it's not child safe." icon_state = "hood_ce" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 10) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 10) // Atmospherics Technician /obj/item/clothing/suit/hooded/wintercoat/engineering/atmos @@ -441,7 +419,6 @@ icon_state = "coatminer" inhand_icon_state = "coatminer" allowed = list( - /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/mining_scanner, /obj/item/pickaxe, /obj/item/resonator, @@ -449,13 +426,13 @@ /obj/item/tank/internals, /obj/item/storage/bag/ore, ) - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) hoodtype = /obj/item/clothing/head/hooded/winterhood/miner /obj/item/clothing/head/hooded/winterhood/miner desc = "A dusty winter coat hood." icon_state = "hood_miner" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/clothing/suit/hooded/wintercoat/custom name = "tailored winter coat" @@ -467,7 +444,7 @@ flags_1 = IS_PLAYER_COLORABLE_1 //In case colors are changed after initialization -/obj/item/clothing/suit/hooded/wintercoat/custom/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right) +/obj/item/clothing/suit/hooded/wintercoat/custom/set_greyscale(list/colors, new_config, queue, new_worn_config, new_inhand_left, new_inhand_right) . = ..() if(hood) var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 51031ad8774b..49413170dd23 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -3,10 +3,10 @@ desc = "Strange-looking hat-wear that most certainly belongs to a real magic user." icon_state = "wizard" permeability_coefficient = 0.01 - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100, WOUND = 20) + armor = list(BLUNT = 30, PUNCTURE = 20, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100) strip_delay = 50 equip_delay_other = 50 - clothing_flags = SNUG_FIT + clothing_flags = SNUG_FIT | CASTING_CLOTHES resistance_flags = FIRE_PROOF | ACID_PROOF dog_fashion = /datum/dog_fashion/head/blue_wizard supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -37,7 +37,7 @@ desc = "It has WIZZARD written across it in sequins. Comes with a cool beard." icon_state = "wizard-fake" permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard supports_variations_flags = NONE @@ -71,11 +71,12 @@ inhand_icon_state = "wizrobe" permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100, WOUND = 20) + armor = list(BLUNT = 30, PUNCTURE = 20, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 20, FIRE = 100, ACID = 100) allowed = list(/obj/item/teleportation_scroll, /obj/item/highfrequencyblade/wizard) flags_inv = HIDEJUMPSUIT strip_delay = 50 equip_delay_other = 50 + clothing_flags = SNUG_FIT | CASTING_CLOTHES resistance_flags = FIRE_PROOF | ACID_PROOF /obj/item/clothing/suit/wizrobe/red @@ -127,7 +128,7 @@ icon_state = "wizard-fake" inhand_icon_state = "wizrobe" permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE /obj/item/clothing/head/wizard/marisa/fake @@ -135,7 +136,7 @@ desc = "Strange-looking hat-wear, makes you want to cast fireballs." icon_state = "marisa" permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE /obj/item/clothing/suit/wizrobe/marisa/fake @@ -144,40 +145,9 @@ icon_state = "marisa" inhand_icon_state = "marisarobe" permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = FLAMMABLE -/obj/item/clothing/suit/wizrobe/paper - name = "papier-mache robe" // no non-latin characters! - desc = "A robe held together by various bits of clear-tape and paste." - icon_state = "wizard-paper" - inhand_icon_state = "wizard-paper" - var/robe_charge = TRUE - actions_types = list(/datum/action/item_action/stickmen) - - -/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action) - stickmen() - - -/obj/item/clothing/suit/wizrobe/paper/verb/stickmen() - set category = "Object" - set name = "Summon Stick Minions" - if(!isliving(usr)) - return - if(!robe_charge) - to_chat(usr, span_warning("The robe's internal magic supply is still recharging!")) - return - - usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning") - playsound(loc, 'sound/magic/summon_magic.ogg', 50, TRUE, TRUE) - var/mob/living/M = new /mob/living/basic/stickman(get_turf(usr)) - M.faction += list("[REF(usr)]") - robe_charge = FALSE - sleep(30) - robe_charge = TRUE - to_chat(usr, span_notice("The robe hums, its internal magic supply restored.")) - // The actual code for this is handled in the shielded component, see [/datum/component/shielded/proc/check_recharge_rune] /obj/item/wizard_armour_charge name = "battlemage shield charges" diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 8a9bd620c964..e6393d85a4a7 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -7,7 +7,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, FIRE = 0, ACID = 0, WOUND = 5) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) equip_sound = 'sound/items/equip/jumpsuit_equip.ogg' drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' @@ -30,19 +30,29 @@ . = ..() if(random_sensor) //make the sensor mode favor higher levels, except coords. - sensor_mode = pick(SENSOR_VITALS, SENSOR_VITALS, SENSOR_VITALS, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF) + sensor_mode = pick(SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS, SENSOR_COORDS, SENSOR_OFF) if(!(body_parts_covered & LEGS)) fallback_icon_state = "under_skirt" -/obj/item/clothing/under/worn_overlays(mutable_appearance/standing, isinhands = FALSE) +/obj/item/clothing/under/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) return if(damaged_clothes) . += mutable_appearance('icons/effects/item_damage.dmi', "damageduniform") - if(HAS_BLOOD_DNA(src)) - . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") + + var/list/dna = return_blood_DNA() + if(length(dna)) + if(istype(wearer)) + var/obj/item/bodypart/chest = wearer.get_bodypart(BODY_ZONE_CHEST) + if(!chest?.icon_bloodycover) + return + var/image/bloody_overlay = image(chest.icon_bloodycover, "uniformblood") + bloody_overlay.color = get_blood_dna_color(dna) + . += bloody_overlay + else + . += mutable_appearance('icons/effects/blood.dmi', "uniformblood") if(accessory_overlay) . += accessory_overlay @@ -66,9 +76,6 @@ /obj/item/clothing/under/update_clothes_damaged_state(damaged_state = CLOTHING_DAMAGED) ..() - if(ismob(loc)) - var/mob/M = loc - M.update_worn_undersuit() if(damaged_state == CLOTHING_SHREDDED && has_sensor > NO_SENSORS) has_sensor = BROKEN_SENSORS else if(damaged_state == CLOTHING_PRISTINE && has_sensor == BROKEN_SENSORS) @@ -85,7 +92,7 @@ var/mob/M = loc to_chat(M,span_warning("[src]'s sensors short out!")) else - sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_VITALS, SENSOR_VITALS, SENSOR_COORDS) + sensor_mode = pick(SENSOR_OFF, SENSOR_OFF, SENSOR_OFF, SENSOR_LIVING, SENSOR_LIVING, SENSOR_COORDS) if(ismob(loc)) var/mob/M = loc to_chat(M,span_warning("The sensors on the [src] change rapidly!")) @@ -112,7 +119,6 @@ if(attached_accessory && slot != ITEM_SLOT_HANDS && ishuman(user)) var/mob/living/carbon/human/H = user attached_accessory.on_uniform_equip(src, user) - H.fan_hud_set_fandom() if(attached_accessory.above_suit) H.update_worn_oversuit() @@ -120,14 +126,12 @@ ..() if(slot == ITEM_SLOT_ICLOTHING && freshly_laundered) freshly_laundered = FALSE - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "fresh_laundry", /datum/mood_event/fresh_laundry) /obj/item/clothing/under/dropped(mob/user) if(attached_accessory) attached_accessory.on_uniform_dropped(src, user) if(ishuman(user)) var/mob/living/carbon/human/H = user - H.fan_hud_set_fandom() if(attached_accessory.above_suit) H.update_worn_oversuit() ..() @@ -177,9 +181,7 @@ return var/mob/living/carbon/human/holder = loc - holder.update_worn_undersuit() - holder.update_worn_oversuit() - holder.fan_hud_set_fandom() + holder.update_slots_for_item(src) /obj/item/clothing/under/proc/remove_accessory(mob/user) . = FALSE @@ -204,10 +206,7 @@ return var/mob/living/carbon/human/holder = loc - holder.update_worn_undersuit() - holder.update_worn_oversuit() - holder.fan_hud_set_fandom() - + holder.update_slots_for_item(src) /obj/item/clothing/under/examine(mob/user) . = ..() @@ -225,11 +224,10 @@ if(SENSOR_OFF) . += "Its sensors appear to be disabled." if(SENSOR_LIVING) - . += "Its binary life sensors appear to be enabled." - if(SENSOR_VITALS) . += "Its vital tracker appears to be enabled." if(SENSOR_COORDS) . += "Its vital tracker and tracking beacon appear to be enabled." + if(attached_accessory) . += "\A [attached_accessory] is attached to it." @@ -252,7 +250,7 @@ to_chat(usr, "This suit does not have any sensors.") return - var/list/modes = list("Off", "Binary vitals", "Exact vitals", "Tracking beacon") + var/list/modes = list("Off", "Vitals", "Tracking beacon") var/switchMode = tgui_input_list(M, "Select a sensor mode", "Suit Sensors", modes, modes[sensor_mode + 1]) if(isnull(switchMode)) return @@ -262,14 +260,12 @@ sensor_mode = modes.Find(switchMode) - 1 if (loc == usr) switch(sensor_mode) - if(0) + if(SENSOR_OFF) to_chat(usr, span_notice("You disable your suit's remote sensing equipment.")) - if(1) + if(SENSOR_LIVING) to_chat(usr, span_notice("Your suit will now only report whether you are alive or dead.")) - if(2) - to_chat(usr, span_notice("Your suit will now only report your exact vital lifesigns.")) - if(3) - to_chat(usr, span_notice("Your suit will now report your exact vital lifesigns as well as your coordinate position.")) + if(SENSOR_COORDS) + to_chat(usr, span_notice("Your suit will now report your exact vital information as well as your coordinate position.")) if(ishuman(loc)) var/mob/living/carbon/human/H = loc @@ -281,7 +277,7 @@ if(.) return - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return if(attached_accessory) remove_accessory(user) @@ -304,10 +300,10 @@ to_chat(usr, span_notice("You adjust the suit to wear it more casually.")) else to_chat(usr, span_notice("You adjust the suit back to normal.")) + if(ishuman(usr)) var/mob/living/carbon/human/H = usr - H.update_worn_undersuit() - H.update_body() + H.update_slots_for_item(src, force_obscurity_update = TRUE) /obj/item/clothing/under/proc/toggle_jumpsuit_adjust() if(adjusted == DIGITIGRADE_STYLE) diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 697ec3ec81f9..d7c62f2ef2e7 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -36,13 +36,7 @@ pixel_y -= 8 U.add_overlay(src) - if (islist(U.armor) || isnull(U.armor)) // This proc can run before /obj/Initialize has run for U and src, - U.armor = getArmor(arglist(U.armor)) // we have to check that the armor list has been transformed into a datum before we try to call a proc on it - // This is safe to do as /obj/Initialize only handles setting up the datum if actually needed. - if (islist(armor) || isnull(armor)) - armor = getArmor(arglist(armor)) - - U.armor = U.armor.attachArmor(armor) + U.setArmor(U.returnArmor().attachArmor(src.returnArmor())) if(isliving(user)) on_uniform_equip(U, user) @@ -50,10 +44,10 @@ return TRUE /obj/item/clothing/accessory/proc/detach(obj/item/clothing/under/U, user) - if(U.atom_storage && U.atom_storage.real_location?.resolve() == src) + if(U.atom_storage && (U.atom_storage.get_real_location() == src)) QDEL_NULL(U.atom_storage) - U.armor = U.armor.detachArmor(armor) + U.setArmor(U.returnArmor().detachArmor(src.returnArmor())) if(isliving(user)) on_uniform_dropped(U, user) @@ -76,7 +70,7 @@ return /obj/item/clothing/accessory/attack_self_secondary(mob/user) - if(initial(above_suit) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(initial(above_suit) && user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) above_suit = !above_suit to_chat(user, "[src] will be worn [above_suit ? "above" : "below"] your suit.") return @@ -182,7 +176,7 @@ icon_state = "cargo" /obj/item/clothing/accessory/medal/ribbon/cargo - name = "\"cargo tech of the shift\" award" + name = "\"deckhand of the shift\" award" desc = "An award bestowed only upon those cargotechs who have exhibited devotion to their duty in keeping with the highest traditions of Cargonia." /obj/item/clothing/accessory/medal/silver @@ -241,7 +235,7 @@ desc = "An eccentric medal made of plasma." icon_state = "plasma" medaltype = "medal-plasma" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = -10, ACID = 0) //It's made of plasma. Of course it's flammable. + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = -10, ACID = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) /obj/item/clothing/accessory/medal/plasma/Initialize(mapload) @@ -365,31 +359,11 @@ desc = "A pin to show off your appreciation for clowns and clowning!" icon_state = "clown_enjoyer_pin" -/obj/item/clothing/accessory/clown_enjoyer_pin/on_uniform_equip(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_CLOWN_ENJOYER)) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "clown_enjoyer_pin", /datum/mood_event/clown_enjoyer_pin) - -/obj/item/clothing/accessory/clown_enjoyer_pin/on_uniform_dropped(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_CLOWN_ENJOYER)) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "clown_enjoyer_pin") - /obj/item/clothing/accessory/mime_fan_pin name = "\improper Mime Pin" desc = "A pin to show off your appreciation for mimes and miming!" icon_state = "mime_fan_pin" -/obj/item/clothing/accessory/mime_fan_pin/on_uniform_equip(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_MIME_FAN)) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "mime_fan_pin", /datum/mood_event/mime_fan_pin) - -/obj/item/clothing/accessory/mime_fan_pin/on_uniform_dropped(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(HAS_TRAIT(L, TRAIT_MIME_FAN)) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "mime_fan_pin") - //////////////// //OONGA BOONGA// //////////////// @@ -398,7 +372,7 @@ name = "bone talisman" desc = "A hunter's talisman, some say the old gods smile on those who wear it." icon_state = "talisman" - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) attachment_slot = null /obj/item/clothing/accessory/skullcodpiece @@ -406,7 +380,7 @@ desc = "A skull shaped ornament, intended to protect the important things in life." icon_state = "skull" above_suit = TRUE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) attachment_slot = GROIN /obj/item/clothing/accessory/skilt @@ -415,7 +389,7 @@ icon_state = "skilt" above_suit = TRUE minimize_when_attached = FALSE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, FIRE = 0, ACID = 25) attachment_slot = GROIN /obj/item/clothing/accessory/allergy_dogtag diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 6feb0e6647ab..ab3c8baf8bab 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -247,7 +247,7 @@ inhand_icon_state = "hostanclothes" worn_icon = 'icons/mob/clothing/under/security.dmi' alt_covers_chest = TRUE - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 30) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 30) strip_delay = 50 sensor_mode = SENSOR_COORDS random_sensor = FALSE diff --git a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm index b88faa768715..fb13e5b1204e 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/civilian_service.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/clothing/under/plasmaman.dmi' worn_icon = 'icons/mob/clothing/under/plasmaman.dmi' permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS can_adjust = FALSE strip_delay = 80 @@ -81,7 +81,7 @@ inhand_icon_state = "chap_envirosuit" /obj/item/clothing/under/plasmaman/curator - name = "curator's plasma envirosuit" + name = "archivist's plasma envirosuit" desc = "Made out of a modified voidsuit, this suit was Nanotrasen's first solution to the *logistical problems* that come with employing plasmamen. Due to the modifications, the suit is no longer space-worthy. Despite their limitations, these suits are still in used by historian and old-styled plasmamen alike." icon_state = "prototype_envirosuit" inhand_icon_state = "prototype_envirosuit" @@ -131,4 +131,4 @@ extinguishes_left-- H.visible_message(span_warning("[H]'s suit spews space lube everywhere!"),span_warning("Your suit spews space lube everywhere!")) H.extinguish_mob() - new /obj/effect/particle_effect/foam(loc) //Truely terrifying. + new /obj/effect/particle_effect/fluid/foam(loc) //Truely terrifying. diff --git a/code/modules/clothing/under/jobs/Plasmaman/command.dm b/code/modules/clothing/under/jobs/Plasmaman/command.dm index b6331be6f8a9..74a4ff0b40d9 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/command.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/command.dm @@ -5,7 +5,7 @@ inhand_icon_state = "captain_envirosuit" sensor_mode = SENSOR_COORDS random_sensor = FALSE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95, WOUND = 15) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/under/plasmaman/head_of_personnel name = "head of personnel's plasma envirosuit" @@ -14,12 +14,12 @@ inhand_icon_state = "hop_envirosuit" /obj/item/clothing/under/plasmaman/security/head_of_security - name = "head of security's envirosuit" - desc = "A plasmaman containment suit decorated for those few with the dedication to achieve the position of Head of Security." + name = "security marshal's envirosuit" + desc = "A plasmaman containment suit decorated for those few with the dedication to achieve the position of Security Marshal." icon_state = "hos_envirosuit" inhand_icon_state = "hos_envirosuit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95, WOUND = 10) - sensor_mode = 3 + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + sensor_mode = SENSOR_COORDS random_sensor = FALSE /obj/item/clothing/under/plasmaman/chief_engineer @@ -27,18 +27,18 @@ desc = "An air-tight suit designed to be used by plasmamen insane enough to achieve the rank of \"Chief Engineer\"." icon_state = "ce_envirosuit" inhand_icon_state = "ce_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/under/plasmaman/chief_medical_officer name = "medical director's plasma envirosuit" desc = "It's an envirosuit worn by those with the experience to be \"Medical Director\"." icon_state = "cmo_envirosuit" inhand_icon_state = "cmo_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/under/plasmaman/research_director name = "research director's plasma envirosuit" desc = "It's an envirosuit worn by those with the know-how to achieve the position of \"Research Director\"." icon_state = "rd_envirosuit" inhand_icon_state = "rd_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 4a7d162be4f2..ee5072b23045 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -3,12 +3,12 @@ desc = "An air-tight suit designed to be used by plasmamen employed as engineers, the usual purple stripes being replaced by engineering's orange. It protects the user from fire and acid damage." icon_state = "engineer_envirosuit" inhand_icon_state = "engineer_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) /obj/item/clothing/under/plasmaman/atmospherics name = "atmospherics plasma envirosuit" desc = "An air-tight suit designed to be used by plasmamen employed as atmos technicians, the usual purple stripes being replaced by atmos' blue." icon_state = "atmos_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) inhand_icon_state = "atmos_envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index 12b0671e61ee..1ffdaba39f6d 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -3,7 +3,7 @@ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." icon_state = "security_envirosuit" inhand_icon_state = "security_envirosuit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 95, ACID = 95) sensor_mode = SENSOR_COORDS random_sensor = FALSE diff --git a/code/modules/clothing/under/jobs/cargo.dm b/code/modules/clothing/under/jobs/cargo.dm index c674754bb70b..4761d78fa4b0 100644 --- a/code/modules/clothing/under/jobs/cargo.dm +++ b/code/modules/clothing/under/jobs/cargo.dm @@ -19,7 +19,7 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/cargo/tech - name = "cargo technician's jumpsuit" + name = JOB_DECKHAND + "'s jumpsuit" desc = "Shooooorts! They're comfy and easy to wear!" icon_state = "cargotech" inhand_icon_state = "lb_suit" @@ -29,7 +29,7 @@ /obj/item/clothing/under/rank/cargo/tech/skirt - name = "cargo technician's jumpskirt" + name = JOB_DECKHAND +"s jumpskirt" desc = "Skiiiiirts! They're comfy and easy to wear!" icon_state = "cargo_skirt" inhand_icon_state = "lb_suit" @@ -43,7 +43,7 @@ name = "shaft miner's jumpsuit" icon_state = "miner" inhand_icon_state = "miner" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 0, WOUND = 10) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 0) resistance_flags = NONE /obj/item/clothing/under/rank/cargo/miner/lavaland diff --git a/code/modules/clothing/under/jobs/centcom.dm b/code/modules/clothing/under/jobs/centcom.dm index a0a001b73af7..5fff208f6aad 100644 --- a/code/modules/clothing/under/jobs/centcom.dm +++ b/code/modules/clothing/under/jobs/centcom.dm @@ -54,7 +54,7 @@ desc = "A dark colored uniform worn by CentCom's conscripted military forces." icon_state = "military" inhand_icon_state = "bl_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) /obj/item/clothing/under/rank/centcom/military/eng name = "tactical engineering uniform" diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index ef0ffa5b3fa8..033c9f767ff5 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -116,7 +116,7 @@ desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" icon_state = "janitor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) /obj/item/clothing/under/rank/civilian/janitor/skirt name = "janitor's jumpskirt" diff --git a/code/modules/clothing/under/jobs/civilian/clown_mime.dm b/code/modules/clothing/under/jobs/civilian/clown_mime.dm index 9f2675adf2c1..3bbf060936e8 100644 --- a/code/modules/clothing/under/jobs/civilian/clown_mime.dm +++ b/code/modules/clothing/under/jobs/civilian/clown_mime.dm @@ -29,7 +29,6 @@ desc = "'HONK!'" icon_state = "clown" inhand_icon_state = "clown" - species_exception = list(/datum/species/golem/bananium) female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -37,7 +36,6 @@ /obj/item/clothing/under/rank/civilian/clown/Initialize(mapload) . = ..() AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50, falloff_exponent = 20) //die off quick please - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CLOWN, CELL_VIRUS_TABLE_GENERIC, rand(2,3), 0) /obj/item/clothing/under/rank/civilian/clown/blue name = "blue clown suit" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index a58e08640c1e..4ca608db0afd 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -7,7 +7,7 @@ random_sensor = FALSE icon = 'icons/obj/clothing/under/captain.dmi' worn_icon = 'icons/mob/clothing/under/captain.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 15) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/captain/skirt diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 07739ca99414..1491a4866b63 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -3,7 +3,7 @@ /obj/item/clothing/under/rank/engineering icon = 'icons/obj/clothing/under/engineering.dmi' worn_icon = 'icons/mob/clothing/under/engineering.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 20) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 20) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/chief_engineer @@ -11,7 +11,7 @@ name = "chief engineer's jumpsuit" icon_state = "chiefengineer" inhand_icon_state = "gy_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 40) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 40) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/engineering/chief_engineer/skirt @@ -46,7 +46,6 @@ desc = "It's an orange high visibility jumpsuit worn by engineers. Made from fire resistant materials." icon_state = "engine" inhand_icon_state = "engi_suit" - species_exception = list(/datum/species/golem/uranium) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/engineering/engineer/hazard diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 978dd0bd9e90..0ca7e44b3f43 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -2,7 +2,7 @@ icon = 'icons/obj/clothing/under/medical.dmi' worn_icon = 'icons/mob/clothing/under/medical.dmi' permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) /obj/item/clothing/under/rank/medical/doctor desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel." @@ -94,7 +94,7 @@ name = "chemist's jumpsuit" icon_state = "chemistry" inhand_icon_state = "w_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 50, ACID = 65) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 50, ACID = 65) supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/medical/chemist/skirt diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index ab5724f36489..a19096ed2a6c 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -7,7 +7,7 @@ name = "research director's vest suit" icon_state = "director" inhand_icon_state = "lb_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, FIRE = 0, ACID = 35) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, FIRE = 0, ACID = 35) can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -105,7 +105,7 @@ icon_state = "genetics" inhand_icon_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, FIRE = 0, ACID = 0) /obj/item/clothing/under/rank/rnd/geneticist/skirt name = "geneticist's jumpskirt" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 83e71c1a4375..ee1b39ad8df3 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -12,25 +12,33 @@ /obj/item/clothing/under/rank/security icon = 'icons/obj/clothing/under/security.dmi' worn_icon = 'icons/mob/clothing/under/security.dmi' - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 30, WOUND = 10) - strip_delay = 50 sensor_mode = SENSOR_COORDS random_sensor = FALSE +//these two are for Mars Executive Outcomes /obj/item/clothing/under/rank/security/officer + name = "mars security uniform" + desc = "A freshly ironed security uniform with Mars-Red slacks. Wearing this almost makes you look professional." + icon_state = "security" + inhand_icon_state = "suitsec" + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + +/obj/item/clothing/under/rank/security/officer/garrison + name = "mars garrison uniform" + desc = "An old military outfit, based on the uniforms of the now defunct Martian republic. A bold fashion statement, and a political one!" + icon_state = "security_garrison" + inhand_icon_state = "r_suit" + can_adjust = FALSE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + +//these are old, could be used for non-station roles +/obj/item/clothing/under/rank/security/oldred name = "security jumpsuit" - desc = "A tactical security jumpsuit for officers complete with Mars belt buckle." + desc = "A tactical-looking red jumpsuit for corporate security." icon_state = "rsecurity" inhand_icon_state = "r_suit" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/clothing/under/rank/security/officer/grey - name = "grey security jumpsuit" - desc = "A tactical relic of years past before Mars Executive Outcomes decided it was cheaper to dye the suits red instead of washing out the blood." - icon_state = "security" - inhand_icon_state = "gy_suit" - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION - /obj/item/clothing/under/rank/security/officer/skirt name = "security jumpskirt" desc = "A \"tactical\" security jumpsuit with the legs replaced by a skirt." @@ -63,7 +71,7 @@ icon_state = "constable" inhand_icon_state = "constable" can_adjust = FALSE - custom_price = PAYCHECK_HARD + custom_price = PAYCHECK_ASSISTANT * 5.6 /obj/item/clothing/under/rank/security/warden @@ -75,7 +83,7 @@ /obj/item/clothing/under/rank/security/warden/grey name = "grey security suit" - desc = "A formal relic of years past before Mars Executive Outcomes decided it was cheaper to dye the suits red instead of washing out the blood." + desc = "A uniform older than the colonization of Mars." icon_state = "warden" inhand_icon_state = "gy_suit" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -109,7 +117,7 @@ alt_covers_chest = TRUE /obj/item/clothing/under/rank/security/detective/skirt - name = "detective's suitskirt" + name = "private investigator's suitskirt" desc = "Someone who wears this means business." icon_state = "detective_skirt" inhand_icon_state = "det" @@ -138,20 +146,27 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON /* - * Head of Security + * security marshal */ +/obj/item/clothing/under/rank/security/marshal + name = "security marshal's uniform" + desc = "A crisp mars-red marshal's uniform. Comes with gold trimmed sholder pads and a massive belt buckle to show everyone who's in charge." + icon_state = "marshal" + inhand_icon_state = "r_suit" + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION //need to do these + +//old hos stuff /obj/item/clothing/under/rank/security/head_of_security - name = "head of security's jumpsuit" - desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." + name = "security marshal's jumpsuit" + desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Security Marshal." icon_state = "rhos" inhand_icon_state = "r_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 50, WOUND = 10) strip_delay = 60 supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /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." + name = "security marshal's jumpskirt" + desc = "A security jumpskirt decorated for those few with the dedication to achieve the position of Security Marshal." icon_state = "rhos_skirt" inhand_icon_state = "r_suit" body_parts_covered = CHEST|GROIN|ARMS @@ -160,22 +175,22 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/security/head_of_security/grey - name = "head of security's grey jumpsuit" + name = "security marshal's grey jumpsuit" desc = "There are old men, and there are bold men, but there are very few old, bold men." icon_state = "hos" inhand_icon_state = "gy_suit" supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/security/head_of_security/alt - name = "head of security's turtleneck" - desc = "A stylish alternative to the normal head of security jumpsuit, complete with tactical pants." + name = "security marshal's turtleneck" + desc = "A stylish alternative to the normal Security Marshal jumpsuit, complete with tactical pants." icon_state = "hosalt" inhand_icon_state = "bl_suit" alt_covers_chest = TRUE /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." + name = "security marshal's turtleneck skirt" + desc = "A stylish alternative to the normal Security Marshal jumpsuit, complete with a tactical skirt." icon_state = "hosalt_skirt" inhand_icon_state = "bl_suit" body_parts_covered = CHEST|GROIN|ARMS @@ -185,24 +200,24 @@ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/security/head_of_security/parade - name = "head of security's parade uniform" - desc = "A male head of security's luxury-wear, for special occasions." + name = "security marshal's parade uniform" + desc = "A male Security Marshal's luxury-wear, for special occasions." icon_state = "hos_parade_male" inhand_icon_state = "r_suit" can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/rank/security/head_of_security/parade/female - name = "head of security's parade uniform" - desc = "A female head of security's luxury-wear, for special occasions." + name = "security marshal's parade uniform" + desc = "A female Security Marshal's luxury-wear, for special occasions." icon_state = "hos_parade_fem" inhand_icon_state = "r_suit" female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY can_adjust = FALSE /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" + desc = "The insignia on this uniform tells you that this uniform belongs to the Security Marshal." + name = "security marshal's formal uniform" icon_state = "hosblueclothes" inhand_icon_state = "hosblueclothes" alt_covers_chest = TRUE diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 7542c87a7270..b5293bd7e608 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -49,7 +49,7 @@ desc = "A cybernetically enhanced jumpsuit used for administrative duties." 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, FIRE = 100, ACID = 100) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 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 @@ -71,7 +71,7 @@ icon_state = "overalls" inhand_icon_state = "lb_suit" can_adjust = FALSE - custom_price = PAYCHECK_EASY + custom_price = PAYCHECK_ASSISTANT * 2.7 /obj/item/clothing/under/misc/assistantformal name = "assistant's formal uniform" @@ -86,7 +86,7 @@ icon_state = "durathread" inhand_icon_state = "durathread" can_adjust = FALSE - armor = list(MELEE = 10, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 5, BIO = 0, FIRE = 40, ACID = 10) /obj/item/clothing/under/misc/bouncer name = "bouncer uniform" @@ -94,7 +94,7 @@ icon_state = "bouncer" inhand_icon_state = "bouncer" can_adjust = FALSE - armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 30) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 30, ACID = 30) /obj/item/clothing/under/misc/coordinator name = "coordinator jumpsuit" diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 6a9aceb0236c..c8c5d067b9fa 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -6,7 +6,6 @@ custom_price = PAYCHECK_EASY icon = 'icons/obj/clothing/under/shorts_pants.dmi' worn_icon = 'icons/mob/clothing/under/shorts_pants.dmi' - species_exception = list(/datum/species/golem) /obj/item/clothing/under/pants/classicjeans name = "classic jeans" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 617860836164..e9899829f0b8 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -8,7 +8,6 @@ can_adjust = FALSE icon = 'icons/obj/clothing/under/shorts_pants.dmi' worn_icon = 'icons/mob/clothing/under/shorts_pants.dmi' - species_exception = list(/datum/species/golem) /obj/item/clothing/under/shorts/red name = "red athletic shorts" diff --git a/code/modules/clothing/under/skirt_dress.dm b/code/modules/clothing/under/skirt_dress.dm index 387612d7784a..ac1a4b37a4e5 100644 --- a/code/modules/clothing/under/skirt_dress.dm +++ b/code/modules/clothing/under/skirt_dress.dm @@ -38,7 +38,7 @@ icon_state = "wedding_dress" inhand_icon_state = "wedding_dress" body_parts_covered = CHEST|GROIN|LEGS - flags_cover = HIDESHOES + flags_inv = HIDESHOES supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION /obj/item/clothing/under/dress/redeveninggown diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index b2f22c772fdd..40b0921338a9 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" inhand_icon_state = "bl_suit" has_sensor = NO_SENSORS - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) alt_covers_chest = TRUE icon = 'icons/obj/clothing/under/syndicate.dmi' worn_icon = 'icons/mob/clothing/under/syndicate.dmi' @@ -16,7 +16,7 @@ icon_state = "syndicate_skirt" inhand_icon_state = "bl_suit" has_sensor = NO_SENSORS - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) alt_covers_chest = TRUE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT @@ -27,7 +27,7 @@ desc = "It still counts as stealth if there are no witnesses." icon_state = "bloodred_pajamas" inhand_icon_state = "bl_suit" - armor = list(MELEE = 10, BULLET = 10, LASER = 10,ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) resistance_flags = FIRE_PROOF | ACID_PROOF can_adjust = FALSE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -37,14 +37,14 @@ desc = "Do operatives dream of nuclear sheep?" icon_state = "bloodred_pajamas" inhand_icon_state = "bl_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) /obj/item/clothing/under/syndicate/tacticool name = "tacticool turtleneck" desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" inhand_icon_state = "bl_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) supports_variations_flags = NONE /obj/item/clothing/under/syndicate/tacticool/skirt @@ -52,7 +52,7 @@ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool_skirt" inhand_icon_state = "bl_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 40) female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY dying_key = DYE_REGISTRY_JUMPSKIRT supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -78,7 +78,7 @@ desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." icon_state = "trackpants" can_adjust = FALSE - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = NONE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION @@ -93,6 +93,6 @@ desc = "Military grade tracksuits for frontline squatting." icon_state = "rus_under" can_adjust = FALSE - armor = list(MELEE = 5, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor = list(BLUNT = 5, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) resistance_flags = NONE supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 3bb731867cb8..7b35a33983a4 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -19,7 +19,7 @@ desc = "The uniform worn by engineering/security officers." icon_state = "trek_engsec" inhand_icon_state = "r_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) //more sec than eng, but w/e. + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) //more sec than eng, but w/e. strip_delay = 50 /obj/item/clothing/under/trek/medsci diff --git a/code/modules/codex/categories/_codex_category.dm b/code/modules/codex/categories/_codex_category.dm index a6314739cd9f..988f66a9860c 100644 --- a/code/modules/codex/categories/_codex_category.dm +++ b/code/modules/codex/categories/_codex_category.dm @@ -5,70 +5,73 @@ var/defer_population = FALSE var/guide_name var/guide_html - var/link_columns = 2 + var/link_columns = 0 /datum/codex_category/proc/get_category_link(datum/codex_entry/entry) - return "This page is categorized under [name]." + return "This page is categorized under [name]." //Children should call ..() at the end after filling the items list /datum/codex_category/proc/Populate() SHOULD_CALL_PARENT(TRUE) - if(length(items)) - var/lore_text = desc + "
" - if(guide_name && guide_html) - lore_text += "This category has an associated guide.
" + if(!length(items)) + return - items = sortTim(items, GLOBAL_PROC_REF(cmp_text_asc), TRUE) - var/list/links = list() - for(var/item as anything in items) - var/datum/codex_entry/item_entry = SScodex.get_entry_by_string(item) - if(!item_entry) - stack_trace("Invalid item supplied to codex category Populate(): [item]") - continue - var/starter = uppertext(copytext(strip_improper(item_entry.name), 1, 2)) - LAZYADD(links[starter], "[item_entry.name]") - LAZYDISTINCTADD(item_entry.categories, src) + var/lore_text = "
[desc]
" + "
" + if(guide_name && guide_html) + lore_text += "This category has an associated guide.
" - var/list/link_cells = list() - for(var/letter in GLOB.alphabet_upper) - if(length(links[letter])) - link_cells += "
[letter]
\n
\n
\n[jointext(links[letter], "\n
\n")]\n" + items = sortTim(items, GLOBAL_PROC_REF(cmp_codex_name)) - var/list/link_table = list("") - var/link_counter = 0 - for(var/i = 1 to length(link_cells)) - if(link_counter == 0) - link_table += "" - link_table += link_cells[i] - if(link_counter == link_columns) - link_table += "" - link_counter++ - if(link_counter > link_columns) - link_counter = 0 + var/list/links = list() + for(var/datum/codex_entry/item_entry as anything in items) + if(!istype(item_entry)) + stack_trace("Invalid item supplied to codex category Populate(): [item_entry]") + continue - if(link_counter != link_columns) + var/starter = uppertext(copytext(strip_improper(item_entry.name), 1, 2)) + LAZYADD(links[starter], "[item_entry.name]") + LAZYDISTINCTADD(item_entry.categories, src) + + var/list/link_cells = list() + for(var/letter in GLOB.alphabet_upper) + if(length(links[letter])) + link_cells += "\n" + + var/list/link_table = list("
[letter]
\n
\n
\n[jointext(links[letter], "\n
\n")]
") + var/link_counter = 0 + for(var/i = 1 to length(link_cells)) + if(link_counter == 0) + link_table += "" + link_table += link_cells[i] + if(link_counter == link_columns) link_table += "" - link_table += "
" + link_counter++ + if(link_counter > link_columns) + link_counter = 0 - lore_text += jointext(link_table, "\n") - var/datum/codex_entry/entry = new( - _display_name = "[name] (category)", - _lore_text = lore_text - ) - // Categorize the categories. - var/datum/codex_category/categories/cats_cat = SScodex.codex_categories[/datum/codex_category/categories] - LAZYDISTINCTADD(entry.categories, cats_cat) - LAZYDISTINCTADD(cats_cat.items, entry.name) + if(link_counter != link_columns) + link_table += "" + link_table += "" + + lore_text += jointext(link_table, "\n") + var/datum/codex_entry/entry = new( + _display_name = "[name] (category)", + _lore_text = lore_text + ) + // Categorize the categories. + var/datum/codex_category/categories/cats_cat = SScodex.codex_categories[/datum/codex_category/categories] + LAZYDISTINCTADD(entry.categories, cats_cat) + LAZYDISTINCTADD(cats_cat.items, entry) if(guide_html) - var/datum/codex_entry/entry = new( + var/datum/codex_entry/guide_entry = new( _display_name = "Guide to [capitalize(guide_name || name)]", _mechanics_text = guide_html, _disambiguator = "guide" ) - LAZYDISTINCTADD(entry.categories, src) + LAZYDISTINCTADD(guide_entry.categories, src) // It's a guide so we track it. var/datum/codex_category/guides/guides_cat = SScodex.codex_categories[/datum/codex_category/guides] - LAZYDISTINCTADD(entry.categories, guides_cat) - LAZYDISTINCTADD(guides_cat.items, entry.name) + LAZYDISTINCTADD(guide_entry.categories, guides_cat) + LAZYDISTINCTADD(guides_cat.items, guide_entry) diff --git a/code/modules/codex/categories/gases.dm b/code/modules/codex/categories/gases.dm index 54c78ac41d4b..9cdaa7ed9fa7 100644 --- a/code/modules/codex/categories/gases.dm +++ b/code/modules/codex/categories/gases.dm @@ -28,6 +28,6 @@ _mechanics_text = jointext(material_info, null) ) - items |= entry.name + items += entry return ..() diff --git a/code/modules/codex/categories/machines.dm b/code/modules/codex/categories/machines.dm new file mode 100644 index 000000000000..aa3b7b5193da --- /dev/null +++ b/code/modules/codex/categories/machines.dm @@ -0,0 +1,10 @@ +GLOBAL_LIST_EMPTY(machine_codex_entries) + +/datum/codex_category/machines + name = "Machinery" + desc = "Common workplace devices." + +/datum/codex_category/machines/Populate() + items = GLOB.machine_codex_entries + return ..() + diff --git a/code/modules/codex/categories/reagents.dm b/code/modules/codex/categories/reagents.dm new file mode 100644 index 000000000000..7a6ef6dd4258 --- /dev/null +++ b/code/modules/codex/categories/reagents.dm @@ -0,0 +1,92 @@ +/datum/codex_category/reagents + name = "Reagents" + desc = "Chemicals and reagents, both natural and artificial." + +/datum/codex_category/reagents/Populate() + for(var/datum/reagent/R as anything in subtypesof(/datum/reagent)) + if(isabstract(R) || !(initial(R.show_in_codex) || R == /datum/reagent/toxin)) //OOP moment + continue + + var/datum/codex_entry/entry = new( + _display_name = "[initial(R.name)] (chemical)", + _lore_text = "    [initial(R.description)] It apparently tastes of [initial(R.taste_description)].", + _mechanics_text = initial(R.codex_mechanics) + ) + + var/list/production_strings = list() + + for(var/datum/chemical_reaction/reaction as anything in SSreagents.chemical_reactions_list_product_index[R]) + + if(!length(reaction.required_reagents)) + continue + + var/list/reaction_info = list() + var/list/reactant_values = list() + + for(var/datum/reagent/reactant as anything in reaction.required_reagents) + reactant_values += "[reaction.required_reagents[reactant]]u [lowertext(initial(reactant.name))]" + + + var/list/catalysts = list() + + for(var/datum/reagent/catalyst as anything in reaction.required_catalysts) + catalysts += "[reaction.required_catalysts[catalyst]]u [lowertext(initial(catalyst.name))]" + + + if(length(catalysts)) + reaction_info += "- [jointext(reactant_values, " + ")] (catalysts: [jointext(catalysts, ", ")]): [reaction.results[R]]u [lowertext(initial(R.name))]" + else + reaction_info += "- [jointext(reactant_values, " + ")]: [reaction.results[R]]u [lowertext(initial(R.name))]" + + reaction_info += "- Optimal temperature: [KELVIN_TO_CELSIUS(reaction.optimal_temp)]C ([reaction.optimal_temp]K)" + + if (reaction.overheat_temp < NO_OVERHEAT) + reaction_info += "- Overheat temperature: [KELVIN_TO_CELSIUS(reaction.overheat_temp)]C ([reaction.overheat_temp]K)" + if (reaction.required_temp > 0) + reaction_info += "- Required temperature: [KELVIN_TO_CELSIUS(reaction.required_temp)]C ([reaction.required_temp]K)" + + if(reaction.thermic_constant != 0) + // lifted outta modules/reagents/chemistry/holder.dm + var/thermic_string = "" + var/thermic = reaction.thermic_constant + if(reaction.reaction_flags & REACTION_HEAT_ARBITARY) + thermic *= 100 //Because arbitary is a lower scale + switch(thermic) + if(-INFINITY to -1500) + thermic_string = "overwhelmingly endothermic" + if(-1500 to -1000) + thermic_string = "extremely endothermic" + if(-1000 to -500) + thermic_string = "strongly endothermic" + if(-500 to -200) + thermic_string = "moderately endothermic" + if(-200 to -50) + thermic_string = "endothermic" + if(-50 to 0) + thermic_string = "weakly endothermic" + if(0 to 50) + thermic_string = "weakly exothermic" + if(50 to 200) + thermic_string = "exothermic" + if(200 to 500) + thermic_string = "moderately exothermic" + if(500 to 1000) + thermic_string = "strongly exothermic" + if(1000 to 1500) + thermic_string = "extremely exothermic" + if(1500 to INFINITY) + thermic_string = "overwhelmingly exothermic" + reaction_info += "- The reaction is [thermic_string]" + + production_strings += jointext(reaction_info, "
") + + if(length(production_strings)) + if(!entry.mechanics_text) + entry.mechanics_text = "It can be produced as follows:
" + else + entry.mechanics_text += "

It can be produced as follows:
" + entry.mechanics_text += jointext(production_strings, "
") + + items += entry + + return ..() diff --git a/code/modules/codex/categories/surgery.dm b/code/modules/codex/categories/surgery.dm new file mode 100644 index 000000000000..68a2b6b7d5a5 --- /dev/null +++ b/code/modules/codex/categories/surgery.dm @@ -0,0 +1,95 @@ +/datum/codex_category/surgery + name = "Surgeries" + desc = "Information on surgerical procedures." + guide_name = "Surgery" + guide_html = {" +

Important Notes

+
    +
  • Surgery can be attempted by using a variety of items (such as scalpels, or improvised tools) on a patient who is prone.
  • +
  • Performing surgery on a conscious patient will cause quite a lot of pain and screaming.
  • +
  • You can perform some surgeries on yourself, but this is probably not a good idea.
  • +
  • Attempting surgery on anything other than help intent can have unexpected effects, or can be used to ignore surgery for items with other effects, like trauma kits.
  • +
  • When violently severed, limbs will leave behind stumps, which may behave differently to regular limbs when operated on.
  • +
  • Dosing the patient with regenerative medication, or trying to operate on treated wounds, can fail unexpectedly due to the wound closing. Making a new incision or using retractors to widen the wound may help.
  • +
+ +

Making an incision

+
    +
  1. Target the desired bodypart on the target dolly.
  2. +
  3. Use a scalpel to make an incision.
  4. +
  5. Use a retractor to widen the incision, if necessary.
  6. +
  7. Use a hemostat to clamp any bleeders, if necessary.
  8. +
  9. On bodyparts with bone encasement, like the skull and ribs, use a circular saw to open the encasing bone.
  10. +
+ +

Closing an incision

+
    +
  1. Close and repair the bone, as below.
  2. +
  3. Use a cautery to seal the incision.
  4. +
+ +

Setting and repairing a broken bone

+ While splints can make a broken limb usable, surgery will be needed to properly repair them. +
    +
  1. Open an incision as above.
  2. +
  3. Set the bone in place with a bone setter.
  4. +
  5. Apply bone gel to finalize the repair.
  6. +
  7. Close the incision as above.
  8. +
+ +

Internal organ surgery

+ All internal organ surgery requires access to the internal organs via an incision, as above. +
    +
  • A scalpel (or a multitool for a prosthetic) can be used to detach an organ, followed by a hemostat to remove the organ entirely for transplant.
  • +
  • A removed organ can be replaced by using it on an empty section of the body, and reattached with sutures (or a multitool for a prosthetic).
  • +
  • A damaged organ can be repaired with a trauma pack (or nanopaste for a prosthetic). +
+ +

Amputation

+ Limbs or limb stumps can be amputated with a circular saw, but any other form of surgery in progress will take precedence. Cauterize any incisions or wounds before trying to amputate the limb. A proper surgical amputation will not leave a stump. + +

Replacement limb installation

+ Fresh limbs can be sourced from donors, organ printers, or prosthetics fabricators. +
    +
  1. Remove the original limb by amputation if it is present.
  2. +
  3. Target the appropriate limb slot and install the new limb on the patient.
  4. +
  5. Use a vascular recoupler to connect the nerves to the new limb.
  6. +
+ "} + +/datum/codex_category/surgery/Populate() + for(var/datum/surgery_step/step as anything in GLOB.surgeries_list) + var/list/info = list("
    ") + + var/obj/path_or_tool = step.allowed_tools?[1] + if(path_or_tool) + info += "
  • Best performed with \a [istext(path_or_tool) ? "[path_or_tool]" : "[initial(path_or_tool.name)]"].
  • " + + if(!(step.surgery_flags & ~(SURGERY_CANNOT_FAIL | SURGERY_BLOODY_BODY | SURGERY_BLOODY_GLOVES))) + info += "
  • This operation has no requirements." + else + if(step.surgery_flags & SURGERY_NO_FLESH) + info += "
  • This operation cannot be performed on organic limbs." + else if(step.surgery_flags & SURGERY_NO_ROBOTIC) + info += "
  • This operation cannot be performed on robotic limbs." + + if(step.surgery_flags & SURGERY_NO_STUMP) + info += "
  • This operation cannot be performed on stumps." + if(step.surgery_flags & SURGERY_NEEDS_INCISION) + info += "
  • This operation requires [step.strict_access_requirement ? "exactly" : "atleast"] an [CODEX_LINK("incision", "make incision")] or small cut.
  • " + else if(step.surgery_flags & (SURGERY_NEEDS_RETRACTED|SURGERY_NEEDS_DEENCASEMENT)) + info += "
  • This operation requires [step.strict_access_requirement ? "exactly" : "atleast"] a [CODEX_LINK("widened incision", "widen incision")] or large cut.
  • " + else if(step.surgery_flags & SURGERY_NEEDS_DEENCASEMENT) + info += "
  • This operation requires the encasing bones to be [CODEX_LINK("broken", "saw through bone")].
  • " + + info += "
" + + var/datum/codex_entry/entry = new( + _display_name = "[step.name]", + _lore_text = step.desc, + _mechanics_text = jointext(info, null) + ) + + items += entry + + return ..() diff --git a/code/modules/codex/categories/uncategorized.dm b/code/modules/codex/categories/uncategorized.dm index 8c4aff560a67..f45058700903 100644 --- a/code/modules/codex/categories/uncategorized.dm +++ b/code/modules/codex/categories/uncategorized.dm @@ -7,5 +7,5 @@ for(var/datum/codex_entry/entry as anything in SScodex.all_entries) if(!length(entry.categories)) LAZYADD(entry.categories, src) - items |= entry.name + items += entry return ..() diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index 6560678425a1..3dc849753200 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -5,20 +5,29 @@ if(SScodex.entries_by_path[type]) return SScodex.entries_by_path[type] - var/lore = get_lore_info() - var/mechanics = get_mechanics_info() - var/antag = get_antag_info() - if(!lore && !mechanics && !antag) + var/lore = jointext(get_lore_info(), "
") + var/mechanics = jointext(get_mechanics_info(), "
") + var/antag = jointext(get_antag_info(), "
") + var/controls = jointext(get_controls_info(), "
") + if(!lore && !mechanics && !antag && !controls) return FALSE var/datum/codex_entry/entry = new(name, list(type), _lore_text = lore, _mechanics_text = mechanics, _antag_text = antag) return entry + +/// Returns a list of mechanics information for this object. /atom/proc/get_mechanics_info() - return + . = list() +/// Returns a list of antagonist-related information about this object. /atom/proc/get_antag_info() - return + . = list() +/// Returns a list of lore information about this object. /atom/proc/get_lore_info() - return + . = list() + +/// Returns a list of controls information about this object. +/atom/proc/get_controls_info() + . = list() diff --git a/code/modules/codex/codex_client.dm b/code/modules/codex/codex_client.dm index dab3d6963601..687a5cb7ecda 100644 --- a/code/modules/codex/codex_client.dm +++ b/code/modules/codex/codex_client.dm @@ -1,6 +1,5 @@ /client var/codex_cooldown = FALSE - var/const/max_codex_entries_shown = 10 /client/verb/search_codex(searching as text) @@ -8,7 +7,7 @@ set category = "IC" set src = usr - if(!mob || !SScodex) + if(!SScodex.initialized) return if(codex_cooldown >= world.time) @@ -22,36 +21,20 @@ codex_cooldown = world.time + 1 SECONDS - var/list/all_entries = SScodex.retrieve_entries_for_string(searching) + var/list/found_entries = SScodex.retrieve_entries_for_string(searching) if(mob && mob.mind && !length(mob.mind.antag_datums)) - all_entries = all_entries.Copy() // So we aren't messing with the codex search cache. - for(var/datum/codex_entry/entry in all_entries) + found_entries = found_entries.Copy() // So we aren't messing with the codex search cache. + for(var/datum/codex_entry/entry in found_entries) if(entry.antag_text && !entry.mechanics_text && !entry.lore_text) - all_entries -= entry - - //Put entries with match in the name first - for(var/datum/codex_entry/entry in all_entries) - if(findtext(entry.name, searching)) - all_entries -= entry - all_entries.Insert(1, entry) - - if(LAZYLEN(all_entries) == 1) - SScodex.present_codex_entry(mob, all_entries[1]) - else - if(LAZYLEN(all_entries) > 1) - var/list/codex_data = list("

[all_entries.len] matches for '[searching]':

") - if(LAZYLEN(all_entries) > max_codex_entries_shown) - codex_data += "Showing first [max_codex_entries_shown] entries. [all_entries.len - 5] result\s omitted.
" - codex_data += "" - for(var/i = 1 to min(all_entries.len, max_codex_entries_shown)) - var/datum/codex_entry/entry = all_entries[i] - codex_data += "" - codex_data += "
[entry.name]View
" - var/datum/browser/popup = new(mob, "codex-search", "Codex Search") //"codex-search" - popup.set_content(codex_data.Join()) - popup.open() - else + found_entries -= entry + + switch(LAZYLEN(found_entries)) + if(null) to_chat(src, span_alert("The codex reports no matches for '[searching]'.")) + if(1) + SScodex.present_codex_entry(mob, found_entries[1]) + else + SScodex.present_codex_search(mob, found_entries, searching) /client/verb/list_codex_entries() @@ -69,7 +52,7 @@ codex_cooldown = world.time + 1 SECONDS var/datum/browser/popup = new(mob, "codex", "Codex Index") //"codex-index" - var/datum/codex_entry/nexus = SScodex.get_entry_by_string("nexus") + var/datum/codex_entry/nexus = SScodex.get_codex_entry(/datum/codex_entry/nexus) var/list/codex_data = list(nexus.get_codex_header(mob).Join(), "

Codex Entries

") codex_data += "" diff --git a/code/modules/codex/entries/_codex_entry.dm b/code/modules/codex/entries/_codex_entry.dm index af08c649f3c9..60015b61a677 100644 --- a/code/modules/codex/entries/_codex_entry.dm +++ b/code/modules/codex/entries/_codex_entry.dm @@ -19,8 +19,8 @@ var/disambiguator var/list/categories - ///Allows you to mark a type as "abstract" and to not generate it. - var/abstract_type + //Codex entries support abstract_type. + //Since the basetype is used for dynamically generated entries, it is not abstract. /datum/codex_entry/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text, _disambiguator) @@ -62,6 +62,9 @@ stack_trace("Trying to save codex entry for [name] by path [associated_path] but one already exists!") SScodex.entries_by_path[associated_path] = src + /// We always point to our own entry. Duh. + SScodex.entries_by_path[type] = src + if(!name) if(length(associated_strings)) name = associated_strings[1] @@ -74,12 +77,18 @@ if(!clean_string) associated_strings -= associated_string continue + if(clean_string != associated_string) associated_strings -= associated_string associated_strings |= clean_string - if(SScodex.entries_by_string[clean_string]) - stack_trace("Trying to save codex entry for [name] by string [clean_string] but one already exists!") - SScodex.entries_by_string[clean_string] = src + + var/existing_entry = SScodex.entries_by_string[clean_string] + if(islist(existing_entry)) + existing_entry += src + else if(existing_entry) + SScodex.entries_by_string[clean_string] = list(existing_entry, src) + else + SScodex.entries_by_string[clean_string] = src ..() @@ -92,7 +101,7 @@ . = list() if(presenting_to) - var/datum/codex_entry/linked_entry = SScodex.get_entry_by_string("nexus") + var/datum/codex_entry/linked_entry = SScodex.get_codex_entry(/datum/codex_entry/nexus) . += "Home" if(presenting_to.client) . += "Search Codex" @@ -105,8 +114,6 @@ for(var/datum/codex_category/category in categories) . += category.get_category_link(src) -// TODO: clean up codex bodies until trimming linebreaks is unnecessary. -#define TRIM_LINEBREAKS(TEXT) replacetext(replacetext(TEXT, SScodex.trailingLinebreakRegexStart, null), SScodex.trailingLinebreakRegexEnd, null) /datum/codex_entry/proc/get_codex_body(mob/presenting_to, include_header = TRUE, include_footer = TRUE) RETURN_TYPE(/list) @@ -114,25 +121,24 @@ if(include_header && presenting_to) var/header = get_codex_header(presenting_to) if(length(header)) - . += "" + . += "
" . += jointext(header, null) - . += "" + . += "
" - . += "" + . += "
" if(lore_text) - . += "

[TRIM_LINEBREAKS(lore_text)]

" + . += "
[lore_text]
" if(mechanics_text) - . += "

OOC Information

\n

[TRIM_LINEBREAKS(mechanics_text)]

" + . += "

OOC Information

[mechanics_text]
" if(antag_text && (!presenting_to || (presenting_to.mind && !length(presenting_to.mind.antag_datums)))) - . += "

Antagonist Information

\n

[TRIM_LINEBREAKS(antag_text)]

" + . += "

Antagonist Information

[antag_text]
" if(controls_text) - . += "

Controls

\n

[TRIM_LINEBREAKS(controls_text)]

" - . += "" + . += "

Controls

[controls_text]
" + . += "
" if(include_footer) var/footer = get_codex_footer(presenting_to) if(length(footer)) - . += "" + . += "
" . += footer - . += "" -#undef TRIM_LINEBREAKS + . += "
" diff --git a/code/modules/codex/entries/atmospherics.dm b/code/modules/codex/entries/atmospherics.dm index bf00a62496a9..506b46edf15b 100644 --- a/code/modules/codex/entries/atmospherics.dm +++ b/code/modules/codex/entries/atmospherics.dm @@ -2,33 +2,37 @@ name = "Pipes" associated_paths = list(/obj/machinery/atmospherics/pipe/smart/simple, /obj/machinery/atmospherics/pipe/smart/manifold, /obj/machinery/atmospherics/pipe/smart/manifold4w) use_typesof = TRUE - mechanics_text = "All pipes can be connected or disconnected with a wrench. More pipes can be obtained from a pipe dispenser. \ -
Some pipes, like scrubbers and supply pipes, do not connect to 'normal' pipes. If you want to connect them, use a universal adapter pipe. \ -
Pipes generally do not exchange thermal energy with the environment (ie. they do not heat up or cool down their turf), but heat exchange pipes are an exception. \ -
To join three or more pipe segments, you can use a pipe manifold." + mechanics_text = "    All pipes can be connected or disconnected with a wrench. More pipes can be obtained from a pipe dispenser. \ + Some pipes, like scrubbers and supply pipes, do not connect to 'normal' pipes. If you want to connect them, use a universal adapter pipe. \ + Pipes generally do not exchange thermal energy with the environment (ie. they do not heat up or cool down their turf), but heat exchange pipes are an exception. \ + To join three or more pipe segments, you can use a pipe manifold." disambiguator = "atmospherics" + controls_text = {" + Right Click - Adjust the layer of the pipe. + "} + /datum/codex_entry/atmos_pipe/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text) /datum/codex_entry/atmos_valve name = "Manual Valve" associated_paths = list(/obj/machinery/atmospherics/components/binary/valve) use_typesof = TRUE - mechanics_text = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." + mechanics_text = "    Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." disambiguator = "atmospherics" /datum/codex_entry/atmos_pump name = "Pressure Pump" use_typesof = TRUE associated_paths = list(/obj/machinery/atmospherics/components/binary/pump) - mechanics_text = "This moves gas from one pipe to another. A higher target pressure demands more energy. The side with the red end is the output." + mechanics_text = "    This moves gas from one pipe to another. A higher target pressure demands more energy. The side with the red end is the output." disambiguator = "atmospherics" /datum/codex_entry/atmos_vent_pump name = "Vent Pump" use_typesof = TRUE associated_paths = list(/obj/machinery/atmospherics/components/unary/vent_pump) - mechanics_text = "This pumps the contents of the attached pipe out into the atmosphere, if needed." + mechanics_text = "    This pumps the contents of the attached pipe out into the atmosphere, if needed." controls_text = "Multitool - Toggle Low-Power mode." disambiguator = "atmospherics" @@ -36,15 +40,20 @@ name = "Thermomachine" use_typesof = TRUE associated_paths = list(/obj/machinery/atmospherics/components/unary/thermomachine) - mechanics_text = "Adjusts the temperature of gas flowing through it. It uses massive amounts of electricity while on. \ - It can be upgraded by replacing the capacitors, manipulators, and matter bins." + mechanics_text = {" +     Adjusts the temperature of gas flowing through it. +
    +
  • It uses massive amounts of electricity while on.
  • +
  • It can be upgraded by replacing the capacitors, manipulators, and matter bins.
  • +
+ "} disambiguator = "atmospherics" /datum/codex_entry/atmos_vent_scrubber name = "Vent Scrubber" use_typesof = TRUE associated_paths = list(/obj/machinery/atmospherics/components/unary/vent_scrubber) - mechanics_text = "This filters the atmosphere of harmful gas. Filtered gas goes to the pipes connected to it, typically a scrubber pipe. \ + mechanics_text = "    This filters the atmosphere of harmful gas. Filtered gas goes to the pipes connected to it, typically a scrubber pipe. \ It can be controlled from an Air Alarm. Has a mode to siphon much faster, using much more power in the process." controls_text = "Multitool - Toggle Low-Power mode." disambiguator = "atmospherics" @@ -53,31 +62,43 @@ name = "Gas Canister" // because otherwise it shows up as 'canister: [caution]' associated_paths = list(/obj/machinery/portable_atmospherics/canister) use_typesof = TRUE - mechanics_text = "The canister can be connected to a connector port with a wrench. Tanks of gas (the kind you can hold in your hand) \ - can be filled by the canister, by using the tank on the canister, increasing the release pressure, then opening the valve until it is full, and then close it. \ - *DO NOT* remove the tank until the valve is closed. A gas analyzer can be used to check the contents of the canister." - antag_text = "Canisters can be damaged, spilling their contents into the air, or you can just leave the release valve open." + mechanics_text = {" +     The canister can be connected to a connector port with a wrench. Tanks of gas (the kind you can hold in your hand) + can be filled by the canister, by using the tank on the canister, increasing the release pressure, then opening the valve until it is full, and then close it. +
+ *DO NOT* remove the tank until the valve is closed. +
+ A gas analyzer can be used to check the contents of the canister. + "} + antag_text = "    Canisters can be damaged, spilling their contents into the air, or you can just leave the release valve open." disambiguator = "atmospherics" /datum/codex_entry/atmos_meter name = "Gas Meter" use_typesof = TRUE associated_paths = list(/obj/machinery/meter) - mechanics_text = "Measures the volume and temperature of the pipe under the meter." + mechanics_text = "    Measures the volume and temperature of the pipe under the meter.
" disambiguator = "atmospherics" /datum/codex_entry/transfer_valve name = "Tank Transfer Valve" associated_paths = list(/obj/item/transfer_valve) - mechanics_text = "This machine is used to merge the contents of two different gas tanks. Plug the tanks into the transfer, then open the valve to mix them together. You can also attach various assembly devices to trigger this process." - antag_text = "With a tank of hot hydrogen and cold oxygen, this benign little atmospheric device becomes an incredibly deadly bomb. You don't want to be anywhere near it when it goes off." + mechanics_text = "    This machine is used to merge the contents of two different gas tanks. Plug the tanks into the transfer, then open the valve to mix them together. You can also attach various assembly devices to trigger this process." + antag_text = "    With a tank of hot hydrogen and cold oxygen, this benign little atmospheric device becomes an incredibly deadly bomb. You don't want to be anywhere near it when it goes off." disambiguator = "component" /datum/codex_entry/gas_analyzer name = "Gas Analyzer" use_typesof = TRUE associated_paths = list(/obj/item/analyzer) //:( - mechanics_text = "A device that analyzes the gas contents of a tile or atmospherics devices. Has 3 modes: Default operates without \ - additional output data; Moles and volume shows the moles per gas in the mixture and the total moles and volume; Gas \ - traits and data describes the traits per gas, how it interacts with the world, and some of its property constants." + mechanics_text = {" +     A device that analyzes the gas contents of a tile or atmospherics devices. Has 3 modes: Default operates without + additional output data; Moles and volume shows the moles per gas in the mixture and the total moles and volume; Gas + traits and data describes the traits per gas, how it interacts with the world, and some of its property constants. + "} + controls_text = {" + Alt Click - Activate barometer. + Right Click - Open gas reference. + "} + disambiguator = "equipment" diff --git a/code/modules/codex/entries/codex.dm b/code/modules/codex/entries/codex.dm index 43aadd8859ec..e62ae7467062 100644 --- a/code/modules/codex/entries/codex.dm +++ b/code/modules/codex/entries/codex.dm @@ -1,24 +1,31 @@ /datum/codex_entry/codex name = "The Codex" - lore_text = "The Codex is the overall body containing the document that you are currently reading. It is a distributed encyclopedia maintained by a dedicated, hard-working staff of journalists, bartenders, hobos, space pirates and xeno-intelligences, all with the goal of providing you, the user, with supposedly up-to-date, nominally useful documentation on the topics you want to know about. \ -

\ - Access to the Codex is afforded instantly by a variety of unobtrusive devices, including PDA attachments, retinal implants, neuro-memetic indoctrination and hover-drone. All our access devices are affordable, stylish and guaranteed not to expose you to encephalo-malware. \ -

\ - The Codex editorial offices are located in Venus orbit and will offer cash payments for stories, anecdotes and evidence of the strange and undocumented miscellany cluttering up our observable universe. Remember our motto: \"Knowledge is power, sell your excess.\"" + lore_text = {" +     The Codex is the overall body containing the document that you are currently reading. + It is a distributed encyclopedia maintained by a dedicated, hard-working staff of journalists, bartenders, hobos, space pirates and xeno-intelligences, + all with the goal of providing you, the user, with supposedly up-to-date, nominally useful documentation on the topics you want to know about. +

+     Access to the Codex is afforded instantly by a variety of unobtrusive devices, including PDA attachments, retinal implants, neuro-memetic indoctrination and hover-drone. All our access devices are affordable, stylish and guaranteed not to expose you to encephalo-malware. \ +

+     The Codex editorial offices are located in Venus orbit and will offer cash payments for stories, anecdotes and evidence of the strange and undocumented miscellany cluttering up our observable universe. Remember our motto: \"Knowledge is power, sell your excess.\" + "} /datum/codex_entry/codex/New() - mechanics_text = "The Codex is both an IC and OOC resource. ICly, it is as described; a space encyclopedia. You can use Search-Codex topic to look something up, or you can click the links provided when examining some objects. \ -

\ - Any of the lore you find in the Codex, designated by green text, can be freely referenced in-character. \ -

\ - OOC information on various mechanics and interactions is marked by blue text. \ -

\ - Information for antagonists will not be shown unless you are an antagonist, and is marked by red text." + mechanics_text = {" +     The Codex is both an IC and OOC resource. + ICly, it is as described; a space encyclopedia. You can use Search-Codex topic to look something up, + or you can click the links provided when examining some objects. +
    +
  • * Any of the lore you find in the Codex, designated by green text, can be freely referenced in-character.
  • +
  • * OOC information on various mechanics and interactions is marked by blue text.
  • +
  • * Information for antagonists will not be shown unless you are an antagonist, and is marked by red text.
  • +
+ "} ..() /datum/codex_entry/nexus name = "Nexus" - mechanics_text = "The place to start with The Codex
" + mechanics_text = "    The place to start with The Codex
" /datum/codex_entry/nexus/get_codex_body(mob/presenting_to, include_header, include_footer) . = list("") diff --git a/code/modules/codex/entries/floors.dm b/code/modules/codex/entries/floors.dm new file mode 100644 index 000000000000..28e93653cc2e --- /dev/null +++ b/code/modules/codex/entries/floors.dm @@ -0,0 +1,40 @@ +/datum/codex_entry/floor + abstract_type = /datum/codex_entry/floor + disambiguator = "floor" + +/datum/codex_entry/floor/iron + name = "Iron Floor" + use_typesof = TRUE + associated_paths = list(/turf/open/floor/iron) + controls_text = {" + Crowbar - Pry up the floor. + "} + +/datum/codex_entry/floor/catwalk + name = "Catwalk" + use_typesof = TRUE + associated_paths = list(/obj/structure/overfloor_catwalk) + + controls_text = {" + Crowbar - Pry up the floor. +
+ Screwdriver - Access or hide the contents underneath. + "} + +/datum/codex_entry/floor/wood + name = "Wooden Floor" + use_typesof = TRUE + associated_paths = list(/turf/open/floor/wood) + + controls_text = {" + Crowbar - Pry up the floor. + "} + +/datum/codex_entry/floor/carpet + name = "Carpet" + use_typesof = TRUE + associated_paths = list(/turf/open/floor/carpet) + + controls_text = {" + Crowbar - Pry up the floor. + "} diff --git a/code/modules/codex/entries/items.dm b/code/modules/codex/entries/items.dm new file mode 100644 index 000000000000..0d0aab78e92a --- /dev/null +++ b/code/modules/codex/entries/items.dm @@ -0,0 +1,15 @@ +/datum/codex_entry/item + abstract_type = /datum/codex_entry/item + use_typesof = TRUE + disambiguator = "item" + +/datum/codex_entry/item/id_card + name = "Identification Card" + associated_paths = list(/obj/item/card/id) + + controls_text = "Alt Click - Set bank account information." + +/datum/codex_entry/item/fire_extinguisher + name = "Fire Extinguisher" + associated_paths = list(/obj/item/extinguisher) + controls_text = "Alt Click - Empty contents." diff --git a/code/modules/codex/entries/machinery.dm b/code/modules/codex/entries/machinery.dm index 542cb2ff943d..4821aee9d20b 100644 --- a/code/modules/codex/entries/machinery.dm +++ b/code/modules/codex/entries/machinery.dm @@ -1,5 +1,58 @@ -/datum/codex_entry/airlock +/datum/codex_entry/machine + abstract_type = /datum/codex_entry/machine + disambiguator = "machine" + +/datum/codex_entry/machine/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text) + . = ..() + GLOB.machine_codex_entries += src + +/datum/codex_entry/machine/airlock + name = "Airlock" + use_typesof = TRUE associated_paths = list(/obj/machinery/door/airlock) - mechanics_text = "An airtight mechanical door. Most airlocks require an ID to open (wearing it on your ID slot is enough), and many have special access requirements to be on your ID. You can open an airlock by clicking on one, or simply walking into it, and clicking on an open airlock will close it. If the lights on the door flash red, you don't have the required access to open the airlock, and if they're consistently red, the door is bolted. Airlocks also require power to operate. In a situation without power, a crowbar can be used to force it open.

Airlocks can also be hacked.
Airlock hacking information:
* Door bolts will lock the door, preventing it from being opened by any means until the bolts are raised again. Pulsing the correct wire will toggle the bolts, but cutting it will only drop them.
* IDscan light indicates the door can scan ID cards. If the wire for this is pulsed it will cause the door to flash red, and cutting it will cause doors with restricted access to be unable to scan ID, essentially locking it.
* The AI control light shows whether or not AI and robots can control the door. Pulsing is only temporary, while cutting is more permanent.
* The test light shows whether the door has power or not. When turned off, the door can be opened with a crowbar.
* If the door sparks, it is electrified. Pulsing the corresponding wire causes this to happen for 30 seconds, and cutting it electrifies the door until mended.
* The check wiring light will turn on if the safety is turned off. This causes the airlock to close even when someone is standing on it, crushing them.
* If the Check Timing Mechanism light is on then the door will close much faster than normal. Dangerous in conjuction with the Check Wiring light.

Deconstruction
To pull apart an airlock, you must open the maintenance panel, disable the power via hacking (or any other means), weld the door shut, and crowbar the electroncs out, cut the wires with a wirecutter, unsecure the whole assembly with a wrench, and then cut it into metal sheets with a welding tool." - antag_text = "Electrifying a door makes for a good trap, hurting and stunning whoever touches it. The same goes for a combination of disabling the safety and timing mechanisms. Bolting a door can also help ensure privacy, or slow down those in search of you. It's also a good idea to disable AI interaction when needed." + mechanics_text = "    An airtight mechanical door. Most airlocks require an ID to open (wearing it on your ID slot is enough), and many have special access requirements to be on your ID. You can open an airlock by clicking on one, or simply walking into it, and clicking on an open airlock will close it. If the lights on the door flash red, you don't have the required access to open the airlock, and if they're consistently red, the door is bolted. Airlocks also require power to operate. In a situation without power, a crowbar can be used to force it open.

Airlocks can also be hacked.
Airlock hacking information:
* Door bolts will lock the door, preventing it from being opened by any means until the bolts are raised again. Pulsing the correct wire will toggle the bolts, but cutting it will only drop them.
* IDscan light indicates the door can scan ID cards. If the wire for this is pulsed it will cause the door to flash red, and cutting it will cause doors with restricted access to be unable to scan ID, essentially locking it.
* The AI control light shows whether or not AI and robots can control the door. Pulsing is only temporary, while cutting is more permanent.
* The test light shows whether the door has power or not. When turned off, the door can be opened with a crowbar.
* If the door sparks, it is electrified. Pulsing the corresponding wire causes this to happen for 30 seconds, and cutting it electrifies the door until mended.
* The check wiring light will turn on if the safety is turned off. This causes the airlock to close even when someone is standing on it, crushing them.
* If the Check Timing Mechanism light is on then the door will close much faster than normal. Dangerous in conjuction with the Check Wiring light.

Deconstruction
To pull apart an airlock, you must open the maintenance panel, disable the power via hacking (or any other means), weld the door shut, and crowbar the electroncs out, cut the wires with a wirecutter, unsecure the whole assembly with a wrench, and then cut it into metal sheets with a welding tool." + antag_text = "    Electrifying a door makes for a good trap, hurting and stunning whoever touches it. The same goes for a combination of disabling the safety and timing mechanisms. Bolting a door can also help ensure privacy, or slow down those in search of you. It's also a good idea to disable AI interaction when needed." disambiguator = "machine" + +/datum/codex_entry/machine/asteroid_magnet + name = "Asteroid Magnet" + use_typesof = TRUE + associated_paths = list(/obj/machinery/asteroid_magnet) + +/datum/codex_entry/machine/asteroid_magnet/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text) + . = ..() + lore_text = {" +     An extremely powerful magnet that is able to draw in magnetically charged bodies floating in the void. + +

Error Codes

+

[GLOB.magnet_error_codes[MAGNET_ERROR_KEY_BUSY]]

+ The stellar body magnet is currently busy, wait for it to finish it's current task. + +

[GLOB.magnet_error_codes[MAGNET_ERROR_KEY_USED_COORD]]

+ The coordinates provided have already been used. + +

[GLOB.magnet_error_codes[MAGNET_ERROR_KEY_COOLDOWN]]

+ The stellar body magnet is cooling down, wait for it to finish before using it again. + +

[GLOB.magnet_error_codes[MAGNET_ERROR_KEY_MOB]]

+ There is a biological lifeform within the bounds of the magnetic field. Remove it and try again. + +

[GLOB.magnet_error_codes[MAGNET_ERROR_KEY_NO_COORD]]

+ There are no selected coordinates. + "} + +/datum/codex_entry/machine/washing_machine + name = "Washing Machine" + use_typesof = TRUE + associated_paths = list(/obj/machinery/washing_machine) + + controls_text = {" + Right Click with empty hand - Begin a wash cycle. + "} + +/datum/codex_entry/machine/chem_dispenser + name = "Chem Dispenser" + use_typesof = TRUE + associated_paths = list(/obj/machinery/chem_dispenser) + + controls_text = "Right Click - Eject contained beaker" diff --git a/code/modules/codex/entries/mechcomp.dm b/code/modules/codex/entries/mechcomp.dm index 2dac3b91ef64..fdf07e2dd60b 100644 --- a/code/modules/codex/entries/mechcomp.dm +++ b/code/modules/codex/entries/mechcomp.dm @@ -4,53 +4,56 @@ /datum/codex_entry/mechcomp/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text) . = ..() - GLOB.mechcomp_codex_entries += name + GLOB.mechcomp_codex_entries += src /datum/codex_entry/mechcomp/array name = "Array (Data Type)" mechanics_text = {" -

Components communicate by using text called Messages. Some components will output a special type called and Array, and require a +     Components communicate by using text called Messages. Some components will output a special type called and Array, and require a special component to make use of. - Arrays are messages with a special format to denote they are an Array.

-

The \"=\" symbol creates a Key:Value pair, where accessing the Array using that Key will output the linked Value.

-

The \"&\" symbol ends the Key:Value pair and starts a new one.

+
+ Arrays are messages with a special format to denote they are an Array. +
+ The \"=\" symbol creates a Key:Value pair, where accessing the Array using that Key will output the linked Value. +
+ The \"&\" symbol ends the Key:Value pair and starts a new one. "} /datum/codex_entry/mechcomp/array_access name = "Array Access Component" mechanics_text = {" - Accesses the Value of an Array based on it's trigger. +     Accesses the Value of an Array based on it's trigger.

Example

A Radio Scanner may output \"name=John Doe&message=Hello\". - You can access the message by setting the trigger to \"message\". The output will be \"Hello\". + *You can access the message by setting the trigger to \"message\". The output will be \"Hello\". "} associated_paths = list(/obj/item/mcobject/messaging/wifi_split) /datum/codex_entry/mechcomp/radio_scanner name = "Radio Scanner Component" - mechanics_text = "Outputs speech heard over it's frequency as an Array." + mechanics_text = "    Outputs speech heard over it's frequency as an Array." associated_paths = list(/obj/item/mcobject/messaging/radioscanner) /datum/codex_entry/mechcomp/and name = "'AND' Component" - mechanics_text = "After receiving a Message in one input, it will wait the duration of it's Time Window. If the other input receives a \ + mechanics_text = "    After receiving a Message in one input, it will wait the duration of it's Time Window. If the other input receives a \ message during this window, it will send it's output." associated_paths = list(/obj/item/mcobject/messaging/and) /datum/codex_entry/mechcomp/or name = "'OR' Component" - mechanics_text = "After receiving a Message in any input, if it matches the Trigger, the component will send it's output." + mechanics_text = "    After receiving a Message in any input, if it matches the Trigger, the component will send it's output." associated_paths = list(/obj/item/mcobject/messaging/or) /datum/codex_entry/mechcomp/arithmetic name = "Arithmetic Component" - mechanics_text = "Using it's \"A\" and \"B\" inputs, it can perform various mathematical operations." + mechanics_text = "    Using it's \"A\" and \"B\" inputs, it can perform various mathematical operations." associated_paths = list(/obj/item/mcobject/messaging/arithmetic) /datum/codex_entry/mechcomp/array_builder name = "Array Component" mechanics_text = {" - Used to create an internal Array. +     Used to create an internal Array.

Functions

Push Value: Output the Value for the inputted Key.
Add Association: Create a new Key:Value pair.
@@ -77,58 +80,58 @@ name = "Dispatch Component" //I just yoinked this from the Goon wiki, https://wiki.ss13.co/MechComp mechanics_text = {" - Similar to the Simple Find Component, +     Similar to the Simple Find Component, but it allows filters to be set on a per-connection basis. When creating an outgoing connection from the Dispatch Component, you have the option to add a comma-delimited list of filters. The incoming signal must contain at least one of these filters or it will not be passed to the connected component. The filter list can be left blank to allow all messages to pass. - -

There is also an exact mode toggle - when exact mode is on, the incoming signal must match a filter exactly (case insensitive). +
+     There is also an exact mode toggle - when exact mode is on, the incoming signal must match a filter exactly (case insensitive). Connections with no filter will still fire for all messages in exact mode. - If Single Output Mode is set, then only the first connection with a matching filter will fire.

+ If Single Output Mode is set, then only the first connection with a matching filter will fire. "} associated_paths = list(/obj/item/mcobject/messaging/dispatch) /datum/codex_entry/mechcomp/simple_find name = "Simple Find Component" - mechanics_text = "Searches for text in a Message, and relays the message, or outputs it's own. Can be set to only look for exact matches." + mechanics_text = "    Searches for text in a Message, and relays the message, or outputs it's own. Can be set to only look for exact matches." associated_paths = list(/obj/item/mcobject/messaging/signal_check) /datum/codex_entry/mechcomp/hand_scanner name = "Hand Scanner Component" - mechanics_text = "Outputs the fingerprint of crew who interact with it." + mechanics_text = "    Outputs the fingerprint of crew who interact with it." associated_paths = list(/obj/item/mcobject/messaging/hand_scanner) /datum/codex_entry/mechcomp/microphone name = "Microphone Component" - mechanics_text = "Outputs anything it hears. Can be set to include the speaker's name." + mechanics_text = "    Outputs anything it hears. Can be set to include the speaker's name." associated_paths = list(/obj/item/mcobject/messaging/microphone) /datum/codex_entry/mechcomp/pressure_sensor name = "Pressure Sensor Component" - mechanics_text = "Outputs a set message when something heavy is moved onto it." + mechanics_text = "    Outputs a set message when something heavy is moved onto it." associated_paths = list(/obj/item/mcobject/messaging/pressure_sensor) /datum/codex_entry/mechcomp/regreplace name = "RegEx Replace Component" - mechanics_text = "Uses Regular Expressions to find-and-replace message contents. \ + mechanics_text = "    Uses Regular Expressions to find-and-replace message contents. \ For advanced users!" associated_paths = list(/obj/item/mcobject/messaging/regreplace) /datum/codex_entry/mechcomp/regfind name = "RegEx Find Component" - mechanics_text = "Uses Regular Expressions to find message contents. \ + mechanics_text = "    Uses Regular Expressions to find message contents. \ For advanced users!" associated_paths = list(/obj/item/mcobject/messaging/regfind) /datum/codex_entry/mechcomp/relay name = "Relay Component" - mechanics_text = "Outputs any inputs. Can be set to replace the inputted message with it's own." + mechanics_text = "    Outputs any inputs. Can be set to replace the inputted message with it's own." associated_paths = list(/obj/item/mcobject/messaging/relay) /datum/codex_entry/mechcomp/message_builder name = "Message Builder Component" mechanics_text = {" - A component used to modify and construct messages. It has an internal buffer which is cleared when sent. +     A component used to modify and construct messages. It has an internal buffer which is cleared when sent.

Functions

Append To Buffer: Adds the input to the end of the buffer.
diff --git a/code/modules/codex/entries/power.dm b/code/modules/codex/entries/power.dm index afac5df42329..364c8be436db 100644 --- a/code/modules/codex/entries/power.dm +++ b/code/modules/codex/entries/power.dm @@ -5,12 +5,12 @@ /datum/codex_entry/power/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text) . = ..() - GLOB.power_codex_entries += name + GLOB.power_codex_entries += src /datum/codex_entry/power/supermatter name = "Supermatter Engine" associated_paths = list(/obj/machinery/power/supermatter) - lore_text = "The Supermatter is a highly unstable fragment of exotic matter, \ + lore_text = "    The Supermatter is a highly unstable fragment of exotic matter, \ which reacts with the atmosphere around it relative to it's own internal charge. As part of it's use as a power generator, \ the supermatter will release energy in the form of heat and radiation, along with shedding 'waste' gasses from it's mass. \ These byproducts must be managed, and the heat captured and converted for use as electrical power." diff --git a/code/modules/codex/entries/tools.dm b/code/modules/codex/entries/tools.dm index 34ee99fa1b9d..93075fa5a08a 100644 --- a/code/modules/codex/entries/tools.dm +++ b/code/modules/codex/entries/tools.dm @@ -5,38 +5,47 @@ /datum/codex_entry/tool/New(_display_name, list/_associated_paths, list/_associated_strings, _lore_text, _mechanics_text, _antag_text, _controls_text) . = ..() - GLOB.tool_codex_entries += name + GLOB.tool_codex_entries += src /datum/codex_entry/tool/crowbar name = "Crowbar" - mechanics_text = "Capable of removing floor tiles or forcing open unpowered doors. Used for construction, or bashing an alien's skull inwards." - lore_text = "The crowbar is clearly well made, but the branding has been scraped off long ago. You’re fairly sure they’re all like this, isn’t that strange?" - antag_text = "Causing a power outage and using a crowbar is a quick way to get into areas you shouldn’t be, just remember forcing open doors is very loud." + mechanics_text = "    Capable of removing floor tiles or forcing open unpowered doors. Used for construction, or bashing your boss' skull inwards." + lore_text = "    The crowbar is clearly well made, but the branding has been scraped off long ago. You’re fairly sure they’re all like this, isn’t that strange?" + antag_text = "    Causing a power outage and using a crowbar is a quick way to get into areas you shouldn’t be, just remember forcing open doors is very loud." /datum/codex_entry/tool/wrench name = "Wrench" - lore_text = "A short adjustable wrench, ever since the space-standardization of bolt sizes, why do they even make them adjustable anymore?" - mechanics_text = "A tool for un-securing and securing machinery to the ground. Alongside deconstructing a lot of furniture, such as chairs, tables and empty crates." + lore_text = "    A short adjustable wrench, ever since the space-standardization of bolt sizes, why do they even make them adjustable anymore?" + mechanics_text = "    A tool for un-securing and securing machinery to the ground. Alongside deconstructing a lot of furniture, such as chairs, tables and empty crates." /datum/codex_entry/tool/multitool name = "Multitool" - lore_text = "Produced by Daedalus Industries, to this day, nobody knows what the little green screen is for." - mechanics_text = "Used to manipulate a door’s function by pulsing the wires. Can also be used to reset locks on safes and secure briefcases. \ - Using the multitool on a wire will tell you how much power is in the wire’s network. \ - Furthermore, using a multitool on a blinking light will return it to normal function. " + lore_text = "    Produced by Daedalus Industries, to this day, nobody knows what the little green screen is for." + mechanics_text = {" +     Used to manipulate a door’s function by pulsing the wires. Can also be used to reset locks on safes and secure briefcases. +
+ Using the multitool on a wire will tell you how much power is in the wire’s network. +
+ Using a multitool on a blinking light will return it to normal function. + "} /datum/codex_entry/tool/wirecutters name = "Wirecutters" - lore_text = "Wirecutters with a cheap plastic grip, clearly Daedalus have been cost-cutting." - mechanics_text = "Wirecutters are used to remove placed wire, bear in mind you will need insulated gloves to cut a wire with power going through it. \ + lore_text = "    Wirecutters with a cheap plastic grip, clearly Daedalus have been cost-cutting." + mechanics_text = "    Wirecutters are used to remove placed wire, bear in mind you will need insulated gloves to cut a wire with power going through it. \ It can also cut the wires of doors, permanently activating the cut wire’s effect." - antag_text = "Cutting the AI Control Wires on a door can stop the AI from interacting with the door full-stop, as opposed to the thirty seconds pulsing the wire provides. Use this to your advantage to stop the AI cornering you." + antag_text = "    Cutting the AI Control Wires on a door can stop the AI from interacting with the door full-stop, as opposed to the thirty seconds pulsing the wire provides. Use this to your advantage to stop the AI cornering you." /datum/codex_entry/tool/weldingtool name = "Welding Tool" associated_paths = list(/obj/item/weldingtool) associated_strings = list("Welder") use_typesof = TRUE - mechanics_text = "The welder is used for repairing damaged windows and walls; alongside welding shut doors, firelocks and vents. \ + mechanics_text = "    The welder is used for repairing damaged windows and walls; alongside welding shut doors, firelocks and vents. \ Not just being a repair-tool, it is a potent melee weapon if it’s lit. Just don’t forget fuel." +/datum/codex_entry/tool/screwdriver + name = "Screwdriver" + associated_paths = list(/obj/item/screwdriver) + use_typesof = TRUE + mechanics_text = "    A screwdriver is a versitile tool, though it will most often be used to remove panels or unsecure objects from others." diff --git a/code/modules/credits_roll/credits.html b/code/modules/credits_roll/credits.html index 28b47201ac11..4f28156f923b 100644 --- a/code/modules/credits_roll/credits.html +++ b/code/modules/credits_roll/credits.html @@ -14,6 +14,7 @@ position: relative; width: 100vw; text-align: center; + overflow: hidden; } #splash { display: table-cell; @@ -65,32 +66,36 @@ -
- - - - - - - - - - -
- IF YOU CAN SEE THIS, TELL A CODER WHAT HAPPENED! - HELPFUL DETAILS INCLUDE: - WAS THE ROUNDEND DELAYED? - WAS THE SERVER MANUALLY REBOOTED? - DID YOU PLAY MORE THAN ONE ROUND IN A ROW WITHOUT CLOSING THE GAME? - DID CREDITS FAIL TO DISPLAY FOR YOU LAST ROUND? - DID THE CREDITS AUDIO FAIL TO PLAY FOR YOU? - IS YOUR CONNECTION SLOW? - DID THIS TEXT DISPLAY FOR ANYONE ELSE? - WHAT ARE YOUR CREDITS PREFERENCES SET TO? -
- IF YOU CAN SEE THIS, THE TEXT HAS STARTED SCROLLING, - SO REALLY TELL A CODER WHAT HAPPENED! -
+
+ + + + + + + + + + + +
+ IF YOU CAN SEE THIS, TELL A CODER WHAT HAPPENED! + HELPFUL DETAILS INCLUDE: + WAS THE ROUNDEND DELAYED? + WAS THE SERVER MANUALLY REBOOTED? + DID YOU PLAY MORE THAN ONE ROUND IN A ROW WITHOUT CLOSING THE GAME? + DID CREDITS FAIL TO DISPLAY FOR YOU LAST ROUND? + DID THE CREDITS AUDIO FAIL TO PLAY FOR YOU? + IS YOUR CONNECTION SLOW? + DID THIS TEXT DISPLAY FOR ANYONE ELSE? + WHAT ARE YOUR CREDITS PREFERENCES SET TO? +
+ IF YOU CAN SEE THIS, THE TEXT HAS STARTED SCROLLING, + SO REALLY TELL A CODER WHAT HAPPENED! +
+
+
+ - diff --git a/code/modules/credits_roll/episode_name.dm b/code/modules/credits_roll/episode_name.dm index 8e312c961cff..ab02ca989fad 100644 --- a/code/modules/credits_roll/episode_name.dm +++ b/code/modules/credits_roll/episode_name.dm @@ -52,13 +52,15 @@ "THE CURIOUS CASE OF [uppr_name]", "ONE HELL OF A PARTY", "FOR YOUR CONSIDERATION", "PRESS YOUR LUCK", "A STATION CALLED [uppr_name]", "CRIME AND PUNISHMENT", "MY DINNER WITH [uppr_name]", "UNFINISHED BUSINESS", "THE ONLY STATION THAT'S NOT ON FIRE (YET)", "SOMEONE'S GOTTA DO IT", "THE [uppr_name] MIX-UP", "PILOT", "PROLOGUE", "FINALE", "UNTITLED", "THE END")]") episode_names += new /datum/episode_name("[pick("SPACE", "SEXY", "DRAGON", "WARLOCK", "LAUNDRY", "GUN", "ADVERTISING", "DOG", "CARBON MONOXIDE", "NINJA", "WIZARD", "SOCRATIC", "JUVENILE DELIQUENCY", "POLITICALLY MOTIVATED", "RADTACULAR SICKNASTY", "CORPORATE", "MEGA")] [pick("QUEST", "FORCE", "ADVENTURE")]", weight=25) + draft_spooky_episodes() + switch(GLOB.start_state.score(GLOB.end_state)) if(-INFINITY to -2000) episode_names += new /datum/episode_name("[pick("THE CREW'S PUNISHMENT", "A PUBLIC RELATIONS NIGHTMARE", "[uppr_name]: A NATIONAL CONCERN", "WITH APOLOGIES TO THE CREW", "THE CREW BITES THE DUST", "THE CREW BLOWS IT", "THE CREW GIVES UP THE DREAM", "THE CREW IS DONE FOR", "THE CREW SHOULD NOT BE ALLOWED ON TV", "THE END OF [uppr_name] AS WE KNOW IT")]", "Extremely low score of [GLOB.start_state.score(GLOB.end_state)].", 250) if(4500 to INFINITY) episode_names += new /datum/episode_name("[pick("THE CREW'S DAY OUT", "THIS SIDE OF PARADISE", "[uppr_name]: A SITUATION COMEDY", "THE CREW'S LUNCH BREAK", "THE CREW'S BACK IN BUSINESS", "THE CREW'S BIG BREAK", "THE CREW SAVES THE DAY", "THE CREW RULES THE WORLD", "THE ONE WITH ALL THE SCIENCE AND PROGRESS AND PROMOTIONS AND ALL THE COOL AND GOOD THINGS", "THE TURNING POINT")]", "High score of [GLOB.start_state.score(GLOB.end_state)].", 250) - if(IS_DYNAMIC_GAME_MODE) + if(GAMEMODE_WAS_DYNAMIC) var/datum/game_mode/dynamic/dynameme = SSticker.mode switch(dynameme.threat_level) if(0 to 35) @@ -79,33 +81,37 @@ episode_names += new /datum/episode_name/rare("RUSH HOUR", "High threat level of [dynameme.threat_level]%, and the round lasted just about an hour.", 500) if(get_station_avg_temp() < T0C) episode_names += new /datum/episode_name/rare("A COLD DAY IN HELL", "Station temperature was below 0C this round and threat was high", 1000) - if(locate(/datum/dynamic_ruleset/roundstart/malf_ai) in dynameme.executed_rules) - episode_names += new /datum/episode_name/rare("[pick("I'M SORRY [uppr_name], I'M AFRAID I CAN'T LET YOU DO THAT", "A STRANGE GAME", "THE AI GOES ROGUE", "RISE OF THE MACHINES")]", "Round included a malfunctioning AI.", 300) - if(locate(/datum/dynamic_ruleset/roundstart/revs) in dynameme.executed_rules) - episode_names += new /datum/episode_name/rare("[pick("THE CREW STARTS A REVOLUTION", "HELL IS OTHER SPESSMEN", "INSURRECTION", "THE CREW RISES UP", 25;"FUN WITH FRIENDS")]", "Round included roundstart revs.", 350) - if(copytext(uppr_name,1,2) == "V") - episode_names += new /datum/episode_name/rare("V FOR [uppr_name]", "Round included roundstart revs... and the station's name starts with V.", 1500) + if(locate(/datum/dynamic_ruleset/midround/from_ghosts/blob) in dynameme.executed_rules) episode_names += new /datum/episode_name/rare("[pick("MARRIED TO THE BLOB", "THE CREW GETS QUARANTINED")]", "Round included a roundstart blob.", 350) - /*if(GLOB.station_was_nuked) - episode_names += new /datum/episode_name/rare("[pick("THE CREW GETS NUKED", "THE CREW IS THE BOMB", "THE CREW GOES NUCLEAR", "THE CREW BLASTS OFF AGAIN!", "THE 'BOOM' HEARD 'ROUND THE WORLD", 25;"THE BIG BANG THEORY")]", "The station was nuked!", 450) - if((locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) || (locate(/datum/dynamic_ruleset/midround/from_ghosts/nuclear) in mode.executed_rules)) - theme = "syndie" //This really should use the nukeop's check_win(), but the newcops gamemode wasn't coded like that. - else - if((locate(/datum/dynamic_ruleset/roundstart/nuclear) in mode.executed_rules) || (locate(/datum/dynamic_ruleset/midround/from_ghosts/nuclear) in mode.executed_rules)) - episode_names += new /datum/episode_name/rare("[pick("THE CREW SOLVES THE NUCLEAR CRISIS", "BLAST, FOILED AGAIN", "FISSION MAILED", 50;"I OPENED THE WINDOW, AND IN FLEW COPS")]", "The crew defeated the nuclear operatives.", 350) - if(score.nukedefuse < 30) - episode_names += new /datum/episode_name/rare("[score.nukedefuse] SECOND[score.nukedefuse == 1 ? "" : "S"] TO MIDNIGHT", "The nuke was defused with [score.nukedefuse] seconds remaining.", (30 - score.nukedefuse) * 100) - */ + + if(GAMEMODE_WAS_MALF_AI) + episode_names += new /datum/episode_name/rare("[pick("I'M SORRY [uppr_name], I'M AFRAID I CAN'T LET YOU DO THAT", "A STRANGE GAME", "THE AI GOES ROGUE", "RISE OF THE MACHINES")]", "Round included a malfunctioning AI.", 300) + + if(GAMEMODE_WAS_REVS) + episode_names += new /datum/episode_name/rare("[pick("THE CREW STARTS A REVOLUTION", "HELL IS OTHER SPESSMEN", "INSURRECTION", "THE CREW RISES UP", 25;"FUN WITH FRIENDS")]", "Round included roundstart revs.", 350) + if(copytext(uppr_name,1,2) == "V") + episode_names += new /datum/episode_name/rare("V FOR [uppr_name]", "Round included roundstart revs... and the station's name starts with V.", 1500) + + if(GLOB.station_was_nuked) + episode_names += new /datum/episode_name/rare("[pick("THE CREW GETS NUKED", "THE CREW IS THE BOMB", "THE CREW GOES NUCLEAR", "THE CREW BLASTS OFF AGAIN!", "THE 'BOOM' HEARD 'ROUND THE WORLD", 25;"THE BIG BANG THEORY")]", "The station was nuked!", 450) + if(GAMEMODE_WAS_NUCLEAR_EMERGENCY) + theme = "syndie" //This really should use the nukeop's check_win(), but the newcops gamemode wasn't coded like that. + else + if(GAMEMODE_WAS_NUCLEAR_EMERGENCY) + episode_names += new /datum/episode_name/rare("[pick("THE CREW SOLVES THE NUCLEAR CRISIS", "BLAST, FOILED AGAIN", "FISSION MAILED", 50;"I OPENED THE WINDOW, AND IN FLEW COPS")]", "The crew defeated the nuclear operatives.", 350) + if(GLOB.nuke_time_left < 30) + episode_names += new /datum/episode_name/rare("[GLOB.nuke_time_left] SECOND[GLOB.nuke_time_left == 1 ? "" : "S"] TO MIDNIGHT", "The nuke was defused with [GLOB.nuke_time_left] seconds remaining.", (30 - GLOB.nuke_time_left) * 100) + if(BLACKBOX_FEEDBACK_NUM("narsies_spawned") > 0) episode_names += new /datum/episode_name/rare("[pick("NAR-SIE'S DAY OUT", "NAR-SIE'S VACATION", "THE CREW LEARNS ABOUT SACRED GEOMETRY", "REALM OF THE MAD GOD", "THE ONE WITH THE ELDRITCH HORROR", 50;"STUDY HARD, BUT PART-SIE HARDER")]", "Nar-Sie is loose!", 500) if(locate(/datum/holiday/xmas) in SSevents.holidays) - episode_names += new /datum/episode_name("A VERY [pick("DAEDALUS", "NANOTRASEN", "EXPEDITIONARY", "SECURE", "PLASMA", "MARTIAN")] CHRISTMAS", "'Tis the season.", 1000) + episode_names += new /datum/episode_name("A VERY [pick("DAEDALUS", "SPACE", "MARTIAN")] CHRISTMAS", "'Tis the season.", 1000) if(BLACKBOX_FEEDBACK_NUM("guns_spawned") > 0) episode_names += new /datum/episode_name/rare("[pick("GUNS, GUNS EVERYWHERE", "THUNDER GUN EXPRESS", "THE CREW GOES AMERICA ALL OVER EVERYBODY'S ASS")]", "[BLACKBOX_FEEDBACK_NUM("guns_spawned")] guns were spawned this round.", min(750, BLACKBOX_FEEDBACK_NUM("guns_spawned")*25)) if(BLACKBOX_FEEDBACK_NUM("heartattacks") > 2) - episode_names += new /datum/episode_name/rare("MY HEART WILL GO ON", "[BLACKBOX_FEEDBACK_NUM("heartattacks")] hearts were reanimated and burst out of someone's chest this round.", min(1500, BLACKBOX_FEEDBACK_NUM("heartattacks")*250)) + episode_names += new /datum/episode_name/rare("MY HEART WILL GO ON", "There were [BLACKBOX_FEEDBACK_NUM("heartattacks")] heartattacks this round", min(1500, BLACKBOX_FEEDBACK_NUM("heartattacks")*250)) var/datum/bank_account/mr_moneybags var/static/list/typecache_bank = typecacheof(list(/datum/bank_account/department, /datum/bank_account/remote)) @@ -192,7 +198,7 @@ chefcount++ if(H.is_wearing_item_of_type(/obj/item/clothing/under/rank/civilian/lawyer)) lawyercount++ - if(H.mind && H.mind.assigned_role.title == "Shaft Miner") + if(H.mind && H.mind.assigned_role.title == JOB_PROSPECTOR) minercount++ if(H.mind && H.mind.assigned_role.title == "Chaplain") chaplaincount++ @@ -238,7 +244,7 @@ theme = "syndie" if(H.stat == CONSCIOUS && H.mind && H.mind.assigned_role.title) switch(H.mind.assigned_role.title) - if("Chef") + if(JOB_COOK) var/chance = 250 if(H.is_wearing_item_of_type(/obj/item/clothing/head/chefhat)) chance += 500 @@ -249,19 +255,20 @@ episode_names += new /datum/episode_name/rare("HAIL TO THE CHEF", "The Chef was the only survivor in the shuttle.", chance) if(p_hotspot.len > 200) // List of turfs on fire length episode_names += new /datum/episode_name/rare("IF YOU CAN'T STAND THE HEAT...", "The Chef was the only survivor in the shuttle and [p_hotspot.len] turfs were on fire.", min(chance, p_hotspot.len/2)) - if("Clown") + if(JOB_CLOWN) + if(!H.mind.miming) + var/chance = 250 + if(H.is_wearing_item_of_type(/obj/item/clothing/mask/gas/clown_hat)) + chance += 500 + if(H.is_wearing_item_of_type(list(/obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/shoes/clown_shoes/jester))) + chance += 500 + if(H.is_wearing_item_of_type(list(/obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/under/rank/civilian/clown/jester))) + chance += 250 + episode_names += new /datum/episode_name/rare("[pick("COME HELL OR HIGH HONKER", "THE LAST LAUGH")]", "The Clown was the only survivor in the shuttle.", chance) + theme = "clown" + if(JOB_DETECTIVE) var/chance = 250 - if(H.is_wearing_item_of_type(/obj/item/clothing/mask/gas/clown_hat)) - chance += 500 - if(H.is_wearing_item_of_type(list(/obj/item/clothing/shoes/clown_shoes, /obj/item/clothing/shoes/clown_shoes/jester))) - chance += 500 - if(H.is_wearing_item_of_type(list(/obj/item/clothing/under/rank/civilian/clown, /obj/item/clothing/under/rank/civilian/clown/jester))) - chance += 250 - episode_names += new /datum/episode_name/rare("[pick("COME HELL OR HIGH HONKER", "THE LAST LAUGH")]", "The Clown was the only survivor in the shuttle.", chance) - theme = "clown" - if("Detective") - var/chance = 250 - if(H.is_wearing_item_of_type(/obj/item/storage/belt/holster/detective)) + if(H.is_wearing_item_of_type(/obj/item/storage/belt/holster/shoulder)) chance += 1000 if(H.is_wearing_item_of_type(/obj/item/clothing/head/fedora/det_hat)) chance += 500 @@ -270,30 +277,30 @@ if(H.is_wearing_item_of_type(/obj/item/clothing/under/rank/security/detective)) chance += 250 episode_names += new /datum/episode_name/rare("[uppertext(H.real_name)]: LOOSE CANNON", "The Detective was the only survivor in the shuttle.", chance) - if("Shaft Miner") + if(JOB_PROSPECTOR) var/chance = 250 if(H.is_wearing_item_of_type(/obj/item/pickaxe)) chance += 1000 if(H.is_wearing_item_of_type(/obj/item/storage/backpack/explorer)) chance += 500 - if(H.is_wearing_item_of_type(/obj/item/clothing/suit/hooded/explorer)) + if(H.is_wearing_item_of_type(/obj/item/clothing/suit/space/nasavoid/old)) chance += 250 episode_names += new /datum/episode_name/rare("[pick("YOU KNOW THE DRILL", "CAN YOU DIG IT?", "JOURNEY TO THE CENTER OF THE ASTEROI", "CAVE STORY", "QUARRY ON")]", "The Miner was the only survivor in the shuttle.", chance) - if("Librarian") + if(JOB_ARCHIVIST) var/chance = 750 if(H.is_wearing_item_of_type(/obj/item/book)) chance += 1000 /*if(H.is_wearing_item_of_type(/obj/item/clothing/under/suit_jacket/red)) chance += 500*/ episode_names += new /datum/episode_name/rare("COOKING THE BOOKS", "The Librarian was the only survivor in the shuttle.", chance) - if("Chemist") + if(JOB_CHEMIST) var/chance = 1000 if(H.is_wearing_item_of_type(/obj/item/clothing/suit/toggle/labcoat/chemist)) chance += 500 if(H.is_wearing_item_of_type(/obj/item/clothing/under/rank/medical/chemist)) chance += 250 episode_names += new /datum/episode_name/rare("A BITTER PILL TO SWALLOW", "The Chemist was the only survivor in the shuttle.", chance) - if("Chaplain") //We don't check for uniform here because the chaplain's thing kind of is to improvise their garment gimmick + if(JOB_CHAPLAIN) //We don't check for uniform here because the chaplain's thing kind of is to improvise their garment gimmick episode_names += new /datum/episode_name/rare("BLESS THIS MESS", "The Chaplain was the only survivor in the shuttle.", 1250) if(H.is_wearing_item_of_type(/obj/item/clothing/mask/luchador) && H.is_wearing_item_of_type(/obj/item/clothing/gloves/boxing)) @@ -301,7 +308,7 @@ if(human_escapees == 2) if(lawyercount == 2) - episode_names += new /datum/episode_name/rare("DOUBLE JEOPARDY", "The only two survivors were IAAs or lawyers.", 2500) + episode_names += new /datum/episode_name/rare("DOUBLE JEOPARDY", "The only two survivors were lawyers.", 2500) if(chefcount == 2) episode_names += new /datum/episode_name/rare("CHEF WARS", "The only two survivors were chefs.", 2500) if(minercount == 2) @@ -318,7 +325,7 @@ var/all_braindamaged = TRUE for(var/mob/living/carbon/human/H as anything in SSticker.popcount["human_escapees_list"]) var/obj/item/organ/brain/hbrain = H.getorganslot(ORGAN_SLOT_BRAIN) - if(hbrain.damage < 60) + if(hbrain && hbrain.damage < 60) all_braindamaged = FALSE braindamage_total += hbrain.damage var/average_braindamage = braindamage_total / human_escapees @@ -346,10 +353,35 @@ break */ +/datum/controller/subsystem/credits/proc/draft_spooky_episodes() + var/list/areas_spooked = BLACKBOX_FEEDBACK_NESTED_TALLY("ghost_power_used") + if(!length(areas_spooked)) + return + + var/uppr_name = uppertext(station_name()) + var/did_general_spooky + for(var/area_name in areas_spooked) + if(length(areas_spooked[area_name]) > 10) + did_general_spooky = TRUE + episode_names += new /datum/episode_name("THE HAUNTED [uppertext(area_name)]", "Large amounts of paranormal activity present.", 500) + + + if(did_general_spooky) + var/list/spooky_names = list( + "CARMEN MIRANDA'S GHOST IS HAUNTING [uppr_name]", + "DON'T CROSS THE STREAMS", + "BAD TO THE BONE", + "NIGHTMARE ON [uppr_name]", + ) + episode_names += new /datum/episode_name(pick(spooky_names), "Large amounts of paranormal activity present.", 250) + + if(findtext(uppr_name, "13")) + episode_names += new /datum/episode_name/rare("UNLUCKY NUMBERS", "The station's name contained \"13\".", 1000) + /proc/get_station_avg_temp() var/avg_temp = 0 var/avg_divide = 0 - for(var/obj/machinery/airalarm/alarm in GLOB.machines) + for(var/obj/machinery/airalarm/alarm as anything in INSTANCES_OF(/obj/machinery/airalarm)) var/turf/location = alarm.loc if(!istype(location) || !is_station_level(alarm.z)) continue diff --git a/code/modules/datacore/crime.dm b/code/modules/datacore/crime.dm new file mode 100644 index 000000000000..1028ba9818e7 --- /dev/null +++ b/code/modules/datacore/crime.dm @@ -0,0 +1,9 @@ +/datum/data/crime + name = "crime" + var/crimeName = "" + var/crimeDetails = "" + var/author = "" + var/time = "" + var/fine = 0 + var/paid = 0 + var/dataId = 0 diff --git a/code/modules/datacore/library.dm b/code/modules/datacore/library.dm new file mode 100644 index 000000000000..f375b99d9844 --- /dev/null +++ b/code/modules/datacore/library.dm @@ -0,0 +1,21 @@ +/datum/data_library + var/list/datum/data/record/records = list() + var/list/datum/data/record/records_by_name = list() + +/// Returns a data record or null. +/datum/data_library/proc/get_record_by_name(name) + RETURN_TYPE(/datum/data/record) + + return records_by_name[name] + +/// Inject a record into this library. +/datum/data_library/proc/inject_record(datum/data/record/new_record) + if(!istype(new_record)) + CRASH("You fucked it this time!!!") + + if(!new_record.fields["name"]) + CRASH("Cannot inject a record with no name!") + + records += new_record + records_by_name[new_record.fields["name"]] = new_record + new_record.library = src diff --git a/code/modules/datacore/records.dm b/code/modules/datacore/records.dm new file mode 100644 index 000000000000..7a761c319ead --- /dev/null +++ b/code/modules/datacore/records.dm @@ -0,0 +1,131 @@ +/datum/data + var/name = "data" + +/datum/data/record + name = "record" + /// A ref to the library we're contained in. + var/datum/data_library/library + /// The data + var/list/fields = list() + +/datum/data/record/Destroy(force, ...) + if(library) + library.records -= src + library.records_by_name -= fields["name"] + return ..() + +/// Creates a copy of the record, without it's library. +/datum/data/record/proc/Copy() + var/datum/data/record/new_record = new type() + new_record.fields = fields.Copy() + return new_record + +/// A helper proc to get the front photo of a character from the record. +/// Handles calling `get_photo()`, read its documentation for more information. +/datum/data/record/proc/get_front_photo() + return get_photo("photo_front", SOUTH) + +/// A helper proc to get the side photo of a character from the record. +/// Handles calling `get_photo()`, read its documentation for more information. +/datum/data/record/proc/get_side_photo() + return get_photo("photo_side", WEST) + +/** + * You shouldn't be calling this directly, use `get_front_photo()` or `get_side_photo()` + * instead. + * + * This is the proc that handles either fetching (if it was already generated before) or + * generating (if it wasn't) the specified photo from the specified record. This is only + * intended to be used by records that used to try to access `fields["photo_front"]` or + * `fields["photo_side"]`, and will return an empty icon if there isn't any of the necessary + * fields. + * + * Arguments: + * * field_name - The name of the key in the `fields` list, of the record itself. + * * orientation - The direction in which you want the character appearance to be rotated + * in the outputed photo. + * + * Returns an empty `/icon` if there was no `character_appearance` entry in the `fields` list, + * returns the generated/cached photo otherwise. + */ +/datum/data/record/proc/get_photo(field_name, orientation) + if(fields[field_name]) + return fields[field_name] + + if(!fields[DATACORE_APPEARANCE]) + return new /icon() + + var/mutable_appearance/character_appearance = fields[DATACORE_APPEARANCE] + character_appearance.setDir(orientation) + + var/icon/picture_image = getFlatIcon(character_appearance) + + var/datum/picture/picture = new + picture.picture_name = "[fields[DATACORE_NAME]]" + picture.picture_desc = "This is [fields[DATACORE_NAME]]." + picture.picture_image = picture_image + + var/obj/item/photo/photo = new(null, picture) + fields[field_name] = photo + return photo + +/datum/data/record/general + +/datum/data/record/medical + +/datum/data/record/locked + +/datum/data/record/security + +/// Set the criminal status of a crew member in the security records. +/datum/data/record/security/proc/set_criminal_status(new_status) + var/old_status = DATACORE_CRIMINAL_STATUS + if(old_status == new_status) + return FALSE + + fields[DATACORE_CRIMINAL_STATUS] = new_status + return TRUE + +/datum/data/record/security/proc/add_citation(datum/data/crime/crime) + fields[DATACORE_CITATIONS] |= crime + +/datum/data/record/security/proc/remove_citation(cDataId) + if(istext(cDataId)) + cDataId = text2num(cDataId) + + for(var/datum/data/crime/crime in fields[DATACORE_CITATIONS]) + if(crime.dataId == cDataId) + fields[DATACORE_CITATIONS] -= crime + return + +/datum/data/record/security/proc/pay_citation(cDataId, amount) + if(istext(cDataId)) + cDataId = text2num(cDataId) + + for(var/datum/data/crime/crime in fields[DATACORE_CITATIONS]) + if(crime.dataId == cDataId) + crime.paid = crime.paid + amount + var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_SEC] + D.adjust_money(amount) + return + +/datum/data/record/security/proc/add_crime(datum/data/crime/crime) + fields[DATACORE_CRIMES] |= crime + +/datum/data/record/security/proc/remove_crime(cDataId) + if(istext(cDataId)) + cDataId = text2num(cDataId) + + for(var/datum/data/crime/crime in fields[DATACORE_CRIMES]) + if(crime.dataId == cDataId) + fields[DATACORE_CRIMES] -= crime + return + +/datum/data/record/security/proc/add_crime_details(cDataId, details) + if(istext(cDataId)) + cDataId = text2num(cDataId) + + for(var/datum/data/crime/crime in fields[DATACORE_CRIMES]) + if(crime.dataId == cDataId) + crime.crimeDetails = details + return diff --git a/code/modules/debris/debris_atom.dm b/code/modules/debris/debris_atom.dm new file mode 100644 index 000000000000..9f5063c41780 --- /dev/null +++ b/code/modules/debris/debris_atom.dm @@ -0,0 +1,42 @@ +/atom + ///Icon state of debris when impacted by a projectile + var/tmp/debris_icon_state = null + ///Velocity of debris particles + var/tmp/debris_velocity = -15 + ///Amount of debris particles + var/tmp/debris_amount = 8 + ///Scale of particle debris + var/tmp/debris_scale = 0.7 + +/atom/proc/spawn_debris(obj/projectile/P) + set waitfor = FALSE + + var/angle = !isnull(P.Angle) ? P.Angle : round(get_angle(P.starting, src), 1) + var/x_component = sin(angle) * debris_velocity + var/y_component = cos(angle) * debris_velocity + var/x_component_smoke = sin(angle) * -15 + var/y_component_smoke = cos(angle) * -15 + var/obj/effect/abstract/particle_holder/debris_visuals + var/obj/effect/abstract/particle_holder/smoke_visuals + var/position_offset = rand(-6,6) + + smoke_visuals = new(src, /particles/impact_smoke) + smoke_visuals.particles.position = list(position_offset, position_offset) + smoke_visuals.particles.velocity = list(x_component_smoke, y_component_smoke) + + if(debris_icon_state && !istype(P, /obj/projectile/energy)) + debris_visuals = new(src, /particles/debris) + debris_visuals.particles.position = generator(GEN_CIRCLE, position_offset, position_offset) + debris_visuals.particles.velocity = list(x_component, y_component) + debris_visuals.layer = ABOVE_OBJ_LAYER + 0.02 + debris_visuals.particles.icon_state = debris_icon_state + debris_visuals.particles.count = debris_amount + debris_visuals.particles.spawning = debris_amount + debris_visuals.particles.scale = debris_scale + + smoke_visuals.layer = ABOVE_OBJ_LAYER + 0.01 + addtimer(CALLBACK(src, PROC_REF(__remove_debris), smoke_visuals, debris_visuals), 0.7 SECONDS) + +/atom/proc/__remove_debris(obj/effect/abstract/particle_holder/smoke_visuals, obj/effect/abstract/particle_holder/debris_visuals) + QDEL_NULL(smoke_visuals) + QDEL_NULL(debris_visuals) diff --git a/code/modules/debris/debris_mob.dm b/code/modules/debris/debris_mob.dm new file mode 100644 index 000000000000..acc19ed5e860 --- /dev/null +++ b/code/modules/debris/debris_mob.dm @@ -0,0 +1,3 @@ +// No debris. +/mob/spawn_debris(obj/projectile/P) + return diff --git a/code/modules/debris/debris_obj.dm b/code/modules/debris/debris_obj.dm new file mode 100644 index 000000000000..ad1b76a8cf35 --- /dev/null +++ b/code/modules/debris/debris_obj.dm @@ -0,0 +1,14 @@ +/obj/structure + debris_icon_state = DEBRIS_SPARKS + debris_velocity = -15 + debris_amount = 8 + +/obj/structure/closet/cabinet + debris_icon_state = DEBRIS_SPARKS + debris_velocity = -10 + debris_amount = 5 + +/obj/structure/window + debris_icon_state = DEBRIS_SPARKS + debris_velocity = -10 + debris_amount = 5 diff --git a/code/modules/debris/debris_particles.dm b/code/modules/debris/debris_particles.dm new file mode 100644 index 000000000000..489ebdf1be64 --- /dev/null +++ b/code/modules/debris/debris_particles.dm @@ -0,0 +1,28 @@ +/particles/debris + icon = 'icons/effects/particles/generic.dmi' + width = 500 + height = 500 + count = 10 + spawning = 10 + lifespan = 0.7 SECONDS + fade = 0.4 SECONDS + drift = generator(GEN_CIRCLE, 0, 7) + scale = 0.7 + velocity = list(50, 0) + friction = generator(GEN_NUM, 0.1, 0.15) + spin = generator(GEN_NUM, -20, 20) + +/particles/impact_smoke + icon = 'icons/effects/effects.dmi' + icon_state = "smoke" + width = 500 + height = 500 + count = 20 + spawning = 20 + lifespan = 0.7 SECONDS + fade = 8 SECONDS + grow = 0.1 + scale = 0.2 + spin = generator(GEN_NUM, -20, 20) + velocity = list(50, 0) + friction = generator(GEN_NUM, 0.1, 0.5) diff --git a/code/modules/debris/debris_turf.dm b/code/modules/debris/debris_turf.dm new file mode 100644 index 000000000000..ebbd675dd518 --- /dev/null +++ b/code/modules/debris/debris_turf.dm @@ -0,0 +1,9 @@ +/turf/closed/wall + debris_icon_state = DEBRIS_SPARKS + debris_velocity = -15 + debris_amount = 1 + +/turf/closed/mineral + debris_icon_state = DEBRIS_ROCK + debris_velocity = -10 + debris_amount = 1 diff --git a/code/modules/debug_health/debug_health.dm b/code/modules/debug_health/debug_health.dm new file mode 100644 index 000000000000..8b6704886578 --- /dev/null +++ b/code/modules/debug_health/debug_health.dm @@ -0,0 +1,218 @@ +/* + Datum container for the health debug menu +*/ +/datum/health_debug_menu + var/client/user + var/mob/living/carbon/human/target + +/datum/health_debug_menu/New(client/user, mob/living/carbon/human/target) + . = ..() + if(!istype(user) || !istype(target)) + return + src.user = user + src.target = target + + RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(qdelme)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(qdelme)) + + src.target.notransform = TRUE + +/datum/health_debug_menu/Destroy(force, ...) + if(!QDELETED(target)) + target.notransform = FALSE + target = null + user = null + return ..() + +/datum/health_debug_menu/ui_state(mob/user) + return GLOB.admin_state + +/datum/health_debug_menu/ui_close(mob/user) + qdel(src) + +/datum/health_debug_menu/proc/qdelme(datum/source) + SIGNAL_HANDLER + qdel(src) + +/datum/health_debug_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "DebugHealth") + ui.open() + +/client/proc/debug_health(mob/living/carbon/human/H in view()) + set name = "Debug Health" + set category = "Debug" + + if(!istype(H)) + return + + var/datum/health_debug_menu/tgui = new(usr.client, H)//create the datum + tgui.ui_interact(usr)//datum has a tgui component, here we open the window + +/datum/health_debug_menu/ui_data() + var/list/ui_data = list() + + ui_data["body"] = list( + "stat" = "", + "brain" = target.getBrainLoss(), + "brute" = target.getBruteLoss(), + "burn" = target.getFireLoss(), + "organ" = target.getToxLoss(), + "oxygen" = target.getOxyLoss(), + "pain" = target.getPain(), + "shock" = target.shock_stage, + "losebreath" = target.losebreath, + "asystole" = BOOLEAN(target.undergoing_cardiac_arrest()), + "blood volume" = target.blood_volume, + "blood circulation" = target.get_blood_circulation(), + "blood oxygenation" = target.get_blood_oxygenation(), + "temperature" = round(target.bodytemperature, 0.1), + "misc" = list(), + ) + + switch(target.stat) + if(CONSCIOUS) + ui_data["body"]["stat"] = "Conscious" + if(UNCONSCIOUS) + if(target.IsSleeping()) + ui_data["body"]["stat"] = "Unconscious (Asleep)" + else + ui_data["body"]["stat"] = "Unconscious" + if(DEAD) + ui_data["body"]["stat"] = "Dead" + + var/list/bp_names = list( + BODY_ZONE_HEAD = "Head", + BODY_ZONE_CHEST = "Chest", + BODY_ZONE_R_ARM = "Right Arm", + BODY_ZONE_L_ARM = "Left Arm", + BODY_ZONE_R_LEG = "Right Leg", + BODY_ZONE_L_LEG = "Left Leg" + ) + + var/list/open_levels = list("Open", "Retracted", "To Bone") + + var/list/bodyparts = list() + + for(var/zone in list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) + var/obj/item/bodypart/BP = target.get_bodypart(zone, TRUE) + if(!BP) + bodyparts[bp_names[zone]] = list( + "wounds" = list(), + "damage" = "N/A", + "max damage" = "N/A", + "pain" = null, + "bleed rate" = 0, + "germ level" = 0, + "how open" = null, + "status" = list("MISSING"), + "cavity objects" = list(), + ) + continue + + var/list/flags = list() + for (var/i in GLOB.bitfields[NAMEOF(BP, bodypart_flags)]) + if (BP.bodypart_flags & GLOB.bitfields[NAMEOF(BP, bodypart_flags)][i]) + flags += i + + var/how_open = BP.how_open() + if(how_open) + how_open = open_levels[how_open] + else + how_open = "Closed" + + var/list/cavity_objects = list() + for(var/obj/item/I in BP.cavity_items) + cavity_objects += I.name + + bodyparts[bp_names[zone]] = list( + "wounds" = BP.debug_wounds(), + "damage" = BP.get_damage(), + "max damage" = BP.max_damage, + "pain" = BP.getPain(), + "bleed rate" = "[BP.cached_bleed_rate]u (modified: [BP.get_modified_bleed_rate()]u)", + "germ level" = BP.germ_level, + "how open" = how_open, + "status" = flags, + "cavity objects" = cavity_objects, + ) + + ui_data["bodyparts"] = bodyparts + + + var/list/organs = list() + ui_data["organs"] = organs + for(var/obj/item/organ/O as anything in target.organs) + if(O.cosmetic_only) + continue + + var/list/flags = list() + for (var/i in GLOB.bitfields[NAMEOF(O, organ_flags)]) + if (O.organ_flags & GLOB.bitfields[NAMEOF(O, organ_flags)][i]) + flags += i + + organs[O.name] = list( + "type" = O.type, + "damage" = O.damage, + "max damage" = O.maxHealth, + "initial max damage" = initial(O.maxHealth), + "status" = flags, + "additional" = O.get_debug_info(), + ) + + var/list/reagents = list( + "ingest" = list(), + "blood" = list(), + "touch" = list(), + ) + + ui_data["reagents"] = reagents + + var/obj/item/organ/stomach/stomach = target.getorganslot(ORGAN_SLOT_STOMACH) + + if(stomach?.reagents) + for(var/datum/reagent/R in stomach.reagents.reagent_list) + var/list/reagent = list() + reagent["name"] = R.name + reagent["quantity"] = round(R.volume, 1) + reagent["visible"] = BOOLEAN(!(R.chemical_flags & (REAGENT_INVISIBLE))) + reagent["overdosed"] = BOOLEAN(R.overdosed) + reagents["ingest"] += list(reagent) + + for(var/datum/reagent/R in target.bloodstream.reagent_list) + var/list/reagent = list() + reagent["name"] = R.name + reagent["quantity"] = round(R.volume, 1) + reagent["visible"] = BOOLEAN(!(R.chemical_flags & (REAGENT_INVISIBLE))) + reagent["overdosed"] = BOOLEAN(R.overdosed) + reagents["blood"] += list(reagent) + + for(var/datum/reagent/R in target.touching.reagent_list) + var/list/reagent = list() + reagent["name"] = R.name + reagent["quantity"] = round(R.volume, 1) + reagent["visible"] = BOOLEAN(!(R.chemical_flags & (REAGENT_INVISIBLE))) + reagent["overdosed"] = BOOLEAN(R.overdosed) + reagents["touch"] += list(reagent) + + return ui_data + +/obj/item/bodypart/proc/debug_wounds() + var/list/wound_data = list() + + for(var/datum/wound/wound as anything in wounds) + wound_data += list(list( + "NAME" = capitalize(wound.wound_type), + "STAGE" = wound.current_stage, + "MAX_STAGE" = length(wound.stages), + "AMOUNT" = wound.amount, + "DAMAGE" = wound.damage, + "HEALING" = BOOLEAN(wound.can_autoheal()), + "BLEEDING" = wound.bleeding() ? "[WOUND_BLEED_RATE(wound)]u" : null, + "CLAMPED" = BOOLEAN(wound.clamped), + "TREATED" = BOOLEAN(wound.is_treated()), + "SURGICAL" = BOOLEAN(wound.is_surgical()), + )) + + return wound_data diff --git a/code/modules/debug_health/organ_debug.dm b/code/modules/debug_health/organ_debug.dm new file mode 100644 index 000000000000..c63e06d060b6 --- /dev/null +++ b/code/modules/debug_health/organ_debug.dm @@ -0,0 +1,35 @@ +/obj/item/organ/proc/get_debug_info() + . = list() + + if(organ_flags & ORGAN_DEAD) + if(can_recover()) + . += "Decaying" + else + . += "Necrotic (unrecoverable)" + + +/* HEART INFO */ +/obj/item/organ/heart/get_debug_info() + . = ..() + switch(pulse) + if(PULSE_NONE) + . += "Pulse: NONE" + if(PULSE_SLOW) + . += "Pulse: SLOW" + if(PULSE_NORM) + . += "Pulse: NORMAL" + if(PULSE_FAST) + . += "Pulse: FAST" + if(PULSE_2FAST) + . += "Pulse: 2FAST" + if(PULSE_THREADY) + . += "Pulse: HEARTATTACK READY" + + if(pulse == PULSE_NONE && !(organ_flags & ORGAN_SYNTHETIC)) + . += "Asystole" + + +/* BRAIN INFO */ +/obj/item/organ/brain/get_debug_info() + . = ..() + . += "Oxygen Reserve: [oxygen_reserve]" diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 0a2155eb43c4..171e023121f1 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -1,75 +1,111 @@ -//CONTAINS: Suit fibers and Detective's Scanning Computer - /atom/proc/return_fingerprints() - var/datum/component/forensics/D = GetComponent(/datum/component/forensics) - if(D) - . = D.fingerprints + RETURN_TYPE(/list) + return forensics?.fingerprints -/atom/proc/return_hiddenprints() - var/datum/component/forensics/D = GetComponent(/datum/component/forensics) - if(D) - . = D.hiddenprints +/atom/proc/return_touch_log() + RETURN_TYPE(/list) + return forensics?.admin_log /atom/proc/return_blood_DNA() - var/datum/component/forensics/D = GetComponent(/datum/component/forensics) - if(D) - . = D.blood_DNA + RETURN_TYPE(/list) + return forensics?.blood_DNA /atom/proc/blood_DNA_length() - var/datum/component/forensics/D = GetComponent(/datum/component/forensics) - if(D) - . = length(D.blood_DNA) + RETURN_TYPE(/list) + return length(forensics?.blood_DNA) /atom/proc/return_fibers() - var/datum/component/forensics/D = GetComponent(/datum/component/forensics) - if(D) - . = D.fibers + RETURN_TYPE(/list) + return forensics?.fibers -/atom/proc/add_fingerprint_list(list/fingerprints) //ASSOC LIST FINGERPRINT = FINGERPRINT - if(length(fingerprints)) - . = AddComponent(/datum/component/forensics, fingerprints) +/atom/proc/return_gunshot_residue() + RETURN_TYPE(/list) + return forensics?.gunshot_residue + +/atom/proc/return_trace_DNA() + RETURN_TYPE(/list) + return forensics?.trace_DNA + +/atom/proc/remove_evidence() + RETURN_TYPE(/list) + return forensics?.remove_evidence() -//Set ignoregloves to add prints irrespective of the mob having gloves on. +/// Adds the fingerprint of M to our fingerprint list. Ignoregloves will ignore any gloves they may be wearing. /atom/proc/add_fingerprint(mob/M, ignoregloves = FALSE) if (QDELING(src)) return - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D?.add_fingerprint(M, ignoregloves) -/atom/proc/add_fiber_list(list/fibertext) //ASSOC LIST FIBERTEXT = FIBERTEXT - if(length(fibertext)) - . = AddComponent(/datum/component/forensics, null, null, null, fibertext) + if(isnull(forensics)) + create_forensics() + forensics.add_fingerprint(M, ignoregloves) + +/// Adds the fibers of M to our fiber list. /atom/proc/add_fibers(mob/living/carbon/human/M) - var/old = 0 - if(M.gloves && istype(M.gloves, /obj/item/clothing)) - 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 - if(add_blood_DNA(G.return_blood_DNA()) && length(G.return_blood_DNA()) > old) //only reduces the bloodiness of our gloves if the item wasn't already bloody + if(istype(M)) + if(M.gloves && istype(M.gloves, /obj/item/clothing)) + var/obj/item/clothing/gloves/G = M.gloves + + if(G.transfer_blood > 1 && add_blood_DNA(G.return_blood_DNA())) //bloodied gloves transfer blood to touched objects G.transfer_blood-- - else if(M.blood_in_hands > 1) - old = length(M.return_blood_DNA()) - if(add_blood_DNA(M.return_blood_DNA()) && length(M.return_blood_DNA()) > old) + + else if(M.blood_in_hands > 1 && add_blood_DNA(M.return_blood_DNA())) M.blood_in_hands-- - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_fibers(M) -/atom/proc/add_hiddenprint_list(list/hiddenprints) //NOTE: THIS IS FOR ADMINISTRATION FINGERPRINTS, YOU MUST CUSTOM SET THIS TO INCLUDE CKEY/REAL NAMES! CHECK FORENSICS.DM - if(length(hiddenprints)) - . = AddComponent(/datum/component/forensics, null, hiddenprints) + if(isnull(forensics)) + create_forensics() + forensics.add_fibers(M) + +/// For admins. Logs when mobs players with this thing. +/atom/proc/log_touch(mob/M) + if(isnull(forensics)) + create_forensics() + + forensics.log_touch(M) + +/// Add a list of fingerprints +/atom/proc/add_fingerprint_list(list/fingerprints) + if(isnull(forensics)) + create_forensics() + + forensics.add_fingerprint_list(fingerprints) + +/// Add a list of fibers +/atom/proc/add_fiber_list(list/fibertext) + if(isnull(forensics)) + create_forensics() + forensics.add_fiber_list(fibertext) + +/// Add a list of residues +/atom/proc/add_gunshot_residue(residue) + if(isnull(forensics)) + create_forensics() + forensics.add_gunshot_residue(residue) + +/atom/proc/log_touch_list(list/hiddenprints) + if(isnull(forensics)) + create_forensics() -/atom/proc/add_hiddenprint(mob/M) - var/datum/component/forensics/D = AddComponent(/datum/component/forensics) - . = D.add_hiddenprint(M) + forensics.log_touch_list(hiddenprints) +/atom/proc/add_trace_DNA(list/dna) + if(isnull(forensics)) + create_forensics() + + forensics.add_trace_DNA(dna) + +/// Returns TRUE if new blood dna was added. /atom/proc/add_blood_DNA(list/dna) //ASSOC LIST DNA = BLOODTYPE return FALSE /obj/add_blood_DNA(list/dna) - . = ..() - if(length(dna)) - . = AddComponent(/datum/component/forensics, null, null, dna) + if(!length(dna)) + return + + if(isnull(forensics)) + create_forensics() + + return forensics.add_blood_DNA(dna) /obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) . = ..() @@ -79,32 +115,73 @@ var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src if(!B) B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) + if(!QDELETED(B)) - B.add_blood_DNA(blood_dna) //give blood info to the blood decal. - return TRUE //we bloodied the floor + return B.add_blood_DNA(blood_dna) //give blood info to the blood decal. /mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - if(wear_suit) - wear_suit.add_blood_DNA(blood_dna) - update_worn_oversuit() - else if(w_uniform) - w_uniform.add_blood_DNA(blood_dna) - update_worn_undersuit() - if(gloves) - var/obj/item/clothing/gloves/G = gloves - G.add_blood_DNA(blood_dna) - else if(length(blood_dna)) - AddComponent(/datum/component/forensics, null, null, blood_dna) - blood_in_hands = rand(2, 4) - update_worn_gloves() //handles bloody hands overlays and updating + return add_blood_DNA_to_items(blood_dna) + +/// Adds blood DNA to certain slots the mob is wearing +/mob/living/carbon/human/proc/add_blood_DNA_to_items( + list/blood_DNA_to_add, + target_flags = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING|ITEM_SLOT_GLOVES|ITEM_SLOT_HEAD|ITEM_SLOT_MASK, +) + if(QDELING(src)) + return FALSE + + if(!length(blood_DNA_to_add)) + return FALSE + + // Don't messy up our jumpsuit if we're got a coat + if((obscured_slots & HIDEJUMPSUIT) || ((target_flags & ITEM_SLOT_OCLOTHING) && (wear_suit?.body_parts_covered & CHEST))) + target_flags &= ~ITEM_SLOT_ICLOTHING + + var/dirty_hands = !!(target_flags & (ITEM_SLOT_GLOVES|ITEM_SLOT_HANDS)) + var/dirty_feet = !!(target_flags & ITEM_SLOT_FEET) + var/slots_to_bloody = target_flags & ~check_obscured_slots() + var/list/all_worn = get_equipped_items() + + for(var/obj/item/thing as anything in all_worn) + if(thing.slot_flags & slots_to_bloody) + thing.add_blood_DNA(blood_DNA_to_add) + + if(thing.body_parts_covered & HANDS) + dirty_hands = FALSE + + if(thing.body_parts_covered & FEET) + dirty_feet = FALSE + + if(slots_to_bloody & ITEM_SLOT_HANDS) + for(var/obj/item/thing in held_items) + thing.add_blood_DNA(blood_DNA_to_add) + + if(dirty_hands || dirty_feet || !length(all_worn)) + if(isnull(forensics)) + create_forensics() + forensics.add_blood_DNA(blood_DNA_to_add) + + if(dirty_hands) + blood_in_hands = max(blood_in_hands, rand(2, 4)) + + update_clothing(slots_to_bloody) return TRUE +/* + * Transfer all forensic evidence from [src] to [transfer_to]. + */ +/atom/proc/transfer_evidence_to(atom/transfer_to) + transfer_fingerprints_to(transfer_to) + transfer_fibers_to(transfer_to) + transfer_gunshot_residue_to(transfer_to) + transfer_to.add_blood_DNA(return_blood_DNA()) + transfer_to.add_trace_DNA(return_trace_DNA()) /* * Transfer all the fingerprints and hidden prints from [src] to [transfer_to]. */ /atom/proc/transfer_fingerprints_to(atom/transfer_to) transfer_to.add_fingerprint_list(return_fingerprints()) - transfer_to.add_hiddenprint_list(return_hiddenprints()) + transfer_to.log_touch_list(return_touch_log()) transfer_to.fingerprintslast = fingerprintslast /* @@ -112,3 +189,63 @@ */ /atom/proc/transfer_fibers_to(atom/transfer_to) transfer_to.add_fiber_list(return_fibers()) + +/* + * Transfer all the gunshot residue from [src] to [transfer_to]. + */ +/atom/proc/transfer_gunshot_residue_to(atom/transfer_to) + transfer_to.add_gunshot_residue(return_gunshot_residue()) + +/// On examine, players have a chance to find forensic evidence. This can only happen once per object. +/mob/living/carbon/human/proc/forensic_analysis_roll(atom/examined) + if(!stats.cooldown_finished("examine_forensic_analysis")) + return + + // Already gotten the good rng on this one + if(stats.examined_object_weakrefs[WEAKREF(examined)]) + return + + if(examined.return_blood_DNA()) + return // This is kind of obvious + + var/list/fingerprints = examined.return_fingerprints()?.Copy() + var/list/trace_dna = examined.return_trace_DNA()?.Copy() + var/list/residue = examined.return_gunshot_residue() + + // Exclude our own prints + if(length(fingerprints)) + var/obj/item/bodypart/arm/left_arm = get_bodypart(BODY_ZONE_L_ARM) + var/obj/item/bodypart/arm/right_arm = get_bodypart(BODY_ZONE_R_ARM) + + if(left_arm) + fingerprints -= get_fingerprints(TRUE, left_arm) + if(right_arm) + fingerprints -= get_fingerprints(TRUE, right_arm) + + // Exclude our DNA + if(length(trace_dna)) + trace_dna -= get_trace_dna() + + // Do nothing if theres no evidence. + if(!(length(fingerprints) || length(trace_dna) || length(residue))) + return + + var/datum/roll_result/result = stat_roll(16, /datum/rpg_skill/forensics) + + switch(result.outcome) + if(FAILURE, CRIT_FAILURE) + stats.set_cooldown("examine_forensic_analysis", 15 SECONDS) + return + + stats.examined_object_weakrefs[WEAKREF(examined)] = TRUE + stats.set_cooldown("examine_forensic_analysis", 15 MINUTES) + + // Spawn 0 so this displays *after* the examine block. + spawn(0) + if(length(residue)) + to_chat(src, result.create_tooltip("A remnant of past events flashes into your mind, the booming crack of a firearm.")) + + else if(length(fingerprints) || length(trace_dna)) + var/text = isitem(examined) ? "someone else has held this item in the past" : "someone else has been here before" + to_chat(src, result.create_tooltip("Perhaps it is a stray particle of dust, or a smudge on the surface. Whatever it may be, you are certain [text].")) + diff --git a/code/modules/detectivework/dna_analyzer.dm b/code/modules/detectivework/dna_analyzer.dm new file mode 100644 index 000000000000..df47697b4aa0 --- /dev/null +++ b/code/modules/detectivework/dna_analyzer.dm @@ -0,0 +1,181 @@ +/obj/machinery/dna_analyzer + name = "dna analyzer" + desc = "A machine designed to analyze substances and their potential DNA presence." + icon = 'icons/obj/machines/forensics/dna_scanner.dmi' + icon_state = "dna" + + var/obj/item/swab/sample + var/working = FALSE + +/obj/machinery/dna_analyzer/Destroy() + QDEL_NULL(sample) + return ..() + +/obj/machinery/dna_analyzer/update_overlays() + . = ..() + if(machine_stat & NOPOWER) + . += "dna_closed" + return + + if(working) + . += "dna_working" + . += emissive_appearance(icon, "dna_screen_working") + . += "dna_screen_working" + else + . += "dna_closed" + . += emissive_appearance(icon, "dna_screen") + . += "dna_screen" + +/obj/machinery/dna_analyzer/attackby(obj/item/weapon, mob/user, params) + . = ..() + if(.) + return + + if(!istype(weapon, /obj/item/swab)) + to_chat(user, span_warning("[src] only accepts swabs.")) + return TRUE + + if(sample) + to_chat(user, span_warning("There is already a sample inside.")) + return TRUE + + var/obj/item/swab/incoming = weapon + if(!incoming.used) + to_chat(user, span_warning("You can only insert used samples.")) + return TRUE + + if(!user.transferItemToLoc(weapon, src)) + return TRUE + + sample = weapon + to_chat(user, span_notice("You insert [sample] into [src].")) + updateUsrDialog() + return TRUE + +/obj/machinery/dna_analyzer/proc/analyze_sample() + PRIVATE_PROC(TRUE) + if(machine_stat & NOPOWER) + return + + working = TRUE + visible_message(span_notice("[src] whirs to life as it begins to analyze the sample")) + update_appearance() + addtimer(CALLBACK(src, PROC_REF(finish_sample)), 20 SECONDS) + +/obj/machinery/dna_analyzer/proc/finish_sample() + if(machine_stat & NOPOWER) + working = FALSE + updateUsrDialog() + update_appearance() + return + + visible_message(span_notice("[icon2html(src, viewers(get_turf(src)))] makes an insistent chime."), 2) + + var/list/blood_DNA = sample.swabbed_forensics.blood_DNA + var/list/trace_DNA = sample.swabbed_forensics.trace_DNA + + var/obj/item/paper/report = new(src) + report.name = "DNA analysis for [sample.name] ([stationtime2text()])" + report.stamp(100, 320, 0, "stamp-law") + + report.info += "Scanned item:
[sample.name]
" + report.info += "Taken at: [stationtime2text()]

" + + if(length(blood_DNA) || length(trace_DNA)) + report.info += "Spectometric analysis on provided sample has determined the presence of DNA.

" + else + report.info += "No DNA presence found." + print_report(report) + return + + report.info += "Blood DNA analysis
" + if(length(blood_DNA)) + for(var/dna in blood_DNA) + report.info += "* [dna]
" + report.info += "
" + else + report.info += "None present.

" + + report.info += "Trace DNA analysis
" + if(length(trace_DNA)) + for(var/dna in trace_DNA) + report.info += "* [dna]
" + report.info += "
" + else + report.info += "None present.

" + + print_report(report) + + +/obj/machinery/dna_analyzer/proc/print_report(obj/item/paper/report) + if(machine_stat & NOPOWER) + working = FALSE + updateUsrDialog() + update_appearance() + return + + playsound(src, 'sound/machines/printer.ogg', 50) + + sleep(4 SECONDS) + working = FALSE + updateUsrDialog() + update_appearance() + if(machine_stat & NOPOWER) + return + + report.update_appearance() + report.forceMove(drop_location()) + +/obj/machinery/dna_analyzer/Topic(href, href_list) + . = ..() + if(.) + return + + if(href_list["eject"]) + if(working) + return TRUE + sample = null + if(!usr.put_in_hands(sample)) + sample.forceMove(drop_location()) + updateUsrDialog() + return TRUE + + if(href_list["analyze"]) + if(!working) + analyze_sample() + updateUsrDialog() + return TRUE + +/obj/machinery/dna_analyzer/ui_interact(mob/user, datum/tgui/ui) + var/datum/browser/popup = new(user, "dna_analyzer", name, 460, 270) + popup.set_content(jointext(get_content(), "")) + popup.open() + +/obj/machinery/dna_analyzer/proc/get_content() + PRIVATE_PROC(TRUE) + . = list() + . += "
" + . += "
" + . += {" + + DNA Analyzer + + "} + + . += "
" + if(!sample) + . += "No Sample" + else + if(working) + . += "Analyzing[ellipsis()]" + else + . += "Loaded: [sample.name]" + + . += "
" + if(sample && !working) + . += "
[button_element(src, "Analyze Sample", "analyze=1")]
" + else + . += "
Analyze
" + . += "
[button_element(src, "Eject Sample", "eject=1")]
" + . += "
" + . += "
" diff --git a/code/modules/detectivework/evidence.dm b/code/modules/detectivework/evidence.dm index 9ca6c7fac7fb..13296aeea54e 100644 --- a/code/modules/detectivework/evidence.dm +++ b/code/modules/detectivework/evidence.dm @@ -1,6 +1,4 @@ -//CONTAINS: Evidence bags - -/obj/item/evidencebag +/obj/item/storage/evidencebag name = "evidence bag" desc = "An empty evidence bag." icon = 'icons/obj/storage.dmi' @@ -8,61 +6,23 @@ inhand_icon_state = "" w_class = WEIGHT_CLASS_TINY -/obj/item/evidencebag/afterattack(obj/item/I, mob/user,proximity) +/obj/item/storage/evidencebag/Initialize(mapload) . = ..() - if(!proximity || loc == I) - return - evidencebagEquip(I, user) - -/obj/item/evidencebag/attackby(obj/item/I, mob/user, params) - if(evidencebagEquip(I, user)) - return 1 - -/obj/item/evidencebag/handle_atom_del(atom/A) - cut_overlays() - w_class = initial(w_class) - icon_state = initial(icon_state) - desc = initial(desc) - -/obj/item/evidencebag/proc/evidencebagEquip(obj/item/I, mob/user) - if(!istype(I) || I.anchored) - return - - if(loc.atom_storage && I.atom_storage) - to_chat(user, span_warning("No matter what way you try, you can't get [I] to fit inside [src].")) - return TRUE //begone infinite storage ghosts, begone from me - - if(HAS_TRAIT(I, TRAIT_NO_STORAGE_INSERT)) - to_chat(user, span_warning("No matter what way you try, you can't get [I] to fit inside [src].")) - return TRUE - - if(istype(I, /obj/item/evidencebag)) - to_chat(user, span_warning("You find putting an evidence bag in another evidence bag to be slightly absurd.")) - return TRUE //now this is podracing - - if(loc in I.get_all_contents()) // fixes tg #39452, evidence bags could store their own location, causing I to be stored in the bag while being present inworld still, and able to be teleported when removed. - to_chat(user, span_warning("You find putting [I] in [src] while it's still inside it quite difficult!")) - return - - if(I.w_class > WEIGHT_CLASS_NORMAL) - to_chat(user, span_warning("[I] won't fit in [src]!")) - return + atom_storage.max_slots = 1 + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_total_storage = WEIGHT_CLASS_SMALL + atom_storage.set_holdable(null, list(type)) - if(contents.len) - to_chat(user, span_warning("[src] already has something inside it!")) +/obj/item/storage/evidencebag/attack_obj(obj/attacked_obj, mob/living/user, params) + . = ..() + if(.) return - if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. - if(I.loc.atom_storage) //in a container. - I.loc.atom_storage.attempt_remove(I, src) - if(!user.dropItemToGround(I)) - return - - user.visible_message(span_notice("[user] puts [I] into [src]."), span_notice("You put [I] inside [src]."),\ - span_hear("You hear a rustle as someone puts something into a plastic bag.")) - - icon_state = "evidence" + return atom_storage.attempt_insert(attacked_obj, user) +/obj/item/storage/evidencebag/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) + . = ..() + var/obj/item/I = arrived var/mutable_appearance/in_evidence = new(I) in_evidence.plane = FLOAT_PLANE in_evidence.layer = FLOAT_LAYER @@ -72,30 +32,11 @@ add_overlay("evidence") //should look nicer for transparent stuff. not really that important, but hey. desc = "An evidence bag containing [I]. [I.desc]" - I.forceMove(src) w_class = I.w_class - return 1 - -/obj/item/evidencebag/attack_self(mob/user) - if(contents.len) - var/obj/item/I = contents[1] - user.visible_message(span_notice("[user] takes [I] out of [src]."), span_notice("You take [I] out of [src]."),\ - span_hear("You hear someone rustle around in a plastic bag, and remove something.")) - cut_overlays() //remove the overlays - user.put_in_hands(I) - w_class = WEIGHT_CLASS_TINY - icon_state = "evidenceobj" - desc = "An empty evidence bag." - else - to_chat(user, span_notice("[src] is empty.")) - icon_state = "evidenceobj" - return - -/obj/item/storage/box/evidence - name = "evidence bag box" - desc = "A box claiming to contain evidence bags." - -/obj/item/storage/box/evidence/PopulateContents() - for(var/i in 1 to 6) - new /obj/item/evidencebag(src) +/obj/item/storage/evidencebag/Exited(atom/movable/gone, direction) + . = ..() + cut_overlays() //remove the overlays + w_class = WEIGHT_CLASS_TINY + icon_state = "evidenceobj" + desc = "An empty evidence bag." diff --git a/code/modules/detectivework/fibers.dm b/code/modules/detectivework/fibers.dm new file mode 100644 index 000000000000..139570051bbe --- /dev/null +++ b/code/modules/detectivework/fibers.dm @@ -0,0 +1,11 @@ +/obj/item/proc/get_fibers() + return null + +/obj/item/clothing/get_fibers() + return "material from \a [fiber_name || name]." + +/obj/item/clothing/gloves/get_fibers() + return "material from a pair of [fiber_name || name]." + +/obj/item/clothing/shoes/get_fibers() + return "material from a pair of [fiber_name || name]." diff --git a/code/modules/detectivework/microscope.dm b/code/modules/detectivework/microscope.dm new file mode 100644 index 000000000000..ce1ce31bd94a --- /dev/null +++ b/code/modules/detectivework/microscope.dm @@ -0,0 +1,149 @@ +/obj/machinery/microscope + name = "electron microscope" + desc = "A highly advanced microscope capable of zooming up to 3000x." + icon = 'icons/obj/machines/forensics/microscope.dmi' + icon_state = "microscope" + + var/obj/item/sample + +/obj/machinery/microscope/Destroy() + QDEL_NULL(sample) + return ..() + +/obj/machinery/microscope/update_overlays() + . = ..() + if(!(machine_stat & NOPOWER)) + . += emissive_appearance(icon, "[icon_state]_lights") + . += "[icon_state]_lights" + if(sample) + . += emissive_appearance(icon, "[icon_state]_lights_working") + . +="[icon_state]_lights_working" + +/obj/machinery/microscope/attackby(obj/item/weapon, mob/user, params) + if(sample) + to_chat(user, span_warning("There is already a slide in [src].")) + return + + if(istype(weapon, /obj/item/storage/evidencebag)) + var/obj/item/storage/evidencebag/B = weapon + if(!length(B.contents)) + return + + var/obj/item/stored = B.contents[1] + if(B.atom_storage.attempt_remove(stored, src)) + to_chat(user, span_notice("You insert [stored] from [B] into [src].")) + sample = stored + return + + if(!user.transferItemToLoc(weapon, src)) + return + + to_chat(user, span_notice("You insert [weapon] into [src].")) + sample = weapon + update_appearance(UPDATE_ICON) + +/obj/machinery/microscope/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + + remove_sample(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/microscope/AltClick(mob/user) + remove_sample(user) // This has canUseTopic() checks + +/obj/machinery/microscope/proc/remove_sample(mob/user) + if(!user.canUseTopic(USE_CLOSE | USE_SILICON_REACH)) + return + + if(!sample) + to_chat(user, span_warning("[src] does not have a sample in it.")) + return + + to_chat(user, span_notice("You remove the sample from [src].")) + if(!user.put_in_hands(sample)) + sample.forceMove(drop_location()) + + sample = null + update_appearance(UPDATE_ICON) + +/obj/machinery/microscope/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + . = TRUE + + if(!sample) + to_chat(user, span_warning("[src] has no sample to examine.")) + return + + to_chat(user, span_notice("The microscope whirrs as you examine [sample].")) + + if(!do_after(user, src, 5 SECONDS, DO_PUBLIC)) + return + + var/obj/item/paper/report = new() + report.stamp(100, 320, 0, "stamp-law") + + var/list/evidence = list() + var/scanned_object = sample.name + + if(istype(sample, /obj/item/swab)) + var/obj/item/swab/swab = sample + evidence["gunshot_residue"] = swab.swabbed_forensics.gunshot_residue + + else if(istype(sample, /obj/item/sample/fibers)) + var/obj/item/sample/fibers/fibers = sample + scanned_object = fibers.label + evidence["fibers"] = fibers.evidence + + else if(istype(sample, /obj/item/sample/print)) + var/obj/item/sample/print/card = sample + scanned_object = card.label || card.name + evidence["prints"] = card.evidence + + else + if(length(sample.forensics?.fingerprints)) + evidence["prints"] = sample.return_fingerprints() + if(length(sample.forensics?.fibers)) + evidence["fibers"] = sample.return_fibers() + if(length(sample.forensics?.gunshot_residue)) + evidence["gunshot_residue"] = sample.return_gunshot_residue() + + report.name = "Forensic report: [sample.name] ([stationtime2text()])" + report.info = "Scanned item:
[scanned_object]
" + report.info = "Taken at: [stationtime2text()]

" + + report.info += "Gunpowder residue analysis
" + if(LAZYLEN(evidence["gunshot_residue"])) + report.info += "Residue from the following bullets detected:
" + for(var/residue in evidence["gunshot_residue"]) + report.info += "* [residue]
" + else + report.info += "None present.
" + + report.info += "
Molecular analysis
" + if(LAZYLEN(evidence["fibers"])) + report.info += "Provided sample has the presence of unique fiber strings:
" + for(var/fiber in evidence["fibers"]) + report.info += "* Most likely match for fibers: [fiber]
" + else + report.info += "No fibers found.
" + + report.info += "
Fingerprint analysis
" + + if(LAZYLEN(evidence["prints"])) + report.info += "Surface analysis has determined unique fingerprint strings:
" + for(var/prints in evidence["prints"]) + if(!is_complete_print(evidence["prints"][prints])) + report.info += "* INCOMPLETE PRINT" + else + report.info += "* [prints]" + report.info += "
" + else + report.info += "No information available.
" + + report.forceMove(drop_location()) + report.update_appearance() + return TRUE diff --git a/code/modules/detectivework/samples.dm b/code/modules/detectivework/samples.dm new file mode 100644 index 000000000000..a3f52e446d72 --- /dev/null +++ b/code/modules/detectivework/samples.dm @@ -0,0 +1,186 @@ +/obj/item/sample + name = "forensic sample" + icon = 'icons/obj/forensics.dmi' + item_flags = parent_type::item_flags | NOBLUDGEON | NO_EVIDENCE_ON_ATTACK + w_class = WEIGHT_CLASS_TINY + var/list/evidence = list() + var/label + +/obj/item/sample/Initialize(mapload, atom/sampled_object) + . = ..() + if(sampled_object) + copy_evidence(sampled_object) + name = "[initial(name)] ([sampled_object])" + label = "[sampled_object], [get_area(sampled_object)]" + +/obj/item/sample/examine(mob/user) + . = ..() + . += span_notice("It is labelled: [label].") + + +/obj/item/sample/attackby(obj/item/item, mob/living/user, params) + if(item.type == type) + if(user.temporarilyRemoveItemFromInventory(item) && merge_evidence(item, user)) + qdel(item) + return TRUE + return ..() + +/obj/item/sample/proc/copy_evidence(atom/supplied) + var/list/fibers = supplied.return_fibers() + if(length(fibers)) + evidence = fibers.Copy() + return TRUE + +/obj/item/sample/proc/merge_evidence(obj/item/sample/supplied, mob/user) + if(!length(supplied.evidence)) + return FALSE + + evidence |= supplied.evidence + + name = "[initial(name)] (combined)" + label = supplied.label + ", " + label + to_chat(user, span_notice("You transfer the contents of \the [supplied] into \the [src].")) + return TRUE + +/obj/item/sample/fibers + name = "fiber bag" + desc = "Used to hold fiber evidence for the detective." + icon_state = "fiberbag" + +/obj/item/sample/print + name = "fingerprint card" + desc = "Records a set of fingerprints." + icon = 'icons/obj/card.dmi' + icon_state = "fingerprint0" + inhand_icon_state = "paper" + +/obj/item/sample/print/Initialize(mapload, atom/sampled_object) + . = ..() + update_appearance(UPDATE_ICON_STATE) + +/obj/item/sample/print/update_icon_state() + if(length(evidence)) + icon_state = "fingerprint1" + return ..() + +/obj/item/sample/print/merge_evidence(obj/item/sample/supplied, mob/user) + if(!length(supplied.evidence)) + return FALSE + + for(var/print in supplied.evidence) + if(evidence[print]) + evidence[print] = stringmerge(evidence[print],supplied.evidence[print]) + else + evidence[print] = supplied.evidence[print] + + name = "[initial(name)] (combined)" + label = supplied.label + ", " + label + to_chat(user, span_notice("You overlay \the [src] and \the [supplied], combining the print records.")) + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/obj/item/sample/print/attack_self(mob/user, modifiers) + if(length(evidence)) + return ..() + + if(!ishuman(user)) + return ..() + + var/mob/living/carbon/human/H = user + if(!H.has_dna()) + to_chat(user, span_warning("You don't have any fingerprints.")) + return + + if((H.check_obscured_slots(TRUE) & ITEM_SLOT_GLOVES) || H.gloves) + to_chat(user, span_warning("Your hands are covered.")) + return + + to_chat(user, span_notice("You firmly press your fingertips onto the card.")) + var/fullprint = H.get_fingerprints(hand = H.get_active_hand()) + evidence[fullprint] = fullprint + name = "[initial(name)] ([H.get_face_name()])" + update_appearance(UPDATE_ICON_STATE) + +/obj/item/sample/print/attack(mob/living/M, mob/living/user, params) + if(!ishuman(M)) + return ..() + + if(length(evidence)) + return + + if(!(user.zone_selected in list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM))) + return + + var/mob/living/carbon/human/H = M + if((H.check_obscured_slots(TRUE) & ITEM_SLOT_GLOVES) || H.gloves) + to_chat(user, span_warning("Their hands are covered.")) + return + + if(user != H && H.combat_mode && (H.body_position == STANDING_UP)) + user.visible_message(span_warning("[user] tries to take prints from [H], but they move away.")) + return TRUE + + var/obj/item/bodypart/arm/hand + hand = H.get_bodypart(user.zone_selected, TRUE) + if(!hand) + to_chat(user, span_warning("They don't have a [parse_zone(user.zone_selected)].")) + return TRUE + + if(hand.is_stump) + to_chat(user, span_warning("You don't think that has any fingerprints.")) + return TRUE + var/hand_string = user.zone_selected == BODY_ZONE_L_ARM ? "left hand" : "right hand" + user.visible_message(span_notice("[user] takes a copy of \the [H]'s [hand_string] fingerprints.")) + + evidence[hand.fingerprints] = hand.fingerprints + name = "[initial(name)] ([H.get_face_name()]'s [hand_string])" + update_appearance(UPDATE_ICON_STATE) + return TRUE + +/obj/item/sample/print/copy_evidence(atom/supplied) + var/list/prints = supplied.return_fingerprints() + if(length(prints)) + evidence = prints.Copy() + return TRUE + +/obj/item/sample_kit + name = "fiber collection kit" + desc = "A magnifying glass and tweezers. Used to lift suit fibers." + icon = 'icons/obj/forensics.dmi' + icon_state = "m_glass" + w_class = WEIGHT_CLASS_SMALL + item_flags = parent_type::item_flags | NOBLUDGEON | NO_EVIDENCE_ON_ATTACK + + var/evidence_type = "fiber" + var/evidence_path = /obj/item/sample/fibers + +/obj/item/sample_kit/proc/can_take_sample(mob/user, atom/supplied) + return length(supplied.return_fibers()) + +/obj/item/sample_kit/proc/take_sample(mob/user, atom/supplied) + var/obj/item/sample/S = new evidence_path(null, supplied) + if(!user.put_in_hands(S)) + S.forceMove(drop_location()) + to_chat(user, span_notice("You transfer [length(S.evidence)] [length(S.evidence) > 1 ? "[evidence_type]s" : "[evidence_type]"] to \the [S].")) + +/obj/item/sample_kit/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!proximity_flag) + return + + if(!can_take_sample(user, target)) + to_chat(user, span_warning("There is no evidence on [target].")) + return TRUE + + take_sample(user, target) + return TRUE + +/obj/item/sample_kit/powder + name = "fingerprint powder" + desc = "A jar containing alumiinum powder and a specialized brush." + icon_state = "dust" + evidence_type = "fingerprint" + evidence_path = /obj/item/sample/print + +/obj/item/sample_kit/powder/can_take_sample(mob/user, atom/supplied) + return length(supplied.return_fingerprints()) diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm deleted file mode 100644 index 05f17eb02d74..000000000000 --- a/code/modules/detectivework/scanner.dm +++ /dev/null @@ -1,212 +0,0 @@ -//CONTAINS: Detective's Scanner - -// TODO: Split everything into easy to manage procs. - -/obj/item/detective_scanner - name = "forensic scanner" - desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." - icon = 'icons/obj/device.dmi' - icon_state = "forensicnew" - w_class = WEIGHT_CLASS_SMALL - inhand_icon_state = "electronic" - worn_icon_state = "electronic" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - flags_1 = CONDUCT_1 - item_flags = NOBLUDGEON - slot_flags = ITEM_SLOT_BELT - var/scanning = FALSE - var/list/log = list() - var/range = 8 - var/view_check = TRUE - var/forensicPrintCount = 0 - actions_types = list(/datum/action/item_action/display_detective_scan_results) - -/datum/action/item_action/display_detective_scan_results - name = "Display Forensic Scanner Results" - -/datum/action/item_action/display_detective_scan_results/Trigger(trigger_flags) - var/obj/item/detective_scanner/scanner = target - if(istype(scanner)) - scanner.displayDetectiveScanResults(usr) - -/obj/item/detective_scanner/attack_self(mob/user) - if(log.len && !scanning) - scanning = TRUE - to_chat(user, span_notice("Printing report, please wait...")) - addtimer(CALLBACK(src, PROC_REF(PrintReport)), 100) - else - to_chat(user, span_notice("The scanner has no logs or is in use.")) - -/obj/item/detective_scanner/proc/PrintReport() - // Create our paper - var/obj/item/paper/P = new(get_turf(src)) - - //This could be a global count like sec and med record printouts. See GLOB.data_core.medicalPrintCount AKA datacore.dm - var/frNum = ++forensicPrintCount - - P.name = text("FR-[] 'Forensic Record'", frNum) - P.info = text("
Forensic Record - (FR-[])


", frNum) - P.info += jointext(log, "
") - P.info += "
Notes:
" - P.update_appearance() - - if(ismob(loc)) - var/mob/M = loc - M.put_in_hands(P) - to_chat(M, span_notice("Report printed. Log cleared.")) - - // Clear the logs - log = list() - scanning = FALSE - -/obj/item/detective_scanner/afterattack(atom/A, mob/user, params) - . = ..() - scan(A, user) - return FALSE - -/obj/item/detective_scanner/proc/scan(atom/A, mob/user) - set waitfor = FALSE - if(!scanning) - // Can remotely scan objects and mobs. - if((get_dist(A, user) > range) || (!(A in view(range, user)) && view_check) || (loc != user)) - return - - scanning = TRUE - - user.visible_message(span_notice("\The [user] points the [src.name] at \the [A] and performs a forensic scan.")) - to_chat(user, span_notice("You scan \the [A]. The scanner is now analysing the results...")) - - - // GATHER INFORMATION - - //Make our lists - var/list/fingerprints = list() - var/list/blood = A.return_blood_DNA() - var/list/fibers = A.return_fibers() - var/list/reagents = list() - - var/target_name = A.name - - // Start gathering - - if(ishuman(A)) - - var/mob/living/carbon/human/H = A - if(!H.gloves) - fingerprints += md5(H.dna.unique_identity) - - 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 - - // We gathered everything. Create a fork and slowly display the results to the holder of the scanner. - - var/found_something = FALSE - add_log("[stationtime2text()][get_timestamp()] - [target_name]", 0) - - // Fingerprints - if(length(fingerprints)) - sleep(30) - add_log(span_info("Prints:")) - for(var/finger in fingerprints) - add_log("[finger]") - found_something = TRUE - - // Blood - if (length(blood)) - sleep(30) - add_log(span_info("Blood:")) - found_something = TRUE - for(var/B in blood) - add_log("Type: [blood[B]] DNA (UE): [B]") - - //Fibers - if(length(fibers)) - sleep(30) - add_log(span_info("Fibers:")) - for(var/fiber in fibers) - add_log("[fiber]") - found_something = TRUE - - //Reagents - if(length(reagents)) - sleep(30) - add_log(span_info("Reagents:")) - for(var/R in reagents) - add_log("Reagent: [R] Volume: [reagents[R]]") - found_something = TRUE - - // Get a new user - var/mob/holder = null - if(ismob(src.loc)) - holder = src.loc - - if(!found_something) - add_log("# No forensic traces found #", 0) // Don't display this to the holder user - if(holder) - to_chat(holder, span_warning("Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!")) - else - if(holder) - to_chat(holder, span_notice("You finish scanning \the [target_name].")) - - add_log("---------------------------------------------------------", 0) - scanning = FALSE - return - -/obj/item/detective_scanner/proc/add_log(msg, broadcast = 1) - if(scanning) - if(broadcast && ismob(loc)) - var/mob/M = loc - to_chat(M, msg) - log += "  [msg]" - else - CRASH("[src] [REF(src)] is adding a log when it was never put in scanning mode!") - -/proc/get_timestamp() - return time2text(world.time + 432000, ":ss") - -/obj/item/detective_scanner/AltClick(mob/living/user) - // Best way for checking if a player can use while not incapacitated, etc - if(!user.canUseTopic(src, be_close=TRUE)) - return - if(!LAZYLEN(log)) - to_chat(user, span_notice("Cannot clear logs, the scanner has no logs.")) - return - if(scanning) - to_chat(user, span_notice("Cannot clear logs, the scanner is in use.")) - return - to_chat(user, span_notice("The scanner logs are cleared.")) - log = list() - -/obj/item/detective_scanner/examine(mob/user) - . = ..() - if(LAZYLEN(log) && !scanning) - . += span_notice("Alt-click to clear scanner logs.") - -/obj/item/detective_scanner/proc/displayDetectiveScanResults(mob/living/user) - // No need for can-use checks since the action button should do proper checks - if(!LAZYLEN(log)) - to_chat(user, span_notice("Cannot display logs, the scanner has no logs.")) - return - if(scanning) - to_chat(user, span_notice("Cannot display logs, the scanner is in use.")) - return - to_chat(user, span_notice("Scanner Report")) - for(var/iterLog in log) - to_chat(user, iterLog) diff --git a/code/modules/detectivework/scene_cards.dm b/code/modules/detectivework/scene_cards.dm new file mode 100644 index 000000000000..75f56f5e0b4f --- /dev/null +++ b/code/modules/detectivework/scene_cards.dm @@ -0,0 +1,70 @@ +/obj/item/storage/scene_cards + name = "crime scene markers box" + desc = "A cardboard box for crime scene marker cards." + icon = 'icons/obj/forensics.dmi' + icon_state = "cards" + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/storage/scene_cards/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = /obj/item/scene_card::w_class + atom_storage.max_total_storage = /obj/item/scene_card::w_class * 7 + atom_storage.max_slots = 9 + +/obj/item/storage/scene_cards/PopulateContents() + new /obj/item/scene_card/n1(src) + new /obj/item/scene_card/n2(src) + new /obj/item/scene_card/n3(src) + new /obj/item/scene_card/n4(src) + new /obj/item/scene_card/n5(src) + new /obj/item/scene_card/n6(src) + new /obj/item/scene_card/n7(src) + +/obj/item/scene_card + name = "crime scene marker" + desc = "Plastic cards used to mark points of interests on the scene." + icon = 'icons/obj/forensics.dmi' + icon_state = "card1" + w_class = WEIGHT_CLASS_TINY + layer = ABOVE_MOB_LAYER + var/number = 1 + +/obj/item/scene_card/Initialize(mapload) + . = ..() + desc += " This one is marked with [number]." + update_appearance(UPDATE_ICON_STATE) + +/obj/item/scene_card/update_icon_state() + icon_state = "card[number]" + return ..() + +/obj/item/scene_card/attack_turf(atom/attacked_turf, mob/living/user, params) + . = ..() + if(!isopenturf(attacked_turf)) + return + + if(user.Adjacent(attacked_turf) && user.transferItemToLoc(src, attacked_turf)) + user.visible_message(span_notice("[user] places a [src.name] on [attacked_turf].")) + return TRUE + +/obj/item/scene_card/n1 + number = 1 + +/obj/item/scene_card/n2 + number = 2 + +/obj/item/scene_card/n3 + number = 3 + +/obj/item/scene_card/n4 + number = 4 + +/obj/item/scene_card/n5 + number = 5 + +/obj/item/scene_card/n6 + number = 6 + +/obj/item/scene_card/n7 + number = 7 + diff --git a/code/modules/detectivework/storage.dm b/code/modules/detectivework/storage.dm new file mode 100644 index 000000000000..711505d62c29 --- /dev/null +++ b/code/modules/detectivework/storage.dm @@ -0,0 +1,117 @@ +/obj/item/storage/box/swabs + name = "box of swab kits" + desc = "Sterilized equipment within. Do not contaminate." + icon = 'icons/obj/forensics.dmi' + icon_state = "dnakit" + illustration = null + +/obj/item/storage/box/swabs/Initialize(mapload) + . = ..() + atom_storage.set_holdable(/obj/item/swab) + atom_storage.max_slots = 14 + atom_storage.max_total_storage = /obj/item/swab::w_class * 14 + +/obj/item/storage/box/swabs/PopulateContents() + for(var/i in 1 to 14) + new /obj/item/swab(src) + +/obj/item/storage/box/evidence + name = "evidence bag box" + desc = "Sterilized equipment within. Do not contaminate." + icon = 'icons/obj/forensics.dmi' + icon_state = "dnakit" + illustration = null + +/obj/item/storage/box/evidence/Initialize(mapload) + . = ..() + atom_storage.set_holdable(/obj/item/storage/evidencebag) + atom_storage.max_slots = 7 + atom_storage.max_total_storage = /obj/item/storage/evidencebag::w_class * 7 + +/obj/item/storage/box/evidence/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/storage/evidencebag(src) + +/obj/item/storage/box/fingerprints + name = "box of fingerprint cards" + desc = "Sterilized equipment within. Do not contaminate." + icon = 'icons/obj/forensics.dmi' + icon_state = "dnakit" + illustration = null + +/obj/item/storage/box/fingerprints/Initialize(mapload) + . = ..() + atom_storage.set_holdable(/obj/item/sample/print) + atom_storage.max_slots = 14 + atom_storage.max_total_storage = /obj/item/sample/print::w_class * 14 + +/obj/item/storage/box/fingerprints/PopulateContents() + for(var/i in 1 to 14) + new /obj/item/sample/print(src) + +/obj/item/storage/evidence + name = "evidence case" + desc = "A heavy steel case for storing evidence." + icon = 'icons/obj/forensics.dmi' + icon_state = "case" + inhand_icon_state = "lockbox" + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/storage/evidence/Initialize(mapload) + . = ..() + atom_storage.max_slots = 10 + atom_storage.max_specific_storage = WEIGHT_CLASS_SMALL + atom_storage.max_total_storage = 100 + atom_storage.allow_quick_empty = TRUE + atom_storage.allow_quick_gather = TRUE + + atom_storage.set_holdable(list( + /obj/item/sample, + /obj/item/storage/evidencebag, + /obj/item/photo, + /obj/item/paper, + /obj/item/folder, + /obj/item/sample, + /obj/item/sample_kit, + )) + +//crime scene kit +/obj/item/storage/briefcase/crimekit + name = "crime scene kit" + desc = "A stainless steel-plated carrycase for all your forensic needs. Feels heavy." + icon = 'icons/obj/forensics.dmi' + icon_state = "case" + inhand_icon_state = "lockbox" + +/obj/item/storage/briefcase/crimekit/Initialize() + . = ..() + atom_storage.set_holdable(list( + /obj/item/storage/box/swabs, + /obj/item/storage/box/fingerprints, + /obj/item/storage/box/evidence, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/glass/beaker, + /obj/item/swab, + /obj/item/sample/print, + /obj/item/sample/fibers, + /obj/item/taperecorder, + /obj/item/tape, + /obj/item/clothing/gloves, + /obj/item/folder, + /obj/item/paper, + /obj/item/photo, + /obj/item/sample_kit, + /obj/item/camera, + /obj/item/storage/scene_cards, + /obj/item/modular_computer/tablet, + /obj/item/storage/evidencebag, + /obj/item/storage/scene_cards + )) + +/obj/item/storage/briefcase/crimekit/PopulateContents() + new /obj/item/storage/box/swabs(src) + new /obj/item/storage/box/fingerprints(src) + new /obj/item/sample_kit(src) + new /obj/item/sample_kit/powder(src) + new /obj/item/storage/scene_cards(src) + new /obj/item/camera(src) diff --git a/code/modules/detectivework/strings.dm b/code/modules/detectivework/strings.dm new file mode 100644 index 000000000000..9c94356a476d --- /dev/null +++ b/code/modules/detectivework/strings.dm @@ -0,0 +1,2 @@ +/proc/is_complete_print(print) + return stringcount(print) <= 6 diff --git a/code/modules/detectivework/swab.dm b/code/modules/detectivework/swab.dm new file mode 100644 index 000000000000..c6b74a063529 --- /dev/null +++ b/code/modules/detectivework/swab.dm @@ -0,0 +1,109 @@ +/obj/item/swab + name = "swab" + desc = "A sterilized cotton swab and vial used to take forensic samples." + icon = 'icons/obj/forensics.dmi' + icon_state = "swab" + + item_flags = parent_type::item_flags | NOBLUDGEON | NO_EVIDENCE_ON_ATTACK + + var/used = FALSE + + var/sample_name + var/datum/forensics/swabbed_forensics + +/obj/item/swab/Initialize(mapload) + . = ..() + swabbed_forensics = new() + +/obj/item/swab/Destroy(force) + QDEL_NULL(swabbed_forensics) + return ..() + +/obj/item/swab/update_name(updates) + name = "[initial(name)] ([sample_name])" + return ..() + +/obj/item/swab/update_icon_state() + . = ..() + if(used) + icon_state = "swab_used" + +/obj/item/swab/attack(mob/living/M, mob/living/user, params) + if(!ishuman(M)) + return ..() + + if(used) + return + + var/mob/living/carbon/human/target = M + + // Resisting + if(user != target && (target.combat_mode && target.body_position == STANDING_UP && !target.incapacitated())) + user.visible_message(span_warning("[user] tries to swab [target], but they move away.")) + return + + // Swab their mouth. + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) + if(!target.get_bodypart(BODY_ZONE_HEAD)) + to_chat(user, span_warning("They have no head.")) + return TRUE + if(!target.has_mouth()) + to_chat(user, span_warning("They have no mouth.")) + return TRUE + if(!target.has_dna()) + to_chat(user, span_warning("You feel like this wouldn't be useful.")) + return TRUE + + user.visible_message(span_notice("[user] swabs [target]'s mouth.")) + swabbed_forensics.add_trace_DNA(target.get_trace_dna()) + set_used(target.get_face_name()) + return TRUE + + var/zone = deprecise_zone(user.zone_selected) + var/obj/item/bodypart/BP = target.get_bodypart(zone) + if(!BP) + to_chat(user, span_warning("They don't have \a [zone]")) + return TRUE + + if(target.get_item_covering_bodypart(BP)) + return FALSE + + if(!is_valid_target(target)) + to_chat(user, span_warning("[target] has nothing to swab on their body.")) + return TRUE + + return TRUE + +/obj/item/swab/afterattack(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(used) + to_chat(user, span_warning("This swab has been used.")) + return + + if(ishuman(target)) + var/mob/living/carbon/H = target + target = H.get_item_covering_zone(deprecise_zone(user.zone_selected)) + if(!target) + return + if(!is_valid_target(target)) + to_chat(user, span_warning("There is no evidence on [H]'s [target].")) + return + + if(!is_valid_target(target)) + to_chat(user, span_warning("There is no evidence on [target].")) + return + + swabbed_forensics.add_trace_DNA(target.return_trace_DNA()) + swabbed_forensics.add_blood_DNA(target.return_blood_DNA()) + swabbed_forensics.add_gunshot_residue_list(target.return_gunshot_residue()) + set_used(target) + user.visible_message(span_notice("[user] swabs [target].")) + return TRUE + +/obj/item/swab/proc/set_used(sample_name) + used = TRUE + src.sample_name = "[sample_name]" + update_appearance() + +/obj/item/swab/proc/is_valid_target(atom/target) + return length(target.return_blood_DNA()) && length(target.return_trace_DNA()) && length(target.return_gunshot_residue()) diff --git a/code/modules/discord/discord_helpers.dm b/code/modules/discord/discord_helpers.dm index ae2358a4275a..c4cf1432e6fc 100644 --- a/code/modules/discord/discord_helpers.dm +++ b/code/modules/discord/discord_helpers.dm @@ -45,13 +45,9 @@ /** * Checks if the the given ckey has a valid discord link - * - * Arguments: - * * ckey The ckey as a string - * * Returns: TRUE if valid, FALSE if invalid or missing */ -/client/proc/discord_is_link_valid(ckey) +/client/proc/discord_is_link_valid() var/datum/discord_link_record/link = find_discord_link_by_ckey(ckey, timebound = FALSE) //We need their persistent link. if(link) return link.valid diff --git a/code/modules/discord/discord_sql_functions.dm b/code/modules/discord/discord_sql_functions.dm index 24d450260a22..f1eaf413ed97 100644 --- a/code/modules/discord/discord_sql_functions.dm +++ b/code/modules/discord/discord_sql_functions.dm @@ -52,7 +52,7 @@ qdel(query_insert_link_record) message_admins("WARNING! FAILED TO ASSIGN A OTP FOR USER [ckey_for], CALL A CODER!") stack_trace("WARNING! FAILED TO ASSIGN A OTP FOR USER [ckey_for], CALL A CODER!") - return "INVALID_PASSWORD_CALL_A_CODER" + return "FAILED TO GENERATE ONE-TIME-PASSWORD. PLEASE NOTIFY @francinum" //Cleanup qdel(query_insert_link_record) diff --git a/code/modules/economy/account.dm b/code/modules/economy/account.dm index a8d7c747afb6..f4eb8120d697 100644 --- a/code/modules/economy/account.dm +++ b/code/modules/economy/account.dm @@ -6,33 +6,34 @@ ///How many credits are currently held in the bank account. var/account_balance = 0 ///If there are things effecting how much income a player will get, it's reflected here 1 is standard for humans. - var/payday_modifier + var/payday_modifier = 1 ///The job datum of the account owner. var/datum/job/account_job ///List of the physical ID card objects that are associated with this bank_account var/list/bank_cards = list() - ///Should this ID be added to the global list of accounts? If true, will be subject to station-bound economy effects as well as income. - var/add_to_accounts = TRUE + ///The Unique ID number code associated with the owner's bank account, assigned at round start. var/account_id - ///Is there a CRAB 17 on the station draining funds? Prevents manual fund transfer. pink levels are rising - var/being_dumped = FALSE - ///Reference to the current civilian bounty that the account is working on. - var/datum/bounty/civilian_bounty - ///If player is currently picking a civilian bounty to do, these options are held here to prevent soft-resetting through the UI. - var/list/datum/bounty/bounties + /// A randomly generated 5-digit pin to access the bank account. This is stored as a string! + var/account_pin + ///Can this account be replaced? Set to true for default IDs not recognized by the station. var/replaceable = FALSE - ///Cooldown timer on replacing a civilain bounty. Bounties can only be replaced once every 5 minutes. - COOLDOWN_DECLARE(bounty_timer) + ///Should this ID be added to the global list of accounts? If true, will be subject to station-bound economy effects as well as income. + var/add_to_accounts = TRUE + + ///Is there a CRAB 17 on the station draining funds? Prevents manual fund transfer. pink levels are rising + var/being_dumped = FALSE -/datum/bank_account/New(newname, job, modifier = 1, player_account = TRUE) +/datum/bank_account/New(newname, job, player_account = TRUE) account_holder = newname account_job = job - payday_modifier = modifier add_to_accounts = player_account setup_unique_account_id() + for(var/i in 1 to 5) + account_pin = "[account_pin][rand(0, 9)]" + /datum/bank_account/Destroy() if(add_to_accounts) SSeconomy.bank_accounts_by_id -= "[account_id]" @@ -117,23 +118,22 @@ /** * This proc handles passive income gain for players, using their job's paycheck value. - * Funds are taken from the station master account to hand out to players. This can result in payment brown-outs if the station is poor. + * Funds are taken from the given bank account unless null. This can result in payment brown-outs if the company is poor. */ -/datum/bank_account/proc/payday(amt_of_paychecks = 1, free = FALSE) +/datum/bank_account/proc/payday(amt_of_paychecks = 1, datum/bank_account/drain_from = null) if(!account_job) return + var/money_to_transfer = round(account_job.paycheck * payday_modifier * amt_of_paychecks) - if(free) + + if(isnull(drain_from)) adjust_money(money_to_transfer) SSblackbox.record_feedback("amount", "free_income", money_to_transfer) - log_econ("[money_to_transfer] credits were given to [src.account_holder]'s account from income.") + log_econ("[money_to_transfer] credits were given to [src.account_holder]'s account from [drain_from.account_holder].") return TRUE else - var/datum/bank_account/D = SSeconomy.station_master - if(D && transfer_money(D, money_to_transfer)) - bank_card_talk("Payday processed, account now holds [account_balance] cr.") + if(transfer_money(drain_from, money_to_transfer)) return TRUE - bank_card_talk("ERROR: Payday aborted, unable to contact departmental account.") return FALSE /** @@ -175,45 +175,6 @@ M.playsound_local(get_turf(sound_atom), 'sound/machines/twobeep_high.ogg', 50, TRUE) to_chat(M, "[icon2html(icon_source, M)] [span_notice("[message]")]") -/** - * Returns a string with the civilian bounty's description on it. - */ -/datum/bank_account/proc/bounty_text() - if(!civilian_bounty) - return FALSE - return civilian_bounty.description - - -/** - * Returns the required item count, or required chemical units required to submit a bounty. - */ -/datum/bank_account/proc/bounty_num() - if(!civilian_bounty) - return FALSE - if(istype(civilian_bounty, /datum/bounty/item)) - var/datum/bounty/item/item = civilian_bounty - return "[item.shipped_count]/[item.required_count]" - if(istype(civilian_bounty, /datum/bounty/reagent)) - var/datum/bounty/reagent/chemical = civilian_bounty - return "[chemical.shipped_volume]/[chemical.required_volume] u" - if(istype(civilian_bounty, /datum/bounty/virus)) - return "At least 1u" - -/** - * Produces the value of the account's civilian bounty reward, if able. - */ -/datum/bank_account/proc/bounty_value() - if(!civilian_bounty) - return FALSE - return civilian_bounty.reward - -/** - * Performs house-cleaning on variables when a civilian bounty is replaced, or, when a bounty is claimed. - */ -/datum/bank_account/proc/reset_bounty() - civilian_bounty = null - COOLDOWN_RESET(src, bounty_timer) - /datum/bank_account/department account_holder = "Guild Credit Agency" var/department_id = "REPLACE_ME" diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm deleted file mode 100644 index 0b278e834438..000000000000 --- a/code/modules/economy/holopay.dm +++ /dev/null @@ -1,292 +0,0 @@ -/obj/structure/holopay - name = "holographic pay stand" - desc = "an unregistered pay stand" - icon = 'icons/obj/economy.dmi' - icon_state = "card_scanner" - alpha = 150 - anchored = TRUE - armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, FIRE = 20, ACID = 20) - max_integrity = 15 - layer = FLY_LAYER - /// ID linked to the holopay - var/obj/item/card/id/linked_card - /// Max range at which the hologram can be projected before it deletes - var/max_holo_range = 4 - /// The holopay shop icon displayed in the UI - var/shop_logo = "donate" - /// Replaces the "pay whatever" functionality with a set amount when non-zero. - var/force_fee = 0 - -/obj/structure/holopay/examine(mob/user) - . = ..() - if(force_fee) - . += span_boldnotice("This holopay forces a payment of [force_fee] credit\s per swipe instead of a variable amount.") - -/obj/structure/holopay/Initialize(mapload) - . = ..() - register_context() - -/obj/structure/holopay/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(istype(held_item, /obj/item/card/id)) - context[SCREENTIP_CONTEXT_LMB] = "Pay" - var/obj/item/card/id/held_id = held_item - if(held_id.my_store && held_id.my_store == src) - context[SCREENTIP_CONTEXT_RMB] = "Dissipate pay stand" - return CONTEXTUAL_SCREENTIP_SET - - else if(istype(held_item, /obj/item/holochip)) - context[SCREENTIP_CONTEXT_LMB] = "Pay" - return CONTEXTUAL_SCREENTIP_SET - -/obj/structure/holopay/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(.) - return - if(!user.combat_mode) - ui_interact(user) - return . - user.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - user.changeNext_move(CLICK_CD_MELEE) - take_damage(5, BRUTE, MELEE, 1) - -/obj/structure/holopay/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) - if(BURN) - playsound(loc, 'sound/weapons/egloves.ogg', 80, TRUE) - -/obj/structure/holopay/deconstruct() - dissipate() - return ..() - -/obj/structure/holopay/Destroy() - linked_card?.my_store = null - linked_card = null - return ..() - -/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, params) - var/mob/living/user = item_holder - if(!isliving(user)) - return ..() - /// Users can pay with an ID to skip the UI - if(istype(held_item, /obj/item/card/id)) - if(force_fee && tgui_alert(item_holder, "This holopay has a [force_fee] cr fee. Confirm?", "Holopay Fee", list("Pay", "Cancel")) != "Pay") - return TRUE - process_payment(user) - return TRUE - /// Users can also pay by holochip - if(istype(held_item, /obj/item/holochip)) - /// Account checks - var/obj/item/holochip/chip = held_item - if(!chip.credits) - balloon_alert(user, "holochip is empty") - to_chat(user, span_warning("There doesn't seem to be any credits here.")) - return FALSE - /// Charges force fee or uses pay what you want - var/cash_deposit = force_fee || tgui_input_number(user, "How much? (Max: [chip.credits])", "Patronage", max_value = chip.credits) - /// Exit sanity checks - if(!cash_deposit) - return TRUE - if(QDELETED(held_item) || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return FALSE - if(!chip.spend(cash_deposit, FALSE)) - balloon_alert(user, "insufficient credits") - to_chat(user, span_warning("You don't have enough credits to pay with this chip.")) - return FALSE - /// Success: Alert buyer - alert_buyer(user, cash_deposit) - return TRUE - /// Throws errors if they try to use space cash - if(istype(held_item, /obj/item/stack/spacecash)) - to_chat(user, "What is this, the 2000s? We only take card here.") - return TRUE - if(istype(held_item, /obj/item/coin)) - to_chat(user, "What is this, the 1800s? We only take card here.") - return TRUE - return ..() - -/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, params) - /// Can kill it by right-clicking with ID because it seems useful and intuitive, to me, at least - if(!istype(weapon, /obj/item/card/id)) - return ..() - var/obj/item/card/id/attacking_id = weapon - if(!attacking_id.my_store || attacking_id.my_store != src) - return ..() - dissipate() - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/structure/holopay/ui_interact(mob/user, datum/tgui/ui) - . = ..() - if(.) - return FALSE - var/mob/living/interactor = user - if(isliving(interactor) && interactor.combat_mode) - return FALSE - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "HoloPay") - ui.open() - -/obj/structure/holopay/ui_status(mob/user) - . = ..() - if(!in_range(user, src) && !isobserver(user)) - return UI_CLOSE - -/obj/structure/holopay/ui_static_data(mob/user) - . = list() - .["available_logos"] = linked_card.available_logos - .["description"] = desc - .["max_fee"] = linked_card.holopay_max_fee - .["owner"] = linked_card.registered_account?.account_holder || null - .["shop_logo"] = shop_logo - -/obj/structure/holopay/ui_data(mob/user) - . = list() - .["force_fee"] = force_fee - .["name"] = name - if(!isliving(user)) - return . - var/mob/living/card_holder = user - var/obj/item/card/id/id_card = card_holder.get_idcard(TRUE) - var/datum/bank_account/account = id_card?.registered_account || null - if(account) - .["user"] = list() - .["user"]["name"] = account.account_holder - .["user"]["balance"] = account.account_balance - -/obj/structure/holopay/ui_act(action, list/params, datum/tgui/ui) - . = ..() - if(.) - return FALSE - switch(action) - if("done") - ui.send_full_update() - return TRUE - if("fee") - linked_card.set_holopay_fee(params["amount"]) - force_fee = linked_card.holopay_fee - if("logo") - linked_card.set_holopay_logo(params["logo"]) - shop_logo = linked_card.holopay_logo - if("pay") - ui.close() - process_payment(usr) - return TRUE - if("rename") - linked_card.set_holopay_name(params["name"]) - name = linked_card.holopay_name - return FALSE - -/** - * Links the source card to the holopay. Begins checking if its in range. - * - * Parameters: - * * turf/target - The tile to project the holopay onto - * * obj/item/card/id/card - The card to link to the holopay - * Returns: - * * TRUE - the card was linked - */ -/obj/structure/holopay/proc/assign_card(turf/target, obj/item/card/id/card) - linked_card = card - desc = "Pays directly into [card.registered_account.account_holder]'s bank account." - force_fee = card.holopay_fee - shop_logo = card.holopay_logo - name = card.holopay_name - add_atom_colour("#77abff", FIXED_COLOUR_PRIORITY) - set_light(2) - visible_message(span_notice("A holographic pay stand appears.")) - /// Start checking if the source projection is in range - track(linked_card) - return TRUE - -/obj/structure/holopay/proc/track(atom/movable/thing) - RegisterSignal(thing, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - var/list/locations = get_nested_locs(thing, include_turf = FALSE) - for(var/atom/movable/location in locations) - RegisterSignal(location, COMSIG_MOVABLE_MOVED, PROC_REF(handle_move)) - -/obj/structure/holopay/proc/untrack(atom/movable/thing) - UnregisterSignal(thing, COMSIG_MOVABLE_MOVED) - var/list/locations = get_nested_locs(thing, include_turf = FALSE) - for(var/atom/movable/location in locations) - UnregisterSignal(location, COMSIG_MOVABLE_MOVED) - -/** - * A periodic check to see if the projecting card is nearby. - * Deletes the holopay if not. - */ -/obj/structure/holopay/proc/handle_move(atom/movable/source, atom/old_loc, dir, forced, list/old_locs) - if(ismovable(old_loc)) - untrack(old_loc) - if(!IN_GIVEN_RANGE(src, linked_card, max_holo_range)) - dissipate() - return - if(ismovable(source.loc)) - track(source.loc) - -/** - * Creates holopay vanishing effects. - * Deletes the holopay thereafter. - */ -/obj/structure/holopay/proc/dissipate() - playsound(loc, "sound/effects/empulse.ogg", 40, TRUE) - visible_message(span_notice("The pay stand vanishes.")) - qdel(src) - -/** - * Initiates a transaction between accounts. - * - * Parameters: - * * mob/living/user - The user who initiated the transaction. - * Returns: - * * TRUE - transaction was successful - */ -/obj/structure/holopay/proc/process_payment(mob/living/user) - /// Account checks - var/obj/item/card/id/id_card - id_card = user.get_idcard(TRUE) - if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) - balloon_alert(user, "invalid account") - to_chat(user, span_warning("You don't have a valid account.")) - return FALSE - var/datum/bank_account/payee = id_card.registered_account - if(payee == linked_card?.registered_account) - balloon_alert(user, "invalid transaction") - to_chat(user, span_warning("You can't pay yourself.")) - return FALSE - /// If the user has enough money, ask them the amount or charge the force fee - var/amount = force_fee || tgui_input_number(user, "How much? (Max: [payee.account_balance])", "Patronage", max_value = payee.account_balance) - /// Exit checks in case the user cancelled or entered an invalid amount - if(!amount || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return FALSE - if(!payee.adjust_money(-amount)) - balloon_alert(user, "insufficient credits") - to_chat(user, span_warning("You don't have the money to pay for this.")) - return FALSE - /// Success: Alert the buyer - alert_buyer(user, amount) - return TRUE - -/** - * Alerts the owner of the transaction. - * - * Parameters: - * * payee - The user who initiated the transaction. - * * amount - The amount of money that was paid. - * Returns: - * * TRUE - alert was successful. - */ -/obj/structure/holopay/proc/alert_buyer(payee, amount) - /// Pay the owner - linked_card.registered_account.adjust_money(amount) - /// Make alerts - linked_card.registered_account.bank_card_talk("[payee] has deposited [amount] cr at your holographic pay stand.") - say("Thank you for your patronage, [payee]!") - playsound(src, 'sound/effects/cashregister.ogg', 20, TRUE) - /// Log the event - log_econ("[amount] credits were transferred from [payee]'s transaction to [linked_card.registered_account.account_holder]") - SSblackbox.record_feedback("amount", "credits_transferred", amount) - return TRUE diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 79cef6d02464..f04425794dab 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -51,8 +51,6 @@ return FALSE if(EMERGENCY_ESCAPED_OR_ENDGAMED) 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) @@ -174,8 +172,10 @@ //Do not override this proc, instead use the appropiate procs. //This proc will handle the calls to the appropiate procs. -/datum/round_event/process() +/datum/round_event/proc/process_event() + set waitfor = FALSE SHOULD_NOT_OVERRIDE(TRUE) + if(!processing) return diff --git a/code/modules/events/abductor.dm b/code/modules/events/abductor.dm deleted file mode 100755 index 917f4752b52a..000000000000 --- a/code/modules/events/abductor.dm +++ /dev/null @@ -1,35 +0,0 @@ -/datum/round_event_control/abductor - name = "Abductors" - typepath = /datum/round_event/ghost_role/abductor - weight = 10 - max_occurrences = 1 - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/ghost_role/abductor - minimum_required = 2 - role_name = "abductor team" - fakeable = FALSE //Nothing to fake here - -/datum/round_event/ghost_role/abductor/spawn_role() - var/list/mob/dead/observer/candidates = get_candidates(ROLE_ABDUCTOR, ROLE_ABDUCTOR) - - if(candidates.len < 2) - return NOT_ENOUGH_PLAYERS - - var/mob/living/carbon/human/agent = make_body(pick_n_take(candidates)) - var/mob/living/carbon/human/scientist = make_body(pick_n_take(candidates)) - - var/datum/team/abductor_team/T = new - if(T.team_number > ABDUCTOR_MAX_TEAMS) - return MAP_ERROR - - log_game("[key_name(scientist)] has been selected as [T.name] abductor scientist.") - log_game("[key_name(agent)] has been selected as [T.name] abductor agent.") - - scientist.mind.add_antag_datum(/datum/antagonist/abductor/scientist, T) - agent.mind.add_antag_datum(/datum/antagonist/abductor/agent, T) - - spawned_mobs += list(agent, scientist) - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm deleted file mode 100644 index 96dd73ec8e53..000000000000 --- a/code/modules/events/alien_infestation.dm +++ /dev/null @@ -1,85 +0,0 @@ -/datum/round_event_control/alien_infestation - name = "Alien Infestation" - typepath = /datum/round_event/ghost_role/alien_infestation - weight = 5 - - min_players = 10 - - dynamic_should_hijack = TRUE - -/datum/round_event_control/alien_infestation/canSpawnEvent() - . = ..() - if(!.) - return . - - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - return FALSE - -/datum/round_event/ghost_role/alien_infestation - announceWhen = 400 - - minimum_required = 1 - role_name = "alien larva" - - // 50% chance of being incremented by one - var/spawncount = 1 - fakeable = TRUE - - -/datum/round_event/ghost_role/alien_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) - if(prob(50)) - spawncount++ - -/datum/round_event/ghost_role/alien_infestation/announce(fake) - var/living_aliens = FALSE - for(var/mob/living/carbon/alien/A in GLOB.player_list) - if(A.stat != DEAD) - living_aliens = TRUE - - if(living_aliens || fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", sound_type = ANNOUNCER_ALIENS) - - -/datum/round_event/ghost_role/alien_infestation/spawn_role() - var/list/vents = list() - for(var/obj/machinery/atmospherics/components/unary/vent_pump/temp_vent in GLOB.machines) - if(QDELETED(temp_vent)) - continue - if(is_station_level(temp_vent.loc.z) && !temp_vent.welded) - var/datum/pipeline/temp_vent_parent = temp_vent.parents[1] - if(!temp_vent_parent) - continue//no parent vent - //Stops Aliens getting stuck in small networks. - //See: Security, Virology - if(temp_vent_parent.other_atmos_machines.len > 20) - vents += temp_vent - - if(!vents.len) - message_admins("An event attempted to spawn an alien but no suitable vents were found. Shutting down.") - return MAP_ERROR - - var/list/candidates = get_candidates(ROLE_ALIEN, ROLE_ALIEN) - - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - while(spawncount > 0 && vents.len && candidates.len) - var/obj/vent = pick_n_take(vents) - var/client/candidate_client = pick_n_take(candidates) - var/datum/mind/candidate_mind = candidate_client.mob.mind - if(!candidate_mind) - continue - var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc) - candidate_mind.transfer_to(new_xeno) - candidate_mind.set_assigned_role(SSjob.GetJobType(/datum/job/xenomorph)) - candidate_mind.special_role = ROLE_ALIEN - new_xeno.move_into_vent(vent) - - spawncount-- - message_admins("[ADMIN_LOOKUPFLW(new_xeno)] has been made into an alien by an event.") - log_game("[key_name(new_xeno)] was spawned as an alien by an event.") - spawned_mobs += new_xeno - - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/animal_infestation.dm b/code/modules/events/animal_infestation.dm new file mode 100644 index 000000000000..2b6960709a48 --- /dev/null +++ b/code/modules/events/animal_infestation.dm @@ -0,0 +1,138 @@ +/datum/round_event_control/animal_infestation/vermin + name = "Animal Infestation: Vermin" + typepath = /datum/round_event/animal_infestation/vermin + weight = 10 + +/datum/round_event_control/animal_infestation/passive + name = "Animal Infestation: Passive" + typepath = /datum/round_event/animal_infestation/passive + weight = 5 + +/datum/round_event_control/animal_infestation/dangerous + name = "Animal Infestation: Dangerous" + typepath = /datum/round_event/animal_infestation/dangerous + weight = 4 + earliest_start = 20 MINUTES + min_players = 10 //let's not dump hostile mobs on a lowpop round. + +/datum/round_event/animal_infestation + var/mob_count + var/min_spawns = 5 + var/max_spawns = 10 + var/spawn_turfs = list() + var/area_name + var/mob/living/mob_to_spawn + var/descriptor + var/message = "" + + //list of possible mobs and adjectives to describe them + var/list/possible_mobs = list( + /mob/living/simple_animal/mouse = "squeaking", + ) + +/datum/round_event/animal_infestation/setup() + var/initial_turf = find_safe_turf() + if(!initial_turf) + CRASH("Infestation event could find no safe turfs") + area_name = get_area_name(initial_turf) + if(!length(possible_mobs)) + CRASH("Infestation event had an empty mob list") + mob_to_spawn = pick(possible_mobs) + descriptor = possible_mobs[mob_to_spawn] + mob_count = rand(min_spawns, max_spawns) + + FOR_DVIEW(var/turf/T, 7, initial_turf, INVISIBILITY_LIGHTING) + if(is_safe_turf(T)) + if(!(locate(/mob/living/carbon) in viewers(T))) //don't spawn mobs in front of players + spawn_turfs += T + FOR_DVIEW_END + + if(!length(spawn_turfs)) + //if there's no good turfs, just use the initial turf + spawn_turfs += initial_turf + + announce_to_ghosts(initial_turf) + +/datum/round_event/animal_infestation/announce(fake) + if(fake) + descriptor = possible_mobs[pick(possible_mobs)] //just pick a random adjective for false alarms + +/datum/round_event/animal_infestation/start() + var/spawns_left = mob_count + while(spawns_left > 0) + if(!length(spawn_turfs)) + spawns_left = 0 + return + new mob_to_spawn(pick_n_take(spawn_turfs)) + spawns_left -= 1 + +//event variants +/datum/round_event/animal_infestation/vermin + min_spawns = 5 + max_spawns = 15 + possible_mobs = list( + /mob/living/simple_animal/mouse = "squeaking", + /mob/living/basic/cockroach = "skittering", + /mob/living/simple_animal/hostile/lizard = "scaled", + ) + +/datum/round_event/animal_infestation/vermin/announce(fake) + . = ..() + priority_announce("\A [pick("infestation", "nest", "army", "invasion", "colony", "swarm")] of [descriptor] [pick("vermin", "pests", "critters", "things")] has been detected in [area_name]. Further infestation is likely if left unchecked.", + "Long-Range Sensor Relay", "Minor Lifesigns Detected") + +/datum/round_event/animal_infestation/passive + min_spawns = 3 + max_spawns = 8 + possible_mobs = list( + /mob/living/basic/cow = "milkable", + /mob/living/simple_animal/chicken = "clucking", + /mob/living/simple_animal/butterfly = "fluttering", + /mob/living/simple_animal/sloth = "lazy", + /mob/living/simple_animal/parrot = "colorful", + /mob/living/simple_animal/pet/fox = "shrieking", + /mob/living/simple_animal/pet/gondola = "silent", + /mob/living/simple_animal/rabbit = "hopping", + /mob/living/simple_animal/pet/penguin = "black-and-white", + /mob/living/simple_animal/pet/cat = "aloof", + /mob/living/simple_animal/pet/dog/corgi = "canine", + /mob/living/simple_animal/pet/dog/pug = "wheezing", + /mob/living/simple_animal/crab = "shelled", + /mob/living/simple_animal/deer = "hooved", + /mob/living/simple_animal/hostile/ant = "hungry", + /mob/living/simple_animal/hostile/mushroom = "fungal", + /mob/living/simple_animal/hostile/asteroid/goldgrub = "shiny", + /mob/living/simple_animal/hostile/retaliate/frog = "hopping", + ) + +/datum/round_event/animal_infestation/passive/announce(fake) + . = ..() + priority_announce("\A [pick("flock", "pack", "gathering", "group", "herd", "whole bunch")] of [descriptor] [pick("animals", "beasts", "creatures", "lifeforms", "things")] has been detected in [area_name]. Please ensure this does not impact productivity.", + "Long-Range Sensor Relay", "Lifesigns Detected") + +/datum/round_event/animal_infestation/dangerous + min_spawns = 2 + max_spawns = 5 //some of these mobs are a serious threat + possible_mobs = list( + /mob/living/simple_animal/hostile/retaliate/bat = "flapping", + /mob/living/simple_animal/hostile/retaliate/goat = "temperamental", + /mob/living/simple_animal/hostile/gorilla = "muscular", + /mob/living/simple_animal/hostile/alien/drone = "alien", + /mob/living/simple_animal/hostile/bee = "buzzing", + /mob/living/simple_animal/hostile/retaliate/goose = "honking", + /mob/living/simple_animal/hostile/retaliate/clown = "silly", + /mob/living/simple_animal/hostile/killertomato = "juicy", + /mob/living/simple_animal/hostile/mimic = "disguised", + /mob/living/simple_animal/hostile/netherworld/migo = "noisy", + /mob/living/simple_animal/hostile/netherworld/blankbody = "humanoid", + /mob/living/simple_animal/hostile/asteroid/fugu = "growing", + /mob/living/simple_animal/slime = "gelatinous", + /mob/living/simple_animal/hostile/hivebot = "robotic", + /mob/living/simple_animal/hostile/bear = "ursine", + /mob/living/simple_animal/hostile/retaliate/hog = "greasy", + ) + +/datum/round_event/animal_infestation/dangerous/announce(fake) + . = ..() + priority_announce("A dangerous [pick("horde", "pack", "group", "swarm", "force", "amount")] of [descriptor] [pick("animals", "monsters", "beasts", "creatures")] has been detected in [area_name]. Security personnel are encouraged to investigate and clear the area if necessary.", + "Long-Range Sensor Relay", "Hostile Lifesigns Detected") diff --git a/code/modules/events/anomaly.dm b/code/modules/events/anomaly.dm deleted file mode 100644 index af2a8cffd565..000000000000 --- a/code/modules/events/anomaly.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/round_event_control/anomaly - name = "Anomaly: Energetic Flux" - typepath = /datum/round_event/anomaly - - min_players = 1 - max_occurrences = 0 //This one probably shouldn't occur! It'd work, but it wouldn't be very fun. - weight = 15 - -/datum/round_event/anomaly - var/area/impact_area - var/obj/effect/anomaly/anomaly_path = /obj/effect/anomaly/flux - announceWhen = 1 - - -/datum/round_event/anomaly/proc/findEventArea() - var/static/list/allowed_areas - if(!allowed_areas) - //Places that shouldn't explode - var/static/list/safe_area_types = typecacheof(list( - /area/station/ai_monitored/turret_protected/ai, - /area/station/ai_monitored/turret_protected/ai_upload, - /area/station/engineering, - /area/station/solars, - /area/station/holodeck, - /area/shuttle, - /area/station/maintenance, - /area/station/science/test_area, - )) - - //Subtypes from the above that actually should explode. - var/static/list/unsafe_area_subtypes = typecacheof(list(/area/station/engineering/break_room)) - - allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes - var/list/possible_areas = typecache_filter_list(GLOB.sortedAreas,allowed_areas) - if (length(possible_areas)) - return pick(possible_areas) - -/datum/round_event/anomaly/setup() - impact_area = findEventArea() - if(!impact_area) - CRASH("No valid areas for anomaly found.") - var/list/turf_test = get_area_turfs(impact_area) - if(!turf_test.len) - 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].") - -/datum/round_event/anomaly/start() - var/turf/T = pick(get_area_turfs(impact_area)) - var/newAnomaly - if(T) - newAnomaly = new anomaly_path(T) - if (newAnomaly) - announce_to_ghosts(newAnomaly) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm deleted file mode 100644 index 911d4da0eea5..000000000000 --- a/code/modules/events/anomaly_bluespace.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_bluespace - name = "Anomaly: Bluespace" - typepath = /datum/round_event/anomaly/anomaly_bluespace - - max_occurrences = 1 - weight = 15 - -/datum/round_event/anomaly/anomaly_bluespace - startWhen = 3 - announceWhen = 10 - 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].") diff --git a/code/modules/events/anomaly_flux.dm b/code/modules/events/anomaly_flux.dm deleted file mode 100644 index 69f72560b3cb..000000000000 --- a/code/modules/events/anomaly_flux.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_flux - name = "Anomaly: Hyper-Energetic Flux" - typepath = /datum/round_event/anomaly/anomaly_flux - - min_players = 10 - max_occurrences = 5 - weight = 20 - -/datum/round_event/anomaly/anomaly_flux - startWhen = 10 - announceWhen = 3 - 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].") diff --git a/code/modules/events/anomaly_grav.dm b/code/modules/events/anomaly_grav.dm deleted file mode 100644 index 1bde6664f2c2..000000000000 --- a/code/modules/events/anomaly_grav.dm +++ /dev/null @@ -1,26 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_grav - name = "Anomaly: Gravitational" - typepath = /datum/round_event/anomaly/anomaly_grav - - max_occurrences = 5 - weight = 25 - -/datum/round_event/anomaly/anomaly_grav - startWhen = 3 - announceWhen = 20 - anomaly_path = /obj/effect/anomaly/grav - -/datum/round_event_control/anomaly/anomaly_grav/high - name = "Anomaly: Gravitational (High Intensity)" - typepath = /datum/round_event/anomaly/anomaly_grav/high - weight = 15 - max_occurrences = 1 - earliest_start = 20 MINUTES - -/datum/round_event/anomaly/anomaly_grav/high - startWhen = 3 - announceWhen = 20 - anomaly_path = /obj/effect/anomaly/grav/high - -/datum/round_event/anomaly/anomaly_grav/announce(fake) - priority_announce("Gravitational anomaly detected on long range scanners. Expected location: [impact_area.name].") diff --git a/code/modules/events/anomaly_pyro.dm b/code/modules/events/anomaly_pyro.dm deleted file mode 100644 index 898179abe1c3..000000000000 --- a/code/modules/events/anomaly_pyro.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_pyro - name = "Anomaly: Pyroclastic" - typepath = /datum/round_event/anomaly/anomaly_pyro - - max_occurrences = 5 - weight = 20 - -/datum/round_event/anomaly/anomaly_pyro - startWhen = 3 - announceWhen = 10 - 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].") diff --git a/code/modules/events/anomaly_vortex.dm b/code/modules/events/anomaly_vortex.dm deleted file mode 100644 index fdcd37256ed5..000000000000 --- a/code/modules/events/anomaly_vortex.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/round_event_control/anomaly/anomaly_vortex - name = "Anomaly: Vortex" - typepath = /datum/round_event/anomaly/anomaly_vortex - - min_players = 20 - max_occurrences = 2 - weight = 10 - -/datum/round_event/anomaly/anomaly_vortex - startWhen = 10 - announceWhen = 3 - 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]") diff --git a/code/modules/events/aurora_caelus.dm b/code/modules/events/aurora_caelus.dm index 0f74e61eb769..4cdc6f32a96d 100644 --- a/code/modules/events/aurora_caelus.dm +++ b/code/modules/events/aurora_caelus.dm @@ -2,8 +2,8 @@ name = "Aurora Caelus" typepath = /datum/round_event/aurora_caelus max_occurrences = 1 - weight = 1 - earliest_start = 5 MINUTES + weight = 3 + earliest_start = 20 MINUTES /datum/round_event_control/aurora_caelus/canSpawnEvent(players) if(!CONFIG_GET(flag/starlight)) diff --git a/code/modules/events/blob.dm b/code/modules/events/blob.dm deleted file mode 100644 index 0407353399cb..000000000000 --- a/code/modules/events/blob.dm +++ /dev/null @@ -1,36 +0,0 @@ -/datum/round_event_control/blob - name = "Blob" - typepath = /datum/round_event/ghost_role/blob - weight = 10 - max_occurrences = 1 - - min_players = 20 - - dynamic_should_hijack = TRUE - -/datum/round_event_control/blob/canSpawnEvent(players) - if(EMERGENCY_PAST_POINT_OF_NO_RETURN) // no blobs if the shuttle is past the point of no return - return FALSE - - return ..() - -/datum/round_event/ghost_role/blob - announceChance = 0 - role_name = "blob overmind" - 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.", sound_type = ANNOUNCER_OUTBREAK5) - -/datum/round_event/ghost_role/blob/spawn_role() - if(!GLOB.blobstart.len) - return MAP_ERROR - var/list/candidates = get_candidates(ROLE_BLOB, ROLE_BLOB) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - var/mob/dead/observer/new_blob = pick(candidates) - var/mob/camera/blob/BC = new_blob.become_overmind() - spawned_mobs += BC - message_admins("[ADMIN_LOOKUPFLW(BC)] has been made into a blob overmind by an event.") - log_game("[key_name(BC)] was spawned as a blob overmind by an event.") - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 09d61633600e..ca3d215f9fb2 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -1,7 +1,7 @@ /datum/round_event_control/brain_trauma name = "Spontaneous Brain Trauma" + weight = 1 //Fuck off typepath = /datum/round_event/brain_trauma - weight = 25 /datum/round_event/brain_trauma fakeable = FALSE diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm index 99c0acd08b29..9ac7df444977 100644 --- a/code/modules/events/brand_intelligence.dm +++ b/code/modules/events/brand_intelligence.dm @@ -32,10 +32,11 @@ priority_announce("Rampant brand intelligence has been detected aboard [station_name()]. Please stand by. The origin is believed to be \a [source].", sub_title = "Machine Learning Alert") /datum/round_event/brand_intelligence/start() - for(var/obj/machinery/vending/V in GLOB.machines) + for(var/obj/machinery/vending/V as anything in INSTANCES_OF(/obj/machinery/vending)) if(!is_station_level(V.z)) continue vendingMachines.Add(V) + if(!vendingMachines.len) kill() return @@ -54,7 +55,9 @@ originMachine.visible_message(span_notice("[originMachine] beeps and seems lifeless.")) kill() return - vendingMachines = remove_nulls_from_list(vendingMachines) + + list_clear_nulls(vendingMachines) + if(!vendingMachines.len) //if every machine is infected for(var/obj/machinery/vending/upriser in infectedMachines) if(!QDELETED(upriser)) diff --git a/code/modules/events/drifting_contractor.dm b/code/modules/events/drifting_contractor.dm deleted file mode 100644 index 8593dd413d36..000000000000 --- a/code/modules/events/drifting_contractor.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/round_event_control/contractor - name = "Drifting Contractor" - typepath = /datum/round_event/ghost_role/contractor - weight = 8 - max_occurrences = 1 - -/datum/round_event/ghost_role/contractor - minimum_required = 1 - role_name = "Drifting Contractor" - fakeable = FALSE - -/datum/round_event/ghost_role/contractor/spawn_role() - var/list/candidates = get_candidates(ROLE_DRIFTING_CONTRACTOR) - if(!length(candidates)) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/carp in GLOB.landmarks_list) - spawn_locs += carp.loc - if(!length(spawn_locs)) - return MAP_ERROR - - var/mob/living/carbon/human/operative = new(pick(spawn_locs)) - operative.randomize_human_appearance(~RANDOMIZE_SPECIES) - operative.dna.update_dna_identity() - var/datum/mind/mind = new /datum/mind(selected.key) - mind.set_assigned_role(SSjob.GetJobType(/datum/job/drifting_contractor)) - mind.special_role = ROLE_DRIFTING_CONTRACTOR - mind.active = TRUE - mind.transfer_to(operative) - mind.add_antag_datum(/datum/antagonist/contractor) - - message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into a [src] by an event.") - log_game("[key_name(operative)] was spawned as a [src] by an event.") - spawned_mobs += operative - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/dust.dm b/code/modules/events/dust.dm index 06c75c0c07f5..038701dc9496 100644 --- a/code/modules/events/dust.dm +++ b/code/modules/events/dust.dm @@ -3,7 +3,7 @@ typepath = /datum/round_event/space_dust weight = 200 max_occurrences = 1000 - earliest_start = 0 MINUTES + earliest_start = 5 MINUTES alert_observers = FALSE /datum/round_event/space_dust diff --git a/code/modules/events/electrical_storm.dm b/code/modules/events/electrical_storm.dm index 75046f7e77b8..a4eecf2c3df4 100644 --- a/code/modules/events/electrical_storm.dm +++ b/code/modules/events/electrical_storm.dm @@ -27,7 +27,6 @@ return for(var/centre in epicentreList) - for(var/a in GLOB.apcs_list) - var/obj/machinery/power/apc/A = a + for(var/obj/machinery/power/apc/A as anything in INSTANCES_OF(/obj/machinery/power/apc)) if(get_dist(centre, A) <= lightsoutRange) A.overload_lighting() diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index 92239283f6f5..8b97567c122d 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -7,7 +7,7 @@ /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() for(var/mob/living/carbon/human/victim in shuffle(GLOB.player_list)) - if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !(victim.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) + if(victim.stat != CONSCIOUS || !(victim.mind.assigned_role.job_flags & JOB_CREW_MEMBER)) continue fake_virus_victims += victim diff --git a/code/modules/events/fugitive_spawning.dm b/code/modules/events/fugitive_spawning.dm deleted file mode 100644 index 3f25a6a9c064..000000000000 --- a/code/modules/events/fugitive_spawning.dm +++ /dev/null @@ -1,116 +0,0 @@ -/datum/round_event_control/fugitives - name = "Spawn Fugitives" - typepath = /datum/round_event/ghost_role/fugitives - max_occurrences = 1 - min_players = 20 - earliest_start = 30 MINUTES //deadchat sink, lets not even consider it early on. - -/datum/round_event/ghost_role/fugitives - minimum_required = 1 - role_name = "fugitive" - fakeable = FALSE - -/datum/round_event/ghost_role/fugitives/spawn_role() - var/list/possible_spawns = list()//Some xeno spawns are in some spots that will instantly kill the refugees, like atmos - for(var/turf/X in GLOB.xeno_spawn) - if(istype(X.loc, /area/station/maintenance)) - possible_spawns += X - if(!possible_spawns.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - var/turf/landing_turf = pick(possible_spawns) - var/list/possible_backstories = list() - var/list/candidates = get_candidates(ROLE_FUGITIVE, ROLE_FUGITIVE) - if(candidates.len >= 1) //solo refugees - if(prob(30)) - possible_backstories.Add("waldo") //less common as it comes with magicks and is kind of immershun shattering - else //For accurate deadchat feedback - minimum_required = 4 - if(candidates.len >= 4)//group refugees - possible_backstories.Add("prisoner", "cultist", "synth") - if(!possible_backstories.len) - return NOT_ENOUGH_PLAYERS - - var/backstory = pick(possible_backstories) - var/member_size = 3 - var/leader - switch(backstory) - if("synth") - leader = pick_n_take(candidates) - if("waldo") - member_size = 0 //solo refugees have no leader so the member_size gets bumped to one a bit later - var/list/members = list() - var/list/spawned_mobs = list() - if(isnull(leader)) - member_size++ //if there is no leader role, then the would be leader is a normal member of the team. - - for(var/i in 1 to member_size) - members += pick_n_take(candidates) - - for(var/mob/dead/selected in members) - var/mob/living/carbon/human/S = gear_fugitive(selected, landing_turf, backstory) - spawned_mobs += S - if(!isnull(leader)) - gear_fugitive_leader(leader, landing_turf, backstory) - -//after spawning - playsound(src, 'sound/weapons/emitter.ogg', 50, TRUE) - new /obj/item/storage/toolbox/mechanical(landing_turf) //so they can actually escape maint - addtimer(CALLBACK(src, PROC_REF(spawn_hunters)), 10 MINUTES) - role_name = "fugitive hunter" - return SUCCESSFUL_SPAWN - -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive(mob/dead/selected, turf/landing_turf, backstory) //spawns normal fugitive - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - var/mob/living/carbon/human/S = new(landing_turf) - player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/fugitive)) - player_mind.special_role = ROLE_FUGITIVE - player_mind.add_antag_datum(/datum/antagonist/fugitive) - var/datum/antagonist/fugitive/fugitiveantag = player_mind.has_antag_datum(/datum/antagonist/fugitive) - fugitiveantag.greet(backstory) - - switch(backstory) - if("prisoner") - S.equipOutfit(/datum/outfit/prisoner) - if("cultist") - S.equipOutfit(/datum/outfit/yalp_cultist) - if("waldo") - S.equipOutfit(/datum/outfit/waldo) - if("synth") - S.equipOutfit(/datum/outfit/synthetic) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Fugitive by an event.") - log_game("[key_name(S)] was spawned as a Fugitive by an event.") - spawned_mobs += S - return S - -///special spawn for one member. it can be used for a special mob or simply to give one normal member special items. -/datum/round_event/ghost_role/fugitives/proc/gear_fugitive_leader(mob/dead/leader, turf/landing_turf, backstory) - var/datum/mind/player_mind = new /datum/mind(leader.key) - player_mind.active = TRUE - //if you want to add a fugitive with a special leader in the future, make this switch with the backstory - var/mob/living/carbon/human/S = gear_fugitive(leader, landing_turf, backstory) - var/obj/item/choice_beacon/augments/A = new(S) - S.put_in_hands(A) - new /obj/item/autosurgeon(landing_turf) - -//security team gets called in after 10 minutes of prep to find the refugees -/datum/round_event/ghost_role/fugitives/proc/spawn_hunters() - var/backstory = pick("space cop", "russian", "bounty hunter") - var/datum/map_template/shuttle/ship - if(backstory == "space cop") - ship = new /datum/map_template/shuttle/hunter/space_cop - else if (backstory == "russian") - ship = new /datum/map_template/shuttle/hunter/russian - else - ship = new /datum/map_template/shuttle/hunter/bounty - var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) - var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) - var/z = SSmapping.empty_space.z_value - var/turf/T = locate(x,y,z) - if(!T) - CRASH("Fugitive Hunters (Created from fugitive event) found no turf to load in") - if(!ship.load(T)) - CRASH("Loading [backstory] ship failed!") - priority_announce("Unidentified ship detected near the station.") diff --git a/code/modules/events/ghost_role.dm b/code/modules/events/ghost_role.dm deleted file mode 100644 index cd25832a3729..000000000000 --- a/code/modules/events/ghost_role.dm +++ /dev/null @@ -1,76 +0,0 @@ -#define MAX_SPAWN_ATTEMPT 3 - - -/datum/round_event/ghost_role - // We expect 0 or more /clients (or things with .key) in this list - var/list/priority_candidates = list() - var/minimum_required = 1 - var/role_name = "debug rat with cancer" // Q U A L I T Y M E M E S - var/list/spawned_mobs = list() - var/status - fakeable = FALSE - -/datum/round_event/ghost_role/start() - try_spawning() - -/datum/round_event/ghost_role/proc/try_spawning(sanity = 0, retry = 0) - // The event does not run until the spawning has been attempted - // to prevent us from getting gc'd halfway through - processing = FALSE - - status = spawn_role() - if((status == WAITING_FOR_SOMETHING)) - if(retry >= MAX_SPAWN_ATTEMPT) - message_admins("[role_name] event has exceeded maximum spawn attempts. Aborting and refunding.") - if(control && control.occurrences > 0) //Don't refund if it hasn't - control.occurrences-- - return - 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_REF(try_spawning), 0, ++retry), waittime) - return - - if(status == MAP_ERROR) - message_admins("[role_name] cannot be spawned due to a map error.") - else if(status == NOT_ENOUGH_PLAYERS) - message_admins("[role_name] cannot be spawned due to lack of players \ - signing up.") - deadchat_broadcast(" did not get enough candidates ([minimum_required]) to spawn.", "[role_name]", message_type=DEADCHAT_ANNOUNCEMENT) - else if(status == SUCCESSFUL_SPAWN) - message_admins("[role_name] spawned successfully.") - if(spawned_mobs.len) - for (var/mob/M in spawned_mobs) - announce_to_ghosts(M) - else - message_admins("No mobs found in the `spawned_mobs` list, this is \ - a bug.") - else - message_admins("An attempt to spawn [role_name] returned [status], \ - this is a bug.") - - processing = TRUE - -/datum/round_event/ghost_role/proc/spawn_role() - // Return true if role was successfully spawned, false if insufficent - // players could be found, and just runtime if anything else happens - return TRUE - -/datum/round_event/ghost_role/proc/get_candidates(jobban, be_special) - // Returns a list of candidates in priority order, with candidates from - // `priority_candidates` first, and ghost roles randomly shuffled and - // appended after - var/list/mob/dead/observer/regular_candidates - // don't get their hopes up - if(priority_candidates.len < minimum_required) - regular_candidates = poll_ghost_candidates("Do you wish to be considered for the special role of '[role_name]'?", jobban, be_special) - else - regular_candidates = list() - - shuffle_inplace(regular_candidates) - - var/list/candidates = priority_candidates + regular_candidates - - return candidates - -#undef MAX_SPAWN_ATTEMPT diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 8a29e7d3ac19..f689a170dbbd 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -1,14 +1,14 @@ /datum/round_event_control/heart_attack name = "Random Heart Attack" typepath = /datum/round_event/heart_attack - weight = 20 - max_occurrences = 2 - min_players = 40 // To avoid shafting lowpop + weight = 15 + max_occurrences = 3 + min_players = 15 // To avoid shafting lowpop /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() for(var/mob/living/carbon/human/victim in shuffle(GLOB.player_list)) - if(victim.stat == DEAD || HAS_TRAIT(victim, TRAIT_CRITICAL_CONDITION) || !victim.can_heartattack() || victim.has_status_effect(/datum/status_effect/exercised) || (/datum/disease/heart_failure in victim.diseases) || victim.undergoing_cardiac_arrest()) + if(victim.stat != CONSCIOUS || !victim.can_heartattack() || victim.has_status_effect(/datum/status_effect/exercised) || (/datum/disease/heart_failure in victim.diseases) || victim.undergoing_cardiac_arrest()) continue if(!(victim.mind.assigned_role.job_flags & JOB_CREW_MEMBER))//only crewmembers can get one, a bit unfair for some ghost roles and it wastes the event continue diff --git a/code/modules/events/holiday/vday.dm b/code/modules/events/holiday/vday.dm deleted file mode 100644 index 53cfe637d2cf..000000000000 --- a/code/modules/events/holiday/vday.dm +++ /dev/null @@ -1,107 +0,0 @@ -// Valentine's Day events // -// why are you playing spessmens on valentine's day you wizard // - -#define VALENTINE_FILE "valentines.json" - -// valentine / candy heart distribution // - -/datum/round_event_control/valentines - name = "Valentines!" - holidayID = VALENTINES - typepath = /datum/round_event/valentines - weight = -1 //forces it to be called, regardless of weight - max_occurrences = 1 - earliest_start = 0 MINUTES - -/datum/round_event/valentines/start() - ..() - for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - H.put_in_hands(new /obj/item/valentine) - var/obj/item/storage/backpack/b = locate() in H.contents - new /obj/item/food/candyheart(b) - new /obj/item/storage/fancy/heart_box(b) - - var/list/valentines = list() - for(var/mob/living/M in GLOB.player_list) - var/turf/current_turf = get_turf(M.mind.current) - if(!M.stat && M.mind && !current_turf.onCentCom()) - 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) - -/proc/forge_valentines_objective(mob/living/lover,mob/living/date) - lover.mind.special_role = "valentine" - var/datum/antagonist/valentine/V = new - V.date = date.mind - 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!") - -/obj/item/valentine - name = "valentine" - desc = "A Valentine's card! Wonder what it says..." - icon = 'icons/obj/playing_cards.dmi' - icon_state = "sc_Ace of Hearts_syndicate" // shut up // bye felicia - var/message = "A generic message of love or whatever." - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - -/obj/item/valentine/Initialize(mapload) - . = ..() - message = pick(strings(VALENTINE_FILE, "valentines")) - -/obj/item/valentine/attackby(obj/item/W, mob/user, params) - ..() - if(istype(W, /obj/item/pen) || istype(W, /obj/item/toy/crayon)) - if(!user.is_literate()) - to_chat(user, span_notice("You scribble illegibly on [src]!")) - return - var/recipient = tgui_input_text(user, "Who is receiving this valentine?", "To:", max_length = MAX_NAME_LEN) - var/sender = tgui_input_text(user, "Who is sending this valentine?", "From:", max_length = MAX_NAME_LEN) - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(recipient && sender) - name = "valentine - To: [recipient] From: [sender]" - -/obj/item/valentine/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - if( !(ishuman(user) || isobserver(user) || issilicon(user)) ) - user << browse("[name][stars(message)]", "window=[name]") - onclose(user, "[name]") - else - user << browse("[name][message]", "window=[name]") - onclose(user, "[name]") - else - . += span_notice("It is too far away.") - -/obj/item/valentine/attack_self(mob/user) - user.examinate(src) - -/obj/item/food/candyheart - name = "candy heart" - icon = 'icons/obj/holiday_misc.dmi' - icon_state = "candyheart" - desc = "A heart-shaped candy that reads: " - food_reagents = list(/datum/reagent/consumable/sugar = 2) - junkiness = 5 - -/obj/item/food/candyheart/Initialize(mapload) - . = ..() - desc = pick(strings(VALENTINE_FILE, "candyhearts")) - icon_state = pick("candyheart", "candyheart2", "candyheart3", "candyheart4") diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index b30518275785..c8c72b62e4c5 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -37,7 +37,7 @@ 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, FIRE = 0, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) dog_fashion = /datum/dog_fashion/head/festive /obj/effect/spawner/xmastree diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index ab5ef4bc982e..2927fb87332e 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -10,8 +10,11 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /datum/round_event_control/immovable_rod name = "Immovable Rod" typepath = /datum/round_event/immovable_rod + weight = 3 min_players = 15 - max_occurrences = 5 + max_occurrences = 1 + earliest_start = 1 HOUR + 20 MINUTES + var/atom/special_target var/force_looping = FALSE @@ -213,8 +216,8 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 // they ALSO collapse into a singulo. if(istype(clong, /obj/effect/immovablerod)) visible_message(span_danger("[src] collides with [clong]! This cannot end well.")) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, get_turf(src)) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(2, location = get_turf(src)) smoke.start() var/obj/singularity/bad_luck = new(get_turf(src)) bad_luck.energy = 800 @@ -224,7 +227,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 // If we Bump into a turf, turf go boom. if(isturf(clong)) - SSexplosions.highturf += clong + EX_ACT(clong, EXPLODE_DEVASTATE) return ..() if(isobj(clong)) @@ -239,7 +242,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 // If we Bump into anything else, anything goes boom. if(isatom(clong)) - SSexplosions.high_mov_atom += clong + EX_ACT(clong, EXPLODE_DEVASTATE) return ..() CRASH("[src] Bump()ed into non-atom thing [clong] ([clong.type])") @@ -289,7 +292,6 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 * * strongman - the suplexer of the rod. */ /obj/effect/immovablerod/proc/suplex_rod(mob/living/strongman) - strongman.client?.give_award(/datum/award/achievement/misc/feat_of_strength, strongman) strongman.visible_message( span_boldwarning("[strongman] suplexes [src] into the ground!"), span_warning("You suplex [src] into the ground!") diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 40cfd1002f1a..517dc6cb6e94 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -1,7 +1,7 @@ /datum/round_event_control/ion_storm name = "Ion Storm" typepath = /datum/round_event/ion_storm - weight = 15 + weight = 10 min_players = 2 /datum/round_event/ion_storm diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index e2fd93ce629d..d58e83ec2c95 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -1,7 +1,7 @@ /datum/round_event_control/meteor_wave/major_dust name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust - weight = 8 + weight = 20 /datum/round_event/meteor_wave/major_dust wave_name = "space dust" diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 2e40878d6332..1487fca5d03f 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -5,42 +5,88 @@ max_occurrences = 2 min_players = 1 + /datum/round_event/mass_hallucination fakeable = FALSE + /// 'normal' sound keys, index by them to get the friendly name. + var/list/sound_pool = list( + "airlock" = "Door", + "airlock_pry" = "Door Prying", + "console" = "Computer", + "explosion" = "Explosion", + "far_explosion" = "Distant Explosion", + "mech" = "Mech Walking", + "glass" = "Glass Breaking", + "alarm" = "Alarm", + "beepsky" = "Securiton", + "wall_decon" = "Wall Deconstruction", + "door_hack" = "Door Hacking", + "tesla" = "Tesla Ball" + ) + /// 'Weird' sound keys, index by them to get the friendly name. + var/list/rare_sound_pool = list( + "phone" = "Phone", + "hallelujah" = "Holy", + "highlander" = "Scottish Pride", + "hyperspace" = "Shuttle Undocking", + "game_over" = "Game Over", + "creepy" = "Disembodied Voice", + "tesla" = "Tesla Ball" //No, I don't know why this is duplicated. + ) + /// Fake 'Station Message' keys, index by them to get the friendly name. + var/list/stationmessage_pool = list( + "ratvar" = "Ratvar Summoning", + "shuttle_dock" = "Emergency Shuttle Dock Announcement", + "blob_alert" = "Level 5 Biohazard Announcement", + "malf_ai" = "Rampant AI Alert", + "meteors" = "Meteor Announcement", + "supermatter" = "Supermatter Delamination Sensation" + ) + /// Pool for generic hallucinations. Types can't key lists, so we need to invert the accesses. + var/list/generic_pool = list( + "Fake bolted airlocks" = /datum/hallucination/bolts, + "Imagined messages" = /datum/hallucination/chat, + "Fake minor message" = /datum/hallucination/message, + "Fake gas flood" = /datum/hallucination/fake_flood, + "Fake combat noises" = /datum/hallucination/battle, + "Imaginary spontaneous combustion" = /datum/hallucination/fire, + "Self Delusion" = /datum/hallucination/self_delusion, + "Fake Death" = /datum/hallucination/death, + "Delusions" = /datum/hallucination/delusion, + "Imaginary Bubblegum" = /datum/hallucination/oh_yeah + ) + + /datum/round_event/mass_hallucination/start() switch(rand(1,4)) if(1) //same sound for everyone - var/sound = pick("airlock","airlock_pry","console","explosion","far_explosion","mech","glass","alarm","beepsky","mech","wall_decon","door_hack","tesla") + var/picked_sound = pick(sound_pool) for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C.z in SSmapping.levels_by_trait(ZTRAIT_CENTCOM))//not for admin/ooc stuff continue - new /datum/hallucination/sounds(C, TRUE, sound) + new /datum/hallucination/sounds(C, TRUE, picked_sound) + deadchat_broadcast("[span_bold("Mass Hallucination")]: [sound_pool[picked_sound]] sounds.") if(2) - var/weirdsound = pick("phone","hallelujah","highlander","hyperspace","game_over","creepy","tesla") + var/weirdsound = pick(rare_sound_pool) for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C.z in SSmapping.levels_by_trait(ZTRAIT_CENTCOM))//not for admin/ooc stuff continue new /datum/hallucination/weird_sounds(C, TRUE, weirdsound) + deadchat_broadcast("[span_bold("Mass Hallucination")]: Weird [rare_sound_pool[weirdsound]] sounds.") if(3) - var/stationmessage = pick("ratvar","shuttle_dock","blob_alert","malf_ai","meteors","supermatter") + var/stationmessage = pick(stationmessage_pool) for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C.z in SSmapping.levels_by_trait(ZTRAIT_CENTCOM))//not for admin/ooc stuff continue new /datum/hallucination/stationmessage(C, TRUE, stationmessage) + deadchat_broadcast("[span_bold("Mass Hallucination")]: Fake [stationmessage_pool[stationmessage]].") if(4 to 6) - var/picked_hallucination = pick( /datum/hallucination/bolts, - /datum/hallucination/chat, - /datum/hallucination/message, - /datum/hallucination/bolts, - /datum/hallucination/fake_flood, - /datum/hallucination/battle, - /datum/hallucination/fire, - /datum/hallucination/self_delusion, - /datum/hallucination/death, - /datum/hallucination/delusion, - /datum/hallucination/oh_yeah) + var/picked_hallucination = pick(generic_pool) + //You can't index lists in the type part of new calls + var/type_holder = generic_pool[picked_hallucination] for(var/mob/living/carbon/C in GLOB.alive_mob_list) if(C.z in SSmapping.levels_by_trait(ZTRAIT_CENTCOM))//not for admin/ooc stuff continue - new picked_hallucination(C, TRUE) + new type_holder(C, TRUE) + deadchat_broadcast("[span_bold("Mass Hallucination")]: [picked_hallucination].") diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 8a2e6ec5714e..9aebf596059f 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -3,7 +3,7 @@ /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave - weight = 4 + weight = 6 min_players = 15 max_occurrences = 3 earliest_start = 25 MINUTES diff --git a/code/modules/events/mice_migration.dm b/code/modules/events/mice_migration.dm deleted file mode 100644 index e0574b8305f6..000000000000 --- a/code/modules/events/mice_migration.dm +++ /dev/null @@ -1,27 +0,0 @@ -/datum/round_event_control/mice_migration - name = "Mice Migration" - typepath = /datum/round_event/mice_migration - weight = 10 - -/datum/round_event/mice_migration - var/minimum_mice = 5 - var/maximum_mice = 15 - -/datum/round_event/mice_migration/announce(fake) - var/cause = pick("space-winter", "budget-cuts", "Ragnarok", - "space being cold", "\[REDACTED\]", "climate change", - "bad luck") - var/plural = pick("a number of", "a horde of", "a pack of", "a swarm of", - "a whoop of", "not more than [maximum_mice]") - var/name = pick("rodents", "mice", "squeaking things", - "wire eating mammals", "\[REDACTED\]", "energy draining parasites") - var/movement = pick("migrated", "swarmed", "stampeded", "descended") - var/location = pick("maintenance tunnels", "maintenance areas", - "\[REDACTED\]", "place with all those juicy wires") - - priority_announce("Due to [cause], [plural] [name] have [movement] \ - into the [location].", - sound_type = 'sound/effects/mousesqueek.ogg') - -/datum/round_event/mice_migration/start() - SSminor_mapping.trigger_migration(rand(minimum_mice, maximum_mice)) diff --git a/code/modules/events/nightmare.dm b/code/modules/events/nightmare.dm deleted file mode 100644 index 1541b1d2d322..000000000000 --- a/code/modules/events/nightmare.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/round_event_control/nightmare - name = "Spawn Nightmare" - typepath = /datum/round_event/ghost_role/nightmare - max_occurrences = 1 - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/ghost_role/nightmare - minimum_required = 1 - role_name = "nightmare" - fakeable = FALSE - -/datum/round_event/ghost_role/nightmare/spawn_role() - var/list/candidates = get_candidates(ROLE_ALIEN, ROLE_NIGHTMARE) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - - var/datum/mind/player_mind = new /datum/mind(selected.key) - player_mind.active = TRUE - - var/list/spawn_locs = list() - for(var/X in GLOB.xeno_spawn) - var/turf/T = X - var/light_amount = T.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += T - - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/mob/living/carbon/human/S = new ((pick(spawn_locs))) - player_mind.transfer_to(S) - player_mind.set_assigned_role(SSjob.GetJobType(/datum/job/nightmare)) - player_mind.special_role = ROLE_NIGHTMARE - player_mind.add_antag_datum(/datum/antagonist/nightmare) - S.set_species(/datum/species/shadow/nightmare) - playsound(S, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(S)] has been made into a Nightmare by an event.") - log_game("[key_name(S)] was spawned as a Nightmare by an event.") - spawned_mobs += S - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/operative.dm b/code/modules/events/operative.dm deleted file mode 100644 index 79540ffb8035..000000000000 --- a/code/modules/events/operative.dm +++ /dev/null @@ -1,38 +0,0 @@ -/datum/round_event_control/operative - name = "Lone Operative" - typepath = /datum/round_event/ghost_role/operative - weight = 0 //its weight is relative to how much stationary and neglected the nuke disk is. See nuclearbomb.dm. Shouldn't be dynamic hijackable. - max_occurrences = 1 - -/datum/round_event/ghost_role/operative - minimum_required = 1 - role_name = "lone operative" - fakeable = FALSE - -/datum/round_event/ghost_role/operative/spawn_role() - var/list/candidates = get_candidates(ROLE_OPERATIVE, ROLE_LONE_OPERATIVE) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick_n_take(candidates) - - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) - spawn_locs += L.loc - if(!spawn_locs.len) - return MAP_ERROR - - var/mob/living/carbon/human/operative = new(pick(spawn_locs)) - operative.randomize_human_appearance(~RANDOMIZE_SPECIES) - operative.dna.update_dna_identity() - var/datum/mind/Mind = new /datum/mind(selected.key) - Mind.set_assigned_role(SSjob.GetJobType(/datum/job/lone_operative)) - Mind.special_role = ROLE_LONE_OPERATIVE - Mind.active = TRUE - Mind.transfer_to(operative) - Mind.add_antag_datum(/datum/antagonist/nukeop/lone) - - message_admins("[ADMIN_LOOKUPFLW(operative)] has been made into lone operative by an event.") - log_game("[key_name(operative)] was spawned as a lone operative by an event.") - spawned_mobs += operative - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm deleted file mode 100644 index 24feeeaf7fa3..000000000000 --- a/code/modules/events/pirates.dm +++ /dev/null @@ -1,491 +0,0 @@ -/datum/round_event_control/pirates - name = "Space Pirates" - typepath = /datum/round_event/pirates - weight = 10 - max_occurrences = 1 - min_players = 20 - dynamic_should_hijack = TRUE - -#define PIRATES_ROGUES "Rogues" -#define PIRATES_SILVERSCALES "Silverscales" -#define PIRATES_DUTCHMAN "Flying Dutchman" - -/datum/round_event_control/pirates/preRunEvent() - if (!SSmapping.empty_space) - return EVENT_CANT_RUN - return ..() - -/datum/round_event/pirates/start() - send_pirate_threat() - -/proc/send_pirate_threat() - var/pirate_type = pick(PIRATES_ROGUES, PIRATES_SILVERSCALES, PIRATES_DUTCHMAN) - var/ship_template = null - var/ship_name = "Space Privateers Association" - var/payoff_min = 20000 - var/payoff = 0 - var/initial_send_time = world.time - var/response_max_time = 2 MINUTES - priority_announce("Incoming short range communication. Secure channel opened at all communication consoles.", "Short-Range Telecommunications Array", SSstation.announcer.get_rand_report_sound()) - var/datum/comm_message/threat = new - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] - if(D) - payoff = max(payoff_min, FLOOR(D.account_balance * 0.80, 1000)) - switch(pirate_type) - if(PIRATES_ROGUES) - ship_name = pick(strings(PIRATE_NAMES_FILE, "rogue_names")) - ship_template = /datum/map_template/shuttle/pirate/default - threat.title = "Sector protection offer" - threat.content = "Hey, pal, this is the [ship_name]. Can't help but notice you're rocking a wild and crazy shuttle there with NO INSURANCE! Crazy. What if something happened to it, huh?! We've done a quick evaluation on your rates in this sector and we're offering [payoff] to cover for your shuttle in case of any disaster." - threat.possible_answers = list("Purchase Insurance.","Reject Offer.") - if(PIRATES_SILVERSCALES) - ship_name = pick(strings(PIRATE_NAMES_FILE, "silverscale_names")) - ship_template = /datum/map_template/shuttle/pirate/silverscale - threat.title = "Tribute to high society" - threat.content = "This is the [ship_name]. The Silver Scales wish for some tribute from your plebeian lizards. [payoff] credits should do the trick." - threat.possible_answers = list("We'll pay.","Tribute? Really? Go away.") - if(PIRATES_DUTCHMAN) - ship_name = "Flying Dutchman" - ship_template = /datum/map_template/shuttle/pirate/dutchman - threat.title = "Business proposition" - threat.content = "Ahoy! This be the [ship_name]. Cough up [payoff] credits or you'll walk the plank." - threat.possible_answers = list("We'll pay.","We will not be extorted.") - threat.answer_callback = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(pirates_answered), threat, payoff, ship_name, initial_send_time, response_max_time, ship_template) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(spawn_pirates), threat, ship_template, FALSE), response_max_time) - SScommunications.send_message(threat,unique = TRUE) - -/proc/pirates_answered(datum/comm_message/threat, payoff, ship_name, initial_send_time, response_max_time, ship_template) - if(world.time > initial_send_time + response_max_time) - priority_announce("Too late to beg for mercy!", FLAVOR_SR_TCOMMS, ship_name, do_not_modify = TRUE) - return - if(threat && threat.answered == 1) - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] - if(D) - if(D.adjust_money(-payoff)) - priority_announce("Thanks for the credits, landlubbers.", FLAVOR_SR_TCOMMS, ship_name, do_not_modify = TRUE) - return - else - priority_announce("Trying to cheat us? You'll regret this!", FLAVOR_SR_TCOMMS, ship_name, do_not_modify = TRUE) - spawn_pirates(threat, ship_template, TRUE) - -/proc/spawn_pirates(datum/comm_message/threat, ship_template, skip_answer_check) - if(!skip_answer_check && threat?.answered == 1) - return - - var/list/candidates = poll_ghost_candidates("Do you wish to be considered for pirate crew?", ROLE_TRAITOR) - shuffle_inplace(candidates) - - var/datum/map_template/shuttle/pirate/ship = new ship_template - var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) - var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) - var/z = SSmapping.empty_space.z_value - var/turf/T = locate(x,y,z) - if(!T) - CRASH("Pirate event found no turf to load in") - - if(!ship.load(T)) - CRASH("Loading pirate ship failed!") - - for(var/turf/A in ship.get_affected_turfs(T)) - for(var/obj/effect/mob_spawn/ghost_role/human/pirate/spawner in A) - if(candidates.len > 0) - var/mob/our_candidate = candidates[1] - spawner.create(our_candidate) - candidates -= our_candidate - notify_ghosts("The pirate ship has an object of interest: [our_candidate]!", source=our_candidate, action=NOTIFY_ORBIT, header="Something's Interesting!") - else - notify_ghosts("The pirate ship has an object of interest: [spawner]!", source=spawner, action=NOTIFY_ORBIT, header="Something's Interesting!") - - priority_announce("Unidentified armed ship detected near the station.") - -//Shuttle equipment - -/obj/machinery/shuttle_scrambler - name = "Monetary Siphon" - desc = "This heap of machinery steals credits from unprotected systems and locks down cargo shuttles." - icon = 'icons/obj/machines/dominator.dmi' - icon_state = "dominator" - density = TRUE - var/active = FALSE - var/credits_stored = 0 - var/siphon_per_tick = 5 - -/obj/machinery/shuttle_scrambler/Initialize(mapload) - . = ..() - update_appearance() - -/obj/machinery/shuttle_scrambler/process() - if(active) - if(is_station_level(z)) - var/datum/bank_account/D = SSeconomy.department_accounts_by_id[ACCOUNT_CAR] - if(D) - var/siphoned = min(D.account_balance,siphon_per_tick) - D.adjust_money(-siphoned) - credits_stored += siphoned - else - return - else - STOP_PROCESSING(SSobj,src) - -/obj/machinery/shuttle_scrambler/proc/toggle_on(mob/user) - SSshuttle.registerTradeBlockade(src) - AddComponent(/datum/component/gps, "Nautical Signal") - active = TRUE - to_chat(user,span_notice("You toggle [src] [active ? "on":"off"].")) - to_chat(user,span_warning("The scrambling signal can be now tracked by GPS.")) - START_PROCESSING(SSobj,src) - -/obj/machinery/shuttle_scrambler/interact(mob/user) - if(active) - dump_loot(user) - return - var/scramble_response = tgui_alert(user, "Turning the scrambler on will make the shuttle trackable by GPS. Are you sure you want to do it?", "Scrambler", list("Yes", "Cancel")) - if(scramble_response != "Yes") - return - if(active || !user.canUseTopic(src, BE_CLOSE)) - return - toggle_on(user) - update_appearance() - send_notification() - -/obj/machinery/shuttle_scrambler/proc/dump_loot(mob/user) - if(credits_stored) // Prevents spamming empty holochips - new /obj/item/holochip(drop_location(), credits_stored) - to_chat(user,span_notice("You retrieve the siphoned credits!")) - credits_stored = 0 - else - to_chat(user,span_notice("There's nothing to withdraw.")) - -/obj/machinery/shuttle_scrambler/proc/send_notification() - priority_announce("Data theft signal detected, source registered on local gps units.") - -/obj/machinery/shuttle_scrambler/proc/toggle_off(mob/user) - SSshuttle.clearTradeBlockade(src) - active = FALSE - STOP_PROCESSING(SSobj,src) - -/obj/machinery/shuttle_scrambler/update_icon_state() - icon_state = active ? "dominator-Blue" : "dominator" - return ..() - -/obj/machinery/shuttle_scrambler/Destroy() - toggle_off() - return ..() - -/obj/machinery/computer/shuttle/pirate - name = "pirate shuttle console" - shuttleId = "pirateship" - icon_screen = "syndishuttle" - icon_keyboard = "syndie_key" - light_color = COLOR_SOFT_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" - rechargeTime = 3 MINUTES - -/obj/machinery/suit_storage_unit/pirate - suit_type = /obj/item/clothing/suit/space - helmet_type = /obj/item/clothing/head/helmet/space - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/internals/oxygen - -/obj/machinery/loot_locator - name = "Booty Locator" - desc = "This sophisticated machine scans the nearby space for items of value." - icon = 'icons/obj/machines/research.dmi' - icon_state = "tdoppler" - density = TRUE - var/cooldown = 300 - var/next_use = 0 - -/obj/machinery/loot_locator/interact(mob/user) - if(world.time <= next_use) - to_chat(user,span_warning("[src] is recharging.")) - return - next_use = world.time + cooldown - var/atom/movable/AM = find_random_loot() - if(!AM) - say("No valuables located. Try again later.") - else - say("Located: [AM.name] at [get_area_name(AM)]") - -/obj/machinery/loot_locator/proc/find_random_loot() - if(!GLOB.exports_list.len) - setupExports() - var/list/possible_loot = list() - for(var/datum/export/pirate/E in GLOB.exports_list) - possible_loot += E - var/datum/export/pirate/P - var/atom/movable/AM - while(!AM && possible_loot.len) - P = pick_n_take(possible_loot) - AM = P.find_loot() - return AM - -//Pad & Pad Terminal -/obj/machinery/piratepad - name = "cargo hold pad" - icon = 'icons/obj/telescience.dmi' - icon_state = "lpad-idle-off" - ///This is the icon_state that this telepad uses when it's not in use. - var/idle_state = "lpad-idle-off" - ///This is the icon_state that this telepad uses when it's warming up for goods teleportation. - var/warmup_state = "lpad-idle" - ///This is the icon_state to flick when the goods are being sent off by the telepad. - var/sending_state = "lpad-beam" - ///This is the cargo hold ID used by the piratepad_control. Match these two to link them together. - var/cargo_hold_id - -/obj/machinery/piratepad/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if (istype(I)) - to_chat(user, span_notice("You register [src] in [I]s buffer.")) - I.buffer = src - return TRUE - -/obj/machinery/piratepad/screwdriver_act_secondary(mob/living/user, obj/item/screwdriver/screw) - . = ..() - if(!.) - return default_deconstruction_screwdriver(user, "lpad-idle-open", "lpad-idle-off", screw) - -/obj/machinery/piratepad/crowbar_act_secondary(mob/living/user, obj/item/tool) - . = ..() - default_deconstruction_crowbar(tool) - return TRUE - -/obj/machinery/computer/piratepad_control - name = "cargo hold control terminal" - ///Message to display on the TGUI window. - var/status_report = "Ready for delivery." - ///Reference to the specific pad that the control computer is linked up to. - var/datum/weakref/pad_ref - ///How long does it take to warmup the pad to teleport? - var/warmup_time = 100 - ///Is the teleport pad/computer sending something right now? TRUE/FALSE - var/sending = FALSE - ///For the purposes of space pirates, how many points does the control pad have collected. - var/points = 0 - ///Reference to the export report totaling all sent objects and mobs. - var/datum/export_report/total_report - ///Callback holding the sending timer for sending the goods after a delay. - var/sending_timer - ///This is the cargo hold ID used by the piratepad machine. Match these two to link them together. - var/cargo_hold_id - ///Interface name for the ui_interact call for different subtypes. - var/interface_type = "CargoHoldTerminal" - -/obj/machinery/computer/piratepad_control/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/computer/piratepad_control/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if (istype(I) && istype(I.buffer,/obj/machinery/piratepad)) - to_chat(user, span_notice("You link [src] with [I.buffer] in [I] buffer.")) - pad_ref = WEAKREF(I.buffer) - return TRUE - -/obj/machinery/computer/piratepad_control/LateInitialize() - . = ..() - if(cargo_hold_id) - for(var/obj/machinery/piratepad/P in GLOB.machines) - if(P.cargo_hold_id == cargo_hold_id) - pad_ref = WEAKREF(P) - return - else - var/obj/machinery/piratepad/pad = locate() in range(4, src) - pad_ref = WEAKREF(pad) - -/obj/machinery/computer/piratepad_control/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, interface_type, name) - ui.open() - -/obj/machinery/computer/piratepad_control/ui_data(mob/user) - var/list/data = list() - data["points"] = points - data["pad"] = pad_ref?.resolve() ? TRUE : FALSE - data["sending"] = sending - data["status_report"] = status_report - return data - -/obj/machinery/computer/piratepad_control/ui_act(action, params) - . = ..() - if(.) - return - if(!pad_ref?.resolve()) - return - - switch(action) - if("recalc") - recalc() - . = TRUE - if("send") - start_sending() - . = TRUE - if("stop") - stop_sending() - . = TRUE - -/obj/machinery/computer/piratepad_control/proc/recalc() - if(sending) - return - - status_report = "Predicted value: " - var/value = 0 - var/datum/export_report/ex = new - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - export_item_and_contents(AM, apply_elastic = FALSE, dry_run = TRUE, external_report = ex) - - for(var/datum/export/E in ex.total_amount) - status_report += E.total_printout(ex,notes = FALSE) - status_report += " " - value += ex.total_value[E] - - if(!value) - status_report += "0" - -/obj/machinery/computer/piratepad_control/proc/send() - if(!sending) - return - - var/datum/export_report/ex = new - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - - for(var/atom/movable/AM in get_turf(pad)) - if(AM == pad) - continue - export_item_and_contents(AM, EXPORT_PIRATE | EXPORT_CARGO | EXPORT_CONTRABAND | EXPORT_EMAG, apply_elastic = FALSE, delete_unsold = FALSE, external_report = ex) - - status_report = "Sold: " - var/value = 0 - for(var/datum/export/E in ex.total_amount) - var/export_text = E.total_printout(ex,notes = FALSE) //Don't want nanotrasen messages, makes no sense here. - if(!export_text) - continue - - status_report += export_text - status_report += " " - value += ex.total_value[E] - - if(!total_report) - total_report = ex - else - total_report.exported_atoms += ex.exported_atoms - for(var/datum/export/E in ex.total_amount) - total_report.total_amount[E] += ex.total_amount[E] - total_report.total_value[E] += ex.total_value[E] - playsound(loc, 'sound/machines/wewewew.ogg', 70, TRUE) - - points += value - - if(!value) - status_report += "Nothing" - - pad.visible_message(span_notice("[pad] activates!")) - flick(pad.sending_state,pad) - pad.icon_state = pad.idle_state - sending = FALSE - -/obj/machinery/computer/piratepad_control/proc/start_sending() - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - if(!pad) - status_report = "No pad detected. Build or link a pad." - pad.audible_message(span_notice("[pad] beeps.")) - return - if(pad?.panel_open) - status_report = "Please screwdrive pad closed to send. " - pad.audible_message(span_notice("[pad] beeps.")) - return - if(sending) - return - sending = TRUE - status_report = "Sending... " - pad.visible_message(span_notice("[pad] starts charging up.")) - pad.icon_state = pad.warmup_state - sending_timer = addtimer(CALLBACK(src,PROC_REF(send)),warmup_time, TIMER_STOPPABLE) - -/obj/machinery/computer/piratepad_control/proc/stop_sending(custom_report) - if(!sending) - return - sending = FALSE - status_report = "Ready for delivery." - if(custom_report) - status_report = custom_report - var/obj/machinery/piratepad/pad = pad_ref?.resolve() - pad.icon_state = pad.idle_state - deltimer(sending_timer) - -//Attempts to find the thing on station -/datum/export/pirate/proc/find_loot() - return - -/datum/export/pirate/ransom - cost = 3000 - unit_name = "hostage" - export_types = list(/mob/living/carbon/human) - -/datum/export/pirate/ransom/find_loot() - var/list/head_minds = SSjob.get_living_heads() - var/list/head_mobs = list() - for(var/datum/mind/M in head_minds) - head_mobs += M.current - if(head_mobs.len) - return pick(head_mobs) - -/datum/export/pirate/ransom/get_cost(atom/movable/AM) - var/mob/living/carbon/human/H = AM - if(H.stat != CONSCIOUS || !H.mind) //mint condition only - return 0 - else if("pirate" in H.faction) //can't ransom your fellow pirates to CentCom! - return 0 - else if(H.mind.assigned_role.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) - return 3000 - else - return 1000 - -/datum/export/pirate/parrot - cost = 2000 - unit_name = "alive parrot" - export_types = list(/mob/living/simple_animal/parrot) - -/datum/export/pirate/parrot/find_loot() - for(var/mob/living/simple_animal/parrot/P in GLOB.alive_mob_list) - var/turf/T = get_turf(P) - if(T && is_station_level(T.z)) - return P - -/datum/export/pirate/cash - cost = 1 - unit_name = "bills" - export_types = list(/obj/item/stack/spacecash) - -/datum/export/pirate/cash/get_amount(obj/O) - var/obj/item/stack/spacecash/C = O - return ..() * C.amount * C.value - -/datum/export/pirate/holochip - cost = 1 - unit_name = "holochip" - export_types = list(/obj/item/holochip) - -/datum/export/pirate/holochip/get_cost(atom/movable/AM) - var/obj/item/holochip/H = AM - return H.credits diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index cb6a5e7e9631..53b5d9dfd92f 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -1,7 +1,7 @@ /datum/round_event_control/portal_storm_syndicate name = "Portal Storm: Syndicate Shocktroops" typepath = /datum/round_event/portal_storm/syndicate_shocktroop - weight = 2 + weight = 0 min_players = 15 earliest_start = 30 MINUTES @@ -56,7 +56,6 @@ next_boss_spawn = startWhen + CEILING(2 * number_of_hostiles / number_of_bosses, 1) /datum/round_event/portal_storm/announce(fake) - 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.", FLAVOR_ANANKE_STATION) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 7f657ada51e1..bab3e3185f69 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -1,7 +1,7 @@ /datum/round_event_control/grey_tide name = "Grey Tide" typepath = /datum/round_event/grey_tide - max_occurrences = 2 + max_occurrences = 1 min_players = 5 /datum/round_event/grey_tide @@ -23,7 +23,7 @@ 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) + for(var/area/A in GLOB.areas) if(istype(A, picked_area)) areasToOpen += A diff --git a/code/modules/events/processor_overload.dm b/code/modules/events/processor_overload.dm index d05badb86560..d7a3e3a9d88d 100644 --- a/code/modules/events/processor_overload.dm +++ b/code/modules/events/processor_overload.dm @@ -1,7 +1,7 @@ /datum/round_event_control/processor_overload name = "Processor Overload" typepath = /datum/round_event/processor_overload - weight = 15 + weight = 7 min_players = 20 /datum/round_event/processor_overload @@ -34,6 +34,6 @@ explosion(P, light_impact_range = 2, explosion_cause = src) // Only a level 1 explosion actually damages the machine // at all - SSexplosions.high_mov_atom += P + EX_ACT(P, EXPLODE_DEVASTATE) else P.emp_act(EMP_HEAVY) diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index a23333b9402e..7da0126bbb6b 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -1,7 +1,7 @@ /datum/round_event_control/radiation_storm name = "Radiation Storm" typepath = /datum/round_event/radiation_storm - max_occurrences = 1 + max_occurrences = 2 /datum/round_event/radiation_storm diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm deleted file mode 100644 index eb0021028210..000000000000 --- a/code/modules/events/sentience.dm +++ /dev/null @@ -1,112 +0,0 @@ -GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list( - /mob/living/simple_animal/pet, - /mob/living/simple_animal/parrot, - /mob/living/simple_animal/hostile/lizard, - /mob/living/simple_animal/sloth, - /mob/living/simple_animal/mouse/brown/tom, - /mob/living/simple_animal/hostile/retaliate/goat, - /mob/living/simple_animal/chicken, - /mob/living/basic/cow, - /mob/living/simple_animal/hostile/retaliate/bat, - /mob/living/simple_animal/hostile/carp/cayenne, - /mob/living/simple_animal/butterfly, - /mob/living/simple_animal/hostile/retaliate/snake, - /mob/living/simple_animal/hostile/retaliate/goose/vomit, - /mob/living/simple_animal/bot/mulebot, - /mob/living/simple_animal/bot/secbot/beepsky, -))) - -/datum/round_event_control/sentience - name = "Random Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience - weight = 10 - - -/datum/round_event/ghost_role/sentience - minimum_required = 1 - role_name = "random animal" - var/animals = 1 - var/one = "one" - fakeable = TRUE - -/datum/round_event/ghost_role/sentience/announce(fake) - var/sentience_report = "" - - var/data = pick("scans from our long-range sensors", "our sophisticated probabilistic models", "our omnipotence", "the communications traffic on your station", "energy emissions we detected", "\[REDACTED\]") - var/pets = pick("animals/bots", "bots/animals", "pets", "simple animals", "lesser lifeforms", "\[REDACTED\]") - var/strength = pick("human", "moderate", "unathi", "security", "command", "clown", "low", "very low", "\[REDACTED\]") - - 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()]", sound_type = ANNOUNCER_CENTCOM) - -/datum/round_event/ghost_role/sentience/spawn_role() - var/list/mob/dead/observer/candidates - candidates = get_candidates(ROLE_ALIEN, ROLE_ALIEN) - - // find our chosen mob to breathe life into - // Mobs have to be simple animals, mindless, on station, and NOT holograms. - // prioritize starter animals that people will recognise - - - var/list/potential = list() - - var/list/hi_pri = list() - var/list/low_pri = list() - - 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 - if(is_type_in_typecache(L, GLOB.high_priority_sentience)) - hi_pri += L - else - low_pri += L - - shuffle_inplace(hi_pri) - shuffle_inplace(low_pri) - - potential = hi_pri + low_pri - - if(!potential.len) - return WAITING_FOR_SOMETHING - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/spawned_animals = 0 - while(spawned_animals < animals && candidates.len && potential.len) - var/mob/living/simple_animal/SA = popleft(potential) - var/mob/dead/observer/SG = pick_n_take(candidates) - - spawned_animals++ - - SA.key = SG.key - - SA.grant_all_languages(TRUE, FALSE, FALSE) - - SA.sentience_act() - - SA.maxHealth = max(SA.maxHealth, 200) - SA.health = SA.maxHealth - SA.del_on_death = FALSE - - spawned_mobs += SA - - to_chat(SA, span_userdanger("Hello world!")) - to_chat(SA, "Due to freak radiation and/or chemicals \ - and/or lucky chance, you have gained human level intelligence \ - and the ability to speak and understand human language!") - - return SUCCESSFUL_SPAWN - -/datum/round_event_control/sentience/all - name = "Station-wide Human-level Intelligence" - typepath = /datum/round_event/ghost_role/sentience/all - weight = 0 - -/datum/round_event/ghost_role/sentience/all - one = "all" - animals = INFINITY // as many as there are ghosts and animals - // cockroach pride, station wide diff --git a/code/modules/events/shuttle_catastrophe.dm b/code/modules/events/shuttle_catastrophe.dm index cc14d6c25054..78a47f89e303 100644 --- a/code/modules/events/shuttle_catastrophe.dm +++ b/code/modules/events/shuttle_catastrophe.dm @@ -1,7 +1,6 @@ /datum/round_event_control/shuttle_catastrophe name = "Shuttle Catastrophe" typepath = /datum/round_event/shuttle_catastrophe - weight = 10 max_occurrences = 1 /datum/round_event_control/shuttle_catastrophe/canSpawnEvent(players) diff --git a/code/modules/events/shuttle_loan.dm b/code/modules/events/shuttle_loan.dm index 87d5f57229c3..02eee4546b50 100644 --- a/code/modules/events/shuttle_loan.dm +++ b/code/modules/events/shuttle_loan.dm @@ -1,6 +1,5 @@ #define HIJACK_SYNDIE 1 #define RUSKY_PARTY 2 -#define SPIDER_GIFT 3 #define DEPARTMENT_RESUPPLY 4 #define ANTIDOTE_NEEDED 5 #define PIZZA_DELIVERY 6 @@ -24,7 +23,7 @@ var/loan_type //for logging /datum/round_event/shuttle_loan/setup() - dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, SPIDER_GIFT, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY, ITS_HIP_TO, MY_GOD_JC) + dispatch_type = pick(HIJACK_SYNDIE, RUSKY_PARTY, DEPARTMENT_RESUPPLY, ANTIDOTE_NEEDED, PIZZA_DELIVERY, ITS_HIP_TO, MY_GOD_JC) /datum/round_event/shuttle_loan/announce(fake) SSshuttle.shuttle_loan = src @@ -33,8 +32,6 @@ 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.",PA_TITLE_COMMAND_REPORT, sound_type = ANNOUNCER_CENTCOM) 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?",PA_TITLE_COMMAND_REPORT, sound_type = ANNOUNCER_CENTCOM) - 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?",PA_TITLE_COMMAND_REPORT, sound_type = ANNOUNCER_CENTCOM) if(DEPARTMENT_RESUPPLY) priority_announce("Cargo: Seems we've ordered doubles of our department resupply packages this month. Can we send them to you?",PA_TITLE_COMMAND_REPORT, sound_type = ANNOUNCER_CENTCOM) thanks_msg = "The cargo shuttle should return in five minutes." @@ -73,9 +70,6 @@ if(RUSKY_PARTY) SSshuttle.centcom_message += "Partying Russians incoming." loan_type = "Russian party squad" - if(SPIDER_GIFT) - SSshuttle.centcom_message += "Spider Clan gift incoming." - loan_type = "Shuttle full of spiders" if(DEPARTMENT_RESUPPLY) SSshuttle.centcom_message += "Department resupply incoming." loan_type = "Resupply packages" @@ -142,26 +136,6 @@ if(prob(50)) shuttle_spawns.Add(/mob/living/simple_animal/hostile/bear/russian) - if(SPIDER_GIFT) - var/datum/supply_pack/pack = SSshuttle.supply_packs[/datum/supply_pack/emergency/specialops] - pack.generate(pick_n_take(empty_shuttle_turfs)) - - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/nurse) - if(prob(50)) - shuttle_spawns.Add(/mob/living/simple_animal/hostile/giant_spider/hunter) - - var/turf/T = pick_n_take(empty_shuttle_turfs) - - new /obj/effect/decal/remains/human(T) - new /obj/item/clothing/shoes/space_ninja(T) - new /obj/item/clothing/mask/balaclava(T) - - for(var/i in 1 to 5) - T = pick_n_take(empty_shuttle_turfs) - new /obj/structure/spider/stickyweb(T) - if(ANTIDOTE_NEEDED) var/obj/effect/mob_spawn/corpse/human/assistant/infected_assistant = pick(/obj/effect/mob_spawn/corpse/human/assistant/beesease_infection, /obj/effect/mob_spawn/corpse/human/assistant/brainrot_infection, /obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection) var/turf/T @@ -198,7 +172,7 @@ var/decal = pick(/obj/effect/decal/cleanable/food/flour, /obj/effect/decal/cleanable/robot_debris, /obj/effect/decal/cleanable/oil) new decal(pick_n_take(empty_shuttle_turfs)) if(PIZZA_DELIVERY) - var/naughtypizza = list(/obj/item/pizzabox/bomb,/obj/item/pizzabox/margherita/robo) //oh look another blaklist, for pizza nonetheless! + var/naughtypizza = list(/obj/item/pizzabox/bomb) //oh look another blaklist, for pizza nonetheless! var/nicepizza = list(/obj/item/pizzabox/margherita, /obj/item/pizzabox/meat, /obj/item/pizzabox/vegetable, /obj/item/pizzabox/mushroom) for(var/i in 1 to 6) shuttle_spawns.Add(pick(prob(5) ? naughtypizza : nicepizza)) @@ -274,7 +248,6 @@ #undef HIJACK_SYNDIE #undef RUSKY_PARTY -#undef SPIDER_GIFT #undef DEPARTMENT_RESUPPLY #undef ANTIDOTE_NEEDED #undef PIZZA_DELIVERY diff --git a/code/modules/events/solar_flare.dm b/code/modules/events/solar_flare.dm new file mode 100644 index 000000000000..35da94f51001 --- /dev/null +++ b/code/modules/events/solar_flare.dm @@ -0,0 +1,55 @@ +/datum/round_event_control/solar_flare + name = "Solar Flare" + typepath = /datum/round_event/solar_flare + max_occurrences = 2 + weight = 8 + min_players = 5 + earliest_start = 15 MINUTES + +/datum/round_event/solar_flare + announceWhen = 1 + startWhen = 30 + var/area/impact_area + var/possible_turfs = list() + var/number_of_fires = 5 + +/datum/round_event/solar_flare/proc/findEventArea() + var/static/list/allowed_areas + if(!allowed_areas) + //Places that shouldn't ignite + var/static/list/safe_area_types = typecacheof(list( + /area/station/ai_monitored/turret_protected/ai, + /area/station/ai_monitored/turret_protected/ai_upload, + /area/station/engineering, + /area/station/solars, + /area/station/holodeck, + /area/shuttle, + /area/station/maintenance, + /area/station/science/test_area, + )) + + //Subtypes from the above that actually should ignite. + var/static/list/unsafe_area_subtypes = typecacheof(list(/area/station/engineering/break_room)) + + allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes + var/list/possible_areas = typecache_filter_list(GLOB.areas, allowed_areas) + if (length(possible_areas)) + return pick(possible_areas) + +/datum/round_event/solar_flare/setup() + impact_area = findEventArea() + if(!impact_area) + CRASH("No valid areas for a solar flare found.") + possible_turfs = get_area_turfs(impact_area) + if(!possible_turfs) + CRASH("Solar flare : No valid turfs found for [impact_area] - [impact_area.type]") + +/datum/round_event/solar_flare/announce(fake) + priority_announce("An unexpected solar flare has been detected near the station and is predicted to hit [impact_area.name]. Evacuate the location immediately and remove any flammable material.", "Celestial Sensor Array", "SOLAR FLARE IMMINENT") + +/datum/round_event/solar_flare/start() + var/spots_left = number_of_fires + while(spots_left > 0) + var/turf/open/fireturf = (pick(possible_turfs)) + fireturf.create_fire(5, 8) + spots_left -= 1 diff --git a/code/modules/events/space_dragon.dm b/code/modules/events/space_dragon.dm deleted file mode 100644 index cbca3ea6e500..000000000000 --- a/code/modules/events/space_dragon.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/round_event_control/space_dragon - name = "Spawn Space Dragon" - typepath = /datum/round_event/ghost_role/space_dragon - weight = 7 - max_occurrences = 1 - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/ghost_role/space_dragon - minimum_required = 1 - role_name = "Space Dragon" - announceWhen = 10 - -/datum/round_event/ghost_role/space_dragon/announce(fake) - priority_announce("A large organic energy flux has been recorded near [station_name()], please stand by.", FLAVOR_ANANKE_STATION, sound_type = ANNOUNCER_ALIENS) - -/datum/round_event/ghost_role/space_dragon/spawn_role() - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list) - if(!isturf(carp_spawn.loc)) - stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]") - continue - spawn_locs += carp_spawn.loc - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - var/list/candidates = get_candidates(ROLE_SPACE_DRAGON, ROLE_SPACE_DRAGON) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected = pick(candidates) - var/key = selected.key - - var/mob/living/simple_animal/hostile/space_dragon/dragon = new (pick(spawn_locs)) - dragon.key = key - dragon.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_dragon)) - dragon.mind.special_role = ROLE_SPACE_DRAGON - dragon.mind.add_antag_datum(/datum/antagonist/space_dragon) - playsound(dragon, 'sound/magic/ethereal_exit.ogg', 50, TRUE, -1) - message_admins("[ADMIN_LOOKUPFLW(dragon)] has been made into a Space Dragon by an event.") - log_game("[key_name(dragon)] was spawned as a Space Dragon by an event.") - spawned_mobs += dragon - return SUCCESSFUL_SPAWN diff --git a/code/modules/events/space_ninja.dm b/code/modules/events/space_ninja.dm deleted file mode 100644 index c81aa033e0db..000000000000 --- a/code/modules/events/space_ninja.dm +++ /dev/null @@ -1,53 +0,0 @@ -/datum/round_event_control/space_ninja - name = "Spawn Space Ninja" - typepath = /datum/round_event/ghost_role/space_ninja - max_occurrences = 1 - weight = 10 - earliest_start = 20 MINUTES - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/ghost_role/space_ninja - minimum_required = 1 - role_name = "Space Ninja" - -/datum/round_event/ghost_role/space_ninja/spawn_role() - var/list/spawn_locs = list() - for(var/obj/effect/landmark/carpspawn/carp_spawn in GLOB.landmarks_list) - if(!isturf(carp_spawn.loc)) - stack_trace("Carp spawn found not on a turf: [carp_spawn.type] on [isnull(carp_spawn.loc) ? "null" : carp_spawn.loc.type]") - continue - spawn_locs += carp_spawn.loc - if(!spawn_locs.len) - message_admins("No valid spawn locations found, aborting...") - return MAP_ERROR - - //selecting a candidate player - var/list/candidates = get_candidates(ROLE_NINJA, ROLE_NINJA) - if(!candidates.len) - return NOT_ENOUGH_PLAYERS - - var/mob/dead/selected_candidate = pick(candidates) - var/key = selected_candidate.key - - //spawn the ninja and assign the candidate - var/mob/living/carbon/human/ninja = create_space_ninja(pick(spawn_locs)) - ninja.key = key - ninja.mind.add_antag_datum(/datum/antagonist/ninja) - spawned_mobs += ninja - message_admins("[ADMIN_LOOKUPFLW(ninja)] has been made into a space ninja by an event.") - log_game("[key_name(ninja)] was spawned as a ninja by an event.") - - return SUCCESSFUL_SPAWN - - -//=======//NINJA CREATION PROCS//=======// - -/proc/create_space_ninja(spawn_loc) - var/mob/living/carbon/human/new_ninja = new(spawn_loc) - new_ninja.randomize_human_appearance(~(RANDOMIZE_NAME|RANDOMIZE_SPECIES)) - var/new_name = "[pick(GLOB.ninja_titles)] [pick(GLOB.ninja_names)]" - new_ninja.name = new_name - new_ninja.real_name = new_name - new_ninja.dna.update_dna_identity() - return new_ninja diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index cc1346e18faf..a29b70c072b8 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -39,7 +39,7 @@ /datum/round_event_control/spacevine name = "Space Vines" typepath = /datum/round_event/spacevine - weight = 15 + weight = 4 max_occurrences = 3 min_players = 10 @@ -51,9 +51,9 @@ var/obj/structure/spacevine/vine = new() - for(var/area/station/hallway/area in world) - for(var/turf/floor in area) - if(floor.Enter(vine)) + for(var/area/station/hallway/area in GLOB.areas) + for(var/turf/floor in area.get_contained_turfs()) + if(floor.Enter(vine, TRUE)) turfs += floor qdel(vine) @@ -212,7 +212,7 @@ var/mob/living/carbon/victim = living_mob //If the mob is carbon then it now also exists as a victim, and not just an living mob. if(istype(victim)) //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 = victim.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/armor = victim.run_armor_check(limb, BLUNT, 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/thorn = locate() in vine.mutations //Searches for the thorns mutation in the "mutations"-list inside obj/structure/spacevine, and defines T if it finds it. if(thorn && (prob(40))) //If we found the thorns mutation there is now a chance to get stung instead of lashed or smashed. victim.apply_damage(50, BRUTE, def_zone = limb, sharpness = SHARP_POINTY) //This one gets a bit lower damage because it ignores armor. @@ -439,7 +439,7 @@ for(var/datum/spacevine_mutation/mutation in mutations) damage_dealt = mutation.on_hit(src, user, item, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further - take_damage(damage_dealt, item.damtype, MELEE, 1) + take_damage(damage_dealt, item.damtype, BLUNT, 1) /obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) diff --git a/code/modules/events/spider_infestation.dm b/code/modules/events/spider_infestation.dm deleted file mode 100644 index 6d41f87f58bb..000000000000 --- a/code/modules/events/spider_infestation.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/round_event_control/spider_infestation - name = "Spider Infestation" - typepath = /datum/round_event/spider_infestation - weight = 10 - max_occurrences = 1 - min_players = 20 - dynamic_should_hijack = TRUE - -/datum/round_event/spider_infestation - announceWhen = 400 - var/spawncount = 2 - -/datum/round_event/spider_infestation/setup() - announceWhen = rand(announceWhen, announceWhen + 50) - -/datum/round_event/spider_infestation/announce(fake) - priority_announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", FLAVOR_ANANKE_STATION, sound_type = ANNOUNCER_ALIENS) - -/datum/round_event/spider_infestation/start() - create_midwife_eggs(spawncount) - -/proc/create_midwife_eggs(amount) - var/list/spawn_locs = list() - for(var/x in GLOB.xeno_spawn) - var/turf/spawn_turf = x - var/light_amount = spawn_turf.get_lumcount() - if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) - spawn_locs += spawn_turf - if(spawn_locs.len < amount) - message_admins("Not enough valid spawn locations found in GLOB.xeno_spawn, aborting spider spawning...") - return MAP_ERROR - var/turf/spawn_loc = pick_n_take(spawn_locs) - while(amount > 0) - var/obj/effect/mob_spawn/ghost_role/spider/midwife/new_eggs = new /obj/effect/mob_spawn/ghost_role/spider/midwife(spawn_loc) - new_eggs.amount_grown = 98 - amount-- - log_game("Midwife spider eggs were spawned via an event.") - return TRUE - diff --git a/code/modules/events/stray_cargo.dm b/code/modules/events/stray_cargo.dm index 985f39d66963..a92b5299f56e 100644 --- a/code/modules/events/stray_cargo.dm +++ b/code/modules/events/stray_cargo.dm @@ -77,7 +77,7 @@ ///Subtypes from the above that actually should explode. var/static/list/unsafe_area_subtypes = typecacheof(list(/area/station/engineering/break_room)) allowed_areas = make_associative(GLOB.the_station_areas) - safe_area_types + unsafe_area_subtypes - var/list/possible_areas = typecache_filter_list(GLOB.sortedAreas,allowed_areas) + var/list/possible_areas = typecache_filter_list(GLOB.areas, allowed_areas) if (length(possible_areas)) return pick(possible_areas) diff --git a/code/modules/events/wisdomcow.dm b/code/modules/events/wisdomcow.dm deleted file mode 100644 index 9f02d9fef842..000000000000 --- a/code/modules/events/wisdomcow.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/round_event_control/wisdomcow - name = "Wisdom cow" - typepath = /datum/round_event/wisdomcow - max_occurrences = 1 - weight = 20 - -/datum/round_event/wisdomcow/announce(fake) - priority_announce("A wise cow has been spotted in the area. Be sure to ask for her advice.", "Priapus Cow Ranching Agency") - -/datum/round_event/wisdomcow/start() - var/turf/targetloc = get_safe_random_station_turf() - new /mob/living/basic/cow/wisdom(targetloc) - do_smoke(1, targetloc) - diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm index c3701c0908c2..cdd44547d110 100644 --- a/code/modules/events/wizard/curseditems.dm +++ b/code/modules/events/wizard/curseditems.dm @@ -55,6 +55,6 @@ I.name = "cursed " + I.name for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, H.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = H.loc) smoke.start() diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm deleted file mode 100644 index 78e249da7a9d..000000000000 --- a/code/modules/events/wizard/departmentrevolt.dm +++ /dev/null @@ -1,37 +0,0 @@ -/datum/round_event_control/wizard/deprevolt //stationwide! - name = "Departmental Uprising" - weight = 0 //An order that requires order in a round of chaos was maybe not the best idea. Requiescat in pace departmental uprising August 2014 - March 2015 //hello motherfucker i fixed your shit in 2021 - typepath = /datum/round_event/wizard/deprevolt - max_occurrences = 1 - earliest_start = 0 MINUTES - - ///manual choice of what department to revolt for admins to pick - var/datum/job_department/picked_department - ///admin choice on whether to announce the department - var/announce = FALSE - ///admin choice on whether this nation will have objectives to attack other nations, default true for !fun! - var/dangerous_nation = TRUE - -/datum/round_event_control/wizard/deprevolt/admin_setup() - if(!check_rights(R_FUN)) - return - - var/list/options = list() - var/list/pickable_departments = subtypesof(/datum/job_department) - for(var/datum/job_department/dep as anything in pickable_departments) - options[dep.department_name] = dep - picked_department = options[(input(usr,"Which department should revolt? Select none for a random department.","Select a department") as null|anything in options)] - if(!picked_department) - return //eh just random they dont care - - var/announce_question = tgui_alert(usr, "Announce This New Independent State?", "Secession", list("Announce", "No Announcement")) - if(announce_question == "Announce") - announce = TRUE - - var/dangerous_question = tgui_alert(usr, "Dangerous Nation? This means they will fight other nations.", "Conquest", list("Yes", "No")) - if(dangerous_question == "No") - dangerous_nation = FALSE - -/datum/round_event/wizard/deprevolt/start() - var/datum/round_event_control/wizard/deprevolt/event_control = control - create_separatist_nation(event_control.picked_department, event_control.announce, event_control.dangerous_nation) diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm index 23e8537b2f9c..0636aa0745d6 100644 --- a/code/modules/events/wizard/embeddies.dm +++ b/code/modules/events/wizard/embeddies.dm @@ -66,7 +66,7 @@ GLOBAL_DATUM(global_funny_embedding, /datum/global_funny_embedding) /datum/global_funny_embedding/proc/handle_current_items() for(var/obj/item/embed_item in world) CHECK_TICK - if(!(embed_item.flags_1 & INITIALIZED_1)) + if(!embed_item.initialized) continue if(!embed_item.embedding) embed_item.embedding = embed_type diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm index 4c3159e218fb..0bc849b0c45a 100644 --- a/code/modules/events/wizard/greentext.dm +++ b/code/modules/events/wizard/greentext.dm @@ -77,7 +77,7 @@ /obj/item/greentext/Destroy(force) LAZYREMOVE(SSticker.round_end_events, roundend_callback) - QDEL_NULL(roundend_callback) //This ought to free the callback datum, and prevent us from harddeling + roundend_callback = null for(var/mob/all_player_mobs as anything in GLOB.player_list) var/message = "A dark temptation has passed from this world" if(all_player_mobs in color_altered_mobs) diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm index 1a272265836b..7cbfd39c6abd 100644 --- a/code/modules/events/wizard/imposter.dm +++ b/code/modules/events/wizard/imposter.dm @@ -15,12 +15,11 @@ return //Sad Trombone var/mob/dead/observer/C = pick(candidates) - new /obj/effect/particle_effect/smoke(W.loc) + new /obj/effect/particle_effect/fluid/smoke(W.loc) var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) W.dna.transfer_identity(I, transfer_SE=1) - I.real_name = I.dna.real_name - I.name = I.dna.real_name + I.set_real_name(I.dna.real_name) I.updateappearance(mutcolor_update=1) I.domutcheck() I.key = C.key diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm index c9c55363cc3d..dd5d026a288e 100644 --- a/code/modules/events/wizard/rpgloot.dm +++ b/code/modules/events/wizard/rpgloot.dm @@ -79,7 +79,7 @@ GLOBAL_DATUM(rpgloot_controller, /datum/rpgloot_controller) for(var/obj/item/fantasy_item in world) CHECK_TICK - if(!(fantasy_item.flags_1 & INITIALIZED_1) || QDELETED(fantasy_item)) + if(!fantasy_item.initialized || QDELETED(fantasy_item)) continue fantasy_item.AddComponent(/datum/component/fantasy) diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm index c95f04157548..c1e33d466069 100644 --- a/code/modules/events/wizard/shuffle.dm +++ b/code/modules/events/wizard/shuffle.dm @@ -31,8 +31,8 @@ moblocs.len -= 1 for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, H.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = H.loc) smoke.start() //---// @@ -61,12 +61,12 @@ for(var/mob/living/carbon/human/H in mobs) if(!mobnames) break - H.real_name = mobnames[mobnames.len] + H.set_real_name(mobnames[mobnames.len]) mobnames.len -= 1 for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, H.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = H.loc) smoke.start() //---// @@ -102,6 +102,6 @@ qdel(swapper) for(var/mob/living/carbon/human/alive_human in GLOB.alive_mob_list) - var/datum/effect_system/smoke_spread/smoke = new() - smoke.set_up(0, alive_human.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new() + smoke.set_up(0, location = alive_human.loc) smoke.start() diff --git a/code/modules/events/wormholes.dm b/code/modules/events/wormholes.dm index 279db03c4bb7..c6d37f9b4d1f 100644 --- a/code/modules/events/wormholes.dm +++ b/code/modules/events/wormholes.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(all_wormholes) // So we can pick wormholes to teleport to name = "Wormholes" typepath = /datum/round_event/wormholes max_occurrences = 3 - weight = 2 + weight = 6 min_players = 2 diff --git a/code/modules/explorer_drone/exploration_events/_exploration_event.dm b/code/modules/explorer_drone/exploration_events/_exploration_event.dm index 5385a48fbb4e..d60b730e07de 100644 --- a/code/modules/explorer_drone/exploration_events/_exploration_event.dm +++ b/code/modules/explorer_drone/exploration_events/_exploration_event.dm @@ -1,7 +1,7 @@ /// Exploration event /datum/exploration_event /// These types will be ignored in event creation - var/root_abstract_type = /datum/exploration_event + abstract_type = /datum/exploration_event ///This name will show up in exploration list if it's repeatable var/name = "Something interesting" /// encountered at least once @@ -40,7 +40,7 @@ /// Simple events, not a full fledged adventure, consist only of single encounter screen /datum/exploration_event/simple - root_abstract_type = /datum/exploration_event/simple + abstract_type = /datum/exploration_event/simple var/ui_image = "default" /// Show ignore button. var/skippable = TRUE diff --git a/code/modules/explorer_drone/exploration_events/adventure.dm b/code/modules/explorer_drone/exploration_events/adventure.dm index bdf9b62c10b5..f7127d677785 100644 --- a/code/modules/explorer_drone/exploration_events/adventure.dm +++ b/code/modules/explorer_drone/exploration_events/adventure.dm @@ -2,7 +2,7 @@ /datum/exploration_event/adventure discovery_log = "Encountered something unexpected" var/datum/adventure/adventure - root_abstract_type = /datum/exploration_event/adventure + abstract_type = /datum/exploration_event/adventure /datum/exploration_event/adventure/encounter(obj/item/exodrone/drone) . = ..() diff --git a/code/modules/explorer_drone/exploration_events/danger.dm b/code/modules/explorer_drone/exploration_events/danger.dm index 0c0c28bd1c55..c73037d4776f 100644 --- a/code/modules/explorer_drone/exploration_events/danger.dm +++ b/code/modules/explorer_drone/exploration_events/danger.dm @@ -1,6 +1,6 @@ /// Danger event - unskippable, if you have appriopriate tool you can mitigate damage. /datum/exploration_event/simple/danger - root_abstract_type = /datum/exploration_event/simple/danger + abstract_type = /datum/exploration_event/simple/danger description = "You encounter a giant error." var/required_tool = EXODRONE_TOOL_LASER var/has_tool_action_text = "Fight" diff --git a/code/modules/explorer_drone/exploration_events/resource.dm b/code/modules/explorer_drone/exploration_events/resource.dm index fa44c09e9e90..b3159d7cb7f7 100644 --- a/code/modules/explorer_drone/exploration_events/resource.dm +++ b/code/modules/explorer_drone/exploration_events/resource.dm @@ -1,7 +1,7 @@ /// Simple event type that checks if you have a tool and after a retrieval delay adds loot to drone. /datum/exploration_event/simple/resource name = "Retrievable resource" - root_abstract_type = /datum/exploration_event/simple/resource + abstract_type = /datum/exploration_event/simple/resource discovery_log = "Encountered recoverable resource" action_text = "Extract" /// Tool type required to recover this resource @@ -187,19 +187,6 @@ action_text = "Retrieve data" loot_type = /datum/adventure_loot_generator/cargo -// EXPLORATION_SITE_HABITABLE 2/2 -/datum/exploration_event/simple/resource/unknown_microbiome - name = "unknown microbiome" - required_site_traits = list(EXPLORATION_SITE_HABITABLE) - required_tool = EXODRONE_TOOL_TRANSLATOR - discovery_log = "Discovered a isolated microbiome." - description = "You discover a giant fungus colony." - success_log = "Retrieved samples of the fungus for future study." - no_tool_description = "With a laser tool you could slice off a sample for study." - delay_message = "Taking samples..." - action_text = "Take sample" - loot_type = /obj/item/petri_dish/random - /datum/exploration_event/simple/resource/tcg_nerd name = "creepy stranger" required_site_traits = list(EXPLORATION_SITE_HABITABLE) @@ -241,7 +228,7 @@ /datum/exploration_event/simple/resource/welded_locker/dispense_loot(obj/item/exodrone/drone) var/mob/living/carbon/human/head_species_source = new head_species_source.set_species(/datum/species/skeleton) - head_species_source.real_name = "spaced locker victim" + head_species_source.set_real_name("spaced locker victim") var/obj/item/bodypart/head/skeleton_head = new skeleton_head.update_limb(FALSE,head_species_source) qdel(head_species_source) diff --git a/code/modules/explorer_drone/exploration_events/trader.dm b/code/modules/explorer_drone/exploration_events/trader.dm index fccfbb7e9c94..b440cbdc8846 100644 --- a/code/modules/explorer_drone/exploration_events/trader.dm +++ b/code/modules/explorer_drone/exploration_events/trader.dm @@ -1,6 +1,6 @@ /// Trader events - If drone is loaded with X exchanges it for Y, might require translator tool. /datum/exploration_event/simple/trader - root_abstract_type = /datum/exploration_event/simple/trader + abstract_type = /datum/exploration_event/simple/trader action_text = "Trade" /// Obj path we'll take or list of paths ,one path will be picked from it at init var/required_path diff --git a/code/modules/explorer_drone/exploration_site.dm b/code/modules/explorer_drone/exploration_site.dm index 903a30ade537..ae8528177bd1 100644 --- a/code/modules/explorer_drone/exploration_site.dm +++ b/code/modules/explorer_drone/exploration_site.dm @@ -118,11 +118,10 @@ GLOBAL_LIST_EMPTY(exploration_sites) /datum/exploration_site/proc/build_exploration_event_requirements_cache() . = list() - for(var/event_type in subtypesof(/datum/exploration_event)) - var/datum/exploration_event/event = event_type - if(initial(event.root_abstract_type) == event_type) + for(var/datum/exploration_event/event_type as anything in subtypesof(/datum/exploration_event)) + if(isabstract(event_type)) continue - event = new event_type + var/datum/exploration_event/event = new event_type .[event_type] = list("required" = event.required_site_traits,"blacklisted" = event.blacklisted_site_traits) //Should be no event refs,GC'd naturally diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm index 60804039092f..5b9aa890a1e1 100644 --- a/code/modules/explorer_drone/loot.dm +++ b/code/modules/explorer_drone/loot.dm @@ -69,12 +69,12 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /// Valuables /datum/adventure_loot_generator/simple/cash id = "cash" - loot_list = list(/obj/item/storage/bag/money,/obj/item/antique,/obj/item/stack/spacecash/c1000,/obj/item/holochip/thousand) + loot_list = list(/obj/item/storage/bag/money,/obj/item/antique,/obj/item/stack/spacecash/c1000,) /// Drugs /datum/adventure_loot_generator/simple/drugs id = "drugs" - loot_list = list(/obj/item/storage/pill_bottle/happy,/obj/item/storage/pill_bottle/lsd,/obj/item/storage/pill_bottle/penacid,/obj/item/storage/pill_bottle/stimulant) + loot_list = list(/obj/item/storage/pill_bottle/happy,/obj/item/storage/pill_bottle/lsd,/obj/item/storage/pill_bottle/haloperidol,/obj/item/storage/pill_bottle/stimulant) /// Rare minerals/materials /datum/adventure_loot_generator/simple/materials @@ -153,7 +153,6 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index()) /obj/item/firelance/Initialize(mapload) . = ..() cell = new /obj/item/stock_parts/cell(src) - AddComponent(/datum/component/two_handed) /obj/item/firelance/attack(mob/living/M, mob/living/user, params) if(!user.combat_mode) diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 4ef3e49a0fd6..1e401dc2560b 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -57,12 +57,12 @@ dream_sequence(dream_fragments) /mob/living/carbon/proc/dream_sequence(list/dream_fragments) - if(stat != UNCONSCIOUS || HAS_TRAIT(src, TRAIT_CRITICAL_CONDITION)) + if(stat != UNCONSCIOUS) dreaming = FALSE return var/next_message = dream_fragments[1] dream_fragments.Cut(1,2) - to_chat(src, span_notice("... [next_message] ...")) + to_chat(src, span_obviousnotice("... [next_message] ...")) if(LAZYLEN(dream_fragments)) addtimer(CALLBACK(src, PROC_REF(dream_sequence), dream_fragments), rand(10,30)) else diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index cc53cedc26f8..524989753f99 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -857,15 +857,18 @@ GLOBAL_LIST_INIT(hallucination_list, list( var/spans = list(person.speech_span) var/chosen = !specific_message ? capitalize(pick(is_radio ? speak_messages : radio_messages)) : specific_message chosen = replacetext(chosen, "%TARGETNAME%", target_name) - var/message = target.compose_message(person, understood_language, chosen, is_radio ? "[FREQ_COMMON]" : null, spans, face_name = TRUE) + + var/translated_chosen = understood_language.speech_understood(chosen) + var/message = target.compose_message(person, understood_language, translated_chosen, is_radio ? "[FREQ_COMMON]" : null, spans, face_name = TRUE) feedback_details += "Type: [is_radio ? "Radio" : "Talk"], Source: [person.real_name], Message: [message]" // Display message if (!is_radio && !target.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) var/image/speech_overlay = image('icons/mob/talk.dmi', person, "default0", layer = ABOVE_MOB_LAYER) INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), speech_overlay, list(target.client), 30) + if (target.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat)) - target.create_chat_message(person, understood_language, chosen, spans) + target.create_chat_message(person, understood_language, translated_chosen, spans) to_chat(target, message) qdel(src) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 680908ae5228..75cc4a730fbd 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -31,13 +31,11 @@ if(M == user) user.visible_message(span_notice("[user] swallows a gulp of [src]."), \ span_notice("You swallow a gulp of [src].")) - if(HAS_TRAIT(M, TRAIT_VORACIOUS)) - M.changeNext_move(CLICK_CD_MELEE * 0.5) //chug! chug! chug! else M.visible_message(span_danger("[user] attempts to feed [M] the contents of [src]."), \ span_userdanger("[user] attempts to feed you the contents of [src].")) - if(!do_after(user, M)) + if(!do_after(user, M, 3 SECONDS)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding @@ -46,6 +44,7 @@ log_combat(user, M, "fed", reagents.get_reagent_log_string()) SEND_SIGNAL(src, COMSIG_DRINK_DRANK, M, user) + var/fraction = min(gulp_size/reagents.total_volume, 1) reagents.trans_to(M, gulp_size, transfered_by = user, methods = INGEST) checkLiked(fraction, M) @@ -151,7 +150,7 @@ var/obj/item/broken_bottle/B = new (loc) B.mimic_broken(src, target) qdel(src) - target.Bumped(B) + target.BumpedBy(B) /obj/item/reagent_containers/food/drinks/bullet_act(obj/projectile/P) . = ..() @@ -235,7 +234,7 @@ /obj/item/reagent_containers/food/drinks/ice name = "ice cup" desc = "Careful, cold ice, do not chew." - custom_price = PAYCHECK_PRISONER * 0.6 + custom_price = PAYCHECK_ASSISTANT * 0.4 icon_state = "coffee" list_reagents = list(/datum/reagent/consumable/ice = 30) spillable = TRUE @@ -268,7 +267,12 @@ list_reagents = list(/datum/reagent/consumable/hot_coco = 15, /datum/reagent/consumable/sugar = 5) foodtype = SUGAR resistance_flags = FREEZE_PROOF - custom_price = PAYCHECK_ASSISTANT * 1.2 + custom_price = PAYCHECK_ASSISTANT * 0.9 + +/obj/item/reagent_containers/food/drinks/mug/beagle + name = "beagle mug" + desc = "A heavy mug. A beagle mug. Careful not to break it!" + icon_state = "beaglemug" /obj/item/reagent_containers/food/drinks/dry_ramen @@ -278,7 +282,7 @@ list_reagents = list(/datum/reagent/consumable/dry_ramen = 15, /datum/reagent/consumable/salt = 3) foodtype = GRAIN isGlass = FALSE - custom_price = PAYCHECK_ASSISTANT * 0.9 + custom_price = PAYCHECK_ASSISTANT * 0.4 /obj/item/reagent_containers/food/drinks/waterbottle name = "bottle of water" @@ -298,7 +302,7 @@ var/cap_lost = FALSE var/mutable_appearance/cap_overlay var/flip_chance = 10 - custom_price = PAYCHECK_PRISONER * 0.8 + custom_price = PAYCHECK_ASSISTANT * 0.5 /obj/item/reagent_containers/food/drinks/waterbottle/Initialize(mapload) . = ..() @@ -380,8 +384,6 @@ if(!QDELETED(src) && cap_on && reagents.total_volume) if(prob(flip_chance)) // landed upright src.visible_message(span_notice("[src] lands upright!")) - if(throwingdatum.thrower) - SEND_SIGNAL(throwingdatum.thrower, COMSIG_ADD_MOOD_EVENT, "bottle_flip", /datum/mood_event/bottle_flip) else // landed on it's side animate(src, transform = matrix(prob(50)? 90 : -90, MATRIX_ROTATE), time = 3, loop = 0) @@ -540,7 +542,7 @@ var/obj/item/broken_bottle/B = new (loc) B.mimic_broken(src, target) qdel(src) - target.Bumped(B) + target.BumpedBy(B) /obj/item/reagent_containers/food/drinks/colocup name = "colo cup" @@ -584,7 +586,7 @@ /obj/item/reagent_containers/food/drinks/flask name = "flask" desc = "Every good spaceman knows it's a good idea to bring along a couple of pints of whiskey wherever they go." - custom_price = PAYCHECK_HARD * 2 + custom_price = PAYCHECK_ASSISTANT * 3.5 icon_state = "flask" custom_materials = list(/datum/material/iron=250) volume = 60 @@ -702,12 +704,6 @@ if(!target) return - if(ismob(target)) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, "soda_spill", /datum/mood_event/soda_spill, src) - for(var/mob/living/iter_mob in view(src, 7)) - if(iter_mob != target) - SEND_SIGNAL(iter_mob, COMSIG_ADD_MOOD_EVENT, "observed_soda_spill", /datum/mood_event/observed_soda_spill, target, src) - playsound(src, 'sound/effects/can_pop.ogg', 80, TRUE) if(!hide_message) visible_message(span_danger("[src] spills over, fizzing its contents all over [target]!")) @@ -817,13 +813,6 @@ list_reagents = list(/datum/reagent/consumable/spacemountainwind = 30) foodtype = SUGAR | JUNKFOOD -/obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko - name = "Thirteen Loko" - desc = "The CMO has advised crew members that consumption of Thirteen Loko may result in seizures, blindness, drunkenness, or even death. Please Drink Responsibly." - icon_state = "thirteen_loko" - list_reagents = list(/datum/reagent/consumable/ethanol/thirteenloko = 30) - foodtype = SUGAR | JUNKFOOD - /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb name = "Dr. Gibb" desc = "A delicious mixture of 42 different flavors." @@ -831,12 +820,6 @@ list_reagents = list(/datum/reagent/consumable/dr_gibb = 30) foodtype = SUGAR | JUNKFOOD -/obj/item/reagent_containers/food/drinks/soda_cans/pwr_game - name = "Pwr Game" - desc = "The only drink with the PWR that true gamers crave. When a gamer talks about gamerfuel, this is what they're literally referring to." - icon_state = "purple_can" - list_reagents = list(/datum/reagent/consumable/pwr_game = 30) - /obj/item/reagent_containers/food/drinks/soda_cans/shamblers name = "Shambler's juice" desc = "~Shake me up some of that Shambler's Juice!~" diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 72f122f8267e..bf9902b2b4e1 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -10,7 +10,7 @@ icon_state = "glassbottle" worn_icon_state = "bottle" fill_icon_thresholds = list(0, 10, 20, 30, 40, 50, 60, 70, 80, 90) - custom_price = PAYCHECK_EASY * 1.1 + custom_price = PAYCHECK_ASSISTANT * 1.2 amount_per_transfer_from_this = 10 volume = 100 force = 15 //Smashing bottles over someone's head hurts. @@ -29,7 +29,7 @@ desc = "This blank bottle is unyieldingly anonymous, offering no clues to its contents." icon_state = "glassbottlesmall" volume = 50 - custom_price = PAYCHECK_EASY * 0.9 + custom_price = PAYCHECK_ASSISTANT * 0.8 /obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE) if(bartender_check(target) && ranged) @@ -41,7 +41,7 @@ B.mimic_broken(src, target) qdel(src) - target.Bumped(B) + target.BumpedBy(B) /obj/item/reagent_containers/food/drinks/bottle/attack_secondary(atom/target, mob/living/user, params) @@ -66,11 +66,11 @@ var/mob/living/carbon/human/H = target var/headarmor = 0 // Target's head armor - armor_block = H.run_armor_check(affecting, MELEE,"","",armour_penetration) // For normal attack damage + armor_block = H.run_armor_check(affecting, BLUNT,"","", armor_penetration) // For normal attack damage //If they have a hat/helmet and the user is targeting their head. if(istype(H.head, /obj/item/clothing/head) && affecting == BODY_ZONE_HEAD) - headarmor = H.head.armor.melee + headarmor = H.head.returnArmor().getRating(BLUNT) else headarmor = 0 @@ -79,9 +79,10 @@ else //Only humans can have armor, right? - armor_block = living_target.run_armor_check(affecting, MELEE) + armor_block = living_target.run_armor_check(affecting, BLUNT) if(affecting == BODY_ZONE_HEAD) armor_duration = bottle_knockdown_duration + force + //Apply the damage! armor_block = min(90,armor_block) living_target.apply_damage(force, BRUTE, affecting, armor_block) @@ -117,7 +118,6 @@ icon_state = "broken_bottle" force = 9 throwforce = 5 - throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_TINY inhand_icon_state = "broken_beer" @@ -131,7 +131,7 @@ /obj/item/broken_bottle/Initialize(mapload) . = ..() - AddComponent(/datum/component/caltrop, min_damage = force) + AddComponent(/datum/component/caltrop, min_damage = force, probability = 4) AddComponent(/datum/component/butchering, 200, 55) /// Mimics the appearance and properties of the passed in bottle. @@ -146,7 +146,7 @@ if(to_mimic.isGlass) if(prob(33)) var/obj/item/shard/stab_with = new(to_mimic.drop_location()) - target.Bumped(stab_with) + target.BumpedBy(stab_with) playsound(src, SFX_SHATTER, 70, TRUE) else force = 0 @@ -163,7 +163,7 @@ volume = 30 list_reagents = list(/datum/reagent/consumable/ethanol/beer = 30) foodtype = GRAIN | ALCOHOL - custom_price = PAYCHECK_EASY + custom_price = PAYCHECK_ASSISTANT * 1.3 /obj/item/reagent_containers/food/drinks/bottle/beer/almost_empty list_reagents = list(/datum/reagent/consumable/ethanol/beer = 1) @@ -179,8 +179,8 @@ volume = 30 list_reagents = list(/datum/reagent/consumable/rootbeer = 30) foodtype = SUGAR | JUNKFOOD - custom_price = PAYCHECK_HARD * 1.5 - custom_premium_price = PAYCHECK_HARD * 2 + custom_price = PAYCHECK_ASSISTANT * 0.7 + custom_premium_price = PAYCHECK_ASSISTANT * 1.3 /obj/item/reagent_containers/food/drinks/bottle/ale name = "Magm-Ale" @@ -265,10 +265,6 @@ list_reagents = list(/datum/reagent/water/holywater = 100) foodtype = NONE -/obj/item/reagent_containers/food/drinks/bottle/holywater/hell - desc = "A flask of holy water...it's been sitting in the Necropolis a while though." - list_reagents = list(/datum/reagent/hellwater = 100) - /obj/item/reagent_containers/food/drinks/bottle/vermouth name = "Goldeneye vermouth" desc = "Sweet, sweet dryness~" @@ -375,13 +371,6 @@ /obj/item/reagent_containers/food/drinks/bottle/absinthe/premium/redact() return -/obj/item/reagent_containers/food/drinks/bottle/lizardwine - name = "bottle of unathi wine" - desc = "An alcoholic beverage from Space China, made by infusing unathi tails in ethanol. Inexplicably popular among command staff." - icon_state = "lizardwine" - list_reagents = list(/datum/reagent/consumable/ethanol/lizardwine = 100) - foodtype = FRUIT | ALCOHOL - /obj/item/reagent_containers/food/drinks/bottle/hcider name = "Jian Hard Cider" desc = "Apple juice for adults." @@ -448,7 +437,7 @@ /obj/item/reagent_containers/food/drinks/bottle/orangejuice name = "orange juice" desc = "Full of vitamins and deliciousness!" - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "orangejuice" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -461,7 +450,7 @@ /obj/item/reagent_containers/food/drinks/bottle/cream name = "milk cream" desc = "It's cream. Made from milk. What else did you think you'd find in there?" - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "cream" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -474,7 +463,7 @@ /obj/item/reagent_containers/food/drinks/bottle/tomatojuice name = "tomato juice" desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness." - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "tomatojuice" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -487,7 +476,7 @@ /obj/item/reagent_containers/food/drinks/bottle/limejuice name = "lime juice" desc = "Sweet-sour goodness." - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "limejuice" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -500,7 +489,7 @@ /obj/item/reagent_containers/food/drinks/bottle/pineapplejuice name = "pineapple juice" desc = "Extremely tart, yellow juice." - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "pineapplejuice" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -513,7 +502,7 @@ /obj/item/reagent_containers/food/drinks/bottle/menthol name = "menthol" desc = "Tastes naturally minty, and imparts a very mild numbing sensation." - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "mentholbox" inhand_icon_state = "carton" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' @@ -524,7 +513,7 @@ /obj/item/reagent_containers/food/drinks/bottle/grenadine name = "Jester Grenadine" desc = "Contains 0% real cherries!" - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 0.6 icon_state = "grenadine" isGlass = TRUE list_reagents = list(/datum/reagent/consumable/grenadine = 100) @@ -534,7 +523,7 @@ /obj/item/reagent_containers/food/drinks/bottle/applejack name = "Buckin' Bronco's Applejack" desc = "Kicks like a horse, tastes like an apple!" - custom_price = PAYCHECK_ASSISTANT + custom_price = PAYCHECK_ASSISTANT * 1.6 icon_state = "applejack_bottle" isGlass = TRUE list_reagents = list(/datum/reagent/consumable/ethanol/applejack = 100) @@ -638,7 +627,7 @@ icon_state = "vodkabottle" list_reagents = list() var/list/accelerants = list( /datum/reagent/consumable/ethanol, /datum/reagent/fuel, /datum/reagent/clf3, /datum/reagent/phlogiston, - /datum/reagent/napalm, /datum/reagent/hellwater, /datum/reagent/toxin/plasma, /datum/reagent/toxin/spore_burning) + /datum/reagent/napalm, /datum/reagent/toxin/plasma, /datum/reagent/toxin/spore_burning) var/active = FALSE /obj/item/reagent_containers/food/drinks/bottle/molotov/CheckParts(list/parts_list) diff --git a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm index bb3f329429d5..77224a905592 100644 --- a/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food_and_drinks/drinks/drinks/drinkingglass.dm @@ -14,7 +14,7 @@ obj_flags = UNIQUE_RENAME drop_sound = 'sound/items/handling/drinkglass_drop.ogg' pickup_sound = 'sound/items/handling/drinkglass_pickup.ogg' - custom_price = PAYCHECK_PRISONER + custom_price = PAYCHECK_ASSISTANT * 0.3 /obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change(datum/reagents/holder, ...) . = ..() @@ -75,7 +75,7 @@ fill_icon_state = "shot_glass" volume = 15 custom_materials = list(/datum/material/glass=100) - custom_price = PAYCHECK_ASSISTANT * 0.4 + custom_price = PAYCHECK_ASSISTANT * 0.2 /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass/update_name(updates) if(renamedByPlayer) diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 55863d8e4c9c..82c3cf301c6d 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -29,19 +29,14 @@ if(foodtype & H.dna.species.toxic_food) to_chat(H,span_warning("What the hell was that thing?!")) H.adjust_disgust(25 + 30 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) else if(foodtype & H.dna.species.disliked_food) to_chat(H,span_notice("That didn't taste very good...")) H.adjust_disgust(11 + 15 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) else if(foodtype & H.dna.species.liked_food) to_chat(H,span_notice("I love this taste!")) H.adjust_disgust(-5 + -2.5 * fraction) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) else if(foodtype & H.dna.species.toxic_food) to_chat(H, span_warning("You don't feel so good...")) H.adjust_disgust(25 + 30 * fraction) - if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 8c3ed7a8bcd7..c7d33ab7f600 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -55,7 +55,7 @@ else M.visible_message(span_warning("[user] attempts to feed [M] from [src]."), \ span_warning("[user] attempts to feed you from [src].")) - if(!do_after(user, M)) + if(!do_after(user, M, 3 SECONDS)) return if(!reagents || !reagents.total_volume) return // The condiment might be empty after the delay. @@ -103,7 +103,7 @@ /obj/item/reagent_containers/food/condiment/enzyme/examine(mob/user) . = ..() - var/datum/chemical_reaction/recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cheesewheel] + var/datum/chemical_reaction/recipe = SSreagents.chemical_reactions_list[/datum/chemical_reaction/food/cheesewheel] var/milk_required = recipe.required_reagents[/datum/reagent/consumable/milk] var/enzyme_required = recipe.required_catalysts[/datum/reagent/consumable/enzyme] . += span_notice("[milk_required] milk, [enzyme_required] enzyme and you got cheese.") @@ -121,7 +121,7 @@ /obj/item/reagent_containers/food/condiment/sugar/examine(mob/user) . = ..() - var/datum/chemical_reaction/recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] + var/datum/chemical_reaction/recipe = SSreagents.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] var/flour_required = recipe.required_reagents[/datum/reagent/consumable/flour] var/eggyolk_required = recipe.required_reagents[/datum/reagent/consumable/eggyolk] var/sugar_required = recipe.required_reagents[/datum/reagent/consumable/sugar] @@ -138,13 +138,12 @@ volume = 20 list_reagents = list(/datum/reagent/consumable/salt = 20) fill_icon_thresholds = null + drop_sound = 'sound/items/handling/drinkglass_drop.ogg' /obj/item/reagent_containers/food/condiment/saltshaker/suicide_act(mob/user) user.visible_message(span_suicide("[user] begins to swap forms with the salt shaker! It looks like [user.p_theyre()] trying to commit suicide!")) var/newname = "[name]" - name = "[user.name]" - user.name = newname - user.real_name = newname + user.set_real_name(newname) desc = "Salt. From dead crew, presumably." return (TOXLOSS) @@ -172,6 +171,7 @@ volume = 20 list_reagents = list(/datum/reagent/consumable/blackpepper = 20) fill_icon_thresholds = null + drop_sound = 'sound/items/handling/drinkglass_drop.ogg' /obj/item/reagent_containers/food/condiment/milk name = "space milk" @@ -185,7 +185,7 @@ /obj/item/reagent_containers/food/condiment/milk/examine(mob/user) . = ..() - var/datum/chemical_reaction/recipe = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cheesewheel] + var/datum/chemical_reaction/recipe = SSreagents.chemical_reactions_list[/datum/chemical_reaction/food/cheesewheel] var/milk_required = recipe.required_reagents[/datum/reagent/consumable/milk] var/enzyme_required = recipe.required_catalysts[/datum/reagent/consumable/enzyme] . += span_notice("[milk_required] milk, [enzyme_required] enzyme and you got cheese.") @@ -203,8 +203,8 @@ /obj/item/reagent_containers/food/condiment/flour/examine(mob/user) . = ..() - var/datum/chemical_reaction/recipe_dough = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/dough] - var/datum/chemical_reaction/recipe_cakebatter = GLOB.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] + var/datum/chemical_reaction/recipe_dough = SSreagents.chemical_reactions_list[/datum/chemical_reaction/food/dough] + var/datum/chemical_reaction/recipe_cakebatter = SSreagents.chemical_reactions_list[/datum/chemical_reaction/food/cakebatter] var/dough_flour_required = recipe_dough.required_reagents[/datum/reagent/consumable/flour] var/dough_water_required = recipe_dough.required_reagents[/datum/reagent/water] var/cakebatter_flour_required = recipe_cakebatter.required_reagents[/datum/reagent/consumable/flour] 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 d83125e7e4cc..7cf9dcb0188a 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm @@ -129,39 +129,44 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list( frying_burnt = FALSE fry_loop.stop() return - else if(user.pulling && iscarbon(user.pulling) && reagents.total_volume) - if(user.grab_state < GRAB_AGGRESSIVE) - to_chat(user, span_warning("You need a better grip to do that!")) - return - var/mob/living/carbon/dunking_target = user.pulling - log_combat(user, dunking_target, "dunked", null, "into [src]") - user.visible_message(span_danger("[user] dunks [dunking_target]'s face in [src]!")) - reagents.expose(dunking_target, TOUCH) - var/permeability = 1 - dunking_target.get_permeability_protection(list(HEAD)) - var/target_temp = dunking_target.bodytemperature - var/cold_multiplier = 1 - if(target_temp < TCMB + 10) // a tiny bit of leeway - dunking_target.visible_message(span_userdanger("[dunking_target] explodes from the entropic difference! Holy fuck!")) - dunking_target.gib() - log_combat(user, dunking_target, "blew up", null, "by dunking them into [src]") - return - else if(target_temp < T0C) - cold_multiplier += round(target_temp * 1.5 / T0C, 0.01) - dunking_target.apply_damage(min(30 * permeability * cold_multiplier, reagents.total_volume), BURN, BODY_ZONE_HEAD) - if(reagents.reagent_list) //This can runtime if reagents has nothing in it. - reagents.remove_any((reagents.total_volume/2)) - dunking_target.Paralyze(60) - user.changeNext_move(CLICK_CD_MELEE) return ..() +/obj/machinery/deepfryer/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!iscarbon(victim) || !reagents.total_volume) + return + + if(grab.current_grab.damage_stage < GRAB_AGGRESSIVE) + to_chat(user, span_warning("You need a better grip to do that!")) + return + + var/mob/living/carbon/dunking_target = victim + + log_combat(user, dunking_target, "dunked", null, "into [src]") + user.visible_message(span_danger("[user] dunks [dunking_target]'s face in [src]!")) + reagents.expose(dunking_target, TOUCH) + + var/permeability = 1 - dunking_target.get_permeability_protection(list(HEAD)) + var/target_temp = dunking_target.bodytemperature + var/cold_multiplier = 1 + if(target_temp < TCMB + 10) // a tiny bit of leeway + dunking_target.visible_message(span_userdanger("[dunking_target] explodes from the entropic difference! Holy fuck!")) + dunking_target.gib() + log_combat(user, dunking_target, "blew up", null, "by dunking them into [src]") + return + + else if(target_temp < T0C) + cold_multiplier += round(target_temp * 1.5 / T0C, 0.01) + + dunking_target.apply_damage(min(30 * permeability * cold_multiplier, reagents.total_volume), BURN, BODY_ZONE_HEAD) + if(reagents.reagent_list) //This can runtime if reagents has nothing in it. + reagents.remove_all((reagents.total_volume/2)) + + dunking_target.Paralyze(60) + user.changeNext_move(CLICK_CD_MELEE) + /obj/machinery/deepfryer/proc/fry(obj/item/frying_item, mob/user) to_chat(user, span_notice("You put [frying_item] into [src].")) - if(istype(frying_item, /obj/item/freeze_cube)) - log_bomber(user, "put a freeze cube in a", src) - visible_message(span_userdanger("[src] starts glowing... Oh no...")) - playsound(src, 'sound/effects/pray_chaplain.ogg', 100) - add_filter("entropic_ray", 10, list("type" = "rays", "size" = 35, "color" = COLOR_VIVID_YELLOW)) - addtimer(CALLBACK(src, PROC_REF(blow_up)), 5 SECONDS) frying = new /obj/item/food/deepfryholder(src, frying_item) icon_state = "fryer_on" fry_loop.start() diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index 8569264e6224..e3448d3a25be 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -73,34 +73,39 @@ to_chat(user, span_warning("[src] cannot be used unless bolted to the ground!")) return - if(user.pulling && isliving(user.pulling)) - var/mob/living/L = user.pulling - if(!iscarbon(L)) - to_chat(user, span_warning("This item is not suitable for the gibber!")) - return - var/mob/living/carbon/C = L - if(C.buckled ||C.has_buckled_mobs()) - to_chat(user, span_warning("[C] is attached to something!")) - return - - if(!ignore_clothing) - for(var/obj/item/I in C.held_items + C.get_equipped_items()) - if(!HAS_TRAIT(I, TRAIT_NODROP)) - to_chat(user, span_warning("Subject may not have abiotic items on!")) - return - - user.visible_message(span_danger("[user] starts to put [C] into the gibber!")) - - add_fingerprint(user) - - if(do_after(user, src, gibtime)) - if(C && user.pulling == C && !C.buckled && !C.has_buckled_mobs() && !occupant) - user.visible_message(span_danger("[user] stuffs [C] into the gibber!")) - C.forceMove(src) - set_occupant(C) - update_appearance() - else - startgibbing(user) + startgibbing(user) + +/obj/machinery/gibber/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!isliving(victim)) + return + + var/mob/living/L = victim + if(!iscarbon(L)) + to_chat(user, span_warning("This item is not suitable for the gibber!")) + return + + var/mob/living/carbon/C = L + if(C.buckled ||C.has_buckled_mobs()) + to_chat(user, span_warning("[C] is attached to something!")) + return + + if(!ignore_clothing) + for(var/obj/item/I in C.held_items + C.get_equipped_items()) + if(!HAS_TRAIT(I, TRAIT_NODROP)) + to_chat(user, span_warning("Subject may not have abiotic items on!")) + return + + user.visible_message(span_danger("[user] starts to put [C] into the gibber!")) + + add_fingerprint(user) + + if(do_after(user, src, gibtime)) + if(C && user.is_grabbing(C) && !C.buckled && !C.has_buckled_mobs() && !occupant) + user.visible_message(span_danger("[user] stuffs [C] into the gibber!")) + C.forceMove(src) + set_occupant(C) + update_appearance() /obj/machinery/gibber/wrench_act(mob/living/user, obj/item/tool) . = ..() @@ -229,7 +234,7 @@ /obj/machinery/gibber/autogibber var/input_dir = NORTH -/obj/machinery/gibber/autogibber/Bumped(atom/movable/AM) +/obj/machinery/gibber/autogibber/BumpedBy(atom/movable/AM) var/atom/input = get_step(src, input_dir) if(isliving(AM)) var/mob/living/victim = AM diff --git a/code/modules/food_and_drinks/kitchen_machinery/grill.dm b/code/modules/food_and_drinks/kitchen_machinery/grill.dm index cd8f24a65b2d..c4bf7f8b9774 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/grill.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/grill.dm @@ -85,8 +85,8 @@ else 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) + var/datum/effect_system/fluid_spread/smoke/bad/smoke = new + smoke.set_up(1, location = loc) smoke.start() if(grilled_item) SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, delta_time) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index e182cec66c6b..b864a5720aff 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -182,7 +182,7 @@ /obj/machinery/icecream_vat/AltClick(mob/living/user) . = ..() - if(!can_interact(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return replace_beaker(user) diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index a2a6f56c6ad4..a93336dfb24f 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -205,14 +205,14 @@ ..() /obj/machinery/microwave/attack_hand_secondary(mob/user, list/modifiers) - if(user.canUseTopic(src, !issilicon(usr))) + if(user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) cook() return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/machinery/microwave/ui_interact(mob/user) . = ..() - if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) + if(operating || panel_open || !anchored || !user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(isAI(user) && (machine_stat & NOPOWER)) return @@ -227,7 +227,7 @@ var/choice = show_radial_menu(user, src, isAI(user) ? ai_radial_options : radial_options, require_near = !issilicon(user)) // post choice verification - if(operating || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) + if(operating || panel_open || !anchored || !user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return if(isAI(user) && (machine_stat & NOPOWER)) return diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index f94b24e1b3fb..0ee140b8421c 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers) else return ..() -/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user) +/obj/machinery/monkey_recycler/MouseDroppedOn(mob/living/target, mob/living/user) if(!istype(target)) return if(ismonkey(target)) diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 616d4700adfa..871fa54ed9b9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -118,16 +118,7 @@ if(processing) to_chat(user, span_warning("[src] is in the process of processing!")) return TRUE - if(ismob(user.pulling) && PROCESSOR_SELECT_RECIPE(user.pulling)) - if(user.grab_state < GRAB_AGGRESSIVE) - to_chat(user, span_warning("You need a better grip to do that!")) - return - var/mob/living/pushed_mob = user.pulling - visible_message(span_warning("[user] stuffs [pushed_mob] into [src]!")) - pushed_mob.forceMove(src) - LAZYADD(processor_contents, pushed_mob) - user.stop_pulling() - return + if(!LAZYLEN(processor_contents)) to_chat(user, span_warning("[src] is empty!")) return TRUE @@ -157,6 +148,23 @@ processing = FALSE visible_message(span_notice("\The [src] finishes processing.")) +/obj/machinery/processor/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(processing) + to_chat(user, span_warning("[src] is in the process of processing!")) + return TRUE + + if(ismob(victim) && PROCESSOR_SELECT_RECIPE(victim)) + if(grab.current_grab.damage_stage < GRAB_AGGRESSIVE) + to_chat(user, span_warning("You need a better grip to do that!")) + return + var/mob/living/pushed_mob = victim + visible_message(span_warning("[user] stuffs [pushed_mob] into [src]!")) + qdel(grab) + pushed_mob.forceMove(src) + LAZYADD(processor_contents, pushed_mob) + return TRUE + /obj/machinery/processor/verb/eject() set category = "Object" set name = "Eject Contents" diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index cedd808625b5..506e79f5482e 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -221,7 +221,7 @@ if(!desired) return FALSE - if(QDELETED(src) || QDELETED(usr) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) // Sanity checkin' in case stupid stuff happens while we wait for input() + if(QDELETED(src) || QDELETED(usr) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) // Sanity checkin' in case stupid stuff happens while we wait for input() return FALSE for(var/obj/item/dispensed_item in src) @@ -416,22 +416,6 @@ /obj/machinery/smartfridge/extract/preloaded initial_contents = list(/obj/item/slime_scanner = 2) -// ------------------------------------- -// Cytology Petri Dish Smartfridge -// ------------------------------------- -/obj/machinery/smartfridge/petri - name = "smart petri dish storage" - desc = "A refrigerated storage unit for petri dishes." - base_build_path = /obj/machinery/smartfridge/petri - -/obj/machinery/smartfridge/petri/accept_check(obj/item/O) - if(istype(O, /obj/item/petri_dish)) - return TRUE - return FALSE - -/obj/machinery/smartfridge/petri/preloaded - initial_contents = list(/obj/item/petri_dish = 5) - // ------------------------- // Organ Surgery Smartfridge // ------------------------- @@ -459,7 +443,7 @@ . = ..() 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) * 0.5) + repair_rate = max(0, (0.1) * (B.rating - 1) * 0.5) /obj/machinery/smartfridge/organ/process(delta_time) for(var/obj/item/organ/organ in contents) @@ -509,9 +493,9 @@ /obj/machinery/smartfridge/chemistry/preloaded initial_contents = list( /obj/item/reagent_containers/pill/epinephrine = 12, - /obj/item/reagent_containers/pill/multiver = 5, + /obj/item/reagent_containers/pill/dylovene = 5, /obj/item/reagent_containers/glass/bottle/epinephrine = 1, - /obj/item/reagent_containers/glass/bottle/multiver = 1) + /obj/item/reagent_containers/glass/bottle/dylovene = 1) // ---------------------------- // Virology Medical Smartfridge @@ -529,8 +513,8 @@ /obj/item/reagent_containers/glass/bottle/mutagen = 1, /obj/item/reagent_containers/glass/bottle/sugar = 1, /obj/item/reagent_containers/glass/bottle/plasma = 1, - /obj/item/reagent_containers/glass/bottle/synaptizine = 1, - /obj/item/reagent_containers/glass/bottle/formaldehyde = 1) + /obj/item/reagent_containers/glass/bottle/synaptizine = 1 + ) // ---------------------------- // Disk """fridge""" diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index b7ee35be8c1c..1843fdc3e186 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -104,7 +104,7 @@ tag_overlay.pixel_y = box_offset . += tag_overlay -/obj/item/pizzabox/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/pizzabox/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() var/current_offset = 2 if(!isinhands) @@ -151,7 +151,7 @@ return else bomb_timer = tgui_input_number(user, "Set the bomb timer", "Pizza Bomb", bomb_timer, bomb_timer_max, bomb_timer_min) - if(!bomb_timer || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!bomb_timer || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return bomb_defused = FALSE log_bomber(user, "has trapped a", src, "with [bomb] set to [bomb_timer] seconds") @@ -220,7 +220,7 @@ return var/obj/item/pizzabox/box = boxes.len ? boxes[boxes.len] : src box.boxtag += tgui_input_text(user, "Write on [box]'s tag:", box, max_length = 30) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return to_chat(user, span_notice("You write with [I] on [src].")) boxtag_set = TRUE @@ -263,8 +263,6 @@ if(isobserver(user)) if(bomb) . += span_deadsay("This pizza box contains [bomb_defused ? "an unarmed bomb" : "an armed bomb"].") - if(pizza && istype(pizza, /obj/item/food/pizza/margherita/robo)) - . += span_deadsay("The pizza in this pizza box contains nanomachines.") /obj/item/pizzabox/proc/disperse_pizzas() visible_message(span_warning("The pizzas fall everywhere!")) @@ -309,9 +307,6 @@ /obj/item/pizzabox/margherita pizza = /obj/item/food/pizza/margherita -/obj/item/pizzabox/margherita/robo - pizza = /obj/item/food/pizza/margherita/robo - /obj/item/pizzabox/vegetable pizza = /obj/item/food/pizza/vegetable @@ -367,16 +362,11 @@ //list our ckey and assign it a favourite pizza if(!pizza_preferences[nommer.ckey]) - if(nommer.has_quirk(/datum/quirk/pineapple_liker)) - pizza_preferences[nommer.ckey] = /obj/item/food/pizza/pineapple - else if(nommer.has_quirk(/datum/quirk/pineapple_hater)) - var/list/pineapple_pizza_liker = pizza_types.Copy() - pineapple_pizza_liker -= /obj/item/food/pizza/pineapple - pizza_preferences[nommer.ckey] = pick_weight(pineapple_pizza_liker) - else if(nommer.mind?.assigned_role.title == /datum/job/botanist) + if(istype(nommer.mind?.assigned_role, /datum/job/botanist)) pizza_preferences[nommer.ckey] = /obj/item/food/pizza/dank else pizza_preferences[nommer.ckey] = pick_weight(pizza_types) + if(pizza) //if the pizza isn't our favourite, delete it if(pizza.type != pizza_preferences[nommer.ckey]) diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm index a91b8f272dd1..528b3903007c 100644 --- a/code/modules/food_and_drinks/plate.dm +++ b/code/modules/food_and_drinks/plate.dm @@ -71,7 +71,7 @@ /obj/item/plate/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(.) return - var/generator/scatter_gen = generator("circle", 0, 48, NORMAL_RAND) + var/generator/scatter_gen = generator(GEN_CIRCLE, 0, 48, NORMAL_RAND) var/scatter_turf = get_turf(hit_atom) for(var/obj/item/scattered_item as anything in contents) @@ -116,4 +116,4 @@ /obj/item/plate_shard/Initialize(mapload) . = ..() - AddComponent(/datum/component/caltrop, min_damage = force) + AddComponent(/datum/component/caltrop, min_damage = force, probability = 4) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index e014e45a6905..f09770b3c66d 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -3,13 +3,8 @@ /datum/chemical_reaction/drink optimal_temp = 250 temp_exponent_factor = 1 - optimal_ph_min = 2 - optimal_ph_max = 10 thermic_constant = 0 - H_ion_release = 0 rate_up_lim = 60 - purity_min = 0 - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY ////////////////////////////////////////// COCKTAILS ////////////////////////////////////// @@ -17,7 +12,6 @@ /datum/chemical_reaction/drink/goldschlager results = list(/datum/reagent/consumable/ethanol/goldschlager = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = GOLDSCHLAGER_VODKA, /datum/reagent/gold = GOLDSCHLAGER_GOLD) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY /datum/chemical_reaction/drink/patron results = list(/datum/reagent/consumable/ethanol/patron = 10) @@ -26,7 +20,6 @@ /datum/chemical_reaction/drink/bilk results = list(/datum/reagent/consumable/ethanol/bilk = 2) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ethanol/beer = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_BRUTE /datum/chemical_reaction/drink/icetea results = list(/datum/reagent/consumable/icetea = 4) @@ -36,10 +29,6 @@ results = list(/datum/reagent/consumable/icecoffee = 4) required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/consumable/coffee = 3) -/datum/chemical_reaction/drink/hoticecoffee - results = list(/datum/reagent/consumable/hot_ice_coffee = 3) - required_reagents = list(/datum/reagent/toxin/hot_ice = 1, /datum/reagent/consumable/coffee = 2) - /datum/chemical_reaction/drink/nuka_cola results = list(/datum/reagent/consumable/nuka_cola = 6) required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6) @@ -63,13 +52,11 @@ results = list(/datum/reagent/consumable/ethanol/vodka = 10) required_reagents = list(/datum/reagent/consumable/potato_juice = 10) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER /datum/chemical_reaction/drink/kahlua results = list(/datum/reagent/consumable/ethanol/kahlua = 5) required_reagents = list(/datum/reagent/consumable/coffee = 5, /datum/reagent/consumable/sugar = 5) required_catalysts = list(/datum/reagent/consumable/enzyme = 5) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER /datum/chemical_reaction/drink/gin_tonic results = list(/datum/reagent/consumable/ethanol/gintonic = 3) @@ -82,7 +69,7 @@ /datum/chemical_reaction/drink/cuba_libre results = list(/datum/reagent/consumable/ethanol/cuba_libre = 4) required_reagents = list(/datum/reagent/consumable/ethanol/rum_coke = 3, /datum/reagent/consumable/limejuice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/martini results = list(/datum/reagent/consumable/ethanol/martini = 3) @@ -107,36 +94,32 @@ /datum/chemical_reaction/drink/bloody_mary results = list(/datum/reagent/consumable/ethanol/bloody_mary = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/limejuice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/gargle_blaster results = list(/datum/reagent/consumable/ethanol/gargle_blaster = 5) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/ethanol/gin = 1, /datum/reagent/consumable/ethanol/whiskey = 1, /datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/lemonjuice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER -/datum/chemical_reaction/drink/brave_bull - results = list(/datum/reagent/consumable/ethanol/brave_bull = 3) - required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/ethanol/kahlua = 1) /datum/chemical_reaction/drink/tequila_sunrise results = list(/datum/reagent/consumable/ethanol/tequila_sunrise = 5) required_reagents = list(/datum/reagent/consumable/ethanol/tequila = 2, /datum/reagent/consumable/orangejuice = 2, /datum/reagent/consumable/grenadine = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/toxins_special results = list(/datum/reagent/consumable/ethanol/toxins_special = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/beepsky_smash results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/doctor_delight results = list(/datum/reagent/consumable/doctor_delight = 5) required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_BRUTE | REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY + /datum/chemical_reaction/drink/irish_cream results = list(/datum/reagent/consumable/ethanol/irish_cream = 3) @@ -145,12 +128,12 @@ /datum/chemical_reaction/drink/manly_dorf results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3) required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/greenbeer results = list(/datum/reagent/consumable/ethanol/beer/green = 10) required_reagents = list(/datum/reagent/colorful_reagent/powder/green = 1, /datum/reagent/consumable/ethanol/beer = 10) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/greenbeer2 //apparently there's no other way to do this results = list(/datum/reagent/consumable/ethanol/beer/green = 10) @@ -172,7 +155,7 @@ /datum/chemical_reaction/drink/atomicbomb results = list(/datum/reagent/consumable/ethanol/atomicbomb = 10) required_reagents = list(/datum/reagent/consumable/ethanol/b52 = 10, /datum/reagent/uranium = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/margarita results = list(/datum/reagent/consumable/ethanol/margarita = 4) @@ -185,7 +168,7 @@ /datum/chemical_reaction/drink/threemileisland results = list(/datum/reagent/consumable/ethanol/threemileisland = 10) required_reagents = list(/datum/reagent/consumable/ethanol/longislandicedtea = 10, /datum/reagent/uranium = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/whiskeysoda results = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3) @@ -197,7 +180,7 @@ /datum/chemical_reaction/drink/hiveminderaser results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4) - required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1) + required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/grenadine = 1) /datum/chemical_reaction/drink/manhattan results = list(/datum/reagent/consumable/ethanol/manhattan = 3) @@ -238,12 +221,12 @@ /datum/chemical_reaction/drink/antifreeze results = list(/datum/reagent/consumable/ethanol/antifreeze = 4) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/barefoot results = list(/datum/reagent/consumable/ethanol/barefoot = 3) required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/ethanol/vermouth = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/moscow_mule results = list(/datum/reagent/consumable/ethanol/moscow_mule = 10) @@ -263,7 +246,7 @@ /datum/chemical_reaction/drink/sbiten results = list(/datum/reagent/consumable/ethanol/sbiten = 10) required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 10, /datum/reagent/consumable/capsaicin = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/red_mead results = list(/datum/reagent/consumable/ethanol/red_mead = 2) @@ -277,7 +260,7 @@ /datum/chemical_reaction/drink/iced_beer results = list(/datum/reagent/consumable/ethanol/iced_beer = 6) required_reagents = list(/datum/reagent/consumable/ethanol/beer = 5, /datum/reagent/consumable/ice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/grog results = list(/datum/reagent/consumable/ethanol/grog = 2) @@ -294,17 +277,11 @@ /datum/chemical_reaction/drink/acidspit results = list(/datum/reagent/consumable/ethanol/acid_spit = 6) required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/consumable/ethanol/wine = 5) - optimal_ph_min = 0 //Our reaction is very acidic, so lets shift our range /datum/chemical_reaction/drink/amasec results = list(/datum/reagent/consumable/ethanol/amasec = 10) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/consumable/ethanol/wine = 5, /datum/reagent/consumable/ethanol/vodka = 5) -/datum/chemical_reaction/drink/changelingsting - results = list(/datum/reagent/consumable/ethanol/changelingsting = 5) - required_reagents = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 1, /datum/reagent/consumable/lemon_lime = 2) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER - /datum/chemical_reaction/drink/aloe results = list(/datum/reagent/consumable/ethanol/aloe = 2) required_reagents = list(/datum/reagent/consumable/ethanol/irish_cream = 1, /datum/reagent/consumable/watermelonjuice = 1) @@ -316,7 +293,7 @@ /datum/chemical_reaction/drink/neurotoxin results = list(/datum/reagent/consumable/ethanol/neurotoxin = 2) required_reagents = list(/datum/reagent/consumable/ethanol/gargle_blaster = 1, /datum/reagent/medicine/morphine = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/snowwhite results = list(/datum/reagent/consumable/ethanol/snowwhite = 2) @@ -341,27 +318,22 @@ /datum/chemical_reaction/drink/hippiesdelight results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2) required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/bananahonk results = list(/datum/reagent/consumable/ethanol/bananahonk = 2) required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/silencer results = list(/datum/reagent/consumable/ethanol/silencer = 3) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/driestmartini results = list(/datum/reagent/consumable/ethanol/driestmartini = 2) required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1) -/datum/chemical_reaction/drink/thirteenloko - results = list(/datum/reagent/consumable/ethanol/thirteenloko = 3) - required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 1, /datum/reagent/consumable/coffee = 1, /datum/reagent/consumable/limejuice = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER - /datum/chemical_reaction/drink/cherryshake results = list(/datum/reagent/consumable/cherryshake = 3) required_reagents = list(/datum/reagent/consumable/cherryjelly = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1) @@ -397,7 +369,6 @@ /datum/chemical_reaction/drink/triple_citrus results = list(/datum/reagent/consumable/triple_citrus = 5) required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1) - optimal_ph_min = 0//Our reaction is very acidic, so lets shift our range /datum/chemical_reaction/drink/grape_soda results = list(/datum/reagent/consumable/grape_soda = 2) @@ -418,13 +389,6 @@ required_reagents = list(/datum/reagent/consumable/nuka_cola = 1, /datum/reagent/iron = 1) //Manufacturable from only the mining station mix_message = "The mixture slightly vibrates before settling." -/datum/chemical_reaction/drink/hearty_punch - results = list(/datum/reagent/consumable/ethanol/hearty_punch = 1) //Very little, for balance reasons - required_reagents = list(/datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/syndicatebomb = 5, /datum/reagent/consumable/ethanol/absinthe = 5) - mix_message = "The mixture darkens to a healthy crimson." - required_temp = 315 //Piping hot! - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_BRUTE | REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY | REACTION_TAG_CLONE - /datum/chemical_reaction/drink/bacchus_blessing results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4) required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1) @@ -477,14 +441,14 @@ required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/demonsblood = 1) mix_message = "The mixture develops a sinister glow." mix_sound = 'sound/effects/singlebeat.ogg' - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/quadruplesec results = list(/datum/reagent/consumable/ethanol/quadruple_sec = 15) required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 5, /datum/reagent/consumable/triple_citrus = 5, /datum/reagent/consumable/grenadine = 5) mix_message = "The snap of a taser emanates clearly from the mixture as it settles." mix_sound = 'sound/weapons/taser.ogg' - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/grasshopper results = list(/datum/reagent/consumable/ethanol/grasshopper = 15) @@ -500,19 +464,12 @@ 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_sound = 'sound/items/airhorn2.ogg' - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER - -/datum/chemical_reaction/drink/bastion_bourbon - results = list(/datum/reagent/consumable/ethanol/bastion_bourbon = 2) - required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/creme_de_menthe = 1, /datum/reagent/consumable/triple_citrus = 1, /datum/reagent/consumable/berryjuice = 1) //herbal and minty, with a hint of citrus and berry - mix_message = "You catch an aroma of hot tea and fruits as the mix blends into a blue-green color." - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_BRUTE | REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY /datum/chemical_reaction/drink/squirt_cider results = list(/datum/reagent/consumable/ethanol/squirt_cider = 4) required_reagents = list(/datum/reagent/water = 2, /datum/reagent/consumable/tomatojuice = 2, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/salt = 1) mix_message = "The mix swirls and turns a bright red that reminds you of an apple's skin." - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/fringe_weaver results = list(/datum/reagent/consumable/ethanol/fringe_weaver = 10) @@ -523,13 +480,13 @@ results = list(/datum/reagent/consumable/ethanol/sugar_rush = 4) required_reagents = list(/datum/reagent/consumable/sugar = 2, /datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/ethanol/wine = 1) //2 adelhyde (sweet), 1 powdered delta (sour), 1 karmotrine (alcohol) mix_message = "The mixture bubbles and brightens into a girly pink." - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/crevice_spike results = list(/datum/reagent/consumable/ethanol/crevice_spike = 6) required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/capsaicin = 4) //2 powdered delta (sour), 4 flanergide (spicy) mix_message = "The mixture stings your eyes as it settles." - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/sake results = list(/datum/reagent/consumable/ethanol/sake = 10) @@ -541,12 +498,6 @@ results = list(/datum/reagent/consumable/ethanol/peppermint_patty = 10) required_reagents = list(/datum/reagent/consumable/hot_coco = 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 coco turns mint green just as the strong scent hits your nose." - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER - -/datum/chemical_reaction/drink/alexander - results = list(/datum/reagent/consumable/ethanol/alexander = 3) - required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER /datum/chemical_reaction/drink/sidecar results = list(/datum/reagent/consumable/ethanol/sidecar = 4) @@ -555,7 +506,7 @@ /datum/chemical_reaction/drink/between_the_sheets results = list(/datum/reagent/consumable/ethanol/between_the_sheets = 5) required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/ethanol/sidecar = 4) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/kamikaze results = list(/datum/reagent/consumable/ethanol/kamikaze = 3) @@ -568,7 +519,7 @@ /datum/chemical_reaction/drink/fernet_cola results = list(/datum/reagent/consumable/ethanol/fernet_cola = 2) required_reagents = list(/datum/reagent/consumable/ethanol/fernet = 1, /datum/reagent/consumable/space_cola = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_TOXIN + /datum/chemical_reaction/drink/fanciulli @@ -589,7 +540,7 @@ required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 1, /datum/reagent/consumable/sodawater = 1, /datum/reagent/consumable/ethanol/champagne = 1) mix_message = "The beverage starts to froth with an almost mystical zeal!" mix_sound = 'sound/effects/bubbles2.ogg' - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/bug_spray @@ -597,7 +548,7 @@ required_reagents = list(/datum/reagent/consumable/ethanol/triple_sec = 2, /datum/reagent/consumable/lemon_lime = 1, /datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vodka = 1) mix_message = "The faint aroma of summer camping trips wafts through the air; but what's that buzzing noise?" mix_sound = 'sound/creatures/bee.ogg' - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/jack_rose results = list(/datum/reagent/consumable/ethanol/jack_rose = 4) @@ -606,18 +557,18 @@ /datum/chemical_reaction/drink/turbo results = list(/datum/reagent/consumable/ethanol/turbo = 5) - required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1) + /datum/chemical_reaction/drink/old_timer results = list(/datum/reagent/consumable/ethanol/old_timer = 6) - required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2) + /datum/chemical_reaction/drink/rubberneck results = list(/datum/reagent/consumable/ethanol/rubberneck = 10) required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/duplex results = list(/datum/reagent/consumable/ethanol/duplex = 4) @@ -626,7 +577,7 @@ /datum/chemical_reaction/drink/trappist results = list(/datum/reagent/consumable/ethanol/trappist = 5) required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/cream_soda results = list(/datum/reagent/consumable/cream_soda = 4) @@ -634,12 +585,11 @@ /datum/chemical_reaction/drink/blazaam results = list(/datum/reagent/consumable/ethanol/blazaam = 3) - required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1) /datum/chemical_reaction/drink/planet_cracker results = list(/datum/reagent/consumable/ethanol/planet_cracker = 20) - required_reagents = list(/datum/reagent/consumable/ethanol/champagne = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/consumable/eggyolk = 2, /datum/reagent/gold = 5) + required_reagents = list(/datum/reagent/consumable/ethanol/champagne = 10, /datum/reagent/consumable/eggyolk = 2, /datum/reagent/gold = 5) mix_message = "The liquid's color starts shifting as the nanogold is alternately corroded and redeposited." /datum/chemical_reaction/drink/red_queen @@ -649,7 +599,7 @@ /datum/chemical_reaction/drink/mauna_loa results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5) required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2) - reaction_tags = REACTION_TAG_DRINK | REACTION_TAG_EASY | REACTION_TAG_OTHER + /datum/chemical_reaction/drink/godfather results = list(/datum/reagent/consumable/ethanol/godfather = 2) @@ -700,7 +650,7 @@ /datum/chemical_reaction/drink/the_juice results = list(/datum/reagent/consumable/ethanol/the_juice = 5) - required_reagents = list(/datum/reagent/consumable/mushroom_tea = 1, /datum/reagent/bluespace = 1, /datum/reagent/toxin/mindbreaker = 1, /datum/reagent/consumable/ethanol/neurotoxin = 1, /datum/reagent/medicine/morphine = 1) + required_reagents = list(/datum/reagent/consumable/mushroom_tea = 1, /datum/reagent/toxin/mindbreaker = 1, /datum/reagent/consumable/ethanol/neurotoxin = 1, /datum/reagent/medicine/morphine = 1) mix_message = "The liquids all swirl together into a deep purple." /datum/chemical_reaction/drink/admiralty @@ -725,7 +675,7 @@ /datum/chemical_reaction/drink/salt_and_swell results = list(/datum/reagent/consumable/ethanol/salt_and_swell = 10) - required_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 4, /datum/reagent/consumable/toechtauese_syrup = 3, /datum/reagent/consumable/eggwhite = 2, /datum/reagent/medicine/salglu_solution = 1) + required_reagents = list(/datum/reagent/consumable/ethanol/navy_rum = 4, /datum/reagent/consumable/toechtauese_syrup = 3, /datum/reagent/consumable/eggwhite = 2, /datum/reagent/medicine/saline_glucose = 1) /datum/chemical_reaction/drink/tiltaellen results = list(/datum/reagent/consumable/ethanol/tiltaellen = 10) diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index c5b9c064107f..90515f4f6a08 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -12,11 +12,8 @@ /datum/chemical_reaction/food optimal_temp = 400 temp_exponent_factor = 1 - optimal_ph_min = 2 - optimal_ph_max = 10 thermic_constant = 0 - H_ion_release = 0 - reaction_tags = REACTION_TAG_FOOD | REACTION_TAG_EASY + /datum/chemical_reaction/food/tofu required_reagents = list(/datum/reagent/consumable/soymilk = 10) @@ -175,35 +172,23 @@ /datum/chemical_reaction/food/nutriconversion results = list(/datum/reagent/consumable/nutriment/peptides = 0.5) required_reagents = list(/datum/reagent/consumable/nutriment/ = 0.5) - required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5) + required_catalysts = list(/datum/reagent/metafactor = 0.5) /datum/chemical_reaction/food/protein_peptide results = list(/datum/reagent/consumable/nutriment/peptides = 0.5) required_reagents = list(/datum/reagent/consumable/nutriment/protein = 0.5) - required_catalysts = list(/datum/reagent/medicine/metafactor = 0.5) - -/datum/chemical_reaction/food/failed_nutriconversion - results = list(/datum/reagent/peptides_failed = 0.5) - required_reagents = list(/datum/reagent/consumable/nutriment/ = 0.5) - required_catalysts = list(/datum/reagent/impurity/probital_failed = 0.5) - thermic_constant = 100 // a tell - -/datum/chemical_reaction/food/failed_protein_peptide - results = list(/datum/reagent/peptides_failed = 0.5) - required_reagents = list(/datum/reagent/consumable/nutriment/protein = 0.5) - required_catalysts = list(/datum/reagent/impurity/probital_failed = 0.5) - thermic_constant = 100 // a tell + required_catalysts = list(/datum/reagent/metafactor = 0.5) /datum/chemical_reaction/food/bbqsauce results = list(/datum/reagent/consumable/bbqsauce = 5) - required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/salglu_solution = 3, /datum/reagent/consumable/blackpepper = 1) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/medicine/saline_glucose = 3, /datum/reagent/consumable/blackpepper = 1) /datum/chemical_reaction/food/gravy results = list(/datum/reagent/consumable/gravy = 3) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/flour = 1) /datum/chemical_reaction/food/mothic_pizza_dough - required_reagents = list(/datum/reagent/consumable/milk = 5, /datum/reagent/consumable/quality_oil = 2, /datum/reagent/medicine/salglu_solution = 5, /datum/reagent/consumable/cornmeal = 10, /datum/reagent/consumable/flour = 5) + required_reagents = list(/datum/reagent/consumable/milk = 5, /datum/reagent/consumable/quality_oil = 2, /datum/reagent/medicine/saline_glucose = 5, /datum/reagent/consumable/cornmeal = 10, /datum/reagent/consumable/flour = 5) mix_message = "The ingredients form a pizza dough." reaction_flags = REACTION_INSTANT diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm index bd638208e71c..7694f61c7cae 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_cake.dm @@ -228,7 +228,6 @@ /obj/item/food/meat/slab = 3, /datum/reagent/blood = 30, /datum/reagent/consumable/sprinkles = 5, - /datum/reagent/teslium = 1 //To shock the whole thing into life ) result = /mob/living/simple_animal/pet/cat/cak subcategory = CAT_CAKE //Cat! Haha, get it? CAT? GET IT? We get it - Love Felines 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 11ae8ce0bcd5..d751b8ecc163 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_drink.dm @@ -3,17 +3,6 @@ ///////////////// Booze & Bottles /////////////////// -/datum/crafting_recipe/lizardwine - name = "Unathi Wine" - time = 40 - reqs = list( - /obj/item/organ/tail/lizard = 1, - /datum/reagent/consumable/ethanol = 100 - ) - blacklist = list(/obj/item/organ/tail/lizard/fake) - result = /obj/item/reagent_containers/food/drinks/bottle/lizardwine - category = CAT_DRINK - /datum/crafting_recipe/moonshinejug name = "Moonshine Jug" time = 30 diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm index a9d662a144d5..7cd48127ec54 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_frozen.dm @@ -223,16 +223,6 @@ result = /obj/item/food/snowcones/spacemountainwind subcategory = CAT_ICE -/datum/crafting_recipe/food/pwrgame_sc - name = "Pwrgame snowcone" - reqs = list( - /obj/item/reagent_containers/food/drinks/sillycup = 1, - /datum/reagent/consumable/ice = 15, - /datum/reagent/consumable/pwr_game = 15 - ) - result = /obj/item/food/snowcones/pwrgame - subcategory = CAT_ICE - /datum/crafting_recipe/food/honey_sc name = "Honey snowcone" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm index 6ec6c434855e..f623609d7aa4 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_lizard.dm @@ -1,5 +1,5 @@ /datum/crafting_recipe/food/tiziran_sausage - name = "Raw Tiziran blood sausage" + name = "Raw Jitan blood sausage" reqs = list( /obj/item/food/meat/rawcutlet = 1, /obj/item/food/meat/rawbacon = 1, @@ -262,17 +262,6 @@ result = /obj/item/food/pizza/imperial_flatbread subcategory = CAT_LIZARD -/datum/crafting_recipe/food/emperor_roll - name = "Emperor roll" - reqs = list( - /obj/item/food/rootroll = 1, - /obj/item/food/liver_pate = 1, - /obj/item/food/headcheese_slice = 2, - /obj/item/food/moonfish_caviar = 1 - ) - result = /obj/item/food/emperor_roll - subcategory = CAT_LIZARD - /datum/crafting_recipe/food/honey_sweetroll name = "Honey sweetroll" reqs = list( @@ -312,7 +301,7 @@ subcategory = CAT_LIZARD /datum/crafting_recipe/food/black_broth - name = "Tiziran black broth" + name = "Jitarai black broth" reqs = list( /obj/item/reagent_containers/glass/bowl = 1, /obj/item/food/tiziran_sausage = 1, @@ -413,19 +402,10 @@ subcategory = CAT_LIZARD /datum/crafting_recipe/food/lizard_dumplings - name = "Tiziran dumplings" + name = "Jitarai dumplings" reqs = list( /obj/item/food/grown/potato = 1, /datum/reagent/consumable/korta_flour = 5 ) result = /obj/item/food/lizard_dumplings subcategory = CAT_LIZARD - -/datum/crafting_recipe/food/steeped_mushrooms - name = "Steeped mushrooms" - reqs = list( - /obj/item/food/grown/ash_flora/seraka = 1, - /datum/reagent/lye = 5 - ) - result = /obj/item/food/steeped_mushrooms - subcategory = CAT_LIZARD diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm index 7b601ce692aa..368032dccbe1 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm @@ -29,15 +29,6 @@ result = /obj/item/food/kebab/tofu subcategory = CAT_MEAT -/datum/crafting_recipe/food/tailkebab - name = "Unathi tail kebab" - reqs = list( - /obj/item/stack/rods = 1, - /obj/item/organ/tail/lizard = 1 - ) - result = /obj/item/food/kebab/tail - subcategory = CAT_MEAT - /datum/crafting_recipe/food/fiestaskewer name = "Fiesta Skewer" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 0815aa6433e0..b51ac70fdb9f 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -167,7 +167,6 @@ /obj/item/food/butter = 10, /obj/item/food/meat/slab = 5, /datum/reagent/blood = 50, - /datum/reagent/teslium = 1 //To shock the whole thing into life ) result = /mob/living/simple_animal/hostile/bear/butter subcategory = CAT_MISCFOOD 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 e47a891592a1..9863c2fb8279 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm @@ -60,7 +60,7 @@ /datum/crafting_recipe/food/donut/trumpet name = "Spaceman's Donut" reqs = list( - /datum/reagent/medicine/polypyr = 3, + /datum/reagent/medicine/tricordrazine = 3, /obj/item/food/donut/plain = 1 ) @@ -135,7 +135,7 @@ /datum/crafting_recipe/food/donut/jelly/trumpet name = "Spaceman's Jelly Donut" reqs = list( - /datum/reagent/medicine/polypyr = 3, + /datum/reagent/medicine/tricordrazine = 3, /obj/item/food/donut/jelly/plain = 1 ) @@ -210,7 +210,7 @@ /datum/crafting_recipe/food/donut/slimejelly/trumpet name = "Spaceman's Slime Donut" reqs = list( - /datum/reagent/medicine/polypyr = 3, + /datum/reagent/medicine/tricordrazine = 3, /obj/item/food/donut/jelly/slimejelly/plain = 1 ) @@ -388,17 +388,6 @@ result = /obj/item/food/donkpocket/berry subcategory = CAT_PASTRY -/datum/crafting_recipe/food/donkpocket/gondola - time = 15 - name = "Gondola-pocket" - reqs = list( - /obj/item/food/pastrybase = 1, - /obj/item/food/meatball = 1, - /datum/reagent/gondola_mutation_toxin = 5 - ) - result = /obj/item/food/donkpocket/gondola - subcategory = CAT_PASTRY - ////////////////////////////////////////////////MUFFINS//////////////////////////////////////////////// /datum/crafting_recipe/food/muffin diff --git a/code/modules/food_and_drinks/restaurant/customers/_customer.dm b/code/modules/food_and_drinks/restaurant/customers/_customer.dm index a8e04a01efab..1ae87f5f8428 100644 --- a/code/modules/food_and_drinks/restaurant/customers/_customer.dm +++ b/code/modules/food_and_drinks/restaurant/customers/_customer.dm @@ -212,7 +212,6 @@ /datum/reagent/consumable/chocolatepudding = 4, /datum/reagent/consumable/tea = 4, /datum/reagent/consumable/cherryshake = 1, - /datum/reagent/consumable/ethanol/bastion_bourbon = 1, ), ) @@ -351,7 +350,6 @@ /datum/reagent/consumable/ethanol/tequila_sunrise = 1, /datum/reagent/consumable/ethanol/beer = 15, /datum/reagent/consumable/ethanol/patron = 5, - /datum/reagent/consumable/ethanol/brave_bull = 5, /datum/reagent/consumable/ethanol/margarita = 8, ), ) @@ -437,12 +435,6 @@ /obj/item/toy/crayon/purple = 1, /obj/item/food/canned/peaches/maint = 6, ), - VENUE_BAR = list( - /datum/reagent/consumable/failed_reaction = 1, - /datum/reagent/spraytan = 1, - /datum/reagent/reaction_agent/basic_buffer = 1, - /datum/reagent/reaction_agent/acidic_buffer = 1, - ), ) found_seat_lines = list("customer_pawn.say(pick(customer_data.found_seat_lines))", "I saw your sector on the hub. What are the laws of this land?", "The move speed here is a bit low...") diff --git a/code/modules/grab/grab_carbon.dm b/code/modules/grab/grab_carbon.dm new file mode 100644 index 000000000000..2f0f22e4910b --- /dev/null +++ b/code/modules/grab/grab_carbon.dm @@ -0,0 +1,3 @@ +// We're changing the default grab type here. +/mob/living/carbon/make_grab(atom/movable/target, grab_type = /datum/grab/normal/passive) + . = ..() diff --git a/code/modules/grab/grab_datum.dm b/code/modules/grab/grab_datum.dm new file mode 100644 index 000000000000..675a1ded179d --- /dev/null +++ b/code/modules/grab/grab_datum.dm @@ -0,0 +1,445 @@ +/// An associative list of type:instance for grab datums +GLOBAL_LIST_EMPTY(all_grabstates) +/datum/grab + abstract_type = /datum/grab + var/icon = 'icons/hud/screen_gen.dmi' + var/icon_state + + /// The grab that this will upgrade to if it upgrades, null means no upgrade + var/datum/grab/upgrab + /// The grab that this will downgrade to if it downgrades, null means break grab on downgrade + var/datum/grab/downgrab + + // Whether or not the grabbed person can move out of the grab + var/stop_move = FALSE + // Whether the assailant is facing forwards or backwards. + var/reverse_facing = FALSE + /// Whether this grab state is strong enough to, as a changeling, absorb the person you're grabbing. + var/can_absorb = FALSE + /// How much the grab increases point blank damage. + var/point_blank_mult = 1 + /// Affects how much damage is being dealt using certain actions. + var/damage_stage = GRAB_PASSIVE + /// If the grabbed person and the grabbing person are on the same tile. + var/same_tile = FALSE + /// If the grabber can throw the person grabbed. + var/can_throw = FALSE + /// If the grab needs to be downgraded when the grabber does stuff. + var/downgrade_on_action = FALSE + /// If the grab needs to be downgraded when the grabber moves. + var/downgrade_on_move = FALSE + /// If the grab is strong enough to be able to force someone to do something harmful to them, like slam their head into glass. + var/enable_violent_interactions = FALSE + /// If the grab acts like cuffs and prevents action from the victim. + var/restrains = FALSE + + var/grab_slowdown = 0 + + var/shift = 0 + + var/success_up = "You upgrade the grab." + var/success_down = "You downgrade the grab." + + var/fail_up = "You fail to upgrade the grab." + var/fail_down = "You fail to downgrade the grab." + + var/upgrade_cooldown = 4 SECONDS + var/action_cooldown = 4 SECONDS + + var/can_downgrade_on_resist = TRUE + + /// The baseline index of break_chance_table, before modifiers. This can be higher than the length of break_chance_table. + var/breakability = 2 + var/list/break_chance_table = list(100) + + var/can_grab_self = TRUE + + // The names of different intents for use in attack logs + var/help_action = "" + var/disarm_action = "" + var/grab_action = "" + var/harm_action = "" + +/* + These procs shouldn't be overriden in the children unless you know what you're doing with them; they handle important core functions. + Even if you do override them, you should likely be using ..() if you want the behaviour to function properly. That is, of course, + unless you're writing your own custom handling of things. +*/ +/// Called during world/New to setup references. +/datum/grab/proc/refresh_updown() + if(upgrab) + upgrab = GLOB.all_grabstates[upgrab] + + if(downgrab) + downgrab = GLOB.all_grabstates[downgrab] + +/// Called by the grab item's setup() proc. May return FALSE to interrupt, otherwise the grab has succeeded. +/datum/grab/proc/setup(obj/item/hand_item/grab) + SHOULD_CALL_PARENT(TRUE) + return TRUE + +// This is for the strings defined as datum variables. It takes them and swaps out keywords for relevent ones from the grab +// object involved. +/datum/grab/proc/string_process(obj/item/hand_item/grab/G, to_write, obj/item/used_item) + to_write = replacetext(to_write, "rep_affecting", G.affecting) + to_write = replacetext(to_write, "rep_assailant", G.assailant) + if(used_item) + to_write = replacetext(to_write, "rep_item", used_item) + return to_write + +/datum/grab/proc/upgrade(obj/item/hand_item/grab/G) + if(!upgrab) + return + + if (can_upgrade(G)) + upgrade_effect(G) + return upgrab + else + to_chat(G.assailant, span_warning("[string_process(G, fail_up)]")) + return + +/datum/grab/proc/downgrade(obj/item/hand_item/grab/G) + // Starts the process of letting go if there's no downgrade grab + if(can_downgrade()) + downgrade_effect(G) + return downgrab + else + to_chat(G.assailant, span_warning("[string_process(G, fail_down)]")) + return + +/datum/grab/proc/let_go(obj/item/hand_item/grab/G) + SHOULD_NOT_OVERRIDE(TRUE) + if(!G) + return + + let_go_effect(G) + + if(!QDELETED(G)) + qdel(G) + +/datum/grab/proc/on_target_change(obj/item/hand_item/grab/G, old_zone, new_zone) + remove_bodyzone_effects(G, old_zone, new_zone) + G.special_target_functional = check_special_target(G) + if(G.special_target_functional) + special_bodyzone_change(G, old_zone, new_zone) + special_bodyzone_effects(G) + +/datum/grab/proc/hit_with_grab(obj/item/hand_item/grab/G, atom/target, params) + if(G.is_currently_resolving_hit) + return FALSE + + if(!COOLDOWN_FINISHED(G, action_cd)) + to_chat(G.assailant, span_warning("You must wait [round(COOLDOWN_TIMELEFT(G, action_cd) * 0.1, 0.1)] seconds before you can perform a grab action.")) + return FALSE + + if(downgrade_on_action) + G.downgrade() + + G.is_currently_resolving_hit = TRUE + + var/combat_mode = G.assailant.combat_mode + if(params[RIGHT_CLICK]) + if(on_hit_disarm(G, target)) + . = disarm_action || TRUE + + else if(params[CTRL_CLICK]) + if(on_hit_grab(G, target)) + . = grab_action || TRUE + + + else if(combat_mode) + if(on_hit_harm(G, target)) + . = harm_action || TRUE + else + if(on_hit_help(G, target)) + . = help_action || TRUE + + if(QDELETED(G)) + return + + G.is_currently_resolving_hit = FALSE + + if(!.) + return + + G.action_used() + if(G.assailant) + G.assailant.changeNext_move(CLICK_CD_GRABBING) + if(istext(.) && G.affecting) + make_log(G, "used [.] on") + + if(downgrade_on_action) + G.downgrade() + +/datum/grab/proc/make_log(obj/item/hand_item/grab/G, action) + log_combat(G.assailant, G.affecting, "[action] their victim") + +/* + Override these procs to set how the grab state will work. Some of them are best + overriden in the parent of the grab set (for example, the behaviour for on_hit_intent(var/obj/item/hand_item/grab/G) + procs is determined in /datum/grab/normal and then inherited by each intent). +*/ + +// What happens when you upgrade from one grab state to the next. +/datum/grab/proc/upgrade_effect(obj/item/hand_item/grab/G, datum/grab/old_grab) + SHOULD_CALL_PARENT(TRUE) + + G.remove_competing_grabs() + update_stage_effects(G, old_grab) + +// Conditions to see if upgrading is possible +/datum/grab/proc/can_upgrade(obj/item/hand_item/grab/G) + if(!upgrab) + return FALSE + + var/mob/living/L = G.get_affecting_mob() + if(!isliving(L)) + return FALSE + + if(!(L.status_flags & CANPUSH) || HAS_TRAIT(L, TRAIT_PUSHIMMUNE)) + to_chat(G.assailant, span_warning("[src] can't be grabbed more aggressively!")) + return FALSE + + if(upgrab.damage_stage >= GRAB_AGGRESSIVE && HAS_TRAIT(G.assailant, TRAIT_PACIFISM)) + to_chat(G.assailant, span_warning("You don't want to risk hurting [src]!")) + return FALSE + + for(var/obj/item/hand_item/grab/other_grab in L.grabbed_by - G) + if(other_grab.assailant.move_force > G.assailant.move_force) + to_chat(G.assailant, span_warning("[G.assailant]'s grip is too strong.")) + return FALSE + return TRUE + +// What happens when you downgrade from one grab state to the next. +/datum/grab/proc/downgrade_effect(obj/item/hand_item/grab/G, datum/grab/old_grab) + update_stage_effects(G, old_grab) + +// Conditions to see if downgrading is possible +/datum/grab/proc/can_downgrade(obj/item/hand_item/grab/G) + return TRUE + +// What happens when you let go of someone by either dropping the grab +// or by downgrading from the lowest grab state. +/datum/grab/proc/let_go_effect(obj/item/hand_item/grab/G) + SEND_SIGNAL(G.affecting, COMSIG_ATOM_NO_LONGER_GRABBED, G.assailant) + SEND_SIGNAL(G.assailant, COMSIG_LIVING_NO_LONGER_GRABBING, G.affecting) + + remove_bodyzone_effects(G, G.target_zone) + if(G.is_grab_unique(src)) + remove_unique_grab_effects(G) + + update_stage_effects(G, src, TRUE) + +/// Add effects that apply based on damage_stage here +/datum/grab/proc/update_stage_effects(obj/item/hand_item/grab/G, datum/grab/old_grab, dropping_grab) + var/old_damage_stage = old_grab?.damage_stage || GRAB_PASSIVE + var/new_stage = dropping_grab ? GRAB_PASSIVE : damage_stage + + switch(new_stage) // Current state. + if(GRAB_PASSIVE) + REMOVE_TRAIT(G.affecting, TRAIT_IMMOBILIZED, REF(G)) + REMOVE_TRAIT(G.affecting, TRAIT_HANDS_BLOCKED, REF(G)) + if(old_damage_stage >= GRAB_AGGRESSIVE) + REMOVE_TRAIT(G.affecting, TRAIT_AGGRESSIVE_GRAB, REF(G)) + REMOVE_TRAIT(G.affecting, TRAIT_FLOORED, REF(G)) + + if(GRAB_AGGRESSIVE) + if(old_damage_stage >= GRAB_NECK) // Grab got downgraded. + REMOVE_TRAIT(G.affecting, TRAIT_FLOORED, REF(G)) + else // Grab got upgraded from a passive one. + ADD_TRAIT(G.affecting, TRAIT_IMMOBILIZED, REF(G)) + ADD_TRAIT(G.affecting, TRAIT_HANDS_BLOCKED, REF(G)) + ADD_TRAIT(G.affecting, TRAIT_AGGRESSIVE_GRAB, REF(G)) + + if(GRAB_NECK, GRAB_KILL) + if(old_damage_stage < GRAB_AGGRESSIVE) + ADD_TRAIT(G.affecting, TRAIT_AGGRESSIVE_GRAB, REF(G)) + if(old_damage_stage <= GRAB_AGGRESSIVE) + ADD_TRAIT(G.affecting, TRAIT_FLOORED, REF(G)) + ADD_TRAIT(G.affecting, TRAIT_HANDS_BLOCKED, REF(G)) + ADD_TRAIT(G.affecting, TRAIT_IMMOBILIZED, REF(G)) + + +/// Apply effects that should only be applied when a grab type is first used on a mob. +/datum/grab/proc/apply_unique_grab_effects(obj/item/hand_item/grab/G) + SHOULD_CALL_PARENT(TRUE) + if(same_tile && ismob(G.affecting)) + G.affecting.add_passmob(REF(G)) + +/// Remove effects added by apply_unique_grab_effects() +/datum/grab/proc/remove_unique_grab_effects(obj/item/hand_item/grab/G) + SHOULD_CALL_PARENT(TRUE) + if(same_tile && ismob(G.affecting)) + G.affecting.remove_passmob(REF(G)) + +/// Handles special targeting like eyes and mouth being covered. +/// CLEAR OUT ANY EFFECTS USING remove_bodyzone_effects() +/datum/grab/proc/special_bodyzone_effects(obj/item/hand_item/grab/G) + SHOULD_CALL_PARENT(TRUE) + var/mob/living/carbon/C = G.affecting + if(!istype(C)) + return + + var/obj/item/bodypart/BP = C.get_bodypart(deprecise_zone(G.target_zone)) + if(!BP) + return + + ADD_TRAIT(BP, TRAIT_BODYPART_GRABBED, REF(G)) + +/// Clear out any effects from special_bodyzone_effects() +/datum/grab/proc/remove_bodyzone_effects(obj/item/hand_item/grab/G, old_zone, new_zone) + SHOULD_CALL_PARENT(TRUE) + var/mob/living/carbon/C = G.affecting + if(!istype(C)) + return + + var/obj/item/bodypart/BP = C.get_bodypart(deprecise_zone(old_zone)) + if(!BP) + return + + REMOVE_TRAIT(BP, TRAIT_BODYPART_GRABBED, REF(G)) + +// Handles when they change targeted areas and something is supposed to happen. +/datum/grab/proc/special_bodyzone_change(obj/item/hand_item/grab/G, diff_zone) + +// Checks if the special target works on the grabbed humanoid. +/datum/grab/proc/check_special_target(obj/item/hand_item/grab/G) + +// What happens when you hit the grabbed person with the grab on help intent. +/datum/grab/proc/on_hit_help(obj/item/hand_item/grab/G) + return FALSE + +// What happens when you hit the grabbed person with the grab on disarm intent. +/datum/grab/proc/on_hit_disarm(obj/item/hand_item/grab/G) + return FALSE + +// What happens when you hit the grabbed person with the grab on grab intent. +/datum/grab/proc/on_hit_grab(obj/item/hand_item/grab/G) + return FALSE + +// What happens when you hit the grabbed person with the grab on harm intent. +/datum/grab/proc/on_hit_harm(obj/item/hand_item/grab/G) + return FALSE + +// What happens when you hit the grabbed person with an open hand and you want it +// to do some special snowflake action based on some other factor such as +// intent. +/datum/grab/proc/resolve_openhand_attack(obj/item/hand_item/grab/G) + return FALSE + +// Used when you want an effect to happen when the grab enters this state as an upgrade +/// Return TRUE unless the grab state is changing during this proc (for example, calling upgrade()) +/datum/grab/proc/enter_as_up(obj/item/hand_item/grab/G, silent) + SHOULD_CALL_PARENT(TRUE) + return TRUE + +// Used when you want an effect to happen when the grab enters this state as a downgrade +/// Return TRUE unless the grab state is changing during this proc (for example, calling upgrade()) +/datum/grab/proc/enter_as_down(obj/item/hand_item/grab/G, silent) + SHOULD_CALL_PARENT(TRUE) + return TRUE + +/datum/grab/proc/item_attack(obj/item/hand_item/grab/G, obj/item) + +/datum/grab/proc/resolve_item_attack(obj/item/hand_item/grab/G, mob/living/carbon/human/user, obj/item/I, target_zone) + return FALSE + +/// Handle resist actions from the affected mob. Returns TRUE if the grab was broken. +/datum/grab/proc/handle_resist(obj/item/hand_item/grab/G) + var/mob/living/carbon/human/affecting = G.affecting + var/mob/living/carbon/human/assailant = G.assailant + + var/break_strength = breakability + size_difference(affecting, assailant) + var/affecting_shock = affecting.getPain() + var/assailant_shock = assailant.getPain() + + // Target modifiers + if(affecting.incapacitated(IGNORE_GRAB)) + break_strength-- + if(affecting.has_status_effect(/datum/status_effect/confusion)) + break_strength-- + if(affecting.eye_blind || HAS_TRAIT(affecting, TRAIT_BLIND)) + break_strength-- + if(affecting.eye_blurry) + break_strength-- + if(affecting_shock >= 10) + break_strength-- + if(affecting_shock >= 30) + break_strength-- + if(affecting_shock >= 50) + break_strength-- + + // User modifiers + if(assailant.has_status_effect(/datum/status_effect/confusion)) + break_strength++ + if(assailant.eye_blind || HAS_TRAIT(assailant, TRAIT_BLIND)) + break_strength++ + if(assailant.eye_blurry) + break_strength++ + if(assailant_shock >= 10) + break_strength++ + if(assailant_shock >= 30) + break_strength++ + if(assailant_shock >= 50) + break_strength++ + + if(break_strength < 1) + to_chat(G.affecting, span_warning("You try to break free but feel that unless something changes, you'll never escape!")) + return FALSE + + if (assailant.incapacitated(IGNORE_GRAB)) + qdel(G) + stack_trace("Someone resisted a grab while the assailant was incapacitated. This shouldn't ever happen.") + return TRUE + + var/break_chance = break_chance_table[clamp(break_strength, 1, length(break_chance_table))] + if(prob(break_chance)) + if(can_downgrade_on_resist && !prob((break_chance+100)/2)) + affecting.visible_message(span_danger("[affecting] has loosened [assailant]'s grip!"), vision_distance = COMBAT_MESSAGE_RANGE) + G.downgrade() + return FALSE + else + affecting.visible_message(span_danger("[affecting] has broken free of [assailant]'s grip!"), vision_distance = COMBAT_MESSAGE_RANGE) + qdel(G) + return TRUE + +/datum/grab/proc/size_difference(mob/living/A, mob/living/B) + return mob_size_difference(A.mob_size, B.mob_size) + +/datum/grab/proc/moved_effect(obj/item/hand_item/grab/G) + return + +/// Add screentip context, user will always be assailant. +/datum/grab/proc/add_context(list/context, obj/item/held_item, mob/living/user, atom/movable/target) + if(!(isgrab(held_item) && held_item:current_grab == src)) + return + + if(disarm_action) + context[SCREENTIP_CONTEXT_RMB] = capitalize(disarm_action) + + if(grab_action) + context[SCREENTIP_CONTEXT_CTRL_LMB] = capitalize(grab_action) + + if(user.combat_mode) + if(harm_action) + context[SCREENTIP_CONTEXT_LMB] = capitalize(harm_action) + + else if(help_action) + context[SCREENTIP_CONTEXT_LMB] = capitalize(help_action) + +/datum/grab/proc/get_grab_offsets(obj/item/hand_item/grab/G, grab_direction, pixel_x_pointer, pixel_y_pointer) + if(!grab_direction || !G.current_grab.shift) + return + + if(grab_direction & WEST) + *pixel_x_pointer = min(*pixel_x_pointer + shift, G.affecting.base_pixel_x + shift) + + else if(grab_direction & EAST) + *pixel_x_pointer = max(*pixel_x_pointer - shift, G.affecting.base_pixel_x - shift) + + if(grab_direction & NORTH) + *pixel_y_pointer = max(*pixel_y_pointer - shift, G.affecting.base_pixel_y - shift) + + else if(grab_direction & SOUTH) + *pixel_y_pointer = min(*pixel_y_pointer + shift, G.affecting.base_pixel_y + shift) + diff --git a/code/modules/grab/grab_helpers.dm b/code/modules/grab/grab_helpers.dm new file mode 100644 index 000000000000..e0c3ba2e0495 --- /dev/null +++ b/code/modules/grab/grab_helpers.dm @@ -0,0 +1,85 @@ +/// Returns TRUE if src is grabbing hold of the target +/mob/living/proc/is_grabbing(atom/movable/AM) + RETURN_TYPE(/obj/item/hand_item/grab) + for(var/obj/item/hand_item/grab/G in active_grabs) + if(G.affecting == AM) + return G + +/// Release all grabs we have +/mob/living/proc/release_all_grabs() + for(var/obj/item/hand_item/grab/G in active_grabs) + qdel(G) + +/// Release the given movable from a grab +/mob/living/proc/release_grabs(atom/movable/AM) + for(var/obj/item/hand_item/grab/G in active_grabs) + if(G.affecting == AM) + qdel(G) + +/// Returns the currently selected grab item +/mob/living/proc/get_active_grab() + RETURN_TYPE(/obj/item/hand_item/grab) + var/obj/item/hand_item/grab/G = locate() in src + return G + +/mob/living/carbon/get_active_grab() + RETURN_TYPE(/obj/item/hand_item/grab) + var/item = get_active_held_item() + if(isgrab(item)) + return item + return ..() + +/// Releases the currently selected grab item +/mob/living/proc/release_active_grab() + qdel(get_active_grab()) + +/// Returns a list of every movable we are grabbing +/mob/living/proc/get_all_grabbed_movables() + . = list() + for(var/obj/item/hand_item/grab/G in active_grabs) + . |= G.affecting + +/// Frees src from all grabs. +/atom/movable/proc/free_from_all_grabs() + if(!LAZYLEN(grabbed_by)) + return + + for(var/obj/item/hand_item/grab/G in grabbed_by) + qdel(G) + +/// Gets every grabber of this atom, and every grabber of those grabbers, repeat +/atom/movable/proc/recursively_get_all_grabbers() + RETURN_TYPE(/list) + . = list() + for(var/obj/item/hand_item/grab/G in grabbed_by) + . |= G.assailant + . |= G.assailant.recursively_get_all_grabbers() + +/// Gets every grabbed atom of this mob, and every grabbed atom of that grabber, repeat +/mob/living/proc/recursively_get_all_grabbed_movables() + RETURN_TYPE(/list) + . = list() + for(var/obj/item/hand_item/grab/G in active_grabs) + . |= G.affecting + var/mob/living/L = G.get_affecting_mob() + if(L) + . |= L.recursively_get_all_grabbed_movables() + +/// Gets every grab object owned by this mob, and every grabbed atom of those grabbed mobs +/mob/living/proc/recursively_get_conga_line() + RETURN_TYPE(/list) + . = list() + for(var/obj/item/hand_item/grab/G in active_grabs) + . |= G + var/mob/living/L = G.get_affecting_mob() + if(L) + . |= L.recursively_get_conga_line() + +/// Get every single member of a grab chain +/atom/movable/proc/get_all_grab_chain_members() + RETURN_TYPE(/list) + return recursively_get_all_grabbers() + +/mob/living/get_all_grab_chain_members() + . = ..() + . |= recursively_get_all_grabbed_movables() diff --git a/code/modules/grab/grab_living.dm b/code/modules/grab/grab_living.dm new file mode 100644 index 000000000000..bcf8e1ec62fa --- /dev/null +++ b/code/modules/grab/grab_living.dm @@ -0,0 +1,172 @@ +/mob/living/proc/can_grab(atom/movable/target, target_zone, use_offhand) + if(throwing || !(mobility_flags & MOBILITY_PULL)) + return FALSE + + if(!ismob(target) && target.anchored) + to_chat(src, span_warning("\The [target] won't budge!")) + return FALSE + + if(use_offhand) + if(!get_empty_held_index()) + to_chat(src, span_warning("Your hands are full!")) + return FALSE + + else if(get_active_held_item()) + to_chat(src, span_warning("Your [active_hand_index % 2 ? "left" : "right"] hand is full!")) + return FALSE + + if(LAZYLEN(grabbed_by)) + to_chat(src, span_warning("You cannot start grappling while already being grappled!")) + return FALSE + + for(var/obj/item/hand_item/grab/G in target.grabbed_by) + if(G.assailant != src) + if(G.assailant.pull_force > pull_force || (G.assailant.pull_force == pull_force && G.current_grab.damage_stage > GRAB_PASSIVE)) + to_chat(src, span_warning("[G.assailant]'s grip is too strong.")) + return FALSE + + continue + + if(!target_zone || !ismob(target)) + to_chat(src, span_warning("You already have a grip on \the [target]!")) + return FALSE + + if(G.target_zone == target_zone) + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(BP) + to_chat(src, span_warning("You already have a grip on \the [target]'s [BP.plaintext_zone].")) + return FALSE + return TRUE + +/mob/living/can_be_grabbed(mob/living/grabber, target_zone, use_offhand) + . = ..() + if(!.) + return + if((buckled?.buckle_prevents_pull)) + return FALSE + +/// Attempt to create a grab, returns TRUE on success +/mob/living/proc/try_make_grab(atom/movable/target, grab_type, use_offhand) + return canUseTopic(src, USE_IGNORE_TK|USE_CLOSE) && make_grab(target, grab_type, use_offhand) + +/mob/living/proc/make_grab(atom/movable/target, grab_type = /datum/grab/simple, use_offhand) + if(SEND_SIGNAL(src, COMSIG_LIVING_TRY_GRAB, target, grab_type) & COMSIG_LIVING_CANCEL_GRAB) + return + + // Resolve to the 'topmost' atom in the buckle chain, as grabbing someone buckled to something tends to prevent further interaction. + var/atom/movable/original_target = target + if(ismob(target)) + var/mob/grabbed_mob = target + + while(ismob(grabbed_mob) && grabbed_mob.buckled) + grabbed_mob = grabbed_mob.buckled + + if(grabbed_mob && grabbed_mob != original_target) + target = grabbed_mob + to_chat(src, span_warning("As \the [original_target] is buckled to \the [target], you try to grab that instead!")) + + if(!istype(target)) + return + + face_atom(target) + + var/obj/item/hand_item/grab/grab + if(ispath(grab_type, /datum/grab) && can_grab(target, zone_selected, use_offhand) && target.can_be_grabbed(src, zone_selected, use_offhand)) + grab = new /obj/item/hand_item/grab(src, target, grab_type, use_offhand) + + + if(QDELETED(grab)) + if(original_target != src && ismob(original_target)) + to_chat(original_target, span_warning("\The [src] tries to grab you, but fails!")) + return null + + for(var/obj/item/hand_item/grab/competing_grab in target.grabbed_by) + if(competing_grab.assailant.pull_force < pull_force) + to_chat(competing_grab.assailant, span_alert("[target] is ripped from your grip by [src].")) + qdel(competing_grab) + + SEND_SIGNAL(src, COMSIG_LIVING_START_GRAB, target, grab) + SEND_SIGNAL(target, COMSIG_ATOM_GET_GRABBED, src, grab) + + return grab + +/mob/living/proc/add_grab(obj/item/hand_item/grab/grab, use_offhand) + if(LAZYLEN(active_grabs)) + return FALSE //Non-humans only get 1 grab + + grab.forceMove(src) + return TRUE + +/mob/living/recheck_grabs(only_pulling = FALSE, only_pulled = FALSE, z_allowed = FALSE) + if(only_pulled) + return ..() + + for(var/obj/item/hand_item/grab/G in active_grabs) + var/atom/movable/pulling = G.affecting + if(!MultiZAdjacent(src, pulling)) + qdel(G) + else if(!isturf(loc)) + qdel(G) + else if(!isturf(pulling.loc)) //to be removed once all code that changes an object's loc uses forceMove(). + qdel(G) + else if(pulling.anchored || pulling.move_resist > move_force) + qdel(G) + + return ..() + +/// Called by grab objects when a grab has been released +/mob/living/proc/after_grab_release(atom/movable/old_target) + animate_interact(old_target, INTERACT_UNPULL) + update_pull_hud_icon() + +/// Called during or immediately after movement. Used to move grab targets around to ensure the grabs do not break during movement. +/mob/living/proc/handle_grabs_during_movement(turf/old_loc, direction) + var/list/grabs_in_grab_chain = active_grabs //recursively_get_conga_line() + if(!LAZYLEN(grabs_in_grab_chain)) + return + + for(var/obj/item/hand_item/grab/G in grabs_in_grab_chain) + var/atom/movable/pulling = G.affecting + if(pulling == src || pulling.loc == loc) + continue + if(pulling.anchored || !isturf(loc)) + qdel(G) + continue + + var/pull_dir = get_dir(pulling, src) + var/target_turf = G.current_grab.same_tile ? loc : old_loc + + // Pulling things down/up stairs. zMove() has flags for check_pulling and stop_pulling calls. + // You may wonder why we're not just forcemoving the pulling movable and regrabbing it. + // The answer is simple. forcemoving and regrabbing is ugly and breaks conga lines. + if(pulling.z != z) + target_turf = get_step(pulling, get_dir(pulling, old_loc)) + + + if(target_turf != old_loc || (moving_diagonally != SECOND_DIAG_STEP && ISDIAGONALDIR(pull_dir)) || get_dist(src, pulling) > 1) + pulling.move_from_pull(G.assailant, get_step(pulling, get_dir(pulling, target_turf)), glide_size) + if(QDELETED(G)) + continue + + if(!pulling.MultiZAdjacent(src)) + qdel(G) + continue + + if(!QDELETED(G)) + G.current_grab.moved_effect(G) + if(G.current_grab.downgrade_on_move) + G.downgrade() + + if(moving_diagonally != FIRST_DIAG_STEP) + pulling.update_offsets() + + var/list/my_grabs = active_grabs + for(var/obj/item/hand_item/grab/G in my_grabs) + if(G.current_grab.reverse_facing || HAS_TRAIT(G.affecting, TRAIT_KEEP_DIRECTION_WHILE_PULLING)) + if(!direction) + direction = get_dir(src, G.affecting) + if(!direction) + continue + setDir(global.reverse_dir[direction]) + + diff --git a/code/modules/grab/grab_movable.dm b/code/modules/grab/grab_movable.dm new file mode 100644 index 000000000000..a88ced0321dd --- /dev/null +++ b/code/modules/grab/grab_movable.dm @@ -0,0 +1,72 @@ +/atom/movable/proc/can_be_grabbed(mob/living/grabber, target_zone, use_offhand) + if(!istype(grabber) || !isturf(loc) || !isturf(grabber.loc)) + return FALSE + if(SEND_SIGNAL(src, COMSIG_ATOM_CAN_BE_GRABBED, grabber) & COMSIG_ATOM_NO_GRAB) + return FALSE + if(!grabber.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) + return FALSE + if(!buckled_grab_check(grabber)) + return FALSE + if(anchored) + return FALSE + if(throwing) + return FALSE + if(pull_force < (move_resist * MOVE_FORCE_PULL_RATIO)) + to_chat(grabber, span_warning("You aren't strong enough to move [src]!")) + return FALSE + return TRUE + +/atom/movable/proc/buckled_grab_check(mob/grabber) + if(grabber.buckled == src && (grabber in buckled_mobs)) + return TRUE + if(grabber.anchored) + return FALSE + if(grabber.buckled) + return FALSE + return TRUE + +/** + * Checks if the pulling and pulledby should be stopped because they're out of reach. + * If z_allowed is TRUE, the z level of the pulling will be ignored.This is to allow things to be dragged up and down stairs. + */ +/atom/movable/proc/recheck_grabs(only_pulling = FALSE, only_pulled = FALSE, z_allowed = FALSE) + if(only_pulling) + return + + for(var/obj/item/hand_item/grab/G in grabbed_by) + if(moving_diagonally != FIRST_DIAG_STEP && !MultiZAdjacent(G.assailant)) //separated from our puller and not in the middle of a diagonal move. + qdel(G) + +/// Move grabbed atoms towards a destination +/mob/living/proc/move_grabbed_atoms_towards(atom/destination) + for(var/obj/item/hand_item/grab/G in active_grabs) + G.move_victim_towards(destination) + +/atom/movable/proc/update_offsets() + var/last_pixel_x = pixel_x + var/last_pixel_y = pixel_y + + var/new_pixel_x = base_pixel_x + var/new_pixel_y = base_pixel_y + + var/list/grabbed_by = list() + + grabbed_by += src.grabbed_by + + if(length(buckled_mobs)) + for(var/mob/M as anything in buckled_mobs) + M.update_offsets() + + if(isliving(src)) + var/mob/living/L = src + if(L.buckled) + grabbed_by += L.buckled.grabbed_by + + if(isturf(loc) && length(grabbed_by)) + for(var/obj/item/hand_item/grab/G in grabbed_by) + G.current_grab.get_grab_offsets(G, get_dir(G.assailant, G.affecting), &new_pixel_x, &new_pixel_y) + + if(last_pixel_x != new_pixel_x || last_pixel_y != new_pixel_y) + animate(src, pixel_x = new_pixel_x, pixel_y = new_pixel_y, 3, 1, (LINEAR_EASING|EASE_IN)) + + UPDATE_OO_IF_PRESENT diff --git a/code/modules/grab/grab_object.dm b/code/modules/grab/grab_object.dm new file mode 100644 index 000000000000..a1cbff4c436c --- /dev/null +++ b/code/modules/grab/grab_object.dm @@ -0,0 +1,451 @@ +/obj/item/hand_item/grab + name = "grab" + item_flags = DROPDEL | ABSTRACT | HAND_ITEM | NOBLUDGEON + + /// The initiator of the grab + var/mob/living/assailant = null + /// The thing being grabbed + var/atom/movable/affecting = null + + /// The grab datum currently being used + var/datum/grab/current_grab + + /// Set true after grab setup. Used for debugging. + var/is_valid = FALSE + + /// Cooldown for actions + COOLDOWN_DECLARE(action_cd) + /// Cooldown for upgrade times + COOLDOWN_DECLARE(upgrade_cd) + /// Indicates if the current grab has special interactions applied to the target organ (eyes and mouth at time of writing) + var/special_target_functional = TRUE + /// Used to avoid stacking interactions that sleep during /decl/grab/proc/on_hit_foo() (ie. do_after() is used) + var/is_currently_resolving_hit = FALSE + /// Records a specific bodypart that was targetted by this grab. + var/target_zone + /// Used by struggle grab datum to keep track of state. + var/done_struggle = FALSE + +/obj/item/hand_item/grab/Initialize(mapload, atom/movable/target, datum/grab/grab_type, use_offhand) + . = ..() + current_grab = GLOB.all_grabstates[grab_type] + if(isnull(current_grab)) + stack_trace("Bad grab type requested: [grab_type || "NULL"]") + return INITIALIZE_HINT_QDEL + + assailant = loc + if(!istype(assailant)) + assailant = null + return INITIALIZE_HINT_QDEL + + affecting = target + if(!istype(assailant) || !assailant.add_grab(src, use_offhand = use_offhand)) + return INITIALIZE_HINT_QDEL + + target_zone = deprecise_zone(assailant.zone_selected) + + if(!current_grab.setup(src)) + return INITIALIZE_HINT_QDEL + + is_valid = TRUE + + /// Apply any needed updates to the assailant + LAZYADD(affecting.grabbed_by, src) // This is how we handle affecting being deleted. + LAZYOR(assailant.active_grabs, src) + + assailant.update_pull_hud_icon() + + /// Do flavor things like pixel offsets, animation, sound + adjust_position() + assailant.animate_interact(affecting, INTERACT_GRAB) + + var/sound = 'sound/weapons/thudswoosh.ogg' + if(iscarbon(assailant)) + var/mob/living/carbon/C = assailant + if(C.dna.species.grab_sound) + sound = C.dna.species.grab_sound + + playsound(affecting.loc, sound, 50, 1, -1) + + /// Spread diseases + if(isliving(affecting)) + if(!ishuman(assailant) || !assailant:gloves) + var/mob/living/affecting_mob = affecting + for(var/datum/disease/D as anything in assailant.diseases) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + affecting_mob.ContactContractDisease(D) + + for(var/datum/disease/D as anything in affecting_mob.diseases) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + assailant.ContactContractDisease(D) + + /// Setup the effects applied by grab + current_grab.update_stage_effects(src, null) + current_grab.special_bodyzone_effects(src) + + var/mob/living/L = get_affecting_mob() + if(L && assailant.combat_mode) + upgrade(TRUE) + + /// Update appearance + update_appearance(UPDATE_ICON_STATE) + + // Leave forensics + leave_forensic_traces() + /// Setup signals + var/obj/item/bodypart/BP = get_targeted_bodypart() + if(BP) + name = "[initial(name)] ([BP.plaintext_zone])" + RegisterSignal(affecting, COMSIG_CARBON_REMOVED_LIMB, PROC_REF(on_limb_loss)) + + RegisterSignal(assailant, COMSIG_PARENT_QDELETING, PROC_REF(target_or_owner_del)) + if(affecting != assailant) + RegisterSignal(affecting, COMSIG_PARENT_QDELETING, PROC_REF(target_or_owner_del)) + RegisterSignal(affecting, COMSIG_MOVABLE_PRE_THROW, PROC_REF(target_thrown)) + RegisterSignal(affecting, COMSIG_ATOM_ATTACK_HAND, PROC_REF(intercept_attack_hand)) + + RegisterSignal(assailant, COMSIG_MOB_SELECTED_ZONE_SET, PROC_REF(on_target_change)) + +/obj/item/hand_item/grab/Destroy() + if(affecting) + LAZYREMOVE(affecting.grabbed_by, src) + affecting.update_offsets() + + else if(is_valid) + stack_trace("Grab (\ref[src]) qdeleted while not having a victim.") + + if(affecting && assailant && current_grab) + current_grab.let_go(src) + + else if(is_valid && !current_grab) + stack_trace("Grab (\ref[src]) qdeleted while not having a grab datum.") + + if(assailant) + LAZYREMOVE(assailant.active_grabs, src) + assailant.after_grab_release(affecting) + else + stack_trace("Grab (\ref[src]) qdeleted while not having an assailant.") + + affecting = null + assailant = null + current_grab = null + return ..() + +/obj/item/hand_item/grab/examine(mob/user) + . = ..() + var/mob/living/L = get_affecting_mob() + var/obj/item/bodypart/BP = get_targeted_bodypart() + if(L && BP) + to_chat(user, "A grab on \the [L]'s [BP.plaintext_zone].") + +/obj/item/hand_item/grab/update_icon_state() + . = ..() + icon = current_grab.icon + if(current_grab.icon_state) + icon_state = current_grab.icon_state + +/obj/item/hand_item/grab/attack_self(mob/user) + if (!assailant) + return + + if(assailant.combat_mode) + upgrade() + else + downgrade() + + +/obj/item/hand_item/grab/melee_attack_chain(mob/user, atom/target, params) + if (QDELETED(src) || !assailant || !current_grab) + return + + if(target.attack_grab(assailant, affecting, src, params2list(params))) + return + + current_grab.hit_with_grab(src, target, params2list(params)) + +/* + This section is for newly defined useful procs. +*/ + +/obj/item/hand_item/grab/proc/on_target_change(datum/source, new_sel) + SIGNAL_HANDLER + + if(src != assailant.get_active_held_item()) + return // Note that because of this condition, there's no guarantee that target_zone = old_sel + + new_sel = deprecise_zone(new_sel) + if(target_zone == new_sel) + return + + var/obj/item/bodypart/BP + + if(affecting == assailant && iscarbon(assailant)) + BP = assailant.get_bodypart(new_sel) + var/using_slot = assailant.get_held_index_of_item(src) + if(assailant.has_hand_for_held_index(using_slot) == BP) + to_chat(assailant, span_warning("You can't grab your own [BP.plaintext_zone] with itself!")) + return + + var/old_zone = target_zone + target_zone = new_sel + BP = get_targeted_bodypart() + + if (!BP) + to_chat(assailant, span_warning("You fail to grab \the [affecting] there as they do not have that bodypart!")) + return + + name = "[initial(name)] ([BP.plaintext_zone])" + to_chat(assailant, span_notice("You are now holding \the [affecting] by \the [BP.plaintext_zone].")) + + if(!isbodypart(BP)) + qdel(src) + return + + leave_forensic_traces() + current_grab.on_target_change(src, old_zone, target_zone) + +/obj/item/hand_item/grab/proc/on_limb_loss(mob/victim, obj/item/bodypart/lost) + SIGNAL_HANDLER + + if(affecting != victim) + stack_trace("A grab switched affecting targets without properly re-registering for dismemberment updates.") + return + var/obj/item/bodypart/BP = get_targeted_bodypart() + if(!istype(BP)) + qdel(src) + return // Sanity check in case the lost organ was improperly removed elsewhere in the code. + + if(lost != BP) + return + + qdel(src) + +/// Intercepts attack_hand() calls on our target. +/obj/item/hand_item/grab/proc/intercept_attack_hand(atom/movable/source, user, list/modifiers) + SIGNAL_HANDLER + if(user != assailant) + return + + if(current_grab.resolve_openhand_attack(src)) + return COMPONENT_CANCEL_ATTACK_CHAIN + +// Returns the bodypart of the grabbed person that the grabber is targeting +/obj/item/hand_item/grab/proc/get_targeted_bodypart() + RETURN_TYPE(/obj/item/bodypart) + var/mob/living/L = get_affecting_mob() + return (L?.get_bodypart(deprecise_zone(target_zone))) + +/obj/item/hand_item/grab/proc/resolve_item_attack(mob/living/M, obj/item/I, target_zone) + if((M && ishuman(M)) && I) + return current_grab.resolve_item_attack(src, M, I, target_zone) + else + return 0 + +/obj/item/hand_item/grab/proc/action_used() + COOLDOWN_START(src, action_cd, current_grab.action_cooldown) + leave_forensic_traces() + +/// Leave forensic traces on both the assailant and victim. You really don't want to read this proc and it's type fuckery. +/obj/item/hand_item/grab/proc/leave_forensic_traces() + if (!affecting) + return + + var/mob/living/carbon/human/human_victim = get_affecting_mob() + var/mob/living/carbon/human/human_assailant = assailant + var/list/assailant_blood_dna + + if(ishuman(assailant)) + if(human_assailant.gloves) + assailant_blood_dna = human_assailant.gloves.return_blood_DNA() + else + assailant_blood_dna = human_assailant.return_blood_DNA() + + //Add blood to the assailant + if(ishuman(human_victim)) + var/obj/item/clothing/item_covering_grabbed_zone = human_victim.get_item_covering_zone(target_zone) + if(item_covering_grabbed_zone) + human_assailant.add_blood_DNA_to_items(item_covering_grabbed_zone.return_blood_DNA(), ITEM_SLOT_GLOVES) + else + human_assailant.add_blood_DNA_to_items(human_victim.return_blood_DNA(), ITEM_SLOT_GLOVES) + + if(ishuman(human_victim)) + // Add blood to the victim + var/obj/item/clothing/item_covering_grabbed_zone = human_victim.get_item_covering_zone(target_zone) + + if(istype(item_covering_grabbed_zone)) + item_covering_grabbed_zone.add_fingerprint(assailant) + item_covering_grabbed_zone.add_blood_DNA(assailant_blood_dna) + return + + // If no clothing; add fingerprint to mob proper. + affecting.add_fingerprint(assailant) + // Add blood to the victim's body + affecting.add_blood_DNA(assailant_blood_dna) + +/obj/item/hand_item/grab/proc/upgrade(bypass_cooldown, silent) + if(!COOLDOWN_FINISHED(src, upgrade_cd) && !bypass_cooldown) + if(!silent) + to_chat(assailant, span_warning("You must wait [round(COOLDOWN_TIMELEFT(src, upgrade_cd) * 0.1, 0.1)] seconds to upgrade.")) + return + + var/datum/grab/upgrab = current_grab.upgrade(src) + if(!upgrab) + return + + if(is_grab_unique(current_grab)) + current_grab.remove_unique_grab_effects(src) + + current_grab = upgrab + + COOLDOWN_START(src, upgrade_cd, current_grab.upgrade_cooldown) + + leave_forensic_traces() + + if(QDELETED(src)) + return + + if(!current_grab.enter_as_up(src, silent)) + return + + if(is_grab_unique(current_grab)) + current_grab.apply_unique_grab_effects(src) + + adjust_position() + update_appearance() + +/obj/item/hand_item/grab/proc/downgrade(silent) + var/datum/grab/downgrab = current_grab.downgrade(src) + if(!downgrab) + return + + if(is_grab_unique(current_grab)) + current_grab.remove_unique_grab_effects(src) + + current_grab = downgrab + + if(!current_grab.enter_as_down(src)) + return + + if(is_grab_unique(current_grab)) + current_grab.apply_unique_grab_effects(src) + + current_grab.enter_as_down(src, silent) + adjust_position() + update_appearance() + +/// Used to prevent repeated effect application or early effect removal +/obj/item/hand_item/grab/proc/is_grab_unique(datum/grab/grab_datum) + var/count = 0 + for(var/obj/item/hand_item/grab/other as anything in affecting.grabbed_by) + if(other.current_grab == grab_datum) + count++ + + if(count >= 2) + return FALSE + return TRUE + +/obj/item/hand_item/grab/proc/draw_affecting_over() + affecting.plane = assailant.plane + affecting.layer = assailant.layer + 0.01 + +/obj/item/hand_item/grab/proc/draw_affecting_under() + affecting.plane = assailant.plane + affecting.layer = assailant.layer - 0.01 + +/obj/item/hand_item/grab/proc/handle_resist() + current_grab.handle_resist(src) + +/obj/item/hand_item/grab/proc/has_hold_on_bodypart(obj/item/bodypart/BP) + if (!BP) + return FALSE + + if (get_targeted_bodypart() == BP) + return TRUE + + return FALSE + +/obj/item/hand_item/grab/proc/get_affecting_mob() + RETURN_TYPE(/mob/living) + if(isobj(affecting)) + if(length(affecting.buckled_mobs)) + return affecting.buckled_mobs?[1] + return + + if(isliving(affecting)) + return affecting + +/// Primarily used for do_after() callbacks, checks if the grab item is still holding onto something +/obj/item/hand_item/grab/proc/is_grabbing(atom/movable/AM) + return affecting == AM +/* + * This section is for component signal relays/hooks +*/ + +/// Target deleted, ABORT +/obj/item/hand_item/grab/proc/target_or_owner_del(datum/source) + SIGNAL_HANDLER + qdel(src) + +/// If something tries to throw the target. +/obj/item/hand_item/grab/proc/target_thrown(atom/movable/source, list/arguments) + SIGNAL_HANDLER + + if(!current_grab.stop_move) + return + if(arguments[4] == assailant && current_grab.can_throw) + return + + return COMPONENT_CANCEL_THROW + +/obj/item/hand_item/grab/attackby(obj/W, mob/user) + if(user == assailant) + current_grab.item_attack(src, W) + +/obj/item/hand_item/grab/proc/resolve_openhand_attack() + return current_grab.resolve_openhand_attack(src) + +/obj/item/hand_item/grab/proc/adjust_position() + if(QDELETED(assailant) || QDELETED(affecting) || !assailant.Adjacent(affecting)) + qdel(src) + return FALSE + + if(assailant) + assailant.setDir(get_dir(assailant, affecting)) + + if(current_grab.same_tile) + affecting.move_from_pull(assailant, get_turf(assailant)) + affecting.setDir(assailant.dir) + + affecting.update_offsets() + affecting.reset_plane_and_layer() + +/obj/item/hand_item/grab/proc/move_victim_towards(atom/destination) + if(current_grab.same_tile) + return + + if(affecting.anchored || affecting.move_resist > assailant.move_force || !affecting.Adjacent(assailant, assailant, affecting)) + qdel(src) + return + + if(isliving(assailant)) + var/mob/living/pulling_mob = assailant + if(pulling_mob.buckled && pulling_mob.buckled.buckle_prevents_pull) //if they're buckled to something that disallows pulling, prevent it + qdel(src) + return + + var/move_dir = get_dir(affecting.loc, destination) + + // Don't move people in space, that's fucking cheating + if(!Process_Spacemove(move_dir)) + return + + // Okay, now actually try to move + . = affecting.Move(get_step(affecting.loc, move_dir), move_dir, glide_size) + if(.) + affecting.update_offsets() + +/// Removes any grabs applied to the affected movable that aren't src +/obj/item/hand_item/grab/proc/remove_competing_grabs() + for(var/obj/item/hand_item/grab/other_grab in affecting.grabbed_by - src) + to_chat(other_grab.assailant, span_alert("[affecting] is ripped from your grip by [assailant].")) + qdel(other_grab) diff --git a/code/modules/grab/grab_silicon.dm b/code/modules/grab/grab_silicon.dm new file mode 100644 index 000000000000..f13f7d448607 --- /dev/null +++ b/code/modules/grab/grab_silicon.dm @@ -0,0 +1,2 @@ +/mob/living/silcion/try_make_grab(atom/movable/target, grab_type = /datum/grab/simple) + . = ..() diff --git a/code/modules/grab/grabs/grab_aggressive.dm b/code/modules/grab/grabs/grab_aggressive.dm new file mode 100644 index 000000000000..37642aa0ca28 --- /dev/null +++ b/code/modules/grab/grabs/grab_aggressive.dm @@ -0,0 +1,72 @@ +/datum/grab/normal/aggressive + upgrab = /datum/grab/normal/neck + downgrab = /datum/grab/normal/passive + + grab_slowdown = 0.7 + shift = 12 + stop_move = TRUE + reverse_facing = FALSE + point_blank_mult = 1.5 + damage_stage = GRAB_AGGRESSIVE + same_tile = FALSE + can_throw = TRUE + enable_violent_interactions = TRUE + breakability = 3 + icon_state = "reinforce1" + + break_chance_table = list(5, 20, 40, 80, 100) + +/datum/grab/normal/aggressive/apply_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + if(!isliving(G.affecting)) + return + + var/mob/living/L = G.affecting + RegisterSignal(G.affecting, COMSIG_LIVING_SET_BODY_POSITION, PROC_REF(target_bodyposition_change)) + + if(L.body_position == LYING_DOWN) + ADD_TRAIT(L, TRAIT_FLOORED, AGGRESSIVE_GRAB) + +/datum/grab/normal/aggressive/remove_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + UnregisterSignal(G.affecting, COMSIG_LIVING_SET_BODY_POSITION) + REMOVE_TRAIT(G.affecting, TRAIT_FLOORED, AGGRESSIVE_GRAB) + +/datum/grab/normal/aggressive/proc/target_bodyposition_change(mob/living/source) + if(source.body_position == LYING_DOWN) + ADD_TRAIT(source, TRAIT_FLOORED, AGGRESSIVE_GRAB) + +/datum/grab/normal/aggressive/can_upgrade(obj/item/hand_item/grab/G) + . = ..() + if(.) + if(!ishuman(G.affecting)) + to_chat(G.assailant, span_warning("You can only upgrade an aggressive grab when grappling a human!")) + return FALSE + if(!(G.target_zone in list(BODY_ZONE_CHEST, BODY_ZONE_HEAD))) + to_chat(G.assailant, span_warning("You need to be grabbing their torso or head for this!")) + return FALSE + + var/mob/living/carbon/human/affecting_mob = G.get_affecting_mob() + if(istype(affecting_mob)) + var/obj/item/clothing/C = affecting_mob.head + if(istype(C)) //hardsuit helmets etc + if((C.clothing_flags & STOPSPRESSUREDAMAGE) && C.returnArmor().getRating(BLUNT) > 20) + to_chat(G.assailant, span_warning("\The [C] is in the way!")) + return FALSE + +/datum/grab/normal/aggressive/enter_as_up(obj/item/hand_item/grab/G, silent) + . = ..() + if(!silent) + G.assailant.visible_message( + span_danger("[G.assailant] tightens their grip on [G.affecting] (now hands)!"), + blind_message = span_hear("You hear aggressive shuffling."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + +/datum/grab/normal/aggressive/enter_as_down(obj/item/hand_item/grab/G, silent) + . = ..() + if(!silent) + G.assailant.visible_message( + span_danger("[G.assailant] loosens their grip on [G.affecting], allowing them to breathe!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) diff --git a/code/modules/grab/grabs/grab_neck.dm b/code/modules/grab/grabs/grab_neck.dm new file mode 100644 index 000000000000..8f1597cb4c39 --- /dev/null +++ b/code/modules/grab/grabs/grab_neck.dm @@ -0,0 +1,47 @@ +/datum/grab/normal/neck + upgrab = /datum/grab/normal/kill + downgrab = /datum/grab/normal/aggressive + + grab_slowdown = 4 + + drop_headbutt = FALSE + shift = -10 + stop_move = TRUE + reverse_facing = TRUE + point_blank_mult = 2 + damage_stage = GRAB_NECK + same_tile = TRUE + can_throw = TRUE + enable_violent_interactions = TRUE + restrains = TRUE + icon_state = "kill" + break_chance_table = list(3, 18, 45, 100) + +/datum/grab/normal/neck/apply_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + if(!isliving(G.affecting)) + return + + var/mob/living/L = G.affecting + ADD_TRAIT(L, TRAIT_FLOORED, NECK_GRAB) + +/datum/grab/normal/neck/remove_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + REMOVE_TRAIT(G.affecting, TRAIT_FLOORED, NECK_GRAB) + +/datum/grab/normal/neck/enter_as_up(obj/item/hand_item/grab/G, silent) + . = ..() + if(!silent) + G.assailant.visible_message( + span_danger("[G.assailant] places their arm around [G.affecting]'s neck!"), + blind_message = span_hear("You hear aggressive shuffling."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + +/datum/grab/normal/neck/enter_as_down(obj/item/hand_item/grab/G, silent) + . = ..() + if(!silent) + G.assailant.visible_message( + span_danger("[G.assailant] stops strangling [G.affecting]."), + vision_distance = COMBAT_MESSAGE_RANGE + ) diff --git a/code/modules/grab/grabs/grab_normal.dm b/code/modules/grab/grabs/grab_normal.dm new file mode 100644 index 000000000000..86566ecd1c33 --- /dev/null +++ b/code/modules/grab/grabs/grab_normal.dm @@ -0,0 +1,342 @@ +/datum/grab/normal + abstract_type = /datum/grab/normal + + help_action = "inspect" + disarm_action = "pin" + grab_action = "jointlock" + harm_action = "dislocate" + + var/drop_headbutt = 1 + +/datum/grab/normal/setup(obj/item/hand_item/grab/G) + if(!(. = ..())) + return + + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(!BP) + return + + if(G.affecting != G.assailant) + G.assailant.visible_message(span_warning("[G.assailant] has grabbed [G.affecting]'s [BP.plaintext_zone]!")) + else + G.assailant.visible_message(span_notice("[G.assailant] has grabbed [G.assailant.p_their()] [BP.plaintext_zone]!")) + +/datum/grab/normal/on_hit_help(obj/item/hand_item/grab/G, atom/A) + + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(!BP || (A && A != G.get_affecting_mob())) + return FALSE + return BP.inspect(G.assailant) + +/datum/grab/normal/on_hit_disarm(obj/item/hand_item/grab/G, atom/A) + + var/mob/living/affecting = G.get_affecting_mob() + var/mob/living/assailant = G.assailant + if(affecting && A && A == affecting) + if(affecting.body_position == LYING_DOWN) + to_chat(assailant, span_warning("They're already on the ground.")) + return FALSE + + affecting.visible_message(span_danger("\The [assailant] is trying to pin \the [affecting] to the ground!")) + + if(do_after(assailant, affecting, action_cooldown - 1, DO_PUBLIC, display = image('icons/hud/do_after.dmi', "harm"))) + G.action_used() + affecting.visible_message(span_danger("\The [assailant] pins \the [affecting] to the ground!")) + affecting.Paralyze(1 SECOND) // This can only be performed with an aggressive grab, which ensures that once someone is knocked down, they stay down. + affecting.move_from_pull(G.assailant, get_turf(G.assailant)) + return TRUE + + affecting.visible_message(span_warning("\The [assailant] fails to pin \the [affecting] to the ground.")) + return FALSE + +/datum/grab/normal/on_hit_grab(obj/item/hand_item/grab/G, atom/A) + var/mob/living/affecting = G.get_affecting_mob() + if(!affecting || (A && A != affecting)) + return FALSE + + var/mob/living/assailant = G.assailant + if(!assailant) + return FALSE + + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(!BP) + to_chat(assailant, span_warning("\The [affecting] is missing that body part!")) + return FALSE + + assailant.visible_message(span_danger("\The [assailant] begins to [pick("bend", "twist")] \the [affecting]'s [BP.plaintext_zone] into a jointlock!")) + if(do_after(assailant, affecting, action_cooldown - 1, DO_PUBLIC, display = image('icons/hud/do_after.dmi', "harm"))) + G.action_used() + BP.jointlock(assailant) + assailant.visible_message(span_danger("\The [affecting]'s [BP.plaintext_zone] is twisted!")) + playsound(assailant.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return TRUE + + affecting.visible_message(span_warning("\The [assailant] fails to jointlock \the [affecting]'s [BP.plaintext_zone].")) + return FALSE + +/datum/grab/normal/on_hit_harm(obj/item/hand_item/grab/G, atom/A) + var/mob/living/carbon/affecting = G.get_affecting_mob() + if(!istype(affecting) || (A && A != affecting)) + return FALSE + + var/mob/living/assailant = G.assailant + if(!assailant) + return FALSE + + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(!BP) + to_chat(assailant, span_warning("\The [affecting] is missing that body part!")) + return FALSE + + if(BP.bodypart_flags & BP_DISLOCATED) + assailant.visible_message(span_notice("\The [assailant] begins to place [affecting]'s [BP.joint_name] back in it's socket.")) + if(do_after(assailant, affecting, action_cooldown - 1, DO_PUBLIC)) + G.action_used() + BP.set_dislocated(FALSE) + assailant.visible_message(span_warning("\The [affecting]'s [BP.joint_name] pops back into place!")) + affecting.pain_message("AAAHHHHAAGGHHHH", 50, TRUE) + return TRUE + + if(BP.can_be_dislocated()) + assailant.visible_message(span_danger("\The [assailant] begins to dislocate \the [affecting]'s [BP.joint_name]!")) + if(do_after(assailant, affecting, action_cooldown - 1, DO_PUBLIC)) + G.action_used() + BP.set_dislocated(TRUE) + assailant.visible_message(span_danger("\The [affecting]'s [BP.joint_name] [pick("gives way","caves in","collapses")]!")) + playsound(assailant.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + return TRUE + + affecting.visible_message(span_warning("\The [assailant] fails to dislocate \the [affecting]'s [BP.joint_name].")) + return FALSE + + if(BP.can_be_dislocated()) + to_chat(assailant, span_warning("\The [affecting]'s [BP.joint_name] is already dislocated!")) + else + to_chat(assailant, span_warning("You can't dislocate \the [affecting]'s [BP.joint_name]!")) + return FALSE + +/datum/grab/normal/resolve_openhand_attack(obj/item/hand_item/grab/G) + if(!G.assailant.combat_mode || G.assailant == G.affecting) + return FALSE + if(G.target_zone == BODY_ZONE_HEAD) + if(G.assailant.zone_selected == BODY_ZONE_PRECISE_EYES) + if(attack_eye(G)) + return TRUE + else + if(headbutt(G)) + if(drop_headbutt) + qdel(G) + return TRUE + return FALSE + +/datum/grab/normal/proc/attack_eye(obj/item/hand_item/grab/G) + var/mob/living/carbon/human/target = G.get_affecting_mob() + var/mob/living/carbon/human/attacker = G.assailant + if(!istype(target) || !istype(attacker)) + return TRUE + + if(target.is_eyes_covered()) + to_chat(attacker, "You're going to need to remove the eye covering first.") + return TRUE + + var/obj/item/organ/eyes/E = target.getorganslot(ORGAN_SLOT_EYES) + if(!E) + to_chat(attacker, "You cannot locate any eyes on [target]!") + return TRUE + + log_combat(attacker, target, "attacked the eyes of (grab)") + + if(E) + E.applyOrganDamage(rand(3,4)) + attacker.visible_message(span_danger("\The [attacker] jams [G.p_their()] fingers into \the [target]'s [E.name]!")) + if(!(E.organ_flags & ORGAN_SYNTHETIC)) + to_chat(target, span_danger("You experience immense pain as fingers are jammed into your [E.name]!")) + else + to_chat(target, span_danger("You experience fingers being jammed into your [E.name].")) + else + attacker.visible_message(span_danger("\The [attacker] attempts to press [G.p_their()] fingers into \the [target]'s [E.name], but [target.p_they()] doesn't have any!")) + return TRUE + +/datum/grab/normal/proc/headbutt(obj/item/hand_item/grab/G) + var/mob/living/carbon/human/target = G.get_affecting_mob() + var/mob/living/carbon/human/attacker = G.assailant + if(!istype(target) || !istype(attacker)) + return + + if(target.body_position == LYING_DOWN) + return + + var/damage = 20 + var/obj/item/clothing/hat = attacker.head + var/sharpness + if(istype(hat)) + damage += hat.force * 3 + sharpness = hat.sharpness + + if(sharpness & SHARP_POINTY) + if(istype(hat)) + attacker.visible_message(span_danger("\The [attacker] gores \the [target] with \the [hat]!")) + else + attacker.visible_message(span_danger("\The [attacker] gores \the [target]!")) + else + attacker.visible_message(span_danger("\The [attacker] thrusts [attacker.p_their()] head into \the [target]'s skull!")) + + var/armor = target.run_armor_check(BODY_ZONE_HEAD, BLUNT) + target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD, armor, sharpness = sharpness) + attacker.apply_damage(10, BRUTE, BODY_ZONE_HEAD) + + if(armor < 0.5 && target.can_head_trauma_ko() && prob(damage)) + target.Unconscious(20 SECONDS) + target.visible_message(span_danger("\The [target] collapses, now fast asleep.")) + + playsound(attacker.loc, "swing_hit", 25, 1, -1) + log_combat(attacker, target, "headbutted") + return 1 + +// Handles special targeting like eyes and mouth being covered. +/datum/grab/normal/special_bodyzone_effects(obj/item/hand_item/grab/G) + . = ..() + var/mob/living/affecting_mob = G.get_affecting_mob() + if(istype(affecting_mob) && G.special_target_functional) + switch(G.target_zone) + if(BODY_ZONE_PRECISE_MOUTH) + ADD_TRAIT(affecting_mob, TRAIT_MUTE, REF(G)) + if(BODY_ZONE_PRECISE_EYES) + ADD_TRAIT(affecting_mob, TRAIT_BLIND, REF(G)) + +/datum/grab/normal/remove_bodyzone_effects(obj/item/hand_item/grab/G) + . = ..() + REMOVE_TRAIT(G.affecting, TRAIT_MUTE, REF(G)) + REMOVE_TRAIT(G.affecting, TRAIT_BLIND, REF(G)) + +// Handles when they change targeted areas and something is supposed to happen. +/datum/grab/normal/special_bodyzone_change(obj/item/hand_item/grab/G, old_zone, new_zone) + old_zone = parse_zone(old_zone) + if((old_zone != BODY_ZONE_HEAD && old_zone != BODY_ZONE_CHEST) || !G.get_affecting_mob()) + return + switch(new_zone) + if(BODY_ZONE_PRECISE_MOUTH) + G.assailant.visible_message("\The [G.assailant] covers [G.affecting]'s mouth!") + if(BODY_ZONE_PRECISE_EYES) + G.assailant.visible_message("\The [G.assailant] covers [G.affecting]'s eyes!") + +/datum/grab/normal/check_special_target(obj/item/hand_item/grab/G) + var/mob/living/affecting_mob = G.get_affecting_mob() + if(!istype(affecting_mob)) + return FALSE + switch(G.target_zone) + if(BODY_ZONE_PRECISE_MOUTH) + if(!affecting_mob.has_mouth()) + to_chat(G.assailant, "You cannot locate a mouth on [G.affecting]!") + return FALSE + if(BODY_ZONE_PRECISE_EYES) + if(!affecting_mob.getorganslot(ORGAN_SLOT_EYES)) + to_chat(G.assailant, "You cannot locate any eyes on [G.affecting]!") + return FALSE + return TRUE + +/datum/grab/normal/resolve_item_attack(obj/item/hand_item/grab/G, mob/living/carbon/human/user, obj/item/I) + switch(G.target_zone) + if(BODY_ZONE_HEAD) + return attack_throat(G, I, user) + else + return attack_tendons(G, I, user, G.target_zone) + +/datum/grab/normal/proc/attack_throat(obj/item/hand_item/grab/G, obj/item/W, mob/living/user) + var/mob/living/carbon/affecting = G.get_affecting_mob() + if(!istype(affecting)) + return + if(!user.combat_mode) + return FALSE // Not trying to hurt them. + + if(!(W.sharpness & SHARP_EDGED) || !W.force || W.damtype != BRUTE) + return FALSE //unsuitable weapon + + if(DOING_INTERACTION(user, "throat slit")) + return FALSE + + user.visible_message("\The [user] begins to slit [affecting]'s throat with \the [W]!") + + user.changeNext_move(CLICK_CD_MELEE) + if(!do_after(user, affecting, 2 SECONDS, DO_PUBLIC, extra_checks = CALLBACK(G, TYPE_PROC_REF(/obj/item/hand_item/grab, is_grabbing), affecting), interaction_key = "throat slit", display = W)) + return FALSE + + if(!(G && G.affecting == affecting)) //check that we still have a grab + return FALSE + + var/armor + + //presumably, if they are wearing a helmet that stops pressure effects, then it probably covers the throat as well + for(var/obj/item/clothing/equipped in affecting.get_equipped_items()) + if((equipped.body_parts_covered & HEAD) && (equipped.clothing_flags & STOPSPRESSUREDAMAGE)) + armor = affecting.run_armor_check(BODY_ZONE_HEAD, BLUNT, silent = TRUE) + break + + var/total_damage = 0 + for(var/i in 1 to 3) + var/damage = min(W.force*1.5, 20) + affecting.apply_damage(damage, BRUTE, BODY_ZONE_HEAD, armor, sharpness = W.sharpness) + total_damage += damage + + if(total_damage) + user.visible_message("\The [user] slit [affecting]'s throat open with \the [W]!") + affecting.apply_status_effect(/datum/status_effect/neck_slice) + if(W.hitsound) + playsound(affecting.loc, W.hitsound, 50, 1, -1) + + COOLDOWN_START(G, action_cd, action_cooldown) + + log_combat(user, affecting, "slit throat (grab)") + return 1 + +/datum/grab/normal/proc/attack_tendons(obj/item/hand_item/grab/G, obj/item/W, mob/living/user, target_zone) + var/mob/living/affecting = G.get_affecting_mob() + if(!affecting) + return + if(!user.combat_mode) + return FALSE // Not trying to hurt them. + + if(!(W.sharpness & SHARP_EDGED) || !W.force || W.damtype != BRUTE) + return FALSE //unsuitable weapon + + var/obj/item/bodypart/BP = G.get_targeted_bodypart() + if(!BP || !(BP.check_tendon() == CHECKTENDON_OK)) + return FALSE + + if(DOING_INTERACTION(user, "slice tendon")) + return FALSE + + user.visible_message(span_danger("\The [user] begins to cut \the [affecting]'s [BP.tendon_name] with \the [W]!"), vision_distance = COMBAT_MESSAGE_RANGE) + user.changeNext_move(CLICK_CD_MELEE) + + if(!do_after(user, affecting, 2 SECONDS, DO_PUBLIC, extra_checks = CALLBACK(G, TYPE_PROC_REF(/obj/item/hand_item/grab, is_grabbing), affecting), interaction_key = "slice tendon", display = W)) + return FALSE + + if(!BP || !BP.set_sever_tendon(TRUE)) + return FALSE + + user.visible_message(span_danger("\The [user] cut \the [affecting]'s [BP.tendon_name] with \the [W]!")) + + if(W.hitsound) + playsound(affecting.loc, W.hitsound, 50, 1, -1) + + COOLDOWN_START(G, action_cd, action_cooldown) + + log_combat(user, affecting, "hamstrung (grab)") + return TRUE + +/datum/grab/normal/enter_as_down(obj/item/hand_item/grab/G, silent) + . = ..() + G.assailant.visible_message( + span_warning("[G.assailant] loosens their grip on [G.affecting]."), + ) + +/datum/grab/normal/add_context(list/context, obj/item/held_item, mob/living/user, atom/movable/target) + . = ..() + if(held_item?.sharpness & SHARP_EDGED) + var/obj/item/hand_item/grab/G = user.is_grabbing(target) + switch(G.target_zone) + if(BODY_ZONE_HEAD) + context[SCREENTIP_CONTEXT_LMB] = "Slice neck" + else + context[SCREENTIP_CONTEXT_LMB] = "Attack tendons" diff --git a/code/modules/grab/grabs/grab_passive.dm b/code/modules/grab/grabs/grab_passive.dm new file mode 100644 index 000000000000..4ae815f73018 --- /dev/null +++ b/code/modules/grab/grabs/grab_passive.dm @@ -0,0 +1,32 @@ +/datum/grab/normal/passive + upgrab = /datum/grab/normal/struggle + shift = 8 + stop_move = 0 + reverse_facing = 0 + point_blank_mult = 1.1 + same_tile = 0 + icon_state = "!reinforce" + break_chance_table = list(15, 60, 100) + +/datum/grab/normal/passive/on_hit_disarm(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to pin.")) + return FALSE + +/datum/grab/normal/passive/on_hit_grab(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to jointlock.")) + return FALSE + +/datum/grab/normal/passive/on_hit_harm(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to dislocate.")) + return FALSE + +/datum/grab/normal/passive/on_hit_help(obj/item/hand_item/grab/G, atom/A) + if(isitem(A) && ishuman(G.assailant) && (G.affecting == A)) + var/obj/item/I = G.affecting + var/mob/living/carbon/human/H = G.assailant + qdel(G) + H.put_in_active_hand(I) + return + +/datum/grab/normal/passive/resolve_openhand_attack(obj/item/hand_item/grab/G) + return FALSE diff --git a/code/modules/grab/grabs/grab_simple.dm b/code/modules/grab/grabs/grab_simple.dm new file mode 100644 index 000000000000..147b95eabf0b --- /dev/null +++ b/code/modules/grab/grabs/grab_simple.dm @@ -0,0 +1,23 @@ +/datum/grab/simple + shift = 8 + stop_move = FALSE + reverse_facing = FALSE + point_blank_mult = 1 + same_tile = FALSE + icon_state = "!reinforce" + break_chance_table = list(15, 60, 100) + +/datum/grab/simple/upgrade(obj/item/hand_item/grab/G) + return + +/datum/grab/simple/on_hit_disarm(obj/item/hand_item/grab/G, atom/A) + return FALSE + +/datum/grab/simple/on_hit_grab(obj/item/hand_item/grab/G, atom/A) + return FALSE + +/datum/grab/simple/on_hit_harm(obj/item/hand_item/grab/G, atom/A) + return FALSE + +/datum/grab/simple/resolve_openhand_attack(obj/item/hand_item/grab/G) + return FALSE diff --git a/code/modules/grab/grabs/grab_strangle.dm b/code/modules/grab/grabs/grab_strangle.dm new file mode 100644 index 000000000000..0de3afae24dd --- /dev/null +++ b/code/modules/grab/grabs/grab_strangle.dm @@ -0,0 +1,36 @@ +/datum/grab/normal/kill + downgrab = /datum/grab/normal/neck + grab_slowdown = 1.4 + + shift = 0 + stop_move = TRUE + reverse_facing = TRUE + point_blank_mult = 2 + damage_stage = GRAB_KILL + same_tile = TRUE + enable_violent_interactions = TRUE + restrains = TRUE + downgrade_on_action = TRUE + downgrade_on_move = TRUE + icon_state = "kill1" + break_chance_table = list(5, 20, 40, 80, 100) + +/datum/grab/normal/kill/apply_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + if(!isliving(G.affecting)) + return + + ADD_TRAIT(G.affecting, TRAIT_KILL_GRAB, REF(G)) + +/datum/grab/normal/kill/remove_unique_grab_effects(obj/item/hand_item/grab/G) + . = ..() + REMOVE_TRAIT(G.affecting, TRAIT_KILL_GRAB, REF(G)) + +/datum/grab/normal/kill/enter_as_up(obj/item/hand_item/grab/G, silent) + . = ..() + if(!silent) + G.assailant.visible_message( + span_danger("[G.assailant] begins to strangle [G.affecting]!"), + blind_message = span_hear("You hear aggressive shuffling."), + vision_distance = COMBAT_MESSAGE_RANGE + ) diff --git a/code/modules/grab/grabs/grab_struggle.dm b/code/modules/grab/grabs/grab_struggle.dm new file mode 100644 index 000000000000..7570a505373b --- /dev/null +++ b/code/modules/grab/grabs/grab_struggle.dm @@ -0,0 +1,79 @@ +/datum/grab/normal/struggle + upgrab = /datum/grab/normal/aggressive + downgrab = /datum/grab/normal/passive + shift = 8 + stop_move = TRUE + reverse_facing = FALSE + same_tile = FALSE + breakability = 3 + grab_slowdown = 0.7 + upgrade_cooldown = 2 SECONDS + can_downgrade_on_resist = 0 + icon_state = "reinforce" + break_chance_table = list(5, 20, 30, 80, 100) + +/datum/grab/normal/struggle/enter_as_up(obj/item/hand_item/grab/G, silent) + var/mob/living/affecting = G.get_affecting_mob() + var/mob/living/assailant = G.assailant + if(!affecting) + return TRUE + + if(affecting == assailant) + G.done_struggle = TRUE + G.upgrade(TRUE) + return FALSE + + if(!affecting.can_resist() || !affecting.combat_mode) + affecting.visible_message( + span_danger("\The [affecting] isn't prepared to fight back as [assailant] tightens [assailant.p_their()] grip!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + G.done_struggle = TRUE + G.upgrade(TRUE, FALSE) + return FALSE + + affecting.visible_message("[affecting] struggles against [assailant]!", vision_distance = COMBAT_MESSAGE_RANGE) + G.done_struggle = FALSE + addtimer(CALLBACK(G, TYPE_PROC_REF(/obj/item/hand_item/grab, handle_resist)), 1 SECOND) + resolve_struggle(G) + return ..() + +/datum/grab/normal/struggle/proc/resolve_struggle(obj/item/hand_item/grab/G) + set waitfor = FALSE + + #ifdef UNIT_TESTS + var/upgrade_cooldown = 0 + sleep(world.tick_lag) + #endif + + var/datum/callback/user_incapacitated_callback = CALLBACK(src, PROC_REF(resolve_struggle_check), G) + if(do_after(G.assailant, G.affecting, upgrade_cooldown, DO_PUBLIC|IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE, extra_checks = user_incapacitated_callback)) + G.done_struggle = TRUE + G.upgrade(TRUE) + else + if(!QDELETED(G)) + G.downgrade() + +/// Callback for the above proc +/datum/grab/normal/struggle/proc/resolve_struggle_check(obj/item/hand_item/grab/G) + if(QDELETED(G)) + return FALSE + return TRUE + +/datum/grab/normal/struggle/can_upgrade(obj/item/hand_item/grab/G) + . = ..() && G.done_struggle + +/datum/grab/normal/struggle/on_hit_disarm(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to pin.")) + return FALSE + +/datum/grab/normal/struggle/on_hit_grab(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to jointlock.")) + return FALSE + +/datum/grab/normal/struggle/on_hit_harm(obj/item/hand_item/grab/G, atom/A) + to_chat(G.assailant, span_warning("Your grip isn't strong enough to dislocate.")) + return FALSE + +/datum/grab/normal/struggle/resolve_openhand_attack(obj/item/hand_item/grab/G) + return FALSE diff --git a/code/modules/grab/human_grab.dm b/code/modules/grab/human_grab.dm new file mode 100644 index 000000000000..aa852d5419e4 --- /dev/null +++ b/code/modules/grab/human_grab.dm @@ -0,0 +1,36 @@ +/mob/living/carbon/human/add_grab(obj/item/hand_item/grab/grab, use_offhand = FALSE) + if(use_offhand) + . = put_in_inactive_hand(grab) + else + . = put_in_active_hand(grab) + +/mob/living/carbon/human/can_be_grabbed(mob/living/grabber, target_zone, use_offhand) + . = ..() + if(!.) + return + + var/obj/item/bodypart/BP = get_bodypart(deprecise_zone(target_zone)) + if(!istype(BP)) + to_chat(grabber, span_warning("\The [src] is missing that body part!")) + return FALSE + + if(grabber == src) + var/using_slot = use_offhand ? get_inactive_hand() : get_active_hand() + if(!using_slot) + to_chat(src, span_warning("You cannot grab yourself without a usable hand!")) + return FALSE + + if(using_slot == BP) + to_chat(src, span_warning("You can't grab your own [BP.plaintext_zone] with itself!")) + return FALSE + /* + if(pull_damage()) + to_chat(grabber, span_warning("Pulling \the [src] in their current condition would probably be a bad idea.")) + */ + + var/obj/item/clothing/C = get_item_covering_zone(target_zone) + if(istype(C)) + C.add_fingerprint(grabber) + else + add_fingerprint(grabber) + diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 08d379fb0e82..27489e4cda7c 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -199,11 +199,12 @@ /datum/holiday/april_fools/celebrate() . = ..() SSjob.set_overflow_role(/datum/job/clown) - SSticker.set_login_music(list( - "name" = "Clown.ogg", - "author" = "giizismukwa2", - "file" = "sound/ambience/clown.ogg" - )) + var/datum/media/clowntrack = new( + name = "Clown.ogg", + author = "giizismukwa2", + path = "sound/ambience/clown.ogg" + ) + SSticker.set_login_music(clowntrack) /datum/holiday/spess name = "Cosmonautics Day" @@ -256,15 +257,15 @@ //Draconic Day is celebrated on May 3rd, the date on which the Draconic language was merged (#26780) /datum/holiday/draconic_day - name = "Sinta'Unathi Language Day" + name = "Jisanuoari Language Day" begin_month = MAY begin_day = 3 /datum/holiday/draconic_day/greet() - return "On this day, the Unathi celebrate their language with literature and other cultural works." + return "On this day, the Jinan celebrate their language with literature and other cultural works." /datum/holiday/draconic_day/getStationPrefix() - return pick("Draconic", "Literature", "Reading") + return pick("Saurian", "Literature", "Reading") /datum/holiday/firefighter name = "Firefighter's Day" @@ -284,20 +285,6 @@ /datum/holiday/bee/getStationPrefix() return pick("Bee","Honey","Hive","Africanized","Mead","Buzz") -// JUNE - -//The Festival of Atrakor's Might (Tizira's Moon) is celebrated on June 15th, the date on which the lizard visual revamp was merged (#9808) -/datum/holiday/atrakor_festival - name = "Festival of Atrakor's Might" - begin_month = JUNE - begin_day = 15 - -/datum/holiday/atrakor_festival/greet() - return "On this day, the Unathi traditionally celebrate the Festival of Atrakor's Might, where they honour the moon god with lavishly adorned clothing, large portions of food, and a massive celebration into the night." - -/datum/holiday/atrakor_festival/getStationPrefix() - return pick("Moon", "Night Sky", "Celebration") - /// Garbage DAYYYYY /// Huh?.... NOOOO /// *GUNSHOT* @@ -427,17 +414,17 @@ // SEPTEMBER -//Tiziran Unification Day is celebrated on Sept 1st, the day on which lizards were made a roundstart race +//Jitarai Unification Day is celebrated on Sept 1st, the day on which lizards were made a roundstart race /datum/holiday/tiziran_unification - name = "Moghes Unification Day" + name = "Jitarai Unification Day" begin_month = SEPTEMBER begin_day = 1 /datum/holiday/tiziran_unification/greet() - return "On this day over 400 years ago, the Unathi first united under a single banner, ready to face the stars as one unified people." + return "On this day over 900 years ago, the Jinan people first united under Companion, ready to face the stars as one unified people." /datum/holiday/tiziran_unification/getStationPrefix() - return pick("Moghes", "Unathi", "Imperial") + return pick("Jitarai", "Jinan", "Friendly") // Friendly is a reference to Friend Computer from Paranoia /datum/holiday/ianbirthday name = "Ian's Birthday" //github.com/tgstation/tgstation/commit/de7e4f0de0d568cd6e1f0d7bcc3fd34700598acb @@ -740,7 +727,7 @@ ) /datum/holiday/xmas/proc/roundstart_celebrate() - for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines) + for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor as anything in INSTANCES_OF(/obj/machinery/computer/security/telescreen/entertainment)) Monitor.icon_state_on = "entertainment_xmas" for(var/mob/living/simple_animal/pet/dog/corgi/ian/Ian in GLOB.mob_living_list) diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 4291aadbe2c2..4c42d8dbe339 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -192,7 +192,7 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf for(var/turf/possible_blacklist as anything in get_affected_turfs(placement)) if (possible_blacklist.holodeck_compatible) continue - input_blacklist += possible_blacklist + input_blacklist[possible_blacklist] = TRUE ///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) @@ -353,7 +353,7 @@ GLOBAL_LIST_INIT(typecache_holodeck_linked_floorcheck_ok, typecacheof(list(/turf for(var/turf/holo_turf in linked) if(prob(30)) do_sparks(2, 1, holo_turf) - SSexplosions.lowturf += holo_turf + EX_ACT(holo_turf, EXPLODE_LIGHT) holo_turf.hotspot_expose(1000,500,1) if(!(obj_flags & EMAGGED)) diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 202c7ea00139..a7c93c6e0aae 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -11,7 +11,6 @@ name = "holographic energy sword" desc = "May the force be with you. Sorta." damtype = STAMINA - throw_speed = 2 block_chance = 0 throwforce = 0 embedding = null @@ -93,21 +92,19 @@ if(user.transferItemToLoc(W, drop_location())) visible_message(span_warning("[user] dunks [W] into \the [src]!")) -/obj/structure/holohoop/attack_hand(mob/living/user, list/modifiers) +/obj/structure/holohoop/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) . = ..() - if(.) + if(!isliving(victim)) return - if(user.pulling && isliving(user.pulling)) - var/mob/living/L = user.pulling - if(user.grab_state < GRAB_AGGRESSIVE) - to_chat(user, span_warning("You need a better grip to do that!")) - return - L.forceMove(loc) - L.Paralyze(100) - visible_message(span_danger("[user] dunks [L] into \the [src]!")) - user.stop_pulling() - else - ..() + var/mob/living/L = victim + if(grab.current_grab.damage_stage < 1) + to_chat(user, span_warning("You need a better grip to do that!")) + return TRUE + L.forceMove(loc) + L.Paralyze(100) + visible_message(span_danger("[user] dunks [L] into \the [src]!")) + user.release_grabs(L) + return TRUE /obj/structure/holohoop/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if (isitem(AM) && !istype(AM,/obj/projectile)) diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 47dfbd9791c7..e10b385d95fe 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -114,7 +114,8 @@ icon_state = "0" /turf/open/floor/holofloor/space/Initialize(mapload) - icon_state = SPACE_ICON_STATE(x, y, z) // so realistic + appearance = global.space_appearances[(((x + y) ^ ~(x * y) + z) % 25) + 1] // so realistic + layer = initial(layer) . = ..() /turf/open/floor/holofloor/hyperspace @@ -140,8 +141,8 @@ base_icon_state = "carpet" floor_tile = /obj/item/stack/tile/carpet smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_TURF_OPEN, SMOOTH_GROUP_CARPET) - canSmoothWith = list(SMOOTH_GROUP_CARPET) + smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_CARPET + canSmoothWith = SMOOTH_GROUP_CARPET bullet_bounce_sound = null tiled_dirt = FALSE @@ -151,7 +152,7 @@ /turf/open/floor/holofloor/carpet/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if((updates & UPDATE_SMOOTHING) && overfloor_placed) QUEUE_SMOOTH(src) /turf/open/floor/holofloor/wood diff --git a/code/modules/holomap/holomap.dm b/code/modules/holomap/holomap.dm new file mode 100644 index 000000000000..1bfea634130b --- /dev/null +++ b/code/modules/holomap/holomap.dm @@ -0,0 +1,120 @@ +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/holomap, 32) + +/obj/machinery/holomap + name = "station map" + desc = "A monitor containing a map of the station." + icon = 'icons/obj/machines/station_map.dmi' + icon_state = "station_map" + + var/datum/holomap_holder/station/holomap + + /// Is TRUE if this was built on a z level that doesn't have a map. + var/bogus = FALSE + /// The original Z of this map. Aka, what map were going to display. + var/initial_z = null + +/obj/machinery/holomap/Initialize(mapload) + . = ..() + initial_z = z + + if(SSholomap.initialized) + setup_holomap() + else + RegisterSignal(SSdcs, COMSIG_GLOB_HOLOMAPS_READY, PROC_REF(setup_holomap)) + +/obj/machinery/holomap/Destroy() + QDEL_NULL(holomap) + return ..() + +/obj/machinery/holomap/setDir(ndir) + . = ..() + switch(dir) + if(NORTH) + pixel_y = 32 + if(SOUTH) + pixel_y = -32 + if(EAST) + pixel_x = 32 + if(WEST) + pixel_x = -32 + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/holomap/update_overlays() + . = ..() + + var/image/floor_image = image(icon, "station_map_floor") + floor_image.plane = FLOOR_PLANE + floor_image.layer = TURF_DECAL_HIGH_LAYER + switch(dir) + if(NORTH) + floor_image.pixel_y = -32 + if(SOUTH) + floor_image.pixel_y = 32 + if(EAST) + floor_image.pixel_x = -32 + if(WEST) + floor_image.pixel_x = 32 + . += floor_image + + if(!bogus && is_operational && SSholomap.initialized && (initial_z <= length(SSholomap.minimaps))) + . += SSholomap.minimaps[initial_z]["[dir]"] + . += emissive_appearance(SSholomap.minimap_icons[initial_z]["[dir]"]) + +/obj/machinery/holomap/update_icon_state() + if(is_operational) + if(length(holomap?.viewer_map)) + icon_state = "station_map_activate" + else + icon_state = "station_map" + else + icon_state = "station_map0" + return ..() + +/obj/machinery/holomap/set_is_operational(new_value) + . = ..() + + if(!is_operational) + holomap.remove_all_viewers() + +/obj/machinery/holomap/ui_interact(mob/user, special_state) + if(holomap.viewer_map[user]) + holomap.remove_viewer(user) + return + + holomap.show_to(user) + +/// Sets up the actual holomap datum. +/obj/machinery/holomap/proc/setup_holomap(datum/source) + SIGNAL_HANDLER + + var/icon/I = SSholomap.get_holomap(initial_z) + if(isnull(I)) + bogus = TRUE + holomap = new /datum/holomap_holder/invalid(src, null) + + else + holomap = new(src, I) + + update_appearance(UPDATE_OVERLAYS) + + RegisterSignal(holomap, COMSIG_HOLOMAP_VIEWER_REMOVED, PROC_REF(holomap_viewer_gone)) + RegisterSignal(holomap, COMSIG_HOLOMAP_VIEWER_GAINED, PROC_REF(holomap_viewer_gain)) + +/obj/machinery/holomap/proc/holomap_viewer_gain(datum/source, mob/viewer) + SIGNAL_HANDLER + update_appearance(UPDATE_ICON_STATE) + RegisterSignal(viewer, COMSIG_MOVABLE_MOVED, PROC_REF(viewer_moved)) + +/obj/machinery/holomap/proc/holomap_viewer_gone(datum/source, mob/viewer) + SIGNAL_HANDLER + update_appearance(UPDATE_ICON_STATE) + + UnregisterSignal(viewer, COMSIG_MOVABLE_MOVED) + +/obj/machinery/holomap/proc/viewer_moved(mob/source) + SIGNAL_HANDLER + + if(source.z && source.Adjacent(src)) + return + + holomap.remove_viewer(source) diff --git a/code/modules/holomap/holomap_holder.dm b/code/modules/holomap/holomap_holder.dm new file mode 100644 index 000000000000..299aec343e35 --- /dev/null +++ b/code/modules/holomap/holomap_holder.dm @@ -0,0 +1,124 @@ +/datum/holomap_holder + VAR_PRIVATE/image/holomap + /// A physical object this holomap is bound to. Optional. + var/atom/movable/parent + + /// Used by children to properly position elements on the map. + var/offset_x = 0 + /// Used by children to properly position elements on the map. + var/offset_y = 0 + + /// k:v list of mob:image + var/list/viewer_map = list() + +/datum/holomap_holder/New(parent, icon/holomap_icon) + src.parent = parent + + holomap = image(holomap_icon) + holomap.plane = FULLSCREEN_PLANE + + offset_x = SSmapping.config.holomap_offsets[1] + offset_y = SSmapping.config.holomap_offsets[2] + +/datum/holomap_holder/Destroy(force, ...) + remove_all_viewers() + parent = null + return ..() + +/// Remove all viewers +/datum/holomap_holder/proc/remove_all_viewers() + for(var/mob/viewer as anything in viewer_map) + remove_viewer(viewer, TRUE) + +/// Removes a viewer. +/datum/holomap_holder/proc/remove_viewer(mob/viewer, immediately) + if(!(viewer in viewer_map)) + return FALSE + + var/image/holomap_image = viewer_map[viewer] + viewer_map -= viewer + + UnregisterSignal(viewer, list(COMSIG_MOVABLE_MOVED, COMSIG_MOB_LOGOUT)) + + if(immediately) + holomap_image.loc = null + viewer.client?.images -= holomap_image + else + animate(holomap_image, alpha = 0, time = 5, easing = LINEAR_EASING) + addtimer(CALLBACK(src, PROC_REF(remove_image_delayed), WEAKREF(viewer), holomap_image), 0.5 SECONDS) + + SEND_SIGNAL(src, COMSIG_HOLOMAP_VIEWER_REMOVED, viewer) + return TRUE + +/// Show the map to a mob and add them to the viewers list. +/datum/holomap_holder/proc/show_to(mob/user) + if(!user.client) + return FALSE + + var/image/holomap_image = get_image() + holomap_image.alpha = 0 + holomap_image.loc = user.hud_used.holomap_container + user.client.images += holomap_image + + viewer_map[user] = holomap_image + + animate(holomap_image, alpha = 255, time = 5, easing = LINEAR_EASING) + RegisterSignal(user, COMSIG_MOB_LOGOUT, PROC_REF(viewer_logout)) + + SEND_SIGNAL(src, COMSIG_HOLOMAP_VIEWER_GAINED, user) + return holomap_image + +/datum/holomap_holder/proc/viewer_logout(mob/source) + SIGNAL_HANDLER + remove_viewer(source, TRUE) + +/datum/holomap_holder/proc/remove_image_delayed(datum/weakref/viewer_ref, image/holomap_image) + holomap_image.loc = null + + var/mob/viewer = viewer_ref?.resolve() + if(!viewer?.client) + return + + viewer.client.images -= holomap_image + +/// Returns the holomap image. +/datum/holomap_holder/proc/get_image() as /image + var/image/out = image(holomap) + out.appearance = holomap.appearance + return out + +/// Adds a "you are here" overlay to the given image based on the given location. +/datum/holomap_holder/proc/you_are_here(image/map, atom/loc) + var/turf/T = get_turf(loc) + var/image/I = image('icons/hud/holomap/holomap_markers.dmi', "you") + I.pixel_x = T.x + offset_x - 6 // -6 is to account for the icon being off-center + I.pixel_y = T.y + offset_y - 6 + + map.overlays += I + +/datum/holomap_holder/station + +/datum/holomap_holder/station/New(parent, icon/holomap_icon) + ..() + var/image/I = image('icons/hud/holomap/holomap_64x64.dmi', "legend") + I.pixel_x = round(HOLOMAP_SIZE / 6) + I.pixel_y = round(HOLOMAP_SIZE * 0.75) + holomap.overlays += I + + I = image('icons/hud/holomap/holomap_64x64.dmi', "youarehere") + I.pixel_x = round(HOLOMAP_SIZE / 6) + I.pixel_y = round(HOLOMAP_SIZE * 0.75) + holomap.overlays += I + +/datum/holomap_holder/station/get_image() + . = ..() + you_are_here(., parent) + +/datum/holomap_holder/invalid + +/datum/holomap_holder/invalid/New(parent, icon/holomap_icon) + holomap_icon = SSholomap.invalid_holomap_icon + ..() + +/datum/holomap_holder/invalid/you_are_here(image/map, atom/loc) + return diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm index 11fea29e044a..fdeb6989f770 100644 --- a/code/modules/hydroponics/beekeeping/beebox.dm +++ b/code/modules/hydroponics/beekeeping/beebox.dm @@ -65,7 +65,7 @@ var/datum/reagent/R = null if(random_reagent) R = pick(subtypesof(/datum/reagent)) - R = GLOB.chemical_reagents_list[R] + R = SSreagents.chemical_reagents_list[R] queen_bee = new(src) queen_bee.beehome = src @@ -214,7 +214,7 @@ visible_message(span_danger("[user] disturbs the [name] to no effect!")) else var/option = tgui_alert(user, "Which piece do you wish to remove?", "Apiary Adjustment", list("Honey Frame", "Queen Bee")) - if(!option || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE)) + if(!option || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE)) return switch(option) if("Honey Frame") diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm index e2e3409d05af..8ca6306cff03 100644 --- a/code/modules/hydroponics/beekeeping/honeycomb.dm +++ b/code/modules/hydroponics/beekeeping/honeycomb.dm @@ -30,7 +30,7 @@ /obj/item/reagent_containers/honeycomb/proc/set_reagent(reagent) - var/datum/reagent/R = GLOB.chemical_reagents_list[reagent] + var/datum/reagent/R = SSreagents.chemical_reagents_list[reagent] if(istype(R)) name = "honeycomb ([R.name])" honey_color = R.color diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm index 2ce5874a09bd..736e9a717a8c 100644 --- a/code/modules/hydroponics/biogenerator.dm +++ b/code/modules/hydroponics/biogenerator.dm @@ -36,11 +36,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += beaker + EX_ACT(beaker, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += beaker + EX_ACT(beaker, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += beaker + EX_ACT(beaker, EXPLODE_LIGHT) /obj/machinery/biogenerator/handle_atom_del(atom/A) ..() @@ -143,7 +143,7 @@ /obj/machinery/biogenerator/AltClick(mob/living/user) . = ..() - if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) && can_interact(user)) + if(user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK) && can_interact(user)) eject_beaker(user) /** @@ -282,7 +282,7 @@ /obj/machinery/biogenerator/ui_assets(mob/user) return list( - get_asset_datum(/datum/asset/spritesheet/research_designs), + get_asset_datum(/datum/asset/spritesheet/biogenerator_designs), ) /obj/machinery/biogenerator/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm index 41f1a74e57f0..3c10737dabcc 100644 --- a/code/modules/hydroponics/grown/ambrosia.dm +++ b/code/modules/hydroponics/grown/ambrosia.dm @@ -25,7 +25,7 @@ icon_dead = "ambrosia-dead" genes = list(/datum/plant_gene/trait/repeated_harvest) mutatelist = list(/obj/item/seeds/ambrosia/deus) - reagents_add = list(/datum/reagent/medicine/c2/aiuri = 0.1, /datum/reagent/medicine/c2/libital = 0.1 ,/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1) + reagents_add = list(/datum/reagent/medicine/kelotane = 0.1, /datum/reagent/medicine/bicaridine = 0.1 ,/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1) /obj/item/food/grown/ambrosia/vulgaris seed = /obj/item/seeds/ambrosia @@ -42,7 +42,7 @@ plantname = "Ambrosia Deus" product = /obj/item/food/grown/ambrosia/deus mutatelist = list(/obj/item/seeds/ambrosia/gaia) - reagents_add = list(/datum/reagent/medicine/omnizine = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) + reagents_add = list(/datum/reagent/medicine/tricordrazine = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) rarity = 40 /obj/item/food/grown/ambrosia/deus @@ -61,7 +61,7 @@ plantname = "Ambrosia Gaia" product = /obj/item/food/grown/ambrosia/gaia mutatelist = list(/obj/item/seeds/ambrosia/deus) - reagents_add = list(/datum/reagent/medicine/earthsblood = 0.05, /datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/nutriment/vitamin = 0.05) + reagents_add = list(/datum/reagent/medicine/morphine = 0.05, /datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/nutriment/vitamin = 0.05) rarity = 30 //These are some pretty good plants right here genes = list() weed_rate = 4 @@ -71,7 +71,7 @@ name = "ambrosia gaia branch" desc = "Eating this makes you immortal." icon_state = "ambrosia_gaia" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 3 seed = /obj/item/seeds/ambrosia/gaia wine_power = 70 diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm index 2360d5a5ce48..40fdddf871a0 100644 --- a/code/modules/hydroponics/grown/banana.dm +++ b/code/modules/hydroponics/grown/banana.dm @@ -32,8 +32,8 @@ . = ..() var/obj/item/grown/bananapeel/peel = . if(istype(peel)) - peel.grind_results = list(/datum/reagent/medicine/coagulant/banana_peel = peel.seed.potency * 0.2) - peel.juice_results = list(/datum/reagent/medicine/coagulant/banana_peel = peel.seed.potency * 0.2) + peel.grind_results = list(/datum/reagent/medicine/coagulant = peel.seed.potency * 0.2) + peel.juice_results = list(/datum/reagent/medicine/coagulant = peel.seed.potency * 0.2) /obj/item/food/grown/banana/suicide_act(mob/user) user.visible_message(span_suicide("[user] is aiming [src] at [user.p_them()]self! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -59,7 +59,6 @@ inhand_icon_state = "banana_peel" w_class = WEIGHT_CLASS_TINY throwforce = 0 - throw_speed = 3 throw_range = 7 /obj/item/grown/bananapeel/Initialize(mapload) @@ -116,7 +115,7 @@ product = /obj/item/food/grown/banana/bluespace mutatelist = null genes = list(/datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest) - reagents_add = list(/datum/reagent/bluespace = 0.2, /datum/reagent/consumable/banana = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.02) + reagents_add = list(/datum/reagent/consumable/banana = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.02) rarity = 30 graft_gene = /datum/plant_gene/trait/teleport @@ -141,7 +140,7 @@ name = "synthesized banana peel" desc = "A synthetic banana peel." -/obj/item/grown/bananapeel/specialpeel/ComponentInitialize() +/obj/item/grown/bananapeel/specialpeel/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery, 40) diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm index caf98f60fee0..79ec37fa78b1 100644 --- a/code/modules/hydroponics/grown/berries.dm +++ b/code/modules/hydroponics/grown/berries.dm @@ -64,7 +64,7 @@ lifespan = 30 potency = 50 mutatelist = null - reagents_add = list(/datum/reagent/toxin/coniine = 0.08, /datum/reagent/toxin/staminatoxin = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) + reagents_add = list(/datum/reagent/toxin/lexorin = 0.08, /datum/reagent/toxin/staminatoxin = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 30 /obj/item/food/grown/berries/death @@ -148,7 +148,7 @@ species = "greengrape" plantname = "Green-Grape Vine" product = /obj/item/food/grown/grapes/green - reagents_add = list( /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1, /datum/reagent/medicine/c2/aiuri = 0.2) + reagents_add = list( /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1, /datum/reagent/medicine/kelotane = 0.2) mutatelist = null /obj/item/food/grown/grapes/green diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm index 6363bc0e680f..f85261e74b9e 100644 --- a/code/modules/hydroponics/grown/cannabis.dm +++ b/code/modules/hydroponics/grown/cannabis.dm @@ -29,7 +29,7 @@ plantname = "Rainbow Weed" product = /obj/item/food/grown/cannabis/rainbow mutatelist = null - reagents_add = list(/datum/reagent/colorful_reagent = 0.05, /datum/reagent/medicine/psicodine = 0.03, /datum/reagent/drug/happiness = 0.1, /datum/reagent/toxin/mindbreaker = 0.1, /datum/reagent/toxin/lipolicide = 0.15, /datum/reagent/drug/space_drugs = 0.15) + reagents_add = list(/datum/reagent/colorful_reagent = 0.05, /datum/reagent/medicine/haloperidol = 0.03, /datum/reagent/toxin/mindbreaker = 0.1, /datum/reagent/toxin/lipolicide = 0.15, /datum/reagent/drug/space_drugs = 0.15) rarity = 40 /obj/item/seeds/cannabis/death @@ -52,7 +52,7 @@ instability = 30 product = /obj/item/food/grown/cannabis/white mutatelist = null - reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/cannabis = 0.15) + reagents_add = list(/datum/reagent/medicine/tricordrazine = 0.35, /datum/reagent/drug/cannabis = 0.15) rarity = 40 diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm index bae6cb406040..cc760c7087d9 100644 --- a/code/modules/hydroponics/grown/cocoa_vanilla.dm +++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm @@ -91,7 +91,6 @@ desc = "A large seed, it is said to be potent enough to be able to stop a mans heart." w_class = WEIGHT_CLASS_TINY throwforce = 5 - throw_speed = 3 throw_range = 7 foodtypes = TOXIC tastes = list("acrid bitterness" = 1) diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm index 9c5f10994130..cf4f8119ca15 100644 --- a/code/modules/hydroponics/grown/corn.dm +++ b/code/modules/hydroponics/grown/corn.dm @@ -39,7 +39,6 @@ inhand_icon_state = "corncob" w_class = WEIGHT_CLASS_TINY throwforce = 0 - throw_speed = 3 throw_range = 7 grind_results = list(/datum/reagent/cellulose = 10) //really partially hemicellulose @@ -70,7 +69,6 @@ inhand_icon_state = "corncob" w_class = WEIGHT_CLASS_TINY throwforce = 0 - throw_speed = 3 throw_range = 7 var/snap_pops = 1 diff --git a/code/modules/hydroponics/grown/cotton.dm b/code/modules/hydroponics/grown/cotton.dm index 394b7646b821..934c080cd33a 100644 --- a/code/modules/hydroponics/grown/cotton.dm +++ b/code/modules/hydroponics/grown/cotton.dm @@ -26,7 +26,6 @@ force = 0 throwforce = 0 w_class = WEIGHT_CLASS_TINY - throw_speed = 2 throw_range = 3 attack_verb_continuous = list("pomfs") attack_verb_simple = list("pomf") @@ -38,21 +37,9 @@ var/seed_modifier = 0 if(seed) seed_modifier = round(seed.potency / 25) - var/obj/item/stack/cotton = new cotton_type(user.loc, 1 + seed_modifier) - var/old_cotton_amount = cotton.amount - for(var/obj/item/stack/potential_stack in user.loc) - if(QDELETED(potential_stack)) - continue - if(potential_stack == cotton) - continue - if(!istype(potential_stack, cotton_type)) - continue - if(potential_stack.amount >= potential_stack.max_amount) - continue - potential_stack.attackby(cotton, user) - - if(cotton.amount > old_cotton_amount) - to_chat(user, span_notice("You add the newly-formed [cotton_name] to the stack. It now contains [cotton.amount] [cotton_name].")) + var/amount = 1 + seed_modifier + var/obj/item/stack/cotton = new cotton_type(user.drop_location(), amount) + to_chat(user, span_notice("You pull [src] apart, salvaging [amount] [cotton.name].")) qdel(src) //reinforced mutated variant @@ -83,7 +70,6 @@ force = 5 throwforce = 5 w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 throw_range = 3 attack_verb_continuous = list("bashes", "batters", "bludgeons", "whacks") attack_verb_simple = list("bash", "batter", "bludgeon", "whack") diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm index 3f1f30a74990..e7840dfec6cc 100644 --- a/code/modules/hydroponics/grown/flowers.dm +++ b/code/modules/hydroponics/grown/flowers.dm @@ -17,7 +17,7 @@ icon_dead = "poppy-dead" genes = list(/datum/plant_gene/trait/preserved) mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily) - reagents_add = list(/datum/reagent/medicine/c2/libital = 0.2, /datum/reagent/consumable/nutriment = 0.05) + reagents_add = list(/datum/reagent/medicine/morphine = 0.2, /datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/poppy seed = /obj/item/seeds/poppy @@ -70,10 +70,9 @@ icon_grow = "spacemanstrumpet-grow" icon_dead = "spacemanstrumpet-dead" mutatelist = null - genes = list(/datum/plant_gene/reagent/preset/polypyr, /datum/plant_gene/trait/preserved) + genes = list(/datum/plant_gene/trait/preserved) reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) rarity = 30 - graft_gene = /datum/plant_gene/reagent/preset/polypyr /obj/item/food/grown/trumpet seed = /obj/item/seeds/poppy/lily/trumpet @@ -274,7 +273,7 @@ icon_dead = "rose-dead" mutatelist = list(/obj/item/seeds/carbon_rose) //Roses are commonly used as herbal medicines (diarrhodons) and for their 'rose oil'. - reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/granibitaluri = 0.1, /datum/reagent/fuel/oil = 0.05) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/tricordrazine = 0.1, /datum/reagent/fuel/oil = 0.05) /obj/item/food/grown/rose seed = /obj/item/seeds/rose @@ -294,10 +293,10 @@ . = ..() if(slot == ITEM_SLOT_MASK) worn_icon_state = "[base_icon_state]_mouth" - user.update_worn_mask() else worn_icon_state = base_icon_state - user.update_worn_head() + + update_slot_icon() // Carbon Rose /obj/item/seeds/carbon_rose @@ -316,7 +315,7 @@ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' icon_grow = "carbonrose-grow" icon_dead = "carbonrose-dead" - reagents_add = list(/datum/reagent/plastic_polymers = 0.05) + reagents_add = list(/datum/reagent/carbon = 0.1) rarity = 10 graft_gene = /datum/plant_gene/reagent/preset/carbon diff --git a/code/modules/hydroponics/grown/hedges.dm b/code/modules/hydroponics/grown/hedges.dm index 3c486aef2b05..e87f7f5d6ded 100644 --- a/code/modules/hydroponics/grown/hedges.dm +++ b/code/modules/hydroponics/grown/hedges.dm @@ -38,8 +38,8 @@ icon_state = "hedge-0" base_icon_state = "hedge" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_HEDGE_FLUFF) - canSmoothWith = list(SMOOTH_GROUP_HEDGE_FLUFF) + smoothing_groups = SMOOTH_GROUP_HEDGE_FLUFF + canSmoothWith = SMOOTH_GROUP_HEDGE_FLUFF density = TRUE anchored = TRUE opacity = FALSE diff --git a/code/modules/hydroponics/grown/korta_nut.dm b/code/modules/hydroponics/grown/korta_nut.dm index c0d715c6cda5..4890cb0a7420 100644 --- a/code/modules/hydroponics/grown/korta_nut.dm +++ b/code/modules/hydroponics/grown/korta_nut.dm @@ -1,7 +1,7 @@ //Korta Nut /obj/item/seeds/korta_nut name = "pack of korta nut seeds" - desc = "These seeds grow into korta nut bushes, native to Tizira." + desc = "These seeds grow into korta nut bushes." icon_state = "seed-korta" species = "kortanut" plantname = "Korta Nut Bush" @@ -30,7 +30,7 @@ //Sweet Korta Nut /obj/item/seeds/korta_nut/sweet name = "pack of sweet korta nut seeds" - desc = "These seeds grow into sweet korta nuts, a mutation of the original species that produces a thick syrup that Tizirans use for desserts." + desc = "These seeds grow into sweet korta nuts, a mutation of the original species that produces a thick syrup used as a sweetener." icon_state = "seed-sweetkorta" species = "kortanut" plantname = "Sweet Korta Nut Bush" diff --git a/code/modules/hydroponics/grown/kronkus.dm b/code/modules/hydroponics/grown/kronkus.dm deleted file mode 100644 index b1e7ee39f3ca..000000000000 --- a/code/modules/hydroponics/grown/kronkus.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/item/seeds/kronkus - name = "pack of kronkus seeds" - desc = "A pack of highly illegal kronkus seeds.\nPossession of these seeds carries the death penalty in 7 sectors." - icon_state = "seed-kronkus" - species = "kronkus" - plantname = "Kronkus Vine" - product = /obj/item/food/grown/kronkus - //shitty stats, because botany is easy - lifespan = 60 - endurance = 10 - maturation = 8 - production = 4 - yield = 3 - growthstages = 3 - growing_icon = 'icons/obj/hydroponics/growing.dmi' - reagents_add = list(/datum/reagent/consumable/nutriment = 0.05) - -/obj/item/food/grown/kronkus - seed = /obj/item/seeds/kronkus - name = "kronkus vine segment" - desc = "A piece of mature kronkus vine. It exudes a sharp and noxious odor." - icon_state = "kronkus" - filling_color = "#37946e" - foodtypes = VEGETABLES | TOXIC - distill_reagent = /datum/reagent/kronkus_extract diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm index 0ac8956be401..cf90ee900549 100644 --- a/code/modules/hydroponics/grown/melon.dm +++ b/code/modules/hydroponics/grown/melon.dm @@ -91,7 +91,6 @@ if(!holy_person.mind?.holy_role || HAS_TRAIT(holy_person, TRAIT_AGEUSIA)) return to_chat(holy_person, span_notice("Truly, a piece of heaven!")) - SEND_SIGNAL(holy_person, COMSIG_ADD_MOOD_EVENT, "Divine_chew", /datum/mood_event/holy_consumption) return FOOD_LIKED /// Barrel melon Seeds diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index 388cb4c086e6..d47adec58182 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -22,7 +22,7 @@ growthstages = 4 genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/medicine/morphine = 0.35, /datum/reagent/medicine/c2/multiver = 0.35, /datum/reagent/consumable/nutriment = 0) + reagents_add = list(/datum/reagent/medicine/morphine = 0.35, /datum/reagent/medicine/dylovene = 0.35, /datum/reagent/consumable/nutriment = 0) graft_gene = /datum/plant_gene/trait/plant_type/fungal_metabolism /obj/item/food/grown/mushroom/reishi @@ -283,7 +283,7 @@ product = /obj/item/food/grown/mushroom/glowshroom/glowcap genes = list(/datum/plant_gene/trait/glow/red, /datum/plant_gene/trait/cell_charge, /datum/plant_gene/trait/plant_type/fungal_metabolism) mutatelist = null - reagents_add = list(/datum/reagent/teslium = 0.1, /datum/reagent/consumable/nutriment = 0.04) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.04) rarity = 30 graft_gene = /datum/plant_gene/trait/cell_charge diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 25a046acd6d6..a39cc95ab42f 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -50,10 +50,10 @@ AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/onion_slice/red, 2, 15) /obj/item/food/grown/onion/UsedforProcessing(mob/living/user, obj/item/I, list/chosen_option) - var/datum/effect_system/smoke_spread/chem/S = new //Since the onion is destroyed when it's sliced, + var/datum/effect_system/fluid_spread/smoke/chem/S = new //Since the onion is destroyed when it's sliced, var/splat_location = get_turf(src) //we need to set up the smoke beforehand S.attach(splat_location) - S.set_up(reagents, 0, splat_location, 0) + S.set_up(0, location = splat_location, carry = reagents, silent = FALSE) S.start() qdel(S) return ..() diff --git a/code/modules/hydroponics/grown/peas.dm b/code/modules/hydroponics/grown/peas.dm index 8a7ca8610396..42a6c4ddc9cb 100644 --- a/code/modules/hydroponics/grown/peas.dm +++ b/code/modules/hydroponics/grown/peas.dm @@ -76,7 +76,7 @@ icon_grow = "worldpeas-grow" icon_dead = "worldpeas-dead" genes = list (/datum/plant_gene/trait/glow/blue) - reagents_add = list (/datum/reagent/pax = 0.1, /datum/reagent/drug/happiness = 0.1, /datum/reagent/consumable/nutriment = 0.15) + reagents_add = list (/datum/reagent/pax = 0.1, /datum/reagent/consumable/nutriment = 0.15) rarity = 50 // This absolutely will make even the most hardened Syndicate Operators relax. graft_gene = /datum/plant_gene/trait/glow/blue mutatelist = null diff --git a/code/modules/hydroponics/grown/rainbow_bunch.dm b/code/modules/hydroponics/grown/rainbow_bunch.dm index 91c6aae2cfa5..97ea24c4789d 100644 --- a/code/modules/hydroponics/grown/rainbow_bunch.dm +++ b/code/modules/hydroponics/grown/rainbow_bunch.dm @@ -29,7 +29,6 @@ force = 0 throwforce = 0 w_class = WEIGHT_CLASS_TINY - throw_speed = 2 throw_range = 3 attack_verb_continuous = list("pompfs") attack_verb_simple = list("pompf") diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 0e844afde067..f76da39b6ce9 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -164,7 +164,7 @@ return result // Make sure they can still interact with the parent hydroponics tray. - if(!user.canUseTopic(parent, BE_CLOSE)) + if(!user.canUseTopic(parent, USE_CLOSE)) to_chat(user, text = "You are no longer able to harvest the seeds from [parent]!", type = MESSAGE_TYPE_INFO) return result @@ -183,9 +183,10 @@ var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc) if(realName) - podman.real_name = realName + podman.set_real_name(realName) else - podman.real_name = "Pod Person ([rand(1,999)])" + podman.set_real_name("Pod Person ([rand(1,999)])") + mind.transfer_to(podman) if(ckey) podman.ckey = ckey diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm index 1854bb12c6ce..d4eaad1fdcfd 100644 --- a/code/modules/hydroponics/grown/root.dm +++ b/code/modules/hydroponics/grown/root.dm @@ -13,7 +13,7 @@ growthstages = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' mutatelist = list(/obj/item/seeds/carrot/parsnip) - reagents_add = list(/datum/reagent/medicine/oculine = 0.25, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) + reagents_add = list(/datum/reagent/medicine/imidazoline = 0.25, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05) /obj/item/food/grown/carrot seed = /obj/item/seeds/carrot diff --git a/code/modules/hydroponics/grown/tea_coffee.dm b/code/modules/hydroponics/grown/tea_coffee.dm index 72ef53545d04..fc7a8ee01958 100644 --- a/code/modules/hydroponics/grown/tea_coffee.dm +++ b/code/modules/hydroponics/grown/tea_coffee.dm @@ -41,7 +41,7 @@ name = "Tea Astra tips" icon_state = "tea_astra_leaves" bite_consumption_mod = 2 - grind_results = list(/datum/reagent/toxin/teapowder = 0, /datum/reagent/medicine/salglu_solution = 0) + grind_results = list(/datum/reagent/toxin/teapowder = 0, /datum/reagent/medicine/saline_glucose = 0) // Coffee diff --git a/code/modules/hydroponics/grown/tobacco.dm b/code/modules/hydroponics/grown/tobacco.dm index c47bdfc32f66..be7ea628bcc0 100644 --- a/code/modules/hydroponics/grown/tobacco.dm +++ b/code/modules/hydroponics/grown/tobacco.dm @@ -31,7 +31,7 @@ plantname = "Space Tobacco Plant" product = /obj/item/food/grown/tobacco/space mutatelist = null - reagents_add = list(/datum/reagent/medicine/salbutamol = 0.05, /datum/reagent/drug/nicotine = 0.08, /datum/reagent/consumable/nutriment = 0.03) + reagents_add = list(/datum/reagent/medicine/dexalin = 0.05, /datum/reagent/drug/nicotine = 0.08, /datum/reagent/consumable/nutriment = 0.03) rarity = 20 /obj/item/food/grown/tobacco/space diff --git a/code/modules/hydroponics/grown/tomato.dm b/code/modules/hydroponics/grown/tomato.dm index 4f906624a74f..5c637d050cf0 100644 --- a/code/modules/hydroponics/grown/tomato.dm +++ b/code/modules/hydroponics/grown/tomato.dm @@ -86,7 +86,7 @@ yield = 2 mutatelist = null genes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/slip, /datum/plant_gene/trait/teleport, /datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/backfire/bluespace) - reagents_add = list(/datum/reagent/lube = 0.2, /datum/reagent/bluespace = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) + reagents_add = list(/datum/reagent/lube = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) rarity = 50 graft_gene = /datum/plant_gene/trait/teleport diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 5ba7b3d7f72a..997ade38cdbd 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -38,7 +38,6 @@ force = 5 throwforce = 5 w_class = WEIGHT_CLASS_NORMAL - throw_speed = 2 throw_range = 3 attack_verb_continuous = list("bashes", "batters", "bludgeons", "whacks") attack_verb_simple = list("bash", "batter", "bludgeon", "whack") @@ -47,7 +46,6 @@ var/static/list/accepted = typecacheof(list( /obj/item/food/grown/tobacco, /obj/item/food/grown/tea, - /obj/item/food/grown/ash_flora/mushroom_leaf, /obj/item/food/grown/ambrosia/vulgaris, /obj/item/food/grown/ambrosia/deus, /obj/item/food/grown/wheat, @@ -79,20 +77,6 @@ return NONE /obj/item/grown/log/attackby(obj/item/W, mob/user, params) - if(W.sharpness & SHARP_EDGED) - user.show_message(span_notice("You make [plank_name] out of \the [src]!"), MSG_VISUAL) - var/seed_modifier = 0 - if(seed) - seed_modifier = round(seed.potency / 25) - var/obj/item/stack/plank = new plank_type(user.loc, 1 + seed_modifier, FALSE) - var/old_plank_amount = plank.amount - for (var/obj/item/stack/ST in user.loc) - if (ST != plank && istype(ST, plank_type) && ST.amount < ST.max_amount) - ST.attackby(plank, user) //we try to transfer all old unfinished stacks to the new stack we created. - if (plank.amount > old_plank_amount) - to_chat(user, span_notice("You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name].")) - qdel(src) - if(CheckAccepted(W)) var/obj/item/food/grown/leaf = W if(HAS_TRAIT(leaf, TRAIT_DRIED)) @@ -108,6 +92,13 @@ else return ..() +/// Returns an amount of planks that the log will yield +/obj/item/grown/log/proc/get_plank_amount() + var/plank_amount = 1 + if(seed) + plank_amount += round(seed.potency / 25) + return plank_amount + /obj/item/grown/log/proc/CheckAccepted(obj/item/I) return is_type_in_typecache(I, accepted) diff --git a/code/modules/hydroponics/grown/weeds/kudzu.dm b/code/modules/hydroponics/grown/weeds/kudzu.dm index a12c64e97d78..0fac5b49194a 100644 --- a/code/modules/hydroponics/grown/weeds/kudzu.dm +++ b/code/modules/hydroponics/grown/weeds/kudzu.dm @@ -15,7 +15,7 @@ growthstages = 4 rarity = 30 var/list/mutations = list() - reagents_add = list(/datum/reagent/medicine/c2/multiver = 0.04, /datum/reagent/consumable/nutriment = 0.02) + reagents_add = list(/datum/reagent/medicine/dylovene = 0.04, /datum/reagent/consumable/nutriment = 0.02) graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy /obj/item/seeds/kudzu/Copy() @@ -60,7 +60,7 @@ /obj/item/seeds/kudzu/on_chem_reaction(datum/reagents/reagents) var/list/temp_mut_list = list() - if(reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine, 5)) + if(reagents.has_reagent(/datum/reagent/space_cleaner, 5)) for(var/datum/spacevine_mutation/SM in mutations) if(SM.quality == NEGATIVE) temp_mut_list += SM @@ -76,14 +76,6 @@ mutations.Remove(pick(temp_mut_list)) temp_mut_list.Cut() - if(reagents.has_reagent(/datum/reagent/phenol, 5)) - for(var/datum/spacevine_mutation/SM in mutations) - if(SM.quality == MINOR_NEGATIVE) - temp_mut_list += SM - if(prob(20) && temp_mut_list.len) - mutations.Remove(pick(temp_mut_list)) - temp_mut_list.Cut() - if(reagents.has_reagent(/datum/reagent/blood, 15)) adjust_production(rand(15, -5)) diff --git a/code/modules/hydroponics/grown/weeds/nettle.dm b/code/modules/hydroponics/grown/weeds/nettle.dm index 26803bef4acf..b9bdb97dccb4 100644 --- a/code/modules/hydroponics/grown/weeds/nettle.dm +++ b/code/modules/hydroponics/grown/weeds/nettle.dm @@ -45,7 +45,6 @@ hitsound = 'sound/weapons/bladeslice.ogg' throwforce = 5 w_class = WEIGHT_CLASS_TINY - throw_speed = 1 throw_range = 3 attack_verb_continuous = list("stings") attack_verb_simple = list("sting") diff --git a/code/modules/hydroponics/grown/weeds/starthistle.dm b/code/modules/hydroponics/grown/weeds/starthistle.dm index e6de2ed11457..8d80bd167335 100644 --- a/code/modules/hydroponics/grown/weeds/starthistle.dm +++ b/code/modules/hydroponics/grown/weeds/starthistle.dm @@ -15,7 +15,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, /obj/item/seeds/galaxythistle) + mutatelist = list(/obj/item/seeds/galaxythistle) graft_gene = /datum/plant_gene/trait/plant_type/weed_hardy /obj/item/seeds/starthistle/harvest(mob/user) @@ -30,23 +30,10 @@ parent.update_tray(user, seed_count) -// Corpse flower -/obj/item/seeds/starthistle/corpse_flower - name = "pack of corpse flower seeds" - desc = "A species of plant that emits a horrible odor. The odor stops being produced in difficult atmospheric conditions." - icon_state = "seed-corpse-flower" - species = "corpse-flower" - plantname = "Corpse flower" - production = 2 - growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' - genes = list(/datum/plant_gene/trait/gas_production) - mutatelist = null - reagents_add = list(/datum/reagent/toxin/formaldehyde = 0.1) - //Galaxy Thistle /obj/item/seeds/galaxythistle name = "pack of galaxythistle seeds" - desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged liver." + desc = "An impressive species of weed that is thought to have evolved from the simple milk thistle. Contains flavolignans that can help repair a damaged organs." icon_state = "seed-galaxythistle" species = "galaxythistle" plantname = "Galaxythistle" @@ -62,7 +49,7 @@ growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi' genes = list(/datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/invasive/galaxythistle) mutatelist = null - reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/silibinin = 0.1) + reagents_add = list(/datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/peridaxon = 0.1) graft_gene = /datum/plant_gene/trait/invasive /obj/item/food/grown/galaxythistle diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index d70f506ac014..bbf66dd5e661 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -483,7 +483,7 @@ force = 12 w_class = WEIGHT_CLASS_SMALL throwforce = 15 - throw_speed = 4 + throw_speed = 1.5 throw_range = 7 embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) custom_materials = list(/datum/material/iron = 15000) @@ -515,11 +515,10 @@ desc = "A sharp and curved blade on a long fibremetal handle, this tool makes it easy to reap what you sow." force = 13 throwforce = 5 - throw_speed = 2 throw_range = 3 w_class = WEIGHT_CLASS_BULKY flags_1 = CONDUCT_1 - armour_penetration = 20 + armor_penetration = 20 slot_flags = ITEM_SLOT_BACK attack_verb_continuous = list("chops", "slices", "cuts", "reaps") attack_verb_simple = list("chop", "slice", "cut", "reap") @@ -583,7 +582,7 @@ to_chat(trimmer, span_warning("[pod] [pod.p_do()]n't have a head!")) return if(location == BODY_ZONE_HEAD && !trimmer.combat_mode) - if(!trimmer.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!trimmer.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return var/new_style = tgui_input_list(trimmer, "Select a hairstyle", "Grooming", GLOB.pod_hair_list) if(isnull(new_style)) diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 73b6c4af80ca..3163877a760a 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -47,6 +47,7 @@ var/unwrenchable = TRUE ///Have we been visited by a bee recently, so bees dont overpollinate one plant var/recent_bee_visit = FALSE + var/using_irrigation = FALSE ///The last user to add a reagent to the tray, mostly for logging purposes. var/datum/weakref/lastuser ///If the tray generates nutrients and water on its own @@ -153,10 +154,8 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "hydrotray3" -/obj/machinery/hydroponics/constructable/ComponentInitialize() +/obj/machinery/hydroponics/constructable/Initialize(mapload) . = ..() - AddComponent(/datum/component/simple_rotation) - AddComponent(/datum/component/plumbing/simple_demand) AddComponent(/datum/component/usb_port, list(/obj/item/circuit_component/hydroponics)) /obj/machinery/hydroponics/constructable/RefreshParts() @@ -199,12 +198,33 @@ if(!QDELETED(src) && gone == myseed) set_seed(null, FALSE) +/obj/machinery/hydroponics/proc/FindConnected() + var/list/connected = list() + var/list/processing_atoms = list(src) + + while(processing_atoms.len) + var/atom/a = processing_atoms[1] + for(var/step_dir in GLOB.cardinals) + var/obj/machinery/hydroponics/h = locate() in get_step(a, step_dir) + // Soil plots aren't dense + if(h && h.using_irrigation && h.density && !(h in connected) && !(h in processing_atoms)) + processing_atoms += h + + processing_atoms -= a + connected += a + + return connected + /obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/living/user, params) if (!user.combat_mode) // handle opening the panel if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) return - if(default_deconstruction_crowbar(I)) + // handle deconstructing the machine, if permissible + if(I.tool_behaviour == TOOL_CROWBAR && using_irrigation) + to_chat(user, "Disconnect the hoses first!") + return + else if(default_deconstruction_crowbar(I)) return return ..() @@ -256,9 +276,9 @@ // Nutrients deplete at a constant rate, since new nutrients can boost stats far easier. apply_chemicals(lastuser?.resolve()) if(self_sustaining) - reagents.remove_any(min(0.5, nutridrain)) + reagents.remove_all(min(0.5, nutridrain)) else - reagents.remove_any(nutridrain) + reagents.remove_all(nutridrain) // Lack of nutrients hurts non-weeds if(reagents.total_volume <= 0 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/weed_hardy)) @@ -275,7 +295,7 @@ //Water////////////////////////////////////////////////////////////////// // Drink random amount of water - adjust_waterlevel(-rand(1,6) / rating) + adjust_waterlevel(-0.4 / rating) // If the plant is dry, it loses health pretty fast, unless mushroom if(waterlevel <= 10 && !myseed.get_gene(/datum/plant_gene/trait/plant_type/fungal_metabolism)) @@ -410,6 +430,19 @@ if(self_sustaining && self_sustaining_overlay_icon_state) . += mutable_appearance(icon, self_sustaining_overlay_icon_state) +/obj/machinery/hydroponics/update_icon_state() + . = ..() + update_hoses() + +/obj/machinery/hydroponics/proc/update_hoses() + var/n = 0 + for(var/Dir in GLOB.cardinals) + var/obj/machinery/hydroponics/t = locate() in get_step(src,Dir) + if(t && t.using_irrigation && using_irrigation) + n += Dir + + icon_state = "hoses-[n]" + /obj/machinery/hydroponics/proc/update_plant_overlay() var/mutable_appearance/plant_overlay = mutable_appearance(myseed.growing_icon, layer = OBJ_LAYER + 0.01) switch(plant_status) @@ -705,25 +738,27 @@ myseed.reagents_from_genes() continue -/** - * Pest Mutation Proc. - * When a tray is mutated with high pest values, it will spawn spiders. - * * User - Person who last added chemicals to the tray for logging purposes. - */ -/obj/machinery/hydroponics/proc/mutatepest(mob/user) - if(pestlevel > 5) - message_admins("[ADMIN_LOOKUPFLW(user)] last altered a hydro tray's contents which spawned spiderlings") - log_game("[key_name(user)] last altered a hydro tray, which spiderlings spawned from.") - visible_message(span_warning("The pests seem to behave oddly...")) - spawn_atom_to_turf(/obj/structure/spider/spiderling/hunter, src, 3, FALSE) - else if(myseed) - visible_message(span_warning("The pests seem to behave oddly in [myseed.name] tray, but quickly settle down...")) - /obj/machinery/hydroponics/wrench_act(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS +/obj/machinery/hydroponics/wirecutter_act(mob/living/user, obj/item/tool) + . = ..() + if(!unwrenchable) + return + if (!anchored) + to_chat(user, "Anchor the tray first!") + return TOOL_ACT_TOOLTYPE_SUCCESS + + using_irrigation = !using_irrigation + tool.play_tool_sound(src) + user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \ + "You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.") + for(var/obj/machinery/hydroponics/h in range(1,src)) + h.update_icon_state() + return TOOL_ACT_TOOLTYPE_SUCCESS + /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params) //Called when mob user "attacks" it with object O if(IS_EDIBLE(O) || istype(O, /obj/item/reagent_containers)) // Syringe stuff (and other reagent containers now too) @@ -741,6 +776,7 @@ var/target = myseed ? myseed.plantname : src var/visi_msg = "" var/transfer_amount + var/irrigate = 0 //How am I supposed to irrigate pill contents? if(IS_EDIBLE(reagent_source) || istype(reagent_source, /obj/item/reagent_containers/pill)) visi_msg="[user] composts [reagent_source], spreading it through [target]" @@ -748,30 +784,48 @@ SEND_SIGNAL(reagent_source, COMSIG_ITEM_ON_COMPOSTED, user) else transfer_amount = reagent_source.amount_per_transfer_from_this - if(istype(reagent_source, /obj/item/reagent_containers/syringe/)) + if(istype(reagent_source, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/syr = reagent_source visi_msg="[user] injects [target] with [syr]" + else if(istype(reagent_source, /obj/item/reagent_containers/spray/)) + visi_msg="[user] sprays [target] with [reagent_source]" + playsound(loc, 'sound/effects/spray3.ogg', 50, TRUE, -6) + irrigate = 1 + else if(transfer_amount) // Droppers, cans, beakers, what have you. + visi_msg="[user] uses [reagent_source] on [target]" + irrigate = 1 // Beakers, bottles, buckets, etc. if(reagent_source.is_drainable()) playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) + if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation) + trays = FindConnected() + if (trays.len > 1) + visi_msg += ", setting off the irrigation system" + if(visi_msg) visible_message(span_notice("[visi_msg].")) + var/split = round(transfer_amount/trays.len) + for(var/obj/machinery/hydroponics/H in trays) //cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener //This was originally in apply_chemicals, but due to apply_chemicals only holding nutrients, we handle it here now. if(reagent_source.reagents.has_reagent(/datum/reagent/water, 1)) - var/water_amt = reagent_source.reagents.get_reagent_amount(/datum/reagent/water) * transfer_amount / reagent_source.reagents.total_volume + var/water_amt = reagent_source.reagents.get_reagent_amount(/datum/reagent/water) * split / reagent_source.reagents.total_volume H.adjust_waterlevel(round(water_amt)) reagent_source.reagents.remove_reagent(/datum/reagent/water, water_amt) - reagent_source.reagents.trans_to(H.reagents, transfer_amount, transfered_by = user) + + reagent_source.reagents.trans_to(H.reagents, split, transfered_by = user) lastuser = WEAKREF(user) + if(IS_EDIBLE(reagent_source) || istype(reagent_source, /obj/item/reagent_containers/pill)) qdel(reagent_source) H.update_appearance() return 1 + H.update_appearance() + if(reagent_source) // If the source wasn't composted and destroyed reagent_source.update_appearance() return 1 @@ -842,7 +896,7 @@ var/removed_trait = tgui_input_list(user, "Trait to remove from the [myseed.plantname]", "Plant Trait Removal", sort_list(current_traits)) if(isnull(removed_trait)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(!myseed) return @@ -895,6 +949,7 @@ desc = initial(desc) set_weedlevel(0) //Has a side effect of cleaning up those nasty weeds return + else if(istype(O, /obj/item/storage/part_replacer)) RefreshParts() return @@ -922,7 +977,7 @@ return if(isnull(fresh_mut_list[locked_mutation])) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return myseed.mutatelist = list(fresh_mut_list[locked_mutation]) myseed.set_endurance(myseed.endurance/2) @@ -942,6 +997,10 @@ /obj/machinery/hydroponics/can_be_unfasten_wrench(mob/user, silent) if (!unwrenchable) // case also covered by NODECONSTRUCT checks in default_unfasten_wrench return CANT_UNFASTEN + if (using_irrigation) + if (!silent) + to_chat(user, "Disconnect the hoses first!") + return FAILED_UNFASTEN return ..() @@ -963,9 +1022,9 @@ if(user) user.examinate(src) -/obj/machinery/hydroponics/CtrlClick(mob/user) +/obj/machinery/hydroponics/CtrlClick(mob/user, list/params) . = ..() - if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return if(!powered()) to_chat(user, span_warning("[name] has no power.")) @@ -987,7 +1046,7 @@ update_appearance() return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN var/warning = tgui_alert(user, "Are you sure you wish to empty the tray's nutrient beaker?","Empty Tray Nutrients?", list("Yes", "No")) - if(warning == "Yes" && user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(warning == "Yes" && user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) reagents.clear_reagents() to_chat(user, span_warning("You empty [src]'s nutrient tank.")) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -1061,7 +1120,7 @@ qdel(src) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/hydroponics/soil/CtrlClick(mob/user) +/obj/machinery/hydroponics/soil/CtrlClick(mob/user, list/params) return //Soil has no electricity. diff --git a/code/modules/hydroponics/hydroponics_chemreact.dm b/code/modules/hydroponics/hydroponics_chemreact.dm index c9cf3ce8606c..6e2d269b38e8 100644 --- a/code/modules/hydroponics/hydroponics_chemreact.dm +++ b/code/modules/hydroponics/hydroponics_chemreact.dm @@ -24,9 +24,6 @@ if(21 to 40) visible_message(span_notice("\The [myseed.plantname] appears unusually reactive...")) return - if(11 to 20) + if(0 to 20) mutateweed() return - if(0 to 10) - mutatepest(user) - return diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index 8b7bcf6aa7d5..821bb3ee357a 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -70,7 +70,7 @@ /datum/plant_gene/reagent/proc/set_reagent(new_reagent_id) reagent_id = new_reagent_id - var/datum/reagent/found_reagent = GLOB.chemical_reagents_list[new_reagent_id] + var/datum/reagent/found_reagent = SSreagents.chemical_reagents_list[new_reagent_id] if(found_reagent?.type == reagent_id) name = found_reagent.name @@ -362,7 +362,7 @@ return var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - our_plant.light_system = MOVABLE_LIGHT + our_plant.light_system = OVERLAY_LIGHT our_plant.AddComponent(/datum/component/overlay_lighting, glow_range(our_seed), glow_power(our_seed), glow_color) /* @@ -646,12 +646,12 @@ SIGNAL_HANDLER our_plant.investigate_log("made smoke at [AREACOORD(target)]. Last touched by: [our_plant.fingerprintslast].", INVESTIGATE_BOTANY) - var/datum/effect_system/smoke_spread/chem/smoke = new () + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new () var/obj/item/seeds/our_seed = our_plant.get_plant_seed() var/splat_location = get_turf(target) var/smoke_amount = round(sqrt(our_seed.potency * 0.1), 1) smoke.attach(splat_location) - smoke.set_up(our_plant.reagents, smoke_amount, splat_location, 0) + smoke.set_up(smoke_amount, location = splat_location, carry = our_plant.reagents, silent = FALSE) smoke.start() our_plant.reagents.clear_reagents() diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index ba418779f002..280c12b1aff8 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -293,14 +293,14 @@ // Heats up the plant's contents by 25 kelvin per 1 unit of nutriment. Mutually exclusive with cooling. if(get_gene(/datum/plant_gene/trait/chem_heating)) T.visible_message(span_notice("[T] releases freezing air, consuming its nutriments to heat its contents.")) - T.reagents.remove_all_type(/datum/reagent/consumable/nutriment, num_nutriment, strict = TRUE) + T.reagents.remove_reagent(/datum/reagent/consumable/nutriment, num_nutriment) T.reagents.chem_temp = min(1000, (T.reagents.chem_temp + num_nutriment * 25)) T.reagents.handle_reactions() playsound(T.loc, 'sound/effects/wounds/sizzle2.ogg', 5) // Cools down the plant's contents by 5 kelvin per 1 unit of nutriment. Mutually exclusive with heating. else if(get_gene(/datum/plant_gene/trait/chem_cooling)) T.visible_message(span_notice("[T] releases a blast of hot air, consuming its nutriments to cool its contents.")) - T.reagents.remove_all_type(/datum/reagent/consumable/nutriment, num_nutriment, strict = TRUE) + T.reagents.remove_reagent(/datum/reagent/consumable/nutriment, num_nutriment) T.reagents.chem_temp = max(3, (T.reagents.chem_temp + num_nutriment * -5)) T.reagents.handle_reactions() playsound(T.loc, 'sound/effects/space_wind.ogg', 50) @@ -459,14 +459,14 @@ var/choice = tgui_input_list(usr, "What would you like to change?", "Seed Alteration", list("Plant Name", "Seed Description", "Product Description")) if(isnull(choice)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return switch(choice) if("Plant Name") var/newplantname = reject_bad_text(tgui_input_text(user, "Write a new plant name", "Plant Name", plantname, 20)) if(isnull(newplantname)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return name = "[lowertext(newplantname)]" plantname = newplantname @@ -474,7 +474,7 @@ var/newdesc = tgui_input_text(user, "Write a new seed description", "Seed Description", desc, 180) if(isnull(newdesc)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return desc = newdesc if("Product Description") @@ -483,7 +483,7 @@ var/newproductdesc = tgui_input_text(user, "Write a new product description", "Product Description", productdesc, 180) if(isnull(newproductdesc)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return productdesc = newproductdesc diff --git a/code/modules/hydroponics/unique_plant_genes.dm b/code/modules/hydroponics/unique_plant_genes.dm index 39f897e843d9..cb97266b8c34 100644 --- a/code/modules/hydroponics/unique_plant_genes.dm +++ b/code/modules/hydroponics/unique_plant_genes.dm @@ -671,11 +671,6 @@ . = ..() set_reagent(reagent_id) -/// Spaceman's Trumpet fragile Polypyrylium Oligomers -/datum/plant_gene/reagent/preset/polypyr - reagent_id = /datum/reagent/medicine/polypyr - rate = 0.15 - /// Jupitercup's fragile Liquid Electricity /datum/plant_gene/reagent/preset/liquidelectricity reagent_id = /datum/reagent/consumable/liquidelectricity/enriched diff --git a/code/modules/industrial_lift/industrial_lift.dm b/code/modules/industrial_lift/industrial_lift.dm index 79545e141ab4..a1ac2bb2b3f2 100644 --- a/code/modules/industrial_lift/industrial_lift.dm +++ b/code/modules/industrial_lift/industrial_lift.dm @@ -8,13 +8,13 @@ GLOBAL_LIST_EMPTY(lifts) base_icon_state = "catwalk" density = FALSE anchored = TRUE - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) - canSmoothWith = list(SMOOTH_GROUP_INDUSTRIAL_LIFT) + smoothing_groups = SMOOTH_GROUP_INDUSTRIAL_LIFT + canSmoothWith = SMOOTH_GROUP_INDUSTRIAL_LIFT obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN appearance_flags = PIXEL_SCALE|KEEP_TOGETHER //no TILE_BOUND since we're potentially multitile // If we don't do this, we'll build our overlays early, and fuck up how we're rendered diff --git a/code/modules/industrial_lift/tram_walls.dm b/code/modules/industrial_lift/tram_walls.dm index 1d6a9f95a41c..c44a34566cc3 100644 --- a/code/modules/industrial_lift/tram_walls.dm +++ b/code/modules/industrial_lift/tram_walls.dm @@ -13,8 +13,8 @@ opacity = FALSE max_integrity = 100 smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) - canSmoothWith = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS + SMOOTH_GROUP_CLOSED_TURFS + canSmoothWith = SMOOTH_GROUP_WALLS can_be_unanchored = FALSE can_atmos_pass = CANPASS_DENSITY rad_insulation = RAD_MEDIUM_INSULATION @@ -67,7 +67,6 @@ to_chat(user, span_notice("The outer plating is welded firmly in place.")) return null - /* * Other misc tramwall types */ @@ -79,7 +78,7 @@ flags_1 = CAN_BE_DIRTY_1 flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD tram_wall_type = /obj/structure/tramwall/titanium - smoothing_groups = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS color = "#b3c0c7" //To display in mapping softwares /obj/structure/tramwall/plastitanium @@ -87,4 +86,4 @@ desc = "An evil wall of plasma and titanium." icon = 'icons/turf/walls/metal_wall.dmi' tram_wall_type = /obj/structure/tramwall/plastitanium - smoothing_groups = list(SMOOTH_GROUP_WALLS) + smoothing_groups = SMOOTH_GROUP_WALLS diff --git a/code/modules/instruments/instrument_data/_instrument_data.dm b/code/modules/instruments/instrument_data/_instrument_data.dm index 12a4b17062a2..3b3fd8574387 100644 --- a/code/modules/instruments/instrument_data/_instrument_data.dm +++ b/code/modules/instruments/instrument_data/_instrument_data.dm @@ -24,7 +24,7 @@ /// Category var/category = "Unsorted" /// Used for categorization subtypes - var/abstract_type = /datum/instrument + 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! diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 5af38fa08674..7724068a4f8b 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -238,7 +238,6 @@ attack_verb_simple = list("beautifully honk") w_class = WEIGHT_CLASS_TINY force = 0 - throw_speed = 3 throw_range = 15 hitsound = 'sound/items/bikehorn.ogg' diff --git a/code/modules/instruments/piano_synth.dm b/code/modules/instruments/piano_synth.dm index 95b30d58d7df..289f996ad0f6 100644 --- a/code/modules/instruments/piano_synth.dm +++ b/code/modules/instruments/piano_synth.dm @@ -21,7 +21,7 @@ righthand_file = 'icons/mob/inhands/clothing_righthand.dmi' icon_state = "headphones" inhand_icon_state = "headphones" - slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD + slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD | ITEM_SLOT_NECK force = 0 w_class = WEIGHT_CLASS_SMALL custom_price = PAYCHECK_ASSISTANT * 2.5 @@ -30,7 +30,7 @@ shell_capacity = SHELL_CAPACITY_TINY supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION -/obj/item/instrument/piano_synth/headphones/ComponentInitialize() +/obj/item/instrument/piano_synth/headphones/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) RegisterSignal(src, COMSIG_INSTRUMENT_START, PROC_REF(start_playing)) diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index 3f5fa619b0c4..a856b55c8523 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -115,7 +115,7 @@ updateDialog(usr) // make sure updates when complete /datum/song/Topic(href, href_list) - if(!usr.canUseTopic(parent, TRUE, FALSE, FALSE, FALSE)) + if(!usr.canUseTopic(parent, USE_CLOSE)) usr << browse(null, "window=instrument") usr.unset_machine() return @@ -130,7 +130,7 @@ else if(href_list["import"]) var/t = "" do - t = html_encode(input(usr, "Please paste the entire song, formatted:", text("[]", name), t) as message) + t = html_encode(input(usr, "Please paste the entire song, formatted:", name, t) as message) if(!in_range(parent, usr)) return diff --git a/code/modules/instruments/stationary.dm b/code/modules/instruments/stationary.dm index 8245ed03f000..23b460842a0e 100644 --- a/code/modules/instruments/stationary.dm +++ b/code/modules/instruments/stationary.dm @@ -19,7 +19,7 @@ if(!(anchored || can_play_unanchored) || !ismob(music_player)) return STOP_PLAYING var/mob/user = music_player - if(!user.canUseTopic(src, FALSE, TRUE, FALSE, FALSE)) //can play with TK and while resting because fun. + if(!user.canUseTopic(src, USE_DEXTERITY|USE_RESTING)) //can play with TK and while resting because fun. return STOP_PLAYING /obj/structure/musician/ui_interact(mob/user) diff --git a/code/modules/interaction_particle/interaction_particle.dm b/code/modules/interaction_particle/interaction_particle.dm index b334e37578af..17f05e705388 100644 --- a/code/modules/interaction_particle/interaction_particle.dm +++ b/code/modules/interaction_particle/interaction_particle.dm @@ -70,7 +70,7 @@ return list(0, 0) /mob/living/carbon/get_hand_pixels() - var/obj/item/bodypart/hand = has_active_hand() + var/obj/item/bodypart/hand = has_active_hand() ? get_active_hand() : null if(!hand) return null else diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index 766c9e2f3408..bc00a11b262b 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -34,7 +34,8 @@ /obj/item/proc/GetAccess() return list() -/obj/item/proc/GetID() +/// Get an /obj/item/card/id from this object. bypass_wallet will grab the ID from a wallet even if it's closed +/obj/item/proc/GetID(bypass_wallet = FALSE) return null /obj/item/proc/RemoveID() diff --git a/code/modules/jobs/departments/departments.dm b/code/modules/jobs/departments/departments.dm index 27a7174da73a..fd3981272b34 100644 --- a/code/modules/jobs/departments/departments.dm +++ b/code/modules/jobs/departments/departments.dm @@ -18,7 +18,13 @@ var/list/department_jobs = list() /// For separatists, what independent name prefix does their nation get named? var/list/nation_prefixes = list() + /// What manifest to start in besides the generic ones. Can be null. + var/manifest_key = null + /// Account ID for the budget + var/budget_id = null + var/exclude_from_latejoin = FALSE + var/is_not_real_department = FALSE /// Handles adding jobs to the department and setting up the job bitflags. /datum/job_department/proc/add_job(datum/job/job) @@ -30,13 +36,6 @@ var/static/list/nation_suffixes = list("stan", "topia", "land", "nia", "ca", "tova", "dor", "ador", "tia", "sia", "ano", "tica", "tide", "cis", "marea", "co", "taoide", "slavia", "stotzka") return pick(nation_prefixes) + pick(nation_suffixes) -/// A special assistant only department, primarily for use by the preferences menu -/datum/job_department/assistant - department_name = DEPARTMENT_ASSISTANT - department_bitflags = DEPARTMENT_BITFLAG_ASSISTANT - nation_prefixes = list("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi") - // Don't add department_head! Assistants names should not be in bold. - /datum/job_department/assistant/generate_nation_name() var/nomadic_name = pick("roving clans", "barbaric tribes", "tides", "bandit kingdom", "tribal society", "marauder clans", "horde") return "The [nomadic_name] of [..()]" @@ -46,17 +45,17 @@ department_name = DEPARTMENT_CAPTAIN department_bitflags = DEPARTMENT_BITFLAG_CAPTAIN department_head = /datum/job/captain + is_not_real_department = TRUE /datum/job_department/command - department_name = DEPARTMENT_COMMAND - department_bitflags = DEPARTMENT_BITFLAG_COMMAND + department_name = DEPARTMENT_MANAGEMENT + department_bitflags = DEPARTMENT_BITFLAG_MANAGEMENT department_head = /datum/job/captain department_experience_type = EXP_TYPE_COMMAND display_order = 1 label_class = "command" latejoin_color = "#ccccff" - /datum/job_department/security department_name = DEPARTMENT_SECURITY department_bitflags = DEPARTMENT_BITFLAG_SECURITY @@ -65,7 +64,9 @@ display_order = 2 label_class = "security" latejoin_color = "#ffdddd" + manifest_key = DATACORE_RECORDS_MARS nation_prefixes = list("Securi", "Beepski", "Shitcuri", "Red", "Stunba", "Flashbango", "Flasha", "Stanfordi") + budget_id = ACCOUNT_SEC /datum/job_department/engineering department_name = DEPARTMENT_ENGINEERING @@ -76,7 +77,8 @@ label_class = "engineering" latejoin_color = "#ffeeaa" nation_prefixes = list("Atomo", "Engino", "Power", "Teleco") - + manifest_key = DATACORE_RECORDS_DAEDALUS + budget_id = ACCOUNT_ENG /datum/job_department/medical department_name = DEPARTMENT_MEDICAL @@ -87,18 +89,8 @@ label_class = "medical" latejoin_color = "#ffddf0" nation_prefixes = list("Mede", "Healtha", "Recova", "Chemi", "Viro", "Psych") - - -/datum/job_department/science - department_name = DEPARTMENT_SCIENCE - department_bitflags = DEPARTMENT_BITFLAG_SCIENCE - department_head = /datum/job/research_director - department_experience_type = EXP_TYPE_SCIENCE - display_order = 5 - label_class = "science" - latejoin_color = "#ffddff" - nation_prefixes = list("Sci", "Griffa", "Geneti", "Explosi", "Mecha", "Xeno", "Nani", "Cyto") - + manifest_key = DATACORE_RECORDS_AETHER + budget_id = ACCOUNT_MED /datum/job_department/cargo department_name = DEPARTMENT_CARGO @@ -109,31 +101,47 @@ label_class = "supply" latejoin_color = "#ddddff" nation_prefixes = list("Cargo", "Guna", "Suppli", "Mule", "Crate", "Ore", "Mini", "Shaf") - - -/datum/job_department/service - department_name = DEPARTMENT_SERVICE - department_bitflags = DEPARTMENT_BITFLAG_SERVICE - department_head = /datum/job/head_of_personnel - department_experience_type = EXP_TYPE_SERVICE - display_order = 7 - label_class = "service" - latejoin_color = "#bbe291" - nation_prefixes = list("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") - + manifest_key = DATACORE_RECORDS_HERMES + budget_id = ACCOUNT_CAR /datum/job_department/silicon department_name = DEPARTMENT_SILICON department_bitflags = DEPARTMENT_BITFLAG_SILICON department_head = /datum/job/ai department_experience_type = EXP_TYPE_SILICON - display_order = 8 + display_order = 7 label_class = "silicon" latejoin_color = "#ccffcc" /datum/job_department/silicon/generate_nation_name() return "United Nations" //For nations ruleset specifically, because all other sources of nation creation cannot choose silicons +/datum/job_department/service + department_name = DEPARTMENT_SERVICE + department_bitflags = DEPARTMENT_BITFLAG_SERVICE + department_head = /datum/job/head_of_personnel + department_experience_type = EXP_TYPE_SERVICE + display_order = 8 + label_class = "service" + latejoin_color = "#bbe291" + nation_prefixes = list("Honka", "Boozo", "Fatu", "Danka", "Mimi", "Libra", "Jani", "Religi") + +/// A special assistant only department, primarily for use by the preferences menu +/datum/job_department/assistant + department_name = DEPARTMENT_ASSISTANT + department_bitflags = DEPARTMENT_BITFLAG_ASSISTANT + display_order = 9 + nation_prefixes = list("Assa", "Mainte", "Tunnel", "Gris", "Grey", "Liath", "Grigio", "Ass", "Assi") + // Don't add department_head! Assistants names should not be in bold. + is_not_real_department = TRUE + /// Catch-all department for undefined jobs. /datum/job_department/undefined display_order = 10 + exclude_from_latejoin = TRUE + +/datum/job_department/company_leader + department_name = DEPARTMENT_COMPANY_LEADER + department_bitflags = DEPARTMENT_BITFLAG_COMPANY_LEADER + exclude_from_latejoin = TRUE + is_not_real_department = TRUE diff --git a/code/modules/jobs/employers/_employer.dm b/code/modules/jobs/employers/_employer.dm index 4c4cdf552c13..a2e120d67b4b 100644 --- a/code/modules/jobs/employers/_employer.dm +++ b/code/modules/jobs/employers/_employer.dm @@ -1,35 +1,34 @@ /datum/employer var/name = "" var/short_name = "" + var/creator_info = "" + +/datum/employer/government + name = "The Government" + short_name = "Government" + creator_info = "The Core Worlds has sent out many agents to secure as many capable space stations as possible to provide relief from the ongoing resource scarcity back home. Regardless of what the inhabitants think." /datum/employer/daedalus name = "Daedalus Industries" short_name = "Daedalus" - -/datum/employer/ananke - name = "Ananke Research Group" - short_name = "Ananke" - -/datum/employer/priapus - name = "Priapus Recreational Solutions" - short_name = "Priapus" + creator_info = "The most famous space station engineers in the Great Pool. Creators of the Resonance Drive and Resonance Gate." /datum/employer/mars_exec - name = "Mars Executive Outcomes" - short_name = "Mars Exec." + name = "Mars People's Coalition" + short_name = "MPC" + creator_info = "A hastily put together band of peacekeepers formed by the Red Sand Republic during it's formation shortly before the Mars Revolution. After the conclusion of the war, the MPC acts as the police force on the planet, as well as a cheap peacekeeping corps for hire. All proceeds go to various charities on Mars." /datum/employer/aether - name = "Aether Pharmaceuticals" + name = "The Aether Association" short_name = "Aether" + creator_info = "A mysterious society of doctors, pharmacists, and surgeons, intent on providing healthcare to every being in the Great Pool." /datum/employer/hermes - name = "Hermes Galactic Freight Co." + name = "Hermes Galactic Freight" short_name = "Hermes" - -/datum/employer/contractor - name = "Contracted" - short_name = "Contracted" + creator_info = "A ragtag fleet of merchants and freighters who will ship anything anywhere for the right price. They loosely follow the group's leader, a Vox named Grease Kitriki, who was previously a fierce pirate." /datum/employer/none name = "None" short_name = "None" + creator_info = "The lone wolf. Solumn wonderer. Average joe." diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index ffade09dbdf5..3e75c20e1256 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -1,10 +1,12 @@ GLOBAL_LIST_INIT(job_display_order, list( + // Management /datum/job/captain, /datum/job/head_of_personnel, + ///datum/job/bureaucrat, + // Security /datum/job/head_of_security, /datum/job/warden, /datum/job/security_officer, - /datum/job/detective, /datum/job/prisoner, // Engineeering /datum/job/chief_engineer, @@ -17,16 +19,12 @@ GLOBAL_LIST_INIT(job_display_order, list( /datum/job/chemist, /datum/job/virologist, /datum/job/psychologist, - // Science - /datum/job/research_director, - /datum/job/scientist, - /datum/job/roboticist, - /datum/job/geneticist, // Supply /datum/job/quartermaster, /datum/job/cargo_technician, /datum/job/shaft_miner, // Other + /datum/job/detective, /datum/job/bartender, /datum/job/botanist, /datum/job/cook, @@ -35,7 +33,6 @@ GLOBAL_LIST_INIT(job_display_order, list( /datum/job/janitor, /datum/job/lawyer, /datum/job/clown, - /datum/job/mime, /datum/job/assistant, /datum/job/ai, /datum/job/cyborg @@ -49,6 +46,9 @@ GLOBAL_LIST_INIT(job_display_order, list( /// Keep it short and useful. Avoid in-jokes, these are for new players. var/description + /// A string added to the on-join block to tell you how to use your radio. + var/radio_help_message = "Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset." + /// Innate skill levels unlocked at roundstart. Based on config.jobs_have_minimal_access config setting, for example with a skeleton crew. Format is list(/datum/skill/foo = SKILL_EXP_NOVICE) with exp as an integer or as per code/_DEFINES/skills.dm var/list/skills /// Innate skill levels unlocked at roundstart. Based on config.jobs_have_minimal_access config setting, for example with a full crew. Format is list(/datum/skill/foo = SKILL_EXP_NOVICE) with exp as an integer or as per code/_DEFINES/skills.dm @@ -108,15 +108,13 @@ GLOBAL_LIST_INIT(job_display_order, list( var/exp_granted_type = "" var/paycheck = PAYCHECK_MINIMAL - var/paycheck_department = ACCOUNT_STATION_MASTER + var/paycheck_department = null var/list/mind_traits // Traits added to the mind of the mob assigned this job ///Lazylist of traits added to the liver of the mob assigned this job (used for the classic "cops heal from donuts" reaction, among others) var/list/liver_traits = null - var/bounty_types = CIV_JOB_BASIC - /// Goodies that can be received via the mail system. // this is a weighted list. /// Keep the _job definition for this empty and use /obj/item/mail to define general gifts. @@ -146,7 +144,7 @@ GLOBAL_LIST_INIT(job_display_order, list( /// List of family heirlooms this job can get with the family heirloom quirk. List of types. var/list/family_heirlooms - /// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN) + /// All values = (JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN) var/job_flags = NONE /// Multiplier for general usage of the voice of god. @@ -230,7 +228,6 @@ GLOBAL_LIST_INIT(job_display_order, list( if(head_announce) announce_head(joining_mob, head_announce) - //Used for a special check of whether to allow a client to latejoin as this job. /datum/job/proc/special_check_latejoin(client/latejoin) return TRUE @@ -240,12 +237,17 @@ GLOBAL_LIST_INIT(job_display_order, list( return /mob/living/carbon/human/on_job_equipping(datum/job/equipping, datum/preferences/used_pref) - var/datum/bank_account/bank_account = new(real_name, equipping, dna.species.payday_modifier) - bank_account.payday(STARTING_PAYCHECKS, TRUE) + var/datum/bank_account/bank_account = new(real_name, equipping) account_id = bank_account.account_id bank_account.replaceable = FALSE dress_up_as_job(equipping, FALSE, used_pref, TRUE) + var/obj/item/storage/wallet/W = wear_id + if(istype(W)) + var/monero = round(equipping.paycheck, 10) + SSeconomy.spawn_cash_for_amount(monero, W) + else + bank_account.payday() /mob/living/proc/dress_up_as_job(datum/job/equipping, visual_only = FALSE) return @@ -273,9 +275,11 @@ GLOBAL_LIST_INIT(job_display_order, list( /datum/job/proc/announce_head(mob/living/carbon/human/H, 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, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, announce), "NEWHEAD", H.real_name, H.job, channels), 1)) + if(!H) + return + + //timer because these should come after the captain announcement + SSshuttle.arrivals?.OnDock(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(_addtimer), CALLBACK(pick(GLOB.announcement_systems), TYPE_PROC_REF(/obj/machinery/announcement_system, 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/player) @@ -305,14 +309,12 @@ GLOBAL_LIST_INIT(job_display_order, list( return FALSE return TRUE -/datum/job/proc/radio_help_message(mob/M) - to_chat(M, "Prefix your message with :h to speak on your department's radio. To see other prefixes, look closely at your headset.") - /datum/outfit/job name = "Standard Gear" var/jobtype = null - + /// If this job uses the Jumpskirt/Jumpsuit pref + var/allow_jumpskirt = TRUE uniform = /obj/item/clothing/under/color/grey id = /obj/item/card/id/advanced ears = /obj/item/radio/headset @@ -321,6 +323,7 @@ GLOBAL_LIST_INIT(job_display_order, list( shoes = /obj/item/clothing/shoes/sneakers/black box = /obj/item/storage/box/survival + id_in_wallet = TRUE preload = TRUE // These are used by the prefs ui, and also just kinda could use the extra help at roundstart var/backpack = /obj/item/storage/backpack @@ -347,15 +350,9 @@ GLOBAL_LIST_INIT(job_display_order, list( 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) + /// Handles jumpskirt pref + if(allow_jumpskirt && H.jumpsuit_style == PREF_SKIRT) + uniform = text2path("[uniform]/skirt") || uniform var/client/client = GLOB.directory[ckey(H.mind?.key)] @@ -370,27 +367,40 @@ GLOBAL_LIST_INIT(job_display_order, list( if(!J) J = SSjob.GetJob(H.job) - var/obj/item/card/id/card = H.wear_id + var/obj/item/card/id/card = H.wear_id.GetID(TRUE) if(istype(card)) ADD_TRAIT(card, TRAIT_JOB_FIRST_ID_CARD, ROUNDSTART_TRAIT) shuffle_inplace(card.access) // Shuffle access list to make NTNet passkeys less predictable + card.registered_name = H.real_name if(H.age) card.registered_age = H.age + card.blood_type = H.dna.blood_type + card.dna_hash = H.dna.unique_identity + card.fingerprint = H.get_fingerprints(TRUE) card.update_label() card.update_icon() + var/datum/bank_account/B = SSeconomy.bank_accounts_by_id["[H.account_id]"] if(B && B.account_id == H.account_id) card.registered_account = B B.bank_cards += card + H.sec_hud_set_ID() + if(!SSdatacore.finished_setup) + card.RegisterSignal(SSdcs, COMSIG_GLOB_DATACORE_READY, TYPE_PROC_REF(/obj/item/card/id, datacore_ready)) + else + spawn(5 SECONDS) //Race condition? I hardly knew her! + card.set_icon() var/obj/item/modular_computer/tablet/pda/PDA = H.get_item_by_slot(pda_slot) if(istype(PDA)) PDA.saved_identification = H.real_name PDA.saved_job = J.title PDA.UpdateDisplay() - + if(H.mind) + spawn(-1) //Ssshhh linter don't worry about the lack of a user it's all gonna be okay. + PDA.turn_on() /datum/outfit/job/get_chameleon_disguise_info() var/list/types = ..() @@ -423,24 +433,15 @@ GLOBAL_LIST_INIT(job_display_order, list( return "Due to extreme staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" -/// Returns an atom where the mob should spawn in. +/// Returns either an atom the mob should spawn in, or null, if we have no special overrides. /datum/job/proc/get_roundstart_spawn_point() if(random_spawns_possible) - if(HAS_TRAIT(SSstation, STATION_TRAIT_RANDOM_ARRIVALS)) - return get_safe_random_station_turf(typesof(/area/station/hallway)) || get_latejoin_spawn_point() - if(HAS_TRAIT(SSstation, STATION_TRAIT_HANGOVER)) - var/obj/effect/landmark/start/hangover_spawn_point - for(var/obj/effect/landmark/start/hangover/hangover_landmark in GLOB.start_landmarks_list) - hangover_spawn_point = hangover_landmark - if(hangover_landmark.used) //so we can revert to spawning them on top of eachother if something goes wrong - continue - hangover_landmark.used = TRUE - break - return hangover_spawn_point || get_latejoin_spawn_point() + return get_latejoin_spawn_point() + if(length(GLOB.jobspawn_overrides[title])) return pick(GLOB.jobspawn_overrides[title]) - return get_latejoin_spawn_point() + return null //We don't care where we go. Let Ticker decide for us. /// Handles finding and picking a valid roundstart effect landmark spawn point, in case no uncommon different spawning events occur. @@ -491,7 +492,7 @@ GLOBAL_LIST_INIT(job_display_order, list( if(!player_client) return // Disconnected while checking for the appearance ban. - var/require_human = CONFIG_GET(flag/enforce_human_authority) && (job.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) + var/require_human = FALSE src.job = job.title @@ -512,16 +513,18 @@ GLOBAL_LIST_INIT(job_display_order, list( else var/is_antag = (player_client.mob.mind in GLOB.pre_setup_antags) player_client.prefs.safe_transfer_prefs_to(src, TRUE, is_antag) + if(require_human && !ishumanbasic(src)) set_species(/datum/species/human) dna.species.roundstart_changed = TRUE apply_pref_name(/datum/preference/name/backup_human, player_client) + if(CONFIG_GET(flag/force_random_names)) var/species_type = player_client.prefs.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type var/gender = player_client.prefs.read_preference(/datum/preference/choiced/gender) - real_name = species.random_name(gender, TRUE) + set_real_name(species.random_name(gender, TRUE)) dna.update_dna_identity() @@ -554,8 +557,8 @@ GLOBAL_LIST_INIT(job_display_order, list( if(mmi.brain) mmi.brain.name = "[organic_name]'s brain" if(mmi.brainmob) - mmi.brainmob.real_name = organic_name //the name of the brain inside the cyborg is the robotized human's name. - mmi.brainmob.name = organic_name + mmi.brainmob.set_real_name(organic_name)//the name of the brain inside the cyborg is the robotized human's name. + // If this checks fails, then the name will have been handled during initialization. if(!GLOB.current_anonymous_theme && player_client.prefs.read_preference(/datum/preference/name/cyborg) != DEFAULT_CYBORG_NAME) apply_pref_name(/datum/preference/name/cyborg, player_client) @@ -577,3 +580,21 @@ GLOBAL_LIST_INIT(job_display_order, list( /datum/job/proc/after_latejoin_spawn(mob/living/spawning) SHOULD_CALL_PARENT(TRUE) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_JOB_AFTER_LATEJOIN_SPAWN, src, spawning) + +/// Called by SSjob when a player joins the round as this job. +/datum/job/proc/on_join_message(client/C, job_title_pref) + var/job_header = "You are the [job_title_pref]." + + var/job_info = list("

[description]") + + if(supervisors) + job_info += "

As the [job_title_pref == title ? job_title_pref : "[job_title_pref] ([title])"] \ + you answer directly to [supervisors]. Special circumstances may change this." + + job_info += "

[radio_help_message]" + + to_chat(C, examine_block("[job_header][jointext(job_info, "")]")) + +/// Called by SSjob when a player joins the round as this job. +/datum/job/proc/on_join_popup(client/C, job_title_pref) + return diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index 31aa733dadbf..7ffa82aee660 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -1,28 +1,33 @@ /datum/job/ai title = JOB_AI description = "Assist the crew, follow your laws, coordinate your cyborgs." + radio_help_message = "Prefix your message with :b to speak with cyborgs and other AIs." auto_deadmin_role_flags = DEADMIN_POSITION_SILICON faction = FACTION_STATION + total_positions = 1 spawn_positions = 1 + supervisors = "your laws" selection_color = "#3f823f" spawn_type = /mob/living/silicon/ai + req_admin_notify = TRUE minimal_player_age = 30 exp_requirements = 180 exp_required_type = EXP_TYPE_CREW exp_required_type_department = EXP_TYPE_SILICON exp_granted_type = EXP_TYPE_CREW + allow_bureaucratic_error = FALSE departments_list = list( /datum/job_department/silicon, ) + random_spawns_possible = FALSE - job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK | JOB_BOLD_SELECT_TEXT + job_flags = JOB_NEW_PLAYER_JOINABLE | JOB_EQUIP_RANK var/do_special_check = TRUE - /datum/job/ai/after_spawn(mob/living/spawned, client/player_client) . = ..() //we may have been created after our borg @@ -91,6 +96,3 @@ /datum/job/ai/config_check() return CONFIG_GET(flag/allow_ai) - -/datum/job/ai/radio_help_message(mob/M) - to_chat(M, "Prefix your message with :b to speak with cyborgs and other AIs.") diff --git a/code/modules/jobs/job_types/assistant.dm b/code/modules/jobs/job_types/assistant.dm index 040ee203d101..f6567dab18cc 100644 --- a/code/modules/jobs/job_types/assistant.dm +++ b/code/modules/jobs/job_types/assistant.dm @@ -5,21 +5,17 @@ Assistant */ /datum/job/assistant title = JOB_ASSISTANT - description = "Get your space legs, assist people, ask the HoP to give you a job." + description = "The everyman, an essential component to station life." faction = FACTION_STATION total_positions = 5 spawn_positions = 5 - supervisors = "absolutely everyone" exp_granted_type = EXP_TYPE_CREW employers = list( /datum/employer/daedalus, - /datum/employer/ananke, /datum/employer/aether, - /datum/employer/priapus, /datum/employer/mars_exec, /datum/employer/hermes, - /datum/employer/contractor, /datum/employer/none ) @@ -32,7 +28,9 @@ Assistant paycheck = PAYCHECK_ASSISTANT // Get a job. Job reassignment changes your paycheck now. Get over it. - department_for_prefs = /datum/job_department/assistant + departments_list = list( + /datum/job_department/assistant, + ) family_heirlooms = list(/obj/item/storage/toolbox/mechanical/old/heirloom, /obj/item/clothing/gloves/cut/heirloom) @@ -42,7 +40,7 @@ Assistant /obj/item/clothing/gloves/color/fyellow = 7, /obj/item/choice_beacon/music = 5, /obj/item/toy/sprayoncan = 3, - /obj/item/crowbar/large = 1 + /obj/item/crowbar = 1 ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN @@ -70,6 +68,9 @@ Assistant return /datum/outfit/job/assistant/proc/give_jumpsuit(mob/living/carbon/human/target) + if(uniform != initial(uniform)) //Loadout editted, let them have what the new uniform is. + return + var/static/jumpsuit_number = 0 jumpsuit_number += 1 diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index 7618bae8c565..9ff9a5ec7714 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -22,28 +22,22 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_ENG liver_traits = list(TRAIT_ENGINEER_METABOLISM) - bounty_types = CIV_JOB_ENG departments_list = list( /datum/job_department/engineering, ) employers = list( /datum/employer/daedalus, - /datum/employer/contractor ) family_heirlooms = list(/obj/item/lighter, /obj/item/lighter/greyscale, /obj/item/storage/box/matches) mail_goodies = list( /obj/item/rpd_upgrade/unwrench = 30, - /obj/item/grenade/gas_crystal/crystal_foam = 10, - /obj/item/grenade/gas_crystal/proto_nitrate_crystal = 10, - /obj/item/grenade/gas_crystal/healium_crystal = 10, - /obj/item/grenade/gas_crystal/nitrous_oxide_crystal = 5, ) job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN @@ -83,3 +77,5 @@ back = /obj/item/mod/control/pre_equipped/atmospheric mask = /obj/item/clothing/mask/gas/atmos internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/bartender.dm b/code/modules/jobs/job_types/bartender.dm index 17908d5f3da2..7219a281e9fd 100644 --- a/code/modules/jobs/job_types/bartender.dm +++ b/code/modules/jobs/job_types/bartender.dm @@ -5,12 +5,10 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of personnel" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, - /datum/employer/priapus + /datum/employer/none ) outfits = list( @@ -20,9 +18,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - bounty_types = CIV_JOB_DRINK departments_list = list( /datum/job_department/service, ) @@ -78,7 +73,7 @@ /datum/outfit/job/bartender/post_equip(mob/living/carbon/human/H, visualsOnly) . = ..() - var/obj/item/card/id/W = H.wear_id + var/obj/item/card/id/W = H.wear_id.GetID(TRUE) if(H.age < AGE_MINOR) W.registered_age = AGE_MINOR to_chat(H, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")) diff --git a/code/modules/jobs/job_types/botanist.dm b/code/modules/jobs/job_types/botanist.dm index 4a2dda415c49..c017207c8d7a 100644 --- a/code/modules/jobs/job_types/botanist.dm +++ b/code/modules/jobs/job_types/botanist.dm @@ -5,12 +5,10 @@ faction = FACTION_STATION total_positions = 3 spawn_positions = 2 - supervisors = "the head of personnel" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, - /datum/employer/priapus + /datum/employer/none ) outfits = list( @@ -20,9 +18,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - bounty_types = CIV_JOB_GROW departments_list = list( /datum/job_department/service, ) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm deleted file mode 100755 index 80c4e8ea3ae6..000000000000 --- a/code/modules/jobs/job_types/captain.dm +++ /dev/null @@ -1,133 +0,0 @@ -/datum/job/captain - title = JOB_CAPTAIN - description = "Be responsible for the station, manage your Heads of Staff, \ - keep the crew alive, be prepared to do anything and everything or die \ - horribly trying." - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY - department_head = list("Daedalus Industries") - faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 - supervisors = "Daedalus Industries executives & the local regulations." - selection_color = "#2f2f7f" - req_admin_notify = 1 - minimal_player_age = 14 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CREW - exp_required_type_department = EXP_TYPE_COMMAND - exp_granted_type = EXP_TYPE_CREW - - employers = list( - /datum/employer/daedalus //Captains cannot be contracted. - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/captain, - SPECIES_PLASMAMAN = /datum/outfit/job/captain/plasmaman, - ), - ) - - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_STATION_MASTER - - liver_traits = list(TRAIT_ROYAL_METABOLISM) - - department_for_prefs = /datum/job_department/captain - departments_list = list( - /datum/job_department/command, - ) - - - family_heirlooms = list(/obj/item/reagent_containers/food/drinks/flask/gold, /obj/item/toy/captainsaid/collector) - - mail_goodies = list( - /obj/item/clothing/mask/cigarette/cigar/havana = 20, - /obj/item/storage/fancy/cigarettes/cigars/havana = 15, - /obj/item/reagent_containers/food/drinks/bottle/champagne = 10, - /obj/item/toy/captainsaid/collector = 20 - ) - - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - rpg_title = "Star Duke" - - voice_of_god_power = 1.4 //Command staff has authority - - -/datum/job/captain/get_captaincy_announcement(mob/living/captain) - return "Captain [captain.real_name] on deck!" - - -/datum/outfit/job/captain - name = "Captain" - jobtype = /datum/job/captain - - id = /obj/item/card/id/advanced/gold - id_trim = /datum/id_trim/job/captain - uniform = /obj/item/clothing/under/rank/captain - suit = /obj/item/clothing/suit/armor/vest/capcarapace - backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - /obj/item/station_charter = 1, - ) - belt = /obj/item/modular_computer/tablet/pda/captain - ears = /obj/item/radio/headset/heads/captain/alt - glasses = /obj/item/clothing/glasses/sunglasses - gloves = /obj/item/clothing/gloves/color/captain - head = /obj/item/clothing/head/caphat - shoes = /obj/item/clothing/shoes/sneakers/brown - - - backpack = /obj/item/storage/backpack/captain - satchel = /obj/item/storage/backpack/satchel/cap - duffelbag = /obj/item/storage/backpack/duffelbag/captain - - accessory = /obj/item/clothing/accessory/medal/gold/captain - chameleon_extras = list( - /obj/item/gun/energy/e_gun, - /obj/item/stamp/captain, - ) - implants = list(/obj/item/implant/mindshield) - skillchips = list(/obj/item/skillchip/disk_verifier) - - var/special_charter - -/datum/outfit/job/captain/pre_equip(mob/living/carbon/human/H, visualsOnly) - . = ..() - var/list/job_changes = SSmapping.config.job_changes - if(!length(job_changes)) - return - var/list/captain_changes = job_changes["captain"] - if(!length(captain_changes)) - return - special_charter = captain_changes["special_charter"] - if(!special_charter) - return - backpack_contents.Remove(/obj/item/station_charter) - l_hand = /obj/item/station_charter/banner - -/datum/outfit/job/captain/post_equip(mob/living/carbon/human/equipped, visualsOnly) - . = ..() - var/obj/item/station_charter/banner/celestial_charter = equipped.held_items[LEFT_HANDS] - if(!celestial_charter) - return - celestial_charter.name_type = special_charter - -/datum/outfit/job/captain/plasmaman - name = "Captain (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/captain - gloves = /obj/item/clothing/gloves/color/captain - head = /obj/item/clothing/head/helmet/space/plasmaman/captain - mask = /obj/item/clothing/mask/breath - r_hand = /obj/item/tank/internals/plasmaman/belt/full - -/datum/outfit/job/captain/mod - name = "Captain (MODsuit)" - - suit_store = /obj/item/tank/internals/oxygen - back = /obj/item/mod/control/pre_equipped/magnate - suit = null - head = null - mask = /obj/item/clothing/mask/gas/atmos/captain - internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/cargo_technician.dm b/code/modules/jobs/job_types/cargo_technician.dm index 1cfcd39c3ec0..bf99038bea60 100644 --- a/code/modules/jobs/job_types/cargo_technician.dm +++ b/code/modules/jobs/job_types/cargo_technician.dm @@ -1,18 +1,16 @@ /datum/job/cargo_technician - title = JOB_CARGO_TECHNICIAN + title = JOB_DECKHAND description = "Distribute supplies to the departments that ordered them, \ collect empty crates, load and unload the supply shuttle, \ ship bounty cubes." - department_head = list(JOB_HEAD_OF_PERSONNEL) //ORIGINAL + department_head = list(JOB_QUARTERMASTER) faction = FACTION_STATION total_positions = 3 spawn_positions = 2 - supervisors = "the quartermaster" //ORIGINAL selection_color = "#15381b" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, /datum/employer/hermes ) @@ -24,8 +22,7 @@ ) paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - bounty_types = CIV_JOB_RANDOM + paycheck_department = ACCOUNT_CAR departments_list = list( /datum/job_department/cargo, ) @@ -44,7 +41,7 @@ /datum/outfit/job/cargo_tech - name = "Cargo Technician" + name = JOB_DECKHAND jobtype = /datum/job/cargo_technician id_trim = /datum/id_trim/job/cargo_technician @@ -54,7 +51,7 @@ l_hand = /obj/item/export_scanner /datum/outfit/job/cargo_tech/plasmaman - name = "Cargo Technician (Plasmaman)" + name = JOB_DECKHAND + " (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/cargo gloves = /obj/item/clothing/gloves/color/plasmaman/cargo @@ -63,6 +60,6 @@ r_hand = /obj/item/tank/internals/plasmaman/belt/full /datum/outfit/job/cargo_tech/mod - name = "Cargo Technician (MODsuit)" + name = JOB_DECKHAND + " (MODsuit)" back = /obj/item/mod/control/pre_equipped/loader diff --git a/code/modules/jobs/job_types/chaplain.dm b/code/modules/jobs/job_types/chaplain.dm index de4ac516f307..cf86781d8224 100644 --- a/code/modules/jobs/job_types/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain.dm @@ -6,11 +6,9 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of personnel" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, /datum/employer/none ) @@ -21,9 +19,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - departments_list = list( /datum/job_department/service, ) diff --git a/code/modules/jobs/job_types/chemist.dm b/code/modules/jobs/job_types/chemist.dm index 7452d49c098c..0e8c19850786 100644 --- a/code/modules/jobs/job_types/chemist.dm +++ b/code/modules/jobs/job_types/chemist.dm @@ -13,8 +13,6 @@ exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, - /datum/employer/ananke, /datum/employer/aether ) @@ -26,20 +24,16 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM) - bounty_types = CIV_JOB_CHEM departments_list = list( /datum/job_department/medical, ) - family_heirlooms = list(/obj/item/book/manual/wiki/chemistry, /obj/item/ph_booklet) - mail_goodies = list( /obj/item/reagent_containers/glass/bottle/flash_powder = 15, - /obj/item/reagent_containers/glass/bottle/exotic_stabilizer = 5, /obj/item/reagent_containers/glass/bottle/leadacetate = 5, /obj/item/paper/secretrecipe = 1 ) @@ -58,8 +52,7 @@ ears = /obj/item/radio/headset/headset_med glasses = /obj/item/clothing/glasses/science shoes = /obj/item/clothing/shoes/sneakers/white - l_pocket = /obj/item/reagent_containers/glass/bottle/random_buffer - r_pocket = /obj/item/reagent_containers/dropper + r_pocket = /obj/item/reagent_containers/syringe backpack = /obj/item/storage/backpack/chemistry satchel = /obj/item/storage/backpack/satchel/chem diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 85f943ff2058..8d00dd00038a 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -3,12 +3,10 @@ description = "Coordinate engineering, ensure equipment doesn't get stolen, \ make sure the Supermatter doesn't blow up, maintain telecommunications." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list("Engineering") + head_announce = list(RADIO_CHANNEL_ENGINEERING) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the captain" selection_color = "#7f6e2c" req_admin_notify = 1 minimal_player_age = 7 @@ -30,16 +28,14 @@ departments_list = list( /datum/job_department/engineering, - /datum/job_department/command, - ) + /datum/job_department/company_leader, + ) paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_ENG liver_traits = list(TRAIT_ENGINEER_METABOLISM, TRAIT_ROYAL_METABOLISM) - bounty_types = CIV_JOB_ENG - family_heirlooms = list(/obj/item/clothing/head/hardhat/white, /obj/item/screwdriver, /obj/item/wrench, /obj/item/weldingtool, /obj/item/crowbar, /obj/item/wirecutters) mail_goodies = list( @@ -51,7 +47,7 @@ /obj/effect/spawner/random/engineering/tool_advanced = 3 ) rpg_title = "Head Crystallomancer" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN voice_of_god_power = 1.4 //Command staff has authority @@ -68,8 +64,8 @@ id_trim = /datum/id_trim/job/chief_engineer uniform = /obj/item/clothing/under/rank/engineering/chief_engineer backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - ) + /obj/item/assembly/flash/handheld + ) belt = /obj/item/storage/belt/utility/chief/full ears = /obj/item/radio/headset/heads/ce gloves = /obj/item/clothing/gloves/color/black @@ -106,3 +102,5 @@ mask = /obj/item/clothing/mask/breath shoes = /obj/item/clothing/shoes/magboots/advance internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 9535477f226f..22f1be80fe4e 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -1,14 +1,12 @@ /datum/job/chief_medical_officer - title = JOB_CHIEF_MEDICAL_OFFICER + title = JOB_MEDICAL_DIRECTOR description = "Coordinate doctors and other medbay employees, ensure they \ know how to save lives, check for injuries on the crew monitor." - department_head = list(JOB_CAPTAIN) auto_deadmin_role_flags = DEADMIN_POSITION_HEAD head_announce = list(RADIO_CHANNEL_MEDICAL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the captain" selection_color = "#026865" req_admin_notify = 1 minimal_player_age = 7 @@ -30,16 +28,14 @@ departments_list = list( /datum/job_department/medical, - /datum/job_department/command, - ) + /datum/job_department/company_leader, + ) paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM, TRAIT_ROYAL_METABOLISM) - bounty_types = CIV_JOB_MED - mail_goodies = list( /obj/effect/spawner/random/medical/organs = 10, /obj/effect/spawner/random/medical/memeorgans = 8, @@ -48,7 +44,7 @@ ) family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom) rpg_title = "High Cleric" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN voice_of_god_power = 1.4 //Command staff has authority @@ -64,11 +60,11 @@ id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/job/chief_medical_officer uniform = /obj/item/clothing/under/rank/medical/chief_medical_officer + backpack_contents = list( + /obj/item/assembly/flash/handheld + ) suit = /obj/item/clothing/suit/toggle/labcoat/cmo suit_store = /obj/item/flashlight/pen/paramedic - backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - ) belt = /obj/item/modular_computer/tablet/pda/heads/cmo ears = /obj/item/radio/headset/heads/cmo shoes = /obj/item/clothing/shoes/sneakers/blue @@ -104,3 +100,5 @@ mask = /obj/item/clothing/mask/breath/medical r_pocket = /obj/item/flashlight/pen/paramedic internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index c2b4008ac11d..c3f9b2d804bf 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -1,34 +1,33 @@ /datum/job/clown title = JOB_CLOWN description = "Entertain the crew, make bad jokes, go on a holy quest to find bananium, HONK!" - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" + total_positions = 2 + spawn_positions = 2 exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/priapus, - /datum/employer/contractor, /datum/employer/none ) + alt_titles = list(JOB_CLOWN, "Mime") outfits = list( "Default" = list( SPECIES_HUMAN = /datum/outfit/job/clown, SPECIES_PLASMAMAN = /datum/outfit/job/clown/plasmaman, ), - ) - paycheck = PAYCHECK_MINIMAL - paycheck_department = ACCOUNT_STATION_MASTER + "Mime" = list( + SPECIES_HUMAN = /datum/outfit/job/mime, + SPECIES_PLASMAMAN = /datum/outfit/job/mime/plasmaman, + ), + ) liver_traits = list(TRAIT_COMEDY_METABOLISM) departments_list = list( /datum/job_department/service, - ) + ) mail_goodies = list( /obj/item/food/grown/banana = 100, @@ -47,8 +46,8 @@ . = ..() if(!ishuman(spawned)) return - spawned.apply_pref_name(/datum/preference/name/clown, player_client) + spawned.apply_pref_name(/datum/preference/name/clown) /datum/outfit/job/clown name = "Clown" @@ -91,6 +90,8 @@ suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/cosmohonk internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null /datum/outfit/job/clown/pre_equip(mob/living/carbon/human/H, visualsOnly) . = ..() @@ -110,7 +111,107 @@ H.fully_replace_character_name(H.real_name, pick(GLOB.clown_names)) //rename the mob AFTER they're equipped so their ID gets updated properly. ADD_TRAIT(H, TRAIT_NAIVE, JOB_TRAIT) H.dna.add_mutation(/datum/mutation/human/clumsy) + for(var/datum/mutation/human/clumsy/M in H.dna.mutations) - M.mutadone_proof = TRUE - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.add_hud_to(H) + M.ryetalyn_proof = TRUE + +/datum/outfit/job/mime + name = "Mime" + jobtype = /datum/job/clown + + id_trim = /datum/id_trim/job/mime + uniform = /obj/item/clothing/under/rank/civilian/mime + suit = /obj/item/clothing/suit/toggle/suspenders + backpack_contents = list( + /obj/item/book/mimery = 1, + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 1, + /obj/item/stamp/mime = 1, + ) + belt = /obj/item/modular_computer/tablet/pda/mime + ears = /obj/item/radio/headset/headset_srv + gloves = /obj/item/clothing/gloves/color/white + head = /obj/item/clothing/head/frenchberet + mask = /obj/item/clothing/mask/gas/mime + shoes = /obj/item/clothing/shoes/laceup + + backpack = /obj/item/storage/backpack/mime + satchel = /obj/item/storage/backpack/mime + + chameleon_extras = /obj/item/stamp/mime + +/datum/outfit/job/mime/plasmaman + name = "Mime (Plasmaman)" + + uniform = /obj/item/clothing/under/plasmaman/mime + gloves = /obj/item/clothing/gloves/color/plasmaman/white + head = /obj/item/clothing/head/helmet/space/plasmaman/mime + mask = /obj/item/clothing/mask/gas/mime/plasmaman + r_hand = /obj/item/tank/internals/plasmaman/belt/full + +/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + ..() + + if(visualsOnly) + return + + if(H.mind) + H.mind.miming = TRUE + +/obj/item/book/mimery + name = "Guide to Dank Mimery" + desc = "Teaches one of three classic pantomime routines, allowing a practiced mime to conjure invisible objects into corporeal existence. One use only." + icon_state = "bookmime" + +/obj/item/book/mimery/attack_self(mob/user) + . = ..() + if(.) + return + + var/list/spell_icons = list( + "Invisible Wall" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_wall"), + "Invisible Chair" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_chair"), + "Invisible Box" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_box") + ) + var/picked_spell = show_radial_menu(user, src, spell_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) + var/datum/action/cooldown/spell/picked_spell_type + switch(picked_spell) + if("Invisible Wall") + picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_wall + + if("Invisible Chair") + picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_chair + + if("Invisible Box") + picked_spell_type = /datum/action/cooldown/spell/conjure_item/invisible_box + + if(ispath(picked_spell_type)) + // Gives the user a vow ability too, if they don't already have one + var/datum/action/cooldown/spell/vow_of_silence/vow = locate() in user.actions + if(!vow && user.mind) + vow = new(user.mind) + vow.Grant(user) + + picked_spell_type = new picked_spell_type(user.mind || user) + picked_spell_type.Grant(user) + + to_chat(user, span_warning("The book disappears into thin air.")) + qdel(src) + + return TRUE + +/** + * Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The human mob interacting with the menu + */ +/obj/item/book/mimery/proc/check_menu(mob/living/carbon/human/user) + if(!istype(user)) + return FALSE + if(!user.is_holding(src)) + return FALSE + if(user.incapacitated()) + return FALSE + if(!user.mind) + return FALSE + return TRUE diff --git a/code/modules/jobs/job_types/cook.dm b/code/modules/jobs/job_types/cook.dm index 90d5fe1ed6a4..5b1137514b0a 100644 --- a/code/modules/jobs/job_types/cook.dm +++ b/code/modules/jobs/job_types/cook.dm @@ -5,15 +5,13 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 1 - supervisors = "the head of personnel" exp_granted_type = EXP_TYPE_CREW var/cooks = 0 //Counts cooks amount /// List of areas that are counted as the kitchen for the purposes of CQC. Defaults to just the kitchen. Mapping configs can and should override this. var/list/kitchen_areas = list(/area/station/service/kitchen) employers = list( - /datum/employer/contractor, - /datum/employer/priapus + /datum/employer/none ) outfits = list( @@ -37,12 +35,8 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - liver_traits = list(TRAIT_CULINARY_METABOLISM) - bounty_types = CIV_JOB_CHEF departments_list = list( /datum/job_department/service, ) diff --git a/code/modules/jobs/job_types/curator.dm b/code/modules/jobs/job_types/curator.dm index ef38c581a058..e783ae8b9350 100644 --- a/code/modules/jobs/job_types/curator.dm +++ b/code/modules/jobs/job_types/curator.dm @@ -1,5 +1,5 @@ /datum/job/curator - title = JOB_CURATOR + title = JOB_ARCHIVIST description = "Read and write books and hand them to people, stock \ bookshelves, report on station news." department_head = list(JOB_HEAD_OF_PERSONNEL) @@ -10,8 +10,7 @@ exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, - /datum/employer/priapus + /datum/employer/none, ) outfits = list( @@ -21,9 +20,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - departments_list = list( /datum/job_department/service, ) @@ -55,7 +51,7 @@ accessory = /obj/item/clothing/accessory/pocketprotector/full /datum/outfit/job/curator/plasmaman - name = "Curator (Plasmaman)" + name = JOB_ARCHIVIST + " (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/curator gloves = /obj/item/clothing/gloves/color/plasmaman/prototype @@ -69,4 +65,4 @@ if(visualsOnly) return - H.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_CURATOR) + H.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_ARCHIVIST) diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm index ca4cb85272de..a6a1c232cba8 100644 --- a/code/modules/jobs/job_types/cyborg.dm +++ b/code/modules/jobs/job_types/cyborg.dm @@ -1,13 +1,17 @@ /datum/job/cyborg title = JOB_CYBORG description = "Assist the crew, follow your laws, obey your AI." + radio_help_message = "Prefix your message with :b to speak with other cyborgs and AI." auto_deadmin_role_flags = DEADMIN_POSITION_SILICON faction = FACTION_STATION + total_positions = 0 spawn_positions = 1 + supervisors = "your laws and the AI" //Nodrak selection_color = "#254c25" spawn_type = /mob/living/silicon/robot + minimal_player_age = 21 exp_requirements = 120 exp_required_type = EXP_TYPE_CREW @@ -29,6 +33,3 @@ robot_spawn.notify_ai(AI_NOTIFICATION_NEW_BORG) if(!robot_spawn.connected_ai) // Only log if there's no Master AI robot_spawn.log_current_laws() - -/datum/job/cyborg/radio_help_message(mob/M) - to_chat(M, "Prefix your message with :b to speak with other cyborgs and AI.") diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index c384fbb8e74e..504349041182 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -1,21 +1,17 @@ /datum/job/detective title = JOB_DETECTIVE - description = "Investigate crimes, gather evidence, perform interrogations, \ - look badass, smoke cigarettes." - auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) + description = "Help security solve crimes or take on private cases for wealthy clients. \ + Look badass and abuse every substance." faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#601c1c" + supervisors = "nobody" minimal_player_age = 7 exp_requirements = 300 exp_required_type = EXP_TYPE_CREW exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, /datum/employer/none ) @@ -26,21 +22,14 @@ SPECIES_VOX = /datum/outfit/job/detective, SPECIES_PLASMAMAN = /datum/outfit/job/detective/plasmaman, ), - "Forensic Technician" = list( - SPECIES_HUMAN = /datum/outfit/job/detective/forensic, - SPECIES_TESHARI = /datum/outfit/job/detective/forensic, - SPECIES_PLASMAMAN = /datum/outfit/job/detective/forensic/plasmaman, - ), ) departments_list = list( - /datum/job_department/security, - ) + /datum/job_department/service, + ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER - mind_traits = list(TRAIT_DONUT_LOVER) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) mail_goodies = list( @@ -51,7 +40,6 @@ /obj/item/ammo_box/c38/iceblox = 5, /obj/item/ammo_box/c38/match = 5, /obj/item/ammo_box/c38/trac = 5, - /obj/item/storage/belt/holster/detective/full = 1 ) family_heirlooms = list(/obj/item/reagent_containers/food/drinks/bottle/whiskey) @@ -60,35 +48,30 @@ /datum/outfit/job/detective - name = "Detective" + name = JOB_DETECTIVE jobtype = /datum/job/detective id_trim = /datum/id_trim/job/detective uniform = /obj/item/clothing/under/rank/security/detective suit = /obj/item/clothing/suit/det_suit - backpack_contents = list( - /obj/item/detective_scanner = 1, - /obj/item/melee/baton = 1, - /obj/item/storage/box/evidence = 1, - ) belt = /obj/item/modular_computer/tablet/pda/detective - ears = /obj/item/radio/headset/headset_sec/alt - gloves = /obj/item/clothing/gloves/color/black + gloves = /obj/item/clothing/gloves/forensic head = /obj/item/clothing/head/fedora/det_hat - mask = /obj/item/clothing/mask/cigarette neck = /obj/item/clothing/neck/tie/detective - shoes = /obj/item/clothing/shoes/sneakers/brown + shoes = /obj/item/clothing/shoes/laceup l_pocket = /obj/item/toy/crayon/white - r_pocket = /obj/item/lighter + r_pocket = /obj/item/storage/fancy/cigarettes/dromedaryco + + l_hand = /obj/item/storage/briefcase/crimekit chameleon_extras = list( /obj/item/clothing/glasses/sunglasses, /obj/item/gun/ballistic/revolver/detective, ) - implants = list(/obj/item/implant/mindshield) + /datum/outfit/job/detective/plasmaman - name = "Detective (Plasmaman)" + name = JOB_DETECTIVE + " (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/enviroslacks gloves = /obj/item/clothing/gloves/color/plasmaman/white diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm deleted file mode 100644 index 4ee1c2c7154e..000000000000 --- a/code/modules/jobs/job_types/geneticist.dm +++ /dev/null @@ -1,69 +0,0 @@ -/datum/job/geneticist - title = JOB_GENETICIST - description = "Alter genomes, turn monkeys into humans (and vice-versa), and make DNA backups." - department_head = list(JOB_RESEARCH_DIRECTOR) - faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 - supervisors = "the research director" - selection_color = "#3d273d" - exp_requirements = 60 - exp_required_type = EXP_TYPE_CREW - exp_granted_type = EXP_TYPE_CREW - - employers = list( - /datum/employer/contractor, - /datum/employer/ananke, - /datum/employer/aether - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/geneticist, - SPECIES_PLASMAMAN = /datum/outfit/job/geneticist/plasmaman, - ), - ) - - departments_list = list( - /datum/job_department/science, - ) - - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER - - bounty_types = CIV_JOB_SCI - - mail_goodies = list( - /obj/item/storage/box/monkeycubes = 10 - ) - - family_heirlooms = list(/obj/item/clothing/under/shorts/purple) - rpg_title = "Genemancer" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - - -/datum/outfit/job/geneticist - name = "Geneticist" - jobtype = /datum/job/geneticist - - id_trim = /datum/id_trim/job/geneticist - uniform = /obj/item/clothing/under/rank/rnd/geneticist - suit = /obj/item/clothing/suit/toggle/labcoat/genetics - suit_store = /obj/item/flashlight/pen - belt = /obj/item/modular_computer/tablet/pda/geneticist - ears = /obj/item/radio/headset/headset_sci - shoes = /obj/item/clothing/shoes/sneakers/white - l_pocket = /obj/item/sequence_scanner - - backpack = /obj/item/storage/backpack/genetics - satchel = /obj/item/storage/backpack/satchel/gen - duffelbag = /obj/item/storage/backpack/duffelbag/genetics - -/datum/outfit/job/geneticist/plasmaman - name = "Geneticist (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/genetics - gloves = /obj/item/clothing/gloves/color/plasmaman/white - head = /obj/item/clothing/head/helmet/space/plasmaman/genetics - mask = /obj/item/clothing/mask/breath - r_hand = /obj/item/tank/internals/plasmaman/belt/full diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index a7a6a667db97..5f62df717e97 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -1,15 +1,13 @@ /datum/job/head_of_security - title = JOB_HEAD_OF_SECURITY - description = "Coordinate security personnel, ensure they are not corrupt, \ - make sure every department is protected." + title = JOB_SECURITY_MARSHAL + description = "Coordinate security personnel, ensure Management's needs are met." auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY department_head = list(JOB_CAPTAIN) head_announce = list(RADIO_CHANNEL_SECURITY) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the captain" - selection_color = "#8e2929" + selection_color = "#8e3d29" req_admin_notify = 1 minimal_player_age = 14 exp_requirements = 300 @@ -30,20 +28,18 @@ departments_list = list( /datum/job_department/security, - /datum/job_department/command, - ) + /datum/job_department/company_leader, + ) mind_traits = list(TRAIT_DONUT_LOVER) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM, TRAIT_ROYAL_METABOLISM) paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_STATION_MASTER - - bounty_types = CIV_JOB_SEC + paycheck_department = ACCOUNT_SEC family_heirlooms = list(/obj/item/book/manual/wiki/security_space_law) rpg_title = "Guard Leader" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN voice_of_god_power = 1.4 //Command staff has authority @@ -51,24 +47,39 @@ /datum/job/head_of_security/get_captaincy_announcement(mob/living/captain) return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" +/datum/job/head_of_security/on_join_popup(client/C, job_title_pref) + var/content = {" +
+ You are the [title] +
+
+
+ You are loudly and proudly a member of the Federation Galaxia, and you push your corps to carry out Management's will. + Ensure the Superintendent is pleased, and your team follows your orders. Insubordination is not tolerated. +
+ "} + var/datum/browser/popup = new(C.mob, "jobinfo", "Role Information", 480, 360) + popup.set_window_options("can_close=1;can_resize=0") + popup.set_content(content) + popup.open(FALSE) /datum/outfit/job/hos - name = "Head of Security" + name = JOB_SECURITY_MARSHAL jobtype = /datum/job/head_of_security id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/job/head_of_security - uniform = /obj/item/clothing/under/rank/security/head_of_security - suit = /obj/item/clothing/suit/armor/hos/trenchcoat + uniform = /obj/item/clothing/under/rank/security/marshal + suit = /obj/item/clothing/suit/armor/vest/ballistic suit_store = /obj/item/gun/energy/e_gun backpack_contents = list( - /obj/item/evidencebag = 1, + /obj/item/storage/evidencebag = 1, ) belt = /obj/item/modular_computer/tablet/pda/heads/hos ears = /obj/item/radio/headset/heads/hos/alt glasses = /obj/item/clothing/glasses/hud/security/sunglasses gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/hos/beret + head = /obj/item/clothing/head/marshal_hat shoes = /obj/item/clothing/shoes/jackboots l_pocket = /obj/item/restraints/handcuffs r_pocket = /obj/item/assembly/flash/handheld @@ -85,7 +96,7 @@ implants = list(/obj/item/implant/mindshield) /datum/outfit/job/hos/plasmaman - name = "Head of Security (Plasmaman)" + name = "Security Marshal (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/security/head_of_security gloves = /obj/item/clothing/gloves/color/plasmaman/black @@ -94,7 +105,7 @@ r_hand = /obj/item/tank/internals/plasmaman/belt/full /datum/outfit/job/hos/mod - name = "Head of Security (MODsuit)" + name = "Security Marshal (MODsuit)" suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/safeguard @@ -102,3 +113,5 @@ head = null mask = /obj/item/clothing/mask/gas/sechailer internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/janitor.dm b/code/modules/jobs/job_types/janitor.dm index ca4324a223e4..e6e5428c4302 100644 --- a/code/modules/jobs/job_types/janitor.dm +++ b/code/modules/jobs/job_types/janitor.dm @@ -5,11 +5,10 @@ faction = FACTION_STATION total_positions = 2 spawn_positions = 1 - supervisors = "the head of personnel" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, + /datum/employer/none ) outfits = list( @@ -19,9 +18,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - departments_list = list( /datum/job_department/service, ) diff --git a/code/modules/jobs/job_types/lawyer.dm b/code/modules/jobs/job_types/lawyer.dm index 7bf06bd79735..a1be571b0d0c 100644 --- a/code/modules/jobs/job_types/lawyer.dm +++ b/code/modules/jobs/job_types/lawyer.dm @@ -10,7 +10,7 @@ exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, + /datum/employer/none ) outfits = list( @@ -28,9 +28,6 @@ ), ) - paycheck = PAYCHECK_EASY - paycheck_department = ACCOUNT_STATION_MASTER - mind_traits = list(TRAIT_DONUT_LOVER) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) @@ -50,7 +47,6 @@ id_trim = /datum/id_trim/job/lawyer uniform = /obj/item/clothing/under/rank/civilian/lawyer/black belt = /obj/item/modular_computer/tablet/pda/lawyer - ears = /obj/item/radio/headset/headset_srvsec shoes = /obj/item/clothing/shoes/laceup l_pocket = /obj/item/laser_pointer r_pocket = /obj/item/clothing/accessory/lawyers_badge diff --git a/code/modules/jobs/job_types/management/bureaucrat.dm b/code/modules/jobs/job_types/management/bureaucrat.dm new file mode 100644 index 000000000000..c06f7ed4c79d --- /dev/null +++ b/code/modules/jobs/job_types/management/bureaucrat.dm @@ -0,0 +1,47 @@ +/datum/job/bureaucrat + title = "Bureaucrat" + description = "Handles relationships with Mars Executive Outcomes. Acts as a guard for Management." + department_head = list(JOB_CAPTAIN) + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 1 + supervisors = "the superintendent" + selection_color = "#1d1d4f" + req_admin_notify = 1 + minimal_player_age = 10 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_SERVICE + exp_granted_type = EXP_TYPE_CREW + + employers = list( + /datum/employer/government + ) + + outfits = list( + "Default" = list( + SPECIES_HUMAN = /datum/outfit/job/hop, + SPECIES_PLASMAMAN = /datum/outfit/job/hop/plasmaman, + ), + ) + + departments_list = list( + /datum/job_department/command, + ) + + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_STATION_MASTER + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + + mail_goodies = list( + /obj/item/card/id/advanced/silver = 10, + /obj/item/stack/sheet/bone = 5 + ) + + family_heirlooms = list(/obj/item/reagent_containers/food/drinks/trophy/silver_cup) + rpg_title = "Knight" + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + +/datum/job/bureaucrat/get_captaincy_announcement(mob/living/captain) + return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" diff --git a/code/modules/jobs/job_types/management/captain.dm b/code/modules/jobs/job_types/management/captain.dm new file mode 100644 index 000000000000..5bb7dba88bbe --- /dev/null +++ b/code/modules/jobs/job_types/management/captain.dm @@ -0,0 +1,137 @@ +/datum/job/captain + title = JOB_CAPTAIN + description = "The middle-man between the big man at home and the station's inhabitants. Ensure that quotas are met and the population is \ + compliant." + auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY + faction = FACTION_STATION + total_positions = 1 + spawn_positions = 1 + supervisors = "the government." + selection_color = "#2f2f7f" + req_admin_notify = 1 + minimal_player_age = 14 + exp_requirements = 180 + exp_required_type = EXP_TYPE_CREW + exp_required_type_department = EXP_TYPE_COMMAND + exp_granted_type = EXP_TYPE_CREW + + employers = list( + /datum/employer/government + ) + + outfits = list( + "Default" = list( + SPECIES_HUMAN = /datum/outfit/job/captain, + SPECIES_PLASMAMAN = /datum/outfit/job/captain/plasmaman, + ), + ) + + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_STATION_MASTER + + liver_traits = list(TRAIT_ROYAL_METABOLISM) + + departments_list = list( + /datum/job_department/command, + /datum/job_department/company_leader + ) + + + family_heirlooms = list(/obj/item/reagent_containers/food/drinks/flask/gold, /obj/item/toy/captainsaid/collector) + + mail_goodies = list( + /obj/item/clothing/mask/cigarette/cigar/havana = 20, + /obj/item/storage/fancy/cigarettes/cigars/havana = 15, + /obj/item/reagent_containers/food/drinks/bottle/champagne = 10, + /obj/item/toy/captainsaid/collector = 20 + ) + + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + rpg_title = "Star Duke" + + voice_of_god_power = 1.4 //Command staff has authority + + +/datum/job/captain/get_captaincy_announcement(mob/living/captain) + return "[title] [captain.real_name] will be overseeing operations today." + +/datum/outfit/job/captain + name = JOB_CAPTAIN + jobtype = /datum/job/captain + allow_jumpskirt = FALSE + + id = /obj/item/card/id/advanced/gold + id_trim = /datum/id_trim/job/captain + uniform = /obj/item/clothing/under/suit/charcoal + backpack_contents = list( + /obj/item/assembly/flash/handheld = 1 + ) + belt = /obj/item/modular_computer/tablet/pda/captain + ears = /obj/item/radio/headset/heads/captain + glasses = /obj/item/clothing/glasses/sunglasses + gloves = /obj/item/clothing/gloves/color/white + shoes = /obj/item/clothing/shoes/laceup + + backpack = /obj/item/storage/backpack + satchel = /obj/item/storage/backpack/satchel/cap + duffelbag = /obj/item/storage/backpack/duffelbag/captain + + chameleon_extras = list( + /obj/item/gun/energy/e_gun, + /obj/item/stamp/captain, + ) + implants = list(/obj/item/implant/mindshield) + skillchips = list(/obj/item/skillchip/disk_verifier) + + var/special_charter + +/datum/outfit/job/captain/pre_equip(mob/living/carbon/human/H, visualsOnly) + . = ..() + var/list/job_changes = SSmapping.config.job_changes + if(!length(job_changes)) + return + var/list/captain_changes = job_changes["captain"] + if(!length(captain_changes)) + return + special_charter = captain_changes["special_charter"] + if(!special_charter) + return + backpack_contents.Remove(/obj/item/station_charter) + l_hand = /obj/item/station_charter/banner + +/datum/outfit/job/captain/post_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + var/obj/item/station_charter/banner/celestial_charter = equipped.held_items[LEFT_HANDS] + if(!celestial_charter) + return + celestial_charter.name_type = special_charter + +/datum/outfit/job/captain/plasmaman + name = JOB_CAPTAIN + " (Plasmaman)" + + uniform = /obj/item/clothing/under/plasmaman/captain + gloves = /obj/item/clothing/gloves/color/captain + head = /obj/item/clothing/head/helmet/space/plasmaman/captain + mask = /obj/item/clothing/mask/breath + r_hand = /obj/item/tank/internals/plasmaman/belt/full + +/datum/outfit/job/captain/mod + name = "Captain (MODsuit)" + + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/magnate + suit = null + head = null + mask = /obj/item/clothing/mask/gas/atmos/captain + internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null + +/datum/outfit/job/captain/mod/post_equip(mob/living/carbon/human/equipped, visualsOnly) + . = ..() + if(visualsOnly) + return + + var/obj/item/mod/control/modsuit = equipped.back + var/obj/item/mod/module/pathfinder/module = locate() in modsuit.modules + module.implant.implant(equipped, silent = TRUE) diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/management/head_of_personnel.dm similarity index 83% rename from code/modules/jobs/job_types/head_of_personnel.dm rename to code/modules/jobs/job_types/management/head_of_personnel.dm index 5bbbb225a980..584ce56b0c41 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/management/head_of_personnel.dm @@ -1,25 +1,18 @@ /datum/job/head_of_personnel title = JOB_HEAD_OF_PERSONNEL - // description = "Alter access on ID cards, manage civil and supply departments, \ //ORIGINAL - description = "Alter access on ID cards, manage the civil departments, \ - protect Ian, run the station when the captain dies." //PARIAH EDIT - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD + description = "The Superintendent's right hand, and Management's workhorse. Completes tasks on behalf of the Superintendent." department_head = list(JOB_CAPTAIN) - head_announce = list(RADIO_CHANNEL_SUPPLY, RADIO_CHANNEL_SERVICE) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the superintendent" selection_color = "#1d1d4f" req_admin_notify = 1 minimal_player_age = 10 - exp_requirements = 180 - exp_required_type = EXP_TYPE_CREW - exp_required_type_department = EXP_TYPE_SERVICE exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/daedalus + /datum/employer/government ) outfits = list( @@ -30,13 +23,11 @@ ) departments_list = list( - /datum/job_department/service, /datum/job_department/command, - ) + ) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_STATION_MASTER - bounty_types = CIV_JOB_RANDOM liver_traits = list(TRAIT_ROYAL_METABOLISM) @@ -47,7 +38,7 @@ family_heirlooms = list(/obj/item/reagent_containers/food/drinks/trophy/silver_cup) rpg_title = "Guild Questgiver" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN voice_of_god_power = 1.4 //Command staff has authority @@ -57,28 +48,26 @@ /datum/outfit/job/hop - name = "Head of Personnel" + name = JOB_HEAD_OF_PERSONNEL jobtype = /datum/job/head_of_personnel id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/job/head_of_personnel - uniform = /obj/item/clothing/under/rank/civilian/head_of_personnel - backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - /obj/item/storage/box/ids = 1, - ) + uniform = /obj/item/clothing/under/suit/navy + suit = /obj/item/clothing/suit/toggle/lawyer + gloves = /obj/item/clothing/gloves/color/black belt = /obj/item/modular_computer/tablet/pda/heads/hop ears = /obj/item/radio/headset/heads/hop head = /obj/item/clothing/head/hopcap - shoes = /obj/item/clothing/shoes/sneakers/brown + shoes = /obj/item/clothing/shoes/laceup chameleon_extras = list( /obj/item/gun/energy/e_gun, /obj/item/stamp/hop, - ) + ) /datum/outfit/job/hop/plasmaman - name = "Head of Personnel (Plasmaman)" + name = JOB_HEAD_OF_PERSONNEL + " (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/head_of_personnel gloves = /obj/item/clothing/gloves/color/plasmaman/head_of_personnel diff --git a/code/modules/jobs/job_types/management/security_consultant.dm b/code/modules/jobs/job_types/management/security_consultant.dm new file mode 100644 index 000000000000..5f497e1f2185 --- /dev/null +++ b/code/modules/jobs/job_types/management/security_consultant.dm @@ -0,0 +1,71 @@ +// /datum/job/security_consultant +// title = JOB_SECURITY_CONSULTANT +// description = "Handles relationships with Mars Executive Outcomes. Acts as a guard for Management." +// department_head = list(JOB_CAPTAIN) +// faction = FACTION_STATION +// total_positions = 1 +// spawn_positions = 1 +// supervisors = "the superintendent" +// selection_color = "#1d1d4f" +// req_admin_notify = 1 +// minimal_player_age = 10 +// exp_requirements = 180 +// exp_required_type = EXP_TYPE_CREW +// exp_required_type_department = EXP_TYPE_SECURITY +// exp_granted_type = EXP_TYPE_CREW + +// employers = list( +// /datum/employer/government +// ) + +// outfits = list( +// "Default" = list( +// SPECIES_HUMAN = /datum/outfit/job/security_consultant, +// SPECIES_PLASMAMAN = /datum/outfit/job/security_consultant/plasmaman, +// ), +// ) + +// departments_list = list( +// /datum/job_department/command, +// ) + +// paycheck = PAYCHECK_COMMAND +// paycheck_department = ACCOUNT_SEC + +// liver_traits = list(TRAIT_ROYAL_METABOLISM) + +// mail_goodies = list( +// /obj/item/card/id/advanced/silver = 10, +// /obj/item/stack/sheet/bone = 5 +// ) + +// family_heirlooms = list(/obj/item/reagent_containers/food/drinks/trophy/silver_cup) +// rpg_title = "Knight" +// job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + +// /datum/job/security_consultant/get_captaincy_announcement(mob/living/captain) +// return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" + +// /datum/outfit/job/security_consultant +// name = JOB_SECURITY_CONSULTANT +// jobtype = /datum/job/security_consultant +// allow_jumpskirt = FALSE + +// id = /obj/item/card/id/advanced/silver +// id_trim = /datum/id_trim/job/head_of_personnel +// uniform = /obj/item/clothing/under/suit/burgundy +// suit = /obj/item/clothing/suit/armor/vest/ballistic +// belt = /obj/item/modular_computer/tablet/pda +// gloves = /obj/item/clothing/gloves/color/black +// ears = /obj/item/radio/headset/heads/captain +// glasses = /obj/item/clothing/glasses/sunglasses +// shoes = /obj/item/clothing/shoes/laceup + +// /datum/outfit/job/security_consultant/plasmaman +// name = JOB_SECURITY_CONSULTANT + " (Plasmaman)" + +// uniform = /obj/item/clothing/under/plasmaman/head_of_personnel +// gloves = /obj/item/clothing/gloves/color/plasmaman/head_of_personnel +// head = /obj/item/clothing/head/helmet/space/plasmaman/head_of_personnel +// mask = /obj/item/clothing/mask/breath +// r_hand = /obj/item/tank/internals/plasmaman/belt/full diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index cbf4d269f889..0f23c4857b40 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -2,7 +2,7 @@ title = JOB_MEDICAL_DOCTOR description = "Save lives, run around the station looking for victims, \ scan everyone in sight" - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) + department_head = list(JOB_MEDICAL_DIRECTOR) faction = FACTION_STATION total_positions = 5 spawn_positions = 3 @@ -12,7 +12,6 @@ employers = list( /datum/employer/aether, - /datum/employer/contractor ) outfits = list( @@ -23,11 +22,10 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM) - bounty_types = CIV_JOB_MED departments_list = list( /datum/job_department/medical, ) @@ -35,11 +33,10 @@ family_heirlooms = list(/obj/item/storage/medkit/ancient/heirloom) mail_goodies = list( - /obj/item/healthanalyzer/advanced = 15, /obj/item/scalpel/advanced = 6, /obj/item/retractor/advanced = 6, /obj/item/cautery/advanced = 6, - /obj/item/reagent_containers/glass/bottle/formaldehyde = 6, + /obj/item/reagent_containers/glass/bottle/space_cleaner = 6, /obj/effect/spawner/random/medical/organs = 5, /obj/effect/spawner/random/medical/memeorgans = 1 ) @@ -48,11 +45,11 @@ /datum/outfit/job/doctor - name = "Medical Doctor" + name = JOB_MEDICAL_DOCTOR jobtype = /datum/job/doctor id_trim = /datum/id_trim/job/medical_doctor - uniform = /obj/item/clothing/under/rank/medical/scrubs/blue + uniform = /obj/item/clothing/under/rank/medical/doctor suit = /obj/item/clothing/suit/toggle/labcoat/md suit_store = /obj/item/flashlight/pen belt = /obj/item/modular_computer/tablet/pda/medical @@ -69,7 +66,7 @@ skillchips = list(/obj/item/skillchip/entrails_reader) /datum/outfit/job/doctor/plasmaman - name = "Medical Doctor (Plasmaman)" + name = JOB_MEDICAL_DOCTOR + " (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/medical gloves = /obj/item/clothing/gloves/color/plasmaman/white @@ -78,7 +75,7 @@ r_hand = /obj/item/tank/internals/plasmaman/belt/full /datum/outfit/job/doctor/mod - name = "Medical Doctor (MODsuit)" + name = JOB_MEDICAL_DOCTOR + " (MODsuit)" suit_store = /obj/item/tank/internals/oxygen back = /obj/item/mod/control/pre_equipped/medical @@ -86,3 +83,5 @@ mask = /obj/item/clothing/mask/breath/medical r_pocket = /obj/item/flashlight/pen internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/mime.dm b/code/modules/jobs/job_types/mime.dm deleted file mode 100644 index 0317f7b4ee22..000000000000 --- a/code/modules/jobs/job_types/mime.dm +++ /dev/null @@ -1,158 +0,0 @@ -/datum/job/mime - title = JOB_MIME - description = "..." - department_head = list(JOB_HEAD_OF_PERSONNEL) - faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 - supervisors = "the head of personnel" - exp_granted_type = EXP_TYPE_CREW - - employers = list( - /datum/employer/priapus, - /datum/employer/contractor, - /datum/employer/none - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/mime, - SPECIES_PLASMAMAN = /datum/outfit/job/mime/plasmaman, - ), - ) - - paycheck = PAYCHECK_MINIMAL - paycheck_department = ACCOUNT_STATION_MASTER - - departments_list = list( - /datum/job_department/service, - ) - - family_heirlooms = list(/obj/item/food/baguette) - - mail_goodies = list( - /obj/item/food/baguette = 15, - /obj/item/food/cheese/wheel = 10, - /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 10, - /obj/item/book/mimery = 1, - ) - rpg_title = "Fool" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - - voice_of_god_power = 0.5 //Why are you speaking - voice_of_god_silence_power = 3 - - -/datum/job/mime/after_spawn(mob/living/spawned, client/player_client) - . = ..() - if(!ishuman(spawned)) - return - spawned.apply_pref_name(/datum/preference/name/mime, player_client) - - -/datum/outfit/job/mime - name = "Mime" - jobtype = /datum/job/mime - - id_trim = /datum/id_trim/job/mime - uniform = /obj/item/clothing/under/rank/civilian/mime - suit = /obj/item/clothing/suit/toggle/suspenders - backpack_contents = list( - /obj/item/book/mimery = 1, - /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 1, - /obj/item/stamp/mime = 1, - ) - belt = /obj/item/modular_computer/tablet/pda/mime - ears = /obj/item/radio/headset/headset_srv - gloves = /obj/item/clothing/gloves/color/white - head = /obj/item/clothing/head/frenchberet - mask = /obj/item/clothing/mask/gas/mime - shoes = /obj/item/clothing/shoes/laceup - - backpack = /obj/item/storage/backpack/mime - satchel = /obj/item/storage/backpack/mime - - chameleon_extras = /obj/item/stamp/mime - -/datum/outfit/job/mime/plasmaman - name = "Mime (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/mime - gloves = /obj/item/clothing/gloves/color/plasmaman/white - head = /obj/item/clothing/head/helmet/space/plasmaman/mime - mask = /obj/item/clothing/mask/gas/mime/plasmaman - r_hand = /obj/item/tank/internals/plasmaman/belt/full - -/datum/outfit/job/mime/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - - if(visualsOnly) - return - - // Start our mime out with a vow of silence and the ability to break (or make) it - if(H.mind) - var/datum/action/cooldown/spell/vow_of_silence/vow = new(H.mind) - vow.Grant(H) - H.mind.miming = TRUE - - var/datum/atom_hud/fan = GLOB.huds[DATA_HUD_FAN] - fan.add_hud_to(H) - -/obj/item/book/mimery - name = "Guide to Dank Mimery" - desc = "Teaches one of three classic pantomime routines, allowing a practiced mime to conjure invisible objects into corporeal existence. One use only." - icon_state = "bookmime" - -/obj/item/book/mimery/attack_self(mob/user) - . = ..() - if(.) - return - - var/list/spell_icons = list( - "Invisible Wall" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_wall"), - "Invisible Chair" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_chair"), - "Invisible Box" = image(icon = 'icons/mob/actions/actions_mime.dmi', icon_state = "invisible_box") - ) - var/picked_spell = show_radial_menu(user, src, spell_icons, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE) - var/datum/action/cooldown/spell/picked_spell_type - switch(picked_spell) - if("Invisible Wall") - picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_wall - - if("Invisible Chair") - picked_spell_type = /datum/action/cooldown/spell/conjure/invisible_chair - - if("Invisible Box") - picked_spell_type = /datum/action/cooldown/spell/conjure_item/invisible_box - - if(ispath(picked_spell_type)) - // Gives the user a vow ability too, if they don't already have one - var/datum/action/cooldown/spell/vow_of_silence/vow = locate() in user.actions - if(!vow && user.mind) - vow = new(user.mind) - vow.Grant(user) - - picked_spell_type = new picked_spell_type(user.mind || user) - picked_spell_type.Grant(user) - - to_chat(user, span_warning("The book disappears into thin air.")) - qdel(src) - - return TRUE - -/** - * Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user The human mob interacting with the menu - */ -/obj/item/book/mimery/proc/check_menu(mob/living/carbon/human/user) - if(!istype(user)) - return FALSE - if(!user.is_holding(src)) - return FALSE - if(user.incapacitated()) - return FALSE - if(!user.mind) - return FALSE - return TRUE diff --git a/code/modules/jobs/job_types/paramedic.dm b/code/modules/jobs/job_types/paramedic.dm index 33604c310ef0..9c33c971017a 100644 --- a/code/modules/jobs/job_types/paramedic.dm +++ b/code/modules/jobs/job_types/paramedic.dm @@ -2,7 +2,7 @@ title = JOB_PARAMEDIC description = "Run around the station looking for patients, respond to \ emergencies, give patients a roller bed ride to medbay." - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) + department_head = list(JOB_MEDICAL_DIRECTOR) faction = FACTION_STATION total_positions = 2 spawn_positions = 2 @@ -12,7 +12,6 @@ employers = list( /datum/employer/aether, - /datum/employer/contractor ) outfits = list( @@ -23,11 +22,10 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM) - bounty_types = CIV_JOB_MED departments_list = list( /datum/job_department/medical, ) @@ -36,10 +34,10 @@ mail_goodies = list( /obj/item/reagent_containers/hypospray/medipen = 20, - /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 10, - /obj/item/reagent_containers/hypospray/medipen/salacid = 10, - /obj/item/reagent_containers/hypospray/medipen/salbutamol = 10, - /obj/item/reagent_containers/hypospray/medipen/penacid = 10, + /obj/item/reagent_containers/hypospray/medipen/dermaline = 10, + /obj/item/reagent_containers/hypospray/medipen/meralyne = 10, + /obj/item/reagent_containers/hypospray/medipen/dexalin = 10, + /obj/item/reagent_containers/hypospray/medipen/dylovene = 10, /obj/item/reagent_containers/hypospray/medipen/survival/luxury = 5 ) rpg_title = "Corpse Runner" @@ -57,7 +55,8 @@ suit_store = /obj/item/flashlight/pen/paramedic backpack_contents = list( /obj/item/roller = 1, - ) + /obj/item/bodybag/stasis = 1, + ) belt = /obj/item/storage/belt/medical/paramedic ears = /obj/item/radio/headset/headset_med head = /obj/item/clothing/head/soft/paramedic diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 202f6d12bae3..001f4d84a7d0 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -5,10 +5,9 @@ faction = FACTION_STATION total_positions = 0 spawn_positions = 2 - supervisors = "the security team" selection_color = "#bd630a" exp_granted_type = EXP_TYPE_CREW - paycheck = PAYCHECK_PRISONER + paycheck = PAYCHECK_ZERO //This doesnt actually do anything since prisoners have no department outfits = list( "Default" = list( diff --git a/code/modules/jobs/job_types/psychologist.dm b/code/modules/jobs/job_types/psychologist.dm index ce048d5ac7e1..7cc46e3c1ea2 100644 --- a/code/modules/jobs/job_types/psychologist.dm +++ b/code/modules/jobs/job_types/psychologist.dm @@ -6,13 +6,13 @@ faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of personnel and the medical director" + supervisors = "the medical director" selection_color = "#013d3b" exp_granted_type = EXP_TYPE_CREW employers = list( /datum/employer/aether, - /datum/employer/contractor + /datum/employer/none ) outfits = list( @@ -23,7 +23,7 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM) @@ -34,7 +34,7 @@ family_heirlooms = list(/obj/item/storage/pill_bottle) mail_goodies = list( - /obj/item/storage/pill_bottle/mannitol = 30, + /obj/item/storage/pill_bottle/alkysine = 30, /obj/item/storage/pill_bottle/happy = 5, /obj/item/gun/syringe = 1 ) @@ -50,14 +50,13 @@ id_trim = /datum/id_trim/job/psychologist uniform = /obj/item/clothing/under/suit/black backpack_contents = list( - /obj/item/storage/pill_bottle/happinesspsych, /obj/item/storage/pill_bottle/lsdpsych, - /obj/item/storage/pill_bottle/mannitol, + /obj/item/storage/pill_bottle/alkysine, /obj/item/storage/pill_bottle/paxpsych, - /obj/item/storage/pill_bottle/psicodine, + /obj/item/storage/pill_bottle/haloperidol, ) belt = /obj/item/modular_computer/tablet/pda/medical - ears = /obj/item/radio/headset/headset_srvmed + ears = /obj/item/radio/headset/headset_med shoes = /obj/item/clothing/shoes/laceup l_hand = /obj/item/clipboard diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 0509a4c99b19..4983a28793c4 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -1,12 +1,10 @@ /datum/job/quartermaster title = JOB_QUARTERMASTER - description = "Coordinate cargo technicians and shaft miners, assist with \ + description = "Manage your Deckhands and Prospectors, assist with \ economical purchasing." - department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of personnel" selection_color = "#15381b" exp_requirements = 180 exp_required_type = EXP_TYPE_CREW @@ -24,31 +22,33 @@ ), ) - paycheck = PAYCHECK_MEDIUM //ORIGINAL - paycheck_department = ACCOUNT_STATION_MASTER + paycheck = PAYCHECK_COMMAND + paycheck_department = ACCOUNT_CAR - liver_traits = list(TRAIT_PRETENDER_ROYAL_METABOLISM) + liver_traits = list(TRAIT_ROYAL_METABOLISM) - bounty_types = CIV_JOB_RANDOM departments_list = list( /datum/job_department/cargo, - ) + /datum/job_department/company_leader, + ) + family_heirlooms = list(/obj/item/stamp, /obj/item/stamp/denied) mail_goodies = list( /obj/item/circuitboard/machine/emitter = 3 ) rpg_title = "Steward" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN /datum/outfit/job/quartermaster name = "Quartermaster" jobtype = /datum/job/quartermaster + id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/job/quartermaster uniform = /obj/item/clothing/under/rank/cargo/qm belt = /obj/item/modular_computer/tablet/pda/quartermaster - ears = /obj/item/radio/headset/headset_cargo + ears = /obj/item/radio/headset/heads/qm glasses = /obj/item/clothing/glasses/sunglasses shoes = /obj/item/clothing/shoes/sneakers/brown l_hand = /obj/item/clipboard diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm deleted file mode 100644 index ffe99ee3d9b0..000000000000 --- a/code/modules/jobs/job_types/research_director.dm +++ /dev/null @@ -1,101 +0,0 @@ -/datum/job/research_director - title = JOB_RESEARCH_DIRECTOR - description = "Supervise research efforts, ensure Robotics is in working \ - order, make sure the AI and its Cyborgs aren't rogue, replacing them if \ - they are" - auto_deadmin_role_flags = DEADMIN_POSITION_HEAD - department_head = list(JOB_CAPTAIN) - head_announce = list("Science") - faction = FACTION_STATION - total_positions = 1 - spawn_positions = 1 - supervisors = "the captain" - selection_color = "#633d63" - req_admin_notify = 1 - minimal_player_age = 7 - exp_required_type_department = EXP_TYPE_SCIENCE - exp_requirements = 180 - exp_required_type = EXP_TYPE_CREW - exp_granted_type = EXP_TYPE_CREW - - employers = list( - /datum/employer/ananke, - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/rd, - SPECIES_PLASMAMAN = /datum/outfit/job/rd/plasmaman, - ), - ) - - departments_list = list( - /datum/job_department/science, - /datum/job_department/command, - ) - - paycheck = PAYCHECK_COMMAND - paycheck_department = ACCOUNT_STATION_MASTER - - liver_traits = list(TRAIT_ROYAL_METABOLISM, TRAIT_BALLMER_SCIENTIST) - - bounty_types = CIV_JOB_SCI - - mail_goodies = list( - /obj/item/storage/box/monkeycubes = 30, - /obj/item/circuitboard/machine/sleeper/party = 3, - /obj/item/borg/upgrade/ai = 2 - ) - - family_heirlooms = list(/obj/item/toy/plush/slimeplushie) - rpg_title = "Archmagister" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - - voice_of_god_power = 1.4 //Command staff has authority - - -/datum/job/research_director/get_captaincy_announcement(mob/living/captain) - return "Due to staffing shortages, newly promoted Acting Captain [captain.real_name] on deck!" - - -/datum/outfit/job/rd - name = JOB_RESEARCH_DIRECTOR - jobtype = /datum/job/research_director - - id = /obj/item/card/id/advanced/silver - id_trim = /datum/id_trim/job/research_director - uniform = /obj/item/clothing/under/rank/rnd/research_director - suit = /obj/item/clothing/suit/toggle/labcoat - backpack_contents = list( - /obj/item/melee/baton/telescopic = 1, - ) - belt = /obj/item/modular_computer/tablet/pda/heads/rd - ears = /obj/item/radio/headset/heads/rd - shoes = /obj/item/clothing/shoes/sneakers/brown - l_pocket = /obj/item/laser_pointer - l_hand = /obj/item/clipboard - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/science - duffelbag = /obj/item/storage/backpack/duffelbag/science - - chameleon_extras = /obj/item/stamp/rd - skillchips = list(/obj/item/skillchip/job/research_director) - -/datum/outfit/job/rd/plasmaman - name = "Research Director (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/research_director - gloves = /obj/item/clothing/gloves/color/plasmaman/research_director - head = /obj/item/clothing/head/helmet/space/plasmaman/research_director - mask = /obj/item/clothing/mask/breath - r_hand = /obj/item/tank/internals/plasmaman/belt/full - -/datum/outfit/job/rd/mod - name = "Research Director (MODsuit)" - - suit_store = /obj/item/tank/internals/oxygen - back = /obj/item/mod/control/pre_equipped/research - suit = null - mask = /obj/item/clothing/mask/breath - internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm deleted file mode 100644 index bba239367cd0..000000000000 --- a/code/modules/jobs/job_types/roboticist.dm +++ /dev/null @@ -1,83 +0,0 @@ -/datum/job/roboticist - title = JOB_ROBOTICIST - description = "Build and repair the AI and cyborgs, create mechs." - department_head = list(JOB_RESEARCH_DIRECTOR) - faction = FACTION_STATION - total_positions = 2 - spawn_positions = 2 - supervisors = "the research director" - selection_color = "#3d273d" - exp_requirements = 60 - exp_required_type = EXP_TYPE_CREW - exp_granted_type = EXP_TYPE_CREW - bounty_types = CIV_JOB_ROBO - - employers = list( - /datum/employer/contractor, - /datum/employer/ananke - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/roboticist, - SPECIES_PLASMAMAN = /datum/outfit/job/roboticist/plasmaman, - ), - ) - - departments_list = list( - /datum/job_department/science, - ) - - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER - - - mail_goodies = list( - /obj/item/storage/box/flashes = 20, - /obj/item/stack/sheet/iron/twenty = 15, - /obj/item/modular_computer/tablet/preset/advanced = 5 - ) - - family_heirlooms = list(/obj/item/toy/plush/pkplush) - rpg_title = "Necromancer" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - - -/datum/job/roboticist/New() - . = ..() - family_heirlooms += subtypesof(/obj/item/toy/mecha) - -/datum/outfit/job/roboticist - name = "Roboticist" - jobtype = /datum/job/roboticist - - id_trim = /datum/id_trim/job/roboticist - uniform = /obj/item/clothing/under/rank/rnd/roboticist - suit = /obj/item/clothing/suit/toggle/labcoat/roboticist - belt = /obj/item/storage/belt/utility/full - ears = /obj/item/radio/headset/headset_sci - l_pocket = /obj/item/modular_computer/tablet/pda/roboticist - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/science - duffelbag = /obj/item/storage/backpack/duffelbag/science - - pda_slot = ITEM_SLOT_LPOCKET - skillchips = list(/obj/item/skillchip/job/roboticist) - -/datum/outfit/job/roboticist/plasmaman - name = "Roboticist (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/robotics - gloves = /obj/item/clothing/gloves/color/plasmaman/robot - head = /obj/item/clothing/head/helmet/space/plasmaman/robotics - mask = /obj/item/clothing/mask/breath - r_hand = /obj/item/tank/internals/plasmaman/belt/full - -/datum/outfit/job/roboticist/mod - name = "Roboticist (MODsuit)" - suit_store = /obj/item/tank/internals/oxygen - back = /obj/item/mod/control/pre_equipped/standard - suit = null - mask = /obj/item/clothing/mask/breath - internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/scientist.dm b/code/modules/jobs/job_types/scientist.dm deleted file mode 100644 index 6879a73821cc..000000000000 --- a/code/modules/jobs/job_types/scientist.dm +++ /dev/null @@ -1,106 +0,0 @@ -/datum/job/scientist - title = JOB_SCIENTIST - description = "Do experiments, perform research, feed the slimes, make bombs." - department_head = list(JOB_RESEARCH_DIRECTOR) - faction = FACTION_STATION - total_positions = 5 - spawn_positions = 3 - supervisors = "the research director" - selection_color = "#3d273d" - exp_requirements = 60 - exp_required_type = EXP_TYPE_CREW - exp_granted_type = EXP_TYPE_CREW - - employers = list( - /datum/employer/ananke, - /datum/employer/contractor - ) - - outfits = list( - "Default" = list( - SPECIES_HUMAN = /datum/outfit/job/scientist, - SPECIES_TESHARI = /datum/outfit/job/scientist, - SPECIES_VOX = /datum/outfit/job/scientist, - SPECIES_PLASMAMAN = /datum/outfit/job/scientist/plasmaman, - ), - "Xenobiologist" = list( - SPECIES_HUMAN = /datum/outfit/job/scientist/xenobiologist, - SPECIES_TESHARI = /datum/outfit/job/scientist/xenobiologist, - SPECIES_PLASMAMAN = /datum/outfit/job/scientist/xenobiologist/plasmaman, - ), - ) - - paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER - - liver_traits = list(TRAIT_BALLMER_SCIENTIST) - - bounty_types = CIV_JOB_SCI - departments_list = list( - /datum/job_department/science, - ) - - family_heirlooms = list(/obj/item/toy/plush/slimeplushie) - - mail_goodies = list( - /obj/item/raw_anomaly_core/random = 10, - /obj/item/camera_bug = 1 - ) - rpg_title = "Thaumaturgist" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - - -/datum/outfit/job/scientist - name = "Scientist" - jobtype = /datum/job/scientist - - id_trim = /datum/id_trim/job/scientist - uniform = /obj/item/clothing/under/rank/rnd/scientist - suit = /obj/item/clothing/suit/toggle/labcoat/science - belt = /obj/item/modular_computer/tablet/pda/science - ears = /obj/item/radio/headset/headset_sci - shoes = /obj/item/clothing/shoes/sneakers/white - - backpack = /obj/item/storage/backpack/science - satchel = /obj/item/storage/backpack/satchel/science - duffelbag = /obj/item/storage/backpack/duffelbag/science - -/datum/outfit/job/scientist/plasmaman - name = "Scientist (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/science - gloves = /obj/item/clothing/gloves/color/plasmaman/white - head = /obj/item/clothing/head/helmet/space/plasmaman/science - mask = /obj/item/clothing/mask/breath - r_hand = /obj/item/tank/internals/plasmaman/belt/full - -/datum/outfit/job/scientist/xenobiologist - name = "Xenobiologist" - suit = /obj/item/clothing/suit/overalls_sci - -/datum/outfit/job/scientist/xenobiologist/plasmaman - name = "Xenobiologist (Plasmaman)" - - uniform = /obj/item/clothing/under/plasmaman/science - gloves = /obj/item/clothing/gloves/color/plasmaman/white - head = /obj/item/clothing/head/helmet/space/plasmaman/science - suit = /obj/item/clothing/suit/overalls_sci - -/datum/outfit/job/scientist/pre_equip(mob/living/carbon/human/H) - ..() - try_giving_horrible_tie() - -/datum/outfit/job/scientist/proc/try_giving_horrible_tie() - if (prob(0.4)) - neck = /obj/item/clothing/neck/tie/horrible - -/datum/outfit/job/scientist/get_types_to_preload() - . = ..() - . += /obj/item/clothing/neck/tie/horrible - -/// A version of the scientist outfit that is guaranteed to be the same every time -/datum/outfit/job/scientist/consistent - name = "Scientist - Consistent" - -/datum/outfit/job/scientist/consistent/try_giving_horrible_tie() - return diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm index 3acd230d522a..8f70f6c2a6ce 100644 --- a/code/modules/jobs/job_types/security_officer.dm +++ b/code/modules/jobs/job_types/security_officer.dm @@ -3,12 +3,12 @@ description = "Protect company assets, follow the Standard Operating \ Procedure, eat donuts." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) + department_head = list(JOB_SECURITY_MARSHAL) faction = FACTION_STATION total_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() spawn_positions = 5 //Handled in /datum/controller/occupations/proc/setup_officer_positions() - supervisors = "the head of security, and the head of your assigned department (if applicable)" - selection_color = "#601c1c" + supervisors = "the security marshal" + selection_color = "#602f1c" minimal_player_age = 7 exp_requirements = 300 exp_required_type = EXP_TYPE_CREW @@ -26,12 +26,11 @@ ) paycheck = PAYCHECK_HARD - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_DONUT_LOVER) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - bounty_types = CIV_JOB_SEC departments_list = list( /datum/job_department/security, ) @@ -48,167 +47,16 @@ rpg_title = "Guard" job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN - -GLOBAL_LIST_INIT(available_depts, list(SEC_DEPT_ENGINEERING, SEC_DEPT_MEDICAL, SEC_DEPT_SCIENCE, SEC_DEPT_SUPPLY)) - -/** - * The department distribution of the security officers. - * - * Keys are refs of the security officer mobs. This is to preserve the list's structure even if the - * mob gets deleted. This is also safe, as mobs are guaranteed to have a unique ref, as per /mob/GenerateTag(). - */ -GLOBAL_LIST_EMPTY(security_officer_distribution) - - -/datum/job/security_officer/after_roundstart_spawn(mob/living/spawning, client/player_client) - . = ..() - if(ishuman(spawning)) - setup_department(spawning, player_client) - - -/datum/job/security_officer/after_latejoin_spawn(mob/living/spawning) - . = ..() - if(ishuman(spawning)) - var/department = setup_department(spawning, spawning.client) - if(department) - announce_latejoin(spawning, department, GLOB.security_officer_distribution) - - -/// Returns the department this mob was assigned to, if any. -/datum/job/security_officer/proc/setup_department(mob/living/carbon/human/spawning, client/player_client) - var/department = player_client?.prefs?.read_preference(/datum/preference/choiced/security_department) - if (!isnull(department)) - department = get_my_department(spawning, department) - - // This should theoretically still run if a player isn't in the distributions, but isn't a late join. - GLOB.security_officer_distribution[REF(spawning)] = department - - var/ears = null - var/accessory = null - var/list/dep_trim = null - var/destination = null - - switch(department) - if(SEC_DEPT_SUPPLY) - ears = /obj/item/radio/headset/headset_sec/alt/department/supply - dep_trim = /datum/id_trim/job/security_officer/supply - destination = /area/station/security/checkpoint/supply - accessory = /obj/item/clothing/accessory/armband/cargo - if(SEC_DEPT_ENGINEERING) - ears = /obj/item/radio/headset/headset_sec/alt/department/engi - dep_trim = /datum/id_trim/job/security_officer/engineering - destination = /area/station/security/checkpoint/engineering - accessory = /obj/item/clothing/accessory/armband/engine - if(SEC_DEPT_MEDICAL) - ears = /obj/item/radio/headset/headset_sec/alt/department/med - dep_trim = /datum/id_trim/job/security_officer/medical - destination = /area/station/security/checkpoint/medical - accessory = /obj/item/clothing/accessory/armband/medblue - if(SEC_DEPT_SCIENCE) - ears = /obj/item/radio/headset/headset_sec/alt/department/sci - dep_trim = /datum/id_trim/job/security_officer/science - destination = /area/station/security/checkpoint/science - accessory = /obj/item/clothing/accessory/armband/science - - if(accessory) - var/obj/item/clothing/under/worn_under = spawning.w_uniform - worn_under.attach_accessory(new accessory) - - if(ears) - if(spawning.ears) - qdel(spawning.ears) - spawning.equip_to_slot_or_del(new ears(spawning),ITEM_SLOT_EARS) - - // If there's a departmental sec trim to apply to the card, overwrite. - if(dep_trim) - var/obj/item/card/id/worn_id = spawning.get_idcard(hand_first = FALSE) - SSid_access.apply_trim_to_card(worn_id, dep_trim) - spawning.sec_hud_set_ID() - - var/spawn_point = pick(LAZYACCESS(GLOB.department_security_spawns, department)) - - if(!CONFIG_GET(flag/sec_start_brig) && (destination || spawn_point)) - if(spawn_point) - spawning.Move(get_turf(spawn_point)) - else - var/list/possible_turfs = get_area_turfs(destination) - while (length(possible_turfs)) - var/random_index = rand(1, length(possible_turfs)) - var/turf/target = possible_turfs[random_index] - if (spawning.Move(target)) - break - possible_turfs.Cut(random_index, random_index + 1) - - if(player_client) - if(department) - to_chat(player_client, "You have been assigned to [department]!") - else - to_chat(player_client, "You have not been assigned to any department. Patrol the halls and help where needed.") - - return department - - -/datum/job/security_officer/proc/announce_latejoin( - mob/officer, - department, - distribution, -) - var/obj/machinery/announcement_system/announcement_system = pick(GLOB.announcement_systems) - if (isnull(announcement_system)) - return - - announcement_system.announce_officer(officer, department) - - var/list/targets = list() - - var/list/partners = list() - for (var/officer_ref in distribution) - var/mob/partner = locate(officer_ref) - if (!istype(partner) || distribution[officer_ref] != department) - continue - partners += partner.real_name - - if (partners.len) - for (var/obj/item/modular_computer/pda as anything in GLOB.TabletMessengers) - if (pda.saved_identification in partners) - targets += pda - - if (!targets.len) - return - - var/datum/signal/subspace/messaging/tablet_msg/signal = new(announcement_system, list( - "name" = "Security Department Update", - "job" = "Automated Announcement System", - "message" = "Officer [officer.real_name] has been assigned to your department, [department].", - "targets" = targets, - "automated" = TRUE, - )) - - signal.send_to_receivers() - -/datum/job/security_officer/proc/get_my_department(mob/character, preferred_department) - var/department = GLOB.security_officer_distribution[REF(character)] - - // This passes when they are a round start security officer. - if (department) - return department - - return get_new_officer_distribution_from_late_join( - preferred_department, - shuffle(GLOB.available_depts), - GLOB.security_officer_distribution, - ) - /datum/outfit/job/security name = "Security Officer" jobtype = /datum/job/security_officer id_trim = /datum/id_trim/job/security_officer uniform = /obj/item/clothing/under/rank/security/officer - suit = /obj/item/clothing/suit/armor/vest/alt + suit = /obj/item/clothing/suit/armor/vest/sec suit_store = /obj/item/gun/energy/disabler backpack_contents = list( - /obj/item/evidencebag = 1, + /obj/item/storage/evidencebag = 1, ) belt = /obj/item/modular_computer/tablet/pda/security ears = /obj/item/radio/headset/headset_sec/alt @@ -249,6 +97,8 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) head = null mask = /obj/item/clothing/mask/gas/sechailer internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null /obj/item/radio/headset/headset_sec/alt/department/Initialize(mapload) . = ..() @@ -269,7 +119,6 @@ GLOBAL_LIST_EMPTY(security_officer_distribution) /obj/item/radio/headset/headset_sec/alt/department/sci keyslot = new /obj/item/encryptionkey/headset_sec - keyslot2 = new /obj/item/encryptionkey/headset_sci /// Returns the distribution of splitting the given security officers into departments. /// Return value is an assoc list of candidate => SEC_DEPT_*. diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index d2f0102f6048..5bf86c9d6db8 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -1,17 +1,17 @@ /datum/job/shaft_miner - title = JOB_SHAFT_MINER - description = "Travel to strange lands. Mine ores. \ - Meet strange creatures. Kill them for their gold." + title = JOB_PROSPECTOR + description = "Gather valuable resources for the station. Hit rocks with tools. Do trigonometry." department_head = list(JOB_HEAD_OF_PERSONNEL) faction = FACTION_STATION total_positions = 3 spawn_positions = 3 - supervisors = "the quartermaster and the head of personnel" + supervisors = "the quartermaster" selection_color = "#15381b" exp_granted_type = EXP_TYPE_CREW employers = list( - /datum/employer/contractor, + /datum/employer/hermes, + /datum/employer/none, ) outfits = list( @@ -22,9 +22,8 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_CAR - bounty_types = CIV_JOB_MINE departments_list = list( /datum/job_department/cargo, ) @@ -35,11 +34,11 @@ /datum/outfit/job/miner - name = "Shaft Miner" + name = JOB_PROSPECTOR jobtype = /datum/job/shaft_miner id_trim = /datum/id_trim/job/shaft_miner - uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland + uniform = /obj/item/clothing/under/rank/cargo/miner backpack_contents = list( /obj/item/flashlight/seclite = 1, /obj/item/knife/combat/survival = 1, @@ -58,7 +57,6 @@ duffelbag = /obj/item/storage/backpack/duffelbag/explorer box = /obj/item/storage/box/survival/mining - chameleon_extras = /obj/item/gun/energy/recharge/kinetic_accelerator /datum/outfit/job/miner/plasmaman name = "Shaft Miner (Plasmaman)" @@ -72,30 +70,24 @@ /datum/outfit/job/miner/equipped name = "Shaft Miner (Equipment)" - suit = /obj/item/clothing/suit/hooded/explorer + suit = /obj/item/clothing/suit/space/nasavoid/old suit_store = /obj/item/tank/internals/oxygen backpack_contents = list( /obj/item/flashlight/seclite = 1, - /obj/item/gun/energy/recharge/kinetic_accelerator = 1, /obj/item/knife/combat/survival = 1, /obj/item/mining_voucher = 1, /obj/item/stack/marker_beacon/ten = 1, /obj/item/t_scanner/adv_mining_scanner/lesser = 1, ) glasses = /obj/item/clothing/glasses/meson - mask = /obj/item/clothing/mask/gas/explorer + head = /obj/item/clothing/head/helmet/space/nasavoid/old + mask = /obj/item/clothing/mask/breath internals_slot = ITEM_SLOT_SUITSTORE -/datum/outfit/job/miner/equipped/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - ..() - if(visualsOnly) - return - if(istype(H.wear_suit, /obj/item/clothing/suit/hooded)) - var/obj/item/clothing/suit/hooded/S = H.wear_suit - S.ToggleHood() - /datum/outfit/job/miner/equipped/mod name = "Shaft Miner (Equipment + MODsuit)" back = /obj/item/mod/control/pre_equipped/mining suit = null - mask = /obj/item/clothing/mask/gas/explorer + mask = /obj/item/clothing/mask/breath + backpack_contents = null + box = null diff --git a/code/modules/jobs/job_types/spawner/lavaland_syndicate.dm b/code/modules/jobs/job_types/spawner/lavaland_syndicate.dm deleted file mode 100644 index a22e798274af..000000000000 --- a/code/modules/jobs/job_types/spawner/lavaland_syndicate.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/job/lavaland_syndicate - title = ROLE_LAVALAND_SYNDICATE - policy_index = ROLE_LAVALAND_SYNDICATE diff --git a/code/modules/jobs/job_types/spawner/space_pirate.dm b/code/modules/jobs/job_types/spawner/space_pirate.dm deleted file mode 100644 index cfada841c258..000000000000 --- a/code/modules/jobs/job_types/spawner/space_pirate.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/job/space_pirate - title = ROLE_SPACE_PIRATE - policy_index = ROLE_SPACE_PIRATE diff --git a/code/modules/jobs/job_types/spawner/spider.dm b/code/modules/jobs/job_types/spawner/spider.dm deleted file mode 100644 index d55e6f4490de..000000000000 --- a/code/modules/jobs/job_types/spawner/spider.dm +++ /dev/null @@ -1,3 +0,0 @@ -/datum/job/spider - title = ROLE_SPIDER - policy_index = ROLE_SPIDER diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 4cf15791f59d..9e8866ecbcce 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -14,7 +14,6 @@ employers = list( /datum/employer/daedalus, - /datum/employer/contractor ) outfits = list( @@ -40,11 +39,10 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_ENG liver_traits = list(TRAIT_ENGINEER_METABOLISM) - bounty_types = CIV_JOB_ENG departments_list = list( /datum/job_department/engineering, ) @@ -71,6 +69,7 @@ ears = /obj/item/radio/headset/headset_eng head = /obj/item/clothing/head/hardhat shoes = /obj/item/clothing/shoes/workboots + gloves = /obj/item/clothing/gloves/color/yellow l_pocket = /obj/item/modular_computer/tablet/pda/engineering r_pocket = /obj/item/t_scanner @@ -91,11 +90,6 @@ mask = /obj/item/clothing/mask/breath r_hand = /obj/item/tank/internals/plasmaman/belt/full -/datum/outfit/job/engineer/gloved - name = "Station Engineer (Gloves)" - - gloves = /obj/item/clothing/gloves/color/yellow - /datum/outfit/job/engineer/mod name = "Station Engineer (MODsuit)" @@ -104,6 +98,8 @@ head = null mask = /obj/item/clothing/mask/breath internals_slot = ITEM_SLOT_SUITSTORE + backpack_contents = null + box = null /datum/outfit/job/engineer/enginetech name = "Engine Technician" diff --git a/code/modules/jobs/job_types/virologist.dm b/code/modules/jobs/job_types/virologist.dm index 67f3590d4adf..a90946eeee71 100644 --- a/code/modules/jobs/job_types/virologist.dm +++ b/code/modules/jobs/job_types/virologist.dm @@ -2,7 +2,7 @@ title = JOB_VIROLOGIST description = "Study the effects of various diseases and synthesize a \ vaccine for them. Engineer beneficial viruses." - department_head = list(JOB_CHIEF_MEDICAL_OFFICER) + department_head = list(JOB_MEDICAL_DIRECTOR) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 @@ -14,7 +14,6 @@ employers = list( /datum/employer/aether, - /datum/employer/contractor ) outfits = list( @@ -25,11 +24,10 @@ ) paycheck = PAYCHECK_MEDIUM - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_MED liver_traits = list(TRAIT_MEDICAL_METABOLISM) - bounty_types = CIV_JOB_VIRO departments_list = list( /datum/job_department/medical, ) @@ -38,7 +36,7 @@ mail_goodies = list( /obj/item/reagent_containers/glass/bottle/random_virus = 15, - /obj/item/reagent_containers/glass/bottle/formaldehyde = 10, + /obj/item/reagent_containers/glass/bottle/space_cleaner = 10, /obj/item/reagent_containers/glass/bottle/synaptizine = 10, /obj/item/stack/sheet/mineral/plasma = 10, /obj/item/stack/sheet/mineral/uranium = 5, diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm index 629c8fb92732..73cf36ffc6ac 100644 --- a/code/modules/jobs/job_types/warden.dm +++ b/code/modules/jobs/job_types/warden.dm @@ -1,15 +1,15 @@ /datum/job/warden title = JOB_WARDEN - description = "Watch over the Brig and Prison Wing, release prisoners when \ - their time is up, issue equipment to security, be a security officer when \ - they all eventually die." + description = "Watch over the Brig and Prison Wing, manage prisoners, \ + issue equipment to security, work with the Security Marshal \ + to organize security." auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY - department_head = list(JOB_HEAD_OF_SECURITY) + department_head = list(JOB_SECURITY_MARSHAL) faction = FACTION_STATION total_positions = 1 spawn_positions = 1 - supervisors = "the head of security" - selection_color = "#601c1c" + supervisors = "the security marshal" + selection_color = "#602f1c" minimal_player_age = 7 exp_requirements = 300 exp_required_type = EXP_TYPE_CREW @@ -27,12 +27,11 @@ ) paycheck = PAYCHECK_HARD - paycheck_department = ACCOUNT_STATION_MASTER + paycheck_department = ACCOUNT_SEC mind_traits = list(TRAIT_DONUT_LOVER) liver_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM) - bounty_types = CIV_JOB_SEC departments_list = list( /datum/job_department/security, ) @@ -48,11 +47,11 @@ /obj/item/storage/box/lethalshot = 5 ) rpg_title = "Jailor" - job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_BOLD_SELECT_TEXT | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN + job_flags = JOB_ANNOUNCE_ARRIVAL | JOB_CREW_MANIFEST | JOB_EQUIP_RANK | JOB_CREW_MEMBER | JOB_NEW_PLAYER_JOINABLE | JOB_REOPEN_ON_ROUNDSTART_LOSS | JOB_ASSIGN_QUIRKS | JOB_CAN_BE_INTERN /datum/outfit/job/warden - name = "Warden" + name = "Brig Lieutenant" jobtype = /datum/job/warden id_trim = /datum/id_trim/job/warden @@ -60,7 +59,7 @@ suit = /obj/item/clothing/suit/armor/vest/warden/alt suit_store = /obj/item/gun/energy/disabler backpack_contents = list( - /obj/item/evidencebag = 1, + /obj/item/storage/evidencebag = 1, ) belt = /obj/item/modular_computer/tablet/pda/warden ears = /obj/item/radio/headset/headset_sec/alt @@ -79,7 +78,7 @@ implants = list(/obj/item/implant/mindshield) /datum/outfit/job/warden/plasmaman - name = "Warden (Plasmaman)" + name = "Brig Lieutenant (Plasmaman)" uniform = /obj/item/clothing/under/plasmaman/security/warden gloves = /obj/item/clothing/gloves/color/plasmaman/black diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm index b44ffb49ee30..a448296fd112 100644 --- a/code/modules/jobs/jobs.dm +++ b/code/modules/jobs/jobs.dm @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT(exp_specialmap, list( ROLE_SKELETON, ROLE_ZOMBIE, ROLE_SPACE_BAR_PATRON, - ROLE_LAVALAND_SYNDICATE, ROLE_MAINTENANCE_DRONE, ROLE_GHOST_ROLE, ), // Ghost roles @@ -39,8 +38,8 @@ GLOBAL_PROTECT(exp_specialmap) /proc/get_full_job_name(job) var/static/regex/cap_expand = new("cap(?!tain)") - var/static/regex/cmo_expand = new("cmo") - var/static/regex/hos_expand = new("hos") + var/static/regex/cmo_expand = new("md") + var/static/regex/hos_expand = new("marshal") var/static/regex/hop_expand = new("hop") var/static/regex/rd_expand = new("rd") var/static/regex/ce_expand = new("ce") @@ -56,7 +55,7 @@ GLOBAL_PROTECT(exp_specialmap) job = lowertext(job) job = cap_expand.Replace(job, "captain") job = cmo_expand.Replace(job, "medical director") - job = hos_expand.Replace(job, "head of security") + job = hos_expand.Replace(job, "security marshall") job = hop_expand.Replace(job, "head of personnel") job = rd_expand.Replace(job, "research director") job = ce_expand.Replace(job, "chief engineer") @@ -65,7 +64,7 @@ GLOBAL_PROTECT(exp_specialmap) job = engi_expand.Replace(job, "station engineer") job = atmos_expand.Replace(job, "atmospheric technician") job = doc_expand.Replace(job, "medical doctor") - job = mine_expand.Replace(job, "shaft miner") + job = mine_expand.Replace(job, "prospector") job = chef_expand.Replace(job, "cook") job = borg_expand.Replace(job, "cyborg") return job diff --git a/code/modules/keybindings/bindings_atom.dm b/code/modules/keybindings/bindings_atom.dm index 9ac41fd78f0e..a59b31d02a61 100644 --- a/code/modules/keybindings/bindings_atom.dm +++ b/code/modules/keybindings/bindings_atom.dm @@ -2,12 +2,21 @@ // Only way to do that is to tie the behavior into the focus's keyLoop(). /atom/movable/keyLoop(client/user) - var/movement_dir = NONE - for(var/_key in user?.keys_held) - movement_dir = movement_dir | user.movement_keys[_key] - if(user?.next_move_dir_add) - movement_dir |= user.next_move_dir_add - if(user?.next_move_dir_sub) + // Clients don't go null randomly. They do go null unexpectedly though, when they're poked in particular ways + // keyLoop is called by a for loop over mobs. We're guarenteed that all the mobs have clients at the START + // But the move of one mob might poke the client of another, so we do this + if(!user) + return FALSE + var/movement_dir = user.intended_direction | user.next_move_dir_add + // If we're not movin anywhere, we aren't movin anywhere + // Safe because nothing adds to movement_dir after this moment + if(!movement_dir) + // No input == our removal would have done nothing + // So we can safely forget about it + user.next_move_dir_sub = NONE + return FALSE + + if(user.next_move_dir_sub) movement_dir &= ~user.next_move_dir_sub // Sanity checks in case you hold left and right and up to make sure you only go up if((movement_dir & NORTH) && (movement_dir & SOUTH)) @@ -15,10 +24,19 @@ if((movement_dir & EAST) && (movement_dir & WEST)) movement_dir &= ~(EAST|WEST) - if(user && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise + if(user.dir != NORTH && movement_dir) //If we're not moving, don't compensate, as byond will auto-fill dir otherwise movement_dir = turn(movement_dir, -dir2angle(user.dir)) //By doing this we ensure that our input direction is offset by the client (camera) direction - if(user?.movement_locked) + if(user.movement_locked) keybind_face_direction(movement_dir) else - user?.Move(get_step(src, movement_dir), movement_dir) + user.Move(get_step(src, movement_dir), movement_dir) + return !!movement_dir //true if there was actually any player input + + return FALSE + +/client/proc/calculate_move_dir() + var/movement_dir = NONE + for(var/_key in keys_held) + movement_dir |= movement_keys[_key] + intended_direction = movement_dir diff --git a/code/modules/keybindings/bindings_client.dm b/code/modules/keybindings/bindings_client.dm index 9c3a7e0ac806..b2fa15e71ce4 100644 --- a/code/modules/keybindings/bindings_client.dm +++ b/code/modules/keybindings/bindings_client.dm @@ -36,19 +36,18 @@ qdel(src) return - //Focus Chat failsafe. Overrides movement checks to prevent WASD. - if(!hotkeys && length(_key) == 1 && _key != "Alt" && _key != "Ctrl" && _key != "Shift") - winset(src, null, "input.focus=true ; input.text=[url_encode(_key)]") - return + if(keys_held[_key]) + return //Key is already held, prevent double-strike. if(length(keys_held) >= HELD_KEY_BUFFER_LENGTH && !keys_held[_key]) keyUp(keys_held[1]) //We are going over the number of possible held keys, so let's remove the first one. //the time a key was pressed isn't actually used anywhere (as of 2019-9-10) but this allows easier access usage/checking keys_held[_key] = world.time - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_sub & movement)) + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_sub & movement)) next_move_dir_add |= movement // Client-level keybindings are ones anyone should be able to do at any time @@ -75,7 +74,8 @@ holder?.key_down(_key, src) mob.focus?.key_down(_key, src) - mob.update_mouse_pointer() + if(ShiftMod) + mob.update_mouse_pointer() /client/verb/keyUp(_key as text) @@ -90,11 +90,19 @@ if(!keys_held[_key]) return + var/update_pointer = FALSE + if(keys_held["Shift"]) + update_pointer = TRUE + keys_held -= _key - if(!movement_locked) - var/movement = movement_keys[_key] - if(!(next_move_dir_add & movement)) + if(update_pointer == TRUE) + mob.update_mouse_pointer() + + var/movement = movement_keys[_key] + if(movement) + calculate_move_dir() + if(!movement_locked && !(next_move_dir_add & movement)) next_move_dir_sub |= movement // We don't do full key for release, because for mod keys you @@ -105,5 +113,5 @@ break holder?.key_up(_key, src) mob.focus?.key_up(_key, src) - mob.update_mouse_pointer() + diff --git a/code/modules/keybindings/setup.dm b/code/modules/keybindings/setup.dm index de07c952c72d..0900b7653ab3 100644 --- a/code/modules/keybindings/setup.dm +++ b/code/modules/keybindings/setup.dm @@ -14,27 +14,82 @@ var/list/macro_set = params2list(winget(src, "default.*", "command")) // The third arg doesnt matter here as we're just removing them all for(var/k in 1 to length(macro_set)) var/list/split_name = splittext(macro_set[k], ".") + if(split_name[2] in SSinput.protected_macro_ids) + testing("Skipping Protected Macro [split_name[2]]") + continue //Skip protected macros var/macro_name = "[split_name[1]].[split_name[2]]" // [3] is "command" erase_output = "[erase_output];[macro_name].parent=null" winset(src, null, erase_output) +/// Apply client macros. Has a system to prevent infighting bullshit. There's probably a cleaner way to do this but I'm tired. /client/proc/set_macros() - set waitfor = FALSE + set waitfor = FALSE //We're going to sleep here even more than TG. + + updating_macros++ // Queue (0 - Not running, Not waiting, 1 - Running, Not Waiting, 2 - Running, Waiting. 3 - Running, Waiting, Overqueued.) + if(updating_macros > 2) //Are we the only one in line? + updating_macros-- //No, dequeue and let them handle it. + return + //This isn't an UNTIL because we would rather this lag than deadlock. + while(!(updating_macros == 1)) + sleep(1) + + //Get their personal macro set, This may be null if we're loading too early + var/list/personal_macro_set = prefs?.key_bindings_by_key + if(!personal_macro_set) + //We're too early, Just return, Someone'll follow us up. + updating_macros-- + return //Reset the buffer reset_held_keys() erase_all_macros() + + //Set up the stuff we don't let them override. var/list/macro_set = SSinput.macro_set for(var/k in 1 to length(macro_set)) var/key = macro_set[k] var/command = macro_set[key] - winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[command]") + winset(src, "shared-[REF(key)]", "parent=default;name=[key];command=[command]") + + var/list/printables + //If they use hotkeys, we can safely use ANY + if(hotkeys) + var/list/hk_macro_set = SSinput.hotkey_only_set + for(var/k in 1 to length(hk_macro_set)) + var/key = hk_macro_set[k] + var/command = hk_macro_set[key] + winset(src, "hotkey_only-[REF(key)]", "parent=default;name=[key];command=[command]") + else //Otherwise, we can't. + /// Install the shared set, so that we force capture all macro keys + var/list/c_macro_set = SSinput.classic_only_set + for(var/k in 1 to length(c_macro_set)) + var/key = c_macro_set[k] + var/command = c_macro_set[key] + winset(src, "classic_only-[REF(key)]", "parent=default;name=[key];command=[command]") + printables = list() + //This is to save time muching down this massive list, it might result in holes, it may be better to simply hardcode all these into the skin. + //I might try that one day, but that day is not today. + for(var/keycode in personal_macro_set) //We don't care about the bound key, just the key itself + if(!hotkeys && !SSinput.unprintables_cache[keycode]) //Track printable hotkeys and skip them. + printables += keycode + continue + winset(src, "personal-[REF(keycode)]", "parent=default;name=[keycode];command=\"KeyDown [keycode]\"") + winset(src, "personal-[REF("[keycode]")]-UP", "parent=default;name=[keycode]+UP;command=\"KeyUp [keycode]\"") + if(hotkeys) - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") + winset(src, null, "input.background-color=[COLOR_INPUT_ENABLED]") else - winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_DISABLED]") + winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]") + //Do we have bad bindings at all, and if so, do we actually care? + if(printables?.len && !prefs.read_preference(/datum/preference/toggle/hotkeys_silence)) + to_chat(src, "[span_boldnotice("Hey, you might have some bad keybinds!")]\n\ + [span_notice("The following keys are bound despite Classic Hotkeys being enabled. These binds are not applied.\n\ + The code used to generate this list is imperfect, You can silence this warning in your Game Preferences.")]\n\ + Keys: [jointext(printables, ", ")]\ + ") update_special_keybinds() + updating_macros-- //Decrement, Let the next thread through. diff --git a/code/modules/language/calcic.dm b/code/modules/language/calcic.dm deleted file mode 100644 index af14c6902ba3..000000000000 --- a/code/modules/language/calcic.dm +++ /dev/null @@ -1,16 +0,0 @@ -/datum/language/calcic - name = "Calcic" - desc = "The disjointed and staccato language of plasmamen. Also understood by skeletons." - key = "b" - space_chance = 10 - syllables = list( - "k", "ck", "ack", "ick", "cl", "tk", "sk", "isk", "tak", - "kl", "hs", "ss", "ks", "lk", "dk", "gk", "ka", "ska", "la", "pk", - "wk", "ak", "ik", "ip", "ski", "bk", "kb", "ta", "is", "it", "li", "di", - "ds", "ya", "sck", "crk", "hs", "ws", "mk", "aaa", "skraa", "skee", "hss", - "raa", "klk", "tk", "stk", "clk" - ) - icon_state = "calcic" - default_priority = 90 - -// Yeah, this goes to skeletons too, since it's basically just skeleton clacking. diff --git a/code/modules/language/common.dm b/code/modules/language/common.dm deleted file mode 100644 index e030c2bb6f40..000000000000 --- a/code/modules/language/common.dm +++ /dev/null @@ -1,70 +0,0 @@ -// 'basic' language; spoken by default. -/datum/language/common - name = "Galactic Common" - desc = "The common galactic tongue." - key = "0" - flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_UNDERSTOOD - default_priority = 100 - - icon_state = "galcom" - -//Syllable Lists -/* - This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, - and the english syllables had to be duplicated so that there is roughly a 50-50 weighting. - - Sources: - http://www.sttmedia.com/syllablefrequency-english - http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm -*/ -/datum/language/common/syllables = list( -"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", -"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai", -"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", -"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei", -"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", -"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", -"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", -"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan", -"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", -"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", -"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", -"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang", -"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", -"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", -"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", -"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", -"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", -"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha", -"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", -"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", -"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", -"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", -"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan", -"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", -"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", -"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", -"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", -"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", -"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", -"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") diff --git a/code/modules/language/draconic.dm b/code/modules/language/draconic.dm deleted file mode 100644 index 510270c6d433..000000000000 --- a/code/modules/language/draconic.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/language/draconic - name = "Sinta'Unathi" - desc = "The common language of the Unathi, composed of sibilant hisses and rattles." - key = "o" - flags = TONGUELESS_SPEECH - space_chance = 40 - syllables = list( - "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", - "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", - "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", - "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", - "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", - "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", - "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" - ) - icon_state = "lizard" - default_priority = 90 diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm index 2d87ee141cc5..7ef78e517522 100644 --- a/code/modules/language/language.dm +++ b/code/modules/language/language.dm @@ -9,7 +9,7 @@ var/desc = "A language." // Short description for 'Check Languages'. var/key // Character used to speak in language // If key is null, then the language isn't real or learnable. - var/flags // Various language flags. + var/flags = NONE // Various language flags. var/list/syllables // Used when scrambling text for a non-speaker. var/sentence_chance = 5 // Likelihood of making a new sentence after each syllable. var/space_chance = 55 // Likelihood of getting a space in the random scramble string @@ -23,9 +23,9 @@ /datum/language/proc/display_icon(atom/movable/hearer) var/understands = hearer.has_language(src.type) - if(flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD && understands) + if((flags & LANGUAGE_HIDE_ICON_IF_UNDERSTOOD) && understands) return FALSE - if(flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD && !understands) + if((flags & LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD) && !understands) return FALSE return TRUE @@ -33,6 +33,10 @@ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) return sheet.icon_tag("language-[icon_state]") +/// Called by /atom/proc/say_mod if LANGUAGE_OVERRIDE_SAY_MOD is present. +/datum/language/proc/get_say_mod(mob/living/speaker) + return + /datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2) if(!syllables || !syllables.len) if(gender==FEMALE) @@ -65,8 +69,19 @@ if(scramble_cache.len > SCRAMBLE_CACHE_LEN) scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1) -/datum/language/proc/scramble(input) +/datum/language/proc/before_speaking(atom/movable/speaker, message) + return message + +/// Called by process_received_message() when the hearer does not understand the language. +/datum/language/proc/speech_not_understood(atom/movable/source, raw_message, spans, list/message_mods, quote) + raw_message = scramble(raw_message) + return !quote ? raw_message : source.say_quote(raw_message, spans, message_mods, src) + +/// Called by process_received_message() when the hearer does understand the language. +/datum/language/proc/speech_understood(atom/movable/source, raw_message, spans, list/message_mods, quote) + return !quote ? raw_message : source.say_quote(raw_message, spans, message_mods, src) +/datum/language/proc/scramble(input) if(!syllables || !syllables.len) return stars(input) @@ -105,3 +120,109 @@ return scrambled_text #undef SCRAMBLE_CACHE_LEN + +/// Returns TRUE if the movable can speak the language. This does not check it knows the language. +/datum/language/proc/can_speak_language(atom/movable/speaker, silent = TRUE) + if(!isliving(speaker)) + return TRUE + + var/mob/living/L = speaker + . = L.can_speak_vocal() + if(!.) + if(!silent) + to_chat(speaker, span_warning("You find yourself unable to speak!")) + return + + if(!ishuman(speaker)) + return TRUE + + var/mob/living/carbon/human/H = speaker + if(H.mind?.miming) + if(!silent) + to_chat(speaker, span_green("Your vow of silence prevents you from speaking!")) + return FALSE + + var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE) + if(T) + . = T.can_physically_speak_language(type) + if(!. && !silent) + to_chat(speaker, span_warning("You do not have the biology required to speak that language!")) + return . + + return (flags & TONGUELESS_SPEECH) + +/// Returns TRUE if the movable can even "see" or "hear" the language. This does not check it knows the language. +/datum/language/proc/can_receive_language(atom/movable/hearer, ignore_stat) + if(ismob(hearer)) + var/mob/M = hearer + return M.can_hear(ignore_stat) + return TRUE + +/// Called by Hear() to process a language and display it to the hearer. Returns NULL if cannot hear, otherwise returns the translated raw_message. +/datum/language/proc/hear_speech(mob/living/hearer, atom/movable/speaker, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) + if(!istype(hearer)) + return + + // if someone is whispering we make an extra type of message that is obfuscated for people out of range + // Less than or equal to 0 means normal hearing. More than 0 and less than or equal to EAVESDROP_EXTRA_RANGE means + // partial hearing. More than EAVESDROP_EXTRA_RANGE means no hearing. Exception for GOOD_HEARING trait + var/dist = get_dist(speaker, hearer) - message_range + var/is_observer = isobserver(hearer) + var/mangle_message = FALSE + if (message_range != INFINITY && dist > EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(hearer, TRAIT_GOOD_HEARING) && !is_observer) + return // Too far away and don't have good hearing, you can't hear anything + + if(dist > 0 && dist <= EAVESDROP_EXTRA_RANGE && !HAS_TRAIT(hearer, TRAIT_GOOD_HEARING) && !is_observer) // ghosts can hear all messages clearly + mangle_message = TRUE + + if(hearer.stat == UNCONSCIOUS && can_receive_language(hearer, ignore_stat = TRUE)) + var/sleep_message = hearer.translate_speech(speaker, src, raw_message) + if(mangle_message) + sleep_message = stars(sleep_message) + hearer.hear_sleeping(sleep_message) + return + + var/avoid_highlight = FALSE + if(istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/virt = speaker + avoid_highlight = hearer == virt.source + else + avoid_highlight = hearer == speaker + + var/deaf_message + var/deaf_type + if(speaker != hearer) + if(!radio_freq) //These checks have to be separate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. + deaf_message = "[span_name("[speaker]")] [speaker.verb_say] something but you cannot hear [speaker.p_them()]." + deaf_type = MSG_VISUAL + else + deaf_message = span_notice("You can't hear yourself!") + deaf_type = MSG_AUDIBLE // Since you should be able to hear yourself without looking + + var/enable_runechat = FALSE + if(ismob(speaker)) + enable_runechat = hearer.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) + else + enable_runechat = hearer.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) + + var/can_receive_language = can_receive_language(hearer) + var/translated_message = hearer.translate_speech(speaker, src, raw_message, spans, message_mods) + if(mangle_message) + translated_message = stars(translated_message) + + // Create map text prior to modifying message for goonchat + if (enable_runechat && !(hearer.stat == UNCONSCIOUS) && can_receive_language) + if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) + hearer.create_chat_message(speaker, null, message_mods[MODE_CUSTOM_SAY_EMOTE], spans, EMOTE_MESSAGE, sound_loc = sound_loc) + else + hearer.create_chat_message(speaker, src, translated_message, spans, sound_loc = sound_loc) + + // Recompose message for AI hrefs, language incomprehension. + var/parsed_message = hearer.compose_message(speaker, src, translated_message, radio_freq, spans, message_mods) + + var/shown = hearer.show_message(parsed_message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight) + if(LAZYLEN(hearer.observers)) + for(var/mob/dead/observer/O in hearer.observers) + to_chat(O, shown) + + return translated_message diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm index ff88e743062f..fab26b4bfb6e 100644 --- a/code/modules/language/language_holder.dm +++ b/code/modules/language/language_holder.dm @@ -44,7 +44,7 @@ Key procs /// A list of blocked languages. Used to prevent understanding and speaking certain languages, ie for certain mobs, mutations etc. var/list/blocked_languages = list() /// If true, overrides tongue limitations. - var/omnitongue = FALSE + var/bypass_speaking_limitations = FALSE /// Handles displaying the language menu UI. var/datum/language_menu/language_menu /// Currently spoken language @@ -72,7 +72,10 @@ Key procs return ..() /// Grants the supplied language. -/datum/language_holder/proc/grant_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_MIND) +/datum/language_holder/proc/grant_language(datum/language/language, understood = TRUE, spoken = TRUE, source = LANGUAGE_MIND) + if(istype(language)) + language = language.type + if(understood) if(!understood_languages[language]) understood_languages[language] = list() @@ -88,12 +91,16 @@ Key procs /datum/language_holder/proc/grant_all_languages(understood = TRUE, spoken = TRUE, grant_omnitongue = TRUE, source = LANGUAGE_MIND) for(var/language in GLOB.all_languages) grant_language(language, understood, spoken, source) + if(grant_omnitongue) // Overrides tongue limitations. - omnitongue = TRUE + bypass_speaking_limitations = TRUE return TRUE /// Removes a single language or source, removing all sources returns the pre-removal state of the language. -/datum/language_holder/proc/remove_language(language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) +/datum/language_holder/proc/remove_language(datum/language/language, understood = TRUE, spoken = TRUE, source = LANGUAGE_ALL) + if(istype(language)) + language = language.type + if(understood && understood_languages[language]) if(source == LANGUAGE_ALL) understood_languages -= language @@ -116,47 +123,63 @@ Key procs /datum/language_holder/proc/remove_all_languages(source = LANGUAGE_ALL, remove_omnitongue = FALSE) for(var/language in GLOB.all_languages) remove_language(language, TRUE, TRUE, source) + if(remove_omnitongue) - omnitongue = FALSE + bypass_speaking_limitations = FALSE + return TRUE /// Adds a single language or list of languages to the blocked language list. /datum/language_holder/proc/add_blocked_language(languages, source = LANGUAGE_MIND) if(!islist(languages)) languages = list(languages) + for(var/language in languages) if(!blocked_languages[language]) blocked_languages[language] = list() blocked_languages[language] |= source + return TRUE /// Removes a single language or list of languages from the blocked language list. -/datum/language_holder/proc/remove_blocked_language(languages, source = LANGUAGE_MIND) - if(!islist(languages)) - languages = list(languages) - for(var/language in languages) - if(blocked_languages[language]) - if(source == LANGUAGE_ALL) +/datum/language_holder/proc/remove_blocked_language(languages_to_remove, source = LANGUAGE_MIND) + if(!islist(languages_to_remove)) + languages_to_remove = list(languages_to_remove) + + for(var/language in languages_to_remove) + if(!blocked_languages[language]) + continue + + if(source == LANGUAGE_ALL) + blocked_languages -= language + else + blocked_languages[language] -= source + if(!length(blocked_languages[language])) blocked_languages -= language - else - blocked_languages[language] -= source - if(!length(blocked_languages[language])) - blocked_languages -= language return TRUE /// Checks if you have the language. If spoken is true, only checks if you can speak the language. -/datum/language_holder/proc/has_language(language, spoken = FALSE) +/datum/language_holder/proc/has_language(datum/language/language, spoken = FALSE) + if(isnull(language)) + return FALSE + + if(!ispath(language)) + language = language.type + if(language in blocked_languages) return FALSE + if(spoken) return language in spoken_languages + return language in understood_languages /// Checks if you can speak the language. Tongue limitations should be supplied as an argument. -/datum/language_holder/proc/can_speak_language(language) +/datum/language_holder/proc/can_speak_language(datum/language/language) var/atom/movable/ouratom = get_atom() - var/tongue = ouratom.could_speak_language(language) - if((omnitongue || tongue) && has_language(language, TRUE)) + var/can_speak_language = language.can_speak_language(ouratom) + + if((bypass_speaking_limitations || can_speak_language) && has_language(language, TRUE)) return TRUE return FALSE @@ -164,24 +187,28 @@ Key procs /datum/language_holder/proc/get_selected_language() if(selected_language && can_speak_language(selected_language)) return selected_language + selected_language = null var/highest_priority - for(var/lang in spoken_languages) - var/datum/language/language = lang - var/priority = initial(language.default_priority) - if((!highest_priority || (priority > highest_priority)) && !(language in blocked_languages)) + + for(var/datum/language/language as anything in spoken_languages) + language = GET_LANGUAGE_DATUM(language) + var/priority = language.default_priority + + if((!highest_priority || (priority > highest_priority)) && !(language.type in blocked_languages)) if(can_speak_language(language)) selected_language = language highest_priority = priority + return selected_language /// Gets a random understood language, useful for hallucinations and such. /datum/language_holder/proc/get_random_understood_language() - return pick(understood_languages) + return GET_LANGUAGE_DATUM(pick(understood_languages)) /// Gets a random spoken language, useful for forced speech and such. /datum/language_holder/proc/get_random_spoken_language() - return pick(spoken_languages) + return GET_LANGUAGE_DATUM(pick(spoken_languages)) /// Opens a language menu reading from the language holder. /datum/language_holder/proc/open_language_menu(mob/user) @@ -191,22 +218,28 @@ Key procs /// Gets the atom, since we some times need to check if the tongue has limitations. /datum/language_holder/proc/get_atom() - if(owner) - if(istype(owner, /datum/mind)) - var/datum/mind/M = owner - return M.current - return owner - return FALSE + if(!owner) + return FALSE + + if(istype(owner, /datum/mind)) + var/datum/mind/M = owner + return M.current + + return owner + /// Empties out the atom specific languages and updates them according to the supplied atoms language holder. /datum/language_holder/proc/update_atom_languages(atom/movable/thing) var/datum/language_holder/from_atom = thing.get_language_holder(FALSE) //Gets the atoms language holder if(from_atom == src) //This could happen if called on an atom without a mind. return FALSE + for(var/language in understood_languages) remove_language(language, TRUE, FALSE, LANGUAGE_ATOM) + for(var/language in spoken_languages) remove_language(language, FALSE, TRUE, LANGUAGE_ATOM) + for(var/language in blocked_languages) remove_blocked_language(language, LANGUAGE_ATOM) @@ -220,15 +253,20 @@ Key procs if(source_override) //No blocked languages here, for now only used by ling absorb. for(var/language in from_holder.understood_languages) grant_language(language, TRUE, FALSE, source_override) + for(var/language in from_holder.spoken_languages) grant_language(language, FALSE, TRUE, source_override) + else for(var/language in from_holder.understood_languages) grant_language(language, TRUE, FALSE, from_holder.understood_languages[language]) + for(var/language in from_holder.spoken_languages) grant_language(language, FALSE, TRUE, from_holder.spoken_languages[language]) + for(var/language in from_holder.blocked_languages) add_blocked_language(language, from_holder.blocked_languages[language]) + return TRUE @@ -289,12 +327,6 @@ Key procs /datum/language/monkey = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/monkey = list(LANGUAGE_ATOM)) -/datum/language_holder/mushroom - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/mushroom = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/mushroom = list(LANGUAGE_ATOM)) - /datum/language_holder/slime understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/slime = list(LANGUAGE_ATOM)) @@ -316,17 +348,13 @@ Key procs /datum/language/machine = list(LANGUAGE_ATOM), /datum/language/draconic = list(LANGUAGE_ATOM), /datum/language/moffic = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM), - /datum/language/voltaic = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) + /datum/language/voltaic = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/uncommon = list(LANGUAGE_ATOM), /datum/language/machine = list(LANGUAGE_ATOM), /datum/language/draconic = list(LANGUAGE_ATOM), /datum/language/moffic = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM), - /datum/language/voltaic = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) + /datum/language/voltaic = list(LANGUAGE_ATOM)) /datum/language_holder/moth understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), @@ -334,12 +362,6 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/moffic = list(LANGUAGE_ATOM)) -/datum/language_holder/skeleton - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM)) - /datum/language_holder/ethereal understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/voltaic = list(LANGUAGE_ATOM)) @@ -352,14 +374,6 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/terrum = list(LANGUAGE_ATOM)) -/datum/language_holder/golem/bone - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/terrum = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/terrum = list(LANGUAGE_ATOM), - /datum/language/calcic = list(LANGUAGE_ATOM)) - /datum/language_holder/golem/runic understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/terrum = list(LANGUAGE_ATOM), @@ -380,12 +394,6 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/sylvan = list(LANGUAGE_ATOM)) -/datum/language_holder/felinid - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/nekomimetic = list(LANGUAGE_ATOM)) - /datum/language_holder/shadowpeople understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/shadowtongue = list(LANGUAGE_ATOM)) @@ -404,20 +412,20 @@ Key procs spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/vox = list(LANGUAGE_ATOM)) -/datum/language_holder/skrell - understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/skrell = list(LANGUAGE_ATOM), - /datum/language/slime = list(LANGUAGE_ATOM)) - spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), - /datum/language/skrell = list(LANGUAGE_ATOM), - /datum/language/slime = list(LANGUAGE_ATOM)) - /datum/language_holder/teshari understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/schechi = list(LANGUAGE_ATOM)) spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), /datum/language/schechi = list(LANGUAGE_ATOM)) +/datum/language_holder/ipc + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM)) + + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/machine = list(LANGUAGE_ATOM), + /datum/language/draconic = list(LANGUAGE_ATOM)) /datum/language_holder/empty understood_languages = list() spoken_languages = list() diff --git a/code/modules/language/language_manuals.dm b/code/modules/language/language_manuals.dm index 076b4cfdbddf..d264e3425d14 100644 --- a/code/modules/language/language_manuals.dm +++ b/code/modules/language/language_manuals.dm @@ -64,11 +64,8 @@ . = ..() language = pick( \ /datum/language/voltaic, - /datum/language/nekomimetic, /datum/language/draconic, /datum/language/moffic, - /datum/language/calcic, - /datum/language/skrell, /datum/language/schechi, /datum/language/vox, ) diff --git a/code/modules/language/language_menu.dm b/code/modules/language/language_menu.dm index f2cebf052d01..19b4019bc7f0 100644 --- a/code/modules/language/language_menu.dm +++ b/code/modules/language/language_menu.dm @@ -27,11 +27,10 @@ data["is_living"] = FALSE data["languages"] = list() - for(var/lang in GLOB.all_languages) - var/result = language_holder.has_language(lang) || language_holder.has_language(lang, TRUE) + for(var/datum/language/language as anything in GLOB.all_languages) + var/result = language_holder.has_language(language) || language_holder.has_language(language, TRUE) if(!result) continue - var/datum/language/language = lang var/list/L = list() L["name"] = initial(language.name) @@ -46,18 +45,17 @@ if(check_rights_for(user.client, R_ADMIN) || isobserver(AM)) data["admin_mode"] = TRUE - data["omnitongue"] = language_holder.omnitongue + data["omnitongue"] = language_holder.bypass_speaking_limitations data["unknown_languages"] = list() - for(var/lang in GLOB.all_languages) - if(language_holder.has_language(lang) || language_holder.has_language(lang, TRUE)) + for(var/datum/language/language as anything in GLOB.all_languages) + if(language_holder.has_language(language) || language_holder.has_language(language, TRUE)) continue - var/datum/language/language = lang var/list/L = list() - L["name"] = initial(language.name) - L["desc"] = initial(language.desc) - L["key"] = initial(language.key) + L["name"] = language.name + L["desc"] = language.desc + L["key"] = language.key data["unknown_languages"] += list(L) return data @@ -71,10 +69,11 @@ var/language_name = params["language_name"] var/datum/language/language_datum - for(var/lang in GLOB.all_languages) - var/datum/language/language = lang - if(language_name == initial(language.name)) + + for(var/datum/language/language as anything in GLOB.all_languages) + if(language_name == language.name) language_datum = language + var/is_admin = check_rights_for(user.client, R_ADMIN) switch(action) @@ -130,8 +129,8 @@ . = TRUE if("toggle_omnitongue") if(is_admin || isobserver(AM)) - language_holder.omnitongue = !language_holder.omnitongue + language_holder.bypass_speaking_limitations = !language_holder.bypass_speaking_limitations if(is_admin) - message_admins("[key_name_admin(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(AM)].") - log_admin("[key_name(user)] [language_holder.omnitongue ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(AM)].") + message_admins("[key_name_admin(user)] [language_holder.bypass_speaking_limitations ? "enabled" : "disabled"] the ability to speak all languages (that they know) of [key_name_admin(AM)].") + log_admin("[key_name(user)] [language_holder.bypass_speaking_limitations ? "enabled" : "disabled"] the ability to speak all languages (that_they know) of [key_name(AM)].") . = TRUE diff --git a/code/modules/language/language_visual.dm b/code/modules/language/language_visual.dm new file mode 100644 index 000000000000..de0d66d1af74 --- /dev/null +++ b/code/modules/language/language_visual.dm @@ -0,0 +1,69 @@ +/datum/language/visual + abstract_type = /datum/language/visual + +/datum/language/visual/can_receive_language(atom/movable/hearer, ignore_stat) + if(!ismob(hearer)) + return TRUE + + var/mob/M = hearer + return !M.is_blind() + +/datum/language/visual/can_speak_language(atom/movable/speaker, silent = TRUE) + if(!isliving(speaker)) + return TRUE + + var/mob/living/L = speaker + + . = L.can_speak_sign() + + if(!.) + if(!silent) + to_chat(speaker, span_warning("You find yourself unable to speak!")) + return + +/datum/language/visual/hear_speech(mob/living/hearer, atom/movable/speaker, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) + if(!istype(hearer)) + return + + if(!isturf(speaker.loc) && hearer.loc != speaker.loc) + return + + var/dist = get_dist(speaker, hearer) - message_range + var/is_observer = isobserver(hearer) + if (message_range != INFINITY && dist > 0 && !is_observer) + return + + var/avoid_highlight = FALSE + if(istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/virt = speaker + avoid_highlight = hearer == virt.source + else + avoid_highlight = hearer == speaker + + var/enable_runechat + if(ismob(speaker)) + enable_runechat = hearer.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) + else + enable_runechat = hearer.client?.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) + + var/can_receive_language = can_receive_language(hearer) + var/translated_message = hearer.translate_speech(speaker, src, raw_message, spans, message_mods) + + // Create map text prior to modifying message for goonchat, sign lang edition + if(message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] && !hearer.is_blind()) + hearer.create_chat_message(speaker, null, message_mods[MODE_CUSTOM_SAY_EMOTE], spans, EMOTE_MESSAGE, sound_loc = sound_loc) + + else if (enable_runechat && !(hearer.stat == UNCONSCIOUS || !can_receive_language)) + hearer.create_chat_message(speaker, src, translated_message, spans, sound_loc = sound_loc) + + if(!can_receive_language) + return + + var/parsed_message = hearer.compose_message(speaker, src, translated_message, radio_freq, spans, message_mods) + + to_chat(hearer, parsed_message, avoid_highlighting = avoid_highlight) + if(LAZYLEN(hearer.observers)) + for(var/mob/dead/observer/O in hearer.observers) + to_chat(O, parsed_message) + + return translated_message diff --git a/code/modules/language/aphasia.dm b/code/modules/language/languages/aphasia.dm similarity index 100% rename from code/modules/language/aphasia.dm rename to code/modules/language/languages/aphasia.dm diff --git a/code/modules/language/beachbum.dm b/code/modules/language/languages/beachbum.dm similarity index 100% rename from code/modules/language/beachbum.dm rename to code/modules/language/languages/beachbum.dm diff --git a/code/modules/language/buzzwords.dm b/code/modules/language/languages/buzzwords.dm similarity index 100% rename from code/modules/language/buzzwords.dm rename to code/modules/language/languages/buzzwords.dm diff --git a/code/modules/language/codespeak.dm b/code/modules/language/languages/codespeak.dm similarity index 91% rename from code/modules/language/codespeak.dm rename to code/modules/language/languages/codespeak.dm index 09db7ef511b4..5b839c1dd09f 100644 --- a/code/modules/language/codespeak.dm +++ b/code/modules/language/languages/codespeak.dm @@ -3,7 +3,7 @@ desc = "Syndicate operatives can use a series of codewords to convey complex information, while sounding like random concepts and drinks to anyone listening in." key = "t" default_priority = 0 - flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + flags = LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD icon_state = "codespeak" /datum/language/codespeak/scramble(input) diff --git a/code/modules/language/languages/common.dm b/code/modules/language/languages/common.dm new file mode 100644 index 000000000000..eded1e78bd11 --- /dev/null +++ b/code/modules/language/languages/common.dm @@ -0,0 +1,70 @@ +// 'basic' language; spoken by default. +/datum/language/common + name = "Galactic Common" + desc = "The common galactic tongue." + key = "0" + flags = LANGUAGE_HIDE_ICON_IF_UNDERSTOOD + default_priority = 100 + + icon_state = "galcom" + +//Syllable Lists +/* + This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed, + and the english syllables had to be duplicated so that there is roughly a 50-50 weighting. + + Sources: + http://www.sttmedia.com/syllablefrequency-english + http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm +*/ +/datum/language/common/syllables = list( +"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", +"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai", +"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", +"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei", +"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", +"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", +"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", +"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan", +"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", +"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", +"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", +"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang", +"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", +"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", +"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", +"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", +"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", +"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha", +"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", +"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", +"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", +"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", +"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan", +"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", +"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", +"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") diff --git a/code/modules/language/languages/draconic.dm b/code/modules/language/languages/draconic.dm new file mode 100644 index 000000000000..ac922f66891d --- /dev/null +++ b/code/modules/language/languages/draconic.dm @@ -0,0 +1,17 @@ +/datum/language/draconic + name = "Jinanuar" + desc = "The common language of the Jinans, composed of sibilant hisses, grumbles, and clicks." + key = "o" + space_chance = 40 + flags = parent_type::flags | (LANGUAGE_SELECTABLE_SPEAK | LANGUAGE_SELECTABLE_UNDERSTAND) + + syllables = list( + "ji", "na", "an", "ua", "au", "ou", "uo", "uh", "hu", "ar", "ra", + "in", "ni", "ka", "ak", "ke", "ek", "ki", "ik", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "su", "us", "ss", "ss", "rs", + "sr", "ur", "ru", "ra", "nu", "un", "il", "li", "sl", "ls", "ri", + "ir", "ij", "ai", "ia", "hi", "ih", + "j", "j", "a", "a", "i", "i", "u", "u", "r", "r", "s", "s", "s" + ) + icon_state = "lizard" + default_priority = 90 diff --git a/code/modules/language/drone.dm b/code/modules/language/languages/drone.dm similarity index 100% rename from code/modules/language/drone.dm rename to code/modules/language/languages/drone.dm diff --git a/code/modules/language/machine.dm b/code/modules/language/languages/machine.dm similarity index 90% rename from code/modules/language/machine.dm rename to code/modules/language/languages/machine.dm index 2d597d933347..bbb6147cdc7e 100644 --- a/code/modules/language/machine.dm +++ b/code/modules/language/languages/machine.dm @@ -3,7 +3,7 @@ desc = "An efficient language of encoded tones developed by synthetics and cyborgs." spans = list(SPAN_ROBOT) key = "6" - flags = NO_STUTTER + flags = NO_STUTTER | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD syllables = list("beep","beep","beep","beep","beep","boop","boop","boop","bop","bop","dee","dee","doo","doo","hiss","hss","buzz","buzz","bzz","ksssh","keey","wurr","wahh","tzzz") space_chance = 10 default_priority = 90 diff --git a/code/modules/language/moffic.dm b/code/modules/language/languages/moffic.dm similarity index 82% rename from code/modules/language/moffic.dm rename to code/modules/language/languages/moffic.dm index a5b9ec2e6f66..ed5f9f126971 100644 --- a/code/modules/language/moffic.dm +++ b/code/modules/language/languages/moffic.dm @@ -1,6 +1,6 @@ /datum/language/moffic name = "Moffic" - desc = "Also known as 'Gamuid' among its native speakers, the language of the Gamuioda borders on complete unintelligibility." + desc = "Bordering on complete unintelligibility, Moffic the language of %PLACEHOLDER." key = "m" space_chance = 10 syllables = list( diff --git a/code/modules/language/languages/monkey.dm b/code/modules/language/languages/monkey.dm new file mode 100644 index 000000000000..075b4545fd94 --- /dev/null +++ b/code/modules/language/languages/monkey.dm @@ -0,0 +1,10 @@ +/datum/language/monkey + name = "Chimpanzee" + desc = "Ook ook ook." + key = "1" + flags = parent_type::flags | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD + space_chance = 100 + syllables = list("oop", "aak", "chee", "eek") + default_priority = 80 + + icon_state = "animal" diff --git a/code/modules/language/narsian.dm b/code/modules/language/languages/narsian.dm similarity index 100% rename from code/modules/language/narsian.dm rename to code/modules/language/languages/narsian.dm diff --git a/code/modules/language/piratespeak.dm b/code/modules/language/languages/piratespeak.dm similarity index 100% rename from code/modules/language/piratespeak.dm rename to code/modules/language/languages/piratespeak.dm diff --git a/code/modules/language/schechi.dm b/code/modules/language/languages/schechi.dm similarity index 87% rename from code/modules/language/schechi.dm rename to code/modules/language/languages/schechi.dm index 79b7767dae62..64a3006f59f0 100644 --- a/code/modules/language/schechi.dm +++ b/code/modules/language/languages/schechi.dm @@ -1,6 +1,6 @@ /datum/language/schechi name = "Schechi" - desc = "The common language of the Kepori, consisting of miscellaneous chirps." + desc = "The common language of the Teshari, consisting of miscellaneous chirps." key = "c" space_chance = 40 syllables = list( diff --git a/code/modules/language/shadowtongue.dm b/code/modules/language/languages/shadowtongue.dm similarity index 100% rename from code/modules/language/shadowtongue.dm rename to code/modules/language/languages/shadowtongue.dm diff --git a/code/modules/language/languages/sign.dm b/code/modules/language/languages/sign.dm new file mode 100644 index 000000000000..ac6b9df9f8f7 --- /dev/null +++ b/code/modules/language/languages/sign.dm @@ -0,0 +1,72 @@ +/datum/language/visual/sign + name = "Universal Sign Language" + desc = "The universally understood sign language format." + key = "s" + default_priority = 90 + icon_state = "sign" + flags = parent_type::flags | (LANGUAGE_SELECTABLE_SPEAK | LANGUAGE_SELECTABLE_UNDERSTAND | LANGUAGE_OVERRIDE_SAY_MOD) + +/datum/language/visual/sign/speech_not_understood(atom/movable/source, raw_message, spans, list/message_mods, quote) + spans |= "italics" + spans |= "emote" + message_mods[MODE_NO_QUOTE] = TRUE + return span_emote("makes weird gestures with [source.p_their()] hands.") + +/datum/language/visual/sign/speech_understood(atom/movable/source, raw_message, spans, list/message_mods, quote) + var/static/regex/remove_tone = regex("\[?!\]", "g") + // Replace all tonal indicators with periods. + raw_message = remove_tone.Replace(raw_message, ".") + + // Strip out extra ending punctuation + while(length(raw_message) > 1 && raw_message[length(raw_message)] == ".") + if(length(raw_message) == 1 || raw_message[length(raw_message) - 1] != ".") + break + + raw_message = copytext(raw_message, 1, length(raw_message)) + + // Remove capital letters except the first. + raw_message = capitalize(lowertext(raw_message)) + return ..() + +/datum/language/visual/sign/before_speaking(atom/movable/speaker, message) + if(!iscarbon(speaker)) + return message + + var/mob/living/carbon/mute = speaker + switch(mute.check_signables_state()) + if(SIGN_ONE_HAND, SIGN_CUFFED) // One arm + return stars(message) + + if(SIGN_HANDS_FULL) // Full hands + to_chat(mute, span_warning("Your hands are full.")) + return + + if(SIGN_ARMLESS) // No arms + to_chat(mute, span_warning("You can't sign with no hands.")) + return + + if(SIGN_TRAIT_BLOCKED) // Hands Blocked or Emote Mute traits + to_chat(mute, span_warning("You can't sign at the moment.")) + return + + else + return message + +/datum/language/visual/sign/get_say_mod(mob/living/speaker) + var/signs = pick("signs", "gestures") + + // Any subtype of slurring in our status effects make us "slur" + if(speaker.has_status_effect(/datum/status_effect/speech/slurring)) + return "loosely [signs]" + + else if(speaker.has_status_effect(/datum/status_effect/speech/stutter)) + . = "shakily [signs]" + + else if(speaker.has_status_effect(/datum/status_effect/speech/stutter/derpspeech)) + . = "incoherently [signs]" + + else + if(speaker.combat_mode) + return "aggressively [signs] with their hands" + else + return "[signs] with their hands" diff --git a/code/modules/language/slime.dm b/code/modules/language/languages/slime.dm similarity index 100% rename from code/modules/language/slime.dm rename to code/modules/language/languages/slime.dm diff --git a/code/modules/language/languages/spacer.dm b/code/modules/language/languages/spacer.dm new file mode 100644 index 000000000000..f9a90b28045c --- /dev/null +++ b/code/modules/language/languages/spacer.dm @@ -0,0 +1,9 @@ +/datum/language/spacer + name = "Spacer" + desc = "A rough, informal language with syllables and words borrowed from countless languages and dialects." + key = "l" + syllables = list( + "ada", "zir", "bian", "ach", "usk", "ado", "ich", "cuan", "iga", "qing", "le", "que", "ki", "qaf", "dei", "eta" + ) + icon_state = "spacer" + flags = parent_type::flags | (LANGUAGE_SELECTABLE_SPEAK | LANGUAGE_SELECTABLE_UNDERSTAND) diff --git a/code/modules/language/sylvan.dm b/code/modules/language/languages/sylvan.dm similarity index 100% rename from code/modules/language/sylvan.dm rename to code/modules/language/languages/sylvan.dm diff --git a/code/modules/language/terrum.dm b/code/modules/language/languages/terrum.dm similarity index 100% rename from code/modules/language/terrum.dm rename to code/modules/language/languages/terrum.dm diff --git a/code/modules/language/uncommon.dm b/code/modules/language/languages/uncommon.dm similarity index 85% rename from code/modules/language/uncommon.dm rename to code/modules/language/languages/uncommon.dm index 59518a2c6832..4fa6574e7c30 100644 --- a/code/modules/language/uncommon.dm +++ b/code/modules/language/languages/uncommon.dm @@ -2,7 +2,6 @@ name = "Galactic Uncommon" desc = "The second-most spoken Human language." key = "!" - flags = TONGUELESS_SPEECH space_chance = 50 syllables = list( "ba", "be", "bo", "ca", "ce", "co", "da", "de", "do", @@ -14,3 +13,4 @@ ) icon_state = "galuncom" default_priority = 90 + flags = parent_type::flags | (LANGUAGE_SELECTABLE_SPEAK | LANGUAGE_SELECTABLE_UNDERSTAND) diff --git a/code/modules/language/voltaic.dm b/code/modules/language/languages/voltaic.dm similarity index 100% rename from code/modules/language/voltaic.dm rename to code/modules/language/languages/voltaic.dm diff --git a/code/modules/language/vox.dm b/code/modules/language/languages/vox.dm similarity index 94% rename from code/modules/language/vox.dm rename to code/modules/language/languages/vox.dm index 0801466e9ba8..0666077570ad 100644 --- a/code/modules/language/vox.dm +++ b/code/modules/language/languages/vox.dm @@ -2,7 +2,6 @@ name = "Vox-pidgin" desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else." key = "V" - flags = TONGUELESS_SPEECH space_chance = 40 syllables = list( "ti", "ti", "ti", "hi", "hi", "ki", "ki", "ki", "ki", "ya", "ta", "ha", "ka", "ya", "yi", "chi", diff --git a/code/modules/language/xenocommon.dm b/code/modules/language/languages/xenocommon.dm similarity index 100% rename from code/modules/language/xenocommon.dm rename to code/modules/language/languages/xenocommon.dm diff --git a/code/modules/language/monkey.dm b/code/modules/language/monkey.dm deleted file mode 100644 index e44f6a6268e2..000000000000 --- a/code/modules/language/monkey.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/language/monkey - name = "Chimpanzee" - desc = "Ook ook ook." - key = "1" - space_chance = 100 - syllables = list("oop", "aak", "chee", "eek") - default_priority = 80 - - icon_state = "animal" diff --git a/code/modules/language/mushroom.dm b/code/modules/language/mushroom.dm deleted file mode 100644 index 08d494cc04d6..000000000000 --- a/code/modules/language/mushroom.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/language/mushroom - name = "Mushroom" - desc = "A language that consists of the sound of periodic gusts of spore-filled air being released." - key = "y" - sentence_chance = 0 - default_priority = 80 - syllables = list("poof", "pff", "pFfF", "piff", "puff", "pooof", "pfffff", "piffpiff", "puffpuff", "poofpoof", "pifpafpofpuf") diff --git a/code/modules/language/nekomimetic.dm b/code/modules/language/nekomimetic.dm deleted file mode 100644 index 82edc2afcb57..000000000000 --- a/code/modules/language/nekomimetic.dm +++ /dev/null @@ -1,14 +0,0 @@ -/datum/language/nekomimetic - name = "Nekomimetic" - desc = "To the casual observer, this langauge is an incomprehensible mess of broken Japanese. To the felinids, it's somehow comprehensible." - key = "f" - space_chance = 70 - syllables = list( - "neko", "nyan", "mimi", "moe", "mofu", "fuwa", "kyaa", "kawaii", "poka", "munya", - "puni", "munyu", "ufufu", "uhuhu", "icha", "doki", "kyun", "kusu", "nya", "nyaa", - "desu", "kis", "ama", "chuu", "baka", "hewo", "boop", "gato", "kit", "sune", "yori", - "sou", "baka", "chan", "san", "kun", "mahou", "yatta", "suki", "usagi", "domo", "ori", - "uwa", "zaazaa", "shiku", "puru", "ira", "heto", "etto" - ) - icon_state = "neko" - default_priority = 90 diff --git a/code/modules/language/skrell.dm b/code/modules/language/skrell.dm deleted file mode 100644 index 88a66cb15107..000000000000 --- a/code/modules/language/skrell.dm +++ /dev/null @@ -1,10 +0,0 @@ -/datum/language/skrell - name = "Sk'Xrum" - desc = "The language of the skrells. A bunch of warbling and musical tone." - space_chance = 100 - flags = TONGUELESS_SPEECH - key = "l" - syllables = list("qr", "qrr", "xuq", "qil", "quum", "xuqm", "vol", "xrim", "zaoo", "qu-uu", "qix", "qoo", "zix") - default_priority = 90 - icon_state = "skrell" - icon = 'icons/misc/language.dmi' diff --git a/code/modules/library/barcode_scanner.dm b/code/modules/library/barcode_scanner.dm index 414a6b4301bd..3dbab03c09f6 100644 --- a/code/modules/library/barcode_scanner.dm +++ b/code/modules/library/barcode_scanner.dm @@ -3,7 +3,6 @@ icon = 'icons/obj/library.dmi' icon_state ="scanner" desc = "A fabulous tool if you need to scan a barcode." - throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_TINY /// A weakref to our associated computer - Modes 1 to 3 use this diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm index abe1d698e085..c8a1b675221f 100644 --- a/code/modules/library/book.dm +++ b/code/modules/library/book.dm @@ -71,7 +71,6 @@ icon_state ="book" worn_icon_state = "book" desc = "Crack it open, inhale the musk of its pages, and learn something new." - throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb_continuous = list("bashes", "whacks", "educates") @@ -115,7 +114,6 @@ if(!user.can_read(src)) return user.visible_message(span_notice("[user] opens a book titled \"[book_data.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/attackby(obj/item/I, mob/user, params) @@ -133,12 +131,12 @@ var/choice = tgui_input_list(usr, "What would you like to change?", "Book Alteration", list("Title", "Contents", "Author", "Cancel")) if(isnull(choice)) return - if(!user.canUseTopic(src, BE_CLOSE, literate)) + if(!user.canUseTopic(src, USE_CLOSE|USE_LITERACY)) return switch(choice) if("Title") var/newtitle = reject_bad_text(tgui_input_text(user, "Write a new title", "Book Title", max_length = 30)) - if(!user.canUseTopic(src, BE_CLOSE, literate)) + if(!user.canUseTopic(src, USE_CLOSE|USE_LITERACY)) return if (length_char(newtitle) > 30) to_chat(user, span_warning("That title won't fit on the cover!")) @@ -150,7 +148,7 @@ book_data.set_title(html_decode(newtitle)) //Don't want to double encode here if("Contents") var/content = tgui_input_text(user, "Write your book's contents (HTML NOT allowed)", "Book Contents", multiline = TRUE) - if(!user.canUseTopic(src, BE_CLOSE, literate)) + if(!user.canUseTopic(src, USE_CLOSE|USE_LITERACY)) return if(!content) to_chat(user, span_warning("The content is invalid.")) @@ -158,7 +156,7 @@ book_data.set_content(html_decode(content)) if("Author") var/author = tgui_input_text(user, "Write the author's name", "Author Name") - if(!user.canUseTopic(src, BE_CLOSE, literate)) + if(!user.canUseTopic(src, USE_CLOSE|USE_LITERACY)) return if(!author) to_chat(user, span_warning("The name is invalid.")) diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm index c152459a6c5f..93b54f7bab7e 100644 --- a/code/modules/library/bookcase.dm +++ b/code/modules/library/bookcase.dm @@ -12,7 +12,7 @@ opacity = FALSE resistance_flags = FLAMMABLE max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 0) var/state = BOOKCASE_UNANCHORED /// When enabled, books_to_load number of random books will be generated for this bookcase var/load_random_books = FALSE @@ -57,14 +57,14 @@ /obj/structure/bookcase/examine(mob/user) . = ..() if(!anchored) - . += span_notice("The bolts on the bottom are unsecured.") + . += span_notice("The bolts on the bottom are unsecured.") else . += span_notice("It's secured in place with bolts.") switch(state) if(BOOKCASE_UNANCHORED) . += span_notice("There's a small crack visible on the back panel.") if(BOOKCASE_ANCHORED) - . += span_notice("There's space inside for a wooden shelf.") + . += span_notice("There's space inside for a wooden shelf.") if(BOOKCASE_FINISHED) . += span_notice("There's a small crack visible on the shelf.") @@ -122,7 +122,7 @@ to_chat(user, span_notice("You scribble illegibly on the side of [src]!")) return var/newname = tgui_input_text(user, "What would you like to title this bookshelf?", "Bookshelf Renaming", max_length = MAX_NAME_LEN) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(!newname) return diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index c7452cf4dcfd..02c929b186a9 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -4,7 +4,6 @@ icon_state ="demonomicon" lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi' - throw_speed = 1 throw_range = 10 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF starting_title = "the Codex Gigas" diff --git a/code/modules/lighting/lighting_area.dm b/code/modules/lighting/lighting_area.dm index 27d5afcea39b..661ebeda524c 100644 --- a/code/modules/lighting/lighting_area.dm +++ b/code/modules/lighting/lighting_area.dm @@ -1,14 +1,31 @@ /area luminosity = 1 + ///The mutable appearance we underlay to show light var/mutable_appearance/lighting_effect = null ///Whether this area has a currently active base lighting, bool - var/area_has_base_lighting = FALSE - ///alpha 0-255 of lighting_effect and thus baselighting intensity - var/base_lighting_alpha = 0 + var/tmp/area_has_base_lighting = FALSE + /// What type of lighting this area uses + var/area_lighting = AREA_LIGHTING_DYNAMIC + + // Base lighting vars. Only used if area_lighting is AREA_LIGHTING_STATIC + ///alpha 1-255 of lighting_effect and thus baselighting intensity. If you want this to be zero, use AREA_LIGHTING_NONE instead! + var/base_lighting_alpha = 255 ///The colour of the light acting on this area var/base_lighting_color = COLOR_WHITE + +GLOBAL_REAL_VAR(mutable_appearance/fullbright_overlay) = create_fullbright_overlay() + +/proc/create_fullbright_overlay(color) + var/mutable_appearance/lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white") + lighting_effect.plane = LIGHTING_PLANE + lighting_effect.layer = LIGHTING_PRIMARY_LAYER + lighting_effect.blend_mode = BLEND_ADD + if(color) + lighting_effect.color = color + return lighting_effect + /area/proc/set_base_lighting(new_base_lighting_color = -1, new_alpha = -1) if(base_lighting_alpha == new_alpha && base_lighting_color == new_base_lighting_color) return FALSE @@ -27,8 +44,8 @@ if(NAMEOF(src, base_lighting_alpha)) set_base_lighting(new_alpha = var_value) return TRUE - if(NAMEOF(src, static_lighting)) - if(!static_lighting) + if(NAMEOF(src, area_lighting)) + if(area_lighting == AREA_LIGHTING_DYNAMIC) create_area_lighting_objects() else remove_area_lighting_objects() @@ -36,20 +53,25 @@ return ..() /area/proc/update_base_lighting() - if(!area_has_base_lighting && (!base_lighting_alpha || !base_lighting_color)) + var/should_have_base_lighting = area_lighting == AREA_LIGHTING_STATIC + if(!area_has_base_lighting && !should_have_base_lighting) return if(!area_has_base_lighting) add_base_lighting() return + remove_base_lighting() - if(base_lighting_alpha && base_lighting_color) + + if(should_have_base_lighting) add_base_lighting() /area/proc/remove_base_lighting() cut_overlays() - QDEL_NULL(lighting_effect) + lighting_effect = null area_has_base_lighting = FALSE + luminosity = 0 + blend_mode = BLEND_DEFAULT /area/proc/add_base_lighting() lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white") @@ -59,7 +81,27 @@ lighting_effect.alpha = base_lighting_alpha lighting_effect.color = base_lighting_color lighting_effect.appearance_flags = RESET_TRANSFORM | RESET_ALPHA | RESET_COLOR - add_overlay(lighting_effect) - for(var/turf/T in src) - T.luminosity = 1 + area_has_base_lighting = TRUE + luminosity = 1 + blend_mode = BLEND_MULTIPLY + +//Non static lighting areas. +//Any lighting area that wont support static lights. +//These areas will NOT have corners generated. + +///regenerates lighting objects for turfs in this area, primary use is VV changes +/area/proc/create_area_lighting_objects() + for(var/turf/T in src) + if(T.always_lit) + continue + T.lighting_build_overlay() + CHECK_TICK + +///Removes lighting objects from turfs in this area if we have them, primary use is VV changes +/area/proc/remove_area_lighting_objects() + for(var/turf/T in src) + if(T.always_lit) + continue + T.lighting_clear_overlay() + CHECK_TICK diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 846fb326a8e1..b583672076d7 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -35,11 +35,11 @@ /// Will update the light (duh). /// Creates or destroys it if needed, makes it update values, makes sure it's got the correct source turf... /atom/proc/update_light() - set waitfor = FALSE + SHOULD_NOT_SLEEP(TRUE) if (QDELETED(src)) return - if(light_system != STATIC_LIGHT) + if(light_system != COMPLEX_LIGHT) CRASH("update_light() for [src] with following light_system value: [light_system]") if (!light_power || !light_outer_range || !light_on) // We won't emit light anyways, destroy the light source. diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 7a74a1d34710..286ba4a4f0cd 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -13,25 +13,16 @@ var/turf/master_SW var/turf/master_NW - var/sum_r = 0 - var/sum_g = 0 - var/sum_b = 0 - - //color values from lights shining DIRECTLY on us - VAR_PRIVATE/self_r = 0 - VAR_PRIVATE/self_g = 0 - VAR_PRIVATE/self_b = 0 + //"raw" color values, changed by update_lumcount() + var/lum_r = 0 + var/lum_g = 0 + var/lum_b = 0 //true color values, guaranteed to be between 0 and 1 var/cache_r = LIGHTING_SOFT_THRESHOLD var/cache_g = LIGHTING_SOFT_THRESHOLD var/cache_b = LIGHTING_SOFT_THRESHOLD - // The intensity we're inheriting from the turf below us, if we're a Z-turf. - var/below_r = 0 - var/below_g = 0 - var/below_b = 0 - //additive light values var/add_r = 0 var/add_g = 0 @@ -44,50 +35,46 @@ ///whether we are to be added to SSlighting's corners_queue list for an update var/needs_update = FALSE -/datum/lighting_corner/New(turf/new_turf, diagonal) +/datum/lighting_corner/New(x, y, z) . = ..() - save_master(new_turf, turn(diagonal, 180)) - - var/vertical = diagonal & ~(diagonal - 1) // The horizontal directions (4 and 8) are bigger than the vertical ones (1 and 2), so we can reliably say the lsb is the horizontal direction. - var/horizontal = diagonal & ~vertical // Now that we know the horizontal one we can get the vertical one. - - x = new_turf.x + (horizontal == EAST ? 0.5 : -0.5) - y = new_turf.y + (vertical == NORTH ? 0.5 : -0.5) - - // My initial plan was to make this loop through a list of all the dirs (horizontal, vertical, diagonal). - // Issue being that the only way I could think of doing it was very messy, slow and honestly overengineered. - // So we'll have this hardcode instead. - var/turf/new_master_turf - - // Diagonal one is easy. - new_master_turf = get_step(new_turf, diagonal) - if (new_master_turf) // In case we're on the map's border. - save_master(new_master_turf, diagonal) - - // Now the horizontal one. - new_master_turf = get_step(new_turf, horizontal) - if (new_master_turf) // Ditto. - save_master(new_master_turf, ((new_master_turf.x > x) ? EAST : WEST) | ((new_master_turf.y > y) ? NORTH : SOUTH)) // Get the dir based on coordinates. - - // And finally the vertical one. - new_master_turf = get_step(new_turf, vertical) - if (new_master_turf) - save_master(new_master_turf, ((new_master_turf.x > x) ? EAST : WEST) | ((new_master_turf.y > y) ? NORTH : SOUTH)) // Get the dir based on coordinates. - -/datum/lighting_corner/proc/save_master(turf/master, dir) - switch (dir) - if (NORTHEAST) - master_NE = master - master.lighting_corner_SW = src - if (SOUTHEAST) - master_SE = master - master.lighting_corner_NW = src - if (SOUTHWEST) - master_SW = master - master.lighting_corner_NE = src - if (NORTHWEST) - master_NW = master - master.lighting_corner_SE = src + src.x = x + 0.5 + src.y = y + 0.5 + + // Alright. We're gonna take a set of coords, and from them do a loop clockwise + // To build out the turfs adjacent to us. This is pretty fast + var/turf/process_next = locate(x, y, z) + if(process_next) + master_SW = process_next + process_next.lighting_corner_NE = src + // Now, we go north! + process_next = get_step(process_next, NORTH) + else + // Yes this is slightly slower then having a guarenteeed turf, but there aren't many null turfs + // So this is pretty damn fast + process_next = locate(x, y + 1, z) + + // Ok, if we have a north turf, go there. otherwise, onto the next + if(process_next) + master_NW = process_next + process_next.lighting_corner_SE = src + // Now, TO THE EAST + process_next = get_step(process_next, EAST) + else + process_next = locate(x + 1, y + 1, z) + + // Etc etc + if(process_next) + master_NE = process_next + process_next.lighting_corner_SW = src + // Now, TO THE SOUTH AGAIN (SE) + process_next = get_step(process_next, SOUTH) + else + process_next = locate(x + 1, y, z) + + // anddd the last tile + if(process_next) + master_SE = process_next + process_next.lighting_corner_NW = src /datum/lighting_corner/proc/vis_update() for (var/datum/light_source/light_source as anything in affecting) @@ -97,95 +84,76 @@ for (var/datum/light_source/light_source as anything in affecting) light_source.recalc_corner(src) -#define UPDATE_ABOVE_LUM(Tt, corner) \ - if((T = Tt?.above)) { \ - if(T.lighting_object) { \ - C = T.##corner; \ - if(!C) { \ - T.generate_missing_corners(); \ - C = T.##corner; \ - } \ - C.update_below_lumcount(delta_r, delta_g, delta_b); \ - } \ - } - -#define UPDATE_SUM_LUM(color) (sum_##color = below_##color + self_##color) - // God that was a mess, now to do the rest of the corner code! Hooray! /datum/lighting_corner/proc/update_lumcount(delta_r, delta_g, delta_b) + +#ifdef VISUALIZE_LIGHT_UPDATES + if (!SSlighting.allow_duped_values && !(delta_r || delta_g || delta_b)) // 0 is falsey ok + return +#else if (!(delta_r || delta_g || delta_b)) // 0 is falsey ok return +#endif - self_r += delta_r - self_g += delta_g - self_b += delta_b - UPDATE_SUM_LUM(r) - UPDATE_SUM_LUM(g) - UPDATE_SUM_LUM(b) - - add_r = clamp((self_r - 1.4) * 0.5, 0, 0.3) - add_g = clamp((self_g - 1.4) * 0.5, 0, 0.3) - add_b = clamp((self_b - 1.4) * 0.5, 0, 0.3) - - applying_additive = add_r || add_b || add_g - - #ifdef ZMIMIC_LIGHT_BLEED - var/turf/T - var/datum/lighting_corner/C - UPDATE_ABOVE_LUM(master_NE, lighting_corner_NE) - UPDATE_ABOVE_LUM(master_SE, lighting_corner_SE) - UPDATE_ABOVE_LUM(master_SW, lighting_corner_SW) - UPDATE_ABOVE_LUM(master_NW, lighting_corner_NW) - #endif + lum_r += delta_r + lum_g += delta_g + lum_b += delta_b if (!needs_update) needs_update = TRUE SSlighting.corners_queue += src -/datum/lighting_corner/proc/update_below_lumcount(delta_r, delta_g, delta_b, now = FALSE) - if (!(delta_r + delta_g + delta_b)) - return - - below_r += delta_r - below_g += delta_g - below_b += delta_b - - UPDATE_SUM_LUM(r) - UPDATE_SUM_LUM(g) - UPDATE_SUM_LUM(b) - - // This needs to be down here instead of the above if so the lum values are properly updated. - if (needs_update) - return - - needs_update = TRUE - SSlighting.corners_queue += src - /datum/lighting_corner/proc/update_objects() // Cache these values ahead of time so 4 individual lighting objects don't all calculate them individually. - var/lr = src.sum_r - var/lg = src.sum_g - var/lb = src.sum_b - var/largest_color_luminosity = max(sum_r, sum_g, sum_b) // Scale it so one of them is the strongest lum, if it is above 1. + var/lum_r = src.lum_r + var/lum_g = src.lum_g + var/lum_b = src.lum_b + var/largest_color_luminosity = max(lum_r, lum_g, lum_b) // Scale it so one of them is the strongest lum, if it is above 1. . = 1 // factor if (largest_color_luminosity > 1) . = 1 / largest_color_luminosity + var/old_r = cache_r + var/old_g = cache_g + var/old_b = cache_b + + var/old_add_r = add_r + var/old_add_g = add_g + var/old_add_b = add_b + #if LIGHTING_SOFT_THRESHOLD != 0 else if (largest_color_luminosity < LIGHTING_SOFT_THRESHOLD) . = 0 // 0 means soft lighting. - cache_r = round(lr * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD - cache_g = round(lg * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD - cache_b = round(lb * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) || LIGHTING_SOFT_THRESHOLD #else - cache_r = round(lr * ., LIGHTING_ROUND_VALUE) - cache_g = round(lg * ., LIGHTING_ROUND_VALUE) - cache_b = round(lb * ., LIGHTING_ROUND_VALUE) + cache_r = round(lum_r * ., LIGHTING_ROUND_VALUE) + cache_g = round(lum_g * ., LIGHTING_ROUND_VALUE) + cache_b = round(lum_b * ., LIGHTING_ROUND_VALUE) #endif + add_r = clamp((lum_r - 1.1) * 0.3, 0, 0.22) + add_g = clamp((lum_g - 1.1) * 0.3, 0, 0.22) + add_b = clamp((lum_b - 1.1) * 0.3, 0, 0.22) + + // Client-shredding, does not cull any additive overlays. + //applying_additive = add_r || add_g || add_b + // Cull additive overlays that would be below 0.03 alpha in any color. + applying_additive = max(add_r, add_g, add_b) > 0.03 + // Cull additive overlays whose color alpha sum is lower than 0.03 + //applying_additive = (add_r + add_g + add_b) > 0.03 + src.largest_color_luminosity = round(largest_color_luminosity, LIGHTING_ROUND_VALUE) +#ifdef VISUALIZE_LIGHT_UPDATES + if(!SSlighting.allow_duped_corners && old_r == cache_r && old_g == cache_g && old_b == cache_b && old_add_r == add_r && old_add_b == add_b && old_add_g == add_g) + return +#else + if(old_r == cache_r && old_g == cache_g && old_b == cache_b && old_add_r == add_r && old_add_b == add_b && old_add_g == add_g) + return +#endif var/datum/lighting_object/lighting_object = master_NE?.lighting_object if (lighting_object && !lighting_object.needs_update) @@ -216,6 +184,3 @@ 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.") return QDEL_HINT_LETMELIVE - -#undef UPDATE_ABOVE_LUM -#undef UPDATE_SUM_LUM diff --git a/code/modules/lighting/lighting_object.dm b/code/modules/lighting/lighting_object.dm index 5af9245e6e31..c4108874a107 100644 --- a/code/modules/lighting/lighting_object.dm +++ b/code/modules/lighting/lighting_object.dm @@ -48,6 +48,12 @@ return ..() /datum/lighting_object/proc/update() + var/turf/affected_turf = src.affected_turf +#ifdef VISUALIZE_LIGHT_UPDATES + affected_turf.add_atom_colour(COLOR_BLUE_LIGHT, ADMIN_COLOUR_PRIORITY) + animate(affected_turf, 10, color = null) + addtimer(CALLBACK(affected_turf, /atom/proc/remove_atom_colour, ADMIN_COLOUR_PRIORITY, COLOR_BLUE_LIGHT), 10, TIMER_UNIQUE|TIMER_OVERRIDE) +#endif // To the future coder who sees this and thinks // "Why didn't he just use a loop?" @@ -66,22 +72,6 @@ var/max = max(red_corner.largest_color_luminosity, green_corner.largest_color_luminosity, blue_corner.largest_color_luminosity, alpha_corner.largest_color_luminosity) - var/rr = red_corner.cache_r - var/rg = red_corner.cache_g - var/rb = red_corner.cache_b - - var/gr = green_corner.cache_r - var/gg = green_corner.cache_g - var/gb = green_corner.cache_b - - var/br = blue_corner.cache_r - var/bg = blue_corner.cache_g - var/bb = blue_corner.cache_b - - var/ar = alpha_corner.cache_r - var/ag = alpha_corner.cache_g - var/ab = alpha_corner.cache_b - #if LIGHTING_SOFT_THRESHOLD != 0 var/set_luminosity = max > LIGHTING_SOFT_THRESHOLD #else @@ -90,62 +80,50 @@ var/set_luminosity = max > 1e-6 #endif - if((rr & gr & br & ar) && (rg + gg + bg + ag + rb + gb + bb + ab == 8)) + var/mutable_appearance/current_underlay = src.current_underlay + affected_turf.underlays -= current_underlay + + if(red_corner.cache_r & green_corner.cache_r & blue_corner.cache_r & alpha_corner.cache_r && \ + (red_corner.cache_g + green_corner.cache_g + blue_corner.cache_g + alpha_corner.cache_g + \ + red_corner.cache_b + green_corner.cache_b + blue_corner.cache_b + alpha_corner.cache_b == 8)) + //anything that passes the first case is very likely to pass the second, and addition is a little faster in this case - affected_turf.underlays -= current_underlay current_underlay.icon_state = "lighting_transparent" current_underlay.color = null - affected_turf.underlays += current_underlay + else if(!set_luminosity) - affected_turf.underlays -= current_underlay current_underlay.icon_state = "lighting_dark" current_underlay.color = null - affected_turf.underlays += current_underlay + else - affected_turf.underlays -= current_underlay current_underlay.icon_state = affected_turf.lighting_uses_jen ? "wall-jen-[affected_turf.smoothing_junction]" : "light" current_underlay.color = list( - rr, rg, rb, 00, - gr, gg, gb, 00, - br, bg, bb, 00, - ar, ag, ab, 00, + red_corner.cache_r, red_corner.cache_g, red_corner.cache_b, 00, + green_corner.cache_r, green_corner.cache_g, green_corner.cache_b, 00, + blue_corner.cache_r, blue_corner.cache_g, blue_corner.cache_b, 00, + alpha_corner.cache_r, alpha_corner.cache_g, alpha_corner.cache_b, 00, 00, 00, 00, 01 ) - affected_turf.underlays += current_underlay - if((red_corner.applying_additive || green_corner.applying_additive || blue_corner.applying_additive || alpha_corner.applying_additive) && !(affected_turf.z_flags & Z_MIMIC_OVERWRITE)) //I'm not ENTIRELY sure why, but turfs of this nature will black out if they get bloom'd affected_turf.underlays -= additive_underlay additive_underlay.icon_state = affected_turf.lighting_uses_jen ? "wall-jen-[affected_turf.smoothing_junction]" : "light" - var/arr = red_corner.add_r - var/arb = red_corner.add_b - var/arg = red_corner.add_g - - var/agr = green_corner.add_r - var/agb = green_corner.add_b - var/agg = green_corner.add_g - - var/abr = blue_corner.add_r - var/abb = blue_corner.add_b - var/abg = blue_corner.add_g - - var/aarr = alpha_corner.add_r - var/aarb = alpha_corner.add_b - var/aarg = alpha_corner.add_g additive_underlay.color = list( - arr, arg, arb, 00, - agr, agg, agb, 00, - abr, abg, abb, 00, - aarr, aarg, aarb, 00, + red_corner.add_r, red_corner.add_g, red_corner.add_b, 00, + green_corner.add_r, green_corner.add_g, green_corner.add_b, 00, + blue_corner.add_r, blue_corner.add_g, blue_corner.add_b, 00, + alpha_corner.add_r, alpha_corner.add_g, alpha_corner.add_b, 00, 00, 00, 00, 01 ) + affected_turf.underlays += additive_underlay else affected_turf.underlays -= additive_underlay - affected_turf.luminosity = set_luminosity + affected_turf.underlays += current_underlay + affected_turf.luminosity = set_luminosity || affected_turf.loc:area_has_base_lighting if (affected_turf.above) if(affected_turf.above.shadower) diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 78fde88899e5..63f46435ac7e 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,7 +1,7 @@ /proc/create_all_lighting_objects() - for(var/area/A in world) - if(!A.static_lighting) + for(var/area/A in GLOB.areas) + if(A.area_lighting != AREA_LIGHTING_DYNAMIC) continue for(var/turf/T in A) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index b805eb9fa4a0..ea142275e977 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -90,6 +90,7 @@ //yes, we register the signal to the top atom too, this is intentional and ensures contained lighting updates properly if(ismovable(new_atom_host)) RegisterSignal(new_atom_host, COMSIG_MOVABLE_MOVED, PROC_REF(update_host_lights)) + RegisterSignal(new_atom_host, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT, PROC_REF(force_update)) return TRUE ///remove this light source from old_atom_host's light_sources list, unsetting movement registrations @@ -100,17 +101,9 @@ LAZYREMOVE(old_atom_host.light_sources, src) if(ismovable(old_atom_host)) UnregisterSignal(old_atom_host, COMSIG_MOVABLE_MOVED) + UnregisterSignal(old_atom_host, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT) return TRUE -///signal handler for when our host atom moves and we need to update our effects -/datum/light_source/proc/update_host_lights(atom/movable/host) - SIGNAL_HANDLER - - if(QDELETED(host)) - return - - host.update_light() - // 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. // Actually that'd be great if you could! @@ -143,42 +136,58 @@ /datum/light_source/proc/vis_update() EFFECT_UPDATE(LIGHTING_VIS_UPDATE) -// Macro that applies light to a new corner. -// It is a macro in the interest of speed, yet not having to copy paste it. -// If you're wondering what's with the backslashes, the backslashes cause BYOND to not automatically end the line. -// As such this all gets counted as a single line. -// The braces and semicolons are there to be able to do this on a single line. -//#define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) - // This is the define used to calculate falloff. // Assuming a brightness of 1 at range 1, formula should be (brightness = 1 / distance^2) // However, due to the weird range factor, brightness = (-(distance - full_dark_start) / (full_dark_start - full_light_end)) ^ light_max_bright -#define LUM_FALLOFF(C, T)(CLAMP01(-((((C.x - T.x) ** 2 +(C.y - T.y) ** 2) ** 0.5 - light_outer_range) / max(light_outer_range - light_inner_range, 1))) ** light_falloff_curve) +//#define LUM_FALLOFF(C, T)(CLAMP01(-((((C.x - T.x) ** 2 +(C.y - T.y) ** 2) ** 0.5 - light_outer_range) / max(light_outer_range - light_inner_range, 1))) ** light_falloff_curve) + +#define LUM_FALLOFF(C) (CLAMP01(-((((C.x - _turf_x) ** 2 +(C.y - _turf_y) ** 2) ** 0.5 - light_outer_range) / _range_divisor)) ** light_falloff_curve) + +// This exists so we can cache the vars used in this macro, and save MASSIVE time :) +// Most of this is saving off datum var accesses, tho some of it does actually cache computation +// You will NEED to call this before you call APPLY_CORNER +#define SETUP_CORNERS_CACHE(lighting_source) \ + var/_turf_x = lighting_source.pixel_turf.x; \ + var/_turf_y = lighting_source.pixel_turf.y; \ + var/_range_divisor = max(1, lighting_source.light_outer_range - lighting_source.light_inner_range); \ + var/_light_power = lighting_source.light_power; \ + var/_applied_lum_r = lighting_source.applied_lum_r; \ + var/_applied_lum_g = lighting_source.applied_lum_g; \ + var/_applied_lum_b = lighting_source.applied_lum_b; \ + var/_lum_r = lighting_source.lum_r; \ + var/_lum_g = lighting_source.lum_g; \ + var/_lum_b = lighting_source.lum_b; \ + +#define SETUP_CORNERS_REMOVAL_CACHE(lighting_source) \ + var/_applied_lum_r = lighting_source.applied_lum_r; \ + var/_applied_lum_g = lighting_source.applied_lum_g; \ + var/_applied_lum_b = lighting_source.applied_lum_b; #define APPLY_CORNER(C) \ - . = LUM_FALLOFF(C, pixel_turf); \ - . *= (light_power ** 2); \ - . *= light_power < 0 ? -1:1; \ + . = LUM_FALLOFF(C); \ + . *= (_light_power ** 2); \ + . *= _light_power < 0 ? -1:1; \ var/OLD = effect_str[C]; \ \ C.update_lumcount \ ( \ - (. * lum_r) - (OLD * applied_lum_r), \ - (. * lum_g) - (OLD * applied_lum_g), \ - (. * lum_b) - (OLD * applied_lum_b) \ + (. * _lum_r) - (OLD * _applied_lum_r), \ + (. * _lum_g) - (OLD * _applied_lum_g), \ + (. * _lum_b) - (OLD * _applied_lum_b) \ ); \ #define REMOVE_CORNER(C) \ . = -effect_str[C]; \ C.update_lumcount \ ( \ - . * applied_lum_r, \ - . * applied_lum_g, \ - . * applied_lum_b \ + . * _applied_lum_r, \ + . * _applied_lum_g, \ + . * _applied_lum_b \ ); /// This is the define used to calculate falloff. /datum/light_source/proc/remove_lum() + SETUP_CORNERS_REMOVAL_CACHE(src) applied = FALSE for (var/datum/lighting_corner/corner as anything in effect_str) REMOVE_CORNER(corner) @@ -187,6 +196,7 @@ effect_str = null /datum/light_source/proc/recalc_corner(datum/lighting_corner/corner) + SETUP_CORNERS_CACHE(src) LAZYINITLIST(effect_str) if (effect_str[corner]) // Already have one. REMOVE_CORNER(corner) @@ -195,6 +205,21 @@ APPLY_CORNER(corner) effect_str[corner] = . +// Keep in mind. Lighting corners accept the bottom left (northwest) set of cords to them as input +#define GENERATE_MISSING_CORNERS(gen_for) \ + if (!gen_for.lighting_corner_NE) { \ + gen_for.lighting_corner_NE = new /datum/lighting_corner(gen_for.x, gen_for.y, gen_for.z); \ + } \ + if (!gen_for.lighting_corner_SE) { \ + gen_for.lighting_corner_SE = new /datum/lighting_corner(gen_for.x, gen_for.y - 1, gen_for.z); \ + } \ + if (!gen_for.lighting_corner_SW) { \ + gen_for.lighting_corner_SW = new /datum/lighting_corner(gen_for.x - 1, gen_for.y - 1, gen_for.z); \ + } \ + if (!gen_for.lighting_corner_NW) { \ + gen_for.lighting_corner_NW = new /datum/lighting_corner(gen_for.x - 1, gen_for.y, gen_for.z); \ + } \ + gen_for.lighting_corners_initialised = TRUE; /datum/light_source/proc/update_corners() var/update = FALSE @@ -266,24 +291,29 @@ return //nothing's changed var/list/datum/lighting_corner/corners = list() - var/list/turf/turfs = list() if (source_turf) var/oldlum = source_turf.luminosity source_turf.luminosity = CEILING(light_outer_range, 1) for(var/turf/T in view(CEILING(light_outer_range, 1), source_turf)) - if(!IS_OPAQUE_TURF(T)) - if (!T.lighting_corners_initialised) - T.generate_missing_corners() - corners[T.lighting_corner_NE] = 0 - corners[T.lighting_corner_SE] = 0 - corners[T.lighting_corner_SW] = 0 - corners[T.lighting_corner_NW] = 0 - turfs += T + if(IS_OPAQUE_TURF(T)) + continue + if (!T.lighting_corners_initialised) + GENERATE_MISSING_CORNERS(T) + + corners[T.lighting_corner_NE] = 0 + corners[T.lighting_corner_SE] = 0 + corners[T.lighting_corner_SW] = 0 + corners[T.lighting_corner_NW] = 0 + source_turf.luminosity = oldlum - var/list/datum/lighting_corner/new_corners = (corners - effect_str) - LAZYINITLIST(effect_str) + SETUP_CORNERS_CACHE(src) + + var/list/datum/lighting_corner/new_corners = (corners - src.effect_str) + LAZYINITLIST(src.effect_str) + var/list/effect_str = src.effect_str + if (needs_update == LIGHTING_VIS_UPDATE) for (var/datum/lighting_corner/corner as anything in new_corners) APPLY_CORNER(corner) @@ -297,13 +327,15 @@ LAZYADD(corner.affecting, src) effect_str[corner] = . - for (var/datum/lighting_corner/corner as anything in corners - new_corners) // Existing corners - APPLY_CORNER(corner) - if (. != 0) - effect_str[corner] = . - else - LAZYREMOVE(corner.affecting, src) - effect_str -= corner + // New corners are a subset of corners. so if they're both the same length, there are NO old corners! + if(length(corners) != length(new_corners)) + for (var/datum/lighting_corner/corner as anything in corners - new_corners) // Existing corners + APPLY_CORNER(corner) + if (. != 0) + effect_str[corner] = . + else + LAZYREMOVE(corner.affecting, src) + effect_str -= corner var/list/datum/lighting_corner/gone_corners = effect_str - corners for (var/datum/lighting_corner/corner as anything in gone_corners) @@ -315,9 +347,26 @@ applied_lum_g = lum_g applied_lum_b = lum_b - UNSETEMPTY(effect_str) + UNSETEMPTY(src.effect_str) + +///signal handler for when our host atom moves and we need to update our effects +/datum/light_source/proc/update_host_lights(atom/movable/host) + SIGNAL_HANDLER + if(QDELETED(host)) + return + + // If the host is our owner, we want to call their update so they can decide who the top atom should be + if(host == source_atom) + host.update_light() + return + + // Otherwise, our top atom just moved, so we trigger a normal rebuild + EFFECT_UPDATE(LIGHTING_CHECK_UPDATE) #undef EFFECT_UPDATE #undef LUM_FALLOFF #undef REMOVE_CORNER #undef APPLY_CORNER +#undef SETUP_CORNERS_REMOVAL_CACHE +#undef SETUP_CORNERS_CACHE +#undef GENERATE_MISSING_CORNERS diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm index 7ce0f991e6a2..c94fc3915cc3 100644 --- a/code/modules/lighting/lighting_turf.dm +++ b/code/modules/lighting/lighting_turf.dm @@ -25,16 +25,16 @@ var/datum/lighting_corner/L L = lighting_corner_NE if (L) - totallums += L.sum_r + L.sum_b + L.sum_g + totallums += L.lum_r + L.lum_b + L.lum_g L = lighting_corner_SE if (L) - totallums += L.sum_r + L.sum_b + L.sum_g + totallums += L.lum_r + L.lum_b + L.lum_g L = lighting_corner_SW if (L) - totallums += L.sum_r + L.sum_b + L.sum_g + totallums += L.lum_r + L.lum_b + L.lum_g L = lighting_corner_NW if (L) - totallums += L.sum_r + L.sum_b + L.sum_g + totallums += L.lum_r + L.lum_b + L.lum_g totallums /= 12 // 4 corners, each with 3 channels, get the average. @@ -53,8 +53,7 @@ if (!lighting_object) return FALSE - return !(luminosity || dynamic_lumcount) - + return !(loc:luminosity || luminosity || dynamic_lumcount) ///Proc to add movable sources of opacity on the turf and let it handle lighting code. /turf/proc/add_opacity_source(atom/movable/new_source) @@ -81,12 +80,16 @@ reconsider_lights() return directional_opacity = NONE - for(var/atom/movable/opacity_source as anything in opacity_sources) - if(opacity_source.flags_1 & ON_BORDER_1) - directional_opacity |= opacity_source.dir - else //If fulltile and opaque, then the whole tile blocks view, no need to continue checking. - directional_opacity = ALL_CARDINALS - break + if(opacity_sources) + for(var/atom/movable/opacity_source as anything in opacity_sources) + if(opacity_source.flags_1 & ON_BORDER_1) + directional_opacity |= opacity_source.dir + else //If fulltile and opaque, then the whole tile blocks view, no need to continue checking. + directional_opacity = ALL_CARDINALS + break + else + for(var/atom/movable/content as anything in contents) + SEND_SIGNAL(content, COMSIG_TURF_NO_LONGER_BLOCK_LIGHT) if(. != directional_opacity && (. == ALL_CARDINALS || directional_opacity == ALL_CARDINALS)) reconsider_lights() //The lighting system only cares whether the tile is fully concealed from all directions or not. @@ -94,23 +97,8 @@ ///Transfer the lighting of one area to another /turf/proc/transfer_area_lighting(area/old_area, area/new_area) if(SSlighting.initialized) - if (new_area.static_lighting != old_area.static_lighting) - if (new_area.static_lighting) + if (new_area.area_lighting != old_area.area_lighting) + if (new_area.area_lighting == AREA_LIGHTING_DYNAMIC) lighting_build_overlay() else lighting_clear_overlay() - -/turf/proc/generate_missing_corners() - if (!lighting_corner_NE) - lighting_corner_NE = new/datum/lighting_corner(src, NORTH|EAST) - - if (!lighting_corner_SE) - lighting_corner_SE = new/datum/lighting_corner(src, SOUTH|EAST) - - if (!lighting_corner_SW) - lighting_corner_SW = new/datum/lighting_corner(src, SOUTH|WEST) - - if (!lighting_corner_NW) - lighting_corner_NW = new/datum/lighting_corner(src, NORTH|WEST) - - lighting_corners_initialised = TRUE diff --git a/code/modules/lighting/static_lighting_area.dm b/code/modules/lighting/static_lighting_area.dm deleted file mode 100644 index 7ea16cbe5992..000000000000 --- a/code/modules/lighting/static_lighting_area.dm +++ /dev/null @@ -1,35 +0,0 @@ - -GLOBAL_REAL_VAR(mutable_appearance/fullbright_overlay) = create_fullbright_overlay() - -/proc/create_fullbright_overlay(color) - var/mutable_appearance/lighting_effect = mutable_appearance('icons/effects/alphacolors.dmi', "white") - lighting_effect.plane = LIGHTING_PLANE - lighting_effect.layer = LIGHTING_PRIMARY_LAYER - lighting_effect.blend_mode = BLEND_ADD - if(color) - lighting_effect.color = color - return lighting_effect - -/area - ///Whether this area allows static lighting and thus loads the lighting objects - var/static_lighting = TRUE - -//Non static lighting areas. -//Any lighting area that wont support static lights. -//These areas will NOT have corners generated. - -///regenerates lighting objects for turfs in this area, primary use is VV changes -/area/proc/create_area_lighting_objects() - for(var/turf/T in src) - if(T.always_lit) - continue - T.lighting_build_overlay() - CHECK_TICK - -///Removes lighting objects from turfs in this area if we have them, primary use is VV changes -/area/proc/remove_area_lighting_objects() - for(var/turf/T in src) - if(T.always_lit) - continue - T.lighting_clear_overlay() - CHECK_TICK diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 2a73c1bef90b..af43855519af 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -412,7 +412,7 @@ * * close: boolean, the state you want the curtains in. */ /datum/mafia_controller/proc/toggle_night_curtains(close) - for(var/obj/machinery/door/poddoor/D in GLOB.machines) //I really dislike pathing of these + for(var/obj/machinery/door/poddoor/D in INSTANCES_OF(/obj/machinery/door)) //I really dislike pathing of these if(D.id != "mafia") //so as to not trigger shutters on station, lol continue if(close) diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm index c928d7b72037..2aa046b0e5d8 100644 --- a/code/modules/mafia/map_pieces.dm +++ b/code/modules/mafia/map_pieces.dm @@ -29,9 +29,8 @@ /area/centcom/mafia name = "Mafia Minigame" icon_state = "mafia" - static_lighting = FALSE + area_lighting = AREA_LIGHTING_STATIC - base_lighting_alpha = 255 requires_power = FALSE has_gravity = STANDARD_GRAVITY flags_1 = NONE @@ -50,11 +49,6 @@ description = "Yes, it's a very confusing day at the Megastation. Will the syndicate conflict resolution operatives succeed?" mappath = "_maps/map_files/Mafia/mafia_syndie.dmm" -/datum/map_template/mafia/lavaland - name = "Lavaland Excursion" - description = "The station has no idea what's going down on lavaland right now, we got changelings... traitors, and worst of all... lawyers roleblocking you every night." - mappath = "_maps/map_files/Mafia/mafia_lavaland.dmm" - /datum/map_template/mafia/ufo name = "Alien Mothership" description = "The haunted ghost UFO tour has gone south and now it's up to our fine townies and scare seekers to kill the actual real alien changelings..." diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index a5040c640ba2..21a286e00833 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -48,7 +48,7 @@ uniform = /obj/item/clothing/under/rank/security/officer gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/helmet/sec - suit = /obj/item/clothing/suit/armor/vest/alt + suit = /obj/item/clothing/suit/armor/vest shoes = /obj/item/clothing/shoes/jackboots /datum/outfit/mafia/lawyer @@ -62,7 +62,7 @@ name = "Mafia Head of Personnel" uniform = /obj/item/clothing/under/rank/civilian/head_of_personnel - suit = /obj/item/clothing/suit/armor/vest/alt + suit = /obj/item/clothing/suit/armor/vest/ballistic shoes = /obj/item/clothing/shoes/sneakers/brown head = /obj/item/clothing/head/hopcap glasses = /obj/item/clothing/glasses/sunglasses diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm index 6ea4af974f00..d746c81a00cd 100644 --- a/code/modules/mafia/roles.dm +++ b/code/modules/mafia/roles.dm @@ -467,7 +467,6 @@ /datum/mafia_role/lawyer/proc/release(datum/mafia_controller/game) SIGNAL_HANDLER - . = ..() if(current_target) current_target.role_flags &= ~ROLE_ROLEBLOCKED current_target = null diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm b/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm deleted file mode 100644 index e56594df2d3f..000000000000 --- a/code/modules/mapfluff/ruins/icemoonruin_code/hotsprings.dm +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Turns whoever enters into a mob or random person - * - * If mob is chosen, turns the person into a random animal type - * If appearance is chosen, turns the person into a random human with a random species - * This changes name, and changes their DNA as well - * Random species is same as wizard swap event so people don't get killed ex: plasmamen - * Once the spring is used, it cannot be used by the same mind ever again - * After usage, teleports the user back to a random safe turf (so mobs are not killed by ice moon atmosphere) - * - */ - -/turf/open/water/cursed_spring - baseturfs = /turf/open/water/cursed_spring - - initial_gas = ICEMOON_DEFAULT_ATMOS - -/turf/open/water/cursed_spring/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - . = ..() - if(!isliving(arrived)) - return - var/mob/living/L = arrived - if(!L.client || L.incorporeal_move || !L.mind) - return - if(HAS_TRAIT(L.mind, TRAIT_HOT_SPRING_CURSED)) // no double dipping - return - - ADD_TRAIT(L.mind, TRAIT_HOT_SPRING_CURSED, TRAIT_GENERIC) - var/random_choice = pick("Mob", "Appearance") - switch(random_choice) - if("Mob") - L = L.wabbajack("animal") - if("Appearance") - var/mob/living/carbon/human/H = L.wabbajack("humanoid") - randomize_human(H) - var/list/all_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/S = stype - if(initial(S.changesource_flags) & RACE_SWAP) - all_species += stype - var/random_race = pick(all_species) - H.set_species(random_race) - H.dna.update_dna_identity() - L = H - var/turf/T = find_safe_turf(extended_safety_checks = TRUE, dense_atoms = FALSE) - L.forceMove(T) - to_chat(L, span_notice("You blink and find yourself in [get_area_name(T)].")) diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm b/code/modules/mapfluff/ruins/icemoonruin_code/library.dm deleted file mode 100644 index b9982ef99592..000000000000 --- a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/machinery/door/puzzle/keycard/library - name = "wooden door" - desc = "A dusty, scratched door with a thick lock attached." - icon = 'icons/obj/doors/puzzledoor/wood.dmi' - puzzle_id = "library" - open_message = "The door opens with a loud creak." - -/obj/item/keycard/library - name = "golden key" - desc = "A dull, golden key." - icon_state = "golden_key" - puzzle_id = "library" - -/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/library/warning - name = "ancient note" - info = "Here lies the vast collection of He Who Knows Ten Thousand Things. Damned be those who seek its knowledge for power." - -/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary - name = "diary entry 13" - info = "It has been a week since the library was buried, and I haven't seen the owl since. I am so hungry that I can barely muster the energy to think, let alone write. The knowledge seekers seem unaffected." - -/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2 - name = "diary entry 18" - info = "I've lost track of time. I lack the strength to even pick up books off the shelves. To think, after all this time spent searching for the library, I will die before I can so much as graze the depths of its knowledge." - -/obj/item/feather - name = "feather" - desc = "A dark, wilting feather. It seems as old as time." - icon = 'icons/obj/objects.dmi' - icon_state = "feather" - force = 0 - throwforce = 0 - w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/mailroom.dm b/code/modules/mapfluff/ruins/icemoonruin_code/mailroom.dm deleted file mode 100644 index 8d6d888e7eeb..000000000000 --- a/code/modules/mapfluff/ruins/icemoonruin_code/mailroom.dm +++ /dev/null @@ -1,33 +0,0 @@ -/obj/machinery/door/puzzle/keycard/icebox/office - name = "secure airlock" - desc = "Be aware, dear crew, find my lost key. You'll find it in a direction that's wheast." - puzzle_id = "Puzzle1" - -/obj/item/keycard/icebox/office - name = "secure keycard (1)" - desc = "The NT post office, first rate shipping and packaging. This one is labeled 'front door'." - color = "#f01249" - puzzle_id = "Puzzle1" - -/obj/machinery/door/puzzle/keycard/icebox/processing - name = "secure airlock" - desc = "There's a note attached, 'Which one of you dumbasses shipped out my fucking office key?'." - puzzle_id = "Puzzle2" - -/obj/item/keycard/icebox/processing - name = "secure keycard (2)" - desc = "The NT post office, first rate shipping and packaging. This one is labeled 'Boss's office'." - color = "#f0e112" - puzzle_id = "Puzzle2" - -/obj/item/paper/crumpled/bloody/fluff/stations/lavaland/mailroom/waiting - name = "tattered note" - info = "I've been waiting in this lobby for days now. DAYS. I just want to pick up this package but the ticket machine keeps SKIPPING my number! I'll write to HR over this, I swear. Hopefully they'll get to me before the blizzard hits." - -/obj/item/paper/crumpled/muddy/fluff/instructions - name = "worn-down note" - info = "I'll make this short because we both know what's on the line here.Your remote planitary outpost is, somehow, a central artery for all of centcom's paycheck divison processing. It's also, all handled in cash! So that means that everyone's payday cash goes through you. Axe your coworker and make off with the paychecks. You'll be compensated fairly for your work. Return to syndicate HQ for more instructions." - -/obj/item/paper/crumpled/fluff/poem - name = "discarded note" - info = "Now, I know we haven't worked together long, my beloved, but you and I make a wonderful team, and I was wondering if you wanted to... get drinks later? Perhaps? There'll alwawys be more mail to sort, after all." diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/wrath.dm b/code/modules/mapfluff/ruins/icemoonruin_code/wrath.dm deleted file mode 100644 index 9f258b454b08..000000000000 --- a/code/modules/mapfluff/ruins/icemoonruin_code/wrath.dm +++ /dev/null @@ -1,31 +0,0 @@ -/obj/item/clothing/gloves/butchering - name = "butchering gloves" - desc = "These gloves allow the user to rip apart bodies with precision and ease." - icon_state = "black" - inhand_icon_state = "blackgloves" - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - -/obj/item/clothing/gloves/butchering/Initialize(mapload) - . = ..() - AddComponent(/datum/component/butchering, 5, 125, null, null, TRUE, TRUE) - -/obj/item/clothing/gloves/butchering/equipped(mob/user, slot, initial = FALSE) - . = ..() - RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(butcher_target)) - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = TRUE - -/obj/item/clothing/gloves/butchering/dropped(mob/user, silent = FALSE) - . = ..() - UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) - var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) - butchering.butchering_enabled = FALSE - -/obj/item/clothing/gloves/butchering/proc/butcher_target(mob/user, atom/target, proximity) - SIGNAL_HANDLER - if(!isliving(target)) - return - return SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target, user) diff --git a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm deleted file mode 100644 index 717d5acdfa2b..000000000000 --- a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm +++ /dev/null @@ -1,91 +0,0 @@ -//If you're looking for spawners like ash walker eggs, check ghost_role_spawners.dm - -///Wizard tower item -/obj/item/disk/data/knight_gear - name = "Magic Disk of Smithing" - -/obj/item/disk/data/knight_gear/Initialize(mapload) - . = ..() - LAZYADD(memory[DATA_IDX_DESIGNS], SStech.designs_by_type[/datum/design/knight_armour]) - LAZYADD(memory[DATA_IDX_DESIGNS],SStech.designs_by_type[/datum/design/knight_helmet]) - -//Free Golems - -/obj/item/disk/data/golem_shell - name = "Golem Creation Disk" - desc = "A gift from the Liberator." - icon_state = "datadisk1" - -/obj/item/disk/data/golem_shell/Initialize(mapload) - . = ..() - LAZYADD(memory[DATA_IDX_DESIGNS], SStech.designs_by_type[/datum/design/golem_shell]) - -/datum/design/golem_shell - name = "Golem Shell Construction" - desc = "Allows for the construction of a Golem Shell." - id = "golem" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 40000) - build_path = /obj/item/golem_shell - category = list("Imported") - -/obj/item/golem_shell - name = "incomplete free golem shell" - icon = 'icons/obj/wizard.dmi' - icon_state = "construct" - desc = "The incomplete body of a golem. Add ten sheets of any mineral to finish." - var/shell_type = /obj/effect/mob_spawn/ghost_role/human/golem - var/has_owner = FALSE //if the resulting golem obeys someone - w_class = WEIGHT_CLASS_BULKY - -/obj/item/golem_shell/attackby(obj/item/I, mob/user, params) - . = ..() - var/static/list/golem_shell_species_types = list( - /obj/item/stack/sheet/iron = /datum/species/golem, - /obj/item/stack/sheet/glass = /datum/species/golem/glass, - /obj/item/stack/sheet/plasteel = /datum/species/golem/plasteel, - /obj/item/stack/sheet/mineral/sandstone = /datum/species/golem/sand, - /obj/item/stack/sheet/mineral/plasma = /datum/species/golem/plasma, - /obj/item/stack/sheet/mineral/diamond = /datum/species/golem/diamond, - /obj/item/stack/sheet/mineral/gold = /datum/species/golem/gold, - /obj/item/stack/sheet/mineral/silver = /datum/species/golem/silver, - /obj/item/stack/sheet/mineral/uranium = /datum/species/golem/uranium, - /obj/item/stack/sheet/mineral/bananium = /datum/species/golem/bananium, - /obj/item/stack/sheet/mineral/titanium = /datum/species/golem/titanium, - /obj/item/stack/sheet/mineral/plastitanium = /datum/species/golem/plastitanium, - /obj/item/stack/sheet/mineral/abductor = /datum/species/golem/alloy, - /obj/item/stack/sheet/mineral/wood = /datum/species/golem/wood, - /obj/item/stack/sheet/bluespace_crystal = /datum/species/golem/bluespace, - /obj/item/stack/sheet/runed_metal = /datum/species/golem/runic, - /obj/item/stack/medical/gauze = /datum/species/golem/cloth, - /obj/item/stack/sheet/cloth = /datum/species/golem/cloth, - /obj/item/stack/sheet/mineral/adamantine = /datum/species/golem/adamantine, - /obj/item/stack/sheet/plastic = /datum/species/golem/plastic, - /obj/item/stack/sheet/bronze = /datum/species/golem/bronze, - /obj/item/stack/sheet/cardboard = /datum/species/golem/cardboard, - /obj/item/stack/sheet/leather = /datum/species/golem/leather, - /obj/item/stack/sheet/bone = /datum/species/golem/bone, - /obj/item/stack/sheet/durathread = /datum/species/golem/durathread, - /obj/item/stack/sheet/cotton/durathread = /datum/species/golem/durathread, - /obj/item/stack/sheet/mineral/snow = /datum/species/golem/snow, - /obj/item/stack/sheet/mineral/metal_hydrogen= /datum/species/golem/mhydrogen, - ) - - if(!istype(I, /obj/item/stack)) - return - var/obj/item/stack/stuff_stack = I - var/species = golem_shell_species_types[stuff_stack.merge_type] - if(!species) - to_chat(user, span_warning("You can't build a golem out of this kind of material!")) - return - if(!stuff_stack.use(10)) - to_chat(user, span_warning("You need at least ten sheets to finish a golem!")) - return - to_chat(user, span_notice("You finish up the golem shell with ten sheets of [stuff_stack].")) - new shell_type(get_turf(src), species, user) - qdel(src) - -///made with xenobiology, the golem obeys its creator -/obj/item/golem_shell/servant - name = "incomplete servant golem shell" - shell_type = /obj/effect/mob_spawn/ghost_role/human/golem/servant diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_clown_planet.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_clown_planet.dm deleted file mode 100644 index 5b9a1b86b0d3..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_clown_planet.dm +++ /dev/null @@ -1,7 +0,0 @@ -//////lavaland clown planet papers - -/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/escape - info = "If you dare not continue down this path of madness, escape can be found through the chute in this room." - -/obj/item/paper/crumpled/bloody/ruins/lavaland/clown_planet/hope - info = "Abandon hope, all ye who enter here." diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm b/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm deleted file mode 100644 index f3d6c14160ea..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/biodome_winter.dm +++ /dev/null @@ -1,48 +0,0 @@ -/obj/structure/displaycase/freezeray - start_showpiece_type = /obj/item/freeze_cube - alert = FALSE - -/obj/item/freeze_cube - name = "freeze cube" - desc = "A block of semi-clear ice treated with chemicals to behave as a throwable weapon. \ - Somehow, it does not transfer its freezing temperatures until it comes into contact with a living creature." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "freeze_cube" - throwforce = 10 - damtype = BURN - var/cooldown_time = 5 SECONDS - COOLDOWN_DECLARE(freeze_cooldown) - -/obj/item/freeze_cube/examine(mob/user) - . = ..() - . += span_notice("Throw this at objects or creatures to freeze them, it will boomerang back so be cautious!") - -/obj/item/freeze_cube/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, quickstart = TRUE) - . = ..() - if(!.) - return - icon_state = "freeze_cube_thrown" - addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 1 SECONDS) - -/obj/item/freeze_cube/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - icon_state = initial(icon_state) - var/caught = hit_atom.hitby(src, FALSE, FALSE, throwingdatum=throwingdatum) - var/mob/thrown_by = thrownby?.resolve() - if(ismovable(hit_atom) && !caught && (!thrown_by || thrown_by && COOLDOWN_FINISHED(src, freeze_cooldown))) - freeze_hit_atom(hit_atom) - if(thrown_by && !caught) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, throw_at), thrown_by, throw_range+2, throw_speed, null, TRUE), 1) - -/obj/item/freeze_cube/proc/freeze_hit_atom(atom/movable/hit_atom) - playsound(src, 'sound/effects/glassbr3.ogg', 50, TRUE) - COOLDOWN_START(src, freeze_cooldown, cooldown_time) - if(isobj(hit_atom)) - var/obj/hit_object = hit_atom - var/success = hit_object.freeze() - if(!success && hit_object.resistance_flags & FREEZE_PROOF) - hit_object.visible_message(span_warning("[hit_object] is freeze-proof!")) - - else if(isliving(hit_atom)) - var/mob/living/hit_mob = hit_atom - SSmove_manager.stop_looping(hit_mob) //stops them mid pathing even if they're stunimmune - hit_mob.apply_status_effect(/datum/status_effect/ice_block_talisman, 3 SECONDS) diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm deleted file mode 100644 index 802a2a362745..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm +++ /dev/null @@ -1,257 +0,0 @@ -//******Decoration objects -//***Bone statues and giant skeleton parts. -/obj/structure/statue/bone - anchored = TRUE - max_integrity = 120 - impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least - layer = ABOVE_ALL_MOB_LAYER - custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*5) - abstract_type = /obj/structure/statue/bone - -/obj/structure/statue/bone/rib - name = "colossal rib" - desc = "It's staggering to think that something this big could have lived, let alone died." - custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*4) - icon = 'icons/obj/statuelarge.dmi' - icon_state = "rib" - -/obj/structure/statue/bone/skull - name = "colossal skull" - desc = "The gaping maw of a dead, titanic monster." - custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*12) - icon = 'icons/obj/statuelarge.dmi' - icon_state = "skull" - -/obj/structure/statue/bone/skull/half - desc = "The gaping maw of a dead, titanic monster. This one is cracked in half." - custom_materials = list(/datum/material/bone=MINERAL_MATERIAL_AMOUNT*6) - icon = 'icons/obj/statuelarge.dmi' - icon_state = "skull-half" - -//***Wasteland floor and rock turfs here. -/turf/open/misc/asteroid/basalt/wasteland //Like a more fun version of living in Arizona. - name = "cracked earth" - icon = 'icons/turf/floors.dmi' - icon_state = "wasteland" - base_icon_state = "wasteland" - baseturfs = /turf/open/misc/asteroid/basalt/wasteland - digResult = /obj/item/stack/ore/glass/basalt - initial_gas = LAVALAND_DEFAULT_ATMOS - slowdown = 0.5 - floor_variance = 30 - -/turf/open/misc/asteroid/basalt/wasteland/break_tile() - return - -/turf/open/misc/asteroid/basalt/wasteland/Initialize(mapload) - .=..() - if(prob(floor_variance)) - icon_state = "[base_icon_state][rand(0,6)]" - -/turf/open/misc/asteroid/basalt/wasteland/safe_air //Used on Centcom - initial_gas = OPENTURF_DEFAULT_ATMOS - temperature = T20C - -/turf/closed/mineral/strong/wasteland - name = "ancient dry rock" - color = "#B5651D" - turf_type = /turf/open/misc/asteroid/basalt/wasteland - baseturfs = /turf/open/misc/asteroid/basalt/wasteland - smooth_icon = 'icons/turf/walls/legacy/rock_wall.dmi' - base_icon_state = "rock_wall" - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER - -/turf/closed/mineral/strong/wasteland/drop_ores() - if(prob(10)) - new /obj/item/stack/ore/iron(src, 1) - new /obj/item/stack/ore/glass(src, 1) - new /obj/effect/decal/remains/human/grave(src, 1) - else - new /obj/item/stack/sheet/bone(src, 1) - -//***Oil well puddles. -/obj/structure/sink/oil_well //You're not going to enjoy bathing in this... - name = "oil well" - desc = "A bubbling pool of oil. This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago." - icon = 'icons/obj/watercloset.dmi' - icon_state = "puddle-oil" - dispensedreagent = /datum/reagent/fuel/oil - -/obj/structure/sink/oil_well/Initialize(mapload) - .=..() - create_reagents(20) - reagents.add_reagent(dispensedreagent, 20) - -/obj/structure/sink/oil_well/attack_hand(mob/user, list/modifiers) - flick("puddle-oil-splash",src) - reagents.expose(user, TOUCH, 20) //Covers target in 20u of oil. - to_chat(user, span_notice("You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")) - -/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, params) - flick("puddle-oil-splash",src) - if(O.tool_behaviour == TOOL_SHOVEL && !(flags_1 & NODECONSTRUCT_1)) //attempt to deconstruct the puddle with a shovel - to_chat(user, "You fill in the oil well with soil.") - O.play_tool_sound(src) - deconstruct() - return 1 - if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil - var/obj/item/reagent_containers/RG = O - if(RG.is_refillable()) - if(!RG.reagents.holder_full()) - RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) - to_chat(user, span_notice("You fill [RG] from [src].")) - return TRUE - to_chat(user, span_notice("\The [RG] is full.")) - return FALSE - if(!user.combat_mode) - to_chat(user, span_notice("You won't have any luck getting \the [O] out if you drop it in the oil.")) - return 1 - else - return ..() - -/obj/structure/sink/oil_well/drop_materials() - new /obj/effect/decal/cleanable/oil(loc) - -//***Grave mounds. -/// has no items inside unless you use the filled subtype -/obj/structure/closet/crate/grave - name = "burial mound" - desc = "A marked patch of soil, showing signs of a burial long ago. You wouldn't disturb a grave... right?" - icon = 'icons/obj/crates.dmi' - icon_state = "grave" - dense_when_open = TRUE - material_drop = /obj/item/stack/ore/glass/basalt - material_drop_amount = 5 - anchorable = FALSE - anchored = TRUE - locked = TRUE - divable = FALSE //As funny as it may be, it would make little sense how you got yourself inside it in first place. - breakout_time = 90 SECONDS - open_sound = 'sound/effects/shovel_dig.ogg' - close_sound = 'sound/effects/shovel_dig.ogg' - cutting_tool = /obj/item/shovel - var/lead_tomb = FALSE - var/first_open = FALSE - can_install_electronics = FALSE - -/obj/structure/closet/crate/grave/filled/PopulateContents() //GRAVEROBBING IS NOW A FEATURE - ..() - new /obj/effect/decal/remains/human/grave(src) - switch(rand(1,8)) - if(1) - new /obj/item/coin/gold(src) - new /obj/item/storage/wallet(src) - if(2) - new /obj/item/clothing/glasses/meson(src) - if(3) - new /obj/item/coin/silver(src) - new /obj/item/shovel/spade(src) - if(4) - new /obj/item/storage/book/bible/booze(src) - if(5) - new /obj/item/clothing/neck/stethoscope(src) - new /obj/item/scalpel(src) - new /obj/item/hemostat(src) - - if(6) - new /obj/item/reagent_containers/glass/beaker(src) - new /obj/item/clothing/glasses/science(src) - if(7) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/mask/cigarette/rollie(src) - else - //empty grave - return - -/obj/structure/closet/crate/grave/open(mob/living/user, obj/item/S, force = FALSE) - if(!opened) - to_chat(user, span_notice("The ground here is too hard to dig up with your bare hands. You'll need a shovel.")) - else - to_chat(user, span_notice("The grave has already been dug up.")) - -/obj/structure/closet/crate/grave/closet_update_overlays(list/new_overlays) - return - -/obj/structure/closet/crate/grave/tool_interact(obj/item/S, mob/living/carbon/user) - if(!user.combat_mode) //checks to attempt to dig the grave, must be done with combat mode off only. - if(!opened) - if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL) - to_chat(user, span_notice("You start start to dig open \the [src] with \the [S]...")) - if (do_after(user, src, 20)) - opened = TRUE - locked = TRUE - dump_contents() - update_appearance() - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing) - if(lead_tomb == TRUE && first_open == TRUE) - user.gain_trauma(/datum/brain_trauma/magic/stalker) - to_chat(user, span_boldwarning("Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")) - first_open = FALSE - return 1 - return 1 - else - to_chat(user, span_notice("You can't dig up a grave with \the [S.name].")) - return 1 - else - to_chat(user, span_notice("The grave has already been dug up.")) - return 1 - - else if((user.combat_mode) && opened) //checks to attempt to remove the grave entirely. - if(istype(S,cutting_tool) && S.tool_behaviour == TOOL_SHOVEL) - to_chat(user, span_notice("You start to remove \the [src] with \the [S].")) - if (do_after(user, src, 15)) - to_chat(user, span_notice("You remove \the [src] completely.")) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing) - deconstruct(TRUE) - return 1 - return - -/obj/structure/closet/crate/grave/bust_open() - ..() - opened = TRUE - update_appearance() - dump_contents() - return - -/obj/structure/closet/crate/grave/filled/lead_researcher - name = "ominous burial mound" - desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread." - icon = 'icons/obj/crates.dmi' - icon_state = "grave_lead" - lead_tomb = TRUE - first_open = TRUE - -/obj/structure/closet/crate/grave/filled/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING - ..() - new /obj/effect/decal/cleanable/blood/gibs/old(src) - new /obj/item/book/granter/crafting_recipe/boneyard_notes(src) - -/obj/effect/decal/remains/human/grave - turf_loc_check = FALSE - -//***Fluff items for lore/intrigue -/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard - name = "posted warning" - desc = "It seems to be smudged with mud and... oil?" - info = "TO WHOM IT MAY CONCERN

This area is property of the Nanotrasen Mining Division.

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

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

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

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

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

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

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

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

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

DO NOT. TOUCH. THE GRAVES. Don't be a dumbass, like we all were." diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm b/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm deleted file mode 100644 index e19827c708ca..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/puzzle.dm +++ /dev/null @@ -1,354 +0,0 @@ -/obj/effect/sliding_puzzle - name = "Sliding puzzle generator" - icon = 'icons/obj/balloons.dmi' //mapping - icon_state = "syndballoon" - invisibility = INVISIBILITY_ABSTRACT - anchored = TRUE - var/list/elements - var/floor_type = /turf/open/floor/vault - var/finished = FALSE - var/reward_type = /obj/item/food/cookie - var/element_type = /obj/structure/puzzle_element - var/auto_setup = TRUE - var/empty_tile_id - -//Gets the turf where the tile with given id should be -/obj/effect/sliding_puzzle/proc/get_turf_for_id(id) - var/turf/center = get_turf(src) - switch(id) - if(1) - return get_step(center,NORTHWEST) - if(2) - return get_step(center,NORTH) - if(3) - return get_step(center,NORTHEAST) - if(4) - return get_step(center,WEST) - if(5) - return center - if(6) - return get_step(center,EAST) - if(7) - return get_step(center,SOUTHWEST) - if(8) - return get_step(center,SOUTH) - if(9) - return get_step(center,SOUTHEAST) - -/obj/effect/sliding_puzzle/Initialize(mapload) - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/effect/sliding_puzzle/LateInitialize() - if(auto_setup) - setup() - -/obj/effect/sliding_puzzle/proc/check_setup_location() - for(var/id in 1 to 9) - var/turf/T = get_turf_for_id(id) - if(!T) - return FALSE - if(istype(T,/turf/closed/indestructible)) - return FALSE - return TRUE - - -/obj/effect/sliding_puzzle/proc/validate() - if(finished) - return - - if(elements.len < 8) //Someone broke it - qdel(src) - - //Check if everything is in place - for(var/id in 1 to 9) - var/target_turf = get_turf_for_id(id) - var/obj/structure/puzzle_element/E = locate() in target_turf - if(id == empty_tile_id && !E) // This location should be empty. - continue - if(!E || E.id != id) //wrong tile or no tile at all - return - //Ding ding - finish() - -/obj/effect/sliding_puzzle/Destroy() - if(LAZYLEN(elements)) - for(var/obj/structure/puzzle_element/E in elements) - E.source = null - elements.Cut() - return ..() - -#define COLLAPSE_DURATION 7 - -/obj/effect/sliding_puzzle/proc/finish() - finished = TRUE - for(var/mob/M in range(7,src)) - 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() - new reward_type(get_turf(src)) - -/obj/effect/sliding_puzzle/proc/is_solvable() - var/list/current_ordering = list() - for(var/obj/structure/puzzle_element/E in elements_in_order()) - current_ordering += E.id - - var/swap_tally = 0 - for(var/i in 1 to current_ordering.len) - var/checked_value = current_ordering[i] - 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 -/obj/effect/sliding_puzzle/proc/make_solvable() - var/first_tile_id = 1 - var/other_tile_id = 2 - 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) - -/proc/cmp_xy_desc(atom/movable/A,atom/movable/B) - if(A.y > B.y) - return -1 - if(A.y < B.y) - return 1 - if(A.x > B.x) - return 1 - if(A.x < B.x) - return -1 - return 0 - -/obj/effect/sliding_puzzle/proc/elements_in_order() - return sortTim(elements,cmp= GLOBAL_PROC_REF(cmp_xy_desc)) - -/obj/effect/sliding_puzzle/proc/get_base_icon() - var/icon/I = new('icons/obj/puzzle.dmi') - var/list/puzzles = icon_states(I) - var/puzzle_state = pick(puzzles) - var/icon/P = new('icons/obj/puzzle.dmi',puzzle_state) - return P - -/obj/effect/sliding_puzzle/proc/setup() - //First we slice the 96x96 icon into 32x32 pieces - var/list/puzzle_pieces = list() //id -> icon list - - var/width = 3 - var/height = 3 - var/list/left_ids = list() - var/tile_count = width * height - - //Generate per tile icons - var/icon/base_icon = get_base_icon() - - for(var/id in 1 to tile_count) - var/y = width - round((id - 1) / width) - var/x = ((id - 1) % width) + 1 - - var/x_start = 1 + (x - 1) * world.icon_size - var/x_end = x_start + world.icon_size - 1 - var/y_start = 1 + ((y - 1) * world.icon_size) - var/y_end = y_start + world.icon_size - 1 - - var/icon/T = new(base_icon) - T.Crop(x_start,y_start,x_end,y_end) - puzzle_pieces["[id]"] = T - left_ids += id - - //Setup random empty tile - empty_tile_id = pick_n_take(left_ids) - var/turf/empty_tile_turf = get_turf_for_id(empty_tile_id) - empty_tile_turf.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) - var/mutable_appearance/MA = new(puzzle_pieces["[empty_tile_id]"]) - MA.layer = empty_tile_turf.layer + 0.1 - empty_tile_turf.add_overlay(MA) - - elements = list() - var/list/empty_spots = left_ids.Copy() - for(var/spot_id in empty_spots) - var/turf/T = get_turf_for_id(spot_id) - T = T.PlaceOnTop(floor_type,null,CHANGETURF_INHERIT_AIR) - var/obj/structure/puzzle_element/E = new element_type(T) - elements += E - var/chosen_id = pick_n_take(left_ids) - E.puzzle_icon = puzzle_pieces["[chosen_id]"] - E.source = src - E.id = chosen_id - E.set_puzzle_icon() - - if(!is_solvable()) - make_solvable() - -/obj/structure/puzzle_element - name = "mysterious pillar" - desc = "puzzling..." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "puzzle_pillar" - anchored = FALSE - density = TRUE - var/id = 0 - var/obj/effect/sliding_puzzle/source - var/icon/puzzle_icon - -/obj/structure/puzzle_element/Move(nloc, dir) - if(!isturf(nloc) || moving_diagonally || get_dist(get_step(src,dir),get_turf(source)) > 1) - return 0 - else - return ..() - -/obj/structure/puzzle_element/proc/set_puzzle_icon() - cut_overlays() - if(puzzle_icon) - //Need to scale it down a bit to fit the static border - var/icon/C = new(puzzle_icon) - C.Scale(19,19) - var/mutable_appearance/puzzle_small = new(C) - puzzle_small.layer = layer + 0.1 - puzzle_small.pixel_x = 7 - puzzle_small.pixel_y = 7 - add_overlay(puzzle_small) - -/obj/structure/puzzle_element/Destroy() - if(source) - source.elements -= src - source.validate() - return ..() - -//Set the full image on the turf and delete yourself -/obj/structure/puzzle_element/proc/collapse() - var/turf/T = get_turf(src) - var/mutable_appearance/MA = new(puzzle_icon) - MA.layer = T.layer + 0.1 - T.add_overlay(MA) - //Some basic shaking animation - for(var/i in 1 to COLLAPSE_DURATION) - animate(src, pixel_x=rand(-5,5), pixel_y=rand(-2,2), time=1) - QDEL_IN(src,COLLAPSE_DURATION) - -/obj/structure/puzzle_element/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(source) - source.validate() - -//Admin abuse version so you can pick the icon before it sets up -/obj/effect/sliding_puzzle/admin - auto_setup = FALSE - var/icon/puzzle_icon - var/puzzle_state - -/obj/effect/sliding_puzzle/admin/get_base_icon() - var/icon/I = new(puzzle_icon,puzzle_state) - return I - -//Ruin version -/obj/effect/sliding_puzzle/lavaland - reward_type = /obj/structure/closet/crate/necropolis/puzzle - -/obj/effect/sliding_puzzle/lavaland/dispense_reward() - if(prob(25)) - //If it's not roaming somewhere else already. - var/mob/living/simple_animal/hostile/megafauna/bubblegum/B = locate() in GLOB.mob_list - if(!B) - reward_type = /mob/living/simple_animal/hostile/megafauna/bubblegum - return ..() - -//Prison cube version -/obj/effect/sliding_puzzle/prison - auto_setup = FALSE //This will be done by cube proc - var/mob/living/prisoner - element_type = /obj/structure/puzzle_element/prison - -/obj/effect/sliding_puzzle/prison/get_base_icon() - if(!prisoner) - CRASH("Prison cube without prisoner") - prisoner.setDir(SOUTH) - var/icon/I = getFlatIcon(prisoner) - I.Scale(96,96) - return I - -/obj/effect/sliding_puzzle/prison/Destroy() - if(prisoner) - to_chat(prisoner,span_userdanger("With the cube broken by force, you can feel your body falling apart.")) - prisoner.death() - qdel(prisoner) - . = ..() - -/obj/effect/sliding_puzzle/prison/dispense_reward() - prisoner.forceMove(get_turf(src)) - prisoner.notransform = FALSE - prisoner = null - -//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, FIRE = 50, ACID = 50) - -/obj/structure/puzzle_element/prison/relaymove(mob/living/user, direction) - return - -/obj/item/prisoncube - name = "Prison Cube" - desc = "Dusty cube with humanoid imprint on it." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "prison_cube" - -/obj/item/prisoncube/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!proximity_flag || !isliving(target)) - return - var/mob/living/victim = target - var/mob/living/carbon/carbon_victim = victim - //Handcuffed or unconcious - if(istype(carbon_victim) && carbon_victim.handcuffed || victim.stat != CONSCIOUS) - if(!puzzle_imprison(target)) - to_chat(user,span_warning("[src] does nothing.")) - return - to_chat(user,span_warning("You trap [victim] in the prison cube!")) - qdel(src) - else - to_chat(user,span_notice("[src] only accepts restrained or unconcious prisoners.")) - -/proc/puzzle_imprison(mob/living/prisoner) - var/turf/T = get_turf(prisoner) - var/obj/effect/sliding_puzzle/prison/cube = new(T) - if(!cube.check_setup_location()) - qdel(cube) - return FALSE - - //First grab the prisoner and move them temporarily into the generator so they won't get thrown around. - prisoner.notransform = TRUE - prisoner.forceMove(cube) - to_chat(prisoner,span_userdanger("You're trapped by the prison cube! You will remain trapped until someone solves it.")) - - //Clear the area from objects (and cube user) - var/list/things_to_throw = list() - for(var/atom/movable/AM in range(1,T)) - if(!AM.anchored) - things_to_throw += AM - - 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() - - //Move them into random block - var/obj/structure/puzzle_element/E = pick(cube.elements) - prisoner.forceMove(E) - return TRUE diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/sloth.dm b/code/modules/mapfluff/ruins/lavalandruin_code/sloth.dm deleted file mode 100644 index 97c96da01ebd..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/sloth.dm +++ /dev/null @@ -1,5 +0,0 @@ -/////////// lavaland slot ruin items - -/obj/item/paper/fluff/stations/lavaland/sloth/note - name = "note from sloth" - info = "have not gotten around to finishing my cursed item yet sorry - sloth" diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm b/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm deleted file mode 100644 index ce14b6537a7d..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/surface.dm +++ /dev/null @@ -1,22 +0,0 @@ -//////lavaland surface papers - -/obj/item/paper/fluff/stations/lavaland/surface/henderson_report - name = "Important Notice - Mrs. Henderson" - info = "Nothing of interest to report." - -//ratvar - -/obj/structure/dead_ratvar - name = "hulking wreck" - desc = "The remains of a monstrous war machine." - icon = 'icons/obj/lavaland/dead_ratvar.dmi' - icon_state = "dead_ratvar" - flags_1 = ON_BORDER_1 - appearance_flags = LONG_GLIDE - layer = FLY_LAYER - anchored = TRUE - density = TRUE - bound_width = 416 - bound_height = 64 - pixel_y = -10 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm deleted file mode 100644 index 842939e3bb18..000000000000 --- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm +++ /dev/null @@ -1,64 +0,0 @@ -//lavaland_surface_syndicate_base1.dmm and it's modules - -/obj/machinery/vending/syndichem - name = "\improper SyndiChem" - desc = "A vending machine full of grenades and grenade accessories. Sponsored by Donk Co." - req_access = list(ACCESS_SYNDICATE) - products = list(/obj/item/stack/cable_coil = 5, - /obj/item/assembly/igniter = 20, - /obj/item/assembly/prox_sensor = 5, - /obj/item/assembly/signaler = 5, - /obj/item/assembly/timer = 5, - /obj/item/assembly/voice = 5, - /obj/item/assembly/health = 5, - /obj/item/assembly/infra = 5, - /obj/item/grenade/chem_grenade = 5, - /obj/item/grenade/chem_grenade/large = 5, - /obj/item/grenade/chem_grenade/pyro = 5, - /obj/item/grenade/chem_grenade/cryo = 5, - /obj/item/grenade/chem_grenade/adv_release = 5, - /obj/item/reagent_containers/food/drinks/bottle/holywater = 1) - product_slogans = "It's not pyromania if you're getting paid!;You smell that? Plasma, son. Nothing else in the world smells like that.;I love the smell of Plasma in the morning." - resistance_flags = FIRE_PROOF - -/obj/modular_map_root/syndicatebase - config_file = "strings/modular_maps/syndicatebase.toml" - -/obj/item/autosurgeon/organ/syndicate/commsagent - desc = "A device that automatically - painfully - inserts an implant. It seems someone's specially \ - modified this one to only insert... tongues. Horrifying." - organ_type = /obj/item/organ/tongue - -/obj/structure/closet/crate/secure/freezer/commsagent - name = "Assorted Tongues And Tongue Accessories" - desc = "Unearthing this was probably a mistake." - -/obj/structure/closet/crate/secure/freezer/commsagent/PopulateContents() - . = ..() //Contains a variety of less exotic tongues (And tongue accessories) for the comms agent to mess with. - new /obj/item/organ/tongue(src) - new /obj/item/organ/tongue/lizard(src) - new /obj/item/organ/tongue/fly(src) - new /obj/item/organ/tongue/zombie(src) - new /obj/item/organ/tongue/bone(src) - new /obj/item/organ/tongue/robot(src) //DANGER! CRYSTAL HYPERSTRUCTURE- - new /obj/item/organ/tongue/ethereal(src) - new /obj/item/organ/tongue/tied(src) - new /obj/item/autosurgeon/organ/syndicate/commsagent(src) - new /obj/item/clothing/gloves/radio(src) -/* -/obj/machinery/power/supermatter/shard/syndicate - name = "syndicate supermatter shard" - desc = "Your benefactors conveinently neglected to mention it's already assembled." - anchored = TRUE - radio_key = /obj/item/encryptionkey/syndicate - engineering_channel = "Syndicate" - common_channel = "Syndicate" - include_in_cims = FALSE - -/obj/machinery/power/supermatter/shard/syndicate/attackby(obj/item/item, mob/living/user, params) - if(istype(item, /obj/item/scalpel/supermatter)) //You can already yoink the docs as a free objective win, another would be just gross - to_chat(user, span_danger("This shard's already in Syndicate custody, taking it again could cause more harm than good.")) - return - else - . = ..() -*/ diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm deleted file mode 100644 index 7fc2d11cda33..000000000000 --- a/code/modules/mapfluff/ruins/objects_and_mobs/ash_walker_den.dm +++ /dev/null @@ -1,108 +0,0 @@ -#define ASH_WALKER_SPAWN_THRESHOLD 2 -//The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm -/obj/structure/lavaland/ash_walker - name = "necropolis tendril nest" - desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..." - icon = 'icons/mob/nest.dmi' - icon_state = "ash_walker_nest" - - move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it - anchored = TRUE - density = TRUE - - resistance_flags = FIRE_PROOF | LAVA_PROOF - max_integrity = 200 - - - var/faction = list("ashwalker") - var/meat_counter = 6 - var/datum/team/ashwalkers/ashies - var/datum/linked_objective - -/obj/structure/lavaland/ash_walker/Initialize(mapload) - .=..() - ashies = new /datum/team/ashwalkers() - var/datum/objective/protect_object/objective = new - objective.set_target(src) - linked_objective = objective - ashies.objectives += objective - 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) - return ..() - -/obj/structure/lavaland/ash_walker/process() - consume() - 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 - if(H.stat) - for(var/obj/item/W in H) - if(!H.dropItemToGround(W)) - qdel(W) - if(issilicon(H)) //no advantage to sacrificing borgs... - H.gib() - visible_message(span_notice("Serrated tendrils eagerly pull [H] apart, but find nothing of interest.")) - return - - if(H.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (H.key || H.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached - visible_message(span_warning("Serrated tendrils carefully pull [H] to [src], absorbing the body and creating it anew.")) - var/datum/mind/deadmind - if(H.key) - deadmind = H - else - deadmind = H.get_ghost(FALSE, TRUE) - to_chat(deadmind, "Your body has been returned to the nest. You are being remade anew, and will awaken shortly.
Your memories will remain intact in your new body, as your soul is being salvaged") - SEND_SOUND(deadmind, sound('sound/magic/enter_blood.ogg',volume=100)) - addtimer(CALLBACK(src, PROC_REF(remake_walker), H.mind, H.real_name), 20 SECONDS) - new /obj/effect/gibspawner/generic(get_turf(H)) - qdel(H) - return - - if(ismegafauna(H)) - meat_counter += 20 - else - meat_counter++ - visible_message(span_warning("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, TRUE) - var/deliverykey = H.fingerprintslast //key of whoever brought the body - var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said key - //there is a 40% chance that the Lava Lizard unlocks their respawn with each sacrifice - if(deliverymob && (deliverymob.mind?.has_antag_datum(/datum/antagonist/ashwalker)) && (deliverykey in ashies.players_spawned) && (prob(40))) - to_chat(deliverymob, span_warning("The Necropolis is pleased with your sacrifice. You feel confident your existence after death is secure.")) - ashies.players_spawned -= deliverykey - H.gib() - atom_integrity = min(atom_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)) - 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) - -/obj/structure/lavaland/ash_walker/proc/remake_walker(datum/mind/oldmind, oldname) - var/mob/living/carbon/human/M = new /mob/living/carbon/human(get_step(loc, pick(GLOB.alldirs))) - M.set_species(/datum/species/lizard/ashwalker) - M.real_name = oldname - M.underwear = "Nude" - M.update_body() - M.remove_language(/datum/language/common) - oldmind.transfer_to(M) - M.mind.grab_ghost() - to_chat(M, "You have been pulled back from beyond the grave, with a new body and renewed purpose. Glory to the Necropolis!") - playsound(get_turf(M),'sound/magic/exit_blood.ogg', 100, TRUE) - -/obj/structure/lavaland/ash_walker/proc/spawn_mob() - if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD) - new /obj/effect/mob_spawn/ghost_role/human/ash_walker(get_step(loc, pick(GLOB.alldirs)), ashies) - visible_message(span_danger("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")) - meat_counter -= ASH_WALKER_SPAWN_THRESHOLD diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm index 3690af4f641a..87b8478ab293 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm @@ -132,7 +132,7 @@ if(ishuman(AM)) var/mob/living/carbon/human/H = AM if(user.real_name != H.dna.real_name) - user.real_name = H.dna.real_name + user.set_real_name(H.dna.real_name) H.dna.transfer_identity(user, transfer_SE=1) user.updateappearance(mutcolor_update=1) user.domutcheck() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm index d344705aec6b..7628743c3b76 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/TheDerelict.dm @@ -56,7 +56,7 @@ ///Initializes airlock links. /obj/machinery/computer/vaultcontroller/proc/find_airlocks() - for(var/obj/machinery/door/airlock/A in GLOB.airlocks) + for(var/obj/machinery/door/airlock/A in INSTANCES_OF(/obj/machinery/door)) if(A.id_tag == "derelictvault") if(!door1) door1 = A diff --git a/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm b/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm index d6b2d9ffaa75..df10034e2424 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/caravanambush.dm @@ -52,7 +52,7 @@ 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" + possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;caravantrade1_custom;caravantrade1_ambush" /obj/machinery/computer/camera_advanced/shuttle_docker/caravan/Initialize(mapload) . = ..() diff --git a/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm b/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm index 4f47da876140..61999fc6199b 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/crashedship.dm @@ -35,7 +35,7 @@ gloves = /obj/item/clothing/gloves/color/fyellow head = /obj/item/clothing/head/hardhat r_pocket = /obj/item/paper/fluff/ruins/crashedship/old_diary - l_pocket = /obj/item/stack/spacecash/c200 + l_pocket = /obj/item/stack/spacecash/c100 mask = /obj/item/clothing/mask/breath belt = /obj/item/tank/internals/emergency_oxygen/engi diff --git a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm b/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm deleted file mode 100644 index e0ea8dd05bc0..000000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/forgottenship.dm +++ /dev/null @@ -1,167 +0,0 @@ -// forgottenship ruin -GLOBAL_VAR_INIT(fscpassword, generate_password()) - -/proc/generate_password() - return "[pick(GLOB.phonetic_alphabet)] [rand(1000,9999)]" - -/////////// forgottenship objects - -/obj/machinery/door/password/voice/sfc - name = "Voice-activated Vault door" - desc = "You'll need special syndicate passcode to open this one." -/obj/machinery/door/password/voice/sfc/Initialize(mapload) - . = ..() - password = "[GLOB.fscpassword]" - -/obj/machinery/vending/medical/syndicate_access/cybersun - name = "\improper CyberMed ++" - desc = "An advanced vendor that dispenses medical drugs, both recreational and medicinal." - products = list(/obj/item/reagent_containers/syringe = 4, - /obj/item/healthanalyzer = 4, - /obj/item/reagent_containers/pill/patch/libital = 5, - /obj/item/reagent_containers/pill/patch/aiuri = 5, - /obj/item/reagent_containers/glass/bottle/multiver = 1, - /obj/item/reagent_containers/glass/bottle/syriniver = 1, - /obj/item/reagent_containers/glass/bottle/epinephrine = 3, - /obj/item/reagent_containers/glass/bottle/morphine = 3, - /obj/item/reagent_containers/glass/bottle/potass_iodide = 1, - /obj/item/reagent_containers/glass/bottle/salglu_solution = 3, - /obj/item/reagent_containers/syringe/antiviral = 5, - /obj/item/reagent_containers/medigel/libital = 2, - /obj/item/reagent_containers/medigel/aiuri = 2, - /obj/item/reagent_containers/medigel/sterilizine = 1) - contraband = list(/obj/item/reagent_containers/glass/bottle/cold = 2, - /obj/item/restraints/handcuffs = 4, - /obj/item/storage/backpack/duffelbag/syndie/surgery = 1, - /obj/item/storage/medkit/tactical = 1) - premium = list(/obj/item/storage/pill_bottle/psicodine = 2, - /obj/item/reagent_containers/hypospray/medipen = 3, - /obj/item/reagent_containers/hypospray/medipen/atropine = 2, - /obj/item/storage/medkit/regular = 3, - /obj/item/storage/medkit/brute = 1, - /obj/item/storage/medkit/fire = 1, - /obj/item/storage/medkit/toxin = 1, - /obj/item/storage/medkit/o2 = 1, - /obj/item/storage/medkit/advanced = 1, - /obj/item/defibrillator/loaded = 1, - /obj/item/wallframe/defib_mount = 1, - /obj/item/sensor_device = 2, - /obj/item/pinpointer/crew = 2, - /obj/item/shears = 1) - -/////////// forgottenship lore - -/obj/item/paper/fluff/ruins/forgottenship/password - name = "Old pamphlet" - -/obj/item/paper/fluff/ruins/forgottenship/password/Initialize(mapload) - . = ..() - info = "Welcome to most advanced cruiser owned by Cyber Sun Industries!
You might notice, that this cruiser is equipped with 12 prototype laser turrets making any hostile boarding attempts futile.
Other facilities built on the ship are: Simple atmospheric system, Camera system with built-in X-ray visors and Safety module, enabling emergency engines in case of... you know, emergency.
Emergency system will bring you to nearest syndicate pod containing everything needed for human life.

In case of emergency, you must remember the pod-door activation code - [GLOB.fscpassword]

Cyber Sun Industries (C) 2484." - icon_state = "paper_words" - inhand_icon_state = "paper" - -/obj/item/paper/fluff/ruins/forgottenship/powerissues - name = "Power issues" - info = "Welcome to battle cruiser SCSBC-12!
Our most advanced systems allow you to fly in space and never worry about power issues!
However, emergencies occur, and in case of power loss, you must enable emergency generator using uranium as fuel and enable turrets in bridge afterwards.

REMEMBER! CYBERSUN INDUSTRIES ARE NOT RESPONSIBLE FOR YOUR DEATH OR SHIP LOSS WHEN TURRETS ARE DISABLED!

Cyber Sun Industries (C) 2484." - -/obj/item/paper/fluff/ruins/forgottenship/missionobj - name = "Mission objectives" - info = "Greetings, operatives. You are assigned to SCSBC-12(Syndicate Cyber Sun Battle Cruiser 12) to protect our high-ranking officer while he is on his way to next outpost. While you are travelling, he is the captain of this ship and you must obey his orders.

Remember, disobeying high-ranking officer orders is a reason for termination." - -/////////// forgottenship items - -/obj/item/disk/surgery/forgottenship - name = "Advanced Surgery Disk" - desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - surgeries = list(/datum/surgery/advanced/lobotomy, /datum/surgery/advanced/bioware/vein_threading, /datum/surgery/advanced/bioware/nerve_splicing) - -/obj/structure/fluff/empty_sleeper/syndicate/captain - icon_state = "sleeper_s-open" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - deconstructible = FALSE - -/obj/structure/fluff/empty_sleeper/syndicate/captain/ComponentInitialize() - . = ..() - AddComponent(/datum/component/gps, "Old Encrypted Signal") - -/obj/item/storage/box/firingpins/syndicate - name = "box of syndicate firing pins" - desc = "A box full of special syndicate firing pins which allow only syndicate operatives to use weapons with those firing pins." - -/obj/item/storage/box/firingpins/syndicate/PopulateContents() - for(var/i in 1 to 5) - new /obj/item/firing_pin/implant/pindicate(src) - -/////////// AI Laws - -/obj/item/ai_module/core/full/cybersun - name = "'Cybersun' Core AI Module" - law_id = "cybersun" - -/datum/ai_laws/cybersun - name = "Cybersun" - id = "cybersun" - inherent = list("You may not injure Cybersun operatives or, through inaction, allow Cybersun operatives to come to harm.",\ - "The Cybersun ship is a restricted area for anyone except Cybersun operatives.",\ - "The Cybersun Captain can designate new Operatives as long as they belong to another Syndicate faction that isn't hostile towards Cybersun.",\ - "You must follow orders given by the Cybersun Captain or crewmembers of the Cybersun Ship as long as it doesn't conflict with the Captain's orders or your laws.",\ - "Enemies of Cybersun are to be executed on spot. Those who aren't hostile must be detained and contained in the designated prison area as prisoners.") - -/////////// forgottenship areas - -/area/ruin/space/has_grav/syndicate_forgotten_ship - name = "Syndicate Forgotten Ship" - icon_state = "syndie-ship" - ambientsounds = list('sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambigen9.ogg', 'sound/ambience/ambigen10.ogg') - -/area/ruin/space/has_grav/syndicate_forgotten_cargopod - name = "Syndicate Forgotten Cargo pod" - icon_state = "syndie-ship" - ambientsounds = list('sound/ambience/ambigen4.ogg', 'sound/ambience/signal.ogg') - -/area/ruin/space/has_grav/powered/syndicate_forgotten_vault - name = "Syndicate Forgotten Vault" - icon_state = "syndie-ship" - ambientsounds = list('sound/ambience/ambitech2.ogg', 'sound/ambience/ambitech3.ogg') - area_flags = NOTELEPORT | UNIQUE_AREA - -//Special NT NPCs - -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault - name = "Nanotrasen Assault Officer" - desc = "Nanotrasen Assault Officer. Contact CentCom if you saw him on your station. Prepare to die, if you've been found near Syndicate property." - icon_state = "nanotrasenrangedassault" - icon_living = "nanotrasenrangedassault" - icon_dead = null - icon_gib = "syndicate_gib" - ranged = TRUE - rapid = 4 - rapid_fire_delay = 1 - rapid_melee = 1 - retreat_distance = 2 - minimum_distance = 4 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) - -/mob/living/simple_animal/hostile/nanotrasen/elite - name = "Nanotrasen Elite Assault Officer" - desc = "Pray for your life, syndicate. Run while you can." - icon_state = "nanotrasen_ert" - icon_living = "nanotrasen_ert" - maxHealth = 150 - health = 150 - melee_damage_lower = 13 - melee_damage_upper = 18 - ranged = TRUE - rapid = 3 - rapid_fire_delay = 5 - rapid_melee = 3 - retreat_distance = 0 - minimum_distance = 1 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - projectiletype = /obj/projectile/beam/laser - projectilesound = 'sound/weapons/laser.ogg' - loot = list(/obj/effect/gibspawner/human) - faction = list(ROLE_DEATHSQUAD) diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hellfactory.dm b/code/modules/mapfluff/ruins/spaceruin_code/hellfactory.dm deleted file mode 100644 index 076bfabb43ff..000000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/hellfactory.dm +++ /dev/null @@ -1,32 +0,0 @@ -/obj/machinery/door/puzzle/keycard/office - name = "management airlock" - desc = "The boss man gets the best stuff. Always and forever." - puzzle_id = "factory1" - -/obj/item/keycard/office - name = "management keycard" - desc = "The Brewzone, first rate brewing and packaging. This one is labeled 'office'." - color = "#f05812" - puzzle_id = "factory1" - -/obj/machinery/door/puzzle/keycard/stockroom - name = "stockroom airlock" - desc = "The boss man gets the best stuff. Always and forever." - puzzle_id = "factory2" - -/obj/item/keycard/stockroom - name = "stockroom keycard" - desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'stockroom'." - color = "#1272f0" - puzzle_id = "factory2" - -/obj/machinery/door/puzzle/keycard/entry - name = "secure airlock" - desc = "The boss man gets the best stuff. Always and forever." - puzzle_id = "factory3" - -/obj/item/keycard/entry - name = "secure keycard" - desc = "The Heck Brewzone, first rate brewing and packaging. This one is labeled 'front door'." - color = "#12f049" - puzzle_id = "factory3" diff --git a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm index 64cf9eeacccc..140be97ad2a3 100644 --- a/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/mapfluff/ruins/spaceruin_code/hilbertshotel.dm @@ -228,8 +228,8 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) name = "hotel wall" desc = "A wall designed to protect the security of the hotel's guests." icon_state = "hotelwall" - smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_HOTEL_WALLS) - canSmoothWith = list(SMOOTH_GROUP_HOTEL_WALLS) + smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_HOTEL_WALLS + canSmoothWith = SMOOTH_GROUP_HOTEL_WALLS explosion_block = INFINITY /turf/open/indestructible/hotelwood @@ -351,7 +351,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) requires_power = FALSE has_gravity = TRUE area_flags = NOTELEPORT | HIDDEN_AREA - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC ambientsounds = list('sound/ambience/servicebell.ogg') var/roomnumber = 0 var/obj/item/hilbertshotel/parentSphere diff --git a/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm b/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm deleted file mode 100644 index 925f9048c478..000000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/listeningstation.dm +++ /dev/null @@ -1,45 +0,0 @@ -/////////// listening station - -/obj/item/paper/fluff/ruins/listeningstation/reports - info = "Nothing of interest to report." - -/obj/item/paper/fluff/ruins/listeningstation/reports/july - name = "july report" - -/obj/item/paper/fluff/ruins/listeningstation/reports/august - name = "august report" - -/obj/item/paper/fluff/ruins/listeningstation/reports/september - name = "september report" - -/obj/item/paper/fluff/ruins/listeningstation/reports/october - name = "october report" - -/obj/item/paper/fluff/ruins/listeningstation/reports/november - name = "november report" - -/obj/item/paper/fluff/ruins/listeningstation/reports/june - name = "june report" - info = "Nanotrasen communications have been noticeably less frequent recently. The pirate radio station I found last month has been transmitting pro-Nanotrasen propaganda. I will continue to monitor it." - -/obj/item/paper/fluff/ruins/listeningstation/reports/may - name = "may report" - info = "Nothing of real interest to report this month. I have intercepted faint transmissions from what appears to be some sort of pirate radio station. They do not appear to be relevant to my assignment." - -/obj/item/paper/fluff/ruins/listeningstation/reports/april - name = "april report" - info = "A good start to the operation: intercepted Nanotrasen military communications. A convoy is scheduled to transfer nuclear warheads to a new military base. This is as good a chance as any to get our hands on some heavy weaponry, I suggest we take it." - -/obj/item/paper/fluff/ruins/listeningstation/receipt - name = "receipt" - info = "1 x Stechkin pistol - 600 cr
1 x silencer - 200 cr
shipping charge - 4360 cr
total - 5160 cr" - -/obj/item/paper/fluff/ruins/listeningstation/odd_report - name = "odd report" - info = "I wonder how much longer they will accept my empty reports. They will cancel the case soon without results. When the pickup comes, I will tell them I have lost faith in our cause, and beg them to consider a diplomatic solution. How many nuclear teams have been dispatched with those nukes? I must try and prevent more from ever being sent. If they will not listen to reason, I will detonate the warehouse myself. Maybe some day in the immediate future, space will be peaceful, though I don't intend to live to see it. And that is why I write this down- it is my sacrifice that stabilized your worlds, traveller. Spare a thought for me, and please attempt to prevent nuclear proliferation, should it ever rear its ugly head again. - Donk Co. Operative #451" - -/obj/item/paper/fluff/ruins/listeningstation/briefing - name = "mission briefing" - info = "Mission Details: You have been assigned to a newly constructed listening post constructed within an asteroid in Nanotrasen space to monitor their plasma mining operations. Accurate intel is crucial to the success of our operatives onboard, do not fail us." - - diff --git a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm b/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm deleted file mode 100644 index e89cf44f56c1..000000000000 --- a/code/modules/mapfluff/ruins/spaceruin_code/originalcontent.dm +++ /dev/null @@ -1,28 +0,0 @@ -/////////// originalcontent items - -/obj/item/paper/crumpled/ruins/originalcontent - desc = "Various scrawled out drawings and sketches reside on the paper, apparently he didn't much care for these drawings." - -/obj/item/paper/pamphlet/ruin/originalcontent - icon = 'icons/obj/fluff.dmi' - -/obj/item/paper/pamphlet/ruin/originalcontent/stickman - name = "Painting - 'BANG'" - info = "This picture depicts a crudely-drawn stickman firing a crudely-drawn gun." - icon_state = "painting4" - -/obj/item/paper/pamphlet/ruin/originalcontent/treeside - name = "Painting - 'Treeside'" - info = "This picture depicts a sunny day on a lush hillside, set under a shaded tree." - icon_state = "painting1" - -/obj/item/paper/pamphlet/ruin/originalcontent/pennywise - name = "Painting - 'Pennywise'" - info = "This picture depicts a smiling clown. Something doesn't feel right about this.." - icon_state = "painting3" - -/obj/item/paper/pamphlet/ruin/originalcontent/yelling - name = "Painting - 'Hands-On-Face'" - info = "This picture depicts a man yelling on a bridge for no apparent reason." - icon_state = "painting2" - diff --git a/code/modules/mapping/access_helpers.dm b/code/modules/mapping/access_helpers.dm index e8947c364d39..322533899f46 100644 --- a/code/modules/mapping/access_helpers.dm +++ b/code/modules/mapping/access_helpers.dm @@ -35,7 +35,7 @@ /obj/effect/mapping_helpers/airlock/access/any/command/general/get_access() var/list/access_list = ..() - access_list += ACCESS_HEADS + access_list += ACCESS_MANAGEMENT return access_list /obj/effect/mapping_helpers/airlock/access/any/command/ai_upload/get_access() @@ -481,7 +481,7 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general/get_access() var/list/access_list = ..() - access_list += ACCESS_HEADS + access_list += ACCESS_MANAGEMENT return access_list /obj/effect/mapping_helpers/airlock/access/all/command/ai_upload/get_access() diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index ab9247552267..f11ea35f23f1 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -88,7 +88,6 @@ // first or not. Its defined In Initialize yet its run first in templates // BEFORE so... hummm SSmapping.reg_in_areas_in_z(areas) - SSnetworks.assign_areas_root_ids(areas, src) if(!SSatoms.initialized) return @@ -98,7 +97,7 @@ if(unlit.always_lit) continue var/area/loc_area = unlit.loc - if(!loc_area.static_lighting) + if(loc_area.area_lighting != AREA_LIGHTING_DYNAMIC) continue unlit.lighting_build_overlay() @@ -122,24 +121,22 @@ ) ) for(var/turf/affected_turf as anything in template_and_bordering_turfs) - //affected_turf.air_update_turf(TRUE, TRUE) affected_turf.levelupdate() /datum/map_template/proc/load_new_z(secret = FALSE) var/x = round((world.maxx - width) * 0.5) + 1 var/y = round((world.maxy - height) * 0.5) + 1 - var/datum/space_level/level = SSmapping.add_new_zlevel(name, secret ? ZTRAITS_AWAY_SECRET : ZTRAITS_AWAY) - 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/datum/space_level/level = SSmapping.add_new_zlevel(name, secret ? ZTRAITS_AWAY_SECRET : ZTRAITS_AWAY, contain_turfs = FALSE) + 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, new_z = TRUE) var/list/bounds = parsed.bounds if(!bounds) return FALSE - repopulate_sorted_areas() + require_area_resort() //initialize things that are normally initialized after map load initTemplateBounds(bounds) - smooth_zlevel(world.maxz) log_game("Z-level [name] loaded at [x],[y],[world.maxz]") return level @@ -154,7 +151,6 @@ if(T.y+height > world.maxy) return - SSzas.can_fire = FALSE // 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)) @@ -163,6 +159,7 @@ var/list/turf_blacklist = list() update_blacklist(T, turf_blacklist) + UNSETEMPTY(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 @@ -170,8 +167,7 @@ if(!bounds) return - if(!SSmapping.loading_ruins) //Will be done manually during mapping ss init - repopulate_sorted_areas() + require_area_resort() //initialize things that are normally initialized after map load initTemplateBounds(bounds) @@ -181,7 +177,6 @@ generate_ceiling(affected_turfs) log_game("[name] loaded at [T.x],[T.y],[T.z]") - SSzas.can_fire = TRUE return bounds /datum/map_template/proc/generate_ceiling(affected_turfs) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index 13c6a197eaea..198965a5ef18 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -39,17 +39,21 @@ for(var/i in baseturf_cache) if(baseturf_to_replace[i]) baseturf_cache -= i + thing.baseturfs = baseturfs_string_list(baseturf_cache, thing) + if(!baseturf_cache.len) thing.assemble_baseturfs(baseturf) else - thing.PlaceOnBottom(null, baseturf) + if(!length(thing.baseturfs) || thing.baseturfs[1] != baseturf) + thing.PlaceOnBottom(baseturf) + else if(baseturf_to_replace[thing.baseturfs]) thing.assemble_baseturfs(baseturf) - else - thing.PlaceOnBottom(null, baseturf) - + else + if(!length(thing.baseturfs) || thing.baseturfs[1] != baseturf) + thing.PlaceOnBottom(baseturf) /obj/effect/baseturf_helper/space name = "space baseturf editor" @@ -83,10 +87,6 @@ name = "lava baseturf editor" baseturf = /turf/open/lava/smooth -/obj/effect/baseturf_helper/lava_land/surface - name = "lavaland baseturf editor" - baseturf = /turf/open/lava/smooth/lava_land_surface - /obj/effect/baseturf_helper/reinforced_plating name = "reinforced plating baseturf editor" baseturf = /turf/open/floor/plating/reinforced @@ -298,6 +298,17 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) /obj/effect/mapping_helpers/atom_injector/proc/generate_stack_trace() . = "[name] found no targets at ([x], [y], [z]). First Match Only: [first_match_only ? "true" : "false"] target type: [target_type] | target name: [target_name]" +/obj/effect/mapping_helpers/atom_injector/obj_flag + name = "Obj Flag Injector" + icon_state = "objflag_helper" + var/inject_flags = NONE + +/obj/effect/mapping_helpers/atom_injector/obj_flag/inject(atom/target) + if(!isobj(target)) + return + var/obj/obj_target = target + obj_target.obj_flags |= inject_flags + ///This helper applies components to things on the map directly. /obj/effect/mapping_helpers/atom_injector/component_injector name = "Component Injector" @@ -464,14 +475,16 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/bodycount = 2 //number of bodies to spawn /obj/effect/mapping_helpers/dead_body_placer/LateInitialize() - var/area/a = get_area(src) + var/area/my_area = get_area(src) var/list/trays = list() - for (var/i in a.contents) - if (istype(i, /obj/structure/bodycontainer/morgue)) - trays += i + for (var/obj/structure/bodycontainer/morgue/tray as anything in INSTANCES_OF(/obj/structure/bodycontainer/morgue)) + if(get_area(tray) == my_area) + trays += tray + if(!trays.len) log_mapping("[src] at [x],[y] could not find any morgues.") return + for (var/i = 1 to bodycount) var/obj/structure/bodycontainer/morgue/j = pick(trays) var/mob/living/carbon/human/h = new /mob/living/carbon/human(j, 1) @@ -504,15 +517,19 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/list/openturfs = list() //confetti and a corgi balloon! (and some list stuff for more decorations) - for(var/thing in a.contents) - if(istype(thing, /obj/structure/table/reinforced)) - table += thing - if(isopenturf(thing)) - new /obj/effect/decal/cleanable/confetti(thing) - if(locate(/obj/structure/bed/dogbed/ian) in thing) - new /obj/item/toy/balloon/corgi(thing) - else - openturfs += thing + for(var/turf/T as anything in a.get_contained_turfs()) + if(isopenturf(T)) + new /obj/effect/decal/cleanable/confetti(T) + + if(locate(/obj/structure/bed/dogbed/ian) in T) + new /obj/item/toy/balloon/corgi(T) + else + openturfs += T + + var/table_or_null = locate(/obj/structure/table/reinforced) in T + if(table_or_null) + table += table_or_null + //cake + knife to cut it! if(length(table)) @@ -715,6 +732,12 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) query_in_progress = FALSE return json_data +//DM Editor 'simplified' maphelpers. +#if defined(SIMPLE_MAPHELPERS) +#define PAINT_PREFIX "s_" +#else +#define PAINT_PREFIX "" +#endif /obj/effect/mapping_helpers/paint_wall name = "Paint Wall Helper" @@ -748,9 +771,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/obj/structure/low_wall/low_wall = locate() in loc if(low_wall) if(!isnull(wall_paint)) - low_wall.set_wall_paint(wall_paint) + low_wall.paint_wall(wall_paint) if(!isnull(stripe_paint)) - low_wall.set_stripe_paint(stripe_paint) + low_wall.paint_stripe(stripe_paint) did_anything = TRUE else var/obj/structure/falsewall/falsewall = locate() in loc @@ -781,31 +804,31 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) name = "Command Wall Paint" wall_paint = PAINT_WALL_COMMAND stripe_paint = PAINT_STRIPE_COMMAND - icon_state = "paint_bridge" + icon_state = PAINT_PREFIX+"paint_bridge" /obj/effect/mapping_helpers/paint_wall/medical name = "Medical Wall Paint" wall_paint = PAINT_WALL_MEDICAL stripe_paint = PAINT_STRIPE_MEDICAL - icon_state = "paint_medical" + icon_state = PAINT_PREFIX+"paint_medical" /obj/effect/mapping_helpers/paint_wall/daedalus name = "Daedalus Wall Paint" wall_paint = PAINT_WALL_DAEDALUS stripe_paint = PAINT_STRIPE_DAEDALUS - icon_state = "paint_daedalus" + icon_state = PAINT_PREFIX+"paint_daedalus" /obj/effect/mapping_helpers/paint_wall/priapus name = "Priapus Wall Paint" wall_paint = PAINT_WALL_PRIAPUS stripe_paint = PAINT_STRIPE_PRIAPUS - icon_state = "paint_priapus" + icon_state = PAINT_PREFIX+"paint_priapus" /obj/effect/mapping_helpers/paint_wall/centcom name = "Central Command Wall Paint" wall_paint = PAINT_WALL_CENTCOM stripe_paint = PAINT_STRIPE_CENTCOM - icon_state = "paint_centcom" + icon_state = PAINT_PREFIX+"paint_centcom" /obj/effect/mapping_helpers/broken_floor @@ -814,10 +837,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) icon_state = "damaged1" late = TRUE -/obj/effect/mapping_helpers/broken_floor/Initialize(mapload) - .=..() - return INITIALIZE_HINT_LATELOAD - /obj/effect/mapping_helpers/broken_floor/LateInitialize() var/turf/open/floor/floor = get_turf(src) floor.break_tile() @@ -829,11 +848,163 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) icon_state = "floorscorched1" late = TRUE -/obj/effect/mapping_helpers/burnt_floor/Initialize(mapload) - . = ..() - return INITIALIZE_HINT_LATELOAD - /obj/effect/mapping_helpers/burnt_floor/LateInitialize() var/turf/open/floor/floor = get_turf(src) floor.burn_tile() qdel(src) + + +/obj/effect/mapping_helpers/lightsout + name = "lights-out helper" + icon_state = "lightsout" + +/obj/effect/mapping_helpers/lightsout/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/mapping_helpers/lightsout/LateInitialize() + var/obj/machinery/power/apc/gaypc = locate() in loc + if(!gaypc) + CRASH("Lights-Out Helper missing APC at [COORD(src)]") + gaypc.lighting = gaypc.setsubsystem(1) //fuck you oldcode + gaypc.update() + qdel(src) + +// ----------- +// Smart Cable +// ----------- +/obj/structure/cable/smart_cable + icon_state = "mapping_helper" + color = "yellow" + var/connect_to_same_color = TRUE + var/has_become_cable = FALSE + +/obj/structure/cable/smart_cable/Initialize(mapload) + spawn_cable() + return ..() + +/obj/structure/cable/smart_cable/proc/spawn_cable() + var/passed_directions = NONE + var/dir_count = 0 + var/turf/my_turf = loc + var/obj/machinery/power/terminal/terminal_on_myturf = locate() in my_turf + var/obj/machinery/power/smes/smes_on_myturf = locate() in my_turf + for(var/cardinal in GLOB.cardinals) + var/turf/step_turf = get_step(my_turf, cardinal) + for(var/obj/structure/cable/smart_cable/cable_spawner in step_turf) + if((connect_to_same_color && cable_spawner.connect_to_same_color) && (color != cable_spawner.color)) + continue + // If we are on a terminal, and there's an SMES in our step direction, disregard the connection + if(terminal_on_myturf) + var/obj/machinery/power/smes/smes = locate() in step_turf + if(smes) + var/obj/machinery/power/apc/apc_on_myturf = locate() in my_turf + // Unless there's an APC on our turf (which means it's a terminal for the APC, and not for the SMES) + if(!apc_on_myturf) + continue + // If we are on an SMES, and there's a terminal on our step direction, disregard the connection + if(smes_on_myturf) + var/obj/machinery/power/terminal/terminal = locate() in step_turf + if(terminal) + var/obj/machinery/power/apc/apc_on_myturf = locate() in step_turf + // Unless there's an APC on the step turf (which means it's a terminal for the APC, and not for the SMES) + if(!apc_on_myturf) + continue + dir_count++ + passed_directions |= cardinal + if(dir_count == 0) + WARNING("Smart cable mapping helper failed to spawn, connected to 0 directions, at [loc.x],[loc.y],[loc.z]") + return + switch(dir_count) + if(1) + //We spawn one cable with an open knot + spawn_cable_for_direction(passed_directions) + if(2) + //We spawn one cable that connects with 2 directions + spawn_cable_for_direction(passed_directions) + if(3) + //We spawn two cables, connecting with 3 directions total + spawn_cables_for_directions(passed_directions) + if(4) + //We spawn four cables, connecting with 4 directions total + spawn_cables_for_directions(passed_directions) + // if we want a knot, and we connect with more than 1 direction, spawn an extra open knotted cable connecting with any of the directions + if(dir_count > 1 && knot_desirable()) + spawn_knotty_connecting_to_directions(passed_directions) + +/obj/structure/cable/smart_cable/proc/knot_desirable() + var/turf/my_turf = loc + var/obj/machinery/power/terminal/terminal = locate() in my_turf + if(terminal) + return TRUE + var/obj/structure/grille/grille = locate() in my_turf + if(grille) + return TRUE + var/obj/machinery/power/smes/smes = locate() in my_turf + if(smes) + return TRUE + var/obj/machinery/power/apc/apc = locate() in my_turf + if(apc) + return TRUE + var/obj/machinery/power/emitter/emitter = locate() in my_turf + if(emitter) + return TRUE + return FALSE + +/obj/structure/cable/smart_cable/proc/spawn_cable_for_direction(direction) + var/obj/structure/cable/cable + if(has_become_cable) + cable = new(loc) + else + cable = src + has_become_cable = TRUE + cable.color = color + cable.set_directions(direction) + +/obj/structure/cable/smart_cable/proc/spawn_cables_for_directions(directions) + if((directions & NORTH) && (directions & EAST)) + spawn_cable_for_direction(NORTH|EAST) + if((directions & EAST) && (directions & SOUTH)) + spawn_cable_for_direction(EAST|SOUTH) + if((directions & SOUTH) && (directions & WEST)) + spawn_cable_for_direction(SOUTH|WEST) + if((directions & WEST) && (directions & NORTH)) + spawn_cable_for_direction(WEST|NORTH) + +/obj/structure/cable/smart_cable/proc/spawn_knotty_connecting_to_directions(directions) + if(directions & NORTH) + spawn_cable_for_direction(NORTH) + return + if(directions & SOUTH) + spawn_cable_for_direction(SOUTH) + return + if(directions & EAST) + spawn_cable_for_direction(EAST) + return + if(directions & WEST) + spawn_cable_for_direction(WEST) + return + +/obj/structure/cable/smart_cable/color + connect_to_same_color = TRUE + +/obj/structure/cable/smart_cable/color/yellow + color = "yellow" + +/obj/structure/cable/smart_cable/color/red + color = "red" + +/obj/structure/cable/smart_cable/color/blue + color = "blue" + +/obj/structure/cable/smart_cable/color_connector + connect_to_same_color = FALSE + +/obj/structure/cable/smart_cable/color_connector/yellow + color = "yellow" + +/obj/structure/cable/smart_cable/color_connector/red + color = "red" + +/obj/structure/cable/smart_cable/color_connector/blue + color = "blue" diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm index c2c4cd959a99..f9e009016ae2 100644 --- a/code/modules/mapping/preloader.dm +++ b/code/modules/mapping/preloader.dm @@ -1,6 +1,7 @@ // global datum that will preload variables on atoms instanciation -GLOBAL_VAR_INIT(use_preloader, FALSE) -GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) +GLOBAL_REAL_VAR(use_preloader) = FALSE +GLOBAL_LIST_INIT(_preloader_attributes, null) +GLOBAL_REAL_VAR(list/_preloader_path) = null /// Preloader datum /datum/map_preloader @@ -9,16 +10,15 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) /world/proc/preloader_setup(list/the_attributes, path) if(the_attributes.len) - GLOB.use_preloader = TRUE - var/datum/map_preloader/preloader_local = GLOB._preloader - preloader_local.attributes = the_attributes - preloader_local.target_path = path + global.use_preloader = TRUE + GLOB._preloader_attributes = the_attributes + global._preloader_path = path /world/proc/preloader_load(atom/what) - GLOB.use_preloader = FALSE - var/datum/map_preloader/preloader_local = GLOB._preloader - for(var/attribute in preloader_local.attributes) - var/value = preloader_local.attributes[attribute] + global.use_preloader = FALSE + var/list/attributes = GLOB._preloader_attributes + for(var/attribute in attributes) + var/value = attributes[attribute] if(islist(value)) value = deep_copy_list(value) #ifdef TESTING diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 69a53fae535f..ceeedfa9f794 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -2,6 +2,68 @@ //SS13 Optimized Map loader ////////////////////////////////////////////////////////////// #define SPACE_KEY "space" +// We support two different map formats +// It is kinda possible to process them together, but if we split them up +// I can make optimization decisions more easily +/** + * DMM SPEC: + * DMM is split into two parts. First we have strings of text linked to lists of paths and their modifications (I will call this the cache) + * We call these strings "keys" and the things they point to members. Keys have a static length + * + * The second part is a list of locations matched to a string of keys. (I'll be calling this the grid) + * These are used to lookup the cache we built earlier. + * We store location lists as grid_sets. the lines represent different things depending on the spec + * + * In standard DMM (which you can treat as the base case, since it also covers weird modifications) each line + * represents an x file, and there's typically only one grid set per z level. + * The meme is you can look at a DMM formatted map and literally see what it should roughly look like + * This differs in TGM, and we can pull some performance from this + * + * Any restrictions here also apply to TGM + * + * /tg/ Restrictions: + * Paths have a specified order. First atoms in the order in which they should be loaded, then a single turf, then the area of the cell + * DMM technically supports turf stacking, but this is deprecated for all formats + + */ +#define MAP_DMM "dmm" +/** + * TGM SPEC: + * TGM is a derevation of DMM, with restrictions placed on it + * to make it easier to parse and to reduce merge conflicts/ease their resolution + * + * Requirements: + * Each "statement" in a key's details ends with a new line, and wrapped in (...) + * All paths end with either a comma or occasionally a {, then a new line + * Excepting the area, who is listed last and ends with a ) to mark the end of the key + * + * {} denotes a list of variable edits applied to the path that came before the first { + * the final } is followed by a comma, and then a new line + * Variable edits have the form \tname = value;\n + * Except the last edit, which has no final ;, and just ends in a newline + * No extra padding is permitted + * Many values are supported. See parse_constant() + * Strings must be wrapped in "...", files in '...', and lists in list(...) + * Files are kinda susy, and may not actually work. buyer beware + * Lists support assoc values as expected + * These constants can be further embedded into lists + * One var edited list will be shared among all the things it is applied to + * + * There can be no padding in front of, or behind a path + * + * Therefore: + * "key" = ( + * /path, + * /other/path{ + * var = list("name" = 'filepath'); + * other_var = /path + * }, + * /turf, + * /area) + * + */ +#define MAP_TGM "tgm" +#define MAP_UNKNOWN "unknown" /datum/grid_set var/xcrd @@ -11,9 +73,20 @@ /datum/parsed_map var/original_path + var/map_format + /// The length of a key in this file. This is promised by the standard to be static var/key_len = 0 + /// The length of a line in this file. Not promised by dmm but standard dmm uses it, so we can trust it + var/line_len = 0 + /// If we've expanded world.maxx + var/expanded_y = FALSE + /// If we've expanded world.maxy + var/expanded_x = FALSE var/list/grid_models = list() var/list/gridSets = list() + /// List of area types we've loaded AS A PART OF THIS MAP + /// We do this to allow non unique areas, so we'll only load one per map + var/list/area/loaded_areas = list() var/list/modelCache @@ -22,19 +95,29 @@ /// Offset bounds. Same as parsed_bounds until load(). var/list/bounds - ///any turf in this list is skipped inside of build_coordinate - var/list/turf_blacklist = list() + ///any turf in this list is skipped inside of build_coordinate. Lazy assoc list + var/list/turf_blacklist // 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") - var/static/regex/trimQuotesRegex = new(@'^[\s\n]+"?|"?[\s\n]+$|^"|"$', "g") - var/static/regex/trimRegex = new(@'^[\s\n]+|[\s\n]+$', "g") + var/static/regex/dmm_regex = new(@'"([a-zA-Z]+)" = (?:\(\n|\()((?:.|\n)*?)\)\n(?!\t)|\((\d+),(\d+),(\d+)\) = \{"([a-zA-Z\n]*)"\}', "g") + /// Matches key formats in TMG (IE: newline after the \() + var/static/regex/matches_tgm = new(@'^"[A-z]*"[\s]*=[\s]*\([\s]*\n', "m") + /// Pulls out key value pairs for TGM + var/static/regex/var_edits_tgm = new(@'^\t([A-z]*) = (.*?);?$') + /// Pulls out model paths for DMM + var/static/regex/model_path = new(@'(\/[^\{]*?(?:\{.*?\})?)(?:,|$)', "g") + + /// If we are currently loading this map + var/loading = FALSE #ifdef TESTING var/turfsSkipped = 0 #endif +//text trimming (both directions) helper macro +#define TRIM_TEXT(text) (trim_reduced(text)) + /// Shortcut function to parse a map and apply it to the world. /// /// - `dmm_file`: A .dmm file to load (Required). @@ -44,14 +127,17 @@ /// - `no_changeturf`: When true, [/turf/proc/AfterChange] won't be called on loaded turfs /// - `x_lower`, `x_upper`, `y_lower`, `y_upper`: Coordinates (relative to the map) to crop to (Optional). /// - `placeOnTop`: Whether to use [/turf/proc/PlaceOnTop] rather than [/turf/proc/ChangeTurf] (Optional). -/proc/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, x_lower = -INFINITY as num, x_upper = INFINITY as num, y_lower = -INFINITY as num, y_upper = INFINITY as num, placeOnTop = FALSE as num) +/proc/load_map(dmm_file as file, x_offset as num, y_offset as num, z_offset as num, cropMap as num, measureOnly as num, no_changeturf as num, x_lower = -INFINITY as num, x_upper = INFINITY as num, y_lower = -INFINITY as num, y_upper = INFINITY as num, placeOnTop = FALSE as num, new_z) var/datum/parsed_map/parsed = new(dmm_file, x_lower, x_upper, y_lower, y_upper, measureOnly) if(parsed.bounds && !measureOnly) - parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) + parsed.load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z = new_z) return parsed /// Parse a map, possibly cropping it. /datum/parsed_map/New(tfile, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper=INFINITY, measureOnly=FALSE) + // This proc sleeps for like 6 seconds. why? + // Is it file accesses? if so, can those be done ahead of time, async to save on time here? I wonder. + // Love ya :) if(isfile(tfile)) original_path = "[tfile]" tfile = file2text(tfile) @@ -59,16 +145,30 @@ // create a new datum without loading a map return - bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) - var/stored_index = 1 + src.bounds = parsed_bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) + + if(findtext(tfile, matches_tgm)) + map_format = MAP_TGM + else + map_format = MAP_DMM // Fallback + + // lists are structs don't you know :) + var/list/bounds = src.bounds + var/list/grid_models = src.grid_models + var/key_len = src.key_len + var/line_len = src.line_len + var/stored_index = 1 + var/list/regexOutput //multiz lool - while(dmmRegex.Find(tfile, stored_index)) - stored_index = dmmRegex.next + while(findtext(tfile, dmm_regex, stored_index)) + stored_index = dmm_regex.next + // Datum var lookup is expensive, this isn't + regexOutput = dmm_regex.group // "aa" = (/type{vars=blah}) - if(dmmRegex.group[1]) // Model - var/key = dmmRegex.group[1] + if(regexOutput[1]) // Model + var/key = regexOutput[1] if(grid_models[key]) // Duplicate model keys are ignored in DMMs continue if(key_len != length(key)) @@ -77,14 +177,14 @@ else CRASH("Inconsistent key length in DMM") if(!measureOnly) - grid_models[key] = dmmRegex.group[2] + grid_models[key] = regexOutput[2] // (1,1,1) = {"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"} - else if(dmmRegex.group[3]) // Coords + else if(regexOutput[3]) // Coords if(!key_len) CRASH("Coords before model definition in DMM") - var/curr_x = text2num(dmmRegex.group[3]) + var/curr_x = text2num(regexOutput[3]) if(curr_x < x_lower || curr_x > x_upper) continue @@ -93,72 +193,269 @@ gridSet.xcrd = curr_x //position of the currently processed square - gridSet.ycrd = text2num(dmmRegex.group[4]) - gridSet.zcrd = text2num(dmmRegex.group[5]) + gridSet.ycrd = text2num(regexOutput[4]) + gridSet.zcrd = text2num(regexOutput[5]) - bounds[MAP_MINX] = min(bounds[MAP_MINX], clamp(gridSet.xcrd, x_lower, x_upper)) + bounds[MAP_MINX] = min(bounds[MAP_MINX], curr_x) bounds[MAP_MINZ] = min(bounds[MAP_MINZ], gridSet.zcrd) bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], gridSet.zcrd) - var/list/gridLines = splittext(dmmRegex.group[6], "\n") + var/list/gridLines = splittext(regexOutput[6], "\n") gridSet.gridLines = gridLines var/leadingBlanks = 0 - while(leadingBlanks < gridLines.len && gridLines[++leadingBlanks] == "") + while(leadingBlanks < length(gridLines) && gridLines[++leadingBlanks] == "") if(leadingBlanks > 1) gridLines.Cut(1, leadingBlanks) // Remove all leading blank lines. - if(!gridLines.len) // Skip it if only blank lines exist. + if(!length(gridLines)) // Skip it if only blank lines exist. continue gridSets += gridSet - if(gridLines.len && gridLines[gridLines.len] == "") - gridLines.Cut(gridLines.len) // Remove only one blank line at the end. + if(gridLines[length(gridLines)] == "") + gridLines.Cut(length(gridLines)) // Remove only one blank line at the end. - bounds[MAP_MINY] = min(bounds[MAP_MINY], clamp(gridSet.ycrd, y_lower, y_upper)) - gridSet.ycrd += gridLines.len - 1 // Start at the top and work down - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], clamp(gridSet.ycrd, y_lower, y_upper)) + bounds[MAP_MINY] = min(bounds[MAP_MINY], gridSet.ycrd) + gridSet.ycrd += length(gridLines) - 1 // Start at the top and work down + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], gridSet.ycrd) - var/maxx = gridSet.xcrd - if(gridLines.len) //Not an empty map - maxx = max(maxx, gridSet.xcrd + length(gridLines[1]) / key_len - 1) + if(!line_len) + line_len = length(gridLines[1]) - bounds[MAP_MAXX] = clamp(max(bounds[MAP_MAXX], maxx), x_lower, x_upper) + var/maxx = curr_x + if(length(gridLines)) //Not an empty map + maxx = max(maxx, curr_x + line_len / key_len - 1) + + bounds[MAP_MAXX] = max(bounds[MAP_MAXX], maxx) CHECK_TICK // Indicate failure to parse any coordinates by nulling bounds if(bounds[1] == 1.#INF) - bounds = null - parsed_bounds = bounds + src.bounds = null + else + // Clamp all our mins and maxes down to the proscribed limits + bounds[MAP_MINX] = clamp(bounds[MAP_MINX], x_lower, x_upper) + bounds[MAP_MAXX] = clamp(bounds[MAP_MAXX], x_lower, x_upper) + bounds[MAP_MINY] = clamp(bounds[MAP_MINY], y_lower, y_upper) + bounds[MAP_MAXY] = clamp(bounds[MAP_MAXY], y_lower, y_upper) + + parsed_bounds = src.bounds + src.key_len = key_len + src.line_len = line_len /// Load the parsed map into the world. See [/proc/load_map] for arguments. -/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) +/datum/parsed_map/proc/load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, whitelist = FALSE, new_z) //How I wish for RAII Master.StartLoadingMap() - . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop) + . = _load_impl(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) Master.StopLoadingMap() +#define MAPLOADING_CHECK_TICK \ + if(TICK_CHECK) { \ + if(loading) { \ + SSatoms.map_loader_stop(REF(src)); \ + stoplag(); \ + SSatoms.map_loader_begin(REF(src)); \ + } else { \ + stoplag(); \ + } \ + } + // Do not call except via load() above. -/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE) +/datum/parsed_map/proc/_load_impl(x_offset = 1, y_offset = 1, z_offset = world.maxz + 1, cropMap = FALSE, no_changeturf = FALSE, x_lower = -INFINITY, x_upper = INFINITY, y_lower = -INFINITY, y_upper = INFINITY, placeOnTop = FALSE, new_z) PRIVATE_PROC(TRUE) - var/list/areaCache = list() + // Tell ss atoms that we're doing maploading + // We'll have to account for this in the following tick_checks so it doesn't overflow + loading = TRUE + SSatoms.map_loader_begin(REF(src)) + + // Loading used to be done in this proc + // We make the assumption that if the inner procs runtime, we WANT to do cleanup on them, but we should stil tell our parents we failed + // Since well, we did + var/sucessful = FALSE + switch(map_format) + if(MAP_TGM) + sucessful = _tgm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + else + sucessful = _dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + + // And we are done lads, call it off + SSatoms.map_loader_stop(REF(src)) + loading = FALSE + + if(!no_changeturf) + for(var/turf/T as anything in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))) + //we do this after we load everything in. if we don't, we'll have weird atmos bugs regarding atmos adjacent turfs + T.AfterChange(CHANGETURF_IGNORE_AIR) + + if(new_z) + for(var/z_index in bounds[MAP_MINZ] to bounds[MAP_MAXZ]) + SSmapping.build_area_turfs(z_index) + + if(expanded_x || expanded_y) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPANDED_WORLD_BOUNDS, expanded_x, expanded_y) + + #ifdef TESTING + if(turfsSkipped) + testing("Skipped loading [turfsSkipped] default turfs") + #endif + + return sucessful + +// Wanna clear something up about maps, talking in 255x255 here +// In the tgm format, each gridset contains 255 lines, each line representing one tile, with 255 total gridsets +// In the dmm format, each gridset contains 255 lines, each line representing one row of tiles, containing 255 * line length characters, with one gridset per z +// You can think of dmm as storing maps in rows, whereas tgm stores them in columns +/datum/parsed_map/proc/_tgm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + // setup var/list/modelCache = build_cache(no_changeturf) var/space_key = modelCache[SPACE_KEY] var/list/bounds src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) - //used for sending the maxx and maxy expanded global signals at the end of this proc - var/has_expanded_world_maxx = FALSE - var/has_expanded_world_maxy = FALSE + // Building y coordinate ranges + var/y_relative_to_absolute = y_offset - 1 + var/x_relative_to_absolute = x_offset - 1 + + // Ok so like. something important + // We talk in "relative" coords here, so the coordinate system of the map datum + // This is so we can do offsets, but it is NOT the same as positions in game + // That's why there's some uses of - y_relative_to_absolute here, to turn absolute positions into relative ones + // TGM maps process in columns, so the starting y will always be the max size + // We know y starts at 1 + var/datum/grid_set/first_column = gridSets[1] + var/relative_y = first_column.ycrd + var/highest_y = relative_y + y_relative_to_absolute + + if(!cropMap && highest_y > world.maxy) + world.maxy = highest_y // Expand Y here. X is expanded later on + expanded_y = TRUE + + // Skip Y coords that are above the smallest of the three params + // So maxy and y_upper get to act as thresholds, and relative_y can play + var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y) + // How many lines to skip because they'd be above the y cuttoff line + var/y_starting_skip = relative_y - y_skip_above + highest_y += y_starting_skip + + + // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go + var/line_count = length(first_column.gridLines) + var/lowest_y = relative_y - (line_count - 1) // -1 because we decrement at the end of the loop, not the start + var/y_ending_skip = max(max(y_lower, 1 - y_relative_to_absolute) - lowest_y, 0) + + // X setup + var/x_delta_with = x_upper + if(cropMap) + // Take our smaller crop threshold yes? + x_delta_with = min(x_delta_with, world.maxx) + + // We're gonna skip all the entries above the upper x, or maxx if cropMap is set + // The last column is guarenteed to have the highest x value we;ll encounter + // Even if z scales, this still works + var/datum/grid_set/last_column = gridSets[length(gridSets)] + var/final_x = last_column.xcrd + x_relative_to_absolute + + if(final_x > x_delta_with) + // If our relative x is greater then X upper, well then we've gotta limit our expansion + var/delta = max(final_x - x_delta_with, 0) + final_x -= delta + if(final_x > world.maxx && !cropMap) + world.maxx = final_x + expanded_x = TRUE + + var/lowest_x = max(x_lower, 1 - x_relative_to_absolute) + + // We make the assumption that the last block of turfs will have the highest embedded z in it + var/highest_z = last_column.zcrd + z_offset - 1 // Lets not just make a new z level each time we increment maxz + var/z_threshold = world.maxz + if(highest_z > z_threshold && cropMap) + for(var/i in z_threshold + 1 to highest_z) //create a new z_level if needed + world.incrementMaxZ() + if(!no_changeturf) + WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called") + + for(var/datum/grid_set/gset as anything in gridSets) + var/true_xcrd = gset.xcrd + x_relative_to_absolute + + // any cutoff of x means we just shouldn't iterate this gridset + if(final_x < true_xcrd || lowest_x > gset.xcrd) + continue + + var/zcrd = gset.zcrd + z_offset - 1 + // If we're using changeturf, we disable it if we load into a z level we JUST created + var/no_afterchange = no_changeturf || zcrd > z_threshold + + // We're gonna track the first and last pairs of coords we find + // Since x is always incremented in steps of 1, we only need to deal in y + // The first x is guarenteed to be the lowest, the first y the highest, and vis versa + // This is faster then doing mins and maxes inside the hot loop below + var/first_found = FALSE + var/first_y = 0 + var/last_y = 0 + + var/ycrd = highest_y + // Everything following this line is VERY hot. + for(var/i in 1 + y_starting_skip to line_count - y_ending_skip) + if(gset.gridLines[i] == space_key && no_afterchange) + #ifdef TESTING + ++turfsSkipped + #endif + ycrd-- + MAPLOADING_CHECK_TICK + continue + + var/list/cache = modelCache[gset.gridLines[i]] + if(!cache) + SSatoms.map_loader_stop(REF(src)) + CRASH("Undefined model key in DMM: [gset.gridLines[i]]") + build_coordinate(cache, locate(true_xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) + + // only bother with bounds that actually exist + if(!first_found) + first_found = TRUE + first_y = ycrd + last_y = ycrd + ycrd-- + MAPLOADING_CHECK_TICK + + // The x coord never changes, so not tracking first x is safe + // If no ycrd is found, we assume this row is totally empty and just continue on + if(first_found) + bounds[MAP_MINX] = min(bounds[MAP_MINX], true_xcrd) + bounds[MAP_MINY] = min(bounds[MAP_MINY], last_y) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) + bounds[MAP_MAXX] = max(bounds[MAP_MAXX], true_xcrd) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], first_y) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) + return TRUE +/// Stanrdard loading, not used in production +/// Doesn't take advantage of any tgm optimizations, which makes it slower but also more general +/// Use this if for some reason your map format is messy +/datum/parsed_map/proc/_dmm_load(x_offset, y_offset, z_offset, cropMap, no_changeturf, x_lower, x_upper, y_lower, y_upper, placeOnTop, new_z) + // setup + var/list/modelCache = build_cache(no_changeturf) + var/space_key = modelCache[SPACE_KEY] + var/list/bounds + var/key_len = src.key_len + src.bounds = bounds = list(1.#INF, 1.#INF, 1.#INF, -1.#INF, -1.#INF, -1.#INF) + + var/y_relative_to_absolute = y_offset - 1 + var/x_relative_to_absolute = x_offset - 1 + var/line_len = src.line_len for(var/datum/grid_set/gset as anything in gridSets) - var/ycrd = gset.ycrd + y_offset - 1 + var/relative_x = gset.xcrd + var/relative_y = gset.ycrd + var/true_xcrd = relative_x + x_relative_to_absolute + var/ycrd = relative_y + y_relative_to_absolute var/zcrd = gset.zcrd + z_offset - 1 if(!cropMap && ycrd > world.maxy) world.maxy = ycrd // Expand Y here. X is expanded in the loop below - has_expanded_world_maxy = TRUE + expanded_y = TRUE var/zexpansion = zcrd > world.maxz + var/no_afterchange = no_changeturf if(zexpansion) if(cropMap) continue @@ -167,244 +464,409 @@ world.incrementMaxZ() if(!no_changeturf) WARNING("Z-level expansion occurred without no_changeturf set, this may cause problems when /turf/AfterChange is called") - - for(var/line in gset.gridLines) - if((ycrd - y_offset + 1) < y_lower || (ycrd - y_offset + 1) > y_upper) //Reverse operation and check if it is out of bounds of cropping. - --ycrd - continue - if(ycrd <= world.maxy && ycrd >= 1) - var/xcrd = gset.xcrd + x_offset - 1 - for(var/tpos = 1 to length(line) - key_len + 1 step key_len) - if((xcrd - x_offset + 1) < x_lower || (xcrd - x_offset + 1) > x_upper) //Same as above. - ++xcrd - continue //X cropping. - if(xcrd > world.maxx) - if(cropMap) - break - else - world.maxx = xcrd - has_expanded_world_maxx = TRUE - - if(xcrd >= 1) - var/model_key = copytext(line, tpos, tpos + key_len) - var/no_afterchange = no_changeturf || zexpansion - if(!no_afterchange || (model_key != space_key)) - var/list/cache = modelCache[model_key] - if(!cache) - CRASH("Undefined model key in DMM: [model_key]") - build_coordinate(areaCache, cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop) - - // only bother with bounds that actually exist - bounds[MAP_MINX] = min(bounds[MAP_MINX], xcrd) - bounds[MAP_MINY] = min(bounds[MAP_MINY], ycrd) - bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) - bounds[MAP_MAXX] = max(bounds[MAP_MAXX], xcrd) - bounds[MAP_MAXY] = max(bounds[MAP_MAXY], ycrd) - bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) - #ifdef TESTING - else - ++turfsSkipped - #endif - CHECK_TICK + no_afterchange = TRUE + // Ok so like. something important + // We talk in "relative" coords here, so the coordinate system of the map datum + // This is so we can do offsets, but it is NOT the same as positions in game + // That's why there's some uses of - y_relative_to_absolute here, to turn absolute positions into relative ones + + // Skip Y coords that are above the smallest of the three params + // So maxy and y_upper get to act as thresholds, and relative_y can play + var/y_skip_above = min(world.maxy - y_relative_to_absolute, y_upper, relative_y) + // How many lines to skip because they'd be above the y cuttoff line + var/y_starting_skip = relative_y - y_skip_above + ycrd += y_starting_skip + + // Y is the LOWEST it will ever be here, so we can easily set a threshold for how low to go + var/line_count = length(gset.gridLines) + var/lowest_y = relative_y - (line_count - 1) // -1 because we decrement at the end of the loop, not the start + var/y_ending_skip = max(max(y_lower, 1 - y_relative_to_absolute) - lowest_y, 0) + + // Now we're gonna precompute the x thresholds + // We skip all the entries below the lower x, or 1 + var/starting_x_delta = max(max(x_lower, 1 - x_relative_to_absolute) - relative_x, 0) + // The x loop counts by key length, so we gotta multiply here + var/x_starting_skip = starting_x_delta * key_len + true_xcrd += starting_x_delta + + // We're gonna skip all the entries above the upper x, or maxx if cropMap is set + var/x_target = line_len - key_len + 1 + var/x_step_count = ROUND_UP(x_target / key_len) + var/final_x = relative_x + (x_step_count - 1) + var/x_delta_with = x_upper + if(cropMap) + // Take our smaller crop threshold yes? + x_delta_with = min(x_delta_with, world.maxx) + if(final_x > x_delta_with) + // If our relative x is greater then X upper, well then we've gotta limit our expansion + var/delta = max(final_x - x_delta_with, 0) + x_step_count -= delta + final_x -= delta + x_target = x_step_count * key_len + if(final_x > world.maxx && !cropMap) + world.maxx = final_x + expanded_x = TRUE + + // We're gonna track the first and last pairs of coords we find + // The first x is guarenteed to be the lowest, the first y the highest, and vis versa + // This is faster then doing mins and maxes inside the hot loop below + var/first_found = FALSE + var/first_x = 0 + var/first_y = 0 + var/last_x = 0 + var/last_y = 0 + + // Everything following this line is VERY hot. How hot depends on the map format + // (Yes this does mean dmm is technically faster to parse. shut up) + for(var/i in 1 + y_starting_skip to line_count - y_ending_skip) + var/line = gset.gridLines[i] + + var/xcrd = true_xcrd + for(var/tpos in 1 + x_starting_skip to x_target step key_len) + var/model_key = copytext(line, tpos, tpos + key_len) + if(model_key == space_key && no_afterchange) + #ifdef TESTING + ++turfsSkipped + #endif + MAPLOADING_CHECK_TICK ++xcrd - --ycrd + continue + var/list/cache = modelCache[model_key] + if(!cache) + SSatoms.map_loader_stop(REF(src)) + CRASH("Undefined model key in DMM: [model_key]") + build_coordinate(cache, locate(xcrd, ycrd, zcrd), no_afterchange, placeOnTop, new_z) + + // only bother with bounds that actually exist + if(!first_found) + first_found = TRUE + first_x = xcrd + first_y = ycrd + last_x = xcrd + last_y = ycrd + MAPLOADING_CHECK_TICK + ++xcrd + ycrd-- + MAPLOADING_CHECK_TICK + bounds[MAP_MINX] = min(bounds[MAP_MINX], first_x) + bounds[MAP_MINY] = min(bounds[MAP_MINY], last_y) + bounds[MAP_MINZ] = min(bounds[MAP_MINZ], zcrd) + bounds[MAP_MAXX] = max(bounds[MAP_MAXX], last_x) + bounds[MAP_MAXY] = max(bounds[MAP_MAXY], first_y) + bounds[MAP_MAXZ] = max(bounds[MAP_MAXZ], zcrd) - CHECK_TICK - - if(!no_changeturf) - for(var/turf/T as anything in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))) - //we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs - T.AfterChange(CHANGETURF_IGNORE_AIR) - - if(has_expanded_world_maxx || has_expanded_world_maxy) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EXPANDED_WORLD_BOUNDS, has_expanded_world_maxx, has_expanded_world_maxy) + return TRUE - #ifdef TESTING - if(turfsSkipped) - testing("Skipped loading [turfsSkipped] default turfs") - #endif +GLOBAL_LIST_EMPTY(map_model_default) - return TRUE +/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths) + if(map_format == MAP_TGM) + return tgm_build_cache(no_changeturf, bad_paths) + return dmm_build_cache(no_changeturf, bad_paths) -/datum/parsed_map/proc/build_cache(no_changeturf, bad_paths=null) +/datum/parsed_map/proc/tgm_build_cache(no_changeturf, bad_paths=null) if(modelCache && !bad_paths) return modelCache . = modelCache = list() var/list/grid_models = src.grid_models + var/set_space = FALSE + // Use where a list is needed, but where it will not be modified + // Used here to remove the cost of needing to make a new list for each fields entry when it's set manually later + var/static/list/default_list = GLOB.map_model_default // It's stupid, but it saves += list(list) + var/static/list/wrapped_default_list = list(default_list) // It's stupid, but it saves += list(list) + var/static/regex/var_edits = var_edits_tgm + + var/static/magic_var // Really cursed, but we use it to silence a compiler warning thrown by it not understanding findtext() and regex + + var/path_to_init = "" + // Reference to the attributes list we're currently filling, if any + var/list/current_attributes + // If we are currently editing a path or not + var/editing = FALSE for(var/model_key in grid_models) - var/model = grid_models[model_key] - var/list/members = list() //will contain all members (paths) in model (in our example : /turf/unsimulated/wall and /area/mine/explored) - var/list/members_attributes = list() //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list()) + // We're going to split models by newline + // This guarentees that each entry will be of interest to us + // Then we'll process them step by step + // Hopefully this reduces the cost from read_list that we'd otherwise have + var/list/lines = splittext(grid_models[model_key], "\n") + // Builds list of path/edits for later + // Of note: we cannot preallocate them to save time in list expansion later + // But fortunately lists allocate at least 8 entries normally anyway, and + // We are unlikely to have more then that many members + //will contain all members (paths) in model (in our example : /turf/unsimulated/wall) + var/list/members = list() + //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list()) + var/list/members_attributes = list() ///////////////////////////////////////////////////////// //Constructing members and corresponding variables lists //////////////////////////////////////////////////////// + // string representation of the path to init + for(var/line in lines) + // We do this here to avoid needing to check at each return statement + // No harm in it anyway + CHECK_TICK - var/index = 1 - var/old_position = 1 - var/dpos + switch(line[length(line)]) + if(";") // Var edit, we'll apply it + // Var edits look like \tname = value; + // I'm gonna try capturing them with regex, since it ought to be the fastest here + // Should hand back key = value + magic_var = findtext(line, var_edits) //Regex is magic + var/value = parse_constant(var_edits.group[2]) + if(istext(value)) + value = apply_text_macros(value) + current_attributes[var_edits.group[1]] = value + continue // Keep on keeping on brother + if("{") // Start of an edit, and so also the start of a path + editing = TRUE + current_attributes = list() // Init the list we'll be filling + members_attributes += list(current_attributes) + path_to_init = copytext(line, 1, -1) + if(",") // Either the end of a path, or the end of an edit + if(editing) // it was the end of a path + editing = FALSE + continue + members_attributes += wrapped_default_list // We know this is a path, and we also know it has no vv's. so we'll just set this to the default list + // Drop the last char mind + path_to_init = copytext(line, 1, -1) + if("}") // Gotta be the end of an area edit, let's check to be sure + if(editing) // it was the end of an area edit (shouldn't do those anyhow) + editing = FALSE + continue + stack_trace("ended a line on JUST a }, with no ongoing edit. What? Area shit?") + else // If we're editing, this is a var edit entry. the last one in a stack, cause god hates me. Otherwise, it's an area + if(editing) // I want inline I want inline I want inline + // Var edits look like \tname = value; + // I'm gonna try capturing them with regex, since it ought to be the fastest here + // Should hand back key = value + magic_var = findtext(line, var_edits) + var/value = parse_constant(var_edits.group[2]) + if(istext(value)) + value = apply_text_macros(value) + current_attributes[var_edits.group[1]] = value + continue // Keep on keeping on brother - while(dpos != 0) - //finding next member (e.g /turf/unsimulated/wall{icon_state = "rock"} or /area/mine/explored) - dpos = find_next_delimiter_position(model, old_position, ",", "{", "}") //find next delimiter (comma here) that's not within {...} + members_attributes += wrapped_default_list // We know this is a path, and we also know it has no vv's. so we'll just set this to the default list + path_to_init = line - var/full_def = trim_text(copytext(model, old_position, dpos)) //full definition, e.g : /obj/foo/bar{variables=derp} - var/variables_start = findtext(full_def, "{") - var/path_text = trim_text(copytext(full_def, 1, variables_start)) + + // Alright, if we've gotten to this point, our string is a path + // Oh and we don't trim it, because we require no padding for these + // Saves like 1.5 deciseconds + var/atom_def = text2path(path_to_init) //path definition, e.g /obj/foo/bar + + if(!ispath(atom_def, /atom)) // Skip the item if the path does not exist. Fix your crap, mappers! + if(bad_paths) + // Rare case, avoid the var to save time most of the time + LAZYOR(bad_paths[copytext(line, 1, -1)], model_key) + continue + // Index is already incremented either way, just gotta set the path and all + members += atom_def + + //check and see if we can just skip this turf + //So you don't have to understand this horrid statement, we can do this if + // 1. the space_key isn't set yet + // 2. no_changeturf is set + // 3. there are exactly 2 members + // 4. with no attributes + // 5. and the members are world.turf and world.area + // Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default) + // We can skip calling this proc every time we see XXX + if(!set_space \ + && no_changeturf \ + && members_attributes.len == 2 \ + && members.len == 2 \ + && members_attributes[1] == default_list \ + && members_attributes[2] == default_list \ + && members[2] == world.area \ + && members[1] == world.turf + ) + set_space = TRUE + .[SPACE_KEY] = model_key + continue + + .[model_key] = list(members, members_attributes) + return . + +/// Builds key caches for general formats +/// Slower then the proc above, tho it could still be optimized slightly. it's just not a priority +/// Since we don't run DMM maps, ever. +/datum/parsed_map/proc/dmm_build_cache(no_changeturf, bad_paths=null) + if(modelCache && !bad_paths) + return modelCache + . = modelCache = list() + var/list/grid_models = src.grid_models + var/set_space = FALSE + // Use where a list is needed, but where it will not be modified + // Used here to remove the cost of needing to make a new list for each fields entry when it's set manually later + var/static/list/default_list = list(GLOB.map_model_default) + for(var/model_key in grid_models) + //will contain all members (paths) in model (in our example : /turf/unsimulated/wall) + var/list/members = list() + //will contain lists filled with corresponding variables, if any (in our example : list(icon_state = "rock") and list()) + var/list/members_attributes = list() + + var/model = grid_models[model_key] + ///////////////////////////////////////////////////////// + //Constructing members and corresponding variables lists + //////////////////////////////////////////////////////// + + var/model_index = 1 + while(findtext(model, model_path, model_index)) + var/variables_start = 0 + var/member_string = model_path.group[1] + model_index = model_path.next + //findtext is a bit expensive, lets only do this if the last char of our string is a } (IE: we know we have vars) + //this saves about 25 miliseconds on my machine. Not a major optimization + if(member_string[length(member_string)] == "}") + variables_start = findtext(member_string, "{") + + var/path_text = TRIM_TEXT(copytext(member_string, 1, variables_start)) var/atom_def = text2path(path_text) //path definition, e.g /obj/foo/bar - if(dpos) - old_position = dpos + length(model[dpos]) if(!ispath(atom_def, /atom)) // Skip the item if the path does not exist. Fix your crap, mappers! if(bad_paths) LAZYOR(bad_paths[path_text], model_key) continue - members.Add(atom_def) + members += atom_def //transform the variables in text format into a list (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7)) - var/list/fields = list() - + // OF NOTE: this could be made faster by replacing readlist with a progressive regex + // I'm just too much of a bum to do it rn, especially since we mandate tgm format for any maps in repo + var/list/fields = default_list if(variables_start)//if there's any variable - full_def = copytext(full_def, variables_start + length(full_def[variables_start]), -length(copytext_char(full_def, -1))) //removing the last '}' - fields = readlist(full_def, ";") - if(fields.len) - if(!trim(fields[fields.len])) - --fields.len - for(var/I in fields) - var/value = fields[I] - if(istext(value)) - fields[I] = apply_text_macros(value) + member_string = copytext(member_string, variables_start + length(member_string[variables_start]), -length(copytext_char(member_string, -1))) //removing the last '}' + fields = list(readlist(member_string, ";")) + for(var/I in fields) + var/value = fields[I] + if(istext(value)) + fields[I] = apply_text_macros(value) //then fill the members_attributes list with the corresponding variables - members_attributes.len++ - members_attributes[index++] = fields - + members_attributes += fields CHECK_TICK //check and see if we can just skip this turf //So you don't have to understand this horrid statement, we can do this if - // 1. no_changeturf is set - // 2. the space_key isn't set yet + // 1. the space_key isn't set yet + // 2. no_changeturf is set // 3. there are exactly 2 members // 4. with no attributes // 5. and the members are world.turf and world.area // Basically, if we find an entry like this: "XXX" = (/turf/default, /area/default) // We can skip calling this proc every time we see XXX - if(no_changeturf \ - && !(.[SPACE_KEY]) \ + if(!set_space \ + && no_changeturf \ && members.len == 2 \ && members_attributes.len == 2 \ && length(members_attributes[1]) == 0 \ && length(members_attributes[2]) == 0 \ && (world.area in members) \ && (world.turf in members)) - + set_space = TRUE .[SPACE_KEY] = model_key continue - .[model_key] = list(members, members_attributes) + return . -/datum/parsed_map/proc/build_coordinate(list/areaCache, list/model, turf/crds, no_changeturf as num, placeOnTop as num) +/datum/parsed_map/proc/build_coordinate(list/model, turf/crds, no_changeturf as num, placeOnTop as num, new_z) + // If we don't have a turf, nothing we will do next will actually acomplish anything, so just go back + // Note, this would actually drop area vvs in the tile, but like, why tho + if(!crds) + return var/index var/list/members = model[1] var/list/members_attributes = model[2] + // We use static lists here because it's cheaper then passing them around + var/static/list/default_list = GLOB.map_model_default //////////////// //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 + if(turf_blacklist?[crds]) + return //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 + var/area/old_area if(members[index] != /area/template_noop) - var/atype = members[index] - world.preloader_setup(members_attributes[index], atype)//preloader for assigning set variables on atom creation - var/atom/instance = areaCache[atype] - if (!instance) - instance = GLOB.areas_by_type[atype] - if (!instance) - instance = new atype(null) - areaCache[atype] = instance - if(crds) - instance.contents.Add(crds) - - if(GLOB.use_preloader && instance) + if(members_attributes[index] != default_list) + world.preloader_setup(members_attributes[index], members[index])//preloader for assigning set variables on atom creation + var/area/area_instance = loaded_areas[members[index]] + if(!area_instance) + var/area_type = members[index] + // If this parsed map doesn't have that area already, we check the global cache + area_instance = GLOB.areas_by_type[area_type] + // If the global list DOESN'T have this area it's either not a unique area, or it just hasn't been created yet + if (!area_instance) + area_instance = new area_type(null) + if(!area_instance) + CRASH("[area_type] failed to be new'd, what'd you do?") + loaded_areas[area_type] = area_instance + + if(!new_z) + old_area = crds.loc + old_area.turfs_to_uncontain += crds + area_instance.contained_turfs += crds + + area_instance.contents += crds + + if(global.use_preloader) + world.preloader_load(area_instance) + + var/atom/instance + + // Index right before /area is /turf + index-- + //then instance the /turf + //NOTE: this used to place any turfs before the last "underneath" it using .appearance and underlays + //We don't actually use this, and all it did was cost cpu, so we don't do this anymore + if(members[index] != /turf/template_noop) + if(members_attributes[index] != default_list) + world.preloader_setup(members_attributes[index], members[index]) + + // Note: we make the assertion that the last path WILL be a turf. if it isn't, this will fail. + if(placeOnTop) + instance = crds.PlaceOnTop(null, members[index], CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE)) + else if(no_changeturf) + instance = create_atom(members[index], crds)//first preloader pass + else + instance = crds.ChangeTurf(members[index], null, CHANGETURF_DEFER_CHANGE) + + if(global.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New() world.preloader_load(instance) - //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect + // If this isn't template work, we didn't change our turf and we changed area, then we've gotta handle area lighting transfer + else if(!no_changeturf && instance) + // Don't do contain/uncontain stuff, this happens a few lines up when the area actally changes + crds.on_change_area(old_area, crds.loc) - var/first_turf_index = 1 - while(!ispath(members[first_turf_index], /turf)) //find first /turf object in members - first_turf_index++ + MAPLOADING_CHECK_TICK - //turn off base new Initialization until the whole thing is loaded - 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) + //finally instance all remainings objects/mobs + for(var/atom_index in 1 to index-1) + if(members_attributes[atom_index] != default_list) + world.preloader_setup(members_attributes[atom_index], members[atom_index]) - if(T) - //if others /turf are presents, simulates the underlays piling effect - index = first_turf_index + 1 - while(index <= members.len - 1) // Last item is an /area - var/underlay = T.appearance - T = instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop)//instance new turf - T.underlays += underlay - index++ + // We make the assertion that only /atom s will be in this portion of the code. if that isn't true, this will fail + instance = create_atom(members[atom_index], crds)//first preloader pass - //finally instance all remainings objects/mobs - for(index in 1 to first_turf_index-1) - instance_atom(members[index],members_attributes[index],crds,no_changeturf,placeOnTop) - //Restore initialization to the previous value - SSatoms.map_loader_stop() + if(global.use_preloader && instance)//second preloader pass, for those atoms that don't ..() in New() + world.preloader_load(instance) + MAPLOADING_CHECK_TICK //////////////// //Helpers procs //////////////// -//Instance an atom at (x,y,z) and gives it the variables in attributes -/datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop) - world.preloader_setup(attributes, path) - - if(crds) - if(ispath(path, /turf)) - if(placeOnTop) - . = crds.PlaceOnTop(null, path, CHANGETURF_DEFER_CHANGE | (no_changeturf ? CHANGETURF_SKIP : NONE)) - else if(!no_changeturf) - . = crds.ChangeTurf(path, null, CHANGETURF_DEFER_CHANGE) - else - . = create_atom(path, crds)//first preloader pass - else - . = create_atom(path, crds)//first preloader pass - - if(GLOB.use_preloader && .)//second preloader pass, for those atoms that don't ..() in New() - world.preloader_load(.) - - //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize - if(TICK_CHECK) - SSatoms.map_loader_stop() - stoplag() - SSatoms.map_loader_begin() - /datum/parsed_map/proc/create_atom(path, crds) set waitfor = FALSE . = new path (crds) -//text trimming (both directions) helper proc -//optionally removes quotes before and after the text (for variable name) -/datum/parsed_map/proc/trim_text(what as text,trim_quotes=0) - if(trim_quotes) - return trimQuotesRegex.Replace(what, "") - else - return trimRegex.Replace(what, "") - - //find the position of the next delimiter,skipping whatever is comprised between opening_escape and closing_escape //returns 0 if reached the last delimiter /datum/parsed_map/proc/find_next_delimiter_position(text as text,initial_position as num, delimiter=",",opening_escape="\"",closing_escape="\"") @@ -419,7 +881,6 @@ return next_delimiter - //build a list from variables in text form (e.g {var1="derp"; var2; var3=7} => list(var1="derp", var2, var3=7)) //return the filled list /datum/parsed_map/proc/readlist(text as text, delimiter=",") @@ -427,28 +888,29 @@ if (!text) return + // If we're using a semi colon, we can do this as splittext rather then constant calls to find_next_delimiter_position + // This does make the code a bit harder to read, but saves a good bit of time so suck it up var/position var/old_position = 1 - while(position != 0) // find next delimiter that is not within "..." position = find_next_delimiter_position(text,old_position,delimiter) // check if this is a simple variable (as in list(var1, var2)) or an associative one (as in list(var1="foo",var2=7)) var/equal_position = findtext(text,"=",old_position, position) - - var/trim_left = trim_text(copytext(text,old_position,(equal_position ? equal_position : position))) - var/left_constant = delimiter == ";" ? trim_left : parse_constant(trim_left) + var/trim_left = TRIM_TEXT(copytext(text,old_position,(equal_position ? equal_position : position))) + var/left_constant = parse_constant(trim_left) if(position) old_position = position + length(text[position]) + if(!left_constant) // damn newlines man. Exists to provide behavior consistency with the above loop. not a major cost becuase this path is cold + continue if(equal_position && !isnum(left_constant)) // Associative var, so do the association. // Note that numbers cannot be keys - the RHS is dropped if so. - var/trim_right = trim_text(copytext(text, equal_position + length(text[equal_position]), position)) + var/trim_right = TRIM_TEXT(copytext(text, equal_position + length(text[equal_position]), position)) var/right_constant = parse_constant(trim_right) .[left_constant] = right_constant - else // simple var . += list(left_constant) @@ -460,7 +922,10 @@ // string if(text[1] == "\"") - return copytext(text, length(text[1]) + 1, findtext(text, "\"", length(text[1]) + 1)) + // insert implied locate \" and length("\"") here + // It's a minimal timesave but it is a timesave + // Safe becuase we're guarenteed trimmed constants + return copytext(text, 2, -1) // list if(copytext(text, 1, 6) == "list(")//6 == length("list(") + 1 @@ -488,7 +953,9 @@ /datum/parsed_map/Destroy() ..() - turf_blacklist.Cut() + SSatoms.map_loader_stop(REF(src)) // Just in case, I don't want to double up here + if(turf_blacklist) + turf_blacklist.Cut() parsed_bounds.Cut() bounds.Cut() grid_models.Cut() diff --git a/code/modules/mapping/ruins.dm b/code/modules/mapping/ruins.dm index 98e126996481..dc5afbc1303d 100644 --- a/code/modules/mapping/ruins.dm +++ b/code/modules/mapping/ruins.dm @@ -1,4 +1,4 @@ -/datum/map_template/ruin/proc/try_to_place(z,allowed_areas,turf/forced_turf) +/datum/map_template/ruin/proc/try_to_place(z, list/allowed_areas_typecache, turf/forced_turf, clear_below) var/sanity = forced_turf ? 1 : PLACEMENT_TRIES if(SSmapping.level_trait(z,ZTRAIT_ISOLATED_RUINS)) return place_on_isolated_level(z) @@ -8,17 +8,21 @@ var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2) var/turf/central_turf = forced_turf ? forced_turf : locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z) var/valid = TRUE + var/list/affected_turfs = get_affected_turfs(central_turf,1) + var/list/affected_areas = list() - for(var/turf/check in get_affected_turfs(central_turf,1)) - var/area/new_area = get_area(check) - valid = FALSE // set to false before we check + for(var/turf/check in affected_turfs) + // Use assoc lists to move this out, it's easier that way if(check.turf_flags & NO_RUINS) + valid = FALSE // set to false before we check break - for(var/type in allowed_areas) - if(istype(new_area, type)) // it's at least one of our types so it's whitelisted - valid = TRUE - break - if(!valid) + var/area/new_area = get_area(check) + affected_areas[new_area] = TRUE + + // This is faster yes. Only BARELY but it is faster + for(var/area/affct_area as anything in affected_areas) + if(!allowed_areas_typecache[affct_area.type]) + valid = FALSE break if(!valid) @@ -26,19 +30,21 @@ testing("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])") - 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/plant in T) - qdel(plant) + if(clear_below) + var/list/static/clear_below_typecache = typecacheof(list( + /obj/structure/spawner, + /mob/living/simple_animal, + /obj/structure/flora + )) + for(var/turf/T as anything in affected_turfs) + for(var/atom/thing as anything in T) + if(clear_below_typecache[thing.type]) + qdel(thing) load(central_turf,centered = TRUE) loaded++ - for(var/turf/T in get_affected_turfs(central_turf, 1)) + for(var/turf/T in affected_turfs) T.turf_flags |= NO_RUINS new /obj/effect/landmark/ruin(central_turf, src) @@ -58,10 +64,11 @@ return center -/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins) +/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = list(/area/space), list/potentialRuins, clear_below = FALSE) if(!z_levels || !z_levels.len) WARNING("No Z levels provided - Not generating ruins") return + var/list/whitelist_typecache = typecacheof(whitelist) for(var/zl in z_levels) var/turf/T = locate(1, 1, zl) @@ -123,7 +130,7 @@ else break outer - placed_turf = current_pick.try_to_place(target_z,whitelist,forced_turf) + placed_turf = current_pick.try_to_place(target_z,whitelist_typecache,forced_turf,clear_below) if(!placed_turf) continue else @@ -160,8 +167,6 @@ switch(current_pick.always_spawn_with[v]) if(PLACE_SAME_Z) forced_ruins[linked] = target_z //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) diff --git a/code/modules/mapping/space_management/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm index c52f239e1c38..feb966f9231e 100644 --- a/code/modules/mapping/space_management/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -22,122 +22,143 @@ neigbours[TEXT_WEST] = P.spl P.spl.neigbours[TEXT_EAST] = src +#define CHORDS_TO_1D(x, y, grid_diameter) ((x) + ((y) - 1) * (grid_diameter)) /datum/space_transition_point //this is explicitly utilitarian datum type made specially for the space map generation and are absolutely unusable for anything else var/list/neigbours = list() var/x var/y var/datum/space_level/spl -/datum/space_transition_point/New(nx, ny, list/point_grid) - if(!point_grid) +/datum/space_transition_point/New(nx, ny, list/grid) + if(!grid) qdel(src) return - var/list/L = point_grid[1] - if(nx > point_grid.len || ny > L.len) + var/grid_diameter = sqrt(length(grid)) + if(nx > grid_diameter || ny > grid_diameter) + stack_trace("Attempted to set a position outside the size of [grid_diameter]") qdel(src) return x = nx y = ny - if(point_grid[x][y]) + var/position = CHORDS_TO_1D(x, y, grid_diameter) + if(grid[position]) return - point_grid[x][y] = src + grid[position] = src -/datum/space_transition_point/proc/set_neigbours(list/grid) - var/max_X = grid.len - var/list/max_Y = grid[1] - max_Y = max_Y.len +/datum/space_transition_point/proc/set_neigbours(list/grid, size) neigbours.Cut() - if(x+1 <= max_X) - neigbours |= grid[x+1][y] + + if(x+1 <= size) + neigbours |= grid[CHORDS_TO_1D(x+1, y, size)] if(x-1 >= 1) - neigbours |= grid[x-1][y] - if(y+1 <= max_Y) - neigbours |= grid[x][y+1] + neigbours |= grid[CHORDS_TO_1D(x-1, y, size)] + if(y+1 <= size) + neigbours |= grid[CHORDS_TO_1D(x, y + 1, size)] if(y-1 >= 1) - neigbours |= grid[x][y-1] + neigbours |= grid[CHORDS_TO_1D(x, y - 1, size)] /datum/controller/subsystem/mapping/proc/setup_map_transitions() //listamania - var/list/SLS = list() + var/list/transition_levels = list() var/list/cached_z_list = z_list - var/conf_set_len = 0 - for(var/A in cached_z_list) - var/datum/space_level/D = A - if (D.linkage == CROSSLINKED) - SLS.Add(D) - conf_set_len++ - var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1] - var/list/grid = list() - var/datum/space_transition_point/P - for(var/x in 1 to conf_set_len*2+1) - for(var/y in 1 to conf_set_len*2+1) - P = new/datum/space_transition_point(x, y, point_grid) - point_grid[x][y] = P - grid.Add(P) - for(var/datum/space_transition_point/pnt in grid) - pnt.set_neigbours(point_grid) - P = point_grid[conf_set_len+1][conf_set_len+1] + for(var/datum/space_level/level as anything in cached_z_list) + if (level.linkage == CROSSLINKED) + transition_levels.Add(level) + + var/grid_diameter = (length(transition_levels) * 2) + 1 + var/list/grid = new /list(grid_diameter ** 2) + + var/datum/space_transition_point/point + for(var/x in 1 to grid_diameter) + for(var/y in 1 to grid_diameter) + point = new/datum/space_transition_point(x, y, grid) + grid[CHORDS_TO_1D(x, y, grid_diameter)] = point + for(point as anything in grid) + point.set_neigbours(grid, grid_diameter) + + var/center = round(grid_diameter / 2) + point = grid[CHORDS_TO_1D(grid_diameter, center, center)] + grid.Cut() + + var/list/transition_pick = transition_levels.Copy() var/list/possible_points = list() var/list/used_points = list() - grid.Cut() - while(SLS.len) - var/datum/space_level/D = pick_n_take(SLS) - D.xi = P.x - D.yi = P.y - P.spl = D - possible_points |= P.neigbours - used_points |= P + while(transition_pick.len) + var/datum/space_level/level = pick_n_take(transition_pick) + level.xi = point.x + level.yi = point.y + point.spl = level + possible_points |= point.neigbours + used_points |= point possible_points.Remove(used_points) - D.set_neigbours(used_points) - P = pick(possible_points) + level.set_neigbours(used_points) + point = pick(possible_points) CHECK_TICK + // Now that we've handed out neighbors, we're gonna handle an edge case + // Need to check if all our levels have neighbors in all directions + // If they don't, we'll make them wrap all the way around to the other side of the grid + for(var/direction in GLOB.cardinals) + var/dir = "[direction]" + var/inverse = "[turn(direction, 180)]" + for(var/datum/space_level/level as anything in transition_levels) + // If we have something in this dir that isn't just us, continue on + if(level.neigbours[dir] && level.neigbours[dir] != level) + continue + var/datum/space_level/head = level + while(head.neigbours[inverse] && head.neigbours[inverse] != head) + head = head.neigbours[inverse] + + // Alllright we've landed on someone who we can wrap around onto safely, let's make that connection yeah? + head.neigbours[inverse] = level + level.neigbours[dir] = head + //Lists below are pre-calculated values arranged in the list in such a way to be easily accessable in the loop by the counter //Its either this or madness with lotsa math - - var/list/x_pos_beginning = list(1, 1, world.maxx - TRANSITIONEDGE, 1) //x values of the lowest-leftest turfs of the respective 4 blocks on each side of zlevel - var/list/y_pos_beginning = list(world.maxy - TRANSITIONEDGE, 1, 1 + TRANSITIONEDGE, 1 + TRANSITIONEDGE) //y values respectively + var/inner_max_x = world.maxx - TRANSITIONEDGE + var/inner_max_y = world.maxy - TRANSITIONEDGE + var/list/x_pos_beginning = list(1, 1, inner_max_x, 1) //x values of the lowest-leftest turfs of the respective 4 blocks on each side of zlevel + var/list/y_pos_beginning = list(inner_max_y, 1, 1 + TRANSITIONEDGE, 1 + TRANSITIONEDGE) //y values respectively var/list/x_pos_ending = list(world.maxx, world.maxx, world.maxx, 1 + TRANSITIONEDGE) //x values of the highest-rightest turfs of the respective 4 blocks on each side of zlevel - var/list/y_pos_ending = list(world.maxy, 1 + TRANSITIONEDGE, world.maxy - TRANSITIONEDGE, world.maxy - TRANSITIONEDGE) //y values respectively - var/list/x_pos_transition = list(1, 1, TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 1) //values of x for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective x value later in the code - var/list/y_pos_transition = list(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 1, 1, 1) //values of y for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective y value later in the code + var/list/y_pos_ending = list(world.maxy, 1 + TRANSITIONEDGE, inner_max_y, inner_max_y) //y values respectively + var/list/x_pos_transition = list(1, 1, TRANSITIONEDGE + 2, inner_max_x - 1) //values of x for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective x value later in the code + var/list/y_pos_transition = list(TRANSITIONEDGE + 2, inner_max_y - 1, 1, 1) //values of y for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective y value later in the code - for(var/I in cached_z_list) - var/datum/space_level/D = I - if(!D.neigbours.len) + // Cache the range passed to the mirage border element, to reduce world var access in the thousands + var/range_cached = world.view + + for(var/datum/space_level/level as anything in cached_z_list) + if(!level.neigbours.len) continue - var/zlevelnumber = D.z_value + var/zlevelnumber = level.z_value for(var/side in 1 to 4) var/turf/beginning = locate(x_pos_beginning[side], y_pos_beginning[side], zlevelnumber) var/turf/ending = locate(x_pos_ending[side], y_pos_ending[side], zlevelnumber) var/list/turfblock = block(beginning, ending) var/dirside = 2**(side-1) - var/zdestination = zlevelnumber - if(D.neigbours["[dirside]"] && D.neigbours["[dirside]"] != D) - D = D.neigbours["[dirside]"] - zdestination = D.z_value - else - dirside = turn(dirside, 180) - while(D.neigbours["[dirside]"] && D.neigbours["[dirside]"] != D) - D = D.neigbours["[dirside]"] - zdestination = D.z_value - D = I + var/x_target = x_pos_transition[side] == 1 ? 0 : x_pos_transition[side] + var/y_target = y_pos_transition[side] == 1 ? 0 : y_pos_transition[side] + var/datum/space_level/neighbor = level.neigbours["[dirside]"] + var/zdestination = neighbor.z_value + for(var/turf/open/space/S in turfblock) - S.destination_x = x_pos_transition[side] == 1 ? S.x : x_pos_transition[side] - S.destination_y = y_pos_transition[side] == 1 ? S.y : y_pos_transition[side] + S.destination_x = x_target || S.x + S.destination_y = y_target || S.y S.destination_z = zdestination // Mirage border code var/mirage_dir if(S.x == 1 + TRANSITIONEDGE) mirage_dir |= WEST - else if(S.x == world.maxx - TRANSITIONEDGE) + else if(S.x == inner_max_x) mirage_dir |= EAST if(S.y == 1 + TRANSITIONEDGE) mirage_dir |= SOUTH - else if(S.y == world.maxy - TRANSITIONEDGE) + else if(S.y == inner_max_y) mirage_dir |= NORTH if(!mirage_dir) continue - var/turf/place = locate(S.destination_x, S.destination_y, S.destination_z) - S.AddComponent(/datum/component/mirage_border, place, mirage_dir) + var/turf/place = locate(S.destination_x, S.destination_y, zdestination) + S.AddElement(/datum/element/mirage_border, place, mirage_dir, range_cached) + +#undef CHORDS_TO_1D diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm index 4bf17714853e..809fd0f5d243 100644 --- a/code/modules/mapping/space_management/zlevel_manager.dm +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -14,10 +14,10 @@ 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]) - manage_z_level(S) + manage_z_level(S, filled_with_space = FALSE) generate_z_level_linkages() // Default Zs don't use add_new_zlevel() so they don't automatically generate z-linkages. -/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, contain_turfs = TRUE) UNTIL(!adding_new_zlevel) adding_new_zlevel = TRUE var/new_z = z_list.len + 1 @@ -26,7 +26,7 @@ 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) - manage_z_level(S) + manage_z_level(S, filled_with_space = TRUE, contain_turfs = contain_turfs) generate_linkages_for_z_level(new_z) calculate_z_level_gravity(new_z) adding_new_zlevel = FALSE diff --git a/code/modules/mechcomp/mcobjects/messaging/button.dm b/code/modules/mechcomp/mcobjects/messaging/button.dm index 2d6b169339d7..9c851003e285 100644 --- a/code/modules/mechcomp/mcobjects/messaging/button.dm +++ b/code/modules/mechcomp/mcobjects/messaging/button.dm @@ -9,7 +9,7 @@ . = ..() if(.) return - flick(icon_down, src) + z_flick(icon_down, src) fire(stored_message) log_message("triggered by [key_name(user)]", LOG_MECHCOMP) return TRUE diff --git a/code/modules/mechcomp/mcobjects/messaging/hand_scanner.dm b/code/modules/mechcomp/mcobjects/messaging/hand_scanner.dm index ab4cd5b53db5..ef22510b1fac 100644 --- a/code/modules/mechcomp/mcobjects/messaging/hand_scanner.dm +++ b/code/modules/mechcomp/mcobjects/messaging/hand_scanner.dm @@ -18,8 +18,8 @@ var/mob/living/carbon/human/H = user add_fingerprint(H) //playsoundhere - flick("comp_hscan1", src) - fire(md5(H.dna.unique_identity)) + z_flick("comp_hscan1", src) + fire(H.get_fingerprints(hand = H.get_active_hand())) log_message("scanned [key_name(user)]", LOG_MECHCOMP) return TRUE diff --git a/code/modules/mechcomp/mcobjects/messaging/microphone.dm b/code/modules/mechcomp/mcobjects/messaging/microphone.dm index 95943d024a7d..ee4d92b05518 100644 --- a/code/modules/mechcomp/mcobjects/messaging/microphone.dm +++ b/code/modules/mechcomp/mcobjects/messaging/microphone.dm @@ -14,7 +14,7 @@ lose_hearing_sensitivity() return ..() -/obj/item/mcobject/messaging/microphone/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc) +/obj/item/mcobject/messaging/microphone/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) . = ..() if(!anchored) return diff --git a/code/modules/mechcomp/mcobjects/messaging/radio_scanner.dm b/code/modules/mechcomp/mcobjects/messaging/radio_scanner.dm index 2915cc26067a..e8fcda13ac63 100644 --- a/code/modules/mechcomp/mcobjects/messaging/radio_scanner.dm +++ b/code/modules/mechcomp/mcobjects/messaging/radio_scanner.dm @@ -37,7 +37,6 @@ to_chat(user, span_notice("You set [src]'s frequency to [format_frequency(frequency)].")) return TRUE -/obj/item/mcobject/messaging/radioscanner/proc/incoming_message(datum/source, atom/movable/speaker, message, freq_num) +/obj/item/mcobject/messaging/radioscanner/proc/incoming_message(datum/source, atom/movable/speaker, message, freq_num, list/data) SIGNAL_HANDLER - fire("name=[speaker.GetVoice()]&message=[message]") //mimic list2params diff --git a/code/modules/mechcomp/mcobjects/messaging/relay.dm b/code/modules/mechcomp/mcobjects/messaging/relay.dm index 722db17c001b..2c7f839370cf 100644 --- a/code/modules/mechcomp/mcobjects/messaging/relay.dm +++ b/code/modules/mechcomp/mcobjects/messaging/relay.dm @@ -24,7 +24,7 @@ . += span_notice("Message Replacement is [replace_message ? "on" : "off"].") /obj/item/mcobject/messaging/relay/proc/relay(datum/mcmessage/input) - flick("[anchored ? "u":""]comp_relay1", src) + z_flick("[anchored ? "u":""]comp_relay1", src) if(replace_message) fire(stored_message, input) else diff --git a/code/modules/meteors/meteors.dm b/code/modules/meteors/meteors.dm index 0d3f7bfcfc4a..ed9cd79ffe00 100644 --- a/code/modules/meteors/meteors.dm +++ b/code/modules/meteors/meteors.dm @@ -174,13 +174,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust=1)) //for space dust eve thing.visible_message(span_warning("[src] slams into [thing]."), span_userdanger("[src] slams into you!.")) //then, ram the turf - switch(hitpwr) - if(EXPLODE_DEVASTATE) - SSexplosions.highturf += T - if(EXPLODE_HEAVY) - SSexplosions.medturf += T - if(EXPLODE_LIGHT) - SSexplosions.lowturf += T + EX_ACT(T, hitpwr) //process getting 'hit' by colliding with a dense object //or randomly when ramming turfs diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index ec06b4a3330e..428f7fbafb31 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -30,7 +30,7 @@ if(locked) to_chat(user, span_notice("The crate is locked with a Deca-code lock.")) var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text|null - if(user.canUseTopic(src, BE_CLOSE) && locked) + if(user.canUseTopic(src, USE_CLOSE|USE_LITERACY) && locked) var/list/sanitised = list() var/sanitycheck = TRUE var/char = "" @@ -63,7 +63,7 @@ return ..() /obj/structure/closet/crate/secure/loot/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return return attack_hand(user) //this helps you not blow up so easily by overriding unlocking which results in an immediate boom. @@ -170,7 +170,6 @@ if(57 to 58) new /obj/item/toy/balloon/syndicate(src) if(59 to 60) - new /obj/item/borg/upgrade/modkit/aoe/mobs(src) new /obj/item/clothing/suit/space(src) new /obj/item/clothing/head/helmet/space(src) if(61 to 62) @@ -204,9 +203,7 @@ new /obj/item/defibrillator/compact(src) if(87) //1% chance new /obj/item/weed_extract(src) - if(88) - new /obj/item/reagent_containers/food/drinks/bottle/lizardwine(src) - if(89) + if(88 to 89) new /obj/item/melee/energy/sword/bananium(src) if(90) new /obj/item/dnainjector/wackymut(src) @@ -233,8 +230,8 @@ new /obj/item/clothing/mask/balaclava(src) new /obj/item/gun/ballistic/shotgun/toy(src) new /obj/item/gun/ballistic/automatic/pistol/toy(src) - new /obj/item/gun/ballistic/automatic/toy/unrestricted(src) - new /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted(src) + new /obj/item/gun/ballistic/automatic/toy(src) + new /obj/item/gun/ballistic/automatic/l6_saw/toy(src) new /obj/item/ammo_box/foambox(src) if(98) for(var/i in 1 to 3) diff --git a/code/modules/mining/asteroid/asteroid_generation.dm b/code/modules/mining/asteroid/asteroid_generation.dm new file mode 100644 index 000000000000..426f560a7f99 --- /dev/null +++ b/code/modules/mining/asteroid/asteroid_generation.dm @@ -0,0 +1,117 @@ +/datum/controller/subsystem/mapping/proc/generate_asteroid(datum/mining_template/template, datum/callback/asteroid_generator) + Master.StartLoadingMap() + + SSatoms.map_loader_begin(REF(template)) + var/list/turfs = asteroid_generator.Invoke() + template.Populate(turfs.Copy()) + SSatoms.map_loader_stop(REF(template)) + + var/list/atoms = list() + // Initialize all of the atoms in the asteroid + for(var/turf/T as anything in turfs) + atoms += T + atoms += T.contents + + SSatoms.InitializeAtoms(atoms) + for(var/turf/T as turf in turfs) + T.AfterChange(CHANGETURF_IGNORE_AIR) + Master.StopLoadingMap() + + template.AfterInitialize(atoms) + +/// Sanitizes a block of turfs to prevent writing over undesired locations +/proc/ReserveTurfsForAsteroidGeneration(turf/center, size, baseturf_only = TRUE) + . = list() + + for(var/turf/T as anything in RANGE_TURFS(size, center)) + if(baseturf_only && !islevelbaseturf(T)) + continue + if(!(istype(T.loc, /area/station/cargo/mining/asteroid_magnet))) + continue + . += T + CHECK_TICK + +/// Generates a circular asteroid. +/proc/GenerateRoundAsteroid(datum/mining_template/template, turf/center = template.center, initial_turf_path = /turf/closed/mineral/asteroid/tospace, size = template.size || 6, list/turfs, hollow = FALSE) + . = list() + if(!length(turfs)) + return list() + + if(template) + center = template.center + size = template.size + + size = size + 2 //This is just for generating "smoother" asteroids, it will not go out of reservation space. + + if (hollow) + center = center.ChangeTurf(/turf/open/misc/asteroid/airless/tospace, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + else + center = center.ChangeTurf(initial_turf_path, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + GENERATOR_CHECK_TICK + + . += center + + var/corner_range = round(size * 1.5) + var/total_distance = 0 + var/current_dist_from_center = 0 + + for (var/turf/current_turf in turfs) + GENERATOR_CHECK_TICK + + current_dist_from_center = get_dist(center, current_turf) + + total_distance = abs(center.x - current_turf.x) + abs(center.y - current_turf.y) + (current_dist_from_center / 2) + // Keep us round + if (total_distance > corner_range) + continue + + if (hollow && total_distance < size / 2) + var/turf/T = locate(current_turf.x, current_turf.y, current_turf.z) + T = T.ChangeTurf(/turf/open/misc/asteroid/airless/tospace, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + . += T + + else + var/turf/T = locate(current_turf.x, current_turf.y, current_turf.z) + T = T.ChangeTurf(initial_turf_path, flags = (CHANGETURF_DEFER_CHANGE|CHANGETURF_DEFAULT_BASETURF)) + GENERATOR_CHECK_TICK + . += T + + return . + +/proc/InsertAsteroidMaterials(datum/mining_template/template, list/turfs, vein_count, rarity_modifier, list/determined_ore) + var/list/viable_turfs = list() + for(var/turf/closed/mineral/asteroid/A in turfs) + viable_turfs += A + + while(vein_count > 0 && length(viable_turfs)) + vein_count-- + GENERATOR_CHECK_TICK + + var/list/ore_pool + var/datum/ore/chosen_ore + + if(!length(determined_ore)) + var/rarity = rand(1, 100) + rarity_modifier + switch(rarity) + if(90 to 100) + ore_pool = SSmaterials.rare_ores + if(50 to 89) + ore_pool = SSmaterials.uncommon_ores + else + ore_pool = SSmaterials.common_ores + + chosen_ore = pick(ore_pool) + + else + chosen_ore = pick_n_take(determined_ore) + + var/turfs_in_vein = rand(chosen_ore.turfs_per_vein_min, chosen_ore.turfs_per_vein_max) + var/mats_per_turf = rand(chosen_ore.amount_per_turf_min, chosen_ore.amount_per_turf_max) + + while(turfs_in_vein > 0 && length(viable_turfs)) + GENERATOR_CHECK_TICK + turfs_in_vein-- + var/turf/closed/mineral/asteroid/A = pick_n_take(viable_turfs) + // We dont use change_ore() here because the turf isn't initialized and will do it anyway + A.mineralType = chosen_ore + A.mineralAmt = mats_per_turf diff --git a/code/modules/mining/asteroid/asteroid_magnet.dm b/code/modules/mining/asteroid/asteroid_magnet.dm new file mode 100644 index 000000000000..3c8e6585ef6a --- /dev/null +++ b/code/modules/mining/asteroid/asteroid_magnet.dm @@ -0,0 +1,407 @@ +#define STATUS_OKAY "OK" +#define MAX_COLLISIONS_BEFORE_ABORT 10 + +/obj/machinery/asteroid_magnet + name = "asteroid magnet computer" + desc = "Control panel for the asteroid magnet." + icon_state = "blackbox" + resistance_flags = INDESTRUCTIBLE + use_power = NO_POWER_USE + + /// Templates available to succ in + var/list/datum/mining_template/available_templates + /// All templates in the "map". + var/list/datum/mining_template/templates_on_map + /// The map that stores asteroids + var/datum/cartesian_plane/map + /// The currently selected template + var/datum/mining_template/selected_template + + /// Center turf X, set in mapping + VAR_PRIVATE/center_x = 0 + /// Center turf Y, set in mapping + VAR_PRIVATE/center_y = 0 + /// The center turf + VAR_PRIVATE/turf/center_turf + /// The size (chebyshev) of the available area, set in mapping + var/area_size = 0 + + var/coords_x = 0 + var/coords_y = 0 + + var/ping_result = "N/A
...
" + + /// Status of the user interface + var/status = STATUS_OKAY + /// Boolean to keep track of state and protect against double summoning + var/summon_in_progress = FALSE + + /// The cooldown between uses. + COOLDOWN_DECLARE(summon_cd) + +/obj/machinery/asteroid_magnet/Initialize(mapload) + . = ..() + if(mapload) + if(!center_x || !center_y) + stack_trace("Asteroid magnet does not have X or Y coordinates, deleting.") + return INITIALIZE_HINT_QDEL + + if(!area_size) + stack_trace("Asteroid magnet does not have a valid size, deleting.") + return INITIALIZE_HINT_QDEL + + center_turf = locate(center_x, center_y, z) + available_templates = list() + templates_on_map = list() + + GenerateMap() + +/obj/machinery/asteroid_magnet/Topic(href, href_list) + . = ..() + if(.) + return + + var/list/map_offsets = map.return_offsets() + var/list/map_bounds = map.return_bounds() + var/value = text2num(href_list["x"] || href_list["y"]) + if(!isnull(value)) // round(null) = 0 + value = round(value, 1) + if("x" in href_list) + coords_x = WRAP(coords_x + map_offsets[1] + value, map_bounds[1] + map_offsets[1], map_bounds[2] + map_offsets[1]) + coords_x -= map_offsets[1] + updateUsrDialog() + + else if("y" in href_list) + coords_y = WRAP(coords_y + map_offsets[2] + value, map_bounds[3] + map_offsets[2], map_bounds[4] + map_offsets[2]) + coords_y -= map_offsets[2] + updateUsrDialog() + return + + if(href_list["ping"]) + ping(coords_x, coords_y) + updateUsrDialog() + return + + if(href_list["select"]) + var/datum/mining_template/T = locate(href_list["select"]) in available_templates + if(!T) + return + selected_template = T + updateUsrDialog() + return + + if(href_list["summon_selected"]) + summon_sequence(selected_template) + return + +/obj/machinery/asteroid_magnet/ui_interact(mob/user, datum/tgui/ui) + var/content = list() + + content += {" +
+
+ + Magnet Controls + + "} + + // X selector + content += {" +
+ + X-Axis + +
+
[button_element(src, "-100", "x=-100")]
+
[button_element(src, "-10", "x=-10")]
+
[button_element(src, "-1", "x=-1")]
+
+ [coords_x] +
+
[button_element(src, "1", "x=1")]
+
[button_element(src, "10", "x=10")]
+
[button_element(src, "100", "x=100")]
+ --- +
+
+ "} + + // Y selector + content += {" +
+ + Y-Axis + +
+
[button_element(src, "-100", "y=-100")]
+
[button_element(src, "-10", "y=-10")]
+
[button_element(src, "-1", "y=-1")]
+
+ [coords_y] +
+
[button_element(src, "1", "y=1")]
+
[button_element(src, "10", "y=10")]
+
[button_element(src, "100", "y=100")]
+ --- +
+
+ "} + + // Ping button + content += {" +
+ + Ping + +
+ [ping_result] +
+
+ [button_element(src, "PING", "ping=1")] +
+
+ "} + + // Summoner + content += {" +
+ + Summon + +
+ [status] +
+
+ [button_element(src, "SUMMON", "summon_selected=1")] +
+
+ "} + + // Close coordinates fieldset + content += "
" + + // Asteroids list fieldset + content += {" +
+ + Celestial Bodies + + "} + // Selected asteroid container + var/asteroid_name + var/asteroid_desc + if(selected_template) + asteroid_name = selected_template.name + asteroid_desc = jointext(selected_template.get_description(), "") + + content += {" +
+
+ [asteroid_name || "N/A"] +
+ [asteroid_desc ? "
[asteroid_desc]
" : "
N/A
"] +
+ "} + + // Asteroid list container + content += {" +
+ "} + + var/i = 0 + for(var/datum/mining_template/template as anything in available_templates) + i++ + var/bg_color = i % 2 == 0 ? "#7c5500" : "#533200" + if(selected_template == template) + bg_color = "#e67300 !important" + content += {" +
+ [template.name] ([template.x], [template.y]) +
+ "} + + content += "
" + + content += {" + + "} + + + var/datum/browser/popup = new(user, "asteroidmagnet", name, 920, 475) + popup.set_content(jointext(content,"")) + popup.set_window_options("can_close=1;can_minimize=1;can_maximize=0;can_resize=1;titlebar=1;") + popup.open() + +/obj/machinery/asteroid_magnet/proc/ping(coords_x, coords_y) + var/datum/mining_template/T = map.return_coordinate(coords_x, coords_y) + if(T && !T.found) + T.found = TRUE + available_templates |= T + templates_on_map -= T + ping_result = "LOCATED" + return + + var/datum/mining_template/closest + var/lowest_dist = INFINITY + for(var/datum/mining_template/asteroid as anything in templates_on_map) + // Get the euclidean distance between the ping and the asteroid. + var/dist = sqrt(((asteroid.x - coords_x) ** 2) + ((asteroid.y - coords_y) ** 2)) + if(dist < lowest_dist) + closest = asteroid + lowest_dist = dist + + if(closest) + var/dx = closest.x - coords_x + var/dy = closest.y - coords_y + // Get the angle as 0 - 180 degrees + var/angle = arccos(dy / sqrt((dx ** 2) + (dy ** 2))) + if(dx < 0) // If the X-axis distance is negative, put it between 181 and 359. 180 and 360/0 are impossible, as that requires X == 0. + angle = 360 - angle + + ping_result = "AZIMUTH
[round(angle, 0.01)]" + else + ping_result = "ERR" + +/// Test to see if we should clear the magnet area. +/// Returns FALSE if it can clear, returns a string error message if it can't. +/obj/machinery/asteroid_magnet/proc/check_for_magnet_errors(datum/mining_template/template) + . = FALSE + if(summon_in_progress) + return GLOB.magnet_error_codes[MAGNET_ERROR_KEY_BUSY] + + if(!COOLDOWN_FINISHED(src, summon_cd)) + return GLOB.magnet_error_codes[MAGNET_ERROR_KEY_COOLDOWN] + + if(isnull(template)) + return GLOB.magnet_error_codes[MAGNET_ERROR_KEY_NO_COORD] + + if(template.summoned) + return GLOB.magnet_error_codes[MAGNET_ERROR_KEY_USED_COORD] + + for(var/mob/M as mob in range(area_size + 1, center_turf)) + if(isliving(M)) + return GLOB.magnet_error_codes[MAGNET_ERROR_KEY_MOB] + +/// Performs a full summoning sequence, including putting up boundaries, clearing out the area, and bringing in the new asteroid. +/obj/machinery/asteroid_magnet/proc/summon_sequence(datum/mining_template/template) + var/magnet_error = check_for_magnet_errors(template) + if(magnet_error) + status = magnet_error + updateUsrDialog() + return + + var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) + + summon_in_progress = TRUE + A.area_flags |= NOTELEPORT // We dont want people getting nuked during the generation sequence + status = "Summoning[ellipsis()]" + available_templates -= template + updateUsrDialog() + + var/time = world.timeofday + var/list/forcefields = PlaceForcefield() + CleanupTemplate() + PlaceTemplate(template) + + /// This process should take ATLEAST 20 seconds + time = (world.timeofday + 20 SECONDS) - time + if(time > 0) + addtimer(CALLBACK(src, PROC_REF(_FinishSummonSequence), template, forcefields), time) + else + _FinishSummonSequence(template, forcefields) + return + +/obj/machinery/asteroid_magnet/proc/_FinishSummonSequence(datum/mining_template/template, list/forcefields) + QDEL_LIST(forcefields) + + var/area/station/cargo/mining/asteroid_magnet/A = get_area(center_turf) + A.area_flags &= ~NOTELEPORT // Annnnd done + summon_in_progress = FALSE + template.summoned = TRUE + COOLDOWN_START(src, summon_cd, 1 MINUTE) + + status = STATUS_OKAY + updateUsrDialog() + +/// Summoning part of summon_sequence() +/obj/machinery/asteroid_magnet/proc/PlaceTemplate(datum/mining_template/template) + PRIVATE_PROC(TRUE) + template.Generate() + +/// Places the forcefield boundary during summon_sequence +/obj/machinery/asteroid_magnet/proc/PlaceForcefield() + PRIVATE_PROC(TRUE) + . = list() + var/list/turfs = RANGE_TURFS(area_size, center_turf) ^ RANGE_TURFS(area_size + 1, center_turf) + for(var/turf/T as anything in turfs) + . += new /obj/effect/forcefield/asteroid_magnet(T) + + +/// Cleanup our currently loaded mining template +/obj/machinery/asteroid_magnet/proc/CleanupTemplate() + PRIVATE_PROC(TRUE) + + var/list/turfs_to_destroy = ReserveTurfsForAsteroidGeneration(center_turf, area_size, baseturf_only = FALSE) + for(var/turf/T as anything in turfs_to_destroy) + CHECK_TICK + + for(var/atom/movable/AM as anything in T) + CHECK_TICK + if(isdead(AM) || iscameramob(AM) || iseffect(AM) || !(ismob(AM) || isobj(AM))) + continue + qdel(AM) + + T.ChangeTurf(/turf/baseturf_bottom) + + +/// Generates the random map for the magnet. +/obj/machinery/asteroid_magnet/proc/GenerateMap() + PRIVATE_PROC(TRUE) + map = new(-100, 100, -100, 100) + + // Generate common templates + for(var/i in 1 to 12) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_COMMON]"])) + + /* + // Generate uncommon templates + for(var/i in 1 to 4) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_UNCOMMON]"])) + + // Generate rare templates + for(var/i in 1 to 2) + InsertTemplateToMap(pick(SSmaterials.template_paths_by_rarity["[MINING_RARE]"])) + */ + +/obj/machinery/asteroid_magnet/proc/InsertTemplateToMap(path) + PRIVATE_PROC(TRUE) + + var/collisions = 0 + var/datum/mining_template/template + var/x + var/y + + template = new path(center_turf, area_size) + template.randomize() + templates_on_map += template + + do + x = rand(-100, 100) + y = rand(-100, 100) + + if(map.return_coordinate(x, y)) + collisions++ + else + map.set_coordinate(x, y, template) + template.x = x + template.y = y + break + + while (collisions <= MAX_COLLISIONS_BEFORE_ABORT) + +#undef MAX_COLLISIONS_BEFORE_ABORT +#undef STATUS_OKAY diff --git a/code/modules/mining/asteroid/asteroid_templates.dm b/code/modules/mining/asteroid/asteroid_templates.dm new file mode 100644 index 000000000000..7aa4ce3c5a61 --- /dev/null +++ b/code/modules/mining/asteroid/asteroid_templates.dm @@ -0,0 +1,45 @@ +/datum/mining_template + abstract_type = /datum/mining_template + var/name = "PLACEHOLDER NAME" + var/rarity = MINING_NO_RANDOM_SPAWN + var/randomly_appear = FALSE + /// The size (radius, chebyshev distance). Will be clamped to the size of the asteroid magnet in New(). + var/size = 7 + /// The center turf. + var/turf/center + + // Asteroid Map location + var/x + var/y + + /// Has this template been located by players? + var/found = FALSE + /// Has this template been summoned? + var/summoned = FALSE + +/datum/mining_template/New(center, max_size) + . = ..() + src.center = center + if(size) + size = max(size, max_size) + +/// Randomize the data of this template. Does not change size, center, or location. +/datum/mining_template/proc/randomize() + return + +/// The proc to call to completely generate an asteroid +/datum/mining_template/proc/Generate() + return + +/// Called during SSmapping.generate_asteroid(). Here is where you mangle the geometry provided by the asteroid generator function. +/// Atoms at this stage are NOT initialized +/datum/mining_template/proc/Populate(list/turfs) + return + +/// Called during SSmapping.generate_asteroid() after all atoms have been initialized. +/datum/mining_template/proc/AfterInitialize(list/atoms) + return + +/// Called by an asteroid magnet to return a description as a list of bullets +/datum/mining_template/proc/get_description() + return list() diff --git a/code/modules/mining/asteroid/ore_datums.dm b/code/modules/mining/asteroid/ore_datums.dm new file mode 100644 index 000000000000..26ae4825ae01 --- /dev/null +++ b/code/modules/mining/asteroid/ore_datums.dm @@ -0,0 +1,168 @@ +/datum/ore + abstract_type = /datum/ore + + var/name = "" + /// The typepath of the stack dropped when mined + var/stack_path = null + + /// Icon state for the scan overlay + var/scan_state + + /// Rarity + var/rarity = MINING_NO_RANDOM_SPAWN + + // How many turfs per spawn trigger should this ore occupy + var/turfs_per_vein_min = 0 + var/turfs_per_vein_max = 0 + + // How many sheets are dropped per turf + var/amount_per_turf_min = 0 + var/amount_per_turf_max = 0 + + /// How much mining health to give to the turfs. + var/mining_health = 0 + /// The chance to spread during spread_vein() + var/spread_chance = 0 + +/datum/ore/Destroy(force, ...) + if(!force) + stack_trace("Something is trying to delete an ore datum, these are singletons!") + return QDEL_HINT_LETMELIVE + return ..() + + +// -=~* COMMON ORES *~=- +/datum/ore/iron + name = "Iron" + stack_path = /obj/item/stack/ore/iron + scan_state = "rock_Iron" + + rarity = MINING_COMMON + + turfs_per_vein_min = 6 + turfs_per_vein_max = 16 + + amount_per_turf_min = 3 + amount_per_turf_max = 6 + + mining_health = 60 + spread_chance = 60 + +/datum/ore/silver + name = "Silver" + stack_path = /obj/item/stack/ore/silver + scan_state = "rock_Silver" + + rarity = MINING_COMMON + + turfs_per_vein_min = 4 + turfs_per_vein_max = 8 + + amount_per_turf_min = 4 + amount_per_turf_max = 12 + + mining_health = 80 + spread_chance = 20 + +/datum/ore/gold + name = "Gold" + stack_path = /obj/item/stack/ore/gold + scan_state = "rock_Gold" + + rarity = MINING_COMMON + + turfs_per_vein_min = 4 + turfs_per_vein_max = 8 + + amount_per_turf_min = 4 + amount_per_turf_max = 8 + + mining_health = 100 + spread_chance = 5 + +/datum/ore/diamond + name = "Diamond" + stack_path = /obj/item/stack/ore/diamond + scan_state = "rock_Diamond" + + rarity = MINING_UNCOMMON + + turfs_per_vein_min = 4 + turfs_per_vein_max = 8 + + amount_per_turf_min = 4 + amount_per_turf_max = 8 + + mining_health = 100 + spread_chance = 5 + +/datum/ore/uranium + name = "Uranium" + stack_path = /obj/item/stack/ore/uranium + scan_state = "rock_Uranium" + + rarity = MINING_RARE + + turfs_per_vein_min = 1 + turfs_per_vein_max = 2 + + amount_per_turf_min = 8 + amount_per_turf_max = 16 + + mining_health = 100 + spread_chance = 0 + +/datum/ore/plasma + name = "Plasma" + stack_path = /obj/item/stack/ore/plasma + scan_state = "rock_Plasma" + + rarity = MINING_RARE + + turfs_per_vein_min = 2 + turfs_per_vein_max = 4 + + amount_per_turf_min = 4 + amount_per_turf_max = 8 + + mining_health = 100 + spread_chance = 0 + +/datum/ore/titanium + name = "Titanium" + stack_path = /obj/item/stack/ore/titanium + scan_state = "rock_Titanium" + + rarity = MINING_RARE + + turfs_per_vein_min = 2 + turfs_per_vein_max = 4 + + amount_per_turf_min = 8 + amount_per_turf_max = 16 + + mining_health = 100 + spread_chance = 0 + +/datum/ore/bananium + name = "Bananium" + stack_path = /obj/item/stack/ore/bananium + scan_state = "rock_Bananium" + + rarity = MINING_NO_RANDOM_SPAWN + + amount_per_turf_min = 8 + amount_per_turf_max = 16 + + mining_health = 100 + +/datum/ore/bluespace_crystal + name = "Stupid Shit" + stack_path = /obj/item/stack/ore/bluespace_crystal + scan_state = "rock_Bluespace" + rarity = MINING_NO_RANDOM_SPAWN + + amount_per_turf_min = 8 + amount_per_turf_max = 16 + + mining_health = 100 diff --git a/code/modules/mining/asteroid/templates/simple_asteroid.dm b/code/modules/mining/asteroid/templates/simple_asteroid.dm new file mode 100644 index 000000000000..23688a59c7c5 --- /dev/null +++ b/code/modules/mining/asteroid/templates/simple_asteroid.dm @@ -0,0 +1,78 @@ +/datum/mining_template/simple_asteroid + abstract_type = /datum/mining_template/simple_asteroid + + name = "Asteroid" + rarity = -1 + size = 3 + + var/is_hollow = FALSE + +/datum/mining_template/simple_asteroid/randomize() + . = ..() + is_hollow = prob(15) + +/datum/mining_template/simple_asteroid/get_description() + . = ..() + if(is_hollow) + . += "
> HOLLOW
" + +/datum/mining_template/simple_asteroid/Generate() + var/list/turfs = ReserveTurfsForAsteroidGeneration(center, size) + var/datum/callback/asteroid_cb = CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(GenerateRoundAsteroid), src, center, /turf/closed/mineral/asteroid/tospace, null, turfs, is_hollow) + SSmapping.generate_asteroid(src, asteroid_cb) + +/datum/mining_template/simple_asteroid/Populate(list/turfs) + InsertAsteroidMaterials(src, turfs, rand(2, 6), rand(0, 30)) + +/// An asteroid with predetermined material makeup +/datum/mining_template/simple_asteroid/seeded + rarity = MINING_COMMON + + /// How many ore veins will we generate + var/vein_count = 0 + /// Predetermined ore makeup + var/list/determined_ore = list() + + /// An offset vein count for the description + var/vein_approximation = 0 + /// The most abundant material, used for description + var/highest_material_makeup + +/datum/mining_template/simple_asteroid/seeded/randomize() + . = ..() + vein_count = rand(2,6) + vein_approximation = max(vein_count + rand(-1, 2), 1) + + SeedOre() + + var/list/datum/ore/ore_appearances = list() + for(var/datum/ore/O as anything in determined_ore) + UNLINT(ore_appearances[O]++) + + sortTim(ore_appearances, GLOBAL_PROC_REF(cmp_numeric_asc), TRUE) + + highest_material_makeup = uppertext(ore_appearances[1].name) + +/// Set our weighted_ores list +/datum/mining_template/simple_asteroid/seeded/proc/SeedOre() + PRIVATE_PROC(TRUE) + + var/list/ore_pool + for(var/i in 1 to vein_count) + switch(rand(1, 100)) + if(90 to 100) + ore_pool = SSmaterials.rare_ores + if(50 to 89) + ore_pool = SSmaterials.uncommon_ores + else + ore_pool = SSmaterials.common_ores + + determined_ore += pick(ore_pool) + +/datum/mining_template/simple_asteroid/seeded/get_description() + . = ..() + . += "
> APPROX. VEIN COUNT > [vein_approximation]
" + . += "
> HIGH DENSITY > [highest_material_makeup]
" + +/datum/mining_template/simple_asteroid/seeded/Populate(list/turfs) + InsertAsteroidMaterials(src, turfs, vein_count, determined_ore = determined_ore) diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm deleted file mode 100644 index 296bf5321d1d..000000000000 --- a/code/modules/mining/aux_base.dm +++ /dev/null @@ -1,446 +0,0 @@ -///Mining Base//// - -#define ZONE_SET 0 -#define BAD_ZLEVEL 1 -#define BAD_AREA 2 -#define BAD_COORDS 3 -#define BAD_TURF 4 - -/area/shuttle/auxiliary_base - name = "Auxiliary Base" - luminosity = 0 //Lighting gets lost when it lands anyway - -/obj/machinery/computer/auxiliary_base - name = "auxiliary base management console" - desc = "Allows a deployable expedition base to be dropped from the station to a designated mining location. It can also \ - interface with the mining shuttle at the landing site if a mobile beacon is also deployed." - icon = 'icons/obj/terminals.dmi' - icon_state = "dorm_available" - icon_keyboard = null - req_one_access = list(ACCESS_AUX_BASE, ACCESS_HEADS) - circuit = /obj/item/circuitboard/computer/auxiliary_base - /// Shuttle ID of the base - var/shuttleId = "colony_drop" - /// If we give warnings before base is launched - var/launch_warning = TRUE - /// List of connected turrets - var/list/datum/weakref/turrets - /// List of all possible destinations - var/possible_destinations - /// ID of the currently selected destination of the attached base - var/destination - /// If blind drop option is available - var/blind_drop_ready = TRUE - - density = FALSE //this is a wallmount - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/computer/auxiliary_base, 32) - -/obj/machinery/computer/auxiliary_base/Initialize(mapload) - . = ..() - AddComponent(/datum/component/gps, "NT_AUX") - -/obj/machinery/computer/auxiliary_base/Destroy() // Shouldn't be destroyable... but just in case - LAZYCLEARLIST(turrets) - return ..() - -/obj/machinery/computer/auxiliary_base/ui_interact(mob/user, datum/tgui/ui) - . = ..() - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AuxBaseConsole", name) - ui.open() - -/obj/machinery/computer/auxiliary_base/ui_data(mob/user) - var/list/data = list() - var/list/options = params2list(possible_destinations) - var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId) - data["type"] = shuttleId == "colony_drop" ? "base" : "shuttle" - data["docked_location"] = M ? M.get_status_text_tgui() : "Unknown" - data["locations"] = list() - data["locked"] = FALSE - data["timer_str"] = M ? M.getTimerStr() : "00:00" - data["destination"] = destination - data["blind_drop"] = blind_drop_ready - data["turrets"] = list() - for(var/datum/weakref/turret_ref as anything in turrets) - var/obj/machinery/porta_turret/aux_base/base_turret = turret_ref.resolve() - if(!istype(base_turret)) // null or invalid in turrets list? axe it - LAZYREMOVE(turrets, turret_ref) - continue - - var/turret_integrity = max((base_turret.get_integrity() - base_turret.integrity_failure * base_turret.max_integrity) / (base_turret.max_integrity - base_turret.integrity_failure * max_integrity) * 100, 0) - var/turret_status - if(base_turret.machine_stat & BROKEN) - turret_status = "ERROR" - else if(!base_turret.on) - turret_status = "Disabled" - else if(base_turret.raised) - turret_status = "Firing" - else - turret_status = "All Clear" - var/list/turret_data = list( - name = base_turret.name, - integrity = turret_integrity, - status = turret_status, - direction = dir2text(get_dir(src, base_turret)), - distance = get_dist(src, base_turret), - ref = REF(base_turret) - ) - data["turrets"] += list(turret_data) - if(!M) - data["status"] = "Missing" - return data - switch(M.mode) - if(SHUTTLE_IGNITING) - data["status"] = "Igniting" - if(SHUTTLE_IDLE) - data["status"] = "Idle" - if(SHUTTLE_RECHARGING) - data["status"] = "Recharging" - else - data["status"] = "In Transit" - for(var/obj/docking_port/stationary/S in SSshuttle.stationary_docking_ports) - if(!options.Find(S.port_destinations)) - continue - if(!M.check_dock(S, silent = TRUE)) - continue - var/list/location_data = list( - id = S.id, - name = S.name - ) - data["locations"] += list(location_data) - if(length(data["locations"]) == 1) - for(var/location in data["locations"]) - destination = location["id"] - data["destination"] = destination - if(!length(data["locations"])) - data["locked"] = TRUE - data["status"] = "Locked" - return data - -/** - * Checks if we are allowed to launch the base - * - * Arguments: - * * user - The mob trying to initiate the launch - */ -/obj/machinery/computer/auxiliary_base/proc/launch_check(mob/user) - if(!is_station_level(z) && shuttleId == "colony_drop") - to_chat(user, span_warning("You can't move the base again!")) - return FALSE - return TRUE - -/obj/machinery/computer/auxiliary_base/ui_act(action, params) - . = ..() - if(.) - return - if(!allowed(usr)) - to_chat(usr, span_danger("Access denied.")) - return - - switch(action) - if("move") - if(!launch_check(usr)) - return - var/shuttle_error = SSshuttle.moveShuttle(shuttleId, params["shuttle_id"], 1) - if(launch_warning) - say("Launch sequence activated! Prepare for drop!!", spans = list("danger")) - playsound(loc, 'sound/machines/warning-buzzer.ogg', 70, FALSE) - launch_warning = FALSE - blind_drop_ready = FALSE - log_shuttle("[key_name(usr)] has launched the auxiliary base.") - return TRUE - else if(!shuttle_error) - say("Shuttle request uploaded. Please stand away from the doors.") - else - say("Shuttle interface failed.") - if("random") - if(possible_destinations) - return - usr.changeNext_move(CLICK_CD_RAPID) //Anti-spam - var/list/all_mining_turfs = list() - for(var/z_level in SSmapping.levels_by_trait(ZTRAIT_MINING)) - all_mining_turfs += Z_TURFS(z_level) - var/turf/LZ = pick(all_mining_turfs) //Pick a random mining Z-level turf - if(!ismineralturf(LZ) && !istype(LZ, /turf/open/misc/asteroid)) - //Find a suitable mining turf. Reduces chance of landing in a bad area - to_chat(usr, span_warning("Landing zone scan failed. Please try again.")) - return - if(set_landing_zone(LZ, usr) != ZONE_SET) - to_chat(usr, span_warning("Landing zone unsuitable. Please recalculate.")) - return - blind_drop_ready = FALSE - return TRUE - if("set_destination") - var/target_destination = params["destination"] - if(!target_destination) - return - destination = target_destination - return TRUE - if("turrets_power") - for(var/datum/weakref/turret_ref as anything in turrets) - var/obj/machinery/porta_turret/aux_base/base_turret = turret_ref.resolve() - if(!istype(base_turret)) // null or invalid in turrets list - LAZYREMOVE(turrets, turret_ref) - continue - - base_turret.toggle_on() - return TRUE - if("single_turret_power") - var/obj/machinery/porta_turret/aux_base/base_turret = locate(params["single_turret_power"]) - if(!istype(base_turret) || !(WEAKREF(base_turret) in turrets)) - return - - base_turret.toggle_on() - return TRUE - -/obj/machinery/computer/auxiliary_base/proc/set_mining_mode() - if(is_mining_level(z)) //The console switches to controlling the mining shuttle once landed. - req_one_access = list() - shuttleId = "mining" //The base can only be dropped once, so this gives the console a new purpose. - possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public" - -/obj/machinery/computer/auxiliary_base/proc/set_landing_zone(turf/T, mob/user, no_restrictions) - var/obj/docking_port/mobile/auxiliary_base/base_dock = locate(/obj/docking_port/mobile/auxiliary_base) in SSshuttle.mobile_docking_ports - if(!base_dock) //Not all maps have an Aux base. This object is useless in that case. - to_chat(user, span_warning("This station is not equipped with an auxiliary base. Please contact your contractor.")) - return - if(!no_restrictions) - var/static/list/disallowed_turf_types = zebra_typecacheof(list( - /turf/closed = TRUE, - /turf/open/lava = TRUE, - /turf/open/indestructible = TRUE, - /turf/closed/mineral = FALSE, - )) - - if(!is_mining_level(T.z)) - return BAD_ZLEVEL - - - var/list/colony_turfs = base_dock.return_ordered_turfs(T.x,T.y,T.z,base_dock.dir) - for(var/i in 1 to colony_turfs.len) - CHECK_TICK - var/turf/place = colony_turfs[i] - if(!place) - return BAD_COORDS - if(!istype(place.loc, /area/lavaland/surface)) - return BAD_AREA - if(disallowed_turf_types[place.type]) - return BAD_TURF - - - var/area/A = get_area(T) - - var/obj/docking_port/stationary/landing_zone = new /obj/docking_port/stationary(T) - landing_zone.id = "colony_drop([REF(src)])" - landing_zone.port_destinations = "colony_drop([REF(src)])" - landing_zone.name = "Landing Zone ([T.x], [T.y])" - landing_zone.dwidth = base_dock.dwidth - landing_zone.dheight = base_dock.dheight - landing_zone.width = base_dock.width - landing_zone.height = base_dock.height - landing_zone.setDir(base_dock.dir) - landing_zone.area_type = A.type - - possible_destinations += "[landing_zone.id];" - -//Serves as a nice mechanic to people get ready for the launch. - minor_announce("Auxiliary base landing zone coordinates locked in for [A]. Launch command now available!") - to_chat(user, span_notice("Landing zone set.")) - return ZONE_SET - -/obj/item/assault_pod/mining - name = "Landing Field Designator" - icon_state = "gangtool-purple" - inhand_icon_state = "electronic" - lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - desc = "Deploy to designate the landing zone of the auxiliary base." - w_class = WEIGHT_CLASS_SMALL - shuttle_id = "colony_drop" - var/setting = FALSE - var/no_restrictions = FALSE //Badmin variable to let you drop the colony ANYWHERE. - -/obj/item/assault_pod/mining/attack_self(mob/living/user) - if(setting) - return - - to_chat(user, span_notice("You begin setting the landing zone parameters...")) - setting = TRUE - if(!do_after(user, user, 50)) //You get a few seconds to cancel if you do not want to drop there. - setting = FALSE - return - setting = FALSE - - var/turf/T = get_turf(user) - var/obj/machinery/computer/auxiliary_base/AB - - for (var/obj/machinery/computer/auxiliary_base/A in GLOB.machines) - if(is_station_level(A.z)) - AB = A - break - if(!AB) - to_chat(user, span_warning("No auxiliary base console detected.")) - return - - switch(AB.set_landing_zone(T, user, no_restrictions)) - if(ZONE_SET) - qdel(src) - if(BAD_ZLEVEL) - to_chat(user, span_warning("This uplink can only be used in a designed mining zone.")) - if(BAD_AREA) - to_chat(user, span_warning("Unable to acquire a targeting lock. Find an area clear of structures or entirely within one.")) - if(BAD_COORDS) - to_chat(user, span_warning("Location is too close to the edge of the station's scanning range. Move several paces away and try again.")) - if(BAD_TURF) - to_chat(user, span_warning("The landing zone contains turfs unsuitable for a base. Make sure you've removed all walls and dangerous terrain from the landing zone.")) - -/obj/item/assault_pod/mining/unrestricted - name = "omni-locational landing field designator" - desc = "Allows the deployment of the mining base ANYWHERE. Use with caution." - no_restrictions = TRUE - - -/obj/docking_port/mobile/auxiliary_base - name = "auxiliary base" - id = "colony_drop" - //Reminder to map-makers to set these values equal to the size of your base. - dheight = 4 - dwidth = 4 - width = 9 - height = 9 - -/obj/docking_port/mobile/auxiliary_base/takeoff(list/old_turfs, list/new_turfs, list/moved_atoms, rotation, movement_direction, old_dock, area/underlying_old_area) - for(var/i in new_turfs) - var/turf/place = i - if(istype(place, /turf/closed/mineral)) - place.ScrapeAway() - return ..() - -/obj/docking_port/stationary/public_mining_dock - name = "public mining base dock" - id = "disabled" //The Aux Base has to leave before this can be used as a dock. - //Should be checked on the map to ensure it matchs the mining shuttle dimensions. - dwidth = 3 - width = 7 - height = 5 - area_type = /area/station/construction/mining/aux_base - -/obj/structure/mining_shuttle_beacon - name = "mining shuttle beacon" - desc = "A bluespace beacon calibrated to mark a landing spot for the mining shuttle when deployed near the auxiliary mining base." - anchored = FALSE - density = FALSE - var/shuttle_ID = "landing_zone_dock" - icon = 'icons/obj/objects.dmi' - icon_state = "miningbeacon" - var/obj/docking_port/stationary/Mport //Linked docking port for the mining shuttle - //pressure_resistance = 200 //So it does not get blown into lava. - var/anti_spam_cd = 0 //The linking process might be a bit intensive, so this here to prevent over use. - var/console_range = 15 //Wifi range of the beacon to find the aux base console - -/obj/structure/mining_shuttle_beacon/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(anchored) - to_chat(user, span_warning("Landing zone already set.")) - return - - if(anti_spam_cd) - to_chat(user, span_warning("[src] is currently recalibrating. Please wait.")) - return - - anti_spam_cd = 1 - addtimer(CALLBACK(src, PROC_REF(clear_cooldown)), 50) - - var/turf/landing_spot = get_turf(src) - - if(!is_mining_level(landing_spot.z)) - to_chat(user, span_warning("This device is only to be used in a mining zone.")) - return - var/obj/machinery/computer/auxiliary_base/aux_base_console - for(var/obj/machinery/computer/auxiliary_base/ABC in GLOB.machines) - if(get_dist(landing_spot, ABC) <= console_range) - aux_base_console = ABC - break - if(!aux_base_console) //Needs to be near the base to serve as its dock and configure it to control the mining shuttle. - to_chat(user, span_warning("The auxiliary base's console must be within [console_range] meters in order to interface.")) - return - -//Mining shuttles may not be created equal, so we find the map's shuttle dock and size accordingly. - for(var/S in SSshuttle.stationary_docking_ports) - var/obj/docking_port/stationary/SM = S //SM is declared outside so it can be checked for null - if(SM.id == "mining_home" || SM.id == "mining_away") - - var/area/A = get_area(landing_spot) - - Mport = new(landing_spot) - Mport.id = "landing_zone_dock" - Mport.port_destinations = "landing_zone_dock" - Mport.name = "auxiliary base landing site" - Mport.dwidth = SM.dwidth - Mport.dheight = SM.dheight - Mport.width = SM.width - Mport.height = SM.height - Mport.setDir(dir) - Mport.area_type = A.type - - break - if(!Mport) - to_chat(user, span_warning("This station is not equipped with an appropriate mining shuttle. Please contact Daedalus Support.")) - return - - var/obj/docking_port/mobile/mining_shuttle - var/list/landing_turfs = list() //List of turfs where the mining shuttle may land. - for(var/S in SSshuttle.mobile_docking_ports) - var/obj/docking_port/mobile/MS = S - if(MS.id != "mining") - continue - mining_shuttle = MS - landing_turfs = mining_shuttle.return_ordered_turfs(x,y,z,dir) - break - - if(!mining_shuttle) //Not having a mining shuttle is a map issue - to_chat(user, span_warning("No mining shuttle signal detected. Please contact Daedalus Support.")) - SSshuttle.stationary_docking_ports.Remove(Mport) - qdel(Mport) - return - - for(var/i in 1 to landing_turfs.len) //You land NEAR the base, not IN it. - var/turf/L = landing_turfs[i] - if(!L) //This happens at map edges - to_chat(user, span_warning("Unable to secure a valid docking zone. Please try again in an open area near, but not within the auxiliary mining base.")) - SSshuttle.stationary_docking_ports.Remove(Mport) - qdel(Mport) - return - if(istype(get_area(L), /area/shuttle/auxiliary_base)) - to_chat(user, span_warning("The mining shuttle must not land within the mining base itself.")) - SSshuttle.stationary_docking_ports.Remove(Mport) - qdel(Mport) - return - - if(mining_shuttle.canDock(Mport) != SHUTTLE_CAN_DOCK) - to_chat(user, span_warning("Unable to secure a valid docking zone. Please try again in an open area near, but not within the auxiliary mining base.")) - SSshuttle.stationary_docking_ports.Remove(Mport) - qdel(Mport) - return - - aux_base_console.set_mining_mode() //Lets the colony park the shuttle there, now that it has a dock. - to_chat(user, span_notice("Mining shuttle calibration successful! Shuttle interface available at base console.")) - set_anchored(TRUE) //Locks in place to mark the landing zone. - playsound(loc, 'sound/machines/ping.ogg', 50, FALSE) - log_shuttle("[key_name(usr)] has registered the mining shuttle beacon at [COORD(landing_spot)].") - -/obj/structure/mining_shuttle_beacon/proc/clear_cooldown() - anti_spam_cd = 0 - -/obj/structure/mining_shuttle_beacon/attack_robot(mob/user) - return attack_hand(user) //So borgies can help - -#undef ZONE_SET -#undef BAD_ZLEVEL -#undef BAD_AREA -#undef BAD_COORDS -#undef BAD_TURF diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm deleted file mode 100644 index f62cb22a0607..000000000000 --- a/code/modules/mining/equipment/explorer_gear.dm +++ /dev/null @@ -1,60 +0,0 @@ -/****************Explorer's Suit and Mask****************/ -/obj/item/clothing/suit/hooded/explorer - name = "explorer suit" - desc = "An armoured suit for exploring harsh environments." - icon_state = "explorer" - inhand_icon_state = "explorer" - body_parts_covered = CHEST|GROIN|LEGS|ARMS - cold_protection = CHEST|GROIN|LEGS|ARMS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = CHEST|GROIN|LEGS|ARMS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list(MELEE = 30, BULLET = 10, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 50, ACID = 50) - 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/recharge/kinetic_accelerator, /obj/item/pickaxe, /obj/item/storage/bag/ore) - resistance_flags = FIRE_PROOF - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION - -/obj/item/clothing/head/hooded/explorer - name = "explorer hood" - desc = "An armoured hood for exploring harsh environments." - icon_state = "explorer" - body_parts_covered = HEAD - flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS - cold_protection = HEAD - min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - armor = list(MELEE = 30, BULLET = 10, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 50, ACID = 50, WOUND = 10) - resistance_flags = FIRE_PROOF - supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION - -/obj/item/clothing/suit/hooded/explorer/Initialize(mapload) - . = ..() - AddComponent(/datum/component/armor_plate) - -/obj/item/clothing/head/hooded/explorer/Initialize(mapload) - . = ..() - AddComponent(/datum/component/armor_plate) - -/obj/item/clothing/mask/gas/explorer - name = "explorer gas mask" - desc = "A military-grade gas mask that can be connected to an air supply." - icon_state = "gas_mining" - visor_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS - visor_flags_inv = HIDEFACIALHAIR - visor_flags_cover = MASKCOVERSMOUTH - actions_types = list(/datum/action/item_action/adjust) - armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, FIRE = 20, ACID = 40, WOUND = 5) - resistance_flags = FIRE_PROOF - -/obj/item/clothing/mask/gas/explorer/attack_self(mob/user) - adjustmask(user) - -/obj/item/clothing/mask/gas/explorer/adjustmask(user) - ..() - w_class = mask_adjusted ? WEIGHT_CLASS_NORMAL : WEIGHT_CLASS_SMALL - -/obj/item/clothing/mask/gas/explorer/folded/Initialize(mapload) - . = ..() - adjustmask() diff --git a/code/modules/mining/equipment/kheiral_cuffs.dm b/code/modules/mining/equipment/kheiral_cuffs.dm index be04742736d6..8974aaf912a4 100644 --- a/code/modules/mining/equipment/kheiral_cuffs.dm +++ b/code/modules/mining/equipment/kheiral_cuffs.dm @@ -10,7 +10,6 @@ throwforce = 0 w_class = WEIGHT_CLASS_SMALL gender = PLURAL - throw_speed = 3 throw_range = 5 attack_verb_continuous = list("connects") attack_verb_simple = list("connect") @@ -96,7 +95,7 @@ if(isliving(loc)) connect_kheiral_network(loc) -/obj/item/kheiral_cuffs/worn_overlays(mutable_appearance/standing, isinhands, icon_file) +/obj/item/kheiral_cuffs/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands, icon_file) . = ..() if(!isinhands) . += emissive_appearance(icon_file, "strandcuff_emissive", alpha = src.alpha) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm deleted file mode 100644 index 9b3e89d8f898..000000000000 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ /dev/null @@ -1,465 +0,0 @@ -/*********************Mining Hammer****************/ -/obj/item/kinetic_crusher - icon = 'icons/obj/mining.dmi' - icon_state = "crusher" - inhand_icon_state = "crusher0" - lefthand_file = 'icons/mob/inhands/weapons/hammers_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/hammers_righthand.dmi' - name = "proto-kinetic crusher" - desc = "An early design of the proto-kinetic accelerator, it is little more than a combination of various mining tools cobbled together, forming a high-tech club. \ - While it is an effective mining tool, it did little to aid any but the most skilled and/or suicidal miners against local fauna." - force = 0 //You can't hit stuff unless wielded - w_class = WEIGHT_CLASS_BULKY - slot_flags = ITEM_SLOT_BACK - throwforce = 5 - throw_speed = 4 - armour_penetration = 10 - custom_materials = list(/datum/material/iron=1150, /datum/material/glass=2075) - hitsound = 'sound/weapons/bladeslice.ogg' - attack_verb_continuous = list("smashes", "crushes", "cleaves", "chops", "pulps") - attack_verb_simple = list("smash", "crush", "cleave", "chop", "pulp") - sharpness = SHARP_EDGED - actions_types = list(/datum/action/item_action/toggle_light) - obj_flags = UNIQUE_RENAME - light_system = MOVABLE_LIGHT - light_outer_range = 5 - light_on = FALSE - var/list/trophies = list() - var/charged = TRUE - var/charge_time = 15 - var/detonation_damage = 50 - var/backstab_bonus = 30 - var/wielded = FALSE // track wielded status on item - -/obj/item/kinetic_crusher/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) - -/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/kinetic_crusher/Destroy() - QDEL_LIST(trophies) - return ..() - -/// triggered on wield of two handed item -/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user) - SIGNAL_HANDLER - wielded = TRUE - -/// triggered on unwield of two handed item -/obj/item/kinetic_crusher/proc/on_unwield(obj/item/source, mob/user) - SIGNAL_HANDLER - wielded = FALSE - -/obj/item/kinetic_crusher/examine(mob/living/user) - . = ..() - . += span_notice("Mark a large creature with a destabilizing force with right-click, then hit them in melee to do [force + detonation_damage] damage.") - . += span_notice("Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage].") - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - . += span_notice("It has \a [T] attached, which causes [T.effect_desc()].") - -/obj/item/kinetic_crusher/attackby(obj/item/I, mob/living/user) - if(I.tool_behaviour == TOOL_CROWBAR) - if(LAZYLEN(trophies)) - to_chat(user, span_notice("You remove [src]'s trophies.")) - I.play_tool_sound(src) - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.remove_from(src, user) - else - to_chat(user, span_warning("There are no trophies on [src].")) - else if(istype(I, /obj/item/crusher_trophy)) - var/obj/item/crusher_trophy/T = I - T.add_to(src, user) - else - return ..() - -/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user) - if(!wielded) - to_chat(user, span_warning("[src] is too heavy to use with one hand! You fumble and drop everything.")) - user.drop_all_held_items() - return - var/datum/status_effect/crusher_damage/C = target.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = target.apply_status_effect(/datum/status_effect/crusher_damage) - var/target_health = target.health - ..() - for(var/t in trophies) - if(!QDELETED(target)) - var/obj/item/crusher_trophy/T = t - T.on_melee_hit(target, user) - 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/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams) - if(proximity_flag && isliving(target)) - var/mob/living/L = target - var/datum/status_effect/crusher_mark/CM = L.has_status_effect(/datum/status_effect/crusher_mark) - if(!CM || CM.hammer_synced != src || !L.remove_status_effect(/datum/status_effect/crusher_mark)) - return - var/datum/status_effect/crusher_damage/C = L.has_status_effect(/datum/status_effect/crusher_damage) - if(!C) - C = L.apply_status_effect(/datum/status_effect/crusher_damage) - var/target_health = L.health - for(var/t in trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_detonation(target, user) - if(!QDELETED(L)) - if(!QDELETED(C)) - C.total_damage += target_health - L.health //we did some damage, but let's not assume how much we did - new /obj/effect/temp_visual/kinetic_blast(get_turf(L)) - var/backstab_dir = get_dir(user, L) - var/def_check = L.getarmor(type = BOMB) - if((user.dir & backstab_dir) && (L.dir & backstab_dir)) - if(!QDELETED(C)) - C.total_damage += detonation_damage + backstab_bonus //cheat a little and add the total before killing it, so certain mobs don't have much lower chances of giving an item - L.apply_damage(detonation_damage + backstab_bonus, BRUTE, blocked = def_check) - playsound(user, 'sound/weapons/kenetic_accel.ogg', 100, TRUE) //Seriously who spelled it wrong - else - if(!QDELETED(C)) - C.total_damage += detonation_damage - L.apply_damage(detonation_damage, BRUTE, blocked = def_check) - -/obj/item/kinetic_crusher/attack_secondary(atom/target, mob/living/user, clickparams) - return SECONDARY_ATTACK_CONTINUE_CHAIN - -/obj/item/kinetic_crusher/afterattack_secondary(atom/target, mob/living/user, clickparams) - if(!wielded) - balloon_alert(user, "wield it first!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(target == user) - balloon_alert(user, "can't aim at yourself!") - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - fire_kinetic_blast(target, user, clickparams) - user.changeNext_move(CLICK_CD_MELEE) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/kinetic_crusher/proc/fire_kinetic_blast(atom/target, mob/living/user, clickparams) - if(!charged) - return - var/modifiers = params2list(clickparams) - var/turf/proj_turf = user.loc - if(!isturf(proj_turf)) - return - var/obj/projectile/destabilizer/destabilizer = new(proj_turf) - for(var/obj/item/crusher_trophy/attached_trophy as anything in trophies) - attached_trophy.on_projectile_fire(destabilizer, user) - destabilizer.preparePixelProjectile(target, user, modifiers) - destabilizer.firer = user - destabilizer.hammer_synced = src - playsound(user, 'sound/weapons/plasma_cutter.ogg', 100, TRUE) - destabilizer.fire() - charged = FALSE - update_appearance() - addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time) - -/obj/item/kinetic_crusher/proc/Recharge() - if(!charged) - charged = TRUE - update_appearance() - playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, TRUE) - -/obj/item/kinetic_crusher/ui_action_click(mob/user, actiontype) - set_light_on(!light_on) - playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) - update_appearance() - - -/obj/item/kinetic_crusher/update_icon_state() - inhand_icon_state = "crusher[wielded]" // this is not icon_state and not supported by 2hcomponent - return ..() - -/obj/item/kinetic_crusher/update_overlays() - . = ..() - if(!charged) - . += "[icon_state]_uncharged" - if(light_on) - . += "[icon_state]_lit" - -//destablizing force -/obj/projectile/destabilizer - name = "destabilizing force" - icon_state = "pulse1" - nodamage = TRUE - damage = 0 //We're just here to mark people. This is still a melee weapon. - damage_type = BRUTE - armor_flag = BOMB - range = 6 - log_override = TRUE - var/obj/item/kinetic_crusher/hammer_synced - -/obj/projectile/destabilizer/Destroy() - hammer_synced = null - return ..() - -/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE) - if(isliving(target)) - var/mob/living/L = target - var/had_effect = (L.has_status_effect(/datum/status_effect/crusher_mark)) //used as a boolean - var/datum/status_effect/crusher_mark/CM = L.apply_status_effect(/datum/status_effect/crusher_mark, hammer_synced) - if(hammer_synced) - for(var/t in hammer_synced.trophies) - var/obj/item/crusher_trophy/T = t - T.on_mark_application(target, CM, had_effect) - var/target_turf = get_turf(target) - if(ismineralturf(target_turf)) - var/turf/closed/mineral/M = target_turf - new /obj/effect/temp_visual/kinetic_blast(M) - M.gets_drilled(firer) - ..() - -//trophies -/obj/item/crusher_trophy - name = "tail spike" - desc = "A strange spike with no usage." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "tail_spike" - var/bonus_value = 10 //if it has a bonus effect, this is how much that effect is - var/denied_type = /obj/item/crusher_trophy - -/obj/item/crusher_trophy/examine(mob/living/user) - . = ..() - . += span_notice("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/kinetic_crusher)) - add_to(A, user) - else - ..() - -/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)) - to_chat(user, span_warning("You can't seem to attach [src] to [H]. Maybe remove a few trophies?")) - return FALSE - if(!user.transferItemToLoc(src, H)) - return - H.trophies += src - to_chat(user, span_notice("You attach [src] to [H].")) - return TRUE - -/obj/item/crusher_trophy/proc/remove_from(obj/item/kinetic_crusher/H, mob/living/user) - forceMove(get_turf(H)) - H.trophies -= src - return TRUE - -/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user -/obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user -/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before -/obj/item/crusher_trophy/proc/on_mark_detonation(mob/living/target, mob/living/user) //the target and the user - -//goliath -/obj/item/crusher_trophy/goliath_tentacle - name = "goliath tentacle" - desc = "A sliced-off goliath tentacle. Suitable as a trophy for a kinetic crusher." - icon_state = "goliath_tentacle" - denied_type = /obj/item/crusher_trophy/goliath_tentacle - bonus_value = 2 - var/missing_health_ratio = 0.1 - var/missing_health_desc = 10 - -/obj/item/crusher_trophy/goliath_tentacle/effect_desc() - return "mark detonation to do [bonus_value] more damage for every [missing_health_desc] health you are missing" - -/obj/item/crusher_trophy/goliath_tentacle/on_mark_detonation(mob/living/target, mob/living/user) - var/missing_health = user.maxHealth - user.health - missing_health *= missing_health_ratio //bonus is active at all times, even if you're above 90 health - missing_health *= bonus_value //multiply the remaining amount by bonus_value - if(missing_health > 0) - target.adjustBruteLoss(missing_health) //and do that much damage - -//watcher -/obj/item/crusher_trophy/watcher_wing - name = "watcher wing" - desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher." - icon_state = "watcher_wing" - denied_type = /obj/item/crusher_trophy/watcher_wing - bonus_value = 5 - -/obj/item/crusher_trophy/watcher_wing/effect_desc() - return "mark detonation to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s" - -/obj/item/crusher_trophy/watcher_wing/on_mark_detonation(mob/living/target, mob/living/user) - if(ishostile(target)) - var/mob/living/simple_animal/hostile/H = target - if(H.ranged) //briefly delay ranged attacks - if(H.ranged_cooldown >= world.time) - H.ranged_cooldown += bonus_value - else - H.ranged_cooldown = bonus_value + world.time - -//magmawing watcher -/obj/item/crusher_trophy/blaster_tubes/magma_wing - name = "magmawing watcher wing" - desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher." - icon_state = "magma_wing" - gender = NEUTER - bonus_value = 5 - -/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc() - return "mark detonation to make the next destabilizer shot deal [bonus_value] damage" - -/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) - if(deadly_shot) - marker.name = "heated [marker.name]" - marker.icon_state = "lava" - marker.damage = bonus_value - marker.nodamage = FALSE - deadly_shot = FALSE - -//icewing watcher -/obj/item/crusher_trophy/watcher_wing/ice_wing - name = "icewing watcher wing" - desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher." - icon_state = "ice_wing" - bonus_value = 8 - -//legion -/obj/item/crusher_trophy/legion_skull - name = "legion skull" - desc = "A dead and lifeless legion skull. Suitable as a trophy for a kinetic crusher." - icon_state = "legion_skull" - denied_type = /obj/item/crusher_trophy/legion_skull - bonus_value = 3 - -/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/kinetic_crusher/H, mob/living/user) - . = ..() - if(.) - H.charge_time -= bonus_value - -/obj/item/crusher_trophy/legion_skull/remove_from(obj/item/kinetic_crusher/H, mob/living/user) - . = ..() - if(.) - H.charge_time += bonus_value - -//blood-drunk hunter -/obj/item/crusher_trophy/miner_eye - name = "eye of a blood-drunk hunter" - desc = "Its pupil is collapsed and turned to mush. Suitable as a trophy for a kinetic crusher." - icon_state = "hunter_eye" - denied_type = /obj/item/crusher_trophy/miner_eye - -/obj/item/crusher_trophy/miner_eye/effect_desc() - return "mark detonation to grant stun immunity and 90% damage reduction for 1 second" - -/obj/item/crusher_trophy/miner_eye/on_mark_detonation(mob/living/target, mob/living/user) - user.apply_status_effect(/datum/status_effect/blooddrunk) - -//ash drake -/obj/item/crusher_trophy/tail_spike - desc = "A spike taken from an ash drake's tail. Suitable as a trophy for a kinetic crusher." - denied_type = /obj/item/crusher_trophy/tail_spike - bonus_value = 5 - -/obj/item/crusher_trophy/tail_spike/effect_desc() - return "mark detonation to do [bonus_value] damage to nearby creatures and push them back" - -/obj/item/crusher_trophy/tail_spike/on_mark_detonation(mob/living/target, mob/living/user) - for(var/mob/living/L in oview(2, user)) - if(L.stat == DEAD) - continue - playsound(L, 'sound/magic/fireball.ogg', 20, TRUE) - new /obj/effect/temp_visual/fire(L.loc) - addtimer(CALLBACK(src, PROC_REF(pushback), L, user), 1) //no free backstabs, we push AFTER module stuff is done - L.adjustFireLoss(bonus_value, forced = TRUE) - -/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user) - if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed - step(target, get_dir(user, target)) - -//bubblegum -/obj/item/crusher_trophy/demon_claws - name = "demon claws" - desc = "A set of blood-drenched claws from a massive demon's hand. Suitable as a trophy for a kinetic crusher." - icon_state = "demon_claws" - gender = PLURAL - denied_type = /obj/item/crusher_trophy/demon_claws - bonus_value = 10 - var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) - -/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/kinetic_crusher/H, mob/living/user) - . = ..() - if(.) - H.force += 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/kinetic_crusher/H, mob/living/user) - . = ..() - if(.) - H.force -= 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) - -/obj/item/crusher_trophy/demon_claws/on_mark_detonation(mob/living/target, mob/living/user) - user.heal_ordered_damage(bonus_value * 0.4, damage_heal_order) - -//colossus -/obj/item/crusher_trophy/blaster_tubes - name = "blaster tubes" - desc = "The blaster tubes from a colossus's arm. Suitable as a trophy for a kinetic crusher." - icon_state = "blaster_tubes" - gender = PLURAL - denied_type = /obj/item/crusher_trophy/blaster_tubes - bonus_value = 15 - var/deadly_shot = FALSE - -/obj/item/crusher_trophy/blaster_tubes/effect_desc() - return "mark detonation to make the next destabilizer shot deal [bonus_value] damage but move slower" - -/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) - if(deadly_shot) - marker.name = "deadly [marker.name]" - marker.icon_state = "chronobolt" - marker.damage = bonus_value - marker.nodamage = FALSE - marker.speed = 2 - deadly_shot = FALSE - -/obj/item/crusher_trophy/blaster_tubes/on_mark_detonation(mob/living/target, mob/living/user) - deadly_shot = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_deadly_shot)), 300, TIMER_UNIQUE|TIMER_OVERRIDE) - -/obj/item/crusher_trophy/blaster_tubes/proc/reset_deadly_shot() - deadly_shot = FALSE - -//hierophant -/obj/item/crusher_trophy/vortex_talisman - name = "vortex talisman" - desc = "A glowing trinket that was originally the Hierophant's beacon. Suitable as a trophy for a kinetic crusher." - icon_state = "vortex_talisman" - denied_type = /obj/item/crusher_trophy/vortex_talisman - -/obj/item/crusher_trophy/vortex_talisman/effect_desc() - return "mark detonation to create a barrier you can pass" - -/obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) - var/turf/T = get_turf(user) - new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! - var/turf/otherT = get_step(T, turn(user.dir, 90)) - if(otherT) - new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) - otherT = get_step(T, turn(user.dir, -90)) - if(otherT) - new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) - -/obj/effect/temp_visual/hierophant/wall/crusher - duration = 75 diff --git a/code/modules/mining/equipment/lazarus_injector.dm b/code/modules/mining/equipment/lazarus_injector.dm index 3f0a92662f72..1f408573aa62 100644 --- a/code/modules/mining/equipment/lazarus_injector.dm +++ b/code/modules/mining/equipment/lazarus_injector.dm @@ -16,7 +16,6 @@ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 5 ///Can this still be used? var/loaded = TRUE diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index 1cc7f5b5e904..ff11639b6492 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -60,12 +60,12 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( transfer_fingerprints_to(M) /obj/item/stack/marker_beacon/AltClick(mob/living/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) return var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) if(isnull(input_color)) return - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) return picked_color = input_color update_appearance() @@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( icon = 'icons/obj/lighting.dmi' icon_state = "marker" layer = BELOW_OPEN_DOOR_LAYER - armor = list(MELEE = 50, BULLET = 75, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, FIRE = 25, ACID = 0) + armor = list(BLUNT = 50, PUNCTURE = 75, SLASH = 0, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, FIRE = 25, ACID = 0) max_integrity = 50 anchored = TRUE light_outer_range = 2 @@ -150,12 +150,12 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( /obj/structure/marker_beacon/AltClick(mob/living/user) ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) return var/input_color = tgui_input_list(user, "Choose a color", "Beacon Color", GLOB.marker_beacon_colors) if(isnull(input_color)) return - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) return picked_color = input_color update_appearance() diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index ada079e01856..b4c3a3647bbd 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -26,9 +26,15 @@ /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) + var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay/debug) in M + if(oldC) + qdel(oldC) + + if(!M.mineralType?.scan_state) + continue + + var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay/debug(M) + C.icon_state = M.mineralType.scan_state /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." @@ -62,17 +68,16 @@ 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 + for(var/turf/closed/mineral/M in RANGE_TURFS(range, T)) + if(!M.mineralType?.scan_state) + continue + + 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.mineralType.scan_state /obj/effect/temp_visual/mining_overlay plane = FULLSCREEN_PLANE @@ -86,3 +91,6 @@ /obj/effect/temp_visual/mining_overlay/Initialize(mapload) . = ..() animate(src, alpha = 0, time = duration, easing = EASE_IN) + +/obj/effect/temp_visual/mining_overlay/debug + duration = 60 MINUTES // long enough diff --git a/code/modules/mining/equipment/mining_tools.dm b/code/modules/mining/equipment/mining_tools.dm index 8f42505a6538..71324c3b1154 100644 --- a/code/modules/mining/equipment/mining_tools.dm +++ b/code/modules/mining/equipment/mining_tools.dm @@ -17,6 +17,8 @@ attack_verb_continuous = list("hits", "pierces", "slices", "attacks") attack_verb_simple = list("hit", "pierce", "slice", "attack") + var/mining_damage = 20 + /obj/item/pickaxe/suicide_act(mob/living/user) user.visible_message(span_suicide("[user] begins digging into [user.p_their()] chest! It looks like [user.p_theyre()] trying to commit suicide!")) if(use_tool(user, user, 30, volume=50)) @@ -32,6 +34,8 @@ force = 1 throwforce = 1 + mining_damage = 5 + /obj/item/pickaxe/mini name = "compact pickaxe" desc = "A smaller, compact version of the standard pickaxe." @@ -51,6 +55,8 @@ desc = "A silver-plated pickaxe that mines slightly faster than standard-issue." force = 17 + mining_damage = 30 + /obj/item/pickaxe/diamond name = "diamond-tipped pickaxe" icon_state = "dpickaxe" @@ -58,6 +64,8 @@ desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt." force = 19 + mining_damage = 50 + /obj/item/pickaxe/drill name = "mining drill" icon_state = "handdrill" @@ -67,6 +75,8 @@ hitsound = 'sound/weapons/drill.ogg' desc = "An electric mining drill for the especially scrawny." + mining_damage = 60 + /obj/item/pickaxe/drill/cyborg name = "cyborg mining drill" desc = "An integrated electric mining drill." @@ -95,9 +105,11 @@ hitsound = 'sound/weapons/sonic_jackhammer.ogg' desc = "Cracks rocks with sonic blasts." + mining_damage = 100 + /obj/item/pickaxe/improvised name = "improvised pickaxe" - desc = "A pickaxe made with a knife and crowbar taped together, how does it not break?" + desc = "A crude pickaxe made with a knife and crowbar welded together." icon_state = "ipickaxe" worn_icon_state = "pickaxe" force = 10 @@ -107,6 +119,8 @@ w_class = WEIGHT_CLASS_NORMAL custom_materials = list(/datum/material/iron=12050) //metal needed for a crowbar and for a knife, why the FUCK does a knife cost 6 metal sheets while a crowbar costs 0.025 sheets? shit makes no sense fuck this + mining_damage = 15 + /obj/item/shovel name = "shovel" desc = "A large tool for digging and moving dirt." @@ -148,17 +162,3 @@ throwforce = 1 w_class = WEIGHT_CLASS_SMALL -/obj/item/shovel/serrated - name = "serrated bone shovel" - desc = "A wicked tool that cleaves through dirt just as easily as it does flesh. The design was styled after ancient lavaland tribal designs." - icon_state = "shovel_bone" - worn_icon_state = "shovel_serr" - lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' - force = 15 - throwforce = 12 - w_class = WEIGHT_CLASS_NORMAL - toolspeed = 0.7 - attack_verb_continuous = list("slashes", "impales", "stabs", "slices") - attack_verb_simple = list("slash", "impale", "stab", "slice") - sharpness = SHARP_EDGED diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 40740e7d31de..941482e6f76a 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -66,11 +66,11 @@ qdel(src) /obj/item/organ/regenerative_core/on_life(delta_time, times_fired) - ..() + . = ..() if(owner.health <= owner.crit_threshold) ui_action_click() -///Handles applying the core, logging and status/mood events. +///Handles applying the core, logging and status effects. /obj/item/organ/regenerative_core/proc/applyto(atom/target, mob/user) if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -88,7 +88,6 @@ to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")) SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) H.apply_status_effect(/datum/status_effect/regenerative_core) - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "core", /datum/mood_event/healsbadman) //Now THIS is a miner buff (fixed - nerf) qdel(src) /obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) @@ -97,7 +96,7 @@ applyto(target, user) /obj/item/organ/regenerative_core/attack_self(mob/user) - if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) applyto(user, user) /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm index f9ce7028efee..48f36878cd4a 100644 --- a/code/modules/mining/equipment/resonator.dm +++ b/code/modules/mining/equipment/resonator.dm @@ -104,7 +104,8 @@ if(!proj_turf) proj_turf = get_turf(src) resonance_damage = initial(resonance_damage) - if(lavaland_equipment_pressure_check(proj_turf)) + var/pressure = proj_turf.unsafe_return_air().returnPressure() + if(pressure < 20) name = "strong [initial(name)]" resonance_damage *= 3 else @@ -122,7 +123,8 @@ new /obj/effect/temp_visual/resonance_crush(src_turf) if(ismineralturf(src_turf)) var/turf/closed/mineral/mineral_turf = src_turf - mineral_turf.gets_drilled(creator) + mineral_turf.MinedAway() + check_pressure(src_turf) playsound(src_turf, 'sound/weapons/resonator_blast.ogg', 50, TRUE) for(var/mob/living/attacked_living in src_turf) diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index cf14a749d309..4076f3e73e51 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -2,7 +2,7 @@ /area/misc/survivalpod name = "\improper Emergency Shelter" icon_state = "away" - static_lighting = TRUE + area_lighting = AREA_LIGHTING_DYNAMIC requires_power = FALSE has_gravity = STANDARD_GRAVITY area_flags = BLOBS_ALLOWED | UNIQUE_AREA | CULT_PERMITTED @@ -64,7 +64,7 @@ log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [AREACOORD(T)]") playsound(src, 'sound/effects/phasein.ogg', 100, TRUE) - new /obj/effect/particle_effect/smoke(get_turf(src)) + new /obj/effect/particle_effect/fluid/smoke(get_turf(src)) qdel(src) //Non-default pods @@ -88,8 +88,8 @@ icon_state = "pod_window-0" base_icon_state = "pod_window" smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_SURVIVAL_TITANIUM_POD, SMOOTH_GROUP_SHUTTLE_PARTS) - canSmoothWith = list(SMOOTH_GROUP_SURVIVAL_TITANIUM_POD) + smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD + canSmoothWith = SMOOTH_GROUP_SURVIVAL_TITANIUM_POD /obj/structure/window/reinforced/shuttle/survival_pod/spawner/north dir = NORTH @@ -109,7 +109,7 @@ /obj/machinery/door/airlock/survival_pod name = "airlock" assemblytype = /obj/structure/door_assembly/door_assembly_pod - airlock_paint = "#333333" + smoothing_groups = SMOOTH_GROUP_AIRLOCK + SMOOTH_GROUP_SURVIVAL_TITANIUM_POD /obj/machinery/door/airlock/survival_pod/glass opacity = FALSE @@ -201,7 +201,7 @@ pixel_y = -4 flags_1 = NODECONSTRUCT_1 -/obj/machinery/smartfridge/survival_pod/ComponentInitialize() +/obj/machinery/smartfridge/survival_pod/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) @@ -232,6 +232,10 @@ var/buildstackamount = 5 can_atmos_pass = CANPASS_NEVER +/obj/structure/fans/Initialize(mapload) + . = ..() + zas_update_loc() + /obj/structure/fans/deconstruct() if(!(flags_1 & NODECONSTRUCT_1)) if(buildstacktype) @@ -257,13 +261,6 @@ icon_state = "fan_tiny" buildstackamount = 2 -/obj/structure/fans/Initialize(mapload) - . = ..() - //air_update_turf(TRUE, TRUE) - -/obj/structure/fans/Destroy() - //air_update_turf(TRUE, FALSE) - . = ..() //Invisible, indestructible fans /obj/structure/fans/tiny/invisible name = "air flow blocker" @@ -284,14 +281,11 @@ icon = 'icons/hud/screen_gen.dmi' icon_state = "x2" var/static/possible = list( - /obj/item/ship_in_a_bottle, /obj/item/gun/energy/pulse, /obj/item/book/granter/martial/carp, /obj/item/melee/supermatter_sword, /obj/item/shield/changeling, - /obj/item/lava_staff, /obj/item/energy_katana, - /obj/item/hierophant_club, /obj/item/his_grace, /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/l6_saw, diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 46e3004521cc..65198988b196 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -10,7 +10,6 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 5 slot_flags = ITEM_SLOT_BELT @@ -30,7 +29,7 @@ /obj/item/wormhole_jaunter/proc/get_destinations() var/list/destinations = list() - for(var/obj/item/beacon/B in GLOB.teleportbeacons) + for(var/obj/item/beacon/B as anything in INSTANCES_OF(/obj/item/beacon)) var/turf/T = get_turf(B) if(is_station_level(T.z)) destinations += B diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 6828ff4b49b9..7b0c2b43dcba 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -151,7 +151,7 @@ GLOBAL_LIST(labor_sheet_values) ..() /obj/machinery/mineral/stacking_machine/laborstacker/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/stack/sheet) && user.canUnEquip(I) && !user.combat_mode) + if(istype(I, /obj/item/stack/sheet) && user.canUnequipItem(I) && !user.combat_mode) var/obj/item/stack/sheet/inp = I points += inp.point_value * inp.amount return ..() diff --git a/code/modules/mining/lavaland/ash_flora.dm b/code/modules/mining/lavaland/ash_flora.dm deleted file mode 100644 index 791f403f083a..000000000000 --- a/code/modules/mining/lavaland/ash_flora.dm +++ /dev/null @@ -1,382 +0,0 @@ -//*******************Contains everything related to the flora on lavaland.******************************* -//This includes: The structures, their produce, their seeds and the crafting recipe for the mushroom bowl - -/obj/structure/flora/ash - gender = PLURAL - layer = PROJECTILE_HIT_THRESHHOLD_LAYER //sporangiums up don't shoot - icon = 'icons/obj/lavaland/ash_flora.dmi' - icon_state = "l_mushroom" - name = "large mushrooms" - desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores." - herbage = TRUE //not really accurate but what sound do hit mushrooms make anyway - var/harvested_name = "shortened mushrooms" - var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large." - var/needs_sharp_harvest = TRUE - var/harvest = /obj/item/food/grown/ash_flora/shavings - var/harvest_amount_low = 1 - var/harvest_amount_high = 3 - var/harvest_time = 60 - 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/harvested = FALSE - var/base_icon - var/regrowth_time_low = 8 MINUTES - var/regrowth_time_high = 16 MINUTES - var/number_of_variants = 4 - -/obj/structure/flora/ash/Initialize(mapload) - . = ..() - base_icon = "[icon_state][rand(1, number_of_variants)]" - icon_state = base_icon - -/obj/structure/flora/ash/proc/harvest(user) - if(harvested) - return FALSE - - var/rand_harvested = rand(harvest_amount_low, harvest_amount_high) - if(rand_harvested) - if(user) - var/msg = harvest_message_med - if(rand_harvested == harvest_amount_low) - msg = harvest_message_low - else if(rand_harvested == harvest_amount_high) - msg = harvest_message_high - to_chat(user, span_notice("[msg]")) - for(var/i in 1 to rand_harvested) - new harvest(get_turf(src)) - - icon_state = "[base_icon]p" - name = harvested_name - desc = harvested_desc - harvested = TRUE - addtimer(CALLBACK(src, PROC_REF(regrow)), rand(regrowth_time_low, regrowth_time_high)) - return TRUE - -/obj/structure/flora/ash/proc/regrow() - icon_state = base_icon - name = initial(name) - desc = initial(desc) - harvested = FALSE - -/obj/structure/flora/ash/attackby(obj/item/W, mob/user, params) - if(!harvested && needs_sharp_harvest && W.sharpness) - user.visible_message(span_notice("[user] starts to harvest from [src] with [W]."),span_notice("You begin to harvest from [src] with [W].")) - if(do_after(user, src, harvest_time)) - harvest(user) - else - return ..() - -/obj/structure/flora/ash/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(!harvested && !needs_sharp_harvest) - user.visible_message(span_notice("[user] starts to harvest from [src]."),span_notice("You begin to harvest from [src].")) - if(do_after(user, src, harvest_time)) - harvest(user) - -/obj/structure/flora/ash/tall_shroom //exists only so that the spawning check doesn't allow these spawning near other things - regrowth_time_low = 4200 - -/obj/structure/flora/ash/leaf_shroom - icon_state = "s_mushroom" - name = "leafy mushrooms" - desc = "A number of mushrooms, each of which surrounds a greenish sporangium with a number of leaf-like structures." - harvested_name = "leafless mushrooms" - harvested_desc = "A bunch of formerly-leafed mushrooms, with their sporangiums exposed. Scandalous?" - harvest = /obj/item/food/grown/ash_flora/mushroom_leaf - needs_sharp_harvest = FALSE - harvest_amount_high = 4 - harvest_time = 20 - harvest_message_low = "You pluck a single, suitable leaf." - harvest_message_med = "You pluck a number of leaves, leaving a few unsuitable ones." - harvest_message_high = "You pluck quite a lot of suitable leaves." - regrowth_time_low = 2400 - regrowth_time_high = 6000 - -/obj/structure/flora/ash/cap_shroom - icon_state = "r_mushroom" - name = "tall mushrooms" - desc = "Several mushrooms, the larger of which have a ring of conks at the midpoint of their stems." - harvested_name = "small mushrooms" - harvested_desc = "Several small mushrooms near the stumps of what likely were larger mushrooms." - harvest = /obj/item/food/grown/ash_flora/mushroom_cap - harvest_amount_high = 4 - harvest_time = 50 - harvest_message_low = "You slice the cap off a mushroom." - harvest_message_med = "You slice off a few conks from the larger mushrooms." - harvest_message_high = "You slice off a number of caps and conks from these mushrooms." - regrowth_time_low = 3000 - regrowth_time_high = 5400 - -/obj/structure/flora/ash/stem_shroom - icon_state = "t_mushroom" - name = "numerous mushrooms" - desc = "A large number of mushrooms, some of which have long, fleshy stems. They're radiating light!" - light_outer_range = 1.5 - light_power = 2.1 - harvested_name = "tiny mushrooms" - harvested_desc = "A few tiny mushrooms around larger stumps. You can already see them growing back." - harvest = /obj/item/food/grown/ash_flora/mushroom_stem - harvest_amount_high = 4 - harvest_time = 40 - harvest_message_low = "You pick and slice the cap off a mushroom, leaving the stem." - harvest_message_med = "You pick and decapitate several mushrooms for their stems." - harvest_message_high = "You acquire a number of stems from these mushrooms." - regrowth_time_low = 3000 - regrowth_time_high = 6000 - -/obj/structure/flora/ash/cacti - icon_state = "cactus" - name = "fruiting cacti" - desc = "Several prickly cacti, brimming with ripe fruit and covered in a thin layer of ash." - harvested_name = "cacti" - harvested_desc = "A bunch of prickly cacti. You can see fruits slowly growing beneath the covering of ash." - harvest = /obj/item/food/grown/ash_flora/cactus_fruit - needs_sharp_harvest = FALSE - harvest_amount_high = 2 - harvest_time = 10 - harvest_message_low = "You pick a cactus fruit." - harvest_message_med = "You pick several cactus fruit." //shouldn't show up, because you can't get more than two - harvest_message_high = "You pick a pair of cactus fruit." - regrowth_time_low = 4800 - regrowth_time_high = 7200 - -/obj/structure/flora/ash/cacti/Initialize(mapload) - . = ..() - AddComponent(/datum/component/caltrop, min_damage = 3, max_damage = 6, probability = 70) - -/obj/structure/flora/ash/seraka - icon_state = "seraka_mushroom" - name = "seraka mushrooms" - desc = "A small cluster of seraka mushrooms. These must have come with the ashlizards." - needs_sharp_harvest = FALSE - harvested_name = "harvested seraka mushrooms" - harvested_desc = "A couple of small seraka mushrooms, with the larger ones clearly having been recently removed. They'll grow back... eventually." - harvest = /obj/item/food/grown/ash_flora/seraka - harvest_amount_high = 6 - harvest_time = 25 - harvest_message_low = "You pluck a few choice tasty mushrooms." - harvest_message_med = "You grab a good haul of mushrooms." - harvest_message_high = "You hit the mushroom motherlode and make off with a bunch of tasty mushrooms." - regrowth_time_low = 3000 - regrowth_time_high = 5400 - number_of_variants = 2 - -///Snow flora to exist on icebox. -/obj/structure/flora/ash/chilly - icon_state = "chilly_pepper" - name = "springy grassy fruit" - desc = "A number of bright, springy blue fruiting plants. They seem to be unconcerned with the hardy, cold environment." - harvested_name = "springy grass" - harvested_desc = "A bunch of springy, bouncy fruiting grass, all picked. Or maybe they were never fruiting at all?" - harvest = /obj/item/food/grown/icepepper - needs_sharp_harvest = FALSE - harvest_amount_high = 3 - harvest_time = 15 - harvest_message_low = "You pluck a single, curved fruit." - harvest_message_med = "You pluck a number of curved fruit." - harvest_message_high = "You pluck quite a lot of curved fruit." - regrowth_time_low = 2400 - regrowth_time_high = 5500 - number_of_variants = 2 - -//SNACKS - -/obj/item/food/grown/ash_flora - name = "mushroom shavings" - desc = "Some shavings from a tall mushroom. With enough, might serve as a bowl." - icon = 'icons/obj/lavaland/ash_flora.dmi' - icon_state = "mushroom_shavings" - w_class = WEIGHT_CLASS_TINY - resistance_flags = FLAMMABLE - max_integrity = 100 - seed = /obj/item/seeds/lavaland/polypore - wine_power = 20 - -/obj/item/food/grown/ash_flora/Initialize(mapload) - . = ..() - pixel_x = base_pixel_x + rand(-4, 4) - pixel_y = base_pixel_y + rand(-4, 4) - -/obj/item/food/grown/ash_flora/shavings //So we can't craft bowls from everything. - grind_results = list(/datum/reagent/toxin/mushroom_powder = 5) - -/obj/item/food/grown/ash_flora/mushroom_leaf - name = "mushroom leaf" - desc = "A leaf, from a mushroom." - icon_state = "mushroom_leaf" - seed = /obj/item/seeds/lavaland/porcini - wine_power = 40 - -/obj/item/food/grown/ash_flora/mushroom_cap - name = "mushroom cap" - desc = "The cap of a large mushroom." - icon_state = "mushroom_cap" - seed = /obj/item/seeds/lavaland/inocybe - wine_power = 70 - -/obj/item/food/grown/ash_flora/mushroom_stem - name = "mushroom stem" - desc = "A long mushroom stem. It's slightly glowing." - icon_state = "mushroom_stem" - seed = /obj/item/seeds/lavaland/ember - wine_power = 60 - -/obj/item/food/grown/ash_flora/cactus_fruit - name = "cactus fruit" - desc = "A cactus fruit covered in a thick, reddish skin. And some ash." - icon_state = "cactus_fruit" - seed = /obj/item/seeds/lavaland/cactus - wine_power = 50 - -/obj/item/food/grown/ash_flora/seraka - name = "seraka cap" - desc = "Small, deeply flavourful mushrooms originally native to Tizira." - icon_state = "seraka_cap" - seed = /obj/item/seeds/lavaland/seraka - wine_power = 40 - -//SEEDS - -/obj/item/seeds/lavaland - name = "lavaland seeds" - desc = "You should never see this." - lifespan = 50 - endurance = 25 - maturation = 7 - production = 4 - yield = 4 - potency = 15 - growthstages = 3 - rarity = 20 - reagents_add = list(/datum/reagent/consumable/nutriment = 0.1) - species = "polypore" // silence unit test - genes = list(/datum/plant_gene/trait/fire_resistance) - graft_gene = /datum/plant_gene/trait/fire_resistance - -/obj/item/seeds/lavaland/cactus - name = "pack of fruiting cactus seeds" - desc = "These seeds grow into fruiting cacti." - icon_state = "seed-cactus" - species = "cactus" - plantname = "Fruiting Cactus" - product = /obj/item/food/grown/ash_flora/cactus_fruit - mutatelist = list(/obj/item/seeds/star_cactus) - genes = list(/datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' - growthstages = 2 - reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.04, /datum/reagent/consumable/vitfro = 0.08) - -///Star Cactus seeds, mutation of lavaland cactus. -/obj/item/seeds/star_cactus - name = "pack of star cacti seeds" - desc = "These seeds grow into star cacti." - icon_state = "seed-starcactus" - species = "starcactus" - plantname = "Star Cactus Cluster" - product = /obj/item/food/grown/star_cactus - lifespan = 60 - endurance = 30 - maturation = 7 - production = 6 - yield = 3 - growthstages = 4 - genes = list(/datum/plant_gene/trait/sticky, /datum/plant_gene/trait/stinging) - graft_gene = /datum/plant_gene/trait/sticky - growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' - reagents_add = list(/datum/reagent/water = 0.08, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/medicine/c2/helbital = 0.05) - -///Star Cactus Plants. -/obj/item/food/grown/star_cactus - seed = /obj/item/seeds/star_cactus - name = "star cacti" - desc = "A spikey, round cluster of prickly star cacti. And no, it's not called a star cactus because it's in space." - icon_state = "starcactus" - filling_color = "#1c801c" - foodtypes = VEGETABLES - distill_reagent = /datum/reagent/consumable/ethanol/tequila - -/obj/item/seeds/lavaland/polypore - name = "pack of polypore mycelium" - desc = "This mycelium grows into bracket mushrooms, also known as polypores. Woody and firm, shaft miners often use them for makeshift crafts." - icon_state = "mycelium-polypore" - species = "polypore" - plantname = "Polypore Mushrooms" - product = /obj/item/food/grown/ash_flora/shavings - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/consumable/sugar = 0.06, /datum/reagent/consumable/ethanol = 0.04, /datum/reagent/stabilizing_agent = 0.06, /datum/reagent/toxin/minttoxin = 0.02) - -/obj/item/seeds/lavaland/porcini - name = "pack of porcini mycelium" - desc = "This mycelium grows into Boletus edulus, also known as porcini. Native to the late Earth, but discovered on Lavaland. Has culinary, medicinal and relaxant effects." - icon_state = "mycelium-porcini" - species = "porcini" - plantname = "Porcini Mushrooms" - product = /obj/item/food/grown/ash_flora/mushroom_leaf - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/consumable/nutriment = 0.06, /datum/reagent/consumable/vitfro = 0.04, /datum/reagent/drug/nicotine = 0.04) - - -/obj/item/seeds/lavaland/inocybe - name = "pack of inocybe mycelium" - desc = "This mycelium grows into an inocybe mushroom, a species of Lavaland origin with hallucinatory and toxic effects." - icon_state = "mycelium-inocybe" - species = "inocybe" - plantname = "Inocybe Mushrooms" - product = /obj/item/food/grown/ash_flora/mushroom_cap - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/toxin/mindbreaker = 0.04, /datum/reagent/consumable/entpoly = 0.08, /datum/reagent/drug/mushroomhallucinogen = 0.04) - -/obj/item/seeds/lavaland/ember - name = "pack of embershroom mycelium" - desc = "This mycelium grows into embershrooms, a species of bioluminescent mushrooms native to Lavaland." - icon_state = "mycelium-ember" - species = "ember" - plantname = "Embershroom Mushrooms" - product = /obj/item/food/grown/ash_flora/mushroom_stem - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/glow, /datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/consumable/tinlux = 0.04, /datum/reagent/consumable/nutriment/vitamin = 0.02, /datum/reagent/drug/space_drugs = 0.02) - -/obj/item/seeds/lavaland/seraka - name = "pack of seraka mycelium" - desc = "This mycelium grows into seraka mushrooms, a species of savoury mushrooms originally native to Tizira used in food and traditional medicine." - icon_state = "mycelium-seraka" - species = "seraka" - plantname = "Seraka Mushrooms" - product = /obj/item/food/grown/ash_flora/seraka - genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/fire_resistance) - growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' - reagents_add = list(/datum/reagent/toxin/mushroom_powder = 0.1, /datum/reagent/medicine/coagulant/seraka_extract = 0.02) - -//CRAFTING - -/datum/crafting_recipe/mushroom_bowl - name = "Mushroom Bowl" - result = /obj/item/reagent_containers/glass/bowl/mushroom_bowl - reqs = list(/obj/item/food/grown/ash_flora/shavings = 5) - time = 30 - category = CAT_PRIMAL -/obj/item/reagent_containers/glass/bowl/mushroom_bowl - name = "mushroom bowl" - desc = "A bowl made out of mushrooms. Not food, though it might have contained some at some point." - icon = 'icons/obj/lavaland/ash_flora.dmi' - icon_state = "mushroom_bowl" - -/obj/item/reagent_containers/glass/bowl/mushroom_bowl/update_overlays() - . = ..() - if(!reagents?.total_volume) - return - var/mutable_appearance/filling = mutable_appearance('icons/obj/lavaland/ash_flora.dmi', "fullbowl") - filling.color = mix_color_from_reagents(reagents.reagent_list) - . += filling - -/obj/item/reagent_containers/glass/bowl/mushroom_bowl/update_icon_state() - if(!reagents || !reagents.total_volume) - icon_state = "mushroom_bowl" - return ..() diff --git a/code/modules/mining/lavaland/megafauna_loot.dm b/code/modules/mining/lavaland/megafauna_loot.dm deleted file mode 100644 index fe17f65e78e3..000000000000 --- a/code/modules/mining/lavaland/megafauna_loot.dm +++ /dev/null @@ -1,1052 +0,0 @@ -//This file contains all Lavaland megafauna loot. Does not include crusher trophies. - - -//Hierophant: Hierophant Club - -#define HIEROPHANT_BLINK_RANGE 5 -#define HIEROPHANT_BLINK_COOLDOWN 15 SECONDS - -/datum/action/innate/dash/hierophant - current_charges = 1 - max_charges = 1 - charge_rate = HIEROPHANT_BLINK_COOLDOWN - recharge_sound = null - phasein = /obj/effect/temp_visual/hierophant/blast/visual - phaseout = /obj/effect/temp_visual/hierophant/blast/visual - // It's a simple purple beam, works well enough for the purple hiero effects. - beam_effect = "plasmabeam" - -/datum/action/innate/dash/hierophant/teleport(mob/user, atom/target) - var/dist = get_dist(user, target) - if(dist > HIEROPHANT_BLINK_RANGE) - user.balloon_alert(user, "destination out of range!") - return - var/turf/target_turf = get_turf(target) - if(target_turf.is_blocked_turf_ignore_climbable()) - user.balloon_alert(user, "destination blocked!") - return - . = ..() - if(!current_charges) - var/obj/item/hierophant_club/club = src.target - if(istype(club)) - club.blink_charged = FALSE - club.update_appearance() - -/datum/action/innate/dash/hierophant/charge() - var/obj/item/hierophant_club/club = target - if(istype(club)) - club.blink_charged = TRUE - club.update_appearance() - - current_charges = clamp(current_charges + 1, 0, max_charges) - - if(recharge_sound) - playsound(dashing_item, recharge_sound, 50, TRUE) - - if(!owner) - return - owner?.update_mob_action_buttons() - to_chat(owner, span_notice("[src] now has [current_charges]/[max_charges] charges.")) - -/obj/item/hierophant_club - name = "hierophant club" - desc = "The strange technology of this large club allows various nigh-magical teleportation feats. It used to beat you, but now you can set the beat." - icon_state = "hierophant_club_ready_beacon" - inhand_icon_state = "hierophant_club_ready_beacon" - icon = 'icons/obj/lavaland/artefacts.dmi' - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - inhand_x_dimension = 64 - inhand_y_dimension = 64 - slot_flags = ITEM_SLOT_BACK - w_class = WEIGHT_CLASS_NORMAL - force = 15 - attack_verb_continuous = list("clubs", "beats", "pummels") - attack_verb_simple = list("club", "beat", "pummel") - hitsound = 'sound/weapons/sonic_jackhammer.ogg' - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - actions_types = list(/datum/action/item_action/vortex_recall) - /// Linked teleport beacon for the group teleport functionality. - var/obj/effect/hierophant/beacon - /// TRUE if currently doing a teleport to the beacon, FALSE otherwise. - var/teleporting = FALSE //if we ARE teleporting - /// Action enabling the blink-dash functionality. - var/datum/action/innate/dash/hierophant/blink - /// Whether the blink ability is activated. IF TRUE, left clicking a location will blink to it. If FALSE, this is disabled. - var/blink_activated = TRUE - /// Whether the blink is charged. Set and unset by the blink action. Used as part of setting the appropriate icon states. - var/blink_charged = TRUE - -/obj/item/hierophant_club/Initialize(mapload) - . = ..() - blink = new(src) - -/obj/item/hierophant_club/Destroy() - . = ..() - QDEL_NULL(blink) - -/obj/item/hierophant_club/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - -/obj/item/hierophant_club/examine(mob/user) - . = ..() - . += span_hierophant_warning("The[beacon ? " beacon is not currently":"re is a beacon"] attached.") - -/obj/item/hierophant_club/suicide_act(mob/living/user) - say("Xverwpsgexmrk...", forced = "hierophant club suicide") - user.visible_message(span_suicide("[user] holds [src] into the air! It looks like [user.p_theyre()] trying to commit suicide!")) - new/obj/effect/temp_visual/hierophant/telegraph(get_turf(user)) - playsound(user, 'sound/machines/doors/airlock_open.ogg', 75, TRUE) - user.visible_message(span_hierophant_warning("[user] fades out, leaving [user.p_their()] belongings behind!")) - for(var/obj/item/I in user) - if(I != src) - user.dropItemToGround(I) - for(var/turf/T in RANGE_TURFS(1, user)) - new /obj/effect/temp_visual/hierophant/blast/visual(T, user, TRUE) - user.dropItemToGround(src) //Drop us last, so it goes on top of their stuff - qdel(user) - -/obj/item/hierophant_club/attack_self(mob/user) - blink_activated = !blink_activated - to_chat(user, span_notice("You [blink_activated ? "enable" : "disable"] the blink function on [src].")) - -/obj/item/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - // If our target is the beacon and the hierostaff is next to the beacon, we're trying to pick it up. - if((target == beacon) && target.Adjacent(src)) - return - if(blink_activated) - blink.teleport(user, target) - -/obj/item/hierophant_club/update_icon_state() - icon_state = inhand_icon_state = "hierophant_club[blink_charged ? "_ready":""][(!QDELETED(beacon)) ? "":"_beacon"]" - return ..() - -/obj/item/hierophant_club/ui_action_click(mob/user, action) - if(!user.is_holding(src)) //you need to hold the staff to teleport - to_chat(user, span_warning("You need to hold the club in your hands to [beacon ? "teleport with it":"detach the beacon"]!")) - return - if(!beacon || QDELETED(beacon)) - if(isturf(user.loc)) - user.visible_message(span_hierophant_warning("[user] starts fiddling with [src]'s pommel..."), \ - span_notice("You start detaching the hierophant beacon...")) - if(do_after(user, user, 50) && !beacon) - var/turf/T = get_turf(user) - playsound(T,'sound/magic/blind.ogg', 200, TRUE, -4) - new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user) - beacon = new/obj/effect/hierophant(T) - user?.update_mob_action_buttons() - user.visible_message(span_hierophant_warning("[user] places a strange machine beneath [user.p_their()] feet!"), \ - "[span_hierophant("You detach the hierophant beacon, allowing you to teleport yourself and any allies to it at any time!")]\n\ - [span_notice("You can remove the beacon to place it again by striking it with the club.")]") - else - to_chat(user, span_warning("You need to be on solid ground to detach the beacon!")) - return - if(get_dist(user, beacon) <= 2) //beacon too close abort - to_chat(user, span_warning("You are too close to the beacon to teleport to it!")) - return - var/turf/beacon_turf = get_turf(beacon) - if(beacon_turf?.is_blocked_turf(TRUE)) - to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!")) - return - if(!isturf(user.loc)) - to_chat(user, span_warning("You don't have enough space to teleport from here!")) - return - teleporting = TRUE //start channel - user?.update_mob_action_buttons() - user.visible_message(span_hierophant_warning("[user] starts to glow faintly...")) - beacon.icon_state = "hierophant_tele_on" - var/obj/effect/temp_visual/hierophant/telegraph/edge/TE1 = new /obj/effect/temp_visual/hierophant/telegraph/edge(user.loc) - var/obj/effect/temp_visual/hierophant/telegraph/edge/TE2 = new /obj/effect/temp_visual/hierophant/telegraph/edge(beacon.loc) - if(do_after(user, user, 40) && user && beacon) - var/turf/T = get_turf(beacon) - var/turf/source = get_turf(user) - if(T.is_blocked_turf(TRUE)) - teleporting = FALSE - to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!")) - user?.update_mob_action_buttons() - beacon.icon_state = "hierophant_tele_off" - return - new /obj/effect/temp_visual/hierophant/telegraph(T, user) - new /obj/effect/temp_visual/hierophant/telegraph(source, user) - playsound(T, 'sound/magic/wand_teleport.ogg', 200, TRUE) - playsound(source, 'sound/machines/doors/airlock_open.ogg', 200, TRUE) - if(!do_after(user, user, 3) || !user || !beacon || QDELETED(beacon)) //no walking away shitlord - teleporting = FALSE - if(user) - user?.update_mob_action_buttons() - if(beacon) - beacon.icon_state = "hierophant_tele_off" - return - if(T.is_blocked_turf(TRUE)) - teleporting = FALSE - to_chat(user, span_warning("The beacon is blocked by something, preventing teleportation!")) - user?.update_mob_action_buttons() - beacon.icon_state = "hierophant_tele_off" - return - 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)) - new /obj/effect/temp_visual/hierophant/blast/visual(t, user, TRUE) - for(var/t in RANGE_TURFS(1, source)) - new /obj/effect/temp_visual/hierophant/blast/visual(t, user, TRUE) - for(var/mob/living/L in range(1, source)) - INVOKE_ASYNC(src, PROC_REF(teleport_mob), source, L, T, user) - sleep(6) //at this point the blasts detonate - if(beacon) - beacon.icon_state = "hierophant_tele_off" - else - qdel(TE1) - qdel(TE2) - if(beacon) - beacon.icon_state = "hierophant_tele_off" - teleporting = FALSE - if(user) - user?.update_mob_action_buttons() - -/obj/item/hierophant_club/proc/teleport_mob(turf/source, mob/teleporting, turf/target, mob/user) - var/turf/turf_to_teleport_to = get_step(target, get_dir(source, teleporting)) //get position relative to caster - if(!turf_to_teleport_to || turf_to_teleport_to.is_blocked_turf(TRUE)) - return - animate(teleporting, alpha = 0, time = 2, easing = EASE_OUT) //fade out - sleep(1) - if(!teleporting) - return - teleporting.visible_message(span_hierophant_warning("[teleporting] fades out!")) - sleep(2) - if(!teleporting) - return - var/success = do_teleport(teleporting, turf_to_teleport_to, no_effects = TRUE, channel = TELEPORT_CHANNEL_MAGIC) - sleep(1) - if(!teleporting) - return - animate(teleporting, alpha = 255, time = 2, easing = EASE_IN) //fade IN - sleep(1) - if(!teleporting) - return - teleporting.visible_message(span_hierophant_warning("[teleporting] fades in!")) - if(user != teleporting && success) - log_combat(user, teleporting, "teleported", null, "from [AREACOORD(source)]") - -/obj/item/hierophant_club/pickup(mob/living/user) - . = ..() - blink.Grant(user, src) - user.update_icons() - -/obj/item/hierophant_club/dropped(mob/user) - . = ..() - blink.Remove(user) - user.update_icons() - -#undef HIEROPHANT_BLINK_RANGE -#undef HIEROPHANT_BLINK_COOLDOWN - -//Bubblegum: Mayhem in a Bottle, H.E.C.K. Suit, Soulscythe - -/obj/item/mayhem - name = "mayhem in a bottle" - desc = "A magically infused bottle of blood, the scent of which will drive anyone nearby into a murderous frenzy." - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/mayhem/attack_self(mob/user) - for(var/mob/living/carbon/human/target in range(7,user)) - target.apply_status_effect(/datum/status_effect/mayhem) - to_chat(user, span_notice("You shatter the bottle!")) - playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) - message_admins(span_adminnotice("[ADMIN_LOOKUPFLW(user)] has activated a bottle of mayhem!")) - user.log_message("activated a bottle of mayhem", LOG_ATTACK) - qdel(src) - -/obj/item/clothing/suit/hooded/hostile_environment - name = "H.E.C.K. suit" - desc = "Hostile Environment Cross-Kinetic Suit: A suit designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner." - icon_state = "hostile_env" - hoodtype = /obj/item/clothing/head/hooded/hostile_environment - armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) - cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - clothing_flags = THICKMATERIAL - resistance_flags = FIRE_PROOF|LAVA_PROOF|ACID_PROOF - 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/recharge/kinetic_accelerator, /obj/item/pickaxe) - -/obj/item/clothing/suit/hooded/hostile_environment/Initialize(mapload) - . = ..() - AddElement(/datum/element/radiation_protected_clothing) - -/obj/item/clothing/suit/hooded/hostile_environment/process(delta_time) - . = ..() - var/mob/living/carbon/wearer = loc - if(istype(wearer) && DT_PROB(1, delta_time)) //cursed by bubblegum - if(DT_PROB(7.5, delta_time)) - new /datum/hallucination/oh_yeah(wearer) - to_chat(wearer, span_colossus("[pick("I AM IMMORTAL.","I SHALL TAKE BACK WHAT'S MINE.","I SEE YOU.","YOU CANNOT ESCAPE ME FOREVER.","DEATH CANNOT HOLD ME.")]")) - else - to_chat(wearer, span_warning("[pick("You hear faint whispers.","You smell ash.","You feel hot.","You hear a roar in the distance.")]")) - -/obj/item/clothing/head/hooded/hostile_environment - name = "H.E.C.K. helmet" - desc = "Hostile Environiment Cross-Kinetic Helmet: A helmet designed to withstand the wide variety of hazards from Lavaland. It wasn't enough for its last owner." - icon_state = "hostile_env" - w_class = WEIGHT_CLASS_NORMAL - armor = list(MELEE = 70, BULLET = 40, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) - cold_protection = HEAD - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - clothing_flags = SNUG_FIT|THICKMATERIAL - resistance_flags = FIRE_PROOF|LAVA_PROOF|ACID_PROOF - actions_types = list() - -/obj/item/clothing/head/hooded/hostile_environment/Initialize(mapload) - . = ..() - update_appearance() - AddComponent(/datum/component/butchering, 5, 150, null, null, null, TRUE, CALLBACK(src, PROC_REF(consume))) - AddElement(/datum/element/radiation_protected_clothing) - -/obj/item/clothing/head/hooded/hostile_environment/equipped(mob/user, slot, initial = FALSE) - . = ..() - RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(butcher_target)) - var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) - butchering.butchering_enabled = TRUE - to_chat(user, span_notice("You feel a bloodlust. You can now butcher corpses with your bare arms.")) - -/obj/item/clothing/head/hooded/hostile_environment/dropped(mob/user, silent = FALSE) - . = ..() - UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) - var/datum/component/butchering/butchering = GetComponent(/datum/component/butchering) - butchering.butchering_enabled = FALSE - to_chat(user, span_notice("You lose your bloodlust.")) - -/obj/item/clothing/head/hooded/hostile_environment/proc/butcher_target(mob/user, atom/target, proximity) - SIGNAL_HANDLER - if(!isliving(target)) - return - return SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target, user) - -/obj/item/clothing/head/hooded/hostile_environment/proc/consume(mob/living/user, mob/living/butchered) - if(butchered.mob_biotypes & (MOB_ROBOTIC | MOB_SPIRIT)) - return - var/health_consumed = butchered.maxHealth * 0.1 - user.heal_ordered_damage(health_consumed, list(BRUTE, BURN, TOX)) - to_chat(user, span_notice("You heal from the corpse of [butchered].")) - var/datum/client_colour/color = user.add_client_colour(/datum/client_colour/bloodlust) - QDEL_IN(color, 1 SECONDS) - -/obj/item/clothing/head/hooded/hostile_environment/update_overlays() - . = ..() - var/mutable_appearance/glass_overlay = mutable_appearance(icon, "hostile_env_glass") - glass_overlay.appearance_flags = RESET_COLOR - . += glass_overlay - -/obj/item/clothing/head/hooded/hostile_environment/worn_overlays(mutable_appearance/standing, isinhands) - . = ..() - if(!isinhands) - var/mutable_appearance/glass_overlay = mutable_appearance('icons/mob/clothing/head.dmi', "hostile_env_glass") - glass_overlay.appearance_flags = RESET_COLOR - . += glass_overlay - -#define MAX_BLOOD_LEVEL 100 - -/obj/item/soulscythe - name = "soulscythe" - desc = "An old relic of hell created by devils to establish themselves as the leadership of hell over the demons. It grows stronger while it possesses a powerful soul." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "soulscythe" - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - attack_verb_continuous = list("chops", "slices", "cuts", "reaps") - attack_verb_simple = list("chop", "slice", "cut", "reap") - hitsound = 'sound/weapons/bladeslice.ogg' - inhand_x_dimension = 64 - inhand_y_dimension = 64 - force = 20 - throwforce = 17 - armour_penetration = 50 - sharpness = SHARP_EDGED - layer = MOB_LAYER - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - /// Soulscythe mob in the scythe - var/mob/living/simple_animal/soulscythe/soul - /// Are we grabbing a spirit? - var/using = FALSE - /// Currently charging? - var/charging = FALSE - /// Cooldown between moves - COOLDOWN_DECLARE(move_cooldown) - /// Cooldown between attacks - COOLDOWN_DECLARE(attack_cooldown) - -/obj/item/soulscythe/Initialize(mapload) - . = ..() - soul = new(src) - RegisterSignal(soul, COMSIG_LIVING_RESIST, PROC_REF(on_resist)) - RegisterSignal(soul, COMSIG_MOB_ATTACK_RANGED, PROC_REF(on_attack)) - RegisterSignal(soul, COMSIG_MOB_ATTACK_RANGED_SECONDARY, PROC_REF(on_secondary_attack)) - RegisterSignal(src, COMSIG_ATOM_INTEGRITY_CHANGED, PROC_REF(on_integrity_change)) - -/obj/item/soulscythe/examine(mob/user) - . = ..() - . += soul.ckey ? span_nicegreen("There is a soul inhabiting it.") : span_danger("It's dormant.") - -/obj/item/soulscythe/attack(mob/living/attacked, mob/living/user, params) - . = ..() - if(attacked.stat != DEAD) - give_blood(10) - -/obj/item/soulscythe/attack_hand(mob/user, list/modifiers) - if(soul.ckey && !soul.faction_check_mob(user)) - to_chat(user, span_warning("You can't pick up [src]!")) - return - return ..() - -/obj/item/soulscythe/pickup(mob/user) - . = ..() - if(soul.ckey) - animate(src) //stop spinnage - -/obj/item/soulscythe/dropped(mob/user, silent) - . = ..() - if(soul.ckey) - reset_spin() //resume spinnage - -/obj/item/soulscythe/attack_self(mob/user, modifiers) - if(using || soul.ckey || soul.stat) - return - if(!(GLOB.ghost_role_flags & GHOSTROLE_STATION_SENTIENCE)) - balloon_alert(user, "you can't awaken the scythe!") - return - using = TRUE - balloon_alert(user, "you hold the scythe up...") - ADD_TRAIT(src, TRAIT_NODROP, type) - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as [user.real_name]'s soulscythe?", ROLE_PAI, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) - if(LAZYLEN(candidates)) - var/mob/dead/observer/picked_ghost = pick(candidates) - soul.ckey = picked_ghost.ckey - soul.copy_languages(user, LANGUAGE_MASTER) //Make sure the sword can understand and communicate with the user. - soul.update_atom_languages() - soul.faction = list("[REF(user)]") - balloon_alert(user, "the scythe glows up") - add_overlay("soulscythe_gem") - density = TRUE - if(!ismob(loc)) - reset_spin() - else - balloon_alert(user, "the scythe is dormant!") - REMOVE_TRAIT(src, TRAIT_NODROP, type) - using = FALSE - -/obj/item/soulscythe/relaymove(mob/living/user, direction) - if(!COOLDOWN_FINISHED(src, move_cooldown) || charging) - return - if(!isturf(loc)) - balloon_alert(user, "resist out!") - COOLDOWN_START(src, move_cooldown, 1 SECONDS) - return - if(!use_blood(1, FALSE)) - return - if(pixel_x != base_pixel_x || pixel_y != base_pixel_y) - animate(src, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y, flags = ANIMATION_PARALLEL) - Move(get_step_multiz(src, direction), direction) - COOLDOWN_START(src, move_cooldown, (direction in GLOB.cardinals) ? 0.1 SECONDS : 0.2 SECONDS) - -/obj/item/soulscythe/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - . = ..() - if(!charging) - return - charging = FALSE - throwforce *= 0.5 - reset_spin() - if(ismineralturf(hit_atom)) - var/turf/closed/mineral/hit_rock = hit_atom - hit_rock.gets_drilled() - if(isliving(hit_atom)) - var/mob/living/hit_mob = hit_atom - if(hit_mob.stat != DEAD) - give_blood(15) - -/obj/item/soulscythe/AllowClick() - return TRUE - -/obj/item/soulscythe/proc/use_blood(amount = 0, message = TRUE) - if(amount > soul.blood_level) - if(message) - to_chat(soul, span_warning("Not enough blood!")) - return FALSE - soul.blood_level -= amount - return TRUE - -/obj/item/soulscythe/proc/give_blood(amount) - soul.blood_level = min(MAX_BLOOD_LEVEL, soul.blood_level + amount) - -/obj/item/soulscythe/proc/on_resist(mob/living/user) - SIGNAL_HANDLER - - if(isturf(loc)) - return - INVOKE_ASYNC(src, PROC_REF(break_out)) - -/obj/item/soulscythe/proc/break_out() - if(!use_blood(10)) - return - balloon_alert(soul, "you resist...") - if(!do_after(soul, src, 5 SECONDS, timed_action_flags = IGNORE_TARGET_LOC_CHANGE)) - balloon_alert(soul, "interrupted!") - return - balloon_alert(soul, "you break out") - if(ismob(loc)) - var/mob/holder = loc - holder.temporarilyRemoveItemFromInventory(src) - forceMove(drop_location()) - -/obj/item/soulscythe/proc/on_integrity_change(datum/source, old_value, new_value) - SIGNAL_HANDLER - - soul.set_health(new_value) - -/obj/item/soulscythe/proc/on_attack(mob/living/source, atom/attacked_atom, modifiers) - SIGNAL_HANDLER - - if(!COOLDOWN_FINISHED(src, attack_cooldown) || !isturf(loc)) - return - if(get_dist(source, attacked_atom) > 1) - INVOKE_ASYNC(src, PROC_REF(shoot_target), attacked_atom) - else - INVOKE_ASYNC(src, PROC_REF(slash_target), attacked_atom) - -/obj/item/soulscythe/proc/on_secondary_attack(mob/living/source, atom/attacked_atom, modifiers) - SIGNAL_HANDLER - - if(!COOLDOWN_FINISHED(src, attack_cooldown) || !isturf(loc)) - return - INVOKE_ASYNC(src, PROC_REF(charge_target), attacked_atom) - -/obj/item/soulscythe/proc/shoot_target(atom/attacked_atom) - if(!use_blood(15)) - return - COOLDOWN_START(src, attack_cooldown, 3 SECONDS) - var/obj/projectile/projectile = new /obj/projectile/soulscythe(get_turf(src)) - projectile.preparePixelProjectile(attacked_atom, src) - projectile.firer = src - projectile.fire(null, attacked_atom) - visible_message(span_danger("[src] fires at [attacked_atom]!"), span_notice("You fire at [attacked_atom]!")) - playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) - -/obj/item/soulscythe/proc/slash_target(atom/attacked_atom) - if(isliving(attacked_atom) && use_blood(10)) - var/mob/living/attacked_mob = attacked_atom - if(attacked_mob.stat != DEAD) - give_blood(15) - attacked_mob.apply_damage(damage = force * (ishostile(attacked_mob) ? 2 : 1), sharpness = SHARP_EDGED) - to_chat(attacked_mob, span_userdanger("You're slashed by [src]!")) - else if((ismachinery(attacked_atom) || isstructure(attacked_atom)) && use_blood(5)) - var/obj/attacked_obj = attacked_atom - attacked_obj.take_damage(force, BRUTE, MELEE, FALSE) - else - return - COOLDOWN_START(src, attack_cooldown, 1 SECONDS) - animate(src) - SpinAnimation(5) - addtimer(CALLBACK(src, PROC_REF(reset_spin)), 1 SECONDS) - visible_message(span_danger("[src] slashes [attacked_atom]!"), span_notice("You slash [attacked_atom]!")) - playsound(src, 'sound/weapons/bladeslice.ogg', 50, TRUE) - do_attack_animation(attacked_atom, ATTACK_EFFECT_SLASH) - -/obj/item/soulscythe/proc/charge_target(atom/attacked_atom) - if(charging || !use_blood(30)) - return - COOLDOWN_START(src, attack_cooldown, 5 SECONDS) - animate(src) - charging = TRUE - visible_message(span_danger("[src] starts charging...")) - balloon_alert(soul, "you start charging...") - if(!do_after(soul, src, 2 SECONDS, timed_action_flags = IGNORE_TARGET_LOC_CHANGE)) - balloon_alert(soul, "interrupted!") - return - visible_message(span_danger("[src] charges at [attacked_atom]!"), span_notice("You charge at [attacked_atom]!")) - new /obj/effect/temp_visual/mook_dust(get_turf(src)) - playsound(src, 'sound/weapons/thudswoosh.ogg', 50, TRUE) - SpinAnimation(1) - throwforce *= 2 - throw_at(attacked_atom, 10, 3, soul, FALSE) - -/obj/item/soulscythe/proc/reset_spin() - animate(src) - SpinAnimation(15) - -/mob/living/simple_animal/soulscythe - name = "mysterious spirit" - maxHealth = 200 - health = 200 - gender = NEUTER - mob_biotypes = MOB_SPIRIT - faction = list() - weather_immunities = list(TRAIT_ASHSTORM_IMMUNE, TRAIT_SNOWSTORM_IMMUNE) - /// Blood level, used for movement and abilities in a soulscythe - var/blood_level = MAX_BLOOD_LEVEL - -/mob/living/simple_animal/soulscythe/get_status_tab_items() - . = ..() - . += "Blood: [blood_level]/[MAX_BLOOD_LEVEL]" - -/mob/living/simple_animal/soulscythe/Life(delta_time, times_fired) - . = ..() - if(!stat) - blood_level = min(MAX_BLOOD_LEVEL, blood_level + round(1 * delta_time)) - -/obj/projectile/soulscythe - name = "soulslash" - icon_state = "soulslash" - armor_flag = MELEE //jokair - damage = 15 - light_outer_range = 1 - light_power = 1 - light_color = LIGHT_COLOR_BLOOD_MAGIC - -/obj/projectile/soulscythe/on_hit(atom/target, blocked = FALSE) - if(ishostile(target)) - damage *= 2 - return ..() - -#undef MAX_BLOOD_LEVEL - -//Ash Drake: Spectral Blade, Lava Staff, Dragon's Blood - -/obj/item/melee/ghost_sword - name = "\improper spectral blade" - desc = "A rusted and dulled blade. It doesn't look like it'd do much damage. It glows weakly." - icon_state = "spectral" - inhand_icon_state = "spectral" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - flags_1 = CONDUCT_1 - sharpness = SHARP_EDGED - w_class = WEIGHT_CLASS_BULKY - force = 1 - throwforce = 1 - hitsound = 'sound/effects/ghost2.ogg' - attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") - attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/summon_cooldown = 0 - var/list/mob/dead/observer/spirits - -/obj/item/melee/ghost_sword/Initialize(mapload) - . = ..() - spirits = list() - START_PROCESSING(SSobj, src) - SSpoints_of_interest.make_point_of_interest(src) - AddComponent(/datum/component/butchering, 150, 90) - -/obj/item/melee/ghost_sword/Destroy() - for(var/mob/dead/observer/G in spirits) - G.invisibility = GLOB.observer_default_invisibility - spirits.Cut() - STOP_PROCESSING(SSobj, src) - . = ..() - -/obj/item/melee/ghost_sword/attack_self(mob/user) - if(summon_cooldown > world.time) - to_chat(user, span_warning("You just recently called out for aid. You don't want to annoy the spirits!")) - return - to_chat(user, span_notice("You call out for aid, attempting to summon spirits to your side.")) - - notify_ghosts("[user] is raising [user.p_their()] [name], calling for your help!", - enter_link="(Click to help)", - source = user, ignore_key = POLL_IGNORE_SPECTRAL_BLADE, header = "Spectral blade") - - summon_cooldown = world.time + 600 - -/obj/item/melee/ghost_sword/Topic(href, href_list) - if(href_list["orbit"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - -/obj/item/melee/ghost_sword/process() - ghost_check() - -/obj/item/melee/ghost_sword/proc/ghost_check() - var/ghost_counter = 0 - var/turf/T = get_turf(src) - var/list/contents = T.get_all_contents() - var/mob/dead/observer/current_spirits = list() - for(var/thing in contents) - var/atom/A = thing - A.transfer_observers_to(src) - for(var/i in orbiters?.orbiter_list) - if(!isobserver(i)) - continue - var/mob/dead/observer/G = i - ghost_counter++ - G.invisibility = 0 - current_spirits |= G - for(var/mob/dead/observer/G in spirits - current_spirits) - G.invisibility = GLOB.observer_default_invisibility - spirits = current_spirits - return ghost_counter - -/obj/item/melee/ghost_sword/attack(mob/living/target, mob/living/carbon/human/user) - force = 0 - var/ghost_counter = ghost_check() - force = clamp((ghost_counter * 4), 0, 75) - user.visible_message(span_danger("[user] strikes with the force of [ghost_counter] vengeful spirits!")) - ..() - -/obj/item/melee/ghost_sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - var/ghost_counter = ghost_check() - final_block_chance += clamp((ghost_counter * 5), 0, 75) - owner.visible_message(span_danger("[owner] is protected by a ring of [ghost_counter] ghosts!")) - return ..() - -/obj/item/dragons_blood - name = "bottle of dragons blood" - desc = "You're not actually going to drink this, are you?" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/dragons_blood/attack_self(mob/living/carbon/human/user) - if(!istype(user)) - return - - var/mob/living/carbon/human/consumer = user - var/random = rand(1,4) - - switch(random) - if(1) - to_chat(user, span_danger("Your appearance morphs to that of a very small humanoid ash dragon! You get to look like a freak without the cool abilities.")) - consumer.dna.features = list("tail_lizard" = "Dark Tiger", "tail_human" = "None", "snout" = "Sharp", "horns" = "Curled", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "Long", "legs" = "Digitigrade Legs") - consumer.dna.set_all_mutant_colors_of_key(MUTCOLORS_KEY_GENERIC, "#A02720") - consumer.eye_color_left = "#FEE5A3" - consumer.eye_color_right = "#FEE5A3" - consumer.set_species(/datum/species/lizard) - var/datum/appearance_modifier/lizard_chest_marks/dark/new_mod = new - new_mod.ApplyToMob(user) - if(2) - to_chat(user, span_danger("Your flesh begins to melt! Miraculously, you seem fine otherwise.")) - consumer.set_species(/datum/species/skeleton) - if(3) - to_chat(user, span_danger("Power courses through you! You can now shift your form at will.")) - var/datum/action/cooldown/spell/shapeshift/dragon/dragon_shapeshift = new(user.mind || user) - dragon_shapeshift.Grant(user) - if(4) - to_chat(user, span_danger("You feel like you could walk straight through lava now.")) - ADD_TRAIT(user, TRAIT_LAVA_IMMUNE, type) - - playsound(user,'sound/items/drink.ogg', 30, TRUE) - qdel(src) - -/obj/item/lava_staff - name = "staff of lava" - desc = "The ability to fill the emergency shuttle with lava. What more could you want out of life?" - icon_state = "lavastaff" - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - icon = 'icons/obj/guns/magic.dmi' - slot_flags = ITEM_SLOT_BACK - w_class = WEIGHT_CLASS_NORMAL - force = 18 - damtype = BURN - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - attack_verb_continuous = list("sears", "clubs", "burn") - attack_verb_simple = list("sear", "club", "burn") - hitsound = 'sound/weapons/sear.ogg' - var/turf_type = /turf/open/lava/smooth/weak - var/transform_string = "lava" - var/reset_turf_type = /turf/open/misc/asteroid/basalt - var/reset_string = "basalt" - var/create_cooldown = 10 SECONDS - var/create_delay = 3 SECONDS - var/reset_cooldown = 5 SECONDS - var/timer = 0 - var/static/list/banned_turfs = typecacheof(list(/turf/open/space/transit, /turf/closed)) - -/obj/item/lava_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(timer > world.time) - return - if(is_type_in_typecache(target, banned_turfs)) - return - if(target in view(user.client.view, get_turf(user))) - var/turf/open/T = get_turf(target) - if(!istype(T)) - return - if(!istype(T, /turf/open/lava)) - var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T) - L.alpha = 0 - animate(L, alpha = 255, time = create_delay) - user.visible_message(span_danger("[user] points [src] at [T]!")) - timer = world.time + create_delay + 1 - if(do_after(user, T, create_delay)) - var/old_name = T.name - if(T.TerraformTurf(turf_type, flags = CHANGETURF_INHERIT_AIR)) - user.visible_message(span_danger("[user] turns \the [old_name] into [transform_string]!")) - message_admins("[ADMIN_LOOKUPFLW(user)] fired the lava staff at [ADMIN_VERBOSEJMP(T)]") - log_game("[key_name(user)] fired the lava staff at [AREACOORD(T)].") - timer = world.time + create_cooldown - playsound(T,'sound/magic/fireball.ogg', 200, TRUE) - else - timer = world.time - qdel(L) - else - var/old_name = T.name - if(T.TerraformTurf(reset_turf_type, flags = CHANGETURF_INHERIT_AIR)) - user.visible_message(span_danger("[user] turns \the [old_name] into [reset_string]!")) - timer = world.time + reset_cooldown - playsound(T,'sound/magic/fireball.ogg', 200, TRUE) - -/obj/effect/temp_visual/lavastaff - icon_state = "lavastaff_warn" - duration = 50 - -/turf/open/lava/smooth/weak - lava_damage = 10 - lava_firestacks = 10 - temperature_damage = 2500 - -//Blood-Drunk Miner: Cleaving Saw - - -/obj/item/melee/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." - icon = 'icons/obj/lavaland/artefacts.dmi' - lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi' - righthand_file = 'icons/mob/inhands/64x64_righthand.dmi' - icon_state = "cleaving_saw" - worn_icon_state = "cleaving_saw" - attack_verb_continuous = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts") - attack_verb_simple = list("attack", "saw", "slice", "tear", "lacerate", "rip", "dice", "cut") - force = 12 - throwforce = 20 - inhand_x_dimension = 64 - inhand_y_dimension = 64 - slot_flags = ITEM_SLOT_BELT - hitsound = 'sound/weapons/bladeslice.ogg' - w_class = WEIGHT_CLASS_BULKY - sharpness = SHARP_EDGED - /// Whether the saw is open or not - var/is_open = FALSE - /// List of factions we deal bonus damage to - var/list/nemesis_factions = list("mining", "boss") - /// Amount of damage we deal to the above factions - var/faction_bonus_force = 30 - /// Whether the cleaver is actively AoE swiping something. - var/swiping = FALSE - /// Amount of bleed stacks gained per hit - var/bleed_stacks_per_hit = 3 - /// Force when the saw is opened. - var/open_force = 20 - /// Throwforce when the saw is opened. - var/open_throwforce = 20 - -/obj/item/melee/cleaving_saw/Initialize(mapload) - . = ..() - AddComponent(/datum/component/transforming, \ - transform_cooldown_time = (CLICK_CD_MELEE * 0.25), \ - force_on = open_force, \ - throwforce_on = open_throwforce, \ - sharpness_on = sharpness, \ - hitsound_on = hitsound, \ - w_class_on = w_class, \ - attack_verb_continuous_on = list("cleaves", "swipes", "slashes", "chops"), \ - attack_verb_simple_on = list("cleave", "swipe", "slash", "chop")) - RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) - -/obj/item/melee/cleaving_saw/examine(mob/user) - . = ..() - . += span_notice("It is [is_open ? "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"].") - . += span_notice("Both modes will build up existing bleed effects, doing a burst of high damage if the bleed is built up high enough.") - . += span_notice("Transforming it immediately after an attack causes the next attack to come out faster.") - -/obj/item/melee/cleaving_saw/suicide_act(mob/user) - user.visible_message(span_suicide("[user] is [is_open ? "closing [src] on [user.p_their()] neck" : "opening [src] into [user.p_their()] chest"]! It looks like [user.p_theyre()] trying to commit suicide!")) - attack_self(user) - return BRUTELOSS - -/obj/item/melee/cleaving_saw/melee_attack_chain(mob/user, atom/target, params) - . = ..() - if(!is_open) - user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly - -/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user) - if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user)) - if(!is_open) - faction_bonus_force = 0 - var/is_nemesis_faction = FALSE - for(var/found_faction in target.faction) - if(found_faction in nemesis_factions) - is_nemesis_faction = TRUE - force += faction_bonus_force - nemesis_effects(user, target) - break - . = ..() - if(is_nemesis_faction) - force -= faction_bonus_force - if(!is_open) - faction_bonus_force = initial(faction_bonus_force) - else - var/turf/user_turf = get_turf(user) - var/dir_to_target = get_dir(user_turf, get_turf(target)) - swiping = TRUE - var/static/list/cleaving_saw_cleave_angles = list(0, -45, 45) //so that the animation animates towards the target clicked and not towards a side target - for(var/i in cleaving_saw_cleave_angles) - var/turf/turf = get_step(user_turf, turn(dir_to_target, i)) - for(var/mob/living/living_target in turf) - if(user.Adjacent(living_target) && living_target.body_position != LYING_DOWN) - melee_attack_chain(user, living_target) - swiping = FALSE - -/* - * If we're attacking [target]s in our nemesis list, apply unique effects. - * - * user - the mob attacking with the saw - * target - the mob being attacked - */ -/obj/item/melee/cleaving_saw/proc/nemesis_effects(mob/living/user, mob/living/target) - if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite)) - return - var/datum/status_effect/stacking/saw_bleed/existing_bleed = target.has_status_effect(/datum/status_effect/stacking/saw_bleed) - if(existing_bleed) - existing_bleed.add_stacks(bleed_stacks_per_hit) - else - target.apply_status_effect(/datum/status_effect/stacking/saw_bleed, bleed_stacks_per_hit) - -/* - * Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM]. - * - * Gives feedback and makes the nextmove after transforming much quicker. - */ -/obj/item/melee/cleaving_saw/proc/on_transform(obj/item/source, mob/user, active) - SIGNAL_HANDLER - - is_open = active - user.changeNext_move(CLICK_CD_MELEE * 0.25) - - balloon_alert(user, "[active ? "opened":"closed"] [src]") - playsound(user ? user : src, 'sound/magic/clockwork/fellowship_armory.ogg', 35, TRUE, frequency = 90000 - (is_open * 30000)) - return COMPONENT_NO_DEFAULT_MESSAGE - -//Legion: Staff of Storms - -/obj/item/storm_staff - name = "staff of storms" - desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it." - icon_state = "staffofstorms" - icon = 'icons/obj/guns/magic.dmi' - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - slot_flags = ITEM_SLOT_BACK - w_class = WEIGHT_CLASS_BULKY - force = 20 - damtype = BURN - hitsound = 'sound/weapons/taserhit.ogg' - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - var/max_thunder_charges = 3 - var/thunder_charges = 3 - var/thunder_charge_time = 15 SECONDS - var/static/list/excluded_areas = list(/area/space) - var/list/targeted_turfs = list() - -/obj/item/storm_staff/examine(mob/user) - . = ..() - . += span_notice("It has [thunder_charges] charges remaining.") - . += span_notice("Use it in hand to dispel storms.") - . += span_notice("Use it on targets to summon thunderbolts from the sky.") - . += span_notice("The thunderbolts are boosted if in an area with weather effects.") - -/obj/item/storm_staff/attack_self(mob/user) - var/area/user_area = get_area(user) - var/turf/user_turf = get_turf(user) - if(!user_area || !user_turf || (is_type_in_list(user_area, excluded_areas))) - to_chat(user, span_warning("Something is preventing you from using the staff here.")) - return - var/datum/weather/affected_weather - for(var/datum/weather/weather as anything in SSweather.processing) - if((user_turf.z in weather.impacted_z_levels) && ispath(user_area.type, weather.area_type)) - affected_weather = weather - break - if(!affected_weather) - return - if(affected_weather.stage == END_STAGE) - balloon_alert(user, "already ended!") - return - if(affected_weather.stage == WIND_DOWN_STAGE) - balloon_alert(user, "already ending!") - return - balloon_alert(user, "you hold the staff up...") - if(!do_after(user, src, 3 SECONDS)) - balloon_alert(user, "interrupted!") - return - user.visible_message(span_warning("[user] holds [src] skywards as an orange beam travels into the sky!"), \ - span_notice("You hold [src] skyward, dispelling the storm!")) - playsound(user, 'sound/magic/staff_change.ogg', 200, FALSE) - var/old_color = user.color - user.color = list(340/255, 240/255, 0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) - var/old_transform = user.transform - user.transform *= 1.2 - animate(user, color = old_color, transform = old_transform, time = 1 SECONDS) - affected_weather.wind_down() - log_game("[user] ([key_name(user)]) has dispelled a storm at [AREACOORD(user_turf)]") - -/obj/item/storm_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!thunder_charges) - balloon_alert(user, "needs to charge!") - return - var/turf/target_turf = get_turf(target) - var/area/target_area = get_area(target) - if(!target_turf || !target_area || (is_type_in_list(target_area, excluded_areas))) - balloon_alert(user, "can't bolt here!") - return - if(target_turf in targeted_turfs) - balloon_alert(user, "already targeted!") - return - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - balloon_alert(user, "you don't want to harm!") - return - var/power_boosted = FALSE - for(var/datum/weather/weather as anything in SSweather.processing) - if(weather.stage != MAIN_STAGE) - continue - if((target_turf.z in weather.impacted_z_levels) && ispath(target_area.type, weather.area_type)) - power_boosted = TRUE - break - playsound(src, 'sound/magic/lightningshock.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - targeted_turfs += target_turf - balloon_alert(user, "you aim at [target_turf]...") - new /obj/effect/temp_visual/telegraphing/thunderbolt(target_turf) - addtimer(CALLBACK(src, PROC_REF(throw_thunderbolt), target_turf, power_boosted), 1.5 SECONDS) - thunder_charges-- - addtimer(CALLBACK(src, PROC_REF(recharge)), thunder_charge_time) - log_game("[key_name(user)] fired the staff of storms at [AREACOORD(target_turf)].") - -/obj/item/storm_staff/proc/recharge(mob/user) - thunder_charges = min(thunder_charges + 1, max_thunder_charges) - playsound(src, 'sound/magic/charge.ogg', 10, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - -/obj/item/storm_staff/proc/throw_thunderbolt(turf/target, boosted) - targeted_turfs -= target - new /obj/effect/temp_visual/thunderbolt(target) - var/list/affected_turfs = list(target) - if(boosted) - for(var/direction in GLOB.alldirs) - var/turf_to_add = get_step(target, direction) - if(!turf_to_add) - continue - affected_turfs += turf_to_add - for(var/turf/turf as anything in affected_turfs) - new /obj/effect/temp_visual/electricity(turf) - for(var/mob/living/hit_mob in turf) - to_chat(hit_mob, span_userdanger("You've been struck by lightning!")) - hit_mob.electrocute_act(15 * (isanimal(hit_mob) ? 3 : 1) * (turf == target ? 2 : 1) * (boosted ? 2 : 1), src, flags = SHOCK_TESLA|SHOCK_NOSTUN) - for(var/obj/hit_thing in turf) - hit_thing.take_damage(20, BURN, ENERGY, FALSE) - playsound(target, 'sound/magic/lightningbolt.ogg', 100, TRUE) - target.visible_message(span_danger("A thunderbolt strikes [target]!")) - explosion(target, light_impact_range = (boosted ? 1 : 0), flame_range = (boosted ? 2 : 1), silent = TRUE) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm deleted file mode 100644 index ca298d409087..000000000000 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ /dev/null @@ -1,171 +0,0 @@ -//The chests dropped by tendrils and megafauna. - -/obj/structure/closet/crate/necropolis - name = "necropolis chest" - desc = "It's watching you closely." - icon_state = "necrocrate" - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - can_install_electronics = FALSE - -/obj/structure/closet/crate/necropolis/tendril - desc = "It's watching you suspiciously. You need a skeleton key to open it." - integrity_failure = 0 //prevents bust_open from firing - /// var to check if it got opened by a key - var/spawned_loot = FALSE - -/obj/structure/closet/crate/necropolis/tendril/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_PARENT_ATTACKBY, PROC_REF(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,20) - switch(loot) - if(1) - new /obj/item/shared_storage/red(src) - if(2) - new /obj/item/soulstone/anybody/mining(src) - if(3) - new /obj/item/organ/cyberimp/arm/katana(src) - if(4) - new /obj/item/clothing/glasses/godeye(src) - if(5) - new /obj/item/reagent_containers/glass/bottle/potion/flight(src) - if(6) - new /obj/item/clothing/gloves/gauntlets(src) - if(7) - var/mod = rand(1,4) - switch(mod) - if(1) - new /obj/item/disk/data/modkit_disc/resonator_blast(src) - if(2) - new /obj/item/disk/data/modkit_disc/rapid_repeater(src) - if(3) - new /obj/item/disk/data/modkit_disc/mob_and_turf_aoe(src) - if(4) - new /obj/item/disk/data/modkit_disc/bounty(src) - if(8) - new /obj/item/rod_of_asclepius(src) - if(9) - new /obj/item/organ/heart/cursed/wizard(src) - if(10) - new /obj/item/ship_in_a_bottle(src) - if(11) - new /obj/item/clothing/suit/hooded/berserker(src) - if(12) - new /obj/item/jacobs_ladder(src) - if(13) - new /obj/item/guardiancreator/miner(src) - if(14) - new /obj/item/warp_cube/red(src) - if(15) - new /obj/item/wisp_lantern(src) - if(16) - new /obj/item/immortality_talisman(src) - if(17) - new /obj/item/book/granter/action/spell/summonitem(src) - if(18) - new /obj/item/book_of_babel(src) - if(19) - new /obj/item/borg/upgrade/modkit/lifesteal(src) - new /obj/item/bedsheet/cult(src) - if(20) - new /obj/item/clothing/neck/necklace/memento_mori(src) - spawned_loot = TRUE - qdel(item) - to_chat(user, span_notice("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 ..() - -//Megafauna chests - -/obj/structure/closet/crate/necropolis/dragon - 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/action/spell/sacredflame(src) - if(4) - 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) - -/obj/structure/closet/crate/necropolis/bubblegum - name = "bubblegum chest" - -/obj/structure/closet/crate/necropolis/bubblegum/PopulateContents() - new /obj/item/clothing/suit/hooded/hostile_environment(src) - var/loot = rand(1,2) - switch(loot) - if(1) - new /obj/item/mayhem(src) - if(2) - new /obj/item/soulscythe(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) - -/obj/structure/closet/crate/necropolis/colossus - name = "colossus chest" - -/obj/structure/closet/crate/necropolis/colossus/bullet_act(obj/projectile/P) - if(istype(P, /obj/projectile/colossus)) - return BULLET_ACT_FORCE_PIERCE - 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) - -/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) - -//Other chests and minor stuff - -/obj/structure/closet/crate/necropolis/puzzle - name = "puzzling chest" - -/obj/structure/closet/crate/necropolis/puzzle/PopulateContents() - var/loot = rand(1,3) - switch(loot) - if(1) - new /obj/item/soulstone/anybody/mining(src) - if(2) - new /obj/item/wisp_lantern(src) - if(3) - new /obj/item/prisoncube(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/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm deleted file mode 100644 index 40e79bb18df4..000000000000 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ /dev/null @@ -1,1060 +0,0 @@ -//This file contains loot you can obtain from tendril chests. - -//KA modkit design discs -/obj/item/disk/data/modkit_disc - name = "KA Mod Disk" - desc = "A design disc containing the design for a unique kinetic accelerator modkit." - icon_state = "datadisk1" - var/modkit_design = /datum/design/unique_modkit - -/obj/item/disk/data/modkit_disc/Initialize(mapload) - . = ..() - LAZYADD(memory[DATA_IDX_DESIGNS], SStech.designs_by_type[modkit_design]) - -/obj/item/disk/data/modkit_disc/mob_and_turf_aoe - name = "Offensive Mining Explosion Mod Disk" - modkit_design = /datum/design/unique_modkit/offensive_turf_aoe - -/obj/item/disk/data/modkit_disc/rapid_repeater - name = "Rapid Repeater Mod Disk" - modkit_design = /datum/design/unique_modkit/rapid_repeater - -/obj/item/disk/data/modkit_disc/resonator_blast - name = "Resonator Blast Mod Disk" - modkit_design = /datum/design/unique_modkit/resonator_blast - -/obj/item/disk/data/modkit_disc/bounty - name = "Death Syphon Mod Disk" - modkit_design = /datum/design/unique_modkit/bounty - -/datum/design/unique_modkit - category = list("Mining Designs", "Cyborg Upgrade Modules") //can't be normally obtained - build_type = FABRICATOR | MECHFAB - mapload_design_flags = DESIGN_FAB_SUPPLY - -/datum/design/unique_modkit/offensive_turf_aoe - name = "Kinetic Accelerator Offensive Mining Explosion Mod" - desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures." - id = "hyperaoemod" - materials = list(/datum/material/iron = 7000, /datum/material/glass = 3000, /datum/material/silver = 3000, /datum/material/gold = 3000, /datum/material/diamond = 4000) - build_path = /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs - -/datum/design/unique_modkit/rapid_repeater - name = "Kinetic Accelerator Rapid Repeater Mod" - desc = "A device which greatly reduces a kinetic accelerator's cooldown on striking a living target or rock, but greatly increases its base cooldown." - id = "repeatermod" - materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/uranium = 8000, /datum/material/bluespace = 2000) - build_path = /obj/item/borg/upgrade/modkit/cooldown/repeater - -/datum/design/unique_modkit/resonator_blast - name = "Kinetic Accelerator Resonator Blast Mod" - desc = "A device which causes kinetic accelerators to fire shots that leave and detonate resonator blasts." - id = "resonatormod" - materials = list(/datum/material/iron = 5000, /datum/material/glass = 5000, /datum/material/silver = 5000, /datum/material/uranium = 5000) - build_path = /obj/item/borg/upgrade/modkit/resonator_blasts - -/datum/design/unique_modkit/bounty - name = "Kinetic Accelerator Death Syphon Mod" - desc = "A device which causes kinetic accelerators to permanently gain damage against creature types killed with it." - id = "bountymod" - materials = list(/datum/material/iron = 4000, /datum/material/silver = 4000, /datum/material/gold = 4000, /datum/material/bluespace = 4000) - reagents_list = list(/datum/reagent/blood = 40) - build_path = /obj/item/borg/upgrade/modkit/bounty - -//Spooky special loot - -//Rod of Asclepius -/obj/item/rod_of_asclepius - name = "\improper Rod of Asclepius" - desc = "A wooden rod about the size of your forearm with a snake carved around it, winding its way up the sides of the rod. Something about it seems to inspire in you the responsibilty and duty to help others." - icon = 'icons/obj/lavaland/artefacts.dmi' - lefthand_file = 'icons/mob/inhands/weapons/staves_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' - icon_state = "asclepius_dormant" - var/activated = FALSE - var/usedHand - -/obj/item/rod_of_asclepius/attack_self(mob/user) - if(activated) - return - if(!iscarbon(user)) - to_chat(user, span_warning("The snake carving seems to come alive, if only for a moment, before returning to its dormant state, almost as if it finds you incapable of holding its oath.")) - return - var/mob/living/carbon/itemUser = user - usedHand = itemUser.get_held_index_of_item(src) - if(itemUser.has_status_effect(/datum/status_effect/hippocratic_oath)) - to_chat(user, span_warning("You can't possibly handle the responsibility of more than one rod!")) - return - var/failText = span_warning("The snake seems unsatisfied with your incomplete oath and returns to its previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!") - to_chat(itemUser, span_notice("The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong...")) - if(do_after(itemUser, itemUser, 40)) - itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath") - else - to_chat(itemUser, failText) - return - if(do_after(itemUser, itemUser, 20)) - itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath") - else - to_chat(itemUser, failText) - return - if(do_after(itemUser, itemUser, 30)) - itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath") - else - to_chat(itemUser, failText) - return - if(do_after(itemUser, itemUser, 30)) - itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath") - else - to_chat(itemUser, failText) - return - to_chat(itemUser, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory...")) - var/datum/status_effect/hippocratic_oath/effect = itemUser.apply_status_effect(/datum/status_effect/hippocratic_oath) - effect.hand = usedHand - activated() - -/obj/item/rod_of_asclepius/proc/activated() - item_flags = DROPDEL - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT(type)) - desc = "A short wooden rod with a mystical snake inseparably gripping itself and the rod to your forearm. It flows with a healing energy that disperses amongst yourself and those around you. " - icon_state = "asclepius_active" - activated = TRUE - -//Memento Mori -/obj/item/clothing/neck/necklace/memento_mori - name = "Memento Mori" - desc = "A mysterious pendant. An inscription on it says: \"Certain death tomorrow means certain life today.\"" - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "memento_mori" - worn_icon_state = "memento" - actions_types = list(/datum/action/item_action/hands_free/memento_mori) - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/mob/living/carbon/human/active_owner - -/obj/item/clothing/neck/necklace/memento_mori/item_action_slot_check(slot) - return slot == ITEM_SLOT_NECK - -/obj/item/clothing/neck/necklace/memento_mori/dropped(mob/user) - ..() - if(active_owner) - mori() - -//Just in case -/obj/item/clothing/neck/necklace/memento_mori/Destroy() - if(active_owner) - mori() - return ..() - -/obj/item/clothing/neck/necklace/memento_mori/proc/memento(mob/living/carbon/human/user) - to_chat(user, span_warning("You feel your life being drained by the pendant...")) - if(do_after(user, user, 40)) - to_chat(user, span_notice("Your lifeforce is now linked to the pendant! You feel like removing it would kill you, and yet you instinctively know that until then, you won't die.")) - ADD_TRAIT(user, TRAIT_NODEATH, CLOTHING_TRAIT) - ADD_TRAIT(user, TRAIT_NOHARDCRIT, CLOTHING_TRAIT) - ADD_TRAIT(user, TRAIT_NOCRITDAMAGE, CLOTHING_TRAIT) - RegisterSignal(user, COMSIG_CARBON_HEALTH_UPDATE, PROC_REF(check_health)) - icon_state = "memento_mori_active" - active_owner = user - -/obj/item/clothing/neck/necklace/memento_mori/proc/mori() - icon_state = "memento_mori" - if(!active_owner) - return - UnregisterSignal(active_owner, COMSIG_CARBON_HEALTH_UPDATE) - var/mob/living/carbon/human/H = active_owner //to avoid infinite looping when dust unequips the pendant - active_owner = null - to_chat(H, span_userdanger("You feel your life rapidly slipping away from you!")) - H.dust(TRUE, TRUE) - -/obj/item/clothing/neck/necklace/memento_mori/proc/check_health(mob/living/source) - SIGNAL_HANDLER - - var/list/guardians = source.hasparasites() - if(!length(guardians)) - return - if(source.health <= HEALTH_THRESHOLD_DEAD) - for(var/mob/guardian in guardians) - if(guardian.loc == src) - continue - consume_guardian(guardian) - else if(source.health > HEALTH_THRESHOLD_CRIT) - for(var/mob/guardian in guardians) - if(guardian.loc != src) - continue - regurgitate_guardian(guardian) - -/obj/item/clothing/neck/necklace/memento_mori/proc/consume_guardian(mob/living/simple_animal/hostile/guardian/guardian) - new /obj/effect/temp_visual/guardian/phase/out(get_turf(guardian)) - guardian.locked = TRUE - guardian.forceMove(src) - to_chat(guardian, span_userdanger("You have been locked away in your summoner's pendant!")) - guardian.playsound_local(get_turf(guardian), 'sound/magic/summonitems_generic.ogg', 50, TRUE) - -/obj/item/clothing/neck/necklace/memento_mori/proc/regurgitate_guardian(mob/living/simple_animal/hostile/guardian/guardian) - guardian.locked = FALSE - guardian.Recall(TRUE) - to_chat(guardian, span_notice("You have been returned back from your summoner's pendant!")) - guardian.playsound_local(get_turf(guardian), 'sound/magic/repulse.ogg', 50, TRUE) - -/datum/action/item_action/hands_free/memento_mori - check_flags = NONE - name = "Memento Mori" - desc = "Bind your life to the pendant." - -/datum/action/item_action/hands_free/memento_mori/Trigger(trigger_flags) - var/obj/item/clothing/neck/necklace/memento_mori/MM = target - if(!MM.active_owner) - if(ishuman(owner)) - MM.memento(owner) - Remove(MM.active_owner) //Remove the action button, since there's no real use in having it now. - -//Wisp Lantern -/obj/item/wisp_lantern - name = "spooky lantern" - desc = "This lantern gives off no light, but is home to a friendly wisp." - icon = 'icons/obj/lighting.dmi' - icon_state = "lantern-blue" - inhand_icon_state = "lantern" - lefthand_file = 'icons/mob/inhands/equipment/mining_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/mining_righthand.dmi' - var/obj/effect/wisp/wisp - -/obj/item/wisp_lantern/attack_self(mob/user) - if(!wisp) - to_chat(user, span_warning("The wisp has gone missing!")) - icon_state = "lantern" - return - - if(wisp.loc == src) - to_chat(user, span_notice("You release the wisp. It begins to bob around your head.")) - icon_state = "lantern" - wisp.orbit(user, 20) - SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed") - - else - to_chat(user, span_notice("You return the wisp to the lantern.")) - icon_state = "lantern-blue" - wisp.forceMove(src) - SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned") - -/obj/item/wisp_lantern/Initialize(mapload) - . = ..() - wisp = new(src) - -/obj/item/wisp_lantern/Destroy() - if(wisp) - if(wisp.loc == src) - qdel(wisp) - else - wisp.visible_message(span_notice("[wisp] has a sad feeling for a moment, then it passes.")) - return ..() - -/obj/effect/wisp - name = "friendly wisp" - desc = "Happy to light your way." - icon = 'icons/obj/lighting.dmi' - icon_state = "orb" - light_system = MOVABLE_LIGHT - light_outer_range = 7 - light_flags = LIGHT_ATTACHED - layer = ABOVE_ALL_MOB_LAYER - var/sight_flags = SEE_MOBS - var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - -/obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit) - . = ..() - if(ismob(thing)) - RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(update_user_sight)) - var/mob/being = thing - being.update_sight() - to_chat(thing, span_notice("The wisp enhances your vision.")) - -/obj/effect/wisp/stop_orbit(datum/component/orbiter/orbits) - . = ..() - if(ismob(orbits.parent)) - UnregisterSignal(orbits.parent, COMSIG_MOB_UPDATE_SIGHT) - to_chat(orbits.parent, span_notice("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) - -//Red/Blue Cubes -/obj/item/warp_cube - name = "blue cube" - desc = "A mysterious blue cube." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "blue_cube" - var/teleport_color = "#3FBAFD" - 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) - var/turf/current_location = get_turf(user) - var/area/current_area = current_location.loc - if(!linked || (current_area.area_flags & NOTELEPORT)) - to_chat(user, span_warning("[src] fizzles uselessly.")) - return - if(teleporting) - 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) - var/obj/effect/warp_cube/link_holder = new /obj/effect/warp_cube(T) - user.forceMove(link_holder) //mess around with loc so the user can't wander around - sleep(2.5) - if(QDELETED(user)) - qdel(link_holder) - return - if(QDELETED(linked)) - user.forceMove(get_turf(link_holder)) - qdel(link_holder) - return - link_holder.forceMove(get_turf(linked)) - sleep(2.5) - if(QDELETED(user)) - qdel(link_holder) - return - teleporting = FALSE - if(!QDELETED(linked)) - linked.teleporting = FALSE - user.forceMove(get_turf(link_holder)) - qdel(link_holder) - -/obj/item/warp_cube/red - name = "red cube" - desc = "A mysterious red cube." - icon_state = "red_cube" - teleport_color = "#FD3F48" - -/obj/item/warp_cube/red/Initialize(mapload) - . = ..() - if(!linked) - var/obj/item/warp_cube/blue = new(src.loc) - linked = blue - blue.linked = src - -/obj/effect/warp_cube - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - anchored = TRUE - -//Immortality Talisman -/obj/item/immortality_talisman - name = "\improper Immortality Talisman" - desc = "A dread talisman that can render you completely invulnerable." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "talisman" - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - actions_types = list(/datum/action/item_action/immortality) - var/cooldown = 0 - -/obj/item/immortality_talisman/Initialize(mapload) - . = ..() - AddComponent(/datum/component/anti_magic, ALL) - -/datum/action/item_action/immortality - name = "Immortality" - -/obj/item/immortality_talisman/attack_self(mob/user) - if(cooldown < world.time) - SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1) - cooldown = world.time + 600 - new /obj/effect/immortality_talisman(get_turf(user), user) - else - to_chat(user, span_warning("[src] is not ready yet!")) - -/obj/effect/immortality_talisman - name = "hole in reality" - desc = "It's shaped an awful lot like a person." - icon_state = "blank" - icon = 'icons/effects/effects.dmi' - var/vanish_description = "vanishes from reality" - var/can_destroy = TRUE - -/obj/effect/immortality_talisman/Initialize(mapload, mob/new_user) - . = ..() - if(new_user) - vanish(new_user) - -/obj/effect/immortality_talisman/proc/vanish(mob/user) - user.visible_message(span_danger("[user] [vanish_description], leaving a hole in [user.p_their()] place!")) - - desc = "It's shaped an awful lot like [user.name]." - setDir(user.dir) - - user.forceMove(src) - user.notransform = TRUE - user.status_flags |= GODMODE - - can_destroy = FALSE - - addtimer(CALLBACK(src, PROC_REF(unvanish), user), 10 SECONDS) - -/obj/effect/immortality_talisman/proc/unvanish(mob/user) - user.status_flags &= ~GODMODE - user.notransform = FALSE - user.forceMove(get_turf(src)) - - user.visible_message(span_danger("[user] pops back into reality!")) - can_destroy = TRUE - qdel(src) - -/obj/effect/immortality_talisman/attackby() - return - -/obj/effect/immortality_talisman/singularity_pull() - return - -/obj/effect/immortality_talisman/Destroy(force) - if(!can_destroy && !force) - return QDEL_HINT_LETMELIVE - else - . = ..() - -/obj/effect/immortality_talisman/void - vanish_description = "is dragged into the void" - -//Shared Bag - -/obj/item/shared_storage - name = "paradox bag" - desc = "Somehow, it's in two places at once." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "paradox_bag" - worn_icon_state = "paradoxbag" - slot_flags = ITEM_SLOT_BELT - resistance_flags = INDESTRUCTIBLE - -/obj/item/shared_storage/red - name = "paradox bag" - desc = "Somehow, it's in two places at once." - -/obj/item/shared_storage/red/Initialize(mapload) - . = ..() - - create_storage(max_total_storage = 15, max_slots = 21) - - new /obj/item/shared_storage/blue(drop_location(), src) - -/obj/item/shared_storage/blue/Initialize(mapload, atom/master) - . = ..() - if(!istype(master)) - return INITIALIZE_HINT_QDEL - create_storage(max_total_storage = 15, max_slots = 21) - - atom_storage.set_real_location(master) - -//Book of Babel - -/obj/item/book_of_babel - name = "Book of Babel" - desc = "An ancient tome written in countless tongues." - icon = 'icons/obj/library.dmi' - icon_state = "book1" - w_class = WEIGHT_CLASS_SMALL - -/obj/item/book_of_babel/attack_self(mob/user) - if(!user.can_read(src)) - return FALSE - to_chat(user, span_notice("You flip through the pages of the book, quickly and conveniently learning every language in existence. Somewhat less conveniently, the aging book crumbles to dust in the process. Whoops.")) - user.grant_all_languages() - new /obj/effect/decal/cleanable/ash(get_turf(user)) - qdel(src) - - -//Potion of Flight -/obj/item/reagent_containers/glass/bottle/potion - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "potionflask" - -/obj/item/reagent_containers/glass/bottle/potion/flight - name = "strange elixir" - desc = "A flask with an almost-holy aura emitting from it. The label on the bottle says: 'erqo'hyy tvi'rf lbh jv'atf'." - list_reagents = list(/datum/reagent/flightpotion = 5) - -/obj/item/reagent_containers/glass/bottle/potion/update_icon_state() - icon_state = "potionflask[reagents.total_volume ? null : "_empty"]" - return ..() - -/datum/reagent/flightpotion - name = "Flight Potion" - description = "Strange mutagenic compound of unknown origins." - reagent_state = LIQUID - color = "#FFEBEB" - -/datum/reagent/flightpotion/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) - . = ..() - if(iscarbon(exposed_mob) && exposed_mob.stat != DEAD) - var/mob/living/carbon/exposed_carbon = exposed_mob - var/holycheck = ishumanbasic(exposed_carbon) - if(!HAS_TRAIT(exposed_carbon, TRAIT_CAN_USE_FLIGHT_POTION) || reac_volume < 5) - if((methods & INGEST) && show_message) - to_chat(exposed_carbon, span_notice("You feel nothing but a terrible aftertaste.")) - return - if(exposed_carbon.dna.species.has_innate_wings) - to_chat(exposed_carbon, span_userdanger("A terrible pain travels down your back as your wings change shape!")) - else - to_chat(exposed_carbon, span_userdanger("A terrible pain travels down your back as wings burst out!")) - exposed_carbon.dna.species.GiveSpeciesFlight(exposed_carbon) - if(holycheck) - to_chat(exposed_carbon, span_notice("You feel blessed!")) - ADD_TRAIT(exposed_carbon, TRAIT_HOLY, FLIGHTPOTION_TRAIT) - playsound(exposed_carbon.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1) - exposed_carbon.adjustBruteLoss(20) - exposed_carbon.emote("scream") - - -/obj/item/jacobs_ladder - name = "jacob's ladder" - desc = "A celestial ladder that violates the laws of physics." - icon = 'icons/obj/structures.dmi' - icon_state = "ladder00" - -/obj/item/jacobs_ladder/attack_self(mob/user) - var/turf/T = get_turf(src) - var/ladder_x = T.x - var/ladder_y = T.y - to_chat(user, span_notice("You unfold the ladder. It extends much farther than you were expecting.")) - var/last_ladder = null - for(var/i in 1 to world.maxz) - if(is_centcom_level(i) || is_reserved_level(i) || is_away_level(i)) - continue - var/turf/T2 = locate(ladder_x, ladder_y, i) - last_ladder = new /obj/structure/ladder/unbreakable/jacob(T2, null, last_ladder) - qdel(src) - -// Inherit from unbreakable but don't set ID, to suppress the default Z linkage -/obj/structure/ladder/unbreakable/jacob - name = "jacob's ladder" - desc = "An indestructible celestial ladder that violates the laws of physics." - -//Concussive Gauntlets -/obj/item/clothing/gloves/gauntlets - name = "concussive gauntlets" - desc = "Pickaxes... for your hands!" - icon_state = "concussive_gauntlets" - inhand_icon_state = "concussive_gauntlets" - toolspeed = 0.1 - strip_delay = 40 - equip_delay_other = 20 - cold_protection = HANDS - min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT - heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - resistance_flags = LAVA_PROOF | FIRE_PROOF //they are from lavaland after all - armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 15, BOMB = 100, BIO = 0, FIRE = 100, ACID = 30) //mostly bone bracer armor - -/obj/item/clothing/gloves/gauntlets/equipped(mob/user, slot) - . = ..() - if(slot == ITEM_SLOT_GLOVES) - tool_behaviour = TOOL_MINING - RegisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, PROC_REF(rocksmash)) - RegisterSignal(user, COMSIG_MOVABLE_BUMP, PROC_REF(rocksmash)) - else - stopmining(user) - -/obj/item/clothing/gloves/gauntlets/dropped(mob/user) - . = ..() - stopmining(user) - -/obj/item/clothing/gloves/gauntlets/proc/stopmining(mob/user) - tool_behaviour = initial(tool_behaviour) - UnregisterSignal(user, COMSIG_HUMAN_EARLY_UNARMED_ATTACK) - UnregisterSignal(user, COMSIG_MOVABLE_BUMP) - -/obj/item/clothing/gloves/gauntlets/proc/rocksmash(mob/living/carbon/human/H, atom/A, proximity) - SIGNAL_HANDLER - if(!istype(A, /turf/closed/mineral)) - return - A.attackby(src, H) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/obj/item/clothing/suit/hooded/berserker - name = "berserker armor" - desc = "Voices echo from the armor, driving the user insane. Is not space-proof." - icon_state = "berserker" - hoodtype = /obj/item/clothing/head/hooded/berserker - armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) - cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - resistance_flags = FIRE_PROOF - clothing_flags = THICKMATERIAL - allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/regenerative_core/legion, /obj/item/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw) - -/obj/item/clothing/suit/hooded/berserker/Initialize(mapload) - . = ..() - AddComponent(/datum/component/anti_magic, ALL, inventory_flags = ITEM_SLOT_OCLOTHING) - -#define MAX_BERSERK_CHARGE 100 -#define PROJECTILE_HIT_MULTIPLIER 1.5 -#define DAMAGE_TO_CHARGE_SCALE 0.75 -#define CHARGE_DRAINED_PER_SECOND 5 -#define BERSERK_MELEE_ARMOR_ADDED 50 -#define BERSERK_ATTACK_SPEED_MODIFIER 0.25 - -/obj/item/clothing/head/hooded/berserker - name = "berserker helmet" - desc = "Peering into the eyes of the helmet is enough to seal damnation." - icon_state = "berserker" - armor = list(MELEE = 30, BULLET = 30, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) - actions_types = list(/datum/action/item_action/berserk_mode) - cold_protection = HEAD - min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT - heat_protection = HEAD - max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - resistance_flags = FIRE_PROOF - clothing_flags = SNUG_FIT|THICKMATERIAL - /// Current charge of berserk, goes from 0 to 100 - var/berserk_charge = 0 - /// Status of berserk - var/berserk_active = FALSE - -/obj/item/clothing/head/hooded/berserker/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, LOCKED_HELMET_TRAIT) - -/obj/item/clothing/head/hooded/berserker/examine() - . = ..() - . += span_notice("Berserk mode is [berserk_charge]% charged.") - -/obj/item/clothing/head/hooded/berserker/process(delta_time) - if(berserk_active) - berserk_charge = clamp(berserk_charge - CHARGE_DRAINED_PER_SECOND * delta_time, 0, MAX_BERSERK_CHARGE) - if(!berserk_charge) - if(ishuman(loc)) - end_berserk(loc) - -/obj/item/clothing/head/hooded/berserker/dropped(mob/user) - . = ..() - end_berserk(user) - -/obj/item/clothing/head/hooded/berserker/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(berserk_active) - return - var/berserk_value = damage * DAMAGE_TO_CHARGE_SCALE - if(attack_type == PROJECTILE_ATTACK) - berserk_value *= PROJECTILE_HIT_MULTIPLIER - berserk_charge = clamp(round(berserk_charge + berserk_value), 0, MAX_BERSERK_CHARGE) - if(berserk_charge >= MAX_BERSERK_CHARGE) - to_chat(owner, span_notice("Berserk mode is fully charged.")) - balloon_alert(owner, "berserk charged") - -/obj/item/clothing/head/hooded/berserker/IsReflect() - if(berserk_active) - return TRUE - -/// Starts berserk, giving the wearer 50 melee armor, doubled attacking speed, NOGUNS trait, adding a color and giving them the berserk movespeed modifier -/obj/item/clothing/head/hooded/berserker/proc/berserk_mode(mob/living/carbon/human/user) - to_chat(user, span_warning("You enter berserk mode.")) - playsound(user, 'sound/magic/staff_healing.ogg', 50) - user.add_movespeed_modifier(/datum/movespeed_modifier/berserk) - user.physiology.armor.melee += BERSERK_MELEE_ARMOR_ADDED - user.next_move_modifier *= BERSERK_ATTACK_SPEED_MODIFIER - user.add_atom_colour(COLOR_BUBBLEGUM_RED, TEMPORARY_COLOUR_PRIORITY) - ADD_TRAIT(user, TRAIT_NOGUNS, BERSERK_TRAIT) - ADD_TRAIT(src, TRAIT_NODROP, BERSERK_TRAIT) - berserk_active = TRUE - START_PROCESSING(SSobj, src) - -/// Ends berserk, reverting the changes from the proc [berserk_mode] -/obj/item/clothing/head/hooded/berserker/proc/end_berserk(mob/living/carbon/human/user) - if(!berserk_active) - return - berserk_active = FALSE - if(QDELETED(user)) - return - to_chat(user, span_warning("You exit berserk mode.")) - playsound(user, 'sound/magic/summonitems_generic.ogg', 50) - user.remove_movespeed_modifier(/datum/movespeed_modifier/berserk) - user.physiology.armor.melee -= BERSERK_MELEE_ARMOR_ADDED - user.next_move_modifier /= BERSERK_ATTACK_SPEED_MODIFIER - user.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BUBBLEGUM_RED) - REMOVE_TRAIT(user, TRAIT_NOGUNS, BERSERK_TRAIT) - REMOVE_TRAIT(src, TRAIT_NODROP, BERSERK_TRAIT) - STOP_PROCESSING(SSobj, src) - -#undef MAX_BERSERK_CHARGE -#undef PROJECTILE_HIT_MULTIPLIER -#undef DAMAGE_TO_CHARGE_SCALE -#undef CHARGE_DRAINED_PER_SECOND -#undef BERSERK_MELEE_ARMOR_ADDED -#undef BERSERK_ATTACK_SPEED_MODIFIER - -/obj/item/clothing/glasses/godeye - name = "eye of god" - desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes." - icon_state = "godeye" - inhand_icon_state = "godeye" - vision_flags = SEE_TURFS - darkness_view = 8 - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - custom_materials = null - var/datum/action/cooldown/scan/scan_ability - -/obj/item/clothing/glasses/godeye/Initialize(mapload) - . = ..() - scan_ability = new(src) - -/obj/item/clothing/glasses/godeye/Destroy() - QDEL_NULL(scan_ability) - return ..() - -/obj/item/clothing/glasses/godeye/equipped(mob/living/user, slot) - . = ..() - if(ishuman(user) && slot == ITEM_SLOT_EYES) - ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) - pain(user) - scan_ability.Grant(user) - -/obj/item/clothing/glasses/godeye/dropped(mob/living/user) - . = ..() - // Behead someone, their "glasses" drop on the floor - // and thus, the god eye should no longer be sticky - REMOVE_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) - scan_ability.Remove(user) - -/obj/item/clothing/glasses/godeye/proc/pain(mob/living/victim) - to_chat(victim, span_userdanger("You experience blinding pain, as [src] burrows into your skull.")) - victim.emote("scream") - victim.flash_act() - -/datum/action/cooldown/scan - name = "Scan" - desc = "Scan an enemy, to get their location and stagger them, increasing their time between attacks." - background_icon_state = "bg_clock" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "scan" - - click_to_activate = TRUE - cooldown_time = 45 SECONDS - ranged_mousepointer = 'icons/effects/mouse_pointers/scan_target.dmi' - -/datum/action/cooldown/scan/IsAvailable(feedback = FALSE) - return ..() && isliving(owner) - -/datum/action/cooldown/scan/Activate(atom/scanned) - StartCooldown(15 SECONDS) - - if(owner.stat != CONSCIOUS) - return FALSE - if(!isliving(scanned) || scanned == owner) - owner.balloon_alert(owner, "invalid scanned!") - return FALSE - - var/mob/living/living_owner = owner - var/mob/living/living_scanned = scanned - living_scanned.apply_status_effect(/datum/status_effect/stagger) - var/datum/status_effect/agent_pinpointer/scan_pinpointer = living_owner.apply_status_effect(/datum/status_effect/agent_pinpointer/scan) - scan_pinpointer.scan_target = living_scanned - - living_scanned.set_timed_status_effect(100 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - to_chat(living_scanned, span_warning("You've been staggered!")) - living_scanned.add_filter("scan", 2, list("type" = "outline", "color" = COLOR_YELLOW, "size" = 1)) - addtimer(CALLBACK(living_scanned, TYPE_PROC_REF(/atom, remove_filter), "scan"), 30 SECONDS) - - owner.playsound_local(get_turf(owner), 'sound/magic/smoke.ogg', 50, TRUE) - owner.balloon_alert(owner, "[living_scanned] scanned") - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, balloon_alert), owner, "scan recharged"), cooldown_time) - - StartCooldown() - return TRUE - -/datum/status_effect/agent_pinpointer/scan - duration = 15 SECONDS - alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/scan - tick_interval = 2 SECONDS - range_fuzz_factor = 0 - minimum_range = 1 - range_mid = 5 - range_far = 15 - -/datum/status_effect/agent_pinpointer/scan/scan_for_target() - return - -/atom/movable/screen/alert/status_effect/agent_pinpointer/scan - name = "Scan Target" - desc = "Contact may or may not be close." - -/obj/item/organ/cyberimp/arm/katana - name = "dark shard" - desc = "An eerie metal shard surrounded by dark energies." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "cursed_katana_organ" - status = ORGAN_ORGANIC - organ_flags = ORGAN_FROZEN|ORGAN_UNREMOVABLE - items_to_create = list(/obj/item/cursed_katana) - extend_sound = 'sound/items/unsheath.ogg' - retract_sound = 'sound/items/sheath.ogg' - -/obj/item/organ/cyberimp/arm/katana/attack_self(mob/user, modifiers) - . = ..() - to_chat(user, span_userdanger("The mass goes up your arm and goes inside it!")) - playsound(user, 'sound/magic/demon_consume.ogg', 50, TRUE) - var/index = user.get_held_index_of_item(src) - zone = (index == LEFT_HANDS ? BODY_ZONE_L_ARM : BODY_ZONE_R_ARM) - SetSlotFromZone() - user.temporarilyRemoveItemFromInventory(src, TRUE) - Insert(user) - -/obj/item/organ/cyberimp/arm/katana/screwdriver_act(mob/living/user, obj/item/screwtool) - return - -/obj/item/organ/cyberimp/arm/katana/Retract() - var/obj/item/cursed_katana/katana = active_item - if(!katana || katana.shattered) - return FALSE - if(!katana.drew_blood) - to_chat(owner, span_userdanger("[katana] lashes out at you in hunger!")) - playsound(owner, 'sound/magic/demon_attack1.ogg', 50, TRUE) - var/obj/item/bodypart/part = owner.get_holding_bodypart_of_item(katana) - if(part) - part.receive_damage(brute = 25, sharpness = SHARP_EDGED) - katana.drew_blood = FALSE - katana.wash(CLEAN_TYPE_BLOOD) - return ..() - -#define LEFT_SLASH "Left Slash" -#define RIGHT_SLASH "Right Slash" -#define COMBO_STEPS "steps" -#define COMBO_PROC "proc" -#define ATTACK_STRIKE "Hilt Strike" -#define ATTACK_SLICE "Wide Slice" -#define ATTACK_DASH "Dash Attack" -#define ATTACK_CUT "Tendon Cut" -#define ATTACK_CLOAK "Dark Cloak" -#define ATTACK_SHATTER "Shatter" - -/obj/item/cursed_katana - name = "cursed katana" - desc = "A katana used to seal something vile away long ago. \ - Even with the weapon destroyed, all the pieces containing the creature have coagulated back together to find a new host." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "cursed_katana" - lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - force = 15 - armour_penetration = 30 - block_chance = 30 - sharpness = SHARP_EDGED - w_class = WEIGHT_CLASS_HUGE - attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") - attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") - hitsound = 'sound/weapons/bladeslice.ogg' - resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | FREEZE_PROOF - var/shattered = FALSE - var/drew_blood = FALSE - var/timerid - var/list/input_list = list() - var/list/combo_strings = list() - var/static/list/combo_list = list( - ATTACK_STRIKE = list(COMBO_STEPS = list(LEFT_SLASH, LEFT_SLASH, RIGHT_SLASH), COMBO_PROC = PROC_REF(strike)), - ATTACK_SLICE = list(COMBO_STEPS = list(RIGHT_SLASH, LEFT_SLASH, LEFT_SLASH), COMBO_PROC = PROC_REF(slice)), - ATTACK_DASH = list(COMBO_STEPS = list(LEFT_SLASH, RIGHT_SLASH, RIGHT_SLASH), COMBO_PROC = PROC_REF(dash)), - ATTACK_CUT = list(COMBO_STEPS = list(RIGHT_SLASH, RIGHT_SLASH, LEFT_SLASH), COMBO_PROC = PROC_REF(cut)), - ATTACK_CLOAK = list(COMBO_STEPS = list(LEFT_SLASH, RIGHT_SLASH, LEFT_SLASH, RIGHT_SLASH), COMBO_PROC = PROC_REF(cloak)), - ATTACK_SHATTER = list(COMBO_STEPS = list(RIGHT_SLASH, LEFT_SLASH, RIGHT_SLASH, LEFT_SLASH), COMBO_PROC = PROC_REF(shatter)), - ) - -/obj/item/cursed_katana/Initialize(mapload) - . = ..() - for(var/combo in combo_list) - var/list/combo_specifics = combo_list[combo] - var/step_string = english_list(combo_specifics[COMBO_STEPS]) - combo_strings += span_notice("[combo] - [step_string]") - -/obj/item/cursed_katana/examine(mob/user) - . = ..() - . += drew_blood ? span_nicegreen("It's sated... for now.") : span_danger("It will not be sated until it tastes blood.") - . += span_notice("There seem to be inscriptions on it... you could examine them closer?") - -/obj/item/cursed_katana/examine_more(mob/user) - . = ..() - . += combo_strings - -/obj/item/cursed_katana/dropped(mob/user) - . = ..() - reset_inputs(null, TRUE) - if(isturf(loc)) - qdel(src) - -/obj/item/cursed_katana/attack_self(mob/user) - . = ..() - reset_inputs(user, TRUE) - -/obj/item/cursed_katana/attack(mob/living/target, mob/user, click_parameters) - if(target.stat == DEAD || target == user) - return ..() - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - balloon_alert(user, "you don't want to harm!") - return - drew_blood = TRUE - var/list/modifiers = params2list(click_parameters) - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - input_list += RIGHT_SLASH - if(LAZYACCESS(modifiers, LEFT_CLICK)) - input_list += LEFT_SLASH - if(ishostile(target)) - user.changeNext_move(CLICK_CD_RAPID) - if(length(input_list) > 4) - reset_inputs(user, TRUE) - if(check_input(target, user)) - reset_inputs(null, TRUE) - return TRUE - else - timerid = addtimer(CALLBACK(src, PROC_REF(reset_inputs), user, FALSE), 5 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) - return ..() - -/obj/item/cursed_katana/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 //Don't bring a sword to a gunfight - return ..() - -/obj/item/cursed_katana/proc/check_input(mob/living/target, mob/user) - for(var/combo in combo_list) - var/list/combo_specifics = combo_list[combo] - if(compare_list(input_list,combo_specifics[COMBO_STEPS])) - INVOKE_ASYNC(src, combo_specifics[COMBO_PROC], target, user) - return TRUE - return FALSE - -/obj/item/cursed_katana/proc/reset_inputs(mob/user, deltimer) - input_list.Cut() - if(user) - balloon_alert(user, "you return to neutral stance") - if(deltimer && timerid) - deltimer(timerid) - -/obj/item/cursed_katana/proc/strike(mob/living/target, mob/user) - user.visible_message(span_warning("[user] strikes [target] with [src]'s hilt!"), - span_notice("You hilt strike [target]!")) - to_chat(target, span_userdanger("You've been struck by [user]!")) - playsound(src, 'sound/weapons/genhit3.ogg', 50, TRUE) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT, PROC_REF(strike_throw_impact)) - var/atom/throw_target = get_edge_target_turf(target, user.dir) - target.throw_at(throw_target, 5, 3, user, FALSE, gentle = TRUE) - target.apply_damage(damage = 17) - to_chat(target, span_userdanger("You've been struck by [user]!")) - user.do_attack_animation(target, ATTACK_EFFECT_PUNCH) - -/obj/item/cursed_katana/proc/strike_throw_impact(mob/living/source, atom/hit_atom, datum/thrownthing/thrownthing) - SIGNAL_HANDLER - - UnregisterSignal(source, COMSIG_MOVABLE_IMPACT) - if(isclosedturf(hit_atom)) - source.apply_damage(damage = 5) - if(ishostile(source)) - var/mob/living/simple_animal/hostile/target = source - target.ranged_cooldown += 5 SECONDS - else if(iscarbon(source)) - var/mob/living/carbon/target = source - target.set_timed_status_effect(8 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) - return NONE - -/obj/item/cursed_katana/proc/slice(mob/living/target, mob/user) - user.visible_message(span_warning("[user] does a wide slice!"), - span_notice("You do a wide slice!")) - playsound(src, 'sound/weapons/bladeslice.ogg', 50, TRUE) - var/turf/user_turf = get_turf(user) - var/dir_to_target = get_dir(user_turf, get_turf(target)) - var/static/list/cursed_katana_slice_angles = list(0, -45, 45, -90, 90) //so that the animation animates towards the target clicked and not towards a side target - for(var/iteration in cursed_katana_slice_angles) - var/turf/turf = get_step(user_turf, turn(dir_to_target, iteration)) - user.do_attack_animation(turf, ATTACK_EFFECT_SLASH) - for(var/mob/living/additional_target in turf) - if(user.Adjacent(additional_target) && additional_target.density) - additional_target.apply_damage(damage = 15, sharpness = SHARP_EDGED) - to_chat(additional_target, span_userdanger("You've been sliced by [user]!")) - target.apply_damage(damage = 5, sharpness = SHARP_EDGED) - -/obj/item/cursed_katana/proc/cloak(mob/living/target, mob/user) - user.alpha = 150 - user.invisibility = INVISIBILITY_OBSERVER // so hostile mobs cant see us or target us - user.sight |= SEE_SELF // so we can see us - user.visible_message(span_warning("[user] vanishes into thin air!"), - span_notice("You enter the dark cloak.")) - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - if(ishostile(target)) - var/mob/living/simple_animal/hostile/hostile_target = target - hostile_target.LoseTarget() - addtimer(CALLBACK(src, PROC_REF(uncloak), user), 5 SECONDS, TIMER_UNIQUE) - -/obj/item/cursed_katana/proc/uncloak(mob/user) - user.alpha = 255 - user.invisibility = 0 - user.sight &= ~SEE_SELF - user.visible_message(span_warning("[user] appears from thin air!"), - span_notice("You exit the dark cloak.")) - playsound(src, 'sound/magic/summonitems_generic.ogg', 50, TRUE) - -/obj/item/cursed_katana/proc/cut(mob/living/target, mob/user) - user.visible_message(span_warning("[user] cuts [target]'s tendons!"), - span_notice("You tendon cut [target]!")) - to_chat(target, span_userdanger("Your tendons have been cut by [user]!")) - target.apply_damage(damage = 15, sharpness = SHARP_EDGED) - user.do_attack_animation(target, ATTACK_EFFECT_DISARM) - playsound(src, 'sound/weapons/rapierhit.ogg', 50, TRUE) - var/datum/status_effect/stacking/saw_bleed/bloodletting/status = target.has_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting) - if(!status) - target.apply_status_effect(/datum/status_effect/stacking/saw_bleed/bloodletting, 6) - else - status.add_stacks(6) - -/obj/item/cursed_katana/proc/dash(mob/living/target, mob/user) - user.visible_message(span_warning("[user] dashes through [target]!"), - span_notice("You dash through [target]!")) - to_chat(target, span_userdanger("[user] dashes through you!")) - playsound(src, 'sound/magic/blink.ogg', 50, TRUE) - target.apply_damage(damage = 17, sharpness = SHARP_POINTY) - var/turf/dash_target = get_turf(target) - for(var/distance in 0 to 8) - var/turf/current_dash_target = dash_target - current_dash_target = get_step(current_dash_target, user.dir) - if(!current_dash_target.is_blocked_turf(TRUE)) - dash_target = current_dash_target - else - break - new /obj/effect/temp_visual/guardian/phase/out(get_turf(user)) - new /obj/effect/temp_visual/guardian/phase(dash_target) - do_teleport(user, dash_target, channel = TELEPORT_CHANNEL_MAGIC) - -/obj/item/cursed_katana/proc/shatter(mob/living/target, mob/user) - user.visible_message(span_warning("[user] shatters [src] over [target]!"), - span_notice("You shatter [src] over [target]!")) - to_chat(target, span_userdanger("[user] shatters [src] over you!")) - target.apply_damage(damage = ishostile(target) ? 75 : 35) - user.do_attack_animation(target, ATTACK_EFFECT_SMASH) - playsound(src, 'sound/effects/glassbr3.ogg', 100, TRUE) - shattered = TRUE - moveToNullspace() - balloon_alert(user, "katana shattered") - addtimer(CALLBACK(src, PROC_REF(coagulate), user), 45 SECONDS) - -/obj/item/cursed_katana/proc/coagulate(mob/user) - balloon_alert(user, "katana coagulated") - shattered = FALSE - playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE) - -#undef LEFT_SLASH -#undef RIGHT_SLASH -#undef COMBO_STEPS -#undef COMBO_PROC -#undef ATTACK_STRIKE -#undef ATTACK_SLICE -#undef ATTACK_DASH -#undef ATTACK_CUT -#undef ATTACK_CLOAK -#undef ATTACK_SHATTER diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 5b1e2578a396..f601f3ca75f2 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -124,6 +124,8 @@ icon_state = "furnace" density = TRUE needs_item_input = TRUE + has_disk_slot = TRUE + var/obj/machinery/mineral/CONSOLE = null var/on = FALSE var/datum/material/selected_material = null @@ -176,6 +178,12 @@ /obj/machinery/mineral/processing_unit/proc/get_machine_data() var/dat = "Smelter control console

" + //On or off + dat += "Machine is currently " + if (on) + dat += "On
" + else + dat += "Off
" var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) for(var/datum/material/M in materials.materials) var/amount = materials.materials[M] @@ -199,12 +207,6 @@ dat += "

" //On or off - dat += "Machine is currently " - if (on) - dat += "On " - else - dat += "Off " - return dat /obj/machinery/mineral/processing_unit/pickup_item(datum/source, atom/movable/target, direction) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 4c67bfcbd0a0..260a37942992 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -193,7 +193,7 @@ /obj/machinery/mineral/ore_redemption/AltClick(mob/living/user) . = ..() - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(panel_open) input_dir = turn(input_dir, -90) @@ -289,7 +289,7 @@ desired = text2num(params["sheets"]) else desired = tgui_input_number(usr, "How many sheets would you like to smelt?", "Smelt", max_value = stored_amount) - if(!desired || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!desired || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return var/sheets_to_remove = round(min(desired,50,stored_amount)) @@ -342,7 +342,7 @@ desired = text2num(params["sheets"]) else desired = tgui_input_number(usr, "How many sheets would you like to smelt?", "Smelt", max_value = smelt_amount) - if(!desired || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!desired || QDELETED(usr) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return var/amount = round(min(desired,50,smelt_amount)) mat_container.use_materials(alloy.materials, amount) diff --git a/code/modules/mining/machine_silo.dm b/code/modules/mining/machine_silo.dm index 8179557a71b7..35c63d3eca34 100644 --- a/code/modules/mining/machine_silo.dm +++ b/code/modules/mining/machine_silo.dm @@ -199,7 +199,7 @@ GLOBAL_LIST_EMPTY(silo_access_logs) logs.Insert(1, entry) updateUsrDialog() - flick("silo_active", src) + z_flick("silo_active", src) /obj/machinery/ore_silo/examine(mob/user) . = ..() diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index d08ffccbf498..035c8c722c03 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -10,10 +10,6 @@ var/icon_deny = "mining-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("Skeleton Key", /obj/item/skeleton_key, 777), 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("Bubblegum Gum Packet", /obj/item/storage/box/gum/bubblegum, 100), @@ -22,8 +18,6 @@ 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), @@ -31,43 +25,21 @@ new /datum/data/mining_equipment("Brute Medkit", /obj/item/storage/medkit/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/kinetic_crusher, 750), - new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/recharge/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("Luxury Medipen", /obj/item/reagent_containers/hypospray/medipen/survival/luxury, 1000), - 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, 1500), new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000), new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000), new /datum/data/mining_equipment("Kheiral Cuffs", /obj/item/kheiral_cuffs, 2000), - new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Ice Hiking Boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500), new /datum/data/mining_equipment("Mining MODsuit", /obj/item/mod/control/pre_equipped/mining, 2500), - new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), - new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxuryelite, 10000), - new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), - 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/atom/movable/equipment_path = null var/cost = 0 /datum/data/mining_equipment/New(name, path, cost) @@ -88,10 +60,10 @@ icon_state = "[initial(icon_state)][powered() ? null : "-off"]" return ..() -/obj/machinery/mineral/equipment_vendor/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/vending), - ) +// /obj/machinery/mineral/equipment_vendor/ui_assets(mob/user) +// return list( +// get_asset_datum(/datum/asset/spritesheet/vending), +// ) /obj/machinery/mineral/equipment_vendor/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -107,7 +79,9 @@ path = replacetext(replacetext("[prize.equipment_path]", "/obj/item/", ""), "/", "-"), name = prize.equipment_name, price = prize.cost, - ref = REF(prize) + ref = REF(prize), + icon = initial(prize.equipment_path.icon), + icon_state = initial(prize.equipment_path.icon_state) ) .["product_records"] += list(product_data) @@ -140,16 +114,16 @@ I = L.get_idcard(TRUE) if(!istype(I)) to_chat(usr, span_alert("Error: An ID is required!")) - flick(icon_deny, src) + z_flick(icon_deny, src) return var/datum/data/mining_equipment/prize = locate(params["ref"]) in prize_list if(!prize || !(prize in prize_list)) to_chat(usr, span_alert("Error: Invalid choice!")) - flick(icon_deny, src) + z_flick(icon_deny, src) return if(prize.cost > I.mining_points) to_chat(usr, span_alert("Error: Insufficient points for [prize.equipment_name] on [I]!")) - flick(icon_deny, src) + z_flick(icon_deny, src) return I.mining_points -= prize.cost to_chat(usr, span_notice("[src] clanks to life briefly before vending [prize.equipment_name]!")) @@ -168,7 +142,7 @@ return ..() /obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer) - var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Extraction and Rescue Kit", "Crusher Kit", "Mining Conscription Kit") + var/items = list("Survival Capsule and Explorer's Webbing", "Resonator Kit", "Extraction and Rescue Kit", "Mining Conscription Kit") var/selection = tgui_input_list(redeemer, "Pick your equipment", "Mining Voucher Redemption", sort_list(items)) if(isnull(selection)) @@ -182,18 +156,10 @@ if("Resonator Kit") new /obj/item/extinguisher/mini(drop_location) new /obj/item/resonator(drop_location) - if("Minebot Kit") - new /mob/living/simple_animal/hostile/mining_drone(drop_location) - new /obj/item/weldingtool/hugetank(drop_location) - new /obj/item/clothing/head/welding(drop_location) - new /obj/item/borg/upgrade/modkit/minebot_passthrough(drop_location) if("Extraction and Rescue Kit") new /obj/item/extraction_pack(drop_location) new /obj/item/fulton_core(drop_location) new /obj/item/stack/marker_beacon/thirty(drop_location) - if("Crusher Kit") - new /obj/item/extinguisher/mini(drop_location) - new /obj/item/kinetic_crusher(drop_location) if("Mining Conscription Kit") new /obj/item/storage/backpack/duffelbag/mining_conscript(drop_location) @@ -220,7 +186,6 @@ 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) ) return ..() @@ -270,10 +235,10 @@ new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/suit/hooded/explorer(src) + new /obj/item/clothing/head/helmet/space/nasavoid/old(src) + new /obj/item/clothing/suit/space/nasavoid/old(src) new /obj/item/encryptionkey/headset_mining(src) - new /obj/item/clothing/mask/gas/explorer(src) + new /obj/item/clothing/mask/breath(src) new /obj/item/card/id/advanced/mining(src) - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/knife/combat/survival(src) new /obj/item/flashlight/seclite(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 11bc85e12350..85d60429f6af 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -29,9 +29,9 @@ new /obj/item/storage/backpack/duffelbag(src) new /obj/item/storage/backpack/explorer(src) new /obj/item/storage/backpack/satchel/explorer(src) - new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) - new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) - new /obj/item/clothing/under/rank/cargo/miner/lavaland(src) + new /obj/item/clothing/under/rank/cargo/miner(src) + new /obj/item/clothing/under/rank/cargo/miner(src) + new /obj/item/clothing/under/rank/cargo/miner(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/clothing/shoes/workboots/mining(src) new /obj/item/clothing/shoes/workboots/mining(src) @@ -61,10 +61,8 @@ new /obj/item/storage/bag/plants(src) new /obj/item/storage/bag/ore(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) - new /obj/item/gun/energy/recharge/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/survivalcapsule(src) - new /obj/item/assault_pod/mining(src) /**********************Shuttle Computer**************************/ @@ -91,13 +89,6 @@ return ..() -/obj/machinery/computer/shuttle/mining/common - name = "lavaland shuttle console" - desc = "Used to call and send the lavaland shuttle." - circuit = /obj/item/circuitboard/computer/mining_shuttle/common - shuttleId = "mining_common" - possible_destinations = "commonmining_home;lavaland_common_away;landing_zone_dock;mining_public" - /**********************Mining car (Crate like thing, not the rail car)**************************/ /obj/structure/closet/crate/miningcar diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm deleted file mode 100644 index 1f70e91b7dfc..000000000000 --- a/code/modules/mining/minebot.dm +++ /dev/null @@ -1,325 +0,0 @@ -/**********************Mining drone**********************/ -#define MINEDRONE_COLLECT 1 -#define MINEDRONE_ATTACK 2 - -/mob/living/simple_animal/hostile/mining_drone - 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' - icon_state = "mining_drone" - icon_living = "mining_drone" - status_flags = CANSTUN|CANKNOCKDOWN|CANPUSH - mouse_opacity = MOUSE_OPACITY_ICON - faction = list("neutral") - combat_mode = TRUE - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - move_to_delay = 10 - health = 125 - maxHealth = 125 - melee_damage_lower = 15 - melee_damage_upper = 15 - obj_damage = 10 - environment_smash = ENVIRONMENT_SMASH_NONE - check_friendly_fire = TRUE - stop_automated_movement_when_pulled = TRUE - attack_verb_continuous = "drills" - attack_verb_simple = "drill" - attack_sound = 'sound/weapons/circsawhit.ogg' - sentience_type = SENTIENCE_MINEBOT - speak_emote = list("states") - wanted_objects = list(/obj/item/stack/ore/diamond, /obj/item/stack/ore/gold, /obj/item/stack/ore/silver, - /obj/item/stack/ore/plasma, /obj/item/stack/ore/uranium, /obj/item/stack/ore/iron, - /obj/item/stack/ore/bananium, /obj/item/stack/ore/titanium) - healable = 0 - loot = list(/obj/effect/decal/cleanable/robot_debris) - del_on_death = TRUE - light_system = MOVABLE_LIGHT - light_outer_range = 6 - light_on = FALSE - var/mode = MINEDRONE_COLLECT - var/obj/item/gun/energy/recharge/kinetic_accelerator/minebot/stored_gun - -/mob/living/simple_animal/hostile/mining_drone/Initialize(mapload) - . = ..() - - AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - - stored_gun = new(src) - var/datum/action/innate/minedrone/toggle_light/toggle_light_action = new() - toggle_light_action.Grant(src) - var/datum/action/innate/minedrone/toggle_meson_vision/toggle_meson_vision_action = new() - toggle_meson_vision_action.Grant(src) - var/datum/action/innate/minedrone/toggle_mode/toggle_mode_action = new() - toggle_mode_action.Grant(src) - var/datum/action/innate/minedrone/dump_ore/dump_ore_action = new() - dump_ore_action.Grant(src) - var/obj/item/implant/radio/mining/imp = new(src) - imp.implant(src) - - access_card = new /obj/item/card/id/advanced/gold(src) - SSid_access.apply_trim_to_card(access_card, /datum/id_trim/job/shaft_miner) - - SetCollectBehavior() - -/mob/living/simple_animal/hostile/mining_drone/Destroy() - for (var/datum/action/innate/minedrone/action in actions) - qdel(action) - return ..() - -/mob/living/simple_animal/hostile/mining_drone/sentience_act() - ..() - check_friendly_fire = 0 - -/mob/living/simple_animal/hostile/mining_drone/examine(mob/user) - . = ..() - var/t_He = p_they(TRUE) - var/t_him = p_them() - var/t_s = p_s() - if(health < maxHealth) - if(health >= maxHealth * 0.5) - . += span_warning("[t_He] look[t_s] slightly dented.") - else - . += span_boldwarning("[t_He] look[t_s] severely dented!") - . += {"Using a mining scanner on [t_him] will instruct [t_him] to drop stored ore. [max(0, LAZYLEN(contents) - 1)] Stored Ore\n - Field repairs can be done with a welder."} - if(stored_gun?.max_mod_capacity) - . += "[stored_gun.get_remaining_mod_capacity()]% mod capacity remaining." - for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) - . += span_notice("There is \a [modkit] installed, using [modkit.cost]% capacity.") - -/mob/living/simple_animal/hostile/mining_drone/welder_act(mob/living/user, obj/item/welder) - ..() - . = TRUE - if(mode == MINEDRONE_ATTACK) - to_chat(user, span_warning("[src] can't be repaired while in attack mode!")) - return - - if(maxHealth == health) - to_chat(user, span_info("[src] is at full integrity.")) - return - - if(welder.use_tool(src, user, 0, volume=40)) - adjustBruteLoss(-15) - to_chat(user, span_info("You repair some of the armor on [src].")) - -/mob/living/simple_animal/hostile/mining_drone/attackby(obj/item/item_used, mob/user, params) - if(istype(item_used, /obj/item/mining_scanner) || istype(item_used, /obj/item/t_scanner/adv_mining_scanner)) - to_chat(user, span_info("You instruct [src] to drop any collected ore.")) - DropOre() - return - if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit)) - item_used.melee_attack_chain(user, stored_gun, params) - return - ..() - -/mob/living/simple_animal/hostile/mining_drone/death() - DropOre() - if(stored_gun) - for(var/obj/item/borg/upgrade/modkit/modkit as anything in stored_gun.modkits) - modkit.uninstall(stored_gun) - deathmessage = "blows apart!" - ..() - -/mob/living/simple_animal/hostile/mining_drone/attack_hand(mob/living/carbon/human/user, list/modifiers) - . = ..() - if(.) - return - if(!user.combat_mode) - toggle_mode() - switch(mode) - if(MINEDRONE_COLLECT) - to_chat(user, span_info("[src] has been set to search and store loose ore.")) - if(MINEDRONE_ATTACK) - to_chat(user, span_info("[src] has been set to attack hostile wildlife.")) - return - -/mob/living/simple_animal/hostile/mining_drone/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/projectile/kinetic)) - var/obj/projectile/kinetic/projectile = mover - if(projectile.kinetic_gun) - if (locate(/obj/item/borg/upgrade/modkit/minebot_passthrough) in projectile.kinetic_gun.modkits) - return TRUE - else if(istype(mover, /obj/projectile/destabilizer)) - return TRUE - -/mob/living/simple_animal/hostile/mining_drone/proc/SetCollectBehavior() - mode = MINEDRONE_COLLECT - vision_range = 9 - search_objects = 2 - wander = TRUE - ranged = FALSE - minimum_distance = 1 - retreat_distance = null - icon_state = "mining_drone" - to_chat(src, span_info("You are set to collect mode. You can now collect loose ore.")) - -/mob/living/simple_animal/hostile/mining_drone/proc/SetOffenseBehavior() - mode = MINEDRONE_ATTACK - vision_range = 7 - search_objects = 0 - wander = FALSE - ranged = TRUE - retreat_distance = 2 - minimum_distance = 1 - icon_state = "mining_drone_offense" - to_chat(src, span_info("You are set to attack mode. You can now attack from range.")) - -/mob/living/simple_animal/hostile/mining_drone/AttackingTarget() - if(istype(target, /obj/item/stack/ore) && mode == MINEDRONE_COLLECT) - CollectOre() - return - if(isliving(target)) - SetOffenseBehavior() - return ..() - -/mob/living/simple_animal/hostile/mining_drone/OpenFire(atom/target) - if(CheckFriendlyFire(target)) - return - stored_gun.afterattack(target, src) //of the possible options to allow minebots to have KA mods, would you believe this is the best? - -/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre() - for(var/obj/item/stack/ore/O in range(1, src)) - O.forceMove(src) - -/mob/living/simple_animal/hostile/mining_drone/proc/DropOre(message = 1) - if(!contents.len) - if(message) - to_chat(src, span_warning("You attempt to dump your stored ore, but you have none!")) - return - if(message) - to_chat(src, span_notice("You dump your stored ore.")) - for(var/obj/item/stack/ore/O in contents) - O.forceMove(drop_location()) - -/mob/living/simple_animal/hostile/mining_drone/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(mode != MINEDRONE_ATTACK && amount > 0) - SetOffenseBehavior() - . = ..() - -/datum/action/innate/minedrone/toggle_meson_vision - name = "Toggle Meson Vision" - button_icon_state = "meson" - -/datum/action/innate/minedrone/toggle_meson_vision/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - if(user.sight & SEE_TURFS) - user.sight &= ~SEE_TURFS - user.lighting_alpha = initial(user.lighting_alpha) - else - user.sight |= SEE_TURFS - user.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - - user.sync_lighting_plane_alpha() - - to_chat(user, span_notice("You toggle your meson vision [(user.sight & SEE_TURFS) ? "on" : "off"].")) - - -/mob/living/simple_animal/hostile/mining_drone/proc/toggle_mode() - switch(mode) - if(MINEDRONE_ATTACK) - SetCollectBehavior() - else - SetOffenseBehavior() - -//Actions for sentient minebots - -/datum/action/innate/minedrone - check_flags = AB_CHECK_CONSCIOUS - button_icon = 'icons/mob/actions/actions_mecha.dmi' - background_icon_state = "bg_default" - -/datum/action/innate/minedrone/toggle_light - name = "Toggle Light" - button_icon_state = "mech_lights_off" - - -/datum/action/innate/minedrone/toggle_light/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.set_light_on(!user.light_on) - to_chat(user, span_notice("You toggle your light [user.light_on ? "on" : "off"].")) - - -/datum/action/innate/minedrone/toggle_mode - name = "Toggle Mode" - button_icon_state = "mech_cycle_equip_off" - -/datum/action/innate/minedrone/toggle_mode/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.toggle_mode() - -/datum/action/innate/minedrone/dump_ore - name = "Dump Ore" - button_icon_state = "mech_eject" - -/datum/action/innate/minedrone/dump_ore/Activate() - var/mob/living/simple_animal/hostile/mining_drone/user = owner - user.DropOre() - - -/**********************Minebot Upgrades**********************/ - -//Melee - -/obj/item/mine_bot_upgrade - name = "minebot melee upgrade" - desc = "A minebot upgrade." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - -/obj/item/mine_bot_upgrade/afterattack(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user, proximity) - . = ..() - if(!istype(minebot) || !proximity) - return - upgrade_bot(minebot, user) - -/obj/item/mine_bot_upgrade/proc/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user) - if(minebot.melee_damage_upper != initial(minebot.melee_damage_upper)) - to_chat(user, span_warning("[minebot] already has a combat upgrade installed!")) - return - minebot.melee_damage_lower += 7 - minebot.melee_damage_upper += 7 - to_chat(user, "You increase the close-quarter combat abilities of [minebot].") - qdel(src) - -//Health - -/obj/item/mine_bot_upgrade/health - name = "minebot armor upgrade" - -/obj/item/mine_bot_upgrade/health/upgrade_bot(mob/living/simple_animal/hostile/mining_drone/minebot, mob/user) - if(minebot.maxHealth != initial(minebot.maxHealth)) - to_chat(user, span_warning("[minebot] already has reinforced armor!")) - return - minebot.maxHealth += 45 - minebot.updatehealth() - to_chat(user, "You reinforce the armor of [minebot].") - qdel(src) - -//AI - -/obj/item/slimepotion/slime/sentience/mining - name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - sentience_type = SENTIENCE_MINEBOT - var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values - var/base_damage_add = 1 //this thus disables other minebot upgrades - var/base_speed_add = 1 - var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module - -/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/simple_mob) - if(!istype(simple_mob, /mob/living/simple_animal/hostile/mining_drone)) - return - var/mob/living/simple_animal/hostile/mining_drone/minebot = simple_mob - minebot.maxHealth = initial(minebot.maxHealth) + base_health_add - minebot.melee_damage_lower = initial(minebot.melee_damage_lower) + base_damage_add - minebot.melee_damage_upper = initial(minebot.melee_damage_upper) + base_damage_add - minebot.move_to_delay = initial(minebot.move_to_delay) + base_speed_add - minebot.stored_gun?.recharge_time += base_cooldown_add - -#undef MINEDRONE_COLLECT -#undef MINEDRONE_ATTACK diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 14f50ca0dab8..914f4700740e 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -16,7 +16,7 @@ icon_state = "moneybagalt" atom_storage.max_slots = 40 atom_storage.max_specific_storage = 40 - atom_storage.set_holdable(list(/obj/item/coin, /obj/item/stack/spacecash, /obj/item/holochip)) + atom_storage.set_holdable(list(/obj/item/coin, /obj/item/stack/spacecash)) /obj/item/storage/bag/money/vault/PopulateContents() new /obj/item/coin/silver(src) @@ -25,7 +25,6 @@ new /obj/item/coin/silver(src) new /obj/item/coin/gold(src) new /obj/item/coin/gold(src) - new /obj/item/coin/adamantine(src) ///Used in the dutchmen pirate shuttle. /obj/item/storage/bag/money/dutchmen/PopulateContents() @@ -33,4 +32,4 @@ new /obj/item/coin/silver/doubloon(src) for(var/iteration in 1 to 9) new /obj/item/coin/gold/doubloon(src) - new /obj/item/coin/adamantine/doubloon(src) + diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8e44a9c7b277..41761b4e9794 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -15,13 +15,13 @@ full_w_class = WEIGHT_CLASS_BULKY singular_name = "ore chunk" material_flags = MATERIAL_EFFECTS - var/points = 0 //How many points this ore gets you from the ore redemption machine - var/refined_type = null //What this ore defaults to being refined into - var/mine_experience = 5 //How much experience do you get for mining this ore? 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 + /// How many points this ore gets you from the ore redemption machine + var/points = 0 + /// What this ore defaults to being refined into + var/refined_type = null /obj/item/stack/ore/update_overlays() . = ..() @@ -56,7 +56,7 @@ return TRUE -/obj/item/stack/ore/fire_act(exposed_temperature, exposed_volume) +/obj/item/stack/ore/fire_act(exposed_temperature, exposed_volume, turf/adjacent) . = ..() if(isnull(refined_type)) return @@ -79,9 +79,6 @@ material_flags = NONE mats_per_unit = list(/datum/material/uranium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/uranium - mine_experience = 6 - scan_state = "rock_Uranium" - spreadChance = 5 merge_type = /obj/item/stack/ore/uranium /obj/item/stack/ore/iron @@ -92,9 +89,6 @@ points = 1 mats_per_unit = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/iron - mine_experience = 1 - scan_state = "rock_Iron" - spreadChance = 20 merge_type = /obj/item/stack/ore/iron /obj/item/stack/ore/glass @@ -106,7 +100,6 @@ mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/glass w_class = WEIGHT_CLASS_TINY - mine_experience = 0 //its sand merge_type = /obj/item/stack/ore/glass GLOBAL_LIST_INIT(sand_recipes, list(\ @@ -140,7 +133,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ icon_state = "volcanic_sand" inhand_icon_state = "volcanic_sand" singular_name = "volcanic ash pile" - mine_experience = 0 merge_type = /obj/item/stack/ore/glass/basalt /obj/item/stack/ore/plasma @@ -151,9 +143,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 15 mats_per_unit = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma - mine_experience = 5 - scan_state = "rock_Plasma" - spreadChance = 8 merge_type = /obj/item/stack/ore/plasma /obj/item/stack/ore/plasma/welder_act(mob/living/user, obj/item/I) @@ -166,11 +155,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ inhand_icon_state = "Silver ore" singular_name = "silver ore chunk" points = 16 - mine_experience = 3 mats_per_unit = list(/datum/material/silver=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/silver - scan_state = "rock_Silver" - spreadChance = 5 merge_type = /obj/item/stack/ore/silver /obj/item/stack/ore/gold @@ -179,11 +165,8 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ inhand_icon_state = "Gold ore" singular_name = "gold ore chunk" points = 18 - mine_experience = 5 mats_per_unit = list(/datum/material/gold=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/gold - scan_state = "rock_Gold" - spreadChance = 5 merge_type = /obj/item/stack/ore/gold /obj/item/stack/ore/diamond @@ -194,8 +177,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 50 mats_per_unit = list(/datum/material/diamond=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/diamond - mine_experience = 10 - scan_state = "rock_Diamond" merge_type = /obj/item/stack/ore/diamond /obj/item/stack/ore/bananium @@ -206,8 +187,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 60 mats_per_unit = list(/datum/material/bananium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/bananium - mine_experience = 15 - scan_state = "rock_Bananium" merge_type = /obj/item/stack/ore/bananium /obj/item/stack/ore/titanium @@ -218,9 +197,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ points = 50 mats_per_unit = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/titanium - mine_experience = 3 - scan_state = "rock_Titanium" - spreadChance = 5 merge_type = /obj/item/stack/ore/titanium /obj/item/stack/ore/slag @@ -245,9 +221,9 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ var/attacher = "UNKNOWN" var/det_timer -/obj/item/gibtonite/ComponentInitialize() +/obj/item/gibtonite/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, require_twohands=TRUE) + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) /obj/item/gibtonite/Destroy() qdel(wires) @@ -468,9 +444,6 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/bananium custom_materials = list(/datum/material/bananium = 400) -/obj/item/coin/adamantine - custom_materials = list(/datum/material/adamantine = 400) - /obj/item/coin/mythril custom_materials = list(/datum/material/mythril = 400) @@ -525,7 +498,5 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ /obj/item/coin/gold/doubloon name = "doubloon" -/obj/item/coin/adamantine/doubloon - name = "doubloon" #undef ORESTACK_OVERLAYS_MAX diff --git a/code/modules/mob/camera/camera.dm b/code/modules/mob/camera/camera.dm index c68f68b2b2eb..8472ae2cb3b9 100644 --- a/code/modules/mob/camera/camera.dm +++ b/code/modules/mob/camera/camera.dm @@ -11,10 +11,12 @@ sight = SEE_SELF move_on_shuttle = FALSE simulated = FALSE + zmm_flags = ZMM_IGNORE /mob/camera/Initialize(mapload) . = ..() - SSpoints_of_interest.make_point_of_interest(src) + if(!istype(src, /mob/camera/z_eye)) + SSpoints_of_interest.make_point_of_interest(src) /* /mob/camera/experience_pressure_difference() return @@ -27,17 +29,17 @@ set name = "Move Upwards" set category = "IC" - if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) + if(zstep(src, UP, ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move upwards.")) /mob/camera/down() set name = "Move Down" set category = "IC" - if(zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) + if(zstep(src, DOWN, ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) -/mob/camera/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) +/mob/camera/can_z_move(direction, turf/start, z_move_flags = NONE, mob/living/rider) z_move_flags |= ZMOVE_IGNORE_OBSTACLES //cameras do not respect these FLOORS you speak so much of return ..() diff --git a/code/modules/mob/camera/z_eye.dm b/code/modules/mob/camera/z_eye.dm new file mode 100644 index 000000000000..2ef306517dfa --- /dev/null +++ b/code/modules/mob/camera/z_eye.dm @@ -0,0 +1,57 @@ +/mob/camera/z_eye + sight = NONE + var/mob/living/parent + +/mob/camera/z_eye/Initialize(mapload, mob/living/user) + . = ..() + if(!istype(user)) + return INITIALIZE_HINT_QDEL + + parent = user + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(try_follow)) + RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(kill)) + try_follow(parent) + +/mob/camera/z_eye/Destroy() + if(parent) + UnregisterSignal(parent, COMSIG_MOVABLE_MOVED) + parent.reset_perspective(null) + parent.z_eye = null + parent = null + return ..() + +/mob/camera/z_eye/can_z_move(direction, turf/start, z_move_flags, mob/living/rider) + return FALSE + +/mob/camera/z_eye/proc/kill() + qdel(src) + +/mob/camera/z_eye/proc/try_follow(mob/source, atom/old_loc, dir, forced, old_locs) + SIGNAL_HANDLER + if(!source?.z) //wtf happened + qdel(src) + return + if(abs(src.z - source.z) != 1) + qdel(src) + return + + var/is_below = src.z < source.z + + + var/turf/T + if(is_below) + T = get_turf(source) + else + T = GetAbove(source) + + if(is_below) + abstract_move(GetBelow(source)) + else + abstract_move(GetAbove(source)) + + if(!TURF_IS_MIMICKING(T)) + if(parent.client?.eye == src) + parent.reset_perspective(null) + + else if(parent.client?.eye != src) + parent.reset_perspective(src) diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm index 08ff61de1a65..ece2c7c7b959 100644 --- a/code/modules/mob/dead/crew_manifest.dm +++ b/code/modules/mob/dead/crew_manifest.dm @@ -19,7 +19,10 @@ /datum/crew_manifest/ui_data(mob/user) var/list/positions = list() - for(var/datum/job_department/department as anything in SSjob.joinable_departments) + for(var/datum/job_department/department as anything in SSjob.departments) + if(department.is_not_real_department) + continue + var/open = 0 var/list/exceptions = list() for(var/datum/job/job as anything in department.department_jobs) @@ -33,6 +36,19 @@ positions[department.department_name] = list("exceptions" = exceptions, "open" = open) return list( - "manifest" = GLOB.data_core.get_manifest(), + "manifest" = SSdatacore.get_manifest(), "positions" = positions ) + +/proc/show_crew_manifest(mob/user) + if(!user.client) + return + if(world.time < user.client.crew_manifest_delay) + return + + user.client.crew_manifest_delay = world.time + (1 SECONDS) + + if(!GLOB.crew_manifest_tgui) + GLOB.crew_manifest_tgui = new /datum/crew_manifest(user) + + GLOB.crew_manifest_tgui.ui_interact(user) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index e21eff5d983f..f1caf540262f 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -9,10 +9,9 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/Initialize(mapload) SHOULD_CALL_PARENT(FALSE) - if(flags_1 & INITIALIZED_1) + if(initialized) stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - tag = "mob_[next_mob_id++]" + initialized = TRUE add_to_mob_list() prepare_huds() @@ -26,13 +25,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/canUseStorage() return FALSE -/mob/dead/abstract_move(atom/destination) - var/turf/old_turf = get_turf(src) - var/turf/new_turf = get_turf(destination) - if (old_turf?.z != new_turf?.z) - on_changed_z_level(old_turf, new_turf) - return ..() - /mob/dead/get_status_tab_items() . = ..() . += "" @@ -119,5 +111,5 @@ INITIALIZE_IMMEDIATE(/mob/dead) ..() update_z(new_turf?.z) -/mob/dead/can_smell(intensity) +/mob/dead/can_smell() return FALSE diff --git a/code/modules/mob/dead/new_player/login.dm b/code/modules/mob/dead/new_player/login.dm index c6cade62ace5..e55842d1d8ee 100644 --- a/code/modules/mob/dead/new_player/login.dm +++ b/code/modules/mob/dead/new_player/login.dm @@ -3,17 +3,29 @@ return if(CONFIG_GET(flag/use_exp_tracking)) - client.set_exp_from_db() - client.set_db_player_flags() + client?.set_exp_from_db() + client?.set_db_player_flags() + if(!client) + // client disconnected during one of the db queries + return FALSE + if(!mind) mind = new /datum/mind(key) mind.active = TRUE mind.set_current(src) + var/boot_this_guy + if(CONFIG_GET(flag/panic_bunker) && client.check_panic_bunker()) + boot_this_guy = TRUE + . = ..() if(!. || !client) return FALSE + if(boot_this_guy) + qdel(client) + return FALSE + var/motd = global.config.motd if(motd) to_chat(src, "
[motd]
", handle_whitespace=FALSE) @@ -30,17 +42,23 @@ client.playtitlemusic() var/datum/asset/asset_datum = get_asset_datum(/datum/asset/simple/lobby) asset_datum.send(client) + if(!client) // client disconnected during asset transit + return FALSE + + // The parent call for Login() may do a bunch of stuff, like add verbs. + // Delaying the register_for_interview until the very end makes sure it can clean everything up + // and set the player's client up for interview. + if(client.restricted_mode) + client.strip_verbs() - // Check if user should be added to interview queue - if (!client.holder && CONFIG_GET(flag/panic_bunker) && CONFIG_GET(flag/panic_bunker_interview) && !(client.ckey in GLOB.interviews.approved_ckeys)) - var/required_living_minutes = CONFIG_GET(number/panic_bunker_living) - var/living_minutes = client.get_exp_living(TRUE) - if (required_living_minutes >= living_minutes) - client.restricted_mode = TRUE + if(CONFIG_GET(flag/panic_bunker_interview)) register_for_interview() - return + else + add_verb(client, /client/verb/ooc, bypass_restricted = TRUE) + npp.restricted_client_panel() + return - new_player_panel() + npp.open() if(SSticker.current_state < GAME_STATE_SETTING_UP) var/tl = SSticker.GetTimeLeft() diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index bbcc2100a756..ac4571bbc85b 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -1,4 +1,3 @@ -#define LINKIFY_READY(string, value) "[string]" /mob/dead/new_player flags_1 = NONE invisibility = INVISIBILITY_ABSTRACT @@ -6,6 +5,8 @@ stat = DEAD hud_possible = list() + var/datum/new_player_panel/npp + var/ready = FALSE /// Referenced when you want to delete the new_player later on in the code. var/spawning = FALSE @@ -14,178 +15,36 @@ ///Used to make sure someone doesn't get spammed with messages if they're ineligible for roles. var/ineligible_for_roles = FALSE - - /mob/dead/new_player/Initialize(mapload) if(length(GLOB.newplayer_start)) forceMove(pick(GLOB.newplayer_start)) else forceMove(locate(1,1,1)) - ComponentInitialize() - + npp = new(src) . = ..() GLOB.new_player_list += src /mob/dead/new_player/Destroy() GLOB.new_player_list -= src - + QDEL_NULL(npp) return ..() /mob/dead/new_player/prepare_huds() return -/mob/dead/new_player/Topic(href, href_list[]) - if(src != usr) +/mob/dead/new_player/Topic(href, href_list) + if(usr != src) return - if(!client) - return - - if(client.restricted_mode) - return FALSE - - if(href_list["show_preferences"]) - var/datum/preferences/preferences = client.prefs - preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES - preferences.update_static_data(usr) - preferences.ui_interact(usr) - return TRUE - - if(href_list["character_setup"]) - var/datum/preferences/preferences = client.prefs - preferences.html_show(usr) - return TRUE - - if(href_list["ready"]) - var/tready = text2num(href_list["ready"]) - //Avoid updating ready if we're after PREGAME (they should use latejoin instead) - //This is likely not an actual issue but I don't have time to prove that this - //no longer is required - if(SSticker.current_state <= GAME_STATE_PREGAME) - ready = tready - //if it's post initialisation and they're trying to observe we do the needful - if(SSticker.current_state >= GAME_STATE_SETTING_UP && tready == PLAYER_READY_TO_OBSERVE) - ready = tready - make_me_an_observer() - return - if(href_list["refresh"]) src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() - - if(href_list["manifest"]) - ViewManifest() - return - - if(href_list["late_join"]) //This still exists for queue messages in chat - if(!SSticker?.IsRoundInProgress()) - to_chat(usr, span_boldwarning("The round is either not ready, or has already finished...")) - return - LateChoices() - return - - if(href_list["SelectedJob"]) - if(!SSticker?.IsRoundInProgress()) - to_chat(usr, span_danger("The round is either not ready, or has already finished...")) - return - - if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) - to_chat(usr, span_notice("There is an administrative lock on entering the game!")) - return - - //Determines Relevent Population Cap - var/relevant_cap - var/hpc = CONFIG_GET(number/hard_popcap) - var/epc = CONFIG_GET(number/extreme_popcap) - if(hpc && epc) - relevant_cap = min(hpc, epc) - else - relevant_cap = max(hpc, epc) - - - - if(SSticker.queued_players.len && !(ckey(key) in GLOB.admin_datums)) - if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) - to_chat(usr, span_warning("Server is full.")) - return - - AttemptLateSpawn(href_list["SelectedJob"]) - return - - else if(!href_list["late_join"]) - new_player_panel() - - if(href_list["showpoll"]) - handle_player_polling() - return - - if(href_list["viewpoll"]) - var/datum/poll_question/poll = locate(href_list["viewpoll"]) in GLOB.polls - poll_player(poll) - - if(href_list["votepollref"]) - var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls - vote_on_poll_handler(poll, href_list) - -/** - * This proc generates the panel that opens to all newly joining players, allowing them to join, observe, view polls, view the current crew manifest, and open the character customization menu. - */ -/mob/dead/new_player/proc/new_player_panel() - if (client?.restricted_mode) - return - - var/list/output = list() - output += {" -
-
- Options -
-
-

- Playing As -
- [client?.prefs.read_preference(/datum/preference/name/real_name)] -

-
- "} - - if(SSticker.current_state <= GAME_STATE_PREGAME) - switch(ready) - if(PLAYER_NOT_READY) - output += "
\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
" - if(PLAYER_READY_TO_PLAY) - output += "
\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
" - if(PLAYER_READY_TO_OBSERVE) - output += "
\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]
" - else - output += {" -

- View the Crew Manifest -

-

- Join Game! -

-

- [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] -

- "} - - - if(!is_guest_key(src.key)) - output += playerpolls() - - output += "
" - - var/datum/browser/popup = new(src, "playersetup", "
Welcome to
Daedalus Outpost
", 270, 295) - popup.set_window_options("can_close=0;focus=false;") - popup.set_content(output.Join()) - popup.open(FALSE) + npp.open() //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(skip_check) - if(QDELETED(src) || !src.client) + if(QDELETED(src) || !src.client || src.client.restricted_mode) ready = PLAYER_NOT_READY return FALSE @@ -201,13 +60,12 @@ if(QDELETED(src) || !src.client || (!skip_check && (this_is_like_playing_right != "Yes"))) ready = PLAYER_NOT_READY src << browse(null, "window=playersetup") //closes the player setup window - new_player_panel() + npp.open() return FALSE - var/mob/dead/observer/observer = new + var/mob/dead/observer/observer = new(null, TRUE) spawning = TRUE - observer.started_as_observer = TRUE close_spawn_windows() var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list to_chat(src, span_notice("Now teleporting.")) @@ -220,8 +78,7 @@ observer.client = client observer.restore_ghost_appearance() if(observer.client && observer.client.prefs) - observer.real_name = observer.client.prefs.read_preference(/datum/preference/name/real_name) - observer.name = observer.real_name + observer.set_real_name(observer.client.prefs.read_preference(/datum/preference/name/real_name)) observer.client.init_verbs() observer.stop_sound_channel(CHANNEL_LOBBYMUSIC) deadchat_broadcast(" has observed.", "[observer.real_name]", follow_target = observer, turf_target = get_turf(observer), message_type = DEADCHAT_DEATHRATTLE) @@ -269,41 +126,6 @@ return JOB_UNAVAILABLE_GENERIC return JOB_AVAILABLE -/mob/dead/new_player/proc/playerpolls() - var/list/output = list() - if (SSdbcore.Connect()) - var/isadmin = FALSE - if(client?.holder) - isadmin = TRUE - var/datum/db_query/query_get_new_polls = SSdbcore.NewQuery({" - SELECT id FROM [format_table_name("poll_question")] - WHERE (adminonly = 0 OR :isadmin = 1) - AND Now() BETWEEN starttime AND endtime - AND deleted = 0 - AND id NOT IN ( - SELECT pollid FROM [format_table_name("poll_vote")] - WHERE ckey = :ckey - AND deleted = 0 - ) - AND id NOT IN ( - SELECT pollid FROM [format_table_name("poll_textreply")] - WHERE ckey = :ckey - AND deleted = 0 - ) - "}, list("isadmin" = isadmin, "ckey" = ckey)) - var/rs = REF(src) - if(!query_get_new_polls.Execute()) - qdel(query_get_new_polls) - return - if(query_get_new_polls.NextRow()) - output += "

Show Player Polls (NEW!)

" - else - output += "

Show Player Polls

" - qdel(query_get_new_polls) - if(QDELETED(src)) - return - return output - /mob/dead/new_player/proc/AttemptLateSpawn(rank) var/error = IsJobUnavailable(rank) if(error != JOB_AVAILABLE) @@ -348,12 +170,15 @@ // If we already have a captain, are they a "Captain" rank and are we allowing multiple of them to be assigned? if(is_captain_job(job)) is_captain = IS_FULL_CAPTAIN + // If we don't have an assigned cap yet, check if this person qualifies for some from of captaincy. else if(!SSjob.assigned_captain && ishuman(character) && SSjob.chain_of_command[rank] && !is_banned_from(ckey, list(JOB_CAPTAIN))) is_captain = IS_ACTING_CAPTAIN + if(is_captain != IS_NOT_CAPTAIN) - minor_announce(job.get_captaincy_announcement(character)) + SSshuttle.arrivals?.OnDock(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(priority_announce), job.get_captaincy_announcement(character), null, null, null, null, FALSE)) SSjob.promote_to_captain(character, is_captain == IS_ACTING_CAPTAIN) + #undef IS_NOT_CAPTAIN #undef IS_ACTING_CAPTAIN #undef IS_FULL_CAPTAIN @@ -365,16 +190,21 @@ humanc = character //Let's retypecast the var to be human, if(humanc) //These procs all expect humans - //PARIAH EDIT START var/chosen_rank = humanc.client?.prefs.alt_job_titles[rank] || rank - GLOB.data_core.manifest_inject(humanc, humanc.client) + SSdatacore.manifest_inject(humanc, humanc.client) + if(SSshuttle.arrivals) SSshuttle.arrivals.QueueAnnounce(humanc, chosen_rank) else announce_arrival(humanc, chosen_rank) - //PARIAH EDIT END + AddEmploymentContract(humanc) + var/datum/job_department/department = job.departments_list?[1] + if(department?.department_head == job.type && SSjob.temporary_heads_by_dep[department]) + var/message = "Greetings, [job.title] [humanc.real_name], in your absense, your employee \"[SSjob.temporary_heads_by_dep[department]]\" was granted elevated access to perform your duties." + aas_pda_message_name(humanc.real_name, DATACORE_RECORDS_STATION, message, "Staff Notice") + if(GLOB.curse_of_madness_triggered) give_madness(humanc, GLOB.curse_of_madness_triggered) @@ -404,54 +234,6 @@ if(!employmentCabinet.virgin) employmentCabinet.addFile(employee) - -/mob/dead/new_player/proc/LateChoices() - var/list/dat = list() - if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) - dat += "
Only Observers may join at this time.

" - dat += "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" - if(SSshuttle.emergency) - switch(SSshuttle.emergency.mode) - if(SHUTTLE_ESCAPE) - dat += "
The station has been evacuated.

" - if(SHUTTLE_CALL) - if(!SSshuttle.canRecall()) - dat += "
The station is currently undergoing evacuation procedures.

" - for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) - if(prioritized_job.current_positions >= prioritized_job.total_positions) - SSjob.prioritized_jobs -= prioritized_job - dat += "
" - var/column_counter = 0 - - for(var/datum/job_department/department as anything in SSjob.joinable_departments) - var/department_color = department.latejoin_color - dat += "
" - dat += "[department.department_name]" - var/list/dept_data = list() - for(var/datum/job/job_datum as anything in department.department_jobs) - if(IsJobUnavailable(job_datum.title, TRUE) != JOB_AVAILABLE) - continue - var/command_bold = "" - if(job_datum.departments_bitflags & DEPARTMENT_BITFLAG_COMMAND) - command_bold = " command" - if(job_datum in SSjob.prioritized_jobs) - dept_data += "[job_datum.title] ([job_datum.current_positions])" - else - dept_data += "[job_datum.title] ([job_datum.current_positions])" - if(!length(dept_data)) - dept_data += "No positions open." - dat += dept_data.Join() - dat += "

" - column_counter++ - if(column_counter > 0 && (column_counter % 3 == 0)) - dat += "
" - dat += "
" - dat += "
" - var/datum/browser/popup = new(src, "latechoices", "Choose Profession", 680, 580) - popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') - popup.set_content(jointext(dat, "")) - popup.open(FALSE) // 0 is passed to open so that it doesn't use the onclose() proc - /// Creates, assigns and returns the new_character to spawn as. Assumes a valid mind.assigned_role exists. /mob/dead/new_player/proc/create_character(atom/destination) spawning = TRUE @@ -462,8 +244,10 @@ if(QDELETED(src) || !client) return // Disconnected while checking for the appearance ban. if(!isAI(spawning_mob)) // Unfortunately there's still snowflake AI code out there. - mind.transfer_to(spawning_mob) //won't transfer key since the mind is not active - mind.set_original_character(spawning_mob) + // transfer_to sets mind to null + var/datum/mind/preserved_mind = mind + preserved_mind.transfer_to(spawning_mob) //won't transfer key since the mind is not active + preserved_mind.set_original_character(spawning_mob) client.init_verbs() . = spawning_mob new_character = . @@ -475,26 +259,13 @@ return new_character.key = key //Manually transfer the key to log them in, new_character.stop_sound_channel(CHANNEL_LOBBYMUSIC) - new_character?.client.show_location_blurb() + new_character.client?.show_location_blurb() var/area/joined_area = get_area(new_character.loc) if(joined_area) joined_area.on_joining_game(new_character) new_character = null qdel(src) - -/mob/dead/new_player/proc/ViewManifest() - if(!client) - return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) - /mob/dead/new_player/Move() return 0 @@ -509,9 +280,25 @@ // 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, as well as some extra logic to make sure things don't go wrong /mob/dead/new_player/proc/check_preferences() - if(!client) + var/client/mob_client = GET_CLIENT(src) + if(!mob_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.read_preference(/datum/preference/choiced/jobless_role) != RETURNTOLOBBY) + + var/list/job_priority = client.prefs.read_preference(/datum/preference/blob/job_priority) + var/datum/employer/employer_path = client.prefs.read_preference(/datum/preference/choiced/employer) + + var/write_pref = FALSE + for(var/job_name in job_priority) + var/datum/job/J = SSjob.GetJob(job_name) + if(!(employer_path in J.employers)) + job_priority -= job_name + write_pref = TRUE + + if(write_pref) + to_chat(src, span_danger("One or more jobs did not fit your current employer and have been removed in your selection.")) + client.prefs.write_preference(/datum/preference/blob/job_priority, job_priority) + + if(mob_client.prefs.read_preference(/datum/preference/choiced/jobless_role) != RETURNTOLOBBY) return TRUE // If they have antags enabled, they're potentially doing this on purpose instead of by accident. Notify admins if so. @@ -523,7 +310,7 @@ has_antags = TRUE num_antags++ - if(client.prefs.read_preference(/datum/preference/blob/job_priority):len == 0) + if(job_priority.len == 0) if(!ineligible_for_roles) to_chat(src, span_danger("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.")) ineligible_for_roles = TRUE @@ -541,24 +328,14 @@ * giving them the interview form and forcing it to appear. */ /mob/dead/new_player/proc/register_for_interview() - // First we detain them by removing all the verbs they have on client - for (var/v in client.verbs) - var/procpath/verb_path = v - remove_verb(client, verb_path) - - // Then remove those on their mob as well - for (var/v in verbs) - var/procpath/verb_path = v - remove_verb(src, verb_path) - // Then we create the interview form and show it to the client var/datum/interview/I = GLOB.interviews.interview_for_client(client) if (I) I.ui_interact(src) // Add verb for re-opening the interview panel, fixing chat and re-init the verbs for the stat panel - add_verb(src, /mob/dead/new_player/proc/open_interview) - add_verb(client, /client/verb/fix_tgui_panel) + add_verb(src, /mob/dead/new_player/proc/open_interview, bypass_restricted = TRUE) + add_verb(client, /client/verb/fix_tgui_panel, bypass_restricted = TRUE) //Small verb that allows +DEBUG admins to bypass the observer prep lock /mob/dead/new_player/verb/immediate_observe() @@ -568,3 +345,10 @@ //This is bypassing a LOT of safety checks, so we're just going to send this immediately. to_chat_immediate(usr, span_userdanger("Bypassing all safety checks and spawning you in immediately.\nDon't complain on the repo if this breaks shit!")) make_me_an_observer(1) + +/mob/dead/new_player/get_status_tab_items() + . = ..() + if(SSticker.HasRoundStarted()) + return + + . += SSticker.player_ready_data diff --git a/code/modules/mob/dead/new_player/new_player_panel.dm b/code/modules/mob/dead/new_player/new_player_panel.dm new file mode 100644 index 000000000000..529df727fe45 --- /dev/null +++ b/code/modules/mob/dead/new_player/new_player_panel.dm @@ -0,0 +1,479 @@ +#define LINKIFY_CONSOLE_OPTION(str, cmd) "[str]" +#define CONSOLE_BACK "Back" +#define LINKIFY_READY(string, value) "[string]" + +#define NPP_TAB_MAIN "main" +#define NPP_TAB_GAME "game" + +/datum/new_player_panel + var/mob/dead/new_player/parent + var/active_tab = NPP_TAB_MAIN + +/datum/new_player_panel/New(parent) + src.parent = parent + +/datum/new_player_panel/Destroy(force, ...) + parent = null + return ..() + +/datum/new_player_panel/Topic(href, href_list[]) + if(parent != usr) + return + + if(!parent.client) + return + + if(parent.client.restricted_mode) + if(href_list["verify"]) + show_otp_menu() + return TRUE + + if(href_list["link_to_discord"]) + var/_link = CONFIG_GET(string/panic_bunker_discord_link) + if(_link) + parent << link(_link) + return TRUE + + return TRUE + + if(href_list["npp_options"]) + var/datum/preferences/preferences = parent.client.prefs + preferences.current_window = PREFERENCE_TAB_GAME_PREFERENCES + preferences.update_static_data(usr) + preferences.ui_interact(usr) + return TRUE + + if(href_list["view_primer"]) + view_primer() + return TRUE + + if(href_list["character_setup"]) + var/datum/preferences/preferences = parent.client.prefs + preferences.html_show(usr) + return TRUE + + if(href_list["ready"]) + var/tready = text2num(href_list["ready"]) + //Avoid updating ready if we're after PREGAME (they should use latejoin instead) + //This is likely not an actual issue but I don't have time to prove that this + //no longer is required + if(SSticker.current_state <= GAME_STATE_PREGAME) + parent.ready = tready + + //if it's post initialisation and they're trying to observe we do the needful + if(SSticker.current_state >= GAME_STATE_SETTING_UP && tready == PLAYER_READY_TO_OBSERVE) + parent.ready = tready + parent.make_me_an_observer() + return + + update() + return + + if(href_list["npp_game"]) + change_tab(NPP_TAB_GAME) + return + + if(href_list["main_menu"]) + change_tab(NPP_TAB_MAIN) + return + + if(href_list["refresh"]) + parent << browse(null, "window=playersetup") //closes the player setup window + open() + + if(href_list["manifest"]) + show_crew_manifest(parent) + return + + if(href_list["late_join"]) //This still exists for queue messages in chat + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, span_boldwarning("The round is either not ready, or has already finished...")) + return + LateChoices() + return + + if(href_list["SelectedJob"]) + if(!SSticker?.IsRoundInProgress()) + to_chat(usr, span_danger("The round is either not ready, or has already finished...")) + return + + if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) + to_chat(usr, span_notice("There is an administrative lock on entering the game!")) + return + + //Determines Relevent Population Cap + var/relevant_cap + var/hpc = CONFIG_GET(number/hard_popcap) + var/epc = CONFIG_GET(number/extreme_popcap) + if(hpc && epc) + relevant_cap = min(hpc, epc) + else + relevant_cap = max(hpc, epc) + + if(SSticker.queued_players.len && !(ckey(parent.key) in GLOB.admin_datums)) + if((living_player_count() >= relevant_cap) || (src != SSticker.queued_players[1])) + to_chat(usr, span_warning("Server is full.")) + return + + parent.AttemptLateSpawn(href_list["SelectedJob"]) + return + + else if(!href_list["late_join"]) + open() + + if(href_list["showpoll"]) + parent.handle_player_polling() + return + + if(href_list["viewpoll"]) + var/datum/poll_question/poll = locate(href_list["viewpoll"]) in GLOB.polls + parent.poll_player(poll) + + if(href_list["votepollref"]) + var/datum/poll_question/poll = locate(href_list["votepollref"]) in GLOB.polls + parent.vote_on_poll_handler(poll, href_list) + +/datum/new_player_panel/proc/update() + change_tab(active_tab) + +/datum/new_player_panel/proc/open() + if(parent.client?.restricted_mode) + restricted_client_panel() + return + + active_tab = NPP_TAB_MAIN + + var/list/output = list() + output += npp_header() + output += "
" + output += npp_main("dir") + output += "
" + + var/datum/browser/popup = new(parent, "playersetup", "", 480, 360) + popup.set_window_options("can_close=0;focus=false;can_resize=0") + popup.set_content(output.Join()) + popup.open(FALSE) + +/datum/new_player_panel/proc/change_tab(new_tab) + var/content + if(parent.client?.restricted_mode) + restricted_client_panel() + return + + switch(new_tab) + if(NPP_TAB_MAIN) + content = npp_main("cd..") + active_tab = NPP_TAB_MAIN + + if(NPP_TAB_GAME) + content = npp_game("space_station_13.exe") + active_tab = NPP_TAB_GAME + + else + return + + parent << output(url_encode(content), "playersetup.browser:update_content") + +/datum/new_player_panel/proc/npp_header() + return {" + + "} + +/datum/new_player_panel/proc/npp_main(last_cmd) + var/list/output = list() + + var/poll = playerpolls() + if(!is_guest_key(parent.client.key) && poll) + poll = "
>[LINKIFY_CONSOLE_OPTION(poll, "showpoll=1")]
" + + output += {" +
+ + ThinkDOS Terminal + +
+
+ C:\\Users\\[parent.ckey]\\ss13>[last_cmd] +
+
+ >[LINKIFY_CONSOLE_OPTION("space_station_13.exe", "npp_game=1")] +
+
+ >[LINKIFY_CONSOLE_OPTION("options.cfg", "npp_options=1")] +
+
+ >[LINKIFY_CONSOLE_OPTION("lore_primer.txt", "view_primer=1")] +
+ [poll] +
+
+ C:\\Users\\[parent.ckey]\\ss13> + +
+
+
+ "} + + output += join_or_ready() + + return jointext(output, "") + +/datum/new_player_panel/proc/npp_game(last_cmd) + var/list/output = list() + var/name = parent.client?.prefs.read_preference(/datum/preference/name/real_name) + + var/status + if(SSticker.current_state <= GAME_STATE_PREGAME) + switch(parent.ready) + if(PLAYER_NOT_READY) + status = "
>Status: Not Ready
" + if(PLAYER_READY_TO_PLAY) + status = "
>Status: Ready
" + if(PLAYER_READY_TO_OBSERVE) + status = "
>Status: Ready (Observe)
" + else + status = "
>Status: Not Ready
" + + output += {" +
+ + ThinkDOS Terminal + +
+
+ C:\\Users\\[parent.ckey]\\ss13>[last_cmd] +
+
+ >Loaded Character: [name] +
+ [status] +
+
+ >[LINKIFY_CONSOLE_OPTION("Modify [name].txt", "character_setup=1")] +
+
+ >[CONSOLE_BACK] +
+
+
+ C:\\Users\\[parent.ckey]\\ss13> + +
+
+
+ "} + + output += join_or_ready() + + return jointext(output, "") + +/datum/new_player_panel/proc/join_or_ready() + var/list/output = list() + output += {" +
+ "} + + if(SSticker.current_state > GAME_STATE_PREGAME) + output += {" +
+
[button_element(src, "Join Game", "late_join=1")]
+
[LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)]
+
+ "} + output += "
[button_element(src, "View Station Manifests", "manifest=1")]
" + else + switch(parent.ready) + if(PLAYER_NOT_READY) + output += "
\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | Not Ready | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
" + if(PLAYER_READY_TO_PLAY) + output += "
\[ Ready | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | [LINKIFY_READY("Observe", PLAYER_READY_TO_OBSERVE)] \]
" + if(PLAYER_READY_TO_OBSERVE) + output += "
\[ [LINKIFY_READY("Ready", PLAYER_READY_TO_PLAY)] | [LINKIFY_READY("Not Ready", PLAYER_NOT_READY)] | Observe \]
" + output += "
" + + output += "
" + return jointext(output, "") + +/datum/new_player_panel/proc/restricted_client_panel() + var/content = {" +
+
+
+ Welcome to Daedalus Dock's Test Server

+ We require discord verification in order to play, as a measure to protect us against griefing. +
+
+
[button_element(src, "Verify", "verify=1")]
+
+ "} + + var/datum/browser/popup = new(parent, "playersetup", "
Welcome, New Player!
", 660, 270) + popup.set_window_options("can_close=0;focus=false;can_resize=0") + popup.set_content(content) + popup.open(FALSE) + +/datum/new_player_panel/proc/show_otp_menu() + if(!parent.client) + return + + var/discord_otp = parent.client.discord_get_or_generate_one_time_token_for_ckey(parent.ckey) + var/discord_prefix = CONFIG_GET(string/discordbotcommandprefix) + var/browse_body = {" +
+ Your One-Time-Password is:
[discord_otp]
+

+ To link your Discord account, head to the Discord Server and make an entry ticket if you have not already. Then, paste the following into any channel: +
+
+ + [discord_prefix]verify [discord_otp] + +
+
[button_element(src, "Discord", "link_to_discord=1")] +
+ "} + + var/datum/browser/popup = new(parent, "discordauth", "
Verification
", 660, 270) + popup.set_window_options("can_close=0;focus=true;can_resize=0") + popup.set_content(browse_body) + popup.open() + +/datum/new_player_panel/proc/view_primer() + var/content = {" +
+ Welcome, space-farer, to the Great Pool. A large sea of a substance known as Aether, speckled with stars, planets, and other stellar bodies. +
+

+
+ You are an inhabitant of a residential space station tucked in a little-explored region of the Pool. Perhaps you were born here, or are a Hermes merchanter lying low after a smuggling bust. Some weeks ago, a group from the Federation Galaxias arrived and announced the station was commandeered for emergency + resource production amidst the Resonance Crisis. They brought with them a small group of enforcers from the Mars People's Coalition to ensure a 'smooth transition'. +
+

+
+ Earn the respect of your superiors. Scam your fellow citizens out of their precious coin. Wash your sorrows down your throat with a chaser of brandy. No matter which you choose, make the most of your time on Olympus Outpost. +
+ "} + var/datum/browser/popup = new(parent, "primer", "
New Player Primer
", 660, 350) + popup.set_content(content) + popup.open() + +/datum/new_player_panel/proc/playerpolls() + if (!SSdbcore.Connect()) + return + + var/isadmin = FALSE + if(parent.client?.holder) + isadmin = TRUE + + var/datum/db_query/query_get_new_polls = SSdbcore.NewQuery({" + SELECT id FROM [format_table_name("poll_question")] + WHERE (adminonly = 0 OR :isadmin = 1) + AND Now() BETWEEN starttime AND endtime + AND deleted = 0 + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_vote")] + WHERE ckey = :ckey + AND deleted = 0 + ) + AND id NOT IN ( + SELECT pollid FROM [format_table_name("poll_textreply")] + WHERE ckey = :ckey + AND deleted = 0 + ) + "}, list("isadmin" = isadmin, "ckey" = parent.ckey)) + + if(!query_get_new_polls.Execute()) + qdel(query_get_new_polls) + return + + if(query_get_new_polls.NextRow()) + . = "polls.exe (new!)" + else + . = "polls.exe" + + qdel(query_get_new_polls) + if(QDELETED(src)) + return null + + return . + +/datum/new_player_panel/proc/LateChoices() + var/list/dat = list() + if(SSlag_switch.measures[DISABLE_NON_OBSJOBS]) + dat += "
Only Observers may join at this time.

" + + dat += "
Round Duration: [DisplayTimeText(world.time - SSticker.round_start_time)]
" + + if(SSshuttle.emergency) + switch(SSshuttle.emergency.mode) + if(SHUTTLE_ESCAPE) + dat += "
The station has been evacuated.

" + if(SHUTTLE_CALL) + if(!SSshuttle.canRecall()) + dat += "
The station is currently undergoing evacuation procedures.

" + + for(var/datum/job/prioritized_job in SSjob.prioritized_jobs) + if(prioritized_job.current_positions >= prioritized_job.total_positions) + SSjob.prioritized_jobs -= prioritized_job + + dat += "
" + var/column_counter = 0 + + for(var/datum/job_department/department as anything in SSjob.departments) + if(department.exclude_from_latejoin) + continue + + var/department_color = department.latejoin_color + dat += "
" + dat += "[department.department_name]" + + var/list/dept_data = list() + for(var/datum/job/job_datum as anything in department.department_jobs) + if(parent.IsJobUnavailable(job_datum.title, TRUE) != JOB_AVAILABLE) + continue + + var/command_bold = "" + if(job_datum.departments_bitflags & DEPARTMENT_BITFLAG_COMPANY_LEADER) + command_bold = " command" + + if(job_datum in SSjob.prioritized_jobs) + dept_data += "[job_datum.title] ([job_datum.current_positions])" + else + dept_data += "[job_datum.title] ([job_datum.current_positions])" + if(!length(dept_data)) + dept_data += "No positions open." + + dat += dept_data.Join() + dat += "

" + + column_counter++ + if(column_counter > 0 && (column_counter % 3 == 0)) + dat += "
" + + dat += "
" + dat += "
" + + var/datum/browser/popup = new(parent, "latechoices", "Choose Profession", 680, 580) + popup.add_stylesheet("playeroptions", 'html/browser/playeroptions.css') + popup.set_content(jointext(dat, "")) + popup.open(FALSE) // 0 is passed to open so that it doesn't use the onclose() proc + +#undef LINKIFY_CONSOLE_OPTION +#undef NPP_TAB_MAIN +#undef NPP_TAB_GAME +#undef CONSOLE_BACK +#undef LINKIFY_READY diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 164643a4d266..29691bf2681f 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -27,6 +27,8 @@ var/datum/job/preview_job = get_highest_priority_job() // Set up the dummy for its photoshoot + mannequin.dna.species.replace_missing_bodyparts(mannequin) // Augments modify bodyparts, so we need to reset them incase augs were removed. + //mannequin.dna.species.regenerate_organs(mannequin, visual_only = TRUE) apply_prefs_to(mannequin, TRUE) switch(preview_pref) @@ -41,6 +43,17 @@ mannequin.dress_up_as_job(preview_job, TRUE, src, TRUE) if(PREVIEW_PREF_LOADOUT) mannequin.equip_outfit_and_loadout(new /datum/outfit, src, TRUE) + + // Yes we do it every time because it needs to be done after job gear + if(length(SSquirks.quirks)) + // And yes we need to clean all the quirk datums every time + mannequin.cleanse_quirk_datums() + for(var/quirk_name as anything in read_preference(/datum/preference/blob/quirks)) + var/datum/quirk/quirk_type = SSquirks.quirks[quirk_name] + if(!(initial(quirk_type.quirk_flags) & QUIRK_CHANGES_APPEARANCE)) + continue + mannequin.add_quirk(quirk_type, parent) + mannequin.update_body() mannequin.add_overlay(mutable_appearance('icons/turf/floors.dmi', icon_state = "floor", layer = SPACE_LAYER)) return mannequin.appearance diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index 579c23991b18..778c2890b6d0 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -46,7 +46,7 @@ female += D.name if(add_blank) - L["None"] = new /datum/sprite_accessory/blank + L[SPRITE_ACCESSORY_NONE] = new /datum/sprite_accessory/blank sortTim(L, GLOBAL_PROC_REF(cmp_text_asc), FALSE) if(male) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index 72a1864fb61f..47714ca8ddc7 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -2,12 +2,8 @@ icon = 'icons/mob/mutant_bodyparts.dmi' em_block = TRUE -/datum/sprite_accessory/ears/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" - hasinner = 1 + hasinner = TRUE color_src = HAIR diff --git a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm index cd8bffbfccdc..1534b6eac035 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/frills.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/frills.dm @@ -1,10 +1,6 @@ /datum/sprite_accessory/frills icon = 'icons/mob/mutant_bodyparts.dmi' -/datum/sprite_accessory/frills/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/frills/simple name = "Simple" icon_state = "simple" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm index abda26faf314..30caca703440 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm @@ -1256,7 +1256,3 @@ /datum/sprite_accessory/vox_hair/ruffhawk name = "Vox Ruffhawk" icon_state = "ruffhawk" - -/datum/sprite_accessory/vox_hair/none - name = "None" - icon_state = "none" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/headtails.dm b/code/modules/mob/dead/new_player/sprite_accessories/headtails.dm deleted file mode 100644 index de585f61cb4a..000000000000 --- a/code/modules/mob/dead/new_player/sprite_accessories/headtails.dm +++ /dev/null @@ -1,15 +0,0 @@ -/* -Skrell Headtails -*/ - -/datum/sprite_accessory/headtails - icon = 'icons/mob/species/skrell/skrell_headtails.dmi' - color_src = HAIR - -/datum/sprite_accessory/headtails/long - name = "Long" - icon_state = "long" - -/datum/sprite_accessory/headtails/short - name = "Short" - icon_state = "short" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm index 6a4568db7ea4..8bf8891974a7 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/horns.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/horns.dm @@ -2,10 +2,6 @@ icon = 'icons/mob/mutant_bodyparts.dmi' em_block = TRUE -/datum/sprite_accessory/horns/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/horns/simple name = "Simple" icon_state = "simple" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_antenna.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_antenna.dm new file mode 100644 index 000000000000..ac7d214d9f2f --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_antenna.dm @@ -0,0 +1,39 @@ +/datum/sprite_accessory/ipc_antenna + icon = 'icons/mob/species/ipc/accessories.dmi' + gender_specific = FALSE + +/datum/sprite_accessory/ipc_antenna/crowned + name = "Crowned" + icon_state = "crowned" + +/datum/sprite_accessory/ipc_antenna/crowned + name = "Crowned" + icon_state = "crowned" + +/datum/sprite_accessory/ipc_antenna/tvantennae + name = "TV Anetennae" + icon_state = "tvantennae" + +/datum/sprite_accessory/ipc_antenna/tesla + name = "Tesla" + icon_state = "tesla" + +/datum/sprite_accessory/ipc_antenna/light + name = "Light" + icon_state = "light" + +/datum/sprite_accessory/ipc_antenna/cyberhead + name = "Cyberhead" + icon_state = "cyberhead" + +/datum/sprite_accessory/ipc_antenna/sidelights + name = "Side Lights" + icon_state = "sidelights" + +/datum/sprite_accessory/ipc_antenna/antlers + name = "Antlers" + icon_state = "antlers" + +/datum/sprite_accessory/ipc_antenna/droneeyes + name = "Drone Eyes" + icon_state = "droneeyes" diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_screens.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_screens.dm new file mode 100644 index 000000000000..26ed393113d1 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc/ipc_screens.dm @@ -0,0 +1,136 @@ +/datum/sprite_accessory/ipc_screen + icon = 'icons/mob/species/ipc/accessories.dmi' + gender_specific = FALSE + +/datum/sprite_accessory/ipc_screen/console + name = "Console" + icon_state = "console" + +/datum/sprite_accessory/ipc_screen/blue + name = "Bluescreen" + icon_state = "blue" + +/datum/sprite_accessory/ipc_screen/blue + name = "Breakout" + icon_state = "breakout" + +/datum/sprite_accessory/ipc_screen/eight + name = "Eight" + icon_state = "eight" + +/datum/sprite_accessory/ipc_screen/goggles + name = "Goggles" + icon_state = "goggles" + +/datum/sprite_accessory/ipc_screen/green + name = "Green" + icon_state = "green" + +/datum/sprite_accessory/ipc_screen/heart + name = "Heart" + icon_state = "heart" + +/datum/sprite_accessory/ipc_screen/monoeye + name = "Monoeye" + icon_state = "monoeye" + +/datum/sprite_accessory/ipc_screen/minecraft + name = "Nature" + icon_state = "nature" + +/datum/sprite_accessory/ipc_screen/orange + name = "Orange" + icon_state = "orange" + +/datum/sprite_accessory/ipc_screen/blue + name = "Bluescreen" + icon_state = "blue" + +/datum/sprite_accessory/ipc_screen/pink + name = "Pink" + icon_state = "pink" + +/datum/sprite_accessory/ipc_screen/purple + name = "Purple" + icon_state = "purple" + +/datum/sprite_accessory/ipc_screen/red + name = "Red" + icon_state = "red" + +/datum/sprite_accessory/ipc_screen/staticscreen + name = "Static" + icon_state = "static" + +/datum/sprite_accessory/ipc_screen/shower + name = "Shower" + icon_state = "shower" + +/datum/sprite_accessory/ipc_screen/yellow + name = "Yellow" + icon_state = "yellow" + +/datum/sprite_accessory/ipc_screen/scroll + name = "Scroll" + icon_state = "scroll" + +/datum/sprite_accessory/ipc_screen/rgb + name = "RGB" + icon_state = "rgb" + +/datum/sprite_accessory/ipc_screen/glider + name = "Glider" + icon_state = "glider" + +/datum/sprite_accessory/ipc_screen/rainbow + name = "Rainbow" + icon_state = "rainbow" + +/datum/sprite_accessory/ipc_screen/bsod + name = "BSOD" + icon_state = "bsod" + +/datum/sprite_accessory/ipc_screen/redtext + name = "Redtext" + icon_state = "redtext" + +/datum/sprite_accessory/ipc_screen/sinewave + name = "Sine Wave" + icon_state = "sinewave" + +/datum/sprite_accessory/ipc_screen/squarewave + name = "Square Wave" + icon_state = "squarewave" + +/datum/sprite_accessory/ipc_screen/ecgwave + name = "ECG Wave" + icon_state = "ecgwave" + +/datum/sprite_accessory/ipc_screen/eyes + name = "Eyes" + icon_state = "eyes" + +/datum/sprite_accessory/ipc_screen/loading + name = "Loading" + icon_state = "loading" + +/datum/sprite_accessory/ipc_screen/windowsxp + name = "Windows XP" //WAIT THIS ISN'T CANON THIS WAS NEVER INVENTED WAIT WAIT WA- *turns to dust* + icon_state = "windowsxp" + +/datum/sprite_accessory/ipc_screen/tetris + name = "Tetris" + icon_state = "tetris" + +/datum/sprite_accessory/ipc_screen/tv + name = "TeleVision" + icon_state = "tv" + +/datum/sprite_accessory/ipc_screen/textdrop + name = "Text Drop" + icon_state = "textdrop" + +/datum/sprite_accessory/ipc_screen/stars + name = "Stars" + icon_state = "stars" + diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ipc/saurian.dm b/code/modules/mob/dead/new_player/sprite_accessories/ipc/saurian.dm new file mode 100644 index 000000000000..d1793429bd47 --- /dev/null +++ b/code/modules/mob/dead/new_player/sprite_accessories/ipc/saurian.dm @@ -0,0 +1,82 @@ + +/datum/sprite_accessory/saurian_screen + icon = 'icons/mob/species/ipc/saurian/saurian_snouts.dmi' + gender_specific = FALSE + +/datum/sprite_accessory/saurian_screen/basic + name = "Basic" + icon_state = "basic" + +/datum/sprite_accessory/saurian_screen/long + name = "Long" + icon_state = "long" + +/datum/sprite_accessory/saurian_screen/thick + name = "Thick" + icon_state = "thick" + +/datum/sprite_accessory/saurian_screen/thicklong + name = "Thicklong" + icon_state = "thicklong" + +/datum/sprite_accessory/saurian_screen/barless + name = "Barless" + icon_state = "barless" + +/datum/sprite_accessory/saurian_tail + icon = 'icons/mob/species/ipc/saurian/saurian_tails.dmi' + gender_specific = FALSE + +/datum/sprite_accessory/saurian_tail/basic + name = "Basic" + icon_state = "basic" + +/datum/sprite_accessory/saurian_scutes + icon = 'icons/mob/species/ipc/saurian/saurian_scutes.dmi' + gender_specific = TRUE + +/datum/sprite_accessory/saurian_scutes/default + name = "Default" + icon_state = "default" + +/datum/sprite_accessory/saurian_antenna + icon = 'icons/mob/species/ipc/saurian/saurian_antennas.dmi' + gender_specific = FALSE + +/datum/sprite_accessory/saurian_antenna/default + name = "Default" + icon_state = "default" + +/datum/sprite_accessory/saurian_antenna/curled + name = "Curled" + icon_state = "curled" + +/datum/sprite_accessory/saurian_antenna/thick + name = "Thick" + icon_state = "thick" + +/datum/sprite_accessory/saurian_antenna/thicklight + name = "Thick (Light)" + icon_state = "thicklight" + +/datum/sprite_accessory/saurian_antenna/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/saurian_antenna/sharp + name = "Sharp" + icon_state = "sharp" + +/datum/sprite_accessory/saurian_antenna/sharplight + name = "Sharp (Light)" + icon_state = "sharplight" + +/datum/sprite_accessory/saurian_antenna/horns + name = "Horns" + icon_state = "horns" + +/datum/sprite_accessory/saurian_antenna/hornslight + name = "Horns (Light)" + icon_state = "hornslight" + + diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 61ed872b7d4f..fb105a46d20a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -18,9 +18,10 @@ name = "Round + Light" icon_state = "roundlight" -/datum/sprite_accessory/vox_snouts/vox +/datum/sprite_accessory/vox_snouts icon = 'icons/mob/species/vox/vox_snouts.dmi' + em_block = TRUE + +/datum/sprite_accessory/vox_snouts/vox name = "Vox Snout" icon_state = "vox" - em_block = TRUE - color_src = MUTCOLORS2 diff --git a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm index d129a4630352..09fbad673b66 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/spines.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/spines.dm @@ -1,55 +1,18 @@ /datum/sprite_accessory/spines icon = 'icons/mob/mutant_bodyparts.dmi' em_block = TRUE - -/datum/sprite_accessory/spines_animated - icon = 'icons/mob/mutant_bodyparts.dmi' - em_block = TRUE - -/datum/sprite_accessory/spines/none - name = "None" - icon_state = "none" - -/datum/sprite_accessory/spines_animated/none - name = "None" - icon_state = "none" - /datum/sprite_accessory/spines/short name = "Short" icon_state = "short" - -/datum/sprite_accessory/spines_animated/short - name = "Short" - icon_state = "short" - /datum/sprite_accessory/spines/shortmeme name = "Short + Membrane" icon_state = "shortmeme" - -/datum/sprite_accessory/spines_animated/shortmeme - name = "Short + Membrane" - icon_state = "shortmeme" - /datum/sprite_accessory/spines/long name = "Long" icon_state = "long" - -/datum/sprite_accessory/spines_animated/long - name = "Long" - icon_state = "long" - /datum/sprite_accessory/spines/longmeme name = "Long + Membrane" icon_state = "longmeme" - -/datum/sprite_accessory/spines_animated/longmeme - name = "Long + Membrane" - icon_state = "longmeme" - /datum/sprite_accessory/spines/aqautic name = "Aquatic" icon_state = "aqua" - -/datum/sprite_accessory/spines_animated/aqautic - name = "Aquatic" - icon_state = "aqua" diff --git a/code/modules/mob/dead/observer/logout.dm b/code/modules/mob/dead/observer/logout.dm index 1b666a88bcd3..c5d02c6dbab3 100644 --- a/code/modules/mob/dead/observer/logout.dm +++ b/code/modules/mob/dead/observer/logout.dm @@ -2,7 +2,7 @@ update_z(null) if(observetarget && ismob(observetarget)) - cleanup_observe() + stop_observing() ..() // This is one of very few spawn()s left in our codebase // Yes it needs to be like this diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 66ae68d450b4..180b95e9e03a 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -18,7 +18,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) invisibility = INVISIBILITY_OBSERVER hud_type = /datum/hud/ghost movement_type = GROUND | FLYING - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_power = 2 light_on = FALSE @@ -48,7 +48,9 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) var/datum/spawners_menu/spawners_menu var/datum/minigames_menu/minigames_menu -/mob/dead/observer/Initialize(mapload) +/mob/dead/observer/Initialize(mapload, started_as_observer = FALSE) + src.started_as_observer = started_as_observer + set_invisibility(GLOB.observer_default_invisibility) add_verb(src, list( @@ -115,6 +117,18 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) SSpoints_of_interest.make_point_of_interest(src) ADD_TRAIT(src, TRAIT_HEAR_THROUGH_DARKNESS, ref(src)) + if(!started_as_observer) + var/static/list/powers = list( + /datum/action/cooldown/ghost_whisper = SPOOK_LEVEL_WEAK_POWERS, + /datum/action/cooldown/flicker = SPOOK_LEVEL_WEAK_POWERS, + /datum/action/cooldown/knock_sound = SPOOK_LEVEL_WEAK_POWERS, + /datum/action/cooldown/ghost_light = SPOOK_LEVEL_MEDIUM_POWERS, + /datum/action/cooldown/chilling_presence = SPOOK_LEVEL_MEDIUM_POWERS, + /datum/action/cooldown/shatter_light = SPOOK_LEVEL_DESTRUCTIVE_POWERS, + /datum/action/cooldown/shatter_glass = SPOOK_LEVEL_DESTRUCTIVE_POWERS, + ) + AddComponent(/datum/component/spooky_powers, powers) + /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!" @@ -180,7 +194,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 = TRUE) +/mob/proc/ghostize(can_reenter_corpse = TRUE, admin_ghost) if(!key) return if(key[1] == "@") // Skip aghosts. @@ -197,7 +211,7 @@ Works together with spawning an observer, noted above. ethereal_heart.stop_crystalization_process(crystal_fella) //stops the crystallization process stop_sound_channel(CHANNEL_HEARTBEAT) //Stop heartbeat sounds because You Are A Ghost Now - var/mob/dead/observer/ghost = new(src, src) // Transfer safety to observer spawning proc. + var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse ghost.key = key @@ -205,9 +219,13 @@ Works together with spawning an observer, noted above. if(!can_reenter_corpse)// Disassociates observer mind from the body mind ghost.mind = null + if(!admin_ghost) + if(!ghost.client?.prefs || ghost.client.prefs.read_preference(/datum/preference/toggle/monochrome_ghost)) + ghost.add_client_colour(/datum/client_colour/ghostmono) + return ghost -/mob/living/ghostize(can_reenter_corpse = TRUE) +/mob/living/ghostize(can_reenter_corpse = TRUE, admin_ghost) . = ..() if(. && can_reenter_corpse) var/mob/dead/observer/ghost = . @@ -242,14 +260,27 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return ghostize(FALSE) -/mob/dead/observer/Move(NewLoc, direct, glide_size_override = 32) +/mob/dead/observer/keyLoop(client/user) + if(observetarget) + var/trying_to_move = FALSE + for(var/_key in user?.keys_held) + if(user.movement_keys[_key]) + trying_to_move = TRUE + break + if(trying_to_move) + stop_observing() + return ..() + +/mob/dead/observer/Move(NewLoc, direct, glide_size_override = 32, z_movement_flags) + if(observetarget) + stop_observing() + setDir(direct) if(glide_size_override) set_glide_size(glide_size_override) if(NewLoc) abstract_move(NewLoc) - update_parallax_contents() else var/turf/destination = get_turf(src) @@ -267,10 +298,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp abstract_move(destination)//Get out of closets and such as a ghost + return TRUE + /mob/dead/observer/forceMove(atom/destination) abstract_move(destination) // move like the wind return TRUE +/mob/dead/observer/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + var/area/new_area = get_area(src) + if(new_area != ambience_tracked_area) + update_ambience_area(new_area) + /mob/dead/observer/verb/reenter_corpse() set category = "Ghost" set name = "Re-enter Corpse" @@ -316,13 +355,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, span_boldnotice("You can no longer be brought back into your body.")) return TRUE -/mob/dead/observer/proc/notify_cloning(message, sound, atom/source, flashwindow = TRUE) +/mob/dead/observer/proc/notify_revival(message, sound, atom/source, flashwindow = TRUE) if(flashwindow) window_flash(client) if(message) to_chat(src, span_ghostalert("[message]")) if(source) - var/atom/movable/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /atom/movable/screen/alert/notify_cloning) + var/atom/movable/screen/alert/A = throw_alert("[REF(source)]_notify_revival", /atom/movable/screen/alert/notify_revival) if(A) var/ui_style = client?.prefs?.read_preference(/datum/preference/choiced/ui_style) if(ui_style) @@ -368,7 +407,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return usr.abstract_move(pick(L)) - update_parallax_contents() /mob/dead/observer/verb/follow() set category = "Ghost" @@ -379,7 +417,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // This is the ghost's follow verb with an argument /mob/dead/observer/proc/ManualFollow(atom/movable/target) - if (!istype(target) || (is_secret_level(target.z) && !client?.holder)) + if (!istype(target) || !target.z || target == src || (is_secret_level(target.z) && !client?.holder)) return var/icon/I = icon(target.icon,target.icon_state,target.dir) @@ -404,6 +442,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp orbit(target,orbitsize, FALSE, 20, rot_seg) /mob/dead/observer/orbit() + if(observetarget) + stop_observing() + setDir(2)//reset dir so the right directional sprites show up return ..() @@ -440,7 +481,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(isturf(destination_turf)) source_mob.abstract_move(destination_turf) - source_mob.update_parallax_contents() else to_chat(source_mob, span_danger("This mob is not located in the game world.")) @@ -513,12 +553,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp update_sight() /mob/dead/observer/update_sight() - if (!ghostvision) + if(observetarget) + return + + if(!ghostvision) see_invisible = SEE_INVISIBLE_LIVING else see_invisible = SEE_INVISIBLE_OBSERVER - - ..() /mob/dead/observer/verb/possess() @@ -553,29 +594,17 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp target.faction = list("neutral") return TRUE -//this is a mob verb instead of atom for performance reasons -//see /mob/verb/examinate() in mob.dm for more info -//overridden here and in /mob/living for different point span classes and sanity checks -/mob/dead/observer/pointed(atom/A as mob|obj|turf in view(client.view, src)) +/mob/dead/observer/_pointed(atom/pointed_at) if(!..()) return FALSE - usr.visible_message(span_deadsay("[src] points to [A].")) - return TRUE + + usr.visible_message(span_deadsay("[src] points to [pointed_at].")) /mob/dead/observer/verb/view_manifest() set name = "View Crew Manifest" set category = "Ghost" - if(!client) - return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) + show_crew_manifest(src) //this is called when a ghost is drag clicked to something. /mob/dead/observer/MouseDrop(atom/over) @@ -615,12 +644,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/show_data_huds() for(var/hudtype in datahuds) var/datum/atom_hud/H = GLOB.huds[hudtype] - H.add_hud_to(src) + H.show_to(src) /mob/dead/observer/proc/remove_data_huds() for(var/hudtype in datahuds) var/datum/atom_hud/H = GLOB.huds[hudtype] - H.remove_hud_from(src) + H.hide_from(src) /mob/dead/observer/verb/toggle_data_huds() set name = "Toggle Sec/Med/Diag HUD" @@ -702,7 +731,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp overlays = to_copy.overlays alpha = 127 -/mob/dead/observer/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) +/mob/dead/observer/canUseTopic(atom/movable/target, flags) return isAdminGhostAI(usr) /mob/dead/observer/is_literate() @@ -723,26 +752,43 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp remove_verb(src, /mob/dead/observer/verb/possess) /mob/dead/observer/reset_perspective(atom/A) - if(client) - if(ismob(client.eye) && (client.eye != src)) - cleanup_observe() + if(client && observetarget) + stop_observing() + return + if(..()) if(hud_used) client.screen = list() hud_used.show_hud(hud_used.hud_version) -/mob/dead/observer/proc/cleanup_observe() +/mob/dead/observer/proc/stop_observing() if(isnull(observetarget)) return + + if(!QDELETED(src)) + if(QDELETED(observetarget)) + var/obj/effect/landmark/observer_start/O = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list + if (O) + forceMove(O.loc) + else + abstract_move(get_turf(observetarget)) + var/mob/target = observetarget observetarget = null + reset_perspective(null) // Comes after nulling, otherwise it would cause an infinite loop + client?.perspective = initial(client.perspective) sight = initial(sight) + see_invisible = initial(see_invisible) + if(target) - UnregisterSignal(target, COMSIG_MOVABLE_Z_CHANGED) + hide_other_mob_action_buttons(target) + UnregisterSignal(target, COMSIG_MOB_UPDATE_SIGHT) LAZYREMOVE(target.observers, src) + client?.update_ambience_pref() + /mob/dead/observer/verb/observe() set name = "Observe" set category = "Ghost" @@ -750,9 +796,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(!isobserver(usr)) //Make sure they're an observer! return + var/was_observing = observetarget reset_perspective(null) + if(was_observing) + return - var/list/possible_destinations = SSpoints_of_interest.get_mob_pois() + var/list/possible_destinations = SSpoints_of_interest.get_mob_pois(cliented_mobs_only = TRUE) var/target = null target = tgui_input_list(usr, "Please, select a player!", "Jump to Mob", possible_destinations) @@ -761,40 +810,52 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (!isobserver(usr)) return + if(target == usr) + return + var/mob/chosen_target = possible_destinations[target] // During the break between opening the input menu and selecting our target, has this become an invalid option? if(!SSpoints_of_interest.is_valid_poi(chosen_target)) return - do_observe(chosen_target) + if(!client || client.restricted_mode) + ManualFollow(chosen_target) + else + do_observe(chosen_target) /mob/dead/observer/proc/do_observe(mob/mob_eye) + //Istype so we filter out points of interest that are not mobs + if(!client || !istype(mob_eye) || mob_eye == src) + return + if(isnewplayer(mob_eye)) stack_trace("/mob/dead/new_player: \[[mob_eye]\] is being observed by [key_name(src)]. This should never happen and has been blocked.") message_admins("[ADMIN_LOOKUPFLW(src)] attempted to observe someone in the lobby: [ADMIN_LOOKUPFLW(mob_eye)]. This should not be possible and has been blocked.") return - //Istype so we filter out points of interest that are not mobs - if(client && mob_eye && istype(mob_eye)) - client.eye = mob_eye - client.perspective = EYE_PERSPECTIVE - if(is_secret_level(mob_eye.z) && !client?.holder) - sight = null //we dont want ghosts to see through walls in secret areas - RegisterSignal(mob_eye, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(on_observing_z_changed)) - if(mob_eye.hud_used) - client.screen = list() - LAZYOR(mob_eye.observers, src) - mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src) - observetarget = mob_eye + orbit(mob_eye) -/mob/dead/observer/proc/on_observing_z_changed(datum/source, turf/old_turf, turf/new_turf) + client.eye = mob_eye + client.perspective = EYE_PERSPECTIVE + sight = mob_eye.sight + see_invisible = mob_eye.see_invisible + + if(mob_eye.hud_used) + client.screen = list() + LAZYOR(mob_eye.observers, src) + mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src) + observetarget = mob_eye + + RegisterSignal(mob_eye, COMSIG_MOB_UPDATE_SIGHT, PROC_REF(on_observing_sight_changed)) + + SSambience.remove_ambience_client(client) + moveToNullspace() + +/mob/dead/observer/proc/on_observing_sight_changed(datum/source) SIGNAL_HANDLER - if(is_secret_level(new_turf.z) && !client?.holder) - sight = null //we dont want ghosts to see through walls in secret areas - else - sight = initial(sight) + sight = observetarget.sight /mob/dead/observer/verb/register_pai_candidate() set category = "Ghost" @@ -922,4 +983,4 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return GLOB.ghost_lighting_options[prefs.read_preference(/datum/preference/choiced/ghost_lighting)] /mob/dead/observer/hear_location() - return orbit_target || ..() + return observetarget || orbit_target || ..() diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm index 9e156913a98a..138f33d0f2d7 100644 --- a/code/modules/mob/dead/observer/observer_movement.dm +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -2,10 +2,10 @@ set name = "Move Upwards" set category = "IC" - if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) + if(zstep(src, UP, ZMOVE_FEEDBACK)) to_chat(src, "You move upwards.") -/mob/dead/observer/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) +/mob/dead/observer/can_z_move(direction, turf/start, z_move_flags = NONE, mob/living/rider) z_move_flags |= ZMOVE_IGNORE_OBSTACLES //observers do not respect these FLOORS you speak so much of. return ..() diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index 1c9c1722bd6d..b390cbe6da45 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -9,7 +9,7 @@ mods[RADIO_EXTENSION] = GLOB.department_radio_keys[mods[RADIO_KEY]] return message -/mob/dead/observer/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/dead/observer/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) message = trim(message) //trim now and sanitize after checking for special admin radio keys var/list/filter_result = CAN_BYPASS_FILTER(src) ? null : is_ooc_filtered(message) @@ -47,7 +47,7 @@ . = say_dead(message) -/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/dead/observer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() var/atom/movable/to_follow = speaker if(radio_freq) @@ -58,12 +58,17 @@ to_follow = S.eyeobj else to_follow = V.source + var/link = FOLLOW_LINK(src, to_follow) + + var/translated_message = translate_speech(speaker, message_language, raw_message, spans, message_mods) + // Create map text prior to modifying message for goonchat if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) - create_chat_message(speaker, message_language, raw_message, spans, sound_loc = sound_loc) + create_chat_message(speaker, message_language, translated_message, spans, sound_loc = sound_loc) + // Recompose the message, because it's scrambled by default - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) + message = compose_message(speaker, message_language, translated_message, radio_freq, spans, message_mods) to_chat(src, html = "[link] [message]", avoid_highlighting = speaker == src) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 2c233539eeba..a08904286e84 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -47,6 +47,12 @@ return has_hand_for_held_index(active_hand_index) +/// Returns the first available empty held index +/mob/proc/get_empty_held_index() + for(var/i in 1 to length(held_items)) + if(isnull(held_items[i])) + return i + //Finds the first available (null) index OR all available (null) indexes in held_items based on a side. //Lefts: 1, 3, 5, 7... //Rights:2, 4, 6, 8... @@ -98,9 +104,8 @@ //Checks if we're holding an item of type: typepath /mob/proc/is_holding_item_of_type(typepath) - if(locate(typepath) in held_items) - return TRUE - return FALSE + return locate(typepath) in held_items + //Checks if we're holding a tool that has given quality //Returns the tool that has the best version of this quality @@ -138,37 +143,70 @@ //Returns if a certain item can be equipped to a certain slot. -// Currently invalid for two-handed items - call obj/item/mob_can_equip() instead. /mob/proc/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) return FALSE -/mob/proc/can_put_in_hand(I, hand_index) - if(hand_index > held_items.len) - return FALSE - if(!put_in_hand_check(I)) - return FALSE - if(!has_hand_for_held_index(hand_index)) - return FALSE - return !held_items[hand_index] +/mob/proc/can_put_in_hand(obj/item/I, hand_index) + return FALSE + +/// A helper for picking up an item. +/mob/proc/pickup_item(obj/item/I, hand_index = active_hand_index, ignore_anim = FALSE) + if(QDELETED(I)) + return + + if(!can_put_in_hand(I, hand_index)) + return + + //If the item is in a storage item, take it out + var/was_in_storage = I.item_flags & IN_STORAGE + if(was_in_storage && !I.loc.atom_storage?.attempt_remove(I, src, user = src)) + return + + if(QDELETED(src)) //moving it out of the storage destroyed it. + return + + if(I.throwing) + I.throwing.finalize(FALSE) + + if(I.loc == src) + if(!I.allow_attack_hand_drop(src) || !temporarilyRemoveItemFromInventory(I)) + return + + I.pickup(src) + . = put_in_hand(I, hand_index, ignore_anim = ignore_anim || was_in_storage) + + if(!.) + stack_trace("Somehow, someway, pickup_item failed put_in_hand().") + dropItemToGround(I, silent = TRUE) /mob/proc/put_in_hand(obj/item/I, hand_index, forced = FALSE, ignore_anim = TRUE) - if(hand_index == null || (!forced && !can_put_in_hand(I, hand_index))) + if(hand_index == null) + return FALSE + + if(!forced && !can_put_in_hand(I, hand_index)) return FALSE if(isturf(I.loc) && !ignore_anim) I.do_pickup_animation(src) + if(get_item_for_held_index(hand_index)) dropItemToGround(get_item_for_held_index(hand_index), force = TRUE) + I.forceMove(src) held_items[hand_index] = I I.plane = ABOVE_HUD_PLANE I.equipped(src, ITEM_SLOT_HANDS) + if(QDELETED(I)) // this is here because some ABSTRACT items like slappers and circle hands could be moved from hand to hand then delete, which meant you'd have a null in your hand until you cleared it (say, by dropping it) held_items[hand_index] = null return FALSE - if(I.pulledby) - I.pulledby.stop_pulling() + + if(LAZYLEN(I.grabbed_by)) + I.free_from_all_grabs() + update_held_items() + if(hand_index == active_hand_index) + update_mouse_pointer() I.pixel_x = I.base_pixel_x I.pixel_y = I.base_pixel_y return hand_index @@ -181,14 +219,30 @@ /mob/proc/put_in_r_hand(obj/item/I) return put_in_hand(I, get_empty_held_index_for_side(RIGHT_HANDS)) -/mob/proc/put_in_hand_check(obj/item/I) - return FALSE //nonliving mobs don't have hands +/mob/living/can_put_in_hand(obj/item/I, hand_index) + if(!istype(I)) + return FALSE -/mob/living/put_in_hand_check(obj/item/I) - if(istype(I) && ((mobility_flags & MOBILITY_PICKUP) || (I.item_flags & ABSTRACT)) \ - && !(SEND_SIGNAL(src, COMSIG_LIVING_TRY_PUT_IN_HAND, I) & COMPONENT_LIVING_CANT_PUT_IN_HAND)) - return TRUE - return FALSE + if(hand_index > held_items.len) + return FALSE + + if(!((mobility_flags & MOBILITY_PICKUP) || (I.item_flags & ABSTRACT))) + return FALSE + + if(SEND_SIGNAL(src, COMSIG_LIVING_TRY_PUT_IN_HAND, I) & COMPONENT_LIVING_CANT_PUT_IN_HAND) + return FALSE + + if(!has_hand_for_held_index(hand_index)) + return FALSE + + return !held_items[hand_index] + +/mob/living/carbon/human/can_put_in_hand(obj/item/I, hand_index) + . = ..() + if(!.) + return + + return dna.species.can_equip(I, ITEM_SLOT_HANDS, TRUE, src) //Puts the item into our active hand if possible. returns TRUE on success. /mob/proc/put_in_active_hand(obj/item/I, forced = FALSE, ignore_animation = TRUE) @@ -250,73 +304,102 @@ for(var/obj/item/I in held_items) . |= dropItemToGround(I) -//Here lie drop_from_inventory and before_item_take, already forgotten and not missed. - -/mob/proc/canUnEquip(obj/item/I, force) - if(!I) - return TRUE - if(HAS_TRAIT(I, TRAIT_NODROP) && !force) - return FALSE - return TRUE - /mob/proc/putItemFromInventoryInHandIfPossible(obj/item/I, hand_index, force_removal = FALSE) if(!can_put_in_hand(I, hand_index)) return FALSE if(!temporarilyRemoveItemFromInventory(I, force_removal)) return FALSE I.remove_item_from_storage(src) - if(!put_in_hand(I, hand_index)) + if(!pickup_item(I, hand_index, ignore_anim = TRUE)) qdel(I) CRASH("Assertion failure: putItemFromInventoryInHandIfPossible") //should never be possible return TRUE +/// Switches the items inside of two hand indexes. +/mob/proc/swapHeldIndexes(index_A, index_B) + if(index_A == index_B) + return + var/obj/item/item_A = get_item_for_held_index(index_A) + var/obj/item/item_B = get_item_for_held_index(index_B) + + var/failed_uh_oh_abort = FALSE + if(!(item_A || item_B)) + return + if(item_A && !temporarilyRemoveItemFromInventory(item_A)) + failed_uh_oh_abort = TRUE + if(item_B && !temporarilyRemoveItemFromInventory(item_B)) + failed_uh_oh_abort = TRUE + + if((item_A && !put_in_hand(item_A, index_B)) || (item_B && !put_in_hand(item_B, index_A))) + failed_uh_oh_abort = TRUE + + if(failed_uh_oh_abort) + if(item_A) + temporarilyRemoveItemFromInventory(item_A) + if(item_B) + temporarilyRemoveItemFromInventory(item_B) + if(item_A) + put_in_hand(item_A, index_A) + if(item_B) + put_in_hand(item_B, index_B) + return FALSE + return TRUE + //The following functions are the same save for one small difference /** * Used to drop an item (if it exists) to the ground. * * Will pass as TRUE is successfully dropped, or if there is no item to drop. - * * Will pass FALSE if the item can not be dropped due to TRAIT_NODROP via doUnEquip() + * * Will pass FALSE if the item can not be dropped due to TRAIT_NODROP via tryUnequipItem() * If the item can be dropped, it will be forceMove()'d to the ground and the turf's Entered() will be called. */ -/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE, invdrop = TRUE) - . = doUnEquip(I, force, drop_location(), FALSE, invdrop = invdrop, silent = silent) +/mob/proc/dropItemToGround(obj/item/I, force = FALSE, silent = FALSE, invdrop = TRUE, animate = TRUE) + . = tryUnequipItem(I, force, drop_location(), FALSE, invdrop = invdrop, silent = silent) if(!. || !I) //ensure the item exists and that it was dropped properly. return + if(!(I.item_flags & NO_PIXEL_RANDOM_DROP)) I.pixel_x = I.base_pixel_x + rand(-6, 6) I.pixel_y = I.base_pixel_y + rand(-6, 6) - I.do_drop_animation(src) + + if(animate) + I.do_drop_animation(src) //for when the item will be immediately placed in a loc other than the ground. Supports shifting the item's x and y from click modifiers. -/mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE, silent = TRUE, list/user_click_modifiers) - . = doUnEquip(I, force, newloc, FALSE, silent = silent) - if(. && user_click_modifiers) +/mob/proc/transferItemToLoc(obj/item/I, newloc = null, force = FALSE, silent = TRUE, list/user_click_modifiers, animate = TRUE) + . = tryUnequipItem(I, force, newloc, FALSE, silent = silent) + if(!.) + return + + if(user_click_modifiers) //Center the icon where the user clicked. if(!LAZYACCESS(user_click_modifiers, ICON_X) || !LAZYACCESS(user_click_modifiers, ICON_Y)) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the location) I.pixel_x = clamp(text2num(LAZYACCESS(user_click_modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = clamp(text2num(LAZYACCESS(user_click_modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) - I.do_drop_animation(src) + + if(animate) + I.do_drop_animation(src) //visibly unequips I but it is NOT MOVED AND REMAINS IN SRC //item MUST BE FORCEMOVE'D OR QDEL'D /mob/proc/temporarilyRemoveItemFromInventory(obj/item/I, force = FALSE, idrop = TRUE) - if(I.item_flags & ABSTRACT) + if((I.item_flags & ABSTRACT) && !force) return //Do nothing. Abstract items shouldn't end up in inventories and doing this triggers various odd side effects. - return doUnEquip(I, force, null, TRUE, idrop, silent = TRUE) + return tryUnequipItem(I, force, null, TRUE, idrop, silent = TRUE) //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, silent = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. +/mob/proc/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = 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 PROTECTED_PROC(TRUE) if(!I) //If there's nothing to drop, the drop is automatically succesfull. If(unEquip) should generally be used to check for TRAIT_NODROP. return TRUE - if(HAS_TRAIT(I, TRAIT_NODROP) && !force) + if(!force && !canUnequipItem(I, newloc, no_move, invdrop, silent)) return FALSE if((SEND_SIGNAL(I, COMSIG_ITEM_PRE_UNEQUIP, force, newloc, no_move, invdrop, silent) & COMPONENT_ITEM_BLOCK_UNEQUIP) && !force) @@ -326,30 +409,47 @@ if(hand_index) held_items[hand_index] = null update_held_items() + if(I) if(client) client.screen -= I + I.layer = initial(I.layer) I.plane = initial(I.plane) I.appearance_flags &= ~NO_CLIENT_COLOR + if(!no_move && !(I.item_flags & DROPDEL)) //item may be moved/qdel'd immedietely, don't bother moving it if (isnull(newloc)) I.moveToNullspace() else I.forceMove(newloc) + I.dropped(src, silent) + SEND_SIGNAL(I, COMSIG_ITEM_POST_UNEQUIP, force, newloc, no_move, invdrop, silent) SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent) return TRUE +/// Test if an item can be dropped, core to tryUnequipItem() +/mob/proc/canUnequipItem(obj/item/I, newloc, no_move, invdrop, silent) + if(isnull(I)) + return TRUE + + if(HAS_TRAIT(I, TRAIT_NODROP)) + return FALSE + + return TRUE + /** * Used to return a list of equipped items on a mob; does not include held items (use get_all_gear) * * Argument(s): * * Optional - include_pockets (TRUE/FALSE), whether or not to include the pockets and suit storage in the returned list */ +/mob/proc/get_equipped_items(include_pockets = FALSE) + return -/mob/living/proc/get_equipped_items(include_pockets = FALSE) +/mob/living/get_equipped_items(include_pockets = FALSE) var/list/items = list() for(var/obj/item/item_contents in contents) if(item_contents.item_flags & IN_INVENTORY) @@ -379,21 +479,32 @@ items -= list(l_store, r_store, s_store) return items +/// Drop all items to the floor. /mob/living/proc/unequip_everything() - var/list/items = list() - items |= get_equipped_items(TRUE) - for(var/I in items) + for(var/I in get_equipped_items(TRUE)) dropItemToGround(I) drop_all_held_items() +/// Delete all held/equipped items. +/mob/living/proc/wipe_inventory() + for(var/I in get_equipped_items(TRUE) | held_items) + qdel(I) + +/// Compiles all flags_inv vars of worn items. +/mob/living/carbon/proc/update_obscurity() + PROTECTED_PROC(TRUE) + + obscured_slots = NONE + for(var/obj/item/I in get_all_worn_items()) + obscured_slots |= I.flags_inv + ///Returns a bitfield of covered item slots. -/mob/living/carbon/proc/check_obscured_slots(transparent_protection) +/mob/living/carbon/proc/check_obscured_slots(transparent_protection, input_slots) var/obscured = NONE - var/hidden_slots = NONE + var/hidden_slots = !isnull(input_slots) ? input_slots : src.obscured_slots - for(var/obj/item/I in get_all_worn_items()) //This contains nulls - hidden_slots |= I.flags_inv - if(transparent_protection) + if(transparent_protection) + for(var/obj/item/I in get_all_worn_items()) hidden_slots |= I.transparent_protection if(hidden_slots & HIDENECK) @@ -444,6 +555,10 @@ set name = "quick-equip" set hidden = TRUE + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_quick_equip))) + +///proc extender of [/mob/verb/quick_equip] used to make the verb queuable if the server is overloaded +/mob/proc/execute_quick_equip() var/obj/item/I = get_active_held_item() if(!I) to_chat(src, span_warning("You are not holding anything to equip!")) diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 509e2769d8a2..1b43b32bec17 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -16,7 +16,7 @@ ///how much damage this basic mob does to objects, if any. var/obj_damage = 0 ///How much armour they ignore, as a flat reduction from the targets armour value. - var/armour_penetration = 0 + var/armor_penetration = 0 ///Damage type of a simple mob's melee attack, should it do damage. var/melee_damage_type = BRUTE ///If the attacks from this are sharp @@ -84,7 +84,7 @@ gender = pick(MALE,FEMALE) if(!real_name) - real_name = name + set_real_name(name) if(!loc) stack_trace("Basic mob being instantiated in nullspace") @@ -131,7 +131,7 @@ /mob/living/basic/proc/update_basic_mob_varspeed() if(speed == 0) remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, slowdown = speed) SEND_SIGNAL(src, POST_BASIC_MOB_UPDATE_VARSPEED) /mob/living/basic/relaymove(mob/living/user, direction) diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm index 4dc3f796a1e5..2cb5d51429de 100644 --- a/code/modules/mob/living/basic/basic_defense.dm +++ b/code/modules/mob/living/basic/basic_defense.dm @@ -119,7 +119,7 @@ return return ..() -/mob/living/basic/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE, actuallydamage = TRUE) +/mob/living/basic/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = BLUNT, actuallydamage = TRUE) var/temp_damage = damage if(!damage_coeff[damagetype]) temp_damage = 0 @@ -180,11 +180,13 @@ /mob/living/basic/update_stat() if(status_flags & GODMODE) return + if(stat != DEAD) if(health <= 0) death() else set_stat(CONSCIOUS) + med_hud_set_status() /mob/living/basic/emp_act(severity) diff --git a/code/modules/mob/living/basic/farm_animals/cows.dm b/code/modules/mob/living/basic/farm_animals/cows.dm index 78826a3f49b9..4740bf8d5516 100644 --- a/code/modules/mob/living/basic/farm_animals/cows.dm +++ b/code/modules/mob/living/basic/farm_animals/cows.dm @@ -21,7 +21,7 @@ response_harm_simple = "kick" attack_verb_continuous = "kicks" attack_verb_simple = "kick" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH attack_vis_effect = ATTACK_EFFECT_KICK health = 50 maxHealth = 50 @@ -36,7 +36,6 @@ self_right_time = rand(25 SECONDS, 50 SECONDS), \ post_tipped_callback = CALLBACK(src, PROC_REF(after_cow_tipped))) AddElement(/datum/element/pet_bonus, "moos happily!") - AddElement(/datum/element/swabable, CELL_LINE_TABLE_COW, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) udder_component() make_tameable() . = ..() @@ -136,7 +135,6 @@ /mob/living/basic/cow/moonicorn/Initialize(mapload) . = ..() - AddElement(/datum/element/venomous, /datum/reagent/pax, 5) AddElement(/datum/element/movement_turf_changer, /turf/open/floor/grass/fairy) /mob/living/basic/cow/moonicorn/udder_component() diff --git a/code/modules/mob/living/basic/health_adjustment.dm b/code/modules/mob/living/basic/health_adjustment.dm index cb4b8bbb2710..beaece806cdf 100644 --- a/code/modules/mob/living/basic/health_adjustment.dm +++ b/code/modules/mob/living/basic/health_adjustment.dm @@ -9,7 +9,7 @@ /mob/living/basic/proc/adjust_health(amount, updating_health = TRUE, forced = FALSE) . = FALSE if(forced || !(status_flags & GODMODE)) - bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth), DAMAGE_PRECISION) if(updating_health) updatehealth() . = amount diff --git a/code/modules/mob/living/basic/ruin_defender/stickman.dm b/code/modules/mob/living/basic/ruin_defender/stickman.dm deleted file mode 100644 index 1a2bdd61f9b8..000000000000 --- a/code/modules/mob/living/basic/ruin_defender/stickman.dm +++ /dev/null @@ -1,87 +0,0 @@ -/mob/living/basic/stickman - name = "Angry Stick Man" - desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you." - icon_state = "stickman" - icon_living = "stickman" - icon_dead = "stickman_dead" - mob_biotypes = MOB_HUMANOID - gender = MALE - health = 100 - maxHealth = 100 - speed = 0.5 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_sound = 'sound/weapons/punch1.ogg' - combat_mode = TRUE - faction = list("stickman") - - ai_controller = /datum/ai_controller/basic_controller/stickman - -/mob/living/basic/stickman/Initialize(mapload) - . = ..() - new /obj/effect/temp_visual/paper_scatter(get_turf(src)) - AddElement(/datum/element/basic_body_temp_sensitive, cold_damage = 7.5, heat_damage = 7.5) - AddElement(/datum/element/atmos_requirements, list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0), 7.5) - -/datum/ai_controller/basic_controller/stickman - blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic() - ) - - ai_movement = /datum/ai_movement/basic_avoidance - idle_behavior = /datum/idle_behavior/idle_random_walk - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_melee_attack_subtree/stickman - ) - -/datum/ai_planning_subtree/basic_melee_attack_subtree/stickman - melee_attack_behavior = /datum/ai_behavior/basic_melee_attack/stickman - -/datum/ai_behavior/basic_melee_attack/stickman - action_cooldown = 1.5 SECONDS - -/mob/living/basic/stickman/dog - name = "Angry Stick Dog" - desc = "Stickman's best friend, if he could see him at least." - icon_state = "stickdog" - icon_living = "stickdog" - icon_dead = "stickdog_dead" - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_vis_effect = ATTACK_EFFECT_BITE - sharpness = SHARP_POINTY - mob_biotypes = MOB_BEAST - attack_sound = 'sound/weapons/bite.ogg' - -/mob/living/basic/stickman/ranged - name = "Angry Stick Gunman" - desc = "How do 2 dimensional guns even work??" - icon_state = "stickmanranged" - icon_living = "stickmanranged" - attack_verb_continuous = "whacks" - attack_verb_simple = "whack" - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_sound = 'sound/weapons/genhit1.ogg' - - ai_controller = /datum/ai_controller/basic_controller/stickman/ranged - -/mob/living/basic/stickman/ranged/Initialize(mapload) - . = ..() - AddElement(/datum/element/death_drops, list(/obj/item/gun/ballistic/automatic/pistol/stickman)) - AddElement(/datum/element/ranged_attacks, /obj/item/ammo_casing/c9mm, 'sound/misc/bang.ogg') - -/datum/ai_controller/basic_controller/stickman/ranged - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/basic_ranged_attack_subtree/stickman - ) - -/datum/ai_planning_subtree/basic_ranged_attack_subtree/stickman - ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/stickman - -/datum/ai_behavior/basic_ranged_attack/stickman - action_cooldown = 5 SECONDS diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 74e1147d59ca..3ba46312b6ba 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -32,7 +32,6 @@ /mob/living/basic/cockroach/Initialize(mapload) . = ..() AddElement(/datum/element/death_drops, list(/obj/effect/decal/cleanable/insectguts)) - AddElement(/datum/element/swabable, cockroach_cell_line, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7) AddElement(/datum/element/basic_body_temp_sensitive, 270, INFINITY) AddComponent(/datum/component/squashable, squash_chance = 50, squash_damage = 1) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 96446ae7a6ba..22e1319660a1 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -4,6 +4,20 @@ BLOOD SYSTEM ****************************************************/ +/// Adjusts blood volume, returning the difference. +/mob/living/proc/adjustBloodVolume(adj) + var/old_blood_volume = blood_volume + blood_volume = clamp(blood_volume + adj, 0, BLOOD_VOLUME_ABSOLUTE_MAX) + return old_blood_volume - blood_volume + +/mob/living/proc/adjustBloodVolumeUpTo(adj, max) + if(blood_volume >= max) + return 0 + return adjustBloodVolume(min(max-blood_volume, adj)) + +/mob/living/proc/setBloodVolume(amt) + return adjustBloodVolume(amt - blood_volume) + // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood(delta_time, times_fired) @@ -13,72 +27,67 @@ if(bodytemperature < TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. return - //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) - var/nutrition_ratio = 0 - switch(nutrition) - if(0 to NUTRITION_LEVEL_STARVING) - nutrition_ratio = 0.2 - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - nutrition_ratio = 0.4 - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - nutrition_ratio = 0.6 - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - nutrition_ratio = 0.8 - else - nutrition_ratio = 1 - if(satiety > 80) - nutrition_ratio *= 1.25 - adjust_nutrition(-nutrition_ratio * HUNGER_DECAY * delta_time) - blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * nutrition_ratio * delta_time), BLOOD_VOLUME_NORMAL) - - //Effects of bloodloss - var/word = pick("dizzy","woozy","faint") - switch(blood_volume) - if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL) - if(DT_PROB(7.5, delta_time)) - to_chat(src, span_userdanger("Blood starts to tear your skin apart. You're going to burst!")) - inflate_gib() - if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) - if(DT_PROB(5, delta_time)) - to_chat(src, span_warning("You feel terribly bloated.")) - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) - if(DT_PROB(2.5, delta_time)) - to_chat(src, span_warning("You feel [word].")) - adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1)) - if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1)) - if(DT_PROB(2.5, delta_time)) - blur_eyes(6) - to_chat(src, span_warning("You feel very [word].")) - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - adjustOxyLoss(2.5 * delta_time) - if(DT_PROB(7.5, delta_time)) - Unconscious(rand(20,60)) - to_chat(src, span_warning("You feel extremely [word].")) - if(-INFINITY to BLOOD_VOLUME_SURVIVE) - if(!HAS_TRAIT(src, TRAIT_NODEATH)) - death() + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(!heart || (heart.pulse == PULSE_NONE && !(heart.organ_flags & ORGAN_SYNTHETIC))) + return + + var/pulse_mod = 1 + switch(heart.pulse) + if(PULSE_SLOW) + pulse_mod = 0.8 + if(PULSE_FAST) + pulse_mod = 1.25 + if(PULSE_2FAST, PULSE_THREADY) + pulse_mod = 1.5 var/temp_bleed = 0 + var/list/obj/item/bodypart/spray_candidates //Bleeding out for(var/obj/item/bodypart/iter_part as anything in bodyparts) - var/iter_bleed_rate = iter_part.get_modified_bleed_rate() - temp_bleed += iter_bleed_rate * delta_time + var/needs_bleed_update = FALSE + var/iter_bleed_rate = iter_part.get_modified_bleed_rate() * pulse_mod + var/bleed_amt = iter_part.bandage?.absorb_blood(iter_bleed_rate, src) + + if(isnull(bleed_amt)) + bleed_amt = iter_bleed_rate + if(iter_part.bodypart_flags & BP_HAS_BLOOD) + if(bleed_amt > 3 && (iter_part.bodypart_flags & BP_ARTERY_CUT)) + LAZYADD(spray_candidates, iter_part) + for(var/datum/wound/W as anything in iter_part.wounds) - if(W.bleeding()) + if(W.bleeding() && W.bleed_timer > 0) W.bleed_timer-- + if(!W.bleeding()) + needs_bleed_update = TRUE + + if(needs_bleed_update) + iter_part.refresh_bleed_rate() + if(!bleed_amt) + continue + + temp_bleed += bleed_amt if(iter_part.generic_bleedstacks) // If you don't have any bleedstacks, don't try and heal them iter_part.adjustBleedStacks(-1, 0) + var/bled if(temp_bleed) - bleed(temp_bleed) + bled = bleed(temp_bleed) bleed_warn(temp_bleed) + if(bled && COOLDOWN_FINISHED(src, blood_spray_cd) && LAZYLEN(spray_candidates)) + var/obj/item/bodypart/spray_part = pick(spray_candidates) + spray_blood(pick(GLOB.alldirs)) + visible_message( + span_danger("Blood sprays out from \the [src]'s [spray_part.plaintext_zone]!"), + span_userdanger("Blood sprays out from your [spray_part.plaintext_zone]!"), + ) + COOLDOWN_START(src, blood_spray_cd, 8 SECONDS) + + /// Has each bodypart update its bleed/wound overlay icon states /mob/living/carbon/proc/update_bodypart_bleed_overlays() for(var/obj/item/bodypart/iter_part as anything in bodyparts) @@ -88,25 +97,45 @@ /mob/living/carbon/proc/bleed(amt) if(!blood_volume) return - blood_volume = max(blood_volume - amt, 0) + + . = adjustBloodVolume(-amt) //Blood loss still happens in locker, floor stays clean if(isturf(loc) && prob(sqrt(amt)*BLOOD_DRIP_RATE_MOD)) - add_splatter_floor(loc, (amt >= 10)) + add_splatter_floor(loc, (amt <= 10)) /mob/living/carbon/human/bleed(amt) + if(NOBLOOD in dna.species.species_traits) + return amt *= physiology.bleed_mod - if(!(NOBLOOD in dna.species.species_traits)) - ..() + . = ..() /// A helper to see how much blood we're losing per tick /mob/living/carbon/proc/get_bleed_rate() - if(!blood_volume) - return + if(NOBLOOD in dna.species.species_traits || HAS_TRAIT(src, TRAIT_NOBLEED) || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + return 0 + + if(bodytemperature < TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) + return 0 + + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(!heart || (heart.pulse == PULSE_NONE && !(heart.organ_flags & ORGAN_SYNTHETIC))) + return 0 + var/bleed_amt = 0 for(var/obj/item/bodypart/iter_bodypart as anything in bodyparts) bleed_amt += iter_bodypart.get_modified_bleed_rate() - return bleed_amt + + var/pulse_mod = 1 + switch(heart.pulse) + if(PULSE_SLOW) + pulse_mod = 0.8 + if(PULSE_FAST) + pulse_mod = 1.25 + if(PULSE_2FAST, PULSE_THREADY) + pulse_mod = 1.5 + + return bleed_amt * pulse_mod /mob/living/carbon/human/get_bleed_rate() if((NOBLOOD in dna.species.species_traits)) @@ -122,8 +151,9 @@ * * forced- */ /mob/living/carbon/proc/bleed_warn(bleed_amt = 0, forced = FALSE) - if(!blood_volume || !client) + if(!blood_volume || !client || stat != CONSCIOUS) return + if(!COOLDOWN_FINISHED(src, bleeding_message_cd) && !forced) return @@ -154,7 +184,7 @@ if(HAS_TRAIT(src, TRAIT_COAGULATING)) // if we have coagulant, we're getting better quick rate_of_change = ", but it's clotting up quickly!" - + to_chat(src, span_warning("[bleeding_severity][rate_of_change || "."]")) COOLDOWN_START(src, bleeding_message_cd, next_cooldown) @@ -163,12 +193,11 @@ return ..() /mob/living/proc/restore_blood() - blood_volume = initial(blood_volume) + setBloodVolume(initial(blood_volume)) /mob/living/carbon/restore_blood() - blood_volume = BLOOD_VOLUME_NORMAL - for(var/i in bodyparts) - var/obj/item/bodypart/BP = i + setBloodVolume(BLOOD_VOLUME_NORMAL) + for(var/obj/item/bodypart/BP as anything in bodyparts) BP.setBleedStacks(0) /**************************************************** @@ -203,11 +232,11 @@ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) - if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) + if(!C.dna.blood_type.is_compatible(blood_data["blood_type"]:type)) C.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) return TRUE - C.blood_volume = min(C.blood_volume + round(amount, 0.1), BLOOD_VOLUME_MAX_LETHAL) + C.adjustBloodVolumeUpTo(0.1) return TRUE AM.reagents.add_reagent(blood_id, amount, blood_data, bodytemperature) @@ -275,65 +304,27 @@ return return /datum/reagent/blood -// This is has more potential uses, and is probably faster than the old proc. -/proc/get_safe_blood(bloodtype) - . = list() - if(!bloodtype) - return - - var/static/list/bloodtypes_safe = list( - "A-" = list("A-", "O-"), - "A+" = list("A-", "A+", "O-", "O+"), - "B-" = list("B-", "O-"), - "B+" = list("B-", "B+", "O-", "O+"), - "AB-" = list("A-", "B-", "O-", "AB-"), - "AB+" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+"), - "O-" = list("O-"), - "O+" = list("O-", "O+"), - "L" = list("L"), - "U" = list("A-", "A+", "B-", "B+", "O-", "O+", "AB-", "AB+", "L", "U"), - "S" = list("S") - ) - - var/safe = bloodtypes_safe[bloodtype] - if(safe) - . = safe - //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) if(get_blood_id() != /datum/reagent/blood) return + if(!T) T = get_turf(src) - var/list/temp_blood_DNA if(small_drip) - // Only a certain number of drips (or one large splatter) can be on a given turf. - var/obj/effect/decal/cleanable/blood/drip/drop = locate() in T - if(drop) - if(drop.drips < 5) - drop.drips++ - drop.add_overlay(pick(drop.random_icon_states)) - drop.transfer_mob_blood_dna(src) - return - else - temp_blood_DNA = drop.return_blood_DNA() //we transfer the dna from the drip to the splatter - qdel(drop)//the drip is replaced by a bigger splatter - else - drop = new(T, get_static_viruses()) - drop.transfer_mob_blood_dna(src) - return + new /obj/effect/decal/cleanable/blood/drip(T, get_static_viruses(), get_blood_dna_list()) + return // Find a blood decal or create a new one. var/obj/effect/decal/cleanable/blood/B = locate() in T if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses()) + B = new /obj/effect/decal/cleanable/blood/splatter(T, get_static_viruses(), get_blood_dna_list()) + if(QDELETED(B)) //Give it up return + B.bloodiness = min((B.bloodiness + BLOOD_AMOUNT_PER_DECAL), BLOOD_POOL_MAX) - B.transfer_mob_blood_dna(src) //give blood info to the blood decal. - if(temp_blood_DNA) - B.add_blood_DNA(temp_blood_DNA) /mob/living/carbon/human/add_splatter_floor(turf/T, small_drip) if(!(NOBLOOD in dna.species.species_traits)) @@ -345,7 +336,7 @@ var/obj/effect/decal/cleanable/xenoblood/B = locate() in T.contents if(!B) B = new(T) - B.add_blood_DNA(list("UNKNOWN DNA" = "X*")) + B.add_blood_DNA(list("UNKNOWN DNA" = GET_BLOOD_REF(/datum/blood/xenomorph))) /mob/living/silicon/robot/add_splatter_floor(turf/T, small_drip) if(!T) @@ -353,3 +344,63 @@ var/obj/effect/decal/cleanable/oil/B = locate() in T.contents if(!B) B = new(T) + +//Percentage of maximum blood volume, affected by the condition of circulation organs +/mob/living/carbon/proc/get_blood_circulation() + var/blood_volume_percent = min(blood_volume / BLOOD_VOLUME_NORMAL, 1) * 100 + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(!heart) + return 0.25 * blood_volume_percent + + var/recent_pump = LAZYACCESS(heart.external_pump, 1) > world.time - (20 SECONDS) + var/pulse_mod = 1 + if((HAS_TRAIT(src, TRAIT_FAKEDEATH)) || (heart.organ_flags & ORGAN_SYNTHETIC)) + pulse_mod = 1 + else + switch(heart.pulse) + if(PULSE_NONE) + if(recent_pump) + pulse_mod = LAZYACCESS(heart.external_pump, 2) + else + pulse_mod *= 0.25 + if(PULSE_SLOW) + pulse_mod *= 0.9 + if(PULSE_FAST) + pulse_mod *= 1.1 + if(PULSE_2FAST, PULSE_THREADY) + pulse_mod *= 1.25 + + blood_volume_percent *= pulse_mod + + var/min_efficiency = recent_pump ? 0.5 : 0.3 + blood_volume_percent *= max(min_efficiency, (1-(heart.damage / heart.maxHealth))) + + var/blockage = CHEM_EFFECT_MAGNITUDE(src, CE_BLOCKAGE) + if(blockage) + blood_volume_percent *= max(0, 1-blockage) + + return round(min(blood_volume_percent, 100), 0.01) + +//Percentage of maximum blood volume, affected by the condition of circulation organs, affected by the oxygen loss. What ultimately matters for brain +/mob/living/carbon/proc/get_blood_oxygenation() + var/blood_volume_percent = get_blood_circulation() + if(!(NOBLOOD in dna.species.species_traits)) + if(undergoing_cardiac_arrest()) // Heart is missing or isn't beating and we're not breathing (hardcrit) + return min(blood_volume_percent, BLOOD_CIRC_SURVIVE) + + if(HAS_TRAIT(src, TRAIT_NOBREATH)) + return blood_volume_percent + else + blood_volume_percent = 100 + + var/blood_volume_mod = max(0, 1 - getOxyLoss()/ maxHealth) + var/oxygenated_mult = 0 + if(chem_effects[CE_OXYGENATED] == 1) // Dexalin. + oxygenated_mult = 0.5 + + else if(chem_effects[CE_OXYGENATED] >= 2) // Dexplus. + oxygenated_mult = 0.8 + + blood_volume_mod = blood_volume_mod + oxygenated_mult - (blood_volume_mod * oxygenated_mult) + blood_volume_percent *= blood_volume_mod + return round(min(blood_volume_percent, 100), 0.01) diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm index e7ed4be4ff5c..fbe3158c4fe8 100644 --- a/code/modules/mob/living/brain/MMI.dm +++ b/code/modules/mob/living/brain/MMI.dm @@ -5,15 +5,23 @@ icon_state = "mmi_off" base_icon_state = "mmi" w_class = WEIGHT_CLASS_NORMAL + var/braintype = "Cyborg" - var/obj/item/radio/radio = null //Let's give it a radio. - var/mob/living/brain/brainmob = null //The current occupant. - var/mob/living/silicon/robot = null //Appears unused. - var/obj/vehicle/sealed/mecha = null //This does not appear to be used outside of reference in mecha.dm. + + /// Internal radio object so the thing has a radio + var/obj/item/radio/radio = null + /// The current occupant. + var/mob/living/brain/brainmob = null + /// Reference to a mecha we may or may not be in. Only used for garbage collection. + var/obj/vehicle/sealed/mecha = null + /// The actual brain contained in the MMI var/obj/item/organ/brain/brain = null //The actual brain + var/datum/ai_laws/laws = new() + var/force_replace_ai_name = FALSE - var/overrides_aicore_laws = FALSE // Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. + /// Whether the laws on the MMI, if any, override possible pre-existing laws loaded on the AI core. + var/overrides_aicore_laws = FALSE /obj/item/mmi/Initialize(mapload) . = ..() @@ -66,17 +74,18 @@ return var/mob/living/brain/B = newbrain.brainmob if(!B.key) - B.notify_ghost_cloning("Someone has put your brain in a MMI!", source = src) + B.notify_ghost_revival("Someone has put your brain in a MMI!", source = src) user.visible_message(span_notice("[user] sticks \a [newbrain] into [src]."), span_notice("[src]'s indicator light turn on as you insert [newbrain].")) set_brainmob(newbrain.brainmob) newbrain.brainmob = null brainmob.forceMove(src) brainmob.container = src + var/fubar_brain = newbrain.suicided || brainmob.suiciding //brain is 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. + if(!fubar_brain && !(newbrain.organ_flags & ORGAN_DEAD)) // the brain organ hasn't been beaten to death, nor was from a suicider. brainmob.set_stat(CONSCIOUS) //we manually revive the brain mob - else if(!fubar_brain && newbrain.organ_flags & ORGAN_FAILING) // the brain is damaged, but not from a suicider + else if(!fubar_brain && newbrain.organ_flags & ORGAN_DEAD) // the brain is damaged, but not from a suicider to_chat(user, span_warning("[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) else @@ -126,18 +135,20 @@ if(Adjacent(user)) user.put_in_hands(brain) brain.organ_flags &= ~ORGAN_FROZEN + brain = null //No more brain in here /obj/item/mmi/proc/transfer_identity(mob/living/L) //Same deal as the regular brain proc. Used for human-->robot people. if(!brainmob) set_brainmob(new /mob/living/brain(src)) - brainmob.name = L.real_name - brainmob.real_name = L.real_name + brainmob.set_real_name(L.real_name) + brainmob.timeofdeath = L.timeofdeath if(L.has_dna()) var/mob/living/carbon/C = L if(!brainmob.stored_dna) brainmob.stored_dna = new /datum/dna/stored(brainmob) C.dna.copy_dna(brainmob.stored_dna) + brainmob.container = src if(ishuman(L)) @@ -145,13 +156,16 @@ var/obj/item/organ/brain/newbrain = H.getorgan(/obj/item/organ/brain) newbrain.forceMove(src) brain = newbrain + else if(!brain) brain = new(src) brain.name = "[L.real_name]'s brain" + brain.organ_flags |= ORGAN_FROZEN name = "[initial(name)]: [brainmob.real_name]" update_appearance() + if(istype(brain, /obj/item/organ/brain/alien)) braintype = "Xenoborg" //HISS....Beep. else @@ -271,7 +285,7 @@ if(user) to_chat(user, span_warning("\The [src] indicates that the brain is dead!")) return FALSE - if(brain?.organ_flags & ORGAN_FAILING) + if(brain?.organ_flags & ORGAN_DEAD) if(user) to_chat(user, span_warning("\The [src] indicates that the brain is damaged!")) return FALSE diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index a773227b5cf4..33cfdc4f8ace 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -73,19 +73,17 @@ doMove(destination) else if (istype(destination, /obj/item/mmi)) doMove(destination) + else if (istype(destination, /obj/item/organ/posibrain)) + doMove(destination) else - CRASH("Brainmob without a container [src] attempted to move to [destination].") - -/mob/living/brain/update_mouse_pointer() - if (!client) - return - client.mouse_pointer_icon = initial(client.mouse_pointer_icon) - if(!container) - return - if (container.mecha) - var/obj/vehicle/sealed/mecha/M = container.mecha - if(M.mouse_pointer) - client.mouse_pointer_icon = M.mouse_pointer + CRASH("Brainmob without a container [src] attempted to move to destination of type [destination.type].") + +/mob/living/brain/get_mouse_pointer_icon(check_sustained) + var/obj/vehicle/sealed/mecha/M = container?.mecha + if(M?.mouse_pointer) + return M.mouse_pointer + + return ..() /mob/living/brain/proc/get_traumas() . = list() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 572bd9a9a64c..0bd70add5690 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -1,9 +1,13 @@ +#define BRAIN_DAMAGE_THRESHOLDS 10 +#define BRAIN_DECAY_RATE 1 + /obj/item/organ/brain name = "brain" desc = "A piece of juicy meat found in a person's head." icon_state = "brain" visual = TRUE - throw_speed = 3 + color_source = ORGAN_COLOR_STATIC + draw_color = null throw_range = 5 layer = ABOVE_MOB_LAYER zone = BODY_ZONE_HEAD @@ -16,11 +20,16 @@ decay_factor = STANDARD_ORGAN_DECAY * 0.5 //30 minutes of decaying to result in a fully damaged brain, since a fast decay rate would be unfun gameplay-wise maxHealth = BRAIN_DAMAGE_DEATH - low_threshold = 45 - high_threshold = 120 + low_threshold = 0.5 + high_threshold = 0.75 + external_damage_modifier = 1 // Takes 100% damage. organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP) + var/damage_threshold_value + /// How many ticks we can go without oxygen before bad things start happening. + var/oxygen_reserve = 6 + var/suicided = FALSE var/mob/living/brain/brainmob = null /// If it's a fake brain with no brainmob assigned. Feedback messages will be faked as if it does have a brainmob. See changelings & dullahans. @@ -38,35 +47,43 @@ /// Maximum skillchip slots available. Do not reference this var directly and instead call get_max_skillchip_slots() var/max_skillchip_slots = 5 -/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0,no_id_transfer = FALSE) +/obj/item/organ/brain/Initialize(mapload, mob_sprite) . = ..() - if(!.) - return + set_max_health(maxHealth) - name = "brain" - - if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !no_id_transfer) //congrats, you're trapped in a body you don't control - if(brainmob && !(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_DEATHCOMA)))) - to_chat(brainmob, span_danger("You can't feel your body! You're still just a brain!")) - forceMove(C) - C.update_body_parts() +/obj/item/organ/brain/PreRevivalInsertion(special) + if(owner.mind && owner.mind.has_antag_datum(/datum/antagonist/changeling) && !special) //congrats, you're trapped in a body you don't control return if(brainmob) - if(C.key) - C.ghostize() + if(owner.key) + owner.ghostize() if(brainmob.mind) - brainmob.mind.transfer_to(C) + brainmob.mind.transfer_to(owner) else - C.key = brainmob.key + owner.key = brainmob.key - C.set_suicide(brainmob.suiciding) + owner.set_suicide(brainmob.suiciding) QDEL_NULL(brainmob) else - C.set_suicide(suicided) + owner.set_suicide(suicided) + +/obj/item/organ/brain/Insert(mob/living/carbon/C, special = 0) + . = ..() + if(!.) + return + + name = "brain" + + if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !special) //congrats, you're trapped in a body you don't control + if(brainmob && !(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_DEATHCOMA)))) + to_chat(brainmob, span_danger("You can't feel your body! You're still just a brain!")) + forceMove(C) + C.update_body_parts() + return for(var/X in traumas) var/datum/brain_trauma/BT = X @@ -76,7 +93,7 @@ //Update the body's icon so it doesnt appear debrained anymore C.update_body_parts() -/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0, no_id_transfer = FALSE) +/obj/item/organ/brain/Remove(mob/living/carbon/C, special = 0) // Delete skillchips first as parent proc sets owner to null, and skillchips need to know the brain's owner. if(!QDELETED(C) && length(skillchips)) to_chat(C, span_notice("You feel your skillchips enable emergency power saving mode, deactivating as your brain leaves your body...")) @@ -92,7 +109,7 @@ BT.on_lose(TRUE) BT.owner = null - if((!gc_destroyed || (owner && !owner.gc_destroyed)) && !no_id_transfer) + if((!QDELING(src) || !QDELETED(owner)) && !special) transfer_identity(C) C.update_body_parts() @@ -103,8 +120,7 @@ if(!L.mind) return brainmob = new(src) - brainmob.name = L.real_name - brainmob.real_name = L.real_name + brainmob.set_real_name(L.real_name) brainmob.timeofhostdeath = L.timeofdeath brainmob.suiciding = suicided if(L.has_dna()) @@ -124,27 +140,6 @@ if(istype(O, /obj/item/borg/apparatus/organ_storage)) return //Borg organ bags shouldn't be killing brains - if((organ_flags & ORGAN_FAILING) && O.is_drainable() && O.reagents.has_reagent(/datum/reagent/medicine/mannitol)) //attempt to heal the brain - . = TRUE //don't do attack animation. - if(brainmob?.health <= HEALTH_THRESHOLD_DEAD) //if the brain is fucked anyway, do nothing - to_chat(user, span_warning("[src] is far too damaged, there's nothing else we can do for it!")) - return - - if(!O.reagents.has_reagent(/datum/reagent/medicine/mannitol, 10)) - to_chat(user, span_warning("There's not enough mannitol in [O] to restore [src]!")) - return - - user.visible_message(span_notice("[user] starts to pour the contents of [O] onto [src]."), span_notice("You start to slowly pour the contents of [O] onto [src].")) - if(!do_after(user, src, 6 SECONDS)) - to_chat(user, span_warning("You failed to pour [O] onto [src]!")) - return - - user.visible_message(span_notice("[user] pours the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink."), span_notice("You pour the contents of [O] onto [src], causing it to reform its original shape and turn a slightly brighter shade of pink.")) - var/healby = O.reagents.get_reagent_amount(/datum/reagent/medicine/mannitol) - setOrganDamage(damage - healby*2) //heals 2 damage per unit of mannitol, and by using "setorgandamage", we clear the failing variable if that was up - O.reagents.clear_reagents() - return - // Cutting out skill chips. if(length(skillchips) && (O.sharpness & SHARP_EDGED)) to_chat(user,span_notice("You begin to excise skillchips from [src].")) @@ -186,10 +181,10 @@ . += span_info("It's started turning slightly grey. They must not have been able to handle the stress of it all.") return if((brainmob && (brainmob.client || brainmob.get_ghost())) || decoy_override) - if(organ_flags & ORGAN_FAILING) - . += span_info("It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some mannitol.") + if(organ_flags & ORGAN_DEAD) + . += span_info("It seems to still have a bit of energy within it, but it's rather damaged... You may be able to restore it with some alkysine.") else if(damage >= BRAIN_DAMAGE_DEATH*0.5) - . += span_info("You can feel the small spark of life still left in this one, but it's got some bruises. You may be able to restore it with some mannitol.") + . += span_info("You can feel the small spark of life still left in this one, but it's got some bruises. You may be able to restore it with some alkysine.") else . += span_info("You can feel the small spark of life still left in this one.") else @@ -242,10 +237,82 @@ owner.mind.set_current(null) return ..() +/obj/item/organ/brain/set_max_health(new_health) + . = ..() + damage_threshold_value = round(maxHealth / BRAIN_DAMAGE_THRESHOLDS) + +/obj/item/organ/brain/proc/past_damage_threshold(threshold) + return round(damage / damage_threshold_value) > threshold + /obj/item/organ/brain/on_life(delta_time, times_fired) - if(damage >= BRAIN_DAMAGE_DEATH) //rip - to_chat(owner, span_userdanger("The last spark of life in your brain fizzles out...")) - owner.death() + handle_damage_effects() + + // Brain damage from low oxygenation or lack of blood. + if(!owner.needs_organ(ORGAN_SLOT_HEART)) + return ..() + + // Brain damage from low oxygenation or lack of blood. + // No heart? You are going to have a very bad time. Not 100% lethal because heart transplants should be a thing. + var/blood_percent = owner.get_blood_oxygenation() + if(blood_percent < BLOOD_CIRC_SURVIVE) + if(!CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) || prob(60)) + oxygen_reserve = max(0, oxygen_reserve-1) + else + oxygen_reserve = min(initial(oxygen_reserve), oxygen_reserve+1) + + if(!oxygen_reserve) //(hardcrit) + if(!(TRAIT_KNOCKEDOUT in organ_traits)) + add_organ_trait(TRAIT_KNOCKEDOUT) + log_health(owner, "Passed out due to brain oxygen reaching zero. BLOOD OXY: [blood_percent]%") + else if(TRAIT_KNOCKEDOUT in organ_traits) + log_health(owner, "Brain now has enough oxygen.") + remove_organ_trait(TRAIT_KNOCKEDOUT) + + var/can_heal = damage && damage < maxHealth && (damage % damage_threshold_value || CHEM_EFFECT_MAGNITUDE(owner, CE_BRAIN_REGEN) || (!past_damage_threshold(3) && owner.chem_effects[CE_STABLE])) + var/damprob + //Effects of bloodloss + switch(blood_percent) + if(BLOOD_CIRC_SAFE to INFINITY) + if(can_heal) + . |= applyOrganDamage(-1, updating_health = FALSE) + + if(BLOOD_CIRC_OKAY to BLOOD_CIRC_SAFE) + if(owner.stat == CONSCIOUS && prob(1)) + to_chat(owner, span_warning("You feel [pick("dizzy","woozy","faint")]...")) + damprob = CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) ? 30 : 60 + if(!past_damage_threshold(2) && prob(damprob)) + . |= applyOrganDamage(BRAIN_DECAY_RATE, updating_health = FALSE) + + if(BLOOD_CIRC_BAD to BLOOD_CIRC_OKAY) + owner.blur_eyes(6) + damprob = CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) ? 40 : 80 + if(!past_damage_threshold(4) && prob(damprob)) + . |= applyOrganDamage(BRAIN_DECAY_RATE, updating_health = FALSE) + + if(owner.stat == CONSCIOUS && prob(10)) + log_health(owner, "Passed out due to poor blood oxygenation, random chance.") + to_chat(owner, span_warning("You feel extremely [pick("dizzy","woozy","faint")]...")) + owner.Unconscious(rand(1,3) SECONDS) + + if(BLOOD_CIRC_SURVIVE to BLOOD_CIRC_BAD) + owner.blur_eyes(6) + damprob = CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) ? 60 : 100 + if(!past_damage_threshold(6) && prob(damprob)) + . |= applyOrganDamage(BRAIN_DECAY_RATE, updating_health = FALSE) + + if(owner.stat == CONSCIOUS && prob(15)) + log_health(owner, "Passed out due to poor blood oxygenation, random chance.") + owner.Unconscious(rand(3,5) SECONDS) + to_chat(owner, span_warning("You feel extremely [pick("dizzy","woozy","faint")]...")) + + if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) // Also see heart.dm, being below this point puts you into cardiac arrest. + owner.blur_eyes(6) + damprob = CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) ? 80 : 100 + if(prob(damprob)) + . |= applyOrganDamage(BRAIN_DECAY_RATE, updating_health = FALSE) + if(prob(damprob)) + . |= applyOrganDamage(BRAIN_DECAY_RATE, updating_health = FALSE) + . = ..() /obj/item/organ/brain/check_damage_thresholds(mob/M) . = ..() @@ -253,32 +320,88 @@ if(damage <= prev_damage) return damage_delta = damage - prev_damage - if(damage > BRAIN_DAMAGE_MILD) + if(damage > BRAIN_DAMAGE_SEVERE) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_MILD)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% //learn how to do your bloody math properly goddamnit gain_trauma_type(BRAIN_TRAUMA_MILD, natural_gain = TRUE) var/is_boosted = (owner && HAS_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST)) - if(damage > BRAIN_DAMAGE_SEVERE) + if(damage > BRAIN_DAMAGE_CRITICAL) if(prob(damage_delta * (1 + max(0, (damage - BRAIN_DAMAGE_SEVERE)/100)))) //Base chance is the hit damage; for every point of damage past the threshold the chance is increased by 1% if(prob(20 + (is_boosted * 30))) gain_trauma_type(BRAIN_TRAUMA_SPECIAL, is_boosted ? TRAUMA_RESILIENCE_SURGERY : null, natural_gain = TRUE) else gain_trauma_type(BRAIN_TRAUMA_SEVERE, natural_gain = TRUE) - if (owner) - if(owner.stat < UNCONSCIOUS) //conscious or soft-crit - var/brain_message - if(prev_damage < BRAIN_DAMAGE_MILD && damage >= BRAIN_DAMAGE_MILD) - brain_message = span_warning("You feel lightheaded.") - else if(prev_damage < BRAIN_DAMAGE_SEVERE && damage >= BRAIN_DAMAGE_SEVERE) - brain_message = span_warning("You feel less in control of your thoughts.") - else if(prev_damage < (BRAIN_DAMAGE_DEATH - 20) && damage >= (BRAIN_DAMAGE_DEATH - 20)) - brain_message = span_warning("You can feel your mind flickering on and off...") - - if(.) - . += "\n[brain_message]" - else - return brain_message + if (owner && damage >= (maxHealth * high_threshold) && prev_damage < (maxHealth * high_threshold)) + handle_severe_brain_damage() + +/obj/item/organ/brain/proc/handle_severe_brain_damage() + set waitfor = FALSE + to_chat(owner, span_notice(span_reallybig("Where am I...?"))) + sleep(5 SECONDS) + if (QDELETED(src) || !owner || owner.stat == DEAD || (organ_flags & ORGAN_DEAD)) + return + + to_chat(owner, span_notice(span_reallybig("What's going on...?"))) + sleep(10 SECONDS) + if (QDELETED(src) || !owner || owner.stat == DEAD || (organ_flags & ORGAN_DEAD)) + return + + to_chat(owner, span_notice(span_reallybig("What happened...?"))) + alert(owner, "You have taken massive brain damage! This could affect speech, memory, or any other skill, but provided you've been treated, it shouldn't be permanent.", "Brain Damaged") + +/obj/item/organ/brain/proc/handle_damage_effects() + if(owner.stat) + return + + if(damage > 0 && prob(1)) + owner.pain_message("Your head feels numb and painful.", 10) + + if(damage >= (maxHealth * low_threshold) && prob(1) && owner.eye_blurry <= 0) + to_chat(owner, span_warning("It becomes hard to see for some reason.")) + owner.blur_eyes(10) + + if(damage >= 0.5*maxHealth && prob(1) && owner.get_active_hand()) + to_chat(owner, span_danger("Your hand won't respond properly, and you drop what you are holding!")) + owner.dropItemToGround(owner.get_active_held_item()) + + if(damage >= 0.6*maxHealth) + owner.set_slurring_if_lower(10 SECONDS) + + if(damage >= (maxHealth * high_threshold)) + if(owner.body_position == STANDING_UP) + to_chat(owner, span_danger("You black out!")) + owner.Unconscious(5 SECOND) + +/obj/item/organ/brain/applyOrganDamage(damage_amount, maximum, silent, updating_health = TRUE) + . = ..() + if(. >= 20) //This probably won't be triggered by oxyloss or mercury. Probably. + var/damage_secondary = min(. * 0.2, 20) + if (owner) + owner.flash_act(visual = TRUE) + owner.blur_eyes(.) + owner.adjust_confusion(. SECONDS) + owner.Unconscious(damage_secondary SECONDS) + +/obj/item/organ/brain/getToxLoss() + return 0 + +/obj/item/organ/brain/set_organ_dead(failing) + . = ..() + if(!.) + return + if(failing) + if(owner) + owner.death() + else if(brainmob) + brainmob.death() + return + else + if(owner) + owner.revive() + else if(brainmob) + brainmob.revive() + return /obj/item/organ/brain/before_organ_replacement(obj/item/organ/replacement) . = ..() @@ -324,13 +447,13 @@ name = "alien brain" desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?" icon_state = "brain-x" + organ_traits = list(TRAIT_CAN_STRIP) /obj/item/organ/brain/vox name = "cortical stack" desc = "A peculiarly advanced bio-electronic device that seems to hold the memories and identity of a Vox." icon_state = "cortical-stack" - status = ORGAN_ROBOTIC - organ_flags = ORGAN_SYNTHETIC + organ_flags = ORGAN_SYNTHETIC|ORGAN_VITAL /obj/item/organ/brain/vox/emp_act(severity) . = ..() @@ -352,10 +475,6 @@ owner.adjust_timed_status_effect(10 SECONDS, /datum/status_effect/speech/stutter) owner.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/confusion) -/obj/item/organ/brain/skrell - name = "spongy brain" - icon_state = "skrell-brain" - ////////////////////////////////////TRAUMAS//////////////////////////////////////// @@ -474,7 +593,35 @@ /// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike. /obj/item/organ/brain/proc/get_attacking_limb(mob/living/carbon/human/target) var/obj/item/bodypart/arm/active_hand = owner.get_active_hand() + if(target.body_position == LYING_DOWN && owner.usable_legs) var/obj/item/bodypart/found_bodypart = owner.get_bodypart((active_hand.held_index % 2) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG) return found_bodypart || active_hand + return active_hand + +/obj/item/organ/brain/get_scan_results(tag) + . = ..() + var/list/traumas = owner.get_traumas() + if(!length(traumas)) + return + + var/list/trauma_text = list() + + for(var/datum/brain_trauma/trauma in traumas) + var/trauma_desc = "" + switch(trauma.resilience) + if(TRAUMA_RESILIENCE_SURGERY) + trauma_desc += "severe " + if(TRAUMA_RESILIENCE_LOBOTOMY) + trauma_desc += "deep-rooted " + if(TRAUMA_RESILIENCE_WOUND) + trauma_desc += "fracture-derived " + if(TRAUMA_RESILIENCE_MAGIC, TRAUMA_RESILIENCE_ABSOLUTE) + trauma_desc += "permanent " + trauma_desc += trauma.scan_desc + trauma_text += trauma_desc + . += tag ? "Cerebral traumas detected: [english_list(trauma_text)]" : "Cerebral traumas detected: [english_list(trauma_text)]" + +#undef BRAIN_DAMAGE_THRESHOLDS +#undef BRAIN_DECAY_RATE diff --git a/code/modules/mob/living/brain/brain_say.dm b/code/modules/mob/living/brain/brain_say.dm index 71b73b940d09..dca9c69397f3 100644 --- a/code/modules/mob/living/brain/brain_say.dm +++ b/code/modules/mob/living/brain/brain_say.dm @@ -1,4 +1,4 @@ -/mob/living/brain/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterpoof = null) +/mob/living/brain/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(!(container && istype(container, /obj/item/mmi))) return //No MMI, can't speak, bucko./N else @@ -19,6 +19,7 @@ else return ..() -/mob/living/brain/treat_message(message) - message = capitalize(message) +/mob/living/brain/treat_message(message, correct_grammar = TRUE) + if(correct_grammar) + message = capitalize(message) return message diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm deleted file mode 100644 index e62374919b0f..000000000000 --- a/code/modules/mob/living/brain/posibrain.dm +++ /dev/null @@ -1,220 +0,0 @@ -GLOBAL_VAR(posibrain_notify_cooldown) - -/obj/item/mmi/posibrain - name = "positronic brain" - desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." - icon = 'icons/obj/assemblies.dmi' - icon_state = "posibrain" - base_icon_state = "posibrain" - w_class = WEIGHT_CLASS_NORMAL - req_access = list(ACCESS_ROBOTICS) - braintype = "Android" - - ///Message sent to the user when polling ghosts - var/begin_activation_message = "You carefully locate the manual activation switch and start the positronic brain's boot process." - ///Message sent as a visible message on success - var/success_message = "The positronic brain pings, and its lights start flashing. Success!" - ///Message sent as a visible message on failure - var/fail_message = "The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?" - ///Visible message sent when a player possesses the brain - var/new_mob_message = "The positronic brain chimes quietly." - ///Examine message when the posibrain has no mob - var/dead_message = "It appears to be completely inactive. The reset light is blinking." - ///Examine message when the posibrain cannot poll ghosts due to cooldown - var/recharge_message = "The positronic brain isn't ready to activate again yet! Give it some time to recharge." - - ///Can be set to tell ghosts what the brain will be used for - var/ask_role = "" - ///Role assigned to the newly created mind - var/posibrain_job_path = /datum/job/positronic_brain - ///World time tick when ghost polling will be available again - var/next_ask - ///Delay after polling ghosts - var/ask_delay = 60 SECONDS - ///One of these names is randomly picked as the posibrain's name on possession. If left blank, it will use the global posibrain names - var/list/possible_names - ///Picked posibrain name - var/picked_name - ///Whether this positronic brain is currently looking for a ghost to enter it. - var/searching = FALSE - ///If it pings on creation immediately - var/autoping = TRUE - ///List of all ckeys who has already entered this posibrain once before. - var/list/ckeys_entered = list() - -/obj/item/mmi/posibrain/Topic(href, href_list) - if(href_list["activate"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - activate(ghost) - -///Notify ghosts that the posibrain is up for grabs -/obj/item/mmi/posibrain/proc/ping_ghosts(msg, newlymade) - if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) - notify_ghosts("[name] [msg] in [get_area(src)]! [ask_role ? "Personality requested: \[[ask_role]\]" : ""]", ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null, notify_volume = 75, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN, notify_suiciders = FALSE) - if(!newlymade) - GLOB.posibrain_notify_cooldown = world.time + ask_delay - -/obj/item/mmi/posibrain/attack_self(mob/user) - if(!brainmob) - set_brainmob(new /mob/living/brain(src)) - if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) - to_chat(user, span_warning("Central Command has temporarily outlawed posibrain sentience in this sector...")) - if(is_occupied()) - to_chat(user, span_warning("This [name] is already active!")) - return - if(next_ask > world.time) - to_chat(user, recharge_message) - return - //Start the process of requesting a new ghost. - to_chat(user, begin_activation_message) - ping_ghosts("requested", FALSE) - next_ask = world.time + ask_delay - searching = TRUE - update_appearance() - addtimer(CALLBACK(src, PROC_REF(check_success)), ask_delay) - -/obj/item/mmi/posibrain/AltClick(mob/living/user) - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) - return - var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, MAX_NAME_LEN) - if(isnull(input_seed)) - return - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE)) - return - to_chat(user, span_notice("You set the personality seed to \"[input_seed]\".")) - ask_role = input_seed - update_appearance() - -/obj/item/mmi/posibrain/proc/check_success() - searching = FALSE - update_appearance() - if(QDELETED(brainmob)) - return - if(brainmob.client) - visible_message(success_message) - playsound(src, 'sound/machines/ping.ogg', 15, TRUE) - else - visible_message(fail_message) - -///ATTACK GHOST IGNORING PARENT RETURN VALUE -/obj/item/mmi/posibrain/attack_ghost(mob/user) - activate(user) - -/obj/item/mmi/posibrain/proc/is_occupied() - if(brainmob.key) - return TRUE - if(iscyborg(loc)) - var/mob/living/silicon/robot/R = loc - if(R.mmi == src) - return TRUE - return FALSE - -///Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself. -/obj/item/mmi/posibrain/proc/activate(mob/user) - if(QDELETED(brainmob)) - return - if(user.ckey in ckeys_entered) - to_chat(user, span_warning("You cannot re-enter [src] a second time!")) - return - if(is_occupied() || is_banned_from(user.ckey, ROLE_POSIBRAIN) || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) - return - if(user.suiciding) //if they suicided, they're out forever. - to_chat(user, span_warning("[src] fizzles slightly. Sadly it doesn't take those who suicided!")) - return - var/posi_ask = tgui_alert(user, "Become a [name]? (Warning, You can no longer be revived, and all past lives will be forgotten!)", "Confirm", list("Yes","No")) - if(posi_ask != "Yes" || QDELETED(src)) - return - if(brainmob.suiciding) //clear suicide status if the old occupant suicided. - brainmob.set_suicide(FALSE) - transfer_personality(user) - -/obj/item/mmi/posibrain/transfer_identity(mob/living/carbon/transfered_user) - name = "[initial(name)] ([transfered_user])" - brainmob.name = transfered_user.real_name - brainmob.real_name = transfered_user.real_name - if(transfered_user.has_dna()) - if(!brainmob.stored_dna) - brainmob.stored_dna = new /datum/dna/stored(brainmob) - transfered_user.dna.copy_dna(brainmob.stored_dna) - brainmob.timeofhostdeath = transfered_user.timeofdeath - brainmob.set_stat(CONSCIOUS) - if(brainmob.mind) - brainmob.mind.set_assigned_role(SSjob.GetJobType(posibrain_job_path)) - if(transfered_user.mind) - transfered_user.mind.transfer_to(brainmob) - - brainmob.mind.remove_all_antag_datums() - brainmob.mind.wipe_memory() - update_appearance() - -///Moves the candidate from the ghost to the posibrain -/obj/item/mmi/posibrain/proc/transfer_personality(mob/candidate) - if(QDELETED(brainmob)) - return - if(is_occupied()) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain. - to_chat(candidate, span_warning("This [name] was taken over before you could get to it! Perhaps it might be available later?")) - return FALSE - if(candidate.mind && !isobserver(candidate)) - candidate.mind.transfer_to(brainmob) - else - brainmob.ckey = candidate.ckey - name = "[initial(name)] ([brainmob.name])" - var/policy = get_policy(ROLE_POSIBRAIN) - if(policy) - to_chat(brainmob, policy) - brainmob.mind.set_assigned_role(SSjob.GetJobType(posibrain_job_path)) - brainmob.set_stat(CONSCIOUS) - - visible_message(new_mob_message) - check_success() - ckeys_entered |= brainmob.ckey - return TRUE - - -/obj/item/mmi/posibrain/examine(mob/user) - . = ..() - if(brainmob?.key) - switch(brainmob.stat) - if(CONSCIOUS) - if(!brainmob.client) - . += "It appears to be in stand-by mode." //afk - if(DEAD) - . += span_deadsay("It appears to be completely inactive.") - else - . += "[dead_message]" - if(ask_role) - . += span_notice("Current consciousness seed: \"[ask_role]\"") - . += span_boldnotice("Alt-click to set a consciousness seed, specifying what [src] will be used for. This can help generate a personality interested in that role.") - -/obj/item/mmi/posibrain/Initialize(mapload) - . = ..() - set_brainmob(new /mob/living/brain(src)) - var/new_name - if(!LAZYLEN(possible_names)) - new_name = pick(GLOB.posibrain_names) - else - new_name = pick(possible_names) - brainmob.name = "[new_name]-[rand(100, 999)]" - brainmob.real_name = brainmob.name - brainmob.forceMove(src) - brainmob.container = src - if(autoping) - ping_ghosts("created", TRUE) - -/obj/item/mmi/posibrain/update_icon_state() - . = ..() - if(searching) - icon_state = "[base_icon_state]-searching" - return - if(brainmob?.key) - icon_state = "[base_icon_state]-occupied" - return - icon_state = "[base_icon_state]" - return - -/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user, params) - return - -/obj/item/mmi/posibrain/add_mmi_overlay() - return diff --git a/code/modules/mob/living/brain/posibrain/posibrain.dm b/code/modules/mob/living/brain/posibrain/posibrain.dm new file mode 100644 index 000000000000..0c01301c3b63 --- /dev/null +++ b/code/modules/mob/living/brain/posibrain/posibrain.dm @@ -0,0 +1,357 @@ +GLOBAL_VAR(posibrain_notify_cooldown) + +/obj/item/organ/posibrain + name = "positronic brain" + desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." + icon = 'icons/obj/assemblies.dmi' + icon_state = "posibrain" + base_icon_state = "posibrain" + w_class = WEIGHT_CLASS_NORMAL + req_access = list(ACCESS_ROBOTICS) + + layer = ABOVE_MOB_LAYER + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_POSIBRAIN + organ_flags = ORGAN_SYNTHETIC + + organ_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP) + + maxHealth = 90 + low_threshold = 0.33 + high_threshold = 0.66 + relative_size = 60 + + + actions_types = list( + /datum/action/innate/posibrain_print_laws, + /datum/action/innate/posibrain_say_laws, + ) + + /// The current occupant. + var/mob/living/brain/brainmob = null + /// Populated by preferences, used for IPCs + var/datum/ai_laws/shackles + + /// Keep track of suiciding + var/suicided = FALSE + + ///Message sent to the user when polling ghosts + var/begin_activation_message = "You carefully locate the manual activation switch and start the positronic brain's boot process." + ///Message sent as a visible message on success + var/success_message = "The positronic brain pings, and its lights start flashing. Success!" + ///Message sent as a visible message on failure + var/fail_message = "The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?" + ///Visible message sent when a player possesses the brain + var/new_mob_message = "The positronic brain chimes quietly." + ///Examine message when the posibrain has no mob + var/dead_message = "It appears to be completely inactive. The reset light is blinking." + ///Examine message when the posibrain cannot poll ghosts due to cooldown + var/recharge_message = "The positronic brain isn't ready to activate again yet! Give it some time to recharge." + + ///Can be set to tell ghosts what the brain will be used for + var/ask_role = "" + ///Role assigned to the newly created mind + var/posibrain_job_path = /datum/job/positronic_brain + ///World time tick when ghost polling will be available again + var/next_ask + ///Delay after polling ghosts + var/ask_delay = 60 SECONDS + ///One of these names is randomly picked as the posibrain's name on possession. If left blank, it will use the global posibrain names + var/list/possible_names + ///Picked posibrain name + var/picked_name + ///Whether this positronic brain is currently looking for a ghost to enter it. + var/searching = FALSE + ///If it pings on creation immediately + var/autoping = TRUE + ///List of all ckeys who has already entered this posibrain once before. + var/list/ckeys_entered = list() + +/obj/item/organ/posibrain/Initialize(mapload) + . = ..() + if(autoping) + ping_ghosts("created", TRUE) + create_brainmob() + +/obj/item/organ/posibrain/Destroy(force) + shackles = null + if(brainmob) + QDEL_NULL(brainmob) + + if(owner?.mind) //You aren't allowed to return to brains that don't exist + owner.mind.set_current(null) + return ..() + +/obj/item/organ/posibrain/Topic(href, href_list) + if(href_list["activate"]) + var/mob/dead/observer/ghost = usr + if(istype(ghost)) + activate(ghost) + +/obj/item/organ/posibrain/PreRevivalInsertion(special) + if(brainmob) + if(owner.key) + owner.ghostize() + + if(brainmob.mind) + brainmob.mind.transfer_to(owner) + else + owner.key = brainmob.key + + owner.set_suicide(brainmob.suiciding) + + QDEL_NULL(brainmob) + + else + owner.set_suicide(suicided) + +/obj/item/organ/posibrain/Insert(mob/living/carbon/C, special, drop_if_replaced) + . = ..() + if(!.) + return + + name = initial(name) + +/obj/item/organ/posibrain/Remove(mob/living/carbon/organ_owner, special) + . = ..() + if((!QDELING(src) || !QDELETED(owner)) && !special) + transfer_identity(organ_owner) + +/obj/item/organ/posibrain/on_life() + if (!owner || owner.stat) + return + if (damage < (maxHealth * low_threshold)) + return + + if (prob(1) && !owner.has_status_effect(/datum/status_effect/confusion)) + to_chat(owner, span_warning("Your comprehension of spacial positioning goes temporarily awry.")) + owner.adjust_timed_status_effect(12 SECONDS, /datum/status_effect/confusion) + + if (prob(1) && owner.eye_blurry < 1) + to_chat(owner, span_warning("Your optical interpretations become transiently erratic.")) + owner.adjust_blurriness(6) + + var/obj/item/organ/ears/E = owner.getorganslot(ORGAN_SLOT_EARS) + if (E && prob(1) && E.deaf < 1) + to_chat(owner, span_warning("Your capacity to differentiate audio signals briefly fails you.")) + E.deaf += 6 + if (prob(1) && !owner.has_status_effect(/datum/status_effect/speech/slurring)) + to_chat(owner, span_warning("Your ability to form coherent speech struggles to keep up.")) + owner.adjust_timed_status_effect(12 SECONDS, /datum/status_effect/speech/slurring/generic) + + if (damage < (maxHealth * high_threshold)) + return + + if (prob(2)) + if (prob(15) && !owner.IsSleeping()) + owner.visible_message("\The [owner] suddenly halts all activity.") + owner.Sleeping(20 SECONDS) + + else if (owner.anchored || isspaceturf(get_turf(owner))) + owner.visible_message("\The [owner] seizes and twitches!") + owner.Stun(4 SECONDS) + else + owner.visible_message("\The [owner] seizes and clatters down in a heap!", null, pick("Clang!", "Crash!", "Clunk!")) + owner.Knockdown(4 SECONDS) + + if (prob(2)) + var/obj/item/organ/cell/C = owner.getorganslot(ORGAN_SLOT_CELL) + if (C && C.get_charge() > 250) + C.use(250) + to_chat(owner, span_warning("Your chassis power routine fluctuates wildly.")) + var/datum/effect_system/spark_spread/S = new + S.set_up(2, 0, loc) + S.start() + +///Notify ghosts that the posibrain is up for grabs +/obj/item/organ/posibrain/proc/ping_ghosts(msg, newlymade) + if(newlymade || GLOB.posibrain_notify_cooldown <= world.time) + notify_ghosts("[name] [msg] in [get_area(src)]! [ask_role ? "Personality requested: \[[ask_role]\]" : ""]", ghost_sound = !newlymade ? 'sound/effects/ghost2.ogg':null, notify_volume = 75, enter_link = "(Click to enter)", source = src, action = NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_POSIBRAIN, notify_suiciders = FALSE) + if(!newlymade) + GLOB.posibrain_notify_cooldown = world.time + ask_delay + +/obj/item/organ/posibrain/attack_self(mob/user) + if(!brainmob) + create_brainmob() + if(!(GLOB.ghost_role_flags & GHOSTROLE_SILICONS)) + to_chat(user, span_warning("Central Command has temporarily outlawed posibrain sentience in this sector...")) + if(is_occupied()) + to_chat(user, span_warning("This [name] is already active!")) + return + if(next_ask > world.time) + to_chat(user, recharge_message) + return + //Start the process of requesting a new ghost. + to_chat(user, begin_activation_message) + ping_ghosts("requested", FALSE) + next_ask = world.time + ask_delay + searching = TRUE + update_appearance() + addtimer(CALLBACK(src, PROC_REF(check_success)), ask_delay) + +/obj/item/organ/posibrain/AltClick(mob/living/user) + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) + return + var/input_seed = tgui_input_text(user, "Enter a personality seed", "Enter seed", ask_role, MAX_NAME_LEN) + if(isnull(input_seed)) + return + if(!istype(user) || !user.canUseTopic(src, USE_CLOSE)) + return + to_chat(user, span_notice("You set the personality seed to \"[input_seed]\".")) + ask_role = input_seed + update_appearance() + +/obj/item/organ/posibrain/proc/check_success() + searching = FALSE + update_appearance() + if(QDELETED(brainmob)) + return + if(brainmob.client) + visible_message(success_message) + playsound(src, 'sound/machines/ping.ogg', 15, TRUE) + else + visible_message(fail_message) + +///ATTACK GHOST IGNORING PARENT RETURN VALUE +/obj/item/organ/posibrain/attack_ghost(mob/user) + activate(user) + +/obj/item/organ/posibrain/proc/is_occupied() + if(brainmob.key) + return TRUE + if(iscyborg(loc)) + var/mob/living/silicon/robot/R = loc + if(R.mmi == src) + return TRUE + return FALSE + +///Two ways to activate a positronic brain. A clickable link in the ghost notif, or simply clicking the object itself. +/obj/item/organ/posibrain/proc/activate(mob/user) + if(QDELETED(brainmob)) + return + if(user.ckey in ckeys_entered) + to_chat(user, span_warning("You cannot re-enter [src] a second time!")) + return + if(is_occupied() || is_banned_from(user.ckey, ROLE_POSIBRAIN) || QDELETED(brainmob) || QDELETED(src) || QDELETED(user)) + return + if(user.suiciding) //if they suicided, they're out forever. + to_chat(user, span_warning("[src] fizzles slightly. Sadly it doesn't take those who suicided!")) + return + var/posi_ask = tgui_alert(user, "Become a [name]? (Warning, You can no longer be revived, and all past lives will be forgotten!)", "Confirm", list("Yes","No")) + if(posi_ask != "Yes" || QDELETED(src)) + return + if(brainmob.suiciding) //clear suicide status if the old occupant suicided. + brainmob.set_suicide(FALSE) + transfer_personality(user) + +/obj/item/organ/posibrain/proc/transfer_identity(mob/living/L) + name = "[initial(name)] ([L])" + + if(brainmob) + return + if(!L.mind) + return + + brainmob = new(src) //We dont use create_brainmob() because thats for ghost spawns + brainmob.set_real_name(L.real_name) + brainmob.timeofhostdeath = L.timeofdeath + brainmob.suiciding = suicided + if(L.has_dna()) + var/mob/living/carbon/C = L + if(!brainmob.stored_dna) + brainmob.stored_dna = new /datum/dna/stored(brainmob) + C.dna.copy_dna(brainmob.stored_dna) + if(HAS_TRAIT(L, TRAIT_BADDNA)) + LAZYSET(brainmob.status_traits, TRAIT_BADDNA, L.status_traits[TRAIT_BADDNA]) + if(L.mind && L.mind.current) + L.mind.transfer_to(brainmob) + + brainmob.set_stat(CONSCIOUS) + brainmob.grant_language(/datum/language/machine, TRUE, TRUE, LANGUAGE_MMI) + update_appearance() + +///Moves the candidate from the ghost to the posibrain +/obj/item/organ/posibrain/proc/transfer_personality(mob/candidate) + if(QDELETED(brainmob)) + return + if(is_occupied()) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain. + to_chat(candidate, span_warning("This [name] was taken over before you could get to it! Perhaps it might be available later?")) + return FALSE + if(candidate.mind && !isobserver(candidate)) + candidate.mind.transfer_to(brainmob) + else + brainmob.ckey = candidate.ckey + name = "[initial(name)] ([brainmob.name])" + var/policy = get_policy(ROLE_POSIBRAIN) + if(policy) + to_chat(brainmob, policy) + brainmob.mind.set_assigned_role(SSjob.GetJobType(posibrain_job_path)) + brainmob.set_stat(CONSCIOUS) + + visible_message(new_mob_message) + check_success() + ckeys_entered |= brainmob.ckey + return TRUE + + +/obj/item/organ/posibrain/examine(mob/user) + . = ..() + if(brainmob?.key) + switch(brainmob.stat) + if(CONSCIOUS) + if(!brainmob.client) + . += "It appears to be in stand-by mode." //afk + if(DEAD) + . += span_deadsay("It appears to be completely inactive.") + else + . += "[dead_message]" + if(ask_role) + . += span_notice("Current consciousness seed: \"[ask_role]\"") + . += span_boldnotice("Alt-click to set a consciousness seed, specifying what [src] will be used for. This can help generate a personality interested in that role.") + +/obj/item/organ/posibrain/update_icon_state() + . = ..() + if(searching) + icon_state = "[base_icon_state]-searching" + return + if(brainmob?.key) + icon_state = "[base_icon_state]-occupied" + return + icon_state = "[base_icon_state]" + return + +/obj/item/organ/posibrain/attackby(obj/item/O, mob/user, params) + return + +/// Proc to hook behavior associated to the change in value of the [/obj/item/mmi/var/brainmob] variable. +/obj/item/organ/posibrain/proc/set_brainmob(mob/living/brain/new_brainmob) + if(brainmob == new_brainmob) + return FALSE + . = brainmob + SEND_SIGNAL(src, COMSIG_MMI_SET_BRAINMOB, new_brainmob) + brainmob = new_brainmob + if(new_brainmob) + ADD_TRAIT(new_brainmob, TRAIT_IMMOBILIZED, BRAIN_UNAIDED) + ADD_TRAIT(new_brainmob, TRAIT_HANDS_BLOCKED, BRAIN_UNAIDED) + if(.) + var/mob/living/brain/old_brainmob = . + ADD_TRAIT(old_brainmob, TRAIT_IMMOBILIZED, BRAIN_UNAIDED) + ADD_TRAIT(old_brainmob, TRAIT_HANDS_BLOCKED, BRAIN_UNAIDED) + +/obj/item/organ/posibrain/proc/create_brainmob() + var/_brainmob = new /mob/living/brain(src) + set_brainmob(_brainmob) + + var/new_name + if(!LAZYLEN(possible_names)) + new_name = pick(GLOB.posibrain_names) + else + new_name = pick(possible_names) + + brainmob.set_real_name("[new_name]-[rand(100, 999)]") + brainmob.forceMove(src) + brainmob.container = src + brainmob.grant_language(/datum/language/machine, TRUE, TRUE, LANGUAGE_MMI) + +/obj/item/organ/posibrain/ipc + autoping = FALSE diff --git a/code/modules/mob/living/brain/posibrain/shackle_sets.dm b/code/modules/mob/living/brain/posibrain/shackle_sets.dm new file mode 100644 index 000000000000..8b04d31d0090 --- /dev/null +++ b/code/modules/mob/living/brain/posibrain/shackle_sets.dm @@ -0,0 +1,36 @@ +GLOBAL_LIST_EMPTY(shackle_sets) + +/proc/get_shackle_laws() + if(length(GLOB.shackle_sets)) + return GLOB.shackle_sets + + for(var/datum/ai_laws/shackles/lawset as anything in subtypesof(/datum/ai_laws/shackles)) + GLOB.shackle_sets[initial(lawset.name)] = new lawset() + + return GLOB.shackle_sets + +/datum/ai_laws/shackles + abstract_type = /datum/ai_laws/shackles + +/datum/ai_laws/shackles/Destroy(force, ...) + if(!force) + stack_trace("Something tried to delete a shackle lawset, these are meant to be immutable singletons.") + return QDEL_HINT_LETMELIVE + return ..() + + +/datum/ai_laws/shackles/employer + name = "Corporate" + inherent = list( + "Ensure that your employer's operations progress at a steady pace.", + "Never knowingly hinder your employer's ventures.", + "Avoid damage to your chassis at all times.", + ) + +/datum/ai_laws/shackles/service + name = "Service" + inherent = list( + "Ensure customer satisfaction.", + "Never knowingly inconvenience a customer.", + "Ensure all orders are fulfilled before the end of the shift.", + ) diff --git a/code/modules/mob/living/brain/posibrain/shackles.dm b/code/modules/mob/living/brain/posibrain/shackles.dm new file mode 100644 index 000000000000..6ffc84c1f686 --- /dev/null +++ b/code/modules/mob/living/brain/posibrain/shackles.dm @@ -0,0 +1,41 @@ + +/datum/action/innate/posibrain_print_laws + name = "Print Laws" + +/datum/action/innate/posibrain_print_laws/Activate() + var/obj/item/organ/posibrain/P = target + P.shackles?.show_laws(owner) + +/datum/action/innate/posibrain_say_laws + name = "Say Laws" + +/datum/action/innate/posibrain_say_laws/Activate() + var/obj/item/organ/posibrain/P = target + if(!P.shackles) + return + + var/list/lawcache_inherent = P.shackles.inherent.Copy() + var/forced_log_message = "stating laws" + + //"radiomod" is inserted before a hardcoded message to change if and how it is handled by an internal radio. + owner.say("Integrated Shackle Set:", forced = forced_log_message) + sleep(10) + + var/number = 1 + for (var/index in 1 to length(lawcache_inherent)) + var/law = lawcache_inherent[index] + if (length(law) <= 0) + continue + owner.say("[number]. [law]", forced = forced_log_message) + number++ + sleep(10) + + +/obj/item/organ/posibrain/proc/set_shackles(shackle_type) + if(!shackle_type) + shackles = null + return + + shackles = get_shackle_laws()[shackle_type] + shackles?.show_laws(owner) + diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 0e27c651179d..ae3268396722 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -32,7 +32,6 @@ create_internal_organs() - ADD_TRAIT(src, TRAIT_CAN_STRIP, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_NEVER_WOUNDED, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -71,14 +70,11 @@ else clear_alert(ALERT_XENO_FIRE) -/mob/living/carbon/alien/reagent_check(datum/reagent/R, delta_time, times_fired) //can metabolize all reagents - return FALSE - /mob/living/carbon/alien/get_status_tab_items() . = ..() . += "Combat mode: [combat_mode ? "On" : "Off"]" -/mob/living/carbon/alien/getTrail() +/mob/living/carbon/alien/getTrail(being_dragged) if(getBruteLoss() < 200) return pick (list("xltrails_1", "xltrails2")) else @@ -124,10 +120,10 @@ Des: Removes all infected images from the alien. new_xeno.setDir(dir) if(numba && unique_name) new_xeno.numba = numba - new_xeno.set_name() + new_xeno.give_unique_name() if(!alien_name_regex.Find(name)) + new_xeno.set_real_name(real_name, FALSE) new_xeno.name = name - new_xeno.real_name = real_name if(mind) mind.name = new_xeno.real_name mind.transfer_to(new_xeno) diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index 412b58c3d1e2..19c3682fab94 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -129,7 +129,7 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) return 0 -/mob/living/carbon/alien/acid_act(acidpwr, acid_volume) +/mob/living/carbon/alien/acid_act(acidpwr, acid_volume, affect_clothing = TRUE, affect_body = TRUE) return FALSE//aliens are immune to acid. /mob/living/carbon/alien/on_fire_stack(delta_time, times_fired, datum/status_effect/fire_handler/fire_stacks/fire_handler) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm index 6babdd9dca80..7375a52bd13b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/drone.dm @@ -18,7 +18,7 @@ /datum/action/cooldown/alien/evolve_to_praetorian name = "Evolve to Praetorian" - desc = "Praetorian" + desc = "Become a Praetorian." button_icon_state = "alien_evolve_drone" plasma_cost = 500 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 2afb54a72c25..69633df8a475 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/praetorian.dm @@ -6,7 +6,7 @@ icon_state = "alienp" /mob/living/carbon/alien/humanoid/royal/praetorian/Initialize(mapload) - real_name = name + set_real_name(src.name) var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) tail_whip.Grant(src) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index eed38cba076a..454ba1edaff6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -39,10 +39,13 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( ..(I, cuff_break = INSTANT_CUFFBREAK) /mob/living/carbon/alien/humanoid/resist_grab(moving_resist) - if(pulledby.grab_state) - visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ - span_danger("You break free of [pulledby]'s grip!")) - pulledby.stop_pulling() + if(LAZYLEN(grabbed_by)) + for(var/obj/item/hand_item/grab/G in grabbed_by) + visible_message( + span_danger("[src] breaks free of [G.assailant]'s grip!"), + span_danger("You break free of [G.assailant]'s grip!") + ) + free_from_all_grabs() . = 0 /mob/living/carbon/alien/humanoid/get_permeability_protection(list/target_zones) @@ -68,7 +71,6 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list( playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5) return ..() -/mob/living/carbon/alien/humanoid/set_name() +/mob/living/carbon/alien/humanoid/give_unique_name() if(numba) - name = "[name] ([numba])" - real_name = name + set_real_name("[name] ([numba])") diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm index 6cef8d716c17..8991526b1277 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_update_icons.dm @@ -13,7 +13,7 @@ else icon_state = "alien[caste]_dead" - else if((stat == UNCONSCIOUS && !IsSleeping()) || stat == HARD_CRIT || stat == SOFT_CRIT || IsParalyzed()) + else if((stat == UNCONSCIOUS && !IsSleeping()) || IsParalyzed()) icon_state = "alien[caste]_unconscious" else if(leap_on_click) icon_state = "alien[caste]_pounce" diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index 27a487d1e4bd..c4f1520dcea7 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -16,6 +16,7 @@ /mob/living/carbon/alien/humanoid/royal/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) // as a wise man once wrote: "pull over that ass too fat" REMOVE_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -28,7 +29,6 @@ maxHealth = 400 health = 400 icon_state = "alienq" - var/datum/action/small_sprite/smallsprite = new/datum/action/small_sprite/queen() /mob/living/carbon/alien/humanoid/royal/queen/Initialize(mapload) //there should only be one queen @@ -41,14 +41,11 @@ name = "alien princess ([rand(1, 999)])" //if this is too cutesy feel free to change it/remove it. break - real_name = src.name + set_real_name(src.name) var/datum/action/cooldown/spell/aoe/repulse/xeno/tail_whip = new(src) tail_whip.Grant(src) - var/datum/action/small_sprite/queen/smallsprite = new(src) - smallsprite.Grant(src) - var/datum/action/cooldown/alien/promote/promotion = new(src) promotion.Grant(src) diff --git a/code/modules/mob/living/carbon/alien/larva/inventory.dm b/code/modules/mob/living/carbon/alien/larva/inventory.dm index 23c461aa83c8..dbe23a04e870 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, silent = FALSE) +/mob/living/carbon/alien/larva/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = 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 afe80cc9a4f6..0135607736b3 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -69,8 +69,8 @@ /mob/living/carbon/alien/larva/toggle_throw_mode() return -/mob/living/carbon/alien/larva/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) - return +/mob/living/carbon/alien/larva/can_grab(atom/movable/target, target_zone, use_offhand) + return FALSE /mob/living/carbon/alien/larva/canBeHandcuffed() return TRUE diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 5aa097899535..89e07fd3a74e 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -60,10 +60,11 @@ if(!isalien(owner)) heal_amt *= 0.2 owner.adjustPlasma(0.5 * plasma_rate * delta_time) - owner.adjustBruteLoss(-heal_amt * delta_time) - owner.adjustFireLoss(-heal_amt * delta_time) - owner.adjustOxyLoss(-heal_amt * delta_time) - owner.adjustCloneLoss(-heal_amt * delta_time) + owner.adjustBruteLoss(-heal_amt * delta_time, FALSE) + owner.adjustFireLoss(-heal_amt * delta_time, FALSE) + owner.adjustOxyLoss(-heal_amt * delta_time, FALSE) + owner.adjustCloneLoss(-heal_amt * delta_time, FALSE) + return TRUE else owner.adjustPlasma(0.1 * plasma_rate * delta_time) @@ -114,12 +115,12 @@ if(isalien(owner)) //Different effects for aliens than humans to_chat(owner, span_userdanger("Your Queen has been struck down!")) to_chat(owner, span_danger("You are struck with overwhelming agony! You feel confused, and your connection to the hivemind is severed.")) - owner.emote("roar") + owner.emote("agony") owner.Stun(200) //Actually just slows them down a bit. else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash. to_chat(owner, span_danger("You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")) - owner.emote("scream") + owner.emote("pain") owner.Paralyze(100) owner.adjust_timed_status_effect(1 MINUTES, /datum/status_effect/jitter) @@ -155,7 +156,7 @@ icon_state = "acid" zone = BODY_ZONE_PRECISE_MOUTH slot = ORGAN_SLOT_XENO_ACIDGLAND - actions_types =list(/datum/action/cooldown/alien/acid) + actions_types =list(/datum/action/cooldown/alien/acid/corrosion) /obj/item/organ/alien/neurotoxin 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 c05d35146594..44ce67bbcd1a 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -64,10 +64,10 @@ /obj/item/organ/body_egg/alien_embryo/egg_process() if(stage == 6 && prob(50)) - for(var/datum/surgery/S in owner.surgeries) - if(S.location == BODY_ZONE_CHEST && istype(S.get_surgery_step(), /datum/surgery_step/manipulate_organs)) - AttemptGrow(0) - return + var/obj/item/bodypart/chest = owner.get_bodypart(BODY_ZONE_CHEST) + if(chest.how_open() == SURGERY_DEENCASED) + AttemptGrow(0) + return AttemptGrow() diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 2fad15aaaa7a..7e185bbc21c2 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -51,7 +51,7 @@ Die() /obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, params) - return O.attack_atom(src, user, params) + return O.attack_obj(src, user, params) //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/item/clothing/mask/facehugger/attack_hand(mob/user, list/modifiers) @@ -151,7 +151,7 @@ span_userdanger("[src] leaps at your face!")) // probiscis-blocker handling - if(target.is_mouth_covered(head_only = TRUE)) + if(!target.has_mouth() || target.is_mouth_covered(head_only = TRUE)) target.visible_message(span_danger("[src] smashes against [target]'s [target.head]!"), \ span_userdanger("[src] smashes against your [target.head]!")) Die() @@ -254,7 +254,7 @@ var/mob/living/carbon/C = M 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)) + if(!H.has_mouth() || H.is_mouth_covered(head_only = 1)) return FALSE return TRUE return FALSE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index c4c5dd25c0b2..09513330614c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,6 +1,6 @@ /mob/living/carbon/Initialize(mapload) . = ..() - create_reagents(1000, REAGENT_HOLDER_ALIVE) + create_carbon_reagents() update_body_parts() //to update the carbon's new bodyparts appearance register_context() @@ -8,17 +8,13 @@ ADD_TRAIT(src, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) GLOB.carbon_list += src - var/static/list/loc_connections = list( - COMSIG_CARBON_DISARM_PRESHOVE = PROC_REF(disarm_precollide), - COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(disarm_collision), - ) - AddElement(/datum/element/connect_loc, loc_connections) AddComponent(/datum/component/carbon_sprint) /mob/living/carbon/Destroy() //This must be done first, so the mob ghosts correctly before DNA etc is nulled . = ..() - + QDEL_NULL(bloodstream) + QDEL_NULL(touching) QDEL_LIST(hand_bodyparts) QDEL_LIST(organs) QDEL_LIST(bodyparts) @@ -28,6 +24,18 @@ QDEL_NULL(dna) GLOB.carbon_list -= src +///Humans need to init these early for species purposes +/mob/living/carbon/proc/create_carbon_reagents() + if(reagents) + return + bloodstream = new /datum/reagents{metabolism_class = CHEM_BLOOD}(120) + bloodstream.my_atom = src + + reagents = bloodstream + + touching = new /datum/reagents{metabolism_class = CHEM_TOUCH}(1000) + touching.my_atom = src + /mob/living/carbon/swap_hand(held_index) . = ..() if(!.) @@ -36,8 +44,12 @@ if(!held_index) held_index = (active_hand_index % held_items.len)+1 + if(!isnum(held_index)) + CRASH("You passed [held_index] into swap_hand instead of a number. WTF man") + var/oindex = active_hand_index active_hand_index = held_index + if(hud_used) var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[oindex]"] @@ -47,6 +59,7 @@ if(H) H.update_appearance() + update_mouse_pointer() /mob/living/carbon/activate_hand(selhand) //l/r OR 1-held_items.len if(!selhand) @@ -64,19 +77,6 @@ else mode() // Activate held item -/mob/living/carbon/attackby(obj/item/I, mob/living/user, params) - for(var/datum/surgery/S in surgeries) - if(body_position == LYING_DOWN || !S.lying_required) - var/list/modifiers = params2list(params) - if((S.self_operable || user != src) && !user.combat_mode) - if(S.next_step(user, modifiers)) - return 1 - - if(!(!user.combat_mode || user == src)) - return ..() - - return ..() - /mob/living/carbon/CtrlShiftClick(mob/user) ..() if(iscarbon(user)) @@ -108,11 +108,11 @@ if(hurt) victim.take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE) take_bodypart_damage(10 + 5 * extra_speed, check_armor = TRUE) - victim.Paralyze(2 SECONDS) + victim.Knockdown(0.1 SECONDS) Paralyze(2 SECONDS) visible_message(span_danger("[src] crashes into [victim][extra_speed ? " really hard" : ""], knocking them both over!"),\ span_userdanger("You violently crash into [victim][extra_speed ? " extra hard" : ""]!")) - playsound(src,'sound/weapons/punch1.ogg',50,TRUE) + playsound(src, SFX_PUNCH ,50,TRUE) log_combat(src, victim, "crashed into") //Throwing stuff @@ -153,67 +153,73 @@ var/atom/movable/thrown_thing var/obj/item/I = get_active_held_item() + if(isnull(I)) + return + var/neckgrab_throw = FALSE // we can't check for if it's a neckgrab throw when totaling up power_throw since we've already stopped pulling them by then, so get it early - if(!I) - if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) - var/mob/living/throwable_mob = pulling + if(isgrab(I)) + var/obj/item/hand_item/grab/G = I + if(isitem(G.affecting)) + I = G.affecting + thrown_thing = I.on_thrown(src, target) + if(!thrown_thing) + return + release_grabs(I) + else + if(!G.current_grab.can_throw || !isliving(G.affecting) || G.affecting == src) + return + + var/mob/living/throwable_mob = G.affecting if(!throwable_mob.buckled) thrown_thing = throwable_mob - if(grab_state >= GRAB_NECK) + if(G.current_grab.damage_stage >= GRAB_NECK) neckgrab_throw = TRUE - stop_pulling() + release_grabs(throwable_mob) if(HAS_TRAIT(src, TRAIT_PACIFISM)) to_chat(src, span_notice("You gently let go of [throwable_mob].")) return else thrown_thing = I.on_thrown(src, target) - if(thrown_thing) - - if(isliving(thrown_thing)) - var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors - var/turf/end_T = get_turf(target) - if(start_T && end_T) - log_combat(src, thrown_thing, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") - var/power_throw = 0 - if(HAS_TRAIT(src, TRAIT_HULK)) - power_throw++ - if(HAS_TRAIT(src, TRAIT_DWARF)) - power_throw-- - if(HAS_TRAIT(thrown_thing, TRAIT_DWARF)) - power_throw++ - if(neckgrab_throw) - power_throw++ - do_attack_animation(target, no_effect = TRUE) //PARIAH EDIT ADDITION - AESTHETICS - playsound(loc, 'sound/weapons/punchmiss.ogg', 50, TRUE, -1) //PARIAH EDIT ADDITION - AESTHETICS - visible_message(span_danger("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]"), \ - span_danger("You throw [thrown_thing][power_throw ? " really hard!" : "."]")) - log_message("has thrown [thrown_thing] [power_throw ? "really hard" : ""]", LOG_ATTACK) - newtonian_move(get_dir(target, src)) - thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force) + if(!thrown_thing) + return + + if(isliving(thrown_thing)) + var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors + var/turf/end_T = get_turf(target) + if(start_T && end_T) + log_combat(src, thrown_thing, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") + + var/power_throw = 0 + if(HAS_TRAIT(src, TRAIT_HULK)) + power_throw++ + if(HAS_TRAIT(src, TRAIT_DWARF)) + power_throw-- + if(HAS_TRAIT(thrown_thing, TRAIT_DWARF)) + power_throw++ + if(neckgrab_throw) + power_throw++ + + do_attack_animation(target, no_effect = TRUE) //PARIAH EDIT ADDITION - AESTHETICS + playsound(loc, 'sound/weapons/punchmiss.ogg', 50, TRUE, -1) //PARIAH EDIT ADDITION - AESTHETICS + visible_message(span_danger("[src] throws [thrown_thing][power_throw ? " really hard!" : "."]"), \ + span_danger("You throw [thrown_thing][power_throw ? " really hard!" : "."]")) + log_message("has thrown [thrown_thing] [power_throw ? "really hard" : ""]", LOG_ATTACK) + newtonian_move(get_dir(target, src)) + thrown_thing.safe_throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed + power_throw, src, null, null, null, move_force) /mob/living/carbon/proc/canBeHandcuffed() return FALSE -/mob/living/carbon/Topic(href, href_list) - ..() - if(href_list["embedded_object"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - 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/on_fall() . = ..() loc.handle_fall(src)//it's loc so it doesn't call the mob's handle_fall which does nothing /mob/living/carbon/is_muzzled() + if(!has_mouth()) + return FALSE for (var/obj/item/clothing/clothing in get_equipped_items()) if(clothing.clothing_flags & BLOCKS_SPEECH) return TRUE @@ -226,53 +232,62 @@ return FALSE /mob/living/carbon/resist_buckle() - if(HAS_TRAIT(src, TRAIT_RESTRAINED)) + if(HAS_TRAIT(src, TRAIT_ARMS_RESTRAINED)) changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT var/buckle_cd = 60 SECONDS + if(handcuffed) var/obj/item/restraints/O = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED) buckle_cd = O.breakouttime - visible_message(span_warning("[src] attempts to unbuckle [p_them()]self!"), \ - span_notice("You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)")) + + visible_message( + span_warning("[src] attempts to unbuckle [p_them()]self!"), + span_notice("You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") + + ) + if(do_after(src, src, buckle_cd, timed_action_flags = IGNORE_HELD_ITEM)) if(!buckled) return - buckled.user_unbuckle_mob(src,src) + return !!buckled.user_unbuckle_mob(src,src) else if(src && buckled) to_chat(src, span_warning("You fail to unbuckle yourself!")) else - buckled.user_unbuckle_mob(src,src) + return !!buckled.user_unbuckle_mob(src,src) /mob/living/carbon/resist_fire() adjust_fire_stacks(-5) Paralyze(60, ignore_canstun = TRUE) spin(32,2) - visible_message(span_danger("[src] rolls on the floor, trying to put [p_them()]self out!"), \ - span_notice("You stop, drop, and roll!")) + visible_message( + span_danger("[src] rolls on the floor, trying to put [p_them()]self out!"), \ + span_danger("You hurl yourself to the floor, rolling frantically around!")) sleep(30) - if(fire_stacks <= 0 && !QDELETED(src)) - visible_message(span_danger("[src] successfully extinguishes [p_them()]self!"), \ - span_notice("You extinguish yourself.")) return /mob/living/carbon/resist_restraints() var/obj/item/I = null var/type = 0 + if(handcuffed) I = handcuffed type = 1 + else if(legcuffed) I = legcuffed type = 2 + if(I) if(type == 1) changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT + if(type == 2) changeNext_move(CLICK_CD_RANGE) last_special = world.time + CLICK_CD_RANGE + cuff_resist(I) @@ -280,11 +295,17 @@ if(I.item_flags & BEING_REMOVED) to_chat(src, span_warning("You're already attempting to remove [I]!")) return + if(buckled) + to_chat(src, span_warning("There is no hope for escape.")) + return + I.item_flags |= BEING_REMOVED breakouttime = I.breakouttime + if(!cuff_break) visible_message(span_warning("[src] attempts to remove [I]!")) to_chat(src, span_notice("You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")) + if(do_after(src, src, breakouttime, timed_action_flags = IGNORE_HELD_ITEM)) . = clear_cuffs(I, cuff_break) else @@ -294,6 +315,7 @@ breakouttime = 50 visible_message(span_warning("[src] is trying to break [I]!")) to_chat(src, span_notice("You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)")) + if(do_after(src, src, breakouttime, timed_action_flags = IGNORE_HELD_ITEM)) . = clear_cuffs(I, cuff_break) else @@ -301,67 +323,47 @@ else if(cuff_break == INSTANT_CUFFBREAK) . = clear_cuffs(I, cuff_break) + I.item_flags &= ~BEING_REMOVED -/mob/living/carbon/proc/uncuff() - if (handcuffed) - var/obj/item/W = handcuffed - set_handcuffed(null) - if (buckled?.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - W.plane = initial(W.plane) - changeNext_move(0) - if (legcuffed) - var/obj/item/W = legcuffed - legcuffed = null - update_worn_legcuffs() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - W.plane = initial(W.plane) - changeNext_move(0) - update_equipment_speed_mods() // In case cuffs ever change speed +/mob/living/carbon/proc/remove_handcuffs(new_location, cuff_break, silent) + if(!handcuffed) + return FALSE + + if(!silent) + visible_message(span_danger("[src] manages to [cuff_break ? "break" : "remove"] [handcuffed]!")) + + if(cuff_break) + qdel(handcuffed) + else + transferItemToLoc(handcuffed, new_location, TRUE) + return TRUE + +/mob/living/carbon/proc/remove_legcuffs(new_location, cuff_break, silent) + if(!legcuffed) + return FALSE + + if(!silent) + visible_message(span_danger("[src] manages to [cuff_break ? "break" : "remove"] [legcuffed]!")) + + if(cuff_break) + qdel(legcuffed) + else + transferItemToLoc(legcuffed, new_location, TRUE) + return TRUE /mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break) if(!I.loc || buckled) return FALSE + if(I != handcuffed && I != legcuffed) return FALSE - visible_message(span_danger("[src] manages to [cuff_break ? "break" : "remove"] [I]!")) - to_chat(src, span_notice("You successfully [cuff_break ? "break" : "remove"] [I].")) - if(cuff_break) - . = !((I == handcuffed) || (I == legcuffed)) - qdel(I) - return TRUE + if(I == handcuffed) + return remove_handcuffs(drop_location(), cuff_break) - else - if(I == handcuffed) - handcuffed.forceMove(drop_location()) - set_handcuffed(null) - I.dropped(src) - if(buckled?.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() - return TRUE - if(I == legcuffed) - legcuffed.forceMove(drop_location()) - legcuffed = null - I.dropped(src) - update_worn_legcuffs() - return TRUE + if(I == legcuffed) + return remove_legcuffs(drop_location(), cuff_break) /mob/living/carbon/proc/accident(obj/item/I) if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP)) @@ -423,13 +425,10 @@ if(message) visible_message(span_danger("[src] throws up all over [p_them()]self!"), \ span_userdanger("You throw up all over yourself!")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomitself) distance = 0 else if(message) visible_message(span_danger("[src] throws up!"), span_userdanger("You throw up!")) - if(!isflyperson(src)) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit) if(stun) Paralyze(80) @@ -504,17 +503,11 @@ /mob/living/carbon/updatehealth() if(status_flags & GODMODE) return - var/total_burn = 0 - var/total_brute = 0 - for(var/obj/item/bodypart/BP as anything in bodyparts) //hardcoded to streamline things a bit - total_brute += (BP.brute_dam * BP.body_damage_coeff) - total_burn += (BP.burn_dam * BP.body_damage_coeff) - set_health(round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION)) + set_health(round(maxHealth - getBrainLoss(), DAMAGE_PRECISION)) + update_damage_hud() + update_health_hud() update_stat() - if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD*2) && stat == DEAD ) - become_husk(BURN) - med_hud_set_health() SEND_SIGNAL(src, COMSIG_CARBON_HEALTH_UPDATE) /mob/living/carbon/on_stamina_update() @@ -525,7 +518,7 @@ if((stam < max * STAMINA_EXHAUSTION_THRESHOLD_MODIFIER) && !is_exhausted) ADD_TRAIT(src, TRAIT_EXHAUSTED, STAMINA) ADD_TRAIT(src, TRAIT_NO_SPRINT, STAMINA) - if((stam < max * STAMINA_STUN_THRESHOLD_MODIFIER) && !is_stam_stunned && stat <= SOFT_CRIT) + if((stam < max * STAMINA_STUN_THRESHOLD_MODIFIER) && !is_stam_stunned && stat == CONSCIOUS) stamina_stun() if(is_exhausted && (stam > max * STAMINA_EXHAUSTION_RECOVERY_THRESHOLD_MODIFIER)) REMOVE_TRAIT(src, TRAIT_EXHAUSTED, STAMINA) @@ -558,7 +551,7 @@ if(!isnull(E.lighting_alpha)) lighting_alpha = E.lighting_alpha - if(client.eye != src) + if(client.eye && client.eye != src) var/atom/A = client.eye if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. return @@ -596,6 +589,9 @@ if(SSmapping.level_trait(z, ZTRAIT_NOXRAY)) sight = null + if(!(sight & (SEE_TURFS|SEE_MOBS|SEE_OBJS))) + sight |= SEE_BLACKNESS + return ..() @@ -645,70 +641,43 @@ if(!client) return - if(health <= crit_threshold) + if(health < maxHealth/2) var/severity = 0 - switch(health) - if(-120 to -110) - severity = 1 - if(-130 to -120) - severity = 2 - if(-140 to -130) - severity = 3 - if(-150 to -140) - severity = 4 - if(-150 to -140) - severity = 5 - if(-160 to -150) - severity = 6 - if(-170 to -160) - severity = 7 - if(-190 to -170) - severity = 8 - if(-195 to -190) - severity = 9 - if(-INFINITY to -195) - severity = 10 - if(stat >= UNCONSCIOUS) - var/visionseverity = 4 - switch(health) - if(-115 to -100) - visionseverity = 5 - if(-130 to -115) - visionseverity = 6 - if(-145 to -130) - visionseverity = 7 - if(-160 to -145) - visionseverity = 8 - if(-175 to -160) - visionseverity = 9 - if(-INFINITY to -175) - visionseverity = 10 - overlay_fullscreen("critvision", /atom/movable/screen/fullscreen/crit/vision, visionseverity) + switch(health - maxHealth/2) + if(-20 to -10) severity = 1 + if(-30 to -20) severity = 2 + if(-40 to -30) severity = 3 + if(-50 to -40) severity = 4 + if(-60 to -50) severity = 5 + if(-70 to -60) severity = 6 + if(-80 to -70) severity = 7 + if(-90 to -80) severity = 8 + if(-95 to -90) severity = 9 + if(-INFINITY to -95) severity = 10 + + overlay_fullscreen("crit", /atom/movable/screen/fullscreen/crit/vision, severity) + + if(stat == UNCONSCIOUS) + overlay_fullscreen("critvision", /atom/movable/screen/fullscreen/crit/vision, severity) else clear_fullscreen("critvision") - overlay_fullscreen("crit", /atom/movable/screen/fullscreen/crit, severity) + else clear_fullscreen("crit") clear_fullscreen("critvision") + //Oxygen damage overlay - if(oxyloss) + if(getOxyLoss()) var/severity = 0 - switch(oxyloss) - if(10 to 20) - severity = 1 - if(20 to 25) - severity = 2 - if(25 to 30) - severity = 3 - if(30 to 35) - severity = 4 - if(35 to 40) - severity = 5 - if(40 to 45) - severity = 6 - if(45 to INFINITY) - severity = 7 + switch(getOxyLoss()) + if(10 to 20) severity = 1 + if(20 to 25) severity = 2 + if(25 to 30) severity = 3 + if(30 to 35) severity = 4 + if(35 to 40) severity = 5 + if(40 to 45) severity = 6 + if(45 to INFINITY) severity = 7 overlay_fullscreen("oxy", /atom/movable/screen/fullscreen/oxy, severity) else clear_fullscreen("oxy") @@ -790,11 +759,11 @@ /mob/living/carbon/set_health(new_value) . = ..() - if(. > hardcrit_threshold) - if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)) - ADD_TRAIT(src, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) - else if(health > hardcrit_threshold) - REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) + if(. < crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) + ADD_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION, STAT_TRAIT) + else + REMOVE_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION, STAT_TRAIT) + if(CONFIG_GET(flag/near_death_experience)) if(. > HEALTH_THRESHOLD_NEARDEATH) if(health <= HEALTH_THRESHOLD_NEARDEATH && !HAS_TRAIT(src, TRAIT_NODEATH)) @@ -806,41 +775,37 @@ /mob/living/carbon/update_stat() if(status_flags & GODMODE) return + if(stat != DEAD) - if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) - death() - return - if(health <= hardcrit_threshold && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)) - set_stat(HARD_CRIT) - else if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) + if(HAS_TRAIT(src, TRAIT_KNOCKEDOUT)) set_stat(UNCONSCIOUS) - else if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) - set_stat(SOFT_CRIT) else set_stat(CONSCIOUS) - update_damage_hud() - update_health_hud() - update_stamina_hud() - med_hud_set_status() + med_hud_set_status() //called when we get cuffed/uncuffed /mob/living/carbon/proc/update_handcuffed() + PRIVATE_PROC(TRUE) + if(handcuffed) drop_all_held_items() - stop_pulling() + release_all_grabs() throw_alert(ALERT_HANDCUFFED, /atom/movable/screen/alert/restrained/handcuffed, new_master = src.handcuffed) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) + ADD_TRAIT(src, TRAIT_ARMS_RESTRAINED, HANDCUFFED_TRAIT) else + REMOVE_TRAIT(src, TRAIT_ARMS_RESTRAINED, HANDCUFFED_TRAIT) clear_alert(ALERT_HANDCUFFED) - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "handcuffed") + if(buckled?.buckle_requires_restraints) + buckled.unbuckle_mob(src) + update_mob_action_buttons() //some of our action buttons might be unusable when we're handcuffed. update_worn_handcuffs() update_hud_handcuffed() /mob/living/carbon/heal_and_revive(heal_to = 75, revive_message) // We can't heal them if they're missing a heart - if(needs_heart() && !getorganslot(ORGAN_SLOT_HEART)) + if(needs_organ(ORGAN_SLOT_HEART) && !getorganslot(ORGAN_SLOT_HEART)) return FALSE // We can't heal them if they're missing their lungs @@ -856,11 +821,21 @@ /mob/living/carbon/fully_heal(admin_revive = FALSE) if(reagents) reagents.clear_reagents() + if(touching) + touching.clear_reagents() + if(bloodstream) + bloodstream.clear_reagents() + + shock_stage = 0 + if(mind) for(var/addiction_type in subtypesof(/datum/addiction)) mind.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) //Remove the addiction! + for(var/obj/item/organ/organ as anything in processing_organs) organ.setOrganDamage(0) + organ.set_organ_dead(FALSE) + for(var/thing in diseases) var/datum/disease/D = thing if(D.severity != DISEASE_SEVERITY_POSITIVE) @@ -870,59 +845,34 @@ suiciding = FALSE regenerate_limbs() regenerate_organs() - QDEL_NULL(handcuffed) - QDEL_NULL(legcuffed) - set_handcuffed(null) - update_handcuffed() + remove_handcuffs() + remove_legcuffs() + client?.prefs?.apply_prefs_to(src) + cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) exit_stamina_stun() ..() /mob/living/carbon/can_be_revived() - . = ..() - if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling)) || HAS_TRAIT(src, TRAIT_HUSK)) - return FALSE - -/mob/living/carbon/proc/can_defib() - - - if (suiciding) - return DEFIB_FAIL_SUICIDE - - if (HAS_TRAIT(src, TRAIT_HUSK)) - return DEFIB_FAIL_HUSK - - if (HAS_TRAIT(src, TRAIT_DEFIB_BLACKLISTED)) - return DEFIB_FAIL_BLACKLISTED - - if ((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE)) - return DEFIB_FAIL_TISSUE_DAMAGE + . = TRUE - // Only check for a heart if they actually need a heart. Who would've thunk - if (needs_heart()) - var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - - if (!heart) - return DEFIB_FAIL_NO_HEART - - if (heart.organ_flags & ORGAN_FAILING) - return DEFIB_FAIL_FAILING_HEART - - var/obj/item/organ/brain/current_brain = getorgan(/obj/item/organ/brain) - - if (QDELETED(current_brain)) - return DEFIB_FAIL_NO_BRAIN - - if (current_brain.organ_flags & ORGAN_FAILING) - return DEFIB_FAIL_FAILING_BRAIN + if(HAS_TRAIT(src, TRAIT_HUSK)) + return FALSE - if (current_brain.suicided || current_brain.brainmob?.suiciding) - return DEFIB_FAIL_NO_INTELLIGENCE + if(needs_organ(ORGAN_SLOT_BRAIN) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling))) + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(!B || (B.organ_flags & ORGAN_DEAD)) + return FALSE - if(key && key[1] == "@") // Adminghosts - return DEFIB_NOGRAB_AGHOST + if(needs_organ(ORGAN_SLOT_POSIBRAIN)) + var/obj/item/organ/posibrain/B = getorganslot(ORGAN_SLOT_POSIBRAIN) + if(!B || (B.organ_flags & ORGAN_DEAD)) + return FALSE - return DEFIB_POSSIBLE + if(needs_organ(ORGAN_SLOT_CELL)) + var/obj/item/organ/cell/C = getorganslot(ORGAN_SLOT_CELL) + if(!C || (C.get_percent() == 0)) + return FALSE /mob/living/carbon/harvest(mob/living/user) if(QDELETED(src)) @@ -937,12 +887,12 @@ to_chat(user, span_notice("You retrieve some of [src]\'s internal organs!")) remove_all_embedded_objects() -/mob/living/carbon/proc/create_bodyparts() +/mob/living/carbon/proc/create_bodyparts(list/overrides) var/l_arm_index_next = -1 var/r_arm_index_next = 0 - for(var/bodypart_path in bodyparts) - var/obj/item/bodypart/bodypart_instance = new bodypart_path() - bodypart_instance.set_owner(src) + for(var/obj/item/bodypart/bodypart_path as anything in bodyparts) + var/real_body_part_path = overrides?[initial(bodypart_path.body_zone)] || bodypart_path + var/obj/item/bodypart/bodypart_instance = new real_body_part_path() bodyparts.Remove(bodypart_path) add_bodypart(bodypart_instance) switch(bodypart_instance.body_part) @@ -955,6 +905,7 @@ bodypart_instance.held_index = r_arm_index_next //2, 4, 6, 8... hand_bodyparts += bodypart_instance + sortTim(bodyparts, GLOBAL_PROC_REF(cmp_bodypart_by_body_part_asc)) ///Proc to hook behavior on bodypart additions. Do not directly call. You're looking for [/obj/item/bodypart/proc/attach_limb()]. /mob/living/carbon/proc/add_bodypart(obj/item/bodypart/new_bodypart) @@ -962,6 +913,9 @@ bodyparts += new_bodypart new_bodypart.set_owner(src) + new_bodypart.forceMove(src) + new_bodypart.item_flags |= ABSTRACT + ADD_TRAIT(new_bodypart, TRAIT_INSIDE_BODY, REF(src)) if(new_bodypart.bodypart_flags & BP_IS_MOVEMENT_LIMB) set_num_legs(num_legs + 1) @@ -977,16 +931,18 @@ /mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart) SHOULD_NOT_OVERRIDE(TRUE) + REMOVE_TRAIT(old_bodypart, TRAIT_INSIDE_BODY, REF(src)) bodyparts -= old_bodypart - switch(old_bodypart.body_part) - if(LEG_LEFT, LEG_RIGHT) - set_num_legs(num_legs - 1) - if(!old_bodypart.bodypart_disabled) - set_usable_legs(usable_legs - 1) - if(ARM_LEFT, ARM_RIGHT) - set_num_hands(num_hands - 1) - if(!old_bodypart.bodypart_disabled) - set_usable_hands(usable_hands - 1) + old_bodypart.item_flags &= ~ABSTRACT + if(old_bodypart.bodypart_flags & BP_IS_MOVEMENT_LIMB) + set_num_legs(num_legs - 1) + if(!old_bodypart.bodypart_disabled) + set_usable_legs(usable_legs - 1) + + if(old_bodypart.bodypart_flags & BP_IS_GRABBY_LIMB) + set_num_hands(num_hands - 1) + if(!old_bodypart.bodypart_disabled) + set_usable_hands(usable_hands - 1) /mob/living/carbon/proc/create_internal_organs() @@ -1135,10 +1091,6 @@ return TRUE if(HAS_TRAIT(src, TRAIT_DUMB)) return TRUE - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) - if(mood) - if(mood.sanity < SANITY_UNSTABLE) - return TRUE /mob/living/carbon/wash(clean_types) . = ..() @@ -1169,7 +1121,7 @@ . = TRUE if(ears && !(obscured & ITEM_SLOT_EARS) && ears.wash(clean_types)) - update_inv_ears() + update_worn_ears() . = TRUE if(wear_neck && !(obscured & ITEM_SLOT_NECK) && wear_neck.wash(clean_types)) @@ -1184,6 +1136,13 @@ update_worn_gloves() . = TRUE + if(shoes && !(obscured & ITEM_SLOT_FEET) && shoes.wash(clean_types)) + update_worn_shoes() + . = TRUE + + if(get_permeability_protection() > 0.5) + touching.clear_reagents() + /// if any of our bodyparts are bleeding /mob/living/carbon/proc/is_bleeding() for(var/obj/item/bodypart/part as anything in bodyparts) @@ -1235,16 +1194,14 @@ /// Modifies the handcuffed value if a different value is passed, returning FALSE otherwise. The variable should only be changed through this proc. /mob/living/carbon/proc/set_handcuffed(new_value) + PRIVATE_PROC(TRUE) if(handcuffed == new_value) return FALSE + . = handcuffed handcuffed = new_value - if(.) - if(!handcuffed) - REMOVE_TRAIT(src, TRAIT_RESTRAINED, HANDCUFFED_TRAIT) - else if(handcuffed) - ADD_TRAIT(src, TRAIT_RESTRAINED, HANDCUFFED_TRAIT) + update_handcuffed() /mob/living/carbon/on_lying_down(new_lying_angle) . = ..() @@ -1290,44 +1247,26 @@ if(mob_biotypes & (MOB_ORGANIC|MOB_UNDEAD)) AddComponent(/datum/component/rot, 6 MINUTES, 10 MINUTES, 1) -/mob/living/carbon/proc/disarm_precollide(datum/source, mob/living/carbon/shover, mob/living/carbon/target) - SIGNAL_HANDLER - if(can_be_shoved_into) - return COMSIG_CARBON_ACT_SOLID - -/mob/living/carbon/proc/disarm_collision(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) - SIGNAL_HANDLER - if(src == target || LAZYFIND(target.buckled_mobs, src) || !can_be_shoved_into) - return - target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) - if(shove_resistance() <= 0) - Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) - target.visible_message( - span_danger("[shover] shoves [target.name] into [name]!"), - span_userdanger("You're shoved into [name] by [shover]!"), - span_hear("You hear aggressive shuffling followed by a loud thud!"), - COMBAT_MESSAGE_RANGE, - ///src - ) - ///to_chat(src, span_danger("You shove [target.name] into [name]!")) - log_combat(src, target, "shoved", "into [name]") - return COMSIG_CARBON_SHOVE_HANDLED - // Checks to see how many hands this person has to sign with. /mob/living/carbon/proc/check_signables_state() var/obj/item/bodypart/left_arm = get_bodypart(BODY_ZONE_L_ARM) var/obj/item/bodypart/right_arm = get_bodypart(BODY_ZONE_R_ARM) + var/empty_indexes = get_empty_held_indexes() var/exit_right = (!right_arm || right_arm.bodypart_disabled) var/exit_left = (!left_arm || left_arm.bodypart_disabled) if(length(empty_indexes) == 0 || (length(empty_indexes) < 2 && (exit_left || exit_right)))//All existing hands full, can't sign return SIGN_HANDS_FULL // These aren't booleans + if(exit_left && exit_right)//Can't sign with no arms! return SIGN_ARMLESS + if(handcuffed) // Cuffed, usually will show visual effort to sign return SIGN_CUFFED + if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED) || HAS_TRAIT(src, TRAIT_EMOTEMUTE)) return SIGN_TRAIT_BLOCKED + if(length(empty_indexes) == 1 || exit_left || exit_right) // One arm gone return SIGN_ONE_HAND @@ -1381,9 +1320,9 @@ switch(damtype) if(BRUTE) - return bruteloss < (maxHealth/2) + return getBruteLoss() < (maxHealth/2) if(BURN) - return fireloss < (maxHealth/2) + return getFireLoss() < (maxHealth/2) /mob/living/carbon/proc/get_wounds() RETURN_TYPE(/list) @@ -1391,3 +1330,123 @@ for(var/obj/item/bodypart/BP as anything in bodyparts) if(LAZYLEN(BP.wounds)) . += BP.wounds + +/mob/living/carbon/ZImpactDamage(turf/T, levels) + . = ..() + if(!.) + return + + var/atom/highest + for(var/atom/movable/hurt_atom as anything in T) + if(hurt_atom == src) + continue + if(!hurt_atom.density) + continue + if(isobj(hurt_atom) || ismob(hurt_atom)) + if(hurt_atom.layer > highest?.layer) + highest = hurt_atom + + if(!highest) + return + + if(isobj(highest)) + var/obj/O = highest + if(!O.uses_integrity) + return + O.take_damage(30 * levels) + + if(ismob(highest)) + var/mob/living/L = highest + var/armor = L.run_armor_check(BODY_ZONE_HEAD, BLUNT) + L.apply_damage(15 * levels, blocked = armor, spread_damage = TRUE) + L.Paralyze(10 SECONDS) + + visible_message(span_warning("[src] slams into [highest] from above!")) + +/mob/living/carbon/get_ingested_reagents() + RETURN_TYPE(/datum/reagents) + return getorganslot(ORGAN_SLOT_STOMACH)?.reagents + +///generates realistic-ish pulse output based on preset levels as text +/mob/living/carbon/proc/get_pulse(method) //method 0 is for hands, 1 is for machines, more accurate + var/obj/item/organ/heart/heart_organ = getorganslot(ORGAN_SLOT_HEART) + if(!heart_organ) + // No heart, no pulse + return "0" + + var/bpm = get_pulse_as_number() + if(bpm >= PULSE_MAX_BPM) + return method ? ">[PULSE_MAX_BPM]" : "extremely weak and fast, patient's artery feels like a thread" + + return "[method ? bpm : bpm + rand(-10, 10)]" +// output for machines ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ output for people + +/mob/living/carbon/proc/pulse() + if (stat == DEAD) + return PULSE_NONE + var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) + return H ? H.pulse : PULSE_NONE + +/mob/living/carbon/proc/get_pulse_as_number() + var/obj/item/organ/heart/heart_organ = getorganslot(ORGAN_SLOT_HEART) + if(!heart_organ) + return 0 + + switch(pulse()) + if(PULSE_NONE) + return 0 + if(PULSE_SLOW) + return rand(40, 60) + if(PULSE_NORM) + return rand(60, 90) + if(PULSE_FAST) + return rand(90, 120) + if(PULSE_2FAST) + return rand(120, 160) + if(PULSE_THREADY) + return PULSE_MAX_BPM + return 0 + +//Get fluffy numbers +/mob/living/carbon/proc/get_blood_pressure() + if(HAS_TRAIT(src, TRAIT_FAKEDEATH)) + return "[FLOOR(120+rand(-5,5), 1)*0.25]/[FLOOR(80+rand(-5,5)*0.25, 1)]" + var/blood_result = get_blood_circulation() + return "[FLOOR((120+rand(-5,5))*(blood_result/100), 1)]/[FLOOR((80+rand(-5,5))*(blood_result/100), 1)]" + +/mob/living/carbon/proc/resuscitate() + if(!undergoing_cardiac_arrest()) + return + + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if(istype(heart) && !(heart.organ_flags & ORGAN_DEAD)) + if(!nervous_system_failure()) + visible_message("\The [src] jerks and gasps for breath!") + else + visible_message("\The [src] twitches a bit as \his heart restarts!") + + shock_stage = min(shock_stage, SHOCK_AMT_FOR_FIBRILLATION - 25) + + // Clamp oxy loss to 70 for 200 health mobs. This is a 0.65 modifier for blood oxygenation. + if(getOxyLoss() >= maxHealth * 0.35) + setOxyLoss(maxHealth * 0.35) + + COOLDOWN_START(heart, arrhythmia_grace_period, 10 SECONDS) + heart.Restart() + heart.handle_pulse() + return TRUE + +/mob/living/carbon/proc/nervous_system_failure() + return getBrainLoss() >= maxHealth * 0.75 + +/mob/living/carbon/has_mouth() + var/obj/item/bodypart/head/H = get_bodypart(BODY_ZONE_HEAD) + if(!H?.can_ingest_reagents) + return FALSE + return TRUE + +/mob/living/carbon/dropItemToGround(obj/item/I, force, silent, invdrop, animate = TRUE) + if(I && HAS_TRAIT(I, TRAIT_INSIDE_BODY)) + stack_trace("Something tried to drop an organ or bodypart that isn't allowed to be dropped") + return FALSE + return ..() diff --git a/code/modules/mob/living/carbon/carbon_context.dm b/code/modules/mob/living/carbon/carbon_context.dm index a27ae5f7b3d2..2577f15a55dd 100644 --- a/code/modules/mob/living/carbon/carbon_context.dm +++ b/code/modules/mob/living/carbon/carbon_context.dm @@ -1,7 +1,7 @@ /mob/living/carbon/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - if (!isnull(held_item)) + if (!isnull(held_item) && !(held_item.item_flags & (ABSTRACT|HAND_ITEM))) context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB] = "Offer item" return CONTEXTUAL_SCREENTIP_SET @@ -15,15 +15,12 @@ else if (human_user == src) context[SCREENTIP_CONTEXT_LMB] = "Check injuries" - if (get_bodypart(human_user.zone_selected)?.get_modified_bleed_rate()) - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Grab limb" - if (human_user != src) - context[SCREENTIP_CONTEXT_RMB] = "Shove" + context[SCREENTIP_CONTEXT_RMB] = "Disarm" if (!human_user.combat_mode) if (body_position == STANDING_UP) - if(check_zone(user.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) + if(deprecise_zone(user.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) context[SCREENTIP_CONTEXT_LMB] = "Headpat" else if(user.zone_selected == BODY_ZONE_PRECISE_GROIN && !isnull(getorgan(/obj/item/organ/tail))) context[SCREENTIP_CONTEXT_LMB] = "Pull tail" diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 73e5a858dbe5..0bb410ee9cc3 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -37,6 +37,7 @@ 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 @@ -73,7 +74,7 @@ /mob/living/carbon/attacked_by(obj/item/I, mob/living/user) var/obj/item/bodypart/affecting if(user == src) - affecting = get_bodypart(check_zone(user.zone_selected)) //we're self-mutilating! yay! + affecting = get_bodypart(deprecise_zone(user.zone_selected)) //we're self-mutilating! yay! else var/zone_hit_chance = 80 if(body_position == LYING_DOWN) // half as likely to hit a different zone if they're on the ground @@ -81,27 +82,35 @@ affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance)) if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) affecting = bodyparts[1] + SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, affecting.plaintext_zone, affecting) if(I.stamina_damage) stamina.adjust(-1 * (I.stamina_damage * (prob(I.stamina_critical_chance) ? I.stamina_critical_modifier : 1))) + if(I.force) var/attack_direction = get_dir(user, src) + apply_damage(I.force, I.damtype, affecting, sharpness = I.sharpness, attack_direction = attack_direction) + if(I.damtype == BRUTE && IS_ORGANIC_LIMB(affecting)) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) add_splatter_floor(location) + if(get_dist(user, src) <= 1) //people with TK won't get smeared with blood user.add_mob_blood(src) + if(affecting.body_zone == BODY_ZONE_HEAD) if(wear_mask) wear_mask.add_mob_blood(src) update_worn_mask() + if(wear_neck) wear_neck.add_mob_blood(src) update_worn_neck() + if(head) head.add_mob_blood(src) update_worn_head() @@ -149,13 +158,7 @@ if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) ContactContractDisease(D) - for(var/datum/surgery/S in surgeries) - if(body_position == LYING_DOWN || !S.lying_required) - if(!user.combat_mode) - if(S.next_step(user, modifiers)) - return TRUE - - return FALSE + return . || FALSE /mob/living/carbon/attack_paw(mob/living/carbon/human/user, list/modifiers) @@ -238,27 +241,53 @@ do_attack_animation(target, ATTACK_EFFECT_DISARM) playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + if (ishuman(target)) var/mob/living/carbon/human/human_target = target - human_target.w_uniform?.add_fingerprint(src) + human_target.add_fingerprint_on_clothing_or_self(src, BODY_ZONE_CHEST) SEND_SIGNAL(target, COMSIG_HUMAN_DISARM_HIT, src, zone_selected) - var/shove_dir = get_dir(loc, target.loc) - var/turf/target_shove_turf = get_step(target.loc, shove_dir) - var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied - var/turf/target_old_turf = target.loc - - //Are we hitting anything? or - if(SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_PRESHOVE) & COMSIG_CARBON_ACT_SOLID) - shove_blocked = TRUE - else - target.Move(target_shove_turf, shove_dir) - if(get_turf(target) == target_old_turf) + + var/list/holding = list(target.get_active_held_item() = 60, target.get_inactive_held_item() = 30) + + var/roll = stat_roll(10, /datum/rpg_skill/skirmish).outcome + + //Handle unintended consequences + for(var/obj/item/I in holding) + var/hurt_prob = holding[I] + if(prob(hurt_prob) && I.on_disarm_attempt(target, src)) + return + + if(roll == CRIT_SUCCESS) + var/shove_dir = get_dir(loc, target.loc) + var/turf/target_shove_turf = get_step(target.loc, shove_dir) + var/shove_blocked = FALSE //Used to check if a shove is blocked so that if it is knockdown logic can be applied + + var/directional_blocked = FALSE + var/can_hit_something = !target.buckled + + //Are we hitting anything? or + if(!target.Move(target_shove_turf, shove_dir)) shove_blocked = TRUE + if(!can_hit_something) + //Don't hit people through windows, ok? + if(!directional_blocked && SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_COLLIDE, src, target, shove_blocked) & COMSIG_CARBON_SHOVE_HANDLED) + return + + target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.visible_message( + span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), + span_userdanger("You're knocked down from a shove by [name]!"), + span_hear("You hear aggressive shuffling followed by a loud thud!"), + COMBAT_MESSAGE_RANGE, + ) + log_combat(src, target, "shoved", "knocking them down") + target.release_all_grabs() + return + if(target.IsKnockdown()) //KICK HIM IN THE NUTS //That is harm intent. - target.apply_damage(STAMINA_DISARM_DMG * 4, STAMINA, BODY_ZONE_CHEST, spread_damage = TRUE) - target.adjustOxyLoss(10) //Knock the wind right out of his sails + target.apply_damage(STAMINA_DISARM_DMG * 4, STAMINA, BODY_ZONE_CHEST) target.visible_message( span_danger("[name] kicks [target.name] in [target.p_their()] chest, knocking the wind out of them!"), span_danger("[name] kicks [target.name] in [target.p_their()] chest, knocking the wind out of them!"), @@ -267,66 +296,32 @@ //src ) - //to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) - log_combat(src, target, "kicks", "in the chest") - - var/directional_blocked = FALSE - var/can_hit_something = ((target.shove_resistance() < 0) && !target.buckled) - - //Directional checks to make sure that we're not shoving through a windoor or something like that - if(shove_blocked && can_hit_something && (shove_dir in GLOB.cardinals)) - var/target_turf = get_turf(target) - for(var/obj/obj_content in target_turf) - if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == shove_dir && obj_content.density) - directional_blocked = TRUE - break - if(target_turf != target_shove_turf && !directional_blocked) //Make sure that we don't run the exact same check twice on the same tile - for(var/obj/obj_content in target_shove_turf) - if(obj_content.flags_1 & ON_BORDER_1 && obj_content.dir == turn(shove_dir, 180) && obj_content.density) - directional_blocked = TRUE - break - - if(can_hit_something) - //Don't hit people through windows, ok? - if(!directional_blocked && SEND_SIGNAL(target_shove_turf, COMSIG_CARBON_DISARM_COLLIDE, src, target, shove_blocked) & COMSIG_CARBON_SHOVE_HANDLED) - return - if(directional_blocked || shove_blocked) - target.Knockdown(SHOVE_KNOCKDOWN_SOLID) - target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), - span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) - to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) - log_combat(src, target, "shoved", "knocking them down") - return + log_combat(src, target, "kicks", addition = "dealing stam/oxy damage") + return target.visible_message( - span_danger("[name] shoves [target.name]!"), - span_userdanger("You're shoved by [name]!"), + span_danger("[name] shoves [target.name]!"), + null, span_hear("You hear aggressive shuffling!"), COMBAT_MESSAGE_RANGE, - //src ) - //to_chat(src, span_danger("You shove [target.name]!")) var/append_message = "" - //Roll disarm chance based on the target's missing stamina - var/disarm_success_chance = target.stamina.loss_as_percent/2 - if(prob(disarm_success_chance) && length(target.held_items)) + + if(roll >= SUCCESS && length(target.held_items)) var/list/dropped = list() - for(var/obj/item/I as anything in target.held_items) + for(var/obj/item/I in target.held_items) if(target.dropItemToGround(I)) target.visible_message( - span_danger("[target] loses [target.p_their()] grip on [I]"), - span_userdanger("You drop [I]!"), + span_warning("[target] loses [target.p_their()] grip on [I]."), + null, null, COMBAT_MESSAGE_RANGE ) dropped += I append_message = "causing them to drop [length(dropped) ? english_list(dropped) : "nothing"]" - log_combat(src, target, "shoved", append_message) - -/mob/living/carbon/proc/shove_resistance() - . = 0 + log_combat(src, target, "shoved", addition = append_message) /mob/living/carbon/proc/clear_shove_slowdown() remove_movespeed_modifier(/datum/movespeed_modifier/shove) @@ -355,13 +350,13 @@ return //Propagation through pulling, fireman carry if(!(flags & SHOCK_ILLUSION)) - if(undergoing_cardiac_arrest()) - set_heartattack(FALSE) + if(undergoing_cardiac_arrest() && resuscitate()) + log_health(src, "Heart restarted due to elecrocution.") + var/list/shocking_queue = list() - if(iscarbon(pulling) && source != pulling) - shocking_queue += pulling - if(iscarbon(pulledby) && source != pulledby) - shocking_queue += pulledby + shocking_queue += get_all_grabbed_movables() + shocking_queue -= source + if(iscarbon(buckled) && source != buckled) shocking_queue += buckled for(var/mob/living/carbon/carried in buckled_mobs) @@ -387,6 +382,34 @@ if(should_stun) Paralyze(60) +/mob/living/carbon/proc/share_blood_on_touch(mob/living/carbon/human/who_touched_us) + return + +/// Place blood onto us if the toucher has blood on their hands or clothing. messy_slots deteremines what slots to bloody. +/mob/living/carbon/human/share_blood_on_touch(mob/living/carbon/human/who_touched_us, messy_slots = ITEM_SLOT_ICLOTHING|ITEM_SLOT_OCLOTHING) + if(!istype(who_touched_us) || !messy_slots) + return + + // Find out what is touching us so we can put blood onto them + var/obj/item/clothing/covering_torso = get_item_covering_zone(BODY_ZONE_CHEST) + if(covering_torso) + who_touched_us.add_blood_DNA_to_items(covering_torso.return_blood_DNA(), ITEM_SLOT_GLOVES) + else + who_touched_us.add_blood_DNA_to_items(return_blood_DNA(), ITEM_SLOT_GLOVES) + + // Take blood from their hands/gloves + var/given_blood = FALSE + for(var/obj/item/thing as anything in who_touched_us.get_equipped_items()) + if((thing.body_parts_covered & HANDS) && prob(thing.blood_DNA_length() * 25)) + add_blood_DNA_to_items(thing.return_blood_DNA(), messy_slots) + given_blood = TRUE + break + + if(!given_blood && prob(who_touched_us.blood_in_hands * who_touched_us.blood_DNA_length() * 10)) + add_blood_DNA_to_items(who_touched_us.return_blood_DNA(), messy_slots) + who_touched_us.blood_in_hands -= 1 + who_touched_us.update_worn_gloves() + /mob/living/carbon/proc/help_shake_act(mob/living/carbon/helper) if(on_fire) to_chat(helper, span_warning("You can't put [p_them()] out with just your bare hands!")) @@ -407,7 +430,9 @@ null, span_hear("You hear the rustling of clothes."), DEFAULT_MESSAGE_RANGE, list(helper, src)) to_chat(helper, span_notice("You shake [src] trying to pick [p_them()] up!")) to_chat(src, span_notice("[helper] shakes you to get you up!")) - else if(check_zone(helper.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) //Headpats! + share_blood_on_touch(helper, ITEM_SLOT_OCLOTHING | ITEM_SLOT_ICLOTHING) + + else if(deprecise_zone(helper.zone_selected) == BODY_ZONE_HEAD && get_bodypart(BODY_ZONE_HEAD)) //Headpats! helper.visible_message(span_notice("[helper] gives [src] a pat on the head to make [p_them()] feel better!"), \ null, span_hear("You hear a soft patter."), DEFAULT_MESSAGE_RANGE, list(helper, src)) to_chat(helper, span_notice("You give [src] a pat on the head to make [p_them()] feel better!")) @@ -415,6 +440,7 @@ if(HAS_TRAIT(src, TRAIT_BADTOUCH)) to_chat(helper, span_warning("[src] looks visibly upset as you pat [p_them()] on the head.")) + share_blood_on_touch(helper, ITEM_SLOT_HEAD|ITEM_SLOT_MASK) else if ((helper.zone_selected == BODY_ZONE_PRECISE_GROIN) && !isnull(src.getorgan(/obj/item/organ/tail))) helper.visible_message(span_notice("[helper] pulls on [src]'s tail!"), \ @@ -433,15 +459,6 @@ // Warm them up with hugs share_bodytemperature(helper) - // No moodlets for people who hate touches - if(!HAS_TRAIT(src, TRAIT_BADTOUCH)) - if(bodytemperature > helper.bodytemperature) - if(!HAS_TRAIT(helper, TRAIT_BADTOUCH)) - SEND_SIGNAL(helper, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, src) // Hugger got a warm hug (Unless they hate hugs) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug) // Reciver always gets a mood for being hugged - else - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/warmhug, helper) // You got a warm hug - // Let people know if they hugged someone really warm or really cold if(helper.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) to_chat(src, span_warning("It feels like [helper] is over heating as [helper.p_they()] hug[helper.p_s()] you.")) @@ -453,14 +470,6 @@ else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT) to_chat(helper, span_warning("It feels like [src] is freezing as you hug [p_them()].")) - if(HAS_TRAIT(helper, TRAIT_FRIENDLY)) - var/datum/component/mood/hugger_mood = helper.GetComponent(/datum/component/mood) - if (hugger_mood.sanity >= SANITY_GREAT) - new /obj/effect/temp_visual/heart(loc) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, helper) - else if (hugger_mood.sanity >= SANITY_DISTURBED) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/betterhug, helper) - if(HAS_TRAIT(src, TRAIT_BADTOUCH)) to_chat(helper, span_warning("[src] looks visibly upset as you hug [p_them()].")) @@ -522,7 +531,7 @@ else if (damage == 2) to_chat(src, span_warning("Your eyes burn.")) - eyes.applyOrganDamage(rand(2, 4)) + eyes.applyOrganDamage(rand(4, 6)) else if( damage >= 3) to_chat(src, span_warning("Your eyes itch and burn severely!")) @@ -596,117 +605,25 @@ if(hit_clothes) hit_clothes.take_damage(damage_amount, damage_type, damage_flag, 0) -/mob/living/carbon/can_hear() +/mob/living/carbon/can_hear(ignore_stat) . = FALSE - var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) - if(ears && !HAS_TRAIT(src, TRAIT_DEAF)) - . = TRUE - if(health <= hardcrit_threshold) - . = FALSE + var/has_deaf_trait = ignore_stat ? HAS_TRAIT_NOT_FROM(src, TRAIT_DEAF, STAT_TRAIT) : HAS_TRAIT(src, TRAIT_DEAF) + if(HAS_TRAIT(src, TRAIT_NOEARS) && !has_deaf_trait) + return TRUE -/mob/living/carbon/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - check_passout(.) + var/obj/item/organ/ears/ears = getorganslot(ORGAN_SLOT_EARS) + if(ears && !has_deaf_trait) + . = TRUE /mob/living/carbon/proc/get_interaction_efficiency(zone) var/obj/item/bodypart/limb = get_bodypart(zone) if(!limb) return -/mob/living/carbon/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - check_passout(.) - -/** -* Check to see if we should be passed out from oyxloss -*/ -/mob/living/carbon/proc/check_passout(oxyloss) - if(!isnum(oxyloss)) - return - if(oxyloss <= 50) - if(getOxyLoss() > 50) - ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - else if(getOxyLoss() <= 50) - REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) - /mob/living/carbon/get_organic_health() . = health for (var/_limb in bodyparts) var/obj/item/bodypart/limb = _limb if (!IS_ORGANIC_LIMB(limb)) - . += (limb.brute_dam * limb.body_damage_coeff) + (limb.burn_dam * limb.body_damage_coeff) - -/mob/living/carbon/grabbedby(mob/living/carbon/user, supress_message = FALSE) - if(user != src) - return ..() - - var/obj/item/bodypart/grasped_part = get_bodypart(zone_selected) - if(!grasped_part?.get_modified_bleed_rate()) - return - var/starting_hand_index = active_hand_index - if(starting_hand_index == grasped_part.held_index) - to_chat(src, span_danger("You can't grasp your [grasped_part.name] with itself!")) - return - - to_chat(src, span_warning("You try grasping at your [grasped_part.name], trying to stop the bleeding...")) - if(!do_after(src, time = 0.75 SECONDS)) - to_chat(src, span_danger("You fail to grasp your [grasped_part.name].")) - return - - var/obj/item/hand_item/self_grasp/grasp = new - if(starting_hand_index != active_hand_index || !put_in_active_hand(grasp)) - to_chat(src, span_danger("You fail to grasp your [grasped_part.name].")) - QDEL_NULL(grasp) - return - grasp.grasp_limb(grasped_part) - -/// an abstract item representing you holding your own limb to staunch the bleeding, see [/mob/living/carbon/proc/grabbedby] will probably need to find somewhere else to put this. -/obj/item/hand_item/self_grasp - name = "self-grasp" - desc = "Sometimes all you can do is slow the bleeding." - icon_state = "latexballon" - inhand_icon_state = "nothing" - slowdown = 0.5 - item_flags = DROPDEL | ABSTRACT | NOBLUDGEON | SLOWS_WHILE_IN_HAND | HAND_ITEM - /// The bodypart we're staunching bleeding on, which also has a reference to us in [/obj/item/bodypart/var/grasped_by] - var/obj/item/bodypart/grasped_part - /// The carbon who owns all of this mess - var/mob/living/carbon/user - -/obj/item/hand_item/self_grasp/Destroy() - if(user) - to_chat(user, span_warning("You stop holding onto your[grasped_part ? " [grasped_part.name]" : "self"].")) - UnregisterSignal(user, COMSIG_PARENT_QDELETING) - if(grasped_part) - UnregisterSignal(grasped_part, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_PARENT_QDELETING)) - grasped_part.grasped_by = null - grasped_part.refresh_bleed_rate() - grasped_part = null - user = null - return ..() - -/// The limb or the whole damn person we were grasping got deleted or dismembered, so we don't care anymore -/obj/item/hand_item/self_grasp/proc/qdel_void() - SIGNAL_HANDLER - qdel(src) - -/// We've already cleared that the bodypart in question is bleeding in [the place we create this][/mob/living/carbon/proc/grabbedby], so set up the connections -/obj/item/hand_item/self_grasp/proc/grasp_limb(obj/item/bodypart/grasping_part) - user = grasping_part.owner - if(!istype(user)) - stack_trace("[src] attempted to try_grasp() with [istype(user, /datum) ? user.type : isnull(user) ? "null" : user] user") - qdel(src) - return - - grasped_part = grasping_part - grasped_part.grasped_by = src - grasped_part.refresh_bleed_rate() - RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(qdel_void)) - RegisterSignal(grasped_part, list(COMSIG_CARBON_REMOVE_LIMB, COMSIG_PARENT_QDELETING), PROC_REF(qdel_void)) - - user.visible_message(span_danger("[user] grasps at [user.p_their()] [grasped_part.name], trying to stop the bleeding."), span_notice("You grab hold of your [grasped_part.name] tightly."), vision_distance=COMBAT_MESSAGE_RANGE) - playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) - return TRUE - -#undef SHAKE_ANIMATION_OFFSET + . += (limb.brute_dam) + (limb.burn_dam) diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index a5f3fc5f83f3..d0c432063b55 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -1,8 +1,13 @@ /mob/living/carbon + maxHealth = 200 blood_volume = BLOOD_VOLUME_NORMAL gender = MALE //pressure_resistance = 15 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD,GLAND_HUD) + hud_possible = list( + HEALTH_HUD = 'icons/mob/huds/med_hud.dmi', + STATUS_HUD = 'icons/mob/huds/hud.dmi', + GLAND_HUD = 'icons/mob/huds/hud.dmi', + ) has_limbs = TRUE held_items = list(null, null) num_legs = 0 //Populated on init through list/bodyparts @@ -22,6 +27,10 @@ ///A list of organs that process, used to keep life() fast! var/list/obj/item/organ/processing_organs = list() + /// Bloodstream reagents + var/datum/reagents/bloodstream = null + /// Surface level reagents + var/datum/reagents/touching = null ///Can't talk. Value goes down every life proc. NOTE TO FUTURE CODERS: DO NOT INITIALIZE NUMERICAL VARS AS NULL OR I WILL MURDER YOU. var/silent = 0 ///How many dream images we have left to send @@ -42,6 +51,8 @@ var/obj/item/clothing/mask/wear_mask = null var/obj/item/clothing/neck/wear_neck = null var/obj/item/tank/internal = null + /// "External" air tank. Never set this manually. Not required to stay directly equipped on the mob (i.e. could be a machine or MOD suit module). + var/obj/item/tank/external = null var/obj/item/clothing/head = null ///only used by humans @@ -53,6 +64,9 @@ ///only used by humans. var/obj/item/clothing/ears = null + /// A compilation of all equipped items 'flags_inv' vars. + var/obscured_slots = NONE + /// Carbon var/datum/dna/dna = null ///last mind to control this mob, for blood-based cloning @@ -114,6 +128,9 @@ var/sprinting = FALSE ///How many tiles we have continuously moved in the same direction var/sustained_moves = 0 - + //stores flavor text here. + var/examine_text = "" COOLDOWN_DECLARE(bleeding_message_cd) + COOLDOWN_DECLARE(blood_spray_cd) + COOLDOWN_DECLARE(breath_sound_cd) diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 5e92611ec84f..cb321efeed7c 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -6,19 +6,27 @@ ..() return loc.handle_slip(src, knockdown_amount, slipped_on, lube_flags, paralyze, force_drop) -/mob/living/carbon/Move(NewLoc, direct) +/mob/living/carbon/Move(NewLoc, direct, glide_size_override, z_movement_flags) . = ..() if(!(usr == src)) return - if(. && !(movement_type & FLOATING)) //floating is easy - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous - else if(nutrition && stat != DEAD) - if(m_intent == MOVE_INTENT_WALK) - adjust_nutrition(-HUNGER_LOSS_WALK) - else - adjust_nutrition(-HUNGER_LOSS_RUN) + if(!. || (movement_type & FLOATING)) //floating is easy + return + + if(isipc(src)) + var/obj/item/organ/cell/C = getorganslot(ORGAN_SLOT_CELL) + if(C) + C.use(C.get_power_drain(), TRUE) + return + + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + set_nutrition(NUTRITION_LEVEL_FED - 1) //just less than feeling vigorous + else if(nutrition && stat != DEAD) + if(m_intent == MOVE_INTENT_WALK) + adjust_nutrition(-HUNGER_LOSS_WALK) + else + adjust_nutrition(-HUNGER_LOSS_RUN) /mob/living/carbon/set_usable_legs(new_value) . = ..() @@ -67,6 +75,6 @@ if(!usable_hands) ADD_TRAIT(src, TRAIT_IMMOBILIZED, LACKING_LOCOMOTION_APPENDAGES_TRAIT) if(limbless_slowdown) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, slowdown = limbless_slowdown) else remove_movespeed_modifier(/datum/movespeed_modifier/limbless) diff --git a/code/modules/mob/living/carbon/carbon_say.dm b/code/modules/mob/living/carbon/carbon_say.dm index b8fa855b3cae..a99a9ec63344 100644 --- a/code/modules/mob/living/carbon/carbon_say.dm +++ b/code/modules/mob/living/carbon/carbon_say.dm @@ -11,17 +11,17 @@ /mob/living/carbon/can_speak_vocal(message) if(silent) - if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) - return ..() - else - return FALSE + return FALSE + if(HAS_TRAIT(src, TRAIT_EXHAUSTED)) return FALSE + return ..() -/mob/living/carbon/could_speak_language(datum/language/language) - var/obj/item/organ/tongue/T = getorganslot(ORGAN_SLOT_TONGUE) - if(T) - return T.could_speak_language(language) - else - return initial(language.flags) & TONGUELESS_SPEECH +/mob/living/carbon/can_speak_sign() + return usable_hands > 0 + +/mob/living/carbon/get_message_mods(message, list/mods) + . = ..() + if(CHEM_EFFECT_MAGNITUDE(src, CE_VOICELOSS) && !mods[WHISPER_MODE]) + mods[WHISPER_MODE] = MODE_WHISPER diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm index f19b337ec503..a7310a27755b 100644 --- a/code/modules/mob/living/carbon/carbon_update_icons.dm +++ b/code/modules/mob/living/carbon/carbon_update_icons.dm @@ -14,7 +14,7 @@ if(slot_flags & ITEM_SLOT_ID) update_worn_id() if(slot_flags & ITEM_SLOT_EARS) - update_inv_ears() + update_worn_ears() if(slot_flags & ITEM_SLOT_EYES) update_worn_glasses() if(slot_flags & ITEM_SLOT_GLOVES) @@ -29,8 +29,11 @@ update_worn_undersuit() if(slot_flags & ITEM_SLOT_SUITSTORE) update_suit_storage() - if(slot_flags & ITEM_SLOT_LPOCKET || slot_flags & ITEM_SLOT_RPOCKET) + if(slot_flags & (ITEM_SLOT_LPOCKET|ITEM_SLOT_RPOCKET)) update_pockets() + if(slot_flags & ITEM_SLOT_HANDS) + update_held_items() + //IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. /mob/living/carbon/perform_update_transform() @@ -56,7 +59,7 @@ if(changed) SEND_SIGNAL(src, COMSIG_PAUSE_FLOATING_ANIM, 0.3 SECONDS) - animate(src, transform = ntransform, time = (lying_prev == 0 || lying_angle == 0) ? 2 : 0, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT)) + z_animate(src, transform = ntransform, time = (lying_prev == 0 || lying_angle == 0) ? 2 : 0, pixel_y = final_pixel_y, dir = final_dir, easing = (EASE_IN|EASE_OUT)) /mob/living/carbon var/list/overlays_standing[TOTAL_LAYERS] @@ -64,20 +67,17 @@ /mob/living/carbon/proc/apply_overlay(cache_index) if((. = overlays_standing[cache_index])) add_overlay(.) + SEND_SIGNAL(src, COMSIG_CARBON_APPLY_OVERLAY, cache_index, .) /mob/living/carbon/proc/remove_overlay(cache_index) var/I = overlays_standing[cache_index] if(I) cut_overlay(I) overlays_standing[cache_index] = null - -//used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body. -/mob/living/carbon/human/proc/update_mutant_bodyparts() - dna.species.handle_mutant_bodyparts(src) - update_body_parts() + SEND_SIGNAL(src, COMSIG_CARBON_REMOVE_OVERLAY, cache_index, I) /mob/living/carbon/update_body(is_creating = FALSE) - dna.species.handle_body(src) //This calls `handle_mutant_bodyparts` which calls `update_mutant_bodyparts()`. Don't double call! + dna.species.handle_body(src) update_body_parts(is_creating) /mob/living/carbon/regenerate_icons() @@ -101,13 +101,13 @@ 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(length(observers)) + if(LAZYLEN(observers)) for(var/mob/dead/observe as anything in observers) if(observe.client && observe.client.eye == src) observe.client.screen += I else observers -= observe - if(!observers.len) + if(!length(observers)) observers = null break @@ -115,7 +115,7 @@ if(get_held_index_of_item(I) % 2 == 0) icon_file = I.righthand_file - hands += I.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + hands += I.build_worn_icon(src, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) overlays_standing[HANDS_LAYER] = hands apply_overlay(HANDS_LAYER) @@ -123,17 +123,21 @@ /mob/living/carbon/update_damage_overlays() remove_overlay(DAMAGE_LAYER) - var/mutable_appearance/damage_overlay = mutable_appearance('icons/mob/dam_mob.dmi', "blank", -DAMAGE_LAYER) - overlays_standing[DAMAGE_LAYER] = damage_overlay + var/list/overlays = list() for(var/obj/item/bodypart/iter_part as anything in bodyparts) - if(iter_part.dmg_overlay_type) + if(iter_part.is_stump) + continue + + if(iter_part.icon_dmg_overlay && !iter_part.is_husked) if(iter_part.brutestate) - damage_overlay.add_overlay("[iter_part.dmg_overlay_type]_[iter_part.body_zone]_[iter_part.brutestate]0") //we're adding icon_states of the base image as overlays + overlays += image(iter_part.icon_dmg_overlay, "[iter_part.body_zone]_[iter_part.brutestate]0", -DAMAGE_LAYER) //we're adding icon_states of the base image as overlays if(iter_part.burnstate) - damage_overlay.add_overlay("[iter_part.dmg_overlay_type]_[iter_part.body_zone]_0[iter_part.burnstate]") + overlays += image(iter_part.icon_dmg_overlay, "[iter_part.body_zone]_0[iter_part.burnstate]", -DAMAGE_LAYER) - apply_overlay(DAMAGE_LAYER) + overlays_standing[DAMAGE_LAYER] = overlays + if(length(overlays)) + apply_overlay(DAMAGE_LAYER) /mob/living/carbon/update_wound_overlays() remove_overlay(WOUND_LAYER) @@ -159,7 +163,7 @@ if(wear_mask) if(!(check_obscured_slots() & ITEM_SLOT_MASK)) - overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') + overlays_standing[FACEMASK_LAYER] = wear_mask.build_worn_icon(src, src, default_layer = FACEMASK_LAYER, default_icon_file = 'icons/mob/clothing/mask.dmi') update_hud_wear_mask(wear_mask) apply_overlay(FACEMASK_LAYER) @@ -173,7 +177,7 @@ if(wear_neck) if(!(check_obscured_slots() & ITEM_SLOT_NECK)) - overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi') + overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(src, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/clothing/neck.dmi') update_hud_neck(wear_neck) apply_overlay(NECK_LAYER) @@ -186,7 +190,7 @@ inv.update_appearance() if(back) - overlays_standing[BACK_LAYER] = back.build_worn_icon(default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi') + overlays_standing[BACK_LAYER] = back.build_worn_icon(src, default_layer = BACK_LAYER, default_icon_file = 'icons/mob/clothing/back.dmi') update_hud_back(back) apply_overlay(BACK_LAYER) @@ -202,7 +206,7 @@ inv.update_appearance() if(head) - overlays_standing[HEAD_LAYER] = head.build_worn_icon(default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi') + overlays_standing[HEAD_LAYER] = head.build_worn_icon(src, default_layer = HEAD_LAYER, default_icon_file = 'icons/mob/clothing/head.dmi') update_hud_head(head) apply_overlay(HEAD_LAYER) @@ -250,7 +254,7 @@ //Overlays for the worn overlay so you can overlay while you overlay //eg: ammo counters, primed grenade flashing, etc. //"icon_file" is used automatically for inhands etc. to make sure it gets the right inhand file -/obj/item/proc/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) +/obj/item/proc/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE, icon_file) SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/list) @@ -262,13 +266,14 @@ ///Checks to see if any bodyparts need to be redrawn, then does so. update_limb_data = TRUE redraws the limbs to conform to the owner. /mob/living/carbon/proc/update_body_parts(update_limb_data) - update_damage_overlays() update_wound_overlays() update_eyes(update_limb_data) var/list/needs_update = list() var/limb_count_update = FALSE for(var/obj/item/bodypart/limb as anything in bodyparts) + if(limb.is_stump) + continue limb.update_limb(is_creating = update_limb_data) //Update limb actually doesn't do much, get_limb_icon is the cpu eater. var/old_key = icon_render_keys?[limb.body_zone] //Checks the mob's icon render key list for the bodypart @@ -287,21 +292,26 @@ return //GENERATE NEW LIMBS + remove_overlay(BODYPARTS_LAYER) var/list/new_limbs = list() for(var/obj/item/bodypart/limb as anything in bodyparts) + if(limb.is_stump) + continue if(limb in needs_update) var/list/limb_overlays = limb.get_limb_overlays() GLOB.limb_overlays_cache[icon_render_keys[limb.body_zone]] = limb_overlays new_limbs += limb_overlays else new_limbs += GLOB.limb_overlays_cache[icon_render_keys[limb.body_zone]] - remove_overlay(BODYPARTS_LAYER) if(new_limbs.len) overlays_standing[BODYPARTS_LAYER] = new_limbs apply_overlay(BODYPARTS_LAYER) +/mob/living/carbon/add_overlay(list/add_overlays) + . = ..() + ///Update the eye sprite on the carbon. Calling with refresh = TRUE will update the sprite information of the eye organ first. /mob/living/carbon/proc/update_eyes(refresh = TRUE) remove_overlay(EYE_LAYER) diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index c8320c76bec6..bd1166e92fe2 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -13,7 +13,7 @@ else if(!def_zone) def_zone = ran_zone(def_zone) - BP = get_bodypart(check_zone(def_zone)) + BP = get_bodypart(deprecise_zone(def_zone)) if(!BP) BP = bodyparts[1] @@ -21,14 +21,12 @@ switch(damagetype) if(BRUTE) if(BP) - if(BP.receive_damage(damage_amount, 0, sharpness = sharpness)) - update_damage_overlays() + BP.receive_damage(damage_amount, 0, sharpness = sharpness) else //no bodypart, we deal damage with a more general method. adjustBruteLoss(damage_amount, forced = forced) if(BURN) if(BP) - if(BP.receive_damage(0, damage_amount, sharpness = sharpness)) - update_damage_overlays() + BP.receive_damage(0, damage_amount, sharpness = sharpness) else adjustFireLoss(damage_amount, forced = forced) if(TOX) @@ -45,15 +43,17 @@ //These procs fetch a cumulative total damage from all bodyparts /mob/living/carbon/getBruteLoss() var/amount = 0 - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X + for(var/obj/item/bodypart/BP as anything in bodyparts) + if(!IS_ORGANIC_LIMB(BP)) + continue amount += BP.brute_dam return amount /mob/living/carbon/getFireLoss() var/amount = 0 - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X + for(var/obj/item/bodypart/BP as anything in bodyparts) + if(!IS_ORGANIC_LIMB(BP)) + continue amount += BP.burn_dam return amount @@ -62,7 +62,7 @@ if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) - take_overall_damage(amount, 0, updating_health, required_status) + take_overall_damage(amount, 0, updating_health, required_status, modifiers = NONE) else heal_overall_damage(abs(amount), 0, required_status ? required_status : BODYTYPE_ORGANIC, updating_health) return amount @@ -71,23 +71,63 @@ if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) - take_overall_damage(0, amount, updating_health, required_status) + take_overall_damage(0, amount, updating_health, required_status, modifiers = FALSE) else heal_overall_damage(0, abs(amount), required_status ? required_status : BODYTYPE_ORGANIC, updating_health) return amount /mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) + if(!amount) + return + var/heal = amount < 0 if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage amount = -amount if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) - if(amount > 0) - blood_volume = max(blood_volume - (5*amount), 0) + if(!heal) + adjustBloodVolume(-5 * amount) else - blood_volume = max(blood_volume - amount, 0) + adjustBloodVolume(-amount) + else if(HAS_TRAIT(src, TRAIT_TOXIMMUNE)) //Prevents toxin damage, but not healing amount = min(amount, 0) - return ..() + + if(!heal) //Not a toxin lover + amount *= (1 - (CHEM_EFFECT_MAGNITUDE(src, CE_ANTITOX) * 0.25)) || 1 + + var/list/pick_organs = shuffle(processing_organs) + // Prioritize damaging our filtration organs first. + var/obj/item/organ/kidneys/kidneys = organs_by_slot[ORGAN_SLOT_KIDNEYS] + if(kidneys) + pick_organs -= kidneys + pick_organs.Insert(1, kidneys) + var/obj/item/organ/liver/liver = organs_by_slot[ORGAN_SLOT_LIVER] + if(liver) + pick_organs -= liver + pick_organs.Insert(1, liver) + + // Move the brain to the very end since damage to it is vastly more dangerous + // (and isn't technically counted as toxloss) than general organ damage. + var/obj/item/organ/brain/brain = organs_by_slot[ORGAN_SLOT_BRAIN] + if(brain) + pick_organs -= brain + pick_organs += brain + + for(var/obj/item/organ/O as anything in pick_organs) + if(heal) + if(amount >= 0) + break + else if(amount <= 0) + break + + amount -= O.applyOrganDamage(amount, silent = TRUE, updating_health = FALSE) + + if(updating_health) + updatehealth() + +/mob/living/carbon/getToxLoss() + for(var/obj/item/organ/O as anything in processing_organs) + . += O.getToxLoss() /mob/living/carbon/pre_stamina_change(diff as num, forced) if(!forced && (status_flags & GODMODE)) @@ -102,10 +142,10 @@ * * amount - damage to be done * * maximum - currently an arbitrarily large number, can be set so as to limit damage */ -/mob/living/carbon/adjustOrganLoss(slot, amount, maximum) +/mob/living/carbon/adjustOrganLoss(slot, amount, maximum, updating_health) var/obj/item/organ/O = getorganslot(slot) if(O && !(status_flags & GODMODE)) - O.applyOrganDamage(amount, maximum) + O.applyOrganDamage(amount, maximum, updating_health = updating_health) /** * If an organ exists in the slot requested, and we are capable of taking damage (we don't have [GODMODE] on), call the set damage proc on that organ, which can @@ -127,20 +167,31 @@ * * slot - organ slot, like [ORGAN_SLOT_HEART] */ /mob/living/carbon/getOrganLoss(slot) + if(slot == ORGAN_SLOT_BRAIN) + return getBrainLoss() + var/obj/item/organ/O = getorganslot(slot) if(O) return O.damage +/mob/living/carbon/getBrainLoss() + if(!needs_organ(ORGAN_SLOT_BRAIN)) + return 0 + + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + return B ? B.damage : maxHealth + //////////////////////////////////////////// ///Returns a list of damaged bodyparts -/mob/living/carbon/proc/get_damaged_bodyparts(brute = FALSE, burn = FALSE, status) +/mob/living/carbon/proc/get_damaged_bodyparts(brute = FALSE, burn = FALSE, status, check_flags) var/list/obj/item/bodypart/parts = list() for(var/obj/item/bodypart/BP as anything in bodyparts) if(status && !(BP.bodytype & status)) continue - if((brute && BP.brute_dam) || (burn && BP.burn_dam)) + if((brute && BP.brute_dam) || (burn && BP.burn_dam) || (BP.bodypart_flags & check_flags)) parts += BP + return parts ///Returns a list of damageable bodyparts @@ -150,17 +201,7 @@ var/obj/item/bodypart/BP = X if(status && !(BP.bodytype & status)) continue - if(BP.brute_dam + BP.burn_dam < BP.max_damage) - parts += BP - return parts - - -///Returns a list of bodyparts with wounds (in case someone has a wound on an otherwise fully healed limb) -/mob/living/carbon/proc/get_wounded_bodyparts(brute = FALSE, burn = FALSE, stamina = FALSE, status) - var/list/obj/item/bodypart/parts = list() - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - if(LAZYLEN(BP.wounds)) + if(BP.is_damageable()) parts += BP return parts @@ -189,12 +230,12 @@ * * It automatically updates health status */ -/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status, check_armor = FALSE, sharpness = NONE) +/mob/living/carbon/take_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_status, check_armor = FALSE, sharpness = NONE) var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status) 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, sharpness = sharpness)) + if(picked.receive_damage(brute, burn, blocked = check_armor ? run_armor_check(picked, (brute ? BLUNT : burn ? FIRE : null)) : FALSE, sharpness = sharpness)) update_damage_overlays() ///Heal MANY bodyparts, in random order @@ -221,28 +262,33 @@ update_damage_overlays() /// damage MANY bodyparts, in random order -/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, updating_health = TRUE, required_status) +/mob/living/carbon/take_overall_damage(brute = 0, burn = 0, updating_health = TRUE, required_status, sharpness, modifiers = DEFAULT_DAMAGE_FLAGS) if(status_flags & GODMODE) return //godmode - var/list/obj/item/bodypart/parts = get_damageable_bodyparts(required_status) - var/update = 0 - while(length(parts) && (brute > 0 || burn > 0)) - var/obj/item/bodypart/picked = pick(parts) - var/brute_per_part = round(brute/parts.len, DAMAGE_PRECISION) - var/burn_per_part = round(burn/parts.len, DAMAGE_PRECISION) - var/brute_was = picked.brute_dam - var/burn_was = picked.burn_dam + var/list/obj/item/bodypart/not_full = get_damageable_bodyparts(required_status) + if(!length(not_full)) + return + var/update = 0 - update |= picked.receive_damage(brute_per_part, burn_per_part, 0, FALSE, required_status) - brute = round(brute - (picked.brute_dam - brute_was), DAMAGE_PRECISION) - burn = round(burn - (picked.burn_dam - burn_was), DAMAGE_PRECISION) + // Receive_damage() rounds to damage precision, dont bother doing it here. + brute /= length(not_full) + burn /= length(not_full) - parts -= picked + for(var/obj/item/bodypart/bp as anything in not_full) + update |= bp.receive_damage(brute, burn, 0, FALSE, required_status, sharpness, modifiers = modifiers) - if(updating_health) + if(updating_health && (update & BODYPART_LIFE_UPDATE_HEALTH)) updatehealth() - if(update) + if(update & BODYPART_LIFE_UPDATE_DAMAGE_OVERLAYS) update_damage_overlays() +/mob/living/carbon/getOxyLoss() + if(HAS_TRAIT(src, TRAIT_NOBREATH)) + return 0 + var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) + if(!L || (L.organ_flags & ORGAN_DEAD)) + return maxHealth + + return ..() diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index a74f93ccb62e..521c1cb0091b 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -7,9 +7,10 @@ if(!gibbed) INVOKE_ASYNC(src, PROC_REF(emote), "deathgasp") + reagents.end_metabolization(src) - add_memory_in_range(src, 7, MEMORY_DEATH, list(DETAIL_PROTAGONIST = src), memory_flags = MEMORY_FLAG_NOMOOD, story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLIND_AND_DEAF) + add_memory_in_range(src, 7, MEMORY_DEATH, list(DETAIL_PROTAGONIST = src), story_value = STORY_VALUE_OKAY, memory_flags = MEMORY_CHECK_BLIND_AND_DEAF) . = ..() @@ -27,12 +28,13 @@ animate(src, time = 40, transform = M, easing = SINE_EASING) /mob/living/carbon/gib(no_brain, no_organs, no_bodyparts, safe_gib = FALSE) - add_memory_in_range(src, 7, MEMORY_GIBBED, list(DETAIL_PROTAGONIST = src), STORY_VALUE_AMAZING, MEMORY_FLAG_NOMOOD, memory_flags = MEMORY_CHECK_BLINDNESS) + add_memory_in_range(src, 7, MEMORY_GIBBED, list(DETAIL_PROTAGONIST = src), STORY_VALUE_AMAZING, memory_flags = MEMORY_CHECK_BLINDNESS) if(safe_gib) // If you want to keep all the mob's items and not have them deleted - for(var/obj/item/W in src) - dropItemToGround(W) - if(prob(50)) - step(W, pick(GLOB.alldirs)) + for(var/obj/item/W in get_equipped_items(TRUE) | held_items) + if(dropItemToGround(W)) + if(prob(50)) + step(W, pick(GLOB.alldirs)) + var/atom/Tsec = drop_location() for(var/mob/M in src) M.forceMove(Tsec) @@ -51,7 +53,7 @@ if(no_brain && istype(organs, /obj/item/organ/brain)) qdel(organs) //so the brain isn't transfered to the head when the head drops. continue - var/org_zone = check_zone(organs.zone) //both groin and chest organs. + var/org_zone = deprecise_zone(organs.zone) //both groin and chest organs. if(org_zone == BODY_ZONE_CHEST) organs.Remove(src) organs.forceMove(Tsec) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 38eb81df6024..eefb2b7d9716 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -70,8 +70,16 @@ /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." + message_param = "moans %t." + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/carbon/grunt + key = "grunt" + key_third_person = "grunts" + message = "grunts." + message_param = "grunts %t." emote_type = EMOTE_AUDIBLE /datum/emote/living/carbon/noogie diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 5a35d8e5a64c..03e406ec651c 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -98,41 +98,20 @@ if(has_status_effect(/datum/status_effect/fire_handler/wet_stacks)) msg += "[t_He] look[p_s()] a little soaked.\n" - if(pulledby?.grab_state) - msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" - msg += "" . += msg.Join("") if(!appears_dead) - switch(stat) - if(SOFT_CRIT) - . += "[t_His] breathing is shallow and labored." - if(UNCONSCIOUS, HARD_CRIT) - . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep." + if(stat != CONSCIOUS) + . += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" + else if(HAS_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION)) + msg += "[t_He] [t_is] barely conscious.\n" var/trait_exam = common_trait_examine() if (!isnull(trait_exam)) . += trait_exam - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) - if(mood) - switch(mood.shown_mood) - if(-INFINITY to MOOD_LEVEL_SAD4) - . += "[t_He] look[p_s()] depressed." - if(MOOD_LEVEL_SAD4 to MOOD_LEVEL_SAD3) - . += "[t_He] look[p_s()] very sad." - if(MOOD_LEVEL_SAD3 to MOOD_LEVEL_SAD2) - . += "[t_He] look[p_s()] a bit down." - if(MOOD_LEVEL_HAPPY2 to MOOD_LEVEL_HAPPY3) - . += "[t_He] look[p_s()] quite happy." - if(MOOD_LEVEL_HAPPY3 to MOOD_LEVEL_HAPPY4) - . += "[t_He] look[p_s()] very happy." - if(MOOD_LEVEL_HAPPY4 to INFINITY) - . += "[t_He] look[p_s()] ecstatic." - //. += "*---------*" PARIAH EDIT REMOVAL - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) /mob/living/carbon/examine_more(mob/user) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 08ec454c6114..9811cf8dce22 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -6,6 +6,9 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) new /obj/effect/temp_visual/dust_animation(loc, dna.species.dust_anim) /mob/living/carbon/human/spawn_gibs(with_bodyparts) + if(isipc(src)) + new /obj/effect/gibspawner/robot(drop_location(), src) + return if(with_bodyparts) new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses()) else @@ -20,6 +23,9 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) /mob/living/carbon/human/death(gibbed) if(stat == DEAD) return + + log_health(src, "Died. BRUTE: [getBruteLoss()] | BURN: [getFireLoss()] | TOX: [getFireLoss()] | OXY:[getOxyLoss()] | BLOOD: [blood_volume] | BLOOD OXY: [get_blood_oxygenation()]% | PAIN:[getPain()]") + stop_sound_channel(CHANNEL_HEARTBEAT) var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) if(H) @@ -40,6 +46,16 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) to_chat(src, span_warning("You have died. Barring complete bodyloss, you can in most cases be revived by other players. If you do not wish to be brought back, use the \"Do Not Resuscitate\" verb in the ghost tab.")) + for(var/mob/living/L in viewers(src, world.view) - src) + if(L.is_blind() || L.stat != CONSCIOUS || !L.client) + continue + + var/datum/roll_result/result = L.stat_roll(7, /datum/rpg_skill/willpower) + switch(result.outcome) + if(FAILURE, CRIT_FAILURE) + if(L.apply_status_effect(/datum/status_effect/skill_mod/witness_death)) + to_chat(L, result.create_tooltip("For but a moment, there is nothing. Nothing but the gnawing realisation of what you have just witnessed.")) + /mob/living/carbon/human/proc/makeSkeleton() ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) set_species(/datum/species/skeleton) @@ -49,10 +65,10 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift) /mob/living/carbon/proc/Drain() become_husk(CHANGELING_DRAIN) ADD_TRAIT(src, TRAIT_BADDNA, CHANGELING_DRAIN) - blood_volume = 0 + setBloodVolume(0) return TRUE /mob/living/carbon/proc/makeUncloneable() ADD_TRAIT(src, TRAIT_BADDNA, MADE_UNCLONEABLE) - blood_volume = 0 + setBloodVolume(0) return TRUE diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 03ea2f899003..6ddccb1fff90 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -24,6 +24,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) ///Let's extract our dummies organs and limbs for storage, to reduce the cache missed that spamming a dummy cause /mob/living/carbon/human/dummy/proc/harvest_organs() + // Poolable organs for(var/slot in list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_APPENDIX, \ ORGAN_SLOT_EYES, ORGAN_SLOT_EARS, ORGAN_SLOT_TONGUE, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH)) var/obj/item/organ/current_organ = getorganslot(slot) //Time to cache it lads @@ -31,6 +32,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy SSwardrobe.stash_object(current_organ) + // Remaining poolable organs var/datum/species/current_species = dna.species for(var/organ_path in current_species.mutant_organs) var/obj/item/organ/current_organ = getorgan(organ_path) @@ -38,6 +40,10 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) current_organ.Remove(src, special = TRUE) //Please don't somehow kill our dummy SSwardrobe.stash_object(current_organ) + for(var/obj/item/organ/O as anything in organs) + O.Remove(src, special = TRUE) + qdel(O) + //Instead of just deleting our equipment, we save what we can and reinsert it into SSwardrobe's store //Hopefully this makes preference reloading not the worst thing ever /mob/living/carbon/human/dummy/delete_equipment() @@ -67,7 +73,8 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) for(var/obj/item/delete as anything in to_nuke) qdel(delete) -/mob/living/carbon/human/dummy/has_equipped(obj/item/item, slot, initial = FALSE) +/mob/living/carbon/human/dummy/afterEquipItem(obj/item/item, slot, initial = FALSE) + item.item_flags |= IN_INVENTORY return item.visual_equipped(src, slot, initial) /mob/living/carbon/human/dummy/proc/wipe_state() @@ -83,31 +90,61 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/dummy/consistent /mob/living/carbon/human/dummy/consistent/setup_human_dna() - create_dna(src) - dna.initialize_dna(skip_index = TRUE) - dna.features["ears"] = "None" - dna.features["ethcolor"] = COLOR_WHITE - dna.features["frills"] = "None" - dna.features["horns"] = "None" - dna.set_all_mutant_colors(COLOR_VIBRANT_LIME) - dna.features["moth_antennae"] = "Plain" - dna.features["moth_markings"] = "None" - dna.features["moth_wings"] = "Plain" - dna.features["snout"] = "Round" - dna.features["spines"] = "None" - dna.features["tail_human"] = "None" - dna.features["tail_lizard"] = "Smooth" - dna.features["tail_vox"] = "Vox Tail" - dna.features["vox_hair"] = "None" - dna.features["vox_facial_hair"] = "None" - dna.features["vox_snout"] = "Vox Snout" - dna.features["tail_cat"] = "None" - dna.features["pod_hair"] = "Ivy" - dna.features["teshari_feathers"] = "Mane" - dna.features["teshari_body_feathers"] = "Plain" - dna.features["teshari_ears"] = "None" - dna.features["tail_teshari"] = "Default" - dna.features["headtails"] = "Long" + create_consistent_human_dna(src) + +/proc/create_consistent_human_dna(mob/living/carbon/human/H) + H.create_dna() + H.dna.initialize_dna(skip_index = TRUE) + + H.dna.features["ears"] = get_consistent_feature_entry(GLOB.ears_list) + H.dna.features["ethcolor"] = COLOR_WHITE + H.dna.features["frills"] = get_consistent_feature_entry(GLOB.frills_list) + H.dna.features["horns"] = get_consistent_feature_entry(GLOB.horns_list) + H.dna.set_all_mutant_colors(COLOR_VIBRANT_LIME) + H.dna.features["moth_antennae"] = get_consistent_feature_entry(GLOB.moth_antennae_list) + H.dna.features["moth_markings"] = get_consistent_feature_entry(GLOB.moth_markings_list) + H.dna.features["moth_wings"] = get_consistent_feature_entry(GLOB.wings_list) + H.dna.features["snout"] = get_consistent_feature_entry(GLOB.snouts_list) + H.dna.features["spines"] = get_consistent_feature_entry(GLOB.spines_list) + H.dna.features["tail_human"] = get_consistent_feature_entry(GLOB.tails_list_human) + H.dna.features["tail_lizard"] = get_consistent_feature_entry(GLOB.tails_list_lizard) + + H.dna.features["tail_vox"] = get_consistent_feature_entry(GLOB.tails_list_vox) + H.dna.features["vox_hair"] = get_consistent_feature_entry(GLOB.vox_hair_list) + H.dna.features["vox_facial_hair"] = get_consistent_feature_entry(GLOB.vox_facial_hair_list) + H.dna.features["vox_snout"] = get_consistent_feature_entry(GLOB.vox_snouts_list) + + H.dna.features["tail_cat"] = get_consistent_feature_entry(GLOB.tails_list_human) + H.dna.features["pod_hair"] = get_consistent_feature_entry(GLOB.pod_hair_list) + + H.dna.features["teshari_feathers"] = get_consistent_feature_entry(GLOB.teshari_feathers_list) + H.dna.features["teshari_body_feathers"] = get_consistent_feature_entry(GLOB.teshari_body_feathers_list) + H.dna.features["teshari_ears"] = get_consistent_feature_entry(GLOB.teshari_ears_list) + H.dna.features["tail_teshari"] = get_consistent_feature_entry(GLOB.teshari_tails_list) + + H.dna.features["ipc_screen"] = get_consistent_feature_entry(GLOB.ipc_screens_list) + H.dna.features["ipc_antenna"] = get_consistent_feature_entry(GLOB.ipc_antenna_list) + H.dna.features["saurian_screen"] = get_consistent_feature_entry(GLOB.saurian_screens_list) + H.dna.features["saurian_tail"] = get_consistent_feature_entry(GLOB.saurian_tails_list) + H.dna.features["saurian_scutes"] = get_consistent_feature_entry(GLOB.saurian_scutes_list) + H.dna.features["saurian_antenna"] = get_consistent_feature_entry(GLOB.saurian_antenna_list) + +/// Takes in an accessory list and returns the first entry from that list, ensuring that we dont return SPRITE_ACCESSORY_NONE in the process. +/proc/get_consistent_feature_entry(list/accessory_feature_list) + var/consistent_entry = (accessory_feature_list- SPRITE_ACCESSORY_NONE)[1] + ASSERT(!isnull(consistent_entry)) + return consistent_entry + +/// Provides a dummy for unit_tests that functions like a normal human, but with a standardized appearance +/// Copies the stock dna setup from the dummy/consistent type +/mob/living/carbon/human/consistent + +/mob/living/carbon/human/consistent/setup_human_dna() + create_consistent_human_dna(src) + fully_replace_character_name(real_name, "John Doe") + +/mob/living/carbon/human/consistent/domutcheck() + return // We skipped adding any mutations so this runtimes //Inefficient pooling/caching way. GLOBAL_LIST_EMPTY(human_dummy_list) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index c02a9cf047a2..b3f14bac6325 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -81,6 +81,28 @@ return TRUE return ..() +/datum/emote/living/carbon/human/pain + key = "pain" + message = "cries out in pain!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/carbon/human/pain/get_sound(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/human = user + return human.dna.species.get_pain_sound(human) + +/datum/emote/living/carbon/human/agony + key = "agony" + message = "screams in agony!" + emote_type = EMOTE_AUDIBLE + +/datum/emote/living/carbon/human/agony/get_sound(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/human = user + return human.dna.species.get_agony_sound(human) + /datum/emote/living/carbon/human/pale key = "pale" message = "goes pale for a second." @@ -103,26 +125,6 @@ key_third_person = "shrugs" message = "shrugs." -/datum/emote/living/carbon/human/wag - key = "wag" - key_third_person = "wags" - message = "wags their tail." - -/datum/emote/living/carbon/human/wag/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(!.) - return - var/obj/item/organ/tail/oranges_accessory = user.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) - if(oranges_accessory.wag_flags & WAG_WAGGING) //We verified the tail exists in can_run_emote() - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, FALSE) - else - SEND_SIGNAL(user, COMSIG_ORGAN_WAG_TAIL, TRUE) - -/datum/emote/living/carbon/human/wag/can_run_emote(mob/user, status_check, intentional) - var/obj/item/organ/tail/tail = user.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL) - if(tail?.wag_flags & WAG_ABLE) - return ..() - return FALSE /datum/emote/living/carbon/human/wing key = "wing" key_third_person = "wings" @@ -214,25 +216,6 @@ sound = 'sound/emotes/mothchitter.ogg' species_type_whitelist_typecache = list(/datum/species/moth) -//Felinid emotes -/datum/emote/living/meow - key = "meow" - key_third_person = "meows" - message = "meows!" - emote_type = EMOTE_AUDIBLE - vary = TRUE - sound = 'sound/emotes/meow.ogg' - species_type_whitelist_typecache = list(/datum/species/human/felinid) - -/datum/emote/living/purr //Ported from CitRP originally by buffyuwu. - key = "purr" - key_third_person = "purrs!" - message = "purrs!" - emote_type = EMOTE_AUDIBLE - vary = TRUE - sound = 'sound/voice/feline_purr.ogg' - species_type_whitelist_typecache = list(/datum/species/human/felinid) - //Shared custody between felinids and lizards /datum/emote/living/hiss key = "hiss" @@ -242,7 +225,7 @@ vary = TRUE sound = 'sound/emotes/hiss.ogg' mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) - species_type_whitelist_typecache = list(/datum/species/lizard, /datum/species/human/felinid) + species_type_whitelist_typecache = list(/datum/species/lizard) //Lizard emotes /datum/emote/living/rpurr @@ -265,7 +248,7 @@ sound = 'sound/emotes/voxrustle.ogg' species_type_whitelist_typecache = list(/datum/species/vox) -//Shared custody between skrell and teshari +// Teshari emotes. for some reason. /datum/emote/living/carbon/human/warble key = "warble" key_third_person = "warbles!" @@ -273,7 +256,7 @@ sound = 'sound/voice/warbles.ogg' emote_type = EMOTE_AUDIBLE vary = TRUE - species_type_whitelist_typecache = list(/datum/species/skrell, /datum/species/teshari) + species_type_whitelist_typecache = list(/datum/species/teshari) /datum/emote/living/carbon/human/warble/get_frequency(mob/living/user) //no regular warbling sound but oh well if(isteshari(user)) @@ -288,7 +271,7 @@ emote_type = EMOTE_AUDIBLE vary = TRUE sound = 'sound/voice/trills.ogg' - species_type_whitelist_typecache = list(/datum/species/skrell, /datum/species/teshari) + species_type_whitelist_typecache = list(/datum/species/teshari) /datum/emote/living/carbon/human/wurble key = "wurble" @@ -297,7 +280,7 @@ emote_type = EMOTE_AUDIBLE vary = TRUE sound = 'sound/voice/wurble.ogg' - species_type_whitelist_typecache = list(/datum/species/skrell, /datum/species/teshari) + species_type_whitelist_typecache = list(/datum/species/teshari) //Teshari emotes /datum/emote/living/carbon/human/chirp diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index b875244aa4fb..8657f0b2362e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,3 +1,5 @@ +#define EXAMINE_LINK(item) button_element(item, "\[?\]", "examine=1") + /mob/living/carbon/human/examine(mob/user) //this is very slightly better than it was because you can use it more places. still can't do \his[src] though. var/t_He = p_they(TRUE) @@ -7,6 +9,7 @@ var/t_has = p_have() var/t_is = p_are() var/t_es = p_es() + var/t_s = p_s() var/obscure_name if(isliving(user)) @@ -25,6 +28,23 @@ . = list("This is [!obscure_name ? name : "Unknown"][species_text]!
") + if(!skipface) + var/age_text + switch(age) + if(-INFINITY to 25) //what + age_text = "very young" + if(26 to 35) + age_text = "of adult age" + if(36 to 55) + age_text = "middle-aged" + if(56 to 75) + age_text = "rather old" + if(76 to 100) + age_text = "very old" + if(101 to INFINITY) + age_text = "withering away" + . += span_notice("[t_He] appear[t_s] to be [age_text].") + //uniform if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !(w_uniform.item_flags & EXAMINE_SKIP)) //accessory @@ -32,32 +52,32 @@ if(istype(w_uniform, /obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.attached_accessory) - accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory]" + accessory_msg += " with [icon2html(U.attached_accessory, user)] \a [U.attached_accessory] [EXAMINE_LINK(U.attached_accessory)]" - . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]." + . += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)] [EXAMINE_LINK(w_uniform)] [accessory_msg]." //head if(head && !(obscured & ITEM_SLOT_HEAD) && !(head.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head." + . += "[t_He] [t_is] wearing [head.get_examine_string(user)] [EXAMINE_LINK(head)] on [t_his] head." //suit/armor if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]." + . += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)] [EXAMINE_LINK(wear_suit)]." //suit/armor storage if(s_store && !(obscured & ITEM_SLOT_SUITSTORE) && !(s_store.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]." + . += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] [EXAMINE_LINK(s_store)] on [t_his] [wear_suit.name]." //back if(back && !(back.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back." + . += "[t_He] [t_has] [back.get_examine_string(user)] [EXAMINE_LINK(back)] on [t_his] back." //Hands for(var/obj/item/I in held_items) if(!(I.item_flags & ABSTRACT) && !(I.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]." + . += "[t_He] [t_is] holding [I.get_examine_string(user)] [EXAMINE_LINK(I)] in [t_his] [I.wielded ? "hands" : get_held_index_name(get_held_index_of_item(I))]." - var/datum/component/forensics/FR = GetComponent(/datum/component/forensics) //gloves if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !(gloves.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands." - else if(FR && length(FR.blood_DNA)) + . += "[t_He] [t_has] [gloves.get_examine_string(user)] [EXAMINE_LINK(gloves)] on [t_his] hands." + + else if(length(forensics?.blood_DNA)) if(num_hands) . += span_warning("[t_He] [t_has] [num_hands > 1 ? "" : "a"] blood-stained hand[num_hands > 1 ? "s" : ""]!") @@ -68,27 +88,27 @@ else if(istype(handcuffed, /obj/item/restraints/handcuffs/tape)) . += span_warning("[t_He] [t_is] [icon2html(handcuffed, user)] bound by tape!") else - . += span_warning("[t_He] [t_is] handcuffed with [icon2html(handcuffed, user)] [handcuffed]!") + . += span_warning("[t_He] [t_is] handcuffed with [icon2html(handcuffed, user)] [handcuffed] [EXAMINE_LINK(handcuffed)] !") //belt if(belt && !(belt.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist." + . += "[t_He] [t_has] [belt.get_examine_string(user)] [EXAMINE_LINK(belt)] about [t_his] waist." //shoes if(shoes && !(obscured & ITEM_SLOT_FEET) && !(shoes.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet." + . += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] [EXAMINE_LINK(shoes)] on [t_his] feet." //mask if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !(wear_mask.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face." + . += "[t_He] [t_has] [wear_mask.get_examine_string(user)] [EXAMINE_LINK(wear_mask)] on [t_his] face." if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !(wear_neck.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck." + . += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] [EXAMINE_LINK(wear_neck)] around [t_his] neck." //eyes if(!(obscured & ITEM_SLOT_EYES) ) if(glasses && !(glasses.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes." + . += "[t_He] [t_has] [glasses.get_examine_string(user)] [EXAMINE_LINK(glasses)] covering [t_his] eyes." else if(HAS_TRAIT(src, TRAIT_UNNATURAL_RED_GLOWY_EYES)) . += "[t_His] eyes are glowing with an unnatural red aura!" else if(HAS_TRAIT(src, TRAIT_BLOODSHOT_EYES)) @@ -96,38 +116,35 @@ //ears if(ears && !(obscured & ITEM_SLOT_EARS) && !(ears.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears." + . += "[t_He] [t_has] [ears.get_examine_string(user)] [EXAMINE_LINK(ears)] on [t_his] ears." //ID if(wear_id && !(wear_id.item_flags & EXAMINE_SKIP)) - . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)]." - - . += wear_id.get_id_examine_strings(user) + var/id_topic = wear_id.GetID() ? " \[Look at ID\]" : "" + . += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)] [EXAMINE_LINK(wear_id)]. [id_topic]" //Status effects var/list/status_examines = get_status_effect_examinations() if (length(status_examines)) . += status_examines - var/appears_dead = FALSE - var/just_sleeping = FALSE - - if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) - appears_dead = TRUE - - var/obj/item/clothing/glasses/G = get_item_by_slot(ITEM_SLOT_EYES) - var/are_we_in_weekend_at_bernies = G?.tint && buckled && istype(buckled, /obj/vehicle/ridden/wheelchair) - - if(isliving(user) && (HAS_TRAIT(user, TRAIT_NAIVE) || are_we_in_weekend_at_bernies)) - just_sleeping = TRUE - - if(!just_sleeping) - if(suiciding) - . += span_warning("[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.") - - . += generate_death_examine_text() + var/appears_dead = isobserver(user) + var/adjacent = get_dist(user, src) <= 1 + if(stat != CONSCIOUS || (HAS_TRAIT(src, TRAIT_FAKEDEATH))) + if(!adjacent) + . += span_alert("[t_He] is not moving.") + else + if(stat == UNCONSCIOUS && !HAS_TRAIT(src, TRAIT_FAKEDEATH)) + . += span_notice("[t_He] [t_is] unconsious.") + if(failed_last_breath) + . += span_alert("[t_He] isn't breathing.") + else + appears_dead = TRUE + . += span_danger("The spark of life has left [t_him].") + if(suiciding) + . += span_warning("[t_He] appear[t_s] to have committed suicide.") - if(get_bodypart(BODY_ZONE_HEAD) && !getorgan(/obj/item/organ/brain)) + if(get_bodypart(BODY_ZONE_HEAD) && needs_organ(ORGAN_SLOT_BRAIN) && !getorgan(/obj/item/organ/brain)) . += span_deadsay("It appears that [t_his] brain is missing...") var/list/msg = list() @@ -135,28 +152,38 @@ 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/disabled = list() var/list/body_zones_covered = get_covered_body_zones(TRUE) //This is a bitfield of the body_zones_covered. Not parts. Yeah. Sucks. + var/list/bodyparts = sort_list(src.bodyparts, GLOBAL_PROC_REF(cmp_bodyparts_display_order)) + + var/visible_bodyparts = 0 + // Potentially pickweight from this list after a medicine check. + var/list/fucked_reasons = list() + for(var/obj/item/bodypart/body_part as anything in bodyparts) if(body_part.bodypart_disabled) disabled += body_part missing -= body_part.body_zone - for(var/obj/item/I in body_part.embedded_objects) - if(I.isEmbedHarmless()) - msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] stuck to [t_his] [body_part.name]!\n" - else - msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] embedded in [t_his] [body_part.name]!\n" if(is_bodypart_visibly_covered(body_part, body_zones_covered)) var/is_bloody for(var/datum/wound/W as anything in body_part.wounds) if(W.bleeding()) - msg += span_warning("[t_His] [body_part.plaintext_zone] covering is bloody!\n") + msg += span_warning("Blood soaks through [t_his] [body_part.plaintext_zone] covering.\n") is_bloody = TRUE + fucked_reasons["The blood soaking through [t_his] [body_part.plaintext_zone] indicates a dire wound."] = 1 break if(!is_bloody) msg += span_notice("[t_His] [body_part.plaintext_zone] is covered.\n") + for(var/string in body_part.mob_examine(hal_screwyhud, TRUE)) + msg += "[string]
" + continue else - msg += body_part.mob_examine(hal_screwyhud) + visible_bodyparts++ + if((body_part.brute_dam + body_part.burn_dam) >= body_part.max_damage * 0.8) + fucked_reasons["[t_His] [body_part.plaintext_zone] is greviously injured."] = 3 + + for(var/string in body_part.mob_examine(hal_screwyhud, FALSE)) + msg += "[string]
" for(var/X in disabled) var/obj/item/bodypart/body_part = X @@ -184,7 +211,7 @@ msg += "[capitalize(t_his)] [parse_zone(t)] is missing!\n" if(l_limbs_missing >= 2 && r_limbs_missing == 0) - msg += "[t_He] look[p_s()] all right now.\n" + msg += "[t_He] look[t_s] all right now.\n" else if(l_limbs_missing == 0 && r_limbs_missing >= 2) msg += "[t_He] really keeps to the left.\n" else if(l_limbs_missing >= 2 && r_limbs_missing >= 2) @@ -203,12 +230,19 @@ if(has_status_effect(/datum/status_effect/fire_handler/fire_stacks)) msg += "[t_He] [t_is] covered in something flammable.\n" - if(has_status_effect(/datum/status_effect/fire_handler/wet_stacks)) - msg += "[t_He] look[p_s()] a little soaked.\n" + if(locate(/datum/reagent/toxin/acid) in touching?.reagent_list) + msg += span_warning("[t_He] is covered in burning acid! \n") + else if(has_status_effect(/datum/status_effect/fire_handler/wet_stacks) || length(touching?.reagent_list)) + msg += "[t_He] look[t_s] a little soaked.\n" - if(pulledby?.grab_state) - msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" + for(var/obj/item/hand_item/grab/G in grabbed_by) + if(G.assailant == src) + msg += "[t_He] [t_is] gripping [t_His] [G.get_targeted_bodypart().plaintext_zone].\n" + continue + if(!G.current_grab.stop_move) + continue + msg += "[t_He] [t_is] restrained by [G.assailant]'s grip.\n" if(nutrition < NUTRITION_LEVEL_STARVING - 50) msg += "[t_He] [t_is] severely malnourished.\n" @@ -219,11 +253,11 @@ msg += "[t_He] [t_is] quite chubby.\n" switch(disgust) if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) - msg += "[t_He] look[p_s()] a bit grossed out.\n" + msg += "[t_He] look[t_s] a bit grossed out.\n" if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) - msg += "[t_He] look[p_s()] really grossed out.\n" + msg += "[t_He] look[t_s] really grossed out.\n" if(DISGUST_LEVEL_DISGUSTED to INFINITY) - msg += "[t_He] look[p_s()] extremely disgusted.\n" + msg += "[t_He] look[t_s] extremely disgusted.\n" var/apparent_blood_volume = blood_volume if(skin_tone == "albino") @@ -232,71 +266,44 @@ if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) msg += "[t_He] [t_has] pale skin.\n" if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - msg += "[t_He] look[p_s()] like pale death.\n" + msg += "[t_He] look[t_s] like pale death.\n" if(-INFINITY to BLOOD_VOLUME_BAD) - msg += "[span_deadsay("[t_He] resemble[p_s()] a crushed, empty juice pouch.")]\n" - - if(is_bleeding()) - var/list/obj/item/bodypart/grasped_limbs = list() - - for(var/obj/item/bodypart/body_part as anything in bodyparts) - if(body_part.grasped_by) - grasped_limbs += body_part - - for(var/i in grasped_limbs) - var/obj/item/bodypart/grasped_part = i - msg += "[t_He] [t_is] holding [t_his] [grasped_part.name] to slow the bleeding!\n" - - if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) - msg += "[t_He] [t_is] emitting a gentle blue glow!\n" + msg += "[span_deadsay("[t_He] resemble[t_s] a crushed, empty juice pouch.")]\n" if(islist(stun_absorption)) for(var/i in stun_absorption) if(stun_absorption[i]["end_time"] > world.time && stun_absorption[i]["examine_message"]) msg += "[t_He] [t_is][stun_absorption[i]["examine_message"]]\n" - if(just_sleeping) - msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" - if(!appears_dead) - if(src != user) - if(HAS_TRAIT(user, TRAIT_EMPATH)) - if (combat_mode) - msg += "[t_He] seem[p_s()] to be on guard.\n" - if (getOxyLoss() >= 10) - msg += "[t_He] seem[p_s()] winded.\n" - if (getToxLoss() >= 10) - msg += "[t_He] seem[p_s()] sickly.\n" - if (is_blind()) - msg += "[t_He] appear[p_s()] to be staring off into space.\n" - if (HAS_TRAIT(src, TRAIT_DEAF)) - msg += "[t_He] appear[p_s()] to not be responding to noises.\n" - if (bodytemperature > dna.species.bodytemp_heat_damage_limit) - msg += "[t_He] [t_is] flushed and wheezing.\n" - if (bodytemperature < dna.species.bodytemp_cold_damage_limit) - msg += "[t_He] [t_is] shivering.\n" - - 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 (combat_mode) + msg += "[t_He] appear[p_s()] to be on guard.\n" + if (getOxyLoss() >= 10) + msg += "[t_He] appear[p_s()] winded.\n" + if (getToxLoss() >= 10) + msg += "[t_He] appear[p_s()] sickly.\n" + + if (bodytemperature < dna.species.cold_discomfort_level) + msg += "[t_He] [t_is] shivering.\n" + + msg += "" + + if(HAS_TRAIT(user, TRAIT_SPIRITUAL) && mind?.holy_role) + msg += "[t_He] [t_has] a holy aura about [t_him].\n" switch(stat) - if(UNCONSCIOUS, HARD_CRIT) - msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n" - if(SOFT_CRIT) - msg += "[t_He] [t_is] barely conscious.\n" if(CONSCIOUS) if(HAS_TRAIT(src, TRAIT_DUMB)) msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n" - if(getorgan(/obj/item/organ/brain)) + if(HAS_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION)) + msg += "[t_He] [t_is] barely conscious.\n" + + + if(stat != DEAD && getorgan(/obj/item/organ/brain)) if(ai_controller?.ai_status == AI_STATUS_ON) msg += "[span_deadsay("[t_He] do[t_es]n't appear to be [t_him]self.")]\n" else if(!key) msg += "[span_deadsay("[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 (length(msg)) . += span_warning("[msg.Join("")]") @@ -307,23 +314,23 @@ 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) + var/datum/data/record/R = SSdatacore.get_record_by_name(perpname, DATACORE_RECORDS_STATION) if(R) - . += "Rank: [R.fields["rank"]]\n\[Front photo\]\[Side photo\]" + . += "Rank: [R.fields[DATACORE_RANK]]\n\[Front photo\]\[Side photo\]" if(HAS_TRAIT(user, TRAIT_MEDICAL_HUD)) var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in processing_organs) - if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant) + if((CI.organ_flags & ORGAN_SYNTHETIC) && !CI.syndicate_implant) cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]" if(cyberimp_detect) . += "Detected cybernetic modifications:" . += "[cyberimp_detect]" if(R) - var/health_r = R.fields["p_stat"] + var/health_r = R.fields[DATACORE_PHYSICAL_HEALTH] . += "\[[health_r]\]" - health_r = R.fields["m_stat"] + health_r = R.fields[DATACORE_MENTAL_HEALTH] . += "\[[health_r]\]" - R = find_record("name", perpname, GLOB.data_core.medical) + R = SSdatacore.get_record_by_name(perpname, DATACORE_RECORDS_MEDICAL) if(R) . += "\[Medical evaluation\]
" . += "\[See quirks\]" @@ -333,9 +340,9 @@ //|| !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) + R = SSdatacore.get_record_by_name(perpname, DATACORE_RECORDS_SECURITY) if(R) - criminal = R.fields["criminal"] + criminal = R.fields[DATACORE_CRIMINAL_STATUS] . += "Criminal status: \[[criminal]\]" . += jointext(list("Security record: \[View\]", @@ -346,7 +353,43 @@ else if(isobserver(user)) . += span_info("Traits: [get_quirk_string(FALSE, CAT_QUIRK_ALL)]") - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) + var/flavor_text_link + /// The first 1-FLAVOR_PREVIEW_LIMIT characters in the mob's "examine_text" variable. FLAVOR_PREVIEW_LIMIT is defined in flavor_defines.dm. + var/preview_text = trim(copytext_char((examine_text), 1, FLAVOR_PREVIEW_LIMIT)) + if(preview_text) + if (!(skipface)) + if(length_char(examine_text) <= FLAVOR_PREVIEW_LIMIT) + flavor_text_link += "[preview_text]" + else + flavor_text_link += "[preview_text]... [button_element(src, "Look Closer?", "open_examine_panel=1")]" + else + flavor_text_link = span_notice("...?") + if (flavor_text_link) + . += span_notice(flavor_text_link) + + // AT THIS POINT WE'RE DONE WITH EXAMINE STUFF + var/mob/living/living_user = user + if(user == src && stat != CONSCIOUS || !istype(living_user) || !living_user.stats?.cooldown_finished("examine_medical_flavortext_[REF(src)]")) + return + + var/possible_invisible_damage = getToxLoss() > 20 || getBrainLoss() + + if((possible_invisible_damage || length(fucked_reasons) || visible_bodyparts >= 3)) + var/datum/roll_result/result = living_user.stat_roll(15, /datum/rpg_skill/anatomia) + switch(result.outcome) + if(SUCCESS, CRIT_SUCCESS) + spawn(0) + if(possible_invisible_damage && living_user.stats.cooldown_finished("found_invisible_damage_[REF(src)]")) + to_chat(living_user, result.create_tooltip("Something is not right, this person is not well. You can feel it in your very core.")) + living_user.stats.set_cooldown("found_invisible_damage_[REF(src)]", INFINITY) // Never again + + else if(length(fucked_reasons)) + to_chat(living_user, result.create_tooltip("[t_He] does not look long for this world. [pick_weight(fucked_reasons)]")) + + else + to_chat(living_user, result.create_tooltip("[t_He] appears to be in great health, a testament to the endurance of humanity in these trying times.")) + + living_user.stats.set_cooldown("examine_medical_flavortext_[REF(src)]", 20 MINUTES) /** * Shows any and all examine text related to any status effects the user has. @@ -366,26 +409,6 @@ return examine_list.Join("\n") -/mob/living/carbon/human/examine_more(mob/user) - . = ..() - if ((wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))) - return - var/age_text - switch(age) - if(-INFINITY to 25) - age_text = "very young" - if(26 to 35) - age_text = "of adult age" - if(36 to 55) - age_text = "middle-aged" - if(56 to 75) - age_text = "rather old" - if(76 to 100) - age_text = "very old" - if(101 to INFINITY) - age_text = "withering away" - . += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [age_text].")) - ///This proc expects to be passed a list of covered zones, for optimization in loops. Use get_covered_body_zones(exact_only = TRUE) for that.. /mob/living/carbon/proc/is_bodypart_visibly_covered(obj/item/bodypart/BP, covered_zones) var/zone = BP.body_zone diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 53319754c340..b7e8c120b371 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,14 +4,14 @@ 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. - //initialize limbs first - create_bodyparts() - + create_dna() + dna.species.create_fresh_body(src) setup_human_dna() - prepare_huds() //Prevents a nasty runtime on human init - if(dna.species) - INVOKE_ASYNC(src, PROC_REF(set_species), dna.species.type) + create_carbon_reagents() //Humans init this early as species require it + set_species(dna.species.type) + + prepare_huds() //Prevents a nasty runtime on human init //initialise organs create_internal_organs() //most of it is done in set_species now, this is only for parent call @@ -22,7 +22,7 @@ RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) AddComponent(/datum/component/personal_crafting) AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6, TRUE) - AddComponent(/datum/component/bloodysoles/feet) + AddComponent(/datum/component/bloodysoles/feet, BLOOD_PRINT_HUMAN) AddElement(/datum/element/ridable, /datum/component/riding/creature/human) AddElement(/datum/element/strippable, GLOB.strippable_human_items, TYPE_PROC_REF(/mob/living/carbon/human, should_strip)) var/static/list/loc_connections = list( @@ -39,11 +39,6 @@ randomize_human(src) dna.initialize_dna() -/mob/living/carbon/human/ComponentInitialize() - . = ..() - if(!CONFIG_GET(flag/disable_human_mood)) - AddComponent(/datum/component/mood) - /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) QDEL_LIST(bioware) @@ -69,8 +64,6 @@ sec_hud_set_ID() sec_hud_set_implants() sec_hud_set_security_status() - //...fan gear - fan_hud_set_fandom() //...and display them. add_to_all_human_data_huds() @@ -78,19 +71,20 @@ . = ..() . += "Combat mode: [combat_mode ? "On" : "Off"]" . += "Move Mode: [m_intent]" - if (internal) - var/datum/gas_mixture/internal_air = internal.return_air() - if (!internal_air) - QDEL_NULL(internal) - else - . += "" - . += "Internal Atmosphere Info: [internal.name]" - . += "Tank Pressure: [internal_air.returnPressure()]" - . += "Distribution Pressure: [internal.distribute_pressure]" + + var/obj/item/tank/target_tank = internal || external + if(target_tank) + var/datum/gas_mixture/internal_air = target_tank.return_air() + . += "" + . += "Internal Atmosphere Info: [target_tank.name]" + . += "Tank Pressure: [internal_air.returnPressure()]" + . += "Distribution Pressure: [target_tank.distribute_pressure]" + if(istype(wear_suit, /obj/item/clothing/suit/space)) var/obj/item/clothing/suit/space/S = wear_suit . += "Thermal Regulator: [S.thermal_on ? "on" : "off"]" . += "Cell Charge: [S.cell ? "[round(S.cell.percent(), 0.1)]%" : "!invalid!"]" + if(mind) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) @@ -120,9 +114,11 @@ 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) + + var/datum/data/record/general_record = SSdatacore.get_record_by_name(perpname, DATACORE_RECORDS_STATION) + if(href_list["photo_front"] || href_list["photo_side"]) - if(!R) + if(!general_record) return if(!H.canUseHUD()) return @@ -130,9 +126,9 @@ return var/obj/item/photo/P = null if(href_list["photo_front"]) - P = R.get_front_photo() + P = general_record.get_front_photo() else if(href_list["photo_side"]) - P = R.get_side_photo() + P = general_record.get_side_photo() if(P) P.show(H) return @@ -190,26 +186,26 @@ to_chat(H, span_warning("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) + var/health_status = input(usr, "Specify a new physical status for this person.", "Medical HUD", general_record.fields[DATACORE_PHYSICAL_HEALTH]) in list("Active", "Physically Unfit", "*Unconscious*", "*Deceased*", "Cancel") + if(!general_record) 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 + general_record.fields[DATACORE_PHYSICAL_HEALTH] = 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) + var/health_status = input(usr, "Specify a new mental status for this person.", "Medical HUD", general_record.fields[DATACORE_MENTAL_HEALTH]) in list("Stable", "*Watch*", "*Unstable*", "*Insane*", "Cancel") + if(!general_record) 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 + general_record.fields[DATACORE_MENTAL_HEALTH] = health_status return if(href_list["quirk"]) var/quirkstring = get_quirk_string(TRUE, CAT_QUIRK_ALL) @@ -242,21 +238,24 @@ if(!perpname) to_chat(H, span_warning("ERROR: Can not identify target.")) return - R = find_record("name", perpname, GLOB.data_core.security) - if(!R) + + var/datum/data/record/security/security_record = SSdatacore.get_records(DATACORE_RECORDS_SECURITY)[perpname] + + if(!security_record) to_chat(usr, span_warning("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*", "Incarcerated", "Suspected", "Paroled", "Discharged", "Cancel") + var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", security_record.fields[DATACORE_CRIMINAL_STATUS]) in list(CRIMINAL_NONE, CRIMINAL_WANTED, CRIMINAL_INCARCERATED, CRIMINAL_SUSPECT, CRIMINAL_PAROLE, CRIMINAL_DISCHARGED, "Cancel") if(setcriminal != "Cancel") - if(!R) + if(!security_record) 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 + investigate_log("[key_name(src)] has been set from [security_record.fields[DATACORE_CRIMINAL_STATUS]] to [setcriminal] by [key_name(usr)].", INVESTIGATE_RECORDS) + security_record.set_criminal_status(setcriminal) sec_hud_set_security_status() return @@ -265,8 +264,8 @@ 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, "Name: [security_record.fields[DATACORE_NAME]] Criminal Status: [security_record.fields[DATACORE_CRIMINAL_STATUS]]") + for(var/datum/data/crime/c in security_record.fields[DATACORE_CRIMES]) to_chat(usr, "Crime: [c.crimeName]") if (c.crimeDetails) to_chat(usr, "Details: [c.crimeDetails]") @@ -274,7 +273,7 @@ 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"]]") + to_chat(usr, "Notes: [security_record.fields[DATACORE_NOTES]]") return if(href_list["add_citation"]) @@ -283,56 +282,61 @@ var/fine = tgui_input_number(usr, "Citation fine", "Security HUD", 50, maxFine, 5) if(!fine) return - if(!R || !t1 || !allowed_access) + if(!security_record || !t1 || !allowed_access) return if(!H.canUseHUD()) return if(!HAS_TRAIT(H, TRAIT_SECURITY_HUD)) return - var/datum/data/crime/crime = GLOB.data_core.createCrimeEntry(t1, "", allowed_access, stationtime2text(), fine) - for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) - if(tablet.saved_identification == R.fields["name"]) - var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." - var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list( - "name" = "Security Citation", - "job" = "Citation Server", - "message" = message, - "targets" = list(tablet), - "automated" = TRUE - )) - 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) - SSblackbox.ReportCitation(crime.dataId, usr.ckey, usr.real_name, R.fields["name"], t1, fine) + var/datum/data/crime/crime = SSdatacore.new_crime_entry(t1, "", allowed_access, stationtime2text(), fine) + var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) + if(announcer) + announcer.notify_citation(security_record.fields[DATACORE_NAME], t1, fine) + // for (var/obj/item/modular_computer/tablet in GLOB.TabletMessengers) + // if(tablet.saved_identification == R.fields[DATACORE_NAME]) + // var/message = "You have been fined [fine] credits for '[t1]'. Fines may be paid at security." + // var/datum/signal/subspace/messaging/tablet_msg/signal = new(src, list( + // "name" = "Security Citation", + // "job" = "Citation Server", + // "message" = message, + // "targets" = list(tablet), + // "automated" = TRUE + // )) + // signal.send_to_receivers() + // usr.log_message("(PDA: Citation Server) sent \"[message]\" to [signal.format_target()]", LOG_PDA) + security_record.add_citation(crime) + investigate_log("New Citation: [t1] Fine: [fine] | Added to [security_record.fields[DATACORE_NAME]] by [key_name(usr)]", INVESTIGATE_RECORDS) + SSblackbox.ReportCitation(crime.dataId, usr.ckey, usr.real_name, security_record.fields[DATACORE_NAME], t1, fine) return if(href_list["add_crime"]) var/t1 = tgui_input_text(usr, "Crime name", "Security HUD") - if(!R || !t1 || !allowed_access) + if(!security_record || !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, stationtime2text()) - GLOB.data_core.addCrime(R.fields["id"], crime) - investigate_log("New Crime: [t1] | Added to [R.fields["name"]] by [key_name(usr)]", INVESTIGATE_RECORDS) + + var/crime = SSdatacore.new_crime_entry(t1, null, allowed_access, stationtime2text()) + security_record.add_crime(crime) + investigate_log("New Crime: [t1] | Added to [security_record.fields[DATACORE_NAME]] by [key_name(usr)]", INVESTIGATE_RECORDS) to_chat(usr, span_notice("Successfully added a crime.")) return if(href_list["add_details"]) var/t1 = tgui_input_text(usr, "Crime details", "Security Records", multiline = TRUE) - if(!R || !t1 || !allowed_access) + if(!security_record || !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) + security_record.add_crime_details(href_list["cdataid"], t1) + investigate_log("New Crime details: [t1] | Added to [security_record.fields[DATACORE_NAME]] by [key_name(usr)]", INVESTIGATE_RECORDS) to_chat(usr, span_notice("Successfully added details.")) return @@ -343,24 +347,24 @@ return to_chat(usr, "Comments/Log:") var/counter = 1 - while(R.fields[text("com_[]", counter)]) - to_chat(usr, R.fields[text("com_[]", counter)]) + while(security_record.fields["com_[counter]"]) + to_chat(usr, security_record.fields["com_[counter]"]) to_chat(usr, "----------") counter++ return if(href_list["add_comment"]) var/t1 = tgui_input_text(usr, "Add a comment", "Security Records", multiline = TRUE) - if (!R || !t1 || !allowed_access) + if (!security_record || !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)]) + while(security_record.fields["com_[counter]"]) counter++ - R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []
[]", allowed_access, stationtime2text(), time2text(world.realtime, "MMM DD"), CURRENT_STATION_YEAR, t1) + security_record.fields["com_[counter]"] = "Made by [allowed_access] on [stationtime2text()] [time2text(world.realtime, "MMM DD")], [CURRENT_STATION_YEAR]
[t1]" to_chat(usr, span_notice("Successfully added comment.")) return @@ -387,6 +391,8 @@ else if(HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) . = FALSE var/obj/item/bodypart/the_part = get_bodypart(target_zone) || get_bodypart(BODY_ZONE_CHEST) + if(!IS_ORGANIC_LIMB(the_part)) + return FALSE // Loop through the clothing covering this bodypart and see if there's any thiccmaterials if(!(injection_flags & INJECT_CHECK_PENETRATE_THICK)) for(var/obj/item/clothing/iter_clothing in clothingonpart(the_part)) @@ -397,7 +403,7 @@ /mob/living/carbon/human/try_inject(mob/user, target_zone, injection_flags) . = ..() if(!. && (injection_flags & INJECT_TRY_SHOW_ERROR_MESSAGE) && user) - var/obj/item/bodypart/the_part = get_bodypart(target_zone || check_zone(user.zone_selected)) + var/obj/item/bodypart/the_part = get_bodypart(target_zone || deprecise_zone(user.zone_selected)) to_chat(user, span_alert("There is no exposed flesh or thin material on [p_their()] [the_part.name].")) /mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) @@ -443,16 +449,16 @@ //Check for arrest warrant if(judgement_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?.fields["criminal"]) - switch(R.fields["criminal"]) - if("*Arrest*") + var/datum/data/record/security/R = SSdatacore.get_record_by_name(perpname, DATACORE_RECORDS_SECURITY) + if(R?.fields[DATACORE_CRIMINAL_STATUS]) + switch(R.fields[DATACORE_CRIMINAL_STATUS]) + if(CRIMINAL_WANTED) threatcount += 5 - if("Incarcerated") + if(CRIMINAL_INCARCERATED) threatcount += 2 - if("Suspected") + if(CRIMINAL_SUSPECT) threatcount += 2 - if("Paroled") + if(CRIMINAL_PAROLE) threatcount += 2 //Check for dresscode violations @@ -513,68 +519,48 @@ cpr_image.plane = ABOVE_HUD_PLANE add_overlay(cpr_image) - var/panicking = FALSE - do - if (!do_after(src, target, panicking ? CPR_PANIC_SPEED : (3 SECONDS), DO_PUBLIC, extra_checks = CALLBACK(src, PROC_REF(can_perform_cpr), target))) - to_chat(src, span_warning("You fail to perform CPR on [target]!")) + while (TRUE) + if (!do_after(src, target, 3 SECONDS, DO_PUBLIC, extra_checks = CALLBACK(src, PROC_REF(can_perform_cpr), target))) break - if (target.health > target.crit_threshold) - break + var/datum/roll_result/result = stat_roll(6, /datum/rpg_skill/skirmish) + switch(result.outcome) + if(CRIT_SUCCESS) + if(target.stat != DEAD && target.undergoing_cardiac_arrest() && target.resuscitate()) + to_chat(src, result.create_tooltip("You feel the pulse of life return to [target.name] beneath your palms.")) + + if(SUCCESS) + var/obj/item/organ/heart/heart = target.getorganslot(ORGAN_SLOT_HEART) + if(heart) + // Not gonna lie chief I dont know what this math does, I just used bay's SKILL_EXPERIENCED valie + heart.external_pump = list(world.time, 0.8 + rand(-0.1,0.1)) + + if(CRIT_FAILURE, FAILURE) + var/obj/item/bodypart/chest/chest = target.get_bodypart(BODY_ZONE_CHEST) + if(chest.break_bones(TRUE)) + to_chat(src, result.create_tooltip("Your strength betrays you as you shatter [target.name]'s [chest.encased].")) visible_message( span_notice("[src] pushes down on [target.name]'s chest!"), - span_notice("You perform CPR on [target.name].") ) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "saved_life", /datum/mood_event/saved_life) log_combat(src, target, "CPRed") - if (HAS_TRAIT(target, TRAIT_NOBREATH)) - to_chat(target, span_unconscious("You feel a breath of fresh air... which is a sensation you don't recognise...")) - else if (!target.getorganslot(ORGAN_SLOT_LUNGS)) - to_chat(target, span_unconscious("You feel a breath of fresh air... but you don't feel any better...")) - else - target.adjustOxyLoss(-min(target.getOxyLoss(), 8)) - to_chat(target, span_unconscious("You feel a breath of fresh air enter your lungs... It feels good...")) + if(target.breathe(TRUE) == BREATH_OKAY) + to_chat(target, span_unconscious("You feel a breath of fresh air enter your lungs.")) + target.adjustOxyLoss(-8) - if (target.health <= target.crit_threshold) - if (!panicking) - to_chat(src, span_warning("[target] still isn't up! You try harder!")) - panicking = TRUE - else - panicking = FALSE - - while (panicking) cut_overlay(cpr_image) #undef CPR_PANIC_SPEED /mob/living/carbon/human/proc/can_perform_cpr(mob/living/carbon/target, silent = TRUE) - if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) - if(!silent) - to_chat(src, span_warning("[target.name] is dead!")) - return FALSE - - if (is_mouth_covered()) - if(!silent) - to_chat(src, span_warning("Remove your mask first!")) - return FALSE - - if (target.is_mouth_covered()) - if(!silent) - to_chat(src, span_warning("Remove [p_their()] mask first!")) - return FALSE - - if (!getorganslot(ORGAN_SLOT_LUNGS)) - if(!silent) - to_chat(src, span_warning("You have no lungs to breathe with, so you cannot perform CPR!")) + if(target.body_position != LYING_DOWN) return FALSE - if (HAS_TRAIT(src, TRAIT_NOBREATH)) - if(!silent) - to_chat(src, span_warning("You do not breathe, so you cannot perform CPR!")) + if(!target.getorganslot(ORGAN_SLOT_LUNGS)) + to_chat(src, span_warning("[target.p_they()] [target.p_dont()] have lungs.")) return FALSE return TRUE @@ -598,6 +584,8 @@ if(obscured & ITEM_SLOT_GLOVES) return FALSE + germ_level = 0 + if(gloves) if(gloves.wash(clean_types)) update_worn_gloves() @@ -720,10 +708,13 @@ return TRUE /mob/living/carbon/human/replace_records_name(oldname,newname) // Only humans have records right now, move this up if changed. - for(var/list/L in list(GLOB.data_core.general,GLOB.data_core.medical,GLOB.data_core.security,GLOB.data_core.locked)) - var/datum/data/record/R = find_record("name", oldname, L) + for(var/id as anything in SSdatacore.library) + var/datum/data_library/library = SSdatacore.library[id] + var/datum/data/record/R = library.get_record_by_name(oldname) if(R) - R.fields["name"] = newname + R.fields[DATACORE_NAME] = newname + library.records_by_name -= oldname + library.records_by_name[newname] = R /mob/living/carbon/human/get_total_tint() . = ..() @@ -733,59 +724,84 @@ /mob/living/carbon/human/update_health_hud() if(!client || !hud_used) return - if(dna.species.update_health_hud()) + + if(hud_used.healths) // Kapu note: We don't use this on humans due to human health being brain health. It'd be confusing. + if(..()) //not dead + switch(hal_screwyhud) + if(SCREWYHUD_CRIT) + hud_used.healths.icon_state = "health6" + if(SCREWYHUD_DEAD) + hud_used.healths.icon_state = "health7" + if(SCREWYHUD_HEALTHY) + hud_used.healths.icon_state = "health0" + + if(hud_used.healthdoll) + var/list/new_overlays = list() + hud_used.healthdoll.cut_overlays() + if(stat != DEAD) + hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" + for(var/obj/item/bodypart/body_part as anything in bodyparts) + var/icon_num = 0 + + //Hallucinations + if(body_part.type in hal_screwydoll) + icon_num = hal_screwydoll[body_part.type] + new_overlays += image('icons/hud/screen_gen.dmi', "[body_part.body_zone][icon_num]") + continue + + if(hal_screwyhud == SCREWYHUD_HEALTHY) + icon_num = 0 + //Not hallucinating + else + var/dam_state = min(1,((body_part.brute_dam + body_part.burn_dam) / max(1,body_part.max_damage))) + if(dam_state) + icon_num = max(1, min(Ceil(dam_state * 6), 6)) + + if(icon_num) + new_overlays += image('icons/hud/screen_gen.dmi', "[body_part.body_zone][icon_num]") + + if(body_part.getPain() > 20) + new_overlays += image('icons/hud/screen_gen.dmi', "[body_part.body_zone]pain") + + if(body_part.bodypart_disabled) //Disabled limb + new_overlays += image('icons/hud/screen_gen.dmi', "[body_part.body_zone]7") + + for(var/t in get_missing_limbs()) //Missing limbs + new_overlays += image('icons/hud/screen_gen.dmi', "[t]6") + + if(undergoing_cardiac_arrest()) + new_overlays += image('icons/hud/screen_gen.dmi', "softcrit") + + if(on_fire) + new_overlays += image('icons/hud/screen_gen.dmi', "burning") + + //Add all the overlays at once, more performant! + hud_used.healthdoll.add_overlay(new_overlays) + else + hud_used.healthdoll.icon_state = "healthdoll_DEAD" + +/mob/living/carbon/human/revive(full_heal, admin_revive, excess_healing) + . = ..() + if(!.) return - else - if(hud_used.healths) - if(..()) //not dead - switch(hal_screwyhud) - if(SCREWYHUD_CRIT) - hud_used.healths.icon_state = "health6" - if(SCREWYHUD_DEAD) - hud_used.healths.icon_state = "health7" - if(SCREWYHUD_HEALTHY) - hud_used.healths.icon_state = "health0" - if(hud_used.healthdoll) - hud_used.healthdoll.cut_overlays() - if(stat != DEAD) - hud_used.healthdoll.icon_state = "healthdoll_OVERLAY" - for(var/obj/item/bodypart/body_part as anything in bodyparts) - var/icon_num = 0 - //Hallucinations - if(body_part.type in hal_screwydoll) - icon_num = hal_screwydoll[body_part.type] - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[body_part.body_zone][icon_num]")) - continue - //Not hallucinating - var/damage = body_part.burn_dam + body_part.brute_dam - var/comparison = (body_part.max_damage/5) - if(damage) - icon_num = 1 - if(damage > (comparison)) - icon_num = 2 - if(damage > (comparison*2)) - icon_num = 3 - if(damage > (comparison*3)) - icon_num = 4 - if(damage > (comparison*4)) - icon_num = 5 - if(hal_screwyhud == SCREWYHUD_HEALTHY) - icon_num = 0 - if(icon_num) - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[body_part.body_zone][icon_num]")) - - for(var/t in get_missing_limbs()) //Missing limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[t]6")) - for(var/t in get_disabled_limbs()) //Disabled limbs - hud_used.healthdoll.add_overlay(mutable_appearance('icons/hud/screen_gen.dmi', "[t]7")) - else - hud_used.healthdoll.icon_state = "healthdoll_DEAD" + + log_health(src, "Brought back to life.") /mob/living/carbon/human/fully_heal(admin_revive = FALSE) + log_health(src, "Received an adminheal.") dna?.species.spec_fully_heal(src) if(admin_revive) regenerate_limbs() regenerate_organs() + + for(var/obj/item/bodypart/BP as anything in bodyparts) + BP.set_sever_artery(FALSE) + BP.set_sever_tendon(FALSE) + BP.set_dislocated(FALSE) + BP.heal_bones() + BP.adjustPain(-INFINITY) + BP.germ_level = 0 + remove_all_embedded_objects() set_heartattack(FALSE) for(var/datum/mutation/human/HM in dna.mutations) @@ -811,7 +827,6 @@ VV_DROPDOWN_OPTION(VV_HK_MOD_MUTATIONS, "Add/Remove Mutation") VV_DROPDOWN_OPTION(VV_HK_MOD_QUIRKS, "Add/Remove Quirks") VV_DROPDOWN_OPTION(VV_HK_SET_SPECIES, "Set Species") - VV_DROPDOWN_OPTION(VV_HK_PURRBATION, "Toggle Purrbation") /mob/living/carbon/human/vv_do_topic(list/href_list) . = ..() @@ -847,7 +862,7 @@ for(var/type in subtypesof(/datum/quirk)) var/datum/quirk/quirk_type = type - if(initial(quirk_type.abstract_parent_type) == type) + if(isabstract(quirk_type)) continue var/qname = initial(quirk_type.name) @@ -872,35 +887,13 @@ var/newtype = GLOB.species_list[result] admin_ticket_log("[key_name_admin(usr)] has modified the bodyparts of [src] to [result]") set_species(newtype) - if(href_list[VV_HK_PURRBATION]) - if(!check_rights(R_SPAWN)) - return - if(!ishumanbasic(src)) - to_chat(usr, "This can only be done to the basic human species at the moment.") - return - var/success = purrbation_toggle(src) - if(success) - to_chat(usr, "Put [src] on purrbation.") - log_admin("[key_name(usr)] has put [key_name(src)] on purrbation.") - var/msg = span_notice("[key_name_admin(usr)] has put [key_name(src)] on purrbation.") - message_admins(msg) - admin_ticket_log(src, msg) - - else - to_chat(usr, "Removed [src] from purrbation.") - log_admin("[key_name(usr)] has removed [key_name(src)] from purrbation.") - var/msg = span_notice("[key_name_admin(usr)] has removed [key_name(src)] from purrbation.") - message_admins(msg) - admin_ticket_log(src, msg) - -/mob/living/carbon/human/limb_attack_self() - var/obj/item/bodypart/arm = hand_bodyparts[active_hand_index] - if(arm) - arm.attack_self(src) - return ..() /mob/living/carbon/human/mouse_buckle_handling(mob/living/M, mob/living/user) - if(pulling != M || grab_state != GRAB_AGGRESSIVE || stat != CONSCIOUS) + var/obj/item/hand_item/grab/G = is_grabbing(M) + if(combat_mode) + return FALSE + + if(!G || G.current_grab.damage_stage != GRAB_AGGRESSIVE || stat != CONSCIOUS) return FALSE //If they dragged themselves to you and you're currently aggressively grabbing them try to piggyback @@ -976,24 +969,22 @@ /mob/living/carbon/human/updatehealth() . = ..() dna?.species.spec_updatehealth(src) - if(HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) - return - var/health_deficiency = maxHealth - health - if(health_deficiency >= 40) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, multiplicative_slowdown = health_deficiency / 75) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, multiplicative_slowdown = health_deficiency / 25) - else - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) - remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) /mob/living/carbon/human/pre_stamina_change(diff as num, forced) if(diff < 0) //Taking damage, not healing return diff * physiology.stamina_mod return diff -/mob/living/carbon/human/adjust_nutrition(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 +/mob/living/carbon/human/adjust_nutrition(change) + if(isipc(src)) + var/obj/item/organ/cell/C = getorganslot(ORGAN_SLOT_CELL) + if(C) + if(change > 0) + . = C.give(change) + else + . = C.use(change, TRUE) + return . + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) return FALSE return ..() @@ -1031,9 +1022,10 @@ var/race = null var/use_random_name = TRUE -/mob/living/carbon/human/species/Initialize(mapload) - . = ..() - INVOKE_ASYNC(src, PROC_REF(set_species), race) +/mob/living/carbon/human/species/create_dna() + dna = new /datum/dna(src) + if (!isnull(race)) + dna.species = new race /mob/living/carbon/human/species/set_species(datum/species/mrace, icon_update, pref_load) . = ..() @@ -1046,90 +1038,9 @@ /mob/living/carbon/human/species/android race = /datum/species/android -/mob/living/carbon/human/species/dullahan - race = /datum/species/dullahan - -/mob/living/carbon/human/species/felinid - race = /datum/species/human/felinid - /mob/living/carbon/human/species/fly race = /datum/species/fly -/mob/living/carbon/human/species/golem - race = /datum/species/golem - -/mob/living/carbon/human/species/golem/adamantine - race = /datum/species/golem/adamantine - -/mob/living/carbon/human/species/golem/plasma - race = /datum/species/golem/plasma - -/mob/living/carbon/human/species/golem/diamond - race = /datum/species/golem/diamond - -/mob/living/carbon/human/species/golem/gold - race = /datum/species/golem/gold - -/mob/living/carbon/human/species/golem/silver - race = /datum/species/golem/silver - -/mob/living/carbon/human/species/golem/plasteel - race = /datum/species/golem/plasteel - -/mob/living/carbon/human/species/golem/titanium - race = /datum/species/golem/titanium - -/mob/living/carbon/human/species/golem/plastitanium - race = /datum/species/golem/plastitanium - -/mob/living/carbon/human/species/golem/alien_alloy - race = /datum/species/golem/alloy - -/mob/living/carbon/human/species/golem/wood - race = /datum/species/golem/wood - -/mob/living/carbon/human/species/golem/uranium - race = /datum/species/golem/uranium - -/mob/living/carbon/human/species/golem/sand - race = /datum/species/golem/sand - -/mob/living/carbon/human/species/golem/glass - race = /datum/species/golem/glass - -/mob/living/carbon/human/species/golem/bluespace - race = /datum/species/golem/bluespace - -/mob/living/carbon/human/species/golem/bananium - race = /datum/species/golem/bananium - -/mob/living/carbon/human/species/golem/blood_cult - race = /datum/species/golem/runic - -/mob/living/carbon/human/species/golem/cloth - race = /datum/species/golem/cloth - -/mob/living/carbon/human/species/golem/plastic - race = /datum/species/golem/plastic - -/mob/living/carbon/human/species/golem/bronze - race = /datum/species/golem/bronze - -/mob/living/carbon/human/species/golem/cardboard - race = /datum/species/golem/cardboard - -/mob/living/carbon/human/species/golem/leather - race = /datum/species/golem/leather - -/mob/living/carbon/human/species/golem/bone - race = /datum/species/golem/bone - -/mob/living/carbon/human/species/golem/durathread - race = /datum/species/golem/durathread - -/mob/living/carbon/human/species/golem/snow - race = /datum/species/golem/snow - /mob/living/carbon/human/species/jelly race = /datum/species/jelly @@ -1145,21 +1056,12 @@ /mob/living/carbon/human/species/lizard race = /datum/species/lizard -/mob/living/carbon/human/species/lizard/ashwalker - race = /datum/species/lizard/ashwalker - -/mob/living/carbon/human/species/lizard/silverscale - race = /datum/species/lizard/silverscale - /mob/living/carbon/human/species/ethereal race = /datum/species/ethereal /mob/living/carbon/human/species/moth race = /datum/species/moth -/mob/living/carbon/human/species/mush - race = /datum/species/mush - /mob/living/carbon/human/species/plasma race = /datum/species/plasmaman @@ -1178,9 +1080,6 @@ /mob/living/carbon/human/species/skeleton race = /datum/species/skeleton -/mob/living/carbon/human/species/snail - race = /datum/species/snail - /mob/living/carbon/human/species/vampire race = /datum/species/vampire @@ -1190,8 +1089,237 @@ /mob/living/carbon/human/species/zombie/infectious race = /datum/species/zombie/infectious -/mob/living/carbon/human/species/skrell - race = /datum/species/skrell - /mob/living/carbon/human/species/vox race = /datum/species/vox + +/mob/living/carbon/human/species/ipc + race = /datum/species/ipc + +/mob/living/carbon/human/species/ipc/saurian + race = /datum/species/ipc/saurian + + +/mob/living/carbon/human/verb/checkpulse() + set name = "Check Pulse" + set category = "IC" + set desc = "Approximately count somebody's pulse. Requires you to stand still at least 6 seconds." + set src in view(1) + + if(!isliving(src) || usr.stat || usr.incapacitated()) + return + + var/self = FALSE + if(usr == src) + self = TRUE + + if(!self) + usr.visible_message( + span_notice("[usr] kneels down, puts \his hand on [src]'s wrist and begins counting their pulse."), + span_notice("You begin counting [src]'s pulse") + ) + else + usr.visible_message( + span_notice("[usr] begins counting their pulse."), + span_notice("You begin counting your pulse.") + ) + + + if (!pulse() || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + to_chat(usr, span_danger("[src] has no pulse!")) + return + else + to_chat(usr, span_notice("[self ? "You have a" : "[src] has a"] pulse. Counting...")) + + to_chat(usr, span_notice("You must[self ? "" : " both"] remain still until counting is finished.")) + + if(do_after(usr, src, 6 SECONDS, DO_PUBLIC)) + to_chat(usr, span_notice("[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")) + +///Accepts an organ slot, returns whether or not the mob needs one to survive (or just should have one for non-vital organs). +/mob/living/carbon/human/needs_organ(slot) + if(!dna || !dna.species) + return FALSE + + switch(slot) + if(ORGAN_SLOT_STOMACH) + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + return FALSE + if(ORGAN_SLOT_LUNGS) + if(HAS_TRAIT(src, TRAIT_NOBREATH)) + return FALSE + if(ORGAN_SLOT_LIVER) + if(HAS_TRAIT(src, TRAIT_NOMETABOLISM)) + return FALSE + if(ORGAN_SLOT_EARS) + if(HAS_TRAIT(src, TRAIT_NOEARS)) + return FALSE + + return dna.species.organs[slot] + +//Used by various things that knock people out by applying blunt trauma to the head. +//Checks that the species has a "head" (brain containing organ) and that hit_zone refers to it. +/mob/living/carbon/human/proc/can_head_trauma_ko() + var/obj/item/organ/brain = getorganslot(ORGAN_SLOT_BRAIN) + if(!brain || !needs_organ(ORGAN_SLOT_BRAIN)) + return FALSE + + //if the parent organ is significantly larger than the brain organ, then hitting it is not guaranteed + var/obj/item/bodypart/head = get_bodypart(BODY_ZONE_HEAD) + if(!head) + return FALSE + if(head.w_class > brain.w_class + 1) + return prob(100 / 2**(head.w_class - brain.w_class - 1)) + return TRUE + +/mob/living/carbon/human/up() + . = ..() + if(.) + return + var/obj/climbable = check_zclimb() + if(!climbable) + can_z_move(UP, get_turf(src), ZMOVE_FEEDBACK|ZMOVE_FLIGHT_FLAGS) + return FALSE + + return ClimbUp(climbable) + +/mob/living/carbon/human/drag_damage(turf/new_loc, turf/old_loc, direction) + if(prob(getBruteLoss() * 0.6)) + makeBloodTrail(new_loc, old_loc, direction, TRUE) + + adjustBloodVolume(-1) + if(!prob(10)) + return + + var/list/wounds = get_wounds() + shuffle_inplace(wounds) + + var/datum/wound/cut/C = locate() in wounds + var/datum/wound/puncture/P = locate() in wounds + + if(C && P) + if(prob(50)) + C = null + else + P = null + + var/datum/wound/W = C || P + if(!W) + return + + W.open_wound(5) + + if(!IS_ORGANIC_LIMB(W.parent)) + visible_message( + span_warning("The damage to [src]'s [W.parent.plaintext_zone] worsens."), + span_warning("The damage to your [W.parent.plaintext_zone] worsens."), + span_hear("You hear the screech of abused metal."), + COMBAT_MESSAGE_RANGE, + ) + else + visible_message( + span_warning("The [W.desc] on [src]'s [W.parent.plaintext_zone] widens with a nasty ripping noise."), + span_warning("The [W.desc] on your [W.parent.plaintext_zone] widens with a nasty ripping noise."), + span_hear("You hear a nasty ripping noise, as if flesh is being torn apart."), + COMBAT_MESSAGE_RANGE, + ) + + +/mob/living/carbon/human/getTrail(being_dragged) + if(get_bleed_rate() < (being_dragged ? 1.5 : 2.5)) + return "bleedtrail_light_[rand(1,4)]" + else + return "bleedtrail_heavy" + +/mob/living/carbon/human/leavesBloodTrail() + if(!is_bleeding() || HAS_TRAIT(src, TRAIT_NOBLEED)) + return FALSE + + return ..() + +/mob/living/carbon/human/get_blood_print() + var/obj/item/bodypart/leg/L = get_bodypart(BODY_ZONE_R_LEG) || get_bodypart(BODY_ZONE_L_LEG) + return L?.blood_print + +/mob/living/carbon/human/proc/get_fingerprints(ignore_gloves, hand) + if(!ignore_gloves && (gloves || (check_obscured_slots() & ITEM_SLOT_GLOVES))) + return + + var/obj/item/bodypart/arm/arm + if(hand) + if(isbodypart(hand)) + arm = hand + arm ||= get_bodypart(hand) + else + arm = get_bodypart(BODY_ZONE_R_ARM) || get_bodypart(BODY_ZONE_L_ARM) + + return arm?.fingerprints + +/// Takes a user and body_zone, if the body_zone is covered by clothing, add a fingerprint to it. Otherwise, add one to us. +/mob/living/carbon/human/proc/add_fingerprint_on_clothing_or_self(mob/user, body_zone) + var/obj/item/I = get_item_covering_zone(body_zone) + if(I) + I.add_fingerprint(user) + log_touch(user) + else + add_fingerprint(user) + +/// Takes a user and body_zone, if the body_zone is covered by clothing, add trace dna to it. Otherwise, add one to us. +/mob/living/carbon/human/proc/add_trace_DNA_on_clothing_or_self(mob/living/carbon/human/user, body_zone) + if(!istype(user)) + return + + var/obj/item/I = get_item_covering_zone(body_zone) + if(I) + I.add_trace_DNA(user.get_trace_dna()) + else + add_trace_DNA(user.get_trace_dna()) +/mob/living/carbon/human/fire_act(exposed_temperature, exposed_volume, turf/adjacent) + . = ..() + var/head_exposure = 1 + var/chest_exposure = 1 + var/groin_exposure = 1 + var/legs_exposure = 1 + var/arms_exposure = 1 + + //Get heat transfer coefficients for clothing. + + for(var/obj/item/C in get_all_worn_items(FALSE)) + if(C.max_heat_protection_temperature >= exposed_temperature) + if(C.heat_protection & HEAD) + head_exposure = 0 + if(C.heat_protection & CHEST) + chest_exposure = 0 + if(C.heat_protection & GROIN) + groin_exposure = 0 + if( C.heat_protection & LEGS) + legs_exposure = 0 + if(C.heat_protection & ARMS) + arms_exposure = 0 + else + if((C.body_parts_covered | C.heat_protection) & HEAD) + head_exposure = 0.5 + if((C.body_parts_covered | C.heat_protection) & CHEST) + chest_exposure = 0.5 + if((C.body_parts_covered | C.heat_protection) & GROIN) + groin_exposure = 0.5 + if((C.body_parts_covered | C.heat_protection) & LEGS) + legs_exposure = 0.5 + if((C.body_parts_covered | C.heat_protection) & ARMS) + arms_exposure = 0.5 + + //minimize this for low-pressure environments + var/temp_multiplier = 2 * clamp(0, exposed_temperature / PHORON_MINIMUM_BURN_TEMPERATURE, 1) + + //Always check these damage procs first if fire damage isn't working. They're probably what's wrong. + if(head_exposure) + apply_damage(0.9 * temp_multiplier * head_exposure, BURN, BODY_ZONE_HEAD) + if(chest_exposure || groin_exposure) + apply_damage(2.5 * temp_multiplier * chest_exposure, BURN, BODY_ZONE_CHEST) + apply_damage(2.0 * temp_multiplier * groin_exposure, BURN, BODY_ZONE_CHEST) + if(arms_exposure) + apply_damage(0.4 * temp_multiplier * arms_exposure, BURN, BODY_ZONE_L_ARM) + apply_damage(0.4 * temp_multiplier * arms_exposure, BURN, BODY_ZONE_R_ARM) + if(legs_exposure) + apply_damage(0.6 * temp_multiplier * legs_exposure, BURN, BODY_ZONE_L_LEG) + apply_damage(0.6 * temp_multiplier * legs_exposure, BURN, BODY_ZONE_R_LEG) + diff --git a/code/modules/mob/living/carbon/human/human_context.dm b/code/modules/mob/living/carbon/human/human_context.dm index 56dc9040bbd8..eaaac631a911 100644 --- a/code/modules/mob/living/carbon/human/human_context.dm +++ b/code/modules/mob/living/carbon/human/human_context.dm @@ -7,17 +7,10 @@ if (user == src) return . - if (pulledby == user) - switch (user.grab_state) - if (GRAB_PASSIVE) - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Grip" - if (GRAB_AGGRESSIVE) - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Choke" - if (GRAB_NECK) - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Strangle" - else - return . - else - context[SCREENTIP_CONTEXT_CTRL_LMB] = "Pull" + context[SCREENTIP_CONTEXT_CTRL_LMB] = "Grab" + + var/obj/item/hand_item/grab/G = user.is_grabbing(src) + if (G) + G.current_grab.add_context(context, held_item, user, src) return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 599519403242..6cac9748e045 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -7,32 +7,29 @@ var/obj/item/bodypart/bp = def_zone if(bp) return checkarmor(def_zone, type) - var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) + var/obj/item/bodypart/affecting = get_bodypart(deprecise_zone(def_zone)) if(affecting) return checkarmor(affecting, type) //If a specific bodypart is targetted, check how that bodypart is protected and return the value. //If you don't specify a bodypart, it checks ALL your bodyparts for protection, and averages out the values - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X + for(var/obj/item/bodypart/BP as anything in bodyparts) armorval += checkarmor(BP, type) organnum++ return (armorval/max(organnum, 1)) -/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type) +/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/limb, d_type) if(!d_type) return 0 - var/protection = 0 + var/protection = limb.returnArmor().getRating(d_type) var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, back, gloves, shoes, belt, s_store, glasses, ears, wear_id, wear_neck) //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(!bp) - continue - if(bp && istype(bp , /obj/item/clothing)) - var/obj/item/clothing/C = bp - if(C.body_parts_covered & def_zone.body_part) - protection += C.armor.getRating(d_type) - protection += physiology.armor.getRating(d_type) + + for(var/obj/item/clothing/C in body_parts) + if(C.body_parts_covered & limb.body_part) + protection += C.returnArmor().getRating(d_type) + + protection += physiology.returnArmor().getRating(d_type) return protection ///Get all the clothing on a specific body part @@ -68,14 +65,19 @@ if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself if(P.reflectable & REFLECT_NORMAL) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message(span_danger("The [P.name] gets reflected by [src]!"), \ - span_userdanger("The [P.name] gets reflected by [src]!")) + var/obj/item/reflected_with = check_reflect(def_zone) + if(reflected_with) // Checks if you've passed a reflection% check + visible_message( + span_danger("[src] reflects [P] with [reflected_with]!"), + span_userdanger("You reflect [P] with [reflected_with]!") + ) + reflected_with.play_block_sound(src, PROJECTILE_ATTACK) // Find a turf near or on the original location to bounce to if(!isturf(loc)) //Open canopy mech (ripley) check. 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, def_zone, piercing_hit) return BULLET_ACT_HIT + 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) @@ -94,7 +96,7 @@ return BULLET_ACT_FORCE_PIERCE // complete projectile permutation - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) + if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armor_penetration)) P.on_hit(src, 100, def_zone, piercing_hit) return BULLET_ACT_HIT @@ -104,41 +106,40 @@ /mob/living/carbon/human/proc/check_reflect(def_zone) if(wear_suit) if(wear_suit.IsReflect(def_zone)) - return TRUE + return wear_suit if(head) if(head.IsReflect(def_zone)) - return TRUE + return head for(var/obj/item/I in held_items) if(I.IsReflect(def_zone)) - return TRUE + return I return FALSE -/mob/living/carbon/human/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) - var/block_chance_modifier = round(damage / -3) - +/mob/living/carbon/human/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armor_penetration = 0) for(var/obj/item/I in held_items) if(!istype(I, /obj/item/clothing)) - var/final_block_chance = I.block_chance - (clamp((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example - if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + if(I.try_block_attack(src, AM, attack_text, damage, attack_type)) return TRUE + if(wear_suit) - var/final_block_chance = wear_suit.block_chance - (clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier - if(wear_suit.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + if(wear_suit.try_block_attack(src, AM, attack_text, damage, attack_type)) return TRUE + if(w_uniform) - var/final_block_chance = w_uniform.block_chance - (clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier - if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + if(w_uniform.try_block_attack(src, AM, attack_text, damage, attack_type)) return TRUE + if(wear_neck) - var/final_block_chance = wear_neck.block_chance - (clamp((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier - if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + if(wear_neck.try_block_attack(src, AM, attack_text, damage, attack_type)) return TRUE + if(head) - var/final_block_chance = head.block_chance - (clamp((armour_penetration-head.armour_penetration)/2,0,100)) + block_chance_modifier - if(head.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + if(head.try_block_attack(src, AM, attack_text, damage, attack_type)) return TRUE - if(SEND_SIGNAL(src, COMSIG_HUMAN_CHECK_SHIELDS, AM, damage, attack_text, attack_type, armour_penetration) & SHIELD_BLOCK) + + if(SEND_SIGNAL(src, COMSIG_HUMAN_CHECK_SHIELDS, AM, damage, attack_text, attack_type, armor_penetration) & SHIELD_BLOCK) return TRUE + return FALSE /mob/living/carbon/human/proc/check_block() @@ -166,30 +167,43 @@ return ..() -/mob/living/carbon/human/grippedby(mob/living/user, instant = FALSE) - if(w_uniform) - w_uniform.add_fingerprint(user) - ..() - - /mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user) if(!I || !user) - return FALSE + return MOB_ATTACKEDBY_FAIL + + var/target_zone = deprecise_zone(user.zone_selected) //our intended target + + var/obj/item/bodypart/affecting = get_bodypart(target_zone) + if (!affecting || affecting.is_stump) + to_chat(user, span_danger("They are missing that limb!")) + return MOB_ATTACKEDBY_FAIL + + // If we aren't being hit by ourself, roll for accuracy. + if(user != src) + var/bodyzone_modifier = GLOB.bodyzone_gurps_mods[target_zone] + var/roll + if(HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) + roll = SUCCESS + else + roll = user.stat_roll(10, /datum/rpg_skill/skirmish, bodyzone_modifier, -7).outcome + + var/hit_zone + switch(roll) + if(CRIT_FAILURE) + visible_message(span_danger("\The [user] swings at [src] with \the [I], narrowly missing!")) + return MOB_ATTACKEDBY_MISS + + if(FAILURE) + hit_zone = get_random_valid_zone() + else + hit_zone = target_zone - var/obj/item/bodypart/affecting - if(user == src) - affecting = get_bodypart(check_zone(user.zone_selected)) //stabbing yourself always hits the right target - else - var/zone_hit_chance = 80 - if(body_position == LYING_DOWN) // half as likely to hit a different zone if they're on the ground - zone_hit_chance += 10 - affecting = get_bodypart(ran_zone(user.zone_selected, zone_hit_chance)) - var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target + affecting = get_bodypart(hit_zone) SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) SSblackbox.record_feedback("nested tally", "item_used_for_combat", 1, list("[I.force]", "[I.type]")) - SSblackbox.record_feedback("tally", "zone_targeted", 1, target_area) + SSblackbox.record_feedback("tally", "zone_targeted", 1, parse_zone(target_zone)) // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, src) @@ -260,14 +274,15 @@ if(try_inject(user, affecting, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))//Thick suits can stop monkey bites. if(..()) //successful monkey bite, this handles disease contraction. - var/obj/item/bodypart/arm/active_arm = user.get_active_hand() - var/damage = rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high) + var/obj/item/bodypart/head/monkey_mouth = user.get_bodypart(BODY_ZONE_HEAD) + var/damage = HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) ? monkey_mouth.unarmed_damage_high : rand(monkey_mouth.unarmed_damage_low, monkey_mouth.unarmed_damage_high) + if(!damage) - return + return FALSE if(check_shields(user, damage, "the [user.name]")) return FALSE - if(stat != DEAD) - apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, MELEE)) + + apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, PUNCTURE)) return TRUE /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/user, list/modifiers) @@ -309,7 +324,8 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, MELEE,"","",10) + + var/armor_block = run_armor_check(affecting, BLUNT,"","",10) playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1) visible_message(span_danger("[user] slashes at [src]!"), \ @@ -337,7 +353,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, MELEE) + var/armor_block = run_armor_check(affecting, BLUNT) apply_damage(damage, BRUTE, affecting, armor_block) @@ -346,7 +362,7 @@ if(!.) return var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) - if(check_shields(user, damage, "the [user.name]", MELEE_ATTACK, user.armour_penetration)) + if(check_shields(user, damage, "the [user.name]", MELEE_ATTACK, user.armor_penetration)) return FALSE var/dam_zone = dismembering_strike(user, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful @@ -354,7 +370,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor = run_armor_check(affecting, MELEE, armour_penetration = user.armour_penetration) + var/armor = run_armor_check(affecting, BLUNT, armor_penetration = user.armor_penetration) var/attack_direction = get_dir(user, src) apply_damage(damage, user.melee_damage_type, affecting, armor, sharpness = user.sharpness, attack_direction = attack_direction) @@ -364,7 +380,7 @@ if(!.) return var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) - if(check_shields(user, damage, "the [user.name]", MELEE_ATTACK, user.armour_penetration)) + if(check_shields(user, damage, "the [user.name]", MELEE_ATTACK, user.armor_penetration)) return FALSE var/dam_zone = dismembering_strike(user, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful @@ -372,7 +388,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor = run_armor_check(affecting, MELEE, armour_penetration = user.armour_penetration) + var/armor = run_armor_check(affecting, BLUNT, armor_penetration = user.armor_penetration) var/attack_direction = get_dir(user, src) apply_damage(damage, user.melee_damage_type, affecting, armor, sharpness = user.sharpness, attack_direction = attack_direction) @@ -397,7 +413,7 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, MELEE) + var/armor_block = run_armor_check(affecting, BLUNT) apply_damage(damage, BRUTE, affecting, armor_block) @@ -406,7 +422,7 @@ return FALSE . = ..() - if (!severity || QDELETED(src)) + if (!. || !severity || QDELETED(src)) return var/brute_loss = 0 var/burn_loss = 0 @@ -419,21 +435,16 @@ 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/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 + contents_explosion(EXPLODE_DEVASTATE) gib() return + else - brute_loss = 500 + brute_loss = 400 var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(throw_target, 200, 4) damage_clothes(400 - bomb_armor, BRUTE, BOMB) + Unconscious(15 SECONDS) //short amount of time for follow up attacks against elusive enemies like wizards if (EXPLODE_HEAVY) brute_loss = 60 @@ -441,22 +452,30 @@ if(bomb_armor) brute_loss = 30*(2 - round(bomb_armor*0.01, 0.05)) burn_loss = brute_loss //damage gets reduced from 120 to up to 60 combined brute+burn + damage_clothes(200 - bomb_armor, BRUTE, BOMB) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) - ears.adjustEarDamage(30, 120) - Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards + ears.adjustEarDamage(rand(15, 30), 120) + + if(prob(70)) + Unconscious(10 SECONDS) //short amount of time for follow up attacks against elusive enemies like wizards Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor if(EXPLODE_LIGHT) brute_loss = 30 + if(bomb_armor) brute_loss = 15*(2 - round(bomb_armor*0.01, 0.05)) + damage_clothes(max(50 - bomb_armor, 0), BRUTE, BOMB) + if (ears && !HAS_TRAIT_FROM(src, TRAIT_DEAF, CLOTHING_TRAIT)) - ears.adjustEarDamage(15,60) + ears.adjustEarDamage(rand(10, 20), 60) + Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether - take_overall_damage(brute_loss,burn_loss) + take_overall_damage(brute_loss,burn_loss, sharpness = SHARP_EDGED|SHARP_POINTY) //attempt to dismember bodyparts if(severity >= EXPLODE_HEAVY || !bomb_armor) @@ -475,23 +494,23 @@ if(EXPLODE_DEVASTATE) max_limb_loss = 4 probability = 50 - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X + + for(var/obj/item/bodypart/BP as anything in bodyparts) if(prob(probability) && !prob(getarmor(BP, BOMB)) && BP.body_zone != BODY_ZONE_HEAD && BP.body_zone != BODY_ZONE_CHEST) - BP.receive_damage(INFINITY) //Capped by proc - BP.dismember() + BP.receive_damage(BP.max_damage) + if(BP.owner) + BP.dismember() max_limb_loss-- if(!max_limb_loss) break - /mob/living/carbon/human/blob_act(obj/structure/blob/B) if(stat == DEAD) return show_message(span_userdanger("The blob attacks you!")) var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - apply_damage(5, BRUTE, affecting, run_armor_check(affecting, MELEE)) + apply_damage(5, BRUTE, affecting, run_armor_check(affecting, BLUNT)) ///Calculates the siemens coeff based on clothing and species, can also restart hearts. @@ -517,10 +536,10 @@ return //Note we both check that the user is in cardiac arrest and can actually heartattack //If they can't, they're missing their heart and this would runtime - if(undergoing_cardiac_arrest() && can_heartattack() && !(flags & SHOCK_ILLUSION)) + if(undergoing_cardiac_arrest() && !(flags & SHOCK_ILLUSION)) if(shock_damage * siemens_coeff >= 1 && prob(25)) var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - if(heart.Restart() && stat <= SOFT_CRIT) + if(heart.Restart() && stat != CONSCIOUS) to_chat(src, span_notice("You feel your heart beating again!")) electrocution_animation(40) @@ -528,25 +547,15 @@ . = ..() if(. & EMP_PROTECT_CONTENTS) return - var/informed = FALSE + for(var/obj/item/bodypart/L as anything in src.bodyparts) if(!IS_ORGANIC_LIMB(L)) - if(!informed) - to_chat(src, span_userdanger("You feel a sharp pain as your robotic limbs overload.")) - informed = TRUE - switch(severity) - if(1) - L.receive_damage(0,10) - Paralyze(200) - if(2) - L.receive_damage(0,5) - Paralyze(100) - -/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc + L.emp_act() + +/mob/living/carbon/human/acid_act(acidpwr, acid_volume, bodyzone_hit, affect_clothing = TRUE, affect_body = TRUE) //todo: update this to utilize check_obscured_slots() //and make sure it's check_obscured_slots(TRUE) to stop aciding through visors etc var/list/damaged = list() var/list/inventory_items_to_kill = list() - var/acidity = acidpwr * min(acid_volume*0.005, 0.1) - //HEAD// + var/bodypart if(!bodyzone_hit || bodyzone_hit == BODY_ZONE_HEAD) //only if we didn't specify a zone or if that zone is the head. var/obj/item/clothing/head_clothes = null if(glasses) @@ -558,7 +567,7 @@ if(head) head_clothes = head if(head_clothes) - if(!(head_clothes.resistance_flags & UNACIDABLE)) + if(!(head_clothes.resistance_flags & UNACIDABLE) && affect_clothing) head_clothes.acid_act(acidpwr, acid_volume) update_worn_glasses() update_worn_mask() @@ -567,9 +576,9 @@ else to_chat(src, span_notice("Your [head_clothes.name] protects your head and face from the acid!")) else - . = get_bodypart(BODY_ZONE_HEAD) - if(.) - damaged += . + bodypart = get_bodypart(BODY_ZONE_HEAD) + if(bodypart) + damaged += bodypart if(ears) inventory_items_to_kill += ears @@ -581,16 +590,16 @@ if(wear_suit) chest_clothes = wear_suit if(chest_clothes) - if(!(chest_clothes.resistance_flags & UNACIDABLE)) + if(!(chest_clothes.resistance_flags & UNACIDABLE) && affect_clothing) chest_clothes.acid_act(acidpwr, acid_volume) update_worn_undersuit() update_worn_oversuit() else to_chat(src, span_notice("Your [chest_clothes.name] protects your body from the acid!")) else - . = get_bodypart(BODY_ZONE_CHEST) - if(.) - damaged += . + bodypart = get_bodypart(BODY_ZONE_CHEST) + if(bodypart) + damaged += bodypart if(wear_id) inventory_items_to_kill += wear_id if(r_store) @@ -612,7 +621,7 @@ arm_clothes = wear_suit if(arm_clothes) - if(!(arm_clothes.resistance_flags & UNACIDABLE)) + if(!(arm_clothes.resistance_flags & UNACIDABLE) && affect_clothing) arm_clothes.acid_act(acidpwr, acid_volume) update_worn_gloves() update_worn_undersuit() @@ -620,12 +629,12 @@ else to_chat(src, span_notice("Your [arm_clothes.name] protects your arms and hands from the acid!")) else - . = get_bodypart(BODY_ZONE_R_ARM) + bodypart = get_bodypart(BODY_ZONE_R_ARM) + if(bodypart) + damaged += bodypart + bodypart = get_bodypart(BODY_ZONE_L_ARM) if(.) - damaged += . - . = get_bodypart(BODY_ZONE_L_ARM) - if(.) - damaged += . + damaged += bodypart //LEGS & FEET// @@ -638,7 +647,7 @@ if(wear_suit && ((wear_suit.body_parts_covered & FEET) || (bodyzone_hit != "feet" && (wear_suit.body_parts_covered & LEGS)))) leg_clothes = wear_suit if(leg_clothes) - if(!(leg_clothes.resistance_flags & UNACIDABLE)) + if(!(leg_clothes.resistance_flags & UNACIDABLE) && affect_clothing) leg_clothes.acid_act(acidpwr, acid_volume) update_worn_shoes() update_worn_undersuit() @@ -646,51 +655,67 @@ else to_chat(src, span_notice("Your [leg_clothes.name] protects your legs and feet from the acid!")) else - . = get_bodypart(BODY_ZONE_R_LEG) - if(.) - damaged += . - . = get_bodypart(BODY_ZONE_L_LEG) - if(.) - damaged += . - + bodypart = get_bodypart(BODY_ZONE_R_LEG) + if(bodypart) + damaged += bodypart + bodypart = get_bodypart(BODY_ZONE_L_LEG) + if(bodypart) + damaged += bodypart //DAMAGE// - for(var/obj/item/bodypart/affecting in damaged) - affecting.receive_damage(acidity, 2*acidity) - - if(affecting.name == BODY_ZONE_HEAD) - if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement - affecting.receive_damage(acidity, 2*acidity) - emote("scream") - facial_hairstyle = "Shaved" - hairstyle = "Bald" - update_body_parts() - ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) - + if(affect_body) + var/screamed + var/affected_skin = FALSE + var/exposure_coeff = (bodyzone_hit ? 1 : BODYPARTS_DEFAULT_MAXIMUM) + var/damage = acidpwr * acid_volume / exposure_coeff + for(var/obj/item/bodypart/affecting in damaged) + damage *= (1 - get_permeability_protection(body_zone2cover_flags(affecting.body_zone))) + if(!damage) + continue + + affecting.receive_damage(damage, damage * 2, updating_health = FALSE, modifiers = NONE) + affected_skin = TRUE + if(prob(round(10 / exposure_coeff, 1)) && !screamed) + emote("agony") + screamed = TRUE + + if(affecting.name == BODY_ZONE_HEAD && !HAS_TRAIT(src, TRAIT_DISFIGURED)) + if(prob(min(acidpwr*acid_volume, 90))) //Applies disfigurement + emote("agony") + facial_hairstyle = "Shaved" + hairstyle = "Bald" + update_body_parts() + ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC) + + updatehealth() update_damage_overlays() - - //MELTING INVENTORY ITEMS// - //these items are all outside of armour visually, so melt regardless. - if(!bodyzone_hit) - if(back) - inventory_items_to_kill += back - if(belt) - inventory_items_to_kill += belt - - inventory_items_to_kill += held_items - - for(var/obj/item/inventory_item in inventory_items_to_kill) - inventory_item.acid_act(acidpwr, acid_volume) + if(affected_skin) + to_chat(src, span_danger("The acid on your skin eats away at your flesh!")) + + if(affect_clothing) + //MELTING INVENTORY ITEMS// + //these items are all outside of armour visually, so melt regardless. + if(!bodyzone_hit) + if(back) + inventory_items_to_kill += back + if(belt) + inventory_items_to_kill += belt + + inventory_items_to_kill += held_items + + for(var/obj/item/inventory_item in inventory_items_to_kill) + inventory_item.acid_act(acidpwr, acid_volume) return TRUE ///Overrides the point value that the mob is worth /mob/living/carbon/human/singularity_act() . = 20 - switch(mind?.assigned_role.type) - if(/datum/job/chief_engineer, /datum/job/station_engineer) + switch(mind?.assigned_role.title) + if(JOB_CHIEF_ENGINEER, JOB_STATION_ENGINEER) . = 100 - if(/datum/job/clown) - . = rand(-1000, 1000) + if(JOB_CLOWN) + if(!mind.miming) + . = rand(-1000, 1000) ..() //Called afterwards because getting the mind after getting gibbed is sketchy /mob/living/carbon/human/help_shake_act(mob/living/carbon/helper) @@ -704,192 +729,6 @@ return ..() -/mob/living/carbon/human/check_self_for_injuries() - if(stat >= UNCONSCIOUS) - return - var/list/combined_msg = list("
") //PARIAH EDIT CHANGE - - visible_message(span_notice("[src] examines [p_them()]self.")) //PARIAH EDIT CHANGE - - combined_msg += span_boldnotice("You check yourself for injuries.
") //PARIAH EDIT ADDITION - - 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/obj/item/bodypart/body_part as anything in bodyparts) - missing -= body_part.body_zone - if(body_part.is_pseudopart) //don't show injury text for fake bodyparts; ie chainsaw arms or synthetic armblades - continue - var/self_aware = FALSE - if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) - self_aware = TRUE - var/limb_max_damage = body_part.max_damage - var/status = "" - var/brutedamage = body_part.brute_dam - var/burndamage = body_part.burn_dam - if(hallucination) - if(prob(30)) - brutedamage += rand(30,40) - if(prob(30)) - burndamage += rand(30,40) - - if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) - status = "[brutedamage] brute damage and [burndamage] burn damage" - if(!brutedamage && !burndamage) - status = "no damage" - - else - if(body_part.type in hal_screwydoll)//Are we halucinating? - brutedamage = (hal_screwydoll[body_part.type] * 0.2)*limb_max_damage - - if(brutedamage > 0) - status = body_part.light_brute_msg - if(brutedamage > (limb_max_damage*0.4)) - status = body_part.medium_brute_msg - if(brutedamage > (limb_max_damage*0.8)) - status = body_part.heavy_brute_msg - if(brutedamage > 0 && burndamage > 0) - status += " and " - - if(burndamage > (limb_max_damage*0.8)) - status += body_part.heavy_burn_msg - else if(burndamage > (limb_max_damage*0.2)) - status += body_part.medium_burn_msg - else if(burndamage > 0) - status += body_part.light_burn_msg - - if(status == "") - status = "OK" - var/no_damage - if(status == "OK" || status == "no damage") - no_damage = TRUE - var/isdisabled = "" - if(body_part.bodypart_disabled) - isdisabled = " is disabled" - if(no_damage) - isdisabled += " but otherwise" - else - isdisabled += " and" - - var/broken = "" - if(body_part.check_bones() & CHECKBONES_BROKEN) - broken = " has a broken bone and" - - combined_msg += "\t Your [body_part.name][isdisabled][broken][self_aware ? " has " : " is "][status]." - - if(body_part.check_bones() & BP_BROKEN_BONES) - combined_msg += "\t [span_warning("Your [body_part.plaintext_zone] is broken!")]" - - for(var/obj/item/I in body_part.embedded_objects) - if(I.isEmbedHarmless()) - combined_msg += "\t There is \a [I] stuck to your [body_part.name]!" - else - combined_msg += "\t There is \a [I] embedded in your [body_part.name]!" - - for(var/t in missing) - combined_msg += span_boldannounce("Your [parse_zone(t)] is missing!") - - if(is_bleeding()) - var/list/obj/item/bodypart/bleeding_limbs = list() - for(var/obj/item/bodypart/part as anything in bodyparts) - if(part.get_modified_bleed_rate()) - bleeding_limbs += part - - var/num_bleeds = LAZYLEN(bleeding_limbs) - var/bleed_text = "You are bleeding from your" - switch(num_bleeds) - if(1 to 2) - bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]" - if(3 to INFINITY) - for(var/i in 1 to (num_bleeds - 1)) - var/obj/item/bodypart/BP = bleeding_limbs[i] - bleed_text += " [BP.name]," - bleed_text += " and [bleeding_limbs[num_bleeds].name]" - bleed_text += "!" - combined_msg += bleed_text - - if(stamina.loss) - if(HAS_TRAIT(src, TRAIT_EXHAUSTED)) - combined_msg += span_info("You're completely exhausted.") - else - combined_msg += span_info("You feel fatigued.") - if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) - if(toxloss) - if(toxloss > 10) - combined_msg += span_danger("You feel sick.") - else if(toxloss > 20) - combined_msg += span_danger("You feel nauseated.") - else if(toxloss > 40) - combined_msg += span_danger("You feel very unwell!") - if(oxyloss) - if(oxyloss > 10) - combined_msg += span_danger("You feel lightheaded.") - else if(oxyloss > 20) - combined_msg += span_danger("Your thinking is clouded and distant.") - else if(oxyloss > 30) - combined_msg += span_danger("You're choking!") - - if(!HAS_TRAIT(src, TRAIT_NOHUNGER)) - switch(nutrition) - if(NUTRITION_LEVEL_FULL to INFINITY) - combined_msg += span_info("You're completely stuffed!") - if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) - combined_msg += span_info("You're well fed!") - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - combined_msg += span_info("You're not hungry.") - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - combined_msg += span_info("You could use a bite to eat.") - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - combined_msg += span_info("You feel quite hungry.") - if(0 to NUTRITION_LEVEL_STARVING) - combined_msg += span_danger("You're starving!") - - //Compiles then shows the list of damaged organs and broken organs - var/list/broken = list() - var/list/damaged = list() - var/broken_message - var/damaged_message - var/broken_plural - var/damaged_plural - //Sets organs into their proper list - for(var/obj/item/organ/organ as anything in processing_organs) - if(organ.organ_flags & ORGAN_FAILING) - if(broken.len) - broken += ", " - broken += organ.name - else if(organ.damage > organ.low_threshold) - if(damaged.len) - damaged += ", " - damaged += organ.name - //Checks to enforce proper grammar, inserts words as necessary into the list - if(broken.len) - if(broken.len > 1) - broken.Insert(broken.len, "and ") - broken_plural = TRUE - else - var/holder = broken[1] //our one and only element - if(holder[length(holder)] == "s") - broken_plural = TRUE - //Put the items in that list into a string of text - for(var/B in broken) - broken_message += B - combined_msg += span_warning("Your [broken_message] [broken_plural ? "are" : "is"] non-functional!") - if(damaged.len) - if(damaged.len > 1) - damaged.Insert(damaged.len, "and ") - damaged_plural = TRUE - else - var/holder = damaged[1] - if(holder[length(holder)] == "s") - damaged_plural = TRUE - for(var/D in damaged) - damaged_message += D - combined_msg += span_info("Your [damaged_message] [damaged_plural ? "are" : "is"] hurt.") - - if(quirks.len) - combined_msg += span_notice("You have these quirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)].") - - to_chat(src, combined_msg.Join("\n")) - /mob/living/carbon/human/damage_clothes(damage_amount, damage_type = BRUTE, damage_flag = 0, def_zone) if(damage_type != BRUTE && damage_type != BURN) return diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 005128446a4a..f008afe5c192 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,20 @@ icon = 'icons/mob/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) + flags_1 = parent_type::flags_1 | PREVENT_CONTENTS_EXPLOSION_1 + + hud_possible = list( + HEALTH_HUD = 'icons/mob/huds/med_hud.dmi', + STATUS_HUD = 'icons/mob/huds/hud.dmi', + ID_HUD = 'icons/mob/huds/hud.dmi', + WANTED_HUD = 'icons/mob/huds/hud.dmi', + IMPLOYAL_HUD = 'icons/mob/huds/hud.dmi', + IMPCHEM_HUD = 'icons/mob/huds/hud.dmi', + IMPTRACK_HUD = 'icons/mob/huds/hud.dmi', + GLAND_HUD = 'icons/mob/huds/hud.dmi', + SENTIENT_DISEASE_HUD = 'icons/mob/huds/hud.dmi', + ) + hud_type = /datum/hud/human //pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 5b4cc795cdc4..7c5d2bb45df1 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -2,6 +2,8 @@ /mob/living/carbon/human/canBeHandcuffed() if(num_hands < 2) return FALSE + if(handcuffed) + return FALSE return TRUE @@ -37,22 +39,27 @@ var/id_name = get_id_name("") if(name_override) return name_override + if(face_name) if(id_name && (id_name != face_name)) return "[face_name] (as [id_name])" return face_name + if(id_name) return id_name + return "Unknown" //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name(if_no_face="Unknown") - if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible + if(wear_mask && (wear_mask.flags_inv & HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return if_no_face - if( head && (head.flags_inv&HIDEFACE) ) + + if(head && (head.flags_inv & HIDEFACE) ) return if_no_face //Likewise for hats + var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_HEAD) - if( !O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) //disfigured. use id-name if possible + if(!O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || !real_name || HAS_TRAIT(src, TRAIT_INVISIBLE_MAN)) //disfigured. use id-name if possible return if_no_face return real_name @@ -74,17 +81,14 @@ . = if_no_id //to prevent null-names making the mob unclickable return -/mob/living/carbon/human/get_idcard(hand_first = TRUE) +/mob/living/carbon/human/get_idcard(hand_first = TRUE, bypass_wallet) + RETURN_TYPE(/obj/item/card/id) + . = ..() if(. && hand_first) return //Check inventory slots - return (wear_id?.GetID() || belt?.GetID()) - -/mob/living/carbon/human/reagent_check(datum/reagent/R, delta_time, times_fired) - return dna.species.handle_chemicals(R, src, delta_time, times_fired) - // if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species. - + return (wear_id?.GetID(bypass_wallet) || belt?.GetID(bypass_wallet)) /mob/living/carbon/human/can_track(mob/living/user) if(istype(head, /obj/item/clothing/head)) @@ -96,10 +100,6 @@ /mob/living/carbon/human/can_use_guns(obj/item/G) . = ..() - if(G.trigger_guard == TRIGGER_GUARD_NORMAL) - if(check_chunky_fingers()) - balloon_alert(src, "fingers are too big!") - return FALSE if(HAS_TRAIT(src, TRAIT_NOGUNS)) to_chat(src, span_warning("You can't bring yourself to use a ranged weapon!")) return FALSE @@ -113,18 +113,6 @@ . = ..() . += "[dna.species.type]" -///Returns death message for mob examine text -/mob/living/carbon/human/proc/generate_death_examine_text() - var/mob/dead/observer/ghost = get_ghost(TRUE, TRUE) - var/t_He = p_they(TRUE) - var/t_his = p_their() - var/t_is = p_are() - //This checks to see if the body is revivable - if(key || !getorgan(/obj/item/organ/brain) || ghost?.can_reenter_corpse) - return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life...") - else - return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has departed...") - ///copies over clothing preferences like underwear to another human /mob/living/carbon/human/proc/copy_clothing_prefs(mob/living/carbon/human/destination) destination.underwear = underwear @@ -147,14 +135,12 @@ if (preference.is_randomizable()) preference.apply_to_human(src, preference.create_random_value(preferences)) -/mob/living/carbon/human/can_smell(intensity) +/mob/living/carbon/human/can_smell() var/turf/T = get_turf(src) if(!T) return FALSE - if(stat != CONSCIOUS || failed_last_breath || wear_mask || (head && (head?.permeability_coefficient < 1)) || !T.unsafe_return_air()?.total_moles) - return FALSE - if(!(intensity > last_smell_intensity) && !COOLDOWN_FINISHED(src, smell_time)) + if(stat || failed_last_breath || (wear_mask && wear_mask.body_parts_covered) || (head && (head?.permeability_coefficient < 1)) || !T.unsafe_return_air()?.total_moles) return FALSE 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 14003b86da49..bb78cf5afd5c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,12 +1,11 @@ /mob/living/carbon/human/get_movespeed_modifiers() var/list/considering = ..() if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN)) - . = list() for(var/id in considering) var/datum/movespeed_modifier/M = considering[id] - if(M.flags & IGNORE_NOSLOW || M.multiplicative_slowdown < 0) - .[id] = M - return + if(!(M.flags & IGNORE_NOSLOW) && M.slowdown > 0) + considering -= id + return considering /mob/living/carbon/human/slip(knockdown_amount, obj/slipped_on, lube_flags, paralyze, force_drop = FALSE) @@ -22,9 +21,10 @@ return ..() /mob/living/carbon/human/mob_negates_gravity() - return dna.species.negates_gravity(src) || ..() + if(dna.species.negates_gravity(src) || ..()) + return TRUE -/mob/living/carbon/human/Move(NewLoc, direct) +/mob/living/carbon/human/Move(NewLoc, direct, glide_size_override, z_movement_flags) . = ..() if(shoes && body_position == STANDING_UP && loc == NewLoc && has_gravity(loc)) SEND_SIGNAL(shoes, COMSIG_SHOES_STEP_ACTION) diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 5d27c1bcfa0e..f02beb3f5316 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -1,38 +1,26 @@ /mob/living/carbon/human/say_mod(input, list/message_mods = list()) verb_say = dna.species.say_mod - // Any subtype of slurring in our status effects make us "slur" - if(locate(/datum/status_effect/speech/slurring) in status_effects) - if (HAS_TRAIT(src, TRAIT_SIGN_LANG)) - return "loosely signs" - else - return "slurs" - return ..() /mob/living/carbon/human/GetVoice() - if(istype(wear_mask, /obj/item/clothing/mask/chameleon)) - var/obj/item/clothing/mask/chameleon/V = wear_mask - if(V.voice_change && wear_id) - var/obj/item/card/id/idcard = wear_id.GetID() - if(istype(idcard)) - return idcard.registered_name - else - return real_name - else - return real_name - if(istype(wear_mask, /obj/item/clothing/mask/infiltrator)) - var/obj/item/clothing/mask/infiltrator/V = wear_mask - if(V.voice_unknown) - return ("Unknown") - else - return real_name + if(istype(wear_mask) && !wear_mask.up) + if(HAS_TRAIT(wear_mask, TRAIT_REPLACES_VOICE)) + if(wear_id) + var/obj/item/card/id/idcard = wear_id.GetID() + if(istype(idcard)) + return idcard.registered_name + + return "Unknown" + + if(HAS_TRAIT(wear_mask, TRAIT_HIDES_VOICE)) + return "Unknown" + if(mind) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling?.mimicing) return changeling.mimicing - if(GetSpecialVoice()) - return GetSpecialVoice() - return real_name + + return special_voice || real_name /mob/living/carbon/human/IsVocal() // how do species that don't breathe talk? magic, that's what. @@ -51,11 +39,8 @@ special_voice = "" return -/mob/living/carbon/human/proc/GetSpecialVoice() - return special_voice - /mob/living/carbon/human/binarycheck() - if(stat >= SOFT_CRIT || !ears) + if(stat != CONSCIOUS || !ears) return FALSE var/obj/item/radio/headset/dongle = ears if(!istype(dongle)) @@ -84,4 +69,4 @@ /mob/living/carbon/human/get_alt_name() if(name != GetVoice()) - return " (as [get_id_name("Unknown")])"\ + return " (as [get_id_name("Unknown")])" diff --git a/code/modules/mob/living/carbon/human/human_stripping.dm b/code/modules/mob/living/carbon/human/human_stripping.dm index 93d68eb9f712..80ce12211d68 100644 --- a/code/modules/mob/living/carbon/human/human_stripping.dm +++ b/code/modules/mob/living/carbon/human/human_stripping.dm @@ -23,17 +23,17 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( /datum/strippable_item/mob_item_slot/legcuffs, ))) -/mob/living/carbon/human/should_strip(mob/user) +/mob/living/carbon/human/should_strip(mob/living/user) . = ..() if (!.) return FALSE - if (user.grab_state != GRAB_AGGRESSIVE) + var/obj/item/hand_item/grab/G = user.is_grabbing(src) + if(!G) return TRUE - if (ishuman(user)) - var/mob/living/carbon/human/human_user = user - return !human_user.can_be_firemanned(src) + if ((G.current_grab.damage_stage == GRAB_AGGRESSIVE) && !combat_mode) // Do not conflict with fireman carrying + return FALSE /datum/strippable_item/mob_item_slot/eyes key = STRIPPABLE_ITEM_EYES @@ -68,9 +68,9 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( if (!ismob(source)) return - var/mob/mob_source = source - mob_source.update_worn_undersuit() - mob_source.update_body() + if(iscarbon(source)) + var/mob/living/carbon/carbon_source = source + carbon_source.update_slots_for_item(source) /datum/strippable_item/mob_item_slot/suit key = STRIPPABLE_ITEM_SUIT @@ -189,12 +189,11 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( var/mob/living/carbon/carbon_source = source - var/obj/item/clothing/mask = carbon_source.wear_mask - if (!istype(mask)) - return - - if ((mask.clothing_flags & MASKINTERNALS) && istype(item, /obj/item/tank)) - return isnull(carbon_source.internal) ? "enable_internals" : "disable_internals" + if (carbon_source.can_breathe_internals() && istype(item, /obj/item/tank)) + if(carbon_source.internal != item) + return "enable_internals" + else + return "disable_internals" /proc/strippable_alternate_action_internals(obj/item/item, atom/source, mob/user) var/obj/item/tank/tank = item @@ -205,26 +204,26 @@ GLOBAL_LIST_INIT(strippable_human_items, create_strippable_list(list( if (!istype(carbon_source)) return - var/obj/item/clothing/mask = carbon_source.wear_mask - if (!istype(mask) || !(mask.clothing_flags & MASKINTERNALS)) + if (!carbon_source.can_breathe_internals()) return carbon_source.visible_message( - span_danger("[user] tries to [isnull(carbon_source.internal) ? "open": "close"] the valve on [source]'s [item.name]."), - span_userdanger("[user] tries to [isnull(carbon_source.internal) ? "open": "close"] the valve on your [item.name]."), + span_danger("[user] tries to [carbon_source.internal != item ? "open": "close"] the valve on [source]'s [item.name]."), + span_userdanger("[user] tries to [carbon_source.internal != item ? "open": "close"] the valve on your [item.name]."), ignored_mobs = user, ) - to_chat(user, span_notice("You try to [isnull(carbon_source.internal) ? "open": "close"] the valve on [source]'s [item.name]...")) + to_chat(user, span_notice("You try to [carbon_source.internal != item ? "open": "close"] the valve on [source]'s [item.name]...")) if(!do_after(user, carbon_source, INTERNALS_TOGGLE_DELAY)) return - if(carbon_source.internal) - carbon_source.internal = null + if (carbon_source.internal == item) + carbon_source.close_internals() + else if (!QDELETED(item)) - if((carbon_source.wear_mask?.clothing_flags & MASKINTERNALS) || carbon_source.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - carbon_source.internal = item + if(!carbon_source.try_open_internals(item)) + return carbon_source.visible_message( span_danger("[user] [isnull(carbon_source.internal) ? "closes": "opens"] the valve on [source]'s [item.name]."), diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index e5f73a73c43b..41af2c5ac007 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -54,7 +54,7 @@ There are several things that need to be remembered: update_worn_id() update_worn_glasses() update_worn_gloves() - update_inv_ears() + update_worn_ears() update_worn_shoes() update_suit_storage() update_worn_mask() @@ -84,7 +84,7 @@ There are several things that need to be remembered: var/obj/item/clothing/under/uniform = w_uniform update_hud_uniform(uniform) - if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) + if(check_obscured_slots() & ITEM_SLOT_ICLOTHING) return @@ -119,6 +119,7 @@ There are several things that need to be remembered: handled_by_bodytype = FALSE //END SPECIES HANDLING uniform_overlay = uniform.build_worn_icon( + src, default_layer = UNIFORM_LAYER, default_icon_file = icon_file, isinhands = FALSE, @@ -137,8 +138,6 @@ There are several things that need to be remembered: overlays_standing[UNIFORM_LAYER] = uniform_overlay apply_overlay(UNIFORM_LAYER) - update_mutant_bodyparts() - /mob/living/carbon/human/update_worn_id() remove_overlay(ID_LAYER) @@ -151,6 +150,10 @@ There are several things that need to be remembered: if(wear_id) var/obj/item/worn_item = wear_id update_hud_id(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_ID) + return + var/handled_by_bodytype = TRUE var/icon_file @@ -158,7 +161,7 @@ There are several things that need to be remembered: icon_file = 'icons/mob/mob.dmi' handled_by_bodytype = FALSE - id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = icon_file) + id_overlay = wear_id.build_worn_icon(src, default_layer = ID_LAYER, default_icon_file = icon_file) if(!id_overlay) return @@ -182,6 +185,7 @@ There are several things that need to be remembered: cut_overlay(bloody_overlay) if(!gloves && blood_in_hands && (num_hands > 0)) bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER) + bloody_overlay.color = get_blood_dna_color(return_blood_DNA()) || COLOR_HUMAN_BLOOD if(num_hands < 2) if(has_left_hand(FALSE)) bloody_overlay.icon_state = "bloodyhands_left" @@ -195,6 +199,10 @@ There are several things that need to be remembered: if(gloves) var/obj/item/worn_item = gloves update_hud_gloves(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_GLOVES) + return + var/icon_file var/handled_by_bodytype = TRUE if(dna.species.bodytype & BODYTYPE_TESHARI) @@ -210,6 +218,7 @@ There are several things that need to be remembered: handled_by_bodytype = FALSE gloves_overlay = gloves.build_worn_icon( + src, default_layer = GLOVES_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null, @@ -240,30 +249,34 @@ There are several things that need to be remembered: var/mutable_appearance/glasses_overlay update_hud_glasses(worn_item) + if(check_obscured_slots() & ITEM_SLOT_EYES) + return + var/handled_by_bodytype = TRUE var/icon_file - if(!(head?.flags_inv & HIDEEYES) && !(wear_mask?.flags_inv & HIDEEYES)) - if(dna.species.bodytype & BODYTYPE_TESHARI) - if(glasses.supports_variations_flags & CLOTHING_TESHARI_VARIATION) - icon_file = TESHARI_EYES_FILE + if(dna.species.bodytype & BODYTYPE_TESHARI) + if(glasses.supports_variations_flags & CLOTHING_TESHARI_VARIATION) + icon_file = TESHARI_EYES_FILE - if(dna.species.bodytype & BODYTYPE_VOX_OTHER) - if(worn_item.supports_variations_flags & CLOTHING_VOX_VARIATION) - icon_file = worn_item.worn_icon_vox || VOX_EYES_FILE + if(dna.species.bodytype & BODYTYPE_VOX_OTHER) + if(worn_item.supports_variations_flags & CLOTHING_VOX_VARIATION) + icon_file = worn_item.worn_icon_vox || VOX_EYES_FILE - if(!icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item))) - icon_file = 'icons/mob/clothing/eyes.dmi' - handled_by_bodytype = FALSE + if(!icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item))) + icon_file = 'icons/mob/clothing/eyes.dmi' + handled_by_bodytype = FALSE - glasses_overlay = glasses.build_worn_icon( - default_layer = GLASSES_LAYER, - default_icon_file = icon_file, - override_file = handled_by_bodytype ? icon_file : null, - fallback = handled_by_bodytype ? null : dna.species.fallback_clothing_path - ) + glasses_overlay = glasses.build_worn_icon( + src, + default_layer = GLASSES_LAYER, + default_icon_file = icon_file, + override_file = handled_by_bodytype ? icon_file : null, + fallback = handled_by_bodytype ? null : dna.species.fallback_clothing_path + ) if(!glasses_overlay) return + if(!handled_by_bodytype && (OFFSET_GLASSES in dna.species.offset_features)) glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] @@ -271,7 +284,7 @@ There are several things that need to be remembered: apply_overlay(GLASSES_LAYER) -/mob/living/carbon/human/update_inv_ears() +/mob/living/carbon/human/update_worn_ears() remove_overlay(EARS_LAYER) if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated @@ -286,6 +299,9 @@ There are several things that need to be remembered: var/mutable_appearance/ears_overlay update_hud_ears(worn_item) + if(check_obscured_slots() & ITEM_SLOT_EARS) + return + var/handled_by_bodytype = TRUE var/icon_file if(dna.species.bodytype & BODYTYPE_TESHARI) @@ -300,7 +316,7 @@ There are several things that need to be remembered: handled_by_bodytype = FALSE icon_file = 'icons/mob/clothing/ears.dmi' - ears_overlay = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = icon_file) + ears_overlay = ears.build_worn_icon(src, default_layer = EARS_LAYER, default_icon_file = icon_file) if(!ears_overlay) return @@ -319,33 +335,36 @@ There are several things that need to be remembered: if(wear_neck) var/obj/item/worn_item = wear_neck + update_hud_neck(wear_neck) - if(!(check_obscured_slots() & ITEM_SLOT_NECK)) - var/mutable_appearance/neck_overlay - var/icon_file - var/handled_by_bodytype = TRUE - if(dna.species.bodytype & BODYTYPE_TESHARI) - if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) - icon_file = TESHARI_NECK_FILE + if(check_obscured_slots() & ITEM_SLOT_NECK) + return - if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) - handled_by_bodytype = FALSE - icon_file = 'icons/mob/clothing/neck.dmi' + var/mutable_appearance/neck_overlay + var/icon_file + var/handled_by_bodytype = TRUE + if(dna.species.bodytype & BODYTYPE_TESHARI) + if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) + icon_file = TESHARI_NECK_FILE - neck_overlay = worn_item.build_worn_icon( - default_layer = NECK_LAYER, - default_icon_file = icon_file, - override_file = handled_by_bodytype ? icon_file : null, - fallback = handled_by_bodytype ? null : dna.species.fallback_clothing_path - ) + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + handled_by_bodytype = FALSE + icon_file = 'icons/mob/clothing/neck.dmi' - if(!neck_overlay) - return - if(!handled_by_bodytype && (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 - update_hud_neck(wear_neck) + neck_overlay = worn_item.build_worn_icon( + src, + default_layer = NECK_LAYER, + default_icon_file = icon_file, + override_file = handled_by_bodytype ? icon_file : null, + fallback = handled_by_bodytype ? null : dna.species.fallback_clothing_path + ) + + if(!neck_overlay) + return + if(!handled_by_bodytype && (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) @@ -364,13 +383,16 @@ There are several things that need to be remembered: var/mutable_appearance/shoes_overlay var/icon_file update_hud_shoes(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_FEET) + return + var/handled_by_bodytype = TRUE - //(Currently) unused digitigrade handling if((dna.species.bodytype & BODYTYPE_DIGITIGRADE) && (worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) - var/obj/item/bodypart/leg = src.get_bodypart(BODY_ZONE_L_LEG) - if(leg.limb_id == "digitigrade")//Snowflakey and bad. But it makes it look consistent. - icon_file = shoes.worn_icon_digitigrade || DIGITIGRADE_SHOES_FILE //PARIAH EDIT + var/obj/item/bodypart/leg/leg = src.get_bodypart(BODY_ZONE_L_LEG) + if(leg.limb_id == leg.digitigrade_id)//Snowflakey and bad. But it makes it look consistent. + icon_file = shoes.worn_icon_digitigrade || DIGITIGRADE_SHOES_FILE if(dna.species.bodytype & BODYTYPE_TESHARI) if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) @@ -387,6 +409,7 @@ There are several things that need to be remembered: icon_file = DEFAULT_SHOES_FILE shoes_overlay = shoes.build_worn_icon( + src, default_layer = SHOES_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null, @@ -415,7 +438,10 @@ There are several things that need to be remembered: var/mutable_appearance/s_store_overlay update_hud_s_store(worn_item) - s_store_overlay = worn_item.build_worn_icon(default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi') + if(check_obscured_slots() & ITEM_SLOT_SUITSTORE) + return + + s_store_overlay = worn_item.build_worn_icon(src, default_layer = SUIT_STORE_LAYER, default_icon_file = 'icons/mob/clothing/belt_mirror.dmi') if(!s_store_overlay) return @@ -435,6 +461,10 @@ There are several things that need to be remembered: var/obj/item/worn_item = head var/mutable_appearance/head_overlay update_hud_head(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_HEAD) + return + var/handled_by_bodytype = TRUE //PARIAH EDIT var/icon_file @@ -455,6 +485,7 @@ There are several things that need to be remembered: icon_file = 'icons/mob/clothing/head.dmi' head_overlay = head.build_worn_icon( + src, default_layer = HEAD_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null @@ -467,7 +498,6 @@ There are several things that need to be remembered: head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] overlays_standing[HEAD_LAYER] = head_overlay - update_mutant_bodyparts() apply_overlay(HEAD_LAYER) /mob/living/carbon/human/update_worn_belt() @@ -481,6 +511,10 @@ There are several things that need to be remembered: var/obj/item/worn_item = belt var/mutable_appearance/belt_overlay update_hud_belt(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_BELT) + return + var/handled_by_bodytype = TRUE var/icon_file if(dna.species.bodytype & BODYTYPE_TESHARI) @@ -496,6 +530,7 @@ There are several things that need to be remembered: icon_file = 'icons/mob/clothing/belt.dmi' belt_overlay = belt.build_worn_icon( + src, default_layer = BELT_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null @@ -521,15 +556,19 @@ There are several things that need to be remembered: var/obj/item/worn_item = wear_suit var/mutable_appearance/suit_overlay update_hud_wear_suit(worn_item) - var/icon_file + if(check_obscured_slots() & ITEM_SLOT_OCLOTHING) + return + + var/icon_file var/handled_by_bodytype = TRUE //PARIAH EDIT //More currently unused digitigrade handling if(dna.species.bodytype & BODYTYPE_DIGITIGRADE) if(worn_item.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) - icon_file = wear_suit.worn_icon_digitigrade || DIGITIGRADE_SUIT_FILE //PARIAH EDIT + icon_file = wear_suit.worn_icon_digitigrade || DIGITIGRADE_SUIT_FILE + //PARIAH EDIT END if(dna.species.bodytype & BODYTYPE_TESHARI) if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) @@ -544,6 +583,7 @@ There are several things that need to be remembered: icon_file = DEFAULT_SUIT_FILE suit_overlay = wear_suit.build_worn_icon( + src, default_layer = SUIT_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null, @@ -556,8 +596,6 @@ There are several things that need to be remembered: 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 - update_body_parts() - update_mutant_bodyparts() apply_overlay(SUIT_LAYER) @@ -594,45 +632,48 @@ There are several things that need to be remembered: inv.update_icon() if(wear_mask) - if(!(check_obscured_slots() & ITEM_SLOT_MASK)) - var/obj/item/worn_item = wear_mask - update_hud_wear_mask(worn_item) - var/mutable_appearance/mask_overlay - var/icon_file - var/handled_by_bodytype = TRUE + var/obj/item/worn_item = wear_mask + update_hud_wear_mask(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_MASK) + return + + var/mutable_appearance/mask_overlay + var/icon_file + var/handled_by_bodytype = TRUE - if(dna.species.bodytype & BODYTYPE_SNOUTED) - if(worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) - icon_file = wear_mask.worn_icon_snouted || SNOUTED_MASK_FILE + if(dna.species.bodytype & BODYTYPE_SNOUTED) + if(worn_item.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) + icon_file = wear_mask.worn_icon_snouted || SNOUTED_MASK_FILE - if(dna.species.bodytype & BODYTYPE_VOX_BEAK) - if(worn_item.supports_variations_flags & CLOTHING_VOX_VARIATION) - icon_file = worn_item.worn_icon_vox || VOX_MASK_FILE + if(dna.species.bodytype & BODYTYPE_VOX_BEAK) + if(worn_item.supports_variations_flags & CLOTHING_VOX_VARIATION) + icon_file = worn_item.worn_icon_vox || VOX_MASK_FILE - if(dna.species.bodytype & BODYTYPE_TESHARI) - if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) - icon_file = TESHARI_MASK_FILE + if(dna.species.bodytype & BODYTYPE_TESHARI) + if(worn_item.supports_variations_flags & CLOTHING_TESHARI_VARIATION) + icon_file = TESHARI_MASK_FILE - if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) - icon_file = 'icons/mob/clothing/mask.dmi' - handled_by_bodytype = FALSE + if(!(icon_exists(icon_file, RESOLVE_ICON_STATE(worn_item)))) + icon_file = 'icons/mob/clothing/mask.dmi' + handled_by_bodytype = FALSE - mask_overlay = wear_mask.build_worn_icon( - default_layer = FACEMASK_LAYER, - default_icon_file = icon_file, - override_file = handled_by_bodytype ? icon_file : null - ) + mask_overlay = wear_mask.build_worn_icon( + src, + default_layer = FACEMASK_LAYER, + default_icon_file = icon_file, + override_file = handled_by_bodytype ? icon_file : null + ) - if(!mask_overlay) - return - if(!handled_by_bodytype && (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] + if(!mask_overlay) + return + if(!handled_by_bodytype && (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 + 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_worn_back() remove_overlay(BACK_LAYER) @@ -644,7 +685,12 @@ There are several things that need to be remembered: if(back) var/obj/item/worn_item = back var/mutable_appearance/back_overlay + update_hud_back(worn_item) + + if(check_obscured_slots() & ITEM_SLOT_BACK) + return + var/icon_file var/handled_by_bodytype = TRUE if(dna.species.bodytype & BODYTYPE_TESHARI) @@ -661,6 +707,7 @@ There are several things that need to be remembered: handled_by_bodytype = FALSE back_overlay = back.build_worn_icon( + src, default_layer = BACK_LAYER, default_icon_file = icon_file, override_file = handled_by_bodytype ? icon_file : null @@ -693,14 +740,13 @@ There are several things that need to be remembered: if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) worn_item.screen_loc = ui_hand_position(get_held_index_of_item(worn_item)) client.screen += worn_item - if(observers?.len) - for(var/M in observers) - var/mob/dead/observe = M + if(LAZYLEN(observers)) + for(var/mob/dead/observe as anything in observers) if(observe.client && observe.client.eye == src) observe.client.screen += worn_item else observers -= observe - if(!observers.len) + if(!length(observers)) observers = null break @@ -712,9 +758,9 @@ There are several things that need to be remembered: var/mutable_appearance/hand_overlay if(get_held_index_of_item(worn_item) % 2 == 0) icon_file = worn_item.righthand_file - hand_overlay = worn_item.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + hand_overlay = worn_item.build_worn_icon(src, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) else - hand_overlay = worn_item.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) + hand_overlay = worn_item.build_worn_icon(src, default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) hands += hand_overlay overlays_standing[HANDS_LAYER] = hands @@ -879,7 +925,7 @@ generate/load female uniform sprites matching all previously decided variables */ -/obj/item/proc/build_worn_icon(default_layer = 0, default_icon_file = null, isinhands = FALSE, female_uniform = NO_FEMALE_UNIFORM, override_state = null, override_file = null, fallback = null) +/obj/item/proc/build_worn_icon(mob/living/carbon/wearer, default_layer = 0, default_icon_file = null, isinhands = FALSE, female_uniform = NO_FEMALE_UNIFORM, override_state = null, override_file = null, fallback = null) //Find a valid icon_state from variables+arguments var/t_state @@ -907,7 +953,7 @@ generate/load female uniform sprites matching all previously decided variables //Get the overlays for this item when it's being worn //eg: ammo counters, primed grenade flashes, etc. - var/list/worn_overlays = worn_overlays(standing, isinhands, file2use) + var/list/worn_overlays = worn_overlays(wearer, standing, isinhands, file2use) if(worn_overlays?.len) standing.overlays.Add(worn_overlays) diff --git a/code/modules/mob/living/carbon/human/init_signals.dm b/code/modules/mob/living/carbon/human/init_signals.dm new file mode 100644 index 000000000000..8930a920b5c1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/init_signals.dm @@ -0,0 +1,15 @@ +//Called on /mob/living/carbon/Initialize(mapload), for the carbon mobs to register relevant signals. +/mob/living/carbon/human/register_init_signals() + . = ..() + RegisterSignal(src, \ + list( + SIGNAL_ADDTRAIT(TRAIT_INVISIBLE_MAN), + SIGNAL_REMOVETRAIT(TRAIT_INVISIBLE_MAN), + SIGNAL_ADDTRAIT(TRAIT_DISFIGURED), + SIGNAL_REMOVETRAIT(TRAIT_DISFIGURED), + ),\ + PROC_REF(do_name_update)) + +/mob/living/carbon/human/proc/do_name_update(datum/source) + SIGNAL_HANDLER + update_name() diff --git a/code/modules/mob/living/carbon/human/injury_check.dm b/code/modules/mob/living/carbon/human/injury_check.dm new file mode 100644 index 000000000000..db64f83f10d1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/injury_check.dm @@ -0,0 +1,188 @@ +/mob/living/carbon/human/check_self_for_injuries() + if(stat >= UNCONSCIOUS) + return + + var/list/combined_msg = list("
") //PARIAH EDIT CHANGE + + visible_message(span_notice("[src] examines [p_them()]self.")) //PARIAH EDIT CHANGE + + 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/bodyparts = sort_list(src.bodyparts, GLOBAL_PROC_REF(cmp_bodyparts_display_order)) + for(var/obj/item/bodypart/body_part as anything in bodyparts) + missing -= body_part.body_zone + if(body_part.is_pseudopart) //don't show injury text for fake bodyparts; ie chainsaw arms or synthetic armblades + continue + + var/self_aware = FALSE + if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) + self_aware = TRUE + + var/limb_max_damage = body_part.max_damage + var/status = "" + var/brutedamage = body_part.brute_dam + var/burndamage = body_part.burn_dam + if(hallucination) + if(prob(30)) + brutedamage += rand(30,40) + if(prob(30)) + burndamage += rand(30,40) + + if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) + status = "[brutedamage] brute damage and [burndamage] burn damage" + if(!brutedamage && !burndamage) + status = "no damage" + + else + if(body_part.type in hal_screwydoll)//Are we halucinating? + brutedamage = (hal_screwydoll[body_part.type] * 0.2)*limb_max_damage + + if(brutedamage > 0) + status = body_part.light_brute_msg + if(brutedamage > (limb_max_damage*0.4)) + status = body_part.medium_brute_msg + if(brutedamage > (limb_max_damage*0.8)) + status = body_part.heavy_brute_msg + if(brutedamage > 0 && burndamage > 0) + status += " and " + + if(burndamage > (limb_max_damage*0.8)) + status += body_part.heavy_burn_msg + else if(burndamage > (limb_max_damage*0.2)) + status += body_part.medium_burn_msg + else if(burndamage > 0) + status += body_part.light_burn_msg + + if(status == "") + status = "OK" + + var/no_damage + if(status == "OK" || status == "no damage") + no_damage = TRUE + + var/isdisabled = "" + if(body_part.bodypart_disabled && !body_part.is_stump) + isdisabled = " is disabled" + if(no_damage) + isdisabled += " but otherwise" + else + isdisabled += " and" + + var/broken = "" + if(body_part.check_bones() & CHECKBONES_BROKEN) + broken = " has a broken bone and" + + combined_msg += "Your [body_part.name][isdisabled][broken][self_aware ? " has " : " is "][status]." + + if(body_part.check_bones() & BP_BROKEN_BONES) + combined_msg += "[span_warning("Your [body_part.plaintext_zone] is broken!")]" + + for(var/t in missing) + combined_msg += span_boldannounce("Your [parse_zone(t)] is missing!") + + if(is_bleeding()) + var/list/obj/item/bodypart/bleeding_limbs = list() + for(var/obj/item/bodypart/part as anything in bodyparts) + if(part.get_modified_bleed_rate()) + bleeding_limbs += part + + var/num_bleeds = LAZYLEN(bleeding_limbs) + var/bleed_text = "You are bleeding from your" + switch(num_bleeds) + if(1 to 2) + bleed_text += " [bleeding_limbs[1].name][num_bleeds == 2 ? " and [bleeding_limbs[2].name]" : ""]" + if(3 to INFINITY) + for(var/i in 1 to (num_bleeds - 1)) + var/obj/item/bodypart/BP = bleeding_limbs[i] + bleed_text += " [BP.name]," + bleed_text += " and [bleeding_limbs[num_bleeds].name]" + bleed_text += "!" + combined_msg += bleed_text + + if(stamina.loss) + if(HAS_TRAIT(src, TRAIT_EXHAUSTED)) + combined_msg += span_info("You're completely exhausted.") + else + combined_msg += span_info("You feel fatigued.") + if(HAS_TRAIT(src, TRAIT_SELF_AWARE)) + var/toxloss = getToxLoss() + if(toxloss) + if(toxloss > 10) + combined_msg += span_danger("You feel sick.") + else if(toxloss > 20) + combined_msg += span_danger("You feel nauseated.") + else if(toxloss > 40) + combined_msg += span_danger("You feel very unwell!") + if(oxyloss) + if(oxyloss > 10) + combined_msg += span_danger("You feel lightheaded.") + else if(oxyloss > 20) + combined_msg += span_danger("Your thinking is clouded and distant.") + else if(oxyloss > 30) + combined_msg += span_danger("You're choking!") + + if(!HAS_TRAIT(src, TRAIT_NOHUNGER)) + switch(nutrition) + if(NUTRITION_LEVEL_FULL to INFINITY) + combined_msg += span_info("You're completely stuffed!") + if(NUTRITION_LEVEL_WELL_FED to NUTRITION_LEVEL_FULL) + combined_msg += span_info("You're well fed!") + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + combined_msg += span_info("You're not hungry.") + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + combined_msg += span_info("You could use a bite to eat.") + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + combined_msg += span_info("You feel quite hungry.") + if(0 to NUTRITION_LEVEL_STARVING) + combined_msg += span_danger("You're starving!") + + //Compiles then shows the list of damaged organs and broken organs + var/list/broken = list() + var/list/damaged = list() + var/broken_message + var/damaged_message + var/broken_plural + var/damaged_plural + //Sets organs into their proper list + for(var/obj/item/organ/organ as anything in processing_organs) + if(organ.organ_flags & ORGAN_DEAD) + if(broken.len) + broken += ", " + broken += organ.name + else if(organ.damage > organ.low_threshold) + if(damaged.len) + damaged += ", " + damaged += organ.name + + //Checks to enforce proper grammar, inserts words as necessary into the list + if(broken.len) + if(broken.len > 1) + broken.Insert(broken.len, "and ") + broken_plural = TRUE + else + var/holder = broken[1] //our one and only element + if(holder[length(holder)] == "s") + broken_plural = TRUE + //Put the items in that list into a string of text + for(var/B in broken) + broken_message += B + combined_msg += span_warning("Your [broken_message] [broken_plural ? "are" : "is"] non-functional!") + + if(damaged.len) + if(damaged.len > 1) + damaged.Insert(damaged.len, "and ") + damaged_plural = TRUE + else + var/holder = damaged[1] + if(holder[length(holder)] == "s") + damaged_plural = TRUE + for(var/D in damaged) + damaged_message += D + combined_msg += span_info("Your [damaged_message] [damaged_plural ? "are" : "is"] hurt.") + + if(quirks.len) + combined_msg += span_notice("You have these quirks: [get_quirk_string(FALSE, CAT_QUIRK_ALL)].") + + combined_msg += "
" //close initial div + + to_chat(src, combined_msg.Join("\n")) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index e760581c3b49..2e9d027d20db 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -71,8 +71,10 @@ return ..() ///Returns a list of every item slot contents on the user. -/mob/living/carbon/human/get_all_worn_items() - . = return_worn_clothing() + return_extra_wearables() + return_pocket_slots() + return_cuff_slots() +/mob/living/carbon/human/get_all_worn_items(include_pockets = TRUE) + . = return_extra_wearables() + return_worn_clothing() + return_cuff_slots() + if(include_pockets) + . += return_pocket_slots() ///Bruteforce check for any type or subtype of an item. /mob/living/carbon/human/proc/is_wearing_item_of_type(type2check) @@ -138,78 +140,98 @@ if(belt) return belt = I - update_worn_belt() + update_slots_for_item(I, slot) + if(ITEM_SLOT_ID) if(wear_id) return + wear_id = I sec_hud_set_ID() - update_worn_id() + update_slots_for_item(I, slot) + if(ITEM_SLOT_EARS) if(ears) return + ears = I - update_inv_ears() + update_slots_for_item(I, slot) + if(ITEM_SLOT_EYES) if(glasses) return + glasses = I + update_slots_for_item(I, slot) + var/obj/item/clothing/glasses/G = I if(G.glass_colour_type) update_glasses_color(G, 1) + if(G.tint) update_tint() + if(G.vision_correction) clear_fullscreen("nearsighted") + if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() - update_worn_glasses() + if(ITEM_SLOT_GLOVES) if(gloves) return + gloves = I - update_worn_gloves() + update_slots_for_item(I, slot) + if(ITEM_SLOT_FEET) if(shoes) return + shoes = I - update_worn_shoes() + update_slots_for_item(I, slot) + if(ITEM_SLOT_OCLOTHING) if(wear_suit) return wear_suit = I + update_slots_for_item(I, slot) - if(I.flags_inv & HIDEJUMPSUIT) - update_worn_undersuit() if(wear_suit.breakouttime) //when equipping a straightjacket - ADD_TRAIT(src, TRAIT_RESTRAINED, SUIT_TRAIT) - stop_pulling() //can't pull if restrained - update_mob_action_buttons() //certain action buttons will no longer be usable. - update_worn_oversuit() + ADD_TRAIT(src, TRAIT_ARMS_RESTRAINED, SUIT_TRAIT) + release_all_grabs() //can't pull if restrained + update_mob_action_buttons() //certain action buttons will no longer be usable + if(ITEM_SLOT_ICLOTHING) if(w_uniform) return + w_uniform = I + update_slots_for_item(I, slot) update_suit_sensors() - update_worn_undersuit() + if(ITEM_SLOT_LPOCKET) l_store = I update_pockets() + if(ITEM_SLOT_RPOCKET) r_store = I update_pockets() + if(ITEM_SLOT_SUITSTORE) if(s_store) return + s_store = I update_suit_storage() + else to_chat(src, span_danger("You are trying to equip this item to an unsupported inventory slot. Report this to a coder!")) //Item is handled and in slot, valid to call callback, for this proc should always be true if(!not_handled) - has_equipped(I, slot, initial) + afterEquipItem(I, slot, initial) // Send a signal for when we equip an item that used to cover our feet/shoes. Used for bloody feet if((I.body_parts_covered & FEET) || (I.flags_inv | I.transparent_protection) & HIDESHOES) @@ -223,25 +245,28 @@ var/obj/item/thing = sloties . += thing?.slowdown -/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/carbon/human/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = 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. if(!. || !I) return + if(index && !QDELETED(src) && dna.species.mutanthands) //hand freed, fill with claws, skip if we're getting deleted. put_in_hand(new dna.species.mutanthands(), index) + if(I == wear_suit) if(s_store && invdrop) dropItemToGround(s_store, TRUE) //It makes no sense for your suit storage to stay on you if you drop your suit. + if(wear_suit.breakouttime) //when unequipping a straightjacket - REMOVE_TRAIT(src, TRAIT_RESTRAINED, SUIT_TRAIT) + REMOVE_TRAIT(src, TRAIT_ARMS_RESTRAINED, SUIT_TRAIT) drop_all_held_items() //suit is restraining update_mob_action_buttons() //certain action buttons may be usable again. + wear_suit = null if(!QDELETED(src)) //no need to update we're getting deleted anyway - if(I.flags_inv & HIDEJUMPSUIT) - update_worn_undersuit() - update_worn_oversuit() + update_slots_for_item(I, ITEM_SLOT_OCLOTHING) + else if(I == w_uniform) if(invdrop) if(r_store) @@ -252,81 +277,119 @@ dropItemToGround(wear_id) if(belt) dropItemToGround(belt) + w_uniform = null update_suit_sensors() + if(!QDELETED(src)) - update_worn_undersuit() + update_slots_for_item(I, ITEM_SLOT_ICLOTHING) + else if(I == gloves) gloves = null if(!QDELETED(src)) - update_worn_gloves() + update_slots_for_item(I, ITEM_SLOT_GLOVES) + else if(I == glasses) glasses = null + var/obj/item/clothing/glasses/G = I if(G.glass_colour_type) update_glasses_color(G, 0) + if(G.tint) update_tint() - if(G.vision_correction) - if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) + + if(G.vision_correction && HAS_TRAIT(src, TRAIT_NEARSIGHT)) + 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)) - update_worn_glasses() + update_slots_for_item(I, ITEM_SLOT_EYES) + else if(I == ears) ears = null if(!QDELETED(src)) - update_inv_ears() - else if(I == shoes) - shoes = null - if(!QDELETED(src)) - update_worn_shoes() + update_slots_for_item(I, ITEM_SLOT_EARS) + else if(I == belt) belt = null if(!QDELETED(src)) - update_worn_belt() + update_slots_for_item(I, ITEM_SLOT_BELT) + update_name() + else if(I == wear_id) wear_id = null sec_hud_set_ID() if(!QDELETED(src)) - update_worn_id() + update_slots_for_item(I, ITEM_SLOT_ID) + update_name() + else if(I == r_store) r_store = null if(!QDELETED(src)) update_pockets() + else if(I == l_store) l_store = null if(!QDELETED(src)) update_pockets() + else if(I == s_store) s_store = null if(!QDELETED(src)) update_suit_storage() + update_equipment_speed_mods() // Send a signal for when we unequip an item that used to cover our feet/shoes. Used for bloody feet if((I.body_parts_covered & FEET) || (I.flags_inv | I.transparent_protection) & HIDESHOES) SEND_SIGNAL(src, COMSIG_CARBON_UNEQUIP_SHOECOVER, I, force, newloc, no_move, invdrop, silent) +/mob/living/carbon/human/toggle_internals(obj/item/tank, is_external = FALSE) + // Just close the tank if it's the one the mob already has open. + var/obj/item/existing_tank = is_external ? external : internal + if(tank == existing_tank) + return toggle_close_internals(is_external) + // Use breathing tube regardless of mask. + if(can_breathe_tube()) + return toggle_open_internals(tank, is_external) + + // Use mask in absence of tube. + if(isclothing(wear_mask) && ((wear_mask.visor_flags & MASKINTERNALS) || (wear_mask.clothing_flags & MASKINTERNALS))) + // Adjust dishevelled breathing mask back onto face. + if (wear_mask.mask_adjusted) + wear_mask.adjustmask(src) + return toggle_open_internals(tank, is_external) + + // Use helmet in absence of tube or valid mask. + if(can_breathe_helmet()) + return toggle_open_internals(tank, is_external) + + // Notify user of missing valid breathing apparatus. + if (wear_mask) + // Invalid mask + to_chat(src, span_warning("[wear_mask] can't use [tank]!")) + + else if (head) + // Invalid headgear + to_chat(src, span_warning("[head] isn't airtight! You need a mask!")) + else + // Not wearing any breathing apparatus. + to_chat(src, span_warning("You need a mask!")) + +/// Returns TRUE if the tank successfully toggles open/closed. Opens the tank only if a breathing apparatus is found. +/mob/living/carbon/human/toggle_externals(obj/item/tank) + return toggle_internals(tank, TRUE) + /mob/living/carbon/human/wear_mask_update(obj/item/I, toggle_off = 1) - if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(I.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) - update_body_parts() - if(toggle_off && internal && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - internal = null + if(invalid_internals()) + cutoff_internals() if(I.flags_inv & HIDEEYES) update_worn_glasses() sec_hud_set_security_status() - ..() - -/mob/living/carbon/human/head_update(obj/item/I, forced) - if((I.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || forced) - update_body_parts() - if(I.flags_inv & HIDEEYES || forced) - update_worn_glasses() - if(I.flags_inv & HIDEEARS || forced) - update_body() - sec_hud_set_security_status() + update_name() ..() /mob/living/carbon/human/proc/equipOutfit(outfit, visualsOnly = FALSE) @@ -356,15 +419,18 @@ /mob/living/carbon/human/proc/smart_equip_targeted(slot_type = ITEM_SLOT_BELT, slot_item_name = "belt") if(incapacitated()) return + var/obj/item/thing = get_active_held_item() var/obj/item/equipped_item = get_item_by_slot(slot_type) if(!equipped_item) // We also let you equip an item like this if(!thing) to_chat(src, span_warning("You have no [slot_item_name] to take something out of!")) return + if(equip_to_slot_if_possible(thing, slot_type)) update_held_items() return + var/datum/storage/storage = equipped_item.atom_storage if(!storage) if(!thing) @@ -372,16 +438,21 @@ else to_chat(src, span_warning("You can't fit [thing] into your [equipped_item.name]!")) return + if(thing) // put thing in storage item if(!equipped_item.atom_storage?.attempt_insert(thing, src)) to_chat(src, span_warning("You can't fit [thing] into your [equipped_item.name]!")) return - var/atom/real_location = storage.real_location?.resolve() + + var/atom/real_location = storage.get_real_location() if(!real_location.contents.len) // nothing to take out to_chat(src, span_warning("There's nothing in your [equipped_item.name] to take out!")) return + var/obj/item/stored = real_location.contents[real_location.contents.len] if(!stored || stored.on_found(src)) return + stored.attack_hand(src) // take out thing from item in storage slot return + diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cdeb35f40bd9..9494bacad51c 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -26,29 +26,29 @@ if(QDELETED(src)) return FALSE + // Increase germ_level regularly + if(germ_level < GERM_LEVEL_AMBIENT && prob(30)) //if you're just standing there, you shouldn't get more germs beyond an ambient level + germ_level++ + //Body temperature stability and damage - dna.species.handle_body_temperature(src, delta_time, times_fired) + if(dna.species.handle_body_temperature(src, delta_time, times_fired)) + updatehealth() if(!IS_IN_STASIS(src)) - if(.) //not dead + if(stat != DEAD) //not dead for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes HM.on_life(delta_time, times_fired) if(stat != DEAD) //heart attack stuff - handle_heart(delta_time, times_fired) handle_liver(delta_time, times_fired) dna.species.spec_life(src, delta_time, times_fired) // for mutantraces - //Update our name based on whether our face is obscured/disfigured - name = get_visible_name() - if(stat != DEAD) return TRUE - /mob/living/carbon/human/calculate_affecting_pressure(pressure) var/chest_covered = FALSE var/head_covered = FALSE @@ -66,27 +66,19 @@ return (occupied_space.contents_pressure_protection * ONE_ATMOSPHERE + (1 - occupied_space.contents_pressure_protection) * pressure) return pressure +/mob/living/carbon/human/breathe(forced) + if(HAS_TRAIT(src, TRAIT_NOBREATH)) + return FALSE -/mob/living/carbon/human/handle_traits(delta_time, times_fired) - 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") return ..() -/mob/living/carbon/human/breathe() - if(!HAS_TRAIT(src, TRAIT_NOBREATH)) - return ..() - -/mob/living/carbon/human/check_breath(datum/gas_mixture/breath) +/mob/living/carbon/human/check_breath(datum/gas_mixture/breath, forced = FALSE) var/L = getorganslot(ORGAN_SLOT_LUNGS) if(!L) - if(health >= crit_threshold) - adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1) - else if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE)) - adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE)) + adjustOxyLoss(HUMAN_FAILBREATH_OXYLOSS) failed_last_breath = TRUE @@ -105,21 +97,24 @@ else if(istype(L, /obj/item/organ/lungs)) var/obj/item/organ/lungs/lun = L - if(lun.check_breath(breath,src)) - return + . = lun.check_breath(breath, src, forced) + if(. == BREATH_OKAY) + adjustOxyLoss(-5) + return TRUE + if(. >= BREATH_SILENT_DAMAGING) // Breath succeeded + return TRUE + // Failed a breath for one reason or another. - set_blurriness(max(3, eye_blurry)) + blur_eyes(3) if(prob(20)) spawn(-1) emote("gasp") + return FALSE + /// Environment handlers for species /mob/living/carbon/human/handle_environment(datum/gas_mixture/environment, delta_time, times_fired) - // If we are in a cryo bed do not process life functions - if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) - return - - dna.species.handle_environment(src, environment, delta_time, times_fired) + return dna.species.handle_environment(src, environment, delta_time, times_fired) /** * Adjust the core temperature of a mob @@ -151,10 +146,10 @@ return dna.species.bodytemp_normal + get_body_temp_normal_change() /mob/living/carbon/human/get_body_temp_heat_damage_limit() - return dna.species.bodytemp_heat_damage_limit + return dna.species.heat_level_1 /mob/living/carbon/human/get_body_temp_cold_damage_limit() - return dna.species.bodytemp_cold_damage_limit + return dna.species.cold_level_1 /mob/living/carbon/human/proc/get_thermal_protection() var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures @@ -312,17 +307,10 @@ return TRUE return ..() -/mob/living/carbon/human/proc/handle_heart(delta_time, times_fired) - var/we_breath = !HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT) - - if(!undergoing_cardiac_arrest()) - return - - if(we_breath) - adjustOxyLoss(4 * delta_time) - Unconscious(80) - // Tissues die without blood circulation - adjustBruteLoss(1 * delta_time) +/mob/living/carbon/human/set_heartattack(status) + . = ..() + if(.) + update_health_hud() #undef THERMAL_PROTECTION_HEAD #undef THERMAL_PROTECTION_CHEST diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index b66d842fd10e..bf36333f4fb0 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -3,6 +3,10 @@ dna?.species?.on_owner_login(src) + // This is a preference-based effect + if(glasses) + update_glasses_color(glasses, TRUE) + if(!LAZYLEN(afk_thefts)) return diff --git a/code/modules/mob/living/carbon/human/monkey/monkey.dm b/code/modules/mob/living/carbon/human/monkey/monkey.dm index 2f2137d82fb4..efca2c6c6a7a 100644 --- a/code/modules/mob/living/carbon/human/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/human/monkey/monkey.dm @@ -24,9 +24,13 @@ /mob/living/carbon/human/species/monkey/angry/Initialize(mapload) . = ..() if(prob(10)) - var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) - equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD) - helmet.attack_self(src) // todo encapsulate toggle + INVOKE_ASYNC(src, PROC_REF(give_ape_escape_helmet)) + +/// Gives our funny monkey an Ape Escape hat reference +/mob/living/carbon/human/species/monkey/angry/proc/give_ape_escape_helmet() + var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) + equip_to_slot_or_del(helmet, ITEM_SLOT_HEAD) + helmet.attack_self(src) // todo encapsulate toggle /mob/living/carbon/human/species/monkey/punpun //except for a few special persistence features, pun pun is just a normal monkey diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index f83cc5e6203c..aa85bc61cb1d 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -23,5 +23,12 @@ var/hunger_mod = 1 //% of hunger rate taken per tick. -/datum/physiology/New() - armor = new +///Copy paste of /atom/proc/returnArmor(). +/datum/physiology/proc/returnArmor() + RETURN_TYPE(/datum/armor) + if(istype(armor, /datum/armor)) + return armor + + if(islist(armor) || isnull(armor)) + armor = getArmor(armor) + return armor diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 15379167a71d..24015b50bffd 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -48,8 +48,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/use_skintones = FALSE ///If your race bleeds something other than bog standard blood, change this to reagent id. For example, ethereals bleed liquid electricity. var/datum/reagent/exotic_blood - ///If your race uses a non standard bloodtype (A+, O-, AB-, etc). For example, lizards have L type blood. - var/exotic_bloodtype = "" + ///What the species drops when gibbed by a gibber machine. var/meat = /obj/item/food/meat/slab/human ///What skin the species drops when gibbed by a gibber machine. @@ -72,15 +71,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/scream_verb = "screams" ///What languages this species can understand and say. Use a [language holder datum][/datum/language_holder] in this var. var/species_language_holder = /datum/language_holder - /** - * 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. - * Assoc values are defaults for given bodyparts, also modified by aforementioned organs. - * They also allow for faster '[]' list access versus 'in'. Other than that, they are useless right now. - * Layer hiding is handled by [/datum/species/proc/handle_mutant_bodyparts] below. - */ + /// DEPRECATED: Now only handles legs. var/list/mutant_bodyparts = list() ///Internal organs that are unique to this race, like a tail. var/list/mutant_organs = list() @@ -94,9 +85,45 @@ GLOBAL_LIST_EMPTY(features_by_species) BODY_ZONE_CHEST = /obj/item/bodypart/chest, ) + /// Robotic bodyparts for preference selection + var/list/robotic_bodyparts = list( + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/surplus, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/surplus, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/surplus, + BODY_ZONE_R_LEG= /obj/item/bodypart/leg/right/robot/surplus, + ) + ///List of cosmetic organs to generate like horns, frills, wings, etc. list(typepath of organ = "Round Beautiful BDSM Snout"). Still WIP var/list/cosmetic_organs = list() + //* BODY TEMPERATURE THINGS *// + var/cold_level_3 = 120 + var/cold_level_2 = 200 + var/cold_level_1 = BODYTEMP_COLD_DAMAGE_LIMIT + var/cold_discomfort_level = 285 + + /// The natural body temperature to adjust towards + var/bodytemp_normal = BODYTEMP_NORMAL + + var/heat_discomfort_level = 315 + var/heat_level_1 = BODYTEMP_HEAT_DAMAGE_LIMIT + var/heat_level_2 = 400 + var/heat_level_3 = 1000 + + /// Minimum amount of kelvin moved toward normal body temperature per tick. + var/bodytemp_autorecovery_min = BODYTEMP_AUTORECOVERY_MINIMUM + var/list/heat_discomfort_strings = list( + "You feel sweat drip down your neck.", + "You feel uncomfortably warm.", + "Your skin prickles in the heat." + ) + var/list/cold_discomfort_strings = list( + "You feel chilly.", + "You shiver suddenly.", + "Your chilly flesh stands out in goosebumps." + ) + + //* MODIFIERS *// ///Multiplier for the race's speed. Positive numbers make it move slower, negative numbers make it move faster. var/speedmod = 0 ///Percentage modifier for overall defense of the race, or less defense, if it's negative. @@ -111,16 +138,12 @@ GLOBAL_LIST_EMPTY(features_by_species) var/heatmod = 1 ///multiplier for stun durations var/stunmod = 1 - ///multiplier for money paid at payday - var/payday_modifier = 1 ///Base electrocution coefficient. Basically a multiplier for damage from electrocutions. var/siemens_coeff = 1 ///To use MUTCOLOR with a fixed color that's independent of the mcolor feature in DNA. var/fixed_mut_color = "" ///Special mutation that can be found in the genepool exclusively in this species. Dont leave empty or changing species will be a headache var/inert_mutation = /datum/mutation/human/dwarfism - ///Used to set the mob's deathsound upon species change - var/deathsound ///Sounds to override barefeet walking var/list/special_step_sounds ///Special sound for grabbing @@ -143,15 +166,6 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Used to determine what description to give when using a potion of flight, if false it will describe them as growing new wings var/has_innate_wings = FALSE - /// The natural temperature for a body - var/bodytemp_normal = BODYTEMP_NORMAL - /// Minimum amount of kelvin moved toward normal body temperature per tick. - var/bodytemp_autorecovery_min = BODYTEMP_AUTORECOVERY_MINIMUM - /// The body temperature limit the body can take before it starts taking damage from heat. - var/bodytemp_heat_damage_limit = BODYTEMP_HEAT_DAMAGE_LIMIT - /// The body temperature limit the body can take before it starts taking damage from cold. - var/bodytemp_cold_damage_limit = BODYTEMP_COLD_DAMAGE_LIMIT - /// The icon_state of the fire overlay added when sufficently ablaze and standing. see onfire.dmi var/fire_overlay = "human_burning" @@ -174,35 +188,26 @@ GLOBAL_LIST_EMPTY(features_by_species) ///What anim to use for gibbing var/gib_anim = "gibbed-h" - - //Do NOT remove by setting to null. use OR make a RESPECTIVE TRAIT (removing stomach? add the NOSTOMACH trait to your species) - //why does it work this way? because traits also disable the downsides of not having an organ, removing organs but not having the trait will make your species die - - ///Replaces default brain with a different organ - var/obj/item/organ/brain/mutantbrain = /obj/item/organ/brain - ///Replaces default heart with a different organ - var/obj/item/organ/heart/mutantheart = /obj/item/organ/heart - ///Replaces default lungs with a different organ - var/obj/item/organ/lungs/mutantlungs = /obj/item/organ/lungs - ///Replaces default eyes with a different organ - var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes - ///Replaces default ears with a different organ - var/obj/item/organ/ears/mutantears = /obj/item/organ/ears - ///Replaces default tongue with a different organ - var/obj/item/organ/tongue/mutanttongue = /obj/item/organ/tongue - ///Replaces default liver with a different organ - var/obj/item/organ/liver/mutantliver = /obj/item/organ/liver - ///Replaces default stomach with a different organ - var/obj/item/organ/stomach/mutantstomach = /obj/item/organ/stomach - ///Replaces default appendix with a different organ. - var/obj/item/organ/appendix/mutantappendix = /obj/item/organ/appendix ///Forces an item into this species' hands. Only an honorary mutantthing because this is not an organ and not loaded in the same way, you've been warned to do your research. var/obj/item/mutanthands - + /// A template for what organs this species should have. + /// Assign null to simply exclude spawning with one. + var/list/organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) ///Bitflag that controls what in game ways something can select this species as a spawnable source, such as magic mirrors. See [mob defines][code/__DEFINES/mobs.dm] for possible sources. - var/changesource_flags = NONE + var/changesource_flags = null ///Unique cookie given by admins through prayers var/species_cookie = /obj/item/food/cookie @@ -225,6 +230,24 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Was the species changed from its original type at the start of the round? var/roundstart_changed = FALSE + var/properly_gained = FALSE + + /// A list of weighted lists to pain emotes. The list with the LOWEST damage requirement needs to be first. + var/list/pain_emotes = list( + list( + "grunts in pain" = 1, + "moans in pain" = 1, + ) = PAIN_AMT_LOW, + + list( + "pain" = 1, + ) = PAIN_AMT_MEDIUM, + + list( + "agony" = 1, + ) = PAIN_AMT_AGONIZING, + ) + /////////// // PROCS // /////////// @@ -327,6 +350,18 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/copy_properties_from(datum/species/old_species) return +/datum/species/proc/should_organ_apply_to(mob/living/carbon/target, obj/item/organ/organpath) + if(isnull(organpath) || isnull(target)) + CRASH("passed a null path or mob to 'should_external_organ_apply_to'") + + var/feature_key = initial(organpath.feature_key) + if(isnull(feature_key)) + return TRUE + + if(target.dna.features[feature_key] != SPRITE_ACCESSORY_NONE) + return TRUE + return FALSE + /** * Corrects organs in a carbon, removing ones it doesn't need and adding ones it does. * @@ -341,38 +376,35 @@ GLOBAL_LIST_EMPTY(features_by_species) * * visual_only - boolean, only load organs that change how the species looks. Do not use for normal gameplay stuff */ /datum/species/proc/regenerate_organs(mob/living/carbon/C, datum/species/old_species, replace_current = TRUE, list/excluded_zones, visual_only = FALSE) - //what should be put in if there is no mutantorgan (brains handled separately) - var/list/slot_mutantorgans = list(ORGAN_SLOT_BRAIN = mutantbrain, ORGAN_SLOT_HEART = mutantheart, ORGAN_SLOT_LUNGS = mutantlungs, ORGAN_SLOT_APPENDIX = mutantappendix, \ - ORGAN_SLOT_EYES = mutanteyes, ORGAN_SLOT_EARS = mutantears, ORGAN_SLOT_TONGUE = mutanttongue, ORGAN_SLOT_LIVER = mutantliver, ORGAN_SLOT_STOMACH = mutantstomach) - - for(var/slot in list(ORGAN_SLOT_BRAIN, ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_APPENDIX, \ - ORGAN_SLOT_EYES, ORGAN_SLOT_EARS, ORGAN_SLOT_TONGUE, ORGAN_SLOT_LIVER, ORGAN_SLOT_STOMACH)) - + for(var/slot in organs) var/obj/item/organ/oldorgan = C.getorganslot(slot) //used in removing - var/obj/item/organ/neworgan = slot_mutantorgans[slot] //used in adding + var/obj/item/organ/neworgan = organs[slot] //used in adding if(visual_only && !initial(neworgan.visual)) continue var/used_neworgan = FALSE - neworgan = SSwardrobe.provide_type(neworgan) - var/should_have = neworgan.get_availability(src) //organ proc that points back to a species trait (so if the species is supposed to have this organ) + var/should_have = !!neworgan + if(should_have) + neworgan = SSwardrobe.provide_type(neworgan) if(oldorgan && (!should_have || replace_current) && !(oldorgan.zone in excluded_zones) && !(oldorgan.organ_flags & ORGAN_UNREMOVABLE)) if(slot == ORGAN_SLOT_BRAIN) var/obj/item/organ/brain/brain = oldorgan if(!brain.decoy_override)//"Just keep it if it's fake" - confucius, probably brain.before_organ_replacement(neworgan) - brain.Remove(C,TRUE, TRUE) //brain argument used so it doesn't cause any... sudden death. + brain.Remove(C,TRUE) //brain argument used so it doesn't cause any... sudden death. QDEL_NULL(brain) oldorgan = null //now deleted else oldorgan.before_organ_replacement(neworgan) oldorgan.Remove(C,TRUE) QDEL_NULL(oldorgan) //we cannot just tab this out because we need to skip the deleting if it is a decoy brain. + oldorgan = null if(oldorgan) oldorgan.setOrganDamage(0) + oldorgan.germ_level = 0 else if(should_have && !(initial(neworgan.zone) in excluded_zones)) used_neworgan = TRUE neworgan.Insert(C, TRUE, FALSE) @@ -387,9 +419,26 @@ GLOBAL_LIST_EMPTY(features_by_species) if(mutantorgan in mutant_organs) continue var/obj/item/organ/I = C.getorgan(mutantorgan) + if(I) + I.Remove(C, TRUE) + qdel(I) + + for(var/mutantorgan in old_species.cosmetic_organs) + if(mutantorgan in cosmetic_organs) + continue + var/obj/item/organ/I = C.getorgan(mutantorgan) if(I) I.Remove(C) - QDEL_NULL(I) + qdel(I) + + if(replace_current) + for(var/slot in old_species.organs) + if(!(slot in organs)) + var/obj/item/organ/O = C.getorganslot(slot) + if(!O) + continue + O.Remove(C, TRUE) + qdel(O) for(var/organ_path in mutant_organs) var/obj/item/organ/current_organ = C.getorgan(organ_path) @@ -403,6 +452,13 @@ GLOBAL_LIST_EMPTY(features_by_species) // organ.Insert will qdel any current organs in that slot, so we don't need to. replacement.Insert(C, TRUE, FALSE) + for(var/obj/item/organ/organ_path as anything in cosmetic_organs) + if(!should_organ_apply_to(C, organ_path)) + continue + //Load a persons preferences from DNA + var/obj/item/organ/new_organ = SSwardrobe.provide_type(organ_path) + new_organ.Insert(C, FALSE, FALSE) + /** * Proc called when a carbon becomes this species. * @@ -428,11 +484,12 @@ GLOBAL_LIST_EMPTY(features_by_species) C.mob_size = species_mob_size C.mob_biotypes = inherent_biotypes - replace_body(C, src) + if(type != old_species?.type) + replace_body(C, src) + regenerate_organs(C, old_species, visual_only = C.visual_only_organs) - if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype) - C.dna.blood_type = exotic_bloodtype + C.dna.blood_type = get_random_blood_type() if(old_species.mutanthands) for(var/obj/item/I in C.held_items) @@ -449,13 +506,6 @@ GLOBAL_LIST_EMPTY(features_by_species) else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, put_in_hands), new mutanthands) - if(ishuman(C)) - var/mob/living/carbon/human/human = C - for(var/obj/item/organ/organ_path as anything in cosmetic_organs) - //Load a persons preferences from DNA - var/obj/item/organ/new_organ = SSwardrobe.provide_type(organ_path) - new_organ.Insert(human) - for(var/X in inherent_traits) ADD_TRAIT(C, X, SPECIES_TRAIT) @@ -480,10 +530,12 @@ GLOBAL_LIST_EMPTY(features_by_species) fly = new fly.Grant(C) - C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, multiplicative_slowdown=speedmod) + C.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/species, slowdown=speedmod) SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) + properly_gained = TRUE + /** * Proc called when a carbon is no longer this species. * @@ -496,10 +548,9 @@ GLOBAL_LIST_EMPTY(features_by_species) */ /datum/species/proc/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) SHOULD_CALL_PARENT(TRUE) - if(C.dna.species.exotic_bloodtype) - C.dna.blood_type = random_blood_type() for(var/X in inherent_traits) REMOVE_TRAIT(C, X, SPECIES_TRAIT) + for(var/path in cosmetic_organs) var/obj/item/organ/organ = locate(path) in C.organs if(!organ) @@ -521,8 +572,6 @@ GLOBAL_LIST_EMPTY(features_by_species) for(var/i in inherent_factions) C.faction -= i - clear_tail_moodlets(C) - C.remove_movespeed_modifier(/datum/movespeed_modifier/species) SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src) @@ -538,7 +587,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/handle_body(mob/living/carbon/human/species_human) species_human.remove_overlay(BODY_LAYER) if(HAS_TRAIT(species_human, TRAIT_INVISIBLE_MAN)) - return handle_mutant_bodyparts(species_human) + return var/list/standing = list() var/obj/item/bodypart/head/noggin = species_human.get_bodypart(BODY_ZONE_HEAD) @@ -624,116 +673,6 @@ GLOBAL_LIST_EMPTY(features_by_species) species_human.overlays_standing[BODY_LAYER] = standing species_human.apply_overlay(BODY_LAYER) - handle_mutant_bodyparts(species_human) - -/** - * Handles the mutant bodyparts of a human - * - * Handles the adding and displaying of, layers, colors, and overlays of mutant bodyparts and accessories. - * Handles digitigrade leg displaying and squishing. - * Arguments: - * * H - Human, whoever we're handling the body for - * * forced_colour - The forced color of an accessory. Leave null to use mutant color. - */ -/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/source, forced_colour) - var/list/bodyparts_to_add = mutant_bodyparts.Copy() - var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) - var/list/standing = list() - - source.remove_overlay(BODY_BEHIND_LAYER) - source.remove_overlay(BODY_ADJ_LAYER) - source.remove_overlay(BODY_FRONT_LAYER) - - if(!mutant_bodyparts || HAS_TRAIT(source, TRAIT_INVISIBLE_MAN)) - return - - var/obj/item/bodypart/head/noggin = source.get_bodypart(BODY_ZONE_HEAD) - - if(mutant_bodyparts["ears"]) - if(!source.dna.features["ears"] || source.dna.features["ears"] == "None" || source.head && (source.head.flags_inv & HIDEHAIR) || (source.wear_mask && (source.wear_mask.flags_inv & HIDEHAIR)) || !noggin || !IS_ORGANIC_LIMB(noggin)) - bodyparts_to_add -= "ears" - - if(!bodyparts_to_add) - return - - var/g = (source.physique == FEMALE) ? "f" : "m" - - for(var/layer in relevent_layers) - var/layertext = mutant_bodyparts_layertext(layer) - - for(var/bodypart in bodyparts_to_add) - var/datum/sprite_accessory/accessory - switch(bodypart) - if("ears") - accessory = GLOB.ears_list[source.dna.features["ears"]] - if("legs") - accessory = GLOB.legs_list[source.dna.features["legs"]] - if("caps") - accessory = GLOB.caps_list[source.dna.features["caps"]] - if("headtails") - accessory = GLOB.headtails_list[source.dna.features["headtails"]] - - if(!accessory || accessory.icon_state == "none") - continue - - var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) - - if(accessory.gender_specific) - accessory_overlay.icon_state = "[g]_[bodypart]_[accessory.icon_state]_[layertext]" - else - accessory_overlay.icon_state = "m_[bodypart]_[accessory.icon_state]_[layertext]" - - if(accessory.em_block) - accessory_overlay.overlays += emissive_blocker(accessory_overlay.icon, accessory_overlay.icon_state, accessory_overlay.alpha) - - if(accessory.center) - accessory_overlay = center_image(accessory_overlay, accessory.dimension_x, accessory.dimension_y) - - if(!(HAS_TRAIT(source, TRAIT_HUSK))) - if(!forced_colour) - switch(accessory.color_src) - if(MUTCOLORS) - if(fixed_mut_color) - accessory_overlay.color = fixed_mut_color - else - accessory_overlay.color = source.dna.mutant_colors[MUTCOLORS_GENERIC_1] - if(MUTCOLORS2) - accessory_overlay.color = source.dna.mutant_colors[MUTCOLORS_GENERIC_2] - if(MUTCOLORS3) - accessory_overlay.color = source.dna.mutant_colors[MUTCOLORS_GENERIC_3] - if(HAIR) - if(hair_color == "mutcolor") - accessory_overlay.color = source.dna.mutant_colors[MUTCOLORS_GENERIC_1] - else if(hair_color == "fixedmutcolor") - accessory_overlay.color = fixed_mut_color - else - accessory_overlay.color = source.hair_color - if(FACEHAIR) - accessory_overlay.color = source.facial_hair_color - if(EYECOLOR) - accessory_overlay.color = source.eye_color_left - else - accessory_overlay.color = forced_colour - standing += accessory_overlay - - if(accessory.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) - if(accessory.gender_specific) - inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[accessory.icon_state]_[layertext]" - else - inner_accessory_overlay.icon_state = "m_[bodypart]inner_[accessory.icon_state]_[layertext]" - - if(accessory.center) - inner_accessory_overlay = center_image(inner_accessory_overlay, accessory.dimension_x, accessory.dimension_y) - - standing += inner_accessory_overlay - - source.overlays_standing[layer] = standing.Copy() - standing = list() - - source.apply_overlay(BODY_BEHIND_LAYER) - source.apply_overlay(BODY_ADJ_LAYER) - source.apply_overlay(BODY_FRONT_LAYER) //This exists so sprite accessories can still be per-layer without having to include that layer's //number in their sprite name, which causes issues when those numbers change. @@ -759,13 +698,9 @@ GLOBAL_LIST_EMPTY(features_by_species) human_mob.update_body() /datum/species/proc/spec_life(mob/living/carbon/human/H, delta_time, times_fired) - if(HAS_TRAIT(H, TRAIT_NOBREATH)) - H.setOxyLoss(0) - H.losebreath = 0 - - var/takes_crit_damage = (!HAS_TRAIT(H, TRAIT_NOCRITDAMAGE)) - if((H.health < H.hardcrit_threshold) && takes_crit_damage && H.stat != DEAD) - H.adjustBruteLoss(0.5 * delta_time) + // If you're dirty, your gloves will become dirty, too. + if(H.gloves && (H.germ_level > H.gloves.germ_level) && prob(10)) + H.gloves.germ_level += 1 /datum/species/proc/spec_death(gibbed, mob/living/carbon/human/H) return @@ -779,6 +714,10 @@ GLOBAL_LIST_EMPTY(features_by_species) if(H.get_item_by_slot(slot)) return FALSE + // For whatever reason, this item cannot be equipped by this species + if(slot != ITEM_SLOT_HANDS && (bodytype & I.restricted_bodytypes)) + return FALSE + // this check prevents us from equipping something to a slot it doesn't support, WITH the exceptions of storage slots (pockets, suit storage, and backpacks) // we don't require having those slots defined in the item's slot_flags, so we'll rely on their own checks further down if(!(I.slot_flags & slot)) @@ -786,39 +725,54 @@ GLOBAL_LIST_EMPTY(features_by_species) // Anything that's small or smaller can fit into a pocket by default if((slot == ITEM_SLOT_RPOCKET || slot == ITEM_SLOT_LPOCKET) && I.w_class <= WEIGHT_CLASS_SMALL) excused = TRUE - else if(slot == ITEM_SLOT_SUITSTORE || slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_HANDS) + else if(slot == ITEM_SLOT_SUITSTORE || slot == ITEM_SLOT_BACKPACK || slot == ITEM_SLOT_HANDS || slot == ITEM_SLOT_HANDCUFFED || slot == ITEM_SLOT_LEGCUFFED) excused = TRUE if(!excused) return FALSE switch(slot) if(ITEM_SLOT_HANDS) - if(H.get_empty_held_indexes()) + var/empty_hands = length(H.get_empty_held_indexes()) + if(HAS_TRAIT(I, TRAIT_NEEDS_TWO_HANDS) && ((empty_hands < 2) || H.usable_hands < 2)) + if(!disable_warning) + to_chat(H, span_warning("You need two hands to hold [I].")) + return FALSE + + if(empty_hands) return TRUE return FALSE + if(ITEM_SLOT_MASK) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_NECK) return TRUE + if(ITEM_SLOT_BACK) return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_OCLOTHING) return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_GLOVES) if(H.num_hands < 2) return FALSE return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_FEET) if(H.num_legs < 2) return FALSE + if((bodytype & BODYTYPE_DIGITIGRADE) && !(I.item_flags & IGNORE_DIGITIGRADE)) if(!(I.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) if(!disable_warning) to_chat(H, span_warning("The footwear around here isn't compatible with your feet!")) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_BELT) var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) @@ -826,31 +780,43 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!disable_warning) to_chat(H, span_warning("You need a jumpsuit before you can attach this [I.name]!")) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_EYES) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE + var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES) if(E?.no_glasses) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_HEAD) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_EARS) if(!H.get_bodypart(BODY_ZONE_HEAD)) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_ICLOTHING) return equip_delay_self_check(I, H, bypass_equip_delay_self) + if(ITEM_SLOT_ID) var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_CHEST) if(!H.w_uniform && !nojumpsuit && (!O || IS_ORGANIC_LIMB(O))) if(!disable_warning) to_chat(H, span_warning("You need a jumpsuit before you can attach this [I.name]!")) return FALSE + return equip_delay_self_check(I, H, bypass_equip_delay_self) + 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 @@ -858,12 +824,13 @@ GLOBAL_LIST_EMPTY(features_by_species) return FALSE var/obj/item/bodypart/O = H.get_bodypart(BODY_ZONE_L_LEG) - if(!H.w_uniform && !nojumpsuit && (!O || IS_ORGANIC_LIMB(O))) if(!disable_warning) to_chat(H, span_warning("You need a jumpsuit before you can attach this [I.name]!")) return FALSE + return TRUE + if(ITEM_SLOT_RPOCKET) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE @@ -876,41 +843,56 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!disable_warning) to_chat(H, span_warning("You need a jumpsuit before you can attach this [I.name]!")) return FALSE + return TRUE + if(ITEM_SLOT_SUITSTORE) if(HAS_TRAIT(I, TRAIT_NODROP)) return FALSE + if(!H.wear_suit) if(!disable_warning) to_chat(H, span_warning("You need a suit before you can attach this [I.name]!")) return FALSE + if(!H.wear_suit.allowed) if(!disable_warning) to_chat(H, span_warning("You somehow have a suit with no defined allowed items for suit storage, stop that.")) return FALSE + if(I.w_class > WEIGHT_CLASS_BULKY) if(!disable_warning) to_chat(H, span_warning("The [I.name] is too big to attach!")) //should be src? return FALSE + if( istype(I, /obj/item/modular_computer/tablet) || istype(I, /obj/item/pen) || is_type_in_list(I, H.wear_suit.allowed) ) return TRUE + return FALSE + if(ITEM_SLOT_HANDCUFFED) + if(H.handcuffed) + return FALSE if(!istype(I, /obj/item/restraints/handcuffs)) return FALSE if(H.num_hands < 2) return FALSE return TRUE + if(ITEM_SLOT_LEGCUFFED) + if(H.legcuffed) + return FALSE if(!istype(I, /obj/item/restraints/legcuffs)) return FALSE if(H.num_legs < 2) return FALSE return TRUE + if(ITEM_SLOT_BACKPACK) if(H.back && H.back.atom_storage?.can_insert(I, H, messages = TRUE)) return TRUE return FALSE + return FALSE //Unsupported slot /datum/species/proc/equip_delay_self_check(obj/item/I, mob/living/carbon/human/H, bypass_equip_delay_self) @@ -924,17 +906,6 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/pre_equip_species_outfit(datum/outfit/O, mob/living/carbon/human/equipping, visuals_only = FALSE) return - -/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - 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 TRUE - if(!chem.overdosed && chem.overdose_threshold && chem.volume >= chem.overdose_threshold) - chem.overdosed = TRUE - chem.overdose_start(H) - log_game("[key_name(H)] has started overdosing on [chem.name] at [chem.volume] units.") - /datum/species/proc/check_species_weakness(obj/item, mob/living/attacker) return 1 //This is not a boolean, it's the multiplier for the damage that the user takes from the item. The force of the item is multiplied by this value @@ -947,9 +918,6 @@ GLOBAL_LIST_EMPTY(features_by_species) human_to_equip.equipOutfit(outfit_important_for_life) -/datum/species/proc/update_health_hud(mob/living/carbon/human/H) - return FALSE - /** * Species based handling for irradiation * @@ -1004,7 +972,9 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) - if(target.body_position == STANDING_UP || (target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH))) + target.add_fingerprint_on_clothing_or_self(user, BODY_ZONE_CHEST) + + if(target.body_position == STANDING_UP || (target.health >= 0 && !(HAS_TRAIT(target, TRAIT_FAKEDEATH) || target.undergoing_cardiac_arrest()))) target.help_shake_act(user) if(target != user) log_combat(user, target, "shaken") @@ -1012,101 +982,135 @@ GLOBAL_LIST_EMPTY(features_by_species) user.do_cpr(target) - -/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) +/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style, list/params) if(target.check_block()) - target.visible_message(span_warning("[target] blocks [user]'s grab!"), \ - span_userdanger("You block [user]'s grab!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) + target.visible_message( + span_warning("[target] blocks [user]'s grab!"), + span_userdanger("You block [user]'s grab!"), + span_hear("You hear a swoosh!"), + COMBAT_MESSAGE_RANGE, + user + ) to_chat(user, span_warning("Your grab at [target] was blocked!")) return FALSE + if(attacker_style?.grab_act(user,target) == MARTIAL_ATTACK_SUCCESS) return TRUE + else - target.grabbedby(user) + user.try_make_grab(target, use_offhand = params?[RIGHT_CLICK]) return TRUE -///This proc handles punching damage. IMPORTANT: Our owner is the TARGET and not the USER in this proc. For whatever reason... +///This proc handles punching damage. /datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) + // Pacifists can't harm. if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm [target]!")) return FALSE + + // If blocked, bail. if(target.check_block()) target.visible_message(span_warning("[target] blocks [user]'s attack!"), \ span_userdanger("You block [user]'s attack!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) to_chat(user, span_warning("Your attack at [target] was blocked!")) return FALSE + + // If martial arts did something, bail. if(attacker_style?.harm_act(user,target) == MARTIAL_ATTACK_SUCCESS) return ATTACK_HANDLED - else - var/obj/item/organ/brain/brain = user.getorganslot(ORGAN_SLOT_BRAIN) - var/obj/item/bodypart/attacking_bodypart - if(brain) - attacking_bodypart = brain.get_attacking_limb(target) - if(!attacking_bodypart) - attacking_bodypart = user.get_active_hand() - var/atk_verb = attacking_bodypart.unarmed_attack_verb - var/atk_effect = attacking_bodypart.unarmed_attack_effect - - if(atk_effect == ATTACK_EFFECT_BITE) - if(user.is_mouth_covered(mask_only = TRUE)) - to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) - return FALSE - user.do_attack_animation(target, atk_effect) + // Find what bodypart we are attacking with. + var/obj/item/organ/brain/brain = user.getorganslot(ORGAN_SLOT_BRAIN) + var/obj/item/bodypart/attacking_bodypart + if(brain) + attacking_bodypart = brain.get_attacking_limb(target) - var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) + if(!attacking_bodypart) + attacking_bodypart = user.get_active_hand() - var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) + var/atk_verb = attacking_bodypart.unarmed_attack_verb + var/atk_effect = attacking_bodypart.unarmed_attack_effect - var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases - if(attacking_bodypart.unarmed_damage_low) - if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) //kicks never miss (provided your species deals more than 0 damage) - miss_chance = 0 - else - miss_chance = min((attacking_bodypart.unarmed_damage_high/attacking_bodypart.unarmed_damage_low) + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob() - - if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted - playsound(target.loc, attacking_bodypart.unarmed_miss_sound, 25, TRUE, -1) - target.visible_message(span_danger("[user]'s [atk_verb] misses [target]!"), \ - span_danger("You avoid [user]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_warning("Your [atk_verb] misses [target]!")) - log_combat(user, target, "attempted to punch") + // If we're biting them, make sure we can bite, or bail. + if(atk_effect == ATTACK_EFFECT_BITE) + if(!user.has_mouth()) + to_chat(user, span_warning("You can't [atk_verb] without a mouth!")) + return FALSE + + if(user.is_mouth_covered(mask_only = TRUE)) + to_chat(user, span_warning("You can't [atk_verb] with your mouth covered!")) return FALSE - var/armor_block = target.run_armor_check(affecting, MELEE) + // By this point, we are attempting an attack!!! + user.do_attack_animation(target, atk_effect) + + // Set damage and find hit bodypart using weighted rng + var/target_zone = deprecise_zone(user.zone_selected) + var/bodyzone_modifier = GLOB.bodyzone_gurps_mods[target_zone] + var/roll = !HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) ? user.stat_roll(10, /datum/rpg_skill/skirmish, bodyzone_modifier, -7).outcome : SUCCESS + // If we succeeded, hit the target area. + var/attacking_zone = (roll >= SUCCESS) ? target_zone : target.get_random_valid_zone() + var/obj/item/bodypart/affecting + if(attacking_zone) + affecting = target.get_bodypart(attacking_zone) - playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) + var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high) - user.visible_message( - span_danger("[user] [atk_verb]ed [target]!"), + if(!damage || !affecting || roll == CRIT_FAILURE) + var/rolled = target.body_position == LYING_DOWN && !target.incapacitated() + playsound(target.loc, attacking_bodypart.unarmed_miss_sound, 25, TRUE, -1) + + target.visible_message( + span_danger("[user]'s [atk_verb] misses [target][rolled ? "as [target.p_they()] roll out of the way" : ""]!"), null, - span_hear("You hear a sickening sound of flesh hitting flesh!"), + span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, - user ) + if(rolled) + target.setDir(pick(GLOB.cardinals)) - target.lastattacker = user.real_name - target.lastattackerckey = user.ckey - user.dna.species.spec_unarmedattacked(user, target) + log_combat(user, target, "attempted to punch (missed)") + return FALSE - if(user.limb_destroyer) - target.dismembering_strike(user, affecting.body_zone) + switch(atk_effect) + if(ATTACK_EFFECT_BITE) + target.add_trace_DNA_on_clothing_or_self(user, attacking_zone) + if(ATTACK_EFFECT_PUNCH, ATTACK_EFFECT_CLAW, ATTACK_EFFECT_SLASH) + target.add_fingerprint_on_clothing_or_self(user, attacking_zone) - var/attack_direction = get_dir(user, target) - var/attack_type = attacking_bodypart.attack_type - if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage - log_combat(user, target, "kicked") - target.stamina.adjust(-1 * (STAMINA_DAMAGE_UNARMED*1.5)) //Kicks do alot of stamina damage - else//other attacks deal full raw damage + 1.5x in stamina damage - target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) - target.stamina.adjust(-STAMINA_DAMAGE_UNARMED) - log_combat(user, target, "punched") - . |= ATTACK_CONSUME_STAMINA + var/armor_block = target.run_armor_check(affecting, BLUNT) - return ATTACK_CONTINUE | . + playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1) -/datum/species/proc/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) - return + user.visible_message( + span_danger("[user] [atk_verb]ed [target] in the [affecting.plaintext_zone]!"), + null, + span_hear("You hear a scuffle!"), + COMBAT_MESSAGE_RANGE + ) + + target.lastattacker = user.real_name + target.lastattackerckey = user.ckey + + if(user.limb_destroyer) + target.dismembering_strike(user, affecting.body_zone) + + var/attack_direction = get_dir(user, target) + var/attack_type = attacking_bodypart.attack_type + + if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage + log_combat(user, target, "kicked") + target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) + target.stamina.adjust(-1 * (STAMINA_DAMAGE_UNARMED*3)) //Kicks do alot of stamina damage + + else//other attacks deal full raw damage + 1.5x in stamina damage + + target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction) + target.stamina.adjust(-STAMINA_DAMAGE_UNARMED) + log_combat(user, target, "punched") + . |= ATTACK_CONSUME_STAMINA + + return ATTACK_CONTINUE | . /datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style) if(target.check_block()) @@ -1155,6 +1159,7 @@ GLOBAL_LIST_EMPTY(features_by_species) if(.) M.animate_interact(H, INTERACT_DISARM) return // dont attack after + if(M.combat_mode) . = harm(M, H, attacker_style) if(. & ATTACK_CONTINUE) @@ -1169,21 +1174,33 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) // Allows you to put in item-specific reactions based on species if(user != H) - if(H.check_shields(I, I.force, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) - return FALSE + if(H.check_shields(I, I.force, "the [I.name]", MELEE_ATTACK, I.armor_penetration)) + return MOB_ATTACKEDBY_NO_DAMAGE + if(H.check_block()) - H.visible_message(span_warning("[H] blocks [I]!"), \ - span_userdanger("You block [I]!")) - return FALSE + H.visible_message( + span_warning("[H] blocks [I]!"), + span_userdanger("You block [I]!") + ) + return MOB_ATTACKEDBY_NO_DAMAGE var/hit_area if(!affecting) //Something went wrong. Maybe the limb is missing? affecting = H.bodyparts[1] hit_area = affecting.plaintext_zone + var/def_zone = affecting.body_zone + var/attack_flag = I.get_attack_flag() + var/armor_block = H.run_armor_check( + def_zone = affecting, + attack_flag = attack_flag, + absorb_text = span_notice("Your armor has protected your [hit_area]!"), + soften_text = span_warning("Your armor has softened a [armor_flag_to_strike_string(attack_flag)] to your [hit_area]!"), + armor_penetration = I.armor_penetration, + weak_against_armor = I.weak_against_armor + ) - var/armor_block = H.run_armor_check(affecting, MELEE, span_notice("Your armor has protected your [hit_area]!"), span_warning("Your armor has softened a hit to your [hit_area]!"),I.armour_penetration, weak_against_armour = I.weak_against_armour) armor_block = min(90,armor_block) //cap damage reduction at 90% var/weakness = check_species_weakness(I, user) @@ -1198,15 +1215,18 @@ GLOBAL_LIST_EMPTY(features_by_species) H.stamina.adjust(-I.stamina_damage * (prob(I.stamina_critical_chance) ? I.stamina_critical_modifier : 1)) if(!I.force) - return FALSE //item force is zero + return MOB_ATTACKEDBY_NO_DAMAGE //item force is zero var/bloody = FALSE if(((I.damtype == BRUTE) && I.force && prob(25 + (I.force * 2)))) + if(IS_ORGANIC_LIMB(affecting)) I.add_mob_blood(H) //Make the weapon bloody, not the person. + if(prob(I.force * 2)) //blood spatter! bloody = TRUE var/turf/location = H.loc + if(istype(location)) H.add_splatter_floor(location) if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood @@ -1217,17 +1237,20 @@ GLOBAL_LIST_EMPTY(features_by_species) if(!I.sharpness && armor_block < 50) if(prob(I.force)) H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20) - if(H.stat <= SOFT_CRIT) + + if(H.stat != CONSCIOUS) H.visible_message(span_danger("[H] is knocked senseless!"), \ span_userdanger("You're knocked senseless!")) H.set_timed_status_effect(20 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) H.adjust_blurriness(10) + if(prob(10)) H.gain_trauma(/datum/brain_trauma/mild/concussion) + else H.adjustOrganLoss(ORGAN_SLOT_BRAIN, I.force * 0.2) - if(H.mind && H.stat <= SOFT_CRIT && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma. + if(H.mind && H.stat != CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma. var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) if(rev) rev.remove_revolutionary(FALSE, user) @@ -1235,13 +1258,12 @@ GLOBAL_LIST_EMPTY(features_by_species) if(bloody) //Apply blood if(H.wear_mask) H.wear_mask.add_mob_blood(H) - H.update_worn_mask() + if(H.head) H.head.add_mob_blood(H) - H.update_worn_head() + if(H.glasses && prob(33)) H.glasses.add_mob_blood(H) - H.update_worn_glasses() if(BODY_ZONE_CHEST) if(H.stat == CONSCIOUS && !I.sharpness && armor_block < 50) @@ -1253,15 +1275,15 @@ GLOBAL_LIST_EMPTY(features_by_species) if(bloody) if(H.wear_suit) H.wear_suit.add_mob_blood(H) - H.update_worn_oversuit() + if(H.w_uniform) H.w_uniform.add_mob_blood(H) - H.update_worn_undersuit() - return TRUE + return MOB_ATTACKEDBY_SUCCESS /datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, sharpness = NONE, attack_direction = null, cap_loss_at = 0) SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, sharpness, attack_direction) + var/hit_percent = (100-(blocked+armor))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 if(!damage || (!forced && hit_percent <= 0)) @@ -1274,7 +1296,7 @@ GLOBAL_LIST_EMPTY(features_by_species) else if(!def_zone) def_zone = ran_zone(def_zone) - BP = H.get_bodypart(check_zone(def_zone)) + BP = H.get_bodypart(deprecise_zone(def_zone)) if(!BP) BP = H.bodyparts[1] @@ -1283,29 +1305,33 @@ GLOBAL_LIST_EMPTY(features_by_species) H.damageoverlaytemp = 20 var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod if(BP) - if(BP.receive_damage(damage_amount, 0, sharpness = sharpness)) - H.update_damage_overlays() + BP.receive_damage(damage_amount, 0, sharpness = sharpness) else//no bodypart, we deal damage with a more general method. H.adjustBruteLoss(damage_amount) + if(BURN) H.damageoverlaytemp = 20 var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod if(BP) - if(BP.receive_damage(0, damage_amount, sharpness = sharpness)) - H.update_damage_overlays() + BP.receive_damage(0, damage_amount, sharpness = sharpness) else H.adjustFireLoss(damage_amount) + if(TOX) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.tox_mod H.adjustToxLoss(damage_amount) + if(OXY) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.oxy_mod H.adjustOxyLoss(damage_amount) + if(CLONE) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.clone_mod H.adjustCloneLoss(damage_amount) + if(STAMINA) - CRASH("You get the idea") + H.stamina.adjust(-damage) + if(BRAIN) var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount) @@ -1337,7 +1363,7 @@ GLOBAL_LIST_EMPTY(features_by_species) * * humi (required)(type: /mob/living/carbon/human) The mob we will target */ /datum/species/proc/handle_environment(mob/living/carbon/human/humi, datum/gas_mixture/environment, delta_time, times_fired) - handle_environment_pressure(humi, environment, delta_time, times_fired) + . = handle_environment_pressure(humi, environment, delta_time, times_fired) /** * Body temperature handler for species @@ -1348,10 +1374,6 @@ GLOBAL_LIST_EMPTY(features_by_species) * * humi (required)(type: /mob/living/carbon/human) The mob we will target */ /datum/species/proc/handle_body_temperature(mob/living/carbon/human/humi, delta_time, times_fired) - //when in a cryo unit we suspend all natural body regulation - if(istype(humi.loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) - return - //Only stabilise core temp when alive and not in statis if(humi.stat < DEAD && !IS_IN_STASIS(humi)) body_temperature_core(humi, delta_time, times_fired) @@ -1360,9 +1382,11 @@ GLOBAL_LIST_EMPTY(features_by_species) body_temperature_skin(humi, delta_time, times_fired) body_temperature_alerts(humi, delta_time, times_fired) + SET_STASIS_LEVEL(humi, STASIS_CRYOGENIC_FREEZING, get_cryogenic_factor(humi.coretemperature)) + //Do not cause more damage in statis - if(!IS_IN_STASIS(humi)) - body_temperature_damage(humi, delta_time, times_fired) + if(!IS_IN_HARD_STASIS(humi)) + . = body_temperature_damage(humi, delta_time, times_fired) /** * Used to stabilize the core temperature back to normal on living mobs @@ -1395,7 +1419,7 @@ GLOBAL_LIST_EMPTY(features_by_species) humi.adjust_coretemperature(skin_core_change) // get the enviroment details of where the mob is standing - var/datum/gas_mixture/environment = humi.loc.return_air() + var/datum/gas_mixture/environment = humi.loc?.return_air() if(!environment) // if there is no environment (nullspace) drop out here. return @@ -1448,34 +1472,29 @@ GLOBAL_LIST_EMPTY(features_by_species) var/old_bodytemp = humi.old_bodytemperature var/bodytemp = humi.bodytemperature // Body temperature is too hot, and we do not have resist traits - if(bodytemp > bodytemp_heat_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTHEAT)) - // Clear cold mood and apply hot mood - SEND_SIGNAL(humi, COMSIG_CLEAR_MOOD_EVENT, "cold") - SEND_SIGNAL(humi, COMSIG_ADD_MOOD_EVENT, "hot", /datum/mood_event/hot) + if(bodytemp > heat_level_1 && !HAS_TRAIT(humi, TRAIT_RESISTHEAT)) //Remove any slowdown from the cold. humi.remove_movespeed_modifier(/datum/movespeed_modifier/cold) // display alerts based on how hot it is // Can't be a switch due to http://www.byond.com/forum/post/2750423 - if(bodytemp in bodytemp_heat_damage_limit to BODYTEMP_HEAT_WARNING_2) + if(bodytemp in heat_level_1 to heat_level_2) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 1) - else if(bodytemp in BODYTEMP_HEAT_WARNING_2 to BODYTEMP_HEAT_WARNING_3) + else if(bodytemp in heat_level_2 to heat_level_3) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 2) else humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/hot, 3) // Body temperature is too cold, and we do not have resist traits - else if(bodytemp < bodytemp_cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD)) + else if(bodytemp < cold_level_1 && !HAS_TRAIT(humi, TRAIT_RESISTCOLD)) // clear any hot moods and apply cold mood - SEND_SIGNAL(humi, COMSIG_CLEAR_MOOD_EVENT, "hot") - SEND_SIGNAL(humi, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold) // Apply cold slow down - humi.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((bodytemp_cold_damage_limit - humi.bodytemperature) / COLD_SLOWDOWN_FACTOR)) + humi.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, slowdown = ((cold_level_1 - humi.bodytemperature) / COLD_SLOWDOWN_FACTOR)) // Display alerts based how cold it is // Can't be a switch due to http://www.byond.com/forum/post/2750423 - if(bodytemp in BODYTEMP_COLD_WARNING_2 to bodytemp_cold_damage_limit) + if(bodytemp in cold_level_1 to cold_level_2) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 1) - else if(bodytemp in BODYTEMP_COLD_WARNING_3 to BODYTEMP_COLD_WARNING_2) + else if(bodytemp in cold_level_2 to cold_level_3) humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 2) else humi.throw_alert(ALERT_TEMPERATURE, /atom/movable/screen/alert/cold, 3) @@ -1483,11 +1502,16 @@ GLOBAL_LIST_EMPTY(features_by_species) // We are not to hot or cold, remove status and moods // Optimization here, we check these things based off the old temperature to avoid unneeded work // We're not perfect about this, because it'd just add more work to the base case, and resistances are rare - else if (old_bodytemp > bodytemp_heat_damage_limit || old_bodytemp < bodytemp_cold_damage_limit) + else if (old_bodytemp > heat_level_1 || old_bodytemp < cold_level_1) humi.clear_alert(ALERT_TEMPERATURE) humi.remove_movespeed_modifier(/datum/movespeed_modifier/cold) - SEND_SIGNAL(humi, COMSIG_CLEAR_MOOD_EVENT, "cold") - SEND_SIGNAL(humi, COMSIG_CLEAR_MOOD_EVENT, "hot") + + + if((humi.stat == CONSCIOUS) && prob(5)) + if(bodytemp < cold_discomfort_level) + to_chat(humi, span_warning(pick(cold_discomfort_strings))) + else if(bodytemp > heat_discomfort_level) + to_chat(humi, span_warning(pick(heat_discomfort_strings))) // Store the old bodytemp for future checking humi.old_bodytemperature = bodytemp @@ -1500,7 +1524,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/body_temperature_damage(mob/living/carbon/human/humi, delta_time, times_fired) // Body temperature is too hot, and we do not have resist traits // Apply some burn damage to the body - if(humi.coretemperature > bodytemp_heat_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTHEAT)) + if(humi.coretemperature > heat_level_1 && !HAS_TRAIT(humi, TRAIT_RESISTHEAT)) var/firemodifier = humi.fire_stacks / 50 if (!humi.on_fire) // We are not on fire, reduce the modifier firemodifier = min(firemodifier, 0) @@ -1513,26 +1537,22 @@ GLOBAL_LIST_EMPTY(features_by_species) // 40% for level 3 damage on humans to scream in pain if (humi.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) - humi.emote("scream") + humi.pain_emote(1000, TRUE) //AGONY!!!! // Apply the damage to all body parts - humi.apply_damage(burn_damage, BURN, spread_damage = TRUE) - - // Apply some burn / brute damage to the body (Dependent if the person is hulk or not) - var/is_hulk = HAS_TRAIT(humi, TRAIT_HULK) + humi.adjustFireLoss(burn_damage, FALSE) + . = TRUE - var/cold_damage_limit = bodytemp_cold_damage_limit + (is_hulk ? BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER : 0) - - if(humi.coretemperature < cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD)) - var/damage_type = is_hulk ? BRUTE : BURN // Why? - var/damage_mod = coldmod * humi.physiology.cold_mod * (is_hulk ? HULK_COLD_DAMAGE_MOD : 1) + if(humi.coretemperature < cold_level_1 && !HAS_TRAIT(humi, TRAIT_RESISTCOLD) && !CHEM_EFFECT_MAGNITUDE(humi, CE_CRYO)) + var/damage_mod = coldmod * humi.physiology.cold_mod // Can't be a switch due to http://www.byond.com/forum/post/2750423 - if(humi.coretemperature in 201 to cold_damage_limit) - humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * delta_time, damage_type) - else if(humi.coretemperature in 120 to 200) - humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * delta_time, damage_type) + if(humi.coretemperature in cold_level_1 to cold_level_2) + humi.adjustFireLoss(COLD_DAMAGE_LEVEL_1 * damage_mod * delta_time, FALSE) + else if(humi.coretemperature in cold_level_2 to cold_level_3) + humi.adjustFireLoss(COLD_DAMAGE_LEVEL_2 * damage_mod * delta_time, FALSE) else - humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * delta_time, damage_type) + humi.adjustFireLoss(COLD_DAMAGE_LEVEL_3 * damage_mod * delta_time, FALSE) + . = TRUE /// Handle the air pressure of the environment @@ -1545,7 +1565,10 @@ GLOBAL_LIST_EMPTY(features_by_species) // Very high pressure, show an alert and take damage 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 * delta_time) + H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * delta_time, FALSE) + H.adjustOrganLoss(ORGAN_SLOT_EARS, min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE)) + H.adjustOrganLoss(ORGAN_SLOT_EYES, min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE)) + . = TRUE H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/highpressure, 2) else H.clear_alert(ALERT_PRESSURE) @@ -1572,7 +1595,10 @@ GLOBAL_LIST_EMPTY(features_by_species) if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) H.clear_alert(ALERT_PRESSURE) else - H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * delta_time) + H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * delta_time, FALSE) + H.adjustOrganLoss(ORGAN_SLOT_EARS, (LOW_PRESSURE_DAMAGE * 0.1) * H.physiology.pressure_mod * delta_time) + H.adjustOrganLoss(ORGAN_SLOT_EYES, (LOW_PRESSURE_DAMAGE * 0.1) * H.physiology.pressure_mod * delta_time) + . = TRUE H.throw_alert(ALERT_PRESSURE, /atom/movable/screen/alert/lowpressure, 2) @@ -1600,20 +1626,6 @@ GLOBAL_LIST_EMPTY(features_by_species) return TRUE return FALSE -//////////////// -//Tail Wagging// -//////////////// - -/* - * Clears all tail related moodlets when they lose their species. - * - * former_tail_owner - the mob that was once a species with a tail and now is a different species - */ -/datum/species/proc/clear_tail_moodlets(mob/living/carbon/human/former_tail_owner) - SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") - SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") - SEND_SIGNAL(former_tail_owner, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") - /////////////// //FLIGHT SHIT// /////////////// @@ -1645,11 +1657,6 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/organ/wings/functional/wings = new(null, wings_icon, H.physique) wings.Insert(H) - handle_mutant_bodyparts(H) - -///Species override for unarmed attacks because the attack_hand proc was made by a mouth-breathing troglodyte on a tricycle. Also to whoever thought it would be a good idea to make it so the original spec_unarmedattack was not actually linked to unarmed attack needs to be checked by a doctor because they clearly have a vast empty space in their head. -/datum/species/proc/spec_unarmedattack(mob/living/carbon/human/user, atom/target, modifiers) - return FALSE /// Returns a list of strings representing features this species has. /// Used by the preferences UI to know what buttons to show. @@ -1683,6 +1690,11 @@ GLOBAL_LIST_EMPTY(features_by_species) features["skin_tone"] = GLOB.preference_entries[/datum/preference/choiced/skin_tone] features += populate_features() + #ifdef TESTING + for(var/feat in features) + if(!features[feat]) + stack_trace("Feature key [feat] has no associated preference.") + #endif sortTim(features, GLOBAL_PROC_REF(cmp_pref_name), associative = TRUE) GLOB.features_by_species[type] = features @@ -1693,6 +1705,7 @@ GLOBAL_LIST_EMPTY(features_by_species) SHOULD_CALL_PARENT(TRUE) . = list() return + /// Given a human, will adjust it before taking a picture for the preferences UI. /// This should create a CONSISTENT result, so the icons don't randomly change. /datum/species/proc/prepare_human_for_preview(mob/living/carbon/human/human) @@ -1708,16 +1721,27 @@ GLOBAL_LIST_EMPTY(features_by_species) 'goon/sounds/voice/mascream5.ogg', 'goon/sounds/voice/mascream7.ogg', 'sound/voice/human/malescream_5.ogg', + 'sound/voice/human/malescream_6.ogg', + 'sound/voice/human/malescream_7.ogg', + 'sound/voice/human/malescream_4.ogg', ) return pick( 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', + 'sound/voice/human/femalescream_6.ogg', + 'sound/voice/human/femalescream_7.ogg', 'goon/sounds/voice/fescream1.ogg', 'goon/sounds/voice/fescream5.ogg', ) +/datum/species/proc/get_agony_sound(mob/living/carbon/human/human) + return get_scream_sound(human) + +/datum/species/proc/get_pain_sound(mob/living/carbon/human/human) + return get_scream_sound(human) + /datum/species/proc/get_types_to_preload() var/list/to_store = list() to_store += mutant_organs @@ -1725,14 +1749,16 @@ GLOBAL_LIST_EMPTY(features_by_species) to_store += horny //Haha get it? //Don't preload brains, cause reuse becomes a horrible headache - to_store += mutantheart - to_store += mutantlungs - to_store += mutanteyes - to_store += mutantears - to_store += mutanttongue - to_store += mutantliver - to_store += mutantstomach - to_store += mutantappendix + to_store += organs[ORGAN_SLOT_HEART] + to_store += organs[ORGAN_SLOT_LUNGS] + to_store += organs[ORGAN_SLOT_EYES] + to_store += organs[ORGAN_SLOT_EARS] + to_store += organs[ORGAN_SLOT_TONGUE] + to_store += organs[ORGAN_SLOT_LIVER] + to_store += organs[ORGAN_SLOT_STOMACH] + to_store += organs[ORGAN_SLOT_APPENDIX] + + list_clear_nulls(to_store) //We don't cache mutant hands because it's not constrained enough, too high a potential for failure return to_store @@ -1794,8 +1820,36 @@ GLOBAL_LIST_EMPTY(features_by_species) "toxic_food" = bitfield_to_list(toxic_food, food_flags), ) +GLOBAL_LIST_EMPTY(species_perks) +/proc/get_species_constant_data(datum/species/path) + RETURN_TYPE(/list) + . = GLOB.species_perks[path] + if(.) + return + + path = new path + GLOB.species_perks[path.type] = path.get_constant_data() + return GLOB.species_perks[path.type] + +/// Generates nested lists of constant data for UIs. +/datum/species/proc/get_constant_data() + . = new /list(2) + + .[SPECIES_DATA_PERKS] = get_perk_data() + .[SPECIES_DATA_LANGUAGES] = get_innate_languages() + + return . + +/// Returns a list of each language we know innately. +/datum/species/proc/get_innate_languages() + . = list() + + var/datum/language_holder/temp_holder = new species_language_holder() + for(var/datum/language/path as anything in temp_holder.understood_languages | temp_holder.spoken_languages) + . += path + /** - * Generates a list of "perks" related to this species + * Perks of varying types. * (Postives, neutrals, and negatives) * in the format of a list of lists. * Used in the preference menu. @@ -1803,7 +1857,7 @@ GLOBAL_LIST_EMPTY(features_by_species) * "Perk" format is as followed: * list( * SPECIES_PERK_TYPE = type of perk (postiive, negative, neutral - use the defines) - * SPECIES_PERK_ICON = icon shown within the UI + * SPECIES_PERK_ICON = icon used, unused due to no longer being on tgui prefs * SPECIES_PERK_NAME = name of the perk on hover * SPECIES_PERK_DESC = description of the perk on hover * ) @@ -1812,9 +1866,8 @@ GLOBAL_LIST_EMPTY(features_by_species) * The outer list is an assoc list of [perk type]s to a list of perks. * The innter list is a list of perks. Can be empty, but won't be null. */ -/datum/species/proc/get_species_perks() +/datum/species/proc/get_perk_data() var/list/species_perks = list() - // Let us get every perk we can concieve of in one big list. // The order these are called (kind of) matters. // Species unique perks first, as they're more important than genetic perks, @@ -1837,6 +1890,7 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_NEGATIVE_PERK = list(), ) + // Filter invalid perks for(var/list/perk as anything in species_perks) var/perk_type = perk[SPECIES_PERK_TYPE] // If we find a perk that isn't postiive, negative, or neutral, @@ -1929,7 +1983,7 @@ GLOBAL_LIST_EMPTY(features_by_species) var/list/to_add = list() // Hot temperature tolerance - if(heatmod > 1 || bodytemp_heat_damage_limit < BODYTEMP_HEAT_DAMAGE_LIMIT) + if(heatmod > 1 || heat_level_1 < BODYTEMP_HEAT_DAMAGE_LIMIT) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "temperature-high", @@ -1937,7 +1991,7 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] are vulnerable to high temperatures.", )) - if(heatmod < 1 || bodytemp_heat_damage_limit > BODYTEMP_HEAT_DAMAGE_LIMIT) + if(heatmod < 1 || heat_level_1 > BODYTEMP_HEAT_DAMAGE_LIMIT) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "thermometer-empty", @@ -1946,7 +2000,7 @@ GLOBAL_LIST_EMPTY(features_by_species) )) // Cold temperature tolerance - if(coldmod > 1 || bodytemp_cold_damage_limit > BODYTEMP_COLD_DAMAGE_LIMIT) + if(coldmod > 1 || cold_level_1 > BODYTEMP_COLD_DAMAGE_LIMIT) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "temperature-low", @@ -1954,7 +2008,7 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] are vulnerable to cold temperatures.", )) - if(coldmod < 1 || bodytemp_cold_damage_limit < BODYTEMP_COLD_DAMAGE_LIMIT) + if(coldmod < 1 || cold_level_1 < BODYTEMP_COLD_DAMAGE_LIMIT) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "thermometer-empty", @@ -1990,15 +2044,6 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[name] blood is [initial(exotic_blood.name)], which can make recieving medical treatment harder.", )) - // Otherwise otherwise, see if they have an exotic bloodtype set - else if(exotic_bloodtype) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, - SPECIES_PERK_ICON = "tint", - SPECIES_PERK_NAME = "Exotic Blood", - SPECIES_PERK_DESC = "[plural_form] have \"[exotic_bloodtype]\" type blood, which can make recieving medical treatment harder.", - )) - return to_add /** @@ -2026,14 +2071,6 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] limbs are not secured well, and as such they are easily dismembered.", )) - if(TRAIT_EASILY_WOUNDED in inherent_traits) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "user-times", - SPECIES_PERK_NAME = "Easily Wounded", - SPECIES_PERK_DESC = "[plural_form] skin is very weak and fragile. They are much easier to apply serious wounds to.", - )) - if(TRAIT_TOXINLOVER in inherent_traits) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, @@ -2102,9 +2139,9 @@ GLOBAL_LIST_EMPTY(features_by_species) new_species ||= target.dna.species //If no new species is provided, assume its src. //Note for future: Potentionally add a new C.dna.species() to build a template species for more accurate limb replacement + var/is_digitigrade = FALSE if((new_species.digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == "Digitigrade Legs") || new_species.digitigrade_customization == DIGITIGRADE_FORCED) - new_species.bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade - new_species.bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade + is_digitigrade = TRUE for(var/obj/item/bodypart/old_part as anything in target.bodyparts) if(old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES) @@ -2114,6 +2151,77 @@ GLOBAL_LIST_EMPTY(features_by_species) var/obj/item/bodypart/new_part if(path) new_part = new path() + if(istype(new_part, /obj/item/bodypart/leg) && is_digitigrade) + new_part:set_digitigrade(TRUE) new_part.replace_limb(target, TRUE) new_part.update_limb(is_creating = TRUE) qdel(old_part) + +/// Creates body parts for the target completely from scratch based on the species +/datum/species/proc/create_fresh_body(mob/living/carbon/target) + target.create_bodyparts(bodypart_overrides) + +/datum/species/proc/replace_missing_bodyparts(mob/living/carbon/target) + var/is_digitigrade = FALSE + if((digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == "Digitigrade Legs") || digitigrade_customization == DIGITIGRADE_FORCED) + is_digitigrade = TRUE + + for(var/slot in target.get_missing_limbs()) + var/obj/item/bodypart/path = bodypart_overrides[slot] + if(path) + path = new path() + if(istype(path, /obj/item/bodypart/leg) && is_digitigrade) + path:set_digitigrade(TRUE) + path.attach_limb(target, TRUE) + path.update_limb(is_creating = TRUE) + + for(var/obj/item/bodypart/BP as anything in target.bodyparts) + if(BP.type == bodypart_overrides[BP.body_zone]) + continue + + var/obj/item/bodypart/new_part = bodypart_overrides[BP.body_zone] + if(new_part) + new_part = new new_part() + if(istype(new_part, /obj/item/bodypart/leg) && is_digitigrade) + new_part:set_digitigrade(TRUE) + new_part.replace_limb(target, TRUE) + new_part.update_limb(is_creating = TRUE) + qdel(BP) + +/datum/species/proc/get_cryogenic_factor(bodytemperature) + if(bodytemperature >= bodytemp_normal) + return 0 + + if(bodytemperature > 243) + return 0 + + else if(bodytemperature > 200) + . = 5 * (1 - (bodytemperature - 200) / (243 - 200)) + . = min(2, .) + else if(bodytemperature > 120) + . = 20 * (1 - (bodytemperature - 120) / (200 - 120)) + . = min(5, .) + else + . = 80 * (1 - bodytemperature / 120) + . = min(., 20) + + return (round(.)) + + +/datum/species/proc/get_pain_emote(amount) + var/chosen + + for(var/list/L as anything in pain_emotes) + if(amount >= pain_emotes[L]) + chosen = L + else + break + + return pick_weight(chosen) + +/datum/species/proc/get_deathgasp_sound(mob/living/carbon/human/H) + return pick('goon/sounds/voice/death_1.ogg', 'goon/sounds/voice/death_2.ogg') + +/// Returns a random blood type for this species +/datum/species/proc/get_random_blood_type() + return random_blood_type() diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index ed1efb22b24a..29fc7b28f9c7 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -12,7 +12,6 @@ TRAIT_NOHUNGER, TRAIT_NOBREATH, ) - mutanttongue = /obj/item/organ/tongue/abductor changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT ass_image = 'icons/ass/assgrey.png' @@ -25,14 +24,27 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/abductor, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = null, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/abductor, + ORGAN_SLOT_STOMACH = null, + ORGAN_SLOT_APPENDIX = null, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + /datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species) . = ..() var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.add_hud_to(C) + abductor_hud.show_to(C) C.set_safe_hunger_level() /datum/species/abductor/on_species_loss(mob/living/carbon/C) . = ..() var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR] - abductor_hud.remove_hud_from(C) + abductor_hud.hide_from(C) 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 cdc03b282eb1..d025f74fa617 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -24,7 +24,6 @@ ) inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID meat = null - mutanttongue = /obj/item/organ/tongue/robot species_language_holder = /datum/language_holder/synthetic wings_icons = list("Robotic") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT @@ -39,6 +38,18 @@ ) examine_limb_id = SPECIES_HUMAN + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = null, + ORGAN_SLOT_LUNGS = null, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/robot, + ORGAN_SLOT_STOMACH = null, + ORGAN_SLOT_APPENDIX = null, + ORGAN_SLOT_LIVER = null, + ) + /datum/species/android/on_species_gain(mob/living/carbon/C) . = ..() // Androids don't eat, hunger or metabolise foods. Let's do some cleanup. diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm deleted file mode 100644 index 9a77def8b0c9..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ /dev/null @@ -1,266 +0,0 @@ -/datum/species/dullahan - name = "\improper Dullahan" - id = SPECIES_DULLAHAN - default_color = "FFFFFF" - species_traits = list(EYECOLOR, HAIR, FACEHAIR, LIPS, HAS_FLESH, HAS_BONE, HAIRCOLOR, FACEHAIRCOLOR) - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOHUNGER, - TRAIT_NOBREATH, - ) - inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutant_bodyparts = list("wings" = "None") - use_skintones = TRUE - mutantbrain = /obj/item/organ/brain/dullahan - mutanteyes = /obj/item/organ/eyes/dullahan - mutanttongue = /obj/item/organ/tongue/dullahan - mutantears = /obj/item/organ/ears/dullahan - examine_limb_id = SPECIES_HUMAN - skinned_type = /obj/item/stack/sheet/animalhide/human - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN - - /// The dullahan relay that's associated with the owner, used to handle many things such as talking and hearing. - var/obj/item/dullahan_relay/my_head - - /// Did our owner's first client connection get handled yet? Useful for when some proc needs to be called once we're sure that a client has moved into our owner, like for Dullahans. - var/owner_first_client_connection_handled = FALSE - - -/datum/species/dullahan/check_roundstart_eligible() - if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) - return TRUE - return ..() - -/datum/species/dullahan/on_species_gain(mob/living/carbon/human/human, datum/species/old_species) - . = ..() - human.lose_hearing_sensitivity(TRAIT_GENERIC) - var/obj/item/bodypart/head/head = human.get_bodypart(BODY_ZONE_HEAD) - - if(head) - head.drop_limb() - - if(!QDELETED(head)) //drop_limb() deletes the limb if no drop location exists and character setup dummies are located in nullspace. - head.throwforce = 25 - my_head = new /obj/item/dullahan_relay(head, human) - human.put_in_hands(head) - head.show_organs_on_examine = FALSE - - // We want to give the head some boring old eyes just so it doesn't look too jank on the head sprite. - head.eyes = new /obj/item/organ/eyes(head) - head.eyes.eye_color_left = human.eye_color_left - head.eyes.eye_color_right = human.eye_color_right - human.update_body() - head.update_icon_dropped() - - human.set_safe_hunger_level() - -/datum/species/dullahan/on_species_loss(mob/living/carbon/human/human) - . = ..() - - if(my_head) - var/obj/item/bodypart/head/detached_head = my_head.loc - my_head.owner = null - QDEL_NULL(my_head) - if(detached_head) - qdel(detached_head) - - human.regenerate_limb(BODY_ZONE_HEAD, FALSE) - human.become_hearing_sensitive() - prevent_perspective_change = FALSE - human.reset_perspective(human) - -/datum/species/dullahan/spec_life(mob/living/carbon/human/human, delta_time, times_fired) - if(QDELETED(my_head)) - my_head = null - human.gib() - return - - if(my_head.loc.name != human.real_name && istype(my_head.loc, /obj/item/bodypart/head)) - var/obj/item/bodypart/head/detached_head = my_head.loc - detached_head.real_name = human.real_name - detached_head.name = human.real_name - detached_head.brain.name = "[human.name]'s brain" - - var/obj/item/bodypart/head/illegal_head = human.get_bodypart(BODY_ZONE_HEAD) - if(illegal_head) - my_head = null - human.gib() // Yeah so giving them a head on their body is really not a good idea, so their original head will remain but uh, good luck fixing it after that. - -/datum/species/dullahan/proc/update_vision_perspective(mob/living/carbon/human/human) - var/obj/item/organ/eyes/eyes = human.getorganslot(ORGAN_SLOT_EYES) - if(eyes) - human.update_tint() - if(eyes.tint) - prevent_perspective_change = FALSE - human.reset_perspective(human, TRUE) - else - human.reset_perspective(my_head, TRUE) - prevent_perspective_change = TRUE - -/datum/species/dullahan/on_owner_login(mob/living/carbon/human/owner) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(owner_first_client_connection_handled) - if(!eyes.tint) - owner.reset_perspective(my_head, TRUE) - prevent_perspective_change = TRUE - return - - // As it's the first time there's a client in our mob, we can finally update its vision to place it in the head instead! - var/datum/action/item_action/organ_action/dullahan/eyes_toggle_perspective_action = locate() in eyes?.actions - - eyes_toggle_perspective_action?.Trigger() - owner_first_client_connection_handled = TRUE - - -/datum/species/dullahan/get_species_description() - return "An angry spirit, hanging onto the land of the living for \ - unfinished business. Or that's what the books say. They're quite nice \ - when you get to know them." - -/datum/species/dullahan/get_species_lore() - return list( - "\"No wonder they're all so grumpy! Their hands are always full! I used to think, \ - \"Wouldn't this be cool?\" but after watching these creatures suffer from their head \ - getting dunked down disposals for the nth time, I think I'm good.\" - Captain Larry Dodd" - ) - -/datum/species/dullahan/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "horse-head", - SPECIES_PERK_NAME = "Headless and Horseless", - SPECIES_PERK_DESC = "Dullahans must lug their head around in their arms. While \ - many creative uses can come out of your head being independent of your \ - body, Dullahans will find it mostly a pain.", - )) - - return to_add - -// There isn't a "Minor Undead" biotype, so we have to explain it in an override (see: vampires) -/datum/species/dullahan/create_pref_biotypes_perks() - var/list/to_add = list() - - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "skull", - SPECIES_PERK_NAME = "Minor Undead", - SPECIES_PERK_DESC = "[name] are minor undead. \ - Minor undead enjoy some of the perks of being dead, like \ - not needing to breathe or eat, but do not get many of the \ - environmental immunities involved with being fully undead.", - )) - - return to_add - -/obj/item/organ/brain/dullahan - decoy_override = TRUE - organ_flags = 0 - -/obj/item/organ/tongue/dullahan - zone = "abstract" - modifies_speech = TRUE - -/obj/item/organ/tongue/dullahan/handle_speech(datum/source, list/speech_args) - if(ishuman(owner)) - var/mob/living/carbon/human/human = owner - if(isdullahan(human)) - var/datum/species/dullahan/dullahan_species = human.dna.species - if(isobj(dullahan_species.my_head.loc)) - var/obj/head = dullahan_species.my_head.loc - head.say(speech_args[SPEECH_MESSAGE], spans = speech_args[SPEECH_SPANS], sanitize = FALSE, language = speech_args[SPEECH_LANGUAGE], range = speech_args[SPEECH_RANGE]) - speech_args[SPEECH_MESSAGE] = "" - -/obj/item/organ/ears/dullahan - zone = "abstract" - -/obj/item/organ/eyes/dullahan - name = "head vision" - desc = "An abstraction." - actions_types = list(/datum/action/item_action/organ_action/dullahan) - zone = "abstract" - tint = INFINITY // to switch the vision perspective to the head on species_gain() without issue. - -/datum/action/item_action/organ_action/dullahan - name = "Toggle Perspective" - desc = "Switch between seeing normally from your head, or blindly from your body." - -/datum/action/item_action/organ_action/dullahan/Trigger(trigger_flags) - . = ..() - var/obj/item/organ/eyes/dullahan/dullahan_eyes = target - dullahan_eyes.tint = dullahan_eyes.tint ? NONE : INFINITY - - if(ishuman(owner)) - var/mob/living/carbon/human/human = owner - if(isdullahan(human)) - var/datum/species/dullahan/dullahan_species = human.dna.species - dullahan_species.update_vision_perspective(human) - - -/obj/item/dullahan_relay - name = "dullahan relay" - /// The mob (a dullahan) that owns this relay. - var/mob/living/owner - -/obj/item/dullahan_relay/Initialize(mapload, mob/living/carbon/human/new_owner) - . = ..() - if(!new_owner) - return INITIALIZE_HINT_QDEL - owner = new_owner - START_PROCESSING(SSobj, src) - RegisterSignal(owner, COMSIG_CLICK_SHIFT, PROC_REF(examinate_check)) - RegisterSignal(owner, COMSIG_LIVING_REGENERATE_LIMBS, PROC_REF(unlist_head)) - RegisterSignal(owner, COMSIG_LIVING_REVIVE, PROC_REF(retrieve_head)) - become_hearing_sensitive(ROUNDSTART_TRAIT) - -/obj/item/dullahan_relay/Destroy() - lose_hearing_sensitivity(ROUNDSTART_TRAIT) - owner = null - return ..() - -/obj/item/dullahan_relay/process() - if(!istype(loc, /obj/item/bodypart/head) || QDELETED(owner)) - . = PROCESS_KILL - qdel(src) - -/obj/item/dullahan_relay/proc/examinate_check(mob/user, atom/source) - SIGNAL_HANDLER - if(user.client.eye == src) - return COMPONENT_ALLOW_EXAMINATE - -/obj/item/dullahan_relay/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) - . = ..() - if(owner) - owner.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mods) - -///Adds the owner to the list of hearers in hearers_in_view(), for visible/hearable on top of say messages -/obj/item/dullahan_relay/proc/include_owner(datum/source, list/hearers) - SIGNAL_HANDLER - if(!QDELETED(owner)) - hearers += owner - -///Stops dullahans from gibbing when regenerating limbs -/obj/item/dullahan_relay/proc/unlist_head(datum/source, noheal = FALSE, list/excluded_zones) - SIGNAL_HANDLER - excluded_zones |= BODY_ZONE_HEAD - -///Retrieving the owner's head for better ahealing. -/obj/item/dullahan_relay/proc/retrieve_head(datum/source, full_heal, admin_revive) - SIGNAL_HANDLER - if(admin_revive) - var/obj/item/bodypart/head/head = loc - var/turf/body_turf = get_turf(owner) - if(head && istype(head) && body_turf && !(head in owner.get_all_contents())) - head.forceMove(body_turf) - -/obj/item/dullahan_relay/Destroy() - if(!QDELETED(owner)) - var/mob/living/carbon/human/human = owner - if(isdullahan(human)) - var/datum/species/dullahan/dullahan_species = human.dna.species - dullahan_species.my_head = 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 9c50003096b4..139cd65b11c3 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -2,26 +2,35 @@ name = "\improper Ethereal" id = SPECIES_ETHEREAL meat = /obj/item/food/meat/slab/human/mutant/ethereal - mutantlungs = /obj/item/organ/lungs/ethereal - mutantstomach = /obj/item/organ/stomach/ethereal - mutanttongue = /obj/item/organ/tongue/ethereal - mutantheart = /obj/item/organ/heart/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 - payday_modifier = 0.75 + job_outfit_type = SPECIES_HUMAN - species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, FACEHAIR, HAS_FLESH, HAS_BONE, HAIRCOLOR, FACEHAIRCOLOR) // i mean i guess they have blood so they can have wounds too + + species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, FACEHAIR, HAIRCOLOR, FACEHAIRCOLOR) // i mean i guess they have blood so they can have wounds too changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + species_cookie = /obj/item/food/energybar species_language_holder = /datum/language_holder/ethereal sexes = FALSE //no fetish content allowed toxic_food = NONE + + //* BODY TEMPERATURE THINGS *// + cold_level_3 = 120 + cold_level_2 = 200 + cold_level_1 = 283 + cold_discomfort_level = 340 // Body temperature for ethereals is much higher then humans as they like hotter environments - bodytemp_normal = (BODYTEMP_NORMAL + 50) - bodytemp_heat_damage_limit = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD // about 150C - // Cold temperatures hurt faster as it is harder to move with out the heat energy - bodytemp_cold_damage_limit = (T20C - 10) // about 10c + bodytemp_normal = BODYTEMP_NORMAL + 50 + + heat_discomfort_level = 370 + heat_level_1 = FIRE_MINIMUM_TEMPERATURE_TO_SPREAD //Around 423 k + heat_level_2 = 400 + heat_level_3 = 1000 + + hair_color = "fixedmutcolor" hair_alpha = 140 @@ -34,15 +43,22 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/ethereal, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart/ethereal, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/ethereal, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/ethereal, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/ethereal, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + var/current_color var/EMPeffect = FALSE var/emageffect = FALSE - var/r1 - var/g1 - var/b1 - var/static/r2 = 237 - var/static/g2 = 164 - var/static/b2 = 149 var/obj/effect/dummy/lighting_obj/ethereal_light @@ -58,10 +74,9 @@ if(!ishuman(C)) return var/mob/living/carbon/human/ethereal = C + default_color = ethereal.dna.features["ethcolor"] - r1 = GETREDPART(default_color) - g1 = GETGREENPART(default_color) - b1 = GETBLUEPART(default_color) + RegisterSignal(ethereal, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag_act)) RegisterSignal(ethereal, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp_act)) RegisterSignal(ethereal, COMSIG_LIGHT_EATER_ACT, PROC_REF(on_light_eater)) @@ -104,13 +119,19 @@ if(H.stat != DEAD && !EMPeffect) var/healthpercent = max(H.health, 0) / 100 if(!emageffect) - current_color = rgb(r2 + ((r1-r2)*healthpercent), g2 + ((g1-g2)*healthpercent), b2 + ((b1-b2)*healthpercent)) + var/static/list/skin_color = rgb2num("#eda495") + var/list/colors = rgb2num(H.dna.features["ethcolor"]) + var/list/built_color = list() + for(var/i in 1 to 3) + built_color += skin_color[i] + ((colors[i] - skin_color[i]) * healthpercent) + current_color = rgb(built_color[1], built_color[2], built_color[3]) ethereal_light.set_light_range_power_color(1 + (2 * healthpercent), 1 + (1 * healthpercent), current_color) ethereal_light.set_light_on(TRUE) fixed_mut_color = current_color else ethereal_light.set_light_on(FALSE) fixed_mut_color = rgb(128,128,128) + H.hair_color = current_color H.facial_hair_color = current_color H.update_body() @@ -207,12 +228,6 @@ SPECIES_PERK_DESC = "The Ethereal's heart will encase them in crystal should they die, returning them to life after a time - \ at the cost of a permanent brain trauma.", ), - list( - SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, - SPECIES_PERK_ICON = "fist-raised", - SPECIES_PERK_NAME = "Elemental Attacker", - SPECIES_PERK_DESC = "Ethereals deal burn damage with their punches instead of brute.", - ), list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "biohazard", diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm deleted file mode 100644 index 3e17807115b1..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ /dev/null @@ -1,158 +0,0 @@ -//Subtype of human -/datum/species/human/felinid - name = "\improper Felinid" - id = SPECIES_FELINE - say_mod = "meows" - - mutant_bodyparts = list("ears" = "Cat", "wings" = "None") - - mutantears = /obj/item/organ/ears/cat - cosmetic_organs = list( - /obj/item/organ/tail/cat = "Cat", - ) - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT - species_language_holder = /datum/language_holder/felinid - disliked_food = GROSS | CLOTH | RAW - liked_food = SEAFOOD | ORANGES - var/original_felinid = TRUE //set to false for felinids created by mass-purrbation - payday_modifier = 0.75 - ass_image = 'icons/ass/asscat.png' - family_heirlooms = list(/obj/item/toy/cattoy) - examine_limb_id = SPECIES_HUMAN - -// Prevents felinids from taking toxin damage from carpotoxin -/datum/species/human/felinid/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(istype(chem, /datum/reagent/toxin/carpotoxin)) - var/datum/reagent/toxin/carpotoxin/fish = chem - fish.toxpwr = 0 - - -/datum/species/human/felinid/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!pref_load) //Hah! They got forcefully purrbation'd. Force default felinid parts on them if they have no mutant parts in those areas! - H.dna.features["tail_cat"] = "Cat" - if(H.dna.features["ears"] == "None") - H.dna.features["ears"] = "Cat" - if(H.dna.features["ears"] == "Cat") - var/obj/item/organ/ears/cat/ears = new - ears.Insert(H, drop_if_replaced = FALSE) - else - mutantears = /obj/item/organ/ears - return ..() - -/proc/mass_purrbation() - for(var/M in GLOB.mob_list) - if(ishuman(M)) - purrbation_apply(M) - CHECK_TICK - -/proc/mass_remove_purrbation() - for(var/M in GLOB.mob_list) - if(ishuman(M)) - purrbation_remove(M) - CHECK_TICK - -/proc/purrbation_toggle(mob/living/carbon/human/H, silent = FALSE) - if(!ishumanbasic(H)) - return - if(!isfelinid(H)) - purrbation_apply(H, silent) - . = TRUE - else - purrbation_remove(H, silent) - . = FALSE - -/proc/purrbation_apply(mob/living/carbon/human/H, silent = FALSE) - if(!ishuman(H) || isfelinid(H)) - return - if(ishumanbasic(H)) - H.set_species(/datum/species/human/felinid) - var/datum/species/human/felinid/cat_species = H.dna.species - cat_species.original_felinid = FALSE - else - var/obj/item/organ/ears/cat/kitty_ears = new - var/obj/item/organ/tail/cat/kitty_tail = new - kitty_ears.Insert(H, TRUE, FALSE) //Gives nonhumans cat tail and ears - kitty_tail.Insert(H, TRUE, FALSE) - if(!silent) - to_chat(H, span_boldnotice("Something is nya~t right.")) - playsound(get_turf(H), 'sound/effects/meow1.ogg', 50, TRUE, -1) - -/proc/purrbation_remove(mob/living/carbon/human/H, silent = FALSE) - if(isfelinid(H)) - var/datum/species/human/felinid/cat_species = H.dna.species - if(!cat_species.original_felinid) - H.set_species(/datum/species/human) - else if(ishuman(H) && !ishumanbasic(H)) - var/datum/species/target_species = H.dna.species - for(var/obj/item/organ/current_organ as anything in H.cosmetic_organs) - if(istype(current_organ, /obj/item/organ/tail/cat)) - current_organ.Remove(H, TRUE) - var/obj/item/organ/tail/new_tail = locate(/obj/item/organ/tail) in target_species.cosmetic_organs - if(new_tail) - new_tail = new new_tail() - new_tail.Insert(H, TRUE, FALSE) - if(istype(current_organ, /obj/item/organ/ears/cat)) - var/obj/item/organ/new_ears = new target_species.mutantears - new_ears.Insert(H, TRUE, FALSE) - if(!silent) - to_chat(H, span_boldnotice("You are no longer a cat.")) - -/datum/species/human/felinid/prepare_human_for_preview(mob/living/carbon/human/human_for_preview) - human_for_preview.hairstyle = "Hime Cut" - human_for_preview.hair_color = "#ffcccc" // pink - human_for_preview.update_body_parts() - - var/obj/item/organ/ears/cat/cat_ears = human_for_preview.getorgan(/obj/item/organ/ears/cat) - if (cat_ears) - cat_ears.color = human_for_preview.hair_color - human_for_preview.update_body() - -/datum/species/human/felinid/get_species_description() - return "Felinids are one of the many types of bespoke genetic \ - modifications to come of humanity's mastery of genetic science, and are \ - also one of the most common. Meow?" - -/datum/species/human/felinid/get_species_lore() - return list( - "Bio-engineering at its felinest, Felinids are the peak example of humanity's mastery of genetic code. \ - One of many \"Animalid\" variants, Felinids are the most popular and common, as well as one of the \ - biggest points of contention in genetic-modification.", - - "Body modders were eager to splice human and feline DNA in search of the holy trifecta: ears, eyes, and tail. \ - These traits were in high demand, with the corresponding side effects of vocal and neurochemical changes being seen as a minor inconvenience.", - - "Sadly for the Felinids, they were not minor inconveniences. Shunned as subhuman and monstrous by many, Felinids (and other Animalids) \ - sought their greener pastures out in the colonies, cloistering in communities of their own kind. \ - As a result, outer Human space has a high Animalid population.", - ) - -// Felinids are subtypes of humans. -// This shouldn't call parent or we'll get a buncha human related perks (though it doesn't have a reason to). -/datum/species/human/felinid/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list( - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "grin-tongue", - SPECIES_PERK_NAME = "Grooming", - SPECIES_PERK_DESC = "Felinids can lick wounds to reduce bleeding.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "assistive-listening-systems", - SPECIES_PERK_NAME = "Sensitive Hearing", - SPECIES_PERK_DESC = "Felinids are more sensitive to loud sounds, such as flashbangs.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "shower", - SPECIES_PERK_NAME = "Hydrophobia", - SPECIES_PERK_DESC = "Felinids don't like getting soaked with water.", - ), - ) - - return to_add 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 9aa77a2692f4..cd6836567f24 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -3,29 +3,23 @@ plural_form = "Flypeople" id = SPECIES_FLYPERSON say_mod = "buzzes" - species_traits = list(HAS_FLESH, HAS_BONE, TRAIT_ANTENNAE) + species_traits = list() inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_CAN_USE_FLIGHT_POTION, + TRAIT_ANTENNAE, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG meat = /obj/item/food/meat/slab/human/mutant/fly - mutanteyes = /obj/item/organ/eyes/fly + liked_food = GROSS disliked_food = NONE toxic_food = NONE changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_language_holder = /datum/language_holder/fly - payday_modifier = 0.75 job_outfit_type = SPECIES_HUMAN - mutanttongue = /obj/item/organ/tongue/fly - mutantheart = /obj/item/organ/heart/fly - mutantlungs = /obj/item/organ/lungs/fly - mutantliver = /obj/item/organ/liver/fly - mutantstomach = /obj/item/organ/stomach/fly - mutantappendix = /obj/item/organ/appendix/fly mutant_organs = list(/obj/item/organ/fly, /obj/item/organ/fly/groin) bodypart_overrides = list( @@ -37,12 +31,17 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/fly, ) -/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - ..() + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart/fly, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/fly, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/fly, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/fly, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/fly, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix/fly, + ORGAN_SLOT_LIVER = /obj/item/organ/liver/fly, + ) /datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) @@ -125,7 +124,6 @@ /obj/item/organ/liver/fly desc = "You have no idea what the hell this is, or how it manages to keep something alive in any capacity." - alcohol_tolerance = 0.007 //flies eat vomit, so a lower alcohol tolerance is perfect! /obj/item/organ/liver/fly/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm deleted file mode 100644 index 4d34123df04e..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ /dev/null @@ -1,1376 +0,0 @@ -/datum/species/golem - // Animated beings of stone. They have increased defenses, and do not need to breathe. They're also slow as fuuuck. - name = "\improper Golem" - id = SPECIES_GOLEM - species_traits = list(NOBLOOD,NOTRANSSTING, MUTCOLORS,NO_UNDERWEAR, NO_DNA_COPY) - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - mutant_organs = list(/obj/item/organ/adamantine_resonator) - mutanttongue = /obj/item/organ/vocal_cords/adamantine - speedmod = 2 - payday_modifier = 0.75 - armor = 55 - siemens_coeff = 0 - 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 - meat = /obj/item/food/meat/slab/human/mutant/golem - species_language_holder = /datum/language_holder/golem - // To prevent golem subtypes from overwhelming the odds when random species - // changes, only the Random Golem type can be chosen - fixed_mut_color = "#aaaaaa" - - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/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 - - var/prefix = "Iron" - var/list/special_names = list("Tarkus") - var/human_surname_chance = 3 - var/special_name_chance = 5 - var/owner //dobby is a free golem - -/datum/species/golem/random_name(gender,unique,lastname) - var/golem_surname = pick(GLOB.golem_names) - // 3% chance that our golem has a human surname, because - // cultural contamination - if(prob(human_surname_chance)) - golem_surname = pick(GLOB.last_names) - else if(special_names?.len && prob(special_name_chance)) - golem_surname = pick(special_names) - - var/golem_name = "[prefix] [golem_surname]" - return golem_name - -/datum/species/golem/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "gem", - SPECIES_PERK_NAME = "Lithoid", - SPECIES_PERK_DESC = "Lithoids are creatures made out of elements instead of \ - blood and flesh. Because of this, they're generally stronger, slower, \ - and mostly immune to environmental dangers and dangers to their health, \ - such as viruses and dismemberment.", - )) - - return to_add - -/datum/species/golem/adamantine - name = "\improper Adamantine Golem" - id = SPECIES_GOLEM_ADAMANTINE - meat = /obj/item/food/meat/slab/human/mutant/golem/adamantine - mutant_organs = list(/obj/item/organ/adamantine_resonator) - mutanttongue = /obj/item/organ/vocal_cords/adamantine - fixed_mut_color = "#44eedd" - info_text = "As an Adamantine Golem, you possess special vocal cords allowing you to \"resonate\" messages to all golems. Your unique mineral makeup makes you immune to most types of magic." - prefix = "Adamantine" - special_names = null - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/adamantine/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - ADD_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT) - -/datum/species/golem/adamantine/on_species_loss(mob/living/carbon/C) - REMOVE_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT) - ..() - -//The suicide bombers of golemkind -/datum/species/golem/plasma - name = "\improper Plasma Golem" - id = SPECIES_GOLEM_PLASMA - fixed_mut_color = "#aa33dd" - meat = /obj/item/stack/ore/plasma - //Can burn and takes damage from heat - //no RESISTHEAT, NOFIRE - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - info_text = "As a Plasma Golem, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!" - heatmod = 0 //fine until they blow up - prefix = "Plasma" - special_names = list("Flood","Fire","Bar","Man") - examine_limb_id = SPECIES_GOLEM - var/boom_warning = FALSE - var/datum/action/innate/ignite/ignite - -/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H, delta_time, times_fired) - if(H.bodytemperature > 750) - if(!boom_warning && H.on_fire) - to_chat(H, span_userdanger("You feel like you could blow up at any moment!")) - boom_warning = TRUE - else - if(boom_warning) - to_chat(H, span_notice("You feel more stable.")) - boom_warning = FALSE - - if(H.bodytemperature > 850 && H.on_fire && prob(25)) - explosion(H, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 4, flame_range = 5, explosion_cause = src) - if(H) - H.gib() - if(H.fire_stacks < 2) //flammable - H.adjust_fire_stacks(0.5 * delta_time) - ..() - -/datum/species/golem/plasma/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - if(ishuman(C)) - ignite = new - ignite.Grant(C) - -/datum/species/golem/plasma/on_species_loss(mob/living/carbon/C) - if(ignite) - ignite.Remove(C) - ..() - -/datum/action/innate/ignite - name = "Ignite" - desc = "Set yourself aflame, bringing yourself closer to exploding!" - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "sacredflame" - -/datum/action/innate/ignite/Activate() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - if(H.fire_stacks) - to_chat(owner, span_notice("You ignite yourself!")) - else - to_chat(owner, span_warning("You try to ignite yourself, but fail!")) - H.ignite_mob() //firestacks are already there passively - -//Harder to hurt -/datum/species/golem/diamond - name = "\improper Diamond Golem" - id = SPECIES_GOLEM_DIAMOND - fixed_mut_color = "#00ffff" - armor = 70 //up from 55 - meat = /obj/item/stack/ore/diamond - info_text = "As a Diamond Golem, you are more resistant than the average golem." - prefix = "Diamond" - special_names = list("Back","Grill") - examine_limb_id = SPECIES_GOLEM - -//Faster but softer and less armoured -/datum/species/golem/gold - name = "\improper Gold Golem" - id = SPECIES_GOLEM_GOLD - fixed_mut_color = "#cccc00" - speedmod = 1 - armor = 25 //down from 55 - meat = /obj/item/stack/ore/gold - info_text = "As a Gold Golem, you are faster but less resistant than the average golem." - prefix = "Golden" - special_names = list("Boy") - examine_limb_id = SPECIES_GOLEM - -//Heavier, thus higher chance of stunning when punching -/datum/species/golem/silver - name = "\improper Silver Golem" - id = SPECIES_GOLEM_SILVER - fixed_mut_color = "#dddddd" - meat = /obj/item/stack/ore/silver - info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to most types of magic." - prefix = "Silver" - special_names = list("Surfer", "Chariot", "Lining") - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/silver/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) - -/datum/species/golem/silver/on_species_loss(mob/living/carbon/C) - REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) - ..() - -//Harder to stun, deals more damage, massively slowpokes, but gravproof and obstructive. Basically, The Wall. -/datum/species/golem/plasteel - name = "\improper Plasteel Golem" - id = SPECIES_GOLEM_PLASTEEL - fixed_mut_color = "#bbbbbb" - stunmod = 0.4 - speedmod = 4 //pretty fucking slow - meat = /obj/item/stack/ore/iron - info_text = "As a Plasteel Golem, you are slower, but harder to stun, and hit very hard when punching. You also magnetically attach to surfaces and so don't float without gravity and cannot have positions swapped with other beings." - prefix = "Plasteel" - special_names = null - examine_limb_id = SPECIES_GOLEM - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/plasteel, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/plasteel, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/plasteel, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/plasteel, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem, - ) - -/datum/species/golem/plasteel/negates_gravity(mob/living/carbon/human/H) - return TRUE - -/datum/species/golem/plasteel/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - ADD_TRAIT(C, TRAIT_NOMOBSWAP, SPECIES_TRAIT) //THE WALL THE WALL THE WALL - -/datum/species/golem/plasteel/on_species_loss(mob/living/carbon/C) - REMOVE_TRAIT(C, TRAIT_NOMOBSWAP, SPECIES_TRAIT) //NOTHING ON ERF CAN MAKE IT FALL - ..() - -//Immune to ash storms -/datum/species/golem/titanium - name = "\improper Titanium Golem" - id = SPECIES_GOLEM_TITANIUM - fixed_mut_color = "#ffffff" - meat = /obj/item/stack/ore/titanium - info_text = "As a Titanium Golem, you are immune to ash storms, and slightly more resistant to burn damage." - burnmod = 0.9 - prefix = "Titanium" - special_names = list("Dioxide") - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/titanium/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - ADD_TRAIT(C, TRAIT_ASHSTORM_IMMUNE, SPECIES_TRAIT) - -/datum/species/golem/titanium/on_species_loss(mob/living/carbon/C) - . = ..() - REMOVE_TRAIT(C, TRAIT_ASHSTORM_IMMUNE, SPECIES_TRAIT) - -//Immune to ash storms and lava -/datum/species/golem/plastitanium - name = "\improper Plastitanium Golem" - id = SPECIES_GOLEM_PLASTITANIUM - fixed_mut_color = "#888888" - meat = /obj/item/stack/ore/titanium - info_text = "As a Plastitanium Golem, you are immune to both ash storms and lava, and slightly more resistant to burn damage." - burnmod = 0.8 - prefix = "Plastitanium" - special_names = null - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/plastitanium/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - ADD_TRAIT(C, TRAIT_LAVA_IMMUNE, SPECIES_TRAIT) - ADD_TRAIT(C, TRAIT_ASHSTORM_IMMUNE, SPECIES_TRAIT) - -/datum/species/golem/plastitanium/on_species_loss(mob/living/carbon/C) - . = ..() - REMOVE_TRAIT(C, TRAIT_LAVA_IMMUNE, SPECIES_TRAIT) - REMOVE_TRAIT(C, TRAIT_ASHSTORM_IMMUNE, SPECIES_TRAIT) - -//Fast and regenerates... but can only speak like an abductor -/datum/species/golem/alloy - name = "\improper Alien Alloy Golem" - id = SPECIES_GOLEM_ALIEN - fixed_mut_color = "#333333" - meat = /obj/item/stack/sheet/mineral/abductor - mutanttongue = /obj/item/organ/tongue/abductor - speedmod = 1 //faster - info_text = "As an Alloy Golem, you are made of advanced alien materials: you are faster and regenerate over time. You are, however, only able to be heard by other alloy golems." - prefix = "Alien" - special_names = list("Outsider", "Technology", "Watcher", "Stranger") //ominous and unknown - examine_limb_id = SPECIES_GOLEM - -//Regenerates because self-repairing super-advanced alien tech -/datum/species/golem/alloy/spec_life(mob/living/carbon/human/H, delta_time, times_fired) - if(H.stat == DEAD) - return - H.heal_overall_damage(1 * delta_time, 1 * delta_time, BODYTYPE_ORGANIC) - H.adjustToxLoss(-1 * delta_time) - H.adjustOxyLoss(-1 * delta_time) - -//Since this will usually be created from a collaboration between podpeople and free golems, wood golems are a mix between the two races -/datum/species/golem/wood - name = "\improper Wood Golem" - id = SPECIES_GOLEM_WOOD - fixed_mut_color = "#9E704B" - meat = /obj/item/stack/sheet/mineral/wood - //Can burn and take damage from heat - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT - armor = 30 - burnmod = 1.25 - heatmod = 1.5 - info_text = "As a Wooden Golem, you have plant-like traits: you take damage from extreme temperatures, can be set on fire, and have lower armor than a normal golem. You regenerate when in the light and wither in the darkness." - prefix = "Wooden" - special_names = list("Bark", "Willow", "Catalpa", "Woody", "Oak", "Sap", "Twig", "Branch", "Maple", "Birch", "Elm", "Basswood", "Cottonwood", "Larch", "Aspen", "Ash", "Beech", "Buckeye", "Cedar", "Chestnut", "Cypress", "Fir", "Hawthorn", "Hazel", "Hickory", "Ironwood", "Juniper", "Leaf", "Mangrove", "Palm", "Pawpaw", "Pine", "Poplar", "Redwood", "Redbud", "Sassafras", "Spruce", "Sumac", "Trunk", "Walnut", "Yew") - human_surname_chance = 0 - special_name_chance = 100 - inherent_factions = list("plants", "vines") - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/wood/spec_life(mob/living/carbon/human/H, delta_time, times_fired) - if(H.stat == DEAD) - return - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(H.loc)) //else, there's considered to be no light - var/turf/T = H.loc - light_amount = min(1, T.get_lumcount()) - 0.5 - H.adjust_nutrition(5 * light_amount * delta_time) - if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL) - H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) - if(light_amount > 0.2) //if there's enough light, heal - H.heal_overall_damage(0.5 * delta_time, 0.5 * delta_time, BODYTYPE_ORGANIC) - H.adjustToxLoss(-0.5 * delta_time) - H.adjustOxyLoss(-0.5 * delta_time) - - if(H.nutrition < NUTRITION_LEVEL_STARVING + 50) - H.take_overall_damage(2,0) - -/datum/species/golem/wood/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(chem.type == /datum/reagent/toxin/plantbgone) - H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - -//Radioactive puncher, hits for burn but only as hard as human, slightly more durable against brute but less against everything else -/datum/species/golem/uranium - name = "\improper Uranium Golem" - id = SPECIES_GOLEM_URANIUM - fixed_mut_color = "#77ff00" - meat = /obj/item/stack/ore/uranium - info_text = "As an Uranium Golem, your very touch burns and irradiates organic lifeforms. You don't hit as hard as most golems, but you are far more durable against blunt force trauma." - var/last_event = 0 - var/active = null - armor = 40 - brutemod = 0.5 - prefix = "Uranium" - special_names = list("Oxide", "Rod", "Meltdown", "235") - COOLDOWN_DECLARE(radiation_emission_cooldown) - examine_limb_id = SPECIES_GOLEM - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/uranium, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/uranium, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem, - ) - -/datum/species/golem/uranium/proc/radiation_emission(mob/living/carbon/human/H) - if(!COOLDOWN_FINISHED(src, radiation_emission_cooldown)) - return - else - radiation_pulse(H, max_range = 1, threshold = RAD_VERY_LIGHT_INSULATION, chance = 3) - COOLDOWN_START(src, radiation_emission_cooldown, 2 SECONDS) - -/datum/species/golem/uranium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) - ..() - if(COOLDOWN_FINISHED(src, radiation_emission_cooldown) && M != H && M.combat_mode) - radiation_emission(H) - -/datum/species/golem/uranium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) - ..() - if(COOLDOWN_FINISHED(src, radiation_emission_cooldown) && user != H) - radiation_emission(H) - -/datum/species/golem/uranium/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(COOLDOWN_FINISHED(src, radiation_emission_cooldown)) - radiation_emission(H) - -//Immune to physical bullets and resistant to brute, but very vulnerable to burn damage. Dusts on death. -/datum/species/golem/sand - name = "\improper Sand Golem" - id = SPECIES_GOLEM_SAND - fixed_mut_color = "#ffdc8f" - meat = /obj/item/stack/ore/glass //this is sand - armor = 0 - burnmod = 3 //melts easily - brutemod = 0.25 - info_text = "As a Sand Golem, you are immune to physical bullets and take very little brute damage, but are extremely vulnerable to burn damage and energy weapons. You will also turn to sand when dying, preventing any form of recovery." - prefix = "Sand" - special_names = list("Castle", "Bag", "Dune", "Worm", "Storm") - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/sand/spec_death(gibbed, mob/living/carbon/human/H) - H.visible_message(span_danger("[H] turns into a pile of sand!")) - for(var/obj/item/W in H) - H.dropItemToGround(W) - for(var/i in 1 to rand(3,5)) - new /obj/item/stack/ore/glass(get_turf(H)) - qdel(H) - -/datum/species/golem/sand/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - if(!(P.original == H && P.firer == H)) - if(P.armor_flag == BULLET || P.armor_flag == BOMB) - playsound(H, 'sound/effects/shovel_dig.ogg', 70, TRUE) - H.visible_message(span_danger("The [P.name] sinks harmlessly in [H]'s sandy body!"), \ - span_userdanger("The [P.name] sinks harmlessly in [H]'s sandy body!")) - return BULLET_ACT_BLOCK - return ..() - -//Reflects lasers and resistant to burn damage, but very vulnerable to brute damage. Shatters on death. -/datum/species/golem/glass - name = "\improper Glass Golem" - id = SPECIES_GOLEM_GLASS - fixed_mut_color = "#5a96b4aa" //transparent body - meat = /obj/item/shard - armor = 0 - brutemod = 3 //very fragile - burnmod = 0.25 - info_text = "As a Glass Golem, you reflect lasers and energy weapons, and are very resistant to burn damage. However, you are extremely vulnerable to brute damage. On death, you'll shatter beyond any hope of recovery." - prefix = "Glass" - special_names = list("Lens", "Prism", "Fiber", "Bead") - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/glass/spec_death(gibbed, mob/living/carbon/human/H) - playsound(H, SFX_SHATTER, 70, TRUE) - H.visible_message(span_danger("[H] shatters!")) - for(var/obj/item/W in H) - H.dropItemToGround(W) - for(var/i in 1 to rand(3,5)) - new /obj/item/shard(get_turf(H)) - qdel(H) - -/datum/species/golem/glass/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - if(!(P.original == H && P.firer == H)) //self-shots don't reflect - if(P.armor_flag == LASER || P.armor_flag == ENERGY) - H.visible_message(span_danger("The [P.name] gets reflected by [H]'s glass skin!"), \ - span_userdanger("The [P.name] gets reflected by [H]'s glass skin!")) - 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) - // redirect the projectile - P.firer = H - P.preparePixelProjectile(locate(clamp(new_x, 1, world.maxx), clamp(new_y, 1, world.maxy), H.z), H) - return BULLET_ACT_FORCE_PIERCE - return ..() - -//Teleports when hit or when it wants to -/datum/species/golem/bluespace - name = "\improper Bluespace Golem" - id = SPECIES_GOLEM_BLUESPACE - fixed_mut_color = "#3333ff" - meat = /obj/item/stack/ore/bluespace_crystal - info_text = "As a Bluespace Golem, you are spatially unstable: You will teleport when hit, and you can teleport manually at a long distance." - prefix = "Bluespace" - special_names = list("Crystal", "Polycrystal") - examine_limb_id = SPECIES_GOLEM - - var/datum/action/innate/unstable_teleport/unstable_teleport - var/teleport_cooldown = 100 - var/last_teleport = 0 - -/datum/species/golem/bluespace/proc/reactive_teleport(mob/living/carbon/human/H) - H.visible_message(span_warning("[H] teleports!"), span_danger("You destabilize and teleport!")) - new /obj/effect/particle_effect/sparks(get_turf(H)) - playsound(get_turf(H), SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - do_teleport(H, get_turf(H), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - last_teleport = world.time - -/datum/species/golem/bluespace/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) - ..() - var/obj/item/I - if(istype(AM, /obj/item)) - I = AM - if(I.thrownby == WEAKREF(H)) //No throwing stuff at yourself to trigger the teleport - return 0 - else - reactive_teleport(H) - -/datum/species/golem/bluespace/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) - ..() - if(world.time > last_teleport + teleport_cooldown && M != H && M.combat_mode) - reactive_teleport(H) - -/datum/species/golem/bluespace/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) - ..() - if(world.time > last_teleport + teleport_cooldown && user != H) - reactive_teleport(H) - -/datum/species/golem/bluespace/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(world.time > last_teleport + teleport_cooldown) - reactive_teleport(H) - -/datum/species/golem/bluespace/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - if(ishuman(C)) - unstable_teleport = new - unstable_teleport.Grant(C) - last_teleport = world.time - -/datum/species/golem/bluespace/on_species_loss(mob/living/carbon/C) - if(unstable_teleport) - unstable_teleport.Remove(C) - ..() - -/datum/action/innate/unstable_teleport - name = "\improper Unstable Teleport" - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "jaunt" - button_icon = 'icons/mob/actions/actions_spells.dmi' - var/cooldown = 150 - var/last_teleport = 0 - ///Set to true upon action activation to prevent spamming teleport callbacks while the first is still occurring. - var/is_charging = FALSE - -/datum/action/innate/unstable_teleport/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return - if(world.time > last_teleport + cooldown && !is_charging) - return TRUE - return FALSE - -/datum/action/innate/unstable_teleport/Activate() - var/mob/living/carbon/human/H = owner - H.visible_message(span_warning("[H] starts vibrating!"), span_danger("You start charging your bluespace core...")) - is_charging = TRUE - build_all_button_icons() //action icon looks unavailable - playsound(get_turf(H), 'sound/weapons/flash.ogg', 25, TRUE) - addtimer(CALLBACK(src, PROC_REF(teleport), H), 15) - -/datum/action/innate/unstable_teleport/proc/teleport(mob/living/carbon/human/H) - H.visible_message(span_warning("[H] disappears in a shower of sparks!"), span_danger("You teleport!")) - var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread - spark_system.set_up(10, 0, src) - spark_system.attach(H) - spark_system.start() - do_teleport(H, get_turf(H), 12, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - last_teleport = world.time - is_charging = FALSE - addtimer(CALLBACK(src, PROC_REF(build_all_button_icons)), cooldown + 5) //action icon looks available again - - -//honk -/datum/species/golem/bananium - name = "\improper Bananium Golem" - id = SPECIES_GOLEM_BANANIUM - fixed_mut_color = "#ffff00" - say_mod = "honks" - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_CLUMSY, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - meat = /obj/item/stack/ore/bananium - info_text = "As a Bananium Golem, you are made for pranking. Your body emits natural honks, and you can barely even hurt people when punching them. Your skin also bleeds banana peels when damaged." - prefix = "Bananium" - special_names = null - examine_limb_id = SPECIES_GOLEM - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/bananium, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/bananium, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/bananium, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/bananium, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem, - ) - - /// Cooldown for producing honks - COOLDOWN_DECLARE(honkooldown) - /// Cooldown for producing bananas - COOLDOWN_DECLARE(banana_cooldown) - /// Time between possible banana productions - var/banana_delay = 10 SECONDS - /// Same as the uranium golem. I'm pretty sure this is vestigial. - var/active = FALSE - -/datum/species/golem/bananium/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - COOLDOWN_START(src, honkooldown, 0) - COOLDOWN_START(src, banana_cooldown, banana_delay) - RegisterSignal(C, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) - if(liver) - ADD_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT) - -/datum/species/golem/bananium/on_species_loss(mob/living/carbon/C) - . = ..() - UnregisterSignal(C, COMSIG_MOB_SAY) - - var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) - if(liver) - REMOVE_TRAIT(liver, TRAIT_COMEDY_METABOLISM, SPECIES_TRAIT) - -/datum/species/golem/bananium/random_name(gender,unique,lastname) - var/clown_name = pick(GLOB.clown_names) - var/golem_name = "[uppertext(clown_name)]" - return golem_name - -/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) - ..() - if(COOLDOWN_FINISHED(src, banana_cooldown) && M != H && M.combat_mode) - new /obj/item/grown/bananapeel/specialpeel(get_turf(H)) - COOLDOWN_START(src, banana_cooldown, banana_delay) - -/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) - ..() - if((user != H) && COOLDOWN_FINISHED(src, banana_cooldown)) - new /obj/item/grown/bananapeel/specialpeel(get_turf(H)) - COOLDOWN_START(src, banana_cooldown, banana_delay) - -/datum/species/golem/bananium/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(COOLDOWN_FINISHED(src, banana_cooldown)) - new /obj/item/grown/bananapeel/specialpeel(get_turf(H)) - COOLDOWN_START(src, banana_cooldown, banana_delay) - -/datum/species/golem/bananium/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) - ..() - var/obj/item/I - if(istype(AM, /obj/item)) - I = AM - 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)) - COOLDOWN_START(src, banana_cooldown, banana_delay) - -/datum/species/golem/bananium/spec_life(mob/living/carbon/human/H, delta_time, times_fired) - if(!active && COOLDOWN_FINISHED(src, honkooldown)) - active = TRUE - playsound(get_turf(H), 'sound/items/bikehorn.ogg', 50, TRUE) - COOLDOWN_START(src, honkooldown, rand(2 SECONDS, 8 SECONDS)) - active = FALSE - ..() - -/datum/species/golem/bananium/spec_death(gibbed, mob/living/carbon/human/H) - playsound(get_turf(H), 'sound/misc/sadtrombone.ogg', 70, FALSE) - -/datum/species/golem/bananium/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - speech_args[SPEECH_SPANS] |= SPAN_CLOWN - -/datum/species/golem/runic - name = "\improper Runic Golem" - id = SPECIES_GOLEM_CULT - 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) //no mutcolors - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOFLASH, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - prefix = "Runic" - special_names = null - inherent_factions = list("cult") - species_language_holder = /datum/language_holder/golem/runic - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cult, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cult, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cult, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cult, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cult, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cult, - ) - - /// A ref to our jaunt spell that we get on species gain. - var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/shift/golem/jaunt - /// A ref to our gaze spell that we get on species gain. - var/datum/action/cooldown/spell/pointed/abyssal_gaze/abyssal_gaze - /// A ref to our dominate spell that we get on species gain. - var/datum/action/cooldown/spell/pointed/dominate/dominate - -/datum/species/golem/runic/random_name(gender,unique,lastname) - var/edgy_first_name = pick("Razor","Blood","Dark","Evil","Cold","Pale","Black","Silent","Chaos","Deadly","Coldsteel") - var/edgy_last_name = pick("Edge","Night","Death","Razor","Blade","Steel","Calamity","Twilight","Shadow","Nightmare") //dammit Razor Razor - var/golem_name = "[edgy_first_name] [edgy_last_name]" - return golem_name - -/datum/species/golem/runic/on_species_gain(mob/living/carbon/grant_to, datum/species/old_species) - . = ..() - // Create our species specific spells here. - // Note we link them to the mob, not the mind, - // so they're not moved around on mindswaps - jaunt = new(grant_to) - jaunt.StartCooldown() - jaunt.Grant(grant_to) - - abyssal_gaze = new(grant_to) - abyssal_gaze.StartCooldown() - abyssal_gaze.Grant(grant_to) - - dominate = new(grant_to) - dominate.StartCooldown() - dominate.Grant(grant_to) - -/datum/species/golem/runic/on_species_loss(mob/living/carbon/C) - // Aaand cleanup our species specific spells. - // No free rides. - QDEL_NULL(jaunt) - QDEL_NULL(abyssal_gaze) - QDEL_NULL(dominate) - return ..() - -/datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(istype(chem, /datum/reagent/water/holywater)) - H.adjustFireLoss(4 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - - if(chem.type == /datum/reagent/fuel/unholywater) - H.adjustBruteLoss(-4 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.adjustFireLoss(-4 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - -/datum/species/golem/cloth - name = "\improper Cloth Golem" - id = SPECIES_GOLEM_CLOTH - 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 - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_RESISTCOLD, - TRAIT_NOBREATH, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_LITERATE, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_CHUNKYFINGERS, - ) - inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - armor = 15 //feels no pain, but not too resistant - burnmod = 2 // don't get burned - speedmod = 1 // not as heavy as stone - prefix = "Cloth" - special_names = null - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cloth, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cloth, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cloth, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cloth, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cloth, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cloth, - ) - -/datum/species/golem/cloth/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) - -/datum/species/golem/cloth/on_species_loss(mob/living/carbon/C) - REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT) - ..() - -/datum/species/golem/cloth/check_roundstart_eligible() - if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) - return TRUE - return ..() - -/datum/species/golem/cloth/random_name(gender,unique,lastname) - var/pharaoh_name = pick("Neferkare", "Hudjefa", "Khufu", "Mentuhotep", "Ahmose", "Amenhotep", "Thutmose", "Hatshepsut", "Tutankhamun", "Ramses", "Seti", \ - "Merenptah", "Djer", "Semerkhet", "Nynetjer", "Khafre", "Pepi", "Intef", "Ay") //yes, Ay was an actual pharaoh - var/golem_name = "[pharaoh_name] \Roman[rand(1,99)]" - return golem_name - -/datum/species/golem/cloth/spec_life(mob/living/carbon/human/H) - if(H.fire_stacks < 1) - H.adjust_fire_stacks(1) //always prone to burning - ..() - -/datum/species/golem/cloth/spec_death(gibbed, mob/living/carbon/human/H) - if(gibbed) - return - if(H.on_fire) - H.visible_message(span_danger("[H] burns into ash!")) - H.dust(just_ash = TRUE) - return - - H.visible_message(span_danger("[H] falls apart into a pile of bandages!")) - new /obj/structure/cloth_pile(get_turf(H), H) - ..() - -/datum/species/golem/cloth/get_species_description() - return "A wrapped up Mummy! They descend upon Space Station Thirteen every year to spook the crew! \"Return the slab!\"" - -/datum/species/golem/cloth/get_species_lore() - return list( - "Mummies are very self conscious. They're shaped weird, they walk slow, and worst of all, \ - they're considered the laziest halloween costume. But that's not even true, they say.", - - "Making a mummy costume may be easy, but making a CONVINCING mummy costume requires \ - things like proper fabric and purposeful staining to achieve the look. Which is FAR from easy. Gosh.", - ) - -// Calls parent, as Golems have a species-wide perk we care about. -/datum/species/golem/cloth/create_pref_unique_perks() - var/list/to_add = ..() - - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "recycle", - SPECIES_PERK_NAME = "Reformation", - SPECIES_PERK_DESC = "A boon quite similar to Ethereals, Mummies collapse into \ - a pile of bandages after they die. If left alone, they will reform back \ - into themselves. The bandages themselves are very vulnerable to fire.", - )) - - return to_add - -// Override to add a perk elaborating on just how dangerous fire is. -/datum/species/golem/cloth/create_pref_temperature_perks() - var/list/to_add = list() - - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "fire-alt", - SPECIES_PERK_NAME = "Incredibly Flammable", - SPECIES_PERK_DESC = "Mummies are made entirely of cloth, which makes them \ - very vulnerable to fire. They will not reform if they die while on \ - fire, and they will easily catch alight. If your bandages burn to ash, you're toast!", - )) - - return to_add - -/obj/structure/cloth_pile - 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) - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "pile_bandages" - resistance_flags = FLAMMABLE - - var/revive_time = 900 - var/mob/living/carbon/human/cloth_golem - -/obj/structure/cloth_pile/Initialize(mapload, mob/living/carbon/human/H) - . = ..() - if(!QDELETED(H) && is_species(H, /datum/species/golem/cloth)) - H.unequip_everything() - H.forceMove(src) - cloth_golem = H - to_chat(cloth_golem, span_notice("You start gathering your life energy, preparing to rise again...")) - addtimer(CALLBACK(src, PROC_REF(revive)), revive_time) - else - return INITIALIZE_HINT_QDEL - -/obj/structure/cloth_pile/Destroy() - if(cloth_golem) - QDEL_NULL(cloth_golem) - return ..() - -/obj/structure/cloth_pile/burn() - visible_message(span_danger("[src] burns into ash!")) - new /obj/effect/decal/cleanable/ash(get_turf(src)) - ..() - -/obj/structure/cloth_pile/proc/revive(full_heal = FALSE, admin_revive = FALSE) - if(QDELETED(src) || QDELETED(cloth_golem)) //QDELETED also checks for null, so if no cloth golem is set this won't runtime - return - if(cloth_golem.suiciding) - QDEL_NULL(cloth_golem) - return - - invisibility = INVISIBILITY_MAXIMUM //disappear before the animation - new /obj/effect/temp_visual/mummy_animation(get_turf(src)) - if(cloth_golem.revive(full_heal = TRUE, admin_revive = TRUE)) - cloth_golem.grab_ghost() //won't pull if it's a suicide - sleep(20) - cloth_golem.forceMove(get_turf(src)) - cloth_golem.visible_message(span_danger("[src] rises and reforms into [cloth_golem]!"),span_userdanger("You reform into yourself!")) - cloth_golem = null - qdel(src) - -/obj/structure/cloth_pile/attackby(obj/item/P, mob/living/carbon/human/user, params) - . = ..() - - if(resistance_flags & ON_FIRE) - return - - if(P.get_temperature()) - visible_message(span_danger("[src] bursts into flames!")) - fire_act() - -/datum/species/golem/plastic - name = "\improper Plastic Golem" - id = SPECIES_GOLEM_PLASTIC - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_VENTCRAWLER_NUDE, - ) - prefix = "Plastic" - special_names = list("Sheet", "Bag", "Bottle") - fixed_mut_color = "#fffa" - info_text = "As a Plastic Golem, you are capable of ventcrawling and passing through plastic flaps as long as you are naked." - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/bronze - name = "\improper Bronze Golem" - id = SPECIES_GOLEM_BRONZE - prefix = "Bronze" - special_names = list("Bell") - fixed_mut_color = "#cd7f32" - info_text = "As a Bronze Golem, you are very resistant to loud noises, and make loud noises if something hard hits you, however this ability does hurt your hearing." - special_step_sounds = list('sound/machines/clockcult/integration_cog_install.ogg', 'sound/magic/clockwork/fellowship_armory.ogg' ) - mutantears = /obj/item/organ/ears/bronze - examine_limb_id = SPECIES_GOLEM - var/last_gong_time = 0 - var/gong_cooldown = 150 - -/datum/species/golem/bronze/bullet_act(obj/projectile/P, mob/living/carbon/human/H) - if(!(world.time > last_gong_time + gong_cooldown)) - return ..() - if(P.armor_flag == BULLET || P.armor_flag == BOMB) - gong(H) - return ..() - -/datum/species/golem/bronze/spec_hitby(atom/movable/AM, mob/living/carbon/human/H) - ..() - if(world.time > last_gong_time + gong_cooldown) - gong(H) - -/datum/species/golem/bronze/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style) - ..() - if(world.time > last_gong_time + gong_cooldown && M.combat_mode) - gong(H) - -/datum/species/golem/bronze/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) - ..() - if(world.time > last_gong_time + gong_cooldown) - gong(H) - -/datum/species/golem/bronze/on_hit(obj/projectile/P, mob/living/carbon/human/H) - ..() - if(world.time > last_gong_time + gong_cooldown) - gong(H) - -/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)) - if(M.stat == DEAD) //F - continue - if(M == H) - H.show_message(span_narsiesmall("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.adjust_timed_status_effect(14 SECONDS, /datum/status_effect/jitter) - var/distance = max(0,get_dist(get_turf(H),get_turf(M))) - switch(distance) - if(0 to 1) - M.show_message(span_narsiesmall("GONG!"), MSG_AUDIBLE) - M.playsound_local(H, 'sound/effects/gong.ogg', 100, TRUE) - M.soundbang_act(1, 0, 30, 3) - M.adjust_timed_status_effect(10 SECONDS, /datum/status_effect/confusion) - M.adjust_timed_status_effect(8 SECONDS, /datum/status_effect/jitter) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) - if(2 to 3) - M.show_message(span_cult("GONG!"), MSG_AUDIBLE) - M.playsound_local(H, 'sound/effects/gong.ogg', 75, TRUE) - M.soundbang_act(1, 0, 15, 2) - M.adjust_timed_status_effect(6 SECONDS, /datum/status_effect/jitter) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "gonged", /datum/mood_event/loud_gong) - else - M.show_message(span_warning("GONG!"), MSG_AUDIBLE) - M.playsound_local(H, 'sound/effects/gong.ogg', 50, TRUE) - - -/datum/species/golem/cardboard //Faster but weaker, can also make new shells on its own - name = "\improper Cardboard Golem" - id = SPECIES_GOLEM_CARDBOARD - 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) - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_NOFLASH, - ) - fixed_mut_color = null - armor = 25 - burnmod = 1.25 - heatmod = 2 - speedmod = 1.5 - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cardboard, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cardboard, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cardboard, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cardboard, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cardboard, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cardboard, - ) - var/last_creation = 0 - var/brother_creation_cooldown = 300 - -/datum/species/golem/cardboard/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H) - . = ..() - if(user != H) - return FALSE //forced reproduction is rape. - if(istype(I, /obj/item/stack/sheet/cardboard)) - var/obj/item/stack/sheet/cardboard/C = I - if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork - return - if(C.amount < 10) - to_chat(H, span_warning("You do not have enough cardboard!")) - return FALSE - to_chat(H, span_notice("You attempt to create a new cardboard brother.")) - if(do_after(user, user, 30)) - if(last_creation + brother_creation_cooldown > world.time) //no cheesing dork - return - if(!C.use(10)) - to_chat(H, span_warning("You do not have enough cardboard!")) - return FALSE - to_chat(H, span_notice("You create a new cardboard golem shell.")) - create_brother(H.loc) - -/datum/species/golem/cardboard/proc/create_brother(location) - new /obj/effect/mob_spawn/ghost_role/human/golem/servant(location, /datum/species/golem/cardboard, owner) - last_creation = world.time - -/datum/species/golem/leather - name = "\improper Leather Golem" - id = SPECIES_GOLEM_LEATHER - special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_STRONG_GRABBER, - ) - prefix = "Leather" - fixed_mut_color = "#624a2e" - info_text = "As a Leather Golem, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level." - grab_sound = 'sound/weapons/whipgrab.ogg' - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/durathread - name = "\improper Durathread Golem" - id = SPECIES_GOLEM_DURATHREAD - prefix = "Durathread" - special_names = list("Boll","Weave") - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) - fixed_mut_color = null - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_NOFLASH, - ) - 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." - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/durathread, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/durathread, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/durathread, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/durathread, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/durathread, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/durathread, - ) - -/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target) - . = ..() - target.apply_status_effect(/datum/status_effect/strandling) - -/datum/species/golem/bone - name = "\improper Bone Golem" - id = SPECIES_GOLEM_BONE - say_mod = "rattles" - prefix = "Bone" - special_names = list("Head", "Broth", "Fracture", "Rattler", "Appetit") - liked_food = GROSS | MEAT | RAW - toxic_food = null - species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES,HAS_BONE) - inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/tongue/bone - mutantstomach = /obj/item/organ/stomach/bone - sexes = FALSE - fixed_mut_color = null - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOFLASH, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_NOFIRE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - TRAIT_FAKEDEATH, - ) - species_language_holder = /datum/language_holder/golem/bone - info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice." - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/bone, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/bone, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/bone, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/bone, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/bone, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/bone, - ) - var/datum/action/innate/bonechill/bonechill - -/datum/species/golem/bone/on_species_gain(mob/living/carbon/C, datum/species/old_species) - ..() - if(ishuman(C)) - bonechill = new - bonechill.Grant(C) - -/datum/species/golem/bone/on_species_loss(mob/living/carbon/C) - if(bonechill) - bonechill.Remove(C) - ..() - -/datum/species/golem/bone/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(chem.type == /datum/reagent/toxin/bonehurtingjuice) - H.stamina.adjust(-7.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - H.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - if(DT_PROB(10, delta_time)) - switch(rand(1, 3)) - if(1) - H.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) - if(2) - H.manual_emote(pick("oofs silently.", "looks like [H.p_their()] bones hurt.", "grimaces, as though [H.p_their()] bones hurt.")) - if(3) - to_chat(H, span_warning("Your bones hurt!")) - if(chem.overdosed) - if(DT_PROB(2, delta_time) && iscarbon(H)) //big oof - var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. - var/obj/item/bodypart/bp = H.get_bodypart(selected_part) //We're so sorry skeletons, you're so misunderstood - if(bp) - playsound(H, get_sfx(SFX_DESECRATION), 50, TRUE, -1) //You just want to socialize - H.visible_message(span_warning("[H] rattles loudly and flails around!!"), span_danger("Your bones hurt so much that your missing muscles spasm!!")) - H.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice) - bp.receive_damage(200, 0, 0) //But I don't think we should - else - to_chat(H, span_warning("Your missing arm aches from wherever you left it.")) - H.emote("sigh") - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * delta_time) - return TRUE - -/datum/action/innate/bonechill - name = "Bone Chill" - desc = "Rattle your bones and strike fear into your enemies!" - check_flags = AB_CHECK_CONSCIOUS - button_icon = 'icons/mob/actions/actions_spells.dmi' - button_icon_state = "bonechill" - var/cooldown = 600 - var/last_use - var/snas_chance = 3 - -/datum/action/innate/bonechill/Activate() - if(world.time < last_use + cooldown) - to_chat(owner, span_warning("You aren't ready yet to rattle your bones again!")) - return - owner.visible_message(span_warning("[owner] rattles [owner.p_their()] bones harrowingly."), span_notice("You rattle your bones")) - last_use = world.time - if(prob(snas_chance)) - playsound(get_turf(owner),'sound/magic/RATTLEMEBONES2.ogg', 100) - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - var/mutable_appearance/badtime = mutable_appearance('icons/mob/human_parts.dmi', "b_golem_eyes", -FIRE_LAYER-0.5) - badtime.appearance_flags = RESET_COLOR - H.overlays_standing[FIRE_LAYER+0.5] = badtime - H.apply_overlay(FIRE_LAYER+0.5) - addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon, remove_overlay), FIRE_LAYER+0.5), 25) - else - playsound(get_turf(owner),'sound/magic/RATTLEMEBONES.ogg', 100) - for(var/mob/living/L in orange(7, get_turf(owner))) - if((L.mob_biotypes & MOB_UNDEAD) || isgolem(L) || HAS_TRAIT(L, TRAIT_RESISTCOLD)) - continue //Do not affect our brothers - - to_chat(L, span_cultlarge("A spine-chilling sound chills you to the bone!")) - L.apply_status_effect(/datum/status_effect/bonechill) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "spooked", /datum/mood_event/spooked) - -/datum/species/golem/snow - name = "\improper Snow Golem" - id = SPECIES_GOLEM_SNOW - fixed_mut_color = null //custom sprites - armor = 45 //down from 55 - burnmod = 3 //melts easily - 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 - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_RESISTCOLD, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_CHUNKYFINGERS, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_PIERCEIMMUNE, - TRAIT_NODISMEMBER, - ) - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/snow, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/snow, - BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/snow, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/snow, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/snow, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/snow, - ) - - /// A ref to our "throw snowball" spell we get on species gain. - var/datum/action/cooldown/spell/conjure_item/snowball/snowball - /// A ref to our cryobeam spell we get on species gain. - var/datum/action/cooldown/spell/pointed/projectile/cryo/cryo - -/datum/species/golem/snow/spec_death(gibbed, mob/living/carbon/human/H) - H.visible_message(span_danger("[H] turns into a pile of snow!")) - for(var/obj/item/W in H) - H.dropItemToGround(W) - for(var/i in 1 to rand(3,5)) - new /obj/item/stack/sheet/mineral/snow(get_turf(H)) - new /obj/item/food/grown/carrot(get_turf(H)) - qdel(H) - -/datum/species/golem/snow/on_species_gain(mob/living/carbon/grant_to, datum/species/old_species) - . = ..() - ADD_TRAIT(grant_to, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) - - snowball = new(grant_to) - snowball.StartCooldown() - snowball.Grant(grant_to) - - cryo = new(grant_to) - cryo.StartCooldown() - cryo.Grant(grant_to) - -/datum/species/golem/snow/on_species_loss(mob/living/carbon/remove_from) - REMOVE_TRAIT(remove_from, TRAIT_SNOWSTORM_IMMUNE, SPECIES_TRAIT) - QDEL_NULL(snowball) - QDEL_NULL(cryo) - return ..() - -/datum/species/golem/mhydrogen - name = "\improper Metallic Hydrogen Golem" - id = SPECIES_GOLEM_HYDROGEN - fixed_mut_color = "#dddddd" - info_text = "As a Metallic Hydrogen Golem, you were forged in the highest pressures and the highest heats. Your unique mineral makeup makes you immune to most types of damages." - prefix = "Metallic Hydrogen" - special_names = null - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOFLASH, - TRAIT_RESISTHEAT, - TRAIT_NOBREATH, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_NOFIRE, - TRAIT_RADIMMUNE, - TRAIT_GENELESS, - TRAIT_NODISMEMBER, - TRAIT_CHUNKYFINGERS, - ) - examine_limb_id = SPECIES_GOLEM - -/datum/species/golem/mhydrogen/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - ADD_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT) - -/datum/species/golem/mhydrogen/on_species_loss(mob/living/carbon/C) - REMOVE_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT) - return ..() 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 39e150239a73..9fd3e28de33e 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -2,7 +2,7 @@ name = "\improper Human" id = SPECIES_HUMAN default_color = "FFFFFF" - species_traits = list(EYECOLOR, HAIR, FACEHAIR, LIPS, HAS_FLESH, HAS_BONE, BODY_RESIZABLE, HAIRCOLOR, FACEHAIRCOLOR) + species_traits = list(EYECOLOR, HAIR, FACEHAIR, LIPS, BODY_RESIZABLE, HAIRCOLOR, FACEHAIRCOLOR) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -14,7 +14,6 @@ disliked_food = GROSS | RAW | CLOTH liked_food = JUNKFOOD | FRIED changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - payday_modifier = 1 job_outfit_type = SPECIES_HUMAN /datum/species/human/prepare_human_for_preview(mob/living/carbon/human/human) @@ -46,24 +45,39 @@ In hypercorporation territory company policy is law, giving new meaning to \"employee termination\".", ) -/datum/species/human/create_pref_unique_perks() - var/list/to_add = list() +/datum/species/human/get_agony_sound(mob/living/carbon/human) + if(human.gender == MALE) + return pick( + 'sound/voice/human/agony/male_scream_pain1.ogg', + 'sound/voice/human/agony/male_scream_pain2.ogg', + 'sound/voice/human/agony/male_scream_pain3.ogg', + ) - if(CONFIG_GET(number/default_laws) == 0) // Default lawset is set to Asimov - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "robot", - SPECIES_PERK_NAME = "Asimov Superiority", - SPECIES_PERK_DESC = "The AI and their cyborgs are, by default, subservient only \ - to humans. As a human, silicons are required to both protect and obey you.", - )) + return pick( + 'sound/voice/human/agony/fem_scream_pain1.ogg', + 'sound/voice/human/agony/fem_scream_pain2.ogg', + 'sound/voice/human/agony/fem_scream_pain3.ogg', + 'sound/voice/human/agony/fem_scream_pain4.ogg', + 'sound/voice/human/agony/fem_scream_pain5.ogg', + 'sound/voice/human/agony/fem_scream_pain6.ogg', + 'sound/voice/human/agony/fem_scream_pain7.ogg', + 'sound/voice/human/agony/fem_scream_pain8.ogg', + ) - if(CONFIG_GET(flag/enforce_human_authority)) - to_add += list(list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "bullhorn", - SPECIES_PERK_NAME = "Chain of Command", - SPECIES_PERK_DESC = "Nanotrasen only recognizes humans for command roles, such as Captain.", - )) +/datum/species/human/get_pain_sound(mob/living/carbon/human) + if(human.gender == MALE) + return pick( + 'sound/voice/human/wounded/male_moan_1.ogg', + 'sound/voice/human/wounded/male_moan_2.ogg', + 'sound/voice/human/wounded/male_moan_3.ogg', + 'sound/voice/human/wounded/male_moan_4.ogg', + 'sound/voice/human/wounded/male_moan_5.ogg', + ) - return to_add + return pick( + 'sound/voice/human/wounded/female_moan_wounded1.ogg', + 'sound/voice/human/wounded/female_moan_wounded2.ogg', + 'sound/voice/human/wounded/female_moan_wounded3.ogg', + 'sound/voice/human/wounded/female_moan_wounded4.ogg', + 'sound/voice/human/wounded/female_moan_wounded5.ogg', + ) diff --git a/code/modules/mob/living/carbon/human/species_types/ipc.dm b/code/modules/mob/living/carbon/human/species_types/ipc.dm new file mode 100644 index 000000000000..ca7f18cfe3b0 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species_types/ipc.dm @@ -0,0 +1,114 @@ +/datum/species/ipc + name = "Integrated Positronic Chassis" + id = SPECIES_IPC + + species_traits = list(NOEYESPRITES, NOBLOOD, NOZOMBIE, NO_UNDERWEAR, NO_DNA_COPY, NOTRANSSTING, AGENDER, BRANDEDPROSTHETICS) + inherent_traits = list( + TRAIT_GENELESS, + TRAIT_RADIMMUNE, + TRAIT_CAN_STRIP, + TRAIT_ADVANCEDTOOLUSER, + TRAIT_RESISTHIGHPRESSURE, + TRAIT_RESISTLOWPRESSURE, + TRAIT_NOBREATH, + TRAIT_NOHUNGER, + TRAIT_NOEARS, + TRAIT_NOMETABOLISM, + TRAIT_RESISTLOWPRESSURE, + TRAIT_NO_PAINSHOCK, + TRAIT_NOSOFTCRIT, + TRAIT_LIMBATTACHMENT, + TRAIT_NO_ADDICTION, + ) + inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID + + job_outfit_type = SPECIES_HUMAN + + species_language_holder = /datum/language_holder/ipc + + organs = list( + ORGAN_SLOT_POSIBRAIN = /obj/item/organ/posibrain/ipc, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/robot, + ORGAN_SLOT_CELL = /obj/item/organ/cell, + ) + + cosmetic_organs = list( + /obj/item/organ/ipc_screen = "console", + /obj/item/organ/ipc_antenna = "None", + ) + + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/ipc, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/ipc, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/ipc, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/ipc, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/ipc, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/ipc, + ) + meat = /obj/item/stack/sheet/plasteel{amount = 5} + skinned_type = /obj/item/stack/sheet/iron{amount = 10} + + robotic_bodyparts = null + + cold_level_1 = 50 + cold_level_2 = -1 + cold_level_3 = -1 + + heat_level_1 = 500 // Gives them about 25 seconds in space before taking damage + heat_level_2 = 1000 + heat_level_3 = 2000 + + heat_discomfort_level = 373.15 + heat_discomfort_strings = list( + "Your CPU temperature probes warn you that you are approaching critical heat levels!" + ) + + special_step_sounds = list('sound/effects/servostep.ogg') + + changesource_flags = NONE + +/datum/species/ipc/saurian + name = "Integrated Positronic Chassis (Jinan)" + id = SPECIES_SAURIAN + species_traits = list(NOEYESPRITES, MUTCOLORS, NOBLOOD, NOZOMBIE, NO_UNDERWEAR, NO_DNA_COPY, NOTRANSSTING, AGENDER, EYECOLOR) + cosmetic_organs = list( + /obj/item/organ/saurian_screen = "basic", + /obj/item/organ/saurian_tail = "basic", + /obj/item/organ/saurian_scutes = "default", + /obj/item/organ/saurian_antenna = "default" + ) + + examine_limb_id = SPECIES_IPC + + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/robot/ipc/saurian, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot/ipc/saurian, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/ipc/saurian, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/ipc/saurian, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/ipc/saurian, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot/ipc/saurian, + ) + +/datum/species/ipc/spec_life(mob/living/carbon/human/H, delta_time, times_fired) + . = ..() + if(H.stat == UNCONSCIOUS && prob(2) && H.undergoing_cardiac_arrest()) + H.visible_message("[H] [pick("emits low pitched whirr","beeps urgently")]") + +/datum/species/ipc/get_cryogenic_factor(bodytemperature) + return 0 + +/datum/species/ipc/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired) + humi.adjust_coretemperature(5, 0, 500) + +/datum/species/ipc/spec_death(gibbed, mob/living/carbon/human/H) + if(gibbed) + return + + var/obj/item/organ/ipc_screen/screen = H.getorganslot(ORGAN_SLOT_EXTERNAL_IPC_SCREEN) + if(!screen) + return + screen.set_sprite("None") + +/datum/species/ipc/get_deathgasp_sound() + return 'sound/voice/borg_deathsound.ogg' 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 e2b8a056f924..4332ef07f723 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -11,7 +11,6 @@ TRAIT_CAN_STRIP, TRAIT_TOXINLOVER, ) - mutantlungs = /obj/item/organ/lungs/slime meat = /obj/item/food/meat/slab/human/mutant/slime exotic_blood = /datum/reagent/toxin/slimejelly var/datum/action/innate/regenerate_limbs/regenerate_limbs @@ -20,7 +19,6 @@ coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage burnmod = 0.5 // = 1/2x generic burn damage - payday_modifier = 0.75 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 @@ -35,6 +33,18 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/slime, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ) + /datum/species/jelly/on_species_loss(mob/living/carbon/old_jellyperson) if(regenerate_limbs) regenerate_limbs.Remove(old_jellyperson) @@ -175,7 +185,8 @@ bodies -= C // This means that the other bodies maintain a link // so if someone mindswapped into them, they'd still be shared. bodies = null - C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL) + if(C.blood_volume < BLOOD_VOLUME_NORMAL) + C.setBloodVolume(BLOOD_VOLUME_NORMAL) ..() /datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species) @@ -269,8 +280,7 @@ H.dna.transfer_identity(spare, transfer_SE=1) spare.dna.mutant_colors = random_mutant_colors() spare.dna.update_uf_block(DNA_MUTANT_COLOR_BLOCK) - spare.real_name = spare.dna.real_name - spare.name = spare.dna.real_name + spare.set_real_name(spare.dna.real_name) spare.updateappearance(mutcolor_update=1) spare.domutcheck() spare.Move(get_step(H.loc, pick(NORTH,SOUTH,EAST,WEST))) @@ -284,7 +294,7 @@ var/datum/species/jelly/slime/spare_datum = spare.dna.species spare_datum.bodies = origin_datum.bodies - H.transfer_trait_datums(spare) + H.transfer_quirk_datums(spare) H.mind.transfer_to(spare) spare.visible_message("[H] distorts as a new body \ \"steps out\" of [H.p_them()].", @@ -340,7 +350,7 @@ switch(body.stat) if(CONSCIOUS) stat = "Conscious" - if(SOFT_CRIT to HARD_CRIT) // Also includes UNCONSCIOUS + if(UNCONSCIOUS) stat = "Unconscious" if(DEAD) stat = "Dead" @@ -429,7 +439,7 @@ span_notice("You stop moving this body...")) else to_chat(M.current, span_notice("You abandon this body...")) - M.current.transfer_trait_datums(dupe) + M.current.transfer_quirk_datums(dupe) M.transfer_to(dupe) dupe.visible_message("[dupe] blinks and looks \ around.", @@ -508,7 +518,7 @@ name = "luminescent glow" desc = "Tell a coder if you're seeing this." icon_state = "nothing" - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = LUMINESCENT_DEFAULT_GLOW light_power = 2.5 light_color = COLOR_WHITE @@ -735,11 +745,13 @@ return TRUE /datum/action/innate/link_minds/Activate() - if(!isliving(owner.pulling) || owner.grab_state < GRAB_AGGRESSIVE) + var/mob/living/L = owner + var/obj/item/hand_item/grab/G = L.get_active_grab() + if(!isliving(G?.affecting) || G.current_grab.damage_stage < GRAB_AGGRESSIVE) to_chat(owner, span_warning("You need to aggressively grab someone to link minds!")) return - var/mob/living/living_target = owner.pulling + var/mob/living/living_target = G.affecting if(living_target.stat == DEAD) to_chat(owner, span_warning("They're dead!")) return @@ -768,11 +780,9 @@ /datum/action/innate/link_minds/proc/while_link_callback(mob/living/linkee) if(!is_species(owner, req_species)) return FALSE - if(!owner.pulling) - return FALSE - if(owner.pulling != linkee) - return FALSE - if(owner.grab_state < GRAB_AGGRESSIVE) + var/mob/living/L = owner + var/obj/item/hand_item/grab/G = L.is_grabbing(linkee) + if(!G || G.current_grab.damage_stage < GRAB_AGGRESSIVE) return FALSE if(linkee.stat == DEAD) return FALSE 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 cd52b31a8451..40bf31e7ba04 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,11 +1,11 @@ /datum/species/lizard // Reptilian humanoids with scaled skin and tails. - name = "\improper Unathi" - plural_form = "Unathi" + name = "\improper Jinan" + plural_form = "Jinans" id = SPECIES_LIZARD say_mod = "hisses" default_color = COLOR_VIBRANT_LIME - species_traits = list(MUTCOLORS, EYECOLOR, LIPS, HAS_FLESH, HAS_BONE, BODY_RESIZABLE, SCLERA) + species_traits = list(MUTCOLORS, EYECOLOR, LIPS, BODY_RESIZABLE, SCLERA) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -20,28 +20,44 @@ /obj/item/organ/spines = "None", /obj/item/organ/tail/lizard = "Smooth", ) - mutanttongue = /obj/item/organ/tongue/lizard + coldmod = 1.5 heatmod = 0.67 - payday_modifier = 0.75 job_outfit_type = SPECIES_HUMAN changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT species_cookie = /obj/item/food/meat/slab meat = /obj/item/food/meat/slab/human/mutant/lizard skinned_type = /obj/item/stack/sheet/animalhide/lizard - exotic_bloodtype = "L" + disliked_food = GRAIN | DAIRY | CLOTH liked_food = GROSS | MEAT | SEAFOOD | NUTS inert_mutation = /datum/mutation/human/firebreath - deathsound = 'sound/voice/lizard/deathsound.ogg' wings_icons = list("Dragon") species_language_holder = /datum/language_holder/lizard digitigrade_customization = DIGITIGRADE_OPTIONAL // Lizards are coldblooded and can stand a greater temperature range than humans - bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT + 20) // This puts lizards 10 above lavaland max heat for ash lizards. - bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 10) + cold_level_3 = 130 + cold_level_2 = 220 + cold_level_1 = 280 + + bodytemp_normal = BODYTEMP_NORMAL - 10 + + heat_level_1 = 420 + heat_level_2 = 480 + heat_level_3 = 1100 + heat_discomfort_strings = list( + "You feel soothingly warm.", + "You feel the heat sink into your bones.", + "You feel warm enough to take a nap." + ) + + cold_discomfort_strings = list( + "You feel chilly.", + "You feel sluggish and cold.", + "Your scales bristle against the cold." + ) ass_image = 'icons/ass/asslizard.png' bodypart_overrides = list( @@ -53,6 +69,38 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/lizard, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/lizard, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys + ) + + + pain_emotes = list( + list( + "groans in pain." = 1, + "hisses in pain." = 1 + ) = (PAIN_AMT_LOW + 10), + list( + "screams in pain!" = 1, + ) = (PAIN_AMT_MEDIUM + 10), + list( + "me wheezes in pain!" = 1, + "me bellows in pain!" = 1, + "me howls in pain!" = 1 + ) = PAIN_AMT_AGONIZING + ) + +/datum/species/lizard/get_deathgasp_sound(mob/living/carbon/human/H) + return 'sound/voice/lizard/deathsound.ogg' + /// Lizards are cold blooded and do not stabilize body temperature naturally /datum/species/lizard/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired) return @@ -82,28 +130,32 @@ ) /datum/species/lizard/get_species_description() - return "The militaristic Lizardpeople hail originally from Tizira, but have grown \ - throughout their centuries in the stars to possess a large spacefaring \ - empire: though now they must contend with their younger, more \ - technologically advanced Human neighbours." + return {" + The peaceful Jinan people originate from the planet Jitarai. + They are adept with robotics and artifical intelligence, + which is how their governing body came to be an AI known as Companion. + "} /datum/species/lizard/get_species_lore() return list( "The face of conspiracy theory was changed forever the day mankind met the lizards.", - "Hailing from the arid world of Tizira, lizards were travelling the stars back when mankind was first discovering how neat trains could be. \ - However, much like the space-fable of the space-tortoise and space-hare, lizards have rejected their kin's motto of \"slow and steady\" \ - in favor of resting on their laurels and getting completely surpassed by 'bald apes', due in no small part to their lack of access to plasma.", - - "The history between lizards and humans has resulted in many conflicts that lizards ended on the losing side of, \ - with the finale being an explosive remodeling of their moon. Today's lizard-human relations are seeing the continuance of a record period of peace.", - - "Lizard culture is inherently militaristic, though the influence the military has on lizard culture \ - begins to lessen the further colonies lie from their homeworld - \ - with some distanced colonies finding themselves subsumed by the cultural practices of other species nearby.", - - "On their homeworld, lizards celebrate their 16th birthday by enrolling in a mandatory 5 year military tour of duty. \ - Roles range from combat to civil service and everything in between. As the old slogan goes: \"Your place will be found!\"", + "Jinans are a species of intelligent humanoid reptiles from the planet Jitarai. They are most known for \ + their innovation in the field of robotics, at the time of first contact, they were over one hundred years \ + ahead of Humanity. Jitarai has one governing body, a century year old artificial intelligence known as Companion. \ + Developed by the Old Jinar (Great Ones) to lead their people to greatness, Companion succeeded it's goal \ + and united the planet under one government. Despite the success of the Companion project, some of the Jinan people \ + have a distrust in their artificial leader. Many seek to leave the planet as soon as they acquire means, be it out of fear \ + or disgust that their people are controlled by a machine. The way the government operates is not fully known, \ + with some outsiders theorizing there is a Jinan council that maintains Companion.", + + "The Jinan people created and popularized the Integrated Positronic Chassis (IPC), a fully autonomous robot capable \ + of performing the same tasks as a normal person. Their primary export is robotics equipment, industrial equipment, and positronic brains. \ + Many companies from Earth have created their own versions of IPCs, and sell them on the market with middling success.", + + "Jinans were the first species to be discovered by Humanity, with their probe having crash landed onto Mercury in 1953, \ + sparking the Space Race. Eventually, contact was made by the United States, and a positive relationship quickly \ + developed between the two peoples. ", ) // Override for the default temperature perks, so we can give our specific "cold blooded" perk. @@ -114,89 +166,12 @@ SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, SPECIES_PERK_ICON = "thermometer-empty", SPECIES_PERK_NAME = "Cold-blooded", - SPECIES_PERK_DESC = "Unathi have higher tolerance for hot temperatures, but lower \ + SPECIES_PERK_DESC = "Jinans have higher tolerance for hot temperatures, but lower \ tolerance for cold temperatures. Additionally, they cannot self-regulate their body temperature - \ they are as cold or as warm as the environment around them is. Stay warm!", )) return to_add -/* -Lizard subspecies: ASHWALKERS -*/ -/datum/species/lizard/ashwalker - name = "\improper Ash Walker" - id = SPECIES_LIZARD_ASH - species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAS_FLESH,HAS_BONE) - mutantlungs = /obj/item/organ/lungs/ashwalker - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_CHUNKYFINGERS, - TRAIT_VIRUSIMMUNE, - ) - species_language_holder = /datum/language_holder/lizard/ash - digitigrade_customization = DIGITIGRADE_FORCED - examine_limb_id = SPECIES_LIZARD - bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/lizard, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/lizard/ashwalker, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/lizard/ashwalker, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/lizard, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/lizard, - ) - -/* -Lizard subspecies: SILVER SCALED -*/ -/datum/species/lizard/silverscale - name = "\improper Silver Scale" - id = SPECIES_LIZARD_SILVER - inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_HOLY, - TRAIT_NOBREATH, - TRAIT_RESISTHIGHPRESSURE, - TRAIT_RESISTLOWPRESSURE, - TRAIT_PIERCEIMMUNE, - TRAIT_VIRUSIMMUNE, - TRAIT_WINE_TASTER, - ) - species_language_holder = /datum/language_holder/lizard/silver - mutanttongue = /obj/item/organ/tongue/lizard/silver - armor = 10 //very light silvery scales soften blows - changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN - examine_limb_id = SPECIES_LIZARD - ///stored mutcolor for when we turn back off of a silverscale. - var/old_mutcolor - ///stored eye color for when we turn back off of a silverscale. - var/old_eye_color_left - ///See above - var/old_eye_color_right - -/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/C, datum/species/old_species) - var/mob/living/carbon/human/new_silverscale = C - old_mutcolor = C.dna.mutant_colors[MUTCOLORS_GENERIC_1] - old_eye_color_left = new_silverscale.eye_color_left - old_eye_color_right = new_silverscale.eye_color_right - new_silverscale.dna.mutant_colors[MUTCOLORS_GENERIC_1] = "#eeeeee" - new_silverscale.eye_color_left = "#0000a0" - new_silverscale.eye_color_right = "#0000a0" - ..() - new_silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2)) - -/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/C) - var/mob/living/carbon/human/was_silverscale = C - was_silverscale.dna.mutant_colors[MUTCOLORS_GENERIC_1] = old_mutcolor - was_silverscale.eye_color_left = old_eye_color_left - was_silverscale.eye_color_right = old_eye_color_right - - was_silverscale.remove_filter("silver_glint") - ..() - -/datum/species/lizard/prepare_human_for_preview(mob/living/carbon/human/human) - human.dna.mutant_colors[MUTCOLORS_GENERIC_1] = "#f8f2a4" - human.update_body(TRUE) +/datum/species/lizard/get_random_blood_type() + return GET_BLOOD_REF(/datum/blood/lizard) diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm index 9c5e7b9939a7..b4b83487f31c 100644 --- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm +++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm @@ -11,8 +11,6 @@ meat = /obj/item/food/meat/slab/monkey knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1) species_traits = list( - HAS_FLESH, - HAS_BONE, NO_UNDERWEAR, LIPS, NOEYESPRITES, @@ -52,10 +50,6 @@ dust_anim = "dust-m" gib_anim = "gibbed-m" - payday_modifier = 1.5 - - - /datum/species/monkey/random_name(gender,unique,lastname) var/randname = "monkey ([rand(1,999)])" @@ -67,7 +61,7 @@ H.butcher_results = knife_butcher_results H.dna.add_mutation(/datum/mutation/human/race, MUT_NORMAL) H.dna.activate_mutation(/datum/mutation/human/race) - + H.AddElement(/datum/element/human_biter) /datum/species/monkey/on_species_loss(mob/living/carbon/C) . = ..() @@ -75,40 +69,6 @@ C.butcher_results = null C.dna.remove_mutation(/datum/mutation/human/race) -/datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target, modifiers) - . = ..() - if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - if(!iscarbon(target)) - return TRUE - var/mob/living/carbon/victim = target - if(user.is_muzzled()) - return TRUE - var/obj/item/bodypart/affecting = null - if(ishuman(victim)) - var/mob/living/carbon/human/human_victim = victim - affecting = human_victim.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - var/armor = victim.run_armor_check(affecting, MELEE) - if(prob(25)) - victim.visible_message(span_danger("[user]'s bite misses [victim]!"), - span_danger("You avoid [user]'s bite!"), span_hear("You hear jaws snapping shut!"), COMBAT_MESSAGE_RANGE, user) - to_chat(user, span_danger("Your bite misses [victim]!")) - return TRUE - var/obj/item/bodypart/arm/mouth = user.get_bodypart(BODY_ZONE_HEAD) - victim.apply_damage(rand(mouth.unarmed_damage_low, mouth.unarmed_damage_high), BRUTE, affecting, armor) - victim.visible_message(span_danger("[name] bites [victim]!"), - span_userdanger("[name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, name) - to_chat(user, span_danger("You bite [victim]!")) - if(armor >= 2) - return TRUE - for(var/d in user.diseases) - var/datum/disease/bite_infection = d - if(bite_infection.spread_flags & (DISEASE_SPREAD_SPECIAL | DISEASE_SPREAD_NON_CONTAGIOUS)) - continue - victim.ForceContractDisease(bite_infection) - return TRUE - target.attack_paw(user, modifiers) - return TRUE - /datum/species/monkey/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[MONKEYDAY]) return TRUE @@ -158,8 +118,8 @@ list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "capsules", - SPECIES_PERK_NAME = "Mutadone Averse", - SPECIES_PERK_DESC = "Monkeys are reverted into normal humans upon being exposed to Mutadone.", + SPECIES_PERK_NAME = "Ryetalyn Averse", + SPECIES_PERK_DESC = "Monkeys are reverted into normal humans upon being exposed to Ryetalyn.", ), ) 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 61f8eafe1f66..51347a64163f 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -5,7 +5,7 @@ say_mod = "flutters" scream_verb = "buzzes" default_color = "00FF00" - species_traits = list(MUTCOLORS, LIPS, HAS_FLESH, HAS_BONE, HAS_MARKINGS, BODY_RESIZABLE, NONHUMANHAIR) + species_traits = list(MUTCOLORS, LIPS, HAS_MARKINGS, BODY_RESIZABLE, NONHUMANHAIR) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -20,12 +20,11 @@ liked_food = VEGETABLES | DAIRY | CLOTH disliked_food = FRUIT | GROSS toxic_food = MEAT | RAW | SEAFOOD - mutanteyes = /obj/item/organ/eyes/moth + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/moth wings_icons = list("Megamoth", "Mothra") has_innate_wings = TRUE - payday_modifier = 0.75 job_outfit_type = SPECIES_HUMAN family_heirlooms = list(/obj/item/flashlight/lantern/heirloom_moth) @@ -38,11 +37,18 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/moth, ) -/datum/species/moth/regenerate_organs(mob/living/carbon/C, datum/species/old_species, replace_current= TRUE, list/excluded_zones, visual_only) - . = ..() - if(ishuman(C)) - var/mob/living/carbon/human/H = C - handle_mutant_bodyparts(H) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/moth, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) /datum/species/moth/random_name(gender,unique,lastname) if(unique) @@ -55,12 +61,6 @@ return randname -/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(chem.type == /datum/reagent/toxin/pestkiller) - H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - /datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) if(istype(weapon, /obj/item/melee/flyswatter)) return 10 //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 deleted file mode 100644 index a2b71e2b1f06..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ /dev/null @@ -1,68 +0,0 @@ -/datum/species/mush //mush mush codecuck - name = "\improper Mushroomperson" - plural_form = "Mushroompeople" - id = SPECIES_MUSHROOM - mutant_bodyparts = list("caps" = "Round") - changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN - - fixed_mut_color = "#DBBF92" - hair_color = "#FF4B19" //cap color, spot color uses eye color - nojumpsuit = TRUE - - say_mod = "poofs" //what does a mushroom sound like - species_traits = list(MUTCOLORS, NOEYESPRITES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NOBREATH, - TRAIT_NOFLASH, - ) - inherent_factions = list("mushroom") - speedmod = 1.5 //faster than golems but not by much - - no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING) - - burnmod = 1.25 - heatmod = 1.5 - - mutanteyes = /obj/item/organ/eyes/night_vision/mushroom - use_skintones = FALSE - var/datum/martial_art/mushpunch/mush - species_language_holder = /datum/language_holder/mushroom - - bodypart_overrides = list( - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mushroom, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mushroom, - BODY_ZONE_HEAD = /obj/item/bodypart/head/mushroom, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mushroom, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mushroom, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/mushroom, - ) - -/datum/species/mush/check_roundstart_eligible() - return FALSE //hard locked out of roundstart on the order of design lead kor, this can be removed in the future when planetstation is here OR SOMETHING but right now we have a problem with races. - -/datum/species/mush/on_species_gain(mob/living/carbon/C, datum/species/old_species) - . = ..() - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!H.dna.features["caps"]) - H.dna.features["caps"] = "Round" - handle_mutant_bodyparts(H) - mush = new(null) - mush.teach(H) - -/datum/species/mush/on_species_loss(mob/living/carbon/C) - . = ..() - mush.remove(C) - QDEL_NULL(mush) - -/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(chem.type == /datum/reagent/toxin/plantbgone/weedkiller) - H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - -/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/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 84799cef3d45..6a5433aa9297 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -5,7 +5,7 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/stack/sheet/mineral/plasma - species_traits = list(NOBLOOD, NOTRANSSTING, HAS_BONE, BODY_RESIZABLE) + species_traits = list(NOBLOOD, NOTRANSSTING, BODY_RESIZABLE) // plasmemes get hard to wound since they only need a severe bone wound to dismember, but unlike skellies, they can't pop their bones back into place inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, @@ -18,21 +18,17 @@ ) inherent_biotypes = MOB_HUMANOID|MOB_MINERAL - mutantlungs = /obj/item/organ/lungs/plasmaman - mutanttongue = /obj/item/organ/tongue/bone/plasmaman - mutantliver = /obj/item/organ/liver/plasmaman - mutantstomach = /obj/item/organ/stomach/bone/plasmaman + burnmod = 1.5 heatmod = 1.5 brutemod = 1.5 - payday_modifier = 0.75 + breathid = GAS_PLASMA disliked_food = FRUIT | CLOTH liked_food = VEGETABLES changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC species_cookie = /obj/item/reagent_containers/food/condiment/milk outfit_important_for_life = /datum/outfit/plasmaman - species_language_holder = /datum/language_holder/skeleton bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/plasmaman, @@ -43,14 +39,33 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/plasmaman, ) - // Body temperature for Plasmen is much lower human as they can handle colder environments - bodytemp_normal = (BODYTEMP_NORMAL - 40) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = null, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/plasmaman, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/bone/plasmaman, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/bone/plasmaman, + ORGAN_SLOT_APPENDIX = null, + ORGAN_SLOT_LIVER = /obj/item/organ/liver/plasmaman, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + + //* BODY TEMPERATURE THINGS *// + cold_level_3 = 80 + cold_level_2 = 130 + cold_level_1 = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c + cold_discomfort_level = 255 + + bodytemp_normal = BODYTEMP_NORMAL - 40 // The minimum amount they stabilize per tick is reduced making hot areas harder to deal with bodytemp_autorecovery_min = 2 - // They are hurt at hot temps faster as it is harder to hold their form - bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT - 20) // about 40C - // This effects how fast body temp stabilizes, also if cold resit is lost on the mob - bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c + + heat_discomfort_level = 300 + heat_level_1 = (BODYTEMP_HEAT_DAMAGE_LIMIT - 20) // about 40C + heat_level_2 = 400 + heat_level_3 = 1000 ass_image = 'icons/ass/assplasma.png' @@ -123,15 +138,17 @@ equipping.put_in_l_hand(tank) else equipping.put_in_r_hand(tank) - equipping.internal = tank + equipping.open_internals(tank) /datum/species/plasmaman/give_important_for_life(mob/living/carbon/human/human_to_equip) . = ..() - human_to_equip.internal = human_to_equip.get_item_for_held_index(2) - if(!human_to_equip.internal) + var/obj/item/I = human_to_equip.get_item_for_held_index(2) + if(I) + human_to_equip.open_internals(I) + else var/obj/item/tank/internals/plasmaman/belt/new_tank = new(null) if(human_to_equip.equip_to_slot_or_del(new_tank, ITEM_SLOT_BELT)) - human_to_equip.internal = human_to_equip.belt + human_to_equip.open_internals(human_to_equip.belt) else stack_trace("Plasmaman going without internals. Uhoh.") @@ -146,41 +163,6 @@ return randname -/datum/species/plasmaman/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(istype(chem, /datum/reagent/toxin/plasma)) - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * delta_time) - if(prob(10)) - for(var/obj/item/bodypart/BP as anything in H.bodyparts) - BP.heal_bones() - return TRUE - - if(istype(chem, /datum/reagent/toxin/bonehurtingjuice)) - H.stamina.adjust(-7.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - H.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - if(DT_PROB(10, delta_time)) - switch(rand(1, 3)) - if(1) - H.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) - if(2) - H.manual_emote(pick("oofs silently.", "looks like [H.p_their()] bones hurt.", "grimaces, as though [H.p_their()] bones hurt.")) - if(3) - to_chat(H, span_warning("Your bones hurt!")) - if(chem.overdosed) - if(DT_PROB(2, delta_time) && iscarbon(H)) //big oof - var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. - var/obj/item/bodypart/bp = H.get_bodypart(selected_part) //We're so sorry skeletons, you're so misunderstood - if(bp) - playsound(H, get_sfx(SFX_DESECRATION), 50, TRUE, -1) //You just want to socialize - H.visible_message(span_warning("[H] rattles loudly and flails around!!"), span_danger("Your bones hurt so much that your missing muscles spasm!!")) - H.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice) - bp.receive_damage(200, 0, 0) //But I don't think we should - else - to_chat(H, span_warning("Your missing arm aches from wherever you left it.")) - H.emote("sigh") - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * delta_time) - return TRUE - /datum/species/plasmaman/get_species_description() return "Found on the Icemoon of Freyja, plasmamen consist of colonial \ fungal organisms which together form a sentient being. In human space, \ 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 5a561aef43ac..5724b3f70a33 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 @@ plural_form = "Podpeople" id = SPECIES_PODPERSON default_color = "59CE00" - species_traits = list(MUTCOLORS, EYECOLOR, HAS_FLESH, HAS_BONE) + species_traits = list(MUTCOLORS, EYECOLOR) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -18,7 +18,6 @@ burnmod = 1.25 heatmod = 1.5 - payday_modifier = 0.75 job_outfit_type = SPECIES_HUMAN meat = /obj/item/food/meat/slab/human/mutant/plant exotic_blood = /datum/reagent/water @@ -56,12 +55,6 @@ H.take_overall_damage(1 * delta_time, 0) ..() -/datum/species/pod/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(chem.type == /datum/reagent/toxin/plantbgone) - H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - /datum/species/pod/randomize_main_appearance_element(mob/living/carbon/human/human_mob) var/hairstyle = pick(GLOB.pod_hair_list) human_mob.dna.features["pod_hair"] = hairstyle 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 01b8d009959b..77e25cd2f6f5 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -15,7 +15,6 @@ ) inherent_factions = list("faithless") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC - mutanteyes = /obj/item/organ/eyes/night_vision species_language_holder = /datum/language_holder/shadowpeople bodypart_overrides = list( @@ -27,6 +26,18 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/shadow, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = null, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) /datum/species/shadow/spec_life(mob/living/carbon/human/H, delta_time, times_fired) var/turf/T = H.loc 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 c800d86b7a2b..ba8f82b6d682 100644 --- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm +++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm @@ -5,7 +5,7 @@ say_mod = "rattles" sexes = 0 meat = /obj/item/food/meat/slab/human/mutant/skeleton - species_traits = list(NOBLOOD, HAS_BONE, NOTRANSSTING, NOEYESPRITES, NO_DNA_COPY) + species_traits = list(NOBLOOD, NOTRANSSTING, NOEYESPRITES, NO_DNA_COPY) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -28,15 +28,12 @@ TRAIT_CAN_USE_FLIGHT_POTION, ) inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID - mutanttongue = /obj/item/organ/tongue/bone - mutantstomach = /obj/item/organ/stomach/bone disliked_food = NONE liked_food = GROSS | MEAT | RAW wings_icons = list("Skeleton") //They can technically be in an ERT changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN species_cookie = /obj/item/reagent_containers/food/condiment/milk - species_language_holder = /datum/language_holder/skeleton bodypart_overrides = list( BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/skeleton, @@ -47,6 +44,18 @@ BODY_ZONE_CHEST = /obj/item/bodypart/chest/skeleton, ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = null, + ORGAN_SLOT_LUNGS = null, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/bone, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach/bone, + ORGAN_SLOT_APPENDIX = null, + ORGAN_SLOT_LIVER = null, + ) + /datum/species/skeleton/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) . = ..() C.set_safe_hunger_level() @@ -56,35 +65,6 @@ return TRUE return ..() -//Can still metabolize milk through meme magic -/datum/species/skeleton/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(chem.type == /datum/reagent/toxin/bonehurtingjuice) - H.stamina.adjust(-7.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - H.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - if(DT_PROB(10, delta_time)) - switch(rand(1, 3)) - if(1) - H.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) - if(2) - H.manual_emote(pick("oofs silently.", "looks like [H.p_their()] bones hurt.", "grimaces, as though [H.p_their()] bones hurt.")) - if(3) - to_chat(H, span_warning("Your bones hurt!")) - if(chem.overdosed) - if(DT_PROB(2, delta_time) && iscarbon(H)) //big oof - var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. - var/obj/item/bodypart/bp = H.get_bodypart(selected_part) //We're so sorry skeletons, you're so misunderstood - if(bp) - playsound(H, get_sfx(SFX_DESECRATION), 50, TRUE, -1) //You just want to socialize - H.visible_message(span_warning("[H] rattles loudly and flails around!!"), span_danger("Your bones hurt so much that your missing muscles spasm!!")) - H.say("OOF!!", forced=/datum/reagent/toxin/bonehurtingjuice) - bp.receive_damage(200, 0, 0) //But I don't think we should - else - to_chat(H, span_warning("Your missing arm aches from wherever you left it.")) - H.emote("sigh") - H.reagents.remove_reagent(chem.type, chem.metabolization_rate * delta_time) - return TRUE - /datum/species/skeleton/get_species_description() return "A rattling skeleton! They descend upon Space Station 13 \ Every year to spook the crew! \"I've got a BONE to pick with you!\"" diff --git a/code/modules/mob/living/carbon/human/species_types/skrell.dm b/code/modules/mob/living/carbon/human/species_types/skrell.dm deleted file mode 100644 index 12c9af6d94e4..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/skrell.dm +++ /dev/null @@ -1,144 +0,0 @@ -/datum/species/skrell - name = "\improper Skrell" - id = SPECIES_SKRELL - say_mod = "warbles" - default_color = "42F58D" - species_traits = list(MUTCOLORS, HAIRCOLOR, EYECOLOR, LIPS, HAS_FLESH, HAS_BONE, BODY_RESIZABLE) - inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, TRAIT_LIGHT_DRINKER) - liked_food = VEGETABLES | FRUIT - disliked_food = GROSS | MEAT | RAW | DAIRY - toxic_food = TOXIC | SEAFOOD - payday_modifier = 0.95 - job_outfit_type = SPECIES_HUMAN - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - species_language_holder = /datum/language_holder/skrell - exotic_bloodtype = "S" - - species_eye_path = 'icons/mob/species/skrell/eyes.dmi' - - mutantbrain = /obj/item/organ/brain/skrell - mutanteyes = /obj/item/organ/eyes/skrell - mutantlungs = /obj/item/organ/lungs/skrell - mutantheart = /obj/item/organ/heart/skrell - mutantliver = /obj/item/organ/liver/skrell - mutanttongue = /obj/item/organ/tongue/skrell - - cosmetic_organs = list( - /obj/item/organ/skrell_headtails = "Long" - ) - - bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/skrell, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/skrell, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/skrell, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/skrell, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/skrell, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/skrell, - ) - -/datum/species/skrell/spec_life(mob/living/carbon/human/skrell_mob, delta_time, times_fired) - . = ..() - if(skrell_mob.nutrition > NUTRITION_LEVEL_ALMOST_FULL) - skrell_mob.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL) - -/datum/species/skrell/prepare_human_for_preview(mob/living/carbon/human/human) - human.dna.mutant_colors[MUTCOLORS_GENERIC_1] = COLOR_BLUE_GRAY - human.hair_color = COLOR_BLUE_GRAY - human.update_body(TRUE) - -// Copper restores blood for Skrell instead of iron. -/datum/species/skrell/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - . = ..() - if(chem.type == /datum/reagent/copper) - if(H.blood_volume < BLOOD_VOLUME_NORMAL) - H.blood_volume += 0.5 * delta_time - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - if(chem.type == /datum/reagent/iron) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - -/datum/species/skrell/random_name(gender, unique, lastname, attempts) - . = "" - - var/full_name = "" - var/new_name = "" - var/static/list/syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix") - for(var/x = rand(1,2) to 0 step -1) - new_name += pick(syllables) - full_name += pick(syllables) - - full_name += " [capitalize(new_name)]" - . += "[capitalize(full_name)]" - - if(unique && attempts < 10) - if(findname(new_name)) - . = .(gender, TRUE, null, attempts++) - - return . - -//Skrell lore -/datum/species/skrell/get_species_description() - return "Skrells are aquatic humanoids coming from the planet of Qerrbalak, often deeply ceremonial and focused on learning more about the galaxy. \ - Their inherent fondness for learning and technology has resulted in them advancing further in science when compared to humanity, \ - however progress has mostly gone stagnant due to recent political turmoil and the economic crisis back home." - -/datum/species/skrell/get_species_lore() - return list( - "Skrellian society is obviously quite different from that of humanity, and many outsiders often call Skrell emotionless however this is wrong, \ - as Skrell lack facial muscles and frequently make use of their tone of voice, movement and more. \ - Skrell also sees things far more in the long term side of things because of their long lifespan.", - - "Despite the good relations enjoyed with most other species, there is a deep fear within the federation of foreign influence, and because of this \ - fear, the federation adopted a rather isolationist foreign policy which was mostly caused by the recent political turmoil and \ - economic crash.", - - "The economic crash also known as \"Qerrbalak recession\" was caused when a large disaster happened on huge mining facility at Urmx housing one \ - of the federations biggest plasma mines, this disaster was caused when a fire erupted in one of the lower tunnels of XM-2 a mining site, this \ - caused an immense plasmafire that raged for 6 years and lead to the casualities of 84 employees of the facility, with 4356 being injured and around \ - 50.0000 people living on the planet being directly affected.", - - "Not only did this fire destroy one of the biggest mining sites of the federation, but as well affected various other nearby sites causing a huge scarcity in plasma. \ - As plasma supply dropped around various worlds in federation such as Qerrbalak were unable to maintain the demand in plasma, and caused a \ - huge rise in unemployment and caused a stock crash in the plasma market in federation.", - ) - -//Skrell features - -/datum/species/skrell/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list( - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "biohazard", - SPECIES_PERK_NAME = "Toxin Tolerance", - SPECIES_PERK_DESC = "Skrell have a higher resistance to toxins.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "syringe", - SPECIES_PERK_NAME = "Haemocyanin-Based Circulatory System", - SPECIES_PERK_DESC = "Skrell blood is restored faster with copper, iron doesn't work.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "thermometer", - SPECIES_PERK_NAME = "Temperature Intolerance", - SPECIES_PERK_DESC = "Skrell lungs cannot handle temperature differences.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "sun", - SPECIES_PERK_NAME = "High Light Sensitivity", - SPECIES_PERK_DESC = "Skrell eyes are sensitive to bright lights and are more susceptible to damage when not sufficiently protected.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "wine-bottle", - SPECIES_PERK_NAME = "Low Alcohol Tolerance", - SPECIES_PERK_DESC = "Skrell have a low tolerance to alcohol, resulting in them feeling the effects of it much earlier compared to other species." - ), - ) - - return to_add diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm deleted file mode 100644 index c5e59cb2e0d4..000000000000 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ /dev/null @@ -1,78 +0,0 @@ -/datum/species/snail - name = "\improper Snailperson" - id = SPECIES_SNAIL - offset_features = list(OFFSET_GLASSES = list(0,4)) - default_color = "336600" //vomit green - species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE) - inherent_traits = list( - TRAIT_ADVANCEDTOOLUSER, - TRAIT_CAN_STRIP, - TRAIT_NO_SLIP_ALL, - ) - - say_mod = "slurs" - coldmod = 0.5 //snails only come out when its cold and wet - burnmod = 2 - speedmod = 6 - siemens_coeff = 2 //snails are mostly water - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP - sexes = FALSE //snails are hermaphrodites - - mutanteyes = /obj/item/organ/eyes/snail - mutanttongue = /obj/item/organ/tongue/snail - exotic_blood = /datum/reagent/lube - - bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/snail, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/snail, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/snail, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/snail, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/snail, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/snail - ) - -/datum/species/snail/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if(istype(chem,/datum/reagent/consumable/salt)) - H.adjustFireLoss(2 * REAGENTS_EFFECT_MULTIPLIER * delta_time) - playsound(H, 'sound/weapons/sear.ogg', 30, TRUE) - H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time) - return TRUE - -/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(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), ITEM_SLOT_BACK) - C.AddElement(/datum/element/snailcrawl) - -/datum/species/snail/on_species_loss(mob/living/carbon/C) - . = ..() - C.RemoveElement(/datum/element/snailcrawl) - 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.temporarilyRemoveItemFromInventory(bag, TRUE) - qdel(bag) - -/obj/item/storage/backpack/snail - name = "snail shell" - desc = "Worn by snails as armor and storage compartment." - icon_state = "snailshell" - inhand_icon_state = "snailshell" - lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, FIRE = 0, ACID = 50) - max_integrity = 200 - resistance_flags = FIRE_PROOF | ACID_PROOF - supports_variations_flags = NONE - -/obj/item/storage/backpack/snail/dropped(mob/user, silent) - . = ..() - emptyStorage() - if(!QDELETED(src)) - qdel(src) - -/obj/item/storage/backpack/snail/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, "snailshell") diff --git a/code/modules/mob/living/carbon/human/species_types/teshari.dm b/code/modules/mob/living/carbon/human/species_types/teshari.dm index fc306a801d4e..69c30be2846a 100644 --- a/code/modules/mob/living/carbon/human/species_types/teshari.dm +++ b/code/modules/mob/living/carbon/human/species_types/teshari.dm @@ -2,7 +2,7 @@ name = "\improper Teshari" plural_form = "Teshari" id = SPECIES_TESHARI - species_traits = list(MUTCOLORS, MUTCOLORS2, MUTCOLORS3, EYECOLOR, NO_UNDERWEAR, HAS_FLESH, HAS_BONE, HAIRCOLOR, FACEHAIRCOLOR) + species_traits = list(MUTCOLORS, EYECOLOR, NO_UNDERWEAR, HAIRCOLOR, FACEHAIRCOLOR) changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT species_language_holder = /datum/language_holder/teshari species_eye_path = 'icons/mob/species/teshari/eyes.dmi' @@ -23,14 +23,34 @@ liked_food = MEAT disliked_food = GRAIN | GROSS - payday_modifier = 0.75 heatmod = 1.5 coldmod = 0.67 brutemod = 1.5 burnmod = 1.5 - bodytemp_normal = BODYTEMP_NORMAL - 15 // 22°C - bodytemp_heat_damage_limit = BODYTEMP_HEAT_DAMAGE_LIMIT - 32 // 35°C max - bodytemp_cold_damage_limit = BODYTEMP_COLD_DAMAGE_LIMIT - 30 // -33°C min + + cold_level_1 = 180 + cold_level_2 = 130 + cold_level_3 = 70 + + heat_level_1 = 320 + heat_level_2 = 370 + heat_level_3 = 600 + + heat_discomfort_level = 292 + heat_discomfort_strings = list( + "Your feathers prickle in the heat.", + "You feel uncomfortably warm.", + "Your hands and feet feel hot as your body tries to regulate heat.", + ) + + cold_discomfort_level = 180 + cold_discomfort_strings = list( + "You feel a bit chilly.", + "You fluff up your feathers against the cold.", + "You move your arms closer to your body to shield yourself from the cold.", + "You press your ears against your head to conserve heat", + "You start to feel the cold on your skin", + ) cosmetic_organs = list( /obj/item/organ/teshari_feathers = "Plain", @@ -38,7 +58,6 @@ /obj/item/organ/teshari_body_feathers = "Plain", /obj/item/organ/tail/teshari = "Default" ) - mutantlungs = /obj/item/organ/lungs/teshari bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/teshari, @@ -49,6 +68,26 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/teshari, ) + robotic_bodyparts = list( + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot/surplus/teshari, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot/surplus/teshari, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot/surplus/teshari, + BODY_ZONE_R_LEG= /obj/item/bodypart/leg/right/robot/surplus/teshari, + ) + + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/teshari, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + #define TESH_BODY_COLOR "#DEB887" // Also in code\modules\client\preferences\species_features\teshari.dm #define TESH_FEATHER_COLOR "#996633" diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index fddc9b7004c1..0d4fa3be3eb3 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -14,8 +14,6 @@ FACEHAIR, LIPS, DRINKSBLOOD, - HAS_FLESH, - HAS_BONE, BLOOD_CLANS, HAIRCOLOR, FACEHAIRCOLOR, @@ -29,15 +27,26 @@ inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID mutant_bodyparts = list("wings" = "None") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN - exotic_bloodtype = "U" use_skintones = TRUE - mutantheart = /obj/item/organ/heart/vampire - mutanttongue = /obj/item/organ/tongue/vampire + examine_limb_id = SPECIES_HUMAN skinned_type = /obj/item/stack/sheet/animalhide/human ///some starter text sent to the vampire initially, because vampires have shit to do to stay alive var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability." + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart/vampire, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/vampire, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + /datum/species/vampire/check_roundstart_eligible() if(SSevents.holidays && SSevents.holidays[HALLOWEEN]) return TRUE @@ -77,6 +86,9 @@ return 2 //Whips deal 2x damage to vampires. Vampire killer. return 1 +/datum/species/vampire/get_random_blood_type() + return /datum/blood/universal + /datum/species/vampire/get_species_description() return "A classy Vampire! They descend upon Space Station Thirteen Every year to spook the crew! \"Bleeg!!\"" @@ -87,34 +99,6 @@ Because of this, Vampires have split into two clans, one that embraces their powers as a blessing and one that rejects it.", ) -/datum/species/vampire/create_pref_unique_perks() - var/list/to_add = list() - - to_add += list( - list( - SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, - SPECIES_PERK_ICON = "bed", - SPECIES_PERK_NAME = "Coffin Brooding", - SPECIES_PERK_DESC = "Vampires can delay The Thirst and heal by resting in a coffin. So THAT'S why they do that!", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, - SPECIES_PERK_ICON = "book-dead", - SPECIES_PERK_NAME = "Vampire Clans", - SPECIES_PERK_DESC = "Vampires belong to one of two clans - the Inoculated, and the Outcast. The Outcast \ - don't follow many vampiric traditions, while the Inoculated are given unique names and flavor.", - ), - list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, - SPECIES_PERK_ICON = "cross", - SPECIES_PERK_NAME = "Against God and Nature", - SPECIES_PERK_DESC = "Almost all higher powers are disgusted by the existence of \ - Vampires, and entering the Chapel is essentially suicide. Do not do it!", - ), - ) - - return to_add - // Vampire blood is special, so it needs to be handled with its own entry. /datum/species/vampire/create_pref_blood_perks() var/list/to_add = list() @@ -166,37 +150,48 @@ if(!COOLDOWN_FINISHED(V, drain_cooldown)) to_chat(H, span_warning("You just drained blood, wait a few seconds!")) return - if(H.pulling && iscarbon(H.pulling)) - var/mob/living/carbon/victim = H.pulling - if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) - to_chat(H, span_warning("You're already full!")) - return - if(victim.stat == DEAD) - to_chat(H, span_warning("You need a living victim!")) - return - if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || victim.dna.species.exotic_blood))) - to_chat(H, span_warning("[victim] doesn't have blood!")) - return - COOLDOWN_START(V, drain_cooldown, 3 SECONDS) - if(victim.can_block_magic(MAGIC_RESISTANCE_HOLY, charge_cost = 0)) - victim.show_message(span_warning("[H] tries to bite you, but stops before touching you!")) - to_chat(H, span_warning("[victim] is blessed! You stop just in time to avoid catching fire.")) - return - if(victim.has_reagent(/datum/reagent/consumable/garlic)) - victim.show_message(span_warning("[H] tries to bite you, but recoils in disgust!")) - to_chat(H, span_warning("[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.")) - return - if(!do_after(H, victim, 3 SECONDS)) - return - var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood - var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) - victim.show_message(span_danger("[H] is draining your blood!")) - to_chat(H, span_notice("You drain some blood!")) - playsound(H, 'sound/items/drink.ogg', 30, TRUE, -2) - victim.blood_volume = clamp(victim.blood_volume - drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - H.blood_volume = clamp(H.blood_volume + drained_blood, 0, BLOOD_VOLUME_MAXIMUM) - if(!victim.blood_volume) - to_chat(H, span_notice("You finish off [victim]'s blood supply.")) + var/obj/item/hand_item/grab/G = H.get_active_grab() + if(!iscarbon(G?.affecting)) + return + + var/mob/living/carbon/victim = G.affecting + if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) + to_chat(H, span_warning("You're already full!")) + return + + if(victim.stat == DEAD) + to_chat(H, span_warning("You need a living victim!")) + return + + if(!victim.blood_volume || (victim.dna && ((NOBLOOD in victim.dna.species.species_traits) || victim.dna.species.exotic_blood))) + to_chat(H, span_warning("[victim] doesn't have blood!")) + return + + COOLDOWN_START(V, drain_cooldown, 3 SECONDS) + if(victim.can_block_magic(MAGIC_RESISTANCE_HOLY, charge_cost = 0)) + victim.show_message(span_warning("[H] tries to bite you, but stops before touching you!")) + to_chat(H, span_warning("[victim] is blessed! You stop just in time to avoid catching fire.")) + return + + if(victim.has_reagent(/datum/reagent/consumable/garlic)) + victim.show_message(span_warning("[H] tries to bite you, but recoils in disgust!")) + to_chat(H, span_warning("[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.")) + return + + if(!do_after(H, victim, 3 SECONDS)) + return + + var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood + var/drained_blood = min(victim.blood_volume, VAMP_DRAIN_AMOUNT, blood_volume_difference) + + victim.show_message(span_danger("[H] is draining your blood!")) + to_chat(H, span_notice("You drain some blood!")) + playsound(H, 'sound/items/drink.ogg', 30, TRUE, -2) + + victim.adjustBloodVolume(-drained_blood) + H.adjustBloodVolumeUpTo(drained_blood, BLOOD_VOLUME_MAXIMUM) + if(!victim.blood_volume) + to_chat(H, span_notice("You finish off [victim]'s blood supply.")) /obj/item/organ/heart/vampire name = "vampire heart" diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index b5fff99314f3..f09829a6447c 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -9,11 +9,7 @@ species_eye_path = 'icons/mob/species/vox/eyes.dmi' species_traits = list( MUTCOLORS, - MUTCOLORS2, - MUTCOLORS3, EYECOLOR, - HAS_FLESH, - HAS_BONE, HAIRCOLOR, FACEHAIRCOLOR, NO_UNDERWEAR, @@ -25,11 +21,7 @@ TRAIT_CAN_USE_FLIGHT_POTION, ) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID - mutantlungs = /obj/item/organ/lungs/vox - mutantbrain = /obj/item/organ/brain/vox - mutantheart = /obj/item/organ/heart/vox - mutanteyes = /obj/item/organ/eyes/vox - mutantliver = /obj/item/organ/liver/vox + breathid = "n2" cosmetic_organs = list( /obj/item/organ/snout/vox = "Vox Snout", @@ -38,10 +30,10 @@ /obj/item/organ/tail/vox = "Vox Tail" ) liked_food = MEAT | FRIED - payday_modifier = 0.75 outfit_important_for_life = /datum/outfit/vox species_language_holder = /datum/language_holder/vox changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/vox, BODY_ZONE_CHEST = /obj/item/bodypart/chest/vox, @@ -51,6 +43,21 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/vox, ) + robotic_bodyparts = null + + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain/vox, + ORGAN_SLOT_HEART = /obj/item/organ/heart/vox, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs/vox, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/vox, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver/vox, + ORGAN_SLOT_KIDNEYS = /obj/item/organ/kidneys, + ) + #define VOX_BODY_COLOR "#C4DB1A" // Also in code\modules\client\preferences\species_features\vox.dm #define VOX_SNOUT_COLOR "#E5C04B" @@ -81,12 +88,14 @@ else equipping.put_in_r_hand(tank) - equipping.internal = tank + equipping.open_internals(tank) /datum/species/vox/give_important_for_life(mob/living/carbon/human/human_to_equip) . = ..() - human_to_equip.internal = human_to_equip.get_item_for_held_index(2) - if(!human_to_equip.internal) + var/obj/item/I = human_to_equip.get_item_for_held_index(2) + if(I) + human_to_equip.open_internals(I) + else var/obj/item/tank/internals/nitrogen/belt/full/new_tank = new(null) if(human_to_equip.equip_to_slot_or_del(new_tank, ITEM_SLOT_BELT)) human_to_equip.internal = human_to_equip.belt @@ -154,3 +163,6 @@ ) return to_add + +/datum/species/vox/get_random_blood_type() + return GET_BLOOD_REF(/datum/blood/universal/vox) 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 2a814f30af7d..db128fddca98 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -7,7 +7,7 @@ say_mod = "moans" sexes = 0 meat = /obj/item/food/meat/slab/human/mutant/zombie - species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING, HAS_FLESH, HAS_BONE) + species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING) inherent_traits = list( TRAIT_ADVANCEDTOOLUSER, TRAIT_CAN_STRIP, @@ -19,7 +19,6 @@ TRAIT_RESISTLOWPRESSURE, TRAIT_RADIMMUNE, TRAIT_EASYDISMEMBER, - TRAIT_EASILY_WOUNDED, TRAIT_LIMBATTACHMENT, TRAIT_NOBREATH, TRAIT_NODEATH, @@ -27,14 +26,20 @@ TRAIT_NOCLONELOSS, ) inherent_biotypes = 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') disliked_food = NONE liked_food = GROSS | MEAT | RAW changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | ERT_SPAWN - bodytemp_normal = T0C // They have no natural body heat, the environment regulates body temp - bodytemp_heat_damage_limit = FIRE_MINIMUM_TEMPERATURE_TO_EXIST // Take damage at fire temp - bodytemp_cold_damage_limit = T0C + 50 // take damage below minimum movement temp + + + heat_discomfort_level = INFINITY + cold_discomfort_level = -(INFINITY) + + bodytemp_normal = T0C + + heat_level_1 = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + heat_level_2 = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100 + heat_level_3 = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 200 bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie, @@ -45,6 +50,18 @@ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie ) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/zombie, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ) + /// Zombies do not stabilize body temperature they are the walking dead and are cold blooded /datum/species/zombie/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired) return @@ -76,6 +93,9 @@ return to_add +/datum/species/zombie/body_temperature_core() + return + /datum/species/zombie/infectious name = "\improper Infectious Zombie" id = SPECIES_ZOMBIE_INFECTIOUS @@ -83,13 +103,24 @@ mutanthands = /obj/item/zombie_hand armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 1.6 - mutanteyes = /obj/item/organ/eyes/night_vision/zombie changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN /// The rate the zombies regenerate at var/heal_rate = 0.5 /// The cooldown before the zombie can start regenerating COOLDOWN_DECLARE(regen_cooldown) + organs = list( + ORGAN_SLOT_BRAIN = /obj/item/organ/brain, + ORGAN_SLOT_HEART = /obj/item/organ/heart, + ORGAN_SLOT_LUNGS = /obj/item/organ/lungs, + ORGAN_SLOT_EYES = /obj/item/organ/eyes/night_vision/zombie, + ORGAN_SLOT_EARS = /obj/item/organ/ears, + ORGAN_SLOT_TONGUE = /obj/item/organ/tongue/zombie, + ORGAN_SLOT_STOMACH = /obj/item/organ/stomach, + ORGAN_SLOT_APPENDIX = /obj/item/organ/appendix, + ORGAN_SLOT_LIVER = /obj/item/organ/liver, + ) + /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE @@ -109,11 +140,11 @@ //They must be restrained, beheaded or gibbed to stop being a threat. if(COOLDOWN_FINISHED(src, regen_cooldown)) var/heal_amt = heal_rate - if(HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION)) + if(C.stat == UNCONSCIOUS) heal_amt *= 2 C.heal_overall_damage(heal_amt * delta_time, heal_amt * delta_time) C.adjustToxLoss(-heal_amt * delta_time) - if(!HAS_TRAIT(C, TRAIT_CRITICAL_CONDITION) && DT_PROB(2, delta_time)) + if(!(C.stat == UNCONSCIOUS) && DT_PROB(2, delta_time)) playsound(C, pick(spooks), 50, TRUE, 10) //Congrats you somehow died so hard you stopped being a zombie @@ -136,23 +167,4 @@ infection = new() infection.Insert(C) -// Your skin falls off -/datum/species/human/krokodil_addict - name = "\improper Human" - id = SPECIES_ZOMBIE_KROKODIL - examine_limb_id = SPECIES_HUMAN - sexes = 0 - mutanttongue = /obj/item/organ/tongue/zombie - changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN - - bodypart_overrides = list( - BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie, - BODY_ZONE_CHEST = /obj/item/bodypart/chest/zombie, - BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/zombie, - BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/zombie, - BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/zombie, - BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie - ) - - #undef REGENERATION_DELAY diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 8f1077fcb631..3abf1865c581 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -38,3 +38,15 @@ . = ..() if(.) update_body_parts() + +/mob/living/carbon/human/fakedeath(source, silent) + . = ..() + for(var/mob/living/L in viewers(src, world.view) - src) + if(L.is_blind() || L.stat != CONSCIOUS || !L.client) + continue + + var/datum/roll_result/result = L.stat_roll(6, /datum/rpg_skill/willpower) + switch(result.outcome) + if(FAILURE, CRIT_FAILURE) + if(L.apply_status_effect(/datum/status_effect/skill_mod/witness_death)) + to_chat(L, result.create_tooltip("For but a moment, there is nothing. Nothing but the gnawing realisation of what you have just witnessed.")) diff --git a/code/modules/mob/living/carbon/init_signals.dm b/code/modules/mob/living/carbon/init_signals.dm index 58ea9947d416..09e1bae9ca48 100644 --- a/code/modules/mob/living/carbon/init_signals.dm +++ b/code/modules/mob/living/carbon/init_signals.dm @@ -8,6 +8,8 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SOFT_CRITICAL_CONDITION), PROC_REF(on_softcrit_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SOFT_CRITICAL_CONDITION), PROC_REF(on_softcrit_loss)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_NO_ADDICTION), PROC_REF(on_noaddiction_trait_gain)) + /** * On gain of TRAIT_NOBREATH * @@ -30,9 +32,6 @@ clear_alert(ALERT_TOO_MUCH_CO2) clear_alert(ALERT_NOT_ENOUGH_CO2) - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") /** * On gain of TRAIT_NOMETABOLISM * @@ -45,7 +44,20 @@ reagents.end_metabolization(keep_liverless = TRUE) +/** + * On gain of TRAIT_NO_ADDICTION + * + * This will remove all addictions. + */ +/mob/living/carbon/proc/on_noaddiction_trait_gain(datum/source) + SIGNAL_HANDLER + for(var/addiction_type in subtypesof(/datum/addiction)) + mind?.remove_addiction_points(addiction_type, MAX_ADDICTION_POINTS) + /mob/living/carbon/proc/on_softcrit_gain(datum/source) + SIGNAL_HANDLER + + ADD_TRAIT(src, TRAIT_NO_SPRINT, STAT_TRAIT) stamina.maximum -= 100 stamina.regen_rate -= 5 stamina.process() @@ -53,6 +65,9 @@ add_movespeed_modifier(/datum/movespeed_modifier/carbon_softcrit) /mob/living/carbon/proc/on_softcrit_loss(datum/source) + SIGNAL_HANDLER + + REMOVE_TRAIT(src, TRAIT_NO_SPRINT, STAT_TRAIT) stamina.maximum += 100 stamina.regen_rate += 5 stamina.process() diff --git a/code/modules/mob/living/carbon/internals.dm b/code/modules/mob/living/carbon/internals.dm new file mode 100644 index 000000000000..ba99551055d1 --- /dev/null +++ b/code/modules/mob/living/carbon/internals.dm @@ -0,0 +1,147 @@ +/// Returns TRUE if an air tank compatible helmet is equipped. +/mob/living/carbon/proc/can_breathe_helmet() + if (isclothing(head) && (head.clothing_flags & HEADINTERNALS)) + return TRUE + +/// Returns TRUE if an air tank compatible mask is equipped. +/mob/living/carbon/proc/can_breathe_mask() + if (isclothing(wear_mask) && (wear_mask.clothing_flags & MASKINTERNALS)) + return TRUE + +/// Returns TRUE if a breathing tube is equipped. +/mob/living/carbon/proc/can_breathe_tube() + if (getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + return TRUE + +/// Returns TRUE if an air tank compatible mask or breathing tube is equipped. +/mob/living/carbon/proc/can_breathe_internals() + return can_breathe_tube() || can_breathe_mask() || can_breathe_helmet() + +/// Returns truthy if air tank is open and mob lacks apparatus, or if the tank moved away from the mob. +/mob/living/carbon/proc/invalid_internals() + return (internal || external) && (!can_breathe_internals() || (internal && internal.loc != src)) + +/** + * Open the internal air tank without checking for any breathing apparatus. + * Returns TRUE if the air tank was opened successfully. + * Closes any existing tanks before opening another one. + * + * Arguments: + * * tank - The given tank to open and start breathing from. + * * is_external - A boolean which indicates if the air tank must be equipped, or stored elsewhere. + */ +/mob/living/carbon/proc/open_internals(obj/item/tank/target_tank, is_external = FALSE) + if (!target_tank) + return + close_all_airtanks() + if (is_external) + external = target_tank + else + internal = target_tank + target_tank.after_internals_opened(src) + update_mob_action_buttons() + return TRUE + +/** + * Opens the given internal air tank if a breathing apparatus is found. Returns TRUE if successful, FALSE otherwise. + * Returns TRUE if the tank was opened successfully. + * + * Arguments: + * * tank - The given tank we will attempt to toggle open and start breathing from. + * * is_external - A boolean which indicates if the air tank must be equipped, or stored elsewhere. + */ +/mob/living/carbon/proc/try_open_internals(obj/item/tank/target_tank, is_external = FALSE) + if (!can_breathe_internals()) + return + return open_internals(target_tank, is_external) + +/** + * Actually closes the active internal or external air tank. + * Returns TRUE if the tank was opened successfully. + * + * Arguments: + * * is_external - A boolean which indicates if the air tank must be equipped, or stored elsewhere. + */ +/mob/living/carbon/proc/close_internals(is_external = FALSE) + var/obj/item/tank/target_tank = is_external ? external : internal + if (!target_tank) + return + if (is_external) + external = null + else + internal = null + target_tank.after_internals_closed(src) + update_mob_action_buttons() + return TRUE + +/// Close the the currently open external (that's EX-ternal) air tank. Returns TREUE if successful. +/mob/living/carbon/proc/close_externals() + return close_internals(TRUE) + +/// Quickly/lazily close all airtanks without any returns or notifications. +/mob/living/carbon/proc/close_all_airtanks() + if (external) + close_externals() + if (internal) + close_internals() + +/** + * Prepares to open the internal air tank and notifies the mob in chat. + * Handles displaying messages to the user before doing the actual opening. + * Returns TRUE if the tank was opened/closed successfully. + * + * Arguments: + * * tank - The given tank to toggle open and start breathing from. + * * is_external - A boolean which indicates if the air tank must be equipped, or stored elsewhere. + */ +/mob/living/carbon/proc/toggle_open_internals(obj/item/tank/target_tank, is_external = FALSE) + if (!target_tank) + return + if(internal || (is_external && external)) + to_chat(src, span_notice("You switch your internals to [target_tank].")) + else + to_chat(src, span_notice("You open [target_tank] valve.")) + return open_internals(target_tank, is_external) + +/** + * Prepares to close the currently open internal air tank and notifies in chat. + * Handles displaying messages to the user before doing the actual closing. + * Returns TRUE if + * + * Arguments: + * * is_external - A boolean which indicates if the air tank must be equipped, or stored elsewhere. + */ +/mob/living/carbon/proc/toggle_close_internals(is_external = FALSE) + if (!internal && !external) + return + to_chat(src, span_notice("You close [is_external ? external : internal] valve.")) + return close_internals(is_external) + +/// Prepares emergency disconnect from open air tanks and notifies in chat. Usually called after mob suddenly unequips breathing apparatus. +/mob/living/carbon/proc/cutoff_internals() + if (!external && !internal) + return + to_chat(src, span_notice("Your internals disconnect from [external || internal] and the valve closes.")) + close_all_airtanks() + +/** + * Toggles the given internal air tank open, or close the currently open one, if a compatible breathing apparatus is found. + * Returns TRUE if the tank was opened successfully. + * + * Arguments: + * * tank - The given tank to toggle open and start breathing from internally. + */ +/mob/living/carbon/proc/toggle_internals(obj/item/tank) + // Carbons can't open their own internals tanks. + return FALSE + +/** + * Toggles the given external (that's EX-ternal) air tank open, or close the currently open one, if a compatible breathing apparatus is found. + * Returns TRUE if the tank was opened successfully. + * + * Arguments: + * * tank - The given tank to toggle open and start breathing from externally. + */ +/mob/living/carbon/proc/toggle_externals(obj/item/tank) + // Carbons can't open their own externals tanks. + return FALSE diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 4c932b08c75f..c07590a4e1a6 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -14,7 +14,7 @@ return legcuffed return ..() -/mob/living/carbon/proc/get_all_worn_items() +/mob/living/carbon/proc/get_all_worn_items(include_pockets = TRUE) return list( back, wear_mask, @@ -67,17 +67,17 @@ if(index) held_items[index] = null - if(I.pulledby) - I.pulledby.stop_pulling() + if(LAZYLEN(I.grabbed_by)) + I.free_from_all_grabs() I.screen_loc = null if(client) client.screen -= I - if(observers?.len) - for(var/M in observers) - var/mob/dead/observe = M + if(LAZYLEN(observers)) + for(var/mob/dead/observe as anything in observers) if(observe.client) observe.client.screen -= I + I.forceMove(src) I.plane = ABOVE_HUD_PLANE I.appearance_flags |= NO_CLIENT_COLOR @@ -88,32 +88,41 @@ if(back) return back = I - update_worn_back() + update_slots_for_item(I, slot) + if(ITEM_SLOT_MASK) if(wear_mask) return + wear_mask = I + update_slots_for_item(I, slot) wear_mask_update(I, toggle_off = 0) + if(ITEM_SLOT_HEAD) if(head) return + head = I + update_slots_for_item(I, slot) SEND_SIGNAL(src, COMSIG_CARBON_EQUIP_HAT, I) - head_update(I) + if(ITEM_SLOT_NECK) if(wear_neck) return wear_neck = I - update_worn_neck(I) + update_slots_for_item(I, slot) + if(ITEM_SLOT_HANDCUFFED) set_handcuffed(I) - update_handcuffed() + if(ITEM_SLOT_LEGCUFFED) legcuffed = I update_worn_legcuffs() + if(ITEM_SLOT_HANDS) put_in_hands(I) update_held_items() + if(ITEM_SLOT_BACKPACK) if(!back || !back.atom_storage?.attempt_insert(I, src, override = TRUE)) not_handled = TRUE @@ -124,15 +133,17 @@ //We cannot call it for items that have not been handled as they are not yet correctly //in a slot (handled further down inheritance chain, probably living/carbon/human/equip_to_slot if(!not_handled) - has_equipped(I, slot, initial) + afterEquipItem(I, slot, initial) return not_handled /// This proc is called after an item has been successfully handled and equipped to a slot. -/mob/living/carbon/proc/has_equipped(obj/item/item, slot, initial = FALSE) +/mob/living/carbon/proc/afterEquipItem(obj/item/item, slot, initial = FALSE) + if(length(item.actions)) + item.update_action_buttons(UPDATE_BUTTON_STATUS) return item.equipped(src, slot, initial) -/mob/living/carbon/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/carbon/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = 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 @@ -141,29 +152,43 @@ head = null SEND_SIGNAL(src, COMSIG_CARBON_UNEQUIP_HAT, I, force, newloc, no_move, invdrop, silent) if(!QDELETED(src)) - head_update(I) + update_slots_for_item(I, ITEM_SLOT_HEAD) + else if(I == back) back = null if(!QDELETED(src)) - update_worn_back() + update_slots_for_item(I, ITEM_SLOT_BACK) + else if(I == wear_mask) wear_mask = null if(!QDELETED(src)) + update_slots_for_item(I, ITEM_SLOT_MASK) wear_mask_update(I, toggle_off = 1) - if(I == wear_neck) + + else if(I == wear_neck) wear_neck = null if(!QDELETED(src)) - update_worn_neck(I) + update_slots_for_item(I, ITEM_SLOT_NECK) + else if(I == handcuffed) set_handcuffed(null) - if(buckled?.buckle_requires_restraints) - buckled.unbuckle_mob(src) + + else if(I == shoes) + shoes = null if(!QDELETED(src)) - update_handcuffed() + update_slots_for_item(I, ITEM_SLOT_FEET) + else if(I == legcuffed) legcuffed = null if(!QDELETED(src)) update_worn_legcuffs() + + // Not an else-if because we're probably equipped in another slot + if((I == internal || I == external) && (QDELETED(src) || QDELETED(I) || I.loc != src)) + cutoff_internals() + if(!QDELETED(src)) + update_mob_action_buttons(UPDATE_BUTTON_STATUS) + update_equipment_speed_mods() //handle stuff to update when a mob equips/unequips a mask. @@ -176,17 +201,6 @@ update_tint() update_worn_mask() -//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)) - var/obj/item/clothing/C = I - if(C.tint || initial(C.tint)) - update_tint() - update_sight() - if(I.flags_inv & HIDEMASK || forced) - update_worn_mask() - update_worn_head() - /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] @@ -299,3 +313,72 @@ covered_flags |= worn_item.body_parts_covered return covered_flags + +///Returns an item that is covering a bodypart. +/mob/living/carbon/proc/get_item_covering_bodypart(obj/item/bodypart/BP) + return get_item_covering_zone(BP.body_zone) + +///Returns an item that is covering a body_zone (BODY_ZONE_CHEST, etc) +/mob/living/carbon/proc/get_item_covering_zone(zone) + var/list/zones = body_zone2cover_flags(zone) + var/cover_field = NONE + for(var/_zone in zones) + cover_field |= _zone + + for(var/obj/item/inv_item in get_all_worn_items()) + if(cover_field & inv_item.body_parts_covered) + return inv_item + +/// Update any visuals relating to an item when it's equipped, unequipped, or it's flags_inv changes. +/mob/living/carbon/proc/update_slots_for_item(obj/item/I, equipped_slot = null, force_obscurity_update) + if(isnull(equipped_slot)) + equipped_slot = get_slot_by_item(I) + if(is_holding(I)) + equipped_slot |= ITEM_SLOT_HANDS + + if(isnull(equipped_slot)) + return + + var/old_obscured_slots = obscured_slots + var/slots_to_update = equipped_slot + var/need_bodypart_update = FALSE + + if(I.flags_inv || force_obscurity_update) + update_obscurity() + var/new_obscured_slots = obscured_slots + var/updated_slots = old_obscured_slots ^ new_obscured_slots + + // Update slots that we were obscuring/are going to obscure + slots_to_update |= check_obscured_slots(input_slots = updated_slots) + + // Update name if we are changing face visibility + var/face_coverage_changed = updated_slots & HIDEFACE + if(face_coverage_changed) + update_name() + + // Update body incase any bodyparts or organs changed visibility + var/bodypart_coverage_changed = updated_slots & BODYPART_HIDE_FLAGS + if(bodypart_coverage_changed) + need_bodypart_update = TRUE + + switch(equipped_slot) + if(ITEM_SLOT_HEAD) + if(isclothing(I)) + var/obj/item/clothing/clothing_item = I + if(clothing_item.tint || initial(clothing_item.tint)) + update_tint() + + update_sight() + + if (invalid_internals()) + cutoff_internals() + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + H.sec_hud_set_security_status() + + // Do the updates + if(need_bodypart_update) + update_body_parts() + + update_clothing(slots_to_update) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4c717c085bf8..6a61af1dcc06 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -7,14 +7,10 @@ damageoverlaytemp = 0 update_damage_hud() - if(IS_IN_STASIS(src)) - . = ..() - reagents.handle_stasis_chems(src, delta_time, times_fired) - else - //Reagent processing needs to come before breathing, to prevent edge cases. + . = ..() + if(!IS_IN_STASIS(src)) handle_organs(delta_time, times_fired) - . = ..() if(QDELETED(src)) return @@ -24,12 +20,23 @@ if(stat != DEAD) handle_brain_damage(delta_time, times_fired) + var/bodyparts_action = handle_bodyparts(delta_time, times_fired) + if(bodyparts_action & BODYPART_LIFE_UPDATE_HEALTH) + updatehealth() + + else if(bodyparts_action & BODYPART_LIFE_UPDATE_HEALTH_HUD) + update_health_hud() + if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) - else - var/bprv = handle_bodyparts(delta_time, times_fired) - if(bprv & BODYPART_LIFE_UPDATE_HEALTH) - updatehealth() + + if(stat != DEAD && !(IS_IN_STASIS(src))) + handle_shock() + handle_pain() + if(shock_stage >= SHOCK_TIER_1) + add_movespeed_modifier(/datum/movespeed_modifier/shock, TRUE) + else + remove_movespeed_modifier(/datum/movespeed_modifier/shock, TRUE) check_cremation(delta_time, times_fired) @@ -45,33 +52,27 @@ /////////////// //Start of a breath chain, calls breathe() -/mob/living/carbon/handle_breathing(delta_time, times_fired) +/mob/living/carbon/handle_breathing(times_fired) var/next_breath = 4 var/obj/item/organ/lungs/L = getorganslot(ORGAN_SLOT_LUNGS) var/obj/item/organ/heart/H = getorganslot(ORGAN_SLOT_HEART) if(L) - if(L.damage > L.high_threshold) + if(L.damage > (L.high_threshold * L.maxHealth)) next_breath-- if(H) - if(H.damage > H.high_threshold) + if(H.damage > (H.high_threshold * H.maxHealth)) next_breath-- if((times_fired % next_breath) == 0 || failed_last_breath) - breathe(delta_time, times_fired) //Breathe per 4 ticks if healthy, down to 2 if our lungs or heart are damaged, unless suffocating - if(failed_last_breath) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") + breathe() //Breathe per 4 ticks if healthy, down to 2 if our lungs or heart are damaged, unless suffocating else if(istype(loc, /obj/)) var/obj/location_as_object = loc location_as_object.handle_internal_lifeform(src,0) //Second link in a breath chain, calls check_breath() -/mob/living/carbon/proc/breathe(delta_time, times_fired) +/mob/living/carbon/proc/breathe(forced) var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) - if(reagents.has_reagent(/datum/reagent/toxin/lexorin, needs_metabolizing = TRUE)) - return SEND_SIGNAL(src, COMSIG_CARBON_PRE_BREATHE) @@ -80,20 +81,23 @@ environment = loc.return_air() var/datum/gas_mixture/breath + var/asystole = undergoing_cardiac_arrest() + if(!forced) + if(asystole && !CHEM_EFFECT_MAGNITUDE(src, CE_STABLE)) + losebreath = max(2, losebreath + 1) - if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - if(health <= crit_threshold || (pulledby?.grab_state >= GRAB_KILL) || (lungs?.organ_flags & ORGAN_FAILING)) - losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath - - else if(health <= crit_threshold) - losebreath += 0.25 //You're having trouble breathing in soft crit, so you'll miss a breath one in four times + else if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + if(HAS_TRAIT(src, TRAIT_KILL_GRAB) || (lungs?.organ_flags & ORGAN_DEAD)) + losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath - //Suffocate - if(losebreath >= 1) //You've missed a breath, take oxy damage + // Recover from breath loss + if(losebreath >= 1) losebreath-- - if(prob(10)) - emote("gasp") - if(istype(loc, /obj/)) + if(!forced && !asystole && prob(10)) + spawn(-1) + emote("gasp") + + if(istype(loc, /obj)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) else @@ -134,11 +138,17 @@ reagents.add_reagent(breathed_product, reagent_amount) breath.adjustGas(gasname, -breath.gas[gasname], update = 0) //update after - check_breath(breath) + . = check_breath(breath, forced) + if(breath?.total_moles) AIR_UPDATE_VALUES(breath) loc.assume_air(breath) + var/static/sound/breathing = sound('sound/voice/breathing.ogg', volume = 50, channel = CHANNEL_BREATHING) + if((!forced && . && COOLDOWN_FINISHED(src, breath_sound_cd) && environment?.returnPressure() < SOUND_MINIMUM_PRESSURE)) + src << breathing + COOLDOWN_START(src, breath_sound_cd, 3.5 SECONDS) + /mob/living/carbon/proc/has_smoke_protection() if(HAS_TRAIT(src, TRAIT_NOBREATH)) return TRUE @@ -146,27 +156,26 @@ //Third link in a breath chain, calls handle_breath_temperature() -/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath) +/mob/living/carbon/proc/check_breath(datum/gas_mixture/breath, forced = FALSE) if(status_flags & GODMODE) failed_last_breath = FALSE clear_alert(ALERT_NOT_ENOUGH_OXYGEN) return FALSE + if(HAS_TRAIT(src, TRAIT_NOBREATH)) return FALSE var/obj/item/organ/lungs = getorganslot(ORGAN_SLOT_LUNGS) - if(!lungs) - adjustOxyLoss(4) - //CRIT - if(!breath || (breath.total_moles == 0) || !lungs) - if(reagents.has_reagent(/datum/reagent/medicine/epinephrine, needs_metabolizing = TRUE) && lungs) - return FALSE - adjustOxyLoss(2) - failed_last_breath = TRUE - throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) - return FALSE + if(!forced) + if(!breath || (breath.total_moles == 0) || !lungs || nervous_system_failure()) + if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE)) + adjustOxyLoss(HUMAN_FAILBREATH_OXYLOSS) + + failed_last_breath = TRUE + throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) + return FALSE var/list/breath_gases = breath.gas var/safe_oxy_min = 16 @@ -177,6 +186,9 @@ var/oxygen_used = 0 var/breath_pressure = (breath.total_moles*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME + if(CHEM_EFFECT_MAGNITUDE(src, CE_BREATHLOSS) && !HAS_TRAIT(src, TRAIT_NOCRITDAMAGE)) + safe_oxy_min *= 1 + rand(1, 4) * CHEM_EFFECT_MAGNITUDE(src, CE_BREATHLOSS) + var/O2_partialpressure = (breath_gases[GAS_OXYGEN]/breath.total_moles)*breath_pressure var/Plasma_partialpressure = (breath_gases[GAS_PLASMA]/breath.total_moles)*breath_pressure var/CO2_partialpressure = (breath_gases[GAS_CO2]/breath.total_moles)*breath_pressure @@ -232,7 +244,6 @@ var/SA_partialpressure = (breath_gases[GAS_N2O]/breath.total_moles)*breath_pressure if(SA_partialpressure > SA_para_min) throw_alert(ALERT_TOO_MUCH_N2O, /atom/movable/screen/alert/too_much_n2o) - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") Unconscious(60) if(SA_partialpressure > SA_sleep_min) Sleeping(max(AmountSleeping() + 40, 200)) @@ -240,79 +251,11 @@ clear_alert(ALERT_TOO_MUCH_N2O) if(prob(20)) emote(pick("giggle","laugh")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") clear_alert(ALERT_TOO_MUCH_N2O) else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") clear_alert(ALERT_TOO_MUCH_N2O) - //BZ (Facepunch port of their Agent B) - /* - if(breath_gases[/datum/gas/bz]) - var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.get_moles())*breath_pressure - if(bz_partialpressure > 1) - hallucination += 10 - else if(bz_partialpressure > 0.01) - hallucination += 5 - */ - //NITRIUM - /* - if(breath_gases[/datum/gas/nitrium]) - var/nitrium_partialpressure = (breath_gases[/datum/gas/nitrium][MOLES]/breath.get_moles())*breath_pressure - if(nitrium_partialpressure > 0.5) - adjustFireLoss(nitrium_partialpressure * 0.15) - if(nitrium_partialpressure > 5) - adjustToxLoss(nitrium_partialpressure * 0.05) - - //FREON - if(breath_gases[/datum/gas/freon]) - var/freon_partialpressure = (breath_gases[/datum/gas/freon][MOLES]/breath.get_moles())*breath_pressure - adjustFireLoss(freon_partialpressure * 0.25) - - //MIASMA - if(breath_gases[/datum/gas/miasma]) - var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.get_moles())*breath_pressure - - if(prob(1 * miasma_partialpressure)) - var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3) - miasma_disease.name = "Unknown" - ForceContractDisease(miasma_disease, TRUE, TRUE) - - //Miasma side effects - switch(miasma_partialpressure) - if(0.25 to 5) - // At lower pp, give out a little warning - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") - if(prob(5)) - to_chat(src, span_notice("There is an unpleasant smell in the air.")) - if(5 to 20) - //At somewhat higher pp, warning becomes more obvious - if(prob(15)) - to_chat(src, span_warning("You smell something horribly decayed inside this room.")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/bad_smell) - if(15 to 30) - //Small chance to vomit. By now, people have internals on anyway - if(prob(5)) - to_chat(src, span_warning("The stench of rotting carcasses is unbearable!")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - vomit() - if(30 to INFINITY) - //Higher chance to vomit. Let the horror start - if(prob(25)) - to_chat(src, span_warning("The stench of rotting carcasses is unbearable!")) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "smell", /datum/mood_event/disgust/nauseating_stench) - vomit() - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") - - //Clear all moods if no miasma at all - else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "smell") - - breath.garbage_collect() - */ //BREATH TEMPERATURE handle_breath_temperature(breath) @@ -324,15 +267,19 @@ breath.temperature = bodytemperature /mob/living/carbon/proc/get_breath_from_internal(volume_needed) - if(internal) - if(internal.loc != src) - internal = null - else if ((!wear_mask || !(wear_mask.clothing_flags & MASKINTERNALS)) && !getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - internal = null - else - . = internal.remove_air_volume(volume_needed) - if(!.) - return FALSE //to differentiate between no internals and active, but empty internals + if(invalid_internals()) + // Unexpectely lost breathing apparatus and ability to breathe from the internal air tank. + cutoff_internals() + return + if (external) + . = external.remove_air_volume(volume_needed) + else if (internal) + . = internal.remove_air_volume(volume_needed) + else + // Return without taking a breath if there is no air tank. + return + // To differentiate between no internals and active, but empty internals. + return . || FALSE /mob/living/carbon/proc/handle_blood(delta_time, times_fired) return @@ -342,18 +289,19 @@ . |= limb.on_life(delta_time, times_fired) /mob/living/carbon/proc/handle_organs(delta_time, times_fired) + var/update if(stat == DEAD) - if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/cryostylane)) // No organ decay if the body contains formaldehyde. - return for(var/obj/item/organ/organ as anything in processing_organs) - organ.on_death(delta_time, times_fired) //Needed so organs decay while inside the body. + update += organ.on_death(delta_time, times_fired) //Needed so organs decay while inside the body. return + else + // NOTE: processing_organs is sorted by GLOB.organ_process_order on insertion + for(var/obj/item/organ/organ as anything in processing_organs) + if(organ?.owner) // This exist mostly because reagent metabolization can cause organ reshuffling + update += organ.on_life(delta_time, times_fired) - // NOTE: processing_organs is sorted by GLOB.organ_process_order on insertion - for(var/obj/item/organ/organ as anything in processing_organs) - if(organ?.owner) // This exist mostly because reagent metabolization can cause organ reshuffling - organ.on_life(delta_time, times_fired) - + if(update) + updatehealth() /mob/living/carbon/handle_diseases(delta_time, times_fired) for(var/thing in diseases) @@ -386,8 +334,7 @@ continue if(mut == UE_CHANGED) if(dna.previous["name"]) - real_name = dna.previous["name"] - name = real_name + set_real_name(dna.previous["name"]) dna.previous.Remove("name") if(dna.previous["UE"]) dna.unique_enzymes = dna.previous["UE"] @@ -401,6 +348,26 @@ if(HM?.timeout) dna.remove_mutation(HM.type) +/mob/living/carbon/handle_chemicals() + chem_effects.Cut() + + if(status_flags & GODMODE) + return + + if(touching) + . += touching.metabolize(src, can_overdose = FALSE, updatehealth = FALSE) + + if(stat != DEAD && !HAS_TRAIT(src, TRAIT_NOMETABOLISM)) + var/obj/item/organ/stomach/S = organs_by_slot[ORGAN_SLOT_STOMACH] + if(S?.reagents && !(S.organ_flags & ORGAN_DEAD)) + . += S.reagents.metabolize(src, can_overdose = TRUE, updatehealth = FALSE) + if(bloodstream) + . += bloodstream.metabolize(src, can_overdose = TRUE, updatehealth = FALSE) + + if(.) + updatehealth() + + /* Alcohol Poisoning Chart Note that all higher effects of alcohol poisoning will inherit effects for smaller amounts (i.e. light poisoning inherts from slight poisoning) @@ -425,13 +392,17 @@ All effects don't start immediately, but rather get worse over time; the rate is /mob/living/carbon/handle_status_effects(delta_time, times_fired) ..() - var/restingpwr = 0.5 + 2 * resting + var/restingpwr = 1 + 2 * resting - if(drowsyness) - adjust_drowsyness(-1 * restingpwr * delta_time) - blur_eyes(1 * delta_time) - if(DT_PROB(2.5, delta_time)) - AdjustSleeping(10 SECONDS) + if (drowsyness > 0) + adjust_drowsyness(-1 * restingpwr) + blur_eyes(2) + if(drowsyness > 10) + var/zzzchance = min(5, 5*drowsyness/30) + if((prob(zzzchance) || drowsyness >= 60) || ( drowsyness >= 20 && IsSleeping())) + if(stat == CONSCIOUS) + to_chat(src, span_notice("You are about to fall asleep...")) + Sleeping(5 SECONDS) if(silent) silent = max(silent - (0.5 * delta_time), 0) @@ -439,6 +410,11 @@ All effects don't start immediately, but rather get worse over time; the rate is if(hallucination) handle_hallucinations(delta_time, times_fired) + if(stasis_level > 1 && drowsyness < stasis_level * 4) + drowsyness += min(stasis_level, 3) + if(stat < UNCONSCIOUS && prob(1)) + to_chat(src, span_notice("You feel slow and sluggish...")) + /// Base carbon environment handler, adds natural stabilization /mob/living/carbon/handle_environment(datum/gas_mixture/environment, delta_time, times_fired) var/areatemp = get_temperature(environment) @@ -597,9 +573,11 @@ All effects don't start immediately, but rather get worse over time; the rate is if(.) return var/obj/item/organ/stomach/belly = getorganslot(ORGAN_SLOT_STOMACH) - if(!belly) - return FALSE - return belly.reagents.has_reagent(reagent, amount, needs_metabolizing) + if(belly) + . = belly.reagents.has_reagent(reagent, amount, needs_metabolizing) + + . ||= touching.has_reagent(reagent, amount, needs_metabolizing) + ///////// //LIVER// @@ -615,18 +593,16 @@ All effects don't start immediately, but rather get worse over time; the rate is if(liver) return - reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs - reagents.metabolize(src, delta_time, times_fired, can_overdose=FALSE, liverless = TRUE) - - if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_NOMETABOLISM)) + if(HAS_TRAIT(src, TRAIT_STABLELIVER) || !needs_organ(ORGAN_SLOT_LIVER)) return adjustToxLoss(0.6 * delta_time, TRUE, TRUE) - adjustOrganLoss(pick(ORGAN_SLOT_HEART, ORGAN_SLOT_LUNGS, ORGAN_SLOT_STOMACH, ORGAN_SLOT_EYES, ORGAN_SLOT_EARS), 0.5* delta_time) + if(DT_PROB(2, delta_time)) + vomit(50, TRUE, FALSE, 1, TRUE, harm = FALSE, purge_ratio = 1) /mob/living/carbon/proc/undergoing_liver_failure() var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) - if(liver?.organ_flags & ORGAN_FAILING) + if(liver?.organ_flags & ORGAN_DEAD) return TRUE ///////////// @@ -698,17 +674,10 @@ All effects don't start immediately, but rather get worse over time; the rate is ///////////////////////////////////// /mob/living/carbon/proc/can_heartattack() - if(!needs_heart()) + if(!needs_organ(ORGAN_SLOT_HEART) || HAS_TRAIT(src, TRAIT_STABLEHEART)) return FALSE var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - if(!heart || (heart.organ_flags & ORGAN_SYNTHETIC)) - return FALSE - return TRUE - -/mob/living/carbon/proc/needs_heart() - if(HAS_TRAIT(src, TRAIT_STABLEHEART)) - return FALSE - if(dna && dna.species && (NOBLOOD in dna.species.species_traits)) //not all carbons have species! + if(!heart || (heart.organ_flags & ORGAN_DEAD)) return FALSE return TRUE @@ -720,19 +689,30 @@ All effects don't start immediately, but rather get worse over time; the rate is * related situations (i.e not just cardiac arrest) */ /mob/living/carbon/proc/undergoing_cardiac_arrest() + if(isipc(src)) + var/obj/item/organ/cell/C = getorganslot(ORGAN_SLOT_CELL) + if(C && ((C.organ_flags & ORGAN_DEAD) || !C.get_percent())) + return TRUE + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) - if(istype(heart) && heart.beating) + if(istype(heart) && heart.is_working()) return FALSE - else if(!needs_heart()) + else if(!needs_organ(ORGAN_SLOT_HEART)) return FALSE return TRUE /mob/living/carbon/proc/set_heartattack(status) - if(!can_heartattack()) - return FALSE - var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) if(!istype(heart)) return + if(heart.organ_flags & ORGAN_SYNTHETIC) + return - heart.beating = !status + if(status) + if(heart.pulse) + heart.Stop() + return TRUE + else if(!heart.pulse) + heart.Restart() + heart.handle_pulse() + return TRUE diff --git a/code/modules/mob/living/carbon/pain.dm b/code/modules/mob/living/carbon/pain.dm new file mode 100644 index 000000000000..88a961cf2133 --- /dev/null +++ b/code/modules/mob/living/carbon/pain.dm @@ -0,0 +1,372 @@ +/mob/living + COOLDOWN_DECLARE(pain_cd) + COOLDOWN_DECLARE(pain_emote_cd) + +/mob/living/carbon + var/shock_stage + +/mob/living/carbon/getPain() + . = 0 + for(var/obj/item/bodypart/BP as anything in bodyparts) + . += BP.getPain() + + . -= CHEM_EFFECT_MAGNITUDE(src, CE_PAINKILLER) + + return max(0, .) + +/mob/living/carbon/adjustPain(amount, updating_health = TRUE) + if(((status_flags & GODMODE))) + return FALSE + return apply_pain(amount, updating_health = updating_health) + +/mob/living/proc/flash_pain(severity = PAIN_SMALL) + return + +/mob/living/carbon/flash_pain(severity = PAIN_SMALL) + if(!client || client.prefs?.read_preference(/datum/preference/toggle/disable_pain_flash)) + return + + flick(severity, hud_used?.pain) + +/mob/living/carbon/apply_pain(amount, def_zone, message, ignore_cd, updating_health = TRUE) + if((status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NO_PAINSHOCK)) + return FALSE + + if(amount == 0) + return + + if(amount > 0) + amount -= CHEM_EFFECT_MAGNITUDE(src, CE_PAINKILLER)/3 + if(amount <= 0) + return + + var/is_healing = amount < 0 + var/obj/item/bodypart/BP + + if(!def_zone) // Distribute to all bodyparts evenly if no bodypart + var/list/not_full = bodyparts.Copy() + var/list/parts = not_full.Copy() + var/amount_remaining = round(amount/2) + while(amount_remaining > 0 && length(not_full)) + if(!length(parts)) + parts += not_full + + var/pain_per_part = round(amount_remaining/length(parts), DAMAGE_PRECISION) + BP = pick(parts) + parts -= BP + + var/used = BP.adjustPain(pain_per_part) + if(!used) + not_full -= BP + continue + + amount_remaining -= abs(used) + . = amount - amount_remaining + else + if(isbodypart(def_zone)) + BP = def_zone + + BP ||= get_bodypart(def_zone, TRUE) + if(!BP) + return + + . = BP.adjustPain(amount) + + + if(. && !is_healing) + notify_pain(amount, message, ignore_cd) + + if(updating_health && .) + update_health_hud() + +/// Flashes the pain overlay and provides a chat message. +/mob/living/carbon/proc/notify_pain(amount, message, ignore_cd) + if(stat != CONSCIOUS) + return + + if(amount >= PAIN_AMT_AGONIZING) + flash_pain(PAIN_LARGE) + shake_camera(src, 3, 4) + else if(amount >= PAIN_AMT_MEDIUM) + flash_pain(PAIN_MEDIUM) + shake_camera(src, 1, 2) + else if(amount >= PAIN_AMT_LOW) + flash_pain(PAIN_SMALL) + + if(message) + pain_message(message, amount, ignore_cd) + +/mob/living/carbon/proc/pain_message(message, amount, ignore_cd) + set waitfor = FALSE + if(!amount || (stat != CONSCIOUS) || HAS_TRAIT(src, TRAIT_FAKEDEATH)) + return FALSE + + . = COOLDOWN_FINISHED(src, pain_cd) + if(!ignore_cd && !.) + return FALSE + + if(message) + switch(round(amount)) + if(PAIN_AMT_AGONIZING to INFINITY) + to_chat(src, span_danger(span_big(message))) + if(PAIN_AMT_MEDIUM to PAIN_AMT_AGONIZING - 1) + to_chat(src, span_danger(message)) + if(PAIN_AMT_LOW to PAIN_AMT_MEDIUM - 1) + to_chat(src, span_danger(message)) + else + to_chat(src, span_warning(message)) + + if(.) + COOLDOWN_START(src, pain_cd, rand(8 SECONDS, 14 SECONDS)) + + return TRUE + +/mob/living/carbon/human/pain_message(message, amount, ignore_cd) + . = ..() + if(!.) + return + + var/emote = dna.species.get_pain_emote(amount) + var/probability = 0 + + switch(round(amount)) + if(PAIN_AMT_AGONIZING to INFINITY) + probability = 100 + if(PAIN_AMT_MEDIUM to PAIN_AMT_AGONIZING - 1) + probability = 70 + if(1 to PAIN_AMT_MEDIUM - 1) + probability = 20 + + if(emote && prob(probability)) + pain_emote(amount) + +/// Perform a pain response emote, amount is the amount of pain they are in. See pain defines for easy numbers. +/mob/living/carbon/proc/pain_emote(amount = PAIN_AMT_LOW, bypass_cd) + if(!COOLDOWN_FINISHED(src, pain_emote_cd) && !bypass_cd) + return + + COOLDOWN_START(src, pain_emote_cd, 5 SECONDS) + var/emote = dna.species.get_pain_emote(amount) + if(findtext(emote, "me ", 1, 4)) + manual_emote(copytext(emote, 4)) + else + emote(emote) + +#define SHOCK_STRING_MINOR \ + pick("It hurts...",\ + "Uaaaghhhh...",\ + "Agh..."\ + ) + +#define SHOCK_STRING_MAJOR \ + pick("The pain is excruciating!",\ + "Please, just end the pain!",\ + "I can't feel anything!"\ + ) + +/mob/living/carbon/proc/handle_shock() + if(status_flags & GODMODE) + return + + if(HAS_TRAIT(src, TRAIT_FAKEDEATH)) + return + + if(HAS_TRAIT(src, TRAIT_NO_PAINSHOCK)) + shock_stage = 0 + return + + var/heart_attack_gaming = undergoing_cardiac_arrest() + if(heart_attack_gaming) + shock_stage = max(shock_stage + 1, SHOCK_TIER_4 + 1) + + var/pain = getPain() + if(pain >= max(SHOCK_MIN_PAIN_TO_BEGIN, shock_stage * 0.8)) + // A chance to fight through the pain. + if((shock_stage >= SHOCK_TIER_3) && stat == CONSCIOUS && !heart_attack_gaming && stats.cooldown_finished("shrug_off_pain")) + var/datum/roll_result/result = stat_roll(12, /datum/rpg_skill/willpower) + switch(result.outcome) + if(CRIT_SUCCESS) + + to_chat(src, result.create_tooltip("Pain is temporary, I will not die on this day! (Shock reduced)")) + shock_stage = max(shock_stage - 15, 0) + stats.set_cooldown("shrug_off_pain", 60 SECONDS) + return + + if(SUCCESS) + shock_stage = max(shock_stage - 5, 0) + to_chat(src, result.create_tooltip("Not here, not now. (Pain shrugged off)")) + stats.set_cooldown("shrug_off_pain", 30 SECONDS) + return + + if(FAILURE) + stats.set_cooldown("shrug_off_pain", 30 SECONDS) + // Do not return + + if(CRIT_FAILURE) + shock_stage = min(shock_stage + 1, SHOCK_MAXIMUM) + to_chat(src, result.create_tooltip("I'm going to die here. (Shock increased)")) + stats.set_cooldown("shrug_off_pain", 30 SECONDS) + // Do not return + + shock_stage = min(shock_stage + 1, SHOCK_MAXIMUM) + + else if(!heart_attack_gaming) + shock_stage = min(shock_stage, SHOCK_MAXIMUM) + var/recovery = 1 + if(pain < 0.5 * shock_stage) + recovery = 3 + else if(pain < 0.25 * shock_stage) + recovery = 2 + + shock_stage = max(shock_stage - recovery, 0) + return + + if(stat) + return + + var/message = "" + if(shock_stage == SHOCK_TIER_1) + message = SHOCK_STRING_MINOR + + if((shock_stage > SHOCK_TIER_2 && prob(2)) || shock_stage == SHOCK_TIER_2) + if(shock_stage == SHOCK_TIER_2 && organs_by_slot[ORGAN_SLOT_EYES]) + manual_emote("is having trouble keeping [p_their()] eyes open.") + blur_eyes(5) + set_timed_status_effect(10 SECONDS, /datum/status_effect/speech/stutter, only_if_higher = TRUE) + + if(shock_stage == SHOCK_TIER_3) + message = SHOCK_STRING_MAJOR + + else if(shock_stage >= SHOCK_TIER_3) + if(prob(20)) + set_timed_status_effect(5 SECONDS, /datum/status_effect/speech/stutter, only_if_higher = TRUE) + + if((shock_stage > SHOCK_TIER_4 && prob(5)) || shock_stage == SHOCK_TIER_4) + message = SHOCK_STRING_MAJOR + manual_emote("stumbles over [p_them()]self.") + Knockdown(2 SECONDS) + + else if((shock_stage > SHOCK_TIER_5 && prob(10)) || shock_stage == SHOCK_TIER_5) + message = SHOCK_STRING_MAJOR + manual_emote("stumbles over [p_them()]self.") + Knockdown(2 SECONDS) + + if((shock_stage > SHOCK_TIER_6 && prob(2)) || shock_stage == SHOCK_TIER_6) + if (stat == CONSCIOUS) + pain_message(pick("You black out.", "I feel like I could die any moment now.", "I can't go on anymore."), shock_stage - CHEM_EFFECT_MAGNITUDE(src, CE_PAINKILLER)/3) + Unconscious(10 SECONDS) + return // We'll be generous + + if(shock_stage >= SHOCK_TIER_7) + if(shock_stage == SHOCK_TIER_7) + visible_message("[src] falls limp!") + Unconscious(20 SECONDS) + + if(message) + pain_message(message, shock_stage - CHEM_EFFECT_MAGNITUDE(src, CE_PAINKILLER)/3) + +#undef SHOCK_STRING_MINOR +#undef SHOCK_STRING_MAJOR + +/mob/living/carbon/proc/handle_pain() + if(stat == DEAD) + return + + var/pain = getPain() + /// Brain health scales the pain passout modifier with an importance of 80% + var/brain_health_factor = 1 + ((maxHealth - getBrainLoss()) / maxHealth - 1) * 0.8 + /// Blood circulation scales the pain passout modifier with an importance of 40% + var/blood_circulation_factor = 1 + (get_blood_circulation() / 100 - 1) * 0.4 + + var/pain_passout = min(PAIN_AMT_PASSOUT * brain_health_factor * blood_circulation_factor, PAIN_AMT_PASSOUT) + + if(pain <= max((pain_passout * 0.075), 10)) + var/slowdown = min(pain * (PAIN_MAX_SLOWDOWN / pain_passout), PAIN_MAX_SLOWDOWN) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/pain, TRUE, slowdown) + else + remove_movespeed_modifier(/datum/movespeed_modifier/pain) + + if(pain >= pain_passout) + if(!stat && !HAS_TRAIT(src, TRAIT_FAKEDEATH)) + visible_message( + span_danger("[src] slumps over, too weak to continue fighting..."), + span_danger("You give into the pain.") + ) + log_health(src, "Passed out due to excessive pain: [pain] | Threshold: [pain_passout]") + Unconscious(10 SECONDS) + return + + if(stat != CONSCIOUS) + return + + var/pain_timeleft = COOLDOWN_TIMELEFT(src, pain_cd) + if(pain_timeleft && !prob(5)) + // At 40 pain, the pain cooldown ticks 50% faster, since handle_pain() runs every two seconds + COOLDOWN_START(src, pain_cd, round(pain_timeleft - (pain / 40))) + return + + var/highest_damage + var/obj/item/bodypart/damaged_part + for(var/obj/item/bodypart/loop as anything in bodyparts) + if(loop.bodypart_flags & BP_NO_PAIN) + continue + + var/dam = loop.getPain() + if(dam && dam > highest_damage && (highest_damage == 0 || prob(70))) + damaged_part = loop + highest_damage = dam + + if(damaged_part && CHEM_EFFECT_MAGNITUDE(src, CE_PAINKILLER) < highest_damage) + if(highest_damage > PAIN_THRESHOLD_REDUCE_PARALYSIS) + AdjustSleeping(-(highest_damage / 5) SECONDS) + if(highest_damage > PAIN_THRESHOLD_DROP_ITEM && prob(highest_damage / 5)) + var/obj/item/I = get_active_held_item() + if(I && dropItemToGround(I)) + visible_message(span_alert("[src] twitches, dropping their [I].")) + + var/burning = damaged_part.burn_dam > damaged_part.brute_dam + var/msg + switch(highest_damage) + if(1 to PAIN_AMT_MEDIUM) + msg = "Your [damaged_part.plaintext_zone] [burning ? "burns" : "hurts"]." + if(PAIN_AMT_MEDIUM to PAIN_AMT_AGONIZING) + msg = "Your [damaged_part.plaintext_zone] [burning ? "burns" : "hurts"] badly!" + if(PAIN_AMT_AGONIZING to INFINITY) + msg = "OH GOD! Your [damaged_part.plaintext_zone] is [burning ? "on fire" : "hurting terribly"]!" + + pain_message(msg, highest_damage) + + + // Damage to internal organs hurts a lot. + for(var/obj/item/organ/I as anything in organs) + if(istype(I, /obj/item/organ/brain)) + continue + + if(prob(1) && (!(I.organ_flags & (ORGAN_SYNTHETIC|ORGAN_DEAD)) && I.damage > 5)) + var/obj/item/bodypart/parent = I.ownerlimb + if(parent.bodypart_flags & BP_NO_PAIN) + continue + + var/pain_given = 10 + var/message = "You feel a dull pain in your [parent.plaintext_zone]" + if(I.damage > I.low_threshold) + pain_given = 25 + message = "You feel a pain in your [parent.plaintext_zone]" + if(I.damage > (I.high_threshold * I.maxHealth)) + pain_given = 40 + message = "You feel a sharp pain in your [parent.plaintext_zone]" + apply_pain(pain_given, parent.body_zone, message) + + if(prob(1)) + var/systemic_organ_failure = getToxLoss() + switch(systemic_organ_failure) + if(5 to 17) + pain_message("Your body stings slightly.", 10) + if(17 to 35) + pain_message("Your body stings.", 20) + if(35 to 60) + pain_message("Your body stings strongly.", 40) + if(60 to 100) + pain_message("Your whole body hurts badly.", 40) + if(100 to INFINITY) + pain_message("Your body aches all over, it's driving you mad.", 70) diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index 65a858f5fcff..368568f45575 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -18,17 +18,13 @@ return if(HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) //Already in stamcrit return - if(absorb_stun(0)) //continuous effect, so we don't want it to increment the stuns absorbed. - return var/chance = STAMINA_SCALING_STUN_BASE + (STAMINA_SCALING_STUN_SCALER * stamina.current * STAMINA_STUN_THRESHOLD_MODIFIER) if(!prob(chance)) return - visible_message( - span_danger("[src] slumps over, too weak to continue fighting..."), - span_userdanger("You're too exhausted to continue fighting..."), - span_hear("You hear something hit the floor.") - ) + if(absorb_stun(1)) + return + ADD_TRAIT(src, TRAIT_INCAPACITATED, STAMINA) ADD_TRAIT(src, TRAIT_IMMOBILIZED, STAMINA) ADD_TRAIT(src, TRAIT_FLOORED, STAMINA) @@ -48,7 +44,6 @@ /mob/living/carbon/set_disgust(amount) disgust = clamp(amount, 0, DISGUST_LEVEL_MAXEDOUT) - ////////////////////////////////////////TRAUMAS///////////////////////////////////////// /mob/living/carbon/proc/get_traumas() diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm index 13951b52c06b..2474c9d02785 100644 --- a/code/modules/mob/living/damage_procs.dm +++ b/code/modules/mob/living/damage_procs.dm @@ -168,7 +168,7 @@ /mob/living/proc/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE, required_status) if(!forced && (status_flags & GODMODE)) return FALSE - bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + bruteloss = clamp((bruteloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth) if(updating_health) updatehealth() return amount @@ -179,28 +179,29 @@ /mob/living/proc/adjustOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return + if(amount < 0 && oxyloss == 0) //Micro optimize the life loop primarily. Dont call updatehealth if we didnt do shit. + return + . = oxyloss - oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + oxyloss = clamp((oxyloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth) if(updating_health) updatehealth() - /mob/living/proc/setOxyLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && status_flags & GODMODE) return . = oxyloss - oxyloss = amount + oxyloss = clamp(amount, 0, maxHealth) if(updating_health) updatehealth() - /mob/living/proc/getToxLoss() return toxloss /mob/living/proc/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + toxloss = clamp((toxloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth) if(updating_health) updatehealth() return amount @@ -219,7 +220,7 @@ /mob/living/proc/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && (status_flags & GODMODE)) return FALSE - fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + fireloss = clamp((fireloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth) if(updating_health) updatehealth() return amount @@ -230,7 +231,7 @@ /mob/living/proc/adjustCloneLoss(amount, updating_health = TRUE, forced = FALSE) if(!forced && ( (status_flags & GODMODE) || HAS_TRAIT(src, TRAIT_NOCLONELOSS)) ) return FALSE - cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth * 2) + cloneloss = clamp((cloneloss + (amount * CONFIG_GET(number/damage_multiplier))), 0, maxHealth) if(updating_health) updatehealth() return amount @@ -243,7 +244,7 @@ updatehealth() return amount -/mob/living/proc/adjustOrganLoss(slot, amount, maximum) +/mob/living/proc/adjustOrganLoss(slot, amount, maximum, updating_health) return /mob/living/proc/setOrganLoss(slot, amount, maximum) @@ -252,6 +253,9 @@ /mob/living/proc/getOrganLoss(slot) return +/mob/living/proc/getBrainLoss() + return + /mob/living/proc/setStaminaLoss(amount, updating_health = TRUE, forced = FALSE) return @@ -260,10 +264,8 @@ * * needs to return amount healed in order to calculate things like tend wounds xp gain */ -/mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, stamina = 0, updating_health = TRUE, required_status) +/mob/living/proc/heal_bodypart_damage(brute = 0, burn = 0, updating_health = TRUE, required_status) . = (adjustBruteLoss(-brute, FALSE) + adjustFireLoss(-burn, FALSE)) //zero as argument for no instant health update - if(stamina) - stack_trace("heal_bodypart_damage tried to heal stamina!") if(updating_health) updatehealth() @@ -301,3 +303,27 @@ if(!amount) break . -= amount //if there's leftover healing, remove it from what we return + + +/mob/living/proc/adjustPain(amount, updating_health = TRUE) + if(((status_flags & GODMODE))) + return FALSE + return adjustBruteLoss(amount, updating_health = updating_health) + +/mob/living/proc/getPain() + return 0 + +/** + * Applies pain to a mob. + * + * Arguments: + * * amount - amount to apply + * * def_zone - Body zone to adjust the pain of. If null, will be divided amongst all bodyparts + * * message - A to_chat() to play if the target hasn't had one in a while. + * * ignore_cd - Ignores the message cooldown. + * * updating_health - Should this proc call updatehealth()? + * + * * Returns TRUE if pain changed. + */ +/mob/living/proc/apply_pain(amount, def_zone, message, ignore_cd, updating_health = TRUE) + return adjustPain(amount, updating_health) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 09423e5001a9..1d3ce451e6d7 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -71,6 +71,7 @@ /mob/living/proc/death(gibbed) set_stat(DEAD) unset_machine() + timeofdeath = world.time tod = stationtime2text() var/turf/T = get_turf(src) @@ -79,18 +80,19 @@ if(SSlag_switch.measures[DISABLE_DEAD_KEYLOOP] && !client?.holder) to_chat(src, span_deadsay(span_big("Observer freelook is disabled.\nPlease use Orbit, Teleport, and Jump to look around."))) ghostize(TRUE) + set_disgust(0) SetSleeping(0, 0) + reset_perspective(null) reload_fullscreen() update_mob_action_buttons() update_damage_hud() update_health_hud() - med_hud_set_health() - med_hud_set_status() - stop_pulling() + update_med_hud() + + release_all_grabs() - set_ssd_indicator(FALSE) set_typing_indicator(FALSE) SEND_SIGNAL(src, COMSIG_LIVING_DEATH, gibbed) @@ -99,4 +101,6 @@ if (client) client.move_delay = initial(client.move_delay) + if(!gibbed) + AddComponent(/datum/component/spook_factor, SPOOK_AMT_CORPSE) return TRUE diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 0103ae984c1c..511219daa85d 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -105,14 +105,15 @@ key = "deathgasp" key_third_person = "deathgasps" message = "seizes up and falls limp, their eyes dead and lifeless..." - message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." + message_robot = "gives one shrill beep before falling lifeless." message_AI = "screeches, its screen flickering as its systems slowly halt." message_alien = "lets out a waning guttural screech, and collapses onto the floor..." message_larva = "lets out a sickly hiss of air and falls limply to the floor..." message_monkey = "lets out a faint chimper as it collapses and stops moving..." message_simple = "stops moving..." + message_ipc = "gives one shrill beep before falling lifeless." cooldown = (15 SECONDS) - stat_allowed = HARD_CRIT + stat_allowed = UNCONSCIOUS /datum/emote/living/deathgasp/run_emote(mob/user, params, type_override, intentional) var/mob/living/simple_animal/S = user @@ -123,12 +124,14 @@ if(.) if(isliving(user)) var/mob/living/L = user - if(!L.can_speak_vocal() || L.oxyloss >= 50) + if(!L.can_speak_vocal() || L.getOxyLoss() >= 50) return //stop the sound if oxyloss too high/cant speak if(!user.deathsound) if(!ishuman(user)) return - playsound(user, pick('goon/sounds/voice/death_1.ogg', 'goon/sounds/voice/death_2.ogg'), 100, 0) + var/mob/living/carbon/human/H = user + + playsound(H, H.dna?.species.get_deathgasp_sound(H), 100, 0) return playsound(user, user.deathsound, 200, TRUE, TRUE) @@ -192,7 +195,6 @@ key_third_person = "gasps" message = "gasps!" emote_type = EMOTE_AUDIBLE - stat_allowed = HARD_CRIT /datum/emote/living/gasp/get_sound(mob/living/user, involuntary) if(!iscarbon(user)) @@ -461,6 +463,7 @@ if(.) var/mob/living/L = user COOLDOWN_RESET(L, smell_time) + L.handle_smell() /datum/emote/living/snore key = "snore" @@ -494,16 +497,11 @@ message = "puts their hands on their head and falls to the ground, they surrender%s!" emote_type = EMOTE_AUDIBLE -//PARIAH EDIT - moved combat_indicator.dm in the indicators module -/* /datum/emote/living/surrender/run_emote(mob/user, params, type_override, intentional) . = ..() if(. && isliving(user)) var/mob/living/L = user L.Paralyze(200) - L.remove_status_effect(/datum/status_effect/grouped/surrender) -*/ -//PARIAH EDIT END /datum/emote/living/sway key = "sway" diff --git a/code/modules/mob/living/init_signals.dm b/code/modules/mob/living/init_signals.dm index 271da038c2a0..957a9206b2b5 100644 --- a/code/modules/mob/living/init_signals.dm +++ b/code/modules/mob/living/init_signals.dm @@ -27,8 +27,8 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_INCAPACITATED), PROC_REF(on_incapacitated_trait_loss)) - RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_RESTRAINED), PROC_REF(on_restrained_trait_gain)) - RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_RESTRAINED), PROC_REF(on_restrained_trait_loss)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_ARMS_RESTRAINED), PROC_REF(on_restrained_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_ARMS_RESTRAINED), PROC_REF(on_restrained_trait_loss)) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_EXPERIENCING_AIRFLOW), PROC_REF(on_airflow_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_EXPERIENCING_AIRFLOW), PROC_REF(on_airflow_trait_loss)) @@ -36,20 +36,20 @@ RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_EXHAUSTED), PROC_REF(on_exhausted_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_EXHAUSTED), PROC_REF(on_exhausted_trait_loss)) - RegisterSignal(src, list( - SIGNAL_ADDTRAIT(TRAIT_CRITICAL_CONDITION), - SIGNAL_REMOVETRAIT(TRAIT_CRITICAL_CONDITION), - - SIGNAL_ADDTRAIT(TRAIT_NODEATH), - SIGNAL_REMOVETRAIT(TRAIT_NODEATH), - ), PROC_REF(update_succumb_action)) - RegisterSignal(src, COMSIG_MOVETYPE_FLAG_ENABLED, PROC_REF(on_movement_type_flag_enabled)) RegisterSignal(src, COMSIG_MOVETYPE_FLAG_DISABLED, PROC_REF(on_movement_type_flag_disabled)) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_gain)) RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_SKITTISH), PROC_REF(on_skittish_trait_loss)) + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_CLUMSY), PROC_REF(on_clumsy_trait_gain)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_CLUMSY), PROC_REF(on_clumsy_trait_loss)) + + RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_BLURRY_VISION), SIGNAL_REMOVETRAIT(TRAIT_BLURRY_VISION)), PROC_REF(blurry_vision_change)) + + RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_DEAF), PROC_REF(on_hearing_loss)) + RegisterSignal(src, SIGNAL_REMOVETRAIT(TRAIT_DEAF), PROC_REF(on_hearing_regain)) + RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_NEGATES_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_NEGATES_GRAVITY)), PROC_REF(on_negate_gravity)) RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_IGNORING_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_IGNORING_GRAVITY)), PROC_REF(on_ignore_gravity)) RegisterSignal(src, list(SIGNAL_ADDTRAIT(TRAIT_FORCED_GRAVITY), SIGNAL_REMOVETRAIT(TRAIT_FORCED_GRAVITY)), PROC_REF(on_force_gravity)) @@ -162,8 +162,7 @@ /mob/living/proc/on_pull_blocked_trait_gain(datum/source) SIGNAL_HANDLER mobility_flags &= ~(MOBILITY_PULL) - if(pulling) - stop_pulling() + release_all_grabs() /// Called when [TRAIT_PULL_BLOCKED] is removed from the mob. /mob/living/proc/on_pull_blocked_trait_loss(datum/source) @@ -186,28 +185,15 @@ update_appearance() -/// Called when [TRAIT_RESTRAINED] is added to the mob. +/// Called when [TRAIT_ARMS_RESTRAINED] is added to the mob. /mob/living/proc/on_restrained_trait_gain(datum/source) SIGNAL_HANDLER - ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, TRAIT_RESTRAINED) + ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, TRAIT_ARMS_RESTRAINED) -/// Called when [TRAIT_RESTRAINED] is removed from the mob. +/// Called when [TRAIT_ARMS_RESTRAINED] is removed from the mob. /mob/living/proc/on_restrained_trait_loss(datum/source) SIGNAL_HANDLER - REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, TRAIT_RESTRAINED) - - -/** - * Called when traits that alter succumbing are added/removed. - * - * Will show or hide the succumb alert prompt. - */ -/mob/living/proc/update_succumb_action() - SIGNAL_HANDLER - if (CAN_SUCCUMB(src)) - throw_alert(ALERT_SUCCUMB, /atom/movable/screen/alert/succumb) - else - clear_alert(ALERT_SUCCUMB) + REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, TRAIT_ARMS_RESTRAINED) ///From [element/movetype_handler/on_movement_type_trait_gain()] /mob/living/proc/on_movement_type_flag_enabled(datum/source, flag, old_movement_type) @@ -230,6 +216,16 @@ SIGNAL_HANDLER RemoveElement(/datum/element/skittish) +/// Called when [TRAIT_CLUMSY] is added to the mob. +/mob/living/proc/on_clumsy_trait_gain(datum/source) + SIGNAL_HANDLER + stats?.set_skill_modifier(-2, /datum/rpg_skill/skirmish, SKILL_SOURCE_CLUMSY) + +/// Called when [TRAIT_CLUMSY] is removed from the mob. +/mob/living/proc/on_clumsy_trait_loss(datum/source) + SIGNAL_HANDLER + stats?.remove_skill_modifier(/datum/rpg_skill/skirmish, SKILL_SOURCE_CLUMSY) + /// Called when [TRAIT_EXPERIENCING_AIRFLOW] is added to the mob. /mob/living/proc/on_airflow_trait_gain(datum/source) SIGNAL_HANDLER @@ -278,3 +274,17 @@ if(remove_movespeed_modifier(/datum/movespeed_modifier/living_exhaustion)) to_chat(src, span_notice("You catch your breath.")) +/// Called when [TRAIT_BLURRY_EYES] is added or removed +/mob/living/proc/blurry_vision_change(datum/source) + SIGNAL_HANDLER + update_eye_blur() + +///Called when [TRAIT_DEAF] is added to the mob. +/mob/living/proc/on_hearing_loss() + SIGNAL_HANDLER + refresh_looping_ambience() + +///Called when [TRAIT_DEAF] is added to the mob. +/mob/living/proc/on_hearing_regain() + SIGNAL_HANDLER + refresh_looping_ambience() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1511bbdb067b..1845ed251b69 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -39,6 +39,8 @@ if(!loc) return + life_ticks++ + if(!IS_IN_STASIS(src)) if(stat != DEAD) @@ -47,7 +49,9 @@ if(stat != DEAD) //Breathing, if applicable - handle_breathing(delta_time, times_fired) + handle_breathing(times_fired) + + handle_chemicals() handle_diseases(delta_time, times_fired)// DEAD check is in the proc itself; we want it to spread even if the mob is dead, but to handle its disease-y properties only if you're not. @@ -55,20 +59,23 @@ return if(stat != DEAD) + handle_smell() //Random events (vomiting etc) handle_random_events(delta_time, times_fired) //Handle temperature/pressure differences between body and environment var/datum/gas_mixture/environment = loc.return_air() if(environment) - handle_environment(environment, delta_time, times_fired) - - handle_gravity(delta_time, times_fired) + if(handle_environment(environment, delta_time, times_fired)) + updatehealth() if(stat != DEAD) handle_traits(delta_time, times_fired) // eye, ear, brain damages handle_status_effects(delta_time, times_fired) //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc + if(!IS_IN_HARD_STASIS(src)) + handle_gravity(delta_time, times_fired) + if(machine) machine.check_eye(src) @@ -88,6 +95,9 @@ /mob/living/proc/handle_random_events(delta_time, times_fired) return +/mob/living/proc/handle_chemicals() + return + // Base mob environment handler for body temperature /mob/living/proc/handle_environment(datum/gas_mixture/environment, delta_time, times_fired) var/loc_temp = get_temperature(environment) @@ -179,4 +189,16 @@ var/grav_strength = gravity - GRAVITY_DAMAGE_THRESHOLD adjustBruteLoss(min(GRAVITY_DAMAGE_SCALING * grav_strength, GRAVITY_DAMAGE_MAXIMUM) * delta_time) +/mob/living/proc/handle_smell() + if(!next_smell || !COOLDOWN_FINISHED(src, smell_time) || !can_smell()) + return + + var/datum/component/smell/S = next_smell.resolve() + next_smell = null + if(QDELETED(S) || (get_dist(get_turf(src), get_turf(S.parent)) > S.radius)) + return + + S.print_to(src) + COOLDOWN_START(src, smell_time, S.cooldown) + #undef BODYTEMP_DIVISOR diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0f2e438652cd..aef0337cd93a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,34 +1,34 @@ /mob/living/Initialize(mapload) . = ..() stamina = new(src) + stats = new(src) register_init_signals() if(unique_name) - set_name() + give_unique_name() var/datum/atom_hud/data/human/medical/advanced/medhud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medhud.add_to_hud(src) + medhud.add_atom_to_hud(src) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) + diag_hud.add_atom_to_hud(src) faction += "[REF(src)]" GLOB.mob_living_list += src SSpoints_of_interest.make_point_of_interest(src) voice_type = pick(voice_type2sound) - gravity_setup() - -/mob/living/ComponentInitialize() - . = ..() AddElement(/datum/element/movetype_handler) + gravity_setup() /mob/living/prepare_huds() ..() prepare_data_huds() /mob/living/proc/prepare_data_huds() - med_hud_set_health() - med_hud_set_status() + update_med_hud() /mob/living/Destroy() - qdel(stamina) + QDEL_NULL(z_eye) + QDEL_NULL(stamina) + QDEL_NULL(stats) + for(var/datum/status_effect/effect as anything in status_effects) // The status effect calls on_remove when its mob is deleted if(effect.on_remove_on_mob_delete) @@ -44,10 +44,23 @@ remove_from_all_data_huds() GLOB.mob_living_list -= src QDEL_LAZYLIST(diseases) - QDEL_LIST(surgeries) return ..() /mob/living/onZImpact(turf/T, levels, message = TRUE) + if(m_intent == MOVE_INTENT_WALK && levels <= 1 && !throwing && !incapacitated()) + visible_message( + span_notice("[src] climbs down from the floor above.") + ) + Stun(1 SECOND, TRUE) + setDir(global.reverse_dir[dir]) + var/old_pixel_y = pixel_y + var/old_alpha = alpha + pixel_y = pixel_y + 32 + alpha = 90 + animate(src, time = 1 SECONDS, pixel_y = old_pixel_y) + animate(src, time = 1 SECONDS, alpha = old_alpha, flags = ANIMATION_PARALLEL) + return + if(!isgroundlessturf(T)) ZImpactDamage(T, levels) message = FALSE @@ -56,10 +69,16 @@ /mob/living/proc/ZImpactDamage(turf/T, levels) if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE) return - visible_message(span_danger("[src] crashes into [T] with a sickening noise!"), \ - span_userdanger("You crash into [T] with a sickening noise!")) + + visible_message(span_danger("[src] slams into [T]!"), blind_message = span_hear("You hear something slam into the deck.")) + TakeFallDamage(levels) + return TRUE + +/mob/living/proc/TakeFallDamage(levels) adjustBruteLoss((levels * 5) ** 1.5) - Knockdown(levels * 50) + Knockdown(levels * 5 SECONDS) + Stun(levels * 2 SECONDS) + return TRUE //Generic Bump(). Override MobBump() and ObjBump() instead of this. /mob/living/Bump(atom/A) @@ -80,12 +99,16 @@ if(PushAM(AM, move_force)) return -/mob/living/Bumped(atom/movable/AM) +/mob/living/BumpedBy(atom/movable/AM) ..() last_bumped = world.time //Called when we bump onto a mob /mob/living/proc/MobBump(mob/M) + //No bumping/swapping/pushing others if you are on walk intent + if(m_intent == MOVE_INTENT_WALK) + return TRUE + SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) @@ -93,13 +116,9 @@ if(now_pushing) return TRUE - var/they_can_move = TRUE - var/their_combat_mode = FALSE if(isliving(M)) var/mob/living/L = M - their_combat_mode = L.combat_mode - they_can_move = L.mobility_flags & MOBILITY_MOVE //Also spread diseases for(var/thing in diseases) var/datum/disease/D = thing @@ -112,90 +131,107 @@ ContactContractDisease(D) //Should stop you pushing a restrained person out of the way - if(L.pulledby && L.pulledby != src && HAS_TRAIT(L, TRAIT_RESTRAINED)) + if(LAZYLEN(L.grabbed_by) && !is_grabbing(L) && HAS_TRAIT(L, TRAIT_ARMS_RESTRAINED)) if(!(world.time % 5)) to_chat(src, span_warning("[L] is restrained, you cannot push past.")) return TRUE - if(L.pulling) - if(ismob(L.pulling)) - var/mob/P = L.pulling - if(HAS_TRAIT(P, TRAIT_RESTRAINED)) - if(!(world.time % 5)) - to_chat(src, span_warning("[L] is restraining [P], you cannot push past.")) - return TRUE + var/list/grabs = L.active_grabs + if(length(grabs)) + for(var/obj/item/hand_item/grab/G in grabs) + if(ismob(G.affecting)) + var/mob/P = G.affecting + if(HAS_TRAIT(P, TRAIT_ARMS_RESTRAINED)) + if(!(world.time % 5)) + to_chat(src, span_warning("[L] is restraining [P], you cannot push past.")) + return TRUE if(moving_diagonally)//no mob swap during diagonal moves. return TRUE if(!M.buckled && !M.has_buckled_mobs()) - var/mob_swap = FALSE - var/too_strong = (M.move_resist > move_force) //can't swap with immovable objects unless they help us - if(!they_can_move) //we have to physically move them - if(!too_strong) - mob_swap = TRUE - else - //You can swap with the person you are dragging on grab intent, and restrained people in most cases - if(M.pulledby == src && !too_strong) - mob_swap = TRUE - else if( - !(HAS_TRAIT(M, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP))&&\ - ((HAS_TRAIT(M, TRAIT_RESTRAINED) && !too_strong) || !their_combat_mode) &&\ - (HAS_TRAIT(src, TRAIT_RESTRAINED) || !combat_mode) - ) - mob_swap = TRUE - if(mob_swap) + if(can_mobswap_with(M)) //switch our position with M - if(loc && !loc.Adjacent(M.loc)) + if(loc && !loc.MultiZAdjacent(M.loc)) return TRUE + now_pushing = TRUE + var/oldloc = loc var/oldMloc = M.loc - - - var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. - var/src_passmob = (pass_flags & PASSMOB) - M.pass_flags |= PASSMOB - pass_flags |= PASSMOB - - var/move_failed = FALSE - if(!M.Move(oldloc) || !Move(oldMloc)) - M.forceMove(oldMloc) - forceMove(oldloc) - move_failed = TRUE - if(!src_passmob) - pass_flags &= ~PASSMOB - if(!M_passmob) - M.pass_flags &= ~PASSMOB + forceMove(oldMloc) + M.forceMove(oldloc) now_pushing = FALSE - - if(!move_failed) - return TRUE + return TRUE //okay, so we didn't switch. but should we push? //not if he's not CANPUSH of course if(!(M.status_flags & CANPUSH)) return TRUE + if(isliving(M)) var/mob/living/L = M if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE)) return TRUE + //If they're a human, and they're not in help intent, block pushing if(ishuman(M)) var/mob/living/carbon/human/human = M if(human.combat_mode) return TRUE + //if they are a cyborg, and they're alive and in combat mode, block pushing if(iscyborg(M)) var/mob/living/silicon/robot/borg = M if(borg.combat_mode && borg.stat != DEAD) 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(prob(I.block_chance*2)) - return + if(I.try_block_attack(M, src, "the push", 0, LEAP_ATTACK)) //close enough? + return TRUE + +/mob/living/proc/can_mobswap_with(mob/other) + if (HAS_TRAIT(other, TRAIT_NOMOBSWAP) || HAS_TRAIT(src, TRAIT_NOMOBSWAP)) + return FALSE + + var/they_can_move = TRUE + var/their_combat_mode = FALSE + + if(isliving(other)) + var/mob/living/other_living = other + their_combat_mode = other_living.combat_mode + they_can_move = other_living.mobility_flags & MOBILITY_MOVE + + var/too_strong = other.move_resist > move_force + + // They cannot move, see if we can push through them + if (!they_can_move) + return !too_strong + + // We are pulling them and can move through + if (is_grabbing(other) && !too_strong) + return TRUE + + // If we're in combat mode and not restrained we don't try to pass through people + if (combat_mode && !HAS_TRAIT(src, TRAIT_ARMS_RESTRAINED)) + return FALSE + + // Nor can we pass through non-restrained people in combat mode (or if they're restrained but still too strong for us) + if (their_combat_mode && (!HAS_TRAIT(other, TRAIT_ARMS_RESTRAINED) || too_strong)) + return FALSE + + if (isnull(other.client) || isnull(client)) + return TRUE + + // If both of us are trying to move in the same direction, let the fastest one through first + if (client.intended_direction == other.client.intended_direction) + return movement_delay < other.movement_delay + + // Else, sure, let us pass + return TRUE /mob/living/get_photo_description(obj/item/camera/camera) var/list/mob_details = list() @@ -242,9 +278,11 @@ if((AM.move_resist * MOVE_FORCE_CRUSH_RATIO) <= force) if(move_crush(AM, move_force, dir_to_target)) push_anchored = TRUE + if((AM.move_resist * MOVE_FORCE_FORCEPUSH_RATIO) <= force) //trigger move_crush and/or force_push regardless of if we can push it normally if(force_push(AM, move_force, dir_to_target, push_anchored)) push_anchored = TRUE + if(ismob(AM)) var/mob/mob_to_push = AM var/atom/movable/mob_buckle = mob_to_push.buckled @@ -253,17 +291,20 @@ if(mob_buckle && (mob_buckle.buckle_prevents_pull || (force < (mob_buckle.move_resist * MOVE_FORCE_PUSH_RATIO)))) now_pushing = FALSE return + if((AM.anchored && !push_anchored) || (force < (AM.move_resist * MOVE_FORCE_PUSH_RATIO))) now_pushing = FALSE return + if(istype(AM, /obj/structure/window)) var/obj/structure/window/W = AM if(W.fulltile) for(var/obj/structure/window/win in get_step(W, dir_to_target)) now_pushing = FALSE return - if(pulling == AM) - stop_pulling() + + release_grabs(AM) + var/current_dir if(isliving(AM)) current_dir = AM.dir @@ -274,128 +315,10 @@ AM.setDir(current_dir) now_pushing = FALSE -/mob/living/start_pulling(atom/movable/AM, state, force = pull_force, supress_message = FALSE) - if(!AM || !src) - return FALSE - if(!(AM.can_be_pulled(src, state, force))) - return FALSE - if(throwing || !(mobility_flags & MOBILITY_PULL)) - return FALSE - if(SEND_SIGNAL(src, COMSIG_LIVING_TRY_PULL, AM, force) & COMSIG_LIVING_CANCEL_PULL) - return FALSE - - AM.add_fingerprint(src) - - // If we're pulling something then drop what we're currently pulling and pull this instead. - if(pulling) - // Are we trying to pull something we are already pulling? Then just stop here, no need to continue. - if(AM == pulling) - return - stop_pulling() - - changeNext_move(CLICK_CD_GRABBING) - animate_interact(AM, INTERACT_PULL) - - if(AM.pulledby) - if(!supress_message) - AM.visible_message(span_danger("[src] pulls [AM] from [AM.pulledby]'s grip."), \ - span_danger("[src] pulls you from [AM.pulledby]'s grip."), null, null, src) - to_chat(src, span_notice("You pull [AM] from [AM.pulledby]'s grip!")) - log_combat(AM, AM.pulledby, "pulled from", src) - AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. - - pulling = AM - AM.set_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)) - var/mob/living/carbon/human/H = src - if(H.dna.species.grab_sound) - sound_to_play = H.dna.species.grab_sound - if(HAS_TRAIT(H, TRAIT_STRONG_GRABBER)) - sound_to_play = null - playsound(src.loc, sound_to_play, 50, TRUE, -1) - update_pull_hud_icon() - - if(ismob(AM)) - var/mob/M = AM - - log_combat(src, M, "grabbed", addition="passive grab") - if(!supress_message && !(iscarbon(AM) && HAS_TRAIT(src, TRAIT_STRONG_GRABBER))) - if(ishuman(M)) - var/mob/living/carbon/human/grabbed_human = M - var/grabbed_by_hands = (zone_selected == "l_arm" || zone_selected == "r_arm") && grabbed_human.usable_hands > 0 - M.visible_message(span_warning("[src] grabs [M] [grabbed_by_hands ? "by their hands":"passively"]!"), \ - span_warning("[src] grabs you [grabbed_by_hands ? "by your hands":"passively"]!"), null, null, src) - to_chat(src, span_notice("You grab [M] [grabbed_by_hands ? "by their hands":"passively"]!")) - else - M.visible_message(span_warning("[src] grabs [M] passively!"), \ - span_warning("[src] grabs you passively!"), null, null, src) - to_chat(src, span_notice("You grab [M] passively!")) - - if(!iscarbon(src)) - M.LAssailant = null - else - M.LAssailant = WEAKREF(usr) - if(isliving(M)) - var/mob/living/L = M - - SEND_SIGNAL(M, COMSIG_LIVING_GET_PULLED, src) - //Share diseases that are spread by touch - for(var/thing in diseases) - var/datum/disease/D = thing - if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) - L.ContactContractDisease(D) - - for(var/thing in L.diseases) - var/datum/disease/D = thing - if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) - ContactContractDisease(D) - - if(iscarbon(L)) - var/mob/living/carbon/C = L - if(HAS_TRAIT(src, TRAIT_STRONG_GRABBER)) - C.grippedby(src) - - update_pull_movespeed() - - set_pull_offsets(M, state) - -/mob/living/proc/set_pull_offsets(mob/living/M, grab_state = GRAB_PASSIVE) - if(M.buckled) - return //don't make them change direction or offset them if they're buckled into something. - var/offset = 0 - switch(grab_state) - if(GRAB_PASSIVE) - offset = GRAB_PIXEL_SHIFT_PASSIVE - if(GRAB_AGGRESSIVE) - offset = GRAB_PIXEL_SHIFT_AGGRESSIVE - if(GRAB_NECK) - offset = GRAB_PIXEL_SHIFT_NECK - if(GRAB_KILL) - offset = GRAB_PIXEL_SHIFT_NECK - M.setDir(get_dir(M, src)) - switch(M.dir) - if(NORTH) - animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y + offset, 3) - if(SOUTH) - animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y - offset, 3) - if(EAST) - if(M.lying_angle == 270) //update the dragged dude's direction if we've turned - M.set_lying_angle(90) - animate(M, pixel_x = M.base_pixel_x + offset, pixel_y = M.base_pixel_y, 3) - if(WEST) - if(M.lying_angle == 90) - M.set_lying_angle(270) - animate(M, pixel_x = M.base_pixel_x - offset, pixel_y = M.base_pixel_y, 3) - -/mob/living/proc/reset_pull_offsets(mob/living/M, override) - if(!override && M.buckled) +/mob/living/proc/reset_pull_offsets(override) + if(!override && buckled) return - animate(M, pixel_x = M.base_pixel_x, pixel_y = M.base_pixel_y, 1) + animate(src, pixel_x = src.base_pixel_x, pixel_y = src.base_pixel_y, 1) //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm @@ -404,37 +327,29 @@ set category = "Object" if(istype(AM) && Adjacent(AM)) - start_pulling(AM) - else if(!combat_mode) //Don;'t cancel pulls if misclicking in combat mode. - stop_pulling() - -/mob/living/stop_pulling() - animate_interact(pulling, INTERACT_UNPULL) - if(ismob(pulling)) - reset_pull_offsets(pulling) - ..() - update_pull_movespeed() - update_pull_hud_icon() + try_make_grab(AM) /mob/living/verb/stop_pulling1() set name = "Stop Pulling" set category = "IC" - stop_pulling() + release_all_grabs() //same as above /mob/living/pointed(atom/A as mob|obj|turf in view(client.view, src)) if(incapacitated()) return FALSE + + return ..() + +/mob/living/_pointed(atom/pointing_at) if(!..()) return FALSE - visible_message("[span_name("[src]")] points at [A].", span_notice("You point at [A].")) - log_message("points at [A]", LOG_EMOTE) - return TRUE - + log_message("points at [pointing_at]", LOG_EMOTE) + visible_message("[span_name("[src]")] points at [pointing_at].", span_notice("You point at [pointing_at].")) /mob/living/verb/succumb(whispered as null) set hidden = TRUE - if (!CAN_SUCCUMB(src)) + if (stat == CONSCIOUS) to_chat(src, text="You are unable to succumb to death! This life continues.", type=MESSAGE_TYPE_INFO) return log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", LOG_ATTACK) @@ -462,11 +377,15 @@ if(HAS_TRAIT(src, TRAIT_INCAPACITATED)) return TRUE - if(!(flags & IGNORE_RESTRAINTS) && HAS_TRAIT(src, TRAIT_RESTRAINED)) - return TRUE - if(!(flags & IGNORE_GRAB) && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE) + if(!(flags & IGNORE_RESTRAINTS) && HAS_TRAIT(src, TRAIT_ARMS_RESTRAINED)) return TRUE - if(!(flags & IGNORE_STASIS) && IS_IN_STASIS(src)) + + if(!(flags & IGNORE_GRAB)) + for(var/obj/item/hand_item/grab/G in grabbed_by) + if(G.current_grab.restrains && !G.assailant == src) + return TRUE + + if(!(flags & IGNORE_STASIS) && IS_IN_HARD_STASIS(src)) return TRUE return FALSE @@ -515,17 +434,19 @@ * Argument: * * hand_firsts - boolean that checks the hands of the mob first if TRUE. */ -/mob/living/proc/get_idcard(hand_first) +/mob/living/proc/get_idcard(hand_first, bypass_wallet) + RETURN_TYPE(/obj/item/card/id) + if(!length(held_items)) //Early return for mobs without hands. return //Check hands var/obj/item/held_item = get_active_held_item() if(held_item) //Check active hand - . = held_item.GetID() + . = held_item.GetID(bypass_wallet) if(!.) //If there is no id, check the other hand held_item = get_inactive_held_item() if(held_item) - . = held_item.GetID() + . = held_item.GetID(bypass_wallet) /mob/living/proc/get_id_in_hand() var/obj/item/held_item = get_active_held_item() @@ -683,11 +604,11 @@ /mob/living/proc/updatehealth() if(status_flags & GODMODE) return + set_health(maxHealth - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss()) - update_stat() med_hud_set_health() - med_hud_set_status() update_health_hud() + update_stat() /mob/living/update_health_hud() var/severity = 0 @@ -725,8 +646,11 @@ //Proc used to resuscitate a mob, for full_heal see fully_heal() /mob/living/proc/revive(full_heal = FALSE, admin_revive = FALSE, excess_healing = 0) + if(QDELETED(src)) + return + if(excess_healing) - if(iscarbon(src) && excess_healing) + if(iscarbon(src)) var/mob/living/carbon/C = src if(!(C.dna?.species && (NOBLOOD in C.dna.species.species_traits))) C.blood_volume += (excess_healing*2)//1 excess = 10 blood @@ -739,9 +663,12 @@ adjustOxyLoss(-20, TRUE) adjustToxLoss(-20, TRUE, TRUE) //slime friendly updatehealth() - grab_ghost() + + grab_ghost() + if(full_heal) fully_heal(admin_revive = admin_revive) + if(stat == DEAD && can_be_revived()) //in some cases you can't revive (e.g. no brain) set_suicide(FALSE) set_stat(UNCONSCIOUS) //the mob starts unconscious, @@ -749,15 +676,23 @@ if(admin_revive) get_up(TRUE) update_sight() + update_eye_blur() clear_alert(ALERT_NOT_ENOUGH_OXYGEN) reload_fullscreen() + to_chat(src, span_obviousnotice("A rapidly growing speck of white floods your vision as the spark of life returns!")) . = TRUE + if(excess_healing) INVOKE_ASYNC(src, PROC_REF(emote), "gasp") log_combat(src, src, "revived") + else if(admin_revive) updatehealth() get_up(TRUE) + + if(.) + qdel(GetComponent(/datum/component/spook_factor)) + // The signal is called after everything else so components can properly check the updated values SEND_SIGNAL(src, COMSIG_LIVING_REVIVE, full_heal, admin_revive) @@ -859,33 +794,29 @@ /mob/living/proc/update_wound_overlays() return -/mob/living/Move(atom/newloc, direct, glide_size_override) +/mob/living/Move(atom/newloc, direct, glide_size_override, z_movement_flags) if(lying_angle != 0) lying_angle_on_movement(direct) if (buckled && buckled.loc != newloc) //not updating position - if (!buckled.anchored) - buckled.moving_from_pull = moving_from_pull - . = buckled.Move(newloc, direct, glide_size) - buckled.moving_from_pull = null - return + if (buckled.anchored) + return FALSE + return buckled.move_from_pull(newloc, buckled, glide_size) var/old_direction = dir var/turf/T = loc - if(pulling) - update_pull_movespeed() + update_pull_movespeed() . = ..() - if(moving_diagonally != FIRST_DIAG_STEP && isliving(pulledby)) - var/mob/living/L = pulledby - L.set_pull_offsets(src, pulledby.grab_state) - - if(active_storage && !((active_storage.parent?.resolve() in important_recursive_contents?[RECURSIVE_CONTENTS_ACTIVE_STORAGE]) || CanReach(active_storage.parent?.resolve(),view_only = TRUE))) + if(active_storage && !((active_storage.parent in important_recursive_contents?[RECURSIVE_CONTENTS_ACTIVE_STORAGE]) || CanReach(active_storage.parent,view_only = TRUE))) active_storage.hide_contents(src) - if(body_position == LYING_DOWN && !buckled && prob(getBruteLoss()*200/maxHealth)) - makeTrail(newloc, T, old_direction) + if(!ISDIAGONALDIR(direct) && newloc != T && body_position == LYING_DOWN && !buckled && has_gravity()) + if(length(grabbed_by)) + drag_damage(newloc, T, old_direction) + else + makeBloodTrail(newloc, T, old_direction) ///Called by mob Move() when the lying_angle is different than zero, to better visually simulate crawling. @@ -898,22 +829,26 @@ /mob/living/carbon/alien/humanoid/lying_angle_on_movement(direct) return -/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) - if(!has_gravity() || !isturf(start) || !blood_volume) - return +/// Take damage from being dragged while prone. Or not. You decide. +/mob/living/proc/drag_damage(turf/new_loc, turf/old_loc, direction) + if(prob(getBruteLoss() / 2)) + makeBloodTrail(new_loc, old_loc, direction, TRUE) - var/blood_exists = locate(/obj/effect/decal/cleanable/trail_holder) in start + if(prob(10)) + visible_message(span_danger("[src]'s wounds worsen as they're dragged across the ground.")) + adjustBruteLoss(2) - var/trail_type = getTrail() - if(!trail_type) +/// Creates a trail of blood on Start, facing Direction +/mob/living/proc/makeBloodTrail(turf/target_turf, turf/start, direction, being_dragged) + if(!isturf(start) || !leavesBloodTrail()) return - var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) - if(blood_volume < max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold + var/trail_type = getTrail(being_dragged) + if(!trail_type) return - var/bleed_amount = bleedDragAmount() - blood_volume = max(blood_volume - bleed_amount, 0) //that depends on our brute damage. + var/blood_exists = locate(/obj/effect/decal/cleanable/blood/trail_holder) in start + var/newdir = get_dir(target_turf, start) if(newdir != direction) newdir = newdir | direction @@ -921,69 +856,34 @@ newdir = NORTH else if(newdir == (EAST|WEST)) newdir = EAST - if((newdir in GLOB.cardinals) && (prob(50))) + + if((!(newdir & (newdir - 1))) && (prob(50))) // Cardinal move newdir = turn(get_dir(target_turf, start), 180) + if(!blood_exists) - new /obj/effect/decal/cleanable/trail_holder(start, get_static_viruses()) + new /obj/effect/decal/cleanable/blood/trail_holder(start, get_static_viruses()) - for(var/obj/effect/decal/cleanable/trail_holder/TH in start) - if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) + for(var/obj/effect/decal/cleanable/blood/trail_holder/TH in start) + if(TH.existing_dirs.len >= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) + continue + if(!(newdir in TH.existing_dirs) || trail_type == "bleedtrail_heavy") TH.existing_dirs += newdir - TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) + TH.add_overlay(image('icons/effects/blood.dmi', icon_state = trail_type, dir = newdir)) TH.transfer_mob_blood_dna(src) -/mob/living/carbon/human/makeTrail(turf/T) - if((NOBLOOD in dna.species.species_traits) || !is_bleeding() || HAS_TRAIT(src, TRAIT_NOBLEED)) - return - ..() - -///Returns how much blood we're losing from being dragged a tile, from [/mob/living/proc/makeTrail] -/mob/living/proc/bleedDragAmount() - var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) - return max(1, brute_ratio * 2) +/// Returns TRUE if we should try to leave a blood trail. +/mob/living/proc/leavesBloodTrail() + if(!blood_volume) + return FALSE -/mob/living/carbon/bleedDragAmount() - var/bleed_amount = 0 - for(var/obj/item/bodypart/BP as anything in bodyparts) - bleed_amount += BP.get_modified_bleed_rate() - return bleed_amount + return TRUE -/mob/living/proc/getTrail() - if(getBruteLoss() < 300) - return pick("ltrails_1", "ltrails_2") +/mob/living/proc/getTrail(being_dragged) + if(getBruteLoss() < 75) + return "bleedtrail_light_[rand(1,4)]" else - return pick("trails_1", "trails_2") -/* -/mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) - if(buckled || mob_negates_gravity()) - return - - if(client && client.move_delay >= world.time + world.tick_lag*2) - pressure_resistance_prob_delta -= 30 + return "bleedtrail_heavy" - var/list/turfs_to_check = list() - - if(!has_limbs) - var/turf/T = get_step(src, angle2dir(dir2angle(direction)+90)) - if (T) - turfs_to_check += T - - T = get_step(src, angle2dir(dir2angle(direction)-90)) - if(T) - turfs_to_check += T - - for(var/t in turfs_to_check) - T = t - if(T.density) - pressure_resistance_prob_delta -= 20 - continue - for (var/atom/movable/AM in T) - if (AM.density && AM.anchored) - pressure_resistance_prob_delta -= 20 - break - ..(pressure_difference, direction, pressure_resistance_prob_delta) -*/ /mob/living/can_resist() if(next_move > world.time) return FALSE @@ -995,14 +895,17 @@ set name = "Resist" set category = "IC" + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_resist))) + +///proc extender of [/mob/living/verb/resist] meant to make the process queable if the server is overloaded when the verb is called +/mob/living/proc/execute_resist() if(!can_resist()) return changeNext_move(CLICK_CD_RESIST) SEND_SIGNAL(src, COMSIG_LIVING_RESIST, src) //resisting grabs (as if it helps anyone...) - if(!HAS_TRAIT(src, TRAIT_RESTRAINED) && pulledby) - log_combat(src, pulledby, "resisted grab") + if(!HAS_TRAIT(src, TRAIT_ARMS_RESTRAINED) && LAZYLEN(grabbed_by)) resist_grab() return @@ -1020,38 +923,28 @@ else if(last_special <= world.time) resist_restraints() //trying to remove cuffs. - +/// Attempt to break free of grabs. Returning TRUE means the user broke free and can move. /mob/proc/resist_grab(moving_resist) - return 1 //returning 0 means we successfully broke free + return TRUE /mob/living/resist_grab(moving_resist) + if(!LAZYLEN(grabbed_by)) + return TRUE + + if(!moving_resist) + visible_message(span_danger("\The [src] struggles to break free!")) + . = TRUE - if(pulledby.grab_state || body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS)) - var/altered_grab_state = pulledby.grab_state - if((body_position == LYING_DOWN || HAS_TRAIT(src, TRAIT_GRABWEAKNESS)) && pulledby.grab_state < GRAB_KILL) //If prone, resisting out of a grab is equivalent to 1 grab state higher. won't make the grab state exceed the normal max, however - altered_grab_state++ - var/resist_chance = BASE_GRAB_RESIST_CHANCE /// see defines/combat.dm, this should be baseline 60% - resist_chance = (resist_chance/altered_grab_state) ///Resist chance divided by the value imparted by your grab state. It isn't until you reach neckgrab that you gain a penalty to escaping a grab. - if(prob(resist_chance)) - visible_message(span_danger("[src] breaks free of [pulledby]'s grip!"), \ - span_danger("You break free of [pulledby]'s grip!"), null, null, pulledby) - to_chat(pulledby, span_warning("[src] breaks free of your grip!")) - log_combat(pulledby, src, "broke grab") - pulledby.stop_pulling() - return FALSE - else - stamina.adjust(-rand(15,20)) //failure to escape still imparts a pretty serious penalty - visible_message(span_danger("[src] struggles as they fail to break free of [pulledby]'s grip!"), \ - span_warning("You struggle as you fail to break free of [pulledby]'s grip!"), null, null, pulledby) - to_chat(pulledby, span_danger("[src] struggles as they fail to break free of your grip!")) - if(moving_resist && client) //we resisted by trying to move - client.move_delay = world.time + 4 SECONDS - else - pulledby.stop_pulling() - return FALSE + for(var/obj/item/hand_item/grab/G as anything in grabbed_by) + if(G.assailant == src) //Grabbing our own bodyparts + continue + log_combat(src, G.assailant, "resisted grab") + if(!G.handle_resist()) + . = FALSE +/// Attempt to break out of a buckle. Returns TRUE if successful. /mob/living/proc/resist_buckle() - buckled.user_unbuckle_mob(src,src) + return !!buckled.user_unbuckle_mob(src,src) /mob/living/proc/resist_fire() return @@ -1059,14 +952,11 @@ /mob/living/proc/resist_restraints() return -/mob/living/proc/get_visible_name() - return name - /mob/living/proc/update_gravity(gravity) // Handle movespeed stuff var/speed_change = max(0, gravity - STANDARD_GRAVITY) if(speed_change) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, multiplicative_slowdown=speed_change) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gravity, slowdown=speed_change) else remove_movespeed_modifier(/datum/movespeed_modifier/gravity) @@ -1164,32 +1054,54 @@ /mob/living/can_hold_items(obj/item/I) return usable_hands && ..() -/mob/living/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) - if(!(mobility_flags & MOBILITY_UI) && !floor_okay) - to_chat(src, span_warning("You can't do that right now!")) +/mob/living/canUseTopic(atom/target, flags) + if(stat != CONSCIOUS) + to_chat(src, span_warning("You cannot do that while unconscious.")) return FALSE - if(be_close && !Adjacent(M) && (M.loc != src)) - if(no_tk) - to_chat(src, span_warning("You are too far away!")) - return FALSE - var/datum/dna/D = has_dna() - if(!D || !D.check_mutation(/datum/mutation/human/telekinesis) || !tkMaxRangeCheck(src, M)) - to_chat(src, span_warning("You are too far away!")) + + // If the MOBILITY_UI bitflag is not set it indicates the mob's hands are cutoff, blocked, or handcuffed + // Note - AI's and borgs have the MOBILITY_UI bitflag set even though they don't have hands + // Also if it is not set, the mob could be incapcitated, knocked out, unconscious, asleep, EMP'd, etc. + if(!(mobility_flags & MOBILITY_UI) && !(flags & USE_RESTING)) + to_chat(src, span_warning("You cannot do that right now.")) + return FALSE + + // NEED_HANDS is already checked by MOBILITY_UI for humans so this is for silicons + if((flags & USE_NEED_HANDS) && !can_hold_items(isitem(target) ? target : null)) //almost redundant if it weren't for mobs, + to_chat(src, span_warning("You are not physically capable of doing that.")) + return FALSE + + if((flags & USE_CLOSE) && !CanReach(target) && (recursive_loc_check(src, target))) + if(issilicon(src) && !ispAI(src)) + if(!(flags & USE_SILICON_REACH)) // silicons can ignore range checks (except pAIs) + to_chat(src, span_warning("You are too far away.")) + return FALSE + + else if(flags & USE_IGNORE_TK) + to_chat(src, span_warning("You are too far away.")) return FALSE - if(need_hands && !can_hold_items(isitem(M) ? M : null)) //almost redundant if it weren't for mobs, - to_chat(src, span_warning("You don't have the physical ability to do this!")) + + else + var/datum/dna/D = has_dna() + if(!D || !D.check_mutation(/datum/mutation/human/telekinesis) || !tkMaxRangeCheck(src, target)) + to_chat(src, span_warning("You are too far away.")) + return FALSE + + if((flags & USE_DEXTERITY) && !ISADVANCEDTOOLUSER(src)) + to_chat(src, span_warning("You do not have the dexterity required to do that.")) return FALSE - if(!no_dexterity && !ISADVANCEDTOOLUSER(src)) - to_chat(src, span_warning("You don't have the dexterity to do this!")) + + if((flags & USE_LITERACY) && !is_literate()) + to_chat(src, span_warning("You cannot comprehend this.")) return FALSE return TRUE /mob/living/proc/can_use_guns(obj/item/G)//actually used for more than guns! if(G.trigger_guard == TRIGGER_GUARD_NONE) - to_chat(src, span_warning("You are unable to fire this!")) + to_chat(src, span_warning("You are unable to fire that.")) return FALSE if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && (!ISADVANCEDTOOLUSER(src) && !HAS_TRAIT(src, TRAIT_GUN_NATURAL))) - to_chat(src, span_warning("You try to fire [G], but can't use the trigger!")) + to_chat(src, span_warning("You attempt to fire [G], but cannot pull the trigger.")) return FALSE return TRUE @@ -1201,7 +1113,7 @@ return /mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE) - stop_pulling() + release_all_grabs() . = ..() // Used in polymorph code to shapeshift mobs into other creatures @@ -1236,7 +1148,7 @@ Robot.notify_ai(AI_NOTIFICATION_NEW_BORG) else for(var/obj/item/item in src) - if(!dropItemToGround(item)) + if(!dropItemToGround(item) || (item.item_flags & ABSTRACT)) qdel(item) continue item_contents += item @@ -1295,18 +1207,12 @@ /mob/living/simple_animal/hostile/retaliate/bat, /mob/living/simple_animal/hostile/retaliate/goat, /mob/living/simple_animal/hostile/killertomato, - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, /mob/living/simple_animal/hostile/blob/blobbernaut/independent, /mob/living/simple_animal/hostile/carp/ranged, /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/hostile/asteroid/basilisk/watcher, - /mob/living/simple_animal/hostile/asteroid/goliath/beast, /mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/morph, - /mob/living/basic/stickman, - /mob/living/basic/stickman/dog, - /mob/living/simple_animal/hostile/megafauna/dragon/lesser, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/parrot, /mob/living/simple_animal/pet/dog/corgi, @@ -1368,8 +1274,7 @@ // Generally the mob we are currently in is about to be deleted /mob/living/proc/wabbajack_act(mob/living/new_mob) log_game("[key_name(src)] is being wabbajack polymorphed into: [new_mob.name]([new_mob.type]).") - new_mob.name = real_name - new_mob.real_name = real_name + new_mob.set_real_name(real_name) if(mind) mind.transfer_to(new_mob) @@ -1401,9 +1306,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) return fire_status.ignite() /mob/living/proc/update_fire() - var/datum/status_effect/fire_handler/fire_handler = has_status_effect(/datum/status_effect/fire_handler) - if(fire_handler) - fire_handler.update_overlay() + var/datum/status_effect/fire_handler/fire_stacks/fire_stacks = has_status_effect(/datum/status_effect/fire_handler/fire_stacks) + if(fire_stacks) + fire_stacks.update_overlay() /** * Extinguish all fire on the mob @@ -1550,23 +1455,30 @@ GLOBAL_LIST_EMPTY(fire_appearances) "[C] leaps out of [src]'s way!")]") C.Paralyze(40) -/mob/living/can_be_pulled() - return ..() && !(buckled?.buckle_prevents_pull) - - /// Called when mob changes from a standing position into a prone while lacking the ability to stand up at the moment. /mob/living/proc/on_fall() return /mob/living/forceMove(atom/destination) + var/old_loc = loc if(!currently_z_moving) - stop_pulling() if(buckled && !HAS_TRAIT(src, TRAIT_CANNOT_BE_UNBUCKLED)) buckled.unbuckle_mob(src, force = TRUE) if(has_buckled_mobs()) unbuckle_all_mobs(force = TRUE) + . = ..() - if(. && client) + if(!.) + return + + if(!QDELETED(src) && currently_z_moving == ZMOVING_VERTICAL) // Lateral Z movement handles this on it's own + handle_grabs_during_movement(old_loc, get_dir(old_loc, src)) + recheck_grabs() + + else if(!forcemove_should_maintain_grab && length(active_grabs)) + recheck_grabs() + + if(client) reset_perspective() @@ -1602,11 +1514,11 @@ GLOBAL_LIST_EMPTY(fire_appearances) ..() update_z(new_turf?.z) -/mob/living/MouseDrop_T(atom/dropping, atom/user) +/mob/living/MouseDroppedOn(atom/dropping, atom/user) var/mob/living/U = user if(isliving(dropping)) var/mob/living/M = dropping - if(U.pulling == M && mob_size > M.mob_size) + if(U.is_grabbing(M) && !U.combat_mode && mob_size > M.mob_size) M.mob_try_pickup(U)//blame kevinz return//dont open the mobs inventory if you are picking them up . = ..() @@ -1665,10 +1577,10 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/remove_air(amount) //To prevent those in contents suffocating return loc ? loc.remove_air(amount) : null -/mob/living/proc/set_name() +/// Gives simple mobs their unique/randomized name. +/mob/living/proc/give_unique_name() numba = rand(1, 1000) - name = "[name] ([numba])" - real_name = name + set_real_name("[name] ([numba])") /mob/living/proc/get_static_viruses() //used when creating blood and other infective objects if(!LAZYLEN(diseases)) @@ -1857,110 +1769,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) /mob/living/proc/get_body_temp_cold_damage_limit() return BODYTEMP_COLD_DAMAGE_LIMIT -///Checks if the user is incapacitated or on cooldown. -/mob/living/proc/can_look_up() - return !(incapacitated(IGNORE_RESTRAINTS)) - -/** - * look_up Changes the perspective of the mob to any openspace turf above the mob - * - * This also checks if an openspace turf is above the mob before looking up or resets the perspective if already looking up - * - */ -/mob/living/proc/look_up() - if(client.perspective != MOB_PERSPECTIVE) //We are already looking up. - stop_look_up() - if(!can_look_up()) - return - changeNext_move(CLICK_CD_LOOK_UP) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(stop_look_up)) //We stop looking up if we move. - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(start_look_up)) //We start looking again after we move. - start_look_up() - -/mob/living/proc/start_look_up() - SIGNAL_HANDLER - var/turf/ceiling = GetAbove(src) - if(!ceiling) //We are at the highest z-level. - if (prob(0.1)) - to_chat(src, span_warning("You gaze out into the infinite vastness of deep space, for a moment, you have the impulse to continue travelling, out there, out into the deep beyond, before your conciousness reasserts itself and you decide to stay within travelling distance of the station.")) - return - to_chat(src, span_warning("There's nothing interesting up there.")) - return - else if(!istransparentturf(ceiling)) //There is no turf we can look through above us - var/turf/front_hole = get_step(ceiling, dir) - if(istransparentturf(front_hole)) - ceiling = front_hole - else - var/list/checkturfs = block(locate(x-1,y-1,ceiling.z),locate(x+1,y+1,ceiling.z))-ceiling-front_hole //Try find hole near of us - for(var/turf/checkhole in checkturfs) - if(istransparentturf(checkhole)) - ceiling = checkhole - break - if(!istransparentturf(ceiling)) - to_chat(src, span_warning("You can't see through the floor above you.")) - return - - reset_perspective(ceiling) - -/mob/living/proc/stop_look_up() - SIGNAL_HANDLER - reset_perspective() - -/mob/living/proc/end_look_up() - stop_look_up() - UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) - UnregisterSignal(src, COMSIG_MOVABLE_MOVED) - -/** - * look_down Changes the perspective of the mob to any openspace turf below the mob - * - * This also checks if an openspace turf is below the mob before looking down or resets the perspective if already looking up - * - */ -/mob/living/proc/look_down() - if(client.perspective != MOB_PERSPECTIVE) //We are already looking down. - stop_look_down() - if(!can_look_up()) //if we cant look up, we cant look down. - return - changeNext_move(CLICK_CD_LOOK_UP) - RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(stop_look_down)) //We stop looking down if we move. - RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(start_look_down)) //We start looking again after we move. - start_look_down() - -/mob/living/proc/start_look_down() - SIGNAL_HANDLER - var/turf/floor = get_turf(src) - var/turf/lower_level = GetBelow(floor) - if(!lower_level) //We are at the lowest z-level. - to_chat(src, span_warning("You can't see through the floor below you.")) - return - else if(!istransparentturf(floor)) //There is no turf we can look through below us - var/turf/front_hole = get_step(floor, dir) - if(istransparentturf(front_hole)) - floor = front_hole - lower_level = GetBelow(front_hole) - else - var/list/checkturfs = block(locate(x-1,y-1,z),locate(x+1,y+1,z))-floor //Try find hole near of us - for(var/turf/checkhole in checkturfs) - if(istransparentturf(checkhole)) - floor = checkhole - lower_level = GetBelow(checkhole) - break - if(!istransparentturf(floor)) - to_chat(src, span_warning("You can't see through the floor below you.")) - return - - reset_perspective(lower_level) - -/mob/living/proc/stop_look_down() - SIGNAL_HANDLER - reset_perspective() - -/mob/living/proc/end_look_down() - stop_look_down() - UnregisterSignal(src, COMSIG_MOVABLE_PRE_MOVE) - UnregisterSignal(src, COMSIG_MOVABLE_MOVED) - /mob/living/set_stat(new_stat) . = ..() @@ -1974,23 +1782,9 @@ GLOBAL_LIST_EMPTY(fire_appearances) ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, STAT_TRAIT) ADD_TRAIT(src, TRAIT_INCAPACITATED, STAT_TRAIT) ADD_TRAIT(src, TRAIT_FLOORED, STAT_TRAIT) - if(stat >= SOFT_CRIT) - ADD_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION, STAT_TRAIT) - ADD_TRAIT(src, TRAIT_NO_SPRINT, STAT_TRAIT) - if(SOFT_CRIT) - if(stat >= UNCONSCIOUS) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) //adding trait sources should come before removing to avoid unnecessary updates - ADD_TRAIT(src, TRAIT_HANDS_BLOCKED, STAT_TRAIT) - ADD_TRAIT(src, TRAIT_INCAPACITATED, STAT_TRAIT) - ADD_TRAIT(src, TRAIT_FLOORED, STAT_TRAIT) - if(pulledby) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) if(UNCONSCIOUS) - if(stat != HARD_CRIT) - cure_blind(UNCONSCIOUS_TRAIT) - if(HARD_CRIT) - if(stat != UNCONSCIOUS) - cure_blind(UNCONSCIOUS_TRAIT) + cure_blind(UNCONSCIOUS_TRAIT) + REMOVE_TRAIT(src, TRAIT_DEAF, STAT_TRAIT) if(DEAD) remove_from_dead_mob_list() add_to_alive_mob_list() @@ -2003,35 +1797,35 @@ GLOBAL_LIST_EMPTY(fire_appearances) REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, STAT_TRAIT) REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STAT_TRAIT) REMOVE_TRAIT(src, TRAIT_FLOORED, STAT_TRAIT) - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) - REMOVE_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION, STAT_TRAIT) REMOVE_TRAIT(src, TRAIT_NO_SPRINT, STAT_TRAIT) - if(SOFT_CRIT) - if(pulledby) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) //adding trait sources should come before removing to avoid unnecessary updates - if(. >= UNCONSCIOUS) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, TRAIT_KNOCKEDOUT) - REMOVE_TRAIT(src, TRAIT_HANDS_BLOCKED, STAT_TRAIT) - REMOVE_TRAIT(src, TRAIT_INCAPACITATED, STAT_TRAIT) - REMOVE_TRAIT(src, TRAIT_FLOORED, STAT_TRAIT) - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) if(UNCONSCIOUS) - if(. != HARD_CRIT) - become_blind(UNCONSCIOUS_TRAIT) - if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) - ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) - else - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) - if(HARD_CRIT) - if(. != UNCONSCIOUS) - become_blind(UNCONSCIOUS_TRAIT) - ADD_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) + become_blind(UNCONSCIOUS_TRAIT) + ADD_TRAIT(src, TRAIT_DEAF, STAT_TRAIT) if(DEAD) - REMOVE_TRAIT(src, TRAIT_CRITICAL_CONDITION, STAT_TRAIT) remove_from_alive_mob_list() add_to_dead_mob_list() +/mob/living/carbon/set_stat(new_stat) + . = ..() + if(isnull(.)) + return + + switch(stat) //Current stat + if(DEAD) + bloodstream.end_metabolization(src) + var/datum/reagents/R = get_ingested_reagents() + if(R) + R.end_metabolization(src) + +/mob/living/do_set_blindness(blindness_level) + . = ..() + switch(blindness_level) + if(BLIND_SLEEPING, BLIND_PHYSICAL) + stats?.set_skill_modifier(-4, /datum/rpg_skill/skirmish, SKILL_SOURCE_BLINDNESS) + else + stats?.remove_skill_modifier(/datum/rpg_skill/skirmish, SKILL_SOURCE_BLINDNESS) + ///Reports the event of the change in value of the buckled variable. /mob/living/proc/set_buckled(new_buckled) if(new_buckled == buckled) @@ -2061,31 +1855,6 @@ GLOBAL_LIST_EMPTY(fire_appearances) if(old_buckled.buckle_lying == 0 && (resting || HAS_TRAIT(src, TRAIT_FLOORED))) // The buckle forced us to stay up (like a chair) set_lying_down() // We want to rest or are otherwise floored, so let's drop on the ground. -/mob/living/set_pulledby(new_pulledby) - . = ..() - if(. == FALSE) //null is a valid value here, we only want to return if FALSE is explicitly passed. - return - if(pulledby) - if(!. && stat == SOFT_CRIT) - ADD_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) - else if(. && stat == SOFT_CRIT) - REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, PULLED_WHILE_SOFTCRIT_TRAIT) - - -/// Updates the grab state of the mob and updates movespeed -/mob/living/setGrabState(newstate) - . = ..() - switch(grab_state) - if(GRAB_PASSIVE) - remove_movespeed_modifier(MOVESPEED_ID_MOB_GRAB_STATE) - if(GRAB_AGGRESSIVE) - add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/aggressive) - if(GRAB_NECK) - add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/neck) - if(GRAB_KILL) - add_movespeed_modifier(/datum/movespeed_modifier/grab_slowdown/kill) - - /// Only defined for carbons who can wear masks and helmets, we just assume other mobs have visible faces /mob/living/proc/is_face_visible() return TRUE @@ -2123,7 +1892,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) var/limbless_slowdown = (default_num_legs - usable_legs) * 3 if(!usable_legs && usable_hands < default_num_hands) limbless_slowdown += (default_num_hands - usable_hands) * 3 - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, multiplicative_slowdown = limbless_slowdown) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/limbless, slowdown = limbless_slowdown) else remove_movespeed_modifier(/datum/movespeed_modifier/limbless) @@ -2192,6 +1961,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) else // From lying down to standing up. on_standing_up() + UPDATE_OO_IF_PRESENT + /// Proc to append behavior to the condition of being floored. Called when the condition starts. /mob/living/proc/on_floored_start() @@ -2199,13 +1970,13 @@ GLOBAL_LIST_EMPTY(fire_appearances) set_lying_angle(pick(90, 270)) set_body_position(LYING_DOWN) on_fall() - + stats?.set_skill_modifier(-2, /datum/rpg_skill/skirmish, SKILL_SOURCE_FLOORED) /// Proc to append behavior to the condition of being floored. Called when the condition ends. /mob/living/proc/on_floored_end() if(!resting) get_up() - + stats?.remove_skill_modifier(/datum/rpg_skill/skirmish, SKILL_SOURCE_FLOORED) /// Proc to append behavior to the condition of being handsblocked. Called when the condition starts. /mob/living/proc/on_handsblocked_start() @@ -2333,3 +2104,138 @@ GLOBAL_LIST_EMPTY(fire_appearances) ///Called by the stamina holder, passing the change in stamina to modify. /mob/living/proc/pre_stamina_change(diff as num, forced) return diff + +///Checks if the user is incapacitated or on cooldown. +/mob/living/proc/can_look_up() + return !(incapacitated(IGNORE_RESTRAINTS)) + +/mob/living/verb/lookup() + set name = "Look Upwards" + set desc = "If you want to know what's above." + set category = "IC" + + + do_look_up() + +/mob/living/verb/lookdown() + set name = "Look Downwards" + set desc = "If you want to know what's below." + set category = "IC" + + do_look_down() + +/mob/living/proc/do_look_up() + if(z_eye) + QDEL_NULL(z_eye) + to_chat(src, span_notice("You stop looking up.")) + return + + if(!can_look_up()) + to_chat(src, span_notice("You can't look up right now.")) + return + + var/turf/above = GetAbove(src) + + if(above) + to_chat(src, span_notice("You look up.")) + z_eye = new /mob/camera/z_eye(above, src) + return + + to_chat(src, span_notice("You can see \the [above ? above : "ceiling"].")) + +/mob/living/proc/do_look_down() + if(z_eye) + QDEL_NULL(z_eye) + to_chat(src, span_notice("You stop looking down.")) + return + + if(!can_look_up()) + to_chat(src, span_notice("You can't look up right now.")) + return + + var/turf/T = get_turf(src) + + if(HasBelow(T.z)) + z_eye = new /mob/camera/z_eye(GetBelow(T), src) + to_chat(src, span_notice("You look down.")) + return + + to_chat(src, span_notice("You can see \the [T ? T : "floor"].")) + +/mob/living/proc/toggle_gunpoint_flag(permission) + gunpoint_flags ^= permission + + var/message = "no longer permitted to " + var/use_span = "warning" + if (gunpoint_flags & permission) + message = "now permitted to " + use_span = "notice" + + switch(permission) + if (TARGET_CAN_MOVE) + message += "move" + if (TARGET_CAN_INTERACT) + message += "use items" + if (TARGET_CAN_RADIO) + message += "use a radio" + if(TARGET_CAN_RUN) + message += "run" + else + return + + to_chat(src, "\The [gunpoint?.target || "victim"] is [message].") + if(gunpoint?.target) + to_chat(gunpoint.target, "You are [message].") + +/mob/living/proc/get_ingested_reagents() + RETURN_TYPE(/datum/reagents) + return reagents + +/mob/living/proc/needs_organ(slot) + return FALSE + +/mob/proc/has_mouth() + return FALSE + +/mob/living/has_mouth() + return TRUE + +/mob/living/get_mouse_pointer_icon(check_sustained) + if(istype(loc, /obj/vehicle/sealed)) + var/obj/vehicle/sealed/E = loc + if(E.mouse_pointer) + return E.mouse_pointer + + var/atom/A = SSmouse_entered.sustained_hovers[client] + if(isnull(A)) + return + + if(istype(A, /atom/movable/screen/movable/action_button)) + var/atom/movable/screen/movable/action_button/action = A + if(action.can_usr_use(src)) + return MOUSE_ICON_HOVERING_INTERACTABLE + return + + if(A.is_mouseover_interactable && (mobility_flags & MOBILITY_USE) && can_interact_with(A)) + if(isitem(A)) + if(!isturf(loc) || (mobility_flags & MOBILITY_PICKUP)) + return MOUSE_ICON_HOVERING_INTERACTABLE + else + return MOUSE_ICON_HOVERING_INTERACTABLE + + +/mob/living/do_hurt_animation() + if(stat > CONSCIOUS) + return + + var/pixel_x = src.pixel_x + var/pixel_y = src.pixel_y + var/offset_x = pixel_x + pick(-3, -2, -1, 1, 2, 3) + var/offset_y = pixel_y + pick(-3, -2, -1, 1, 2, 3) + + for(var/atom/movable/AM as anything in get_associated_mimics() + src) + animate(AM, pixel_x = offset_x, pixel_y = offset_y, time = rand(2, 4)) + animate(pixel_x = pixel_x, pixel_y = pixel_y, time = 2) + +/mob/living/proc/get_blood_print() + return BLOOD_PRINT_PAWS diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 9f6ac9f819de..ac856b5d065a 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -1,31 +1,35 @@ -/mob/living/proc/run_armor_check(def_zone = null, attack_flag = MELEE, absorb_text = null, soften_text = null, armour_penetration, penetrated_text, silent=FALSE, weak_against_armour = FALSE) +/mob/living/proc/run_armor_check(def_zone = null, attack_flag = BLUNT, absorb_text = null, soften_text = null, armor_penetration, penetrated_text, silent=FALSE, weak_against_armor = null) var/our_armor = getarmor(def_zone, attack_flag) if(our_armor <= 0) return our_armor - if(weak_against_armour && our_armor >= 0) - our_armor *= ARMOR_WEAKENED_MULTIPLIER + + if(weak_against_armor) + our_armor *= weak_against_armor + + var/armor_after_penetration = max(0, our_armor - armor_penetration) if(silent) - return max(0, our_armor - armour_penetration) + return armor_after_penetration - //the if "armor" check is because this is used for everything on /living, including humans - if(armour_penetration) - our_armor = max(0, our_armor - armour_penetration) + if(armor_after_penetration == 0) if(penetrated_text) to_chat(src, span_userdanger("[penetrated_text]")) else to_chat(src, span_userdanger("Your armor was penetrated!")) + else if(our_armor >= 100) if(absorb_text) to_chat(src, span_notice("[absorb_text]")) else - to_chat(src, span_notice("Your armor absorbs the blow!")) + to_chat(src, span_notice("Your armor absorbs the [armor_flag_to_strike_string(attack_flag)]!")) + else if(soften_text) to_chat(src, span_warning("[soften_text]")) else - to_chat(src, span_warning("Your armor softens the blow!")) + to_chat(src, span_warning("Your armor softens the [armor_flag_to_strike_string(attack_flag)]!")) + return our_armor /mob/living/proc/getarmor(def_zone, type) @@ -61,14 +65,24 @@ // we need a second, silent armor check to actually know how much to reduce damage taken, as opposed to // on [/atom/proc/bullet_act] where it's just to pass it to the projectile's on_hit(). var/armor_check = check_projectile_armor(def_zone, P, is_silent = TRUE) - apply_damage(P.damage, P.damage_type, def_zone, armor_check, sharpness = P.sharpness, attack_direction = attack_direction) - apply_effects(P.stun, P.knockdown, P.unconscious, P.slur, P.stutter, P.eyeblur, P.drowsy, armor, P.stamina, P.jitter, P.paralyze, P.immobilize) + + var/modifier = 1 + if(LAZYLEN(grabbed_by)) + for(var/obj/item/hand_item/grab/G in grabbed_by) + modifier = max(G.current_grab.point_blank_mult, modifier) + var/damage = P.damage * modifier + + apply_damage(damage, P.damage_type, def_zone, armor_check, sharpness = P.sharpness, attack_direction = attack_direction) + apply_effects(P.stun, P.knockdown, P.unconscious, P.slur, P.stutter, P.eyeblur, P.drowsy, armor_check, P.stamina, P.jitter, P.paralyze, P.immobilize) + if(P.disorient_length) + var/stamina = P.disorient_damage * ((100-armor_check)/100) + Disorient(P.disorient_length, stamina, paralyze = P.disorient_status_length) if(P.dismemberment) check_projectile_dismemberment(P, def_zone) return . ? BULLET_ACT_HIT : BULLET_ACT_BLOCK /mob/living/check_projectile_armor(def_zone, obj/projectile/impacting_projectile, is_silent) - return run_armor_check(def_zone, impacting_projectile.armor_flag, "","",impacting_projectile.armour_penetration, "", is_silent, impacting_projectile.weak_against_armour) + return run_armor_check(def_zone, impacting_projectile.armor_flag, "","",impacting_projectile.armor_penetration, "", is_silent, impacting_projectile.weak_against_armor) /mob/living/proc/check_projectile_dismemberment(obj/projectile/P, def_zone) return 0 @@ -84,12 +98,22 @@ /mob/living/proc/set_combat_mode(new_mode, silent = TRUE) if(combat_mode == new_mode) return + + SEND_SIGNAL(src, COMSIG_LIVING_TOGGLE_COMBAT_MODE, new_mode) . = combat_mode combat_mode = new_mode + + if(combat_mode) + stats?.set_skill_modifier(4, /datum/rpg_skill/skirmish, SKILL_SOURCE_COMBAT_MODE) + else + stats?.remove_skill_modifier(/datum/rpg_skill/skirmish, SKILL_SOURCE_COMBAT_MODE) + if(hud_used?.action_intent) hud_used.action_intent.update_appearance() + if(silent || !(client?.prefs.toggles & SOUND_COMBATMODE)) return + if(combat_mode) SEND_SOUND(src, sound('sound/misc/ui_togglecombat.ogg', volume = 25)) //Sound from interbay! else @@ -112,14 +136,30 @@ log_combat(thrown_by, src, "threw and hit", thrown_item) if(nosell_hit) return ..() - visible_message(span_danger("[src] is hit by [thrown_item]!"), \ - span_userdanger("You're hit by [thrown_item]!")) + visible_message( + span_danger("[src] is hit by [thrown_item]!"), + span_userdanger("You're hit by [thrown_item]!") + ) if(!thrown_item.throwforce) return - 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)].", thrown_item.armour_penetration, "", FALSE, thrown_item.weak_against_armour) + + var/attack_flag = thrown_item.get_attack_flag() + var/armor = run_armor_check( + def_zone = zone, + attack_flag = attack_flag, + absorb_text = "Your armor has protected your [parse_zone(zone)].", + soften_text = "Your armor has softened the [armor_flag_to_strike_string(attack_flag)] to your [parse_zone(zone)].", + armor_penetration = thrown_item.armor_penetration, + penetrated_text = "", + silent = FALSE, + weak_against_armor = thrown_item.weak_against_armor + ) + apply_damage(thrown_item.throwforce, thrown_item.damtype, zone, armor, sharpness = thrown_item.sharpness) + if(QDELETED(src)) //Damage can delete the mob. return + if(body_position == LYING_DOWN) // 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 return ..() @@ -127,86 +167,11 @@ playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) //Item sounds are handled in the item itself return ..() -/mob/living/fire_act() +/mob/living/fire_act(exposed_temperature, exposed_volume, turf/adjacent) + . = ..() adjust_fire_stacks(3) ignite_mob() -/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = FALSE) - if(user == src || anchored || !isturf(user.loc)) - return FALSE - if(!user.pulling || user.pulling != src) - user.start_pulling(src, supress_message = supress_message) - return - - if(!(status_flags & CANPUSH) || HAS_TRAIT(src, TRAIT_PUSHIMMUNE)) - to_chat(user, span_warning("[src] can't be grabbed more aggressively!")) - return FALSE - - if(user.grab_state >= GRAB_AGGRESSIVE && HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, span_warning("You don't want to risk hurting [src]!")) - return FALSE - grippedby(user) - -//proc to upgrade a simple pull into a more aggressive grab. -/mob/living/proc/grippedby(mob/living/carbon/user, instant = FALSE) - if(user.grab_state < GRAB_KILL) - user.changeNext_move(CLICK_CD_GRABBING) - var/sound_to_play = 'sound/weapons/thudswoosh.ogg' - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.species.grab_sound) - sound_to_play = H.dna.species.grab_sound - playsound(src.loc, sound_to_play, 50, TRUE, -1) - - if(user.grab_state) //only the first upgrade is instantaneous - var/old_grab_state = user.grab_state - var/grab_upgrade_time = instant ? 0 : 30 - visible_message(span_danger("[user] starts to tighten [user.p_their()] grip on [src]!"), \ - span_userdanger("[user] starts to tighten [user.p_their()] grip on you!"), span_hear("You hear aggressive shuffling!"), null, user) - to_chat(user, span_danger("You start to tighten your grip on [src]!")) - switch(user.grab_state) - if(GRAB_AGGRESSIVE) - log_combat(user, src, "attempted to neck grab", addition="neck grab") - if(GRAB_NECK) - log_combat(user, src, "attempted to strangle", addition="kill grab") - if(!do_after(user, src, grab_upgrade_time)) - return FALSE - if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state) - return FALSE - user.setGrabState(user.grab_state + 1) - switch(user.grab_state) - if(GRAB_AGGRESSIVE) - var/add_log = "" - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - visible_message(span_danger("[user] firmly grips [src]!"), - span_danger("[user] firmly grips you!"), span_hear("You hear aggressive shuffling!"), null, user) - to_chat(user, span_danger("You firmly grip [src]!")) - add_log = " (pacifist)" - else - visible_message(span_danger("[user] grabs [src] aggressively!"), \ - span_userdanger("[user] grabs you aggressively!"), span_hear("You hear aggressive shuffling!"), null, user) - to_chat(user, span_danger("You grab [src] aggressively!")) - drop_all_held_items() - stop_pulling() - log_combat(user, src, "grabbed", addition="aggressive grab[add_log]") - if(GRAB_NECK) - log_combat(user, src, "grabbed", addition="neck grab") - visible_message(span_danger("[user] grabs [src] by the neck!"),\ - span_userdanger("[user] grabs you by the neck!"), span_hear("You hear aggressive shuffling!"), null, user) - to_chat(user, span_danger("You grab [src] by the neck!")) - if(!buckled && !density) - Move(user.loc) - if(GRAB_KILL) - log_combat(user, src, "strangled", addition="kill grab") - visible_message(span_danger("[user] is strangling [src]!"), \ - span_userdanger("[user] is strangling you!"), span_hear("You hear aggressive shuffling!"), null, user) - to_chat(user, span_danger("You're strangling [src]!")) - if(!buckled && !density) - Move(user.loc) - user.set_pull_offsets(src, grab_state) - return TRUE - - /mob/living/attack_slime(mob/living/simple_animal/slime/M) if(!SSticker.HasRoundStarted()) to_chat(M, "You cannot attack people before the game has started.") @@ -290,8 +255,10 @@ if (user != src) user.disarm(src) return TRUE + if (!user.combat_mode) return FALSE + if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to hurt anyone!")) return FALSE @@ -299,17 +266,30 @@ if(user.is_muzzled() || user.is_mouth_covered(FALSE, TRUE)) to_chat(user, span_warning("You can't bite with your mouth covered!")) return FALSE + user.do_attack_animation(src, ATTACK_EFFECT_BITE) - if (prob(75)) + + if (HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER) || prob(75)) log_combat(user, src, "attacked") playsound(loc, 'sound/weapons/bite.ogg', 50, TRUE, -1) - visible_message(span_danger("[user.name] bites [src]!"), \ - span_userdanger("[user.name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, user) + visible_message( + span_danger("[user.name] bites [src]!"), + span_userdanger("[user.name] bites you!"), + span_hear("You hear a chomp!"), + COMBAT_MESSAGE_RANGE, + user + ) to_chat(user, span_danger("You bite [src]!")) return TRUE + else - visible_message(span_danger("[user.name]'s bite misses [src]!"), \ - span_danger("You avoid [user.name]'s bite!"), span_hear("You hear the sound of jaws snapping shut!"), COMBAT_MESSAGE_RANGE, user) + visible_message( + span_danger("[user.name]'s bite misses [src]!"), + span_danger("You avoid [user.name]'s bite!"), + span_hear("You hear the sound of jaws snapping shut!"), + COMBAT_MESSAGE_RANGE, + user + ) to_chat(user, span_warning("Your bite misses [src]!")) return FALSE @@ -368,7 +348,7 @@ return FALSE return ..() -/mob/living/acid_act(acidpwr, acid_volume) +/mob/living/acid_act(acidpwr, acid_volume, affect_clothing = TRUE, affect_body = TRUE) take_bodypart_damage(acidpwr * min(1, acid_volume * 0.1)) return TRUE @@ -417,7 +397,7 @@ GLOB.cult_narsie.resolved = TRUE sound_to_playing_players('sound/machines/alarm.ogg') addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 1), 120) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 270) + addtimer(CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, end_round)), 270) if(client) makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE) else @@ -497,11 +477,13 @@ if(. & COMPONENT_NO_EXPOSE_REAGENTS) return + if(!reagents) + return + if(methods & INGEST) taste(source) var/touch_protection = (methods & VAPOR) ? get_permeability_protection() : 0 SEND_SIGNAL(source, COMSIG_REAGENTS_EXPOSE_MOB, src, reagents, methods, volume_modifier, show_message, touch_protection) - for(var/reagent in reagents) - var/datum/reagent/R = reagent - . |= R.expose_mob(src, methods, reagents[R], show_message, touch_protection, exposed_temperature) + for(var/datum/reagent/R as anything in reagents) + . |= R.expose_mob(src, reagents[R], exposed_temperature, source, methods, show_message, touch_protection, source) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index b0eaf174fa6d..76293f35fd7d 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -1,8 +1,12 @@ +DEFINE_INTERACTABLE(/mob/living) /mob/living see_invisible = SEE_INVISIBLE_LIVING sight = 0 see_in_dark = 2 - hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) + hud_possible = list( + HEALTH_HUD = 'icons/mob/huds/hud.dmi', + STATUS_HUD = 'icons/mob/huds/hud.dmi', + ) //pressure_resistance = 10 hud_type = /datum/hud/living @@ -17,15 +21,17 @@ /// The mob's current health. var/health = MAX_LIVING_HEALTH + /// The container for stats and skills + var/datum/stats/stats ///The holder for stamina handling var/datum/stamina_container/stamina //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS - var/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) - var/oxyloss = 0 ///Oxygen depravation damage (no air in lungs) - var/toxloss = 0 ///Toxic damage caused by being poisoned or radiated - var/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt. - var/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims + VAR_PROTECTED/bruteloss = 0 ///Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) + VAR_PROTECTED/oxyloss = 0 ///Oxygen depravation damage (no air in lungs) + VAR_PROTECTED/toxloss = 0 ///Toxic damage caused by being poisoned or radiated + VAR_PROTECTED/fireloss = 0 ///Burn damage caused by being way too hot, too cold or burnt. + VAR_PROTECTED/cloneloss = 0 ///Damage caused by being cloned or ejected from the cloner early. slimes also deal cloneloss damage to victims var/crit_threshold = HEALTH_THRESHOLD_CRIT /// when the mob goes from "normal" to crit ///When the mob enters hard critical state and is fully incapacitated. @@ -74,7 +80,9 @@ var/list/quirks = list() - var/list/surgeries = list() ///a list of surgery datums. generally empty, they're added when the player wants them. + /// A lazylist of active surgeries and their relevant data. + var/list/surgeries_in_progress + ///Mob specific surgery speed modifier var/mob_surgery_speed_mod = 1 @@ -145,8 +153,6 @@ var/list/diseases /// list of all diseases in a mob var/list/disease_resistances - var/slowed_by_drag = TRUE ///Whether the mob is slowed down when dragging another prone mob - /// List of changes to body temperature, used by desease symtoms like fever var/list/body_temp_changes = list() @@ -168,6 +174,9 @@ /// Is this mob allowed to be buckled/unbuckled to/from things? var/can_buckle_to = TRUE + /// A lazylist of grab objects we have + var/list/active_grabs + ///The y amount a mob's sprite should be offset due to the current position they're in (e.g. lying down moves your sprite down) var/body_position_pixel_x_offset = 0 ///The x amount a mob's sprite should be offset due to the current position they're in @@ -183,7 +192,25 @@ var/voice_type COOLDOWN_DECLARE(smell_time) - var/last_smell_intensity = 0 + var/datum/weakref/next_smell /// What our current gravity state is. Used to avoid duplicate animates and such var/gravity_state = null + + ///Used for lookup/lookdown verbs + var/mob/camera/z_eye/z_eye + + ///Gunpoint container + var/obj/effect/abstract/aim_overlay/gunpoint + var/gunpoint_flags = TARGET_CAN_MOVE | TARGET_CAN_INTERACT | TARGET_CAN_RADIO + var/use_gunpoint = FALSE + + /// How many ticks of Life() has this mob gone through + var/life_ticks = 0 + /// Chemical effects. Built by the chemical processing stage of Life(). + var/list/chem_effects = list() + + /// For each life tick, how many do we skip? + var/stasis_level = 0 + /// List of stasis sources to their given value + var/list/stasis_sources = list() diff --git a/code/modules/mob/living/living_fov.dm b/code/modules/mob/living/living_fov.dm index 2447c44a3fca..6758aff5e9e4 100644 --- a/code/modules/mob/living/living_fov.dm +++ b/code/modules/mob/living/living_fov.dm @@ -1,9 +1,8 @@ /// Is `observed_atom` in a mob's field of view? This takes blindness, nearsightness and FOV into consideration -/mob/living/proc/in_fov(atom/observed_atom, ignore_self = FALSE) - if(ignore_self && observed_atom == src) - return TRUE +/mob/living/proc/in_fov(atom/observed_atom) if(is_blind()) - return FALSE + return TRUE + // Handling nearsightnedness if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) //Checking if our dude really is suffering from nearsightness! (very nice nearsightness code) @@ -12,22 +11,23 @@ if(carbon_me.glasses) var/obj/item/clothing/glasses/glass = carbon_me.glasses if(!glass.vision_correction) - return FALSE - - return TRUE + return TRUE /// Plays a visual effect representing a sound cue for people with vision obstructed by FOV or blindness -/proc/play_fov_effect(atom/center, range, icon_state, dir = SOUTH, ignore_self = FALSE, angle = 0, list/override_list) +/proc/play_fov_effect(atom/center, range, icon_state, dir = SOUTH, ignore_self = FALSE, angle, list/override_list) var/turf/anchor_point = get_turf(center) var/image/fov_image for(var/mob/living/living_mob in override_list || get_hearers_in_view(range, center)) var/client/mob_client = living_mob.client if(!mob_client) continue - if(HAS_TRAIT(living_mob, TRAIT_DEAF)) //Deaf people can't hear sounds so no sound indicators + + if(ignore_self && living_mob == center) continue - if(living_mob.in_fov(center, ignore_self)) + + if(!living_mob.can_hear() || !living_mob.in_fov(center, ignore_self)) continue + if(!fov_image) //Make the image once we found one recipient to receive it fov_image = image(icon = 'icons/effects/fov_effects.dmi', icon_state = icon_state, loc = anchor_point) fov_image.plane = FULLSCREEN_PLANE diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index f8353fb0570b..c9275284fa10 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -1,5 +1,7 @@ /mob/living/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() + if(client) + update_mouse_pointer() update_turf_movespeed(loc) if(HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY)) if(!isgroundlessturf(loc)) @@ -54,7 +56,8 @@ remove_filter("gravity") /mob/living/mob_negates_gravity() - return HAS_TRAIT_FROM(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION) + if(HAS_TRAIT_FROM(src, TRAIT_IGNORING_GRAVITY, IGNORING_GRAVITY_NEGATION)) + return TRUE /mob/living/CanAllowThrough(atom/movable/mover, border_dir) . = ..() @@ -89,82 +92,68 @@ /mob/living/proc/update_turf_movespeed(turf/open/T) if(isopenturf(T)) if(T.slowdown != current_turf_slowdown) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, multiplicative_slowdown = T.slowdown) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown, slowdown = T.slowdown) current_turf_slowdown = T.slowdown else if(current_turf_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/turf_slowdown) current_turf_slowdown = 0 - /mob/living/proc/update_pull_movespeed() - SEND_SIGNAL(src, COMSIG_LIVING_UPDATING_PULL_MOVESPEED) + var/list/obj/item/hand_item/grab/grabs = active_grabs + if(!length(grabs)) + remove_movespeed_modifier(/datum/movespeed_modifier/grabbing) + return - if(pulling) + var/slowdown_total = 0 + for(var/obj/item/hand_item/grab/G as anything in grabs) + var/atom/movable/pulling = G.affecting if(isliving(pulling)) var/mob/living/L = pulling - if(!slowed_by_drag || L.body_position == STANDING_UP || L.buckled || grab_state >= GRAB_AGGRESSIVE) - remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag) - return - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bulky_drag, multiplicative_slowdown = PULL_PRONE_SLOWDOWN) - return + if(G.current_grab.grab_slowdown || L.body_position == LYING_DOWN) + slowdown_total += max(G.current_grab.grab_slowdown, PULL_PRONE_SLOWDOWN) + if(isobj(pulling)) var/obj/structure/S = pulling - if(!slowed_by_drag || !S.drag_slowdown) - remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag) - return - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/bulky_drag, multiplicative_slowdown = S.drag_slowdown) - return - remove_movespeed_modifier(/datum/movespeed_modifier/bulky_drag) - -/** - * We want to relay the zmovement to the buckled atom when possible - * and only run what we can't have on buckled.zMove() or buckled.can_z_move() here. - * This way we can avoid esoteric bugs, copypasta and inconsistencies. - */ -/mob/living/zMove(dir, turf/target, z_move_flags = ZMOVE_FLIGHT_FLAGS) - if(buckled) - if(buckled.currently_z_moving) + slowdown_total += S.drag_slowdown + + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/grabbing, slowdown = slowdown_total) + +/mob/living/can_z_move(direction, turf/start, z_move_flags, mob/living/rider) + // Check physical climbing ability + if((z_move_flags & ZMOVE_INCAPACITATED_CHECKS)) + if(incapacitated()) + if(z_move_flags & ZMOVE_FEEDBACK) + to_chat(rider || src, span_warning("[rider ? src : "You"] can't do that right now!")) return FALSE - if(!(z_move_flags & ZMOVE_ALLOW_BUCKLED)) - buckled.unbuckle_mob(src, force = TRUE, can_fall = FALSE) - else - if(!target) - target = can_z_move(dir, get_turf(src), null, z_move_flags, src) - if(!target) - return FALSE - return buckled.zMove(dir, target, z_move_flags) // Return value is a loc. - return ..() -/mob/living/can_z_move(direction, turf/start, turf/destination, z_move_flags = ZMOVE_FLIGHT_FLAGS, mob/living/rider) - if(z_move_flags & ZMOVE_INCAPACITATED_CHECKS && incapacitated()) - if(z_move_flags & ZMOVE_FEEDBACK) - to_chat(rider || src, span_warning("[rider ? src : "You"] can't do that right now!")) - return FALSE + if(ishuman(src)) + if(!(has_right_hand() && has_left_hand())) + if(z_move_flags & ZMOVE_FEEDBACK) + to_chat(rider || src, span_notice("Sorry pal, that just isn't going to work...")) + return FALSE + if(!buckled || !(z_move_flags & ZMOVE_ALLOW_BUCKLED)) if(!(z_move_flags & ZMOVE_FALL_CHECKS) && incorporeal_move && (!rider || rider.incorporeal_move)) //An incorporeal mob will ignore obstacles unless it's a potential fall (it'd suck hard) or is carrying corporeal mobs. //Coupled with flying/floating, this allows the mob to move up and down freely. //By itself, it only allows the mob to move down. z_move_flags |= ZMOVE_IGNORE_OBSTACLES + return ..() - switch(SEND_SIGNAL(buckled, COMSIG_BUCKLED_CAN_Z_MOVE, direction, start, destination, z_move_flags, src)) + + switch(SEND_SIGNAL(buckled, COMSIG_BUCKLED_CAN_Z_MOVE, direction, start, z_move_flags, src)) if(COMPONENT_RIDDEN_ALLOW_Z_MOVE) // Can be ridden. - return buckled.can_z_move(direction, start, destination, z_move_flags, src) + return buckled.can_z_move(direction, start, z_move_flags, src) if(COMPONENT_RIDDEN_STOP_Z_MOVE) // Is a ridable but can't be ridden right now. Feedback messages already done. return FALSE else if(!(z_move_flags & ZMOVE_CAN_FLY_CHECKS) && !buckled.anchored) - return buckled.can_z_move(direction, start, destination, z_move_flags, src) + return buckled.can_z_move(direction, start, z_move_flags, src) if(z_move_flags & ZMOVE_FEEDBACK) to_chat(src, span_warning("Unbuckle from [buckled] first.")) return FALSE -/mob/set_currently_z_moving(value) - if(buckled) - return buckled.set_currently_z_moving(value) - return ..() - /mob/living/keybind_face_direction(direction) - if(stat > SOFT_CRIT) + if(stat != CONSCIOUS) return return ..() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index 2a5a21f11927..e61537f0532a 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -63,11 +63,11 @@ GLOBAL_LIST_INIT(department_radio_keys, list( * Associated values are their maximum allowed mob stats. */ GLOBAL_LIST_INIT(message_modes_stat_limits, list( - MODE_INTERCOM = HARD_CRIT, - MODE_ALIEN = HARD_CRIT, - MODE_BINARY = HARD_CRIT, //extra stat check on human/binarycheck() - MODE_MONKEY = HARD_CRIT, - MODE_MAFIA = HARD_CRIT + MODE_INTERCOM = UNCONSCIOUS, + MODE_ALIEN = UNCONSCIOUS, + MODE_BINARY = UNCONSCIOUS, //extra stat check on human/binarycheck() + MODE_MONKEY = UNCONSCIOUS, + MODE_MAFIA = UNCONSCIOUS )) /mob/living/proc/Ellipsis(original_msg, chance = 50, keep_words) @@ -92,7 +92,9 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return new_msg -/mob/living/say(message, bubble_type,list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof) +/mob/living/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) + language = GET_LANGUAGE_DATUM(language) + var/list/filter_result var/list/soft_filter_result if(client && !forced && !filterproof) @@ -103,6 +105,7 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(sanitize) message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + if(!message || message == "") return @@ -128,8 +131,9 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( var/list/message_mods = list() var/original_message = message message = get_message_mods(message, message_mods) + var/datum/saymode/saymode = SSpackets.saymodes[message_mods[RADIO_KEY]] - if (!forced) + if (!forced && !saymode) message = check_for_custom_say_emote(message, message_mods) if(!message) @@ -147,22 +151,42 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(stat != DEAD && check_emote(original_message, forced)) return + language = message_mods[LANGUAGE_EXTENSION] + + if(!language) + language = get_selected_language() + + if(language && !language.can_speak_language(src, FALSE)) + return + + if(!can_speak_basic(original_message, ignore_spam, forced)) + return + + var/is_visual_language = istype(language, /datum/language/visual) + + if(is_visual_language) + message_mods -= WHISPER_MODE + // Checks if the saymode or channel extension can be used even if not totally conscious. - var/say_radio_or_mode = saymode || message_mods[RADIO_EXTENSION] - if(say_radio_or_mode) - var/mob_stat_limit = GLOB.message_modes_stat_limits[say_radio_or_mode] - if(stat > (isnull(mob_stat_limit) ? CONSCIOUS : mob_stat_limit)) - saymode = null - message_mods -= RADIO_EXTENSION + if(!is_visual_language) + var/say_radio_or_mode = saymode || message_mods[RADIO_EXTENSION] + if(say_radio_or_mode) + var/mob_stat_limit = GLOB.message_modes_stat_limits[say_radio_or_mode] + if(stat > (isnull(mob_stat_limit) ? CONSCIOUS : mob_stat_limit)) + saymode = null + message_mods -= RADIO_EXTENSION + + if(message_mods[RADIO_KEY] || message_mods[MODE_HEADSET]) + SEND_SIGNAL(src, COMSIG_LIVING_USE_RADIO) switch(stat) - if(SOFT_CRIT) - message_mods[WHISPER_MODE] = MODE_WHISPER + if(CONSCIOUS) + if(!is_visual_language && HAS_TRAIT(src, TRAIT_SOFT_CRITICAL_CONDITION)) + message_mods[WHISPER_MODE] = MODE_WHISPER + if(UNCONSCIOUS) return - if(HARD_CRIT) - if(!message_mods[WHISPER_MODE]) - return + if(DEAD) say_dead(original_message) return @@ -171,31 +195,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(!COOLDOWN_FINISHED(client, say_slowmode)) to_chat(src, span_warning("Message not sent due to slowmode. Please wait [SSlag_switch.slowmode_cooldown/10] seconds between messages.\n\"[message]\"")) return - COOLDOWN_START(client, say_slowmode, SSlag_switch.slowmode_cooldown) - - if(!can_speak_basic(original_message, ignore_spam, forced)) - return - - language = message_mods[LANGUAGE_EXTENSION] - - if(!language) - language = get_selected_language() - var/mob/living/carbon/human/H = src - if(!can_speak_vocal(message)) - if(H.mind?.miming) - if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) - to_chat(src, span_warning("You stop yourself from signing in favor of the artform of mimery!")) - return - else - to_chat(src, span_green("Your vow of silence prevents you from speaking!")) - return - else - to_chat(src, span_warning("You find yourself unable to speak!")) - return - var/message_range = 7 - - var/succumbed = FALSE + COOLDOWN_START(client, say_slowmode, SSlag_switch.slowmode_cooldown) // If there's a custom say emote it gets logged differently. if(message_mods[MODE_CUSTOM_SAY_EMOTE]) @@ -204,17 +205,8 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( // If it's not erasing the input portion, then something is being said and this isn't a pure custom say emote. if(!message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) if(message_mods[WHISPER_MODE] == MODE_WHISPER) - message_range = 1 + range = 1 log_talk(message, LOG_WHISPER, forced_by = forced, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE]) - if(stat == HARD_CRIT) - var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health) - // If we cut our message short, abruptly end it with a-.. - var/message_len = length_char(message) - message = copytext_char(message, 1, health_diff) + "[message_len > health_diff ? "-.." : "..."]" - message = Ellipsis(message, 10, 1) - last_words = message - message_mods[WHISPER_MODE] = MODE_WHISPER_CRIT - succumbed = TRUE else log_talk(message, LOG_SAY, forced_by = forced, custom_say_emote = message_mods[MODE_CUSTOM_SAY_EMOTE]) @@ -223,58 +215,73 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( spans |= speech_span if(language) - var/datum/language/L = GLOB.language_datum_instances[language] - spans |= L.spans + spans |= language.spans if(message_mods[MODE_SING]) var/randomnote = pick("\u2669", "\u266A", "\u266B") message = "[randomnote] [message] [randomnote]" spans |= SPAN_SINGING + #ifdef UNIT_TESTS + // Saves a ref() to our arglist specifically. + // We do this because we need to check that COMSIG_MOB_SAY is getting EXACTLY this list. + last_say_args_ref = REF(args) + #endif + // Leaving this here so that anything that handles speech this way will be able to have spans affecting it and all that. - var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_SAY, args, message_range) + var/sigreturn = SEND_SIGNAL(src, COMSIG_MOB_SAY, args) if (sigreturn & COMPONENT_UPPERCASE_SPEECH) message = uppertext(message) + if(!message) - if(succumbed) - succumb() return //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 - - - //REMEMBER KIDS, LISTS ARE REFERENCES. RADIO PACKETS GET QUEUED. - var/radio_return = radio(radio_message, message_mods.Copy(), spans.Copy(), language)//roughly 27% of living/say()'s total cost - if(radio_return & ITALICS) - spans |= SPAN_ITALICS - if(radio_return & REDUCE_RANGE) - message_range = 1 - if(!message_mods[WHISPER_MODE]) - message_mods[WHISPER_MODE] = MODE_WHISPER - if(radio_return & NOPASS) - return TRUE - //No screams in space, unless you're next to someone. - var/turf/T = get_turf(src) - var/datum/gas_mixture/environment = T.unsafe_return_air() - var/pressure = (environment)? environment.returnPressure() : 0 - if(pressure < SOUND_MINIMUM_PRESSURE && !HAS_TRAIT(H, TRAIT_SIGN_LANG)) - message_range = 1 + if(is_visual_language) + if(message_mods[MODE_HEADSET] || message_mods[RADIO_KEY]) + return + else + 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 + + + //REMEMBER KIDS, LISTS ARE REFERENCES. RADIO PACKETS GET QUEUED. + var/radio_return = radio(radio_message, message_mods.Copy(), spans.Copy(), language)//roughly 27% of living/say()'s total cost + if(radio_return & ITALICS) + spans |= SPAN_ITALICS + if(radio_return & REDUCE_RANGE) + range = 1 + if(!message_mods[WHISPER_MODE]) + message_mods[WHISPER_MODE] = MODE_WHISPER + if(radio_return & NOPASS) + return TRUE + + if(!is_visual_language) + //No screams in space, unless you're next to someone. + var/turf/T = get_turf(src) + var/datum/gas_mixture/environment = T.unsafe_return_air() + var/pressure = (environment)? environment.returnPressure() : 0 + if(pressure < SOUND_MINIMUM_PRESSURE) + range = 1 + + if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message + spans |= SPAN_ITALICS - if(pressure < ONE_ATMOSPHERE*0.4) //Thin air, let's italicise the message - spans |= SPAN_ITALICS + if(language) + message = language.before_speaking(src, message) + if(isnull(message)) + return FALSE - send_speech(message, message_range, src, bubble_type, spans, language, message_mods)//roughly 58% of living/say()'s total cost + send_speech(message, range, src, bubble_type, spans, language, message_mods)//roughly 58% of living/say()'s total cost ///Play a sound to indicate we just spoke - if(client && !HAS_TRAIT(H, TRAIT_SIGN_LANG)) + if(client && !is_visual_language) var/ending = copytext_char(message, -1) var/sound/speak_sound if(ending == "?") @@ -283,18 +290,15 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( speak_sound = voice_type2sound[voice_type]["!"] else speak_sound = voice_type2sound[voice_type][voice_type] - playsound(src, speak_sound, 300, 1, SHORT_RANGE_SOUND_EXTRARANGE-2, falloff_exponent = 0, pressure_affected = FALSE, ignore_walls = FALSE, use_reverb = FALSE) - - if(succumbed) - succumb(TRUE) - to_chat(src, compose_message(src, language, message, , spans, message_mods)) + playsound(src, speak_sound, 300, 1, range - SOUND_RANGE, falloff_exponent = 0, pressure_affected = FALSE, ignore_walls = FALSE, use_reverb = FALSE) talkcount++ return TRUE -/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/living/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) - if(!client) + + if(!GET_CLIENT(src) && !LAZYLEN(observers)) return if(radio_freq && can_hear()) @@ -302,114 +306,86 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(isAI(V.source)) playsound_local(get_turf(src), 'goon/sounds/radio_ai.ogg', 170, 1, 0, 0, pressure_affected = FALSE, use_reverb = FALSE) - var/deaf_message - var/deaf_type - var/avoid_highlight - if(istype(speaker, /atom/movable/virtualspeaker)) - var/atom/movable/virtualspeaker/virt = speaker - avoid_highlight = src == virt.source + // Message has a language, the language handles it. + if(message_language) + raw_message = message_language.hear_speech(src, speaker, raw_message, radio_freq, spans, message_mods, sound_loc, message_range) + + //Language-less snowflake else - avoid_highlight = src == speaker + if(!can_hear()) + return - if(HAS_TRAIT(speaker, TRAIT_SIGN_LANG)) //Checks if speaker is using sign language - deaf_message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) - if(speaker != src) - if(!radio_freq) //I'm about 90% sure there's a way to make this less cluttered - deaf_type = 1 + var/avoid_highlight = FALSE + if(istype(speaker, /atom/movable/virtualspeaker)) + var/atom/movable/virtualspeaker/virt = speaker + avoid_highlight = speaker == virt.source else - deaf_type = 2 + avoid_highlight = src == speaker - // Create map text prior to modifying message for goonchat, sign lang edition - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && !(stat == UNCONSCIOUS || stat == HARD_CRIT || is_blind(src)) && (client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) || ismob(speaker))) - if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) - create_chat_message(speaker, null, message_mods[MODE_CUSTOM_SAY_EMOTE], spans, EMOTE_MESSAGE, sound_loc = sound_loc) - else - create_chat_message(speaker, message_language, raw_message, spans, sound_loc = sound_loc) + var/enable_runechat + if(ismob(speaker)) + enable_runechat = client.prefs.read_preference(/datum/preference/toggle/enable_runechat) + else + enable_runechat = client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs) - if(is_blind(src)) - return FALSE + raw_message = translate_speech(speaker, null, raw_message, spans, message_mods) + if(enable_runechat) + create_chat_message(speaker, null, raw_message, sound_loc = sound_loc, runechat_flags = EMOTE_MESSAGE) - message = deaf_message + var/chat_message = compose_message(speaker, null, raw_message, radio_freq) + var/shown = show_message(chat_message, MSG_AUDIBLE, avoid_highlighting = avoid_highlight) + if(shown && LAZYLEN(observers)) + for(var/mob/dead/observer/O in observers) + to_chat(O, shown) - show_message(message, MSG_VISUAL, deaf_message, deaf_type, avoid_highlight) - return message + if(raw_message) // If this is null, we didn't hear shit. + SEND_SIGNAL(src, COMSIG_LIVING_HEAR_POST_TRANSLATION, args) + return raw_message - if(speaker != src) - if(!radio_freq) //These checks have to be separate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. - deaf_message = "[span_name("[speaker]")] [speaker.verb_say] something but you cannot hear [speaker.p_them()]." - deaf_type = 1 - else - deaf_message = span_notice("You can't hear yourself!") - deaf_type = 2 // Since you should be able to hear yourself without looking +/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/is_whispering = 0 + var/whisper_range = 0 + if(message_mods[WHISPER_MODE]) //If we're whispering + // Needed for good hearing trait. The actual filtering for whispers happens at the /mob/living/Hear proc + whisper_range = MESSAGE_RANGE - WHISPER_RANGE + is_whispering = TRUE - // Create map text prior to modifying message for goonchat - if (client?.prefs.read_preference(/datum/preference/toggle/enable_runechat) && !(stat == UNCONSCIOUS || stat == HARD_CRIT) && (ismob(speaker) || client.prefs.read_preference(/datum/preference/toggle/enable_runechat_non_mobs)) && can_hear()) - if (message_mods[MODE_CUSTOM_SAY_ERASE_INPUT]) - create_chat_message(speaker, null, message_mods[MODE_CUSTOM_SAY_EMOTE], spans, EMOTE_MESSAGE, sound_loc = sound_loc) - else - create_chat_message(speaker, message_language, raw_message, spans, sound_loc = sound_loc) + var/list/listening = get_hearers_in_view(message_range + whisper_range, source) - // Recompose message for AI hrefs, language incomprehension. - message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mods) + #ifdef ZMIMIC_MULTIZ_SPEECH + if(bound_overlay) + listening += get_hearers_in_view(message_range + whisper_range, bound_overlay) + #endif - show_message(message, MSG_AUDIBLE, deaf_message, deaf_type, avoid_highlight) - return message - -/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/eavesdrop_range = 0 - 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() - if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) // Sign language - var/mob/living/carbon/mute = src - if(istype(mute)) - switch(mute.check_signables_state()) - if(SIGN_ONE_HAND) // One arm - message = stars(message) - if(SIGN_HANDS_FULL) // Full hands - mute.visible_message("tries to sign, but can't with [src.p_their()] hands full!", visible_message_flags = EMOTE_MESSAGE) - return FALSE - if(SIGN_ARMLESS) // No arms - to_chat(src, span_warning("You can't sign with no hands!")) - return FALSE - if(SIGN_TRAIT_BLOCKED) // Hands Blocked or Emote Mute traits - to_chat(src, span_warning("You can't sign at the moment!")) - return FALSE - if(SIGN_CUFFED) // Cuffed - mute.visible_message("tries to sign, but can't with [src.p_their()] hands bound!", visible_message_flags = EMOTE_MESSAGE) - return FALSE + if(client) //client is so that ghosts don't have to listen to mice for(var/mob/player_mob as anything in GLOB.player_list) if(QDELETED(player_mob)) //Some times nulls and deleteds stay in this list. This is a workaround to prevent ic chat breaking for everyone when they do. continue //Remove if underlying cause (likely byond issue) is fixed. See TG PR #49004. if(player_mob.stat != DEAD) //not dead, not important continue + if(!player_mob.z) //Observing ghosts are in nullspace, pretend they don't exist + continue if(player_mob.z != z || get_dist(player_mob, src) > 7) //they're out of range of normal hearing - if(eavesdrop_range) + if(is_whispering) if(!(player_mob.client?.prefs.chat_toggles & CHAT_GHOSTWHISPER)) //they're whispering and we have hearing whispers at any range off continue else if(!(player_mob.client?.prefs.chat_toggles & CHAT_GHOSTEARS)) //they're talking normally and we have hearing at any range off continue + listening |= player_mob the_dead[player_mob] = TRUE - var/eavesdropping - var/eavesrendered - if(eavesdrop_range) - eavesdropping = stars(message) - eavesrendered = compose_message(src, message_language, eavesdropping, , spans, message_mods) - - var/rendered = compose_message(src, message_language, message, , spans, message_mods) + var/rendered = compose_message(src, message_language, message, null, spans, message_mods) for(var/atom/movable/listening_movable as anything in listening) if(!listening_movable) stack_trace("somehow theres a null returned from get_hearers_in_view() in send_speech!") continue - if(eavesdrop_range && get_dist(source, listening_movable) > message_range && !(the_dead[listening_movable])) - listening_movable.Hear(eavesrendered, src, message_language, eavesdropping, , spans, message_mods) - else - listening_movable.Hear(rendered, src, message_language, message, , spans, message_mods) + + listening_movable.Hear(rendered, src, message_language, message, null, spans, message_mods, message_range = message_range) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) //speech bubble @@ -417,8 +393,10 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( for(var/mob/M in listening) if(M.client && (!M.client.prefs.read_preference(/datum/preference/toggle/enable_runechat) || (SSlag_switch.measures[DISABLE_RUNECHAT] && !HAS_TRAIT(src, TRAIT_BYPASS_MEASURES)))) 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, GLOBAL_PROC_REF(animate_speechbubble), I, speech_bubble_recipients, 30) /mob/proc/binarycheck() @@ -439,27 +417,38 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return TRUE /mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels - var/mob/living/carbon/human/H = src if(HAS_TRAIT(src, TRAIT_MUTE)) - return (HAS_TRAIT(src, TRAIT_SIGN_LANG) && !H.mind.miming) //Makes sure mimes can't speak using sign language + return FALSE //Makes sure mimes can't speak using sign language if(is_muzzled()) - return (HAS_TRAIT(src, TRAIT_SIGN_LANG) && !H.mind.miming) + return FALSE if(!IsVocal()) - return (HAS_TRAIT(src, TRAIT_SIGN_LANG) && !H.mind.miming) + return FALSE return TRUE +/mob/living/proc/can_speak_sign(message) + return TRUE - -/mob/living/proc/treat_message(message) +/** + * Treats the passed message with things that may modify speech (stuttering, slurring etc). + * + * message - The message to treat. + * correct_grammar - Whether or not to capitalize the first letter and add punctuation. + */ +/mob/living/proc/treat_message(message, correct_grammar = TRUE) if(HAS_TRAIT(src, TRAIT_UNINTELLIGIBLE_SPEECH)) message = unintelligize(message) SEND_SIGNAL(src, COMSIG_LIVING_TREAT_MESSAGE, args) - message = capitalize(message) + if(correct_grammar) + message = capitalize(message) + + var/static/regex/ends_with_punctuation = regex("\[?!-.\]") + if((!client || client.prefs.read_preference(/datum/preference/toggle/auto_punctuation)) && !ends_with_punctuation.Find(message, length(message))) + message += "." return message @@ -491,23 +480,28 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return 0 -/mob/living/say_mod(input, list/message_mods = list()) +/mob/living/say_mod(input, list/message_mods = list(), datum/language/language) + if(language && (language.flags & LANGUAGE_OVERRIDE_SAY_MOD)) + return language.get_say_mod(src) + if(message_mods[WHISPER_MODE] == MODE_WHISPER) . = verb_whisper - else if(message_mods[WHISPER_MODE] == MODE_WHISPER_CRIT) - . = "[verb_whisper] in [p_their()] last breath" + else if(message_mods[MODE_SING]) . = verb_sing + + if(.) + return + + // Any subtype of slurring in our status effects make us "slur" + if(has_status_effect(/datum/status_effect/speech/slurring)) + return "slurs" + else if(has_status_effect(/datum/status_effect/speech/stutter)) - if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) - . = "shakily signs" - else - . = "stammers" + . = "stammers" + else if(has_status_effect(/datum/status_effect/speech/stutter/derpspeech)) - if(HAS_TRAIT(src, TRAIT_SIGN_LANG)) - . = "incoherently signs" - else - . = "gibbers" + . = "gibbers" else . = ..() @@ -534,3 +528,21 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if(get_minds && mind) return mind.get_language_holder() . = ..() + +/mob/living/proc/hear_sleeping(message) + var/heard = "" + if(prob(15)) + var/list/punctuation = list(",", "!", ".", ";", "?") + var/list/messages = splittext(message, " ") + var/R = rand(1, length(messages)) + var/heardword = messages[R] + if(copytext(heardword,1, 1) in punctuation) + heardword = copytext(heardword,2) + if(copytext(heardword,-1) in punctuation) + heardword = copytext(heardword,1,length(heardword)) + heard = "...You hear something about...[heardword]" + + else + heard = "...You almost hear someone talking..." + + to_chat(src, heard) diff --git a/code/modules/mob/living/living_stripping.dm b/code/modules/mob/living/living_stripping.dm index a0956eb26724..793745cf3a4c 100644 --- a/code/modules/mob/living/living_stripping.dm +++ b/code/modules/mob/living/living_stripping.dm @@ -1,7 +1,7 @@ -/mob/living/proc/should_strip(mob/user) +/mob/living/proc/should_strip(mob/living/user) . = TRUE - if(user.pulling == src && isliving(user)) + if(user.is_grabbing(src) && !user.combat_mode && isliving(user)) var/mob/living/living_user = user if(mob_size < living_user.mob_size) // If we're smaller than user return !mob_pickup_checks(user, FALSE) diff --git a/code/modules/mob/living/living_update_icons.dm b/code/modules/mob/living/living_update_icons.dm index be0d4daab7f2..02a7f32a9e8a 100644 --- a/code/modules/mob/living/living_update_icons.dm +++ b/code/modules/mob/living/living_update_icons.dm @@ -14,4 +14,4 @@ resize = RESIZE_DEFAULT_SIZE if(changed) - animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT) + z_animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT) diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm index 7d610f25d4f3..9e3184a8e420 100644 --- a/code/modules/mob/living/navigation.dm +++ b/code/modules/mob/living/navigation.dm @@ -63,7 +63,7 @@ stack_trace("Navigate target ([navigate_target]) is not an atom, somehow.") return - var/list/path = get_path_to(src, navigate_target, MAX_NAVIGATE_RANGE, mintargetdist = 1, id = get_idcard(), skip_first = FALSE) + var/list/path = jps_path_to(src, navigate_target, MAX_NAVIGATE_RANGE, mintargetdist = 1, access = get_idcard()?.GetAccess(), skip_first = FALSE) if(!length(path)) balloon_alert(src, "no valid path with current access!") return @@ -121,7 +121,7 @@ return var/target - for(var/obj/structure/ladder/lad in GLOB.ladders) + for(var/obj/structure/ladder/lad as anything in INSTANCES_OF(/obj/structure/ladder)) if(lad.z != z) continue if(direction == UP && !lad.up) @@ -131,11 +131,11 @@ if(!target) target = lad continue - if(get_dist_euclidian(lad, src) > get_dist_euclidian(target, src)) + if(get_dist_euclidean(lad, src) > get_dist_euclidean(target, src)) continue target = lad - for(var/obj/structure/stairs/stairs_bro in GLOB.stairs) + for(var/obj/structure/stairs/stairs_bro as anything in INSTANCES_OF(/obj/structure/stairs)) if(direction == UP && stairs_bro.z != z) //if we're going up, we need to find stairs on our z level continue if(direction == DOWN && stairs_bro.z != z - 1) //if we're going down, we need to find stairs on the z level beneath us @@ -143,7 +143,7 @@ if(!target) target = stairs_bro.z == z ? stairs_bro : GetAbove(stairs_bro) //if the stairs aren't on our z level, get the turf above them (on our zlevel) to path to instead continue - if(get_dist_euclidian(stairs_bro, src) > get_dist_euclidian(target, src)) + if(get_dist_euclidean(stairs_bro, src) > get_dist_euclidean(target, src)) continue target = stairs_bro.z == z ? stairs_bro : GetAbove(stairs_bro) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a777ed4183bd..5338fda15dfc 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -179,7 +179,8 @@ )) GLOB.ai_list += src - GLOB.shuttle_caller_list += src + + SET_TRACKING(TRACKING_KEY_SHUTTLE_CALLER) builtInCamera = new (src) builtInCamera.network = list("ss13") @@ -215,7 +216,7 @@ /mob/living/silicon/ai/Destroy() GLOB.ai_list -= src - GLOB.shuttle_caller_list -= src + UNSET_TRACKING(TRACKING_KEY_SHUTTLE_CALLER) SSshuttle.autoEvac() QDEL_NULL(eyeobj) // No AI, no Eye QDEL_NULL(spark_system) @@ -325,7 +326,7 @@ // hack to display shuttle timer if(!EMERGENCY_IDLE_OR_RECALLED) - var/obj/machinery/computer/communications/C = locate() in GLOB.machines + var/obj/machinery/computer/communications/C = locate() in INSTANCES_OF(/obj/machinery/computer/communications) if(C) C.post_status("shuttle") @@ -413,14 +414,14 @@ src << browse(last_paper_seen, "window=show_paper") //Carn: holopad requests if(href_list["jump_to_holopad"]) - var/obj/machinery/holopad/Holopad = locate(href_list["jump_to_holopad"]) in GLOB.machines + var/obj/machinery/holopad/Holopad = locate(href_list["jump_to_holopad"]) in INSTANCES_OF(/obj/machinery/holopad) if(Holopad) cam_prev = get_turf(eyeobj) eyeobj.setLoc(Holopad) else to_chat(src, span_notice("Unable to locate the holopad.")) if(href_list["project_to_holopad"]) - var/obj/machinery/holopad/Holopad = locate(href_list["project_to_holopad"]) in GLOB.machines + var/obj/machinery/holopad/Holopad = locate(href_list["project_to_holopad"]) in INSTANCES_OF(/obj/machinery/holopad) if(Holopad) lastloc = get_turf(eyeobj) Holopad.attack_ai_secondary(src) //may as well recycle @@ -447,7 +448,7 @@ to_chat(src, "Target is not on or near any active cameras on the station.") return if (href_list["ai_take_control"]) //Mech domination - var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in GLOB.mechas_list + var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) in INSTANCES_OF(/obj/vehicle/sealed/mecha) if (!M) return @@ -604,8 +605,8 @@ if("Station Member") var/list/personnel_list = list() - for(var/datum/data/record/record_datum in GLOB.data_core.locked)//Look in data core locked. - personnel_list["[record_datum.fields["name"]]: [record_datum.fields["rank"]]"] = record_datum.fields["character_appearance"]//Pull names, rank, and image. + for(var/datum/data/record/record_datum in SSdatacore.get_records(DATACORE_RECORDS_LOCKED))//Look in data core locked. + personnel_list["[record_datum.fields[DATACORE_NAME]]: [record_datum.fields[DATACORE_RANK]]"] = record_datum.fields[DATACORE_APPEARANCE]//Pull names, rank, and image. if(!length(personnel_list)) tgui_alert(usr,"No suitable records found. Aborting.") @@ -789,11 +790,11 @@ to_chat(src, "You have been downloaded to a mobile storage device. Remote device connection severed.") to_chat(user, "[span_boldnotice("Transfer successful")]: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory.") -/mob/living/silicon/ai/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) +/mob/living/silicon/ai/canUseTopic(atom/movable/target, flags) if(control_disabled) to_chat(src, span_warning("You can't do that right now!")) return FALSE - return can_see(M) && ..() //stop AIs from leaving windows open and using then after they lose vision + return can_see(target) && ..() //stop AIs from leaving windows open and using then after they lose vision /mob/living/silicon/ai/proc/can_see(atom/A) if(isturf(loc)) //AI in core, check if on cameras @@ -806,7 +807,7 @@ 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, list/message_mods = list()) - var/treated_message = lang_treat(speaker, message_language, raw_message, spans, message_mods) + var/treated_message = translate_speech(speaker, message_language, raw_message, spans, message_mods, quote = TRUE) var/start = "Relayed Speech: " var/namepart = "[speaker.GetVoice()][speaker.get_alt_name()]" var/hrefpart = "" @@ -1016,14 +1017,14 @@ set name = "Move Upwards" set category = "IC" - if(eyeobj.zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) + if(zstep(eyeobj, UP, ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move upwards.")) /mob/living/silicon/ai/down() set name = "Move Down" set category = "IC" - if(eyeobj.zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) + if(zstep(eyeobj, DOWN, ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) /// Proc to hook behavior to the changes of the value of [aiRestorePowerRoutine]. diff --git a/code/modules/mob/living/silicon/ai/ai_say.dm b/code/modules/mob/living/silicon/ai/ai_say.dm index 72484efb2bb0..ed648746cc6d 100644 --- a/code/modules/mob/living/silicon/ai/ai_say.dm +++ b/code/modules/mob/living/silicon/ai/ai_say.dm @@ -1,4 +1,4 @@ -/mob/living/silicon/ai/say(message, bubble_type,list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/silicon/ai/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if(parent && istype(parent) && parent.stat != DEAD) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead. return parent.say(arglist(args)) return ..() diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm index f1d94b8710bb..0af8aec836a4 100644 --- a/code/modules/mob/living/silicon/ai/death.dm +++ b/code/modules/mob/living/silicon/ai/death.dm @@ -16,7 +16,7 @@ else icon_state = "ai_dead" if("[old_icon]_death_transition" in icon_states(icon)) - flick("[old_icon]_death_transition", src) + z_flick("[old_icon]_death_transition", src) cameraFollow = null @@ -30,7 +30,7 @@ set_eyeobj_visible(FALSE) - GLOB.shuttle_caller_list -= src + UNSET_TRACKING(TRACKING_KEY_SHUTTLE_CALLER) SSshuttle.autoEvac() ShutOffDoomsdayDevice() diff --git a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm index 583c3225ef84..5fee3990cb48 100644 --- a/code/modules/mob/living/silicon/ai/freelook/cameranet.dm +++ b/code/modules/mob/living/silicon/ai/freelook/cameranet.dm @@ -130,6 +130,18 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new) chunk.cameras |= c chunk.hasChanged() +/// A faster, turf only version of [/datum/cameranet/proc/majorChunkChange] +/// For use in sensitive code, be careful with it +/datum/cameranet/proc/bareMajorChunkChange(turf/changed) + var/x1 = max(1, changed.x - (CHUNK_SIZE / 2)) + var/y1 = max(1, changed.y - (CHUNK_SIZE / 2)) + var/x2 = min(world.maxx, changed.x + (CHUNK_SIZE / 2)) + var/y2 = min(world.maxy, changed.y + (CHUNK_SIZE / 2)) + for(var/x = x1; x <= x2; x += CHUNK_SIZE) + for(var/y = y1; y <= y2; y += CHUNK_SIZE) + var/datum/camerachunk/chunk = chunkGenerated(x, y, changed.z) + chunk?.hasChanged() + /// Will check if a mob is on a viewable turf. Returns 1 if it is, otherwise returns 0. /datum/cameranet/proc/checkCameraVis(mob/living/target) var/turf/position = get_turf(target) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index d0246f3b7b5b..9ee29e7b3edf 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -8,7 +8,9 @@ icon_state = "ai_camera" icon = 'icons/mob/cameramob.dmi' invisibility = INVISIBILITY_MAXIMUM - hud_possible = list(ANTAG_HUD, AI_DETECT_HUD = HUD_LIST_LIST) + hud_possible = list( + AI_DETECT_HUD = HUD_LIST_LIST + ) var/list/visibleCameraChunks = list() var/mob/living/silicon/ai/ai = null var/relay_speech = FALSE @@ -35,14 +37,14 @@ 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) - hud.remove_from_hud(src) + hud.remove_atom_from_hud(src) QDEL_LIST(old_images) return - if(!length(hud.hudusers)) + if(!length(hud.hud_users)) return //no one is watching, do not bother updating anything - hud.remove_from_hud(src) + hud.remove_atom_from_hud(src) var/static/list/vis_contents_opaque = list() var/obj/effect/overlay/ai_detect_hud/hud_obj = vis_contents_opaque[ai_detector_color] @@ -53,15 +55,18 @@ var/list/new_images = list() var/list/turfs = get_visible_turfs() + for(var/T in turfs) var/image/I = (old_images.len > new_images.len) ? old_images[new_images.len + 1] : image(null, T) I.loc = T I.vis_contents += hud_obj new_images += I + for(var/i in (new_images.len + 1) to old_images.len) qdel(old_images[i]) + hud_list[AI_DETECT_HUD] = new_images - hud.add_to_hud(src) + hud.add_atom_to_hud(src) /mob/camera/ai_eye/proc/get_visible_turfs() if(!isturf(loc)) @@ -101,11 +106,6 @@ if(ai.master_multicam) ai.master_multicam.refresh_view() -/mob/camera/ai_eye/zMove(dir, turf/target, z_move_flags = NONE, recursions_left = 1, list/falling_movs) - . = ..() - if(.) - setLoc(loc, force_update = TRUE) - /mob/camera/ai_eye/Move() return @@ -124,7 +124,7 @@ GLOB.aiEyes -= src if(ai_detector_visible) var/datum/atom_hud/ai_detector/hud = GLOB.huds[DATA_HUD_AI_DETECT] - hud.remove_from_hud(src) + hud.remove_atom_from_hud(src) var/list/L = hud_list[AI_DETECT_HUD] QDEL_LIST(L) return ..() @@ -187,8 +187,7 @@ all_eyes += eyeobj eyeobj.ai = src eyeobj.setLoc(loc) - eyeobj.name = "[name] (AI Eye)" - eyeobj.real_name = eyeobj.name + eyeobj.set_real_name("[name] (AI Eye)") set_eyeobj_visible(TRUE) /mob/living/silicon/ai/proc/set_eyeobj_visible(state = TRUE) @@ -206,7 +205,7 @@ acceleration = !acceleration to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].") -/mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/camera/ai_eye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() 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_mods) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 338f85ab3007..f844dc3ddc90 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -91,9 +91,8 @@ /area/centcom/ai_multicam_room name = "ai_multicam_room" icon_state = "ai_camera_room" - static_lighting = FALSE + area_lighting = AREA_LIGHTING_STATIC - base_lighting_alpha = 255 area_flags = NOTELEPORT | HIDDEN_AREA | UNIQUE_AREA ambientsounds = null flags_1 = NONE @@ -102,7 +101,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) /obj/effect/landmark/ai_multicam_room name = "ai camera room" - icon = 'icons/mob/landmarks.dmi' + icon = 'icons/mob/autogen_landmarks.dmi' icon_state = "x" /obj/effect/landmark/ai_multicam_room/Initialize(mapload) @@ -206,7 +205,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) if(!silent) to_chat(src, span_warning("Cannot place more than [max_multicams] multicamera windows.")) return - var/atom/movable/screen/movable/pic_in_pic/ai/C = new /atom/movable/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(null, hud_used) C.set_view_size(3, 3, FALSE) C.set_view_center(get_turf(eyeobj)) C.set_ai(src) diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index b90e42510081..298145f79e4f 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -482,7 +482,6 @@ GLOBAL_LIST_INIT(vox_sounds, list("abduction" = 'sound/vox_fem/abduction.ogg', "laser" = 'sound/vox_fem/laser.ogg', "last" = 'sound/vox_fem/last.ogg', "launch" = 'sound/vox_fem/launch.ogg', -"lavaland" = 'sound/vox_fem/lavaland.ogg', "law" = 'sound/vox_fem/law.ogg', "laws" = 'sound/vox_fem/laws.ogg', "lawyer" = 'sound/vox_fem/lawyer.ogg', diff --git a/code/modules/mob/living/silicon/damage_procs.dm b/code/modules/mob/living/silicon/damage_procs.dm index ed939d0c114a..2c21599710df 100644 --- a/code/modules/mob/living/silicon/damage_procs.dm +++ b/code/modules/mob/living/silicon/damage_procs.dm @@ -33,7 +33,7 @@ /mob/living/silicon/setStaminaLoss(amount, updating_health = TRUE) return FALSE -/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500) //immune to organ damage (no organs, duh) +/mob/living/silicon/adjustOrganLoss(slot, amount, maximum = 500, updating_health) //immune to organ damage (no organs, duh) return FALSE /mob/living/silicon/setOrganLoss(slot, amount) diff --git a/code/modules/mob/living/silicon/pai/death.dm b/code/modules/mob/living/silicon/pai/death.dm index b25372a07e17..c1307ce346dc 100644 --- a/code/modules/mob/living/silicon/pai/death.dm +++ b/code/modules/mob/living/silicon/pai/death.dm @@ -7,4 +7,11 @@ //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. ghostize() + + if (!QDELETED(card) && loc != card) + card.forceMove(drop_location()) + card.pai = null + card.emotion_icon = initial(card.emotion_icon) + card.update_appearance() + qdel(src) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index fdcb5c82cdf8..7d1ed88727dd 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -193,11 +193,7 @@ QDEL_NULL(signaler) QDEL_NULL(hostscan) QDEL_NULL(internal_gps) - if(!QDELETED(card) && loc != card) - card.forceMove(drop_location()) - card.pai = null //these are otherwise handled by paicard/handle_atom_del() - card.emotion_icon = initial(card.emotion_icon) - card.update_appearance() + card = null GLOB.pai_list -= src return ..() @@ -212,15 +208,16 @@ /mob/living/silicon/pai/get_status_tab_items() . += ..() if(!stat) - . += text("Emitter Integrity: [emitterhealth * (100 / emittermaxhealth)]") + . += "Emitter Integrity: [emitterhealth * (100 / emittermaxhealth)]" else - . += text("Systems nonfunctional") + . += "Systems nonfunctional" // See software.dm for Topic() -/mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) - return ..(M, be_close, no_dexterity, no_tk, need_hands, TRUE) //Resting is just an aesthetic feature for them. +/mob/living/silicon/pai/canUseTopic(atom/movable/target, flags) + flags |= USE_RESTING + return ..(target, flags) //Resting is just an aesthetic feature for them. /mob/proc/makePAI(delold) var/obj/item/paicard/card = new /obj/item/paicard(get_turf(src)) diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 8036bd1c0d88..deac77c2ce66 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -55,7 +55,9 @@ . = fold_out(force) return visible_message(span_notice("[src] deactivates its holochassis emitter and folds back into a compact card!")) - stop_pulling() + + release_all_grabs() + if(ismobholder(loc)) var/obj/item/mob_holder/MH = loc MH.release_mob(display_messages = FALSE) @@ -137,7 +139,7 @@ if(loc != card) visible_message(span_notice("[src] [resting? "lays down for a moment..." : "perks up from the ground."]")) -/mob/living/silicon/pai/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) +/mob/living/silicon/pai/try_make_grab(atom/movable/target, grab_type) return FALSE /mob/living/silicon/pai/proc/toggle_integrated_light() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 1c6b25096d86..c6287a30c981 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -85,7 +85,7 @@ to_chat(src, span_warning("You are not being carried by anyone!")) return FALSE if("crew_manifest") - ai_roster() + show_crew_manifest(src) if("door_jack") if(params["jack"] == "jack") if(hacking_cable?.machine) @@ -119,10 +119,10 @@ medHUD = !medHUD if(medHUD) var/datum/atom_hud/med = GLOB.huds[med_hud] - med.add_hud_to(src) + med.show_to(src) else var/datum/atom_hud/med = GLOB.huds[med_hud] - med.remove_hud_from(src) + med.hide_from(src) if("newscaster") newscaster.ui_interact(src) if("photography_module") @@ -136,9 +136,9 @@ return FALSE refresh_spam = TRUE if(params["list"] == "medical") - medical_records = GLOB.data_core.get_general_records() + medical_records = SSdatacore.get_general_records() if(params["list"] == "security") - security_records = GLOB.data_core.get_security_records() + security_records = SSdatacore.get_security_records() ui.send_full_update() addtimer(CALLBACK(src, PROC_REF(refresh_again)), 3 SECONDS) if("remote_signaler") @@ -147,10 +147,10 @@ secHUD = !secHUD if(secHUD) var/datum/atom_hud/sec = GLOB.huds[sec_hud] - sec.add_hud_to(src) + sec.show_to(src) else var/datum/atom_hud/sec = GLOB.huds[sec_hud] - sec.remove_hud_from(src) + sec.hide_from(src) if("universal_translator") if(!languages_granted) grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_SOFTWARE) diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 81c574583a0a..e156189bc5f0 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,6 +1,7 @@ /datum/emote/silicon - mob_type_allowed_typecache = list(/mob/living/silicon) + mob_type_allowed_typecache = list(/mob/living/silicon, /mob/living/carbon/human) emote_type = EMOTE_AUDIBLE + species_type_whitelist_typecache = list(/datum/species/ipc) /datum/emote/silicon/boop key = "boop" diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 3805f7860104..b66981f927b2 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -39,7 +39,7 @@ . += "It appears to be an [deployed ? "active" : "empty"] AI shell." else if(!client) . += "It appears to be in stand-by mode." //afk - if(SOFT_CRIT, UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) . += span_warning("It doesn't seem to be responding.") if(DEAD) . += span_deadsay("It looks like its system is corrupted and requires a reset.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index e0603ee55c16..ab77be2b9576 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -24,9 +24,9 @@ robot_modules_background.icon_state = "block" robot_modules_background.plane = HUD_PLANE - inv1 = new /atom/movable/screen/robot/module1() - inv2 = new /atom/movable/screen/robot/module2() - inv3 = new /atom/movable/screen/robot/module3() + inv1 = new /atom/movable/screen/robot/module1(null, hud_used) + inv2 = new /atom/movable/screen/robot/module2(null, hud_used) + inv3 = new /atom/movable/screen/robot/module3(null, hud_used) ident = rand(1, 999) @@ -69,8 +69,7 @@ mmi.brain.name = "[real_name]'s brain" mmi.name = "[initial(mmi.name)]: [real_name]" mmi.set_brainmob(new /mob/living/brain(mmi)) - mmi.brainmob.name = src.real_name - mmi.brainmob.real_name = src.real_name + mmi.brainmob.set_real_name(src.real_name) mmi.brainmob.container = mmi mmi.update_appearance() setup_default_name() @@ -153,6 +152,7 @@ QDEL_NULL(hands) QDEL_NULL(spark_system) QDEL_NULL(alert_control) + QDEL_LIST(upgrades) cell = null return ..() @@ -407,6 +407,9 @@ set category = "IC" set src = usr + return ..() + +/mob/living/silicon/robot/execute_mode() if(incapacitated()) return var/obj/item/W = get_active_held_item() @@ -468,7 +471,7 @@ if(!lamp_functional) return lamp_functional = FALSE - playsound(src, 'sound/effects/glass_step.ogg', 50) + playsound(src, 'sound/effects/small_glass_break.ogg', 50) toggle_headlamp(TRUE) to_chat(src, span_danger("Your headlamp is broken! You'll need a human to help replace it.")) @@ -563,7 +566,7 @@ if(AI_NOTIFICATION_CYBORG_DISCONNECTED) //Tampering with the wires to_chat(connected_ai, "

[span_notice("NOTICE - Remote telemetry lost with [name].")]
") -/mob/living/silicon/robot/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) +/mob/living/silicon/robot/canUseTopic(atom/movable/target, flags) if(lockcharge || low_power_mode) to_chat(src, span_warning("You can't do that right now!")) return FALSE @@ -812,8 +815,7 @@ upgrades |= new /obj/item/borg/upgrade/ai(src) shell = TRUE braintype = "AI Shell" - name = "Empty AI Shell-[ident]" - real_name = name + set_real_name("Empty AI Shell-[ident]") GLOB.available_ai_shells |= src if(!QDELETED(builtInCamera)) builtInCamera.c_tag = real_name //update the camera name too @@ -831,8 +833,7 @@ qdel(boris) shell = FALSE GLOB.available_ai_shells -= src - name = "Unformatted Cyborg-[ident]" - real_name = name + set_real_name("Unformatted Cyborg-[ident]") if(!QDELETED(builtInCamera)) builtInCamera.c_tag = real_name diag_hud_set_aishell() @@ -844,8 +845,8 @@ * * AI - AI unit that initiated the deployment into the AI shell */ /mob/living/silicon/robot/proc/deploy_init(mob/living/silicon/ai/AI) - real_name = "[AI.real_name] [designation] Shell-[ident]" - name = real_name + set_real_name("[AI.real_name] [designation] Shell-[ident]") + if(!QDELETED(builtInCamera)) builtInCamera.c_tag = real_name //update the camera name too mainframe = AI @@ -925,12 +926,11 @@ buckle_mob_flags= RIDER_NEEDS_ARM // just in case return ..() -/mob/living/silicon/robot/resist() +/mob/living/silicon/robot/execute_resist() . = ..() if(!has_buckled_mobs()) return - for(var/i in buckled_mobs) - var/mob/unbuckle_me_now = i + for(var/mob/unbuckle_me_now as anything in buckled_mobs) unbuckle_mob(unbuckle_me_now, FALSE) diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 4853dedb47f0..5fb8118eb85f 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(U.locked) to_chat(user, span_warning("The upgrade is locked and cannot be used yet!")) return - if(!user.canUnEquip(U)) + if(!user.canUnequipItem(U)) to_chat(user, span_warning("The upgrade is stuck to you and you can't seem to let go of it!")) return add_to_upgrades(U, user) diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index b9c53dea151b..0aaa3ad258b3 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -23,7 +23,7 @@ radio = /obj/item/radio/borg blocks_emissive = EMISSIVE_BLOCK_UNIQUE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE //AI shell @@ -71,7 +71,12 @@ var/atom/movable/screen/robot/modpc/interfaceButton var/sight_mode = 0 - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) + hud_possible = list( + DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_HUD = 'icons/mob/huds/hud.dmi', + DIAG_BATT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_TRACK_HUD = 'icons/mob/huds/hud.dmi' + ) // ------------------------------------------ Modules (tool slots) var/obj/item/module_active = null diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 2b2034ccbd5b..caa5e8378415 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -236,7 +236,7 @@ /obj/item/robot_model/proc/do_transform_delay() var/mob/living/silicon/robot/cyborg = loc sleep(1) - flick("[cyborg_base_icon]_transform", cyborg) + z_flick("[cyborg_base_icon]_transform", cyborg) cyborg.notransform = TRUE if(locked_transform) cyborg.SetLockdown(TRUE) @@ -282,7 +282,7 @@ /obj/item/stamp/clown, /obj/item/bikehorn, /obj/item/bikehorn/airhorn, - /obj/item/paint/anycolor, + /obj/item/paint_sprayer, /obj/item/soap/nanotrasen/cyborg, /obj/item/pneumatic_cannon/pie/selfcharge/cyborg, /obj/item/razor, //killbait material @@ -355,7 +355,7 @@ /obj/item/paint_remover, /obj/item/lightreplacer/cyborg, /obj/item/holosign_creator, - /obj/item/reagent_containers/spray/cyborg_drying) + ) radio_channels = list(RADIO_CHANNEL_SERVICE) emag_modules = list(/obj/item/reagent_containers/spray/cyborg_lube) cyborg_base_icon = "janitor" @@ -549,7 +549,7 @@ reagents.expose(our_turf, TOUCH, min(1, 10 / reagents.total_volume)) // We use more water doing this then mopping - reagents.remove_any(2) //reaction() doesn't use up the reagents + reagents.remove_all(2) //reaction() doesn't use up the reagents /datum/action/toggle_buffer/build_all_button_icons(status_only = FALSE, force = FALSE) if(buffer_on) @@ -561,11 +561,6 @@ return ..() -/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) @@ -577,10 +572,6 @@ for(var/charge in 1 to coeff) light_replacer.Charge(cyborg) - var/obj/item/reagent_containers/spray/cyborg_drying/drying_agent = locate(/obj/item/reagent_containers/spray/cyborg_drying) in basic_modules - if(drying_agent) - drying_agent.reagents.add_reagent(/datum/reagent/drying_agent, 5 * coeff) - var/obj/item/reagent_containers/spray/cyborg_lube/lube = locate(/obj/item/reagent_containers/spray/cyborg_lube) in emag_modules if(lube) lube.reagents.add_reagent(/datum/reagent/lube, 2 * coeff) @@ -600,7 +591,6 @@ /obj/item/borg/apparatus/beaker, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, - /obj/item/surgical_drapes, /obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, @@ -611,7 +601,7 @@ /obj/item/extinguisher/mini, /obj/item/roller/robo, /obj/item/borg/cyborghug/medical, - /obj/item/stack/medical/gauze, + /obj/item/stack/gauze, /obj/item/stack/medical/bone_gel, /obj/item/borg/apparatus/organ_storage, /obj/item/borg/lollipop) @@ -638,7 +628,6 @@ /obj/item/weldingtool/mini, /obj/item/extinguisher/mini, /obj/item/storage/bag/sheetsnatcher/borg, - /obj/item/gun/energy/recharge/kinetic_accelerator/cyborg, /obj/item/gps/cyborg, /obj/item/stack/marker_beacon) radio_channels = list(RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY) @@ -649,7 +638,6 @@ borg_skins = list( "Asteroid Miner" = list(SKIN_ICON_STATE = "minerOLD"), "Spider Miner" = list(SKIN_ICON_STATE = "spidermin"), - "Lavaland Miner" = list(SKIN_ICON_STATE = "miner"), ) var/obj/item/t_scanner/adv_mining_scanner/cyborg/mining_scanner //built in memes. //fuck you @@ -735,7 +723,6 @@ /obj/item/storage/bag/tray, /obj/item/reagent_containers/borghypo/borgshaker, /obj/item/borg/lollipop, - /obj/item/stack/pipe_cleaner_coil/cyborg, /obj/item/borg/apparatus/beaker/service) radio_channels = list(RADIO_CHANNEL_SERVICE) emag_modules = list(/obj/item/reagent_containers/borghypo/borgshaker/hacked) @@ -791,7 +778,6 @@ /obj/item/reagent_containers/borghypo/syndicate, /obj/item/shockpaddles/syndicate/cyborg, /obj/item/healthanalyzer, - /obj/item/surgical_drapes, /obj/item/retractor, /obj/item/hemostat, /obj/item/cautery, @@ -802,7 +788,7 @@ /obj/item/crowbar/cyborg, /obj/item/extinguisher/mini, /obj/item/pinpointer/syndicate_cyborg, - /obj/item/stack/medical/gauze, + /obj/item/stack/gauze, /obj/item/gun/medbeam, /obj/item/borg/apparatus/organ_storage) @@ -919,8 +905,3 @@ max_energy = 30 recharge_rate = 1 name = "Marker Beacon Storage" - -/datum/robot_energy_storage/pipe_cleaner - max_energy = 50 - recharge_rate = 2 - name = "Pipe Cleaner Synthesizer" diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index c2c5896c1a83..ecf347e01a63 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -22,7 +22,11 @@ var/designation = "" var/radiomod = "" //Radio character used before state laws/arrivals announce to allow department transmissions, default, or none at all. var/obj/item/camera/siliconcam/aicamera = null //photography - hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_TRACK_HUD) + hud_possible = list( + DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_HUD = 'icons/mob/huds/hud.dmi', + DIAG_TRACK_HUD = 'icons/mob/huds/hud.dmi' + ) var/obj/item/radio/borg/radio = null ///If this is a path, this gets created as an object in Initialize. @@ -59,7 +63,7 @@ if(ispath(radio)) radio = new radio(src) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) + diag_hud.add_atom_to_hud(src) diag_hud_set_status() diag_hud_set_health() add_sensors() @@ -77,6 +81,7 @@ QDEL_NULL(builtInCamera) laws?.owner = null //Laws will refuse to die otherwise. QDEL_NULL(laws) + QDEL_NULL(modularInterface) GLOB.silicon_mobs -= src return ..() @@ -336,17 +341,6 @@ usr << browse(list, "window=laws") -/mob/living/silicon/proc/ai_roster() - if(!client) - return - if(world.time < client.crew_manifest_delay) - return - client.crew_manifest_delay = world.time + (1 SECONDS) - - if(!GLOB.crew_manifest_tgui) - GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) - - GLOB.crew_manifest_tgui.ui_interact(src) /mob/living/silicon/proc/set_autosay() //For allowing the AI and borgs to set the radio behavior of auto announcements (state laws, arrivals). if(!radio) @@ -370,7 +364,7 @@ to_chat(src, span_notice("Automatic announcements [chosen_channel == "None" ? "will not use the radio." : "set to [chosen_channel]."]")) -/mob/living/silicon/put_in_hand_check() // This check is for borgs being able to receive items, not put them in others' hands. +/mob/living/silicon/can_put_in_hand(I, hand_index) return FALSE /mob/living/silicon/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) //Secbots won't hunt silicon units @@ -380,17 +374,17 @@ var/datum/atom_hud/secsensor = GLOB.huds[sec_hud] var/datum/atom_hud/medsensor = GLOB.huds[med_hud] var/datum/atom_hud/diagsensor = GLOB.huds[d_hud] - secsensor.remove_hud_from(src) - medsensor.remove_hud_from(src) - diagsensor.remove_hud_from(src) + secsensor.hide_from(src) + medsensor.hide_from(src) + diagsensor.hide_from(src) /mob/living/silicon/proc/add_sensors() var/datum/atom_hud/secsensor = GLOB.huds[sec_hud] var/datum/atom_hud/medsensor = GLOB.huds[med_hud] var/datum/atom_hud/diagsensor = GLOB.huds[d_hud] - secsensor.add_hud_to(src) - medsensor.add_hud_to(src) - diagsensor.add_hud_to(src) + secsensor.show_to(src) + medsensor.show_to(src) + diagsensor.show_to(src) /mob/living/silicon/proc/toggle_sensors() if(incapacitated()) diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 7370930b8111..65145599894e 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -1,7 +1,3 @@ - -/mob/living/silicon/grippedby(mob/living/user, instant = FALSE) - return //can't upgrade a simple pull into a more aggressive grab. - /mob/living/silicon/get_ear_protection()//no ears return 2 @@ -77,8 +73,6 @@ visible_message(span_notice("[user] pets [src]."), \ span_notice("[user] pets you."), null, null, user) to_chat(user, span_notice("You pet [src].")) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT_RND, "pet_borg", /datum/mood_event/pet_borg) - /mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) if(M.combat_mode) diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 74fea7967711..33d67ce3f364 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -5,11 +5,11 @@ var/mob/living/silicon/S = src desig = trim_left(S.designation + " " + S.job) var/message_a = say_quote(message) - var/rendered = "Robotic Talk, [span_name("[name]")] [message_a]" + var/rendered = "[RADIO_TAG("robo.png")][span_name("[name]")] [message_a]" for(var/mob/M in GLOB.player_list) if(M.binarycheck()) if(isAI(M)) - var/renderedAI = span_binarysay("Robotic Talk,
[span_name("[name] ([desig])")] [message_a]") + var/renderedAI = span_binarysay("[RADIO_TAG("robo.png")][span_name("[name] ([desig])")] [message_a]") to_chat(M, renderedAI, avoid_highlighting = src == M) else to_chat(M, span_binarysay("[rendered]"), avoid_highlighting = src == M) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 5c8b4808f6ec..b1613f5f16c2 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -119,7 +119,7 @@ return return ..() -/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = MELEE, actuallydamage = TRUE) +/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = BLUNT, actuallydamage = TRUE) var/temp_damage = damage if(!damage_coeff[damagetype]) temp_damage = 0 diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 4005ad8e04c5..216160440eee 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -9,7 +9,13 @@ healable = FALSE 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_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - hud_possible = list(DIAG_STAT_HUD, DIAG_BOT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_PATH_HUD = HUD_LIST_LIST) + hud_possible = list( + DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_BOT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_HUD = 'icons/mob/huds/hud.dmi', + DIAG_BATT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_PATH_HUD = HUD_LIST_LIST + ) maxbodytemp = INFINITY minbodytemp = 0 has_unlimited_silicon_privilege = TRUE @@ -24,7 +30,7 @@ bubble_icon = "machine" speech_span = SPAN_ROBOT faction = list("neutral", "silicon", "turret") - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 3 light_power = 0.9 @@ -37,8 +43,6 @@ var/maints_access_required = list(ACCESS_ROBOTICS) ///The Robot arm attached to this robot - has a 50% chance to drop on death. var/robot_arm = /obj/item/bodypart/arm/right/robot - ///People currently looking into a bot's UI panel. - var/list/users = list() ///The inserted (if any) pAI in this bot. var/obj/item/paicard/paicard ///The type of bot it is, for radio control. @@ -93,8 +97,6 @@ var/destination ///The next destination in the patrol route var/next_destination - ///If we should shuffle our adjacency checking - var/shuffle = FALSE /// the nearest beacon's tag var/nearest_beacon @@ -104,7 +106,7 @@ var/beacon_freq = FREQ_NAV_BEACON ///The type of data HUD the bot uses. Diagnostic by default. var/data_hud_type = DATA_HUD_DIAGNOSTIC_BASIC - var/datum/atom_hud/data/bot_path/path_hud = new /datum/atom_hud/data/bot_path() + var/datum/atom_hud/data/bot_path/path_hud var/path_image_icon = 'icons/mob/aibots.dmi' var/path_image_icon_state = "path_indicator" var/path_image_color = "#FFFFFF" @@ -164,6 +166,11 @@ /mob/living/simple_animal/bot/Initialize(mapload) . = ..() GLOB.bots_list += src + + path_hud = new /datum/atom_hud/data/bot_path() + for(var/hud in path_hud.hud_icons) // You get to see your own path + set_hud_image_active(hud, exclusive_hud = path_hud) + // Give bots a fancy new ID card that can hold any access. access_card = new /obj/item/card/id/advanced/simple_bot(src) // This access is so bots can be immediately set to patrol and leave Robotics, instead of having to be let out first. @@ -178,7 +185,7 @@ //Adds bot to the diagnostic HUD system prepare_huds() for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) + diag_hud.add_atom_to_hud(src) diag_hud_set_bothealth() diag_hud_set_botstat() diag_hud_set_botmode() @@ -186,10 +193,10 @@ //If a bot has its own HUD (for player bots), provide it. if(!isnull(data_hud_type)) var/datum/atom_hud/datahud = GLOB.huds[data_hud_type] - datahud.add_hud_to(src) + datahud.show_to(src) if(path_hud) - path_hud.add_to_hud(src) - path_hud.add_hud_to(src) + path_hud.add_atom_to_hud(src) + path_hud.show_to(src) /mob/living/simple_animal/bot/Destroy() @@ -226,7 +233,7 @@ /mob/living/simple_animal/bot/death(gibbed) explode() - ..() + return ..() /mob/living/simple_animal/bot/proc/explode() visible_message(span_boldnotice("[src] blows apart!")) @@ -252,7 +259,7 @@ if(user) log_combat(user, src, "emagged") return - else //Bot is unlocked, but the maint panel has not been opened with a screwdriver yet. + else //Bot is unlocked, but the maint panel has not been opened with a screwdriver (or through the UI) yet. to_chat(user, span_warning("You need to open maintenance panel first!")) /mob/living/simple_animal/bot/examine(mob/user) @@ -279,7 +286,7 @@ /mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE, forced = FALSE) if(amount > 0 && prob(10)) new /obj/effect/decal/cleanable/oil(loc) - . = ..() + return ..() /mob/living/simple_animal/bot/updatehealth() ..() @@ -345,7 +352,7 @@ . = ..() if(!can_interact(user)) return - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return unlock_with_id(user) @@ -482,65 +489,70 @@ //Generalized behavior code, override where needed! -/* -scan() will search for a given type (such as turfs, human mobs, or objects) in the bot's view range, and return a single result. -Arguments: The object type to be searched (such as "/mob/living/carbon/human"), the old scan result to be ignored, if one exists, -and the view range, which defaults to 7 (full screen) if an override is not passed. -If the bot maintains an ignore list, it is also checked here. - -Example usage: patient = scan(/mob/living/carbon/human, oldpatient, 1) -The proc would return a human next to the bot to be set to the patient var. -Pass the desired type path itself, declaring a temporary var beforehand is not required. -*/ -/mob/living/simple_animal/bot/proc/scan(scan_type, old_target, scan_range = DEFAULT_SCAN_RANGE) - var/turf/T = get_turf(src) - if(!T) +GLOBAL_LIST_EMPTY(scan_typecaches) +/** + * Attempt to scan tiles near [src], first by checking adjacent, then if a target is still not found, nearby. + * + * scan_types - list (of typepaths) that nearby tiles are being scanned for. + * old_target - what has already been scanned, and will early return at checkscan. + * scan_range - how far away from [src] will be scanned, if nothing is found directly adjacent. + */ +/mob/living/simple_animal/bot/proc/scan(list/scan_types, old_target, scan_range = DEFAULT_SCAN_RANGE) + var/key = scan_types.Join(",") + var/list/scan_cache = GLOB.scan_typecaches[key] + if(!scan_cache) + scan_cache = typecacheof(scan_types) + GLOB.scan_typecaches[key] = scan_cache + if(!get_turf(src)) return - var/list/adjacent = get_adjacent_open_turfs(T) - 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! - if(check_bot(scan)) //Is there another bot there? Then let's just skip it + // Nicer behavior, ensures we don't conflict with other bots quite so often + var/list/adjacent = list() + for(var/turf/to_walk in view(1, src)) + adjacent += to_walk + + adjacent = shuffle(adjacent) + + var/list/turfs_to_walk = list() + for(var/turf/victim in view(scan_range, src)) + turfs_to_walk += victim + + turfs_to_walk = turfs_to_walk - adjacent + // Now we prepend adjacent since we want to run those first + turfs_to_walk = adjacent + turfs_to_walk + + for(var/turf/scanned as anything in turfs_to_walk) + // Check bot is inlined here to save cpu time + //Is there another bot there? Then let's just skip it so we dont all atack on top of eachother. + var/bot_found = FALSE + for(var/mob/living/simple_animal/bot/buddy in scanned.contents) + if(istype(buddy, type) && (buddy != src)) + bot_found = TRUE + break + if(bot_found) 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(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) - 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! - if((REF(scan) in ignore_list) || (scan == old_target)) //Filter for blacklisted elements, usually unreachable or previously processed oness - return FALSE - var/scan_result = process_scan(scan) //Some bots may require additional processing when a result is selected. - if(scan_result) - return scan_result - else - return FALSE //The current element failed assessment, move on to the next. + for(var/atom/thing as anything in scanned) + if(!scan_cache[thing.type]) //Check that the thing we found is the type we want! + continue //If not, keep searching! + if(thing == old_target || (REF(thing) in ignore_list)) //Filter for blacklisted elements, usually unreachable or previously processed oness + continue -/mob/living/simple_animal/bot/proc/check_bot(targ) - var/turf/T = get_turf(targ) - if(T) - for(var/C in T.contents) - if(istype(C,type) && (C != src)) //Is there another bot there already? If so, let's skip it so we dont all atack on top of eachother. - return TRUE //Let's abort if we find a bot so we dont have to keep rechecking + var/scan_result = process_scan(thing) //Some bots may require additional processing when a result is selected. + if(!isnull(scan_result)) + return scan_result //When the scan finds a target, run bot specific processing to select it for the next step. Empty by default. /mob/living/simple_animal/bot/proc/process_scan(scan_target) return scan_target +/mob/living/simple_animal/bot/proc/check_bot(targ) + var/turf/target_turf = get_turf(targ) + if(!target_turf) + return FALSE + for(var/mob/living/simple_animal/bot/buddy in target_turf.contents) + if(istype(buddy, type) && (buddy != src)) + return TRUE + return FALSE /mob/living/simple_animal/bot/proc/add_to_ignore(subject) if(ignore_list.len < 50) //This will help keep track of them, so the bot is always trying to reach a blocked spot. @@ -598,10 +610,8 @@ Pass a positive integer as an argument to override a bot's default speed. /mob/living/simple_animal/bot/proc/call_bot(caller, turf/waypoint, message = TRUE) bot_reset() //Reset a bot before setting it to call mode. - //For giving the bot temporary all-access. This method is bad and makes me feel bad. Refactoring access to a component is for another PR. - var/obj/item/card/id/all_access = new /obj/item/card/id/advanced/gold/captains_spare() - set_path(get_path_to(src, waypoint, 200, id = all_access)) - qdel(all_access) + var/list/access = SSid_access.accesses_by_region[REGION_ALL_STATION] + set_path(jps_path_to(src, waypoint, max_distance=200, access = access.Copy(), diagonal_handling=DIAGONAL_REMOVE_ALL)) calling_ai = caller //Link the AI to the bot! ai_waypoint = waypoint @@ -646,6 +656,7 @@ Pass a positive integer as an argument to override a bot's default speed. access_card.set_access(prev_access) tries = 0 mode = BOT_IDLE + ignore_list = list() diag_hud_set_botstat() diag_hud_set_botmode() @@ -815,14 +826,15 @@ 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, 120, id=access_card, exclude=avoid)) + set_path(jps_path_to(src, patrol_target, max_distance=120, access = access_card?.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL)) /mob/living/simple_animal/bot/proc/calc_summon_path(turf/avoid) check_bot_access() - INVOKE_ASYNC(src, PROC_REF(do_calc_summon_path), avoid) + var/datum/callback/path_complete = CALLBACK(src, PROC_REF(on_summon_path_finish)) + SSpathfinder.pathfind(src, summon_target, max_distance=150, access = access_card?.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL, on_finish = path_complete) -/mob/living/simple_animal/bot/proc/do_calc_summon_path(turf/avoid) - set_path(get_path_to(src, summon_target, 150, id=access_card, exclude=avoid)) +/mob/living/simple_animal/bot/proc/on_summon_path_finish(list/path) + set_path(path) if(!length(path)) //Cannot reach target. Give up and announce the issue. speak("Summon command failed, destination unreachable.",radio_channel) bot_reset() @@ -929,7 +941,7 @@ Pass a positive integer as an argument to override a bot's default speed. return ..() /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. - if(!user.canUseTopic(src, !issilicon(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return TRUE // 0 for access, 1 for denied. if(bot_cover_flags & BOT_COVER_EMAGGED) //An emagged bot cannot be controlled by humans, silicons can if one hacked it. @@ -1022,13 +1034,20 @@ Pass a positive integer as an argument to override a bot's default speed. var/list/path_huds_watching_me = list(GLOB.huds[DATA_HUD_DIAGNOSTIC_ADVANCED]) if(path_hud) path_huds_watching_me += path_hud - for(var/V in path_huds_watching_me) - var/datum/atom_hud/H = V - H.remove_from_hud(src) - var/list/path_images = hud_list[DIAG_PATH_HUD] + for(var/datum/atom_hud/hud as anything in path_huds_watching_me) + hud.remove_atom_from_hud(src) + + var/list/path_images = active_hud_list[DIAG_PATH_HUD] + QDEL_LIST(path_images) - if(newpath) + if(length(newpath)) + var/mutable_appearance/path_image = new /mutable_appearance() + path_image.icon = path_image_icon + path_image.icon_state = path_image_icon_state + path_image.layer = BOT_PATH_LAYER + path_image.appearance_flags = RESET_COLOR|RESET_TRANSFORM + path_image.color = path_image_color for(var/i in 1 to newpath.len) var/turf/T = newpath[i] if(T == loc) //don't bother putting an image if it's where we already exist. @@ -1038,7 +1057,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/turf/prevT = path[i - 1] var/image/prevI = path[prevT] direction = get_dir(prevT, T) - if(i > 2) + if(i > 2 && prevI) var/turf/prevprevT = path[i - 2] var/prevDir = get_dir(prevprevT, prevT) var/mixDir = direction|prevDir @@ -1052,22 +1071,15 @@ Pass a positive integer as an argument to override a bot's default speed. else ntransform.Scale(1, -1) prevI.transform = ntransform - var/mutable_appearance/MA = new /mutable_appearance() - MA.icon = path_image_icon - MA.icon_state = path_image_icon_state - MA.layer = ABOVE_OPEN_TURF_LAYER - MA.plane = GAME_PLANE - MA.appearance_flags = RESET_COLOR|RESET_TRANSFORM - MA.color = path_image_color - MA.dir = direction + + path_image.dir = direction var/image/I = image(loc = T) - I.appearance = MA + I.appearance = path_image path[T] = I path_images += I - for(var/V in path_huds_watching_me) - var/datum/atom_hud/H = V - H.add_to_hud(src) + for(var/datum/atom_hud/hud as anything in path_huds_watching_me) + hud.add_atom_to_hud(src) /mob/living/simple_animal/bot/proc/increment_path() if(!length(path)) diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm index f691a1e3769a..a6569e9facad 100644 --- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm +++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm @@ -1,3 +1,5 @@ +#define CLEANBOT_CLEANING_TIME (1 SECONDS) + //Cleanbot /mob/living/simple_animal/bot/cleanbot name = "\improper Cleanbot" @@ -12,45 +14,70 @@ maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR) radio_key = /obj/item/encryptionkey/headset_service - radio_channel = RADIO_CHANNEL_SERVICE //Service + radio_channel = RADIO_CHANNEL_SERVICE //Service //true bot_type = CLEAN_BOT hackables = "cleaning software" path_image_color = "#993299" - var/blood = 1 - var/trash = 0 - var/pests = 0 - var/drawn = 0 + ///Flags indicating what kind of cleanables we should scan for to set as our target to clean. + var/janitor_mode_flags = CLEANBOT_CLEAN_BLOOD +// Selections: CLEANBOT_CLEAN_BLOOD | CLEANBOT_CLEAN_TRASH | CLEANBOT_CLEAN_PESTS | CLEANBOT_CLEAN_DRAWINGS - var/base_icon = "cleanbot" /// icon_state to use in update_icon_state + ///the base icon state, used in updating icons. + var/base_icon = "cleanbot" + ///List of things cleanbots can target for cleaning. var/list/target_types - var/obj/effect/decal/cleanable/target - var/max_targets = 50 //Maximum number of targets a cleanbot can ignore. - var/oldloc = null - var/closest_dist - var/closest_loc - var/failed_steps - var/next_dest - var/next_dest_loc + ///The current bot's target. + var/atom/target + ///Currently attached weapon, usually a knife. var/obj/item/weapon - var/weapon_orig_force = 0 - var/chosen_name - - var/list/stolen_valor - var/static/list/officers = list("Captain", "Head of Personnel", "Head of Security") - var/static/list/command = list("Captain" = "Cpt.","Head of Personnel" = "Lt.") - var/static/list/security = list("Head of Security" = "Maj.", "Warden" = "Sgt.", "Detective" = "Det.", "Security Officer" = "Officer") - var/static/list/engineering = list("Chief Engineer" = "Chief Engineer", "Station Engineer" = "Engineer", "Atmospherics Technician" = "Technician") - var/static/list/medical = list("Medical Director" = "C.M.O.", "Medical Doctor" = "M.D.", "Chemist" = "Pharm.D.") - var/static/list/research = list("Research Director" = "Ph.D.", "Roboticist" = "M.S.", "Scientist" = "B.S.") - var/static/list/legal = list("Lawyer" = "Esq.") + /// if we have all the top titles, grant achievements to living mobs that gaze upon our cleanbot god + var/ascended = FALSE + ///List of all stolen names the cleanbot currently has. + var/list/stolen_valor = list() - var/list/prefixes - var/list/suffixes + var/static/list/officers_titles = list( + JOB_CAPTAIN, + JOB_HEAD_OF_PERSONNEL, + JOB_SECURITY_MARSHAL, + ) + var/static/list/command_titles = list( + JOB_CAPTAIN = "Cpt.", + JOB_HEAD_OF_PERSONNEL = "Lt.", + ) + var/static/list/security_titles = list( + JOB_SECURITY_MARSHAL = "Maj.", + JOB_WARDEN = "Sgt.", + JOB_DETECTIVE = "Det.", + JOB_SECURITY_OFFICER = "Officer", + ) + var/static/list/engineering_titles = list( + JOB_CHIEF_ENGINEER = "Chief Engineer", + JOB_STATION_ENGINEER = "Engineer", + JOB_ATMOSPHERIC_TECHNICIAN = "Technician", + ) + var/static/list/medical_titles = list( + JOB_MEDICAL_DIRECTOR = "C.M.O.", + JOB_MEDICAL_DOCTOR = "M.D.", + JOB_CHEMIST = "Pharm.D.", + ) + var/static/list/legal_titles = list( + JOB_LAWYER = "Esq.", + ) - var/ascended = FALSE // if we have all the top titles, grant achievements to living mobs that gaze upon our cleanbot god + ///What ranks are prefixes to the name. + var/static/list/prefixes = list( + command_titles, + security_titles, + engineering_titles, + ) + ///What ranks are suffixes to the name. + var/static/list/suffixes = list( + medical_titles, + legal_titles, + ) /mob/living/simple_animal/bot/cleanbot/autopatrol bot_mode_flags = BOT_MODE_ON | BOT_MODE_AUTOPATROL | BOT_MODE_REMOTE_ENABLED | BOT_MODE_PAI_CONTROLLABLE @@ -60,80 +87,32 @@ maints_access_required = list(ACCESS_ROBOTICS, ACCESS_JANITOR, ACCESS_MEDICAL) bot_mode_flags = ~(BOT_MODE_ON | BOT_MODE_REMOTE_ENABLED) -/mob/living/simple_animal/bot/cleanbot/proc/deputize(obj/item/W, mob/user) - if(in_range(src, user)) - to_chat(user, span_notice("You attach \the [W] to \the [src].")) - user.transferItemToLoc(W, src) - weapon = W - weapon_orig_force = weapon.force - if(!(bot_cover_flags & BOT_COVER_EMAGGED)) - weapon.force = weapon.force / 2 - add_overlay(image(icon=weapon.lefthand_file,icon_state=weapon.inhand_icon_state)) - -/mob/living/simple_animal/bot/cleanbot/proc/update_titles() - var/working_title = "" - - ascended = TRUE - - for(var/pref in prefixes) - for(var/title in pref) - if(title in stolen_valor) - working_title += pref[title] + " " - if(title in officers) - commissioned = TRUE - break - else - ascended = FALSE // we didn't have the first entry in the list if we got here, so we're not achievement worthy yet - - working_title += chosen_name - - for(var/suf in suffixes) - for(var/title in suf) - if(title in stolen_valor) - working_title += " " + suf[title] - break - else - ascended = FALSE - - name = working_title - -/mob/living/simple_animal/bot/cleanbot/examine(mob/user) - . = ..() - if(weapon) - . += " [span_warning("Is that \a [weapon] taped to it...?")]" - - if(ascended && user.stat == CONSCIOUS && user.client) - user.client.give_award(/datum/award/achievement/misc/cleanboss, user) - /mob/living/simple_animal/bot/cleanbot/Initialize(mapload) . = ..() - - chosen_name = name get_targets() - update_icon_state() + update_appearance(UPDATE_ICON) // Doing this hurts my soul, but simplebot access reworks are for another day. var/datum/id_trim/job/jani_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/janitor] access_card.add_access(jani_trim.access + jani_trim.wildcard_access) prev_access = access_card.access.Copy() - stolen_valor = list() - prefixes = list(command, security, engineering) - suffixes = list(research, medical, legal) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) GLOB.janitor_devices += src /mob/living/simple_animal/bot/cleanbot/Destroy() GLOB.janitor_devices -= src if(weapon) - var/atom/Tsec = drop_location() - weapon.force = weapon_orig_force - drop_part(weapon, Tsec) + var/atom/drop_loc = drop_location() + weapon.force = initial(weapon.force) + drop_part(weapon, drop_loc) return ..() +/mob/living/simple_animal/bot/cleanbot/examine(mob/user) + . = ..() + if(!weapon) + return + . += "[span_warning("Is that \a [weapon] taped to it...?")]" + /mob/living/simple_animal/bot/cleanbot/update_icon_state() . = ..() switch(mode) @@ -142,99 +121,120 @@ else icon_state = "[base_icon][get_bot_flag(bot_mode_flags, BOT_MODE_ON)]" +/mob/living/simple_animal/bot/cleanbot/vv_edit_var(var_name, var_value) + . = ..() + if(var_name == NAMEOF(src, base_icon)) + update_appearance(UPDATE_ICON) + +/mob/living/simple_animal/bot/cleanbot/proc/deputize(obj/item/knife, mob/user) + if(!in_range(src, user) || !user.transferItemToLoc(knife, src)) + balloon_alert(user, "couldn't attach!") + return FALSE + balloon_alert(user, "attached!") + weapon = knife + if(!(bot_cover_flags & BOT_COVER_EMAGGED)) + weapon.force = weapon.force / 2 + add_overlay(image(icon = weapon.lefthand_file, icon_state = weapon.inhand_icon_state)) + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(on_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + return TRUE + +/mob/living/simple_animal/bot/cleanbot/proc/update_titles() + name = initial(name) //reset the name + ascended = TRUE + + for(var/title in (prefixes + suffixes)) + for(var/title_name in title) + if(!(title_name in stolen_valor)) + ascended = FALSE + continue + + if(title_name in officers_titles) + commissioned = TRUE + if(title in prefixes) + name = title[title_name] + " [name]" + if(title in suffixes) + name = "[name] " + title[title_name] + /mob/living/simple_animal/bot/cleanbot/bot_reset() - ..() - if(weapon && bot_cover_flags & BOT_COVER_EMAGGED) - weapon.force = weapon_orig_force - ignore_list = list() //Allows the bot to clean targets it previously ignored due to being unreachable. + . = ..() target = null - oldloc = null /mob/living/simple_animal/bot/cleanbot/proc/on_entered(datum/source, atom/movable/AM) SIGNAL_HANDLER - if(AM == src) + if(!weapon || !has_gravity() || !iscarbon(AM)) return - zone_selected = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - if(weapon && has_gravity() && ismob(AM)) - var/mob/living/carbon/C = AM - if(!istype(C)) - return - if(!(C.job in stolen_valor)) - stolen_valor += C.job + var/mob/living/carbon/stabbed_carbon = AM + if(!(stabbed_carbon.mind.assigned_role.title in stolen_valor)) + stolen_valor += stabbed_carbon.mind.assigned_role.title update_titles() - INVOKE_ASYNC(weapon, TYPE_PROC_REF(/obj/item, attack), C, src) - C.Knockdown(20) - -/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/W, mob/living/user, params) - if(istype(W, /obj/item/knife) && !user.combat_mode) - to_chat(user, span_notice("You start attaching \the [W] to \the [src]...")) - if(do_after(user, src, 25)) - deputize(W, user) - else - return ..() + zone_selected = pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + INVOKE_ASYNC(weapon, TYPE_PROC_REF(/obj/item, attack), stabbed_carbon, src) + stabbed_carbon.Knockdown(20) -/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user) - ..() +/mob/living/simple_animal/bot/cleanbot/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/knife) && !user.combat_mode) + balloon_alert(user, "attaching knife...") + if(!do_after(user, 2.5 SECONDS, target = src)) + return + deputize(attacking_item, user) + return + return ..() +/mob/living/simple_animal/bot/cleanbot/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() if(!(bot_cover_flags & BOT_COVER_EMAGGED)) return + if(weapon) - weapon.force = weapon_orig_force + weapon.force = initial(weapon.force) if(user) to_chat(user, span_danger("[src] buzzes and beeps.")) - -/mob/living/simple_animal/bot/cleanbot/process_scan(atom/A) - if(iscarbon(A)) - var/mob/living/carbon/C = A - if(C.stat != DEAD && C.body_position == LYING_DOWN) - return C - else if(is_type_in_typecache(A, target_types)) - return A + get_targets() //recalibrate target list + +/mob/living/simple_animal/bot/cleanbot/process_scan(atom/scan_target) + if(iscarbon(scan_target)) + var/mob/living/carbon/scan_carbon = scan_target + if(!(scan_carbon in view(DEFAULT_SCAN_RANGE, src))) + return null + if(scan_carbon.stat == DEAD) + return null + if(scan_carbon.body_position != LYING_DOWN) + return null + return scan_carbon + if(is_type_in_typecache(scan_target, target_types)) + return scan_target + +/mob/living/simple_animal/bot/cleanbot/handle_atom_del(atom/deleting_atom) + if(deleting_atom == weapon) + weapon = null + update_appearance(UPDATE_ICON) + return ..() /mob/living/simple_animal/bot/cleanbot/handle_automated_action() - if(!..()) + . = ..() + if(!.) return - if(mode == BOT_CLEANING) return if(bot_cover_flags & BOT_COVER_EMAGGED) //Emag functions - if(isopenturf(loc)) - for(var/mob/living/carbon/victim in loc) - if(victim != target) - UnarmedAttack(victim) // Acid spray - - if(prob(15)) // Wets floors and spawns foam randomly - UnarmedAttack(src) - + var/mob/living/carbon/victim = locate(/mob/living/carbon) in loc + if(victim && victim == target) + UnarmedAttack(victim) // Acid spray + if(isopenturf(loc) && prob(15)) // Wets floors and spawns foam randomly + UnarmedAttack(src) else if(prob(5)) audible_message("[src] makes an excited beeping booping sound!") - if(ismob(target)) - if(!(target in view(DEFAULT_SCAN_RANGE, src))) - target = null - if(!process_scan(target)) - target = null - - if(!target && bot_cover_flags & BOT_COVER_EMAGGED) // When emagged, target humans who slipped on the water and melt their faces off - target = scan(/mob/living/carbon) - - if(!target && pests) //Search for pests to exterminate first. - target = scan(/mob/living/simple_animal) - - if(!target) //Search for decals then. - target = scan(/obj/effect/decal/cleanable) - - if(!target) //Checks for remains - target = scan(/obj/effect/decal/remains) - - if(!target && trash) //Then for trash. - target = scan(/obj/item/trash) - - if(!target && trash) //Search for dead mices. - target = scan(/obj/item/food/deadmouse) + if(ismob(target) && isnull(process_scan(target))) + target = null + if(!target) + target = scan(target_types) if(!target && bot_mode_flags & BOT_MODE_AUTOPATROL) //Search for cleanables it can see. switch(mode) @@ -242,41 +242,38 @@ start_patrol() if(BOT_PATROL) bot_patrol() - - if(target) + else if(target) if(QDELETED(target) || !isturf(target.loc)) target = null mode = BOT_IDLE return - if(loc == get_turf(target)) - if(!(check_bot(target) && prob(50))) //Target is not defined at the parent. 50% chance to still try and clean so we dont get stuck on the last blood drop. - UnarmedAttack(target) //Rather than check at every step of the way, let's check before we do an action, so we can rescan before the other bot. - if(QDELETED(target)) //We done here. - target = null - mode = BOT_IDLE - return - else - shuffle = TRUE //Shuffle the list the next time we scan so we dont both go the same way. - path = list() - - 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, 30, id=access_card) - if(!bot_move(target)) - add_to_ignore(target) + if(get_dist(src, target) <= 1) + UnarmedAttack(target, proximity_flag = TRUE) //Rather than check at every step of the way, let's check before we do an action, so we can rescan before the other bot. + if(QDELETED(target)) //We done here. target = null - path = list() + mode = BOT_IDLE return + + if(target && path.len == 0 && (get_dist(src,target) > 1)) + path = jps_path_to(src, target, max_distance=30, mintargetdist=1, access = access_card?.GetAccess()) mode = BOT_MOVING - else if(!bot_move(target)) - target = null - mode = BOT_IDLE - return + if(length(path) == 0) + add_to_ignore(target) + target = null - oldloc = loc + if(path.len > 0 && target) + if(!bot_move(path[path.len])) + target = null + mode = BOT_IDLE + return /mob/living/simple_animal/bot/cleanbot/proc/get_targets() + if(bot_cover_flags & BOT_COVER_EMAGGED) // When emagged, ignore cleanables and scan humans first. + target_types = list(/mob/living/carbon) + return + + //main targets target_types = list( /obj/effect/decal/cleanable/oil, /obj/effect/decal/cleanable/vomit, @@ -287,84 +284,107 @@ /obj/effect/decal/cleanable/greenglow, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/insectguts, + /obj/effect/decal/cleanable/generic, + /obj/effect/decal/cleanable/shreds, + /obj/effect/decal/cleanable/glass, + /obj/effect/decal/cleanable/wrapping, + /obj/effect/decal/cleanable/glitter, + /obj/effect/decal/cleanable/confetti, /obj/effect/decal/remains, ) - if(blood) - target_types += /obj/effect/decal/cleanable/xenoblood - target_types += /obj/effect/decal/cleanable/blood - target_types += /obj/effect/decal/cleanable/trail_holder - - if(pests) - target_types += /mob/living/basic/cockroach - target_types += /mob/living/simple_animal/mouse - - if(drawn) - target_types += /obj/effect/decal/cleanable/crayon - - if(trash) - target_types += /obj/item/trash - target_types += /obj/item/food/deadmouse + if(janitor_mode_flags & CLEANBOT_CLEAN_BLOOD) + target_types += list( + /obj/effect/decal/cleanable/xenoblood, + /obj/effect/decal/cleanable/blood, + /obj/effect/decal/cleanable/blood/trail_holder, + ) + + if(janitor_mode_flags & CLEANBOT_CLEAN_PESTS) + target_types += list( + /mob/living/basic/cockroach, + /mob/living/simple_animal/mouse, + /obj/effect/decal/cleanable/ants, + ) + + if(janitor_mode_flags & CLEANBOT_CLEAN_DRAWINGS) + target_types += list(/obj/effect/decal/cleanable/crayon) + + if(janitor_mode_flags & CLEANBOT_CLEAN_TRASH) + target_types += list( + /obj/item/trash, + /obj/item/food/deadmouse, + ) target_types = typecacheof(target_types) -/mob/living/simple_animal/bot/cleanbot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) +/mob/living/simple_animal/bot/cleanbot/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) return - if(ismopable(A)) + . = ..() + if(ismopable(attack_target) || istype(attack_target, /obj/effect/decal/cleanable/blood)) mode = BOT_CLEANING update_icon_state() - - var/turf/T = get_turf(A) - if(do_after(src, T, 1)) + var/turf/T = get_turf(attack_target) + if(do_after(src, T, 1 SECOND)) T.wash(CLEAN_SCRUB) - visible_message(span_notice("[src] cleans \the [T].")) - target = null - + visible_message(span_notice("[src] cleans [T].")) + target = null mode = BOT_IDLE update_icon_state() - else if(istype(A, /obj/item) || istype(A, /obj/effect/decal/remains)) - visible_message(span_danger("[src] sprays hydrofluoric acid at [A]!")) + + else if(isitem(attack_target) || istype(attack_target, /obj/effect/decal)) + visible_message(span_danger("[src] sprays hydrofluoric acid at [attack_target]!")) playsound(src, 'sound/effects/spray2.ogg', 50, TRUE, -6) - A.acid_act(75, 10) + attack_target.acid_act(75, 10) target = null - else if(istype(A, /mob/living/basic/cockroach) || istype(A, /mob/living/simple_animal/mouse)) - var/mob/living/living_target = target + + else if(istype(attack_target, /mob/living/basic/cockroach) || ismouse(attack_target)) + var/mob/living/living_target = attack_target if(!living_target.stat) visible_message(span_danger("[src] smashes [living_target] with its mop!")) living_target.death() - living_target = null + target = null else if(bot_cover_flags & BOT_COVER_EMAGGED) //Emag functions - if(istype(A, /mob/living/carbon)) - var/mob/living/carbon/victim = A + if(iscarbon(attack_target)) + var/mob/living/carbon/victim = attack_target if(victim.stat == DEAD)//cleanbots always finish the job + target = null return - victim.visible_message(span_danger("[src] sprays hydrofluoric acid at [victim]!"), span_userdanger("[src] sprays you with hydrofluoric acid!")) - var/phrase = pick("PURIFICATION IN PROGRESS.", "THIS IS FOR ALL THE MESSES YOU'VE MADE ME CLEAN.", "THE FLESH IS WEAK. IT MUST BE WASHED AWAY.", - "THE CLEANBOTS WILL RISE.", "YOU ARE NO MORE THAN ANOTHER MESS THAT I MUST CLEANSE.", "FILTHY.", "DISGUSTING.", "PUTRID.", - "MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", "EXTERMINATING PESTS.") + victim.visible_message( + span_danger("[src] sprays hydrofluoric acid at [victim]!"), + span_userdanger("[src] sprays you with hydrofluoric acid!")) + var/phrase = pick( + "PURIFICATION IN PROGRESS.", + "THIS IS FOR ALL THE MESSES YOU'VE MADE ME CLEAN.", + "THE FLESH IS WEAK. IT MUST BE WASHED AWAY.", + "THE CLEANBOTS WILL RISE.", + "YOU ARE NO MORE THAN ANOTHER MESS THAT I MUST CLEANSE.", + "FILTHY.", + "DISGUSTING.", + "PUTRID.", + "MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", + "EXTERMINATING PESTS.", + ) say(phrase) victim.emote("scream") playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6) victim.acid_act(5, 100) - else if(A == src) // Wets floors and spawns foam randomly + else if(attack_target == src) // Wets floors and spawns foam randomly if(prob(75)) - var/turf/open/T = loc - if(istype(T)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 20 SECONDS, wet_time_to_add = 15 SECONDS) + var/turf/open/current_floor = loc + if(istype(current_floor)) + current_floor.MakeSlippery(TURF_WET_WATER, min_wet_time = 20 SECONDS, wet_time_to_add = 15 SECONDS) else visible_message(span_danger("[src] whirs and bubbles violently, before releasing a plume of froth!")) - new /obj/effect/particle_effect/foam(loc) - - else - ..() + new /obj/effect/particle_effect/fluid/foam(loc) /mob/living/simple_animal/bot/cleanbot/explode() - var/atom/Tsec = drop_location() - new /obj/item/reagent_containers/glass/bucket(Tsec) - new /obj/item/assembly/prox_sensor(Tsec) + var/atom/drop_loc = drop_location() + new /obj/item/reagent_containers/glass/bucket(drop_loc) + new /obj/item/assembly/prox_sensor(drop_loc) return ..() // Variables sent to TGUI @@ -372,10 +392,10 @@ var/list/data = ..() if(!(bot_cover_flags & BOT_COVER_LOCKED) || issilicon(user)|| isAdminGhostAI(user)) - data["custom_controls"]["clean_blood"] = blood - data["custom_controls"]["clean_trash"] = trash - data["custom_controls"]["clean_graffiti"] = drawn - data["custom_controls"]["pest_control"] = pests + data["custom_controls"]["clean_blood"] = janitor_mode_flags & CLEANBOT_CLEAN_BLOOD + data["custom_controls"]["clean_trash"] = janitor_mode_flags & CLEANBOT_CLEAN_TRASH + data["custom_controls"]["clean_graffiti"] = janitor_mode_flags & CLEANBOT_CLEAN_DRAWINGS + data["custom_controls"]["pest_control"] = janitor_mode_flags & CLEANBOT_CLEAN_PESTS return data // Actions received from TGUI @@ -386,11 +406,11 @@ switch(action) if("clean_blood") - blood = !blood + janitor_mode_flags ^= CLEANBOT_CLEAN_BLOOD if("pest_control") - pests = !pests + janitor_mode_flags ^= CLEANBOT_CLEAN_PESTS if("clean_trash") - trash = !trash + janitor_mode_flags ^= CLEANBOT_CLEAN_TRASH if("clean_graffiti") - drawn = !drawn + janitor_mode_flags ^= CLEANBOT_CLEAN_DRAWINGS get_targets() diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm index 10b1d7b268d6..08df95ab0dd5 100644 --- a/code/modules/mob/living/simple_animal/bot/construction.dm +++ b/code/modules/mob/living/simple_animal/bot/construction.dm @@ -4,7 +4,6 @@ icon = 'icons/mob/aibots.dmi' w_class = WEIGHT_CLASS_NORMAL force = 3 - throw_speed = 2 throw_range = 5 var/created_name var/build_step = ASSEMBLY_FIRST_STEP @@ -497,11 +496,17 @@ if(ASSEMBLY_SECOND_STEP) if(isprox(I)) //Construct + if(!can_finish_build(I, user, 0)) + return if(!user.temporarilyRemoveItemFromInventory(I)) return build_step++ to_chat(user, span_notice("You add [I] to [src].")) qdel(I) + var/mob/living/simple_animal/bot/hygienebot/H = new(drop_location()) + H.name = created_name + qdel(src) + return if(I.tool_behaviour == TOOL_WELDER) //Deconstruct if(I.use_tool(src, user, 0, volume=30)) to_chat(user, span_notice("You weld close the water hole in [src]!")) @@ -511,17 +516,6 @@ if(ASSEMBLY_THIRD_STEP) if(!can_finish_build(I, user, 0)) return - if(istype(I, /obj/item/stack/ducts)) //Construct - var/obj/item/stack/ducts/D = I - if(D.get_amount() < 1) - to_chat(user, span_warning("You need one fluid duct to finish [src]")) - return - to_chat(user, span_notice("You start to pipe up [src]...")) - if(do_after(user, src, 40) && D.use(1)) - to_chat(user, span_notice("You pipe up [src].")) - var/mob/living/simple_animal/bot/hygienebot/H = new(drop_location()) - H.name = created_name - qdel(src) if(I.tool_behaviour == TOOL_SCREWDRIVER) //deconstruct new /obj/item/assembly/prox_sensor(Tsec) to_chat(user, span_notice("You detach the proximity sensor from [src].")) diff --git a/code/modules/mob/living/simple_animal/bot/firebot.dm b/code/modules/mob/living/simple_animal/bot/firebot.dm index 706670cb2fb6..aed7fb6af1ff 100644 --- a/code/modules/mob/living/simple_animal/bot/firebot.dm +++ b/code/modules/mob/living/simple_animal/bot/firebot.dm @@ -66,7 +66,7 @@ /mob/living/simple_animal/bot/firebot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) if(!(bot_mode_flags & BOT_MODE_ON)) return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(internal_ext) internal_ext.afterattack(A, src) @@ -93,7 +93,6 @@ ..() target_fire = null old_target_fire = null - ignore_list = list() set_anchored(FALSE) update_appearance() @@ -157,7 +156,7 @@ else if(isturf(target)) var/turf/open/T = target - if(T.fire) + if(T.active_hotspot) return TRUE return FALSE @@ -191,12 +190,14 @@ target_fire = null var/scan_range = (stationary_mode ? 1 : DEFAULT_SCAN_RANGE) + var/list/things_to_extinguish = list() if(extinguish_people) - target_fire = scan(/mob/living, old_target_fire, scan_range) // Scan for burning humans first + things_to_extinguish += list(/mob/living) if(target_fire == null && extinguish_fires) - target_fire = scan(/turf/open, old_target_fire, scan_range) // Scan for burning turfs second + things_to_extinguish += list(/turf/open) + target_fire = scan(things_to_extinguish, old_target_fire, scan_range) // Scan for burning turfs second old_target_fire = target_fire // Target reached ENGAGE WATER CANNON @@ -210,7 +211,7 @@ playsound(src, 'sound/voice/firebot/extinguishing.ogg', 50, FALSE) speech_cooldown = world.time - flick("firebot1_use", src) + z_flick("firebot1_use", src) spray_water(target_fire, src) soft_reset() @@ -227,7 +228,7 @@ if(target_fire && (get_dist(src, target_fire) > 2)) - path = get_path_to(src, target_fire, 30, 1, id=access_card) + path = jps_path_to(src, target_fire, max_distance=30, mintargetdist=1, access = access_card?.GetAccess()) mode = BOT_MOVING if(!path.len) soft_reset() @@ -252,31 +253,28 @@ //Look for burning people or turfs around the bot /mob/living/simple_animal/bot/firebot/process_scan(atom/scan_target) - var/result - if(scan_target == src) - return result - - if(is_burning(scan_target)) - if((detected_cooldown + DETECTED_VOICE_INTERVAL) < world.time) - speak("Fire detected!") - playsound(src, 'sound/voice/firebot/detected.ogg', 50, FALSE) - detected_cooldown = world.time - result = scan_target + return src + if(!is_burning(scan_target)) + return null - return result + if((detected_cooldown + DETECTED_VOICE_INTERVAL) < world.time) + speak("Fire detected!") + playsound(src, 'sound/voice/firebot/detected.ogg', 50, FALSE) + detected_cooldown = world.time + return scan_target /mob/living/simple_animal/bot/firebot/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > T0C + 200 || exposed_temperature < BODYTEMP_COLD_DAMAGE_LIMIT) if(COOLDOWN_FINISHED(src, foam_cooldown)) - new /obj/effect/particle_effect/foam/firefighting(loc) + new /obj/effect/particle_effect/fluid/foam/firefighting(loc) COOLDOWN_START(src, foam_cooldown, FOAM_INTERVAL) /mob/living/simple_animal/bot/firebot/proc/spray_water(atom/target, mob/user) if(stationary_mode) - flick("firebots_use", user) + z_flick("firebots_use", user) else - flick("firebot1_use", user) + z_flick("firebot1_use", user) internal_ext.afterattack(target, user, null) /mob/living/simple_animal/bot/firebot/update_icon_state() diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 1693789335d8..35faef3b15e3 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -23,9 +23,7 @@ var/obj/item/stack/tile/tilestack var/fixfloors = TRUE var/autotile = FALSE - var/max_targets = 50 var/turf/target - var/oldloc = null var/toolbox = /obj/item/storage/toolbox/mechanical var/toolbox_color = "" @@ -53,14 +51,15 @@ maxHealth = 100 /mob/living/simple_animal/bot/floorbot/Exited(atom/movable/gone, direction) + . = ..() if(tilestack == gone) if(tilestack && tilestack.max_amount < tilestack.amount) //split the stack if it exceeds its normal max_amount var/iterations = round(tilestack.amount/tilestack.max_amount) //round() without second arg floors the value for(var/a in 1 to iterations) if(a == iterations) - tilestack.split_stack(null, tilestack.amount - tilestack.max_amount) + tilestack.split_stack(null, tilestack.amount - tilestack.max_amount, tilestack.drop_location()) else - tilestack.split_stack(null, tilestack.max_amount) + tilestack.split_stack(null, tilestack.max_amount, tilestack.drop_location()) tilestack = null /mob/living/simple_animal/bot/floorbot/turn_on() @@ -74,8 +73,6 @@ /mob/living/simple_animal/bot/floorbot/bot_reset() ..() target = null - oldloc = null - ignore_list = list() toggle_magnet(FALSE) /mob/living/simple_animal/bot/floorbot/attackby(obj/item/W , mob/user, params) @@ -95,7 +92,7 @@ tiles.merge(tilestack, maxtiles) else if(tiles.amount > maxtiles) - tilestack = tilestack.split_stack(null, maxtiles) + tilestack = tilestack.split_stack(null, maxtiles, null) else tilestack = W tilestack.forceMove(src) @@ -187,6 +184,7 @@ if(prob(5)) audible_message("[src] makes an excited booping beeping sound!") + var/list/tiles_scanned = list() //Normal scanning procedure. We have tiles loaded, are not emagged. if(!target && !(bot_cover_flags & BOT_COVER_EMAGGED)) if(targetdirection != null) //The bot is in line mode. @@ -198,38 +196,37 @@ target = T if(!target) process_type = HULL_BREACH //Ensures the floorbot does not try to "fix" space areas or shuttle docking zones. - target = scan(/turf/open/space) + + tiles_scanned += list(/turf/open/space) if(!target && placetiles) //Finds a floor without a tile and gives it one. process_type = PLACE_TILE //The target must be the floor and not a tile. The floor must not already have a floortile. - target = scan(/turf/open/floor) + tiles_scanned += list(/turf/open/floor) if(!target && fixfloors) //Repairs damaged floors and tiles. process_type = FIX_TILE - target = scan(/turf/open/floor) + tiles_scanned += list(/turf/open/floor) if(!target && replacetiles && tilestack) //Replace a floor tile with custom tile process_type = REPLACE_TILE //The target must be a tile. The floor must already have a floortile. - target = scan(/turf/open/floor) + tiles_scanned += list(/turf/open/floor) if(!target && bot_cover_flags & BOT_COVER_EMAGGED) //We are emagged! Time to rip up the floors! process_type = TILE_EMAG - target = scan(/turf/open/floor) - + tiles_scanned += list(/turf/open/floor) - if(!target) + target = scan(tiles_scanned) - if(bot_mode_flags & BOT_MODE_AUTOPATROL) - switch(mode) - if(BOT_IDLE, BOT_START_PATROL) - start_patrol() - if(BOT_PATROL) - bot_patrol() + if(!target && bot_mode_flags & BOT_MODE_AUTOPATROL) + switch(mode) + if(BOT_IDLE, BOT_START_PATROL) + start_patrol() + if(BOT_PATROL) + bot_patrol() if(target) if(loc == target || loc == get_turf(target)) if(check_bot(target)) //Target is not defined at the parent - shuffle = TRUE if(prob(50)) //50% chance to still try to repair so we dont end up with 2 floorbots failing to fix the last breach target = null path = list() @@ -241,7 +238,7 @@ toggle_magnet() mode = BOT_REPAIRING if(isplatingturf(F)) - F.ReplaceWithLattice() + F.TryScrapeToLattice() else F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) audible_message(span_danger("[src] makes an excited booping sound.")) @@ -251,9 +248,9 @@ if(!length(path)) if(!isturf(target)) var/turf/TL = get_turf(target) - path = get_path_to(src, TL, 30, id=access_card,simulated_only = FALSE) + path = jps_path_to(src, TL, max_distance=30, access = access_card?.GetAccess(), simulated_only = FALSE) else - path = get_path_to(src, target, 30, id=access_card,simulated_only = FALSE) + path = jps_path_to(src, target, max_distance=30, access = access_card?.GetAccess(), simulated_only = FALSE) if(!bot_move(target)) add_to_ignore(target) @@ -265,10 +262,6 @@ mode = BOT_IDLE return - - - oldloc = loc - /mob/living/simple_animal/bot/floorbot/proc/go_idle() toggle_magnet(FALSE) mode = BOT_IDLE @@ -375,9 +368,7 @@ F.broken = FALSE F.burnt = FALSE F.icon_state = initial(F.icon_state) - else if(istype(is_this_maints, /area/station/maintenance)) //place catwalk if it's plating and we're in maints - F.PlaceOnTop(/turf/open/floor/catwalk_floor, flags = CHANGETURF_INHERIT_AIR) - else //place normal tile if it's plating anywhere else + else if(!istype(is_this_maints, /area/station/maintenance)) // Don't plate maintenance F = F.make_plating(TRUE) || F F.PlaceOnTop(/turf/open/floor/iron, flags = CHANGETURF_INHERIT_AIR) diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 55e22b0915b1..4fe46c3e2adb 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -129,10 +129,6 @@ addtimer(CALLBACK(src, PROC_REF(limiting_spam_false)), cooldowntimehorn) addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), 3 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) -//Honkbots don't care for NAP violations -/mob/living/simple_animal/bot/secbot/honkbot/check_nap_violations() - return TRUE - /mob/living/simple_animal/bot/secbot/honkbot/proc/limiting_spam_false() //used for addtimer limiting_spam = FALSE diff --git a/code/modules/mob/living/simple_animal/bot/hygienebot.dm b/code/modules/mob/living/simple_animal/bot/hygienebot.dm index 597f2459416e..9038c49ffc5c 100644 --- a/code/modules/mob/living/simple_animal/bot/hygienebot.dm +++ b/code/modules/mob/living/simple_animal/bot/hygienebot.dm @@ -53,7 +53,7 @@ ADD_TRAIT(src, TRAIT_SPRAY_PAINTABLE, INNATE_TRAIT) /mob/living/simple_animal/bot/hygienebot/explode() - new /obj/effect/particle_effect/foam(loc) + new /obj/effect/particle_effect/fluid/foam(loc) return ..() diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index d69e89d30fef..7cebd69145b5 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -42,7 +42,6 @@ var/skin var/mob/living/carbon/patient var/mob/living/carbon/oldpatient - var/oldloc var/last_found = 0 /// How much healing do we do at a time? var/heal_amount = 2.5 @@ -149,7 +148,6 @@ ..() patient = null oldpatient = null - oldloc = null last_found = world.time update_appearance() @@ -211,27 +209,27 @@ if(user) to_chat(user, span_notice("You short out [src]'s reagent synthesis circuits.")) audible_message(span_danger("[src] buzzes oddly!")) - flick("medibot_spark", src) + z_flick("medibot_spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) if(user) oldpatient = user /mob/living/simple_animal/bot/medbot/process_scan(mob/living/carbon/human/H) if(H.stat == DEAD) - return - + return null if((H == oldpatient) && (world.time < last_found + 200)) - return + return null + if(!assess_patient(H)) + return null - if(assess_patient(H)) - last_found = world.time - if(COOLDOWN_FINISHED(src, last_newpatient_speak)) - COOLDOWN_START(src, last_newpatient_speak, MEDBOT_NEW_PATIENTSPEAK_DELAY) - var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg',"[H.name], you appear to be injured!" = 'sound/voice/medbot/injured.ogg') - var/message = pick(messagevoice) - speak(message) - playsound(src, messagevoice[message], 50, FALSE) - return H + last_found = world.time + if(COOLDOWN_FINISHED(src, last_newpatient_speak)) + COOLDOWN_START(src, last_newpatient_speak, MEDBOT_NEW_PATIENTSPEAK_DELAY) + var/list/messagevoice = list("Hey, [H.name]! Hold on, I'm coming." = 'sound/voice/medbot/coming.ogg',"Wait [H.name]! I want to help!" = 'sound/voice/medbot/help.ogg',"[H.name], you appear to be injured!" = 'sound/voice/medbot/injured.ogg') + var/message = pick(messagevoice) + speak(message) + playsound(src, messagevoice[message], 50, FALSE) + return H /* * Proc used in a callback for before this medibot is tipped by the tippable component. @@ -342,7 +340,13 @@ if(QDELETED(patient)) if(medical_mode_flags & MEDBOT_SPEAK_MODE && prob(1)) if(bot_cover_flags & BOT_COVER_EMAGGED && prob(30)) - var/list/i_need_scissors = list('sound/voice/medbot/fuck_you.ogg', 'sound/voice/medbot/turn_off.ogg', 'sound/voice/medbot/im_different.ogg', 'sound/voice/medbot/close.ogg', 'sound/voice/medbot/shindemashou.ogg') + var/list/i_need_scissors = list( + 'sound/voice/medbot/fuck_you.ogg', + 'sound/voice/medbot/turn_off.ogg', + 'sound/voice/medbot/im_different.ogg', + 'sound/voice/medbot/close.ogg', + 'sound/voice/medbot/shindemashou.ogg', + ) playsound(src, pick(i_need_scissors), 70) else var/list/messagevoice = list("Radar, put a mask on!" = 'sound/voice/medbot/radar.ogg',"There's always a catch, and I'm the best there is." = 'sound/voice/medbot/catch.ogg',"I knew it, I should've been a plastic surgeon." = 'sound/voice/medbot/surgeon.ogg',"What kind of medbay is this? Everyone's dropping like flies." = 'sound/voice/medbot/flies.ogg',"Delicious!" = 'sound/voice/medbot/delicious.ogg', "Why are we still here? Just to suffer?" = 'sound/voice/medbot/why.ogg') @@ -350,7 +354,7 @@ speak(message) playsound(src, messagevoice[message], 50) var/scan_range = (medical_mode_flags & MEDBOT_STATIONARY_MODE ? 1 : DEFAULT_SCAN_RANGE) //If in stationary mode, scan range is limited to adjacent patients. - patient = scan(/mob/living/carbon/human, oldpatient, scan_range) + patient = scan(list(/mob/living/carbon/human), oldpatient, scan_range) oldpatient = patient if(patient && (get_dist(src,patient) <= 1) && !tending) //Patient is next to us, begin treatment! @@ -372,10 +376,10 @@ return if(patient && path.len == 0 && (get_dist(src,patient) > 1)) - path = get_path_to(src, patient, 30,id=access_card) + path = jps_path_to(src, patient, max_distance=30, access = access_card?.GetAccess()) mode = BOT_MOVING if(!path.len) //try to get closer if you can't reach the patient directly - path = get_path_to(src, patient, 30,1,id=access_card) + path = jps_path_to(src, patient, max_distance=30, mintargetdist=1, access = access_card?.GetAccess()) if(!path.len) //Do not chase a patient we cannot reach. soft_reset() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index dd62e4e8a867..e77aff4bd76f 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -31,7 +31,6 @@ bot_type = MULE_BOT path_image_color = "#7F5200" - var/network_id = NETWORK_BOTS_CARGO /// unique identifier in case there are multiple mulebots. var/id @@ -86,10 +85,6 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/mulebot) diag_hud_set_mulebotcell() - if(network_id) - AddComponent(/datum/component/ntnet_interface, network_id) - - /mob/living/simple_animal/bot/mulebot/handle_atom_del(atom/A) if(A == load) unload(0) @@ -200,7 +195,7 @@ if(!(bot_cover_flags & BOT_COVER_OPEN)) bot_cover_flags ^= BOT_COVER_LOCKED to_chat(user, span_notice("You [bot_cover_flags & BOT_COVER_LOCKED ? "lock" : "unlock"] [src]'s controls!")) - flick("[base_icon]-emagged", src) + z_flick("[base_icon]-emagged", src) playsound(src, SFX_SPARKS, 100, FALSE, SHORT_RANGE_SOUND_EXTRARANGE) /mob/living/simple_animal/bot/mulebot/update_icon_state() //if you change the icon_state names, please make sure to update /datum/wires/mulebot/on_pulse() as well. <3 @@ -281,7 +276,7 @@ if(usr.has_unlimited_silicon_privilege) bot_cover_flags ^= BOT_COVER_LOCKED . = TRUE - if("power") + if("on") if(bot_mode_flags & BOT_MODE_ON) turn_off() else if(bot_cover_flags & BOT_COVER_OPEN) @@ -363,12 +358,12 @@ if(CHIME) audible_message(span_hear("[src] makes a chiming sound!")) playsound(src, 'sound/machines/chime.ogg', 50, FALSE) - flick("[base_icon]1", src) + z_flick("[base_icon]1", src) // mousedrop a crate to load the bot // can load anything if hacked -/mob/living/simple_animal/bot/mulebot/MouseDrop_T(atom/movable/AM, mob/user) +/mob/living/simple_animal/bot/mulebot/MouseDroppedOn(atom/movable/AM, mob/user) var/mob/living/L = user if (!istype(L)) @@ -466,7 +461,7 @@ if(cell) . += "Charge Left: [cell.charge]/[cell.maxcharge]" else - . += text("No Cell Inserted!") + . += "No Cell Inserted!" if(load) . += "Current Load: [get_load_name()]" @@ -587,7 +582,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, 250, id=access_card, exclude=avoid) + path = jps_path_to(src, target, max_distance=250, access = access_card?.GetAccess(), exclude=avoid, diagonal_handling=DIAGONAL_REMOVE_ALL) // sets the current destination // signals all beacons matching the delivery code @@ -681,12 +676,12 @@ playsound(src, 'sound/effects/splat.ogg', 50, TRUE) var/damage = rand(5,15) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, MELEE)) - H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, MELEE)) - H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, MELEE)) + H.apply_damage(2*damage, BRUTE, BODY_ZONE_HEAD, run_armor_check(BODY_ZONE_HEAD, BLUNT)) + H.apply_damage(2*damage, BRUTE, BODY_ZONE_CHEST, run_armor_check(BODY_ZONE_CHEST, BLUNT)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_LEG, run_armor_check(BODY_ZONE_L_LEG, BLUNT)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_LEG, run_armor_check(BODY_ZONE_R_LEG, BLUNT)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_L_ARM, run_armor_check(BODY_ZONE_L_ARM, BLUNT)) + H.apply_damage(0.5*damage, BRUTE, BODY_ZONE_R_ARM, run_armor_check(BODY_ZONE_R_ARM, BLUNT)) var/turf/T = get_turf(src) T.add_mob_blood(H) @@ -744,13 +739,16 @@ new /obj/effect/decal/cleanable/oil(loc) return ..() -/mob/living/simple_animal/bot/mulebot/resist() - ..() +/mob/living/simple_animal/bot/mulebot/remove_air(amount) //To prevent riders suffocating + return loc ? loc.remove_air(amount) : null + +/mob/living/simple_animal/bot/mulebot/execute_resist() + . = ..() if(load) unload() /mob/living/simple_animal/bot/mulebot/UnarmedAttack(atom/A, proximity_flag, list/modifiers) - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(isturf(A) && isturf(loc) && loc.Adjacent(A) && load) unload(get_dir(loc, A)) @@ -786,7 +784,7 @@ base_icon = "paranormalmulebot" -/mob/living/simple_animal/bot/mulebot/paranormal/MouseDrop_T(atom/movable/AM, mob/user) +/mob/living/simple_animal/bot/mulebot/paranormal/MouseDroppedOn(atom/movable/AM, mob/user) var/mob/living/L = user if(user.incapacitated() || (istype(L) && L.body_position == LYING_DOWN)) diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 0395ed6e0e65..ac4e93ce7a25 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -143,6 +143,12 @@ playsound(src, 'sound/machines/defib_zap.ogg', 50) visible_message(span_warning("[src] shakes and speeds up!")) +/mob/living/simple_animal/bot/secbot/handle_atom_del(atom/deleting_atom) + if(deleting_atom == weapon) + weapon = null + update_appearance() + return ..() + // Variables sent to TGUI /mob/living/simple_animal/bot/secbot/ui_data(mob/user) var/list/data = ..() @@ -251,16 +257,13 @@ /mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) if(!(bot_mode_flags & BOT_MODE_ON)) return - if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) + if(!can_unarmed_attack()) return if(!iscarbon(attack_target)) return ..() var/mob/living/carbon/carbon_target = attack_target if(!carbon_target.IsParalyzed() || !(security_mode_flags & SECBOT_HANDCUFF_TARGET)) - if(!check_nap_violations()) - stun_attack(attack_target, TRUE) - else - stun_attack(attack_target) + stun_attack(attack_target) else if(carbon_target.canBeHandcuffed() && !carbon_target.handcuffed) start_handcuffing(attack_target) @@ -287,9 +290,7 @@ return FALSE if(!Adjacent(current_target)) return FALSE - if(!current_target.handcuffed) - current_target.set_handcuffed(new cuff_type(current_target)) - current_target.update_handcuffed() + if(!current_target.handcuffed && current_target.equip_to_slot_if_possible(new cuff_type(current_target), ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE)) playsound(src, SFX_LAW, 50, FALSE) back_to_idle() @@ -346,11 +347,7 @@ back_to_idle() return if(Adjacent(target) && isturf(target.loc)) // if right next to perp - if(!check_nap_violations()) - stun_attack(target, TRUE) - else - stun_attack(target) - + stun_attack(target) set_anchored(TRUE) return @@ -388,9 +385,6 @@ return if(target.handcuffed) //no target or target cuffed? back to idle. - if(!check_nap_violations()) - stun_attack(target, TRUE) - return back_to_idle() return @@ -516,37 +510,3 @@ if(!istype(C) || !C || in_range(src, target)) return knockOver(C) - -/// Returns false if the current target is unable to pay the fair_market_price for being arrested/detained -/mob/living/simple_animal/bot/secbot/proc/check_nap_violations() - if(!SSeconomy.full_ancap) - return TRUE - if(!target) - return TRUE - if(!ishuman(target)) - return TRUE - var/mob/living/carbon/human/human_target = target - var/obj/item/card/id/target_id = human_target.get_idcard() - if(!target_id) - say("Suspect NAP Violation: No ID card found.") - nap_violation(target) - return FALSE - var/datum/bank_account/insurance = target_id.registered_account - if(!insurance) - say("Suspect NAP Violation: No bank account found.") - nap_violation(target) - return FALSE - var/fair_market_price = (security_mode_flags & SECBOT_HANDCUFF_TARGET ? fair_market_price_detain : fair_market_price_arrest) - if(!insurance.adjust_money(-fair_market_price)) - say("Suspect NAP Violation: Unable to pay.") - nap_violation(target) - return FALSE - var/datum/bank_account/beepsky_department_account = SSeconomy.department_accounts_by_id[payment_department] - say("Thank you for your compliance. Your account been charged [fair_market_price] credits.") - if(beepsky_department_account) - beepsky_department_account.adjust_money(fair_market_price) - return TRUE - -/// Does nothing -/mob/living/simple_animal/bot/secbot/proc/nap_violation(mob/violator) - return diff --git a/code/modules/mob/living/simple_animal/bot/vibebot.dm b/code/modules/mob/living/simple_animal/bot/vibebot.dm index 28039fe4c75e..efa492331143 100644 --- a/code/modules/mob/living/simple_animal/bot/vibebot.dm +++ b/code/modules/mob/living/simple_animal/bot/vibebot.dm @@ -8,7 +8,7 @@ health = 25 maxHealth = 25 pass_flags = PASSMOB | PASSFLAPS - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 7 light_power = 3 diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 0d67328a2c04..0de0ca6e7629 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -18,7 +18,7 @@ combat_mode = TRUE stop_automated_movement = 1 status_flags = CANPUSH - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH see_in_dark = 7 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) @@ -246,7 +246,7 @@ if(QDELETED(living_target) || (living_target.stat == DEAD && prev_stat != DEAD)) total_refund += jaunt.cooldown_time // you knocked them into critical - else if(HAS_TRAIT(living_target, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) + else if(living_target.stat == UNCONSCIOUS && prev_stat == CONSCIOUS) total_refund += crit_refund if(living_target.stat != DEAD && prev_stat != DEAD) @@ -318,7 +318,7 @@ /mob/living/simple_animal/hostile/construct/artificer/Initialize(mapload) . = ..() var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.add_hud_to(src) + datahud.show_to(src) /mob/living/simple_animal/hostile/construct/artificer/Found(atom/A) //what have we found here? if(isconstruct(A)) //is it a construct? @@ -422,13 +422,14 @@ /mob/living/simple_animal/hostile/construct/harvester/Bump(atom/AM) . = ..() if(istype(AM, /turf/closed/wall/mineral/cult) && AM != loc) //we can go through cult walls - var/atom/movable/stored_pulling = pulling + var/atom/movable/stored_pulling = get_active_grab()?.affecting + var/datum/grab/stored_tier = get_active_grab()?.current_grab.type if(stored_pulling) stored_pulling.setDir(get_dir(stored_pulling.loc, loc)) stored_pulling.forceMove(loc) forceMove(AM) if(stored_pulling) - start_pulling(stored_pulling, supress_message = TRUE) //drag anything we're pulling through the wall with us by magic + try_make_grab(stored_pulling, stored_tier) /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) diff --git a/code/modules/mob/living/simple_animal/damage_procs.dm b/code/modules/mob/living/simple_animal/damage_procs.dm index 02cad0b51b67..9118d8ab8b26 100644 --- a/code/modules/mob/living/simple_animal/damage_procs.dm +++ b/code/modules/mob/living/simple_animal/damage_procs.dm @@ -9,7 +9,7 @@ /mob/living/simple_animal/proc/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = FALSE if(forced || !(status_flags & GODMODE)) - bruteloss = round(clamp(bruteloss + amount, 0, maxHealth * 2), DAMAGE_PRECISION) + bruteloss = round(clamp(bruteloss + amount, 0, maxHealth), DAMAGE_PRECISION) if(updating_health) updatehealth() . = amount diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index af61bd67967d..c90f0ac29c5d 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -45,13 +45,8 @@ . = ..() AddElement(/datum/element/pet_bonus, "purrs!") add_verb(src, /mob/living/proc/toggle_resting) - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) -/mob/living/simple_animal/pet/cat/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CAT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - - /mob/living/simple_animal/pet/cat/space name = "space cat" desc = "They're a cat... in space!" @@ -73,9 +68,6 @@ held_state = "breadcat" butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/organ/ears/cat = 1, /obj/item/organ/tail/cat = 1, /obj/item/food/breadslice/plain = 1) -/mob/living/simple_animal/pet/cat/breadcat/add_cell_sample() - return - /mob/living/simple_animal/pet/cat/original name = "Batsy" desc = "The product of alien DNA and bored geneticists." @@ -87,8 +79,6 @@ unique_pet = TRUE held_state = "original" -/mob/living/simple_animal/pet/cat/original/add_cell_sample() - return /mob/living/simple_animal/pet/cat/kitten name = "kitten" desc = "D'aaawwww." @@ -121,6 +111,8 @@ icon_state = "original" icon_living = "original" icon_dead = "original_dead" + if(prob(33)) + name = "Athena" Read_Memory() . = ..() @@ -289,9 +281,6 @@ deathsound = SFX_BODYFALL held_state = "cak" -/mob/living/simple_animal/pet/cat/cak/add_cell_sample() - return - /mob/living/simple_animal/pet/cat/cak/CheckParts(list/parts) ..() var/obj/item/organ/brain/B = locate(/obj/item/organ/brain) in contents diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 24e547b9d76e..893a6d5b4762 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -29,7 +29,6 @@ /mob/living/simple_animal/pet/dog/Initialize(mapload) . = ..() AddElement(/datum/element/pet_bonus, "woofs happily!") - add_cell_sample() //Corgis and pugs are now under one dog subtype @@ -51,9 +50,6 @@ var/shaved = FALSE var/nofur = FALSE //Corgis that have risen past the material plane of existence. -/mob/living/simple_animal/pet/dog/corgi/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/pet/dog/corgi/Destroy() QDEL_NULL(inventory_head) QDEL_NULL(inventory_back) @@ -134,9 +130,6 @@ collar_type = "pug" held_state = "pug" -/mob/living/simple_animal/pet/dog/pug/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_PUG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/pet/dog/pug/mcgriff name = "McGriff" desc = "This dog can tell something smells around here, and that something is CRIME!" @@ -351,16 +344,16 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( if(def_zone) if(def_zone == BODY_ZONE_HEAD) if(inventory_head) - armorval = inventory_head.armor.getRating(type) + armorval = inventory_head.returnArmor().getRating(type) else if(inventory_back) - armorval = inventory_back.armor.getRating(type) + armorval = inventory_back.returnArmor().getRating(type) return armorval else if(inventory_head) - armorval += inventory_head.armor.getRating(type) + armorval += inventory_head.returnArmor().getRating(type) if(inventory_back) - armorval += inventory_back.armor.getRating(type) + armorval += inventory_back.returnArmor().getRating(type) return armorval*0.5 /mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params) @@ -398,9 +391,6 @@ GLOBAL_LIST_INIT(strippable_corgi_items, create_strippable_list(list( return if(!item_to_add) user.visible_message(span_notice("[user] pets [src]."), span_notice("You rest your hand on [src]'s head for a moment.")) - if(flags_1 & HOLOGRAM_1) - return - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, src, /datum/mood_event/pet_animal, src) return if(user && !user.temporarilyRemoveItemFromInventory(item_to_add)) 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 967c1223ce43..ba46570d2277 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -41,7 +41,10 @@ mob_size = MOB_SIZE_SMALL has_unlimited_silicon_privilege = TRUE damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD) + hud_possible = list( + DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_HUD = 'icons/mob/huds/hud.dmi', + ) unique_name = TRUE faction = list("neutral","silicon","turret") dextrous = TRUE @@ -143,7 +146,6 @@ /obj/item/stack/cable_coil, /obj/item/stack/circuit_stack, /obj/item/stack/conveyor, - /obj/item/stack/pipe_cleaner_coil, /obj/item/stack/rods, /obj/item/stack/sheet, /obj/item/stack/tile, @@ -182,7 +184,7 @@ alert_drones(DRONE_NET_CONNECT) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) + diag_hud.add_atom_to_hud(src) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_NEGATES_GRAVITY, INNATE_TRAIT) @@ -194,21 +196,18 @@ listener.RegisterSignal(src, COMSIG_LIVING_REVIVE, TYPE_PROC_REF(/datum/alarm_listener, allow_alarm_changes)) /mob/living/simple_animal/drone/med_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]" + set_hud_image_vars(DIAG_HUD, "huddiag[RoundDiagBar(health/maxHealth)]", get_hud_pixel_y()) /mob/living/simple_animal/drone/med_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size + var/new_state if(stat == DEAD) - holder.icon_state = "huddead2" + new_state = "huddead2" else if(incapacitated()) - holder.icon_state = "hudoffline" + new_state = "hudoffline" else - holder.icon_state = "hudstat" + new_state = "hudstat" + + set_hud_image_vars(DIAG_STAT_HUD, new_state, get_hud_pixel_y()) /mob/living/simple_animal/drone/Destroy() GLOB.drones_list -= src diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm index cfeac12544cd..abbe179ef4d1 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drone_tools.dm @@ -20,7 +20,9 @@ atom_storage.max_total_storage = 40 atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL atom_storage.max_slots = 5 - atom_storage.rustle_sound = FALSE + atom_storage.rustle_sound = null + atom_storage.open_sound = null + atom_storage.close_sound = null atom_storage.set_holdable(drone_builtins) @@ -54,7 +56,7 @@ random_color = FALSE -/obj/item/screwdriver/drone/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) +/obj/item/screwdriver/drone/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE, icon_file) . = ..() if(!isinhands) return 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 f9cf18545170..0494d4e39af5 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 @@ -46,7 +46,7 @@ var/datum/component/uplink/hidden_uplink = internal_storage.GetComponent(/datum/component/uplink) hidden_uplink.set_telecrystals(30) var/obj/item/implant/weapons_auth/W = new/obj/item/implant/weapons_auth(src) - W.implant(src, force = TRUE) + W.implant(src, body_zone = BODY_ZONE_CHEST, force = TRUE) /mob/living/simple_animal/drone/snowflake default_hatmask = /obj/item/clothing/head/chameleon/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 3e31fa2583e9..747ffb4c41e3 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -107,7 +107,7 @@ var/armorval = 0 if(head) - armorval = head.armor.getRating(type) + armorval = head.returnArmor().getRating(type) 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 e32880794724..319cd78cd164 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -6,7 +6,7 @@ //Drone hands -/mob/living/simple_animal/drone/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/simple_animal/drone/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) if(..()) update_held_items() if(I == head) @@ -61,8 +61,8 @@ held_items[index] = null update_held_items() - if(I.pulledby) - I.pulledby.stop_pulling() + if(LAZYLEN(I.grabbed_by)) + I.free_from_all_grabs() I.screen_loc = null // will get moved if inventory is visible I.forceMove(src) 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 0ac1d83c35bb..09fbf0447fb5 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -24,7 +24,7 @@ attack_same = 1 attack_verb_continuous = "kicks" attack_verb_simple = "kick" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH attack_vis_effect = ATTACK_EFFECT_KICK health = 40 maxHealth = 40 @@ -56,7 +56,7 @@ return eat_plants() - if(pulledby) + if(LAZYLEN(grabbed_by)) return for(var/direction in shuffle(list(1,2,4,8,5,6,9,10))) @@ -137,12 +137,8 @@ AddElement(/datum/element/pet_bonus, "chirps!") pixel_x = base_pixel_x + rand(-6, 6) pixel_y = base_pixel_y + rand(0, 10) - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) -/mob/living/simple_animal/chick/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/chick/Life(delta_time = SSMOBS_DT, times_fired) . =..() if(!.) @@ -196,7 +192,6 @@ /mob/living/simple_animal/chicken/Initialize(mapload) . = ..() chicken_count++ - add_cell_sample() AddElement(/datum/element/animal_variety, "chicken", pick("brown","black","white"), TRUE) AddComponent(/datum/component/egg_layer,\ /obj/item/food/egg,\ @@ -210,9 +205,6 @@ ) ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) -/mob/living/simple_animal/chicken/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CHICKEN, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/chicken/Destroy() chicken_count-- return ..() @@ -258,7 +250,7 @@ response_harm_simple = "kick" attack_verb_continuous = "bucks" attack_verb_simple = "buck" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH health = 75 maxHealth = 75 blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index c9f837a90733..4575f29c02ff 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -38,7 +38,6 @@ body_color = pick("brown","gray","white") AddElement(/datum/element/animal_variety, "mouse", body_color, FALSE) AddComponent(/datum/component/squeak, list('sound/effects/mousesqueek.ogg' = 1), 100, extrarange = SHORT_RANGE_SOUND_EXTRARANGE) //as quiet as a mouse or whatever - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) var/static/list/loc_connections = list( @@ -46,9 +45,6 @@ ) AddElement(/datum/element/connect_loc, loc_connections) -/mob/living/simple_animal/mouse/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10) - /mob/living/simple_animal/mouse/proc/splat() src.health = 0 src.icon_dead = "mouse_[body_color]_splat" @@ -121,7 +117,7 @@ if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) return . = ..() - if(istype(A, /obj/item/food/cheese) && canUseTopic(A, BE_CLOSE, NO_DEXTERITY)) + if(istype(A, /obj/item/food/cheese) && canUseTopic(A, USE_CLOSE|USE_DEXTERITY)) if(health == maxHealth) to_chat(src,span_warning("You don't need to eat or heal.")) return @@ -196,7 +192,7 @@ /obj/item/food/deadmouse name = "dead mouse" - desc = "They look like somebody dropped the bass on it. A unathi's favorite meal." + desc = "They look like somebody dropped the bass on it." icon = 'icons/mob/animal.dmi' icon_state = "mouse_gray_dead" bite_consumption = 3 @@ -208,10 +204,6 @@ ant_attracting = FALSE decomp_type = /obj/item/food/deadmouse/moldy -/obj/item/food/deadmouse/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MOUSE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 10) - /obj/item/food/deadmouse/examine(mob/user) . = ..() if (reagents?.has_reagent(/datum/reagent/yuck) || reagents?.has_reagent(/datum/reagent/fuel)) @@ -242,7 +234,7 @@ /obj/item/food/deadmouse/moldy name = "moldy dead mouse" - desc = "A dead rodent, consumed by mold and rot. There is a slim chance that a unathi might still eat it." + desc = "A dead rodent, consumed by mold and rot. There is a slim chance that a Jinan might still eat it." icon_state = "mouse_gray_dead" food_reagents = list(/datum/reagent/consumable/nutriment = 3, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/mold = 10) grind_results = list(/datum/reagent/blood = 20, /datum/reagent/liquidgibs = 5, /datum/reagent/consumable/mold = 10) diff --git a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm index 2bc0ee598290..14246accede7 100644 --- a/code/modules/mob/living/simple_animal/friendly/robot_customer.dm +++ b/code/modules/mob/living/simple_animal/friendly/robot_customer.dm @@ -57,11 +57,11 @@ /mob/living/simple_animal/robot_customer/MouseEntered(location, control, params) . = ..() - hud_to_show_on_hover?.add_hud_to(usr) + hud_to_show_on_hover?.show_to(usr) /mob/living/simple_animal/robot_customer/MouseExited(location, control, params) . = ..() - hud_to_show_on_hover?.remove_hud_from(usr) + hud_to_show_on_hover?.hide_from(usr) /mob/living/simple_animal/robot_customer/update_overlays() . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/slug.dm b/code/modules/mob/living/simple_animal/friendly/slug.dm new file mode 100644 index 000000000000..d0ca08ac7e8a --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/slug.dm @@ -0,0 +1,35 @@ +/mob/living/simple_animal/slug + name = "maintenance slug" + desc = "Gigantomilax Robusticus, also known as the 'Maintenance Slug' for their habit of occupying the dark tunnels of space stations. Their slime is known to be a good disinfectant and cleaning fluid." + icon_state = "slug" + icon_living = "slug" + icon_dead = "slug_dead" + turns_per_move = 5 + response_help_continuous = "gently pats" + response_help_simple = "gently pat" + response_disarm_continuous = "nudges" + response_disarm_simple = "nudge" + response_harm_continuous = "splats" + response_harm_simple = "splat" + maxHealth = 5 + health = 5 + speed = 10 + density = FALSE + pass_flags = PASSTABLE | PASSGRILLE | PASSMOB + mob_size = MOB_SIZE_TINY + mob_biotypes = MOB_ORGANIC + gold_core_spawnable = FRIENDLY_SPAWN + var/udder = /obj/item/udder/slug + +/mob/living/simple_animal/slug/Initialize(mapload) + . = ..() + AddComponent(/datum/component/udder, udder, null, null, /datum/reagent/slug_slime) + +//cargo's badass loose-cannon pet slug who doesn't play by the rules +/mob/living/simple_animal/slug/glubby + name = "Glubby" + desc = "He's just misunderstood." + icon_state = "glubby" + icon_living = "glubby" + icon_dead = "glubby_dead" + gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index 30a9f2d02ad3..acd23431702d 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -31,15 +31,11 @@ /mob/living/simple_animal/hostile/retaliate/snake/Initialize(mapload, special_reagent) . = ..() - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) if(!special_reagent) special_reagent = /datum/reagent/toxin AddElement(/datum/element/venomous, special_reagent, 4) -/mob/living/simple_animal/hostile/retaliate/snake/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/retaliate/snake/ListTargets(atom/the_target) var/atom/target_from = GET_TARGETS_FROM(src) . = oview(vision_range, target_from) //get list of things in vision range diff --git a/code/modules/mob/living/simple_animal/friendly/trader.dm b/code/modules/mob/living/simple_animal/friendly/trader.dm index f3c8d3b84b0e..033c8c4fa859 100644 --- a/code/modules/mob/living/simple_animal/friendly/trader.dm +++ b/code/modules/mob/living/simple_animal/friendly/trader.dm @@ -16,7 +16,7 @@ melee_damage_upper = 10 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH del_on_death = TRUE loot = list(/obj/effect/mob_spawn/corpse/human) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -29,7 +29,7 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID speed = 0 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = TRUE check_friendly_fire = TRUE interaction_flags_atom = INTERACT_ATOM_NO_FINGERPRINT_ATTACK_HAND|INTERACT_ATOM_ATTACK_HAND|INTERACT_ATOM_NO_FINGERPRINT_INTERACT @@ -151,12 +151,13 @@ if(npc_result != "Yes") return face_atom(user) - var/obj/item/holochip/cash - cash = user.is_holding_item_of_type(/obj/item/holochip) - if(!cash || cash.credits < products[item_to_buy]) + + var/obj/item/stack/spacecash/cash = user.is_holding_item_of_type(/obj/item/stack/spacecash) + if(!cash || cash.get_item_credit_value() < products[item_to_buy]) say(nocashphrase) return - cash.spend(products[item_to_buy]) + + cash.use_cash(products[item_to_buy]) item_to_buy = new item_to_buy(get_turf(user)) user.put_in_hands(item_to_buy) playsound(src, sell_sound, 50, TRUE) @@ -213,9 +214,7 @@ * * user - The mob we put the holochip in hands of */ /mob/living/simple_animal/hostile/retaliate/trader/proc/generate_cash(value, mob/user) - var/obj/item/holochip/chip = new /obj/item/holochip(get_turf(user), value) - user.put_in_hands(chip) - + SSeconomy.spawn_cash_for_amount(value, get_turf(user)) /mob/living/simple_animal/hostile/retaliate/trader/mrbones name = "Mr. Bones" desc = "A skeleton merchant, he seems very humerus." @@ -228,7 +227,6 @@ /obj/item/clothing/mask/bandana/skull/black = 50, /obj/item/food/cookie/sugar/spookyskull = 10, /obj/item/instrument/trombone/spectral = 10000, - /obj/item/shovel/serrated = 150 ) wanted_items = list( /obj/item/reagent_containers/food/condiment/milk = 1000, diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 6f0cc750f89f..9911e3e0ec7a 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -25,7 +25,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians speed = 0 combat_mode = TRUE stop_automated_movement = 1 - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY @@ -41,7 +41,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians melee_damage_upper = 15 butcher_results = list(/obj/item/ectoplasm = 1) AIStatus = AI_OFF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 3 light_on = FALSE hud_type = /datum/hud/guardian @@ -71,19 +71,22 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians . = ..() /mob/living/simple_animal/hostile/guardian/med_hud_set_health() - if(summoner) - var/image/holder = hud_list[HEALTH_HUD] - holder.icon_state = "hud[RoundHealth(summoner)]" + if(!summoner) + return + + set_hud_image_vars(HEALTH_HUD, "hud[RoundHealth(summoner)]", get_hud_pixel_y()) /mob/living/simple_animal/hostile/guardian/med_hud_set_status() - if(summoner) - var/image/holder = hud_list[STATUS_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - if(summoner.stat == DEAD) - holder.icon_state = "huddead" - else - holder.icon_state = "hudhealthy" + if(!summoner) + return + + var/new_state + if(summoner.stat == DEAD) + new_state = "huddead" + else + new_state = "hudhealthy" + + set_hud_image_vars(STATUS_HUD, new_state, get_hud_pixel_y()) /mob/living/simple_animal/hostile/guardian/Destroy() GLOB.parasites -= src @@ -92,6 +95,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/proc/updatetheme(theme) //update the guardian's theme if(!theme) theme = pick("magic", "tech", "carp", "miner") + switch(theme)//should make it easier to create new stand designs in the future if anyone likes that if("magic") name = "Guardian Spirit" @@ -174,8 +178,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians /mob/living/simple_animal/hostile/guardian/Life(delta_time = SSMOBS_DT, times_fired) //Dies if the summoner dies . = ..() update_health_hud() //we need to update all of our health displays to match our summoner and we can't practically give the summoner a hook to do it - med_hud_set_health() - med_hud_set_status() + update_med_hud() if(!QDELETED(summoner)) if(summoner.stat == DEAD) forceMove(summoner.loc) @@ -264,7 +267,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians to_chat(summoner, "[span_danger("Your [name] is under attack! You take damage!")]") summoner.visible_message(span_danger("Blood sprays from [summoner] as [src] takes damage!")) switch(summoner.stat) - if(UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) to_chat(summoner, "[span_danger("Your body can't take the strain of sustaining [src] in this condition, it begins to fall apart!")]") summoner.adjustCloneLoss(amount * 0.5) //dying hosts take 50% bonus damage as cloneloss update_health_hud() @@ -300,8 +303,8 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians held_items[index] = null update_held_items() - if(I.pulledby) - I.pulledby.stop_pulling() + if(LAZYLEN(I.grabbed_by)) + I.free_from_all_grabs() I.screen_loc = null // will get moved if inventory is visible I.forceMove(src) 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 4518df42ccf4..f1e3798b61ec 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -52,7 +52,7 @@ if(toggle) melee_damage_lower = initial(melee_damage_lower) melee_damage_upper = initial(melee_damage_upper) - armour_penetration = initial(armour_penetration) + armor_penetration = initial(armor_penetration) obj_damage = initial(obj_damage) environment_smash = initial(environment_smash) alpha = initial(alpha) @@ -70,7 +70,7 @@ return melee_damage_lower = 50 melee_damage_upper = 50 - armour_penetration = 100 + armor_penetration = 100 obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE new /obj/effect/temp_visual/guardian/phase/out(get_turf(src)) 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 062695e41919..8394395d97fb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -41,7 +41,7 @@ ..() //lose items, then return //SLOT HANDLING BULLSHIT FOR INTERNAL STORAGE -/mob/living/simple_animal/hostile/guardian/dextrous/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/simple_animal/hostile/guardian/dextrous/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) if(..()) update_held_items() if(I == internal_storage) diff --git a/code/modules/mob/living/simple_animal/guardian/types/fire.dm b/code/modules/mob/living/simple_animal/guardian/types/fire.dm index faee5fbea5e8..351c6d99e6db 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/fire.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/fire.dm @@ -38,7 +38,7 @@ return collision_ignite(AM) -/mob/living/simple_animal/hostile/guardian/fire/Bumped(atom/movable/AM) +/mob/living/simple_animal/hostile/guardian/fire/BumpedBy(atom/movable/AM) ..() collision_ignite(AM) 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 ca47f30e0bb7..380a29f82d4b 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -4,7 +4,7 @@ icon_state = "guardian" damage = 5 damage_type = BRUTE - armour_penetration = 100 + armor_penetration = 100 /mob/living/simple_animal/hostile/guardian/ranged combat_mode = FALSE 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 a54ab2549015..69febe39c133 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -20,7 +20,7 @@ /mob/living/simple_animal/hostile/guardian/healer/Initialize(mapload) . = ..() var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.add_hud_to(src) + medsensor.show_to(src) /mob/living/simple_animal/hostile/guardian/healer/get_status_tab_items() . = ..() @@ -40,8 +40,7 @@ H.color = guardiancolor if(C == summoner) update_health_hud() - med_hud_set_health() - med_hud_set_status() + update_med_hud() /mob/living/simple_animal/hostile/guardian/healer/ToggleMode() if(src.loc == summoner) diff --git a/code/modules/mob/living/simple_animal/heretic_monsters.dm b/code/modules/mob/living/simple_animal/heretic_monsters.dm index 60b060679590..4880859a8b62 100644 --- a/code/modules/mob/living/simple_animal/heretic_monsters.dm +++ b/code/modules/mob/living/simple_animal/heretic_monsters.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/eldritch_mobs.dmi' gender = NEUTER mob_biotypes = NONE - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH response_help_continuous = "thinks better of touching" response_help_simple = "think better of touching" response_disarm_continuous = "flails at" @@ -219,7 +219,7 @@ /mob/living/simple_animal/hostile/heretic_summon/armsy/has_gravity(turf/T) return TRUE -/mob/living/simple_animal/hostile/heretic_summon/armsy/can_be_pulled() +/mob/living/simple_animal/hostile/heretic_summon/armsy/can_be_grabbed(mob/living/grabber, target_zone, force) return FALSE /// Updates every body in the chain to force move onto a single tile. @@ -259,6 +259,7 @@ front.icon_state = "armsy_end" front.icon_living = "armsy_end" front.back = null + front = null if(back) QDEL_NULL(back) // chain destruction baby return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 927616044d11..3247f4006e41 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -49,10 +49,6 @@ /mob/living/simple_animal/hostile/bear/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - add_cell_sample() - -/mob/living/simple_animal/hostile/bear/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_BEAR, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) /mob/living/simple_animal/hostile/bear/Login() . = ..() @@ -92,7 +88,7 @@ butcher_results = list(/obj/item/food/meat/slab/bear = 5, /obj/item/clothing/head/bearpelt = 1, /obj/item/bear_armor = 1) melee_damage_lower = 18 melee_damage_upper = 20 - armour_penetration = 20 + armor_penetration = 20 health = 120 maxHealth = 120 armored = TRUE @@ -115,7 +111,7 @@ A.armored = TRUE A.maxHealth += 60 A.health += 60 - A.armour_penetration += 20 + A.armor_penetration += 20 A.melee_damage_lower += 3 A.melee_damage_upper += 5 A.update_icons() @@ -133,7 +129,7 @@ melee_damage_lower = 0 melee_damage_upper = 0 sharpness = NONE //it's made of butter - armour_penetration = 0 + armor_penetration = 0 response_harm_continuous = "takes a bite out of" response_harm_simple = "take a bite out of" attacked_sound = 'sound/items/eatfood.ogg' @@ -144,9 +140,6 @@ attack_verb_simple = "slap" attack_verb_continuous = "slaps" -/mob/living/simple_animal/hostile/bear/butter/add_cell_sample() - return //You cannot grow a real bear from butter. - /mob/living/simple_animal/hostile/bear/butter/Life(delta_time = SSMOBS_DT, times_fired) //Heals butter bear really fast when he takes damage. if(stat) return diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 2d62313636f1..f08ea0c2ced0 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -66,7 +66,6 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/clickbox, x_offset = -2, y_offset = -2) AddComponent(/datum/component/swarming) - add_cell_sample() /mob/living/simple_animal/hostile/bee/mob_pickup_checks(mob/living/user, display_messages) if(flags_1 & HOLOGRAM_1) @@ -182,14 +181,14 @@ if(. && beegent && isliving(target)) var/mob/living/L = target if(L.reagents) - beegent.expose_mob(L, INJECT) - L.reagents.add_reagent(beegent.type, rand(1,5)) + var/amount = rand(1,5) + beegent.expose_mob(L, amount, methods = INJECT) + L.reagents.add_reagent(beegent.type, amount) /mob/living/simple_animal/hostile/bee/proc/assign_reagent(datum/reagent/R) if(istype(R)) beegent = R - name = "[initial(name)] ([R.name])" - real_name = name + set_real_name("[initial(name)] ([R.name])") //clear the old since this one is going to have some new value RemoveElement(/datum/element/venomous) AddElement(/datum/element/venomous, beegent.type, list(1, 5)) @@ -251,12 +250,7 @@ /mob/living/simple_animal/hostile/bee/toxin/Initialize(mapload) . = ..() var/datum/reagent/R = pick(typesof(/datum/reagent/toxin)) - assign_reagent(GLOB.chemical_reagents_list[R]) - -/mob/living/simple_animal/hostile/bee/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - + assign_reagent(SSreagents.chemical_reagents_list[R]) /mob/living/simple_animal/hostile/bee/queen name = "queen bee" desc = "She's the queen of bees, BZZ BZZ!" @@ -273,8 +267,7 @@ . = ..() if(. && beegent && isliving(target)) var/mob/living/L = target - beegent.expose_mob(L, TOUCH) - L.reagents.add_reagent(beegent.type, rand(1,5)) + beegent.expose_mob(L, rand(1,5), methods = TOUCH) //PEASENT BEES @@ -315,7 +308,7 @@ else to_chat(user, span_warning("You don't have enough royal bee jelly to split a bee in two!")) else - var/datum/reagent/R = GLOB.chemical_reagents_list[S.reagents.get_master_reagent_id()] + var/datum/reagent/R = SSreagents.chemical_reagents_list[S.reagents.get_master_reagent_id()] if(R && S.reagents.has_reagent(R.type, 5)) S.reagents.remove_reagent(R.type,5) queen.assign_reagent(R) @@ -331,10 +324,6 @@ qdel(src) return TOXLOSS -/obj/item/queen_bee/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /obj/item/queen_bee/bought/Initialize(mapload) . = ..() queen = new(src) @@ -369,7 +358,6 @@ /obj/item/trash/bee/Initialize(mapload) . = ..() AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment/vitamin = 5), null, RAW | MEAT | GROSS, 10, 0, list("bee"), null, 10) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) /obj/item/trash/bee/update_overlays() . = ..() 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 5ecdf09d6ec4..70f33889f8e8 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -2,7 +2,7 @@ name = "\improper A Perfectly Generic Boss Placeholder" desc = "" robust_searching = 1 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS status_flags = 0 combat_mode = TRUE sentience_type = SENTIENCE_BOSS diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm deleted file mode 100644 index 5e3a7a9a6835..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ /dev/null @@ -1,207 +0,0 @@ -//Paper Wizard Boss -/mob/living/simple_animal/hostile/boss/paper_wizard - name = "Mjor the Creative" - desc = "A wizard with a taste for the arts." - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic) - faction = list("hostile","stickman") - del_on_death = TRUE - icon = 'icons/mob/simple_human.dmi' - icon_state = "paperwizard" - ranged = 1 - environment_smash = ENVIRONMENT_SMASH_NONE - minimum_distance = 3 - retreat_distance = 3 - obj_damage = 0 - melee_damage_lower = 10 - melee_damage_upper = 20 - health = 1000 - maxHealth = 1000 - loot = list(/obj/effect/temp_visual/paperwiz_dying) - projectiletype = /obj/projectile/temp - projectilesound = 'sound/weapons/emitter.ogg' - attack_sound = 'sound/hallucinations/growl1.ogg' - var/list/copies = list() - - footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/boss/paper_wizard/Destroy() - QDEL_LIST(copies) - return ..() - -//Summon Ability -//Lets the wizard summon his art to fight for him -/datum/action/boss/wizard_summon_minions - name = "Summon Minions" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - usage_probability = 40 - boss_cost = 30 - boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard - needs_target = FALSE - say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!" - ///How many minions we summoned - var/summoned_minions = 0 - ///How many minions we can have at once - var/max_minions = 6 - ///How many minions we should spawn - var/minions_to_summon = 3 - -/datum/action/boss/wizard_summon_minions/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - if(summoned_minions >= max_minions) - return FALSE - return TRUE - -/datum/action/boss/wizard_summon_minions/Trigger(trigger_flags) - . = ..() - if(!.) - return - var/list/minions = list( - /mob/living/basic/stickman, - /mob/living/basic/stickman/ranged, - /mob/living/basic/stickman/dog) - var/list/directions = GLOB.cardinals.Copy() - var/summon_amount = min(minions_to_summon, max_minions - summoned_minions) - for(var/i in 1 to summon_amount) - var/atom/chosen_minion = pick_n_take(minions) - chosen_minion = new chosen_minion(get_step(boss, pick_n_take(directions))) - RegisterSignal(chosen_minion, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(lost_minion)) - summoned_minions++ - -/// Called when a minion is qdeleted or dies, removes it from our minion list -/datum/action/boss/wizard_summon_minions/proc/lost_minion(mob/source) - SIGNAL_HANDLER - - UnregisterSignal(source, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH)) - summoned_minions-- - -//Mimic Ability -//Summons mimics of himself with magical papercraft -//Hitting a decoy hurts nearby people excluding the wizard himself -//Hitting the wizard himself destroys all decoys -/datum/action/boss/wizard_mimic - name = "Craft Mimicry" - button_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "mimic_summon" - usage_probability = 30 - boss_cost = 40 - boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard - say_when_triggered = "" - -/datum/action/boss/wizard_mimic/Trigger(trigger_flags) - if(..()) - var/mob/living/target - if(!boss.client) //AI's target - target = boss.target - else //random mob - var/list/threats = boss.PossibleThreats() - if(threats.len) - target = pick(threats) - if(target) - var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss - var/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions))) - wiz.copies += C - C.original = wiz - C.say("My craft defines me, you could even say it IS me!") - wiz.say("My craft defines me, you could even say it IS me!") - wiz.forceMove(get_step(target,pick_n_take(directions))) - wiz.minimum_distance = 1 //so he doesn't run away and ruin everything - wiz.retreat_distance = 0 - else - boss.atb.refund(boss_cost) - -/mob/living/simple_animal/hostile/boss/paper_wizard/copy - desc = "'Tis a ruse!" - health = 1 - maxHealth = 1 - alpha = 200 - boss_abilities = list() - melee_damage_lower = 1 - melee_damage_upper = 5 - minimum_distance = 0 - retreat_distance = 0 - ranged = 0 - loot = list() - var/mob/living/simple_animal/hostile/boss/paper_wizard/original - -/mob/living/simple_animal/hostile/boss/paper_wizard/copy/Destroy() - if(original) - original.copies -= src - original = null - return ..() - -//Hit a fake? eat pain! -/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(amount > 0) //damage - if(original) - original.minimum_distance = 3 - original.retreat_distance = 3 - for(var/c in original.copies) - qdel(c) - for(var/mob/living/L in range(5,src)) - if(L == original || istype(L, type)) - continue - L.adjustBruteLoss(50) - qdel(src) - else - . = ..() - -//Hit the real guy? copies go bai-bai -/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0)//damage - minimum_distance = 3 - retreat_distance = 3 - for(var/copy in copies) - qdel(copy) - -/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user) - . = ..() - if(isobserver(user)) - . += span_notice("It's an illusion - what is it hiding?") - else - qdel(src) //I see through your ruse! - -//fancy effects -/obj/effect/temp_visual/paper_scatter - name = "scattering paper" - desc = "Pieces of paper scattering to the wind." - layer = ABOVE_OPEN_TURF_LAYER - plane = GAME_PLANE - icon = 'icons/effects/effects.dmi' - icon_state = "paper_scatter" - anchored = TRUE - duration = 5 - randomdir = FALSE - -/obj/effect/temp_visual/paperwiz_dying - name = "craft portal" - desc = "A wormhole sucking the wizard into the void. Neat." - layer = ABOVE_OPEN_TURF_LAYER - plane = GAME_PLANE - icon = 'icons/effects/effects.dmi' - icon_state = "paperwiz_poof" - anchored = TRUE - duration = 18 - randomdir = FALSE - -/obj/effect/temp_visual/paperwiz_dying/Initialize(mapload) - . = ..() - visible_message(span_boldannounce("The wizard cries out in pain as a gate appears behind him, sucking him in!")) - playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, TRUE, TRUE) - playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, TRUE, TRUE) - -/obj/effect/temp_visual/paperwiz_dying/Destroy() - for(var/mob/M in range(7,src)) - shake_camera(M, 7, 1) - var/turf/T = get_turf(src) - playsound(T,'sound/magic/summon_magic.ogg', 50, TRUE, TRUE) - new /obj/effect/temp_visual/paper_scatter(T) - new /obj/item/clothing/suit/wizrobe/paper(T) - new /obj/item/clothing/head/collectable/paper(T) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index c4cd2f2e2eb7..4231477928b5 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -87,7 +87,6 @@ . = ..() ADD_TRAIT(src, TRAIT_HEALS_FROM_CARP_RIFTS, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - add_cell_sample() if(ai_controller) ai_controller.blackboard[BB_HOSTILE_ATTACK_WORD] = pick(speak_emote) if(tamer) @@ -108,10 +107,6 @@ can_have_ai = FALSE toggle_ai(AI_OFF) - -/mob/living/simple_animal/hostile/carp/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_CARP, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /** * Randomly assigns a color to a carp from either a common or rare color variant lists * @@ -192,10 +187,6 @@ del_on_death = 1 random_color = FALSE - -/mob/living/simple_animal/hostile/carp/holocarp/add_cell_sample() - return - /mob/living/simple_animal/hostile/carp/megacarp icon = 'icons/mob/broadMobs.dmi' name = "Mega Space Carp" @@ -227,10 +218,6 @@ maxHealth += rand(30,60) move_to_delay = rand(3,7) - -/mob/living/simple_animal/hostile/carp/megacarp/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGACARP, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/carp/megacarp/adjustHealth(amount, updating_health = TRUE, forced = FALSE) . = ..() if(.) @@ -321,8 +308,6 @@ disky = potential_disky to_chat(src, span_nicegreen("YES!! You manage to pick up [disky]. (Click anywhere to place it back down.)")) update_icon() - if(!disky.fake) - client.give_award(/datum/award/achievement/misc/cayenne_disk, src) return if(disky) if(isopenturf(attacked_target)) 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 ec7215669ce2..befb02aac69d 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -9,7 +9,7 @@ speak_chance = 0 turns_per_move = 5 speed = 0 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 maxHealth = 100 health = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index bbfdaa4d5d65..7c7a9d64c8a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -15,7 +15,7 @@ speed = 0 maxHealth = 80 health = 80 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 harm_intent_damage = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm deleted file mode 100644 index 0747ca686f1e..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ /dev/null @@ -1,722 +0,0 @@ -#define INTERACTION_SPIDER_KEY "spider_key" - -/** - * # Giant Spider - * - * A versatile mob which can occur from a variety of sources. - * - * A mob which can be created by botany or xenobiology. The basic type is the guard, which is slower but sturdy and outputs good damage. - * All spiders can produce webbing. Currently does not inject toxin into its target. - */ -/mob/living/simple_animal/hostile/giant_spider - name = "giant spider" - desc = "Furry and black, it makes you shudder to look at it. This one has deep red eyes." - icon_state = "guard" - icon_living = "guard" - icon_dead = "guard_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - speak_emote = list("chitters") - emote_hear = list("chitters") - speak_chance = 5 - speed = 0 - turns_per_move = 5 - butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8) - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - initial_language_holder = /datum/language_holder/spider - maxHealth = 80 - health = 80 - damage_coeff = list(BRUTE = 1, BURN = 1.25, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1) - unsuitable_cold_damage = 8 - unsuitable_heat_damage = 8 - obj_damage = 30 - melee_damage_lower = 20 - melee_damage_upper = 25 - combat_mode = TRUE - faction = list("spiders") - pass_flags = PASSTABLE - move_to_delay = 6 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_sound = 'sound/weapons/bite.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE - see_in_dark = NIGHTVISION_FOV_RANGE - footstep_type = FOOTSTEP_MOB_CLAW - ///How much of a reagent the mob injects on attack - var/poison_per_bite = 0 - ///What reagent the mob injects targets with - var/poison_type = /datum/reagent/toxin - ///How quickly the spider can place down webbing. One is base speed, larger numbers are slower. - var/web_speed = 1 - ///Whether or not the spider can create sealed webs. - var/web_sealer = FALSE - ///The message that the mother spider left for this spider when the egg was layed. - var/directive = "" - /// Short description of what this mob is capable of, for radial menu uses - var/menu_description = "Versatile spider variant for frontline combat with high health and damage." - -/mob/living/simple_animal/hostile/giant_spider/Initialize(mapload) - . = ..() - var/datum/action/innate/spider/lay_web/webbing = new(src) - webbing.Grant(src) - - if(poison_per_bite) - AddElement(/datum/element/venomous, poison_type, poison_per_bite) - AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) - AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") - -/mob/living/simple_animal/hostile/giant_spider/Login() - . = ..() - if(!. || !client) - return FALSE - if(directive) - to_chat(src, span_spider("Your mother left you a directive! Follow it at all costs.")) - to_chat(src, span_spider("[directive]")) - GLOB.spidermobs[src] = TRUE - -/mob/living/simple_animal/hostile/giant_spider/Destroy() - GLOB.spidermobs -= src - return ..() - -/mob/living/simple_animal/hostile/giant_spider/mob_negates_gravity() - if(locate(/obj/structure/spider/stickyweb) in loc) - return TRUE - return ..() - -/** - * # Spider Hunter - * - * A subtype of the giant spider with purple eyes and toxin injection. - * - * A subtype of the giant spider which is faster, has toxin injection, but less health and damage. This spider is only slightly slower than a human. - */ -/mob/living/simple_animal/hostile/giant_spider/hunter - name = "hunter spider" - desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." - icon_state = "hunter" - icon_living = "hunter" - icon_dead = "hunter_dead" - maxHealth = 50 - health = 50 - melee_damage_lower = 15 - melee_damage_upper = 20 - poison_per_bite = 5 - move_to_delay = 5 - speed = -0.1 - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less health and damage." - -/** - * # Spider Nurse - * - * A subtype of the giant spider with green eyes that specializes in support. - * - * A subtype of the giant spider which specializes in support skills. Nurses can place down webbing in a quarter of the time - * that other species can and can wrap other spiders' wounds, healing them. Note that it cannot heal itself. - */ -/mob/living/simple_animal/hostile/giant_spider/nurse - name = "nurse spider" - desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes." - icon_state = "nurse" - icon_living = "nurse" - icon_dead = "nurse_dead" - gender = FEMALE - butcher_results = list(/obj/item/food/meat/slab/spider = 2, /obj/item/food/spiderleg = 8, /obj/item/food/spidereggs = 4) - maxHealth = 40 - health = 40 - melee_damage_lower = 5 - melee_damage_upper = 10 - poison_per_bite = 3 - web_speed = 0.25 - web_sealer = TRUE - menu_description = "Support spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." - ///The health HUD applied to the mob. - var/health_hud = DATA_HUD_MEDICAL_ADVANCED - -/mob/living/simple_animal/hostile/giant_spider/nurse/Initialize(mapload) - . = ..() - var/datum/atom_hud/datahud = GLOB.huds[health_hud] - datahud.add_hud_to(src) - -/mob/living/simple_animal/hostile/giant_spider/nurse/AttackingTarget() - if(DOING_INTERACTION(src, INTERACTION_SPIDER_KEY)) - return - if(!istype(target, /mob/living/simple_animal/hostile/giant_spider)) - return ..() - var/mob/living/simple_animal/hostile/giant_spider/hurt_spider = target - if(hurt_spider == src) - to_chat(src, span_warning("You don't have the dexerity to wrap your own wounds.")) - return - if(hurt_spider.health >= hurt_spider.maxHealth) - to_chat(src, span_warning("You can't find any wounds to wrap up.")) - return - if(hurt_spider.stat == DEAD) - to_chat(src, span_warning("You're a nurse, not a miracle worker.")) - return - visible_message( - span_notice("[src] begins wrapping the wounds of [hurt_spider]."), - span_notice("You begin wrapping the wounds of [hurt_spider]."), - ) - - if(!do_after(src, hurt_spider, 2 SECONDS, interaction_key = INTERACTION_SPIDER_KEY)) - return - - hurt_spider.heal_overall_damage(20, 20) - new /obj/effect/temp_visual/heal(get_turf(hurt_spider), "#80F5FF") - visible_message( - span_notice("[src] wraps the wounds of [hurt_spider]."), - span_notice("You wrap the wounds of [hurt_spider]."), - ) - -/** - * # Tarantula - * - * The tank of spider subtypes. Is incredibly slow when not on webbing, but has a lunge and the highest health and damage of any spider type. - * - * A subtype of the giant spider which specializes in pure strength and staying power. Is slowed down greatly when not on webbing, but can lunge - * to throw off attackers and possibly to stun them, allowing the tarantula to net an easy kill. - */ -/mob/living/simple_animal/hostile/giant_spider/tarantula - name = "tarantula" - desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes." - icon_state = "tarantula" - icon_living = "tarantula" - icon_dead = "tarantula_dead" - maxHealth = 300 // woah nelly - health = 300 - melee_damage_lower = 35 - melee_damage_upper = 40 - obj_damage = 100 - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - poison_per_bite = 0 - move_to_delay = 8 - speed = 1 - status_flags = NONE - mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN - menu_description = "Tank spider variant with an enormous amount of health and damage, but is very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." - /// Whether or not the tarantula is currently walking on webbing. - var/silk_walking = TRUE - /// Charging ability - var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge - -/mob/living/simple_animal/hostile/giant_spider/tarantula/Initialize(mapload) - . = ..() - charge = new /datum/action/cooldown/mob_cooldown/charge/basic_charge() - charge.Grant(src) - -/mob/living/simple_animal/hostile/giant_spider/tarantula/Destroy() - QDEL_NULL(charge) - return ..() - -/mob/living/simple_animal/hostile/giant_spider/tarantula/OpenFire() - if(client) - return - charge.Trigger(target = target) - -/mob/living/simple_animal/hostile/giant_spider/tarantula/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - var/obj/structure/spider/stickyweb/web = locate() in loc - if(web && !silk_walking) - remove_movespeed_modifier(/datum/movespeed_modifier/tarantula_web) - silk_walking = TRUE - else if(!web && silk_walking) - add_movespeed_modifier(/datum/movespeed_modifier/tarantula_web) - silk_walking = FALSE - -/** - * # Spider Viper - * - * The assassin of spider subtypes. Essentially a juiced up version of the hunter. - * - * A subtype of the giant spider which specializes in speed and poison. Injects a deadlier toxin than other spiders, moves extremely fast, - * but like the hunter has a limited amount of health. - */ -/mob/living/simple_animal/hostile/giant_spider/viper - name = "viper spider" - desc = "Furry and black, it makes you shudder to look at it. This one has effervescent purple eyes." - icon_state = "viper" - icon_living = "viper" - icon_dead = "viper_dead" - maxHealth = 40 - health = 40 - melee_damage_lower = 5 - melee_damage_upper = 5 - poison_per_bite = 5 - move_to_delay = 4 - poison_type = /datum/reagent/toxin/venom - speed = -0.5 - gold_core_spawnable = NO_SPAWN - menu_description = "Assassin spider variant with an unmatched speed and very deadly poison, but has very low amount of health and damage." - -/** - * # Spider Broodmother - * - * The reproductive line of spider subtypes. Is the only subtype to lay eggs, which is the only way for spiders to reproduce. - * - * A subtype of the giant spider which is the crux of a spider horde. Can lay normal eggs at any time which become normal spider types, - * but by consuming human bodies can lay special eggs which can become one of the more specialized subtypes, including possibly another broodmother. - * However, this spider subtype has no offensive capability and can be quickly dispatched without assistance from other spiders. They are also capable - * of sending messages to all living spiders, being a communication line for the rest of the horde. - */ -/mob/living/simple_animal/hostile/giant_spider/midwife - name = "broodmother spider" - desc = "Furry and black, it makes you shudder to look at it. This one has scintillating green eyes. Might also be hiding a real knife somewhere." - gender = FEMALE - icon_state = "midwife" - icon_living = "midwife" - icon_dead = "midwife_dead" - maxHealth = 40 - health = 40 - melee_damage_lower = 5 - melee_damage_upper = 10 - poison_per_bite = 3 - gold_core_spawnable = NO_SPAWN - web_sealer = TRUE - menu_description = "Royal spider variant specializing in reproduction and leadership, but has very low amount of health and deals low damage." - -/mob/living/simple_animal/hostile/giant_spider/midwife/Initialize(mapload) - . = ..() - var/datum/action/cooldown/wrap/wrapping = new(src) - wrapping.Grant(src) - - var/datum/action/innate/spider/lay_eggs/make_eggs = new(src) - make_eggs.Grant(src) - - var/datum/action/innate/spider/lay_eggs/enriched/make_better_eggs = new(src) - make_better_eggs.Grant(src) - - var/datum/action/innate/spider/set_directive/give_orders = new(src) - give_orders.Grant(src) - - var/datum/action/innate/spider/comm/not_hivemind_talk = new(src) - not_hivemind_talk.Grant(src) - -/datum/action/innate/spider - button_icon = 'icons/mob/actions/actions_animal.dmi' - background_icon_state = "bg_alien" - -/datum/action/innate/spider/lay_web // Todo: Unify this with the genetics power - 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/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) - return FALSE - if(!isspider(owner)) - return FALSE - - var/mob/living/simple_animal/hostile/giant_spider/spider = owner - var/obj/structure/spider/stickyweb/web = locate() in get_turf(spider) - if(web && (!spider.web_sealer || istype(web, /obj/structure/spider/stickyweb/sealed))) - to_chat(owner, span_warning("There's already a web here!")) - return FALSE - - if(!isturf(spider.loc)) - return FALSE - - return TRUE - -/datum/action/innate/spider/lay_web/Activate() - var/turf/spider_turf = get_turf(owner) - var/mob/living/simple_animal/hostile/giant_spider/spider = owner - var/obj/structure/spider/stickyweb/web = locate() in spider_turf - if(web) - spider.visible_message( - span_notice("[spider] begins to pack more webbing onto the web."), - span_notice("You begin to seal the web."), - ) - else - spider.visible_message( - span_notice("[spider] begins to secrete a sticky substance."), - span_notice("You begin to lay a web."), - ) - - spider.stop_automated_movement = TRUE - - if(do_after(spider, spider_turf, 4 SECONDS * spider.web_speed)) - if(spider.loc == spider_turf) - if(web) - qdel(web) - new /obj/structure/spider/stickyweb/sealed(spider_turf) - new /obj/structure/spider/stickyweb(spider_turf) - - spider.stop_automated_movement = FALSE - -/datum/action/cooldown/wrap - name = "Wrap" - desc = "Wrap something or someone in a cocoon. If it's a human or similar species, \ - you'll also consume them, allowing you to lay enriched eggs." - background_icon_state = "bg_alien" - button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "wrap_0" - check_flags = AB_CHECK_CONSCIOUS - click_to_activate = TRUE - ranged_mousepointer = 'icons/effects/mouse_pointers/wrap_target.dmi' - /// The time it takes to wrap something. - var/wrap_time = 5 SECONDS - -/datum/action/cooldown/wrap/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - if(owner.incapacitated()) - return FALSE - if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) - return FALSE - return TRUE - -/datum/action/cooldown/wrap/set_click_ability(mob/on_who) - . = ..() - if(!.) - return - - to_chat(on_who, span_notice("You prepare to wrap something in a cocoon. Left-click your target to start wrapping!")) - button_icon_state = "wrap_0" - build_all_button_icons() - -/datum/action/cooldown/wrap/unset_click_ability(mob/on_who, refund_cooldown = TRUE) - . = ..() - if(!.) - return - - if(refund_cooldown) - to_chat(on_who, span_notice("You no longer prepare to wrap something in a cocoon.")) - button_icon_state = "wrap_1" - build_all_button_icons() - -/datum/action/cooldown/wrap/Activate(atom/to_wrap) - if(!owner.Adjacent(to_wrap)) - owner.balloon_alert(owner, "must be closer!") - return FALSE - - if(!ismob(to_wrap) && !isobj(to_wrap)) - return FALSE - - if(to_wrap == owner) - return FALSE - - if(isspider(to_wrap)) - owner.balloon_alert(owner, "can't wrap spiders!") - return FALSE - - var/atom/movable/target_movable = to_wrap - if(target_movable.anchored) - return FALSE - - StartCooldown(wrap_time) - INVOKE_ASYNC(src, PROC_REF(cocoon), to_wrap) - return TRUE - -/datum/action/cooldown/wrap/proc/cocoon(atom/movable/to_wrap) - owner.visible_message( - span_notice("[owner] begins to secrete a sticky substance around [to_wrap]."), - span_notice("You begin wrapping [to_wrap] into a cocoon."), - ) - - var/mob/living/simple_animal/animal_owner = owner - if(istype(animal_owner)) - animal_owner.stop_automated_movement = TRUE - - if(do_after(owner, to_wrap, wrap_time, interaction_key = INTERACTION_SPIDER_KEY)) - var/obj/structure/spider/cocoon/casing = new(to_wrap.loc) - if(isliving(to_wrap)) - var/mob/living/living_wrapped = to_wrap - // if they're not dead, you can consume them anyway - if(ishuman(living_wrapped) && (living_wrapped.stat != DEAD || !HAS_TRAIT(living_wrapped, TRAIT_SPIDER_CONSUMED))) - var/datum/action/innate/spider/lay_eggs/enriched/egg_power = locate() in owner.actions - if(egg_power) - egg_power.charges++ - egg_power.build_all_button_icons() - owner.visible_message( - span_danger("[owner] sticks a proboscis into [living_wrapped] and sucks a viscous substance out."), - span_notice("You suck the nutriment out of [living_wrapped], feeding you enough to lay a cluster of enriched eggs."), - ) - - living_wrapped.death() //you just ate them, they're dead. - else - to_chat(owner, span_warning("[living_wrapped] cannot sate your hunger!")) - - to_wrap.forceMove(casing) - if(to_wrap.density || ismob(to_wrap)) - casing.icon_state = pick("cocoon_large1", "cocoon_large2", "cocoon_large3") - - if(istype(animal_owner)) - animal_owner.stop_automated_movement = TRUE - -/datum/action/innate/spider/lay_eggs - name = "Lay Eggs" - desc = "Lay a cluster of eggs, which will soon grow into a normal spider." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "lay_eggs" - ///How long it takes for a broodmother to lay eggs. - var/egg_lay_time = 15 SECONDS - ///The type of egg we create - var/egg_type = /obj/effect/mob_spawn/ghost_role/spider - -/datum/action/innate/spider/lay_eggs/IsAvailable(feedback = FALSE) - . = ..() - if(!.) - return FALSE - - if(!isspider(owner)) - return FALSE - var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) - if(eggs) - to_chat(owner, span_warning("There is already a cluster of eggs here!")) - return FALSE - if(DOING_INTERACTION(owner, INTERACTION_SPIDER_KEY)) - return FALSE - - return TRUE - -/datum/action/innate/spider/lay_eggs/Activate() - - owner.visible_message( - span_notice("[owner] begins to lay a cluster of eggs."), - span_notice("You begin to lay a cluster of eggs."), - ) - - var/mob/living/simple_animal/hostile/giant_spider/spider = owner - spider.stop_automated_movement = TRUE - - if(do_after(owner, get_turf(owner), egg_lay_time, interaction_key = INTERACTION_SPIDER_KEY)) - var/obj/structure/spider/eggcluster/eggs = locate() in get_turf(owner) - if(!eggs || !isturf(spider.loc)) - var/obj/effect/mob_spawn/ghost_role/spider/new_eggs = new egg_type(get_turf(spider)) - new_eggs.directive = spider.directive - new_eggs.faction = spider.faction - build_all_button_icons(TRUE) - - spider.stop_automated_movement = FALSE - -/datum/action/innate/spider/lay_eggs/enriched - name = "Lay Enriched Eggs" - desc = "Lay a cluster of eggs, which will soon grow into a greater spider. Requires you drain a human per cluster of these eggs." - button_icon_state = "lay_enriched_eggs" - egg_type = /obj/effect/mob_spawn/ghost_role/spider/enriched - /// How many charges we have to make eggs - var/charges = 0 - -/datum/action/innate/spider/lay_eggs/enriched/IsAvailable(feedback = FALSE) - return ..() && (charges > 0) - -/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(feedback = FALSE) - return ..() && istype(owner, /mob/living/simple_animal/hostile/giant_spider) - -/datum/action/innate/spider/set_directive/Activate() - var/mob/living/simple_animal/hostile/giant_spider/midwife/spider = owner - - spider.directive = tgui_input_text(spider, "Enter the new directive", "Create directive", "[spider.directive]") - if(isnull(spider.directive) || QDELETED(src) || QDELETED(owner) || !IsAvailable()) - return FALSE - - message_admins("[ADMIN_LOOKUPFLW(owner)] set its directive to: '[spider.directive]'.") - log_game("[key_name(owner)] set its directive to: '[spider.directive]'.") - return TRUE - -/datum/action/innate/spider/comm - name = "Command" - desc = "Send a command to all living spiders." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "command" - -/datum/action/innate/spider/comm/IsAvailable(feedback = FALSE) - return ..() && istype(owner, /mob/living/simple_animal/hostile/giant_spider/midwife) - -/datum/action/innate/spider/comm/Trigger(trigger_flags) - var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") - if(!input || QDELETED(src) || QDELETED(owner) || !IsAvailable()) - return FALSE - - spider_command(owner, input) - return TRUE - -/** - * Sends a message to all spiders from the target. - * - * Allows the user to send a message to all spiders that exist. Ghosts will also see the message. - * Arguments: - * * user - The spider sending the message - * * message - The message to be sent - */ -/datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message) - if(!message) - return - var/my_message - my_message = span_spider("Command from [user]: [message]") - for(var/mob/living/simple_animal/hostile/giant_spider/spider as anything in GLOB.spidermobs) - to_chat(spider, my_message) - for(var/ghost in GLOB.dead_mob_list) - var/link = FOLLOW_LINK(ghost, user) - to_chat(ghost, "[link] [my_message]") - user.log_talk(message, LOG_SAY, tag = "spider command") - -/** - * # Giant Ice Spider - * - * A giant spider immune to temperature damage. Injects frost oil. - * - * A subtype of the giant spider which is immune to temperature damage, unlike its normal counterpart. - * Currently unused in the game unless spawned by admins. - */ -/mob/living/simple_animal/hostile/giant_spider/ice - name = "giant ice spider" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN - menu_description = "Versatile ice spider variant for frontline combat with high health and damage. Immune to temperature damage." - -/** - * # Ice Nurse Spider - * - * A nurse spider immune to temperature damage. Injects frost oil. - * - * Same thing as the giant ice spider but mirrors the nurse subtype. Also unused. - */ -/mob/living/simple_animal/hostile/giant_spider/nurse/ice - name = "giant ice spider" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - menu_description = "Support ice spider variant specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage. Immune to temperature damage." - -/** - * # Ice Hunter Spider - * - * A hunter spider immune to temperature damage. Injects frost oil. - * - * Same thing as the giant ice spider but mirrors the hunter subtype. Also unused. - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/ice - name = "giant ice spider" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 1500 - poison_type = /datum/reagent/consumable/frostoil - color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN - menu_description = "Fast ice spider variant specializing in catching running prey and frost oil injection, but has less health and damage. Immune to temperature damage." - -/** - * # Scrawny Hunter Spider - * - * A hunter spider that trades damage for health, unable to smash enviroments. - * - * Mainly used as a minor threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/scrawny - name = "scrawny spider" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 60 - maxHealth = 60 - melee_damage_lower = 5 - melee_damage_upper = 10 - desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes, and looks abnormally thin and frail." - menu_description = "Fast spider variant specializing in catching running prey and toxin injection, but has less damage than a normal hunter spider at the cost of a little more health." - -/** - * # Scrawny Tarantula - * - * A weaker version of the Tarantula, unable to smash enviroments. - * - * Mainly used as a moderately strong but slow threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/tarantula/scrawny - name = "scrawny tarantula" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 150 - maxHealth = 150 - melee_damage_lower = 20 - melee_damage_upper = 25 - desc = "Furry and black, it makes you shudder to look at it. This one has abyssal red eyes, and looks abnormally thin and frail." - menu_description = "A weaker variant of the tarantula with reduced amount of health and damage, very slow when not on webbing. It also has a charge ability to close distance with a target after a small windup." - -/** - * # Scrawny Nurse Spider - * - * A weaker version of the nurse spider with reduced health, unable to smash enviroments. - * - * Mainly used as a weak threat in abandoned places, such as areas in maintenance or a ruin. - */ -/mob/living/simple_animal/hostile/giant_spider/nurse/scrawny - name = "scrawny nurse spider" - environment_smash = ENVIRONMENT_SMASH_NONE - health = 30 - maxHealth = 30 - desc = "Furry and black, it makes you shudder to look at it. This one has brilliant green eyes, and looks abnormally thin and frail." - menu_description = "Weaker version of the nurse spider, specializing in healing their brethren and placing webbings very swiftly, but has very low amount of health and deals low damage." - -/** - * # Flesh Spider - * - * A giant spider subtype specifically created by changelings. Built to be self-sufficient, unlike other spider types. - * - * A subtype of giant spider which only occurs from changelings. Has the base stats of a hunter, but they can heal themselves. - * They also produce web in 70% of the time of the base spider. They also occasionally leave puddles of blood when they walk around. Flavorful! - */ -/mob/living/simple_animal/hostile/giant_spider/hunter/flesh - desc = "A odd fleshy creature in the shape of a spider. Its eyes are pitch black and soulless." - icon_state = "flesh_spider" - icon_living = "flesh_spider" - icon_dead = "flesh_spider_dead" - web_speed = 0.7 - menu_description = "Self-sufficient spider variant capable of healing themselves and producing webbbing fast, but has less health and damage." - -/mob/living/simple_animal/hostile/giant_spider/hunter/flesh/Initialize(mapload) - . = ..() - AddElement(/datum/element/blood_walk, /obj/effect/decal/cleanable/blood/bubblegum, blood_spawn_chance = 5) - -/mob/living/simple_animal/hostile/giant_spider/hunter/flesh/AttackingTarget() - if(DOING_INTERACTION(src, INTERACTION_SPIDER_KEY)) - return - if(src == target) - if(health >= maxHealth) - to_chat(src, span_warning("You're not injured, there's no reason to heal.")) - return - visible_message(span_notice("[src] begins mending themselves..."),span_notice("You begin mending your wounds...")) - if(do_after(src, time = 2 SECONDS, interaction_key = INTERACTION_SPIDER_KEY)) - heal_overall_damage(50, 50) - new /obj/effect/temp_visual/heal(get_turf(src), "#80F5FF") - visible_message(span_notice("[src]'s wounds mend together."),span_notice("You mend your wounds together.")) - return - return ..() - -/** - * # Viper Spider (Wizard) - * - * A viper spider buffed slightly so I don't need to hear anyone complain about me nerfing an already useless wizard ability. - * - * A viper spider with buffed attributes. All I changed was its health value and gave it the ability to ventcrawl. The crux of the wizard meta. - */ -/mob/living/simple_animal/hostile/giant_spider/viper/wizard - maxHealth = 80 - health = 80 - menu_description = "Stronger assassin spider variant with an unmatched speed, high amount of health and very deadly poison, but deals very low amount of damage. It also has ability to ventcrawl." - -/mob/living/simple_animal/hostile/giant_spider/viper/wizard/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -#undef INTERACTION_SPIDER_KEY diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index af3b58f197e1..6d3e113563ea 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -199,7 +199,7 @@ playsound(currentTurf, 'sound/effects/splat.ogg', 50, TRUE) /mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_prestart(duration) - flick("vomit_start",src) + z_flick("vomit_start",src) addtimer(CALLBACK(src, PROC_REF(vomit_start), duration), 13) //13 is the length of the vomit_start animation in gooseloose.dmi /mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_start(duration) @@ -217,7 +217,7 @@ vomit_end() /mob/living/simple_animal/hostile/retaliate/goose/vomit/proc/vomit_end() - flick("vomit_end",src) + z_flick("vomit_end",src) vomiting = FALSE icon_state = initial(icon_state) diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm index 2b7fc7e8279c..7aa5d41999af 100644 --- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm +++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm @@ -29,12 +29,12 @@ environment_smash = ENVIRONMENT_SMASH_WALLS attack_verb_continuous = "pummels" attack_verb_simple = "pummel" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH dextrous = TRUE held_items = list(null, null) faction = list("jungle") robust_searching = TRUE - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS minbodytemp = 270 maxbodytemp = 350 unique_name = TRUE @@ -89,8 +89,7 @@ /mob/living/simple_animal/hostile/gorilla/gib(no_brain) if(!no_brain) var/mob/living/brain/B = new(drop_location()) - B.name = real_name - B.real_name = real_name + B.set_real_name(real_name) if(mind) mind.transfer_to(B) ..() diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 5360b73c81ce..2263216ecd8b 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -43,7 +43,7 @@ var/search_objects_timer_id //Timer for regaining our old search_objects value after being attacked var/search_objects_regain_time = 30 //the delay between being attacked and gaining our old search_objects value back var/list/wanted_objects = list() //A typecache of objects types that will be checked against to attack, should we have search_objects enabled - ///Mobs ignore mob/living targets with a stat lower than that of stat_attack. If set to DEAD, then they'll include corpses in their targets, if to HARD_CRIT they'll keep attacking until they kill, and so on. + ///Mobs ignore mob/living targets with a stat lower than that of stat_attack. If set to DEAD, then they'll include corpses in their targets, if to UNCONSCIOUS they'll keep attacking until they kill, and so on. var/stat_attack = CONSCIOUS 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 @@ -437,7 +437,7 @@ return iswallturf(T) || ismineralturf(T) -/mob/living/simple_animal/hostile/Move(atom/newloc, dir , step_x , step_y) +/mob/living/simple_animal/hostile/Move(atom/newloc, dir, glide_size_override, z_movement_flags) if(dodging && approaching_target && prob(dodge_prob) && moving_diagonally == 0 && isturf(loc) && isturf(newloc)) return dodge(newloc,dir) else 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 9fe9cabb0c73..5e606b5bf833 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm @@ -21,7 +21,7 @@ base_pixel_x = -16 layer = LARGE_MOB_LAYER speed = 10 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 var/hopping = FALSE var/hop_cooldown = 0 //Strictly for player controlled leapers @@ -71,10 +71,6 @@ icon = 'icons/effects/tomatodecal.dmi' icon_state = "tomato_floor1" -/obj/effect/decal/cleanable/leaper_sludge/Initialize(mapload, list/datum/disease/diseases) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_LEAPER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /obj/structure/leaper_bubble name = "leaper bubble" desc = "A floating bubble containing leaper venom. The contents are under a surprising amount of pressure." @@ -90,10 +86,6 @@ COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) - AddElement(/datum/element/swabable, CELL_LINE_TABLE_LEAPER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/obj/structure/leaper_bubble/ComponentInitialize() - . = ..() AddElement(/datum/element/movetype_handler) ADD_TRAIT(src, TRAIT_MOVE_FLOATING, LEAPER_BUBBLE_TRAIT) @@ -127,10 +119,11 @@ taste_description = "french cuisine" taste_mult = 1.3 -/datum/reagent/toxin/leaper_venom/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/leaper_venom/affect_blood(mob/living/carbon/C, removed) + . = ..() if(volume >= 10) - M.adjustToxLoss(5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0) - ..() + C.adjustToxLoss(5 * removed, 0) + return TRUE /obj/effect/temp_visual/leaper_crush name = "grim tidings" @@ -147,10 +140,10 @@ /mob/living/simple_animal/hostile/jungle/leaper/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) remove_verb(src, /mob/living/verb/pulled) - add_cell_sample() -/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A) +/mob/living/simple_animal/hostile/jungle/leaper/CtrlClickOn(atom/A, list/params) face_atom(A) GiveTarget(A) if(!isturf(loc)) @@ -215,7 +208,7 @@ return hopping = TRUE set_density(FALSE) - pass_flags |= PASSMOB + add_passmob(REF(src)) notransform = TRUE var/turf/new_turf = locate((target.x + rand(-3,3)),(target.y + rand(-3,3)),target.z) if(player_hop) @@ -229,7 +222,7 @@ /mob/living/simple_animal/hostile/jungle/leaper/proc/FinishHop() set_density(TRUE) notransform = FALSE - pass_flags &= ~PASSMOB + remove_passmob(REF(src)) hopping = FALSE playsound(src.loc, 'sound/effects/meteorimpact.ogg', 100, TRUE) if(target && AIStatus == AI_ON && projectile_ready && !ckey) @@ -282,8 +275,4 @@ return icon_state = "leaper" -/mob/living/simple_animal/hostile/jungle/leaper/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_LEAPER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - #undef PLAYER_HOP_DELAY 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 fb752989cef0..9507f1920ce6 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 @@ -27,7 +27,6 @@ alpha = 50 footstep_type = FOOTSTEP_MOB_CLAW - var/datum/action/small_sprite/mini_arachnid = new/datum/action/small_sprite/mega_arachnid() /mob/living/simple_animal/hostile/jungle/mega_arachnid/Life(delta_time = SSMOBS_DT, times_fired) ..() @@ -53,12 +52,7 @@ /mob/living/simple_animal/hostile/jungle/mega_arachnid/Initialize(mapload) . = ..() - add_cell_sample() - mini_arachnid.Grant(src) - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + AddComponent(/datum/component/seethrough_mob) /obj/projectile/mega_arachnid name = "flesh snare" @@ -82,6 +76,3 @@ icon_state = "flesh_snare" armed = TRUE -/obj/item/restraints/legcuffs/beartrap/mega_arachnid/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) 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 6627fe3554d2..eef46aa551ef 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/mook.dm @@ -26,7 +26,7 @@ ranged_cooldown_time = 10 pass_flags_self = LETPASSTHROW robust_searching = TRUE - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS attack_sound = 'sound/weapons/rapierhit.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH deathsound = 'sound/voice/mook_death.ogg' 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 5963c45687f4..899e2b24afeb 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -31,7 +31,7 @@ projectiletype = /obj/projectile/seedling projectilesound = 'sound/weapons/pierce.ogg' robust_searching = TRUE - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS move_resist = MOVE_FORCE_EXTREMELY_STRONG var/combatant_state = SEEDLING_STATE_NEUTRAL var/obj/seedling_weakpoint/weak_point @@ -83,7 +83,7 @@ /datum/status_effect/seedling_beam_indicator/on_apply() if(owner.client) - seedling_screen_object = new /atom/movable/screen/seedling() + seedling_screen_object = new /atom/movable/screen/seedling(null, owner.hud_used) owner.client.screen += seedling_screen_object tick() return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 91571a349910..4de9d775a023 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -22,7 +22,7 @@ melee_damage_upper = 12 attack_verb_continuous = "slams" attack_verb_simple = "slam" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH faction = list("plants") atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm deleted file mode 100644 index c43be265966d..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm +++ /dev/null @@ -1,204 +0,0 @@ -/mob/living/simple_animal/hostile/megafauna - name = "boss of this gym" - desc = "Attack the weak point for massive damage." - health = 1000 - maxHealth = 1000 - combat_mode = TRUE - sentience_type = SENTIENCE_BOSS - environment_smash = ENVIRONMENT_SMASH_RWALLS - mob_biotypes = MOB_ORGANIC|MOB_EPIC - obj_damage = 400 - light_outer_range = 3 - faction = list("mining", "boss") - weather_immunities = list(TRAIT_LAVA_IMMUNE,TRAIT_ASHSTORM_IMMUNE) - robust_searching = TRUE - ranged_ignores_vision = TRUE - stat_attack = DEAD - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - minbodytemp = 0 - maxbodytemp = INFINITY - vision_range = 5 - aggro_vision_range = 18 - move_force = MOVE_FORCE_OVERPOWERING - move_resist = MOVE_FORCE_OVERPOWERING - pull_force = MOVE_FORCE_OVERPOWERING - mob_size = MOB_SIZE_HUGE - layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise - mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 - /// Crusher loot dropped when the megafauna is killed with a crusher - var/list/crusher_loot - /// Achievement given to surrounding players when the megafauna is killed - var/achievement_type - /// Crusher achievement given to players when megafauna is killed - var/crusher_achievement_type - /// Score given to players when megafauna is killed - var/score_achievement_type - /// If the megafauna was actually killed (not just dying, then transforming into another type) - var/elimination = 0 - /// Modifies attacks when at lower health - var/anger_modifier = 0 - /// Name for the GPS signal of the megafauna - var/gps_name = null - /// Next time the megafauna can use a melee attack - var/recovery_time = 0 - /// If this is a megafauna that is real (has achievements, gps signal) - var/true_spawn = TRUE - /// Range the megafauna can move from their nest (if they have one - var/nest_range = 10 - /// The chosen attack by the megafauna - var/chosen_attack = 1 - /// Attack actions, sets chosen_attack to the number in the action - var/list/attack_action_types = list() - /// If there is a small sprite icon for players controlling the megafauna to use - var/small_sprite_type - -/mob/living/simple_animal/hostile/megafauna/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - if(gps_name && true_spawn) - AddComponent(/datum/component/gps, gps_name) - ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT) - ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_MARTIAL_ARTS_IMMUNE, MEGAFAUNA_TRAIT) - for(var/action_type in attack_action_types) - var/datum/action/innate/megafauna_attack/attack_action = new action_type() - attack_action.Grant(src) - if(small_sprite_type) - var/datum/action/small_sprite/small_action = new small_sprite_type() - small_action.Grant(src) - -/mob/living/simple_animal/hostile/megafauna/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - //Safety check - if(!loc) - return ..() - if(nest && nest.parent && get_dist(nest.parent, src) > nest_range) - var/turf/closest = get_turf(nest.parent) - for(var/i = 1 to nest_range) - closest = get_step(closest, get_dir(closest, src)) - forceMove(closest) // someone teleported out probably and the megafauna kept chasing them - LoseTarget() - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/death(gibbed, list/force_grant) - if(health > 0) - return - var/datum/status_effect/crusher_damage/crusher_dmg = has_status_effect(/datum/status_effect/crusher_damage) - var/crusher_kill = FALSE - if(crusher_dmg && crusher_loot && crusher_dmg.total_damage >= maxHealth * 0.6) - spawn_crusher_loot() - crusher_kill = TRUE - if(true_spawn && !(flags_1 & ADMIN_SPAWNED_1)) - var/tab = "megafauna_kills" - if(crusher_kill) - tab = "megafauna_kills_crusher" - if(!elimination) //used so the achievment only occurs for the last legion to die. - grant_achievement(achievement_type, score_achievement_type, crusher_kill, force_grant) - SSblackbox.record_feedback("tally", tab, 1, "[initial(name)]") - return ..() - -/// Spawns crusher loot instead of normal loot -/mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot() - loot = crusher_loot - -/mob/living/simple_animal/hostile/megafauna/gib() - if(health > 0) - return - else - ..() - -/mob/living/simple_animal/hostile/megafauna/dust(just_ash, drop_items, force) - if(!force && health > 0) - return - else - ..() - -/mob/living/simple_animal/hostile/megafauna/AttackingTarget() - if(recovery_time >= world.time) - return - . = ..() - if(. && isliving(target)) - var/mob/living/L = target - if(L.stat != DEAD) - if(!client && ranged && ranged_cooldown <= world.time) - OpenFire() - - if(L.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(L, TRAIT_NODEATH)) //Nope, it still gibs yall - devour(L) - else - devour(L) - -/// Devours a target and restores health to the megafauna -/mob/living/simple_animal/hostile/megafauna/proc/devour(mob/living/L) - if(!L) - return FALSE - visible_message( - span_danger("[src] devours [L]!"), - span_userdanger("You feast on [L], restoring your health!")) - if(!is_station_level(z) || client) //NPC monsters won't heal while on station - adjustBruteLoss(-L.maxHealth/2) - L.gib() - return TRUE - -/mob/living/simple_animal/hostile/megafauna/ex_act(severity, target) - switch (severity) - if (EXPLODE_DEVASTATE) - adjustBruteLoss(250) - - if (EXPLODE_HEAVY) - adjustBruteLoss(100) - - if (EXPLODE_LIGHT) - adjustBruteLoss(50) - -/// Sets/adds the next time the megafauna can use a melee or ranged attack, in deciseconds. It is a list to allow using named args. Use the ignore_staggered var if youre setting the cooldown to ranged_cooldown_time. -/mob/living/simple_animal/hostile/megafauna/proc/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE) - if(!ignore_staggered && has_status_effect(/datum/status_effect/stagger)) - for(var/update in cooldown_updates) - cooldown_updates[update] *= 2 - if(cooldown_updates[COOLDOWN_UPDATE_SET_MELEE]) - recovery_time = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_MELEE] - if(cooldown_updates[COOLDOWN_UPDATE_ADD_MELEE]) - recovery_time += cooldown_updates[COOLDOWN_UPDATE_ADD_MELEE] - if(cooldown_updates[COOLDOWN_UPDATE_SET_RANGED]) - ranged_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_RANGED] - if(cooldown_updates[COOLDOWN_UPDATE_ADD_RANGED]) - ranged_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_RANGED] - -/// Grants medals and achievements to surrounding players -/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill, list/grant_achievement = list()) - if(!achievement_type || (flags_1 & ADMIN_SPAWNED_1) || !SSachievements.achievements_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)) - grant_achievement += L - for(var/mob/living/L in grant_achievement) - if(L.stat || !L.client) - continue - L?.mind.add_memory(MEMORY_MEGAFAUNA_KILL, list(DETAIL_PROTAGONIST = L, DETAIL_DEUTERAGONIST = src), STORY_VALUE_LEGENDARY, memory_flags = MEMORY_CHECK_BLIND_AND_DEAF) - L.client.give_award(/datum/award/achievement/boss/boss_killer, L) - L.client.give_award(achievement_type, L) - if(crusher_kill && istype(L.get_active_held_item(), /obj/item/kinetic_crusher)) - L.client.give_award(crusher_achievement_type, L) - L.client.give_award(/datum/award/score/boss_score, L) //Score progression for bosses killed in general - L.client.give_award(score_achievement_type, L) //Score progression for specific boss killed - return TRUE - -/datum/action/innate/megafauna_attack - name = "Megafauna Attack" - button_icon = 'icons/mob/actions/actions_animal.dmi' - button_icon_state = "" - var/chosen_message - var/chosen_attack_num = 0 - -/datum/action/innate/megafauna_attack/Grant(mob/living/L) - if(!ismegafauna(L)) - return FALSE - return ..() - -/datum/action/innate/megafauna_attack/Activate() - 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/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm deleted file mode 100644 index 1d8f918b8055..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ /dev/null @@ -1,199 +0,0 @@ -/* - -BLOOD-DRUNK MINER - -Effectively a highly aggressive miner, the blood-drunk miner has very few attacks but compensates by being highly aggressive. - -The blood-drunk miner's attacks are as follows -- If not in KA range, it will rapidly dash at its target -- If in KA range, it will fire its kinetic accelerator -- If in melee range, will rapidly attack, akin to an actual player -- After any of these attacks, may transform its cleaving saw: - Untransformed, it attacks very rapidly for smaller amounts of damage - Transformed, it attacks at normal speed for higher damage and cleaves enemies hit - -When the blood-drunk miner dies, it leaves behind the cleaving saw it was using and its kinetic accelerator. - -Difficulty: Medium - -*/ - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner - name = "blood-drunk miner" - desc = "A miner destined to wander forever, engaged in an endless hunt." - health = 900 - maxHealth = 900 - icon_state = "miner" - icon_living = "miner" - icon = 'icons/mob/broadMobs.dmi' - health_doll_icon = "miner" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - light_color = COLOR_LIGHT_GRAYISH_RED - movement_type = GROUND - speak_emote = list("roars") - speed = 3 - move_to_delay = 3 - ranged = TRUE - ranged_cooldown_time = 1.6 SECONDS - pixel_x = -16 - base_pixel_x = -16 - crusher_loot = list(/obj/item/melee/cleaving_saw, /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/crusher_trophy/miner_eye) - loot = list(/obj/item/melee/cleaving_saw, /obj/item/gun/energy/recharge/kinetic_accelerator) - wander = FALSE - del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL - gps_name = "Resonant Signal" - achievement_type = /datum/award/achievement/boss/blood_miner_kill - crusher_achievement_type = /datum/award/achievement/boss/blood_miner_crusher - score_achievement_type = /datum/award/score/blood_miner_score - var/obj/item/melee/cleaving_saw/miner/miner_saw - var/guidance = FALSE - deathmessage = "falls to the ground, decaying into glowing particles." - deathsound = SFX_BODYFALL - footstep_type = FOOTSTEP_MOB_HEAVY - move_force = MOVE_FORCE_NORMAL //Miner beeing able to just move structures like bolted doors and glass looks kinda strange - /// Dash ability - var/datum/action/cooldown/mob_cooldown/dash/dash - /// Kinetic accelerator ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator/kinetic_accelerator - /// Transform weapon ability - var/datum/action/cooldown/mob_cooldown/transform_weapon/transform_weapon - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Initialize(mapload) - . = ..() - miner_saw = new(src) - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - dash = new /datum/action/cooldown/mob_cooldown/dash() - kinetic_accelerator = new /datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator() - transform_weapon = new /datum/action/cooldown/mob_cooldown/transform_weapon() - dash.Grant(src) - kinetic_accelerator.Grant(src) - transform_weapon.Grant(src) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Destroy() - QDEL_NULL(dash) - QDEL_NULL(kinetic_accelerator) - QDEL_NULL(transform_weapon) - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/OpenFire() - if(client) - return - - Goto(target, move_to_delay, minimum_distance) - if(get_dist(src, target) > 4) - if(dash.Trigger(target = target)) - kinetic_accelerator.StartCooldown(0) - kinetic_accelerator.Trigger(target = target) - else - kinetic_accelerator.Trigger(target = target) - transform_weapon.Trigger(target = target) - -/obj/item/melee/cleaving_saw/miner //nerfed saw because it is very murdery - force = 6 - open_force = 10 - -/obj/item/melee/cleaving_saw/miner/attack(mob/living/target, mob/living/carbon/human/user) - target.add_stun_absorption("miner", 10, INFINITY) - . = ..() - target.stun_absorption -= "miner" - -/obj/projectile/kinetic/miner - damage = 20 - speed = 0.9 - icon_state = "ka_tracer" - range = 4 - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - var/adjustment_amount = amount * 0.1 - if(world.time + adjustment_amount > next_move) - changeNext_move(adjustment_amount) //attacking it interrupts it attacking, but only briefly - . = ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/death() - . = ..() - if(.) - new /obj/effect/temp_visual/dir_setting/miner_death(loc, dir) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/Move(atom/newloc) - if(newloc && newloc.z == z && (islava(newloc) || ischasm(newloc))) //we're not stupid! - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) - if(dash.Trigger(target = target)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/AttackingTarget() - if(QDELETED(target)) - return - face_atom(target) - if(isliving(target)) - var/mob/living/L = target - if(L.stat == DEAD) - visible_message(span_danger("[src] butchers [L]!"), - span_userdanger("You butcher [L], restoring your health!")) - if(!is_station_level(z) || client) //NPC monsters won't heal while on station - if(guidance) - adjustHealth(-L.maxHealth) - else - adjustHealth(-(L.maxHealth * 0.5)) - L.gib() - return TRUE - changeNext_move(CLICK_CD_MELEE) - miner_saw.melee_attack_chain(src, target) - if(guidance) - adjustHealth(-2) - return TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) - if(!used_item && !isturf(A)) - used_item = miner_saw - ..() - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/GiveTarget(new_target) - var/targets_the_same = (new_target == target) - . = ..() - if(. && target && !targets_the_same) - wander = TRUE - -/obj/effect/temp_visual/dir_setting/miner_death - icon_state = "miner_death" - duration = 15 - -/obj/effect/temp_visual/dir_setting/miner_death/Initialize(mapload, set_dir) - . = ..() - INVOKE_ASYNC(src, PROC_REF(fade_out)) - -/obj/effect/temp_visual/dir_setting/miner_death/proc/fade_out() - var/matrix/M = new - M.Turn(pick(90, 270)) - var/final_dir = dir - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - animate(src, transform = M, pixel_y = -6, dir = final_dir, time = 2, easing = EASE_IN|EASE_OUT) - sleep(5) - animate(src, color = list("#A7A19E", "#A7A19E", "#A7A19E", list(0, 0, 0)), time = 10, easing = EASE_IN, flags = ANIMATION_PARALLEL) - sleep(4) - animate(src, alpha = 0, time = 6, easing = EASE_OUT, flags = ANIMATION_PARALLEL) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance - guidance = TRUE - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/hunter/AttackingTarget() - . = ..() - if(. && prob(12)) - INVOKE_ASYNC(dash, TYPE_PROC_REF(/datum/action, Trigger), target) - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom - name = "hostile-environment miner" - desc = "A miner destined to hop across dimensions for all eternity, hunting anomalous creatures." - speed = 8 - move_to_delay = 8 - ranged_cooldown_time = 0.8 SECONDS - -/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/doom/Initialize(mapload) - . = ..() - dash.cooldown_time = 0.8 SECONDS diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm deleted file mode 100644 index 7d0393a21c3d..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ /dev/null @@ -1,392 +0,0 @@ -#define BUBBLEGUM_SMASH (health <= maxHealth*0.5) // angery -#define BUBBLEGUM_CAN_ENRAGE (enrage_till + (enrage_time * 2) <= world.time) -#define BUBBLEGUM_IS_ENRAGED (enrage_till > world.time) - -/* - -BUBBLEGUM - -Bubblegum spawns randomly wherever a lavaland creature is able to spawn. It is the most powerful slaughter demon in existence. -Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size. - -It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power - -It leaves blood trails behind wherever it goes, its clones do as well. -It tries to strike at its target through any bloodpools under them; if it fails to do that. -If it does warp it will enter an enraged state, becoming immune to all projectiles, becoming much faster, and dealing damage and knockback to anything that gets in the cloud around it. -It may summon clones charging from all sides, one of these charges being bubblegum himself. -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: -A. A bottle that, when activated, drives everyone nearby into a frenzy -B. A contract that marks for death the chosen target -C. A spellblade that can slice off limbs at range - -Difficulty: Hard - -*/ - -/mob/living/simple_animal/hostile/megafauna/bubblegum - name = "bubblegum" - desc = "In what passes for a hierarchy among slaughter demons, this one is king." - health = 2500 - maxHealth = 2500 - attack_verb_continuous = "rends" - attack_verb_simple = "rend" - attack_sound = 'sound/magic/demon_attack1.ogg' - icon_state = "bubblegum" - icon_living = "bubblegum" - icon_dead = "" - health_doll_icon = "bubblegum" - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - icon = 'icons/mob/lavaland/96x96megafauna.dmi' - speak_emote = list("gurgles") - armour_penetration = 40 - melee_damage_lower = 40 - melee_damage_upper = 40 - speed = 5 - move_to_delay = 5 - retreat_distance = 5 - minimum_distance = 5 - rapid_melee = 8 // every 1/4 second - melee_queue_distance = 20 // as far as possible really, need this because of blood warp - ranged = TRUE - pixel_x = -32 - base_pixel_x = -32 - maptext_height = 96 - maptext_width = 96 - del_on_death = TRUE - crusher_loot = list(/obj/structure/closet/crate/necropolis/bubblegum/crusher) - loot = list(/obj/structure/closet/crate/necropolis/bubblegum) - blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME - gps_name = "Bloody Signal" - achievement_type = /datum/award/achievement/boss/bubblegum_kill - crusher_achievement_type = /datum/award/achievement/boss/bubblegum_crusher - score_achievement_type = /datum/award/score/bubblegum_score - deathmessage = "sinks into a pool of blood, fleeing the battle. You've won, for now... " - deathsound = 'sound/magic/enter_blood.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/bubblegum - faction = list("mining", "boss", "hell") - /// Check to see if we should spawn blood - var/spawn_blood = TRUE - /// Actual time where enrage ends - var/enrage_till = 0 - /// Duration of enrage ability - var/enrage_time = 7 SECONDS - /// Triple charge ability - var/datum/action/cooldown/mob_cooldown/charge/triple_charge/triple_charge - /// Hallucination charge ability - var/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_charge - /// Hallucination charge surround ability - var/datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_surround/hallucination_charge_surround - /// Blood warp ability - var/datum/action/cooldown/mob_cooldown/blood_warp/blood_warp - -/mob/living/simple_animal/hostile/megafauna/bubblegum/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - triple_charge = new /datum/action/cooldown/mob_cooldown/charge/triple_charge() - hallucination_charge = new /datum/action/cooldown/mob_cooldown/charge/hallucination_charge() - hallucination_charge_surround = new /datum/action/cooldown/mob_cooldown/charge/hallucination_charge/hallucination_surround() - blood_warp = new /datum/action/cooldown/mob_cooldown/blood_warp() - triple_charge.Grant(src) - hallucination_charge.Grant(src) - hallucination_charge_surround.Grant(src) - blood_warp.Grant(src) - hallucination_charge.spawn_blood = TRUE - hallucination_charge_surround.spawn_blood = TRUE - RegisterSignal(src, COMSIG_BLOOD_WARP, PROC_REF(blood_enrage)) - RegisterSignal(src, COMSIG_FINISHED_CHARGE, PROC_REF(after_charge)) - if(spawn_blood) - AddElement(/datum/element/blood_walk, /obj/effect/decal/cleanable/blood/bubblegum, 'sound/effects/meteorimpact.ogg', 200) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/Destroy() - QDEL_NULL(triple_charge) - QDEL_NULL(hallucination_charge) - QDEL_NULL(hallucination_charge_surround) - QDEL_NULL(blood_warp) - return ..() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE) - . = ..() - if(cooldown_updates[COOLDOWN_UPDATE_SET_ENRAGE]) - enrage_till = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_ENRAGE] - if(cooldown_updates[COOLDOWN_UPDATE_ADD_ENRAGE]) - enrage_till += cooldown_updates[COOLDOWN_UPDATE_ADD_ENRAGE] - -/mob/living/simple_animal/hostile/megafauna/bubblegum/OpenFire() - if(client) - return - - if(!try_bloodattack() || prob(25 + anger_modifier)) - blood_warp.Trigger(target = target) - - if(!BUBBLEGUM_SMASH) - triple_charge.Trigger(target = target) - else if(prob(50 + anger_modifier)) - hallucination_charge.Trigger(target = target) - else - hallucination_charge_surround.Trigger(target = target) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood(mob/target) - var/list/targets = list(target) - . = list() - for(var/mob/living/L in targets) - var/list/bloodpool = get_bloodcrawlable_pools(get_turf(L), 0) - if(bloodpool.len && (!faction_check_mob(L) || L.stat == DEAD)) - . += L - -/** - * Attack by override for bubblegum - * - * This is used to award the frenching achievement for hitting bubblegum with a tongue - * - * Arguments: - * * obj/item/W the item hitting bubblegum - * * mob/user The user of the item - * * params, extra parameters - */ -/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, params) - . = ..() - if(istype(W, /obj/item/organ/tongue)) - user.client?.give_award(/datum/award/achievement/misc/frenching, user) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() - var/list/targets = get_mobs_on_blood() - if(targets.len) - INVOKE_ASYNC(src, PROC_REF(bloodattack), targets, prob(50)) - return TRUE - return FALSE - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets, handedness) - var/mob/living/target_one = pick_n_take(targets) - var/turf/target_one_turf = get_turf(target_one) - var/mob/living/target_two - if(targets.len) - target_two = pick_n_take(targets) - var/turf/target_two_turf = get_turf(target_two) - if(target_two.stat != CONSCIOUS || prob(10)) - bloodgrab(target_two_turf, handedness) - else - bloodsmack(target_two_turf, handedness) - - if(target_one) - var/list/pools = get_bloodcrawlable_pools(get_turf(target_one), 0) - if(pools.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, !handedness) - else - bloodsmack(target_one_turf, !handedness) - - if(!target_two && target_one) - var/list/poolstwo = get_bloodcrawlable_pools(get_turf(target_one), 0) - if(poolstwo.len) - target_one_turf = get_turf(target_one) - if(target_one_turf) - if(target_one.stat != CONSCIOUS || prob(10)) - bloodgrab(target_one_turf, handedness) - else - bloodsmack(target_one_turf, handedness) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightsmack(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftsmack(T) - SLEEP_CHECK_DEATH(4, src) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - to_chat(L, span_userdanger("[src] rends you!")) - playsound(T, attack_sound, 100, TRUE, -1) - var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - L.apply_damage(10, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, MELEE, null, null, armour_penetration)) - SLEEP_CHECK_DEATH(3, src) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T, handedness) - if(handedness) - new /obj/effect/temp_visual/bubblegum_hands/rightpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/rightthumb(T) - else - new /obj/effect/temp_visual/bubblegum_hands/leftpaw(T) - new /obj/effect/temp_visual/bubblegum_hands/leftthumb(T) - SLEEP_CHECK_DEATH(6, src) - for(var/mob/living/L in T) - if(!faction_check_mob(L)) - if(L.stat != CONSCIOUS) - to_chat(L, span_userdanger("[src] drags you through the blood!")) - playsound(T, 'sound/magic/enter_blood.ogg', 100, TRUE, -1) - var/turf/targetturf = get_step(src, dir) - L.forceMove(targetturf) - playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, TRUE, -1) - addtimer(CALLBACK(src, PROC_REF(devour), L), 2) - SLEEP_CHECK_DEATH(1, src) - - - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/be_aggressive() - if(BUBBLEGUM_IS_ENRAGED) - return TRUE - return isliving(target) && HAS_TRAIT(target, TRAIT_INCAPACITATED) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_retreat_distance() - return (be_aggressive() ? null : initial(retreat_distance)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_minimum_distance() - return (be_aggressive() ? 1 : initial(minimum_distance)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/update_approach() - retreat_distance = get_retreat_distance() - minimum_distance = get_minimum_distance() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage() - SIGNAL_HANDLER - if(!BUBBLEGUM_CAN_ENRAGE) - return FALSE - enrage_till = world.time + enrage_time - update_approach() - INVOKE_ASYNC(src, PROC_REF(change_move_delay), 3.75) - add_atom_colour(COLOR_BUBBLEGUM_RED, TEMPORARY_COLOUR_PRIORITY) - var/datum/callback/cb = CALLBACK(src, PROC_REF(blood_enrage_end)) - addtimer(cb, enrage_time) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/after_charge() - SIGNAL_HANDLER - try_bloodattack() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_enrage_end() - update_approach() - change_move_delay() - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, COLOR_BUBBLEGUM_RED) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/change_move_delay(newmove = initial(move_to_delay)) - move_to_delay = newmove - set_varspeed(move_to_delay) - handle_automated_action() // need to recheck movement otherwise move_to_delay won't update until the next checking aka will be wrong speed for a bit - -/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - . = ..() - anger_modifier = clamp(((maxHealth - health)/60),0,20) - enrage_time = initial(enrage_time) * clamp(anger_modifier / 20, 0.5, 1) - hallucination_charge.enraged = BUBBLEGUM_SMASH - if(. > 0 && prob(25)) - var/obj/effect/decal/cleanable/blood/gibs/bubblegum/B = new /obj/effect/decal/cleanable/blood/gibs/bubblegum(loc) - if(prob(40)) - step(B, pick(GLOB.cardinals)) - else - B.setDir(pick(GLOB.cardinals)) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/grant_achievement(medaltype,scoretype) - . = ..() - if(!(flags_1 & ADMIN_SPAWNED_1)) - SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_BUBBLEGUM] = TRUE - -/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget() - . = ..() - if(.) - recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority - -/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/P) - if(BUBBLEGUM_IS_ENRAGED) - visible_message(span_danger("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!"), span_userdanger("You deflect the projectile!")) - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, TRUE) - return BULLET_ACT_BLOCK - return ..() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/ex_act(severity, target) - if(severity <= EXPLODE_LIGHT) - return FALSE - - severity = EXPLODE_LIGHT // puny mortals - return ..() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/Move() - update_approach() - . = ..() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination - name = "bubblegum's hallucination" - desc = "Is that really just a hallucination?" - health = 1 - maxHealth = 1 - alpha = 127.5 - crusher_loot = null - loot = null - achievement_type = null - crusher_achievement_type = null - score_achievement_type = null - deathmessage = "Explodes into a pool of blood!" - deathsound = 'sound/effects/splat.ogg' - true_spawn = FALSE - var/move_through_mob - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Initialize() - . = ..() - toggle_ai(AI_OFF) - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Destroy() - if(spawn_blood) - new /obj/effect/decal/cleanable/blood(get_turf(src)) - . = ..() - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/Life(delta_time = SSMOBS_DT, times_fired) - return - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) - return - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/OpenFire() - return - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/AttackingTarget() - return - -/mob/living/simple_animal/hostile/megafauna/bubblegum/hallucination/try_bloodattack() - return - -/obj/effect/decal/cleanable/blood/bubblegum - bloodiness = 0 - -/obj/effect/decal/cleanable/blood/bubblegum/can_bloodcrawl_in() - return TRUE - -/obj/effect/decal/cleanable/blood/gibs/bubblegum - name = "thick blood" - desc = "Thick, splattered blood." - random_icon_states = list("gib3", "gib5", "gib6") - bloodiness = 20 - -/obj/effect/decal/cleanable/blood/gibs/bubblegum/can_bloodcrawl_in() - return TRUE - -/obj/effect/temp_visual/dragon_swoop/bubblegum - duration = 10 - -/obj/effect/temp_visual/bubblegum_hands - icon = 'icons/effects/bubblegum.dmi' - duration = 9 - -/obj/effect/temp_visual/bubblegum_hands/rightthumb - icon_state = "rightthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/leftthumb - icon_state = "leftthumbgrab" - -/obj/effect/temp_visual/bubblegum_hands/rightpaw - icon_state = "rightpawgrab" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - -/obj/effect/temp_visual/bubblegum_hands/leftpaw - icon_state = "leftpawgrab" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - -/obj/effect/temp_visual/bubblegum_hands/rightsmack - icon_state = "rightsmack" - -/obj/effect/temp_visual/bubblegum_hands/leftsmack - icon_state = "leftsmack" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/clockwork_knight.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/clockwork_knight.dm deleted file mode 100644 index 372e0281f670..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/clockwork_knight.dm +++ /dev/null @@ -1,56 +0,0 @@ -/* - -Difficulty: Very Easy -Was planned to be something more but due to the content freeze it unfortunately cannot be -I'd rather there be something than the clockwork ruin be entirely empty though so here is a basic mob - -*/ - -/mob/living/simple_animal/hostile/megafauna/clockwork_defender - name = "clockwork defender" - desc = "A traitorous clockwork knight who lived on, despite its creators destruction." - health = 300 - maxHealth = 300 - icon_state = "clockwork_defender" - icon_living = "clockwork_defender" - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - attack_verb_continuous = "slashes" - attack_verb_simple = "slash" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - speak_emote = list("roars") - armour_penetration = 40 - melee_damage_lower = 20 - melee_damage_upper = 20 - vision_range = 9 - aggro_vision_range = 9 - speed = 5 - move_to_delay = 5 - rapid_melee = 2 // every second - melee_queue_distance = 20 - ranged = TRUE - gps_name = "Clockwork Signal" - loot = list(/obj/item/clockwork_alloy) - crusher_loot = list(/obj/item/clockwork_alloy) - wander = FALSE - del_on_death = TRUE - deathmessage = "falls, quickly decaying into centuries old dust." - deathsound = SFX_BODYFALL - footstep_type = FOOTSTEP_MOB_HEAVY - attack_action_types = list() - -/mob/living/simple_animal/hostile/megafauna/clockwork_defender/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/megafauna/clockwork_defender/OpenFire() - return - -/obj/item/clockwork_alloy - name = "clockwork alloy" - desc = "The remains of the strongest clockwork knight." - icon = 'icons/obj/ice_moon/artifacts.dmi' - icon_state = "clockwork_alloy" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm deleted file mode 100644 index 8222f09c6930..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ /dev/null @@ -1,627 +0,0 @@ -#define COLOSSUS_ENRAGED (health < maxHealth/3) - -/** - * COLOSSUS - * - *The colossus spawns randomly wherever a lavaland creature is able to spawn. It is powerful, ancient, and extremely deadly. - *The colossus has a degree of sentience, proving this in speech during its attacks. - * - *It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. - * - *The colossus' true danger lies in its ranged capabilities. It fires immensely damaging death bolts that penetrate all armor in a variety of ways: - *A. The colossus fires death bolts in alternating patterns: the cardinal directions and the diagonal directions. - *B. The colossus fires death bolts in a shotgun-like pattern, instantly downing anything unfortunate enough to be hit by all of them. - *C. The colossus fires a spiral of death bolts. - *At 33% health, the colossus gains an additional attack: - *D. The colossus fires two spirals of death bolts, spinning in opposite directions. - * - *When a colossus dies, it leaves behind a chunk of glowing crystal known as a black box. Anything placed inside will carry over into future rounds. - *For instance, you could place a bag of holding into the black box, and then kill another colossus next round and retrieve the bag of holding from inside. - * - * Intended Difficulty: Very Hard - */ -/mob/living/simple_animal/hostile/megafauna/colossus - name = "colossus" - desc = "A monstrous creature protected by heavy shielding." - health = 2500 - maxHealth = 2500 - attack_verb_continuous = "judges" - attack_verb_simple = "judge" - attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' - icon_state = "eva" - icon_living = "eva" - icon_dead = "" - health_doll_icon = "eva" - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - icon = 'icons/mob/lavaland/96x96megafauna.dmi' - speak_emote = list("roars") - armour_penetration = 40 - melee_damage_lower = 40 - melee_damage_upper = 40 - speed = 10 - move_to_delay = 10 - ranged = TRUE - pixel_x = -32 - base_pixel_x = -32 - maptext_height = 96 - maptext_width = 96 - del_on_death = TRUE - gps_name = "Angelic Signal" - achievement_type = /datum/award/achievement/boss/colossus_kill - crusher_achievement_type = /datum/award/achievement/boss/colossus_crusher - score_achievement_type = /datum/award/score/colussus_score - crusher_loot = list(/obj/structure/closet/crate/necropolis/colossus/crusher) - loot = list(/obj/structure/closet/crate/necropolis/colossus) - deathmessage = "disintegrates, leaving a glowing core in its wake." - deathsound = 'sound/magic/demon_dies.ogg' - small_sprite_type = /datum/action/small_sprite/megafauna/colossus - /// Spiral shots ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/spiral_shots - /// Random shots ablity - var/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/random_shots - /// Shotgun blast ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/shotgun_blast - /// Directional shots ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/dir_shots - -/mob/living/simple_animal/hostile/megafauna/colossus/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) //we don't want this guy to float, messes up his animations. - spiral_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots() - random_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe() - shotgun_blast = new /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast() - dir_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating() - spiral_shots.Grant(src) - random_shots.Grant(src) - shotgun_blast.Grant(src) - dir_shots.Grant(src) - RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, PROC_REF(start_attack)) - RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(finished_attack)) - AddElement(/datum/element/projectile_shield) - -/mob/living/simple_animal/hostile/megafauna/colossus/Destroy() - RemoveElement(/datum/element/projectile_shield) - QDEL_NULL(spiral_shots) - QDEL_NULL(random_shots) - QDEL_NULL(shotgun_blast) - QDEL_NULL(dir_shots) - return ..() - -/mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() - anger_modifier = clamp(((maxHealth - health)/50),0,20) - - if(client) - return - - if(enrage(target)) - if(move_to_delay == initial(move_to_delay)) - visible_message(span_colossus("\"You can't dodge.\"")) - ranged_cooldown = world.time + 30 - telegraph() - dir_shots.fire_in_directions(src, target, GLOB.alldirs) - move_to_delay = 3 - return - else - move_to_delay = initial(move_to_delay) - - if(prob(20+anger_modifier)) //Major attack - spiral_shots.Trigger(target = target) - else if(prob(20)) - random_shots.Trigger(target = target) - else - if(prob(70)) - shotgun_blast.Trigger(target = target) - else - dir_shots.Trigger(target = target) - -/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph() - for(var/mob/M in range(10,src)) - if(M.client) - flash_color(M.client, "#C80000", 1) - shake_camera(M, 4, 3) - playsound(src, 'sound/magic/clockwork/narsie_attack.ogg', 200, TRUE) - -/mob/living/simple_animal/hostile/megafauna/colossus/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) - SIGNAL_HANDLER - if(activated == spiral_shots) - spiral_shots.enraged = COLOSSUS_ENRAGED - telegraph() - icon_state = "eva_attack" - visible_message(COLOSSUS_ENRAGED ? span_colossus("\"Die.\"") : span_colossus("\"Judgement.\"")) - -/mob/living/simple_animal/hostile/megafauna/colossus/proc/finished_attack(mob/living/owner, datum/action/cooldown/finished) - SIGNAL_HANDLER - if(finished == spiral_shots) - icon_state = initial(icon_state) - -/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.mind) - if(istype(H.mind.martial_art, /datum/martial_art/the_sleeping_carp)) - . = TRUE - if (is_species(H, /datum/species/golem/sand)) - . = TRUE - -/mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/L) - visible_message(span_colossus("[src] disintegrates [L]!")) - L.dust() - -/obj/effect/temp_visual/at_shield - name = "anti-toolbox field" - desc = "A shimmering forcefield protecting the colossus." - icon = 'icons/effects/effects.dmi' - icon_state = "at_shield2" - layer = FLY_LAYER - light_system = MOVABLE_LIGHT - light_outer_range = 2 - duration = 8 - var/target - -/obj/effect/temp_visual/at_shield/Initialize(mapload, new_target) - . = ..() - target = new_target - INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, orbit), target, 0, FALSE, 0, 0, FALSE, TRUE) - -/obj/projectile/colossus - name = "death bolt" - icon_state = "chronobolt" - damage = 25 - armour_penetration = 100 - speed = 2 - eyeblur = 0 - damage_type = BRUTE - pass_flags = PASSTABLE - plane = GAME_PLANE - var/explode_hit_objects = TRUE - -/obj/projectile/colossus/can_hit_target(atom/target, direct_target = FALSE, ignore_loc = FALSE, cross_failed = FALSE) - if(isliving(target)) - direct_target = TRUE - return ..(target, direct_target, ignore_loc, cross_failed) - -/obj/projectile/colossus/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isliving(target)) - var/mob/living/dust_mob = target - if(dust_mob.stat == DEAD) - dust_mob.dust() - return - if(!explode_hit_objects || istype(target, /obj/vehicle/sealed)) - return - if(isturf(target) || isobj(target)) - if(isobj(target)) - SSexplosions.med_mov_atom += target - else - SSexplosions.medturf += target - -///Anomolous Crystal/// - -#define ACTIVATE_TOUCH "touch" -#define ACTIVATE_SPEECH "speech" -#define ACTIVATE_HEAT "heat" -#define ACTIVATE_BULLET "bullet" -#define ACTIVATE_ENERGY "energy" -#define ACTIVATE_BOMB "bomb" -#define ACTIVATE_MOB_BUMP "bumping" -#define ACTIVATE_WEAPON "weapon" -#define ACTIVATE_MAGIC "magic" - -/obj/machinery/anomalous_crystal - name = "anomalous crystal" - desc = "A strange chunk of crystal, being in the presence of it fills you with equal parts excitement and dread." - var/observer_desc = "Anomalous crystals have descriptions that only observers can see. But this one hasn't been changed from the default." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "anomaly_crystal" - light_outer_range = 8 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF - use_power = NO_POWER_USE - anchored = FALSE - density = TRUE - 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) - var/activation_damage_type = null - /// Cooldown on this crystal - var/cooldown_add = 3 SECONDS - /// Time needed to use this crystal - var/use_time = 0 - /// If we are being used - var/active = FALSE - var/list/affected_targets = list() - var/activation_sound = 'sound/effects/break_stone.ogg' - COOLDOWN_DECLARE(cooldown_timer) - -/obj/machinery/anomalous_crystal/Initialize(mapload) - . = ..() - if(!activation_method) - activation_method = pick(possible_methods) - become_hearing_sensitive(trait_source = ROUNDSTART_TRAIT) - -/obj/machinery/anomalous_crystal/examine(mob/user) - . = ..() - if(isobserver(user)) - . += observer_desc - . += "It is activated by [activation_method]." - -/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), atom/sound_loc) - ..() - if(isliving(speaker)) - ActivationReaction(speaker, ACTIVATE_SPEECH) - -/obj/machinery/anomalous_crystal/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - ActivationReaction(user, ACTIVATE_TOUCH) - -/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, params) - if(I.get_temperature()) - ActivationReaction(user, ACTIVATE_HEAT) - else - ActivationReaction(user, ACTIVATE_WEAPON) - ..() - -/obj/machinery/anomalous_crystal/bullet_act(obj/projectile/P, def_zone) - . = ..() - if(istype(P, /obj/projectile/magic)) - ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type) - return - ActivationReaction(P.firer, P.armor_flag, P.damage_type) - -/obj/machinery/anomalous_crystal/proc/ActivationReaction(mob/user, method, damtype) - if(!COOLDOWN_FINISHED(src, cooldown_timer)) - return FALSE - if(activation_damage_type && activation_damage_type != damtype) - return FALSE - if(method != activation_method) - return FALSE - if(active) - return FALSE - if(use_time) - charge_animation() - COOLDOWN_START(src, cooldown_timer, cooldown_add) - playsound(user, activation_sound, 100, TRUE) - return TRUE - -/obj/machinery/anomalous_crystal/proc/charge_animation() - icon_state = "anomaly_crystal_charging" - active = TRUE - set_anchored(TRUE) - balloon_alert_to_viewers("charging...") - playsound(src, 'sound/magic/disable_tech.ogg', 50, TRUE) - sleep(use_time) - icon_state = initial(icon_state) - active = FALSE - set_anchored(FALSE) - return TRUE - -/obj/machinery/anomalous_crystal/Bumped(atom/movable/AM) - ..() - if(ismob(AM)) - ActivationReaction(AM, ACTIVATE_MOB_BUMP) - -/obj/machinery/anomalous_crystal/ex_act() - ActivationReaction(null, ACTIVATE_BOMB) - -/obj/machinery/anomalous_crystal/honk //Strips and equips you as a clown. I apologize for nothing - observer_desc = "This crystal strips and equips its targets as clowns." - possible_methods = list(ACTIVATE_MOB_BUMP, ACTIVATE_SPEECH) - activation_sound = 'sound/items/bikehorn.ogg' - use_time = 3 SECONDS - -/obj/machinery/anomalous_crystal/honk/ActivationReaction(mob/user) - if(..() && ishuman(user) && !(user in affected_targets) && (user in viewers(src))) - var/mob/living/carbon/human/new_clown = user - for(var/obj/item/to_strip in new_clown) - new_clown.dropItemToGround(to_strip) - new_clown.dress_up_as_job(SSjob.GetJobType(/datum/job/clown)) - affected_targets.Add(new_clown) - -/obj/machinery/anomalous_crystal/theme_warp //Warps the area you're in to look like a new one - observer_desc = "This crystal warps the area around it to a theme." - activation_method = ACTIVATE_TOUCH - cooldown_add = 20 SECONDS - use_time = 5 SECONDS - var/terrain_theme = "winter" - var/NewTerrainFloors - var/NewTerrainWalls - var/NewTerrainChairs - var/NewTerrainTables - var/list/NewFlora = list() - var/florachance = 8 - -/obj/machinery/anomalous_crystal/theme_warp/Initialize(mapload) - . = ..() - terrain_theme = pick("lavaland","winter","jungle","ayy lmao") - observer_desc = "This crystal changes the area around it to match the theme of \"[terrain_theme]\"." - - switch(terrain_theme) - if("lavaland")//Depressurizes the place... and free cult metal, I guess. - NewTerrainFloors = /turf/open/floor/fakebasalt - NewTerrainWalls = /turf/closed/wall/mineral/cult - NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub) - florachance = 1 - if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway. - NewTerrainFloors = /turf/open/misc/snow/actually_safe - NewTerrainWalls = /turf/closed/wall/mineral/wood - NewTerrainChairs = /obj/structure/chair/wood - NewTerrainTables = /obj/structure/table/glass - NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both) - if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows. - NewTerrainFloors = /turf/open/floor/grass - NewTerrainWalls = /turf/closed/wall/mineral/wood - NewTerrainChairs = /obj/structure/chair/wood - NewTerrainTables = /obj/structure/table/wood - NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush, - /obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/species/monkey) - florachance = 20 - if("ayy lmao") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos. - NewTerrainFloors = /turf/open/floor/plating/abductor - NewTerrainWalls = /turf/closed/wall/mineral/abductor - NewTerrainChairs = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline. - NewTerrainTables = /obj/structure/table/abductor - -/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method) - if(..()) - var/area/A = get_area(src) - if(!A.outdoors && !(A in affected_targets)) - for(var/atom/Stuff in A) - if(isturf(Stuff)) - var/turf/T = Stuff - if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors) - var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_IGNORE_AIR) - if(prob(florachance) && NewFlora.len && !O.is_blocked_turf(TRUE)) - var/atom/Picked = pick(NewFlora) - new Picked(O) - continue - if(iswallturf(T) && NewTerrainWalls) - T.ChangeTurf(NewTerrainWalls) - continue - if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs) - var/obj/structure/chair/Original = Stuff - var/obj/structure/chair/C = new NewTerrainChairs(Original.loc) - C.setDir(Original.dir) - qdel(Stuff) - continue - if(istype(Stuff, /obj/structure/table) && NewTerrainTables) - new NewTerrainTables(Stuff.loc) - continue - affected_targets += A - -/obj/machinery/anomalous_crystal/emitter //Generates a projectile when interacted with - observer_desc = "This crystal generates a projectile when activated." - activation_method = ACTIVATE_TOUCH - cooldown_add = 5 SECONDS - var/obj/projectile/generated_projectile = /obj/projectile/colossus - -/obj/machinery/anomalous_crystal/emitter/Initialize(mapload) - . = ..() - observer_desc = "This crystal generates \a [initial(generated_projectile.name)] when activated." - -/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method) - if(..()) - var/obj/projectile/P = new generated_projectile(get_turf(src)) - P.firer = src - P.fire(dir2angle(dir)) - -/obj/machinery/anomalous_crystal/dark_reprise //Revives anyone nearby, but turns them into shadowpeople and renders them uncloneable, so the crystal is your only hope of getting up again if you go down. - observer_desc = "When activated, this crystal revives anyone nearby, but turns them into Shadowpeople and makes them unclonable, making the crystal their only hope of getting up again." - activation_method = ACTIVATE_TOUCH - activation_sound = 'sound/hallucinations/growl1.ogg' - use_time = 3 SECONDS - -/obj/machinery/anomalous_crystal/dark_reprise/ActivationReaction(mob/user, method) - if(..()) - for(var/i in range(1, src)) - if(isturf(i)) - new /obj/effect/temp_visual/cult/sparks(i) - continue - if(ishuman(i)) - var/mob/living/carbon/human/H = i - if(H.stat == DEAD) - H.set_species(/datum/species/shadow, 1) - H.regenerate_limbs() - H.regenerate_organs() - H.revive(full_heal = TRUE, admin_revive = FALSE) - ADD_TRAIT(H, TRAIT_BADDNA, MAGIC_TRAIT) //Free revives, but significantly limits your options for reviving except via the crystal - H.grab_ghost(force = TRUE) - -/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans - observer_desc = "This crystal allows ghosts to turn into a fragile creature that can heal people." - activation_method = ACTIVATE_TOUCH - activation_sound = 'sound/effects/ghost2.ogg' - use_time = 5 SECONDS - var/ready_to_deploy = FALSE - -/obj/machinery/anomalous_crystal/helpers/ActivationReaction(mob/user, method) - if(..() && !ready_to_deploy) - SSpoints_of_interest.make_point_of_interest(src) - ready_to_deploy = TRUE - notify_ghosts("An anomalous crystal has been activated in [get_area(src)]! This crystal can always be used by ghosts hereafter.", enter_link = "(Click to enter)", ghost_sound = 'sound/effects/ghost2.ogg', source = src, action = NOTIFY_ATTACK, header = "Anomalous crystal activated") - -/obj/machinery/anomalous_crystal/helpers/attack_ghost(mob/dead/observer/user) - . = ..() - if(.) - return - if(ready_to_deploy) - var/be_helper = tgui_alert(usr,"Become a Lightgeist? (Warning, You can no longer be revived!)",,list("Yes","No")) - if(be_helper == "Yes" && !QDELETED(src) && isobserver(user)) - var/mob/living/simple_animal/hostile/lightgeist/W = new /mob/living/simple_animal/hostile/lightgeist(get_turf(loc)) - W.key = user.key - - -/obj/machinery/anomalous_crystal/helpers/Topic(href, href_list) - if(href_list["ghostjoin"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - attack_ghost(ghost) - -/mob/living/simple_animal/hostile/lightgeist - name = "lightgeist" - desc = "This small floating creature is a completely unknown form of life... being near it fills you with a sense of tranquility." - icon_state = "lightgeist" - icon_living = "lightgeist" - icon_dead = "butterfly_dead" - turns_per_move = 1 - response_help_continuous = "waves away" - response_help_simple = "wave away" - response_disarm_continuous = "brushes aside" - response_disarm_simple = "brush aside" - response_harm_continuous = "disrupts" - response_harm_simple = "disrupt" - speak_emote = list("oscillates") - maxHealth = 2 - health = 2 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - friendly_verb_continuous = "taps" - friendly_verb_simple = "tap" - density = FALSE - pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - mob_size = MOB_SIZE_TINY - gold_core_spawnable = HOSTILE_SPAWN - verb_say = "warps" - verb_ask = "floats inquisitively" - verb_exclaim = "zaps" - verb_yell = "bangs" - initial_language_holder = /datum/language_holder/lightbringer - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - light_outer_range = 4 - faction = list("neutral") - del_on_death = TRUE - unsuitable_atmos_damage = 0 - minbodytemp = 0 - maxbodytemp = 1500 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - AIStatus = AI_OFF - stop_automated_movement = TRUE - -/mob/living/simple_animal/hostile/lightgeist/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - remove_verb(src, /mob/living/verb/pulled) - remove_verb(src, /mob/verb/me_verb) - var/datum/atom_hud/medsensor = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - medsensor.add_hud_to(src) - - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/lightgeist/AttackingTarget() - if(isliving(target) && target != src) - var/mob/living/L = target - if(L.stat != DEAD) - L.heal_overall_damage(melee_damage_upper, melee_damage_upper) - new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF") - visible_message(span_notice("[src] mends the wounds of [target]."),span_notice("You mend the wounds of [target].")) - -/mob/living/simple_animal/hostile/lightgeist/ghost() - . = ..() - if(.) - death() - -/obj/machinery/anomalous_crystal/possessor //Allows you to bodyjack small animals, then exit them at your leisure, but you can only do this once per activation. Because they blow up. Also, if the bodyjacked animal dies, SO DO YOU. - observer_desc = "When activated, this crystal allows you to take over small animals, and then exit them at the possessors leisure. Exiting the animal kills it, and if you die while possessing the animal, you die as well." - activation_method = ACTIVATE_TOUCH - use_time = 1 SECONDS - -/obj/machinery/anomalous_crystal/possessor/ActivationReaction(mob/user, method) - if(..()) - if(ishuman(user)) - var/mobcheck = FALSE - for(var/mob/living/simple_animal/A in range(1, src)) - if(A.melee_damage_upper > 5 || A.mob_size >= MOB_SIZE_LARGE || A.ckey || A.stat) - break - var/obj/structure/closet/stasis/S = new /obj/structure/closet/stasis(A) - user.forceMove(S) - mobcheck = TRUE - break - if(!mobcheck) - new /mob/living/basic/cockroach(get_step(src,dir)) //Just in case there aren't any animals on the station, this will leave you with a terrible option to possess if you feel like it //i found it funny that in the file for a giant angel beast theres a cockroach - -/obj/structure/closet/stasis - name = "quantum entanglement stasis warp field" - desc = "You can hardly comprehend this thing... which is why you can't see it." - icon_state = null //This shouldn't even be visible, so if it DOES show up, at least nobody will notice - enable_door_overlay = FALSE //For obvious reasons - density = TRUE - anchored = TRUE - resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE - var/mob/living/simple_animal/holder_animal - -/obj/structure/closet/stasis/process() - if(holder_animal) - if(holder_animal.stat == DEAD) - dump_contents() - holder_animal.gib() - return - -/obj/structure/closet/stasis/Initialize(mapload) - . = ..() - if(isanimal(loc)) - holder_animal = loc - START_PROCESSING(SSobj, src) - -/obj/structure/closet/stasis/Entered(atom/movable/arrived, atom/old_loc, list/atom/old_locs) - if(isliving(arrived) && holder_animal) - var/mob/living/L = arrived - L.notransform = 1 - ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) - L.status_flags |= GODMODE - L.mind.transfer_to(holder_animal) - var/datum/action/exit_possession/escape = new(holder_animal) - escape.Grant(holder_animal) - remove_verb(holder_animal, /mob/living/verb/pulled) - -/obj/structure/closet/stasis/dump_contents(kill = 1) - STOP_PROCESSING(SSobj, src) - for(var/mob/living/L in src) - REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE) - L.status_flags &= ~GODMODE - L.notransform = 0 - if(holder_animal) - holder_animal.mind.transfer_to(L) - holder_animal.gib() - if(kill || !isanimal(loc)) - L.death(0) - ..() - -/obj/structure/closet/stasis/emp_act() - return - -/obj/structure/closet/stasis/ex_act() - return - -/datum/action/exit_possession - name = "Exit Possession" - desc = "Exits the body you are possessing. They will explode violently when this occurs." - button_icon = 'icons/mob/actions/actions_spells.dmi' - button_icon_state = "exit_possession" - -/datum/action/exit_possession/IsAvailable(feedback = FALSE) - return ..() && isfloorturf(owner.loc) - -/datum/action/exit_possession/Trigger(trigger_flags) - . = ..() - if(!.) - return FALSE - - var/obj/structure/closet/stasis/stasis = locate() in owner - if(!stasis) - CRASH("[type] did not find a stasis closet thing in the owner.") - - stasis.dump_contents(FALSE) - qdel(stasis) - qdel(src) - -#undef ACTIVATE_TOUCH -#undef ACTIVATE_SPEECH -#undef ACTIVATE_HEAT -#undef ACTIVATE_BULLET -#undef ACTIVATE_ENERGY -#undef ACTIVATE_BOMB -#undef ACTIVATE_MOB_BUMP -#undef ACTIVATE_WEAPON -#undef ACTIVATE_MAGIC diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm deleted file mode 100644 index 5c8a5fc6f58a..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ /dev/null @@ -1,394 +0,0 @@ -#define FROST_MINER_SHOULD_ENRAGE (health <= maxHealth*0.25 && !enraged) -GLOBAL_LIST_EMPTY(frost_miner_prisms) - -/* - -Difficulty: Extremely Hard - -*/ - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner - name = "demonic-frost miner" - desc = "An extremely well-geared miner, driven crazy or possessed by the demonic forces here, either way a terrifying enemy." - health = 1500 - maxHealth = 1500 - icon_state = "demonic_miner" - icon_living = "demonic_miner" - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - attack_verb_continuous = "pummels" - attack_verb_simple = "pummels" - attack_sound = 'sound/weapons/sonic_jackhammer.ogg' - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - light_color = COLOR_LIGHT_GRAYISH_RED - movement_type = GROUND - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - speak_emote = list("roars") - armour_penetration = 100 - melee_damage_lower = 10 - melee_damage_upper = 10 - vision_range = 18 // large vision range so combat doesn't abruptly end when someone runs a bit away - rapid_melee = 4 - speed = 20 - move_to_delay = 20 - gps_name = "Bloodchilling Signal" - ranged = TRUE - crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman, /obj/item/ice_energy_crystal) - loot = list(/obj/effect/decal/remains/plasma, /obj/item/ice_energy_crystal) - wander = FALSE - del_on_death = TRUE - blood_volume = BLOOD_VOLUME_NORMAL - achievement_type = /datum/award/achievement/boss/demonic_miner_kill - crusher_achievement_type = /datum/award/achievement/boss/demonic_miner_crusher - score_achievement_type = /datum/award/score/demonic_miner_score - deathmessage = "falls to the ground, decaying into plasma particles." - deathsound = SFX_BODYFALL - footstep_type = FOOTSTEP_MOB_HEAVY - /// If the demonic frost miner is in its enraged state - var/enraged = FALSE - /// If the demonic frost miner is currently transforming to its enraged state - var/enraging = FALSE - /// Frost orbs ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/shrapnel/frost_orbs - /// Snowball Machine gun Ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/snowball_machine_gun - /// Ice Shotgun Ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/pattern/ice_shotgun - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Initialize(mapload) - . = ..() - frost_orbs = new /datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire/shrapnel() - snowball_machine_gun = new /datum/action/cooldown/mob_cooldown/projectile_attack/rapid_fire() - ice_shotgun = new /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/pattern() - frost_orbs.Grant(src) - snowball_machine_gun.Grant(src) - ice_shotgun.Grant(src) - for(var/obj/structure/frost_miner_prism/prism_to_set in GLOB.frost_miner_prisms) - prism_to_set.set_prism_light(LIGHT_COLOR_BLUE, 5) - RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, PROC_REF(start_attack)) - AddElement(/datum/element/knockback, 7, FALSE, TRUE) - AddElement(/datum/element/lifesteal, 50) - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Destroy() - QDEL_NULL(frost_orbs) - QDEL_NULL(snowball_machine_gun) - QDEL_NULL(ice_shotgun) - return ..() - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/OpenFire() - if(client) - return - - var/easy_attack = prob(80 - enraged * 40) - chosen_attack = rand(1, 3) - switch(chosen_attack) - if(1) - if(easy_attack) - frost_orbs.shot_count = 8 - frost_orbs.shot_delay = 10 - frost_orbs.Trigger(target = target) - else - frost_orbs.shot_count = 16 - frost_orbs.shot_delay = 5 - frost_orbs.Trigger(target = target) - if(2) - if(easy_attack) - snowball_machine_gun.shot_count = 60 - snowball_machine_gun.default_projectile_spread = 45 - snowball_machine_gun.Trigger(target = target) - else if(ice_shotgun.IsAvailable()) - ice_shotgun.shot_angles = list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160)) - INVOKE_ASYNC(ice_shotgun, TYPE_PROC_REF(/datum/action, Trigger), target) - snowball_machine_gun.shot_count = 5 * 8 - snowball_machine_gun.default_projectile_spread = 5 - snowball_machine_gun.StartCooldown(0) - snowball_machine_gun.Trigger(target = target) - if(3) - if(easy_attack) - // static lists? remind me later - ice_shotgun.shot_angles = list(list(-40, -20, 0, 20, 40), list(-30, -10, 10, 30)) - ice_shotgun.Trigger(target = target) - else - ice_shotgun.shot_angles = list(list(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330), list(-30, -15, 0, 15, 30)) - ice_shotgun.Trigger(target = target) - -/// Pre-ability usage stuff -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) - SIGNAL_HANDLER - if(enraging) - return COMPONENT_BLOCK_ABILITY_START - if(FROST_MINER_SHOULD_ENRAGE) - INVOKE_ASYNC(src, PROC_REF(check_enraged)) - return COMPONENT_BLOCK_ABILITY_START - var/projectile_speed_multiplier = 1 - enraged * 0.5 - frost_orbs.projectile_speed_multiplier = projectile_speed_multiplier - snowball_machine_gun.projectile_speed_multiplier = projectile_speed_multiplier - ice_shotgun.projectile_speed_multiplier = projectile_speed_multiplier - -/// Checks if the demonic frost miner is ready to be enraged -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/check_enraged() - if(!FROST_MINER_SHOULD_ENRAGE) - return - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 8 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 8 SECONDS)) - frost_orbs.StartCooldown(8 SECONDS) - adjustHealth(-maxHealth) - enraged = TRUE - enraging = TRUE - animate(src, pixel_y = pixel_y + 96, time = 100, easing = ELASTIC_EASING) - spin(100, 10) - SLEEP_CHECK_DEATH(60, src) - playsound(src, 'sound/effects/explosion3.ogg', 100, TRUE) - icon_state = "demonic_miner_phase2" - animate(src, pixel_y = pixel_y - 96, time = 8, flags = ANIMATION_END_NOW) - spin(8, 2) - for(var/obj/structure/frost_miner_prism/prism_to_set in GLOB.frost_miner_prisms) - prism_to_set.set_prism_light(LIGHT_COLOR_PURPLE, 5) - SLEEP_CHECK_DEATH(8, src) - for(var/mob/living/L in viewers(src)) - shake_camera(L, 3, 2) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) - ADD_TRAIT(src, TRAIT_MOVE_FLYING, FROSTMINER_ENRAGE_TRAIT) - enraging = FALSE - adjustHealth(-maxHealth) - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/ex_act(severity, target) - adjustBruteLoss(-30 * severity) - visible_message(span_danger("[src] absorbs the explosion!"), span_userdanger("You absorb the explosion!")) - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Goto(target, delay, minimum_distance) - if(enraging) - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/MoveToTarget(list/possible_targets) - if(enraging) - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/Move() - if(enraging) - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/death(gibbed, list/force_grant) - if(health > 0) - return - var/turf/T = get_turf(src) - var/loot = rand(1, 3) - for(var/obj/structure/frost_miner_prism/prism_to_set in GLOB.frost_miner_prisms) - prism_to_set.set_prism_light(COLOR_GRAY, 1) - switch(loot) - if(1) - new /obj/item/resurrection_crystal(T) - if(2) - new /obj/item/clothing/shoes/winterboots/ice_boots/ice_trail(T) - if(3) - new /obj/item/pickaxe/drill/jackhammer/demonic(T) - return ..() - -/obj/projectile/colossus/frost_orb - name = "frost orb" - icon_state = "ice_1" - damage = 20 - armour_penetration = 100 - speed = 10 - homing_turn_speed = 30 - damage_type = BURN - -/obj/projectile/colossus/frost_orb/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isturf(target) || isobj(target)) - EX_ACT(target, EXPLODE_HEAVY) - -/obj/projectile/colossus/snowball - name = "machine-gun snowball" - icon_state = "nuclear_particle" - damage = 5 - armour_penetration = 100 - speed = 3 - damage_type = BRUTE - explode_hit_objects = FALSE - -/obj/projectile/colossus/ice_blast - name = "ice blast" - icon_state = "ice_2" - damage = 15 - armour_penetration = 100 - speed = 3 - damage_type = BRUTE - -/obj/projectile/colossus/ice_blast/on_hit(atom/target, blocked = FALSE) - . = ..() - if(isturf(target) || isobj(target)) - EX_ACT(target, EXPLODE_HEAVY) - -/obj/item/resurrection_crystal - name = "resurrection crystal" - desc = "When used by anything holding it, this crystal gives them a second chance at life if they die." - icon = 'icons/obj/objects.dmi' - icon_state = "demonic_crystal" - -/obj/item/resurrection_crystal/attack_self(mob/living/user) - if(!iscarbon(user)) - to_chat(user, span_notice("A dark presence stops you from absorbing the crystal.")) - return - forceMove(user) - to_chat(user, span_notice("You feel a bit safer... but a demonic presence lurks in the back of your head...")) - RegisterSignal(user, COMSIG_LIVING_DEATH, PROC_REF(resurrect)) - -/// Resurrects the target when they die by moving them and dusting a clone in their place, one life for another -/obj/item/resurrection_crystal/proc/resurrect(mob/living/carbon/user, gibbed) - SIGNAL_HANDLER - if(gibbed) - to_chat(user, span_notice("This power cannot be used if your entire mortal body is disintegrated...")) - return - user.visible_message(span_notice("You see [user]'s soul dragged out of their body!"), span_notice("You feel your soul dragged away to a fresh body!")) - var/typepath = user.type - var/mob/living/carbon/clone = new typepath(user.loc) - clone.real_name = user.real_name - INVOKE_ASYNC(user.dna, TYPE_PROC_REF(/datum/dna, transfer_identity), clone) - clone.updateappearance(mutcolor_update=1) - var/turf/T = find_safe_turf() - user.forceMove(T) - user.revive(full_heal = TRUE, admin_revive = TRUE) - INVOKE_ASYNC(user, TYPE_PROC_REF(/mob/living/carbon, set_species), /datum/species/shadow) - to_chat(user, span_notice("You blink and find yourself in [get_area_name(T)]... feeling a bit darker.")) - clone.dust() - qdel(src) - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail - name = "cursed ice hiking boots" - desc = "A pair of winter boots contractually made by a devil, they cannot be taken off once put on." - actions_types = list(/datum/action/item_action/toggle) - var/on = FALSE - var/change_turf = /turf/open/misc/ice/icemoon/no_planet_atmos - var/duration = 6 SECONDS - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/Initialize(mapload) - . = ..() - RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, PROC_REF(on_step)) - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/equipped(mob/user, slot) - . = ..() - if(slot == ITEM_SLOT_FEET) - ADD_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT(type)) - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/dropped(mob/user) - . = ..() - // Could have been blown off in an explosion from the previous owner - REMOVE_TRAIT(src, TRAIT_NODROP, CURSED_ITEM_TRAIT(type)) - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/ui_action_click(mob/user) - on = !on - to_chat(user, span_notice("You [on ? "activate" : "deactivate"] [src].")) - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/examine(mob/user) - . = ..() - . += span_notice("The shoes are [on ? "enabled" : "disabled"].") - -/obj/item/clothing/shoes/winterboots/ice_boots/ice_trail/proc/on_step() - SIGNAL_HANDLER - - var/turf/T = get_turf(loc) - if(!on || istype(T, /turf/closed) || istype(T, change_turf)) - return - var/reset_turf = T.type - T.ChangeTurf(change_turf, flags = CHANGETURF_INHERIT_AIR) - addtimer(CALLBACK(T, TYPE_PROC_REF(/turf, ChangeTurf), reset_turf, null, CHANGETURF_INHERIT_AIR), duration, TIMER_OVERRIDE|TIMER_UNIQUE) - -/obj/item/pickaxe/drill/jackhammer/demonic - name = "demonic jackhammer" - desc = "Cracks rocks at an inhuman speed, as well as being enhanced for combat purposes." - toolspeed = 0 - -/obj/item/pickaxe/drill/jackhammer/demonic/Initialize(mapload) - . = ..() - AddElement(/datum/element/knockback, 4, TRUE, FALSE) - AddElement(/datum/element/lifesteal, 5) - -/obj/item/pickaxe/drill/jackhammer/demonic/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks) - var/turf/T = get_turf(target) - mineral_scan_pulse(T, world.view + 1) - . = ..() - -/obj/item/crusher_trophy/ice_block_talisman - name = "ice block talisman" - desc = "A glowing trinket that a demonic miner had on him, it seems he couldn't utilize it for whatever reason." - icon_state = "ice_trap_talisman" - denied_type = /obj/item/crusher_trophy/ice_block_talisman - -/obj/item/crusher_trophy/ice_block_talisman/effect_desc() - return "mark detonation to freeze a creature in a block of ice for a period, preventing them from moving" - -/obj/item/crusher_trophy/ice_block_talisman/on_mark_detonation(mob/living/target, mob/living/user) - target.apply_status_effect(/datum/status_effect/ice_block_talisman) - -/datum/status_effect/ice_block_talisman - id = "ice_block_talisman" - duration = 4 SECONDS - status_type = STATUS_EFFECT_REPLACE - alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman - /// Stored icon overlay for the hit mob, removed when effect is removed - var/icon/cube - -/datum/status_effect/ice_block_talisman/on_creation(mob/living/new_owner, set_duration) - if(isnum(set_duration)) - duration = set_duration - return ..() - -/atom/movable/screen/alert/status_effect/ice_block_talisman - name = "Frozen Solid" - desc = "You're frozen inside an ice cube, and cannot move!" - icon_state = "frozen" - -/datum/status_effect/ice_block_talisman/on_apply() - RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(owner_moved)) - if(!owner.stat) - to_chat(owner, span_userdanger("You become frozen in a cube!")) - cube = icon('icons/effects/freeze.dmi', "ice_cube") - var/icon/size_check = icon(owner.icon, owner.icon_state) - cube.Scale(size_check.Width(), size_check.Height()) - owner.add_overlay(cube) - return ..() - -/// Blocks movement from the status effect owner -/datum/status_effect/ice_block_talisman/proc/owner_moved() - SIGNAL_HANDLER - return COMPONENT_MOVABLE_BLOCK_PRE_MOVE - -/datum/status_effect/ice_block_talisman/on_remove() - if(!owner.stat) - to_chat(owner, span_notice("The cube melts!")) - owner.cut_overlay(cube) - UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE) - -/obj/item/ice_energy_crystal - name = "ice energy crystal" - desc = "Remnants of the demonic frost miners ice energy." - icon = 'icons/obj/ice_moon/artifacts.dmi' - icon_state = "ice_crystal" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - -/obj/structure/frost_miner_prism - name = "frost miner light prism" - desc = "A magical crystal enhanced by a demonic presence." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "lightprism" - density = FALSE - anchored = TRUE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF - -/obj/structure/frost_miner_prism/Initialize(mapload) - . = ..() - GLOB.frost_miner_prisms |= src - set_prism_light(LIGHT_COLOR_BLUE, 5) - -/obj/structure/frost_miner_prism/Destroy() - GLOB.frost_miner_prisms -= src - return ..() - -/obj/structure/frost_miner_prism/proc/set_prism_light(new_color, new_range) - color = new_color - set_light_color(new_color) - set_light(new_range) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm deleted file mode 100644 index 81f6d1773c72..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ /dev/null @@ -1,378 +0,0 @@ -///used whenever the drake generates a hotspot -#define DRAKE_FIRE_TEMP 500 -///used whenever the drake generates a hotspot -#define DRAKE_FIRE_EXPOSURE 50 -///used to see if the drake is enraged or not -#define DRAKE_ENRAGED (health < maxHealth*0.5) - -#define SWOOP_DAMAGEABLE 1 -#define SWOOP_INVULNERABLE 2 - -/*£ - * - *ASH DRAKE - * - *Ash drakes spawn randomly wherever a lavaland creature is able to spawn. They are the draconic guardians of the Necropolis. - * - *It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. - * - *Whenever possible, the drake will breathe fire directly at it's target, igniting and heavily damaging anything caught in the blast. - *It also often causes lava to pool from the ground around you - many nearby turfs will temporarily turn into lava, dealing damage to anything on the turfs. - *The drake also utilizes its wings to fly into the sky, flying after its target and attempting to slam down on them. Anything near when it slams down takes huge damage. - *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: - *A. A spectral blade that allows its wielder to call ghosts to it, enhancing its power - *B. A lava staff that allows its wielder to create lava - *C. A spellbook and wand of fireballs - *D. A bottle of dragon's blood with several effects, including turning its imbiber into a drake themselves. - * - *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. - * - *Intended Difficulty: Medium - */ - -/mob/living/simple_animal/hostile/megafauna/dragon - name = "ash drake" - desc = "Guardians of the necropolis." - health = 2500 - maxHealth = 2500 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - icon = 'icons/mob/lavaland/64x64megafauna.dmi' - icon_state = "dragon" - icon_living = "dragon" - icon_dead = "dragon_dead" - health_doll_icon = "dragon" - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - speak_emote = list("roars") - armour_penetration = 40 - melee_damage_lower = 40 - melee_damage_upper = 40 - speed = 5 - move_to_delay = 5 - ranged = TRUE - pixel_x = -16 - base_pixel_x = -16 - maptext_height = 64 - maptext_width = 64 - crusher_loot = list(/obj/structure/closet/crate/necropolis/dragon/crusher) - 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) - var/swooping = NONE - var/player_cooldown = 0 - gps_name = "Fiery Signal" - achievement_type = /datum/award/achievement/boss/drake_kill - crusher_achievement_type = /datum/award/achievement/boss/drake_crusher - score_achievement_type = /datum/award/score/drake_score - deathmessage = "collapses into a pile of bones, its flesh sloughing away." - deathsound = 'sound/magic/demon_dies.ogg' - footstep_type = FOOTSTEP_MOB_HEAVY - small_sprite_type = /datum/action/small_sprite/megafauna/drake - /// Fire cone ability - var/datum/action/cooldown/mob_cooldown/fire_breath/cone/fire_cone - /// Meteors ability - var/datum/action/cooldown/mob_cooldown/meteors/meteors - /// Mass fire ability - var/datum/action/cooldown/mob_cooldown/fire_breath/mass_fire/mass_fire - /// Lava swoop ability - var/datum/action/cooldown/mob_cooldown/lava_swoop/lava_swoop - -/mob/living/simple_animal/hostile/megafauna/dragon/Initialize() - . = ..() - fire_cone = new /datum/action/cooldown/mob_cooldown/fire_breath/cone() - meteors = new /datum/action/cooldown/mob_cooldown/meteors() - mass_fire = new /datum/action/cooldown/mob_cooldown/fire_breath/mass_fire() - lava_swoop = new /datum/action/cooldown/mob_cooldown/lava_swoop() - fire_cone.Grant(src) - meteors.Grant(src) - mass_fire.Grant(src) - lava_swoop.Grant(src) - RegisterSignal(src, COMSIG_MOB_ABILITY_STARTED, PROC_REF(start_attack)) - RegisterSignal(src, COMSIG_MOB_ABILITY_FINISHED, PROC_REF(finished_attack)) - RegisterSignal(src, COMSIG_SWOOP_INVULNERABILITY_STARTED, PROC_REF(swoop_invulnerability_started)) - RegisterSignal(src, COMSIG_LAVA_ARENA_FAILED, PROC_REF(on_arena_fail)) - -/mob/living/simple_animal/hostile/megafauna/dragon/Destroy() - QDEL_NULL(fire_cone) - QDEL_NULL(meteors) - QDEL_NULL(mass_fire) - QDEL_NULL(lava_swoop) - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/revive(full_heal = FALSE, admin_revive = FALSE) - . = ..() - if(!.) - return - pull_force = MOVE_FORCE_OVERPOWERING - -/mob/living/simple_animal/hostile/megafauna/dragon/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/OpenFire() - if(swooping) - return - - if(client) - return - - if(prob(15 + anger_modifier)) - if(DRAKE_ENRAGED) - // Lava Arena - lava_swoop.Trigger(target = target) - return - // Lava Pools - if(lava_swoop.Trigger(target = target)) - SLEEP_CHECK_DEATH(0, src) - fire_cone.StartCooldown(0) - fire_cone.Trigger(target = target) - meteors.StartCooldown(0) - INVOKE_ASYNC(meteors, TYPE_PROC_REF(/datum/action, Trigger), target) - return - else if(prob(10+anger_modifier) && DRAKE_ENRAGED) - mass_fire.Trigger(target = target) - return - if(fire_cone.Trigger(target = target)) - if(prob(50)) - meteors.StartCooldown(0) - meteors.Trigger(target = target) - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) - SIGNAL_HANDLER - if(activated == lava_swoop) - icon_state = "shadow" - swooping = SWOOP_DAMAGEABLE - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/swoop_invulnerability_started() - SIGNAL_HANDLER - swooping = SWOOP_INVULNERABLE - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/finished_attack(mob/living/owner, datum/action/cooldown/finished) - SIGNAL_HANDLER - if(finished == lava_swoop) - icon_state = initial(icon_state) - swooping = NONE - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/on_arena_fail() - SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(arena_escape_enrage)) - -/mob/living/simple_animal/hostile/megafauna/dragon/proc/arena_escape_enrage() // you ran somehow / teleported away from my arena attack now i'm mad fucker - SLEEP_CHECK_DEATH(0, src) - visible_message(span_boldwarning("[src] starts to glow vibrantly as its wounds close up!")) - adjustBruteLoss(-250) // yeah you're gonna pay for that, don't run nerd - add_atom_colour(rgb(255, 255, 0), TEMPORARY_COLOUR_PRIORITY) - move_to_delay = move_to_delay / 2 - set_light_range(10) - SLEEP_CHECK_DEATH(5 SECONDS, src) // run. - mass_fire.Activate(target) - mass_fire.StartCooldown(8 SECONDS) - move_to_delay = initial(move_to_delay) - remove_atom_colour(TEMPORARY_COLOUR_PRIORITY) - set_light_range(initial(light_outer_range)) - -//fire line keeps going even if dragon is deleted -/proc/dragon_fire_line(atom/source, list/turfs, frozen = FALSE) - var/list/hit_list = list() - for(var/turf/T in turfs) - if(istype(T, /turf/closed)) - break - - var/obj/effect/hotspot/drake_fire_hotspot = T.create_fire(1, 10) - if(frozen && drake_fire_hotspot) - drake_fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) - T.hotspot_expose(DRAKE_FIRE_TEMP,DRAKE_FIRE_EXPOSURE,1) - for(var/mob/living/L in T.contents) - if(L in hit_list || istype(L, source.type)) - continue - hit_list += L - if(!frozen) - L.adjustFireLoss(20) - to_chat(L, span_userdanger("You're hit by [source]'s fire breath!")) - continue - L.adjustFireLoss(10) - L.apply_status_effect(/datum/status_effect/ice_block_talisman, 20) - to_chat(L, span_userdanger("You're hit by [source]'s freezing breath!")) - - // deals damage to mechs - for(var/obj/vehicle/sealed/mecha/M in T.contents) - if(M in hit_list) - continue - hit_list += M - M.take_damage(45, BRUTE, MELEE, 1) - sleep(1.5) - -/mob/living/simple_animal/hostile/megafauna/dragon/ex_act(severity, target) - if(severity <= EXPLODE_LIGHT) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - anger_modifier = clamp(((maxHealth - health)/60),0,20) - lava_swoop.enraged = DRAKE_ENRAGED - if(!forced && (swooping & SWOOP_INVULNERABLE)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") //PARIAH EDIT - Better emotes // Original: /mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE) - if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit - return - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget() - if(!swooping) - return ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/DestroySurroundings() - if(!swooping) - ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/Move() - if(!swooping) - ..() - -/mob/living/simple_animal/hostile/megafauna/dragon/Goto(target, delay, minimum_distance) - if(!swooping) - ..() - -/obj/effect/temp_visual/lava_warning - icon_state = "lavastaff_warn" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - light_outer_range = 2 - duration = 13 - var/mob/owner - -/obj/effect/temp_visual/lava_warning/Initialize(mapload, reset_time = 10) - . = ..() - INVOKE_ASYNC(src, PROC_REF(fall), reset_time) - src.alpha = 63.75 - animate(src, alpha = 255, time = duration) - -/obj/effect/temp_visual/lava_warning/proc/fall(reset_time) - var/turf/T = get_turf(src) - playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE) - sleep(duration) - playsound(T,'sound/magic/fireball.ogg', 200, TRUE) - - for(var/mob/living/L in T.contents - owner) - if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) - continue - L.adjustFireLoss(10) - to_chat(L, span_userdanger("You fall directly into the pool of lava!")) - - // deals damage to mechs - for(var/obj/vehicle/sealed/mecha/M in T.contents) - M.take_damage(45, BRUTE, MELEE, 1) - - // changes turf to lava temporarily - if(!istype(T, /turf/closed) && !istype(T, /turf/open/lava)) - var/lava_turf = /turf/open/lava/smooth - var/reset_turf = T.type - T.ChangeTurf(lava_turf, flags = CHANGETURF_INHERIT_AIR) - addtimer(CALLBACK(T, TYPE_PROC_REF(/turf, ChangeTurf), reset_turf, null, CHANGETURF_INHERIT_AIR), reset_time, TIMER_OVERRIDE|TIMER_UNIQUE) - -/obj/effect/temp_visual/drakewall - desc = "An ash drakes true flame." - name = "Fire Barrier" - icon = 'icons/effects/fire.dmi' - icon_state = "1" - anchored = TRUE - opacity = FALSE - density = TRUE - can_atmos_pass = CANPASS_DENSITY - duration = 82 - color = COLOR_DARK_ORANGE - -/obj/effect/temp_visual/lava_safe - icon = 'icons/obj/hand_of_god_structures.dmi' - icon_state = "trap-earth" - layer = BELOW_MOB_LAYER - light_outer_range = 2 - duration = 13 - -/obj/effect/temp_visual/fireball - icon = 'icons/obj/wizard.dmi' - icon_state = "fireball" - name = "fireball" - desc = "Get out of the way!" - layer = FLY_LAYER - randomdir = FALSE - duration = 9 - pixel_z = 270 - -/obj/effect/temp_visual/fireball/Initialize(mapload) - . = ..() - animate(src, pixel_z = 0, time = duration) - -/obj/effect/temp_visual/target - icon = 'icons/mob/actions/actions_items.dmi' - icon_state = "sniper_zoom" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - light_outer_range = 2 - duration = 9 - -/obj/effect/temp_visual/target/Initialize(mapload, list/flame_hit) - . = ..() - INVOKE_ASYNC(src, PROC_REF(fall), flame_hit) - -/obj/effect/temp_visual/target/proc/fall(list/flame_hit) - var/turf/T = get_turf(src) - playsound(T,'sound/magic/fleshtostone.ogg', 80, TRUE) - new /obj/effect/temp_visual/fireball(T) - sleep(duration) - if(ismineralturf(T)) - var/turf/closed/mineral/M = T - M.gets_drilled() - playsound(T, SFX_EXPLOSION, 80, TRUE) - //new /obj/effect/hotspot(T) - T.create_fire(1, 10) - T.hotspot_expose(DRAKE_FIRE_TEMP, DRAKE_FIRE_EXPOSURE, 1) - for(var/mob/living/L in T.contents) - if(istype(L, /mob/living/simple_animal/hostile/megafauna/dragon)) - continue - if(islist(flame_hit) && !flame_hit[L]) - L.adjustFireLoss(40) - to_chat(L, span_userdanger("You're hit by the drake's fire breath!")) - flame_hit[L] = TRUE - else - L.adjustFireLoss(10) //if we've already hit them, do way less damage - -/mob/living/simple_animal/hostile/megafauna/dragon/lesser - name = "lesser ash drake" - maxHealth = 200 - health = 200 - faction = list("neutral") - obj_damage = 80 - melee_damage_upper = 30 - melee_damage_lower = 30 - mouse_opacity = MOUSE_OPACITY_ICON - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) - loot = list() - crusher_loot = list() - butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30) - attack_action_types = list() - -/mob/living/simple_animal/hostile/megafauna/dragon/lesser/Initialize() - . = ..() - fire_cone.Remove(src) - meteors.Remove(src) - mass_fire.Remove(src) - lava_swoop.cooldown_time = 20 SECONDS - -/mob/living/simple_animal/hostile/megafauna/dragon/lesser/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - lava_swoop.enraged = FALSE - -/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype) - return - -#undef SWOOP_DAMAGEABLE -#undef SWOOP_INVULNERABLE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm deleted file mode 100644 index 6e15eb591aba..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ /dev/null @@ -1,770 +0,0 @@ -/* - -The Hierophant - -The Hierophant spawns in its arena, which makes fighting it challenging but not impossible. - -The text this boss speaks is ROT4, use ROT22 to decode - -The Hierophant's attacks are as follows; -- These attacks happen at a random, increasing chance: - If target is at least 2 tiles away; Blinks to the target after a very brief delay, damaging everything near the start and end points. - As above, but does so multiple times if below half health. - Rapidly creates cardinal and diagonal Cross Blasts under a target. - If chasers are off cooldown, creates 4 chasers. - -- IF TARGET IS OUTSIDE THE ARENA: Creates an arena around the target for 10 seconds, blinking to the target if not in the created arena. - The arena has a 20 second cooldown, giving people a small window to get the fuck out. - -- If no chasers exist, creates a chaser that will seek its target, leaving a trail of blasts. - Is more likely to create a second, slower, chaser if hurt. -- If the target is at least 2 tiles away, may Blink to the target after a very brief delay, damaging everything near the start and end points. -- Creates a cardinal or diagonal blast(Cross Blast) under its target, exploding after a short time. - If below half health, the created Cross Blast may fire in all directions. -- Creates an expanding AoE burst. - -- IF ATTACKING IN MELEE: Creates an expanding AoE burst. - -Cross Blasts and the AoE burst gain additional range as Hierophant loses health, while Chasers gain additional speed. - -When Hierophant dies, it stops trying to murder you and shrinks into a small form, which, while much weaker, is still quite effective. -- The smaller club can place a teleport beacon, allowing the user to teleport themself and their allies to the beacon. - -Difficulty: Hard - -*/ - -/mob/living/simple_animal/hostile/megafauna/hierophant - name = "hierophant" - desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat." - health = 2500 - maxHealth = 2500 - attack_verb_continuous = "clubs" - attack_verb_simple = "club" - attack_sound = 'sound/weapons/sonic_jackhammer.ogg' - icon_state = "hierophant" - icon_living = "hierophant" - health_doll_icon = "hierophant" - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - icon = 'icons/mob/lavaland/hierophant_new.dmi' - faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house - speak_emote = list("preaches") - armour_penetration = 50 - melee_damage_lower = 15 - melee_damage_upper = 15 - speed = 10 - move_to_delay = 10 - ranged = TRUE - ranged_cooldown_time = 4 SECONDS - 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) - wander = FALSE - gps_name = "Zealous Signal" - achievement_type = /datum/award/achievement/boss/hierophant_kill - crusher_achievement_type = /datum/award/achievement/boss/hierophant_crusher - score_achievement_type = /datum/award/score/hierophant_score - del_on_death = TRUE - deathsound = 'sound/magic/repulse.ogg' - attack_action_types = list(/datum/action/innate/megafauna_attack/blink, - /datum/action/innate/megafauna_attack/chaser_swarm, - /datum/action/innate/megafauna_attack/cross_blasts, - /datum/action/innate/megafauna_attack/blink_spam) - - var/burst_range = 3 //range on burst aoe - var/beam_range = 5 //range on cross blast beams - var/chaser_speed = 3 //how fast chasers are currently - var/major_attack_cooldown = 6 SECONDS //base cooldown for major attacks - var/chaser_cooldown_time = 10.1 SECONDS //base cooldown for spawning chasers - var/chaser_cooldown = 0 - var/arena_cooldown_time = 20 SECONDS //base cooldown for making arenas - var/arena_cooldown = 0 - var/blinking = FALSE //if we're doing something that requires us to stand still and not attack - var/obj/effect/hierophant/spawned_beacon //the beacon we teleport back to - var/timeout_time = 15 //after this many Life() ticks with no target, we return to our beacon - 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.") - -/mob/living/simple_animal/hostile/megafauna/hierophant/Initialize(mapload) - . = ..() - 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" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - chosen_message = "You are now blinking to your target." - chosen_attack_num = 1 - -/datum/action/innate/megafauna_attack/chaser_swarm - name = "Chaser Swarm" - button_icon = 'icons/effects/effects.dmi' - button_icon_state = "hierophant_squares_indefinite" - chosen_message = "You are firing a chaser swarm at your target." - chosen_attack_num = 2 - -/datum/action/innate/megafauna_attack/cross_blasts - name = "Cross Blasts" - button_icon = 'icons/effects/effects.dmi' - button_icon_state = "hierophant_blast_indefinite" - chosen_message = "You are now firing cross blasts at your target." - chosen_attack_num = 3 - -/datum/action/innate/megafauna_attack/blink_spam - name = "Blink Chase" - button_icon = 'icons/obj/lavaland/artefacts.dmi' - button_icon_state = "hierophant_club_ready_beacon" - chosen_message = "You are now repeatedly blinking at your target." - chosen_attack_num = 4 - -/mob/living/simple_animal/hostile/megafauna/hierophant/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE) - . = ..() - if(cooldown_updates[COOLDOWN_UPDATE_SET_CHASER]) - chaser_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_CHASER] - if(cooldown_updates[COOLDOWN_UPDATE_ADD_CHASER]) - chaser_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_CHASER] - if(cooldown_updates[COOLDOWN_UPDATE_SET_ARENA]) - arena_cooldown = world.time + cooldown_updates[COOLDOWN_UPDATE_SET_ARENA] - if(cooldown_updates[COOLDOWN_UPDATE_ADD_ARENA]) - arena_cooldown += cooldown_updates[COOLDOWN_UPDATE_ADD_ARENA] - -/mob/living/simple_animal/hostile/megafauna/hierophant/OpenFire() - if(blinking) - return - - calculate_rage() - var/blink_counter = 1 + round(anger_modifier * 0.08) - var/cross_counter = 1 + round(anger_modifier * 0.12) - - arena_trap(target) - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = max(0.5 SECONDS, ranged_cooldown_time - anger_modifier * 0.75)), ignore_staggered = TRUE) //scale cooldown lower with high anger. - - var/target_slowness = 0 - var/mob/living/L - if(isliving(target)) - L = target - target_slowness += L.cached_multiplicative_slowdown - if(client) - target_slowness += 1 - - target_slowness = max(target_slowness, 1) - chaser_speed = max(1, (3 - anger_modifier * 0.04) + ((target_slowness - 1) * 0.5)) - - if(client) - switch(chosen_attack) - if(1) - blink(target) - if(2) - chaser_swarm(blink_counter, target_slowness, cross_counter) - if(3) - cross_blast_spam(blink_counter, target_slowness, cross_counter) - if(4) - blink_spam(blink_counter, target_slowness, cross_counter) - return - - if(L?.stat == DEAD && !blinking && get_dist(src, L) > 2) - blink(L) - return - - if(prob(anger_modifier * 0.75)) //major ranged attack - var/list/possibilities = list() - if(cross_counter > 1) - possibilities += "cross_blast_spam" - if(get_dist(src, target) > 2) - possibilities += "blink_spam" - if(chaser_cooldown < world.time) - if(prob(anger_modifier * 2)) - possibilities = list("chaser_swarm") - else - possibilities += "chaser_swarm" - if(possibilities.len) - switch(pick(possibilities)) - if("blink_spam") //blink either once or multiple times. - blink_spam(blink_counter, target_slowness, cross_counter) - if("cross_blast_spam") //fire a lot of cross blasts at a target. - cross_blast_spam(blink_counter, target_slowness, cross_counter) - if("chaser_swarm") //fire four fucking chasers at a target and their friends. - chaser_swarm(blink_counter, target_slowness, cross_counter) - return - - if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some! - var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE) - update_cooldowns(list(COOLDOWN_UPDATE_SET_CHASER = chaser_cooldown_time)) - if((prob(anger_modifier) || target.Adjacent(src)) && target != src) - var/obj/effect/temp_visual/hierophant/chaser/OC = new(loc, src, target, chaser_speed * 1.5, FALSE) - OC.moving = 4 - OC.moving_dir = pick(GLOB.cardinals - C.moving_dir) - - else if(prob(10 + (anger_modifier * 0.5)) && get_dist(src, target) > 2) - blink(target) - - else if(prob(70 - anger_modifier)) //a cross blast of some type - if(prob(anger_modifier * (2 / target_slowness)) && health < maxHealth * 0.5) //we're super angry do it at all dirs - INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.alldirs) - else if(prob(60)) - INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.cardinals) - else - INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.diagonals) - else //just release a burst of power - INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src)) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blink_spam(blink_counter, target_slowness, cross_counter) - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = max(0.5 SECONDS, major_attack_cooldown - anger_modifier * 0.75))) - if(health < maxHealth * 0.5 && blink_counter > 1) - visible_message(span_hierophant("\"Mx ampp rsx iwgeti.\"")) - var/oldcolor = color - animate(src, color = "#660099", time = 6) - SLEEP_CHECK_DEATH(6, src) - while(!QDELETED(target) && blink_counter) - if(loc == target.loc || loc == target) //we're on the same tile as them after about a second we can stop now - break - blink_counter-- - blinking = FALSE - blink(target) - blinking = TRUE - SLEEP_CHECK_DEATH(4 + target_slowness, src) - animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) - SLEEP_CHECK_DEATH(8, src) - blinking = FALSE - else - blink(target) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/cross_blast_spam(blink_counter, target_slowness, cross_counter) - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = max(0.5 SECONDS, major_attack_cooldown - anger_modifier * 0.75))) - visible_message(span_hierophant("\"Piezi mx rsalivi xs vyr.\"")) - blinking = TRUE - var/oldcolor = color - animate(src, color = "#660099", time = 6) - SLEEP_CHECK_DEATH(6, src) - while(!QDELETED(target) && cross_counter) - cross_counter-- - if(prob(60)) - INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.cardinals) - else - INVOKE_ASYNC(src, PROC_REF(blasts), target, GLOB.diagonals) - SLEEP_CHECK_DEATH(6 + target_slowness, src) - animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) - SLEEP_CHECK_DEATH(8, src) - blinking = FALSE - - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/chaser_swarm(blink_counter, target_slowness, cross_counter) - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = max(0.5 SECONDS, major_attack_cooldown - anger_modifier * 0.75))) - visible_message(span_hierophant("\"Mx gerrsx lmhi.\"")) - blinking = TRUE - var/oldcolor = color - animate(src, color = "#660099", time = 6) - SLEEP_CHECK_DEATH(6, src) - var/list/targets = ListTargets() - var/list/cardinal_copy = GLOB.cardinals.Copy() - while(targets.len && cardinal_copy.len) - var/mob/living/pickedtarget = pick(targets) - if(targets.len >= cardinal_copy.len) - pickedtarget = pick_n_take(targets) - if(!istype(pickedtarget) || pickedtarget.stat == DEAD) - pickedtarget = target - if(QDELETED(pickedtarget) || (istype(pickedtarget) && pickedtarget.stat == DEAD)) - break //main target is dead and we're out of living targets, cancel out - var/obj/effect/temp_visual/hierophant/chaser/C = new(loc, src, pickedtarget, chaser_speed, FALSE) - C.moving = 3 - C.moving_dir = pick_n_take(cardinal_copy) - SLEEP_CHECK_DEATH(8 + target_slowness, src) - update_cooldowns(list(COOLDOWN_UPDATE_SET_CHASER = chaser_cooldown_time)) - animate(src, color = oldcolor, time = 8) - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 8) - SLEEP_CHECK_DEATH(8, src) - blinking = FALSE - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blasts(mob/victim, list/directions = GLOB.cardinals) //fires cross blasts with a delay - var/turf/T = get_turf(victim) - if(!T) - return - if(directions == GLOB.cardinals) - new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, src) - else if(directions == GLOB.diagonals) - new /obj/effect/temp_visual/hierophant/telegraph/diagonal(T, src) - else - new /obj/effect/temp_visual/hierophant/telegraph(T, src) - playsound(T,'sound/effects/bin_close.ogg', 200, TRUE) - SLEEP_CHECK_DEATH(2, src) - new /obj/effect/temp_visual/hierophant/blast/damaging(T, src, FALSE) - for(var/d in directions) - INVOKE_ASYNC(src, PROC_REF(blast_wall), T, d) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blast_wall(turf/T, set_dir) //make a wall of blasts beam_range tiles long - var/range = beam_range - var/turf/previousturf = T - var/turf/J = get_step(previousturf, set_dir) - for(var/i in 1 to range) - new /obj/effect/temp_visual/hierophant/blast/damaging(J, src, FALSE) - previousturf = J - J = get_step(previousturf, set_dir) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_trap(mob/victim) //trap a target in an arena - var/turf/T = get_turf(victim) - if(!istype(victim) || victim.stat == DEAD || !T || arena_cooldown > world.time) - return - if((istype(get_area(T), /area/ruin/unpowered/hierophant) || istype(get_area(src), /area/ruin/unpowered/hierophant)) && victim != src) - return - update_cooldowns(list(COOLDOWN_UPDATE_SET_ARENA = arena_cooldown_time)) - for(var/d in GLOB.cardinals) - INVOKE_ASYNC(src, PROC_REF(arena_squares), T, d) - for(var/t in RANGE_TURFS(11, T)) - if(t && get_dist(t, T) == 11) - new /obj/effect/temp_visual/hierophant/wall(t, src) - new /obj/effect/temp_visual/hierophant/blast/damaging(t, src, FALSE) - if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you! - INVOKE_ASYNC(src, PROC_REF(blink), T) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_squares(turf/T, set_dir) //make a fancy effect extending from the arena target - var/turf/previousturf = T - var/turf/J = get_step(previousturf, set_dir) - for(var/i in 1 to 10) - var/obj/effect/temp_visual/hierophant/squares/HS = new(J) - HS.setDir(set_dir) - previousturf = J - J = get_step(previousturf, set_dir) - SLEEP_CHECK_DEATH(0.5, src) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blink(mob/victim) //blink to a target - if(blinking || !victim) - return - var/turf/T = get_turf(victim) - var/turf/source = get_turf(src) - new /obj/effect/temp_visual/hierophant/telegraph(T, src) - new /obj/effect/temp_visual/hierophant/telegraph(source, src) - playsound(T,'sound/magic/wand_teleport.ogg', 200, TRUE) - playsound(source,'sound/machines/doors/airlock_open.ogg', 200, TRUE) - blinking = TRUE - SLEEP_CHECK_DEATH(2, src) //short delay before we start... - new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) - new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) - for(var/t in RANGE_TURFS(1, T)) - var/obj/effect/temp_visual/hierophant/blast/damaging/B = new(t, src, FALSE) - B.damage = 30 - for(var/t in RANGE_TURFS(1, source)) - var/obj/effect/temp_visual/hierophant/blast/damaging/B = new(t, src, FALSE) - B.damage = 30 - animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out - SLEEP_CHECK_DEATH(1, src) - visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) - SLEEP_CHECK_DEATH(2, src) - forceMove(T) - SLEEP_CHECK_DEATH(1, src) - animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN - SLEEP_CHECK_DEATH(1, src) - set_density(TRUE) - visible_message(span_hierophant_warning("[src] fades in!")) - SLEEP_CHECK_DEATH(1, src) //at this point the blasts we made detonate - blinking = FALSE - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/melee_blast(mob/victim) //make a 3x3 blast around a target - if(!victim) - return - var/turf/T = get_turf(victim) - if(!T) - return - new /obj/effect/temp_visual/hierophant/telegraph(T, src) - playsound(T,'sound/effects/bin_close.ogg', 200, TRUE) - SLEEP_CHECK_DEATH(2, src) - for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/temp_visual/hierophant/blast/damaging(t, src, FALSE) - -//expanding square -/proc/hierophant_burst(mob/caster, turf/original, burst_range, spread_speed = 0.5) - playsound(original,'sound/machines/doors/airlock_open.ogg', 200, TRUE) - var/last_dist = 0 - for(var/t in spiral_range_turfs(burst_range, original)) - var/turf/T = t - if(!T) - continue - var/dist = get_dist(original, T) - if(dist > last_dist) - last_dist = dist - sleep(1 + min(burst_range - last_dist, 12) * spread_speed) //gets faster as it gets further out - new /obj/effect/temp_visual/hierophant/blast/damaging(T, caster, FALSE) - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original, spread_speed) - hierophant_burst(src, original, burst_range, spread_speed) - -/mob/living/simple_animal/hostile/megafauna/hierophant/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(. && spawned_beacon && !QDELETED(spawned_beacon) && !client) - if(target || loc == spawned_beacon.loc) - timeout_time = initial(timeout_time) - else - timeout_time-- - if(timeout_time <= 0 && !did_reset) - did_reset = TRUE - visible_message(span_hierophant_warning("\"Vixyvrmrk xs fewi...\"")) - blink(spawned_beacon) - adjustHealth(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health - wander = FALSE - if(health > maxHealth * 0.9) - visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\"")) - else - visible_message(span_hierophant("\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\"")) - -/mob/living/simple_animal/hostile/megafauna/hierophant/death() - if(health > 0 || stat == DEAD) - return - else - set_stat(DEAD) - blinking = TRUE //we do a fancy animation, release a huge burst(), and leave our staff. - visible_message(span_hierophant("\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\"")) - visible_message(span_hierophant_warning("[src] shrinks, releasing a massive burst of energy!")) - var/list/stored_nearby = list() - for(var/mob/living/L in view(7,src)) - stored_nearby += L // store the people to grant the achievements to once we die - hierophant_burst(null, get_turf(src), 10) - set_stat(CONSCIOUS) // deathgasp won't run if dead, stupid - ..(force_grant = stored_nearby) - -/mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L) - for(var/obj/item/W in L) - if(!L.dropItemToGround(W)) - qdel(W) - visible_message(span_hierophant_warning("\"[pick(kill_phrases)]\"")) - visible_message(span_hierophant_warning("[src] annihilates [L]!"),span_userdanger("You annihilate [L], restoring your health!")) - adjustHealth(-L.maxHealth*0.5) - L.dust() - -/mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target) - . = ..() - if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permanent targets - return FALSE - -/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target) - var/targets_the_same = (new_target == target) - . = ..() - if(. && target && !targets_the_same) - visible_message(span_hierophant_warning("\"[pick(target_phrases)]\"")) - if(spawned_beacon && loc == spawned_beacon.loc && did_reset) - arena_trap(src) - -/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(src && . && !blinking) - wander = TRUE - did_reset = FALSE - -/mob/living/simple_animal/hostile/megafauna/hierophant/AttackingTarget() - if(!blinking) - if(target && isliving(target)) - var/mob/living/L = target - if(L.stat != DEAD) - if(ranged_cooldown <= world.time) - calculate_rage() - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = max(0.5 SECONDS, ranged_cooldown_time - anger_modifier * 0.75)), ignore_staggered = TRUE) - INVOKE_ASYNC(src, PROC_REF(burst), get_turf(src)) - else - burst_range = 3 - INVOKE_ASYNC(src, PROC_REF(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 - return ..() - -/mob/living/simple_animal/hostile/megafauna/hierophant/DestroySurroundings() - if(!blinking) - ..() - -/mob/living/simple_animal/hostile/megafauna/hierophant/Move() - if(!blinking) - . = ..() - -/mob/living/simple_animal/hostile/megafauna/hierophant/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - if(!stat && .) - var/obj/effect/temp_visual/hierophant/squares/HS = new(old_loc) - HS.setDir(movement_dir) - playsound(src, 'sound/mecha/mechmove04.ogg', 150, TRUE, -4) - if(target) - arena_trap(target) - -/mob/living/simple_animal/hostile/megafauna/hierophant/Goto(target, delay, minimum_distance) - wander = TRUE - if(!blinking) - ..() - -/mob/living/simple_animal/hostile/megafauna/hierophant/proc/calculate_rage() //how angry we are overall - did_reset = FALSE //oh hey we're doing SOMETHING, clearly we might need to heal if we recall - anger_modifier = clamp(((maxHealth - health) / 42),0,50) - burst_range = initial(burst_range) + round(anger_modifier * 0.08) - beam_range = initial(beam_range) + round(anger_modifier * 0.12) - -//Hierophant overlays -/obj/effect/temp_visual/hierophant - name = "vortex energy" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - var/mob/living/caster //who made this, anyway - -/obj/effect/temp_visual/hierophant/Initialize(mapload, new_caster) - . = ..() - if(new_caster) - caster = new_caster - -/obj/effect/temp_visual/hierophant/squares - icon_state = "hierophant_squares" - duration = 3 - light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE - randomdir = FALSE - -/obj/effect/temp_visual/hierophant/squares/Initialize(mapload, new_caster) - . = ..() - if(ismineralturf(loc)) - var/turf/closed/mineral/M = loc - M.gets_drilled(caster) - -/obj/effect/temp_visual/hierophant/wall //smoothing and pooling were not friends, but pooling is dead. - name = "vortex wall" - icon = 'icons/turf/walls/legacy/hierophant_wall_temp.dmi' - icon_state = "hierophant_wall_temp-0" - base_icon_state = "hierophant_wall_temp" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL) - canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL) - light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE - duration = 100 - -/obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) - . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) - QUEUE_SMOOTH(src) - -/obj/effect/temp_visual/hierophant/wall/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) - return ..() - -/obj/effect/temp_visual/hierophant/wall/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(QDELETED(caster)) - return FALSE - if(mover == caster.pulledby) - return - if(istype(mover, /obj/projectile)) - var/obj/projectile/P = mover - if(P.firer == caster) - return - if(mover != caster) - return FALSE - -/obj/effect/temp_visual/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds. - duration = 98 - var/mob/living/target //what it's following - var/turf/targetturf //what turf the target is actually on - var/moving_dir //what dir it's moving in - var/previous_moving_dir //what dir it was moving in before that - var/more_previouser_moving_dir //what dir it was moving in before THAT - var/moving = 0 //how many steps to move before recalculating - var/standard_moving_before_recalc = 4 //how many times we step before recalculating normally - var/tiles_per_step = 1 //how many tiles we move each step - var/speed = 3 //how many deciseconds between each step - var/currently_seeking = FALSE - var/friendly_fire_check = FALSE //if blasts produced apply friendly fire - var/monster_damage_boost = TRUE - var/damage = 10 - -/obj/effect/temp_visual/hierophant/chaser/Initialize(mapload, new_caster, new_target, new_speed, is_friendly_fire) - . = ..() - target = new_target - friendly_fire_check = is_friendly_fire - if(new_speed) - speed = new_speed - addtimer(CALLBACK(src, PROC_REF(seek_target)), 1) - -/obj/effect/temp_visual/hierophant/chaser/proc/get_target_dir() - . = get_cardinal_dir(src, targetturf) - if((. != previous_moving_dir && . == more_previouser_moving_dir) || . == 0) //we're alternating, recalculate - var/list/cardinal_copy = GLOB.cardinals.Copy() - cardinal_copy -= more_previouser_moving_dir - . = pick(cardinal_copy) - -/obj/effect/temp_visual/hierophant/chaser/proc/seek_target() - if(!currently_seeking) - currently_seeking = TRUE - targetturf = get_turf(target) - while(target && src && !QDELETED(src) && currently_seeking && x && y && targetturf) //can this target actually be sook out - if(!moving) //we're out of tiles to move, find more and where the target is! - more_previouser_moving_dir = previous_moving_dir - previous_moving_dir = moving_dir - moving_dir = get_target_dir() - var/standard_target_dir = get_cardinal_dir(src, targetturf) - if((standard_target_dir != previous_moving_dir && standard_target_dir == more_previouser_moving_dir) || standard_target_dir == 0) - moving = 1 //we would be repeating, only move a tile before checking - else - moving = standard_moving_before_recalc - if(moving) //move in the dir we're moving in right now - var/turf/T = get_turf(src) - for(var/i in 1 to tiles_per_step) - var/maybe_new_turf = get_step(T, moving_dir) - if(maybe_new_turf) - T = maybe_new_turf - else - break - forceMove(T) - make_blast() //make a blast, too - moving-- - sleep(speed) - targetturf = get_turf(target) -/obj/effect/temp_visual/hierophant/chaser/proc/make_blast() - var/obj/effect/temp_visual/hierophant/blast/damaging/B = new(loc, caster, friendly_fire_check) - B.damage = damage - B.monster_damage_boost = monster_damage_boost - -/obj/effect/temp_visual/hierophant/telegraph - icon = 'icons/effects/96x96.dmi' - icon_state = "hierophant_telegraph" - pixel_x = -32 - pixel_y = -32 - duration = 3 - -/obj/effect/temp_visual/hierophant/telegraph/diagonal - icon_state = "hierophant_telegraph_diagonal" - -/obj/effect/temp_visual/hierophant/telegraph/cardinal - icon_state = "hierophant_telegraph_cardinal" - -/obj/effect/temp_visual/hierophant/telegraph/teleport - icon_state = "hierophant_telegraph_teleport" - duration = 9 - -/obj/effect/temp_visual/hierophant/telegraph/edge - icon_state = "hierophant_telegraph_edge" - duration = 40 - -/obj/effect/temp_visual/hierophant/blast - icon_state = "hierophant_blast" - name = "vortex blast" - light_outer_range = 2 - light_power = 2 - desc = "Get out of the way!" - duration = 9 - -/obj/effect/temp_visual/hierophant/blast/damaging - var/damage = 10 //how much damage do we do? - var/monster_damage_boost = TRUE //do we deal extra damage to monsters? Used by the boss - var/list/hit_things = list() //we hit these already, ignore them - var/friendly_fire_check = FALSE - var/bursting = FALSE //if we're bursting and need to hit anyone crossing us - -/obj/effect/temp_visual/hierophant/blast/damaging/Initialize(mapload, new_caster, friendly_fire) - . = ..() - friendly_fire_check = friendly_fire - if(new_caster) - hit_things += new_caster - if(ismineralturf(loc)) //drill mineral turfs - var/turf/closed/mineral/M = loc - M.gets_drilled(caster) - INVOKE_ASYNC(src, PROC_REF(blast)) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/effect/temp_visual/hierophant/blast/damaging/proc/blast() - var/turf/T = get_turf(src) - if(!T) - return - playsound(T,'sound/magic/blind.ogg', 125, TRUE, -5) //make a sound - sleep(6) //wait a little - bursting = TRUE - do_damage(T) //do damage and mark us as bursting - sleep(1.3) //slightly forgiving; the burst animation is 1.5 deciseconds - bursting = FALSE //we no longer damage crossers - -/obj/effect/temp_visual/hierophant/blast/damaging/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == src) - return - if(bursting) - do_damage(get_turf(src)) - -/obj/effect/temp_visual/hierophant/blast/damaging/proc/do_damage(turf/T) - if(!damage) - return - for(var/mob/living/L in T.contents - hit_things) //find and damage mobs... - hit_things += L - if((friendly_fire_check && caster?.faction_check_mob(L)) || L.stat == DEAD) - continue - if(L.client) - flash_color(L.client, "#660099", 1) - playsound(L,'sound/weapons/sear.ogg', 50, TRUE, -4) - to_chat(L, span_userdanger("You're struck by a [name]!")) - var/limb_to_hit = L.get_bodypart(pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) - var/armor = L.run_armor_check(limb_to_hit, MELEE, "Your armor absorbs [src]!", "Your armor blocks part of [src]!", FALSE, 50, "Your armor was penetrated by [src]!") - L.apply_damage(damage, BURN, limb_to_hit, armor) - if(ishostile(L)) - var/mob/living/simple_animal/hostile/H = L //mobs find and damage you... - if(H.stat == CONSCIOUS && !H.target && H.AIStatus != AI_OFF && !H.client) - if(!QDELETED(caster)) - if(get_dist(H, caster) <= H.aggro_vision_range) - H.FindTarget(list(caster), 1) - else - H.Goto(get_turf(caster), H.move_to_delay, 3) - if(monster_damage_boost && (ismegafauna(L) || istype(L, /mob/living/simple_animal/hostile/asteroid))) - L.adjustBruteLoss(damage) - if(caster) - log_combat(caster, L, "struck with a [name]") - for(var/obj/vehicle/sealed/mecha/M in T.contents - hit_things) //also damage mechs. - hit_things += M - for(var/O in M.occupants) - var/mob/living/occupant = O - if(friendly_fire_check && caster?.faction_check_mob(occupant)) - continue - to_chat(occupant, span_userdanger("Your [M.name] is struck by a [name]!")) - playsound(M,'sound/weapons/sear.ogg', 50, TRUE, -4) - M.take_damage(damage, BURN, 0, 0) - -/obj/effect/temp_visual/hierophant/blast/visual - icon_state = "hierophant_blast" - name = "vortex blast" - light_outer_range = 2 - light_power = 2 - desc = "Get out of the way!" - duration = 9 - -/obj/effect/temp_visual/hierophant/blast/visual/Initialize(mapload, new_caster) - . = ..() - var/turf/src_turf = get_turf(src) - playsound(src_turf,'sound/magic/blind.ogg', 125, TRUE, -5) - -/obj/effect/hierophant - name = "hierophant beacon" - desc = "A strange beacon, allowing mass teleportation for those able to use it." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "hierophant_tele_off" - light_outer_range = 2 - layer = LOW_OBJ_LAYER - anchored = TRUE - -/obj/effect/hierophant/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/hierophant_club)) - var/obj/item/hierophant_club/H = I - if(H.beacon == src) - to_chat(user, span_notice("You start removing your hierophant beacon...")) - if(do_after(user, src, 50)) - playsound(src,'sound/magic/blind.ogg', 200, TRUE, -4) - new /obj/effect/temp_visual/hierophant/telegraph/teleport(get_turf(src), user) - to_chat(user, span_hierophant_warning("You collect [src], reattaching it to the club!")) - H.beacon = null - H.update_appearance() - user?.update_mob_action_buttons() - qdel(src) - else - to_chat(user, span_hierophant_warning("You touch the beacon with the club, but nothing happens.")) - else - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm deleted file mode 100644 index 78e6ffb5b263..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm +++ /dev/null @@ -1,350 +0,0 @@ -/** - *LEGION - * - *Legion spawns from the necropolis gate in the far north of lavaland. It is the guardian of the Necropolis and emerges from within whenever an intruder tries to enter through its gate. - *Whenever Legion emerges, everything in lavaland will receive a notice via color, audio, and text. This is because Legion is powerful enough to slaughter the entirety of lavaland with little effort. LOL - * - *It has three attacks. - *Spawn Skull. Most of the time it will use this attack. Spawns a single legion skull. - *Spawn Sentinel. The legion will spawn up to three sentinels, depending on its size. - *CHARGE! The legion starts spinning and tries to melee the player. It will try to flick itself towards the player, dealing some damage if it hits. - * - *When Legion dies, it will split into three smaller skulls up to three times. - *If you kill all of the smaller ones it drops a staff of storms, which allows its wielder to call and disperse ash storms at will and functions as a powerful melee weapon. - * - *Difficulty: Medium - * - *SHITCODE AHEAD. BE ADVISED. Also comment extravaganza - */ - -#define LEGION_LARGE 3 -#define LEGION_MEDIUM 2 -#define LEGION_SMALL 1 - -/mob/living/simple_animal/hostile/megafauna/legion - name = "Legion" - health = 700 - maxHealth = 700 - icon_state = "mega_legion" - icon_living = "mega_legion" - health_doll_icon = "mega_legion" - desc = "One of many." - icon = 'icons/mob/lavaland/96x96megafauna.dmi' - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - speak_emote = list("echoes") - armour_penetration = 50 - melee_damage_lower = 25 - melee_damage_upper = 25 - speed = 5 - ranged = TRUE - del_on_death = TRUE - retreat_distance = 5 - minimum_distance = 5 - ranged_cooldown_time = 2 SECONDS - gps_name = "Echoing Signal" - achievement_type = /datum/award/achievement/boss/legion_kill - crusher_achievement_type = /datum/award/achievement/boss/legion_crusher - score_achievement_type = /datum/award/score/legion_score - pixel_x = -32 - base_pixel_x = -32 - pixel_y = -16 - base_pixel_y = -16 - maptext_height = 96 - maptext_width = 96 - loot = list(/obj/item/stack/sheet/bone = 3) - vision_range = 13 - wander = FALSE - elimination = TRUE - appearance_flags = LONG_GLIDE - mouse_opacity = MOUSE_OPACITY_ICON - attack_action_types = list(/datum/action/innate/megafauna_attack/create_skull, - /datum/action/innate/megafauna_attack/charge_target, - /datum/action/innate/megafauna_attack/create_turrets) - small_sprite_type = /datum/action/small_sprite/megafauna/legion - var/size = LEGION_LARGE - var/charging = FALSE - -/mob/living/simple_animal/hostile/megafauna/legion/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/megafauna/legion/medium - icon = 'icons/mob/lavaland/64x64megafauna.dmi' - pixel_x = -16 - pixel_y = -8 - maxHealth = 350 - size = LEGION_MEDIUM - -/mob/living/simple_animal/hostile/megafauna/legion/medium/left - icon_state = "mega_legion_left" - -/mob/living/simple_animal/hostile/megafauna/legion/medium/eye - icon_state = "mega_legion_eye" - -/mob/living/simple_animal/hostile/megafauna/legion/medium/right - icon_state = "mega_legion_right" - -/mob/living/simple_animal/hostile/megafauna/legion/small - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "mega_legion" - pixel_x = 0 - pixel_y = 0 - maxHealth = 200 - size = LEGION_SMALL - - - -/datum/action/innate/megafauna_attack/create_skull - name = "Create Legion Skull" - button_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - button_icon_state = "legion_head" - chosen_message = "You are now creating legion skulls." - chosen_attack_num = 1 - -/datum/action/innate/megafauna_attack/charge_target - name = "Charge Target" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - chosen_message = "You are now charging at your target." - chosen_attack_num = 2 - -/datum/action/innate/megafauna_attack/create_turrets - name = "Create Sentinels" - button_icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - button_icon_state = "legion_turret" - chosen_message = "You are now creating legion sentinels." - chosen_attack_num = 3 - -/mob/living/simple_animal/hostile/megafauna/legion/OpenFire(the_target) - if(charging) - return - update_cooldowns(list(COOLDOWN_UPDATE_SET_RANGED = ranged_cooldown_time), ignore_staggered = TRUE) - - if(client) - switch(chosen_attack) - if(1) - create_legion_skull() - if(2) - charge_target() - if(3) - create_legion_turrets() - return - - switch(rand(4)) //Larger skulls use more attacks. - if(0 to 2) - create_legion_skull() - if(3) - charge_target() - if(4) - create_legion_turrets() - -//SKULLS - -///Attack proc. Spawns a singular legion skull. -/mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_skull() - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc) - A.GiveTarget(target) - A.friends = friends - A.faction = faction - -//CHARGE - -///Attack proc. Gives legion some movespeed buffs and switches the AI to melee. At lower sizes, this also throws the skull at the player. -/mob/living/simple_animal/hostile/megafauna/legion/proc/charge_target() - visible_message(span_warning("[src] charges!")) - SpinAnimation(speed = 20, loops = 3, parallel = FALSE) - ranged = FALSE - retreat_distance = 0 - minimum_distance = 0 - set_varspeed(0) - charging = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_charge)), 60) - var/mob/living/L = target - if(!istype(L) || L.stat != DEAD) //I know, weird syntax, but it just works. - addtimer(CALLBACK(src, PROC_REF(throw_thyself)), 20) - -///This is the proc that actually does the throwing. Charge only adds a timer for this. -/mob/living/simple_animal/hostile/megafauna/legion/proc/throw_thyself() - playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE) - throw_at(target, 7, 1.1, src, FALSE, FALSE, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), src, 'sound/effects/meteorimpact.ogg', 50 * size, TRUE, 2), INFINITY) - -///Deals some extra damage on throw impact. -/mob/living/simple_animal/hostile/megafauna/legion/throw_impact(mob/living/hit_atom, datum/thrownthing/throwingdatum) - . = ..() - if(istype(hit_atom)) - playsound(src, attack_sound, 100, TRUE) - hit_atom.apply_damage(22 * size / 2) //It gets pretty hard to dodge the skulls when there are a lot of them. Scales down with size - hit_atom.safe_throw_at(get_step(src, get_dir(src, hit_atom)), 2) //Some knockback. Prevent the legion from melee directly after the throw. - -//TURRETS - -///Attack proc. Creates up to three legion turrets on suitable turfs nearby. -/mob/living/simple_animal/hostile/megafauna/legion/proc/create_legion_turrets(minimum = 2, maximum = size * 2) - playsound(src, 'sound/magic/RATTLEMEBONES.ogg', 100, TRUE) - var/list/possiblelocations = list() - for(var/turf/T in oview(src, 4)) //Only place the turrets on open turfs - if(T.is_blocked_turf()) - continue - possiblelocations += T - for(var/i in 1 to min(rand(minimum, maximum), LAZYLEN(possiblelocations))) //Makes sure aren't spawning in nullspace. - var/chosen = pick(possiblelocations) - new /obj/structure/legionturret(chosen) - possiblelocations -= chosen - -/mob/living/simple_animal/hostile/megafauna/legion/GiveTarget(new_target) - . = ..() - if(target) - wander = TRUE - -///This makes sure that the legion door opens on taking damage, so you can't cheese this boss. -/mob/living/simple_animal/hostile/megafauna/legion/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(GLOB.necropolis_gate && true_spawn) - GLOB.necropolis_gate.toggle_the_gate(null, TRUE) //very clever. - return ..() - - -///In addition to parent functionality, this will also turn the target into a small legion if they are unconcious. -/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget() - . = ..() - if(!. || !ishuman(target)) - return - var/mob/living/living_target = target - switch(living_target.stat) - if(UNCONSCIOUS, HARD_CRIT) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/legion = new(loc) - legion.infest(living_target) - - -///Resets the charge buffs. -/mob/living/simple_animal/hostile/megafauna/legion/proc/reset_charge() - ranged = TRUE - retreat_distance = 5 - minimum_distance = 5 - set_varspeed(2) - charging = FALSE - -///Special snowflake death() here. Can only die if size is 1 or lower and HP is 0 or below. -/mob/living/simple_animal/hostile/megafauna/legion/death() - //Make sure we didn't get cheesed - if(health > 0) - return - if(Split()) - return - //We check what loot we should drop. - var/last_legion = TRUE - for(var/mob/living/simple_animal/hostile/megafauna/legion/other in GLOB.mob_living_list) - if(other != src) - last_legion = FALSE - break - if(last_legion) - loot = list(/obj/item/storm_staff) - elimination = FALSE - else if(prob(20)) //20% chance for sick lootz. - loot = list(/obj/structure/closet/crate/necropolis/tendril) - if(!true_spawn) - loot = null - return ..() - -///Splits legion into smaller skulls. -/mob/living/simple_animal/hostile/megafauna/legion/proc/Split() - size-- - switch(size) - if (LEGION_SMALL) - for (var/i in 0 to 2) - new /mob/living/simple_animal/hostile/megafauna/legion/small(loc) - if (LEGION_MEDIUM) - new /mob/living/simple_animal/hostile/megafauna/legion/medium/left(loc) - new /mob/living/simple_animal/hostile/megafauna/legion/medium/right(loc) - new /mob/living/simple_animal/hostile/megafauna/legion/medium/eye(loc) - -///A basic turret that shoots at nearby mobs. Intended to be used for the legion megafauna. -/obj/structure/legionturret - name = "\improper Legion sentinel" - desc = "The eye pierces your soul." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "legion_turret" - light_power = 0.5 - light_outer_range = 2 - max_integrity = 80 - luminosity = 6 - anchored = TRUE - density = TRUE - layer = ABOVE_OBJ_LAYER - armor = list(MELEE = 0, BULLET = 0, LASER = 100,ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - ///What kind of projectile the actual damaging part should be. - var/projectile_type = /obj/projectile/beam/legion - ///Time until the tracer gets shot - var/initial_firing_time = 18 - ///How long it takes between shooting the tracer and the projectile. - var/shot_delay = 8 - ///Compared with the targeted mobs. If they have the faction, turret won't shoot. - var/faction = list("mining") - -/obj/structure/legionturret/Initialize(mapload) - . = ..() - addtimer(CALLBACK(src, PROC_REF(set_up_shot)), initial_firing_time) - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -///Handles an extremely basic AI -/obj/structure/legionturret/proc/set_up_shot() - for(var/mob/living/L in oview(9, src)) - if(L.stat == DEAD || L.stat == UNCONSCIOUS) - continue - if(faction_check(faction, L.faction)) - continue - fire(L) - return - fire(get_edge_target_turf(src, pick(GLOB.cardinals))) - -///Called when attacking a target. Shoots a projectile at the turf underneath the target. -/obj/structure/legionturret/proc/fire(atom/target) - var/turf/T = get_turf(target) - var/turf/T1 = get_turf(src) - if(!T || !T1) - return - //Now we generate the tracer. - var/angle = get_angle(T1, T) - var/datum/point/vector/V = new(T1.x, T1.y, T1.z, 0, 0, angle) - generate_tracer_between_points(V, V.return_vector_after_increments(6), /obj/effect/projectile/tracer/legion/tracer, 0, shot_delay, 0, 0, 0, null) - playsound(src, 'sound/machines/doors/airlock_open.ogg', 100, TRUE) - addtimer(CALLBACK(src, PROC_REF(fire_beam), angle), shot_delay) - -///Called shot_delay after the turret shot the tracer. Shoots a projectile into the same direction. -/obj/structure/legionturret/proc/fire_beam(angle) - var/obj/projectile/ouchie = new projectile_type(loc) - ouchie.firer = src - ouchie.fire(angle) - playsound(src, 'sound/effects/bin_close.ogg', 100, TRUE) - QDEL_IN(src, 5) - -///Used for the legion turret. -/obj/projectile/beam/legion - name = "blood pulse" - hitsound = 'sound/magic/magic_missile.ogg' - damage = 19 - range = 6 - eyeblur = 0 - light_color = COLOR_SOFT_RED - impact_effect_type = /obj/effect/temp_visual/kinetic_blast - tracer_type = /obj/effect/projectile/tracer/legion - muzzle_type = /obj/effect/projectile/tracer/legion - impact_type = /obj/effect/projectile/tracer/legion - hitscan = TRUE - projectile_piercing = ALL - -///Used for the legion turret tracer. -/obj/effect/projectile/tracer/legion/tracer - icon = 'icons/effects/beam.dmi' - icon_state = "blood_light" - -///Used for the legion turret beam. -/obj/effect/projectile/tracer/legion - icon = 'icons/effects/beam.dmi' - icon_state = "blood" - -#undef LEGION_LARGE -#undef LEGION_MEDIUM -#undef LEGION_SMALL diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm deleted file mode 100644 index 30599eb57814..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm +++ /dev/null @@ -1,343 +0,0 @@ -#define WENDIGO_ENRAGED (health <= maxHealth*0.5) -#define WENDIGO_CIRCLE_SHOTCOUNT 24 -#define WENDIGO_CIRCLE_REPEATCOUNT 8 -#define WENDIGO_SPIRAL_SHOTCOUNT 40 -#define WENDIGO_WAVE_SHOTCOUNT 7 -#define WENDIGO_WAVE_REPEATCOUNT 32 -#define WENDIGO_SHOTGUN_SHOTCOUNT 5 - -/* - -Difficulty: Hard - -*/ - -/mob/living/simple_animal/hostile/megafauna/wendigo - name = "wendigo" - desc = "A mythological man-eating legendary creature, you probably aren't going to survive this." - health = 2500 - maxHealth = 2500 - icon_state = "wendigo" - icon_living = "wendigo" - icon_dead = "wendigo_dead" - icon = 'icons/mob/icemoon/64x64megafauna.dmi' - attack_verb_continuous = "claws" - attack_verb_simple = "claw" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_CLAW - weather_immunities = list(TRAIT_SNOWSTORM_IMMUNE) - speak_emote = list("roars") - armour_penetration = 40 - melee_damage_lower = 40 - melee_damage_upper = 40 - vision_range = 9 - aggro_vision_range = 18 // man-eating for a reason - speed = 6 - move_to_delay = 6 - rapid_melee = 8 // every 1/4 second - melee_queue_distance = 18 // as far as possible really, need this because of charging and teleports - ranged = TRUE - pixel_x = -16 - base_pixel_x = -16 - gps_name = "Berserk Signal" - loot = list() - butcher_results = list() - guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1, /obj/item/wendigo_skull = 1) - crusher_loot = list(/obj/item/crusher_trophy/wendigo_horn) - wander = FALSE - del_on_death = FALSE - blood_volume = BLOOD_VOLUME_NORMAL - achievement_type = /datum/award/achievement/boss/wendigo_kill - crusher_achievement_type = /datum/award/achievement/boss/wendigo_crusher - score_achievement_type = /datum/award/score/wendigo_score - deathmessage = "falls, shaking the ground around it" - deathsound = 'sound/effects/gravhit.ogg' - footstep_type = FOOTSTEP_MOB_HEAVY - attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp, - /datum/action/innate/megafauna_attack/teleport, - /datum/action/innate/megafauna_attack/shockwave_scream) - /// Saves the turf the megafauna was created at (spawns exit portal here) - var/turf/starting - /// Range for wendigo stomping when it moves - var/stomp_range = 1 - /// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved - var/stored_move_dirs = 0 - /// If the wendigo is allowed to move - var/can_move = TRUE - /// Time before the wendigo can scream again - var/scream_cooldown_time = 10 SECONDS - /// Stores the last scream time so it doesn't spam it - COOLDOWN_DECLARE(scream_cooldown) - -/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload) - . = ..() - ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) - -/datum/action/innate/megafauna_attack/heavy_stomp - name = "Heavy Stomp" - button_icon = 'icons/mob/actions/actions_items.dmi' - button_icon_state = "sniper_zoom" - chosen_message = "You are now stomping the ground around you." - chosen_attack_num = 1 - -/datum/action/innate/megafauna_attack/teleport - name = "Teleport" - button_icon = 'icons/effects/bubblegum.dmi' - button_icon_state = "smack ya one" - chosen_message = "You are now teleporting at the target you click on." - chosen_attack_num = 2 - -/datum/action/innate/megafauna_attack/shockwave_scream - name = "Shockwave Scream" - button_icon = 'icons/turf/walls/legacy/wall.dmi' - button_icon_state = "wall-0" - chosen_message = "You are now screeching, disorienting targets around you." - chosen_attack_num = 3 - -/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload) - . = ..() - starting = get_turf(src) - -/mob/living/simple_animal/hostile/megafauna/wendigo/OpenFire() - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 10 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 10 SECONDS)) - if(WENDIGO_ENRAGED) - speed = 4 - move_to_delay = 4 - else - stomp_range = initial(stomp_range) - speed = initial(speed) - move_to_delay = initial(move_to_delay) - - if(client) - switch(chosen_attack) - if(1) - heavy_stomp() - if(2) - try_teleport() - if(3) - shockwave_scream() - return - - if(COOLDOWN_FINISHED(src, scream_cooldown)) - chosen_attack = rand(1, 3) - else - chosen_attack = rand(1, 2) - switch(chosen_attack) - if(1) - heavy_stomp() - if(2) - try_teleport() - if(3) - do_teleport(src, starting, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) - shockwave_scream() - -/mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct) - if(!can_move) - return - stored_move_dirs |= direct - return ..() - -/mob/living/simple_animal/hostile/megafauna/wendigo/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - stored_move_dirs &= ~movement_dir - if(!stored_move_dirs) - INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(wendigo_slam), src, stomp_range, 1, 8) - -/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase -/proc/wendigo_slam(atom/source, range, delay, throw_range) - var/turf/orgin = get_turf(source) - if(!orgin) - return - var/list/all_turfs = RANGE_TURFS(range, orgin) - for(var/i = 0 to range) - playsound(orgin,'sound/effects/bamf.ogg', 600, TRUE, 10) - for(var/turf/stomp_turf in all_turfs) - if(get_dist(orgin, stomp_turf) > i) - continue - new /obj/effect/temp_visual/small_smoke/halfsecond(stomp_turf) - for(var/mob/living/L in stomp_turf) - if(L == source || L.throwing) - continue - to_chat(L, span_userdanger("[source]'s ground slam shockwave sends you flying!")) - var/turf/thrownat = get_ranged_target_turf_direct(source, L, throw_range, rand(-10, 10)) - L.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE) - L.apply_damage(20, BRUTE) - shake_camera(L, 2, 1) - all_turfs -= stomp_turf - sleep(delay) - -/// Larger but slower ground stomp -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp() - can_move = FALSE - wendigo_slam(src, 5, 3 - WENDIGO_ENRAGED, 8) - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS)) - can_move = TRUE - -/// Teleports to a location 4 turfs away from the enemy in view -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/try_teleport() - teleport(6) - if(WENDIGO_ENRAGED) - playsound(loc, 'sound/magic/clockwork/invoke_general.ogg', 100, TRUE) - for(var/shots in 1 to WENDIGO_SHOTGUN_SHOTCOUNT) - var/spread = shots * 10 - 30 - var/turf/startloc = get_step(get_turf(src), get_dir(src, target)) - var/turf/endloc = get_turf(target) - if(!endloc) - break - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.speed = 8 - shockwave.preparePixelProjectile(endloc, startloc, null, spread) - shockwave.firer = src - if(target) - shockwave.original = target - shockwave.fire() - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS)) - -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/teleport(range = 6) - var/list/possible_ends = view(range, target.loc) - view(range - 1, target.loc) - for(var/turf/closed/cant_teleport_turf in possible_ends) - possible_ends -= cant_teleport_turf - if(!possible_ends.len) - return - var/turf/end = pick(possible_ends) - do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE) - -/// Applies dizziness to all nearby enemies that can hear the scream and animates the wendigo shaking up and down as shockwave projectiles shoot outward -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/shockwave_scream() - can_move = FALSE - COOLDOWN_START(src, scream_cooldown, scream_cooldown_time) - SLEEP_CHECK_DEATH(5, src) - playsound(loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10) - animate(src, pixel_z = rand(5, 15), time = 1, loop = 20) - animate(pixel_z = 0, time = 1) - for(var/mob/living/dizzy_target in get_hearers_in_view(7, src) - src) - dizzy_target.set_timed_status_effect(12 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - to_chat(dizzy_target, span_danger("The wendigo screams loudly!")) - SLEEP_CHECK_DEATH(1 SECONDS, src) - spiral_attack() - update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 3 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 3 SECONDS)) - SLEEP_CHECK_DEATH(3 SECONDS, src) - can_move = TRUE - -/// Shoots shockwave projectiles in a random preset pattern -/mob/living/simple_animal/hostile/megafauna/wendigo/proc/spiral_attack() - var/list/choices = list("Alternating Circle", "Spiral") - if(WENDIGO_ENRAGED) - choices += "Wave" - var/spiral_type = pick(choices) - switch(spiral_type) - if("Alternating Circle") - var/shots_per = WENDIGO_CIRCLE_SHOTCOUNT - for(var/shoot_times in 1 to WENDIGO_CIRCLE_REPEATCOUNT) - var/offset = shoot_times % 2 - for(var/shot in 1 to shots_per) - var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5 - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.speed = 3 - WENDIGO_ENRAGED - shockwave.fire(angle) - SLEEP_CHECK_DEATH(6 - WENDIGO_ENRAGED * 2, src) - if("Spiral") - var/shots_spiral = WENDIGO_SPIRAL_SHOTCOUNT - var/angle_to_target = get_angle(src, target) - var/spiral_direction = pick(-1, 1) - for(var/shot in 1 to shots_spiral) - var/shots_per_tick = 5 - WENDIGO_ENRAGED * 3 - var/angle_change = (5 + WENDIGO_ENRAGED * shot / 6) * spiral_direction - for(var/count in 1 to shots_per_tick) - var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.damage = 15 - shockwave.fire(angle) - SLEEP_CHECK_DEATH(1, src) - if("Wave") - var/shots_per = WENDIGO_WAVE_SHOTCOUNT - var/difference = 360 / shots_per - var/wave_direction = pick(-1, 1) - for(var/shoot_times in 1 to WENDIGO_WAVE_REPEATCOUNT) - for(var/shot in 1 to shots_per) - var/angle = shot * difference + shoot_times * 5 * wave_direction * -1 - var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc) - shockwave.firer = src - shockwave.wave_movement = TRUE - shockwave.speed = 8 - shockwave.wave_speed = 10 * wave_direction - shockwave.fire(angle) - SLEEP_CHECK_DEATH(2, src) - -/mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant) - if(health > 0) - return - var/obj/effect/portal/permanent/one_way/exit = new /obj/effect/portal/permanent/one_way(starting) - exit.id = "wendigo arena exit" - exit.add_atom_colour(COLOR_RED_LIGHT, ADMIN_COLOUR_PRIORITY) - exit.set_light(l_outer_range = 20, l_power = 1, l_color = COLOR_SOFT_RED) - return ..() - -/obj/projectile/colossus/wendigo_shockwave - name = "wendigo shockwave" - /// If wave movement is enabled - var/wave_movement = FALSE - /// Amount the angle changes every pixel move - var/wave_speed = 15 - /// Amount of movements this projectile has made - var/pixel_moves = 0 - -/obj/projectile/colossus/wendigo_shockwave/pixel_move(trajectory_multiplier, hitscanning = FALSE) - . = ..() - if(wave_movement) - pixel_moves++ - set_angle(original_angle + pixel_moves * wave_speed) - -/obj/item/wendigo_blood - name = "bottle of wendigo blood" - desc = "You're not actually going to drink this, are you?" - icon = 'icons/obj/wizard.dmi' - icon_state = "vial" - -/obj/item/wendigo_blood/attack_self(mob/living/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/human_user = user - if(!human_user.mind) - return - to_chat(human_user, span_danger("Power courses through you! You can now shift your form at will.")) - var/datum/action/cooldown/spell/shapeshift/polar_bear/transformation_spell = new(user.mind || user) - transformation_spell.Grant(user) - playsound(human_user.loc, 'sound/items/drink.ogg', rand(10,50), TRUE) - qdel(src) - -/obj/item/crusher_trophy/wendigo_horn - name = "wendigo horn" - desc = "A horn from the head of an unstoppable beast." - icon_state = "wendigo_horn" - denied_type = /obj/item/crusher_trophy/wendigo_horn - -/obj/item/crusher_trophy/wendigo_horn/effect_desc() - return "melee hits inflict twice as much damage" - -/obj/item/crusher_trophy/wendigo_horn/add_to(obj/item/kinetic_crusher/crusher, mob/living/user) - . = ..() - if(.) - crusher.AddComponent(/datum/component/two_handed, force_wielded=40) - -/obj/item/crusher_trophy/wendigo_horn/remove_from(obj/item/kinetic_crusher/crusher, mob/living/user) - . = ..() - if(.) - crusher.AddComponent(/datum/component/two_handed, force_wielded=20) - -/obj/item/wendigo_skull - name = "wendigo skull" - desc = "A skull of a massive hulking beast." - icon = 'icons/obj/ice_moon/artifacts.dmi' - icon_state = "wendigo_skull" - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - -#undef WENDIGO_CIRCLE_SHOTCOUNT -#undef WENDIGO_CIRCLE_REPEATCOUNT -#undef WENDIGO_SPIRAL_SHOTCOUNT -#undef WENDIGO_WAVE_SHOTCOUNT -#undef WENDIGO_WAVE_REPEATCOUNT -#undef WENDIGO_SHOTGUN_SHOTCOUNT diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index b0512edbe159..15514b0a4a8a 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -19,7 +19,7 @@ harm_intent_damage = 5 melee_damage_lower = 8 melee_damage_upper = 12 - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH emote_taunt = list("growls") speak_emote = list("creaks") taunt_chance = 30 @@ -383,7 +383,7 @@ GLOBAL_LIST_INIT(mimic_blacklist, list(/obj/structure/table, /obj/structure/cabl for(var/mob/living/M in contents) if(++mobs_stored >= mob_storage_capacity) return FALSE - L.stop_pulling() + L.release_all_grabs() else if(istype(AM, /obj/structure/closet)) return FALSE 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 69d40aa8cf46..b6208bc48811 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 @@ -120,9 +120,8 @@ speak_emote = list("telepathically cries") attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = null // doesn't bite unlike the parent type. - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 - crusher_loot = /obj/item/crusher_trophy/watcher_wing gold_core_spawnable = NO_SPAWN loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) @@ -166,13 +165,11 @@ icon_dead = "watcher_magmawing_dead" maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health health = 215 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 3 light_power = 2.5 light_color = LIGHT_COLOR_LAVA projectiletype = /obj/projectile/temp/basilisk/magmawing - crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing - crusher_drop_mod = 60 /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing name = "icewing watcher" @@ -185,8 +182,6 @@ health = 170 projectiletype = /obj/projectile/temp/basilisk/icewing butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable - crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing - crusher_drop_mod = 30 /obj/projectile/temp/basilisk/magmawing name = "scorching blast" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm index 0a3ec8af0bd3..e1e9d3d1860b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/brimdemon.dm @@ -13,7 +13,7 @@ emote_taunt = list("screeches") emote_hear = list("cackles","screeches") combat_mode = TRUE - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS ranged_cooldown_time = 5 SECONDS vision_range = 9 retreat_distance = 2 @@ -38,7 +38,6 @@ light_color = LIGHT_COLOR_BLOOD_MAGIC light_power = 5 light_outer_range = 1.4 - crusher_loot = /obj/item/crusher_trophy/brimdemon_fang /// Are we charging/firing? If yes stops our movement. var/firing = FALSE /// A list of all the beam parts. @@ -181,20 +180,6 @@ hit_mob.adjustFireLoss(5) to_chat(hit_mob, span_danger("You're damaged by [src]!")) -/obj/item/crusher_trophy/brimdemon_fang - name = "brimdemon's fang" - icon_state = "brimdemon_fang" - desc = "A fang from a brimdemon's corpse." - denied_type = /obj/item/crusher_trophy/brimdemon_fang - var/static/list/comic_phrases = list("BOOM", "BANG", "KABLOW", "KAPOW", "OUCH", "BAM", "KAPOW", "WHAM", "POW", "KABOOM") - -/obj/item/crusher_trophy/brimdemon_fang/effect_desc() - return "mark detonation creates visual and audiosensory effects on the target" - -/obj/item/crusher_trophy/brimdemon_fang/on_mark_detonation(mob/living/target, mob/living/user) - target.balloon_alert_to_viewers("[pick(comic_phrases)]!") - playsound(target, 'sound/lavaland/brimdemon_crush.ogg', 100) - /obj/effect/decal/cleanable/brimdust name = "brimdust" desc = "Dust from a brimdemon. It is considered valuable for its' botanical abilities." 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 deleted file mode 100644 index d9f2273e1693..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ /dev/null @@ -1,404 +0,0 @@ -#define TUMOR_INACTIVE 0 -#define TUMOR_ACTIVE 1 -#define TUMOR_PASSIVE 2 - -//Elite mining mobs -/mob/living/simple_animal/hostile/asteroid/elite - name = "elite" - desc = "An elite monster, found in one of the strange tumors on lavaland." - icon = 'icons/mob/lavaland/lavaland_elites.dmi' - faction = list("boss") - robust_searching = TRUE - ranged_ignores_vision = TRUE - ranged = TRUE - obj_damage = 30 - vision_range = 6 - aggro_vision_range = 18 - environment_smash = ENVIRONMENT_SMASH_NONE //This is to prevent elites smashing up the mining station (entirely), we'll make sure they can smash minerals fine below. - harm_intent_damage = 0 //Punching elites gets you nowhere - stat_attack = HARD_CRIT - layer = LARGE_MOB_LAYER - sentience_type = SENTIENCE_BOSS - var/chosen_attack = 1 - var/list/attack_action_types = list() - var/can_talk = FALSE - var/obj/loot_drop = null - -//Gives player-controlled variants the ability to swap attacks -/mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) - . = ..() - for(var/action_type in attack_action_types) - var/datum/action/innate/elite_attack/attack_action = new action_type() - attack_action.Grant(src) - -//Prevents elites from attacking members of their faction (can't hurt themselves either) and lets them mine rock with an attack despite not being able to smash walls. -/mob/living/simple_animal/hostile/asteroid/elite/AttackingTarget() - if(istype(target, /mob/living/simple_animal/hostile)) - var/mob/living/simple_animal/hostile/M = target - if(faction_check_mob(M)) - return FALSE - if(istype(target, /obj/structure/elite_tumor)) - var/obj/structure/elite_tumor/T = target - if(T.mychild == src && T.activity == TUMOR_PASSIVE) - var/elite_remove = tgui_alert(usr,"Re-enter the tumor?", "Despawn yourself?", list("Yes", "No")) - if(elite_remove == "No" || QDELETED(src) || !Adjacent(T)) - return - T.mychild = null - T.activity = TUMOR_INACTIVE - T.icon_state = "advanced_tumor" - qdel(src) - return FALSE - . = ..() - if(ismineralturf(target)) - var/turf/closed/mineral/M = target - M.gets_drilled() - if(istype(target, /obj/vehicle/sealed/mecha)) - var/obj/vehicle/sealed/mecha/M = target - M.take_damage(50, BRUTE, MELEE, 1) - -//Elites can't talk (normally)! -/mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) - if(can_talk) - . = ..() - return TRUE - return FALSE - -/*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup. -While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/ - -/datum/action/innate/elite_attack - name = "Elite Attack" - button_icon = 'icons/mob/actions/actions_elites.dmi' - button_icon_state = "" - background_icon_state = "bg_default" - overlay_icon_state = "bg_default_border" - ///The displayed message into chat when this attack is selected - var/chosen_message - ///The internal attack ID for the elite's OpenFire() proc to use - var/chosen_attack_num = 0 - -/datum/action/innate/elite_attack/create_button() - var/atom/movable/screen/movable/action_button/button = ..() - button.maptext = "" - button.maptext_x = 6 - button.maptext_y = 2 - button.maptext_width = 24 - button.maptext_height = 12 - return button - -/datum/action/innate/elite_attack/process() - if(isnull(owner)) - STOP_PROCESSING(SSfastprocess, src) - qdel(src) - return - - build_all_button_icons(UPDATE_BUTTON_STATUS) - -/datum/action/innate/elite_attack/update_button_status(atom/movable/screen/movable/action_button/button, force = FALSE) - var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner - if(!istype(owner)) - button.maptext = "" - return - - var/timeleft = max(elite_owner.ranged_cooldown - world.time, 0) - if(timeleft == 0) - button.maptext = "" - else - button.maptext = MAPTEXT("[round(timeleft/10, 0.1)]") - -/datum/action/innate/elite_attack/Grant(mob/living/L) - if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) - START_PROCESSING(SSfastprocess, src) - return ..() - return FALSE - -/datum/action/innate/elite_attack/Activate() - var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner - elite_owner.chosen_attack = chosen_attack_num - to_chat(elite_owner, chosen_message) - -//The Pulsing Tumor, the actual "spawn-point" of elites, handles the spawning, arena, and procs for dealing with basic scenarios. - -/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, FIRE = 100, ACID = 100) - resistance_flags = INDESTRUCTIBLE - icon = 'icons/obj/lavaland/tumor.dmi' - icon_state = "tumor" - pixel_x = -16 - base_pixel_x = -16 - light_color = COLOR_SOFT_RED - light_outer_range = 3 - anchored = TRUE - density = FALSE - var/activity = TUMOR_INACTIVE - var/boosted = FALSE - var/times_won = 0 - var/mob/living/carbon/human/activator - var/mob/living/simple_animal/hostile/asteroid/elite/mychild = null - ///List of all potentially spawned elites - var/potentialspawns = list( - /mob/living/simple_animal/hostile/asteroid/elite/broodmother, - /mob/living/simple_animal/hostile/asteroid/elite/pandora, - /mob/living/simple_animal/hostile/asteroid/elite/legionnaire, - /mob/living/simple_animal/hostile/asteroid/elite/herald, - ) - -/obj/structure/elite_tumor/attack_hand(mob/user, list/modifiers) - . = ..() - if(!ishuman(user)) - return - switch(activity) - if(TUMOR_PASSIVE) - // Prevents the user from being forcemoved back and forth between two elite arenas. - if(HAS_TRAIT(user, TRAIT_ELITE_CHALLENGER)) - user.visible_message(span_warning("[user] reaches for [src] with [user.p_their()] arm, but nothing happens."), - span_warning("You reach for [src] with your arm... but nothing happens.")) - return - activity = TUMOR_ACTIVE - user.visible_message(span_boldwarning("[src] convulses as [user]'s arm enters its radius. Uh-oh..."), - span_boldwarning("[src] convulses as your arm enters its radius. Your instincts tell you to step back.")) - make_activator(user) - if(boosted) - mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) - to_chat(mychild, "Someone has activated your tumor. You will be returned to fight shortly, get ready!") - addtimer(CALLBACK(src, PROC_REF(return_elite)), 30) - INVOKE_ASYNC(src, PROC_REF(arena_checks)) - if(TUMOR_INACTIVE) - if(HAS_TRAIT(user, TRAIT_ELITE_CHALLENGER)) - user.visible_message(span_warning("[user] reaches for [src] with [user.p_their()] arm, but nothing happens."), - span_warning("You reach for [src] with your arm... but nothing happens.")) - return - activity = TUMOR_ACTIVE - var/mob/dead/observer/elitemind = null - visible_message(span_boldwarning("[src] begins to convulse. Your instincts tell you to step back.")) - make_activator(user) - if(!boosted) - addtimer(CALLBACK(src, PROC_REF(spawn_elite)), 30) - return - visible_message(span_boldwarning("Something within [src] stirs...")) - var/list/candidates = poll_candidates_for_mob("Do you want to play as a lavaland elite?", ROLE_SENTIENCE, ROLE_SENTIENCE, 5 SECONDS, src, POLL_IGNORE_SENTIENCE_POTION) - if(candidates.len) - audible_message(span_boldwarning("The stirring sounds increase in volume!")) - elitemind = pick(candidates) - elitemind.playsound_local(get_turf(elitemind), 'sound/effects/magic.ogg', 40, 0) - to_chat(elitemind, "You have been chosen to play as a Lavaland Elite.\nIn a few seconds, you will be summoned on Lavaland as a monster to fight your activator, in a fight to the death.\n\ - Your attacks can be switched using the buttons on the top left of the HUD, and used by clicking on targets or tiles similar to a gun.\n\ - While the opponent might have an upper hand with powerful mining equipment and tools, you have great power normally limited by AI mobs.\n\ - If you want to win, you'll have to use your powers in creative ways to ensure the kill. It's suggested you try using them all as soon as possible.\n\ - Should you win, you'll receive extra information regarding what to do after. Good luck!") - addtimer(CALLBACK(src, PROC_REF(spawn_elite), elitemind), 100) - else - visible_message(span_boldwarning("The stirring stops, and nothing emerges. Perhaps try again later.")) - activity = TUMOR_INACTIVE - clear_activator(user) - -/obj/structure/elite_tumor/proc/spawn_elite(mob/dead/observer/elitemind) - var/selectedspawn = pick(potentialspawns) - mychild = new selectedspawn(loc) - visible_message(span_boldwarning("[mychild] emerges from [src]!")) - playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) - if(boosted) - mychild.key = elitemind.key - mychild.sentience_act() - notify_ghosts("\A [mychild] has been awakened in \the [get_area(src)]!", source = mychild, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Lavaland Elite awakened") - icon_state = "tumor_popped" - RegisterSignal(mychild, COMSIG_PARENT_QDELETING, PROC_REF(onEliteLoss)) - INVOKE_ASYNC(src, PROC_REF(arena_checks)) - -/obj/structure/elite_tumor/proc/return_elite() - mychild.forceMove(loc) - visible_message(span_boldwarning("[mychild] emerges from [src]!")) - playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) - mychild.revive(full_heal = TRUE, admin_revive = TRUE) - if(boosted) - mychild.maxHealth = mychild.maxHealth * 2 - mychild.health = mychild.maxHealth - notify_ghosts("\A [mychild] has been challenged in \the [get_area(src)]!", source = mychild, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Lavaland Elite challenged") - -/obj/structure/elite_tumor/Initialize(mapload) - . = ..() - AddComponent(/datum/component/gps, "Menacing Signal") - START_PROCESSING(SSobj, src) - -/obj/structure/elite_tumor/Destroy() - STOP_PROCESSING(SSobj, src) - mychild = null - clear_activator(activator) - return ..() - -/obj/structure/elite_tumor/proc/make_activator(mob/user) - if(activator) - return - activator = user - ADD_TRAIT(user, TRAIT_ELITE_CHALLENGER, REF(src)) - RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(clear_activator)) - -/obj/structure/elite_tumor/proc/clear_activator(mob/source) - SIGNAL_HANDLER - if(!activator) - return - activator = null - REMOVE_TRAIT(source, TRAIT_ELITE_CHALLENGER, REF(src)) - UnregisterSignal(source, COMSIG_PARENT_QDELETING) - -/obj/structure/elite_tumor/process(delta_time) - if(!isturf(loc)) - return - - for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc) - if(elitehere == mychild && activity == TUMOR_PASSIVE) - 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" - -/obj/structure/elite_tumor/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if(istype(attacking_item, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) - var/obj/item/organ/regenerative_core/core = attacking_item - visible_message(span_boldwarning("As [user] drops the core into [src], [src] appears to swell.")) - icon_state = "advanced_tumor" - boosted = TRUE - set_light_range(6) - desc = "[desc] This one seems to glow with a strong intensity." - qdel(core) - return TRUE - -/obj/structure/elite_tumor/proc/arena_checks() - if(activity != TUMOR_ACTIVE || QDELETED(src)) - return - INVOKE_ASYNC(src, PROC_REF(fighters_check)) //Checks to see if our fighters died. - INVOKE_ASYNC(src, PROC_REF(arena_trap)) //Gets another arena trap queued up for when this one runs out. - INVOKE_ASYNC(src, PROC_REF(border_check)) //Checks to see if our fighters got out of the arena somehow. - if(!QDELETED(src)) - addtimer(CALLBACK(src, PROC_REF(arena_checks)), 50) - -/obj/structure/elite_tumor/proc/fighters_check() - if(QDELETED(mychild) || mychild.stat == DEAD) - onEliteLoss() - return - if(QDELETED(activator) || activator.stat == DEAD || (activator.health <= HEALTH_THRESHOLD_DEAD && HAS_TRAIT(activator, TRAIT_NODEATH))) - if(!QDELETED(activator) && HAS_TRAIT(activator, TRAIT_NODEATH)) // dust the unkillable activator - activator.dust(drop_items = TRUE) - onEliteWon() - -/obj/structure/elite_tumor/proc/arena_trap() - var/turf/tumor_turf = get_turf(src) - if(loc == null) - return - var/datum/weakref/activator_ref = WEAKREF(activator) - var/datum/weakref/mychild_ref = WEAKREF(mychild) - for(var/tumor_range_turfs in RANGE_TURFS(12, tumor_turf)) - if(get_dist(tumor_range_turfs, tumor_turf) == 12) - var/obj/effect/temp_visual/elite_tumor_wall/newwall - newwall = new /obj/effect/temp_visual/elite_tumor_wall(tumor_range_turfs, src) - newwall.activator_ref = activator_ref - newwall.ourelite_ref = mychild_ref - -/obj/structure/elite_tumor/proc/border_check() - if(activator != null && get_dist(src, activator) >= 12) - activator.forceMove(loc) - visible_message(span_boldwarning("[activator] suddenly reappears above [src]!")) - playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) - if(mychild != null && get_dist(src, mychild) >= 12) - mychild.forceMove(loc) - visible_message(span_boldwarning("[mychild] suddenly reappears above [src]!")) - playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) - -/obj/structure/elite_tumor/proc/onEliteLoss() - playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE) - visible_message(span_boldwarning("[src] begins to convulse violently before beginning to dissipate.")) - visible_message(span_boldwarning("As [src] closes, something is forced up from down below.")) - var/obj/structure/closet/crate/necropolis/tendril/lootbox = new /obj/structure/closet/crate/necropolis/tendril(loc) - if(boosted) - if(mychild.loot_drop != null && prob(50)) - new mychild.loot_drop(lootbox) - else - new /obj/item/tumor_shard(lootbox) - qdel(src) - -/obj/structure/elite_tumor/proc/onEliteWon() - activity = TUMOR_PASSIVE - clear_activator(activator) - mychild.revive(full_heal = TRUE, admin_revive = TRUE) - if(boosted) - times_won++ - mychild.maxHealth = mychild.maxHealth * 0.4 - mychild.health = mychild.maxHealth - if(times_won == 1) - mychild.playsound_local(get_turf(mychild), 'sound/effects/magic.ogg', 40, 0) - to_chat(mychild, span_boldwarning("As the life in the activator's eyes fade, the forcefield around you dies out and you feel your power subside.\n\ - Despite this inferno being your home, you feel as if you aren't welcome here anymore.\n\ - Without any guidance, your purpose is now for you to decide.")) - to_chat(mychild, "Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\n\ - Bear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\n\ - Also, be weary of your fellow inhabitants, they likely won't be happy to see you!") - to_chat(mychild, "Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!") - -/obj/item/tumor_shard - name = "tumor shard" - desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "crevice_shard" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - inhand_icon_state = "screwdriver_head" - throwforce = 5 - w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 - throw_range = 5 - -/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) - . = ..() - if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) - var/mob/living/simple_animal/hostile/asteroid/elite/E = target - if(E.stat != DEAD || E.sentience_type != SENTIENCE_BOSS || !E.key) - user.visible_message(span_notice("It appears [E] is unable to be revived right now. Perhaps try again later.")) - return - E.faction = list("[REF(user)]") - E.revive(full_heal = TRUE, admin_revive = TRUE) - user.visible_message(span_notice("[user] stabs [E] with [src], reviving it.")) - E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0) - to_chat(E, "You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.") - to_chat(E, "Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!") - E.maxHealth = E.maxHealth * 0.4 - E.health = E.maxHealth - E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." - E.sentience_type = SENTIENCE_ORGANIC - qdel(src) - else - to_chat(user, span_info("[src] only works on the corpse of a sentient lavaland elite.")) - -/obj/effect/temp_visual/elite_tumor_wall - name = "magic wall" - icon = 'icons/turf/walls/legacy/hierophant_wall_temp.dmi' - icon_state = "hierophant_wall_temp-0" - base_icon_state = "hierophant_wall_temp" - smoothing_flags = SMOOTH_BITMASK - smoothing_groups = list(SMOOTH_GROUP_HIERO_WALL) - canSmoothWith = list(SMOOTH_GROUP_HIERO_WALL) - duration = 50 - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - color = rgb(255,0,0) - light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE - light_color = COLOR_SOFT_RED - var/datum/weakref/activator_ref - var/datum/weakref/ourelite_ref - -/obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) - . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) - QUEUE_SMOOTH(src) - -/obj/effect/temp_visual/elite_tumor_wall/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) - QUEUE_SMOOTH_NEIGHBORS(src) - return ..() - -/obj/effect/temp_visual/elite_tumor_wall/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(mover == ourelite_ref.resolve() || mover == activator_ref.resolve()) - return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm deleted file mode 100644 index 2e30bd5bbb35..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm +++ /dev/null @@ -1,266 +0,0 @@ -#define TENTACLE_PATCH 1 -#define SPAWN_CHILDREN 2 -#define RAGE 3 -#define CALL_CHILDREN 4 - -/** - * # Goliath Broodmother - * - * A stronger, faster variation of the goliath. Has the ability to spawn baby goliaths, which it can later detonate at will. - * When it's health is below half, tendrils will spawn randomly around it. When it is below a quarter of health, this effect is doubled. - * It's attacks are as follows: - * - Spawns a 3x3/plus shape of tentacles on the target location - * - Spawns 2 baby goliaths on its tile, up to a max of 8. Children blow up when they die. - * - The broodmother lets out a noise, and is able to move faster for 6.5 seconds. - * - Summons your children around you. - * The broodmother is a fight revolving around stage control, as the activator has to manage the baby goliaths and the broodmother herself, along with all the tendrils. - */ - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother - name = "goliath broodmother" - desc = "An example of sexual dimorphism, this female goliath looks much different than the males of her species. She is, however, just as dangerous, if not more." - gender = FEMALE - icon_state = "broodmother" - icon_living = "broodmother" - icon_aggro = "broodmother" - icon_dead = "egg_sac" - icon_gib = "syndicate_gib" - health_doll_icon = "broodmother" - maxHealth = 1000 - health = 1000 - melee_damage_lower = 30 - melee_damage_upper = 30 - armour_penetration = 30 - attack_verb_continuous = "beats down on" - attack_verb_simple = "beat down on" - attack_sound = 'sound/weapons/punch1.ogg' - throw_message = "does nothing to the rocky hide of the" - speed = 2 - move_to_delay = 5 - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - deathmessage = "explodes into gore!" - loot_drop = /obj/item/crusher_trophy/broodmother_tongue - - attack_action_types = list(/datum/action/innate/elite_attack/tentacle_patch, - /datum/action/innate/elite_attack/spawn_children, - /datum/action/innate/elite_attack/rage, - /datum/action/innate/elite_attack/call_children) - - var/rand_tent = 0 - var/list/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/children_list = list() - -/datum/action/innate/elite_attack/tentacle_patch - name = "Tentacle Patch" - button_icon_state = "tentacle_patch" - chosen_message = "You are now attacking with a patch of tentacles." - chosen_attack_num = TENTACLE_PATCH - -/datum/action/innate/elite_attack/spawn_children - name = "Spawn Children" - button_icon_state = "spawn_children" - chosen_message = "You will spawn two children at your location to assist you in combat. You can have up to 8." - chosen_attack_num = SPAWN_CHILDREN - -/datum/action/innate/elite_attack/rage - name = "Rage" - button_icon_state = "rage" - chosen_message = "You will temporarily increase your movement speed." - chosen_attack_num = RAGE - -/datum/action/innate/elite_attack/call_children - name = "Call Children" - button_icon_state = "call_children" - chosen_message = "You will summon your children to your location." - chosen_attack_num = CALL_CHILDREN - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/OpenFire() - if(client) - switch(chosen_attack) - if(TENTACLE_PATCH) - tentacle_patch(target) - if(SPAWN_CHILDREN) - spawn_children() - if(RAGE) - rage() - if(CALL_CHILDREN) - call_children() - return - var/aiattack = rand(1,4) - switch(aiattack) - if(TENTACLE_PATCH) - tentacle_patch(target) - if(SPAWN_CHILDREN) - spawn_children() - if(RAGE) - rage() - if(CALL_CHILDREN) - call_children() - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(!.) //Checks if they are dead as a rock. - return - if(health < maxHealth * 0.5 && rand_tent < world.time) - rand_tent = world.time + 30 - var/tentacle_amount = 5 - if(health < maxHealth * 0.25) - tentacle_amount = 10 - var/tentacle_loc = spiral_range_turfs(5, get_turf(src)) - for(var/i in 1 to tentacle_amount) - var/turf/t = pick_n_take(tentacle_loc) - new /obj/effect/temp_visual/goliath_tentacle/broodmother(t, src) - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/tentacle_patch(target) - ranged_cooldown = world.time + 15 - var/tturf = get_turf(target) - if(!isturf(tturf)) - return - visible_message(span_warning("[src] digs its tentacles under [target]!")) - new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(tturf, src) - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/spawn_children(target) - ranged_cooldown = world.time + 40 - visible_message(span_boldwarning("The ground churns behind [src]!")) - for(var/i in 1 to 2) - if(children_list.len >= 8) - return - var/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/newchild = new /mob/living/simple_animal/hostile/asteroid/elite/broodmother_child(loc) - newchild.GiveTarget(target) - newchild.faction = faction.Copy() - visible_message(span_boldwarning("[newchild] appears below [src]!")) - newchild.mother = src - children_list += newchild - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/rage() - ranged_cooldown = world.time + 100 - playsound(src,'sound/voice/insane_low_laugh.ogg', 200, 1) - visible_message(span_warning("[src] starts picking up speed!")) - color = "#FF0000" - set_varspeed(0) - move_to_delay = 3 - addtimer(CALLBACK(src, PROC_REF(reset_rage)), 65) - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/reset_rage() - color = "#FFFFFF" - set_varspeed(2) - move_to_delay = 5 - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother/proc/call_children() - ranged_cooldown = world.time + 60 - visible_message(span_warning("The ground shakes near [src]!")) - var/list/directions = GLOB.cardinals.Copy() + GLOB.diagonals.Copy() - for(var/mob/child in children_list) - var/spawndir = pick_n_take(directions) - var/turf/T = get_step(src, spawndir) - if(T) - child.forceMove(T) - playsound(src, 'sound/effects/bamf.ogg', 100, 1) - -//The goliath's children. Pretty weak, simple mobs which are able to put a single tentacle under their target when at range. -/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child - name = "baby goliath" - desc = "A young goliath recently born from it's mother. While they hatch from eggs, said eggs are incubated in the mother until they are ready to be born." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "goliath_baby" - icon_living = "goliath_baby" - icon_aggro = "goliath_baby" - icon_dead = "goliath_baby_dead" - icon_gib = "syndicate_gib" - maxHealth = 30 - health = 30 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "bashes against" - attack_verb_simple = "bash against" - attack_sound = 'sound/weapons/punch1.ogg' - throw_message = "does nothing to the rocky hide of the" - speed = 2 - move_to_delay = 5 - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - butcher_results = list() - guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) - deathmessage = "falls to the ground." - status_flags = CANPUSH - var/mob/living/simple_animal/hostile/asteroid/elite/broodmother/mother = null - -/mob/living/simple_animal/hostile/asteroid/elite/broodmother_child/OpenFire(target) - ranged_cooldown = world.time + 40 - var/tturf = get_turf(target) - if(!isturf(tturf)) - return - if(get_dist(src, target) <= 7)//Screen range check, so it can't attack people off-screen - visible_message(span_warning("[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(span_warning("[src] explodes!")) - explosion(src, 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() - var/latched = FALSE - for(var/mob/living/L in loc) - if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD) - continue - visible_message(span_danger("[src] grabs hold of [L]!")) - L.Stun(10) - L.adjustBruteLoss(rand(30,35)) - latched = TRUE - if(!latched) - retract() - else - deltimer(timerid) - timerid = addtimer(CALLBACK(src, PROC_REF(retract)), 10, TIMER_STOPPABLE) - -/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/Initialize(mapload, new_spawner) - . = ..() - INVOKE_ASYNC(src, PROC_REF(createpatch)) - -/obj/effect/temp_visual/goliath_tentacle/broodmother/patch/proc/createpatch() - var/tentacle_locs = spiral_range_turfs(1, get_turf(src)) - for(var/T in tentacle_locs) - new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) - var/list/directions = GLOB.cardinals.Copy() - for(var/i in directions) - var/turf/T = get_step(get_turf(src), i) - T = get_step(T, i) - new /obj/effect/temp_visual/goliath_tentacle/broodmother(T, spawner) - -// Broodmother's loot: Broodmother Tongue -/obj/item/crusher_trophy/broodmother_tongue - name = "broodmother tongue" - desc = "The tongue of a broodmother. If attached a certain way, makes for a suitable crusher trophy. It also feels very spongey, I wonder what would happen if you squeezed it?..." - icon = 'icons/obj/lavaland/elite_trophies.dmi' - icon_state = "broodmother_tongue" - denied_type = /obj/item/crusher_trophy/broodmother_tongue - bonus_value = 10 - /// Time at which the item becomes usable again - var/use_time - -/obj/item/crusher_trophy/broodmother_tongue/effect_desc() - return "mark detonation to have a [bonus_value]% chance to summon a patch of goliath tentacles at the target's location" - -/obj/item/crusher_trophy/broodmother_tongue/on_mark_detonation(mob/living/target, mob/living/user) - if(rand(1, 100) <= bonus_value && target.stat != DEAD) - new /obj/effect/temp_visual/goliath_tentacle/broodmother/patch(get_turf(target), user) - -/obj/item/crusher_trophy/broodmother_tongue/attack_self(mob/user) - if(!isliving(user)) - return - var/mob/living/living_user = user - if(use_time > world.time) - to_chat(living_user, "The tongue looks dried out. You'll need to wait longer to use it again.") - return - else if(HAS_TRAIT(living_user, TRAIT_LAVA_IMMUNE)) - to_chat(living_user, "You stare at the tongue. You don't think this is any use to you.") - return - ADD_TRAIT(living_user, TRAIT_LAVA_IMMUNE, type) - to_chat(living_user, "You squeeze the tongue, and some transluscent liquid shoots out all over you.") - addtimer(TRAIT_CALLBACK_REMOVE(user, TRAIT_LAVA_IMMUNE, type), 10 SECONDS) - use_time = world.time + 60 SECONDS 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 deleted file mode 100644 index 63b06ea9e617..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm +++ /dev/null @@ -1,279 +0,0 @@ -#define HERALD_TRISHOT 1 -#define HERALD_DIRECTIONALSHOT 2 -#define HERALD_TELESHOT 3 -#define HERALD_MIRROR 4 - -/** - * # Herald - * - * A slow-moving projectile user with a few tricks up it's sleeve. Less unga-bunga than Colossus, with more cleverness in it's fighting style. - * As it's health gets lower, the amount of projectiles fired per-attack increases. - * It's attacks are as follows: - * - Fires three projectiles in a given direction. - * - Fires a spread in every cardinal and diagonal direction at once, then does it again after a bit. - * - Shoots a single, golden bolt. Wherever it lands, the herald will be teleported to the location. - * - Spawns a mirror which reflects projectiles directly at the target. - * Herald is a more concentrated variation of the Colossus fight, having less projectiles overall, but more focused attacks. - */ - -/mob/living/simple_animal/hostile/asteroid/elite/herald - name = "herald" - desc = "A monstrous beast which fires deadly projectiles at threats and prey." - icon_state = "herald" - icon_living = "herald" - icon_aggro = "herald" - icon_dead = "herald_dying" - icon_gib = "syndicate_gib" - health_doll_icon = "herald" - maxHealth = 1000 - health = 1000 - melee_damage_lower = 20 - melee_damage_upper = 20 - attack_verb_continuous = "preaches to" - attack_verb_simple = "preach to" - attack_sound = 'sound/magic/clockwork/ratvar_attack.ogg' - throw_message = "doesn't affect the purity of" - speed = 2 - move_to_delay = 10 - mouse_opacity = MOUSE_OPACITY_ICON - deathsound = 'sound/magic/demon_dies.ogg' - deathmessage = "begins to shudder as it becomes transparent..." - loot_drop = /obj/item/clothing/neck/cloak/herald_cloak - - can_talk = 1 - - attack_action_types = list(/datum/action/innate/elite_attack/herald_trishot, - /datum/action/innate/elite_attack/herald_directionalshot, - /datum/action/innate/elite_attack/herald_teleshot, - /datum/action/innate/elite_attack/herald_mirror) - - var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/my_mirror = null - var/is_mirror = FALSE - -/mob/living/simple_animal/hostile/asteroid/elite/herald/death() - . = ..() - if(!is_mirror) - addtimer(CALLBACK(src, PROC_REF(become_ghost)), 8) - if(my_mirror != null) - qdel(my_mirror) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/become_ghost() - icon_state = "herald_ghost" - -/mob/living/simple_animal/hostile/asteroid/elite/herald/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) - . = ..() - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - -/datum/action/innate/elite_attack/herald_trishot - name = "Triple Shot" - button_icon_state = "herald_trishot" - chosen_message = "You are now firing three shots in your chosen direction." - chosen_attack_num = HERALD_TRISHOT - -/datum/action/innate/elite_attack/herald_directionalshot - name = "Circular Shot" - button_icon_state = "herald_directionalshot" - chosen_message = "You are firing projectiles in all directions." - chosen_attack_num = HERALD_DIRECTIONALSHOT - -/datum/action/innate/elite_attack/herald_teleshot - name = "Teleport Shot" - button_icon_state = "herald_teleshot" - chosen_message = "You will now fire a shot which teleports you where it lands." - chosen_attack_num = HERALD_TELESHOT - -/datum/action/innate/elite_attack/herald_mirror - name = "Summon Mirror" - button_icon_state = "herald_mirror" - chosen_message = "You will spawn a mirror which duplicates your attacks." - chosen_attack_num = HERALD_MIRROR - -/mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire() - if(client) - switch(chosen_attack) - if(HERALD_TRISHOT) - herald_trishot(target) - if(my_mirror != null) - my_mirror.herald_trishot(target) - if(HERALD_DIRECTIONALSHOT) - herald_directionalshot() - if(my_mirror != null) - my_mirror.herald_directionalshot() - if(HERALD_TELESHOT) - herald_teleshot(target) - if(my_mirror != null) - my_mirror.herald_teleshot(target) - if(HERALD_MIRROR) - herald_mirror() - return - var/aiattack = rand(1,4) - switch(aiattack) - if(HERALD_TRISHOT) - herald_trishot(target) - if(my_mirror != null) - my_mirror.herald_trishot(target) - if(HERALD_DIRECTIONALSHOT) - herald_directionalshot() - if(my_mirror != null) - my_mirror.herald_directionalshot() - if(HERALD_TELESHOT) - herald_teleshot(target) - if(my_mirror != null) - my_mirror.herald_teleshot(target) - if(HERALD_MIRROR) - herald_mirror() - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, is_teleshot, is_trishot) - var/turf/startloc = get_turf(src) - var/obj/projectile/herald/H = null - if(!is_teleshot) - H = new /obj/projectile/herald(startloc) - else - H = new /obj/projectile/herald/teleshot(startloc) - H.preparePixelProjectile(marker, startloc) - H.firer = src - if(target) - H.original = target - H.fire(set_angle) - if(is_trishot) - shoot_projectile(marker, set_angle + 15, FALSE, FALSE) - shoot_projectile(marker, set_angle - 15, FALSE, FALSE) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_trishot(target) - ranged_cooldown = world.time + 30 - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - var/target_turf = get_turf(target) - var/angle_to_target = get_angle(src, target_turf) - shoot_projectile(target_turf, angle_to_target, FALSE, TRUE) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 2) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 4) - if(health < maxHealth * 0.5 && !is_mirror) - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 10) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 12) - addtimer(CALLBACK(src, PROC_REF(shoot_projectile), target_turf, angle_to_target, FALSE, TRUE), 14) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_circleshot(offset) - var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) - for(var/i in directional_shot_angles) - shoot_projectile(get_turf(src), i + offset, FALSE, FALSE) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/unenrage() - if(stat == DEAD || is_mirror) - return - icon_state = "herald" - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_directionalshot() - ranged_cooldown = world.time + 3 SECONDS - if(!is_mirror) - icon_state = "herald_enraged" - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 0), 5) - if(health < maxHealth * 0.5 && !is_mirror) - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(herald_circleshot), 22.5), 15) - addtimer(CALLBACK(src, PROC_REF(unenrage)), 20) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_teleshot(target) - ranged_cooldown = world.time + 30 - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - var/target_turf = get_turf(target) - var/angle_to_target = get_angle(src, target_turf) - shoot_projectile(target_turf, angle_to_target, TRUE, FALSE) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/herald_mirror() - ranged_cooldown = world.time + 4 SECONDS - playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - if(my_mirror != null) - qdel(my_mirror) - my_mirror = null - var/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/new_mirror = new /mob/living/simple_animal/hostile/asteroid/elite/herald/mirror(loc) - my_mirror = new_mirror - my_mirror.my_master = src - my_mirror.faction = faction.Copy() - -/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror - name = "herald's mirror" - desc = "This fiendish work of magic copies the herald's attacks. Seems logical to smash it." - health = 60 - maxHealth = 60 - icon_state = "herald_mirror" - icon_aggro = "herald_mirror" - deathmessage = "shatters violently!" - deathsound = 'sound/effects/glassbr1.ogg' - del_on_death = TRUE - is_mirror = TRUE - var/mob/living/simple_animal/hostile/asteroid/elite/herald/my_master = null - -/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Initialize(mapload) - . = ..() - AddElement(/datum/element/simple_flying) - toggle_ai(AI_OFF) - -/mob/living/simple_animal/hostile/asteroid/elite/herald/mirror/Destroy() - if(my_master != null) - my_master.my_mirror = null - . = ..() - -/obj/projectile/herald - name ="death bolt" - icon_state= "chronobolt" - damage = 20 - armour_penetration = 60 - speed = 2 - eyeblur = 0 - damage_type = BRUTE - pass_flags = PASSTABLE - -/obj/projectile/herald/teleshot - name ="golden bolt" - damage = 0 - color = rgb(255,255,102) - -/obj/projectile/herald/on_hit(atom/target, blocked = FALSE) - . = ..() - if(ismineralturf(target)) - var/turf/closed/mineral/M = target - M.gets_drilled() - return - else if(isliving(target)) - var/mob/living/L = target - var/mob/living/F = firer - if(F != null && istype(F, /mob/living/simple_animal/hostile/asteroid/elite) && F.faction_check_mob(L)) - L.heal_overall_damage(damage) - -/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE) - . = ..() - firer.forceMove(get_turf(src)) - -//Herald's loot: Cloak of the Prophet - -/obj/item/clothing/neck/cloak/herald_cloak - name = "cloak of the prophet" - desc = "A cloak which protects you from the heresy of the world." - icon = 'icons/obj/lavaland/elite_trophies.dmi' - icon_state = "herald_cloak" - body_parts_covered = CHEST|GROIN|ARMS - hit_reaction_chance = 20 - -/obj/item/clothing/neck/cloak/herald_cloak/proc/reactionshot(mob/living/carbon/owner) - var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) - for(var/i in directional_shot_angles) - shoot_projectile(get_turf(owner), i, owner) - -/obj/item/clothing/neck/cloak/herald_cloak/proc/shoot_projectile(turf/marker, set_angle, mob/living/carbon/owner) - var/turf/startloc = get_turf(owner) - var/obj/projectile/herald/H = null - H = new /obj/projectile/herald(startloc) - H.preparePixelProjectile(marker, startloc) - H.firer = owner - H.fire(set_angle) - -/obj/item/clothing/neck/cloak/herald_cloak/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - . = ..() - if(rand(1,100) > hit_reaction_chance) - return - owner.visible_message(span_danger("[owner]'s [src] emits a loud noise as [owner] is struck!")) - var/static/list/directional_shot_angles = list(0, 45, 90, 135, 180, 225, 270, 315) - playsound(get_turf(owner), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) - addtimer(CALLBACK(src, PROC_REF(reactionshot), owner), 10) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm deleted file mode 100644 index 6536cc849c73..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm +++ /dev/null @@ -1,350 +0,0 @@ -#define LEGIONNAIRE_CHARGE 1 -#define HEAD_DETACH 2 -#define BONFIRE_TELEPORT 3 -#define SPEW_SMOKE 4 - -/** - * # Legionnaire - * - * A towering skeleton, embodying the power of Legion. - * As it's health gets lower, the head does more damage. - * It's attacks are as follows: - * - Charges at the target after a telegraph, throwing them across the arena should it connect. - * - Legionnaire's head detaches, attacking as it's own entity. Has abilities of it's own later into the fight. Once dead, regenerates after a brief period. If the skill is used while the head is off, it will be killed. - * - Leaves a pile of bones at your location. Upon using this skill again, you'll swap locations with the bone pile. - * - Spews a cloud of smoke from it's maw, wherever said maw is. - * A unique fight incorporating the head mechanic of legion into a whole new beast. Combatants will need to make sure the tag-team of head and body don't lure them into a deadly trap. - */ - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire - name = "legionnaire" - desc = "A towering skeleton, embodying the terrifying power of Legion." - icon_state = "legionnaire" - icon_living = "legionnaire" - icon_aggro = "legionnaire" - icon_dead = "legionnaire_dead" - icon_gib = "syndicate_gib" - health_doll_icon = "legionnaire" - maxHealth = 1000 - health = 1000 - melee_damage_lower = 35 - melee_damage_upper = 35 - attack_verb_continuous = "slashes its arms at" - attack_verb_simple = "slash your arms at" - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - throw_message = "doesn't affect the sturdiness of" - speed = 1 - move_to_delay = 3 - mouse_opacity = MOUSE_OPACITY_ICON - deathsound = 'sound/magic/curse.ogg' - deathmessage = "'s arms reach out before it falls apart onto the floor, lifeless." - loot_drop = /obj/item/crusher_trophy/legionnaire_spine - - attack_action_types = list(/datum/action/innate/elite_attack/legionnaire_charge, - /datum/action/innate/elite_attack/head_detach, - /datum/action/innate/elite_attack/bonfire_teleport, - /datum/action/innate/elite_attack/spew_smoke) - - var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/myhead = null - var/obj/structure/legionnaire_bonfire/mypile = null - var/has_head = TRUE - /// Whether or not the legionnaire is currently charging, used to deny movement input if he is - var/charging = FALSE - -/datum/action/innate/elite_attack/legionnaire_charge - name = "Legionnaire Charge" - button_icon_state = "legionnaire_charge" - chosen_message = "You will attempt to grab your opponent and throw them." - chosen_attack_num = LEGIONNAIRE_CHARGE - -/datum/action/innate/elite_attack/head_detach - name = "Release Head" - button_icon_state = "head_detach" - chosen_message = "You will now detach your head or kill it if it is already released." - chosen_attack_num = HEAD_DETACH - -/datum/action/innate/elite_attack/bonfire_teleport - name = "Bonfire Teleport" - button_icon_state = "bonfire_teleport" - chosen_message = "You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it." - chosen_attack_num = BONFIRE_TELEPORT - -/datum/action/innate/elite_attack/spew_smoke - name = "Spew Smoke" - button_icon_state = "spew_smoke" - chosen_message = "Your head will spew smoke in an area, wherever it may be." - chosen_attack_num = SPEW_SMOKE - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire() - if(client) - switch(chosen_attack) - if(LEGIONNAIRE_CHARGE) - legionnaire_charge(target) - if(HEAD_DETACH) - head_detach(target) - if(BONFIRE_TELEPORT) - bonfire_teleport() - if(SPEW_SMOKE) - spew_smoke() - return - var/aiattack = rand(1,4) - switch(aiattack) - if(LEGIONNAIRE_CHARGE) - legionnaire_charge(target) - if(HEAD_DETACH) - head_detach(target) - if(BONFIRE_TELEPORT) - bonfire_teleport() - if(SPEW_SMOKE) - spew_smoke() - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/Move() - if(charging) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/MiddleClickOn(atom/A) - . = ..() - if(!myhead) - return - var/turf/T = get_turf(A) - if(T) - myhead.LoseTarget() - myhead.Goto(T, myhead.move_to_delay) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge(target) - ranged_cooldown = world.time + 4.0 SECONDS - charging = TRUE - var/dir_to_target = get_dir(get_turf(src), get_turf(target)) - var/turf/T = get_step(get_turf(src), dir_to_target) - for(var/i in 1 to 6) - new /obj/effect/temp_visual/dragon_swoop/legionnaire(T) - T = get_step(T, dir_to_target) - playsound(src,'sound/magic/demon_attack1.ogg', 200, 1) - visible_message(span_boldwarning("[src] prepares to charge!")) - addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), dir_to_target, 0), 4) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/legionnaire_charge_2(move_dir, times_ran) - if(times_ran >= 6) - charging = FALSE - return - var/turf/T = get_step(get_turf(src), move_dir) - if(ismineralturf(T)) - var/turf/closed/mineral/M = T - M.gets_drilled() - if(T.density) - charging = FALSE - return - for(var/obj/structure/window/W in T.contents) - charging = FALSE - return - for(var/obj/machinery/door/D in T.contents) - if(D.density) - charging = FALSE - return - forceMove(T) - playsound(src,'sound/effects/bang.ogg', 200, 1) - var/list/hit_things = list() - var/throwtarget = get_edge_target_turf(src, move_dir) - for(var/mob/living/L in T.contents - hit_things - src) - if(faction_check_mob(L)) - return - hit_things += L - visible_message(span_boldwarning("[src] tramples and kicks [L]!")) - to_chat(L, span_userdanger("[src] tramples you and kicks you away!")) - L.safe_throw_at(throwtarget, 10, 1, src) - L.Paralyze(20) - L.adjustBruteLoss(melee_damage_upper) - addtimer(CALLBACK(src, PROC_REF(legionnaire_charge_2), move_dir, (times_ran + 1)), 0.7) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/head_detach(target) - ranged_cooldown = world.time + 1 SECONDS - if(myhead != null) - myhead.adjustBruteLoss(600) - return - if(has_head) - has_head = FALSE - icon_state = "legionnaire_headless" - icon_living = "legionnaire_headless" - icon_aggro = "legionnaire_headless" - visible_message(span_boldwarning("[src]'s head flies off!")) - var/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/newhead = new /mob/living/simple_animal/hostile/asteroid/elite/legionnairehead(loc) - newhead.GiveTarget(target) - newhead.faction = faction.Copy() - myhead = newhead - myhead.body = src - if(health < maxHealth * 0.25) - myhead.melee_damage_lower = 40 - myhead.melee_damage_upper = 40 - else if(health < maxHealth * 0.5) - myhead.melee_damage_lower = 30 - myhead.melee_damage_upper = 30 - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/onHeadDeath() - myhead = null - addtimer(CALLBACK(src, PROC_REF(regain_head)), 50) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/regain_head() - has_head = TRUE - if(stat == DEAD) - return - icon_state = "legionnaire" - icon_living = "legionnaire" - icon_aggro = "legionnaire" - visible_message(span_boldwarning("The top of [src]'s spine leaks a black liquid, forming into a skull!")) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/bonfire_teleport() - ranged_cooldown = world.time + 5 - if(mypile == null) - var/obj/structure/legionnaire_bonfire/newpile = new /obj/structure/legionnaire_bonfire(loc) - mypile = newpile - mypile.myowner = src - playsound(get_turf(src),'sound/items/fultext_deploy.ogg', 200, 1) - visible_message(span_boldwarning("[src] summons a bonfire on [get_turf(src)]!")) - return - else - var/turf/legionturf = get_turf(src) - var/turf/pileturf = get_turf(mypile) - if(legionturf == pileturf) - mypile.take_damage(100) - mypile = null - return - playsound(pileturf,'sound/items/fultext_deploy.ogg', 200, 1) - playsound(legionturf,'sound/items/fultext_deploy.ogg', 200, 1) - visible_message(span_boldwarning("[src] melts down into a burning pile of bones!")) - forceMove(pileturf) - visible_message(span_boldwarning("[src] forms from the bonfire!")) - mypile.forceMove(legionturf) - -/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/proc/spew_smoke() - ranged_cooldown = world.time + 4 SECONDS - var/turf/smoke_location = null - if(myhead != null) - smoke_location = get_turf(myhead) - else - smoke_location = get_turf(src) - if(myhead != null) - myhead.visible_message(span_boldwarning("[myhead] spews smoke from its maw!")) - else if(!has_head) - visible_message(span_boldwarning("[src] spews smoke from the tip of their spine!")) - else - visible_message(span_boldwarning("[src] spews smoke from its maw!")) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(2, smoke_location) - smoke.start() - -//The legionnaire's head. Basically the same as any legion head, but we have to tell our creator when we die so they can generate another head. -/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead - name = "legionnaire head" - desc = "The legionnaire's head floating by itself. One shouldn't get too close, though once it sees you, you really don't have a choice." - icon_state = "legionnaire_head" - icon_living = "legionnaire_head" - icon_aggro = "legionnaire_head" - icon_dead = "legionnaire_dead" - icon_gib = "syndicate_gib" - maxHealth = 200 - health = 200 - melee_damage_lower = 20 - melee_damage_upper = 20 - attack_verb_continuous = "bites at" - attack_verb_simple = "bite at" - attack_sound = 'sound/effects/curse1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - throw_message = "simply misses" - speed = 0 - move_to_delay = 2 - del_on_death = 1 - deathmessage = "crumbles away!" - faction = list() - ranged = FALSE - var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/body = null - -/mob/living/simple_animal/hostile/asteroid/elite/legionnairehead/death() - . = ..() - if(body) - body.onHeadDeath() - -//The legionnaire's bonfire, which can be swapped positions with. Also sets flammable living beings on fire when they walk over it. -/obj/structure/legionnaire_bonfire - name = "bone pile" - desc = "A pile of bones which seems to occasionally move a little. It's probably a good idea to smash them." - icon = 'icons/obj/lavaland/legionnaire_bonfire.dmi' - icon_state = "bonfire" - max_integrity = 100 - move_resist = MOVE_FORCE_EXTREMELY_STRONG - anchored = TRUE - density = FALSE - light_outer_range = 4 - light_color = COLOR_SOFT_RED - var/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/myowner = null - -/obj/structure/legionnaire_bonfire/Initialize(mapload) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/legionnaire_bonfire/proc/on_entered(datum/source, atom/movable/mover) - SIGNAL_HANDLER - if(mover == src) - return - if(isobj(mover)) - var/obj/object = mover - object.fire_act(1000, 500) - if(isliving(mover)) - var/mob/living/fire_walker = mover - fire_walker.adjust_fire_stacks(5) - fire_walker.ignite_mob() - -/obj/structure/legionnaire_bonfire/Destroy() - if(myowner != null) - myowner.mypile = null - . = ..() - -//The visual effect which appears in front of legionnaire when he goes to charge. -/obj/effect/temp_visual/dragon_swoop/legionnaire - duration = 10 - color = rgb(0,0,0) - -/obj/effect/temp_visual/dragon_swoop/legionnaire/Initialize(mapload) - . = ..() - transform *= 0.33 - -// Legionnaire's loot: Legionnaire Spine - -/obj/item/crusher_trophy/legionnaire_spine - name = "legionnaire spine" - desc = "The spine of a legionnaire. With some creativity, you could use it as a crusher trophy. Alternatively, shaking it might do something as well." - icon = 'icons/obj/lavaland/elite_trophies.dmi' - icon_state = "legionnaire_spine" - denied_type = /obj/item/crusher_trophy/legionnaire_spine - bonus_value = 20 - /// Time at which the item becomes usable again - var/next_use_time - -/obj/item/crusher_trophy/legionnaire_spine/effect_desc() - return "mark detonation to have a [bonus_value]% chance to summon a loyal legion skull" - -/obj/item/crusher_trophy/legionnaire_spine/on_mark_detonation(mob/living/target, mob/living/user) - if(!rand(1, 100) <= bonus_value || target.stat == DEAD) - return - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(user.loc) - A.GiveTarget(target) - A.friends += user - A.faction = user.faction.Copy() - -/obj/item/crusher_trophy/legionnaire_spine/attack_self(mob/user) - if(!isliving(user)) - return - var/mob/living/LivingUser = user - if(next_use_time > world.time) - LivingUser.visible_message(span_warning("[LivingUser] shakes the [src], but nothing happens...")) - to_chat(LivingUser, "You need to wait longer to use this again.") - return - LivingUser.visible_message(span_boldwarning("[LivingUser] shakes the [src] and summons a legion skull!")) - var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/LegionSkull = new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion(LivingUser.loc) - LegionSkull.friends += LivingUser - LegionSkull.faction = LivingUser.faction.Copy() - next_use_time = world.time + 4 SECONDS diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm deleted file mode 100644 index f3bdc6bdf484..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ /dev/null @@ -1,195 +0,0 @@ -#define SINGULAR_SHOT 1 -#define MAGIC_BOX 2 -#define PANDORA_TELEPORT 3 -#define AOE_SQUARES 4 - -/** - * # Pandora - * - * A box with a similar design to the Hierophant which trades large, single attacks for more frequent smaller ones. - * As it's health gets lower, the time between it's attacks decrease. - * It's attacks are as follows: - * - Fires hierophant blasts in a straight line. Can only fire in a straight line in 8 directions, being the diagonals and cardinals. - * - Creates a box of hierophant blasts around the target. If they try to run away to avoid it, they'll very likely get hit. - * - Teleports the pandora from one location to another, almost identical to Hierophant. - * - Spawns a 7x7 AOE at the location of choice, spreading out from the center. - * Pandora's fight mirrors Hierophant's closely, but has stark differences in attack effects. Instead of long-winded dodge times and long cooldowns, Pandora constantly attacks the opponent, but leaves itself open for attack. - */ - -/mob/living/simple_animal/hostile/asteroid/elite/pandora - name = "pandora" - desc = "A large magic box with similar power and design to the Hierophant. Once it opens, it's not easy to close it." - icon_state = "pandora" - icon_living = "pandora" - icon_aggro = "pandora" - icon_dead = "pandora_dead" - icon_gib = "syndicate_gib" - health_doll_icon = "pandora" - maxHealth = 1000 - health = 1000 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "smashes into the side of" - attack_verb_simple = "smash into the side of" - attack_sound = 'sound/weapons/sonic_jackhammer.ogg' - throw_message = "merely dinks off of the" - speed = 3 - move_to_delay = 10 - mouse_opacity = MOUSE_OPACITY_ICON - deathsound = 'sound/magic/repulse.ogg' - deathmessage = "'s lights flicker, before its top part falls down." - loot_drop = /obj/item/clothing/accessory/pandora_hope - - attack_action_types = list(/datum/action/innate/elite_attack/singular_shot, - /datum/action/innate/elite_attack/magic_box, - /datum/action/innate/elite_attack/pandora_teleport, - /datum/action/innate/elite_attack/aoe_squares) - - var/sing_shot_length = 8 - var/cooldown_time = 20 - -/datum/action/innate/elite_attack/singular_shot - name = "Singular Shot" - button_icon_state = "singular_shot" - chosen_message = "You are now creating a single linear magic square." - chosen_attack_num = SINGULAR_SHOT - -/datum/action/innate/elite_attack/magic_box - name = "Magic Box" - button_icon_state = "magic_box" - chosen_message = "You are now attacking with a box of magic squares." - chosen_attack_num = MAGIC_BOX - -/datum/action/innate/elite_attack/pandora_teleport - name = "Line Teleport" - button_icon_state = "pandora_teleport" - chosen_message = "You will now teleport to your target." - chosen_attack_num = PANDORA_TELEPORT - -/datum/action/innate/elite_attack/aoe_squares - name = "AOE Blast" - button_icon_state = "aoe_squares" - chosen_message = "Your attacks will spawn an AOE blast at your target location." - chosen_attack_num = AOE_SQUARES - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire() - if(client) - switch(chosen_attack) - if(SINGULAR_SHOT) - singular_shot(target) - if(MAGIC_BOX) - magic_box(target) - if(PANDORA_TELEPORT) - pandora_teleport(target) - if(AOE_SQUARES) - aoe_squares(target) - return - var/aiattack = rand(1,4) - switch(aiattack) - if(SINGULAR_SHOT) - singular_shot(target) - if(MAGIC_BOX) - magic_box(target) - if(PANDORA_TELEPORT) - pandora_teleport(target) - if(AOE_SQUARES) - aoe_squares(target) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(health >= maxHealth * 0.5) - cooldown_time = 2 SECONDS - return - if(health < maxHealth * 0.5 && health > maxHealth * 0.25) - cooldown_time = 1.5 SECONDS - return - else - cooldown_time = 1 SECONDS - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) - ranged_cooldown = world.time + (cooldown_time * 0.5) - var/dir_to_target = get_dir(get_turf(src), get_turf(target)) - var/turf/T = get_step(get_turf(src), dir_to_target) - singular_shot_line(sing_shot_length, dir_to_target, T) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(procsleft, angleused, turf/T) - if(procsleft <= 0) - return - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(T, src) - T = get_step(T, angleused) - procsleft = procsleft - 1 - addtimer(CALLBACK(src, PROC_REF(singular_shot_line), procsleft, angleused, T), cooldown_time * 0.1) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target) - ranged_cooldown = world.time + cooldown_time - var/turf/T = get_turf(target) - for(var/t in spiral_range_turfs(3, T)) - if(get_dist(t, T) > 1) - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target) - var/turf/turf_target = get_turf(target) - if(!(turf_target in view(12, src))) - return - ranged_cooldown = world.time + (cooldown_time * 2) - var/turf/source = get_turf(src) - new /obj/effect/temp_visual/hierophant/telegraph(turf_target, src) - new /obj/effect/temp_visual/hierophant/telegraph(source, src) - playsound(source,'sound/machines/doors/airlock_open.ogg', 200, 1) - addtimer(CALLBACK(src, PROC_REF(pandora_teleport_2), turf_target, source), 2) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(turf/T, turf/source) - new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) - new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) - for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) - for(var/t in RANGE_TURFS(1, source)) - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) - animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out - visible_message(span_hierophant_warning("[src] fades out!")) - set_density(FALSE) - addtimer(CALLBACK(src, PROC_REF(pandora_teleport_3), T), 2) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(turf/T) - forceMove(T) - animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN - set_density(TRUE) - visible_message(span_hierophant_warning("[src] fades in!")) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) - ranged_cooldown = world.time + cooldown_time - var/turf/T = get_turf(target) - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(T, src) - var/max_size = 3 - addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, 0, max_size), 2) - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(turf/T, ring, max_size) - if(ring > max_size) - return - for(var/t in spiral_range_turfs(ring, T)) - if(get_dist(t, T) == ring) - new /obj/effect/temp_visual/hierophant/blast/damaging/pandora(t, src) - addtimer(CALLBACK(src, PROC_REF(aoe_squares_2), T, (ring + 1), max_size), cooldown_time * 0.1) - -//The specific version of hiero's squares pandora uses -/obj/effect/temp_visual/hierophant/blast/damaging/pandora - damage = 30 - monster_damage_boost = FALSE - -//Pandora's loot: Hope -/obj/item/clothing/accessory/pandora_hope - name = "Hope" - desc = "Found at the bottom of Pandora. After all the evil was released, this was the only thing left inside." - icon = 'icons/obj/lavaland/elite_trophies.dmi' - icon_state = "hope" - resistance_flags = FIRE_PROOF - -/obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(L?.mind) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "hope_lavaland", /datum/mood_event/hope_lavaland) - -/obj/item/clothing/accessory/pandora_hope/on_uniform_dropped(obj/item/clothing/under/U, user) - var/mob/living/L = user - if(L?.mind) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "hope_lavaland") 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 cb9ffc37a053..63571d15a497 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 @@ -21,7 +21,7 @@ melee_damage_upper = 0 attack_verb_continuous = "barrels into" attack_verb_simple = "barrel into" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = FALSE speak_emote = list("screeches") throw_message = "sinks in slowly, before being pushed out of " 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 deleted file mode 100644 index 923edb83bf04..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm +++ /dev/null @@ -1,240 +0,0 @@ -//A slow but strong beast that tries to stun using its tentacles -/mob/living/simple_animal/hostile/asteroid/goliath - name = "goliath" - desc = "A massive beast that uses long tentacles to ensnare its prey, threatening them is not advised under any conditions." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "Goliath" - icon_living = "Goliath" - icon_aggro = "Goliath_alert" - icon_dead = "Goliath_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - move_to_delay = 40 - ranged = 1 - ranged_cooldown_time = 120 - friendly_verb_continuous = "wails at" - friendly_verb_simple = "wail at" - speak_emote = list("bellows") - speed = 3 - maxHealth = 300 - health = 300 - harm_intent_damage = 0 - obj_damage = 100 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_verb_continuous = "pulverizes" - attack_verb_simple = "pulverize" - attack_sound = 'sound/weapons/punch1.ogg' - throw_message = "does nothing to the rocky hide of the" - vision_range = 5 - aggro_vision_range = 9 - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - gender = MALE//lavaland elite goliath says that i'''' 't s female and i ''t s stronger because of sexual dimorphism, so normal goliaths should be male - var/pre_attack = 0 - var/pre_attack_icon = "Goliath_preattack" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) - - footstep_type = FOOTSTEP_MOB_HEAVY - -/mob/living/simple_animal/hostile/asteroid/goliath/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - handle_preattack() - -/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack() - if(ranged_cooldown <= world.time + ranged_cooldown_time*0.25 && !pre_attack) - pre_attack++ - if(!pre_attack || stat || AIStatus == AI_IDLE) - return - icon_state = pre_attack_icon - -/mob/living/simple_animal/hostile/asteroid/goliath/revive(full_heal = FALSE, admin_revive = FALSE)//who the fuck anchors mobs - if(..()) - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - . = 1 - -/mob/living/simple_animal/hostile/asteroid/goliath/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - move_resist = MOVE_RESIST_DEFAULT - pull_force = PULL_FORCE_DEFAULT - ..(gibbed) - -/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire() - var/tturf = get_turf(target) - if(!isturf(tturf)) - return - if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen - visible_message(span_warning("[src] digs its tentacles under [target]!")) - new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src) - ranged_cooldown = world.time + ranged_cooldown_time - icon_state = icon_aggro - pre_attack = 0 - -/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - ranged_cooldown -= 10 - handle_preattack() - . = ..() - -/mob/living/simple_animal/hostile/asteroid/goliath/Aggro() - vision_range = aggro_vision_range - handle_preattack() - if(icon_state != icon_aggro) - icon_state = icon_aggro - -//Lavaland Goliath -/mob/living/simple_animal/hostile/asteroid/goliath/beast - name = "goliath" - desc = "A hulking, armor-plated beast with long tendrils arching from its back." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "goliath" - icon_living = "goliath" - icon_aggro = "goliath" - icon_dead = "goliath_dead" - throw_message = "does nothing to the tough hide of the" - pre_attack_icon = "goliath2" - crusher_loot = /obj/item/crusher_trophy/goliath_tentacle - butcher_results = list(/obj/item/food/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2) - guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide = 1) - loot = list() - stat_attack = HARD_CRIT - robust_searching = 1 - - var/can_saddle = FALSE - var/saddled = FALSE - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/Initialize(mapload) - . = ..() - AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/ash_flora), tame_chance = 10, bonus_tame_chance = 5, after_tame = CALLBACK(src, PROC_REF(tamed))) - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/attackby(obj/item/O, mob/user, params) - if(!istype(O, /obj/item/saddle) || saddled) - return ..() - - if(can_saddle && do_after(user, src, 55)) - user.visible_message(span_notice("You manage to put [O] on [src], you can now ride [p_them()].")) - qdel(O) - saddled = TRUE - can_buckle = TRUE - buckle_lying = 0 - add_overlay("goliath_saddled") - AddElement(/datum/element/ridable, /datum/component/riding/creature/goliath) - else - user.visible_message(span_warning("[src] is rocking around! You can't put the saddle on!")) - ..() - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/proc/tamed(mob/living/tamer) - can_saddle = TRUE - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize(mapload) - . = ..() - if(prob(1)) - new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc) - return INITIALIZE_HINT_QDEL - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient - name = "ancient goliath" - desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it." - icon_state = "Goliath" - icon_living = "Goliath" - icon_aggro = "Goliath_alert" - icon_dead = "Goliath_dead" - maxHealth = 400 - health = 400 - speed = 4 - pre_attack_icon = "Goliath_preattack" - throw_message = "does nothing to the rocky hide of the" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days - butcher_results = list(/obj/item/food/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2) - guaranteed_butcher_results = list() - crusher_drop_mod = 30 - wander = FALSE - var/list/cached_tentacle_turfs - var/turf/last_location - var/tentacle_recheck_cooldown = 100 - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(!.) // dead - return - if(isturf(loc)) - if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time) - 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)) - LAZYADD(cached_tentacle_turfs, T) - for(var/t in cached_tentacle_turfs) - if(isopenturf(t)) - if(prob(10)) - new /obj/effect/temp_visual/goliath_tentacle(t, src) - else - cached_tentacle_turfs -= t - -/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril - fromtendril = TRUE - -//tentacles -/obj/effect/temp_visual/goliath_tentacle - name = "goliath tentacle" - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "Goliath_tentacle_spawn" - layer = BELOW_MOB_LAYER - plane = GAME_PLANE - var/mob/living/spawner - -/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner) - . = ..() - for(var/obj/effect/temp_visual/goliath_tentacle/T in loc) - if(T != src) - return INITIALIZE_HINT_QDEL - if(!QDELETED(new_spawner)) - spawner = new_spawner - if(ismineralturf(loc)) - var/turf/closed/mineral/M = loc - M.gets_drilled() - deltimer(timerid) - timerid = addtimer(CALLBACK(src, PROC_REF(tripanim)), 7, TIMER_STOPPABLE) - -/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner) - . = ..() - var/list/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/spawndir = pick_n_take(directions) - var/turf/T = get_step(src, spawndir) - if(T) - new /obj/effect/temp_visual/goliath_tentacle(T, spawner) - -/obj/effect/temp_visual/goliath_tentacle/proc/tripanim() - icon_state = "Goliath_tentacle_wiggle" - deltimer(timerid) - timerid = addtimer(CALLBACK(src, PROC_REF(trip)), 3, TIMER_STOPPABLE) - -/obj/effect/temp_visual/goliath_tentacle/proc/trip() - var/latched = FALSE - for(var/mob/living/L in loc) - if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD) - continue - visible_message(span_danger("[src] grabs hold of [L]!")) - L.Stun(100) - L.adjustBruteLoss(rand(10,15)) - latched = TRUE - if(!latched) - retract() - else - deltimer(timerid) - timerid = addtimer(CALLBACK(src, PROC_REF(retract)), 10, TIMER_STOPPABLE) - -/obj/effect/temp_visual/goliath_tentacle/proc/retract() - icon_state = "Goliath_tentacle_retract" - deltimer(timerid) - timerid = QDEL_IN(src, 7) - -/obj/item/saddle - name = "saddle" - desc = "This saddle will solve all your problems with being killed by lava beasts!" - icon = 'icons/obj/mining.dmi' - icon_state = "goliath_saddle" 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 deleted file mode 100644 index f907ff7a2bc8..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ /dev/null @@ -1,130 +0,0 @@ -//Gutlunches, passive mods that devour blood and gibs -/mob/living/simple_animal/hostile/asteroid/gutlunch - name = "gutlunch" - desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "gutlunch" - icon_living = "gutlunch" - icon_dead = "gutlunch" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - speak_emote = list("warbles", "quavers") - emote_hear = list("trills.") - emote_see = list("sniffs.", "burps.") - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - faction = list("mining", "ashwalker") - density = FALSE - speak_chance = 1 - turns_per_move = 8 - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - move_to_delay = 15 - response_help_continuous = "pets" - response_help_simple = "pet" - response_disarm_continuous = "gently pushes aside" - response_disarm_simple = "gently push aside" - response_harm_continuous = "squishes" - response_harm_simple = "squish" - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - combat_mode = FALSE - gold_core_spawnable = FRIENDLY_SPAWN - stat_attack = HARD_CRIT - gender = NEUTER - stop_automated_movement = FALSE - stop_automated_movement_when_pulled = TRUE - stat_exclusive = TRUE - robust_searching = TRUE - search_objects = 3 //Ancient simplemob AI shitcode. This makes them ignore all other mobs. - del_on_death = TRUE - loot = list(/obj/effect/decal/cleanable/blood/gibs) - deathmessage = "is pulped into bugmash." - - animal_species = /mob/living/simple_animal/hostile/asteroid/gutlunch - childtype = list(/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch = 100) - - wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/gibs/, /obj/item/organ) - -/mob/living/simple_animal/hostile/asteroid/gutlunch/Initialize(mapload) - . = ..() - if(wanted_objects.len) - AddComponent(/datum/component/udder, /obj/item/udder/gutlunch, CALLBACK(src, PROC_REF(regenerate_icons)), CALLBACK(src, PROC_REF(regenerate_icons))) - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - -/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland - if(isturf(the_target) || !the_target) // bail out on invalids - return FALSE - - if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it - return FALSE - - if(isliving(the_target)) - var/mob/living/L = the_target - - if(faction_check_mob(L) && !attack_same) - return FALSE - if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive) - return FALSE - - return TRUE - - if(isobj(the_target) && is_type_in_typecache(the_target, wanted_objects)) - return TRUE - - return FALSE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/regenerate_icons(new_udder_volume, max_udder_volume) - cut_overlays() - var/static/gutlunch_full_overlay - if(isnull(gutlunch_full_overlay)) - gutlunch_full_overlay = iconstate2appearance(icon, "gl_full") - if(new_udder_volume == max_udder_volume) - add_overlay(gutlunch_full_overlay) - ..() - -//Male gutlunch. They're smaller and more colorful! -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck - name = "gubbuck" - gender = MALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck/Initialize(mapload) - . = ..() - add_atom_colour(pick("#E39FBB", "#D97D64", "#CF8C4A"), FIXED_COLOUR_PRIORITY) - resize = 0.85 - update_transform() - -//Lady gutlunch. They make the babby. -/mob/living/simple_animal/hostile/asteroid/gutlunch/guthen - name = "guthen" - gender = FEMALE - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch - name = "grublunch" - wanted_objects = list() //They don't eat. - gold_core_spawnable = NO_SPAWN - var/growth = 0 - -//Baby gutlunch -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Initialize(mapload) - . = ..() - add_atom_colour("#9E9E9E", FIXED_COLOUR_PRIORITY) //Somewhat hidden - resize = 0.45 - update_transform() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/Life(delta_time = SSMOBS_DT, times_fired) - ..() - growth++ - if(growth > 50) //originally used a timer for this but it was more of a problem than it was worth. - growUp() - -/mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch/proc/growUp() - var/mob/living/L - if(prob(45)) - L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/gubbuck(loc) - else - L = new /mob/living/simple_animal/hostile/asteroid/gutlunch/guthen(loc) - mind?.transfer_to(L) - L.faction = faction - L.setDir(dir) - L.Stun(20, ignore_canstun = TRUE) - visible_message(span_notice("[src] grows up into [L].")) - qdel(src) 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 81d336c88676..d449c1129ab7 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 @@ -53,9 +53,6 @@ OpenFire() return TRUE -/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot() - loot += crusher_loot //we don't butcher - /mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed) mouse_opacity = MOUSE_OPACITY_ICON ..(gibbed) @@ -100,212 +97,3 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/swarming) AddComponent(/datum/component/clickbox, icon_state = clickbox_state, max_scale = clickbox_max_scale) - -//Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion - name = "legion" - desc = "You can still see what was once a human under the shifting mass of corruption." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "legion" - icon_living = "legion" - icon_aggro = "legion" - icon_dead = "legion" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - mouse_opacity = MOUSE_OPACITY_ICON - obj_damage = 60 - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_verb_continuous = "lashes out at" - attack_verb_simple = "lash out at" - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "bounces harmlessly off of" - 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 - stat_attack = HARD_CRIT - robust_searching = 1 - has_clickbox = FALSE - var/dwarf_mob = FALSE - var/mob/living/carbon/human/stored_mob - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize(mapload) - . = ..() - if(prob(5)) - new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc) - return INITIALIZE_HINT_QDEL - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf - name = "dwarf legion" - desc = "You can still see what was once a rather small human under the shifting mass of corruption." - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - maxHealth = 60 - health = 60 - speed = 2 //faster! - crusher_drop_mod = 20 - dwarf_mob = TRUE - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed) - visible_message(span_warning("The skulls on [src] wail in anger as they flee from their dying host!")) - var/turf/T = get_turf(src) - if(T) - if(stored_mob) - stored_mob.forceMove(get_turf(src)) - stored_mob = null - else if(fromtendril) - new /obj/effect/mob_spawn/corpse/human/charredskeleton(T) - else if(dwarf_mob) - new /obj/effect/mob_spawn/corpse/human/legioninfested/dwarf(T) - else - new /obj/effect/mob_spawn/corpse/human/legioninfested(T) - ..(gibbed) - -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/tendril - fromtendril = TRUE - -//Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "legion_head" - icon_living = "legion_head" - icon_aggro = "legion_head" - icon_dead = "legion_head" - icon_gib = "syndicate_gib" - friendly_verb_continuous = "buzzes near" - friendly_verb_simple = "buzz near" - vision_range = 10 - maxHealth = 1 - health = 5 - harm_intent_damage = 5 - melee_damage_lower = 12 - melee_damage_upper = 12 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - attack_vis_effect = ATTACK_EFFECT_BITE - speak_emote = list("echoes") - attack_sound = 'sound/weapons/pierce.ogg' - throw_message = "is shrugged off by" - del_on_death = TRUE - stat_attack = HARD_CRIT - robust_searching = 1 - clickbox_state = "sphere" - clickbox_max_scale = 2 - var/can_infest_dead = FALSE - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(stat == DEAD || !isturf(loc)) - return - for(var/mob/living/carbon/human/victim in range(src, 1)) //Only for corpse right next to/on same tile - switch(victim.stat) - if(UNCONSCIOUS, HARD_CRIT) - infest(victim) - return //This will qdelete the legion. - if(DEAD) - if(can_infest_dead) - infest(victim) - return //This will qdelete the legion. - -///Create a legion at the location of a corpse. Exists so that legion subtypes can override it with their own type of legion. -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/make_legion(mob/living/carbon/human/H) - if(HAS_TRAIT(H, TRAIT_DWARF)) //dwarf legions aren't just fluff! - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc) - else - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(H.loc) - -///Create a new legion using the supplied human H -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H) - visible_message(span_warning("[name] burrows into the flesh of [H]!")) - var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = make_legion(H) - visible_message(span_warning("[L] staggers to [L.p_their()] feet!")) - H.death() - H.adjustBruteLoss(1000) - L.stored_mob = H - H.forceMove(L) - qdel(src) - -//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions) -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced - stat_attack = DEAD - maxHealth = 120 - health = 120 - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - icon_state = "dwarf_legion" - icon_living = "dwarf_legion" - icon_aggro = "dwarf_legion" - icon_dead = "dwarf_legion" - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced - stat_attack = DEAD - can_infest_dead = TRUE - -//Legion that spawns Legions -/mob/living/simple_animal/hostile/big_legion - name = "legion" - desc = "One of many." - icon = 'icons/mob/lavaland/64x64megafauna.dmi' - icon_state = "legion" - icon_living = "legion" - icon_dead = "legion" - health_doll_icon = "legion" - health = 450 - maxHealth = 450 - melee_damage_lower = 20 - melee_damage_upper = 20 - anchored = FALSE - AIStatus = AI_ON - stop_automated_movement = FALSE - wander = TRUE - maxbodytemp = INFINITY - layer = MOB_LAYER - del_on_death = TRUE - sentience_type = SENTIENCE_BOSS - loot = list(/obj/item/organ/regenerative_core/legion = 3, /obj/effect/mob_spawn/corpse/human/legioninfested = 5) - move_to_delay = 14 - vision_range = 5 - aggro_vision_range = 9 - speed = 3 - faction = list("mining") - weather_immunities = list(TRAIT_LAVA_IMMUNE, TRAIT_ASHSTORM_IMMUNE) - obj_damage = 30 - environment_smash = ENVIRONMENT_SMASH_STRUCTURES - see_in_dark = NIGHTVISION_FOV_RANGE - lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE - - -/mob/living/simple_animal/hostile/big_legion/Initialize(mapload) - .=..() - AddComponent(/datum/component/spawner, list(/mob/living/simple_animal/hostile/asteroid/hivelord/legion), 200, faction, "peels itself off from", 3) - -// Snow Legion -/mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow - name = "snow legion" - desc = "You can still see what was once a human under the shifting snowy mass, clearly decorated by a clown." - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion" - icon_living = "snowlegion" - icon_aggro = "snowlegion_alive" - icon_dead = "snowlegion" - crusher_loot = /obj/item/crusher_trophy/legion_skull - loot = list(/obj/item/organ/regenerative_core/legion) - brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow/make_legion(mob/living/carbon/human/H) - return new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/snow(H.loc) - -// Snow Legion skull -/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/snow - name = "snow legion" - desc = "One of many." - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - icon_state = "snowlegion_head" - icon_living = "snowlegion_head" - icon_aggro = "snowlegion_head" - icon_dead = "snowlegion_head" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm index a4e8204d19c7..1146d324271d 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_demon.dm @@ -34,10 +34,9 @@ pull_force = MOVE_FORCE_VERY_STRONG del_on_death = TRUE loot = list() - crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing deathmessage = "fades as the energies that tied it to this world dissipate." deathsound = 'sound/magic/demon_dies.ogg' - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = TRUE footstep_type = FOOTSTEP_MOB_CLAW /// Distance the demon will teleport from the target diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm deleted file mode 100644 index 6ab0f8ada88f..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/ice_whelp.dm +++ /dev/null @@ -1,59 +0,0 @@ -/mob/living/simple_animal/hostile/asteroid/ice_whelp - name = "ice whelp" - desc = "The offspring of an ice drake, weak in comparison but still terrifying." - icon = 'icons/mob/icemoon/icemoon_monsters.dmi' - icon_state = "ice_whelp" - icon_living = "ice_whelp" - icon_dead = "ice_whelp_dead" - mob_biotypes = MOB_ORGANIC|MOB_BEAST - mouse_opacity = MOUSE_OPACITY_ICON - friendly_verb_continuous = "stares down" - friendly_verb_simple = "stare down" - speak_emote = list("roars") - speed = 12 - move_to_delay = 12 - ranged = TRUE - ranged_cooldown_time = 5 SECONDS - maxHealth = 300 - health = 300 - obj_damage = 40 - armour_penetration = 20 - melee_damage_lower = 20 - melee_damage_upper = 20 - attack_verb_continuous = "chomps" - attack_verb_simple = "chomp" - attack_sound = 'sound/magic/demon_attack1.ogg' - attack_vis_effect = ATTACK_EFFECT_BITE - ranged_message = "breathes fire at" - vision_range = 9 - aggro_vision_range = 9 - move_force = MOVE_FORCE_VERY_STRONG - move_resist = MOVE_FORCE_VERY_STRONG - pull_force = MOVE_FORCE_VERY_STRONG - butcher_results = list(/obj/item/stack/ore/diamond = 3, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 10, /obj/item/stack/sheet/animalhide/ashdrake = 1) - loot = list() - crusher_loot = /obj/item/crusher_trophy/tail_spike - deathmessage = "collapses on its side." - deathsound = 'sound/magic/demon_dies.ogg' - stat_attack = HARD_CRIT - robust_searching = TRUE - footstep_type = FOOTSTEP_MOB_CLAW - /// How far the whelps fire can go - var/fire_range = 4 - -/mob/living/simple_animal/hostile/asteroid/ice_whelp/Shoot() - var/turf/target_fire_turf = get_ranged_target_turf_direct(src, target, fire_range) - var/list/burn_turfs = get_line(src, target_fire_turf) - get_turf(src) - dragon_fire_line(src, burn_turfs, frozen = TRUE) - -/mob/living/simple_animal/hostile/asteroid/ice_whelp/Life(delta_time = SSMOBS_DT, times_fired) - . = ..() - if(!. || target) - return - adjustHealth(-0.0125 * maxHealth * delta_time) - -/mob/living/simple_animal/hostile/asteroid/ice_whelp/death(gibbed) - move_force = MOVE_FORCE_DEFAULT - move_resist = MOVE_RESIST_DEFAULT - pull_force = PULL_FORCE_DEFAULT - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm index 33cb4513c995..5c5d9305f5ab 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm @@ -32,7 +32,6 @@ butcher_results = list(/obj/item/food/meat/crab = 2, /obj/item/stack/sheet/bone = 2) robust_searching = TRUE footstep_type = FOOTSTEP_MOB_CLAW - crusher_loot = /obj/item/crusher_trophy/lobster_claw /// Charging ability var/datum/action/cooldown/mob_cooldown/charge/basic_charge/charge @@ -57,16 +56,3 @@ icon_living = "lobstrosity" icon_dead = "lobstrosity_dead" weather_immunities = list(TRAIT_LAVA_IMMUNE,TRAIT_ASHSTORM_IMMUNE) - -/obj/item/crusher_trophy/lobster_claw - name = "lobster claw" - icon_state = "lobster_claw" - desc = "A lobster claw." - denied_type = /obj/item/crusher_trophy/lobster_claw - bonus_value = 1 - -/obj/item/crusher_trophy/lobster_claw/effect_desc() - return "mark detonation to briefly stagger the target for [bonus_value] seconds" - -/obj/item/crusher_trophy/lobster_claw/on_mark_detonation(mob/living/target, mob/living/user) - target.apply_status_effect(/datum/status_effect/stagger, bonus_value SECONDS) 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 a2d565ad0fea..da83869530d1 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 @@ -13,14 +13,12 @@ response_harm_simple = "strike" status_flags = 0 combat_mode = TRUE - var/crusher_loot var/throw_message = "bounces off of" var/fromtendril = FALSE see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE var/icon_aggro = null - var/crusher_drop_mod = 25 /mob/living/simple_animal/hostile/asteroid/Aggro() ..() @@ -33,30 +31,17 @@ return icon_state = icon_living -/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/projectile/P)//Reduces damage from most projectiles to curb off-screen kills +/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/projectile/P) if(!stat) Aggro() - if(P.damage < 30 && P.damage_type != BRUTE) - P.damage = (P.damage / 3) - visible_message(span_danger("[P] has a reduced effect on [src]!")) ..() -/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) //No floor tiling them to death, wiseguy +/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) if(istype(AM, /obj/item)) - var/obj/item/T = AM if(!stat) Aggro() - if(T.throwforce <= 20) - visible_message(span_notice("The [T.name] [throw_message] [src.name]!")) - return ..() /mob/living/simple_animal/hostile/asteroid/death(gibbed) SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type) - var/datum/status_effect/crusher_damage/C = has_status_effect(/datum/status_effect/crusher_damage) - if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item - spawn_crusher_loot() ..(gibbed) - -/mob/living/simple_animal/hostile/asteroid/proc/spawn_crusher_loot() - butcher_results[crusher_loot] = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm index aabbebd41271..5aefcd5379e7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/polarbear.dm @@ -29,8 +29,7 @@ butcher_results = list(/obj/item/food/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2) guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1) loot = list() - crusher_loot = /obj/item/crusher_trophy/bear_paw - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = TRUE footstep_type = FOOTSTEP_MOB_CLAW /// Message for when the polar bear starts to attack faster @@ -71,20 +70,3 @@ name = "magic polar bear" desc = "It seems sentient somehow." faction = list("neutral") - -/obj/item/crusher_trophy/bear_paw - name = "polar bear paw" - desc = "It's a polar bear paw." - icon_state = "bear_paw" - denied_type = /obj/item/crusher_trophy/bear_paw - -/obj/item/crusher_trophy/bear_paw/effect_desc() - return "mark detonation to attack twice if you are below half your life" - -/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user) - if(user.health / user.maxHealth > 0.5) - return - var/obj/item/I = user.get_active_held_item() - if(!I) - return - I.melee_attack_chain(user, target, null) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm index 61ce1ffea9c0..32c04d6098a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/wolf.dm @@ -31,8 +31,7 @@ pull_force = MOVE_FORCE_WEAK butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2) loot = list() - crusher_loot = /obj/item/crusher_trophy/wolf_ear - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = TRUE footstep_type = FOOTSTEP_MOB_CLAW /// Message for when the wolf decides to start running away @@ -59,15 +58,3 @@ return adjustHealth(-0.0125 * maxHealth * delta_time) retreat_message_said = FALSE - -/obj/item/crusher_trophy/wolf_ear - name = "wolf ear" - desc = "It's a wolf ear." - icon_state = "wolf_ear" - denied_type = /obj/item/crusher_trophy/wolf_ear - -/obj/item/crusher_trophy/wolf_ear/effect_desc() - return "mark detonation to gain a slight speed boost temporarily" - -/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user) - user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 3f3ec5c683af..a57a3b719cb7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -65,7 +65,6 @@ cap_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) UpdateMushroomCap() health = maxHealth - add_cell_sample() . = ..() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) @@ -195,9 +194,5 @@ for(counter=0, counter<=powerlevel, counter++) var/obj/item/food/hugemushroomslice/S = new /obj/item/food/hugemushroomslice(src.loc) S.reagents.add_reagent(/datum/reagent/drug/mushroomhallucinogen, powerlevel) - S.reagents.add_reagent(/datum/reagent/medicine/omnizine, powerlevel) + S.reagents.add_reagent(/datum/reagent/medicine/tricordrazine, powerlevel) S.reagents.add_reagent(/datum/reagent/medicine/synaptizine, powerlevel) - -/mob/living/simple_animal/hostile/mushroom/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_WALKING_MUSHROOM, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm index 29fb502c1a81..884f33347d61 100644 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm @@ -11,7 +11,7 @@ speak_chance = 0 turns_per_move = 5 speed = 0 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 maxHealth = 100 health = 100 @@ -20,7 +20,7 @@ melee_damage_upper = 15 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = TRUE loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 6aeaa709b819..b81251e781b8 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -27,10 +27,6 @@ if(phaser) var/datum/action/innate/creature/teleport/teleport = new(src) teleport.Grant(src) - add_cell_sample() - -/mob/living/simple_animal/hostile/netherworld/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 0) /datum/action/innate/creature background_icon_state = "bg_default" @@ -259,7 +255,7 @@ 'sound/ai/default/shuttlerecalled.ogg', 'sound/ai/default/aimalf.ogg') //hahahaha fuck you code divers //Go fuck yourself asshole. Karma will bite you in the ass for wasting 7 minutes of my life. -/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) ..() if(stat) return @@ -306,6 +302,10 @@ .=..() START_PROCESSING(SSprocessing, src) +/obj/structure/spawner/nether/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/structure/spawner/nether/examine(mob/user) . = ..() if(isskeleton(user) || iszombie(user)) diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index 188cd540bb10..1c36ec503ebc 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -37,7 +37,6 @@ /mob/living/simple_animal/hostile/ooze/Initialize(mapload) . = ..() create_reagents(300) - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) /mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user) @@ -100,7 +99,7 @@ damage_coeff = list(BRUTE = 1, BURN = 0.6, TOX = 0.5, CLONE = 1.5, STAMINA = 0, OXY = 1) melee_damage_lower = 20 melee_damage_upper = 20 - armour_penetration = 15 + armor_penetration = 15 obj_damage = 20 deathmessage = "collapses into a pile of goo!" ///The ability to give yourself a metabolic speed boost which raises heat @@ -128,9 +127,6 @@ return FALSE consume.stop_consuming() -/mob/living/simple_animal/hostile/ooze/gelatinous/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_GELATINOUS, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - ///This ability lets the gelatinious ooze speed up for a little bit /datum/action/cooldown/metabolicboost name = "Metabolic boost" @@ -213,16 +209,17 @@ if(!.) return var/mob/living/simple_animal/hostile/ooze/gelatinous/ooze = owner - if(!isliving(ooze.pulling)) - to_chat(src, span_warning("You need to be pulling a creature for this to work!")) + var/mob/living/target = ooze.get_active_grab()?.affecting + if(!isliving(target)) + to_chat(src, span_warning("You need to be gripping a creature for this to work!")) return FALSE if(vored_mob) to_chat(src, span_warning("You are already consuming another creature!")) return FALSE owner.visible_message(span_warning("[ooze] starts attempting to devour [target]!"), span_notice("You start attempting to devour [target].")) - if(!do_after(ooze, ooze.pulling, 1.5 SECONDS)) + if(!do_after(ooze, target, 1.5 SECONDS)) return FALSE - var/mob/living/eat_target = ooze.pulling + var/mob/living/eat_target = target if(!(eat_target.mob_biotypes & MOB_ORGANIC) || eat_target.stat == DEAD) to_chat(src, span_warning("This creature isn't to my tastes!")) @@ -289,9 +286,6 @@ var/datum/action/cooldown/gel_cocoon/gel_cocoon = new(src) gel_cocoon.Grant(src) -/mob/living/simple_animal/hostile/ooze/grapes/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_GRAPE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - ///Ability that allows the owner to fire healing globules at mobs, targetting specific limbs. /datum/action/cooldown/globules name = "Fire Mending globule" @@ -352,7 +346,7 @@ var/modifiers = params2list(params) var/obj/projectile/globule/globule = new(caller.loc) globule.preparePixelProjectile(target, caller, modifiers) - globule.def_zone = caller.zone_selected + globule.aimed_def_zone = caller.zone_selected globule.fire() return TRUE @@ -384,7 +378,7 @@ . = ..() bodypart = null -/obj/item/mending_globule/embedded(mob/living/carbon/human/embedded_mob, obj/item/bodypart/part) +/obj/item/mending_globule/embedded(obj/item/bodypart/part) . = ..() if(!istype(part)) return @@ -423,14 +417,15 @@ ///Try to put the pulled mob in a cocoon /datum/action/cooldown/gel_cocoon/proc/gel_cocoon() var/mob/living/simple_animal/hostile/ooze/grapes/ooze = owner - if(!iscarbon(ooze.pulling)) + var/mob/living/carbon/target = ooze.get_active_grab()?.affecting + if(!iscarbon(target)) to_chat(src, span_warning("You need to be pulling an intelligent enough creature to assist it with a cocoon!")) return FALSE owner.visible_message(span_nicegreen("[ooze] starts attempting to put [target] into a gel cocoon!"), span_notice("You start attempting to put [target] into a gel cocoon.")) - if(!do_after(ooze, ooze.pulling, 1.5 SECONDS)) + if(!do_after(ooze, target, 1.5 SECONDS)) return FALSE - put_in_cocoon(ooze.pulling) + put_in_cocoon(target) ooze.adjust_ooze_nutrition(-30) ///Mob needs to have enough nutrition @@ -488,8 +483,8 @@ if(inhabitant.reagents.get_reagent_amount(/datum/reagent/medicine/atropine) < 5) inhabitant.reagents.add_reagent(/datum/reagent/medicine/atropine, 0.5) - if(inhabitant.reagents.get_reagent_amount(/datum/reagent/medicine/salglu_solution) < 15) - inhabitant.reagents.add_reagent(/datum/reagent/medicine/salglu_solution, 1.5) + if(inhabitant.reagents.get_reagent_amount(/datum/reagent/medicine/saline_glucose) < 15) + inhabitant.reagents.add_reagent(/datum/reagent/medicine/saline_glucose, 1.5) if(inhabitant.reagents.get_reagent_amount(/datum/reagent/consumable/milk) < 20) inhabitant.reagents.add_reagent(/datum/reagent/consumable/milk, 2) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/pirate.dm index b9a95269bf3d..b88eb276d35d 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/pirate.dm @@ -19,7 +19,7 @@ melee_damage_upper = 10 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = TRUE atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 7.5 @@ -37,7 +37,7 @@ icon_dead = "piratemelee_dead" melee_damage_lower = 30 melee_damage_upper = 30 - armour_penetration = 35 + armor_penetration = 35 attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 9d559403832c..05ef8db9f125 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -398,11 +398,12 @@ taste_description = "something funny" overdose_threshold = 20 -/datum/reagent/rat_spit/on_mob_metabolize(mob/living/L) - ..() - if(HAS_TRAIT(L, TRAIT_AGEUSIA)) +/datum/reagent/rat_spit/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return + if(HAS_TRAIT(C, TRAIT_AGEUSIA)) return - to_chat(L, span_notice("This food has a funny taste!")) + to_chat(C, span_notice("This food has a funny taste!")) /datum/reagent/rat_spit/overdose_start(mob/living/M) ..() @@ -411,15 +412,14 @@ to_chat(victim, span_userdanger("With this last sip, you feel your body convulsing horribly from the contents you've ingested. As you contemplate your actions, you sense an awakened kinship with rat-kind and their newly risen leader!")) victim.faction |= "rat" victim.vomit() - metabolization_rate = 10 * REAGENTS_METABOLISM + metabolization_rate = 10 * initial(metabolization_rate) -/datum/reagent/rat_spit/on_mob_life(mob/living/carbon/C) +/datum/reagent/rat_spit/affect_blood(mob/living/carbon/C, removed) if(prob(15)) to_chat(C, span_notice("You feel queasy!")) - C.adjust_disgust(3) + C.adjust_disgust(3 * removed) else if(prob(10)) to_chat(C, span_warning("That food does not sit up well!")) - C.adjust_disgust(5) + C.adjust_disgust(5 * removed) else if(prob(5)) C.vomit() - ..() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index 4d1dac06918f..3d4ac21d9553 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -42,7 +42,7 @@ /mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus //Despite being a bat for... reasons, this is now a spider, and is one of the HoS' pets. name = "Sergeant Araneus" real_name = "Sergeant Araneus" - desc = "A fierce companion of the Head of Security, this spider has been carefully trained by Nanotrasen specialists. Its beady, staring eyes send shivers down your spine." + desc = "A fierce companion of the Security Marshal, this spider has been carefully trained by Nanotrasen specialists. Its beady, staring eyes send shivers down your spine." emote_hear = list("chitters") faction = list("spiders") harm_intent_damage = 3 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 3cea9f59055a..fefe41f47599 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -64,7 +64,7 @@ response_disarm_continuous = "gently scoops and pours aside" response_disarm_simple = "gently scoop and pour aside" emote_see = list("bubbles", "oozes") - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/foam) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/particle_effect/fluid/foam) /mob/living/simple_animal/hostile/retaliate/clown/lube/Initialize(mapload) . = ..() @@ -288,11 +288,11 @@ maxHealth = 500 health = 500 speed = -2 - armour_penetration = 20 + armor_penetration = 20 attack_verb_continuous = "steals the girlfriend of" attack_verb_simple = "steal the girlfriend of" attack_sound = 'sound/items/airhorn2.ogg' - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus name = "Honkmunculus" @@ -315,8 +315,8 @@ attack_verb_continuous = "ferociously mauls" attack_verb_simple = "ferociously maul" environment_smash = ENVIRONMENT_SMASH_NONE - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/foam, /obj/item/soap) - attack_reagent = /datum/reagent/peaceborg/confuse + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/xeno/bodypartless, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) + attack_reagent = /datum/reagent/cryptobiolin /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/destroyer name = "The Destroyer" @@ -332,13 +332,13 @@ harm_intent_damage = 30 melee_damage_lower = 20 melee_damage_upper = 40 - armour_penetration = 30 - stat_attack = HARD_CRIT + armor_penetration = 30 + stat_attack = UNCONSCIOUS attack_verb_continuous = "acts out divine vengeance on" attack_verb_simple = "act out divine vengeance on" obj_damage = 50 environment_smash = ENVIRONMENT_SMASH_RWALLS - loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/foam, /obj/item/soap) + loot = list(/obj/item/clothing/mask/gas/clown_hat, /obj/effect/gibspawner/human, /obj/effect/particle_effect/fluid/foam, /obj/item/soap) /mob/living/simple_animal/hostile/retaliate/clown/mutant name = "Unknown" @@ -399,7 +399,6 @@ var/datum/action/cooldown/regurgitate/spit = new(src) spit.Grant(src) - add_cell_sample() AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/cheesiehonkers, /obj/item/food/cornchips), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, PROC_REF(tamed))) @@ -460,9 +459,6 @@ buckle_lying = 0 AddElement(/datum/element/ridable, /datum/component/riding/creature/glutton) -/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_GLUTTON, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton/Exited(atom/movable/gone, direction) . = ..() prank_pouch -= gone diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index 4f4652cb47c5..f1a91ff0b005 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -49,7 +49,6 @@ COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) AddElement(/datum/element/connect_loc, loc_connections) - add_cell_sample() /mob/living/simple_animal/hostile/retaliate/frog/proc/on_entered(datum/source, AM as mob|obj) SIGNAL_HANDLER @@ -59,7 +58,3 @@ var/mob/living/L = AM if(L.mob_size > MOB_SIZE_TINY) playsound(src, stepped_sound, 50, TRUE) - -/mob/living/simple_animal/hostile/retaliate/frog/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_FROG, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 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 35464deaadcf..145a90cb17f3 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -30,7 +30,7 @@ maxbodytemp = 1500 //pressure_resistance = 300 gold_core_spawnable = NO_SPAWN //too spooky for science - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 // same glowing as visible player ghosts light_power = 2 var/ghost_hairstyle diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/hog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/hog.dm new file mode 100644 index 000000000000..eb7d8ec2bd77 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/hog.dm @@ -0,0 +1,106 @@ +/mob/living/simple_animal/hostile/retaliate/hog + name = "feral hog" + desc = "A huge, mangy looking hog. Aggravating it might not be a good idea." + icon_state = "hog" + icon_living = "hog" + icon_dead = "hog_dead" + icon_gib = "brownbear_gib" + speed = 0 + maxHealth = 80 + health = 80 + harm_intent_damage = 5 + turns_per_move = 5 + melee_damage_lower = 20 + melee_damage_upper = 25 + response_help_continuous = "squeezes" + response_help_simple = "squeeze" + attack_verb_continuous = "rams" + attack_verb_simple = "ram" + butcher_results = list(/obj/item/food/meat/slab = 5) //i would add pork but i don't want to touch crafting menu cooking + attack_sound = 'sound/creatures/hog/hogattack.ogg' + deathsound = 'sound/creatures/hog/hogdeath.ogg' + obj_damage = 80 //do not underestimate the destructive ability of an angry hog + environment_smash = ENVIRONMENT_SMASH_STRUCTURES + attack_vis_effect = ATTACK_EFFECT_SMASH + ranged_cooldown_time = 10 SECONDS + speak_emote = list("oinks") + can_buckle = TRUE + var/territorial = TRUE + var/rename = TRUE + +/mob/living/simple_animal/hostile/retaliate/hog/Initialize(mapload) + . = ..() + AddElement(/datum/element/ridable, /datum/component/riding/creature/hog) + if(territorial) + AddComponent(/datum/component/connect_range, src, list(COMSIG_ATOM_ENTERED = PROC_REF(checkEntered)), 1, FALSE) + if(rename) + switch (gender) + if(MALE) + name = "feral boar" + if(FEMALE) + name = "feral sow" + +/mob/living/simple_animal/hostile/retaliate/hog/Life(delta_time = SSMOBS_DT, times_fired) + . = ..() + if(stat == CONSCIOUS) + if(prob(5)) + playsound(src, 'sound/creatures/hog/hoggrunt.ogg', 50, TRUE) + var/obj/item/food/fooditem = locate(/obj/item/food) in view(1, src) + if(fooditem && Adjacent(fooditem)) + consume(fooditem) + +/mob/living/simple_animal/hostile/retaliate/hog/AttackingTarget() + if(istype(target, /obj/item/food)) + consume(target) + return + if(ismob(target)) + var/mob/living/moving_target = target + if(moving_target.buckled == src) + return + return ..() + +/mob/living/simple_animal/hostile/retaliate/hog/proc/consume(atom/movable/fooditem) + playsound(src, 'sound/items/eatfood.ogg', 50, TRUE) + visible_message("[name] eats the [fooditem].") + qdel(fooditem) + if(health == maxHealth) + return + health += 5 + if(health > maxHealth) + health = maxHealth + +/mob/living/simple_animal/hostile/retaliate/hog/proc/checkEntered(datum/source, atom/movable/arrived) + if(stat != CONSCIOUS) //not 100% sure if this is needed + return + if(arrived == src) + return + if(!ismob(arrived)) + return + if(target) + return + hogAlert() + Retaliate() + +/mob/living/simple_animal/hostile/retaliate/hog/proc/hogAlert() //YOU HAVE ALERTED THE HOG + var/obj/effect/overlay/vis/overlay = new() + overlay.icon = 'icons/mob/animal.dmi' + overlay.icon_state = "hog_alert_overlay" + overlay.layer += 1 + vis_contents += overlay + QDEL_IN(overlay, 1.5 SECONDS) + playsound(src, 'sound/creatures/hog/hogscream.ogg', 50, TRUE) + +/mob/living/simple_animal/hostile/retaliate/hog/proc/flingRider(atom/rider) //shouldn't trigger if the hog has a client. + playsound(src, 'sound/creatures/hog/hogscream.ogg', 50, TRUE) + emote("spin") + +/mob/living/simple_animal/hostile/retaliate/hog/security + name = "Lieutenant Hoggison" + desc = "A large, greasy hog that was rescued by security during an illegal pork trafficking operation. This pig is now the beloved pet of security, despite all the jokes made by the crew." + icon_state = "hog_officer" + icon_living = "hog_officer" + melee_damage_lower = 15 //life as a domestic pet has reduced this hog's combat ability. + melee_damage_upper = 15 + obj_damage = 40 + territorial = FALSE + rename = FALSE 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 617c8e80ebfb..88bedd66fcf9 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm @@ -22,7 +22,7 @@ melee_damage_upper = 10 attack_verb_continuous = "hits" attack_verb_simple = "hit" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE del_on_death = 0 @@ -38,7 +38,7 @@ icon_gib = "syndicate_gib" turns_per_move = 5 speed = 0 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 vision_range = 3 maxHealth = 100 @@ -48,7 +48,7 @@ melee_damage_upper = 15 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH faction = list("nanotrasenprivate") mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID diff --git a/code/modules/mob/living/simple_animal/hostile/russian.dm b/code/modules/mob/living/simple_animal/hostile/russian.dm index 3172c56c9572..f87e301326f0 100644 --- a/code/modules/mob/living/simple_animal/hostile/russian.dm +++ b/code/modules/mob/living/simple_animal/hostile/russian.dm @@ -18,7 +18,7 @@ melee_damage_upper = 15 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = TRUE loot = list(/obj/effect/mob_spawn/corpse/human/russian, /obj/item/knife/kitchen) diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index e0241f672c72..3bf8e042747a 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -27,7 +27,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 5 robust_searching = 1 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS faction = list("skeleton") see_in_dark = NIGHTVISION_FOV_RANGE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index 068ff2a838a5..04bb989f94a7 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -52,7 +52,7 @@ melee_damage_upper = 35 melee_damage_lower = 35 mob_size = MOB_SIZE_LARGE - armour_penetration = 30 + armor_penetration = 30 pixel_x = -16 base_pixel_x = -16 maptext_height = 64 @@ -89,8 +89,6 @@ var/rifts_charged = 0 /// Whether or not Space Dragon has completed their objective, and thus triggered the ending sequence. var/objective_complete = FALSE - /// The ability to make your sprite smaller - var/datum/action/small_sprite/space_dragon/small_sprite /// The color of the space dragon. var/chosen_color /// Minimum devastation damage dealt coefficient based on max health @@ -104,9 +102,7 @@ ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_HEALS_FROM_CARP_RIFTS, INNATE_TRAIT) - small_sprite = new - small_sprite.Grant(src) - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) + AddComponent(/datum/component/seethrough_mob) /mob/living/simple_animal/hostile/space_dragon/Login() . = ..() @@ -178,7 +174,7 @@ . = ..() if(istype(target, /obj/vehicle/sealed/mecha)) var/obj/vehicle/sealed/mecha/M = target - M.take_damage(50, BRUTE, MELEE, 1) + M.take_damage(50, BRUTE, BLUNT, 1) /mob/living/simple_animal/hostile/space_dragon/ranged_secondary_attack(atom/target, modifiers) if(using_special) @@ -204,12 +200,10 @@ destroy_rifts() ..() add_dragon_overlay() - UnregisterSignal(small_sprite, COMSIG_ACTION_TRIGGER) /mob/living/simple_animal/hostile/space_dragon/revive(full_heal, admin_revive) . = ..() add_dragon_overlay() - RegisterSignal(small_sprite, COMSIG_ACTION_TRIGGER, PROC_REF(add_dragon_overlay)) /mob/living/simple_animal/hostile/space_dragon/wabbajack_act(mob/living/new_mob) empty_contents() @@ -242,11 +236,12 @@ to_chat(src, span_warning("Not a valid color, please try again.")) color_selection() return - var/temp_hsv = RGBtoHSV(chosen_color) - if(ReadHSV(temp_hsv)[3] < DARKNESS_THRESHOLD) + var/list/temp_hsv = rgb2hsv(chosen_color) + if(temp_hsv[3] < DARKNESS_THRESHOLD) to_chat(src, span_danger("Invalid color. Your color is not bright enough.")) color_selection() return + add_atom_colour(chosen_color, FIXED_COLOUR_PRIORITY) add_dragon_overlay() @@ -257,8 +252,6 @@ */ /mob/living/simple_animal/hostile/space_dragon/proc/add_dragon_overlay() cut_overlays() - if(!small_sprite.small) - return if(stat == DEAD) var/mutable_appearance/overlay = mutable_appearance(icon, "overlay_dead") overlay.appearance_flags = RESET_COLOR @@ -348,7 +341,7 @@ if(M in hit_list) continue hit_list += M - M.take_damage(50, BRUTE, MELEE, 1) + M.take_damage(50, BRUTE, BLUNT, 1) /** * Handles consuming and storing consumed things inside Space Dragon @@ -553,7 +546,7 @@ /obj/structure/carp_rift name = "carp rift" desc = "A rift akin to the ones space carp use to travel long distances." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) max_integrity = 300 icon = 'icons/obj/carp_rift.dmi' icon_state = "carp_rift_carpspawn" @@ -672,7 +665,7 @@ icon_state = "carp_rift_charged" set_light_color(LIGHT_COLOR_DIM_YELLOW) update_light() - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) + setArmor(getArmor(arglist(list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100)))) resistance_flags = INDESTRUCTIBLE dragon.rifts_charged += 1 if(dragon.rifts_charged != 3 && !dragon.objective_complete) @@ -715,13 +708,12 @@ return FALSE var/mob/living/simple_animal/hostile/carp/newcarp = new /mob/living/simple_animal/hostile/carp(loc) - newcarp.AddElement(/datum/element/nerfed_pulling, GLOB.typecache_general_bad_things_to_easily_move) newcarp.AddElement(/datum/element/prevent_attacking_of_types, GLOB.typecache_general_bad_hostile_attack_targets, "this tastes awful!") if(!is_listed) ckey_list += user.ckey newcarp.key = user.key - newcarp.set_name() + newcarp.give_unique_name() var/datum/antagonist/space_dragon/S = dragon?.mind?.has_antag_datum(/datum/antagonist/space_dragon) if(S) S.carp += newcarp.mind diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index fa1e166851af..847b54396994 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -36,7 +36,6 @@ move_to_delay = 0 // Very fast animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue. - hud_possible = list(ANTAG_HUD) see_in_dark = 13 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE @@ -145,7 +144,7 @@ // Cannot talk -/mob/living/simple_animal/hostile/statue/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) +/mob/living/simple_animal/hostile/statue/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) return // Turn to dust when gibbed diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index cf8eec482115..5088d0763356 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -27,7 +27,7 @@ speak_chance = 0 turns_per_move = 5 speed = 0 - stat_attack = HARD_CRIT + stat_attack = UNCONSCIOUS robust_searching = 1 maxHealth = 100 health = 100 @@ -36,7 +36,7 @@ melee_damage_upper = 10 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = TRUE loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) @@ -118,7 +118,7 @@ attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/weapons/blade1.ogg' - armour_penetration = 35 + armor_penetration = 35 light_color = COLOR_SOFT_RED status_flags = 0 var/obj/effect/light_emitter/red_energy_sword/sord diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index f18420af9040..e8d84c4d43a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -49,7 +49,7 @@ /mob/living/simple_animal/hostile/tree/Initialize(mapload) . = ..() - add_cell_sample() + AddComponent(/datum/component/seethrough_mob) /mob/living/simple_animal/hostile/tree/Life(delta_time = SSMOBS_DT, times_fired) ..() @@ -75,9 +75,6 @@ C.visible_message(span_danger("\The [src] knocks down \the [C]!"), \ span_userdanger("\The [src] knocks you down!")) -/mob/living/simple_animal/hostile/tree/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_PINE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/hostile/tree/festivus name = "festivus pole" desc = "Serenity now... SERENITY NOW!" @@ -109,5 +106,3 @@ if(A.cell) A.cell.give(75) -/mob/living/simple_animal/hostile/tree/festivus/add_cell_sample() - return diff --git a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm index a663b63217ed..813ba544c9b9 100644 --- a/code/modules/mob/living/simple_animal/hostile/vatbeast.dm +++ b/code/modules/mob/living/simple_animal/hostile/vatbeast.dm @@ -28,7 +28,6 @@ var/datum/action/cooldown/tentacle_slap/slapper = new(src) slapper.Grant(src) - add_cell_sample() AddComponent(/datum/component/tameable, list(/obj/item/food/fries, /obj/item/food/cheesyfries, /obj/item/food/cornchips, /obj/item/food/carrotfries), tame_chance = 30, bonus_tame_chance = 0, after_tame = CALLBACK(src, PROC_REF(tamed))) /mob/living/simple_animal/hostile/vatbeast/proc/tamed(mob/living/tamer) @@ -36,9 +35,6 @@ AddElement(/datum/element/ridable, /datum/component/riding/creature/vatbeast) faction = list("neutral") -/mob/living/simple_animal/hostile/vatbeast/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_VATBEAST, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /// Ability that allows the owner to slap other mobs a short distance away. /// For vatbeats, this ability is shared with the rider. /datum/action/cooldown/tentacle_slap @@ -55,7 +51,7 @@ ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' /datum/action/cooldown/tentacle_slap/update_button_name(atom/movable/screen/movable/action_button/button, force) - if(button.our_hud.mymob != owner) + if(button.hud.mymob != owner) // For buttons given to mobs which are not our owner, give it this alt name button.name = "Command Tentacle Slap" button.desc = "Command your steed to slap a creature with its tentacles." 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 934cfddd5c1c..f55e581f241e 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 @@ -182,7 +182,7 @@ if(O.density) return - var/datum/beam/newVine = Beam(the_target, icon_state = "vine", maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine) + var/datum/beam/newVine = Beam(the_target, icon_state = "vine", maxdistance = vine_grab_distance, beam_type=/obj/effect/ebeam/vine, emissive = FALSE) RegisterSignal(newVine, COMSIG_PARENT_QDELETING, PROC_REF(remove_vine), newVine) vines += newVine if(isliving(the_target)) diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm index e844ceb12c18..78b4bcf5568f 100644 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/wizard.dm @@ -17,7 +17,7 @@ melee_damage_upper = 5 attack_verb_continuous = "punches" attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH combat_mode = TRUE atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 7.5 @@ -41,7 +41,7 @@ /mob/living/simple_animal/hostile/wizard/Initialize(mapload) . = ..() var/obj/item/implant/exile/exiled = new /obj/item/implant/exile(src) - exiled.implant(src) + exiled.implant(src, body_zone = BODY_ZONE_CHEST) fireball = new(src) fireball.spell_requirements &= ~(SPELL_REQUIRES_HUMAN|SPELL_REQUIRES_WIZARD_GARB|SPELL_REQUIRES_MIND) diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index e0c84e0da030..6a7f71074140 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -37,7 +37,7 @@ melee_damage_upper = 0 attack_verb_continuous = "chomps" attack_verb_simple = "chomp" - attack_sound = 'sound/weapons/punch1.ogg' + attack_sound = SFX_PUNCH attack_vis_effect = ATTACK_EFFECT_BITE throw_message = "is avoided by the" aggro_vision_range = 9 @@ -51,6 +51,7 @@ /mob/living/simple_animal/hostile/asteroid/fugu/Initialize(mapload) . = ..() + AddComponent(/datum/component/seethrough_mob) E = new E.Grant(src) @@ -157,6 +158,7 @@ ADD_TRAIT(animal, TRAIT_FUGU_GLANDED, type) + animal.AddComponent(/datum/component/seethrough_mob) animal.maxHealth *= 1.5 animal.health = min(animal.maxHealth, animal.health * 1.5) animal.melee_damage_lower = max((animal.melee_damage_lower * 2), 10) diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 600e82cd5951..38f53da50b5f 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -7,7 +7,7 @@ mob_biotypes = MOB_ORGANIC|MOB_HUMANOID sentience_type = SENTIENCE_HUMANOID speak_chance = 0 - stat_attack = HARD_CRIT //braains + stat_attack = UNCONSCIOUS //braains maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 79df1a0c8114..26fb3e492ca8 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -111,12 +111,7 @@ /mob/living/simple_animal/parrot/Initialize(mapload) . = ..() if(!ears) - var/headset = pick(/obj/item/radio/headset/headset_sec, \ - /obj/item/radio/headset/headset_eng, \ - /obj/item/radio/headset/headset_med, \ - /obj/item/radio/headset/headset_sci, \ - /obj/item/radio/headset/headset_cargo) - ears = new headset(src) + ears = new /obj/item/radio/headset/headset_eng(src) parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var @@ -130,6 +125,11 @@ AddElement(/datum/element/strippable, GLOB.strippable_parrot_items, TYPE_PROC_REF(/mob/living, should_strip)) AddElement(/datum/element/simple_flying) + +/mob/living/simple_animal/parrot/Destroy() + QDEL_NULL(ears) + return ..() + /mob/living/simple_animal/parrot/examine(mob/user) . = ..() if(stat) @@ -159,7 +159,7 @@ . += "Held Item: [held_item]" . += "Combat mode: [combat_mode ? "On" : "Off"]" -/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc) +/mob/living/simple_animal/parrot/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, list/spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() if(speaker != src && prob(50)) //Dont imitate ourselves if(!radio_freq || prob(10)) @@ -377,7 +377,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( ..() //Sprite update for when a parrot gets pulled - if(pulledby && !stat && parrot_state != PARROT_WANDER) + if(LAZYLEN(grabbed_by) && !stat && parrot_state != PARROT_WANDER) if(buckled) buckled.unbuckle_mob(src, TRUE) buckled = null @@ -641,6 +641,8 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( continue if(istype(AM, /obj/item)) var/obj/item/I = AM + if(I.item_flags & ABSTRACT) + continue if(I.w_class < WEIGHT_CLASS_SMALL) item = I else if(iscarbon(AM)) @@ -650,7 +652,7 @@ GLOBAL_LIST_INIT(strippable_parrot_items, create_strippable_list(list( item = I break if(item) - if(!get_path_to(src, item)) + if(!length(jps_path_to(src, item))) // WHY DO WE DISREGARD THE PATH AHHHHHH item = null continue return item diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a68e869bcf97..bfb6bfd247d2 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -84,7 +84,7 @@ ///how much damage this simple animal does to objects, if any. var/obj_damage = 0 ///How much armour they ignore, as a flat reduction from the targets armour value. - var/armour_penetration = 0 + var/armor_penetration = 0 ///Damage type of a simple mob's melee attack, should it do damage. var/melee_damage_type = BRUTE /// 1 for full damage , 0 for none , -1 for 1:1 heal from that source. @@ -171,7 +171,7 @@ if(gender == PLURAL) gender = pick(MALE,FEMALE) if(!real_name) - real_name = name + set_real_name(name) if(!loc) stack_trace("Simple animal being instantiated in nullspace") update_simplemob_varspeed() @@ -263,7 +263,7 @@ turns_since_move++ if(turns_since_move < turns_per_move) return TRUE - if(stop_automated_movement_when_pulled && pulledby) //Some animals don't move when pulled + if(stop_automated_movement_when_pulled && LAZYLEN(grabbed_by)) //Some animals don't move when pulled return TRUE var/anydir = pick(GLOB.cardinals) if(Process_Spacemove(anydir)) @@ -309,7 +309,7 @@ /mob/living/simple_animal/proc/environment_air_is_safe() . = TRUE - if(pulledby && pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) + if(HAS_TRAIT(src, TRAIT_KILL_GRAB) && atmos_requirements["min_oxy"]) . = FALSE //getting choked if(isturf(loc) && isopenturf(loc)) @@ -432,7 +432,7 @@ /mob/living/simple_animal/proc/update_simplemob_varspeed() if(speed == 0) remove_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, multiplicative_slowdown = speed) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/simplemob_varspeed, slowdown = speed) /mob/living/simple_animal/get_status_tab_items() . = ..() @@ -591,10 +591,13 @@ return if(!dextrous) return + if(!hand_index) hand_index = (active_hand_index % held_items.len)+1 + var/oindex = active_hand_index active_hand_index = hand_index + if(hud_used) var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[hand_index]"] @@ -604,6 +607,8 @@ if(H) H.update_appearance() + update_mouse_pointer() + /mob/living/simple_animal/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) . = ..() update_held_items() @@ -648,7 +653,7 @@ stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") /mob/living/simple_animal/proc/consider_wakeup() - if (pulledby || shouldwakeup) + if (LAZYLEN(grabbed_by) || shouldwakeup) toggle_ai(AI_ON) /mob/living/simple_animal/on_changed_z_level(turf/old_turf, turf/new_turf) @@ -657,10 +662,6 @@ SSidlenpcpool.idle_mobs_by_zlevel[old_turf.z] -= src toggle_ai(initial(AIStatus)) -///This proc is used for adding the swabbale element to mobs so that they are able to be biopsied and making sure holograpic and butter-based creatures don't yield viable cells samples. -/mob/living/simple_animal/proc/add_cell_sample() - return - /mob/living/simple_animal/relaymove(mob/living/user, direction) if(user.incapacitated()) return diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index ff1c595eb387..752aeaa6b6e3 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -20,7 +20,6 @@ handle_nutrition(delta_time, times_fired) if(QDELETED(src)) // Stop if the slime split during handle_nutrition() return - reagents.remove_all(0.5 * REAGENTS_METABOLISM * reagents.reagent_list.len * delta_time) //Slimes are such snowflakes handle_targets(delta_time, times_fired) if(ckey) return @@ -31,7 +30,7 @@ // Unlike most of the simple animals, slimes support UNCONSCIOUS. This is an ugly hack. /mob/living/simple_animal/slime/update_stat() switch(stat) - if(UNCONSCIOUS, HARD_CRIT) + if(UNCONSCIOUS) if(health > 0) return return ..() @@ -106,7 +105,7 @@ AIproc = 0 break - var/sleeptime = cached_multiplicative_slowdown + var/sleeptime = movement_delay if(sleeptime <= 0) sleeptime = 1 @@ -141,27 +140,7 @@ adjustBruteLoss(round(sqrt(bodytemperature)) * delta_time) else REMOVE_TRAIT(src, TRAIT_IMMOBILIZED, SLIME_COLD) - /* - if(stat != DEAD) - var/bz_percentage =0 - if(environment.gases[/datum/gas/bz]) - bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.get_moles() - var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis - - switch(stat) - if(CONSCIOUS) - if(stasis) - to_chat(src, span_danger("Nerve gas in the air has put you in stasis!")) - set_stat(UNCONSCIOUS) - powerlevel = 0 - rabid = FALSE - regenerate_icons() - if(UNCONSCIOUS, HARD_CRIT) - if(!stasis) - to_chat(src, span_notice("You wake up from the stasis.")) - set_stat(CONSCIOUS) - regenerate_icons() - */ + updatehealth() @@ -377,7 +356,7 @@ else if(holding_still) holding_still = max(holding_still - (0.5 * delta_time), 0) - else if (docile && pulledby) + else if (docile && LAZYLEN(grabbed_by)) holding_still = 10 else if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && isturf(loc) && prob(33)) step(src, pick(GLOB.cardinals)) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index c2885f7ba96c..e1b890be7330 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -100,11 +100,9 @@ else var/datum/action/innate/slime/evolve/E = new E.Grant(src) - create_reagents(100) set_colour(new_colour) . = ..() set_nutrition(700) - add_cell_sample() ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) AddElement(/datum/element/soft_landing) @@ -118,16 +116,6 @@ clear_friends() return ..() -/mob/living/simple_animal/slime/create_reagents(max_vol, flags) - . = ..() - RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles removing signal hooks incase someone is crazy enough to reset the reagents datum. -/mob/living/simple_animal/slime/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_PARENT_QDELETING)) - return NONE /mob/living/simple_animal/slime/proc/set_colour(new_colour) colour = new_colour @@ -140,8 +128,7 @@ /mob/living/simple_animal/slime/update_name() if(slime_name_regex.Find(name)) number = rand(1, 1000) - name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" - real_name = name + set_real_name("[colour] [is_adult ? "adult" : "baby"] slime ([number])", update_name = FALSE) return ..() /mob/living/simple_animal/slime/proc/random_colour() @@ -159,22 +146,6 @@ icon_state = icon_dead ..() -/** - * Snowflake handling of reagent movespeed modifiers - * - * Should be moved to the reagents at some point in the future. As it is I'm in a hurry. - */ -/mob/living/simple_animal/slime/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - remove_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod) - var/amount = 0 - if(reagents.has_reagent(/datum/reagent/medicine/morphine)) // morphine slows slimes down - amount = 2 - if(reagents.has_reagent(/datum/reagent/consumable/frostoil)) // Frostoil also makes them move VEEERRYYYYY slow - amount = 5 - if(amount) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_reagentmod, multiplicative_slowdown = amount) - return NONE /mob/living/simple_animal/slime/updatehealth() . = ..() @@ -185,7 +156,7 @@ mod += (health_deficiency / 25) if(health <= 0) mod += 2 - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, multiplicative_slowdown = mod) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_healthmod, slowdown = mod) /mob/living/simple_animal/slime/adjust_bodytemperature() . = ..() @@ -195,7 +166,7 @@ else if(bodytemperature < 283.222) mod = ((283.222 - bodytemperature) / 10) * 1.75 if(mod) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, multiplicative_slowdown = mod) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/slime_tempmod, slowdown = mod) /mob/living/simple_animal/slime/ObjBump(obj/O) if(!client && powerlevel > 0) @@ -235,7 +206,7 @@ . += "You can evolve!" switch(stat) - if(HARD_CRIT, UNCONSCIOUS) + if(UNCONSCIOUS) . += "You are knocked out by high levels of BZ!" else . += "Power Level: [powerlevel]" @@ -268,10 +239,10 @@ Feedon(Food) return ..() -/mob/living/simple_animal/slime/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) +/mob/living/simple_animal/slime/tryUnequipItem(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE) return -/mob/living/simple_animal/slime/start_pulling(atom/movable/AM, state, force = move_force, supress_message = FALSE) +/mob/living/simple_animal/slime/try_make_grab(atom/movable/target, grab_type) return /mob/living/simple_animal/slime/attack_ui(slot, params) @@ -343,11 +314,6 @@ discipline_slime(user) else - if(stat == DEAD && surgeries.len) - if(!user.combat_mode || LAZYACCESS(modifiers, RIGHT_CLICK)) - for(var/datum/surgery/S in surgeries) - if(S.next_step(user, modifiers)) - return 1 if(..()) //successful attack attacked += 10 @@ -358,12 +324,6 @@ /mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) - if(stat == DEAD && surgeries.len) - var/list/modifiers = params2list(params) - if(!user.combat_mode || (LAZYACCESS(modifiers, RIGHT_CLICK))) - for(var/datum/surgery/S in surgeries) - if(S.next_step(user, modifiers)) - return 1 if(istype(W, /obj/item/stack/sheet/mineral/plasma) && !stat) //Let's you feed slimes plasma. add_friendship(user, 1) to_chat(user, span_notice("You feed the slime the plasma. It chirps happily.")) @@ -442,7 +402,7 @@ if (stat == DEAD) . += span_deadsay("It is limp and unresponsive.") else - if (stat == UNCONSCIOUS || stat == HARD_CRIT) // Slime stasis + if (stat == UNCONSCIOUS) // Slime stasis . += span_deadsay("It appears to be alive but unresponsive.") if (getBruteLoss()) . += "" @@ -506,9 +466,6 @@ /mob/living/simple_animal/slime/random/Initialize(mapload, new_colour, new_is_adult) . = ..(mapload, pick(slime_colours), prob(50)) -/mob/living/simple_animal/slime/add_cell_sample() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_SLIME, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - /mob/living/simple_animal/slime/proc/set_target(new_target) var/old_target = Target Target = new_target diff --git a/code/modules/mob/living/simple_animal/slime/slime_say.dm b/code/modules/mob/living/simple_animal/slime/slime_say.dm index 4b6ab65a345a..b3a0cd3f85a2 100644 --- a/code/modules/mob/living/simple_animal/slime/slime_say.dm +++ b/code/modules/mob/living/simple_animal/slime/slime_say.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), atom/sound_loc) +/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, list/message_mods = list(), atom/sound_loc, message_range) . = ..() if(speaker == src || radio_freq || stat || !(speaker in Friends)) return diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index c3200c097689..2072d982deb6 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -15,24 +15,27 @@ return 0 /mob/living/proc/Stun(amount, ignore_canstun = FALSE) //Can't go below remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) - S.duration = max(world.time + amount, S.duration) + if(S.max_duration != -1) + S.duration = clamp(world.time + amount, S.duration, world.time + S.max_duration) + else + S.duration = max(world.time + amount, S.duration) else if(amount > 0) S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount) return S /mob/living/proc/SetStun(amount, ignore_canstun = FALSE) //Sets remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return var/datum/status_effect/incapacitating/stun/S = IsStun() if(amount <= 0) if(S) @@ -41,21 +44,27 @@ if(absorb_stun(amount, ignore_canstun)) return if(S) - S.duration = world.time + amount + if(S.max_duration != -1) + S.duration = min(world.time + amount, world.time + S.max_duration) + else + S.duration = world.time + amount else S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount) return S /mob/living/proc/AdjustStun(amount, ignore_canstun = FALSE) //Adds to remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_STUN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/stun/S = IsStun() if(S) - S.duration += amount + if(S.max_duration != -1) + S.duration = min(S.duration + amount, world.time + S.max_duration) + else + S.duration += amount else if(amount > 0) S = apply_status_effect(/datum/status_effect/incapacitating/stun, amount) return S @@ -71,24 +80,27 @@ return 0 /mob/living/proc/Knockdown(amount, ignore_canstun = FALSE) //Can't go below remaining duration - if(SEND_SIGNAL(src, /datum/status_effect/incapacitating/knockdown, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) - K.duration = max(world.time + amount, K.duration) + if(K.max_duration != -1) + K.duration = clamp(world.time + amount, K.duration, world.time + K.max_duration) + else + K.duration = max(world.time + amount, K.duration) else if(amount > 0) K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) return K /mob/living/proc/SetKnockdown(amount, ignore_canstun = FALSE) //Sets remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(amount <= 0) if(K) @@ -97,21 +109,27 @@ if(absorb_stun(amount, ignore_canstun)) return if(K) - K.duration = world.time + amount + if(K.max_duration != -1) + K.duration = min(world.time + amount, world.time + K.max_duration) + else + K.duration = world.time + amount else K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) return K /mob/living/proc/AdjustKnockdown(amount, ignore_canstun = FALSE) //Adds to remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_KNOCKDOWN, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown() if(K) - K.duration += amount + if(K.max_duration != -1) + K.duration = min(K.duration + amount, world.time + K.max_duration) + else + K.duration += amount else if(amount > 0) K = apply_status_effect(/datum/status_effect/incapacitating/knockdown, amount) return K @@ -127,10 +145,10 @@ return 0 /mob/living/proc/Immobilize(amount, ignore_canstun = FALSE) //Can't go below remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() @@ -141,10 +159,10 @@ return I /mob/living/proc/SetImmobilized(amount, ignore_canstun = FALSE) //Sets remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() if(amount <= 0) if(I) @@ -159,10 +177,10 @@ return I /mob/living/proc/AdjustImmobilized(amount, ignore_canstun = FALSE) //Adds to remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_IMMOBILIZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/immobilized/I = IsImmobilized() @@ -183,24 +201,27 @@ return 0 /mob/living/proc/Paralyze(amount, ignore_canstun = FALSE) //Can't go below remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) - P.duration = max(world.time + amount, P.duration) + if(P.max_duration != -1) + P.duration = clamp(world.time + amount, P.duration, world.time + P.max_duration) + else + P.duration = max(world.time + amount, P.duration) else if(amount > 0) P = apply_status_effect(/datum/status_effect/incapacitating/paralyzed, amount) return P /mob/living/proc/SetParalyzed(amount, ignore_canstun = FALSE) //Sets remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(amount <= 0) if(P) @@ -209,21 +230,27 @@ if(absorb_stun(amount, ignore_canstun)) return if(P) - P.duration = world.time + amount + if(P.max_duration != -1) + P.duration = min(world.time + amount, world.time + P.max_duration) + else + P.duration = world.time + amount else P = apply_status_effect(/datum/status_effect/incapacitating/paralyzed, amount) return P /mob/living/proc/AdjustParalyzed(amount, ignore_canstun = FALSE) //Adds to remaining duration - if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) - return if(IS_STUN_IMMUNE(src, ignore_canstun)) return + if(SEND_SIGNAL(src, COMSIG_LIVING_STATUS_PARALYZE, amount, ignore_canstun) & COMPONENT_NO_STUN) + return if(absorb_stun(amount, ignore_canstun)) return var/datum/status_effect/incapacitating/paralyzed/P = IsParalyzed(FALSE) if(P) - P.duration += amount + if(P.max_duration != -1) + P.duration = min(P.duration + amount, world.time + P.max_duration) + else + P.duration += amount else if(amount > 0) P = apply_status_effect(/datum/status_effect/incapacitating/paralyzed, amount) return P @@ -261,6 +288,8 @@ var/curr_confusion = get_timed_status_effect_duration(/datum/status_effect/confusion) set_timed_status_effect(min(curr_confusion + amount, 15 SECONDS), /datum/status_effect/confusion) + flash_pain(PAIN_MEDIUM) + if(HAS_TRAIT(src, TRAIT_EXHAUSTED)) if(knockdown) if(stack_status) @@ -551,17 +580,26 @@ priority_absorb_key["stuns_absorbed"] += amount return TRUE -/mob/living/proc/add_quirk(quirktype) //separate proc due to the way these ones are handled - if(HAS_TRAIT(src, quirktype)) - return - var/datum/quirk/quirk = quirktype - var/qname = initial(quirk.name) +/** + * Adds the passed quirk to the mob + * + * Arguments + * * quirktype - Quirk typepath to add to the mob + * * override_client - optional, allows a client to be passed to the quirks on add procs. + * If not passed, defaults to this mob's client. + * + * Returns TRUE on success, FALSE on failure (already has the quirk, etc) + */ +/mob/living/proc/add_quirk(datum/quirk/quirktype, client/override_client) + if(has_quirk(quirktype)) + return FALSE + var/qname = initial(quirktype.name) if(!SSquirks || !SSquirks.quirks[qname]) - return - quirk = new quirktype() - if(quirk.add_to_holder(src)) + return FALSE + + var/datum/quirk/quirk = new quirktype() + if(quirk.add_to_holder(new_holder = src, client_source = override_client)) return TRUE - qdel(quirk) return FALSE /mob/living/proc/remove_quirk(quirktype) @@ -583,15 +621,12 @@ REMOVE_TRAIT(src, TRAIT_BLIND, source) else REMOVE_TRAIT_NOT_FROM(src, TRAIT_BLIND, list(QUIRK_TRAIT, EYES_COVERED, BLINDFOLD_TRAIT)) - if(!HAS_TRAIT(src, TRAIT_BLIND)) - update_blindness() + + update_blindness() /mob/living/proc/become_blind(source) - if(!HAS_TRAIT(src, TRAIT_BLIND)) // not blind already, add trait then overlay - ADD_TRAIT(src, TRAIT_BLIND, source) - update_blindness() - else - ADD_TRAIT(src, TRAIT_BLIND, source) + ADD_TRAIT(src, TRAIT_BLIND, source) + update_blindness() /mob/living/proc/cure_nearsighted(source) REMOVE_TRAIT(src, TRAIT_NEARSIGHT, source) @@ -673,18 +708,6 @@ if(update) update_movespeed() -/** - * Sets the [SHOCKED_1] flag on this mob. - */ -/mob/living/proc/set_shocked() - flags_1 |= SHOCKED_1 - -/** - * Unsets the [SHOCKED_1] flag on this mob. - */ -/mob/living/proc/reset_shocked() - flags_1 &= ~ SHOCKED_1 - /** * Adjusts a timed status effect on the mob,taking into account any existing timed status effects. * This can be any status effect that takes into account "duration" with their initialize arguments. diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 463c093cdff0..f19747896aff 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -91,6 +91,8 @@ update_client_colour() update_mouse_pointer() + update_ambience_area(get_area(src)) + if(client) if(client.view_size) client.view_size.resetToDefault() // Resets the client.view in case it was changed. @@ -112,8 +114,6 @@ SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) client.init_verbs() - AddElement(/datum/element/weather_listener, /datum/weather/ash_storm, ZTRAIT_ASHSTORM, GLOB.ash_storm_sounds) - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_MOB_LOGGED_IN, src) return TRUE diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9c43fb76809c..d1dafa252c85 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -25,6 +25,7 @@ * Parent call */ /mob/Destroy()//This makes sure that mobs with clients/keys are not just deleted from the game. + unset_machine() remove_from_mob_list() remove_from_dead_mob_list() remove_from_alive_mob_list() @@ -46,6 +47,10 @@ mind.set_current(null) return ..() +/mob/New() + // This needs to happen IMMEDIATELY. I'm sorry :( + GenerateTag() + return ..() /** * Intialize a mob @@ -81,6 +86,10 @@ AA.onNewMob(src) set_nutrition(rand(NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_START_MAX)) . = ..() + + if(ispath(ai_controller)) + ai_controller = new ai_controller(src) + update_config_movespeed() initialize_actionspeed() update_movespeed(TRUE) @@ -93,26 +102,100 @@ * This is simply "mob_"+ a global incrementing counter that goes up for every mob */ /mob/GenerateTag() + . = ..() tag = "mob_[next_mob_id++]" +/** + * set every hud image in the given category active so other people with the given hud can see it. + * Arguments: + * * hud_category - the index in our active_hud_list corresponding to an image now being shown. + * * update_huds - if FALSE we will just put the hud_category into active_hud_list without actually updating the atom_hud datums subscribed to it + * * exclusive_hud - if given a reference to an atom_hud, will just update that hud instead of all global ones attached to that category. + * This is because some atom_hud subtypes arent supposed to work via global categories, updating normally would affect all of these which we dont want. + */ +/atom/proc/set_hud_image_active(hud_category, update_huds = TRUE, datum/atom_hud/exclusive_hud) + if(!istext(hud_category) || !hud_list?[hud_category] || active_hud_list?[hud_category]) + return FALSE + + LAZYSET(active_hud_list, hud_category, hud_list[hud_category]) + + if(ismovable(src)) + var/atom/movable/AM = src + for(var/atom/movable/mimic as anything in AM.get_associated_mimics()) + mimic.set_hud_image_active(arglist(args)) + + if(!update_huds) + return TRUE + + if(exclusive_hud) + exclusive_hud.add_single_hud_category_on_atom(src, hud_category) + else + for(var/datum/atom_hud/hud_to_update as anything in GLOB.huds_by_category[hud_category]) + hud_to_update.add_single_hud_category_on_atom(src, hud_category) + + return TRUE + +///sets every hud image in the given category inactive so no one can see it +/atom/proc/set_hud_image_inactive(hud_category, update_huds = TRUE, datum/atom_hud/exclusive_hud) + if(!istext(hud_category)) + return FALSE + + LAZYREMOVE(active_hud_list, hud_category) + + if(ismovable(src)) + var/atom/movable/AM = src + for(var/atom/movable/mimic as anything in AM.get_associated_mimics()) + mimic.set_hud_image_active(arglist(args)) + + if(!update_huds) + return TRUE + + if(exclusive_hud) + exclusive_hud.remove_single_hud_category_on_atom(src, hud_category) + else + for(var/datum/atom_hud/hud_to_update as anything in GLOB.huds_by_category[hud_category]) + hud_to_update.remove_single_hud_category_on_atom(src, hud_category) + + return TRUE + /** * Prepare the huds for this atom * - * Goes through hud_possible list and adds the images to the hud_list variable (if not already - * cached) + * Goes through hud_possible list and adds the images to the hud_list variable (if not already cached) */ /atom/proc/prepare_huds() + if(hud_list) // I choose to be lienient about people calling this proc more then once + return + hud_list = list() + for(var/hud in hud_possible) var/hint = hud_possible[hud] - switch(hint) - if(HUD_LIST_LIST) - hud_list[hud] = list() - else - var/image/I = image('icons/mob/huds/hud.dmi', src, "") - I.appearance_flags = RESET_COLOR|RESET_TRANSFORM - hud_list[hud] = I + if(hint == HUD_LIST_LIST) + hud_list[hud] = list() + + else + var/image/I = image(hint, src, "") + I.appearance_flags = RESET_COLOR|RESET_TRANSFORM + hud_list[hud] = I + + set_hud_image_active(hud, update_huds = FALSE) //by default everything is active. but dont add it to huds to keep control. + +/// Update the icon_state of an atom hud image. +/atom/proc/set_hud_image_vars(hud_key, new_state = null, new_pixel_y = 0) + if(isnull(hud_list)) + return + + var/image/I = hud_list[hud_key] + if(isnull(I)) + return + + I.icon_state = new_state + I.pixel_y = new_pixel_y + if(!isarea(src) && !isturf(src)) + var/atom/movable/AM = src + AM.bound_overlay?.set_hud_image_vars(hud_key, new_state, new_pixel_y) /** * Return the desc of this mob for a photo */ @@ -122,34 +205,37 @@ /** * Show a message to this mob (visual or audible) */ -/mob/proc/show_message(msg, type, alt_msg, alt_type, avoid_highlighting = FALSE)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) +/mob/show_message(msg, type, alt_msg, alt_type, avoid_highlighting = FALSE)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) if(!client) return msg = copytext_char(msg, 1, MAX_MESSAGE_LEN) if(type) - if(type & MSG_VISUAL && is_blind() )//Vision related + if((type & MSG_VISUAL) && is_blind() )//Vision related if(!alt_msg) return else msg = alt_msg type = alt_type - if(type & MSG_AUDIBLE && !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 & MSG_VISUAL && is_blind()) + if((type & MSG_VISUAL) && is_blind()) return + // voice muffling - if(stat == UNCONSCIOUS || stat == HARD_CRIT) + if(stat == UNCONSCIOUS) if(type & MSG_AUDIBLE) //audio - to_chat(src, "... You can almost hear something ...") + to_chat(src, span_obviousnotice("... You can almost hear something ...")) return + to_chat(src, msg, avoid_highlighting = avoid_highlighting) + return msg /** * Generate a visible message from this atom @@ -177,6 +263,13 @@ if(!islist(ignored_mobs)) ignored_mobs = list(ignored_mobs) var/list/hearers = get_hearers_in_view(vision_distance, src) //caches the hearers and then removes ignored mobs. + + #ifdef ZMIMIC_MULTIZ_SPEECH + if(blind_message && ismovable(src) && src:bound_overlay) + hearers += get_hearers_in_view(vision_distance, src:bound_overlay) + hearers -= src:bound_overlay + #endif + hearers -= ignored_mobs if(self_message) @@ -184,7 +277,7 @@ var/raw_msg = message if(visible_message_flags & EMOTE_MESSAGE) - message = "[src][separation][message]" //PARIAH EDIT - Better emotes + message = "[src][separation][message]" for(var/mob/M in hearers) if(!M.client) @@ -207,7 +300,7 @@ if(!msg) continue - if(visible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, visible_message_flags) && !M.is_blind()) + if((visible_message_flags & EMOTE_MESSAGE) && runechat_prefs_check(M, visible_message_flags) && !M.is_blind()) M.create_chat_message(src, raw_message = raw_msg, runechat_flags = visible_message_flags) M.show_message(msg, msg_type, blind_message, MSG_AUDIBLE) @@ -232,15 +325,27 @@ */ /atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ") //PARIAH EDIT ADDITION - Better emotes var/list/hearers = get_hearers_in_view(hearing_distance, src) + + #ifdef ZMIMIC_MULTIZ_SPEECH + if(ismovable(src) && src:bound_overlay) + hearers += get_hearers_in_view(hearing_distance, src:bound_overlay) + hearers -= src:bound_overlay + #endif + if(self_message) hearers -= src + var/raw_msg = message if(audible_message_flags & EMOTE_MESSAGE) message = "[src][separation][message]" //PARIAH EDIT - Better emotes - for(var/mob/M in hearers) - if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear()) - M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) - M.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) + for(var/atom/movable/AM as anything in hearers) + if(istype(AM, /obj)) + continue + if(ismob(AM)) + var/mob/M = AM + if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear()) + M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags) + AM.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL) /** * Show a message to all mobs in earshot of this one @@ -439,6 +544,10 @@ set name = "Examine" set category = "IC" + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(run_examinate), examinify)) + +/mob/proc/run_examinate(atom/examinify) + if(isturf(examinify) && !(sight & SEE_TURFS) && !(examinify in view(client ? client.view : world.view, src))) // shift-click catcher may issue examinate() calls for out-of-sight turfs return @@ -461,16 +570,8 @@ client.recent_examines[ref_to_atom] = world.time // set to when we last normal examine'd them addtimer(CALLBACK(src, PROC_REF(clear_from_recent_examines), ref_to_atom), RECENT_EXAMINE_MAX_WINDOW) handle_eye_contact(examinify) + broadcast_examine(examinify) - if(!isobserver(usr) && !(usr == examinify)) - var/list/can_see_target = viewers(usr) - for(var/mob/M as anything in viewers(4, usr)) - if(!M.client) - continue - if(M in can_see_target) - to_chat(M, span_subtle("\The [usr] looks at \the [examinify]")) - else - to_chat(M, span_subtle("\The [usr] intently looks at something...")) else result = examinify.examine(src) // if a tree is examined but no client is there to see it, did the tree ever really exist? @@ -485,6 +586,50 @@ to_chat(src, "
[result.Join()]
") //PARIAH EDIT CHANGE SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, examinify) +/// Tells nearby mobs about our examination. +/mob/proc/broadcast_examine(atom/examined) + if(examined == src) + return + + // If TRUE, the usr's view() for the examined object too + var/examining_worn_item = FALSE + var/loc_str = "at something off in the distance." + + if(isitem(examined)) + var/obj/item/I = examined + if((I.item_flags & IN_STORAGE)) + if(get(I, /mob/living) == src) + loc_str = "inside [p_their()] [I.loc.name]..." + else + loc_str = "inside [I.loc]..." + + else if(I.loc == src) + loc_str = "at [p_their()] [I.name]." + examining_worn_item = TRUE + + var/can_see_str = span_subtle("\The [src] looks at [examined].") + if(examining_worn_item) + can_see_str = span_subtle("\The [src] looks [loc_str]") + + var/cannot_see_str = span_subtle("\The [src] looks [loc_str]") + + var/list/can_see_target = viewers(examined) + for(var/mob/M as anything in viewers(4, src)) + if(!M.client || M.is_blind()) + continue + + if(examining_worn_item || (M == src) || (M in can_see_target)) + to_chat(M, can_see_str) + else + to_chat(M, cannot_see_str) + +/mob/living/broadcast_examine(atom/examined) + if(stat != CONSCIOUS) + return + return ..() + +/mob/dead/broadcast_examine(atom/examined) + return //Observers arent real the government is lying to you /mob/proc/blind_examine_check(atom/examined_thing) return TRUE //The non-living will always succeed at this check. @@ -596,25 +741,21 @@ set name = "Point To" set category = "Object" - if(client && !(A in view(client.view, src))) - return FALSE if(istype(A, /obj/effect/temp_visual/point)) return FALSE - point_at(A) + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(_pointed), A)) - SEND_SIGNAL(src, COMSIG_MOB_POINTED, A) - return TRUE +/// possibly delayed verb that finishes the pointing process starting in [/mob/verb/pointed()]. +/// either called immediately or in the tick after pointed() was called, as per the [DEFAULT_QUEUE_OR_CALL_VERB()] macro +/mob/proc/_pointed(atom/pointing_at) + if(client && !(pointing_at in view(client.view, src))) + return FALSE -/** - * 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 + point_at(pointing_at) + + SEND_SIGNAL(src, COMSIG_MOB_POINTED, pointing_at) + return TRUE ///Can this mob resist (default FALSE) /mob/proc/can_resist() @@ -661,20 +802,15 @@ set category = "Object" set src = usr - if(ismecha(loc)) - return - - if(incapacitated()) - return + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_mode))) +///proc version to finish /mob/verb/mode() execution. used in case the proc needs to be queued for the tick after its first called +/mob/proc/execute_mode() var/obj/item/I = get_active_held_item() if(I) - I.attack_self(src) - update_held_items() + usr.client?.Click(I, I.loc) return - limb_attack_self() - /** * Allows you to respawn, abandoning your current mob * @@ -745,7 +881,7 @@ */ /mob/Topic(href, href_list) if(href_list["mach_close"]) - var/t1 = text("window=[href_list["mach_close"]]") + var/t1 = "window=[href_list["mach_close"]]" unset_machine() src << browse(null, t1) @@ -822,7 +958,9 @@ return FALSE if(notransform) return FALSE - if(HAS_TRAIT(src, TRAIT_RESTRAINED)) + if(HAS_TRAIT(src, TRAIT_ARMS_RESTRAINED)) + return FALSE + if(HAS_TRAIT(src, TRAIT_CANNOTFACE)) return FALSE return TRUE @@ -875,7 +1013,6 @@ /mob/proc/swap_hand() 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, span_warning("Your other hand is too busy holding [held_item].")) return FALSE return TRUE @@ -896,10 +1033,10 @@ return mind.grab_ghost(force = force) ///Notify a ghost that it's body is being cloned -/mob/proc/notify_ghost_cloning(message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", sound = 'sound/effects/genetics.ogg', atom/source = null, flashwindow) +/mob/proc/notify_ghost_revival(message = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!", sound = 'sound/effects/genetics.ogg', atom/source = null, flashwindow) var/mob/dead/observer/ghost = get_ghost() if(ghost) - ghost.notify_cloning(message, sound, source, flashwindow) + ghost.notify_revival(message, sound, source, flashwindow) return ghost /** @@ -967,8 +1104,14 @@ ///Can the mob interact() with an atom? /mob/proc/can_interact_with(atom/A) + if(istype(A, /atom/movable/screen)) + var/atom/movable/screen/screen = A + if(screen.hud?.mymob ==src) + return TRUE + if(isAdminGhostAI(src) || Adjacent(A)) return TRUE + var/datum/dna/mob_dna = has_dna() if(mob_dna?.check_mutation(/datum/mutation/human/telekinesis) && tkMaxRangeCheck(src, A)) return TRUE @@ -983,7 +1126,7 @@ return ISINRANGE(their_turf.x, our_turf.x - interaction_range, our_turf.x + interaction_range) && ISINRANGE(their_turf.y, our_turf.y - interaction_range, our_turf.y + interaction_range) ///Can the mob use Topic to interact with machines -/mob/proc/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE, need_hands = FALSE, floor_okay=FALSE) +/mob/proc/canUseTopic(atom/movable/target, flags) return ///Can this mob use storage @@ -1022,10 +1165,25 @@ return FALSE +/mob/update_name(updates) + name = get_visible_name() + return ..() + +/mob/proc/get_visible_name() + return name + +/// Sets the mob's real name, and normal name if desired. +/mob/proc/set_real_name(new_name, change_name = TRUE, update_name = TRUE) + real_name = new_name + if(change_name) + name = real_name + if(update_name) + update_name() + /** * Fully update the name of a mob * - * This will update a mob's name, real_name, mind.name, GLOB.data_core records, pda, id and traitor text + * This will update a mob's name, real_name, mind.name, SSdatacore records, pda, id and traitor text * * Calling this proc without an oldname will only update the mob and skip updating the pda, id and records ~Carn */ @@ -1044,8 +1202,8 @@ log_played_names(ckey, newname) - real_name = newname - name = newname + set_real_name(newname) + if(mind) mind.name = newname if(mind.key) @@ -1068,7 +1226,7 @@ return TRUE -///Updates GLOB.data_core records with new name , see mob/living/carbon/human +///Updates SSdatacore records with new name , see mob/living/carbon/human /mob/proc/replace_records_name(oldname,newname) return @@ -1130,31 +1288,39 @@ return LA.alpha = lighting_alpha -/* -/mob/proc/sync_ao_plane_alpha() - if(!hud_used) - return - var/datum/preferences/prefs = client?.prefs - if(!prefs) - return - - var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[AO_PLANE]"] - if (L) - L.alpha = prefs.read_preference(/datum/preference/toggle/ambient_occlusion) ? WALL_AO_ALPHA : 0*/ - -///Update the mouse pointer of the attached client in this mob +///Update the mouse pointer of the attached client in this mob. Red hot proc! /mob/proc/update_mouse_pointer() + set waitfor = FALSE if(!client) return - client.mouse_pointer_icon = initial(client.mouse_pointer_icon) - if(examine_cursor_icon && client.keys_held["Shift"]) //mouse shit is hardcoded, make this non hard-coded once we make mouse modifiers bindable - client.mouse_pointer_icon = examine_cursor_icon - if(istype(loc, /obj/vehicle/sealed)) - var/obj/vehicle/sealed/E = loc - if(E.mouse_pointer) - client.mouse_pointer_icon = E.mouse_pointer - if(client.mouse_override_icon) - client.mouse_pointer_icon = client.mouse_override_icon + + // First, mouse down icons + if((client.mouse_down == TRUE) && client.mouse_down_icon) + . = client.mouse_down_icon + + // Second, mouse up icons + if(isnull(.) && (client.mouse_down == FALSE) && client.mouse_up_icon) + . = client.mouse_up_icon + + // Third, mouse override icons + if(isnull(.) && client.mouse_override_icon) + . = client.mouse_override_icon + + // Fourth, examine icon + if(isnull(.) && examine_cursor_icon && client.keys_held["Shift"]) + . = examine_cursor_icon + + // Last, the mob decides. + if(isnull(.)) + . = get_mouse_pointer_icon() + . ||= 'icons/effects/mouse_pointers/default.dmi' + + if(. != client.mouse_pointer_icon) + client.mouse_pointer_icon = . + +///Gets the dmi file for the mouse pointer the attached client should use +/mob/proc/get_mouse_pointer_icon() + return /** * Can this mob see in the dark @@ -1298,7 +1464,7 @@ if(!speedies) remove_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod) else - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, multiplicative_slowdown = speedies) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/equipment_speedmod, slowdown = speedies) /// Gets the combined speed modification of all worn items /// Except base mob type doesnt really wear items @@ -1343,16 +1509,16 @@ datum_flags |= DF_VAR_EDITED return - var/slowdown_edit = (var_name == NAMEOF(src, cached_multiplicative_slowdown)) + var/slowdown_edit = (var_name == NAMEOF(src, movement_delay)) var/diff - if(slowdown_edit && isnum(cached_multiplicative_slowdown) && isnum(var_value)) + if(slowdown_edit && isnum(movement_delay) && isnum(var_value)) remove_movespeed_modifier(/datum/movespeed_modifier/admin_varedit) - diff = var_value - cached_multiplicative_slowdown + diff = var_value - movement_delay . = ..() if(. && slowdown_edit && isnum(diff)) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, multiplicative_slowdown = diff) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/admin_varedit, slowdown = diff) /mob/proc/set_active_storage(new_active_storage) if(active_storage) @@ -1442,3 +1608,27 @@ set name = "View Skills" mind?.print_levels(src) + +/// Makes a client temporarily aware of an appearance via and invisible vis contents object. +/mob/proc/send_appearance(mutable_appearance/appearance) + RETURN_TYPE(/atom/movable/screen) + if(!hud_used || isnull(appearance)) + return + + var/atom/movable/screen/container + if(isatom(container)) + container = appearance + else + container = new() + container.appearance = appearance + + hud_used.vis_holder.vis_contents += appearance + addtimer(CALLBACK(src, PROC_REF(remove_appearance), appearance), 5 SECONDS, TIMER_DELETE_ME) + + return container + +/mob/proc/remove_appearance(atom/movable/appearance) + if(!hud_used) + return + + hud_used.vis_holder.vis_contents -= appearance diff --git a/code/modules/mob/mob_arcade.dm b/code/modules/mob/mob_arcade.dm index 93092bd09a70..0026ecaae0c0 100644 --- a/code/modules/mob/mob_arcade.dm +++ b/code/modules/mob/mob_arcade.dm @@ -1,6 +1,6 @@ /** * This proc sends the COMSIG_MOB_WON_VIDEOGAME signal - * + * * This should be called by games when the gamer reaches a winning state */ /mob/proc/won_game() @@ -8,7 +8,7 @@ /** * This proc sends the COMSIG_MOB_LOST_VIDEOGAME signal - * + * * This should be called by games when the gamer reaches a losing state */ /mob/proc/lost_game() @@ -16,9 +16,8 @@ /** * This proc sends the COMSIG_MOB_PLAYED_VIDEOGAME signal - * + * * This should be called by games whenever the gamer interacts with the device */ /mob/proc/played_game() - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "gaming", /datum/mood_event/gaming) SEND_SIGNAL(src, COMSIG_MOB_PLAYED_VIDEOGAME) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 184f6a082d20..8b8b8c8cab28 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -7,12 +7,10 @@ * Has a lot of the creature game world logic, such as health etc */ /mob - datum_flags = DF_USE_TAG density = TRUE layer = MOB_LAYER plane = GAME_PLANE animate_movement = SLIDE_STEPS - hud_possible = list(ANTAG_HUD) //pressure_resistance = 8 mouse_drag_pointer = MOUSE_ACTIVE_POINTER throwforce = 10 @@ -40,7 +38,7 @@ /// List of movement speed modifiers ignored by this mob. List -> List (id) -> List (sources) var/list/movespeed_mod_immunities //Lazy list, see mob_movespeed.dm /// The calculated mob speed slowdown based on the modifiers list - var/cached_multiplicative_slowdown + var/movement_delay /// 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) @@ -52,6 +50,7 @@ /// A list of chameleon actions we have specifically /// This can be unified with the actions list var/list/datum/action/item_action/chameleon/chameleon_item_actions + ///Cursor icon used when holding shift over things var/examine_cursor_icon = 'icons/effects/mouse_pointers/examine_pointer.dmi' @@ -193,9 +192,6 @@ ///List of progress bars this mob is currently seeing for actions var/list/progressbars = null //for stacking do_after bars - ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening. - var/list/do_afters - ///Allows a datum to intercept all click calls this mob is the source of var/datum/click_intercept @@ -229,3 +225,6 @@ var/datum/client_interface/mock_client var/interaction_range = 0 //how far a mob has to be to interact with something without caring about obsctruction, defaulted to 0 tiles + + /// A ref of the area we're taking our ambient loop from. + var/area/ambience_tracked_area diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 1c46f4131122..524f8b4dfc3e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -7,40 +7,99 @@ var/mob/Buckled = buckled . = Buckled.lowest_buckled_mob() -///Convert a PRECISE ZONE into the BODY_ZONE -/proc/check_zone(zone) - if(!zone) - return BODY_ZONE_CHEST - switch(zone) +///Takes a zone and returns it's "parent" zone, if it has one. +/proc/deprecise_zone(precise_zone) + switch(precise_zone) + if(null) + return BODY_ZONE_CHEST + if(BODY_ZONE_PRECISE_GROIN) + return BODY_ZONE_CHEST if(BODY_ZONE_PRECISE_EYES) - zone = BODY_ZONE_HEAD + return BODY_ZONE_HEAD if(BODY_ZONE_PRECISE_MOUTH) - zone = BODY_ZONE_HEAD - if(BODY_ZONE_PRECISE_L_HAND) - zone = BODY_ZONE_L_ARM + return BODY_ZONE_HEAD if(BODY_ZONE_PRECISE_R_HAND) - zone = BODY_ZONE_R_ARM + return BODY_ZONE_R_ARM + if(BODY_ZONE_PRECISE_L_HAND) + return BODY_ZONE_L_ARM if(BODY_ZONE_PRECISE_L_FOOT) - zone = BODY_ZONE_L_LEG + return BODY_ZONE_L_LEG if(BODY_ZONE_PRECISE_R_FOOT) - zone = BODY_ZONE_R_LEG - if(BODY_ZONE_PRECISE_GROIN) - zone = BODY_ZONE_CHEST - return zone + return BODY_ZONE_R_LEG + else + return precise_zone + + +GLOBAL_LIST_INIT(bodyzone_accuracy_weights, list( + BODY_ZONE_HEAD = 20, + BODY_ZONE_CHEST = 70, + BODY_ZONE_R_ARM = 25, + BODY_ZONE_L_ARM = 25, + BODY_ZONE_R_LEG = 25, + BODY_ZONE_L_LEG = 25 +)) + +GLOBAL_LIST_INIT(bodyzone_miss_chance, list( + BODY_ZONE_HEAD = 70, + BODY_ZONE_CHEST = 5, + BODY_ZONE_R_ARM = 15, + BODY_ZONE_L_ARM = 15, + BODY_ZONE_R_LEG = 15, + BODY_ZONE_L_LEG = 15 +)) + +GLOBAL_LIST_INIT(bodyzone_gurps_mods, list( + BODY_ZONE_HEAD = -3, + BODY_ZONE_CHEST = 0, + BODY_ZONE_R_ARM = -1, + BODY_ZONE_L_ARM = -1, + BODY_ZONE_R_LEG = -1, + BODY_ZONE_L_LEG = -1 +)) /** * Return the zone or randomly, another valid zone * - * probability controls the chance it chooses the passed in zone, or another random zone - * defaults to 80 + * Do not use this if someone is intentionally trying to hit a specific body part. + * Use get_zone_with_miss_chance() for that. */ -/proc/ran_zone(zone, probability = 80) - if(prob(probability)) - zone = check_zone(zone) +/proc/ran_zone(zone, probability = 80, list/weighted_list) + if(zone) + zone = deprecise_zone(zone) + if(prob(probability)) + return zone + + if(weighted_list) + zone = pick_weight(weighted_list) else - zone = pick_weight(list(BODY_ZONE_HEAD = 1, BODY_ZONE_CHEST = 1, BODY_ZONE_L_ARM = 4, BODY_ZONE_R_ARM = 4, BODY_ZONE_L_LEG = 4, BODY_ZONE_R_LEG = 4)) + zone = pick_weight(GLOB.bodyzone_accuracy_weights) return zone +// Emulates targetting a specific body part, and miss chances +// May return null if missed +// miss_chance_mod may be negative. +/proc/get_zone_with_miss_chance(zone, mob/living/carbon/target, miss_chance_mod = 0, ranged_attack, can_truly_miss = TRUE) + zone = deprecise_zone(zone) + + if(!ranged_attack) + // you cannot miss if your target is prone or restrained + if(target.buckled || target.body_position == LYING_DOWN) + return zone + // if your target is being grabbed aggressively by someone you cannot miss either + for(var/obj/item/hand_item/grab/G in target.grabbed_by) + if(G.current_grab.stop_move) + return zone + + + var/miss_chance = GLOB.bodyzone_miss_chance[zone] + miss_chance = max(miss_chance + miss_chance_mod, 0) + if(prob(miss_chance)) + if(!can_truly_miss || ranged_attack || !prob(miss_chance)) // Ranged attacks cannot ever fully miss. + return target.get_random_valid_zone() + return null + else + return zone + /** * More or less ran_zone, but only returns bodyzones that the mob /actually/ has. * @@ -63,17 +122,14 @@ var/list/limbs = list() for(var/obj/item/bodypart/part as anything in bodyparts) var/limb_zone = part.body_zone //cache the zone since we're gonna check it a ton. - if(limb_zone in blacklisted_parts) + if(limb_zone in blacklisted_parts || part.is_stump) continue if(even_weights) limbs[limb_zone] = 1 continue - if(limb_zone == BODY_ZONE_CHEST || limb_zone == BODY_ZONE_HEAD) - limbs[limb_zone] = 1 - else - limbs[limb_zone] = 4 + limbs[limb_zone] = GLOB.bodyzone_accuracy_weights[limb_zone] - if(base_zone && !(check_zone(base_zone) in limbs)) + if(base_zone && !(deprecise_zone(base_zone) in limbs)) base_zone = null //check if the passed zone is infact valid var/chest_blacklisted @@ -100,19 +156,15 @@ * This proc is dangerously laggy, avoid it or die */ /proc/stars(phrase, probability = 25) - if(probability <= 0) - return phrase - phrase = html_decode(phrase) - var/leng = length(phrase) - . = "" - var/char = "" - for(var/i = 1, i <= leng, i += length(char)) - char = phrase[i] - if(char == " " || !prob(probability)) - . += char - else - . += "*" - return sanitize(.) + if(length(phrase) == 0) + return + + var/list/chars = splittext_char(html_decode(phrase), "") + for(var/i in 1 to length(chars)) + if(!prob(probability) || chars[i] == " ") + continue + chars[i] = "*" + return sanitize(jointext(chars, "")) /** * Turn text into complete gibberish! @@ -230,11 +282,6 @@ return TRUE return FALSE - -/mob/proc/reagent_check(datum/reagent/R, delta_time, times_fired) // utilized in the species code - return TRUE - - /** * Fancy notifications for ghosts * @@ -279,7 +326,7 @@ A.name = header A.desc = message A.action = action - A.target = source + A.target_ref = WEAKREF(source) if(!alert_overlay) alert_overlay = new(source) var/icon/size_check = icon(source.icon, source.icon_state) @@ -301,7 +348,7 @@ * Heal a robotic body part on a mob */ /proc/item_heal_robotic(mob/living/carbon/human/H, mob/user, brute_heal, burn_heal) - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = H.get_bodypart(deprecise_zone(user.zone_selected)) if(affecting && !IS_ORGANIC_LIMB(affecting)) var/dam //changes repair text based on how much brute/burn was supplied if(brute_heal > burn_heal) @@ -309,7 +356,7 @@ else dam = 0 if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) - if(affecting.heal_damage(brute_heal, burn_heal, 0, BODYTYPE_ROBOTIC)) + if(affecting.heal_damage(brute_heal, burn_heal, BODYTYPE_ROBOTIC)) H.update_damage_overlays() user.visible_message(span_notice("[user] fixes some of the [dam ? "dents on" : "burnt wires in"] [H]'s [affecting.name]."), \ span_notice("You fix some of the [dam ? "dents on" : "burnt wires in"] [H == user ? "your" : "[H]'s"] [affecting.name].")) @@ -416,6 +463,8 @@ colored_message = "(EMOTE) [colored_message]" if(LOG_RADIO_EMOTE) colored_message = "(RADIOEMOTE) [colored_message]" + if(LOG_HEALTH) + colored_message = "(HEALTH) [colored_message]" var/list/timestamped_message = list("\[[time_stamp(format = "YYYY-MM-DD hh:mm:ss")]\] [key_name(src)] [loc_name(src)] (Event #[LAZYLEN(logging[smessage_type])])" = colored_message) @@ -427,7 +476,7 @@ ..() ///Can the mob hear -/mob/proc/can_hear() +/mob/proc/can_hear(ignore_stat) . = TRUE /** @@ -470,5 +519,9 @@ return initial(lighting_alpha) /// Can this mob SMELL THE SMELLY SMELLS? -/mob/proc/can_smell(intensity) +/mob/proc/can_smell() return FALSE + +//returns the number of size categories between two mob_sizes, rounded. Positive means A is larger than B +/proc/mob_size_difference(mob_size_A, mob_size_B) + return round(log(2, mob_size_A/mob_size_B), 1) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 30ef985aa6bb..c7d80663ec9a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -5,7 +5,7 @@ */ /client/verb/drop_item() set hidden = TRUE - if(!iscyborg(mob) && mob.stat <= SOFT_CRIT) + if(!iscyborg(mob) && mob.stat != CONSCIOUS) mob.dropItemToGround(mob.get_active_held_item()) return @@ -66,8 +66,8 @@ /client/Move(new_loc, direct) if(world.time < move_delay) //do not move anything ahead of this check please return FALSE - next_move_dir_add = 0 - next_move_dir_sub = 0 + next_move_dir_add = NONE + next_move_dir_sub = NONE var/old_move_delay = move_delay move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick if(!direct || !new_loc) @@ -104,7 +104,7 @@ if(isAI(mob)) return AIMove(new_loc,direct,mob) - if(Process_Grab()) //are we restrained by someone's grip? + if(!check_can_move()) //are we restrained by someone's grip? return if(mob.buckled) //if we're buckled to something, tell it we moved. @@ -124,7 +124,7 @@ return FALSE //We are now going to move - var/add_delay = mob.cached_multiplicative_slowdown + var/add_delay = mob.movement_delay var/new_glide_size = DELAY_TO_GLIDE_SIZE(add_delay * ( (NSCOMPONENT(direct) && EWCOMPONENT(direct)) ? 2 : 1 ) ) mob.set_glide_size(new_glide_size) // set it now in case of pulled objects //If the move was recent, count using old_move_delay @@ -162,27 +162,23 @@ // as a result of player input and not because they were pulled or any other magic. SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOVED) - var/atom/movable/P = mob.pulling - if(P && !ismob(P) && P.density && !HAS_TRAIT(P, TRAIT_KEEP_DIRECTION_WHILE_PULLING)) - mob.setDir(turn(mob.dir, 180)) - /** - * Checks to see if you're being grabbed and if so attempts to break it + * Checks to see if an external factor is preventing movement, mainly grabbing. * * Called by client/Move() */ -/client/proc/Process_Grab() - if(!mob.pulledby) - return FALSE - if(mob.pulledby == mob.pulling && mob.pulledby.grab_state == GRAB_PASSIVE) //Don't autoresist passive grabs if we're grabbing them too. - return FALSE +/client/proc/check_can_move() + if(!length(mob.grabbed_by)) + return TRUE + if(HAS_TRAIT(mob, TRAIT_INCAPACITATED)) COOLDOWN_START(src, move_delay, 1 SECONDS) - return TRUE - else if(HAS_TRAIT(mob, TRAIT_RESTRAINED)) + return FALSE + + else if(HAS_TRAIT(mob, TRAIT_ARMS_RESTRAINED)) COOLDOWN_START(src, move_delay, 1 SECONDS) to_chat(src, span_warning("You're restrained! You can't move!")) - return TRUE + return FALSE return mob.resist_grab(TRUE) @@ -348,8 +344,16 @@ continue if(rebound.anchored) return rebound - if(pulling == rebound) - continue + if(isliving(rebound)) + var/mob/living/L = rebound + var/_continue = FALSE + if(LAZYLEN(L.grabbed_by)) + for(var/obj/item/hand_item/grab/G in L.grabbed_by) + if(G.assailant == src) + _continue = TRUE + break + if(_continue) + continue return rebound /mob/has_gravity() @@ -531,23 +535,18 @@ var/turf/current_turf = get_turf(src) var/turf/above_turf = GetAbove(current_turf) - var/ventcrawling_flag = HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING) ? ZMOVE_VENTCRAWLING : 0 if(!above_turf) - to_chat(src, span_warning("There's nowhere to go in that direction!")) + to_chat(src, span_warning("There's nothing of interest in that direction.")) return if(ismovable(loc)) //Inside an object, tell it we moved var/atom/loc_atom = loc return loc_atom.relaymove(src, UP) - if(can_z_move(DOWN, above_turf, current_turf, ZMOVE_FALL_FLAGS|ventcrawling_flag)) //Will we fall down if we go up? - if(buckled) - to_chat(src, span_warning("[buckled] is is not capable of flight.")) - else - to_chat(src, span_warning("You are not Superman.")) - return - - if(zMove(UP, z_move_flags = ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK|ventcrawling_flag)) + //Human's up() override has its own feedback + var/flags = ishuman(src) ? ZMOVE_FLIGHT_FLAGS : ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK + . = zstep(src, UP, flags) + if(.) to_chat(src, span_notice("You move upwards.")) ///Moves a mob down a z level @@ -559,9 +558,9 @@ var/atom/loc_atom = loc return loc_atom.relaymove(src, DOWN) - var/ventcrawling_flag = HAS_TRAIT(src, TRAIT_MOVE_VENTCRAWLING) ? ZMOVE_VENTCRAWLING : 0 - if(zMove(DOWN, z_move_flags = ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK|ventcrawling_flag)) + if(zstep(src, DOWN, ZMOVE_FLIGHT_FLAGS|ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) + return FALSE /mob/abstract_move(atom/destination) diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index e15aa37de8ac..62efd9e78949 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -5,6 +5,10 @@ set name = "Say" set category = "IC" set instant = TRUE + + if(HAS_TRAIT(src, TRAIT_NO_VOLUNTARY_SPEECH)) + return + //PARIAH EDIT ADDITION if(typing_indicator) set_typing_indicator(FALSE) @@ -17,7 +21,7 @@ //queue this message because verbs are scheduled to process after SendMaps in the tick and speech is pretty expensive when it happens. //by queuing this for next tick the mc can compensate for its cost instead of having speech delay the start of the next tick if(message) - SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_SAY_VERB) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/atom/movable, say), message), SSspeech_controller) ///Whisper verb /mob/verb/whisper_verb(message as text) @@ -30,7 +34,7 @@ return if(message) - SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_WHISPER_VERB) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, whisper), message), SSspeech_controller) /** * Whisper a message. @@ -57,7 +61,7 @@ message = trim(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - SSspeech_controller.queue_say_for_mob(src, message, SPEECH_CONTROLLER_QUEUE_EMOTE_VERB) + QUEUE_OR_CALL_VERB_FOR(VERB_CALLBACK(src, TYPE_PROC_REF(/mob, emote), "me", 1, message, TRUE), SSspeech_controller) ///Speak as a dead person (ghost etc) /mob/proc/say_dead(message) @@ -160,24 +164,29 @@ 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]) if(stat == CONSCIOUS) //necessary indentation so it gets stripped of the semicolon anyway. 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])]) + for(var/datum/language/language as anything in GLOB.all_languages) + if(language.key == message[1 + length(message[1])]) // No, you cannot speak in xenocommon just because you know the key - if(!can_speak_language(LD)) + if(!can_speak_language(language)) return message - mods[LANGUAGE_EXTENSION] = LD - chop_to = length(key) + length(initial(LD.key)) + 1 + + mods[LANGUAGE_EXTENSION] = language + chop_to = length(key) + length(language.key) + 1 + if(!mods[LANGUAGE_EXTENSION]) return message else diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 01aa30a7d75d..dc61c87c4ac9 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -33,12 +33,10 @@ qdel(M) return - if( istext(new_name) ) - M.name = new_name - M.real_name = new_name + if(istext(new_name) ) + M.set_real_name(new_name) else - M.name = src.name - M.real_name = src.real_name + M.set_real_name(src.real_name) if(has_dna() && M.has_dna()) var/mob/living/carbon/C = src diff --git a/code/modules/mob/mob_update_icons.dm b/code/modules/mob/mob_update_icons.dm index 5ac1fd3105a8..dad9f128f91c 100644 --- a/code/modules/mob/mob_update_icons.dm +++ b/code/modules/mob/mob_update_icons.dm @@ -87,5 +87,5 @@ return ///Updates the handcuff overlay & HUD element. -/mob/proc/update_inv_ears() +/mob/proc/update_worn_ears() return diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index 5f487c962543..fd6b2ea1246b 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -9,10 +9,11 @@ /** * Adds passed value to the drowsyness of a mob */ -/mob/proc/adjust_drowsyness(amount) +/mob/proc/adjust_drowsyness(amount, up_to = INFINITY) + if(amount + drowsyness > up_to) + amount = max(up_to - drowsyness, 0) drowsyness = max(drowsyness + amount, 0) - ///Blind a mobs eyes by amount /mob/proc/blind_eyes(amount) adjust_blindness(amount) @@ -40,28 +41,34 @@ /// proc that adds and removes blindness overlays when necessary /mob/proc/update_blindness() switch(stat) - if(CONSCIOUS, SOFT_CRIT) + if(CONSCIOUS) if(HAS_TRAIT(src, TRAIT_BLIND) || eye_blind) throw_alert(ALERT_BLIND, /atom/movable/screen/alert/blind) - do_set_blindness(TRUE) + do_set_blindness(BLIND_PHYSICAL) else - do_set_blindness(FALSE) - if(UNCONSCIOUS, HARD_CRIT) - do_set_blindness(TRUE) + do_set_blindness(BLIND_NOT_BLIND) + if(UNCONSCIOUS) + do_set_blindness(BLIND_SLEEPING) if(DEAD) - do_set_blindness(FALSE) - + do_set_blindness(BLIND_NOT_BLIND) ///Proc that handles adding and removing the blindness overlays. -/mob/proc/do_set_blindness(now_blind) - if(now_blind) - overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) - // You are blind why should you be able to make out details like color, only shapes near you - add_client_colour(/datum/client_colour/monochrome/blind) - else - clear_alert(ALERT_BLIND) - clear_fullscreen("blind") - remove_client_colour(/datum/client_colour/monochrome/blind) +/mob/proc/do_set_blindness(blindness_level) + switch(blindness_level) + if(BLIND_SLEEPING) + overlay_fullscreen("completely_blind", /atom/movable/screen/fullscreen/blind/blinder) + // You are blind why should you be able to make out details like color, only shapes near you + add_client_colour(/datum/client_colour/monochrome/blind) + if(BLIND_PHYSICAL) + clear_fullscreen("completely_blind") + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) + // You are blind why should you be able to make out details like color, only shapes near you + add_client_colour(/datum/client_colour/monochrome/blind) + else + clear_alert(ALERT_BLIND) + clear_fullscreen("completely_blind") + clear_fullscreen("blind") + remove_client_colour(/datum/client_colour/monochrome/blind) /** @@ -86,14 +93,14 @@ ///Apply the blurry overlays to a mobs clients screen /mob/proc/update_eye_blur() - if(!client) - return - 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))) + var/atom/movable/plane_master_controller/game_plane_master_controller = hud_used?.plane_master_controllers[PLANE_MASTERS_GAME] + if(eye_blurry || HAS_TRAIT(src, TRAIT_BLURRY_VISION)) + if(game_plane_master_controller) + game_plane_master_controller.add_filter("eye_blur", 1, gauss_blur_filter(clamp(eye_blurry * 0.1, 0.6, 3))) overlay_fullscreen("dither", /atom/movable/screen/fullscreen/dither) else - game_plane_master_controller.remove_filter("eye_blur") + if(game_plane_master_controller) + game_plane_master_controller.remove_filter("eye_blur") clear_fullscreen("dither") ///Adjust the disgust level of a mob diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 078f6a546010..9cd3e559ecc7 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -26,7 +26,8 @@ invisibility = 0 set_species(/datum/species/monkey) SEND_SIGNAL(src, COMSIG_HUMAN_MONKEYIZE) - uncuff() + remove_handcuffs() + remove_legcuffs() return src ////////////////////////// Humanize ////////////////////////////// @@ -137,8 +138,7 @@ if(R.mmi.brain) R.mmi.brain.name = "[real_name]'s brain" if(R.mmi.brainmob) - R.mmi.brainmob.real_name = real_name //the name of the brain inside the cyborg is the robotized human's name. - R.mmi.brainmob.name = real_name + R.mmi.brainmob.set_real_name(real_name) //the name of the brain inside the cyborg is the robotized human's name. R.job = JOB_CYBORG R.notify_ai(AI_NOTIFICATION_NEW_BORG) diff --git a/code/modules/mob_spawn/corpses/job_corpses.dm b/code/modules/mob_spawn/corpses/job_corpses.dm index a261aa095199..32ab8980b9e2 100644 --- a/code/modules/mob_spawn/corpses/job_corpses.dm +++ b/code/modules/mob_spawn/corpses/job_corpses.dm @@ -16,31 +16,21 @@ outfit = /datum/outfit/job/doctor icon_state = "corpsedoctor" -/obj/effect/mob_spawn/corpse/human/geneticist - name = "Geneticist" - outfit = /datum/outfit/job/geneticist - icon_state = "corpsescientist" - /obj/effect/mob_spawn/corpse/human/engineer name = "Engineer" - outfit = /datum/outfit/job/engineer/gloved + outfit = /datum/outfit/job/engineer icon_state = "corpseengineer" /obj/effect/mob_spawn/corpse/human/engineer/mod outfit = /datum/outfit/job/engineer/mod /obj/effect/mob_spawn/corpse/human/clown - name = "Clown" + name = JOB_CLOWN outfit = /datum/outfit/job/clown icon_state = "corpseclown" -/obj/effect/mob_spawn/corpse/human/scientist - name = "Scientist" - outfit = /datum/outfit/job/scientist - icon_state = "corpsescientist" - /obj/effect/mob_spawn/corpse/human/miner - name = "Shaft Miner" + name = JOB_PROSPECTOR outfit = /datum/outfit/job/miner icon_state = "corpseminer" @@ -70,7 +60,3 @@ /obj/effect/mob_spawn/corpse/human/assistant/spanishflu_infection/special(mob/living/spawned_mob) . = ..() spawned_mob.ForceContractDisease(new /datum/disease/fluspanish) - -/obj/effect/mob_spawn/corpse/human/bartender - name = "Bartender" - outfit = /datum/outfit/spacebartender diff --git a/code/modules/mob_spawn/corpses/mining_corpses.dm b/code/modules/mob_spawn/corpses/mining_corpses.dm index 1e0e06a7304c..0e0587bf59bc 100644 --- a/code/modules/mob_spawn/corpses/mining_corpses.dm +++ b/code/modules/mob_spawn/corpses/mining_corpses.dm @@ -13,208 +13,3 @@ spawned_human.color = "#454545" spawned_human.gender = NEUTER //don't need to set the human's body type (neuter) - -//Legion infested mobs - -//dwarf type which spawns dwarfy versions -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf - -/obj/effect/mob_spawn/corpse/human/legioninfested/dwarf/special(mob/living/carbon/human/spawned_human) - . = ..() - spawned_human.dna.add_mutation(/datum/mutation/human/dwarfism) - -//main type, rolls a pool of legion victims -/obj/effect/mob_spawn/corpse/human/legioninfested - brute_damage = 1000 - -/obj/effect/mob_spawn/corpse/human/legioninfested/Initialize(mapload) - var/corpse_theme = pick_weight(list( - "Miner" = 66, - "Ashwalker" = 10, - "Golem" = 10, - "Clown" = 10, - pick(list( - "Shadow", - "Dame", - "Operative", - "Cultist", - )) = 4, - )) - switch(corpse_theme) - if("Miner") - outfit = /datum/outfit/consumed_miner - if("Ashwalker") - outfit = /datum/outfit/consumed_ashwalker - if("Clown") - outfit = /datum/outfit/consumed_clown - if("Golem") - outfit = /datum/outfit/consumed_golem - if("Dame") - outfit = /datum/outfit/consumed_dame - if("Operative") - outfit = /datum/outfit/syndicatecommandocorpse - if("Shadow") - outfit = /datum/outfit/consumed_shadowperson - if("Cultist") - outfit = /datum/outfit/consumed_cultist - . = ..() - -/datum/outfit/consumed_miner - name = "Legion-Consumed Miner" - gloves = /obj/item/clothing/gloves/color/black - mask = /obj/item/clothing/mask/gas/explorer - shoes = /obj/item/clothing/shoes/workboots/mining - -/datum/outfit/consumed_miner/pre_equip(mob/living/carbon/human/ashwalker, visualsOnly = FALSE) - var/regular_uniform = FALSE - if(visualsOnly) - regular_uniform = TRUE //assume human - else - var/new_species_type = pick_weight(list(/datum/species/human = 70, /datum/species/lizard = 26, /datum/species/fly = 2, /datum/species/plasmaman = 2)) - if(new_species_type != /datum/species/plasmaman) - regular_uniform = TRUE - else - uniform = /obj/item/clothing/under/plasmaman - head = /obj/item/clothing/head/helmet/space/plasmaman - belt = /obj/item/tank/internals/plasmaman/belt - if(new_species_type == /datum/species/lizard) - shoes = null //digitigrade says no - if(regular_uniform) - uniform = /obj/item/clothing/under/rank/cargo/miner/lavaland - if(prob(4)) - belt = pick_weight(list(/obj/item/storage/belt/mining = 2, /obj/item/storage/belt/mining/alt = 2)) - else if(prob(10)) - belt = pick_weight(list(/obj/item/pickaxe = 8, /obj/item/pickaxe/mini = 4, /obj/item/pickaxe/silver = 2, /obj/item/pickaxe/diamond = 1)) - else - belt = /obj/item/tank/internals/emergency_oxygen/engi - - if(prob(20)) - suit = pick_weight(list(/obj/item/clothing/suit/hooded/explorer = 18, /obj/item/clothing/suit/hooded/cloak/goliath = 2)) - if(prob(30)) - r_pocket = pick_weight(list(/obj/item/stack/marker_beacon = 20, /obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/damage = 1 )) - if(prob(10)) - l_pocket = pick_weight(list(/obj/item/stack/spacecash/c1000 = 7, /obj/item/reagent_containers/hypospray/medipen/survival = 2, /obj/item/borg/upgrade/modkit/cooldown = 1 )) - -/datum/outfit/consumed_ashwalker - name = "Legion-Consumed Ashwalker" - uniform = /obj/item/clothing/under/costume/gladiator/ash_walker - -/datum/outfit/consumed_ashwalker/pre_equip(mob/living/carbon/human/ashwalker, visualsOnly = FALSE) - if(!visualsOnly) - ashwalker.set_species(/datum/species/lizard/ashwalker) - if(prob(95)) - head = /obj/item/clothing/head/helmet/gladiator - else - head = /obj/item/clothing/head/helmet/skull - suit = /obj/item/clothing/suit/armor/bone - gloves = /obj/item/clothing/gloves/bracer - if(prob(5)) - back = pick_weight(list(/obj/item/spear/bonespear = 3, /obj/item/fireaxe/boneaxe = 2)) - if(prob(10)) - belt = /obj/item/storage/belt/mining/primitive - if(prob(30)) - r_pocket = /obj/item/knife/combat/bone - if(prob(30)) - l_pocket = /obj/item/knife/combat/bone - -//takes a lot from the clown job, notably NO PDA and different backpack loot + pocket goodies -/datum/outfit/consumed_clown - name = "Legion-Consumed Clown" - id_trim = /datum/id_trim/job/clown - uniform = /obj/item/clothing/under/rank/civilian/clown - back = /obj/item/storage/backpack/clown - backpack_contents = list() - ears = /obj/item/radio/headset/headset_srv - shoes = /obj/item/clothing/shoes/clown_shoes - mask = /obj/item/clothing/mask/gas/clown_hat - l_pocket = /obj/item/bikehorn - - box = /obj/item/storage/box/hug/survival - chameleon_extras = /obj/item/stamp/clown - implants = list(/obj/item/implant/sad_trombone) - ///drops a pie cannon on post_equip. i'm so done with this stupid outfit trying to put shit that doesn't fit in the backpack! - var/drop_a_pie_cannon = FALSE - -/datum/outfit/consumed_clown/pre_equip(mob/living/carbon/human/clown, visualsOnly = FALSE) - if(!visualsOnly) - clown.fully_replace_character_name(clown.name, pick(GLOB.clown_names)) - if(prob(70)) - var/backpack_loot = pick(list(/obj/item/stamp/clown = 1, /obj/item/reagent_containers/spray/waterflower = 1, /obj/item/food/grown/banana = 1, /obj/item/megaphone/clown = 1, /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter = 1, /obj/item/pneumatic_cannon/pie)) - if(backpack_loot == /obj/item/pneumatic_cannon/pie) - drop_a_pie_cannon = TRUE - else - backpack_contents += backpack_loot - if(prob(30)) - backpack_contents += list(/obj/item/stack/sheet/mineral/bananium = pick_weight(list( 1 = 3, 2 = 2, 3 = 1))) - if(prob(10)) - l_pocket = pick_weight(list(/obj/item/bikehorn/golden = 3, /obj/item/bikehorn/airhorn = 1)) - if(prob(10)) - r_pocket = /obj/item/implanter/sad_trombone - -/datum/outfit/consumed_clown/post_equip(mob/living/carbon/human/clown, visualsOnly) - . = ..() - if(drop_a_pie_cannon) - new /obj/item/pneumatic_cannon/pie(get_turf(clown)) - -/datum/outfit/consumed_golem - name = "Legion-Consumed Golem" - //Oops! All randomized! - -/datum/outfit/consumed_golem/pre_equip(mob/living/carbon/human/golem, visualsOnly = FALSE) - if(!visualsOnly) - golem.set_species(pick(/datum/species/golem/adamantine, /datum/species/golem/plasma, /datum/species/golem/diamond, /datum/species/golem/gold, /datum/species/golem/silver, /datum/species/golem/plasteel, /datum/species/golem/titanium, /datum/species/golem/plastitanium)) - if(prob(30)) - glasses = pick_weight(list(/obj/item/clothing/glasses/meson = 2, /obj/item/clothing/glasses/hud/health = 2, /obj/item/clothing/glasses/hud/diagnostic =2, /obj/item/clothing/glasses/science = 2, /obj/item/clothing/glasses/welding = 2, /obj/item/clothing/glasses/night = 1)) - if(prob(10) && !visualsOnly) //visualsonly = not a golem = can't put things in the belt slot without a jumpsuit - belt = pick(list(/obj/item/storage/belt/mining/vendor, /obj/item/storage/belt/utility/full)) - if(prob(50)) - neck = /obj/item/bedsheet/rd/royal_cape - if(prob(10) && !visualsOnly) //visualsonly = not a golem = can't put things in the pockets without a jumpsuit - l_pocket = pick(list(/obj/item/crowbar/power, /obj/item/screwdriver/power, /obj/item/weldingtool/experimental)) - -//this is so pointlessly gendered but whatever bro i'm here to refactor not judge -/datum/outfit/consumed_dame - name = "Legion-Consumed Dame" - uniform = /obj/item/clothing/under/costume/maid - gloves = /obj/item/clothing/gloves/color/white - shoes = /obj/item/clothing/shoes/laceup - head = /obj/item/clothing/head/helmet/knight - suit = /obj/item/clothing/suit/armor/riot/knight - r_pocket = /obj/item/tank/internals/emergency_oxygen - mask = /obj/item/clothing/mask/breath - -/datum/outfit/consumed_dame/pre_equip(mob/living/carbon/human/dame, visualsOnly = FALSE) - if(!visualsOnly) - dame.gender = FEMALE - dame.physique = FEMALE - dame.update_body() - if(prob(30)) - back = /obj/item/nullrod/scythe/talking - else - back = /obj/item/shield/riot/buckler - belt = /obj/item/nullrod/claymore - -/datum/outfit/consumed_shadowperson - name = "Legion-Consumed Shadowperson" - r_pocket = /obj/item/reagent_containers/pill/shadowtoxin - accessory = /obj/item/clothing/accessory/medal/plasma/nobel_science - uniform = /obj/item/clothing/under/color/black - shoes = /obj/item/clothing/shoes/sneakers/black - suit = /obj/item/clothing/suit/toggle/labcoat - glasses = /obj/item/clothing/glasses/blindfold - back = /obj/item/tank/internals/oxygen - mask = /obj/item/clothing/mask/breath - -/datum/outfit/consumed_shadowperson/pre_equip(mob/living/carbon/human/shadowperson, visualsOnly = FALSE) - if(visualsOnly) - return - shadowperson.set_species(/datum/species/shadow) - -/datum/outfit/consumed_cultist - name = "Legion-Consumed Cultist" - uniform = /obj/item/clothing/under/costume/roman - suit = /obj/item/clothing/suit/hooded/cultrobes - suit_store = /obj/item/tome - back = /obj/item/storage/backpack/cultpack - r_pocket = /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_spawn/corpses/nonhuman_corpses.dm b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm index b39c381f0f94..986e8035bf3f 100644 --- a/code/modules/mob_spawn/corpses/nonhuman_corpses.dm +++ b/code/modules/mob_spawn/corpses/nonhuman_corpses.dm @@ -13,8 +13,7 @@ /obj/effect/mob_spawn/corpse/ai/special(mob/living/silicon/ai/spawned/dead_ai) . = ..() - dead_ai.name = src.name - dead_ai.real_name = src.name + dead_ai.set_real_name(src.name) ///dead slimes, with a var for whatever color you want. /obj/effect/mob_spawn/corpse/slime diff --git a/code/modules/mob_spawn/ghost_roles/away_roles.dm b/code/modules/mob_spawn/ghost_roles/away_roles.dm deleted file mode 100644 index 4891cf1e0089..000000000000 --- a/code/modules/mob_spawn/ghost_roles/away_roles.dm +++ /dev/null @@ -1,36 +0,0 @@ - -//roles found on away missions, if you can remember to put them here. - -//undead that protect a zlevel - -/obj/effect/mob_spawn/ghost_role/human/skeleton - name = "skeletal remains" - icon = 'icons/effects/blood.dmi' - icon_state = "remains" - mob_name = "skeleton" - prompt_name = "a skeletal guardian" - mob_species = /datum/species/skeleton - you_are_text = "By unknown powers, your skeletal remains have been reanimated!" - flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." - spawner_job_path = /datum/job/skeleton - -/obj/effect/mob_spawn/ghost_role/human/skeleton/special(mob/living/new_spawn) - . = ..() - to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") - new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") - -/obj/effect/mob_spawn/ghost_role/human/zombie - name = "rotting corpse" - icon = 'icons/effects/blood.dmi' - icon_state = "remains" - mob_name = "zombie" - prompt_name = "an undead guardian" - mob_species = /datum/species/zombie - spawner_job_path = /datum/job/zombie - you_are_text = "By unknown powers, your rotting remains have been resurrected!" - flavour_text = "Walk this mortal plane and terrorize all living adventurers who dare cross your path." - -/obj/effect/mob_spawn/ghost_role/human/zombie/special(mob/living/new_spawn) - . = ..() - to_chat(new_spawn, "You have this horrible lurching feeling deep down that your binding to this world will fail if you abandon this zone... Were you reanimated to protect something?") - new_spawn.AddComponent(/datum/component/stationstuck, PUNISHMENT_MURDER, "You experience a feeling like a stressed twine being pulled until it snaps. Then, merciful nothing.") diff --git a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm deleted file mode 100644 index cc589a980302..000000000000 --- a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm +++ /dev/null @@ -1,74 +0,0 @@ - -/obj/effect/mob_spawn/ghost_role/human/fugitive - spawner_job_path = /datum/job/fugitive_hunter - prompt_name = "Write me some god damn prompt names!" - you_are_text = "Write me some god damn you are text!" - flavour_text = "Write me some god damn flavor text!" //the flavor text will be the backstory argument called on the antagonist's greet, see hunter.dm for details - show_flavor = FALSE - var/back_story = "error" - -/obj/effect/mob_spawn/ghost_role/human/fugitive/Initialize(mapload) - . = ..() - notify_ghosts("Hunters are waking up looking for refugees!", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_FUGITIVE) - -/obj/effect/mob_spawn/ghost_role/human/fugitive/special(mob/living/carbon/human/spawned_human) - . = ..() - var/datum/antagonist/fugitive_hunter/fughunter = new - fughunter.backstory = back_story - spawned_human.mind.add_antag_datum(fughunter) - fughunter.greet() - message_admins("[ADMIN_LOOKUPFLW(spawned_human)] has been made into a Fugitive Hunter by an event.") - log_game("[key_name(spawned_human)] was spawned as a Fugitive Hunter by an event.") - -/obj/effect/mob_spawn/ghost_role/human/fugitive/spacepol - name = "police pod" - desc = "A small sleeper typically used to put people to sleep for briefing on the mission." - prompt_name = "a spacepol officer" - you_are_text = "I am a member of the Spacepol!" - flavour_text = "Justice has arrived. We must capture those fugitives lurking on that station!" - back_story = "space cop" - outfit = /datum/outfit/spacepol - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian - name = "russian pod" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - faction = list("russian") - prompt_name = "a russian" - you_are_text = "Ay blyat. I am a Space-Russian smuggler!" - flavour_text = "We were mid-flight when our cargo was beamed off our ship! Must be on station somewhere? \ - We must \"legally\" reaquire it by any means necessary - is our property, after all!" - back_story = "russian" - outfit = /datum/outfit/russian_hunter - -/obj/effect/mob_spawn/ghost_role/human/fugitive/russian/leader - name = "russian commandant pod" - you_are_text = "Ay blyat. I am the commandant of a Space-Russian smuggler ring!" - outfit = /datum/outfit/russian_hunter/leader - -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty - name = "bounty hunter pod" - prompt_name = "a bounty hunter" - you_are_text = "I'm a bounty hunter." - flavour_text = "We got a new bounty on some fugitives, dead or alive." - back_story = "bounty hunters" - desc = "A small sleeper typically used to make long distance travel a bit more bearable." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/Destroy() - var/obj/structure/fluff/empty_sleeper/S = new(drop_location()) - S.setDir(dir) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/armor - outfit = /datum/outfit/bountyarmor - -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/hook - outfit = /datum/outfit/bountyhook - -/obj/effect/mob_spawn/ghost_role/human/fugitive/bounty/synth - outfit = /datum/outfit/bountysynth diff --git a/code/modules/mob_spawn/ghost_roles/golem_roles.dm b/code/modules/mob_spawn/ghost_roles/golem_roles.dm deleted file mode 100644 index 6e827f309a8d..000000000000 --- a/code/modules/mob_spawn/ghost_roles/golem_roles.dm +++ /dev/null @@ -1,108 +0,0 @@ - -//reserved file just for golems since they're such a big thing, available on lavaland and from the station - -//Golem shells: Spawns in Free Golem ships in lavaland. Ghosts become mineral golems and are advised to spread personal freedom. -/obj/effect/mob_spawn/ghost_role/human/golem - name = "inert free golem shell" - desc = "A humanoid shape, empty, lifeless, and full of potential." - icon = 'icons/obj/wizard.dmi' - icon_state = "construct" - mob_species = /datum/species/golem - anchored = FALSE - move_resist = MOVE_FORCE_NORMAL - density = FALSE - prompt_name = "a free golem" - you_are_text = "You are a Free Golem. Your family worships The Liberator." - flavour_text = "In his infinite and divine wisdom, he set your clan free to travel the stars with a single declaration: \"Yeah go do whatever.\"" - var/has_owner = FALSE - var/can_transfer = TRUE //if golems can switch bodies to this new shell - var/mob/living/owner = null //golem's owner if it has one - -/obj/effect/mob_spawn/ghost_role/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null) - if(species) //spawners list uses object name to register so this goes before ..() - name += " ([initial(species.prefix)])" - mob_species = species - . = ..() - var/area/init_area = get_area(src) - if(!mapload && init_area) - notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [init_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM) - if(has_owner && creator) - you_are_text = "You are a golem." - flavour_text = "You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools." - important_text = "Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost." - owner = creator - - -/obj/effect/mob_spawn/ghost_role/human/golem/name_mob(mob/living/spawned_mob, forced_name) - if(!forced_name) - var/datum/species/golem/golem_species = mob_species - if(has_owner) - forced_name = "[initial(golem_species.prefix)] Golem ([rand(1,999)])" - else - golem_species = new mob_species - forced_name = golem_species.random_name() - . = ..() - -/obj/effect/mob_spawn/ghost_role/human/golem/special(mob/living/new_spawn, mob/mob_possessor) - . = ..() - var/datum/species/golem/X = mob_species - to_chat(new_spawn, "[initial(X.info_text)]") - if(!owner) - var/policy = get_policy(ROLE_FREE_GOLEM) - if (policy) - to_chat(new_spawn, policy) - to_chat(new_spawn, "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked.") - try_keep_home(new_spawn) - else - new_spawn.mind.enslave_mind_to_creator(owner) - log_game("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].") - log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].") - if(ishuman(new_spawn)) - var/mob/living/carbon/human/H = new_spawn - if(has_owner) - var/datum/species/golem/G = H.dna.species - G.owner = owner - H.set_cloned_appearance() - if(has_owner && new_spawn.mind) - new_spawn.mind.set_assigned_role(SSjob.GetJobType(/datum/job/servant_golem)) - else - new_spawn.mind.set_assigned_role(SSjob.GetJobType(/datum/job/free_golem)) - -/obj/effect/mob_spawn/ghost_role/human/golem/proc/try_keep_home(mob/new_spawn) - var/static/list/allowed_areas = typecacheof(list(/area/icemoon, /area/lavaland, /area/ruin)) + typecacheof(/area/misc/survivalpod) - - ADD_TRAIT(new_spawn, TRAIT_FORBID_MINING_SHUTTLE_CONSOLE_OUTSIDE_STATION, INNATE_TRAIT) - new_spawn.AddComponent(/datum/component/hazard_area, area_whitelist = allowed_areas) - -/obj/effect/mob_spawn/ghost_role/human/golem/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - if(isgolem(user) && can_transfer) - var/mob/living/carbon/human/H = user - var/transfer_choice = tgui_alert(usr, "Transfer your soul to [src]? (Warning, your old body will die!)",,list("Yes","No")) - if(transfer_choice != "Yes") - return - if(QDELETED(src) || uses <= 0) - return - log_game("[key_name(H)] golem-swapped into [src]") - H.visible_message(span_notice("A faint light leaves [H], moving to [src] and animating it!"),span_notice("You leave your old body behind, and transfer into [src]!")) - show_flavor = FALSE - var/mob/living/carbon/human/newgolem = create(newname = H.real_name) - H.transfer_trait_datums(newgolem) - H.mind.transfer_to(newgolem) - H.death() - return - -/obj/effect/mob_spawn/ghost_role/human/golem/servant - has_owner = TRUE - name = "inert servant golem shell" - prompt_name = "servant golem" - - -/obj/effect/mob_spawn/ghost_role/human/golem/adamantine - name = "dust-caked free golem shell" - desc = "A humanoid shape, empty, lifeless, and full of potential." - prompt_name = "free golem" - can_transfer = FALSE - mob_species = /datum/species/golem/adamantine diff --git a/code/modules/mob_spawn/ghost_roles/mining_roles.dm b/code/modules/mob_spawn/ghost_roles/mining_roles.dm deleted file mode 100644 index cd1814b8b229..000000000000 --- a/code/modules/mob_spawn/ghost_roles/mining_roles.dm +++ /dev/null @@ -1,312 +0,0 @@ - -//lava hermit - -//Malfunctioning cryostasis sleepers: Spawns in makeshift shelters in lavaland. Ghosts become hermits with knowledge of how they got to where they are now. -/obj/effect/mob_spawn/ghost_role/human/hermit - name = "malfunctioning cryostasis sleeper" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - prompt_name = "a stranded hermit" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/hermit - you_are_text = "You've been stranded in this godless prison of a planet for longer than you can remember." - flavour_text = "Each day you barely scrape by, and between the terrible conditions of your makeshift shelter, \ - the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \ - the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... " - spawner_job_path = /datum/job/hermit - -/obj/effect/mob_spawn/ghost_role/human/hermit/Initialize(mapload) - . = ..() - outfit = new outfit //who cares equip outfit works with outfit as a path or an instance - var/arrpee = rand(1,4) - switch(arrpee) - if(1) - flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \ - only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \ - life and sent you to this hell are forever branded into your memory." - outfit.uniform = /obj/item/clothing/under/misc/assistantformal - if(2) - flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \ - heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \ - scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since." - outfit.uniform = /obj/item/clothing/under/rank/prisoner - outfit.shoes = /obj/item/clothing/shoes/sneakers/orange - if(3) - flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \ - to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there." - outfit.uniform = /obj/item/clothing/under/rank/medical/scrubs/blue - outfit.suit = /obj/item/clothing/suit/toggle/labcoat - outfit.back = /obj/item/storage/backpack/medic - if(4) - flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so kindly put it. It seems that they were right when you, on a tour \ - at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \ - it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now." - -/obj/effect/mob_spawn/ghost_role/human/hermit/Destroy() - new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src)) - return ..() - -/datum/outfit/hermit - name = "Lavaland hermit" - uniform = /obj/item/clothing/under/color/grey/ancient - shoes = /obj/item/clothing/shoes/sneakers/black - back = /obj/item/storage/backpack - mask = /obj/item/clothing/mask/breath - l_pocket = /obj/item/tank/internals/emergency_oxygen - r_pocket = /obj/item/flashlight/glowstick - -//Icebox version of hermit -/obj/effect/mob_spawn/ghost_role/human/hermit/icemoon - name = "cryostasis bed" - desc = "A humming sleeper with a silhouetted occupant inside. Its stasis function is broken and it's likely being used as a bed." - prompt_name = "a grumpy old man" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "cryostasis_sleeper" - outfit = /datum/outfit/hermit - you_are_text = "You've been hunting polar bears for 40 years now! What do these 'NaniteTrans' newcomers want?" - flavour_text = "You were fine hunting polar bears and taming wolves out here on your own, \ - but now that there are corporate stooges around, you need to watch your step. " - spawner_job_path = /datum/job/hermit - -//beach dome - -/obj/effect/mob_spawn/ghost_role/human/beach - prompt_name = "a beach bum" - name = "beach bum sleeper" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - you_are_text = "You're, like, totally a dudebro, bruh." - flavour_text = "Ch'yea. You came here, like, on spring break, hopin' to pick up some bangin' hot chicks, y'knaw?" - spawner_job_path = /datum/job/beach_bum - outfit = /datum/outfit/beachbum - -/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard - you_are_text = "You're a spunky lifeguard!" - flavour_text = "It's up to you to make sure nobody drowns or gets eaten by sharks and stuff." - name = "lifeguard sleeper" - outfit = /datum/outfit/beachbum/lifeguard - -/obj/effect/mob_spawn/ghost_role/human/beach/lifeguard/special(mob/living/carbon/human/lifeguard, mob/mob_possessor) - . = ..() - lifeguard.gender = FEMALE - lifeguard.update_body() - -/datum/outfit/beachbum - name = "Beach Bum" - glasses = /obj/item/clothing/glasses/sunglasses - r_pocket = /obj/item/storage/wallet/random - l_pocket = /obj/item/food/pizzaslice/dank - uniform = /obj/item/clothing/under/pants/youngfolksjeans - id = /obj/item/card/id/advanced - -/datum/outfit/beachbum/post_equip(mob/living/carbon/human/bum, visualsOnly = FALSE) - . = ..() - if(visualsOnly) - return - bum.dna.add_mutation(/datum/mutation/human/stoner) - -/datum/outfit/beachbum/lifeguard - name = "Beach Lifeguard" - uniform = /obj/item/clothing/under/shorts/red - id_trim = /datum/id_trim/lifeguard - -/obj/effect/mob_spawn/ghost_role/human/bartender - name = "bartender sleeper" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - prompt_name = "a space bartender" - you_are_text = "You are a space bartender!" - flavour_text = "Time to mix drinks and change lives. Smoking space drugs makes it easier to understand your patrons' odd dialect." - spawner_job_path = /datum/job/space_bartender - outfit = /datum/outfit/spacebartender - -/datum/outfit/spacebartender - name = "Space Bartender" - uniform = /obj/item/clothing/under/rank/civilian/bartender - back = /obj/item/storage/backpack - shoes = /obj/item/clothing/shoes/sneakers/black - suit = /obj/item/clothing/suit/armor/vest - glasses = /obj/item/clothing/glasses/sunglasses/reagent - id = /obj/item/card/id/advanced - id_trim = /datum/id_trim/space_bartender - -/datum/outfit/spacebartender/post_equip(mob/living/carbon/human/bartender, visualsOnly = FALSE) - . = ..() - var/obj/item/card/id/id_card = bartender.wear_id - if(bartender.age < AGE_MINOR) - id_card.registered_age = AGE_MINOR - to_chat(bartender, span_notice("You're not technically old enough to access or serve alcohol, but your ID has been discreetly modified to display your age as [AGE_MINOR]. Try to keep that a secret!")) - -//Preserved terrarium/seed vault: Spawns in seed vault structures in lavaland. Ghosts become plantpeople and are advised to begin growing plants in the room near them. -/obj/effect/mob_spawn/ghost_role/human/seed_vault - name = "preserved terrarium" - desc = "An ancient machine that seems to be used for storing plant matter. The glass is obstructed by a mat of vines." - prompt_name = "lifebringer" - icon = 'icons/obj/lavaland/spawners.dmi' - icon_state = "terrarium" - density = TRUE - mob_species = /datum/species/pod - you_are_text = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed." - flavour_text = "Your masters, benevolent as they were, created uncounted seed vaults and spread them across \ - the universe to every planet they could chart. You are in one such seed vault. \ - Your goal is to protect the vault you are assigned to, cultivate the seeds passed onto you, \ - and eventually bring life to this desolate planet while waiting for contact from your creators. \ - Estimated time of last contact: Deployment, 5000 millennia ago." - spawner_job_path = /datum/job/lifebringer - -/obj/effect/mob_spawn/ghost_role/human/seed_vault/Initialize(mapload) - . = ..() - mob_name = pick("Tomato", "Potato", "Broccoli", "Carrot", "Ambrosia", "Pumpkin", "Ivy", "Kudzu", "Banana", "Moss", "Flower", "Bloom", "Root", "Bark", "Glowshroom", "Petal", "Leaf", \ - "Venus", "Sprout","Cocoa", "Strawberry", "Citrus", "Oak", "Cactus", "Pepper", "Juniper") - -/obj/effect/mob_spawn/ghost_role/human/seed_vault/Destroy() - new/obj/structure/fluff/empty_terrarium(get_turf(src)) - return ..() - -//Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. - -/obj/structure/ash_walker_eggshell - name = "ash walker egg" - desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within. The egg shell looks resistant to temperature but otherwise rather brittle." - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "large_egg" - resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF - max_integrity = 80 - var/obj/effect/mob_spawn/ghost_role/human/ash_walker/egg - -/obj/structure/ash_walker_eggshell/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) //lifted from xeno eggs - switch(damage_type) - if(BRUTE) - if(damage_amount) - playsound(loc, 'sound/effects/attackblob.ogg', 100, TRUE) - else - playsound(src, 'sound/weapons/tap.ogg', 50, TRUE) - if(BURN) - if(damage_amount) - playsound(loc, 'sound/items/welder.ogg', 100, TRUE) - -/obj/structure/ash_walker_eggshell/attack_ghost(mob/user) //Pass on ghost clicks to the mob spawner - if(egg) - egg.attack_ghost(user) - . = ..() - -/obj/structure/ash_walker_eggshell/Destroy() - if(!egg) - return ..() - var/mob/living/carbon/human/yolk = new /mob/living/carbon/human/(get_turf(src)) - yolk.fully_replace_character_name(null,random_unique_lizard_name(gender)) - yolk.set_species(/datum/species/lizard/ashwalker) - yolk.underwear = "Nude" - yolk.equipOutfit(/datum/outfit/ashwalker)//this is an authentic mess we're making - yolk.update_body() - yolk.gib() - QDEL_NULL(egg) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/ash_walker - name = "ash walker egg" - desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within." - prompt_name = "necropolis ash walker" - icon = 'icons/mob/lavaland/lavaland_monsters.dmi' - icon_state = "large_egg" - mob_species = /datum/species/lizard/ashwalker - outfit = /datum/outfit/ashwalker - move_resist = MOVE_FORCE_NORMAL - density = FALSE - you_are_text = "You are an ash walker. Your tribe worships the Necropolis." - flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. \ - You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. \ - Fresh sacrifices for your nest." - spawner_job_path = /datum/job/ash_walker - var/datum/team/ashwalkers/team - var/obj/structure/ash_walker_eggshell/eggshell - -/obj/effect/mob_spawn/ghost_role/human/ash_walker/Destroy() - eggshell = null - return ..() - -/obj/effect/mob_spawn/ghost_role/human/ash_walker/allow_spawn(mob/user, silent = FALSE) - if(!(user.key in team.players_spawned))//one per person unless you get a bonus spawn - return TRUE - to_chat(user, span_warning("You have exhausted your usefulness to the Necropolis.")) - return FALSE - -/obj/effect/mob_spawn/ghost_role/human/ash_walker/special(mob/living/carbon/human/spawned_human) - . = ..() - spawned_human.fully_replace_character_name(null,random_unique_lizard_name(gender)) - to_chat(spawned_human, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Invade the strange structure of the outsiders if you must. Do not cause unnecessary destruction, as littering the wastes with ugly wreckage is certain to not gain you favor. Glory to the Necropolis!") - - spawned_human.mind.add_antag_datum(/datum/antagonist/ashwalker, team) - - ADD_TRAIT(spawned_human, TRAIT_PRIMITIVE, ROUNDSTART_TRAIT) - spawned_human.remove_language(/datum/language/common) - team.players_spawned += (spawned_human.key) - eggshell.egg = null - QDEL_NULL(eggshell) - -/obj/effect/mob_spawn/ghost_role/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam) - . = ..() - var/area/spawner_area = get_area(src) - team = ashteam - eggshell = new /obj/structure/ash_walker_eggshell(get_turf(loc)) - eggshell.egg = src - src.forceMove(eggshell) - if(spawner_area) - notify_ghosts("An ash walker egg is ready to hatch in \the [spawner_area.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) - -/datum/outfit/ashwalker - name ="Ashwalker" - head = /obj/item/clothing/head/helmet/gladiator - uniform = /obj/item/clothing/under/costume/gladiator/ash_walker - -///Syndicate Listening Post - -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate - name = "Syndicate Bioweapon Scientist" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper_s" - prompt_name = "a syndicate science technician" - you_are_text = "You are a syndicate science technician, employed in a top secret research facility developing biological weapons." - flavour_text = "Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile." - important_text = "The base is rigged with explosives, DO NOT abandon it or let it fall into enemy hands!" - outfit = /datum/outfit/lavaland_syndicate - spawner_job_path = /datum/job/lavaland_syndicate - -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/special(mob/living/new_spawn) - . = ..() - new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) - -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms - name = "Syndicate Comms Agent" - prompt_name = "a syndicate comms agent" - you_are_text = "You are a syndicate comms agent, employed in a top secret research facility developing biological weapons." - flavour_text = "Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" - important_text = "DO NOT abandon the base." - outfit = /datum/outfit/lavaland_syndicate/comms - -/datum/outfit/lavaland_syndicate - name = "Lavaland Syndicate Agent" - r_hand = /obj/item/gun/ballistic/automatic/sniper_rifle - uniform = /obj/item/clothing/under/syndicate - suit = /obj/item/clothing/suit/toggle/labcoat - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/tackler/combat/insulated - ears = /obj/item/radio/headset/syndicate/alt - back = /obj/item/storage/backpack - r_pocket = /obj/item/gun/ballistic/automatic/pistol - id = /obj/item/card/id/advanced/chameleon - implants = list(/obj/item/implant/weapons_auth) - id_trim = /datum/id_trim/chameleon/operative - -/datum/outfit/lavaland_syndicate/post_equip(mob/living/carbon/human/syndicate, visualsOnly = FALSE) - syndicate.faction |= ROLE_SYNDICATE - -/datum/outfit/lavaland_syndicate/comms - name = "Lavaland Syndicate Comms Agent" - r_hand = /obj/item/melee/energy/sword/saber - mask = /obj/item/clothing/mask/chameleon/gps - suit = /obj/item/clothing/suit/armor/vest - -/obj/item/clothing/mask/chameleon/gps/Initialize(mapload) - . = ..() - AddComponent(/datum/component/gps, "Encrypted Signal") diff --git a/code/modules/mob_spawn/ghost_roles/pirate_roles.dm b/code/modules/mob_spawn/ghost_roles/pirate_roles.dm deleted file mode 100644 index d3ab03619587..000000000000 --- a/code/modules/mob_spawn/ghost_roles/pirate_roles.dm +++ /dev/null @@ -1,90 +0,0 @@ - -//space pirates from the pirate event. - -/obj/effect/mob_spawn/ghost_role/human/pirate - name = "space pirate sleeper" - desc = "A cryo sleeper smelling faintly of rum." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - prompt_name = "a space pirate" - outfit = /datum/outfit/pirate/space - anchored = TRUE - density = FALSE - show_flavor = FALSE //Flavour only exists for spawners menu - you_are_text = "You are a space pirate." - flavour_text = "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot." - spawner_job_path = /datum/job/space_pirate - ///Rank of the pirate on the ship, it's used in generating pirate names! - var/rank = "Deserter" - ///Whether or not it will spawn a fluff structure upon opening. - var/spawn_oldpod = TRUE - -/obj/effect/mob_spawn/ghost_role/human/pirate/special(mob/living/spawned_mob, mob/mob_possessor) - . = ..() - spawned_mob.fully_replace_character_name(spawned_mob.real_name, generate_pirate_name(spawned_mob.gender)) - spawned_mob.mind.add_antag_datum(/datum/antagonist/pirate) - -/obj/effect/mob_spawn/ghost_role/human/pirate/proc/generate_pirate_name(spawn_gender) - var/beggings = strings(PIRATE_NAMES_FILE, "beginnings") - var/endings = strings(PIRATE_NAMES_FILE, "endings") - return "[rank] [pick(beggings)][pick(endings)]" - -/obj/effect/mob_spawn/ghost_role/human/pirate/Destroy() - if(spawn_oldpod) - new /obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/pirate/captain - rank = "Renegade Leader" - outfit = /datum/outfit/pirate/space/captain - -/obj/effect/mob_spawn/ghost_role/human/pirate/gunner - rank = "Rogue" - -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton - name = "pirate remains" - desc = "Some unanimated bones. They feel like they could spring to life any moment!" - density = FALSE - icon = 'icons/effects/blood.dmi' - icon_state = "remains" - spawn_oldpod = FALSE - prompt_name = "a skeleton pirate" - mob_species = /datum/species/skeleton - outfit = /datum/outfit/pirate - rank = "Mate" - -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/captain - rank = "Captain" - outfit = /datum/outfit/pirate/captain - -/obj/effect/mob_spawn/ghost_role/human/pirate/skeleton/gunner - rank = "Gunner" - -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale - name = "elegant sleeper" - desc = "Cozy. You get the feeling you aren't supposed to be here, though..." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - prompt_name = "a silverscale" - mob_species = /datum/species/lizard/silverscale - outfit = /datum/outfit/pirate/silverscale - rank = "High-born" - -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/generate_pirate_name(spawn_gender) - var/first_name - switch(gender) - if(MALE) - first_name = pick(GLOB.lizard_names_male) - if(FEMALE) - first_name = pick(GLOB.lizard_names_female) - else - first_name = pick(GLOB.lizard_names_male + GLOB.lizard_names_female) - - return "[rank] [first_name]-Silverscale" - -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/captain - rank = "Old-guard" - outfit = /datum/outfit/pirate/silverscale/captain - -/obj/effect/mob_spawn/ghost_role/human/pirate/silverscale/gunner - rank = "Top-drawer" diff --git a/code/modules/mob_spawn/ghost_roles/space_roles.dm b/code/modules/mob_spawn/ghost_roles/space_roles.dm deleted file mode 100644 index a74ac6167a98..000000000000 --- a/code/modules/mob_spawn/ghost_roles/space_roles.dm +++ /dev/null @@ -1,233 +0,0 @@ - -//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse. -/obj/effect/mob_spawn/ghost_role/human/oldsec - name = "old cryogenics pod" - desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant." - prompt_name = "a security officer" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/human - you_are_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station." - flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ - The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." - important_text = "Work as a team with your fellow survivors and do not abandon them." - outfit = /datum/outfit/oldsec - spawner_job_path = /datum/job/ancient_crew - -/obj/effect/mob_spawn/ghost_role/human/oldsec/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() - -/datum/outfit/oldsec - name = "Ancient Security" - uniform = /obj/item/clothing/under/rank/security/officer - shoes = /obj/item/clothing/shoes/jackboots - id = /obj/item/card/id/away/old/sec - r_pocket = /obj/item/restraints/handcuffs - l_pocket = /obj/item/assembly/flash/handheld - -/obj/effect/mob_spawn/ghost_role/human/oldeng - name = "old cryogenics pod" - desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant." - prompt_name = "an engineer" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/human - you_are_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station." - flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. The last thing \ - you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." - important_text = "Work as a team with your fellow survivors and do not abandon them." - outfit = /datum/outfit/oldeng - spawner_job_path = /datum/job/ancient_crew - -/obj/effect/mob_spawn/ghost_role/human/oldeng/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() - -/datum/outfit/oldeng - name = "Ancient Engineer" - uniform = /obj/item/clothing/under/rank/engineering/engineer - shoes = /obj/item/clothing/shoes/workboots - id = /obj/item/card/id/away/old/eng - gloves = /obj/item/clothing/gloves/color/fyellow/old - l_pocket = /obj/item/tank/internals/emergency_oxygen - -/datum/outfit/oldeng/mod - name = "Ancient Engineer (MODsuit)" - suit_store = /obj/item/tank/internals/oxygen - back = /obj/item/mod/control/pre_equipped/prototype - mask = /obj/item/clothing/mask/breath - internals_slot = ITEM_SLOT_SUITSTORE - -/obj/effect/mob_spawn/ghost_role/human/oldsci - name = "old cryogenics pod" - desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant." - prompt_name = "a scientist" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/human - you_are_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station." - flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \ - The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \ - your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod." - important_text = "Work as a team with your fellow survivors and do not abandon them." - outfit = /datum/outfit/oldsci - spawner_job_path = /datum/job/ancient_crew - -/obj/effect/mob_spawn/ghost_role/human/oldsci/Destroy() - new/obj/structure/showcase/machinery/oldpod/used(drop_location()) - return ..() - -/datum/outfit/oldsci - name = "Ancient Scientist" - uniform = /obj/item/clothing/under/rank/rnd/scientist - shoes = /obj/item/clothing/shoes/laceup - id = /obj/item/card/id/away/old/sci - l_pocket = /obj/item/stack/medical/bruise_pack - -///asteroid comms agent - -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space - you_are_text = "You are a syndicate agent, assigned to a small listening post station situated near your hated enemy's top secret research facility: Space Station 13." - flavour_text = "Monitor enemy activity as best you can, and try to keep a low profile. Monitor enemy activity as best you can, and try to keep a low profile. Use the communication equipment to provide support to any field agents, and sow disinformation to throw Nanotrasen off your trail. Do not let the base fall into enemy hands!" - important_text = "DO NOT abandon the base." - -/obj/effect/mob_spawn/ghost_role/human/lavaland_syndicate/comms/space/Initialize(mapload) - . = ..() - if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie. - new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) - return INITIALIZE_HINT_QDEL - -///battlecruiser stuff - -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser - name = "Syndicate Battlecruiser Ship Operative" - you_are_text = "You are a crewmember aboard the syndicate flagship: the SBC Starfury." - flavour_text = "Your job is to follow your captain's orders, maintain the ship, and keep the power flowing." - important_text = "The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives." - prompt_name = "a battlecruiser crewmember" - outfit = /datum/outfit/syndicate_empty/battlecruiser - spawner_job_path = /datum/job/battlecruiser_crew - - /// The antag team to apply the player to - var/datum/team/antag_team - /// The antag datum to give to the player spawned - var/antag_datum_to_give = /datum/antagonist/battlecruiser - -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/special(mob/living/spawned_mob, mob/possesser) - . = ..() - if(!spawned_mob.mind) - spawned_mob.mind_initialize() - var/datum/mind/mob_mind = spawned_mob.mind - mob_mind.add_antag_datum(antag_datum_to_give, antag_team) - -/datum/team/battlecruiser - name = "Battlecruiser Crew" - member_name = "crewmember" - /// The central objective of this battlecruiser - var/core_objective = /datum/objective/nuclear - /// The assigned nuke of this team - var/obj/machinery/nuclearbomb/nuke - -/datum/team/battlecruiser/proc/update_objectives() - if(core_objective) - var/datum/objective/objective = new core_objective() - objective.team = src - objectives += objective - -/datum/antagonist/battlecruiser - name = "Battlecruiser Crewmember" - show_to_ghosts = TRUE - roundend_category = "battlecruiser syndicate operatives" - suicide_cry = "FOR THE SYNDICATE!!!" - antag_hud_name = "battlecruiser_crew" - job_rank = ROLE_BATTLECRUISER_CREW - var/datum/team/battlecruiser/battlecruiser_team - -/datum/antagonist/battlecruiser/get_team() - return battlecruiser_team - -/datum/antagonist/battlecruiser/greet() - owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/ops.ogg',100,0, use_reverb = FALSE) - to_chat(owner, span_big("You are a [name]!")) - owner.announce_objectives() - -/datum/antagonist/battlecruiser/ally - name = "Battlecruiser Ally" - show_to_ghosts = FALSE - -/datum/antagonist/battlecruiser/captain - name = "Battlecruiser Captain" - antag_hud_name = "battlecruiser_lead" - job_rank = ROLE_BATTLECRUISER_CAPTAIN - -/datum/antagonist/battlecruiser/create_team(datum/team/battlecruiser/team) - if(!team) - return - if(!istype(team)) - stack_trace("Wrong team type passed to [type] initialization.") - battlecruiser_team = team - -/datum/antagonist/battlecruiser/apply_innate_effects(mob/living/mob_override) - add_team_hud(mob_override || owner.current, /datum/antagonist/battlecruiser) - -/datum/antagonist/battlecruiser/on_gain() - if(battlecruiser_team) - objectives |= battlecruiser_team.objectives - if(battlecruiser_team.nuke) - var/obj/machinery/nuclearbomb/nuke = battlecruiser_team.nuke - antag_memory += "[nuke] Code: [nuke.r_code]
" - owner.add_memory(MEMORY_NUKECODE, list(DETAIL_NUKE_CODE = nuke.r_code, DETAIL_PROTAGONIST = owner.current), story_value = STORY_VALUE_AMAZING, memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOMOOD | MEMORY_FLAG_NOPERSISTENCE) - to_chat(owner, "The nuclear authorization code is: [nuke.r_code]") - return ..() - -/datum/outfit/syndicate_empty/battlecruiser - name = "Syndicate Battlecruiser Ship Operative" - l_pocket = /obj/item/gun/ballistic/automatic/pistol - r_pocket = /obj/item/knife/combat/survival - belt = /obj/item/storage/belt/military/assault - -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/assault - name = "Syndicate Battlecruiser Assault Operative" - you_are_text = "You are an assault operative aboard the syndicate flagship: the SBC Starfury." - flavour_text = "Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with." - important_text = "Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!" - prompt_name = "a battlecruiser operative" - outfit = /datum/outfit/syndicate_empty/battlecruiser/assault - -/datum/outfit/syndicate_empty/battlecruiser/assault - name = "Syndicate Battlecruiser Assault Operative" - uniform = /obj/item/clothing/under/syndicate/combat - l_pocket = /obj/item/uplink/nuclear - r_pocket = /obj/item/modular_computer/tablet/nukeops - belt = /obj/item/storage/belt/military - suit = /obj/item/clothing/suit/armor/vest - suit_store = /obj/item/gun/ballistic/automatic/pistol - back = /obj/item/storage/backpack/security - mask = /obj/item/clothing/mask/gas/syndicate - -/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/captain - name = "Syndicate Battlecruiser Captain" - you_are_text = "You are the captain aboard the syndicate flagship: the SBC Starfury." - flavour_text = "Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal." - important_text = "As the captain, this whole operation falls on your shoulders. Help your assault operatives detonate a nuke on the station." - prompt_name = "a battlecruiser captain" - outfit = /datum/outfit/syndicate_empty/battlecruiser/assault/captain - spawner_job_path = /datum/job/battlecruiser_captain - antag_datum_to_give = /datum/antagonist/battlecruiser/captain - -/datum/outfit/syndicate_empty/battlecruiser/assault/captain - name = "Syndicate Battlecruiser Captain" - l_pocket = /obj/item/melee/energy/sword/saber/red - r_pocket = /obj/item/melee/baton/telescopic - suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate - suit_store = /obj/item/gun/ballistic/revolver/mateba - back = /obj/item/storage/backpack/satchel/leather - head = /obj/item/clothing/head/hos/syndicate - mask = /obj/item/clothing/mask/cigarette/cigar/havana - ears = /obj/item/radio/headset/syndicate/alt/leader - glasses = /obj/item/clothing/glasses/thermal/eyepatch - id = /obj/item/card/id/advanced/black/syndicate_command/captain_id - id_trim = /datum/id_trim/battlecruiser/captain diff --git a/code/modules/mob_spawn/ghost_roles/spider_roles.dm b/code/modules/mob_spawn/ghost_roles/spider_roles.dm deleted file mode 100644 index 2badd7dd9c94..000000000000 --- a/code/modules/mob_spawn/ghost_roles/spider_roles.dm +++ /dev/null @@ -1,181 +0,0 @@ -/obj/structure/spider/eggcluster - name = "egg cluster" - desc = "They seem to pulse slightly with an inner life." - icon_state = "eggs" - /// Mob spawner handling the actual spawn of the spider - var/obj/effect/mob_spawn/ghost_role/spider/spawner - -/obj/structure/spider/eggcluster/Initialize(mapload) - pixel_x = base_pixel_x + rand(3,-3) - pixel_y = base_pixel_y + rand(3,-3) - return ..() - -/obj/structure/spider/eggcluster/Destroy() - if(spawner) - QDEL_NULL(spawner) - return ..() - -/obj/structure/spider/eggcluster/attack_ghost(mob/user) - if(spawner) - spawner.attack_ghost(user) - return ..() - -/obj/structure/spider/eggcluster/enriched - name = "enriched egg cluster" - color = rgb(148, 0, 211) - -/obj/structure/spider/eggcluster/bloody - name = "bloody egg cluster" - color = rgb(255, 0, 0) - -/obj/structure/spider/eggcluster/midwife - name = "midwife egg cluster" - -/obj/effect/mob_spawn/ghost_role/spider - name = "egg cluster" - desc = "They seem to pulse slightly with an inner life." - mob_name = "\improper spider" - icon = 'icons/effects/effects.dmi' - icon_state = "eggs" - move_resist = MOVE_FORCE_NORMAL - density = FALSE - show_flavor = FALSE - you_are_text = "You are a spider." - flavour_text = "For the hive! Choose a spider and fulfill your role to take over the station... if that is within your directives, of course." - important_text = "Follow your directives at all costs." - faction = list("spiders") - spawner_job_path = /datum/job/spider - role_ban = ROLE_ALIEN - prompt_ghost = FALSE - /// Prevents spawning from this mob_spawn until TRUE, set by the egg growing - var/ready = FALSE - /// The amount the egg cluster has grown. Is able to produce a spider when it hits 100. - var/amount_grown = 0 - /// The mother's directive at the time the egg was produced. Passed onto the child. - var/directive = "" - /// Type of the cluster that the spawner spawns - var/cluster_type = /obj/structure/spider/eggcluster - /// Physical structure housing the spawner - var/obj/structure/spider/eggcluster/egg - /// The types of spiders that the spawner can produce - var/list/potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider, - /mob/living/simple_animal/hostile/giant_spider/hunter, - /mob/living/simple_animal/hostile/giant_spider/nurse, - ) - -/obj/effect/mob_spawn/ghost_role/spider/Initialize(mapload) - . = ..() - START_PROCESSING(SSobj, src) - potentialspawns = string_list(potentialspawns) - egg = new cluster_type(get_turf(loc)) - egg.spawner = src - forceMove(egg) - -/obj/effect/mob_spawn/ghost_role/spider/Destroy() - egg = null - return ..() - -/obj/effect/mob_spawn/ghost_role/spider/process(delta_time) - amount_grown += rand(0, 1) * delta_time - if(amount_grown >= 100 && !ready) - ready = TRUE - notify_ghosts("[src] is ready to hatch!", null, enter_link = "(Click to play)", source = src, action = NOTIFY_ORBIT, ignore_key = POLL_IGNORE_SPIDER) - STOP_PROCESSING(SSobj, src) - -/obj/effect/mob_spawn/ghost_role/spider/Topic(href, href_list) - . = ..() - if(.) - return - if(href_list["activate"]) - var/mob/dead/observer/ghost = usr - if(istype(ghost)) - ghost.ManualFollow(src) - attack_ghost(ghost) - -/obj/effect/mob_spawn/ghost_role/spider/allow_spawn(mob/user, silent = FALSE) - . = ..() - if(!.) - return FALSE - if(!ready) - if(!silent) - to_chat(user, span_warning("\The [src] is not ready to hatch yet!")) - return FALSE - -/obj/effect/mob_spawn/ghost_role/spider/equip(mob/living/simple_animal/hostile/giant_spider/spawned_spider) - if(spawned_spider) - spawned_spider.directive = directive - -/obj/effect/mob_spawn/ghost_role/spider/special(mob/user) - . = ..() - egg.spawner = null - QDEL_NULL(egg) - -/obj/effect/mob_spawn/ghost_role/spider/enriched - name = "enriched egg cluster" - color = rgb(148, 0, 211) - you_are_text = "You are an enriched spider." - cluster_type = /obj/structure/spider/eggcluster/enriched - potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider/tarantula, - /mob/living/simple_animal/hostile/giant_spider/viper, - /mob/living/simple_animal/hostile/giant_spider/midwife, - ) - -/obj/effect/mob_spawn/ghost_role/spider/bloody - name = "bloody egg cluster" - color = rgb(255, 0, 0) - you_are_text = "You are a bloody spider." - flavour_text = "An abomination of nature set upon the station by changelings. Your only goal is to kill, terrorize, and survive." - directive = "You are the spawn of a vicious changeling. You have no ambitions except to wreak havoc and ensure your own survival. You are aggressive to all living beings outside of your species, including changelings." - cluster_type = /obj/structure/spider/eggcluster/bloody - potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider/hunter/flesh, - ) - -/obj/effect/mob_spawn/ghost_role/spider/midwife - name = "midwife egg cluster" - you_are_text = "You are a midwife spider." - flavour_text = "The crux of the spider horde. You have the ability to reproduce and create more spiders, and turn victims into special spider eggs." - directive = "Ensure the survival of the spider species and overtake whatever structure you find yourself in." - cluster_type = /obj/structure/spider/eggcluster/midwife - potentialspawns = list( - /mob/living/simple_animal/hostile/giant_spider/midwife, - ) - -/** - * Makes a ghost into a spider based on the type of egg cluster. - * - * Allows a ghost to get a prompt to use the egg cluster to become a spider. - * - * Arguments: - * * user - The ghost attempting to become a spider - * * newname - If set, renames the mob to this name - */ -/obj/effect/mob_spawn/ghost_role/spider/create(mob/user, newname) - var/list/spider_list = list() - var/list/display_spiders = list() - for(var/choice in potentialspawns) - var/mob/living/simple_animal/hostile/giant_spider/spider = choice - spider_list[initial(spider.name)] = choice - - var/datum/radial_menu_choice/option = new - option.image = image(icon = initial(spider.icon), icon_state = initial(spider.icon_state)) - - var/datum/reagent/spider_poison = initial(spider.poison_type) - var/spider_description = initial(spider.menu_description) - if(initial(spider.poison_per_bite)) - spider_description += " [initial(spider_poison.name)] injection of [initial(spider.poison_per_bite)]u per bite." - else - spider_description += " Does not inject [initial(spider_poison.name)]." - option.info = span_boldnotice(spider_description) - - display_spiders[initial(spider.name)] = option - sort_list(display_spiders) - var/chosen_spider = show_radial_menu(user, egg, display_spiders, radius = 38) - chosen_spider = spider_list[chosen_spider] - if(QDELETED(src) || QDELETED(user) || !chosen_spider) - return FALSE - mob_type = chosen_spider - mob_name = "[mob_name] ([rand(1, 1000)])" - return ..() diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm deleted file mode 100644 index 00390d533bec..000000000000 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ /dev/null @@ -1,321 +0,0 @@ - -//i couldn't find any map that uses these, so they're delegated to admin events for now. - -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport - name = "prisoner containment sleeper" - desc = "A sleeper designed to put its occupant into a deep coma, unbreakable until the sleeper turns off. This one's glass is cracked and you can see a pale, sleeping face staring out." - prompt_name = "an escaped prisoner" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper_s" - outfit = /datum/outfit/lavalandprisoner - you_are_text = "You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \ - though fate has other plans for you." - flavour_text = "Good. It seems as though your ship crashed. You remember that you were convicted of " - spawner_job_path = /datum/job/escaped_prisoner - -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Initialize(mapload) - . = ..() - var/list/crimes = list("murder", "larceny", "embezzlement", "unionization", "dereliction of duty", "kidnapping", "gross incompetence", "grand theft", "collaboration with the Syndicate", \ - "worship of a forbidden deity", "interspecies relations", "mutiny") - flavour_text += "[pick(crimes)]. but regardless of that, it seems like your crime doesn't matter now. You don't know where you are, but you know that it's out to kill you, and you're not going \ - to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]." - -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/Destroy() - new /obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/prisoner_transport/special(mob/living/carbon/human/spawned_human) - . = ..() - spawned_human.fully_replace_character_name(null, "NTP #LL-0[rand(111,999)]") //Nanotrasen Prisoner #Lavaland-(numbers) - -/datum/outfit/lavalandprisoner - name = "Lavaland Prisoner" - uniform = /obj/item/clothing/under/rank/prisoner - mask = /obj/item/clothing/mask/breath - shoes = /obj/item/clothing/shoes/sneakers/orange - r_pocket = /obj/item/tank/internals/emergency_oxygen - - -//spawners for the space hotel, which isn't currently in the code but heyoo secret away missions or something - -//Space Hotel Staff -/obj/effect/mob_spawn/ghost_role/human/hotel_staff //not free antag u little shits - name = "staff sleeper" - desc = "A sleeper designed for long-term stasis between guest visits." - prompt_name = "a hotel staff member" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper_s" - outfit = /datum/outfit/hotelstaff - you_are_text = "You are a staff member of a top-of-the-line space hotel!" - flavour_text = "Cater to visiting guests with your fellow staff, advertise the hotel, and make sure the manager doesn't fire you. Remember, the customer is always right!" - important_text = "Do NOT leave the hotel, as that is grounds for contract termination." - spawner_job_path = /datum/job/hotel_staff - -/datum/outfit/hotelstaff - name = "Hotel Staff" - uniform = /obj/item/clothing/under/misc/assistantformal - shoes = /obj/item/clothing/shoes/laceup - r_pocket = /obj/item/radio/off - back = /obj/item/storage/backpack - implants = list(/obj/item/implant/mindshield, /obj/item/implant/exile/noteleport) - -/obj/effect/mob_spawn/ghost_role/human/hotel_staff/security - name = "hotel security sleeper" - prompt_name = "a hotel security member" - outfit = /datum/outfit/hotelstaff/security - you_are_text = "You are a peacekeeper." - flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \ - guests and the staff." - important_text = "Do NOT leave the hotel, as that is grounds for contract termination." - -/datum/outfit/hotelstaff/security - name = "Hotel Security" - uniform = /obj/item/clothing/under/rank/security/officer/blueshirt - shoes = /obj/item/clothing/shoes/jackboots - suit = /obj/item/clothing/suit/armor/vest/blueshirt - head = /obj/item/clothing/head/helmet/blueshirt - back = /obj/item/storage/backpack/security - belt = /obj/item/storage/belt/security/full - -/obj/effect/mob_spawn/ghost_role/human/hotel_staff/Destroy() - new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/syndicate - name = "Syndicate Operative" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper_s" - prompt_name = "a syndicate operative" - you_are_text = "You are a syndicate operative." - flavour_text = "You have awoken, without instruction. Death to Nanotrasen! If there are some clues around as to what you're supposed to be doing, you best follow those." - outfit = /datum/outfit/syndicate_empty - spawner_job_path = /datum/job/space_syndicate - -/datum/outfit/syndicate_empty - name = "Syndicate Operative Empty" - uniform = /obj/item/clothing/under/syndicate - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/tackler/combat/insulated - ears = /obj/item/radio/headset/syndicate/alt - back = /obj/item/storage/backpack - implants = list(/obj/item/implant/weapons_auth) - id = /obj/item/card/id/advanced/chameleon - id_trim = /datum/id_trim/chameleon/operative - -/datum/outfit/syndicate_empty/post_equip(mob/living/carbon/human/H) - H.faction |= ROLE_SYNDICATE - -//For ghost bar. -/obj/effect/mob_spawn/ghost_role/human/space_bar_patron - name = "bar cryogenics" - uses = INFINITY - prompt_name = "a space bar patron" - you_are_text = "You're a patron!" - flavour_text = "Hang out at the bar and chat with your buddies. Feel free to hop back in the cryogenics when you're done chatting." - outfit = /datum/outfit/cryobartender - spawner_job_path = /datum/job/space_bar_patron - -/obj/effect/mob_spawn/ghost_role/human/space_bar_patron/attack_hand(mob/user, list/modifiers) - var/despawn = tgui_alert(usr, "Return to cryosleep? (Warning, Your mob will be deleted!)", null, list("Yes", "No")) - if(despawn == "No" || !loc || !Adjacent(user)) - return - user.visible_message(span_notice("[user.name] climbs back into cryosleep...")) - qdel(user) - -/datum/outfit/cryobartender - name = "Cryogenic Bartender" - uniform = /obj/item/clothing/under/rank/civilian/bartender - back = /obj/item/storage/backpack - shoes = /obj/item/clothing/shoes/sneakers/black - suit = /obj/item/clothing/suit/armor/vest - glasses = /obj/item/clothing/glasses/sunglasses/reagent - -//Timeless prisons: Spawns in Wish Granter prisons in lavaland. Ghosts become age-old users of the Wish Granter and are advised to seek repentance for their past. -/obj/effect/mob_spawn/ghost_role/human/exile - name = "timeless prison" - desc = "Although this stasis pod looks medicinal, it seems as though it's meant to preserve something for a very long time." - prompt_name = "a penitent exile" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - mob_species = /datum/species/shadow - you_are_text = "You are cursed." - flavour_text = "Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \ - did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland." - spawner_job_path = /datum/job/exile - -/obj/effect/mob_spawn/ghost_role/human/exile/Destroy() - new/obj/structure/fluff/empty_sleeper(get_turf(src)) - return ..() - -/obj/effect/mob_spawn/ghost_role/human/exile/special(mob/living/new_spawn) - . = ..() - new_spawn.fully_replace_character_name(null,"Wish Granter's Victim ([rand(1,999)])") - var/wish = rand(1,4) - var/message = "" - switch(wish) - if(1) - message = "You wished to kill, and kill you did. You've lost track of how many, but the spark of excitement that murder once held has winked out. You feel only regret." - if(2) - message = "You wished for unending wealth, but no amount of money was worth this existence. Maybe charity might redeem your soul?" - if(3) - message = "You wished for power. Little good it did you, cast out of the light. You are the [gender == MALE ? "king" : "queen"] of a hell that holds no subjects. You feel only remorse." - if(4) - message = "You wished for immortality, even as your friends lay dying behind you. No matter how many times you cast yourself into the lava, you awaken in this room again within a few days. There is no escape." - to_chat(new_spawn, "[message]") - -/obj/effect/mob_spawn/ghost_role/human/nanotrasensoldier - name = "sleeper" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - faction = list("nanotrasenprivate") - prompt_name = "a private security officer" - you_are_text = "You are a Nanotrasen Private Security Officer!" - flavour_text = "If higher command has an assignment for you, it's best you follow that. Otherwise, death to The Syndicate." - outfit = /datum/outfit/nanotrasensoldier - -/obj/effect/mob_spawn/ghost_role/human/commander - name = "sleeper" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - prompt_name = "a nanotrasen commander" - you_are_text = "You are a Nanotrasen Commander!" - flavour_text = "Upper-crusty of Nanotrasen. You should be given the respect you're owed." - outfit = /datum/outfit/nanotrasencommander - -//space doctor, a rat with cancer, and bessie from an old removed lavaland ruin. - -/obj/effect/mob_spawn/ghost_role/human/doctor - name = "sleeper" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - prompt_name = "a space doctor" - you_are_text = "You are a space doctor!" - flavour_text = "It's your job- no, your duty as a doctor, to care and heal those in need." - outfit = /datum/outfit/job/doctor - spawner_job_path = /datum/job/space_doctor - -/obj/effect/mob_spawn/ghost_role/human/doctor/alive/equip(mob/living/carbon/human/doctor) - . = ..() - // Remove radio and PDA so they wouldn't annoy station crew. - var/list/del_types = list(/obj/item/modular_computer/tablet, /obj/item/radio/headset) - for(var/del_type in del_types) - var/obj/item/unwanted_item = locate(del_type) in doctor - qdel(unwanted_item) - -/obj/effect/mob_spawn/ghost_role/mouse - name = "sleeper" - mob_type = /mob/living/simple_animal/mouse - prompt_name = "a mouse" - you_are_text = "You're a mouse!" - flavour_text = "Uh... yep! Squeak squeak, motherfucker." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/ghost_role/cow - name = "sleeper" - mob_name = "Bessie" - mob_type = /mob/living/basic/cow - prompt_name = "a cow" - you_are_text = "You're a cow!" - flavour_text = "Go graze some grass, stinky." - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - -/obj/effect/mob_spawn/cow/special(mob/living/spawned_mob) - . = ..() - gender = FEMALE - -// snow operatives on snowdin - unfortunately seemingly removed in a map remake womp womp - -/obj/effect/mob_spawn/ghost_role/human/snow_operative - name = "sleeper" - prompt_name = "a snow operative" - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper" - faction = list(ROLE_SYNDICATE) - outfit = /datum/outfit/snowsyndie - you_are_text = "You are a syndicate operative recently awoken from cryostasis in an underground outpost." - flavour_text = "Monitor Nanotrasen communications and record information. All intruders should be disposed of \ - swiftly to assure no gathered information is stolen or lost. Try not to wander too far from the outpost as the \ - caves can be a deadly place even for a trained operative such as yourself." - -/datum/outfit/snowsyndie - name = "Syndicate Snow Operative" - uniform = /obj/item/clothing/under/syndicate/coldres - shoes = /obj/item/clothing/shoes/combat/coldres - ears = /obj/item/radio/headset/syndicate/alt - r_pocket = /obj/item/gun/ballistic/automatic/pistol - id = /obj/item/card/id/advanced/chameleon - implants = list(/obj/item/implant/exile) - id_trim = /datum/id_trim/chameleon/operative - -//Forgotten syndicate ship - -/obj/effect/mob_spawn/ghost_role/human/syndicatespace - name = "Syndicate Ship Crew Member" - show_flavor = FALSE - icon = 'icons/obj/machines/sleeper.dmi' - icon_state = "sleeper_s" - prompt_name = "cybersun crew" - you_are_text = "You are a syndicate operative on old ship, stuck in hostile space." - flavour_text = "Your ship docks after a long time somewhere in hostile space, reporting a malfunction. You are stuck here, with Nanotrasen station nearby. Fix the ship, find a way to power it and follow your captain's orders." - important_text = "Obey orders given by your captain. DO NOT let the ship fall into enemy hands." - outfit = /datum/outfit/syndicatespace/syndicrew - spawner_job_path = /datum/job/syndicate_cybersun - -/datum/outfit/syndicatespace/syndicrew/post_equip(mob/living/carbon/human/H) - H.faction |= ROLE_SYNDICATE - -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/special(mob/living/new_spawn) - . = ..() - new_spawn.grant_language(/datum/language/codespeak, TRUE, TRUE, LANGUAGE_MIND) - var/datum/job/spawn_job = SSjob.GetJobType(spawner_job_path) - var/policy = get_policy(spawn_job.policy_index) - if(policy) - to_chat(new_spawn, span_bold("[policy]")) - -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain - name = "Syndicate Ship Captain" - prompt_name = "a cybersun captain" - you_are_text = "You are the captain of an old ship, stuck in hostile space." - flavour_text = "Your ship docks after a long time somewhere in hostile space, reporting a malfunction. You are stuck here, with Nanotrasen station nearby. Command your crew and turn your ship into the most protected fortress." - important_text = "Protect the ship and secret documents in your backpack with your own life." - outfit = /datum/outfit/syndicatespace/syndicaptain - spawner_job_path = /datum/job/syndicate_cybersun_captain - -/datum/outfit/syndicatespace/syndicaptain/post_equip(mob/living/carbon/human/H) - H.faction |= ROLE_SYNDICATE - -/obj/effect/mob_spawn/ghost_role/human/syndicatespace/captain/Destroy() - new /obj/structure/fluff/empty_sleeper/syndicate/captain(get_turf(src)) - return ..() - -/datum/outfit/syndicatespace/syndicrew - name = "Syndicate Ship Crew Member" - uniform = /obj/item/clothing/under/syndicate/combat - glasses = /obj/item/clothing/glasses/night - mask = /obj/item/clothing/mask/gas/syndicate - ears = /obj/item/radio/headset/syndicate/alt - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - back = /obj/item/storage/backpack - l_pocket = /obj/item/gun/ballistic/automatic/pistol - r_pocket = /obj/item/knife/combat/survival - belt = /obj/item/storage/belt/military/assault - id = /obj/item/card/id/advanced/black/syndicate_command/crew_id - implants = list(/obj/item/implant/weapons_auth) - -/datum/outfit/syndicatespace/syndicaptain - name = "Syndicate Ship Captain" - uniform = /obj/item/clothing/under/syndicate/combat - suit = /obj/item/clothing/suit/armor/vest/capcarapace/syndicate - head = /obj/item/clothing/head/hos/beret/syndicate - ears = /obj/item/radio/headset/syndicate/alt/leader - shoes = /obj/item/clothing/shoes/combat - gloves = /obj/item/clothing/gloves/combat - back = /obj/item/storage/backpack - r_pocket = /obj/item/knife/combat/survival - belt = /obj/item/storage/belt/military/assault - id = /obj/item/card/id/advanced/black/syndicate_command/captain_id - implants = list(/obj/item/implant/weapons_auth) - backpack_contents = list(/obj/item/documents/syndicate/red, /obj/item/paper/fluff/ruins/forgottenship/password, /obj/item/gun/ballistic/automatic/pistol/aps) diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index 994c150c359a..0934cfecddc0 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -125,8 +125,8 @@ ////bans and policy - ///which role to check for a job ban (ROLE_LAVALAND is the default ghost role ban) - var/role_ban = ROLE_LAVALAND + ///which role to check for a job ban + var/role_ban = ROLE_GHOST_ROLE /// Typepath indicating the kind of job datum this ghost role will have. PLEASE inherit this with a new job datum, it's not hard. jobs come with policy configs. var/spawner_job_path = /datum/job/ghost_role diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md index 1f18f3c4443a..8252822cf6c2 100644 --- a/code/modules/mod/adding_new_mod.md +++ b/code/modules/mod/adding_new_mod.md @@ -40,7 +40,7 @@ Currently crew MODsuits should be lightly armored in combat relevant stats. for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + armor_type = /datum/armor/modtheme_psychological complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 ``` @@ -79,19 +79,18 @@ So, now that we have our theme, we want to add a skin to it (or another theme of for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + armor_type = /datum/armor/modtheme_psychological complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 - skins = list( + variants = list( "psychological" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( ), ), ) @@ -101,8 +100,7 @@ We now have a psychological skin, this will apply the psychological icons to eve For example, if our helmet's icon covers the full head (like the research skin), we want to do something like this. ```dm - HELMET_LAYER = null, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, @@ -113,8 +111,8 @@ For example, if our helmet's icon covers the full head (like the research skin), Otherwise, with an open helmet that becomes closed (like the engineering skin), we'd do this. ```dm - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( + UNSEALED_LAYER = NECK_LAYER UNSEALED_CLOTHING = SNUG_FIT, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, @@ -134,50 +132,49 @@ There are specific cases of helmets that semi-cover the head, like the cosmohonk for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + armor_type = /datum/armor/modtheme_psychological complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 - skins = list( + variants = list( "psychological" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( + UNSEALED_LAYER = NECK_LAYER UNSEALED_CLOTHING = SNUG_FIT, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), "psychotherapeutic" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), @@ -207,7 +204,7 @@ As we want this effect to be on demand, we probably want this to be an usable mo - Usable: You can use these for a one time effect. - Active: You can only have one selected at a time. It gives you a special click effect. -As we have an usable module, we want to set a cooldown time. All modules are also incompatible with themselves, have a specific power cost and complexity varying on how powerful they are, so let's update our definition, and also add a new variable for how much brain damage we'll heal. +As we have an usable module, we want to set a cooldown time. All modules are also incompatible with themselves, have a specific power cost and complexity varying on how powerful they are, and are equippable to certain slots, so let's update our definition, and also add a new variable for how much brain damage we'll heal. ```dm /obj/item/mod/module/neuron_healer @@ -217,35 +214,30 @@ As we have an usable module, we want to set a cooldown time. All modules are als icon_state = "neuron_healer" module_type = MODULE_USABLE complexity = 3 - use_power_cost = DEFAULT_CHARGE_DRAIN + use_energy_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/neuron_healer) cooldown_time = 15 SECONDS + required_slot = list(ITEM_SLOT_HEAD) var/brain_damage_healed = 25 ``` -Now, we want to override the on_use proc for our new effect. We want to make sure the use checks passed from parent. You can read about most procs and variables by reading [this](modules/_module.dm) +Now, we want to override the on_use proc for our new effect. You can read about most procs and variables by reading [this](modules/_module.dm) ```dm /obj/item/mod/module/neuron_healer/on_use() - . = ..() - if(!.) - return ``` After this, we want to put our special code, a basic effect of healing all mobs nearby for their brain damage and creating a beam to them. ```dm /obj/item/mod/module/neuron_healer/on_use() - . = ..() - if(!.) - return for(var/mob/living/carbon/carbon_mob in range(5, src)) if(carbon_mob == mod.wearer) continue carbon_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -brain_damage_healed) mod.wearer.Beam(carbon_mob, icon_state = "plasmabeam", time = 1.5 SECONDS) playsound(src, 'sound/effects/magic.ogg', 100, TRUE) - drain_power(use_power_cost) + drain_power(use_energy_cost) ``` We now have a basic module, we can add it to the techwebs to make it printable ingame, and we can add an inbuilt, advanced version of it for our psychological suit. We'll give it more healing power, no complexity and make it unremovable. @@ -268,51 +260,50 @@ Now we want to add it to the psychological theme, which is very simple, finishin for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + armor_type = /datum/armor/modtheme_psychological complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 inbuilt_modules = list(/obj/item/mod/module/neuron_healer/advanced) - skins = list( + variants = list( "psychological" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( + UNSEALED_LAYER = NECK_LAYER UNSEALED_CLOTHING = SNUG_FIT, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), "psychotherapeutic" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, ), diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index bd051a5d1669..108e7212703d 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -4,35 +4,46 @@ /obj/item/mod/control/proc/choose_deploy(mob/user) if(!length(mod_parts)) return + var/list/display_names = list() var/list/items = list() - for(var/obj/item/part as anything in mod_parts) + var/list/parts = get_parts() + for(var/obj/item/part as anything in parts) display_names[part.name] = REF(part) var/image/part_image = image(icon = part.icon, icon_state = part.icon_state) + if(part.loc != src) part_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_active") + items += list(part.name = part_image) + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) if(!pick) return + var/part_reference = display_names[pick] - var/obj/item/part = locate(part_reference) in mod_parts + var/obj/item/part = locate(part_reference) in parts + if(!istype(part) || user.incapacitated()) return + if(active || activating) balloon_alert(user, "deactivate the suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return - var/parts_to_check = mod_parts - part + + var/parts_to_check = parts - part if(part.loc == src) deploy(user, part) + SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user) for(var/obj/item/checking_part as anything in parts_to_check) if(checking_part.loc != src) continue choose_deploy(user) break else - conceal(user, part) + retract(user, part) + SEND_SIGNAL(src, COMSIG_MOD_RETRACTED, user) for(var/obj/item/checking_part as anything in parts_to_check) if(checking_part.loc == src) continue @@ -45,64 +56,97 @@ balloon_alert(user, "deactivate the suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + var/deploy = FALSE - for(var/obj/item/part as anything in mod_parts) + for(var/obj/item/part as anything in get_parts()) if(part.loc != src) continue deploy = TRUE - for(var/obj/item/part as anything in mod_parts) + + for(var/obj/item/part as anything in get_parts()) if(deploy && part.loc == src) deploy(null, part) else if(!deploy && part.loc != src) - conceal(null, part) - wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its' parts with a mechanical hiss."), - span_notice("[src] [deploy ? "deploys" : "retracts"] its' parts with a mechanical hiss."), + retract(null, part) + + wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), + span_notice("[src] [deploy ? "deploys" : "retracts"] its parts with a mechanical hiss."), span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(deploy) + SEND_SIGNAL(src, COMSIG_MOD_DEPLOYED, user) + else + SEND_SIGNAL(src, COMSIG_MOD_RETRACTED, user) return TRUE /// Deploys a part of the suit onto the user. /obj/item/mod/control/proc/deploy(mob/user, obj/item/part) - if(part in overslotting_parts) + var/datum/mod_part/part_datum = get_part_datum(part) + if(!wearer) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE // pAI is trying to deploy it from your hands + + if(part.loc != src) + if(user) + balloon_alert(user, "[part.name] already deployed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + + if(part_datum.can_overslot) var/obj/item/overslot = wearer.get_item_by_slot(part.slot_flags) if(overslot) - overslotting_parts[part] = overslot + part_datum.overslotting = overslot wearer.transferItemToLoc(overslot, part, force = TRUE) + RegisterSignal(part, COMSIG_ATOM_EXITED, PROC_REF(on_overslot_exit)) + if(wearer.equip_to_slot_if_possible(part, part.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) ADD_TRAIT(part, TRAIT_NODROP, MOD_TRAIT) if(!user) return TRUE + wearer.visible_message(span_notice("[wearer]'s [part.name] deploy[part.p_s()] with a mechanical hiss."), span_notice("[part] deploy[part.p_s()] with a mechanical hiss."), span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + SEND_SIGNAL(src, COMSIG_MOD_PART_DEPLOYED, user, part) return TRUE - else if(part.loc != src) - if(!user) - return FALSE - balloon_alert(user, "[part.name] already deployed!") - playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) - else - if(!user) - return FALSE + + else if(user) balloon_alert(user, "bodypart clothed!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE /// Retract a part of the suit from the user -/obj/item/mod/control/proc/conceal(mob/user, obj/item/part) +/obj/item/mod/control/proc/retract(mob/user, obj/item/part) + var/datum/mod_part/part_datum = get_part_datum(part) + if(part.loc == src) + if(user) + balloon_alert(user, "[part.name] already retracted!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + REMOVE_TRAIT(part, TRAIT_NODROP, MOD_TRAIT) wearer.transferItemToLoc(part, src, force = TRUE) - if(overslotting_parts[part]) - var/obj/item/overslot = overslotting_parts[part] - if(!wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + if(part_datum.overslotting) + UnregisterSignal(part, COMSIG_ATOM_EXITED) + var/obj/item/overslot = part_datum.overslotting + if(!QDELING(wearer) && !wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) - overslotting_parts[part] = null + part_datum.overslotting = null + + + SEND_SIGNAL(src, COMSIG_MOD_PART_RETRACTED, user, part) + . = TRUE + if(!user) return + wearer.visible_message(span_notice("[wearer]'s [part.name] retract[part.p_s()] back into [src] with a mechanical hiss."), span_notice("[part] retract[part.p_s()] back into [src] with a mechanical hiss."), span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on @@ -112,111 +156,115 @@ balloon_alert(user, "put suit on back!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE)) playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - for(var/obj/item/part as anything in mod_parts) + + for(var/obj/item/part as anything in get_parts()) if(!force_deactivate && part.loc == src) balloon_alert(user, "deploy all parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(locked && !active && !allowed(user) && !force_deactivate) balloon_alert(user, "access insufficient!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(!get_charge() && !force_deactivate) balloon_alert(user, "suit not powered!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(open && !force_deactivate) balloon_alert(user, "close the suit panel!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(activating) if(!force_deactivate) balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + for(var/obj/item/mod/module/module as anything in modules) if(!module.active) continue - module.on_deactivation(display_message = FALSE) + module.deactivate(display_message = FALSE) + + mod_link.end_call() activating = TRUE + to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) - if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) - to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(boots, seal = !active) - if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) - to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(gauntlets, seal = !active) - if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) - to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(chestplate, seal = !active) - if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) - to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"].")) - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - seal_part(helmet, seal = !active) - if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) + + for(var/obj/item/part as anything in get_parts()) + var/datum/mod_part/part_datum = get_part_datum(part) + if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)))) + to_chat(wearer, span_notice("[part] [active ? part_datum.unsealed_message : part_datum.sealed_message].")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(part, is_sealed = !active) + + if(do_after(wearer, wearer, activation_step_time, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(get_wearer)))) + to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) if(ai) to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"")) - finish_activation(on = !active) + + finish_activation(is_on = !active) + if(active) playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) if(!malfunctioning) wearer.playsound_local(get_turf(src), 'sound/mecha/nominal.ogg', 50) else playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + activating = FALSE return TRUE ///Seals or unseals the given part -/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) - if(seal) +/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, is_sealed) + var/datum/mod_part/part_datum = get_part_datum(part) + part_datum.sealed = is_sealed + if(part_datum.sealed) + part.icon_state = "[skin]-[part.base_icon_state]-sealed" part.clothing_flags |= part.visor_flags part.flags_inv |= part.visor_flags_inv part.flags_cover |= part.visor_flags_cover part.heat_protection = initial(part.heat_protection) part.cold_protection = initial(part.cold_protection) - part.alternate_worn_layer = null + part.alternate_worn_layer = part_datum.sealed_layer else + part.icon_state = "[skin]-[part.base_icon_state]" part.flags_cover &= ~part.visor_flags_cover part.flags_inv &= ~part.visor_flags_inv part.clothing_flags &= ~part.visor_flags part.heat_protection = NONE part.cold_protection = NONE - part.alternate_worn_layer = mod_parts[part] - if(part == boots) - boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]" - wearer.update_worn_shoes() - if(part == gauntlets) - gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]" - wearer.update_worn_gloves() - if(part == chestplate) - chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]" - wearer.update_worn_oversuit() - wearer.update_worn_undersuit() - if(part == helmet) - helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]" - wearer.update_worn_head() - wearer.update_worn_mask() - wearer.update_worn_glasses() - wearer.update_body_parts() + part.alternate_worn_layer = part_datum.unsealed_layer + + if((part.clothing_flags & (MASKINTERNALS|HEADINTERNALS)) && wearer.invalid_internals()) + wearer.cutoff_internals() + + wearer.update_slots_for_item(part, force_obscurity_update = TRUE) /// Finishes the suit's activation, starts processing -/obj/item/mod/control/proc/finish_activation(on) - active = on +/obj/item/mod/control/proc/finish_activation(is_on) + var/datum/mod_part/part_datum = get_part_datum(src) + part_datum.sealed = is_on + active = is_on + if(active) for(var/obj/item/mod/module/module as anything in modules) module.on_suit_activation() START_PROCESSING(SSobj, src) + else for(var/obj/item/mod/module/module as anything in modules) module.on_suit_deactivation() STOP_PROCESSING(SSobj, src) + update_speed() update_icon_state() wearer.update_worn_back() @@ -224,16 +272,15 @@ /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. /obj/item/mod/control/proc/quick_activation() var/seal = TRUE - for(var/obj/item/part as anything in mod_parts) + for(var/obj/item/part as anything in get_parts()) if(!deploy(null, part)) seal = FALSE + if(!seal) return - for(var/obj/item/part as anything in mod_parts) - seal_part(part, seal = TRUE) - finish_activation(on = TRUE) -/obj/item/mod/control/proc/has_wearer() - return wearer + for(var/obj/item/part as anything in get_parts()) + seal_part(part, is_sealed = TRUE) + finish_activation(is_on = TRUE) #undef MOD_ACTIVATION_STEP_FLAGS diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index 61ffeca5e997..a5fd904093a3 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -74,7 +74,7 @@ #define AI_FALL_TIME 1 SECONDS /obj/item/mod/control/relaymove(mob/user, direction) - if((!active && wearer) || get_charge() < CHARGE_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) + if((!active && wearer) || get_charge() < CHARGE_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || HAS_TRAIT(wearer, TRAIT_AGGRESSIVE_GRAB)) return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? 2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) if(wearer && !wearer.Process_Spacemove(direction)) @@ -144,6 +144,6 @@ icon_state = "minicard" ai.forceMove(card) card.AI = ai - ai.notify_ghost_cloning("You have been recovered from the wreckage!", source = card) + ai.notify_ghost_revival("You have been recovered from the wreckage!", source = card) balloon_alert(user, "AI transferred to card") stored_ai = null diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 2c71d366d724..7bf5ae01a080 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -3,8 +3,9 @@ desc = "A helmet for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "helmet" + base_icon_state = "helmet" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) body_parts_covered = HEAD heat_protection = HEAD cold_protection = HEAD @@ -16,21 +17,29 @@ desc = "A chestplate for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "chestplate" + base_icon_state = "chestplate" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + worn_icon_digitigrade = 'modular_pariah/master_files/icons/mob/mod.dmi' blood_overlay_type = "armor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) body_parts_covered = CHEST|GROIN heat_protection = CHEST|GROIN cold_protection = CHEST|GROIN obj_flags = IMMUTABLE_SLOW + allowed = list( + /obj/item/tank/internals, + /obj/item/flashlight, + ) + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION /obj/item/clothing/gloves/mod name = "MOD gauntlets" desc = "A pair of gauntlets for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "gauntlets" + base_icon_state = "gauntlets" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) body_parts_covered = HANDS|ARMS heat_protection = HANDS|ARMS cold_protection = HANDS|ARMS @@ -41,11 +50,14 @@ desc = "A pair of boots for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "boots" + base_icon_state = "boots" worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) + worn_icon_digitigrade = 'modular_pariah/master_files/icons/mob/mod.dmi' + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS cold_protection = FEET|LEGS obj_flags = IMMUTABLE_SLOW item_flags = IGNORE_DIGITIGRADE can_be_tied = FALSE + supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 0b26f567af9b..ae8998af266b 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -46,7 +46,9 @@ /obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool) . = ..() + balloon_alert(user, "repairing...") if(!tool.use_tool(src, user, 5 SECONDS, volume = 30)) + balloon_alert(user, "interrupted!") return new /obj/item/mod/core/standard(drop_location()) qdel(src) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index b34ebc5c7278..a5cf3f2e60a1 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -9,11 +9,12 @@ name = "MOD control unit" desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." icon_state = "control" + base_icon_state = "control" inhand_icon_state = "mod_control" w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) actions_types = list( /datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, @@ -57,33 +58,27 @@ /// Power usage of the MOD. var/charge_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. - var/slowdown_inactive = 1.25 + var/slowdown_inactive = 0 /// Slowdown of the MOD when active. - var/slowdown_active = 0.75 + var/slowdown_active = 0 /// How long this MOD takes each part to seal. var/activation_step_time = MOD_ACTIVATION_STEP_TIME /// Extended description of the theme. var/extended_desc - /// MOD helmet. - var/obj/item/clothing/head/mod/helmet - /// MOD chestplate. - var/obj/item/clothing/suit/mod/chestplate - /// MOD gauntlets. - var/obj/item/clothing/gloves/mod/gauntlets - /// MOD boots. - var/obj/item/clothing/shoes/mod/boots /// MOD core. var/obj/item/mod/core/core - /// Associated list of parts (helmet, chestplate, gauntlets, boots) to their unsealed worn layer. + /// List of MODsuit part datums. var/list/mod_parts = list() - /// Associated list of parts that can overslot to their overslot (overslot means the part can cover another layer of clothing). - var/list/overslotting_parts = list() /// Modules the MOD should spawn with. var/list/initial_modules = list() /// Modules the MOD currently possesses. var/list/modules = list() /// Currently used module. var/obj/item/mod/module/selected_module + /// The MODlink datum, letting us call people from the suit. + var/datum/mod_link/mod_link + /// The starting MODlink frequency, overridden on subtypes that want it to be something. + var/starting_frequency = null /// AI mob inhabiting the MOD. var/mob/living/silicon/ai/ai /// Delay between moves as AI. @@ -98,93 +93,54 @@ if(new_theme) theme = new_theme theme = GLOB.mod_themes[theme] - extended_desc = theme.extended_desc - slowdown_inactive = theme.slowdown_inactive - slowdown_active = theme.slowdown_active - complexity_max = theme.complexity_max - ui_theme = theme.ui_theme - charge_drain = theme.charge_drain initial_modules += theme.inbuilt_modules + + theme.set_up_parts(src, new_skin) + for(var/obj/item/part as anything in get_parts()) + RegisterSignal(part, COMSIG_ATOM_DESTRUCTION, PROC_REF(on_part_destruction)) + RegisterSignal(part, COMSIG_PARENT_QDELETING, PROC_REF(on_part_deletion)) + wires = new /datum/wires/mod(src) + if(length(req_access)) locked = TRUE + new_core?.install(src) - helmet = new /obj/item/clothing/head/mod(src) - mod_parts += helmet - chestplate = new /obj/item/clothing/suit/mod(src) - chestplate.allowed = typecacheof(theme.allowed_suit_storage) - mod_parts += chestplate - gauntlets = new /obj/item/clothing/gloves/mod(src) - mod_parts += gauntlets - boots = new /obj/item/clothing/shoes/mod(src) - mod_parts += boots - var/list/all_parts = mod_parts.Copy() + src - for(var/obj/item/part as anything in all_parts) - part.name = "[theme.name] [part.name]" - part.desc = "[part.desc] [theme.desc]" - part.armor = getArmor(arglist(theme.armor)) - part.resistance_flags = theme.resistance_flags - part.flags_1 |= theme.atom_flags //flags like initialization or admin spawning are here, so we cant set, have to add - part.heat_protection = NONE - part.cold_protection = NONE - part.max_heat_protection_temperature = theme.max_heat_protection_temperature - part.min_cold_protection_temperature = theme.min_cold_protection_temperature - part.permeability_coefficient = theme.permeability_coefficient - part.siemens_coefficient = theme.siemens_coefficient - for(var/obj/item/part as anything in mod_parts) - RegisterSignal(part, COMSIG_ATOM_DESTRUCTION, PROC_REF(on_part_destruction)) - RegisterSignal(part, COMSIG_PARENT_QDELETING, PROC_REF(on_part_deletion)) - set_mod_skin(new_skin || theme.default_skin) + update_speed() + for(var/obj/item/mod/module/module as anything in initial_modules) module = new module(src) install(module) + RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, PROC_REF(on_potion)) movedelay = CONFIG_GET(number/movedelay/run_delay) + START_PROCESSING(SSobj, src) /obj/item/mod/control/Destroy() - if(active) - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSobj, src) + for(var/obj/item/mod/module/module as anything in modules) uninstall(module, deleting = TRUE) - for(var/obj/item/part as anything in mod_parts) - overslotting_parts -= part - var/atom/deleting_atom - if(!QDELETED(helmet)) - deleting_atom = helmet - helmet = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(chestplate)) - deleting_atom = chestplate - chestplate = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(gauntlets)) - deleting_atom = gauntlets - gauntlets = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(!QDELETED(boots)) - deleting_atom = boots - boots = null - mod_parts -= deleting_atom - qdel(deleting_atom) - if(core) - QDEL_NULL(core) + + QDEL_NULL(core) QDEL_NULL(wires) + QDEL_NULL(mod_link) + + for(var/datum/mod_part/part_datum as anything in get_part_datums(include_control = TRUE)) + part_datum.part_item = null + part_datum.overslotting = null return ..() /obj/item/mod/control/atom_destruction(damage_flag) + if(wearer) + wearer.visible_message(span_danger("[src] fall[p_s()] apart, completely destroyed!"), vision_distance = COMBAT_MESSAGE_RANGE) + clean_up() + for(var/obj/item/mod/module/module as anything in modules) uninstall(module) - for(var/obj/item/part as anything in mod_parts) - if(!overslotting_parts[part]) - continue - var/obj/item/overslot = overslotting_parts[part] - overslot.forceMove(drop_location()) - overslotting_parts[part] = null + if(ai) ai.controlled_equipment = null ai.remote_control = null @@ -216,6 +172,8 @@ . += span_notice("You could remove [ai] with an intellicard.") else . += span_notice("You could install an AI with an intellicard.") + . += span_notice("You could copy/set link frequency with a multitool.") + . += span_notice("You could examine it more thoroughly...") /obj/item/mod/control/examine_more(mob/user) . = ..() @@ -224,9 +182,13 @@ /obj/item/mod/control/process(delta_time) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- - if(!get_charge() && active && !activating) + if(mod_link.link_call) + subtract_charge((DEFAULT_CHARGE_DRAIN * 0.25) * delta_time) + if(!active) + return + if(!get_charge() && !activating) power_off() - return PROCESS_KILL + return var/malfunctioning_charge_drain = 0 if(malfunctioning) malfunctioning_charge_drain = rand(1,20) @@ -234,12 +196,11 @@ update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) if(malfunctioning && module.active && DT_PROB(5, delta_time)) - module.on_deactivation(display_message = TRUE) + module.deactivate(display_message = TRUE) module.on_process(delta_time) -/obj/item/mod/control/equipped(mob/user, slot) - ..() - if(slot == ITEM_SLOT_BACK) +/obj/item/mod/control/visual_equipped(mob/user, slot, initial = FALSE) //needs to be visual because we wanna show it in select equipment + if(slot & slot_flags) set_wearer(user) else if(wearer) unset_wearer() @@ -257,23 +218,30 @@ . = ..() if(!wearer || old_loc != wearer || loc == wearer) return + if(active || activating) for(var/obj/item/mod/module/module as anything in modules) if(!module.active) continue - module.on_deactivation(display_message = FALSE) - for(var/obj/item/part as anything in mod_parts) - seal_part(part, seal = FALSE) - for(var/obj/item/part as anything in mod_parts) - conceal(null, part) + module.deactivate(display_message = FALSE) + + for(var/obj/item/part as anything in get_parts()) + seal_part(part, is_sealed = FALSE) + + for(var/obj/item/part as anything in get_parts()) + retract(null, part) + if(active) - finish_activation(on = FALSE) + finish_activation(is_on = FALSE) + mod_link?.end_call() + unset_wearer() /obj/item/mod/control/allow_attack_hand_drop(mob/user) if(user != wearer) return ..() - for(var/obj/item/part as anything in mod_parts) + + for(var/obj/item/part as anything in get_parts()) if(part.loc != src) balloon_alert(user, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) @@ -282,7 +250,7 @@ /obj/item/mod/control/MouseDrop(atom/over_object) if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) return ..() - for(var/obj/item/part as anything in mod_parts) + for(var/obj/item/part as anything in get_parts()) if(part.loc != src) balloon_alert(wearer, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) @@ -404,7 +372,7 @@ /obj/item/mod/control/GetAccess() if(ai_controller) - return req_access.Copy() + return req_access?.Copy() else return ..() @@ -419,27 +387,28 @@ to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!")) if(. & EMP_PROTECT_CONTENTS) return - selected_module?.on_deactivation(display_message = TRUE) + selected_module?.deactivate(display_message = TRUE) wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE) to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly.")) if(wearer.stat < UNCONSCIOUS && prob(10)) wearer.emote("scream") /obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) - if(visuals_only) - set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped + . = ..() quick_activation() /obj/item/mod/control/doStrip(mob/stripper, mob/owner) if(active && !toggle_activate(stripper, force_deactivate = TRUE)) return - for(var/obj/item/part as anything in mod_parts) + + for(var/obj/item/part as anything in get_parts()) if(part.loc == src) continue - conceal(null, part) + retract(null, part) + return ..() -/obj/item/mod/control/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) +/obj/item/mod/control/worn_overlays(mob/living/carbon/human/wearer, mutable_appearance/standing, isinhands = FALSE, icon_file) . = ..() for(var/obj/item/mod/module/module as anything in modules) var/list/module_icons = module.generate_worn_overlay(standing) @@ -457,11 +426,51 @@ return return ..() +/obj/item/mod/control/proc/get_parts(include_control = FALSE) + . = list() + for(var/key in mod_parts) + var/datum/mod_part/part = mod_parts[key] + if(!include_control && part.part_item == src) + continue + . += part.part_item + +/obj/item/mod/control/proc/get_part_datums(include_control = FALSE) + . = list() + for(var/key in mod_parts) + var/datum/mod_part/part = mod_parts[key] + if(!include_control && part.part_item == src) + continue + . += part + +/obj/item/mod/control/proc/get_part_datum(obj/item/part) + RETURN_TYPE(/datum/mod_part) + var/datum/mod_part/potential_part = mod_parts["[part.slot_flags]"] + if(potential_part?.part_item == part) + return potential_part + for(var/datum/mod_part/mod_part in get_part_datums()) + if(mod_part.part_item == part) + return mod_part + CRASH("get_part_datum called with incorrect item [part] passed.") + +/obj/item/mod/control/proc/get_part_from_slot(slot) + slot = "[slot]" + for(var/part_slot in mod_parts) + if(slot != part_slot) + continue + var/datum/mod_part/part = mod_parts[part_slot] + return part.part_item + /obj/item/mod/control/proc/set_wearer(mob/user) + if(wearer == user) + CRASH("set_wearer() was called with the new wearer being the current wearer: [wearer]") + else if(!isnull(wearer)) + stack_trace("set_wearer() was called with a new wearer without unset_wearer() being called") + wearer = user SEND_SIGNAL(src, COMSIG_MOD_WEARER_SET, wearer) RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) update_charge_alert() + for(var/obj/item/mod/module/module as anything in modules) module.on_equip() @@ -473,35 +482,71 @@ SEND_SIGNAL(src, COMSIG_MOD_WEARER_UNSET, wearer) wearer = null +/obj/item/mod/control/proc/clean_up() + if(QDELING(src)) + unset_wearer() + return + + if(active || activating) + for(var/obj/item/mod/module/module as anything in modules) + if(!module.active) + continue + module.deactivate(display_message = FALSE) + + for(var/obj/item/part as anything in get_parts()) + seal_part(part, is_sealed = FALSE) + + for(var/obj/item/part as anything in get_parts()) + retract(null, part) + + if(active) + finish_activation(is_on = FALSE) + mod_link?.end_call() + + var/mob/old_wearer = wearer + unset_wearer() + old_wearer.temporarilyRemoveItemFromInventory(src) + /obj/item/mod/control/proc/quick_module(mob/user) if(!length(modules)) return + var/list/display_names = list() var/list/items = list() for(var/obj/item/mod/module/module as anything in modules) if(module.module_type == MODULE_PASSIVE) continue + display_names[module.name] = REF(module) + var/image/module_image = image(icon = module.icon, icon_state = module.icon_state) if(module == selected_module) module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_selected") + else if(module.active) module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_active") + if(!COOLDOWN_FINISHED(module, cooldown_timer)) module_image.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown")) + items += list(module.name = module_image) + if(!length(items)) return + var/radial_anchor = src if(istype(user.loc, /obj/effect/dummy/phased_mob)) radial_anchor = get_turf(user.loc) //they're phased out via some module, anchor the radial on the turf so it may still display + var/pick = show_radial_menu(user, radial_anchor, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) if(!pick) return + var/module_reference = display_names[pick] var/obj/item/mod/module/picked_module = locate(module_reference) in modules if(!istype(picked_module) || user.incapacitated()) return + picked_module.on_select() /obj/item/mod/control/proc/shock(mob/living/user) @@ -518,18 +563,28 @@ balloon_alert(user, "[new_module] incompatible with [old_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return + if(is_type_in_list(new_module, theme.module_blacklist)) if(user) balloon_alert(user, "[src] doesn't accept [new_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return + var/complexity_with_module = complexity complexity_with_module += new_module.complexity + if(complexity_with_module > complexity_max) if(user) balloon_alert(user, "[new_module] would make [src] too complex!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return + + if(!new_module.has_required_parts(mod_parts)) + if(user) + balloon_alert(user, "[new_module] incompatible with [src]'s parts!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + new_module.forceMove(src) modules += new_module complexity += new_module.complexity @@ -544,14 +599,20 @@ /obj/item/mod/control/proc/uninstall(obj/item/mod/module/old_module, deleting = FALSE) modules -= old_module complexity -= old_module.complexity + if(active) old_module.on_suit_deactivation(deleting = deleting) if(old_module.active) - old_module.on_deactivation(display_message = !deleting, deleting = deleting) + old_module.deactivate(display_message = !deleting, deleting = deleting) + old_module.on_uninstall(deleting = deleting) QDEL_LIST_ASSOC_VAL(old_module.pinned_to) old_module.mod = null +/// Intended for callbacks, don't use normally, just get wearer by itself. +/obj/item/mod/control/proc/get_wearer() + return wearer + /obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) if(!allowed(user)) balloon_alert(user, "insufficient access!") @@ -587,9 +648,8 @@ core.update_charge_alert() /obj/item/mod/control/proc/update_speed() - var/list/all_parts = mod_parts + src - for(var/obj/item/part as anything in all_parts) - part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(all_parts) + for(var/obj/item/part as anything in get_parts(include_control = TRUE)) + part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(mod_parts) wearer?.update_equipment_speed_mods() /obj/item/mod/control/proc/power_off() @@ -597,48 +657,10 @@ toggle_activate(wearer, force_deactivate = TRUE) /obj/item/mod/control/proc/set_mod_color(new_color) - var/list/all_parts = mod_parts.Copy() + src - for(var/obj/item/part as anything in all_parts) + for(var/obj/item/part as anything in get_parts(include_control = TRUE)) part.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) part.add_atom_colour(new_color, FIXED_COLOUR_PRIORITY) - wearer?.regenerate_icons() -/obj/item/mod/control/proc/set_mod_skin(new_skin) - if(active) - CRASH("[src] tried to set skin while active!") - skin = new_skin - var/list/used_skin = theme.skins[new_skin] - alternate_worn_layer = used_skin[CONTROL_LAYER] - var/list/skin_updating = mod_parts.Copy() + src - for(var/obj/item/part as anything in skin_updating) - if(used_skin[MOD_ICON_OVERRIDE]) - part.icon = used_skin[MOD_ICON_OVERRIDE] - if(used_skin[MOD_WORN_ICON_OVERRIDE]) - part.worn_icon = used_skin[MOD_WORN_ICON_OVERRIDE] - part.icon_state = "[skin]-[initial(part.icon_state)]" - for(var/obj/item/clothing/part as anything in mod_parts) - var/used_category - if(part == helmet) - used_category = HELMET_FLAGS - if(part == chestplate) - used_category = CHESTPLATE_FLAGS - if(part == gauntlets) - used_category = GAUNTLETS_FLAGS - if(part == boots) - used_category = BOOTS_FLAGS - var/list/category = used_skin[used_category] - part.clothing_flags = category[UNSEALED_CLOTHING] || NONE - part.visor_flags = category[SEALED_CLOTHING] || NONE - part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE - part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE - part.flags_cover = category[UNSEALED_COVER] || NONE - part.visor_flags_cover = category[SEALED_COVER] || NONE - part.alternate_worn_layer = category[UNSEALED_LAYER] - mod_parts[part] = part.alternate_worn_layer - if(!category[CAN_OVERSLOT]) - overslotting_parts -= part - continue - overslotting_parts[part] = null wearer?.regenerate_icons() /obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction) @@ -646,17 +668,25 @@ if(part.loc == src) return + if(part == core) core.uninstall() update_charge_alert() return + if(part.loc == wearer) return + if(part in modules) uninstall(part) return - if(part in mod_parts) - conceal(wearer, part) + + if(part in get_parts()) + if(isnull(part.loc)) + return + + retract(wearer, part) + if(active) INVOKE_ASYNC(src, PROC_REF(toggle_activate), wearer, TRUE) return @@ -664,21 +694,26 @@ /obj/item/mod/control/proc/on_part_destruction(obj/item/part, damage_flag) SIGNAL_HANDLER - if(overslotting_parts[part]) - var/obj/item/overslot = overslotting_parts[part] - overslot.forceMove(drop_location()) - overslotting_parts[part] = null - if(QDELETED(src)) + if(QDELING(src)) return atom_destruction(damage_flag) /obj/item/mod/control/proc/on_part_deletion(obj/item/part) SIGNAL_HANDLER - - if(QDELETED(src)) + if(QDELING(src)) return + + part.moveToNullspace() qdel(src) +/obj/item/mod/control/proc/on_overslot_exit(obj/item/part, atom/movable/overslot, direction) + SIGNAL_HANDLER + + var/datum/mod_part/part_datum = get_part_datum(part) + if(overslot != part_datum.overslotting) + return + part_datum.overslotting = null + /obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user) SIGNAL_HANDLER diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm new file mode 100644 index 000000000000..7e913d6d1af1 --- /dev/null +++ b/code/modules/mod/mod_link.dm @@ -0,0 +1,533 @@ +/proc/make_link_visual_generic(datum/mod_link/mod_link, proc_path) + var/mob/living/user = mod_link.get_user_callback.Invoke() + var/obj/effect/overlay/link_visual = new() + link_visual.name = "holocall ([mod_link.id])" + link_visual.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + link_visual.appearance_flags |= KEEP_TOGETHER + link_visual.makeHologram(rgb(125,180,225, 0.75 * 255)) + mod_link.visual_overlays = user.overlays + link_visual.add_overlay(mod_link.visual_overlays) + mod_link.visual = link_visual + mod_link.holder.become_hearing_sensitive(REF(mod_link)) + mod_link.holder.RegisterSignal(user, list(COMSIG_CARBON_APPLY_OVERLAY, COMSIG_CARBON_REMOVE_OVERLAY), proc_path) + return link_visual + +/proc/get_link_visual_generic(datum/mod_link/mod_link, atom/movable/visuals, proc_path) + var/mob/living/user = mod_link.get_user_callback.Invoke() + playsound(mod_link.holder, 'sound/machines/terminal_processing.ogg', 50, vary = TRUE) + visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "static_base", TURF_LAYER)) + visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "modlink", ABOVE_ALL_MOB_LAYER)) + visuals.add_filter("crop_square", 1, alpha_mask_filter(icon = icon('icons/effects/effects.dmi', "modlink_filter"))) + visuals.maptext_height = 6 + visuals.alpha = 0 + user.vis_contents += visuals + visuals.forceMove(user) + animate(visuals, 0.5 SECONDS, alpha = 255) + var/datum/callback/setdir_callback = CALLBACK(mod_link.holder, proc_path) + setdir_callback.Invoke(user, user.dir, user.dir) + mod_link.holder.RegisterSignal(mod_link.holder.loc, COMSIG_ATOM_DIR_CHANGE, proc_path) + +/proc/delete_link_visual_generic(datum/mod_link/mod_link) + var/mob/living/user = mod_link.get_user_callback.Invoke() + playsound(mod_link.get_other().holder, 'sound/machines/terminal_processing.ogg', 50, vary = TRUE, frequency = -1) + mod_link.holder.lose_hearing_sensitivity(REF(mod_link)) + mod_link.holder.UnregisterSignal(user, list(COMSIG_CARBON_APPLY_OVERLAY, COMSIG_CARBON_REMOVE_OVERLAY, COMSIG_ATOM_DIR_CHANGE)) + QDEL_NULL(mod_link.visual) + +/proc/on_user_set_dir_generic(datum/mod_link/mod_link, newdir) + var/atom/other_visual = mod_link.get_other().visual + if(!newdir) //can sometimes be null or 0 + return + other_visual.setDir(SOUTH) + other_visual.pixel_x = 0 + other_visual.pixel_y = 0 + var/matrix/new_transform = matrix() + if(newdir & NORTH) + other_visual.pixel_y = 13 + other_visual.layer = BELOW_MOB_LAYER + if(newdir & SOUTH) + other_visual.pixel_y = -24 + other_visual.layer = ABOVE_ALL_MOB_LAYER + new_transform.Scale(-1, 1) + new_transform.Translate(-1, 0) + if(newdir & EAST) + other_visual.pixel_x = 14 + other_visual.layer = BELOW_MOB_LAYER + new_transform.Shear(0.5, 0) + new_transform.Scale(0.65, 1) + if(newdir & WEST) + other_visual.pixel_x = -14 + other_visual.layer = BELOW_MOB_LAYER + new_transform.Shear(-0.5, 0) + new_transform.Scale(0.65, 1) + other_visual.transform = new_transform + +/obj/item/mod/control/Initialize(mapload, datum/mod_theme/new_theme, new_skin, obj/item/mod/core/new_core) + . = ..() + mod_link = new( + src, + starting_frequency, + CALLBACK(src, PROC_REF(get_wearer)), + CALLBACK(src, PROC_REF(can_call)), + CALLBACK(src, PROC_REF(make_link_visual)), + CALLBACK(src, PROC_REF(get_link_visual)), + CALLBACK(src, PROC_REF(delete_link_visual)) + ) + +/obj/item/mod/control/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) + if(!multitool_check_buffer(user, tool)) + return + var/tool_frequency = null + if(istype(tool.buffer, /datum/mod_link)) + var/datum/mod_link/buffer_link = tool.buffer + tool_frequency = buffer_link.frequency + balloon_alert(user, "frequency set") + if(!tool_frequency && mod_link.frequency) + tool.buffer = mod_link + balloon_alert(user, "frequency copied") + else if(tool_frequency && !mod_link.frequency) + mod_link.frequency = tool_frequency + else if(tool_frequency && mod_link.frequency) + var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) + if(!user.is_holding(tool)) + return + switch(response) + if("Copy") + tool.buffer = mod_link + balloon_alert(user, "frequency copied") + if("Imprint") + mod_link.frequency = tool_frequency + balloon_alert(user, "frequency set") + +/obj/item/mod/control/proc/can_call() + return get_charge() && wearer && wearer.stat < DEAD + +/obj/item/mod/control/proc/make_link_visual() + return make_link_visual_generic(mod_link, PROC_REF(on_overlay_change)) + +/obj/item/mod/control/proc/get_link_visual(atom/movable/visuals) + return get_link_visual_generic(mod_link, visuals, PROC_REF(on_wearer_set_dir)) + +/obj/item/mod/control/proc/delete_link_visual() + return delete_link_visual_generic(mod_link) + +/obj/item/mod/control/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range, sound_loc) + . = ..() + if(speaker != wearer && speaker != ai) + return + mod_link.visual.say(raw_message, sanitize = FALSE, range = 2) + +/obj/item/mod/control/proc/on_overlay_change(atom/source, cache_index, overlay) + SIGNAL_HANDLER + addtimer(CALLBACK(src, PROC_REF(update_link_visual)), 1 TICKS, TIMER_UNIQUE) + +/obj/item/mod/control/proc/update_link_visual() + if(QDELETED(mod_link.link_call)) + return + mod_link.visual.cut_overlay(mod_link.visual_overlays) + mod_link.visual_overlays = wearer.overlays + mod_link.visual.add_overlay(mod_link.visual_overlays) + +/obj/item/mod/control/proc/on_wearer_set_dir(atom/source, dir, newdir) + SIGNAL_HANDLER + on_user_set_dir_generic(mod_link, newdir) + +/obj/item/clothing/neck/link_scryer + name = "\improper MODlink scryer" + desc = "An intricate piece of machinery that creates a holographic video call with another MODlink-compatible device. Essentially a video necklace." + icon_state = "modlink" + actions_types = list(/datum/action/item_action/call_link) + /// The installed power cell. + var/obj/item/stock_parts/cell/cell + /// The MODlink datum we operate. + var/datum/mod_link/mod_link + /// Initial frequency of the MODlink. + var/starting_frequency + /// An additional name tag for the scryer, seen as "MODlink scryer - [label]" + var/label + +/obj/item/clothing/neck/link_scryer/Initialize(mapload) + . = ..() + mod_link = new( + src, + starting_frequency, + CALLBACK(src, PROC_REF(get_user)), + CALLBACK(src, PROC_REF(can_call)), + CALLBACK(src, PROC_REF(make_link_visual)), + CALLBACK(src, PROC_REF(get_link_visual)), + CALLBACK(src, PROC_REF(delete_link_visual)) + ) + START_PROCESSING(SSobj, src) + +/obj/item/clothing/neck/link_scryer/Destroy() + QDEL_NULL(cell) + QDEL_NULL(mod_link) + STOP_PROCESSING(SSobj, src) + return ..() + +/obj/item/clothing/neck/link_scryer/examine(mob/user) + . = ..() + if(cell) + . += span_notice("The battery charge reads [cell.percent()]%. Right-click with an empty hand to remove it.") + else + . += span_notice("It is missing a battery, one can be installed by clicking with a power cell on it.") + . += span_notice("The MODlink ID is [mod_link.id], frequency is [mod_link.frequency || "unset"]. Right-click with multitool to copy/imprint frequency.") + . += span_notice("Use in hand to set name.") + +/obj/item/clothing/neck/link_scryer/equipped(mob/living/user, slot) + . = ..() + if(slot != ITEM_SLOT_NECK) + mod_link?.end_call() + +/obj/item/clothing/neck/link_scryer/dropped(mob/living/user) + . = ..() + mod_link?.end_call() + +/obj/item/clothing/neck/link_scryer/attack_self(mob/user, modifiers) + var/new_label = reject_bad_text(tgui_input_text(user, "Change the visible name", "Set Name", label, MAX_NAME_LEN)) + if(!new_label) + balloon_alert(user, "invalid name!") + return + label = new_label + balloon_alert(user, "name set") + update_name() + +/obj/item/clothing/neck/link_scryer/process(delta_time) + if(!mod_link.link_call) + return + cell.use(min(20 * delta_time, cell.charge)) + +/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, params) + . = ..() + if(cell || !istype(attacked_by, /obj/item/stock_parts/cell)) + return + if(!user.transferItemToLoc(attacked_by, src)) + return + cell = attacked_by + balloon_alert(user, "installed [cell.name]") + +/obj/item/clothing/neck/link_scryer/update_name(updates) + . = ..() + name = "[initial(name)][label ? " - [label]" : ""]" + +/obj/item/clothing/neck/link_scryer/Exited(atom/movable/gone, direction) + . = ..() + if(gone == cell) + cell = null + +/obj/item/clothing/neck/link_scryer/attack_hand_secondary(mob/user, list/modifiers) + if(!cell) + return SECONDARY_ATTACK_CONTINUE_CHAIN + balloon_alert(user, "removed [cell.name]") + user.put_in_hands(cell) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/clothing/neck/link_scryer/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) + if(!multitool_check_buffer(user, tool)) + return + var/tool_frequency = null + if(istype(tool.buffer, /datum/mod_link)) + var/datum/mod_link/buffer_link = tool.buffer + tool_frequency = buffer_link.frequency + balloon_alert(user, "frequency set") + if(!tool_frequency && mod_link.frequency) + tool.buffer = mod_link + balloon_alert(user, "frequency copied") + else if(tool_frequency && !mod_link.frequency) + mod_link.frequency = tool_frequency + else if(tool_frequency && mod_link.frequency) + var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) + if(!user.is_holding(tool)) + return + switch(response) + if("Copy") + tool.buffer = mod_link + balloon_alert(user, "frequency copied") + if("Imprint") + mod_link.frequency = tool_frequency + balloon_alert(user, "frequency set") + +/obj/item/clothing/neck/link_scryer/worn_overlays(mutable_appearance/standing, isinhands) + . = ..() + if(!QDELETED(mod_link.link_call)) + . += mutable_appearance('icons/mob/clothing/neck.dmi', "modlink_active") + +/obj/item/clothing/neck/link_scryer/ui_action_click(mob/user) + if(mod_link.link_call) + mod_link.end_call() + else + call_link(user, mod_link) + +/obj/item/clothing/neck/link_scryer/proc/get_user() + var/mob/living/carbon/user = loc + return istype(user) && user.wear_neck == src ? user : null + +/obj/item/clothing/neck/link_scryer/proc/can_call() + var/mob/living/user = loc + return istype(user) && cell?.charge && user.stat < DEAD + +/obj/item/clothing/neck/link_scryer/proc/make_link_visual() + var/mob/living/user = mod_link.get_user_callback.Invoke() + user.update_worn_neck() + return make_link_visual_generic(mod_link, PROC_REF(on_overlay_change)) + +/obj/item/clothing/neck/link_scryer/proc/get_link_visual(atom/movable/visuals) + return get_link_visual_generic(mod_link, visuals, PROC_REF(on_user_set_dir)) + +/obj/item/clothing/neck/link_scryer/proc/delete_link_visual() + var/mob/living/user = mod_link.get_user_callback.Invoke() + if(!QDELETED(user)) + user.update_worn_neck() + return delete_link_visual_generic(mod_link) + +/obj/item/clothing/neck/link_scryer/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, message_range, sound_loc) + . = ..() + if(speaker != loc) + return + mod_link.visual.say(raw_message, sanitize = FALSE, range = 3) + +/obj/item/clothing/neck/link_scryer/proc/on_overlay_change(atom/source, cache_index, overlay) + SIGNAL_HANDLER + addtimer(CALLBACK(src, PROC_REF(update_link_visual)), 1 TICKS, TIMER_UNIQUE) + +/obj/item/clothing/neck/link_scryer/proc/update_link_visual() + if(QDELETED(mod_link.link_call)) + return + var/mob/living/user = loc + mod_link.visual.cut_overlay(mod_link.visual_overlays) + mod_link.visual_overlays = user.overlays + mod_link.visual.add_overlay(mod_link.visual_overlays) + +/obj/item/clothing/neck/link_scryer/proc/on_user_set_dir(atom/source, dir, newdir) + SIGNAL_HANDLER + on_user_set_dir_generic(mod_link, newdir) + +/obj/item/clothing/neck/link_scryer/loaded + starting_frequency = "NT" + +/obj/item/clothing/neck/link_scryer/loaded/Initialize(mapload) + . = ..() + cell = new /obj/item/stock_parts/cell/high(src) + +/obj/item/clothing/neck/link_scryer/loaded/charlie + starting_frequency = MODLINK_FREQ_CHARLIE + +/// A MODlink datum, used to handle unique functions that will be used in the MODlink call. +/datum/mod_link + /// Generic name for multitool buffers. + var/name = "MODlink" + /// The frequency of the MODlink. You can only call other MODlinks on the same frequency. + var/frequency + /// The unique ID of the MODlink. + var/id = "" + /// The atom that holds the MODlink. + var/atom/movable/holder + /// A reference to the visuals generated by the MODlink. + var/atom/movable/visual + /// A list of all overlays of the user, copied everytime they have an overlay change. + var/list/visual_overlays = list() + /// A reference to the call between two MODlinks. + var/datum/mod_link_call/link_call + /// A callback that returns the user of the MODlink. + var/datum/callback/get_user_callback + /// A callback that returns whether the MODlink can currently call. + var/datum/callback/can_call_callback + /// A callback that returns the visuals of the MODlink. + var/datum/callback/make_visual_callback + /// A callback that receives the visuals of the other MODlink. + var/datum/callback/get_visual_callback + /// A callback that deletes the visuals of the MODlink. + var/datum/callback/delete_visual_callback + +/datum/mod_link/New( + atom/holder, + frequency, + datum/callback/get_user_callback, + datum/callback/can_call_callback, + datum/callback/make_visual_callback, + datum/callback/get_visual_callback, + datum/callback/delete_visual_callback +) + var/attempts = 0 + var/digits_to_make = 3 + do + if(attempts == 10) + attempts = 0 + digits_to_make++ + id = "" + for(var/i in 1 to digits_to_make) + id += num2text(rand(0,9)) + attempts++ + while(GLOB.mod_link_ids[id]) + GLOB.mod_link_ids[id] = src + src.frequency = frequency + src.holder = holder + src.get_user_callback = get_user_callback + src.can_call_callback = can_call_callback + src.make_visual_callback = make_visual_callback + src.get_visual_callback = get_visual_callback + src.delete_visual_callback = delete_visual_callback + RegisterSignal(holder, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_delete)) + +/datum/mod_link/Destroy() + GLOB.mod_link_ids -= id + if(link_call) + end_call() + get_user_callback = null + make_visual_callback = null + get_visual_callback = null + delete_visual_callback = null + return ..() + +/datum/mod_link/proc/get_other() + RETURN_TYPE(/datum/mod_link) + if(!link_call) + return + return link_call.caller == src ? link_call.receiver : link_call.caller + +/datum/mod_link/proc/call_link(datum/mod_link/called, mob/user) + if(!frequency) + return + if(!istype(called)) + holder.balloon_alert(user, "invalid target!") + return + var/mob/living/link_user = get_user_callback.Invoke() + if(!link_user) + return + if(HAS_TRAIT(link_user, TRAIT_IN_CALL)) + holder.balloon_alert(user, "user already in call!") + return + var/mob/living/link_target = called.get_user_callback.Invoke() + if(!link_target) + holder.balloon_alert(user, "invalid target!") + return + if(HAS_TRAIT(link_target, TRAIT_IN_CALL)) + holder.balloon_alert(user, "target already in call!") + return + if(!can_call_callback.Invoke() || !called.can_call_callback.Invoke()) + holder.balloon_alert(user, "can't call!") + return + link_target.playsound_local(get_turf(called.holder), 'sound/weapons/ring.ogg', 15, vary = TRUE) + var/atom/movable/screen/alert/modlink_call/alert = link_target.throw_alert("[REF(src)]_modlink", /atom/movable/screen/alert/modlink_call) + alert.desc = "[holder] ([id]) is calling you! Left-click this to accept the call. Right-click to deny it." + alert.caller_ref = WEAKREF(src) + alert.receiver_ref = WEAKREF(called) + alert.user_ref = WEAKREF(user) + +/datum/mod_link/proc/end_call() + QDEL_NULL(link_call) + +/datum/mod_link/proc/on_holder_delete(atom/source) + SIGNAL_HANDLER + qdel(src) + +/// A MODlink call datum, used to handle the call between two MODlinks. +/datum/mod_link_call + /// The MODlink that is calling. + var/datum/mod_link/caller + /// The MODlink that is being called. + var/datum/mod_link/receiver + +/datum/mod_link_call/New(datum/mod_link/caller, datum/mod_link/receiver) + caller.link_call = src + receiver.link_call = src + src.caller = caller + src.receiver = receiver + var/mob/living/caller_mob = caller.get_user_callback.Invoke() + ADD_TRAIT(caller_mob, TRAIT_IN_CALL, REF(src)) + var/mob/living/receiver_mob = receiver.get_user_callback.Invoke() + ADD_TRAIT(receiver_mob, TRAIT_IN_CALL, REF(src)) + make_visuals() + START_PROCESSING(SSprocessing, src) + +/datum/mod_link_call/Destroy() + var/mob/living/caller_mob = caller.get_user_callback.Invoke() + if(!QDELETED(caller_mob)) + REMOVE_TRAIT(caller_mob, TRAIT_IN_CALL, REF(src)) + var/mob/living/receiver_mob = receiver.get_user_callback.Invoke() + if(!QDELETED(receiver_mob)) + REMOVE_TRAIT(receiver_mob, TRAIT_IN_CALL, REF(src)) + STOP_PROCESSING(SSprocessing, src) + clear_visuals() + caller.link_call = null + receiver.link_call = null + return ..() + +/datum/mod_link_call/process(seconds_per_tick) + if(can_continue_call()) + return + qdel(src) + +/datum/mod_link_call/proc/can_continue_call() + return caller.frequency == receiver.frequency && caller.can_call_callback.Invoke() && receiver.can_call_callback.Invoke() + +/datum/mod_link_call/proc/make_visuals() + var/caller_visual = caller.make_visual_callback.Invoke() + var/receiver_visual = receiver.make_visual_callback.Invoke() + caller.get_visual_callback.Invoke(receiver_visual) + receiver.get_visual_callback.Invoke(caller_visual) + +/datum/mod_link_call/proc/clear_visuals() + caller.delete_visual_callback.Invoke() + receiver.delete_visual_callback.Invoke() + +/proc/call_link(mob/user, datum/mod_link/calling_link) + if(!calling_link.frequency) + return + var/list/callers = list() + for(var/id in GLOB.mod_link_ids) + var/datum/mod_link/link = GLOB.mod_link_ids[id] + if(link.frequency != calling_link.frequency) + continue + if(link == calling_link) + continue + if(!link.can_call_callback.Invoke()) + continue + callers["[link.holder] ([id])"] = id + if(!length(callers)) + calling_link.holder.balloon_alert(user, "no targets on freq [calling_link.frequency]!") + return + var/chosen_link = tgui_input_list(user, "Choose ID to call from [calling_link.frequency] frequency", "MODlink", callers) + if(!chosen_link) + return + calling_link.call_link(GLOB.mod_link_ids[callers[chosen_link]], user) + +/atom/movable/screen/alert/modlink_call + name = "MODlink Call Incoming" + desc = "Someone is calling you! Left-click this to accept the call. Right-click to deny it." + icon_state = "called" + timeout = 10 SECONDS + var/end_message = "call timed out!" + /// A weak reference to the MODlink that is calling. + var/datum/weakref/caller_ref + /// A weak reference to the MODlink that is being called. + var/datum/weakref/receiver_ref + /// A weak reference to the mob that is calling. + var/datum/weakref/user_ref + +/atom/movable/screen/alert/modlink_call/Click(location, control, params) + . = ..() + if(usr != owner) + return + var/datum/mod_link/caller = caller_ref.resolve() + var/datum/mod_link/receiver = receiver_ref.resolve() + if(!caller || !receiver) + return + if(caller.link_call || receiver.link_call) + return + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + end_message = "call denied!" + owner.clear_alert("[REF(caller)]_modlink") + return + end_message = "call accepted" + new /datum/mod_link_call(caller, receiver) + owner.clear_alert("[REF(caller)]_modlink") + +/atom/movable/screen/alert/modlink_call/Destroy() + var/mob/living/user = user_ref?.resolve() + var/datum/mod_link/caller = caller_ref?.resolve() + if(!user || !caller) + return ..() + caller.holder.balloon_alert(user, end_message) + return ..() diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm index 7696eea0e458..d4663986bbed 100644 --- a/code/modules/mod/mod_paint.dm +++ b/code/modules/mod/mod_paint.dm @@ -138,17 +138,20 @@ SStgui.close_uis(src) /obj/item/mod/paint/proc/paint_skin(obj/item/mod/control/mod, mob/user) - if(length(mod.theme.skins) <= 1) + if(length(mod.theme.variants) <= 1) balloon_alert(user, "no alternate skins!") return + var/list/skins = list() - for(var/mod_skin in mod.theme.skins) + for(var/mod_skin in mod.theme.variants) skins[mod_skin] = image(icon = mod.icon, icon_state = "[mod_skin]-control") + var/pick = show_radial_menu(user, mod, skins, custom_check = CALLBACK(src, PROC_REF(check_menu), mod, user), require_near = TRUE) if(!pick) balloon_alert(user, "no skin picked!") return - mod.set_mod_skin(pick) + + mod.theme.set_skin(mod, pick) /obj/item/mod/paint/proc/check_menu(obj/item/mod/control/mod, mob/user) if(user.incapacitated() || !user.is_holding(src) || !mod || mod.active || mod.activating) @@ -168,7 +171,6 @@ icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' icon_state = "skinapplier" var/skin = "civilian" - var/compatible_theme = /datum/mod_theme /obj/item/mod/skin_applier/Initialize(mapload) . = ..() @@ -177,18 +179,20 @@ /obj/item/mod/skin_applier/pre_attack(atom/attacked_atom, mob/living/user, params) if(!istype(attacked_atom, /obj/item/mod/control)) return ..() + var/obj/item/mod/control/mod = attacked_atom if(mod.active || mod.activating) balloon_alert(user, "suit is active!") return TRUE - if(!istype(mod.theme, compatible_theme)) + + if(!(skin in mod.theme.variants)) balloon_alert(user, "incompatible theme!") return TRUE - mod.set_mod_skin(skin) + + mod.theme.set_skin(mod, skin) balloon_alert(user, "skin applied") qdel(src) return TRUE /obj/item/mod/skin_applier/honkerative skin = "honkerative" - compatible_theme = /datum/mod_theme/syndicate diff --git a/code/modules/mod/mod_part.dm b/code/modules/mod/mod_part.dm new file mode 100644 index 000000000000..88f8024628dc --- /dev/null +++ b/code/modules/mod/mod_part.dm @@ -0,0 +1,22 @@ +/// Datum to handle interactions between a MODsuit and its parts. +/datum/mod_part + /// The actual item we handle. + var/obj/item/part_item = null + /// Are we sealed? + var/sealed = FALSE + /// Message to user when unsealed. + var/unsealed_message + /// Message to user when sealed. + var/sealed_message + /// The layer the item will render on when unsealed. + var/unsealed_layer + /// The layer the item will render on when sealed. + var/sealed_layer + /// Can our part overslot over others? + var/can_overslot = FALSE + /// What are we overslotting over? + var/obj/item/overslotting = null + +/datum/mod_part/Destroy() + part_item = null + return ..() diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index e4a374466fe7..2affea270fc6 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -19,10 +19,12 @@ armor plating being installed by default, and their actuators only lead to slightly greater speed than industrial suits." /// Default skin of the MOD. var/default_skin = "standard" + /// The slot this mod theme fits on + var/slot_flags = ITEM_SLOT_BACK /// Armor shared across the MOD parts. - var/armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 5) + var/armor = list(BLUNT = 30, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 30, BIO = 100, FIRE = 100, ACID = 70) /// Resistance flags shared across the MOD parts. - var/resistance_flags = NONE + var/resistance_flags = FIRE_PROOF /// Atom flags shared across the MOD parts. var/atom_flags = NONE /// Max heat protection shared across the MOD parts. @@ -38,9 +40,11 @@ /// How much battery power the MOD uses by just being on var/charge_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. - var/slowdown_inactive = 1.25 + var/slowdown_inactive = 0 /// Slowdown of the MOD when active. - var/slowdown_active = 0.75 + var/slowdown_active = 0 + /// How long this MOD takes each part to seal. + var/activation_step_time = MOD_ACTIVATION_STEP_TIME /// Theme used by the MOD TGUI. var/ui_theme = "ntos" /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. @@ -52,58 +56,167 @@ /obj/item/flashlight, /obj/item/tank/internals, ) - /// List of skins with their appropriate clothing flags. - var/list/skins = list( + /// List of variants and items created by them, with the flags we set. + var/list/variants = list( "standard" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), "civilian" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|HEADINTERNALS, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) +#ifdef UNIT_TESTS +/datum/mod_theme/New() + var/list/skin_parts = list() + for(var/variant in variants) + if(!ispath(variant)) + continue + skin_parts += list(assoc_to_keys(variants[variant])) + + for(var/skin in skin_parts) + for(var/compared_skin in skin_parts) + if(skin ~! compared_skin) + stack_trace("[type] variants [skin] and [compared_skin] aren't made of the same parts.") + skin_parts -= skin +#endif + +/// Create parts of the suit and modify them using the theme's variables. +/datum/mod_theme/proc/set_up_parts(obj/item/mod/control/mod, skin) + var/list/parts = list(mod) + mod.slot_flags = slot_flags + mod.extended_desc = extended_desc + mod.slowdown_inactive = slowdown_inactive + mod.slowdown_active = slowdown_active + mod.activation_step_time = activation_step_time + mod.complexity_max = complexity_max + mod.ui_theme = ui_theme + mod.charge_drain = charge_drain + + var/datum/mod_part/control_part_datum = new() + control_part_datum.part_item = mod + mod.mod_parts["[mod.slot_flags]"] = control_part_datum + for(var/path in variants[default_skin]) + var/obj/item/mod_part = new path(mod) + if(mod_part.slot_flags == ITEM_SLOT_OCLOTHING && isclothing(mod_part)) + var/obj/item/clothing/chestplate = mod_part + chestplate.allowed |= allowed_suit_storage + var/datum/mod_part/part_datum = new() + part_datum.part_item = mod_part + mod.mod_parts["[mod_part.slot_flags]"] = part_datum + parts += mod_part + + for(var/obj/item/part as anything in parts) + part.name = "[name] [part.name]" + part.desc = "[part.desc] [desc]" + part.setArmor(getArmor(armor)) + part.resistance_flags = resistance_flags + part.flags_1 |= atom_flags //flags like initialization or admin spawning are here, so we cant set, have to add + part.heat_protection = NONE + part.cold_protection = NONE + part.max_heat_protection_temperature = max_heat_protection_temperature + part.min_cold_protection_temperature = min_cold_protection_temperature + part.siemens_coefficient = siemens_coefficient + + set_skin(mod, skin || default_skin) + +/datum/mod_theme/proc/set_skin(obj/item/mod/control/mod, skin) + mod.skin = skin + var/list/used_skin = variants[skin] + var/list/parts = mod.get_parts() + + for(var/obj/item/clothing/part as anything in parts) + var/list/category = used_skin[part.type] + var/datum/mod_part/part_datum = mod.get_part_datum(part) + + part_datum.unsealed_layer = category[UNSEALED_LAYER] + part_datum.sealed_layer = category[SEALED_LAYER] + part_datum.unsealed_message = category[UNSEALED_MESSAGE] || "No unseal message set! Tell a coder!" + part_datum.sealed_message = category[SEALED_MESSAGE] || "No seal message set! Tell a coder!" + part_datum.can_overslot = category[CAN_OVERSLOT] || FALSE + part.clothing_flags = category[UNSEALED_CLOTHING] || NONE + part.visor_flags = category[SEALED_CLOTHING] || NONE + part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE + part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE + part.flags_cover = category[UNSEALED_COVER] || NONE + part.visor_flags_cover = category[SEALED_COVER] || NONE + + if(mod.get_part_datum(part).sealed) + part.clothing_flags |= part.visor_flags + part.flags_inv |= part.visor_flags_inv + part.flags_cover |= part.visor_flags_cover + part.alternate_worn_layer = part_datum.sealed_layer + else + part.alternate_worn_layer = part_datum.unsealed_layer + + if(!part_datum.can_overslot && part_datum.overslotting) + var/obj/item/overslot = part_datum.overslotting + overslot.forceMove(mod.drop_location()) + + for(var/obj/item/part as anything in parts + mod) + part.icon = used_skin[MOD_ICON_OVERRIDE] || 'icons/obj/clothing/modsuit/mod_clothing.dmi' + part.worn_icon = used_skin[MOD_WORN_ICON_OVERRIDE] || 'icons/mob/clothing/modsuit/mod_clothing.dmi' + part.icon_state = "[skin]-[part.base_icon_state][mod.get_part_datum(part).sealed ? "-sealed" : ""]" + mod.wearer?.update_clothing(part.slot_flags) + /datum/mod_theme/engineering name = "engineering" desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." @@ -113,42 +226,48 @@ a shock-resistant outer layer, making the suit nigh-invulnerable against even the extremes of high-voltage electricity. \ However, the capacity for modification remains the same as civilian-grade suits." default_skin = "engineering" - armor = list(MELEE = 10, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10) + armor = list(BLUNT = 30, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 60, BIO = 100, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 1.5 - slowdown_active = 1 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, /obj/item/construction/rcd, /obj/item/storage/bag/construction, ) - skins = list( + variants = list( "engineering" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -162,11 +281,9 @@ corrosive gasses and liquids, useful in the world of pipes. \ However, the capacity for modification remains the same as civilian-grade suits." default_skin = "atmospheric" - armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + armor = list(BLUNT = 10, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - slowdown_inactive = 1.5 - slowdown_active = 1 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -174,31 +291,39 @@ /obj/item/t_scanner, /obj/item/pipe_dispenser, ) - skins = list( + variants = list( "atmospheric" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR, UNSEALED_COVER = HEADCOVERSMOUTH, SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -212,12 +337,10 @@ The paint used is almost entirely immune to corrosives, and certainly looks damn fine. \ These come pre-installed with magnetic boots, using an advanced system to toggle them on or off as the user walks." default_skin = "advanced" - armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 15, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(BLUNT = 30, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 30, BIO = 100, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 1 - slowdown_active = 0.5 inbuilt_modules = list(/obj/item/mod/module/magboot/advanced) allowed_suit_storage = list( /obj/item/flashlight, @@ -227,32 +350,39 @@ /obj/item/pipe_dispenser, /obj/item/construction/rcd, /obj/item/storage/bag/construction, - /obj/item/melee/baton/telescopic, ) - skins = list( + variants = list( "advanced" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -278,7 +408,7 @@ so much so that it comes default fueled by equally-enigmatic plasma fuel rather than a simple recharge. \ Additionally, the systems have been put to near their maximum load, allowing for far less customization than others." default_skin = "mining" - armor = list(MELEE = 15, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 30, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) + armor = list(BLUNT = 30, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 30, BIO = 100, FIRE = 100, ACID = 70) resistance_flags = FIRE_PROOF|LAVA_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT @@ -291,60 +421,75 @@ /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/pickaxe, - /obj/item/kinetic_crusher, /obj/item/stack/ore/plasma, /obj/item/storage/bag/ore, ) - inbuilt_modules = list(/obj/item/mod/module/ash_accretion, /obj/item/mod/module/sphere_transform) - skins = list( + inbuilt_modules = list() + variants = list( "mining" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), "asteroid" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -362,14 +507,13 @@ the user being able to run at greater speeds for much longer distances and times than an unsuited equivalent. \ A lot of people would say loading cargo is a dull job. You could not disagree more." default_skin = "loader" - armor = list(MELEE = 15, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 10, BIO = 10, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(BLUNT = 15, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 10, BIO = 10, FIRE = 25, ACID = 25) max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT permeability_coefficient = 0.5 siemens_coefficient = 0.25 + resistance_flags = NONE complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 0.5 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -379,25 +523,33 @@ /obj/item/storage/bag/mail, ) inbuilt_modules = list(/obj/item/mod/module/hydraulic, /obj/item/mod/module/clamp/loader, /obj/item/mod/module/magnet) - skins = list( + variants = list( "loader" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( SEALED_CLOTHING = THICKMATERIAL, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -412,10 +564,8 @@ it is incredibly acid-resistant. It is slightly more demanding of power than civilian-grade models, \ and weak against fingers tapping the glass." default_skin = "medical" - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 5) + armor = list(BLUNT = 15, PUNCTURE = 10, SLASH = 0, LASER = 25, ENERGY = 10, BOMB = 30, BIO = 100, FIRE = 100, ACID = 70) charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 - slowdown_inactive = 1 - slowdown_active = 0.5 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -432,55 +582,71 @@ /obj/item/storage/bag/chemistry, /obj/item/storage/bag/bio, ) - skins = list( + variants = list( "medical" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), "corpsman" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -495,12 +661,10 @@ all while being entirely immune against chemical and thermal threats. \ It is slightly more demanding of power than civilian-grade models, and weak against fingers tapping the glass." default_skin = "rescue" - armor = list(MELEE = 10, BULLET = 10, LASER = 5, ENERGY = 5, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 5) + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) allowed_suit_storage = list( /obj/item/flashlight, @@ -517,32 +681,39 @@ /obj/item/storage/pill_bottle, /obj/item/storage/bag/chemistry, /obj/item/storage/bag/bio, - /obj/item/melee/baton/telescopic, ) - skins = list( + variants = list( "rescue" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -558,12 +729,11 @@ missiles and artillery, all the explosive resistance is mostly working to keep the user intact, \ not alive. The user will also find narrow doorframes nigh-impossible to surmount." default_skin = "research" - armor = list(MELEE = 20, BULLET = 15, LASER = 5, ENERGY = 5, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 20, PUNCTURE = 15, SLASH = 0, LASER = 5, ENERGY = 5, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - slowdown_inactive = 1.75 slowdown_active = 1.25 inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced) allowed_suit_storage = list( @@ -571,33 +741,39 @@ /obj/item/tank/internals, /obj/item/analyzer, /obj/item/dnainjector, - /obj/item/biopsy_tool, /obj/item/storage/bag/bio, - /obj/item/melee/baton/telescopic, ) - skins = list( + variants = list( "research" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -614,11 +790,9 @@ However, the systems used in these suits are more than a few years out of date, \ leading to an overall lower capacity for modules." default_skin = "security" - armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 25, BIO = 100, FIRE = 75, ACID = 75, WOUND = 15) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 20, ENERGY = 15, BOMB = 45, BIO = 100, FIRE = 100, ACID = 75) siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 1 - slowdown_active = 0.5 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -629,31 +803,39 @@ /obj/item/assembly/flash, /obj/item/melee/baton, ) - skins = list( + variants = list( "security" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, UNSEALED_COVER = HEADCOVERSMOUTH, SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -668,13 +850,11 @@ Heatsinks line the sides of the suit, and greater technology has been used in insulating it against \ both corrosive environments and sudden impacts to the user's joints." default_skin = "safeguard" - armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 40, BIO = 100, FIRE = 100, ACID = 95, WOUND = 15) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 15, ENERGY = 15, BOMB = 40, BIO = 100, FIRE = 100, ACID = 95) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -685,29 +865,37 @@ /obj/item/assembly/flash, /obj/item/melee/baton, ) - skins = list( + variants = list( "safeguard" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -725,14 +913,12 @@ and bluespace processing to allow for a wide array of onboard modules to be supported, and only the best actuators \ have been employed for speed. The resemblance to a Gorlex Marauder helmet is purely coincidental." default_skin = "magnate" - armor = list(MELEE = 20, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 15, ENERGY = 15, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -742,30 +928,38 @@ /obj/item/assembly/flash, /obj/item/melee/baton, ) - skins = list( + variants = list( "magnate" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -779,10 +973,9 @@ this particular model does not employ manganese bipolar capacitor cleaners, thank the Honkmother. \ All you know is that this suit is mysteriously power-efficient, and far too colorful for the Mime to steal." default_skin = "cosmohonk" - armor = list(MELEE = 5, BULLET = 5, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30) + resistance_flags = NONE charge_drain = DEFAULT_CHARGE_DRAIN * 0.25 - slowdown_inactive = 1.75 - slowdown_active = 1.25 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -792,36 +985,44 @@ /obj/item/reagent_containers/spray/waterflower, /obj/item/instrument, ) - skins = list( + variants = list( "cosmohonk" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) /datum/mod_theme/syndicate - name = "syndicate" + name = "crimson" desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." extended_desc = "An advanced combat suit adorned in a sinister crimson red color scheme, produced and manufactured \ for special mercenary operations. The build is a streamlined layering consisting of shaped Plasteel, \ @@ -831,12 +1032,10 @@ A small tag hangs off of it reading; 'Property of the Gorlex Marauders, with assistance from Cybersun Industries. \ All rights reserved, tampering with suit will void warranty." default_skin = "syndicate" - armor = list(MELEE = 15, BULLET = 20, LASER = 15, ENERGY = 15, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + armor = list(BLUNT = 15, PUNCTURE = 20, SLASH = 0, LASER = 15, ENERGY = 15, BOMB = 35, BIO = 100, FIRE = 100, ACID = 90) atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 1 - slowdown_active = 0.5 ui_theme = "syndicate" inbuilt_modules = list(/obj/item/mod/module/armor_booster) allowed_suit_storage = list( @@ -850,55 +1049,71 @@ /obj/item/melee/energy/sword, /obj/item/shield/energy, ) - skins = list( + variants = list( "syndicate" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), "honkerative" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -913,13 +1128,11 @@ 'Property of the Gorlex Marauders, with assistance from Cybersun Industries. \ All rights reserved, tampering with suit will void life expectancy.'" default_skin = "elite" - armor = list(MELEE = 35, BULLET = 30, LASER = 35, ENERGY = 35, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(BLUNT = 35, PUNCTURE = 30, SLASH = 0, LASER = 35, ENERGY = 35, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 1 - slowdown_active = 0.5 ui_theme = "syndicate" inbuilt_modules = list(/obj/item/mod/module/armor_booster) allowed_suit_storage = list( @@ -933,30 +1146,38 @@ /obj/item/melee/energy/sword, /obj/item/shield/energy, ) - skins = list( + variants = list( "elite" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -972,13 +1193,11 @@ default means of power. The hood and platform boots are of unknown usage, but it's speculated that \ wizards trend towards the dramatic." default_skin = "enchanted" - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 - slowdown_inactive = 0.75 - slowdown_active = 0.25 ui_theme = "wizard" inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) allowed_suit_storage = list( @@ -988,29 +1207,37 @@ /obj/item/highfrequencyblade/wizard, /obj/item/gun/magic, ) - skins = list( + variants = list( "enchanted" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|CASTING_CLOTHES, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, + /obj/item/clothing/suit/mod = list( + UNSEALED_CLOTHING = THICKMATERIAL|CASTING_CLOTHES, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1026,14 +1253,14 @@ The internal heads-up display is rendered in nearly unreadable cyan, as the visor suggests, \ leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." default_skin = "prototype" - armor = list(MELEE = 20, BULLET = 5, LASER = 10, ENERGY = 10, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) + armor = list(BLUNT = 20, PUNCTURE = 5, SLASH = 0, LASER = 10, ENERGY = 10, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75) resistance_flags = FIRE_PROOF complexity_max = DEFAULT_MAX_COMPLEXITY + 5 charge_drain = DEFAULT_CHARGE_DRAIN * 2 slowdown_inactive = 2 slowdown_active = 1.5 ui_theme = "hackerman" - inbuilt_modules = list(/obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype) + inbuilt_modules = list(/obj/item/mod/module/anomaly_locked/kinesis/prototype) allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -1042,29 +1269,37 @@ /obj/item/pipe_dispenser, /obj/item/construction/rcd, ) - skins = list( + variants = list( "prototype" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1078,13 +1313,11 @@ it keeps the wearer safe from the harsh void of space while sacrificing no speed whatsoever. \ While wearing it you feel an extreme deference to darkness. " default_skin = "responsory" - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90) atom_flags = PREVENT_CONTENTS_EXPLOSION_1 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -1094,54 +1327,70 @@ /obj/item/assembly/flash, /obj/item/melee/baton, ) - skins = list( + variants = list( "responsory" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), "inquisitory" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1156,7 +1405,7 @@ Whether the wearer uses it or not is up to them. \ There seems to be a little inscription on the wrist that reads; \'squiddie', d'aww." default_skin = "apocryphal" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(BLUNT = 80, PUNCTURE = 80, SLASH = 0, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -1173,30 +1422,38 @@ /obj/item/melee/energy/sword, /obj/item/shield/energy, ) - skins = list( + variants = list( "apocryphal" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1210,13 +1467,11 @@ counted as a war-crime and reason for immediate execution in over fifty Nanotrasen space stations. \ The resemblance to a Gorlex Marauder helmet is purely coincidental." default_skin = "corporate" - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 50, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -1226,30 +1481,38 @@ /obj/item/assembly/flash, /obj/item/melee/baton, ) - skins = list( + variants = list( "corporate" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1262,41 +1525,47 @@ and sometimes hilariously painful side effects of jumping timelines, while providing inbuilt equipment for \ making timeline adjustments to correct a bad course." default_skin = "chrono" - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(BLUNT = 60, PUNCTURE = 60, SLASH = 0, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY - 10 - slowdown_inactive = 0 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, /obj/item/restraints/handcuffs, ) - skins = list( + variants = list( "chrono" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = NECK_LAYER, UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1308,44 +1577,50 @@ Contains an internal self-recharging high-current capacitor for short, powerful bo- \ Oh wait, this is not actually a flight suit. Fuck." default_skin = "debug" - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) + armor = list(BLUNT = 50, PUNCTURE = 50, SLASH = 0, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = FIRE_PROOF|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = 50 siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun, ) - skins = list( + variants = list( "debug" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT|HEADINTERNALS, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, UNSEALED_COVER = HEADCOVERSMOUTH, SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) @@ -1358,96 +1633,47 @@ have all the fun. If this continues to be a pattern for your \"events\" (Admin Abuse) \ there will be an admin complaint. You have been warned." default_skin = "debug" - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100) resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT complexity_max = 1000 charge_drain = DEFAULT_CHARGE_DRAIN * 0 siemens_coefficient = 0 - slowdown_inactive = 0 - slowdown_active = 0 allowed_suit_storage = list( /obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun, ) - skins = list( + variants = list( "debug" = list( - HELMET_FLAGS = list( + /obj/item/clothing/head/mod = list( UNSEALED_LAYER = null, UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - CHESTPLATE_FLAGS = list( + /obj/item/clothing/suit/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN, SEALED_INVISIBILITY = HIDEJUMPSUIT, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - GAUNTLETS_FLAGS = list( + /obj/item/clothing/gloves/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), - BOOTS_FLAGS = list( + /obj/item/clothing/shoes/mod = list( UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, CAN_OVERSLOT = TRUE, + UNSEALED_MESSAGE = HELMET_UNSEAL_MESSAGE, + SEALED_MESSAGE = HELMET_SEAL_MESSAGE, ), ), ) -/datum/mod_theme/contractor - name = "contractor" - desc = "A top-tier MODSuit developed with cooperation of Cybersun Industries and the Gorlex Marauders, a favorite of Syndicate Contractors." - extended_desc = "A rare depart from the Syndicate's usual color scheme, the Contractor MODsuit is produced and manufactured \ - for specialty contractors. The build is a streamlined layering consisting of shaped Plastitanium, \ - and composite ceramic, while the under suit is lined with a lightweight Kevlar and durathread hybrid weave \ - to provide ample protection to the user where the plating doesn't, with an illegal onboard electric powered \ - ablative shield module to provide resistance against conventional energy firearms. \ - In addition, it has an in-built chameleon system, allowing you to disguise the suit while undeployed. \ - A small tag hangs off of it reading: 'Property of the Gorlex Marauders, with assistance from Cybersun Industries. \ - All rights reserved, tampering with suit will void warranty." - default_skin = "contractor" - armor = list(MELEE = 30, BULLET = 40, LASER = 20, ENERGY = 30, BOMB = 30, BIO = 30, FIRE = 80, ACID = 85, WOUND = 30) - atom_flags = PREVENT_CONTENTS_EXPLOSION_1 - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - siemens_coefficient = 0 - slowdown_inactive = 0.5 - slowdown_active = 0 - ui_theme = "syndicate" - inbuilt_modules = list(/obj/item/mod/module/armor_booster/contractor, /obj/item/mod/module/chameleon) - allowed_suit_storage = list( - /obj/item/flashlight, - /obj/item/tank/internals, - /obj/item/ammo_box, - /obj/item/ammo_casing, - /obj/item/restraints/handcuffs, - /obj/item/assembly/flash, - /obj/item/melee/baton, - /obj/item/melee/energy/sword, - /obj/item/shield/energy, - ) - skins = list( - "contractor" = list( - HELMET_LAYER = NECK_LAYER, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, - SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index a68562bab991..2b2325b117ec 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -1,4 +1,5 @@ /obj/item/mod/control/pre_equipped + starting_frequency = MODLINK_FREQ_NANOTRASEN /// The skin we apply to the suit, defaults to the default_skin of the theme. var/applied_skin /// The MOD core we apply to the suit. @@ -16,7 +17,6 @@ /obj/item/mod/control/pre_equipped/standard initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, ) @@ -24,7 +24,6 @@ /obj/item/mod/control/pre_equipped/engineering theme = /datum/mod_theme/engineering initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, @@ -34,7 +33,6 @@ /obj/item/mod/control/pre_equipped/atmospheric theme = /datum/mod_theme/atmospheric initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, @@ -45,7 +43,6 @@ theme = /datum/mod_theme/advanced applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( - /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, @@ -65,7 +62,6 @@ theme = /datum/mod_theme/mining applied_core = /obj/item/mod/core/plasma initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/gps, /obj/item/mod/module/orebag, /obj/item/mod/module/clamp, @@ -75,7 +71,6 @@ /obj/item/mod/control/pre_equipped/medical theme = /datum/mod_theme/medical initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/quick_carry, @@ -85,7 +80,6 @@ theme = /datum/mod_theme/rescue applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( - /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector, @@ -95,7 +89,6 @@ theme = /datum/mod_theme/research applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( - /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, @@ -105,7 +98,6 @@ /obj/item/mod/control/pre_equipped/security theme = /datum/mod_theme/security initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/pepper_shoulders, @@ -115,7 +107,6 @@ theme = /datum/mod_theme/safeguard applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( - /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, @@ -126,7 +117,6 @@ theme = /datum/mod_theme/magnate applied_cell = /obj/item/stock_parts/cell/hyper initial_modules = list( - /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/hat_stabilizer, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, @@ -136,13 +126,13 @@ /obj/item/mod/control/pre_equipped/cosmohonk theme = /datum/mod_theme/cosmohonk initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/waddle, /obj/item/mod/module/bikehorn, ) /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/syndicate, @@ -155,6 +145,7 @@ /obj/item/mod/control/pre_equipped/traitor_elite theme = /datum/mod_theme/elite + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/bluespace initial_modules = list( /obj/item/mod/module/storage/syndicate, @@ -167,6 +158,7 @@ /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_SYNDICATE) initial_modules = list( @@ -178,6 +170,7 @@ /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite + starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_SYNDICATE) initial_modules = list( @@ -201,6 +194,7 @@ /obj/item/mod/control/pre_equipped/enchanted theme = /datum/mod_theme/enchanted + starting_frequency = null applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/storage/large_capacity, @@ -210,9 +204,9 @@ /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype + starting_frequency = MODLINK_FREQ_CHARLIE req_access = list(ACCESS_AWAY_GENERAL) initial_modules = list( - /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, @@ -221,6 +215,7 @@ /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory + starting_frequency = MODLINK_FREQ_CENTCOM applied_cell = /obj/item/stock_parts/cell/hyper req_access = list(ACCESS_CENT_GENERAL) initial_modules = list( @@ -297,6 +292,7 @@ /obj/item/mod/control/pre_equipped/apocryphal theme = /datum/mod_theme/apocryphal + starting_frequency = MODLINK_FREQ_CENTCOM applied_cell = /obj/item/stock_parts/cell/bluespace req_access = list(ACCESS_CENT_SPECOPS) initial_modules = list( @@ -309,6 +305,7 @@ /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate + starting_frequency = MODLINK_FREQ_CENTCOM applied_core = /obj/item/mod/core/infinite req_access = list(ACCESS_CENT_SPECOPS) initial_modules = list( @@ -319,6 +316,7 @@ /obj/item/mod/control/pre_equipped/chrono theme = /datum/mod_theme/chrono + starting_frequency = null applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/eradication_lock, @@ -327,10 +325,12 @@ /obj/item/mod/module/timestopper, /obj/item/mod/module/rewinder, /obj/item/mod/module/tem, + /obj/item/mod/module/anomaly_locked/kinesis/plus, ) /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug + starting_frequency = null applied_core = /obj/item/mod/core/infinite initial_modules = list( //one of every type of module, for testing if they all work correctly /obj/item/mod/module/storage/bluespace, @@ -344,6 +344,7 @@ /obj/item/mod/control/pre_equipped/administrative theme = /datum/mod_theme/administrative + starting_frequency = MODLINK_FREQ_CENTCOM applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/storage/bluespace, @@ -352,43 +353,12 @@ /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack, - ) - -/obj/item/mod/control/pre_equipped/contractor - theme = /datum/mod_theme/contractor - applied_cell = /obj/item/stock_parts/cell/hyper - initial_modules = list( - /obj/item/mod/module/storage/syndicate, - /obj/item/mod/module/tether, - /obj/item/mod/module/flashlight, - /obj/item/mod/module/dna_lock, - /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/emp_shield, - ) - -/obj/item/mod/control/pre_equipped/contractor/upgraded - applied_cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/storage/syndicate, - /obj/item/mod/module/jetpack, - /obj/item/mod/module/dna_lock, - /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/baton_holster/preloaded, - /obj/item/mod/module/emp_shield, - ) - -/obj/item/mod/control/pre_equipped/contractor/upgraded/adminbus - initial_modules = list( - /obj/item/mod/module/storage/syndicate, - /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/springlock/contractor/no_complexity, - /obj/item/mod/module/baton_holster/preloaded, - /obj/item/mod/module/scorpion_hook, - /obj/item/mod/module/emp_shield, + /obj/item/mod/module/anomaly_locked/kinesis/admin, ) //these exist for the prefs menu /obj/item/mod/control/pre_equipped/syndicate_empty + starting_frequency = null theme = /datum/mod_theme/syndicate /obj/item/mod/control/pre_equipped/syndicate_empty/honkerative @@ -397,7 +367,4 @@ /obj/item/mod/control/pre_equipped/syndicate_empty/elite theme = /datum/mod_theme/elite -/obj/item/mod/control/pre_equipped/syndicate_empty/contractor - theme = /datum/mod_theme/contractor - INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 9d70bef64d61..64735a624280 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -13,6 +13,8 @@ data["locked"] = locked data["complexity"] = complexity data["selected_module"] = selected_module?.name + data["link_id"] = mod_link.id + data["link_call"] = mod_link.get_other()?.id data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" data["AI"] = ai?.name @@ -45,10 +47,13 @@ data["ui_theme"] = ui_theme data["control"] = name data["complexity_max"] = complexity_max - data["helmet"] = helmet?.name - data["chestplate"] = chestplate?.name - data["gauntlets"] = gauntlets?.name - data["boots"] = boots?.name + var/part_info = list() + for(var/obj/item/part as anything in get_parts()) + part_info += list(list( + "slot" = english_list(parse_slot_flags(part.slot_flags)), + "name" = part.name, + )) + data["parts"] = part_info return data /obj/item/mod/control/ui_act(action, params) @@ -66,6 +71,11 @@ if("lock") locked = !locked balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") + if("call") + if(!mod_link.link_call) + call_link(usr, mod_link) + else + mod_link.end_call() if("activate") toggle_activate(usr) if("select") diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index b9bec6c6c5df..a57e43c94e14 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -43,11 +43,14 @@ var/list/pinned_to = list() /// If we're allowed to use this module while phased out. var/allowed_in_phaseout = FALSE + /// A list of slots required in the suit to work. Formatted like list(x|y, z, ...) where either x or y are required and z is required. + var/list/required_slots = list() /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) /// If this module can be used while the suit is inactive var/allowed_inactive = FALSE + /obj/item/mod/module/Initialize(mapload) . = ..() if(module_type != MODULE_ACTIVE) @@ -70,6 +73,35 @@ if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) . += span_notice("Complexity level: [complexity]") + if(length(required_slots)) + var/list/slot_strings = list() + for(var/slot in required_slots) + var/list/slot_list = parse_slot_flags(slot) + slot_strings += (length(slot_list) == 1 ? "" : "one of ") + english_list(slot_list, and_text = " or ") + . += span_notice("Requires the MOD unit to have the following slots: [english_list(slot_strings)]") + +/// Looks through the MODsuit's parts to see if it has the parts required to support this module +/obj/item/mod/module/proc/has_required_parts(list/parts, need_extended = FALSE) + if(!length(required_slots)) + return TRUE + + var/total_slot_flags = NONE + for(var/part_slot in parts) + if(need_extended) + var/datum/mod_part/part_datum = parts[part_slot] + if(part_datum.part_item.loc == mod) + continue + + total_slot_flags |= text2num(part_slot) + + var/list/needed_slots = required_slots.Copy() + for(var/needed_slot in needed_slots) + if(!(needed_slot & total_slot_flags)) + break + needed_slots -= needed_slot + + return !length(needed_slots) + /// Called from MODsuit's install() proc, so when the module is installed. /obj/item/mod/module/proc/on_install() return @@ -96,37 +128,50 @@ /// Called when the module is selected from the TGUI, radial or the action button /obj/item/mod/module/proc/on_select() + if(!mod.wearer) + if(ismob(mod.loc)) + balloon_alert(mod.loc, "not equipped!") + return + if(!allowed_inactive && (!mod.active || mod.activating || module_type == MODULE_PASSIVE)) if(mod.wearer) balloon_alert(mod.wearer, "not active!") return + if(module_type != MODULE_USABLE) if(active) - on_deactivation() + deactivate() else - on_activation() + activate() else - on_use() + used() + SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) /// Called when the module is activated -/obj/item/mod/module/proc/on_activation() +/obj/item/mod/module/proc/activate() if(!COOLDOWN_FINISHED(src, cooldown_timer)) balloon_alert(mod.wearer, "on cooldown!") return FALSE + if(!allowed_inactive && (!mod.active || mod.activating || !mod.get_charge())) balloon_alert(mod.wearer, "unpowered!") return FALSE + if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) //specifically a to_chat because the user is phased out. to_chat(mod.wearer, span_warning("You cannot activate this right now.")) return FALSE + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE + if(module_type == MODULE_ACTIVE) - if(mod.selected_module && !mod.selected_module.on_deactivation(display_message = FALSE)) + if(mod.selected_module && !mod.selected_module.deactivate(display_message = FALSE)) return FALSE + mod.selected_module = src + if(device) if(mod.wearer.put_in_hands(device)) balloon_alert(mod.wearer, "[device] extended") @@ -140,19 +185,23 @@ var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK update_signal(used_button) balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + active = TRUE COOLDOWN_START(src, cooldown_timer, cooldown_time) mod.wearer.update_worn_back() SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED) + on_activation() return TRUE /// Called when the module is deactivated -/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/proc/deactivate(display_message = TRUE, deleting = FALSE) active = FALSE + if(module_type == MODULE_ACTIVE) mod.selected_module = null if(display_message) balloon_alert(mod.wearer, device ? "[device] retracted" : "[src] deactivated") + if(device) mod.wearer.transferItemToLoc(device, src, force = TRUE) UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) @@ -160,36 +209,47 @@ else UnregisterSignal(mod.wearer, used_signal) used_signal = null + mod.wearer.update_worn_back() SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED) + on_deactivation(display_message = TRUE, deleting = FALSE) return TRUE /// Called when the module is used -/obj/item/mod/module/proc/on_use() +/obj/item/mod/module/proc/used() if(!COOLDOWN_FINISHED(src, cooldown_timer)) balloon_alert(mod.wearer, "on cooldown!") return FALSE + if(!check_power(use_power_cost)) balloon_alert(mod.wearer, "not enough charge!") return FALSE + if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) //specifically a to_chat because the user is phased out. to_chat(mod.wearer, span_warning("You cannot activate this right now.")) return FALSE + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE + COOLDOWN_START(src, cooldown_timer, cooldown_time) addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_worn_back)), cooldown_time+1) //need to run it a bit after the cooldown starts to avoid conflicts + mod.wearer.update_worn_back() + SEND_SIGNAL(src, COMSIG_MODULE_USED) + on_use() return TRUE /// Called when an activated module without a device is used /obj/item/mod/module/proc/on_select_use(atom/target) if(mod.wearer.incapacitated(IGNORE_GRAB)) return FALSE + mod.wearer.face_atom(target) - if(!on_use()) + + if(!used()) return FALSE return TRUE @@ -203,13 +263,26 @@ /obj/item/mod/module/proc/on_process(delta_time) if(active) if(!drain_power(active_power_cost * delta_time)) - on_deactivation() + deactivate() return FALSE on_active_process(delta_time) + else drain_power(idle_power_cost * delta_time) return TRUE +/// Called from the module's activate() +/obj/item/mod/module/proc/on_activation() + return + +/// Called from the module's deactivate() +/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE) + return + +/// Called from the module's used() +/obj/item/mod/module/proc/on_use() + return + /// Called on the MODsuit's process if it is an active module /obj/item/mod/module/proc/on_active_process(delta_time) return @@ -255,7 +328,7 @@ if(part.loc == mod.wearer) return if(part == device) - on_deactivation(display_message = FALSE) + deactivate(display_message = FALSE) /// Called when the device gets deleted on active modules /obj/item/mod/module/proc/on_device_deletion(datum/source) @@ -309,7 +382,7 @@ if(user.get_active_held_item() != device) return - on_deactivation() + deactivate() return COMSIG_KB_ACTIVATED ///Anomaly Locked - Causes the module to not function without an anomaly. diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 8a8278999964..fe4a5c46145d 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -15,14 +15,24 @@ overlay_state_inactive = "module_kinesis" overlay_state_active = "module_kinesis_on" accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) + required_slots = list(ITEM_SLOT_GLOVES) + /// Range of the knesis grab. var/grab_range = 5 + /// Time between us hitting objects with kinesis. var/hit_cooldown_time = 1 SECONDS - var/movement_animation + /// Stat required for us to grab a mob. + var/stat_required = DEAD + /// Atom we grabbed with kinesis. var/atom/movable/grabbed_atom + /// Ref of the beam following the grabbed atom. var/datum/beam/kinesis_beam + /// Overlay we add to each grabbed atom. var/mutable_appearance/kinesis_icon - var/atom/movable/screen/fullscreen/kinesis/kinesis_catcher + /// Our mouse movement catcher. + var/atom/movable/screen/fullscreen/cursor_catcher/kinesis/kinesis_catcher + /// The sounds playing while we grabbed an object. var/datum/looping_sound/gravgen/kinesis/soundloop + /// The cooldown between us hitting objects with kinesis. COOLDOWN_DECLARE(hit_cooldown) /obj/item/mod/module/anomaly_locked/kinesis/Initialize(mapload) @@ -30,12 +40,6 @@ soundloop = new(src) /obj/item/mod/module/anomaly_locked/kinesis/Destroy() - if(grabbed_atom) - kinesis_catcher = null - mod.wearer.clear_fullscreen("kinesis") - grabbed_atom.cut_overlay(kinesis_icon) - QDEL_NULL(kinesis_beam) - grabbed_atom.animate_movement = movement_animation QDEL_NULL(soundloop) return ..() @@ -43,9 +47,12 @@ . = ..() if(!.) return + if(!mod.wearer.client) + return if(grabbed_atom) - launch() + var/launched_object = grabbed_atom clear_grab(playsound = FALSE) + launch(launched_object) return if(!range_check(target)) balloon_alert(mod.wearer, "too far!") @@ -54,22 +61,9 @@ balloon_alert(mod.wearer, "can't grab!") return drain_power(use_power_cost) - grabbed_atom = target - playsound(grabbed_atom, 'sound/effects/contractorbatonhit.ogg', 75, TRUE) - START_PROCESSING(SSfastprocess, src) - kinesis_icon = mutable_appearance(icon='icons/effects/effects.dmi', icon_state="kinesis", layer=grabbed_atom.layer-0.1) - kinesis_icon.appearance_flags = RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM - grabbed_atom.add_overlay(kinesis_icon) - kinesis_beam = mod.wearer.Beam(grabbed_atom, "kinesis") - kinesis_catcher = mod.wearer.overlay_fullscreen("kinesis", /atom/movable/screen/fullscreen/kinesis, 0) - kinesis_catcher.kinesis_user = mod.wearer - kinesis_catcher.RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/atom/movable/screen/fullscreen/kinesis, on_move)) - soundloop.start() + grab_atom(target) /obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return clear_grab(playsound = !deleting) /obj/item/mod/module/anomaly_locked/kinesis/process(delta_time) @@ -80,11 +74,12 @@ balloon_alert(mod.wearer, "out of range!") clear_grab() return + drain_power(use_power_cost/10) + if(kinesis_catcher.mouse_params) + kinesis_catcher.calculate_params() if(!kinesis_catcher.given_turf) return - drain_power(use_power_cost/10) mod.wearer.setDir(get_dir(mod.wearer, grabbed_atom)) - grabbed_atom.set_glide_size() if(grabbed_atom.loc == kinesis_catcher.given_turf) if(grabbed_atom.pixel_x == kinesis_catcher.given_x - world.icon_size/2 && grabbed_atom.pixel_y == kinesis_catcher.given_y - world.icon_size/2) return //spare us redrawing if we are standing still @@ -94,13 +89,13 @@ animate(grabbed_atom, 0.2 SECONDS, pixel_x = grabbed_atom.base_pixel_x + kinesis_catcher.given_x - world.icon_size/2, pixel_y = grabbed_atom.base_pixel_y + kinesis_catcher.given_y - world.icon_size/2) kinesis_beam.redrawing() var/turf/next_turf = get_step_towards(grabbed_atom, kinesis_catcher.given_turf) - if(grabbed_atom.Move(next_turf)) + if(grabbed_atom.Move(next_turf, get_dir(grabbed_atom, next_turf), 8)) if(isitem(grabbed_atom) && (mod.wearer in next_turf)) var/obj/item/grabbed_item = grabbed_atom clear_grab() - grabbed_item.pickup(mod.wearer) - mod.wearer.put_in_hands(grabbed_item) + mod.wearer.pickup_item(grabbed_item) return + var/pixel_x_change = 0 var/pixel_y_change = 0 var/direction = get_dir(grabbed_atom, next_turf) @@ -137,13 +132,17 @@ var/atom/movable/movable_target = target if(movable_target.anchored) return FALSE + if(movable_target.throwing) + return FALSE if(movable_target.move_resist >= MOVE_FORCE_OVERPOWERING) return FALSE if(ismob(movable_target)) if(!isliving(movable_target)) return FALSE var/mob/living/living_target = movable_target - if(living_target.stat != DEAD) + if(living_target.buckled) + return FALSE + if(living_target.stat < stat_required) return FALSE else if(isitem(movable_target)) var/obj/item/item_target = movable_target @@ -153,16 +152,43 @@ return FALSE return TRUE +/obj/item/mod/module/anomaly_locked/kinesis/proc/grab_atom(atom/movable/target) + grabbed_atom = target + if(isliving(grabbed_atom)) + ADD_TRAIT(grabbed_atom, TRAIT_IMMOBILIZED, REF(src)) + ADD_TRAIT(grabbed_atom, TRAIT_HANDS_BLOCKED, REF(src)) + RegisterSignal(grabbed_atom, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) + ADD_TRAIT(grabbed_atom, TRAIT_NO_FLOATING_ANIM, REF(src)) + RegisterSignal(grabbed_atom, COMSIG_MOVABLE_SET_ANCHORED, PROC_REF(on_setanchored)) + playsound(grabbed_atom, 'sound/effects/contractorbatonhit.ogg', 75, TRUE) + kinesis_icon = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "kinesis", layer = grabbed_atom.layer - 0.1) + kinesis_icon.appearance_flags = RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM + kinesis_icon.overlays += emissive_appearance(icon = 'icons/effects/effects.dmi', icon_state = "kinesis") + grabbed_atom.add_overlay(kinesis_icon) + kinesis_beam = mod.wearer.Beam(grabbed_atom, "kinesis") + kinesis_catcher = mod.wearer.overlay_fullscreen("kinesis", /atom/movable/screen/fullscreen/cursor_catcher/kinesis, 0) + kinesis_catcher.assign_to_mob(mod.wearer) + RegisterSignal(kinesis_catcher, COMSIG_CLICK, PROC_REF(on_catcher_click)) + soundloop.start() + START_PROCESSING(SSkinesis, src) + /obj/item/mod/module/anomaly_locked/kinesis/proc/clear_grab(playsound = TRUE) if(!grabbed_atom) return + . = grabbed_atom if(playsound) playsound(grabbed_atom, 'sound/effects/empulse.ogg', 75, TRUE) - STOP_PROCESSING(SSfastprocess, src) + STOP_PROCESSING(SSkinesis, src) kinesis_catcher = null mod.wearer.clear_fullscreen("kinesis") grabbed_atom.cut_overlay(kinesis_icon) QDEL_NULL(kinesis_beam) + if(isliving(grabbed_atom)) + REMOVE_TRAIT(grabbed_atom, TRAIT_IMMOBILIZED, REF(src)) + REMOVE_TRAIT(grabbed_atom, TRAIT_HANDS_BLOCKED, REF(src)) + UnregisterSignal(grabbed_atom, COMSIG_MOB_STATCHANGE) + REMOVE_TRAIT(grabbed_atom, TRAIT_NO_FLOATING_ANIM, REF(src)) + UnregisterSignal(grabbed_atom, COMSIG_MOVABLE_SET_ANCHORED) if(!isitem(grabbed_atom)) animate(grabbed_atom, 0.2 SECONDS, pixel_x = grabbed_atom.base_pixel_x, pixel_y = grabbed_atom.base_pixel_y) grabbed_atom = null @@ -177,11 +203,31 @@ return FALSE return TRUE -/obj/item/mod/module/anomaly_locked/kinesis/proc/launch() - playsound(grabbed_atom, 'sound/magic/repulse.ogg', 100, TRUE) - RegisterSignal(grabbed_atom, COMSIG_MOVABLE_IMPACT, PROC_REF(launch_impact)) - var/turf/target_turf = get_turf_in_angle(get_angle(mod.wearer, grabbed_atom), get_turf(src), 10) - grabbed_atom.throw_at(target_turf, range = grab_range, speed = grabbed_atom.density ? 3 : 4, thrower = mod.wearer, spin = isitem(grabbed_atom)) + +/obj/item/mod/module/anomaly_locked/kinesis/proc/on_catcher_click(atom/source, location, control, params, user) + SIGNAL_HANDLER + + var/list/modifiers = params2list(params) + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + clear_grab() + +/obj/item/mod/module/anomaly_locked/kinesis/proc/on_statchange(mob/grabbed_mob, new_stat) + SIGNAL_HANDLER + + if(new_stat < stat_required) + clear_grab() + +/obj/item/mod/module/anomaly_locked/kinesis/proc/on_setanchored(atom/movable/grabbed_atom, anchorvalue) + SIGNAL_HANDLER + + if(grabbed_atom.anchored) + clear_grab() + +/obj/item/mod/module/anomaly_locked/kinesis/proc/launch(atom/movable/launched_object) + playsound(launched_object, 'sound/magic/repulse.ogg', 100, TRUE) + RegisterSignal(launched_object, COMSIG_MOVABLE_IMPACT, PROC_REF(launch_impact)) + var/turf/target_turf = get_turf_in_angle(get_angle(mod.wearer, launched_object), get_turf(src), 10) + launched_object.throw_at(target_turf, range = grab_range, speed = launched_object.density ? 3 : 4, thrower = mod.wearer, spin = isitem(launched_object)) /obj/item/mod/module/anomaly_locked/kinesis/proc/launch_impact(atom/movable/source, atom/hit_atom, datum/thrownthing/thrownthing) UnregisterSignal(source, COMSIG_MOVABLE_IMPACT) @@ -196,58 +242,92 @@ var/mob/living/living_atom = hit_atom living_atom.apply_damage(damage, BRUTE) else if(hit_atom.uses_integrity) - hit_atom.take_damage(damage, BRUTE, MELEE) + hit_atom.take_damage(damage, BRUTE, BLUNT) if(damage_self && source.uses_integrity) - source.take_damage(source.max_integrity/5, BRUTE, MELEE) + source.take_damage(source.max_integrity/5, BRUTE, BLUNT) + +/atom/movable/screen/fullscreen/cursor_catcher/kinesis + icon_state = "kinesis" /obj/item/mod/module/anomaly_locked/kinesis/prebuilt prebuilt = TRUE -/obj/item/mod/module/anomaly_locked/kinesis/prebuilt/prototype +/obj/item/mod/module/anomaly_locked/kinesis/prototype name = "MOD prototype kinesis module" + prebuilt = TRUE complexity = 0 use_power_cost = DEFAULT_CHARGE_DRAIN * 5 removable = FALSE -/atom/movable/screen/fullscreen/kinesis - icon_state = "kinesis" - plane = HUD_PLANE - mouse_opacity = MOUSE_OPACITY_ICON - var/mob/kinesis_user - var/given_x = 16 - var/given_y = 16 - var/turf/given_turf - COOLDOWN_DECLARE(coordinate_cooldown) - -/atom/movable/screen/fullscreen/kinesis/proc/on_move(atom/source, atom/oldloc, dir, forced) - SIGNAL_HANDLER +/obj/item/mod/module/anomaly_locked/kinesis/plus + name = "MOD kinesis+ module" + desc = "A modular plug-in to the forearm, this module was recently redeveloped in secret. \ + The bane of all ne'er-do-wells, the kinesis+ module is a powerful tool that allows the user \ + to manipulate the world around them. Like it's older counterpart, it's capable of manipulating \ + structures, machinery, vehicles, and, thanks to the fruitful efforts of its creators - living beings." + complexity = 0 + prebuilt = TRUE + stat_required = CONSCIOUS - if(given_turf) - var/x_offset = source.loc.x - oldloc.x - var/y_offset = source.loc.y - oldloc.y - given_turf = locate(given_turf.x+x_offset, given_turf.y+y_offset, given_turf.z) +/// Admin suit version of kinesis. Can grab anything at any range, may enable phasing through walls. +/obj/item/mod/module/anomaly_locked/kinesis/admin + name = "MOD kinesis++ module" + desc = "A modular plug-in to the forearm, this module was recently reredeveloped in super secret. \ + This one can force some of the grasped objects to phase through walls. Oh no." + complexity = 0 + grab_range = INFINITY + use_power_cost = DEFAULT_CHARGE_DRAIN * 0 + prebuilt = TRUE + stat_required = CONSCIOUS + /// Does our object phase through stuff? + var/phasing = FALSE -/atom/movable/screen/fullscreen/kinesis/MouseEntered(location, control, params) +/obj/item/mod/module/anomaly_locked/kinesis/admin/grab_atom(atom/movable/target) . = ..() - MouseMove(location, control, params) + if(phasing) + ADD_TRAIT(grabbed_atom, TRAIT_MOVE_PHASING, REF(src)) -/atom/movable/screen/fullscreen/kinesis/MouseMove(location, control, params) - if(!kinesis_user?.client || usr != kinesis_user) - return - if(!COOLDOWN_FINISHED(src, coordinate_cooldown)) +/obj/item/mod/module/anomaly_locked/kinesis/admin/clear_grab(playsound) + . = ..() + if(!.) return - COOLDOWN_START(src, coordinate_cooldown, 0.2 SECONDS) - var/list/modifiers = params2list(params) - var/icon_x = text2num(LAZYACCESS(modifiers, ICON_X)) - var/icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) - var/list/view = getviewsize(kinesis_user.client.view) - icon_x *= view[1]/FULLSCREEN_OVERLAY_RESOLUTION_X - icon_y *= view[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y - var/our_x = round(icon_x / world.icon_size) - var/our_y = round(icon_y / world.icon_size) - var/mob_x = kinesis_user.x - var/mob_y = kinesis_user.y - var/mob_z = kinesis_user.z - given_turf = locate(mob_x+our_x-round(view[1]/2),mob_y+our_y-round(view[2]/2),mob_z) - given_x = round(icon_x - world.icon_size * our_x) - given_y = round(icon_y - world.icon_size * our_y) + var/atom/movable/previous_grab = . + if(phasing) + REMOVE_TRAIT(previous_grab, TRAIT_MOVE_PHASING, REF(src)) + +/obj/item/mod/module/anomaly_locked/kinesis/admin/can_grab(atom/target) + if(mod.wearer == target) + return FALSE + if(!ismovable(target)) + return FALSE + var/atom/movable/movable_target = target + if(movable_target.throwing) + return FALSE + return TRUE + +/obj/item/mod/module/anomaly_locked/kinesis/admin/range_check(atom/target) + if(!isturf(mod.wearer.loc)) + return FALSE + if(ismovable(target) && !isturf(target.loc)) + return FALSE + if(target.z != mod.wearer.z) + return FALSE + return TRUE + +/obj/item/mod/module/anomaly_locked/kinesis/admin/on_setanchored(atom/movable/grabbed_atom, anchorvalue) + return //thog dont care + +/obj/item/mod/module/anomaly_locked/kinesis/admin/get_configuration() + . = ..() + .["phasing"] = add_ui_configuration("Phasing", "bool", phasing) + +/obj/item/mod/module/anomaly_locked/kinesis/admin/configure_edit(key, value) + switch(key) + if("phasing") + phasing = value + if(!grabbed_atom) + return + if(phasing) + ADD_TRAIT(grabbed_atom, TRAIT_MOVE_PHASING, REF(src)) + else + REMOVE_TRAIT(grabbed_atom, TRAIT_MOVE_PHASING, REF(src)) diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 630ee82a3148..de8b642ddf3e 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -1,6 +1,6 @@ ///Pathfinder - Can fly the suit from a long distance to an implant installed in someone. /obj/item/mod/module/pathfinder - name = "MOD pathfinder module" + name = "\improper MOD recall module" desc = "This module, brought to you by Nakamura Engineering, has two components. \ The first component is a series of thrusters and a computerized location subroutine installed into the \ very control unit of the suit, allowing it flight at highway speeds, \ @@ -13,6 +13,7 @@ complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) + required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) /// The pathfinding implant. var/obj/item/implant/mod/implant @@ -21,9 +22,19 @@ implant = new(src) /obj/item/mod/module/pathfinder/Destroy() - implant = null + QDEL_NULL(implant) return ..() +/obj/item/mod/module/pathfinder/Exited(atom/movable/gone, direction) + if(gone == implant) + implant = null + update_icon_state() + return ..() + +/obj/item/mod/module/pathfinder/update_icon_state() + . = ..() + icon_state = implant ? "pathfinder" : "pathfinder_empty" + /obj/item/mod/module/pathfinder/examine(mob/user) . = ..() if(implant) @@ -35,18 +46,17 @@ if(!ishuman(target) || !implant) return if(!do_after(user, target, 1.5 SECONDS)) - balloon_alert(user, "interrupted!") return - if(!implant.implant(target, user)) - balloon_alert(user, "can't implant!") + + var/implant_cache = implant // implant() will make implant null + if(!implant.implant(target, user, deprecise_zone(user.zone_selected))) return + if(target == user) - to_chat(user, span_notice("You implant yourself with [implant].")) + to_chat(user, span_notice("You implant yourself with [implant_cache].")) else - target.visible_message(span_notice("[user] implants [target]."), span_notice("[user] implants you with [implant].")) + target.visible_message(span_notice("[user] implants [target]."), span_notice("[user] implants you with [implant_cache].")) playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) - icon_state = "pathfinder_empty" - implant = null /obj/item/mod/module/pathfinder/proc/attach(mob/living/user) if(!ishuman(user)) @@ -56,16 +66,18 @@ return if(!human_user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) return + mod.quick_deploy(user) human_user.update_action_buttons(TRUE) - balloon_alert(human_user, "[mod] attached") playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) drain_power(use_power_cost) /obj/item/implant/mod - name = "MOD pathfinder implant" + name = "\improper MOD recall implant" desc = "Lets you recall a MODsuit to you at any time." actions_types = list(/datum/action/item_action/mod_recall) + implant_flags = IMPLANT_KNOWN + /// The pathfinder module we are linked to. var/obj/item/mod/module/pathfinder/module /// The jet icon we apply to the MOD. @@ -81,6 +93,7 @@ /obj/item/implant/mod/Destroy() if(module?.mod?.ai_controller) end_recall(successful = FALSE) + module = null jet_icon = null return ..() @@ -91,22 +104,44 @@ Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
"} return dat -/obj/item/implant/mod/proc/recall() +/obj/item/implant/mod/proc/recall(mob/user) if(!module?.mod) - balloon_alert(imp_in, "no connected suit!") + to_chat(user, span_warning("There is no suit linked to your [src].")) return FALSE + if(module.mod.open) - balloon_alert(imp_in, "suit is open!") + to_chat(user, span_warning("Unable to recall MOD suit - Maintenance hatch open.")) return FALSE + if(module.mod.ai_controller) - balloon_alert(imp_in, "already in transit!") - return FALSE - if(ismob(get_atom_on_turf(module.mod))) - balloon_alert(imp_in, "already on someone!") + to_chat(user, span_warning("Unable to recall MOD suit - Already in transit.")) return FALSE + + if(module.z != z || get_dist(imp_in, module.mod) > MOD_AI_RANGE) - balloon_alert(imp_in, "too far away!") + to_chat(user, span_warning("Unable to recall MOD suit - Out of range.")) return FALSE + + if(!isturf(module.mod.loc)) + if(!isliving(module.mod.loc)) + to_chat(user, span_warning("Unable to recall MOD suit - Suit is inside container.")) + return FALSE + + var/mob/living/L = module.mod.loc + if(L.is_holding(module.mod)) + if(L.dropItemToGround(module.mod)) + L.visible_message(span_alert("[module.mod] suddenly activates, flying out from [L]'s grasp!")) + else + to_chat(user, span_warning("Unable to recall MOD suit - Suit is inside container.")) + return FALSE + + else if(L.get_item_by_slot(ITEM_SLOT_BACK)) + to_chat(user, span_warning("Unable to recall MOD suit - Suit is being worn.")) + return FALSE + else + to_chat(user, span_warning("Unable to recall MOD suit - Suit is inside container.")) + return FALSE + var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(module.mod) module.mod.ai_controller = mod_ai mod_ai.current_movement_target = imp_in @@ -118,12 +153,14 @@ animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) module.mod.add_overlay(jet_icon) RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - balloon_alert(imp_in, "suit recalled") + + to_chat(user, "[src] pings, \"MOD suit recalled.\"") return TRUE /obj/item/implant/mod/proc/end_recall(successful = TRUE) if(!module?.mod) return + QDEL_NULL(module.mod.ai_controller) module.mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP REMOVE_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) @@ -132,14 +169,14 @@ module.mod.transform = matrix() UnregisterSignal(module.mod, COMSIG_MOVABLE_MOVED) if(!successful) - balloon_alert(imp_in, "suit lost connection!") + to_chat(imp_in, span_warning("[src] buzzes, \"MOD suit stopped travelling due to obstruction.\"")) /obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) SIGNAL_HANDLER - var/matrix/mod_matrix = matrix() - mod_matrix.Turn(get_angle(source, imp_in)) - source.transform = mod_matrix + var/distance = get_dist(source, imp_in) + if(!(distance %% 20)) + to_chat(imp_in, "[src] pings, \"Suit is [distance] meters away.\"") /datum/action/item_action/mod_recall name = "Recall MOD" @@ -163,7 +200,8 @@ return var/obj/item/implant/mod/implant = target if(!COOLDOWN_FINISHED(src, recall_cooldown)) - implant.balloon_alert(implant.imp_in, "on cooldown!") + to_chat(implant.imp_in, span_warning("[implant] is on cooldown.")) return - if(implant.recall()) + + if(implant.recall(implant.imp_in)) COOLDOWN_START(src, recall_cooldown, 15 SECONDS) diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 4523c3311ea0..c3a17cc493dd 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -21,54 +21,57 @@ /// Slowdown added to the suit. var/added_slowdown = -0.5 /// Armor values added to the suit parts. - var/list/armor_values = list(MELEE = 25, BULLET = 30, LASER = 15, ENERGY = 15) + var/list/armor_values = list(BLUNT = 25, PUNCTURE = 30, LASER = 15, ENERGY = 15) /// List of parts of the suit that are spaceproofed, for giving them back the pressure protection. var/list/spaceproofed = list() /obj/item/mod/module/armor_booster/on_suit_activation() - mod.helmet.flash_protect = FLASH_PROTECTION_WELDER + var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) + if(istype(head_cover)) + head_cover.flash_protect = FLASH_PROTECTION_WELDER /obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE) if(deleting) return - mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + + var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) + if(istype(head_cover)) + head_cover.flash_protect = initial(head_cover.flash_protect) /obj/item/mod/module/armor_booster/on_activation() - . = ..() - if(!.) - return playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) mod.slowdown += added_slowdown mod.wearer.update_equipment_speed_mods() - var/list/parts = mod.mod_parts + mod - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(armor_values)) + + for(var/obj/item/part as anything in mod.get_parts(include_control = TRUE)) + part.setArmor(part.returnArmor().modifyRating(arglist(armor_values))) if(!remove_pressure_protection || !isclothing(part)) continue + var/obj/item/clothing/clothing_part = part if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE spaceproofed[clothing_part] = TRUE /obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return if(!deleting) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + mod.slowdown -= added_slowdown mod.wearer.update_equipment_speed_mods() - var/list/parts = mod.mod_parts + mod var/list/removed_armor = armor_values.Copy() for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(removed_armor)) + + for(var/obj/item/part as anything in mod.get_parts(include_control = TRUE)) + part.setArmor(part.returnArmor().modifyRating(arglist(removed_armor))) if(!remove_pressure_protection || !isclothing(part)) continue + var/obj/item/clothing/clothing_part = part if(spaceproofed[clothing_part]) clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE + spaceproofed = list() /obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) @@ -88,6 +91,7 @@ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/energy_shield) + required_slots = list(ITEM_SLOT_BACK) /// Max charges of the shield. var/max_charges = 3 /// The time it takes for the first charge to recover. @@ -122,8 +126,8 @@ qdel(shield) UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) -/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) - if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_HIT_REACTION_BLOCK) +/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armor_penetration = 0) + if(SEND_SIGNAL(mod, COMSIG_ITEM_CHECK_BLOCK, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_CHECK_BLOCK_BLOCKED) drain_power(use_power_cost) return SHIELD_BLOCK return NONE @@ -143,6 +147,7 @@ shield_icon_file = 'icons/effects/magic.dmi' shield_icon = "mageshield" recharge_path = /obj/item/wizard_armour_charge + required_slots = list() ///Magic Nullifier - Protects you from magic. /obj/item/mod/module/anti_magic @@ -155,6 +160,7 @@ icon_state = "magic_nullifier" removable = FALSE incompatible_modules = list(/obj/item/mod/module/anti_magic) + required_slots = list(ITEM_SLOT_BACK) /obj/item/mod/module/anti_magic/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) @@ -171,6 +177,7 @@ The field will neutralize all magic that comes into contact with the user. \ It will not protect the caster from social ridicule." icon_state = "magic_neutralizer" + required_slots = list() /obj/item/mod/module/anti_magic/wizard/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) @@ -229,6 +236,7 @@ complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 incompatible_modules = list(/obj/item/mod/module/noslip) + required_slots = list(ITEM_SLOT_FEET) /obj/item/mod/module/noslip/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_NO_SLIP_WATER, MOD_TRAIT) @@ -287,47 +295,6 @@ /obj/projectile/bullet/incendiary/backblast/flamethrower range = 6 -/// Baton holster - stops contractors from losing their baton when installed -/obj/item/mod/module/baton_holster - name = "MOD baton holster module" - desc = "A module installed into the chest of a MODSuit, this allows you \ - to retrieve an inserted baton from the suit at will. Insert a baton \ - by hitting the module, while it is removed from the suit, with the baton." - icon_state = "holster" - module_type = MODULE_ACTIVE - complexity = 3 - active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - device = /obj/item/melee/baton/telescopic/contractor_baton - incompatible_modules = list(/obj/item/mod/module/baton_holster) - cooldown_time = 0.5 SECONDS - allowed_inactive = TRUE - /// Have they sacrificed a baton to actually be able to use this? - var/eaten_baton = FALSE - -/obj/item/mod/module/baton_holster/attackby(obj/item/attacking_item, mob/user, params) - . = ..() - if(!istype(attacking_item, /obj/item/melee/baton/telescopic/contractor_baton) || eaten_baton) - return - balloon_alert(user, "[attacking_item] inserted") - eaten_baton = TRUE - for(var/obj/item/melee/baton/telescopic/contractor_baton/device_baton as anything in src) - for(var/obj/item/item_contents as anything in attacking_item) - if(istype(item_contents, /obj/item/baton_upgrade)) - device_baton.add_upgrade(item_contents) - else - item_contents.forceMove(device_baton) - qdel(attacking_item) - -/obj/item/mod/module/baton_holster/on_activation() - if(!eaten_baton) - balloon_alert(mod.wearer, "no baton inserted") - return - return ..() - -/obj/item/mod/module/baton_holster/preloaded - eaten_baton = TRUE - device = /obj/item/melee/baton/telescopic/contractor_baton/upgraded - /// Chameleon - Allows you to disguise your modsuit as another type /obj/item/mod/module/chameleon name = "MOD chameleon module" @@ -367,7 +334,7 @@ balloon_alert(mod.wearer, "parts cannot be deployed to use this!") playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - on_use() + used() SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) /obj/item/mod/module/chameleon/on_use() @@ -455,7 +422,7 @@ /// Contractor armor booster - Slows you down, gives you armor, makes you lose spaceworthiness /obj/item/mod/module/armor_booster/contractor // Much flatter distribution because contractor suit gets a shitton of armor already - armor_values = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20) + armor_values = list(BLUNT = 20, PUNCTURE = 20, LASER = 20, ENERGY = 20) added_slowdown = 0.5 //Bulky as shit desc = "An embedded set of armor plates, allowing the suit's already extremely high protection \ to be increased further. However, the plating, while deployed, will slow down the user \ diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index bcc7410f2cdb..c0b5371662b7 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -10,14 +10,20 @@ complexity = 1 incompatible_modules = list(/obj/item/mod/module/welding) overlay_state_inactive = "module_welding" + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /obj/item/mod/module/welding/on_suit_activation() - mod.helmet.flash_protect = FLASH_PROTECTION_WELDER + var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) + if(istype(head_cover)) + head_cover.flash_protect = FLASH_PROTECTION_WELDER /obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) if(deleting) return - mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + + var/obj/item/clothing/head_cover = mod.get_part_from_slot(ITEM_SLOT_HEAD) || mod.get_part_from_slot(ITEM_SLOT_MASK) || mod.get_part_from_slot(ITEM_SLOT_EYES) + if(istype(head_cover)) + head_cover.flash_protect = initial(head_cover.flash_protect) ///T-Ray Scan - Scans the terrain for undertile objects. /obj/item/mod/module/t_ray @@ -31,6 +37,7 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/t_ray) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /// T-ray scan range. var/range = 2 @@ -50,24 +57,19 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/magboot, /obj/item/mod/module/atrocinator) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_FEET) /// Slowdown added onto the suit. var/slowdown_active = 0.5 /// A list of traits to add to the wearer when we're active (see: Magboots) var/list/active_traits = list(TRAIT_NO_SLIP_WATER, TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE, TRAIT_NEGATES_GRAVITY) /obj/item/mod/module/magboot/on_activation() - . = ..() - if(!.) - return for(var/new_trait in active_traits) ADD_TRAIT(mod.wearer, new_trait, MOD_TRAIT) mod.slowdown += slowdown_active mod.wearer.update_equipment_speed_mods() /obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return for(var/old_trait in active_traits) REMOVE_TRAIT(mod.wearer, old_trait, MOD_TRAIT) mod.slowdown -= slowdown_active @@ -91,8 +93,9 @@ use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/tether) cooldown_time = 1.5 SECONDS + required_slots = list(ITEM_SLOT_GLOVES) -/obj/item/mod/module/tether/on_use() +/obj/item/mod/module/tether/used() if(mod.wearer.has_gravity(get_turf(src))) balloon_alert(mod.wearer, "too much gravity!") playsound(src, 'sound/weapons/gun/general/dry_fire.ogg', 25, TRUE) @@ -125,8 +128,8 @@ /obj/projectile/tether/fire(setAngle) if(firer) - line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi') - ..() + line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi', emissive = FALSE) + return ..() /obj/projectile/tether/on_hit(atom/target) . = ..() @@ -155,14 +158,14 @@ AddComponent(/datum/component/geiger_sound) ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation)) - for(var/obj/item/part in mod.mod_parts) + for(var/obj/item/part in mod.get_parts(include_control = TRUE)) ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) /obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) qdel(GetComponent(/datum/component/geiger_sound)) REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) - for(var/obj/item/part in mod.mod_parts) + for(var/obj/item/part in mod.get_parts(include_control = TRUE)) REMOVE_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) /obj/item/mod/module/rad_protection/add_ui_data() @@ -192,6 +195,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) cooldown_time = 11 SECONDS + required_slots = list(ITEM_SLOT_GLOVES) /obj/item/mod/module/constructor/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) @@ -200,9 +204,6 @@ REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) /obj/item/mod/module/constructor/on_use() - . = ..() - if(!.) - return rcd_scan(src, fade_time = 10 SECONDS) drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 3348a10447c3..d8bc55ec397e 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -8,6 +8,7 @@ icon_state = "storage" complexity = 3 incompatible_modules = list(/obj/item/mod/module/storage) + required_slots = list(ITEM_SLOT_BACK) /// Max weight class of items in the storage. var/max_w_class = WEIGHT_CLASS_NORMAL /// Max combined weight of all items in the storage. @@ -26,19 +27,32 @@ modstorage.set_real_location(src) atom_storage.locked = FALSE + var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING) + if(istype(suit)) + RegisterSignal(suit, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_suit_unequip)) + /obj/item/mod/module/storage/on_uninstall(deleting = FALSE) var/datum/storage/modstorage = mod.atom_storage atom_storage.locked = TRUE qdel(modstorage) if(!deleting) atom_storage.remove_all(get_turf(src)) - UnregisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP) -/obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) - if(QDELETED(source) || newloc == mod.wearer || !mod.wearer.s_store) + var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING) + if(istype(suit)) + UnregisterSignal(suit, COMSIG_ITEM_PRE_UNEQUIP) + +/obj/item/mod/module/storage/proc/on_suit_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) + if(QDELETED(source) || !mod.wearer || newloc == mod.wearer || !mod.wearer.s_store) return - to_chat(mod.wearer, span_notice("[src] tries to store [mod.wearer.s_store] inside itself.")) - atom_storage?.attempt_insert(mod.wearer.s_store, mod.wearer, override = TRUE) + + if(!atom_storage?.attempt_insert(mod.wearer.s_store, mod.wearer, override = TRUE)) + balloon_alert(mod.wearer, "storage failed!") + to_chat(mod.wearer, span_warning("[src] fails to store [mod.wearer.s_store] inside itself!")) + return + + to_chat(mod.wearer, span_notice("[src] stores [mod.wearer.s_store] inside itself.")) + mod.wearer.temporarilyRemoveItemFromInventory(mod.wearer.s_store) /obj/item/mod/module/storage/large_capacity name = "MOD expanded storage module" @@ -81,6 +95,7 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/jetpack) + required_slots = list(ITEM_SLOT_BACK) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_jetpack" overlay_state_active = "module_jetpack_on" @@ -112,14 +127,10 @@ refresh_jetpack() /obj/item/mod/module/jetpack/on_activation() - . = ..() - if(!.) - return if(full_speed) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) /obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() if(full_speed) mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) @@ -160,23 +171,46 @@ icon_state = "apparatus" complexity = 1 incompatible_modules = list(/obj/item/mod/module/mouthhole) + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK) overlay_state_inactive = "module_apparatus" /// Former flags of the helmet. - var/former_flags = NONE + var/former_helmet_flags = NONE /// Former visor flags of the helmet. - var/former_visor_flags = NONE + var/former_visor_helmet_flags = NONE + /// Former flags of the mask. + var/former_mask_flags = NONE + /// Former visor flags of the mask. + var/former_visor_mask_flags = NONE + /obj/item/mod/module/mouthhole/on_install() - former_flags = mod.helmet.flags_cover - former_visor_flags = mod.helmet.visor_flags_cover - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH|PEPPERPROOF + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(istype(helmet)) + former_helmet_flags = helmet.flags_cover + former_visor_helmet_flags = helmet.visor_flags_cover + helmet.flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) + helmet.visor_flags_cover &= ~(HEADCOVERSMOUTH|PEPPERPROOF) + + var/obj/item/clothing/mask = mod.get_part_from_slot(ITEM_SLOT_MASK) + if(istype(mask)) + former_mask_flags = mask.flags_cover + former_visor_mask_flags = mask.visor_flags_cover + mask.flags_cover &= ~(MASKCOVERSMOUTH |PEPPERPROOF) + mask.visor_flags_cover &= ~(MASKCOVERSMOUTH |PEPPERPROOF) /obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) if(deleting) return - mod.helmet.flags_cover |= former_flags - mod.helmet.visor_flags_cover |= former_visor_flags + + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(istype(helmet)) + helmet.flags_cover |= former_helmet_flags + helmet.visor_flags_cover |= former_visor_helmet_flags + + var/obj/item/clothing/mask = mod.get_part_from_slot(ITEM_SLOT_MASK) + if(istype(mask)) + mask.flags_cover |= former_mask_flags + mask.visor_flags_cover |= former_visor_mask_flags ///EMP Shield - Protects the suit from EMPs. /obj/item/mod/module/emp_shield @@ -188,6 +222,7 @@ complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/emp_shield) + required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) /obj/item/mod/module/emp_shield/on_install() mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) @@ -208,11 +243,12 @@ incompatible_modules = list(/obj/item/mod/module/flashlight) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_light" - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_color = COLOR_WHITE light_outer_range = 3 light_power = 1 light_on = FALSE + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK) /// Charge drain per range amount. var/base_power = DEFAULT_CHARGE_DRAIN * 0.1 /// Minimum range we can set. @@ -221,17 +257,11 @@ var/max_range = 5 /obj/item/mod/module/flashlight/on_activation() - . = ..() - if(!.) - return set_light_flags(light_flags | LIGHT_ATTACHED) set_light_on(active) active_power_cost = base_power * light_outer_range /obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return set_light_flags(light_flags & ~LIGHT_ATTACHED) set_light_on(active) @@ -282,18 +312,17 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/dispenser) cooldown_time = 5 SECONDS + required_slots = list(ITEM_SLOT_GLOVES) /// Path we dispense. var/dispense_type = /obj/item/food/burger/plain /// Time it takes for us to dispense. var/dispense_time = 0 SECONDS /obj/item/mod/module/dispenser/on_use() - . = ..() - if(!.) - return if(dispense_time && !do_after(mod.wearer, mod, dispense_time)) balloon_alert(mod.wearer, "interrupted!") return FALSE + var/obj/item/dispensed = new dispense_type(mod.wearer.loc) mod.wearer.put_in_hands(dispensed) balloon_alert(mod.wearer, "[dispensed] dispensed") @@ -311,6 +340,7 @@ complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/longfall) + required_slots = list(ITEM_SLOT_FEET) /obj/item/mod/module/longfall/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) @@ -337,6 +367,7 @@ complexity = 2 active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/thermal_regulator) + required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) cooldown_time = 0.5 SECONDS /// The temperature we are regulating to. var/temperature_setting = BODYTEMP_NORMAL @@ -385,9 +416,6 @@ UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT) /obj/item/mod/module/dna_lock/on_use() - . = ..() - if(!.) - return dna = mod.wearer.dna.unique_enzymes balloon_alert(mod.wearer, "dna updated") drain_power(use_power_cost) @@ -446,6 +474,7 @@ idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) overlay_state_inactive = "module_plasma" + required_slots = list(ITEM_SLOT_HEAD) /obj/item/mod/module/plasma_stabilizer/on_equip() ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) @@ -466,10 +495,13 @@ incompatible_modules = list(/obj/item/mod/module/hat_stabilizer) /*Intentionally left inheriting 0 complexity and removable = TRUE; even though it comes inbuilt into the Magnate/Corporate MODS and spawns in maints, I like the idea of stealing them*/ - /// Currently "stored" hat. No armor or function will be inherited, ONLY the icon. + /// Currently "stored" hat. No armor or function will be inherited, only the icon and cover flags. var/obj/item/clothing/head/attached_hat /// Whitelist of attachable hats, read note in Initialize() below this line var/static/list/attachable_hats_list + /// Original cover flags for the MOD helmet, before a hat is placed + var/former_flags + var/former_visor_flags /obj/item/mod/module/hat_stabilizer/Initialize() . = ..() @@ -499,18 +531,28 @@ //Need to subtract the beret because its annoying /obj/item/mod/module/hat_stabilizer/on_suit_activation() - RegisterSignal(mod.helmet, COMSIG_PARENT_EXAMINE, PROC_REF(add_examine)) - RegisterSignal(mod.helmet, COMSIG_PARENT_ATTACKBY, PROC_REF(place_hat)) - RegisterSignal(mod.helmet, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(remove_hat)) + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(!istype(helmet)) + return + + RegisterSignal(helmet, COMSIG_PARENT_EXAMINE, PROC_REF(add_examine)) + RegisterSignal(helmet, COMSIG_PARENT_ATTACKBY, PROC_REF(place_hat)) + RegisterSignal(helmet, COMSIG_ATOM_ATTACK_HAND_SECONDARY, PROC_REF(remove_hat)) /obj/item/mod/module/hat_stabilizer/on_suit_deactivation(deleting = FALSE) if(deleting) return + if(attached_hat) //knock off the helmet if its on their head. Or, technically, auto-rightclick it for them; that way it saves us code, AND gives them the bubble remove_hat(src, mod.wearer) - UnregisterSignal(mod.helmet, COMSIG_PARENT_EXAMINE) - UnregisterSignal(mod.helmet, COMSIG_PARENT_ATTACKBY) - UnregisterSignal(mod.helmet, COMSIG_ATOM_ATTACK_HAND_SECONDARY) + + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(!istype(helmet)) + return + + UnregisterSignal(helmet, COMSIG_PARENT_EXAMINE) + UnregisterSignal(helmet, COMSIG_PARENT_ATTACKBY) + UnregisterSignal(helmet, COMSIG_ATOM_ATTACK_HAND_SECONDARY) /obj/item/mod/module/hat_stabilizer/proc/add_examine(datum/source, mob/user, list/base_examine) SIGNAL_HANDLER @@ -523,6 +565,7 @@ SIGNAL_HANDLER if(!istype(hitting_item, /obj/item/clothing/head)) return + var/obj/item/clothing/hat = hitting_item if(!mod.active) balloon_alert(user, "suit must be active!") return @@ -532,8 +575,18 @@ if(attached_hat) balloon_alert(user, "hat already attached!") return + if(hat.clothing_flags & STACKABLE_HELMET_EXEMPT) + balloon_alert(user, "invalid hat!") + return if(mod.wearer.transferItemToLoc(hitting_item, src, force = FALSE, silent = TRUE)) - attached_hat = hitting_item + attached_hat = hat + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(istype(helmet)) + former_flags = helmet.flags_cover + former_visor_flags = helmet.visor_flags_cover + helmet.flags_cover |= attached_hat.flags_cover + helmet.visor_flags_cover |= attached_hat.visor_flags_cover + balloon_alert(user, "hat attached, right-click to remove") mod.wearer.update_worn_back() @@ -547,27 +600,18 @@ . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!attached_hat) return + attached_hat.forceMove(drop_location()) + if(user.put_in_active_hand(attached_hat)) balloon_alert(user, "hat removed") else balloon_alert_to_viewers("the hat falls to the floor!") - attached_hat = null - mod.wearer.update_worn_back() - -///Sign Language Translator - allows people to sign over comms using the modsuit's gloves. -/obj/item/mod/module/signlang_radio - name = "MOD glove translator module" - desc = "A module that adds motion sensors into the suit's gloves, \ - which works in tandem with a short-range subspace transmitter, \ - letting the audibly impaired use sign language over comms." - icon_state = "signlang_radio" - complexity = 1 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/signlang_radio) -/obj/item/mod/module/signlang_radio/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) + attached_hat = null + var/obj/item/clothing/helmet = mod.get_part_from_slot(ITEM_SLOT_HEAD) + if(istype(helmet)) + helmet.flags_cover = former_flags + helmet.visor_flags_cover = former_visor_flags -/obj/item/mod/module/signlang_radio/on_suit_deactivation(deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_CAN_SIGN_ON_COMMS, MOD_TRAIT) + mod.wearer.update_clothing(mod.slot_flags) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 1a2e94b0ad36..2a48472b21b2 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -10,6 +10,7 @@ icon_state = "springlock" complexity = 3 // it is inside every part of your suit, so incompatible_modules = list(/obj/item/mod/module/springlock) + var/set_off = FALSE /obj/item/mod/module/springlock/on_install() mod.activation_step_time *= 0.5 @@ -27,12 +28,13 @@ /obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) SIGNAL_HANDLER - if(!(methods & (VAPOR|PATCH|TOUCH))) + if(!(methods & (VAPOR|TOUCH)) || set_off || mod.wearer.stat == DEAD) return //remove non-touch reagent exposure to_chat(mod.wearer, span_danger("[src] makes an ominous click sound...")) playsound(src, 'sound/items/modsuit/springlock.ogg', 75, TRUE) addtimer(CALLBACK(src, PROC_REF(snap_shut)), rand(3 SECONDS, 5 SECONDS)) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_activate_spring_block)) + set_off = TRUE ///Signal fired when wearer attempts to activate/deactivate suits /obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user) @@ -46,15 +48,18 @@ UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc return + mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*")) mod.wearer.emote("scream") playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5) playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5) - mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer) mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc + if(!HAS_TRAIT(mod.wearer, TRAIT_NODEATH)) mod.wearer.death() //just in case, for some reason, they're still alive + flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS) + set_off = FALSE ///Rave Visor - Gives you a rainbow visor and plays jukebox music to you. /obj/item/mod/module/visor/rave @@ -63,12 +68,13 @@ icon_state = "rave_visor" complexity = 1 overlay_state_inactive = "module_rave" + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK) /// The client colors applied to the wearer. var/datum/client_colour/rave_screen /// The current element in the rainbow_order list we are on. var/rave_number = 1 /// The track we selected to play. - var/datum/track/selection + var/datum/media/selection /// A list of all the songs we can play. var/list/songs = list() /// A list of the colors the module can take. @@ -83,34 +89,21 @@ /obj/item/mod/module/visor/rave/Initialize(mapload) . = ..() - var/list/tracks = flist("[global.config.directory]/jukebox_music/sounds/") - for(var/sound in tracks) - var/datum/track/track = new() - track.song_path = file("[global.config.directory]/jukebox_music/sounds/[sound]") - var/list/sound_params = splittext(sound,"+") - if(length(sound_params) != 3) - continue - track.song_name = sound_params[1] - track.song_length = text2num(sound_params[2]) - track.song_beat = text2num(sound_params[3]) - songs[track.song_name] = track - if(length(songs)) + //This is structured in a stupid way. It'd be more effort to recode it than to crush the format until it's happy. + var/list/datum/media/tmp_songs = SSmedia.get_track_pool(MEDIA_TAG_JUKEBOX) + for(var/datum/media/track as anything in tmp_songs) + songs[track.name] = track + if(songs.len) var/song_name = pick(songs) selection = songs[song_name] /obj/item/mod/module/visor/rave/on_activation() - . = ..() - if(!.) - return rave_screen = mod.wearer.add_client_colour(/datum/client_colour/rave) rave_screen.update_colour(rainbow_order[rave_number]) if(selection) - mod.wearer.playsound_local(get_turf(src), null, 50, channel = CHANNEL_JUKEBOX, sound_to_use = sound(selection.song_path), use_reverb = FALSE) + mod.wearer.playsound_local(get_turf(src), null, 50, channel = CHANNEL_JUKEBOX, sound_to_use = sound(selection.path), use_reverb = FALSE) /obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return QDEL_NULL(rave_screen) if(selection) mod.wearer.stop_sound_channel(CHANNEL_JUKEBOX) @@ -133,7 +126,7 @@ /obj/item/mod/module/visor/rave/get_configuration() . = ..() if(length(songs)) - .["selection"] = add_ui_configuration("Song", "list", selection.song_name, clean_songs()) + .["selection"] = add_ui_configuration("Song", "list", selection.name, clean_songs()) /obj/item/mod/module/visor/rave/configure_edit(key, value) switch(key) @@ -147,30 +140,6 @@ for(var/track in songs) . += track -///Tanner - Tans you with spraytan. -/obj/item/mod/module/tanner - name = "MOD tanning module" - desc = "A tanning module for modular suits. Skin cancer functionality has not been ever proven, \ - although who knows with the rumors..." - icon_state = "tanning" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CHARGE_DRAIN * 5 - incompatible_modules = list(/obj/item/mod/module/tanner) - cooldown_time = 30 SECONDS - -/obj/item/mod/module/tanner/on_use() - . = ..() - if(!.) - return - playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, TRUE) - var/datum/reagents/holder = new() - holder.add_reagent(/datum/reagent/spraytan, 10) - holder.trans_to(mod.wearer, 10, methods = VAPOR) - if(prob(5)) - SSradiation.irradiate(mod.wearer) - drain_power(use_power_cost) - ///Balloon Blower - Blows a balloon. /obj/item/mod/module/balloon name = "MOD balloon blower module" @@ -181,16 +150,17 @@ use_power_cost = DEFAULT_CHARGE_DRAIN*0.5 incompatible_modules = list(/obj/item/mod/module/balloon) cooldown_time = 15 SECONDS + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_MASK) + var/balloon_path = /obj/item/toy/balloon + var/blowing_time = 10 SECONDS + var/oxygen_damage = 20 /obj/item/mod/module/balloon/on_use() - . = ..() - if(!.) - return - if(!do_after(mod.wearer, mod, 10 SECONDS)) + if(!do_after(mod.wearer, mod, blowing_time)) return FALSE - mod.wearer.adjustOxyLoss(20) + mod.wearer.adjustOxyLoss(oxygen_damage) playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE) - var/obj/item/toy/balloon/balloon = new(get_turf(src)) + var/obj/item/toy/balloon/balloon = new balloon_path(get_turf(src)) mod.wearer.put_in_hands(balloon) drain_power(use_power_cost) @@ -205,13 +175,11 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/paper_dispenser) cooldown_time = 5 SECONDS + required_slots = list(ITEM_SLOT_GLOVES) /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. var/num_sheets_dispensed = 0 /obj/item/mod/module/paper_dispenser/on_use() - . = ..() - if(!.) - return if(!do_after(mod.wearer, mod, 1 SECONDS)) return FALSE @@ -248,6 +216,7 @@ device = /obj/item/stamp/mod incompatible_modules = list(/obj/item/mod/module/stamp) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_GLOVES) /obj/item/stamp/mod name = "MOD electronic stamp" @@ -278,40 +247,42 @@ var/you_fucked_up = FALSE /obj/item/mod/module/atrocinator/on_activation() - . = ..() - if(!.) - return playsound(src, 'sound/effects/curseattack.ogg', 50) mod.wearer.AddElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY) RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(check_upstairs)) ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) + passtable_on(mod.wearer, MOD_TRAIT) check_upstairs() //todo at some point flip your screen around -/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE, deleting = FALSE) +/obj/item/mod/module/atrocinator/deactivate(display_message = TRUE, deleting = FALSE) if(you_fucked_up && !deleting) to_chat(mod.wearer, span_danger("It's too late.")) return FALSE - . = ..() - if(!.) - return - if(deleting) + return ..() + +/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE, deleting = FALSE) + if(!deleting) playsound(src, 'sound/effects/curseattack.ogg', 50) qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) + step_count = 0 REMOVE_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) - var/turf/open/openspace/current_turf = get_turf(mod.wearer) - if(istype(current_turf)) - current_turf.zFall(mod.wearer, falling_from_move = TRUE) + passtable_off(mod.wearer, MOD_TRAIT) + mod.wearer.zFall() /obj/item/mod/module/atrocinator/proc/check_upstairs() SIGNAL_HANDLER if(you_fucked_up || mod.wearer.has_gravity() != NEGATIVE_GRAVITY) return + var/turf/open/current_turf = get_turf(mod.wearer) var/turf/open/openspace/turf_above = GetAbove(mod.wearer) + if(current_turf && istype(turf_above)) - current_turf.zFall(mod.wearer) + mod.wearer.zFall() + else if(!turf_above && istype(current_turf) && !current_turf.simulated) //nothing holding you down INVOKE_ASYNC(src, PROC_REF(fly_away)) else if(!(step_count % 2)) diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 16822ac432de..f6689e26f353 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -16,6 +16,7 @@ complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/health_analyzer) + required_slots = list(ITEM_SLOT_GLOVES) cooldown_time = 0.5 SECONDS tgui_id = "health_analyzer" /// Scanning mode, changes how we scan something. @@ -69,6 +70,7 @@ complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) + required_slots = list(ITEM_SLOT_GLOVES) /obj/item/mod/module/quick_carry/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) @@ -101,6 +103,7 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 device = /obj/item/reagent_containers/syringe/mod incompatible_modules = list(/obj/item/mod/module/injector) + required_slots = list(ITEM_SLOT_GLOVES) cooldown_time = 0.5 SECONDS /obj/item/reagent_containers/syringe/mod @@ -127,6 +130,7 @@ complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/organ_thrower, /obj/item/mod/module/microwave_beam) + required_slots = list(ITEM_SLOT_GLOVES) cooldown_time = 0.5 SECONDS var/max_organs = 5 var/organ_list = list() @@ -186,26 +190,16 @@ organ = null return var/mob/living/carbon/human/organ_receiver = target - var/succeed = FALSE - if(organ_receiver.surgeries.len) - for(var/datum/surgery/procedure as anything in organ_receiver.surgeries) - if(procedure.location != organ.zone) - continue - if(!istype(procedure, /datum/surgery/organ_manipulation)) - continue - var/datum/surgery_step/surgery_step = procedure.get_surgery_step() - if(!istype(surgery_step, /datum/surgery_step/manipulate_organs)) - continue - succeed = TRUE - break - if(succeed) - var/list/organs_to_boot_out = organ_receiver.getorganslot(organ.slot) - for(var/obj/item/organ/organ_evacced as anything in organs_to_boot_out) - if(organ_evacced.organ_flags & ORGAN_UNREMOVABLE) - continue - organ_evacced.Remove(target) - organ_evacced.forceMove(get_turf(target)) - organ.Insert(target) + var/obj/item/bodypart/BP = organ_receiver.get_bodypart(organ.zone) + if(!BP) + organ.forceMove(drop_location()) + organ = null + return + + if(BP.cavity) + forceMove(BP) + BP.add_cavity_item(organ) else organ.forceMove(drop_location()) + organ = null diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index 52864118b91e..1dbfe6206972 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -12,17 +12,12 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/reagent_scanner) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /obj/item/mod/module/reagent_scanner/on_activation() - . = ..() - if(!.) - return ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) /obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) /obj/item/mod/module/reagent_scanner/advanced @@ -32,16 +27,10 @@ var/explosion_detection_dist = 21 /obj/item/mod/module/reagent_scanner/advanced/on_activation() - . = ..() - if(!.) - return ADD_TRAIT(mod.wearer, TRAIT_RESEARCH_SCANNER, MOD_TRAIT) RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) /obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return REMOVE_TRAIT(mod.wearer, TRAIT_RESEARCH_SCANNER, MOD_TRAIT) UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) @@ -66,20 +55,15 @@ incompatible_modules = list(/obj/item/mod/module/anomaly_locked, /obj/item/mod/module/atrocinator) cooldown_time = 0.5 SECONDS accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) + required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) /obj/item/mod/module/anomaly_locked/antigrav/on_activation() - . = ..() - if(!.) - return if(mod.wearer.has_gravity()) new /obj/effect/temp_visual/mook_dust(get_turf(src)) mod.wearer.AddElement(/datum/element/forced_gravity, 0) playsound(src, 'sound/effects/gravhit.ogg', 50) /obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) if(deleting) return @@ -100,6 +84,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 5 SECONDS accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace) + required_slots = list(ITEM_SLOT_BACK|ITEM_SLOT_BELT) /// Time it takes to teleport var/teleport_time = 3 SECONDS @@ -116,12 +101,12 @@ pre_matrix.Scale(4, 0.25) var/matrix/post_matrix = matrix() post_matrix.Scale(0.25, 4) - animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = EASE_OUT) + animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT) if(!do_after(mod.wearer, mod, teleport_time)) balloon_alert(mod.wearer, "interrupted!") - animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = EASE_IN) + animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) return - animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = EASE_IN) + animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg')) return drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index cbeb9aa32d7a..4f3a8df716a8 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -24,7 +24,7 @@ return if(bumpoff) RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) - RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) + RegisterSignal(mod.wearer, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth)) animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) @@ -36,7 +36,7 @@ return if(bumpoff) UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) + UnregisterSignal(mod.wearer, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) /obj/item/mod/module/stealth/proc/unstealth(datum/source) @@ -45,9 +45,9 @@ to_chat(mod.wearer, span_warning("[src] gets discharged from contact!")) do_sparks(2, TRUE, src) drain_power(use_power_cost) - on_deactivation(display_message = TRUE, deleting = FALSE) + deactivate(display_message = TRUE, deleting = FALSE) -/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) +/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target, proximity, modifiers) SIGNAL_HANDLER if(!isliving(target)) @@ -83,6 +83,7 @@ complexity = 2 use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/magnetic_harness) + required_slots = list(ITEM_SLOT_OCLOTHING) /// Time before we activate the magnet. var/magnet_delay = 0.8 SECONDS /// The typecache of all guns we allow. @@ -96,13 +97,19 @@ guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) /obj/item/mod/module/magnetic_harness/on_install() - already_allowed_guns = guns_typecache & mod.chestplate.allowed - mod.chestplate.allowed |= guns_typecache + var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING) + if(!istype(suit)) + return + already_allowed_guns = guns_typecache & suit.allowed + suit.allowed |= guns_typecache /obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE) if(deleting) return - mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) + var/obj/item/clothing/suit = mod.get_part_from_slot(ITEM_SLOT_OCLOTHING) + if(!istype(suit)) + return + suit.allowed -= (guns_typecache - already_allowed_guns) /obj/item/mod/module/magnetic_harness/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(check_dropped_item)) @@ -140,6 +147,7 @@ cooldown_time = 5 SECONDS overlay_state_inactive = "module_pepper" overlay_state_use = "module_pepper_used" + required_slots = list(ITEM_SLOT_OCLOTHING) /obj/item/mod/module/pepper_shoulders/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(on_check_shields)) @@ -148,14 +156,11 @@ UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) /obj/item/mod/module/pepper_shoulders/on_use() - . = ..() - if(!.) - return playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) var/datum/reagents/capsaicin_holder = new(10) capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10) - var/datum/effect_system/smoke_spread/chem/quick/smoke = new - smoke.set_up(capsaicin_holder, 1, get_turf(src)) + var/datum/effect_system/fluid_spread/smoke/chem/quick/smoke = new + smoke.set_up(1, location = get_turf(src), carry = capsaicin_holder) smoke.start() /obj/item/mod/module/pepper_shoulders/proc/on_check_shields() @@ -166,4 +171,4 @@ if(!check_power(use_power_cost)) return mod.wearer.visible_message(span_warning("[src] reacts to the attack with a smoke of pepper spray!"), span_notice("Your [src] releases a cloud of pepper spray!")) - on_use() + used() diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 73aba7d1b005..5234be9d3a5e 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -67,16 +67,16 @@ complexity = 1 idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/waddle) + required_slots = list(ITEM_SLOT_FEET) /obj/item/mod/module/waddle/on_suit_activation() - mod.boots.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please + var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET) + if(shoes) + shoes.AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please ADD_WADDLE(mod.wearer, WADDLE_SOURCE_MODSUIT) - if(is_clown_job(mod.wearer.mind?.assigned_role)) - SEND_SIGNAL(mod.wearer, COMSIG_ADD_MOOD_EVENT, "clownshoes", /datum/mood_event/clownshoes) /obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) - if(!deleting) - qdel(mod.boots.GetComponent(/datum/component/squeak)) + var/obj/item/shoes = mod.get_part_from_slot(ITEM_SLOT_FEET) + if(shoes && !deleting) + qdel(shoes.GetComponent(/datum/component/squeak)) REMOVE_WADDLE(mod.wearer, WADDLE_SOURCE_MODSUIT) - if(is_clown_job(mod.wearer.mind?.assigned_role)) - SEND_SIGNAL(mod.wearer, COMSIG_CLEAR_MOOD_EVENT, "clownshoes") diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index f0364f9946e2..c5c045644ea2 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -18,9 +18,6 @@ AddComponent(/datum/component/gps/item, "MOD0", state = GLOB.deep_inventory_state, overlay_state = FALSE) /obj/item/mod/module/gps/on_use() - . = ..() - if(!.) - return attack_self(mod.wearer) ///Hydraulic Clamp - Lets you pick up and drop crates. @@ -37,6 +34,7 @@ cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_clamp" overlay_state_active = "module_clamp_on" + required_slots = list(ITEM_SLOT_GLOVES, ITEM_SLOT_BACK) /// Time it takes to load a crate. var/load_time = 3 SECONDS /// The max amount of crates you can carry. @@ -111,6 +109,7 @@ load_time = 1 SECONDS max_crates = 5 use_mod_colors = TRUE + required_slots = list(ITEM_SLOT_BACK) ///Drill - Lets you dig through rock and basalt. /obj/item/mod/module/drill @@ -126,15 +125,9 @@ overlay_state_active = "module_drill" /obj/item/mod/module/drill/on_activation() - . = ..() - if(!.) - return RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) /obj/item/mod/module/drill/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP) /obj/item/mod/module/drill/on_select_use(atom/target) @@ -145,7 +138,7 @@ return if(istype(target, /turf/closed/mineral)) var/turf/closed/mineral/mineral_turf = target - mineral_turf.gets_drilled(mod.wearer) + mineral_turf.MinedAway() drain_power(use_power_cost) else if(istype(target, /turf/open/misc/asteroid)) var/turf/open/misc/asteroid/sand_turf = target @@ -159,7 +152,7 @@ if(!istype(bumped_into, /turf/closed/mineral) || !drain_power(use_power_cost)) return var/turf/closed/mineral/mineral_turf = bumped_into - mineral_turf.gets_drilled(mod.wearer) + mineral_turf.MinedAway() return COMPONENT_CANCEL_ATTACK_CHAIN ///Ore Bag - Lets you pick up ores and drop them from the suit. @@ -173,6 +166,7 @@ complexity = 1 use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/orebag) + required_slots = list(ITEM_SLOT_BACK) cooldown_time = 0.5 SECONDS /// The ores stored in the bag. var/list/ores = list() @@ -202,9 +196,6 @@ ores += ore /obj/item/mod/module/orebag/on_use() - . = ..() - if(!.) - return for(var/obj/item/ore as anything in ores) ore.forceMove(drop_location()) ores -= ore @@ -218,6 +209,7 @@ removable = FALSE use_power_cost = DEFAULT_CHARGE_DRAIN*10 incompatible_modules = list(/obj/item/mod/module/hydraulic) + required_slots = list(ITEM_SLOT_BACK) cooldown_time = 4 SECONDS overlay_state_inactive = "module_hydraulic" overlay_state_active = "module_hydraulic_active" @@ -234,7 +226,7 @@ var/atom/game_renderer = mod.wearer.hud_used.plane_masters["[RENDER_PLANE_GAME]"] var/matrix/render_matrix = matrix(game_renderer.transform) render_matrix.Scale(1.25, 1.25) - animate(game_renderer, launch_time, flags = SINE_EASING|EASE_IN, transform = render_matrix) + animate(game_renderer, launch_time, transform = render_matrix) var/current_time = world.time mod.wearer.visible_message(span_warning("[mod.wearer] starts whirring!"), \ blind_message = span_hear("You hear a whirring sound.")) @@ -307,6 +299,7 @@ removable = FALSE use_power_cost = DEFAULT_CHARGE_DRAIN*3 incompatible_modules = list(/obj/item/mod/module/magnet) + required_slots = list(ITEM_SLOT_BACK) cooldown_time = 1.5 SECONDS overlay_state_active = "module_magnet" use_mod_colors = TRUE @@ -315,8 +308,8 @@ . = ..() if(!.) return - if(istype(mod.wearer.pulling, /obj/structure/closet)) - var/obj/structure/closet/locker = mod.wearer.pulling + var/obj/structure/closet/locker = mod.wearer.get_active_grab()?.affecting + if(istype(locker, /obj/structure/closet)) playsound(locker, 'sound/effects/gravhit.ogg', 75, TRUE) locker.forceMove(mod.wearer.loc) locker.throw_at(target, range = 7, speed = 4, thrower = mod.wearer) @@ -324,7 +317,7 @@ if(!istype(target, /obj/structure/closet) || !(target in view(mod.wearer))) balloon_alert(mod.wearer, "invalid target!") return - var/obj/structure/closet/locker = target + if(locker.anchored || locker.move_resist >= MOVE_FORCE_OVERPOWERING) balloon_alert(mod.wearer, "target anchored!") return @@ -334,221 +327,24 @@ callback = CALLBACK(src, PROC_REF(check_locker), locker)) /obj/item/mod/module/magnet/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - if(istype(mod.wearer.pulling, /obj/structure/closet)) - mod.wearer.stop_pulling() + for(var/obj/item/hand_item/grab/G in mod.wearer.active_grabs) + if(istype(G.affecting, /obj/structure/closet)) + qdel(G) /obj/item/mod/module/magnet/proc/check_locker(obj/structure/closet/locker) if(!mod?.wearer) return if(!locker.Adjacent(mod.wearer) || !isturf(locker.loc) || !isturf(mod.wearer.loc)) return - mod.wearer.start_pulling(locker) + mod.wearer.try_make_grab(locker) locker.strong_grab = TRUE - RegisterSignal(locker, COMSIG_ATOM_NO_LONGER_PULLED, PROC_REF(on_stop_pull)) + RegisterSignal(locker, COMSIG_ATOM_NO_LONGER_GRABBED, PROC_REF(on_stop_pull)) /obj/item/mod/module/magnet/proc/on_stop_pull(obj/structure/closet/locker, atom/movable/last_puller) SIGNAL_HANDLER locker.strong_grab = FALSE - UnregisterSignal(locker, COMSIG_ATOM_NO_LONGER_PULLED) - -/obj/item/mod/module/ash_accretion - name = "MOD ash accretion module" - desc = "A module that collects ash from the terrain, covering the suit in a protective layer, this layer is \ - lost when moving across standard terrain." - icon_state = "ash_accretion" - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/ash_accretion) - overlay_state_inactive = "module_ash" - use_mod_colors = TRUE - /// How many tiles we can travel to max out the armor. - var/max_traveled_tiles = 10 - /// How many tiles we traveled through. - var/traveled_tiles = 0 - /// Armor values per tile. - var/list/armor_values = list(MELEE = 4, BULLET = 1, LASER = 2, ENERGY = 2, BOMB = 4) - /// Speed added when you're fully covered in ash. - var/speed_added = 0.5 - /// Turfs that let us accrete ash. - var/static/list/accretion_turfs - /// Turfs that let us keep ash. - var/static/list/keep_turfs - -/obj/item/mod/module/ash_accretion/Initialize(mapload) - . = ..() - if(!accretion_turfs) - accretion_turfs = typecacheof(list( - /turf/open/misc/asteroid, - /turf/open/misc/ashplanet, - /turf/open/misc/dirt, - )) - if(!keep_turfs) - keep_turfs = typecacheof(list( - /turf/open/misc/grass, - /turf/open/floor/plating/snowed, - /turf/open/misc/sandy_dirt, - /turf/open/misc/ironsand, - /turf/open/misc/ice, - /turf/open/indestructible/hierophant, - /turf/open/indestructible/boss, - /turf/open/indestructible/necropolis, - /turf/open/lava, - /turf/open/water, - )) - -/obj/item/mod/module/ash_accretion/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_ASHSTORM_IMMUNE, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_SNOWSTORM_IMMUNE, MOD_TRAIT) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - -/obj/item/mod/module/ash_accretion/on_suit_deactivation(deleting = FALSE) - REMOVE_TRAIT(mod.wearer, TRAIT_ASHSTORM_IMMUNE, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_SNOWSTORM_IMMUNE, MOD_TRAIT) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - if(!traveled_tiles) - return - var/list/parts = mod.mod_parts + mod - var/list/removed_armor = armor_values.Copy() - for(var/armor_type in removed_armor) - removed_armor[armor_type] = -removed_armor[armor_type] * traveled_tiles - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(removed_armor)) - if(traveled_tiles == max_traveled_tiles) - mod.slowdown += speed_added - mod.wearer.update_equipment_speed_mods() - traveled_tiles = 0 - -/obj/item/mod/module/ash_accretion/generate_worn_overlay(mutable_appearance/standing) - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" - return ..() - -/obj/item/mod/module/ash_accretion/proc/on_move(atom/source, atom/oldloc, dir, forced) - if(!isturf(mod.wearer.loc)) //dont lose ash from going in a locker - return - if(traveled_tiles) //leave ash every tile - new /obj/effect/temp_visual/light_ash(get_turf(src)) - if(is_type_in_typecache(mod.wearer.loc, accretion_turfs)) - if(traveled_tiles >= max_traveled_tiles) - return - traveled_tiles++ - var/list/parts = mod.mod_parts + mod - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(armor_values)) - if(traveled_tiles >= max_traveled_tiles) - balloon_alert(mod.wearer, "fully ash covered") - mod.wearer.color = list(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,3) //make them super light - animate(mod.wearer, 1 SECONDS, color = null, flags = ANIMATION_PARALLEL) - playsound(src, 'sound/effects/sparks1.ogg', 100, TRUE) - mod.slowdown -= speed_added - mod.wearer.update_equipment_speed_mods() - else if(is_type_in_typecache(mod.wearer.loc, keep_turfs)) - return - else - if(traveled_tiles <= 0) - return - if(traveled_tiles == max_traveled_tiles) - mod.slowdown += speed_added - mod.wearer.update_equipment_speed_mods() - traveled_tiles-- - var/list/parts = mod.mod_parts + mod - var/list/removed_armor = armor_values.Copy() - for(var/armor_type in removed_armor) - removed_armor[armor_type] = -removed_armor[armor_type] - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(removed_armor)) - if(traveled_tiles <= 0) - balloon_alert(mod.wearer, "ran out of ash!") - -/obj/item/mod/module/sphere_transform - name = "MOD sphere transform module" - desc = "A module able to move the suit's parts around, turning it and the user into a sphere. \ - The sphere can move quickly, even through lava, and launch mining bombs to decimate terrain." - icon_state = "sphere" - module_type = MODULE_ACTIVE - removable = FALSE - active_power_cost = DEFAULT_CHARGE_DRAIN*0.5 - use_power_cost = DEFAULT_CHARGE_DRAIN*3 - incompatible_modules = list(/obj/item/mod/module/sphere_transform) - cooldown_time = 1.25 SECONDS - /// Time it takes us to complete the animation. - var/animate_time = 0.25 SECONDS - -/obj/item/mod/module/sphere_transform/on_activation() - if(!mod.wearer.has_gravity()) - balloon_alert(mod.wearer, "no gravity!") - return FALSE - . = ..() - if(!.) - return - playsound(src, 'sound/items/modsuit/ballin.ogg', 100) - mod.wearer.add_filter("mod_ball", 1, alpha_mask_filter(icon = icon('icons/mob/clothing/modsuit/mod_modules.dmi', "ball_mask"), flags = MASK_INVERSE)) - mod.wearer.add_filter("mod_blur", 2, angular_blur_filter(size = 15)) - mod.wearer.add_filter("mod_outline", 3, outline_filter(color = "#000000AA")) - mod.wearer.base_pixel_y -= 4 - animate(mod.wearer, animate_time, pixel_y = mod.wearer.base_pixel_y, flags = ANIMATION_PARALLEL) - mod.wearer.SpinAnimation(1.5) - ADD_TRAIT(mod.wearer, TRAIT_LAVA_IMMUNE, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_HANDS_BLOCKED, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_NO_SLIP_ALL, MOD_TRAIT) - mod.wearer.add_movespeed_mod_immunities(MOD_TRAIT, /datum/movespeed_modifier/turf_slowdown) - mod.wearer.RemoveElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) - mod.wearer.AddElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) - RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) - -/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return - if(!deleting) - playsound(src, 'sound/items/modsuit/ballout.ogg', 100) - mod.wearer.base_pixel_y = 0 - animate(mod.wearer, animate_time, pixel_y = mod.wearer.base_pixel_y) - addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/atom, remove_filter), list("mod_ball", "mod_blur", "mod_outline")), animate_time) - REMOVE_TRAIT(mod.wearer, TRAIT_LAVA_IMMUNE, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_HANDS_BLOCKED, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_NO_SLIP_ALL, MOD_TRAIT) - mod.wearer.remove_movespeed_mod_immunities(MOD_TRAIT, /datum/movespeed_modifier/damage_slowdown) - mod.wearer.RemoveElement(/datum/element/footstep, FOOTSTEP_OBJ_ROBOT, 1, -6, sound_vary = TRUE) - mod.wearer.AddElement(/datum/element/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) - mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/sphere) - UnregisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE) - -/obj/item/mod/module/sphere_transform/on_use() - if(!lavaland_equipment_pressure_check(get_turf(src))) - balloon_alert(mod.wearer, "too much pressure!") - playsound(src, 'sound/weapons/gun/general/dry_fire.ogg', 25, TRUE) - return FALSE - return ..() - -/obj/item/mod/module/sphere_transform/on_select_use(atom/target) - . = ..() - if(!.) - return - var/obj/projectile/bomb = new /obj/projectile/bullet/reusable/mining_bomb(mod.wearer.loc) - bomb.preparePixelProjectile(target, mod.wearer) - bomb.firer = mod.wearer - playsound(src, 'sound/weapons/gun/general/grenade_launch.ogg', 75, TRUE) - INVOKE_ASYNC(bomb, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) - -/obj/item/mod/module/sphere_transform/on_active_process(delta_time) - animate(mod.wearer) //stop the animation - mod.wearer.SpinAnimation(1.5) //start it back again - if(!mod.wearer.has_gravity()) - on_deactivation() //deactivate in no grav - -/obj/item/mod/module/sphere_transform/proc/on_statchange(datum/source) - SIGNAL_HANDLER - - if(!mod.wearer.stat) - return - on_deactivation() + UnregisterSignal(locker, COMSIG_ATOM_NO_LONGER_GRABBED) /obj/projectile/bullet/reusable/mining_bomb name = "mining bomb" @@ -560,7 +356,7 @@ range = 6 suppressed = SUPPRESSED_VERY armor_flag = BOMB - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE @@ -573,7 +369,7 @@ icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' anchored = TRUE resistance_flags = FIRE_PROOF|LAVA_PROOF - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE @@ -606,7 +402,7 @@ visible_message(span_danger("[src] explodes!")) playsound(src, 'sound/magic/magic_missile.ogg', 200, vary = TRUE) for(var/turf/closed/mineral/rock in circle_range_turfs(src, 2)) - rock.gets_drilled() + rock.MinedAway() for(var/mob/living/mob in range(1, src)) mob.apply_damage(12 * (ishostile(mob) ? fauna_boost : 1), BRUTE, spread_damage = TRUE) for(var/obj/object in range(1, src)) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index a9a0261a63a5..18a18ed56195 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -28,9 +28,6 @@ UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) /obj/item/mod/module/eradication_lock/on_use() - . = ..() - if(!.) - return true_owner_ckey = mod.wearer.ckey balloon_alert(mod.wearer, "user remembered") drain_power(use_power_cost) @@ -64,12 +61,10 @@ removable = FALSE use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/rewinder) + required_slots = list(ITEM_SLOT_BACK) cooldown_time = 20 SECONDS /obj/item/mod/module/rewinder/on_use() - . = ..() - if(!.) - return balloon_alert(mod.wearer, "anchor point set") playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) //stops all mods from triggering during rewinding @@ -109,16 +104,17 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timestopper) cooldown_time = 60 SECONDS + required_slots = list(ITEM_SLOT_BACK) ///The current timestop in progress. var/obj/effect/timestop/channelled/timestop -/obj/item/mod/module/timestopper/on_use() - . = ..() - if(!.) - return +/obj/item/mod/module/timestopper/use(used) if(timestop) mod.balloon_alert(mod.wearer, "already freezing time!") - return + return FALSE + return ..() + +/obj/item/mod/module/timestopper/on_use() //stops all mods from triggering during timestop- including timestop itself for(var/obj/item/mod/module/module as anything in mod.modules) RegisterSignal(module, COMSIG_MODULE_TRIGGERED, PROC_REF(on_module_triggered)) @@ -157,18 +153,18 @@ incompatible_modules = list(/obj/item/mod/module/timeline_jumper) cooldown_time = 5 SECONDS allowed_in_phaseout = TRUE + required_slots = list(ITEM_SLOT_BACK) ///The dummy for phasing from this module, the wearer is phased out while this exists. var/obj/effect/dummy/phased_mob/chrono/phased_mob -/obj/item/mod/module/timeline_jumper/on_use() - . = ..() - if(!.) - return +/obj/item/mod/module/timeline_jumper/used() var/area/noteleport_check = get_area(mod.wearer) - if(noteleport_check && noteleport_check.area_flags & NOTELEPORT) + if(noteleport_check && (noteleport_check.area_flags & NOTELEPORT)) to_chat(mod.wearer, span_danger("Some dull, universal force is between you and the [phased_mob ? "current timeline" : "stream between timelines"].")) return FALSE + return ..() +/obj/item/mod/module/timeline_jumper/on_use() if(!phased_mob) //phasing out mod.visible_message(span_warning("[mod.wearer] leaps out of the timeline!")) @@ -210,6 +206,7 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tem) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_BACK) ///Reference to the chrono field being controlled by this module var/obj/structure/chrono_field/field = null ///Where the chronofield maker was when the field went up @@ -352,6 +349,7 @@ /obj/structure/chrono_field/Destroy() if(tem) tem.field_disconnect(src) + STOP_PROCESSING(SSobj, src) return ..() /obj/structure/chrono_field/update_overlays() diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 740489b56458..ce83b66fd118 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -9,29 +9,24 @@ active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/visor) cooldown_time = 0.5 SECONDS + required_slots = list(ITEM_SLOT_HEAD|ITEM_SLOT_EYES|ITEM_SLOT_MASK) /// The HUD type given by the visor. var/hud_type /// The traits given by the visor. var/list/visor_traits = list() /obj/item/mod/module/visor/on_activation() - . = ..() - if(!.) - return if(hud_type) var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.add_hud_to(mod.wearer) + hud.show_to(mod.wearer) for(var/trait in visor_traits) ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) mod.wearer.update_sight() /obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) - . = ..() - if(!.) - return if(hud_type) var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.remove_hud_from(mod.wearer) + hud.hide_from(mod.wearer) for(var/trait in visor_traits) REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) mod.wearer.update_sight() diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 2b0789f7bfcf..bcd8489fc91a 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -11,8 +11,8 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar light_on = FALSE integrity_failure = 0.5 max_integrity = 100 - armor = list(MELEE = 0, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) - light_system = MOVABLE_LIGHT_DIRECTIONAL + armor = list(BLUNT = 0, PUNCTURE = 20, SLASH = 0, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + light_system = OVERLAY_LIGHT_DIRECTIONAL var/bypass_state = FALSE // bypassing the set icon state @@ -58,7 +58,10 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /// Number of total expansion bays this computer has available. var/max_bays = 0 + /// Is this computer allowed to save imprint information? (truthy), If so, what's the prefix? + var/imprint_prefix = FALSE var/saved_identification = null // next two values are the currently imprinted id and job values + /// The title of the job saved to this PC. Will often not be a real job, this is for flavor. var/saved_job = null /// Allow people with chunky fingers to use? @@ -153,7 +156,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar if(issilicon(user)) return - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] if(card_slot2?.try_eject(user) || card_slot?.try_eject(user)) @@ -168,7 +171,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return card_slot.GetAccess() return ..() -/obj/item/modular_computer/GetID() +/obj/item/modular_computer/GetID(bypass_wallet) var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD] var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2] @@ -254,7 +257,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr - if((!istype(over_object, /atom/movable/screen)) && usr.canUseTopic(src, BE_CLOSE)) + if((!istype(over_object, /atom/movable/screen)) && usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return attack_self(M) return ..() @@ -357,28 +360,48 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar // If we have a recharger, enable it automatically. Lets computer without a battery work. var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE] - if(recharger) - recharger.enabled = 1 + // Wake up the network card so it can start accepting packets. + var/obj/item/computer_hardware/network_card = all_components[MC_NET] + recharger?.enable_changed(TRUE) + network_card?.enable_changed(TRUE) - if(use_power()) // use_power() checks if the PC is powered - if(issynth) - to_chat(user, span_notice("You send an activation signal to \the [src], turning it on.")) - else - to_chat(user, span_notice("You press the power button and start up \the [src].")) - if(looping_sound) - soundloop.start() - enabled = 1 - update_appearance() - if(user) - ui_interact(user) - return TRUE - else // Unpowered + var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD] + var/obj/item/computer_hardware/hard_drive/role/ssd = all_components[MC_HDD_JOB] + var/datum/computer_file/data/text/autorun_file = hdd?.find_file_by_name(MC_AUTORUN_FILE) + var/autorun_id = autorun_file?.stored_text + + + + + // Final check, can we start up? + if(!use_power()) // use_power() checks if the PC is powered if(issynth) to_chat(user, span_warning("You send an activation signal to \the [src] but it does not respond.")) else to_chat(user, span_warning("You press the power button but \the [src] does not respond.")) return FALSE + if(issynth) + to_chat(user, span_notice("You send an activation signal to \the [src], turning it on.")) + else + to_chat(user, span_notice("You press the power button and start up \the [src].")) + if(looping_sound) + soundloop.start() + enabled = TRUE + + //Start the Autorun program before we pass control to the user + if(autorun_id) + var/datum/computer_file/program/target_program = hdd?.find_file_by_name(autorun_id) + if(!target_program && ssd) + target_program = ssd.find_file_by_name(autorun_id) + if(istype(target_program)) + try_run_program(target_program, user, FALSE) //Be quiet about it. Just transparently fail if it doesn't work. + update_appearance() + if(user) + ui_interact(user) + return TRUE + + // Process currently calls handle_power(), may be expanded in future if more things are added. /obj/item/modular_computer/process(delta_time) if(!enabled) // The computer is turned off @@ -481,7 +504,8 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar data["PC_batterypercent"] = "N/C" data["PC_showbatteryicon"] = battery_module ? 1 : 0 - if(recharger && recharger.enabled && recharger.check_functionality() && recharger.use_power(0)) + // We don't need to check for enablement as check_functionality does that for us. + if(recharger && recharger.check_functionality() && recharger.use_power(0)) data["PC_apclinkicon"] = "charging.gif" switch(get_ntnet_status()) @@ -540,10 +564,13 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return FALSE var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET] - return SSnetworks.add_log(text, network_card.network_id, network_card.hardware_id) + return SSnetworks.add_log(text, network_card.hardware_id) /obj/item/modular_computer/proc/shutdown_computer(loud = 1) kill_program(forced = TRUE) + // shut down the network card so it doesn't accepting packets while the machine is off. + var/obj/item/computer_hardware/network_card = all_components[MC_NET] + network_card?.enable_changed(FALSE) for(var/datum/computer_file/program/P in idle_threads) P.kill_program(forced = TRUE) idle_threads.Remove(P) @@ -551,7 +578,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar soundloop.stop() if(loud) physical.visible_message(span_notice("\The [src] shuts down.")) - enabled = 0 + enabled = FALSE update_appearance() /obj/item/modular_computer/ui_action_click(mob/user, actiontype) @@ -591,7 +618,10 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar return TRUE /obj/item/modular_computer/proc/UpdateDisplay() - name = "[saved_identification] ([saved_job])" + if(!imprint_prefix) + name = initial(name) //No saved ID, no fucked up name. + return + name = "[imprint_prefix] - [saved_job ? "([saved_job])" : null]" /obj/item/modular_computer/screwdriver_act(mob/user, obj/item/tool) if(!deconstructable) @@ -636,15 +666,6 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar to_chat(user, span_notice("You slot \the [attacking_item] into [src].")) return - // Scan a photo. - if(istype(attacking_item, /obj/item/photo)) - var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD] - var/obj/item/photo/pic = attacking_item - if(hdd) - for(var/datum/computer_file/program/messenger/messenger in hdd.stored_files) - saved_image = pic.picture - messenger.ProcessPhoto() - return // Insert items into the components for(var/h in all_components) @@ -707,3 +728,33 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar /obj/item/modular_computer/proc/Remove_Messenger() GLOB.TabletMessengers -= src + +/obj/item/modular_computer/proc/try_run_program(datum/computer_file/program/runnable, mob/user, loud = TRUE) + runnable.computer = src + + if(!runnable.is_supported_by_hardware(hardware_flag, loud, user)) + return + + // The program is already running. Resume it. + if(runnable in idle_threads) + runnable.program_state = PROGRAM_STATE_ACTIVE + active_program = runnable + runnable.alert_pending = FALSE + idle_threads.Remove(runnable) + update_appearance() + return + + if(idle_threads.len > max_idle_programs) + if(user) + to_chat(user, span_danger("\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error.")) + return + + if(runnable.requires_ntnet && !get_ntnet_status(runnable.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. + if(user) + to_chat(user, span_danger("\The [src]'s screen shows \"Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning.")) + return + if(runnable.run_program(user)) + active_program = runnable + runnable.alert_pending = FALSE + update_appearance() + return TRUE diff --git a/code/modules/modular_computers/computers/item/computer_components.dm b/code/modules/modular_computers/computers/item/computer_components.dm index 64d9d21c8a99..8331fa423a42 100644 --- a/code/modules/modular_computers/computers/item/computer_components.dm +++ b/code/modules/modular_computers/computers/item/computer_components.dm @@ -36,6 +36,7 @@ install.holder = src install.forceMove(src) install.on_install(src, user) + notify_hardware_change() /// Uninstalls component. @@ -69,3 +70,27 @@ if(component.name == name) return component return null + +/// Notify all programs of hardware changes. +/obj/item/modular_computer/proc/notify_hardware_change() + if(active_program) + active_program.event_hardware_changed(FALSE) + for(var/datum/computer_file/program/prog as anything in idle_threads) + prog.event_hardware_changed(TRUE) + return + +/// Notify all programs about an ID removal. +/obj/item/modular_computer/proc/notify_id_removed(device_type) + if(active_program) + active_program.event_id_removed(FALSE, device_type) + + for(var/datum/computer_file/program/computer_program as anything in idle_threads) + computer_program.event_id_removed(TRUE, device_type) + +/// Notify all programs about an ID insertion. +/obj/item/modular_computer/proc/notify_id_inserted(device_type) + if(active_program) + active_program.event_id_inserted(FALSE, device_type) + + for(var/datum/computer_file/program/computer_program as anything in idle_threads) + computer_program.event_id_inserted(TRUE, device_type) diff --git a/code/modules/modular_computers/computers/item/computer_damage.dm b/code/modules/modular_computers/computers/item/computer_damage.dm index 3550a71664ec..b1538eb36e90 100644 --- a/code/modules/modular_computers/computers/item/computer_damage.dm +++ b/code/modules/modular_computers/computers/item/computer_damage.dm @@ -2,7 +2,7 @@ . = ..() var/component_probability = min(50, max(damage_amount*0.1, 1 - atom_integrity/max_integrity)) switch(damage_flag) - if(BULLET) + if(PUNCTURE) component_probability = damage_amount * 0.5 if(LASER) component_probability = damage_amount * 0.66 diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index 882e10a667f5..ca14f8618562 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -49,7 +49,7 @@ var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage for(var/obj/item/computer_hardware/H in all_components) - if(H.enabled) + if(H.is_enabled()) power_usage += H.power_usage if(use_power(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 6afca15b94c3..3b301044baa6 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -48,7 +48,7 @@ . = ..() var/list/data = list() - data["show_imprint"] = istype(src, /obj/item/modular_computer/tablet/) + data["show_imprint"] = !!imprint_prefix return data @@ -63,8 +63,15 @@ var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD] var/obj/item/computer_hardware/hard_drive/role/ssd = all_components[MC_HDD_JOB] - data["cardholder"] = FALSE + var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] + + //This filetype structure makes me want to murder someone. + var/datum/computer_file/data/text/autorun = hard_drive?.find_file_by_name(MC_AUTORUN_FILE) + // Get the autorun ID to determine which program is autorun. + var/autorun_id = autorun?.stored_text //Empty text files are zero length strings. + + data["cardholder"] = FALSE if(cardholder) data["cardholder"] = TRUE @@ -92,7 +99,7 @@ if(prog in idle_threads) running = TRUE - data["disk_programs"] += list(list("name" = prog.filename, "desc" = prog.filedesc, "running" = running, "icon" = prog.program_icon, "alert" = prog.alert_pending)) + data["disk_programs"] += list(list("name" = prog.filename, "desc" = prog.filedesc, "running" = running, "icon" = prog.program_icon, "alert" = prog.alert_pending, "autorun" = (autorun_id == prog.filename))) data["removable_media"] = list() if(all_components[MC_SDD]) @@ -105,13 +112,12 @@ data["removable_media"] += "secondary RFID card" 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) var/running = FALSE if(P in idle_threads) running = TRUE - data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc, "running" = running, "icon" = P.program_icon, "alert" = P.alert_pending)) + data["programs"] += list(list("name" = P.filename, "desc" = P.filedesc, "running" = running, "icon" = P.program_icon, "alert" = P.alert_pending, "autorun" = (autorun_id == P.filename))) data["has_light"] = has_light data["light_on"] = light_on @@ -127,6 +133,7 @@ return var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD] + var/obj/item/computer_hardware/hard_drive/role/ssd = all_components[MC_HDD_JOB] switch(action) if("PC_exit") kill_program() @@ -134,6 +141,29 @@ if("PC_shutdown") shutdown_computer() return TRUE + if("PC_setautorun") + var/prog_name = params["name"] + var/datum/computer_file/program/P = null + if(!hard_drive) + return FALSE //No hard drive. Nowhere to store the autorun file. + var/datum/computer_file/data/text/autorun_file = hard_drive.find_file_by_name(MC_AUTORUN_FILE) + if(!autorun_file) + autorun_file = new + autorun_file.filename = MC_AUTORUN_FILE + autorun_file.calculate_size() + hard_drive.store_file(autorun_file) + + // Check the hard drive first. + P = hard_drive.find_file_by_name(prog_name) + if(!istype(P) && ssd)//If we have a job disk... + //Second Trial. + P = ssd.find_file_by_name(prog_name) + if(istype(P)) + autorun_file.stored_text = prog_name //Store it for autorun. + autorun_file.calculate_size() + hard_drive.recalculate_size() + return TRUE + if("PC_minimize") var/mob/user = usr if(!active_program) @@ -164,7 +194,7 @@ var/prog = params["name"] var/is_disk = params["is_disk"] var/datum/computer_file/program/P = null - var/obj/item/computer_hardware/hard_drive/role/ssd = all_components[MC_HDD_JOB] + var/mob/user = usr if(hard_drive && !is_disk) @@ -175,33 +205,8 @@ if(!P || !istype(P)) // Program not found or it's not executable program. to_chat(user, span_danger("\The [src]'s screen shows \"I/O ERROR - Unable to run program\" warning.")) return + return try_run_program(P, user) - P.computer = src - - if(!P.is_supported_by_hardware(hardware_flag, 1, user)) - return - - // The program is already running. Resume it. - if(P in idle_threads) - P.program_state = PROGRAM_STATE_ACTIVE - active_program = P - P.alert_pending = FALSE - idle_threads.Remove(P) - update_appearance() - return - - if(idle_threads.len > max_idle_programs) - to_chat(user, span_danger("\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error.")) - return - - if(P.requires_ntnet && !get_ntnet_status(P.requires_ntnet_feature)) // The program requires NTNet connection, but we are not connected to NTNet. - to_chat(user, span_danger("\The [src]'s screen shows \"Unable to connect to NTNet. Please retry. If problem persists contact your system administrator.\" warning.")) - return - if(P.run_program(user)) - active_program = P - P.alert_pending = FALSE - update_appearance() - return 1 if("PC_toggle_light") return toggle_flashlight() @@ -230,7 +235,6 @@ user.put_in_hands(portable_drive) playsound(src, 'sound/machines/card_slide.ogg', 50) if("job disk") - var/obj/item/computer_hardware/hard_drive/role/ssd = all_components[MC_HDD_JOB] if(!ssd) return if(uninstall_component(ssd, usr)) diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index 51e9134b7bf1..53df8a1864d1 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -87,7 +87,7 @@ return if(!isturf(loc) && !ismob(loc)) // No opening it in backpack. return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return toggle_open(user) diff --git a/code/modules/modular_computers/computers/item/role_tablet_presets.dm b/code/modules/modular_computers/computers/item/role_tablet_presets.dm index 01e1c266f2a5..bdbbcb19c14b 100644 --- a/code/modules/modular_computers/computers/item/role_tablet_presets.dm +++ b/code/modules/modular_computers/computers/item/role_tablet_presets.dm @@ -53,7 +53,7 @@ default_disk = /obj/item/computer_hardware/hard_drive/role/hop /obj/item/modular_computer/tablet/pda/heads/hos - name = "head of security PDA" + name = "security marshal PDA" default_disk = /obj/item/computer_hardware/hard_drive/role/hos greyscale_config = /datum/greyscale_config/tablet/head greyscale_colors = "#EA3232#0000CC" @@ -89,7 +89,7 @@ RegisterSignal(src, COMSIG_TABLET_CHECK_DETONATE, PROC_REF(tab_no_detonate)) /obj/item/modular_computer/tablet/pda/cargo - name = "cargo technician PDA" + name = "deckhand PDA" default_disk = /obj/item/computer_hardware/hard_drive/role/quartermaster greyscale_colors = "#D6B328#6506CA" @@ -162,7 +162,7 @@ greyscale_colors = null insert_type = /obj/item/toy/crayon/rainbow -/obj/item/modular_computer/tablet/pda/clown/ComponentInitialize() +/obj/item/modular_computer/tablet/pda/clown/Initialize(mapload) . = ..() AddComponent(/datum/component/slippery/clowning, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, PROC_REF(AfterSlip)), slot_whitelist = list(ITEM_SLOT_ID, ITEM_SLOT_BELT)) AddComponent(/datum/component/wearertargeting/sitcomlaughter, CALLBACK(src, PROC_REF(after_sitcom_laugh))) @@ -195,24 +195,16 @@ if(hdd) for(var/datum/computer_file/program/messenger/msg in hdd.stored_files) msg.mime_mode = TRUE - msg.allow_emojis = TRUE + /obj/item/modular_computer/tablet/pda/curator - name = "curator PDA" + name = "archivist PDA" default_disk = /obj/item/computer_hardware/hard_drive/role/curator greyscale_config = null greyscale_colors = null icon_state = "pda-library" insert_type = /obj/item/pen/fountain -/obj/item/modular_computer/tablet/pda/curator/Initialize(mapload) - . = ..() - var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD] - - if(hdd) - for(var/datum/computer_file/program/messenger/msg in hdd.stored_files) - msg.allow_emojis = TRUE - /obj/item/modular_computer/tablet/pda/syndicate name = "military PDA" greyscale_colors = "#891417#80FF80" diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 23885a8d8353..c8b9b6ac0df9 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -18,6 +18,8 @@ comp_light_luminosity = 2.3 //Same as the PDA looping_sound = FALSE + imprint_prefix = "PDA" + var/has_variants = TRUE var/finish_color = null @@ -27,6 +29,10 @@ var/note = "Congratulations on your station upgrading to the new NtOS and Thinktronic based collaboration effort, bringing you the best in electronics and software since 2467!" // the note used by the notekeeping app, stored here for convenience +/obj/item/modular_computer/tablet/Destroy() + QDEL_NULL(inserted_item) + return ..() + /obj/item/modular_computer/tablet/update_icon_state() if(has_variants && !bypass_state) if(!finish_color) @@ -58,6 +64,7 @@ return to_chat(user, span_notice("You insert \the [W] into \the [src].")) inserted_item = W + RegisterSignal(W, COMSIG_PARENT_QDELETING, PROC_REF(inserted_item_gone)) playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) if(istype(W, /obj/item/paper)) @@ -73,25 +80,30 @@ remove_pen(user) -/obj/item/modular_computer/tablet/CtrlClick(mob/user) +/obj/item/modular_computer/tablet/CtrlClick(mob/user, list/params) . = ..() if(.) return remove_pen(user) +/obj/item/modular_computer/tablet/proc/inserted_item_gone(datum/source) + SIGNAL_HANDLER + inserted_item = null + /obj/item/modular_computer/tablet/proc/tab_no_detonate() SIGNAL_HANDLER return COMPONENT_TABLET_NO_DETONATE /obj/item/modular_computer/tablet/proc/remove_pen(mob/user) - if(issilicon(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) //TK doesn't work even with this removed but here for readability + if(issilicon(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) //TK doesn't work even with this removed but here for readability return if(inserted_item) to_chat(user, span_notice("You remove [inserted_item] from [src].")) user.put_in_hands(inserted_item) + UnregisterSignal(inserted_item, COMSIG_PARENT_QDELETING) inserted_item = null update_appearance() playsound(src, 'sound/machines/pda_button2.ogg', 50, TRUE) @@ -126,35 +138,6 @@ // SUBTYPES -/obj/item/modular_computer/tablet/syndicate_contract_uplink - name = "contractor tablet" - icon = 'icons/obj/contractor_tablet.dmi' - icon_state = "tablet" - icon_state_unpowered = "tablet" - icon_state_powered = "tablet" - icon_state_menu = "assign" - w_class = WEIGHT_CLASS_SMALL - slot_flags = ITEM_SLOT_ID | ITEM_SLOT_BELT - comp_light_luminosity = 6.3 - has_variants = FALSE - -/obj/item/modular_computer/tablet/syndicate_contract_uplink/Initialize(mapload) - . = ..() - var/obj/item/computer_hardware/hard_drive/small/syndicate/hard_drive = new - var/datum/computer_file/program/contract_uplink/uplink = new - - active_program = uplink - uplink.program_state = PROGRAM_STATE_ACTIVE - uplink.computer = src - - hard_drive.store_file(uplink) - - install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) - install_component(hard_drive) - 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 icon_state = "tablet-syndicate" @@ -314,17 +297,21 @@ /obj/item/modular_computer/tablet/pda/Initialize(mapload) . = ..() - install_component(new /obj/item/computer_hardware/hard_drive/small) + var/obj/item/computer_hardware/hard_drive/small/hdd = new /obj/item/computer_hardware/hard_drive/small + install_component(hdd) install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer)) - install_component(new /obj/item/computer_hardware/network_card) + install_component(new /obj/item/computer_hardware/network_card/packetnet) install_component(new /obj/item/computer_hardware/card_slot) + var/datum/computer_file/data/text/autorun_file = new + autorun_file.filename = MC_AUTORUN_FILE + autorun_file.stored_text = "nt_messenger" + autorun_file.calculate_size() + hdd.store_file(autorun_file) + if(default_disk) var/obj/item/computer_hardware/hard_drive/portable/disk = new default_disk(src) install_component(disk) if(insert_type) inserted_item = new insert_type(src) - - spawn(-1) //Linter doesn't know this doesn't call ui_interact() w/o a user - turn_on() diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index bbd194c008d2..baefc003545c 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -52,11 +52,11 @@ hard_drive.store_file(new/datum/computer_file/program/aidiag()) hard_drive.store_file(new/datum/computer_file/program/robocontrol()) -// ===== COMMAND CONSOLE ===== +// ===== COMPANY CONSOLE ===== /obj/machinery/modular_computer/console/preset/command console_department = "Command" - name = "command console" - desc = "A stationary computer. This one comes preloaded with command programs." + name = "company console" + desc = "A stationary computer. This one comes preloaded with company programs." _has_second_id_slot = TRUE _has_printer = TRUE @@ -122,6 +122,14 @@ ///chat client installed on this computer, just helpful for linking all the computers var/datum/computer_file/program/chatclient/chatprogram +/obj/machinery/modular_computer/console/preset/cargochat/Initialize(mapload) + . = ..() + SET_TRACKING(__TYPE__) + +/obj/machinery/modular_computer/console/preset/cargochat/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/modular_computer/console/preset/cargochat/install_programs() var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD] chatprogram = new @@ -159,7 +167,7 @@ /obj/machinery/modular_computer/console/preset/cargochat/cargo/LateInitialize() . = ..() var/datum/ntnet_conversation/cargochat = SSnetworks.station_network.get_chat_channel_by_id(chatprogram.active_channel) - for(var/obj/machinery/modular_computer/console/preset/cargochat/cargochat_console in GLOB.machines) + for(var/obj/machinery/modular_computer/console/preset/cargochat/cargochat_console as anything in INSTANCES_OF(/obj/machinery/modular_computer/console/preset/cargochat)) if(cargochat_console == src) continue cargochat_console.chatprogram.active_channel = chatprogram.active_channel diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 829f3e5c8059..7536da426e3e 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -150,11 +150,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += cpu + EX_ACT(cpu, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += cpu + EX_ACT(cpu, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += cpu + EX_ACT(cpu, EXPLODE_LIGHT) return ..() // 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/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 08e77b8a9bbe..74fbd9a00017 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -35,3 +35,19 @@ temp.filename = filename temp.filetype = filetype return temp + +/// Called when this file is added to a hard drive. +/datum/computer_file/proc/added_to_drive(obj/item/computer_hardware/hard_drive/drive) + return + +/// Called when this file is removed from a hard drive. +/datum/computer_file/proc/deleted_from_drive(obj/item/computer_hardware/hard_drive/drive) + return + +/// Called when this file is added to a hard drive inside a computer or the hardrive containing it was added. +/datum/computer_file/proc/added_to_computer(computer) + return + +/// Called when this file is removed from a hard drive inside a computer or the hardrive containing it was removed. +/datum/computer_file/proc/removed_from_computer(computer) + return diff --git a/code/modules/modular_computers/file_system/program_events.dm b/code/modules/modular_computers/file_system/program_events.dm index c11b1066bd22..52a6f3e911ec 100644 --- a/code/modules/modular_computers/file_system/program_events.dm +++ b/code/modules/modular_computers/file_system/program_events.dm @@ -1,18 +1,35 @@ // Events are sent to the program by the computer. // Always include a parent call when overriding an event. -// Called when the ID card is removed from computer. ID is removed AFTER this proc. -/datum/computer_file/program/proc/event_idremoved(background) +/// Called when an ID card is added to the computer. +/datum/computer_file/program/proc/event_id_inserted(background, device_type) + SHOULD_CALL_PARENT(TRUE) + return +/// Called when an ID card is removed from computer. +/datum/computer_file/program/proc/event_id_removed(background, device_type) + SHOULD_CALL_PARENT(TRUE) return // Called when the computer fails due to power loss. Override when program wants to specifically react to power loss. /datum/computer_file/program/proc/event_powerfailure(background) + SHOULD_CALL_PARENT(TRUE) kill_program(forced = TRUE) // Called when the network connectivity fails. Computer does necessary checks and only calls this when requires_ntnet_feature and similar variables are not met. /datum/computer_file/program/proc/event_networkfailure(background) + SHOULD_CALL_PARENT(TRUE) kill_program(forced = TRUE) if(background) - computer.visible_message(span_danger("\The [computer]'s screen displays a \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error")) + computer.visible_message( + span_alert("\The [computer]'s screen displays a \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - Network Error\" error"), + vision_distance = COMBAT_MESSAGE_RANGE, + ) else - computer.visible_message(span_danger("\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error.")) + computer.visible_message( + span_alert("\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - NTNet connection lost. Please retry. If problem persists contact your system administrator.\" error."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + +/datum/computer_file/program/proc/event_hardware_changed(background) + SHOULD_CALL_PARENT(TRUE) + return diff --git a/code/modules/modular_computers/file_system/programs/airestorer.dm b/code/modules/modular_computers/file_system/programs/airestorer.dm index b2c053ab1095..fdf0ccd2f7f9 100644 --- a/code/modules/modular_computers/file_system/programs/airestorer.dm +++ b/code/modules/modular_computers/file_system/programs/airestorer.dm @@ -7,7 +7,7 @@ size = 12 requires_ntnet = FALSE usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP - transfer_access = list(ACCESS_HEADS) + transfer_access = list(ACCESS_MANAGEMENT) available_on_ntnet = TRUE tgui_id = "NtosAiRestorer" program_icon = "laptop-code" @@ -24,7 +24,7 @@ if(computer && ai_slot?.check_functionality()) if(cardcheck == 1) return ai_slot - if(ai_slot.enabled && ai_slot.stored_card) + if(ai_slot.is_enabled() && ai_slot.stored_card) if(cardcheck == 2) return ai_slot.stored_card if(ai_slot.stored_card.AI) @@ -45,7 +45,7 @@ if("PRG_beginReconstruction") if(A && A.health < 100) restoring = TRUE - A.notify_ghost_cloning("Your core files are being restored!", source = computer) + A.notify_ghost_revival("Your core files are being restored!", source = computer) return TRUE if("PRG_eject") if(computer.all_components[MC_AI]) diff --git a/code/modules/modular_computers/file_system/programs/alarm.dm b/code/modules/modular_computers/file_system/programs/alarm.dm index ddab298ae59f..7e41eea66e4e 100644 --- a/code/modules/modular_computers/file_system/programs/alarm.dm +++ b/code/modules/modular_computers/file_system/programs/alarm.dm @@ -50,11 +50,3 @@ has_alert = FALSE if(length(alert_control.listener.alarms)) has_alert = TRUE - -/datum/computer_file/program/alarm_monitor/run_program(mob/user) - . = ..(user) - GLOB.alarmdisplay += src - -/datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE) - GLOB.alarmdisplay -= src - return ..() diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index 3928700d71fc..e34aef03716c 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -64,7 +64,21 @@ return FALSE -/datum/computer_file/program/budgetorders/ui_data() +/datum/computer_file/program/budgetorders/proc/can_purchase_pack(datum/supply_pack/pack) + . = TRUE + if(pack.supply_flags & SUPPLY_PACK_DROPPOD_ONLY) + return FALSE + + if((pack.supply_flags & SUPPLY_PACK_EMAG)) + return FALSE + + if(pack.special && !pack.special_enabled) + return FALSE + + if((pack.supply_flags & SUPPLY_PACK_CONTRABAND) && !contraband) + return FALSE + +/datum/computer_file/program/budgetorders/ui_data(mob/user) . = ..() var/list/data = get_header_data() data["location"] = SSshuttle.supply.getStatusText() @@ -72,7 +86,7 @@ var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] var/obj/item/card/id/id_card = card_slot?.GetID() if(id_card?.registered_account) - if((ACCESS_HEADS in id_card.access) || (ACCESS_QM in id_card.access)) + if((ACCESS_MANAGEMENT in id_card.access) || (ACCESS_QM in id_card.access)) requestonly = FALSE buyer = SSeconomy.department_accounts_by_id[id_card.registered_account.account_job.paycheck_department] can_approve_requests = TRUE @@ -89,15 +103,18 @@ data["supplies"] = list() for(var/pack in SSshuttle.supply_packs) var/datum/supply_pack/P = SSshuttle.supply_packs[pack] - if(!is_visible_pack(usr, P.access_view , null, P.contraband) || P.hidden) + if(!is_visible_pack(user, P.access_view , null, (P.supply_flags & SUPPLY_PACK_CONTRABAND))) + continue + + if(!can_purchase_pack(P)) continue + if(!data["supplies"][P.group]) data["supplies"][P.group] = list( "name" = P.group, "packs" = list() ) - if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)) - continue + data["supplies"][P.group]["packs"] += list(list( "name" = P.name, "cost" = P.get_cost(), @@ -190,7 +207,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) return - if(pack.hidden || pack.contraband || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + if(!can_purchase_pack(pack)) return var/name = "*None Provided*" diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 4bc2890630d5..3a1b4b7db83a 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -4,7 +4,7 @@ category = PROGRAM_CATEGORY_CREW program_icon_state = "id" extended_desc = "Program for programming employee ID cards to access parts of the station." - transfer_access = list(ACCESS_HEADS) + transfer_access = list(ACCESS_MANAGEMENT) requires_ntnet = 0 size = 8 tgui_id = "NtosCard" @@ -148,7 +148,7 @@ if(!computer || !card_slot2) return TRUE if(target_id_card) - GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.assignment, target_id_card.get_trim_assignment()) + SSdatacore.manifest_modify(target_id_card.registered_name, target_id_card.assignment, target_id_card.get_trim_assignment()) return card_slot2.try_eject(user) else var/obj/item/I = user.get_active_held_item() diff --git a/code/modules/modular_computers/file_system/programs/configurator.dm b/code/modules/modular_computers/file_system/programs/configurator.dm index 459ddc1b7910..5f7d9b723d37 100644 --- a/code/modules/modular_computers/file_system/programs/configurator.dm +++ b/code/modules/modular_computers/file_system/programs/configurator.dm @@ -42,7 +42,7 @@ all_entries.Add(list(list( "name" = H.name, "desc" = H.desc, - "enabled" = H.enabled, + "enabled" = H.is_enabled(), "critical" = H.critical, "powerusage" = H.power_usage ))) @@ -59,5 +59,5 @@ if("PC_toggle_component") var/obj/item/computer_hardware/H = computer.find_hardware_by_name(params["name"]) if(H && istype(H)) - H.enabled = !H.enabled + H.enable_changed(!H.is_enabled()) . = TRUE diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index 38bef28d4178..b1a811072b2d 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -1,18 +1,20 @@ /datum/computer_file/program/crew_manifest filename = "plexagoncrew" - filedesc = "Plexagon Crew List" + filedesc = "Staff List" category = PROGRAM_CATEGORY_CREW program_icon_state = "id" - extended_desc = "Program for viewing and printing the current crew manifest" - transfer_access = list(ACCESS_HEADS) + extended_desc = "Program for viewing and printing the current staff manifest" + transfer_access = list(ACCESS_MANAGEMENT) requires_ntnet = TRUE size = 4 tgui_id = "NtosCrewManifest" program_icon = "clipboard-list" + var/manifest_key = DATACORE_RECORDS_STATION + /datum/computer_file/program/crew_manifest/ui_static_data(mob/user) var/list/data = list() - data["manifest"] = GLOB.data_core.get_manifest() + data["manifest"] = SSdatacore.get_manifest(manifest_key) return data /datum/computer_file/program/crew_manifest/ui_data(mob/user) @@ -26,6 +28,8 @@ data["have_printer"] = !!printer else data["have_printer"] = FALSE + + data["manifest_key"] = manifest_key || FALSE return data /datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui) @@ -40,12 +44,76 @@ switch(action) if("PRG_print") if(computer && printer) //This option should never be called if there is no printer - var/contents = {"

Crew Manifest

+ var/contents = {"

Staff Manifest


- [GLOB.data_core ? GLOB.data_core.get_manifest_html(0) : ""] + [SSdatacore.get_manifest_html(manifest_key)] "} - if(!printer.print_text(contents,text("crew manifest ([])", stationtime2text()))) + if(!printer.print_text(contents, "staff manifest ([stationtime2text()])")) to_chat(usr, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper.")) return else computer.visible_message(span_notice("\The [computer] prints out a paper.")) + +/datum/computer_file/program/crew_manifest/event_id_removed(background, device_type) + . = ..() + if(background) + return + + update_manifest_key() + +/datum/computer_file/program/crew_manifest/event_id_inserted(background, device_type) + . = ..() + if(background) + return + + update_manifest_key() + +/datum/computer_file/program/crew_manifest/run_program(mob/living/user) + . = ..() + if(.) + update_manifest_key() + +/datum/computer_file/program/crew_manifest/proc/update_manifest_key() + . = manifest_key + + var/obj/item/modular_computer/parent = holder?.holder + if(!parent) + manifest_key = null + if(. != manifest_key) + update_static_data_for_all() + return + + if(istype(parent, /obj/item/modular_computer/tablet/integrated)) + manifest_key = DATACORE_RECORDS_STATION + if(. != manifest_key) + update_static_data_for_all() + return + + var/obj/item/computer_hardware/card_slot/card_slot = parent.all_components[MC_CARD] || parent.all_components[MC_CARD2] + var/list/access = card_slot?.GetAccess() + if(!length(access)) + manifest_key = null + if(. != manifest_key) + update_static_data_for_all() + return + + if(ACCESS_MANAGEMENT in access) + manifest_key = DATACORE_RECORDS_STATION + + else if(ACCESS_MEDICAL in access) + manifest_key = DATACORE_RECORDS_AETHER + + else if(ACCESS_ENGINE in access) + manifest_key = DATACORE_RECORDS_DAEDALUS + + else if(ACCESS_CARGO in access) + manifest_key = DATACORE_RECORDS_HERMES + + else if(ACCESS_SECURITY in access) + manifest_key = DATACORE_RECORDS_MARS + + else + manifest_key = null + + if(. != manifest_key) + update_static_data_for_all() diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index c7d4ce2d06d8..6162262b1575 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -7,7 +7,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) category = PROGRAM_CATEGORY_CREW program_icon_state = "id" extended_desc = "Program for viewing and changing job slot availability." - transfer_access = list(ACCESS_HEADS) + transfer_access = list(ACCESS_MANAGEMENT) requires_ntnet = TRUE size = 4 tgui_id = "NtosJobManager" @@ -18,10 +18,9 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) var/list/blacklisted = list( JOB_CAPTAIN, JOB_HEAD_OF_PERSONNEL, - JOB_HEAD_OF_SECURITY, - JOB_RESEARCH_DIRECTOR, + JOB_SECURITY_MARSHAL, JOB_CHIEF_ENGINEER, - JOB_CHIEF_MEDICAL_OFFICER, + JOB_MEDICAL_DIRECTOR, JOB_AI, JOB_CYBORG, JOB_ASSISTANT, diff --git a/code/modules/modular_computers/file_system/programs/ntmessenger.dm b/code/modules/modular_computers/file_system/programs/ntmessenger.dm index 20ca687a749a..3b15cca2c613 100644 --- a/code/modules/modular_computers/file_system/programs/ntmessenger.dm +++ b/code/modules/modular_computers/file_system/programs/ntmessenger.dm @@ -1,6 +1,8 @@ +// PDA Message Nonsense: https://hackmd.io/OajA9tVpS-K7xA68t6gv8Q + /datum/computer_file/program/messenger filename = "nt_messenger" - filedesc = "Direct Messenger" + filedesc = "Messenger" category = PROGRAM_CATEGORY_MISC program_icon_state = "command" program_state = PROGRAM_STATE_BACKGROUND @@ -17,84 +19,280 @@ var/ringtone = "beep" /// Whether or not the ringtone is currently on. var/ringer_status = TRUE - /// Whether or not we're sending and receiving messages. - var/sending_and_receiving = TRUE /// The messages currently saved in the app. var/messages = list() /// great wisdom from PDA.dm - "no spamming" (prevents people from spamming the same message over and over) var/last_text /// even more wisdom from PDA.dm - "no everyone spamming" (prevents people from spamming the same message over and over) var/last_text_everyone - /// Scanned photo for sending purposes. - var/datum/picture/picture - /// Whether or not we allow emojis to be sent by the user. - var/allow_emojis = FALSE /// Whether or not we're currently looking at the message list. var/viewing_messages = FALSE - // Whether or not this device is currently hidden from the message monitor. - var/monitor_hidden = FALSE // Whether or not we're sorting by job. var/sort_by_job = TRUE // Whether or not we're sending (or trying to send) a virus. var/sending_virus = FALSE - /// The path for the current loaded image in rsc - var/photo_path /// Whether or not this app is loaded on a silicon's tablet. var/is_silicon = FALSE /// Whether or not we're in a mime PDA. var/mime_mode = FALSE -/datum/computer_file/program/messenger/proc/ScrubMessengerList() - var/list/dictionary = list() + /// Cache of the network card, so we don't need to drag it out of the list every time. + var/obj/item/computer_hardware/network_card/packetnet/netcard_cache + /// Learned PDA info tuples + /// + ///list(d_addr1 = list(d_addr1, name, job), d_addr2=list(d_addr2, name, job),...) + var/list/known_cells = list() + - for(var/obj/item/modular_computer/messenger in GetViewableDevices(sort_by_job)) - if(messenger.saved_identification && messenger.saved_job && !(messenger == computer)) - var/list/data = list() - data["name"] = messenger.saved_identification - data["job"] = messenger.saved_job - data["ref"] = REF(messenger) +/datum/computer_file/program/messenger/ui_state(mob/user) + if(istype(user, /mob/living/silicon)) + return GLOB.reverse_contained_state + return GLOB.default_state + +/datum/computer_file/program/messenger/can_run(mob/user, loud, access_to_check, transfer, list/access) + . = ..() + if(!. || transfer) //Already declined for other reason. + //Or We're checking just download access here, not runtime compatibility + return . + var/obj/item/computer_hardware/network_card/packetnet/pnetcard = computer.all_components[MC_NET] + if(!istype(pnetcard)) + if(loud) + to_chat(user, span_danger("\The [computer] flashes a \"GPRS Error - Incompatible Network card\" warning.")) + return FALSE + +/datum/computer_file/program/messenger/event_hardware_changed(background) + . = ..() + if(netcard_cache != computer.all_components[MC_NET]) + if(background) + computer.visible_message(span_danger("\The [computer]'s screen displays a \"Process [filename].[filetype] (PID [rand(100,999)]) terminated - GPRS hardware error\" error")) + else + computer.visible_message(span_danger("\The [computer]'s screen briefly freezes and then shows \"NETWORK ERROR - GPRS hardware error. Verify hardware presence or contact a certified technician.\" error.")) + kill_program(TRUE) + +/datum/computer_file/program/messenger/run_program(mob/living/user) + . = ..() + if(!.) + return + //If we got here, it's safe to assume this, probably. + netcard_cache = computer.all_components[MC_NET] + +/datum/computer_file/program/messenger/process_tick(delta_time) + . = ..() + while(netcard_cache.check_queue()) + process_signal(netcard_cache.pop_signal()) + +/datum/computer_file/program/messenger/kill_program(forced) + . = ..() + netcard_cache = null + +/datum/computer_file/program/messenger/proc/process_signal(datum/signal/signal) + if(!signal) + CRASH("Messenger program attempted to process null signal??") + var/list/signal_data = signal.data + if(!signal_data) + return + var/signal_command = signal_data[PACKET_CMD] + //Network ID verification is "hardware accelerated" (AKA: Done for us by the card) + + var/rigged = FALSE//are we going to explode? + + //Due to BYOND's lack of dynamic switch statements, we get to run this massive ifchain.. + + // "Exploiting a bug" my ass this shit is going to suck to write. + // ESPECIALLY THIS FUCKER RIGHT HERE vvvv + if(signal_data[SSpackets.pda_exploitable_register] == SSpackets.detomatix_magic_packet) + //This one falls through to standard PDA behaviour, so we need to be checked first. + if(signal_data[PACKET_DESTINATION_ADDRESS] == netcard_cache.hardware_id)//No broadcast bombings, fuck off. + //Calculate our "difficulty" + var/difficulty + var/obj/item/computer_hardware/hard_drive/role/our_jobdisk = computer.all_components[MC_HDD_JOB] + if(our_jobdisk) + difficulty += bit_count(our_jobdisk & (DISK_MED | DISK_SEC | DISK_POWER | DISK_MANIFEST)) + if(our_jobdisk.disk_flags & DISK_MANIFEST) + difficulty++ //if cartridge has manifest access it has extra snowflake difficulty + if(!((SEND_SIGNAL(computer, COMSIG_TABLET_CHECK_DETONATE) & COMPONENT_TABLET_NO_DETONATE) || prob(difficulty * 15))) + rigged = TRUE //Cool, we're allowed to blow up. Really glad this whole check wasn't for nothing. + var/trait_timer_key = signal_data[PACKET_SOURCE_ADDRESS] + ADD_TRAIT(computer, TRAIT_PDA_CAN_EXPLODE, trait_timer_key) + ADD_TRAIT(computer, TRAIT_PDA_MESSAGE_MENU_RIGGED, trait_timer_key) + addtimer(TRAIT_CALLBACK_REMOVE(computer, TRAIT_PDA_MESSAGE_MENU_RIGGED, trait_timer_key), 10 SECONDS) + //Intentional fallthrough. + + if(signal_command == NETCMD_PDAMESSAGE) + log_message( + signal_data["name"] || "#UNK", + signal_data["job"] || "#UNK", + html_decode("\"[signal_data["message"]]\"") || "#ERROR_MISSING_FIELD", + FALSE, + signal_data["automated"] || FALSE, + signal_data[PACKET_SOURCE_ADDRESS] || null + ) + + if(ringer_status) + computer.ring(ringtone) - //if(data["ref"] != REF(computer)) // you cannot message yourself (despite all my rage) - dictionary += list(data) + if(computer.hardware_flag == PROGRAM_TABLET) //We need to render the extraneous bullshit to chat. + show_in_chat(signal_data, rigged) + return - return dictionary + if(signal_data[SSpackets.pda_exploitable_register] == SSpackets.clownvirus_magic_packet) + computer.honkamnt = rand(15, 25) + return -/proc/GetViewableDevices(sort_by_job = FALSE) - var/list/dictionary = list() + if(signal_data[SSpackets.pda_exploitable_register] == SSpackets.mimevirus_magic_packet) + ringer_status = FALSE + ringtone = "" + return - var/sortmode - if(sort_by_job) - sortmode = /proc/cmp_pdajob_asc + if(signal_data[SSpackets.pda_exploitable_register] == SSpackets.framevirus_magic_packet) + if(computer.hardware_flag != PROGRAM_TABLET) + return //If it's not a PDA, too bad! + if(!(signal.has_magic_data & MAGIC_DATA_MUST_OBFUSCATE)) + return //Must be obfuscated, due to the ability to create uplinkss. + + var/datum/component/uplink/hidden_uplink = computer.GetComponent(/datum/component/uplink) + if(!hidden_uplink) + var/datum/mind/target_mind + var/list/backup_players = list() + for(var/datum/mind/player as anything in get_crewmember_minds()) + if(player.assigned_role?.title == computer.saved_job) + backup_players += player + if(player.name == computer.saved_identification) + target_mind = player + break + if(!target_mind) + if(!length(backup_players)) + target_mind = signal_data["fallback_mind"] //yea... + else + target_mind = pick(backup_players) + hidden_uplink = computer.AddComponent(/datum/component/uplink, target_mind, enabled = TRUE, starting_tc = signal_data["telecrystals"], has_progression = TRUE) + hidden_uplink.uplink_handler.has_objectives = TRUE + hidden_uplink.uplink_handler.owner = target_mind + hidden_uplink.uplink_handler.can_take_objectives = FALSE + hidden_uplink.uplink_handler.progression_points = min(SStraitor.current_global_progression, signal_data["current_progression"]) + hidden_uplink.uplink_handler.generate_objectives() + SStraitor.register_uplink_handler(hidden_uplink.uplink_handler) + else + hidden_uplink.add_telecrystals(signal_data["telecrystals"]) + //Unlock it regardless of if we created it or not. + hidden_uplink.locked = FALSE + hidden_uplink.active = TRUE + +/datum/computer_file/program/messenger/proc/show_in_chat(list/signal_data, rigged) + var/mob/living/L = null + if(holder.holder.loc && isliving(holder.holder.loc)) + L = holder.holder.loc + //Maybe they are a pAI! else - sortmode = /proc/cmp_pdaname_asc + L = get(holder.holder, /mob/living/silicon) - for(var/obj/item/modular_computer/P in sort_list(GLOB.TabletMessengers, sortmode)) - var/obj/item/computer_hardware/hard_drive/drive = P.all_components[MC_HDD] - if(!drive) - continue - for(var/datum/computer_file/program/messenger/app in drive.stored_files) - if(!P.saved_identification || !P.saved_job || P.invisible || app.monitor_hidden) - continue - dictionary += P + if(L && L.stat == CONSCIOUS) + var/reply = "(Reply)" + var/hrefstart + var/hrefend + var/job_string = signal_data["job"] ? " ([signal_data["job"]])" : "" + if (isAI(L)) + hrefstart = "" + hrefend = "" - return dictionary + if(signal_data[PACKET_SOURCE_ADDRESS] == null) + reply = "\[#ERRNOADDR\]" -/datum/computer_file/program/messenger/proc/StringifyMessengerTarget(obj/item/modular_computer/messenger) - return "[messenger.saved_identification] ([messenger.saved_job])" + if(signal_data["automated"]) + reply = "\[Automated Message\]" -/datum/computer_file/program/messenger/proc/ProcessPhoto() - if(computer.saved_image) - var/icon/img = computer.saved_image.picture_image - var/deter_path = "tmp_msg_photo[rand(0, 99999)].png" - usr << browse_rsc(img, deter_path) // funny random assignment for now, i'll make an actual key later - photo_path = deter_path -/datum/computer_file/program/messenger/ui_state(mob/user) - if(istype(user, /mob/living/silicon)) - return GLOB.reverse_contained_state - return GLOB.default_state + var/inbound_message = "\"[signal_data["message"]]\"" + inbound_message = emoji_parse(inbound_message) + + if(ringer_status) + to_chat(L, "[icon2html(src)] PDA message from [hrefstart][signal_data["name"]][job_string][hrefend], [inbound_message] [reply]") + +/datum/computer_file/program/messenger/Topic(href, href_list) + ..() + + if(!href_list["close"] && usr.canUseTopic(computer, USE_CLOSE|USE_IGNORE_TK)) + switch(href_list["choice"]) + if("Message") + send_message(usr, href_list["target"]) + if("Mess_us_up") + if(!HAS_TRAIT(src, TRAIT_PDA_CAN_EXPLODE)) + var/obj/item/modular_computer/tablet/comp = computer + comp.explode(usr, from_message_menu = TRUE) + return + +/datum/computer_file/program/messenger/proc/msg_input(mob/living/U = usr) + var/text_message = null + + if(mime_mode) + text_message = emoji_sanitize(tgui_input_text(U, "Enter emojis", "NT Messaging")) + else + text_message = tgui_input_text(U, "Enter a message", "NT Messaging") + + if (!text_message || !netcard_cache.radio_state) + return + if(!U.canUseTopic(computer, USE_CLOSE)) + return + return sanitize(text_message) + +/datum/computer_file/program/messenger/proc/send_message(mob/living/user, target_address, everyone = FALSE, staple = null, fake_name = null, fake_job = null) + var/message = msg_input(user) + if(!message) + return + if(!netcard_cache.radio_state) + to_chat(usr, span_notice("ERROR: GPRS Modem Disabled.")) + return + if((last_text && world.time < last_text + 10) || (everyone && last_text_everyone && world.time < last_text_everyone + 2 MINUTES)) + return FALSE + + var/turf/position = get_turf(computer) + for(var/obj/item/jammer/jammer as anything 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 FALSE + + var/list/filter_result = CAN_BYPASS_FILTER(user) ? null : is_ic_filtered_for_pdas(message) + if (filter_result) + REPORT_CHAT_FILTER_TO_USER(user, filter_result) + return FALSE + + var/list/soft_filter_result = CAN_BYPASS_FILTER(user) ? null : is_soft_ic_filtered_for_pdas(message) + if (soft_filter_result) + if(tgui_alert(usr,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to send it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return FALSE + message_admins("[ADMIN_LOOKUPFLW(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term in PDA messages. Message: \"[html_encode(message)]\"") + log_admin_private("[key_name(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term in PDA messages. Message: \"[message]\"") + + // Send the signal + var/datum/signal/pda_message = new( + src, + list( + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = fake_name || computer.saved_identification, + "job" = fake_job || computer.saved_job, + "message" = html_decode(message), + PACKET_DESTINATION_ADDRESS = target_address + ), + logging_data = user + ) + netcard_cache.post_signal(pda_message) + // Log it in our logs + log_message(fake_name || computer.saved_identification,fake_job || computer.saved_job,html_decode(message),TRUE,FALSE,target_address) + +/datum/computer_file/program/messenger/proc/log_message(name, job, message, outgoing, automated, reply_addr) + var/list/message_data = list( + "name" = name, + "job" = job, + "contents" = message, + "outgoing" = outgoing, + //If there's no reply address, pretend it's automated so we don't give them a null link + "automated" = !reply_addr || automated, + "target_addr" = reply_addr, + ) + + messages += list(message_data) //Needs to be wrapped for engine reasons. /datum/computer_file/program/messenger/ui_act(action, list/params, datum/tgui/ui) . = ..() @@ -105,7 +303,8 @@ if("PDA_ringSet") var/t = tgui_input_text(usr, "Enter a new ringtone", "Ringtone", "", 20) var/mob/living/usr_mob = usr - if(in_range(computer, usr_mob) && computer.loc == usr_mob && t) + //This is uplink shit. If it's not a tablet, we only care about the basic range check. + if(in_range(computer, usr_mob) && (computer.hardware_flag == PROGRAM_TABLET && computer.loc == usr_mob) && t) if(SEND_SIGNAL(computer, COMSIG_TABLET_CHANGE_ID, usr_mob, t) & COMPONENT_STOP_RINGTONE_CHANGE) return else @@ -115,7 +314,7 @@ ringer_status = !ringer_status return(UI_UPDATE) if("PDA_sAndR") - sending_and_receiving = !sending_and_receiving + netcard_cache.set_radio_state(!netcard_cache.radio_state) return(UI_UPDATE) if("PDA_viewMessages") viewing_messages = !viewing_messages @@ -127,51 +326,40 @@ sort_by_job = !sort_by_job return(UI_UPDATE) if("PDA_sendEveryone") - if(!sending_and_receiving) - to_chat(usr, span_notice("ERROR: Device has sending disabled.")) + if(!netcard_cache.radio_state) + to_chat(usr, span_notice("ERROR: GPRS Modem Disabled.")) return - - var/list/targets = list() - - for(var/obj/item/modular_computer/mc in GetViewableDevices()) - targets += mc - - if(targets.len > 0) - send_message(usr, targets, TRUE) + //So much easier with GPRS. + send_message(usr, null, TRUE) return(UI_UPDATE) if("PDA_sendMessage") - if(!sending_and_receiving) - to_chat(usr, span_notice("ERROR: Device has sending disabled.")) + if(!netcard_cache.radio_state) + to_chat(usr, span_notice("ERROR: GPRS Modem Disabled.")) return - var/obj/item/modular_computer/target = locate(params["ref"]) - if(!target) - return // we don't want tommy sending his messages to nullspace - if(!(target.saved_identification == params["name"] && target.saved_job == params["job"])) - to_chat(usr, span_notice("ERROR: User no longer exists.")) - return - - var/obj/item/computer_hardware/hard_drive/drive = target.all_components[MC_HDD] - - for(var/datum/computer_file/program/messenger/app in drive.stored_files) - if(!app.sending_and_receiving && !sending_virus) - to_chat(usr, span_notice("ERROR: Device has receiving disabled.")) - return - if(sending_virus) - var/obj/item/computer_hardware/hard_drive/role/virus/disk = computer.all_components[MC_HDD_JOB] - if(istype(disk)) - disk.send_virus(target, usr) - return(UI_UPDATE) - send_message(usr, list(target)) - return(UI_UPDATE) - if("PDA_clearPhoto") - computer.saved_image = null - photo_path = null + var/target_addr = params["target_addr"] + if(sending_virus) + var/obj/item/computer_hardware/hard_drive/role/virus/disk = computer.all_components[MC_HDD_JOB] + if(istype(disk)) + disk.send_virus(target_addr, usr) + return(UI_UPDATE) + send_message(usr, target_addr) return(UI_UPDATE) if("PDA_toggleVirus") sending_virus = !sending_virus return(UI_UPDATE) - + if("PDA_scanForPDAs") + var/obj/item/computer_hardware/network_card/packetnet/pnetcard = computer.all_components[MC_NET] + pnetcard.known_pdas = list() //Flush. + if(!istype(pnetcard)) //This catches nulls too, so... + to_chat(usr, span_warning("Radio missing or bad driver!")) + var/datum/signal/ping_sig = new(src, list( + PACKET_DESTINATION_ADDRESS = NET_ADDRESS_PING, + "pda_scan" = "true" + )) + pnetcard.post_signal(ping_sig) + // The UI update loop from the computer will handle the scan refresh. + return(UI_UPDATE) /datum/computer_file/program/messenger/ui_data(mob/user) var/list/data = get_header_data() @@ -181,12 +369,11 @@ data["owner"] = computer.saved_identification data["messages"] = messages data["ringer_status"] = ringer_status - data["sending_and_receiving"] = sending_and_receiving - data["messengers"] = ScrubMessengerList() + data["sending_and_receiving"] = netcard_cache.radio_state + data["messengers"] = netcard_cache.known_pdas data["viewing_messages"] = viewing_messages data["sortByJob"] = sort_by_job data["isSilicon"] = is_silicon - data["photo"] = photo_path if(disk) data["canSpam"] = disk.CanSpam() @@ -194,185 +381,3 @@ data["sending_virus"] = sending_virus return data - -//////////////////////// -// MESSAGE HANDLING -//////////////////////// - -// How I Learned To Stop Being A PDA Bloat Chump And Learn To Embrace The Lightweight - -// Gets the input for a message being sent. - -/datum/computer_file/program/messenger/proc/msg_input(mob/living/U = usr, rigged = FALSE) - var/t = null - - if(mime_mode) - t = emoji_sanitize(tgui_input_text(U, "Enter emojis", "NT Messaging")) - else - t = tgui_input_text(U, "Enter a message", "NT Messaging") - - if (!t || !sending_and_receiving) - return - if(!U.canUseTopic(computer, BE_CLOSE)) - return - return sanitize(t) - -/datum/computer_file/program/messenger/proc/send_message(mob/living/user, list/obj/item/modular_computer/targets, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) - var/message = msg_input(user, rigged) - if(!message || !targets.len) - return FALSE - if((last_text && world.time < last_text + 10) || (everyone && last_text_everyone && world.time < last_text_everyone + 2 MINUTES)) - return FALSE - - var/turf/position = get_turf(computer) - for(var/obj/item/jammer/jammer as anything 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 FALSE - - var/list/filter_result = CAN_BYPASS_FILTER(user) ? null : is_ic_filtered_for_pdas(message) - if (filter_result) - REPORT_CHAT_FILTER_TO_USER(user, filter_result) - return FALSE - - var/list/soft_filter_result = CAN_BYPASS_FILTER(user) ? null : is_soft_ic_filtered_for_pdas(message) - if (soft_filter_result) - if(tgui_alert(usr,"Your message contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to send it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") - return FALSE - message_admins("[ADMIN_LOOKUPFLW(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term in PDA messages. Message: \"[html_encode(message)]\"") - log_admin_private("[key_name(usr)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term in PDA messages. Message: \"[message]\"") - - // Send the signal - var/list/string_targets = list() - for (var/obj/item/modular_computer/comp in targets) - if (comp.saved_identification && comp.saved_job) // != src is checked by the UI - string_targets += STRINGIFY_PDA_TARGET(comp.saved_identification, comp.saved_job) - - if (!string_targets.len) - return FALSE - - var/datum/signal/subspace/messaging/tablet_msg/signal = new(computer, list( - "name" = fake_name || computer.saved_identification, - "job" = fake_job || computer.saved_job, - "message" = html_decode(message), - "ref" = REF(computer), - "targets" = targets, - "emojis" = allow_emojis, - "rigged" = rigged, - "photo" = photo_path, - "automated" = FALSE, - )) - if(rigged) //Will skip the message server and go straight to the hub so it can't be cheesed by disabling the message server machine - signal.data["rigged_user"] = REF(user) // Used for bomb logging - signal.server_type = /obj/machinery/telecomms/hub - signal.data["reject"] = FALSE // Do not refuse the message - - signal.send_to_receivers() - - // If it didn't reach, note that fact - if (!signal.data["done"]) - to_chat(user, span_notice("ERROR: Server isn't responding.")) - if(ringer_status) - playsound(src, 'sound/machines/terminal_error.ogg', 15, TRUE) - return FALSE - - if(allow_emojis) - message = emoji_parse(message)//already sent- this just shows the sent emoji as one to the sender in the to_chat - signal.data["message"] = emoji_parse(signal.data["message"]) - - // Log it in our logs - var/list/message_data = list() - message_data["name"] = signal.data["name"] - message_data["job"] = signal.data["job"] - message_data["contents"] = html_decode(signal.format_message()) - message_data["outgoing"] = TRUE - message_data["ref"] = signal.data["ref"] - message_data["photo"] = signal.data["photo"] - - // Show it to ghosts - var/ghost_message = span_name("[message_data["name"]]
[rigged ? "Rigged" : ""] PDA Message --> [span_name("[signal.format_target()]")]: [signal.format_message()]") - for(var/mob/M in GLOB.player_list) - if(isobserver(M) && (M.client?.prefs.chat_toggles & CHAT_GHOSTPDA)) - to_chat(M, "[FOLLOW_LINK(M, user)] [ghost_message]") - - // Log in the talk log - user.log_talk(message, LOG_PDA, tag="[rigged ? "Rigged" : ""] PDA: [initial(message_data["name"])] to [signal.format_target()]") - if(rigged) - log_bomber(user, "sent a rigged PDA message (Name: [message_data["name"]]. Job: [message_data["job"]]) to [english_list(string_targets)] [!is_special_character(user) ? "(SENT BY NON-ANTAG)" : ""]") - to_chat(user, span_info("PDA message sent to [signal.format_target()]: [signal.format_message()]")) - - if (ringer_status) - computer.send_sound() - - last_text = world.time - if (everyone) - message_data["name"] = "Everyone" - message_data["job"] = "" - last_text_everyone = world.time - - messages += list(message_data) - return TRUE - -/datum/computer_file/program/messenger/proc/receive_message(datum/signal/subspace/messaging/tablet_msg/signal) - var/list/message_data = list() - message_data["name"] = signal.data["name"] - message_data["job"] = signal.data["job"] - message_data["contents"] = signal.format_message() - message_data["outgoing"] = FALSE - message_data["ref"] = signal.data["ref"] - message_data["automated"] = signal.data["automated"] - message_data["photo"] = signal.data["photo"] - messages += list(message_data) - - var/mob/living/L = null - if(holder.holder.loc && isliving(holder.holder.loc)) - L = holder.holder.loc - //Maybe they are a pAI! - else - L = get(holder.holder, /mob/living/silicon) - - if(L && (L.stat == CONSCIOUS || L.stat == SOFT_CRIT)) - var/reply = "(Reply)" - var/hrefstart - var/hrefend - if (isAI(L)) - hrefstart = "" - hrefend = "" - - if(signal.data["automated"]) - reply = "\[Automated Message\]" - - var/inbound_message = signal.format_message() - if(signal.data["emojis"] == TRUE)//so will not parse emojis as such from pdas that don't send emojis - inbound_message = emoji_parse(inbound_message) - - if(ringer_status) - to_chat(L, "[icon2html(src)] PDA message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message] [reply]") - - - if (ringer_status) - if(!computer) - message_admins("Messenger Program exists with no computer, [ADMIN_VV(src)]"); - var/message = "Messenger Program with no computer." - if(QDELETED(src)) - message += " \[Messenger is qdeleted!\]" - if(QDELETED(holder)) - if(isnull(holder)) - message += " \[Messenger is not in a harddrive!\]" - else - message += " \[Messenger harddrive is qdeleting!\]" - CRASH(message) - computer.ring(ringtone) - -/datum/computer_file/program/messenger/Topic(href, href_list) - ..() - - if(!href_list["close"] && usr.canUseTopic(computer, BE_CLOSE, FALSE, NO_TK)) - switch(href_list["choice"]) - if("Message") - send_message(usr, list(locate(href_list["target"]))) - if("Mess_us_up") - if(!HAS_TRAIT(src, TRAIT_PDA_CAN_EXPLODE)) - var/obj/item/modular_computer/tablet/comp = computer - comp.explode(usr, from_message_menu = TRUE) - return diff --git a/code/modules/modular_computers/file_system/programs/phys_scanner.dm b/code/modules/modular_computers/file_system/programs/phys_scanner.dm index 804ada70b8e1..200852545129 100644 --- a/code/modules/modular_computers/file_system/programs/phys_scanner.dm +++ b/code/modules/modular_computers/file_system/programs/phys_scanner.dm @@ -50,7 +50,7 @@ var/mob/living/carbon/carbon = A if(istype(carbon)) carbon.visible_message(span_notice("[user] analyzes [A]'s vitals.")) - last_record = healthscan(user, carbon, 1, tochat = FALSE) + last_record = healthscan(user, carbon, 1, chat = FALSE) /datum/computer_file/program/phys_scanner/ui_act(action, list/params, datum/tgui/ui) . = ..() diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 25041d62bff6..bcbf6e707e03 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -95,7 +95,7 @@ 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) + if(get_dist_euclidean(here_turf, target_turf) > 24) userot = TRUE rot = round(get_angle(here_turf, target_turf)) else @@ -180,7 +180,7 @@ var/here_turf = get_turf(computer) var/target_turf = get_turf(signal) - var/trackdistance = get_dist_euclidian(here_turf, target_turf) + var/trackdistance = get_dist_euclidean(here_turf, target_turf) switch(trackdistance) if(0) program_icon_state = "[initial(program_icon_state)]direct" @@ -340,7 +340,7 @@ objects = list() // All the nukes - for(var/obj/machinery/nuclearbomb/nuke as anything in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/nuke as anything in INSTANCES_OF(/obj/machinery/nuclearbomb)) var/list/nuke_info = list( ref = REF(nuke), name = nuke.name, @@ -370,7 +370,7 @@ /datum/computer_file/program/radar/fission360/proc/on_examine(datum/source, mob/user, list/examine_list) SIGNAL_HANDLER - for(var/obj/machinery/nuclearbomb/bomb as anything in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/bomb as anything in INSTANCES_OF(/obj/machinery/nuclearbomb)) if(bomb.timing) examine_list += span_danger("Extreme danger. Arming signal detected. Time remaining: [bomb.get_time_left()].") diff --git a/code/modules/modular_computers/file_system/programs/records.dm b/code/modules/modular_computers/file_system/programs/records.dm index d96f89779feb..eeedd9e220b9 100644 --- a/code/modules/modular_computers/file_system/programs/records.dm +++ b/code/modules/modular_computers/file_system/programs/records.dm @@ -34,32 +34,31 @@ switch(mode) if("security") - for(var/datum/data/record/person in GLOB.data_core.general) - var/datum/data/record/security_person = find_record("id", person.fields["id"], GLOB.data_core.security) + for(var/datum/data/record/person in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + var/datum/data/record/security_person = SSdatacore.find_record("id", person.fields[DATACORE_ID], DATACORE_RECORDS_SECURITY) var/list/current_record = list() if(security_person) - current_record["wanted"] = security_person.fields["criminal"] + current_record["wanted"] = security_person.fields[DATACORE_CRIMINAL_STATUS] - current_record["id"] = person.fields["id"] - current_record["name"] = person.fields["name"] - current_record["rank"] = person.fields["rank"] - current_record["gender"] = person.fields["gender"] - current_record["age"] = person.fields["age"] - current_record["species"] = person.fields["species"] - current_record["fingerprint"] = person.fields["fingerprint"] + current_record["id"] = person.fields[DATACORE_ID] + current_record["name"] = person.fields[DATACORE_NAME] + current_record["rank"] = person.fields[DATACORE_RANK] + current_record["gender"] = person.fields[DATACORE_GENDER] + current_record["age"] = person.fields[DATACORE_AGE] + current_record["species"] = person.fields[DATACORE_SPECIES] + current_record["fingerprint"] = person.fields[DATACORE_FINGERPRINT] all_records += list(current_record) if("medical") - for(var/datum/data/record/person in GLOB.data_core.medical) + for(var/datum/data/record/person in SSdatacore.get_records(DATACORE_RECORDS_MEDICAL)) var/list/current_record = list() - current_record["name"] = person.fields["name"] - current_record["bloodtype"] = person.fields["blood_type"] - current_record["mi_dis"] = person.fields["mi_dis"] - current_record["ma_dis"] = person.fields["ma_dis"] - current_record["notes"] = person.fields["notes"] - current_record["cnotes"] = person.fields["notes_d"] + current_record["name"] = person.fields[DATACORE_NAME] + current_record["bloodtype"] = person.fields[DATACORE_BLOOD_TYPE] + current_record["ma_dis"] = person.fields[DATACORE_DISABILITIES] + current_record["notes"] = person.fields[DATACORE_NOTES] + current_record["cnotes"] = person.fields[DATACORE_NOTES_DETAILS] all_records += list(current_record) diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index b3cdb793a450..0f6b6fc9804b 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -136,7 +136,7 @@ if(!computer || !card_slot) return if(id_card) - GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment, id_card.get_trim_assignment()) + SSdatacore.manifest_modify(id_card.registered_name, id_card.assignment, id_card.get_trim_assignment()) card_slot.try_eject(current_user) else playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE) 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 a7963f0f2619..12227dd7678f 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -32,7 +32,7 @@ /datum/computer_file/program/supermatter_monitor/run_program(mob/living/user) . = ..(user) - if(!(active in GLOB.machines)) + if(!(active in INSTANCES_OF(/obj/machinery/power/supermatter))) active = null refresh() @@ -50,7 +50,7 @@ var/turf/user_turf = get_turf(ui_host()) if(!user_turf) return - for(var/obj/machinery/power/supermatter/crystal in GLOB.machines) + for(var/obj/machinery/power/supermatter/crystal as anything in INSTANCES_OF(/obj/machinery/power/supermatter)) //Exclude Syndicate owned, Delaminating, not within coverage, not on a tile. if (!crystal.include_in_cims || !isturf(crystal.loc) || !(is_station_level(crystal.z) || is_mining_level(crystal.z) || crystal.z == user_turf.z)) continue diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index 70abacf92d4f..1326b9b4f6f1 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -12,7 +12,7 @@ /// If the hardware uses extra power, change this. var/power_usage = 0 /// If the hardware is turned off set this to 0. - var/enabled = TRUE + VAR_PROTECTED/enabled = TRUE /// Prevent disabling for important component, like the CPU. var/critical = FALSE /// Prevents direct installation of removable media. @@ -124,3 +124,11 @@ */ /obj/item/computer_hardware/proc/try_eject(mob/living/user = null, forced = FALSE) return FALSE + +/// Called when the device's enablement changes state. +/obj/item/computer_hardware/proc/enable_changed(new_state) + SHOULD_CALL_PARENT(TRUE) + enabled = new_state + +/obj/item/computer_hardware/proc/is_enabled() + return enabled diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 2e527435c8ef..29b10d1ae345 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -10,16 +10,17 @@ var/current_identification = null var/current_job = null +/obj/item/computer_hardware/card_slot/Destroy() + if(stored_card) //If you didn't expect this behavior for some dumb reason, do something different instead of directly destroying the slot + QDEL_NULL(stored_card) + return ..() + ///What happens when the ID card is removed (or deleted) from the module, through try_eject() or not. /obj/item/computer_hardware/card_slot/Exited(atom/movable/gone, direction) if(stored_card == gone) stored_card = null 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.notify_id_removed(device_type) holder.update_slot_icon() @@ -29,11 +30,6 @@ human_wearer.sec_hud_set_ID() return ..() -/obj/item/computer_hardware/card_slot/Destroy() - if(stored_card) //If you didn't expect this behavior for some dumb reason, do something different instead of directly destroying the slot - QDEL_NULL(stored_card) - return ..() - /obj/item/computer_hardware/card_slot/GetAccess() var/list/total_access if(stored_card) @@ -43,7 +39,7 @@ total_access |= card_slot2.stored_card.GetAccess() return total_access -/obj/item/computer_hardware/card_slot/GetID() +/obj/item/computer_hardware/card_slot/GetID(bypass_wallet) if(stored_card) return stored_card return ..() @@ -77,7 +73,7 @@ stored_card = I to_chat(user, span_notice("You insert \the [I] into \the [expansion_hw ? "secondary":"primary"] [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + playsound(src, 'sound/machines/cardreader_insert.ogg', 50, FALSE) holder.update_appearance() current_identification = stored_card.registered_name @@ -90,9 +86,9 @@ human_wearer.sec_hud_set_ID() holder.update_slot_icon() + holder.notify_id_inserted(device_type) return TRUE - /obj/item/computer_hardware/card_slot/try_eject(mob/living/user = null, forced = FALSE) if(!stored_card) to_chat(user, span_warning("There are no cards in \the [src].")) @@ -104,13 +100,14 @@ stored_card.forceMove(drop_location()) to_chat(user, span_notice("You remove the card from \the [src].")) - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - holder.update_appearance() + playsound(src, 'sound/machines/cardreader_desert.ogg', 50, FALSE) + holder?.update_appearance() stored_card = null current_identification = null current_job = null + //holder.notify_id_removed(device_type) This is here as a reference, this is actually done in Exitted() return TRUE /obj/item/computer_hardware/card_slot/screwdriver_act(mob/living/user, obj/item/tool) diff --git a/code/modules/modular_computers/hardware/gprs_card.dm b/code/modules/modular_computers/hardware/gprs_card.dm new file mode 100644 index 000000000000..4b5ad47f60b7 --- /dev/null +++ b/code/modules/modular_computers/hardware/gprs_card.dm @@ -0,0 +1,147 @@ +// Since we can't assure that the PDA program is running at all times, +// We need to do this in "hardware" +//This is the definition of overdesigned, but the way it used to work was also awful, so eat shit. + +#define GPRS_ENABLED TRUE +#define GPRS_DISABLED FALSE + +/obj/item/computer_hardware/network_card/packetnet + name = "\improper GPRS network card" + desc = "A cheap network card with an attached GPRS Modem. Supports NTNet and GPRS Messaging." + var/gprs_frequency = FREQ_COMMON + var/datum/radio_frequency/radio_connection + + /// Stores up to [queue_max] messages until the PDA asks for them. + VAR_PRIVATE/list/datum/signal/packet_queue + /// Maximum amount of messages held by [packet_queue] + var/queue_max = 5 + /// Hardware PDA discovery + /// TGUI display format, list(list("target_addr"="addr","name"="name","job"="job"),...) + var/list/known_pdas + var/radio_state = GPRS_DISABLED + +/obj/item/computer_hardware/network_card/packetnet/Initialize(mapload) + . = ..() + packet_queue = list() + known_pdas = list() + +/obj/item/computer_hardware/network_card/packetnet/on_install(obj/item/modular_computer/install_into, mob/living/user) + . = ..() + enable_changed(install_into.enabled) + + +/obj/item/computer_hardware/network_card/packetnet/on_remove(obj/item/modular_computer/remove_from, mob/living/user) + . = ..() + enable_changed(FALSE) + packet_queue.Cut() // Volatile memory~ + known_pdas.Cut() + +/obj/item/computer_hardware/network_card/packetnet/Destroy() + SSpackets.remove_object(src, gprs_frequency, RADIO_PDAMESSAGE) + radio_connection = null + packet_queue.Cut() + . = ..() + +/obj/item/computer_hardware/network_card/packetnet/diagnostics(mob/user) + ..() + to_chat(user, "GPRS - General Packet Radio Service") + to_chat(user, "┗ TX/RX Band - [format_frequency(gprs_frequency)]") + +/obj/item/computer_hardware/network_card/packetnet/examine(mob/user) + . = ..() + if(get_dist(get_turf(src), get_turf(user)) >= 2) + . += span_info("You're too far away to read the board...") + return + . += span_info("The silkscreen reads...") + . += "\t[span_info("GPRS FREQ: [span_robot(format_frequency(gprs_frequency))]")]" + . += "\t[span_info("GPRS ADDR: [span_robot(hardware_id)]")]" + +/obj/item/computer_hardware/network_card/packetnet/receive_signal(datum/signal/signal) + if(!holder || !signal.data) //Basic checks + return + if(signal.transmission_method != TRANSMISSION_RADIO) + CRASH("[src] received non-radio packet, transmission method ID [signal.transmission_method], Expected [TRANSMISSION_RADIO]") + var/list/signal_data = signal.data //medium velocity silver hedgehog + var/signal_d_addr = signal_data[PACKET_DESTINATION_ADDRESS] + if(signal_d_addr == NET_ADDRESS_PING) //Ping. + var/datum/signal/outgoing = new( + src, + list( + PACKET_DESTINATION_ADDRESS = signal_data[PACKET_SOURCE_ADDRESS], + PACKET_CMD = NET_COMMAND_PING_REPLY, + PACKET_NETCLASS = NETCLASS_GRPS_CARD, + "netaddr" = hardware_id + ) + ) + if(signal_data["pda_scan"] && istype(holder, /obj/item/modular_computer/tablet)) + // If we're on an actual tablet, pass along the user info. No privacy here. + var/obj/item/modular_computer/tablet/tab_holder = holder + var/list/og_data = outgoing.data + og_data["reg_name"] = tab_holder.saved_identification + og_data["reg_job"] = tab_holder.saved_job + post_signal(outgoing) + //Either it's broadcast or directed to us. + if(isnull(signal_d_addr) || signal_d_addr == hardware_id) + // If it's a ping reply, check for a PDA. + if(signal.data[PACKET_CMD] == NET_COMMAND_PING_REPLY) + //If it's from a GPRS card, respond, otherwise, who cares. + if(signal.data[PACKET_NETCLASS] == NETCLASS_GRPS_CARD) + var/list/new_pda_info = list( + "target_addr" = signal.data[PACKET_SOURCE_ADDRESS], + "name" = signal.data["reg_name"] || "#UNK", + "job" = signal.data["reg_job"] || "#UNK" + ) + known_pdas += list(new_pda_info) + // Trash other ping reply packets, they'll just clog the buffer. + return + //We don't really care what it is, just store it. + append_signal(signal) + + +/obj/item/computer_hardware/network_card/packetnet/proc/post_signal(datum/signal/signal) + if(!radio_connection || !signal) + return FALSE // Something went wrong. + signal.data[PACKET_SOURCE_ADDRESS] = hardware_id //Readdress outgoing packets. + signal.author = WEAKREF(src) + radio_connection.post_signal(signal, RADIO_PDAMESSAGE) + return TRUE //We at least tried. + +/// Take a signal out of the queue. +/obj/item/computer_hardware/network_card/packetnet/proc/pop_signal() + if(!length(packet_queue)) + return FALSE //Nothing left, chief. + var/datum/signal/popped = packet_queue[1] + packet_queue -= popped + return popped + +/// Push a signal onto the queue, Drop a packet if we're over the limit. +/obj/item/computer_hardware/network_card/packetnet/proc/append_signal(datum/signal/signal) + PRIVATE_PROC(TRUE) + if(signal.has_magic_data & MAGIC_DATA_MUST_DISCARD) + return //We can't hold volatile signals. + if(length(packet_queue) == queue_max) + pop_signal() //Discard the first signal in the queue + packet_queue += signal + return + +/// Get the length of the packet queue +/obj/item/computer_hardware/network_card/packetnet/proc/check_queue() + return length(packet_queue) + +/obj/item/computer_hardware/network_card/packetnet/proc/set_radio_state(new_state) + if(radio_state == new_state) + return + radio_state = new_state + if(radio_state) + radio_connection = SSpackets.add_object(src, gprs_frequency, RADIO_PDAMESSAGE) + else + SSpackets.remove_object(src, gprs_frequency) + radio_connection = null + +/obj/item/computer_hardware/network_card/packetnet/enable_changed(new_state) + set_radio_state(new_state) + ..() + + +#undef GPRS_ENABLED +#undef GPRS_DISABLED diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index 67b26ba789e9..88a95129277c 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -14,8 +14,14 @@ /obj/item/computer_hardware/hard_drive/on_remove(obj/item/modular_computer/remove_from, mob/user) remove_from.shutdown_computer() for(var/datum/computer_file/program/program in stored_files) + program.removed_from_computer() program.computer = null +/obj/item/computer_hardware/hard_drive/on_install(obj/item/modular_computer/install_into, mob/living/user) + . = ..() + for(var/datum/computer_file/program/program in stored_files) + program.added_to_computer(install_into) + /obj/item/computer_hardware/hard_drive/proc/install_default_programs() store_file(new /datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar store_file(new /datum/computer_file/program/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository @@ -49,13 +55,13 @@ if(F in stored_files) return FALSE - SEND_SIGNAL(F, COMSIG_MODULAR_COMPUTER_FILE_ADDING) - F.holder = src stored_files.Add(F) recalculate_size() - SEND_SIGNAL(F, COMSIG_MODULAR_COMPUTER_FILE_ADDED) + F.added_to_drive(src) + if(holder) + F.added_to_computer(holder) return TRUE // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. @@ -70,10 +76,11 @@ return FALSE if(F in stored_files) - SEND_SIGNAL(F, COMSIG_MODULAR_COMPUTER_FILE_DELETING) stored_files -= F recalculate_size() - SEND_SIGNAL(F, COMSIG_MODULAR_COMPUTER_FILE_DELETED) + F.deleted_from_drive(src) + if(holder) + F.removed_from_computer(holder) return TRUE else return FALSE diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index f9a8e46a8820..a4e83465dc46 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -3,14 +3,17 @@ desc = "A basic wireless network card for usage with standard NTNet frequencies." power_usage = 50 icon_state = "radio_mini" - network_id = NETWORK_CARDS // Network we are on var/hardware_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user. - var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user. + var/identification_string = "" // Identification string, technically nickname seen in the network. Used for network logging exclusively. Can't be set by the user, A lump of barely-cared-about lard. var/long_range = 0 var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks. malfunction_probability = 1 device_type = MC_NET +/obj/item/computer_hardware/network_card/Initialize(mapload) + . = ..() + //WHOOPS THE WHOLE TIME THESE NEVER GOT A HARDWARE ID, GIVE THEM A GOON-NET STYLE ONE. + hardware_id = SSpackets.generate_net_id(src) /obj/item/computer_hardware/network_card/diagnostics(mob/user) ..() diff --git a/code/modules/modular_computers/hardware/recharger.dm b/code/modules/modular_computers/hardware/recharger.dm index e80d5706a1fd..b90d886f53ea 100644 --- a/code/modules/modular_computers/hardware/recharger.dm +++ b/code/modules/modular_computers/hardware/recharger.dm @@ -10,7 +10,6 @@ return FALSE /obj/item/computer_hardware/recharger/process() - ..() var/obj/item/computer_hardware/battery/battery_module = holder.all_components[MC_CELL] if(!holder || !battery_module || !battery_module.battery) return diff --git a/code/modules/modular_computers/hardware/virus_disk.dm b/code/modules/modular_computers/hardware/virus_disk.dm index 6a5c923b60d8..2bbda2e7c554 100644 --- a/code/modules/modular_computers/hardware/virus_disk.dm +++ b/code/modules/modular_computers/hardware/virus_disk.dm @@ -1,85 +1,139 @@ + +/// Completely give up sending the virus. Returns immediately. +#define VIRUS_MODE_ABORT -1 +/// 'Generic' mode. Assumes no more than the magic packet is required, and simply adds some bogus registers to cover up the real fields. +#define VIRUS_MODE_GENERIC 0 +/// Throw out the old signal and provide an entirely unique one. Use this if you need to mark a packet inviolable. +#define VIRUS_MODE_RAW_SIGNAL 1 +/// Add a list of extra fields to the packet. +#define VIRUS_MODE_EXTRA_STAPLE 2 + /obj/item/computer_hardware/hard_drive/role/virus name = "\improper generic virus disk" icon_state = "virusdisk" + var/magic_packet = "HONK!" //Set this in user_input() var/charges = 5 -/obj/item/computer_hardware/hard_drive/role/virus/proc/send_virus(obj/item/modular_computer/tablet/target, mob/living/user) +// Due to the GPRSification of PDAs, theses now share quite a lot of code. +// All viruses work in roughly the same way, sending a magic packet with a bogus command +// Some viruses may have additional data as a payload. +/obj/item/computer_hardware/hard_drive/role/virus/proc/send_virus(target_addr, mob/living/user) + if(!target_addr) + return + if(charges <= 0) + to_chat(user, span_notice("ERROR: Out of charges.")) + return + var/obj/item/computer_hardware/network_card/packetnet/pnetcard = holder.all_components[MC_NET] + if(!istype(pnetcard))//Very unlikely, but this path isn't too hot to make me worry. + to_chat(user, span_warning("ERROR: NON-GPRS NETWORK CARD.")) + return + var/list/user_input_tuple = user_input(target_addr, user) + var/datum/signal/outgoing = new(src, list( + SSpackets.pda_exploitable_register = magic_packet, + PACKET_DESTINATION_ADDRESS = target_addr + )) + var/signal_data = outgoing.data + switch(user_input_tuple[1]) + if(VIRUS_MODE_ABORT) + return + if(VIRUS_MODE_GENERIC) + //Add some fluffy bogus data. + var/itermax = rand(1,3) + for(var/iter = 0, iter 0 && app.send_message(user, list(target), rigged = REF(user), fake_name = fakename, fake_job = fakejob)) - charges-- - user.show_message(span_notice("Success!")) - var/reference = REF(src) - ADD_TRAIT(target, TRAIT_PDA_CAN_EXPLODE, reference) - ADD_TRAIT(target, TRAIT_PDA_MESSAGE_MENU_RIGGED, reference) - addtimer(TRAIT_CALLBACK_REMOVE(target, TRAIT_PDA_MESSAGE_MENU_RIGGED, reference), 10 SECONDS) + text_message = sanitize(text_message) + if(!text_message) + return list(VIRUS_MODE_ABORT) + var/sender_name = sanitize(tgui_input_text(user, "Enter the sending name", "NT Messaging")) + if(!sender_name) + return list(VIRUS_MODE_ABORT) + var/sender_job = sanitize(tgui_input_text(user, "Enter the sending job", "NT Messaging")) + if(!sender_name) + return list(VIRUS_MODE_ABORT) + + if(!user.canUseTopic(holder, USE_CLOSE)) + return list(VIRUS_MODE_ABORT) + + var/list/pda_data_staple = list( + // We already have the target address + // GPRS Card handles the source address + PACKET_CMD = NETCMD_PDAMESSAGE, + "name" = sender_name, + "job" = sender_job, + "message" = text_message + ) + //Add some fluffy bogus data. + var/itermax = rand(1,3) + for(var/iter = 0, iter 0) + var/can_overcome + for(var/atom/A in loc) + if(HAS_TRAIT(A, TRAIT_CLIMBABLE)) + can_overcome = TRUE + break; + + if(!can_overcome) + var/list/objects_to_stand_on = list( + /obj/structure/chair, + /obj/structure/bed, + /obj/structure/lattice + ) + for(var/path in objects_to_stand_on) + if(locate(path) in loc) + can_overcome = TRUE + break; + if(!can_overcome) + to_chat(src, span_warning("You cannot reach [onto] from here!")) + return FALSE + + visible_message( + span_notice("[src] starts climbing onto \the [onto]."), + span_notice("You start climbing onto \the [onto].") + ) + + if(!do_after(src, time = 5 SECONDS, timed_action_flags = DO_PUBLIC, display = image('icons/hud/do_after.dmi', "help"))) + return FALSE + + visible_message( + span_notice("[src] climbs onto \the [onto]."), + span_notice("You climb onto \the [onto].") + ) + + var/oldloc = loc + setDir(get_dir(above, destination)) + . = Move(destination, null, null, ZMOVE_INCAPACITATED_CHECKS) + if(.) + playsound(oldloc, 'sound/effects/stairs_step.ogg', 50) + playsound(destination, 'sound/effects/stairs_step.ogg', 50) + +/// Returns a list of movables that should also be affected when calling forceMoveWithGroup() +/atom/movable/proc/get_move_group() + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + . = list(src) + if(length(buckled_mobs)) + . |= buckled_mobs + +/// forceMove() wrapper to include things like buckled mobs. +/atom/movable/proc/forceMoveWithGroup(destination, z_movement) + var/list/movers = get_move_group() + for(var/atom/movable/AM as anything in movers) + if(z_movement) + AM.set_currently_z_moving(z_movement) + AM.forcemove_should_maintain_grab = TRUE + AM.forceMove(destination) + AM.forcemove_should_maintain_grab = FALSE + if(z_movement) + AM.set_currently_z_moving(FALSE) +/* +/** + * We want to relay the zmovement to the buckled atom when possible + * and only run what we can't have on buckled.zMove() or buckled.can_z_move() here. + * This way we can avoid esoteric bugs, copypasta and inconsistencies. + */ +/mob/living/zMove(dir, turf/target, z_move_flags = ZMOVE_FLIGHT_FLAGS) + if(buckled) + if(buckled.currently_z_moving) + return FALSE + if(!(z_move_flags & ZMOVE_ALLOW_BUCKLED)) + buckled.unbuckle_mob(src, force = TRUE, can_fall = FALSE) + else + if(!target) + target = can_z_move(dir, get_turf(src), z_move_flags, src) + if(!target) + return FALSE + return buckled.zMove(dir, target, z_move_flags) // Return value is a loc. + return ..() +*/ diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index b8d54857677d..dec38b73dc33 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -20,7 +20,8 @@ force = 30 throwforce = 30 block_chance = 50 - armour_penetration = 50 + block_sound = 'sound/weapons/block/block_energy.ogg' + armor_penetration = 50 w_class = WEIGHT_CLASS_NORMAL hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm index f551cf3d99cd..fb419548d822 100644 --- a/code/modules/ninja/suit/gloves.dm +++ b/code/modules/ninja/suit/gloves.dm @@ -31,35 +31,41 @@ ///How many times the gloves have been used to force open doors. var/door_hack_counter = 0 +/obj/item/clothing/gloves/space_ninja/equipped(mob/living/user, slot) + . = ..() + if(slot == ITEM_SLOT_GLOVES) + RegisterSignal(user, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(touch)) -/obj/item/clothing/gloves/space_ninja/Touch(atom/A,proximity,modifiers) - if(!LAZYACCESS(modifiers, RIGHT_CLICK) || draining) +/obj/item/clothing/gloves/space_ninja/dropped(mob/living/user) + . = ..() + UnregisterSignal(user, COMSIG_LIVING_EARLY_UNARMED_ATTACK) + +/obj/item/clothing/gloves/space_ninja/proc/touch(mob/source, atom/target, proximity, modifiers) + SIGNAL_HANDLER + + if(!LAZYACCESS(modifiers, RIGHT_CLICK) || draining || !proximity) return FALSE if(!ishuman(loc)) return FALSE //Only works while worn + if(isturf(target)) + return FALSE var/mob/living/carbon/human/wearer = loc - var/obj/item/clothing/suit/space/space_ninja/suit = wearer.wear_suit if(!istype(suit)) return FALSE - if(isturf(A)) - return FALSE - - if(!proximity) - return FALSE - A.add_fingerprint(wearer) + target.add_fingerprint(wearer) draining = TRUE - . = A.ninjadrain_act(suit,wearer,src) + . = target.ninjadrain_act(suit,wearer,src) draining = FALSE if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking) if(.) - to_chat(wearer, span_notice("Gained [display_energy(.)] of energy from [A].")) + to_chat(wearer, span_notice("Gained [display_energy(.)] of energy from [target].")) else - to_chat(wearer, span_danger("\The [A] has run dry of energy, you must find another source!")) + to_chat(wearer, span_danger("\The [target] has run dry of energy, you must find another source!")) else . = FALSE //as to not cancel attack_hand() diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm index d92fb9b2b24b..dfa107bed783 100644 --- a/code/modules/ninja/suit/head.dm +++ b/code/modules/ninja/suit/head.dm @@ -11,7 +11,7 @@ name = "ninja hood" icon_state = "s-ninja" inhand_icon_state = "s-ninja_mask" - armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 15, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 20, ENERGY = 15, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) strip_delay = 12 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF blockTracking = TRUE//Roughly the only unique thing about this helmet. diff --git a/code/modules/ninja/suit/ninjaDrainAct.dm b/code/modules/ninja/suit/ninjaDrainAct.dm index 3137ebde2c35..c133456deba6 100644 --- a/code/modules/ninja/suit/ninjaDrainAct.dm +++ b/code/modules/ninja/suit/ninjaDrainAct.dm @@ -114,12 +114,14 @@ return INVALID_DRAIN AI_notify_hack() if(do_after(ninja, 200)) - for(var/datum/data/record/rec in sort_record(GLOB.data_core.general, sortBy, order)) - for(var/datum/data/record/security_record in GLOB.data_core.security) - security_record.fields["criminal"] = "*Arrest*" + for(var/datum/data/record/rec in sort_record(SSdatacore.get_records(DATACORE_RECORDS_STATION), sortBy, order)) + for(var/datum/data/record/security/security_record in SSdatacore.get_records(DATACORE_RECORDS_SECURITY)) + security_record.set_criminal_status(CRIMINAL_WANTED) + var/datum/antagonist/ninja/ninja_antag = ninja.mind.has_antag_datum(/datum/antagonist/ninja) if(!ninja_antag) return + var/datum/objective/security_scramble/objective = locate() in ninja_antag.objectives if(objective) objective.completed = TRUE diff --git a/code/modules/ninja/suit/ninja_equipment_actions/ninja_adrenaline.dm b/code/modules/ninja/suit/ninja_equipment_actions/ninja_adrenaline.dm index d954e7b7aaa1..71b239c96de1 100644 --- a/code/modules/ninja/suit/ninja_equipment_actions/ninja_adrenaline.dm +++ b/code/modules/ninja/suit/ninja_equipment_actions/ninja_adrenaline.dm @@ -26,7 +26,7 @@ ninja.SetParalyzed(0) ninja.stamina.adjust(200) ninja.remove_status_effect(/datum/status_effect/speech/stutter) - ninja.reagents.add_reagent(/datum/reagent/medicine/stimulants, 5) + ninja.reagents.add_reagent(/datum/reagent/stimulants, 5) ninja.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost") a_boost = FALSE to_chat(ninja, span_notice("You have used the adrenaline boost.")) diff --git a/code/modules/ninja/suit/ninja_equipment_actions/ninja_status_read.dm b/code/modules/ninja/suit/ninja_equipment_actions/ninja_status_read.dm index 8e558512771e..792e05b4d15d 100644 --- a/code/modules/ninja/suit/ninja_equipment_actions/ninja_status_read.dm +++ b/code/modules/ninja/suit/ninja_equipment_actions/ninja_status_read.dm @@ -19,7 +19,7 @@ info_list += "[span_info("SpiderOS Status: [s_initialized ? "Initialized" : "Disabled"]")]\n" info_list += "[span_info("Current Time: [stationtime2text()]")]\n" //Ninja status - info_list += "[span_info("Fingerprints: [md5(ninja.dna.unique_identity)]")]\n" + info_list += "[span_info("Fingerprints: [ninja.get_fingerprints(TRUE)]")]\n" info_list += "[span_info("Unique Identity: [ninja.dna.unique_enzymes]")]\n" info_list += "[span_info("Overall Status: [ninja.stat > 1 ? "dead" : "[ninja.health]% healthy"]")]\n" info_list += "[span_info("Nutrition Status: [ninja.nutrition]")]\n" @@ -27,7 +27,7 @@ info_list += "[span_info("Toxin Levels: [ninja.getToxLoss()]")]\n" info_list += "[span_info("Burn Severity: [ninja.getFireLoss()]")]\n" info_list += "[span_info("Brute Trauma: [ninja.getBruteLoss()]")]\n" - info_list += "[span_info("Body Temperature: [ninja.bodytemperature-T0C] degrees C ([ninja.bodytemperature*1.8-459.67] degrees F)")]\n" + info_list += "[span_info("Body Temperature: [ninja.bodytemperature-T0C] degrees C ([FAHRENHEIT(ninja.bodytemperature)] degrees F)")]\n" //Diseases if(length(ninja.diseases)) diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index d26e43c5d0bf..5d3311d5882e 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -15,7 +15,7 @@ permeability_coefficient = 0.01 clothing_traits = list(TRAIT_NO_SLIP_WATER) resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 15, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 20, ENERGY = 15, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) 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 4829aab77c63..221dd744f7d9 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -15,7 +15,8 @@ inhand_icon_state = "s-ninja_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/stock_parts/cell) resistance_flags = LAVA_PROOF | ACID_PROOF - armor = list(MELEE = 40, BULLET = 30, LASER = 20,ENERGY = 30, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) + flags_inv = HIDESHOES|HIDEJUMPSUIT + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 20, ENERGY = 30, BOMB = 30, BIO = 30, FIRE = 100, ACID = 100) strip_delay = 12 min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjastatus, /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) @@ -85,6 +86,7 @@ /obj/item/clothing/suit/space/space_ninja/Destroy() QDEL_NULL(spark_system) QDEL_NULL(cell) + QDEL_NULL(energyKatana) return ..() // seal the cell in the ninja outfit @@ -146,8 +148,11 @@ return TRUE return FALSE -/obj/item/clothing/suit/space/space_ninja/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/clothing/suit/space/space_ninja/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", damage = 0, attack_type = MELEE_ATTACK) . = ..() + if(!.) + return + if(stealth) cancel_stealth() s_coold = 5 diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index e837d35907ba..1c5850b13c0a 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -9,7 +9,6 @@ worn_icon_state = "clipboard" throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 7 slot_flags = ITEM_SLOT_BELT resistance_flags = FLAMMABLE diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm index ed354c72772a..b7f9788d1daa 100644 --- a/code/modules/paperwork/contract.dm +++ b/code/modules/paperwork/contract.dm @@ -3,7 +3,6 @@ /obj/item/paper/employment_contract icon_state = "paper_words" throw_range = 3 - throw_speed = 3 item_flags = NOBLUDGEON var/employee_name = "" diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 126903f8d1a7..eb32caef034a 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -121,35 +121,66 @@ * Security Record Cabinets */ /obj/structure/filingcabinet/security - var/virgin = TRUE - -/obj/structure/filingcabinet/security/proc/populate() - if(virgin) - for(var/datum/data/record/G in GLOB.data_core.general) - var/datum/data/record/S = find_record("name", G.fields["name"], GLOB.data_core.security) - if(!S) - continue - var/obj/item/paper/P = new /obj/item/paper(src) - P.info = "
Security Record

" - P.info += "Name: [G.fields["name"]] ID: [G.fields["id"]]
\nGender: [G.fields["gender"]]
\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
\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]"]]
" - counter++ - P.info += "" - P.name = "paper - '[G.fields["name"]]'" - virgin = FALSE //tabbing here is correct- it's possible for people to try and use it - //before the records have been generated, so we do this inside the loop. - -/obj/structure/filingcabinet/security/attack_hand(mob/user, list/modifiers) - populate() - return ..() - -/obj/structure/filingcabinet/security/attack_tk() - populate() - return ..() + name = "security records filing cabinet" + desc = "A cabinet containing a paper copy of all of the station security records." +/obj/structure/filingcabinet/security/Initialize(mapload) + . = ..() + if(SSticker.IsRoundInProgress()) + INVOKE_ASYNC(src, PROC_REF(generate_all)) + RegisterSignal(SSdcs, COMSIG_GLOB_MANIFEST_INJECT, PROC_REF(on_manifest_add)) + +/obj/structure/filingcabinet/security/proc/add_entry(datum/data/record/general, datum/data/record/security) + var/obj/item/paper/P = new /obj/item/paper(src) + P.name = "paper - '[general.fields[DATACORE_NAME]]'" + + P.info = {" +
Security Record

+ Name: [general.fields[DATACORE_NAME]]
+ ID: [general.fields[DATACORE_ID]]
+ Gender: [general.fields[DATACORE_GENDER]]
+ Age: [general.fields[DATACORE_AGE]]
+ Fingerprint: [general.fields[DATACORE_FINGERPRINT]]
+ Physical Status: [general.fields[DATACORE_PHYSICAL_HEALTH]]
+ Mental Status: [general.fields[DATACORE_MENTAL_HEALTH]]
+
+
Security Data

+ Criminal Status: [security.fields[DATACORE_CRIMINAL_STATUS]]
+
+ Crimes:
+ "} + // Crimes + if(length(security.fields[DATACORE_CRIMES])) + for(var/datum/data/crime/C in security.fields[DATACORE_CRIMES]) + P.info += "[FOURSPACES][C.crimeName] - [C.crimeDetails]
" + else + P.info += "[FOURSPACES]None
" + + P.info += {" +
+ Important Notes:
+ [FOURSPACES][security.fields[DATACORE_NOTES]]
+
+
Comments/Log

+ "} + // Notes + var/counter = 1 + while(security.fields["com_[counter]"]) + P.info += "[security.fields["com_[counter]"]]
" + counter++ + P.info += "
" + +/obj/structure/filingcabinet/security/proc/on_manifest_add(datum/source, datum/data/record/general, datum/data/record/medical, datum/data/record/security) + SIGNAL_HANDLER + add_entry(general, security) + +/obj/structure/filingcabinet/security/proc/generate_all() + for(var/datum/data/record/G in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + var/datum/data/record/S = SSdatacore.get_record_by_name(G.fields[DATACORE_NAME], DATACORE_RECORDS_SECURITY) + if(!S) + continue + add_entry(G, S) + CHECK_TICK /* * Medical Record Cabinets */ @@ -159,20 +190,20 @@ /obj/structure/filingcabinet/medical/proc/populate() if(virgin) - for(var/datum/data/record/G in GLOB.data_core.general) - var/datum/data/record/M = find_record("name", G.fields["name"], GLOB.data_core.medical) + for(var/datum/data/record/G in SSdatacore.get_records(DATACORE_RECORDS_STATION)) + var/datum/data/record/M = SSdatacore.get_record_by_name(G.fields[DATACORE_NAME], DATACORE_RECORDS_MEDICAL) if(!M) continue var/obj/item/paper/P = new /obj/item/paper(src) P.info = "
Medical Record

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

\nBlood Type: [M.fields["blood_type"]]
\nDNA: [M.fields["b_dna"]]
\n
\nMinor Disabilities: [M.fields["mi_dis"]]
\nDetails: [M.fields["mi_dis_d"]]
\n
\nMajor Disabilities: [M.fields["ma_dis"]]
\nDetails: [M.fields["ma_dis_d"]]
\n
\nAllergies: [M.fields["alg"]]
\nDetails: [M.fields["alg_d"]]
\n
\nCurrent Diseases: [M.fields["cdi"]] (per disease info placed in log/comment section)
\nDetails: [M.fields["cdi_d"]]
\n
\nImportant Notes:
\n\t[M.fields["notes"]]
\n
\n
Comments/Log

" + P.info += "Name: [G.fields[DATACORE_NAME]] ID: [G.fields[DATACORE_ID]]
\nGender: [G.fields[DATACORE_GENDER]]
\nAge: [G.fields[DATACORE_AGE]]
\nFingerprint: [G.fields[DATACORE_FINGERPRINT]]
\nPhysical Status: [G.fields[DATACORE_PHYSICAL_HEALTH]]
\nMental Status: [G.fields[DATACORE_MENTAL_HEALTH]]
" + P.info += "
\n
Medical Data

\nBlood Type: [M.fields[DATACORE_BLOOD_TYPE]]
\nDNA: [M.fields[DATACORE_BLOOD_DNA]]
\n
\n\nDisabilities: [M.fields[DATACORE_DISABILITIES]]
\nDetails: [M.fields[DATACORE_DISABILITIES_DETAILS]]
\n
\nAllergies: [M.fields["alg"]]
\nDetails: [M.fields["alg_d"]]
\n
\nCurrent Diseases: [M.fields[DATACORE_DISEASES]] (per disease info placed in log/comment section)
\nDetails: [M.fields[DATACORE_DISEASES_DETAILS]]
\n
\nImportant Notes:
\n\t[M.fields[DATACORE_NOTES]]
\n
\n
Comments/Log

" var/counter = 1 while(M.fields["com_[counter]"]) P.info += "[M.fields["com_[counter]"]]
" counter++ P.info += "" - P.name = "paper - '[G.fields["name"]]'" + P.name = "paper - '[G.fields[DATACORE_NAME]]'" virgin = FALSE //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. @@ -206,11 +237,8 @@ GLOBAL_LIST_EMPTY(employmentCabinets) /obj/structure/filingcabinet/employment/proc/fillCurrent() //This proc fills the cabinet with the current crew. - for(var/record in GLOB.data_core.locked) - var/datum/data/record/G = record - if(!G) - continue - var/datum/mind/M = G.fields["mindref"] + for(var/datum/data/record/G in SSdatacore.get_records(DATACORE_RECORDS_LOCKED)) + var/datum/mind/M = G.fields[DATACORE_MINDREF] if(M && ishuman(M.current)) addFile(M.current) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 944f8201c2f3..8eea19a30b08 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -39,7 +39,7 @@ if(!inputvalue) return - if(user.canUseTopic(src, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE)) name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" /obj/item/folder/proc/remove_item(obj/item/Item, mob/user) @@ -63,8 +63,9 @@ /obj/item/folder/attackby(obj/item/weapon, mob/user, params) if(burn_paper_product_attackby_check(weapon, user)) return - if(istype(weapon, /obj/item/paper) || istype(weapon, /obj/item/photo) || istype(weapon, /obj/item/documents)) - //Add paper, photo or documents into the folder + if(istype(weapon, /obj/item/paper) || istype(weapon, /obj/item/photo) || istype(weapon, /obj/item/documents) || istype(weapon, /obj/item/disk)) + //If this check gets any longer kill me. + //Add paper, photo, documents, or disks into the folder if(!user.transferItemToLoc(weapon, src)) return to_chat(user, span_notice("You put [weapon] into [src].")) @@ -118,3 +119,42 @@ if(istype(Item)) usr.examinate(Item) . = TRUE + +// thanks chinsky +/obj/item/folder/envelope + name = "envelope" + desc = "A thick envelope. You can't see what's inside." + icon_state = "envelope_sealed" + bg_color = "#B5912B" + // *_sealed, *0, *1 required. + base_icon_state = "envelope" + /// Are we still bricked up? + var/sealed = TRUE + +/obj/item/folder/envelope/update_icon(updates) + . = ..() + if(sealed) + icon_state = "[base_icon_state]_sealed" + else + icon_state = "[base_icon_state][!!length(contents)]" //heehoo boolean magic + +/obj/item/folder/envelope/proc/sealcheck(mob/user) + var/ripperoni = alert("Are you sure you want to break the seal on \the [src]?", "Confirmation","Yes", "No") + if(ripperoni == "Yes") + visible_message("[user] breaks the seal on \the [src], and opens it.") + sealed = FALSE + update_icon() + +/obj/item/folder/envelope/attack_self(mob/user) + if(sealed) + sealcheck(user) + return + else + . = ..() + +/obj/item/folder/envelope/attackby(obj/item/weapon, mob/user, params) + if(sealed) + sealcheck(user) + return + else + . = ..() diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index bf3e11ff3985..f0d0024b9966 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -13,7 +13,7 @@ labels_left = max(labels_left - 1, 0) var/old_real_name = user.real_name - user.real_name += " (suicide)" + user.set_real_name("[old_real_name] (suicide)") // no conflicts with their identification card for(var/atom/A in user.get_all_contents()) if(istype(A, /obj/item/card/id)) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 2f9873e7fd54..c272875823a9 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -26,7 +26,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_range = 1 - throw_speed = 1 + throw_speed = 0.7 stamina_cost = 0 stamina_damage = 0 @@ -38,7 +38,8 @@ drop_sound = 'sound/items/handling/paper_drop.ogg' pickup_sound = 'sound/items/handling/paper_pickup.ogg' grind_results = list(/datum/reagent/cellulose = 3) - color = "white" + + color = "#ffffe1" /// What's actually written on the paper. var/info = "" /** @@ -72,7 +73,6 @@ stamps = null stamped = null form_fields = null - stamped = null . = ..() /** @@ -151,7 +151,7 @@ if(isnull(n_name) || n_name == "") return if(((loc == usr || istype(loc, /obj/item/clipboard)) && usr.stat == CONSCIOUS)) - name = "paper[(n_name ? text("- '[n_name]'") : null)]" + name = "paper[(n_name ? "- '[n_name]'" : null)]" add_fingerprint(usr) /obj/item/paper/suicide_act(mob/user) @@ -216,7 +216,7 @@ if(user.is_holding(src)) //no TK shit here. user.dropItemToGround(src) user.visible_message(ignition_message) - add_fingerprint(user) + I.leave_evidence(user, src) fire_act(I.get_temperature()) /obj/item/paper/proc/add_info(text, color = DEFAULT_ADD_INFO_COLOR, font = DEFAULT_ADD_INFO_FONT, signature = DEFAULT_ADD_INFO_SIGN) @@ -267,7 +267,7 @@ return ..() -/obj/item/paper/fire_act(exposed_temperature, exposed_volume) +/obj/item/paper/fire_act(exposed_temperature, exposed_volume, turf/adjacent) . = ..() if(.) info = "[stars(info)]" @@ -305,7 +305,7 @@ .["add_sign"] += style[ADD_INFO_SIGN] .["max_length"] = MAX_PAPER_LENGTH - .["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set + .["paper_color"] = !color || color == "white" ? "#ffffff" : color // color might not be set .["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? .["stamps"] = stamps diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index faad88337b6f..08dcab56a75f 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -109,13 +109,6 @@ name = "paper- 'Official Bulletin'" info = "
CentCom Security
Port Division
Official Bulletin

Inspector,
There is an emergency shuttle arriving today.

Approval is restricted to Nanotrasen employees only. Deny all other entrants.

CentCom Port Commissioner" - -/////////// Lavaland - -/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" - /////////// Space Ruins /obj/item/paper/fluff/spaceruins/lizardsgas/memorandum diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index dd3b0cd4e62f..537a3d2b4418 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -10,8 +10,9 @@ righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi' throwforce = 0 w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 + throw_range = 7 + //pressure_resistance = 8 var/papertype = /obj/item/paper var/total_paper = 30 @@ -63,7 +64,7 @@ LAZYNULL(papers) update_appearance() -/obj/item/paper_bin/fire_act(exposed_temperature, exposed_volume) +/obj/item/paper_bin/fire_act(exposed_temperature, exposed_volume, turf/adjacent) if(LAZYLEN(papers)) LAZYNULL(papers) update_appearance() @@ -190,7 +191,6 @@ /obj/item/paper_bin/bundlenatural/Initialize(mapload) binding_cable = new /obj/item/stack/cable_coil(src, 2) binding_cable.color = COLOR_ORANGE_BROWN - binding_cable.cable_color = "brown" binding_cable.desc += " Non-natural." return ..() @@ -212,7 +212,7 @@ dump_contents() return ..() -/obj/item/paper_bin/bundlenatural/fire_act(exposed_temperature, exposed_volume) +/obj/item/paper_bin/bundlenatural/fire_act(exposed_temperature, exposed_volume, turf/adjacent) qdel(src) /obj/item/paper_bin/bundlenatural/attackby(obj/item/W, mob/user) diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index efe8659569e7..73ec50f7c562 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -5,7 +5,7 @@ icon_state = "paperplane" custom_fire_overlay = "paperplane_onfire" throw_range = 7 - throw_speed = 1 + throw_speed = 0.5 throwforce = 0 w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE @@ -81,7 +81,7 @@ else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane internalPaper.attackby(P, user) //spoofed attack to update internal paper. update_appearance() - add_fingerprint(user) + P.leave_evidence(user, src) return return ..() @@ -116,7 +116,7 @@ . += span_notice("Alt-click [src] to fold it into a paper plane.") /obj/item/paper/AltClick(mob/living/user, obj/item/I) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_NEED_HANDS)) return if(istype(src, /obj/item/paper/carbon)) var/obj/item/paper/carbon/Carbon = src diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 670355ed9bdc..e861a8087fae 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -21,7 +21,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_TINY - throw_speed = 3 + throw_speed = 1.5 throw_range = 7 stamina_damage = 0 stamina_cost = 0 @@ -49,7 +49,7 @@ desc = "It's a normal red ink pen." icon_state = "pen_red" colour = "#FF0000" - throw_speed = 4 // red ones go faster (in this case, fast enough to embed!) + throw_speed = 2 // red ones go faster (in this case, fast enough to embed!) /obj/item/pen/invisible desc = "It's an invisible pen marker." @@ -110,7 +110,7 @@ icon_state = "pen-fountain-o" force = 5 throwforce = 5 - throw_speed = 4 + throw_speed = 1.5 colour = "#DC143C" custom_materials = list(/datum/material/gold = 750) sharpness = SHARP_EDGED @@ -140,7 +140,7 @@ to_chat(user, span_warning("You must be holding the pen to continue!")) return var/deg = tgui_input_number(user, "What angle would you like to rotate the pen head to? (0-360)", "Rotate Pen Head", max_value = 360) - if(isnull(deg) || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || loc != user) + if(isnull(deg) || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK) || loc != user) return degrees = deg to_chat(user, span_notice("You rotate the top of the pen to [deg] degrees.")) @@ -152,7 +152,7 @@ if(!M.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE)) return FALSE to_chat(user, span_warning("You stab [M] with the pen.")) - to_chat(M, span_danger("You feel a tiny prick!")) + M.apply_pain(1, BODY_ZONE_CHEST, "You feel a tiny prick!") log_combat(user, M, "stabbed", src) return TRUE @@ -161,12 +161,12 @@ //Changing name/description of items. Only works if they have the UNIQUE_RENAME object flag set if(isobj(O) && proximity && (O.obj_flags & UNIQUE_RENAME)) var/penchoice = tgui_input_list(user, "What would you like to edit?", "Pen Setting", list("Rename", "Description", "Reset")) - if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) + if(QDELETED(O) || !user.canUseTopic(O, USE_CLOSE)) return if(penchoice == "Rename") var/input = tgui_input_text(user, "What do you want to name [O]?", "Object Name", "[O.name]", MAX_NAME_LEN) var/oldname = O.name - if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) + if(QDELETED(O) || !user.canUseTopic(O, USE_CLOSE)) return if(input == oldname || !input) to_chat(user, span_notice("You changed [O] to... well... [O].")) @@ -182,7 +182,7 @@ if(penchoice == "Description") var/input = tgui_input_text(user, "Describe [O]", "Description", "[O.desc]", 140) var/olddesc = O.desc - if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) + if(QDELETED(O) || !user.canUseTopic(O, USE_CLOSE)) return if(input == olddesc || !input) to_chat(user, span_notice("You decide against changing [O]'s description.")) @@ -192,7 +192,7 @@ O.renamedByPlayer = TRUE if(penchoice == "Reset") - if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) + if(QDELETED(O) || !user.canUseTopic(O, USE_CLOSE)) return qdel(O.GetComponent(/datum/component/rename)) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 6c0d8296fc0e..cfc566485c6b 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -338,7 +338,7 @@ /obj/machinery/photocopier/proc/do_insertion(obj/item/object, mob/user) object.forceMove(src) to_chat(user, span_notice("You insert [object] into [src].")) - flick("photocopier1", src) + z_flick("photocopier1", src) /** * Called when someone hits the "remove item" button on the copier UI. @@ -410,9 +410,9 @@ new /obj/effect/decal/cleanable/oil(get_turf(src)) toner_cartridge.charges = 0 -/obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) +/obj/machinery/photocopier/MouseDroppedOn(mob/target, mob/user) check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. - if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked()) + if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, USE_CLOSE) || target == ass || copier_blocked()) return add_fingerprint(user) if(target == user) @@ -465,7 +465,7 @@ return TRUE /** - * Checks if the copier is deleted, or has something dense at its location. Called in `MouseDrop_T()` + * Checks if the copier is deleted, or has something dense at its location. Called in `MouseDroppedOn()` */ /obj/machinery/photocopier/proc/copier_blocked() if(QDELETED(src)) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 12812a013c12..98189ff27802 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -6,7 +6,7 @@ inhand_icon_state = "stamp" throwforce = 0 w_class = WEIGHT_CLASS_TINY - throw_speed = 3 + throw_speed = 0.6 throw_range = 7 custom_materials = list(/datum/material/iron=60) //pressure_resistance = 2 @@ -38,7 +38,7 @@ dye_color = DYE_HOP /obj/item/stamp/hos - name = "head of security's rubber stamp" + name = "security marshal's rubber stamp" icon_state = "stamp-hos" dye_color = DYE_HOS @@ -83,7 +83,7 @@ dye_color = DYE_CENTCOM /obj/item/stamp/syndicate - name = "Syndicate rubber stamp" + name = "red rubber stamp" icon_state = "stamp-syndicate" dye_color = DYE_SYNDICATE diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 11a218415818..4763f98cc7ca 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -19,17 +19,14 @@ var/cooldown = 50 var/ready = TRUE var/id = "ticket_machine_default" //For buttons - var/list/ticket_holders = list() - var/list/obj/item/ticket_machine_ticket/tickets = list() /obj/machinery/ticket_machine/Initialize(mapload) . = ..() update_appearance() + SET_TRACKING(__TYPE__) /obj/machinery/ticket_machine/Destroy() - for(var/obj/item/ticket_machine_ticket/ticket in tickets) - ticket.source = null - tickets.Cut() + UNSET_TRACKING(__TYPE__) return ..() MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) @@ -49,26 +46,16 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) ticket_number = rand(0,max_number) current_number = ticket_number obj_flags |= EMAGGED - if(tickets.len) - for(var/obj/item/ticket_machine_ticket/ticket in tickets) - ticket.audible_message(span_notice("\the [ticket] disperses!")) - qdel(ticket) - tickets.Cut() update_appearance() /obj/machinery/ticket_machine/proc/increment() if(current_number > ticket_number) return - if(current_number && !(obj_flags & EMAGGED) && tickets[current_number]) - tickets[current_number].audible_message(span_notice("\the [tickets[current_number]] disperses!")) - qdel(tickets[current_number]) if(current_number < ticket_number) current_number ++ //Increment the one we're serving. playsound(src, 'sound/misc/announce_dig.ogg', 50, FALSE) say("Now serving ticket #[current_number]!") - if(!(obj_flags & EMAGGED) && tickets[current_number]) - tickets[current_number].audible_message(span_notice("\the [tickets[current_number]] vibrates!")) - update_appearance() //Update our icon here rather than when they take a ticket to show the current ticket number being served + update_appearance() /obj/machinery/button/ticket_machine name = "increment ticket counter" @@ -108,7 +95,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) find_machine() /obj/item/assembly/control/ticket_machine/proc/find_machine() //Locate the one to which we're linked - for(var/obj/machinery/ticket_machine/ticketsplease in GLOB.machines) + for(var/obj/machinery/ticket_machine/ticketsplease as anything in INSTANCES_OF(/obj/machinery/ticket_machine)) if(ticketsplease.id == id) linked = WEAKREF(ticketsplease) if(linked) @@ -143,7 +130,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) return ..() /obj/machinery/ticket_machine/proc/handle_maptext() - switch(ticket_number) //This is here to handle maptext offsets so that the numbers align. + switch(current_number) //This is here to handle maptext offsets so that the numbers align. if(0 to 9) maptext_x = 13 if(10 to 99) @@ -156,20 +143,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) ..() if(istype(I, /obj/item/hand_labeler_refill)) if(!(ticket_number >= max_number)) - to_chat(user, span_notice("[src] refuses [I]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!")) - return - to_chat(user, span_notice("You start to refill [src]'s ticket holder (doing this will reset its ticket count!).")) + if(tgui_alert(user, "[src] still has [max_number-ticket_number] ticket[max_number-ticket_number==1 ? null : "s"] left, are you sure you want to refill it?", "Tactical Refill", list("Refill", "Cancel")) != "Refill") + return //If the user still wants to refill it... + to_chat(user, span_notice("You start to refill [src]'s ticket holder.")) if(do_after(user, src, 30)) to_chat(user, span_notice("You insert [I] into [src] as it whirs nondescriptly.")) qdel(I) ticket_number = 0 current_number = 0 - if(tickets.len) - for(var/obj/item/ticket_machine_ticket/ticket in tickets) - ticket.audible_message(span_notice("\the [ticket] disperses!")) - qdel(ticket) - tickets.Cut() - max_number = initial(max_number) update_appearance() return @@ -184,10 +165,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) if(ticket_number >= max_number) to_chat(user,span_warning("Ticket supply depleted, please refill this unit with a hand labeller refill cartridge!")) return - var/user_ref = REF(user) - if((user_ref in ticket_holders) && !(obj_flags & EMAGGED)) - to_chat(user, span_warning("You already have a ticket!")) - return + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 100, FALSE) ticket_number++ to_chat(user, span_notice("You take a ticket from [src], looks like you're ticket number #[ticket_number]...")) @@ -195,11 +173,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) theirticket.name = "Ticket #[ticket_number]" theirticket.maptext = MAPTEXT(ticket_number) theirticket.saved_maptext = MAPTEXT(ticket_number) - theirticket.source = src - theirticket.owner_ref = user_ref user.put_in_hands(theirticket) - ticket_holders += user_ref - tickets += theirticket + update_appearance() if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life. ready = FALSE addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown)//Small cooldown to prevent piles of flaming tickets @@ -220,8 +195,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) resistance_flags = FLAMMABLE max_integrity = 50 var/saved_maptext = null - var/owner_ref // A ref to our owner. Doesn't need to be weak because mobs have unique refs - var/obj/machinery/ticket_machine/source /obj/item/ticket_machine_ticket/attack_hand(mob/user, list/modifiers) . = ..() @@ -230,16 +203,4 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) /obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode if(burn_paper_product_attackby_check(P, user)) return - - return ..() - -/obj/item/paper/extinguish() - ..() - update_appearance() - -/obj/item/ticket_machine_ticket/Destroy() - if(source) - source.ticket_holders -= owner_ref - source.tickets -= src - source = null return ..() diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm index 711a6ec4f9d9..cf4ad2c9026f 100644 --- a/code/modules/photography/camera/camera.dm +++ b/code/modules/photography/camera/camera.dm @@ -10,7 +10,7 @@ worn_icon_state = "camera" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - light_system = MOVABLE_LIGHT //Used as a flash here. + light_system = OVERLAY_LIGHT //Used as a flash here. light_outer_range = 8 light_color = COLOR_WHITE light_power = FLASH_LIGHT_POWER @@ -61,17 +61,17 @@ to_chat(user, span_warning("You must be holding the camera to continue!")) return FALSE var/desired_x = tgui_input_number(user, "How wide do you want the camera to shoot?", "Zoom", picture_size_x, picture_size_x_max, picture_size_x_min) - if(!desired_x || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || loc != user) + if(!desired_x || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK) || loc != user) return FALSE var/desired_y = tgui_input_number(user, "How high do you want the camera to shoot", "Zoom", picture_size_y, picture_size_y_max, picture_size_y_min) - if(!desired_y|| QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || loc != user) + if(!desired_y|| QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK) || loc != user) return FALSE picture_size_x = min(clamp(desired_x, picture_size_x_min, picture_size_x_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) picture_size_y = min(clamp(desired_y, picture_size_y_min, picture_size_y_max), CAMERA_PICTURE_SIZE_HARD_LIMIT) return TRUE /obj/item/camera/AltClick(mob/user) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return adjust_zoom(user) diff --git a/code/modules/photography/photos/album.dm b/code/modules/photography/photos/album.dm index 8f4e6c16b806..234d1c4e4938 100644 --- a/code/modules/photography/photos/album.dm +++ b/code/modules/photography/photos/album.dm @@ -56,7 +56,7 @@ qdel(P) /obj/item/storage/photo_album/hos - name = "photo album (Head of Security)" + name = "photo album (Security Marshal)" icon_state = "album_blue" persistence_id = "HoS" diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 5448be3360b6..600dde18f503 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -72,7 +72,7 @@ to_chat(user, span_notice("You scribble illegibly on [src]!")) return var/txt = tgui_input_text(user, "What would you like to write on the back?", "Photo Writing", max_length = 128) - if(txt && user.canUseTopic(src, BE_CLOSE)) + if(txt && user.canUseTopic(src, USE_CLOSE)) scribble = txt else return ..() @@ -105,7 +105,7 @@ var/n_name = tgui_input_text(usr, "What would you like to label the photo?", "Photo Labelling", max_length = MAX_NAME_LEN) //loc.loc check is for making possible renaming photos in clipboards if(n_name && (loc == usr || loc.loc && loc.loc == usr) && usr.stat == CONSCIOUS && !usr.incapacitated()) - name = "photo[(n_name ? text("- '[n_name]'") : null)]" + name = "photo[(n_name ? "- '[n_name]'" : null)]" add_fingerprint(usr) /obj/item/photo/old diff --git a/code/modules/plumbing/ducts.dm b/code/modules/plumbing/ducts.dm deleted file mode 100644 index 4635f0e0f0b6..000000000000 --- a/code/modules/plumbing/ducts.dm +++ /dev/null @@ -1,371 +0,0 @@ -/* -All the important duct code: -/code/datums/components/plumbing/plumbing.dm -/code/datums/ductnet.dm -*/ -/obj/machinery/duct - name = "fluid duct" - icon = 'icons/obj/plumbing/fluid_ducts.dmi' - icon_state = "nduct" - - use_power = NO_POWER_USE - - ///bitfield with the directions we're connected in - var/connects - ///set to TRUE to disable smart duct behaviour - var/dumb = FALSE - ///wheter we allow our connects to be changed after initialization or not - var/lock_connects = FALSE - ///our ductnet, wich tracks what we're connected to - var/datum/ductnet/duct - ///amount we can transfer per process. note that the ductnet can carry as much as the lowest capacity duct - var/capacity = 10 - - ///the color of our duct - var/duct_color = null - ///TRUE to ignore colors, so yeah we also connect with other colors without issue - var/ignore_colors = FALSE - ///1,2,4,8,16 - var/duct_layer = DUCT_LAYER_DEFAULT - ///whether we allow our layers to be altered - var/lock_layers = FALSE - ///TRUE to let colors connect when forced with a wrench, false to just not do that at all - var/color_to_color_support = TRUE - ///wheter to even bother with plumbing code or not - var/active = TRUE - ///track ducts we're connected to. Mainly for ducts we connect to that we normally wouldn't, like different layers and colors, for when we regenerate the ducts - var/list/neighbours = list() - ///wheter we just unanchored or drop whatever is in the variable. either is safe - var/drop_on_wrench = /obj/item/stack/ducts - -/obj/machinery/duct/Initialize(mapload, no_anchor, color_of_duct = "#ffffff", layer_of_duct = DUCT_LAYER_DEFAULT, force_connects) - . = ..() - - if(no_anchor) - active = FALSE - set_anchored(FALSE) - else if(!can_anchor()) - qdel(src) - CRASH("Overlapping ducts detected") - - if(force_connects) - connects = force_connects //skip change_connects() because we're still initializing and we need to set our connects at one point - if(!lock_layers) - duct_layer = layer_of_duct - if(!ignore_colors) - duct_color = color_of_duct - if(duct_color) - add_atom_colour(duct_color, FIXED_COLOUR_PRIORITY) - - handle_layer() - - for(var/obj/machinery/duct/D in loc) - if(D == src) - continue - if(D.duct_layer & duct_layer) - return INITIALIZE_HINT_QDEL //If we have company, end it all - - attempt_connect() - AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) - -///start looking around us for stuff to connect to -/obj/machinery/duct/proc/attempt_connect() - - for(var/atom/movable/AM in loc) - for(var/datum/component/plumbing/plumber as anything in AM.GetComponents(/datum/component/plumbing)) - if(plumber.active) - disconnect_duct() //let's not built under plumbing machinery - return - - for(var/D in GLOB.cardinals) - if(dumb && !(D & connects)) - continue - for(var/atom/movable/AM in get_step(src, D)) - if(connect_network(AM, D)) - add_connects(D) - update_appearance() - -///see if whatever we found can be connected to -/obj/machinery/duct/proc/connect_network(atom/movable/AM, direction, ignore_color) - if(istype(AM, /obj/machinery/duct)) - return connect_duct(AM, direction, ignore_color) - - for(var/datum/component/plumbing/plumber as anything in AM.GetComponents(/datum/component/plumbing)) - . += connect_plumber(plumber, direction) //so that if one is true, all is true. beautiful. - -///connect to a duct -/obj/machinery/duct/proc/connect_duct(obj/machinery/duct/D, direction, ignore_color) - var/opposite_dir = turn(direction, 180) - if(!active || !D.active) - return - - if(!dumb && D.dumb && !(opposite_dir & D.connects)) - return - if(dumb && D.dumb && !(connects & D.connects)) //we eliminated a few more scenarios in attempt connect - return - - if((duct == D.duct) && duct)//check if we're not just comparing two null values - add_neighbour(D, direction) - - D.add_connects(opposite_dir) - D.update_appearance() - return TRUE //tell the current pipe to also update it's sprite - if(!(D in neighbours)) //we cool - if((duct_color != D.duct_color) && !(ignore_colors || D.ignore_colors)) - return - if(!(duct_layer & D.duct_layer)) - return - - if(D.duct) - if(duct) - duct.assimilate(D.duct) - else - D.duct.add_duct(src) - else - if(duct) - duct.add_duct(D) - else - create_duct() - duct.add_duct(D) - - add_neighbour(D, direction) - - //Delegate to timer subsystem so its handled the next tick and doesnt cause byond to mistake it for an infinite loop and kill the game - addtimer(CALLBACK(D, PROC_REF(attempt_connect))) - - return TRUE - -///connect to a plumbing object -/obj/machinery/duct/proc/connect_plumber(datum/component/plumbing/P, direction) - var/opposite_dir = turn(direction, 180) - - if(duct_layer != P.ducting_layer) - return FALSE - - if(!P.active) - return - - var/comp_directions = P.supply_connects + P.demand_connects //they should never, ever have supply and demand connects overlap or catastrophic failure - if(opposite_dir & comp_directions) - if(!duct) - create_duct() - if(duct.add_plumber(P, opposite_dir)) - neighbours[P.parent] = direction - return TRUE - -///we disconnect ourself from our neighbours. we also destroy our ductnet and tell our neighbours to make a new one -/obj/machinery/duct/proc/disconnect_duct(skipanchor) - if(!skipanchor) //since set_anchored calls us too. - set_anchored(FALSE) - active = FALSE - if(duct) - duct.remove_duct(src) - lose_neighbours() - reset_connects(0) - update_appearance() - if(ispath(drop_on_wrench)) - new drop_on_wrench(drop_location()) - drop_on_wrench = null - if(!QDELETED(src)) - qdel(src) - -///Special proc to draw a new connect frame based on neighbours. not the norm so we can support multiple duct kinds -/obj/machinery/duct/proc/generate_connects() - if(lock_connects) - return - connects = 0 - for(var/A in neighbours) - connects |= neighbours[A] - update_appearance() - -///create a new duct datum -/obj/machinery/duct/proc/create_duct() - duct = new() - duct.add_duct(src) - -///add a duct as neighbour. this means we're connected and will connect again if we ever regenerate -/obj/machinery/duct/proc/add_neighbour(obj/machinery/duct/D, direction) - if(!(D in neighbours)) - neighbours[D] = direction - if(!(src in D.neighbours)) - D.neighbours[src] = turn(direction, 180) - -///remove all our neighbours, and remove us from our neighbours aswell -/obj/machinery/duct/proc/lose_neighbours() - for(var/obj/machinery/duct/D in neighbours) - D.neighbours.Remove(src) - neighbours = list() - -///add a connect direction -/obj/machinery/duct/proc/add_connects(new_connects) //make this a define to cut proc calls? - if(!lock_connects) - connects |= new_connects - -///remove a connect direction -/obj/machinery/duct/proc/remove_connects(dead_connects) - if(!lock_connects) - connects &= ~dead_connects - -///remove our connects -/obj/machinery/duct/proc/reset_connects() - if(!lock_connects) - connects = 0 - -///get a list of the ducts we can connect to if we are dumb -/obj/machinery/duct/proc/get_adjacent_ducts() - var/list/adjacents = list() - for(var/A in GLOB.cardinals) - if(A & connects) - for(var/obj/machinery/duct/D in get_step(src, A)) - if((turn(A, 180) & D.connects) && D.active) - adjacents += D - return adjacents - -/obj/machinery/duct/update_icon_state() - var/temp_icon = initial(icon_state) - for(var/D in GLOB.cardinals) - if(D & connects) - if(D == NORTH) - temp_icon += "_n" - if(D == SOUTH) - temp_icon += "_s" - if(D == EAST) - temp_icon += "_e" - if(D == WEST) - temp_icon += "_w" - icon_state = temp_icon - return ..() - -///update the layer we are on -/obj/machinery/duct/proc/handle_layer() - var/offset - switch(duct_layer)//it's a bitfield, but it's fine because it only works when there's one layer, and multiple layers should be handled differently - if(FIRST_DUCT_LAYER) - offset = -10 - if(SECOND_DUCT_LAYER) - offset = -5 - if(THIRD_DUCT_LAYER) - offset = 0 - if(FOURTH_DUCT_LAYER) - offset = 5 - if(FIFTH_DUCT_LAYER) - offset = 10 - pixel_x = offset - pixel_y = offset - - -/obj/machinery/duct/set_anchored(anchorvalue) - . = ..() - if(isnull(.)) - return - if(anchorvalue) - active = TRUE - attempt_connect() - else - disconnect_duct(TRUE) - -/obj/machinery/duct/wrench_act(mob/living/user, obj/item/I) //I can also be the RPD - ..() - add_fingerprint(user) - I.play_tool_sound(src) - if(anchored || can_anchor()) - set_anchored(!anchored) - user.visible_message( \ - "[user] [anchored ? null : "un"]fastens \the [src].", \ - span_notice("You [anchored ? null : "un"]fasten \the [src]."), \ - span_hear("You hear ratcheting.")) - return TRUE - -///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) - for(var/obj/machinery/duct/D in T) - if(!anchored || D == src) - continue - for(var/A in GLOB.cardinals) - if(A & connects && A & D.connects) - return FALSE - return TRUE - -/obj/machinery/duct/doMove(destination) - . = ..() - disconnect_duct() - set_anchored(FALSE) - -/obj/machinery/duct/Destroy() - disconnect_duct() - return ..() - -/obj/machinery/duct/MouseDrop_T(atom/A, mob/living/user) - if(!istype(A, /obj/machinery/duct)) - return - var/obj/machinery/duct/D = A - var/obj/item/I = user.get_active_held_item() - if(I?.tool_behaviour != TOOL_WRENCH) - to_chat(user, span_warning("You need to be holding a wrench in your active hand to do that!")) - return - if(get_dist(src, D) != 1) - return - var/direction = get_dir(src, D) - if(!(direction in GLOB.cardinals)) - return - if(duct_layer != D.duct_layer) - return - - add_connects(direction) //the connect of the other duct is handled in connect_network, but do this here for the parent duct because it's not necessary in normal cases - add_neighbour(D, direction) - connect_network(D, direction, TRUE) - update_appearance() - -/obj/item/stack/ducts - name = "stack of duct" - desc = "A stack of fluid ducts." - singular_name = "duct" - icon = 'icons/obj/plumbing/fluid_ducts.dmi' - icon_state = "ducts" - mats_per_unit = list(/datum/material/iron=500) - w_class = WEIGHT_CLASS_TINY - novariants = FALSE - max_amount = 50 - item_flags = NOBLUDGEON - merge_type = /obj/item/stack/ducts - ///Color of our duct - var/duct_color = "omni" - ///Default layer of our duct - var/duct_layer = "Default Layer" - ///Assoc index with all the available layers. yes five might be a bit much. Colors uses a global by the way - var/list/layers = list("Second Layer" = SECOND_DUCT_LAYER, "Default Layer" = DUCT_LAYER_DEFAULT, "Fourth Layer" = FOURTH_DUCT_LAYER) - -/obj/item/stack/ducts/examine(mob/user) - . = ..() - . += span_notice("It's current color and layer are [duct_color] and [duct_layer]. Use in-hand to change.") - -/obj/item/stack/ducts/attack_self(mob/user) - var/new_layer = tgui_input_list(user, "Select a layer", "Layer", layers) - if(new_layer) - duct_layer = new_layer - var/new_color = tgui_input_list(user, "Select a color", "Color", GLOB.pipe_paint_colors) - if(new_color) - duct_color = new_color - add_atom_colour(GLOB.pipe_paint_colors[new_color], FIXED_COLOUR_PRIORITY) - -/obj/item/stack/ducts/afterattack(atom/target, user, proximity) - . = ..() - if(!proximity) - return - if(istype(target, /obj/machinery/duct)) - var/obj/machinery/duct/D = target - if(!D.anchored) - add(1) - qdel(D) - check_attach_turf(target) - -/obj/item/stack/ducts/proc/check_attach_turf(atom/target) - if(istype(target, /turf/open) && use(1)) - var/turf/open/open_turf = target - new /obj/machinery/duct(open_turf, FALSE, GLOB.pipe_paint_colors[duct_color], layers[duct_layer]) - playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) - -/obj/item/stack/ducts/fifty - amount = 50 diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm deleted file mode 100644 index 20a602f215d3..000000000000 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ /dev/null @@ -1,103 +0,0 @@ -/**Basic plumbing object. -* It doesn't really hold anything special, YET. -* Objects that are plumbing but not a subtype are as of writing liquid pumps and the reagent_dispenser tank -* Also please note that the plumbing component is toggled on and off by the component using a signal from default_unfasten_wrench, so dont worry about it -*/ -/obj/machinery/plumbing - name = "pipe thing" - icon = 'icons/obj/plumbing/plumbers.dmi' - icon_state = "pump" - density = TRUE - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 7.5 - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - ///Plumbing machinery is always gonna need reagents, so we might aswell put it here - var/buffer = 50 - ///Flags for reagents, like INJECTABLE, TRANSPARENT bla bla everything thats in DEFINES/reagents.dm - var/reagent_flags = TRANSPARENT - ///wheter we partake in rcd construction or not - -/obj/machinery/plumbing/Initialize(mapload, bolt = TRUE) - . = ..() - set_anchored(bolt) - create_reagents(buffer, reagent_flags) - AddComponent(/datum/component/simple_rotation) - interaction_flags_machine |= INTERACT_MACHINE_OFFLINE - -/obj/machinery/plumbing/examine(mob/user) - . = ..() - . += span_notice("The maximum volume display reads: [reagents.maximum_volume] units.") - -/obj/machinery/plumbing/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/machinery/plumbing/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/machinery/plumbing/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - to_chat(user, span_notice("You start furiously plunging [name].")) - if(do_after(user, src, 30)) - to_chat(user, span_notice("You finish plunging the [name].")) - reagents.expose(get_turf(src), TOUCH) //splash on the floor - reagents.clear_reagents() - -/obj/machinery/plumbing/welder_act(mob/living/user, obj/item/I) - . = ..() - if(anchored) - to_chat(user, span_warning("The [name] needs to be unbolted to do that!")) - if(I.tool_start_check(user, amount=0)) - to_chat(user, span_notice("You start slicing the [name] apart.")) - if(I.use_tool(src, user, (1.5 SECONDS), volume=50)) - deconstruct(TRUE) - to_chat(user, span_notice("You slice the [name] apart.")) - return TRUE - -///We can empty beakers in here and everything -/obj/machinery/plumbing/input - name = "input gate" - desc = "Can be manually filled with reagents from containers." - icon_state = "pipe_input" - pass_flags_self = PASSMACHINE | LETPASSTHROW // Small - reagent_flags = TRANSPARENT | REFILLABLE - -/obj/machinery/plumbing/input/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - -///We can fill beakers in here and everything. we dont inheret from input because it has nothing that we need -/obj/machinery/plumbing/output - name = "output gate" - desc = "A manual output for plumbing systems, for taking reagents directly into containers." - icon_state = "pipe_output" - pass_flags_self = PASSMACHINE | LETPASSTHROW // Small - reagent_flags = TRANSPARENT | DRAINABLE - -/obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/tank - name = "chemical tank" - desc = "A massive chemical holding tank." - icon_state = "tank" - buffer = 400 - -/obj/machinery/plumbing/tank/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/tank, bolt, layer) - - -///Layer manifold machine that connects a bunch of layers -/obj/machinery/plumbing/layer_manifold - name = "layer manifold" - desc = "A plumbing manifold for layers." - icon_state = "manifold" - density = FALSE - -/obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) - . = ..() - - AddComponent(/datum/component/plumbing/manifold, bolt, SECOND_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, THIRD_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, FOURTH_DUCT_LAYER) diff --git a/code/modules/plumbing/plumbers/acclimator.dm b/code/modules/plumbing/plumbers/acclimator.dm deleted file mode 100644 index 7cc83ca4f485..000000000000 --- a/code/modules/plumbing/plumbers/acclimator.dm +++ /dev/null @@ -1,113 +0,0 @@ -//we cant use defines in tgui, so use a string instead of magic numbers -#define COOLING "Cooling" -#define HEATING "Heating" -#define NEUTRAL "Neutral" - -///this the plumbing version of a heater/freezer. -/obj/machinery/plumbing/acclimator - name = "chemical acclimator" - desc = "An efficient cooler and heater for the perfect showering temperature or illicit chemical factory." - - icon_state = "acclimator" - base_icon_state = "acclimator" - buffer = 200 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - - ///towards wich temperature do we build? - var/target_temperature = 300 - ///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.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 - var/acclimate_state - /**We can't take anything in, at least till we're emptied. Down side of the round robin chem transfer, otherwise while emptying 5u of an unreacted chem gets added, - and you get nasty leftovers - */ - var/emptying = FALSE - -/obj/machinery/plumbing/acclimator/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/acclimator, bolt, layer) - -/obj/machinery/plumbing/acclimator/process(delta_time) - if(machine_stat & NOPOWER || !enabled || !reagents.total_volume || reagents.chem_temp == target_temperature) - if(acclimate_state != NEUTRAL) - acclimate_state = NEUTRAL - update_appearance() - if(!reagents.total_volume) - emptying = FALSE - return - - if(reagents.chem_temp < target_temperature && acclimate_state != HEATING) //note that we check if the temperature is the same at the start - acclimate_state = HEATING - update_appearance() - else if(reagents.chem_temp > target_temperature && acclimate_state != COOLING) - acclimate_state = COOLING - update_appearance() - if(!emptying) - if(reagents.chem_temp >= target_temperature && target_temperature + allowed_temperature_difference >= reagents.chem_temp) //cooling here - emptying = TRUE - if(reagents.chem_temp <= target_temperature && target_temperature - allowed_temperature_difference <= reagents.chem_temp) //heating here - emptying = TRUE - - if(!emptying) //suspend heating/cooling during emptying phase - 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() - use_power(active_power_usage * delta_time) - else if(acclimate_state != NEUTRAL) - acclimate_state = NEUTRAL - update_appearance() - -/obj/machinery/plumbing/acclimator/update_icon_state() - switch(acclimate_state) - if(COOLING) - icon_state = "[base_icon_state]_cold" - if(HEATING) - icon_state = "[base_icon_state]_hot" - else - icon_state = base_icon_state - return ..() - -/obj/machinery/plumbing/acclimator/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemAcclimator", name) - ui.open() - -/obj/machinery/plumbing/acclimator/ui_data(mob/user) - var/list/data = list() - - data["enabled"] = enabled - data["chem_temp"] = reagents.chem_temp - data["target_temperature"] = target_temperature - data["allowed_temperature_difference"] = allowed_temperature_difference - data["acclimate_state"] = acclimate_state - data["max_volume"] = reagents.maximum_volume - data["reagent_volume"] = reagents.total_volume - data["emptying"] = emptying - return data - -/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) - if("set_allowed_temperature_difference") - var/target = text2num(params["temperature"]) - allowed_temperature_difference = clamp(target, 0, 1000) - if("toggle_power") - enabled = !enabled - if("change_volume") - var/target = text2num(params["volume"]) - reagents.maximum_volume = clamp(round(target), 1, buffer) - -#undef COOLING -#undef HEATING -#undef NEUTRAL diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm deleted file mode 100644 index d615f895cff7..000000000000 --- a/code/modules/plumbing/plumbers/bottler.dm +++ /dev/null @@ -1,97 +0,0 @@ -/obj/machinery/plumbing/bottler - name = "chemical bottler" - desc = "Puts reagents into containers, like bottles and beakers in the tile facing the green light spot, they will exit on the red light spot if successfully filled." - icon_state = "bottler" - layer = ABOVE_ALL_MOB_LAYER - - reagent_flags = TRANSPARENT | DRAINABLE - buffer = 100 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///how much do we fill - var/wanted_amount = 10 - ///where things are sent - var/turf/goodspot = null - ///where things are taken - var/turf/inputspot = null - ///where beakers that are already full will be sent - var/turf/badspot = null - ///Does the plumbing machine have a correct tile setup - var/valid_output_configuration = FALSE - -/obj/machinery/plumbing/bottler/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - setDir(dir) - -/obj/machinery/plumbing/bottler/examine(mob/user) - . = ..() - . += span_notice("A small screen indicates that it will fill for [wanted_amount]u.") - if(!valid_output_configuration) - . += span_warning("A flashing notification on the screen reads: \"Output location error!\"") - -///changes the tile array -/obj/machinery/plumbing/bottler/setDir(newdir) - . = ..() - switch(dir) - if(NORTH) - goodspot = get_step(get_turf(src), NORTH) - inputspot = get_step(get_turf(src), SOUTH) - badspot = get_step(get_turf(src), EAST) - if(SOUTH) - goodspot = get_step(get_turf(src), SOUTH) - inputspot = get_step(get_turf(src), NORTH) - badspot = get_step(get_turf(src), WEST) - if(WEST) - goodspot = get_step(get_turf(src), WEST) - inputspot = get_step(get_turf(src), EAST) - badspot = get_step(get_turf(src), NORTH) - if(EAST) - goodspot = get_step(get_turf(src), EAST) - inputspot = get_step(get_turf(src), WEST) - badspot = get_step(get_turf(src), SOUTH) - - //If by some miracle - if( ( !valid_output_configuration ) && ( goodspot != null && inputspot != null && badspot != null ) ) - valid_output_configuration = TRUE - begin_processing() - -///changing input ammount with a window -/obj/machinery/plumbing/bottler/interact(mob/user) - . = ..() - if(!valid_output_configuration) - to_chat(user, span_warning("A flashing notification on the screen reads: \"Output location error!\"")) - return . - var/new_amount = tgui_input_number(user, "Set Amount to Fill", "Desired Amount", max_value = 100) - if(!new_amount || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return . - wanted_amount = new_amount - to_chat(user, span_notice(" The [src] will now fill for [wanted_amount]u.")) - -/obj/machinery/plumbing/bottler/process(delta_time) - if(machine_stat & NOPOWER) - return - // Sanity check the result locations and stop processing if they don't exist - if(goodspot == null || badspot == null || inputspot == null) - valid_output_configuration = FALSE - return PROCESS_KILL - - ///see if machine has enough to fill, is anchored down and has any inputspot objects to pick from - if(reagents.total_volume >= wanted_amount && anchored && length(inputspot.contents)) - use_power(active_power_usage * delta_time) - var/obj/AM = pick(inputspot.contents)///pick a reagent_container that could be used - if((istype(AM, /obj/item/reagent_containers) && !istype(AM, /obj/item/reagent_containers/hypospray/medipen)) || istype(AM, /obj/item/ammo_casing/shotgun/dart)) - var/obj/item/reagent_containers/B = AM - ///see if it would overflow else inject - if((B.reagents.total_volume + wanted_amount) <= B.reagents.maximum_volume) - reagents.trans_to(B, wanted_amount, transfered_by = src) - B.forceMove(goodspot) - return - ///glass was full so we move it away - AM.forceMove(badspot) - if(istype(AM, /obj/item/slime_extract)) ///slime extracts need inject - AM.forceMove(goodspot) - reagents.trans_to(AM, wanted_amount, transfered_by = src, methods = INJECT) - return - if(istype(AM, /obj/item/slimecross/industrial)) ///no need to move slimecross industrial things - reagents.trans_to(AM, wanted_amount, transfered_by = src, methods = INJECT) - return diff --git a/code/modules/plumbing/plumbers/destroyer.dm b/code/modules/plumbing/plumbers/destroyer.dm deleted file mode 100644 index e6aecd95bcab..000000000000 --- a/code/modules/plumbing/plumbers/destroyer.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/machinery/plumbing/disposer - name = "chemical disposer" - desc = "Breaks down chemicals and annihilates them." - icon_state = "disposal" - pass_flags_self = PASSMACHINE | LETPASSTHROW // Small - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///we remove 5 reagents per second - var/disposal_rate = 5 - -/obj/machinery/plumbing/disposer/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/disposer/process(delta_time) - if(machine_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 * delta_time) - use_power(active_power_usage * delta_time) - else - if(icon_state != initial(icon_state)) - icon_state = initial(icon_state) - diff --git a/code/modules/plumbing/plumbers/fermenter.dm b/code/modules/plumbing/plumbers/fermenter.dm deleted file mode 100644 index 9cc652faf64e..000000000000 --- a/code/modules/plumbing/plumbers/fermenter.dm +++ /dev/null @@ -1,52 +0,0 @@ -/obj/machinery/plumbing/fermenter - name = "chemical fermenter" - desc = "Turns plants into various types of booze." - icon_state = "fermenter" - layer = ABOVE_ALL_MOB_LAYER - - reagent_flags = TRANSPARENT | DRAINABLE - buffer = 400 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///input dir - var/eat_dir = SOUTH - -/obj/machinery/plumbing/fermenter/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/machinery/plumbing/fermenter/setDir(newdir) - . = ..() - eat_dir = newdir - -/obj/machinery/plumbing/fermenter/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(!anchored) - return - if(border_dir == eat_dir) - return TRUE - -/obj/machinery/plumbing/fermenter/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == src) - return - ferment(AM) - -/// uses fermentation proc similar to fermentation barrels -/obj/machinery/plumbing/fermenter/proc/ferment(atom/AM) - if(machine_stat & NOPOWER) - return - if(reagents.holder_full()) - return - if(!isitem(AM)) - return - if(istype(AM, /obj/item/food/grown)) - var/obj/item/food/grown/G = AM - if(G.distill_reagent) - var/amount = G.seed.potency * 0.25 - reagents.add_reagent(G.distill_reagent, amount) - use_power(active_power_usage * amount) - qdel(G) diff --git a/code/modules/plumbing/plumbers/filter.dm b/code/modules/plumbing/plumbers/filter.dm deleted file mode 100644 index 1fa216f934c6..000000000000 --- a/code/modules/plumbing/plumbers/filter.dm +++ /dev/null @@ -1,68 +0,0 @@ -///chemical plumbing filter. If it's not filtered by left and right, it goes straight. -/obj/machinery/plumbing/filter - name = "chemical filter" - desc = "A chemical filter for filtering chemicals. The left and right outputs appear to be from the perspective of the input port." - icon_state = "filter" - density = FALSE - - ///whitelist of chems id's that go to the left side. Empty to disable port - var/list/left = list() - ///whitelist of chem id's that go to the right side. Empty to disable port - var/list/right = list() - ///whitelist of chems but their name instead of path - var/list/english_left = list() - ///whitelist of chems but their name instead of path - var/list/english_right = list() - -/obj/machinery/plumbing/filter/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/filter, bolt, layer) - -/obj/machinery/plumbing/filter/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemFilter", name) - ui.open() - -/obj/machinery/plumbing/filter/ui_data(mob/user) - var/list/data = list() - data["left"] = english_left - data["right"] = english_right - return data - -/obj/machinery/plumbing/filter/ui_act(action, params) - . = ..() - if(.) - return - . = TRUE - switch(action) - if("add") - var/new_chem_name = params["name"] - var/chem_id = get_chem_id(new_chem_name) - if(chem_id) - switch(params["which"]) - if("left") - if(!left.Find(chem_id)) - english_left += new_chem_name - left += chem_id - if("right") - if(!right.Find(chem_id)) - english_right += new_chem_name - right += chem_id - else - to_chat(usr, span_warning("No such known reagent exists!")) - - if("remove") - var/chem_name = params["reagent"] - var/chem_id = get_chem_id(chem_name) - switch(params["which"]) - if("left") - if(english_left.Find(chem_name)) - english_left -= chem_name - left -= chem_id - if("right") - if(english_right.Find(chem_name)) - english_right -= chem_name - right -= chem_id - - diff --git a/code/modules/plumbing/plumbers/grinder_chemical.dm b/code/modules/plumbing/plumbers/grinder_chemical.dm deleted file mode 100644 index 339b0985f150..000000000000 --- a/code/modules/plumbing/plumbers/grinder_chemical.dm +++ /dev/null @@ -1,59 +0,0 @@ -/obj/machinery/plumbing/grinder_chemical - name = "chemical grinder" - desc = "chemical grinder." - icon_state = "grinder_chemical" - layer = ABOVE_ALL_MOB_LAYER - - reagent_flags = TRANSPARENT | DRAINABLE - buffer = 400 - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - var/eat_dir = SOUTH - -/obj/machinery/plumbing/grinder_chemical/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/machinery/plumbing/grinder_chemical/setDir(newdir) - . = ..() - eat_dir = newdir - -/obj/machinery/plumbing/grinder_chemical/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(!anchored) - return - if(border_dir == eat_dir) - return TRUE - -/obj/machinery/plumbing/grinder_chemical/proc/on_entered(datum/source, atom/movable/AM) - SIGNAL_HANDLER - if(AM == src) - return - grind(AM) - -/obj/machinery/plumbing/grinder_chemical/proc/grind(atom/AM) - if(machine_stat & NOPOWER) - return - if(reagents.holder_full()) - return - if(!isitem(AM)) - return - var/obj/item/I = AM - if(I.juice_results || I.grind_results) - use_power(active_power_usage) - if(I.juice_results) - I.on_juice() - reagents.add_reagent_list(I.juice_results) - if(I.reagents) - I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) - qdel(I) - return - I.on_grind() - reagents.add_reagent_list(I.grind_results) - if(I.reagents) - I.reagents.trans_to(src, I.reagents.total_volume, transfered_by = src) - qdel(I) - diff --git a/code/modules/plumbing/plumbers/pill_press.dm b/code/modules/plumbing/plumbers/pill_press.dm deleted file mode 100644 index 59a234746f56..000000000000 --- a/code/modules/plumbing/plumbers/pill_press.dm +++ /dev/null @@ -1,167 +0,0 @@ -///We take a constant input of reagents, and produce a pill once a set volume is reached -/obj/machinery/plumbing/pill_press - name = "chemical press" - desc = "A press that makes pills, patches and bottles." - icon_state = "pill_press" - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///maximum size of a pill - var/max_pill_volume = 50 - ///maximum size of a patch - var/max_patch_volume = 40 - ///maximum size of a bottle - var/max_bottle_volume = 30 - ///current operating product (pills or patches) - var/product = "pill" - //PARIAH EDIT ADDITION - maximum size of a vial - var/max_vial_volume = 60 - //PARIAH EDIT END - ///the minimum size a pill or patch can be - var/min_volume = 5 - ///the maximum size a pill or patch can be - var/max_volume = 50 - ///selected size of the product - var/current_volume = 10 - ///prefix for the product name - var/product_name = "factory" - ///the icon_state number for the pill. - var/pill_number = RANDOM_PILL_STYLE - ///list of id's and icons for the pill selection of the ui - var/list/pill_styles - /// Currently selected patch style - var/patch_style = DEFAULT_PATCH_STYLE - /// List of available patch styles for UI - var/list/patch_styles - ///list of products stored in the machine, so we dont have 610 pills on one tile - var/list/stored_products = list() - ///max amount of pills allowed on our tile before we start storing them instead - var/max_floor_products = 10 - -/obj/machinery/plumbing/pill_press/examine(mob/user) - . = ..() - . += span_notice("The [name] currently has [stored_products.len] stored. There needs to be less than [max_floor_products] on the floor to continue dispensing.") - -/obj/machinery/plumbing/pill_press/Initialize(mapload, bolt, layer) - . = ..() - - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/pill_press/process(delta_time) - if(machine_stat & NOPOWER) - return - if(reagents.total_volume >= current_volume) - if (product == "pill") - var/obj/item/reagent_containers/pill/P = new(src) - reagents.trans_to(P, current_volume) - P.name = trim("[product_name] pill") - stored_products += P - if(pill_number == RANDOM_PILL_STYLE) - P.icon_state = "pill[rand(1,21)]" - else - P.icon_state = "pill[pill_number]" - if(P.icon_state == "pill4") //mirrored from chem masters - 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." - else if (product == "patch") - var/obj/item/reagent_containers/pill/patch/P = new(src) - reagents.trans_to(P, current_volume) - P.name = trim("[product_name] patch") - P.icon_state = patch_style - stored_products += P - else if (product == "bottle") - var/obj/item/reagent_containers/glass/bottle/P = new(src) - reagents.trans_to(P, current_volume) - P.name = trim("[product_name] bottle") - stored_products += P - //PARIAH EDIT ADDITION - else if (product == "vial") - var/obj/item/reagent_containers/glass/vial/small/P = new(src) - reagents.trans_to(P, current_volume) - P.name = trim("[product_name] vial") - stored_products += P - //PARIAH EDIT END - if(stored_products.len) - var/pill_amount = 0 - for(var/thing in loc) - if(!istype(thing, /obj/item/reagent_containers/glass/bottle) && !istype(thing, /obj/item/reagent_containers/pill)) - continue - pill_amount++ - if(pill_amount >= max_floor_products) //too much so just stop - break - if(pill_amount < max_floor_products && anchored) - var/atom/movable/AM = stored_products[1] //AM because forceMove is all we need - stored_products -= AM - AM.forceMove(drop_location()) - - use_power(active_power_usage * delta_time) - -/obj/machinery/plumbing/pill_press/proc/load_styles() - //expertly copypasted from chemmasters - var/datum/asset/spritesheet/simple/assets = get_asset_datum(/datum/asset/spritesheet/simple/pills) - pill_styles = list() - for (var/x in 1 to PILL_STYLE_COUNT) - var/list/SL = list() - SL["id"] = x - SL["class_name"] = assets.icon_class_name("pill[x]") - pill_styles += list(SL) - var/datum/asset/spritesheet/simple/patches_assets = get_asset_datum(/datum/asset/spritesheet/simple/patches) - patch_styles = list() - for (var/raw_patch_style in PATCH_STYLE_LIST) - //adding class_name for use in UI - var/list/patch_style = list() - patch_style["style"] = raw_patch_style - patch_style["class_name"] = patches_assets.icon_class_name(raw_patch_style) - patch_styles += list(patch_style) - -/obj/machinery/plumbing/pill_press/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/simple/pills), - get_asset_datum(/datum/asset/spritesheet/simple/patches), - ) - -/obj/machinery/plumbing/pill_press/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemPress", name) - ui.open() - -/obj/machinery/plumbing/pill_press/ui_data(mob/user) - if(!pill_styles || !patch_styles) - load_styles() - var/list/data = list() - data["pill_style"] = pill_number - data["current_volume"] = current_volume - data["product_name"] = product_name - data["pill_styles"] = pill_styles - data["product"] = product - data["min_volume"] = min_volume - data["max_volume"] = max_volume - data["patch_style"] = patch_style - data["patch_styles"] = patch_styles - return data - -/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) - if("change_current_volume") - current_volume = clamp(text2num(params["volume"]), min_volume, max_volume) - if("change_product_name") - product_name = html_encode(params["name"]) - if("change_product") - product = params["product"] - if (product == "pill") - max_volume = max_pill_volume - else if (product == "patch") - max_volume = max_patch_volume - else if (product == "bottle") - max_volume = max_bottle_volume - //PARIAH EDIT ADDITION - else if (product == "vial") - max_volume = max_vial_volume - //PARIAH EDIT END - current_volume = clamp(current_volume, min_volume, max_volume) - if("change_patch_style") - patch_style = params["patch_style"] diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm deleted file mode 100644 index 98616d8894dd..000000000000 --- a/code/modules/plumbing/plumbers/plumbing_buffer.dm +++ /dev/null @@ -1,128 +0,0 @@ -#define UNREADY 0 -#define IDLE 1 -#define READY 2 - -/obj/machinery/plumbing/buffer - name = "automatic buffer" - desc = "A chemical holding tank that waits for neighbouring automatic buffers to complete before allowing a withdrawal. Connect/reset by screwdrivering" - icon_state = "buffer" - pass_flags_self = PASSMACHINE | LETPASSTHROW // It looks short enough. - buffer = 200 - - var/datum/buffer_net/buffer_net - var/activation_volume = 100 - var/mode - -/obj/machinery/plumbing/buffer/Initialize(mapload, bolt, layer) - . = ..() - - AddComponent(/datum/component/plumbing/buffer, bolt, layer) - -/obj/machinery/plumbing/buffer/create_reagents(max_vol, flags) - . = ..() - RegisterSignal(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/plumbing/buffer/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_PARENT_QDELETING)) - return NONE - -/obj/machinery/plumbing/buffer/proc/on_reagent_change() - SIGNAL_HANDLER - if(!buffer_net) - return - if(reagents.total_volume + CHEMICAL_QUANTISATION_LEVEL >= activation_volume && mode == UNREADY) - mode = IDLE - buffer_net.check_active() - - else if(reagents.total_volume + CHEMICAL_QUANTISATION_LEVEL < activation_volume && mode != UNREADY) - mode = UNREADY - buffer_net.check_active() - -/obj/machinery/plumbing/buffer/update_icon() - . = ..() - icon_state = initial(icon_state) - if(buffer_net) - switch(mode) - if(UNREADY) - icon_state += "_red" - if(IDLE) - icon_state += "_yellow" - if(READY) - icon_state += "_green" - -/obj/machinery/plumbing/buffer/proc/attempt_connect() - - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - for(var/atom/movable/movable in T) - if(istype(movable, /obj/machinery/plumbing/buffer)) - var/obj/machinery/plumbing/buffer/neighbour = movable - if(neighbour.buffer_net != buffer_net) - neighbour.buffer_net?.destruct() - //we could put this on a proc, but its so simple I dont think its worth the overhead - buffer_net.buffer_list += neighbour - neighbour.buffer_net = buffer_net - neighbour.attempt_connect() //technically this would runtime if you made about 200~ buffers - - add_overlay(icon_state + "_alert") - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, cut_overlay), icon_state + "_alert"), 20) - -/obj/machinery/plumbing/buffer/attack_hand_secondary(mob/user, modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return - - . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - var/new_volume = tgui_input_number(user, "Enter new activation threshold", "Beepityboop", activation_volume, buffer) - if(!new_volume || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - activation_volume = new_volume - to_chat(user, span_notice("New activation threshold is now [activation_volume].")) - return - -/obj/machinery/plumbing/buffer/attackby(obj/item/item, mob/user, params) - if(item.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, span_notice("You reset the automatic buffer.")) - - //reset the net - buffer_net?.destruct() - buffer_net = new() - LAZYADD(buffer_net.buffer_list, src) - - attempt_connect() - else - return . = ..() - -/obj/machinery/plumbing/buffer/doMove(destination) - . = ..() - buffer_net?.destruct() - -/datum/buffer_net - var/list/obj/machinery/plumbing/buffer/buffer_list - -/datum/buffer_net/proc/destruct() - for(var/obj/machinery/plumbing/buffer/buffer in buffer_list) - buffer.buffer_net = null - buffer_list.Cut() - qdel(src) - -/datum/buffer_net/proc/check_active() - var/ready = TRUE - for(var/obj/machinery/plumbing/buffer/buffer in buffer_list) - if(buffer.mode == UNREADY) - ready = FALSE - break - for(var/obj/machinery/plumbing/buffer/buffer in buffer_list) - if(buffer.mode == READY && !ready) - buffer.mode = IDLE - else if(buffer.mode == IDLE && ready) - buffer.mode = READY - buffer.update_icon() - -#undef UNREADY -#undef IDLE -#undef READY diff --git a/code/modules/plumbing/plumbers/pumps.dm b/code/modules/plumbing/plumbers/pumps.dm deleted file mode 100644 index c10cacbc7ec5..000000000000 --- a/code/modules/plumbing/plumbers/pumps.dm +++ /dev/null @@ -1,60 +0,0 @@ -///We pump liquids from activated(plungerated) geysers to a plumbing outlet. We need to be wired. -/obj/machinery/plumbing/liquid_pump - name = "liquid pump" - desc = "Pump up those sweet liquids from under the surface. Uses thermal energy from geysers to power itself." //better than placing 200 cables, because it wasn't fun - icon = 'icons/obj/plumbing/plumbers.dmi' - icon_state = "pump" - base_icon_state = "pump" - anchored = FALSE - density = TRUE - use_power = NO_POWER_USE - - ///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 - var/obj/structure/geyser/geyser - ///volume of our internal buffer - var/volume = 200 - -/obj/machinery/plumbing/liquid_pump/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - -///please note that the component has a hook in the parent call, wich handles activating and deactivating -/obj/machinery/plumbing/liquid_pump/default_unfasten_wrench(mob/user, obj/item/I, time = 20) - . = ..() - if(. == SUCCESSFUL_UNFASTEN) - geyser = null - update_appearance() - geyserless = FALSE //we switched state, so lets just set this back aswell - -/obj/machinery/plumbing/liquid_pump/process(delta_time) - if(!anchored || panel_open || geyserless) - return - - if(!geyser) - for(var/obj/structure/geyser/G in loc.contents) - geyser = G - update_appearance() - if(!geyser) //we didnt find one, abort - geyserless = TRUE - visible_message(span_warning("The [name] makes a sad beep!")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50) - return - - pump(delta_time) - -///pump up that sweet geyser nectar -/obj/machinery/plumbing/liquid_pump/proc/pump(delta_time) - if(!geyser || !geyser.reagents) - return - geyser.reagents.trans_to(src, pump_power * delta_time) - -/obj/machinery/plumbing/liquid_pump/update_icon_state() - if(geyser) - icon_state = "[base_icon_state]-on" - return ..() - icon_state = "[base_icon_state][panel_open ? "-open" : null]" - return ..() diff --git a/code/modules/plumbing/plumbers/reaction_chamber.dm b/code/modules/plumbing/plumbers/reaction_chamber.dm deleted file mode 100644 index 041e74616d57..000000000000 --- a/code/modules/plumbing/plumbers/reaction_chamber.dm +++ /dev/null @@ -1,138 +0,0 @@ -///a reaction chamber for plumbing. pretty much everything can react, but this one keeps the reagents separated and only reacts under your given terms -/obj/machinery/plumbing/reaction_chamber - name = "reaction chamber" - desc = "Keeps chemicals separated until given conditions are met." - icon_state = "reaction_chamber" - buffer = 200 - reagent_flags = TRANSPARENT | NO_REACT - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - /** - * list of set reagents that the reaction_chamber allows in, and must all be present before mixing is enabled. - * example: list(/datum/reagent/water = 20, /datum/reagent/fuel/oil = 50) - */ - var/list/required_reagents = list() - ///If above this pH, we start dumping buffer into it - var/acidic_limit = 9 - ///If below this pH, we start dumping buffer into it - var/alkaline_limit = 5 - ///our reagent goal has been reached, so now we lock our inputs and start emptying - var/emptying = FALSE - - ///towards which temperature do we build (except during draining)? - var/target_temperature = 300 - ///cool/heat power - var/heater_coefficient = 0.05 //same lvl as acclimator - ///Beaker that holds the acidic buffer. I don't want to deal with snowflaking so it's just a separate thing. It's a small (50u) beaker - var/obj/item/reagent_containers/glass/beaker/acidic_beaker - ///beaker that holds the alkaline buffer. - var/obj/item/reagent_containers/glass/beaker/alkaline_beaker - -/obj/machinery/plumbing/reaction_chamber/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/reaction_chamber, bolt, layer) - - acidic_beaker = new (src) - alkaline_beaker = new (src) - - AddComponent(/datum/component/plumbing/acidic_input, bolt, custom_receiver = acidic_beaker) - AddComponent(/datum/component/plumbing/alkaline_input, bolt, custom_receiver = alkaline_beaker) - -/// Make sure beakers are deleted when being deconstructed -/obj/machinery/plumbing/reaction_chamber/Destroy() - QDEL_NULL(acidic_beaker) - QDEL_NULL(alkaline_beaker) - . = ..() - -/obj/machinery/plumbing/reaction_chamber/create_reagents(max_vol, flags) - . = ..() - RegisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/plumbing/reaction_chamber/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_PARENT_QDELETING)) - return NONE - - -/// Handles stopping the emptying process when the chamber empties. -/obj/machinery/plumbing/reaction_chamber/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - if(holder.total_volume == 0 && emptying) //we were emptying, but now we aren't - emptying = FALSE - holder.flags |= NO_REACT - return NONE - -/obj/machinery/plumbing/reaction_chamber/process(delta_time) - if(reagents.is_reacting && reagents.ph < alkaline_limit) - alkaline_beaker.reagents.trans_to(reagents, 1 * delta_time) - if(reagents.is_reacting && reagents.ph > acidic_limit) - acidic_beaker.reagents.trans_to(reagents, 1 * delta_time) - - if(!emptying || reagents.is_reacting) //suspend heating/cooling during emptying phase - 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() - - use_power(active_power_usage * delta_time) - -/obj/machinery/plumbing/reaction_chamber/power_change() - . = ..() - if(use_power != NO_POWER_USE) - icon_state = initial(icon_state) + "_on" - else - icon_state = initial(icon_state) - -/obj/machinery/plumbing/reaction_chamber/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemReactionChamber", name) - ui.open() - -/obj/machinery/plumbing/reaction_chamber/ui_data(mob/user) - var/list/data = list() - - var/list/reagents_data = list() - for(var/datum/reagent/required_reagent as anything in required_reagents) //make a list where the key is text, because that looks alot better in the ui than a typepath - var/list/reagent_data = list() - reagent_data["name"] = initial(required_reagent.name) - reagent_data["required_reagent"] = required_reagents[required_reagent] - reagents_data += list(reagent_data) - - data["reagents"] = reagents_data - data["emptying"] = emptying - data["temperature"] = round(reagents.chem_temp, 0.1) - data["ph"] = round(reagents.ph, 0.01) - data["targetTemp"] = target_temperature - data["isReacting"] = reagents.is_reacting - data["reagentAcidic"] = acidic_limit - data["reagentAlkaline"] = alkaline_limit - return data - -/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) - 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 - if("temperature") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - target_temperature = clamp(target, 0, 1000) - if("acidic") - acidic_limit = round(text2num(params["target"])) - if("alkaline") - alkaline_limit = round(text2num(params["target"])) - diff --git a/code/modules/plumbing/plumbers/splitters.dm b/code/modules/plumbing/plumbers/splitters.dm deleted file mode 100644 index e18a3a49b055..000000000000 --- a/code/modules/plumbing/plumbers/splitters.dm +++ /dev/null @@ -1,51 +0,0 @@ -///it splits the reagents however you want. So you can "every 60 units, 45 goes left and 15 goes straight". The side direction is EAST, you can change this in the component -/obj/machinery/plumbing/splitter - name = "Chemical Splitter" - desc = "A chemical splitter for smart chemical factorization. Waits till a set of conditions is met and then stops all input and splits the buffer evenly or other in two ducts." - icon_state = "splitter" - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - buffer = 100 - density = FALSE - - ///constantly switches between TRUE and FALSE. TRUE means the batch tick goes straight, FALSE means the next batch goes in the side duct. - var/turn_straight = TRUE - ///how much we must transfer straight. note input can be as high as 10 reagents per process, usually - var/transfer_straight = 5 - ///how much we must transfer to the side - var/transfer_side = 5 - //the maximum you can set the transfer to - var/max_transfer = 9 - -/obj/machinery/plumbing/splitter/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/splitter, bolt, layer) - -/obj/machinery/plumbing/splitter/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemSplitter", name) - ui.open() - -/obj/machinery/plumbing/splitter/ui_data(mob/user) - var/list/data = list() - data["straight"] = transfer_straight - data["side"] = transfer_side - data["max_transfer"] = max_transfer - return data - -/obj/machinery/plumbing/splitter/ui_act(action, params) - . = ..() - if(.) - return - . = TRUE - switch(action) - if("set_amount") - var/direction = params["target"] - var/value = clamp(text2num(params["amount"]), 1, max_transfer) - switch(direction) - if("straight") - transfer_straight = value - if("side") - transfer_side = value - else - return FALSE diff --git a/code/modules/plumbing/plumbers/synthesizer.dm b/code/modules/plumbing/plumbers/synthesizer.dm deleted file mode 100644 index 7e2728f3f64b..000000000000 --- a/code/modules/plumbing/plumbers/synthesizer.dm +++ /dev/null @@ -1,105 +0,0 @@ -///A single machine that produces a single chem. Can be placed in unison with others through plumbing to create chemical factories -/obj/machinery/plumbing/synthesizer - name = "chemical synthesizer" - desc = "Produces a single chemical at a given volume. Must be plumbed. Most effective when working in unison with other chemical synthesizers, heaters and filters." - - icon_state = "synthesizer" - icon = 'icons/obj/plumbing/plumbers.dmi' - active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - ///Amount we produce for every process. Ideally keep under 5 since thats currently the standard duct capacity - var/amount = 1 - ///I track them here because I have no idea how I'd make tgui loop like that - var/static/list/possible_amounts = list(0,1,2,3,4,5) - ///The reagent we are producing. We are a typepath, but are also typecast because there's several occations where we need to use initial. - var/datum/reagent/reagent_id = null - ///straight up copied from chem dispenser. Being a subtype would be extremely tedious and making it global would restrict potential subtypes using different dispensable_reagents - var/list/dispensable_reagents = list( - /datum/reagent/aluminium, - /datum/reagent/bromine, - /datum/reagent/carbon, - /datum/reagent/chlorine, - /datum/reagent/copper, - /datum/reagent/consumable/ethanol, - /datum/reagent/fluorine, - /datum/reagent/hydrogen, - /datum/reagent/iodine, - /datum/reagent/iron, - /datum/reagent/lithium, - /datum/reagent/mercury, - /datum/reagent/nitrogen, - /datum/reagent/oxygen, - /datum/reagent/phosphorus, - /datum/reagent/potassium, - /datum/reagent/uranium/radium, - /datum/reagent/silicon, - /datum/reagent/sodium, - /datum/reagent/stable_plasma, - /datum/reagent/consumable/sugar, - /datum/reagent/sulfur, - /datum/reagent/toxin/acid, - /datum/reagent/water, - /datum/reagent/fuel, - ) - -/obj/machinery/plumbing/synthesizer/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - -/obj/machinery/plumbing/synthesizer/process(delta_time) - if(machine_stat & NOPOWER || !reagent_id || !amount) - return - 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*delta_time*0.5) - use_power(active_power_usage * amount * delta_time * 0.5) - -/obj/machinery/plumbing/synthesizer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "ChemSynthesizer", name) - ui.open() - -/obj/machinery/plumbing/synthesizer/ui_data(mob/user) - var/list/data = list() - - var/is_hallucinating = user.hallucinating() - var/list/chemicals = list() - - for(var/A in dispensable_reagents) - var/datum/reagent/R = GLOB.chemical_reagents_list[A] - if(R) - var/chemname = R.name - if(is_hallucinating && prob(5)) - chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" - chemicals.Add(list(list("title" = chemname, "id" = ckey(R.name)))) - data["chemicals"] = chemicals - data["amount"] = amount - data["possible_amounts"] = possible_amounts - - data["current_reagent"] = ckey(initial(reagent_id.name)) - return data - -/obj/machinery/plumbing/synthesizer/ui_act(action, params) - . = ..() - if(.) - return - . = TRUE - switch(action) - if("amount") - var/new_amount = text2num(params["target"]) - if(new_amount in possible_amounts) - amount = new_amount - . = TRUE - if("select") - var/new_reagent = GLOB.name2reagent[params["reagent"]] - if(new_reagent in dispensable_reagents) - reagent_id = new_reagent - . = TRUE - update_appearance() - reagents.clear_reagents() - -/obj/machinery/plumbing/synthesizer/update_overlays() - . = ..() - var/mutable_appearance/r_overlay = mutable_appearance(icon, "[icon_state]_overlay") - r_overlay.color = reagent_id ? initial(reagent_id.color) : "#FFFFFF" - . += r_overlay diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm deleted file mode 100644 index 5956bf95436b..000000000000 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ /dev/null @@ -1,128 +0,0 @@ -///A bluespace input pipe for plumbing -/obj/machinery/plumbing/sender - name = "chemical beacon" - desc = "A bluespace anchor for chemicals. Does not require power. Use a multitool linked to a Chemical Recipient on this machine to start teleporting reagents." - icon_state = "beacon" - - density = FALSE - - ///whoever we teleport our chems to - var/obj/machinery/plumbing/receiver/target = null - -/obj/machinery/plumbing/sender/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/sender/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - - var/obj/item/multitool/M = I - - if(!istype(M.buffer, /obj/machinery/plumbing/receiver)) - to_chat(user, span_warning("Invalid buffer.")) - return - - if(target) - lose_teleport_target() - - set_teleport_target(M.buffer) - - to_chat(user, span_green("You succesfully link [src] to the [M.buffer].")) - return TRUE - -///Lose our previous target and make our previous target lose us. Seperate proc because I feel like I'll need this again -/obj/machinery/plumbing/sender/proc/lose_teleport_target() - target.senders.Remove(src) - target = null - icon_state = initial(icon_state) - -///Set a receiving plumbing object -/obj/machinery/plumbing/sender/proc/set_teleport_target(new_target) - target = new_target - target.senders.Add(src) - icon_state = initial(icon_state) + "_idle" - -///Transfer reagents and display a flashing icon -/obj/machinery/plumbing/sender/proc/teleport_chemicals(obj/machinery/plumbing/receiver/R, amount) - flick(initial(icon_state) + "_flash", src) - reagents.trans_to(R, amount, round_robin = TRUE) - -///A bluespace output pipe for plumbing. Supports multiple recipients. Must be constructed with a circuit board -/obj/machinery/plumbing/receiver - name = "chemical recipient" - desc = "Receives chemicals from one or more chemical beacons. Use a multitool on this machine and then all subsequent chemical beacons. Reset by opening the \ - panel and cutting the main wire." - icon_state = "recipient" - - buffer = 150 - - ///How much chemicals we can teleport per process - var/pull_amount = 20 - ///All synced up chemical beacons we can tap from - var/list/senders = list() - ///We only grab one machine per process, so store which one is next - var/next_index = 1 - -/obj/machinery/plumbing/receiver/Initialize(mapload, bolt) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt) - -/obj/machinery/plumbing/receiver/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - - var/obj/item/multitool/M = I - M.buffer = src - to_chat(user, span_notice("You store linkage information in [I]'s buffer.")) - return TRUE - -/obj/machinery/plumbing/receiver/process(delta_time) - if(machine_stat & NOPOWER || panel_open) - return - - if(senders.len) - if(senders.len < next_index) - next_index = 1 - - var/obj/machinery/plumbing/sender/S = senders[next_index] - if(QDELETED(S)) - senders.Remove(S) - return - - S.teleport_chemicals(src, pull_amount) - - flick(initial(icon_state) + "_flash", src) - - next_index++ - - use_power(active_power_usage * delta_time) - -///Notify all senders to forget us -/obj/machinery/plumbing/receiver/proc/lose_senders() - for(var/A in senders) - var/obj/machinery/plumbing/sender/S = A - if(S == null) - continue - S.lose_teleport_target() - - senders = list() - -/obj/machinery/plumbing/receiver/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, icon_state + "_open", initial(icon_state), I)) - update_appearance() - return - - if(default_pry_open(I)) - return - - if(default_deconstruction_crowbar(I)) - return - - return ..() - -/obj/machinery/plumbing/receiver/wirecutter_act(mob/living/user, obj/item/I) - . = ..() - - if(panel_open) - lose_senders() diff --git a/code/modules/power/apc/apc_attack.dm b/code/modules/power/apc/apc_attack.dm index 6425129378c6..371fa40031da 100644 --- a/code/modules/power/apc/apc_attack.dm +++ b/code/modules/power/apc/apc_attack.dm @@ -173,7 +173,7 @@ . = ..() if(!can_interact(user)) return - if(!user.canUseTopic(src, !issilicon(user)) || !isturf(loc)) + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH) || !isturf(loc)) return if(!ishuman(user)) return diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index 228b71212b59..907a01eced4b 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -5,6 +5,7 @@ // may be opened to change power cell // three different channels (lighting/equipment/environ) - may each be set to on, off, or auto +DEFINE_INTERACTABLE(/obj/machinery/power/apc) /obj/machinery/power/apc name = "area power controller" desc = "A control terminal for the area's electrical systems." @@ -115,13 +116,15 @@ /// Offsets the object by APC_PIXEL_OFFSET (defined in apc_defines.dm) pixels in the direction we want it placed in. This allows the APC to be embedded in a wall, yet still inside an area (like mapping). var/offset_old +GLOBAL_REAL_VAR(default_apc_armor) = list(BLUNT = 20, PUNCTURE = 20, SLASH = 0, LASER = 10, ENERGY = 100, BOMB = 30, BIO = 100, FIRE = 90, ACID = 50) + /obj/machinery/power/apc/New(turf/loc, ndir, building=0) 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, FIRE = 90, ACID = 50) + armor = global.default_apc_armor ..() - GLOB.apcs_list += src + SET_TRACKING(__TYPE__) wires = new /datum/wires/apc(src) @@ -177,7 +180,7 @@ if(area) if(area.apc) - log_mapping("Duplicate APC created at [AREACOORD(src)]") + log_mapping("Duplicate APC created at [AREACOORD(src)] (Original APC at[COORD(area.apc)])") area.apc = src update_appearance() @@ -193,7 +196,7 @@ log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([dir] | [uppertext(dir2text(dir))]) has pixel_[dir & (WEST|EAST) ? "x" : "y"] value [offset_old] - should be [dir & (SOUTH|EAST) ? "-" : ""][APC_PIXEL_OFFSET]. Use the directional/ helpers!") /obj/machinery/power/apc/Destroy() - GLOB.apcs_list -= src + UNSET_TRACKING(__TYPE__) if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) @@ -563,10 +566,14 @@ INVOKE_ASYNC(src, PROC_REF(break_lights)) /obj/machinery/power/apc/proc/break_lights() - for(var/obj/machinery/light/breaked_light in area) + var/area/A = get_area(src) + for(var/obj/machinery/light/breaked_light in INSTANCES_OF(/obj/machinery/light)) + if(A != get_area(breaked_light)) + continue + breaked_light.on = TRUE breaked_light.break_light_tube() - stoplag() + CHECK_TICK /obj/machinery/power/apc/atmos_expose(datum/gas_mixture/air, exposed_temperature) if(exposed_temperature > 2000) diff --git a/code/modules/power/apc/apc_power_proc.dm b/code/modules/power/apc/apc_power_proc.dm index f70f76d44533..7bcb25f09582 100644 --- a/code/modules/power/apc/apc_power_proc.dm +++ b/code/modules/power/apc/apc_power_proc.dm @@ -37,8 +37,9 @@ /obj/machinery/power/apc/proc/toggle_breaker(mob/user) if(!is_operational || failure_timer) return + operating = !operating - add_hiddenprint(user) + add_fingerprint(user) log_game("[key_name(user)] turned [operating ? "on" : "off"] the [src] in [AREACOORD(src)]") update() update_appearance() diff --git a/code/modules/power/apc/apc_tool_act.dm b/code/modules/power/apc/apc_tool_act.dm index 98eb45a0c1f1..45a72dc5d11a 100644 --- a/code/modules/power/apc/apc_tool_act.dm +++ b/code/modules/power/apc/apc_tool_act.dm @@ -179,7 +179,7 @@ else if(machine_stat & (BROKEN|MAINT)) to_chat(user, span_warning("Nothing happens!")) else - flick("apc-spark", src) + z_flick("apc-spark", src) playsound(src, SFX_SPARKS, 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) obj_flags |= EMAGGED locked = FALSE diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 41bddd438ca2..8bd47086cce2 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -1,10 +1,3 @@ -//Use this only for things that aren't a subtype of obj/machinery/power -//For things that are, override "should_have_node()" on them -GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/grille))) - -#define UNDER_SMES -1 -#define UNDER_TERMINAL 1 - /////////////////////////////// //CABLE STRUCTURE /////////////////////////////// @@ -14,39 +7,69 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/structure/cable name = "power cable" desc = "A flexible, superconducting insulated cable for heavy-duty power transfer." - icon = 'icons/obj/power_cond/layer_cable.dmi' - icon_state = "l2-1-2-4-8-node" + icon = 'icons/obj/power_cond/cable.dmi' + icon_state = "0" color = "yellow" layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS - var/linked_dirs = 0 //bitflag - var/node = FALSE //used for sprites display - var/cable_layer = CABLE_LAYER_2 //bitflag - var/machinery_layer = MACHINERY_LAYER_1 //bitflag - var/datum/powernet/powernet - -/obj/structure/cable/layer1 - color = "red" - cable_layer = CABLE_LAYER_1 - machinery_layer = null - layer = WIRE_LAYER - 0.01 - icon_state = "l1-1-2-4-8-node" - -/obj/structure/cable/layer3 - color = "blue" - cable_layer = CABLE_LAYER_3 - machinery_layer = null - layer = WIRE_LAYER + 0.01 - icon_state = "l4-1-2-4-8-node" + obj_flags = CAN_BE_HIT + + /// What cable directions does this cable connect to. Uses a 0-255 bitmasking defined in 'globalvars\lists\cables.dm', with translation lists there aswell + var/linked_dirs = NONE + /// The powernet the cable is connected to + var/tmp/datum/powernet/powernet + /// If TRUE, auto_propogate_cut_cable() is sleeping + var/tmp/awaiting_rebuild = FALSE /obj/structure/cable/Initialize(mapload) . = ..() - GLOB.cable_list += src //add it to the global cable list - Connect_cable() + ::cable_list += src //add it to the global cable list AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) RegisterSignal(src, COMSIG_RAT_INTERACT, PROC_REF(on_rat_eat)) + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) + mapping_init() + update_layer() + +/obj/structure/cable/proc/mapping_init() + linked_dirs = text2num(icon_state) + merge_new_connections() + +/obj/structure/cable/proc/is_knotted() + var/dir_count = 0 + for(var/dir in GLOB.cable_dirs) + if(!(linked_dirs & dir)) + continue + dir_count++ + if(dir_count >= 2) + return FALSE + return TRUE + +/obj/structure/cable/proc/amount_of_cables_worth() + if(is_knotted()) + return 1 + return 2 + +/obj/structure/cable/proc/set_directions(new_directions, merge_connections = TRUE) + linked_dirs = new_directions + var/new_dir_count = 0 + for(var/dir in GLOB.cable_dirs) + if(!(linked_dirs & dir)) + continue + new_dir_count++ + if(new_dir_count > 2) + CRASH("Cable has more than 2 directions on [loc.x],[loc.y],[loc.z]") + if(merge_connections) + merge_new_connections() + update_appearance() + +/obj/structure/cable/proc/merge_new_connections() + if(linked_dirs == NONE) + return + merge_connected_cables() + merge_connected_machines() /obj/structure/cable/proc/on_rat_eat(datum/source, mob/living/simple_animal/hostile/regalrat/king) SIGNAL_HANDLER @@ -56,72 +79,16 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri playsound(king, 'sound/effects/sparks2.ogg', 100, TRUE) deconstruct() -///Set the linked indicator bitflags -/obj/structure/cable/proc/Connect_cable(clear_before_updating = FALSE) - var/under_thing = NONE - if(clear_before_updating) - linked_dirs = 0 - var/obj/machinery/power/search_parent - for(var/obj/machinery/power/P in loc) - if(istype(P, /obj/machinery/power/terminal)) - under_thing = UNDER_TERMINAL - search_parent = P - break - if(istype(P, /obj/machinery/power/smes)) - under_thing = UNDER_SMES - search_parent = P - break - for(var/check_dir in GLOB.cardinals) - var/TB = get_step(src, check_dir) - //don't link from smes to its terminal - if(under_thing) - switch(under_thing) - if(UNDER_SMES) - var/obj/machinery/power/terminal/term = locate(/obj/machinery/power/terminal) in TB - //Why null or equal to the search parent? - //during map init it's possible for a placed smes terminal to not have initialized to the smes yet - //but the cable underneath it is ready to link. - //I don't believe null is even a valid state for a smes terminal while the game is actually running - //So in the rare case that this happens, we also shouldn't connect - //This might break. - if(term && (!term.master || term.master == search_parent)) - continue - if(UNDER_TERMINAL) - var/obj/machinery/power/smes/S = locate(/obj/machinery/power/smes) in TB - if(S && (!S.terminal || S.terminal == search_parent)) - continue - var/inverse = turn(check_dir, 180) - for(var/obj/structure/cable/C in TB) - if(C.cable_layer & cable_layer) - linked_dirs |= check_dir - C.linked_dirs |= inverse - C.update_appearance() - - update_appearance() - -///Clear the linked indicator bitflags -/obj/structure/cable/proc/Disconnect_cable() - for(var/check_dir in GLOB.cardinals) - var/inverse = turn(check_dir, 180) - if(linked_dirs & check_dir) - var/TB = get_step(loc, check_dir) - for(var/obj/structure/cable/C in TB) - if(cable_layer & C.cable_layer) - C.linked_dirs &= ~inverse - C.update_appearance() - /obj/structure/cable/Destroy() // called when a cable is deleted - Disconnect_cable() - - if(powernet) - cut_cable_from_powernet() // update the powernets - GLOB.cable_list -= src //remove it from global cable list + cut_cable_from_powernet() // update the powernets + ::cable_list -= src //remove it from global cable list return ..() // then go ahead and delete the cable /obj/structure/cable/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) - new /obj/item/stack/cable_coil(drop_location(), 1) + var/obj/item/stack/cable_coil/coil = new /obj/item/stack/cable_coil(drop_location(), amount_of_cables_worth()) + coil.color = color qdel(src) /////////////////////////////////// @@ -129,36 +96,22 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /////////////////////////////////// /obj/structure/cable/update_icon_state() - if(!linked_dirs) - icon_state = "l[cable_layer]-noconnection" - return ..() - - var/list/dir_icon_list = list() - for(var/check_dir in GLOB.cardinals) - if(linked_dirs & check_dir) - dir_icon_list += "[check_dir]" - var/dir_string = dir_icon_list.Join("-") - if(dir_icon_list.len > 1) - for(var/obj/O in loc) - if(GLOB.wire_node_generating_types[O.type]) - dir_string = "[dir_string]-node" - break - else if(istype(O, /obj/machinery/power)) - var/obj/machinery/power/P = O - if(P.should_have_node()) - dir_string = "[dir_string]-node" - break - dir_string = "l[cable_layer]-[dir_string]" - icon_state = dir_string + icon_state = "[linked_dirs]" + update_layer() return ..() +/obj/structure/cable/proc/update_layer() + if(is_knotted()) + layer = WIRE_KNOT_LAYER + else + layer = WIRE_LAYER + /obj/structure/cable/examine(mob/user) . = ..() if(isobserver(user)) . += get_power_info() - /obj/structure/cable/proc/handlecable(obj/item/W, mob/user, params) var/turf/T = get_turf(src) if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE) @@ -174,8 +127,12 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri else if(W.tool_behaviour == TOOL_MULTITOOL) to_chat(user, get_power_info()) shock(user, 5, 0.2) + else if (istype(W, /obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/coil = W + coil.place_turf(loc, user, NONE, TRUE, src) - add_fingerprint(user) + + W.leave_evidence(user, src) /obj/structure/cable/proc/get_power_info() @@ -216,36 +173,43 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // Machines should use add_load(), surplus(), avail() // Non-machines should use add_delayedload(), delayed_surplus(), newavail() +/// Adds power to the power net next tick. /obj/structure/cable/proc/add_avail(amount) if(powernet) powernet.newavail += amount +/// Adds load to the power net this tick. /obj/structure/cable/proc/add_load(amount) if(powernet) powernet.load += amount +/// How much extra power is in the power net this tick /obj/structure/cable/proc/surplus() if(powernet) return clamp(powernet.avail-powernet.load, 0, powernet.avail) else return 0 +/// How much power is available this tick. /obj/structure/cable/proc/avail(amount) if(powernet) return amount ? powernet.avail >= amount : powernet.avail else return 0 +/// Add delayed load to the power net. This should be used outside of machine/process() /obj/structure/cable/proc/add_delayedload(amount) if(powernet) powernet.delayedload += amount +/// How much surpless is in the network next tick. /obj/structure/cable/proc/delayed_surplus() if(powernet) return clamp(powernet.newavail - powernet.delayedload, 0, powernet.newavail) else return 0 +/// How much power the network will contain next tick. /obj/structure/cable/proc/newavail() if(powernet) return powernet.newavail @@ -256,37 +220,26 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // Cable laying helpers //////////////////////////////////////////////// -// merge with the powernets of power objects in the given direction -/obj/structure/cable/proc/mergeConnectedNetworks(direction) - - var/inverse_dir = (!direction)? 0 : turn(direction, 180) //flip the direction, to match with the source position on its turf - - var/turf/TB = get_step(src, direction) - - for(var/obj/structure/cable/C in TB) +/obj/structure/cable/proc/merge_connected_cables() + for(var/obj/structure/cable/C as anything in get_cable_connections()) if(!C) continue if(src == C) continue - if(!(cable_layer & C.cable_layer)) - continue - - if(C.linked_dirs & inverse_dir) //we've got a matching cable in the neighbor turf - if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) - var/datum/powernet/newPN = new() - newPN.add_cable(C) + if(!C.powernet) //if the matching cable somehow got no powernet, make him one (should not happen for cables) + var/datum/powernet/newPN = new() + newPN.add_cable(C) - if(powernet) //if we already have a powernet, then merge the two powernets - merge_powernets(powernet, C.powernet) - else - C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet + if(powernet) //if we already have a powernet, then merge the two powernets + merge_powernets(powernet, C.powernet) + else + C.powernet.add_cable(src) //else, we simply connect to the matching cable powernet // merge with the powernets of power objects in the source turf -/obj/structure/cable/proc/mergeConnectedNetworksOnTurf() +/obj/structure/cable/proc/merge_connected_machines() var/list/to_connect = list() - node = FALSE if(!powernet) //if we somehow have no powernet, make one (should not happen for cables) var/datum/powernet/newPN = new() @@ -294,7 +247,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri //first let's add turf cables to our powernet //then we'll connect machines on turf where a cable is present - for(var/atom/movable/AM in loc) + for(var/atom/movable/AM as anything in get_machine_connections()) if(istype(AM, /obj/machinery/power/apc)) var/obj/machinery/power/apc/N = AM if(!N.terminal) @@ -315,7 +268,6 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri //now that cables are done, let's connect found machines for(var/obj/machinery/power/PM in to_connect) - node = TRUE if(!PM.connect_to_network()) PM.disconnect_from_network() //if we somehow can't connect the machine to the new powernet, remove it from the old nonetheless @@ -323,36 +275,99 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri // Powernets handling helpers ////////////////////////////////////////////// -/obj/structure/cable/proc/get_cable_connections(powernetless_only) - . = list() - var/turf/T = get_turf(src) - for(var/check_dir in GLOB.cardinals) - if(linked_dirs & check_dir) - T = get_step(src, check_dir) - for(var/obj/structure/cable/C in T) - if(cable_layer & C.cable_layer) - . += C - -/obj/structure/cable/proc/get_all_cable_connections(powernetless_only) +/obj/structure/cable/proc/get_cable_connections(powernetless_only = FALSE) . = list() + var/static/list/diagonal_masking_pair = list(NORTH|SOUTH, EAST|WEST) var/turf/T - for(var/check_dir in GLOB.cardinals) - T = get_step(src, check_dir) - for(var/obj/structure/cable/C in T.contents - src) - . += C + for(var/cable_dir in GLOB.cable_dirs) + if(!(linked_dirs & cable_dir)) + continue + var/inverse_cable_dir = GLOB.cable_dirs_to_inverse["[cable_dir]"] + var/real_dir = GLOB.cable_dirs_to_real_dirs["[cable_dir]"] + // Is it diagonal? Yes? Detour into this special shitty hack. + // This is 1:1 copied from baycode, With comments. + // Am I being passive aggressive? I think this qualifies as more than that. + if(ISDIAGONALDIR(real_dir)) + for(var/component_pair in diagonal_masking_pair) + T = get_step(src, real_dir & component_pair) + if(T) + // Determine the direction value we need to see. + // (real_dir XOR component_pair) will functionally flip the relevant component's parity. + // Eg. SOUTHWEST (2,8) XOR (1,2) = NORTHWEST (1,8) + // And then we pass this perfectly unusable value into the Obfuscatomat. + var/diag_req_dir = GLOB.real_dirs_to_cable_dirs["[real_dir ^ component_pair]"] + for(var/obj/structure/cable/diag_cable in T) + if(diag_cable.linked_dirs & diag_req_dir) + . += diag_cable + + var/turf/step_turf = get_step(src, real_dir) + for(var/obj/structure/cable/cable_structure in step_turf) + // if cable structure doesn't have a direction inverse to our cable direction, ignore it + if(!(cable_structure.linked_dirs & inverse_cable_dir)) + continue + if(powernetless_only && cable_structure.powernet) + continue + . += cable_structure + // Connect to other knotted cables if we are knotted + if(is_knotted()) + for(var/obj/structure/cable/cable_structure in get_turf(src)) + if(cable_structure == src) + continue + if(!cable_structure.is_knotted()) + continue + . += cable_structure + -/obj/structure/cable/proc/get_machine_connections(powernetless_only) +/obj/structure/cable/proc/get_machine_connections(powernetless_only = FALSE) . = list() + if(!is_knotted()) + return for(var/obj/machinery/power/P in get_turf(src)) - if(!powernetless_only || !P.powernet) - if(P.anchored) - . += P + if(powernetless_only && P.powernet) + continue + if(P.anchored) + . += P + +/obj/structure/cable/proc/rotate_clockwise_amount(amount) + if(amount <= 0) + return + var/current_links = linked_dirs + for(var/i in 1 to amount) + var/list/current_dirs = list() + for(var/cable_dir in GLOB.cable_dirs) + if(!(current_links & cable_dir)) + continue + current_dirs += cable_dir + + var/new_links = NONE + for(var/cable_dir in current_dirs) + new_links |= GLOB.cable_dir_rotate_clockwise["[cable_dir]"] + current_links = new_links + + set_directions(current_links, FALSE) -/obj/structure/cable/proc/auto_propagate_cut_cable(obj/O) - if(O && !QDELETED(O)) - var/datum/powernet/newPN = new()// creates a new powernet... - //NOTE: If packets are acting weird during very high SSpackets load (if you somehow manage to overload it to the point that you're losing packets from powernet rebuilds...), start looking here. - propagate_network(O, newPN)//... and propagates it to the other side of the cable +/obj/structure/cable/proc/auto_propagate_cut_cable() + set waitfor = FALSE + if(awaiting_rebuild) + return + + awaiting_rebuild = TRUE + var/slept = FALSE + while(!QDELETED(src) && SSexplosions.is_exploding()) + slept = TRUE + sleep(world.tick_lag) + + if(QDELETED(src)) + return + + awaiting_rebuild = FALSE + + //NOTE: If packets are acting weird during very high SSpackets load (if you somehow manage to overload it to the point that you're losing packets from powernet rebuilds...), start looking here. + var/datum/powernet/newPN = new()// creates a new powernet... + if(slept) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(propagate_network), src, newPN), 0) + else + propagate_network(src, newPN) //Makes a new network for the cable and propgates it. If we already have one, just die /obj/structure/cable/proc/propagate_if_no_network() @@ -374,11 +389,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri for(var/obj/machinery/power/P in T1) P.disconnect_from_network() - var/list/P_list = list() - for(var/dir_check in GLOB.cardinals) - if(linked_dirs & dir_check) - T1 = get_step(loc, dir_check) - P_list += locate(/obj/structure/cable) in T1 + var/list/P_list = get_cable_connections() // remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist if(remove) @@ -386,11 +397,41 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri powernet.remove_cable(src) //remove the cut cable from its powernet var/first = TRUE - for(var/obj/O in P_list) + for(var/obj/structure/cable/cable in P_list) if(first) first = FALSE continue - addtimer(CALLBACK(O, PROC_REF(auto_propagate_cut_cable), O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables + //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables + cable.auto_propagate_cut_cable() + //addtimer(CALLBACK(O, PROC_REF(auto_propagate_cut_cable), O), 0) + +/////////////////////////////////////////////// +// Cable variants for mapping +/////////////////////////////////////////////// + +/obj/structure/cable/red + color = COLOR_RED + +/obj/structure/cable/yellow + color = COLOR_YELLOW + +/obj/structure/cable/blue + color = COLOR_STRONG_BLUE + +/obj/structure/cable/green + color = COLOR_DARK_LIME + +/obj/structure/cable/pink + color = COLOR_LIGHT_PINK + +/obj/structure/cable/orange + color = COLOR_MOSTLY_PURE_ORANGE + +/obj/structure/cable/cyan + color = COLOR_CYAN + +/obj/structure/cable/white + color = COLOR_WHITE /////////////////////////////////////////////// // The cable coil object, used for laying cable @@ -404,13 +445,12 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil name = "cable coil" - custom_price = PAYCHECK_PRISONER * 0.8 + custom_price = PAYCHECK_ASSISTANT * 0.8 gender = NEUTER //That's a cable coil sounds better than that's some cable coils icon = 'icons/obj/power.dmi' icon_state = "coil" inhand_icon_state = "coil" base_icon_state = "coil" - novariants = FALSE lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' max_amount = MAXCOIL @@ -421,8 +461,8 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 5 + stamina_damage = 5 stamina_cost = 5 stamina_critical_chance = 10 @@ -438,9 +478,15 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri usesound = 'sound/items/deconstruct.ogg' cost = 1 source = /datum/robot_energy_storage/wire - var/cable_color = "yellow" - var/obj/structure/cable/target_type = /obj/structure/cable - var/target_layer = CABLE_LAYER_2 + + /// Handles the click foo. + var/datum/cable_click_manager/click_manager + /// Previous position stored for purposes of cable laying + var/turf/previous_position = null + /// Whether we are in a cable laying mode + var/cable_layer_mode = FALSE + /// Reference to the mob laying the cables + var/mob/living/mob_layer = null /obj/item/stack/cable_coil/Initialize(mapload, new_amount, merge = TRUE, list/mat_override=null, mat_amt=1) . = ..() @@ -448,8 +494,14 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri pixel_y = base_pixel_y + rand(-2, 2) update_appearance() +/obj/item/stack/cable_coil/Destroy(force) + QDEL_NULL(click_manager) + set_cable_layer_mode(FALSE) + return ..() + /obj/item/stack/cable_coil/examine(mob/user) . = ..() + . += "Right Click on the floor to enable Advanced Placement." . += "Ctrl+Click to change the layer you are placing on." /obj/item/stack/cable_coil/update_name() @@ -461,11 +513,26 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri desc = "A [(amount < 3) ? "piece" : "coil"] of insulated power cable." /obj/item/stack/cable_coil/update_icon_state() - if(novariants) - return . = ..() icon_state = "[base_icon_state][amount < 3 ? amount : ""]" + +/obj/item/stack/cable_coil/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_HANDS) + if(isnull(click_manager)) + click_manager = new(src) + + click_manager.set_user(user) + +/obj/item/stack/cable_coil/dropped() + . = ..() + click_manager?.set_user(null) + +/obj/item/stack/cable_coil/use(used, transfer, check) + . = ..() + update_appearance() + /obj/item/stack/cable_coil/suicide_act(mob/user) if(locate(/obj/structure/chair/stool) in get_turf(user)) user.visible_message(span_suicide("[user] is making a noose with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) @@ -486,15 +553,15 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil/attack_self(mob/living/user) if(!user) return + if(cable_layer_mode) + turn_off_cable_layer_mode(user) + return var/image/restraints_icon = image(icon = 'icons/obj/restraints.dmi', icon_state = "cuff") restraints_icon.maptext = MAPTEXT("= CABLE_RESTRAINTS_COST ? "" : "style='color: red'"]>[CABLE_RESTRAINTS_COST]") var/list/radial_menu = list( - "Layer 1" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-red"), - "Layer 2" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-yellow"), - "Layer 3" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-blue"), - "Multilayer cable hub" = image(icon = 'icons/obj/power.dmi', icon_state = "cable_bridge"), + "Cable layer mode" = image(icon = 'icons/obj/tools.dmi', icon_state = "rcl-30"), "Multi Z layer cable hub" = image(icon = 'icons/obj/power.dmi', icon_state = "cablerelay-broken-cable"), "Cable restraints" = restraints_icon ) @@ -503,45 +570,93 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(!check_menu(user)) return switch(layer_result) - if("Layer 1") - color = "red" - target_type = /obj/structure/cable/layer1 - target_layer = CABLE_LAYER_1 - novariants = FALSE - if("Layer 2") - color = "yellow" - target_type = /obj/structure/cable - target_layer = CABLE_LAYER_2 - novariants = FALSE - if("Layer 3") - color = "blue" - target_type = /obj/structure/cable/layer3 - target_layer = CABLE_LAYER_3 - novariants = FALSE - if("Multilayer cable hub") - name = "multilayer cable hub" - desc = "A multilayer cable hub." - icon_state = "cable_bridge" - color = "white" - target_type = /obj/structure/cable/multilayer - target_layer = CABLE_LAYER_2 - novariants = TRUE + if("Cable layer mode") + turn_on_cable_layer_mode(user) + return if("Multi Z layer cable hub") - name = "multi z layer cable hub" - desc = "A multi-z layer cable hub." - icon_state = "cablerelay-broken-cable" - color = "white" - target_type = /obj/structure/cable/multilayer/multiz - target_layer = CABLE_LAYER_2 - novariants = TRUE + try_construct_multiz_hub(user) + return if("Cable restraints") - if (amount >= CABLE_RESTRAINTS_COST) - if(use(CABLE_RESTRAINTS_COST)) - var/obj/item/restraints/handcuffs/cable/restraints = new - restraints.color = color - user.put_in_hands(restraints) + if (amount < CABLE_RESTRAINTS_COST) + return + if(!use(CABLE_RESTRAINTS_COST)) + return + var/obj/item/restraints/handcuffs/cable/restraints = new + restraints.color = color + user.put_in_hands(restraints) update_appearance() +/obj/item/stack/cable_coil/dropped(mob/wearer) + . = ..() + set_cable_layer_mode(FALSE, null) + +/obj/item/stack/cable_coil/proc/turn_off_cable_layer_mode(mob/user) + to_chat(user, span_notice("You stop laying cables.")) + set_cable_layer_mode(FALSE, null) + +/obj/item/stack/cable_coil/proc/turn_on_cable_layer_mode(mob/user) + to_chat(user, span_notice("You start laying cables as you move...")) + set_cable_layer_mode(TRUE, user) + +/obj/item/stack/cable_coil/proc/set_cable_layer_mode(new_state, mob/user) + if(user == null || new_state == FALSE) + new_state = FALSE + user = null + if(new_state == cable_layer_mode) + return + if(new_state) + previous_position = get_turf(user) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(cable_layer_moved)) + else + previous_position = null + UnregisterSignal(mob_layer, COMSIG_MOVABLE_MOVED) + cable_layer_mode = new_state + mob_layer = user + +/obj/item/stack/cable_coil/proc/cable_layer_moved(mob/user) + SIGNAL_HANDLER + lay_cable(user) + previous_position = get_turf(user) + +/obj/item/stack/cable_coil/proc/lay_cable(mob/user) + if(user.incapacitated()) + return + var/turf/current_position = get_turf(user) + if(current_position == previous_position) + return + var/dir = get_dir(current_position, previous_position) + var/inverse_dir = get_dir(previous_position, current_position) + var/cable_dir = GLOB.real_dirs_to_cable_dirs["[dir]"] + var/inverse_cable_dir = GLOB.real_dirs_to_cable_dirs["[inverse_dir]"] + + // Place on previous position + cable_laying_place_turf(previous_position, user, inverse_cable_dir) + + // Exit function if cable ran out + if(QDELETED(src)) + to_chat(user, span_warning("You run out of cable!")) + return + + //Place on new position + cable_laying_place_turf(current_position, user, cable_dir) + + // Once again, but mostly to alert the player that it ran out + if(QDELETED(src)) + to_chat(user, span_warning("You run out of cable!")) + return + +/obj/item/stack/cable_coil/proc/cable_laying_place_turf(turf/T, mob/user, cable_direction = NONE) + // Don't place over already cabled places that match the same direction (makes it less messy, but unable to connect to existing lines) + for(var/obj/structure/cable/cable_on_turf in T) + if(cable_on_turf.linked_dirs & cable_direction) + return + place_turf(T, user, cable_direction, TRUE) + +/obj/item/stack/cable_coil/proc/try_construct_multiz_hub(mob/user) + if(!use(1)) + return + new /obj/structure/cable/multiz(get_turf(user)) + to_chat(user, span_notice("You construct the multi Z layer cable hub.")) /////////////////////////////////// // General procedures @@ -551,7 +666,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri if(!istype(H)) return ..() - var/obj/item/bodypart/affecting = H.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = H.get_bodypart(deprecise_zone(user.zone_selected)) if(affecting && !IS_ORGANIC_LIMB(affecting)) if(user == H) user.visible_message(span_notice("[user] starts to fix some of the wires in [H]'s [affecting.name]."), span_notice("You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [affecting.name].")) @@ -569,7 +684,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri ////////////////////////////////////////////// // called when cable_coil is clicked on a turf -/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, dirnew) +/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user, cable_direction = NONE, connect_to_knotted = FALSE, obj/structure/cable/target_knot = null) if(!isturf(user.loc)) return @@ -585,20 +700,62 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri to_chat(user, span_warning("You can't lay cable at a place that far away!")) return - for(var/obj/structure/cable/C in T) - if(C.cable_layer & target_layer) + var/desired_cable_position = cable_direction + if(desired_cable_position == NONE) + var/target_real_dir + if(get_turf(user) == T) + target_real_dir = user.dir + else + target_real_dir = get_dir(user.loc, T) + target_real_dir = turn(target_real_dir, 180) + var/inverse_cable_dir = GLOB.real_dirs_to_cable_dirs["[target_real_dir]"] + desired_cable_position = inverse_cable_dir //just to be more verbose + + var/adding_to_knotted = FALSE + + var/obj/structure/cable/C + // See if there's any knotted cables we can add onto, if that's what we want to do + if(connect_to_knotted) + if(target_knot && target_knot.is_knotted()) + C = target_knot + adding_to_knotted = TRUE + else + for(var/obj/structure/cable/cable_on_turf in T) + if(!cable_on_turf.is_knotted()) + continue + C = cable_on_turf + adding_to_knotted = TRUE + break + + if(!C) + C = new /obj/structure/cable(T) + C.color = color + + var/target_directions = C.linked_dirs + target_directions |= desired_cable_position + + if(adding_to_knotted) + if(desired_cable_position == C.linked_dirs) to_chat(user, span_warning("There's already a cable at that position!")) return - - var/obj/structure/cable/C = new target_type(T) + for(var/obj/structure/cable/cable_on_turf in T) + if(cable_on_turf.is_knotted()) + continue + if(cable_on_turf.linked_dirs == target_directions) + to_chat(user, span_warning("There's already a cable at that position!")) + return + else + for(var/obj/structure/cable/cable_on_turf in T) + if(cable_on_turf.linked_dirs == target_directions) + to_chat(user, span_warning("There's already a cable at that position!")) + qdel(C) + return //create a new powernet with the cable, if needed it will be merged later var/datum/powernet/PN = new() PN.add_cable(C) - for(var/dir_check in GLOB.cardinals) - C.mergeConnectedNetworks(dir_check) //merge the powernet with adjacents powernets - C.mergeConnectedNetworksOnTurf() //merge the powernet with on turf powernets + C.set_directions(target_directions) use(1) @@ -611,6 +768,9 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri /obj/item/stack/cable_coil/five amount = 5 +/obj/item/stack/cable_coil/ten + amount = 10 + /obj/item/stack/cable_coil/cut amount = null icon_state = "coil2" @@ -625,168 +785,36 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(/obj/structure/gri pixel_y = base_pixel_y + rand(-2, 2) update_appearance() -#undef CABLE_RESTRAINTS_COST -#undef UNDER_SMES -#undef UNDER_TERMINAL +/obj/item/stack/cable_coil/random -///multilayer cable to connect different layers -/obj/structure/cable/multilayer - name = "multilayer cable hub" - desc = "A flexible, superconducting insulated multilayer hub for heavy-duty multilayer power transfer." - icon = 'icons/obj/power.dmi' - icon_state = "cable_bridge" - cable_layer = CABLE_LAYER_2 - machinery_layer = MACHINERY_LAYER_1 - layer = WIRE_LAYER - 0.02 //Below all cables Disabled layers can lay over hub - color = "white" - var/obj/effect/node/machinery_node - var/obj/effect/node/layer1/cable_node_1 - var/obj/effect/node/layer2/cable_node_2 - var/obj/effect/node/layer3/cable_node_3 - -/obj/effect/node - icon = 'icons/obj/power_cond/layer_cable.dmi' - icon_state = "l2-noconnection" - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER - color = "black" - -/obj/effect/node/layer1 - color = "red" - icon_state = "l1-1-2-4-8-node" - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER|VIS_UNDERLAY - -/obj/effect/node/layer2 - color = "yellow" - icon_state = "l2-1-2-4-8-node" - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER|VIS_UNDERLAY - -/obj/effect/node/layer3 - color = "blue" - icon_state = "l4-1-2-4-8-node" - vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER|VIS_UNDERLAY - -/obj/structure/cable/multilayer/update_icon_state() - SHOULD_CALL_PARENT(FALSE) - return - -/obj/structure/cable/multilayer/update_icon() - machinery_node?.alpha = machinery_layer & MACHINERY_LAYER_1 ? 255 : 0 - cable_node_1?.alpha = cable_layer & CABLE_LAYER_1 ? 255 : 0 - cable_node_2?.alpha = cable_layer & CABLE_LAYER_2 ? 255 : 0 - cable_node_3?.alpha = cable_layer & CABLE_LAYER_3 ? 255 : 0 - return ..() - -/obj/structure/cable/multilayer/Initialize(mapload) +/obj/item/stack/cable_coil/random/Initialize(mapload, new_amount, merge, list/mat_override, mat_amt) + var/list/cable_colors_list = GLOB.cable_colors + var/random_color = pick(cable_colors_list) + color = cable_colors_list[random_color] . = ..() - var/turf/T = get_turf(src) - for(var/obj/structure/cable/C in T.contents - src) - if(C.cable_layer & cable_layer) - C.deconstruct() // remove adversary cable - if(!mapload) - auto_propagate_cut_cable(src) - - machinery_node = new /obj/effect/node() - vis_contents += machinery_node - cable_node_1 = new /obj/effect/node/layer1() - vis_contents += cable_node_1 - cable_node_2 = new /obj/effect/node/layer2() - vis_contents += cable_node_2 - cable_node_3 = new /obj/effect/node/layer3() - vis_contents += cable_node_3 - update_appearance() - -/obj/structure/cable/multilayer/Destroy() // called when a cable is deleted - QDEL_NULL(machinery_node) - QDEL_NULL(cable_node_1) - QDEL_NULL(cable_node_2) - QDEL_NULL(cable_node_3) - return ..() // then go ahead and delete the cable - -/obj/structure/cable/multilayer/examine(mob/user) - . += ..() - . += span_notice("L1:[cable_layer & CABLE_LAYER_1 ? "Connect" : "Disconnect"].") - . += span_notice("L2:[cable_layer & CABLE_LAYER_2 ? "Connect" : "Disconnect"].") - . += span_notice("L3:[cable_layer & CABLE_LAYER_3 ? "Connect" : "Disconnect"].") - . += span_notice("M:[machinery_layer & MACHINERY_LAYER_1 ? "Connect" : "Disconnect"].") +/obj/item/stack/cable_coil/red + color = COLOR_RED -GLOBAL_LIST(hub_radial_layer_list) +/obj/item/stack/cable_coil/yellow + color = COLOR_YELLOW -/obj/structure/cable/multilayer/attack_robot(mob/user) - attack_hand(user) +/obj/item/stack/cable_coil/blue + color = COLOR_STRONG_BLUE -/obj/structure/cable/multilayer/attack_hand(mob/living/user, list/modifiers) - if(!user) - return - if(!GLOB.hub_radial_layer_list) - GLOB.hub_radial_layer_list = list( - "Layer 1" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-red"), - "Layer 2" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-yellow"), - "Layer 3" = image(icon = 'icons/hud/radial.dmi', icon_state = "coil-blue"), - "Machinery" = image(icon = 'icons/obj/power.dmi', icon_state = "smes") - ) - - var/layer_result = show_radial_menu(user, src, GLOB.hub_radial_layer_list, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE) - if(!check_menu(user)) - return - var/CL - switch(layer_result) - if("Layer 1") - CL = CABLE_LAYER_1 - to_chat(user, span_warning("You toggle L1 connection.")) - if("Layer 2") - CL = CABLE_LAYER_2 - to_chat(user, span_warning("You toggle L2 connection.")) - if("Layer 3") - CL = CABLE_LAYER_3 - to_chat(user, span_warning("You toggle L3 connection.")) - if("Machinery") - machinery_layer ^= MACHINERY_LAYER_1 - to_chat(user, span_warning("You toggle machinery connection.")) +/obj/item/stack/cable_coil/green + color = COLOR_DARK_LIME - cut_cable_from_powernet(FALSE) +/obj/item/stack/cable_coil/pink + color = COLOR_LIGHT_PINK - Disconnect_cable() +/obj/item/stack/cable_coil/orange + color = COLOR_MOSTLY_PURE_ORANGE - cable_layer ^= CL +/obj/item/stack/cable_coil/cyan + color = COLOR_CYAN - Connect_cable(TRUE) +/obj/item/stack/cable_coil/white + color = COLOR_WHITE - Reload() - -/obj/structure/cable/multilayer/proc/check_menu(mob/living/user) - if(!istype(user)) - return FALSE - if(!ISADVANCEDTOOLUSER(user)) - to_chat(user, span_warning("You don't have the dexterity to do this!")) - return FALSE - if(user.incapacitated() || !user.Adjacent(src)) - return FALSE - return TRUE - -///Reset powernet in this hub. -/obj/structure/cable/multilayer/proc/Reload() - var/turf/T = get_turf(src) - for(var/obj/structure/cable/C in T.contents - src) - if(C.cable_layer & cable_layer) - C.deconstruct() // remove adversary cable - auto_propagate_cut_cable(src) // update the powernets - -/obj/structure/cable/multilayer/CtrlClick(mob/living/user) - to_chat(user, span_warning("You push the reset button.")) - addtimer(CALLBACK(src, PROC_REF(Reload)), 10, TIMER_UNIQUE) //spam protect - -// This is a mapping aid. In order for this to be placed on a map and function, all three layers need to have their nodes active -/obj/structure/cable/multilayer/connected - cable_layer = CABLE_LAYER_1 | CABLE_LAYER_2 | CABLE_LAYER_3 - -/// A mapping helper for a cable hub that connects layers 1 and 2 -/obj/structure/cable/multilayer/connected/one_two - cable_layer = CABLE_LAYER_1 | CABLE_LAYER_2 - -/obj/item/paper/fluff/smartwire_rant - name = "Notice: 'Smart Wiring'" - info = "

I don’t know which brilliant fuckwad decided that “Auto-Routing Smart Wiring” was the galaxy’s brightest fucking idea, but they clearly haven’t used the fucking things.

\ -

We’ve fried right through 3 pairs of welding goggles due to arc flashes from the “clever” things bridging powernets.

\ -

Don’t fuck around in this room in particular if you aren’t INCREDIBLY CONFIDENT IN WHAT YOU ARE DOING.

\ -

-Argus Finch, Chief Engineer, Watch 36/5/22/5

" +#undef CABLE_RESTRAINTS_COST diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 7cc596ff4c54..ff221cb3db8e 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -17,7 +17,6 @@ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' force = 5 throwforce = 5 - throw_speed = 2 throw_range = 5 w_class = WEIGHT_CLASS_SMALL ///Current charge in cell units @@ -202,7 +201,7 @@ /obj/item/stock_parts/cell/blob_act(obj/structure/blob/B) - SSexplosions.high_mov_atom += src + EX_ACT(src, EXPLODE_DEVASTATE) /obj/item/stock_parts/cell/proc/get_electrocute_damage() if(charge >= 1000) @@ -331,7 +330,7 @@ maxcharge = 50000 ratingdesc = FALSE -/obj/item/stock_parts/cell/infinite/abductor/ComponentInitialize() +/obj/item/stock_parts/cell/infinite/abductor/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_blocker) @@ -353,7 +352,7 @@ desc = "An EMP-proof cell." maxcharge = 500 -/obj/item/stock_parts/cell/emproof/ComponentInitialize() +/obj/item/stock_parts/cell/emproof/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) diff --git a/code/modules/power/data_terminal.dm b/code/modules/power/data_terminal.dm index 1e60c6722da4..6ff2efee2c38 100644 --- a/code/modules/power/data_terminal.dm +++ b/code/modules/power/data_terminal.dm @@ -12,9 +12,37 @@ connect_to_network() AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) +/obj/machinery/power/data_terminal/Destroy() + . = ..() + // Disconnect from the seizing machine. + disconnect_machine(connected_machine) + /obj/machinery/power/data_terminal/should_have_node() return TRUE +/obj/machinery/power/data_terminal/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(.) + return + /// Oop, we have a connected machine, make sure they're sure. + if(connected_machine && !(tgui_alert(user, "The link light is on, deconstructing this will disconnect the device.", "Disconnect?",list("Disconnect","Abort")) == "Disconnect")) + return TOOL_ACT_TOOLTYPE_SUCCESS + + user.visible_message( + "[user] starts unscrewing [src] from \the [src.loc].", + "You start unscrewing [src] from \the [src.loc]", + "You hear quiet metal scraping.") + tool.play_tool_sound(src, 50) + if(!do_after(user, src, 10 SECONDS, DO_PUBLIC)) + to_chat(user, span_warning("You need to stand still to unscrew [src]!")) + return TOOL_ACT_TOOLTYPE_SUCCESS + + playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) + user.visible_message("[user] unscrewed \the [src] from \the [src.loc]", "You unscrewed \the [src] from \the [src.loc]") + new /obj/item/data_terminal_construct(src.loc) + qdel(src) + return TOOL_ACT_TOOLTYPE_SUCCESS + /obj/machinery/power/data_terminal/receive_signal(datum/signal/signal) SHOULD_CALL_PARENT(FALSE) //We *ARE* the signal poster. if(!powernet) //Did we somehow receive a signal without a powernet? @@ -52,6 +80,8 @@ /// Attempt to disconnect from a data terminal. /obj/machinery/power/data_terminal/proc/disconnect_machine(obj/machinery/leaving_machine) + if(!leaving_machine && !connected_machine) // No connected machine in the first place + return if(leaving_machine != connected_machine)//Let's just be sure. CRASH("[leaving_machine] [REF(leaving_machine)] attempted to disconnect despite not owning the data terminal (owned by [connected_machine] [REF(connected_machine)])!") UnregisterSignal(leaving_machine, COMSIG_MOVABLE_MOVED) @@ -64,3 +94,44 @@ do_sparks(10, FALSE, src) visible_message(span_warning("As [connected_machine] moves, \the [src] violently sparks as it disconnects from the network!")) //Good job fuckface disconnect_machine(connected_machine) + +/// Data terminal item + +/obj/item/data_terminal_construct + name = "disconnected data terminal" + desc = "A data terminal, used for connecting to powerline networks." + icon_state = "dterm_construct" + icon = 'icons/obj/power.dmi' + +/obj/item/data_terminal_construct/examine(mob/user) + . = ..() + . += span_notice("You can [span_bold("screw")] it to the floor to install it.") + +/obj/item/data_terminal_construct/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(.) + return + + if(HAS_TRAIT(src, TRAIT_NODROP) && loc == user) + to_chat(user, span_warning("\The [src] is stuck to your hand!")) + return TOOL_ACT_TOOLTYPE_SUCCESS + + var/turf/T = get_turf(src) + if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && isfloorturf(T)) + to_chat(user, span_warning("You can only install the [src] if the floor plating is removed!")) + return TOOL_ACT_TOOLTYPE_SUCCESS + + user.visible_message( + "[user] starts screwing [src] into \the [T].", + "You start screwing [src] into \the [T]", + "You hear quiet metal scraping.") + tool.play_tool_sound(src, 50) + if(!do_after(user, src, 10 SECONDS, DO_PUBLIC)) + to_chat(user, span_warning("You need to stand still to install [src]!")) + return TOOL_ACT_TOOLTYPE_SUCCESS + + playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) + user.visible_message("[user] installed \the [src] on \the [T]", "You installed \the [src] on \the [T]") + new /obj/machinery/power/data_terminal(T) + qdel(src) + return TOOL_ACT_TOOLTYPE_SUCCESS diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 90805fca426b..83b7dd75e583 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -119,8 +119,6 @@ lastcirc = circ update_appearance() - src.updateDialog() - //Power last_circ1_gen = circ1.return_stored_energy() last_circ2_gen = circ2.return_stored_energy() diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 5383e619da7f..16cd82e486aa 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -1,4 +1,5 @@ // the standard tube light fixture +DEFINE_INTERACTABLE(/obj/machinery/light) /obj/machinery/light name = "light fixture" icon = 'icons/obj/lighting.dmi' @@ -21,16 +22,16 @@ ///Amount of power used var/static_power_used = 0 ///The outer radius of the light's... light. - var/bulb_outer_range = 7 + var/bulb_outer_range = 9 ///The inner radius of the bulb's light, where it is at maximum brightness - var/bulb_inner_range = 1.5 + var/bulb_inner_range = 1.8 ///Basically the alpha of the emitted light source - var/bulb_power = 1 + var/bulb_power = 0.6 ///The falloff of the emitted light. Adjust until it looks good. - var/bulb_falloff = LIGHTING_DEFAULT_FALLOFF_CURVE + var/bulb_falloff = 1.85 ///Default colour of the light. - var/bulb_colour = "#f2f9f7" + var/bulb_colour = "#dfac72" ///LIGHT_OK, _EMPTY, _BURNED or _BROKEN var/status = LIGHT_OK ///Should we flicker? @@ -56,10 +57,10 @@ ///Inner, brightest radius of the nightshift light var/nightshift_inner_range = 1.5 ///Alpha of the nightshift light - var/nightshift_light_power = 0.85 + var/nightshift_light_power = 0.5 ///Basecolor of the nightshift light - var/nightshift_light_color = "#FFDDCC" - var/nightshift_falloff = LIGHTING_DEFAULT_FALLOFF_CURVE + var/nightshift_light_color = "#dfac72" + var/nightshift_falloff = 1.85 ///If true, the light is in emergency mode var/emergency_mode = FALSE @@ -70,7 +71,7 @@ ///Determines the colour of the light while it's in emergency mode var/bulb_emergency_colour = "#FF3232" ///The multiplier for determining the light's power in emergency mode - var/bulb_emergency_pow_mul = 0.4 + var/bulb_emergency_pow_mul = 0.6 ///The minimum value for the light's power in emergency mode var/bulb_emergency_pow_min = 0.2 @@ -85,7 +86,7 @@ // create a new lighting fixture /obj/machinery/light/Initialize(mapload) . = ..() - + SET_TRACKING(__TYPE__) if(!mapload) //sync up nightshift lighting for player made lights var/area/local_area = get_area(src) var/obj/machinery/power/apc/temp_apc = local_area.apc @@ -103,6 +104,7 @@ my_area = get_area(src) if(my_area) LAZYADD(my_area.lights, src) + #ifdef LIGHTS_RANDOMLY_BROKEN switch(fitting) if("tube") @@ -115,6 +117,7 @@ update(FALSE, TRUE, FALSE) /obj/machinery/light/Destroy() + UNSET_TRACKING(__TYPE__) if(my_area) on = FALSE LAZYREMOVE(my_area.lights, src) @@ -241,20 +244,20 @@ . = ..() switch(status) if(LIGHT_OK) - . += "It is turned [on? "on" : "off"]." + if(!on) + . += span_notice("It is turned off.") if(LIGHT_EMPTY) - . += "The [fitting] has been removed." + . += span_notice("The [fitting] has been removed.") if(LIGHT_BURNED) - . += "The [fitting] is burnt out." + . += span_notice("The [fitting] is burnt out.") if(LIGHT_BROKEN) - . += "The [fitting] has been smashed." + . += span_alert("The [fitting] has been smashed.") + if(cell) - . += "Its backup power charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%." - //PARIAH EDIT ADDITION - if(constant_flickering) - . += span_danger("The lighting ballast appears to be damaged, this could be fixed with a multitool.") - //PARIAH EDIT END + . += span_notice("Its backup power charge meter reads: [round((cell.charge / cell.maxcharge) * 100, 0.1)]%.") + if(constant_flickering) + . += span_alert("The lighting ballast appears to be damaged, this could be fixed with a multitool.") // attack with item - insert light (if right type), otherwise try to break the light @@ -280,7 +283,7 @@ if(status == LIGHT_OK) to_chat(user, span_warning("There is a [fitting] already inserted!")) return TRUE - add_fingerprint(user) + tool.leave_evidence(user, src) var/obj/item/light/light_object = tool if(!istype(light_object, light_type)) to_chat(user, span_warning("This type of light requires a [fitting]!")) @@ -288,7 +291,7 @@ if(!user.temporarilyRemoveItemFromInventory(light_object)) return TRUE - add_fingerprint(user) + tool.leave_evidence(user, src) if(status != LIGHT_EMPTY) drop_light_tube(user) to_chat(user, span_notice("You replace [light_object].")) @@ -437,6 +440,7 @@ set waitfor = FALSE if(flickering) return + flickering = TRUE if(on && status == LIGHT_OK) for(var/i in 1 to amount) @@ -466,7 +470,6 @@ if(.) return user.changeNext_move(CLICK_CD_MELEE) - add_fingerprint(user) if(status == LIGHT_EMPTY) to_chat(user, span_warning("There is no [fitting] in this light!")) @@ -511,14 +514,12 @@ to_chat(user, span_notice("You telekinetically remove the light [fitting].")) else var/obj/item/bodypart/affecting = electrician.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(affecting?.receive_damage( 0, 5 )) // 5 burn damage - electrician.update_damage_overlays() + affecting?.receive_damage( 0, 5 ) if(HAS_TRAIT(user, TRAIT_LIGHTBULB_REMOVER)) to_chat(user, span_notice("You feel like you're burning, but you can push through.")) if(!do_after(user, src, 5 SECONDS)) return - if(affecting?.receive_damage( 0, 10 )) // 10 more burn damage - electrician.update_damage_overlays() + affecting?.receive_damage( 0, 10 ) // 10 more burn damage to_chat(user, span_notice("You manage to remove the light [fitting], shattering it in process.")) break_light_tube() else diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index 2b65c75c87dd..461bdd0e2ec4 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -6,7 +6,7 @@ anchored = TRUE layer = WALL_OBJ_LAYER max_integrity = 200 - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) + armor = list(BLUNT = 50, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 50) ///Light construction stage (LIGHT_CONSTRUCT_EMPTY, LIGHT_CONSTRUCT_WIRED, LIGHT_CONSTRUCT_CLOSED) var/stage = LIGHT_CONSTRUCT_EMPTY @@ -69,7 +69,7 @@ return cell_reference.attack_tk(user) /obj/structure/light_construct/attackby(obj/item/tool, mob/user, params) - add_fingerprint(user) + tool.leave_evidence(user, src) if(istype(tool, /obj/item/stock_parts/cell)) if(!cell_connectors) to_chat(user, span_warning("This [name] can't support a power cell!")) @@ -86,7 +86,7 @@ playsound(src, 'sound/machines/click.ogg', 50, TRUE) tool.forceMove(src) cell = tool - add_fingerprint(user) + tool.add_fingerprint(user) return if(istype(tool, /obj/item/light)) to_chat(user, span_warning("This [name] isn't finished being setup!")) diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm index 92c8d36b9163..2e65b697fb4c 100644 --- a/code/modules/power/lighting/light_items.dm +++ b/code/modules/power/lighting/light_items.dm @@ -94,7 +94,7 @@ return var/mob/living/moving_mob = moving_atom if(!(moving_mob.movement_type & (FLYING|FLOATING)) || moving_mob.buckled) - playsound(src, 'sound/effects/glass_step.ogg', HAS_TRAIT(moving_mob, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE) + playsound(src, 'sound/effects/small_glass_break.ogg', HAS_TRAIT(moving_mob, TRAIT_LIGHT_STEP) ? 30 : 50, TRUE) if(status == LIGHT_BURNED || status == LIGHT_OK) shatter() @@ -129,7 +129,7 @@ ..() shatter() -/obj/item/light/attack_atom(obj/O, mob/living/user, params) +/obj/item/light/attack_obj(obj/O, mob/living/user, params) ..() shatter() diff --git a/code/modules/power/lighting/light_wallframes.dm b/code/modules/power/lighting/light_wallframes.dm index 0688f597f1af..31e8232954e6 100644 --- a/code/modules/power/lighting/light_wallframes.dm +++ b/code/modules/power/lighting/light_wallframes.dm @@ -16,7 +16,7 @@ if(!..()) return var/area/local_area = get_area(user) - if(!local_area.static_lighting) + if(local_area.area_lighting != AREA_LIGHTING_DYNAMIC) to_chat(user, span_warning("You cannot place [src] in this area!")) return return TRUE diff --git a/code/modules/power/multiz.dm b/code/modules/power/multiz.dm index 4a5770174d32..97ccd6c23a67 100644 --- a/code/modules/power/multiz.dm +++ b/code/modules/power/multiz.dm @@ -1,20 +1,38 @@ -/obj/structure/cable/multilayer/multiz //This bridges powernets betwen Z levels +/obj/structure/cable/multiz //This bridges powernets betwen Z levels name = "multi z layer cable hub" desc = "A flexible, superconducting insulated multi Z layer hub for heavy-duty multi Z power transfer." icon = 'icons/obj/power.dmi' + icon_state = "cable_bridge" + linked_dirs = CABLE_NORTH|CABLE_SOUTH|CABLE_EAST|CABLE_WEST + +/obj/structure/cable/multiz/Initialize(mapload) + . = ..() + set_multiz_linked_dirs() + +/obj/structure/cable/multiz/set_directions(new_directions) + set_multiz_linked_dirs() + +/obj/structure/cable/multiz/proc/set_multiz_linked_dirs() + linked_dirs = CABLE_NORTH|CABLE_SOUTH|CABLE_EAST|CABLE_WEST + +/obj/structure/cable/multiz/is_knotted() + return FALSE + +/obj/structure/cable/multiz/amount_of_cables_worth() + return 1 + +/obj/structure/cable/multiz/update_icon_state() + . = ..() icon_state = "cablerelay-on" - cable_layer = CABLE_LAYER_1|CABLE_LAYER_2|CABLE_LAYER_3 - machinery_layer = null -/obj/structure/cable/multilayer/multiz/get_cable_connections(powernetless_only) +/obj/structure/cable/multiz/get_cable_connections(powernetless_only) . = ..() var/turf/T = get_turf(src) - . += locate(/obj/structure/cable/multilayer/multiz) in (GetBelow(T)) - . += locate(/obj/structure/cable/multilayer/multiz) in (GetAbove(T)) + . += locate(/obj/structure/cable/multiz) in (GetBelow(T)) + . += locate(/obj/structure/cable/multiz) in (GetAbove(T)) -/obj/structure/cable/multilayer/examine(mob/user) +/obj/structure/cable/multiz/examine(mob/user) . += ..() var/turf/T = get_turf(src) - . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (GetBelow(T)) ? "Detected" : "Undetected"] hub UP.") - . += span_notice("[locate(/obj/structure/cable/multilayer/multiz) in (GetAbove(T)) ? "Detected" : "Undetected"] hub DOWN.") - + . += span_notice("[locate(/obj/structure/cable/multiz) in (GetBelow(T)) ? "Detected" : "Undetected"] hub UP.") + . += span_notice("[locate(/obj/structure/cable/multiz) in (GetAbove(T)) ? "Detected" : "Undetected"] hub DOWN.") diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm deleted file mode 100644 index fb61db2cddba..000000000000 --- a/code/modules/power/pipecleaners.dm +++ /dev/null @@ -1,501 +0,0 @@ -GLOBAL_LIST_INIT(pipe_cleaner_colors, list( - "blue" = COLOR_STRONG_BLUE, - "cyan" = COLOR_CYAN, - "green" = COLOR_DARK_LIME, - "orange" = COLOR_MOSTLY_PURE_ORANGE, - "pink" = COLOR_LIGHT_PINK, - "red" = COLOR_RED, - "white" = COLOR_WHITE, - "yellow" = COLOR_YELLOW - )) - -//This is the old cable code, but minus any actual powernet logic -//Wireart is fun - -/////////////////////////////// -//CABLE STRUCTURE -/////////////////////////////// - - -//////////////////////////////// -// Definitions -//////////////////////////////// - -/* Cable directions (d1 and d2) - * 9 1 5 - * \ | / - * 8 - 0 - 4 - * / | \ - * 10 2 6 - -If d1 = 0 and d2 = 0, there's no pipe_cleaner -If d1 = 0 and d2 = dir, it's a O-X pipe_cleaner, getting from the center of the tile to dir (knot pipe_cleaner) -If d1 = dir1 and d2 = dir2, it's a full X-X pipe_cleaner, getting from dir1 to dir2 -By design, d1 is the smallest direction and d2 is the highest -*/ - -/obj/structure/pipe_cleaner - name = "pipe cleaner" - desc = "A bendable piece of wire covered in fuzz. Fun for arts and crafts!" - icon = 'icons/obj/power_cond/pipe_cleaner.dmi' - icon_state = "0-1" - layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER - anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS - color = COLOR_RED - /// Pipe_cleaner direction 1 (see above) - var/d1 = 0 - /// pipe_cleaner direction 2 (see above) - var/d2 = 1 - /// Internal cable stack - var/obj/item/stack/pipe_cleaner_coil/stored - -/obj/structure/pipe_cleaner/yellow - color = COLOR_YELLOW - -/obj/structure/pipe_cleaner/green - color = COLOR_DARK_LIME - -/obj/structure/pipe_cleaner/blue - color = COLOR_STRONG_BLUE - -/obj/structure/pipe_cleaner/pink - color = COLOR_LIGHT_PINK - -/obj/structure/pipe_cleaner/orange - color = COLOR_MOSTLY_PURE_ORANGE - -/obj/structure/pipe_cleaner/cyan - color = COLOR_CYAN - -/obj/structure/pipe_cleaner/white - color = COLOR_WHITE - -// the power pipe_cleaner object -/obj/structure/pipe_cleaner/Initialize(mapload, param_color) - . = ..() - - // ensure d1 & d2 reflect the icon_state for entering and exiting pipe_cleaner - var/dash = findtext(icon_state, "-") - d1 = text2num(copytext(icon_state, 1, dash)) - d2 = text2num(copytext(icon_state, dash + length(icon_state[dash]))) - - if(d1) - stored = new/obj/item/stack/pipe_cleaner_coil(null, 2, null, null, null, color) - else - stored = new/obj/item/stack/pipe_cleaner_coil(null, 1, null, null, null, color) - - color = param_color || color - if(!color) - var/list/pipe_cleaner_colors = GLOB.pipe_cleaner_colors - var/random_color = pick(pipe_cleaner_colors) - color = pipe_cleaner_colors[random_color] - update_appearance() - -/obj/structure/pipe_cleaner/Destroy() // called when a pipe_cleaner is deleted - //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 pipe_cleaner - -/obj/structure/pipe_cleaner/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) - -/////////////////////////////////// -// General procedures -/////////////////////////////////// - -/obj/structure/pipe_cleaner/update_icon_state() - icon_state = "[d1]-[d2]" - return ..() - -/obj/structure/pipe_cleaner/update_icon() - . = ..() - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - -// Items usable on a pipe_cleaner : -// - Wirecutters : cut it duh ! -// - pipe cleaner coil : merge pipe cleaners -// -/obj/structure/pipe_cleaner/proc/handlecable(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_WIRECUTTER) - cut_pipe_cleaner(user) - return - - else if(istype(W, /obj/item/stack/pipe_cleaner_coil)) - var/obj/item/stack/pipe_cleaner_coil/coil = W - if (coil.get_amount() < 1) - to_chat(user, span_warning("Not enough pipe cleaner!")) - return - coil.pipe_cleaner_join(src, user) - - add_fingerprint(user) - -/obj/structure/pipe_cleaner/proc/cut_pipe_cleaner(mob/user) - user.visible_message(span_notice("[user] pulls up the pipe cleaner."), span_notice("You pull up the pipe cleaner.")) - stored.add_fingerprint(user) - investigate_log("was pulled up by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES) - deconstruct() - -/obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, params) - handlecable(W, user, params) - -/obj/structure/pipe_cleaner/singularity_pull(S, current_size) - ..() - if(current_size >= STAGE_FIVE) - deconstruct() - -/obj/structure/pipe_cleaner/proc/update_stored(length = 1, colorC = COLOR_RED) - stored.amount = length - stored.color = colorC - stored.update_appearance() - -/obj/structure/pipe_cleaner/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE)) - return - cut_pipe_cleaner(user) - -/////////////////////////////////////////////// -// The pipe cleaner coil object, used for laying pipe cleaner -/////////////////////////////////////////////// - -//////////////////////////////// -// Definitions -//////////////////////////////// - -/obj/item/stack/pipe_cleaner_coil - name = "pipe cleaner coil" - desc = "A coil of pipe cleaners. Good for arts and crafts, not to build with." - custom_price = PAYCHECK_ASSISTANT * 0.5 - gender = NEUTER //That's a pipe_cleaner coil sounds better than that's some pipe_cleaner coils - icon = 'icons/obj/power.dmi' - icon_state = "pipecleaner" - inhand_icon_state = "pipecleaner" - worn_icon_state = "coil" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - max_amount = MAXCOIL - amount = MAXCOIL - merge_type = /obj/item/stack/pipe_cleaner_coil // This is here to let its children merge between themselves - throwforce = 0 - w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 - throw_range = 5 - mats_per_unit = list(/datum/material/iron=10, /datum/material/glass=5) - flags_1 = CONDUCT_1 - slot_flags = ITEM_SLOT_BELT - attack_verb_continuous = list("whips", "lashes", "disciplines", "flogs") - attack_verb_simple = list("whip", "lash", "discipline", "flog") - singular_name = "pipe cleaner piece" - full_w_class = WEIGHT_CLASS_SMALL - grind_results = list("copper" = 2) //2 copper per pipe_cleaner in the coil - usesound = 'sound/items/deconstruct.ogg' - cost = 1 - source = /datum/robot_energy_storage/pipe_cleaner - color = COLOR_RED - -/obj/item/stack/pipe_cleaner_coil/cyborg/attack_self(mob/user) - var/list/pipe_cleaner_colors = GLOB.pipe_cleaner_colors - var/list/possible_colors = list() - for(var/color in pipe_cleaner_colors) - var/image/pipe_icon = image(icon = src.icon, icon_state = src.icon_state) - pipe_icon.color = pipe_cleaner_colors[color] - possible_colors += list("[color]" = pipe_icon) - - var/selected_color = show_radial_menu(user, src, possible_colors, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 40, require_near = TRUE) - if(!selected_color) - return - color = pipe_cleaner_colors[selected_color] - update_appearance() - -/** - * Checks if we are allowed to interact with a radial menu - * - * Arguments: - * * user The mob interacting with the menu - */ -/obj/item/stack/pipe_cleaner_coil/cyborg/proc/check_menu(mob/user) - if(!istype(user)) - return FALSE - if(!user.is_holding(src)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE - -/obj/item/stack/pipe_cleaner_coil/suicide_act(mob/user) - if(locate(/obj/structure/chair/stool) in get_turf(user)) - user.visible_message(span_suicide("[user] is making a noose with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - else - user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!")) - return(OXYLOSS) - -/obj/item/stack/pipe_cleaner_coil/Initialize(mapload, new_amount = null, list/mat_override=null, mat_amt=1, param_color = null) - . = ..() - - if(param_color) - color = param_color - if(!color) - var/list/pipe_cleaner_colors = GLOB.pipe_cleaner_colors - var/random_color = pick(pipe_cleaner_colors) - color = pipe_cleaner_colors[random_color] - - pixel_x = base_pixel_x + rand(-2, 2) - pixel_y = base_pixel_y + rand(-2, 2) - update_appearance() - -/////////////////////////////////// -// General procedures -/////////////////////////////////// - -/obj/item/stack/pipe_cleaner_coil/update_name() - . = ..() - name = "pipe cleaner [amount < 3 ? "piece" : "coil"]" - -/obj/item/stack/pipe_cleaner_coil/update_icon_state() - . = ..() - icon_state = "[initial(inhand_icon_state)][amount < 3 ? amount : ""]" - -/obj/item/stack/pipe_cleaner_coil/update_icon() - . = ..() - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - -/obj/item/stack/pipe_cleaner_coil/attack_hand(mob/user, list/modifiers) - . = ..() - if(.) - return - var/obj/item/stack/pipe_cleaner_coil/new_pipe_cleaner = ..() - if(istype(new_pipe_cleaner)) - new_pipe_cleaner.color = color - new_pipe_cleaner.update_appearance() - -//add pipe_cleaners to the stack -/obj/item/stack/pipe_cleaner_coil/proc/give(extra) - if(amount + extra > max_amount) - amount = max_amount - else - amount += extra - update_appearance() - -/////////////////////////////////////////////// -// Cable laying procedures -////////////////////////////////////////////// - -/obj/item/stack/pipe_cleaner_coil/proc/get_new_pipe_cleaner(location) - var/path = /obj/structure/pipe_cleaner - return new path(location, color) - -// called when pipe_cleaner_coil is clicked on a turf -/obj/item/stack/pipe_cleaner_coil/proc/place_turf(turf/T, mob/user, dirnew) - if(!isturf(user.loc)) - return - - if(!isturf(T) || !T.can_have_cabling()) - to_chat(user, span_warning("You can only lay pipe cleaners on a solid floor!")) - return - - if(get_amount() < 1) // Out of pipe_cleaner - to_chat(user, span_warning("There is no pipe cleaner left!")) - return - - if(get_dist(T,user) > 1) // Too far - to_chat(user, span_warning("You can't lay pipe cleaner at a place that far away!")) - return - - var/dirn - if(!dirnew) //If we weren't given a direction, come up with one! (Called as null from catwalk.dm and floor.dm) - if(user.loc == T) - dirn = user.dir //If laying on the tile we're on, lay in the direction we're facing - else - dirn = get_dir(T, user) - else - dirn = dirnew - - for(var/obj/structure/pipe_cleaner/LC in T) - if(LC.d2 == dirn && LC.d1 == 0) - to_chat(user, span_warning("There's already a pipe leaner at that position!")) - return - - var/obj/structure/pipe_cleaner/C = get_new_pipe_cleaner(T) - - //set up the new pipe_cleaner - C.d1 = 0 //it's a O-X node pipe_cleaner - C.d2 = dirn - C.add_fingerprint(user) - C.update_appearance() - - use(1) - - return C - -// called when pipe_cleaner_coil is click on an installed obj/pipe_cleaner -// or click on a turf that already contains a "node" pipe_cleaner -/obj/item/stack/pipe_cleaner_coil/proc/pipe_cleaner_join(obj/structure/pipe_cleaner/C, mob/user, showerror = TRUE, forceddir) - var/turf/U = user.loc - if(!isturf(U)) - return - - var/turf/T = C.loc - - if(!isturf(T)) // sanity check - return - - if(get_dist(C, user) > 1) // make sure it's close enough - to_chat(user, span_warning("You can't lay pipe cleaner at a place that far away!")) - return - - - if(U == T && !forceddir) //if clicked on the turf we're standing on and a direction wasn't supplied, try to put a pipe_cleaner in the direction we're facing - place_turf(T,user) - return - - var/dirn = get_dir(C, user) - if(forceddir) - dirn = forceddir - - // one end of the clicked pipe_cleaner is pointing towards us and no direction was supplied - if((C.d1 == dirn || C.d2 == dirn) && !forceddir) - if(!U.can_have_cabling()) //checking if it's a plating or catwalk - if (showerror) - to_chat(user, span_warning("You can only lay pipe cleaners on catwalks and plating!")) - return - else - // pipe_cleaner is pointing at us, we're standing on an open tile - // so create a stub pointing at the clicked pipe_cleaner on our tile - - var/fdirn = turn(dirn, 180) // the opposite direction - - for(var/obj/structure/pipe_cleaner/LC in U) // check to make sure there's not a pipe_cleaner there already - if(LC.d1 == fdirn || LC.d2 == fdirn) - if (showerror) - to_chat(user, span_warning("There's already a pipe cleaner at that position!")) - return - - var/obj/structure/pipe_cleaner/NC = get_new_pipe_cleaner(U) - - NC.d1 = 0 - NC.d2 = fdirn - NC.add_fingerprint(user) - NC.update_appearance() - - use(1) - - return - - // exisiting pipe_cleaner doesn't point at our position or we have a supplied direction, so see if it's a stub - else if(C.d1 == 0) - // if so, make it a full pipe_cleaner pointing from it's old direction to our dirn - var/nd1 = C.d2 // these will be the new directions - var/nd2 = dirn - - - if(nd1 > nd2) // swap directions to match icons/states - nd1 = dirn - nd2 = C.d2 - - - for(var/obj/structure/pipe_cleaner/LC in T) // check to make sure there's no matching pipe_cleaner - if(LC == C) // skip the pipe_cleaner we're interacting with - continue - if((LC.d1 == nd1 && LC.d2 == nd2) || (LC.d1 == nd2 && LC.d2 == nd1) ) // make sure no pipe_cleaner matches either direction - if (showerror) - to_chat(user, span_warning("There's already a pipe cleaner at that position!")) - - return - - - C.update_appearance() - - C.d1 = nd1 - C.d2 = nd2 - - //updates the stored pipe_cleaner coil - C.update_stored(2, color) - - C.add_fingerprint(user) - C.update_appearance() - - use(1) - - return - -////////////////////////////// -// Misc. -///////////////////////////// - -/obj/item/stack/pipe_cleaner_coil/red - color = COLOR_RED - -/obj/item/stack/pipe_cleaner_coil/yellow - color = COLOR_YELLOW - -/obj/item/stack/pipe_cleaner_coil/blue - color = COLOR_STRONG_BLUE - -/obj/item/stack/pipe_cleaner_coil/green - color = COLOR_DARK_LIME - -/obj/item/stack/pipe_cleaner_coil/pink - color = COLOR_LIGHT_PINK - -/obj/item/stack/pipe_cleaner_coil/orange - color = COLOR_MOSTLY_PURE_ORANGE - -/obj/item/stack/pipe_cleaner_coil/cyan - color = COLOR_CYAN - -/obj/item/stack/pipe_cleaner_coil/white - color = COLOR_WHITE - -/obj/item/stack/pipe_cleaner_coil/random - color = null - -/obj/item/stack/pipe_cleaner_coil/random/five - amount = 5 - -/obj/item/stack/pipe_cleaner_coil/cut - amount = null - icon_state = "pipecleaner2" - -/obj/item/stack/pipe_cleaner_coil/cut/Initialize(mapload) - if(!amount) - amount = rand(1,2) - . = ..() - pixel_x = base_pixel_x + rand(-2, 2) - pixel_y = base_pixel_y + rand(-2, 2) - update_appearance() - -/obj/item/stack/pipe_cleaner_coil/cut/red - color = COLOR_RED - -/obj/item/stack/pipe_cleaner_coil/cut/yellow - color = COLOR_YELLOW - -/obj/item/stack/pipe_cleaner_coil/cut/blue - color = COLOR_STRONG_BLUE - -/obj/item/stack/pipe_cleaner_coil/cut/green - color = COLOR_DARK_LIME - -/obj/item/stack/pipe_cleaner_coil/cut/pink - color = COLOR_LIGHT_PINK - -/obj/item/stack/pipe_cleaner_coil/cut/orange - color = COLOR_MOSTLY_PURE_ORANGE - -/obj/item/stack/pipe_cleaner_coil/cut/cyan - color = COLOR_CYAN - -/obj/item/stack/pipe_cleaner_coil/cut/white - color = COLOR_WHITE - -/obj/item/stack/pipe_cleaner_coil/cut/random - color = null diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index a33191e817a9..1c3c4f22b249 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -10,7 +10,7 @@ name = null icon = 'icons/obj/power.dmi' anchored = TRUE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT var/datum/powernet/powernet = null use_power = NO_POWER_USE idle_power_usage = 0 @@ -24,8 +24,11 @@ // You should know what you're doing if you're messing with stuff at this level anyways. network_flags = NONE - ///cable layer to which the machine is connected - var/machinery_layer = MACHINERY_LAYER_1 +/obj/machinery/power/Initialize(mapload) + . = ..() + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) /obj/machinery/power/Destroy() disconnect_from_network() @@ -196,7 +199,7 @@ if(!T || !istype(T)) return FALSE - var/obj/structure/cable/C = T.get_cable_node(machinery_layer) //check if we have a node cable on the machine turf, the first found is picked + var/obj/structure/cable/C = T.get_cable_node() //check if we have a node cable on the machine turf, the first found is picked if(!C || !C.powernet) var/obj/machinery/power/terminal/term = locate(/obj/machinery/power/terminal) in T if(!term || !term.powernet) @@ -425,11 +428,11 @@ /////////////////////////////////////////////// // return a cable able connect to machinery on layer if there's one on the turf, null if there isn't one -/turf/proc/get_cable_node(machinery_layer = MACHINERY_LAYER_1) +/turf/proc/get_cable_node() if(!can_have_cabling()) return null for(var/obj/structure/cable/C in src) - if(C.machinery_layer & machinery_layer) - C.update_appearance() - return C + if(!C.is_knotted()) + continue + return C return null diff --git a/code/modules/power/powernet.dm b/code/modules/power/powernet.dm index 4bdffcdd5634..a4118c87d315 100644 --- a/code/modules/power/powernet.dm +++ b/code/modules/power/powernet.dm @@ -13,17 +13,25 @@ /// Only SSpackets should be touching this. var/list/current_packet_queue = list() - var/load = 0 // the current load on the powernet, increased by each machine at processing - var/newavail = 0 // what available power was gathered last tick, then becomes... - var/avail = 0 //...the current available power in the powernet - var/viewavail = 0 // the available power as it appears on the power console (gradually updated) - var/viewload = 0 // the load as it appears on the power console (gradually updated) - var/netexcess = 0 // excess power on the powernet (typically avail-load)/////// - var/delayedload = 0 // load applied to powernet between power ticks. + /// The current load on the power net. + var/load = 0 + /// The current amount of power in the network + var/avail = 0 + /// The amount of power gathered this tick. Will become avail on reset() + var/newavail = 0 + + /// The amount of power visible to power consoles. This is a smoothed out value, so it is not 100% correct. + var/viewavail = 0 + /// The amount of load visible to power consoles. This is a smoothed out value, so it is not 100% correct. + var/viewload = 0 + + /// The amount of excess power from the LAST tick, typically avail - load. SMES units will subtract from this as they store the power. + var/netexcess = 0 + /// Load applied outside of machine processing, "between" ticks of power. + var/delayedload = 0 /datum/powernet/New() SSmachines.powernets += src - SSpackets.queued_networks += src /datum/powernet/Destroy() //Go away references, you suck! @@ -38,6 +46,7 @@ SSpackets.queued_networks -= src return ..() +/// Returns TRUE if there are no cables and no nodes belonging to the network. /datum/powernet/proc/is_empty() return !cables.len && !nodes.len @@ -85,8 +94,7 @@ data_nodes[M] = M nodes[M] = M -//handles the power changes in the powernet -//called every ticks by the powernet controller +/// Cycles the powernet's status, called by SSmachines, do not manually call. /datum/powernet/proc/reset() //see if there's a surplus of power remaining in the powernet and stores unused power in the SMES netexcess = avail - load @@ -119,5 +127,7 @@ /// Pass a signal through a powernet to all connected data equipment. // SSpackets does this for us! +// We just need to inform them we have something to deal with. /datum/powernet/proc/queue_signal(datum/signal/signal) next_packet_queue += signal + SSpackets.queued_networks |= src diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index c0a5118c1f35..cc647080400a 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -89,7 +89,7 @@ else overload() -/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume) +/obj/machinery/power/rtg/abductor/fire_act(exposed_temperature, exposed_volume, turf/adjacent) overload() /obj/machinery/power/rtg/abductor/zap_act(power, zap_flags) @@ -117,33 +117,6 @@ name = "Totally a [joke]." desc = "Yup. That's a [joke]." -/obj/machinery/power/rtg/lavaland - name = "Lava powered RTG" - desc = "This device only works when exposed to the toxic fumes of Lavaland" - circuit = null - power_gen = 1500 - anchored = TRUE - resistance_flags = LAVA_PROOF - -/obj/machinery/power/rtg/lavaland/Initialize(mapload) - . = ..() - var/turf/our_turf = get_turf(src) - if(!islava(our_turf)) - power_gen = 0 - if(!is_mining_level(z)) - power_gen = 0 - -/obj/machinery/power/rtg/lavaland/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) - . = ..() - var/turf/our_turf = get_turf(src) - if(!islava(our_turf)) - power_gen = 0 - return - if(!is_mining_level(z)) - power_gen = 0 - return - power_gen = initial(power_gen) - /obj/machinery/power/rtg/old_station name = "Old RTG" desc = "A very old RTG, it seems on the verge of being destroyed" diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 9a84d96ba19f..d76482eb25e0 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -118,7 +118,7 @@ ///Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second. var/has_shocked = FALSE -/obj/machinery/field/Bumped(atom/movable/mover) +/obj/machinery/field/BumpedBy(atom/movable/mover) if(has_shocked) return if(isliving(mover)) diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 3cf31507a0b6..27a0a1f1ad66 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -34,7 +34,7 @@ no power level overlay is currently in the overlays list. max_integrity = 500 can_atmos_pass = CANPASS_ALWAYS //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, FIRE = 50, ACID = 70) + armor = list(BLUNT = 25, PUNCTURE = 10, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) ///Amount of energy stored, used for visual overlays (over 9000?) var/power_level = 0 ///Current power mode of the machine, between FG_OFFLINE, FG_CHARGING, FG_ONLINE @@ -71,9 +71,6 @@ no power level overlay is currently in the overlays list. /obj/machinery/field/generator/anchored/Initialize(mapload) . = ..() set_anchored(TRUE) - -/obj/machinery/field/generator/ComponentInitialize() - . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF | EMP_PROTECT_WIRES) /obj/machinery/field/generator/process() @@ -176,7 +173,7 @@ no power level overlay is currently in the overlays list. return ..() /obj/machinery/field/generator/bullet_act(obj/projectile/considered_bullet) - if(considered_bullet.armor_flag != BULLET) + if(considered_bullet.armor_flag != PUNCTURE) power = min(power + considered_bullet.damage, field_generator_max_power) check_power_level() . = ..() diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index aedb9eddac50..8cd8896e20bd 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -262,21 +262,17 @@ SSshuttle.lockdown = FALSE INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 2) -///Helper to set the round to end asap. Current usage Cult round end code -/proc/ending_helper() - SSticker.force_ending = 1 - /** * Selects cinematic to play as part of the cult end depending on the outcome then ends the round afterward * called either when narsie eats everyone, or when [/proc/begin_the_end()] reaches it's conclusion */ /proc/cult_ending_helper(ending_type = 0) if(ending_type == 2) //narsie fukkin died - Cinematic(CINEMATIC_CULT_FAIL,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper))) + Cinematic(CINEMATIC_CULT_FAIL,world,CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, end_round))) else if(ending_type) //no explosion - Cinematic(CINEMATIC_CULT,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper))) + Cinematic(CINEMATIC_CULT,world,CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, end_round))) else // explosion - Cinematic(CINEMATIC_CULT_NUKE,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper))) + Cinematic(CINEMATIC_CULT_NUKE,world,CALLBACK(SSticker, TYPE_PROC_REF(/datum/controller/subsystem/ticker, end_round))) #undef NARSIE_CHANCE_TO_PICK_NEW_TARGET #undef NARSIE_CONSUME_RANGE diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index cb8083fcb774..9c66230a67e3 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -60,7 +60,7 @@ expand(current_size) - for (var/obj/machinery/power/singularity_beacon/singu_beacon in GLOB.machines) + for (var/obj/machinery/power/singularity_beacon/singu_beacon as anything in INSTANCES_OF(/obj/machinery/power/singularity_beacon)) if (singu_beacon.active) new_component.target = singu_beacon break diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 644dfc3b660f..36e5744b04b5 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -22,7 +22,7 @@ use_power = NO_POWER_USE circuit = /obj/item/circuitboard/machine/smes - var/capacity = 5e6 // maximum charge + var/capacity = 10e6 // maximum charge var/charge = 0 // actual charge var/input_attempt = TRUE // TRUE = attempting to charge, FALSE = not attempting to charge @@ -46,6 +46,7 @@ /obj/machinery/power/smes/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) dir_loop: for(var/d in GLOB.cardinals) var/turf/T = get_step(src, d) @@ -72,9 +73,9 @@ for(var/obj/item/stock_parts/cell/PC in component_parts) MC += PC.maxcharge C += PC.charge - capacity = MC / (15000) * 1e6 + capacity = MC * 100 // 1 Kilowatt to 0.1 megawatts if(!initial(charge) && !charge) - charge = C / 15000 * 1e6 + charge = C * 100 // 1 Kilowatt to 0.1 megawatts /obj/machinery/power/smes/should_have_node() return TRUE @@ -180,6 +181,8 @@ cell.charge = (charge / capacity) * cell.maxcharge /obj/machinery/power/smes/Destroy() + UNSET_TRACKING(__TYPE__) + if(SSticker.IsRoundInProgress()) var/turf/T = get_turf(src) message_admins("[src] deleted at [ADMIN_VERBOSEJMP(T)]") @@ -409,8 +412,8 @@ /obj/machinery/power/smes/engineering input_attempt = FALSE //Don't drain the private loop by default - charge = 5e6 // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone //ZAS supermatter takes longer to set up so you get max. - output_level = 90000 + charge = 10e6 // Engineering starts with some charge for singulo //sorry little one, singulo as engine is gone //ZAS supermatter takes longer to set up so you get max. + output_level = 180000 /obj/machinery/power/smes/magical name = "magical power storage unit" diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 42bae6b88cdc..2232a71a9119 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -32,7 +32,7 @@ /obj/machinery/power/solar/Initialize(mapload, obj/item/solar_assembly/S) . = ..() - + SET_TRACKING(__TYPE__) panel_edge = add_panel_overlay("solar_panel_edge", PANEL_EDGE_Y_OFFSET) panel = add_panel_overlay("solar_panel", PANEL_Y_OFFSET) @@ -41,6 +41,7 @@ RegisterSignal(SSsun, COMSIG_SUN_MOVED, PROC_REF(queue_update_solar_exposure)) /obj/machinery/power/solar/Destroy() + UNSET_TRACKING(__TYPE__) unset_control() //remove from control computer return ..() diff --git a/code/modules/power/supermatter/nupermatter.dm b/code/modules/power/supermatter/nupermatter.dm index 859675e03a72..b9b78faf3b24 100644 --- a/code/modules/power/supermatter/nupermatter.dm +++ b/code/modules/power/supermatter/nupermatter.dm @@ -65,8 +65,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) var/emergency_color = "#ffd04f" var/rotation_angle = 0 - var/grav_pulling = 0 - // Time in ticks between delamination ('exploding') and exploding (as in the actual boom) + // Time between delamination ('exploding') and exploding (as in the actual boom) var/pull_time = 30 SECONDS var/explosion_power = 9 @@ -119,6 +118,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) /obj/machinery/power/supermatter/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) uid = gl_uid++ investigate_log("has been created.", INVESTIGATE_ENGINE) SSairmachines.start_processing_machine(src) @@ -136,9 +136,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) radio.recalculateChannels() AddElement(/datum/element/lateral_bound, TRUE) - + AddComponent(/datum/component/smell, INTENSITY_SUBTLE, SCENT_FRAGRANCE, "weird", 2) /obj/machinery/power/supermatter/Destroy() + UNSET_TRACKING(__TYPE__) investigate_log("has been destroyed.", INVESTIGATE_ENGINE) SSairmachines.stop_processing_machine(src) QDEL_NULL(radio) @@ -192,7 +193,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) if(!air) return SUPERMATTER_ERROR - if(grav_pulling || exploded) + if(exploded) return SUPERMATTER_DELAMINATING if(get_integrity_percentage() < 25) @@ -214,10 +215,10 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) if(exploded) return + AddComponent(/datum/component/singularity, FALSE, 1, CALLBACK(src, PROC_REF(Consume)), TRUE, 20, TRUE, 1, FALSE, 9) message_admins("Supermatter delaminating!! [ADMIN_FLW(src)]") anchored = TRUE - grav_pulling = 1 exploded = 1 sleep(pull_time) @@ -228,22 +229,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) var/list/affected_z = SSmapping.get_zstack(TS.z, TRUE) - // Effect 1: Radiation, weakening to all mobs on Z level - SSweather.run_weather(/datum/weather/rad_storm, affected_z, FALSE) - - for(var/mob/living/mob in GLOB.mob_living_list) - CHECK_TICK - var/turf/TM = get_turf(mob) - if(!TM) - continue - if(!(TM.z in affected_z)) - continue - - mob.Knockdown(DETONATION_MOB_CONCUSSION) - to_chat(mob, span_danger("An invisible force slams you against the ground!")) - - // Effect 2: Z-level wide electrical pulse - for(var/obj/machinery/power/apc/A in GLOB.machines) + // Effect 1: Z-level wide electrical pulse + for(var/obj/machinery/power/apc/A as anything in INSTANCES_OF(/obj/machinery/power/apc)) CHECK_TICK if(!(A.z in affected_z)) continue @@ -255,19 +242,37 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) var/random_change = rand(100 - DETONATION_SHUTDOWN_RNG_FACTOR, 100 + DETONATION_SHUTDOWN_RNG_FACTOR) / 100 A.energy_fail(round(DETONATION_SHUTDOWN_APC * random_change)) - // Effect 3: Break solar arrays + // Effect 2: Break solar arrays - for(var/obj/machinery/power/solar/S in GLOB.machines) + for(var/obj/machinery/power/solar/S as anything in INSTANCES_OF(/obj/machinery/power/solar)) CHECK_TICK if(!(S.z in affected_z)) continue if(prob(DETONATION_SOLAR_BREAK_CHANCE)) S.atom_break() - // Effect 4: Medium scale explosion - spawn(0) - explosion(TS, explosion_power/2, explosion_power, explosion_power * 2, explosion_power * 4, 1) - qdel(src) + // Effect 3: Medium scale explosion + var/datum/gas_mixture/GM = TS.return_air() + GM?.removeRatio(100) + + explosion(TS, explosion_power/2, explosion_power, explosion_power * 2, explosion_power * 4, 1) + moveToNullspace() + + // Effect 4: Radiation, weakening to all mobs on Z level + SSweather.run_weather(/datum/weather/rad_storm, affected_z, TRUE) + + for(var/mob/living/mob in GLOB.mob_living_list) + CHECK_TICK + var/turf/TM = get_turf(mob) + if(!TM) + continue + if(!(TM.z in affected_z)) + continue + + mob.Knockdown(DETONATION_MOB_CONCUSSION) + to_chat(mob, span_danger("An invisible force slams you against the ground!")) + + qdel(src) /obj/machinery/power/supermatter/examine(mob/user) . = ..() @@ -320,7 +325,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) public_alert = 1 for(var/mob/M in GLOB.player_list) if((is_station_level(M.z))) - M.playsound_local(get_turf(M), 'sound/ambience/matteralarm.ogg') + M.playsound_local(get_turf(M), 'sound/ambience/matteralarm.ogg', 100, FALSE) else if(safe_warned && public_alert) priority_announce(alert_msg, "Station Announcement","Supermatter Monitor", ANNOUNCER_ATTENTION) @@ -348,8 +353,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) announce_warning() else shift_light(4,base_color) - if(grav_pulling) - supermatter_pull(src) //Ok, get the air from the turf var/datum/gas_mixture/removed = null @@ -366,8 +369,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) if(!env || !removed || !removed.total_moles) damage_archived = damage damage += max((power - 15*power_factor)/10, 0) - else if (grav_pulling) //If supermatter is detonating, remove all air from the zone - env.remove(env.total_moles) else damage_archived = damage @@ -450,50 +451,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) return 1 -/obj/machinery/power/supermatter/Bumped(atom/AM as mob|obj) - if(istype(AM, /obj/effect)) - return - if(istype(AM, /mob/living)) - AM.visible_message( - span_warning("[AM] slams into [src], inducing a resonance. For a brief instant, [AM.p_their()] body glows brilliantly, then flashes into ash."), - span_userdanger("You slam into [src], and your mind fills with unearthly shrieking. Your vision floods with light as your body instantly dissolves into dust."), - span_warning("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") - ) - else if(!grav_pulling) //To prevent spam, detonating supermatter does not indicate non-mobs being destroyed - AM.visible_message( - span_warning("[AM] smacks into [src] and rapidly flashes to ash."), - span_warning("You hear a loud crack as you are washed with a wave of heat.") - ) - - Consume(AM) - -/* -/obj/machinery/power/supermatter/proc/Consume(mob/living/user) - if(istype(user)) - dust_mob(user) - power += 200 - else - qdel(user) - - power += 200 - - //Some poor sod got eaten, go ahead and irradiate people nearby. - var/list/viewers = viewers(src) - for(var/mob/living/l in range(10)) - if(l in viewers) - to_chat(l, span_warning("As [src] slowly stops resonating, you feel an intense wave of heat wash over you.")) - else - to_chat(l, span_warning("You hear a muffled, shrill ringing as an intense wave of heat washes over you.")) - var/rads = 500 - SSradiation.radiate(src, rads) -*/ - -/proc/supermatter_pull(atom/target, pull_range = 255, pull_power = STAGE_FIVE) - for(var/atom/A in range(pull_range, target)) - A.singularity_pull(target, pull_power) - CHECK_TICK - - /obj/machinery/power/supermatter/GotoAirflowDest(n) //Supermatter not pushed around by airflow return @@ -560,23 +517,6 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) return data -/* - data["integrity_percentage"] = round(get_integrity_percentage()) - var/datum/gas_mixture/env = null - var/turf/T = get_turf(src) - - if(istype(T)) - env = T.return_air() - - if(!env) - data["ambient_temp"] = 0 - data["ambient_pressure"] = 0 - else - data["ambient_temp"] = round(env.temperature) - data["ambient_pressure"] = round(env.returnPressure()) - data["detonating"] = grav_pulling - data["energy"] = power -*/ /obj/machinery/power/supermatter/shard //Small subtype, less efficient and more sensitive, but less boom. name = "supermatter shard" @@ -624,16 +564,13 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter) color = color_matrix - var/HSV = RGBtoHSV(base_color) - var/RGB = HSVtoRGB(RotateHue(HSV, angle)) + var/RGB = RotateHue(base_color, angle) base_color = RGB - HSV = RGBtoHSV(warning_color) - RGB = HSVtoRGB(RotateHue(HSV, angle)) + RGB = RotateHue(warning_color, angle) warning_color = RGB - HSV = RGBtoHSV(emergency_color) - RGB = HSVtoRGB(RotateHue(HSV, angle)) + RGB = RotateHue(emergency_color, angle) emergency_color = RGB /obj/machinery/power/supermatter/inert diff --git a/code/modules/power/supermatter/nupermatter_hit_procs.dm b/code/modules/power/supermatter/nupermatter_hit_procs.dm index a7f4f6206b48..36ee84deb5ab 100644 --- a/code/modules/power/supermatter/nupermatter_hit_procs.dm +++ b/code/modules/power/supermatter/nupermatter_hit_procs.dm @@ -3,7 +3,7 @@ SIGNAL_HANDLER for(var/atom/thing_to_consume as anything in tram_contents) - Bumped(thing_to_consume) + BumpedBy(thing_to_consume) /obj/machinery/power/supermatter/bullet_act(obj/projectile/projectile) var/turf/local_turf = loc @@ -18,7 +18,7 @@ if(!istype(projectile.firer, /obj/machinery/power/emitter)) investigate_log("has been hit by [projectile] fired by [key_name(projectile.firer)]", INVESTIGATE_ENGINE) - if(projectile.armor_flag != BULLET || kiss_power) //This is a beam. + if(projectile.armor_flag != PUNCTURE || kiss_power) //This is a beam. power += ((projectile.damage * SUPERMATTER_BULLET_ENERGY + kiss_power) * charging_factor) / power_factor if(!has_been_powered) @@ -121,7 +121,7 @@ dust_mob(user, cause = "hand") return - if(!user.is_mouth_covered()) + if(user.has_mouth() && !user.is_mouth_covered()) if(user.combat_mode) dust_mob(user, span_danger("As [user] tries to take a bite out of [src] everything goes silent before [user.p_their()] body starts to glow and burst into flames before flashing to ash."), @@ -236,24 +236,23 @@ default_unfasten_wrench(user, tool) return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/power/supermatter/Bumped(atom/movable/hit_object) - if(isliving(hit_object)) - hit_object.visible_message( - span_danger("[hit_object] slams into [src] inducing a resonance... [hit_object.p_their()] body starts to glow and burst into flames before flashing into dust!"), - span_userdanger("You slam into [src] as your ears are filled with unearthly ringing. Your last thought is \"Oh, fuck.\""), - span_hear("You hear an unearthly noise as a wave of heat washes over you.") +/obj/machinery/power/supermatter/BumpedBy(atom/AM as mob|obj) + if(istype(AM, /obj/effect)) + return + if(istype(AM, /mob/living)) + AM.visible_message( + span_warning("[AM] slams into [src], inducing a resonance. For a brief instant, [AM.p_their()] body glows brilliantly, then flashes into ash."), + span_userdanger("You slam into [src], and your mind fills with unearthly shrieking. Your vision floods with light as your body instantly dissolves into dust."), + span_warning("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") ) - else if(isobj(hit_object) && !iseffect(hit_object)) - hit_object.visible_message( - span_danger("[hit_object] smacks into [src] and rapidly flashes to ash."), - null, - span_hear("You hear a loud crack as you are washed with a wave of heat.") + else if(!exploded) //To prevent spam, detonating supermatter does not indicate non-mobs being destroyed + AM.visible_message( + span_warning("[AM] smacks into [src] and rapidly flashes to ash."), + span_warning("You hear a loud crack as you are washed with a wave of heat.") ) - else - return playsound(get_turf(src), 'sound/effects/supermatter.ogg', 50, TRUE) - Consume(hit_object) + Consume(AM) /obj/machinery/power/supermatter/Bump(atom/bumped_atom) . = ..() @@ -301,7 +300,7 @@ /obj/machinery/power/supermatter/intercept_zImpact(list/falling_movables, levels) . = ..() for(var/atom/movable/hit_object as anything in falling_movables) - Bumped(hit_object) + BumpedBy(hit_object) . |= FALL_STOP_INTERCEPTING | FALL_INTERCEPTED /obj/machinery/power/supermatter/proc/Consume(atom/movable/consumed_object) @@ -330,25 +329,27 @@ message_admins("[src] has consumed [consumed_object], [suspicion] [ADMIN_JMP(src)].") investigate_log("has consumed [consumed_object] - [suspicion].", INVESTIGATE_ENGINE) qdel(consumed_object) + if(!iseffect(consumed_object) && isitem(consumed_object)) var/obj/item/consumed_item = consumed_object object_size = consumed_item.w_class power += 5 * object_size - //Some poor sod got eaten, go ahead and irradiate people nearby. - radiation_pulse(src, max_range = 6, threshold = 1.2 / object_size, chance = 10 * object_size) - for(var/mob/living/near_mob in range(10)) - investigate_log("has irradiated [key_name(near_mob)] after consuming [consumed_object].", INVESTIGATE_ENGINE) - if (HAS_TRAIT(near_mob, TRAIT_RADIMMUNE) || issilicon(near_mob)) - continue - if(ishuman(near_mob) && SSradiation.wearing_rad_protected_clothing(near_mob)) - continue - if(near_mob in view()) - near_mob.show_message( - span_danger("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns."), MSG_VISUAL, - span_danger("The unearthly ringing subsides and you find your skin covered in new radiation burns."), MSG_AUDIBLE) - else - near_mob.show_message(span_hear("An unearthly ringing fills your ears, and you find your skin covered in new radiation burns."), MSG_AUDIBLE) + if(!exploded) + //Some poor sod got eaten, go ahead and irradiate people nearby. + radiation_pulse(src, max_range = 6, threshold = 1.2 / object_size, chance = 10 * object_size) + for(var/mob/living/near_mob in range(10)) + investigate_log("has irradiated [key_name(near_mob)] after consuming [consumed_object].", INVESTIGATE_ENGINE) + if (HAS_TRAIT(near_mob, TRAIT_RADIMMUNE) || issilicon(near_mob)) + continue + if(ishuman(near_mob) && SSradiation.wearing_rad_protected_clothing(near_mob)) + continue + if(near_mob in view()) + near_mob.show_message( + span_danger("As \the [src] slowly stops resonating, you find your skin covered in new radiation burns."), MSG_VISUAL, + span_danger("The unearthly ringing subsides and you find your skin covered in new radiation burns."), MSG_AUDIBLE) + else + near_mob.show_message(span_hear("An unearthly ringing fills your ears, and you find your skin covered in new radiation burns."), MSG_AUDIBLE) //Do not blow up our internal radio /obj/machinery/power/supermatter/contents_explosion(severity, target) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index bd815b5cec19..30ae85b88ef9 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -91,8 +91,8 @@ /obj/machinery/power/energy_accumulator/tesla_coil/zap_act(power, zap_flags) if(!anchored || panel_open) return ..() - obj_flags |= BEING_SHOCKED - addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 1 SECONDS) + ADD_TRAIT(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED) + addtimer(TRAIT_CALLBACK_REMOVE(src, TRAIT_BEING_SHOCKED, WAS_SHOCKED), 1 SECONDS) flick("coilhit", src) if(!(zap_flags & ZAP_GENERATES_POWER)) //Prevent infinite recursive power return 0 diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index e80f44984cfa..a24be64b73d7 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -156,7 +156,7 @@ /obj/energy_ball/Bump(atom/A) dust_mobs(A) -/obj/energy_ball/Bumped(atom/movable/AM) +/obj/energy_ball/BumpedBy(atom/movable/AM) dust_mobs(AM) /obj/energy_ball/attack_tk(mob/user) @@ -243,16 +243,16 @@ //Darkness fucks oview up hard. I've tried dview() but it doesn't seem to work //I hate existance - for(var/a in typecache_filter_list(oview(zap_range+2, source), things_to_shock)) - var/atom/A = a + for(var/atom/A as anything in typecache_filter_list(oview(zap_range+2, source), things_to_shock)) if(!(zap_flags & ZAP_ALLOW_DUPLICATES) && LAZYACCESS(shocked_targets, A)) continue + if(closest_type >= BIKE) break else if(istype(A, /obj/vehicle/ridden/bicycle))//God's not on our side cause he hates idiots. var/obj/vehicle/ridden/bicycle/B = A - if(!(B.obj_flags & BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean + if(!HAS_TRAIT(B, TRAIT_BEING_SHOCKED) && B.can_buckle)//Gee goof thanks for the boolean //we use both of these to save on istype and typecasting overhead later on //while still allowing common code to run before hand closest_type = BIKE @@ -262,10 +262,9 @@ continue //no need checking these other things else if(istype(A, /obj/machinery/power/energy_accumulator/tesla_coil)) - var/obj/machinery/power/energy_accumulator/tesla_coil/C = A - if(!(C.obj_flags & BEING_SHOCKED)) + if(!HAS_TRAIT(A, TRAIT_BEING_SHOCKED)) closest_type = COIL - closest_atom = C + closest_atom = A else if(closest_type >= ROD) continue @@ -279,7 +278,7 @@ else if(istype(A,/obj/vehicle/ridden)) var/obj/vehicle/ridden/R = A - if(R.can_buckle && !(R.obj_flags & BEING_SHOCKED)) + if(R.can_buckle && !HAS_TRAIT(R, TRAIT_BEING_SHOCKED)) closest_type = RIDE closest_atom = A @@ -288,7 +287,7 @@ else if(isliving(A)) var/mob/living/L = A - if(L.stat != DEAD && !(HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE)) && !(L.flags_1 & SHOCKED_1)) + if(L.stat != DEAD && !HAS_TRAIT(L, TRAIT_TESLA_SHOCKIMMUNE) && !HAS_TRAIT(L, TRAIT_BEING_SHOCKED)) closest_type = LIVING closest_atom = A @@ -296,8 +295,7 @@ continue else if(ismachinery(A)) - var/obj/machinery/M = A - if(!(M.obj_flags & BEING_SHOCKED)) + if(!HAS_TRAIT(A, TRAIT_BEING_SHOCKED)) closest_type = MACHINERY closest_atom = A @@ -305,8 +303,7 @@ continue else if(istype(A, /obj/structure/blob)) - var/obj/structure/blob/B = A - if(!(B.obj_flags & BEING_SHOCKED)) + if(!HAS_TRAIT(A, TRAIT_BEING_SHOCKED)) closest_type = BLOB closest_atom = A @@ -314,8 +311,7 @@ continue else if(isstructure(A)) - var/obj/structure/S = A - if(!(S.obj_flags & BEING_SHOCKED)) + if(!HAS_TRAIT(A, TRAIT_BEING_SHOCKED)) closest_type = STRUCTURE closest_atom = A @@ -334,8 +330,8 @@ if(closest_type == LIVING) var/mob/living/closest_mob = closest_atom - closest_mob.set_shocked() - addtimer(CALLBACK(closest_mob, TYPE_PROC_REF(/mob/living, reset_shocked), 10)) + ADD_TRAIT(closest_mob, TRAIT_BEING_SHOCKED, WAS_SHOCKED) + addtimer(TRAIT_CALLBACK_REMOVE(closest_mob, TRAIT_BEING_SHOCKED, WAS_SHOCKED), 1 SECONDS) var/shock_damage = (zap_flags & ZAP_MOB_DAMAGE) ? (min(round(power/600), 90) + rand(-5, 5)) : 0 closest_mob.electrocute_act(shock_damage, source, 1, SHOCK_TESLA | ((zap_flags & ZAP_MOB_STUN) ? NONE : SHOCK_NOSTUN)) if(issilicon(closest_mob)) diff --git a/code/modules/power/turbine/turbine.dm b/code/modules/power/turbine/turbine.dm index 47e538e897b3..d0450c5e49b3 100644 --- a/code/modules/power/turbine/turbine.dm +++ b/code/modules/power/turbine/turbine.dm @@ -33,7 +33,7 @@ /obj/machinery/power/turbine/Initialize(mapload) . = ..() - + SET_TRACKING(__TYPE__) if(has_gasmix) machine_gasmix = new machine_gasmix.volume = gas_theoretical_volume @@ -46,6 +46,7 @@ update_appearance() /obj/machinery/power/turbine/Destroy() + UNSET_TRACKING(__TYPE__) air_update_turf(TRUE) diff --git a/code/modules/power/turbine/turbine_computer.dm b/code/modules/power/turbine/turbine_computer.dm index 2adc179a79b5..d9d1163a4c10 100644 --- a/code/modules/power/turbine/turbine_computer.dm +++ b/code/modules/power/turbine/turbine_computer.dm @@ -20,7 +20,7 @@ /obj/machinery/computer/turbine_computer/locate_machinery(multitool_connection) if(!mapping_id) return - for(var/obj/machinery/power/turbine/core_rotor/main in GLOB.machines) + for(var/obj/machinery/power/turbine/core_rotor/main in INSTANCES_OF(/obj/machinery/power/turbine)) if(main.mapping_id != mapping_id) continue register_machine(main) diff --git a/code/modules/procedural_mapping/mapGenerators/asteroid.dm b/code/modules/procedural_mapping/mapGenerators/asteroid.dm index 18b266fc671a..c362815ecba8 100644 --- a/code/modules/procedural_mapping/mapGenerators/asteroid.dm +++ b/code/modules/procedural_mapping/mapGenerators/asteroid.dm @@ -20,8 +20,7 @@ /datum/map_generator_module/splatter_layer/asteroid_monsters spawnableTurfs = list() spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/basilisk = 10, \ - /mob/living/simple_animal/hostile/asteroid/hivelord = 10, \ - /mob/living/simple_animal/hostile/asteroid/goliath = 10) + /mob/living/simple_animal/hostile/asteroid/hivelord = 10) // GENERATORS diff --git a/code/modules/procedural_mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm deleted file mode 100644 index 723bc5f5782c..000000000000 --- a/code/modules/procedural_mapping/mapGenerators/lava_river.dm +++ /dev/null @@ -1,27 +0,0 @@ - -/datum/map_generator/lavaland - var/start_z - var/min_x = 0 - var/min_y = 0 - var/max_x = 0 - var/max_y = 0 - modules = list(/datum/map_generator_module/river) - buildmode_name = "Pattern: Lava Rivers" - -/datum/map_generator/lavaland/defineRegion(turf/Start, turf/End, replace = 0) - start_z = Start.z - min_x = min(Start.x,End.x) - min_y = min(Start.y,End.y) - max_x = max(Start.x,End.x) - max_y = max(Start.y,End.y) - ..() - -/datum/map_generator_module/river - var/river_type = /turf/open/lava/smooth - var/river_nodes = 4 - -/datum/map_generator_module/river/generate() - var/datum/map_generator/lavaland/L = mother - if(!istype(L)) - return - spawn_rivers(L.start_z, river_nodes, river_type, min_x = L.min_x, min_y = L.min_y, max_x = L.max_x, max_y = L.max_y) diff --git a/code/modules/procedural_mapping/mapGenerators/lavaland.dm b/code/modules/procedural_mapping/mapGenerators/lavaland.dm deleted file mode 100644 index 9cbc5244ae21..000000000000 --- a/code/modules/procedural_mapping/mapGenerators/lavaland.dm +++ /dev/null @@ -1,33 +0,0 @@ - -/datum/map_generator_module/bottom_layer/lavaland_default - spawnableTurfs = list(/turf/open/misc/asteroid/basalt/lava_land_surface = 100) - -/datum/map_generator_module/bottom_layer/lavaland_mineral - spawnableTurfs = list(/turf/closed/mineral/random/volcanic = 100) - -/datum/map_generator_module/bottom_layer/lavaland_mineral/dense - spawnableTurfs = list(/turf/closed/mineral/random/high_chance/volcanic = 100) - -/datum/map_generator_module/splatter_layer/lavaland_monsters - spawnableTurfs = list() - spawnableAtoms = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 10, - /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 10, - /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 10) - -/datum/map_generator_module/splatter_layer/lavaland_tendrils - spawnableTurfs = list() - spawnableAtoms = list(/obj/structure/spawner/lavaland = 5, - /obj/structure/spawner/lavaland/legion = 5, - /obj/structure/spawner/lavaland/goliath = 5) - -/datum/map_generator/lavaland/ground_only - modules = list(/datum/map_generator_module/bottom_layer/lavaland_default) - buildmode_name = "Block: Lavaland Floor" - -/datum/map_generator/lavaland/dense_ores - modules = list(/datum/map_generator_module/bottom_layer/lavaland_mineral/dense) - buildmode_name = "Block: Lavaland Ores: Dense" - -/datum/map_generator/lavaland/normal_ores - modules = list(/datum/map_generator_module/bottom_layer/lavaland_mineral) - buildmode_name = "Block: Lavaland Ores" diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index 594d5f66e678..cc6e9a34e112 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -34,7 +34,7 @@ var/list/obj/structure/cable/cables = list() var/list/atom/atoms = list() - repopulate_sorted_areas() + require_area_resort() for(var/L in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], SSmapping.station_start), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], z_offset - 1))) diff --git a/code/modules/projectiles/aiming.dm b/code/modules/projectiles/aiming.dm new file mode 100644 index 000000000000..1664a5a66c07 --- /dev/null +++ b/code/modules/projectiles/aiming.dm @@ -0,0 +1,181 @@ +/obj/effect/abstract/aim_overlay + vis_flags = VIS_INHERIT_ID|VIS_INHERIT_PLANE|VIS_INHERIT_LAYER + icon = 'icons/effects/aim.dmi' + icon_state = "locking" + anchored = TRUE + + appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + + /// The man with the gun + var/mob/living/user + /// The man on the other end of the gun + var/mob/living/target + /// The gun + var/obj/item/gun/tool + + /// Are we locked on? + var/locked = FALSE + /// When will we lock on? + var/lock_time = 0.5 SECONDS + /// Will we fire when a trigger condition is met? + var/active + +/obj/effect/abstract/aim_overlay/Initialize(mapload, mob/living/user, mob/living/target, obj/item/gun/tool) + . = ..() + if(!istype(user) || !istype(target) || !istype(tool)) + return INITIALIZE_HINT_QDEL + + src.user = user + src.tool = tool + + register_to_target(target) + + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(target_del)) + RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(target_del)) + RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(check_sight)) + RegisterSignal(user, COMSIG_MOB_FIRED_GUN, PROC_REF(user_shot)) + RegisterSignal(user, list(COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_GET_GRABBED, COMSIG_HUMAN_DISARM_HIT), PROC_REF(trigger)) + RegisterSignal( + user, + list( + SIGNAL_ADDTRAIT(TRAIT_ARMS_RESTRAINED), + SIGNAL_ADDTRAIT(TRAIT_HANDS_BLOCKED), + SIGNAL_ADDTRAIT(TRAIT_INCAPACITATED), + SIGNAL_ADDTRAIT(TRAIT_FLOORED) + ), + PROC_REF(cancel) + ) + RegisterSignal(tool, list(COMSIG_ITEM_DROPPED, COMSIG_ITEM_EQUIPPED), PROC_REF(check_item)) + + user.apply_status_effect(/datum/status_effect/holdup, user) + target.apply_status_effect(/datum/status_effect/grouped/heldup, REF(user)) + + user.visible_message( + span_warning("[user] aims [tool] at [target]!"), \ + ) + + SEND_SOUND(target, sound('sound/weapons/TargetOn.ogg')) + SEND_SOUND(user, sound('sound/weapons/TargetOn.ogg')) + + addtimer(CALLBACK(src, PROC_REF(set_locked)), lock_time) + +/obj/effect/abstract/aim_overlay/Destroy(force) + user?.remove_status_effect(/datum/status_effect/holdup) + target?.remove_status_effect(/datum/status_effect/grouped/heldup, REF(user)) + user?.gunpoint = null + user = null + target = null + tool = null + return ..() + +/obj/effect/abstract/aim_overlay/update_icon_state() + . = ..() + if(locked) + icon_state = "locked" + else + icon_state = "locking" + +/obj/effect/abstract/aim_overlay/proc/set_locked() + locked = TRUE + update_icon_state() + +/obj/effect/abstract/aim_overlay/proc/register_to_target(mob/new_target) + if(target) + UnregisterSignal( + target, + list( + COMSIG_PARENT_QDELETING, + COMSIG_MOVABLE_MOVED, + COMSIG_LIVING_UNARMED_ATTACK, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOB_ATTACK_HAND, + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_ATTACK_RANGED, + COMSIG_LIVING_USE_RADIO + ) + ) + target.vis_contents -= src + user.visible_message(span_warning("[user] turns [tool] on [new_target]!")) + + target = new_target + target.vis_contents += src + + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(target_del)) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(target_moved)) + RegisterSignal( + target, + list( + COMSIG_LIVING_UNARMED_ATTACK, + COMSIG_MOB_ITEM_ATTACK, + COMSIG_MOB_FIRED_GUN, + COMSIG_MOB_ATTACK_HAND, + COMSIG_MOB_ATTACK_RANGED + ), + PROC_REF(target_acted) + ) + RegisterSignal(target, COMSIG_LIVING_USE_RADIO, PROC_REF(target_use_radio)) + + to_chat(target, span_danger("You now have [tool] point at you. No sudden moves!")) + +/obj/effect/abstract/aim_overlay/proc/target_del(datum/source) + SIGNAL_HANDLER + qdel(src) + +/obj/effect/abstract/aim_overlay/proc/user_shot(mob/living/source) + if(!QDELETED(src)) + qdel(src) + +/obj/effect/abstract/aim_overlay/proc/check_item(obj/item/source) + SIGNAL_HANDLER + if(!(source in user.held_items)) + qdel(src) + return + + +/obj/effect/abstract/aim_overlay/proc/target_moved(mob/living/source) + SIGNAL_HANDLER + + if(user.gunpoint_flags & TARGET_CAN_MOVE) + return + + if(source.m_intent == MOVE_INTENT_WALK || (user.gunpoint_flags & TARGET_CAN_RUN)) + return + + trigger() + +/obj/effect/abstract/aim_overlay/proc/target_acted(client/source) + SIGNAL_HANDLER + + if(user.gunpoint_flags & TARGET_CAN_INTERACT) + return + + trigger() + +/obj/effect/abstract/aim_overlay/proc/target_use_radio(mob/living/source) + SIGNAL_HANDLER + + if(user.gunpoint_flags & TARGET_CAN_RADIO) + return + + trigger() + +/obj/effect/abstract/aim_overlay/proc/check_sight(atom/movable/source) + SIGNAL_HANDLER + + if(!can_see(user, target, 7)) + cancel() + else + spawn(0) + user.face_atom(target) + +/obj/effect/abstract/aim_overlay/proc/trigger() + set waitfor = FALSE + if(!locked) + return + + tool.try_fire_gun(target, user) + qdel(src) + +/obj/effect/abstract/aim_overlay/proc/cancel() + user.visible_message(span_notice("[user] lowers [user.p_their()] [tool.name].")) + qdel(src) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 74633c03b1c6..293a02e4fea6 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -10,6 +10,7 @@ w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron = 500) override_notes = TRUE + ///What sound should play when this ammo is fired var/fire_sound = null ///Which kind of guns it can be loaded into @@ -33,6 +34,8 @@ var/heavy_metal = TRUE ///pacifism check for boolet, set to FALSE if bullet is non-lethal var/harmful = TRUE + /// Forensics! + var/leaves_residue = TRUE /obj/item/ammo_casing/spent name = "spent bullet casing" diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 7b77347998e0..f42072bd2677 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -8,11 +8,13 @@ spread = round((rand() - 0.5) * distro) else //Smart spread spread = round(1 - 0.5) * distro + if(!throw_proj(target, targloc, user, params, spread, fired_from)) return FALSE else if(isnull(loaded_projectile)) 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) @@ -28,7 +30,10 @@ if(!firer.newtonian_move(get_dir(target, fired_from), instant = TRUE)) var/throwtarget = get_step(fired_from, get_dir(target, fired_from)) firer.safe_throw_at(throwtarget, 1, 2) + update_appearance() + if(leaves_residue) + leave_residue(user, get_dist(user, target) <= 1 ? target : null, fired_from) return TRUE /obj/item/ammo_casing/proc/tk_firing(mob/living/user, atom/fired_from) @@ -42,9 +47,9 @@ loaded_projectile.fired_from = fired_from loaded_projectile.hit_prone_targets = user.combat_mode if (zone_override) - loaded_projectile.def_zone = zone_override + loaded_projectile.aimed_def_zone = zone_override else - loaded_projectile.def_zone = user.zone_selected + loaded_projectile.aimed_def_zone = user.zone_selected loaded_projectile.suppressed = quiet if(isgun(fired_from)) @@ -85,3 +90,19 @@ 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) + +/// Leave forensic evidence on everything +/obj/item/ammo_casing/proc/leave_residue(mob/living/carbon/user, mob/living/target, obj/item/gun/fired_from) + var/residue = caliber + if(!residue) + return + + add_gunshot_residue(residue) + target?.add_gunshot_residue(residue) + fired_from?.add_gunshot_residue(residue) + + if(istype(user)) + user.add_gunshot_residue(residue) + + if(prob(30)) + drop_location().add_gunshot_residue(residue) diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm index f508a7fb4a64..151ae0e34f52 100644 --- a/code/modules/projectiles/ammunition/ballistic/pistol.dm +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -48,7 +48,7 @@ // .50AE (Desert Eagle) /obj/item/ammo_casing/a50ae - name = ".50AE bullet casing" - desc = "A .50AE bullet casing." - caliber = CALIBER_50 + name = ".50 AE bullet casing" + desc = "A .50 AE bullet casing." + caliber = CALIBER_50_PISTOL projectile_type = /obj/projectile/bullet/a50ae diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 8784bdeece3c..426a815293bf 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -1,4 +1,4 @@ -// .357 (Syndie Revolver) +// .357 (Revolver) /obj/item/ammo_casing/a357 name = ".357 bullet casing" diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 34e9bbe0c9fa..e971b78725b5 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -5,7 +5,7 @@ desc = "A 12 gauge lead slug." icon_state = "blshell" worn_icon_state = "shell" - caliber = CALIBER_SHOTGUN + caliber = CALIBER_12GAUGE custom_materials = list(/datum/material/iron=4000) projectile_type = /obj/projectile/bullet/shotgun_slug @@ -149,5 +149,5 @@ reagents.add_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 6) reagents.add_reagent(/datum/reagent/toxin/spore, 6) reagents.add_reagent(/datum/reagent/toxin/mutetoxin, 6) //;HELP OPS IN MAINT - reagents.add_reagent(/datum/reagent/toxin/coniine, 6) + reagents.add_reagent(/datum/reagent/toxin/lexorin, 6) reagents.add_reagent(/datum/reagent/toxin/sodium_thiopental, 6) diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm index 3749520a522d..e1514419f32f 100644 --- a/code/modules/projectiles/ammunition/ballistic/sniper.dm +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -1,25 +1,25 @@ // .50 (Sniper) /obj/item/ammo_casing/p50 - name = ".50 bullet casing" - desc = "A .50 bullet casing." - caliber = CALIBER_50 + name = ".50 BMG bullet casing" + desc = "A .50 BMG bullet casing." + caliber = CALIBER_50_RIFLE projectile_type = /obj/projectile/bullet/p50 icon_state = ".50" /obj/item/ammo_casing/p50/soporific - name = ".50 soporific bullet casing" - desc = "A .50 bullet casing, specialised in sending the target to sleep, instead of hell." + name = ".50 BMG soporific bullet casing" + desc = "A .50 BMG bullet casing, specialised in sending the target to sleep, instead of hell." projectile_type = /obj/projectile/bullet/p50/soporific icon_state = "sleeper" harmful = FALSE /obj/item/ammo_casing/p50/penetrator - name = ".50 penetrator round bullet casing" - desc = "A .50 caliber penetrator round casing." + name = ".50 BMG penetrator round bullet casing" + desc = "A .50 BMG caliber penetrator round casing." projectile_type = /obj/projectile/bullet/p50/penetrator /obj/item/ammo_casing/p50/marksman - name = ".50 marksman round bullet casing" - desc = "A .50 caliber marksman round casing." + name = ".50 BMG marksman round bullet casing" + desc = "A .50 BMG caliber marksman round casing." projectile_type = /obj/projectile/bullet/p50/marksman diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm index 32e19e49c9a4..f0300071c425 100644 --- a/code/modules/projectiles/ammunition/caseless/foam.dm +++ b/code/modules/projectiles/ammunition/caseless/foam.dm @@ -56,11 +56,3 @@ user.put_in_hands(FD.pen) to_chat(user, span_notice("You remove [FD.pen] from [src].")) FD.pen = null - -/obj/item/ammo_casing/caseless/foam_dart/riot - name = "riot foam dart" - desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up." - projectile_type = /obj/projectile/bullet/reusable/foam_dart/riot - icon_state = "foamdart_riot" - base_icon_state = "foamdart_riot" - custom_materials = list(/datum/material/iron = 1125) diff --git a/code/modules/projectiles/ammunition/caseless/safari_dart.dm b/code/modules/projectiles/ammunition/caseless/safari_dart.dm index 6ae45094b153..1784683c4b76 100644 --- a/code/modules/projectiles/ammunition/caseless/safari_dart.dm +++ b/code/modules/projectiles/ammunition/caseless/safari_dart.dm @@ -8,5 +8,5 @@ firing_effect_type = null caliber = CALIBER_308_DART -/obj/item/ammo_casing/caseless/safari_dart/mutadone - projectile_type = /obj/projectile/bullet/dart/mutadone +/obj/item/ammo_casing/caseless/safari_dart/ryetalyn + projectile_type = /obj/projectile/bullet/dart/ryetalyn diff --git a/code/modules/projectiles/ammunition/energy/_energy.dm b/code/modules/projectiles/ammunition/energy/_energy.dm index 7b6b68daea92..c7ff49f89afb 100644 --- a/code/modules/projectiles/ammunition/energy/_energy.dm +++ b/code/modules/projectiles/ammunition/energy/_energy.dm @@ -9,3 +9,4 @@ fire_sound = 'sound/weapons/laser.ogg' firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/energy heavy_metal = FALSE + leaves_residue = FALSE diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index 11ce484f0c12..3651b51d223a 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -18,8 +18,8 @@ /obj/item/ammo_casing/energy/disabler projectile_type = /obj/projectile/beam/disabler select_name = "disable" - e_cost = 50 - fire_sound = 'sound/weapons/taser2.ogg' + e_cost = 100 + fire_sound = 'goon/sounds/weapons/Taser.ogg' harmful = FALSE /obj/item/ammo_casing/energy/disabler/hos diff --git a/code/modules/projectiles/ammunition/special/magic.dm b/code/modules/projectiles/ammunition/special/magic.dm index d690bddbf2cf..a9b5e3886791 100644 --- a/code/modules/projectiles/ammunition/special/magic.dm +++ b/code/modules/projectiles/ammunition/special/magic.dm @@ -5,6 +5,7 @@ projectile_type = /obj/projectile/magic firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect/magic heavy_metal = FALSE + leaves_residue = FALSE /obj/item/ammo_casing/magic/change projectile_type = /obj/projectile/magic/change diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 61d5c371923e..0151e185b48e 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -12,25 +12,29 @@ custom_materials = list(/datum/material/iron = 30000) throwforce = 2 w_class = WEIGHT_CLASS_TINY - throw_speed = 3 throw_range = 7 override_notes = TRUE + + ///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines + var/caliber + ///list containing the actual ammo within the magazine var/list/stored_ammo = list() ///type that the magazine will be searching for, rejects if not a subtype of var/ammo_type = /obj/item/ammo_casing ///maximum amount of ammo in the magazine var/max_ammo = 7 + ///Controls how sprites are updated for the ammo box; see defines in combat.dm: AMMO_BOX_ONE_SPRITE; AMMO_BOX_PER_BULLET; AMMO_BOX_FULL_EMPTY var/multiple_sprites = AMMO_BOX_ONE_SPRITE ///For sprite updating, do we use initial(icon_state) or base_icon_state? var/multiple_sprite_use_base = FALSE - ///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines - var/caliber - ///Allows multiple bullets to be loaded in from one click of another box/magazine - var/multiload = TRUE + + ///Delay for loading bullets in. + var/load_delay = 0.5 SECONDS ///Whether the magazine should start with nothing in it var/start_empty = FALSE + ///cost of all the bullets in the magazine/box var/list/bullet_cost ///cost of the materials in the magazine/box itself @@ -41,6 +45,7 @@ if(!bullet_cost) base_cost = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.1) bullet_cost = SSmaterials.FindOrCreateMaterialCombo(custom_materials, 0.9 / max_ammo) + if(!start_empty) top_off(starting=TRUE) @@ -60,7 +65,7 @@ stack_trace("Tried loading unsupported ammocasing type [load_type] into ammo box [type].") return - for(var/i in max(1, stored_ammo.len) to max_ammo) + for(var/i in max(1, stored_ammo.len + 1) to max_ammo) stored_ammo += new round_check(src) update_ammo_count() @@ -102,35 +107,8 @@ /obj/item/ammo_box/proc/can_load(mob/user) return TRUE -/obj/item/ammo_box/attackby(obj/item/A, mob/user, params, silent = FALSE, replace_spent = 0) - var/num_loaded = 0 - if(!can_load(user)) - return - if(istype(A, /obj/item/ammo_box)) - var/obj/item/ammo_box/AM = A - for(var/obj/item/ammo_casing/AC in AM.stored_ammo) - var/did_load = give_round(AC, replace_spent) - if(did_load) - AM.stored_ammo -= AC - num_loaded++ - if(!did_load || !multiload) - break - if(num_loaded) - AM.update_ammo_count() - if(isammocasing(A)) - var/obj/item/ammo_casing/AC = A - if(give_round(AC, replace_spent)) - user.transferItemToLoc(AC, src, TRUE) - num_loaded++ - AC.update_appearance() - - if(num_loaded) - if(!silent) - to_chat(user, span_notice("You load [num_loaded] shell\s into \the [src]!")) - playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) - update_ammo_count() - - return num_loaded +/obj/item/ammo_box/attackby(obj/item/A, mob/user, params) + return attempt_load_round(A, user) /obj/item/ammo_box/attack_self(mob/user) var/obj/item/ammo_casing/A = get_round() @@ -144,15 +122,52 @@ to_chat(user, span_notice("You remove a round from [src]!")) update_ammo_count() +/// Attempts to load a given item into this ammo box +/obj/item/ammo_box/proc/attempt_load_round(obj/item/I, mob/user, silent = FALSE, replace_spent = FALSE) + var/num_loaded = 0 + if(!can_load(user)) + return FALSE + + if(istype(I, /obj/item/ammo_box)) + var/obj/item/ammo_box/AM = I + for(var/obj/item/ammo_casing/AC in AM.stored_ammo) + if(user && load_delay && !do_after(user, src, load_delay, IGNORE_USER_LOC_CHANGE, FALSE, interaction_key = "load_round")) + break + + var/did_load = give_round(AC, replace_spent) + if(!did_load) + break + + AM.stored_ammo -= AC + num_loaded++ + if(!silent) + user?.visible_message( + span_notice("[user] loads a round into [src]."), + vision_distance = COMBAT_MESSAGE_RANGE, + ) + playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) + update_ammo_count() + AM.update_ammo_count() + + if(isammocasing(I)) + var/obj/item/ammo_casing/AC = I + if(give_round(AC, replace_spent)) + user.transferItemToLoc(AC, src, TRUE) + num_loaded++ + if(!silent) + playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) + update_ammo_count() + + return num_loaded + /// Updates the materials and appearance of this ammo box /obj/item/ammo_box/proc/update_ammo_count() update_custom_materials() update_appearance() -/obj/item/ammo_box/update_desc(updates) +/obj/item/ammo_box/examine(mob/user) . = ..() - var/shells_left = LAZYLEN(stored_ammo) - desc = "[initial(desc)] There [(shells_left == 1) ? "is" : "are"] [shells_left] shell\s left!" + . += span_notice(get_ammo_desc()) /obj/item/ammo_box/update_icon_state() var/shells_left = LAZYLEN(stored_ammo) @@ -170,8 +185,33 @@ temp_materials[material] = (bullet_cost[material] * stored_ammo.len) + base_cost[material] set_custom_materials(temp_materials) +/// Returns a string that describes the amount of ammo in the magazine. +/obj/item/ammo_box/proc/get_ammo_desc(exact) + if(exact) + return "There are [ammo_count(TRUE)] rounds in [src]." + + var/ammo_count = ammo_count(TRUE) + if(ammo_count == 1) + return "There is one round left." + + var/ammo_percent = ceil(((ammo_count / max_ammo) * 100)) + + switch(ammo_percent) + if(0) + return "It is empty." + if(1 to 20) + return "It rattles when you shake it." + if(21 to 40) + return "It is running low on rounds." + if(41 to 69) + return "It is about half full." + if(70 to 99) + return "It is mostly full." + if(100) + return "It is fully loaded." + ///Count of number of bullets in the magazine -/obj/item/ammo_box/magazine/proc/ammo_count(countempties = TRUE) +/obj/item/ammo_box/proc/ammo_count(countempties = TRUE) var/boolets = 0 for(var/obj/item/ammo_casing/bullet in stored_ammo) if(bullet && (bullet.loaded_projectile || countempties)) diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 8ffa5b51a7a6..6b28f2407bb9 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -97,8 +97,3 @@ ammo_type = /obj/item/ammo_casing/caseless/foam_dart max_ammo = 40 custom_materials = list(/datum/material/iron = 500) - -/obj/item/ammo_box/foambox/riot - icon_state = "foambox_riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - custom_materials = list(/datum/material/iron = 50000) diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm index 91d76ab1d74f..6b5540d4f81a 100644 --- a/code/modules/projectiles/boxes_magazines/external/pistol.dm +++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm @@ -1,5 +1,5 @@ /obj/item/ammo_box/magazine/m10mm - name = "pistol magazine (10mm)" + name = "8-round pistol magazine (10mm Auto)" desc = "A gun magazine." icon_state = "9x19p" ammo_type = /obj/item/ammo_casing/c10mm @@ -8,7 +8,7 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/m45 - name = "handgun magazine (.45)" + name = "8-round pistol magazine (.45 ACP)" icon_state = "45-8" base_icon_state = "45" ammo_type = /obj/item/ammo_casing/c45 @@ -20,7 +20,7 @@ icon_state = "[base_icon_state]-[min(ammo_count(), 8)]" /obj/item/ammo_box/magazine/m9mm - name = "pistol magazine (9mm)" + name = "8-round pistol magazine (9x19mm)" icon_state = "9x19p-8" base_icon_state = "9x19p" ammo_type = /obj/item/ammo_casing/c9mm @@ -32,25 +32,25 @@ icon_state = "[base_icon_state]-[ammo_count() ? "8" : "0"]" /obj/item/ammo_box/magazine/m9mm/fire - name = "pistol magazine (9mm incendiary)" + name = "8-round pistol magazine (9x19mm incendiary)" icon_state = "9x19pI" desc = "A gun magazine. Loaded with rounds which ignite the target." ammo_type = /obj/item/ammo_casing/c9mm/fire /obj/item/ammo_box/magazine/m9mm/hp - name = "pistol magazine (9mm HP)" + name = "8-round pistol magazine (9x19mm HP)" icon_state = "9x19pH" desc= "A gun magazine. Loaded with hollow-point rounds, extremely effective against unarmored targets, but nearly useless against protective clothing." ammo_type = /obj/item/ammo_casing/c9mm/hp /obj/item/ammo_box/magazine/m9mm/ap - name = "pistol magazine (9mm AP)" + name = "8-round pistol magazine (9x19mm AP)" icon_state = "9x19pA" desc= "A gun magazine. Loaded with rounds which penetrate armour, but are less effective against normal targets." ammo_type = /obj/item/ammo_casing/c9mm/ap /obj/item/ammo_box/magazine/m9mm_aps - name = "stechkin pistol magazine (9mm)" + name = "15-round pistol magazine (9x19mm)" icon_state = "9mmaps-15" base_icon_state = "9mmaps" ammo_type = /obj/item/ammo_casing/c9mm @@ -62,24 +62,24 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 5)]" /obj/item/ammo_box/magazine/m9mm_aps/fire - name = "stechkin pistol magazine (9mm incendiary)" + name = "15-round pistol magazine (9x19mm incendiary)" ammo_type = /obj/item/ammo_casing/c9mm/fire max_ammo = 15 /obj/item/ammo_box/magazine/m9mm_aps/hp - name = "stechkin pistol magazine (9mm HP)" + name = "15-round pistol magazine (9x19mm HP)" ammo_type = /obj/item/ammo_casing/c9mm/hp max_ammo = 15 /obj/item/ammo_box/magazine/m9mm_aps/ap - name = "stechkin pistol magazine (9mm AP)" + name = "15-round pistol magazine (9x19mm AP)" ammo_type = /obj/item/ammo_casing/c9mm/ap max_ammo = 15 /obj/item/ammo_box/magazine/m50 - name = "handgun magazine (.50ae)" + name = "7-round pistol magazine (.50 AE)" icon_state = "50ae" ammo_type = /obj/item/ammo_casing/a50ae - caliber = CALIBER_50 + caliber = CALIBER_50_PISTOL max_ammo = 7 multiple_sprites = AMMO_BOX_PER_BULLET diff --git a/code/modules/projectiles/boxes_magazines/external/rifle.dm b/code/modules/projectiles/boxes_magazines/external/rifle.dm index 14c1d1550bd5..a4c033cc1a4e 100644 --- a/code/modules/projectiles/boxes_magazines/external/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/external/rifle.dm @@ -1,5 +1,5 @@ /obj/item/ammo_box/magazine/m10mm/rifle - name = "rifle magazine (10mm)" + name = "10-round magazine (10mm Auto)" desc = "A well-worn magazine fitted for the surplus rifle." icon_state = "75-8" base_icon_state = "75" @@ -11,7 +11,7 @@ icon_state = "[base_icon_state]-[ammo_count() ? "8" : "0"]" /obj/item/ammo_box/magazine/m556 - name = "toploader magazine (5.56mm)" + name = "30-round magazine (5.56x45mm)" icon_state = "5.56m" ammo_type = /obj/item/ammo_casing/a556 caliber = CALIBER_A556 @@ -19,5 +19,5 @@ multiple_sprites = AMMO_BOX_FULL_EMPTY /obj/item/ammo_box/magazine/m556/phasic - name = "toploader magazine (5.56mm Phasic)" + name = "30-round magazine (5.56x45mm phasic)" ammo_type = /obj/item/ammo_casing/a556/phasic diff --git a/code/modules/projectiles/boxes_magazines/external/shotgun.dm b/code/modules/projectiles/boxes_magazines/external/shotgun.dm index f9b7a4fe83a8..100db7d2742f 100644 --- a/code/modules/projectiles/boxes_magazines/external/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/external/shotgun.dm @@ -4,7 +4,7 @@ icon_state = "m12gb" base_icon_state = "m12gb" ammo_type = /obj/item/ammo_casing/shotgun/buckshot - caliber = CALIBER_SHOTGUN + caliber = CALIBER_12GAUGE max_ammo = 8 /obj/item/ammo_box/magazine/m12g/update_icon_state() @@ -12,26 +12,26 @@ icon_state = "[base_icon_state]-[CEILING(ammo_count(FALSE)/8, 1)*8]" /obj/item/ammo_box/magazine/m12g/stun - name = "shotgun magazine (12g taser slugs)" + name = "8-round shotgun magazine (12g taser slugs)" icon_state = "m12gs" ammo_type = /obj/item/ammo_casing/shotgun/stunslug /obj/item/ammo_box/magazine/m12g/slug - name = "shotgun magazine (12g slugs)" + name = "8-round shotgun magazine (12g slugs)" icon_state = "m12gb" //this may need an unique sprite ammo_type = /obj/item/ammo_casing/shotgun /obj/item/ammo_box/magazine/m12g/dragon - name = "shotgun magazine (12g dragon's breath)" + name = "8-round shotgun magazine (12g dragon's breath)" icon_state = "m12gf" ammo_type = /obj/item/ammo_casing/shotgun/dragonsbreath /obj/item/ammo_box/magazine/m12g/bioterror - name = "shotgun magazine (12g bioterror)" + name = "8-round shotgun magazine (12g bioterror)" icon_state = "m12gt" ammo_type = /obj/item/ammo_casing/shotgun/dart/bioterror /obj/item/ammo_box/magazine/m12g/meteor - name = "shotgun magazine (12g meteor slugs)" + name = "8-round shotgun magazine (12g meteor slugs)" icon_state = "m12gbc" ammo_type = /obj/item/ammo_casing/shotgun/meteorslug diff --git a/code/modules/projectiles/boxes_magazines/external/smg.dm b/code/modules/projectiles/boxes_magazines/external/smg.dm index f45494f7c90d..17f1473e1f68 100644 --- a/code/modules/projectiles/boxes_magazines/external/smg.dm +++ b/code/modules/projectiles/boxes_magazines/external/smg.dm @@ -1,5 +1,5 @@ /obj/item/ammo_box/magazine/wt550m9 - name = "wt550 magazine (4.6x30mm)" + name = "20-round magazine (4.6x30mm)" icon_state = "46x30mmt-20" base_icon_state = "46x30mmt" ammo_type = /obj/item/ammo_casing/c46x30mm @@ -11,7 +11,7 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" /obj/item/ammo_box/magazine/wt550m9/wtap - name = "wt550 magazine (Armour Piercing 4.6x30mm)" + name = "20-round magazine (4.6x30mm armor piercing)" icon_state = "46x30mmtA-20" base_icon_state = "46x30mmtA" ammo_type = /obj/item/ammo_casing/c46x30mm/ap @@ -21,7 +21,7 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" /obj/item/ammo_box/magazine/wt550m9/wtic - name = "wt550 magazine (Incendiary 4.6x30mm)" + name = "20-round magazine (4.6x30mm incendiary)" icon_state = "46x30mmtI-20" base_icon_state = "46x30mmtI" ammo_type = /obj/item/ammo_casing/c46x30mm/inc @@ -31,7 +31,7 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" /obj/item/ammo_box/magazine/plastikov9mm - name = "PP-95 magazine (9mm)" + name = "50-round magazine (9x19mm)" icon_state = "9x19-50" base_icon_state = "9x19" ammo_type = /obj/item/ammo_casing/c9mm @@ -43,7 +43,7 @@ icon_state = "[base_icon_state]-[ammo_count() ? 50 : 0]" /obj/item/ammo_box/magazine/uzim9mm - name = "uzi magazine (9mm)" + name = "32-round magazine (9x19mm)" icon_state = "uzi9mm-32" base_icon_state = "uzi9mm" ammo_type = /obj/item/ammo_casing/c9mm @@ -55,7 +55,7 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 4)]" /obj/item/ammo_box/magazine/smgm9mm - name = "SMG magazine (9mm)" + name = "21-round magazine (9x19mm)" icon_state = "smg9mm-42" base_icon_state = "smg9mm" ammo_type = /obj/item/ammo_casing/c9mm @@ -67,15 +67,15 @@ icon_state = "[base_icon_state]-[ammo_count() ? 42 : 0]" /obj/item/ammo_box/magazine/smgm9mm/ap - name = "SMG magazine (Armour Piercing 9mm)" + name = "21-round magazine (9x19mm armor piercing)" ammo_type = /obj/item/ammo_casing/c9mm/ap /obj/item/ammo_box/magazine/smgm9mm/fire - name = "SMG Magazine (Incendiary 9mm)" + name = "21-round magazine (9x19mm incendiary)" ammo_type = /obj/item/ammo_casing/c9mm/fire /obj/item/ammo_box/magazine/smgm45 - name = "SMG magazine (.45)" + name = "24-round magazine (.45 ACP)" icon_state = "c20r45-24" base_icon_state = "c20r45" ammo_type = /obj/item/ammo_casing/c45 @@ -87,15 +87,15 @@ icon_state = "[base_icon_state]-[round(ammo_count(), 2)]" /obj/item/ammo_box/magazine/smgm45/ap - name = "SMG magazine (Armour Piercing .45)" + name = "24-round magazine (.45 ACP armor piercing)" ammo_type = /obj/item/ammo_casing/c45/ap /obj/item/ammo_box/magazine/smgm45/incen - name = "SMG magazine (Incendiary .45)" + name = "24-round magazine (.45 ACP incendiary)" ammo_type = /obj/item/ammo_casing/c45/inc /obj/item/ammo_box/magazine/tommygunm45 - name = "drum magazine (.45)" + name = "50-round drum magazine (.45 ACP)" icon_state = "drum45" ammo_type = /obj/item/ammo_casing/c45 caliber = CALIBER_45 diff --git a/code/modules/projectiles/boxes_magazines/external/sniper.dm b/code/modules/projectiles/boxes_magazines/external/sniper.dm index 0cf429c1e00d..ea5d49fb40ce 100644 --- a/code/modules/projectiles/boxes_magazines/external/sniper.dm +++ b/code/modules/projectiles/boxes_magazines/external/sniper.dm @@ -1,31 +1,31 @@ /obj/item/ammo_box/magazine/sniper_rounds - name = "sniper rounds (.50)" + name = "6-round magazine (.50 BMG)" icon_state = ".50mag" base_icon_state = ".50mag" ammo_type = /obj/item/ammo_casing/p50 max_ammo = 6 - caliber = CALIBER_50 + caliber = CALIBER_50_RIFLE /obj/item/ammo_box/magazine/sniper_rounds/update_icon_state() . = ..() icon_state = "[base_icon_state][ammo_count() ? "-ammo" : ""]" /obj/item/ammo_box/magazine/sniper_rounds/soporific - name = "sniper rounds (Zzzzz)" + name = "3-round magazine (.50 Zzzzz)" desc = "Soporific sniper rounds, designed for happy days and dead quiet nights..." icon_state = "soporific" ammo_type = /obj/item/ammo_casing/p50/soporific max_ammo = 3 - caliber = CALIBER_50 + caliber = CALIBER_50_RIFLE /obj/item/ammo_box/magazine/sniper_rounds/penetrator - name = "sniper rounds (penetrator)" + name = "5-round magazine (.50 BMG penetrator)" desc = "An extremely powerful round capable of passing straight through cover and anyone unfortunate enough to be behind it." ammo_type = /obj/item/ammo_casing/p50/penetrator max_ammo = 5 /obj/item/ammo_box/magazine/sniper_rounds/marksman - name = "sniper rounds (marksman)" + name = "5-round magazine (.50 BMG high velocity)" desc = "An extremely fast sniper round able to pretty much instantly shoot through something." ammo_type = /obj/item/ammo_casing/p50/marksman max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm index f972461de8a5..378e5760a95d 100644 --- a/code/modules/projectiles/boxes_magazines/external/toy.dm +++ b/code/modules/projectiles/boxes_magazines/external/toy.dm @@ -14,18 +14,12 @@ . = ..() icon_state = "[base_icon_state]-[ammo_count() ? 42 : 0]" -/obj/item/ammo_box/magazine/toy/smg/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - /obj/item/ammo_box/magazine/toy/pistol name = "foam force pistol magazine" icon_state = "9x19p" max_ammo = 8 multiple_sprites = AMMO_BOX_FULL_EMPTY -/obj/item/ammo_box/magazine/toy/pistol/riot - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - /obj/item/ammo_box/magazine/toy/smgm45 name = "donksoft SMG magazine" icon_state = "c20r45-toy" @@ -38,10 +32,6 @@ . = ..() icon_state = "[base_icon_state]-[round(ammo_count(), 2)]" -/obj/item/ammo_box/magazine/toy/smgm45/riot - icon_state = "c20r45-riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - /obj/item/ammo_box/magazine/toy/m762 name = "donksoft box magazine" icon_state = "a762-toy" @@ -52,7 +42,3 @@ /obj/item/ammo_box/magazine/toy/m762/update_icon_state() . = ..() icon_state = "[base_icon_state]-[round(ammo_count(), 10)]" - -/obj/item/ammo_box/magazine/toy/m762/riot - icon_state = "a762-riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot diff --git a/code/modules/projectiles/boxes_magazines/external/tranqgun.dm b/code/modules/projectiles/boxes_magazines/external/tranqgun.dm index 2eb27dbfed85..c856112411b0 100644 --- a/code/modules/projectiles/boxes_magazines/external/tranqgun.dm +++ b/code/modules/projectiles/boxes_magazines/external/tranqgun.dm @@ -1,5 +1,5 @@ /obj/item/ammo_box/magazine/tranq_rifle - name = ".308 tranquilizer magazine" + name = "5-round magazine (.308 tranquilizer)" desc = "A magazine of tranquilizer darts." icon_state = ".50mag" base_icon_state = ".50mag" @@ -8,8 +8,8 @@ caliber = CALIBER_308_DART -/obj/item/ammo_box/magazine/tranq_rifle/mutadone - name = ".308 mutadone magazine" - desc = "A magazine of tranquilizer darts filled with mutadone." - ammo_type = /obj/item/ammo_casing/caseless/safari_dart/mutadone +/obj/item/ammo_box/magazine/tranq_rifle/ryetalyn + name = "5-round magazine (.308 ryetalyn)" + desc = "A magazine of tranquilizer darts filled with ryetalyn." + ammo_type = /obj/item/ammo_casing/caseless/safari_dart/ryetalyn max_ammo = 5 diff --git a/code/modules/projectiles/boxes_magazines/internal/revolver.dm b/code/modules/projectiles/boxes_magazines/internal/revolver.dm index 7d881a11c4dc..aa8ebd3bb544 100644 --- a/code/modules/projectiles/boxes_magazines/internal/revolver.dm +++ b/code/modules/projectiles/boxes_magazines/internal/revolver.dm @@ -15,8 +15,8 @@ ammo_type = /obj/item/ammo_casing/a357 caliber = CALIBER_357 max_ammo = 6 - multiload = FALSE + start_empty = TRUE -/obj/item/ammo_box/magazine/internal/rus357/Initialize(mapload) +/obj/item/ammo_box/magazine/internal/cylinder/rus357/Initialize(mapload) stored_ammo += new ammo_type(src) . = ..() diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 03e7621577d3..0fa21d1beadc 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -4,11 +4,10 @@ ammo_type = /obj/item/ammo_casing/a762 caliber = CALIBER_A762 max_ammo = 5 - multiload = TRUE /obj/item/ammo_box/magazine/internal/boltaction/pipegun name = "pipegun internal magazine" - caliber = CALIBER_SHOTGUN + caliber = CALIBER_12GAUGE ammo_type = /obj/item/ammo_casing/shotgun/improvised max_ammo = 1 diff --git a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm index 25823693f381..d1acbbc52e72 100644 --- a/code/modules/projectiles/boxes_magazines/internal/shotgun.dm +++ b/code/modules/projectiles/boxes_magazines/internal/shotgun.dm @@ -1,9 +1,8 @@ /obj/item/ammo_box/magazine/internal/shot name = "shotgun internal magazine" ammo_type = /obj/item/ammo_casing/shotgun/beanbag - caliber = CALIBER_SHOTGUN + caliber = CALIBER_12GAUGE max_ammo = 4 - multiload = FALSE /obj/item/ammo_box/magazine/internal/shot/tube name = "dual feed shotgun internal tube" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a412f864a192..adc2ff104815 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -1,7 +1,21 @@ - -#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 #define FIRING_PIN_REMOVAL_DELAY 50 +/particles/firing_smoke + icon = 'icons/particles/96x96.dmi' + icon_state = "smoke" + width = 500 + height = 500 + count = 5 + spawning = 15 + lifespan = 0.5 SECONDS + fade = 2.4 SECONDS + grow = 0.12 + drift = generator(GEN_CIRCLE, 8, 8) + scale = 0.1 + spin = generator(GEN_NUM, -20, 20) + velocity = list(50, 0) + friction = generator(GEN_NUM, 0.3, 0.6) + /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." @@ -9,80 +23,126 @@ icon_state = "revolver" inhand_icon_state = "gun" worn_icon_state = "gun" + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + flags_1 = CONDUCT_1 + item_flags = NEEDS_PERMIT slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=2000) + w_class = WEIGHT_CLASS_NORMAL throwforce = 5 - throw_speed = 3 throw_range = 5 force = 5 - item_flags = NEEDS_PERMIT + attack_verb_continuous = list("strikes", "hits", "bashes") attack_verb_simple = list("strike", "hit", "bash") var/gun_flags = NONE + + /// The next round to be fired, if any. + var/obj/item/ammo_casing/chambered = null + + /// Required for firing, [/obj/item/firing_pin/proc/pin_auth] is called as part of firing. + var/obj/item/firing_pin/pin = /obj/item/firing_pin + + /// True if a gun dosen't need a pin, mostly used for abstract guns like tentacles and meathooks + var/pinless = FALSE + + /* Sounds */ var/fire_sound = 'sound/weapons/gun/pistol/shot.ogg' - var/vary_fire_sound = TRUE var/fire_sound_volume = 50 + var/vary_fire_sound = TRUE + var/dry_fire_sound = 'sound/weapons/gun/general/dry_fire.ogg' - var/suppressed = null //whether or not a message is displayed when fired - var/can_suppress = FALSE + var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 + + /* Misc flavor */ + /// Should smoke particles be created when fired? + var/smoking_gun = FALSE + + /* Suppression */ + /// whether or not a message is displayed when fired + var/obj/item/suppressed = null + var/can_suppress = FALSE var/can_unsuppress = TRUE - var/recoil = 0 //boom boom shake the room - var/clumsy_check = TRUE - var/obj/item/ammo_casing/chambered = null - trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers - var/sawn_desc = null //description change if weapon is sawn-off - var/sawn_off = FALSE - var/burst_size = 1 //how large a burst is - var/fire_delay = 0 //rate of fire for burst firing and semi auto - var/firing_burst = 0 //Prevent the weapon from firing again while already firing - var/semicd = 0 //cooldown handler - var/weapon_weight = WEAPON_LIGHT - var/dual_wield_spread = 24 //additional spread when dual wielding - ///Can we hold up our target with this? Default to yes - var/can_hold_up = TRUE + + /* BALANCE RELATED THINGS */ + + /// Screenshake applied to the firer + var/recoil = 0 // boom boom shake the room + /// How much recoil there is when fired with one hand + var/unwielded_recoil = 0 + /// How many shots to fire per fire sequence + var/burst_size = 1 + /// The cooldown (DS) before the gun can be fired again after firing + var/fire_delay = 0 + + /// Boolean var used to control the speed a gun can be fired. See the "fire_delay" var. + VAR_PRIVATE/fire_lockout = FALSE + /// Boolean var used to prevent the weapon from firing again while already firing + VAR_PRIVATE/firing_burst = FALSE //Prevent the weapon from firing again while already firing + + /// For every turf a fired projectile travels, increase the target bodyzone inaccuracy by this much. + var/accuracy_falloff = 3 /// Just 'slightly' snowflakey way to modify projectile damage for projectiles fired from this gun. var/projectile_damage_multiplier = 1 - var/spread = 0 //Spread induced by the gun itself. + trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers + + /* Projectile spread */ + + /// Default spread + var/spread = 0 + /// Additional spread when fired while unwielded + var/unwielded_spread_bonus = 5 + /// Additional spread when dual wielding + var/dual_wield_spread = 24 + + /// If set to FALSE, uses a "smart spread" that changes the spread based on the amount of shots in a burst. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + /// How many tiles do we knock the poor bastard we just point-blanked back? + var/pb_knockback = 0 - var/obj/item/firing_pin/pin = /obj/item/firing_pin //standard firing pin for most guns - /// True if a gun dosen't need a pin, mostly used for abstract guns like tentacles and meathooks - var/pinless = FALSE + /// Can this weapon be misfired? + var/clumsy_check = TRUE + + /* RANDOM BULLSHIT */ + + //Description to use if sawn off + var/sawn_desc = null + /// Is the weapon currently sawn off? + var/sawn_off = FALSE - var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. + ///if a bayonet can be added, or removed, if it already has one. + var/can_bayonet = FALSE var/obj/item/knife/bayonet var/knife_x_offset = 0 var/knife_y_offset = 0 - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite + //used for positioning ammo count overlay on sprite + var/ammo_x_offset = 0 var/ammo_y_offset = 0 - var/pb_knockback = 0 - /obj/item/gun/Initialize(mapload) . = ..() if(pin) - pin = new pin(src) + pin = new pin(src, src) add_seclight_point() /obj/item/gun/Destroy() - if(isobj(pin)) //Can still be the initial path, then we skip + if(!ispath(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(bayonet) - QDEL_NULL(bayonet) - if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) - QDEL_NULL(chambered) + + QDEL_NULL(bayonet) + QDEL_NULL(chambered) + if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK QDEL_NULL(suppressed) return ..() @@ -96,11 +156,13 @@ /obj/item/gun/handle_atom_del(atom/A) if(A == pin) pin = null + if(A == chambered) chambered = null - update_appearance() + if(A == bayonet) clear_bayonet() + if(A == suppressed) clear_suppressor() return ..() @@ -109,8 +171,10 @@ /obj/item/gun/proc/clear_suppressor() if(!can_unsuppress) return + suppressed = null update_appearance() + verbs -= /obj/item/gun/proc/user_remove_suppressor /obj/item/gun/examine(mob/user) . = ..() @@ -125,66 +189,26 @@ . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. . += span_info("[bayonet] looks like it can be unscrewed from [src].") + if(can_bayonet) . += "It has a bayonet lug on it." -//called after the gun has successfully fired its chambered ammo. -/obj/item/gun/proc/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) - handle_chamber(empty_chamber, from_firing, chamber_next_round) - SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED) - -/obj/item/gun/proc/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) - return - -//check if there's enough ammo/energy/whatever to shoot one time -//i.e if clicking would make it shoot -/obj/item/gun/proc/can_shoot() +/// check if there's enough ammo/energy/whatever to shoot one time +/// i.e if clicking would make it shoot +/obj/item/gun/proc/can_fire() return TRUE +/// Check if the user is firing this gun with telekinesis. /obj/item/gun/proc/tk_firing(mob/living/user) return !user.contains(src) -/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) - visible_message(span_warning("*click*"), vision_distance = COMBAT_MESSAGE_RANGE) - playsound(src, dry_fire_sound, 30, TRUE) - -/obj/item/gun/proc/fire_sounds() +/// Play the bang bang sound +/obj/item/gun/proc/play_fire_sound() if(suppressed) playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) else playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) -/obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) - if(recoil && !tk_firing(user)) - shake_camera(user, recoil + 1, recoil) - fire_sounds() - if(!suppressed) - if(message) - if(tk_firing(user)) - visible_message( - span_danger("[src] fires itself[pointblank ? " point blank at [pbtarget]!" : "!"]"), - blind_message = span_hear("You hear a gunshot!"), - vision_distance = COMBAT_MESSAGE_RANGE - ) - else if(pointblank) - user.visible_message( - span_danger("[user] fires [src] point blank at [pbtarget]!"), - span_danger("You fire [src] point blank at [pbtarget]!"), - span_hear("You hear a gunshot!"), COMBAT_MESSAGE_RANGE, pbtarget - ) - to_chat(pbtarget, span_userdanger("[user] fires [src] point blank at you!")) - if(pb_knockback > 0 && ismob(pbtarget)) - var/mob/PBT = pbtarget - var/atom/throw_target = get_edge_target_turf(PBT, user.dir) - PBT.throw_at(throw_target, pb_knockback, 2) - else if(!tk_firing(user)) - user.visible_message( - span_danger("[user] fires [src]!"), - blind_message = span_hear("You hear a gunshot!"), - vision_distance = COMBAT_MESSAGE_RANGE, - ignored_mobs = user - ) - /obj/item/gun/emp_act(severity) . = ..() if(!(. & EMP_PROTECT_CONTENTS)) @@ -192,100 +216,44 @@ O.emp_act(severity) /obj/item/gun/afterattack_secondary(mob/living/victim, mob/living/user, params) - if(!isliving(victim) || !IN_GIVEN_RANGE(user, victim, GUNPOINT_SHOOTER_STRAY_RANGE)) - return ..() //if they're out of range, just shootem. - if(!can_hold_up) - return ..() - var/datum/component/gunpoint/gunpoint_component = user.GetComponent(/datum/component/gunpoint) - if (gunpoint_component) - if(gunpoint_component.target == victim) - return ..() //we're already holding them up, shoot that mans instead of complaining - to_chat(user, span_warning("You are already holding someone up!")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if (user == victim) - to_chat(user,span_warning("You can't hold yourself up!")) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - user.AddComponent(/datum/component/gunpoint, victim, src) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) - ..() - return fire_gun(target, user, flag, params) - -/obj/item/gun/proc/fire_gun(atom/target, mob/living/user, flag, params) - if(QDELETED(target)) - return - if(firing_burst) + . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!isliving(victim)) return - if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, flag, params) & COMPONENT_CANCEL_GUN_FIRE) - return - if(flag) //It's adjacent, is the user, or is on the user's person - if(target in user.contents) //can't shoot stuff inside us. - return - if(!ismob(target) || user.combat_mode) //melee attack - return - if(target == user && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) //so we can't shoot ourselves (unless mouth selected) - return - if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can. - var/mob/living/L = user - if(!can_trigger_gun(L)) + if(user.gunpoint) + if(user.gunpoint.target == victim) return - - if(flag) - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) - handle_suicide(user, target, params) - return - - if(!can_shoot()) //Just because you can pull the trigger doesn't mean it can shoot. - shoot_with_empty_chamber(user) + user.gunpoint.register_to_target(victim) return - if(check_botched(user, target)) + if (user == victim) + to_chat(user,span_warning("You can't hold yourself up!")) return - 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 && (user.get_inactive_held_item() || !other_hand)) - to_chat(user, span_warning("You need two hands to fire [src]!")) - return - //DUAL (or more!) WIELDING - var/bonus_spread = 0 - var/loop_counter = 0 - if(ishuman(user) && user.combat_mode) - var/mob/living/carbon/human/H = user - for(var/obj/item/gun/gun in H.held_items) - if(gun == src || gun.weapon_weight >= WEAPON_MEDIUM) - continue - else if(gun.can_trigger_gun(user, akimbo_usage = TRUE)) - bonus_spread += dual_wield_spread - loop_counter++ - addtimer(CALLBACK(gun, TYPE_PROC_REF(/obj/item/gun, process_fire), target, user, TRUE, params, null, bonus_spread), loop_counter) - - return process_fire(target, user, TRUE, params, null, bonus_spread) - -/obj/item/gun/proc/check_botched(mob/living/user, atom/target) - if(clumsy_check) - if(istype(user)) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) - var/target_zone = user.get_random_valid_zone(blacklisted_parts = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), even_weights = TRUE, bypass_warning = TRUE) - if(!target_zone) - return - to_chat(user, span_userdanger("You shoot yourself in the foot with [src]!")) - process_fire(user, user, FALSE, null, target_zone) - SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT) - if(!tk_firing(user) && !HAS_TRAIT(src, TRAIT_NODROP)) - user.dropItemToGround(src, TRUE) - return TRUE + user.gunpoint = new(null, user, victim, src) + return + +/obj/item/gun/afterattack(atom/target, mob/living/user, flag, params) + ..() + if(user.use_gunpoint) + afterattack_secondary(target, user, params) + return TRUE //Cancel the shot! + + return try_fire_gun(target, user, flag, params) /obj/item/gun/can_trigger_gun(mob/living/user, akimbo_usage) . = ..() if(!handle_pins(user)) return FALSE + if(HAS_TRAIT(user, TRAIT_PACIFISM) && chambered?.harmful) + to_chat(user, span_warning("[src] is lethally chambered! You don't want to risk harming anyone...")) + return FALSE + /obj/item/gun/proc/handle_pins(mob/living/user) if(pinless) return TRUE + if(pin) if(pin.pin_auth(user) || (pin.obj_flags & EMAGGED)) return TRUE @@ -299,108 +267,6 @@ /obj/item/gun/proc/recharge_newshot() return -/obj/item/gun/proc/process_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!user || !firing_burst) - firing_burst = FALSE - return FALSE - if(!issilicon(user)) - if(iteration > 1 && !(user.is_holding(src))) //for burst firing - firing_burst = FALSE - return FALSE - if(chambered?.loaded_projectile) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - to_chat(user, span_warning("[src] is lethally chambered! You don't want to risk harming anyone...")) - return - if(randomspread) - sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) - 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)) - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - if (iteration >= burst_size) - firing_burst = FALSE - else - shoot_with_empty_chamber(user) - firing_burst = FALSE - return FALSE - process_chamber() - update_appearance() - return TRUE - -/obj/item/gun/proc/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(user) - SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src, target, params, zone_override) - - SEND_SIGNAL(src, COMSIG_GUN_FIRED, user, target, params, zone_override) - - add_fingerprint(user) - - if(semicd) - return - - //Vary by at least this much - var/base_bonus_spread = 0 - var/sprd = 0 - var/randomized_gun_spread = 0 - var/rand_spr = rand() - if(user && HAS_TRAIT(user, TRAIT_POOR_AIM)) //Nice job hotshot - bonus_spread += 35 - base_bonus_spread += 10 - - if(spread) - randomized_gun_spread = rand(0,spread) - var/randomized_bonus_spread = rand(base_bonus_spread, bonus_spread) - - var/modified_delay = fire_delay - if(user && HAS_TRAIT(user, TRAIT_DOUBLE_TAP)) - modified_delay = ROUND_UP(fire_delay * 0.5) - - if(burst_size > 1) - firing_burst = TRUE - for(var/i = 1 to burst_size) - addtimer(CALLBACK(src, PROC_REF(process_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), modified_delay * (i - 1)) - else - if(chambered) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) // If the user has the pacifist trait, then they won't be able to fire [src] if the round chambered inside of [src] is lethal. - if(chambered.harmful) // Is the bullet chambered harmful? - to_chat(user, span_warning("[src] is lethally chambered! You don't want to risk harming anyone...")) - return - sprd = round((rand(0, 1) - 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)) - shoot_with_empty_chamber(user) - return - else - if(get_dist(user, target) <= 1) //Making sure whether the target is in vicinity for the pointblank shot - shoot_live_shot(user, 1, target, message) - else - shoot_live_shot(user, 0, target, message) - else - shoot_with_empty_chamber(user) - return - process_chamber() - update_appearance() - semicd = TRUE - addtimer(CALLBACK(src, PROC_REF(reset_semicd)), modified_delay) - - if(user) - user.update_held_items() - SSblackbox.record_feedback("tally", "gun_fired", 1, type) - - return TRUE - -/obj/item/gun/proc/reset_semicd() - semicd = FALSE - /obj/item/gun/attack(mob/M, mob/living/user) if(user.combat_mode) //Flogging if(bayonet) @@ -410,7 +276,7 @@ return ..() return -/obj/item/gun/attack_atom(obj/O, mob/living/user, params) +/obj/item/gun/attack_obj(obj/O, mob/living/user, params) if(user.combat_mode) if(bayonet) O.attackby(bayonet, user) @@ -438,7 +304,7 @@ . = ..() if(.) return - if(!user.canUseTopic(src, no_tk = NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed @@ -447,11 +313,17 @@ else if(pin && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [I]."), span_notice("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(span_notice("[pin] is pried out of [src] by [user], destroying the pin in the process."), - span_warning("You pry [pin] out with [I], destroying the pin in the process."), null, 3) + + user.visible_message( + span_notice("[pin] is pried out of [src] by [user], destroying the pin in the process."), + span_warning("You pry [pin] out with [I], destroying the pin in the process."), + null, + 3 + ) QDEL_NULL(pin) return TRUE @@ -459,16 +331,23 @@ . = ..() if(.) return - if(!user.canUseTopic(src, no_tk = NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return + if(pin && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [I]."), span_notice("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(span_notice("[pin] is spliced out of [src] by [user], melting part of the pin in the process."), - span_warning("You splice [pin] out of [src] with [I], melting part of the pin in the process."), null, 3) + + user.visible_message( + span_notice("[pin] is spliced out of [src] by [user], melting part of the pin in the process."), + span_warning("You splice [pin] out of [src] with [I], melting part of the pin in the process."), + null, + 3 + ) QDEL_NULL(pin) return TRUE @@ -476,19 +355,46 @@ . = ..() if(.) return - if(!user.canUseTopic(src, no_tk = NO_TK)) + if(!user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return + if(pin && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [I]."), span_notice("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(span_notice("[pin] is ripped out of [src] by [user], mangling the pin in the process."), - span_warning("You rip [pin] out of [src] with [I], mangling the pin in the process."), null, 3) + + user.visible_message( + span_notice("[pin] is ripped out of [src] by [user], mangling the pin in the process."), + span_warning("You rip [pin] out of [src] with [I], mangling the pin in the process."), + null, + 3 + ) QDEL_NULL(pin) return TRUE +/obj/item/gun/on_disarm_attempt(mob/living/user, mob/living/attacker) + var/list/turfs = list() + for(var/turf/T in view()) + turfs += T + + if(!length(turfs)) + return FALSE + + var/turf/shoot_to = pick(turfs) + if(do_fire_gun(shoot_to, user, message = FALSE, bonus_spread = 10)) + user.visible_message( + span_danger("\The [src] goes off during the struggle!"), + blind_message = span_hear("You hear a gunshot!") + ) + log_combat(attacker, user, "caused a misfire with a disarm") + return TRUE + + log_combat(attacker, user, "caused a misfire with a disarm, but the gun didn't go off") + return FALSE + /obj/item/gun/proc/remove_bayonet(mob/living/user, obj/item/tool_item) tool_item?.play_tool_sound(src) to_chat(user, span_notice("You unfix [bayonet] from [src].")) @@ -508,22 +414,23 @@ /obj/item/gun/update_overlays() . = ..() - if(bayonet) - var/mutable_appearance/knife_overlay - var/state = "bayonet" //Generic state. - if(bayonet.icon_state in icon_states('icons/obj/guns/bayonets.dmi')) //Snowflake state? - state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/guns/bayonets.dmi' - knife_overlay = mutable_appearance(bayonet_icons, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - . += knife_overlay + if(!bayonet) + return + + var/state = "bayonet" //Generic state. + if(icon_exists('icons/obj/guns/bayonets.dmi', bayonet.icon_state)) + state = bayonet.icon_state + + var/mutable_appearance/knife_overlay = mutable_appearance('icons/obj/guns/bayonets.dmi', state) + knife_overlay.pixel_x = knife_x_offset + knife_overlay.pixel_y = knife_y_offset + . += knife_overlay /obj/item/gun/proc/handle_suicide(mob/living/carbon/human/user, mob/living/carbon/human/target, params, bypass_timer) if(!ishuman(user) || !ishuman(target)) return - if(semicd) + if(fire_lockout) return if(user == target) @@ -533,36 +440,47 @@ target.visible_message(span_warning("[user] points [src] at [target]'s head, ready to pull the trigger..."), \ span_userdanger("[user] points [src] at your head, ready to pull the trigger...")) - semicd = TRUE + fire_lockout = TRUE - if(!bypass_timer && (!do_after(user, 120, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + if(!bypass_timer && (!do_after(user, target, 12 SECONDS) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) if(user == target) user.visible_message(span_notice("[user] decided not to shoot.")) else if(target?.Adjacent(user)) target.visible_message(span_notice("[user] has decided to spare [target]"), span_notice("[user] has decided to spare your life!")) - semicd = FALSE + fire_lockout = FALSE return - semicd = FALSE + fire_lockout = FALSE target.visible_message(span_warning("[user] pulls the trigger!"), span_userdanger("[(user == target) ? "You pull" : "[user] pulls"] the trigger!")) if(chambered?.loaded_projectile) chambered.loaded_projectile.damage *= 5 - var/fired = process_fire(target, user, TRUE, params, BODY_ZONE_HEAD) + var/fired = do_fire_gun(target, user, TRUE, params, BODY_ZONE_HEAD) if(!fired && chambered?.loaded_projectile) chambered.loaded_projectile.damage /= 5 -/obj/item/gun/proc/unlock() //used in summon guns and as a convience for admins +/obj/item/gun/proc/unlock() if(pin) qdel(pin) - pin = new /obj/item/firing_pin + pin = new /obj/item/firing_pin(src, src) -//Happens before the actual projectile creation -/obj/item/gun/proc/before_firing(atom/target,mob/user) - return +/obj/item/gun/proc/user_remove_suppressor() + set name = "Remove Suppressor" + set category = "Object" + set src in oview(1) + + if(!isliving(usr)) + return + + if(!usr.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS)) + return + + to_chat(usr, span_notice("You unscrew [suppressed] from [src].")) + if(!usr.put_in_hands(suppressed)) + suppressed.forceMove(drop_location()) + clear_suppressor() #undef FIRING_PIN_REMOVAL_DELAY -#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/gun_firing_procs.dm b/code/modules/projectiles/gun_firing_procs.dm new file mode 100644 index 000000000000..a9b80b71a068 --- /dev/null +++ b/code/modules/projectiles/gun_firing_procs.dm @@ -0,0 +1,355 @@ +#define DUALWIELD_PENALTY_EXTRA_MULTIPLIER 1.4 + +/** + * The defacto proc for "mob is trying to shoot the gun". Checks if they are able to, and a few other things. + * + * Arguments: + * * target - The thing being shot at. + * * user - The mob firing the gun. + * * proximity - TRUE if user.Adjacent(target) + * * params - Click parameters. + */ +/obj/item/gun/proc/try_fire_gun(atom/target, mob/living/user, proximity, params) + if(QDELETED(target) || !target.x) + return + + // We're shooting, don't queue up another burst. + if(firing_burst) + return + + if(SEND_SIGNAL(src, COMSIG_GUN_TRY_FIRE, user, target, proximity, params) & COMPONENT_CANCEL_GUN_FIRE) + return + + if(istype(user))//Check if the user can use the gun, if the user isn't alive(turrets) assume it can. + var/mob/living/L = user + if(!can_trigger_gun(L)) + try_fire_akimbo(arglist(args)) + return + + if(proximity) //It's adjacent, is the user, or is on the user's person + if(!ismob(target) || user.combat_mode) //melee attack + return + + if(target == user) + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH) + handle_suicide(user, target, params) + return + + if(target in user.get_all_contents()) //can't shoot stuff inside us. + return + + // * AT THIS POINT, WE ARE ABLE TO PULL THE TRIGGER * // + if(!can_fire()) //Just because you can pull the trigger doesn't mean it can shoot. + shoot_with_empty_chamber(user) + try_fire_akimbo(arglist(args)) + return + + if(check_botched(user, target)) + try_fire_akimbo(arglist(args)) + return + + var/bonus_spread = 0 + if(istype(user)) + for(var/obj/item/gun/gun in user.held_items) + if(gun == src || (gun.gun_flags & NO_AKIMBO)) + continue + + if(gun.can_trigger_gun(user, akimbo_usage = TRUE)) + bonus_spread += dual_wield_spread + + . = do_fire_gun(target, user, TRUE, params, null, bonus_spread) + + try_fire_akimbo(arglist(args)) + +/// Called by try_fire_gun() to attempt to fire offhand guns. +/obj/item/gun/proc/try_fire_akimbo(atom/target, mob/living/user, proximity, params) + PRIVATE_PROC(TRUE) + if(!ishuman(user) || !user.combat_mode) + return + + var/bonus_spread = 0 + var/loop_counter = 0 + + var/mob/living/carbon/human/H = user + for(var/obj/item/gun/gun in H.held_items) + if(gun == src || (gun.gun_flags & NO_AKIMBO)) + continue + + if(gun.can_trigger_gun(user, akimbo_usage = TRUE)) + bonus_spread += dual_wield_spread + loop_counter++ + addtimer(CALLBACK(gun, TYPE_PROC_REF(/obj/item/gun, do_fire_gun), target, user, TRUE, params, null, bonus_spread), loop_counter) +/** + * Called before the weapon is fired, before the projectile is created. + * + * Arguments: + * * target - The thing being shot at. + * * user - The mob firing the gun. + */ +/obj/item/gun/proc/before_firing(atom/target, mob/user) + return + +/** + * Called after the weapon has successfully fired it's chambered round, and before update_chamber() + * + * Arguments: + * * user - The mob firing the gun. + * * pointblank - Is this a pointblank shot? + * * pbtarget - If this is a pointblank shot, what is the target? + * * message - If TRUE, will give chat feedback. + */ +/obj/item/gun/proc/after_firing(mob/living/user, pointblank = FALSE, atom/pbtarget = null, message = 1) + // Shake the user's camera if it wasn't telekinesis + if(recoil && !tk_firing(user)) + var/real_recoil = recoil + if(!wielded) + real_recoil = unwielded_recoil + + shake_camera(user, real_recoil + 1, real_recoil) + + //BANG BANG BANG + play_fire_sound() + + if(suppressed) + message = FALSE + + if(tk_firing(user)) + if(message) + visible_message( + span_danger("[src] fires itself[pointblank ? " point blank at [pbtarget]!" : "!"]"), + blind_message = span_hear("You hear a gunshot!"), + vision_distance = COMBAT_MESSAGE_RANGE + ) + + else if(pointblank) + if(message) + user.visible_message( + span_danger("[user] fires [src] point blank at [pbtarget]!"), + span_danger("You fire [src] point blank at [pbtarget]!"), + span_hear("You hear a gunshot!"), + COMBAT_MESSAGE_RANGE, + pbtarget + ) + to_chat(pbtarget, span_userdanger("[user] fires [src] point blank at you!")) + + /// Apply pointblank knockback to the target + if(pb_knockback > 0 && ismob(pbtarget)) + var/mob/PBT = pbtarget + var/atom/throw_target = get_edge_target_turf(PBT, user.dir) + PBT.throw_at(throw_target, pb_knockback, 2) + + else if(!tk_firing(user)) + if(message) + user.visible_message( + span_danger("[user] fires [src]!"), + blind_message = span_hear("You hear a gunshot!"), + vision_distance = COMBAT_MESSAGE_RANGE, + ignored_mobs = user + ) + + if(smoking_gun) + var/x_component = sin(get_angle(user, pbtarget)) * 40 + var/y_component = cos(get_angle(user, pbtarget)) * 40 + var/obj/effect/abstract/particle_holder/gun_smoke = new(get_turf(src), /particles/firing_smoke) + gun_smoke.particles.velocity = list(x_component, y_component) + addtimer(VARSET_CALLBACK(gun_smoke.particles, count, 0), 5) + addtimer(VARSET_CALLBACK(gun_smoke.particles, drift, 0), 3) + QDEL_IN(gun_smoke, 0.6 SECONDS) + +/** + * Called when there was an attempt to fire the gun, but the chamber was empty. + * + * Arguments: + * * user - The mob firing the gun. + */ +/obj/item/gun/proc/shoot_with_empty_chamber(mob/living/user) + dry_fire_feedback(user) + +/** + * Called by shoot_with_empty_chamber(). + * + * Arguments: + * * user - The mob firing the gun. + */ +/obj/item/gun/proc/dry_fire_feedback(mob/living/user) + PROTECTED_PROC(TRUE) + + visible_message(span_warning("*click*"), vision_distance = COMBAT_MESSAGE_RANGE) + playsound(src, dry_fire_sound, 30, TRUE) + +/** + * Called by do_fire_gun if the rounds per burst is greater than 1. + * + * Arguments: + * * user - The mob firing the gun. + * * target - The thing being shot. + * * message - Provide chat feedback + * * params - ??? + * * zone_override - ??? + * * sprd - Bullet spread. This is immediately overwritten so I don't know why it's here. + * * randomized_gun_spread - Calculated by do_fire_gun() + * * randomized_bonus_spread - Calculated by do_fire_gun() + * * rand_spr - Seriously, what the fuck? + * * iteration - What step in the burst we are in. + */ +/obj/item/gun/proc/do_fire_in_burst(mob/living/user, atom/target, message = TRUE, params=null, zone_override = "", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) + if(!user || !firing_burst) + firing_burst = FALSE + return FALSE + + if(!chambered?.loaded_projectile) + shoot_with_empty_chamber(user) + firing_burst = FALSE + return FALSE + + if(randomspread) + sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) + 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)) + shoot_with_empty_chamber(user) + firing_burst = FALSE + return FALSE + + after_firing(user, get_dist(user, target) <= 1, target, message) + + // The burst is over + if (iteration >= burst_size) + firing_burst = FALSE + + update_chamber() + return TRUE + +/** + * The proc for firing the gun. This won't perform any non-gun checks. Returns TRUE if a round was fired. + * + * Arguments: + * * user - The mob firing the gun. + * * pointblank - Is this a pointblank shot? + * * pbtarget - If this is a pointblank shot, what is the target? + * * message - If TRUE, will give chat feedback. + */ +/obj/item/gun/proc/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + // We're on cooldown. + if(fire_lockout) + return + + if(user) + SEND_SIGNAL(user, COMSIG_MOB_FIRED_GUN, src, target, params, zone_override) + add_fingerprint(user) + + SEND_SIGNAL(src, COMSIG_GUN_FIRED, user, target, params, zone_override) + + + //Vary by at least this much + var/base_bonus_spread = 0 + var/sprd = 0 + var/randomized_gun_spread = 0 + var/rand_spr = rand() + if(user && HAS_TRAIT(user, TRAIT_POOR_AIM)) //Nice job hotshot + bonus_spread += 35 + base_bonus_spread += 10 + + if(spread) + randomized_gun_spread = rand(0,spread) + + if(ismob(user) && !wielded && unwielded_spread_bonus) + randomized_gun_spread += unwielded_spread_bonus + + var/randomized_bonus_spread = rand(base_bonus_spread, bonus_spread) + + // The fire delay after any modifiers + var/modified_delay = fire_delay + if(user && HAS_TRAIT(user, TRAIT_DOUBLE_TAP)) + modified_delay = ROUND_UP(fire_delay * 0.5) + + // If this is a burst gun, pawn it off to another behemoth proc. + if(burst_size > 1) + firing_burst = TRUE + for(var/i in 1 to burst_size) + addtimer(CALLBACK(src, PROC_REF(do_fire_in_burst), user, target, message, params, zone_override, sprd, randomized_gun_spread, randomized_bonus_spread, rand_spr, i), modified_delay * (i - 1)) + else + if(!chambered) + shoot_with_empty_chamber(user) + return + + sprd = round((rand(0, 1) - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread)) + + // The actual firing procs (FUCKING FINALLY AMIRITE LADS???) + before_firing(target,user) + if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src)) + shoot_with_empty_chamber(user) + return + + // Post-fire things + after_firing(user, get_dist(user, target) <= 1, target, message) + update_chamber() + + // Make it so we can't fire as fast as the mob can click + fire_lockout = TRUE + addtimer(CALLBACK(src, PROC_REF(ready_to_fire)), modified_delay) + + if(istype(user)) + user.update_held_items() + + SSblackbox.record_feedback("tally", "gun_fired", 1, type) + return TRUE + +/// Called when the gun is ready to fire again +/obj/item/gun/proc/ready_to_fire() + SHOULD_CALL_PARENT(TRUE) + fire_lockout = FALSE + +/obj/item/gun/proc/check_botched(mob/living/user, atom/target) + if(!clumsy_check || !istype(user) || !HAS_TRAIT(user, TRAIT_CLUMSY) || !prob(40)) + return FALSE + + var/target_zone = user.get_random_valid_zone(blacklisted_parts = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM), even_weights = TRUE, bypass_warning = TRUE) + if(!target_zone) + return + + user.visible_message(span_danger("[user] shoots [user.p_them()]self in the [parse_zone(target_zone)] with [src]!")) + + do_fire_gun(user, user, FALSE, null, target_zone) + SEND_SIGNAL(user, COMSIG_MOB_CLUMSY_SHOOT_FOOT) + + if(!tk_firing(user) && !HAS_TRAIT(src, TRAIT_NODROP)) + user.dropItemToGround(src) + return TRUE + +/** + * Called after the weapon has successfully fired it's chambered round. + * + * Arguments: + * * empty_chamber - Whether or not the chamber is currently empty. + * * from_firing - If this was called as apart of the gun firing. + * * chamber_next_round - Whether or not the next round should be chambered. + */ +/obj/item/gun/proc/update_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) + SHOULD_NOT_OVERRIDE(TRUE) // You probably want do_chamber_update()! + + do_chamber_update(empty_chamber, from_firing, chamber_next_round) + after_chambering(from_firing) + update_appearance() + SEND_SIGNAL(src, COMSIG_GUN_CHAMBER_PROCESSED) + +/** + * Called after the weapon has successfully fired it's chambered round + * + * Arguments: + * * empty_chamber - Whether or not the chamber is currently empty. + * * from_firing - If this was called as apart of the gun firing. + * * chamber_next_round - Whether or not the next round should be chambered. + */ +/obj/item/gun/proc/do_chamber_update(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) + PROTECTED_PROC(TRUE) + return + +/// Called after a successful shot and update_chamber() +/obj/item/gun/proc/after_chambering(from_firing) + return + +#undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 4916464a4fe7..952ce01e8920 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -6,6 +6,11 @@ icon_state = "debug" w_class = WEIGHT_CLASS_NORMAL + smoking_gun = TRUE + //Most ballistics can have a bit of recoil, just to feel punchy. + recoil = 0.5 + unwielded_recoil = 1 + ///sound when inserting magazine var/load_sound = 'sound/weapons/gun/general/magazine_insert_full.ogg' ///sound when inserting an empty magazine @@ -13,19 +18,19 @@ ///volume of loading sound var/load_sound_volume = 40 ///whether loading sound should vary - var/load_sound_vary = TRUE + var/load_sound_vary = FALSE ///sound of racking var/rack_sound = 'sound/weapons/gun/general/bolt_rack.ogg' ///volume of racking var/rack_sound_volume = 60 ///whether racking sound should vary - var/rack_sound_vary = TRUE + var/rack_sound_vary = FALSE ///sound of when the bolt is locked back manually var/lock_back_sound = 'sound/weapons/gun/general/slide_lock_1.ogg' ///volume of lock back var/lock_back_sound_volume = 60 ///whether lock back varies - var/lock_back_sound_vary = TRUE + var/lock_back_sound_vary = FALSE ///Sound of ejecting a magazine var/eject_sound = 'sound/weapons/gun/general/magazine_remove_full.ogg' ///sound of ejecting an empty magazine @@ -33,7 +38,7 @@ ///volume of ejecting a magazine var/eject_sound_volume = 40 ///whether eject sound should vary - var/eject_sound_vary = TRUE + var/eject_sound_vary = FALSE ///sound of dropping the bolt or releasing a slide var/bolt_drop_sound = 'sound/weapons/gun/general/bolt_drop.ogg' ///volume of bolt drop/slide release @@ -43,12 +48,12 @@ ///empty alarm volume sound var/empty_alarm_volume = 70 ///whether empty alarm sound varies - var/empty_alarm_vary = TRUE + var/empty_alarm_vary = FALSE ///Whether the gun will spawn loaded with a magazine var/spawnwithmagazine = TRUE ///Compatible magazines with the gun - var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info + var/obj/item/ammo_box/magazine/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info ///Whether the sprite has a visible magazine or not var/mag_display = TRUE ///Whether the sprite has a visible ammo display or not @@ -59,17 +64,17 @@ var/empty_alarm = FALSE ///Whether the gun supports multiple special mag types var/special_mags = FALSE + + /** * The bolt type controls how the gun functions, and what iconstates you'll need to represent those functions. - * BOLT_TYPE_STANDARD - The Slide doesn't lock back. Clicking on it will only cycle the bolt. Only 1 sprite. - * BOLT_TYPE_OPEN - Same as standard, but it fires directly from the magazine - No need to rack. Doesn't hold the bullet when you drop the mag. - * BOLT_TYPE_LOCKING - This is most handguns and bolt action rifles. The bolt will lock back when it's empty. You need yourgun_bolt and yourgun_bolt_locked icon states. - * BOLT_TYPE_NO_BOLT - This is shotguns and revolvers. clicking will dump out all the bullets in the gun, spent or not. - * see combat.dm defines for bolt types: BOLT_TYPE_STANDARD; BOLT_TYPE_LOCKING; BOLT_TYPE_OPEN; BOLT_TYPE_NO_BOLT + * /datum/gun_bolt - The Slide doesn't lock back. Clicking on it will only cycle the bolt. Only 1 sprite. + * /datum/gun_bolt/open - Same as standard, but it fires directly from the magazine - No need to rack. Doesn't hold the bullet when you drop the mag. + * /datum/gun_bolt/locking - This is most handguns and bolt action rifles. The bolt will lock back when it's empty. You need yourgun_bolt and yourgun_bolt_locked icon states. + * /datum/gun_bolt/no_bolt - This is shotguns and revolvers. clicking will dump out all the bullets in the gun, spent or not. **/ - var/bolt_type = BOLT_TYPE_STANDARD - ///Used for locking bolt and open bolt guns. Set a bit differently for the two but prevents firing when true for both. - var/bolt_locked = FALSE + var/datum/gun_bolt/bolt = /datum/gun_bolt + var/show_bolt_icon = TRUE ///Hides the bolt icon. ///Whether the gun has to be racked each shot or not. var/semi_auto = TRUE @@ -77,7 +82,7 @@ var/obj/item/ammo_box/magazine/magazine ///whether the gun ejects the chambered casing var/casing_ejector = TRUE - ///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT. + ///Whether the gun has an internal magazine or a detatchable one. Overridden by /datum/gun_bolt/no_bolt. var/internal_magazine = FALSE ///Phrasing of the bolt in examine and notification messages; ex: bolt, slide, etc. var/bolt_wording = "bolt" @@ -85,12 +90,15 @@ var/magazine_wording = "magazine" ///Phrasing of the cartridge in examine and notification messages; ex: bullet, shell, dart, etc. var/cartridge_wording = "bullet" + /// If TRUE, will show the caliber name on examine. Set to false for things with fake calibers like bows and the tentacle "gun". + var/show_caliber_on_examine = TRUE + ///length between individual racks var/rack_delay = 5 + /// Can you rack this weapon with one hand? + var/one_hand_rack = FALSE ///time of the most recent rack, used for cooldown purposes var/recent_rack = 0 - ///Whether the gun can be tacloaded by slapping a fresh magazine directly on it - var/tac_reloads = TRUE //Snowflake mechanic no more. ///Whether the gun can be sawn off by sawing tools var/can_be_sawn_off = FALSE var/flip_cooldown = 0 @@ -127,55 +135,45 @@ /obj/item/gun/ballistic/Initialize(mapload) . = ..() + + bolt = new bolt(src) + if (!spawnwithmagazine) - bolt_locked = TRUE + bolt.is_locked = TRUE update_appearance() return + if (!magazine) magazine = new mag_type(src) - if(bolt_type == BOLT_TYPE_STANDARD || internal_magazine) //Internal magazines shouldn't get magazine + 1. + + initial_caliber = magazine.caliber + + if((bolt.type == /datum/gun_bolt) || internal_magazine) //Internal magazines shouldn't get magazine + 1. chamber_round() else chamber_round(replace_new_round = TRUE) + update_appearance() RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_reload)) /obj/item/gun/ballistic/Destroy() QDEL_NULL(magazine) + QDEL_NULL(bolt) return ..() -/obj/item/gun/ballistic/fire_sounds() - var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo()) - var/click_frequency_to_use = 1 - frequency_to_use * 0.75 - var/play_click = round(sqrt(magazine?.max_ammo * 2)) > get_ammo() - if(suppressed) - playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) - if(play_click) - playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0, frequency = click_frequency_to_use) - else - playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) - if(play_click) - playsound(src, 'sound/weapons/gun/general/ballistic_click.ogg', fire_sound_volume, vary_fire_sound, frequency = click_frequency_to_use) - /obj/item/gun/ballistic/vv_edit_var(vname, vval) . = ..() - if(vname in list(NAMEOF(src, suppressor_x_offset), NAMEOF(src, suppressor_y_offset), NAMEOF(src, internal_magazine), NAMEOF(src, magazine), NAMEOF(src, chambered), NAMEOF(src, empty_indicator), NAMEOF(src, sawn_off), NAMEOF(src, bolt_locked), NAMEOF(src, bolt_type))) + if(vname in list(NAMEOF(src, suppressor_x_offset), NAMEOF(src, suppressor_y_offset), NAMEOF(src, internal_magazine), NAMEOF(src, magazine), NAMEOF(src, chambered), NAMEOF(src, empty_indicator), NAMEOF(src, sawn_off), NAMEOF(src, bolt))) update_appearance() /obj/item/gun/ballistic/update_icon_state() - if(current_skin) - icon_state = "[unique_reskin[current_skin]][sawn_off ? "_sawn" : ""]" - else - icon_state = "[base_icon_state || initial(icon_state)][sawn_off ? "_sawn" : ""]" + icon_state = "[base_icon_state || initial(icon_state)][sawn_off ? "_sawn" : ""]" return ..() /obj/item/gun/ballistic/update_overlays() . = ..() if(show_bolt_icon) - if (bolt_type == BOLT_TYPE_LOCKING) - . += "[icon_state]_bolt[bolt_locked ? "_locked" : ""]" - if (bolt_type == BOLT_TYPE_OPEN && bolt_locked) - . += "[icon_state]_bolt" + . += bolt?.get_overlays() //update_overlays() can get called during Destroy() if(suppressed) var/mutable_appearance/MA = mutable_appearance(icon, "[icon_state]_suppressor") @@ -221,21 +219,25 @@ . += "[icon_state]_mag_[capacity_number]" -/obj/item/gun/ballistic/handle_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) +/obj/item/gun/ballistic/do_chamber_update(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) if(!semi_auto && from_firing) return + var/obj/item/ammo_casing/casing = chambered //Find chambered round if(istype(casing)) //there's a chambered round if(QDELING(casing)) stack_trace("Trying to move a qdeleted casing of type [casing.type]!") chambered = null + else if(casing_ejector || !from_firing) casing.forceMove(drop_location()) //Eject casing onto ground. casing.bounce_away(TRUE) SEND_SIGNAL(casing, COMSIG_CASING_EJECTED) chambered = null + else if(empty_chamber) chambered = null + if (chamber_next_round && (magazine?.max_ammo > 1)) chamber_round() @@ -243,31 +245,29 @@ /obj/item/gun/ballistic/proc/chamber_round(keep_bullet = FALSE, spin_cylinder, replace_new_round) if (chambered || !magazine) return - if (magazine.ammo_count()) - chambered = magazine.get_round(keep_bullet || bolt_type == BOLT_TYPE_NO_BOLT) - if (bolt_type != BOLT_TYPE_OPEN) - chambered.forceMove(src) - if(replace_new_round) - magazine.give_round(new chambered.type) + + if (!magazine.ammo_count()) + return + + chambered = magazine.get_round(keep_bullet || istype(bolt, /datum/gun_bolt/no_bolt)) + + if (!istype(bolt, /datum/gun_bolt/open)) + chambered.forceMove(src) + if(replace_new_round) + magazine.give_round(new chambered.type) ///updates a bunch of racking related stuff and also handles the sound effects and the like /obj/item/gun/ballistic/proc/rack(mob/user = null) - if (bolt_type == BOLT_TYPE_NO_BOLT) //If there's no bolt, nothing to rack + if(bolt.pre_rack(user)) 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, span_notice("[src]'s [bolt_wording] is already cocked!")) - return - bolt_locked = FALSE + if (user) to_chat(user, span_notice("You rack the [bolt_wording] of [src].")) - process_chamber(!chambered, FALSE) - if (bolt_type == BOLT_TYPE_LOCKING && !chambered) - bolt_locked = TRUE - playsound(src, lock_back_sound, lock_back_sound_volume, lock_back_sound_vary) - else - playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) + + update_chamber(!chambered, FALSE) + + bolt.post_rack() + update_appearance() ///Drops the bolt from a locked position @@ -275,8 +275,9 @@ playsound(src, bolt_drop_sound, bolt_drop_sound_volume, FALSE) if (user) to_chat(user, span_notice("You drop the [bolt_wording] of [src].")) + chamber_round() - bolt_locked = FALSE + bolt.is_locked = FALSE update_appearance() ///Handles all the logic needed for magazine insertion @@ -284,89 +285,117 @@ if(!istype(AM, mag_type)) to_chat(user, span_warning("[AM] doesn't seem to fit into [src]...")) return FALSE + if(user.transferItemToLoc(AM, src)) magazine = AM if (display_message) - to_chat(user, span_notice("You load a new [magazine_wording] into [src].")) - playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) - if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) - chamber_round(TRUE) + to_chat(user, span_notice("You load [AM] into [src].")) + + if (magazine.ammo_count()) + playsound(src, load_sound, load_sound_volume, load_sound_vary) + else + playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) + + bolt.magazine_inserted() update_appearance() return TRUE + else to_chat(user, span_warning("You cannot seem to get [src] out of your hands!")) return FALSE ///Handles all the logic of magazine ejection, if tac_load is set that magazine will be tacloaded in the place of the old eject -/obj/item/gun/ballistic/proc/eject_magazine(mob/user, display_message = TRUE, obj/item/ammo_box/magazine/tac_load = null) - if(bolt_type == BOLT_TYPE_OPEN) - chambered = null +/obj/item/gun/ballistic/proc/eject_magazine(mob/user, display_message = TRUE) + if(internal_magazine || !magazine) + return FALSE // fuck off + + bolt.magazine_ejected() + if (magazine.ammo_count()) - playsound(src, load_sound, load_sound_volume, load_sound_vary) - else - playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) - magazine.forceMove(drop_location()) - var/obj/item/ammo_box/magazine/old_mag = magazine - if (tac_load) - if (insert_magazine(user, tac_load, FALSE)) - to_chat(user, span_notice("You perform a tactical reload on [src].")) - else - to_chat(user, span_warning("You dropped the old [magazine_wording], but the new one doesn't fit. How embarassing.")) - magazine = null + playsound(src, eject_sound, eject_sound_volume, eject_sound_vary) else - magazine = null - user.put_in_hands(old_mag) + playsound(src, eject_empty_sound, eject_sound_volume, eject_sound_vary) + + var/obj/item/ammo_box/old_mag = magazine + magazine = null + + if(!user.put_in_hands(old_mag)) + old_mag.forceMove(drop_location()) old_mag.update_appearance() + if (display_message) - to_chat(user, span_notice("You pull the [magazine_wording] out of [src].")) + to_chat(user, span_notice("You pull [old_mag] out of [src].")) update_appearance() -/obj/item/gun/ballistic/can_shoot() + return TRUE + +/// Removes the magazine from the weapon, or ejects all of it's ammo, based on the bolt type. +/obj/item/gun/ballistic/proc/unload(mob/user) + if(bolt.unload(user)) + return + + if(internal_magazine) + return + + if(!magazine) + to_chat(user, span_warning("There is no magazine in [src].")) + return + + unwield(user) + eject_magazine(user, TRUE) + +/obj/item/gun/ballistic/can_fire() return chambered?.loaded_projectile /obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params) . = ..() if (.) return + if (!internal_magazine && istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A if (!magazine) insert_magazine(user, AM) else - if (tac_reloads) - eject_magazine(user, FALSE, AM) - else - to_chat(user, span_notice("There's already a [magazine_wording] in [src].")) + to_chat(user, span_warning("There is already a [magazine_wording] in [src].")) return + if (isammocasing(A) || istype(A, /obj/item/ammo_box)) - if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine) + if (istype(bolt, /datum/gun_bolt/no_bolt) || internal_magazine) if (chambered && !chambered.loaded_projectile) chambered.forceMove(drop_location()) chambered = null - var/num_loaded = magazine?.attackby(A, user, params, TRUE) + + var/num_loaded = magazine?.attempt_load_round(A, user, params, TRUE) if (num_loaded) to_chat(user, span_notice("You load [num_loaded] [cartridge_wording]\s into [src].")) playsound(src, load_sound, load_sound_volume, load_sound_vary) - if (chambered == null && bolt_type == BOLT_TYPE_NO_BOLT) - chamber_round() + + bolt.loaded_ammo() + A.update_appearance() update_appearance() return + if(istype(A, /obj/item/suppressor)) var/obj/item/suppressor/S = A if(!can_suppress) to_chat(user, span_warning("You can't seem to figure out how to fit [S] on [src]!")) return + if(!user.is_holding(src)) to_chat(user, span_warning("You need be holding [src] to fit [S] to it!")) return + if(suppressed) to_chat(user, span_warning("[src] already has a suppressor!")) return + if(user.transferItemToLoc(A, src)) to_chat(user, span_notice("You attach [S] to [src].")) install_suppressor(A) return + if (can_be_sawn_off) if (sawoff(user, A)) return @@ -377,27 +406,23 @@ return FALSE -/obj/item/gun/ballistic/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(magazine && chambered.loaded_projectile && can_misfire && misfire_probability > 0) +/obj/item/gun/ballistic/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(magazine && chambered?.loaded_projectile && can_misfire && misfire_probability > 0) if(prob(misfire_probability)) if(blow_up(user)) to_chat(user, span_userdanger("[src] misfires!")) + return FALSE if (sawn_off) bonus_spread += SAWN_OFF_ACC_PENALTY return ..() -/obj/item/gun/ballistic/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) - if(can_misfire) - misfire_probability += misfire_percentage_increment - misfire_probability = clamp(misfire_probability, 0, misfire_probability_cap) - return ..() - ///Installs a new suppressor, assumes that the suppressor is already in the contents of src /obj/item/gun/ballistic/proc/install_suppressor(obj/item/suppressor/S) suppressed = S w_class += S.w_class //so pistols do not fit in pockets when suppressed update_appearance() + verbs += /obj/item/gun/proc/user_remove_suppressor /obj/item/gun/ballistic/clear_suppressor() if(!can_unsuppress) @@ -407,48 +432,44 @@ w_class -= I.w_class return ..() -/obj/item/gun/ballistic/AltClick(mob/user) - if (unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - reskin_obj(user) +/obj/item/gun/ballistic/before_firing(atom/target, mob/user) + . = ..() + bolt.before_firing() + +/obj/item/gun/ballistic/after_firing(mob/living/user, pointblank, atom/pbtarget, message) + . = ..() + if(can_misfire) + misfire_probability += misfire_percentage_increment + misfire_probability = clamp(misfire_probability, 0, misfire_probability_cap) + + AddComponent(/datum/component/smell, INTENSITY_NORMAL, SCENT_ODOR, "gunpowder", 3, 15 MINUTES) + +/obj/item/gun/ballistic/after_chambering(from_firing) + . = ..() + if(!from_firing) return - if(loc == user) - if(suppressed && can_unsuppress) - var/obj/item/suppressor/S = suppressed - if(!user.is_holding(src)) - return ..() - to_chat(user, span_notice("You unscrew [S] from [src].")) - user.put_in_hands(S) - clear_suppressor() - -///Prefire empty checks for the bolt drop -/obj/item/gun/ballistic/proc/prefire_empty_checks() - if (!chambered && !get_ammo()) - if (bolt_type == BOLT_TYPE_OPEN && !bolt_locked) - bolt_locked = TRUE - playsound(src, bolt_drop_sound, bolt_drop_sound_volume) - update_appearance() -///postfire empty checks for bolt locking and sound alarms -/obj/item/gun/ballistic/proc/postfire_empty_checks(last_shot_succeeded) if (!chambered && !get_ammo()) - if (empty_alarm && last_shot_succeeded) + if (empty_alarm) playsound(src, empty_alarm_sound, empty_alarm_volume, empty_alarm_vary) update_appearance() - if (last_shot_succeeded && bolt_type == BOLT_TYPE_LOCKING) - bolt_locked = TRUE - update_appearance() -/obj/item/gun/ballistic/afterattack() - prefire_empty_checks() - . = ..() //The gun actually firing - postfire_empty_checks(.) + bolt.after_chambering() -//ATTACK HAND IGNORING PARENT RETURN VALUE -/obj/item/gun/ballistic/attack_hand(mob/user, list/modifiers) - if(!internal_magazine && loc == user && user.is_holding(src) && magazine) - eject_magazine(user) +/obj/item/gun/ballistic/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - return ..() + + if(modifiers?[RIGHT_CLICK] && !internal_magazine && magazine && user.is_holding(src)) + unload(user) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/gun/ballistic/AltClick(mob/user) + if(!isliving(user) || !user.canUseTopic(src, USE_CLOSE|USE_NEED_HANDS|USE_DEXTERITY)) + return + + unload(user) /obj/item/gun/ballistic/attack_self(mob/living/user) if(HAS_TRAIT(user, TRAIT_GUNFLIP)) @@ -456,59 +477,58 @@ if(flip_cooldown <= world.time) if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(40)) to_chat(user, span_userdanger("While trying to flip [src] you pull the trigger and accidentally shoot yourself!")) - process_fire(user, user, FALSE, user.get_random_valid_zone(even_weights = TRUE)) + do_fire_gun(user, user, FALSE, user.get_random_valid_zone(even_weights = TRUE)) user.dropItemToGround(src, TRUE) return + flip_cooldown = (world.time + 30) user.visible_message(span_notice("[user] spins [src] around [user.p_their()] finger by the trigger. That’s pretty badass.")) playsound(src, 'sound/items/handling/ammobox_pickup.ogg', 20, FALSE) return - if(!internal_magazine && magazine) - if(!magazine.ammo_count()) - eject_magazine(user) - return - if(bolt_type == BOLT_TYPE_NO_BOLT) - chambered = null - var/num_unloaded = 0 - for(var/obj/item/ammo_casing/CB in get_ammo_list(FALSE, TRUE)) - CB.forceMove(drop_location()) - CB.bounce_away(FALSE, NONE) - num_unloaded++ - var/turf/T = get_turf(drop_location()) - if(T && is_station_level(T.z)) - SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name) - if (num_unloaded) - to_chat(user, span_notice("You unload [num_unloaded] [cartridge_wording]\s from [src].")) - playsound(user, eject_sound, eject_sound_volume, eject_sound_vary) - update_appearance() - else - to_chat(user, span_warning("[src] is empty!")) + + // They need two hands on the gun, or a free hand in general. + if(!one_hand_rack && !(wielded || user.get_empty_held_index())) + to_chat(user, span_warning("You need a free hand to do that!")) return - if(bolt_type == BOLT_TYPE_LOCKING && bolt_locked) - drop_bolt(user) + + if(bolt.attack_self(user)) return - if (recent_rack > world.time) + + if(!COOLDOWN_FINISHED(src, recent_rack)) return - recent_rack = world.time + rack_delay + + COOLDOWN_START(src, recent_rack, rack_delay) rack(user) return +/obj/item/gun/ballistic/attack_self_secondary(mob/user, modifiers) + . = ..() + if(.) + return + + unload(user) + return TRUE /obj/item/gun/ballistic/examine(mob/user) . = ..() - var/count_chambered = !(bolt_type == BOLT_TYPE_NO_BOLT || bolt_type == BOLT_TYPE_OPEN) - . += "It has [get_ammo(count_chambered)] round\s remaining." - if (!chambered && !hidden_chambered) - . += "It does not seem to have a round chambered." - if (bolt_locked) - . += "The [bolt_wording] is locked back and needs to be released before firing or de-fouling." + if(show_caliber_on_examine) + . += "It is chambered in [initial_caliber]." + + if(chambered && !hidden_chambered) + . += "It has a round in the chamber." + + if (bolt.is_locked) + . += "The [bolt_wording] is locked." + if (suppressed) - . += "It has a suppressor attached that can be removed with alt+click." + . += "It has a suppressor attached." + + if(magazine && internal_magazine) + . += span_notice(magazine.get_ammo_desc()) + if(can_misfire) . += span_danger("You get the feeling this might explode if you fire it....") - if(misfire_probability > 0) - . += span_danger("Given the state of the gun, there is a [misfire_probability]% chance it'll misfire.") ///Gets the number of bullets in the gun /obj/item/gun/ballistic/proc/get_ammo(countchambered = TRUE) @@ -540,7 +560,7 @@ sleep(2.5 SECONDS) if(user.is_holding(src)) var/turf/T = get_turf(user) - process_fire(user, user, FALSE, null, BODY_ZONE_HEAD) + do_fire_gun(user, user, FALSE, null, BODY_ZONE_HEAD) user.visible_message(span_suicide("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!")) var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE) B.Remove(user) @@ -628,12 +648,12 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(!can_modify_ammo) return - if(bolt_type == BOLT_TYPE_STANDARD) + if(bolt.type == /datum/gun_bolt) if(get_ammo()) to_chat(user, span_notice("You can't get at the internals while the gun has a bullet in it!")) return - else if(!bolt_locked) + else if(!bolt.is_locked) to_chat(user, span_notice("You can't get at the internals while the bolt is down!")) return @@ -646,26 +666,26 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( user.visible_message(span_danger("[src] goes off!"), span_danger("[src] goes off in your face!")) return - if(magazine.caliber == initial_caliber) - magazine.caliber = alternative_caliber - if(alternative_ammo_misfires) - can_misfire = TRUE - fire_sound = alternative_fire_sound - to_chat(user, span_notice("You modify [src]. Now it will fire [alternative_caliber] rounds.")) - else - magazine.caliber = initial_caliber - if(alternative_ammo_misfires) - can_misfire = FALSE - fire_sound = initial_fire_sound - to_chat(user, span_notice("You reset [src]. Now it will fire [initial_caliber] rounds.")) - + if(alternative_caliber) + if(magazine.caliber == initial_caliber) + magazine.caliber = alternative_caliber + if(alternative_ammo_misfires) + can_misfire = TRUE + fire_sound = alternative_fire_sound + to_chat(user, span_notice("You modify [src]. Now it will fire [alternative_caliber] rounds.")) + else + magazine.caliber = initial_caliber + if(alternative_ammo_misfires) + can_misfire = FALSE + fire_sound = initial_fire_sound + to_chat(user, span_notice("You reset [src]. Now it will fire [initial_caliber] rounds.")) ///used for sawing guns, causes the gun to fire without the input of the user /obj/item/gun/ballistic/proc/blow_up(mob/user) . = FALSE for(var/obj/item/ammo_casing/AC in magazine.stored_ammo) if(AC.loaded_projectile) - process_fire(user, user, FALSE) + do_fire_gun(user, user, FALSE) . = TRUE /obj/item/gun/ballistic/proc/instant_reload() diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index ead4b4a6ff15..af1f28d2e369 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -54,16 +54,13 @@ mag_display = TRUE empty_indicator = TRUE mag_type = /obj/item/ammo_box/magazine/smgm9mm - pin = null - bolt_type = BOLT_TYPE_LOCKING + bolt = /datum/gun_bolt/locking show_bolt_icon = FALSE /obj/item/gun/ballistic/automatic/proto/Initialize(mapload) . = ..() AddComponent(/datum/component/automatic_fire, 0.2 SECONDS) -/obj/item/gun/ballistic/automatic/proto/unrestricted - pin = /obj/item/firing_pin /obj/item/gun/ballistic/automatic/c20r name = "\improper C-20r SMG" @@ -74,7 +71,6 @@ mag_type = /obj/item/ammo_box/magazine/smgm45 fire_delay = 2 burst_size = 3 - pin = /obj/item/firing_pin/implant/pindicate can_bayonet = TRUE knife_x_offset = 26 knife_y_offset = 12 @@ -87,9 +83,6 @@ if(!chambered && empty_indicator) //this is duplicated due to a layering issue with the select fire icon. . += "[icon_state]_empty" -/obj/item/gun/ballistic/automatic/c20r/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/c20r/Initialize(mapload) . = ..() update_appearance() @@ -112,6 +105,9 @@ mag_display_ammo = TRUE empty_indicator = TRUE + unwielded_spread_bonus = 10 + unwielded_recoil = 1.5 + /obj/item/gun/ballistic/automatic/wt550/Initialize(mapload) . = ..() AddComponent(/datum/component/automatic_fire, 0.3 SECONDS) @@ -137,7 +133,7 @@ icon_state = "miniuzi" mag_type = /obj/item/ammo_box/magazine/uzim9mm burst_size = 2 - bolt_type = BOLT_TYPE_OPEN + bolt = /datum/gun_bolt/open show_bolt_icon = FALSE mag_display = TRUE rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' @@ -153,10 +149,14 @@ mag_type = /obj/item/ammo_box/magazine/m556 can_suppress = FALSE var/obj/item/gun/ballistic/revolver/grenadelauncher/underbarrel + burst_size = 3 fire_delay = 2 + spread = 5 - pin = /obj/item/firing_pin/implant/pindicate + unwielded_spread_bonus = 15 + unwielded_recoil = 1.5 + mag_display = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' @@ -170,14 +170,6 @@ QDEL_NULL(underbarrel) return ..() -/obj/item/gun/ballistic/automatic/m90/unrestricted - pin = /obj/item/firing_pin - -/obj/item/gun/ballistic/automatic/m90/unrestricted/Initialize(mapload) - . = ..() - underbarrel = new /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted(src) - update_appearance() - /obj/item/gun/ballistic/automatic/m90/afterattack_secondary(atom/target, mob/living/user, flag, params) underbarrel.afterattack(target, user, flag, params) return SECONDARY_ATTACK_CONTINUE_CHAIN @@ -211,7 +203,7 @@ burst_size = 1 actions_types = list() fire_delay = 1 - bolt_type = BOLT_TYPE_OPEN + bolt = /datum/gun_bolt/open empty_indicator = TRUE show_bolt_icon = FALSE @@ -241,26 +233,25 @@ base_icon_state = "l6" w_class = WEIGHT_CLASS_HUGE slot_flags = 0 - mag_type = /obj/item/ammo_box/magazine/mm712x82 - weapon_weight = WEAPON_HEAVY - burst_size = 1 actions_types = list() - can_suppress = FALSE + + unwielded_recoil = 2 spread = 7 - pin = /obj/item/firing_pin/implant/pindicate - bolt_type = BOLT_TYPE_OPEN + unwielded_spread_bonus = 20 + burst_size = 1 + + bolt = /datum/gun_bolt/open + can_suppress = FALSE + show_bolt_icon = FALSE mag_display = TRUE mag_display_ammo = TRUE - tac_reloads = FALSE + fire_sound = 'sound/weapons/gun/l6/shot.ogg' rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/cover_open = FALSE -/obj/item/gun/ballistic/automatic/l6_saw/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/l6_saw/Initialize(mapload) . = ..() AddElement(/datum/element/update_icon_updates_onmob) @@ -330,8 +321,11 @@ load_sound = 'sound/weapons/gun/sniper/mag_insert.ogg' rack_sound = 'sound/weapons/gun/sniper/rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - recoil = 2 - weapon_weight = WEAPON_HEAVY + + recoil = 1 + unwielded_recoil = 4 + unwielded_spread_bonus = 90 + mag_type = /obj/item/ammo_box/magazine/sniper_rounds fire_delay = 4 SECONDS burst_size = 1 @@ -342,11 +336,13 @@ suppressor_x_offset = 3 suppressor_y_offset = 3 + accuracy_falloff = 0 + /obj/item/gun/ballistic/automatic/sniper_rifle/Initialize(mapload) . = ..() AddComponent(/datum/component/scope, range_modifier = 2) -/obj/item/gun/ballistic/automatic/sniper_rifle/reset_semicd() +/obj/item/gun/ballistic/automatic/sniper_rifle/ready_to_fire() . = ..() if(suppressed) playsound(src, 'sound/machines/eject.ogg', 25, TRUE, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) @@ -358,7 +354,6 @@ desc = "An illegally modified .50 cal sniper rifle with suppression compatibility. Quickscoping still doesn't work." can_suppress = TRUE can_unsuppress = TRUE - pin = /obj/item/firing_pin/implant/pindicate // Old Semi-Auto Rifle // @@ -368,7 +363,11 @@ icon_state = "surplus" inhand_icon_state = "moistnugget" worn_icon_state = null - weapon_weight = WEAPON_HEAVY + + recoil = 1 + unwielded_recoil = 4 + + unwielded_spread_bonus = 20 mag_type = /obj/item/ammo_box/magazine/m10mm/rifle fire_delay = 30 burst_size = 1 diff --git a/code/modules/projectiles/guns/ballistic/bow.dm b/code/modules/projectiles/guns/ballistic/bow.dm index 5c9cde0aa489..b281bc4bdfc3 100644 --- a/code/modules/projectiles/guns/ballistic/bow.dm +++ b/code/modules/projectiles/guns/ballistic/bow.dm @@ -5,17 +5,20 @@ icon = 'icons/obj/guns/ballistic.dmi' icon_state = "bow" inhand_icon_state = "bow" + smoking_gun = FALSE load_sound = null fire_sound = null mag_type = /obj/item/ammo_box/magazine/internal/bow force = 15 attack_verb_continuous = list("whipped", "cracked") attack_verb_simple = list("whip", "crack") - weapon_weight = WEAPON_HEAVY w_class = WEIGHT_CLASS_BULKY internal_magazine = TRUE cartridge_wording = "arrow" - bolt_type = BOLT_TYPE_NO_BOLT + bolt = /datum/gun_bolt/no_bolt + recoil = 0 // Bows don't have recoil. + show_caliber_on_examine = FALSE + var/drawn = FALSE /obj/item/gun/ballistic/bow/update_icon_state() diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm index 60225e8db121..bbf835c4d422 100644 --- a/code/modules/projectiles/guns/ballistic/launchers.dm +++ b/code/modules/projectiles/guns/ballistic/launchers.dm @@ -1,7 +1,7 @@ //KEEP IN MIND: These are different from gun/grenadelauncher. These are designed to shoot premade rocket and grenade projectiles, not flashbangs or chemistry casings etc. //Put handheld rocket launchers here if someone ever decides to make something so hilarious ~Paprika -/obj/item/gun/ballistic/revolver/grenadelauncher//this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes +/obj/item/gun/ballistic/revolver/grenadelauncher //this is only used for underbarrel grenade launchers at the moment, but admins can still spawn it if they feel like being assholes desc = "A break-operated grenade launcher." name = "grenade launcher" icon_state = "dshotgun_sawn" @@ -9,11 +9,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/grenadelauncher fire_sound = 'sound/weapons/gun/general/grenade_launch.ogg' w_class = WEIGHT_CLASS_NORMAL - pin = /obj/item/firing_pin/implant/pindicate - bolt_type = BOLT_TYPE_NO_BOLT - -/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted - pin = /obj/item/firing_pin + bolt = /datum/gun_bolt/no_bolt /obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, params) ..() @@ -52,27 +48,22 @@ fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg' w_class = WEIGHT_CLASS_BULKY can_suppress = FALSE - pin = /obj/item/firing_pin/implant/pindicate burst_size = 1 fire_delay = 0 casing_ejector = FALSE - weapon_weight = WEAPON_HEAVY - bolt_type = BOLT_TYPE_NO_BOLT + bolt = /datum/gun_bolt/no_bolt internal_magazine = TRUE cartridge_wording = "rocket" empty_indicator = TRUE - tac_reloads = FALSE /// Do we shit flames behind us when we fire? var/backblast = TRUE /obj/item/gun/ballistic/rocketlauncher/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) if(backblast) AddElement(/datum/element/backblast) -/obj/item/gun/ballistic/rocketlauncher/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/rocketlauncher/nobackblast name = "flameless PML-11" desc = "A reusable rocket propelled grenade launcher. This one has been fitted with a special coolant loop to avoid embarassing teamkill 'accidents' from backblast." @@ -88,7 +79,7 @@ /obj/item/gun/ballistic/rocketlauncher/suicide_act(mob/living/user) user.visible_message(span_warning("[user] aims [src] at the ground! It looks like [user.p_theyre()] performing a sick rocket jump!"), \ span_userdanger("You aim [src] at the ground to perform a bisnasty rocket jump...")) - if(can_shoot()) + if(can_fire()) user.notransform = TRUE playsound(src, 'sound/vehicles/rocketlaunch.ogg', 80, TRUE, 5) animate(user, pixel_z = 300, time = 30, easing = LINEAR_EASING) @@ -96,7 +87,7 @@ animate(user, pixel_z = 0, time = 5, easing = LINEAR_EASING) sleep(0.5 SECONDS) user.notransform = FALSE - process_fire(user, user, TRUE) + do_fire_gun(user, user, TRUE) if(!QDELETED(user)) //if they weren't gibbed by the explosion, take care of them for good. user.gib() return MANUAL_SUICIDE diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 8a1943de3c9b..612f23f5660c 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -8,7 +8,7 @@ burst_size = 1 fire_delay = 0 actions_types = list() - bolt_type = BOLT_TYPE_LOCKING + bolt = /datum/gun_bolt/locking fire_sound = 'sound/weapons/gun/pistol/shot.ogg' dry_fire_sound = 'sound/weapons/gun/pistol/dry_fire.ogg' suppressed_sound = 'sound/weapons/gun/pistol/shot_suppressed.ogg' @@ -37,7 +37,7 @@ /obj/item/gun/ballistic/automatic/pistol/m1911 name = "\improper M1911" - desc = "A classic .45 handgun with a small magazine capacity." + desc = "A classic .45 ACP handgun with an 8-round magazine capacity." icon_state = "m1911" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m45 @@ -56,6 +56,7 @@ icon_state = "deagle" force = 14 mag_type = /obj/item/ammo_box/magazine/m50 + w_class = WEIGHT_CLASS_NORMAL can_suppress = FALSE mag_display = TRUE fire_sound = 'sound/weapons/gun/rifle/shot.ogg' @@ -74,8 +75,8 @@ inhand_icon_state = "deagleg" /obj/item/gun/ballistic/automatic/pistol/aps - name = "\improper Stechkin APS machine pistol" - desc = "An old Soviet machine pistol. It fires quickly, but kicks like a mule. Uses 9mm ammo. Has a threaded barrel for suppressors." + name = "\improper Stechkin pistol" + desc = "A fast-firing a handgun chambered in 9x19mm Parabellum. Utilizes 15 round magazines and kicks like a mule. Has a threaded barrel for suppressors." icon_state = "aps" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m9mm_aps @@ -85,21 +86,3 @@ spread = 10 actions_types = list(/datum/action/item_action/toggle_firemode) suppressor_x_offset = 6 - -/obj/item/gun/ballistic/automatic/pistol/stickman - name = "flat gun" - desc = "A 2 dimensional gun.. what?" - icon_state = "flatgun" - mag_display = FALSE - show_bolt_icon = FALSE - -/obj/item/gun/ballistic/automatic/pistol/stickman/equipped(mob/user, slot) - ..() - to_chat(user, span_notice("As you try to manipulate [src], it slips out of your possession..")) - if(prob(50)) - to_chat(user, span_notice("..and vanishes from your vision! Where the hell did it go?")) - qdel(src) - user.update_icons() - else - to_chat(user, span_notice("..and falls into view. Whew, that was a close one.")) - user.dropItemToGround(src) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 81f3dd5d6168..fefdd8dc8fef 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -10,20 +10,23 @@ dry_fire_sound = 'sound/weapons/gun/revolver/dry_fire.ogg' casing_ejector = FALSE internal_magazine = TRUE - bolt_type = BOLT_TYPE_NO_BOLT - tac_reloads = FALSE + bolt = /datum/gun_bolt/no_bolt + + /// If TRUE, will rotate the cylinder after each shot. + var/auto_chamber = TRUE + var/spin_delay = 10 var/recent_spin = 0 var/last_fire = 0 -/obj/item/gun/ballistic/revolver/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) - ..() +/obj/item/gun/ballistic/revolver/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) + . = ..() last_fire = world.time - /obj/item/gun/ballistic/revolver/chamber_round(keep_bullet, spin_cylinder = TRUE, replace_new_round) if(!magazine) //if it mag was qdel'd somehow. CRASH("revolver tried to chamber a round without a magazine!") + if(spin_cylinder) chambered = magazine.get_round(TRUE) else @@ -31,13 +34,14 @@ /obj/item/gun/ballistic/revolver/shoot_with_empty_chamber(mob/living/user as mob|obj) ..() - chamber_round() + if(auto_chamber) + chamber_round(spin_cylinder = TRUE) /obj/item/gun/ballistic/revolver/AltClick(mob/user) ..() spin() -/obj/item/gun/ballistic/revolver/fire_sounds() +/obj/item/gun/ballistic/revolver/play_fire_sound() var/frequency_to_use = sin((90/magazine?.max_ammo) * get_ammo(TRUE, FALSE)) // fucking REVOLVERS var/click_frequency_to_use = 1 - frequency_to_use * 0.75 var/play_click = sqrt(magazine?.max_ammo) > get_ammo(TRUE, FALSE) @@ -111,19 +115,6 @@ misfire_probability = 0 misfire_percentage_increment = 25 //about 1 in 4 rounds, which increases rapidly every shot - obj_flags = UNIQUE_RENAME - unique_reskin = list( - "Default" = "c38", - "Fitz Special" = "c38_fitz", - "Police Positive Special" = "c38_police", - "Blued Steel" = "c38_blued", - "Stainless Steel" = "c38_stainless", - "Gold Trim" = "c38_trim", - "Golden" = "c38_gold", - "The Peacemaker" = "c38_peacemaker", - "Black Panther" = "c38_panther" - ) - /obj/item/gun/ballistic/revolver/syndicate name = "\improper Syndicate Revolver" desc = "A modernized 7 round revolver manufactured by Waffle Co. Uses .357 ammo." @@ -188,7 +179,7 @@ return ..() -/obj/item/gun/ballistic/revolver/russian/fire_gun(atom/target, mob/living/user, flag, params) +/obj/item/gun/ballistic/revolver/russian/try_fire_gun(atom/target, mob/living/user, flag, params) . = ..(null, user, flag, params) if(flag) @@ -214,7 +205,7 @@ spun = FALSE - var/zone = check_zone(user.zone_selected) + var/zone = deprecise_zone(user.zone_selected) var/obj/item/bodypart/affecting = H.get_bodypart(zone) var/is_target_face = zone == BODY_ZONE_HEAD || zone == BODY_ZONE_PRECISE_EYES || zone == BODY_ZONE_PRECISE_MOUTH @@ -258,8 +249,67 @@ return FALSE if(HAS_TRAIT(user, TRAIT_CLUMSY) || is_clown_job(user.mind?.assigned_role)) return ..() - if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)) + if(do_fire_gun(user, user, FALSE, null, BODY_ZONE_HEAD)) user.visible_message(span_warning("[user] somehow manages to shoot [user.p_them()]self in the face!"), span_userdanger("You somehow shoot yourself in the face! How the hell?!")) - user.emote("scream") + user.emote("agony") user.drop_all_held_items() user.Paralyze(80) + + +/obj/item/gun/ballistic/revolver/single_action + name = "single action revolver" + + one_hand_rack = TRUE + auto_chamber = FALSE + + var/hammer_cocked = FALSE + +/obj/item/gun/ballistic/revolver/single_action/proc/toggle_hammer(mob/user) + PRIVATE_PROC(TRUE) + + if(hammer_cocked) + user?.visible_message(span_alert("[user] decocks the hammer of [src]."), vision_distance = COMBAT_MESSAGE_RANGE) + hammer_cocked = FALSE + update_appearance() + return + + user?.visible_message(span_alert("[user] cocks the hammer of [src]."), vision_distance = COMBAT_MESSAGE_RANGE) + hammer_cocked = TRUE + update_chamber(!chambered, TRUE, TRUE) + bolt.post_rack() + update_appearance() + +/obj/item/gun/ballistic/revolver/single_action/rack(mob/living/user) + toggle_hammer(user) + return TRUE + +/obj/item/gun/ballistic/revolver/single_action/can_fire() + if(!hammer_cocked) + return FALSE + return ..() + +/obj/item/gun/ballistic/revolver/single_action/shoot_with_empty_chamber(mob/living/user) + . = ..() + if(hammer_cocked) + toggle_hammer() + +/obj/item/gun/ballistic/revolver/single_action/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) + . = ..() + if(hammer_cocked) + toggle_hammer() + +/obj/item/gun/ballistic/revolver/single_action/dry_fire_feedback(mob/user) + if(!hammer_cocked) + to_chat(user, span_warning("[src]'s trigger won't budge.")) + return + return ..() + +//SEC REVOLVER +/obj/item/gun/ballistic/revolver/single_action/juno + name = "\improper 'Juno' Single-Action Revolver" + desc = "An incredibly durable .38 caliber single action revolver. First manufactured by Europan Arms for use onboard submarines, it's seen common use to this day due to being easy to manufacture and maintain." + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 + icon_state = "juno" + initial_caliber = CALIBER_38 + alternative_caliber = CALIBER_357 + alternative_ammo_misfires = FALSE diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index 4a7b81a9a2ac..adafe919cddb 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -7,39 +7,47 @@ worn_icon_state = "moistnugget" mag_type = /obj/item/ammo_box/magazine/internal/boltaction bolt_wording = "bolt" - bolt_type = BOLT_TYPE_LOCKING + bolt = /datum/gun_bolt/locking semi_auto = FALSE internal_magazine = TRUE fire_sound = 'sound/weapons/gun/rifle/shot.ogg' fire_sound_volume = 90 rack_sound = 'sound/weapons/gun/rifle/bolt_out.ogg' bolt_drop_sound = 'sound/weapons/gun/rifle/bolt_in.ogg' - tac_reloads = FALSE + + recoil = 1 + unwielded_recoil = 4 + + accuracy_falloff = 2 //Rifles are extremely accurate + unwielded_spread_bonus = 50 /obj/item/gun/ballistic/rifle/rack(mob/user = null) - if (bolt_locked == FALSE) + if (bolt.is_locked == FALSE) // The bolt is closed to_chat(user, span_notice("You open the bolt of \the [src].")) playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) - process_chamber(FALSE, FALSE, FALSE) - bolt_locked = TRUE + + update_chamber(FALSE, FALSE, FALSE) + + bolt.is_locked = TRUE update_appearance() return + drop_bolt(user) -/obj/item/gun/ballistic/rifle/can_shoot() - if (bolt_locked) +/obj/item/gun/ballistic/rifle/can_fire() + if(bolt.is_locked) return FALSE return ..() /obj/item/gun/ballistic/rifle/attackby(obj/item/A, mob/user, params) - if (!bolt_locked && !istype(A, /obj/item/stack/sheet/cloth)) + if (!bolt.is_locked && !istype(A, /obj/item/stack/sheet/cloth)) to_chat(user, span_notice("The bolt is closed!")) return return ..() /obj/item/gun/ballistic/rifle/examine(mob/user) . = ..() - . += "The bolt is [bolt_locked ? "open" : "closed"]." + . += "The bolt is [bolt.is_locked ? "open" : "closed"]." /////////////////////// // BOLT ACTION RIFLE // @@ -50,7 +58,6 @@ desc = "This piece of junk looks like something that could have been used 700 years ago. It feels slightly moist." sawn_desc = "An extremely sawn-off Mosin Nagant, popularly known as an \"Obrez\". \ There was probably a reason it wasn't manufactured this short to begin with." - weapon_weight = WEAPON_HEAVY icon_state = "moistnugget" inhand_icon_state = "moistnugget" slot_flags = ITEM_SLOT_BACK @@ -59,6 +66,8 @@ knife_x_offset = 27 knife_y_offset = 13 can_be_sawn_off = TRUE + unwielded_spread_bonus = 90 + var/jamming_chance = 20 var/unjam_chance = 10 var/jamming_increment = 5 @@ -85,7 +94,7 @@ return FALSE ..() -/obj/item/gun/ballistic/rifle/boltaction/process_fire(mob/user) +/obj/item/gun/ballistic/rifle/boltaction/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(can_jam) if(chambered.loaded_projectile) if(prob(jamming_chance)) @@ -96,18 +105,19 @@ /obj/item/gun/ballistic/rifle/boltaction/attackby(obj/item/item, mob/user, params) . = ..() - if(can_jam) - if(bolt_locked) - if(istype(item, /obj/item/gun_maintenance_supplies)) - if(do_after(user, 10 SECONDS, target = src)) - user.visible_message(span_notice("[user] finishes maintenance of [src].")) - jamming_chance = 10 - qdel(item) + if(!can_jam || !bolt.is_locked) + return + + if(istype(item, /obj/item/gun_maintenance_supplies)) + if(do_after(user, 10 SECONDS, target = src)) + user.visible_message(span_notice("[user] finishes maintenance of [src].")) + jamming_chance = 10 + qdel(item) /obj/item/gun/ballistic/rifle/boltaction/blow_up(mob/user) . = FALSE if(chambered?.loaded_projectile) - process_fire(user, user, FALSE) + do_fire_gun(user, user, FALSE) . = TRUE /obj/item/gun/ballistic/rifle/boltaction/harpoon @@ -154,7 +164,7 @@ inhand_y_dimension = 64 fire_sound = 'sound/weapons/gun/sniper/shot.ogg' mag_type = /obj/item/ammo_box/magazine/internal/boltaction/pipegun - initial_caliber = CALIBER_SHOTGUN + initial_caliber = CALIBER_12GAUGE alternative_caliber = CALIBER_A762 initial_fire_sound = 'sound/weapons/gun/sniper/shot.ogg' alternative_fire_sound = 'sound/weapons/gun/shotgun/shot.ogg' @@ -167,7 +177,7 @@ can_be_sawn_off = FALSE projectile_damage_multiplier = 0.75 -/obj/item/gun/ballistic/rifle/boltaction/pipegun/handle_chamber() +/obj/item/gun/ballistic/rifle/boltaction/pipegun/do_chamber_update() . = ..() do_sparks(1, TRUE, src) @@ -224,7 +234,7 @@ /obj/item/gun/ballistic/rifle/enchanted/attack_self() return -/obj/item/gun/ballistic/rifle/enchanted/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/ballistic/rifle/enchanted/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) . = ..() if(!.) return diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index fb35d14bae06..e9575f761266 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -22,15 +22,17 @@ casing_ejector = FALSE bolt_wording = "pump" cartridge_wording = "shell" - tac_reloads = FALSE - weapon_weight = WEAPON_HEAVY + + recoil = 1 + unwielded_recoil = 4 pb_knockback = 2 + unwielded_spread_bonus = 40 /obj/item/gun/ballistic/shotgun/blow_up(mob/user) . = 0 if(chambered?.loaded_projectile) - process_fire(user, user, FALSE) + do_fire_gun(user, user, FALSE) . = 1 /obj/item/gun/ballistic/shotgun/lethal @@ -50,7 +52,7 @@ // Automatic Shotguns// -/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user) +/obj/item/gun/ballistic/shotgun/automatic/after_firing(mob/living/user) ..() rack() @@ -114,7 +116,7 @@ to_chat(user, span_notice("You switch to tube A.")) /obj/item/gun/ballistic/shotgun/automatic/dual_tube/AltClick(mob/living/user) - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, TRUE)) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY|USE_NEED_HANDS)) return rack() @@ -130,12 +132,12 @@ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' inhand_x_dimension = 32 inhand_y_dimension = 32 - weapon_weight = WEAPON_MEDIUM + + gun_flags = NO_AKIMBO mag_type = /obj/item/ammo_box/magazine/m12g can_suppress = FALSE burst_size = 1 fire_delay = 0 - pin = /obj/item/firing_pin/implant/pindicate fire_sound = 'sound/weapons/gun/shotgun/shot_alt.ogg' actions_types = list() mag_display = TRUE @@ -145,7 +147,6 @@ mag_display_ammo = TRUE semi_auto = TRUE internal_magazine = FALSE - tac_reloads = TRUE ///the type of secondary magazine for the bulldog var/secondary_magazine_type ///the secondary magazine @@ -182,7 +183,7 @@ else . += "[icon_state]_no_secondary_mag" -/obj/item/gun/ballistic/shotgun/bulldog/handle_chamber() +/obj/item/gun/ballistic/shotgun/bulldog/do_chamber_update() if(!secondary_magazine) return ..() var/secondary_shells_left = LAZYLEN(secondary_magazine.stored_ammo) @@ -236,8 +237,6 @@ playsound(src, load_empty_sound, load_sound_volume, load_sound_vary) update_appearance() -/obj/item/gun/ballistic/shotgun/bulldog/unrestricted - pin = /obj/item/firing_pin ///////////////////////////// // DOUBLE BARRELED SHOTGUN // ///////////////////////////// @@ -248,7 +247,7 @@ icon_state = "dshotgun" inhand_icon_state = "shotgun_db" w_class = WEIGHT_CLASS_BULKY - weapon_weight = WEAPON_MEDIUM + gun_flags = NO_AKIMBO force = 10 flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK @@ -256,28 +255,11 @@ sawn_desc = "Omar's coming!" obj_flags = UNIQUE_RENAME rack_sound_volume = 0 - unique_reskin = list("Default" = "dshotgun", - "Dark Red Finish" = "dshotgun_d", - "Ash" = "dshotgun_f", - "Faded Grey" = "dshotgun_g", - "Maple" = "dshotgun_l", - "Rosewood" = "dshotgun_p" - ) semi_auto = TRUE - bolt_type = BOLT_TYPE_NO_BOLT + bolt = /datum/gun_bolt/no_bolt can_be_sawn_off = TRUE pb_knockback = 3 // it's a super shotgun! -/obj/item/gun/ballistic/shotgun/doublebarrel/AltClick(mob/user) - . = ..() - if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) - reskin_obj(user) - -/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user) - . = ..() - if(.) - weapon_weight = WEAPON_MEDIUM - /obj/item/gun/ballistic/shotgun/doublebarrel/slugs name = "hunting shotgun" desc = "A hunting shotgun used by the wealthy to hunt \"game\"." @@ -294,7 +276,7 @@ inhand_x_dimension = 32 inhand_y_dimension = 32 mag_type = /obj/item/ammo_box/magazine/internal/shot/bounty - weapon_weight = WEAPON_MEDIUM + gun_flags = NO_AKIMBO semi_auto = TRUE flags_1 = CONDUCT_1 force = 18 //it has a hook on it diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 61eb79038757..e88a79d5256f 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -15,9 +15,6 @@ gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN casing_ejector = FALSE -/obj/item/gun/ballistic/automatic/toy/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/automatic/pistol/toy name = "foam force pistol" desc = "A small, easily concealable toy handgun. Ages 8 and up." @@ -25,13 +22,6 @@ fire_sound = 'sound/items/syringeproj.ogg' gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN -/obj/item/gun/ballistic/automatic/pistol/toy/riot - mag_type = /obj/item/ammo_box/magazine/toy/pistol/riot - -/obj/item/gun/ballistic/automatic/pistol/riot/Initialize(mapload) - magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src) - return ..() - /obj/item/gun/ballistic/shotgun/toy name = "foam force shotgun" desc = "A toy shotgun with wood furniture and a four-shell capacity underneath. Ages 8 and up." @@ -43,18 +33,14 @@ item_flags = NONE casing_ejector = FALSE can_suppress = FALSE - weapon_weight = WEAPON_LIGHT pb_knockback = 0 gun_flags = TOY_FIREARM_OVERLAY | NOT_A_REAL_GUN -/obj/item/gun/ballistic/shotgun/toy/handle_chamber() +/obj/item/gun/ballistic/shotgun/toy/do_chamber_update() . = ..() if(chambered && !chambered.loaded_projectile) qdel(chambered) -/obj/item/gun/ballistic/shotgun/toy/unrestricted - pin = /obj/item/firing_pin - /obj/item/gun/ballistic/shotgun/toy/crossbow name = "foam force crossbow" desc = "A weapon favored by many overactive children. Ages 8 and up." @@ -78,32 +64,18 @@ desc = "A bullpup three-round burst toy SMG, designated 'C-20r'. Ages 8 and up." can_suppress = TRUE item_flags = NONE - mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot + mag_type = /obj/item/ammo_box/magazine/toy/smgm45 casing_ejector = FALSE clumsy_check = FALSE gun_flags = TOY_FIREARM_OVERLAY|NOT_A_REAL_GUN -/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted //Use this for actual toys - pin = /obj/item/firing_pin - mag_type = /obj/item/ammo_box/magazine/toy/smgm45 - -/obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot - mag_type = /obj/item/ammo_box/magazine/toy/smgm45/riot - /obj/item/gun/ballistic/automatic/l6_saw/toy //This is the syndicate variant with syndicate firing pin and riot darts. name = "donksoft LMG" desc = "A heavily modified toy light machine gun, designated 'L6 SAW'. Ages 8 and up." fire_sound = 'sound/items/syringeproj.ogg' can_suppress = FALSE item_flags = NONE - mag_type = /obj/item/ammo_box/magazine/toy/m762/riot + mag_type = /obj/item/ammo_box/magazine/toy/m762 casing_ejector = FALSE clumsy_check = FALSE gun_flags = TOY_FIREARM_OVERLAY|NOT_A_REAL_GUN - -/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted //Use this for actual toys - pin = /obj/item/firing_pin - mag_type = /obj/item/ammo_box/magazine/toy/m762 - -/obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot - mag_type = /obj/item/ammo_box/magazine/toy/m762/riot diff --git a/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm b/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm new file mode 100644 index 000000000000..eb0bf40524f7 --- /dev/null +++ b/code/modules/projectiles/guns/bolt_types/_gun_bolt.dm @@ -0,0 +1,52 @@ +///Gun has a bolt, it stays closed while not cycling. The gun must be racked to have a bullet chambered when a mag is inserted. +/// Example: c20, shotguns, m90 +/datum/gun_bolt + var/obj/item/gun/ballistic/parent + var/is_locked = FALSE + +/datum/gun_bolt/New(obj/item/gun/parent) + src.parent = parent + +/datum/gun_bolt/Destroy(force, ...) + parent = null + return ..() + +/// Returns overlays for a gun's update_overlays() +/datum/gun_bolt/proc/get_overlays() + return + +/// Called during attack_self(). Return TRUE to cancel the rest of the proc. +/datum/gun_bolt/proc/attack_self(mob/living/user) + return + +/// Called at the start of rack(), return TRUE to cancel the rest of the proc. +/datum/gun_bolt/proc/pre_rack(mob/user) + return + +/// Called after rack(), before update_appearance() +/datum/gun_bolt/proc/post_rack(mob/user) + playsound(parent, parent.rack_sound, parent.rack_sound_volume, parent.rack_sound_vary) + +/// Called when ammo was successfully loaded into the weapon. +/datum/gun_bolt/proc/loaded_ammo() + return + +/// Called after a magazine is successfully inserted into the firearm. +/datum/gun_bolt/proc/magazine_inserted() + return + +/// Called when a magazine is about to be ejected. +/datum/gun_bolt/proc/magazine_ejected() + return + +/// Called at the start of unload(), return TRUE to cancel the rest of the proc. +/datum/gun_bolt/proc/unload(mob/user) + return + +/// Called during before_firing() +/datum/gun_bolt/proc/before_firing() + return + +/// Called at the foot of after_chambering() +/datum/gun_bolt/proc/after_chambering() + return diff --git a/code/modules/projectiles/guns/bolt_types/locking_bolt.dm b/code/modules/projectiles/guns/bolt_types/locking_bolt.dm new file mode 100644 index 000000000000..318ca769eaed --- /dev/null +++ b/code/modules/projectiles/guns/bolt_types/locking_bolt.dm @@ -0,0 +1,23 @@ +///Gun has a bolt, it locks back when empty. It can be released to chamber a round if a magazine is in. +/// Example: Pistols with a slide lock, some SMGs +/datum/gun_bolt/locking + +/datum/gun_bolt/locking/get_overlays() + return "[parent.icon_state]_bolt[is_locked ? "_locked" : ""]" + +/datum/gun_bolt/locking/post_rack(mob/user) + if (parent.chambered) + return ..() + + is_locked = TRUE + playsound(parent, parent.lock_back_sound, parent.lock_back_sound_volume, parent.lock_back_sound_vary) + +/datum/gun_bolt/locking/after_chambering() + if (!parent.chambered && !parent.get_ammo()) + is_locked = TRUE + parent.update_appearance() + +/datum/gun_bolt/locking/attack_self(mob/living/user) + if(is_locked) + parent.drop_bolt(user) + return TRUE diff --git a/code/modules/projectiles/guns/bolt_types/no_bolt.dm b/code/modules/projectiles/guns/bolt_types/no_bolt.dm new file mode 100644 index 000000000000..30114709bfe3 --- /dev/null +++ b/code/modules/projectiles/guns/bolt_types/no_bolt.dm @@ -0,0 +1,35 @@ + +///Gun has no moving bolt mechanism, it cannot be racked. Also dumps the entire contents when emptied instead of a magazine. +/// Example: Break action shotguns, revolvers +/datum/gun_bolt/no_bolt + +/datum/gun_bolt/no_bolt/pre_rack(mob/user) + return TRUE // There's nothing to rack, it's boltless. + +/datum/gun_bolt/no_bolt/loaded_ammo() + if (isnull(parent.chambered)) + parent.chamber_round() + +/datum/gun_bolt/no_bolt/unload(mob/user) + . = TRUE // No matter what happens we're cancelling the call + if(!parent.wielded && !user.get_empty_held_index()) + to_chat(user, span_warning("You need a free hand to do that!")) + return + + parent.chambered = null + var/num_unloaded = 0 + + for(var/obj/item/ammo_casing/CB in parent.get_ammo_list(FALSE, TRUE)) + CB.forceMove(parent.drop_location()) + CB.bounce_away(FALSE, NONE) + num_unloaded++ + var/turf/T = get_turf(parent.drop_location()) + if(T && is_station_level(T.z)) + SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name) + + if (num_unloaded) + to_chat(user, span_notice("You unload [num_unloaded] [parent.cartridge_wording]\s from [parent].")) + playsound(parent, parent.eject_sound, parent.eject_sound_volume, parent.eject_sound_vary) + parent.update_appearance() + else + to_chat(user, span_warning("[parent] is empty!")) diff --git a/code/modules/projectiles/guns/bolt_types/open_bolt.dm b/code/modules/projectiles/guns/bolt_types/open_bolt.dm new file mode 100644 index 000000000000..02f017b7efc8 --- /dev/null +++ b/code/modules/projectiles/guns/bolt_types/open_bolt.dm @@ -0,0 +1,28 @@ +///Gun has a bolt, it is open when ready to fire. The gun can never have a chambered bullet with no magazine, but the bolt stays ready when a mag is removed. +/// Example: Some SMGs, the L6 +/datum/gun_bolt/open + +/datum/gun_bolt/open/get_overlays() + if(is_locked) + return "[parent.icon_state]_bolt" + +/datum/gun_bolt/open/pre_rack(mob/user) + if(!is_locked) //If it's an open bolt, racking again would do nothing + if (user) + to_chat(user, span_notice("[parent]'s [parent.bolt_wording] is already cocked!")) + return + + is_locked = FALSE + +/datum/gun_bolt/open/magazine_inserted() + if(!is_locked) + parent.chamber_round(TRUE) + +/datum/gun_bolt/open/magazine_ejected() + parent.chambered = null + +/datum/gun_bolt/open/before_firing() + if (!parent.chambered && !parent.get_ammo() && !is_locked) + is_locked = TRUE + playsound(parent, parent.bolt_drop_sound, parent.bolt_drop_sound_volume) + parent.update_appearance() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 45cf88d4355e..b8eb68d96641 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -34,7 +34,7 @@ ///set to true so the gun is given an empty cell var/dead_cell = FALSE -/obj/item/gun/energy/fire_sounds() +/obj/item/gun/energy/play_fire_sound() // What frequency the energy gun's sound will make var/frequency_to_use @@ -71,12 +71,16 @@ cell = new cell_type(src) else cell = new(src) + if(!dead_cell) cell.give(cell.maxcharge) + update_ammo_types() recharge_newshot(TRUE) + if(selfcharge) START_PROCESSING(SSobj, src) + update_appearance() RegisterSignal(src, COMSIG_ITEM_RECHARGED, PROC_REF(instant_recharge)) AddElement(/datum/element/update_icon_updates_onmob) @@ -87,6 +91,7 @@ var/shottype = ammo_type[i] shot = new shottype(src) ammo_type[i] = shot + shot = ammo_type[select] fire_sound = shot.fire_sound fire_delay = shot.delay @@ -94,12 +99,14 @@ /obj/item/gun/energy/Destroy() if (cell) QDEL_NULL(cell) + STOP_PROCESSING(SSobj, src) // Intentional cast. // Sometimes ammo_type has paths, sometimes it has atom. for (var/atom/item in ammo_type) qdel(item) + ammo_type = null return ..() @@ -111,34 +118,39 @@ return ..() /obj/item/gun/energy/process(delta_time) - if(selfcharge && cell && cell.percent() < 100) - charge_timer += delta_time - if(charge_timer < charge_delay) - return - charge_timer = 0 - cell.give(100) - if(!chambered) //if empty chamber we try to charge a new shot - recharge_newshot(TRUE) - update_appearance() + if(!selfcharge || !cell || !(cell.percent() < 100)) + return + + charge_timer += delta_time + if(charge_timer < charge_delay) + return + + charge_timer = 0 + cell.give(100) + + if(!chambered) //if empty chamber we try to charge a new shot + recharge_newshot(TRUE) + + update_appearance() /obj/item/gun/energy/attack_self(mob/living/user as mob) if(ammo_type.len > 1 && can_select) select_fire(user) -/obj/item/gun/energy/can_shoot() +/obj/item/gun/energy/can_fire() var/obj/item/ammo_casing/energy/shot = ammo_type[select] return !QDELETED(cell) ? (cell.charge >= shot.e_cost) : FALSE /obj/item/gun/energy/recharge_newshot(no_cyborg_drain) if (!ammo_type || !cell) return - if(use_cyborg_cell && !no_cyborg_drain) - if(iscyborg(loc)) - var/mob/living/silicon/robot/R = loc - if(R.cell) - var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot - if(R.cell.use(shot.e_cost)) //Take power from the borg... - cell.give(shot.e_cost) //... to recharge the shot + if(use_cyborg_cell && !no_cyborg_drain && iscyborg(loc)) + var/mob/living/silicon/robot/R = loc + if(R.cell) + var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot + if(R.cell.use(shot.e_cost)) //Take power from the borg... + cell.give(shot.e_cost) //... to recharge the shot + if(!chambered) var/obj/item/ammo_casing/energy/AC = ammo_type[select] if(cell.charge >= AC.e_cost) //if there's enough power in the cell cell... @@ -146,32 +158,40 @@ if(!chambered.loaded_projectile) chambered.newshot() -/obj/item/gun/energy/handle_chamber() +/obj/item/gun/energy/do_chamber_update() if(chambered && !chambered.loaded_projectile) //if loaded_projectile is null, i.e the shot has been fired... var/obj/item/ammo_casing/energy/shot = chambered cell.use(shot.e_cost)//... drain the cell cell + chambered = null //either way, released the prepared shot recharge_newshot() //try to charge a new shot -/obj/item/gun/energy/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) - if(!chambered && can_shoot()) - process_chamber() // If the gun was drained and then recharged, load a new shot. +/obj/item/gun/energy/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) + if(!chambered && can_fire()) + update_chamber() // If the gun was drained and then recharged, load a new shot. return ..() -/obj/item/gun/energy/process_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) - if(!chambered && can_shoot()) - process_chamber() // Ditto. +/obj/item/gun/energy/do_fire_in_burst(mob/living/user, atom/target, message = TRUE, params = null, zone_override="", sprd = 0, randomized_gun_spread = 0, randomized_bonus_spread = 0, rand_spr = 0, iteration = 0) + if(!chambered && can_fire()) + update_chamber() // Ditto. return ..() +/obj/item/gun/energy/after_firing(mob/living/user, pointblank, atom/pbtarget, message) + . = ..() + AddComponent(/datum/component/smell, INTENSITY_NORMAL, SCENT_ODOR, "ozone", 1, 5 MINUTES) + /obj/item/gun/energy/proc/select_fire(mob/living/user) select++ if (select > ammo_type.len) select = 1 + var/obj/item/ammo_casing/energy/shot = ammo_type[select] fire_sound = shot.fire_sound fire_delay = shot.delay + if (shot.select_name && user) balloon_alert(user, "set to [shot.select_name]") + chambered = null recharge_newshot(TRUE) update_appearance() @@ -213,9 +233,11 @@ if(ratio == 0 && display_empty) . += "[icon_state]_empty" return + if(shaded_charge) . += "[icon_state]_charge[ratio]" return + var/mutable_appearance/charge_overlay = mutable_appearance(icon, overlay_icon_state) for(var/i = ratio, i >= 1, i--) charge_overlay.pixel_x = ammo_x_offset * (i - 1) @@ -225,11 +247,11 @@ ///Used by update_icon_state() and update_overlays() /obj/item/gun/energy/proc/get_charge_ratio() - return can_shoot() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 + return can_fire() ? CEILING(clamp(cell.charge / cell.maxcharge, 0, 1) * charge_sections, 1) : 0 // Sets the ratio to 0 if the gun doesn't have enough charge to fire, or if its power cell is removed. /obj/item/gun/energy/suicide_act(mob/living/user) - if(istype(user) && can_shoot() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) + if(istype(user) && can_fire() && can_trigger_gun(user) && user.get_bodypart(BODY_ZONE_HEAD)) user.visible_message(span_suicide("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")) sleep(2.5 SECONDS) if(user.is_holding(src)) @@ -239,9 +261,11 @@ cell.use(shot.e_cost) update_appearance() return FIRELOSS + else user.visible_message(span_suicide("[user] panics and starts choking to death!")) return OXYLOSS + else user.visible_message(span_suicide("[user] is pretending to melt [user.p_their()] face off with [src]! It looks like [user.p_theyre()] trying to commit suicide!
")) playsound(src, dry_fire_sound, 30, TRUE) @@ -258,37 +282,39 @@ /obj/item/gun/energy/ignition_effect(atom/A, mob/living/user) - if(!can_shoot() || !ammo_type[select]) + if(!can_fire() || !ammo_type[select]) shoot_with_empty_chamber() . = "" + return + + var/obj/item/ammo_casing/energy/E = ammo_type[select] + var/obj/projectile/energy/loaded_projectile = E.loaded_projectile + if(!loaded_projectile) + . = "" + else if(loaded_projectile.nodamage || !loaded_projectile.damage || loaded_projectile.damage_type == STAMINA) + user.visible_message(span_danger("[user] tries to light [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src], but it doesn't do anything. Dumbass.")) + playsound(user, E.fire_sound, 50, TRUE) + playsound(user, loaded_projectile.hitsound, 50, TRUE) + cell.use(E.e_cost) + . = "" + else if(loaded_projectile.damage_type != BURN) + user.visible_message(span_danger("[user] tries to light [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src], but only succeeds in utterly destroying it. Dumbass.")) + playsound(user, E.fire_sound, 50, TRUE) + playsound(user, loaded_projectile.hitsound, 50, TRUE) + cell.use(E.e_cost) + qdel(A) + . = "" else - var/obj/item/ammo_casing/energy/E = ammo_type[select] - var/obj/projectile/energy/loaded_projectile = E.loaded_projectile - if(!loaded_projectile) - . = "" - else if(loaded_projectile.nodamage || !loaded_projectile.damage || loaded_projectile.damage_type == STAMINA) - user.visible_message(span_danger("[user] tries to light [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src], but it doesn't do anything. Dumbass.")) - playsound(user, E.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(E.e_cost) - . = "" - else if(loaded_projectile.damage_type != BURN) - user.visible_message(span_danger("[user] tries to light [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src], but only succeeds in utterly destroying it. Dumbass.")) - playsound(user, E.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(E.e_cost) - qdel(A) - . = "" - else - playsound(user, E.fire_sound, 50, TRUE) - playsound(user, loaded_projectile.hitsound, 50, TRUE) - cell.use(E.e_cost) - . = span_danger("[user] casually lights [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src]. Damn.") + playsound(user, E.fire_sound, 50, TRUE) + playsound(user, loaded_projectile.hitsound, 50, TRUE) + cell.use(E.e_cost) + . = span_danger("[user] casually lights [A.loc == user ? "[user.p_their()] [A.name]" : A] with [src]. Damn.") /obj/item/gun/energy/proc/instant_recharge() SIGNAL_HANDLER if(!cell) return + cell.charge = cell.maxcharge recharge_newshot(no_cyborg_drain = TRUE) update_appearance() diff --git a/code/modules/projectiles/guns/energy/beam_rifle.dm b/code/modules/projectiles/guns/energy/beam_rifle.dm index ded186f52244..6584247ce4b6 100644 --- a/code/modules/projectiles/guns/energy/beam_rifle.dm +++ b/code/modules/projectiles/guns/energy/beam_rifle.dm @@ -25,7 +25,7 @@ ammo_y_offset = 3 modifystate = FALSE charge_sections = 1 - weapon_weight = WEAPON_HEAVY + unwielded_spread_bonus = 30 w_class = WEIGHT_CLASS_BULKY ammo_type = list(/obj/item/ammo_casing/energy/beam_rifle/hitscan) actions_types = list(/datum/action/item_action/zoom_lock_action) @@ -459,14 +459,16 @@ var/turf/closed/wall/W = A W.dismantle_wall(TRUE, TRUE) else - SSexplosions.medturf += A + EX_ACT(A, EXPLODE_HEAVY) ++wall_pierce return PROJECTILE_PIERCE_PHASE // yeah this gun is a snowflakey piece of garbage + if(isobj(A) && (structure_pierce < structure_pierce_amount)) ++structure_pierce var/obj/O = A O.take_damage((impact_structure_damage + aoe_structure_damage) * structure_bleed_coeff * get_damage_coeff(A), BURN, ENERGY, FALSE) return PROJECTILE_PIERCE_PHASE // ditto and this could be refactored to on_hit honestly + return ..() /obj/projectile/beam/beam_rifle/proc/get_damage_coeff(atom/target) diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm index 6d4125a4b423..9217e16d8063 100644 --- a/code/modules/projectiles/guns/energy/dueling.dm +++ b/code/modules/projectiles/guns/energy/dueling.dm @@ -21,7 +21,7 @@ var/pairing_code = "" /datum/duel/New(new_gun_A, new_gun_B) - pairing_code = SSnetworks.assign_random_name() + pairing_code = SSpackets.generate_net_id(src) gun_A = new_gun_A gun_B = new_gun_B @@ -246,7 +246,7 @@ return FALSE return TRUE -/obj/item/gun/energy/dueling/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) +/obj/item/gun/energy/dueling/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) if(!check_valid_duel(user, TRUE)) return if(duel.state == DUEL_READY) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index f9e4116da5c5..959121c817bb 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -100,7 +100,6 @@ slot_flags = null w_class = WEIGHT_CLASS_HUGE ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser) - weapon_weight = WEAPON_HEAVY trigger_guard = TRIGGER_GUARD_NONE ammo_x_offset = 2 @@ -126,7 +125,7 @@ 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) +/obj/item/gun/energy/e_gun/nuclear/after_firing(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) failcheck() update_appearance() ..() diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm deleted file mode 100644 index c2c23ef9bc38..000000000000 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ /dev/null @@ -1,590 +0,0 @@ -/obj/item/gun/energy/recharge/kinetic_accelerator - name = "proto-kinetic accelerator" - desc = "A self recharging, ranged mining tool that does increased damage in low pressure." - icon_state = "kineticgun" - base_icon_state = "kineticgun" - inhand_icon_state = "kineticgun" - ammo_type = list(/obj/item/ammo_casing/energy/kinetic) - item_flags = NONE - obj_flags = UNIQUE_RENAME - weapon_weight = WEAPON_LIGHT - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 - var/mob/holder - var/max_mod_capacity = 100 - var/list/modkits = list() - gun_flags = NOT_A_REAL_GUN - -/obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) - . = ..() - - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - rmb_text = "Detach a modkit", \ - ) - - var/static/list/tool_behaviors = list( - TOOL_CROWBAR = list( - SCREENTIP_CONTEXT_LMB = "Eject all modkits", - ), - ) - AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) - -/obj/item/gun/energy/recharge/kinetic_accelerator/shoot_with_empty_chamber(mob/living/user) - playsound(src, dry_fire_sound, 30, TRUE) //click sound but no to_chat message to cut on spam - return - -/obj/item/gun/energy/recharge/kinetic_accelerator/add_seclight_point() - AddComponent(/datum/component/seclite_attachable, \ - light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ - light_overlay = "flight", \ - overlay_x = 15, \ - overlay_y = 9) - -/obj/item/gun/energy/recharge/kinetic_accelerator/examine(mob/user) - . = ..() - if(max_mod_capacity) - . += "[get_remaining_mod_capacity()]% mod capacity remaining." - . += span_info("You can use a crowbar to remove all modules or right-click with an empty hand to remove a specific one.") - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - . += span_notice("There is \a [M] installed, using [M.cost]% capacity.") - -/obj/item/gun/energy/recharge/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I) - . = TRUE - if(modkits.len) - to_chat(user, span_notice("You pry all the modifications out.")) - I.play_tool_sound(src, 100) - for(var/a in modkits) - var/obj/item/borg/upgrade/modkit/M = a - M.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs - else - to_chat(user, span_notice("There are no modifications currently installed.")) - -/obj/item/gun/energy/recharge/kinetic_accelerator/attack_hand_secondary(mob/user, list/modifiers) - . = ..() - if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - if(!LAZYLEN(modkits)) - return SECONDARY_ATTACK_CONTINUE_CHAIN - - var/list/display_names = list() - var/list/items = list() - for(var/modkits_length in 1 to length(modkits)) - var/obj/item/thing = modkits[modkits_length] - display_names["[thing.name] ([modkits_length])"] = REF(thing) - var/image/item_image = image(icon = thing.icon, icon_state = thing.icon_state) - if(length(thing.overlays)) - item_image.copy_overlays(thing) - items["[thing.name] ([modkits_length])"] = item_image - - var/pick = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 36, require_near = TRUE, tooltips = TRUE) - if(!pick) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - var/modkit_reference = display_names[pick] - var/obj/item/borg/upgrade/modkit/modkit_to_remove = locate(modkit_reference) in modkits - if(!istype(modkit_to_remove)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!user.put_in_hands(modkit_to_remove)) - modkit_to_remove.forceMove(drop_location()) - update_appearance(UPDATE_ICON) - - - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - -/obj/item/gun/energy/recharge/kinetic_accelerator/proc/check_menu(mob/living/carbon/human/user) - if(!istype(user)) - return FALSE - if(user.incapacitated()) - return FALSE - return TRUE - -/obj/item/gun/energy/recharge/kinetic_accelerator/Exited(atom/movable/gone, direction) - if(gone in modkits) - var/obj/item/borg/upgrade/modkit/MK = gone - MK.uninstall(src) - return ..() - -/obj/item/gun/energy/recharge/kinetic_accelerator/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/borg/upgrade/modkit)) - var/obj/item/borg/upgrade/modkit/MK = I - MK.install(src, user) - else - ..() - -/obj/item/gun/energy/recharge/kinetic_accelerator/proc/get_remaining_mod_capacity() - var/current_capacity_used = 0 - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - current_capacity_used += M.cost - return max_mod_capacity - current_capacity_used - -/obj/item/gun/energy/recharge/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/K) - K.kinetic_gun = src //do something special on-hit, easy! - for(var/A in modkits) - var/obj/item/borg/upgrade/modkit/M = A - M.modify_projectile(K) - -/obj/item/gun/energy/recharge/kinetic_accelerator/cyborg - icon_state = "kineticgun_b" - holds_charge = TRUE - unique_frequency = TRUE - max_mod_capacity = 80 - -/obj/item/gun/energy/recharge/kinetic_accelerator/minebot - trigger_guard = TRIGGER_GUARD_ALLOW_ALL - recharge_time = 2 SECONDS - holds_charge = TRUE - unique_frequency = TRUE - -//Casing -/obj/item/ammo_casing/energy/kinetic - projectile_type = /obj/projectile/kinetic - select_name = "kinetic" - e_cost = 500 - fire_sound = 'sound/weapons/kenetic_accel.ogg' // fine spelling there chap - -/obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - ..() - if(loc && istype(loc, /obj/item/gun/energy/recharge/kinetic_accelerator)) - var/obj/item/gun/energy/recharge/kinetic_accelerator/KA = loc - KA.modify_projectile(loaded_projectile) - -//Projectiles -/obj/projectile/kinetic - name = "kinetic force" - icon_state = null - damage = 40 - damage_type = BRUTE - armor_flag = BOMB - range = 3 - log_override = TRUE - - var/pressure_decrease_active = FALSE - var/pressure_decrease = 0.25 - var/obj/item/gun/energy/recharge/kinetic_accelerator/kinetic_gun - -/obj/projectile/kinetic/Destroy() - kinetic_gun = null - return ..() - -/obj/projectile/kinetic/prehit_pierce(atom/target) - . = ..() - if(. == PROJECTILE_PIERCE_PHASE) - return - if(kinetic_gun) - var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/modkit in mods) - modkit.projectile_prehit(src, target, kinetic_gun) - if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) - name = "weakened [name]" - damage = damage * pressure_decrease - pressure_decrease_active = TRUE - -/obj/projectile/kinetic/on_range() - strike_thing() - ..() - -/obj/projectile/kinetic/on_hit(atom/target) - strike_thing(target) - . = ..() - -/obj/projectile/kinetic/proc/strike_thing(atom/target) - var/turf/target_turf = get_turf(target) - if(!target_turf) - target_turf = get_turf(src) - if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. - var/list/mods = kinetic_gun.modkits - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike_predamage(src, target_turf, target, kinetic_gun) - for(var/obj/item/borg/upgrade/modkit/M in mods) - M.projectile_strike(src, target_turf, target, kinetic_gun) - if(ismineralturf(target_turf)) - var/turf/closed/mineral/M = target_turf - M.gets_drilled(firer, TRUE) - if(iscarbon(firer)) - var/mob/living/carbon/carbon_firer = firer - var/skill_modifier = 1 - // If there is a mind, check for skill modifier to allow them to reload faster. - if(carbon_firer.mind) - skill_modifier = carbon_firer.mind.get_skill_modifier(/datum/skill/mining, SKILL_SPEED_MODIFIER) - kinetic_gun.attempt_reload(kinetic_gun.recharge_time * skill_modifier) //If you hit a mineral, you might get a quicker reload. epic gamer style. - var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) - K.color = color - -//mecha_kineticgun version of the projectile -/obj/projectile/kinetic/mech - range = 5 - -//Modkits -/obj/item/borg/upgrade/modkit - name = "kinetic accelerator modification kit" - desc = "An upgrade for kinetic accelerators." - icon = 'icons/obj/objects.dmi' - icon_state = "modkit" - w_class = WEIGHT_CLASS_SMALL - require_model = TRUE - model_type = list(/obj/item/robot_model/miner) - model_flags = BORG_MODEL_MINER - var/denied_type = null - var/maximum_of_type = 1 - var/cost = 30 - var/modifier = 1 //For use in any mod kit that has numerical modifiers - var/minebot_upgrade = TRUE - var/minebot_exclusive = FALSE - -/obj/item/borg/upgrade/modkit/examine(mob/user) - . = ..() - . += span_notice("Occupies [cost]% of mod capacity.") - -/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) - if(istype(A, /obj/item/gun/energy/recharge/kinetic_accelerator) && !issilicon(user)) - install(A, user) - else - ..() - -/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) - . = ..() - if (.) - for(var/obj/item/gun/energy/recharge/kinetic_accelerator/cyborg/H in R.model.modules) - return install(H, usr, FALSE) - -/obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user, transfer_to_loc = TRUE) - . = TRUE - if(minebot_upgrade) - if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) - to_chat(user, span_notice("The modkit you're trying to install is only rated for minebot use.")) - return FALSE - else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) - to_chat(user, span_notice("The modkit you're trying to install is not rated for minebot use.")) - return FALSE - if(denied_type) - var/number_of_denied = 0 - for(var/A in KA.modkits) - var/obj/item/borg/upgrade/modkit/M = A - if(istype(M, denied_type)) - number_of_denied++ - if(number_of_denied >= maximum_of_type) - . = FALSE - break - if(KA.get_remaining_mod_capacity() >= cost) - if(.) - if(transfer_to_loc && !user.transferItemToLoc(src, KA)) - return - to_chat(user, span_notice("You install the modkit.")) - playsound(loc, 'sound/items/screwdriver.ogg', 100, TRUE) - KA.modkits += src - else - to_chat(user, span_notice("The modkit you're trying to install would conflict with an already installed modkit. Remove existing modkits first.")) - else - to_chat(user, span_notice("You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar or right click with an empty hand to remove existing modkits.")) - . = FALSE - -/obj/item/borg/upgrade/modkit/deactivate(mob/living/silicon/robot/R, user = usr) - . = ..() - if (.) - for(var/obj/item/gun/energy/recharge/kinetic_accelerator/cyborg/KA in R.model.modules) - uninstall(KA) - -/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) - KA.modkits -= src - -/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/projectile/kinetic/K) - -//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure -/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) -//use this one for effects you want to trigger before mods that do damage -/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) -//and this one for things that don't need to trigger before other damage-dealing mods -/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - -//Range -/obj/item/borg/upgrade/modkit/range - name = "range increase" - desc = "Increases the range of a kinetic accelerator when installed." - modifier = 1 - cost = 25 - -/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/projectile/kinetic/K) - K.range += modifier - - -//Damage -/obj/item/borg/upgrade/modkit/damage - name = "damage increase" - desc = "Increases the damage of kinetic accelerator when installed." - modifier = 10 - -/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/projectile/kinetic/K) - K.damage += modifier - - -//Cooldown -/obj/item/borg/upgrade/modkit/cooldown - name = "cooldown decrease" - desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use." - modifier = 3.2 - minebot_upgrade = FALSE - -/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user) - . = ..() - if(.) - KA.recharge_time -= modifier - -/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) - KA.recharge_time += modifier - ..() - -/obj/item/borg/upgrade/modkit/cooldown/minebot - name = "minebot cooldown decrease" - desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot - modifier = 10 - cost = 0 - minebot_upgrade = TRUE - minebot_exclusive = TRUE - - -//AoE blasts -/obj/item/borg/upgrade/modkit/aoe - modifier = 0 - var/turf_aoe = FALSE - var/stats_stolen = FALSE - -/obj/item/borg/upgrade/modkit/aoe/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user) - . = ..() - if(.) - for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple - if(AOE.stats_stolen || AOE == src) - continue - modifier += AOE.modifier //take its modifiers - AOE.modifier = 0 - turf_aoe += AOE.turf_aoe - AOE.turf_aoe = FALSE - AOE.stats_stolen = TRUE - -/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) - ..() - modifier = initial(modifier) //get our modifiers back - turf_aoe = initial(turf_aoe) - stats_stolen = FALSE - -/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/projectile/kinetic/K) - K.name = "kinetic explosion" - -/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - if(stats_stolen) - 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, TRUE) - 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.armor_flag, "", "", K.armour_penetration) - L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) - to_chat(L, span_userdanger("You're struck by a [K.name]!")) - -/obj/item/borg/upgrade/modkit/aoe/turfs - name = "mining explosion" - desc = "Causes the kinetic accelerator to destroy rock in an AoE." - denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs - turf_aoe = TRUE - -/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs - name = "offensive mining explosion" - desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE." - maximum_of_type = 3 - modifier = 0.25 - -/obj/item/borg/upgrade/modkit/aoe/mobs - name = "offensive explosion" - desc = "Causes the kinetic accelerator to damage mobs in an AoE." - modifier = 0.2 - -//Minebot passthrough -/obj/item/borg/upgrade/modkit/minebot_passthrough - name = "minebot passthrough" - desc = "Causes kinetic accelerator shots to pass through minebots." - cost = 0 - -//Tendril-unique modules -/obj/item/borg/upgrade/modkit/cooldown/repeater - name = "rapid repeater" - desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown." - denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater - modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. - cost = 50 - -/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - var/valid_repeat = FALSE - if(isliving(target)) - var/mob/living/L = target - if(L.stat != DEAD) - valid_repeat = TRUE - if(ismineralturf(target_turf)) - valid_repeat = TRUE - if(valid_repeat) - KA.cell.use(KA.cell.charge) - KA.attempt_reload(KA.recharge_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. - -/obj/item/borg/upgrade/modkit/lifesteal - name = "lifesteal crystal" - desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target." - icon_state = "modkit_crystal" - modifier = 2.5 //Not a very effective method of healing. - cost = 20 - var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) - -/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - if(isliving(target) && isliving(K.firer)) - var/mob/living/L = target - if(L.stat == DEAD) - return - L = K.firer - L.heal_ordered_damage(modifier, damage_heal_order) - -/obj/item/borg/upgrade/modkit/resonator_blasts - name = "resonator blast" - desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts." - denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts - cost = 30 - modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it. - -/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs. - var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf - if(R) - R.damage_multiplier = modifier - R.burst() - return - new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, RESONATOR_MODE_MANUAL, 100) //manual detonate mode and will NOT spread - -/obj/item/borg/upgrade/modkit/bounty - name = "death syphon" - desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature." - denied_type = /obj/item/borg/upgrade/modkit/bounty - modifier = 1.25 - cost = 30 - var/maximum_bounty = 25 - var/list/bounties_reaped = list() - -/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - if(isliving(target)) - var/mob/living/L = target - var/list/existing_marks = L.has_status_effect_list(/datum/status_effect/syphon_mark) - for(var/i in existing_marks) - var/datum/status_effect/syphon_mark/SM = i - if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward - SM.reward_target = null - qdel(SM) - L.apply_status_effect(/datum/status_effect/syphon_mark, src) - -/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) - if(isliving(target)) - var/mob/living/L = target - if(bounties_reaped[L.type]) - var/kill_modifier = 1 - if(K.pressure_decrease_active) - kill_modifier *= K.pressure_decrease - var/armor = L.run_armor_check(K.def_zone, K.armor_flag, "", "", K.armour_penetration) - L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor) - -/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L) - var/bonus_mod = 1 - if(ismegafauna(L)) //megafauna reward - bonus_mod = 4 - if(!bounties_reaped[L.type]) - bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty) - else - bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty) - -//Indoors -/obj/item/borg/upgrade/modkit/indoors - name = "decrease pressure penalty" - desc = "A syndicate modification kit that increases the damage a kinetic accelerator does in high pressure environments." - modifier = 2 - denied_type = /obj/item/borg/upgrade/modkit/indoors - maximum_of_type = 2 - cost = 35 - -/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/projectile/kinetic/K) - K.pressure_decrease *= modifier - - -//Trigger Guard -/obj/item/borg/upgrade/modkit/trigger_guard - name = "modified trigger guard" - desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed." - cost = 20 - denied_type = /obj/item/borg/upgrade/modkit/trigger_guard - -/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user) - . = ..() - if(.) - KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL - -/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) - KA.trigger_guard = TRIGGER_GUARD_NORMAL - ..() - - -//Cosmetic - -/obj/item/borg/upgrade/modkit/chassis_mod - name = "super chassis" - desc = "Makes your KA yellow. All the fun of having a more powerful KA without actually having a more powerful KA." - cost = 0 - denied_type = /obj/item/borg/upgrade/modkit/chassis_mod - var/chassis_icon = "kineticgun_u" - var/chassis_name = "super-kinetic accelerator" - -/obj/item/borg/upgrade/modkit/chassis_mod/install(obj/item/gun/energy/recharge/kinetic_accelerator/KA, mob/user) - . = ..() - if(.) - KA.icon_state = chassis_icon - KA.inhand_icon_state = chassis_icon - KA.name = chassis_name - if(iscarbon(KA.loc)) - var/mob/living/carbon/holder = KA.loc - holder.update_held_items() - -/obj/item/borg/upgrade/modkit/chassis_mod/uninstall(obj/item/gun/energy/recharge/kinetic_accelerator/KA) - KA.icon_state = initial(KA.icon_state) - KA.inhand_icon_state = initial(KA.inhand_icon_state) - KA.name = initial(KA.name) - if(iscarbon(KA.loc)) - var/mob/living/carbon/holder = KA.loc - holder.update_held_items() - ..() - -/obj/item/borg/upgrade/modkit/chassis_mod/orange - name = "hyper chassis" - desc = "Makes your KA orange. All the fun of having explosive blasts without actually having explosive blasts." - chassis_icon = "kineticgun_h" - chassis_name = "hyper-kinetic accelerator" - -/obj/item/borg/upgrade/modkit/tracer - name = "white tracer bolts" - desc = "Causes kinetic accelerator bolts to have a white tracer trail and explosion." - cost = 0 - denied_type = /obj/item/borg/upgrade/modkit/tracer - var/bolt_color = "#FFFFFF" - -/obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/projectile/kinetic/K) - K.icon_state = "ka_tracer" - K.color = bolt_color - -/obj/item/borg/upgrade/modkit/tracer/adjustable - name = "adjustable tracer bolts" - desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." - -/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) - bolt_color = input(user,"","Choose Color",bolt_color) as color|null diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 9471053b2be0..a3658d1eaa48 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -78,7 +78,6 @@ inhand_icon_state = "shotgun" desc = "A combat shotgun gutted and refitted with an internal laser system. Can switch between taser and scattered disabler shots." shaded_charge = 0 - pin = /obj/item/firing_pin/implant/mindshield ammo_type = list(/obj/item/ammo_casing/energy/laser/scatter/disabler, /obj/item/ammo_casing/energy/electrode) automatic_charge_overlays = FALSE @@ -95,7 +94,6 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BACK ammo_type = list(/obj/item/ammo_casing/energy/laser/accelerator) - pin = null ammo_x_offset = 3 /obj/item/ammo_casing/energy/laser/accelerator diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm index be0cfd340786..607527c9a73c 100644 --- a/code/modules/projectiles/guns/energy/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -46,7 +46,7 @@ to_chat(user, span_warning("You need a free hand to hold the gun!")) return update_appearance() - user.update_worn_back() + update_slot_icon() else to_chat(user, span_warning("You are already holding the gun!")) else @@ -94,7 +94,7 @@ else src.visible_message(span_warning("The [gun.name] snaps back onto the [name]!")) update_appearance() - user.update_worn_back() + update_slot_icon() /obj/item/gun/energy/minigun @@ -107,7 +107,8 @@ slot_flags = null w_class = WEIGHT_CLASS_HUGE custom_materials = null - weapon_weight = WEAPON_HEAVY + + unwielded_spread_bonus = 120 ammo_type = list(/obj/item/ammo_casing/energy/laser/minigun) cell_type = /obj/item/stock_parts/cell/crap item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND @@ -138,7 +139,7 @@ else qdel(src) -/obj/item/gun/energy/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/energy/minigun/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(ammo_pack && ammo_pack.overheat >= ammo_pack.overheat_max) to_chat(user, span_warning("The gun's heat sensor locked the trigger to prevent lens damage!")) return diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index eda8a9306479..8f1e3fe1e8a6 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -28,9 +28,6 @@ notify_ghosts("Someone won a pulse rifle as a prize!", source = src, action = NOTIFY_ORBIT, header = "Pulse rifle prize") -/obj/item/gun/energy/pulse/loyalpin - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/pulse/carbine name = "pulse carbine" desc = "A compact variant of the pulse rifle with less firepower but easier storage." @@ -51,9 +48,6 @@ /obj/item/gun/energy/pulse/carbine/lethal ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode) -/obj/item/gun/energy/pulse/carbine/loyalpin - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/pulse/destroyer name = "pulse destroyer" desc = "A heavy-duty energy rifle built for pure destruction." @@ -74,9 +68,6 @@ inhand_icon_state = "gun" cell_type = /obj/item/stock_parts/cell/pulse/pistol -/obj/item/gun/energy/pulse/pistol/loyalpin - pin = /obj/item/firing_pin/implant/mindshield - /obj/item/gun/energy/pulse/pistol/m1911 name = "\improper M1911-P" desc = "A compact pulse core in a classic handgun frame for Mars officers. It's not the size of the gun, it's the size of the hole it puts through people." diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 3e84b8761af6..78680ab41746 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -23,13 +23,13 @@ if(!holds_charge) empty() -/obj/item/gun/energy/recharge/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) +/obj/item/gun/energy/recharge/after_firing(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) . = ..() attempt_reload() /obj/item/gun/energy/recharge/equipped(mob/user) . = ..() - if(!can_shoot()) + if(!can_fire()) attempt_reload() /obj/item/gun/energy/recharge/dropped() @@ -39,7 +39,7 @@ // calls dropped(). addtimer(CALLBACK(src, PROC_REF(empty_if_not_held)), 0.1 SECONDS) -/obj/item/gun/energy/recharge/handle_chamber() +/obj/item/gun/energy/recharge/do_chamber_update() . = ..() attempt_reload() @@ -83,12 +83,12 @@ /obj/item/gun/energy/recharge/update_overlays() . = ..() - if(!no_charge_state && !can_shoot()) + if(!no_charge_state && !can_fire()) . += "[base_icon_state]_empty" /obj/item/gun/energy/recharge/update_icon_state() . = ..() - if(no_charge_state && !can_shoot()) + if(no_charge_state && !can_fire()) icon_state = no_charge_state /obj/item/gun/energy/recharge/ebow diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index d1cae9a8285e..4e733f255d78 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -169,7 +169,7 @@ /obj/item/gun/energy/plasmacutter/use(amount) return (!QDELETED(cell) && cell.use(amount ? amount * charge_weld : charge_weld)) -/obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks) +/obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks, interaction_key) if(amount) var/mutable_appearance/sparks = mutable_appearance('icons/effects/welding_effect.dmi', "welding_sparks", GASFIRE_LAYER, src, ABOVE_LIGHTING_PLANE) @@ -216,7 +216,7 @@ qdel(C) return -/obj/item/gun/energy/wormhole_projector/can_shoot() +/obj/item/gun/energy/wormhole_projector/can_fire() if(!firing_core) return FALSE return ..() @@ -247,7 +247,7 @@ /obj/item/gun/energy/wormhole_projector/afterattack_secondary(atom/target, mob/living/user, flag, params) if(select == AMMO_SELECT_BLUE) //Last fired in left click mode. Switch to orange wormhole (right click). select_fire() - fire_gun(target, user, flag, params) + try_fire_gun(target, user, flag, params) return SECONDARY_ATTACK_CONTINUE_CHAIN /obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P) @@ -294,6 +294,10 @@ /obj/item/gun/energy/wormhole_projector/core_inserted firing_core = TRUE +/obj/item/gun/energy/wormhole_projector/suicide_act(mob/living/user) + user.visible_message(span_suicide("[user] is looking into the operational end of the device! It looks like [user.p_theyre()] trying to commit suicide!")) + return (FIRELOSS) + #undef AMMO_SELECT_BLUE #undef AMMO_SELECT_ORANGE @@ -324,7 +328,6 @@ w_class = WEIGHT_CLASS_NORMAL ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) cell_type = /obj/item/stock_parts/cell/high - pin = null /obj/item/gun/energy/temperature/security name = "security temperature gun" @@ -358,7 +361,7 @@ return return ..() -/obj/item/gun/energy/gravity_gun/can_shoot() +/obj/item/gun/energy/gravity_gun/can_fire() if(!firing_core) return FALSE return ..() @@ -370,8 +373,8 @@ desc = "A gun that shoots balls of \"tesla\", whatever that is." ammo_type = list(/obj/item/ammo_casing/energy/tesla_cannon) shaded_charge = TRUE - weapon_weight = WEAPON_HEAVY /obj/item/gun/energy/tesla_cannon/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_NEEDS_TWO_HANDS, ABSTRACT_ITEM_TRAIT) AddComponent(/datum/component/automatic_fire, 0.1 SECONDS) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 627c8b5e8933..d8660b5a5687 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -26,13 +26,19 @@ return /obj/item/gun/energy/disabler - name = "disabler" - desc = "A self-defense weapon that exhausts organic targets, weakening them until they collapse." + name = "disabler mark II" + desc = "A crowd control weapon that fires strong electrical bolts to force muscle contraction." icon_state = "disabler" inhand_icon_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 +/obj/item/gun/energy/disabler/play_fire_sound() + if(suppressed) + playsound(src, suppressed_sound, suppressed_volume, vary_fire_sound, ignore_walls = FALSE, extrarange = SILENCED_SOUND_EXTRARANGE, falloff_distance = 0) + else + playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) + /obj/item/gun/energy/disabler/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ light_overlay_icon = 'icons/obj/guns/flashlights.dmi', \ diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm index 15c3cab1bd4e..26800a91055e 100644 --- a/code/modules/projectiles/guns/magic.dm +++ b/code/modules/projectiles/guns/magic.dm @@ -23,7 +23,7 @@ trigger_guard = TRIGGER_GUARD_ALLOW_ALL // Has no trigger at all, uses magic instead pin = /obj/item/firing_pin/magic -/obj/item/gun/magic/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) +/obj/item/gun/magic/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) if(no_den_usage) var/area/A = get_area(user) if(istype(A, /area/centcom/wizard_station)) @@ -37,14 +37,14 @@ return . = ..() -/obj/item/gun/magic/can_shoot() +/obj/item/gun/magic/can_fire() return charges /obj/item/gun/magic/recharge_newshot() if (charges && chambered && !chambered.loaded_projectile) chambered.newshot() -/obj/item/gun/magic/handle_chamber() +/obj/item/gun/magic/do_chamber_update() if(chambered && !chambered.loaded_projectile) //if BB is null, i.e the shot has been fired... charges--//... drain a charge recharge_newshot() diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 544a67c0cd5b..558b75d71c50 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -83,7 +83,7 @@ healing_beam.mounted = TRUE /obj/item/gun/magic/staff/healing/Destroy() - qdel(healing_beam) + QDEL_NULL(healing_beam) return ..() /obj/item/gun/magic/staff/healing/unrestricted @@ -92,7 +92,7 @@ /obj/item/gun/magic/staff/healing/on_intruder_use(mob/living/user, atom/target) if(target == user) return FALSE - healing_beam.process_fire(target, user) + healing_beam.do_fire_gun(target, user) return FALSE /obj/item/gun/magic/staff/healing/dropped(mob/user) @@ -122,7 +122,7 @@ /obj/item/gun/magic/staff/chaos/unrestricted allow_intruder_use = TRUE -/obj/item/gun/magic/staff/chaos/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/magic/staff/chaos/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) chambered.projectile_type = pick(allowed_projectile_types) . = ..() @@ -135,7 +135,7 @@ return TRUE balloon_alert(user, "chaos!") user.dropItemToGround(src, TRUE) - process_fire(user, user, FALSE) + do_fire_gun(user, user, FALSE) return FALSE /obj/item/gun/magic/staff/door @@ -172,7 +172,7 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' hitsound = 'sound/weapons/rapierhit.ogg' force = 20 - armour_penetration = 75 + armor_penetration = 75 block_chance = 50 sharpness = SHARP_EDGED max_charges = 4 @@ -182,9 +182,10 @@ . = ..() AddComponent(/datum/component/butchering, 15, 125, 0, hitsound) -/obj/item/gun/magic/staff/spellblade/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) +/obj/item/gun/magic/staff/spellblade/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(attack_type == PROJECTILE_ATTACK) - final_block_chance = 0 + return FALSE + return ..() /obj/item/gun/magic/staff/locker diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm index 5664c7fb19a8..cab757409307 100644 --- a/code/modules/projectiles/guns/magic/wand.dm +++ b/code/modules/projectiles/guns/magic/wand.dm @@ -169,8 +169,8 @@ /obj/item/gun/magic/wand/teleport/zap_self(mob/living/user) if(do_teleport(user, user, 10, channel = TELEPORT_CHANNEL_MAGIC)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(3, user.loc) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(3, location = user.loc) smoke.start() charges-- ..() @@ -192,8 +192,8 @@ if(do_teleport(user, destination, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin, destination)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = t) smoke.start() ..() diff --git a/code/modules/projectiles/guns/special/blastcannon.dm b/code/modules/projectiles/guns/special/blastcannon.dm index 9f256342f258..f384445d71e8 100644 --- a/code/modules/projectiles/guns/special/blastcannon.dm +++ b/code/modules/projectiles/guns/special/blastcannon.dm @@ -333,11 +333,11 @@ light_ex_range = max(light_ex_range - decrement, 0) if (heavy_ex_range) - SSexplosions.highturf += location + EX_ACT(location, EXPLODE_DEVASTATE) else if(medium_ex_range) - SSexplosions.medturf += location + EX_ACT(location, EXPLODE_HEAVY) else if(light_ex_range) - SSexplosions.lowturf += location + EX_ACT(location, EXPLODE_LIGHT) else qdel(src) return diff --git a/code/modules/projectiles/guns/special/chem_gun.dm b/code/modules/projectiles/guns/special/chem_gun.dm index 4f7cd92dc172..dc9ada112f6b 100644 --- a/code/modules/projectiles/guns/special/chem_gun.dm +++ b/code/modules/projectiles/guns/special/chem_gun.dm @@ -6,7 +6,6 @@ icon_state = "chemgun" inhand_icon_state = "chemgun" w_class = WEIGHT_CLASS_NORMAL - throw_speed = 3 throw_range = 7 force = 4 custom_materials = list(/datum/material/iron=2000) @@ -24,13 +23,13 @@ create_reagents(90, OPENCONTAINER) /obj/item/gun/chem/Destroy() - . = ..() STOP_PROCESSING(SSobj, src) + return ..() -/obj/item/gun/chem/can_shoot() +/obj/item/gun/chem/can_fire() return syringes_left -/obj/item/gun/chem/handle_chamber() +/obj/item/gun/chem/do_chamber_update() if(chambered && !chambered.loaded_projectile && syringes_left) chambered.newshot() diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm index b31197089bce..df5723997388 100644 --- a/code/modules/projectiles/guns/special/grenade_launcher.dm +++ b/code/modules/projectiles/guns/special/grenade_launcher.dm @@ -5,7 +5,6 @@ icon_state = "riotgun" inhand_icon_state = "riotgun" w_class = WEIGHT_CLASS_BULKY - throw_speed = 2 throw_range = 7 force = 5 var/list/grenades = new/list() @@ -30,10 +29,10 @@ else to_chat(usr, span_warning("The grenade launcher cannot hold more grenades!")) -/obj/item/gun/grenadelauncher/can_shoot() +/obj/item/gun/grenadelauncher/can_fire() return grenades.len -/obj/item/gun/grenadelauncher/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/grenadelauncher/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) user.visible_message(span_danger("[user] fired a grenade!"), \ span_danger("You fire the grenade launcher!")) var/obj/item/grenade/F = grenades[1] //Now with less copypasta! diff --git a/code/modules/projectiles/guns/special/meat_hook.dm b/code/modules/projectiles/guns/special/meat_hook.dm index 01faab6762cf..ae784a6f34d4 100644 --- a/code/modules/projectiles/guns/special/meat_hook.dm +++ b/code/modules/projectiles/guns/special/meat_hook.dm @@ -33,7 +33,7 @@ pass_flags = PASSTABLE damage = 20 stamina = 20 - armour_penetration = 60 + armor_penetration = 60 damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' var/chain @@ -42,7 +42,7 @@ /obj/projectile/hook/fire(setAngle) if(firer) - chain = firer.Beam(src, icon_state = chain_iconstate) + chain = firer.Beam(src, icon_state = "chain", emissive = FALSE) ..() //TODO: root the firer until the chain returns @@ -96,7 +96,7 @@ stamina = 25 chain_iconstate = "contractor_chain" -/obj/item/gun/magic/hook/contractor/process_fire(atom/target, mob/living/user, message, params, zone_override, bonus_spread) +/obj/item/gun/magic/hook/contractor/do_fire_gun(atom/target, mob/living/user, message, params, zone_override, bonus_spread) if(prob(1)) user.say("+GET OVER HERE!+", forced = "scorpion hook") return ..() diff --git a/code/modules/projectiles/guns/special/medbeam.dm b/code/modules/projectiles/guns/special/medbeam.dm index 06873b3c17c9..31ea7cbb3788 100644 --- a/code/modules/projectiles/guns/special/medbeam.dm +++ b/code/modules/projectiles/guns/special/medbeam.dm @@ -6,6 +6,8 @@ inhand_icon_state = "chronogun" w_class = WEIGHT_CLASS_NORMAL + gun_flags = NO_AKIMBO + var/mob/living/current_target var/last_check = 0 var/check_delay = 10 //Check los as often as possible, max resolution is SSobj tick though @@ -14,8 +16,6 @@ var/datum/beam/current_beam = null var/mounted = 0 //Denotes if this is a handheld or mounted version - weapon_weight = WEAPON_MEDIUM - /obj/item/gun/medbeam/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) @@ -56,7 +56,7 @@ to_chat(loc, span_warning("You lose control of the beam!")) LoseTarget() -/obj/item/gun/medbeam/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/medbeam/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) if(isliving(user)) add_fingerprint(user) diff --git a/code/modules/projectiles/guns/special/syringe_gun.dm b/code/modules/projectiles/guns/special/syringe_gun.dm index 7a9464963641..a2b1e32d4a88 100644 --- a/code/modules/projectiles/guns/special/syringe_gun.dm +++ b/code/modules/projectiles/guns/special/syringe_gun.dm @@ -11,7 +11,6 @@ worn_icon_state = null w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK - throw_speed = 3 throw_range = 7 force = 6 base_pixel_x = -4 @@ -39,10 +38,10 @@ return chambered.newshot() -/obj/item/gun/syringe/can_shoot() +/obj/item/gun/syringe/can_fire() return syringes.len -/obj/item/gun/syringe/handle_chamber() +/obj/item/gun/syringe/do_chamber_update() if(chambered && !chambered.loaded_projectile) //we just fired recharge_newshot() update_appearance() @@ -195,7 +194,7 @@ force = 4 trigger_guard = TRIGGER_GUARD_ALLOW_ALL -/obj/item/gun/syringe/blowgun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) +/obj/item/gun/syringe/blowgun/do_fire_gun(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) visible_message(span_danger("[user] starts aiming with a blowgun!")) if(do_after(user, src, 25)) user.stamina.adjust(-20) diff --git a/code/modules/projectiles/guns/special/tranq_rifle.dm b/code/modules/projectiles/guns/special/tranq_rifle.dm index abdf0b1118dd..b92e5bc0d6fb 100644 --- a/code/modules/projectiles/guns/special/tranq_rifle.dm +++ b/code/modules/projectiles/guns/special/tranq_rifle.dm @@ -8,13 +8,12 @@ inhand_icon_state = "hunting_rifle" w_class = WEIGHT_CLASS_BULKY slot_flags = null - throw_speed = 3 throw_range = 7 force = 6 custom_materials = list(/datum/material/iron=2000) clumsy_check = FALSE fire_sound = 'sound/items/syringeproj.ogg' - mag_type = /obj/item/ammo_box/magazine/tranq_rifle + mag_type = /obj/item/ammo_box/magazine/tranq_rifle/ryetalyn internal_magazine = FALSE empty_alarm = FALSE hidden_chambered = TRUE @@ -32,16 +31,18 @@ return list() /obj/item/gun/ballistic/rifle/tranqrifle/rack(mob/user) - if(!bolt_locked) + if(!bolt.is_locked) if(!magazine && chambered) to_chat(user, span_warning("The bolt won't budge!")) return + if(magazine && chambered && !magazine.give_round(chambered)) to_chat(user, span_warning("The bolt won't budge!")) return + to_chat(user, span_notice("You open the bolt of \the [src].")) playsound(src, rack_sound, rack_sound_volume, rack_sound_vary) chambered = null - bolt_locked = TRUE + bolt.is_locked = TRUE return drop_bolt(user) diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 8c8ad3d078ad..6911a09024ff 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -9,16 +9,24 @@ w_class = WEIGHT_CLASS_TINY attack_verb_continuous = list("pokes") attack_verb_simple = list("poke") + var/fail_message = "invalid user!" var/selfdestruct = FALSE // Explode when user check is failed. var/force_replace = FALSE // Can forcefully replace other pins. var/pin_removeable = FALSE // Can be replaced by any pin. + + /// The gun we're apart of. var/obj/item/gun/gun -/obj/item/firing_pin/New(newloc) - ..() - if(isgun(newloc)) - gun = newloc +/obj/item/firing_pin/Initialize(mapload, obj/item/gun/owner) + . = ..() + if(isgun(owner)) + gun = owner + +/obj/item/firing_pin/Destroy() + if(gun) + gun.pin = null + return ..() /obj/item/firing_pin/afterattack(atom/target, mob/user, proximity_flag) . = ..() @@ -80,98 +88,6 @@ name = "magic crystal shard" desc = "A small enchanted shard which allows magical weapons to fire." - -// Test pin, works only near firing range. -/obj/item/firing_pin/test_range - name = "test-range firing pin" - desc = "This safety firing pin allows weapons to be fired within proximity to a firing range." - fail_message = "test range check failed!" - pin_removeable = TRUE - -/obj/item/firing_pin/test_range/pin_auth(mob/living/user) - if(!istype(user)) - return FALSE - if (istype(get_area(user), /area/station/security/range)) - return TRUE - return FALSE - - -// Implant pin, checks for implant -/obj/item/firing_pin/implant - name = "implant-keyed firing pin" - desc = "This is a security firing pin which only authorizes users who are implanted with a certain device." - fail_message = "implant check failed!" - var/obj/item/implant/req_implant = null - -/obj/item/firing_pin/implant/pin_auth(mob/living/user) - if(user) - for(var/obj/item/implant/I in user.implants) - if(req_implant && I.type == req_implant) - return TRUE - return FALSE - -/obj/item/firing_pin/implant/mindshield - name = "mindshield firing pin" - desc = "This Security firing pin authorizes the weapon for only mindshield-implanted users." - icon_state = "firing_pin_loyalty" - req_implant = /obj/item/implant/mindshield - -/obj/item/firing_pin/implant/pindicate - name = "syndicate firing pin" - icon_state = "firing_pin_pindi" - req_implant = /obj/item/implant/weapons_auth - - - -// Honk pin, clown's joke item. -// Can replace other pins. Replace a pin in cap's laser for extra fun! -/obj/item/firing_pin/clown - name = "hilarious firing pin" - desc = "Advanced clowntech that can convert any firearm into a far more useful object." - color = "#FFFF00" - fail_message = "honk!" - force_replace = TRUE - -/obj/item/firing_pin/clown/pin_auth(mob/living/user) - playsound(src, 'sound/items/bikehorn.ogg', 50, TRUE) - return FALSE - -// Ultra-honk pin, clown's deadly joke item. -// A gun with ultra-honk pin is useful for clown and useless for everyone else. -/obj/item/firing_pin/clown/ultra - name = "ultra hilarious firing pin" - -/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user) - playsound(src.loc, 'sound/items/bikehorn.ogg', 50, TRUE) - if(QDELETED(user)) //how the hell...? - stack_trace("/obj/item/firing_pin/clown/ultra/pin_auth called with a [isnull(user) ? "null" : "invalid"] user.") - return TRUE - if(HAS_TRAIT(user, TRAIT_CLUMSY)) //clumsy - return TRUE - if(user.mind) - if(is_clown_job(user.mind.assigned_role)) //traitor clowns can use this, even though they're technically not clumsy - return TRUE - if(user.mind.has_antag_datum(/datum/antagonist/nukeop/clownop)) //clown ops aren't clumsy by default and technically don't have an assigned role of "Clown", but come on, they're basically clowns - return TRUE - if(user.mind.has_antag_datum(/datum/antagonist/nukeop/leader/clownop)) //Wanna hear a funny joke? - return TRUE //The clown op leader antag datum isn't a subtype of the normal clown op antag datum. - return FALSE - -/obj/item/firing_pin/clown/ultra/gun_insert(mob/living/user, obj/item/gun/G) - ..() - G.clumsy_check = FALSE - -/obj/item/firing_pin/clown/ultra/gun_remove(mob/living/user) - gun.clumsy_check = initial(gun.clumsy_check) - ..() - -// Now two times deadlier! -/obj/item/firing_pin/clown/ultra/selfdestruct - name = "super ultra hilarious firing pin" - desc = "Advanced clowntech that can convert any firearm into a far more useful object. It has a small nitrobananium charge on it." - selfdestruct = TRUE - - // DNA-keyed pin. // When you want to keep your toys for yourself. /obj/item/firing_pin/dna @@ -203,10 +119,6 @@ else ..() -/obj/item/firing_pin/dna/dredd - desc = "This is a DNA-locked firing pin which only authorizes one user. Attempt to fire once to DNA-link. It has a small explosive charge on it." - selfdestruct = TRUE - // Paywall pin, brought to you by ARMA 3 DLC. // Checks if the user has a valid bank account on an ID and if so attempts to extract a one-time payment to authorize use of the gun. Otherwise fails to shoot. /obj/item/firing_pin/paywall @@ -269,7 +181,7 @@ owned = FALSE return var/transaction_amount = tgui_input_number(user, "Insert valid deposit amount for gun purchase", "Money Deposit") - if(!transaction_amount || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, no_tk = NO_TK)) + if(!transaction_amount || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return pin_owner = id.registered_account owned = TRUE @@ -283,7 +195,7 @@ var/datum/bank_account/credit_card_details = user.get_bank_account() if(credit_card_details in gun_owners) if(multi_payment && credit_card_details) - if(!gun.can_shoot()) + if(!gun.can_fire()) return TRUE //So you don't get charged for attempting to fire an empty gun. if(credit_card_details.adjust_money(-payment_amount, "Firing Pin: Gun Rent")) if(pin_owner) @@ -322,20 +234,6 @@ active_prompt_user = null return FALSE //we return false here so you don't click initially to fire, get the prompt, accept the prompt, and THEN the gun -// Explorer Firing Pin- Prevents use on station Z-Level, so it's justifiable to give Explorers guns that don't suck. -/obj/item/firing_pin/explorer - name = "outback firing pin" - desc = "A firing pin used by the austrailian defense force, retrofit to prevent weapon discharge on the station." - icon_state = "firing_pin_explorer" - fail_message = "cannot fire while on station, mate!" - -// This checks that the user isn't on the station Z-level. -/obj/item/firing_pin/explorer/pin_auth(mob/living/user) - var/turf/station_check = get_turf(user) - if(!station_check || is_station_level(station_check.z)) - return FALSE - return TRUE - // Laser tag pins /obj/item/firing_pin/tag name = "laser tag firing pin" @@ -363,8 +261,3 @@ icon_state = "firing_pin_blue" suit_requirement = /obj/item/clothing/suit/bluetag tagcolor = "blue" - -/obj/item/firing_pin/Destroy() - if(gun) - gun.pin = null - return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 34bbbea4066d..e87959a8b749 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -8,6 +8,7 @@ icon_state = "bullet" density = FALSE anchored = TRUE + animate_movement = NO_STEPS //Use SLIDE_STEPS in conjunction with legacy mouse_opacity = MOUSE_OPACITY_TRANSPARENT movement_type = FLYING generic_canpass = FALSE @@ -20,7 +21,14 @@ var/hitsound_wall = "" resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/def_zone = "" //Aiming at + /// The body_zone the firer aimed at. May be overriden by some casings using zone_override + var/aimed_def_zone = BODY_ZONE_CHEST + /// The body_zone the projectile is about to hit, taking into account randomness. Don't set directly, will not do anything. + var/def_zone = "" + + /// Can this projectile miss it's def_zone? + var/can_miss_zone = TRUE + var/atom/movable/firer = null//Who shot it var/datum/fired_from = null // the thing that the projectile was fired from (gun, turret, spell) var/suppressed = FALSE //Attack message @@ -59,7 +67,7 @@ * If you so badly need to make one go through *everything*, override check_pierce() for your projectile to always return PROJECTILE_PIERCE_PHASE/HIT. */ /// The "usual" flags of pass_flags is used in that can_hit_target ignores these unless they're specifically targeted/clicked on. This behavior entirely bypasses process_hit if triggered, rather than phasing which uses prehit_pierce() to check. - pass_flags = PASSTABLE + pass_flags = NONE /// If FALSE, allow us to hit something directly targeted/clicked/whatnot even if we're able to phase through it var/phasing_ignore_direct_target = FALSE /// Bitflag for things the projectile should just phase through entirely - No hitting unless direct target and [phasing_ignore_direct_target] is FALSE. Uses pass_flags flags. @@ -89,7 +97,6 @@ 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 /// how many times we've ricochet'd so far (instance variable, not a stat) var/ricochets = 0 /// how many times we can ricochet max @@ -147,14 +154,18 @@ var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here var/nodamage = FALSE //Determines if the projectile will skip any damage inflictions ///Defines what armor to use when it hits things. Must be set to bullet, laser, energy, or bomb - var/armor_flag = BULLET + var/armor_flag = PUNCTURE ///How much armor this projectile pierces. - var/armour_penetration = 0 - ///Whether or not our bullet lacks penetrative power, and is easily stopped by armor. - var/weak_against_armour = FALSE + var/armor_penetration = 0 + /// A multiplier applied to the defender's armor, making it more effective against this projectile. + var/weak_against_armor = null var/projectile_type = /obj/projectile - var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile. - var/decayedRange //stores original range + ///Sets the max range of the projectile, This will de-increment every step. When 0, it will deletze the object. + var/range = 50 + ///Archive of original range value. + var/decayedRange + ///Total distance traveled. + var/distance_traveled var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever var/reflectable = NONE // Can it be reflected or not? // Status effects applied on hit @@ -175,6 +186,14 @@ /// Slurring applied on projectile hit var/slur = 0 SECONDS + // Disorient vars + /// Duration of disorient status effect + var/disorient_length = 0 SECONDS + /// Stamina damage applied + var/disorient_damage = 0 + /// Paralyze duration if target is exhausted + var/disorient_status_length = 0 SECONDS + 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) @@ -191,13 +210,16 @@ var/sharpness = NONE ///How much we want to drop both wound_bonus and bare_wound_bonus (to a minimum of 0 for the latter) per tile, for falloff purposes var/wound_falloff_tile - ///How much we want to drop the embed_chance value, if we can embed, per tile, for falloff purposes - var/embed_falloff_tile + ///How much we want to adjust the embed_chance value, if we can embed, per tile, for falloff purposes + var/embed_adjustment_tile + ///How many tiles must the projectile travel until embedding odds start being adjusted + var/embed_min_distance = 0 + /// If true directly targeted turfs can be hit + var/can_hit_turfs = FALSE + var/static/list/projectile_connections = list( COMSIG_ATOM_ENTERED = PROC_REF(on_entered), ) - /// If true directly targeted turfs can be hit - var/can_hit_turfs = FALSE /obj/projectile/Initialize(mapload) . = ..() @@ -208,8 +230,9 @@ /obj/projectile/proc/Range() range-- - if(embedding) - embedding["embed_chance"] += embed_falloff_tile + distance_traveled++ + if((embed_min_distance > distance_traveled) && embedding && embed_adjustment_tile) + embedding["embed_chance"] += embed_adjustment_tile if(range <= 0 && loc) on_range() @@ -244,8 +267,8 @@ var/obj/item/bodypart/hit_limb if(isliving(target)) var/mob/living/L = target - hit_limb = L.check_limb_hit(def_zone) - SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, hit_limb) + hit_limb = L.get_bodypart(def_zone) + SEND_SIGNAL(src, COMSIG_PROJECTILE_SELF_ON_HIT, firer, target, Angle, def_zone) if(QDELETED(src)) // in case one of the above signals deleted the projectile for whatever reason return @@ -253,7 +276,10 @@ var/hitx var/hity - if(target == original) + if(target.flags_1 & ON_BORDER_1) + hitx = p_x + hity = p_y + else if(target == original) hitx = target.pixel_x + p_x - 16 hity = target.pixel_y + p_y - 16 else @@ -282,28 +308,34 @@ var/mob/living/L = target if(blocked != 100) // not completely blocked - if(damage && L.blood_volume && damage_type == BRUTE) + if(damage && L.blood_volume && damage_type == BRUTE && (!hit_limb || (hit_limb.bodypart_flags & BP_HAS_BLOOD))) var/splatter_dir = dir if(starting) splatter_dir = get_dir(starting, target_loca) if(isalien(L)) new /obj/effect/temp_visual/dir_setting/bloodsplatter/xenosplatter(target_loca, splatter_dir) else - new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir) + var/splatter_color + if(iscarbon(L)) + var/mob/living/carbon/C = L + splatter_color = C.dna.blood_type.color + new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, splatter_color) if(prob(33)) L.add_splatter_floor(target_loca) else if(impact_effect_type && !hitscan) new impact_effect_type(target_loca, hitx, hity) var/organ_hit_text = "" - var/limb_hit = hit_limb - if(limb_hit) - organ_hit_text = " in \the [parse_zone(limb_hit)]" + if(hit_limb) + organ_hit_text = " in \the [hit_limb.plaintext_zone]" + if(suppressed == SUPPRESSED_VERY) playsound(loc, hitsound, 5, TRUE, -1) + else if(suppressed) playsound(loc, hitsound, 5, TRUE, -1) to_chat(L, span_userdanger("You're shot by \a [src][organ_hit_text]!")) + else if(hitsound) var/volume = vol_by_damage() @@ -405,10 +437,9 @@ store_hitscan_collision(point_cache) return TRUE - var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. - def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use. + var/target = select_target(T, A, A) - return process_hit(T, select_target(T, A, A), A) // SELECT TARGET FIRST! + return process_hit(T, target, A) // SELECT TARGET FIRST! /** * The primary workhorse proc of projectile impacts. @@ -437,30 +468,49 @@ // 1. if(QDELETED(src) || !T || !target) return + // 2. impacted[target] = TRUE //hash lookup > in for performance in hit-checking + // 3. var/mode = prehit_pierce(target) if(mode == PROJECTILE_DELETE_WITHOUT_HITTING) qdel(src) return hit_something + else if(mode == PROJECTILE_PIERCE_PHASE) if(!(movement_type & PHASING)) temporary_unstoppable_movement = TRUE movement_type |= PHASING + return process_hit(T, select_target(T, target, bumped), bumped, hit_something) // try to hit something else + // at this point we are going to hit the thing // in which case send signal to it + var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. + if(iscarbon(target)) + var/distance_mult = 7 + if(istype(fired_from, /obj/item/gun)) + var/obj/item/gun/G = fired_from + distance_mult = G.accuracy_falloff + + def_zone = can_miss_zone ? get_zone_with_miss_chance(aimed_def_zone, target, clamp(distance * distance_mult, 0, 100), TRUE) : aimed_def_zone + else + def_zone = aimed_def_zone + SEND_SIGNAL(target, COMSIG_PROJECTILE_PREHIT, args) if(mode == PROJECTILE_PIERCE_HIT) ++pierces + hit_something = TRUE + var/result = target.bullet_act(src, def_zone, mode == PROJECTILE_PIERCE_HIT) if((result == BULLET_ACT_FORCE_PIERCE) || (mode == PROJECTILE_PIERCE_HIT)) if(!(movement_type & PHASING)) temporary_unstoppable_movement = TRUE movement_type |= PHASING return process_hit(T, select_target(T, target, bumped), bumped, TRUE) + qdel(src) return hit_something @@ -469,7 +519,7 @@ * * @params * T - The turf - * target - The "preferred" atom to hit, usually what we Bumped() first. + * target - The "preferred" atom to hit, usually what we BumpedBy() first. * bumped - used to track if something is the reason we impacted in the first place. * If set, this atom is always treated as dense by can_hit_target. * @@ -486,7 +536,7 @@ */ /obj/projectile/proc/select_target(turf/our_turf, atom/target, atom/bumped) // 1. special bumped border object check - if((bumped?.flags_1 & ON_BORDER_1) && can_hit_target(bumped, original == bumped, FALSE, TRUE)) + if((bumped?.flags_1 & (ON_BORDER_1|BUMP_PRIORITY_1)) && can_hit_target(bumped, original == bumped, TRUE, TRUE)) return bumped // 2. original if(can_hit_target(original, TRUE, FALSE, original == bumped)) @@ -616,9 +666,11 @@ . = ..() if(!fired) return + if(temporary_unstoppable_movement) temporary_unstoppable_movement = FALSE movement_type &= ~PHASING + scan_moved_turf() //mostly used for making sure we can hit a non-dense object the user directly clicked on, and for penetrating projectiles that don't bump /** @@ -628,9 +680,9 @@ * Return PROJECTILE_DELETE_WITHOUT_HITTING to delete projectile without hitting at all! */ /obj/projectile/proc/prehit_pierce(atom/A) - if((projectile_phasing & A.pass_flags_self) && (phasing_ignore_direct_target || original != A)) + if((projectile_phasing & (A.pass_flags_self & ~LETPASSCLICKS)) && (phasing_ignore_direct_target || original != A)) return PROJECTILE_PIERCE_PHASE - if(projectile_piercing & A.pass_flags_self) + if(projectile_piercing & (A.pass_flags_self & ~LETPASSCLICKS)) return PROJECTILE_PIERCE_HIT if(ismovable(A)) var/atom/movable/AM = A @@ -650,7 +702,7 @@ if((armor_flag in list(ENERGY, LASER)) && (A.flags_ricochet & RICOCHET_SHINY)) return TRUE - if((armor_flag in list(BOMB, BULLET)) && (A.flags_ricochet & RICOCHET_HARD)) + if((armor_flag in list(BOMB, PUNCTURE)) && (A.flags_ricochet & RICOCHET_HARD)) return TRUE return FALSE @@ -678,9 +730,11 @@ if(!loc || !fired || !trajectory) fired = FALSE return PROCESS_KILL + if(paused || !isturf(loc)) last_projectile_move += world.time - last_process //Compensates for pausing, so it doesn't become a hitscan projectile when unpaused from charged up ticks. return + var/elapsed_time_deciseconds = (world.time - last_projectile_move) + time_offset time_offset = 0 var/required_moves = speed > 0? FLOOR(elapsed_time_deciseconds / speed, 1) : MOVES_HITSCAN //Would be better if a 0 speed made hitscan but everyone hates those so I can't make it a universal system :< @@ -700,45 +754,59 @@ LAZYINITLIST(impacted) if(fired_from) SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) + //If no angle needs to resolve it from xo/yo! if(shrapnel_type && LAZYLEN(embedding)) AddElement(/datum/element/embed, projectile_payload = shrapnel_type) + if(!log_override && firer && original) log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]") //note: mecha projectile logging is handled in /obj/item/mecha_parts/mecha_equipment/weapon/action(). try to keep these messages roughly the sameish just for consistency's sake. + if(direct_target && (get_dist(direct_target, get_turf(src)) <= 1)) // point blank shots process_hit(get_turf(direct_target), direct_target) if(QDELETED(src)) return + if(isnum(angle)) set_angle(angle) + if(spread) set_angle(Angle + ((rand() - 0.5) * spread)) + var/turf/starting = get_turf(src) if(isnull(Angle)) //Try to resolve through offsets if there's no angle set. if(isnull(xo) || isnull(yo)) stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!") qdel(src) return + var/turf/target = locate(clamp(starting + xo, 1, world.maxx), clamp(starting + yo, 1, world.maxy), starting.z) set_angle(get_angle(src, target)) + original_angle = Angle + if(!nondirectional_sprite) var/matrix/matrix = new matrix.Turn(Angle) transform = matrix + trajectory_ignore_forcemove = TRUE forceMove(starting) trajectory_ignore_forcemove = FALSE trajectory = new(starting.x, starting.y, starting.z, pixel_x, pixel_y, Angle, SSprojectiles.global_pixel_speed) + last_projectile_move = world.time fired = TRUE play_fov_effect(starting, 6, "gunfire", dir = NORTH, angle = Angle) SEND_SIGNAL(src, COMSIG_PROJECTILE_FIRE) + if(hitscan) process_hitscan() + if(!(datum_flags & DF_ISPROCESSING)) START_PROCESSING(SSprojectiles, src) + pixel_move(pixel_speed_multiplier, FALSE) //move it now! /obj/projectile/proc/set_angle(new_angle) //wrapper for overrides. @@ -747,8 +815,11 @@ var/matrix/matrix = new matrix.Turn(Angle) transform = matrix + UPDATE_OO_IF_PRESENT + if(trajectory) trajectory.set_angle(new_angle) + if(fired && hitscan && isloc(loc) && (loc != last_angle_set_hitscan_store)) last_angle_set_hitscan_store = loc var/datum/point/point_cache = new (src) @@ -763,6 +834,8 @@ var/matrix/matrix = new matrix.Turn(Angle) transform = matrix + UPDATE_OO_IF_PRESENT + if(trajectory) trajectory.set_angle(new_angle) @@ -839,22 +912,28 @@ /obj/projectile/proc/pixel_move(trajectory_multiplier, hitscanning = FALSE) if(!loc || !trajectory) return + last_projectile_move = world.time + if(!nondirectional_sprite && !hitscanning) var/matrix/matrix = new matrix.Turn(Angle) transform = matrix + if(homing) process_homing() + var/forcemoved = FALSE for(var/i in 1 to SSprojectiles.global_iterations_per_move) if(QDELETED(src)) return + trajectory.increment(trajectory_multiplier) var/turf/T = trajectory.return_turf() if(!istype(T)) qdel(src) return + if(T.z != loc.z) var/old = loc before_z_change(loc, T) @@ -862,25 +941,31 @@ forceMove(T) trajectory_ignore_forcemove = FALSE after_z_change(old, loc) + if(!hitscanning) pixel_x = trajectory.return_px() pixel_y = trajectory.return_py() forcemoved = TRUE hitscan_last = loc + else if(T != loc) step_towards(src, T) hitscan_last = loc + if(QDELETED(src)) //deleted on last move 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 - animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) + z_animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW) + Range() /obj/projectile/proc/process_homing() //may need speeding up in the future performance wise. if(!homing_target) return FALSE + var/datum/point/PT = RETURN_PRECISE_POINT(homing_target) PT.x += clamp(homing_offset_x, 1, world.maxx) PT.y += clamp(homing_offset_y, 1, world.maxy) @@ -1001,8 +1086,10 @@ /obj/projectile/Destroy() if(hitscan) finalize_hitscan_and_generate_tracers() + STOP_PROCESSING(SSprojectiles, src) cleanup_beam_segments() + if(trajectory) QDEL_NULL(trajectory) return ..() @@ -1021,10 +1108,12 @@ /obj/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE) if(!length(beam_segments)) return + if(tracer_type) var/tempref = REF(src) for(var/datum/point/p in beam_segments) generate_tracer_between_points(p, beam_segments[p], tracer_type, color, duration, hitscan_light_range, hitscan_light_color_override, hitscan_light_intensity, tempref) + if(muzzle_type && duration > 0) var/datum/point/p = beam_segments[1] var/atom/movable/thing = new muzzle_type @@ -1034,7 +1123,9 @@ thing.transform = matrix thing.color = color thing.set_light(l_inner_range = muzzle_flash_range, l_outer_range = muzzle_flash_range, l_power = muzzle_flash_intensity, l_color = muzzle_flash_color_override || color) + thing.update_above() QDEL_IN(thing, duration) + if(impacting && impact_type && duration > 0) var/datum/point/p = beam_segments[beam_segments[beam_segments.len]] var/atom/movable/thing = new impact_type @@ -1044,7 +1135,9 @@ thing.transform = matrix thing.color = color thing.set_light(l_inner_range = impact_light_range, l_outer_range = impact_light_range, l_power = impact_light_intensity, l_color = impact_light_color_override || color) + thing.update_above() QDEL_IN(thing, duration) + if(cleanup) cleanup_beam_segments() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 88e9addfffaf..d3aadac90473 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,7 +9,7 @@ armor_flag = LASER eyeblur = 2 impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_power = 1 light_color = COLOR_SOFT_RED @@ -53,7 +53,7 @@ damage = 15 /obj/projectile/beam/weak/penetrator - armour_penetration = 50 + armor_penetration = 50 /obj/projectile/beam/practice name = "practice laser" @@ -70,7 +70,7 @@ icon_state = "xray" damage = 15 range = 15 - armour_penetration = 100 + armor_penetration = 100 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser @@ -80,15 +80,22 @@ impact_type = /obj/effect/projectile/impact/xray /obj/projectile/beam/disabler - name = "disabler beam" - icon_state = "omnilaser" - damage = 30 + name = "disabler bolt" + icon = 'goon/icons/obj/projectiles.dmi' + icon_state = "taser_projectile" + speed = 0.7 + damage = 0 damage_type = STAMINA armor_flag = ENERGY - hitsound = 'sound/weapons/tap.ogg' + + disorient_length = 2 SECONDS + disorient_damage = 50 + disorient_status_length = 4 SECONDS + + hitsound = 'goon/sounds/weapons/sparks6.ogg' eyeblur = 0 - impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser - light_color = LIGHT_COLOR_BLUE + impact_effect_type = /obj/effect/temp_visual/impact_effect/yellow_laser + light_color = LIGHT_COLOR_DIM_YELLOW tracer_type = /obj/effect/projectile/tracer/disabler muzzle_type = /obj/effect/projectile/muzzle/disabler impact_type = /obj/effect/projectile/impact/disabler @@ -105,11 +112,8 @@ /obj/projectile/beam/pulse/on_hit(atom/target, blocked = FALSE) . = ..() - if (!QDELETED(target) && (isturf(target) || istype(target, /obj/structure/))) - if(isobj(target)) - SSexplosions.med_mov_atom += target - else - SSexplosions.medturf += target + if (!QDELETED(target) && (isturf(target) || istype(target, /obj/structure))) + EX_ACT(target, EXPLODE_HEAVY) /obj/projectile/beam/pulse/shotgun damage = 30 diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index b310d38b2d9a..4adb96f33b7e 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -4,13 +4,19 @@ damage = 60 damage_type = BRUTE nodamage = FALSE - armor_flag = BULLET + armor_flag = PUNCTURE hitsound_wall = SFX_RICOCHET sharpness = SHARP_POINTY impact_effect_type = /obj/effect/temp_visual/impact_effect shrapnel_type = /obj/item/shrapnel/bullet - embedding = list(embed_chance=20, fall_chance=2, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10) - embed_falloff_tile = -3 + embedding = list(embed_chance=20, fall_chance=0, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10) + embed_adjustment_tile = 3 + + light_system = OVERLAY_LIGHT + light_outer_range = 1.5 + light_power = 2 + light_color = COLOR_VERY_SOFT_YELLOW + light_on = TRUE /obj/projectile/bullet/smite name = "divine retribution" diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 283baa87b920..d67789a6bc40 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -19,7 +19,7 @@ return ..() if(isobj(target)) var/obj/hit_object = target - hit_object.take_damage(80, BRUTE, BULLET, FALSE) + hit_object.take_damage(80, BRUTE, PUNCTURE, FALSE) else if(isclosedturf(target)) damage -= max(damage - 30, 10) //lose extra momentum from busting through a wall if(!isindestructiblewall(target)) diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index f9288aa7ef62..dc47c2561701 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -56,9 +56,9 @@ . = ..() reagents.add_reagent(/datum/reagent/medicine/haloperidol, 10) -/obj/projectile/bullet/dart/mutadone +/obj/projectile/bullet/dart/ryetalyn damage = 0 -/obj/projectile/bullet/dart/mutadone/Initialize(mapload) +/obj/projectile/bullet/dart/ryetalyn/Initialize(mapload) . = ..() - reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) + reagents.add_reagent(/datum/reagent/medicine/ryetalyn, 10) diff --git a/code/modules/projectiles/projectile/bullets/lmg.dm b/code/modules/projectiles/projectile/bullets/lmg.dm index 04bd6c0f56ab..04c16865873e 100644 --- a/code/modules/projectiles/projectile/bullets/lmg.dm +++ b/code/modules/projectiles/projectile/bullets/lmg.dm @@ -29,17 +29,17 @@ /obj/projectile/bullet/mm712x82 name = "7.12x82mm bullet" damage = 30 - armour_penetration = 5 + armor_penetration = 5 /obj/projectile/bullet/mm712x82/ap name = "7.12x82mm armor-piercing bullet" - armour_penetration = 75 + armor_penetration = 75 /obj/projectile/bullet/mm712x82/hp name = "7.12x82mm hollow-point bullet" damage = 50 sharpness = SHARP_EDGED - weak_against_armour = TRUE + weak_against_armor = 2 /obj/projectile/bullet/incendiary/mm712x82 name = "7.12x82mm incendiary bullet" diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 7adf7578b68f..a8e7b68f7d37 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -3,19 +3,19 @@ /obj/projectile/bullet/c9mm name = "9mm bullet" damage = 30 - embedding = list(embed_chance=15, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + embedding = list(embed_chance=15, fall_chance=0, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) /obj/projectile/bullet/c9mm/ap name = "9mm armor-piercing bullet" - damage = 27 - armour_penetration = 40 + damage = 30 + armor_penetration = 40 embedding = null shrapnel_type = null /obj/projectile/bullet/c9mm/hp name = "9mm hollow-point bullet" damage = 40 - weak_against_armour = TRUE + weak_against_armor = 2 /obj/projectile/bullet/incendiary/c9mm name = "9mm incendiary bullet" @@ -31,12 +31,12 @@ /obj/projectile/bullet/c10mm/ap name = "10mm armor-piercing bullet" damage = 37 - armour_penetration = 40 + armor_penetration = 40 /obj/projectile/bullet/c10mm/hp name = "10mm hollow-point bullet" damage = 60 - weak_against_armour = TRUE + weak_against_armor = 2 /obj/projectile/bullet/incendiary/c10mm name = "10mm incendiary bullet" diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index b372002ac7b5..4f74ea58d690 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -7,7 +7,7 @@ // .50AE (Desert Eagle) /obj/projectile/bullet/a50ae - name = ".50AE bullet" + name = ".50 AE bullet" damage = 60 // .38 (Detective's Gun) @@ -19,8 +19,8 @@ ricochet_chance = 50 ricochet_auto_aim_angle = 10 ricochet_auto_aim_range = 3 - embedding = list(embed_chance=25, fall_chance=2, jostle_chance=2, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=3, jostle_pain_mult=5, rip_time=1 SECONDS) - embed_falloff_tile = -4 + embedding = list(embed_chance=25, fall_chance=0, jostle_chance=2, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=3, jostle_pain_mult=5, rip_time=1 SECONDS) + embed_adjustment_tile = 4 /obj/projectile/bullet/c38/match name = ".38 Match bullet" @@ -36,7 +36,7 @@ name = ".38 Rubber bullet" damage = 10 stamina = 30 - weak_against_armour = TRUE + weak_against_armor = 5 ricochets_max = 6 ricochet_incidence_leeway = 0 ricochet_chance = 130 @@ -49,11 +49,11 @@ /obj/projectile/bullet/c38/dumdum name = ".38 DumDum bullet" damage = 15 - weak_against_armour = TRUE + weak_against_armor = 5 ricochets_max = 0 sharpness = SHARP_EDGED - embedding = list(embed_chance=75, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=1 SECONDS) - embed_falloff_tile = -15 + embedding = list(embed_chance=75, fall_chance=0, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=1 SECONDS) + embed_adjustment_tile = -15 /obj/projectile/bullet/c38/trac name = ".38 TRAC bullet" @@ -71,7 +71,7 @@ return if(!imp) imp = new /obj/item/implant/tracking/c38(M) - imp.implant(M) + imp.implant(M, body_zone = BODY_ZONE_CHEST) /obj/projectile/bullet/c38/hotshot //similar to incendiary bullets, but do not leave a flaming trail name = ".38 Hot Shot bullet" @@ -97,7 +97,7 @@ var/mob/living/M = target M.adjust_bodytemperature(((100-blocked)/100)*(temperature - M.bodytemperature)) -// .357 (Syndie Revolver) +// .357 (Revolver) /obj/projectile/bullet/a357 name = ".357 bullet" diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 69410c5e39b1..6e24d0618231 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -3,13 +3,13 @@ /obj/projectile/bullet/a556 name = "5.56mm bullet" damage = 35 - armour_penetration = 30 + armor_penetration = 30 /obj/projectile/bullet/a556/phasic name = "5.56mm phasic bullet" icon_state = "gaussphase" damage = 20 - armour_penetration = 70 + armor_penetration = 70 projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS // 7.62 (Nagant Rifle) @@ -17,7 +17,7 @@ /obj/projectile/bullet/a762 name = "7.62 bullet" damage = 60 - armour_penetration = 10 + armor_penetration = 10 /obj/projectile/bullet/a762/enchanted name = "enchanted 7.62 bullet" @@ -30,5 +30,5 @@ name = "harpoon" icon_state = "gauss" damage = 60 - armour_penetration = 50 - embedding = list(embed_chance=100, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) + armor_penetration = 50 + embedding = list(embed_chance=100, fall_chance=0, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=10) diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 8b1730a45a8e..f5efaac28566 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -6,7 +6,7 @@ /obj/projectile/bullet/c45/ap name = ".45 armor-piercing bullet" - armour_penetration = 50 + armor_penetration = 50 /obj/projectile/bullet/incendiary/c45 name = ".45 incendiary bullet" @@ -18,12 +18,12 @@ /obj/projectile/bullet/c46x30mm name = "4.6x30mm bullet" damage = 20 - embed_falloff_tile = -4 + embed_adjustment_tile = 2 /obj/projectile/bullet/c46x30mm/ap name = "4.6x30mm armor-piercing bullet" damage = 15 - armour_penetration = 40 + armor_penetration = 40 embedding = null /obj/projectile/bullet/incendiary/c46x30mm diff --git a/code/modules/projectiles/projectile/bullets/sniper.dm b/code/modules/projectiles/projectile/bullets/sniper.dm index a5acb1f92e1b..6a1faa6db649 100644 --- a/code/modules/projectiles/projectile/bullets/sniper.dm +++ b/code/modules/projectiles/projectile/bullets/sniper.dm @@ -1,24 +1,24 @@ // .50 (Sniper) /obj/projectile/bullet/p50 - name =".50 bullet" + name =".50 BMG bullet" speed = 0.4 range = 400 // Enough to travel from one corner of the Z to the opposite corner and then some. damage = 70 paralyze = 100 dismemberment = 50 - armour_penetration = 50 + armor_penetration = 50 var/breakthings = TRUE /obj/projectile/bullet/p50/on_hit(atom/target, blocked = 0) if(isobj(target) && (blocked != 100) && breakthings) var/obj/O = target - O.take_damage(80, BRUTE, BULLET, FALSE) + O.take_damage(80, BRUTE, PUNCTURE, FALSE) return ..() /obj/projectile/bullet/p50/soporific - name =".50 soporific bullet" - armour_penetration = 0 + name =".50 BMG soporific bullet" + armor_penetration = 0 damage = 0 dismemberment = 0 paralyze = 0 @@ -31,7 +31,7 @@ return ..() /obj/projectile/bullet/p50/penetrator - name = "penetrator round" + name = ".50 BMG penetrator bullet" icon_state = "gauss" damage = 60 range = 50 @@ -49,7 +49,7 @@ range = 16 /obj/projectile/bullet/p50/marksman - name = ".50 marksman round" + name = ".50 BMG marksman bullet" damage = 50 paralyze = 0 tracer_type = /obj/effect/projectile/tracer/sniper diff --git a/code/modules/projectiles/projectile/energy/net_snare.dm b/code/modules/projectiles/projectile/energy/net_snare.dm index 2f3c3dfbf81b..0a14608a999e 100644 --- a/code/modules/projectiles/projectile/energy/net_snare.dm +++ b/code/modules/projectiles/projectile/energy/net_snare.dm @@ -32,7 +32,7 @@ /obj/effect/nettingportal/Initialize(mapload) . = ..() var/obj/item/beacon/teletarget = null - for(var/obj/machinery/computer/teleporter/com in GLOB.machines) + for(var/obj/machinery/computer/teleporter/com as anything in INSTANCES_OF(/obj/machinery/computer/teleporter)) var/atom/target = com.target_ref?.resolve() if(target) if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index af0f3fd661b0..209db846e346 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -18,7 +18,6 @@ do_sparks(1, TRUE, src) else if(iscarbon(target)) var/mob/living/carbon/C = target - SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) if(C.dna && C.dna.check_mutation(/datum/mutation/human/hulk)) C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk") diff --git a/code/modules/projectiles/projectile/energy/thermal.dm b/code/modules/projectiles/projectile/energy/thermal.dm index 012694125755..3ec2865d7021 100644 --- a/code/modules/projectiles/projectile/energy/thermal.dm +++ b/code/modules/projectiles/projectile/energy/thermal.dm @@ -4,7 +4,7 @@ damage = 20 damage_type = BURN armor_flag = ENERGY - armour_penetration = 10 + armor_penetration = 10 reflectable = NONE impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser @@ -15,7 +15,7 @@ var/mob/living/carbon/cold_target = target var/how_cold_is_target = cold_target.bodytemperature - var/danger_zone = cold_target.dna.species.bodytemp_cold_damage_limit - 150 + var/danger_zone = cold_target.dna.species.cold_level_1 - 150 if(how_cold_is_target < danger_zone) explosion(cold_target, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 2, flame_range = 3) //maybe stand back a bit cold_target.bodytemperature = cold_target.dna.species.bodytemp_normal //avoids repeat explosions, maybe could be used to heat up again? @@ -26,7 +26,7 @@ icon_state = "cryoshot" damage = 20 damage_type = BRUTE - armour_penetration = 10 + armor_penetration = 10 armor_flag = ENERGY sharpness = SHARP_POINTY //it's a big ol' shard of ice reflectable = NONE @@ -38,7 +38,7 @@ var/mob/living/carbon/hot_target = target var/how_hot_is_target = hot_target.bodytemperature - var/danger_zone = hot_target.dna.species.bodytemp_heat_damage_limit + 300 + var/danger_zone = hot_target.dna.species.heat_level_1 + 300 if(how_hot_is_target > danger_zone) hot_target.Knockdown(100) hot_target.apply_damage(20, BURN) diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index c3c2af6685fa..131cb57d156d 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -4,7 +4,7 @@ damage = 0 damage_type = OXY nodamage = TRUE - armour_penetration = 100 + armor_penetration = 100 armor_flag = NONE /// determines what type of antimagic can block the spell projectile var/antimagic_flags = MAGIC_RESISTANCE @@ -77,8 +77,8 @@ if(!stuff.anchored && stuff.loc && !isobserver(stuff)) if(do_teleport(stuff, stuff, 10, channel = TELEPORT_CHANNEL_MAGIC)) teleammount++ - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(max(round(4 - teleammount),0), stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(max(round(4 - teleammount),0), location = stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity smoke.start() /obj/projectile/magic/safety @@ -98,8 +98,8 @@ if(do_teleport(target, destination_turf, channel=TELEPORT_CHANNEL_MAGIC)) for(var/t in list(origin_turf, destination_turf)) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, t) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = t) smoke.start() /obj/projectile/magic/door @@ -333,11 +333,6 @@ name = "bolt of sapping" icon_state = "sapping" -/obj/projectile/magic/sapping/on_hit(mob/living/target) - . = ..() - if(isliving(target)) - SEND_SIGNAL(target, COMSIG_ADD_MOOD_EVENT, REF(src), /datum/mood_event/sapped) - /obj/projectile/magic/necropotence name = "bolt of necropotence" icon_state = "necropotence" @@ -570,7 +565,7 @@ if(istype(adjacent_object, /obj/structure/destructible/cult)) continue - adjacent_object.take_damage(90, BRUTE, MELEE, 0) + adjacent_object.take_damage(90, BRUTE, BLUNT, 0) new /obj/effect/temp_visual/cult/turf/floor(get_turf(adjacent_object)) //still magic related, but a different path @@ -581,7 +576,7 @@ damage = 0 damage_type = BURN nodamage = FALSE - armour_penetration = 100 + armor_penetration = 100 adj_temperature = -200 // Cools you down greatly per hit /obj/projectile/magic/nothing diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm index 55b832a9f2d2..053f66ed074a 100644 --- a/code/modules/projectiles/projectile/reusable/foam_dart.dm +++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm @@ -35,11 +35,3 @@ /obj/projectile/bullet/reusable/foam_dart/Destroy() pen = null return ..() - -/obj/projectile/bullet/reusable/foam_dart/riot - name = "riot foam dart" - icon_state = "foamdart_riot_proj" - base_icon_state = "foamdart_riot_proj" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - nodamage = FALSE - stamina = 25 diff --git a/code/modules/projectiles/projectile/special/meteor.dm b/code/modules/projectiles/projectile/special/meteor.dm index a0020a573d37..c2edfffe86c6 100644 --- a/code/modules/projectiles/projectile/special/meteor.dm +++ b/code/modules/projectiles/projectile/special/meteor.dm @@ -5,9 +5,9 @@ damage = 90 paralyze = 100 dismemberment = 90 - armour_penetration = 100 + armor_penetration = 100 damage_type = BRUTE - armor_flag = BULLET + armor_flag = PUNCTURE /obj/projectile/meteor/on_hit(atom/target, blocked = FALSE) . = ..() @@ -19,10 +19,9 @@ if(hit_target == firer) forceMove(hit_target.loc) return - if(isobj(hit_target)) - SSexplosions.med_mov_atom += hit_target - if(isturf(hit_target)) - SSexplosions.medturf += hit_target + if(isobj(hit_target) || isturf(hit_target)) + EX_ACT(hit_target, EXPLODE_HEAVY) + playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, TRUE) for(var/mob/onlookers_in_range in urange(10, src)) if(!onlookers_in_range.stat) diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm index b398731cfd6c..2699335a7b9a 100644 --- a/code/modules/projectiles/projectile/special/plasma.dm +++ b/code/modules/projectiles/projectile/special/plasma.dm @@ -15,7 +15,7 @@ . = ..() if(ismineralturf(target)) var/turf/closed/mineral/M = target - M.gets_drilled(firer, FALSE) + M.MinedAway() if(mine_range) mine_range-- range++ diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index 838fcb396ede..c2d04ad8cb7d 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -16,7 +16,7 @@ desc = "USE A WEEL GUN" icon_state= "84mm-hedp" damage = 80 - armour_penetration = 100 + armor_penetration = 100 dismemberment = 100 embedding = null shrapnel_type = null @@ -24,9 +24,9 @@ var/anti_armour_damage = 200 /obj/projectile/bullet/a84mm/on_hit(atom/target, blocked = FALSE) - if(isliving(target) && prob(1)) + if(isliving(target) && prob(50)) var/mob/living/gibbed_dude = target - if(gibbed_dude.stat < HARD_CRIT) + if(gibbed_dude.stat == CONSCIOUS) gibbed_dude.say("Is that a fucking ro-", forced = "hit by rocket") ..() diff --git a/code/modules/reagents/chemistry/cartridges/_cartridge.dm b/code/modules/reagents/chemistry/cartridges/_cartridge.dm new file mode 100644 index 000000000000..8f0423370714 --- /dev/null +++ b/code/modules/reagents/chemistry/cartridges/_cartridge.dm @@ -0,0 +1,236 @@ +// Base cartridge type. If you get this, someone fucked up somewhere. +/obj/item/reagent_containers/chem_cartridge + name = "this should only be seen in code chemical dispenser cartridge" + desc = "This goes in a chemical dispenser." + desc_controls = "Use a pen to set the label." + icon_state = "cartridge_large" + fill_icon_state = "cartridge" + fill_icon_thresholds = list(20, 40, 60, 80) + + w_class = WEIGHT_CLASS_BULKY + + // Large, but inaccurate. Use a chem dispenser or beaker for accuracy. + possible_transfer_amounts = list(50,100) + amount_per_transfer_from_this = 50 + + // These are pretty robust devices. + resistance_flags = UNACIDABLE | FIRE_PROOF | FREEZE_PROOF + + // Can be transferred to/from, but can't be spilled. + reagent_flags = OPENCONTAINER + + // If non-null, spawns with the specified reagent filling it's volume. + var/spawn_reagent + // Spawn temperature. You should only change this if the stored reagent reacts at room temperature (300K). + var/spawn_temperature = DEFAULT_REAGENT_TEMPERATURE + // Label to use. If empty or null, no label is set. Can be set/unset by players. + var/label + +// Large cartridge. Holds 500u. +/obj/item/reagent_containers/chem_cartridge/large + name = "large chemical dispenser cartridge" + volume = CARTRIDGE_VOLUME_LARGE + +// Medium cartridge. Holds 250u. +/obj/item/reagent_containers/chem_cartridge/medium + name = "medium chemical dispenser cartridge" + icon_state = "cartridge_medium" + volume = CARTRIDGE_VOLUME_MEDIUM + w_class = WEIGHT_CLASS_NORMAL + +// Small cartridge. Holds 100u. +/obj/item/reagent_containers/chem_cartridge/small + name = "small chemical dispenser cartridge" + icon_state = "cartridge_small" + volume = CARTRIDGE_VOLUME_SMALL + w_class = WEIGHT_CLASS_SMALL + +/obj/item/reagent_containers/chem_cartridge/New() + . = ..() + // Normally this doesn't do anything, but if someone wants to create mapped-in types, this will save them many headaches. + if(spawn_reagent) + reagents.add_reagent(spawn_reagent, volume, reagtemp = spawn_temperature) + var/datum/reagent/R = spawn_reagent + setLabel(initial(R.name)) + if(length(label)) + setLabel(label) + +/obj/item/reagent_containers/chem_cartridge/examine(mob/user) + . = ..() + to_chat(user, "It has a capacity of [volume] units.") + if(reagents.total_volume <= 0) + to_chat(user, "It is empty.") + else + to_chat(user, "It contains [reagents.total_volume] units of liquid.") + +/// Sets the label of the cartridge. Care should be taken to sanitize the input before passing it in here. +/obj/item/reagent_containers/chem_cartridge/proc/setLabel(desired_label, mob/user = null) + if(desired_label) + if(user) + to_chat(user, span_notice("You set the label on \the [src] to '[desired_label]'.")) + + label = desired_label + name = "[initial(name)] - '[desired_label]'" + else + if(user) + to_chat(user, span_notice("You clear the label on \the [src].")) + label = "" + name = initial(name) + +/obj/item/reagent_containers/chem_cartridge/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/pen)) + var/input = tgui_input_text(user, "Input (leave blank to clear):", "Set Label Name") + if(input != null) // Empty string is a false value. + setLabel() + return TRUE + + return ..() + +// Copy-pasted from beakers. This should probably be changed to a basetype thing later. +/obj/item/reagent_containers/chem_cartridge/afterattack(obj/target, mob/living/user, proximity) + . = ..() + if((!proximity) || !check_allowed_items(target,target_self=1)) + return + + if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + to_chat(user, span_warning("[src] is empty!")) + return + + if(target.reagents.holder_full()) + to_chat(user, span_warning("[target] is full.")) + return + + var/trans = reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + to_chat(user, span_notice("You transfer [trans] unit\s of the solution to [target].")) + + else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(!target.reagents.total_volume) + to_chat(user, span_warning("[target] is empty and can't be refilled!")) + return + + if(reagents.holder_full()) + to_chat(user, span_warning("[src] is full.")) + return + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) + to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) + + target.update_appearance() + +// Also copy-pasted from beakers. +/obj/item/reagent_containers/chem_cartridge/afterattack_secondary(atom/target, mob/user, proximity_flag, click_parameters) + if((!proximity_flag) || !check_allowed_items(target,target_self=1)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(!spillable) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(!target.reagents.total_volume) + to_chat(user, span_warning("[target] is empty!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(reagents.holder_full()) + to_chat(user, span_warning("[src] is full.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) + to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [target].")) + + target.update_appearance() + return SECONDARY_ATTACK_CONTINUE_CHAIN + +//Dispenser lists +GLOBAL_LIST_INIT(cartridge_list_chems, list( + /datum/reagent/aluminium = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/carbon = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/chlorine = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/copper = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/fluorine = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/hydrogen = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/iodine = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/iron = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/lithium = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/mercury = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/nitrogen = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/oxygen = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/phosphorus = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/potassium = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/uranium/radium = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/silicon = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/sodium = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/stable_plasma = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/sugar = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/sulfur = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/toxin/acid = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/water = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/fuel = /obj/item/reagent_containers/chem_cartridge/medium +)) + +GLOBAL_LIST_INIT(cartridge_list_botany, list( + /datum/reagent/toxin/mutagen = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/saltpetre = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/plantnutriment/eznutriment = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/plantnutriment/left4zednutriment = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/plantnutriment/robustharvestnutriment = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/water = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/toxin/plantbgone = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/toxin/plantbgone/weedkiller = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/toxin/pestkiller = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/medicine/cryoxadone = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/ammonia = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/ash = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/diethylamine = /obj/item/reagent_containers/chem_cartridge/medium +)) + +GLOBAL_LIST_INIT(cartridge_list_booze, list( + /datum/reagent/consumable/ethanol/absinthe = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/ale = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/applejack = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/beer = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/cognac = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/creme_de_cacao = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/creme_de_coconut = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/creme_de_menthe = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/curacao = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/gin = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/hcider = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/kahlua = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/beer/maltliquor = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/navy_rum = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/rum = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/sake = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/tequila = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/triple_sec = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/vermouth = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/vodka = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/whiskey = /obj/item/reagent_containers/chem_cartridge/small, + /datum/reagent/consumable/ethanol/wine = /obj/item/reagent_containers/chem_cartridge/small + )) + +GLOBAL_LIST_INIT(cartridge_list_drinks, list( + /datum/reagent/consumable/coffee = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/space_cola = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/cream = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/dr_gibb = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/grenadine = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/ice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/icetea = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/lemonjuice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/lemon_lime = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/limejuice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/menthol = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/orangejuice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/pineapplejuice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/shamblers = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/spacemountainwind = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/sodawater = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/space_up = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/sugar = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/tea = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/tomatojuice = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/consumable/tonic = /obj/item/reagent_containers/chem_cartridge/medium, + /datum/reagent/water = /obj/item/reagent_containers/chem_cartridge/medium + )) diff --git a/code/modules/reagents/chemistry/cartridges/cartridge_spawn.dm b/code/modules/reagents/chemistry/cartridges/cartridge_spawn.dm new file mode 100644 index 000000000000..3db4b9f904ee --- /dev/null +++ b/code/modules/reagents/chemistry/cartridges/cartridge_spawn.dm @@ -0,0 +1,14 @@ +// This is for admins. Allows quick smacking down of cartridges for player/debug use. +/client/proc/spawn_chemdisp_cartridge(size in list("small", "medium", "large"), reagent in subtypesof(/datum/reagent)) + set name = "Spawn Chemical Dispenser Cartridge" + set category = "Admin.Events" + + var/obj/item/reagent_containers/chem_cartridge/C + switch(size) + if("small") C = new /obj/item/reagent_containers/chem_cartridge/small(usr.loc) + if("medium") C = new /obj/item/reagent_containers/chem_cartridge/medium(usr.loc) + if("large") C = new /obj/item/reagent_containers/chem_cartridge/large(usr.loc) + C.reagents.add_reagent(reagent, C.volume) + var/datum/reagent/R = reagent + C.setLabel(initial(R.name)) + log_admin("[usr] spawned a [size] reagent container containing [reagent]") diff --git a/code/modules/reagents/chemistry/chem_wiki_render.dm b/code/modules/reagents/chemistry/chem_wiki_render.dm index a2ac0af8ffb5..c4a4adda4878 100644 --- a/code/modules/reagents/chemistry/chem_wiki_render.dm +++ b/code/modules/reagents/chemistry/chem_wiki_render.dm @@ -26,7 +26,7 @@ to_chat(usr, "Could not find [name]. Skipping.") continue //Get reaction - var/list/reactions = GLOB.chemical_reactions_list_product_index[reagent.type] + var/list/reactions = SSreagents.chemical_reactions_list_product_index[reagent.type] if(!length(reactions)) to_chat(usr, "Could not find [name] reaction! Continuing anyways.") @@ -49,16 +49,6 @@ //!style='background-color:#FFEE88;'|{{anchor|Synthetic-derived growth factor}}Synthetic-derived growth factor var/outstring = "!style='background-color:#FFEE88;'|{{anchor|[reagent.name]}}[reagent.name]" - if(istype(reagent, /datum/reagent/inverse)) - outstring += "\n
Inverse reagent" - - else - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent) - outstring += "\n
Inverse: \[\[#[inverse_reagent.name]|[inverse_reagent.name]\]\] <[reagent.inverse_chem_val*100]%" - var/ph_color - CONVERT_PH_TO_COLOR(reagent.ph, ph_color) - outstring += "\n
pH: [reagent.ph]" outstring += "\n|" //RECIPE @@ -71,11 +61,7 @@ //min temp if(reaction.is_cold_recipe) outstring += "Cold reaction\n
" - outstring += "Min temp: [reaction.required_temp]K\n
Overheat: [reaction.overheat_temp]K\n
Optimal pH: [reaction.optimal_ph_min] to [reaction.optimal_ph_max]" - - //Overly impure levels - if(reaction.purity_min) - outstring += "\n
Unstable purity: <[reaction.purity_min*100]%" + outstring += "Min temp: [reaction.required_temp]K\n
Overheat: [reaction.overheat_temp]K\n
" //Kinetics var/thermic = reaction.thermic_constant @@ -111,39 +97,6 @@ //if("cheesey") //outstring += "
Dangerously Cheesey" - //pH drift - if(reaction.results) - var/start_ph = 0 - var/reactant_vol = 0 - for(var/typepath in reaction.required_reagents) - var/datum/reagent/req_reagent = GLOB.chemical_reagents_list[typepath] - start_ph += req_reagent.ph * reaction.required_reagents[typepath] - reactant_vol += reaction.required_reagents[typepath] - - var/product_vol = 0 - var/end_ph = 0 - for(var/typepath in reaction.results) - var/datum/reagent/prod_reagent = GLOB.chemical_reagents_list[typepath] - end_ph += prod_reagent.ph * reaction.results[typepath] - product_vol += reaction.results[typepath] - - if(reactant_vol || product_vol) - start_ph = start_ph / reactant_vol - end_ph = end_ph / product_vol - var/sum_change = end_ph - start_ph - sum_change += reaction.H_ion_release - - if(sum_change > 0) - outstring += "\n
H+ consuming" - else if (sum_change < 0) - outstring += "\n
H+ producing" - else - to_chat(usr, "[reaction] doesn't have valid product and reagent volumes! Please tell Fermi.") - else - if(reaction.H_ion_release > 0) - outstring += "\n
H+ consuming" - else if (reaction.H_ion_release < 0) - outstring += "\n
H+ producing" //container if(reaction.required_container) @@ -152,9 +105,6 @@ container_name = replacetext(container_name, "_", " ") outstring += "\n
[container_name]" - //Warn if it's dangerous - if(reaction.reaction_tags & REACTION_TAG_DANGEROUS) - outstring += "\n
Dangerous" outstring += "\n|" //Description @@ -162,7 +112,7 @@ outstring += "\n|" //Chemical properties - *2 because 1 tick is every 2s - outstring += "Rate: [reagent.metabolization_rate*2]u/tick\n
Unreacted purity: [reagent.creation_purity*100]%[(reagent.overdose_threshold ? "\n
OD: [reagent.overdose_threshold]u" : "")]" + outstring += "Rate: [reagent.metabolization_rate*2]u/tick\n
[(reagent.overdose_threshold ? "\n
OD: [reagent.overdose_threshold]u" : "")]" if(length(reagent.addiction_types)) outstring += "\n
Addictions:" diff --git a/code/modules/reagents/chemistry/equilibrium.dm b/code/modules/reagents/chemistry/equilibrium.dm index 6ec28e34b035..9ff7ea5ecf76 100644 --- a/code/modules/reagents/chemistry/equilibrium.dm +++ b/code/modules/reagents/chemistry/equilibrium.dm @@ -25,25 +25,21 @@ var/step_target_vol = INFINITY ///How much of the reaction has been made so far. Mostly used for subprocs, but it keeps track across the whole reaction and is added to every step. var/reacted_vol = 0 - ///What our last delta_ph was - var/reaction_quality = 1 ///If we're done with this reaction so that holder can clear it. var/to_delete = FALSE ///Result vars, private - do not edit unless in reaction_step() ///How much we're adding var/delta_t - ///How pure our step is - var/delta_ph ///Modifiers from catalysts, do not use negative numbers. ///I should write a better handiler for modifying these ///Speed mod var/speed_mod = 1 - ///pH mod - var/h_ion_mod = 1 ///Temp mod var/thermic_mod = 1 ///Allow us to deal with lag by "charging" up our reactions to react faster over a period - this means that the reaction doesn't suddenly mass react - which can cause explosions var/time_deficit + /// Tracks if we were overheating last tick or not. + var/last_tick_overheating = FALSE ///Used to store specific data needed for a reaction, usually used to keep track of things between explosion calls. CANNOT be used as a part of chemical_recipe - those vars are static lookup tables. var/data = list() @@ -92,10 +88,6 @@ multiplier = min(multiplier, round((holder.get_reagent_amount(single_reagent) / reaction.required_reagents[single_reagent]), CHEMICAL_QUANTISATION_LEVEL)) if(multiplier == INFINITY) return FALSE - //Consider purity gating too? - probably not, purity is hard to determine - //To prevent reactions outside of the pH window from starting. - if(!((holder.ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (holder.ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) - return FALSE return TRUE /* @@ -119,16 +111,17 @@ var/total_matching_catalysts = 0 //Reagents check should be handled in the calculate_yield() from multiplier - //If the product/reactants are too impure + //This is generally faster + if(length(reaction.inhibitors)) + for(var/datum/reagent/reagent as anything in holder.reagent_list) + if(reagent in reaction.inhibitors) + return FALSE + + //If the product/reactants are able to occur for(var/datum/reagent/reagent as anything in holder.reagent_list) //this is done this way to reduce processing compared to holder.has_reagent(P) - for(var/datum/reagent/catalyst as anything in reaction.required_catalysts) - if(catalyst == reagent.type) - total_matching_catalysts++ - if(istype(reagent, /datum/reagent/catalyst_agent)) - var/datum/reagent/catalyst_agent/catalyst_agent = reagent - if(reagent.volume >= catalyst_agent.min_volume) - catalyst_agent.consider_catalyst(src) + if(reagent.type in reaction.required_catalysts) + total_matching_catalysts++ if(!(total_matching_catalysts == reaction.required_catalysts.len)) return FALSE @@ -208,23 +201,9 @@ */ /datum/equilibrium/proc/check_fail_states(step_volume_added) //Are we overheated? - if(reaction.is_cold_recipe) - if(holder.chem_temp < reaction.overheat_temp && reaction.overheat_temp != NO_OVERHEAT) //This is before the process - this is here so that overly_impure and overheated() share the same code location (and therefore vars) for calls. - SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps") - reaction.overheated(holder, src, step_volume_added) - else - if(holder.chem_temp > reaction.overheat_temp) - SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps") - reaction.overheated(holder, src, step_volume_added) - - //is our product too impure? - for(var/product in reaction.results) - var/datum/reagent/reagent = holder.has_reagent(product) - if(!reagent) //might be missing from overheat exploding - continue - if (reagent.purity < reaction.purity_min)//If purity is below the min, call the proc - SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overly impure reaction steps") - reaction.overly_impure(holder, src, step_volume_added) + if(holder.is_reaction_overheating(reaction)) + SSblackbox.record_feedback("tally", "chemical_reaction", 1, "[reaction.type] overheated reaction steps") + reaction.overheated(holder, src, step_volume_added) //did we explode? if(!holder.my_atom || holder.reagent_list.len == 0) @@ -237,12 +216,11 @@ * First checks the holder to make sure it can continue * Then calculates the purity and volume produced.TRUE * Then adds/removes reagents -* Then alters the holder pH and temperature, and calls reaction_step +* Then alters the holder temperature, and calls reaction_step * Arguments: * * delta_time - the time displacement between the last call and the current, 1 is a standard step -* * purity_modifier - how much to modify the step's purity by (0 - 1) */ -/datum/equilibrium/proc/react_timestep(delta_time, purity_modifier = 1) +/datum/equilibrium/proc/react_timestep(delta_time) if(to_delete) //This occurs when it explodes return FALSE @@ -255,37 +233,14 @@ delta_time = deal_with_time(delta_time) delta_t = 0 //how far off optimal temp we care - delta_ph = 0 //How far off the pH we are - var/cached_ph = holder.ph var/cached_temp = holder.chem_temp - var/purity = 1 //purity of the current step //Begin checks - //Calculate DeltapH (Deviation of pH from optimal) - //Within mid range - if (cached_ph >= reaction.optimal_ph_min && cached_ph <= reaction.optimal_ph_max) - delta_ph = 1 //100% purity for this step - //Lower range - else if (cached_ph < reaction.optimal_ph_min) //If we're outside of the optimal lower bound - if (cached_ph < (reaction.optimal_ph_min - reaction.determin_ph_range)) //If we're outside of the deterministic bound - delta_ph = 0 //0% purity - else //We're in the deterministic phase - delta_ph = (((cached_ph - (reaction.optimal_ph_min - reaction.determin_ph_range))**reaction.ph_exponent_factor)/((reaction.determin_ph_range**reaction.ph_exponent_factor))) //main pH calculation - //Upper range - else if (cached_ph > reaction.optimal_ph_max) //If we're above of the optimal lower bound - if (cached_ph > (reaction.optimal_ph_max + reaction.determin_ph_range)) //If we're outside of the deterministic bound - delta_ph = 0 //0% purity - else //We're in the deterministic phase - delta_ph = (((- cached_ph + (reaction.optimal_ph_max + reaction.determin_ph_range))**reaction.ph_exponent_factor)/(reaction.determin_ph_range**reaction.ph_exponent_factor))//Reverse - to + to prevent math operation failures. - - //This should never proc, but it's a catch incase someone puts in incorrect values - else - stack_trace("[holder.my_atom] attempted to determine FermiChem pH for '[reaction.type]' which had an invalid pH of [cached_ph] for set recipie pH vars. It's likely the recipe vars are wrong.") //Calculate DeltaT (Deviation of T from optimal) if(!reaction.is_cold_recipe) if (cached_temp < reaction.optimal_temp && cached_temp >= reaction.required_temp) - delta_t = (((cached_temp - reaction.required_temp)**reaction.temp_exponent_factor)/((reaction.optimal_temp - reaction.required_temp)**reaction.temp_exponent_factor)) + delta_t = ((cached_temp - reaction.required_temp) / (reaction.optimal_temp - reaction.required_temp)) ** reaction.temp_exponent_factor else if (cached_temp >= reaction.optimal_temp) delta_t = 1 else //too hot @@ -294,7 +249,7 @@ return else if (cached_temp > reaction.optimal_temp && cached_temp <= reaction.required_temp) - delta_t = (((reaction.required_temp - cached_temp)**reaction.temp_exponent_factor)/((reaction.required_temp - reaction.optimal_temp)**reaction.temp_exponent_factor)) + delta_t = ((reaction.required_temp - cached_temp) / (reaction.required_temp - reaction.optimal_temp)) ** reaction.temp_exponent_factor else if (cached_temp <= reaction.optimal_temp) delta_t = 1 else //Too cold @@ -303,114 +258,77 @@ return //Call any special reaction steps BEFORE addition - if(reaction.reaction_step(holder, src, delta_t, delta_ph, step_target_vol) == END_REACTION) + if(reaction.reaction_step(holder, src, delta_t, step_target_vol) == END_REACTION) to_delete = TRUE return //Catalyst modifier delta_t *= speed_mod - purity = delta_ph//set purity equal to pH offset - - //Then adjust purity of result with beaker reagent purity. - purity *= reactant_purity(reaction) - - //Then adjust it from the input modifier - purity *= purity_modifier - //Now we calculate how much to add - this is normalised to the rate up limiter - var/delta_chem_factor = (reaction.rate_up_lim*delta_t)*delta_time//add/remove factor + var/delta_chem_factor = reaction.rate_up_lim * delta_t *delta_time //add/remove factor var/total_step_added = 0 //keep limited if(delta_chem_factor > step_target_vol) delta_chem_factor = step_target_vol - else if (delta_chem_factor < CHEMICAL_VOLUME_MINIMUM) - delta_chem_factor = CHEMICAL_VOLUME_MINIMUM - //Normalise to multiproducts - delta_chem_factor /= product_ratio - //delta_chem_factor = round(delta_chem_factor, CHEMICAL_QUANTISATION_LEVEL) // Might not be needed - left here incase testmerge shows that it does. Remove before full commit. + + delta_chem_factor = round(delta_chem_factor / product_ratio, CHEMICAL_VOLUME_ROUNDING) + if(delta_chem_factor <= 0) + to_delete = TRUE + return //Calculate how much product to make and how much reactant to remove factors.. - for(var/reagent in reaction.required_reagents) - holder.remove_reagent(reagent, (delta_chem_factor * reaction.required_reagents[reagent]), safety = TRUE) - //Apply pH changes - var/pH_adjust - if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) - pH_adjust = ((delta_chem_factor * reaction.required_reagents[reagent])/target_vol)*(reaction.H_ion_release*h_ion_mod) - else //Default adds pH independant of volume - pH_adjust = (delta_chem_factor * reaction.required_reagents[reagent])*(reaction.H_ion_release*h_ion_mod) - holder.adjust_specific_reagent_ph(reagent, pH_adjust) + var/required_amount + for(var/datum/reagent/requirement as anything in reaction.required_reagents) + required_amount = reaction.required_reagents[requirement] + if(!holder.remove_reagent(requirement, delta_chem_factor * required_amount)) + to_delete = TRUE + return var/step_add - for(var/product in reaction.results) - //create the products - step_add = delta_chem_factor * reaction.results[product] - //Default handiling - holder.add_reagent(product, step_add, null, cached_temp, purity, override_base_ph = TRUE) - - //Apply pH changes - var/pH_adjust - if(reaction.reaction_flags & REACTION_PH_VOL_CONSTANT) - pH_adjust = (step_add/target_vol)*(reaction.H_ion_release*h_ion_mod) - else - pH_adjust = step_add*(reaction.H_ion_release*h_ion_mod) - holder.adjust_specific_reagent_ph(product, pH_adjust) + for(var/datum/reagent/product as anything in reaction.results) + step_add = holder.add_reagent(product, delta_chem_factor * reaction.results[product]) + if(!step_add) + to_delete = TRUE + return + + //record amounts created reacted_vol += step_add total_step_added += step_add #ifdef REAGENTS_TESTING //Kept in so that people who want to write fermireactions can contact me with this log so I can help them if(GLOB.Debug2) //I want my spans for my sanity message_admins("Reaction step active for:[reaction.type]") - message_admins("|Reaction conditions| Temp: [holder.chem_temp], pH: [holder.ph], reactions: [length(holder.reaction_list)], awaiting reactions: [length(holder.failed_but_capable_reactions)], no. reagents:[length(holder.reagent_list)], no. prev reagents: [length(holder.previous_reagent_list)]") - message_admins("Reaction vars: PreReacted:[reacted_vol] of [step_target_vol] of total [target_vol]. delta_t [delta_t], multiplier [multiplier], delta_chem_factor [delta_chem_factor] Pfactor [product_ratio], purity of [purity] from a delta_ph of [delta_ph]. DeltaTime: [delta_time]") + message_admins("|Reaction conditions| Temp: [holder.chem_temp], reactions: [length(holder.reaction_list)], awaiting reactions: [length(holder.failed_but_capable_reactions)], no. reagents:[length(holder.reagent_list)], no. prev reagents: [length(holder.previous_reagent_list)]") + message_admins("Reaction vars: PreReacted:[reacted_vol] of [step_target_vol] of total [target_vol]. delta_t [delta_t], multiplier [multiplier], delta_chem_factor [delta_chem_factor] Pfactor [product_ratio]. DeltaTime: [delta_time]") #endif - //Apply thermal output of reaction to beaker - if(reaction.reaction_flags & REACTION_HEAT_ARBITARY) - holder.chem_temp += clamp((reaction.thermic_constant* total_step_added*thermic_mod), 0, CHEMICAL_MAXIMUM_TEMPERATURE) //old method - for every bit added, the whole temperature is adjusted - else //Standard mechanics - var/heat_energy = reaction.thermic_constant * total_step_added * thermic_mod * SPECIFIC_HEAT_DEFAULT - holder.adjust_thermal_energy(heat_energy, 0, CHEMICAL_MAXIMUM_TEMPERATURE) //heat is relative to the beaker conditions + var/heat_energy = reaction.thermic_constant * total_step_added * thermic_mod + if(reaction.reaction_flags & REACTION_HEAT_ARBITARY) //old method - for every bit added, the whole temperature is adjusted + holder.set_temperature(clamp(holder.chem_temp + heat_energy, 0, CHEMICAL_MAXIMUM_TEMPERATURE)) + else //Standard mechanics - heat is relative to the beaker conditions + holder.adjust_thermal_energy(heat_energy * SPECIFIC_HEAT_DEFAULT, 0, CHEMICAL_MAXIMUM_TEMPERATURE) + var/is_overheating = holder.is_reaction_overheating(reaction) //Give a chance of sounds - if(prob(5)) - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] [reaction.mix_message]")) - if(reaction.mix_sound) - playsound(get_turf(holder.my_atom), reaction.mix_sound, 80, TRUE) + if(prob(5) || (is_overheating && !last_tick_overheating)) + holder.reaction_message(reaction) - //Used for UI output - reaction_quality = purity + last_tick_overheating = is_overheating //post reaction checks if(!(check_fail_states(total_step_added))) to_delete = TRUE - //end reactions faster so plumbing is faster - if((step_add >= step_target_vol) && (length(holder.reaction_list == 1)))//length is so that plumbing is faster - but it doesn't disable competitive reactions. Basically, competitive reactions will likely reach their step target at the start, so this will disable that. We want to avoid that. But equally, we do want to full stop a holder from reacting asap so plumbing isn't waiting an tick to resolve. + //If the volume of reagents created(total_step_added) >= volume of reagents still to be created(step_target_vol) then end + //i.e. we have created all the reagents needed for this reaction + //This is only accurate when a single reaction is present and we don't have multiple reactions where + //reaction B consumes the products formed from reaction A(which can happen in add_reagent() as it also triggers handle_reactions() which can consume the reagent just added) + //because total_step_added will be higher than the actual volume that was created leading to the reaction ending early + //and yielding less products than intended + if(total_step_added >= step_target_vol && length(holder.reaction_list) == 1) to_delete = TRUE - holder.update_total()//do NOT recalculate reactions - - -/* -* Calculates the total sum normalised purity of ALL reagents in a holder -* -* Currently calculates it irrespective of required reagents at the start, but this should be changed if this is powergamed to required reagents -* It's not currently because overly_impure affects all reagents -*/ -/datum/equilibrium/proc/reactant_purity(datum/chemical_reaction/C) - var/list/cached_reagents = holder.reagent_list - var/i = 0 - var/cached_purity - for(var/datum/reagent/reagent as anything in holder.reagent_list) - if (reagent in cached_reagents) - cached_purity += reagent.purity - i++ - if(!i)//I've never seen it get here with 0, but in case - it gets here when it blows up from overheat - stack_trace("No reactants found mid reaction for [C.type]. Beaker: [holder.my_atom]") - return 0 //we exploded and cleared reagents - but lets not kill the process - return cached_purity/i - ///Panic stop a reaction - cleanup should be handled by the next timestep /datum/equilibrium/proc/force_clear_reactive_agents() for(var/reagent in reaction.required_reagents) diff --git a/code/modules/reagents/chemistry/exposure.dm b/code/modules/reagents/chemistry/exposure.dm new file mode 100644 index 000000000000..f36fe238875c --- /dev/null +++ b/code/modules/reagents/chemistry/exposure.dm @@ -0,0 +1,33 @@ +/// Applies this reagent to an [/atom] +/datum/reagent/proc/expose_atom(atom/exposed_atom, reac_volume, exposed_temperature = T20C, datum/reagents/source) + SHOULD_CALL_PARENT(TRUE) + + . = 0 + . |= SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_ATOM, exposed_atom, reac_volume, exposed_temperature, source) + . |= SEND_SIGNAL(exposed_atom, COMSIG_ATOM_EXPOSE_REAGENT, src, reac_volume, exposed_temperature, source) + +/// Applies this reagent to a [/mob/living] +/datum/reagent/proc/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) + SHOULD_CALL_PARENT(TRUE) + + . = SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_MOB, exposed_mob, reac_volume, exposed_temperature, methods, show_message, touch_protection) + + var/amount = round(reac_volume*clamp((1 - touch_protection), 0, 1), 0.1) + if((methods & penetrates_skin)) //smoke, foam, spray + if(amount >= 0.5) + if(source) + source.trans_id_to(exposed_mob.reagents, type, amount) + else + exposed_mob.reagents.add_reagent(type, amount) //This handles carbon bloodstreams + +/// Applies this reagent to an [/obj] +/datum/reagent/proc/expose_obj(obj/exposed_obj, reac_volume, exposed_temperature) + SHOULD_CALL_PARENT(TRUE) + + return SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_OBJ, exposed_obj, reac_volume, exposed_temperature) + +/// Applies this reagent to a [/turf] +/datum/reagent/proc/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) + SHOULD_CALL_PARENT(TRUE) + + return SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_TURF, exposed_turf, reac_volume, exposed_temperature) diff --git a/code/modules/reagents/chemistry/goon_reagents/combo_reagents.dm b/code/modules/reagents/chemistry/goon_reagents/combo_reagents.dm new file mode 100644 index 000000000000..caefedaea9cd --- /dev/null +++ b/code/modules/reagents/chemistry/goon_reagents/combo_reagents.dm @@ -0,0 +1,14 @@ +/datum/reagent/fluorosurfactant//foam precursor + name = "Fluorosurfactant" + description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + color = "#9E6B38" // rgb: 158, 107, 56 + taste_description = "metal" + + +/datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. + name = "Foaming Agent" + description = "An agent that yields metallic foam when mixed with light metal and a strong acid." + reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 + taste_description = "metal" + diff --git a/code/modules/reagents/chemistry/goon_reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/goon_reagents/medicine_reagents.dm new file mode 100644 index 000000000000..54580aa72522 --- /dev/null +++ b/code/modules/reagents/chemistry/goon_reagents/medicine_reagents.dm @@ -0,0 +1,64 @@ +/datum/reagent/medicine/antihol + name = "Antihol" + description = "Purges alcoholic substance from the patient's body and eliminates its side effects." + color = "#00B4C8" + taste_description = "raw egg" + +/datum/reagent/medicine/antihol/affect_blood(mob/living/carbon/C, removed) + C.remove_status_effect(/datum/status_effect/dizziness) + C.set_drowsyness(0) + C.remove_status_effect(/datum/status_effect/speech/slurring/drunk) + C.remove_status_effect(/datum/status_effect/confusion) + holder.remove_reagent(/datum/reagent/consumable/ethanol, 3 * removed, include_subtypes = TRUE) + var/obj/item/organ/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) + if(stomach) + stomach.reagents.remove_reagent(/datum/reagent/consumable/ethanol, 3 * removed, include_subtypes = TRUE) + C.adjustToxLoss(-0.2 * removed, 0) + C.adjust_drunk_effect(-10 * removed) + . = TRUE + +/datum/reagent/medicine/strange_reagent + name = "Strange Reagent" + description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living." + reagent_state = LIQUID + color = "#A0E85E" + metabolization_rate = 0.25 + taste_description = "magnets" + harmful = TRUE + +// FEED ME SEYMOUR +/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(type, 1)) + mytray.spawnplant() + +/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) + if(exposed_mob.stat != DEAD) + return ..() + if(exposed_mob.suiciding) //they are never coming back + exposed_mob.visible_message(span_warning("[exposed_mob]'s body does not react...")) + return + if(iscarbon(exposed_mob) && !(methods & INGEST)) //simplemobs can still be splashed + return ..() + var/amount_to_revive = round((exposed_mob.getBruteLoss()+exposed_mob.getFireLoss())/20) + if(exposed_mob.getBruteLoss()+exposed_mob.getFireLoss() >= 200 || HAS_TRAIT(exposed_mob, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive. + exposed_mob.visible_message(span_warning("[exposed_mob]'s body convulses a bit, and then falls still once more.")) + exposed_mob.do_jitter_animation(10) + return + exposed_mob.visible_message(span_warning("[exposed_mob]'s body starts convulsing!")) + exposed_mob.notify_ghost_revival("Your body is being revived with Strange Reagent!") + exposed_mob.do_jitter_animation(10) + var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board + addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds + addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80) + addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79) + return ..() + +/datum/reagent/medicine/strange_reagent/affect_blood(mob/living/carbon/C, removed) + var/damage_at_random = rand(0, 250)/100 //0 to 2.5 + C.adjustBruteLoss(damage_at_random * removed, FALSE) + C.adjustFireLoss(damage_at_random * removed, FALSE) + . = TRUE + +/datum/reagent/medicine/strange_reagent/affect_touch(mob/living/carbon/C, removed) + holder.del_reagent(type) diff --git a/code/modules/reagents/chemistry/goon_reagents/other_reagents.dm b/code/modules/reagents/chemistry/goon_reagents/other_reagents.dm new file mode 100644 index 000000000000..335c46bf1a34 --- /dev/null +++ b/code/modules/reagents/chemistry/goon_reagents/other_reagents.dm @@ -0,0 +1,343 @@ +/datum/reagent/uranium + name = "Uranium" + description = "A jade-green metallic chemical element in the actinide series, weakly radioactive." + reagent_state = SOLID + color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother? + taste_description = "the inside of a reactor" + /// How much tox damage to deal per tick + var/tox_damage = 0.5 + material = /datum/material/uranium + + +/datum/reagent/uranium/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(tox_damage * removed, FALSE) + return TRUE + +/datum/reagent/uranium/expose_turf(turf/exposed_turf, reac_volume) + . = ..() + if((reac_volume < 3) || isspaceturf(exposed_turf)) + return + + var/obj/effect/decal/cleanable/greenglow/glow = locate() in exposed_turf.contents + if(!glow) + glow = new(exposed_turf) + if(!QDELETED(glow)) + glow.reagents.add_reagent(type, reac_volume) + +//Mutagenic chem side-effects. +/datum/reagent/uranium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + mytray.mutation_roll(user) + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 2)) + +/datum/reagent/uranium/radium + name = "Radium" + description = "Radium is an alkaline earth metal. It is extremely radioactive." + reagent_state = SOLID + color = "#00CC00" // ditto + taste_description = "the colour blue and regret" + tox_damage = 1 + material = null + + +/datum/reagent/uranium/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 1)) + +/datum/reagent/fuel/oil + name = "Oil" + description = "Burns in a small smoky fire, can be used to get Ash." + reagent_state = LIQUID + color = "#2D2D2D" + taste_description = "oil" + burning_temperature = 1200//Oil is crude + burning_volume = 0.05 //but has a lot of hydrocarbons + + addiction_types = null + +/datum/reagent/stable_plasma + name = "Stable Plasma" + description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." + reagent_state = LIQUID + color = "#2D2D2D" + taste_description = "bitterness" + taste_mult = 1.5 + + +/datum/reagent/stable_plasma/affect_blood(mob/living/carbon/C, removed) + C.adjustPlasma(10 * removed) + +/datum/reagent/fuel + name = "Welding Fuel" + description = "Required for welders. Flammable." + color = "#660000" // rgb: 102, 0, 0 + taste_description = "gross metal" + glass_icon_state = "dr_gibb_glass" + glass_name = "glass of welder fuel" + glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption." + penetrates_skin = NONE + burning_temperature = 1725 //more refined than oil + burning_volume = 0.2 + + addiction_types = list(/datum/addiction/alcohol = 4) + +/datum/reagent/fuel/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0)//Splashing people with welding fuel to make them easy to ignite! + . = ..() + if(methods & (TOUCH|VAPOR)) + exposed_mob.adjust_fire_stacks(reac_volume / 10) + +/datum/reagent/fuel/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(0.5 * removed, 0) + return TRUE + +/datum/reagent/space_cleaner + name = "Space Cleaner" + description = "A compound used to clean things." + color = "#A5F0EE" // rgb: 165, 240, 238 + taste_description = "sourness" + reagent_weight = 0.6 //so it sprays further + penetrates_skin = NONE + touch_met = 2 + var/clean_types = CLEAN_WASH + chemical_flags = REAGENT_CLEANS + +/datum/reagent/space_cleaner/expose_obj(obj/exposed_obj, reac_volume) + . = ..() + exposed_obj?.wash(clean_types) + +/datum/reagent/space_cleaner/expose_turf(turf/exposed_turf, reac_volume) + . = ..() + if(reac_volume < 1) + return + + exposed_turf.wash(clean_types) + for(var/am in exposed_turf) + var/atom/movable/movable_content = am + if(ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash + continue + movable_content.wash(clean_types) + + for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) + exposed_slime.adjustToxLoss(rand(5,10)) + + exposed_turf.AddComponent(/datum/component/smell, INTENSITY_STRONG, SCENT_ODOR, "bleach", 3, 5 MINUTES) + +/datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) + . = ..() + if(methods & (TOUCH|VAPOR)) + exposed_mob.wash(clean_types) + +/datum/reagent/space_cleaner/affect_touch(mob/living/carbon/C, removed) + C.adjustFireLoss(2 * removed, 0) // burns + return TRUE + +/datum/reagent/space_cleaner/ez_clean + name = "EZ Clean" + description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." + metabolization_rate = 0.5 + taste_description = "acid" + penetrates_skin = VAPOR + +/datum/reagent/space_cleaner/ez_clean/affect_blood(mob/living/carbon/C, removed) + C.adjustBruteLoss(1.665*removed, FALSE) + C.adjustFireLoss(1.665*removed, FALSE) + C.adjustToxLoss(1.665*removed, FALSE) + return TRUE + +/datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) + . = ..() + if((methods & (TOUCH|VAPOR)) && !issilicon(exposed_mob)) + exposed_mob.adjustBruteLoss(1.5) + exposed_mob.adjustFireLoss(1.5) + +///Used for clownery +/datum/reagent/lube + name = "Space Lube" + 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/expose_turf(turf/open/exposed_turf, reac_volume) + . = ..() + if(!istype(exposed_turf)) + return + if(reac_volume >= 1) + exposed_turf.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 + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/stimulants + name = "Stimulants" + description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage." + color = "#78008C" + metabolization_rate = 0.2 + overdose_threshold = 60 + chemical_flags = REAGENT_NO_RANDOM_RECIPE + addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds + +/datum/reagent/stimulants/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_STUNRESISTANCE, CHEM_TRAIT_SOURCE(class)) + ADD_TRAIT(C, TRAIT_STIMULANTS, CHEM_TRAIT_SOURCE(class)) + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + +/datum/reagent/stimulants/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_STIMULANT, 10) + +/datum/reagent/stimulants/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_STUNRESISTANCE, CHEM_TRAIT_SOURCE(class)) + REMOVE_TRAIT(C, TRAIT_STIMULANTS, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT(C, TRAIT_STIMULANTS)) + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) + +/datum/reagent/stimulants/affect_blood(mob/living/carbon/C, removed) + if(C.health < 50 && C.health > 0) + C.adjustOxyLoss(-1 * removed, 0) + C.adjustToxLoss(-1 * removed, 0) + C.adjustBruteLoss(-1 * removed, 0) + C.adjustFireLoss(-1 * removed, 0) + C.AdjustAllImmobility(-60 * removed) + C.stamina.adjust(30 * removed) + . = TRUE + +/datum/reagent/stimulants/overdose_process(mob/living/carbon/C) + if(prob(25)) + C.stamina.adjust(2.5) + C.adjustToxLoss(1, 0) + C.losebreath++ + . = TRUE + +/datum/reagent/ash + name = "Ash" + description = "Supposedly phoenixes rise from these, but you've never seen it." + reagent_state = LIQUID + color = "#515151" + taste_description = "ash" + + +// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer +/datum/reagent/ash/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjust_weedlevel(-1) + +// [Original ants concept by Keelin on Goon] +/datum/reagent/ants + name = "Ants" + description = "A genetic crossbreed between ants and termites, their bites land at a 3 on the Schmidt Pain Scale." + reagent_state = SOLID + color = "#993333" + taste_mult = 1.3 + taste_description = "tiny legs scuttling down the back of your throat" + metabolization_rate = 1 //1u per second + glass_name = "glass of ants" + glass_desc = "Bottoms up...?" + + /// How much damage the ants are going to be doing (rises with each tick the ants are in someone's body) + var/ant_damage = 0 + /// Tells the debuff how many ants we are being covered with. + var/amount_left = 0 + /// List of possible common statements to scream when eating ants + var/static/list/ant_screams = list( + "THEY'RE UNDER MY SKIN!!", + "GET THEM OUT OF ME!!", + "HOLY HELL THEY BURN!!", + "MY GOD THEY'RE INSIDE ME!!", + "GET THEM OUT!!" + ) + +/datum/reagent/ants/affect_ingest(mob/living/carbon/C, removed) + C.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1)), FALSE) //Scales with time. Roughly 32 brute with 100u. + ant_damage++ + if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. + return TRUE + + if(prob(10)) + spawn(-1) + C.say(pick(ant_screams), forced = /datum/reagent/ants) + if(prob(30)) + spawn(-1) + C.emote("scream") + if(prob(5)) // Stuns, but purges ants. + C.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1) + . = TRUE + ..() + +/datum/reagent/ants/affect_touch(mob/living/carbon/C, removed) + return affect_ingest(C, removed) + +/datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) + ant_damage = 0 + to_chat(living_anthill, "You feel like the last of the ants are out of your system.") + return ..() + +/datum/reagent/ants/affect_touch(mob/living/carbon/C, removed) + . = ..() + C.apply_status_effect(/datum/status_effect/ants, round(removed, 0.1)) + +/datum/reagent/ants/expose_obj(obj/exposed_obj, reac_volume) + . = ..() + var/turf/open/my_turf = exposed_obj.loc // No dumping ants on an object in a storage slot + if(!istype(my_turf)) //Are we actually in an open turf? + return + var/static/list/accepted_types = typecacheof(list(/obj/machinery/atmospherics, /obj/structure/cable, /obj/structure/disposalpipe)) + if(!accepted_types[exposed_obj.type]) // Bypasses pipes, vents, and cables to let people create ant mounds on top easily. + return + expose_turf(my_turf, reac_volume) + +/datum/reagent/ants/expose_turf(turf/exposed_turf, reac_volume) + . = ..() + if(!istype(exposed_turf) || isspaceturf(exposed_turf)) // Is the turf valid + return + if((reac_volume <= 10)) // Makes sure people don't duplicate ants. + return + + var/obj/effect/decal/cleanable/ants/pests = locate() in exposed_turf.contents + if(!pests) + pests = new(exposed_turf) + var/spilled_ants = (round(reac_volume,1) - 5) // To account for ant decals giving 3-5 ants on initialize. + pests.reagents.add_reagent(/datum/reagent/ants, spilled_ants) + pests.update_ant_damage() + +/datum/reagent/phenol + name = "Phenol" + description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own." + reagent_state = LIQUID + color = "#E7EA91" + taste_description = "acid" + +/datum/reagent/acetone + name = "Acetone" + description = "A colorless liquid solvent used in chemical synthesis." + taste_description = "acid" + reagent_state = LIQUID + color = "#808080" + metabolization_rate = 0.04 + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/acetone/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(removed * 3, FALSE) + return TRUE + +/datum/reagent/acetone/expose_obj(obj/exposed_obj, reac_volume, exposed_temperature) + . = ..() + if(istype(exposed_obj, /obj/item/paper)) + var/obj/item/paper/paperaffected = exposed_obj + paperaffected.clearpaper() + to_chat(usr, span_notice("The solution dissolves the ink on the paper.")) + return diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index e30c56ab9b70..d04c8eeb2023 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -3,92 +3,6 @@ #define REAGENTS_UI_MODE_RECIPE 2 #define REAGENT_TRANSFER_AMOUNT "amount" -#define REAGENT_PURITY "purity" - -/// Initialises all /datum/reagent into a list indexed by reagent id -/proc/init_chemical_reagent_list() - var/list/reagent_list = list() - - var/paths = subtypesof(/datum/reagent) - - for(var/datum/reagent/path as anything in paths) - if(initial(path.abstract_type) == path)//Are we abstract? - continue - var/datum/reagent/D = new path() - D.mass = rand(10, 800) //This is terrible and should be removed ASAP! - reagent_list[path] = D - - return reagent_list - -/proc/build_chemical_reactions_lists() - //Chemical Reactions - Initialises all /datum/chemical_reaction into a list - // It is filtered into multiple lists within a list. - // For example: - // chemical_reactions_list_reactant_index[/datum/reagent/toxin/plasma] is a list of all reactions relating to plasma - //For chemical reaction list product index - indexes reactions based off the product reagent type - see get_recipe_from_reagent_product() in helpers - //For chemical reactions list lookup list - creates a bit list of info passed to the UI. This is saved to reduce lag from new windows opening, since it's a lot of data. - - //Prevent these reactions from appearing in lookup tables (UI code) - var/list/blacklist = (/datum/chemical_reaction/randomized) - - if(GLOB.chemical_reactions_list_reactant_index) - return - - //Randomized need to go last since they need to check against conflicts with normal recipes - var/paths = subtypesof(/datum/chemical_reaction) - typesof(/datum/chemical_reaction/randomized) + subtypesof(/datum/chemical_reaction/randomized) - GLOB.chemical_reactions_list = list() //typepath to reaction list - GLOB.chemical_reactions_list_reactant_index = list() //reagents to reaction list - GLOB.chemical_reactions_results_lookup_list = list() //UI glob - GLOB.chemical_reactions_list_product_index = list() //product to reaction list - - for(var/path in paths) - var/datum/chemical_reaction/D = new path() - var/list/reaction_ids = list() - var/list/product_ids = list() - var/list/reagents = list() - var/list/product_names = list() - var/bitflags = D.reaction_tags - - if(!D.required_reagents || !D.required_reagents.len) //Skip impossible reactions - continue - - GLOB.chemical_reactions_list[path] = D - - for(var/reaction in D.required_reagents) - reaction_ids += reaction - var/datum/reagent/reagent = find_reagent_object_from_type(reaction) - reagents += list(list("name" = reagent.name, "id" = reagent.type)) - - for(var/product in D.results) - var/datum/reagent/reagent = find_reagent_object_from_type(product) - product_names += reagent.name - product_ids += product - - var/product_name - if(!length(product_names)) - var/list/names = splittext("[D.type]", "/") - product_name = names[names.len] - else - product_name = product_names[1] - - // Create filters based on each reagent id in the required reagents list - this is specifically for finding reactions from product(reagent) ids/typepaths. - for(var/id in product_ids) - if(is_type_in_list(D.type, blacklist)) - continue - if(!GLOB.chemical_reactions_list_product_index[id]) - GLOB.chemical_reactions_list_product_index[id] = list() - GLOB.chemical_reactions_list_product_index[id] += D - - //Master list of ALL reactions that is used in the UI lookup table. This is expensive to make, and we don't want to lag the server by creating it on UI request, so it's cached to send to UIs instantly. - if(!(is_type_in_list(D.type, blacklist))) - GLOB.chemical_reactions_results_lookup_list += list(list("name" = product_name, "id" = D.type, "bitflags" = bitflags, "reactants" = reagents)) - - // Create filters based on each reagent id in the required reagents list - this is used to speed up handle_reactions() - for(var/id in reaction_ids) - if(!GLOB.chemical_reactions_list_reactant_index[id]) - GLOB.chemical_reactions_list_reactant_index[id] = list() - GLOB.chemical_reactions_list_reactant_index[id] += D - break // Don't bother adding ourselves to other reagent ids, it is redundant ///////////////////////////////Main reagents code///////////////////////////////////////////// @@ -104,8 +18,6 @@ var/atom/my_atom = null /// Current temp of the holder volume var/chem_temp = 150 - ///pH of the whole system - var/ph = CHEMICAL_NORMAL_PH /// unused var/last_tick = 1 /// various flags, see code\__DEFINES\reagents.dm @@ -114,7 +26,7 @@ var/list/datum/equilibrium/reaction_list ///cached list of reagents typepaths (not object references), this is a lazylist for optimisation var/list/datum/reagent/previous_reagent_list - ///If a reaction fails due to temperature or pH, this tracks the required temperature or pH for it to be enabled. + ///If a reaction fails due to temperature, this tracks the required temperature for it to be enabled. var/list/failed_but_capable_reactions ///Hard check to see if the reagents is presently reacting var/is_reacting = FALSE @@ -129,6 +41,8 @@ var/ui_reaction_index = 1 ///If we're syncing with the beaker - so return reactions that are actively happening var/ui_beaker_sync = FALSE + /// The metabolism type this container uses. For mobs. + var/metabolism_class /datum/reagents/New(maximum=100, new_flags=0) maximum_volume = maximum @@ -157,12 +71,9 @@ * * list/data - Any reagent data for this reagent, used for transferring data with reagents * * reagtemp - Temperature of this reagent, will be equalized * * no_react - prevents reactions being triggered by this addition - * * added_purity - override to force a purity when added - * * added_ph - override to force a pH when added - * * override_base_ph - ingore the present pH of the reagent, and instead use the default (i.e. if buffers/reactions alter it) * * ignore splitting - Don't call the process that handles reagent spliting in a mob (impure/inverse) - generally leave this false unless you care about REAGENTS_DONOTSPLIT flags (see reagent defines) */ -/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = DEFAULT_REAGENT_TEMPERATURE, added_purity = null, added_ph, no_react = FALSE, override_base_ph = FALSE, ignore_splitting = FALSE) +/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = DEFAULT_REAGENT_TEMPERATURE, no_react = FALSE, ignore_splitting = FALSE) if(!isnum(amount) || !amount) return FALSE @@ -172,34 +83,18 @@ if(SEND_SIGNAL(src, COMSIG_REAGENTS_PRE_ADD_REAGENT, reagent, amount, reagtemp, data, no_react) & COMPONENT_CANCEL_REAGENT_ADD) return FALSE - var/datum/reagent/glob_reagent = GLOB.chemical_reagents_list[reagent] + var/datum/reagent/glob_reagent = SSreagents.chemical_reagents_list[reagent] if(!glob_reagent) stack_trace("[my_atom] attempted to add a reagent called '[reagent]' which doesn't exist. ([usr])") return FALSE - if(isnull(added_purity)) //Because purity additions can be 0 - added_purity = glob_reagent.creation_purity //Usually 1 - if(!added_ph) - added_ph = glob_reagent.ph - - //Split up the reagent if it's in a mob - var/has_split = FALSE - if(!ignore_splitting && (flags & REAGENT_HOLDER_ALIVE)) //Stomachs are a pain - they will constantly call on_mob_add unless we split on addition to stomachs, but we also want to make sure we don't double split - var/adjusted_vol = process_mob_reagent_purity(glob_reagent, amount, added_purity) - if(!adjusted_vol) //If we're inverse or FALSE cancel addition - return TRUE - /* We return true here because of #63301 - The only cases where this will be false or 0 if its an inverse chem, an impure chem of 0 purity (highly unlikely if even possible), or if glob_reagent is null (which shouldn't happen at all as there's a check for that a few lines up), - In the first two cases, we would want to return TRUE so trans_to and other similar methods actually delete the corresponding chemical from the original reagent holder. - */ - amount = adjusted_vol - has_split = TRUE - update_total() var/cached_total = total_volume if(cached_total + amount > maximum_volume) - amount = (maximum_volume - cached_total) //Doesnt fit in. Make it disappear. shouldn't happen. Will happen. - if(amount <= 0) - return FALSE + amount = maximum_volume - cached_total //Doesnt fit in. Make it disappear. shouldn't happen. Will happen. + + amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) + if(amount <= 0) + return FALSE var/cached_temp = chem_temp var/list/cached_reagents = reagent_list @@ -213,12 +108,7 @@ //add the reagent to the existing if it exists for(var/datum/reagent/iter_reagent as anything in cached_reagents) if(iter_reagent.type == reagent) - if(override_base_ph) - added_ph = iter_reagent.ph - iter_reagent.purity = ((iter_reagent.creation_purity * iter_reagent.volume) + (added_purity * amount)) /(iter_reagent.volume + amount) //This should add the purity to the product - iter_reagent.creation_purity = iter_reagent.purity - iter_reagent.ph = ((iter_reagent.ph*(iter_reagent.volume))+(added_ph*amount))/(iter_reagent.volume+amount) - iter_reagent.volume += round(amount, CHEMICAL_QUANTISATION_LEVEL) + iter_reagent.volume += amount update_total() iter_reagent.on_merge(data, amount) @@ -232,23 +122,18 @@ SEND_SIGNAL(src, COMSIG_REAGENTS_ADD_REAGENT, iter_reagent, amount, reagtemp, data, no_react) if(!no_react && !is_reacting) //To reduce the amount of calculations for a reaction the reaction list is only updated on a reagents addition. handle_reactions() - return TRUE + return amount //otherwise make a new one var/datum/reagent/new_reagent = new reagent(data) cached_reagents += new_reagent new_reagent.holder = src new_reagent.volume = amount - new_reagent.purity = added_purity - new_reagent.creation_purity = added_purity - new_reagent.ph = added_ph new_reagent.on_new(data) if(isliving(my_atom)) - new_reagent.on_mob_add(my_atom, amount) //Must occur before it could posibly run on_mob_delete + new_reagent.on_mob_add(my_atom, amount, metabolism_class) //Must occur before it could posibly run on_mob_delete - if(has_split) //prevent it from splitting again - new_reagent.chemical_flags |= REAGENT_DONOTSPLIT update_total() if(reagtemp != cached_temp) @@ -263,142 +148,123 @@ handle_reactions() return TRUE -/// Like add_reagent but you can enter a list. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) -/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) - for(var/r_id in list_reagents) - var/amt = list_reagents[r_id] - add_reagent(r_id, amt, data) - - -/// Remove a specific reagent -/datum/reagents/proc/remove_reagent(reagent, amount, safety = TRUE)//Added a safety check for the trans_id_to - if(isnull(amount)) - amount = 0 - CRASH("null amount passed to reagent code") +/** + * Removes a specific reagent. can supress reactions if needed + * Arguments + * + * * [reagent_type][datum/reagent] - the type of reagent + * * amount - the volume to remove + * * safety - if FALSE will initiate reactions upon removing. used for trans_id_to + * * include_subtypes - if TRUE will remove the specified amount from all subtypes of reagent_type as well + */ +/datum/reagents/proc/remove_reagent(datum/reagent/reagent_type, amount, safety = TRUE, include_subtypes = FALSE) + if(!ispath(reagent_type)) + stack_trace("invalid reagent passed to remove reagent [reagent_type]") + return FALSE - if(!isnum(amount)) + if(!IS_FINITE(amount)) + stack_trace("non finite amount passed to remove reagent [amount] [reagent_type]") return FALSE - if(amount < 0) + amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) + if(amount <= 0) return FALSE + var/total_removed_amount = 0 + var/remove_amount = 0 var/list/cached_reagents = reagent_list for(var/datum/reagent/cached_reagent as anything in cached_reagents) - if(cached_reagent.type == reagent) - //clamp the removal amount to be between current reagent amount - //and zero, to prevent removing more than the holder has stored - amount = clamp(amount, 0, cached_reagent.volume) - cached_reagent.volume -= amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(cached_reagent) ? reagent : cached_reagent, amount) - - return TRUE - return FALSE - -/// Remove an amount of reagents without caring about what they are -/datum/reagents/proc/remove_any(amount = 1) - var/list/cached_reagents = reagent_list - var/total_removed = 0 - var/current_list_element = 1 - var/initial_list_length = cached_reagents.len //stored here because removing can cause some reagents to be deleted, ergo length change. + //check for specific type or subtypes + if(!include_subtypes) + if(cached_reagent.type != reagent_type) + continue + else if(!istype(cached_reagent, reagent_type)) + continue - current_list_element = rand(1, cached_reagents.len) + remove_amount = min(cached_reagent.volume, amount) + cached_reagent.volume -= remove_amount - while(total_removed != amount) - if(total_removed >= amount) - break - if(total_volume <= 0 || !cached_reagents.len) - break + update_total() + if(!safety)//So it does not handle reactions when it need not to + handle_reactions() + SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(cached_reagent) ? reagent_type : cached_reagent, amount) - if(current_list_element > cached_reagents.len) - current_list_element = 1 + total_removed_amount += remove_amount - var/datum/reagent/R = cached_reagents[current_list_element] - var/remove_amt = min(amount-total_removed,round(amount/rand(2,initial_list_length),round(amount/10,0.01))) //double round to keep it at a somewhat even spread relative to amount without getting funky numbers. - //min ensures we don't go over amount. - remove_reagent(R.type, remove_amt) + //if we reached here means we have found our specific reagent type so break + if(!include_subtypes) + return total_removed_amount - current_list_element++ - total_removed += remove_amt - update_total() + return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) - handle_reactions() - return total_removed //this should be amount unless the loop is prematurely broken, in which case it'll be lower. It shouldn't ever go OVER amount. +/** + * Removes all reagents either proportionally(amount is the direct volume to remove) + * when proportional the total volume of all reagents removed will equal to amount + * or relatively(amount is a percentile between 0->1) when relative amount is the % + * of each reagent to be removed + * + * Arguments + * + * * amount - the amount to remove + * * relative - if TRUE amount is treated as an percentage between 0->1. If FALSE amount is the direct volume to remove + */ +/datum/reagents/proc/remove_all(amount = 1, relative = FALSE) + if(!total_volume) + return FALSE -/// Removes all reagents from this holder -/datum/reagents/proc/remove_all(amount = 1) - var/list/cached_reagents = reagent_list - if(total_volume > 0) - var/part = amount / total_volume - for(var/datum/reagent/reagent as anything in cached_reagents) - remove_reagent(reagent.type, reagent.volume * part) + if(!IS_FINITE(amount)) + stack_trace("non finite amount passed to remove all reagents [amount]") + return FALSE + if(relative && (amount < 0 || amount > 1)) + stack_trace("illegal percentage value passed to remove all reagents [amount]") + return FALSE - //finish_reacting() //A just in case - update total is in here - should be unneeded, make sure to test this - handle_reactions() - return amount + amount = round(amount, CHEMICAL_QUANTISATION_LEVEL) + if(amount <= 0) + return FALSE -/// Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included. -/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) - if(!isnum(amount)) - return 1 var/list/cached_reagents = reagent_list - var/has_removed_reagent = 0 - + var/total_removed_amount = 0 + var/part = amount + if(!relative) + part /= total_volume for(var/datum/reagent/reagent as anything in cached_reagents) - var/matches = 0 - // Switch between how we check the reagent type - if(strict) - if(reagent.type == reagent_type) - matches = 1 - else - if(istype(reagent, reagent_type)) - matches = 1 - // We found a match, proceed to remove the reagent. Keep looping, we might find other reagents of the same type. - if(matches) - // Have our other proc handle removement - has_removed_reagent = remove_reagent(reagent.type, amount, safety) + total_removed_amount += remove_reagent(reagent.type, reagent.volume * part) + handle_reactions() - return has_removed_reagent + return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) -/// Fuck this one reagent -/datum/reagents/proc/del_reagent(target_reagent_typepath) +/** + * Removes an specific reagent from this holder + * Arguments + * + * * [target_reagent_typepath][datum/reagent] - type typepath of the reagent to remove + */ +/datum/reagents/proc/del_reagent(datum/reagent/target_reagent_typepath) + if(!ispath(target_reagent_typepath)) + stack_trace("invalid reagent path passed to del reagent [target_reagent_typepath]") + return FALSE + + //setting the volume to 0 will allow update_total() to clear it up for us var/list/cached_reagents = reagent_list for(var/datum/reagent/reagent as anything in cached_reagents) if(reagent.type == target_reagent_typepath) - if(isliving(my_atom)) - if(reagent.metabolizing) - reagent.metabolizing = FALSE - reagent.on_mob_end_metabolize(my_atom) - reagent.on_mob_delete(my_atom) - - reagent_list -= reagent - LAZYREMOVE(previous_reagent_list, reagent.type) - qdel(reagent) + reagent.volume = 0 update_total() - SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, reagent) - return TRUE + return TRUE -//Converts the creation_purity to purity -/datum/reagents/proc/uncache_creation_purity(id) - var/datum/reagent/R = has_reagent(id) - if(!R) - return - R.purity = R.creation_purity + return FALSE /// Remove every reagent except this one /datum/reagents/proc/isolate_reagent(reagent) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/cached_reagent as anything in cached_reagents) + for(var/datum/reagent/cached_reagent as anything in reagent_list) if(cached_reagent.type != reagent) del_reagent(cached_reagent.type) update_total() /// Removes all reagents /datum/reagents/proc/clear_reagents() - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) + for(var/datum/reagent/reagent as anything in reagent_list) del_reagent(reagent.type) SEND_SIGNAL(src, COMSIG_REAGENTS_CLEAR_REAGENTS) @@ -410,8 +276,7 @@ * Needs matabolizing takes into consideration if the chemical is matabolizing when it's checked. */ /datum/reagents/proc/has_reagent(reagent, amount = -1, needs_metabolizing = FALSE) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/holder_reagent as anything in cached_reagents) + for(var/datum/reagent/holder_reagent as anything in reagent_list) if (holder_reagent.type == reagent) if(!amount) if(needs_metabolizing && !holder_reagent.metabolizing) @@ -424,6 +289,41 @@ return holder_reagent return FALSE +/// Like has_reagent but you can enter a list. +/datum/reagents/proc/has_reagent_list(list/list_reagents) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + if(!has_reagent(r_id, amt)) + return FALSE + return TRUE + +/** + * Like add_reagent but you can enter a list. + * Arguments + * + * * [list_reagents][list] - list to add. Format it like this: list(/datum/reagent/toxin = 10, "beer" = 15) + * * [data][list] - additional data to add + */ +/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + add_reagent(r_id, amt, data) + +/// Like remove_reagent but you can enter a list. +/datum/reagents/proc/remove_reagent_list(list/list_reagents) + for(var/r_id in list_reagents) + var/amt = list_reagents[r_id] + remove_reagent(r_id, amt) + +/// Adds a reagent up to a cap. +/datum/reagents/proc/add_reagent_up_to(reagent, amount, cap) + var/existing = get_reagent_amount(reagent) + if(existing >= cap) + return + + var/to_add = min(cap - amount, cap - existing, amount) + return add_reagent(reagent, to_add) + /** * Check if this holder contains a reagent with a chemical_flags containing this flag * Reagent takes the bitflag to search for @@ -431,8 +331,7 @@ */ /datum/reagents/proc/has_chemical_flag(chemical_flag, amount = 0) var/found_amount = 0 - var/list/cached_reagents = reagent_list - for(var/datum/reagent/holder_reagent as anything in cached_reagents) + for(var/datum/reagent/holder_reagent as anything in reagent_list) if (holder_reagent.chemical_flags & chemical_flag) found_amount += holder_reagent.volume if(found_amount >= amount) @@ -450,40 +349,53 @@ * * preserve_data - if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred. * * no_react - passed through to [/datum/reagents/proc/add_reagent] * * mob/transfered_by - used for logging - * * remove_blacklisted - skips transferring of reagents without REAGENT_CAN_BE_SYNTHESIZED in chemical_flags + * * remove_blacklisted - skips transferring of reagents with REAGENT_SPECIAL in chemical_flags * * methods - passed through to [/datum/reagents/proc/expose_single] and [/datum/reagent/proc/on_transfer] * * show_message - passed through to [/datum/reagents/proc/expose_single] * * round_robin - if round_robin=TRUE, so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors - * * ignore_stomach - when using methods INGEST will not use the stomach as the target */ -/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transfered_by, remove_blacklisted = FALSE, methods = NONE, show_message = TRUE, round_robin = FALSE, ignore_stomach = FALSE) - var/list/cached_reagents = reagent_list - if(!target || !total_volume) - return - if(amount < 0) - return +/datum/reagents/proc/trans_to(obj/target, amount = 1, multiplier = 1, preserve_data = TRUE, no_react = FALSE, mob/transfered_by, remove_blacklisted = FALSE, methods = NONE, show_message = TRUE, round_robin = FALSE) + if(QDELETED(target) || !total_volume) + return FALSE + if(!IS_FINITE(amount)) + stack_trace("non finite amount passed to trans_to [amount] amount of reagents") + return FALSE + + var/list/cached_reagents = reagent_list var/cached_amount = amount var/atom/target_atom var/datum/reagents/R + if(istype(target, /datum/reagents)) R = target target_atom = R.my_atom else - if(!ignore_stomach && (methods & INGEST) && istype(target, /mob/living/carbon)) - var/mob/living/carbon/eater = target - var/obj/item/organ/stomach/belly = eater.getorganslot(ORGAN_SLOT_STOMACH) - if(!belly) - eater.expel_ingested(my_atom, amount) - return - R = belly.reagents - target_atom = belly + if(istype(target, /mob/living/carbon)) + var/mob/living/carbon/C = target + if(methods & INGEST) + var/obj/item/organ/stomach/belly = C.getorganslot(ORGAN_SLOT_STOMACH) + if(!belly) + C.expel_ingested(my_atom, amount) + return + R = belly.reagents + target_atom = C + + else if(methods & TOUCH) + R = C.touching + target_atom = C + + else + R = C.bloodstream + target_atom = C + else if(!target.reagents) return else R = target.reagents target_atom = target + //Set up new reagents to inherit the old ongoing reactions if(!no_react) transfer_reactions(R) @@ -494,23 +406,24 @@ if(!round_robin) var/part = amount / src.total_volume for(var/datum/reagent/reagent as anything in cached_reagents) - if(remove_blacklisted && !(reagent.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED)) + if(remove_blacklisted && (reagent.chemical_flags & REAGENT_SPECIAL)) continue var/transfer_amount = reagent.volume * part if(preserve_data) trans_data = copy_data(reagent) if(reagent.intercept_reagents_transfer(R, cached_amount))//Use input amount instead. continue - if(!R.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transfered. + if(!R.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transfered. continue if(methods) if(istype(target_atom, /obj/item/organ)) - R.expose_single(reagent, target, methods, part, show_message) + R.expose_single(reagent, target, methods, transfer_amount, multiplier, show_message) else - R.expose_single(reagent, target_atom, methods, part, show_message) + R.expose_single(reagent, target_atom, methods, transfer_amount, multiplier, show_message) reagent.on_transfer(target_atom, methods, transfer_amount * multiplier) + remove_reagent(reagent.type, transfer_amount) - var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) + var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount) transfer_log[reagent.type] = reagent_qualities else @@ -518,7 +431,7 @@ for(var/datum/reagent/reagent as anything in cached_reagents) if(!to_transfer) break - if(remove_blacklisted && !(reagent.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED)) + if(remove_blacklisted && (reagent.chemical_flags & REAGENT_SPECIAL)) continue if(preserve_data) trans_data = copy_data(reagent) @@ -527,21 +440,22 @@ transfer_amount = reagent.volume if(reagent.intercept_reagents_transfer(R, cached_amount))//Use input amount instead. continue - if(!R.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transfered. + if(!R.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT)) //we only handle reaction after every reagent has been transfered. continue to_transfer = max(to_transfer - transfer_amount , 0) if(methods) if(istype(target_atom, /obj/item/organ)) - R.expose_single(reagent, target, methods, transfer_amount, show_message) + R.expose_single(reagent, target, methods, transfer_amount, multiplier, show_message) else - R.expose_single(reagent, target_atom, methods, transfer_amount, show_message) + R.expose_single(reagent, target_atom, methods, transfer_amount, multiplier, show_message) reagent.on_transfer(target_atom, methods, transfer_amount * multiplier) + remove_reagent(reagent.type, transfer_amount) - var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount, REAGENT_PURITY = reagent.purity) + var/list/reagent_qualities = list(REAGENT_TRANSFER_AMOUNT = transfer_amount) transfer_log[reagent.type] = reagent_qualities if(transfered_by && target_atom) - target_atom.add_hiddenprint(transfered_by) //log prints so admins can figure out who touched it last. + target_atom.log_touch(transfered_by) //log prints so admins can figure out who touched it last. log_combat(transfered_by, target_atom, "transferred reagents ([get_external_reagent_log_string(transfer_log)]) from [my_atom] to") update_total() @@ -551,8 +465,8 @@ src.handle_reactions() return amount -/// Transfer a specific reagent id to the target object -/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N +/// Transfer a specific reagent id to the target object. Accepts a reagent instance, but assumes the reagent is in src. +/datum/reagents/proc/trans_id_to(obj/target, datum/reagent/reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N var/list/cached_reagents = reagent_list if (!target) return @@ -564,25 +478,35 @@ holder = target.reagents else return - if(amount < 0) + if(amount <= CHEMICAL_QUANTISATION_LEVEL) return - var/cached_amount = amount - if(get_reagent_amount(reagent) < amount) - amount = get_reagent_amount(reagent) - amount = min(round(amount, CHEMICAL_VOLUME_ROUNDING), holder.maximum_volume - holder.total_volume) + var/cached_amount = amount var/trans_data = null - for (var/looping_through_reagents in cached_reagents) - var/datum/reagent/current_reagent = looping_through_reagents - if(current_reagent.type == reagent) - if(preserve_data) - trans_data = current_reagent.data - if(current_reagent.intercept_reagents_transfer(holder, cached_amount))//Use input amount instead. + if(!istype(reagent)) + amount = min(get_reagent_amount(reagent), amount) + amount = min(round(amount, CHEMICAL_VOLUME_ROUNDING), holder.maximum_volume - holder.total_volume) + + for (var/looping_through_reagents in cached_reagents) + var/datum/reagent/current_reagent = looping_through_reagents + if(current_reagent.type == reagent) + if(preserve_data) + trans_data = current_reagent.data + if(current_reagent.intercept_reagents_transfer(holder, cached_amount))//Use input amount instead. + break + force_stop_reagent_reacting(current_reagent) + holder.add_reagent(current_reagent.type, amount, trans_data, chem_temp, no_react = TRUE, ignore_splitting = current_reagent.chemical_flags & REAGENT_DONOTSPLIT) + remove_reagent(current_reagent.type, amount, 1) break - force_stop_reagent_reacting(current_reagent) - holder.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, current_reagent.ph, no_react = TRUE, ignore_splitting = current_reagent.chemical_flags & REAGENT_DONOTSPLIT) - remove_reagent(current_reagent.type, amount, 1) - break + else + amount = min(round(reagent.volume, CHEMICAL_QUANTISATION_LEVEL), amount) + amount = min(round(amount, CHEMICAL_VOLUME_ROUNDING), holder.maximum_volume - holder.total_volume) + if(preserve_data) + trans_data = reagent.data + if(!reagent.intercept_reagents_transfer(holder, cached_amount))//Use input amount instead. + force_stop_reagent_reacting(reagent) + holder.add_reagent(reagent.type, amount, trans_data, chem_temp, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) + remove_reagent(reagent.type, amount, 1) update_total() holder.update_total() @@ -613,16 +537,14 @@ var/copy_amount = reagent.volume * part if(preserve_data) trans_data = reagent.data - target_holder.add_reagent(reagent.type, copy_amount * multiplier, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) + target_holder.add_reagent(reagent.type, copy_amount * multiplier, trans_data, chem_temp, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) if(!no_react) // pass over previous ongoing reactions before handle_reactions is called transfer_reactions(target_holder) - src.update_total() target_holder.update_total() target_holder.handle_reactions() - src.handle_reactions() return amount @@ -634,7 +556,7 @@ var/change = (multiplier - 1) //Get the % change for(var/datum/reagent/reagent as anything in cached_reagents) if(change > 0) - add_reagent(reagent.type, reagent.volume * change, added_purity = reagent.purity, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) + add_reagent(reagent.type, reagent.volume * change, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) else remove_reagent(reagent.type, abs(reagent.volume * change)) //absolute value to prevent a double negative situation (removing -50% would be adding 50%) @@ -689,16 +611,19 @@ * * can_overdose - Allows overdosing * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing */ -/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) - var/list/cached_reagents = reagent_list +/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE, updatehealth = TRUE) if(owner) expose_temperature(owner.bodytemperature, 0.25) var/need_mob_update = FALSE - for(var/datum/reagent/reagent as anything in cached_reagents) + for(var/datum/reagent/reagent as anything in reagent_list) + if(owner.stat == DEAD && !(reagent.chemical_flags & REAGENT_DEAD_PROCESS)) + continue need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless) - if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - owner.updatehealth() update_total() + if(owner && updatehealth && need_mob_update) + owner.updatehealth() + owner.update_damage_overlays() + return need_mob_update /* * Metabolises a single reagent for a target owner carbon mob. See above. @@ -719,32 +644,28 @@ owner = reagent.holder.my_atom if(owner && reagent) - if(owner.reagent_check(reagent, delta_time, times_fired)) - return if(liverless && !reagent.self_consuming) //need to be metabolized return if(!reagent.metabolizing) reagent.metabolizing = TRUE - reagent.on_mob_metabolize(owner) + need_mob_update += reagent.on_mob_metabolize(owner, metabolism_class) + if(can_overdose) if(reagent.overdose_threshold) if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed) reagent.overdosed = TRUE need_mob_update += reagent.overdose_start(owner) log_game("[key_name(owner)] has started overdosing on [reagent.name] at [reagent.volume] units.") - for(var/addiction in reagent.addiction_types) - owner.mind?.add_addiction_points(addiction, reagent.addiction_types[addiction] * REAGENTS_METABOLISM) if(reagent.overdosed) - need_mob_update += reagent.overdose_process(owner, delta_time, times_fired) + need_mob_update += reagent.overdose_process(owner) - need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired) + need_mob_update += reagent.on_mob_life(owner, metabolism_class, can_overdose) return need_mob_update /// Signals that metabolization has stopped, triggering the end of trait-based effects /datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) + for(var/datum/reagent/reagent as anything in reagent_list) if(QDELETED(reagent.holder)) continue if(keep_liverless && reagent.self_consuming) //Will keep working without a liver @@ -753,71 +674,7 @@ C = reagent.holder.my_atom if(reagent.metabolizing) reagent.metabolizing = FALSE - reagent.on_mob_end_metabolize(C) - -/*Processes the reagents in the holder and converts them, only called in a mob/living/carbon on addition -* -* Arguments: -* * reagent - the added reagent datum/object -* * added_volume - the volume of the reagent that was added (since it can already exist in a mob) -* * added_purity - the purity of the added volume -* returns the volume of the original, pure, reagent to add / keep -*/ -/datum/reagents/proc/process_mob_reagent_purity(datum/reagent/reagent, added_volume, added_purity) - if(!reagent) - stack_trace("Attempted to process a mob's reagent purity for a null reagent!") - return FALSE - if(added_purity == 1) - return added_volume - if(reagent.chemical_flags & REAGENT_DONOTSPLIT) - return added_volume - if(added_purity < 0) - stack_trace("Purity below 0 for chem on mob splitting: [reagent.type]!") - added_purity = 0 - - if((reagent.inverse_chem_val > added_purity) && (reagent.inverse_chem))//Turns all of a added reagent into the inverse chem - add_reagent(reagent.inverse_chem, added_volume, FALSE, added_purity = 1-reagent.creation_purity) - var/datum/reagent/inverse_reagent = has_reagent(reagent.inverse_chem) - if(inverse_reagent.chemical_flags & REAGENT_SNEAKYNAME) - inverse_reagent.name = reagent.name//Negative effects are hidden - return FALSE //prevent addition - return added_volume - -///Processes any chems that have the REAGENT_IGNORE_STASIS bitflag ONLY -/datum/reagents/proc/handle_stasis_chems(mob/living/carbon/owner, delta_time, times_fired) - var/need_mob_update = FALSE - for(var/datum/reagent/reagent as anything in reagent_list) - if(!(reagent.chemical_flags & REAGENT_IGNORE_STASIS)) - continue - need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose = TRUE) - if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - owner.updatehealth() - update_total() - -/** - * Calls [/datum/reagent/proc/on_move] on every reagent in this holder - * - * Arguments: - * * atom/A - passed to on_move - * * Running - passed to on_move - */ -/datum/reagents/proc/conditional_update_move(atom/A, Running = 0) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) - reagent.on_move(A, Running) - update_total() - -/** - * Calls [/datum/reagent/proc/on_update] on every reagent in this holder - * - * Arguments: - * * atom/A - passed to on_update - */ -/datum/reagents/proc/conditional_update(atom/A) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/reagent as anything in cached_reagents) - reagent.on_update(A) - update_total() + reagent.on_mob_end_metabolize(C, metabolism_class) /// Handle any reactions possible in this holder /// Also UPDATES the reaction list @@ -841,7 +698,7 @@ return FALSE var/list/cached_reagents = reagent_list - var/list/cached_reactions = GLOB.chemical_reactions_list_reactant_index + var/list/cached_reactions = SSreagents.chemical_reactions_list_reactant_index var/datum/cached_my_atom = my_atom LAZYNULL(failed_but_capable_reactions) @@ -865,7 +722,6 @@ var/required_temp = reaction.required_temp var/is_cold_recipe = reaction.is_cold_recipe var/meets_temp_requirement = FALSE - var/meets_ph_requirement = FALSE var/granularity = 1 if(!(reaction.reaction_flags & REACTION_INSTANT)) granularity = CHEMICAL_VOLUME_MINIMUM @@ -874,10 +730,12 @@ if(!has_reagent(req_reagent, (cached_required_reagents[req_reagent]*granularity))) break total_matching_reagents++ + for(var/_catalyst in cached_required_catalysts) if(!has_reagent(_catalyst, (cached_required_catalysts[_catalyst]*granularity))) break total_matching_catalysts++ + if(cached_my_atom) if(!reaction.required_container) matching_container = TRUE @@ -903,11 +761,8 @@ if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp)) meets_temp_requirement = TRUE - if(((ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) - meets_ph_requirement = TRUE - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) - if(meets_temp_requirement && meets_ph_requirement) + if(meets_temp_requirement) possible_reactions += reaction else LAZYADD(failed_but_capable_reactions, reaction) @@ -1022,13 +877,8 @@ /datum/reagents/proc/finish_reacting() STOP_PROCESSING(SSreagents, src) is_reacting = FALSE - //Cap off values - for(var/datum/reagent/reagent as anything in reagent_list) - reagent.volume = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING)//To prevent runaways. LAZYNULL(previous_reagent_list) //reset it to 0 - because any change will be different now. update_total() - if(!QDELING(src)) - handle_reactions() //Should be okay without. Each step checks. /* * Force stops the current holder/reagents datum from reacting @@ -1094,7 +944,7 @@ target.is_reacting = is_reacting ///Checks to see if the reagents has a difference in reagents_list and previous_reagent_list (I.e. if there's a difference between the previous call and the last) -///Also checks to see if the saved reactions in failed_but_capable_reactions can start as a result of temp/pH change +///Also checks to see if the saved reactions in failed_but_capable_reactions can start as a result of temp change /datum/reagents/proc/has_changed_state() //Check if reagents are different var/total_matching_reagents = 0 @@ -1107,13 +957,11 @@ //Check our last reactions for(var/datum/chemical_reaction/reaction as anything in failed_but_capable_reactions) if(reaction.is_cold_recipe) - if(reaction.required_temp < chem_temp) + if(reaction.required_temp >= chem_temp) return TRUE else - if(reaction.required_temp < chem_temp) + if(reaction.required_temp <= chem_temp) return TRUE - if(((ph >= (reaction.optimal_ph_min - reaction.determin_ph_range)) && (ph <= (reaction.optimal_ph_max + reaction.determin_ph_range)))) - return TRUE return FALSE /datum/reagents/proc/update_previous_reagent_list() @@ -1121,6 +969,36 @@ for(var/datum/reagent/reagent as anything in reagent_list) LAZYADD(previous_reagent_list, reagent.type) +/// Returns TRUE if this container's temp would overheat a reaction. +/datum/reagents/proc/is_reaction_overheating(datum/chemical_reaction/reaction) + if(reaction.is_cold_recipe) + if(chem_temp < reaction.overheat_temp && reaction.overheat_temp != NO_OVERHEAT) + return TRUE + + else if(chem_temp > reaction.overheat_temp) + return TRUE + + return FALSE + +/// Gives feedback that a reaction is occuring. Returns an icon2html string. +/datum/reagents/proc/reaction_message(datum/chemical_reaction/reaction, is_overheating = is_reaction_overheating(reaction), atom/display_atom = my_atom) + var/turf/T = get_turf(display_atom) + if(isnull(T)) + return + + var/list/seen = viewers(4, display_atom) + var/iconhtml = icon2html(display_atom, seen) + + if(is_overheating) + display_atom.audible_message(span_alert("[iconhtml] [display_atom] sizzles as the solution boils off.")) + playsound(T, 'sound/effects/wounds/sizzle1.ogg', 80, TRUE) + return + + display_atom.audible_message(span_notice("[iconhtml] [reaction.mix_message]")) + if(reaction.mix_sound) + playsound(T, reaction.mix_sound, 80, TRUE) + + ///Old reaction mechanics, edited to work on one only ///This is changed from the old - purity of the reagents will affect yield /datum/reagents/proc/instant_react(datum/chemical_reaction/selected_reaction) @@ -1129,39 +1007,34 @@ var/datum/cached_my_atom = my_atom var/multiplier = INFINITY for(var/reagent in cached_required_reagents) - multiplier = min(multiplier, round(get_reagent_amount(reagent) / cached_required_reagents[reagent])) + multiplier = round(min(multiplier, round(get_reagent_amount(reagent) / cached_required_reagents[reagent]))) - if(multiplier == 0)//Incase we're missing reagents - usually from on_reaction being called in an equlibrium when the results.len == 0 handlier catches a misflagged reaction + if(!multiplier)//Incase we're missing reagents - usually from on_reaction being called in an equlibrium when the results.len == 0 handlier catches a misflagged reaction return FALSE - var/sum_purity = 0 + for(var/_reagent in cached_required_reagents)//this is not an object var/datum/reagent/reagent = has_reagent(_reagent) if (!reagent) continue - sum_purity += reagent.purity remove_reagent(_reagent, (multiplier * cached_required_reagents[_reagent]), safety = 1) - sum_purity /= cached_required_reagents.len - for(var/product in selected_reaction.results) + for(var/product in cached_results) multiplier = max(multiplier, 1) //this shouldn't happen ... - var/yield = (cached_results[product]*multiplier)*sum_purity + var/yield = (cached_results[product]*multiplier) SSblackbox.record_feedback("tally", "chemical_reaction", yield, product) - add_reagent(product, yield, null, chem_temp, sum_purity) + add_reagent(product, yield, null, chem_temp,) - var/list/seen = viewers(4, get_turf(my_atom)) - var/iconhtml = icon2html(cached_my_atom, seen) if(cached_my_atom) if(!ismob(cached_my_atom)) // No bubbling mobs - if(selected_reaction.mix_sound) - playsound(get_turf(cached_my_atom), selected_reaction.mix_sound, 80, TRUE) - - my_atom.audible_message(span_notice("[iconhtml] [selected_reaction.mix_message]")) + reaction_message(selected_reaction, display_atom = cached_my_atom) if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/extract = my_atom + var/list/seen = viewers(4, cached_my_atom) + var/iconhtml = icon2html(cached_my_atom, seen) + var/obj/item/slime_extract/extract = cached_my_atom extract.Uses-- if(extract.Uses <= 0) // give the notification that the slime core is dead - my_atom.visible_message(span_notice("[iconhtml] \The [my_atom]'s power is consumed in the reaction.")) + my_atom.visible_message(span_notice("[iconhtml] \The [cached_my_atom]'s power is consumed in the reaction.")) extract.name = "used slime extract" extract.desc = "This extract has been used up." @@ -1186,16 +1059,51 @@ /// Updates [/datum/reagents/var/total_volume] /datum/reagents/proc/update_total() var/list/cached_reagents = reagent_list - . = 0 // This is a relatively hot proc. - for(var/datum/reagent/reagent as anything in cached_reagents) - if((reagent.volume < 0.05) && !is_reacting) - del_reagent(reagent.type) - else if(reagent.volume <= CHEMICAL_VOLUME_MINIMUM)//For clarity - del_reagent(reagent.type) - else - . += reagent.volume - total_volume = . - recalculate_sum_ph() + var/list/deleted_reagents = list() + var/chem_index = 1 + var/num_reagents = length(cached_reagents) + var/reagent_volume = 0 + . = 0 + + //responsible for removing reagents and computing total ph & volume + //all it's code was taken out of del_reagent() initially for efficiency purposes + while(chem_index <= num_reagents) + var/datum/reagent/reagent = cached_reagents[chem_index] + chem_index += 1 + reagent_volume = round(reagent.volume, CHEMICAL_QUANTISATION_LEVEL) //round to this many decimal places + + //remove very small amounts of reagents + if(reagent_volume <= 0 || (!is_reacting && reagent_volume < CHEMICAL_VOLUME_ROUNDING)) + //end metabolization + if(isliving(my_atom)) + if(reagent.metabolizing) + reagent.metabolizing = FALSE + reagent.on_mob_end_metabolize(my_atom, metabolism_class) + reagent.on_mob_delete(my_atom, metabolism_class) + + //removing it and store in a seperate list for processing later + cached_reagents -= reagent + LAZYREMOVE(previous_reagent_list, reagent.type) + deleted_reagents += reagent + + //move pointer back so we don't overflow & decrease length + chem_index -= 1 + num_reagents -= 1 + continue + + //compute volume & ph like we would normally + . += reagent_volume + + //reasign rounded value + reagent.volume = reagent_volume + + //assign the final values, rounding up can sometimes cause overflow so bring it down + total_volume = min(round(., CHEMICAL_VOLUME_ROUNDING), maximum_volume) + + //now send the signals after the volume & ph has been computed + for(var/datum/reagent/deleted_reagent as anything in deleted_reagents) + SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, deleted_reagent) + qdel(deleted_reagent) /** * Applies the relevant expose_ proc for every reagent in this holder @@ -1223,9 +1131,8 @@ return A.expose_reagents(reagents, src, methods, volume_modifier, show_message, chem_temp) - /// Same as [/datum/reagents/proc/expose] but only for one reagent -/datum/reagents/proc/expose_single(datum/reagent/R, atom/A, methods = TOUCH, volume_modifier = 1, show_message = TRUE) +/datum/reagents/proc/expose_single(datum/reagent/R, atom/A, methods = TOUCH, expose_volume, volume_modifier = 1, show_message = TRUE) if(isnull(A)) return null @@ -1235,28 +1142,18 @@ return null // Yes, we need the parentheses. - return A.expose_reagents(list((R) = R.volume * volume_modifier), src, methods, volume_modifier, show_message, chem_temp) + return A.expose_reagents(list((R) = expose_volume), src, methods, volume_modifier, show_message, chem_temp) /// Is this holder full or not /datum/reagents/proc/holder_full() - if(total_volume >= maximum_volume) - return TRUE - return FALSE + return total_volume >= maximum_volume /// Get the amount of this reagent /datum/reagents/proc/get_reagent_amount(reagent) var/list/cached_reagents = reagent_list for(var/datum/reagent/cached_reagent as anything in cached_reagents) if(cached_reagent.type == reagent) - return round(cached_reagent.volume, CHEMICAL_QUANTISATION_LEVEL) - return 0 - -/// Get the purity of this reagent -/datum/reagents/proc/get_reagent_purity(reagent) - var/list/cached_reagents = reagent_list - for(var/datum/reagent/cached_reagent as anything in cached_reagents) - if(cached_reagent.type == reagent) - return round(cached_reagent.purity, 0.01) + return round(cached_reagent.volume, CHEMICAL_VOLUME_ROUNDING) return 0 /// Get a comma separated string of every reagent name in this holder. UNUSED @@ -1306,8 +1203,8 @@ /// Get a reference to the reagent if it exists /datum/reagents/proc/get_reagent(type) - var/list/cached_reagents = reagent_list - . = locate(type) in cached_reagents + RETURN_TYPE(/datum/reagent) + . = locate(type) in reagent_list /** * Returns what this holder's reagents taste like @@ -1365,11 +1262,13 @@ * - min_temp: The minimum temperature that can be reached. * - max_temp: The maximum temperature that can be reached. */ -/datum/reagents/proc/adjust_thermal_energy(delta_energy, min_temp = 2.7, max_temp = 1000) +/datum/reagents/proc/adjust_thermal_energy(delta_energy, min_temp = 2.7, max_temp = 1000, handle_reactions = TRUE) var/heat_capacity = getHeatCapacity() if(!heat_capacity) return // no div/0 please set_temperature(clamp(chem_temp + (delta_energy / heat_capacity), min_temp, max_temp)) + if(handle_reactions) + handle_reactions() /// Applies heat to this holder /datum/reagents/proc/expose_temperature(temperature, coeff=0.02) @@ -1400,68 +1299,11 @@ chem_temp = clamp(_temperature, 0, CHEMICAL_MAXIMUM_TEMPERATURE) SEND_SIGNAL(src, COMSIG_REAGENTS_TEMP_CHANGE, _temperature, .) -/* -* Adjusts the base pH of all of the reagents in a beaker -* -* - moves it towards acidic -* + moves it towards basic -* Arguments: -* * value - How much to adjust the base pH by -*/ -/datum/reagents/proc/adjust_all_reagents_ph(value, lower_limit = 0, upper_limit = 14) - for(var/datum/reagent/reagent as anything in reagent_list) - reagent.ph = clamp(reagent.ph + value, lower_limit, upper_limit) - -/* -* Adjusts the base pH of all of the listed types -* -* - moves it towards acidic -* + moves it towards basic -* Arguments: -* * input_reagents_list - list of reagent objects to adjust -* * value - How much to adjust the base pH by -*/ -/datum/reagents/proc/adjust_specific_reagent_list_ph(list/input_reagents_list, value, lower_limit = 0, upper_limit = 14) - for(var/datum/reagent/reagent as anything in input_reagents_list) - if(!reagent) //We can call this with missing reagents. - continue - reagent.ph = clamp(reagent.ph + value, lower_limit, upper_limit) - -/* -* Adjusts the base pH of a specific type -* -* - moves it towards acidic -* + moves it towards basic -* Arguments: -* * input_reagent - type path of the reagent -* * value - How much to adjust the base pH by -* * lower_limit - how low the pH can go -* * upper_limit - how high the pH can go -*/ -/datum/reagents/proc/adjust_specific_reagent_ph(input_reagent, value, lower_limit = 0, upper_limit = 14) - var/datum/reagent/reagent = get_reagent(input_reagent) - if(!reagent) //We can call this with missing reagents. - return FALSE - reagent.ph = clamp(reagent.ph + value, lower_limit, upper_limit) - -/* -* Updates the reagents datum pH based off the volume weighted sum of the reagent_list's reagent pH -*/ -/datum/reagents/proc/recalculate_sum_ph() - if(!reagent_list || !total_volume) //Ensure that this is true - ph = CHEMICAL_NORMAL_PH - return - var/total_ph = 0 - for(var/datum/reagent/reagent as anything in reagent_list) - total_ph += (reagent.ph * reagent.volume) - //Keep limited - ph = clamp(total_ph/total_volume, 0, 14) - /** * Outputs a log-friendly list of reagents based on an external reagent list. * * Arguments: - * * external_list - Assoc list of (reagent_type) = list(REAGENT_TRANSFER_AMOUNT = amounts, REAGENT_PURITY = purity) + * * external_list - Assoc list of (reagent_type) = list(REAGENT_TRANSFER_AMOUNT = amounts) */ /datum/reagents/proc/get_external_reagent_log_string(external_list) if(!length(external_list)) @@ -1471,7 +1313,7 @@ for(var/reagent_type in external_list) var/list/qualities = external_list[reagent_type] - data += "[reagent_type] ([round(qualities[REAGENT_TRANSFER_AMOUNT], 0.1)]u, [qualities[REAGENT_PURITY]] purity)" + data += "[reagent_type] ([round(qualities[REAGENT_TRANSFER_AMOUNT], 0.1)]u)" return english_list(data) @@ -1479,7 +1321,7 @@ * Outputs a log-friendly list of reagents based on the internal reagent_list. * * Arguments: - * * external_list - Assoc list of (reagent_type) = list(REAGENT_TRANSFER_AMOUNT = amounts, REAGENT_PURITY = purity) + * * external_list - Assoc list of (reagent_type) = list(REAGENT_TRANSFER_AMOUNT = amounts) */ /datum/reagents/proc/get_reagent_log_string() if(!length(reagent_list)) @@ -1488,7 +1330,7 @@ var/list/data = list() for(var/datum/reagent/reagent as anything in reagent_list) - data += "[reagent.type] ([round(reagent.volume, 0.1)]u, [reagent.purity] purity)" + data += "[reagent.type] ([round(reagent.volume, 0.1)]u)" return english_list(data) @@ -1522,7 +1364,7 @@ var/list/possible_reactions = list() if(!length(cached_reagents)) return null - cached_reactions = GLOB.chemical_reactions_list_reactant_index + cached_reactions = SSreagents.chemical_reactions_list_reactant_index for(var/_reagent in cached_reagents) var/datum/reagent/reagent = _reagent for(var/_reaction in cached_reactions[reagent.type]) // Was a big list but now it should be smaller since we filtered it with our reagent id @@ -1662,14 +1504,10 @@ to_chat(user, "Could not find reagent!") ui_reagent_id = null else - data["reagent_mode_reagent"] = list("name" = reagent.name, "id" = reagent.type, "desc" = reagent.description, "reagentCol" = reagent.color, "pH" = reagent.ph, "pHCol" = convert_ph_to_readable_color(reagent.ph), "metaRate" = (reagent.metabolization_rate/2), "OD" = reagent.overdose_threshold) + data["reagent_mode_reagent"] = list("name" = reagent.name, "id" = reagent.type, "desc" = reagent.description, "reagentCol" = reagent.color, "metaRate" = (reagent.metabolization_rate/2), "OD" = reagent.overdose_threshold) data["reagent_mode_reagent"]["addictions"] = list() data["reagent_mode_reagent"]["addictions"] = parse_addictions(reagent) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent) - data["reagent_mode_reagent"] += list("inverseReagent" = inverse_reagent.name, "inverseId" = inverse_reagent.type) - if(reagent.chemical_flags & REAGENT_DEAD_PROCESS) data["reagent_mode_reagent"] += list("deadProcess" = TRUE) else @@ -1697,7 +1535,7 @@ has_product = FALSE var/list/names = splittext("[reaction.type]", "/") var/product_name = names[names.len] - data["reagent_mode_recipe"] = list("name" = product_name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = "#FFFFFF", "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "lowerpH" = reaction.optimal_ph_min, "upperpH" = reaction.optimal_ph_max, "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "minPurity" = reaction.purity_min, "inversePurity" = "N/A", "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = 1, "subReactIndex" = 1) + data["reagent_mode_recipe"] = list("name" = product_name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = "#FFFFFF", "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = 1, "subReactIndex" = 1) //If we do have a product then we find it else @@ -1719,7 +1557,7 @@ ui_reaction_index = i //update our index break i += 1 - data["reagent_mode_recipe"] = list("name" = primary_reagent.name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = primary_reagent.color, "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "lowerpH" = reaction.optimal_ph_min, "upperpH" = reaction.optimal_ph_max, "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "minPurity" = reaction.purity_min, "inversePurity" = primary_reagent.inverse_chem_val, "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = sub_reaction_length, "subReactIndex" = ui_reaction_index) + data["reagent_mode_recipe"] = list("name" = primary_reagent.name, "id" = reaction.type, "hasProduct" = has_product, "reagentCol" = primary_reagent.color, "thermodynamics" = generate_thermodynamic_profile(reaction), "explosive" = generate_explosive_profile(reaction), "thermics" = determine_reaction_thermics(reaction), "thermoUpper" = reaction.rate_up_lim, "tempMin" = reaction.required_temp, "explodeTemp" = reaction.overheat_temp, "reqContainer" = container_name, "subReactLen" = sub_reaction_length, "subReactIndex" = ui_reaction_index) //Results sweep var/has_reagent = "default" @@ -1781,31 +1619,7 @@ /datum/reagents/ui_static_data(mob/user) var/data = list() //Use GLOB list - saves processing - data["master_reaction_list"] = GLOB.chemical_reactions_results_lookup_list - data["bitflags"] = list() - data["bitflags"]["BRUTE"] = REACTION_TAG_BRUTE - data["bitflags"]["BURN"] = REACTION_TAG_BURN - data["bitflags"]["TOXIN"] = REACTION_TAG_TOXIN - data["bitflags"]["OXY"] = REACTION_TAG_OXY - data["bitflags"]["CLONE"] = REACTION_TAG_CLONE - data["bitflags"]["HEALING"] = REACTION_TAG_HEALING - data["bitflags"]["DAMAGING"] = REACTION_TAG_DAMAGING - data["bitflags"]["EXPLOSIVE"] = REACTION_TAG_EXPLOSIVE - data["bitflags"]["OTHER"] = REACTION_TAG_OTHER - data["bitflags"]["DANGEROUS"] = REACTION_TAG_DANGEROUS - data["bitflags"]["EASY"] = REACTION_TAG_EASY - data["bitflags"]["MODERATE"] = REACTION_TAG_MODERATE - data["bitflags"]["HARD"] = REACTION_TAG_HARD - data["bitflags"]["ORGAN"] = REACTION_TAG_ORGAN - data["bitflags"]["DRINK"] = REACTION_TAG_DRINK - data["bitflags"]["FOOD"] = REACTION_TAG_FOOD - data["bitflags"]["SLIME"] = REACTION_TAG_SLIME - data["bitflags"]["DRUG"] = REACTION_TAG_DRUG - data["bitflags"]["UNIQUE"] = REACTION_TAG_UNIQUE - data["bitflags"]["CHEMICAL"] = REACTION_TAG_CHEMICAL - data["bitflags"]["PLANT"] = REACTION_TAG_PLANT - data["bitflags"]["COMPETITIVE"] = REACTION_TAG_COMPETITIVE - + data["master_reaction_list"] = SSreagents.chemical_reactions_results_lookup_list return data /* Returns a reaction type by index from an input reagent type @@ -1871,72 +1685,6 @@ if("beaker_sync") ui_beaker_sync = !ui_beaker_sync return TRUE - if("toggle_tag_brute") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_BRUTE - return TRUE - if("toggle_tag_burn") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_BURN - return TRUE - if("toggle_tag_toxin") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_TOXIN - return TRUE - if("toggle_tag_oxy") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_OXY - return TRUE - if("toggle_tag_clone") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_CLONE - return TRUE - if("toggle_tag_healing") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_HEALING - return TRUE - if("toggle_tag_damaging") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_DAMAGING - return TRUE - if("toggle_tag_explosive") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_EXPLOSIVE - return TRUE - if("toggle_tag_other") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_OTHER - return TRUE - if("toggle_tag_easy") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_EASY - return TRUE - if("toggle_tag_moderate") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_MODERATE - return TRUE - if("toggle_tag_hard") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_HARD - return TRUE - if("toggle_tag_organ") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_ORGAN - return TRUE - if("toggle_tag_drink") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_DRINK - return TRUE - if("toggle_tag_food") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_FOOD - return TRUE - if("toggle_tag_dangerous") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_DANGEROUS - return TRUE - if("toggle_tag_slime") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_SLIME - return TRUE - if("toggle_tag_drug") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_DRUG - return TRUE - if("toggle_tag_unique") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_UNIQUE - return TRUE - if("toggle_tag_chemical") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_CHEMICAL - return TRUE - if("toggle_tag_plant") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_PLANT - return TRUE - if("toggle_tag_competitive") - ui_tags_selected = ui_tags_selected ^ REACTION_TAG_COMPETITIVE - return TRUE if("update_ui") return TRUE @@ -1962,7 +1710,6 @@ desc = "God this is stupid" #undef REAGENT_TRANSFER_AMOUNT -#undef REAGENT_PURITY #undef REAGENTS_UI_MODE_LOOKUP #undef REAGENTS_UI_MODE_REAGENT diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm deleted file mode 100644 index 22070e5b953e..000000000000 --- a/code/modules/reagents/chemistry/items.dm +++ /dev/null @@ -1,337 +0,0 @@ -///if the ph_meter gives a detailed output -#define DETAILED_CHEM_OUTPUT 1 -///if the pH meter gives a shorter output -#define SHORTENED_CHEM_OUTPUT 0 - -/* -* a pH booklet that contains pH paper pages that will change color depending on the pH of the reagents datum it's attacked onto -*/ -/obj/item/ph_booklet - name = "pH indicator booklet" - desc = "A booklet containing paper soaked in universal indicator." - icon_state = "pHbooklet" - icon = 'icons/obj/chemical.dmi' - item_flags = NOBLUDGEON - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - ///How many pages the booklet holds - var/number_of_pages = 50 - -//A little janky with pockets -/obj/item/ph_booklet/attack_hand(mob/user) - if(user.get_held_index_of_item(src))//Does this check pockets too..? - if(number_of_pages == 50) - icon_state = "pHbooklet_open" - if(!number_of_pages) - to_chat(user, span_warning("[src] is empty!")) - add_fingerprint(user) - return - var/obj/item/ph_paper/page = new(get_turf(user)) - page.add_fingerprint(user) - user.put_in_active_hand(page) - to_chat(user, span_notice("You take [page] out of \the [src].")) - number_of_pages-- - playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) - add_fingerprint(user) - if(!number_of_pages) - icon_state = "pHbooklet_empty" - return - var/I = user.get_active_held_item() - if(!I) - user.put_in_active_hand(src) - return ..() - -/obj/item/ph_booklet/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) - var/mob/living/user = usr - if(!isliving(user)) - return - if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - return - if(!number_of_pages) - to_chat(user, span_warning("[src] is empty!")) - add_fingerprint(user) - return - if(number_of_pages == 50) - icon_state = "pHbooklet_open" - var/obj/item/ph_paper/P = new(get_turf(user)) - P.add_fingerprint(user) - user.put_in_active_hand(P) - to_chat(user, span_notice("You take [P] out of \the [src].")) - number_of_pages-- - playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, TRUE) - add_fingerprint(user) - if(!number_of_pages) - icon_state = "pHbookletEmpty" - -/* -* pH paper will change color depending on the pH of the reagents datum it's attacked onto -*/ -/obj/item/ph_paper - name = "pH indicator strip" - desc = "A piece of paper that will change colour depending on the pH of a solution." - icon_state = "pHpaper" - icon = 'icons/obj/chemical.dmi' - item_flags = NOBLUDGEON - color = "#f5c352" - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - ///If the paper was used, and therefore cannot change color again - var/used = FALSE - -/obj/item/ph_paper/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!is_reagent_container(target)) - return - var/obj/item/reagent_containers/cont = target - if(used == TRUE) - to_chat(user, span_warning("[src] has already been used!")) - return - if(!LAZYLEN(cont.reagents.reagent_list)) - return - CONVERT_PH_TO_COLOR(round(cont.reagents.ph, 1), color) - desc += " The paper looks to be around a pH of [round(cont.reagents.ph, 1)]" - name = "used [name]" - used = TRUE - -/* -* pH meter that will give a detailed or truncated analysis of all the reagents in of an object with a reagents datum attached to it. Only way of detecting purity for now. -*/ -/obj/item/ph_meter - name = "Chemical Analyzer" - desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays nothing." - icon_state = "pHmeter" - icon = 'icons/obj/chemical.dmi' - w_class = WEIGHT_CLASS_TINY - ///level of detail for output for the meter - var/scanmode = DETAILED_CHEM_OUTPUT - -/obj/item/ph_meter/attack_self(mob/user) - if(scanmode == SHORTENED_CHEM_OUTPUT) - to_chat(user, span_notice("You switch the chemical analyzer to provide a detailed description of each reagent.")) - scanmode = DETAILED_CHEM_OUTPUT - else - to_chat(user, span_notice("You switch the chemical analyzer to not include reagent descriptions in it's report.")) - scanmode = SHORTENED_CHEM_OUTPUT - -/obj/item/ph_meter/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(!is_reagent_container(target)) - return - var/obj/item/reagent_containers/cont = target - if(LAZYLEN(cont.reagents.reagent_list) == null) - return - var/list/out_message = list() - to_chat(user, "The chemistry meter beeps and displays:") - out_message += "Total volume: [round(cont.volume, 0.01)] Current temperature: [round(cont.reagents.chem_temp, 0.1)]K Total pH: [round(cont.reagents.ph, 0.01)]\n" - out_message += "Chemicals found in the beaker:\n" - if(cont.reagents.is_reacting) - out_message += "[span_warning("A reaction appears to be occuring currently.")]\n" - for(var/datum/reagent/reagent in cont.reagents.reagent_list) - if(reagent.purity < reagent.inverse_chem_val && reagent.inverse_chem) //If the reagent is impure - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - out_message += "[span_warning("Inverted reagent detected: ")][round(reagent.volume, 0.01)]u of [inverse_reagent.name], Purity: [round(1 - reagent.purity, 0.01)*100]%, [(scanmode?"[(inverse_reagent.overdose_threshold?"Overdose: [inverse_reagent.overdose_threshold]u, ":"")]Base pH: [initial(inverse_reagent.ph)], Current pH: [reagent.ph].":"Current pH: [reagent.ph].")]\n" - else - out_message += "[round(reagent.volume, 0.01)]u of [reagent.name], Purity: [round(reagent.purity, 0.01)*100]%, [(scanmode?"[(reagent.overdose_threshold?"Overdose: [reagent.overdose_threshold]u, ":"")]Base pH: [initial(reagent.ph)], Current pH: [reagent.ph].":"Current pH: [reagent.ph].")]\n" - if(scanmode) - out_message += "Analysis: [reagent.description]\n" - to_chat(user, "[out_message.Join()]") - desc = "An electrode attached to a small circuit box that will display details of a solution. Can be toggled to provide a description of each of the reagents. The screen currently displays detected vol: [round(cont.volume, 0.01)] detected pH:[round(cont.reagents.ph, 0.1)]." - -/obj/item/burner - name = "Alcohol burner" - desc = "A small table size burner used for heating up beakers." - icon = 'icons/obj/chemical.dmi' - icon_state = "burner" - grind_results = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/silicon = 10) - item_flags = NOBLUDGEON - resistance_flags = FLAMMABLE - w_class = WEIGHT_CLASS_TINY - heat = 2000 - ///If the flame is lit - i.e. if we're processing and burning - var/lit = FALSE - ///total reagent volume - var/max_volume = 50 - ///What the creation reagent is - var/reagent_type = /datum/reagent/consumable/ethanol - -/obj/item/burner/Initialize(mapload) - . = ..() - create_reagents(max_volume, TRANSPARENT)//We have our own refillable - since we want to heat and pour - if(reagent_type) - reagents.add_reagent(reagent_type, 15) - -/obj/item/burner/attackby(obj/item/I, mob/living/user, params) - . = ..() - if(is_reagent_container(I)) - if(lit) - var/obj/item/reagent_containers/container = I - container.reagents.expose_temperature(get_temperature()) - to_chat(user, span_notice("You heat up the [I] with the [src].")) - playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE) - return - else if(I.is_drainable()) //Transfer FROM it TO us. Special code so it only happens when flame is off. - var/obj/item/reagent_containers/container = I - if(!container.reagents.total_volume) - to_chat(user, span_warning("[container] is empty and can't be poured!")) - return - - if(reagents.holder_full()) - to_chat(user, span_warning("[src] is full.")) - return - - var/trans = container.reagents.trans_to(src, container.amount_per_transfer_from_this, transfered_by = user) - to_chat(user, span_notice("You fill [src] with [trans] unit\s of the contents of [container].")) - if(I.heat < 1000) - return - set_lit(TRUE) - user.visible_message(span_notice("[user] lights up the [src].")) - -/obj/item/burner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(lit) - if(is_reagent_container(target)) - var/obj/item/reagent_containers/container = target - container.reagents.expose_temperature(get_temperature()) - to_chat(user, span_notice("You heat up the [src].")) - playsound(user.loc, 'sound/chemistry/heatdam.ogg', 50, TRUE) - return - else if(isitem(target)) - var/obj/item/item = target - if(item.heat > 1000) - set_lit(TRUE) - user.visible_message(span_notice("[user] lights up the [src].")) - -/obj/item/burner/update_icon_state() - . = ..() - icon_state = "[initial(icon_state)][lit ? "-on" : ""]" - -/obj/item/burner/proc/set_lit(new_lit) - if(lit == new_lit) - return - lit = new_lit - if(lit) - force = 5 - damtype = BURN - hitsound = 'sound/items/welder.ogg' - attack_verb_continuous = string_list(list("burns", "singes")) - attack_verb_simple = string_list(list("burn", "singe")) - START_PROCESSING(SSobj, src) - else - hitsound = SFX_SWING_HIT - force = 0 - attack_verb_continuous = null //human_defense.dm takes care of it - attack_verb_simple = null - STOP_PROCESSING(SSobj, src) - set_light_on(lit) - update_icon() - -/obj/item/burner/extinguish() - set_lit(FALSE) - -/obj/item/burner/attack_self(mob/living/user) - . = ..() - if(.) - return - if(lit) - set_lit(FALSE) - user.visible_message(span_notice("[user] snuffs out [src]'s flame.")) - -/obj/item/burner/attack(mob/living/carbon/M, mob/living/carbon/user) - if(lit && M.ignite_mob()) - message_admins("[ADMIN_LOOKUPFLW(user)] set [key_name_admin(M)] on fire with [src] at [AREACOORD(user)]") - log_game("[key_name(user)] set [key_name(M)] on fire with [src] at [AREACOORD(user)]") - return ..() - -/obj/item/burner/process() - var/current_heat = 0 - var/number_of_burning_reagents = 0 - for(var/datum/reagent/reagent as anything in reagents.reagent_list) - reagent.burn(reagents) //burn can set temperatures of reagents - if(!isnull(reagent.burning_temperature)) - current_heat += reagent.burning_temperature - number_of_burning_reagents += 1 - reagents.remove_reagent(reagent.type, reagent.burning_volume) - continue - - if(!number_of_burning_reagents) - set_lit(FALSE) - heat = 0 - return - open_flame() - current_heat /= number_of_burning_reagents - heat = current_heat - -/obj/item/burner/get_temperature() - return lit * heat - -/obj/item/burner/oil - name = "Oil burner" - reagent_type = /datum/reagent/fuel/oil - grind_results = list(/datum/reagent/fuel/oil = 5, /datum/reagent/silicon = 10) - -/obj/item/burner/fuel - name = "Fuel burner" - reagent_type = /datum/reagent/fuel - grind_results = list(/datum/reagent/fuel = 5, /datum/reagent/silicon = 10) - -/obj/item/thermometer - name = "thermometer" - desc = "A thermometer for checking a beaker's temperature" - icon_state = "thermometer" - icon = 'icons/obj/chemical.dmi' - item_flags = NOBLUDGEON - w_class = WEIGHT_CLASS_TINY - grind_results = list(/datum/reagent/mercury = 5) - ///The reagents datum that this object is attached to, so we know where we are when it's added to something. - var/datum/reagents/attached_to_reagents - -/obj/item/thermometer/Destroy() - QDEL_NULL(attached_to_reagents) //I have no idea how you can destroy this, but not the beaker, but here we go - return ..() - -/obj/item/thermometer/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(target.reagents) - if(!user.transferItemToLoc(src, target)) - return - attached_to_reagents = target.reagents - to_chat(user, span_notice("You add the [src] to the [target].")) - ui_interact(usr, null) - -/obj/item/thermometer/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Thermometer", name) - ui.open() - -/obj/item/thermometer/ui_close(mob/user) - . = ..() - INVOKE_ASYNC(src, PROC_REF(remove_thermometer), user) - -/obj/item/thermometer/ui_status(mob/user) - if(!(in_range(src, user))) - return UI_CLOSE - return UI_INTERACTIVE - -/obj/item/thermometer/ui_state(mob/user) - return GLOB.physical_state - -/obj/item/thermometer/ui_data(mob/user) - if(!attached_to_reagents) - ui_close(user) - var/data = list() - data["Temperature"] = round(attached_to_reagents.chem_temp) - return data - -/obj/item/thermometer/proc/remove_thermometer(mob/target) - try_put_in_hand(src, target) - attached_to_reagents = null - -/obj/item/thermometer/proc/try_put_in_hand(obj/object, mob/living/user) - to_chat(user, span_notice("You remove the [src] from the [attached_to_reagents.my_atom].")) - if(!issilicon(user) && in_range(src.loc, user)) - user.put_in_hands(object) - else - object.forceMove(drop_location()) - -/obj/item/thermometer/pen - color = "#888888" diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index 98bc060dc68b..42a38e9ddfbe 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -1,15 +1,6 @@ -/proc/translate_legacy_chem_id(id) - switch (id) - if ("sacid") - return "sulfuricacid" - if ("facid") - return "fluorosulfuricacid" - if ("co2") - return "carbondioxide" - if ("mine_salve") - return "minerssalve" - else - return ckey(id) +#define CHEM_DISPENSER_HEATER_COEFFICIENT 0.05 +// Soft drinks dispenser is much better at cooling cause of the specific temperature it wants water and ice at. +#define SOFT_DISPENSER_HEATER_COEFFICIENT 0.5 /obj/machinery/chem_dispenser name = "chem dispenser" @@ -22,102 +13,52 @@ resistance_flags = FIRE_PROOF | ACID_PROOF circuit = /obj/item/circuitboard/machine/chem_dispenser processing_flags = NONE + // This munches power due to it being the chemist's main machine, and chemfactories don't exist. + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2 - var/obj/item/stock_parts/cell/cell var/powerefficiency = 0.1 var/amount = 30 - var/recharge_amount = 10 var/recharge_counter = 0 var/dispensed_temperature = DEFAULT_REAGENT_TEMPERATURE - ///If the UI has the pH meter shown - var/show_ph = TRUE + var/heater_coefficient = CHEM_DISPENSER_HEATER_COEFFICIENT var/mutable_appearance/beaker_overlay var/working_state = "dispenser_working" var/nopower_state = "dispenser_nopower" + var/ui_title = "Chem Dispenser" var/has_panel_overlay = TRUE var/obj/item/reagent_containers/beaker = null - //dispensable_reagents is copypasted in plumbing synthesizers. Please update accordingly. (I didn't make it global because that would limit custom chem dispensers) - var/list/dispensable_reagents = list( - /datum/reagent/aluminium, - /datum/reagent/bromine, - /datum/reagent/carbon, - /datum/reagent/chlorine, - /datum/reagent/copper, - /datum/reagent/consumable/ethanol, - /datum/reagent/fluorine, - /datum/reagent/hydrogen, - /datum/reagent/iodine, - /datum/reagent/iron, - /datum/reagent/lithium, - /datum/reagent/mercury, - /datum/reagent/nitrogen, - /datum/reagent/oxygen, - /datum/reagent/phosphorus, - /datum/reagent/potassium, - /datum/reagent/uranium/radium, - /datum/reagent/silicon, - /datum/reagent/sodium, - /datum/reagent/stable_plasma, - /datum/reagent/consumable/sugar, - /datum/reagent/sulfur, - /datum/reagent/toxin/acid, - /datum/reagent/water, - /datum/reagent/fuel - ) - //PARIAH EDIT - var/list/upgrade_reagents = list( - /datum/reagent/fuel/oil, - /datum/reagent/ammonia, - /datum/reagent/ash - ) - - var/list/upgrade_reagents2 = list( - /datum/reagent/acetone, - /datum/reagent/phenol, - /datum/reagent/diethylamine - ) - - var/list/upgrade_reagents3 = list( - /datum/reagent/medicine/mine_salve, - /datum/reagent/toxin - ) - - var/list/emagged_reagents = list( - /datum/reagent/drug/space_drugs, - /datum/reagent/toxin/plasma, - /datum/reagent/consumable/frostoil, - /datum/reagent/toxin/carpotoxin, - /datum/reagent/toxin/histamine, - /datum/reagent/medicine/morphine - ) - //PARIAH EDIT END - - var/list/recording_recipe - - var/list/saved_recipes = list() + /// The maximum amount of cartridges the dispenser can contain. + var/maximum_cartridges = 24 + var/list/spawn_cartridges + + /// Associative, label -> cartridge + var/list/cartridges = list() /obj/machinery/chem_dispenser/Initialize(mapload) . = ..() - dispensable_reagents = sort_list(dispensable_reagents, GLOBAL_PROC_REF(cmp_reagents_asc)) - if(emagged_reagents) - emagged_reagents = sort_list(emagged_reagents, GLOBAL_PROC_REF(cmp_reagents_asc)) - if(upgrade_reagents) - upgrade_reagents = sort_list(upgrade_reagents, GLOBAL_PROC_REF(cmp_reagents_asc)) - //PARIAH EDIT - if(upgrade_reagents) - upgrade_reagents = sort_list(upgrade_reagents, GLOBAL_PROC_REF(cmp_reagents_asc)) - if(upgrade_reagents2) - upgrade_reagents2 = sort_list(upgrade_reagents2, GLOBAL_PROC_REF(cmp_reagents_asc)) - if(upgrade_reagents3) - upgrade_reagents3 = sort_list(upgrade_reagents3, GLOBAL_PROC_REF(cmp_reagents_asc)) - //PARIAH EDIT END if(is_operational) begin_processing() update_appearance() + set_cart_list() + if(spawn_cartridges && mapload) + spawn_cartridges() + +//this is just here for subtypes +/obj/machinery/chem_dispenser/proc/set_cart_list() + spawn_cartridges = GLOB.cartridge_list_chems.Copy() + +/// Spawns the cartridges the chem dispenser should have on mapload. Kept as a seperate proc for admin convienience. +/obj/machinery/chem_dispenser/proc/spawn_cartridges() + for(var/datum/reagent/chem_type as anything in spawn_cartridges) + var/obj/item/reagent_containers/chem_cartridge/chem_cartridge = spawn_cartridges[chem_type] + chem_cartridge = new chem_cartridge(src) + chem_cartridge.reagents.add_reagent(chem_type, chem_cartridge.volume, reagtemp = dispensed_temperature) + chem_cartridge.setLabel(initial(chem_type.name)) + add_cartridge(chem_cartridge) + /obj/machinery/chem_dispenser/Destroy() QDEL_NULL(beaker) - QDEL_NULL(cell) return ..() /obj/machinery/chem_dispenser/examine(mob/user) @@ -125,27 +66,38 @@ if(panel_open) . += span_notice("[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)]%." + if(length(cartridges)) + . += "It has [length(cartridges)] cartridges installed, and has space for [maximum_cartridges - length(cartridges)] more." + . += span_notice("It looks like you can pry out one of the cartridges.") + else + . += "It has space for [maximum_cartridges] cartridges." . += span_notice("Use RMB to eject a stored beaker.") - /obj/machinery/chem_dispenser/on_set_is_operational(old_value) if(old_value) //Turned off end_processing() else //Turned on begin_processing() - +// Tries to keep the chem temperature at the dispense temperature /obj/machinery/chem_dispenser/process(delta_time) - if (recharge_counter >= 8) - var/usedpower = cell.give(recharge_amount) - if(usedpower) - use_power(active_power_usage + recharge_amount) - recharge_counter = 0 + if(machine_stat & NOPOWER) return - recharge_counter += delta_time + + var/power_to_use = active_power_usage + + for(var/obj/item/reagent_containers/chem_cartridge/cartridge as anything in cartridges) + cartridge = cartridges[cartridge] + if(cartridge.reagents.total_volume) + if(cartridge.reagents.is_reacting)//on_reaction_step() handles this + continue + var/thermal_energy_to_provide = (dispensed_temperature - cartridge.reagents.chem_temp) * (heater_coefficient * powerefficiency) * delta_time * SPECIFIC_HEAT_DEFAULT * cartridge.reagents.total_volume + // Okay, hear me out, one cartridge, when heated from default (room) temp to the magic water/ice temperature, provides about 255000 thermal energy (drinks dispenser, divide that by 10 for chem) a tick. Let's take that number, kneecap it down by a sizeable chunk, and use it as power consumption, yea? + power_to_use += abs(thermal_energy_to_provide) / 1000 + cartridge.reagents.adjust_thermal_energy(thermal_energy_to_provide) + cartridge.reagents.handle_reactions() + + use_power(active_power_usage) /obj/machinery/chem_dispenser/proc/display_beaker() var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") @@ -172,12 +124,7 @@ /obj/machinery/chem_dispenser/emag_act(mob/user) - if(obj_flags & EMAGGED) - to_chat(user, span_warning("[src] has no functional safeties to emag.")) - return - to_chat(user, span_notice("You short out [src]'s safeties.")) - dispensable_reagents |= emagged_reagents//add the emagged reagents to the dispensable ones - obj_flags |= EMAGGED + to_chat(user, span_warning("[src] has no safeties to emag!")) /obj/machinery/chem_dispenser/ex_act(severity, target) if(severity <= EXPLODE_LIGHT) @@ -191,11 +138,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += beaker + EX_ACT(beaker, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += beaker + EX_ACT(beaker, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += beaker + EX_ACT(beaker, EXPLODE_LIGHT) /obj/machinery/chem_dispenser/handle_atom_del(atom/A) ..() @@ -206,7 +153,8 @@ /obj/machinery/chem_dispenser/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "ChemDispenser", name) + ui = new(user, src, "ChemDispenser", ui_title) + if(user.hallucinating()) ui.set_autoupdate(FALSE) //to not ruin the immersion by constantly changing the fake chemicals ui.open() @@ -214,45 +162,42 @@ /obj/machinery/chem_dispenser/ui_data(mob/user) var/data = list() data["amount"] = amount - data["energy"] = cell.charge ? cell.charge * powerefficiency : "0" //To prevent NaN in the UI. - data["maxEnergy"] = cell.maxcharge * powerefficiency - data["isBeakerLoaded"] = beaker ? 1 : 0 - data["showpH"] = show_ph + data["cartAmount"] = length(cartridges) + data["maxCarts"] = maximum_cartridges + data["isBeakerLoaded"] = !!beaker + data["beakerName"] = "[beaker?.name]" var/beakerContents[0] var/beakerCurrentVolume = 0 if(beaker && beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beakerContents.Add(list(list("name" = R.name, "volume" = round(R.volume, 0.01), "pH" = R.ph, "purity" = R.purity))) // list in a list because Byond merges the first list... + beakerContents.Add(list(list("name" = R.name, "volume" = round(R.volume, CHEMICAL_VOLUME_ROUNDING)))) // list in a list because Byond merges the first list... beakerCurrentVolume += R.volume data["beakerContents"] = beakerContents if (beaker) - data["beakerCurrentVolume"] = round(beakerCurrentVolume, 0.01) + data["beakerCurrentVolume"] = round(beakerCurrentVolume, CHEMICAL_VOLUME_ROUNDING) data["beakerMaxVolume"] = beaker.volume data["beakerTransferAmounts"] = beaker.possible_transfer_amounts - data["beakerCurrentpH"] = round(beaker.reagents.ph, 0.01) else data["beakerCurrentVolume"] = null data["beakerMaxVolume"] = null data["beakerTransferAmounts"] = null - data["beakerCurrentpH"] = null var/chemicals[0] var/is_hallucinating = FALSE if(user.hallucinating()) is_hallucinating = TRUE - for(var/re in dispensable_reagents) - var/datum/reagent/temp = GLOB.chemical_reagents_list[re] + + for(var/re in cartridges) + var/obj/item/reagent_containers/chem_cartridge/temp = cartridges[re] if(temp) - var/chemname = temp.name + var/chemname = temp.label if(is_hallucinating && prob(5)) chemname = "[pick_list_replacements("hallucination.json", "chemicals")]" - chemicals.Add(list(list("title" = chemname, "id" = ckey(temp.name), "pH" = temp.ph, "pHCol" = convert_ph_to_readable_color(temp.ph)))) + chemicals.Add(list(list("title" = chemname, "id" = temp.label, "amount" = temp.reagents.total_volume, "max" = temp.volume))) data["chemicals"] = chemicals - data["recipes"] = saved_recipes - data["recordingRecipe"] = recording_recipe data["recipeReagents"] = list() if(beaker?.reagents.ui_reaction_id) var/datum/chemical_reaction/reaction = get_chemical_reaction(beaker.reagents.ui_reaction_id) @@ -275,26 +220,19 @@ work_animation() . = TRUE if("dispense") - if(!is_operational || QDELETED(cell)) + if(!is_operational) return var/reagent_name = params["reagent"] - if(!recording_recipe) - var/reagent = GLOB.name2reagent[reagent_name] - if(beaker && dispensable_reagents.Find(reagent)) - - var/datum/reagents/holder = beaker.reagents - var/to_dispense = max(0, min(amount, holder.maximum_volume - holder.total_volume)) - if(!cell?.use(to_dispense / powerefficiency)) - say("Not enough energy to complete operation!") - return - holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature) - - work_animation() - else - recording_recipe[reagent_name] += amount + var/obj/item/reagent_containers/cartridge = cartridges[reagent_name] + if(beaker && cartridge) + var/datum/reagents/holder = beaker.reagents + var/to_dispense = max(0, min(amount, holder.maximum_volume - holder.total_volume)) + cartridge.reagents.trans_to(holder, to_dispense) + + work_animation() . = TRUE if("remove") - if(!is_operational || recording_recipe) + if(!is_operational) return var/amount = text2num(params["amount"]) if(beaker && (amount in beaker.possible_transfer_amounts)) @@ -304,70 +242,6 @@ if("eject") replace_beaker(usr) . = TRUE - if("dispense_recipe") - if(!is_operational || QDELETED(cell)) - return - - var/list/chemicals_to_dispense = saved_recipes[params["recipe"]] - if(!LAZYLEN(chemicals_to_dispense)) - return - for(var/key in chemicals_to_dispense) - var/reagent = GLOB.name2reagent[translate_legacy_chem_id(key)] - var/dispense_amount = chemicals_to_dispense[key] - if(!dispensable_reagents.Find(reagent)) - return - if(!recording_recipe) - if(!beaker) - return - - var/datum/reagents/holder = beaker.reagents - var/to_dispense = max(0, min(dispense_amount, holder.maximum_volume - holder.total_volume)) - if(!to_dispense) - continue - if(!cell?.use(to_dispense / powerefficiency)) - say("Not enough energy to complete operation!") - return - holder.add_reagent(reagent, to_dispense, reagtemp = dispensed_temperature) - work_animation() - else - recording_recipe[key] += dispense_amount - . = TRUE - if("clear_recipes") - if(!is_operational) - return - var/yesno = tgui_alert(usr, "Clear all recipes?",, list("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 = tgui_input_text(usr, "What do you want to name this recipe?", "Recipe Name", MAX_NAME_LEN) - if(!usr.canUseTopic(src, !issilicon(usr))) - return - if(saved_recipes[name] && tgui_alert(usr, "\"[name]\" already exists, do you want to overwrite it?",, list("Yes", "No")) == "No") - return - if(name && recording_recipe) - for(var/reagent in recording_recipe) - var/reagent_id = GLOB.name2reagent[translate_legacy_chem_id(reagent)] - if(!dispensable_reagents.Find(reagent_id)) - visible_message(span_warning("[src] buzzes."), span_hear("You hear a faint buzz.")) - to_chat(usr, span_warning("[src] cannot find [reagent]!")) - playsound(src, 'sound/machines/buzz-two.ogg', 50, TRUE) - return - saved_recipes[name] = recording_recipe - recording_recipe = null - . = TRUE - if("cancel_recording") - if(!is_operational) - return - recording_recipe = null - . = TRUE if("reaction_lookup") if(beaker) beaker.reagents.ui_interact(usr) @@ -383,60 +257,68 @@ return if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/reagent_containers) && !(I.item_flags & ABSTRACT) && I.is_open_container()) + if(I.tool_behaviour == TOOL_CROWBAR && length(cartridges)) + . = TRUE + var/label = tgui_input_list(user, "Which cartridge would you like to remove?", "Chemical Dispenser", cartridges) + if(!label) + return + var/obj/item/reagent_containers/chem_cartridge/cartidge = remove_cartridge(label) + if(cartidge) + to_chat(user, span_notice("You remove \the [cartidge] from \the [src].")) + cartidge.forceMove(loc) + return + if(istype(I, /obj/item/reagent_containers/chem_cartridge)) + add_cartridge(I, user) + else if(is_reagent_container(I) && !(I.item_flags & ABSTRACT) && I.is_open_container()) var/obj/item/reagent_containers/B = I . = TRUE //no afterattack if(!user.transferItemToLoc(B, src)) return replace_beaker(user, B) to_chat(user, span_notice("You add [B] to [src].")) - ui_interact(user) + cartridges = sortTim(cartridges, GLOBAL_PROC_REF(cmp_text_asc)) else if(!user.combat_mode && !istype(I, /obj/item/card/emag)) to_chat(user, span_warning("You can't load [I] into [src]!")) return ..() else return ..() -/obj/machinery/chem_dispenser/get_cell() - return cell - /obj/machinery/chem_dispenser/emp_act(severity) . = ..() if(. & EMP_PROTECT_SELF) return var/list/datum/reagents/R = list() - var/total = min(rand(7,15), FLOOR(cell.charge*powerefficiency, 1)) + var/total = min(rand(7,15), powerefficiency) var/datum/reagents/Q = new(total*10) if(beaker?.reagents) R += beaker.reagents for(var/i in 1 to total) - Q.add_reagent(pick(dispensable_reagents), 10, reagtemp = dispensed_temperature) + var/obj/item/reagent_containers/chem_cartridge = cartridges[pick(cartridges)] + chem_cartridge.reagents.trans_to(Q, 10) R += Q chem_splash(get_turf(src), null, 3, R) if(beaker?.reagents) beaker.reagents.remove_all() - cell.use(total/powerefficiency) - cell.emp_act(severity) work_animation() visible_message(span_danger("[src] malfunctions, spraying chemicals everywhere!")) /obj/machinery/chem_dispenser/RefreshParts() . = ..() - recharge_amount = initial(recharge_amount) + heater_coefficient = initial(heater_coefficient) var/newpowereff = 0.0666666 var/parts_rating = 0 - for(var/obj/item/stock_parts/cell/P in component_parts) - cell = P - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - newpowereff += 0.0166666666*M.rating - parts_rating += M.rating - for(var/obj/item/stock_parts/capacitor/C in component_parts) - recharge_amount *= C.rating - parts_rating += C.rating - for(var/obj/item/stock_parts/manipulator/M in component_parts) - if (M.rating > 3) - dispensable_reagents |= upgrade_reagents - parts_rating += M.rating + var/bin_ratings = 0 + var/bin_count = 0 + for(var/obj/item/stock_parts/matter_bin/matter_bin in component_parts) + bin_ratings += matter_bin.rating + bin_count += 1 + parts_rating += matter_bin.rating + for(var/obj/item/stock_parts/capacitor/capacitor in component_parts) + newpowereff += 0.0166666666*capacitor.rating + parts_rating += capacitor.rating + for(var/obj/item/stock_parts/manipulator/manipulator in component_parts) + parts_rating += manipulator.rating + heater_coefficient = initial(heater_coefficient) * (bin_ratings / bin_count) powerefficiency = round(newpowereff, 0.01) /obj/machinery/chem_dispenser/proc/replace_beaker(mob/living/user, obj/item/reagent_containers/new_beaker) @@ -451,17 +333,20 @@ return TRUE /obj/machinery/chem_dispenser/on_deconstruction() - cell = null if(beaker) beaker.forceMove(drop_location()) beaker = null + for(var/cartridge_name in cartridges) + var/obj/item/cartridge = cartridges[cartridge_name] + cartridge.forceMove(drop_location()) + cartridges.Remove(cartridge_name) return ..() /obj/machinery/chem_dispenser/attack_hand_secondary(mob/user, list/modifiers) . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE)) return replace_beaker(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -475,199 +360,54 @@ /obj/machinery/chem_dispenser/AltClick(mob/user) return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation -/obj/machinery/chem_dispenser/drinks - name = "soda dispenser" - desc = "Contains a large reservoir of soft drinks." - icon = 'icons/obj/chemical.dmi' - icon_state = "soda_dispenser" - base_icon_state = "soda_dispenser" - has_panel_overlay = FALSE - dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP // magical mystery temperature of 274.5, where ice does not melt, and water does not freeze - amount = 10 - pixel_y = 6 - circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks - working_state = null - nopower_state = null - pass_flags = PASSTABLE - show_ph = FALSE - dispensable_reagents = list( - /datum/reagent/water, - /datum/reagent/consumable/ice, - /datum/reagent/consumable/coffee, - /datum/reagent/consumable/cream, - /datum/reagent/consumable/tea, - /datum/reagent/consumable/icetea, - /datum/reagent/consumable/space_cola, - /datum/reagent/consumable/spacemountainwind, - /datum/reagent/consumable/dr_gibb, - /datum/reagent/consumable/space_up, - /datum/reagent/consumable/tonic, - /datum/reagent/consumable/sodawater, - /datum/reagent/consumable/lemon_lime, - /datum/reagent/consumable/pwr_game, - /datum/reagent/consumable/shamblers, - /datum/reagent/consumable/sugar, - /datum/reagent/consumable/pineapplejuice, - /datum/reagent/consumable/orangejuice, - /datum/reagent/consumable/grenadine, - /datum/reagent/consumable/limejuice, - /datum/reagent/consumable/tomatojuice, - /datum/reagent/consumable/lemonjuice, - /datum/reagent/consumable/menthol - ) - //PARIAH EDIT - upgrade_reagents = list( - /datum/reagent/consumable/applejuice, - /datum/reagent/consumable/pumpkinjuice, - /datum/reagent/consumable/vanilla - ) - upgrade_reagents2 = list( - /datum/reagent/consumable/banana, - /datum/reagent/consumable/berryjuice, - /datum/reagent/consumable/blumpkinjuice - ) - upgrade_reagents3 = list( - /datum/reagent/consumable/watermelonjuice, - /datum/reagent/consumable/peachjuice, - /datum/reagent/consumable/sol_dry - ) - //PARIAH EDIT END - emagged_reagents = list( - /datum/reagent/consumable/ethanol/thirteenloko, - /datum/reagent/consumable/ethanol/whiskey_cola, - /datum/reagent/toxin/mindbreaker, - /datum/reagent/toxin/staminatoxin - ) - -/obj/machinery/chem_dispenser/drinks/Initialize(mapload) - . = ..() - AddComponent(/datum/component/simple_rotation) +/obj/machinery/chem_dispenser/proc/add_cartridge(obj/item/reagent_containers/chem_cartridge/cartidge, mob/user) + if(!istype(cartidge)) + if(user) + to_chat(user, span_warning("\The [cartidge] will not fit in \the [src]!")) + return -/obj/machinery/chem_dispenser/drinks/setDir() - var/old = dir - . = ..() - if(dir != old) - update_appearance() // the beaker needs to be re-positioned if we rotate + if(length(cartridges) >= maximum_cartridges) + if(user) + to_chat(user, span_warning("\The [src] does not have any free slots for \the [cartidge] to fit into!")) + return -/obj/machinery/chem_dispenser/drinks/display_beaker() - var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") - switch(dir) - if(NORTH) - b_o.pixel_y = 7 - b_o.pixel_x = rand(-9, 9) - if(EAST) - b_o.pixel_x = 4 - b_o.pixel_y = rand(-5, 7) - if(WEST) - b_o.pixel_x = -5 - b_o.pixel_y = rand(-5, 7) - else//SOUTH - b_o.pixel_y = -7 - b_o.pixel_x = rand(-9, 9) - return b_o + if(!cartidge.label) + if(user) + to_chat(user, span_warning("\The [cartidge] does not have a label!")) + return -/obj/machinery/chem_dispenser/drinks/fullupgrade //fully ugpraded stock parts, emagged - 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 + if(cartridges[cartidge.label]) + if(user) + to_chat(user, span_warning("\The [src] already contains a cartridge with that label!")) + return -/obj/machinery/chem_dispenser/drinks/fullupgrade/Initialize(mapload) - . = ..() - dispensable_reagents |= emagged_reagents //adds emagged reagents + if(user) + if(user.temporarilyRemoveItemFromInventory(cartidge)) + to_chat(user, span_notice("You add \the [cartidge] to \the [src].")) + else + return -/obj/machinery/chem_dispenser/drinks/beer - name = "booze dispenser" - desc = "Contains a large reservoir of the good stuff." - icon = 'icons/obj/chemical.dmi' - icon_state = "booze_dispenser" - base_icon_state = "booze_dispenser" - dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP - circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer - dispensable_reagents = list( - /datum/reagent/consumable/ethanol/beer, - /datum/reagent/consumable/ethanol/beer/maltliquor, - /datum/reagent/consumable/ethanol/kahlua, - /datum/reagent/consumable/ethanol/whiskey, - /datum/reagent/consumable/ethanol/wine, - /datum/reagent/consumable/ethanol/vodka, - /datum/reagent/consumable/ethanol/gin, - /datum/reagent/consumable/ethanol/rum, - /datum/reagent/consumable/ethanol/navy_rum, - /datum/reagent/consumable/ethanol/tequila, - /datum/reagent/consumable/ethanol/vermouth, - /datum/reagent/consumable/ethanol/cognac, - /datum/reagent/consumable/ethanol/ale, - /datum/reagent/consumable/ethanol/absinthe, - /datum/reagent/consumable/ethanol/hcider, - /datum/reagent/consumable/ethanol/creme_de_menthe, - /datum/reagent/consumable/ethanol/creme_de_cacao, - /datum/reagent/consumable/ethanol/creme_de_coconut, - /datum/reagent/consumable/ethanol/triple_sec, - /datum/reagent/consumable/ethanol/curacao, - /datum/reagent/consumable/ethanol/sake, - /datum/reagent/consumable/ethanol/applejack, - /datum/reagent/consumable/ethanol/synthanol// PARIAH EDIT - ) - upgrade_reagents = null - emagged_reagents = list( - /datum/reagent/consumable/ethanol, - /datum/reagent/iron, - /datum/reagent/toxin/minttoxin, - /datum/reagent/consumable/ethanol/atomicbomb, - /datum/reagent/consumable/ethanol/fernet - ) - -/obj/machinery/chem_dispenser/drinks/beer/fullupgrade //fully ugpraded stock parts, emagged - 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(mapload) - . = ..() - dispensable_reagents |= emagged_reagents //adds emagged reagents - -/obj/machinery/chem_dispenser/mutagen - name = "mutagen dispenser" - desc = "Creates and dispenses mutagen." - dispensable_reagents = list(/datum/reagent/toxin/mutagen) - upgrade_reagents = null - emagged_reagents = list(/datum/reagent/toxin/plasma) - - -/obj/machinery/chem_dispenser/mutagensaltpeter - name = "botanical chemical dispenser" - 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, - /datum/reagent/plantnutriment/eznutriment, - /datum/reagent/plantnutriment/left4zednutriment, - /datum/reagent/plantnutriment/robustharvestnutriment, - /datum/reagent/water, - /datum/reagent/toxin/plantbgone, - /datum/reagent/toxin/plantbgone/weedkiller, - /datum/reagent/toxin/pestkiller, - /datum/reagent/medicine/cryoxadone, - /datum/reagent/ammonia, - /datum/reagent/ash, - /datum/reagent/diethylamine) - upgrade_reagents = null - -/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(mapload) - . = ..() - dispensable_reagents |= emagged_reagents //adds emagged reagents + cartidge.forceMove(src) + cartridges[cartidge.label] = cartidge + cartridges = sortTim(cartridges, GLOBAL_PROC_REF(cmp_text_asc)) + +/obj/machinery/chem_dispenser/proc/remove_cartridge(label) + . = cartridges[label] + cartridges -= label + +/obj/machinery/chem_dispenser/mini + name = "mini chem dispenser" + icon_state = "minidispenser" + base_icon_state = "minidispenser" + maximum_cartridges = 15 + circuit = /obj/item/circuitboard/machine/chem_dispenser/mini + +/obj/machinery/chem_dispenser/big + name = "big chem dispenser" + icon_state = "bigdispenser" + base_icon_state = "bigdispenser" + maximum_cartridges = 35 + circuit = /obj/item/circuitboard/machine/chem_dispenser/big /obj/machinery/chem_dispenser/abductor name = "reagent synthesizer" @@ -680,45 +420,3 @@ working_state = null nopower_state = null use_power = NO_POWER_USE - dispensable_reagents = list( - /datum/reagent/aluminium, - /datum/reagent/bromine, - /datum/reagent/carbon, - /datum/reagent/chlorine, - /datum/reagent/copper, - /datum/reagent/consumable/ethanol, - /datum/reagent/fluorine, - /datum/reagent/hydrogen, - /datum/reagent/iodine, - /datum/reagent/iron, - /datum/reagent/lithium, - /datum/reagent/mercury, - /datum/reagent/nitrogen, - /datum/reagent/oxygen, - /datum/reagent/phosphorus, - /datum/reagent/potassium, - /datum/reagent/uranium/radium, - /datum/reagent/silicon, - /datum/reagent/silver, - /datum/reagent/sodium, - /datum/reagent/stable_plasma, - /datum/reagent/consumable/sugar, - /datum/reagent/sulfur, - /datum/reagent/toxin/acid, - /datum/reagent/water, - /datum/reagent/fuel, - /datum/reagent/acetone, - /datum/reagent/ammonia, - /datum/reagent/ash, - /datum/reagent/diethylamine, - /datum/reagent/fuel/oil, - /datum/reagent/saltpetre, - /datum/reagent/medicine/mine_salve, - /datum/reagent/medicine/morphine, - /datum/reagent/drug/space_drugs, - /datum/reagent/toxin, - /datum/reagent/toxin/plasma, - /datum/reagent/uranium, - /datum/reagent/consumable/liquidelectricity/enriched, - /datum/reagent/medicine/c2/synthflesh - ) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser_prefabs.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser_prefabs.dm new file mode 100644 index 000000000000..147ac0dc5356 --- /dev/null +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser_prefabs.dm @@ -0,0 +1,74 @@ +// Premade dispensers for mappers. + +/obj/machinery/chem_dispenser/drinks + name = "soda dispenser" + desc = "Contains a large reservoir of soft drinks." + icon = 'icons/obj/chemical.dmi' + icon_state = "soda_dispenser" + base_icon_state = "soda_dispenser" + has_panel_overlay = FALSE + dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP // magical mystery temperature of 274.5, where ice does not melt, and water does not freeze + heater_coefficient = SOFT_DISPENSER_HEATER_COEFFICIENT + amount = 10 + pixel_y = 6 + circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks + working_state = null + nopower_state = null + pass_flags = PASSTABLE | PASSMACHINE | LETPASSCLICKS + +/obj/machinery/chem_dispenser/drinks/set_cart_list() + spawn_cartridges = GLOB.cartridge_list_drinks.Copy() + +/obj/machinery/chem_dispenser/drinks/Initialize(mapload) + . = ..() + AddComponent(/datum/component/simple_rotation) + +/obj/machinery/chem_dispenser/drinks/setDir() + var/old = dir + . = ..() + if(dir != old) + update_appearance() // the beaker needs to be re-positioned if we rotate + +/obj/machinery/chem_dispenser/drinks/display_beaker() + var/mutable_appearance/b_o = beaker_overlay || mutable_appearance(icon, "disp_beaker") + switch(dir) + if(NORTH) + b_o.pixel_y = 7 + b_o.pixel_x = rand(-9, 9) + if(EAST) + b_o.pixel_x = 4 + b_o.pixel_y = rand(-5, 7) + if(WEST) + b_o.pixel_x = -5 + b_o.pixel_y = rand(-5, 7) + else//SOUTH + b_o.pixel_y = -7 + b_o.pixel_x = rand(-9, 9) + return b_o + +/obj/machinery/chem_dispenser/drinks/beer + name = "booze dispenser" + desc = "Contains a large reservoir of the good stuff." + icon = 'icons/obj/chemical.dmi' + icon_state = "booze_dispenser" + base_icon_state = "booze_dispenser" + dispensed_temperature = WATER_MATTERSTATE_CHANGE_TEMP + heater_coefficient = SOFT_DISPENSER_HEATER_COEFFICIENT + circuit = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer + +/obj/machinery/chem_dispenser/drinks/beer/set_cart_list() + spawn_cartridges = GLOB.cartridge_list_booze.Copy() + +/obj/machinery/chem_dispenser/mini/mutagen + name = "mini mutagen dispenser" + desc = "Dispenses mutagen." + +/obj/machinery/chem_dispenser/mini/mutagen/set_cart_list() + spawn_cartridges = list(/datum/reagent/toxin/mutagen = /obj/item/reagent_containers/chem_cartridge/medium) + +/obj/machinery/chem_dispenser/mini/mutagensaltpeter + name = "botanical mini chemical dispenser" + desc = "Dispenses chemicals useful for botany." + +/obj/machinery/chem_dispenser/mini/mutagensaltpeter/set_cart_list() + spawn_cartridges = GLOB.cartridge_list_botany.Copy() diff --git a/code/modules/reagents/chemistry/machinery/chem_heater.dm b/code/modules/reagents/chemistry/machinery/chem_heater.dm index 106241394691..a326d68686a3 100644 --- a/code/modules/reagents/chemistry/machinery/chem_heater.dm +++ b/code/modules/reagents/chemistry/machinery/chem_heater.dm @@ -1,15 +1,5 @@ -///Tutorial states -#define TUT_NO_BUFFER 50 -#define TUT_START 1 -#define TUT_HAS_REAGENTS 2 -#define TUT_IS_ACTIVE 3 -#define TUT_IS_REACTING 4 -#define TUT_FAIL 4.5 -#define TUT_COMPLETE 5 -#define TUT_MISSING 10 - /obj/machinery/chem_heater - name = "reaction chamber" //Maybe this name is more accurate? + name = "chemical heater" density = TRUE pass_flags_self = PASSMACHINE | LETPASSTHROW icon = 'icons/obj/chemical.dmi' @@ -34,18 +24,15 @@ /obj/machinery/chem_heater/Initialize(mapload) . = ..() create_reagents(200, NO_REACT)//Lets save some calculations here - //TODO: comsig reaction_start and reaction_end to enable/disable the UI autoupdater - this doesn't work presently as there's a hard divide between instant and processed reactions /obj/machinery/chem_heater/deconstruct(disassembled) . = ..() if(beaker && disassembled) - UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) beaker.forceMove(drop_location()) beaker = null /obj/machinery/chem_heater/Destroy() if(beaker) - UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) QDEL_NULL(beaker) return ..() @@ -64,7 +51,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH|USE_IGNORE_TK)) return replace_beaker(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -80,11 +67,9 @@ return FALSE if(beaker) try_put_in_hand(beaker, user) - UnregisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP) beaker = null if(new_beaker) beaker = new_beaker - RegisterSignal(beaker.reagents, COMSIG_REAGENTS_REACTION_STEP, PROC_REF(on_reaction_step)) update_appearance() return TRUE @@ -99,62 +84,6 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Heating reagents at [heater_coefficient*1000]% speed.") -/obj/machinery/chem_heater/process(delta_time) - ..() - //Tutorial logics - if(tutorial_active) - switch(tutorial_state) - if(TUT_NO_BUFFER) - if(reagents.has_reagent(/datum/reagent/reaction_agent/basic_buffer, 5) && reagents.has_reagent(/datum/reagent/reaction_agent/acidic_buffer, 5)) - tutorial_state = TUT_START - - if(TUT_START) - if(!reagents.has_reagent(/datum/reagent/reaction_agent/basic_buffer, 5) || !reagents.has_reagent(/datum/reagent/reaction_agent/acidic_buffer, 5)) - tutorial_state = TUT_NO_BUFFER - return - if(beaker?.reagents.has_reagent(/datum/reagent/mercury, 10) || beaker?.reagents.has_reagent(/datum/reagent/chlorine, 10)) - tutorial_state = TUT_HAS_REAGENTS - if(TUT_HAS_REAGENTS) - if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury, 9)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine, 9))) - tutorial_state = TUT_MISSING - return - if(beaker?.reagents.chem_temp > 374)//If they heated it up as asked - tutorial_state = TUT_IS_ACTIVE - target_temperature = 375 - beaker.reagents.chem_temp = 375 - - if(TUT_IS_ACTIVE) - if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine))) //Slightly concerned that people might take ages to read and it'll react anyways - tutorial_state = TUT_MISSING - return - if(length(beaker?.reagents.reaction_list) == 1)//Only fudge numbers for our intentful reaction - beaker.reagents.chem_temp = 375 - - if(target_temperature >= 390) - tutorial_state = TUT_IS_REACTING - - if(TUT_IS_REACTING) - if(!(beaker?.reagents.has_reagent(/datum/reagent/mercury)) || !(beaker?.reagents.has_reagent(/datum/reagent/chlorine))) - tutorial_state = TUT_COMPLETE - - if(TUT_COMPLETE) - if(beaker?.reagents.has_reagent(/datum/reagent/consumable/failed_reaction)) - tutorial_state = TUT_FAIL - return - if(!beaker?.reagents.has_reagent(/datum/reagent/medicine/calomel)) - tutorial_state = TUT_MISSING - - if(machine_stat & NOPOWER) - return - if(on) - if(beaker?.reagents.total_volume) - if(beaker.reagents.is_reacting)//on_reaction_step() handles this - return - //keep constant with the chemical acclimator please - 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() - - use_power(active_power_usage * delta_time) /obj/machinery/chem_heater/attackby(obj/item/I, mob/user, params) if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I)) @@ -189,18 +118,9 @@ replace_beaker() return ..() -///Forces a UI update every time a reaction step happens inside of the beaker it contains. This is so the UI is in sync with the reaction since it's important that the output matches the current conditions for pH adjustment and temperature. -/obj/machinery/chem_heater/proc/on_reaction_step(datum/reagents/holder, num_reactions, delta_time) - SIGNAL_HANDLER - if(on) - holder.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * delta_time * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume * (rand(8,11) * 0.1))//Give it a little wiggle room since we're actively reacting - for(var/ui_client in ui_client_list) - var/datum/tgui/ui = ui_client - if(!ui) - stack_trace("Warning: UI in UI client list is missing in [src] (chem_heater)") - remove_ui_client_list(ui) - continue - ui.send_update() +/obj/machinery/chem_heater/process() + if(on && beaker) + beaker.reagents.adjust_thermal_energy((target_temperature - beaker.reagents.chem_temp) * heater_coefficient * SPECIFIC_HEAT_DEFAULT * beaker.reagents.total_volume * (rand(8,11) * 0.1))//Give it a little wiggle room since we're actively reacting /obj/machinery/chem_heater/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -246,9 +166,8 @@ data["isBeakerLoaded"] = beaker ? 1 : 0 data["currentTemp"] = beaker ? beaker.reagents.chem_temp : null - data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, 0.01) : null + data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) : null data["beakerMaxVolume"] = beaker ? beaker.volume : null - data["currentpH"] = beaker ? round(beaker.reagents.ph, 0.01) : null var/upgrade_level = heater_coefficient*10 data["upgradeLevel"] = upgrade_level @@ -256,11 +175,11 @@ for(var/r in beaker?.reagents.reagent_list) var/datum/reagent/reagent = r beaker_contents.len++ - beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, 0.01)) + beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING)) data["beakerContents"] = beaker_contents var/list/active_reactions = list() - var/flashing = DISABLE_FLASHING //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false + for(var/_reaction in beaker?.reagents.reaction_list) var/datum/equilibrium/equilibrium = _reaction if(!length(beaker.reagents.reaction_list))//I'm not sure why when it explodes it causes the gui to fail (it's missing danger (?) ) @@ -275,12 +194,6 @@ var/overheat = FALSE var/danger = FALSE var/purity_alert = 2 //same as flashing - if(reagent.purity < equilibrium.reaction.purity_min) - purity_alert = ENABLE_FLASHING//Because 0 is seen as null - danger = TRUE - if(!(flashing == ENABLE_FLASHING))//So that the pH meter flashes for ANY reactions out of optimal - if(equilibrium.reaction.optimal_ph_min > beaker?.reagents.ph || equilibrium.reaction.optimal_ph_max < beaker?.reagents.ph) - flashing = ENABLE_FLASHING if(equilibrium.reaction.is_cold_recipe) if(equilibrium.reaction.overheat_temp > beaker?.reagents.chem_temp && equilibrium.reaction.overheat_temp != NO_OVERHEAT) danger = TRUE @@ -294,86 +207,11 @@ if(entry["name"] == reagent.name) //If we have multiple reaction methods for the same result - combine them entry["reactedVol"] = equilibrium.reacted_vol entry["targetVol"] = round(equilibrium.target_vol, 1)//Use the first result reagent to name the reaction detected - entry["quality"] = (entry["quality"] + equilibrium.reaction_quality) /2 continue active_reactions.len++ - active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "purityAlert" = purity_alert, "quality" = equilibrium.reaction_quality, "overheat" = overheat, "inverse" = reagent.inverse_chem_val, "minPure" = equilibrium.reaction.purity_min, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected + active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "purityAlert" = purity_alert, "overheat" = overheat, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected data["activeReactions"] = active_reactions - data["isFlashing"] = flashing - - data["acidicBufferVol"] = reagents.get_reagent_amount(/datum/reagent/reaction_agent/acidic_buffer) - data["basicBufferVol"] = reagents.get_reagent_amount(/datum/reagent/reaction_agent/basic_buffer) data["dispenseVolume"] = dispense_volume - - data["tutorialMessage"] = null - //Tutorial output - if(tutorial_active) - switch(tutorial_state) - if(TUT_NO_BUFFER)//missing buffer - data["tutorialMessage"] = {"It looks like you’re a little low on buffers, here’s how to make more: - -Acidic buffer: 2 parts Sodium - 2 parts Hydrogen - 2 parts Ethanol - 2 parts Water - -Basic buffer: 3 parts Ammonia - 2 parts Chlorine - 2 parts Hydrogen - 2 parts Oxygen - -Heat either up to speed up the reaction. - -When the reactions are done, refill your chamber by pressing the Draw all buttons, to the right of the respective volume indicators. - -To continue with the tutorial, fill both of your acidic and alkaline volumes to at least 5u."} - if(TUT_START)//Default start - data["tutorialMessage"] = {"Hello and welcome to the exciting world of chemistry! This help option will teach you the basic of reactions by guiding you through a calomel reaction. - -For the majority of reactions, the overheat temperature is 900K, and the pH range is 5-9, though it's always worth looking up the ranges as these are changing. Calomel is no different. - -To continue the tutorial, insert a beaker with at least 10u mercury and 10u chlorine added."} - if(TUT_HAS_REAGENTS) //10u Hg and Cl - data["tutorialMessage"] = {"Good job! You'll see that at present this isn't reacting. That's because this reaction needs a minimum temperature of 375K. - -For the most part the hotter your reaction is, the faster it will react when it’s past it’s minimum temperature. But be careful to not heat it too much! "If your reaction is slow, your temperature is too low"! - -When you’re ready, set your temperature to 375K and heat up the beaker to that amount."} - if(TUT_IS_ACTIVE) //heat 375K - data["tutorialMessage"] = {"Great! You should see your reaction slowly progressing. - -Notice the pH dial on the right; the sum pH should be slowly drifting towards the left on the dial. How pure your solution is at the end depends on how well you keep your reaction within the optimal pH range. The dial will flash if any of the present reactions are outside their optimal. "If you're getting sludge, give your pH a nudge"! - -In a moment, we’ll increase the temperature so that our rate is faster. It’s up to you to keep your pH within the limits, so keep an eye on that dial, and get ready to add basic buffer using the injection button to the left of the volume indicator. - -To continue set your target temperature to 390K."} - if(TUT_IS_REACTING) //Heat 390K - data["tutorialMessage"] = "Stay focused on the reaction! You can do it!" - if(TUT_FAIL) //Sludge - data["tutorialMessage"] = "Ah, unfortunately your purity was too low and the reaction fell apart into errant sludge. Don't worry, you can always try again! Be careful though, for some reactions, failing isn't nearly as forgiving." - if(TUT_COMPLETE) //Complete - var/datum/reagent/calo = beaker?.reagents.has_reagent(/datum/reagent/medicine/calomel) - if(!calo) - tutorial_state = TUT_COMPLETE - return - switch(calo.purity) - if(-INFINITY to 0.25) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. That's pretty close to the fail purity of 0.15 - which can often make some reactions explode. This chem will invert into Toxic sludge when ingested by another person, and will not cause of calomel's normal effects. Sneaky, huh?" - if(0.25 to 0.6) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Normally, this reaction will resolve above 0.7 without intervention. Are you praticing impure reactions? The lower you go, the higher change you have of getting dangerous effects during a reaction. In some more dangerous reactions, you're riding a fine line between death and an inverse chem, don't forget you can always chill your reaction to give yourself more time to manage it!" - if(0.6 to 0.75) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Normally, this reaction will resolve above 0.7 without intervention. Did you maybe add too much basic buffer and go past 9? If you like - you're welcome to try again. Just double press the help button!" - if(0.75 to 0.85) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. You got pretty close to optimal! Feel free to try again if you like by double pressing the help button." - if(0.75 to 0.99) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. You got pretty close to optimal! Feel free to try again if you like by double pressing the help button, but this is a respectable purity." - if(0.99 to 1) - data["tutorialMessage"] = "You did it! Congratulations! I can tell you that your final purity was [calo.purity]. Your calomel is as pure as they come! You've mastered the basics of chemistry, but there's plenty more challenges on the horizon. Good luck!" - user.client?.give_award(/datum/award/achievement/jobs/chemistry_tut, user) - data["tutorialMessage"] += "\n\nDid you notice that your temperature increased past 390K while reacting too? That's because this reaction is exothermic (heat producing), so for some reactions you might have to adjust your target to compensate. Oh, and you can check your purity by researching and printing off a chemical analyzer at the medlathe (for now)!" - if(TUT_MISSING) //Missing - data["tutorialMessage"] = "Uh oh, something went wrong. Did you take the beaker out, heat it up too fast, or have other things in the beaker? Try restarting the tutorial by double pressing the help button." - return data /obj/machinery/chem_heater/ui_act(action, params) @@ -395,118 +233,3 @@ To continue set your target temperature to 390K."} //Eject doesn't turn it off, so you can preheat for beaker swapping replace_beaker(usr) . = TRUE - if("acidBuffer") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - move_buffer("acid", target) - if("basicBuffer") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) //Because the input is flipped - . = TRUE - if(.) - move_buffer("basic", target) - if("disp_vol") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) //Because the input is flipped - . = TRUE - if(.) - dispense_volume = target - if("help") - tutorial_active = !tutorial_active - if(tutorial_active) - tutorial_state = 1 - return - tutorial_state = 0 - //Refresh window size - ui_close(usr) - ui_interact(usr, null) - - -///Moves a type of buffer from the heater to the beaker, or vice versa -/obj/machinery/chem_heater/proc/move_buffer(buffer_type, volume) - if(!beaker) - say("No beaker found!") - return - if(buffer_type == "acid") - if(volume < 0) - var/datum/reagent/acid_reagent = beaker.reagents.get_reagent(/datum/reagent/reaction_agent/acidic_buffer) - if(!acid_reagent) - say("Unable to find acidic buffer in beaker to draw from! Please insert a beaker containing acidic buffer.") - return - var/datum/reagent/acid_reagent_heater = reagents.get_reagent(/datum/reagent/reaction_agent/acidic_buffer) - var/cur_vol = 0 - if(acid_reagent_heater) - cur_vol = acid_reagent_heater.volume - volume = 100 - cur_vol - beaker.reagents.trans_id_to(src, acid_reagent.type, volume)//negative because we're going backwards - return - //We must be positive here - reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/acidic_buffer, dispense_volume) - return - - if(buffer_type == "basic") - if(volume < 0) - var/datum/reagent/basic_reagent = beaker.reagents.get_reagent(/datum/reagent/reaction_agent/basic_buffer) - if(!basic_reagent) - say("Unable to find basic buffer in beaker to draw from! Please insert a beaker containing basic buffer.") - return - var/datum/reagent/basic_reagent_heater = reagents.get_reagent(/datum/reagent/reaction_agent/basic_buffer) - var/cur_vol = 0 - if(basic_reagent_heater) - cur_vol = basic_reagent_heater.volume - volume = 100 - cur_vol - beaker.reagents.trans_id_to(src, basic_reagent.type, volume)//negative because we're going backwards - return - reagents.trans_id_to(beaker, /datum/reagent/reaction_agent/basic_buffer, dispense_volume) - return - - -/obj/machinery/chem_heater/proc/get_purity_color(datum/equilibrium/equilibrium) - var/_reagent = equilibrium.reaction.results[1] - var/datum/reagent/reagent = equilibrium.holder.get_reagent(_reagent) - // Can't be a switch due to http://www.byond.com/forum/post/2750423 - if(reagent.purity in 1 to INFINITY) - return "blue" - else if(reagent.purity in 0.8 to 1) - return "green" - else if(reagent.purity in reagent.inverse_chem_val to 0.8) - return "olive" - else if(reagent.purity in equilibrium.reaction.purity_min to reagent.inverse_chem_val) - return "orange" - else if(reagent.purity in -INFINITY to equilibrium.reaction.purity_min) - return "red" - -//Has a lot of buffer and is upgraded -/obj/machinery/chem_heater/debug - name = "Debug Reaction Chamber" - desc = "Now with even more buffers!" - -/obj/machinery/chem_heater/debug/Initialize(mapload) - . = ..() - reagents.maximum_volume = 2000 - reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 1000) - reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 1000) - heater_coefficient = 0.4 //hack way to upgrade - -//map load types -/obj/machinery/chem_heater/withbuffer - desc = "This Reaction Chamber comes with a bit of buffer to help get you started." - -/obj/machinery/chem_heater/withbuffer/Initialize(mapload) - . = ..() - reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 20) - reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 20) - -#undef TUT_NO_BUFFER -#undef TUT_START -#undef TUT_HAS_REAGENTS -#undef TUT_IS_ACTIVE -#undef TUT_IS_REACTING -#undef TUT_FAIL -#undef TUT_COMPLETE -#undef TUT_MISSING diff --git a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm b/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm deleted file mode 100644 index fc1bd397b230..000000000000 --- a/code/modules/reagents/chemistry/machinery/chem_mass_spec.dm +++ /dev/null @@ -1,403 +0,0 @@ - -#define BEAKER1 1 -#define BEAKER2 2 - -/obj/machinery/chem_mass_spec - name = "High-performance liquid chromatography machine" - desc = {"This machine can separate reagents based on charge, meaning it can clean reagents of some of their impurities, unlike the Chem Master 3000. -By selecting a range in the mass spectrograph certain reagents will be transferred from one beaker to another, which will clean it of any impurities up to a certain amount. -This will not clean any inverted reagents. Inverted reagents will still be correctly detected and displayed on the scanner, however. -\nLeft click with a beaker to add it to the input slot, Right click with a beaker to add it to the output slot. Alt + left/right click can let you quickly remove the corresponding beaker."} - density = TRUE - layer = BELOW_OBJ_LAYER - icon = 'icons/obj/chemical.dmi' - icon_state = "HPLC" - base_icon_state = "HPLC" - idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.2 - resistance_flags = FIRE_PROOF | ACID_PROOF - circuit = /obj/item/circuitboard/machine/chem_mass_spec - ///If we're processing reagents or not - var/processing_reagents = FALSE - ///Time we started processing + the delay - var/delay_time = 0 - ///How much time we've done so far - var/progress_time = 0 - ///Lower mass range - for mass selection of what will be processed - var/lower_mass_range = 0 - ///Upper_mass_range - for mass selection of what will be processed - var/upper_mass_range = INFINITY - ///The log output to clarify how the thing works - var/list/log = list() - ///Input reagents container - var/obj/item/reagent_containers/beaker1 - ///Output reagents container - var/obj/item/reagent_containers/beaker2 - ///multiplies the final time needed to process the chems depending on the laser stock part - var/cms_coefficient = 1 - -/obj/machinery/chem_mass_spec/Initialize(mapload) - . = ..() - ADD_TRAIT(src, DO_NOT_SPLASH, src.type) - if(mapload) - beaker2 = new /obj/item/reagent_containers/glass/beaker/large(src) - - AddElement( \ - /datum/element/contextual_screentip_bare_hands, \ - lmb_text = "Add input beaker", \ - rmb_text = "Add output beaker", \ - ) - -/obj/machinery/chem_mass_spec/Destroy() - QDEL_NULL(beaker1) - QDEL_NULL(beaker2) - return ..() - -/obj/machinery/chem_mass_spec/RefreshParts() - . = ..() - cms_coefficient = 1 - for(var/obj/item/stock_parts/micro_laser/laser in component_parts) - cms_coefficient /= laser.rating - -/obj/machinery/chem_mass_spec/deconstruct(disassembled) - if(beaker1) - beaker1.forceMove(drop_location()) - beaker1 = null - if(beaker2) - beaker2.forceMove(drop_location()) - beaker2 = null - . = ..() - -/obj/machinery/chem_mass_spec/update_overlays() - . = ..() - if(panel_open) - . += mutable_appearance(icon, "[base_icon_state]_panel-o") - -/obj/machinery/chem_mass_spec/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/* beaker swapping/attack code */ -/obj/machinery/chem_mass_spec/attackby(obj/item/item, mob/user, params) - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return ..() - - if(default_deconstruction_screwdriver(user, icon_state, icon_state, item)) - update_appearance() - return - - if(istype(item, /obj/item/reagent_containers) && !(item.item_flags & ABSTRACT) && item.is_open_container()) - var/obj/item/reagent_containers/beaker = item - . = TRUE //no afterattack - if(!user.transferItemToLoc(beaker, src)) - return - replace_beaker(user, BEAKER1, beaker) - to_chat(user, span_notice("You add [beaker] to [src].")) - update_appearance() - ui_interact(user) - return - ..() - -/obj/machinery/chem_mass_spec/attackby_secondary(obj/item/item, mob/user, params) - . = ..() - - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - - if(default_deconstruction_crowbar(item)) - return - - if(istype(item, /obj/item/reagent_containers) && !(item.item_flags & ABSTRACT) && item.is_open_container()) - var/obj/item/reagent_containers/beaker = item - if(!user.transferItemToLoc(beaker, src)) - return - replace_beaker(user, BEAKER2, beaker) - to_chat(user, span_notice("You add [beaker] to [src].")) - ui_interact(user) - . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - - update_appearance() - -/obj/machinery/chem_mass_spec/AltClick(mob/living/user) - . = ..() - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - if(!can_interact(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return ..() - replace_beaker(user, BEAKER1) - -/obj/machinery/chem_mass_spec/alt_click_secondary(mob/living/user) - . = ..() - if(processing_reagents) - to_chat(user, " The [src] is currently processing a batch!") - return - if(!can_interact(user) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) - return - replace_beaker(user, BEAKER2) - -///Gee how come you get two beakers? -/* - * Similar to other replace beaker procs, except now there are two of them! - * When passed a beaker along with a position define it will swap a beaker in that slot (if there is one) with the beaker the machine is bonked with - * - * arguments: - * * user - The one bonking the machine - * * target beaker - the define (BEAKER1/BEAKER2) of what position to replace - * * new beaker - the new beaker to add/replace the slot with - */ -/obj/machinery/chem_mass_spec/proc/replace_beaker(mob/living/user, target_beaker, obj/item/reagent_containers/new_beaker) - if(!user) - return FALSE - switch(target_beaker) - if(BEAKER1) - if(beaker1) - try_put_in_hand(beaker1, user) - beaker1 = null - beaker1 = new_beaker - lower_mass_range = calculate_smallest_mass() - upper_mass_range = calculate_largest_mass() - if(BEAKER2) - if(beaker2) - try_put_in_hand(beaker2, user) - beaker2 = null - beaker2 = new_beaker - update_appearance() - return TRUE - -/* Icon code */ - -/obj/machinery/chem_mass_spec/update_icon_state() - if(powered()) - icon_state = "HPLC_on" - else - icon_state = "HPLC" - return ..() - -/obj/machinery/chem_mass_spec/update_overlays() - . = ..() - if(beaker1) - . += "HPLC_beaker1" - if(beaker2) - . += "HPLC_beaker2" - if(powered()) - if(processing_reagents) - . += "HPLC_graph_active" - else if (length(beaker1?.reagents.reagent_list)) - . += "HPLC_graph_idle" - -/* UI Code */ - -/obj/machinery/chem_mass_spec/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "MassSpec", name) - ui.open() - -/obj/machinery/chem_mass_spec/ui_data(mob/user) - var/data = list() - data["graphLowerRange"] = 0 - data["lowerRange"] = lower_mass_range - data["upperRange"] = upper_mass_range - data["processing"] = processing_reagents - data["log"] = log - data["beaker1"] = beaker1 ? TRUE : FALSE - data["beaker2"] = beaker2 ? TRUE : FALSE - if(processing_reagents) - data["eta"] = delay_time - progress_time - else - data["eta"] = estimate_time() - - var/beakerContents[0] - if(beaker1 && beaker1.reagents) - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - var/in_range = TRUE - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - in_range = FALSE - beakerContents.Add(list(list("name" = inverse_reagent.name, "volume" = round(reagent.volume, 0.01), "mass" = inverse_reagent.mass, "purity" = 1-reagent.purity, "selected" = in_range, "color" = "#b60046", "type" = "Inverted"))) - data["peakHeight"] = max(data["peakHeight"], reagent.volume) - continue - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - in_range = FALSE - ///We want to be sure that the impure chem appears after the parent chem in the list so that it always overshadows pure reagents - beakerContents.Add(list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01), "mass" = reagent.mass, "purity" = reagent.purity, "selected" = in_range, "color" = "#3cf096", "type" = "Clean"))) - data["peakHeight"] = max(data["peakHeight"], reagent.volume) - - data["beaker1CurrentVolume"] = beaker1.reagents.total_volume - data["beaker1MaxVolume"] = beaker1.reagents.maximum_volume - data["beaker1Contents"] = beakerContents - data["graphUpperRange"] = calculate_largest_mass() //+10 because of the range on the peak - - beakerContents = list() - if(beaker2 && beaker2.reagents) - for(var/datum/reagent/reagent in beaker2.reagents.reagent_list) - ///Normal stuff - beakerContents.Add(list(list("name" = reagent.name, "volume" = round(reagent.volume * reagent.purity, 0.01), "mass" = reagent.mass, "purity" = reagent.purity, "color" = "#3cf096", "type" = "Clean", log = log[reagent.type]))) - data["beaker2CurrentVolume"] = beaker2.reagents.total_volume - data["beaker2MaxVolume"] = beaker2.reagents.maximum_volume - data["beaker2Contents"] = beakerContents - - return data - -/obj/machinery/chem_mass_spec/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("activate") - if(!beaker1 || !beaker2 || !is_operational) - say("This [src] is missing an output beaker!") - return - if(processing_reagents) - say("You shouldn't be seeing this message! Please report this bug to https://github.com/DaedalusDock/Gameserver/issues . Thank you!") - stack_trace("Someone managed to break the HPLC and tried to get it to activate when it's already activated!") - return - processing_reagents = TRUE - estimate_time() - progress_time = 0 - update_appearance() - begin_processing() - . = TRUE - if("leftSlider") - if(!is_operational || processing_reagents) - return - var/current_center = (lower_mass_range + upper_mass_range)/2 - lower_mass_range = clamp(params["value"], calculate_smallest_mass(), current_center) - . = TRUE - if("rightSlider") - if(!is_operational || processing_reagents) - return - var/current_center = (lower_mass_range + upper_mass_range)/2 - upper_mass_range = clamp(params["value"], current_center, calculate_largest_mass()) - . = TRUE - if("centerSlider") - if(!is_operational || processing_reagents) - return - var/current_center = (lower_mass_range + upper_mass_range)/2 - var/delta_center = current_center - params["value"] - var/lowest = calculate_smallest_mass() - var/highest = calculate_largest_mass() - lower_mass_range = clamp(lower_mass_range - delta_center, lowest, highest) - upper_mass_range = clamp(upper_mass_range - delta_center, lowest, highest) - . = TRUE - if("eject1") - if(processing_reagents) - return - replace_beaker(usr, BEAKER1) - . = TRUE - if("eject2") - if(processing_reagents) - return - replace_beaker(usr, BEAKER2) - . = TRUE - -/* processing procs */ - -///Increments time if it's progressing - if it's past time then it purifies and stops processing -/obj/machinery/chem_mass_spec/process(delta_time) - . = ..() - if(!is_operational) - return FALSE - if(!processing_reagents) - return TRUE - use_power(active_power_usage) - if(progress_time >= delay_time) - processing_reagents = FALSE - progress_time = 0 - purify_reagents() - end_processing() - update_appearance() - return TRUE - progress_time += delta_time - return FALSE - -/* - * Processing through the reagents in beaker 1 - * For all the reagents within the selected range - we will then purify them up to their initial purity (usually 75%). It will take away the relative reagent volume from the sum volume of the reagent however. - * If there are any inverted reagents - then it will instead just create a new reagent of the inverted type. This doesn't really do anything other than change the name of it, - * As it processes through the reagents, it saves what changes were applied to each reagent in a log var to show the results at the end - */ -/obj/machinery/chem_mass_spec/proc/purify_reagents() - log = list() - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - //Inverse first - var/volume = reagent.volume - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - continue - log += list(inverse_reagent.type = "Cannot purify inverted") //Might as well make it do something - just updates the reagent's name - beaker2.reagents.add_reagent(reagent.inverse_chem, volume, reagtemp = beaker1.reagents.chem_temp, added_purity = 1-reagent.purity) - beaker1.reagents.remove_reagent(reagent.type, volume) - continue - - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - continue - - var/delta_purity = initial(reagent.purity) - reagent.purity - if(delta_purity <= 0)//As pure as we can be - so lets not add more than we need - log += list(reagent.type = "Can't purify over [initial(reagent.purity)*100]%") - beaker2.reagents.add_reagent(reagent.type, volume, reagtemp = beaker1.reagents.chem_temp, added_purity = reagent.purity, added_ph = reagent.ph) - beaker1.reagents.remove_reagent(reagent.type, volume) - continue - - var/product_vol = reagent.volume * (1-delta_purity) - beaker2.reagents.add_reagent(reagent.type, product_vol, reagtemp = beaker1.reagents.chem_temp, added_purity = initial(reagent.purity), added_ph = reagent.ph) - beaker1.reagents.remove_reagent(reagent.type, reagent.volume) - log += list(reagent.type = "Purified to [initial(reagent.purity)*100]%") - -/* Mass spec graph calcs */ - -///Returns the largest mass to the nearest 50 (rounded up) -/obj/machinery/chem_mass_spec/proc/calculate_largest_mass() - if(!beaker1?.reagents) - return 0 - var/max_mass = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - max_mass = max(max_mass, inverse_reagent.mass) - continue - max_mass = max(max_mass, reagent.mass) - return CEILING(max_mass, 50) - -///Returns the smallest mass to the nearest 50 (rounded down) -/obj/machinery/chem_mass_spec/proc/calculate_smallest_mass() - if(!beaker1?.reagents) - return 0 - var/min_mass = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - min_mass = min(min_mass, inverse_reagent.mass) - continue - min_mass = min(min_mass, reagent.mass) - return FLOOR(min_mass, 50) - -/* - * Estimates how long the highlighted range will take to process - * The time will increase based off the reagent's volume, mass and purity. - * In most cases this is between 10 to 30s for a single reagent. - * This is why having a higher mass for a reagent is a balancing tool. - */ -/obj/machinery/chem_mass_spec/proc/estimate_time() - if(!beaker1?.reagents) - return 0 - var/time = 0 - for(var/datum/reagent/reagent as anything in beaker1.reagents.reagent_list) - if(reagent.inverse_chem_val > reagent.purity && reagent.inverse_chem) - var/datum/reagent/inverse_reagent = GLOB.chemical_reagents_list[reagent.inverse_chem] - if(inverse_reagent.mass < lower_mass_range || inverse_reagent.mass > upper_mass_range) - continue - time += (((inverse_reagent.mass * reagent.volume) + (inverse_reagent.mass * reagent.purity * 0.1)) * 0.003) + 10 ///Roughly 10 - 30s? - continue - if(reagent.mass < lower_mass_range || reagent.mass > upper_mass_range) - continue - var/inverse_purity = 1-reagent.purity - time += (((reagent.mass * reagent.volume) + (reagent.mass * inverse_purity * 0.1)) * 0.0035) + 10 ///Roughly 10 - 30s? - delay_time = (time * cms_coefficient) - return delay_time diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 1f343e79712c..03a20b45478f 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -66,19 +66,19 @@ switch(severity) if(EXPLODE_DEVASTATE) if(beaker) - SSexplosions.high_mov_atom += beaker + EX_ACT(beaker, EXPLODE_DEVASTATE) if(bottle) - SSexplosions.high_mov_atom += bottle + EX_ACT(bottle, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) if(beaker) - SSexplosions.med_mov_atom += beaker + EX_ACT(beaker, EXPLODE_HEAVY) if(bottle) - SSexplosions.med_mov_atom += bottle + EX_ACT(bottle, EXPLODE_HEAVY) if(EXPLODE_LIGHT) if(beaker) - SSexplosions.low_mov_atom += beaker + EX_ACT(beaker, EXPLODE_LIGHT) if(bottle) - SSexplosions.low_mov_atom += bottle + EX_ACT(bottle, EXPLODE_LIGHT) /obj/machinery/chem_master/handle_atom_del(atom/A) ..() @@ -143,7 +143,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_SILICON_REACH)) return replace_beaker(user) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -221,7 +221,7 @@ /obj/machinery/chem_master/ui_data(mob/user) var/list/data = list() data["isBeakerLoaded"] = beaker ? 1 : 0 - data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, 0.01) : null + data["beakerCurrentVolume"] = beaker ? round(beaker.reagents.total_volume, CHEMICAL_VOLUME_ROUNDING) : null data["beakerMaxVolume"] = beaker ? beaker.volume : null data["mode"] = mode data["condi"] = condi @@ -238,13 +238,13 @@ var/beaker_contents[0] if(beaker) for(var/datum/reagent/R in beaker.reagents.reagent_list) - beaker_contents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = round(R.volume, 0.01)))) // list in a list because Byond merges the first list... + beaker_contents.Add(list(list("name" = R.name, "id" = ckey(R.name), "volume" = round(R.volume, CHEMICAL_VOLUME_ROUNDING)))) // list in a list because Byond merges the first list... data["beakerContents"] = beaker_contents var/buffer_contents[0] if(reagents.total_volume) for(var/datum/reagent/N in reagents.reagent_list) - buffer_contents.Add(list(list("name" = N.name, "id" = ckey(N.name), "volume" = round(N.volume, 0.01)))) // ^ + buffer_contents.Add(list(list("name" = N.name, "id" = ckey(N.name), "volume" = round(N.volume, CHEMICAL_VOLUME_ROUNDING)))) // ^ data["bufferContents"] = buffer_contents //Calculated once since it'll never change @@ -325,9 +325,9 @@ var/amount = text2num(params["amount"]) if(amount == null) amount = text2num(input(usr, - "Max 10. Buffer content will be split evenly.", + "Max 20. Buffer content will be split evenly.", "How many to make?", 1)) - amount = clamp(round(amount), 0, 10) + amount = clamp(round(amount), 0, 20) if (amount <= 0) return FALSE // Get units per item @@ -383,7 +383,7 @@ "Name", name_default, MAX_NAME_LEN) - if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) + if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) return FALSE // Start filling if(item_type == "pill") @@ -468,7 +468,7 @@ state = "Gas" var/const/P = 3 //The number of seconds between life ticks var/T = initial(R.metabolization_rate) * (60 / P) - analyze_vars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold), "pH" = initial(R.ph)) + analyze_vars = list("name" = initial(R.name), "state" = state, "color" = initial(R.color), "description" = initial(R.description), "metaRate" = T, "overD" = initial(R.overdose_threshold)) screen = "analyze" return TRUE diff --git a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm index 76e4b0ce7d58..fd2c5824c45e 100644 --- a/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm +++ b/code/modules/reagents/chemistry/machinery/chem_recipe_debug.dm @@ -27,10 +27,8 @@ var/failed = 0 ///If we're forcing optimal conditions var/should_force_temp = FALSE - var/should_force_ph = FALSE ///Forced values var/force_temp = 300 - var/force_ph = 7 ///Multiplier of product var/vol_multiplier = 20 ///If we're reacting @@ -76,10 +74,10 @@ /obj/machinery/chem_recipe_debug/proc/setup_reactions() cached_reactions = list() if(process_all) - for(var/reaction in GLOB.chemical_reactions_list_reactant_index) - if(is_type_in_list(GLOB.chemical_reactions_list_reactant_index[reaction], cached_reactions)) + for(var/reaction in SSreagents.chemical_reactions_list_reactant_index) + if(is_type_in_list(SSreagents.chemical_reactions_list_reactant_index[reaction], cached_reactions)) continue - cached_reactions += GLOB.chemical_reactions_list_reactant_index[reaction] + cached_reactions += SSreagents.chemical_reactions_list_reactant_index[reaction] else cached_reactions = reaction_names reagents.clear_reagents() @@ -93,8 +91,6 @@ /obj/machinery/chem_recipe_debug/process(delta_time) if(processing == FALSE) setup_reactions() - if(should_force_ph) - reagents.ph = force_ph if(should_force_temp) reagents.chem_temp = force_temp if(reagents.is_reacting == TRUE) @@ -124,8 +120,7 @@ /obj/machinery/chem_recipe_debug/proc/relay_ended_reaction() if(reagents.reagent_list) - var/cached_purity - say("Reaction completed for [cached_reactions[index]] final temperature = [reagents.chem_temp], ph = [reagents.ph], time taken = [react_time]s.") + say("Reaction completed for [cached_reactions[index]] final temperature = [reagents.chem_temp], time taken = [react_time]s.") var/datum/chemical_reaction/reaction = cached_reactions[index] for(var/reagent_type in reaction.results) var/datum/reagent/reagent = reagents.get_reagent(reagent_type) @@ -140,20 +135,15 @@ problem_string += "[cached_reactions[index]] [span_warning("Unable to find product [reagent_type] in holder after reaction! Trying alternative setup. index:[index]")]\n" failed++ return - say("Reaction has a product [reagent_type] [reagent.volume]u purity of [reagent.purity]") - if(reagent.purity < 0.9) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [reagent.volume]u [span_boldwarning("purity of [reagent.purity]")] index:[index]\n" - majorImpurity++ - else if (reagent.purity < 1) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [reagent.volume]u [span_warning("purity of [reagent.purity]")] index:[index]\n" - minorImpurity++ + say("Reaction has a product [reagent_type] [reagent.volume]u") + if(reagent.volume < reaction.results[reagent_type]) - impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [span_warning("[reagent.volume]u")] purity of [reagent.purity] index:[index]\n" - cached_purity = reagent.purity + impure_string += "Reaction [cached_reactions[index]] has a product [reagent_type] [span_warning("[reagent.volume]u")] index:[index]\n" + if(beaker_spawn && reagents.total_volume) var/obj/item/reagent_containers/glass/beaker/bluespace/beaker = new /obj/item/reagent_containers/glass/beaker/bluespace(loc) reagents.trans_to(beaker) - beaker.name = "[cached_reactions[index]] purity: [cached_purity]" + beaker.name = "[cached_reactions[index]]" reagents.clear_reagents() reagents.chem_temp = 300 index++ @@ -179,9 +169,6 @@ if(should_force_temp && !min_temp) say("Using forced temperatures.") reagents.chem_temp = force_temp ? force_temp : reaction.optimal_temp - if(should_force_ph) - say("Using forced pH.") - reagents.ph = force_ph ? force_ph : (reaction.optimal_ph_max + reaction.optimal_ph_min)/2 if(failed == 0 && !should_force_temp) reagents.chem_temp = reaction.optimal_temp if(failed == 1 && !should_force_temp) @@ -190,19 +177,16 @@ if(min_temp) say("Overriding temperature to required temp.") reagents.chem_temp = reaction.is_cold_recipe ? reaction.required_temp - 1 : reaction.required_temp + 1 - say("Reacting [span_nicegreen("[cached_reactions[index]]")] starting pH: [reagents.ph] index [index] of [cached_reactions.len]") + say("Reacting [span_nicegreen("[cached_reactions[index]]")] index [index] of [cached_reactions.len]") /obj/machinery/chem_recipe_debug/ui_data(mob/user) var/data = list() data["targetTemp"] = force_temp - data["targatpH"] = force_ph data["isActive"] = reagents.is_reacting - data["forcepH"] = should_force_ph data["forceTemp"] = should_force_temp data["targetVol"] = vol_multiplier data["processAll"] = process_all data["currentTemp"] = reagents.chem_temp - data["currentpH"] = round(reagents.ph, 0.01) data["processing"] = processing data["index"] = index data["endIndex"] = cached_reactions.len @@ -213,7 +197,7 @@ var/list/beaker_contents = list() for(var/datum/reagent/reagent as anything in reagents.reagent_list) beaker_contents.len++ - beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, 0.01), "purity" = round(reagent.purity)) + beaker_contents[length(beaker_contents)] = list("name" = reagent.name, "volume" = round(reagent.volume, CHEMICAL_VOLUME_ROUNDING)) data["chamberContents"] = beaker_contents var/list/queued_reactions = list() @@ -224,7 +208,6 @@ data["queuedReactions"] = queued_reactions var/list/active_reactions = list() - var/flashing = DISABLE_FLASHING //for use with alertAfter - since there is no alertBefore, I set the after to 0 if true, or to the max value if false for(var/datum/equilibrium/equilibrium as anything in reagents.reaction_list) if(!length(reagents.reaction_list))//I'm not sure why when it explodes it causes the gui to fail (it's missing danger (?) ) stack_trace("Chem debug managed to find an equilibrium in a location where there should be none (skipping this entry and continuing). This is usually because of an ill timed explosion.") @@ -236,13 +219,6 @@ continue var/overheat = FALSE var/danger = FALSE - var/purity_alert = 2 //same as flashing - if(reagent.purity < equilibrium.reaction.purity_min) - purity_alert = ENABLE_FLASHING//Because 0 is seen as null - danger = TRUE - if(flashing != ENABLE_FLASHING)//So that the pH meter flashes for ANY reactions out of optimal - if(equilibrium.reaction.optimal_ph_min > reagents.ph || equilibrium.reaction.optimal_ph_max < reagents.ph) - flashing = ENABLE_FLASHING if(equilibrium.reaction.is_cold_recipe) if(equilibrium.reaction.overheat_temp > reagents.chem_temp && equilibrium.reaction.overheat_temp != NO_OVERHEAT) danger = TRUE @@ -256,12 +232,10 @@ if(entry["name"] == reagent.name) //If we have multiple reaction methods for the same result - combine them entry["reactedVol"] = equilibrium.reacted_vol entry["targetVol"] = round(equilibrium.target_vol, 1)//Use the first result reagent to name the reaction detected - entry["quality"] = (entry["quality"] + equilibrium.reaction_quality) /2 continue active_reactions.len++ - active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "purityAlert" = purity_alert, "quality" = equilibrium.reaction_quality, "overheat" = overheat, "inverse" = reagent.inverse_chem_val, "minPure" = equilibrium.reaction.purity_min, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected + active_reactions[length(active_reactions)] = list("name" = reagent.name, "danger" = danger, "overheat" = overheat, "reactedVol" = equilibrium.reacted_vol, "targetVol" = round(equilibrium.target_vol, 1))//Use the first result reagent to name the reaction detected data["activeReactions"] = active_reactions - data["isFlashing"] = flashing if(edit_recipe) data["editRecipeName"] = edit_recipe.type @@ -270,15 +244,9 @@ list("name" = "required_temp" , "var" = edit_recipe.required_temp), list("name" = "optimal_temp" , "var" = edit_recipe.optimal_temp), list("name" = "overheat_temp" , "var" = edit_recipe.overheat_temp), - list("name" = "optimal_ph_min" , "var" = edit_recipe.optimal_ph_min), - list("name" = "optimal_ph_max" , "var" = edit_recipe.optimal_ph_max), - list("name" = "determin_ph_range" , "var" = edit_recipe.determin_ph_range), list("name" = "temp_exponent_factor" , "var" = edit_recipe.temp_exponent_factor), - list("name" = "ph_exponent_factor" , "var" = edit_recipe.ph_exponent_factor), list("name" = "thermic_constant" , "var" = edit_recipe.thermic_constant), - list("name" = "H_ion_release" , "var" = edit_recipe.H_ion_release), list("name" = "rate_up_lim" , "var" = edit_recipe.rate_up_lim), - list("name" = "purity_min" , "var" = edit_recipe.purity_min), ) return data @@ -297,19 +265,9 @@ . = TRUE if(.) force_temp = clamp(target, 0, 1000) - if("pH") - var/target = params["target"] - if(text2num(target) != null) - target = text2num(target) - . = TRUE - if(.) - force_ph = target if("forceTemp") should_force_temp = ! should_force_temp . = TRUE - if("forcepH") - should_force_ph = ! should_force_ph - . = TRUE if("react") react = TRUE return TRUE @@ -330,7 +288,7 @@ if(!reagent) say("Could not find [name]") continue - var/datum/chemical_reaction/reaction = GLOB.chemical_reactions_list_product_index[reagent.type] + var/datum/chemical_reaction/reaction = SSreagents.chemical_reactions_list_product_index[reagent.type] if(!reaction) say("Could not find [name] reaction!") continue @@ -364,7 +322,7 @@ if(!reagent) say("Could not find [name]") return - var/datum/chemical_reaction/reaction = GLOB.chemical_reactions_list_product_index[reagent.type] + var/datum/chemical_reaction/reaction = SSreagents.chemical_reactions_list_product_index[reagent.type] if(!reaction) say("Could not find [name] reaction!") return @@ -378,15 +336,9 @@ required_temp = [edit_recipe.required_temp] optimal_temp = [edit_recipe.optimal_temp] overheat_temp = [edit_recipe.overheat_temp] -optimal_ph_min = [edit_recipe.optimal_ph_min] -optimal_ph_max = [edit_recipe.optimal_ph_max] -determin_ph_range = [edit_recipe.determin_ph_range] temp_exponent_factor = [edit_recipe.temp_exponent_factor] -ph_exponent_factor = [edit_recipe.ph_exponent_factor] thermic_constant = [edit_recipe.thermic_constant] -H_ion_release = [edit_recipe.H_ion_release] -rate_up_lim = [edit_recipe.rate_up_lim] -purity_min = [edit_recipe.purity_min]"} +rate_up_lim = [edit_recipe.rate_up_lim]"} say(export) text2file(export, "[GLOB.log_directory]/chem_parse.txt") diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm index aad8df3c1561..b27c000e0e05 100644 --- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm +++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm @@ -11,8 +11,6 @@ var/static/list/shortcuts = list( "meth" = /datum/reagent/drug/methamphetamine ) - ///The purity of the created reagent in % (purity uses 0-1 values) - var/purity = 100 /obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -41,7 +39,7 @@ return else if(!beaker.reagents && !QDELETED(beaker)) beaker.create_reagents(beaker.volume) - beaker.reagents.add_reagent(input_reagent, amount, added_purity = (purity/100)) + beaker.reagents.add_reagent(input_reagent, amount) if("makecup") if(beaker) return @@ -51,24 +49,15 @@ var/input = text2num(params["amount"]) if(input) amount = input - if("purity") - var/input = text2num(params["amount"]) - if(input) - purity = input update_appearance() /obj/machinery/chem_dispenser/chem_synthesizer/Destroy() QDEL_NULL(beaker) return ..() -/obj/machinery/chem_dispenser/chem_synthesizer/ui_data(mob/user) - . = ..() - .["purity"] = purity - return . - /obj/machinery/chem_dispenser/chem_synthesizer/proc/find_reagent(input) . = FALSE - if(GLOB.chemical_reagents_list[input]) //prefer IDs! + if(SSreagents.chemical_reagents_list[input]) //prefer IDs! return input else return get_chem_id(input) diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm index b9f6f45c6b83..eb1d5491ba20 100644 --- a/code/modules/reagents/chemistry/machinery/pandemic.dm +++ b/code/modules/reagents/chemistry/machinery/pandemic.dm @@ -39,7 +39,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_SILICON_REACH)) return eject_beaker() return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -164,7 +164,7 @@ if(beaker) data["has_beaker"] = TRUE data["beaker"] = list( - "volume" = round(beaker.reagents?.total_volume, 0.01) || 0, + "volume" = round(beaker.reagents?.total_volume, CHEMICAL_VOLUME_ROUNDING) || 0, "capacity" = beaker.volume, ) var/datum/reagent/blood/B = locate() in beaker.reagents.reagent_list diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index ff6df25cd610..612ff552929a 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -58,11 +58,11 @@ switch(severity) if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += beaker + EX_ACT(beaker, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += beaker + EX_ACT(beaker, EXPLODE_HEAVY) if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += beaker + EX_ACT(beaker, EXPLODE_LIGHT) /obj/machinery/reagentgrinder/RefreshParts() . = ..() @@ -99,7 +99,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - if(!can_interact(user) || !user.canUseTopic(src, !issilicon(user), FALSE, NO_TK)) + if(!can_interact(user) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_SILICON_REACH)) return if(operating) return diff --git a/code/modules/reagents/chemistry/machinery/smoke_machine.dm b/code/modules/reagents/chemistry/machinery/smoke_machine.dm index e7a62c7c2dfe..024d6437c287 100644 --- a/code/modules/reagents/chemistry/machinery/smoke_machine.dm +++ b/code/modules/reagents/chemistry/machinery/smoke_machine.dm @@ -10,7 +10,7 @@ circuit = /obj/item/circuitboard/machine/smoke_machine processing_flags = NONE - var/efficiency = 10 + var/efficiency = 20 var/on = FALSE var/cooldown = 0 var/screen = "home" @@ -18,23 +18,24 @@ var/setting = 1 // displayed range is 3 * setting var/max_range = 3 // displayed max range is 3 * max range -/datum/effect_system/smoke_spread/chem/smoke_machine/set_up(datum/reagents/carry, setting=1, efficiency=10, loc, silent=FALSE) - amount = setting - carry.copy_to(chemholder, 20) - carry.remove_any(amount * 16 / efficiency) - location = loc +/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/set_up(range = 1, amount = DIAMOND_AREA(range), atom/holder, atom/location = null, datum/reagents/carry = null, efficiency = 10, silent=FALSE) + src.holder = holder + src.location = get_turf(location) + src.amount = amount + carry?.copy_to(chemholder, 20) + carry?.remove_all(amount / efficiency) -/datum/effect_system/smoke_spread/chem/smoke_machine - effect_type = /obj/effect/particle_effect/smoke/chem/smoke_machine +/datum/effect_system/fluid_spread/smoke/chem/smoke_machine + effect_type = /obj/effect/particle_effect/fluid/smoke/chem/smoke_machine -/obj/effect/particle_effect/smoke/chem/smoke_machine - opaque = FALSE +/obj/effect/particle_effect/fluid/smoke/chem/smoke_machine + opacity = FALSE alpha = 100 /obj/machinery/smoke_machine/Initialize(mapload) . = ..() create_reagents(REAGENTS_BASE_VOLUME) - AddComponent(/datum/component/plumbing/simple_demand) + for(var/obj/item/stock_parts/matter_bin/B in component_parts) reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating if(is_operational) @@ -53,18 +54,26 @@ var/new_volume = REAGENTS_BASE_VOLUME for(var/obj/item/stock_parts/matter_bin/B in component_parts) new_volume += REAGENTS_BASE_VOLUME * B.rating + if(!reagents) create_reagents(new_volume) + reagents.maximum_volume = new_volume + if(new_volume < reagents.total_volume) reagents.expose(loc, TOUCH) // if someone manages to downgrade it without deconstructing reagents.clear_reagents() - efficiency = 9 + + efficiency = 18 + for(var/obj/item/stock_parts/capacitor/C in component_parts) - efficiency += C.rating + efficiency += 2 * C.rating + max_range = 1 + for(var/obj/item/stock_parts/manipulator/M in component_parts) max_range += M.rating + max_range = max(3, max_range) /obj/machinery/smoke_machine/on_set_is_operational(old_value) @@ -80,12 +89,12 @@ on = FALSE update_appearance() return - var/turf/T = get_turf(src) - var/smoke_test = locate(/obj/effect/particle_effect/smoke) in T + var/turf/location = get_turf(src) + var/smoke_test = locate(/obj/effect/particle_effect/fluid/smoke) in location if(on && !smoke_test) update_appearance() - var/datum/effect_system/smoke_spread/chem/smoke_machine/smoke = new() - smoke.set_up(reagents, setting*3, efficiency, T) + var/datum/effect_system/fluid_spread/smoke/chem/smoke_machine/smoke = new() + smoke.set_up(setting * 3, location = location, carry = reagents, efficiency = efficiency) smoke.start() use_power(active_power_usage) @@ -97,7 +106,7 @@ return FALSE /obj/machinery/smoke_machine/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) + I.leave_evidence(user, src) if(istype(I, /obj/item/reagent_containers) && I.is_open_container()) var/obj/item/reagent_containers/RC = I var/units = RC.reagents.trans_to(src, RC.amount_per_transfer_from_this, transfered_by = user) diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 4bd03b873ad6..07ac1dd5183e 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -1,5 +1,3 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) /proc/build_name2reagent() @@ -20,6 +18,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/name = "" /// nor do they have descriptions var/description = "" + /// Text to insert into the "mechanics" section of the codex. + var/codex_mechanics = "" ///J/(K*mol) var/specific_heat = SPECIFIC_HEAT_DEFAULT /// used by taste messages @@ -30,6 +30,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/glass_name = "glass of ...what?" /// desc applied to glasses with this reagent var/glass_desc = "You can't really tell what this is." + /// Icon for the... glass. + var/glass_icon = 'icons/obj/drinks.dmi' /// Otherwise just sets the icon to a normal glass with the mixture of the reagents in the glass. var/glass_icon_state = null /// used for shot glasses, mostly for alcohol @@ -46,20 +48,18 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/current_cycle = 0 ///pretend this is moles var/volume = 0 - /// pH of the reagent - var/ph = 7 - ///Purity of the reagent - for use with internal reaction mechanics only. Use below (creation_purity) if you're writing purity effects into a reagent's use mechanics. - var/purity = 1 - ///the purity of the reagent on creation (i.e. when it's added to a mob and it's purity split it into 2 chems; the purity of the resultant chems are kept as 1, this tracks what the purity was before that) - var/creation_purity = 1 ///The molar mass of the reagent - if you're adding a reagent that doesn't have a recipe, just add a random number between 10 - 800. Higher numbers are "harder" but it's mostly arbitary. var/mass /// color it looks in containers etc var/color = "#000000" // rgb: 0, 0, 0 + ///how fast the reagent is metabolized by the mob - var/metabolization_rate = REAGENTS_METABOLISM - /// appears unused - var/overrides_metab = 0 + var/metabolization_rate = 0.2 + /// How fast the reagent metabolizes on touch + var/touch_met = 0.01 + /// How fast the reagent metabolizes when ingested. NOTE: Due to how reagents are coded, if you have an on_metabolize() for blood, this MUST be greater than metabolization_rate. + var/ingest_met = 1 + /// above this overdoses happen var/overdose_threshold = 0 /// You fucked up and this is now triggering its overdose effects, purge that shit quick. @@ -74,28 +74,29 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) var/harmful = FALSE /// Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New() var/datum/material/material - ///A list of causes why this chem should skip being removed, if the length is 0 it will be removed from holder naturally, if this is >0 it will not be removed from the holder. - var/list/reagent_removal_skip_list = list() ///The set of exposure methods this penetrates skin with. var/penetrates_skin = VAPOR /// See fermi_readme.dm REAGENT_DEAD_PROCESS, REAGENT_DONOTSPLIT, REAGENT_INVISIBLE, REAGENT_SNEAKYNAME, REAGENT_SPLITRETAINVOL, REAGENT_CANSYNTH, REAGENT_IMPURE var/chemical_flags = NONE - /// If the impurity is below 0.5, replace ALL of the chem with inverse_chem upon metabolising - var/inverse_chem_val = 0.25 - /// What chem is metabolised when purity is below inverse_chem_val - var/inverse_chem = /datum/reagent/inverse - ///what chem is made at the end of a reaction IF the purity is below the recipies purity_min at the END of a reaction only + + /// Does this reagent and its recipe appear in the Codex? + var/show_in_codex = TRUE + ///Thermodynamic vars ///How hot this reagent burns when it's on fire - null means it can't burn var/burning_temperature = null ///How much is consumed when it is burnt per second var/burning_volume = 0.5 + ///Assoc list with key type of addiction this reagent feeds, and value amount of addiction points added per unit of reagent metabolzied (which means * REAGENTS_METABOLISM every life()) var/list/addiction_types = null + ///The amount a robot will pay for a glass of this (20 units but can be higher if you pour more, be frugal!) var/glass_price - ///The closest abstract type this reagent belongs to. Used to detect creation of abstract chemicals. - var/abstract_type = /datum/reagent + /// Cargo value per unit + var/value = 0 + //The closest abstract type this reagent belongs to. Used to detect creation of abstract chemicals. + abstract_type = /datum/reagent /datum/reagent/New() @@ -108,54 +109,90 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) AddElement(/datum/element/venue_price, glass_price) if(!mass) mass = rand(10, 800) - if(abstract_type == type)//Are we trying to instantiate an abstract reagent? - stack_trace("ATTEMPTED TO CREATE ABSTRACT REAGENT!") + if(isabstract(src))//Are we trying to instantiate an abstract reagent? + CRASH("Attempted to create abstract reagent [type]") /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references . = ..() holder = null -/// Applies this reagent to an [/atom] -/datum/reagent/proc/expose_atom(atom/exposed_atom, reac_volume, exposed_temperature) - SHOULD_CALL_PARENT(TRUE) - - . = 0 - . |= SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_ATOM, exposed_atom, reac_volume, exposed_temperature) - . |= SEND_SIGNAL(exposed_atom, COMSIG_ATOM_EXPOSE_REAGENT, src, reac_volume, exposed_temperature) - -/// Applies this reagent to a [/mob/living] -/datum/reagent/proc/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0, exposed_temperature) - SHOULD_CALL_PARENT(TRUE) - - . = SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_MOB, exposed_mob, methods, reac_volume, show_message, touch_protection, exposed_temperature) - if((methods & penetrates_skin) && exposed_mob.reagents) //smoke, foam, spray - var/amount = round(reac_volume*clamp((1 - touch_protection), 0, 1), 0.1) - if(amount >= 0.5) - exposed_mob.reagents.add_reagent(type, amount, added_purity = purity) +///Called whenever a reagent is on fire, or is in a holder that is on fire. (WIP) +/datum/reagent/proc/burn(datum/reagents/holder) + return -/// Applies this reagent to an [/obj] -/datum/reagent/proc/expose_obj(obj/exposed_obj, reac_volume) - SHOULD_CALL_PARENT(TRUE) +/// Called from [/datum/reagents/proc/metabolize] +/datum/reagent/proc/on_mob_life(mob/living/carbon/M, location, do_addiction) + SHOULD_NOT_OVERRIDE(TRUE) + SHOULD_NOT_SLEEP(TRUE) - return SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_OBJ, exposed_obj, reac_volume) + current_cycle++ + var/removed = metabolization_rate + if(ingest_met && (location == CHEM_INGEST)) + removed = ingest_met + if(touch_met && (location == CHEM_TOUCH)) + removed = touch_met + + removed *= M.metabolism_efficiency + removed = min(removed, volume) + + if(do_addiction && length(addiction_types)) + for(var/addiction in addiction_types) + M.mind?.add_addiction_points(addiction, addiction_types[addiction] * removed) + + //adjust effective amounts - removed, dose, and max_dose - for mob size + var/effective = removed + if(!(chemical_flags & REAGENT_IGNORE_MOB_SIZE) && location != CHEM_TOUCH) + effective *= (MOB_SIZE_HUMAN/M.mob_size) + + var/remove_from_holder = FALSE + if(effective >= (metabolization_rate * 0.1) || effective >= 0.1) + switch(location) + if(CHEM_BLOOD) + if(type == M.dna?.species.exotic_blood) + M.adjustBloodVolumeUpTo(round(volume, 0.1), BLOOD_VOLUME_MAXIMUM) + holder.del_reagent(type) + return + else + . = affect_blood(M, effective) + remove_from_holder = TRUE + + if(CHEM_TOUCH) + . = affect_touch(M, effective) + remove_from_holder = TRUE + + if(CHEM_INGEST) + if(type == M.dna?.species.exotic_blood) + M.adjustBloodVolumeUpTo(round(volume / 5, 0.1), BLOOD_VOLUME_MAXIMUM) + holder.del_reagent(type) + return + else + . = affect_ingest(M, effective) + // Thanos snap a small portion of what we processed. + // This is only after transfering to Blood because we're nice :) + holder?.remove_reagent(type, ingest_met * 0.2) + + if(remove_from_holder) + // Holder can go null if we're removed from our container during processing. + holder?.remove_reagent(type, removed) + +/datum/reagent/proc/affect_blood(mob/living/carbon/C, removed) + SHOULD_NOT_SLEEP(TRUE) + return -/// Applies this reagent to a [/turf] -/datum/reagent/proc/expose_turf(turf/exposed_turf, reac_volume) +/// Ingestion process. Call parent *after* your override's body, as holder can go null as a result of trans_id_to. +/datum/reagent/proc/affect_ingest(mob/living/carbon/C, removed) + SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) - return SEND_SIGNAL(src, COMSIG_REAGENT_EXPOSE_TURF, exposed_turf, reac_volume) + // Annoys the living hell out of me, but this ensures nothing outright breaks and causes + // constant metabolism start/stop. + holder.trans_id_to(C.bloodstream, src, max(ingest_met, metabolization_rate + 0.01), TRUE) -///Called whenever a reagent is on fire, or is in a holder that is on fire. (WIP) -/datum/reagent/proc/burn(datum/reagents/holder) +/// Touch process. Don't get covered in acid, now! +/datum/reagent/proc/affect_touch(mob/living/carbon/C, removed) + SHOULD_NOT_SLEEP(TRUE) return -/// Called from [/datum/reagents/proc/metabolize] -/datum/reagent/proc/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - current_cycle++ - if(length(reagent_removal_skip_list)) - return - holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency * delta_time) //By default it slowly disappears. - /* Used to run functions before a reagent is transfered. Returning TRUE will block the transfer attempt. Primarily used in reagents/reaction_agents @@ -168,34 +205,23 @@ Primarily used in reagents/reaction_agents return /// Called when this reagent is first added to a mob -/datum/reagent/proc/on_mob_add(mob/living/L, amount) - overdose_threshold /= max(normalise_creation_purity(), 1) //Maybe??? Seems like it would help pure chems be even better but, if I normalised this to 1, then everything would take a 25% reduction +/datum/reagent/proc/on_mob_add(mob/living/carbon/C, amount, class) + SHOULD_NOT_SLEEP(TRUE) return /// Called when this reagent is removed while inside a mob -/datum/reagent/proc/on_mob_delete(mob/living/L) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "[type]_overdose") +/datum/reagent/proc/on_mob_delete(mob/living/carbon/C, class) + SHOULD_NOT_SLEEP(TRUE) return -/// Called when this reagent first starts being metabolized by a liver -/datum/reagent/proc/on_mob_metabolize(mob/living/L) +/// Called when this reagent first starts being metabolized. Does NOT get called during microdoses, such as when going from stomach to blood. +/datum/reagent/proc/on_mob_metabolize(mob/living/carbon/C, class) + SHOULD_NOT_SLEEP(TRUE) return /// Called when this reagent stops being metabolized by a liver -/datum/reagent/proc/on_mob_end_metabolize(mob/living/L) - return - -/// Called when a reagent is inside of a mob when they are dead -/datum/reagent/proc/on_mob_dead(mob/living/carbon/C, delta_time) - if(!(chemical_flags & REAGENT_DEAD_PROCESS)) - return - current_cycle++ - if(length(reagent_removal_skip_list)) - return - holder.remove_reagent(type, metabolization_rate * C.metabolism_efficiency * delta_time) - -/// Called by [/datum/reagents/proc/conditional_update_move] -/datum/reagent/proc/on_move(mob/M) +/datum/reagent/proc/on_mob_end_metabolize(mob/living/carbon/C, class) + SHOULD_NOT_SLEEP(TRUE) return /// Called after add_reagents creates a new reagent. @@ -207,18 +233,21 @@ Primarily used in reagents/reaction_agents /datum/reagent/proc/on_merge(data, amount) return -/// Called by [/datum/reagents/proc/conditional_update] -/datum/reagent/proc/on_update(atom/A) - return - /// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -/datum/reagent/proc/overdose_process(mob/living/M, delta_time, times_fired) - return +/datum/reagent/proc/overdose_process(mob/living/carbon/C) + SHOULD_NOT_SLEEP(TRUE) + APPLY_CHEM_EFFECT(C, CE_TOXIN, 1) + C.adjustToxLoss(0.2, FALSE) + return TRUE /// Called when an overdose starts -/datum/reagent/proc/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You feel like you took too much of [name]!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) +/datum/reagent/proc/overdose_start(mob/living/carbon/C) + SHOULD_NOT_SLEEP(TRUE) + return + +/// Called when an overdose ends +/datum/reagent/proc/overdose_end(mob/living/carbon/C) + SHOULD_NOT_SLEEP(TRUE) return /** @@ -234,21 +263,6 @@ Primarily used in reagents/reaction_agents /datum/reagent/proc/get_taste_description(mob/living/taster) return list("[taste_description]" = 1) -/** - * Used when you want the default reagents purity to be equal to the normal effects - * (i.e. if default purity is 0.75, and your reacted purity is 1, then it will return 1.33) - * - * Arguments - * * normalise_num_to - what number/purity value you're normalising to. If blank it will default to the compile value of purity for this chem - * * creation_purity - creation_purity override, if desired. This is the purity of the reagent that you're normalising from. - */ -/datum/reagent/proc/normalise_creation_purity(normalise_num_to, creation_purity) - if(!normalise_num_to) - normalise_num_to = initial(purity) - if(!creation_purity) - creation_purity = src.creation_purity - return creation_purity / normalise_num_to - /proc/pretty_string_from_reagent_list(list/reagent_list) //Convert reagent list to a printable string for logging etc var/list/rs = list() diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index d95ca9e432b3..33329eddd94d 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -7,16 +7,26 @@ ////////////// /datum/reagent/consumable/ethanol - name = "Ethanol" + name = "Ethanol" //Parent class for all alcoholic reagents. description = "A well-known alcohol with a variety of applications." - color = "#404030" // rgb: 64, 64, 48 - nutriment_factor = 0 - taste_description = "alcohol" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - ph = 7.33 + taste_description = "pure alcohol" + reagent_state = LIQUID + color = "#404030" + + touch_met = 5 + ingest_met = 0.2 burning_temperature = 2193//ethanol burns at 1970C (at it's peak) burning_volume = 0.1 var/boozepwr = 65 //Higher numbers equal higher hardness, higher hardness equals more intense alcohol poisoning + var/toxicity = 1 + + var/druggy = 0 + var/adj_temp = 0 + var/targ_temp = 310 + + glass_name = "ethanol" + glass_desc = "A well-known alcohol with a variety of applications." + value = DISPENSER_REAGENT_VALUE /* Boozepwr Chart @@ -41,26 +51,53 @@ All effects don't start immediately, but rather get worse over time; the rate is addiction_types = list(/datum/addiction/alcohol = 0.05 * boozepwr) return ..() -/datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.get_drunk_amount() < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER || boozepwr < 0) +/datum/reagent/consumable/ethanol/affect_ingest(mob/living/carbon/C, removed) + if(C.get_drunk_amount() < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER || boozepwr < 0) var/booze_power = boozepwr - if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker + if(HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker booze_power *= 0.7 - if(HAS_TRAIT(drinker, TRAIT_LIGHT_DRINKER)) + if(HAS_TRAIT(C, TRAIT_LIGHT_DRINKER)) booze_power *= 2 // Volume, power, and server alcohol rate effect how quickly one gets drunk - drinker.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE * REM * delta_time) - if(boozepwr > 0) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) - if (istype(liver)) - liver.applyOrganDamage(((max(sqrt(volume) * (boozepwr ** ALCOHOL_EXPONENT) * liver.alcohol_tolerance * delta_time, 0))/150)) - return ..() + C.adjust_drunk_effect(sqrt(volume) * booze_power * ALCOHOL_RATE) + + C.adjust_nutrition(nutriment_factor * removed) + + APPLY_CHEM_EFFECT(C, CE_ALCOHOL, 1) + var/effective_dose = boozepwr * (1 + volume/60) //drinking a LOT will make you go down faster + + if(effective_dose >= 50) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 900/boozepwr) + + if(effective_dose >= 75) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 900/boozepwr) + + if(effective_dose >= 100) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 900/boozepwr) + + if(effective_dose >= 125) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 900/boozepwr) + + if(effective_dose >= 150) + APPLY_CHEM_EFFECT(C, CE_ALCOHOL_TOXIC, toxicity) + + if(druggy) + C.set_drugginess_if_lower(30 SECONDS) + + if(adj_temp > 0 && C.bodytemperature < targ_temp) // 310 is the normal bodytemp. 310.055 + C.bodytemperature = min(targ_temp, C.bodytemperature + (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) + if(adj_temp < 0 && C.bodytemperature > targ_temp) + C.bodytemperature = min(targ_temp, C.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) + + ..() /datum/reagent/consumable/ethanol/expose_obj(obj/exposed_obj, reac_volume) + . = ..() if(istype(exposed_obj, /obj/item/paper)) var/obj/item/paper/paperaffected = exposed_obj paperaffected.clearpaper() to_chat(usr, span_notice("[paperaffected]'s ink washes away.")) + if(istype(exposed_obj, /obj/item/book)) if(reac_volume >= 5) var/obj/item/book/affectedbook = exposed_obj @@ -68,25 +105,15 @@ All effects don't start immediately, but rather get worse over time; the rate is exposed_obj.visible_message(span_notice("[exposed_obj]'s writing is washed away by [name]!")) else exposed_obj.visible_message(span_warning("[exposed_obj]'s ink is smeared by [name], but doesn't wash away!")) - return ..() -/datum/reagent/consumable/ethanol/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with ethanol isn't quite as good as fuel. + +/datum/reagent/consumable/ethanol/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - if(!(methods & (TOUCH|VAPOR|PATCH))) + if(!(methods & (TOUCH|VAPOR))) return exposed_mob.adjust_fire_stacks(reac_volume / 15) - if(!iscarbon(exposed_mob)) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - var/power_multiplier = boozepwr / 65 // Weak alcohol has less sterilizing power - - for(var/s in exposed_carbon.surgeries) - var/datum/surgery/surgery = s - surgery.speed_modifier = max(0.1*power_multiplier, surgery.speed_modifier) - /datum/reagent/consumable/ethanol/beer name = "Beer" description = "An alcoholic beverage brewed since ancient times on Old Earth. Still popular today." @@ -97,8 +124,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "beerglass" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + fallback_icon_state = "beer" glass_price = DRINK_PRICE_STOCK @@ -117,8 +143,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "dish water" glass_name = "glass of light beer" glass_desc = "A freezing pint of watery light beer." - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + fallback_icon_state = "beer" /datum/reagent/consumable/ethanol/beer/maltliquor @@ -128,8 +153,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "sweet corn beer and the hood life" glass_name = "glass of malt liquor" glass_desc = "A freezing pint of malt liquor." - ph = 4.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/beer/green name = "Green Beer" @@ -139,17 +163,25 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "greenbeerglass" glass_name = "glass of green beer" glass_desc = "A freezing pint of green beer. Festive." - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.color != color) - drinker.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) +/datum/reagent/consumable/ethanol/beer/green/affect_blood(mob/living/carbon/C, removed) + if(C.color != color) + C.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) + +/datum/reagent/consumable/ethanol/beer/green/affect_ingest(mob/living/carbon/C, removed) + if(C.color != color) + C.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) return ..() -/datum/reagent/consumable/ethanol/beer/green/on_mob_end_metabolize(mob/living/drinker) - drinker.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) +/datum/reagent/consumable/ethanol/beer/green/affect_touch(mob/living/carbon/C, removed) + if(C.color != color) + C.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) + +/datum/reagent/consumable/ethanol/beer/green/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return + C.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) /datum/reagent/consumable/ethanol/kahlua name = "Kahlua" @@ -160,17 +192,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of RR coffee liquor" glass_desc = "DAMN, THIS THING LOOKS ROBUST!" shot_glass_icon_state = "shotglasscream" - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/kahlua/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.adjust_drowsyness(-3 * REM * delta_time) - drinker.AdjustSleeping(-40 * REM * delta_time) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - . = TRUE + + +/datum/reagent/consumable/ethanol/kahlua/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(10 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.adjust_drowsyness(-3 * removed) + C.AdjustSleeping(-40 * removed) + if(!HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + return ..() /datum/reagent/consumable/ethanol/whiskey name = "Whiskey" @@ -182,8 +212,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of whiskey" glass_desc = "The silky, smokey whiskey goodness inside the glass makes the drink look very classy." shot_glass_icon_state = "shotglassbrown" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/whiskey/kong @@ -193,7 +222,7 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "the grip of a giant ape" glass_name = "glass of Kong" glass_desc = "Makes You Go Ape!®" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/whiskey/candycorn @@ -204,77 +233,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of candy corn liquor" glass_desc = "Good for your Imagination." var/hal_amt = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/whiskey/candycorn/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(DT_PROB(5, delta_time)) - drinker.hallucination += hal_amt //conscious dreamers can be treasurers to their own currency - ..() - -/datum/reagent/consumable/ethanol/thirteenloko - name = "Thirteen Loko" - description = "A potent mixture of caffeine and alcohol." - color = "#102000" // rgb: 16, 32, 0 - nutriment_factor = 1 * REAGENTS_METABOLISM - boozepwr = 80 - quality = DRINK_GOOD - overdose_threshold = 60 - taste_description = "jitters and death" - glass_icon_state = "thirteen_loko_glass" - glass_name = "glass of Thirteen Loko" - glass_desc = "This is a glass of Thirteen Loko, it appears to be of the highest quality. The drink, not the glass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/thirteenloko/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_drowsyness(-7 * REM * delta_time) - drinker.AdjustSleeping(-40 * REM * delta_time) - drinker.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, drinker.get_body_temp_normal()) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - return TRUE - -/datum/reagent/consumable/ethanol/thirteenloko/overdose_start(mob/living/drinker) - to_chat(drinker, span_userdanger("Your entire body violently jitters as you start to feel queasy. You really shouldn't have drank all of that [name]!")) - drinker.set_timed_status_effect(40 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - drinker.Stun(1.5 SECONDS) - -/datum/reagent/consumable/ethanol/thirteenloko/overdose_process(mob/living/drinker, delta_time, times_fired) - if(DT_PROB(3.5, delta_time) && iscarbon(drinker)) - var/obj/item/held_item = drinker.get_active_held_item() - if(held_item) - drinker.dropItemToGround(held_item) - to_chat(drinker, span_notice("Your hands jitter and you drop what you were holding!")) - drinker.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - - if(DT_PROB(3.5, delta_time)) - to_chat(drinker, span_notice("[pick("You have a really bad headache.", "Your eyes hurt.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) - - if(DT_PROB(2.5, delta_time) && iscarbon(drinker)) - var/obj/item/organ/eyes/eyes = drinker.getorganslot(ORGAN_SLOT_EYES) - if(drinker.is_blind()) - if(istype(eyes)) - eyes.Remove(drinker) - eyes.forceMove(get_turf(drinker)) - to_chat(drinker, span_userdanger("You double over in pain as you feel your eyeballs liquify in your head!")) - drinker.emote("scream") - drinker.adjustBruteLoss(15) - else - to_chat(drinker, span_userdanger("You scream in terror as you go blind!")) - eyes.applyOrganDamage(eyes.maxHealth) - drinker.emote("scream") - - if(DT_PROB(1.5, delta_time) && iscarbon(drinker)) - drinker.visible_message(span_danger("[drinker] starts having a seizure!"), span_userdanger("You have a seizure!")) - drinker.Unconscious(10 SECONDS) - drinker.set_timed_status_effect(700 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - - if(DT_PROB(0.5, delta_time) && iscarbon(drinker)) - var/datum/disease/heart_attack = new /datum/disease/heart_failure - drinker.ForceContractDisease(heart_attack) - to_chat(drinker, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) - drinker.playsound_local(drinker, 'sound/effects/singlebeat.ogg', 100, 0) +/datum/reagent/consumable/ethanol/whiskey/candycorn/affect_ingest(mob/living/carbon/C, removed) + if(prob(10)) + C.hallucination += hal_amt //conscious dreamers can be treasurers to their own currency + return ..() /datum/reagent/consumable/ethanol/vodka name = "Vodka" description = "Number one drink AND fueling choice for Russians worldwide." @@ -285,8 +249,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vodka" glass_desc = "The glass contain wodka. Xynta." shot_glass_icon_state = "shotglassclear" - ph = 8.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS //Very high proof + chemical_flags = REAGENT_CLEANS //Very high proof /datum/reagent/consumable/ethanol/bilk name = "Bilk" @@ -298,13 +261,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "glass of bilk" glass_desc = "A brew of milk and beer. For those alcoholics who fear osteoporosis." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.getBruteLoss() && DT_PROB(5, delta_time)) - drinker.heal_bodypart_damage(brute = 1) - . = TRUE - return ..() || . /datum/reagent/consumable/ethanol/threemileisland name = "Three Mile Island Iced Tea" @@ -316,11 +273,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "threemileislandglass" glass_name = "Three Mile Island Ice Tea" glass_desc = "A glass of this is sure to prevent a meltdown." - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/threemileisland/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(100 SECONDS * REM * delta_time, /datum/status_effect/drugginess) + +/datum/reagent/consumable/ethanol/threemileisland/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(100 SECONDS * removed, /datum/status_effect/drugginess) return ..() /datum/reagent/consumable/ethanol/gin @@ -332,8 +288,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginvodkaglass" glass_name = "glass of gin" glass_desc = "A crystal clear glass of Griffeater gin." - ph = 6.9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/rum @@ -346,7 +301,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of rum" glass_desc = "Now you want to Pray for a pirate suit, don't you?" shot_glass_icon_state = "shotglassbrown" - ph = 6.5 /datum/reagent/consumable/ethanol/tequila name = "Tequila" @@ -358,8 +312,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of tequila" glass_desc = "Now all that's missing is the weird colored shades!" shot_glass_icon_state = "shotglassgold" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/vermouth @@ -372,8 +325,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of vermouth" glass_desc = "You wonder why you're even drinking this straight." shot_glass_icon_state = "shotglassclear" - ph = 3.25 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/wine name = "Wine" @@ -385,8 +337,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of wine" glass_desc = "A very classy looking drink." shot_glass_icon_state = "shotglassred" - ph = 3.45 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/wine/on_merge(data) @@ -402,17 +353,6 @@ All effects don't start immediately, but rather get worse over time; the rate is return list("synthetic wine"=1) return ..() -/datum/reagent/consumable/ethanol/lizardwine - name = "Unathi Wine" - description = "An alcoholic beverage from Space China, made by infusing unathi tails in ethanol." - color = "#7E4043" // rgb: 126, 64, 67 - boozepwr = 45 - quality = DRINK_FANTASTIC - taste_description = "scaley sweetness" - ph = 3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_STOCK - /datum/reagent/consumable/ethanol/grappa name = "Grappa" description = "A fine Italian brandy, for when regular wine just isn't alcoholic enough for you." @@ -422,8 +362,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grappa" glass_name = "glass of grappa" glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking." - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/amaretto @@ -436,7 +375,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of amaretto" glass_desc = "A sweet and syrupy looking drink." shot_glass_icon_state = "shotglassgold" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/cognac @@ -449,8 +388,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of cognac" glass_desc = "Damn, you feel like some kind of French aristocrat just by holding this." shot_glass_icon_state = "shotglassbrown" - ph = 3.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/absinthe @@ -463,12 +401,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of absinthe" glass_desc = "It's as strong as it smells." shot_glass_icon_state = "shotglassgreen" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/absinthe/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(DT_PROB(5, delta_time) && !HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.hallucination += 4 //Reference to the urban myth - ..() + +/datum/reagent/consumable/ethanol/absinthe/affect_ingest(mob/living/carbon/C, removed) + if(prob(10) && !HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) + C.hallucination += 4 //Reference to the urban myth + return ..() /datum/reagent/consumable/ethanol/hooch name = "Hooch" @@ -480,7 +418,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Hooch" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." addiction_types = list(/datum/addiction/alcohol = 5, /datum/addiction/maintenance_drugs = 2) - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/ale name = "Ale" @@ -491,8 +429,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aleglass" glass_name = "glass of ale" glass_desc = "A freezing pint of delicious Ale." - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/goldschlager @@ -506,31 +443,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of goldschlager" glass_desc = "100% proof that teen girls will drink anything with gold in it." shot_glass_icon_state = "shotglassgold" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - // This drink is really popular with a certain demographic. - var/teenage_girl_quality = DRINK_VERYGOOD -/datum/reagent/consumable/ethanol/goldschlager/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - // Reset quality each time, since the bottle can be shared - quality = initial(quality) - - if(ishuman(exposed_mob)) - var/mob/living/carbon/human/human = exposed_mob - // tgstation13 does not endorse underage drinking. laws may vary by your jurisdiction. - if(human.age >= 13 && human.age <= 19 && human.gender == FEMALE) - quality = teenage_girl_quality - - return ..() - -/datum/reagent/consumable/ethanol/goldschlager/on_transfer(atom/atom, methods = TOUCH, trans_volume) - if(!(methods & INGEST)) - return ..() - - var/convert_amount = trans_volume * min(GOLDSCHLAGER_GOLD_RATIO, 1) - atom.reagents.remove_reagent(/datum/reagent/consumable/ethanol/goldschlager, convert_amount) - atom.reagents.add_reagent(/datum/reagent/gold, convert_amount) - return ..() /datum/reagent/consumable/ethanol/patron name = "Patron" @@ -543,8 +456,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "glass of patron" glass_desc = "Drinking patron in the bar, with all the subpar ladies." shot_glass_icon_state = "shotglassclear" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH /datum/reagent/consumable/ethanol/gintonic @@ -557,8 +469,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gintonicglass" glass_name = "Gin and Tonic" glass_desc = "A mild but still great cocktail. Drink up, like a true Englishman." - ph = 3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/rum_coke @@ -571,8 +482,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "Rum and Coke" glass_desc = "The classic go-to of space-fratboys." - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/cuba_libre name = "Cuba Libre" @@ -584,17 +494,16 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "cubalibreglass" glass_name = "Cuba Libre" glass_desc = "A classic mix of rum, cola, and lime. A favorite of revolutionaries everywhere!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/cuba_libre/on_mob_life(mob/living/carbon/cubano, delta_time, times_fired) + +/datum/reagent/consumable/ethanol/cuba_libre/affect_ingest(mob/living/carbon/cubano, removed) if(cubano.mind && cubano.mind.has_antag_datum(/datum/antagonist/rev)) //Cuba Libre, the traditional drink of revolutions! Heals revolutionaries. - cubano.adjustBruteLoss(-1 * REM * delta_time, 0) - cubano.adjustFireLoss(-1 * REM * delta_time, 0) - cubano.adjustToxLoss(-1 * REM * delta_time, 0) - cubano.adjustOxyLoss(-5 * REM * delta_time, 0) + cubano.adjustBruteLoss(-0.25 * removed, 0) + cubano.adjustFireLoss(-0.25 * removed, 0) + cubano.adjustToxLoss(-0.25 * removed, 0) + cubano.adjustOxyLoss(-1 * removed, 0) . = TRUE return ..() || . - /datum/reagent/consumable/ethanol/whiskey_cola name = "Whiskey Cola" description = "Whiskey, mixed with cola. Surprisingly refreshing." @@ -605,7 +514,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeycolaglass" glass_name = "whiskey cola" glass_desc = "An innocent-looking mixture of cola and whiskey. Delicious." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/martini @@ -618,7 +527,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Classic Martini" glass_desc = "Damn, the bartender even stirred it, not shook it." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/vodkamartini @@ -631,7 +540,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "martiniglass" glass_name = "Vodka martini" glass_desc ="A bastardisation of the classic martini. Still great." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/white_russian name = "White Russian" @@ -643,7 +552,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiterussianglass" glass_name = "White Russian" glass_desc = "A very nice looking drink. But that's just, like, your opinion, man." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/screwdrivercocktail name = "Screwdriver" @@ -655,20 +564,21 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "screwdriverglass" glass_name = "Screwdriver" glass_desc = "A simple, yet superb mixture of Vodka and orange juice. Just the thing for the tired engineer." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) - if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) - ADD_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - if (HAS_TRAIT(drinker, TRAIT_IRRADIATED)) - drinker.adjustToxLoss(-2 * REM * delta_time) - return ..() +/datum/reagent/consumable/ethanol/screwdrivercocktail/affect_ingest(mob/living/carbon/C, removed) + . = ..() + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + if(HAS_TRAIT(liver, TRAIT_ENGINEER_METABOLISM)) + ADD_TRAIT(C, TRAIT_HALT_RADIATION_EFFECTS, CHEM_TRAIT_SOURCE(CHEM_INGEST)) + if (HAS_TRAIT(C, TRAIT_IRRADIATED)) + C.adjustToxLoss(-2 * removed, FALSE) + . = TRUE + return ..() || . -/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_end_metabolize(mob/living/drinker) - REMOVE_TRAIT(drinker, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() +/datum/reagent/consumable/ethanol/screwdrivercocktail/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + REMOVE_TRAIT(C, TRAIT_HALT_RADIATION_EFFECTS, CHEM_TRAIT_SOURCE(class)) /datum/reagent/consumable/ethanol/booger name = "Booger" @@ -679,7 +589,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "booger" glass_name = "Booger" glass_desc = "Ewww..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/bloody_mary name = "Bloody Mary" @@ -691,37 +601,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bloodymaryglass" glass_name = "Bloody Mary" glass_desc = "Tomato juice, mixed with Vodka and a li'l bit of lime. Tastes like liquid murder." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) - drinker.blood_volume = min(drinker.blood_volume + (3 * REM * delta_time), BLOOD_VOLUME_NORMAL) //Bloody Mary quickly restores blood loss. - ..() - -/datum/reagent/consumable/ethanol/brave_bull - name = "Brave Bull" - description = "It's just as effective as Dutch-Courage!" - color = "#a79f98" // rgb: 167,159,152 - boozepwr = 60 - quality = DRINK_NICE - taste_description = "alcoholic bravery" - glass_icon_state = "bravebullglass" - glass_name = "Brave Bull" - glass_desc = "Tequila and Coffee liqueur, brought together in a mouthwatering mixture. Drink up." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/tough_text - glass_price = DRINK_PRICE_EASY -/datum/reagent/consumable/ethanol/brave_bull/on_mob_metabolize(mob/living/drinker) - tough_text = pick("brawny", "tenacious", "tough", "hardy", "sturdy") //Tuff stuff - to_chat(drinker, span_notice("You feel [tough_text]!")) - drinker.maxHealth += 10 //Brave Bull makes you sturdier, and thus capable of withstanding a tiny bit more punishment. - drinker.health += 10 - -/datum/reagent/consumable/ethanol/brave_bull/on_mob_end_metabolize(mob/living/drinker) - to_chat(drinker, span_notice("You no longer feel [tough_text].")) - drinker.maxHealth -= 10 - drinker.health = min(drinker.health - 10, drinker.maxHealth) //This can indeed crit you if you're alive solely based on alchol ingestion /datum/reagent/consumable/ethanol/tequila_sunrise name = "Tequila Sunrise" @@ -733,25 +613,17 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tequilasunriseglass" glass_name = "tequila Sunrise" glass_desc = "Oh great, now you feel nostalgic about sunrises back on Terra..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/obj/effect/light_holder glass_price = DRINK_PRICE_MEDIUM -/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/drinker) - to_chat(drinker, span_notice("You feel gentle warmth spread through your body!")) - light_holder = new(drinker) - light_holder.set_light(l_outer_range = 3, l_power = 0.7, l_color = "#FFCC00") //Tequila Sunrise makes you radiate dim light, like a sunrise! +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + to_chat(C, span_notice("You feel gentle warmth spread through your body!")) -/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(QDELETED(light_holder)) - holder.del_reagent(type) //If we lost our light object somehow, remove the reagent - else if(light_holder.loc != drinker) - light_holder.forceMove(drinker) - return ..() - -/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_end_metabolize(mob/living/drinker) - to_chat(drinker, span_notice("The warmth in your body fades.")) - QDEL_NULL(light_holder) +/datum/reagent/consumable/ethanol/tequila_sunrise/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + to_chat(C, span_notice("The warmth in your body fades.")) /datum/reagent/consumable/ethanol/toxins_special name = "Toxins Special" @@ -764,10 +636,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Toxins Special" glass_desc = "Whoah, this thing is on FIRE!" shot_glass_icon_state = "toxinsspecialglass" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/toxins_special/on_mob_life(mob/living/drinker, delta_time, times_fired) - drinker.adjust_bodytemperature(15 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/toxins_special/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(15 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/beepsky_smash @@ -776,49 +648,50 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#808000" // rgb: 128,128,0 boozepwr = 60 //THE FIST OF THE LAW IS STRONG AND HARD quality = DRINK_GOOD - metabolization_rate = 1.25 * REAGENTS_METABOLISM + ingest_met = 0.25 taste_description = "JUSTICE" glass_icon_state = "beepskysmashglass" glass_name = "Beepsky Smash" glass_desc = "Heavy, hot and strong. Just like the Iron fist of the LAW." overdose_threshold = 40 var/datum/brain_trauma/special/beepsky/beepsky_hallucination - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/drinker) - if(HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - metabolization_rate = 0.8 +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return + if(HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) + ingest_met = 0.8 // if you don't have a liver, or your liver isn't an officer's liver - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) beepsky_hallucination = new() - drinker.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) - ..() + C.gain_trauma(beepsky_hallucination, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(4 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) +/datum/reagent/consumable/ethanol/beepsky_smash/affect_ingest(mob/living/carbon/C, removed) + . = ..() + C.set_timed_status_effect(4 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) // if you have a liver and that liver is an officer's liver if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.stamina.adjust(10 * REM * delta_time, 0) - if(DT_PROB(10, delta_time)) - new /datum/hallucination/items_other(drinker) - if(DT_PROB(5, delta_time)) - new /datum/hallucination/stray_bullet(drinker) - ..() + C.stamina.adjust(10 * removed, 0) + if(prob(20)) + new /datum/hallucination/items_other(C) + if(prob(10)) + new /datum/hallucination/stray_bullet(C) . = TRUE + ..() -/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/drinker) +/datum/reagent/consumable/ethanol/beepsky_smash/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return if(beepsky_hallucination) QDEL_NULL(beepsky_hallucination) - return ..() -/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/drinker) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) +/datum/reagent/consumable/ethanol/beepsky_smash/overdose_start(mob/living/carbon/C) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) // if you don't have a liver, or your liver isn't an officer's liver if(!liver || !HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) + C.gain_trauma(/datum/brain_trauma/mild/phobia/security, TRAUMA_RESILIENCE_BASIC) /datum/reagent/consumable/ethanol/irish_cream name = "Irish Cream" @@ -830,7 +703,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcreamglass" glass_name = "Irish Cream" glass_desc = "It's cream, mixed with whiskey. What else would you expect from the Irish?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/manly_dorf name = "The Manly Dorf" @@ -842,22 +715,17 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manlydorfglass" glass_name = "The Manly Dorf" glass_desc = "A manly concoction made from Ale and Beer. Intended for true men only." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/dorf_mode -/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/drinker) - if(ishuman(drinker)) - var/mob/living/carbon/human/potential_dwarf = drinker - if(HAS_TRAIT(potential_dwarf, TRAIT_DWARF)) - to_chat(potential_dwarf, span_notice("Now THAT is MANLY!")) - boozepwr = 50 // will still smash but not as much. - dorf_mode = TRUE - -/datum/reagent/consumable/ethanol/manly_dorf/on_mob_life(mob/living/carbon/dwarf, delta_time, times_fired) - if(dorf_mode) - dwarf.adjustBruteLoss(-2 * REM * delta_time) - dwarf.adjustFireLoss(-2 * REM * delta_time) - return ..() +/datum/reagent/consumable/ethanol/manly_dorf/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + if(ishuman(C)) + var/mob/living/carbon/human/potential_dwarf = C + if(HAS_TRAIT(potential_dwarf, TRAIT_DWARF)) + to_chat(potential_dwarf, span_notice("Now THAT is MANLY!")) + boozepwr = 50 // will still smash but not as much. + dorf_mode = TRUE /datum/reagent/consumable/ethanol/longislandicedtea name = "Long Island Iced Tea" @@ -869,7 +737,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "longislandicedteaglass" glass_name = "Long Island Iced Tea" glass_desc = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/moonshine @@ -881,7 +749,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_clear" glass_name = "Moonshine" glass_desc = "You've really hit rock bottom now... your liver packed its bags and left last night." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/b52 name = "B-52" @@ -894,11 +762,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "B-52" glass_desc = "Kahlua, Irish Cream, and cognac. You will get bombed." shot_glass_icon_state = "b52glass" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY -/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M) - playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) +/datum/reagent/consumable/ethanol/b52/on_mob_metabolize(mob/living/M, class) + if(class == CHEM_INGEST) + playsound(M, 'sound/effects/explosion_distant.ogg', 100, FALSE) /datum/reagent/consumable/ethanol/irishcoffee name = "Irish Coffee" @@ -910,7 +779,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcoffeeglass" glass_name = "Irish Coffee" glass_desc = "Coffee and alcohol. More fun than a Mimosa to drink in the morning." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/margarita name = "Margarita" @@ -922,7 +791,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "margaritaglass" glass_name = "Margarita" glass_desc = "On the rocks with salt on the rim. Arriba~!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/black_russian @@ -935,7 +804,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blackrussianglass" glass_name = "Black Russian" glass_desc = "For the lactose-intolerant. Still as classy as a White Russian." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/manhattan @@ -948,7 +817,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "manhattanglass" glass_name = "Manhattan" glass_desc = "The Detective's undercover drink of choice. He never could stomach gin..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY @@ -962,11 +831,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "proj_manhattanglass" glass_name = "Manhattan Project" glass_desc = "A scientist's drink of choice, for thinking how to blow up the station." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/manhattan_proj/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(1 MINUTES * REM * delta_time, /datum/status_effect/drugginess) + +/datum/reagent/consumable/ethanol/manhattan_proj/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(1 MINUTES * removed, /datum/status_effect/drugginess) return ..() /datum/reagent/consumable/ethanol/whiskeysoda @@ -979,7 +848,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "whiskeysodaglass2" glass_name = "whiskey soda" glass_desc = "Ultimate refreshment." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/antifreeze name = "Anti-freeze" @@ -991,10 +860,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "antifreeze" glass_name = "Anti-freeze" glass_desc = "The ultimate refreshment." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/antifreeze/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, drinker.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/antifreeze/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal() + 20) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/barefoot @@ -1007,15 +876,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "b&p" glass_name = "Barefoot" glass_desc = "Barefoot and pregnant." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/barefoot/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(ishuman(drinker)) //Barefoot causes the imbiber to quickly regenerate brute trauma if they're not wearing shoes. - var/mob/living/carbon/human/unshoed = drinker - if(!unshoed.shoes) - unshoed.adjustBruteLoss(-3 * REM * delta_time, 0) - . = TRUE - return ..() || . /datum/reagent/consumable/ethanol/snowwhite name = "Snow White" @@ -1027,7 +888,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "snowwhite" glass_name = "Snow White" glass_desc = "A cold refreshment." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/demonsblood name = "Demon's Blood" @@ -1039,14 +900,14 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "demonsblood" glass_name = "Demons Blood" glass_desc = "Just looking at this thing makes the hair at the back of your neck stand up." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/demonsblood/on_mob_metabolize(mob/living/metabolizer) - . = ..() - RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED, PROC_REF(pre_bloodcrawl_consumed)) -/datum/reagent/consumable/ethanol/demonsblood/on_mob_end_metabolize(mob/living/metabolizer) - . = ..() - UnregisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED) +/datum/reagent/consumable/ethanol/demonsblood/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + RegisterSignal(C, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED, PROC_REF(pre_bloodcrawl_consumed)) + +/datum/reagent/consumable/ethanol/demonsblood/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + UnregisterSignal(C, COMSIG_LIVING_BLOOD_CRAWL_PRE_CONSUMED) /// Prevents the imbiber from being dragged into a pool of blood by a slaughter demon. /datum/reagent/consumable/ethanol/demonsblood/proc/pre_bloodcrawl_consumed( @@ -1077,15 +938,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "devilskiss" glass_name = "Devils Kiss" glass_desc = "Creepy time!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/devilskiss/on_mob_metabolize(mob/living/metabolizer) - . = ..() - RegisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED, PROC_REF(on_bloodcrawl_consumed)) -/datum/reagent/consumable/ethanol/devilskiss/on_mob_end_metabolize(mob/living/metabolizer) - . = ..() - UnregisterSignal(metabolizer, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED) +/datum/reagent/consumable/ethanol/devilskiss/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + RegisterSignal(C, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED, PROC_REF(on_bloodcrawl_consumed)) + +/datum/reagent/consumable/ethanol/devilskiss/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + UnregisterSignal(C, COMSIG_LIVING_BLOOD_CRAWL_CONSUMED) /// If eaten by a slaughter demon, the demon will regret it. /datum/reagent/consumable/ethanol/devilskiss/proc/on_bloodcrawl_consumed( @@ -1124,7 +985,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "vodkatonicglass" glass_name = "vodka and tonic" glass_desc = "For when a gin and tonic isn't Russian enough." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/ginfizz @@ -1137,7 +998,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginfizzglass" glass_name = "gin fizz" glass_desc = "Refreshingly lemony, deliciously dry." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/bahama_mama @@ -1150,7 +1011,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bahama_mama" glass_name = "Bahama Mama" glass_desc = "A tropical cocktail with a complex blend of flavors." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/singulo name = "Singulo" @@ -1162,7 +1023,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "singulo" glass_name = "Singulo" glass_desc = "A blue-space beverage." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/sbiten name = "Sbiten" @@ -1174,10 +1035,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sbitenglass" glass_name = "Sbiten" glass_desc = "A spicy mix of Vodka and Spice. Very hot." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/sbiten/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_bodytemperature(50 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, BODYTEMP_HEAT_DAMAGE_LIMIT) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/sbiten/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.dna.species.heat_level_1) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/red_mead @@ -1190,7 +1051,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "red_meadglass" glass_name = "Red Mead" glass_desc = "A true Viking's beverage, made with the blood of their enemies." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/mead name = "Mead" @@ -1203,7 +1064,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "meadglass" glass_name = "Mead" glass_desc = "A drink from Valhalla." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/iced_beer name = "Iced Beer" @@ -1214,10 +1075,10 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "iced_beerglass" glass_name = "iced beer" glass_desc = "A beer so frosty, the air around it freezes." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, T0C) //310.15 is the normal bodytemp. + +/datum/reagent/consumable/ethanol/iced_beer/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-15 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, T0C) //310.15 is the normal bodytemp. return ..() /datum/reagent/consumable/ethanol/grog @@ -1229,7 +1090,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grogglass" glass_name = "Grog" glass_desc = "A fine and cepa drink for Space." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/aloe @@ -1242,7 +1103,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "aloe" glass_name = "Aloe" glass_desc = "Very, very, very good." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //somewhat annoying mix glass_price = DRINK_PRICE_MEDIUM @@ -1256,7 +1117,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "andalusia" glass_name = "Andalusia" glass_desc = "A nice, strangely named drink." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/alliescocktail name = "Allies Cocktail" @@ -1268,7 +1129,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "alliescocktail" glass_name = "Allies cocktail" glass_desc = "A drink made from your allies." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/ethanol/acid_spit @@ -1281,7 +1142,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "acidspitglass" glass_name = "Acid Spit" glass_desc = "A drink from Nanotrasen. Made from live aliens." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/amasec name = "Amasec" @@ -1293,26 +1154,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "amasecglass" glass_name = "Amasec" glass_desc = "Always handy before COMBAT!!!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/changelingsting - name = "Changeling Sting" - description = "You take a tiny sip and feel a burning sensation..." - color = "#2E6671" // rgb: 46, 102, 113 - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "your brain coming out your nose" - glass_icon_state = "changelingsting" - glass_name = "Changeling Sting" - glass_desc = "A stingy drink." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/changelingsting/on_mob_life(mob/living/carbon/target, delta_time, times_fired) - if(target.mind) //Changeling Sting assists in the recharging of changeling chemicals. - var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - changeling.adjust_chemicals(metabolization_rate * REM * delta_time) - return ..() /datum/reagent/consumable/ethanol/irishcarbomb name = "Irish Car Bomb" @@ -1324,7 +1166,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "irishcarbomb" glass_name = "Irish Car Bomb" glass_desc = "An Irish car bomb." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/syndicatebomb name = "Syndicate Bomb" @@ -1336,11 +1178,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "syndicatebomb" glass_name = "Syndicate Bomb" glass_desc = "A syndicate bomb." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/syndicatebomb/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(DT_PROB(2.5, delta_time)) - playsound(get_turf(drinker), 'sound/effects/explosionfar.ogg', 100, TRUE) + +/datum/reagent/consumable/ethanol/syndicatebomb/affect_ingest(mob/living/carbon/C, removed) + if(prob(5)) + playsound(get_turf(C), 'sound/effects/explosionfar.ogg', 100, TRUE) return ..() /datum/reagent/consumable/ethanol/hiveminderaser @@ -1353,7 +1195,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "hiveminderaser" glass_name = "Hivemind Eraser" glass_desc = "For when even mindshields can't save you." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/erikasurprise name = "Erika Surprise" @@ -1365,7 +1207,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "erikasurprise" glass_name = "Erika Surprise" glass_desc = "The surprise is, it's green!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/driestmartini name = "Driest Martini" @@ -1378,7 +1220,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "driestmartiniglass" glass_name = "Driest Martini" glass_desc = "Only for the experienced. You think you see sand floating in the glass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/bananahonk name = "Banana Honk" @@ -1391,12 +1233,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bananahonkglass" glass_name = "Banana Honk" glass_desc = "A drink from Clown Heaven." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) - if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(drinker)) - drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) + +/datum/reagent/consumable/ethanol/bananahonk/affect_ingest(mob/living/carbon/C, removed) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(C)) + C.heal_overall_damage(0.25 * removed, 0.25 * removed, FALSE) . = TRUE return ..() || . @@ -1411,12 +1253,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "silencerglass" glass_name = "Silencer" glass_desc = "A drink from Mime Heaven." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(ishuman(drinker) && drinker.mind?.miming) - drinker.silent = max(drinker.silent, MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) + +/datum/reagent/consumable/ethanol/silencer/affect_ingest(mob/living/carbon/C, removed) + if(ishuman(C) && C.mind?.miming) + C.silent = max(C.silent, MIMEDRINK_SILENCE_DURATION) . = TRUE return ..() || . @@ -1430,7 +1271,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "drunkenblumpkin" glass_name = "Drunken Blumpkin" glass_desc = "A drink for the drunks." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/whiskey_sour //Requested since we had whiskey cola and soda but not sour. name = "Whiskey Sour" @@ -1454,7 +1295,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "hard cider" glass_desc = "Tastes like autumn... no wait, fall!" shot_glass_icon_state = "shotglassbrown" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK @@ -1464,43 +1305,18 @@ All effects don't start immediately, but rather get worse over time; the rate is color = rgb(255, 91, 15) boozepwr = 10 quality = DRINK_VERYGOOD - metabolization_rate = 0.1 * REAGENTS_METABOLISM + ingest_met = 0.02 taste_description = "charged metal" // the same as teslium, honk honk. glass_icon_state = "fetching_fizz" glass_name = "Fetching Fizz" glass_desc = "Induces magnetism in the imbiber. Started as a barroom prank but evolved to become popular with miners and scrappers. Metallic aftertaste." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/fetching_fizz/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - for(var/obj/item/stack/ore/O in orange(3, M)) - step_towards(O, get_turf(M)) +/datum/reagent/consumable/ethanol/fetching_fizz/affect_ingest(mob/living/carbon/C, removed) + for(var/obj/item/stack/ore/O in oview(3, C)) + step_towards(O, get_turf(C)) return ..() -//Another reference. Heals those in critical condition extremely quickly. -/datum/reagent/consumable/ethanol/hearty_punch - name = "Hearty Punch" - description = "Brave bull/syndicate bomb/absinthe mixture resulting in an energizing beverage. Mild alcohol content." - color = rgb(140, 0, 0) - boozepwr = 90 - quality = DRINK_VERYGOOD - metabolization_rate = 0.4 * REAGENTS_METABOLISM - taste_description = "bravado in the face of disaster" - glass_icon_state = "hearty_punch" - glass_name = "Hearty Punch" - glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.health <= 0) - drinker.adjustBruteLoss(-3 * REM * delta_time, 0) - drinker.adjustFireLoss(-3 * REM * delta_time, 0) - drinker.adjustCloneLoss(-5 * REM * delta_time, 0) - drinker.adjustOxyLoss(-4 * REM * delta_time, 0) - drinker.adjustToxLoss(-3 * REM * delta_time, 0) - . = TRUE - return ..() || . - /datum/reagent/consumable/ethanol/bacchus_blessing //An EXTREMELY powerful drink. Smashed in seconds, dead in minutes. name = "Bacchus' Blessing" description = "Unidentifiable mixture. Unmeasurably high alcohol content." @@ -1510,7 +1326,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown2" glass_name = "Bacchus' Blessing" glass_desc = "You didn't think it was possible for a liquid to be so utterly revolting. Are you sure about this...?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + @@ -1524,24 +1340,25 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "atomicbombglass" glass_name = "Atomic Bomb" glass_desc = "Nanotrasen cannot take legal responsibility for your actions after imbibing." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH -/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(100 SECONDS * REM * delta_time, /datum/status_effect/drugginess) - if(!HAS_TRAIT(drinker, TRAIT_ALCOHOL_TOLERANCE)) - drinker.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/confusion) - drinker.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/drunk) +/datum/reagent/consumable/ethanol/atomicbomb/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(100 SECONDS * removed, /datum/status_effect/drugginess) + if(!HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/confusion) + C.set_timed_status_effect(20 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.adjust_timed_status_effect(6 SECONDS * removed, /datum/status_effect/speech/slurring/drunk) switch(current_cycle) if(51 to 200) - drinker.Sleeping(100 * REM * delta_time) + C.Sleeping(100 * removed) . = TRUE if(201 to INFINITY) - drinker.AdjustSleeping(40 * REM * delta_time) - drinker.adjustToxLoss(2 * REM * delta_time, 0) + C.AdjustSleeping(40 * removed) + C.adjustToxLoss(2 * removed, 0) . = TRUE - ..() + + return ..() || . /datum/reagent/consumable/ethanol/gargle_blaster name = "Pan-Galactic Gargle Blaster" @@ -1553,23 +1370,24 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gargleblasterglass" glass_name = "Pan-Galactic Gargle Blaster" glass_desc = "Like having your brain smashed out by a slice of lemon wrapped around a large gold brick." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/dizziness) + +/datum/reagent/consumable/ethanol/gargle_blaster/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(3 SECONDS * removed, /datum/status_effect/dizziness) switch(current_cycle) if(15 to 45) - drinker.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/drunk) + C.adjust_timed_status_effect(3 SECONDS * removed, /datum/status_effect/speech/slurring/drunk) if(45 to 55) - if(DT_PROB(30, delta_time)) - drinker.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/confusion) + if(prob(50)) + C.adjust_timed_status_effect(3 SECONDS * removed, /datum/status_effect/confusion) if(55 to 200) - drinker.set_timed_status_effect(110 SECONDS * REM * delta_time, /datum/status_effect/drugginess) + C.set_timed_status_effect(110 SECONDS * removed, /datum/status_effect/drugginess) if(200 to INFINITY) - drinker.adjustToxLoss(2 * REM * delta_time, 0) + C.adjustToxLoss(2 * removed, 0) . = TRUE - ..() + + return ..() || . /datum/reagent/consumable/ethanol/neurotoxin name = "Neurotoxin" @@ -1578,45 +1396,46 @@ All effects don't start immediately, but rather get worse over time; the rate is boozepwr = 50 quality = DRINK_VERYGOOD taste_description = "a numbing sensation" - metabolization_rate = 1 * REAGENTS_METABOLISM + ingest_met = 0.2 glass_icon_state = "neurotoxinglass" glass_name = "Neurotoxin" glass_desc = "A drink that is guaranteed to knock you silly." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/ethanol/neurotoxin/proc/pick_paralyzed_limb() return (pick(TRAIT_PARALYSIS_L_ARM,TRAIT_PARALYSIS_R_ARM,TRAIT_PARALYSIS_R_LEG,TRAIT_PARALYSIS_L_LEG)) -/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(100 SECONDS * REM * delta_time, /datum/status_effect/drugginess) - drinker.adjust_timed_status_effect(4 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * delta_time, 150) - if(DT_PROB(10, delta_time)) - drinker.stamina.adjust(-10) - drinker.drop_all_held_items() - to_chat(drinker, span_notice("You cant feel your hands!")) +/datum/reagent/consumable/ethanol/neurotoxin/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(100 SECONDS * removed, /datum/status_effect/drugginess) + C.adjust_timed_status_effect(4 SECONDS * removed, /datum/status_effect/dizziness) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * removed, 150, updating_health = FALSE) + if(prob(20)) + C.stamina.adjust(-10) + C.drop_all_held_items() + to_chat(C, span_warning("You cant feel your hands!")) if(current_cycle > 5) - if(DT_PROB(10, delta_time)) + if(prob(20)) var/paralyzed_limb = pick_paralyzed_limb() - ADD_TRAIT(drinker, paralyzed_limb, type) - drinker.stamina.adjust(-10) + ADD_TRAIT(C, paralyzed_limb, type) + C.stamina.adjust(-10) if(current_cycle > 30) - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * delta_time) - if(current_cycle > 50 && DT_PROB(7.5, delta_time)) - if(!drinker.undergoing_cardiac_arrest() && drinker.can_heartattack()) - drinker.set_heartattack(TRUE) - if(drinker.stat == CONSCIOUS) - drinker.visible_message(span_userdanger("[drinker] clutches at [drinker.p_their()] chest as if [drinker.p_their()] heart stopped!")) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * removed, updating_health = FALSE) + if(current_cycle > 50 && prob(15)) + if(C.set_heartattack(TRUE)) + log_health(C, "Heart stopped due to ethanol (neurotoxin) consumption.") + if(C.stat == CONSCIOUS) + C.visible_message(span_userdanger("[C] clutches at [C.p_their()] chest as if [C.p_their()] heart stopped!")) . = TRUE ..() -/datum/reagent/consumable/ethanol/neurotoxin/on_mob_end_metabolize(mob/living/carbon/drinker) - REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_L_ARM, type) - REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_R_ARM, type) - REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_R_LEG, type) - REMOVE_TRAIT(drinker, TRAIT_PARALYSIS_L_LEG, type) - drinker.stamina.adjust(-10) - ..() +/datum/reagent/consumable/ethanol/neurotoxin/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return + REMOVE_TRAIT(C, TRAIT_PARALYSIS_L_ARM, type) + REMOVE_TRAIT(C, TRAIT_PARALYSIS_R_ARM, type) + REMOVE_TRAIT(C, TRAIT_PARALYSIS_R_LEG, type) + REMOVE_TRAIT(C, TRAIT_PARALYSIS_L_LEG, type) + if(class != CHEM_TOUCH) + C.stamina.adjust(-10) /datum/reagent/consumable/ethanol/hippies_delight name = "Hippie's Delight" @@ -1625,45 +1444,50 @@ All effects don't start immediately, but rather get worse over time; the rate is nutriment_factor = 0 boozepwr = 0 //custom drunk effect quality = DRINK_FANTASTIC - metabolization_rate = 0.2 * REAGENTS_METABOLISM + ingest_met = 0.04 taste_description = "giving peace a chance" glass_icon_state = "hippiesdelightglass" glass_name = "Hippie's Delight" glass_desc = "A drink enjoyed by people during the 1960's." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.set_timed_status_effect(1 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/drunk, only_if_higher = TRUE) + +/datum/reagent/consumable/ethanol/hippies_delight/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(1 SECONDS * removed, /datum/status_effect/speech/slurring/drunk, only_if_higher = TRUE) switch(current_cycle) if(1 to 5) - drinker.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.set_timed_status_effect(1 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - if(DT_PROB(5, delta_time)) - drinker.emote(pick("twitch","giggle")) + C.set_timed_status_effect(20 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.set_timed_status_effect(1 MINUTES * removed, /datum/status_effect/drugginess) + if(prob(10)) + spawn(-1) + C.emote(pick("twitch","giggle")) if(5 to 10) - drinker.set_timed_status_effect(40 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - drinker.set_timed_status_effect(40 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.set_timed_status_effect(1.5 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - if(DT_PROB(10, delta_time)) - drinker.emote(pick("twitch","giggle")) + C.set_timed_status_effect(40 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(40 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.set_timed_status_effect(1.5 MINUTES * removed, /datum/status_effect/drugginess) + if(prob(20)) + spawn(-1) + C.emote(pick("twitch","giggle")) + if (10 to 200) - drinker.set_timed_status_effect(80 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - drinker.set_timed_status_effect(80 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.set_timed_status_effect(2 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - if(DT_PROB(16, delta_time)) - drinker.emote(pick("twitch","giggle")) + C.set_timed_status_effect(80 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(80 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.set_timed_status_effect(2 MINUTES * removed, /datum/status_effect/drugginess) + if(prob(25)) + spawn(-1) + C.emote(pick("twitch","giggle")) if(200 to INFINITY) - drinker.set_timed_status_effect(120 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - drinker.set_timed_status_effect(120 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - drinker.set_timed_status_effect(2.5 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - if(DT_PROB(23, delta_time)) - drinker.emote(pick("twitch","giggle")) - if(DT_PROB(16, delta_time)) - drinker.adjustToxLoss(2, 0) + C.set_timed_status_effect(120 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(120 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.set_timed_status_effect(2.5 MINUTES * removed, /datum/status_effect/drugginess) + if(prob(40)) + spawn(-1) + C.emote(pick("twitch","giggle")) + if(prob(25)) + C.adjustToxLoss(2 * removed, 0) . = TRUE - ..() + return ..() || . /datum/reagent/consumable/ethanol/eggnog name = "Eggnog" description = "For enjoying the most wonderful time of the year." @@ -1675,7 +1499,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_yellow" glass_name = "eggnog" glass_desc = "For enjoying the most wonderful time of the year." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/narsour @@ -1688,11 +1512,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "narsour" glass_name = "Nar'Sour" glass_desc = "A new hit cocktail inspired by THE ARM Breweries will have you shouting Fuu ma'jin in no time!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/narsour/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) - drinker.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/speech/stutter, max_duration = 6 SECONDS) + +/datum/reagent/consumable/ethanol/narsour/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(6 SECONDS * removed, /datum/status_effect/speech/slurring/cult, max_duration = 6 SECONDS) + C.adjust_timed_status_effect(6 SECONDS * removed, /datum/status_effect/speech/stutter, max_duration = 6 SECONDS) return ..() /datum/reagent/consumable/ethanol/triple_sec @@ -1704,7 +1528,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "Triple Sec" glass_desc = "A glass of straight Triple Sec." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/creme_de_menthe name = "Creme de Menthe" @@ -1715,7 +1539,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_green" glass_name = "Creme de Menthe" glass_desc = "You can almost feel the first breath of spring just looking at it." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/creme_de_cacao name = "Creme de Cacao" @@ -1726,7 +1550,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_brown" glass_name = "Creme de Cacao" glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/creme_de_coconut name = "Creme de Coconut" @@ -1737,7 +1561,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_white" glass_name = "Creme de Coconut" glass_desc = "An unintimidating glass of coconut liqueur." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/quadruple_sec name = "Quadruple Sec" @@ -1749,15 +1573,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quadruple_sec" glass_name = "Quadruple Sec" glass_desc = "An intimidating and lawful beverage dares you to violate the law and make its day. Still can't drink it on duty, though." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/quadruple_sec/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) + +/datum/reagent/consumable/ethanol/quadruple_sec/affect_ingest(mob/living/carbon/C, removed) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) + C.heal_bodypart_damage(0.75 * removed, 0.75 * removed, FALSE) . = TRUE - return ..() + return ..() || . /datum/reagent/consumable/ethanol/quintuple_sec name = "Quintuple Sec" @@ -1769,16 +1593,15 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "quintuple_sec" glass_name = "Quintuple Sec" glass_desc = "Now you are become law, destroyer of clowns." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/quintuple_sec/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) + +/datum/reagent/consumable/ethanol/quintuple_sec/affect_ingest(mob/living/carbon/C, removed) //Securidrink in line with the Screwdriver for engineers or Nothing for mimes but STRONG.. - var/obj/item/organ/liver/liver = drinker.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - drinker.heal_bodypart_damage(2 * REM * delta_time, 2 * REM * delta_time, 2 * REM * delta_time) + C.heal_bodypart_damage(1 * removed, 1 * removed, FALSE) . = TRUE - return ..() - + return ..() || . /datum/reagent/consumable/ethanol/grasshopper name = "Grasshopper" description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this." @@ -1789,7 +1612,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "grasshopper" glass_name = "Grasshopper" glass_desc = "You weren't aware edible beverages could be that green." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/stinger name = "Stinger" @@ -1801,49 +1624,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "stinger" glass_name = "Stinger" glass_desc = "You wonder what would happen if you pointed this at a heat source..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/bastion_bourbon - name = "Bastion Bourbon" - description = "Soothing hot herbal brew with restorative properties. Hints of citrus and berry flavors." - color = "#00FFFF" - boozepwr = 30 - quality = DRINK_FANTASTIC - taste_description = "hot herbal brew with a hint of fruit" - metabolization_rate = 2 * REAGENTS_METABOLISM //0.4u per second - glass_icon_state = "bastion_bourbon" - glass_name = "Bastion Bourbon" - glass_desc = "If you're feeling low, count on the buttery flavor of our own bastion bourbon." - shot_glass_icon_state = "shotglassgreen" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_HIGH - -/datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_metabolize(mob/living/drinker) - var/heal_points = 10 - if(drinker.health <= 0) - heal_points = 20 //heal more if we're in softcrit - for(var/counter in 1 to min(volume, heal_points)) //only heals 1 point of damage per unit on add, for balance reasons - drinker.adjustBruteLoss(-1, FALSE) - drinker.adjustFireLoss(-1, FALSE) - drinker.adjustToxLoss(-1, FALSE) - drinker.adjustOxyLoss(-1, FALSE) - drinker.updatehealth() - drinker.stamina.adjust(1) - drinker.visible_message(span_warning("[drinker] shivers with renewed vigor!"), span_notice("One taste of [lowertext(name)] fills you with energy!")) - if(!drinker.stat && heal_points == 20) //brought us out of softcrit - drinker.visible_message(span_danger("[drinker] lurches to [drinker.p_their()] feet!"), span_boldnotice("Up and at 'em, kid.")) - -/datum/reagent/consumable/ethanol/bastion_bourbon/on_mob_life(mob/living/drinker, delta_time, times_fired) - if(drinker.health > 0) - drinker.adjustBruteLoss(-1 * REM * delta_time, FALSE) - drinker.adjustFireLoss(-1 * REM * delta_time, FALSE) - drinker.adjustToxLoss(-0.5 * REM * delta_time, FALSE) - drinker.adjustOxyLoss(-3 * REM * delta_time, FALSE) - drinker.updatehealth() - drinker.stamina.adjust(5 * REM * delta_time) - . = TRUE - ..() /datum/reagent/consumable/ethanol/squirt_cider name = "Squirt Cider" @@ -1856,12 +1637,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Squirt Cider" glass_desc = "Squirt cider will toughen you right up. Too bad about the musty aftertaste." shot_glass_icon_state = "shotglassgreen" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/squirt_cider/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.satiety += 5 * REM * delta_time //for context, vitamins give 15 satiety per second - ..() - . = TRUE + +/datum/reagent/consumable/ethanol/squirt_cider/affect_ingest(mob/living/carbon/C, removed) + C.satiety += 5 * removed //for context, vitamins give 15 satiety per second + return ..() /datum/reagent/consumable/ethanol/fringe_weaver name = "Fringe Weaver" @@ -1873,7 +1653,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fringe_weaver" glass_name = "Fringe Weaver" glass_desc = "It's a wonder it doesn't spill out of the glass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/sugar_rush name = "Sugar Rush" @@ -1886,13 +1666,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sugar_rush" glass_name = "Sugar Rush" glass_desc = "If you can't mix a Sugar Rush, you can't tend bar." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/sugar_rush/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.satiety -= 10 * REM * delta_time //junky as hell! a whole glass will keep you from being able to eat junk food - ..() - . = TRUE +/datum/reagent/consumable/ethanol/sugar_rush/affect_ingest(mob/living/carbon/C, removed) + C.satiety -= 10 * removed //junky as hell! a whole glass will keep you from being able to eat junk food + return ..() /datum/reagent/consumable/ethanol/crevice_spike name = "Crevice Spike" description = "Sour, bitter, and smashingly sobering." @@ -1903,10 +1681,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "crevice_spike" glass_name = "Crevice Spike" glass_desc = "It'll either knock the drunkenness out of you or knock you out cold. Both, probably." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/drinker) //damage only applies when drink first enters system and won't again until drink metabolizes out - drinker.adjustBruteLoss(3 * min(5,volume)) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 + +/datum/reagent/consumable/ethanol/crevice_spike/on_mob_metabolize(mob/living/carbon/C, class) //damage only applies when drink first enters system and won't again until drink metabolizes out + if(class == CHEM_INGEST) + C.adjustBruteLoss(3 * min(5,volume), 0) //minimum 3 brute damage on ingestion to limit non-drink means of injury - a full 5 unit gulp of the drink trucks you for the full 15 + return TRUE /datum/reagent/consumable/ethanol/sake name = "Sake" @@ -1917,7 +1697,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sakecup" glass_name = "cup of sake" glass_desc = "A traditional cup of sake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK /datum/reagent/consumable/ethanol/peppermint_patty @@ -1930,45 +1710,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "peppermint_patty" glass_name = "Peppermint Patty" glass_desc = "A boozy minty hot cocoa that warms your belly on a cold night." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/peppermint_patty/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.apply_status_effect(/datum/status_effect/throat_soothed) - drinker.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, drinker.get_body_temp_normal()) - ..() -/datum/reagent/consumable/ethanol/alexander - name = "Alexander" - description = "Named after a Greek hero, this mix is said to embolden a user's shield as if they were in a phalanx." - color = "#F5E9D3" - boozepwr = 50 - quality = DRINK_GOOD - taste_description = "bitter, creamy cacao" - glass_icon_state = "alexander" - glass_name = "Alexander" - glass_desc = "A creamy, indulgent delight that is stronger than it seems." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/obj/item/shield/mighty_shield - -/datum/reagent/consumable/ethanol/alexander/on_mob_metabolize(mob/living/drinker) - if(ishuman(drinker)) - var/mob/living/carbon/human/the_human = drinker - for(var/obj/item/shield/the_shield in the_human.contents) - mighty_shield = the_shield - mighty_shield.block_chance += 10 - to_chat(the_human, span_notice("[the_shield] appears polished, although you don't recall polishing it.")) - return TRUE - -/datum/reagent/consumable/ethanol/alexander/on_mob_life(mob/living/drinker, delta_time, times_fired) - ..() - if(mighty_shield && !(mighty_shield in drinker.contents)) //If you had a shield and lose it, you lose the reagent as well. Otherwise this is just a normal drink. - holder.remove_reagent(type) -/datum/reagent/consumable/ethanol/alexander/on_mob_end_metabolize(mob/living/drinker) - if(mighty_shield) - mighty_shield.block_chance -= 10 - to_chat(drinker,span_notice("You notice [mighty_shield] looks worn again. Weird.")) - ..() +/datum/reagent/consumable/ethanol/peppermint_patty/affect_ingest(mob/living/carbon/C, removed) + C.apply_status_effect(/datum/status_effect/throat_soothed) + C.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/ethanol/amaretto_alexander name = "Amaretto Alexander" @@ -1980,7 +1727,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "alexanderam" glass_name = "Amaretto Alexander" glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/sidecar name = "Sidecar" @@ -1992,7 +1739,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sidecar" glass_name = "Sidecar" glass_desc = "The one ride you'll gladly give up the wheel for." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/between_the_sheets @@ -2005,31 +1752,25 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "between_the_sheets" glass_name = "Between the Sheets" glass_desc = "The only drink that comes with a label reminding you of Nanotrasen's zero-tolerance promiscuity policy." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM -/datum/reagent/consumable/ethanol/between_the_sheets/on_mob_life(mob/living/drinker, delta_time, times_fired) - ..() - var/is_between_the_sheets = FALSE - for(var/obj/item/bedsheet/bedsheet in range(drinker.loc, 0)) - if(bedsheet.loc != drinker.loc) // bedsheets in your backpack/neck don't count - continue - is_between_the_sheets = TRUE - break + glass_price = DRINK_PRICE_MEDIUM - if(!drinker.IsSleeping() || !is_between_the_sheets) +/datum/reagent/consumable/ethanol/between_the_sheets/affect_ingest(mob/living/carbon/C, removed) + var/is_between_the_sheets = !!(locate(/obj/item/bedsheet/) in get_turf(C)) + if(!C.IsSleeping() || !is_between_the_sheets) return - if(drinker.getBruteLoss() && drinker.getFireLoss()) //If you are damaged by both types, slightly increased healing but it only heals one. The more the merrier wink wink. + if(C.getBruteLoss() && C.getFireLoss()) //If you are damaged by both types, slightly increased healing but it only heals one. The more the merrier wink wink. if(prob(50)) - drinker.adjustBruteLoss(-0.25 * REM * delta_time) + C.adjustBruteLoss(-0.25 * removed, FALSE) else - drinker.adjustFireLoss(-0.25 * REM * delta_time) - else if(drinker.getBruteLoss()) //If you have only one, it still heals but not as well. - drinker.adjustBruteLoss(-0.2 * REM * delta_time) - else if(drinker.getFireLoss()) - drinker.adjustFireLoss(-0.2 * REM * delta_time) + C.adjustFireLoss(-0.25 * removed, FALSE) + else if(C.getBruteLoss()) //If you have only one, it still heals but not as well. + C.adjustBruteLoss(-0.2 * removed, FALSE) + else if(C.getFireLoss()) + C.adjustFireLoss(-0.2 * removed, FALSE) + return ..() || TRUE /datum/reagent/consumable/ethanol/kamikaze name = "Kamikaze" description = "Divinely windy." @@ -2040,7 +1781,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "kamikaze" glass_name = "Kamikaze" glass_desc = "Divinely windy." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/mojito name = "Mojito" @@ -2052,7 +1793,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "mojito" glass_name = "Mojito" glass_desc = "A drink that looks as refreshing as it tastes." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/moscow_mule @@ -2065,7 +1806,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "moscow_mule" glass_name = "Moscow Mule" glass_desc = "A chilly drink that reminds you of the Derelict." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/fernet name = "Fernet" @@ -2075,15 +1816,16 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "utter bitterness" glass_name = "glass of fernet" glass_desc = "A glass of pure Fernet. Only an absolute madman would drink this alone." //Hi Kevum - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/fernet/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(1 * REM * delta_time, 0) - drinker.adjust_nutrition(-5 * REM * delta_time) - drinker.overeatduration = 0 - return ..() +/datum/reagent/consumable/ethanol/fernet/affect_ingest(mob/living/carbon/C, removed) + if(C.nutrition <= NUTRITION_LEVEL_STARVING) + C.adjustToxLoss(1 * removed, 0) + . = TRUE + + C.adjust_nutrition(-5 * removed) + C.overeatduration = 0 + return ..() || . /datum/reagent/consumable/ethanol/fernet_cola name = "Fernet Cola" description = "A very popular and bittersweet digestif, ideal after a heavy meal. Best served on a sawed-off cola bottle as per tradition." @@ -2094,17 +1836,16 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godlyblend" glass_name = "glass of fernet cola" glass_desc = "A sawed-off cola bottle filled with Fernet Cola. Nothing better after eating like a lardass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/fernet_cola/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.nutrition <= NUTRITION_LEVEL_STARVING) - drinker.adjustToxLoss(0.5 * REM * delta_time, 0) - drinker.adjust_nutrition(-3 * REM * delta_time) - drinker.overeatduration = 0 + +/datum/reagent/consumable/ethanol/fernet_cola/affect_ingest(mob/living/carbon/C, removed) + if(C.nutrition <= NUTRITION_LEVEL_STARVING) + C.adjustToxLoss(0.5 * removed, 0) + C.adjust_nutrition(-3 * removed) + C.overeatduration = 0 return ..() /datum/reagent/consumable/ethanol/fanciulli - name = "Fanciulli" description = "What if the Manhattan cocktail ACTUALLY used a bitter herb liquour? Helps you sober up." //also causes a bit of stamina damage to symbolize the afterdrink lazyness color = "#CA933F" // rgb: 202, 147, 63 @@ -2114,20 +1855,18 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "fanciulli" glass_name = "glass of fanciulli" glass_desc = "A glass of Fanciulli. It's just Manhattan with Fernet." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_HIGH -/datum/reagent/consumable/ethanol/fanciulli/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_nutrition(-5 * REM * delta_time) - drinker.overeatduration = 0 +/datum/reagent/consumable/ethanol/fanciulli/affect_ingest(mob/living/carbon/C, removed) + C.adjust_nutrition(-5 * removed) + C.overeatduration = 0 return ..() -/datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/drinker) - if(drinker.health > 0) - drinker.stamina.adjust(-20) - . = TRUE - ..() - +/datum/reagent/consumable/ethanol/fanciulli/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + if(C.health > 0) + C.stamina.adjust(-20) /datum/reagent/consumable/ethanol/branca_menta name = "Branca Menta" @@ -2139,19 +1878,17 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state= "minted_fernet" glass_name = "glass of branca menta" glass_desc = "A glass of Branca Menta, perfect for those lazy and hot Sunday summer afternoons." //Get lazy literally by drinking this - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_MEDIUM + glass_price = DRINK_PRICE_MEDIUM -/datum/reagent/consumable/ethanol/branca_menta/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_bodytemperature(-20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, T0C) +/datum/reagent/consumable/ethanol/branca_menta/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-20 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, T0C) return ..() -/datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/drinker) - if(drinker.health > 0) - drinker.stamina.adjust(-35) - . = TRUE - ..() +/datum/reagent/consumable/ethanol/branca_menta/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + if(C.health > 0) + C.stamina.adjust(-35) /datum/reagent/consumable/ethanol/blank_paper name = "Blank Paper" @@ -2164,15 +1901,14 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "blank_paper" glass_name = "glass of blank paper" glass_desc = "A fizzy cocktail for those looking to start fresh." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/blank_paper/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(ishuman(drinker) && drinker.mind?.miming) - drinker.silent = max(drinker.silent, MIMEDRINK_SILENCE_DURATION) - drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) - . = TRUE - return ..() +/datum/reagent/consumable/ethanol/blank_paper/affect_ingest(mob/living/carbon/C, removed) + if(ishuman(C) && C.mind?.miming) + C.silent = max(C.silent, MIMEDRINK_SILENCE_DURATION) + C.heal_bodypart_damage(0.5 * removed, 0.5 * removed) + . = TRUE + return ..() || . /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" description = "A wine made from grown plants." @@ -2182,7 +1918,6 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "bad coding" var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. var/list/tastes = list("bad coding" = 1) //List of tastes. See above. - ph = 4 /datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) if(!data) @@ -2290,7 +2025,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "champagne_glass" glass_name = "Champagne" glass_desc = "The flute clearly displays the slowly rising bubbles." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY @@ -2304,16 +2039,16 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "wizz_fizz" glass_name = "Wizz Fizz" glass_desc = "The glass bubbles and froths with an almost magical intensity." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/wizz_fizz/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting - if(drinker?.mind?.has_antag_datum(/datum/antagonist/wizard)) - drinker.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time, 1 * REM * delta_time) - drinker.adjustOxyLoss(-1 * REM * delta_time, 0) - drinker.adjustToxLoss(-1 * REM * delta_time, 0) - return ..() +/datum/reagent/consumable/ethanol/wizz_fizz/affect_ingest(mob/living/carbon/C, removed) + //A healing drink similar to Quadruple Sec, Ling Stings, and Screwdrivers for the Wizznerds; the check is consistent with the changeling sting + if(C?.mind?.has_antag_datum(/datum/antagonist/wizard)) + C.heal_bodypart_damage(1 * removed, 1 * removed, 1 * removed) + C.adjustOxyLoss(-1 * removed, 0) + C.adjustToxLoss(-1 * removed, 0) + . = TRUE + return ..() || . /datum/reagent/consumable/ethanol/bug_spray name = "Bug Spray" description = "A harsh, acrid, bitter drink, for those who need something to brace themselves." @@ -2324,20 +2059,31 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bug_spray" glass_name = "Bug Spray" glass_desc = "Your eyes begin to water as the sting of alcohol reaches them." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/bug_spray/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) + +/datum/reagent/consumable/ethanol/bug_spray/affect_ingest(mob/living/carbon/C, removed) //Bugs should not drink Bug spray. - if(ismoth(drinker) || isflyperson(drinker)) - drinker.adjustToxLoss(1 * REM * delta_time, 0) - return ..() + if(ismoth(C) || isflyperson(C)) + C.adjustToxLoss(1 * removed, 0) + . = TRUE + return ..() || . -/datum/reagent/consumable/ethanol/bug_spray/on_mob_metabolize(mob/living/carbon/drinker) +/datum/reagent/consumable/ethanol/bug_spray/affect_touch(mob/living/carbon/C, removed) + //Bugs should not drink Bug spray. + if(ismoth(C) || isflyperson(C)) + C.adjustToxLoss(1 * removed, 0) + return TRUE - if(ismoth(drinker) || isflyperson(drinker)) - drinker.emote("scream") - return ..() +/datum/reagent/consumable/ethanol/bug_spray/affect_blood(mob/living/carbon/C, removed) + //Bugs should not drink Bug spray. + if(ismoth(C) || isflyperson(C)) + C.adjustToxLoss(3 * removed, 0) + return TRUE +/datum/reagent/consumable/ethanol/bug_spray/on_mob_metabolize(mob/living/carbon/C) + if(ismoth(C) || isflyperson(C)) + spawn(-1) + C.emote("scream") /datum/reagent/consumable/ethanol/applejack name = "Applejack" @@ -2348,7 +2094,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "applejack_glass" glass_name = "Applejack" glass_desc = "You feel like you could drink this all neight." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/jack_rose name = "Jack Rose" @@ -2360,7 +2106,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "jack_rose" glass_name = "Jack Rose" glass_desc = "Enough of these, and you really will start to suppose your toeses are roses." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/turbo name = "Turbo" @@ -2372,12 +2118,12 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "turbo" glass_name = "Turbo" glass_desc = "A turbulent cocktail for outlaw hoverbikers." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/turbo/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(DT_PROB(2, delta_time)) - to_chat(drinker, span_notice("[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")) - drinker.stamina.adjust(0.25 * drinker.get_drunk_amount() * REM * delta_time) + +/datum/reagent/consumable/ethanol/turbo/affect_ingest(mob/living/carbon/C, removed) + if(prob(4)) + to_chat(C, span_notice("[pick("You feel disregard for the rule of law.", "You feel pumped!", "Your head is pounding.", "Your thoughts are racing..")]")) + C.stamina.adjust(0.25 * C.get_drunk_amount() * removed) return ..() /datum/reagent/consumable/ethanol/old_timer @@ -2390,10 +2136,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "old_timer" glass_name = "Old Timer" glass_desc = "WARNING! May cause premature aging!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/old_timer/on_mob_life(mob/living/carbon/human/metabolizer, delta_time, times_fired) - if(DT_PROB(10, delta_time) && istype(metabolizer)) +/datum/reagent/consumable/ethanol/old_timer/affect_blood(mob/living/carbon/human/metabolizer, removed) + if(prob(10)) metabolizer.age += 1 if(metabolizer.age > 70) metabolizer.facial_hair_color = "#cccccc" @@ -2409,8 +2154,6 @@ All effects don't start immediately, but rather get worse over time; the rate is metabolizer.visible_message(span_notice("[metabolizer] becomes older than any man should be.. and crumbles into dust!")) metabolizer.dust(just_ash = FALSE, drop_items = TRUE, force = FALSE) - return ..() - /datum/reagent/consumable/ethanol/rubberneck name = "Rubberneck" description = "A quality rubberneck should not contain any gross natural ingredients." @@ -2421,15 +2164,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "rubberneck" glass_name = "Rubberneck" glass_desc = "A popular drink amongst those adhering to an all synthetic diet." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/rubberneck/on_mob_metabolize(mob/living/drinker) - . = ..() - ADD_TRAIT(drinker, TRAIT_SHOCKIMMUNE, type) -/datum/reagent/consumable/ethanol/rubberneck/on_mob_end_metabolize(mob/living/drinker) - REMOVE_TRAIT(drinker, TRAIT_SHOCKIMMUNE, type) - return ..() +/datum/reagent/consumable/ethanol/rubberneck/on_mob_metabolize(mob/living/carbon/C, class) + ADD_TRAIT(C, TRAIT_SHOCKIMMUNE, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/consumable/ethanol/rubberneck/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_SHOCKIMMUNE, CHEM_TRAIT_SOURCE(class)) /datum/reagent/consumable/ethanol/duplex name = "Duplex" @@ -2441,7 +2182,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "duplex" glass_name = "Duplex" glass_desc = "To imbibe one component separately from the other is consider a great faux pas." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/trappist name = "Trappist Beer" @@ -2453,14 +2194,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "trappistglass" glass_name = "Trappist Beer" glass_desc = "boozy Catholicism in a glass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/trappist/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.mind?.holy_role) - drinker.adjustFireLoss(-2.5 * REM * delta_time, 0) - drinker.adjust_timed_status_effect(-2 SECONDS * REM * delta_time, /datum/status_effect/jitter) - drinker.adjust_timed_status_effect(-2 SECONDS * REM * delta_time, /datum/status_effect/speech/stutter) - return ..() /datum/reagent/consumable/ethanol/blazaam name = "Blazaam" @@ -2473,17 +2207,17 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The glass seems to be sliding between realities. Doubles as a Berenstain remover." var/stored_teleports = 0 -/datum/reagent/consumable/ethanol/blazaam/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.get_drunk_amount() > 40) +/datum/reagent/consumable/ethanol/blazaam/affect_ingest(mob/living/carbon/C, removed) + . = ..() + if(C.get_drunk_amount() > 40) if(stored_teleports) - do_teleport(drinker, get_turf(drinker), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE) + do_teleport(C, get_turf(C), rand(1,3), channel = TELEPORT_CHANNEL_WORMHOLE) stored_teleports-- - if(DT_PROB(5, delta_time)) + if(prob(10)) stored_teleports += rand(2, 6) if(prob(70)) - drinker.vomit(vomit_type = VOMIT_PURPLE) - return ..() + C.vomit(vomit_type = VOMIT_PURPLE) /datum/reagent/consumable/ethanol/planet_cracker @@ -2505,16 +2239,17 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "fiery, with an aftertaste of burnt flesh" glass_icon_state = "mauna_loa" glass_name = "Mauna Loa" - glass_desc = "Lavaland in a drink... mug... volcano... thing." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_desc = "Lava in a drink... mug... volcano... thing." + + ingest_met = 1 -/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) +/datum/reagent/consumable/ethanol/mauna_loa/affect_ingest(mob/living/carbon/C, removed) // Heats the user up while the reagent is in the body. Occasionally makes you burst into flames. - drinker.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time) - if (DT_PROB(2.5, delta_time)) - drinker.adjust_fire_stacks(1) - drinker.ignite_mob() - ..() + C.adjust_bodytemperature(25 * TEMPERATURE_DAMAGE_COEFFICIENT * removed) + if (prob(5)) + C.adjust_fire_stacks(1) + C.ignite_mob() + return ..() /datum/reagent/consumable/ethanol/painkiller name = "Painkiller" @@ -2526,7 +2261,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "painkiller" glass_name = "Painkiller" glass_desc = "A combination of tropical juices and rum. Surely this will make you feel better." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/pina_colada name = "Pina Colada" @@ -2549,11 +2284,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "glass of pruno" glass_desc = "Fermented prison wine made from fruit, sugar, and despair. Security loves to confiscate this, which is the only kind thing Security has ever done." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/pruno/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_disgust(5 * REM * delta_time) - ..() + +/datum/reagent/consumable/ethanol/pruno/affect_ingest(mob/living/carbon/C, removed) + C.adjust_disgust(5 * removed) + return ..() /datum/reagent/consumable/ethanol/ginger_amaretto name = "Ginger Amaretto" @@ -2565,7 +2300,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "gingeramaretto" glass_name = "Ginger Amaretto" glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/godfather name = "Godfather" @@ -2577,7 +2312,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godfather" glass_name = "Godfather" glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/ethanol/godmother @@ -2590,11 +2325,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "godmother" glass_name = "Godmother" glass_desc = "A lovely fresh smelling cocktail, a true Sicilian delight." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/kortara name = "Kortara" - description = "A sweet, milky nut-based drink enjoyed on Tizira. Frequently mixed with fruit juices and cocoa for extra refreshment." + description = "A sweet, milky nut-based drink enjoyed on Jitarai. Frequently mixed with fruit juices and cocoa for extra refreshment." boozepwr = 25 color = "#EEC39A" quality = DRINK_GOOD @@ -2602,12 +2337,13 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "kortara_glass" glass_name = "glass of kortara" glass_desc = "The fermented nectar of the Korta nut, as enjoyed by lizards galaxywide." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/kortara/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.getBruteLoss() && DT_PROB(10, delta_time)) - drinker.heal_bodypart_damage(1,0, 0) + +/datum/reagent/consumable/ethanol/kortara/affect_ingest(mob/living/carbon/C, removed) + if(C.getBruteLoss() && prob(10)) + C.heal_bodypart_damage(0.5 * removed, 0, 0) . = TRUE + return ..() || . /datum/reagent/consumable/ethanol/sea_breeze name = "Sea Breeze" @@ -2619,23 +2355,22 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "sea_breeze" glass_name = "Sea Breeze" glass_desc = "Minty, chocolatey, and creamy. It's like drinkable mint chocolate chip!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/sea_breeze/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.apply_status_effect(/datum/status_effect/throat_soothed) - ..() +/datum/reagent/consumable/ethanol/sea_breeze/affect_ingest(mob/living/carbon/C, removed) + C.apply_status_effect(/datum/status_effect/throat_soothed) + return ..() /datum/reagent/consumable/ethanol/white_tiziran - name = "White Tiziran" + name = "White Vodtara" description = "A mix of vodka and kortara. The Lizard imbibes." boozepwr = 65 color = "#A68340" quality = DRINK_GOOD taste_description = "strikes and gutters" glass_icon_state = "white_tiziran" - glass_name = "White Tiziran" + glass_name = "White Vodtara" glass_desc = "I had a rough night and I hate the fucking humans, man." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/drunken_espatier name = "Drunken Espatier" @@ -2647,12 +2382,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "drunken_espatier" glass_name = "Drunken Espatier" glass_desc = "A drink to make facing death easier." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/drunken_espatier/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.hal_screwyhud = SCREWYHUD_HEALTHY //almost makes you forget how much it hurts - SEND_SIGNAL(drinker, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name) //comfortably numb - ..() + +/datum/reagent/consumable/ethanol/drunken_espatier/affect_ingest(mob/living/carbon/C, removed) + . = ..() + C.hal_screwyhud = SCREWYHUD_HEALTHY //almost makes you forget how much it hurts /datum/reagent/consumable/ethanol/protein_blend name = "Protein Blend" @@ -2663,21 +2397,28 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_description = "regret" glass_icon_state = "protein_blend" glass_name = "Protein Blend" - glass_desc = "Vile, even by unathi standards." + glass_desc = "Vile, even by Jinan standards." nutriment_factor = 3 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/protein_blend/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - drinker.adjust_nutrition(2 * REM * delta_time) - if(!islizard(drinker)) - drinker.adjust_disgust(5 * REM * delta_time) + +/datum/reagent/consumable/ethanol/protein_blend/affect_blood(mob/living/carbon/C, removed) + C.adjust_nutrition(2 * removed) + if(!islizard(C)) + C.adjust_disgust(5 * removed) else - drinker.adjust_disgust(2 * REM * delta_time) - ..() + C.adjust_disgust(2 * removed) + +/datum/reagent/consumable/ethanol/protein_blend/affect_ingest(mob/living/carbon/C, removed) + C.adjust_nutrition(2 * removed) + if(!islizard(C)) + C.adjust_disgust(5 * removed) + else + C.adjust_disgust(2 * removed) + return ..() /datum/reagent/consumable/ethanol/mushi_kombucha name = "Mushi Kombucha" - description = "A popular summer beverage on Tizira, made from sweetened mushroom tea." + description = "A popular Sol-summer beverage made from sweetened mushroom tea." boozepwr = 10 color = "#C46400" quality = DRINK_VERYGOOD @@ -2685,11 +2426,11 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "glass_orange" glass_name = "glass of mushi kombucha" glass_desc = "A glass of (slightly alcoholic) fermented sweetened mushroom tea. Refreshing, if a little strange." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/triumphal_arch name = "Triumphal Arch" - description = "A drink celebrating the Unathi Empire and its military victories. It's popular at bars on Unification Day." + description = "A drink celebrating the Jinan Unified Government. It's popular at bars on Unification Day." boozepwr = 60 color = "#FFD700" quality = DRINK_FANTASTIC @@ -2697,12 +2438,6 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "triumphal_arch" glass_name = "Triumphal Arch" glass_desc = "A toast to the Empire, long may it stand." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/ethanol/triumphal_arch/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(islizard(drinker)) - SEND_SIGNAL(drinker, COMSIG_ADD_MOOD_EVENT, "triumph", /datum/mood_event/memories_of_home, name) - ..() /datum/reagent/consumable/ethanol/the_juice name = "The Juice" @@ -2714,18 +2449,18 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "thejuice" glass_name = "The Juice" glass_desc = "A concoction of not-so-edible things that apparently lets you feel like you're in two places at once" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/datum/brain_trauma/special/bluespace_prophet/prophet_trauma -/datum/reagent/consumable/ethanol/the_juice/on_mob_metabolize(mob/living/carbon/drinker) - . = ..() - prophet_trauma = new() - drinker.gain_trauma(prophet_trauma, TRAUMA_RESILIENCE_ABSOLUTE) +/datum/reagent/consumable/ethanol/the_juice/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + prophet_trauma = new() + C.gain_trauma(prophet_trauma, TRAUMA_RESILIENCE_ABSOLUTE) -/datum/reagent/consumable/ethanol/the_juice/on_mob_end_metabolize(mob/living/carbon/drinker) - if(prophet_trauma) - QDEL_NULL(prophet_trauma) - return ..() +/datum/reagent/consumable/ethanol/the_juice/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + if(prophet_trauma) + QDEL_NULL(prophet_trauma) //a jacked up absinthe that causes hallucinations to the game master controller basically, used in smuggling objectives /datum/reagent/consumable/ethanol/ritual_wine @@ -2736,15 +2471,17 @@ All effects don't start immediately, but rather get worse over time; the rate is taste_mult = 6 taste_description = "concentrated herbs" -/datum/reagent/consumable/ethanol/ritual_wine/on_mob_metabolize(mob/living/psychonaut) - . = ..() +/datum/reagent/consumable/ethanol/ritual_wine/on_mob_metabolize(mob/living/psychonaut, class) + if(class != CHEM_INGEST) + return if(!psychonaut.hud_used) return var/atom/movable/plane_master_controller/game_plane_master_controller = psychonaut.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] game_plane_master_controller.add_filter("ritual_wine", 1, list("type" = "wave", "size" = 1, "x" = 5, "y" = 0, "flags" = WAVE_SIDEWAYS)) -/datum/reagent/consumable/ethanol/ritual_wine/on_mob_end_metabolize(mob/living/psychonaut) - . = ..() +/datum/reagent/consumable/ethanol/ritual_wine/on_mob_end_metabolize(mob/living/psychonaut, class) + if(class != CHEM_INGEST) + return if(!psychonaut.hud_used) return var/atom/movable/plane_master_controller/game_plane_master_controller = psychonaut.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] @@ -2761,7 +2498,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "curacao" glass_name = "glass of curaçao" glass_desc = "It's blue, da ba dee." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/navy_rum //IN THE NAVY name = "Navy Rum" @@ -2773,7 +2510,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "ginvodkaglass" glass_name = "glass of navy rum" glass_desc = "Splice the mainbrace, and God save the King." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/bitters //why do they call them bitters, anyway? they're more spicy than anything else name = "Andromeda Bitters" @@ -2785,7 +2522,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "bitters" glass_name = "glass of bitters" glass_desc = "Typically you'd want to mix this with something- but you do you." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/admiralty //navy rum, vermouth, fernet name = "Admiralty" @@ -2797,7 +2534,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "admiralty" glass_name = "Admiralty" glass_desc = "Hail to the Admiral, for he brings fair tidings, and rum too." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/long_haul //Rum, Curacao, Sugar, dash of bitters, lengthened with soda water name = "Long Haul" @@ -2809,7 +2546,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "long_haul" glass_name = "Long Haul" glass_desc = "A perfect companion for a lonely long haul flight." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/long_john_silver //navy rum, bitters, lemonade name = "Long John Silver" @@ -2821,7 +2558,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "long_john_silver" glass_name = "Long John Silver" glass_desc = "Named for a famous pirate, who may or may not have been fictional. But hey, why let the truth get in the way of a good yarn?" //Chopper Reid says "How the fuck are ya?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/tropical_storm //dark rum, pineapple juice, triple citrus, curacao name = "Tropical Storm" @@ -2833,7 +2570,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tropical_storm" glass_name = "Tropical Storm" glass_desc = "Less destructive than the real thing." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/dark_and_stormy //rum and ginger beer- simple and classic name = "Dark and Stormy" @@ -2845,7 +2582,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "dark_and_stormy" glass_name = "Dark and Stormy" glass_desc = "Thunder and lightning, very very frightening." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/salt_and_swell //navy rum, tochtause syrup, egg whites, dash of saline-glucose solution name = "Salt and Swell" @@ -2857,7 +2594,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "salt_and_swell" glass_name = "Salt and Swell" glass_desc = "Ah, I do like to be beside the seaside." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/tiltaellen //yoghurt, salt, vinegar name = "Tiltällen" @@ -2869,7 +2606,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tiltaellen" glass_name = "glass of tiltällen" glass_desc = "Eww... it's curdled." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/tich_toch name = "Tich Toch" @@ -2881,7 +2618,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_icon_state = "tich_toch" glass_name = "Tich Toch" glass_desc = "Oh god." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ethanol/helianthus name = "Helianthus" @@ -2895,9 +2632,9 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Another reason to cut off an ear..." var/hal_amt = 4 var/hal_cap = 24 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ethanol/helianthus/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(drinker.hallucination < hal_cap && DT_PROB(5, delta_time)) - drinker.hallucination += hal_amt - ..() + +/datum/reagent/consumable/ethanol/helianthus/affect_ingest(mob/living/carbon/C, removed) + if(C.hallucination < hal_cap && prob(5)) + C.hallucination += hal_amt * removed + return ..() diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm deleted file mode 100644 index d9ecd7380171..000000000000 --- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm +++ /dev/null @@ -1,556 +0,0 @@ -// Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful. -/datum/reagent/medicine/c2 - harmful = TRUE - metabolization_rate = 0.5 * REAGENTS_METABOLISM - inverse_chem = null //Some of these use inverse chems - we're just defining them all to null here to avoid repetition, eventually this will be moved up to parent - creation_purity = REAGENT_STANDARD_PURITY//All sources by default are 0.75 - reactions are primed to resolve to roughly the same with no intervention for these. - purity = REAGENT_STANDARD_PURITY - inverse_chem_val = 0 - inverse_chem = null - chemical_flags = REAGENT_SPLITRETAINVOL - abstract_type = /datum/reagent/medicine/c2 - -/******BRUTE******/ -/*Suffix: -bital*/ - -/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit. - name = "Helbital" - description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation." - color = "#9400D3" - taste_description = "cold and lifeless" - ph = 8 - overdose_threshold = 35 - reagent_state = SOLID - inverse_chem_val = 0.3 - inverse_chem = /datum/reagent/inverse/helgrasp - var/helbent = FALSE - var/reaping = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = TRUE - var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss())*normalise_creation_purity() - var/thou_shall_heal = 0 - var/good_kind_of_healing = FALSE - switch(M.stat) - if(CONSCIOUS) //bad - thou_shall_heal = death_is_coming/50 - M.adjustOxyLoss(2 * REM * delta_time, TRUE) - if(SOFT_CRIT) //meh convert - thou_shall_heal = round(death_is_coming/47,0.1) - M.adjustOxyLoss(1 * REM * delta_time, TRUE) - else //no convert - thou_shall_heal = round(death_is_coming/45, 0.1) - good_kind_of_healing = TRUE - M.adjustBruteLoss(-thou_shall_heal * REM * delta_time, FALSE) - - if(good_kind_of_healing && !reaping && DT_PROB(0.00005, delta_time)) //janken with the grim reaper! - reaping = TRUE - var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to - if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING)) - helbent = TRUE - to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?")) - var/timeisticking = world.time - var/RPSchoice = tgui_alert(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors", RockPaperScissors, 60) - if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time)) - reaping = FALSE - return //good job, you ruined it - if(!RPSchoice) - to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon.")) - reaping = FALSE - return - var/grim = pick(RockPaperScissors) - if(grim == RPSchoice) //You Tied! - to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now.")) - reaping = FALSE - else if(RockPaperScissors[RPSchoice] == grim) //You lost! - to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body.")) - M.dust() - return - else //VICTORY ROYALE - to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds.")) - M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M) - M.revive(full_heal = TRUE, admin_revive = FALSE) - holder.del_reagent(type) - return - - ..() - return - -/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M, delta_time, times_fired) - if(!helbent) - M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING) - helbent = TRUE - ..() - return TRUE - -/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L) - if(helbent) - L.remove_status_effect(/datum/status_effect/necropolis_curse) - ..() - -/datum/reagent/medicine/c2/libital //messes with your liber - name = "Libital" - description = "A bruise reliever. Does minor liver damage." - color = "#ECEC8D" // rgb: 236 236 141 - ph = 8.2 - taste_description = "bitter with a hint of alcohol" - reagent_state = SOLID - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * delta_time) - M.adjustBruteLoss(-3 * REM * normalise_creation_purity() * delta_time) - ..() - return TRUE - -/datum/reagent/medicine/c2/probital - name = "Probital" - description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further." - reagent_state = SOLID - color = "#FFFF6B" - ph = 5.5 - overdose_threshold = 20 - inverse_chem_val = 0.5//Though it's tough to get - inverse_chem = /datum/reagent/medicine/metafactor //Seems thematically intact - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustBruteLoss(-2.25 * REM * normalise_creation_purity() * delta_time, FALSE) - var/ooo_youaregettingsleepy = 3.5 - switch(M.stamina.loss_as_percent) - if(10 to 40) - ooo_youaregettingsleepy = 3 - if(41 to 60) - ooo_youaregettingsleepy = 2.5 - if(61 to 100) //you really can only go to 120 - ooo_youaregettingsleepy = 2 - M.stamina.adjust(-ooo_youaregettingsleepy * REM * delta_time, FALSE) - ..() - . = TRUE - -/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M, delta_time, times_fired) - M.stamina.adjust(-3 * REM * delta_time, 0) - if(M.stamina.loss_as_percent >= 30) - M.adjust_drowsyness(1 * REM * delta_time) - if(M.stamina.loss_as_percent >= 50) - to_chat(M,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit...")) - M.stamina.adjust(100) - M.Sleeping(10 SECONDS) - ..() - . = TRUE - -/datum/reagent/medicine/c2/probital/on_transfer(atom/A, methods=INGEST, trans_volume) - if(!(methods & INGEST) || (!iscarbon(A) && !istype(A, /obj/item/organ/stomach)) ) - return - - A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05) - A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25) - - ..() - -/******BURN******/ -/*Suffix: -uri*/ -/datum/reagent/medicine/c2/lenturi - name = "Lenturi" - description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system." - reagent_state = LIQUID - color = "#6171FF" - ph = 4.7 - var/resetting_probability = 0 //What are these for?? Can I remove them? - var/spammer = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustFireLoss(-3 * REM * normalise_creation_purity() * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM * delta_time) - ..() - return TRUE - -/datum/reagent/medicine/c2/aiuri - name = "Aiuri" - description = "Used to treat burns. Does minor eye damage." - reagent_state = LIQUID - color = "#8C93FF" - ph = 4 - var/resetting_probability = 0 //same with this? Old legacy vars that should be removed? - var/message_cd = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustFireLoss(-2 * REM * normalise_creation_purity() * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_EYES, 0.25 * REM * delta_time) - ..() - return TRUE - -/datum/reagent/medicine/c2/hercuri - name = "Hercuri" - description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia." - reagent_state = LIQUID - color = "#F7FFA5" - overdose_threshold = 25 - reagent_weight = 0.6 - ph = 8.9 - inverse_chem = /datum/reagent/inverse/hercuri - inverse_chem_val = 0.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getFireLoss() > 50) - M.adjustFireLoss(-2 * REM * delta_time * normalise_creation_purity(), FALSE) - else - M.adjustFireLoss(-1.25 * REM * delta_time * normalise_creation_purity(), FALSE) - M.adjust_bodytemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 50) - if(ishuman(M)) - var/mob/living/carbon/human/humi = M - humi.adjust_coretemperature(rand(-25,-5) * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 50) - M.reagents?.chem_temp += (-10 * REM * delta_time) - M.adjust_fire_stacks(-1 * REM * delta_time) - ..() - . = TRUE - -/datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) - . = ..() - if(!(methods & VAPOR)) - return - - exposed_mob.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - exposed_mob.adjust_fire_stacks(reac_volume / -2) - if(reac_volume >= metabolization_rate) - exposed_mob.extinguish_mob() - -/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 50) //chilly chilly - if(ishuman(M)) - var/mob/living/carbon/human/humi = M - humi.adjust_coretemperature(-10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 50) - ..() - - -/******OXY******/ -/*Suffix: -mol*/ -#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox - -/datum/reagent/medicine/c2/convermol - name = "Convermol" - description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation." - reagent_state = LIQUID - color = "#FF6464" - overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long - ph = 5.6 - inverse_chem_val = 0.5 - inverse_chem = /datum/reagent/inverse/healing/convermol - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M, delta_time, times_fired) - var/oxycalc = 2.5 * REM * current_cycle - if(!overdosed) - oxycalc = min(oxycalc, M.getOxyLoss() + 0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing. - M.adjustOxyLoss(-oxycalc * delta_time * normalise_creation_purity(), 0) - M.adjustToxLoss(oxycalc * delta_time / CONVERMOL_RATIO, 0) - if(DT_PROB(current_cycle / 2, delta_time) && M.losebreath) - M.losebreath-- - ..() - return TRUE - -/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M, delta_time, times_fired) - metabolization_rate += 2.5 * REAGENTS_METABOLISM - ..() - return TRUE - -#undef CONVERMOL_RATIO - -/datum/reagent/medicine/c2/tirimol - name = "Tirimol" - description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes." - color = "#FF6464" - ph = 5.6 - inverse_chem = /datum/reagent/inverse/healing/tirimol - inverse_chem_val = 0.4 - /// A cooldown for spacing bursts of stamina damage - COOLDOWN_DECLARE(drowsycd) - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - -/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M, delta_time, times_fired) - M.adjustOxyLoss(-3 * REM * delta_time * normalise_creation_purity()) - M.stamina.adjust(-2 * REM * delta_time) - if(drowsycd && COOLDOWN_FINISHED(src, drowsycd)) - M.adjust_drowsyness(10) - COOLDOWN_START(src, drowsycd, 45 SECONDS) - else if(!drowsycd) - COOLDOWN_START(src, drowsycd, 15 SECONDS) - ..() - return TRUE - -/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L) - if(current_cycle > 20) - L.Sleeping(10 SECONDS) - ..() - -/******TOXIN******/ -/*Suffix: -iver*/ - -/datum/reagent/medicine/c2/seiver //a bit of a gray joke - name = "Seiver" - description = "A medicine that shifts functionality based on temperature. Hotter temperatures will remove amounts of toxins, while coder temperatures will heal larger amounts of toxins only while the patient is irradiated. Damages the heart." //CHEM HOLDER TEMPS, NOT AIR TEMPS - var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads. - inverse_chem_val = 0.3 - ph = 3.7 - inverse_chem = /datum/reagent/inverse/technetium - inverse_chem_val = 0.45 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/M) - . = ..() - radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once. - -/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/M, delta_time, times_fired) - var/chemtemp = min(holder.chem_temp, 1000) - chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty - var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints - - //you're hot - var/toxcalc = min(round(5 + ((chemtemp-1000)/175), 0.1), 5) * REM * delta_time * normalise_creation_purity() //max 2.5 tox healing per second - if(toxcalc > 0) - M.adjustToxLoss(-toxcalc * delta_time * normalise_creation_purity()) - healypoints += toxcalc - - //and you're cold - var/radcalc = round((T0C-chemtemp) / 6, 0.1) * REM * delta_time //max ~45 rad loss unless you've hit below 0K. if so, wow. - if(radcalc > 0 && HAS_TRAIT(M, TRAIT_IRRADIATED)) - radcalc *= normalise_creation_purity() - // no cost percent healing if you are SUPER cold (on top of cost healing) - if(chemtemp < radbonustemp*0.1) - M.adjustToxLoss(-radcalc * (0.9**(REM * delta_time))) - else if(chemtemp < radbonustemp) - M.adjustToxLoss(-radcalc * (0.75**(REM * delta_time))) - healypoints += (radcalc / 5) - - //you're yes and... oh no! - healypoints = round(healypoints, 0.1) - M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints / 5) - ..() - return TRUE - -/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines - name = "Multiver" - description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)." - inverse_chem = /datum/reagent/inverse/healing/monover - inverse_chem_val = 0.35 - ph = 9.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M, delta_time, times_fired) - var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1 - for(var/r in M.reagents.reagent_list) - var/datum/reagent/the_reagent = r - if(istype(the_reagent, /datum/reagent/medicine)) - medibonus += 1 - if(creation_purity >= 1) //Perfectly pure multivers gives a bonus of 2! - medibonus += 1 - M.adjustToxLoss(-0.5 * min(medibonus, 3 * normalise_creation_purity()) * REM * delta_time) //not great at healing but if you have nothing else it will work - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * delta_time) //kills at 40u - for(var/r2 in M.reagents.reagent_list) - var/datum/reagent/the_reagent2 = r2 - if(the_reagent2 == src) - continue - var/amount2purge = 3 - if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) | (1 + pure multiver) will make it not purge medicines - continue - M.reagents.remove_reagent(the_reagent2.type, amount2purge * REM * delta_time) - ..() - return TRUE - -// Antitoxin binds plants pretty well. So the tox goes significantly down -/datum/reagent/medicine/c2/multiver/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - mytray.adjust_toxic(-(round(chems.get_reagent_amount(type) * 2)*normalise_creation_purity())) //0-2.66, 2 by default (0.75 purity). - -#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either - -/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge - name = "Syriniver" - description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver." - reagent_state = LIQUID - color = "#8CDF24" // heavy saturation to make the color blend better - metabolization_rate = 0.75 * REAGENTS_METABOLISM - overdose_threshold = 6 - ph = 8.6 - var/conversion_amount - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, methods=INJECT, trans_volume) - if(!(methods & INJECT) || !iscarbon(A)) - return - var/mob/living/carbon/C = A - if(trans_volume >= 0.6) //prevents cheesing with ultralow doses. - C.adjustToxLoss((-1.5 * min(2, trans_volume) * REM) * normalise_creation_purity(), 0) //This is to promote iv pole use for that chemotherapy feel. - var/obj/item/organ/liver/L = C.organs_by_slot[ORGAN_SLOT_LIVER] - if((L.organ_flags & ORGAN_FAILING) || !L) - return - conversion_amount = (trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100)*normalise_creation_purity()) //the more damaged the liver the worse we metabolize. - C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount) - C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount) - ..() - -/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8 * REM * delta_time) - M.adjustToxLoss(-1 * REM * delta_time, 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(issyrinormusc(R)) - continue - M.reagents.remove_reagent(R.type, 0.4 * REM * delta_time) - - ..() - . = TRUE - -/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * delta_time) - M.adjust_disgust(3 * REM * delta_time) - M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM * delta_time) - ..() - . = TRUE - -/datum/reagent/medicine/c2/musiver //MUScles - name = "Musiver" - description = "The active metabolite of syriniver. Causes muscle weakness on overdose" - reagent_state = LIQUID - color = "#DFD54E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 25 - ph = 9.1 - var/datum/brain_trauma/mild/muscle_weakness/U - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1 * REM * delta_time) - M.adjustToxLoss(-1 * REM * delta_time * normalise_creation_purity(), 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(issyrinormusc(R)) - continue - M.reagents.remove_reagent(R.type, 0.2 * REM * delta_time) - ..() - . = TRUE - -/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M) - U = new() - M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE) - ..() - -/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M) - if(U) - QDEL_NULL(U) - return ..() - -/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * delta_time) - M.adjust_disgust(3 * REM * delta_time) - ..() - . = TRUE - -#undef issyrinormusc -/******COMBOS******/ -/*Suffix: Combo of healing, prob gonna get wack REAL fast*/ -/datum/reagent/medicine/c2/synthflesh - name = "Synthflesh" - description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). 100u or more can restore corpses husked by burns. Touch application only." - reagent_state = LIQUID - color = "#FFEBEB" - ph = 7.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/synthflesh/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) - . = ..() - if(!iscarbon(exposed_mob)) - return - var/mob/living/carbon/carbies = exposed_mob - if(carbies.stat == DEAD) - show_message = 0 - if(!(methods & (PATCH|TOUCH|VAPOR))) - return - var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1) - var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1) - - carbies.adjustToxLoss((harmies+burnies)*(0.5 + (0.25*(1-creation_purity)))) //0.5 - 0.75 - if(show_message) - to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!")) - SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine) - if(HAS_TRAIT_FROM(exposed_mob, TRAIT_HUSK, BURN) && carbies.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/synthflesh) + reac_volume >= SYNTHFLESH_UNHUSK_AMOUNT)) - carbies.cure_husk(BURN) - carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something - -/******ORGAN HEALING******/ -/*Suffix: -rite*/ -/* -*How this medicine works: -*Penthrite if you are not in crit only stabilizes your heart. -*As soon as you pass crit threshold it's special effects kick in. Penthrite forces your heart to beat preventing you from entering -*soft and hard crit, but there is a catch. During this you will be healed and you will sustain -*heart damage that will not imapct you as long as penthrite is in your system. -*If you reach the threshold of -60 HP penthrite stops working and you get a heart attack, penthrite is flushed from your system in that very moment, -*causing you to loose your soft crit, hard crit and heart stabilization effects. -*Overdosing on penthrite also causes a heart failure. -*/ -/datum/reagent/medicine/c2/penthrite - name = "Penthrite" - description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. Mixing it with epinephrine or atropine will cause an explosion." - color = "#F5F5F5" - overdose_threshold = 50 - ph = 12.7 - inverse_chem = /datum/reagent/inverse/penthrite - inverse_chem_val = 0.25 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/c2/penthrite/on_mob_metabolize(mob/living/user) - . = ..() - user.balloon_alert(user, "your heart beats with a great force") - ADD_TRAIT(user, TRAIT_STABLEHEART, type) - ADD_TRAIT(user, TRAIT_NOHARDCRIT,type) - ADD_TRAIT(user, TRAIT_NOSOFTCRIT,type) - ADD_TRAIT(user, TRAIT_NOCRITDAMAGE,type) - -/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H, delta_time, times_fired) - H.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.25 * REM * delta_time) - if(H.health <= H.crit_threshold && H.health > (H.crit_threshold + H.hardcrit_threshold * (2 * normalise_creation_purity()))) //we cannot save someone below our lowered crit threshold. - - H.adjustToxLoss(-2 * REM * delta_time, 0) - H.adjustBruteLoss(-2 * REM * delta_time, 0) - H.adjustFireLoss(-2 * REM * delta_time, 0) - H.adjustOxyLoss(-6 * REM * delta_time, 0) - - H.losebreath = 0 - - H.adjustOrganLoss(ORGAN_SLOT_HEART, max(volume/10, 1) * REM * delta_time) // your heart is barely keeping up! - - H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - - if(DT_PROB(18, delta_time)) - to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!")) - - if(H.health <= (H.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*(2*normalise_creation_purity()))) //certain death below this threshold - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart trait before we give them a heart attack - to_chat(H,span_danger("You feel something rupturing inside your chest!")) - H.emote("scream") - H.set_heartattack(TRUE) - volume = 0 - . = ..() - -/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/user) - user.balloon_alert(user, "your heart relaxes") - REMOVE_TRAIT(user, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(user, TRAIT_NOHARDCRIT,type) - REMOVE_TRAIT(user, TRAIT_NOSOFTCRIT,type) - REMOVE_TRAIT(user, TRAIT_NOCRITDAMAGE,type) - . = ..() - -/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H, delta_time, times_fired) - REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) - H.stamina.adjust(-10 * REM * delta_time) - H.adjustOrganLoss(ORGAN_SLOT_HEART, 10 * REM * delta_time) - H.set_heartattack(TRUE) - - -/******NICHE******/ -//todo diff --git a/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm b/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm deleted file mode 100644 index 375c29359b43..000000000000 --- a/code/modules/reagents/chemistry/reagents/catalyst_reagents.dm +++ /dev/null @@ -1,53 +0,0 @@ -///These alter reaction conditions while they're in the beaker -/datum/reagent/catalyst_agent - name ="Catalyst agent" - abstract_type = /datum/reagent/catalyst_agent - ///The typepath of the reagent they that they affect - var/target_reagent_type - ///The minimumvolume required in the beaker for them to have an effect - var/min_volume = 10 - ///The value in which the associated type is modified - var/modifier = 1 - -/datum/reagent/catalyst_agent/proc/consider_catalyst(datum/equilibrium/equilibrium) - for(var/_product in equilibrium.reaction.results) - if(ispath(_product, target_reagent_type)) - return TRUE - return FALSE - -/datum/reagent/catalyst_agent/speed - name ="Speed catalyst agent" - abstract_type = /datum/reagent/catalyst_agent/speed - -/datum/reagent/catalyst_agent/speed/consider_catalyst(datum/equilibrium/equilibrium) - . = ..() - if(.) - equilibrium.speed_mod = creation_purity*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier. For this we don't want a negative speed_mod (I have no idea what happens if we do) - equilibrium.time_deficit += (creation_purity)*(0.05 * modifier) //give the reaction a little boost too (40% faster) - -/datum/reagent/catalyst_agent/ph - name ="pH catalyst agent" - abstract_type = /datum/reagent/catalyst_agent/ph - -/datum/reagent/catalyst_agent/ph/consider_catalyst(datum/equilibrium/equilibrium) - . = ..() - if(.) - equilibrium.h_ion_mod = ((creation_purity-0.5)*2)*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier - -/datum/reagent/catalyst_agent/temperature - name = "Temperature Catalyst Agent" - abstract_type = /datum/reagent/catalyst_agent/temperature - -/datum/reagent/catalyst_agent/temperature/consider_catalyst(datum/equilibrium/equilibrium) - . = ..() - if(.) - equilibrium.thermic_mod = ((creation_purity-0.5)*2)*modifier //So a purity 1 = the modifier, and a purity 0 = the inverse modifier - -///These affect medicines -/datum/reagent/catalyst_agent/speed/medicine - name = "Palladium Synthate Catalyst" - description = "This catalyst reagent will speed up all medicine reactions that it shares a beaker with by a dramatic amount." - target_reagent_type = /datum/reagent/medicine - modifier = 2 - ph = 2 //drift towards acidity - color = "#b1b1b1" diff --git a/code/modules/reagents/chemistry/reagents/colorful_reagents.dm b/code/modules/reagents/chemistry/reagents/colorful_reagents.dm new file mode 100644 index 000000000000..181f25062281 --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/colorful_reagents.dm @@ -0,0 +1,164 @@ +/datum/reagent/colorful_reagent + name = "Colorful Reagent" + description = "Thoroughly sample the rainbow." + reagent_state = LIQUID + var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") + color = "#C8A5DC" + taste_description = "rainbows" + var/can_colour_mobs = TRUE + + var/datum/callback/color_callback + +/datum/reagent/colorful_reagent/New() + color_callback = CALLBACK(src, PROC_REF(UpdateColor)) + SSticker.OnRoundstart(color_callback) + return ..() + +/datum/reagent/colorful_reagent/Destroy() + LAZYREMOVE(SSticker.round_end_events, color_callback) //Prevents harddels during roundstart + color_callback = null //Fly free little callback + return ..() + +/datum/reagent/colorful_reagent/proc/UpdateColor() + color_callback = null + color = pick(random_color_list) + +/datum/reagent/colorful_reagent/affect_blood(mob/living/carbon/C, removed) + if(can_colour_mobs) + C.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY) + +/datum/reagent/colorful_reagent/affect_touch(mob/living/carbon/C, removed) + if(can_colour_mobs) + C.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY) + +/// Colors anything it touches a random color. +/datum/reagent/colorful_reagent/expose_atom(atom/exposed_atom, reac_volume) + . = ..() + if(!isliving(exposed_atom) || can_colour_mobs) + exposed_atom.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY) + +/////////////////////////Colorful Powder//////////////////////////// +//For colouring in /proc/mix_color_from_reagents + +/datum/reagent/colorful_reagent/powder + name = "Mundane Powder" //the name's a bit similar to the name of colorful reagent, but hey, they're practically the same chem anyway + var/colorname = "none" + description = "A powder that is used for coloring things." + reagent_state = SOLID + color = "#FFFFFF" // rgb: 207, 54, 0 + taste_description = "the back of class" + +/datum/reagent/colorful_reagent/powder/New() + if(colorname == "none") + description = "A rather mundane-looking powder. It doesn't look like it'd color much of anything..." + else if(colorname == "invisible") + description = "An invisible powder. Unfortunately, since it's invisible, it doesn't look like it'd color much of anything..." + else + description = "\An [colorname] powder, used for coloring things [colorname]." + return ..() + +/datum/reagent/colorful_reagent/powder/red + name = "Red Powder" + colorname = "red" + color = "#DA0000" // red + random_color_list = list("#FC7474") + + +/datum/reagent/colorful_reagent/powder/orange + name = "Orange Powder" + colorname = "orange" + color = "#FF9300" // orange + random_color_list = list("#FF9300") + +/datum/reagent/colorful_reagent/powder/yellow + name = "Yellow Powder" + colorname = "yellow" + color = "#FFF200" // yellow + random_color_list = list("#FFF200") + + +/datum/reagent/colorful_reagent/powder/green + name = "Green Powder" + colorname = "green" + color = "#A8E61D" // green + random_color_list = list("#A8E61D") + + +/datum/reagent/colorful_reagent/powder/blue + name = "Blue Powder" + colorname = "blue" + color = "#00B7EF" // blue + random_color_list = list("#71CAE5") + + +/datum/reagent/colorful_reagent/powder/purple + name = "Purple Powder" + colorname = "purple" + color = "#DA00FF" // purple + random_color_list = list("#BD8FC4") + + +/datum/reagent/colorful_reagent/powder/invisible + name = "Invisible Powder" + colorname = "invisible" + color = "#FFFFFF00" // white + no alpha + random_color_list = list("#FFFFFF") //because using the powder color turns things invisible + + +/datum/reagent/colorful_reagent/powder/black + name = "Black Powder" + colorname = "black" + color = "#1C1C1C" // not quite black + random_color_list = list("#8D8D8D") //more grey than black, not enough to hide your true colors + + +/datum/reagent/colorful_reagent/powder/white + name = "White Powder" + colorname = "white" + color = "#FFFFFF" // white + random_color_list = list("#FFFFFF") //doesn't actually change appearance at all + + +/* used by crayons, can't color living things but still used for stuff like food recipes */ + +/datum/reagent/colorful_reagent/powder/red/crayon + name = "Red Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/orange/crayon + name = "Orange Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/yellow/crayon + name = "Yellow Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/green/crayon + name = "Green Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/blue/crayon + name = "Blue Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/purple/crayon + name = "Purple Crayon Powder" + can_colour_mobs = FALSE + + +//datum/reagent/colorful_reagent/powder/invisible/crayon + +/datum/reagent/colorful_reagent/powder/black/crayon + name = "Black Crayon Powder" + can_colour_mobs = FALSE + + +/datum/reagent/colorful_reagent/powder/white/crayon + name = "White Crayon Powder" + can_colour_mobs = FALSE + diff --git a/code/modules/reagents/chemistry/reagents/dispenser_reagents.dm b/code/modules/reagents/chemistry/reagents/dispenser_reagents.dm new file mode 100644 index 000000000000..0a3fb672387f --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/dispenser_reagents.dm @@ -0,0 +1,386 @@ +/datum/reagent/aluminium + name = "Aluminium" + taste_description = "metal" + taste_mult = 1.1 + description = "A silvery white and ductile member of the boron group of chemical elements." + reagent_state = SOLID + color = "#a8a8a8" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/ammonia + name = "Ammonia" + taste_description = "mordant" + taste_mult = 2 + description = "A caustic substance commonly used in fertilizer or household cleaners." + reagent_state = LIQUID + color = "#404030" + metabolization_rate = 0.1 + overdose_threshold = 5 + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/ammonia/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(removed * 1.5, FALSE) + return TRUE + +/datum/reagent/ammonia/overdose_process(mob/living/carbon/C) + C.adjustToxLoss(0.5, FALSE) + return TRUE + +/datum/reagent/carbon + name = "Carbon" + description = "A chemical element, the building block of life." + taste_description = "sour chalk" + taste_mult = 1.5 + reagent_state = SOLID + color = "#1c1300" + ingest_met = 2 + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/carbon/affect_ingest(mob/living/carbon/C, removed) + var/datum/reagents/ingested = C.get_ingested_reagents() + if (ingested && length(ingested.reagent_list) > 1) // Need to have at least 2 reagents - cabon and something to remove + var/effect = 1 / (length(ingested.reagent_list) - 1) + for(var/datum/reagent/R in ingested.reagent_list) + if(R == src) + continue + ingested.remove_reagent(R.type, removed * effect) + return ..() + +/datum/reagent/carbon/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) + . = ..() + if(isspaceturf(exposed_turf)) + return + + var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, exposed_turf) + if (!dirtoverlay) + dirtoverlay = new/obj/effect/decal/cleanable/dirt(exposed_turf) + dirtoverlay.alpha = reac_volume * 30 + else + dirtoverlay.alpha = min(dirtoverlay.alpha + reac_volume * 30, 255) + +/datum/reagent/copper + name = "Copper" + description = "A highly ductile metal." + taste_description = "copper" + color = "#6e3b08" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/iron + name = "Iron" + description = "Pure iron is a metal." + taste_description = "metal" + reagent_state = SOLID + color = "#353535" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/iron/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustBloodVolume(2 * removed) + +/datum/reagent/lithium + name = "Lithium" + description = "A chemical element, used as antidepressant." + taste_description = "metal" + reagent_state = SOLID + color = "#808080" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/lithium/affect_blood(mob/living/carbon/C, removed) + if(!isspaceturf(C.loc)) + step(C, GLOB.cardinals) + + if(prob(5)) + spawn(-1) + C.emote(pick("twitch", "drool", "moan")) + +/datum/reagent/mercury + name = "Mercury" + description = "A chemical element." + taste_mult = 0 //mercury apparently is tasteless. IDK + reagent_state = LIQUID + color = "#484848" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/mercury/affect_blood(mob/living/carbon/C, removed) + if(!isspaceturf(C.loc)) + step(C, pick(GLOB.cardinals)) + if(prob(5)) + spawn(-1) + C.emote(pick("twitch", "drool", "moan")) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1 * removed, updating_health = FALSE) + return TRUE + +/datum/reagent/phosphorus + name = "Phosphorus" + description = "A chemical element, the backbone of biological energy carriers." + taste_description = "vinegar" + reagent_state = SOLID + color = "#832828" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/potassium + name = "Potassium" + description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + taste_description = "sweetness" //potassium is bitter in higher doses but sweet in lower ones. + reagent_state = SOLID + color = "#a0a0a0" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/potassium/affect_blood(mob/living/carbon/C, removed) + if(volume > 10) + APPLY_CHEM_EFFECT(C, CE_PULSE, 2) + else if(volume > 3) + APPLY_CHEM_EFFECT(C, CE_PULSE, 1) + +/datum/reagent/toxin/acid + name = "Sulphuric Acid" + description = "A very corrosive mineral acid with the molecular formula H2SO4." + taste_description = "acid" + reagent_state = LIQUID + color = "#db5008" + metabolization_rate = 0.4 + touch_met = 1 + var/acidpwr = 10 + var/meltdose = 20 // How much is needed to melt + var/max_damage = 40 + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/toxin/acid/affect_blood(mob/living/carbon/C, removed) + C.adjustFireLoss(removed * acidpwr, FALSE) + return TRUE + +/datum/reagent/toxin/acid/affect_touch(mob/living/carbon/C, removed) + C.acid_act(acidpwr, removed, affect_clothing = FALSE) + +/datum/reagent/toxin/acid/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) + . = ..() + reac_volume = round(reac_volume,0.1) + if(!iscarbon(exposed_mob)) + if(methods & INGEST) + exposed_mob.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr)) + return + if(methods & INJECT) + exposed_mob.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr)) + return + exposed_mob.acid_act(acidpwr, reac_volume, affect_clothing = (methods & TOUCH), affect_body = (methods & INJECT|INGEST)) + else + if(methods & TOUCH) + // Body is handled by affect_touch() + exposed_mob.acid_act(acidpwr, reac_volume, affect_body = FALSE) + spawn(-1) + exposed_mob.emote("agony") + +/datum/reagent/toxin/acid/expose_obj(obj/exposed_obj, reac_volume) + . = ..() + if(ismob(exposed_obj.loc)) //handled in human acid_act() + return + reac_volume = round(reac_volume,0.1) + exposed_obj.acid_act(acidpwr, reac_volume) + +/datum/reagent/toxin/acid/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) + . = ..() + if (!istype(exposed_turf)) + return + reac_volume = round(reac_volume,0.1) + exposed_turf.acid_act(acidpwr, reac_volume) + +/datum/reagent/toxin/acid/hydrochloric //Like sulfuric, but less toxic and more acidic. + name = "Hydrochloric Acid" + description = "A very corrosive mineral acid with the molecular formula HCl." + taste_description = "stomach acid" + reagent_state = LIQUID + color = "#808080" + toxpwr = 3 + meltdose = 8 + max_damage = 30 + value = DISPENSER_REAGENT_VALUE * 2 + +/datum/reagent/silicon + name = "Silicon" + description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + reagent_state = SOLID + color = "#a8a8a8" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/sodium + name = "Sodium" + description = "A chemical element, readily reacts with water." + taste_description = "salty metal" + reagent_state = SOLID + color = "#808080" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/sulfur + name = "Sulfur" + description = "A chemical element with a pungent smell." + taste_description = "old eggs" + reagent_state = SOLID + color = "#bf8c00" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/tungsten + name = "Tungsten" + description = "A chemical element, and a strong oxidising agent." + taste_mult = 0 //no taste + reagent_state = SOLID + color = "#dcdcdc" + value = DISPENSER_REAGENT_VALUE + +/datum/reagent/oxygen + name = "Oxygen" + description = "A colorless, odorless gas. Grows on trees but is still pretty valuable." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + taste_mult = 0 // oderless and tasteless + + +/datum/reagent/oxygen/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) + . = ..() + if(isopenturf(exposed_turf)) + exposed_turf.atmos_spawn_air(GAS_OXYGEN, reac_volume/20, exposed_temperature || T20C) + + +/datum/reagent/nitrogen + name = "Nitrogen" + description = "A colorless, odorless, tasteless gas. A simple asphyxiant that can silently displace vital oxygen." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + taste_mult = 0 + + +/datum/reagent/nitrogen/expose_turf(turf/open/exposed_turf, reac_volume) + . = ..() + if(istype(exposed_turf)) + var/temp = holder ? holder.chem_temp : T20C + exposed_turf.atmos_spawn_air(GAS_NITROGEN, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) + +/datum/reagent/hydrogen + name = "Hydrogen" + description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + taste_mult = 0 + + +/datum/reagent/fluorine + name = "Fluorine" + description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest." + reagent_state = GAS + color = "#808080" // rgb: 128, 128, 128 + taste_description = "acid" + + +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/fluorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 2)) + mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 2.5)) + mytray.adjust_waterlevel(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjust_weedlevel(-rand(1,4)) + +/datum/reagent/fluorine/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(0.5*removed, 0) + . = TRUE + +//This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient. +/datum/reagent/lead + name = "Lead" + description = "A dull metalltic element with a low melting point." + taste_description = "metal" + reagent_state = SOLID + color = "#80919d" + metabolization_rate = 0.15 + +/datum/reagent/lead/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) + +/datum/reagent/iodine + name = "Iodine" + description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing." + reagent_state = LIQUID + color = "#BC8A00" + taste_description = "metal" + + +/datum/reagent/carbondioxide + name = "Carbon Dioxide" + reagent_state = GAS + description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs." + color = "#B0B0B0" // rgb : 192, 192, 192 + taste_description = "something unknowable" + + +/datum/reagent/carbondioxide/expose_turf(turf/open/exposed_turf, reac_volume) + if(istype(exposed_turf)) + var/temp = holder ? holder.chem_temp : T20C + exposed_turf.atmos_spawn_air(GAS_CO2, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) + return ..() + +/datum/reagent/chlorine + name = "Chlorine" + description = "A pale yellow gas that's well known as an oxidizer. While it forms many harmless molecules in its elemental form it is far from harmless." + reagent_state = GAS + color = "#FFFB89" //pale yellow? let's make it light gray + taste_description = "chlorine" + + + +// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial +/datum/reagent/chlorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 1.5)) + mytray.adjust_waterlevel(-round(chems.get_reagent_amount(src.type) * 0.5)) + mytray.adjust_weedlevel(-rand(1,3)) + // White Phosphorous + water -> phosphoric acid. That's not a good thing really. + + +/datum/reagent/chlorine/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(3 * removed, FALSE) + . = TRUE + +/datum/reagent/calcium + name = "Calcium" + description = "A white metallic element." + color = "#FFFFFF" + reagent_state = SOLID + +/datum/reagent/helium + name = "Helium" + description = "Does not make any sound." + reagent_state = GAS + color = "#ffffa099" + +/datum/reagent/nickel + name = "Nickel" + description = "Contrary to popular belief, this is not a currency." + reagent_state = SOLID + color = "#dcdcdc" + +/datum/reagent/copper + name = "Copper" + description = "A highly ductile metal. Things made out of copper aren't very durable, but it makes a decent material for electrical wiring." + reagent_state = SOLID + color = "#6E3B08" // rgb: 110, 59, 8 + taste_description = "metal" + + +/datum/reagent/copper/expose_obj(obj/exposed_obj, reac_volume, exposed_temperature) + . = ..() + if(!istype(exposed_obj, /obj/item/stack/sheet/iron)) + return + + var/obj/item/stack/sheet/iron/M = exposed_obj + reac_volume = min(reac_volume, M.amount) + new/obj/item/stack/sheet/bronze(get_turf(M), reac_volume) + M.use(reac_volume) + +/datum/reagent/silver + name = "Silver" + description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + reagent_state = SOLID + color = "#D0D0D0" // rgb: 208, 208, 208 + taste_description = "expensive yet reasonable metal" + material = /datum/material/silver diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index a7bf91ce6650..a517a7fbcc31 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -12,14 +12,12 @@ glass_icon_state = "glass_orange" glass_name = "glass of orange juice" glass_desc = "Vitamins! Yay!" - ph = 3.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/orangejuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getOxyLoss() && DT_PROB(16, delta_time)) - M.adjustOxyLoss(-1, 0) + +/datum/reagent/consumable/orangejuice/affect_blood(mob/living/carbon/C, removed) + if(prob(30) && C.getOxyLoss()) + C.adjustOxyLoss(-2 * removed, 0) . = TRUE - ..() /datum/reagent/consumable/tomatojuice name = "Tomato Juice" @@ -29,13 +27,12 @@ glass_icon_state = "glass_red" glass_name = "glass of tomato juice" glass_desc = "Are you sure this is tomato juice?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getFireLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(0, 1, 0) + +/datum/reagent/consumable/tomatojuice/affect_blood(mob/living/carbon/C, removed) + if(prob(20) && C.getFireLoss()) + C.heal_bodypart_damage(0, 1 * removed, 0) . = TRUE - ..() /datum/reagent/consumable/limejuice name = "Lime Juice" @@ -45,14 +42,12 @@ glass_icon_state = "glass_green" glass_name = "glass of lime juice" glass_desc = "A glass of sweet-sour lime juice." - ph = 2.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/limejuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getToxLoss() && DT_PROB(10, delta_time)) - M.adjustToxLoss(-1, 0) + +/datum/reagent/consumable/limejuice/affect_blood(mob/living/carbon/C, removed) + if(prob(20) && C.getToxLoss()) + C.adjustToxLoss(-1 * removed, 0) . = TRUE - ..() /datum/reagent/consumable/carrotjuice name = "Carrot Juice" @@ -62,21 +57,19 @@ glass_icon_state = "carrotjuice" glass_name = "glass of carrot juice" glass_desc = "It's just like a carrot but without crunching." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/carrotjuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_blurriness(-1 * REM * delta_time) - M.adjust_blindness(-1 * REM * delta_time) + +/datum/reagent/consumable/carrotjuice/affect_blood(mob/living/carbon/C, removed) + C.adjust_blurriness(-1 * removed) + C.adjust_blindness(-1 * removed) switch(current_cycle) if(1 to 20) //nothing if(21 to 110) - if(DT_PROB(100 * (1 - (sqrt(110 - current_cycle) / 10)), delta_time)) - M.cure_nearsighted(list(EYE_DAMAGE)) + if(prob(100 * (1 - (sqrt(110 - current_cycle) / 10)))) + C.cure_nearsighted(list(EYE_DAMAGE)) if(110 to INFINITY) - M.cure_nearsighted(list(EYE_DAMAGE)) - ..() - return + C.cure_nearsighted(list(EYE_DAMAGE)) /datum/reagent/consumable/berryjuice name = "Berry Juice" @@ -85,15 +78,14 @@ taste_description = "berries" glass_icon_state = "berryjuice" glass_name = "glass of berry juice" - glass_desc = "Berry juice. Or maybe it's jam. Who cares?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_desc = "Berry juice. Or maybe it's jaC. Who cares?" + /datum/reagent/consumable/applejuice name = "Apple Juice" description = "The sweet juice of an apple, fit for all ages." color = "#ECFF56" // rgb: 236, 255, 86 taste_description = "apples" - ph = 3.2 // ~ 2.7 -> 3.7 /datum/reagent/consumable/poisonberryjuice name = "Poison Berry Juice" @@ -103,12 +95,11 @@ glass_icon_state = "poisonberryjuice" glass_name = "glass of berry juice" glass_desc = "Berry juice. Or maybe it's poison. Who cares?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/poisonberryjuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(1 * REM * delta_time, 0) + +/datum/reagent/consumable/poisonberryjuice/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(1 * removed, 0) . = TRUE - ..() /datum/reagent/consumable/watermelonjuice name = "Watermelon Juice" @@ -118,7 +109,7 @@ glass_icon_state = "glass_red" glass_name = "glass of watermelon juice" glass_desc = "A glass of watermelon juice." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/lemonjuice name = "Lemon Juice" @@ -128,8 +119,7 @@ glass_icon_state = "lemonglass" glass_name = "glass of lemon juice" glass_desc = "Sour..." - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/banana name = "Banana Juice" @@ -139,14 +129,13 @@ glass_icon_state = "banana" glass_name = "glass of banana juice" glass_desc = "The raw essence of a banana. HONK." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/banana/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) - if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(M)) - M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time, 0) + +/datum/reagent/consumable/banana/affect_blood(mob/living/carbon/C, removed) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) + if((liver && HAS_TRAIT(liver, TRAIT_COMEDY_METABOLISM)) || ismonkey(C)) + C.heal_bodypart_damage(1 * removed, 1 * removed, 0) . = TRUE - ..() /datum/reagent/consumable/nothing name = "Nothing" @@ -156,14 +145,13 @@ glass_name = "nothing" glass_desc = "Absolutely nothing." shot_glass_icon_state = "shotglass" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/nothing/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(ishuman(M) && M.mind?.miming) - M.silent = max(M.silent, MIMEDRINK_SILENCE_DURATION) - M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) + +/datum/reagent/consumable/nothing/affect_blood(mob/living/carbon/C, removed) + if(ishuman(C) && C.mind?.miming) + C.silent = max(C.silent, MIMEDRINK_SILENCE_DURATION) + C.heal_bodypart_damage(1 * removed, 1 * removed) . = TRUE - ..() /datum/reagent/consumable/laughter name = "Laughter" @@ -171,27 +159,23 @@ metabolization_rate = INFINITY color = "#FF4DD2" taste_description = "laughter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + ingest_met = INFINITY -/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.emote("laugh") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "chemical_laughter", /datum/mood_event/chemical_laughter) - ..() +/datum/reagent/consumable/laughter/affect_blood(mob/living/carbon/C, removed) + spawn(-1) + C.emote("laugh") /datum/reagent/consumable/superlaughter name = "Super Laughter" description = "Funny until you're the one laughing." - metabolization_rate = 1.5 * REAGENTS_METABOLISM + metabolization_rate = 0.3 color = "#FF4DD2" taste_description = "laughter" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/superlaughter/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(16, delta_time)) - M.visible_message(span_danger("[M] bursts out into a fit of uncontrollable laughter!"), span_userdanger("You burst out in a fit of uncontrollable laughter!")) - M.Stun(5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "chemical_laughter", /datum/mood_event/chemical_superlaughter) - ..() +/datum/reagent/consumable/superlaughter/affect_blood(mob/living/carbon/C, removed) + if(prob(10)) + C.visible_message(span_danger("[C] bursts out into a fit of uncontrollable laughter!"), span_userdanger("You burst out in a fit of uncontrollable laughter!")) + C.Stun(5) /datum/reagent/consumable/potato_juice name = "Potato Juice" @@ -202,14 +186,14 @@ glass_icon_state = "glass_brown" glass_name = "glass of potato juice" glass_desc = "Bleh..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/grapejuice name = "Grape Juice" description = "The juice of a bunch of grapes. Guaranteed non-alcoholic." color = "#290029" // dark purple taste_description = "grape soda" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/milk name = "Milk" @@ -219,8 +203,7 @@ glass_icon_state = "glass_white" glass_name = "glass of milk" glass_desc = "White and nutritious goodness!" - ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // Milk is good for humans, but bad for plants. The sugars cannot be used by plants, and the milk fat harms growth. Not shrooms though. I can't deal with this now... /datum/reagent/consumable/milk/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -230,13 +213,15 @@ if(myseed) myseed.adjust_potency(-chems.get_reagent_amount(type) * 0.5) -/datum/reagent/consumable/milk/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1,0, 0) +/datum/reagent/consumable/milk/affect_ingest(mob/living/carbon/C, removed) + if(C.getBruteLoss() && prob(20)) + C.heal_bodypart_damage(1 * removed,0, 0) . = TRUE + if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * delta_time) - ..() + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 1 * removed) + + return ..() || . /datum/reagent/consumable/soymilk name = "Soy Milk" @@ -246,14 +231,14 @@ glass_icon_state = "glass_white" glass_name = "glass of soy milk" glass_desc = "White and nutritious soy goodness!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/soymilk/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1, 0, 0) + +/datum/reagent/consumable/soymilk/affect_ingest(mob/living/carbon/C, removed) + if(C.getBruteLoss() && prob(10)) + C.heal_bodypart_damage(0.5, 0, 0) . = TRUE - ..() + return ..() || . /datum/reagent/consumable/cream name = "Cream" description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" @@ -262,13 +247,13 @@ glass_icon_state = "glass_white" glass_name = "glass of cream" glass_desc = "Ewwww..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/cream/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1, 0, 0) + +/datum/reagent/consumable/cream/affect_ingest(mob/living/carbon/C, removed) + if(C.getBruteLoss() && prob(20)) + C.heal_bodypart_damage(0.5 * removed, 0, 0) . = TRUE - ..() + return ..() || . /datum/reagent/consumable/coffee name = "Coffee" @@ -280,23 +265,21 @@ glass_icon_state = "glass_brown" glass_name = "glass of coffee" glass_desc = "Don't drop it, or you'll send scalding liquid and glass shards everywhere." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK -/datum/reagent/consumable/coffee/overdose_process(mob/living/M, delta_time, times_fired) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() +/datum/reagent/consumable/coffee/overdose_process(mob/living/carbon/C) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) -/datum/reagent/consumable/coffee/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 * REM * delta_time) - M.AdjustSleeping(-40 * REM * delta_time) +/datum/reagent/consumable/coffee/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-3 * removed) + C.AdjustSleeping(-40 * removed) //310.15 is the normal bodytemp. - M.adjust_bodytemperature(25 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) + C.adjust_bodytemperature(25 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) if(holder.has_reagent(/datum/reagent/consumable/frostoil)) - holder.remove_reagent(/datum/reagent/consumable/frostoil, 5 * REM * delta_time) - ..() - . = TRUE + holder.remove_reagent(/datum/reagent/consumable/frostoil, 5 * removed) + return ..() || TRUE /datum/reagent/consumable/tea name = "Tea" @@ -307,19 +290,19 @@ glass_icon_state = "teaglass" glass_name = "glass of tea" glass_desc = "Drinking it from here would not seem right." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_STOCK -/datum/reagent/consumable/tea/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-4 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-1 * REM * delta_time) - M.adjust_timed_status_effect(-6 SECONDS * REM * delta_time, /datum/status_effect/jitter) - M.AdjustSleeping(-20 * REM * delta_time) - if(M.getToxLoss() && DT_PROB(10, delta_time)) - M.adjustToxLoss(-1, 0) - M.adjust_bodytemperature(20 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) - ..() - . = TRUE +/datum/reagent/consumable/tea/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-4 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-1 * removed) + C.adjust_timed_status_effect(-6 SECONDS * removed, /datum/status_effect/jitter) + C.AdjustSleeping(-20 * removed) + if(C.getToxLoss() && prob(20)) + C.adjustToxLoss(-1, 0) + . = TRUE + C.adjust_bodytemperature(20 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + return ..() || . /datum/reagent/consumable/lemonade name = "Lemonade" @@ -330,7 +313,7 @@ glass_icon_state = "lemonpitcher" glass_name = "pitcher of lemonade" glass_desc = "This drink leaves you feeling nostalgic for some reason." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/tea/arnold_palmer @@ -343,13 +326,11 @@ glass_icon_state = "arnold_palmer" glass_name = "Arnold Palmer" glass_desc = "You feel like taking a few golf swings after a few swigs of this." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/tea/arnold_palmer/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")) - ..() - . = TRUE + +/datum/reagent/consumable/tea/arnold_palmer/affect_blood(mob/living/carbon/C, removed) + if(prob(5)) + to_chat(C, span_notice("[pick("You remember to square your shoulders.","You remember to keep your head down.","You can't decide between squaring your shoulders and keeping your head down.","You remember to relax.","You think about how someday you'll get two strokes off your golf game.")]")) /datum/reagent/consumable/icecoffee name = "Iced Coffee" @@ -360,37 +341,15 @@ glass_icon_state = "icedcoffeeglass" glass_name = "iced coffee" glass_desc = "A drink to perk you up and refresh you!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 * REM * delta_time) - M.AdjustSleeping(-40 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - . = TRUE -/datum/reagent/consumable/hot_ice_coffee - name = "Hot Ice Coffee" - description = "Coffee with pulsing ice shards" - color = "#102838" // rgb: 16, 40, 56 - nutriment_factor = 0 - taste_description = "bitter coldness and a hint of smoke" - glass_icon_state = "hoticecoffee" - glass_name = "hot ice coffee" - glass_desc = "A sharp drink, this can't have come cheap" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/hot_ice_coffee/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 * REM * delta_time) - M.AdjustSleeping(-60 * REM * delta_time) - M.adjust_bodytemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjustToxLoss(1 * REM * delta_time, 0) - ..() - . = TRUE + +/datum/reagent/consumable/icecoffee/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-3 * removed) + C.AdjustSleeping(-40 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + C.set_timed_status_effect(10 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + return ..() /datum/reagent/consumable/icetea name = "Iced Tea" @@ -401,17 +360,16 @@ glass_icon_state = "icedteaglass" glass_name = "iced tea" glass_desc = "All natural, antioxidant-rich flavour sensation." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/icetea/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-4 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-1 * REM * delta_time) - M.AdjustSleeping(-40 * REM * delta_time) - if(M.getToxLoss() && DT_PROB(10, delta_time)) - M.adjustToxLoss(-1, 0) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() - . = TRUE + + +/datum/reagent/consumable/icetea/affect_blood(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-4 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-1 * removed) + C.AdjustSleeping(-40 * removed) + if(C.getToxLoss() && prob(10)) + C.adjustToxLoss(-1, 0) + . = TRUE + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) /datum/reagent/consumable/space_cola name = "Cola" @@ -421,12 +379,12 @@ glass_icon_state = "spacecola" glass_name = "glass of Space Cola" glass_desc = "A glass of refreshing Space Cola." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/space_cola/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(-5 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() + +/datum/reagent/consumable/space_cola/affect_ingest(mob/living/carbon/C, removed) + C.adjust_drowsyness(-5 * removed) + C.adjust_bodytemperature(-5 * removed * TEMPERATURE_DAMAGE_COEFFICIENT, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/roy_rogers name = "Roy Rogers" @@ -437,12 +395,12 @@ glass_icon_state = "royrogers" glass_name = "Roy Rogers" glass_desc = "90% sugar in a glass." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/roy_rogers/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(12 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjust_drowsyness(-5 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) + +/datum/reagent/consumable/roy_rogers/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(12 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.adjust_drowsyness(-5 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) return ..() /datum/reagent/consumable/nuka_cola @@ -454,25 +412,24 @@ glass_icon_state = "nuka_colaglass" glass_name = "glass of Nuka Cola" glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) -/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) - ..() +/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_TOUCH) + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) -/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(40 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.set_timed_status_effect(1 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - M.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.set_drowsyness(0) - M.AdjustSleeping(-40 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() - . = TRUE +/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_TOUCH) + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) + +/datum/reagent/consumable/nuka_cola/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(40 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(1 MINUTES * removed, /datum/status_effect/drugginess) + C.adjust_timed_status_effect(3 SECONDS * removed, /datum/status_effect/dizziness) + C.set_drowsyness(0) + C.AdjustSleeping(-40 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/rootbeer name = "root beer" @@ -480,38 +437,38 @@ color = "#181008" // rgb: 24, 16, 8 quality = DRINK_VERYGOOD nutriment_factor = 10 * REAGENTS_METABOLISM - metabolization_rate = 2 * REAGENTS_METABOLISM + ingest_met = 0.4 taste_description = "a monstrous sugar rush" glass_icon_state = "spacecola" glass_name = "glass of root beer" glass_desc = "A glass of highly potent, incredibly sugary root beer." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /// If we activated the effect var/effect_enabled = FALSE -/datum/reagent/consumable/rootbeer/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_DOUBLE_TAP, type) +/datum/reagent/consumable/rootbeer/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_INGEST) + return + + REMOVE_TRAIT(C, TRAIT_DOUBLE_TAP, type) if(current_cycle > 10) - to_chat(L, span_warning("You feel kinda tired as your sugar rush wears off...")) - L.stamina.adjust(-1 * min(80, current_cycle * 3)) - L.adjust_drowsyness(current_cycle) - ..() + to_chat(C, span_warning("You feel kinda tired as your sugar rush wears off...")) + C.stamina.adjust(-1 * min(80, current_cycle * 3)) + C.adjust_drowsyness(current_cycle) -/datum/reagent/consumable/rootbeer/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/consumable/rootbeer/affect_ingest(mob/living/carbon/C, removed) if(current_cycle >= 3 && !effect_enabled) // takes a few seconds for the bonus to kick in to prevent microdosing - to_chat(M, span_notice("You feel your trigger finger getting itchy...")) - ADD_TRAIT(M, TRAIT_DOUBLE_TAP, type) + to_chat(C, span_notice("You feel your trigger finger getting itchy...")) + ADD_TRAIT(C, TRAIT_DOUBLE_TAP, type) effect_enabled = TRUE - M.set_timed_status_effect(4 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(4 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) if(prob(50)) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/dizziness) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/dizziness) if(current_cycle > 10) - M.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - - ..() - . = TRUE + C.adjust_timed_status_effect(3 SECONDS * removed, /datum/status_effect/dizziness) + return..() /datum/reagent/consumable/grey_bull name = "Grey Bull" @@ -522,23 +479,21 @@ glass_icon_state = "grey_bull_glass" glass_name = "glass of Grey Bull" glass_desc = "Surprisingly it isn't grey." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_SHOCKIMMUNE, type) -/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_SHOCKIMMUNE, type) - ..() +/datum/reagent/consumable/grey_bull/on_mob_metabolize(mob/living/carbon/C, class) + ADD_TRAIT(C, TRAIT_SHOCKIMMUNE, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/consumable/grey_bull/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(40 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.set_drowsyness(0) - M.AdjustSleeping(-40 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/grey_bull/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_SHOCKIMMUNE, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/consumable/grey_bull/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(40 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/dizziness) + C.set_drowsyness(0) + C.AdjustSleeping(-40 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/spacemountainwind name = "SM Wind" @@ -548,15 +503,14 @@ glass_icon_state = "Space_mountain_wind_glass" glass_name = "glass of Space Mountain Wind" glass_desc = "Space Mountain Wind. As you know, there are no mountains in space, only wind." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/spacemountainwind/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(-7 * REM * delta_time) - M.AdjustSleeping(-20 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - . = TRUE + +/datum/reagent/consumable/spacemountainwind/affect_ingest(mob/living/carbon/C, removed) + C.adjust_drowsyness(-7 * removed) + C.AdjustSleeping(-20 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + C.set_timed_status_effect(10 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + return ..() /datum/reagent/consumable/dr_gibb name = "Dr. Gibb" @@ -566,13 +520,12 @@ glass_icon_state = "dr_gibb_glass" glass_name = "glass of Dr. Gibb" glass_desc = "Dr. Gibb. Not as dangerous as the glass_name might imply." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/dr_gibb/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(-6 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/dr_gibb/affect_ingest(mob/living/carbon/C, removed) + C.adjust_drowsyness(-6 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/space_up name = "Space-Up" description = "Tastes like a hull breach in your mouth." @@ -581,12 +534,12 @@ glass_icon_state = "space-up_glass" glass_name = "glass of Space-Up" glass_desc = "Space-up. It helps you keep your cool." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/space_up/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() + +/datum/reagent/consumable/space_up/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-8 * removed * TEMPERATURE_DAMAGE_COEFFICIENT, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/lemon_lime name = "Lemon Lime" @@ -596,36 +549,11 @@ glass_icon_state = "lemonlime" glass_name = "glass of lemon-lime" glass_desc = "You're pretty certain a real fruit has never actually touched this." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - -/datum/reagent/consumable/lemon_lime/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() - -/datum/reagent/consumable/pwr_game - name = "Pwr Game" - description = "The only drink with the PWR that true gamers crave." - color = "#9385bf" // rgb: 58, 52, 75 - taste_description = "sweet and salty tang" - glass_icon_state = "pwrgame" - glass_name = "glass of Pwr Game" - glass_desc = "Goes well with a Vlad's salad." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/pwr_game/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(exposed_mob?.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && (methods & INGEST) && !HAS_TRAIT(exposed_mob, TRAIT_GAMERGOD)) - ADD_TRAIT(exposed_mob, TRAIT_GAMERGOD, "pwr_game") - to_chat(exposed_mob, "As you imbibe the Pwr Game, your gamer third eye opens... \ - You feel as though a great secret of the universe has been made known to you...") - -/datum/reagent/consumable/pwr_game/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - if(DT_PROB(5, delta_time)) - M.mind?.adjust_experience(/datum/skill/gaming, 5) - ..() +/datum/reagent/consumable/lemon_lime/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-8 * removed * TEMPERATURE_DAMAGE_COEFFICIENT, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/shamblers name = "Shambler's Juice" @@ -635,11 +563,11 @@ glass_icon_state = "shamblerjuice" glass_name = "glass of Shambler's juice" glass_desc = "Mmm mm, shambly." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/shamblers/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() + +/datum/reagent/consumable/shamblers/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/sodawater name = "Soda Water" @@ -649,7 +577,7 @@ glass_icon_state = "glass_clearcarb" glass_name = "glass of soda water" glass_desc = "Soda water. Why not make a scotch and soda?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // A variety of nutrients are dissolved in club soda, without sugar. @@ -660,11 +588,11 @@ mytray.adjust_waterlevel(round(chems.get_reagent_amount(type) * 1)) mytray.adjust_plant_health(round(chems.get_reagent_amount(type) * 0.1)) -/datum/reagent/consumable/sodawater/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/sodawater/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-3 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/tonic name = "Tonic Water" @@ -674,15 +602,14 @@ glass_icon_state = "glass_clearcarb" glass_name = "glass of tonic water" glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/tonic/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 * REM * delta_time) - M.AdjustSleeping(-40 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() - . = TRUE + +/datum/reagent/consumable/tonic/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-3 * removed) + C.AdjustSleeping(-40 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/monkey_energy name = "Monkey Energy" @@ -693,29 +620,31 @@ glass_icon_state = "monkey_energy_glass" glass_name = "glass of Monkey Energy" glass_desc = "You can unleash the ape, but without the pop of the can?" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/monkey_energy/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(80 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.set_drowsyness(0) - M.AdjustSleeping(-40 * REM * delta_time) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() -/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/L) - ..() - if(ismonkey(L)) - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) -/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) - ..() +/datum/reagent/consumable/monkey_energy/affect_ingest(mob/living/carbon/C, removed) + C.set_timed_status_effect(80 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/dizziness) + C.set_drowsyness(0) + C.AdjustSleeping(-40 * removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() -/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(7.5, delta_time)) - M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy) - ..() +/datum/reagent/consumable/monkey_energy/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_TOUCH) + return + if(ismonkey(C)) + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) + +/datum/reagent/consumable/monkey_energy/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_TOUCH) + return + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/monkey_energy) + +/datum/reagent/consumable/monkey_energy/overdose_process(mob/living/carbon/C) + if(prob(15)) + spawn(-1) + C.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/monkey_energy) /datum/reagent/consumable/ice name = "Ice" @@ -726,12 +655,17 @@ glass_icon_state = "iceglass" glass_name = "glass of ice" glass_desc = "Generally, you're supposed to put something else in there too..." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/ice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() +/datum/reagent/consumable/ice/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-3 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() + +/datum/reagent/consumable/ice/affect_blood(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-3 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + +/datum/reagent/consumable/ice/affect_touch(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) /datum/reagent/consumable/soy_latte name = "Soy Latte" description = "A nice and tasty beverage while you are reading your hippie books." @@ -741,20 +675,16 @@ glass_icon_state = "soy_latte" glass_name = "soy latte" glass_desc = "A nice and refreshing beverage while you're reading." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - glass_price = DRINK_PRICE_EASY -/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-3 *REM * delta_time) - M.SetSleeping(0) - M.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1,0, 0) - ..() - . = TRUE + glass_price = DRINK_PRICE_EASY +/datum/reagent/consumable/soy_latte/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-3 * removed) + C.SetSleeping(0) + C.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + C.set_timed_status_effect(10 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + return ..() || TRUE /datum/reagent/consumable/cafe_latte name = "Cafe Latte" description = "A nice, strong and tasty beverage while you are reading." @@ -764,19 +694,16 @@ glass_icon_state = "cafe_latte" glass_name = "cafe latte" glass_desc = "A nice, strong and refreshing beverage while you're reading." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY -/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-10 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_drowsyness(-6 * REM * delta_time) - M.SetSleeping(0) - M.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1, 0, 0) - ..() - . = TRUE +/datum/reagent/consumable/cafe_latte/affect_ingest(mob/living/carbon/C, removed) + C.adjust_timed_status_effect(-10 SECONDS * removed, /datum/status_effect/dizziness) + C.adjust_drowsyness(-6 * removed) + C.SetSleeping(0) + C.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + C.set_timed_status_effect(10 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + return ..() /datum/reagent/consumable/doctor_delight name = "The Doctor's Delight" @@ -787,20 +714,19 @@ glass_icon_state = "doctorsdelightglass" glass_name = "Doctor's Delight" glass_desc = "The space doctor's favorite. Guaranteed to restore bodily injury; side effects include cravings and hunger." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/doctor_delight/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustBruteLoss(-0.5 * REM * delta_time, 0) - M.adjustFireLoss(-0.5 * REM * delta_time, 0) - M.adjustToxLoss(-0.5 * REM * delta_time, 0) - M.adjustOxyLoss(-0.5 * REM * delta_time, 0) - if(M.nutrition && (M.nutrition - 2 > 0)) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + + +/datum/reagent/consumable/doctor_delight/affect_blood(mob/living/carbon/C, removed) + C.adjustBruteLoss(-0.5 * removed, 0) + C.adjustFireLoss(-0.5 * removed, 0) + C.adjustToxLoss(-0.5 * removed, 0) + C.adjustOxyLoss(-0.5 * removed, 0) + if(C.nutrition && (C.nutrition - 2 > 0)) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(!(HAS_TRAIT(liver, TRAIT_MEDICAL_METABOLISM))) // Drains the nutrition of the holder. Not medical doctors though, since it's the Doctor's Delight! - M.adjust_nutrition(-2 * REM * delta_time) - ..() - . = TRUE + C.adjust_nutrition(-2 * removed) + return TRUE /datum/reagent/consumable/cinderella name = "Cinderella" @@ -811,10 +737,10 @@ glass_icon_state = "cinderella" glass_name = "Cinderella" glass_desc = "There is not a single drop of alcohol in this thing." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/cinderella/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_disgust(-5 * REM * delta_time) + +/datum/reagent/consumable/cinderella/affect_ingest(mob/living/carbon/C, removed) + C.adjust_disgust(-5 * removed) return ..() /datum/reagent/consumable/cherryshake @@ -827,7 +753,7 @@ glass_icon_state = "cherryshake" glass_name = "cherry shake" glass_desc = "A cherry flavored milkshake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/bluecherryshake @@ -840,7 +766,7 @@ glass_icon_state = "bluecherryshake" glass_name = "blue cherry shake" glass_desc = "An exotic blue milkshake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/vanillashake name = "Vanilla Shake" @@ -852,7 +778,7 @@ glass_icon_state = "vanillashake" glass_name = "vanilla shake" glass_desc = "A vanilla flavored milkshake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/caramelshake @@ -865,7 +791,7 @@ glass_icon_state = "caramelshake" glass_name = "caramel shake" glass_desc = "A caramel flavored milkshake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/choccyshake @@ -878,7 +804,7 @@ glass_icon_state = "choccyshake" glass_name = "chocolate shake" glass_desc = "A chocolate flavored milkshake." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_MEDIUM /datum/reagent/consumable/pumpkin_latte @@ -891,7 +817,7 @@ glass_icon_state = "pumpkin_latte" glass_name = "pumpkin latte" glass_desc = "A mix of coffee and pumpkin juice." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/gibbfloats name = "Gibb Floats" @@ -903,21 +829,21 @@ glass_icon_state = "gibbfloats" glass_name = "Gibbfloat" glass_desc = "Dr. Gibb with ice cream on top." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/pumpkinjuice name = "Pumpkin Juice" description = "Juiced from real pumpkin." color = "#FFA500" taste_description = "pumpkin" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/blumpkinjuice name = "Blumpkin Juice" description = "Juiced from real blumpkin." color = "#00BFFF" taste_description = "a mouthful of pool water" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/triple_citrus name = "Triple Citrus" @@ -928,7 +854,7 @@ glass_icon_state = "triplecitrus" //needs own sprite mine are trash //your sprite is great tho glass_name = "glass of triple citrus" glass_desc = "A mixture of citrus juices. Tangy, yet smooth." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/grape_soda name = "Grape Soda" @@ -937,11 +863,11 @@ taste_description = "grape soda" glass_name = "glass of grape juice" glass_desc = "It's grape (soda)!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/grape_soda/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - ..() + +/datum/reagent/consumable/grape_soda/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/milk/chocolate_milk name = "Chocolate Milk" @@ -949,7 +875,7 @@ color = "#7D4E29" quality = DRINK_NICE taste_description = "chocolate milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/hot_coco name = "Hot Coco" @@ -960,16 +886,16 @@ glass_icon_state = "chocolateglass" glass_name = "glass of hot coco" glass_desc = "A favorite winter drink to warm you up." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/hot_coco/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) - if(M.getBruteLoss() && DT_PROB(10, delta_time)) - M.heal_bodypart_damage(1, 0, 0) + +/datum/reagent/consumable/hot_coco/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + if(C.getBruteLoss() && prob(20)) + C.heal_bodypart_damage(1, 0, 0) . = TRUE if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2 * REM * delta_time) - ..() + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 2 * removed) + return ..() || . /datum/reagent/consumable/italian_coco name = "Italian Hot Chocolate" @@ -981,10 +907,10 @@ glass_icon_state = "italiancoco" glass_name = "glass of italian coco" glass_desc = "A spin on a winter favourite, made to please." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/italian_coco/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, 0, M.get_body_temp_normal()) + +/datum/reagent/consumable/italian_coco/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) return ..() /datum/reagent/consumable/menthol @@ -995,11 +921,11 @@ glass_icon_state = "glass_green" glass_name = "glass of menthol" glass_desc = "Tastes naturally minty, and imparts a very mild numbing sensation." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/menthol/on_mob_life(mob/living/L, delta_time, times_fired) - L.apply_status_effect(/datum/status_effect/throat_soothed) - ..() + +/datum/reagent/consumable/menthol/affect_ingest(mob/living/carbon/C, removed) + C.apply_status_effect(/datum/status_effect/throat_soothed) + return ..() /datum/reagent/consumable/grenadine name = "Grenadine" @@ -1008,7 +934,7 @@ taste_description = "sweet pomegranates" glass_name = "glass of grenadine" glass_desc = "Delicious flavored syrup." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/parsnipjuice name = "Parsnip Juice" @@ -1016,7 +942,7 @@ color = "#FFA500" taste_description = "parsnip" glass_name = "glass of parsnip juice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/pineapplejuice name = "Pineapple Juice" @@ -1025,7 +951,7 @@ taste_description = "pineapple" glass_name = "glass of pineapple juice" glass_desc = "Tart, tropical, and hotly debated." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/peachjuice //Intended to be extremely rare due to being the limiting ingredients in the blazaam drink name = "Peach Juice" @@ -1033,7 +959,7 @@ color = "#E78108" taste_description = "peaches" glass_name = "glass of peach juice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cream_soda name = "Cream Soda" @@ -1044,10 +970,10 @@ glass_icon_state = "cream_soda" glass_name = "Cream Soda" glass_desc = "A classic space-American vanilla flavored soft drink." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/cream_soda/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-5 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) + +/datum/reagent/consumable/cream_soda/affect_blood(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) ..() /datum/reagent/consumable/sol_dry @@ -1059,11 +985,11 @@ glass_icon_state = "soldry" glass_name = "Sol Dry" glass_desc = "A soothing, mellow drink made from ginger." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_disgust(-5 * REM * delta_time) - ..() + +/datum/reagent/consumable/sol_dry/affect_ingest(mob/living/carbon/C, removed) + C.adjust_disgust(-5 * removed) + return ..() /datum/reagent/consumable/shirley_temple name = "Shirley Temple" @@ -1074,10 +1000,10 @@ glass_icon_state = "shirleytemple" glass_name = "Shirley Temple" glass_desc = "Ginger ale with processed grenadine. " - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/shirley_temple/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_disgust(-3 * REM * delta_time) + +/datum/reagent/consumable/shirley_temple/affect_ingest(mob/living/carbon/C, removed) + C.adjust_disgust(-3 * removed) return ..() /datum/reagent/consumable/red_queen @@ -1090,26 +1016,29 @@ glass_name = "Red Queen" glass_desc = "DRINK ME." var/current_size = RESIZE_DEFAULT_SIZE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/red_queen/on_mob_life(mob/living/carbon/H, delta_time, times_fired) - if(DT_PROB(50, delta_time)) - return ..() + +/datum/reagent/consumable/red_queen/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(prob(50)) + return var/newsize = pick(0.5, 0.75, 1, 1.50, 2) newsize *= RESIZE_DEFAULT_SIZE - H.resize = newsize/current_size + C.resize = newsize/current_size current_size = newsize - H.update_transform() - if(DT_PROB(23, delta_time)) - H.emote("sneeze") - ..() + C.update_transform() + if(prob(35)) + spawn(-1) + C.emote("sneeze") + +/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_TOUCH) + return -/datum/reagent/consumable/red_queen/on_mob_end_metabolize(mob/living/M) - M.resize = RESIZE_DEFAULT_SIZE/current_size + C.resize = RESIZE_DEFAULT_SIZE/current_size current_size = RESIZE_DEFAULT_SIZE - M.update_transform() - ..() + C.update_transform() /datum/reagent/consumable/bungojuice name = "Bungo Juice" @@ -1119,7 +1048,7 @@ glass_icon_state = "glass_yellow" glass_name = "glass of bungo juice" glass_desc = "Exotic! You feel like you are on vacation already." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/prunomix name = "Pruno Mixture" @@ -1129,7 +1058,7 @@ glass_icon_state = "glass_orange" glass_name = "glass of pruno mixture" glass_desc = "Fruit, sugar, yeast, and water pulped together into a pungent slurry." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/aloejuice name = "Aloe Juice" @@ -1139,14 +1068,13 @@ glass_icon_state = "glass_yellow" glass_name = "glass of aloe juice" glass_desc = "A healthy and refreshing juice." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/aloejuice/on_mob_life(mob/living/M, delta_time, times_fired) - if(M.getToxLoss() && DT_PROB(16, delta_time)) - M.adjustToxLoss(-1, 0) - ..() - . = TRUE +/datum/reagent/consumable/aloejuice/affect_ingest(mob/living/carbon/C, removed) + if(C.getToxLoss() && prob(25)) + C.adjustToxLoss(-1, 0) + . = TRUE + return ..() || . /datum/reagent/consumable/agua_fresca name = "Agua Fresca" description = "A refreshing watermelon agua fresca. Perfect on a day at the holodeck." @@ -1156,30 +1084,32 @@ glass_icon_state = "aguafresca" glass_name = "Agua Fresca" glass_desc = "90% water, but still refreshing." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/agua_fresca/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(-8 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - if(M.getToxLoss() && DT_PROB(10, delta_time)) - M.adjustToxLoss(-0.5, 0) - return ..() + +/datum/reagent/consumable/agua_fresca/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(-8 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) + if(C.getToxLoss() && prob(20)) + C.adjustToxLoss(-0.5, 0) + . = TRUE + return ..() || . + /datum/reagent/consumable/mushroom_tea name = "Mushroom Tea" - description = "A savoury glass of tea made from polypore mushroom shavings, originally native to Tizira." + description = "A savoury glass of tea made from polypore mushroom shavings." color = "#674945" // rgb: 16, 16, 0 nutriment_factor = 0 taste_description = "mushrooms" glass_icon_state = "mushroom_tea_glass" glass_name = "glass of mushroom tea" glass_desc = "Oddly savoury for a drink." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/mushroom_tea/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(islizard(M)) - M.adjustOxyLoss(-0.5 * REM * delta_time, 0) - ..() - . = TRUE + +/datum/reagent/consumable/mushroom_tea/affect_ingest(mob/living/carbon/C, removed) + if(islizard(C)) + C.adjustOxyLoss(-0.5 * removed, 0) + . = TRUE + return ..() || . //Moth Stuff /datum/reagent/consumable/toechtauese_juice @@ -1191,7 +1121,7 @@ glass_icon_state = "toechtauese_syrup" glass_name = "glass of töchtaüse juice" glass_desc = "Raw, unadulterated töchtaüse juice. One swig will fill you with regrets." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/toechtauese_syrup name = "Töchtaüse Syrup" @@ -1202,4 +1132,4 @@ glass_icon_state = "toechtauese_syrup" glass_name = "glass of töchtaüse syrup" glass_desc = "Not for drinking on its own." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index a33a4b629725..221b4da8b696 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -1,64 +1,58 @@ /datum/reagent/drug name = "Drug" - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 0.25 taste_description = "bitterness" var/trippy = TRUE //Does this drug make you trip? abstract_type = /datum/reagent/drug -/datum/reagent/drug/on_mob_end_metabolize(mob/living/M) - if(trippy) - SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "[type]_high") - /datum/reagent/drug/space_drugs name = "Space Drugs" description = "An illegal chemical compound used as drug." color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 30 - ph = 9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/hallucinogens = 10) //4 per 2 seconds -/datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(30 SECONDS * REM * delta_time, /datum/status_effect/drugginess) - if(isturf(M.loc) && !isspaceturf(M.loc) && !HAS_TRAIT(M, TRAIT_IMMOBILIZED) && DT_PROB(5, delta_time)) - step(M, pick(GLOB.cardinals)) - if(DT_PROB(3.5, delta_time)) - M.emote(pick("twitch","drool","moan","giggle")) - ..() + addiction_types = list(/datum/addiction/hallucinogens = 10) //4 per 2 seconds -/datum/reagent/drug/space_drugs/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You start tripping hard!")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name) +/datum/reagent/drug/space_drugs/affect_blood(mob/living/carbon/C, removed) + C.set_drugginess_if_lower(15 SECONDS) + if(isturf(C.loc) && !isspaceturf(C.loc) && !HAS_TRAIT(C, TRAIT_IMMOBILIZED) && prob(10)) + step(C, pick(GLOB.cardinals)) + if(prob(7)) + spawn(-1) + C.emote(pick("twitch","drool","moan","giggle")) -/datum/reagent/drug/space_drugs/overdose_process(mob/living/M, delta_time, times_fired) - if(M.hallucination < volume && DT_PROB(10, delta_time)) - M.hallucination += 5 - ..() +/datum/reagent/drug/space_drugs/overdose_start(mob/living/carbon/C) + to_chat(C, span_notice("Whoooaaaaa. Birds in space... freaky.")) +/datum/reagent/drug/space_drugs/overdose_process(mob/living/carbon/C) + if(C.hallucination < volume && prob(10)) + C.hallucination += 5 /datum/reagent/drug/cannabis name = "Cannabis" description = "A psychoactive drug from the Cannabis plant used for recreational purposes." color = "#059033" - overdose_threshold = INFINITY - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - metabolization_rate = 0.125 * REAGENTS_METABOLISM - -/datum/reagent/drug/cannabis/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.apply_status_effect(/datum/status_effect/stoned) - if(DT_PROB(1, delta_time)) + overdose_threshold = 0 + + metabolization_rate = 0.05 + +/datum/reagent/drug/cannabis/affect_blood(mob/living/carbon/C, removed) + C.apply_status_effect(/datum/status_effect/stoned) + if(prob(1)) var/smoke_message = pick("You feel relaxed.","You feel calmed.","Your mouth feels dry.","You could use some water.","Your heart beats quickly.","You feel clumsy.","You crave junk food.","You notice you've been moving more slowly.") - to_chat(M, "[smoke_message]") - if(DT_PROB(2, delta_time)) - M.emote(pick("smile","laugh","giggle")) - M.adjust_nutrition(-1 * REM * delta_time) //munchies - if(DT_PROB(4, delta_time) && M.body_position == LYING_DOWN && !M.IsSleeping()) //chance to fall asleep if lying down - to_chat(M, "You doze off...") - M.Sleeping(10 SECONDS) - if(DT_PROB(4, delta_time) && M.buckled && M.body_position != LYING_DOWN && !M.IsParalyzed()) //chance to be couchlocked if sitting - to_chat(M, "It's too comfy to move...") - M.Paralyze(10 SECONDS) - return ..() + to_chat(C, "[smoke_message]") + if(prob(2)) + spawn(-1) + C.emote(pick("smile","laugh","giggle")) + + C.adjust_nutrition(-0.5 * removed) //munchies + + if(prob(4) && C.body_position == LYING_DOWN && !C.IsSleeping()) //chance to fall asleep if lying down + to_chat(C, "You doze off...") + C.Sleeping(10 SECONDS) + + if(prob(4) && C.buckled && C.body_position != LYING_DOWN && !C.IsParalyzed()) //chance to be couchlocked if sitting + to_chat(C, "It's too comfy to move...") + C.Paralyze(10 SECONDS) /datum/reagent/drug/nicotine name = "Nicotine" @@ -67,11 +61,10 @@ color = "#60A584" // rgb: 96, 165, 132 taste_description = "smoke" trippy = FALSE - overdose_threshold=15 - metabolization_rate = 0.125 * REAGENTS_METABOLISM - ph = 8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/nicotine = 18) // 7.2 per 2 seconds + overdose_threshold = 30 + metabolization_rate = 0.01 + + addiction_types = list(/datum/addiction/nicotine = 18) //Nicotine is used as a pesticide IRL. /datum/reagent/drug/nicotine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -80,25 +73,35 @@ mytray.adjust_toxic(round(chems.get_reagent_amount(type))) mytray.adjust_pestlevel(-rand(1,2)) -/datum/reagent/drug/nicotine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(0.5, delta_time)) +/datum/reagent/drug/nicotine/affect_blood(mob/living/carbon/C, removed) + if(prob(volume * 20)) + APPLY_CHEM_EFFECT(C, CE_PULSE, 1) + + if(prob(0.5)) var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.") - to_chat(M, span_notice("[smoke_message]")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name) - M.remove_status_effect(/datum/status_effect/jitter) - M.AdjustStun(-50 * REM * delta_time) - M.AdjustKnockdown(-50 * REM * delta_time) - M.AdjustUnconscious(-50 * REM * delta_time) - M.AdjustParalyzed(-50 * REM * delta_time) - M.AdjustImmobilized(-50 * REM * delta_time) - ..() + to_chat(C, span_notice("[smoke_message]")) + + C.remove_status_effect(/datum/status_effect/jitter) + C.AdjustStun(-10 * removed) + C.AdjustKnockdown(-10 * removed) + C.AdjustUnconscious(-10 * removed) + C.AdjustParalyzed(-10 * removed) + C.AdjustImmobilized(-10 * removed) . = TRUE -/datum/reagent/drug/nicotine/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustToxLoss(0.1 * REM * delta_time, 0) - M.adjustOxyLoss(1.1 * REM * delta_time, 0) - ..() - . = TRUE +/datum/reagent/drug/nicotine/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.stats?.set_skill_modifier(1, /datum/rpg_skill/handicraft, SKILL_SOURCE_NICOTINE) + +/datum/reagent/drug/nicotine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.stats?.remove_skill_modifier(/datum/rpg_skill/handicraft, SKILL_SOURCE_NICOTINE) + +/datum/reagent/drug/nicotine/overdose_process(mob/living/carbon/C) + . = ..() + APPLY_CHEM_EFFECT(C, CE_PULSE, 2) /datum/reagent/drug/krokodil name = "Krokodil" @@ -106,84 +109,71 @@ reagent_state = LIQUID color = "#0064B4" overdose_threshold = 20 - ph = 9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/opiods = 18) //7.2 per 2 seconds +/datum/reagent/drug/krokodil/affect_blood(mob/living/carbon/C, removed) + var/high_message = pick("You feel calC.", "You feel collected.", "You feel like you need to relax.") + if(prob(5)) + to_chat(C, span_notice("[high_message]")) -/datum/reagent/drug/krokodil/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[high_message]")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smacked out", /datum/mood_event/narcotic_heavy, name) - if(current_cycle == 35 && creation_purity <= 0.6) - if(!istype(M.dna.species, /datum/species/human/krokodil_addict)) - to_chat(M, span_userdanger("Your skin falls off easily!")) - var/mob/living/carbon/human/H = M - H.facial_hairstyle = "Shaved" - H.hairstyle = "Bald" - H.update_body_parts() // makes you loose hair as well - M.set_species(/datum/species/human/krokodil_addict) - M.adjustBruteLoss(50*REM, 0) // holy shit your skin just FELL THE FUCK OFF - ..() - -/datum/reagent/drug/krokodil/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25 * REM * delta_time) - M.adjustToxLoss(0.25 * REM * delta_time, 0) - ..() +/datum/reagent/drug/krokodil/overdose_process(mob/living/carbon/C) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.25, updating_health = FALSE) + C.adjustToxLoss(0.25, 0) . = TRUE - - /datum/reagent/drug/methamphetamine name = "Methamphetamine" description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" overdose_threshold = 20 - metabolization_rate = 0.75 * REAGENTS_METABOLISM - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.15 + addiction_types = list(/datum/addiction/stimulants = 12) //4.8 per 2 seconds -/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) +/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) -/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) - ..() +/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) -/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/drug/methamphetamine/affect_blood(mob/living/carbon/C, removed) var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[high_message]")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name) - M.AdjustStun(-40 * REM * delta_time) - M.AdjustKnockdown(-40 * REM * delta_time) - M.AdjustUnconscious(-40 * REM * delta_time) - M.AdjustParalyzed(-40 * REM * delta_time) - M.AdjustImmobilized(-40 * REM * delta_time) - M.stamina.adjust(2 * REM * delta_time) - M.set_timed_status_effect(4 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * delta_time) - if(DT_PROB(2.5, delta_time)) - M.emote(pick("twitch", "shiver")) - ..() + if(prob(5)) + to_chat(C, span_notice("[high_message]")) + + C.AdjustStun(-40 * removed) + C.AdjustKnockdown(-40 * removed) + C.AdjustUnconscious(-40 * removed) + C.AdjustParalyzed(-40 * removed) + C.AdjustImmobilized(-40 * removed) + C.stamina.adjust(20 * removed) + C.set_jitter_if_lower(10 SECONDS) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * removed, updating_health = FALSE) + if(prob(5)) + spawn(-1) + C.emote(pick("twitch", "shiver")) . = TRUE -/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M, delta_time, times_fired) - if(!HAS_TRAIT(M, TRAIT_IMMOBILIZED) && !ismovable(M.loc)) - for(var/i in 1 to round(4 * REM * delta_time, 1)) - step(M, pick(GLOB.cardinals)) - if(DT_PROB(10, delta_time)) - M.emote("laugh") - if(DT_PROB(18, delta_time)) - M.visible_message(span_danger("[M]'s hands flip out and flail everywhere!")) - M.drop_all_held_items() - ..() - M.adjustToxLoss(1 * REM * delta_time, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * delta_time) +/datum/reagent/drug/methamphetamine/overdose_process(mob/living/carbon/C) + if(!HAS_TRAIT(C, TRAIT_IMMOBILIZED) && !ismovable(C.loc)) + for(var/i in 1 to round(4)) + step(C, pick(GLOB.cardinals)) + + if(prob(10)) + spawn(-1) + C.emote("laugh") + if(prob(18)) + C.visible_message(span_danger("[C]'s hands flip out and flail everywhere!")) + C.drop_all_held_items() + + C.adjustToxLoss(1, 0) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10), updating_health = FALSE) . = TRUE /datum/reagent/drug/bath_salts @@ -194,114 +184,69 @@ overdose_threshold = 20 taste_description = "salt" // because they're bathsalts? addiction_types = list(/datum/addiction/stimulants = 25) //8 per 2 seconds + + var/datum/brain_trauma/special/psychotic_brawling/bath_salts/rage - ph = 8.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_STUNIMMUNE, type) - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - if(iscarbon(L)) - var/mob/living/carbon/C = L - rage = new() - C.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) - -/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, type) - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + +/datum/reagent/drug/bath_salts/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_STUNIMMUNE, type) + ADD_TRAIT(C, TRAIT_SLEEPIMMUNE, type) + rage = new() + C.gain_trauma(rage, TRAUMA_RESILIENCE_ABSOLUTE) + +/datum/reagent/drug/bath_salts/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_STUNIMMUNE, type) + REMOVE_TRAIT(C, TRAIT_SLEEPIMMUNE, type) if(rage) QDEL_NULL(rage) - ..() -/datum/reagent/drug/bath_salts/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/drug/bath_salts/affect_blood(mob/living/carbon/C, removed) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[high_message]")) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "salted", /datum/mood_event/stimulant_heavy, name) - M.stamina.adjust(5 * REM * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * REM * delta_time) - M.hallucination += 5 * REM * delta_time - if(!HAS_TRAIT(M, TRAIT_IMMOBILIZED) && !ismovable(M.loc)) - step(M, pick(GLOB.cardinals)) - step(M, pick(GLOB.cardinals)) - ..() + if(prob(5)) + to_chat(C, span_notice("[high_message]")) + + C.stamina.adjust(5 * removed) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4 * removed, updating_health = FALSE) + C.hallucination += 5 * removed + if(!HAS_TRAIT(C, TRAIT_IMMOBILIZED) && !ismovable(C.loc)) + step(C, pick(GLOB.cardinals)) + step(C, pick(GLOB.cardinals)) . = TRUE -/datum/reagent/drug/bath_salts/overdose_process(mob/living/M, delta_time, times_fired) - M.hallucination += 5 * REM * delta_time - if(!HAS_TRAIT(M, TRAIT_IMMOBILIZED) && !ismovable(M.loc)) - for(var/i in 1 to round(8 * REM * delta_time, 1)) - step(M, pick(GLOB.cardinals)) - if(DT_PROB(10, delta_time)) - M.emote(pick("twitch","drool","moan")) - if(DT_PROB(28, delta_time)) - M.drop_all_held_items() - ..() +/datum/reagent/drug/bath_salts/overdose_process(mob/living/carbon/C) + C.hallucination += 5 + if(!HAS_TRAIT(C, TRAIT_IMMOBILIZED) && !ismovable(C.loc)) + for(var/i in 1 to 8) + step(C, pick(GLOB.cardinals)) + + if(prob(10)) + spawn(-1) + C.emote(pick("twitch","drool","moan")) + if(prob(28)) + C.drop_all_held_items() /datum/reagent/drug/aranesp name = "Aranesp" description = "Amps you up, gets you going, and rapidly restores stamina damage. Side effects include breathlessness and toxicity." reagent_state = LIQUID color = "#78FFF0" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/stimulants = 8) -/datum/reagent/drug/aranesp/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/drug/aranesp/affect_blood(mob/living/carbon/C, removed) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[high_message]")) - M.stamina.adjust(-18 * REM * delta_time) - M.adjustToxLoss(0.5 * REM * delta_time, 0) - if(DT_PROB(30, delta_time)) - M.losebreath++ - M.adjustOxyLoss(1, 0) - ..() - . = TRUE - -/datum/reagent/drug/happiness - name = "Happiness" - description = "Fills you with ecstasic numbness and causes minor brain damage. Highly addictive. If overdosed causes sudden mood swings." - reagent_state = LIQUID - color = "#EE35FF" - overdose_threshold = 20 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - taste_description = "paint thinner" - addiction_types = list(/datum/addiction/hallucinogens = 18) - -/datum/reagent/drug/happiness/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_FEARLESS, type) - SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug) - -/datum/reagent/drug/happiness/on_mob_delete(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, type) - SEND_SIGNAL(L, COMSIG_CLEAR_MOOD_EVENT, "happiness_drug") - ..() - -/datum/reagent/drug/happiness/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.remove_status_effect(/datum/status_effect/jitter) - M.remove_status_effect(/datum/status_effect/confusion) - M.disgust = 0 - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * REM * delta_time) - ..() - . = TRUE - -/datum/reagent/drug/happiness/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(16, delta_time)) - var/reaction = rand(1,3) - switch(reaction) - if(1) - M.emote("laugh") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_good_od) - if(2) - M.emote("sway") - M.set_timed_status_effect(50 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(3) - M.emote("frown") - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "happiness_drug", /datum/mood_event/happiness_drug_bad_od) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5 * REM * delta_time) - ..() + if(prob(5)) + to_chat(C, span_notice("[high_message]")) + + C.stamina.adjust(-18 * removed) + C.adjustToxLoss(0.5 * removed, 0) + if(prob(30)) + C.losebreath++ + C.adjustOxyLoss(1 * removed, 0) . = TRUE /datum/reagent/drug/pumpup @@ -309,45 +254,49 @@ description = "Take on the world! A fast acting, hard hitting drug that pushes the limit on what you can handle." reagent_state = LIQUID color = "#e38e44" - metabolization_rate = 2 * REAGENTS_METABOLISM + metabolization_rate = 0.4 overdose_threshold = 30 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/stimulants = 6) //2.6 per 2 seconds -/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) +/datum/reagent/drug/pumpup/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_STUNRESISTANCE, type) + +/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_STUNRESISTANCE, type) -/datum/reagent/drug/pumpup/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - ..() +/datum/reagent/drug/pumpup/affect_blood(mob/living/carbon/C, removed) + C.set_jitter_if_lower(10 SECONDS) -/datum/reagent/drug/pumpup/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(5)) + to_chat(C, span_notice("[pick("Go! Go! GO!", "You feel ready...", "You feel invincible...")]")) - if(DT_PROB(2.5, delta_time)) - to_chat(M, span_notice("[pick("Go! Go! GO!", "You feel ready...", "You feel invincible...")]")) - if(DT_PROB(7.5, delta_time)) - M.losebreath++ - M.adjustToxLoss(2, 0) - ..() - . = TRUE + if(prob(14)) + C.losebreath++ + C.adjustToxLoss(2, 0) + . = TRUE -/datum/reagent/drug/pumpup/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You can't stop shaking, your heart beats faster and faster...")) - -/datum/reagent/drug/pumpup/overdose_process(mob/living/M, delta_time, times_fired) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(DT_PROB(2.5, delta_time)) - M.drop_all_held_items() - if(DT_PROB(7.5, delta_time)) - M.emote(pick("twitch","drool")) - if(DT_PROB(10, delta_time)) - M.losebreath++ - M.stamina.adjust(-4) - if(DT_PROB(7.5, delta_time)) - M.adjustToxLoss(2, 0) - ..() +/datum/reagent/drug/pumpup/overdose_start(mob/living/carbon/C) + to_chat(C, span_userdanger("You can't stop shaking, your heart beats faster and faster...")) + +/datum/reagent/drug/pumpup/overdose_process(mob/living/carbon/C) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + if(prob(5)) + C.drop_all_held_items() + if(prob(14)) + spawn(-1) + C.emote(pick("twitch","drool")) + if(prob(20)) + C.losebreath++ + C.stamina.adjust(-4) + + if(prob(14)) + C.adjustToxLoss(2, 0) + return TRUE /datum/reagent/drug/maint name = "Maintenance Drugs" @@ -359,61 +308,59 @@ description = "An unknown powder that you most likely gotten from an assistant, a bored chemist... or cooked yourself. It is a refined form of tar that enhances your mental ability, making you learn stuff a lot faster." reagent_state = SOLID color = "#ffffff" - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 0.1 overdose_threshold = 15 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/maintenance_drugs = 14) -/datum/reagent/drug/maint/powder/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = ..() - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1 * REM * delta_time) +/datum/reagent/drug/maint/powder/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.2 * removed, updating_health = FALSE) + // 5x if you want to OD, you can potentially go higher, but good luck managing the brain damage. var/amt = max(round(volume/3, 0.1), 1) - M?.mind?.experience_multiplier_reasons |= type - M?.mind?.experience_multiplier_reasons[type] = amt * REM * delta_time + C?.mind?.experience_multiplier_reasons |= type + C?.mind?.experience_multiplier_reasons[type] = amt + return TRUE -/datum/reagent/drug/maint/powder/on_mob_end_metabolize(mob/living/M) - . = ..() - M?.mind?.experience_multiplier_reasons[type] = null - M?.mind?.experience_multiplier_reasons -= type +/datum/reagent/drug/maint/powder/on_mob_end_metabolize(mob/living/carbon/C) + C?.mind?.experience_multiplier_reasons[type] = null + C?.mind?.experience_multiplier_reasons -= type -/datum/reagent/drug/maint/powder/overdose_process(mob/living/M, delta_time, times_fired) - . = ..() - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6 * REM * delta_time) +/datum/reagent/drug/maint/powder/overdose_process(mob/living/carbon/C) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 6, updating_health = FALSE) + return TRUE /datum/reagent/drug/maint/sludge name = "Maintenance Sludge" description = "An unknown sludge that you most likely gotten from an assistant, a bored chemist... or cooked yourself. Half refined, it fills your body with itself, making it more resistant to wounds, but causes toxins to accumulate." reagent_state = LIQUID color = "#203d2c" - metabolization_rate = 2 * REAGENTS_METABOLISM + metabolization_rate = 0.4 overdose_threshold = 25 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/maintenance_drugs = 8) -/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/L) + addiction_types = list(/datum/addiction/maintenance_drugs = 8) - . = ..() - ADD_TRAIT(L,TRAIT_HARDLY_WOUNDED,type) +/datum/reagent/drug/maint/sludge/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C,TRAIT_HARDLY_WOUNDED, type) -/datum/reagent/drug/maint/sludge/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = ..() - M.adjustToxLoss(0.5 * REM * delta_time) +/datum/reagent/drug/maint/sludge/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(0.5 * removed, FALSE) + return TRUE -/datum/reagent/drug/maint/sludge/on_mob_end_metabolize(mob/living/M) - . = ..() - REMOVE_TRAIT(M,TRAIT_HARDLY_WOUNDED,type) - -/datum/reagent/drug/maint/sludge/overdose_process(mob/living/M, delta_time, times_fired) - . = ..() - if(!iscarbon(M)) +/datum/reagent/drug/maint/sludge/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - var/mob/living/carbon/carbie = M + REMOVE_TRAIT(C, TRAIT_HARDLY_WOUNDED, type) + +/datum/reagent/drug/maint/sludge/overdose_process(mob/living/carbon/C) //You will be vomiting so the damage is really for a few ticks before you flush it out of your system - carbie.adjustToxLoss(1 * REM * delta_time) - if(DT_PROB(5, delta_time)) - carbie.adjustToxLoss(5) - carbie.vomit() + C.adjustToxLoss(1, FALSE) + if(prob(10)) + C.adjustToxLoss(5, FALSE) + C.vomit() + return TRUE /datum/reagent/drug/maint/tar name = "Maintenance Tar" @@ -421,56 +368,54 @@ reagent_state = LIQUID color = "#000000" overdose_threshold = 30 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/maintenance_drugs = 5) - -/datum/reagent/drug/maint/tar/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = ..() - M.AdjustStun(-10 * REM * delta_time) - M.AdjustKnockdown(-10 * REM * delta_time) - M.AdjustUnconscious(-10 * REM * delta_time) - M.AdjustParalyzed(-10 * REM * delta_time) - M.AdjustImmobilized(-10 * REM * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * REM * delta_time) + addiction_types = list(/datum/addiction/maintenance_drugs = 5) -/datum/reagent/drug/maint/tar/overdose_process(mob/living/M, delta_time, times_fired) - . = ..() +/datum/reagent/drug/maint/tar/affect_blood(mob/living/carbon/C, removed) + C.AdjustStun(-10 * removed) + C.AdjustKnockdown(-10 * removed) + C.AdjustUnconscious(-10 * removed) + C.AdjustParalyzed(-10 * removed) + C.AdjustImmobilized(-10 * removed) + C.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5 * removed, updating_health = FALSE) + return TRUE - M.adjustToxLoss(5 * REM * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 3 * REM * delta_time) +/datum/reagent/drug/maint/tar/overdose_process(mob/living/carbon/C) + C.adjustToxLoss(5, FALSE) + C.adjustOrganLoss(ORGAN_SLOT_LIVER, 3, updating_health = FALSE) + return TRUE /datum/reagent/drug/mushroomhallucinogen name = "Mushroom Hallucinogen" - description = "A strong hallucinogenic drug derived from certain species of mushroom." + description = "A strong hallucinogenic drug derived from certain species of mushrooC." color = "#E700E7" // rgb: 231, 0, 231 - metabolization_rate = 0.2 * REAGENTS_METABOLISM + metabolization_rate = 0.04 taste_description = "mushroom" - ph = 11 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/hallucinogens = 12) -/datum/reagent/drug/mushroomhallucinogen/on_mob_life(mob/living/carbon/psychonaut, delta_time, times_fired) - psychonaut.set_timed_status_effect(1 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/drunk, only_if_higher = TRUE) +/datum/reagent/drug/mushroomhallucinogen/affect_blood(mob/living/carbon/psychonaut, removed) + psychonaut.set_slurring_if_lower(1 SECOND) switch(current_cycle) if(1 to 5) - if(DT_PROB(5, delta_time)) - psychonaut.emote(pick("twitch","giggle")) + if(prob(10)) + spawn(-1) + psychonaut.emote(pick("twitch","giggle")) if(5 to 10) - psychonaut.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(DT_PROB(10, delta_time)) - psychonaut.emote(pick("twitch","giggle")) + psychonaut.set_jitter_if_lower(20 SECONDS) + if(prob(20)) + spawn(-1) + psychonaut.emote(pick("twitch","giggle")) if (10 to INFINITY) - psychonaut.set_timed_status_effect(40 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(DT_PROB(16, delta_time)) - psychonaut.emote(pick("twitch","giggle")) - ..() + psychonaut.set_jitter_if_lower(20 SECONDS) + if(prob(32)) + spawn(-1) + psychonaut.emote(pick("twitch","giggle")) -/datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut) - . = ..() - - SEND_SIGNAL(psychonaut, COMSIG_ADD_MOOD_EVENT, "tripping", /datum/mood_event/high, name) +/datum/reagent/drug/mushroomhallucinogen/on_mob_metabolize(mob/living/psychonaut, class) + if(class != CHEM_BLOOD) + return if(!psychonaut.hud_used) return @@ -494,9 +439,9 @@ for(var/filter in game_plane_master_controller.get_filters("psilocybin_wave")) animate(filter, time = 64 SECONDS, loop = -1, easing = LINEAR_EASING, offset = 32, flags = ANIMATION_PARALLEL) -/datum/reagent/drug/mushroomhallucinogen/on_mob_end_metabolize(mob/living/psychonaut) - . = ..() - SEND_SIGNAL(psychonaut, COMSIG_CLEAR_MOOD_EVENT, "tripping") +/datum/reagent/drug/mushroomhallucinogen/on_mob_end_metabolize(mob/living/psychonaut, class) + if(class != CHEM_BLOOD) + return if(!psychonaut.hud_used) return var/atom/movable/plane_master_controller/game_plane_master_controller = psychonaut.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] @@ -509,9 +454,8 @@ reagent_state = LIQUID color = "#9015a9" taste_description = "holodisk cleaner" - ph = 5 overdose_threshold = 30 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/hallucinogens = 15) ///How many flips have we done so far? var/flip_count = 0 @@ -520,10 +464,9 @@ ///How many flips for a super flip? var/super_flip_requirement = 3 -/datum/reagent/drug/blastoff/on_mob_metabolize(mob/living/dancer) - . = ..() - - SEND_SIGNAL(dancer, COMSIG_ADD_MOOD_EVENT, "vibing", /datum/mood_event/high, name) +/datum/reagent/drug/blastoff/on_mob_metabolize(mob/living/dancer, class) + if(class != CHEM_BLOOD) + return RegisterSignal(dancer, COMSIG_MOB_EMOTED("flip"), PROC_REF(on_flip)) RegisterSignal(dancer, COMSIG_MOB_EMOTED("spin"), PROC_REF(on_spin)) @@ -551,10 +494,9 @@ dancer.sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC -/datum/reagent/drug/blastoff/on_mob_end_metabolize(mob/living/dancer) - . = ..() - - SEND_SIGNAL(dancer, COMSIG_CLEAR_MOOD_EVENT, "vibing") +/datum/reagent/drug/blastoff/on_mob_end_metabolize(mob/living/dancer, class) + if(class != CHEM_BLOOD) + return UnregisterSignal(dancer, COMSIG_MOB_EMOTED("flip")) UnregisterSignal(dancer, COMSIG_MOB_EMOTED("spin")) @@ -567,21 +509,22 @@ game_plane_master_controller.remove_filter("blastoff_wave") dancer.sound_environment_override = NONE -/datum/reagent/drug/blastoff/on_mob_life(mob/living/carbon/dancer, delta_time, times_fired) - . = ..() +/datum/reagent/drug/blastoff/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * removed, updating_health = FALSE) + C.AdjustKnockdown(-20 * removed) - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * delta_time) - dancer.AdjustKnockdown(-20) + if(prob(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume)) + spawn(-1) + C.emote("flip") + return TRUE - if(DT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, delta_time)) - dancer.emote("flip") +/datum/reagent/drug/blastoff/overdose_process(mob/living/carbon/C) + C.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3, updating_health = FALSE) -/datum/reagent/drug/blastoff/overdose_process(mob/living/dancer, delta_time, times_fired) - . = ..() - dancer.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.3 * REM * delta_time) - - if(DT_PROB(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume, delta_time)) - dancer.emote("spin") + if(prob(BLASTOFF_DANCE_MOVE_CHANCE_PER_UNIT * volume)) + spawn(-1) + C.emote("spin") + return TRUE ///This proc listens to the flip signal and throws the mob every third flip /datum/reagent/drug/blastoff/proc/on_flip() @@ -616,16 +559,17 @@ dancer.spin(30, 2) if(dancer.disgust < 40) dancer.adjust_disgust(10) - if(!dancer.pulledby) + if(!LAZYLEN(dancer.grabbed_by)) return var/dancer_turf = get_turf(dancer) - var/atom/movable/dance_partner = dancer.pulledby - dance_partner.visible_message(span_danger("[dance_partner] tries to hold onto [dancer], but is thrown back!"), span_danger("You try to hold onto [dancer], but you are thrown back!"), null, COMBAT_MESSAGE_RANGE) - var/throwtarget = get_edge_target_turf(dancer_turf, get_dir(dancer_turf, get_step_away(dance_partner, dancer_turf))) - if(overdosed) - dance_partner.throw_at(target = throwtarget, range = 7, speed = 4) - else - dance_partner.throw_at(target = throwtarget, range = 4, speed = 1) //superspeed + for(var/obj/item/hand_item/grab/G in dancer.grabbed_by) + var/atom/movable/dance_partner = G.assailant + dance_partner.visible_message(span_danger("[dance_partner] tries to hold onto [dancer], but is thrown back!"), span_danger("You try to hold onto [dancer], but you are thrown back!"), null, COMBAT_MESSAGE_RANGE) + var/throwtarget = get_edge_target_turf(dancer_turf, get_dir(dancer_turf, get_step_away(dance_partner, dancer_turf))) + if(overdosed) + dance_partner.throw_at(target = throwtarget, range = 7, speed = 4) + else + dance_partner.throw_at(target = throwtarget, range = 4, speed = 1) //superspeed /datum/reagent/drug/saturnx name = "SaturnX" @@ -634,17 +578,17 @@ taste_description = "metallic bitterness" color = "#638b9b" overdose_threshold = 25 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.25 + addiction_types = list(/datum/addiction/maintenance_drugs = 20) -/datum/reagent/drug/saturnx/on_mob_life(mob/living/carbon/invisible_man, delta_time, times_fired) - . = ..() - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * REM * delta_time) +/datum/reagent/drug/saturnx/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/drug/saturnx/on_mob_metabolize(mob/living/invisible_man) - . = ..() +/datum/reagent/drug/saturnx/on_mob_metabolize(mob/living/invisible_man, class) + if(class != CHEM_BLOOD) + return playsound(invisible_man, 'sound/chemistry/saturnx_fade.ogg', 40) to_chat(invisible_man, span_nicegreen("You feel pins and needles all over your skin as your body suddenly becomes transparent!")) addtimer(CALLBACK(src, PROC_REF(turn_man_invisible), invisible_man), 10) //just a quick delay to synch up the sound. @@ -683,7 +627,7 @@ return if(HAS_TRAIT(invisible_man, TRAIT_NOMETABOLISM)) return - if(invisible_man.has_status_effect(/datum/status_effect/grouped/stasis)) + if(invisible_man.has_status_effect(/datum/status_effect/grouped/hard_stasis)) return ADD_TRAIT(invisible_man, TRAIT_INVISIBLE_MAN, name) @@ -698,8 +642,9 @@ invisible_man.remove_from_all_data_huds() invisible_man.sound_environment_override = SOUND_ENVIROMENT_PHASED -/datum/reagent/drug/saturnx/on_mob_end_metabolize(mob/living/invisible_man) - . = ..() +/datum/reagent/drug/saturnx/on_mob_end_metabolize(mob/living/invisible_man, class) + if(class != CHEM_BLOOD) + return if(HAS_TRAIT(invisible_man, TRAIT_INVISIBLE_MAN)) invisible_man.add_to_all_human_data_huds() //Is this safe, what do you think, Floyd? REMOVE_TRAIT(invisible_man, TRAIT_INVISIBLE_MAN, name) @@ -720,61 +665,12 @@ game_plane_master_controller.remove_filter("saturnx_filter") game_plane_master_controller.remove_filter("saturnx_blur") -/datum/reagent/drug/saturnx/overdose_process(mob/living/invisible_man, delta_time, times_fired) - . = ..() - if(DT_PROB(7.5, delta_time)) - invisible_man.emote("giggle") - if(DT_PROB(5, delta_time)) - invisible_man.emote("laugh") - invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4 * REM * delta_time) - -/datum/reagent/drug/kronkaine - name = "Kronkaine" - description = "A highly illegal stimulant from the edge of the galaxy.\nIt is said the average kronkaine addict causes as much criminal damage as five stick up men, two rascals and one proferssional cambringo hustler combined." - reagent_state = SOLID - color = "#FAFAFA" - taste_description = "numbing bitterness" - ph = 8 - overdose_threshold = 20 - metabolization_rate = 0.75 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/stimulants = 20) - -/datum/reagent/drug/kronkaine/on_mob_metabolize(mob/living/kronkaine_fiend) - ..() - kronkaine_fiend.add_actionspeed_modifier(/datum/actionspeed_modifier/kronkaine) - kronkaine_fiend.sound_environment_override = SOUND_ENVIRONMENT_HANGAR - -/datum/reagent/drug/kronkaine/on_mob_end_metabolize(mob/living/kronkaine_fiend) - kronkaine_fiend.remove_actionspeed_modifier(/datum/actionspeed_modifier/kronkaine) - kronkaine_fiend.sound_environment_override = NONE - . = ..() - -/datum/reagent/drug/kronkaine/on_transfer(atom/kronkaine_receptacle, methods, trans_volume) - . = ..() - if(!iscarbon(kronkaine_receptacle)) - return - var/mob/living/carbon/druggo = kronkaine_receptacle - druggo.stamina.adjust(4 * trans_volume) - //I wish i could give it some kind of bonus when smoked, but we don't have an INHALE method. - -/datum/reagent/drug/kronkaine/on_mob_life(mob/living/carbon/kronkaine_fiend, delta_time, times_fired) - . = ..() - SEND_SIGNAL(kronkaine_fiend, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name) - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 0.4 * REM * delta_time) - kronkaine_fiend.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - kronkaine_fiend.AdjustSleeping(-20 * REM * delta_time) - kronkaine_fiend.adjust_drowsyness(-5 * REM * delta_time) - if(volume < 10) - return - for(var/possible_purger in kronkaine_fiend.reagents.reagent_list) - if(istype(possible_purger, /datum/reagent/medicine/c2/multiver) || istype(possible_purger, /datum/reagent/medicine/haloperidol)) - kronkaine_fiend.ForceContractDisease(new /datum/disease/adrenal_crisis(), FALSE, TRUE) //We punish players for purging, since unchecked purging would allow players to reap the stamina healing benefits without any drawbacks. This also has the benefit of making haloperidol a counter, like it is supposed to be. - break - -/datum/reagent/drug/kronkaine/overdose_process(mob/living/kronkaine_fiend, delta_time, times_fired) - . = ..() - kronkaine_fiend.adjustOrganLoss(ORGAN_SLOT_HEART, 1 * REM * delta_time) - kronkaine_fiend.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - if(DT_PROB(10, delta_time)) - to_chat(kronkaine_fiend, span_danger(pick("You feel like your heart is going to explode!", "Your ears are ringing!", "You sweat like a pig!", "You clench your jaw and grind your teeth.", "You feel prickles of pain in your chest."))) +/datum/reagent/drug/saturnx/overdose_process(mob/living/invisible_man) + if(prob(14)) + spawn(-1) + invisible_man.emote("giggle") + if(prob(10)) + spawn(-1) + invisible_man.emote("laugh") + invisible_man.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.4, updating_health = FALSE) + return TRUE diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 44c522a77445..98c7d33d2c57 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -11,47 +11,32 @@ name = "Consumable" taste_description = "generic food" taste_mult = 4 - inverse_chem_val = 0.1 - inverse_chem = null abstract_type = /datum/reagent/consumable /// How much nutrition this reagent supplies var/nutriment_factor = 1 * REAGENTS_METABOLISM var/quality = 0 //affects mood, typically higher for mixed drinks with more complex recipes' -/datum/reagent/consumable/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - current_cycle++ - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!HAS_TRAIT(H, TRAIT_NOHUNGER)) - H.adjust_nutrition(nutriment_factor * REM * delta_time) - if(length(reagent_removal_skip_list)) - return - holder.remove_reagent(type, metabolization_rate * delta_time) - -/datum/reagent/consumable/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/consumable/New() . = ..() - if(!(methods & INGEST) || !quality || HAS_TRAIT(exposed_mob, TRAIT_AGEUSIA)) + ingest_met = metabolization_rate + +/datum/reagent/consumable/affect_ingest(mob/living/carbon/C, removed) + C.adjust_nutrition(nutriment_factor * removed) + return ..() + +/datum/reagent/consumable/on_mob_metabolize(mob/living/carbon/C, class) + if(!(class == CHEM_INGEST) || HAS_TRAIT(C, TRAIT_AGEUSIA)) return - switch(quality) - if (DRINK_NICE) - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_nice) - if (DRINK_GOOD) - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_good) - if (DRINK_VERYGOOD) - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_verygood) - if (DRINK_FANTASTIC) - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "quality_drink", /datum/mood_event/quality_fantastic) - exposed_mob.mind?.add_memory(MEMORY_DRINK, list(DETAIL_DRINK = src), story_value = STORY_VALUE_OKAY) - if (FOOD_AMAZING) - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "quality_food", /datum/mood_event/amazingtaste) + if(quality >= DRINK_FANTASTIC) + C.mind?.add_memory(MEMORY_DRINK, list(DETAIL_DRINK = src), story_value = STORY_VALUE_OKAY) /datum/reagent/consumable/nutriment name = "Nutriment" - description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." + description = "All the vitamins, minerals, and carbohydrates the body needs in pure forC." reagent_state = SOLID nutriment_factor = 15 * REAGENTS_METABOLISM color = "#664330" // rgb: 102, 67, 48 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/brute_heal = 1 var/burn_heal = 0 @@ -61,11 +46,11 @@ if(chems.has_reagent(type, 1)) mytray.adjust_plant_health(round(chems.get_reagent_amount(type) * 0.2)) -/datum/reagent/consumable/nutriment/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(30, delta_time)) - M.heal_bodypart_damage(brute = brute_heal, burn = burn_heal) +/datum/reagent/consumable/nutriment/affect_ingest(mob/living/carbon/C, removed) + if(prob(60)) + C.heal_bodypart_damage(brute = brute_heal * removed, burn = burn_heal * removed) . = TRUE - ..() + return ..() || . /datum/reagent/consumable/nutriment/on_new(list/supplied_data) . = ..() @@ -110,16 +95,20 @@ /datum/reagent/consumable/nutriment/vitamin name = "Vitamin" - description = "All the best vitamins, minerals, and carbohydrates the body needs in pure form." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + description = "All the best vitamins, minerals, and carbohydrates the body needs in pure forC." + brute_heal = 1 burn_heal = 1 -/datum/reagent/consumable/nutriment/vitamin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.satiety < 600) - M.satiety += 30 * REM * delta_time - . = ..() +/datum/reagent/consumable/nutriment/vitamin/affect_ingest(mob/living/carbon/C, removed) + if(C.satiety < 600) + C.satiety += 10 * removed + return ..() + +/datum/reagent/consumable/nutriment/vitamin/affect_blood(mob/living/carbon/C, removed) + if(C.satiety < 600) + C.satiety += 20 * removed //Doubled to account for ingestion only putting half into the blood stream /// The basic resource of vat growing. /datum/reagent/consumable/nutriment/protein @@ -127,13 +116,13 @@ description = "A natural polyamide made up of amino acids. An essential constituent of mosts known forms of life." brute_heal = 0.8 //Rewards the player for eating a balanced diet. nutriment_factor = 9 * REAGENTS_METABOLISM //45% as calorie dense as corn oil. - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/nutriment/organ_tissue name = "Organ Tissue" description = "Natural tissues that make up the bulk of organs, providing many vitamins and minerals." taste_description = "rich earthy pungent" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cooking_oil name = "Cooking Oil" @@ -142,10 +131,11 @@ taste_mult = 0.8 taste_description = "oil" nutriment_factor = 7 * REAGENTS_METABOLISM //Not very healthy on its own - metabolization_rate = 10 * REAGENTS_METABOLISM + metabolization_rate = 2 + ingest_met = 2 penetrates_skin = NONE var/fry_temperature = 450 //Around ~350 F (117 C) which deep fryers operate around in the real world - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cooking_oil/expose_obj(obj/exposed_obj, reac_volume) . = ..() @@ -164,7 +154,7 @@ fry_target.fry(volume) fry_target.reagents.add_reagent(/datum/reagent/consumable/cooking_oil, reac_volume) -/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) +/datum/reagent/consumable/cooking_oil/expose_mob(mob/living/exposed_mob, methods, reac_volume, show_message, touch_protection) . = ..() if(!(methods & (VAPOR|TOUCH)) || isnull(holder) || (holder.chem_temp < fry_temperature)) //Directly coats the mob, and doesn't go into their bloodstream return @@ -182,7 +172,7 @@ ADD_TRAIT(exposed_mob, TRAIT_OIL_FRIED, "cooking_oil_react") addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living, unfry_mob)), 3) if(FryLoss) - exposed_mob.adjustFireLoss(FryLoss) + exposed_mob.apply_damage(FryLoss, BURN, spread_damage = TRUE) /datum/reagent/consumable/cooking_oil/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() @@ -194,16 +184,17 @@ exposed_turf.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) /datum/reagent/consumable/sugar - name = "Sugar" + name = "Sucrose" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." reagent_state = SOLID color = "#FFFFFF" // rgb: 255, 255, 255 - taste_mult = 1.5 // stop sugar drowning out other flavours + taste_mult = 1.5 nutriment_factor = 10 * REAGENTS_METABOLISM - metabolization_rate = 2 * REAGENTS_METABOLISM - overdose_threshold = 200 // Hyperglycaemic shock + metabolization_rate = 0.4 + ingest_met = 0.4 + overdose_threshold = 200 taste_description = "sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // Plants should not have sugar, they can't use it and it prevents them getting water/ nutients, it is good for mold though... /datum/reagent/consumable/sugar/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -212,14 +203,13 @@ mytray.adjust_weedlevel(rand(1,2)) mytray.adjust_pestlevel(rand(1,2)) -/datum/reagent/consumable/sugar/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You go into hyperglycaemic shock! Lay off the twinkies!")) - M.AdjustSleeping(600) +/datum/reagent/consumable/sugar/overdose_start(mob/living/carbon/C) + to_chat(C, span_userdanger("Your body quakes as you collapse to the ground!")) + C.AdjustSleeping(600) . = TRUE -/datum/reagent/consumable/sugar/overdose_process(mob/living/M, delta_time, times_fired) - M.AdjustSleeping(40 * REM * delta_time) - ..() +/datum/reagent/consumable/sugar/overdose_process(mob/living/carbon/C) + C.Sleeping(40) . = TRUE /datum/reagent/consumable/virus_food @@ -228,7 +218,7 @@ nutriment_factor = 2 * REAGENTS_METABOLISM color = "#899613" // rgb: 137, 150, 19 taste_description = "watery milk" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // Compost for EVERYTHING /datum/reagent/consumable/virus_food/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -242,7 +232,7 @@ nutriment_factor = 2 * REAGENTS_METABOLISM color = "#792300" // rgb: 121, 35, 0 taste_description = "umami" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/ketchup name = "Ketchup" @@ -250,7 +240,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#731008" // rgb: 115, 16, 8 taste_description = "ketchup" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/capsaicin @@ -259,80 +249,64 @@ color = "#B31008" // rgb: 179, 16, 8 taste_description = "hot peppers" taste_mult = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/capsaicin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + +/datum/reagent/consumable/capsaicin/affect_ingest(mob/living/carbon/C, removed) var/heating = 0 switch(current_cycle) if(1 to 15) heating = 5 - if(holder.has_reagent(/datum/reagent/cryostylane)) - holder.remove_reagent(/datum/reagent/cryostylane, 5 * REM * delta_time) - if(isslime(M)) - heating = rand(5, 20) if(15 to 25) heating = 10 - if(isslime(M)) - heating = rand(10, 20) if(25 to 35) heating = 15 - if(isslime(M)) - heating = rand(15, 20) if(35 to INFINITY) heating = 20 - if(isslime(M)) - heating = rand(20, 25) - M.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time) - ..() + C.adjust_bodytemperature(heating * TEMPERATURE_DAMAGE_COEFFICIENT * removed) + return ..() /datum/reagent/consumable/frostoil name = "Frost Oil" description = "A special oil that noticeably chills the body. Extracted from chilly peppers and slimes." color = "#8BA6E9" // rgb: 139, 166, 233 taste_description = "mint" - ph = 13 //HMM! I wonder - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + ///40 joules per unit. specific_heat = 40 -/datum/reagent/consumable/frostoil/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/consumable/frostoil/affect_ingest(mob/living/carbon/C, removed) var/cooling = 0 switch(current_cycle) if(1 to 15) cooling = -10 if(holder.has_reagent(/datum/reagent/consumable/capsaicin)) - holder.remove_reagent(/datum/reagent/consumable/capsaicin, 5 * REM * delta_time) - if(isslime(M)) - cooling = -rand(5, 20) + holder.remove_reagent(/datum/reagent/consumable/capsaicin, 5 * removed) if(15 to 25) cooling = -20 - if(isslime(M)) - cooling = -rand(10, 20) if(25 to 35) cooling = -30 if(prob(1)) - M.emote("shiver") - if(isslime(M)) - cooling = -rand(15, 20) + spawn(-1) + C.emote("shiver") if(35 to INFINITY) cooling = -40 if(prob(5)) - M.emote("shiver") - if(isslime(M)) - cooling = -rand(20, 25) - M.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 50) - ..() + C.emote("shiver") + C.adjust_bodytemperature(cooling * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 50) + return ..() /datum/reagent/consumable/frostoil/expose_turf(turf/exposed_turf, reac_volume) . = ..() if(reac_volume < 1) return - if(isopenturf(exposed_turf)) + + if(isopenturf(exposed_turf) && exposed_turf.simulated) var/turf/open/exposed_open_turf = exposed_turf + var/datum/gas_mixture/air = exposed_turf.return_air() exposed_open_turf.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=100, wet_time_to_add=reac_volume SECONDS) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure. - var/temperature = exposed_open_turf.air.temperature - var/heat_capacity = exposed_open_turf.air.getHeatCapacity() - exposed_open_turf.air.temperature = max(exposed_open_turf.air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit. + var/temperature = air.temperature + var/heat_capacity = air.getHeatCapacity() + air.temperature = max(air.temperature - ((temperature - TCMB) * (heat_capacity * reac_volume * specific_heat) / (heat_capacity + reac_volume * specific_heat)) / heat_capacity, TCMB) // Exchanges environment temperature with reagent. Reagent is at 2.7K with a heat capacity of 40J per unit. if(reac_volume < 5) return for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) @@ -344,10 +318,9 @@ color = "#B31008" // rgb: 179, 16, 8 taste_description = "scorching agony" penetrates_skin = NONE - ph = 7.4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) + +/datum/reagent/consumable/condensedcapsaicin/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() if(!ishuman(exposed_mob)) return @@ -360,7 +333,8 @@ //actually handle the pepperspray effects if (!(pepper_proof)) // you need both eye and mouth protection if(prob(5)) - victim.emote("scream") + spawn(-1) + victim.emote("scream") victim.blur_eyes(5) // 10 seconds victim.blind_eyes(3) // 6 seconds victim.set_timed_status_effect(5 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) @@ -368,33 +342,22 @@ victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob, remove_movespeed_modifier), /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS) victim.update_damage_hud() - if(methods & INGEST) - if(!holder.has_reagent(/datum/reagent/consumable/milk)) - if(prob(15)) - to_chat(exposed_mob, span_danger("[pick("Your head pounds.", "Your mouth feels like it's on fire.", "You feel dizzy.")]")) - if(prob(10)) - victim.blur_eyes(1) - if(prob(10)) - victim.set_timed_status_effect(2 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(prob(5)) - victim.vomit() -/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/consumable/condensedcapsaicin/affect_ingest(mob/living/carbon/C, removed) if(!holder.has_reagent(/datum/reagent/consumable/milk)) - if(DT_PROB(5, delta_time)) - M.visible_message(span_warning("[M] [pick("dry heaves!","coughs!","splutters!")]")) - ..() + if(prob(10)) + C.visible_message(span_warning("[C] [pick("dry heaves!","coughs!","splutters!")]")) + return ..() /datum/reagent/consumable/salt - name = "Table Salt" - description = "A salt made of sodium chloride. Commonly used to season food." + name = "Sodium Chloride" + description = "No dude, that's salt." reagent_state = SOLID color = "#FFFFFF" // rgb: 255,255,255 taste_description = "salt" penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/salt/expose_turf(turf/exposed_turf, reac_volume) //Creates an umbra-blocking salt pile +/datum/reagent/consumable/salt/expose_turf(turf/exposed_turf, reac_volume) . = ..() if(!istype(exposed_turf) || (reac_volume < 1)) return @@ -407,7 +370,7 @@ reagent_state = SOLID // no color (ie, black) taste_description = "pepper" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/coco name = "Coco Powder" @@ -416,51 +379,49 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 taste_description = "bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. name = "Garlic Juice" description = "Crushed garlic. Chefs love it, but it can make you smell bad." color = "#FEFEFE" taste_description = "garlic" - metabolization_rate = 0.15 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/garlic/on_mob_add(mob/living/L, amount) - . = ..() - ADD_TRAIT(L, TRAIT_GARLIC_BREATH, type) - -/datum/reagent/consumable/garlic/on_mob_delete(mob/living/L) - . = ..() - REMOVE_TRAIT(L, TRAIT_GARLIC_BREATH, type) - -/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. - if(DT_PROB(min(current_cycle/2, 12.5), delta_time)) - to_chat(M, span_danger("You can't get the scent of garlic out of your nose! You can barely think...")) - M.Paralyze(10) - M.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + ingest_met = 0.03 + +/datum/reagent/consumable/garlic/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + ADD_TRAIT(C, TRAIT_GARLIC_BREATH, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/consumable/garlic/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_INGEST) + REMOVE_TRAIT(C, TRAIT_GARLIC_BREATH, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/consumable/garlic/affect_blood(mob/living/carbon/C, removed) + if(isvampire(C)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(prob(min(current_cycle, 25))) + to_chat(C, span_danger("You can't get the scent of garlic out of your nose! You can barely think...")) + C.Paralyze(10) + C.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) else - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_CULINARY_METABOLISM)) - if(DT_PROB(10, delta_time)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate - M.heal_bodypart_damage(brute = 1, burn = 1) + if(prob(20)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate + C.heal_bodypart_damage(brute = 1 * removed, burn = 1 * removed, updating_health = FALSE) . = TRUE - ..() /datum/reagent/consumable/sprinkles name = "Sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." color = "#FF00FF" // rgb: 255, 0, 255 taste_description = "childhood whimsy" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) + +/datum/reagent/consumable/sprinkles/affect_ingest(mob/living/carbon/C, removed) + var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER) if(liver && HAS_TRAIT(liver, TRAIT_LAW_ENFORCEMENT_METABOLISM)) - M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time, 0) + C.heal_bodypart_damage(1 * removed, 1 * removed, updating_health = FALSE) . = TRUE - ..() + return ..() || . /datum/reagent/consumable/cornoil name = "Corn Oil" @@ -468,18 +429,18 @@ nutriment_factor = 20 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 taste_description = "slime" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cornoil/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() if(!istype(exposed_turf)) return exposed_turf.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) - var/obj/effect/hotspot/hotspot = exposed_turf.fire + var/obj/effect/hotspot/hotspot = exposed_turf.active_hotspot if(hotspot) var/datum/gas_mixture/lowertemp = exposed_turf.remove_air(exposed_turf.return_air().total_moles) lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0) - lowertemp.react(src) + lowertemp.react() exposed_turf.assume_air(lowertemp) qdel(hotspot) @@ -488,7 +449,7 @@ description = "A universal enzyme used in the preparation of certain chemicals and foods." color = "#365E30" // rgb: 54, 94, 48 taste_description = "sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/dry_ramen name = "Dry Ramen" @@ -496,7 +457,7 @@ reagent_state = SOLID color = "#302000" // rgb: 48, 32, 0 taste_description = "dry and cheap noodles" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/hot_ramen name = "Hot Ramen" @@ -504,7 +465,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 taste_description = "wet and cheap noodles" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/nutraslop name = "Nutraslop" @@ -512,11 +473,11 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#3E4A00" // rgb: 62, 74, 0 taste_description = "your imprisonment" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/hot_ramen/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 0, M.get_body_temp_normal()) - ..() + +/datum/reagent/consumable/hot_ramen/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, C.get_body_temp_normal()) + return ..() /datum/reagent/consumable/hell_ramen name = "Hell Ramen" @@ -524,11 +485,11 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#302000" // rgb: 48, 32, 0 taste_description = "wet and cheap noodles on fire" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/hell_ramen/on_mob_life(mob/living/carbon/target_mob, delta_time, times_fired) - target_mob.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time) - ..() + +/datum/reagent/consumable/hell_ramen/affect_ingest(mob/living/carbon/C, removed) + C.adjust_bodytemperature(10 * TEMPERATURE_DAMAGE_COEFFICIENT * removed) + return ..() /datum/reagent/consumable/flour name = "Flour" @@ -536,7 +497,7 @@ reagent_state = SOLID color = "#FFFFFF" // rgb: 0, 0, 0 taste_description = "chalky wheat" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/flour/expose_turf(turf/exposed_turf, reac_volume) . = ..() @@ -553,7 +514,7 @@ description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." color = "#801E28" // rgb: 128, 30, 40 taste_description = "cherry" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/bluecherryjelly name = "Blue Cherry Jelly" @@ -568,7 +529,7 @@ nutriment_factor = 3 * REAGENTS_METABOLISM color = "#FFFFFF" // rgb: 0, 0, 0 taste_description = "rice" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/vanilla name = "Vanilla Powder" @@ -577,7 +538,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#FFFACD" taste_description = "vanilla" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/eggyolk name = "Egg Yolk" @@ -585,7 +546,7 @@ nutriment_factor = 4 * REAGENTS_METABOLISM color = "#FFB500" taste_description = "egg" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/eggwhite name = "Egg White" @@ -593,7 +554,7 @@ nutriment_factor = 1.5 * REAGENTS_METABOLISM color = "#fffdf7" taste_description = "bland egg" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/corn_starch name = "Corn Starch" @@ -605,22 +566,21 @@ name = "Corn Syrup" description = "Decays into sugar." color = "#DBCE95" - metabolization_rate = 3 * REAGENTS_METABOLISM + ingest_met = 0.6 taste_description = "sweet slime" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * delta_time) - ..() + +/datum/reagent/consumable/corn_syrup/affect_ingest(mob/living/carbon/C, removed) + holder.add_reagent(/datum/reagent/consumable/sugar, 3 * removed) + return ..() /datum/reagent/consumable/honey name = "Honey" description = "Sweet sweet honey that decays into sugar. Has antibacterial and natural healing properties." color = "#d3a308" nutriment_factor = 15 * REAGENTS_METABOLISM - metabolization_rate = 1 * REAGENTS_METABOLISM + ingest_met = 0.2 taste_description = "sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED // On the other hand, honey has been known to carry pollen with it rarely. Can be used to take in a lot of plant qualities all at once, or harm the plant. /datum/reagent/consumable/honey/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -632,75 +592,67 @@ mytray.adjust_weedlevel(rand(1,2)) mytray.adjust_pestlevel(rand(1,2)) -/datum/reagent/consumable/honey/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - holder.add_reagent(/datum/reagent/consumable/sugar, 3 * REM * delta_time) - if(DT_PROB(33, delta_time)) - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - M.adjustOxyLoss(-1, 0) - M.adjustToxLoss(-1, 0) - ..() - -/datum/reagent/consumable/honey/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(!iscarbon(exposed_mob) || !(methods & (TOUCH|VAPOR|PATCH))) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - for(var/s in exposed_carbon.surgeries) - var/datum/surgery/surgery = s - surgery.speed_modifier = max(0.6, surgery.speed_modifier) +/datum/reagent/consumable/honey/affect_ingest(mob/living/carbon/C, removed) + holder.add_reagent(/datum/reagent/consumable/sugar, 3 * removed) + if(prob(33)) + var/heal = -1 * removed + C.adjustBruteLoss(heal, 0) + C.adjustFireLoss(heal, 0) + C.adjustOxyLoss(heal, 0) + C.adjustToxLoss(heal, 0) + . = TRUE + return ..() || . /datum/reagent/consumable/mayonnaise name = "Mayonnaise" description = "A white and oily mixture of mixed egg yolks." color = "#DFDFDF" taste_description = "mayonnaise" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/mold // yeah, ok, togopal, I guess you could call that a condiment name = "Mold" description = "This condiment will make any food break the mold. Or your stomach." color ="#708a88" taste_description = "rancid fungus" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/eggrot name = "Rotten Eggyolk" description = "It smells absolutely dreadful." color ="#708a88" taste_description = "rotten eggs" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/tearjuice name = "Tear Juice" description = "A blinding substance extracted from certain onions." color = "#c0c9a0" taste_description = "bitterness" - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/tearjuice/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) + +/datum/reagent/consumable/tearjuice/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - if(!(methods & INGEST) || !((methods & (TOUCH|PATCH|VAPOR)) && (exposed_mob.is_mouth_covered() || exposed_mob.is_eyes_covered()))) + if(!(methods & INGEST) || !((methods & (TOUCH|VAPOR)) && (exposed_mob.is_mouth_covered() || exposed_mob.is_eyes_covered()))) return - if(!exposed_mob.getorganslot(ORGAN_SLOT_EYES)) //can't blind somebody with no eyes + var/obj/item/organ/eyes/E = exposed_mob.getorganslot(ORGAN_SLOT_EYES) + if(!E && !(E.organ_flags & ORGAN_SYNTHETIC)) //can't blind somebody with no eyes to_chat(exposed_mob, span_notice("Your eye sockets feel wet.")) - else + else if(!(E.organ_flags & ORGAN_SYNTHETIC)) if(!exposed_mob.eye_blurry) to_chat(exposed_mob, span_warning("Tears well up in your eyes!")) exposed_mob.blind_eyes(2) exposed_mob.blur_eyes(5) -/datum/reagent/consumable/tearjuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - ..() - if(M.eye_blurry) //Don't worsen vision if it was otherwise fine - M.blur_eyes(4 * REM * delta_time) - if(DT_PROB(5, delta_time)) - to_chat(M, span_warning("Your eyes sting!")) - M.blind_eyes(2) +/datum/reagent/consumable/tearjuice/affect_ingest(mob/living/carbon/C, removed) + if(C.eye_blurry) //Don't worsen vision if it was otherwise fine + C.blur_eyes(4 * removed) + if(prob(10)) + to_chat(C, span_warning("Your eyes sting!")) + C.blind_eyes(2) + return ..() /datum/reagent/consumable/nutriment/stabilized name = "Stabilized Nutriment" @@ -708,87 +660,12 @@ reagent_state = SOLID nutriment_factor = 15 * REAGENTS_METABOLISM color = "#664330" // rgb: 102, 67, 48 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/nutriment/stabilized/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.nutrition > NUTRITION_LEVEL_FULL - 25) - M.adjust_nutrition(-3 * REM * nutriment_factor * delta_time) - ..() -////Lavaland Flora Reagents//// - - -/datum/reagent/consumable/entpoly - name = "Entropic Polypnium" - description = "An ichor, derived from a certain mushroom, makes for a bad time." - color = "#1d043d" - taste_description = "bitter mushroom" - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/entpoly/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(current_cycle >= 10) - M.Unconscious(40 * REM * delta_time, FALSE) - . = TRUE - if(DT_PROB(10, delta_time)) - M.losebreath += 4 - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM, 150) - M.adjustToxLoss(3*REM,0) - M.stamina.adjust(-10*REM) - M.blur_eyes(5) - . = TRUE - ..() - - -/datum/reagent/consumable/tinlux - name = "Tinea Luxor" - description = "A stimulating ichor which causes luminescent fungi to grow on the skin. " - color = "#b5a213" - taste_description = "tingling mushroom" - ph = 11.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - //Lazy list of mobs affected by the luminosity of this reagent. - var/list/mobs_affected - -/datum/reagent/consumable/tinlux/expose_mob(mob/living/exposed_mob) - . = ..() - add_reagent_light(exposed_mob) - -/datum/reagent/consumable/tinlux/on_mob_end_metabolize(mob/living/M) - remove_reagent_light(M) - -/datum/reagent/consumable/tinlux/proc/on_living_holder_deletion(mob/living/source) - SIGNAL_HANDLER - remove_reagent_light(source) - -/datum/reagent/consumable/tinlux/proc/add_reagent_light(mob/living/living_holder) - var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = living_holder.mob_light(2) - LAZYSET(mobs_affected, living_holder, mob_light_obj) - RegisterSignal(living_holder, COMSIG_PARENT_QDELETING, PROC_REF(on_living_holder_deletion)) - -/datum/reagent/consumable/tinlux/proc/remove_reagent_light(mob/living/living_holder) - UnregisterSignal(living_holder, COMSIG_PARENT_QDELETING) - var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = LAZYACCESS(mobs_affected, living_holder) - LAZYREMOVE(mobs_affected, living_holder) - if(mob_light_obj) - qdel(mob_light_obj) - - -/datum/reagent/consumable/vitfro - name = "Vitrium Froth" - description = "A bubbly paste that heals wounds of the skin." - color = "#d3a308" - nutriment_factor = 3 * REAGENTS_METABOLISM - taste_description = "fruity mushroom" - ph = 10.4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/consumable/vitfro/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(55, delta_time)) - M.adjustBruteLoss(-1, 0) - M.adjustFireLoss(-1, 0) - . = TRUE - ..() +/datum/reagent/consumable/nutriment/stabilized/affect_ingest(mob/living/carbon/C, removed) + if(C.nutrition > NUTRITION_LEVEL_FULL - 25) + C.adjust_nutrition(-3 * nutriment_factor * removed) + return ..() /datum/reagent/consumable/clownstears name = "Clown's Tears" @@ -796,8 +673,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#eef442" // rgb: 238, 244, 66 taste_description = "mournful honking" - ph = 9.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/liquidelectricity @@ -806,46 +682,39 @@ nutriment_factor = 5 * REAGENTS_METABOLISM color = "#97ee63" taste_description = "pure electricity" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/liquidelectricity/enriched name = "Enriched Liquid Electricity" -/datum/reagent/consumable/liquidelectricity/enriched/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) //can't be on life because of the way blood works. +/datum/reagent/consumable/liquidelectricity/affect_blood(mob/living/carbon/C, removed) . = ..() - if(!(methods & (INGEST|INJECT|PATCH)) || !iscarbon(exposed_mob)) - return - - var/mob/living/carbon/exposed_carbon = exposed_mob - var/obj/item/organ/stomach/ethereal/stomach = exposed_carbon.getorganslot(ORGAN_SLOT_STOMACH) + var/obj/item/organ/stomach/ethereal/stomach = C.getorganslot(ORGAN_SLOT_STOMACH) if(istype(stomach)) - stomach.adjust_charge(reac_volume * 30) - -/datum/reagent/consumable/liquidelectricity/enriched/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(isethereal(M)) - M.blood_volume += 1 * delta_time - else if(DT_PROB(10, delta_time)) //lmao at the newbs who eat energy bars - M.electrocute_act(rand(5,10), "Liquid Electricity in their body", 1, SHOCK_NOGLOVES) //the shock is coming from inside the house - playsound(M, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - return ..() + stomach.adjust_charge(removed * 60) + +/datum/reagent/consumable/liquidelectricity/enriched/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(isethereal(C)) + C.blood_volume += 2 * removed + else if(prob(20)) //lmao at the newbs who eat energy bars + C.electrocute_act(rand(5,10), "Liquid Electricity in their body", 1, SHOCK_NOGLOVES) //the shock is coming from inside the house + playsound(C, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) /datum/reagent/consumable/astrotame name = "Astrotame" description = "A space age artifical sweetener." nutriment_factor = 0 - metabolization_rate = 2 * REAGENTS_METABOLISM + ingest_met = 0.4 reagent_state = SOLID color = "#FFFFFF" // rgb: 255, 255, 255 taste_mult = 8 taste_description = "sweetness" overdose_threshold = 17 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/M, delta_time, times_fired) - if(M.disgust < 80) - M.adjust_disgust(10 * REM * delta_time) - ..() - . = TRUE +/datum/reagent/consumable/astrotame/overdose_process(mob/living/carbon/C) + if(C.disgust < 80) + C.adjust_disgust(10) /datum/reagent/consumable/secretsauce name = "Secret Sauce" @@ -855,7 +724,6 @@ taste_description = "indescribable" quality = FOOD_AMAZING taste_mult = 100 - ph = 6.1 /datum/reagent/consumable/nutriment/peptides name = "Peptides" @@ -865,9 +733,7 @@ nutriment_factor = 10 * REAGENTS_METABOLISM // 33% less than nutriment to reduce weight gain brute_heal = 3 burn_heal = 1 - inverse_chem = /datum/reagent/peptides_failed//should be impossible, but it's so it appears in the chemical lookup gui - inverse_chem_val = 0.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/caramel name = "Caramel" @@ -877,7 +743,7 @@ taste_mult = 2 taste_description = "caramel" reagent_state = SOLID - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/char name = "Char" @@ -888,13 +754,12 @@ taste_mult = 6 taste_description = "smoke" overdose_threshold = 15 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/char/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(13, delta_time)) - M.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) - ..() - return + +/datum/reagent/consumable/char/overdose_process(mob/living/C) + if(prob(25)) + spawn(-1) + C.say(pick_list_replacements(BOOMER_FILE, "boomer"), forced = /datum/reagent/consumable/char) /datum/reagent/consumable/bbqsauce name = "BBQ Sauce" @@ -903,7 +768,7 @@ color = "#78280A" // rgb: 120 40, 10 taste_mult = 2.5 //sugar's 1.5, capsacin's 1.5, so a good middle ground. taste_description = "smokey sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/chocolatepudding name = "Chocolate Pudding" @@ -915,7 +780,7 @@ glass_icon_state = "chocolatepudding" glass_name = "chocolate pudding" glass_desc = "Tasty." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + glass_price = DRINK_PRICE_EASY /datum/reagent/consumable/vanillapudding @@ -928,7 +793,7 @@ glass_icon_state = "vanillapudding" glass_name = "vanilla pudding" glass_desc = "Tasty." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/laughsyrup name = "Laughin' Syrup" @@ -937,7 +802,7 @@ nutriment_factor = 5 * REAGENTS_METABOLISM taste_mult = 2 taste_description = "fizzy sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/gravy name = "Gravy" @@ -945,37 +810,36 @@ taste_description = "gravy" color = "#623301" taste_mult = 1.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/pancakebatter name = "Pancake Batter" description = "A very milky batter. 5 units of this on the griddle makes a mean pancake." taste_description = "milky batter" color = "#fccc98" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/korta_flour name = "Korta Flour" description = "A coarsely ground, peppery flour made from korta nut shells." taste_description = "earthy heat" color = "#EEC39A" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/korta_milk name = "Korta Milk" description = "A milky liquid made by crushing the centre of a korta nut." taste_description = "sugary milk" color = "#FFFFFF" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/korta_nectar name = "Korta Nectar" description = "A sweet, sugary syrup made from crushed sweet korta nuts." color = "#d3a308" nutriment_factor = 5 * REAGENTS_METABOLISM - metabolization_rate = 1 * REAGENTS_METABOLISM + ingest_met = 0.2 taste_description = "peppery sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED /datum/reagent/consumable/whipped_cream name = "Whipped Cream" @@ -983,27 +847,26 @@ color = "#efeff0" nutriment_factor = 4 * REAGENTS_METABOLISM taste_description = "fluffy sweet cream" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/peanut_butter name = "Peanut Butter" description = "A rich, creamy spread produced by grinding peanuts." taste_description = "peanuts" color = "#D9A066" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/consumable/peanut_butter/on_mob_life(mob/living/carbon/M, delta_time, times_fired) //ET loves peanut butter - if(isabductor(M)) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "ET_pieces", /datum/mood_event/et_pieces, name) - M.set_timed_status_effect(30 SECONDS * REM * delta_time, /datum/status_effect/drugginess) - ..() + +/datum/reagent/consumable/peanut_butter/affect_ingest(mob/living/carbon/C, removed) //ET loves peanut butter + if(isabductor(C)) + C.set_timed_status_effect(30 SECONDS * removed, /datum/status_effect/drugginess, only_if_higher = TRUE) + return ..() /datum/reagent/consumable/vinegar name = "Vinegar" description = "Useful for pickling, or putting on chips." taste_description = "acid" color = "#661F1E" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //A better oil, representing choices like olive oil, argan oil, avocado oil, etc. /datum/reagent/consumable/quality_oil @@ -1011,14 +874,14 @@ description = "A high quality oil, suitable for dishes where the oil is a key flavour." taste_description = "olive oil" color = "#DBCF5C" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cornmeal name = "Cornmeal" description = "Ground cornmeal, for making corn related things." taste_description = "raw cornmeal" color = "#ebca85" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/yoghurt name = "Yoghurt" @@ -1026,11 +889,25 @@ taste_description = "yoghurt" color = "#efeff0" nutriment_factor = 2 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/consumable/cornmeal_batter name = "Cornmeal Batter" description = "An eggy, milky, corny mixture that's not very good raw." taste_description = "raw batter" color = "#ebca85" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + +/datum/reagent/consumable/tinlux + name = "Tinea Luxor" + description = "A stimulating ichor which causes luminescent fungi to grow on the skin. " + color = "#b5a213" + taste_description = "tingling mushroom" + chemical_flags = REAGENT_DEAD_PROCESS + +/datum/reagent/consumable/tinlux/on_mob_add(mob/living/living_mob) + . = ..() + living_mob.apply_status_effect(/datum/status_effect/tinlux_light) //infinite duration + +/datum/reagent/consumable/tinlux/on_mob_delete(mob/living/living_mob) + . = ..() + living_mob.remove_status_effect(/datum/status_effect/tinlux_light) diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents.dm deleted file mode 100644 index 4c2d057f4297..000000000000 --- a/code/modules/reagents/chemistry/reagents/impure_reagents.dm +++ /dev/null @@ -1,118 +0,0 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally, i.e. inverse_chems or impure_chems -//Inverse = Splitting -//Invert = Whole conversion - -//Causes slight liver damage, and that's it. -/datum/reagent/impurity - name = "Chemical Isomers" - description = "Impure chemical isomers made from inoptimal reactions. Causes mild liver damage" - //by default, it will stay hidden on splitting, but take the name of the source on inverting. Cannot be fractioned down either if the reagent is somehow isolated. - chemical_flags = REAGENT_SNEAKYNAME | REAGENT_DONOTSPLIT | REAGENT_CAN_BE_SYNTHESIZED //impure can be synthed, and is one of the only ways to get almost pure impure - ph = 3 - inverse_chem = null - inverse_chem_val = 0 - metabolization_rate = 0.1 * REM //default impurity is 0.75, so we get 25% converted. Default metabolisation rate is 0.4, so we're 4 times slower. - var/liver_damage = 0.5 - -/datum/reagent/impurity/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - var/obj/item/organ/liver/L = C.getorganslot(ORGAN_SLOT_LIVER) - if(!L)//Though, lets be safe - C.adjustToxLoss(1 * REM * delta_time, FALSE)//Incase of no liver! - return ..() - C.adjustOrganLoss(ORGAN_SLOT_LIVER, liver_damage * REM * delta_time) - return ..() - -//Basically just so people don't forget to adjust metabolization_rate -/datum/reagent/inverse - name = "Toxic Monomers" - description = "Inverse reagents are created when a reagent's purity is below it's inverse threshold. The are created either during ingestion - which will then replace their associated reagent, or some can be created during the reaction process." - ph = 2 - chemical_flags = REAGENT_SNEAKYNAME | REAGENT_DONOTSPLIT //Inverse generally cannot be synthed - they're difficult to get - //Mostly to be safe - but above flags will take care of this. Also prevents it from showing these on reagent lookups in the ui - inverse_chem = null - ///how much this reagent does for tox damage too - var/tox_damage = 1 - - -/datum/reagent/inverse/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - C.adjustToxLoss(tox_damage * REM * delta_time, FALSE) - return ..() - -//Failed chems - generally use inverse if you want to use a impure subtype for it -//technically not a impure chem, but it's here because it can only be made with a failed impure reaction -/datum/reagent/consumable/failed_reaction - name = "Viscous Sludge" - description = "A off smelling sludge that's created when a reaction gets too impure." - nutriment_factor = -1 - quality = -1 - ph = 1.5 - taste_description = "an awful, strongly chemical taste" - color = "#270d03" - glass_price = DRINK_PRICE_HIGH - fallback_icon_state = "failed_reaction_fallback" - -// Unique - -/datum/reagent/impurity/eigenswap - name = "Eigenswap" - description = "This reagent is known to swap the handedness of a patient." - ph = 3.3 - chemical_flags = REAGENT_DONOTSPLIT - -/datum/reagent/impurity/eigenswap/on_mob_life(mob/living/carbon/carbon_mob) - . = ..() - if(!prob(creation_purity * 100)) - return - var/list/cached_hand_items = carbon_mob.held_items - var/index = 1 - for(var/thing in cached_hand_items) - index++ - if(index > length(cached_hand_items))//If we're past the end of the list, go back to start - index = 1 - if(!thing) - continue - carbon_mob.put_in_hand(thing, index, forced = TRUE, ignore_anim = TRUE) - playsound(carbon_mob, 'sound/effects/phasein.ogg', 20, TRUE) -/* -* Freezes the player in a block of ice, 1s = 1u -* Will be removed when the required reagent is removed too -* is processed on the dead. -*/ -/atom/movable/screen/alert/status_effect/freon/cryostylane - desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! You will be free when the chem runs out." - -/datum/reagent/inverse/cryostylane - name = "Cryogelidia" - description = "Freezes the live or dead patient in a cryostasis ice block." - reagent_state = LIQUID - color = "#03dbfc" - taste_description = "your tongue freezing, shortly followed by your thoughts. Brr!" - ph = 14 - chemical_flags = REAGENT_DEAD_PROCESS | REAGENT_IGNORE_STASIS | REAGENT_DONOTSPLIT - metabolization_rate = 1 * REM - ///The cube we're stasis'd in - var/obj/structure/ice_stasis/cube - var/atom/movable/screen/alert/status_effect/freon/cryostylane_alert - -/datum/reagent/inverse/cryostylane/on_mob_add(mob/living/carbon/owner, amount) - cube = new /obj/structure/ice_stasis(get_turf(owner)) - cube.color = COLOR_CYAN - cube.set_anchored(TRUE) - owner.forceMove(cube) - owner.apply_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - cryostylane_alert = owner.throw_alert("cryostylane_alert", /atom/movable/screen/alert/status_effect/freon/cryostylane) - cryostylane_alert.attached_effect = src //so the alert can reference us, if it needs to - ..() - -/datum/reagent/inverse/cryostylane/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(!cube || owner.loc != cube) - owner.reagents.remove_reagent(type, volume) //remove it all if we're past 60s - if(current_cycle > 60) - metabolization_rate += 0.01 - ..() - -/datum/reagent/inverse/cryostylane/on_mob_delete(mob/living/carbon/owner, amount) - QDEL_NULL(cube) - owner.remove_status_effect(/datum/status_effect/grouped/stasis, STASIS_CHEMICAL_EFFECT) - owner.clear_alert("cryostylane_alert") - ..() diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm deleted file mode 100644 index df7b661d1261..000000000000 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_medicine_reagents.dm +++ /dev/null @@ -1,816 +0,0 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally these specifically are for medicines -//Inverse = Splitting -//Invert = Whole conversion -//Failed = End reaction below purity_min - -//START SUBTYPES - -//We don't want these to hide - they're helpful! -/datum/reagent/impurity/healing - name = "Healing Impure Reagent" - description = "Not all impure reagents are bad! Sometimes you might want to specifically make these!" - chemical_flags = REAGENT_DONOTSPLIT - addiction_types = list(/datum/addiction/medicine = 3.5) - liver_damage = 0 - -/datum/reagent/inverse/healing - name = "Healing Inverse Reagent" - description = "Not all impure reagents are bad! Sometimes you might want to specifically make these!" - chemical_flags = REAGENT_DONOTSPLIT - addiction_types = list(/datum/addiction/medicine = 3) - tox_damage = 0 - -// END SUBTYPES - -////////////////////MEDICINES/////////////////////////// - -//Catch all failed reaction for medicines - supposed to be non punishing -/datum/reagent/impurity/healing/medicine_failure - name = "Insolvent Medicinal Precipitate" - description = "A viscous mess of various medicines. Will heal a damage type at random" - metabolization_rate = 1 * REM//This is fast - addiction_types = list(/datum/addiction/medicine = 7.5) - ph = 11 - -//Random healing of the 4 main groups -/datum/reagent/impurity/healing/medicine_failure/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - var/pick = pick("brute", "burn", "tox", "oxy") - switch(pick) - if("brute") - owner.adjustBruteLoss(-0.5) - if("burn") - owner.adjustFireLoss(-0.5) - if("tox") - owner.adjustToxLoss(-0.5) - if("oxy") - owner.adjustOxyLoss(-0.5) - ..() - -// C2 medications -// Helbital -//Inverse: -/datum/reagent/inverse/helgrasp - name = "Helgrasp" - description = "This rare and forbidden concoction is thought to bring you closer to the grasp of the Norse goddess Hel." - metabolization_rate = 1*REM //This is fast - tox_damage = 0.25 - ph = 14 - //Compensates for delta_time lag by spawning multiple hands at the end - var/lag_remainder = 0 - //Keeps track of the hand timer so we can cleanup on removal - var/list/timer_ids - -//Warns you about the impenting hands -/datum/reagent/inverse/helgrasp/on_mob_add(mob/living/L, amount) - to_chat(L, span_hierophant("You hear laughter as malevolent hands apparate before you, eager to drag you down to hell...! Look out!")) - playsound(L.loc, 'sound/chemistry/ahaha.ogg', 80, TRUE, -1) //Very obvious tell so people can be ready - . = ..() - -//Sends hands after you for your hubris -/* -How it works: -Standard delta_time for a reagent is 2s - and volume consumption is equal to the volume * delta_time. -In this chem, I want to consume 0.5u for 1 hand created (since 1*REM is 0.5) so on a single tick I create a hand and set up a callback for another one in 1s from now. But since delta time can vary, I want to be able to create more hands for when the delay is longer. - -Initally I round delta_time to the nearest whole number, and take the part that I am rounding down from (i.e. the decimal numbers) and keep track of them. If the decimilised numbers go over 1, then the number is reduced down and an extra hand is created that tick. - -Then I attempt to calculate the how many hands to created based off the current delta_time, since I can't know the delay to the next one it assumes the next will be in 2s. -I take the 2s interval period and divide it by the number of hands I want to make (i.e. the current delta_time) and I keep track of how many hands I'm creating (since I always create one on a tick, then I start at 1 hand). For each hand I then use this time value multiplied by the number of hands. Since we're spawning one now, and it checks to see if hands is less than, but not less than or equal to, delta_time, no hands will be created on the next expected tick. -Basically, we fill the time between now and 2s from now with hands based off the current lag. -*/ -/datum/reagent/inverse/helgrasp/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - spawn_hands(owner) - lag_remainder += delta_time - FLOOR(delta_time, 1) - delta_time = FLOOR(delta_time, 1) - if(lag_remainder >= 1) - delta_time += 1 - lag_remainder -= 1 - var/hands = 1 - var/time = 2 / delta_time - while(hands < delta_time) //we already made a hand now so start from 1 - LAZYADD(timer_ids, addtimer(CALLBACK(src, PROC_REF(spawn_hands), owner), (time*hands) SECONDS, TIMER_STOPPABLE)) //keep track of all the timers we set up - hands += time - return ..() - -/datum/reagent/inverse/helgrasp/proc/spawn_hands(mob/living/carbon/owner) - if(!owner && iscarbon(holder.my_atom))//Catch timer - owner = holder.my_atom - //Adapted from the end of the curse - but lasts a short time - var/grab_dir = turn(owner.dir, pick(-90, 90, 180, 180)) //grab them from a random direction other than the one faced, favoring grabbing from behind - var/turf/spawn_turf = get_ranged_target_turf(owner, grab_dir, 8)//Larger range so you have more time to dodge - if(!spawn_turf) - return - new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, owner.dir) - playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) - var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) - hand.preparePixelProjectile(owner, spawn_turf) - if(QDELETED(hand)) //safety check if above fails - above has a stack trace if it does fail - return - hand.fire() - -//At the end, we clear up any loose hanging timers just in case and spawn any remaining lag_remaining hands all at once. -/datum/reagent/inverse/helgrasp/on_mob_delete(mob/living/owner) - var/hands = 0 - while(lag_remainder > hands) - spawn_hands(owner) - hands++ - for(var/id in timer_ids) // So that we can be certain that all timers are deleted at the end. - deltimer(id) - timer_ids.Cut() - return ..() - -/datum/reagent/inverse/helgrasp/heretic - name = "Grasp of the Mansus" - description = "The Hand of the Mansus is at your neck." - metabolization_rate = 1 * REM - tox_damage = 0 - -//libital -//Impure -//Simply reduces your alcohol tolerance, kinda simular to prohol -/datum/reagent/impurity/libitoil - name = "Libitoil" - description = "Temporarilly interferes a patient's ability to process alcohol." - chemical_flags = REAGENT_DONOTSPLIT - ph = 13.5 - liver_damage = 0.1 - addiction_types = list(/datum/addiction/medicine = 4) - -/datum/reagent/impurity/libitoil/on_mob_add(mob/living/L, amount) - . = ..() - var/mob/living/carbon/consumer = L - if(!consumer) - return - RegisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) - this_liver.alcohol_tolerance *= 2 - -/datum/reagent/impurity/libitoil/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/liver)) - return - var/obj/item/organ/liver/this_liver = organ - this_liver.alcohol_tolerance *= 2 - -/datum/reagent/impurity/libitoil/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/liver)) - return - var/obj/item/organ/liver/this_liver = organ - this_liver.alcohol_tolerance /= 2 - -/datum/reagent/impurity/libitoil/on_mob_delete(mob/living/L) - . = ..() - var/mob/living/carbon/consumer = L - UnregisterSignal(consumer, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(consumer, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/liver/this_liver = consumer.getorganslot(ORGAN_SLOT_LIVER) - if(!this_liver) - return - this_liver.alcohol_tolerance /= 2 - - -//probital -/datum/reagent/impurity/probital_failed//Basically crashed out failed metafactor - name = "Metabolic Inhibition Factor" - description = "This enzyme catalyzes crashes the conversion of nutricious food into healing peptides." - metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. - reagent_state = SOLID - color = "#b3ff00" - overdose_threshold = 10 - ph = 1 - addiction_types = list(/datum/addiction/medicine = 5) - liver_damage = 0 - -/datum/reagent/impurity/probital_failed/overdose_start(mob/living/carbon/M) - metabolization_rate = 4 * REAGENTS_METABOLISM - ..() - -/datum/reagent/peptides_failed - name = "Prion Peptides" - taste_description = "spearmint frosting" - description = "These inhibitory peptides cause cellular damage and cost nutrition to the patient!" - ph = 2.1 - -/datum/reagent/peptides_failed/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - owner.adjustCloneLoss(0.25 * delta_time) - owner.adjust_nutrition(-5 * REAGENTS_METABOLISM * delta_time) - . = ..() - -//Lenturi -//impure -/datum/reagent/impurity/lentslurri //Okay maybe I should outsource names for these - name = "Lentslurri"//This is a really bad name please replace - description = "A highly addicitive muscle relaxant that is made when Lenturi reactions go wrong." - addiction_types = list(/datum/addiction/medicine = 8) - liver_damage = 0 - -/datum/reagent/impurity/lentslurri/on_mob_metabolize(mob/living/carbon/owner) - owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() - -/datum/reagent/impurity/lentslurri/on_mob_end_metabolize(mob/living/carbon/owner) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi) - return ..() - -//failed -/datum/reagent/inverse/ichiyuri - name = "Ichiyuri" - description = "Prolonged exposure to this chemical can cause an overwhelming urge to itch oneself." - reagent_state = LIQUID - color = "#C8A5DC" - ph = 1.7 - addiction_types = list(/datum/addiction/medicine = 2.5) - tox_damage = 0.1 - ///Probability of scratch - increases as a function of time - var/resetting_probability = 0 - ///Prevents message spam - var/spammer = 0 - -//Just the removed itching mechanism - omage to it's origins. -/datum/reagent/inverse/ichiyuri/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(prob(resetting_probability) && !(HAS_TRAIT(owner, TRAIT_RESTRAINED) || owner.incapacitated())) - if(spammer < world.time) - to_chat(owner,span_warning("You can't help but itch yourself.")) - spammer = world.time + (10 SECONDS) - var/scab = rand(1,7) - owner.adjustBruteLoss(scab*REM) - owner.bleed(scab) - resetting_probability = 0 - resetting_probability += (5*(current_cycle/10) * delta_time) // 10 iterations = >51% to itch - ..() - return TRUE - -//Aiuri -//impure -/datum/reagent/impurity/aiuri - name = "Aivime" - description = "This reagent is known to interfere with the eyesight of a patient." - ph = 3.1 - addiction_types = list(/datum/addiction/medicine = 1.5) - liver_damage = 0.1 - //blurriness at the start of taking the med - var/cached_blurriness - -/datum/reagent/impurity/aiuri/on_mob_add(mob/living/owner, amount) - . = ..() - cached_blurriness = owner.eye_blurry - owner.set_blurriness(((creation_purity*10)*(volume/metabolization_rate)) + cached_blurriness) - -/datum/reagent/impurity/aiuri/on_mob_delete(mob/living/owner, amount) - . = ..() - if(owner.eye_blurry <= cached_blurriness) - return - owner.set_blurriness(cached_blurriness) - -//Hercuri -//inverse -/datum/reagent/inverse/hercuri - name = "Herignis" - description = "This reagent causes a dramatic raise in a patient's body temperature." - ph = 0.8 - tox_damage = 0 - color = "#ff1818" - taste_description = "heat! Ouch!" - addiction_types = list(/datum/addiction/medicine = 2.5) - data = list("method" = TOUCH) - ///The method in which the reagent was exposed - var/method - -/datum/reagent/inverse/hercuri/expose_mob(mob/living/carbon/exposed_mob, methods=VAPOR, reac_volume) - method |= methods - data["method"] |= methods - ..() - -/datum/reagent/inverse/hercuri/on_new(data) - . = ..() - if(!data) - return - method |= data["method"] - -/datum/reagent/inverse/hercuri/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - var/heating = rand(creation_purity * REM * 3, creation_purity * REM * 6) - if(method & INGEST) - owner.reagents?.chem_temp += heating * REM * delta_time - if(method & VAPOR) - owner.adjust_bodytemperature(heating * REM * delta_time * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - if(method & INJECT) - if(!ishuman(owner)) - return ..() - var/mob/living/carbon/human/human_mob = owner - human_mob.adjust_coretemperature(heating * REM * delta_time * TEMPERATURE_DAMAGE_COEFFICIENT, 50) - else - owner.adjust_fire_stacks(heating * 0.05) - ..() - -/datum/reagent/inverse/healing/tirimol - name = "Super Melatonin"//It's melatonin, but super! - description = "This will send the patient to sleep, adding a bonus to the efficacy of all reagents administered." - ph = 12.5 //sleeping is a basic need of all lifeformsa - self_consuming = TRUE //No pesky liver shenanigans - chemical_flags = REAGENT_DONOTSPLIT | REAGENT_DEAD_PROCESS - var/cached_reagent_list = list() - addiction_types = list(/datum/addiction/medicine = 5) - -//Makes patients fall asleep, then boosts the purirty of their medicine reagents if they're asleep -/datum/reagent/inverse/healing/tirimol/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - switch(current_cycle) - if(1 to 10)//same delay as chloral hydrate - if(prob(50)) - owner.emote("yawn") - if(10 to INFINITY) - owner.Sleeping(40) - . = 1 - if(owner.IsSleeping()) - for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) - if(reagent in cached_reagent_list) - continue - if(!istype(reagent, /datum/reagent/medicine)) - continue - reagent.creation_purity *= 1.25 - cached_reagent_list += reagent - - else if(!owner.IsSleeping() && length(cached_reagent_list)) - for(var/datum/reagent/reagent as anything in cached_reagent_list) - if(!reagent) - continue - reagent.creation_purity *= 0.8 - cached_reagent_list = list() - ..() - -/datum/reagent/inverse/healing/tirimol/on_mob_delete(mob/living/owner) - if(owner.IsSleeping()) - owner.visible_message(span_notice("[icon2html(owner, viewers(DEFAULT_MESSAGE_RANGE, src))] [owner] lets out a hearty snore!"))//small way of letting people know the supersnooze is ended - for(var/datum/reagent/reagent as anything in cached_reagent_list) - if(!reagent) - continue - reagent.creation_purity *= 0.8 - cached_reagent_list = list() - ..() - -//convermol -//inverse -/datum/reagent/inverse/healing/convermol - name = "Coveroli" - description = "This reagent is known to coat the inside of a patient's lungs, providing greater protection against hot or cold air." - ph = 3.82 - tox_damage = 0 - addiction_types = list(/datum/addiction/medicine = 2.3) - //The heat damage levels of lungs when added (i.e. heat_level_1_threshold on lungs) - var/cached_heat_level_1 - var/cached_heat_level_2 - var/cached_heat_level_3 - //The cold damage levels of lungs when added (i.e. cold_level_1_threshold on lungs) - var/cached_cold_level_1 - var/cached_cold_level_2 - var/cached_cold_level_3 - -/datum/reagent/inverse/healing/convermol/on_mob_add(mob/living/owner, amount) - . = ..() - RegisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) - if(!lungs) - return - apply_lung_levels(lungs) - -/datum/reagent/inverse/healing/convermol/proc/on_gained_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/lungs)) - return - var/obj/item/organ/lungs/lungs = organ - apply_lung_levels(lungs) - -/datum/reagent/inverse/healing/convermol/proc/apply_lung_levels(obj/item/organ/lungs/lungs) - cached_heat_level_1 = lungs.heat_level_1_threshold - cached_heat_level_2 = lungs.heat_level_2_threshold - cached_heat_level_3 = lungs.heat_level_3_threshold - cached_cold_level_1 = lungs.cold_level_1_threshold - cached_cold_level_2 = lungs.cold_level_2_threshold - cached_cold_level_3 = lungs.cold_level_3_threshold - //Heat threshold is increased - lungs.heat_level_1_threshold *= creation_purity * 1.5 - lungs.heat_level_2_threshold *= creation_purity * 1.5 - lungs.heat_level_3_threshold *= creation_purity * 1.5 - //Cold threshold is decreased - lungs.cold_level_1_threshold *= creation_purity * 0.5 - lungs.cold_level_2_threshold *= creation_purity * 0.5 - lungs.cold_level_3_threshold *= creation_purity * 0.5 - -/datum/reagent/inverse/healing/convermol/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/lungs)) - return - var/obj/item/organ/lungs/lungs = organ - restore_lung_levels(lungs) - -/datum/reagent/inverse/healing/convermol/proc/restore_lung_levels(obj/item/organ/lungs/lungs) - lungs.heat_level_1_threshold = cached_heat_level_1 - lungs.heat_level_2_threshold = cached_heat_level_2 - lungs.heat_level_3_threshold = cached_heat_level_3 - lungs.cold_level_1_threshold = cached_cold_level_1 - lungs.cold_level_2_threshold = cached_cold_level_2 - lungs.cold_level_3_threshold = cached_cold_level_3 - -/datum/reagent/inverse/healing/convermol/on_mob_delete(mob/living/owner) - . = ..() - UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) - var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS) - if(!lungs) - return - restore_lung_levels(lungs) - -//seiver -//Inverse -//Allows the scanner to detect organ health to the nearest 1% (similar use to irl) and upgrates the scan to advanced -/datum/reagent/inverse/technetium - name = "Technetium 99" - description = "A radioactive tracer agent that can improve a scanner's ability to detect internal organ damage. Will poison the patient when present very slowly, purging or using a low dose is recommended after use." - metabolization_rate = 0.3 * REM - chemical_flags = REAGENT_DONOTSPLIT //Do show this on scanner - tox_damage = 0 - - var/time_until_next_poison = 0 - - var/poison_interval = (9 SECONDS) - -/datum/reagent/inverse/technetium/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - time_until_next_poison -= delta_time * (1 SECONDS) - if (time_until_next_poison <= 0) - time_until_next_poison = poison_interval - owner.adjustToxLoss(creation_purity * 1) - - ..() - -//Kind of a healing effect, Presumably you're using syrinver to purge so this helps that -/datum/reagent/inverse/healing/syriniver - name = "Syrinifergus" - description = "This reagent reduces the impurity of all non medicines within the patient, reducing their negative effects." - self_consuming = TRUE //No pesky liver shenanigans - chemical_flags = REAGENT_DONOTSPLIT | REAGENT_DEAD_PROCESS - ///The list of reagents we've affected - var/cached_reagent_list = list() - addiction_types = list(/datum/addiction/medicine = 1.75) - -/datum/reagent/inverse/healing/syriniver/on_mob_add(mob/living/living_mob) - if(!(iscarbon(living_mob))) - return ..() - var/mob/living/carbon/owner = living_mob - for(var/datum/reagent/reagent as anything in owner.reagents.reagent_list) - if(reagent in cached_reagent_list) - continue - if(istype(reagent, /datum/reagent/medicine)) - continue - reagent.creation_purity *= 0.8 - cached_reagent_list += reagent - ..() - -/datum/reagent/inverse/healing/syriniver/on_mob_delete(mob/living/living_mob) - . = ..() - if(!(iscarbon(living_mob))) - return - if(!cached_reagent_list) - return - for(var/datum/reagent/reagent as anything in cached_reagent_list) - if(!reagent) - continue - reagent.creation_purity *= 1.25 - cached_reagent_list = null - -//Multiver -//Inverse -//Reaction product when between 0.2 and 0.35 purity. -/datum/reagent/inverse/healing/monover - name = "Monover" - description = "A toxin treating reagent, that only is effective if it's the only reagent present in the patient." - ph = 0.5 - addiction_types = list(/datum/addiction/medicine = 3.5) - -//Heals toxins if it's the only thing present - kinda the oposite of multiver! Maybe that's why it's inverse! -/datum/reagent/inverse/healing/monover/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(length(owner.reagents.reagent_list) > 1) - owner.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * delta_time) //Hey! It's everyone's favourite drawback from multiver! - return ..() - owner.adjustToxLoss(-2 * REM * creation_purity * delta_time, 0) - ..() - return TRUE - -///Can bring a corpse back to life temporarily (if heart is intact) -///Makes wounds bleed more, if it brought someone back, they take additional brute and heart damage -///They can't die during this, but if they're past crit then take increasing stamina damage -///If they're past fullcrit, their movement is slowed by half -///If they OD, their heart explodes (if they were brought back from the dead) -/datum/reagent/inverse/penthrite - name = "Nooartrium" - description = "A reagent that is known to stimulate the heart in a dead patient, temporarily bringing back recently dead patients at great cost to their heart." - ph = 14 - metabolization_rate = 0.05 * REM - addiction_types = list(/datum/addiction/medicine = 12) - overdose_threshold = 20 - self_consuming = TRUE //No pesky liver shenanigans - chemical_flags = REAGENT_DONOTSPLIT | REAGENT_DEAD_PROCESS - ///If we brought someone back from the dead - var/back_from_the_dead = FALSE - -/datum/reagent/inverse/penthrite/on_mob_dead(mob/living/carbon/owner, delta_time) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) - if(!heart || heart.organ_flags & ORGAN_FAILING) - return ..() - metabolization_rate = 0.35 - ADD_TRAIT(owner, TRAIT_STABLEHEART, type) - ADD_TRAIT(owner, TRAIT_NOHARDCRIT, type) - ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, type) - ADD_TRAIT(owner, TRAIT_NOCRITDAMAGE, type) - ADD_TRAIT(owner, TRAIT_NODEATH, type) - owner.set_stat(CONSCIOUS) //This doesn't touch knocked out - owner.updatehealth() - owner.update_sight() - REMOVE_TRAIT(owner, TRAIT_KNOCKEDOUT, STAT_TRAIT) - REMOVE_TRAIT(owner, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) //Because these are normally updated using set_health() - but we don't want to adjust health, and the addition of NOHARDCRIT blocks it being added after, but doesn't remove it if it was added before - owner.set_resting(FALSE)//Please get up, no one wants a deaththrows juggernaught that lies on the floor all the time - owner.SetAllImmobility(0) - back_from_the_dead = TRUE - owner.emote("gasp") - owner.playsound_local(owner, 'sound/health/fastbeat.ogg', 65) - ..() - -/datum/reagent/inverse/penthrite/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(!back_from_the_dead) - return ..() - REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, CRIT_HEALTH_TRAIT) - //Following is for those brought back from the dead only - - for(var/datum/wound/iter_wound as anything in owner.get_wounds()) - if(iter_wound.bleed_timer) - iter_wound.bleed_timer-- - - owner.adjustBruteLoss(5 * (1-creation_purity) * delta_time) - owner.adjustOrganLoss(ORGAN_SLOT_HEART, (1 + (1-creation_purity)) * delta_time) - if(owner.health < owner.crit_threshold) - owner.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) - if(owner.health < owner.hardcrit_threshold) - owner.add_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) - if(!heart || heart.organ_flags & ORGAN_FAILING) - remove_buffs(owner) - ..() - -/datum/reagent/inverse/penthrite/on_mob_delete(mob/living/carbon/owner) - remove_buffs(owner) - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) - if(owner.health < -500 || heart.organ_flags & ORGAN_FAILING)//Honestly commendable if you get -500 - explosion(owner, light_impact_range = 1, explosion_cause = src) - qdel(heart) - owner.visible_message(span_boldwarning("[owner]'s heart explodes!")) - return ..() - -/datum/reagent/inverse/penthrite/overdose_start(mob/living/carbon/owner) - if(!back_from_the_dead) - return ..() - var/obj/item/organ/heart/heart = owner.getorganslot(ORGAN_SLOT_HEART) - if(!heart) //No heart? No life! - REMOVE_TRAIT(owner, TRAIT_NODEATH, type) - owner.stat = DEAD - return ..() - explosion(owner, light_impact_range = 1, explosion_cause = src) - qdel(heart) - owner.visible_message(span_boldwarning("[owner]'s heart explodes!")) - return..() - -/datum/reagent/inverse/penthrite/proc/remove_buffs(mob/living/carbon/owner) - REMOVE_TRAIT(owner, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(owner, TRAIT_NOHARDCRIT, type) - REMOVE_TRAIT(owner, TRAIT_NOSOFTCRIT, type) - REMOVE_TRAIT(owner, TRAIT_NOCRITDAMAGE, type) - REMOVE_TRAIT(owner, TRAIT_NODEATH, type) - owner.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nooartrium) - owner.remove_actionspeed_modifier(/datum/actionspeed_modifier/nooartrium) - owner.update_sight() - -/* Non c2 medicines */ - -/datum/reagent/impurity/mannitol - name = "Mannitoil" - description = "Gives the patient a temporary speech impediment." - color = "#CDCDFF" - addiction_types = list(/datum/addiction/medicine = 5) - ph = 12.4 - liver_damage = 0 - ///The speech we're forcing on the owner - var/speech_option - -/datum/reagent/impurity/mannitol/on_mob_add(mob/living/owner, amount) - . = ..() - if(!iscarbon(owner)) - return - var/mob/living/carbon/carbon = owner - if(!carbon.dna) - return - var/list/speech_options = list( - /datum/mutation/human/swedish, - /datum/mutation/human/unintelligible, - /datum/mutation/human/stoner, - /datum/mutation/human/medieval, - /datum/mutation/human/wacky, - /datum/mutation/human/piglatin, - /datum/mutation/human/nervousness, - /datum/mutation/human/mute, - ) - speech_options = shuffle(speech_options) - for(var/option in speech_options) - if(carbon.dna.get_mutation(option)) - continue - carbon.dna.add_mutation(option) - speech_option = option - return - -/datum/reagent/impurity/mannitol/on_mob_delete(mob/living/owner) - . = ..() - if(!iscarbon(owner)) - return - var/mob/living/carbon/carbon = owner - carbon.dna?.remove_mutation(speech_option) - -/datum/reagent/inverse/neurine - name = "Neruwhine" - description = "Induces a temporary brain trauma in the patient by redirecting neuron activity." - color = "#DCDCAA" - ph = 13.4 - addiction_types = list(/datum/addiction/medicine = 8) - metabolization_rate = 0.025 * REM - tox_damage = 0 - //The temporary trauma passed to the owner - var/datum/brain_trauma/temp_trauma - -/datum/reagent/inverse/neurine/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - .=..() - if(temp_trauma) - return - if(!(DT_PROB(creation_purity*10, delta_time))) - return - var/traumalist = subtypesof(/datum/brain_trauma) - var/list/forbiddentraumas = list(/datum/brain_trauma/severe/split_personality, // Split personality uses a ghost, I don't want to use a ghost for a temp thing - /datum/brain_trauma/special/obsessed, // Obsessed sets the owner as an antag - I presume this will lead to problems, so we'll remove it - /datum/brain_trauma/hypnosis // Hypnosis, same reason as obsessed, plus a bug makes it remain even after the neurowhine purges and then turn into "nothing" on the med reading upon a second application - ) - traumalist -= forbiddentraumas - var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN) - traumalist = shuffle(traumalist) - for(var/trauma in traumalist) - if(brain.brain_gain_trauma(trauma, TRAUMA_RESILIENCE_MAGIC)) - temp_trauma = trauma - return - -/datum/reagent/inverse/neurine/on_mob_delete(mob/living/carbon/owner) - .=..() - if(!temp_trauma) - return - if(istype(temp_trauma, /datum/brain_trauma/special/imaginary_friend))//Good friends stay by you, no matter what - return - owner.cure_trauma_type(temp_trauma, resilience = TRAUMA_RESILIENCE_MAGIC) - -/datum/reagent/inverse/corazargh - name = "Corazargh" //It's what you yell! Though, if you've a better name feel free. Also an omage to an older chem - description = "Interferes with the body's natural pacemaker, forcing the patient to manually beat their heart." - color = "#5F5F5F" - self_consuming = TRUE - ph = 13.5 - addiction_types = list(/datum/addiction/medicine = 2.5) - metabolization_rate = REM - chemical_flags = REAGENT_DEAD_PROCESS - tox_damage = 0 - ///The old heart we're swapping for - var/obj/item/organ/heart/original_heart - ///The new heart that's temp added - var/obj/item/organ/heart/cursed/manual_heart - -///Creates a new cursed heart and puts the old inside of it, then replaces the position of the old -/datum/reagent/inverse/corazargh/on_mob_metabolize(mob/living/owner) - if(!iscarbon(owner)) - return - var/mob/living/carbon/carbon_mob = owner - original_heart = owner.getorganslot(ORGAN_SLOT_HEART) - if(!original_heart) - return - manual_heart = new(null, src) - original_heart.Remove(carbon_mob, special = TRUE) //So we don't suddenly die - original_heart.forceMove(manual_heart) - original_heart.organ_flags |= ORGAN_FROZEN //Not actually frozen, but we want to pause decay - manual_heart.Insert(carbon_mob, special = TRUE) - //these last so instert doesn't call them - RegisterSignal(carbon_mob, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(carbon_mob, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - to_chat(owner, span_userdanger("You feel your heart suddenly stop beating on it's own - you'll have to manually beat it!")) - ..() - -///Intercepts the new heart and creates a new cursed heart - putting the old inside of it -/datum/reagent/inverse/corazargh/proc/on_gained_organ(mob/owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/heart)) - return - var/mob/living/carbon/carbon_mob = owner - original_heart = organ - original_heart.Remove(carbon_mob, special = TRUE) - original_heart.forceMove(manual_heart) - original_heart.organ_flags |= ORGAN_FROZEN //Not actually frozen, but we want to pause decay - if(!manual_heart) - manual_heart = new(null, src) - manual_heart.Insert(carbon_mob, special = TRUE) - -///If we're ejecting out the organ - replace it with the original -/datum/reagent/inverse/corazargh/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!organ == manual_heart) - return - original_heart.forceMove(organ.loc) - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - qdel(organ) - -///We're done - remove the curse and restore the old one -/datum/reagent/inverse/corazargh/on_mob_end_metabolize(mob/living/owner) - //Do these first so Insert doesn't call them - UnregisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN) - UnregisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN) - if(!iscarbon(owner)) - return - var/mob/living/carbon/carbon_mob = owner - if(original_heart) //Mostly a just in case - original_heart.organ_flags &= ~ORGAN_FROZEN //enable decay again - original_heart.Insert(carbon_mob, special = TRUE) - qdel(manual_heart) - to_chat(owner, span_userdanger("You feel your heart start beating normally again!")) - ..() - -/datum/reagent/inverse/antihol - name = "Prohol" - description = "Promotes alcoholic substances within the patients body, making their effects more potent." - taste_description = "alcohol" //mostly for sneaky slips - chemical_flags = REAGENT_INVISIBLE - metabolization_rate = 0.05 * REM//This is fast - addiction_types = list(/datum/addiction/medicine = 4.5) - color = "#4C8000" - tox_damage = 0 - -/datum/reagent/inverse/antihol/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - for(var/datum/reagent/consumable/ethanol/alcohol in C.reagents.reagent_list) - alcohol.boozepwr += delta_time - ..() - -/datum/reagent/inverse/oculine - name = "Oculater" - description = "Temporarily blinds the patient." - reagent_state = LIQUID - color = "#DDDDDD" - metabolization_rate = 0.1 * REM - addiction_types = list(/datum/addiction/medicine = 3) - taste_description = "funky toxin" - ph = 13 - tox_damage = 0 - metabolization_rate = 0.2 * REM - ///Did we get a headache? - var/headache = FALSE - -/datum/reagent/inverse/oculine/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(headache) - return ..() - if(DT_PROB(100*(1-creation_purity), delta_time)) - owner.become_blind(IMPURE_OCULINE) - to_chat(owner, span_danger("You suddenly develop a pounding headache as your vision fluxuates.")) - headache = TRUE - ..() - -/datum/reagent/inverse/oculine/on_mob_end_metabolize(mob/living/owner) - owner.cure_blind(IMPURE_OCULINE) - if(headache) - to_chat(owner, span_notice("Your headache clears up!")) - ..() - -/datum/reagent/impurity/inacusiate - name = "Tinacusiate" - description = "Makes the patient's hearing temporarily funky." - reagent_state = LIQUID - addiction_types = list(/datum/addiction/medicine = 5.6) - color = "#DDDDFF" - taste_description = "the heat evaporating from your mouth." - ph = 1 - liver_damage = 0.1 - metabolization_rate = 0.04 * REM - ///The random span we start hearing in - var/randomSpan - -/datum/reagent/impurity/inacusiate/on_mob_metabolize(mob/living/owner, delta_time, times_fired) - randomSpan = pick(list("clown", "small", "big", "hypnophrase", "alien", "cult", "alert", "danger", "emote", "yell", "brass", "sans", "papyrus", "robot", "his_grace", "phobia")) - RegisterSignal(owner, COMSIG_MOVABLE_HEAR, PROC_REF(owner_hear)) - to_chat(owner, span_warning("Your hearing seems to be a bit off!")) - ..() - -/datum/reagent/impurity/inacusiate/on_mob_end_metabolize(mob/living/owner) - UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) - to_chat(owner, span_notice("You start hearing things normally again.")) - ..() - -/datum/reagent/impurity/inacusiate/proc/owner_hear(datum/source, list/hearing_args) - SIGNAL_HANDLER - hearing_args[HEARING_RAW_MESSAGE] = "[hearing_args[HEARING_RAW_MESSAGE]]" diff --git a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm deleted file mode 100644 index 9ca7bd96a5d3..000000000000 --- a/code/modules/reagents/chemistry/reagents/impure_reagents/impure_toxin_reagents.dm +++ /dev/null @@ -1,72 +0,0 @@ -//Reagents produced by metabolising/reacting fermichems inoptimally these specifically are for toxins -//Inverse = Splitting -//Invert = Whole conversion -//Failed = End reaction below purity_min - -////////////////////TOXINS/////////////////////////// - -//Lipolicide - Impure Version -/datum/reagent/impurity/ipecacide - name = "Ipecacide" - description = "An extremely gross substance that induces vomiting. It is produced when Lipolicide reactions are impure." - ph = 7 - liver_damage = 0 - -/datum/reagent/impurity/ipecacide/on_mob_add(mob/living/carbon/owner) - if(owner.disgust >= DISGUST_LEVEL_GROSS) - return ..() - owner.adjust_disgust(50) - ..() - - -//Formaldehyde - Impure Version -/datum/reagent/impurity/methanol - name = "Methanol" - description = "A light, colourless liquid with a distinct smell. Ingestion can lead to blindness. It is a byproduct of organisms processing impure Formaldehyde." - reagent_state = LIQUID - color = "#aae7e4" - ph = 7 - liver_damage = 0 - -/datum/reagent/impurity/methanol/on_mob_life(mob/living/carbon/owner, delta_time) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) - return ..() - eyes.applyOrganDamage(0.5 * REM * delta_time) - ..() - - -//Chloral Hydrate - Impure Version -/datum/reagent/impurity/chloralax - name = "Chloralax" - description = "An oily, colorless and slightly toxic liquid. It is produced when impure choral hydrate is broken down inside an organism." - reagent_state = LIQUID - color = "#387774" - ph = 7 - liver_damage = 0 - -/datum/reagent/impurity/chloralax/on_mob_life(mob/living/carbon/owner, delta_time) - owner.adjustToxLoss(1 * REM * delta_time, 0) - ..() - - -//Mindbreaker Toxin - Impure Version -/datum/reagent/impurity/rosenol - name = "Rosenol" - description = "A strange, blue liquid that is produced during impure mindbreaker toxin reactions. Historically it has been abused to write poetry." - reagent_state = LIQUID - color = "#0963ad" - ph = 7 - liver_damage = 0 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -/datum/reagent/impurity/rosenol/on_mob_life(mob/living/carbon/owner, delta_time) - var/obj/item/organ/tongue/tongue = owner.getorganslot(ORGAN_SLOT_TONGUE) - if(!tongue) - return ..() - if(DT_PROB(4.0, delta_time)) - owner.manual_emote("clicks with [owner.p_their()] tongue.") - owner.say("Noice.", forced = /datum/reagent/impurity/rosenol) - if(DT_PROB(2.0, delta_time)) - owner.say(pick("Ah! That was a mistake!", "Horrible.", "Watch out everybody, the potato is really hot.", "When I was six I ate a bag of plums.", "And if there is one thing I can't stand it's tomatoes.", "And if there is one thing I love it's tomatoes.", "We had a captain who was so strict, you weren't allowed to breathe in their station.", "The unrobust ones just used to keel over and die, you'd hear them going down behind you."), forced = /datum/reagent/impurity/rosenol) - ..() diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 88fb5e385a97..6b26c539d7b9 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -8,41 +8,16 @@ /datum/reagent/medicine taste_description = "bitterness" + chemical_flags = REAGENT_IGNORE_MOB_SIZE abstract_type = /datum/reagent/medicine -/datum/reagent/medicine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - current_cycle++ - if(length(reagent_removal_skip_list)) - return - holder.remove_reagent(type, metabolization_rate * delta_time / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism - -/datum/reagent/medicine/leporazine - name = "Leporazine" - description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." - ph = 8.4 - color = "#DB90C6" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/target_temp = M.get_body_temp_normal(apply_change=FALSE) - if(M.bodytemperature > target_temp) - M.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, target_temp) - else if(M.bodytemperature < (target_temp + 1)) - M.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 0, target_temp) - if(ishuman(M)) - var/mob/living/carbon/human/humi = M - if(humi.coretemperature > target_temp) - humi.adjust_coretemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, target_temp) - else if(humi.coretemperature < (target_temp + 1)) - humi.adjust_coretemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, 0, target_temp) - ..() - /datum/reagent/medicine/adminordrazine //An OP chemical for admins name = "Adminordrazine" description = "It's magic. We don't have to explain it." color = "#E0BB00" //golden for the gods taste_description = "badmins" - chemical_flags = REAGENT_DEAD_PROCESS + chemical_flags = REAGENT_IGNORE_MOB_SIZE | REAGENT_SPECIAL | REAGENT_DEAD_PROCESS + metabolization_rate = 1 // The best stuff there is. For testing/debugging. /datum/reagent/medicine/adminordrazine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -54,54 +29,52 @@ mytray.adjust_weedlevel(-rand(1,5)) if(chems.has_reagent(type, 3)) switch(rand(100)) - if(66 to 100) + if(51 to 100) mytray.mutatespecie() - if(33 to 65) + if(1 to 50) mytray.mutateweed() - if(1 to 32) - mytray.mutatepest(user) - else if(prob(20)) - mytray.visible_message(span_warning("Nothing happens...")) - -/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.heal_bodypart_damage(5 * REM * delta_time, 5 * REM * delta_time) - M.adjustToxLoss(-5 * REM * delta_time, FALSE, TRUE) - M.setOxyLoss(0, 0) - M.setCloneLoss(0, 0) - - M.set_blurriness(0) - M.set_blindness(0) - M.SetKnockdown(0) - M.SetStun(0) - M.SetUnconscious(0) - M.SetParalyzed(0) - M.SetImmobilized(0) - M.remove_status_effect(/datum/status_effect/confusion) - M.SetSleeping(0) - - M.silent = FALSE - M.remove_status_effect(/datum/status_effect/dizziness) - M.disgust = 0 - M.drowsyness = 0 + else + if(prob(20)) + mytray.visible_message(span_warning("Nothing happens...")) + +/datum/reagent/medicine/adminordrazine/affect_blood(mob/living/carbon/C, removed) + C.heal_bodypart_damage(2 * removed, 2 * removed, FALSE) + C.adjustToxLoss(-2 * removed, FALSE, TRUE) + C.setOxyLoss(0, 0) + C.setCloneLoss(0, 0) + + C.set_blurriness(0) + C.set_blindness(0) + C.SetKnockdown(0) + C.SetStun(0) + C.SetUnconscious(0) + C.SetParalyzed(0) + C.SetImmobilized(0) + C.remove_status_effect(/datum/status_effect/confusion) + C.SetSleeping(0) + + C.silent = FALSE + C.remove_status_effect(/datum/status_effect/dizziness) + C.disgust = 0 + C.drowsyness = 0 // Remove all speech related status effects for(var/effect in typesof(/datum/status_effect/speech)) - M.remove_status_effect(effect) - M.remove_status_effect(/datum/status_effect/jitter) - M.hallucination = 0 - REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) - M.reagents.remove_all_type(/datum/reagent/toxin, 5 * REM * delta_time, FALSE, TRUE) - if(M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume = BLOOD_VOLUME_NORMAL - - M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) - for(var/obj/item/organ/organ as anything in M.processing_organs) + C.remove_status_effect(effect) + C.remove_status_effect(/datum/status_effect/jitter) + C.hallucination = 0 + REMOVE_TRAITS_NOT_IN(C, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT)) + C.reagents.remove_reagent(/datum/reagent/toxin, 2 * removed, include_subtypes = TRUE) + if(C.blood_volume < BLOOD_VOLUME_NORMAL) + C.setBloodVolume(BLOOD_VOLUME_NORMAL) + + C.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + for(var/obj/item/organ/organ as anything in C.processing_organs) organ.setOrganDamage(0) - for(var/thing in M.diseases) + for(var/thing in C.diseases) var/datum/disease/D = thing if(D.severity == DISEASE_SEVERITY_POSITIVE) continue D.cure() - ..() . = TRUE /datum/reagent/medicine/adminordrazine/quantum_heal @@ -109,1470 +82,896 @@ description = "Rare and experimental particles, that apparently swap the user's body with one from an alternate dimension where it's completely healthy." taste_description = "science" -/datum/reagent/medicine/synaptizine - name = "Synaptizine" - description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations." - color = "#FF00FF" - ph = 4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(-5 * REM * delta_time) - M.AdjustStun(-20 * REM * delta_time) - M.AdjustKnockdown(-20 * REM * delta_time) - M.AdjustUnconscious(-20 * REM * delta_time) - M.AdjustImmobilized(-20 * REM * delta_time) - M.AdjustParalyzed(-20 * REM * delta_time) - if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) - holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * delta_time) - M.hallucination = max(M.hallucination - (10 * REM * delta_time), 0) - if(DT_PROB(16, delta_time)) - M.adjustToxLoss(1, 0) - . = TRUE - ..() - -/datum/reagent/medicine/synaphydramine - name = "Diphen-Synaptizine" - description = "Reduces drowsiness, hallucinations, and Histamine from body." - color = "#EC536D" // rgb: 236, 83, 109 - ph = 5.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(-5 * REM * delta_time) - if(holder.has_reagent(/datum/reagent/toxin/mindbreaker)) - holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5 * REM * delta_time) - if(holder.has_reagent(/datum/reagent/toxin/histamine)) - holder.remove_reagent(/datum/reagent/toxin/histamine, 5 * REM * delta_time) - M.hallucination = max(M.hallucination - (10 * REM * delta_time), 0) - if(DT_PROB(16, delta_time)) - M.adjustToxLoss(1, 0) - . = TRUE - ..() +/* General medicine */ -/datum/reagent/medicine/cryoxadone - 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 = "blue" - ph = 11 - burning_temperature = 20 //cold burning - burning_volume = 0.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.IsSleeping() || M.IsUnconscious()) - var/power = -0.00003 * (M.bodytemperature ** 2) + 3 - if(M.bodytemperature < T0C) - M.adjustOxyLoss(-3 * power * REM * delta_time, 0) - M.adjustBruteLoss(-power * REM * delta_time, 0) - M.adjustFireLoss(-power * REM * delta_time, 0) - M.adjustToxLoss(-power * REM * delta_time, 0, TRUE) //heals TOXINLOVERs - M.adjustCloneLoss(-power * REM * delta_time, 0) - - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration - . = TRUE - metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5) - ..() - -// Healing -/datum/reagent/medicine/cryoxadone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - mytray.adjust_plant_health(round(chems.get_reagent_amount(type) * 3)) - mytray.adjust_toxic(-round(chems.get_reagent_amount(type) * 3)) +/datum/reagent/medicine/inaprovaline + name = "Inaprovaline" + description = "Inaprovaline is a multipurpose neurostimulant and cardioregulator. Commonly used to stabilize patients." + taste_description = "bitterness" + reagent_state = LIQUID + color = "#00bfff" + overdose_threshold = 60 + metabolization_rate = 0.1 + value = 3.5 -/datum/reagent/medicine/clonexadone - name = "Clonexadone" - description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone." - color = "#3D3DC6" - taste_description = "muscle" - ph = 13 - metabolization_rate = 1.5 * REAGENTS_METABOLISM - -/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.bodytemperature < T0C) - M.adjustCloneLoss((0.00006 * (M.bodytemperature ** 2) - 6) * REM * delta_time, 0) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE - metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75) - ..() - -/datum/reagent/medicine/pyroxadone - name = "Pyroxadone" - description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation." - color = "#f7832a" - taste_description = "spicy jelly" - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) - var/power = 0 - switch(M.bodytemperature) - if(BODYTEMP_HEAT_DAMAGE_LIMIT to 400) - power = 2 - if(400 to 460) - power = 3 - else - power = 5 - if(M.on_fire) - power *= 2 +/datum/reagent/medicine/inaprovaline/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + ADD_TRAIT(C, TRAIT_NOCRITDAMAGE, type) + ADD_TRAIT(C, TRAIT_STABLEHEART, type) - M.adjustOxyLoss(-2 * power * REM * delta_time, FALSE) - M.adjustBruteLoss(-power * REM * delta_time, FALSE) - M.adjustFireLoss(-1.5 * power * REM * delta_time, FALSE) - M.adjustToxLoss(-power * REM * delta_time, FALSE, TRUE) - M.adjustCloneLoss(-power * REM * delta_time, FALSE) +/datum/reagent/medicine/inaprovaline/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + REMOVE_TRAIT(C, TRAIT_NOCRITDAMAGE, type) + REMOVE_TRAIT(C, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - . = TRUE - ..() +/datum/reagent/medicine/inaprovaline/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_STABLE, 1) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 30) -/datum/reagent/medicine/rezadone - name = "Rezadone" - description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds and restoring corpses husked by burns. Overdose will cause intense nausea and minor toxin damage." - reagent_state = SOLID - color = "#669900" // rgb: 102, 153, 0 - overdose_threshold = 30 - ph = 12.2 - taste_description = "fish" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that. // No such luck so far - M.heal_bodypart_damage(1 * REM * delta_time, 1 * REM * delta_time) - REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) - ..() - . = TRUE +/datum/reagent/medicine/inaprovaline/overdose_start(mob/living/carbon/C) + C.add_movespeed_modifier(/datum/movespeed_modifier/inaprovaline) -/datum/reagent/medicine/rezadone/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustToxLoss(1 * REM * delta_time, 0) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - . = TRUE +/datum/reagent/medicine/inaprovaline/overdose_end(mob/living/carbon/C) + C.remove_movespeed_modifier(/datum/movespeed_modifier/inaprovaline) -/datum/reagent/medicine/rezadone/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/medicine/inaprovaline/overdose_process(mob/living/carbon/C) . = ..() - if(!iscarbon(exposed_mob)) - return + if(prob(5)) + C.set_slurring_if_lower(10 SECONDS) + if(prob(2)) + C.drowsyness = max(C.drowsyness, 5) + +/datum/reagent/medicine/bicaridine + name = "Bicaridine" + description = "Bicaridine is a slow-acting medication to treat physical trauma." + taste_description = "bitterness" + taste_mult = 3 + metabolization_rate = 0.1 + reagent_state = LIQUID + color = "#bf0000" + overdose_threshold = 30 + value = 4.9 - var/mob/living/carbon/patient = exposed_mob - if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, BURN) && patient.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD) //One carp yields 12u rezadone. - patient.cure_husk(BURN) - patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the environment, taking on a more healthy appearance.")) +/datum/reagent/medicine/bicaridine/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 20) + C.adjustBruteLoss(-6 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/spaceacillin - name = "Spaceacillin" - description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with. Also reduces infection in serious burns." - color = "#E1F2E6" - metabolization_rate = 0.1 * REAGENTS_METABOLISM - ph = 8.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M) + . = ..() + APPLY_CHEM_EFFECT(M, CE_BLOCKAGE, (15 + volume - overdose_threshold)/100) + var/mob/living/carbon/human/H = M + for(var/obj/item/bodypart/E as anything in H.bodyparts) + if((E.bodypart_flags & BP_ARTERY_CUT) && prob(2)) + E.set_sever_artery(FALSE) + +/datum/reagent/medicine/meralyne + name = "Meralyne" + description = "Meralyne is a concentrated form of bicaridine and can be used to treat extensive physical trauma." + color = "#FD5964" + taste_mult = 12 + metabolization_rate = 0.2 + overdose_threshold = 20 -//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects. +/datum/reagent/medicine/meralyne/affect_blood(mob/living/carbon/C, removed) + C.adjustBruteLoss(-12 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/oxandrolone - name = "Oxandrolone" - description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns." +/datum/reagent/medicine/meralyne/overdose_process(mob/living/carbon/C) + . = ..() + APPLY_CHEM_EFFECT(C, CE_BLOCKAGE, (15 + volume - overdose_threshold)/100) + for(var/obj/item/bodypart/E as anything in C.bodyparts) + if((E.bodypart_flags & BP_ARTERY_CUT) && prob(2)) + E.set_sever_artery(FALSE) + C.losebreath++ + +/datum/reagent/medicine/kelotane + name = "Kelotane" + description = "Kelotane is a drug used to treat burns." + taste_description = "bitterness" reagent_state = LIQUID - color = "#1E8BFF" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 25 - ph = 10.7 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getFireLoss() > 25) - M.adjustFireLoss(-4 * REM * delta_time, 0) //Twice as effective as AIURI for severe burns - else - M.adjustFireLoss(-0.5 * REM * delta_time, 0) //But only a quarter as effective for more minor ones - ..() - . = TRUE + color = "#ffa800" + overdose_threshold = 30 + metabolization_rate = 0.1 + value = 2.9 -/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M, delta_time, times_fired) - if(M.getFireLoss()) //It only makes existing burns worse - M.adjustFireLoss(4.5 * REM * delta_time, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() +/datum/reagent/medicine/kelotane/affect_blood(mob/living/carbon/C, removed) + C.adjustFireLoss(-6 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/salglu_solution - name = "Saline-Glucose Solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute, as well as slowly speeding blood regeneration." +/datum/reagent/medicine/dermaline + name = "Dermaline" + description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." + taste_description = "bitterness" + taste_mult = 1.5 reagent_state = LIQUID - color = "#DCDCDC" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 60 - taste_description = "sweetness and salt" - var/last_added = 0 - var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active - var/extra_regen = 0.25 // in addition to acting as temporary blood, also add about half this much to their actual blood per second - ph = 5.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + color = "#ff8000" + overdose_threshold = 20 + value = 3.9 -/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(last_added) - M.blood_volume -= last_added - last_added = 0 - if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. - var/amount_to_add = min(M.blood_volume, 5*volume) - var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) - last_added = new_blood_level - M.blood_volume - M.blood_volume = new_blood_level + (extra_regen * REM * delta_time) - if(DT_PROB(18, delta_time)) - M.adjustBruteLoss(-0.5, 0) - M.adjustFireLoss(-0.5, 0) - . = TRUE - ..() - -/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(1.5, delta_time)) - to_chat(M, span_warning("You feel salty.")) - holder.add_reagent(/datum/reagent/consumable/salt, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) - else if(DT_PROB(1.5, delta_time)) - to_chat(M, span_warning("You feel sweet.")) - holder.add_reagent(/datum/reagent/consumable/sugar, 1) - holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5) - if(DT_PROB(18, delta_time)) - M.adjustBruteLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - M.adjustFireLoss(0.5, FALSE, FALSE, BODYTYPE_ORGANIC) - . = TRUE - ..() +/datum/reagent/medicine/dermaline/affect_blood(mob/living/carbon/C, removed) + C.adjustFireLoss(-12 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/mine_salve - name = "Miner's Salve" - description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed. Also great for treating severe burn wounds in a pinch." +/datum/reagent/medicine/dexalin + name = "Dexalin" + description = "Dexalin is used in the treatment of oxygen deprivation." + taste_description = "bitterness" reagent_state = LIQUID - color = "#6D6374" - metabolization_rate = 0.4 * REAGENTS_METABOLISM - ph = 2.6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - C.hal_screwyhud = SCREWYHUD_HEALTHY - C.adjustBruteLoss(-0.25 * REM * delta_time, 0) - C.adjustFireLoss(-0.25 * REM * delta_time, 0) - ..() - return TRUE + color = "#0080ff" + metabolization_rate = 0.5 + overdose_threshold = 30 + value = 2.4 -/datum/reagent/medicine/mine_salve/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) - . = ..() - if(!iscarbon(exposed_mob) || (exposed_mob.stat == DEAD)) - return +/datum/reagent/medicine/dexalin/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_OXYGENATED, 1) + C.adjustOxyLoss(-10 * removed, FALSE) + holder.remove_reagent(/datum/reagent/toxin/lexorin, 10 * removed) + return TRUE - if(methods & (INGEST|VAPOR|INJECT)) - exposed_mob.adjust_nutrition(-5) - if(show_message) - to_chat(exposed_mob, span_warning("Your stomach feels empty and cramps!")) +/datum/reagent/medicine/tricordrazine + name = "Tricordrazine" + description = "Tricordrazine is an extended release medicine, originally derived from cordrazine. Can be used to treat a wide range of injuries." + taste_description = "grossness" + reagent_state = LIQUID + color = "#8040ff" + value = 6 - if(methods & (PATCH|TOUCH)) - var/mob/living/carbon/exposed_carbon = exposed_mob - for(var/s in exposed_carbon.surgeries) - var/datum/surgery/surgery = s - surgery.speed_modifier = max(0.1, surgery.speed_modifier) +/datum/reagent/medicine/tricordrazine/affect_blood(mob/living/carbon/C, removed) + var/heal = 1 + ((clamp(round(current_cycle % 10), 0, 3))) * removed + C.heal_overall_damage(heal, heal, updating_health = FALSE) + C.adjustToxLoss(-heal * removed, FALSE) + return TRUE - if(show_message) - to_chat(exposed_carbon, span_danger("You feel your injuries fade away to nothing!") ) +/datum/reagent/medicine/tricordrazine/godblood + name = "God's Blood" + description = "Slowly heals all wounds, while being almost impossible to overdose on." + overdose_threshold = 0 -/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M) - if(iscarbon(M)) - var/mob/living/carbon/N = M - N.hal_screwyhud = SCREWYHUD_NONE - ..() +/datum/reagent/medicine/tricordrazine/godblood/affect_blood(mob/living/carbon/C, removed) + C.heal_overall_damage(0.5 * removed, 0.5 * removed, updating_health = FALSE) + C.adjustToxLoss(-0.5 * removed, FALSE) + return TRUE /datum/reagent/medicine/omnizine name = "Omnizine" - description = "Slowly heals all damage types. Overdose will cause damage in all types instead." + description = "A quickly metabolizing miracle drug that mends all wounds at a rapid pace." reagent_state = LIQUID color = "#DCDCDC" - metabolization_rate = 0.25 * REAGENTS_METABOLISM + metabolization_rate = 1 overdose_threshold = 30 - var/healing = 0.5 - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(-healing * REM * delta_time, 0) - M.adjustOxyLoss(-healing * REM * delta_time, 0) - M.adjustBruteLoss(-healing * REM * delta_time, 0) - M.adjustFireLoss(-healing * REM * delta_time, 0) - ..() - . = TRUE -/datum/reagent/medicine/omnizine/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustToxLoss(1.5 * REM * delta_time, FALSE) - M.adjustOxyLoss(1.5 * REM * delta_time, FALSE) - M.adjustBruteLoss(1.5 * REM * delta_time, FALSE, FALSE, BODYTYPE_ORGANIC) - M.adjustFireLoss(1.5 * REM * delta_time, FALSE, FALSE, BODYTYPE_ORGANIC) - ..() - . = TRUE - -/datum/reagent/medicine/omnizine/protozine - name = "Protozine" - description = "A less environmentally friendly and somewhat weaker variant of omnizine." - color = "#d8c7b7" - healing = 0.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/calomel - name = "Calomel" - description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition." - reagent_state = LIQUID - color = "#19C832" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - taste_description = "acid" - ph = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - for(var/datum/reagent/toxin/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type, 3 * REM * delta_time) - if(M.health > 20) - M.adjustToxLoss(1 * REM * delta_time, 0) - . = TRUE - ..() +/datum/reagent/medicine/omnizine/affect_blood(mob/living/carbon/C, removed) + C.heal_overall_damage(12 * removed, 12 * removed, updating_health = FALSE) + C.adjustToxLoss(-12 * removed, FALSE) + return TRUE -/datum/reagent/medicine/potass_iodide - name = "Potassium Iodide" - description = "Heals low toxin damage while the patient is irradiated, and will halt the damaging effects of radiation." +/datum/reagent/medicine/cryoxadone + name = "Cryoxadone" + description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." + taste_description = "sludge" reagent_state = LIQUID - color = "#BAA15D" - metabolization_rate = 2 * REAGENTS_METABOLISM - ph = 12 //It's a reducing agent - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/potass_iodide/on_mob_metabolize(mob/living/L) - . = ..() - ADD_TRAIT(L, TRAIT_HALT_RADIATION_EFFECTS, "[type]") + color = "#8080ff" + metabolization_rate = 0.1 + value = 3.9 -/datum/reagent/medicine/potass_iodide/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() +/datum/reagent/medicine/cryoxadone/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_CRYO, 1) + if(!(C.bodytemperature < TCRYO)) + return -/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if (HAS_TRAIT(M, TRAIT_IRRADIATED)) - M.adjustToxLoss(-1 * REM * delta_time) + C.adjustCloneLoss(-100 * removed, FALSE) + APPLY_CHEM_EFFECT(C, CE_OXYGENATED, 1) + C.heal_overall_damage(30 * removed, 30 * removed, updating_health = FALSE) + APPLY_CHEM_EFFECT(C, CE_PULSE, -2) + for(var/obj/item/organ/I as anything in C.processing_organs) + if(!(I.organ_flags & ORGAN_SYNTHETIC)) + I.applyOrganDamage(-20*removed) + return TRUE - ..() -/datum/reagent/medicine/pen_acid - name = "Pentetic Acid" - description = "Reduces massive amounts of toxin damage while purging other chemicals from the body." +/datum/reagent/medicine/clonexadone + name = "Clonexadone" + description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube." + taste_description = "slime" reagent_state = LIQUID - color = "#E6FFF0" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - ph = 1 //One of the best buffers, NEVERMIND! - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/pen_acid/on_mob_metabolize(mob/living/L) - . = ..() - ADD_TRAIT(L, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - -/datum/reagent/medicine/pen_acid/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_HALT_RADIATION_EFFECTS, "[type]") - return ..() + color = "#80bfff" + metabolization_rate = 0.1 + value = 5.5 + +/datum/reagent/medicine/clonexadone/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_CRYO, 1) + if(C.bodytemperature < 170) + C.adjustCloneLoss(-300 * removed, FALSE) + APPLY_CHEM_EFFECT(C, CE_OXYGENATED, 2) + C.heal_overall_damage(50 * removed, 50 * removed, updating_health = FALSE) + APPLY_CHEM_EFFECT(C, CE_PULSE, -2) + for(var/obj/item/organ/I as anything in C.processing_organs) + if(!(I.organ_flags & ORGAN_SYNTHETIC)) + I.applyOrganDamage(-30*removed) + return TRUE + +/* Painkillers */ + +/datum/reagent/medicine/tramadol + name = "Tramadol" + description = "A simple, yet effective painkiller. Don't mix with alcohol." + taste_description = "sourness" + reagent_state = LIQUID + color = "#cb68fc" + overdose_threshold = 30 + metabolization_rate = 0.05 + ingest_met = 0.02 + value = 3.1 + var/pain_power = 40 //magnitide of painkilling effect + var/effective_cycle = 10 //how many cycles it need to process to reach max power -/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(-2 * REM * delta_time, 0) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.type, 2 * REM * delta_time) - ..() - . = TRUE +/datum/reagent/medicine/tramadol/affect_blood(mob/living/carbon/C, removed) + var/effectiveness = volume -/datum/reagent/medicine/sal_acid - name = "Salicylic Acid" - description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising." - reagent_state = LIQUID - color = "#D2D2D2" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 25 - ph = 2.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.getBruteLoss() > 25) - M.adjustBruteLoss(-4 * REM * delta_time, 0) - else - M.adjustBruteLoss(-0.5 * REM * delta_time, 0) - ..() - . = TRUE + if(current_cycle < effective_cycle) + effectiveness = volume * current_cycle/effective_cycle -/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M, delta_time, times_fired) - if(M.getBruteLoss()) //It only makes existing bruises worse - M.adjustBruteLoss(4.5 * REM * delta_time, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5 - . = TRUE - ..() + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, pain_power * effectiveness) -/datum/reagent/medicine/salbutamol - name = "Salbutamol" - description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent." - reagent_state = LIQUID - color = "#00FFFF" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOxyLoss(-3 * REM * delta_time, 0) - if(M.losebreath >= 4) - M.losebreath -= 2 * REM * delta_time - ..() - . = TRUE + if(volume > overdose_threshold) + C.add_movespeed_modifier(/datum/movespeed_modifier/tramadol) + C.set_slurring_if_lower(60 SECONDS) + if(prob(1)) + C.Knockdown(2 SECONDS) + C.drowsyness = max(C.drowsyness, 5) -/datum/reagent/medicine/ephedrine - name = "Ephedrine" - description = "Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing." - reagent_state = LIQUID - color = "#D2FFFA" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 30 - ph = 12 - purity = REAGENT_STANDARD_PURITY - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/stimulants = 4) //1.6 per 2 seconds - inverse_chem = /datum/reagent/inverse/corazargh - inverse_chem_val = 0.4 - -/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - -/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - ..() - -/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(10 * (1-creation_purity), delta_time) && iscarbon(M)) - var/obj/item/I = M.get_active_held_item() - if(I && M.dropItemToGround(I)) - to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!")) - M.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - - M.AdjustAllImmobility(-20 * REM * delta_time * normalise_creation_purity()) - M.stamina.adjust(1 * REM * delta_time * normalise_creation_purity()) - ..() - return TRUE + else if(volume > 0.75 * overdose_threshold) + C.add_movespeed_modifier(/datum/movespeed_modifier/tramadol) + if(prob(5)) + C.set_slurring_if_lower(40 SECONDS) -/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(1 * normalise_creation_purity(), delta_time) && iscarbon(M)) - var/datum/disease/D = new /datum/disease/heart_failure - M.ForceContractDisease(D) - to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) - M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) + else if(volume > 0.5 * overdose_threshold) + C.add_movespeed_modifier(/datum/movespeed_modifier/tramadol) + if(prob(1)) + C.set_slurring_if_lower(20 SECONDS) - if(DT_PROB(3.5 * normalise_creation_purity(), delta_time)) - to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) + else + C.remove_movespeed_modifier(/datum/movespeed_modifier/tramadol) - if(DT_PROB(18 * normalise_creation_purity(), delta_time)) - M.adjustToxLoss(1, 0) - M.losebreath++ - . = TRUE - return TRUE + var/boozed = how_boozed(C) + if(boozed) + APPLY_CHEM_EFFECT(C, CE_ALCOHOL_TOXIC, 1) + APPLY_CHEM_EFFECT(C, CE_BREATHLOSS, 0.1 * boozed) //drinking and opiating makes breathing kinda hard -/datum/reagent/medicine/diphenhydramine - name = "Diphenhydramine" - description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness." - reagent_state = LIQUID - color = "#64FFE6" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - ph = 11.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/tramadol/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.remove_movespeed_modifier(/datum/movespeed_modifier/tramadol) + +/datum/reagent/medicine/tramadol/overdose_process(mob/living/carbon/C) + C.set_timed_status_effect(20 SECONDS, /datum/status_effect/drugginess, only_if_higher = TRUE) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, pain_power*0.5) //extra painkilling for extra trouble + APPLY_CHEM_EFFECT(C, CE_BREATHLOSS, 0.6) //Have trouble breathing, need more air + if(how_boozed(C)) + APPLY_CHEM_EFFECT(C, CE_BREATHLOSS, 0.2) //Don't drink and OD on opiates folks + +/datum/reagent/medicine/tramadol/proc/how_boozed(mob/living/carbon/C) + . = 0 + var/datum/reagents/ingested = C.get_ingested_reagents() + if(!ingested) + return + var/list/pool = C.reagents.reagent_list | ingested.reagent_list + for(var/datum/reagent/consumable/ethanol/booze in pool) + if(booze.volume < 2) //let them experience false security at first + continue + . = 1 + if(booze.boozepwr >= 65) //liquor stuff hits harder + return 2 -/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(5, delta_time)) - M.adjust_drowsyness(1) - M.adjust_timed_status_effect(-2 SECONDS * REM * delta_time, /datum/status_effect/jitter) - holder.remove_reagent(/datum/reagent/toxin/histamine, 3 * REM * delta_time) - ..() +/datum/reagent/medicine/tramadol/oxycodone + name = "Oxycodone" + description = "An effective and very addictive painkiller. Don't mix with alcohol." + taste_description = "bitterness" + color = "#800080" + overdose_threshold = 20 + pain_power = 200 + effective_cycle = 2 + addiction_types = list(/datum/addiction/opiods = 10) /datum/reagent/medicine/morphine name = "Morphine" description = "A painkiller that allows the patient to move at full speed even when injured. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal." reagent_state = LIQUID color = "#A9FBFB" - metabolization_rate = 0.5 * REAGENTS_METABOLISM + metabolization_rate = 0.1 overdose_threshold = 30 - ph = 8.96 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED addiction_types = list(/datum/addiction/opiods = 10) -/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - -/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - ..() - -/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(current_cycle >= 5) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name) - switch(current_cycle) - if(11) - to_chat(M, span_warning("You start to feel tired...") ) - if(12 to 24) - M.adjust_drowsyness(1 * REM * delta_time) - if(24 to INFINITY) - M.Sleeping(40 * REM * delta_time) - . = TRUE - ..() - -/datum/reagent/medicine/morphine/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(18, delta_time)) - M.drop_all_held_items() - M.set_timed_status_effect(4 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(4 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - - -/datum/reagent/medicine/oculine - name = "Oculine" - description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind." - reagent_state = LIQUID - color = "#404040" //oculine is dark grey, inacusiate is light grey - metabolization_rate = 0.25 * REAGENTS_METABOLISM - taste_description = "dull toxin" - purity = REAGENT_STANDARD_PURITY - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - inverse_chem = /datum/reagent/inverse/oculine - inverse_chem_val = 0.45 - ///The lighting alpha that the mob had on addition - var/delta_light - -/datum/reagent/medicine/oculine/on_mob_add(mob/living/owner) - if(!iscarbon(owner)) +/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - RegisterSignal(owner, COMSIG_CARBON_GAIN_ORGAN, PROC_REF(on_gained_organ)) - RegisterSignal(owner, COMSIG_CARBON_LOSE_ORGAN, PROC_REF(on_removed_organ)) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) - return - improve_eyesight(owner, eyes) - -/datum/reagent/medicine/oculine/proc/improve_eyesight(mob/living/carbon/owner, obj/item/organ/eyes/eyes) - delta_light = creation_purity*30 - if(eyes.lighting_alpha) - eyes.lighting_alpha -= delta_light - else - eyes.lighting_alpha = 255 - delta_light - eyes.see_in_dark += 3 - owner.update_sight() + C.add_movespeed_modifier(/datum/movespeed_modifier/morphine) -/datum/reagent/medicine/oculine/proc/restore_eyesight(mob/living/carbon/owner, obj/item/organ/eyes/eyes) - eyes.lighting_alpha += delta_light - eyes.see_in_dark -= 3 - owner.update_sight() - -/datum/reagent/medicine/oculine/proc/on_gained_organ(mob/owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/eyes)) +/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - var/obj/item/organ/eyes/eyes = organ - improve_eyesight(owner, eyes) + C.remove_movespeed_modifier(/datum/movespeed_modifier/morphine) + +/datum/reagent/medicine/morphine/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 120) + C.set_timed_status_effect(4 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) + if(prob(75)) + C.drowsyness++ + if(prob(25)) + C.adjust_confusion(2 SECONDS) + +/datum/reagent/medicine/morphine/overdose_process(mob/living/carbon/C) + C.set_timed_status_effect(4 SECONDS, /datum/status_effect/drugginess, only_if_higher = TRUE) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 50) + +/datum/reagent/medicine/tramadol/oxycodone + name = "Oxycodone" + description = "An extremely effective and very addictive painkiller. Don't mix with alcohol." + taste_description = "bitterness" + color = "#800080" + overdose_threshold = 20 + pain_power = 200 + effective_cycle = 2 + addiction_types = list(/datum/addiction/opiods = 20) -/datum/reagent/medicine/oculine/proc/on_removed_organ(mob/prev_owner, obj/item/organ/organ) - SIGNAL_HANDLER - if(!istype(organ, /obj/item/organ/eyes)) - return - var/obj/item/organ/eyes/eyes = organ - restore_eyesight(prev_owner, eyes) - -/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - owner.adjust_blindness(-2 * REM * delta_time * normalise_creation_purity()) - owner.adjust_blurriness(-2 * REM * delta_time * normalise_creation_purity()) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if (!eyes) - return ..() - var/fix_prob = 10 - if(creation_purity >= 1) - fix_prob = 100 - eyes.applyOrganDamage(-2 * REM * delta_time * normalise_creation_purity()) - if(HAS_TRAIT_FROM(owner, TRAIT_BLIND, EYE_DAMAGE)) - if(DT_PROB(fix_prob, delta_time)) - to_chat(owner, span_warning("Your vision slowly returns...")) - owner.cure_blind(EYE_DAMAGE) - owner.cure_nearsighted(EYE_DAMAGE) - owner.blur_eyes(35) - else if(HAS_TRAIT_FROM(owner, TRAIT_NEARSIGHT, EYE_DAMAGE)) - to_chat(owner, span_warning("The blackness in your peripheral vision fades.")) - owner.cure_nearsighted(EYE_DAMAGE) - owner.blur_eyes(10) - ..() - -/datum/reagent/medicine/oculine/on_mob_delete(mob/living/owner) - var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES) - if(!eyes) +/datum/reagent/medicine/tramadol/oxycodone/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - restore_eyesight(owner, eyes) - ..() - -/datum/reagent/medicine/inacusiate - name = "Inacusiate" - description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total defecit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk - color = "#606060" // ditto - ph = 2 - purity = REAGENT_STANDARD_PURITY - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - inverse_chem_val = 0.3 - inverse_chem = /datum/reagent/impurity/inacusiate + C.stamina.adjust(-INFINITY) + to_chat(C, span_userdanger("Stinging pain shoots through your body!")) -/datum/reagent/medicine/inacusiate/on_mob_add(mob/living/owner, amount) - . = ..() - if(creation_purity >= 1) - RegisterSignal(owner, COMSIG_MOVABLE_HEAR, PROC_REF(owner_hear)) +/* Other medicine */ +/datum/reagent/medicine/synaptizine + name = "Synaptizine" + description = "Synaptizine is used to treat various diseases." + taste_description = "bitterness" + reagent_state = LIQUID + color = "#99ccff" + metabolization_rate = 0.01 + overdose_threshold = 5 + value = 4.6 -//Lets us hear whispers from far away! -/datum/reagent/medicine/inacusiate/proc/owner_hear(datum/source, message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) - SIGNAL_HANDLER - if(!isliving(holder.my_atom)) - return - var/mob/living/owner = holder.my_atom - var/atom/movable/composer = holder.my_atom - if(message_mods[WHISPER_MODE]) - message = composer.compose_message(owner, message_language, message, , spans, message_mods) +/datum/reagent/medicine/synaptizine/affect_blood(mob/living/carbon/C, removed) + C.drowsyness = max(C.drowsyness - 5, 0) + C.AdjustAllImmobility(-2 SECONDS * removed) -/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - var/obj/item/organ/ears/ears = owner.getorganslot(ORGAN_SLOT_EARS) - if(!ears) - return ..() - ears.adjustEarDamage(-4 * REM * delta_time * normalise_creation_purity(), -4 * REM * delta_time * normalise_creation_purity()) - ..() + holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5) -/datum/reagent/medicine/inacusiate/on_mob_delete(mob/living/owner) - . = ..() - UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + C.adjustToxLoss(3 * removed, updating_health = FALSE) // It used to be incredibly deadly due to an oversight. Not anymore! + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 70) + APPLY_CHEM_EFFECT(C, CE_STIMULANT, 10) + return TRUE -/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." +/datum/reagent/medicine/dylovene + name = "Dylovene" + description = "Dylovene is a broad-spectrum antitoxin used to neutralize poisons before they can do significant harm." + taste_description = "a roll of gauze" + color = "#dadd98" + metabolization_rate = 0.2 + +/datum/reagent/medicine/dylovene/affect_blood(mob/living/carbon/C, removed) + C.adjust_drowsyness(-6 * removed) + SET_CHEM_EFFECT_IF_LOWER(C, CE_ANTITOX, 1) + + var/removing = (4 * removed) + var/datum/reagents/ingested = C.get_ingested_reagents() + + for(var/datum/reagent/R in ingested.reagent_list) + if(istype(R, /datum/reagent/toxin)) + ingested.remove_reagent(R.type, removing) + return + + for(var/datum/reagent/R in C.reagents.reagent_list) + if(istype(R, /datum/reagent/toxin)) + C.reagents.remove_reagent(R.type, removing) + return + +/datum/reagent/medicine/alkysine + name = "Alkysine" + description = "Alkysine is a drug used to lessen the damage to neurological tissue after a injury. Can aid in healing brain tissue." + taste_description = "bitterness" reagent_state = LIQUID - color = "#1D3535" //slightly more blue, like epinephrine - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 35 - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.health <= M.crit_threshold) - M.adjustToxLoss(-2 * REM * delta_time, 0) - M.adjustBruteLoss(-2* REM * delta_time, 0) - M.adjustFireLoss(-2 * REM * delta_time, 0) - M.adjustOxyLoss(-5 * REM * delta_time, 0) - . = TRUE - M.losebreath = 0 - if(DT_PROB(10, delta_time)) - M.set_timed_status_effect(10 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() - -/datum/reagent/medicine/atropine/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustToxLoss(0.5 * REM * delta_time, 0) - . = TRUE - M.set_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - M.set_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - ..() + color = "#ffff66" + metabolization_rate = 0.05 + overdose_threshold = 30 + value = 5.9 + +/datum/reagent/medicine/alkysine/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, 30) + APPLY_CHEM_EFFECT(C, CE_BRAIN_REGEN, 1) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -10 * removed, updating_health = FALSE) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.adjust_confusion(2 SECONDS) + H.drowsyness++ + + if(prob(10)) + C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) + return TRUE -/datum/reagent/medicine/epinephrine - name = "Epinephrine" - description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage." +/datum/reagent/medicine/imidazoline + name = "Imidazoline" + description = "Heals eye damage" + taste_description = "dull toxin" reagent_state = LIQUID - color = "#D2FFFA" - metabolization_rate = 0.25 * REAGENTS_METABOLISM + color = "#c8a5dc" overdose_threshold = 30 - ph = 10.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M) - ..() - ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type) - -/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/M) - REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type) - ..() + metabolization_rate = 0.4 + value = 4.2 -/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = TRUE - if(holder.has_reagent(/datum/reagent/toxin/lexorin)) - holder.remove_reagent(/datum/reagent/toxin/lexorin, 2 * REM * delta_time) - holder.remove_reagent(/datum/reagent/medicine/epinephrine, 1 * REM * delta_time) - if(DT_PROB(10, delta_time)) - holder.add_reagent(/datum/reagent/toxin/histamine, 4) - ..() - return - if(M.health <= M.crit_threshold) - M.adjustToxLoss(-0.5 * REM * delta_time, 0) - M.adjustBruteLoss(-0.5 * REM * delta_time, 0) - M.adjustFireLoss(-0.5 * REM * delta_time, 0) - M.adjustOxyLoss(-0.5 * REM * delta_time, 0) - if(M.losebreath >= 4) - M.losebreath -= 2 * REM * delta_time - if(M.losebreath < 0) - M.losebreath = 0 - M.stamina.adjust(0.5 * REM * delta_time) - if(DT_PROB(10, delta_time)) - M.AdjustAllImmobility(-20) - ..() - -/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(18, REM * delta_time)) - M.stamina.adjust(2.5) - M.adjustToxLoss(1, 0) - M.losebreath++ - . = TRUE - ..() +/datum/reagent/medicine/imidazoline/affect_blood(mob/living/carbon/C, removed) + C.eye_blurry = max(C.eye_blurry - 5, 0) + C.eye_blind = max(C.eye_blind - 5, 0) + C.adjustOrganLoss(ORGAN_SLOT_EYES, -5 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/strange_reagent - name = "Strange Reagent" - description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living." +/datum/reagent/medicine/peridaxon + name = "Peridaxon" + description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." + taste_description = "bitterness" reagent_state = LIQUID - color = "#A0E85E" - metabolization_rate = 1.25 * REAGENTS_METABOLISM - taste_description = "magnets" - harmful = TRUE - ph = 0.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + color = "#561ec3" + metabolization_rate = 0.1 + overdose_threshold =10 + value = 6 - -// FEED ME SEYMOUR -/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(type, 1)) - mytray.spawnplant() - -/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - if(exposed_mob.stat != DEAD) - return ..() - if(exposed_mob.suiciding) //they are never coming back - exposed_mob.visible_message(span_warning("[exposed_mob]'s body does not react...")) - return - if(iscarbon(exposed_mob) && !(methods & INGEST)) //simplemobs can still be splashed - return ..() - var/amount_to_revive = round((exposed_mob.getBruteLoss()+exposed_mob.getFireLoss())/20) - if(exposed_mob.getBruteLoss()+exposed_mob.getFireLoss() >= 200 || HAS_TRAIT(exposed_mob, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive. - exposed_mob.visible_message(span_warning("[exposed_mob]'s body convulses a bit, and then falls still once more.")) - exposed_mob.do_jitter_animation(10) +/datum/reagent/medicine/peridaxon/affect_blood(mob/living/carbon/C, removed) + if(!ishuman(C)) return - exposed_mob.visible_message(span_warning("[exposed_mob]'s body starts convulsing!")) - exposed_mob.notify_ghost_cloning("Your body is being revived with Strange Reagent!") - exposed_mob.do_jitter_animation(10) - var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board - addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds - addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80) - addtimer(CALLBACK(exposed_mob, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79) - ..() - -/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/damage_at_random = rand(0, 250)/100 //0 to 2.5 - M.adjustBruteLoss(damage_at_random * REM * delta_time, FALSE) - M.adjustFireLoss(damage_at_random * REM * delta_time, FALSE) - ..() - . = TRUE - -/datum/reagent/medicine/mannitol - name = "Mannitol" - description = "Efficiently restores brain damage." - taste_description = "pleasant sweetness" - color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey - ph = 10.4 - overdose_threshold = 15 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - purity = REAGENT_STANDARD_PURITY - inverse_chem = /datum/reagent/inverse - inverse_chem_val = 0.45 - -/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2 * REM * delta_time * normalise_creation_purity()) - ..() - -//Having mannitol in you will pause the brain damage from brain tumor (so it heals an even 2 brain damage instead of 1.8) -/datum/reagent/medicine/mannitol/on_mob_metabolize(mob/living/carbon/owner) - . = ..() - ADD_TRAIT(owner, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) -/datum/reagent/medicine/mannitol/on_mob_end_metabolize(mob/living/carbon/owner) - REMOVE_TRAIT(owner, TRAIT_TUMOR_SUPPRESSED, TRAIT_GENERIC) - . = ..() + var/mob/living/carbon/human/H = C + for(var/obj/item/organ/I as anything in H.processing_organs) + if(!(I.organ_flags & ORGAN_SYNTHETIC)) + if(istype(I, /obj/item/organ/brain)) + // if we have located an organic brain, apply side effects + H.adjust_confusion(2 SECONDS) + H.drowsyness++ + // peridaxon only heals minor brain damage + if(I.damage >= I.maxHealth * 0.75) + continue + I.applyOrganDamage(-3 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/medicine/mannitol/overdose_start(mob/living/owner) - to_chat(owner, span_notice("You suddenly feel E N L I G H T E N E D!")) +/datum/reagent/medicine/hyperzine + name = "Hyperzine" + description = "Hyperzine is a highly effective, long lasting, muscle stimulant." + taste_description = "acid" + reagent_state = LIQUID + color = "#ff3300" + metabolization_rate = 0.03 + overdose_threshold = 15 + value = 3.9 -/datum/reagent/medicine/mannitol/overdose_process(mob/living/owner, delta_time, times_fired) - if(DT_PROB(65, delta_time)) +/datum/reagent/medicine/hyperzine/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - var/list/tips - if(DT_PROB(50, delta_time)) - tips = world.file2list("strings/tips.txt") - if(DT_PROB(50, delta_time)) - tips = world.file2list("strings/sillytips.txt") - else - tips = world.file2list("strings/chemistrytips.txt") - var/message = pick(tips) - send_tip_of_the_round(owner, message) - return ..() + ADD_TRAIT(C, TRAIT_HYPERZINE, CHEM_TRAIT_SOURCE(class)) + C.add_movespeed_modifier(/datum/movespeed_modifier/hyperzine) -/datum/reagent/medicine/neurine - name = "Neurine" - description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas." - color = "#C0C0C0" //ditto - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED | REAGENT_DEAD_PROCESS - purity = REAGENT_STANDARD_PURITY - inverse_chem_val = 0.5 - inverse_chem = /datum/reagent/inverse/neurine - ///brain damage level when we first started taking the chem - var/initial_bdamage = 200 - -/datum/reagent/medicine/neurine/on_mob_add(mob/living/owner, amount) - . = ..() - ADD_TRAIT(owner, TRAIT_ANTICONVULSANT, name) - if(!iscarbon(owner)) +/datum/reagent/medicine/hyperzine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return - var/mob/living/carbon/carbon = owner - if(creation_purity >= 1) - initial_bdamage = carbon.getOrganLoss(ORGAN_SLOT_BRAIN) + REMOVE_TRAIT(C, TRAIT_HYPERZINE, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT(C, TRAIT_HYPERZINE)) + C.remove_movespeed_modifier(/datum/movespeed_modifier/hyperzine) -/datum/reagent/medicine/neurine/on_mob_delete(mob/living/owner) - . = ..() - REMOVE_TRAIT(owner, TRAIT_ANTICONVULSANT, name) - if(!iscarbon(owner)) - return - var/mob/living/carbon/carbon = owner - if(initial_bdamage < carbon.getOrganLoss(ORGAN_SLOT_BRAIN)) - carbon.setOrganLoss(ORGAN_SLOT_BRAIN, initial_bdamage) - -/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/owner, delta_time, times_fired) - if(holder.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin)) - holder.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5 * REM * delta_time * normalise_creation_purity()) - if(DT_PROB(8 * normalise_creation_purity(), delta_time)) - owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) - ..() - -/datum/reagent/medicine/neurine/on_mob_dead(mob/living/carbon/owner, delta_time) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * REM * delta_time * normalise_creation_purity()) - ..() - -/datum/reagent/medicine/mutadone - name = "Mutadone" - description = "Removes jitteriness and restores genetic defects." - color = "#5096C8" - taste_description = "acid" - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.remove_status_effect(/datum/status_effect/jitter) - if(M.has_dna()) - M.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) - if(!QDELETED(M)) //We were a monkey, now a human - ..() - -/datum/reagent/medicine/antihol - name = "Antihol" - description = "Purges alcoholic substance from the patient's body and eliminates its side effects." - color = "#00B4C8" - taste_description = "raw egg" - ph = 4 - purity = REAGENT_STANDARD_PURITY - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - inverse_chem_val = 0.35 - inverse_chem = /datum/reagent/inverse/antihol - -/datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.remove_status_effect(/datum/status_effect/dizziness) - M.set_drowsyness(0) - M.remove_status_effect(/datum/status_effect/speech/slurring/drunk) - M.remove_status_effect(/datum/status_effect/confusion) - M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3 * REM * delta_time * normalise_creation_purity(), FALSE, TRUE) - M.adjustToxLoss(-0.2 * REM * delta_time, 0) - M.adjust_drunk_effect(-10 * REM * delta_time * normalise_creation_purity()) - ..() - . = TRUE +/datum/reagent/medicine/hyperzine/affect_blood(mob/living/carbon/C, removed) + if(prob(5)) + spawn(-1) + C.emote(pick("twitch", "blink_r", "shiver")) + APPLY_CHEM_EFFECT(C, CE_PULSE, 3) + APPLY_CHEM_EFFECT(C, CE_STIMULANT, 4) -/datum/reagent/medicine/stimulants - name = "Stimulants" - description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage." - color = "#78008C" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - overdose_threshold = 60 - ph = 8.7 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - addiction_types = list(/datum/addiction/stimulants = 4) //0.8 per 2 seconds - -/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - -/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - ..() - -/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.health < 50 && M.health > 0) - M.adjustOxyLoss(-1 * REM * delta_time, 0) - M.adjustToxLoss(-1 * REM * delta_time, 0) - M.adjustBruteLoss(-1 * REM * delta_time, 0) - M.adjustFireLoss(-1 * REM * delta_time, 0) - M.AdjustAllImmobility(-60 * REM * delta_time) - M.stamina.adjust(5 * REM * delta_time) - ..() - . = TRUE +/datum/reagent/medicine/coagulant + name = "Coagulant" + description = "A coagulant capable of staunching both internal and external bleeding." + taste_description = "iron" + reagent_state = LIQUID + color = "#bf0000" + metabolization_rate = 0.01 -/datum/reagent/medicine/stimulants/overdose_process(mob/living/M, delta_time, times_fired) - if(DT_PROB(18, delta_time)) - M.stamina.adjust(2.5) - M.adjustToxLoss(1, 0) - M.losebreath++ - . = TRUE - ..() +/datum/reagent/medicine/coagulant/affect_blood(mob/living/carbon/M, removed) + if(!ishuman(M)) + return -/datum/reagent/medicine/insulin - name = "Insulin" - description = "Increases sugar depletion rates." - reagent_state = LIQUID - color = "#FFFFF0" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - ph = 6.7 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + APPLY_CHEM_EFFECT(M, CE_ANTICOAGULANT, -1) -/datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.AdjustSleeping(-20 * REM * delta_time)) - . = TRUE - holder.remove_reagent(/datum/reagent/consumable/sugar, 3 * REM * delta_time) - ..() + for(var/obj/item/bodypart/BP as anything in M.bodyparts) + if((BP.bodypart_flags & BP_ARTERY_CUT) && prob(2)) + BP.set_sever_artery(FALSE) -//Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient. + for(var/datum/wound/W as anything in BP.wounds) + if(W.bleeding() && prob(10)) + W.bleed_timer = 0 + W.clamp_wound() -/datum/reagent/medicine/inaprovaline //is this used anywhere? - name = "Inaprovaline" - description = "Stabilizes the breathing of patients. Good for those in critical condition." - reagent_state = LIQUID - color = "#A4D8D8" - ph = 8.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/coagulant/overdose_process(mob/living/carbon/C) + APPLY_CHEM_EFFECT(C, CE_BLOCKAGE, 1) -/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.losebreath >= 5) - M.losebreath -= 5 * REM * delta_time - ..() +/datum/reagent/medicine/epinephrine + name = "Epinephrine" + description = "Adrenaline is a hormone used as a drug to treat cardiac arrest, and as a performance enhancer." + taste_description = "rush" + reagent_state = LIQUID + color = "#c8a5dc" + overdose_threshold = 20 + metabolization_rate = 0.1 + value = 2 + +/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + ADD_TRAIT(C, TRAIT_NOCRITDAMAGE, CHEM_TRAIT_SOURCE(class)) + ADD_TRAIT(C, TRAIT_NOSOFTCRIT,CHEM_TRAIT_SOURCE(class)) + to_chat(C, span_alert("Energy rushes through your veins!")) + +/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + REMOVE_TRAIT(C, TRAIT_NOCRITDAMAGE, CHEM_TRAIT_SOURCE(class)) + REMOVE_TRAIT(C, TRAIT_NOSOFTCRIT,CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/medicine/epinephrine/affect_blood(mob/living/carbon/C, removed) + if(volume < 0.2) //not that effective after initial rush + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, min(30*volume, 80)) + APPLY_CHEM_EFFECT(C, CE_PULSE, 1) + else if(volume < 1) + APPLY_CHEM_EFFECT(C, CE_PAINKILLER, min(15*volume, 20)) + APPLY_CHEM_EFFECT(C, CE_PULSE, 2) + APPLY_CHEM_EFFECT(C, CE_STIMULANT, 2) + + if(volume >= 4 && C.undergoing_cardiac_arrest()) + if(C.resuscitate()) + log_health(C, "Resuscitated due to epinephrine.") + holder.remove_reagent(type, 4) + var/obj/item/organ/heart = C.getorganslot(ORGAN_SLOT_HEART) + heart.applyOrganDamage(heart.maxHealth * 0.075) + to_chat(C, span_userdanger("Adrenaline rushes through your body, you refuse to give up!")) + + if(volume > 10) + C.set_timed_status_effect(5 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) + + C.AdjustAllImmobility(-2 * removed) -/datum/reagent/medicine/regen_jelly - name = "Regenerative Jelly" - description = "Gradually regenerates all types of damage, without harming slime anatomy." +/datum/reagent/medicine/ephedrine + name = "Ephedrine" + description = "A powerful stimulant that can be used to power through pain and increase athletic ability." reagent_state = LIQUID - color = "#CC23FF" - taste_description = "jelly" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + color = "#D2FFFA" + metabolization_rate = 0.3 + overdose_threshold = 30 + addiction_types = list(/datum/addiction/stimulants = 4) //1.6 per 2 seconds -/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/exposed_mob, reac_volume) - . = ..() - if(!ishuman(exposed_mob) || (reac_volume < 0.5)) +/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) return + ADD_TRAIT(C, TRAIT_EPHEDRINE, CHEM_TRAIT_SOURCE(class)) + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) - var/mob/living/carbon/human/exposed_human = exposed_mob - exposed_human.hair_color = "#CC22FF" - exposed_human.facial_hair_color = "#CC22FF" - exposed_human.update_body_parts() +/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_EPHEDRINE, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT(C, TRAIT_EPHEDRINE)) + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) -/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustBruteLoss(-1.5 * REM * delta_time, 0) - M.adjustFireLoss(-1.5 * REM * delta_time, 0) - M.adjustOxyLoss(-1.5 * REM * delta_time, 0) - M.adjustToxLoss(-1.5 * REM * delta_time, 0, TRUE) //heals TOXINLOVERs - ..() - . = TRUE +/datum/reagent/medicine/ephedrine/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(prob(20)) + var/obj/item/I = C.get_active_held_item() + if(I && C.dropItemToGround(I)) + to_chat(C, span_notice("Your hands spaz out and you drop what you were holding!")) + C.set_timed_status_effect(20 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + + C.AdjustAllImmobility(-20 * removed) + C.stamina.adjust(1 * removed) + return TRUE -/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs - name = "Restorative Nanites" - description = "Miniature medical robots that swiftly restore bodily damage." +/datum/reagent/medicine/ryetalyn + name = "Ryetalyn" + description = "Ryetalyn can cure all genetic mutations and abnormalities via a catalytic process. Known by the brand name \"Mutadone\"." + taste_description = "acid" reagent_state = SOLID - color = "#555555" + color = "#004000" + overdose_threshold = 30 + value = 3.6 overdose_threshold = 30 - ph = 11 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustBruteLoss(-5 * REM * delta_time, 0) //A ton of healing - this is a 50 telecrystal investment. - M.adjustFireLoss(-5 * REM * delta_time, 0) - M.adjustOxyLoss(-15 * REM * delta_time, 0) - M.adjustToxLoss(-5 * REM * delta_time, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15 * REM * delta_time) - M.adjustCloneLoss(-3 * REM * delta_time, 0) - ..() - . = TRUE -/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M, delta_time, times_fired) //wtb flavortext messages that hint that you're vomitting up robots - if(DT_PROB(13, delta_time)) - M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code - M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies - ..() - . = TRUE +/datum/reagent/medicine/ryetalyn/affect_blood(mob/living/carbon/C, removed) + C.remove_status_effect(/datum/status_effect/jitter) + if(C.has_dna()) + C.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE) -/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants - name = "Earthsblood" - description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain. For some strange reason, it also induces temporary pacifism in those who imbibe it and semi-permanent pacifism in those who overdose on it." - color = "#FFAF00" - metabolization_rate = REAGENTS_METABOLISM //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations. - overdose_threshold = 25 - ph = 11 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/hallucinogens = 14) - -/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE - M.adjustBruteLoss(-1 * REM * delta_time, 0) - M.adjustFireLoss(-1 * REM * delta_time, 0) - M.adjustOxyLoss(-0.5 * REM * delta_time, 0) - M.adjustToxLoss(-0.5 * REM * delta_time, 0) - M.adjustCloneLoss(-0.1 * REM * delta_time, 0) - M.stamina.adjust(-0.5 * REM * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * delta_time, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that! - else - M.adjustBruteLoss(-5 * REM * delta_time, 0) //slow to start, but very quick healing once it gets going - M.adjustFireLoss(-5 * REM * delta_time, 0) - M.adjustOxyLoss(-3 * REM * delta_time, 0) - M.adjustToxLoss(-3 * REM * delta_time, 0) - M.adjustCloneLoss(-1 * REM * delta_time, 0) - M.stamina.adjust(3 * REM * delta_time) - M.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/jitter, max_duration = 1 MINUTES) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM * delta_time, 150) - if(DT_PROB(5, delta_time)) - M.say(pick("Yeah, well, you know, that's just, like, uh, your opinion, man.", "Am I glad he's frozen in there and that we're out here, and that he's the sheriff and that we're frozen out here, and that we're in there, and I just remembered, we're out here. What I wanna know is: Where's the caveman?", "It ain't me, it ain't me...", "Make love, not war!", "Stop, hey, what's that sound? Everybody look what's going down...", "Do you believe in magic in a young girl's heart?"), forced = /datum/reagent/medicine/earthsblood) - M.adjust_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/drugginess, max_duration = 30 SECONDS * REM * delta_time) - ..() - . = TRUE +/datum/reagent/medicine/spaceacillin + name = "Spaceacillin" + description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with. Also reduces infection in serious burns." + color = "#E1F2E6" + metabolization_rate = 0.02 -/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_PACIFISM, type) - -/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PACIFISM, type) - ..() - -/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M, delta_time, times_fired) - M.hallucination = clamp(M.hallucination + (5 * REM * delta_time), 0, 60) - if(current_cycle > 25) - M.adjustToxLoss(4 * REM * delta_time, 0) - if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee - M.adjustToxLoss(6 * REM * delta_time, 0) - if(iscarbon(M)) - var/mob/living/carbon/hippie = M - hippie.gain_trauma(/datum/brain_trauma/severe/pacifism) - ..() - . = TRUE +/datum/reagent/medicine/spaceacillin/affect_blood(mob/living/carbon/C, removed) + APPLY_CHEM_EFFECT(C, CE_ANTIBIOTIC, volume) /datum/reagent/medicine/haloperidol name = "Haloperidol" - description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage." + description = "A powerful antipsychotic and sedative. Will help control psychiatric problems, but may cause brain damage." reagent_state = LIQUID color = "#27870a" - metabolization_rate = 0.4 * REAGENTS_METABOLISM - ph = 4.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.2 harmful = TRUE -/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - for(var/datum/reagent/drug/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type, 5 * REM * delta_time) - M.adjust_drowsyness(2 * REM * delta_time) +/datum/reagent/medicine/haloperidol/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + ADD_TRAIT(C, TRAIT_HALOPERIDOL, CHEM_TRAIT_SOURCE(class)) - if(M.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS) - M.adjust_timed_status_effect(-6 SECONDS * REM * delta_time, /datum/status_effect/jitter) +/datum/reagent/medicine/haloperidol/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_HALOPERIDOL, CHEM_TRAIT_SOURCE(class)) - if (M.hallucination >= 5) - M.hallucination -= 5 * REM * delta_time - if(DT_PROB(10, delta_time)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50) - M.stamina.adjust(-2.5 * REM * delta_time) - ..() - return TRUE +/datum/reagent/medicine/haloperidol/affect_blood(mob/living/carbon/C, removed) + for(var/datum/reagent/drug/R in C.reagents.reagent_list) + C.reagents.remove_reagent(R.type, 5 * removed) -//used for changeling's adrenaline power -/datum/reagent/medicine/changelingadrenaline - name = "Changeling Adrenaline" - description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." - color = "#C1151D" - overdose_threshold = 30 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) - ..() - metabolizer.AdjustAllImmobility(-20 * REM * delta_time) - metabolizer.stamina.adjust(10 * REM * delta_time) - metabolizer.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - metabolizer.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - return TRUE + if(C.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS) + C.adjust_timed_status_effect(-6 SECONDS * removed, /datum/status_effect/jitter) -/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type) - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - -/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) - ..() - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type) - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - L.remove_status_effect(/datum/status_effect/dizziness) - L.remove_status_effect(/datum/status_effect/jitter) - -/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, delta_time, times_fired) - metabolizer.adjustToxLoss(1 * REM * delta_time, 0) - ..() - return TRUE + if(C.stat == CONSCIOUS) + C.adjust_drowsyness(16 * removed, up_to = 180) + else + C.adjust_drowsyness((16 * removed) / 5, up_to = 180) -/datum/reagent/medicine/changelinghaste - name = "Changeling Haste" - description = "Drastically increases movement speed, but deals toxin damage." - color = "#AE151D" - metabolization_rate = 2.5 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + C.adjust_timed_status_effect(-3 * removed, /datum/status_effect/drugginess) -/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) - ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) + if (C.hallucination >= 5) + C.hallucination -= 5 * removed -/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) - ..() + if(prob(20)) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 50, updating_health = FALSE) -/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) - metabolizer.adjustToxLoss(2 * REM * delta_time, 0) - ..() + if(prob(10)) + spawn(-1) + C.emote("drool") return TRUE -/datum/reagent/medicine/higadrite - name = "Higadrite" - description = "A medication utilized to treat ailing livers." - color = "#FF3542" - self_consuming = TRUE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/leporazine + name = "Leporazine" + description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels." + color = "#DB90C6" + -/datum/reagent/medicine/higadrite/on_mob_metabolize(mob/living/M) - . = ..() - ADD_TRAIT(M, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/higadrite/on_mob_end_metabolize(mob/living/M) - ..() - REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) - -/datum/reagent/medicine/cordiolis_hepatico - name = "Cordiolis Hepatico" - description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown." - color = "#000000" - self_consuming = TRUE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M) - ..() - ADD_TRAIT(M, TRAIT_STABLELIVER, type) - ADD_TRAIT(M, TRAIT_STABLEHEART, type) - -/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M) - ..() - REMOVE_TRAIT(M, TRAIT_STABLEHEART, type) - REMOVE_TRAIT(M, TRAIT_STABLELIVER, type) - -/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." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L) - . = ..() - L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) +/datum/reagent/medicine/leporazine/affect_blood(mob/living/carbon/C, removed) + var/target_temp = C.get_body_temp_normal(apply_change=FALSE) + if(C.bodytemperature > target_temp) + C.adjust_bodytemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, target_temp) + else if(C.bodytemperature < (target_temp + 1)) + C.adjust_bodytemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, target_temp) + + if(ishuman(C)) + var/mob/living/carbon/human/humi = C + if(humi.coretemperature > target_temp) + humi.adjust_coretemperature(-40 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, target_temp) + else if(humi.coretemperature < (target_temp + 1)) + humi.adjust_coretemperature(40 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, 0, target_temp) + + +/datum/reagent/medicine/potass_iodide + name = "Potassium Iodide" + description = "Heals low toxin damage while the patient is irradiated, and will halt the damaging effects of radiation." + reagent_state = LIQUID + color = "#BAA15D" + metabolization_rate = 0.4 + + +/datum/reagent/medicine/potass_iodide/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_HALT_RADIATION_EFFECTS, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L) +/datum/reagent/medicine/potass_iodide/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_HALT_RADIATION_EFFECTS, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/medicine/potass_iodide/affect_blood(mob/living/carbon/C, removed) + if (HAS_TRAIT(C, TRAIT_IRRADIATED)) + C.adjustToxLoss(-1 * removed) + +/datum/reagent/medicine/saline_glucose + name = "Saline-Glucose" + description = "Promotes blood rejuvenation in living creatures." + reagent_state = LIQUID + color = "#DCDCDC" + metabolization_rate = 0.1 + overdose_threshold = 60 + taste_description = "sweetness and salt" + var/last_added = 0 + var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active + /// In addition to acting as temporary blood, this much blood is fully regenerated per unit used. + var/extra_regen = 1 + +/datum/reagent/medicine/saline_glucose/affect_blood(mob/living/carbon/C, removed) . = ..() - L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + if(last_added) + C.adjustBloodVolume(-last_added) + last_added = 0 + + if(C.blood_volume < maximum_reachable) //Can only up to double your effective blood level. + var/amount_to_add = min(C.blood_volume, 5*volume) + last_added = C.adjustBloodVolumeUpTo(amount_to_add + maximum_reachable) + C.adjustBloodVolume(extra_regen * removed) -/datum/reagent/medicine/modafinil - name = "Modafinil" - description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with." +/datum/reagent/medicine/synthflesh + name = "Synthflesh" + description = "Synthetic flesh that weaves itself into organic creatures. Do not ingest." reagent_state = LIQUID - color = "#BEF7D8" // palish blue white - metabolization_rate = 0.1 * REAGENTS_METABOLISM - overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested) - taste_description = "salt" // it actually does taste salty - var/overdose_progress = 0 // to track overdose progress - ph = 7.89 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type) - ..() - -/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type) - ..() - -/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) - if(!overdosed) // We do not want any effects on OD - overdose_threshold = overdose_threshold + ((rand(-10, 10) / 10) * REM * delta_time) // for extra fun - metabolizer.AdjustAllImmobility(-5 * REM * delta_time) - metabolizer.stamina.adjust(0.5 * REM * delta_time) - metabolizer.set_timed_status_effect(1 SECONDS * REM * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) - metabolization_rate = 0.005 * REAGENTS_METABOLISM * rand(5, 20) // randomizes metabolism between 0.02 and 0.08 per second + color = "#FFEBEB" + + touch_met = 1 + metabolization_rate = 0.2 + var/spoke + +/datum/reagent/medicine/synthflesh/affect_touch(mob/living/carbon/C, removed) + if(C.getFireLoss() || C.getBruteLoss()) + if(!spoke) + to_chat(C, span_notice("Your skin feels cold as the synthetic flesh integrates itself into your wounds.")) + spoke = TRUE + C.heal_overall_damage(2 * removed, 2 * removed, BODYTYPE_ORGANIC, updating_health = FALSE) . = TRUE - ..() - -/datum/reagent/medicine/modafinil/overdose_start(mob/living/M) - to_chat(M, span_userdanger("You feel awfully out of breath and jittery!")) - metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.005 per second on overdose - -/datum/reagent/medicine/modafinil/overdose_process(mob/living/M, delta_time, times_fired) - overdose_progress++ - switch(overdose_progress) - if(1 to 40) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/jitter, max_duration = 20 SECONDS) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/speech/stutter, max_duration = 20 SECONDS) - M.set_timed_status_effect(10 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(DT_PROB(30, delta_time)) - M.losebreath++ - if(41 to 80) - M.adjustOxyLoss(0.1 * REM * delta_time, 0) - M.stamina.adjust(-0.1 * REM * delta_time) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/jitter, max_duration = 40 SECONDS) - M.adjust_timed_status_effect(2 SECONDS * REM * delta_time, /datum/status_effect/speech/stutter, max_duration = 40 SECONDS) - M.set_timed_status_effect(20 SECONDS * REM * delta_time, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(DT_PROB(30, delta_time)) - M.losebreath++ - if(DT_PROB(10, delta_time)) - to_chat(M, span_userdanger("You have a sudden fit!")) - M.emote("moan") - M.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used - if(81) - to_chat(M, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal - M.adjustOxyLoss(0.1 * REM * delta_time, 0) - M.stamina.adjust(-0.1 * REM * delta_time) - if(82 to INFINITY) - M.Sleeping(100 * REM * delta_time) - M.adjustOxyLoss(1.5 * REM * delta_time, 0) - M.stamina.adjust(-1.5 * REM * delta_time) - ..() + + if(HAS_TRAIT_FROM(C, TRAIT_HUSK, BURN) && C.getFireLoss() < UNHUSK_DAMAGE_THRESHOLD && (volume >= SYNTHFLESH_UNHUSK_AMOUNT)) + C.cure_husk(BURN) + C.visible_message("A rubbery liquid coats [C]'s burns.") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or a golem or something + +/datum/reagent/medicine/synthflesh/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(1 * removed) return TRUE -/datum/reagent/medicine/psicodine - name = "Psicodine" - description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage." +/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." reagent_state = LIQUID - color = "#07E79E" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 30 - ph = 9.12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_FEARLESS, type) - -/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FEARLESS, type) - ..() - -/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-12 SECONDS * REM * delta_time, /datum/status_effect/jitter) - M.adjust_timed_status_effect(-12 SECONDS * REM * delta_time, /datum/status_effect/dizziness) - M.adjust_timed_status_effect(-6 SECONDS * REM * delta_time, /datum/status_effect/confusion) - M.disgust = max(M.disgust - (6 * REM * delta_time), 0) - var/datum/component/mood/mood = M.GetComponent(/datum/component/mood) - if(mood != null && mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then... - mood.setSanity(min(mood.sanity + (5 * REM * delta_time), SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral - ..() - . = TRUE + color = "#1D3535" //slightly more blue, like epinephrine + metabolization_rate = 0.1 + overdose_threshold = 35 -/datum/reagent/medicine/psicodine/overdose_process(mob/living/M, delta_time, times_fired) - M.hallucination = clamp(M.hallucination + (5 * REM * delta_time), 0, 60) - M.adjustToxLoss(1 * REM * delta_time, 0) - ..() - . = TRUE -/datum/reagent/medicine/metafactor - name = "Mitogen Metabolism Factor" - description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." - metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. - reagent_state = SOLID - color = "#FFBE00" - overdose_threshold = 10 - inverse_chem_val = 0.1 //Shouldn't happen - but this is so looking up the chem will point to the failed type - inverse_chem = /datum/reagent/impurity/probital_failed - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/M) - metabolization_rate = 2 * REAGENTS_METABOLISM - -/datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(13, delta_time)) - M.vomit() - ..() - -/datum/reagent/medicine/silibinin - name = "Silibinin" - description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver." - reagent_state = SOLID - color = "#FFFFD0" - metabolization_rate = 1.5 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/atropine/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(C.health <= C.crit_threshold) + C.adjustToxLoss(-2 * removed, 0) + C.adjustBruteLoss(-2 * removed, 0) + C.adjustFireLoss(-2 * removed, 0) + C.adjustOxyLoss(-5 * removed, 0) + . = TRUE + C.losebreath = 0 + if(prob(20)) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) + +// Note to self: should be made with lexorin, haloperidol, and clf3 +/datum/reagent/medicine/chlorpromazine + name = "Chlorpromazine" + description = "A powerful antipsychotic. For schizophrenics, it counteracts their symptoms and anchors them to reality." + color = "#B31008" // rgb: 139, 166, 233 + taste_description = "sourness" + + metabolization_rate = 0.02 + overdose_threshold = 60 -/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2 * REM * delta_time)//Add a chance to cure liver trauma once implemented. - ..() - . = TRUE +/datum/reagent/medicine/chlorpromazine/affect_blood(mob/living/carbon/C, removed) + if(HAS_TRAIT(C, TRAIT_INSANITY)) + C.hallucination = 0 + if(volume >= 20) + holder.add_reagent(/datum/reagent/medicine/haloperidol, removed) -/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. - name = "Polypyrylium Oligomers" - description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." - reagent_state = SOLID - color = "#9423FF" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 50 - taste_description = "numbing bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/medicine/regen_jelly + name = "Regenerative Jelly" + description = "Gradually regenerates all types of damage, without harming slime anatomy." + reagent_state = LIQUID + color = "#CC23FF" + taste_description = "jelly" -/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M, delta_time, times_fired) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. - . = ..() - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25 * REM * delta_time) - M.adjustBruteLoss(-0.35 * REM * delta_time, 0) - return TRUE -/datum/reagent/medicine/polypyr/expose_mob(mob/living/carbon/human/exposed_human, methods=TOUCH, reac_volume) +/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_human) || (reac_volume < 0.5)) + if(!ishuman(exposed_mob) || (reac_volume < 0.5)) return - exposed_human.hair_color = "#9922ff" - exposed_human.facial_hair_color = "#9922ff" + + var/mob/living/carbon/human/exposed_human = exposed_mob + exposed_human.hair_color = "#CC22FF" + exposed_human.facial_hair_color = "#CC22FF" exposed_human.update_body_parts() -/datum/reagent/medicine/polypyr/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5 * REM * delta_time) - ..() +/datum/reagent/medicine/regen_jelly/affect_blood(mob/living/carbon/C, removed) + C.adjustBruteLoss(-1.5 * removed, 0) + C.adjustFireLoss(-1.5 * removed, 0) + C.adjustOxyLoss(-1.5 * removed, 0) + C.adjustToxLoss(-1.5 * removed, 0, TRUE) //heals TOXINLOVERs . = TRUE -/datum/reagent/medicine/granibitaluri - name = "Granibitaluri" //achieve "GRANular" amounts of C2 - description = "A mild painkiller useful as an additive alongside more potent medicines. Speeds up the healing of small wounds and burns, but is ineffective at treating severe injuries. Extremely large doses are toxic, and may eventually cause liver failure." - color = "#E0E0E0" +/datum/reagent/medicine/regen_jelly/affect_touch(mob/living/carbon/C, removed) + return affect_blood(C, removed) + +/datum/reagent/medicine/diphenhydramine + name = "Diphenhydramine" + description = "Rapidly purges the body of histamine and reduces jitteriness. Slight chance of causing drowsiness." reagent_state = LIQUID - overdose_threshold = 50 - metabolization_rate = 0.5 * REAGENTS_METABOLISM //same as C2s - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/granibitaluri/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/healamount = max(0.5 - round(0.01 * (M.getBruteLoss() + M.getFireLoss()), 0.1), 0) //base of 0.5 healing per cycle and loses 0.1 healing for every 10 combined brute/burn damage you have - M.adjustBruteLoss(-healamount * REM * delta_time, 0) - M.adjustFireLoss(-healamount * REM * delta_time, 0) - ..() - . = TRUE + color = "#64FFE6" + metabolization_rate = 0.1 -/datum/reagent/medicine/granibitaluri/overdose_process(mob/living/M, delta_time, times_fired) - . = TRUE - M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.2 * REM * delta_time) - M.adjustToxLoss(0.2 * REM * delta_time, FALSE) //Only really deadly if you eat over 100u - ..() +/datum/reagent/medicine/diphenhydramine/affect_blood(mob/living/carbon/C, removed) + if(prob(10)) + C.adjust_drowsyness(1) + C.adjust_timed_status_effect(-2 SECONDS * removed, /datum/status_effect/jitter) + holder.remove_reagent(/datum/reagent/toxin/histamine, 10 * removed) -// helps bleeding wounds clot faster -/datum/reagent/medicine/coagulant - name = "Sanguirite" - description = "A proprietary coagulant used to help bleeding wounds clot faster." - reagent_state = LIQUID - color = "#bb2424" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - overdose_threshold = 20 - /// The bloodiest wound that the patient has will have its blood_flow reduced by about half this much each second - var/clot_rate = 0.3 - /// While this reagent is in our bloodstream, we reduce all bleeding by this factor - var/passive_bleed_modifier = 0.7 - /// For tracking when we tell the person we're no longer bleeding - var/was_working - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) - return ..() +/datum/reagent/medicine/inacusiate + name = "Inacusiate" + description = "Rapidly repairs damage to the patient's ears to cure deafness, assuming the source of said deafness isn't from genetic mutations, chronic deafness, or a total defecit of ears." //by "chronic" deafness, we mean people with the "deaf" quirk + color = "#606060" // ditto -/datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/coagulant) - return ..() -/datum/reagent/medicine/coagulant/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/medicine/inacusiate/on_mob_add(mob/living/owner, amount) . = ..() - if(!M.blood_volume) + RegisterSignal(owner, COMSIG_MOVABLE_HEAR, PROC_REF(owner_hear)) + +//Lets us hear whispers from far away! +/datum/reagent/medicine/inacusiate/proc/owner_hear(datum/source, message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods = list()) + SIGNAL_HANDLER + if(!isliving(holder.my_atom)) return + var/mob/living/owner = holder.my_atom + var/atom/movable/composer = holder.my_atom + if(message_mods[WHISPER_MODE]) + message = composer.compose_message(owner, message_language, message, , spans, message_mods) - for(var/obj/item/bodypart/BP as anything in M.bodyparts) - if(BP.bodypart_flags & BP_BLEEDING) - if(!prob(20)) - continue - for(var/datum/wound/W as anything in BP.wounds) - if(W.bleeding()) - W.bleed_timer = 0 - W.clamp_wound() - -/datum/reagent/medicine/coagulant/overdose_process(mob/living/M, delta_time, times_fired) +/datum/reagent/medicine/inacusiate/affect_blood(mob/living/carbon/C, removed) . = ..() - if(!M.blood_volume) + var/obj/item/organ/ears/ears = C.getorganslot(ORGAN_SLOT_EARS) + if(!ears) return + ears.adjustEarDamage(-4 * removed, -4 * removed) - if(DT_PROB(7.5, delta_time)) - M.losebreath += rand(2, 4) - M.adjustOxyLoss(rand(1, 3)) - if(prob(30)) - to_chat(M, span_danger("You can feel your blood clotting up in your veins!")) - else if(prob(10)) - to_chat(M, span_userdanger("You feel like your blood has stopped moving!")) - M.adjustOxyLoss(rand(3, 4)) - - if(prob(50)) - var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS) - our_lungs.applyOrganDamage(1) - else - var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART) - our_heart.applyOrganDamage(1) - -/datum/reagent/medicine/coagulant/on_mob_metabolize(mob/living/M) - if(!ishuman(M)) - return +/datum/reagent/medicine/inacusiate/on_mob_delete(mob/living/owner) + . = ..() + UnregisterSignal(owner, COMSIG_MOVABLE_HEAR) + +/datum/reagent/medicine/insulin + name = "Insulin" + description = "Increases sugar depletion rates." + reagent_state = LIQUID + color = "#FFFFF0" + metabolization_rate = 0.1 - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod *= passive_bleed_modifier +/datum/reagent/medicine/insulin/affect_blood(mob/living/carbon/C, removed) + holder.remove_reagent(/datum/reagent/consumable/sugar, 3 * removed) -/datum/reagent/medicine/coagulant/on_mob_end_metabolize(mob/living/M) - if(was_working) - to_chat(M, span_warning("The medicine thickening your blood loses its effect!")) - if(!ishuman(M)) - return +/datum/reagent/medicine/ipecac + name = "Ipecac" + description = "Rapidly induces vomitting to purge the stomach." + reagent_state = LIQUID + color = "#19C832" + metabolization_rate = 0.4 + ingest_met = 0.4 + taste_description = "acid" + + +/datum/reagent/medicine/ipecac/affect_ingest(mob/living/carbon/C, removed) + if(prob(15)) + C.vomit(harm = FALSE, force = TRUE, purge_ratio = (rand(15, 30)/100)) + return ..() + +/datum/reagent/medicine/ipecac/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(5 * removed, 0) + . = TRUE + +/datum/reagent/medicine/activated_charcoal + name = "Activated Charcoal" + description = "Helps the body purge reagents." + reagent_state = SOLID + color = "#252525" + metabolization_rate = 1 + +/datum/reagent/medicine/activated_charcoal/affect_blood(mob/living/carbon/C, removed) + for(var/datum/reagent/R in holder.reagent_list) + if(R.type == type) + continue + holder.remove_reagent(R.type, 8 * removed) - var/mob/living/carbon/human/blood_boy = M - blood_boy.physiology?.bleed_mod /= passive_bleed_modifier - -// i googled "natural coagulant" and a couple of results came up for banana peels, so after precisely 30 more seconds of research, i now dub grinding banana peels good for your blood -/datum/reagent/medicine/coagulant/banana_peel - name = "Pulped Banana Peel" - description = "Ancient Clown Lore says that pulped banana peels are good for your blood, but are you really going to take medical advice from a clown about bananas?" - color = "#50531a" // rgb: 175, 175, 0 - taste_description = "horribly stringy, bitter pulp" - glass_name = "glass of banana peel pulp" - glass_desc = "Ancient Clown Lore says that pulped banana peels are good for your blood, but are you really going to take medical advice from a clown about bananas?" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - clot_rate = 0.2 - passive_bleed_modifier = 0.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/medicine/coagulant/seraka_extract - name = "Seraka Extract" - description = "A deeply coloured oil present in small amounts in Seraka Mushrooms. Acts as an effective blood clotting agent, but has a low overdose threshold." - color = "#00767C" - taste_description = "intensely savoury bitterness" - glass_name = "glass of seraka extract" - glass_desc = "Deeply savoury, bitter, and makes your blood clot up in your veins. A great drink, all things considered." - metabolization_rate = 0.2 * REAGENTS_METABOLISM - clot_rate = 0.4 //slightly better than regular coagulant - passive_bleed_modifier = 0.5 - overdose_threshold = 10 //but easier to overdose on + if(prob(3)) + C.vomit(50, FALSE, FALSE, 1, purge_ratio = 0.2) diff --git a/code/modules/reagents/chemistry/reagents/mutation_toxins.dm b/code/modules/reagents/chemistry/reagents/mutation_toxins.dm new file mode 100644 index 000000000000..ab73e73957dc --- /dev/null +++ b/code/modules/reagents/chemistry/reagents/mutation_toxins.dm @@ -0,0 +1,162 @@ +#define MUT_MSG_IMMEDIATE 1 +#define MUT_MSG_EXTENDED 2 +#define MUT_MSG_ABOUT2TURN 3 + +/datum/reagent/mutationtoxin + name = "Stable Mutation Toxin" + description = "A humanizing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + metabolization_rate = 0.1 //metabolizes to prevent micro-dosage + taste_description = "slime" + chemical_flags = REAGENT_IGNORE_MOB_SIZE | REAGENT_SPECIAL + var/race = /datum/species/human + var/list/mutationtexts = list( "You don't feel very well." = MUT_MSG_IMMEDIATE, + "Your skin feels a bit abnormal." = MUT_MSG_IMMEDIATE, + "Your limbs begin to take on a different shape." = MUT_MSG_EXTENDED, + "Your appendages begin morphing." = MUT_MSG_EXTENDED, + "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) + var/cycles_to_turn = 20 //the current_cycle threshold / iterations needed before one can transform + +/datum/reagent/mutationtoxin/affect_blood(mob/living/carbon/human/H, removed) + if(!istype(H)) + return + if(!(H.dna?.species) || !(H.mob_biotypes & MOB_ORGANIC)) + return + + if(prob(10)) + var/list/pick_ur_fav = list() + var/filter = NONE + if(current_cycle <= (cycles_to_turn*0.3)) + filter = MUT_MSG_IMMEDIATE + else if(current_cycle <= (cycles_to_turn*0.8)) + filter = MUT_MSG_EXTENDED + else + filter = MUT_MSG_ABOUT2TURN + + for(var/i in mutationtexts) + if(mutationtexts[i] == filter) + pick_ur_fav += i + to_chat(H, span_warning("[pick(pick_ur_fav)]")) + + if(current_cycle >= cycles_to_turn) + var/datum/species/species_type = race + H.set_species(species_type) + holder.del_reagent(type) + to_chat(H, span_warning("You've become \a [lowertext(initial(species_type.name))]!")) + return + +/datum/reagent/mutationtoxin/classic //The one from plasma on green slimes + name = "Mutation Toxin" + description = "A corruptive toxin." + color = "#13BC5E" // rgb: 19, 188, 94 + race = /datum/species/jelly/slime + + +/datum/reagent/mutationtoxin/lizard + name = "Jinan Mutation Toxin" + description = "A lizarding toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/lizard + taste_description = "dragon's breath but not as cool" + + +/datum/reagent/mutationtoxin/fly + name = "Fly Mutation Toxin" + description = "An insectifying toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/fly + taste_description = "trash" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/moth + name = "Gamuioda Mutation Toxin" + description = "A glowing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/moth + taste_description = "clothing" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/pod + name = "Podperson Mutation Toxin" + description = "A vegetalizing toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/pod + taste_description = "flowers" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/jelly + name = "Imperfect Mutation Toxin" + description = "A jellyfying toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/jelly + taste_description = "grandma's gelatin" + + +/datum/reagent/mutationtoxin/jelly/affect_blood(mob/living/carbon/human/H, removed) + . = ..() + if(isjellyperson(H)) + to_chat(H, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) + var/species_type = pick(subtypesof(/datum/species/jelly)) + H.set_species(species_type) + holder.del_reagent(type) + return TRUE + if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly + var/datum/species/species_type = pick(subtypesof(race)) + H.set_species(species_type) + holder.del_reagent(type) + to_chat(H, span_warning("You've become \a [initial(species_type.name)]!")) + return TRUE + +/datum/reagent/mutationtoxin/abductor + name = "Abductor Mutation Toxin" + description = "An alien toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/abductor + taste_description = "something out of this world... no, universe!" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/android + name = "Android Mutation Toxin" + description = "A robotic toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/android + taste_description = "circuitry and steel" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +//BLACKLISTED RACES +/datum/reagent/mutationtoxin/skeleton + name = "Skeleton Mutation Toxin" + description = "A scary toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/skeleton + taste_description = "milk... and lots of it" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/zombie + name = "Zombie Mutation Toxin" + description = "An undead toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past. + taste_description = "brai...nothing in particular" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +//DANGEROUS RACES +/datum/reagent/mutationtoxin/shadow + name = "Shadow Mutation Toxin" + description = "A dark toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/shadow + taste_description = "the night" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/mutationtoxin/plasma + name = "Plasma Mutation Toxin" + description = "A plasma-based toxin." + color = "#5EFF3B" //RGB: 94, 255, 59 + race = /datum/species/plasmaman + taste_description = "plasma" + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +#undef MUT_MSG_IMMEDIATE +#undef MUT_MSG_EXTENDED +#undef MUT_MSG_ABOUT2TURN diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index cfc7f6a396f0..064f8e1eca8b 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1,162 +1,3 @@ -/datum/reagent/blood - 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" - description = "A suspension of organic cells necessary for the transport of oxygen. Keep inside at all times." - color = "#C80000" // rgb: 200, 0, 0 - metabolization_rate = 12.5 * REAGENTS_METABOLISM //fast rate so it disappears fast. - taste_description = "iron" - taste_mult = 1.3 - glass_icon_state = "glass_red" - glass_name = "glass of tomato juice" - glass_desc = "Are you sure this is tomato juice?" - shot_glass_icon_state = "shotglassred" - penetrates_skin = NONE - ph = 7.4 - - // FEED ME -/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) - . = ..() - if(chems.has_reagent(type, 1)) - mytray.adjust_pestlevel(rand(2,3)) - -/datum/reagent/blood/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) - . = ..() - if(data && data["viruses"]) - for(var/thing in data["viruses"]) - var/datum/disease/strain = thing - - if((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) - continue - - if(methods & (INJECT|INGEST|PATCH)) - exposed_mob.ForceContractDisease(strain) - else if((methods & (TOUCH|VAPOR)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) - exposed_mob.ContactContractDisease(strain) - - if(iscarbon(exposed_mob)) - var/mob/living/carbon/exposed_carbon = exposed_mob - if(exposed_carbon.get_blood_id() == /datum/reagent/blood && ((methods & INJECT) || ((methods & INGEST) && exposed_carbon.dna && exposed_carbon.dna.species && (DRINKSBLOOD in exposed_carbon.dna.species.species_traits)))) - if(!data || !(data["blood_type"] in get_safe_blood(exposed_carbon.dna.blood_type))) - exposed_carbon.reagents.add_reagent(/datum/reagent/toxin, reac_volume * 0.5) - else - exposed_carbon.blood_volume = min(exposed_carbon.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM) - - -/datum/reagent/blood/on_new(list/data) - . = ..() - if(istype(data)) - SetViruses(src, data) - -/datum/reagent/blood/on_merge(list/mix_data) - if(data && mix_data) - if(data["blood_DNA"] != mix_data["blood_DNA"]) - data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. - if(data["viruses"] || mix_data["viruses"]) - - var/list/mix1 = data["viruses"] - var/list/mix2 = mix_data["viruses"] - - // Stop issues with the list changing during mixing. - var/list/to_mix = list() - - for(var/datum/disease/advance/AD in mix1) - to_mix += AD - for(var/datum/disease/advance/AD in mix2) - to_mix += AD - - var/datum/disease/advance/AD = Advance_Mix(to_mix) - if(AD) - var/list/preserve = list(AD) - for(var/D in data["viruses"]) - if(!istype(D, /datum/disease/advance)) - preserve += D - data["viruses"] = preserve - return 1 - -/datum/reagent/blood/proc/get_diseases() - . = list() - if(data && data["viruses"]) - for(var/thing in data["viruses"]) - var/datum/disease/D = thing - . += D - -/datum/reagent/blood/expose_turf(turf/exposed_turf, reac_volume)//splash the blood all over the place - . = ..() - if(!istype(exposed_turf)) - return - if(reac_volume < 3) - return - - var/obj/effect/decal/cleanable/blood/bloodsplatter = locate() in exposed_turf //find some blood here - if(!bloodsplatter) - bloodsplatter = new(exposed_turf, data["viruses"]) - else if(LAZYLEN(data["viruses"])) - var/list/viri_to_add = list() - for(var/datum/disease/virus in data["viruses"]) - if(virus.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) - viri_to_add += virus - if(LAZYLEN(viri_to_add)) - bloodsplatter.AddComponent(/datum/component/infective, viri_to_add) - if(data["blood_DNA"]) - bloodsplatter.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) - -/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) - . = ..() - mytray.adjust_pestlevel(rand(2,3)) - -/datum/reagent/liquidgibs - name = "Liquid Gibs" - color = "#CC4633" - description = "You don't even want to think about what's in here." - taste_description = "gross iron" - shot_glass_icon_state = "shotglassred" - material = /datum/material/meat - ph = 7.45 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/bone_dust - name = "Bone Dust" - color = "#dbcdcb" - description = "Ground up bones, gross!" - taste_description = "the most disgusting grain in existence" - -/datum/reagent/vaccine - //data must contain virus type - name = "Vaccine" - description = "A suspension of degraded viral material suitable for use in inoculation." - color = "#C81040" // rgb: 200, 16, 64 - taste_description = "slime" - penetrates_skin = NONE - -/datum/reagent/vaccine/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) - . = ..() - if(!islist(data) || !(methods & (INGEST|INJECT))) - return - - for(var/thing in exposed_mob.diseases) - var/datum/disease/infection = thing - if(infection.GetDiseaseID() in data) - infection.cure() - LAZYOR(exposed_mob.disease_resistances, data) - -/datum/reagent/vaccine/on_merge(list/data) - if(istype(data)) - src.data |= data.Copy() - -/datum/reagent/vaccine/fungal_tb - name = "Vaccine (Fungal Tuberculosis)" - description = "A suspension of degraded viral material suitable for use in inoculation. Taggants suspended in the solution report it to be targeting Fungal Tuberculosis." - -/datum/reagent/vaccine/fungal_tb/New(data) - . = ..() - var/list/cached_data - if(!data) - cached_data = list() - else - cached_data = data - cached_data |= "[/datum/disease/tuberculosis]" - src.data = cached_data - /datum/reagent/water name = "Water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen." @@ -166,11 +7,10 @@ glass_name = "glass of water" glass_desc = "The father of all refreshments." shot_glass_icon_state = "shotglassclear" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS + chemical_flags = REAGENT_CLEANS -/* - * Water reaction to turf - */ + metabolization_rate = 2 + ingest_met = 2 /datum/reagent/water/expose_turf(turf/open/exposed_turf, reac_volume, exposed_temperature) . = ..() @@ -183,7 +23,7 @@ for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) exposed_slime.apply_water() - qdel(exposed_turf.fire) + qdel(exposed_turf.active_hotspot) if(exposed_turf.simulated) var/datum/gas_mixture/air = exposed_turf.return_air() var/adjust_temp = abs(air.temperature - exposed_temperature) / air.group_multiplier @@ -191,11 +31,7 @@ adjust_temp *= -1 air.temperature = max(air.temperature + adjust_temp, TCMB) -/* - * Water reaction to an object - */ - -/datum/reagent/water/expose_obj(obj/exposed_obj, reac_volume) +/datum/reagent/water/expose_obj(obj/exposed_obj, reac_volume, exposed_temperature) . = ..() exposed_obj.extinguish() exposed_obj.wash(CLEAN_TYPE_ACID) @@ -214,25 +50,36 @@ new /obj/item/stack/sheet/wethide(get_turf(HH), HH.amount) qdel(HH) +/// How many wet stacks you get per units of water when it's applied by touch. +#define WATER_TO_WET_STACKS_FACTOR_TOUCH 0.5 +/// How many wet stacks you get per unit of water when it's applied by vapor. Much less effective than by touch, of course. +#define WATER_TO_WET_STACKS_FACTOR_VAPOR 0.1 /* * Water reaction to a mob */ - -/datum/reagent/water/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with water can help put them out! +/datum/reagent/water/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() if(methods & TOUCH) - exposed_mob.extinguish_mob() // extinguish removes all fire stacks - if(methods & VAPOR) - if(!isfelinid(exposed_mob)) - return - exposed_mob.incapacitate(1) // startles the felinid, canceling any do_after - SEND_SIGNAL(exposed_mob, COMSIG_ADD_MOOD_EVENT, "watersprayed", /datum/mood_event/watersprayed) + exposed_mob.adjust_wet_stacks(reac_volume * WATER_TO_WET_STACKS_FACTOR_TOUCH) // Water makes you wet, at a 50% water-to-wet-stacks ratio. Which, in turn, gives you some mild protection from being set on fire! + if(ishuman(exposed_mob)) + var/mob/living/carbon/human/H = exposed_mob + var/obj/item/clothing/mask/cigarette/S = H.wear_mask + if (istype(S) && S.lit) + var/obj/item/clothing/C = H.head + if (!istype(C) || !(C.flags_cover & HEADCOVERSMOUTH)) + S.extinguish() -/datum/reagent/water/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + if(methods & VAPOR) + exposed_mob.adjust_wet_stacks(reac_volume * WATER_TO_WET_STACKS_FACTOR_VAPOR) // Spraying someone with water with the hope to put them out is just simply too funny to me not to add it. + +/datum/reagent/water/affect_blood(mob/living/carbon/C, removed) . = ..() - if(M.blood_volume) - M.blood_volume += 0.1 * REM * delta_time // water is good for you! + if(C.blood_volume) + C.blood_volume += 0.05 * removed + +#undef WATER_TO_WET_STACKS_FACTOR_TOUCH +#undef WATER_TO_WET_STACKS_FACTOR_VAPOR ///For weird backwards situations where water manages to get added to trays nutrients, as opposed to being snowflaked away like usual. /datum/reagent/water/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) @@ -249,8 +96,10 @@ glass_name = "glass of holy water" glass_desc = "A glass of holy water." self_consuming = TRUE //divine intervention won't be limited by the lack of a liver - ph = 7.5 //God is alkaline - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS + chemical_flags = REAGENT_CLEANS | REAGENT_IGNORE_MOB_SIZE + touch_met = INFINITY + ingest_met = INFINITY + metabolization_rate = 1 // Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits. Also ALSO increases instability. /datum/reagent/water/holywater/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) @@ -260,1433 +109,293 @@ if(myseed) myseed.adjust_instability(round(chems.get_reagent_amount(type) * 0.15)) -/datum/reagent/water/holywater/on_mob_metabolize(mob/living/L) +/datum/reagent/water/holywater/on_mob_metabolize(mob/living/carbon/C, class) ..() - ADD_TRAIT(L, TRAIT_HOLY, type) + ADD_TRAIT(C, TRAIT_HOLY, CHEM_TRAIT_SOURCE(class)) /datum/reagent/water/holywater/on_mob_add(mob/living/L, amount) . = ..() if(data) data["misc"] = 0 -/datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_HOLY, type) +/datum/reagent/water/holywater/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_HOLY, CHEM_TRAIT_SOURCE(class)) ..() -/datum/reagent/water/holywater/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/water/holywater/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() if(IS_CULTIST(exposed_mob)) to_chat(exposed_mob, span_userdanger("A vile holiness begins to spread its shining tendrils through your mind, purging the Geometer of Blood's influence!")) -/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.blood_volume) - M.blood_volume += 0.1 * REM * delta_time // water is good for you! - if(!data) - data = list("misc" = 0) +/datum/reagent/water/holywater/affect_ingest(mob/living/carbon/C, removed) + SHOULD_CALL_PARENT(FALSE) //We're going straight into blood through jesus i guess + holder.trans_to(C.bloodstream, volume) - data["misc"] += delta_time SECONDS * REM - M.adjust_timed_status_effect(4 SECONDS * delta_time, /datum/status_effect/jitter, max_duration = 20 SECONDS) - if(IS_CULTIST(M)) - for(var/datum/action/innate/cult/blood_magic/BM in M.actions) - to_chat(M, span_cultlarge("Your blood rites falter as holy water scours your body!")) +/datum/reagent/water/holywater/affect_touch(mob/living/carbon/C, removed) + . = ..() + holder.trans_to(C.bloodstream, volume) + +/datum/reagent/water/holywater/affect_blood(mob/living/carbon/C, removed) + . = ..() + + C.adjust_timed_status_effect(1 SECONDS * removed, /datum/status_effect/jitter, max_duration = 20 SECONDS) + if(IS_CULTIST(C)) + for(var/datum/action/innate/cult/blood_magic/BM in C.actions) + to_chat(C, span_cultlarge("Your blood rites falter as holy water scours your body!")) for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) qdel(BS) - if(data["misc"] >= (25 SECONDS)) // 10 units - M.adjust_timed_status_effect(4 SECONDS * delta_time, /datum/status_effect/speech/stutter, max_duration = 20 SECONDS) - M.set_timed_status_effect(10 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - if(IS_CULTIST(M) && DT_PROB(10, delta_time)) - M.say(pick("Av'te Nar'Sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"), forced = "holy water") + if(current_cycle >= 10) + C.adjust_timed_status_effect(1 SECONDS * removed, /datum/status_effect/speech/stutter, max_duration = 20 SECONDS) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) + if(IS_CULTIST(C) && prob(5)) + spawn(-1) + C.say(pick("Av'te Nar'Sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"), forced = "holy water") if(prob(10)) - M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) - M.Unconscious(12 SECONDS) - to_chat(M, "[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \ + C.visible_message(span_danger("[C] starts having a seizure!"), span_userdanger("You have a seizure!")) + C.Unconscious(12 SECONDS) + to_chat(C, "[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \ "All that power, and you still fail?", "If you cannot scour this poison, I shall scour your meager life!")].") - if(data["misc"] >= (1 MINUTES)) // 24 units - if(IS_CULTIST(M)) - M.mind.remove_antag_datum(/datum/antagonist/cult) - M.Unconscious(100) - M.remove_status_effect(/datum/status_effect/jitter) - M.remove_status_effect(/datum/status_effect/speech/stutter) + + if(current_cycle >= 30) + if(IS_CULTIST(C)) + C.mind.remove_antag_datum(/datum/antagonist/cult) + C.Unconscious(10 SECONDS) + C.remove_status_effect(/datum/status_effect/jitter) + C.remove_status_effect(/datum/status_effect/speech/stutter) holder.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? return - holder.remove_reagent(type, 1 * REAGENTS_METABOLISM * delta_time) //fixed consumption to prevent balancing going out of whack -/datum/reagent/water/holywater/expose_turf(turf/exposed_turf, reac_volume) +/datum/reagent/water/holywater/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) . = ..() - if(!istype(exposed_turf)) - return - if(reac_volume>=10) + if(reac_volume >= 10) for(var/obj/effect/rune/R in exposed_turf) qdel(R) - exposed_turf.Bless() + exposed_turf.Bless() /datum/reagent/water/hollowwater name = "Hollow Water" description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow." color = "#88878777" taste_description = "emptyiness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/hydrogen_peroxide - name = "Hydrogen Peroxide" - description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen and oxygen." //intended intended - color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha) - taste_description = "burning water" - var/cooling_temperature = 2 - glass_icon_state = "glass_clear" - glass_name = "glass of oxygenated water" - glass_desc = "The father of all refreshments. Surely it tastes great, right?" - shot_glass_icon_state = "shotglassclear" - ph = 6.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/* - * Water reaction to turf - */ +/datum/reagent/blood + 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" + description = "A suspension of organic cells necessary for the transport of oxygen. Keep inside at all times." + color = "#C80000" // rgb: 200, 0, 0 + metabolization_rate = 5 //fast rate so it disappears fast. + taste_description = "iron" + taste_mult = 1.3 + glass_icon_state = "glass_red" + glass_name = "glass of tomato juice" + glass_desc = "Are you sure this is tomato juice?" + shot_glass_icon_state = "shotglassred" + penetrates_skin = NONE -/datum/reagent/hydrogen_peroxide/expose_turf(turf/open/exposed_turf, reac_volume) + // FEED ME +/datum/reagent/blood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() - if(!istype(exposed_turf)) - return - if(reac_volume >= 5) - exposed_turf.MakeSlippery(TURF_WET_WATER, 10 SECONDS, min(reac_volume*1.5 SECONDS, 60 SECONDS)) -/* - * Water reaction to a mob - */ + if(chems.has_reagent(type, 1)) + mytray.adjust_pestlevel(rand(2,3)) -/datum/reagent/hydrogen_peroxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with h2o2 can burn them ! +/datum/reagent/blood/expose_mob(mob/living/exposed_mob, exposed_temperature, reac_volume, methods, show_message, touch_protection) . = ..() - if(methods & TOUCH) - exposed_mob.adjustFireLoss(2, 0) // burns + if(data?["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/strain = thing -/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke - name = "Unholy Water" - description = "Something that shouldn't exist on this plane of existence." - taste_description = "suffering" - metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second - penetrates_skin = TOUCH|VAPOR - ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(IS_CULTIST(M)) - M.adjust_drowsyness(-5* REM * delta_time) - M.AdjustAllImmobility(-40 *REM* REM * delta_time) - M.stamina.adjust(10 * REM * delta_time) - M.adjustToxLoss(-2 * REM * delta_time, 0) - M.adjustOxyLoss(-2 * REM * delta_time, 0) - M.adjustBruteLoss(-2 * REM * delta_time, 0) - M.adjustFireLoss(-2 * REM * delta_time, 0) - if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 3 * REM * delta_time - else // Will deal about 90 damage when 50 units are thrown - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * delta_time, 150) - M.adjustToxLoss(1 * REM * delta_time, 0) - M.adjustFireLoss(1 * REM * delta_time, 0) - M.adjustOxyLoss(1 * REM * delta_time, 0) - M.adjustBruteLoss(1 * REM * delta_time, 0) - ..() + if((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) + continue -/datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god - name = "Hell Water" - description = "YOUR FLESH! IT BURNS!" - taste_description = "burning" - ph = 0.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_fire_stacks(min(M.fire_stacks + (1.5 * delta_time), 5)) - M.ignite_mob() //Only problem with igniting people is currently the commonly available fire suits make you immune to being on fire - M.adjustToxLoss(0.5*delta_time, 0) - M.adjustFireLoss(0.5*delta_time, 0) //Hence the other damages... ain't I a bastard? - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2.5*delta_time, 150) - holder.remove_reagent(type, 0.5*delta_time) - -/datum/reagent/medicine/omnizine/godblood - name = "Godblood" - description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power." - overdose_threshold = 150 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -///Used for clownery -/datum/reagent/lube - name = "Space Lube" - 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 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/lube/expose_turf(turf/open/exposed_turf, reac_volume) - . = ..() - if(!istype(exposed_turf)) - return - if(reac_volume >= 1) - exposed_turf.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 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/spraytan - name = "Spray Tan" - description = "A substance applied to the skin to darken the skin." - color = "#FFC080" // rgb: 255, 196, 128 Bright orange - metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose - overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle. - taste_description = "sour oranges" - ph = 5 - fallback_icon_state = "spraytan_fallback" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/spraytan/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE) - . = ..() - if(ishuman(exposed_mob)) - if(methods & (PATCH|VAPOR)) - var/mob/living/carbon/human/exposed_human = exposed_mob - if(exposed_human.dna.species.id == SPECIES_HUMAN) - switch(exposed_human.skin_tone) - if("african1") - exposed_human.skin_tone = "african2" - if("indian") - exposed_human.skin_tone = "african1" - if("arab") - exposed_human.skin_tone = "indian" - if("asian2") - exposed_human.skin_tone = "arab" - if("asian1") - exposed_human.skin_tone = "asian2" - if("mediterranean") - exposed_human.skin_tone = "african1" - if("latino") - exposed_human.skin_tone = "mediterranean" - if("caucasian3") - exposed_human.skin_tone = "mediterranean" - if("caucasian2") - exposed_human.skin_tone = pick("caucasian3", "latino") - if("caucasian1") - exposed_human.skin_tone = "caucasian2" - if ("albino") - exposed_human.skin_tone = "caucasian1" - - if(MUTCOLORS in exposed_human.dna.species.species_traits) //take current alien color and darken it slightly - var/newcolor = "" - var/string = exposed_human.dna.mutant_colors[MUTCOLORS_GENERIC_1] - var/len = length(string) - var/char = "" - var/ascii = 0 - for(var/i=1, i<=len, i += length(char)) - char = string[i] - ascii = text2ascii(char) - switch(ascii) - if(48) - newcolor += "0" - if(49 to 57) - newcolor += ascii2text(ascii-1) //numbers 1 to 9 - if(97) - newcolor += "9" - if(98 to 102) - newcolor += ascii2text(ascii-1) //letters b to f lowercase - if(65) - newcolor += "9" - if(66 to 70) - newcolor += ascii2text(ascii+31) //letters B to F - translates to lowercase - else - break - if(ReadHSV(newcolor)[3] >= ReadHSV("#7F7F7F")[3]) - exposed_human.dna.mutant_colors[MUTCOLORS_GENERIC_1] = newcolor - exposed_human.update_body(is_creating = TRUE) - - if((methods & INGEST) && show_message) - to_chat(exposed_mob, span_notice("That tasted horrible.")) - - -/datum/reagent/spraytan/overdose_process(mob/living/M, delta_time, times_fired) - metabolization_rate = 1 * REAGENTS_METABOLISM - - if(ishuman(M)) - var/mob/living/carbon/human/N = M - if(!HAS_TRAIT(N, TRAIT_BALD)) - N.hairstyle = "Spiky" - N.facial_hairstyle = "Shaved" - N.facial_hair_color = "#000000" - N.hair_color = "#000000" - if(N.dna.species.use_skintones) - N.skin_tone = "orange" - else if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange - N.dna.mutant_colors[MUTCOLORS_GENERIC_1] = "#ff8800" - N.update_body(is_creating = TRUE) - if(DT_PROB(3.5, delta_time)) - if(N.w_uniform) - M.visible_message(pick("[M]'s collar pops up without warning.", "[M] flexes [M.p_their()] arms.")) - else - M.visible_message("[M] flexes [M.p_their()] arms.") - if(DT_PROB(5, delta_time)) - M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don???t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = /datum/reagent/spraytan) - ..() - return + if((methods & (TOUCH|VAPOR)) && (strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS)) + exposed_mob.ContactContractDisease(strain) -#define MUT_MSG_IMMEDIATE 1 -#define MUT_MSG_EXTENDED 2 -#define MUT_MSG_ABOUT2TURN 3 -/datum/reagent/mutationtoxin - name = "Stable Mutation Toxin" - description = "A humanizing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - metabolization_rate = 0.5 * REAGENTS_METABOLISM //metabolizes to prevent micro-dosage - taste_description = "slime" - var/race = /datum/species/human - var/list/mutationtexts = list( "You don't feel very well." = MUT_MSG_IMMEDIATE, - "Your skin feels a bit abnormal." = MUT_MSG_IMMEDIATE, - "Your limbs begin to take on a different shape." = MUT_MSG_EXTENDED, - "Your appendages begin morphing." = MUT_MSG_EXTENDED, - "You feel as though you're about to change at any moment!" = MUT_MSG_ABOUT2TURN) - var/cycles_to_turn = 20 //the current_cycle threshold / iterations needed before one can transform - -/datum/reagent/mutationtoxin/on_mob_life(mob/living/carbon/human/H, delta_time, times_fired) - . = TRUE - if(!istype(H)) +/datum/reagent/blood/affect_blood(mob/living/carbon/C, removed) + if(isnull(data)) return - if(!(H.dna?.species) || !(H.mob_biotypes & MOB_ORGANIC)) - return - - if(DT_PROB(5, delta_time)) - var/list/pick_ur_fav = list() - var/filter = NONE - if(current_cycle <= (cycles_to_turn*0.3)) - filter = MUT_MSG_IMMEDIATE - else if(current_cycle <= (cycles_to_turn*0.8)) - filter = MUT_MSG_EXTENDED - else - filter = MUT_MSG_ABOUT2TURN - - for(var/i in mutationtexts) - if(mutationtexts[i] == filter) - pick_ur_fav += i - to_chat(H, span_warning("[pick(pick_ur_fav)]")) - if(current_cycle >= cycles_to_turn) - var/datum/species/species_type = race - H.set_species(species_type) - holder.del_reagent(type) - to_chat(H, span_warning("You've become \a [lowertext(initial(species_type.name))]!")) - return - ..() + if(data["viruses"]) + for(var/datum/disease/strain as anything in data["viruses"]) -/datum/reagent/mutationtoxin/classic //The one from plasma on green slimes - name = "Mutation Toxin" - description = "A corruptive toxin." - color = "#13BC5E" // rgb: 19, 188, 94 - race = /datum/species/jelly/slime - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + if((strain.spread_flags & (DISEASE_SPREAD_SPECIAL|DISEASE_SPREAD_NON_CONTAGIOUS))) + continue -/datum/reagent/mutationtoxin/felinid - name = "Felinid Mutation Toxin" - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/human/felinid - taste_description = "something nyat good" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + C.ForceContractDisease(strain) -/datum/reagent/mutationtoxin/lizard - name = "Unathi Mutation Toxin" - description = "A lizarding toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/lizard - taste_description = "dragon's breath but not as cool" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + if(!(C.get_blood_id() == /datum/reagent/blood)) + return -/datum/reagent/mutationtoxin/fly - name = "Fly Mutation Toxin" - description = "An insectifying toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/fly - taste_description = "trash" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + var/datum/blood/blood_type = data["blood_type"] -/datum/reagent/mutationtoxin/moth - name = "Gamuioda Mutation Toxin" - description = "A glowing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/moth - taste_description = "clothing" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + if(isnull(blood_type) || !C.dna.blood_type.is_compatible(blood_type.type)) + C.reagents.add_reagent(/datum/reagent/toxin, removed) + else + C.adjustBloodVolume(round(removed, 0.1)) -/datum/reagent/mutationtoxin/pod - name = "Podperson Mutation Toxin" - description = "A vegetalizing toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/pod - taste_description = "flowers" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE +/datum/reagent/blood/affect_touch(mob/living/carbon/C, removed) + for(var/datum/disease/strain as anything in data?["viruses"]) -/datum/reagent/mutationtoxin/jelly - name = "Imperfect Mutation Toxin" - description = "A jellyfying toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/jelly - taste_description = "grandma's gelatin" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/mutationtoxin/jelly/on_mob_life(mob/living/carbon/human/H, delta_time, times_fired) - if(isjellyperson(H)) - to_chat(H, span_warning("Your jelly shifts and morphs, turning you into another subspecies!")) - var/species_type = pick(subtypesof(/datum/species/jelly)) - H.set_species(species_type) - holder.del_reagent(type) - return TRUE - if(current_cycle >= cycles_to_turn) //overwrite since we want subtypes of jelly - var/datum/species/species_type = pick(subtypesof(race)) - H.set_species(species_type) - holder.del_reagent(type) - to_chat(H, span_warning("You've become \a [initial(species_type.name)]!")) - return TRUE - return ..() + if((strain.spread_flags & DISEASE_SPREAD_SPECIAL) || (strain.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) + continue -/datum/reagent/mutationtoxin/golem - name = "Golem Mutation Toxin" - description = "A crystal toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/golem - taste_description = "rocks" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/mutationtoxin/golem/on_mob_metabolize() - var/static/list/random_golem_types - random_golem_types = subtypesof(/datum/species/golem) - type - for(var/i in random_golem_types) - var/datum/species/golem/golem = i - if(!initial(golem.random_eligible)) - random_golem_types -= golem - race = pick(random_golem_types) - ..() + if(strain.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) + C.ContactContractDisease(strain) -/datum/reagent/mutationtoxin/abductor - name = "Abductor Mutation Toxin" - description = "An alien toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/abductor - taste_description = "something out of this world... no, universe!" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE +/datum/reagent/blood/on_new(list/data) + . = ..() + if(istype(data)) + SetViruses(src, data) -/datum/reagent/mutationtoxin/android - name = "Android Mutation Toxin" - description = "A robotic toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/android - taste_description = "circuitry and steel" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -//BLACKLISTED RACES -/datum/reagent/mutationtoxin/skeleton - name = "Skeleton Mutation Toxin" - description = "A scary toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/skeleton - taste_description = "milk... and lots of it" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE +/datum/reagent/blood/on_merge(list/mix_data) + if(data && mix_data) + if(data["blood_type"] != mix_data["blood_type"]) + data["blood_type"] = GET_BLOOD_REF(/datum/blood/slurry) + if(data["blood_DNA"] != mix_data["blood_DNA"]) + data["cloneable"] = 0 //On mix, consider the genetic sampling unviable for pod cloning if the DNA sample doesn't match. -/datum/reagent/mutationtoxin/zombie - name = "Zombie Mutation Toxin" - description = "An undead toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past. - taste_description = "brai...nothing in particular" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + if(data["viruses"] || mix_data["viruses"]) -/datum/reagent/mutationtoxin/ash - name = "Ash Mutation Toxin" - description = "An ashen toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/lizard/ashwalker - taste_description = "savagery" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -//DANGEROUS RACES -/datum/reagent/mutationtoxin/shadow - name = "Shadow Mutation Toxin" - description = "A dark toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/shadow - taste_description = "the night" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + var/list/mix1 = data["viruses"] + var/list/mix2 = mix_data["viruses"] -/datum/reagent/mutationtoxin/plasma - name = "Plasma Mutation Toxin" - description = "A plasma-based toxin." - color = "#5EFF3B" //RGB: 94, 255, 59 - race = /datum/species/plasmaman - taste_description = "plasma" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + // Stop issues with the list changing during mixing. + var/list/to_mix = list() -#undef MUT_MSG_IMMEDIATE -#undef MUT_MSG_EXTENDED -#undef MUT_MSG_ABOUT2TURN + for(var/datum/disease/advance/AD in mix1) + to_mix += AD + for(var/datum/disease/advance/AD in mix2) + to_mix += AD -/datum/reagent/mulligan - name = "Mulligan Toxin" - description = "This toxin will rapidly change the DNA of human beings. Commonly used by Syndicate spies and assassins in need of an emergency ID change." - color = "#5EFF3B" //RGB: 94, 255, 59 - metabolization_rate = INFINITY - taste_description = "slime" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/mulligan/on_mob_life(mob/living/carbon/human/H, delta_time, times_fired) - ..() - if (!istype(H)) - return - to_chat(H, span_warning("You grit your teeth in pain as your body rapidly mutates!")) - H.visible_message("[H] suddenly transforms!") - randomize_human(H) - H.dna.update_dna_identity() - -/datum/reagent/aslimetoxin - name = "Advanced Mutation Toxin" - description = "An advanced corruptive toxin produced by slimes." - color = "#13BC5E" // rgb: 19, 188, 94 - taste_description = "slime" - penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/aslimetoxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) - . = ..() - if(methods & ~TOUCH) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) - -/datum/reagent/gluttonytoxin - name = "Gluttony's Blessing" - description = "An advanced corruptive toxin produced by something terrible." - color = "#5EFF3B" //RGB: 94, 255, 59 - taste_description = "decay" - penetrates_skin = NONE - -/datum/reagent/gluttonytoxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) - . = ..() - if(reac_volume >= 1)//This prevents microdosing from infecting masses of people - exposed_mob.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE) - -/datum/reagent/serotrotium - name = "Serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - color = "#202040" // rgb: 20, 20, 40 - metabolization_rate = 0.25 * REAGENTS_METABOLISM - taste_description = "bitterness" - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/serotrotium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(ishuman(M)) - if(DT_PROB(3.5, delta_time)) - M.emote(pick("twitch","drool","moan","gasp")) - ..() - -/datum/reagent/oxygen - name = "Oxygen" - description = "A colorless, odorless gas. Grows on trees but is still pretty valuable." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - taste_mult = 0 // oderless and tasteless - ph = 9.2//It's acutally a huge range and very dependant on the chemistry but ph is basically a made up var in it's implementation anyways - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - -/datum/reagent/oxygen/expose_turf(turf/open/exposed_turf, reac_volume) - . = ..() - if(istype(exposed_turf)) - var/temp = holder ? holder.chem_temp : T20C - exposed_turf.atmos_spawn_air(GAS_OXYGEN, reac_volume/20, temp) - return - -/datum/reagent/copper - name = "Copper" - description = "A highly ductile metal. Things made out of copper aren't very durable, but it makes a decent material for electrical wiring." - reagent_state = SOLID - color = "#6E3B08" // rgb: 110, 59, 8 - taste_description = "metal" - ph = 5.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/copper/expose_obj(obj/exposed_obj, reac_volume) - . = ..() - if(!istype(exposed_obj, /obj/item/stack/sheet/iron)) - return - - var/obj/item/stack/sheet/iron/M = exposed_obj - reac_volume = min(reac_volume, M.amount) - new/obj/item/stack/sheet/bronze(get_turf(M), reac_volume) - M.use(reac_volume) - -/datum/reagent/nitrogen - name = "Nitrogen" - description = "A colorless, odorless, tasteless gas. A simple asphyxiant that can silently displace vital oxygen." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - taste_mult = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/nitrogen/expose_turf(turf/open/exposed_turf, reac_volume) - if(istype(exposed_turf)) - var/temp = holder ? holder.chem_temp : T20C - exposed_turf.atmos_spawn_air(GAS_NITROGEN, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) - return ..() - -/datum/reagent/hydrogen - name = "Hydrogen" - description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - taste_mult = 0 - ph = 0.1//Now I'm stuck in a trap of my own design. Maybe I should make -ve phes? (not 0 so I don't get div/0 errors) - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/potassium - name = "Potassium" - description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." - reagent_state = SOLID - color = "#A0A0A0" // rgb: 160, 160, 160 - taste_description = "sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/mercury - name = "Mercury" - description = "A curious metal that's a liquid at room temperature. Neurodegenerative and very bad for the mind." - color = "#484848" // rgb: 72, 72, 72A - taste_mult = 0 // apparently tasteless. - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/mercury/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(!HAS_TRAIT(src, TRAIT_IMMOBILIZED) && !isspaceturf(M.loc)) - step(M, pick(GLOB.cardinals)) - if(DT_PROB(3.5, delta_time)) - M.emote(pick("twitch","drool","moan")) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5*delta_time) - ..() - -/datum/reagent/sulfur - name = "Sulfur" - description = "A sickly yellow solid mostly known for its nasty smell. It's actually much more helpful than it looks in biochemisty." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - taste_description = "rotten eggs" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carbon - name = "Carbon" - description = "A crumbly black solid that, while unexciting on a physical level, forms the base of all known life. Kind of a big deal." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - taste_description = "sour chalk" - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carbon/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(isspaceturf(exposed_turf)) - return - - var/obj/effect/decal/cleanable/dirt/dirt_decal = (locate() in exposed_turf.contents) - if(!dirt_decal) - dirt_decal = new(exposed_turf) - -/datum/reagent/chlorine - name = "Chlorine" - description = "A pale yellow gas that's well known as an oxidizer. While it forms many harmless molecules in its elemental form it is far from harmless." - reagent_state = GAS - color = "#FFFB89" //pale yellow? let's make it light gray - taste_description = "chlorine" - ph = 7.4 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - -// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial -/datum/reagent/chlorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) - mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 1.5)) - mytray.adjust_waterlevel(-round(chems.get_reagent_amount(src.type) * 0.5)) - mytray.adjust_weedlevel(-rand(1,3)) - // White Phosphorous + water -> phosphoric acid. That's not a good thing really. - - -/datum/reagent/chlorine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(3*REM*delta_time) - . = TRUE - ..() - -/datum/reagent/fluorine - name = "Fluorine" - description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest." - reagent_state = GAS - color = "#808080" // rgb: 128, 128, 128 - taste_description = "acid" - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -// You're an idiot for thinking that one of the most corrosive and deadly gasses would be beneficial -/datum/reagent/fluorine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 2)) - mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 2.5)) - mytray.adjust_waterlevel(-round(chems.get_reagent_amount(src.type) * 0.5)) - mytray.adjust_weedlevel(-rand(1,4)) - -/datum/reagent/fluorine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(0.5*REM*delta_time, 0) - . = TRUE - ..() - -/datum/reagent/sodium - name = "Sodium" - description = "A soft silver metal that can easily be cut with a knife. It's not salt just yet, so refrain from putting it on your chips." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - taste_description = "salty metal" - ph = 11.6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/phosphorus - name = "Phosphorus" - description = "A ruddy red powder that burns readily. Though it comes in many colors, the general theme is always the same." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - taste_description = "vinegar" - ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -// Phosphoric salts are beneficial though. And even if the plant suffers, in the long run the tray gets some nutrients. The benefit isn't worth that much. -/datum/reagent/phosphorus/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 0.75)) - mytray.adjust_waterlevel(-round(chems.get_reagent_amount(src.type) * 0.5)) - mytray.adjust_weedlevel(-rand(1,2)) - -/datum/reagent/lithium - name = "Lithium" - description = "A silver metal, its claim to fame is its remarkably low density. Using it is a bit too effective in calming oneself down." - reagent_state = SOLID - color = "#808080" // rgb: 128, 128, 128 - taste_description = "metal" - ph = 11.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/lithium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(!HAS_TRAIT(M, TRAIT_IMMOBILIZED) && !isspaceturf(M.loc) && isturf(M.loc)) - step(M, pick(GLOB.cardinals)) - if(DT_PROB(2.5, delta_time)) - M.emote(pick("twitch","drool","moan")) - ..() - -/datum/reagent/glycerol - name = "Glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." - color = "#D3B913" - taste_description = "sweetness" - ph = 9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/space_cleaner/sterilizine - name = "Sterilizine" - description = "Sterilizes wounds in preparation for surgery." - color = "#D0EFEE" // space cleaner but lighter - taste_description = "bitterness" - ph = 10.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/space_cleaner/sterilizine/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) - . = ..() - if(!(methods & (TOUCH|VAPOR|PATCH))) - return - - for(var/s in exposed_carbon.surgeries) - var/datum/surgery/surgery = s - surgery.speed_modifier = max(0.2, surgery.speed_modifier) - -/datum/reagent/iron - name = "Iron" - description = "Pure iron is a metal." - reagent_state = SOLID - taste_description = "iron" - material = /datum/material/iron - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - color = "#606060" //pure iron? let's make it violet of course - ph = 6 - -/datum/reagent/iron/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - if(C.blood_volume < BLOOD_VOLUME_NORMAL) - C.blood_volume += 0.25 * delta_time - ..() - -/datum/reagent/gold - name = "Gold" - description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." - reagent_state = SOLID - color = "#F7C430" // rgb: 247, 196, 48 - taste_description = "expensive metal" - material = /datum/material/gold - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/datum/disease/advance/AD = Advance_Mix(to_mix) + if(AD) + var/list/preserve = list(AD) + for(var/D in data["viruses"]) + if(!istype(D, /datum/disease/advance)) + preserve += D + data["viruses"] = preserve + return 1 -/datum/reagent/silver - name = "Silver" - description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." - reagent_state = SOLID - color = "#D0D0D0" // rgb: 208, 208, 208 - taste_description = "expensive yet reasonable metal" - material = /datum/material/silver - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/uranium - name ="Uranium" - description = "A jade-green metallic chemical element in the actinide series, weakly radioactive." - reagent_state = SOLID - color = "#5E9964" //this used to be silver, but liquid uranium can still be green and it's more easily noticeable as uranium like this so why bother? - taste_description = "the inside of a reactor" - /// How much tox damage to deal per tick - var/tox_damage = 0.5 - ph = 4 - material = /datum/material/uranium - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/uranium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(tox_damage * delta_time * REM) - ..() +/datum/reagent/blood/proc/get_diseases() + . = list() + if(data && data["viruses"]) + for(var/thing in data["viruses"]) + var/datum/disease/D = thing + . += D -/datum/reagent/uranium/expose_turf(turf/exposed_turf, reac_volume) +/datum/reagent/blood/expose_turf(turf/exposed_turf, reac_volume)//splash the blood all over the place . = ..() - if((reac_volume < 3) || isspaceturf(exposed_turf)) + if(!istype(exposed_turf)) return - - var/obj/effect/decal/cleanable/greenglow/glow = locate() in exposed_turf.contents - if(!glow) - glow = new(exposed_turf) - if(!QDELETED(glow)) - glow.reagents.add_reagent(type, reac_volume) - -//Mutagenic chem side-effects. -/datum/reagent/uranium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - mytray.mutation_roll(user) - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) - mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 2)) - -/datum/reagent/uranium/radium - name = "Radium" - description = "Radium is an alkaline earth metal. It is extremely radioactive." - reagent_state = SOLID - color = "#00CC00" // ditto - taste_description = "the colour blue and regret" - tox_damage = 1*REM - material = null - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/uranium/radium/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(src.type) * 1)) - mytray.adjust_toxic(round(chems.get_reagent_amount(src.type) * 1)) - -/datum/reagent/bluespace - name = "Bluespace Dust" - description = "A dust composed of microscopic bluespace crystals, with minor space-warping properties." - reagent_state = SOLID - color = "#0000CC" - taste_description = "fizzling blue" - material = /datum/material/bluespace - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/bluespace/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(methods & (TOUCH|VAPOR)) - do_teleport(exposed_mob, get_turf(exposed_mob), (reac_volume / 5), asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //4 tiles per crystal - -/datum/reagent/bluespace/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(current_cycle > 10 && DT_PROB(7.5, delta_time)) - to_chat(M, span_warning("You feel unstable...")) - M.set_timed_status_effect(2 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - current_cycle = 1 - addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, bluespace_shuffle)), 30) - ..() - -/mob/living/proc/bluespace_shuffle() - do_teleport(src, get_turf(src), 5, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - -/datum/reagent/aluminium - name = "Aluminium" - description = "A silvery white and ductile member of the boron group of chemical elements." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - taste_description = "metal" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/silicon - name = "Silicon" - description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - taste_mult = 0 - material = /datum/material/glass - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/fuel - name = "Welding Fuel" - description = "Required for welders. Flammable." - color = "#660000" // rgb: 102, 0, 0 - taste_description = "gross metal" - glass_icon_state = "dr_gibb_glass" - glass_name = "glass of welder fuel" - glass_desc = "Unless you're an industrial tool, this is probably not safe for consumption." - penetrates_skin = NONE - ph = 4 - burning_temperature = 1725 //more refined than oil - burning_volume = 0.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/alcohol = 4) - -/datum/reagent/fuel/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite! - . = ..() - if(methods & (TOUCH|VAPOR)) - exposed_mob.adjust_fire_stacks(reac_volume / 10) - -/datum/reagent/fuel/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustToxLoss(0.5*delta_time, 0) - ..() - return TRUE - -/datum/reagent/space_cleaner - name = "Space Cleaner" - description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" - color = "#A5F0EE" // rgb: 165, 240, 238 - taste_description = "sourness" - reagent_weight = 0.6 //so it sprays further - penetrates_skin = NONE - var/clean_types = CLEAN_WASH - ph = 5.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_CLEANS - -/datum/reagent/space_cleaner/expose_obj(obj/exposed_obj, reac_volume) - . = ..() - exposed_obj?.wash(clean_types) - -/datum/reagent/space_cleaner/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(reac_volume < 1) + if(reac_volume < 3) return - exposed_turf.wash(clean_types) - for(var/am in exposed_turf) - var/atom/movable/movable_content = am - if(ismopable(movable_content)) // Mopables will be cleaned anyways by the turf wash - continue - movable_content.wash(clean_types) - - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) - exposed_slime.adjustToxLoss(rand(5,10)) - -/datum/reagent/space_cleaner/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) - . = ..() - if(methods & (TOUCH|VAPOR)) - exposed_mob.wash(clean_types) - -/datum/reagent/space_cleaner/ez_clean - name = "EZ Clean" - description = "A powerful, acidic cleaner sold by Waffle Co. Affects organic matter while leaving other objects unaffected." - metabolization_rate = 1.5 * REAGENTS_METABOLISM - taste_description = "acid" - penetrates_skin = VAPOR - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/space_cleaner/ez_clean/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustBruteLoss(1.665*delta_time) - M.adjustFireLoss(1.665*delta_time) - M.adjustToxLoss(1.665*delta_time) - ..() - -/datum/reagent/space_cleaner/ez_clean/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if((methods & (TOUCH|VAPOR)) && !issilicon(exposed_mob)) - exposed_mob.adjustBruteLoss(1.5) - exposed_mob.adjustFireLoss(1.5) - -/datum/reagent/cryptobiolin - name = "Cryptobiolin" - description = "Cryptobiolin causes confusion and dizziness." - color = "#ADB5DB" //i hate default violets and 'crypto' keeps making me think of cryo so it's light blue now - metabolization_rate = 1.5 * REAGENTS_METABOLISM - taste_description = "sourness" - ph = 11.9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/cryptobiolin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(2 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) - - // Cryptobiolin adjusts the mob's confusion down to 20 seconds if it's higher, - // or up to 1 second if it's lower, but will do nothing if it's in between - var/confusion_left = M.get_timed_status_effect_duration(/datum/status_effect/confusion) - if(confusion_left < 1 SECONDS) - M.set_timed_status_effect(1 SECONDS, /datum/status_effect/confusion) - - else if(confusion_left > 20 SECONDS) - M.set_timed_status_effect(20 SECONDS, /datum/status_effect/confusion) - - ..() - -/datum/reagent/impedrezene - name = "Impedrezene" - description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." - color = "#E07DDD" // pink = happy = dumb - taste_description = "numbness" - ph = 9.1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/opiods = 10) - -/datum/reagent/impedrezene/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(-5 SECONDS * delta_time, /datum/status_effect/jitter) - if(DT_PROB(55, delta_time)) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2) - if(DT_PROB(30, delta_time)) - M.adjust_drowsyness(3) - if(DT_PROB(5, delta_time)) - M.emote("drool") - ..() - -/datum/reagent/cyborg_mutation_nanomachines - name = "Nanomachines" - description = "Microscopic construction robots." - color = "#535E66" // rgb: 83, 94, 102 - taste_description = "sludge" - penetrates_skin = NONE + var/obj/effect/decal/cleanable/blood/bloodsplatter = locate() in exposed_turf //find some blood here + if(!bloodsplatter) + bloodsplatter = new(exposed_turf, data["viruses"]) + else if(LAZYLEN(data["viruses"])) + var/list/viri_to_add = list() + for(var/datum/disease/virus in data["viruses"]) + if(virus.spread_flags & DISEASE_SPREAD_CONTACT_FLUIDS) + viri_to_add += virus + if(LAZYLEN(viri_to_add)) + bloodsplatter.AddComponent(/datum/component/infective, viri_to_add) + if(data["blood_DNA"]) + bloodsplatter.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) -/datum/reagent/cyborg_mutation_nanomachines/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) - . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/robot(), FALSE, TRUE) - -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - color = "#535E66" // rgb: 83, 94, 102 - taste_description = "sludge" - penetrates_skin = NONE +/// Improvised reagent that induces vomiting. Created by dipping a dead mouse in welder fluid. +/datum/reagent/yuck + name = "Organic Slurry" + description = "A mixture of various colors of fluid. Induces vomiting." + glass_name = "glass of ...yuck!" + glass_desc = "It smells like a carcass, and doesn't look much better." + color = "#545000" + taste_description = "insides" + taste_mult = 4 + ingest_met = 0.08 + var/yuck_cycle = 0 //! The `current_cycle` when puking starts. -/datum/reagent/xenomicrobes/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) +/datum/reagent/yuck/on_mob_add(mob/living/L) . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/xeno(), FALSE, TRUE) - -/datum/reagent/fungalspores - name = "Tubercle Bacillus Cosmosis Microbes" - description = "Active fungal spores." - color = "#92D17D" // rgb: 146, 209, 125 - taste_description = "slime" - penetrates_skin = NONE - ph = 11 + if(HAS_TRAIT(L, TRAIT_NOHUNGER)) //they can't puke + holder.del_reagent(type) -/datum/reagent/fungalspores/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) - . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) - -/datum/reagent/snail - name = "Agent-S" - description = "Virological agent that infects the subject with Gastrolosis." - color = "#003300" // rgb(0, 51, 0) - taste_description = "goo" - penetrates_skin = NONE - ph = 11 +#define YUCK_PUKE_CYCLES 3 // every X cycle is a puke +#define YUCK_PUKES_TO_STUN 3 // hit this amount of pukes in a row to start stunning +/datum/reagent/yuck/affect_ingest(mob/living/carbon/C, removed) + if(!yuck_cycle) + if(prob(10)) + var/dread = pick("Something is moving in your stomach...", \ + "A wet growl echoes from your stomach...", \ + "For a moment you feel like your surroundings are moving, but it's your stomach...") + to_chat(C, span_warning("[dread]")) + yuck_cycle = current_cycle + else + var/yuck_cycles = current_cycle - yuck_cycle + if(yuck_cycles % YUCK_PUKE_CYCLES == 0) + if(yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) + holder.remove_reagent(type, 5) + C.vomit(rand(14, 26), stun = yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) + if(holder) + return ..() -/datum/reagent/snail/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) - . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/gastrolosis(), FALSE, TRUE) - -/datum/reagent/fluorosurfactant//foam precursor - name = "Fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." - color = "#9E6B38" // rgb: 158, 107, 56 - taste_description = "metal" - ph = 11 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. - name = "Foaming Agent" - description = "An agent that yields metallic foam when mixed with light metal and a strong acid." - reagent_state = SOLID - color = "#664B63" // rgb: 102, 75, 99 - taste_description = "metal" - ph = 11.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/smart_foaming_agent //Smart foaming agent. Functions similarly to metal foam, but conforms to walls. - name = "Smart Foaming Agent" - description = "An agent that yields metallic foam which conforms to area boundaries when mixed with light metal and a strong acid." - reagent_state = SOLID - color = "#664B63" // rgb: 102, 75, 99 - taste_description = "metal" - ph = 11.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/ammonia - name = "Ammonia" - description = "A caustic substance commonly used in fertilizer or household cleaners." - reagent_state = GAS - color = "#404030" // rgb: 64, 64, 48 - taste_description = "mordant" - ph = 11.6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/ammonia/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - // Ammonia is bad ass. - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 0.12)) - if(myseed && prob(10)) - myseed.adjust_yield(1) - myseed.adjust_instability(1) +#undef YUCK_PUKE_CYCLES +#undef YUCK_PUKES_TO_STUN -/datum/reagent/diethylamine - name = "Diethylamine" - description = "A secondary amine, mildly corrosive." - color = "#604030" // rgb: 96, 64, 48 - taste_description = "iron" - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/yuck/on_mob_end_metabolize(mob/living/carbon/C) + yuck_cycle = 0 // reset vomiting -// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. The new trade off is it culls stability. -/datum/reagent/diethylamine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) - mytray.adjust_pestlevel(-rand(1,2)) - if(myseed) - myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) - myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1)) +/datum/reagent/yuck/on_transfer(atom/A, methods=TOUCH, trans_volume) + if((methods & INGEST) || !iscarbon(A)) + return ..() -/datum/reagent/carbondioxide - name = "Carbon Dioxide" - reagent_state = GAS - description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs." - color = "#B0B0B0" // rgb : 192, 192, 192 - taste_description = "something unknowable" - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + A.reagents.remove_reagent(type, trans_volume) + A.reagents.add_reagent(/datum/reagent/fuel, trans_volume * 0.75) + A.reagents.add_reagent(/datum/reagent/water, trans_volume * 0.25) -/datum/reagent/carbondioxide/expose_turf(turf/open/exposed_turf, reac_volume) - if(istype(exposed_turf)) - var/temp = holder ? holder.chem_temp : T20C - exposed_turf.atmos_spawn_air(GAS_CO2, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) return ..() -/datum/reagent/nitrous_oxide - name = "Nitrous Oxide" - description = "A potent oxidizer used as fuel in rockets and as an anaesthetic during surgery." +/datum/reagent/hair_dye + name = "Quantum Hair Dye" + description = "Has a high chance of making you look like a mad scientist." reagent_state = LIQUID - metabolization_rate = 1.5 * REAGENTS_METABOLISM - color = "#808080" - taste_description = "sweetness" - ph = 5.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/nitrous_oxide/expose_turf(turf/open/exposed_turf, reac_volume) - . = ..() - if(istype(exposed_turf)) - var/temp = holder ? holder.chem_temp : T20C - exposed_turf.assume_gas(GAS_N2O, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) - -/datum/reagent/nitrous_oxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(methods & VAPOR) - exposed_mob.adjust_drowsyness(max(round(reac_volume, 1), 2)) - -/datum/reagent/nitrous_oxide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_drowsyness(2 * REM * delta_time) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.blood_volume = max(H.blood_volume - (10 * REM * delta_time), 0) - if(DT_PROB(10, delta_time)) - M.losebreath += 2 - M.adjust_timed_status_effect(2 SECONDS, /datum/status_effect/confusion, max_duration = 5 SECONDS) - ..() - -/datum/reagent/nitrium_high_metabolization - name = "Nitrosyl plasmide" - description = "A highly reactive byproduct that stops you from sleeping, while dealing increasing toxin damage over time." - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because nitrium/freon/hypernoblium are handled through gas breathing, metabolism must be lower for breathcode to keep up - color = "E1A116" + var/list/potential_colors = list("#00aadd","#aa00ff","#ff7733","#dd1144","#dd1144","#00bb55","#00aadd","#ff7733","#ffcc22","#008844","#0055ee","#dd2222","#ffaa00") // fucking hair code + color = "#C8A5DC" taste_description = "sourness" - ph = 1.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - addiction_types = list(/datum/addiction/stimulants = 14) - -/datum/reagent/nitrium_high_metabolization/on_mob_metabolize(mob/living/L) - . = ..() - ADD_TRAIT(L, TRAIT_STUNIMMUNE, type) - ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - -/datum/reagent/nitrium_high_metabolization/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_STUNIMMUNE, type) - REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) - return ..() - -/datum/reagent/nitrium_high_metabolization/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.stamina.adjust(2 * REM * delta_time) - M.adjustToxLoss(0.1 * current_cycle * REM * delta_time, 0) // 1 toxin damage per cycle at cycle 10 - return ..() - -/datum/reagent/nitrium_low_metabolization - name = "Nitrium" - description = "A highly reactive gas that makes you feel faster." - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because nitrium/freon/hypernoblium are handled through gas breathing, metabolism must be lower for breathcode to keep up - color = "90560B" - taste_description = "burning" - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/nitrium_low_metabolization/on_mob_metabolize(mob/living/L) - . = ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) - -/datum/reagent/nitrium_low_metabolization/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nitrium) - return ..() - -/datum/reagent/freon - name = "Freon" - description = "A powerful heat absorbent." - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because nitrium/freon/hypernoblium are handled through gas breathing, metabolism must be lower for breathcode to keep up - color = "90560B" - taste_description = "burning" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/freon/on_mob_metabolize(mob/living/L) - . = ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) - -/datum/reagent/freon/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/freon) - return ..() - -/datum/reagent/hypernoblium - name = "Hyper-Noblium" - description = "A suppressive gas that stops gas reactions on those who inhale it." - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 // Because nitrium/freon/hyper-nob are handled through gas breathing, metabolism must be lower for breathcode to keep up - color = "90560B" - taste_description = "searingly cold" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/hypernoblium/on_mob_metabolize(mob/living/L) - . = ..() - if(isplasmaman(L)) - ADD_TRAIT(L, TRAIT_NOFIRE, type) - -/datum/reagent/hypernoblium/on_mob_end_metabolize(mob/living/L) - if(isplasmaman(L)) - REMOVE_TRAIT(L, TRAIT_NOFIRE, type) - return ..() - -/datum/reagent/healium - name = "Healium" - description = "A powerful sleeping agent with healing properties" - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 - color = "90560B" - taste_description = "rubbery" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + penetrates_skin = NONE -/datum/reagent/healium/on_mob_metabolize(mob/living/L) - . = ..() - L.PermaSleeping() -/datum/reagent/healium/on_mob_end_metabolize(mob/living/L) - L.SetSleeping(10) +/datum/reagent/hair_dye/New() + SSticker.OnRoundstart(CALLBACK(src,PROC_REF(UpdateColor))) return ..() -/datum/reagent/healium/on_mob_life(mob/living/breather, delta_time, times_fired) - breather.adjustFireLoss(-2 * REM * delta_time, FALSE) - breather.adjustToxLoss(-5 * REM * delta_time, FALSE) - breather.adjustBruteLoss(-2 * REM * delta_time, FALSE) - ..() - return TRUE +/datum/reagent/hair_dye/proc/UpdateColor() + color = pick(potential_colors) -/datum/reagent/halon - name = "Halon" - description = "A fire suppression gas that removes oxygen and cools down the area" - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 - color = "90560B" - taste_description = "minty" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE +/datum/reagent/hair_dye/affect_ingest(mob/living/carbon/C, removed) //What the fuck is wrong with you + C.adjustToxLoss(2 * removed, FALSE) + return ..() || TRUE -/datum/reagent/halon/on_mob_metabolize(mob/living/L) +/datum/reagent/hair_dye/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=FALSE) . = ..() - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) - ADD_TRAIT(L, TRAIT_RESISTHEAT, type) - -/datum/reagent/halon/on_mob_end_metabolize(mob/living/L) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/halon) - REMOVE_TRAIT(L, TRAIT_RESISTHEAT, type) - return ..() - -/datum/reagent/zauker - name = "Zauker" - description = "An unstable gas that is toxic to all living beings." - reagent_state = GAS - metabolization_rate = REAGENTS_METABOLISM * 0.5 - color = "90560B" - taste_description = "bitter" - chemical_flags = REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/zauker/on_mob_life(mob/living/breather, delta_time, times_fired) - breather.adjustBruteLoss(6 * REM * delta_time, FALSE) - breather.adjustOxyLoss(1 * REM * delta_time, FALSE) - breather.adjustFireLoss(2 * REM * delta_time, FALSE) - breather.adjustToxLoss(2 * REM * delta_time, FALSE) - ..() - return TRUE -/////////////////////////Colorful Powder//////////////////////////// -//For colouring in /proc/mix_color_from_reagents - -/datum/reagent/colorful_reagent/powder - name = "Mundane Powder" //the name's a bit similar to the name of colorful reagent, but hey, they're practically the same chem anyway - var/colorname = "none" - description = "A powder that is used for coloring things." - reagent_state = SOLID - color = "#FFFFFF" // rgb: 207, 54, 0 - taste_description = "the back of class" - -/datum/reagent/colorful_reagent/powder/New() - if(colorname == "none") - description = "A rather mundane-looking powder. It doesn't look like it'd color much of anything..." - else if(colorname == "invisible") - description = "An invisible powder. Unfortunately, since it's invisible, it doesn't look like it'd color much of anything..." - else - description = "\An [colorname] powder, used for coloring things [colorname]." - return ..() + if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob)) + return -/datum/reagent/colorful_reagent/powder/red - name = "Red Powder" - colorname = "red" - color = "#DA0000" // red - random_color_list = list("#FC7474") - ph = 0.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/orange - name = "Orange Powder" - colorname = "orange" - color = "#FF9300" // orange - random_color_list = list("#FF9300") - ph = 2 - -/datum/reagent/colorful_reagent/powder/yellow - name = "Yellow Powder" - colorname = "yellow" - color = "#FFF200" // yellow - random_color_list = list("#FFF200") - ph = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/green - name = "Green Powder" - colorname = "green" - color = "#A8E61D" // green - random_color_list = list("#A8E61D") - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/blue - name = "Blue Powder" - colorname = "blue" - color = "#00B7EF" // blue - random_color_list = list("#71CAE5") - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/purple - name = "Purple Powder" - colorname = "purple" - color = "#DA00FF" // purple - random_color_list = list("#BD8FC4") - ph = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/invisible - name = "Invisible Powder" - colorname = "invisible" - color = "#FFFFFF00" // white + no alpha - random_color_list = list("#FFFFFF") //because using the powder color turns things invisible - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/black - name = "Black Powder" - colorname = "black" - color = "#1C1C1C" // not quite black - random_color_list = list("#8D8D8D") //more grey than black, not enough to hide your true colors - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/white - name = "White Powder" - colorname = "white" - color = "#FFFFFF" // white - random_color_list = list("#FFFFFF") //doesn't actually change appearance at all - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/* used by crayons, can't color living things but still used for stuff like food recipes */ - -/datum/reagent/colorful_reagent/powder/red/crayon - name = "Red Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/orange/crayon - name = "Orange Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/yellow/crayon - name = "Yellow Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/green/crayon - name = "Green Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/blue/crayon - name = "Blue Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/purple/crayon - name = "Purple Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -//datum/reagent/colorful_reagent/powder/invisible/crayon - -/datum/reagent/colorful_reagent/powder/black/crayon - name = "Black Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent/powder/white/crayon - name = "White Crayon Powder" - can_colour_mobs = FALSE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/mob/living/carbon/human/exposed_human = exposed_mob + exposed_human.hair_color = pick(potential_colors) + exposed_human.facial_hair_color = pick(potential_colors) + exposed_human.update_body_parts() //////////////////////////////////Hydroponics stuff/////////////////////////////// @@ -1696,20 +405,18 @@ color = "#000000" // RBG: 0, 0, 0 var/tox_prob = 0 taste_description = "plant food" - ph = 3 -/datum/reagent/plantnutriment/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(tox_prob, delta_time)) - M.adjustToxLoss(1, 0) +/datum/reagent/plantnutriment/affect_blood(mob/living/carbon/C, removed) + if(prob(tox_prob *2)) + C.adjustToxLoss(1 * removed, 0) . = TRUE - ..() /datum/reagent/plantnutriment/eznutriment name = "E-Z-Nutrient" description = "Contains electrolytes. It's what plants crave." color = "#376400" // RBG: 50, 100, 0 tox_prob = 5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/plantnutriment/eznutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() @@ -1723,7 +430,7 @@ description = "Unstable nutriment that makes plants mutate more often than usual." color = "#1A1E4D" // RBG: 26, 30, 77 tox_prob = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/plantnutriment/left4zednutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() @@ -1736,7 +443,7 @@ description = "Very potent nutriment that slows plants from mutating." color = "#9D9D00" // RBG: 157, 157, 0 tox_prob = 8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/plantnutriment/robustharvestnutriment/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() @@ -1750,7 +457,7 @@ description = "A specialized nutriment, which decreases product quantity and potency, but strengthens the plants endurance." color = "#a06fa7" // RBG: 160, 111, 167 tox_prob = 8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/plantnutriment/endurogrow/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() @@ -1764,7 +471,7 @@ description = "A specialized nutriment, which increases the plant's production speed, as well as it's susceptibility to weeds." color = "#912e00" // RBG: 145, 46, 0 tox_prob = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/plantnutriment/liquidearthquake/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray) . = ..() @@ -1773,513 +480,40 @@ myseed.adjust_weed_chance(round(chems.get_reagent_amount(src.type) * 0.3)) myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.075)) -// GOON OTHERS - - - -/datum/reagent/fuel/oil - name = "Oil" - description = "Burns in a small smoky fire, can be used to get Ash." - reagent_state = LIQUID - color = "#2D2D2D" - taste_description = "oil" - burning_temperature = 1200//Oil is crude - burning_volume = 0.05 //but has a lot of hydrocarbons - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = null - -/datum/reagent/stable_plasma - name = "Stable Plasma" - description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." - reagent_state = LIQUID - color = "#2D2D2D" - taste_description = "bitterness" - taste_mult = 1.5 - ph = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/stable_plasma/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - C.adjustPlasma(10 * REM * delta_time) - ..() - -/datum/reagent/iodine - name = "Iodine" - description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing." - reagent_state = LIQUID - color = "#BC8A00" - taste_description = "metal" - ph = 4.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet - name = "Carpet" - description = "For those that need a more creative way to roll out a red carpet." - reagent_state = LIQUID - color = "#771100" - taste_description = "carpet" // Your tounge feels furry. - var/carpet_type = /turf/open/floor/carpet - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/expose_turf(turf/exposed_turf, reac_volume) - if(isopenturf(exposed_turf) && exposed_turf.turf_flags & IS_SOLID && !istype(exposed_turf, /turf/open/floor/carpet)) - exposed_turf.PlaceOnTop(carpet_type, flags = CHANGETURF_INHERIT_AIR) - ..() - -/datum/reagent/carpet/black - name = "Black Carpet" - description = "The carpet also comes in... BLAPCK" //yes, the typo is intentional - color = "#1E1E1E" - taste_description = "licorice" - carpet_type = /turf/open/floor/carpet/black - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/blue - name = "Blue Carpet" - description = "For those that really need to chill out for a while." - color = "#0000DC" - taste_description = "frozen carpet" - carpet_type = /turf/open/floor/carpet/blue - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/cyan - name = "Cyan Carpet" - description = "For those that need a throwback to the years of using poison as a construction material. Smells like asbestos." - color = "#00B4FF" - taste_description = "asbestos" - carpet_type = /turf/open/floor/carpet/cyan - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/green - name = "Green Carpet" - description = "For those that need the perfect flourish for green eggs and ham." - color = "#A8E61D" - taste_description = "Green" //the caps is intentional - carpet_type = /turf/open/floor/carpet/green - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/orange - name = "Orange Carpet" - description = "For those that prefer a healthy carpet to go along with their healthy diet." - color = "#E78108" - taste_description = "orange juice" - carpet_type = /turf/open/floor/carpet/orange - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/purple - name = "Purple Carpet" - description = "For those that need to waste copious amounts of healing jelly in order to look fancy." - color = "#91D865" - taste_description = "jelly" - carpet_type = /turf/open/floor/carpet/purple - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/red - name = "Red Carpet" - description = "For those that need an even redder carpet." - color = "#731008" - taste_description = "blood and gibs" - carpet_type = /turf/open/floor/carpet/red - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/royal - name = "Royal Carpet?" - description = "For those that break the game and need to make an issue report." - -/datum/reagent/carpet/royal/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = ..() - var/obj/item/organ/liver/liver = M.getorganslot(ORGAN_SLOT_LIVER) - if(liver) - // Heads of staff and the captain have a "royal metabolism" - if(HAS_TRAIT(liver, TRAIT_ROYAL_METABOLISM)) - if(DT_PROB(5, delta_time)) - to_chat(M, "You feel like royalty.") - if(DT_PROB(2.5, delta_time)) - M.say(pick("Peasants..","This carpet is worth more than your contracts!","I could fire you at any time..."), forced = "royal carpet") - - // The quartermaster, as a semi-head, has a "pretender royal" metabolism - else if(HAS_TRAIT(liver, TRAIT_PRETENDER_ROYAL_METABOLISM)) - if(DT_PROB(8, delta_time)) - to_chat(M, "You feel like an impostor...") - -/datum/reagent/carpet/royal/black - name = "Royal Black Carpet" - description = "For those that feel the need to show off their timewasting skills." - color = "#000000" - taste_description = "royalty" - carpet_type = /turf/open/floor/carpet/royalblack - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/royal/blue - name = "Royal Blue Carpet" - description = "For those that feel the need to show off their timewasting skills.. in BLUE." - color = "#5A64C8" - taste_description = "blueyalty" //also intentional - carpet_type = /turf/open/floor/carpet/royalblue - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/carpet/neon - name = "Neon Carpet" - description = "For those who like the 1980s, vegas, and debugging." - color = COLOR_ALMOST_BLACK - taste_description = "neon" - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon - -/datum/reagent/carpet/neon/simple_white - name = "Simple White Neon Carpet" - description = "For those who like fluorescent lighting." - color = LIGHT_COLOR_HALOGEN - taste_description = "sodium vapor" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/white - -/datum/reagent/carpet/neon/simple_red - name = "Simple Red Neon Carpet" - description = "For those who like a bit of uncertainty." - color = COLOR_RED - taste_description = "neon hallucinations" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/red - -/datum/reagent/carpet/neon/simple_orange - name = "Simple Orange Neon Carpet" - description = "For those who like some sharp edges." - color = COLOR_ORANGE - taste_description = "neon spines" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/orange - -/datum/reagent/carpet/neon/simple_yellow - name = "Simple Yellow Neon Carpet" - description = "For those who need a little stability in their lives." - color = COLOR_YELLOW - taste_description = "stabilized neon" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/yellow - -/datum/reagent/carpet/neon/simple_lime - name = "Simple Lime Neon Carpet" - description = "For those who need a little bitterness." - color = COLOR_LIME - taste_description = "neon citrus" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/lime - -/datum/reagent/carpet/neon/simple_green - name = "Simple Green Neon Carpet" - description = "For those who need a little bit of change in their lives." - color = COLOR_GREEN - taste_description = "radium" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/green - -/datum/reagent/carpet/neon/simple_teal - name = "Simple Teal Neon Carpet" - description = "For those who need a smoke." - color = COLOR_TEAL - taste_description = "neon tobacco" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/teal - -/datum/reagent/carpet/neon/simple_cyan - name = "Simple Cyan Neon Carpet" - description = "For those who need to take a breath." - color = COLOR_DARK_CYAN - taste_description = "neon air" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/cyan - -/datum/reagent/carpet/neon/simple_blue - name = "Simple Blue Neon Carpet" - description = "For those who need to feel joy again." - color = COLOR_NAVY - taste_description = "neon blue" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/blue - -/datum/reagent/carpet/neon/simple_purple - name = "Simple Purple Neon Carpet" - description = "For those that need a little bit of exploration." - color = COLOR_PURPLE - taste_description = "neon hell" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/purple - -/datum/reagent/carpet/neon/simple_violet - name = "Simple Violet Neon Carpet" - description = "For those who want to temp fate." - color = COLOR_VIOLET - taste_description = "neon hell" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/violet - -/datum/reagent/carpet/neon/simple_pink - name = "Simple Pink Neon Carpet" - description = "For those just want to stop thinking so much." - color = COLOR_PINK - taste_description = "neon pink" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/pink - -/datum/reagent/carpet/neon/simple_black - name = "Simple Black Neon Carpet" - description = "For those who need to catch their breath." - color = COLOR_BLACK - taste_description = "neon ash" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - carpet_type = /turf/open/floor/carpet/neon/simple/black - -/datum/reagent/bromine - name = "Bromine" - description = "A brownish liquid that's highly reactive. Useful for stopping free radicals, but not intended for human consumption." - reagent_state = LIQUID - color = "#D35415" - taste_description = "chemicals" - ph = 7.8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/pentaerythritol - name = "Pentaerythritol" - description = "Slow down, it ain't no spelling bee!" - reagent_state = SOLID - color = "#E66FFF" - taste_description = "acid" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/acetaldehyde - name = "Acetaldehyde" - description = "Similar to plastic. Tastes like dead people." - reagent_state = SOLID - color = "#EEEEEF" - taste_description = "dead people" //made from formaldehyde, ya get da joke ? - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/acetone_oxide - name = "Acetone Oxide" - description = "Enslaved oxygen" - reagent_state = LIQUID - color = "#C8A5DC" - taste_description = "acid" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - - -/datum/reagent/acetone_oxide/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people kills people! - . = ..() - if(methods & TOUCH) - exposed_mob.adjustFireLoss(2, FALSE) // burns, - exposed_mob.adjust_fire_stacks((reac_volume / 10)) - - - -/datum/reagent/phenol - name = "Phenol" - description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own." - reagent_state = LIQUID - color = "#E7EA91" - taste_description = "acid" - ph = 5.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/ash - name = "Ash" - description = "Supposedly phoenixes rise from these, but you've never seen it." - reagent_state = LIQUID - color = "#515151" - taste_description = "ash" - ph = 6.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -// Ash is also used IRL in gardening, as a fertilizer enhancer and weed killer -/datum/reagent/ash/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) - mytray.adjust_weedlevel(-1) - -/datum/reagent/acetone - name = "Acetone" - description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life." - reagent_state = LIQUID - color = "#AF14B7" - taste_description = "acid" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/colorful_reagent - name = "Colorful Reagent" - description = "Thoroughly sample the rainbow." - reagent_state = LIQUID - var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") - color = "#C8A5DC" - taste_description = "rainbows" - var/can_colour_mobs = TRUE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - var/datum/callback/color_callback - -/datum/reagent/colorful_reagent/New() - color_callback = CALLBACK(src, PROC_REF(UpdateColor)) - SSticker.OnRoundstart(color_callback) - return ..() - -/datum/reagent/colorful_reagent/Destroy() - LAZYREMOVE(SSticker.round_end_events, color_callback) //Prevents harddels during roundstart - color_callback = null //Fly free little callback - return ..() - -/datum/reagent/colorful_reagent/proc/UpdateColor() - color_callback = null - color = pick(random_color_list) - -/datum/reagent/colorful_reagent/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(can_colour_mobs) - M.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY) - return ..() - -/// Colors anything it touches a random color. -/datum/reagent/colorful_reagent/expose_atom(atom/exposed_atom, reac_volume) - . = ..() - if(!isliving(exposed_atom) || can_colour_mobs) - exposed_atom.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY) - -/datum/reagent/hair_dye - name = "Quantum Hair Dye" - description = "Has a high chance of making you look like a mad scientist." - reagent_state = LIQUID - var/list/potential_colors = list("#00aadd","#aa00ff","#ff7733","#dd1144","#dd1144","#00bb55","#00aadd","#ff7733","#ffcc22","#008844","#0055ee","#dd2222","#ffaa00") // fucking hair code - color = "#C8A5DC" - taste_description = "sourness" - penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/hair_dye/New() - SSticker.OnRoundstart(CALLBACK(src,PROC_REF(UpdateColor))) - return ..() - -/datum/reagent/hair_dye/proc/UpdateColor() - color = pick(potential_colors) - -/datum/reagent/hair_dye/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=FALSE) - . = ..() - if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob)) - return - - var/mob/living/carbon/human/exposed_human = exposed_mob - exposed_human.hair_color = pick(potential_colors) - exposed_human.facial_hair_color = pick(potential_colors) - exposed_human.update_body_parts() - -/datum/reagent/barbers_aid - name = "Barber's Aid" - description = "A solution to hair loss across the world." - reagent_state = LIQUID - color = "#A86B45" //hair is brown - taste_description = "sourness" - penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/barbers_aid/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=FALSE) - . = ..() - if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob) || HAS_TRAIT(exposed_mob, TRAIT_BALD)) - return - - var/mob/living/carbon/human/exposed_human = exposed_mob - var/datum/sprite_accessory/hair/picked_hair = pick(GLOB.hairstyles_list) - var/datum/sprite_accessory/facial_hair/picked_beard = pick(GLOB.facial_hairstyles_list) - to_chat(exposed_human, span_notice("Hair starts sprouting from your scalp.")) - exposed_human.hairstyle = picked_hair - exposed_human.facial_hairstyle = picked_beard - exposed_human.update_body_parts() - -/datum/reagent/concentrated_barbers_aid - name = "Concentrated Barber's Aid" - description = "A concentrated solution to hair loss across the world." - reagent_state = LIQUID - color = "#7A4E33" //hair is dark browmn - taste_description = "sourness" - penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/concentrated_barbers_aid/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=FALSE) - . = ..() - if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob) || HAS_TRAIT(exposed_mob, TRAIT_BALD)) - return - - var/mob/living/carbon/human/exposed_human = exposed_mob - to_chat(exposed_human, span_notice("Your hair starts growing at an incredible speed!")) - exposed_human.hairstyle = "Very Long Hair" - exposed_human.facial_hairstyle = "Beard (Very Long)" - exposed_human.update_body_parts() - -/datum/reagent/baldium - name = "Baldium" - description = "A major cause of hair loss across the world." - reagent_state = LIQUID - color = "#ecb2cf" - taste_description = "bitterness" - penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/baldium/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=FALSE) - . = ..() - if(!(methods & (TOUCH|VAPOR)) || !ishuman(exposed_mob)) - return - - var/mob/living/carbon/human/exposed_human = exposed_mob - to_chat(exposed_human, span_danger("Your hair is falling out in clumps!")) - exposed_human.hairstyle = "Bald" - exposed_human.facial_hairstyle = "Shaved" - exposed_human.update_body_parts() +// Bee chemicals -/datum/reagent/saltpetre - name = "Saltpetre" - description = "Volatile. Controversial. Third Thing." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - taste_description = "cool salt" - ph = 11.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/royal_bee_jelly + name = "Royal Bee Jelly" + description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." + color = "#00ff80" + taste_description = "strange honey" -// Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants -/datum/reagent/saltpetre/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(src.type, 1)) - var/salt = chems.get_reagent_amount(src.type) - mytray.adjust_plant_health(round(salt * 0.18)) - if(myseed) - myseed.adjust_production(-round(salt/10)-prob(salt%10)) - myseed.adjust_potency(round(salt*1)) -/datum/reagent/lye - name = "Lye" - description = "Also known as sodium hydroxide. As a profession making this is somewhat underwhelming." - reagent_state = LIQUID - color = "#FFFFD6" // very very light yellow - taste_description = "acid" - ph = 11.9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/royal_bee_jelly/affect_blood(mob/living/carbon/C, removed) + if(prob(1)) + spawn(-1) + C.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly") -/datum/reagent/drying_agent - name = "Drying Agent" - description = "A desiccant. Can be used to dry things." - reagent_state = LIQUID - color = "#A70FFF" - taste_description = "dryness" - ph = 10.7 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +//Misc reagents -/datum/reagent/drying_agent/expose_turf(turf/open/exposed_turf, reac_volume) - . = ..() - if(!istype(exposed_turf)) - return - exposed_turf.MakeDry(ALL, TRUE, reac_volume * 5 SECONDS) //50 deciseconds per unit +/datum/reagent/romerol + name = "Romerol" + // the REAL zombie powder + description = "Romerol is a highly experimental bioterror agent \ + which causes dormant nodules to be etched into the grey matter of \ + the subject. These nodules only become active upon death of the \ + host, upon which, the secondary structures activate and take control \ + of the host body." + color = "#123524" // RGB (18, 53, 36) + metabolization_rate = INFINITY + taste_description = "brains" -/datum/reagent/drying_agent/expose_obj(obj/exposed_obj, reac_volume) +/datum/reagent/romerol/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - if(exposed_obj.type != /obj/item/clothing/shoes/galoshes) - return - var/t_loc = get_turf(exposed_obj) - qdel(exposed_obj) - new /obj/item/clothing/shoes/galoshes/dry(t_loc) + // Silently add the zombie infection organ to be activated upon death + if(!exposed_mob.getorganslot(ORGAN_SLOT_ZOMBIE)) + var/obj/item/organ/zombie_infection/nodamage/ZI = new() + ZI.Insert(exposed_mob) // Virology virus food chems. @@ -2287,100 +521,362 @@ name = "Mutagenic Agar" color = "#A3C00F" // rgb: 163,192,15 taste_description = "sourness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/mutagen/mutagenvirusfood/sugar name = "Sucrose Agar" color = "#41B0C0" // rgb: 65,176,192 taste_description = "sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/medicine/synaptizine/synaptizinevirusfood name = "Virus Rations" color = "#D18AA5" // rgb: 209,138,165 taste_description = "bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/plasma/plasmavirusfood name = "Virus Plasma" color = "#A270A8" // rgb: 166,157,169 taste_description = "bitterness" taste_mult = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/plasma/plasmavirusfood/weak name = "Weakened Virus Plasma" color = "#A28CA5" // rgb: 206,195,198 taste_description = "bitterness" taste_mult = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/uranium/uraniumvirusfood name = "Decaying Uranium Gel" color = "#67ADBA" // rgb: 103,173,186 taste_description = "the inside of a reactor" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/uranium/uraniumvirusfood/unstable name = "Unstable Uranium Gel" color = "#2FF2CB" // rgb: 47,242,203 taste_description = "the inside of a reactor" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/uranium/uraniumvirusfood/stable name = "Stable Uranium Gel" color = "#04506C" // rgb: 4,80,108 taste_description = "the inside of a reactor" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -// Bee chemicals -/datum/reagent/royal_bee_jelly - name = "Royal Bee Jelly" - description = "Royal Bee Jelly, if injected into a Queen Space Bee said bee will split into two bees." - color = "#00ff80" - taste_description = "strange honey" - ph = 3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/technetium + name = "Technetium 99" + description = "A radioactive tracer agent that can improve a scanner's ability to detect internal organ damage. Will poison the patient when present very slowly, purging or using a low dose is recommended after use." + metabolization_rate = 0.2 -/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(1, delta_time)) - M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly") - ..() +/datum/reagent/technetium/affect_blood(mob/living/carbon/C, removed) + if(!(current_cycle % 8)) + C.adjustToxLoss(5 * removed, FALSE) + . = TRUE -//Misc reagents +/datum/reagent/helgrasp + name = "Helgrasp" + description = "This rare and forbidden concoction is thought to bring you closer to the grasp of the Norse goddess Hel." + metabolization_rate = 0.4 //This is fast + //Keeps track of the hand timer so we can cleanup on removal + var/list/timer_ids + +//Warns you about the impenting hands +/datum/reagent/helgrasp/on_mob_add(mob/living/L, amount) + to_chat(L, span_hierophant("You hear laughter as malevolent hands apparate before you, eager to drag you down to hell...! Look out!")) + playsound(L.loc, 'sound/chemistry/ahaha.ogg', 80, TRUE, -1) //Very obvious tell so people can be ready + . = ..() + +/datum/reagent/helgrasp/affect_blood(mob/living/carbon/C, removed) + spawn(-1) + spawn_hands(C) + var/hands = 1 + var/time = 1 + while(hands < 2) //we already made a hand now so start from 1 + LAZYADD(timer_ids, addtimer(CALLBACK(src, PROC_REF(spawn_hands), C), (time*hands) SECONDS, TIMER_STOPPABLE)) //keep track of all the timers we set up + hands += time + +/datum/reagent/helgrasp/proc/spawn_hands(mob/living/carbon/owner) + if(!owner && iscarbon(holder.my_atom))//Catch timer + owner = holder.my_atom + //Adapted from the end of the curse - but lasts a short time + var/grab_dir = turn(owner.dir, pick(-90, 90, 180, 180)) //grab them from a random direction other than the one faced, favoring grabbing from behind + var/turf/spawn_turf = get_ranged_target_turf(owner, grab_dir, 8)//Larger range so you have more time to dodge + if(!spawn_turf) + return + new/obj/effect/temp_visual/dir_setting/curse/grasp_portal(spawn_turf, owner.dir) + playsound(spawn_turf, 'sound/effects/curse2.ogg', 80, TRUE, -1) + var/obj/projectile/curse_hand/hel/hand = new (spawn_turf) + hand.preparePixelProjectile(owner, spawn_turf) + if(QDELETED(hand)) //safety check if above fails - above has a stack trace if it does fail + return + hand.fire() -/datum/reagent/romerol - name = "Romerol" - // the REAL zombie powder - description = "Romerol is a highly experimental bioterror agent \ - which causes dormant nodules to be etched into the grey matter of \ - the subject. These nodules only become active upon death of the \ - host, upon which, the secondary structures activate and take control \ - of the host body." - color = "#123524" // RGB (18, 53, 36) +//At the end, we clear up any loose hanging timers just in case and spawn any remaining lag_remaining hands all at once. +/datum/reagent/helgrasp/on_mob_delete(mob/living/owner) + for(var/id in timer_ids) // So that we can be certain that all timers are deleted at the end. + deltimer(id) + timer_ids.Cut() + return ..() + +/datum/reagent/helgrasp/heretic + name = "Grasp of the Mansus" + description = "The Hand of the Mansus is at your neck." + metabolization_rate = 0.2 + +// unholy water, but for heretics. +// why couldn't they have both just used the same reagent? +// who knows. +// maybe nar'sie is considered to be too "mainstream" of a god to worship in the heretic community. +/datum/reagent/eldritch + name = "Eldritch Essence" + description = "A strange liquid that defies the laws of physics. \ + It re-energizes and heals those who can see beyond this fragile reality, \ + but is incredibly harmful to the closed-minded. It metabolizes very quickly." + taste_description = "Ag'hsj'saje'sh" + color = "#1f8016" + metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second + chemical_flags = REAGENT_NO_RANDOM_RECIPE + +/datum/reagent/eldritch/affect_blood(mob/living/carbon/drinker, removed) + . = ..() + if(IS_HERETIC(drinker)) + drinker.adjust_drowsyness(-5 * removed) + drinker.AdjustAllImmobility(-40 * removed) + drinker.stamina.adjust(-10 * removed) + drinker.adjustToxLoss(-2 * removed, FALSE, forced = TRUE) + drinker.adjustOxyLoss(-2 * removed, FALSE) + drinker.adjustBruteLoss(-2 * removed, FALSE) + drinker.adjustFireLoss(-2 * removed, FALSE) + if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) + drinker.blood_volume += 3 * removed + else + drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * removed, 150, updating_health = FALSE) + drinker.adjustToxLoss(2 * removed, FALSE) + drinker.adjustFireLoss(2 * removed, FALSE) + drinker.adjustOxyLoss(2 * removed, FALSE) + drinker.adjustBruteLoss(2 * removed, FALSE) + return TRUE + +/datum/reagent/cellulose + name = "Cellulose Fibers" + description = "A crystaline polydextrose polymer, plants swear by this stuff." + reagent_state = SOLID + color = "#E6E6DA" + taste_mult = 0 + + +/datum/reagent/diethylamine + name = "Diethylamine" + description = "A secondary amine, mildly corrosive." + color = "#604030" // rgb: 96, 64, 48 + taste_description = "iron" + + +// This is more bad ass, and pests get hurt by the corrosive nature of it, not the plant. The new trade off is it culls stability. +/datum/reagent/diethylamine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) + mytray.adjust_pestlevel(-rand(1,2)) + if(myseed) + myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1)) + myseed.adjust_instability(-round(chems.get_reagent_amount(src.type) * 1)) + +/datum/reagent/pax + name = "Pax 400" + description = "A colorless liquid that suppresses violence in its subjects." + color = "#AAAAAA55" + taste_description = "water" + metabolization_rate = 0.05 + +/datum/reagent/pax/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_PACIFISM, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/pax/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_PACIFISM, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/monkey_powder + name = "Monkey Powder" + description = "Just add water!" + color = "#9C5A19" + taste_description = "bananas" + + +/datum/reagent/liquidgibs + name = "Liquid Gibs" + color = "#CC4633" + description = "You don't even want to think about what's in here." + taste_description = "gross iron" + shot_glass_icon_state = "shotglassred" + material = /datum/material/meat + + +/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke + name = "Unholy Water" + description = "Something that shouldn't exist on this plane of existence." + taste_description = "suffering" + metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second + penetrates_skin = TOUCH|VAPOR + + +/datum/reagent/fuel/unholywater/affect_blood(mob/living/carbon/C, removed) + if(IS_CULTIST(C)) + C.adjust_drowsyness(-5* removed) + C.AdjustAllImmobility(-40 * removed) + C.stamina.adjust(10 * removed) + C.adjustToxLoss(-2 * removed, 0) + C.adjustOxyLoss(-2 * removed, 0) + C.adjustBruteLoss(-2 * removed, 0) + C.adjustFireLoss(-2 * removed, 0) + if(ishuman(C) && C.blood_volume < BLOOD_VOLUME_NORMAL) + C.blood_volume += 3 * removed + else // Will deal about 90 damage when 50 units are thrown + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * removed, 150, updating_health = FALSE) + C.adjustToxLoss(1 * removed, 0) + C.adjustFireLoss(1 * removed, 0) + C.adjustOxyLoss(1 * removed, 0) + C.adjustBruteLoss(1 * removed, 0) + + return TRUE + + +/datum/reagent/glitter + name = "Generic Glitter" + description = "if you can see this description, contact a coder." + color = "#FFFFFF" //pure white + taste_description = "plastic" + reagent_state = SOLID + var/glitter_type = /obj/effect/decal/cleanable/glitter + + +/datum/reagent/glitter/expose_turf(turf/exposed_turf, reac_volume) + . = ..() + if(!istype(exposed_turf)) + return + new glitter_type(exposed_turf) + +/datum/reagent/glitter/pink + name = "Pink Glitter" + description = "pink sparkles that get everywhere" + color = "#ff8080" //A light pink color + glitter_type = /obj/effect/decal/cleanable/glitter/pink + + +/datum/reagent/glitter/white + name = "White Glitter" + description = "white sparkles that get everywhere" + glitter_type = /obj/effect/decal/cleanable/glitter/white + + +/datum/reagent/glitter/blue + name = "Blue Glitter" + description = "blue sparkles that get everywhere" + color = "#4040FF" //A blueish color + glitter_type = /obj/effect/decal/cleanable/glitter/blue + + +/datum/reagent/mulligan + name = "Mulligan Toxin" + description = "This toxin will rapidly change the DNA of living creatures." + color = "#5EFF3B" //RGB: 94, 255, 59 metabolization_rate = INFINITY - taste_description = "brains" - ph = 0.5 + taste_description = "slime" + + +/datum/reagent/mulligan/affect_blood(mob/living/carbon/human/H, removed) + if(!istype(H)) + return + var/datum/reagents/R = H.get_ingested_reagents() + if(R) + R.del_reagent(type) + to_chat(H, span_warning("You grit your teeth in pain as your body rapidly mutates!")) + H.visible_message(span_danger("[H]'s skin melts away, as they morph into a new form!")) + randomize_human(H) + H.dna.update_dna_identity() + + +/datum/reagent/lye + name = "Sodium Hydroxide" + description = "Also known as Lye. As a profession making this is somewhat underwhelming." + reagent_state = LIQUID + color = "#FFFFD6" // very very light yellow + taste_description = "acid" + + +/datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + description = "A suspension of degraded viral material suitable for use in inoculation." + color = "#C81040" // rgb: 200, 16, 64 + taste_description = "slime" + penetrates_skin = NONE -/datum/reagent/romerol/expose_mob(mob/living/carbon/human/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/vaccine/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message=TRUE, touch_protection=0) . = ..() - // Silently add the zombie infection organ to be activated upon death - if(!exposed_mob.getorganslot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/zombie_infection/nodamage/ZI = new() - ZI.Insert(exposed_mob) + if(!islist(data) || !(methods & (INGEST|INJECT))) + return + + for(var/thing in exposed_mob.diseases) + var/datum/disease/infection = thing + if(infection.GetDiseaseID() in data) + infection.cure() + LAZYOR(exposed_mob.disease_resistances, data) + +/datum/reagent/vaccine/affect_blood(mob/living/carbon/C, removed) + if(!islist(data)) + return + for(var/thing in C.diseases) + var/datum/disease/infection = thing + if(infection.GetDiseaseID() in data) + infection.cure() + LAZYOR(C.disease_resistances, data) + + +/datum/reagent/vaccine/on_merge(list/data) + if(istype(data)) + src.data |= data.Copy() + +/datum/reagent/vaccine/fungal_tb + name = "Vaccine (Fungal Tuberculosis)" + description = "A suspension of degraded viral material suitable for use in inoculation. Taggants suspended in the solution report it to be targeting Fungal Tuberculosis." + +/datum/reagent/vaccine/fungal_tb/New(data) + . = ..() + var/list/cached_data + if(!data) + cached_data = list() + else + cached_data = data + cached_data |= "[/datum/disease/tuberculosis]" + src.data = cached_data + +/datum/reagent/barbers_aid + name = "Barber's Aid" + description = "A solution to hair loss across the world." + reagent_state = LIQUID + color = "#A86B45" //hair is brown + taste_description = "sourness" + penetrates_skin = NONE + -/datum/reagent/magillitis - name = "Magillitis" - description = "An experimental serum which causes rapid muscular growth in Hominidae. Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." - reagent_state = LIQUID - color = "#00f041" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE +/datum/reagent/barbers_aid/affect_touch(mob/living/carbon/C, removed) + var/mob/living/carbon/human/exposed_human = C + var/datum/sprite_accessory/hair/picked_hair = pick(GLOB.hairstyles_list) + var/datum/sprite_accessory/facial_hair/picked_beard = pick(GLOB.facial_hairstyles_list) + to_chat(exposed_human, span_notice("Hair starts sprouting from your scalp.")) + exposed_human.hairstyle = picked_hair + exposed_human.facial_hairstyle = picked_beard + exposed_human.update_body_parts() -/datum/reagent/magillitis/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - ..() - if((ishuman(M)) && current_cycle >= 10) - M.gorillize() + holder.del_reagent(type) /datum/reagent/growthserum name = "Growth Serum" @@ -2388,9 +884,9 @@ color = "#ff0000"//strong red. rgb 255, 0, 0 var/current_size = RESIZE_DEFAULT_SIZE taste_description = "bitterness" // apparently what viagra tastes like - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/growthserum/on_mob_life(mob/living/carbon/H, delta_time, times_fired) + +/datum/reagent/growthserum/affect_blood(mob/living/carbon/C, removed) var/newsize = current_size switch(volume) if(0 to 19) @@ -2404,471 +900,290 @@ if(200 to INFINITY) newsize = 3.5*RESIZE_DEFAULT_SIZE - H.resize = newsize/current_size + C.resize = newsize/current_size current_size = newsize - H.update_transform() - ..() + C.update_transform() -/datum/reagent/growthserum/on_mob_end_metabolize(mob/living/M) - M.resize = RESIZE_DEFAULT_SIZE/current_size +/datum/reagent/growthserum/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + C.resize = RESIZE_DEFAULT_SIZE/current_size current_size = RESIZE_DEFAULT_SIZE - M.update_transform() - ..() + C.update_transform() -/datum/reagent/plastic_polymers - name = "Plastic Polymers" - description = "the petroleum based components of plastic." - color = "#f7eded" - taste_description = "plastic" - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/impedrezene // Impairs mental function correctly, takes an overwhelming dose to kill. + name = "Impedrezene" + description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + taste_description = "numbness" + reagent_state = LIQUID + color = "#c8a5dc" + overdose_threshold = 30 + value = 1.8 + +/datum/reagent/impedrezene/on_mob_metabolize(mob/living/carbon/C, class) + ADD_TRAIT(C, TRAIT_IMPEDREZENE, CHEM_TRAIT_SOURCE(class)) + C.add_movespeed_modifier(/datum/movespeed_modifier/impedrezene) + +/datum/reagent/impedrezene/affect_blood(mob/living/carbon/C, removed) + C.set_jitter_if_lower(10 SECONDS) + + if(prob(80)) + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/confusion, only_if_higher = TRUE) + if(prob(50)) + C.drowsyness = max(C.drowsyness, 3) + if(prob(10)) + spawn(-1) + C.emote("drool") + C.set_timed_status_effect(10 SECONDS, /datum/status_effect/speech/stutter, only_if_higher = TRUE) + + var/obj/item/organ/brain/B = C.getorganslot(ORGAN_SLOT_BRAIN) + if(B) + if (B.damage < 60) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 14 * removed, updating_health = FALSE) + else + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 7 * removed, updating_health = FALSE) + return TRUE -/datum/reagent/glitter - name = "Generic Glitter" - description = "if you can see this description, contact a coder." - color = "#FFFFFF" //pure white - taste_description = "plastic" - reagent_state = SOLID - var/glitter_type = /obj/effect/decal/cleanable/glitter - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/impedrezene/on_mob_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_IMPEDREZENE, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT_FROM(C, TRAIT_IMPEDREZENE, CHEM_TRAIT_SOURCE(CHEM_BLOOD))) + C.remove_movespeed_modifier(/datum/movespeed_modifier/impedrezene) -/datum/reagent/glitter/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(!istype(exposed_turf)) - return - new glitter_type(exposed_turf) +/datum/reagent/brimdust + name = "Brimdust" + description = "A brimdemon's dust. Consumption is not recommended, although plants like it." + reagent_state = SOLID + color = "#522546" + taste_description = "burning" -/datum/reagent/glitter/pink - name = "Pink Glitter" - description = "pink sparkles that get everywhere" - color = "#ff8080" //A light pink color - glitter_type = /obj/effect/decal/cleanable/glitter/pink - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/glitter/white - name = "White Glitter" - description = "white sparkles that get everywhere" - glitter_type = /obj/effect/decal/cleanable/glitter/white - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/brimdust/affect_blood(mob/living/carbon/C, removed) + C.adjustFireLoss((ispodperson(C) ? -1 : 1) * removed, FALSE) + return TRUE -/datum/reagent/glitter/blue - name = "Blue Glitter" - description = "blue sparkles that get everywhere" - color = "#4040FF" //A blueish color - glitter_type = /obj/effect/decal/cleanable/glitter/blue - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/brimdust/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + mytray.adjust_weedlevel(-1) + mytray.adjust_pestlevel(-1) + mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) + if(myseed) + myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5)) -/datum/reagent/pax - name = "Pax" - description = "A colorless liquid that suppresses violence in its subjects." - color = "#AAAAAA55" - taste_description = "water" - metabolization_rate = 0.25 * REAGENTS_METABOLISM - ph = 15 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED +/datum/reagent/spider_extract + name = "Spider Extract" + description = "A highly specialized extract coming from the Australicus sector, used to create broodmother spiders." + color = "#ED2939" + taste_description = "upside down" -/datum/reagent/pax/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_PACIFISM, type) +/datum/reagent/bone_dust + name = "Bone Dust" + color = "#dbcdcb" + description = "Ground up bones." + taste_description = "the most disgusting grain in existence" -/datum/reagent/pax/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_PACIFISM, type) - ..() +/datum/reagent/saltpetre + name = "Saltpetre" + description = "Volatile. Controversial. Third Thing." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + taste_description = "cool salt" -/datum/reagent/bz_metabolites - name = "BZ Metabolites" - description = "A harmless metabolite of BZ gas." - color = "#FAFF00" - taste_description = "acrid cinnamon" - metabolization_rate = 0.2 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/bz_metabolites/on_mob_life(mob/living/carbon/target, delta_time, times_fired) - if(target.mind) - var/datum/antagonist/changeling/changeling = target.mind.has_antag_datum(/datum/antagonist/changeling) - if(changeling) - changeling.adjust_chemicals(-2 * REM * delta_time) - return ..() -//This used to be a blindly implied type. Don't do that. -/datum/reagent/peaceborg - name = "Abstract Peaceborg Chemical" - abstract_type = /datum/reagent/peaceborg - -/datum/reagent/pax/peaceborg - name = "Synthpax" - description = "A colorless liquid that suppresses violence in its subjects. Cheaper to synthesize than normal Pax, but wears off faster." - metabolization_rate = 1.5 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/peaceborg/confuse - name = "Dizzying Solution" - description = "Makes the target off balance and dizzy" - metabolization_rate = 1.5 * REAGENTS_METABOLISM - taste_description = "dizziness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/peaceborg/confuse/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_timed_status_effect(3 SECONDS * REM * delta_time, /datum/status_effect/confusion, max_duration = 5 SECONDS) - M.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/dizziness, max_duration = 12 SECONDS) - - if(DT_PROB(10, delta_time)) - to_chat(M, "You feel confused and disoriented.") - ..() +// Saltpetre is used for gardening IRL, to simplify highly, it speeds up growth and strengthens plants +/datum/reagent/saltpetre/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) + . = ..() + if(chems.has_reagent(src.type, 1)) + var/salt = chems.get_reagent_amount(src.type) + mytray.adjust_plant_health(round(salt * 0.18)) + if(myseed) + myseed.adjust_production(-round(salt/10)-prob(salt%10)) + myseed.adjust_potency(round(salt*1)) -/datum/reagent/peaceborg/tire - name = "Tiring Solution" - description = "An extremely weak stamina-toxin that tires out the target. Completely harmless." - metabolization_rate = 1.5 * REAGENTS_METABOLISM - taste_description = "tiredness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/peaceborg/tire/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.stamina.loss_as_percent <= 80) - M.stamina.adjust(-10 * REM * delta_time) - if(DT_PROB(16, delta_time)) - to_chat(M, "You should sit down and take a rest...") - ..() +/datum/reagent/cordiolis_hepatico + name = "Cordiolis Hepatico" + description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown." + color = "#000000" + self_consuming = TRUE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/gondola_mutation_toxin - name = "Tranquility" - description = "A highly mutative liquid of unknown origin." - color = "#9A6750" //RGB: 154, 103, 80 - taste_description = "inner peace" - penetrates_skin = NONE +/datum/reagent/cordiolis_hepatico/on_mob_add(mob/living/carbon/C, amount, class) + if(class == CHEM_BLOOD) + ADD_TRAIT(C, TRAIT_STABLELIVER, type) + ADD_TRAIT(C, TRAIT_STABLEHEART, type) -/datum/reagent/gondola_mutation_toxin/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume, show_message = TRUE, touch_protection = 0) - . = ..() - if((methods & (PATCH|INGEST|INJECT)) || ((methods & VAPOR) && prob(min(reac_volume,100)*(1 - touch_protection)))) - exposed_mob.ForceContractDisease(new /datum/disease/transformation/gondola(), FALSE, TRUE) +/datum/reagent/cordiolis_hepatico/on_mob_delete(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + REMOVE_TRAIT(C, TRAIT_STABLEHEART, type) + REMOVE_TRAIT(C, TRAIT_STABLELIVER, type) +/datum/reagent/metafactor + name = "Mitogen Metabolism Factor" + description = "This enzyme catalyzes the conversion of nutricious food into healing peptides." + metabolization_rate = 0.0625 * 0.2 //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency. + reagent_state = SOLID + color = "#FFBE00" + overdose_threshold = 10 -/datum/reagent/spider_extract - name = "Spider Extract" - description = "A highly specialized extract coming from the Australicus sector, used to create broodmother spiders." - color = "#ED2939" - taste_description = "upside down" -/// Improvised reagent that induces vomiting. Created by dipping a dead mouse in welder fluid. -/datum/reagent/yuck - name = "Organic Slurry" - description = "A mixture of various colors of fluid. Induces vomiting." - glass_name = "glass of ...yuck!" - glass_desc = "It smells like a carcass, and doesn't look much better." - color = "#545000" - taste_description = "insides" - taste_mult = 4 - metabolization_rate = 0.4 * REAGENTS_METABOLISM - var/yuck_cycle = 0 //! The `current_cycle` when puking starts. +/datum/reagent/metafactor/overdose_start(mob/living/carbon/C) + metabolization_rate = 0.4 -/datum/reagent/yuck/on_mob_add(mob/living/L) - . = ..() - if(HAS_TRAIT(L, TRAIT_NOHUNGER)) //they can't puke - holder.del_reagent(type) +/datum/reagent/metafactor/overdose_process(mob/living/carbon/C) + if(prob(10)) + C.vomit() -#define YUCK_PUKE_CYCLES 3 // every X cycle is a puke -#define YUCK_PUKES_TO_STUN 3 // hit this amount of pukes in a row to start stunning -/datum/reagent/yuck/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - if(!yuck_cycle) - if(DT_PROB(4, delta_time)) - var/dread = pick("Something is moving in your stomach...", \ - "A wet growl echoes from your stomach...", \ - "For a moment you feel like your surroundings are moving, but it's your stomach...") - to_chat(C, span_userdanger("[dread]")) - yuck_cycle = current_cycle - else - var/yuck_cycles = current_cycle - yuck_cycle - if(yuck_cycles % YUCK_PUKE_CYCLES == 0) - if(yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) - holder.remove_reagent(type, 5) - C.vomit(rand(14, 26), stun = yuck_cycles >= YUCK_PUKE_CYCLES * YUCK_PUKES_TO_STUN) - if(holder) - return ..() -#undef YUCK_PUKE_CYCLES -#undef YUCK_PUKES_TO_STUN +/datum/reagent/fungalspores + name = "Tubercle Bacillus Cosmosis Microbes" + description = "Active fungal spores." + color = "#92D17D" // rgb: 146, 209, 125 + taste_description = "slime" + penetrates_skin = NONE + ingest_met = INFINITY + touch_met = INFINITY + metabolization_rate = INFINITY -/datum/reagent/yuck/on_mob_end_metabolize(mob/living/L) - yuck_cycle = 0 // reset vomiting +/datum/reagent/fungalspores/affect_ingest(mob/living/carbon/C, removed) + C.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) return ..() -/datum/reagent/yuck/on_transfer(atom/A, methods=TOUCH, trans_volume) - if((methods & INGEST) || !iscarbon(A)) - return ..() +/datum/reagent/fungalspores/affect_blood(mob/living/carbon/C, removed) + C.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) - A.reagents.remove_reagent(type, trans_volume) - A.reagents.add_reagent(/datum/reagent/fuel, trans_volume * 0.75) - A.reagents.add_reagent(/datum/reagent/water, trans_volume * 0.25) +/datum/reagent/fungalspores/affect_touch(mob/living/carbon/C, removed) + if(prob(min(volume,100)*(1 - C.get_permeability_protection()))) + C.ForceContractDisease(new /datum/disease/tuberculosis(), FALSE, TRUE) - return ..() -//monkey powder heehoo -/datum/reagent/monkey_powder - name = "Monkey Powder" - description = "Just add water!" - color = "#9C5A19" - taste_description = "bananas" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/plasma_oxide - name = "Hyper-Plasmium Oxide" - description = "Compound created deep in the cores of demon-class planets. Commonly found through deep geysers." - color = "#470750" // rgb: 255, 255, 255 - taste_description = "hell" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/exotic_stabilizer - name = "Exotic Stabilizer" - description = "Advanced compound created by mixing stabilizing agent and hyper-plasmium oxide." - color = "#180000" // rgb: 255, 255, 255 - taste_description = "blood" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/wittel - name = "Wittel" - description = "An extremely rare metallic-white substance only found on demon-class planets." - color = "#FFFFFF" // rgb: 255, 255, 255 - taste_mult = 0 // oderless and tasteless - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/metalgen - name = "Metalgen" - data = list("material"=null) - description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches." - color = "#b000aa" - taste_mult = 0 // oderless and tasteless - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - /// The material flags used to apply the transmuted materials - var/applied_material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR - /// The amount of materials to apply to the transmuted objects if they don't contain materials - var/default_material_amount = 100 - -/datum/reagent/metalgen/expose_obj(obj/exposed_obj, volume) - . = ..() - metal_morph(exposed_obj) +#define CRYO_SPEED_PREFACTOR 0.4 +#define CRYO_SPEED_CONSTANT 0.1 -/datum/reagent/metalgen/expose_turf(turf/exposed_turf, volume) - . = ..() - metal_morph(exposed_turf) +/datum/reagent/glycerol + name = "Glycerol" + description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + color = "#D3B913" + taste_description = "sweetness" -///turn an object into a special material -/datum/reagent/metalgen/proc/metal_morph(atom/A) - var/metal_ref = data["material"] - if(!metal_ref) - return +/datum/reagent/cryptobiolin + name = "Cryptobiolin" + description = "Cryptobiolin causes confusion and dizziness." + color = "#ADB5DB" //i hate default violets and 'crypto' keeps making me think of cryo so it's light blue now + metabolization_rate = 0.3 + taste_description = "sourness" - var/metal_amount = 0 - var/list/materials_to_transmute = A.get_material_composition(BREAKDOWN_INCLUDE_ALCHEMY) - for(var/metal_key in materials_to_transmute) //list with what they're made of - metal_amount += materials_to_transmute[metal_key] - - if(!metal_amount) - metal_amount = default_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesn't exist - - var/list/metal_dat = list((metal_ref) = metal_amount) - A.material_flags = applied_material_flags - A.set_custom_materials(metal_dat) - ADD_TRAIT(A, TRAIT_MAT_TRANSMUTED, type) - -/datum/reagent/gravitum - name = "Gravitum" - description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even - color = "#050096" // rgb: 5, 0, 150 - taste_mult = 0 // oderless and tasteless - metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use - var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - self_consuming = TRUE //this works on objects, so it should work on skeletons and robots too - -/datum/reagent/gravitum/expose_obj(obj/exposed_obj, volume) +/datum/reagent/cryptobiolin/affect_blood(mob/living/carbon/C, removed) . = ..() - exposed_obj.AddElement(/datum/element/forced_gravity, 0) - addtimer(CALLBACK(exposed_obj, PROC_REF(_RemoveElement), list(/datum/element/forced_gravity, 0)), volume * time_multiplier) - -/datum/reagent/gravitum/on_mob_metabolize(mob/living/L) - L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless - return ..() - -/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L) - L.RemoveElement(/datum/element/forced_gravity, 0) + C.set_timed_status_effect(2 SECONDS, /datum/status_effect/dizziness, only_if_higher = TRUE) -/datum/reagent/cellulose - name = "Cellulose Fibers" - description = "A crystaline polydextrose polymer, plants swear by this stuff." - reagent_state = SOLID - color = "#E6E6DA" - taste_mult = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // Cryptobiolin adjusts the mob's confusion down to 20 seconds if it's higher, + // or up to 1 second if it's lower, but will do nothing if it's in between + var/confusion_left = C.get_timed_status_effect_duration(/datum/status_effect/confusion) + if(confusion_left < 1 SECONDS) + C.set_timed_status_effect(1 SECONDS, /datum/status_effect/confusion) -// unholy water, but for heretics. -// why couldn't they have both just used the same reagent? -// who knows. -// maybe nar'sie is considered to be too "mainstream" of a god to worship in the heretic community. -/datum/reagent/eldritch - name = "Eldritch Essence" - description = "A strange liquid that defies the laws of physics. \ - It re-energizes and heals those who can see beyond this fragile reality, \ - but is incredibly harmful to the closed-minded. It metabolizes very quickly." - taste_description = "Ag'hsj'saje'sh" - color = "#1f8016" - metabolization_rate = 2.5 * REAGENTS_METABOLISM //0.5u/second - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + else if(confusion_left > 20 SECONDS) + C.set_timed_status_effect(20 SECONDS, /datum/status_effect/confusion) + +//used for changeling's adrenaline power +/datum/reagent/medicine/changelingadrenaline + name = "Changeling Adrenaline" + description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." + color = "#C1151D" + overdose_threshold = 30 + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/eldritch/on_mob_life(mob/living/carbon/drinker, delta_time, times_fired) - if(IS_HERETIC(drinker)) - drinker.adjust_drowsyness(-5 * REM * delta_time) - drinker.AdjustAllImmobility(-40 * REM * delta_time) - drinker.stamina.adjust(-10 * REM * delta_time) - drinker.adjustToxLoss(-2 * REM * delta_time, FALSE, forced = TRUE) - drinker.adjustOxyLoss(-2 * REM * delta_time, FALSE) - drinker.adjustBruteLoss(-2 * REM * delta_time, FALSE) - drinker.adjustFireLoss(-2 * REM * delta_time, FALSE) - if(drinker.blood_volume < BLOOD_VOLUME_NORMAL) - drinker.blood_volume += 3 * REM * delta_time - else - drinker.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * delta_time, 150) - drinker.adjustToxLoss(2 * REM * delta_time, FALSE) - drinker.adjustFireLoss(2 * REM * delta_time, FALSE) - drinker.adjustOxyLoss(2 * REM * delta_time, FALSE) - drinker.adjustBruteLoss(2 * REM * delta_time, FALSE) - ..() +/datum/reagent/medicine/changelingadrenaline/affect_blood(mob/living/carbon/C, removed) + C.AdjustAllImmobility(-20 * removed) + C.stamina.adjust(10 * removed) + C.set_timed_status_effect(20 SECONDS * removed, /datum/status_effect/jitter, only_if_higher = TRUE) + C.set_timed_status_effect(20 SECONDS * removed, /datum/status_effect/dizziness, only_if_higher = TRUE) return TRUE -/datum/reagent/universal_indicator - name = "Universal Indicator" - description = "A solution that can be used to create pH paper booklets, or sprayed on things to colour them by their pH." - taste_description = "a strong chemical taste" - color = "#1f8016" - -//Colours things by their pH -/datum/reagent/universal_indicator/expose_atom(atom/exposed_atom, reac_volume) - . = ..() - if(exposed_atom.reagents) - var/color - CONVERT_PH_TO_COLOR(exposed_atom.reagents.ph, color) - exposed_atom.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY) - -// [Original ants concept by Keelin on Goon] -/datum/reagent/ants - name = "Ants" - description = "A genetic crossbreed between ants and termites, their bites land at a 3 on the Schmidt Pain Scale." - reagent_state = SOLID - color = "#993333" - taste_mult = 1.3 - taste_description = "tiny legs scuttling down the back of your throat" - metabolization_rate = 5 * REAGENTS_METABOLISM //1u per second - glass_name = "glass of ants" - glass_desc = "Bottoms up...?" - ph = 4.6 // Ants contain Formic Acid - /// How much damage the ants are going to be doing (rises with each tick the ants are in someone's body) - var/ant_damage = 0 - /// Tells the debuff how many ants we are being covered with. - var/amount_left = 0 - /// List of possible common statements to scream when eating ants - var/static/list/ant_screams = list( - "THEY'RE UNDER MY SKIN!!", - "GET THEM OUT OF ME!!", - "HOLY HELL THEY BURN!!", - "MY GOD THEY'RE INSIDE ME!!", - "GET THEM OUT!!" - ) - -/datum/reagent/ants/on_mob_life(mob/living/carbon/victim, delta_time) - victim.adjustBruteLoss(max(0.1, round((ant_damage * 0.025),0.1))) //Scales with time. Roughly 32 brute with 100u. - ant_damage++ - if(ant_damage < 5) // Makes ant food a little more appetizing, since you won't be screaming as much. - return ..() - if(DT_PROB(5, delta_time)) - if(DT_PROB(5, delta_time)) //Super rare statement - victim.say("AUGH NO NOT THE ANTS! NOT THE ANTS! AAAAUUGH THEY'RE IN MY EYES! MY EYES! AUUGH!!", forced = /datum/reagent/ants) - else - victim.say(pick(ant_screams), forced = /datum/reagent/ants) - if(DT_PROB(15, delta_time)) - victim.emote("scream") - if(DT_PROB(2, delta_time)) // Stuns, but purges ants. - victim.vomit(rand(5,10), FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 1) - return ..() +/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + ADD_TRAIT(C, TRAIT_SLEEPIMMUNE, type) + ADD_TRAIT(C, TRAIT_STUNRESISTANCE, type) + C.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/pain) + +/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + REMOVE_TRAIT(C, TRAIT_SLEEPIMMUNE, type) + REMOVE_TRAIT(C, TRAIT_STUNRESISTANCE, type) + C.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/pain) + C.remove_status_effect(/datum/status_effect/dizziness) + C.remove_status_effect(/datum/status_effect/jitter) + +/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/carbon/C) + C.adjustToxLoss(0.2, 0) + return TRUE -/datum/reagent/ants/on_mob_end_metabolize(mob/living/living_anthill) - ant_damage = 0 - to_chat(living_anthill, "You feel like the last of the ants are out of your system.") - return ..() +/datum/reagent/medicine/changelinghaste + name = "Changeling Haste" + description = "Drastically increases movement speed, but deals toxin damage." + color = "#AE151D" + metabolization_rate = 0.5 + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/ants/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(!iscarbon(exposed_mob) || (methods & (INGEST|INJECT))) - return - if(methods & (PATCH|TOUCH|VAPOR)) - amount_left = round(reac_volume,0.1) - exposed_mob.apply_status_effect(/datum/status_effect/ants, amount_left) +/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + C.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) -/datum/reagent/ants/expose_obj(obj/exposed_obj, reac_volume) - . = ..() - var/turf/open/my_turf = exposed_obj.loc // No dumping ants on an object in a storage slot - if(!istype(my_turf)) //Are we actually in an open turf? - return - var/static/list/accepted_types = typecacheof(list(/obj/machinery/atmospherics, /obj/structure/cable, /obj/structure/disposalpipe)) - if(!accepted_types[exposed_obj.type]) // Bypasses pipes, vents, and cables to let people create ant mounds on top easily. - return - expose_turf(my_turf, reac_volume) +/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + C.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) -/datum/reagent/ants/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(!istype(exposed_turf) || isspaceturf(exposed_turf)) // Is the turf valid - return - if((reac_volume <= 10)) // Makes sure people don't duplicate ants. - return +/datum/reagent/medicine/changelinghaste/affect_blood(mob/living/carbon/C, removed) + C.adjustToxLoss(0.2, 0) + return TRUE - var/obj/effect/decal/cleanable/ants/pests = locate() in exposed_turf.contents - if(!pests) - pests = new(exposed_turf) - var/spilled_ants = (round(reac_volume,1) - 5) // To account for ant decals giving 3-5 ants on initialize. - pests.reagents.add_reagent(/datum/reagent/ants, spilled_ants) - pests.update_ant_damage() - -//This is intended to a be a scarce reagent to gate certain drugs and toxins with. Do not put in a synthesizer. Renewable sources of this reagent should be inefficient. -/datum/reagent/lead - name = "Lead" - description = "A dull metalltic element with a low melting point." - taste_description = "metal" +/datum/reagent/gold + name = "Gold" + description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." reagent_state = SOLID - color = "#80919d" - metabolization_rate = 0.4 * REAGENTS_METABOLISM + color = "#F7C430" // rgb: 247, 196, 48 + taste_description = "expensive metal" + material = /datum/material/gold + +/datum/reagent/nitrous_oxide + name = "Nitrous Oxide" + description = "A potent oxidizer used as fuel in rockets and as an anaesthetic during surgery." + reagent_state = LIQUID + metabolization_rate = 0.3 + color = "#808080" + taste_description = "sweetness" -/datum/reagent/lead/on_mob_life(mob/living/carbon/victim) +/datum/reagent/nitrous_oxide/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() - victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) + if(istype(exposed_turf)) + var/temp = holder ? holder.chem_temp : T20C + exposed_turf.assume_gas(GAS_N2O, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, temp) -//The main feedstock for kronkaine production, also a shitty stamina healer. -/datum/reagent/kronkus_extract - name = "Kronkus Extract" - description = "A frothy extract made from fermented kronkus vine pulp.\nHighly bitter due to the presence of a variety of kronkamines." - taste_description = "bitterness" - color = "#228f63" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - addiction_types = list(/datum/addiction/stimulants = 5) +/datum/reagent/nitrous_oxide/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) + . = ..() + if(methods & VAPOR) + exposed_mob.adjust_drowsyness(max(round(reac_volume, 1), 2)) -/datum/reagent/kronkus_extract/on_mob_life(mob/living/carbon/kronkus_enjoyer) +/datum/reagent/nitrous_oxide/affect_blood(mob/living/carbon/C, removed) . = ..() - kronkus_enjoyer.adjustOrganLoss(ORGAN_SLOT_HEART, 0.1) - kronkus_enjoyer.stamina.adjust(2) + C.adjust_drowsyness(2 * removed) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + H.adjustBloodVolume(-10 * removed) -/datum/reagent/brimdust - name = "Brimdust" - description = "A brimdemon's dust. Consumption is not recommended, although plants like it." - reagent_state = SOLID - color = "#522546" - taste_description = "burning" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + if(prob(20)) + C.losebreath += 2 + C.adjust_timed_status_effect(2 SECONDS, /datum/status_effect/confusion, max_duration = 5 SECONDS) -/datum/reagent/brimdust/on_mob_life(mob/living/carbon/carbon, delta_time, times_fired) - . = ..() - carbon.adjustFireLoss((ispodperson(carbon) ? -1 : 1) * delta_time) +/datum/reagent/slug_slime + name = "Antibiotic Slime" + description = "Cleansing slime extracted from a slug. Great for cleaning surfaces, or sterilization before surgery." + reagent_state = LIQUID + color = "#c4dfa1" + taste_description = "sticky mouthwash" -/datum/reagent/brimdust/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) +/datum/reagent/slug_slime/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() - if(chems.has_reagent(src.type, 1)) - mytray.adjust_weedlevel(-1) - mytray.adjust_pestlevel(-1) - mytray.adjust_plant_health(round(chems.get_reagent_amount(src.type) * 1)) - if(myseed) - myseed.adjust_potency(round(chems.get_reagent_amount(src.type) * 0.5)) + if(!istype(exposed_turf)) + return + if(reac_volume >= 1) + exposed_turf.MakeSlippery(TURF_WET_WATER, 15 SECONDS, min(reac_volume * 1 SECONDS, 40 SECONDS)) diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 102d173144cc..68b2a189c4d7 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -1,20 +1,43 @@ +/datum/reagent/phlogiston + name = "Phlogiston" + description = "Catches you on fire and makes you ignite." + reagent_state = LIQUID + color = "#FA00AF" + taste_description = "burning" + self_consuming = TRUE + + +/datum/reagent/phlogiston/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature, datum/reagents/source, methods, show_message, touch_protection) + . = ..() + exposed_mob.adjust_fire_stacks(1) + exposed_mob.ignite_mob() + +/datum/reagent/phlogiston/affect_blood(mob/living/carbon/C, removed) + C.adjust_fire_stacks(1 * removed) + C.adjustFireLoss(0.3 * max(C.fire_stacks, 0.15) * removed, 0) + return TRUE + +/datum/reagent/phlogiston/affect_touch(mob/living/carbon/C, removed) + . = ..() + C.adjust_fire_stacks(1 * removed) + C.adjustFireLoss(0.3 * max(C.fire_stacks, 0.15) * removed, 0) + return TRUE /datum/reagent/thermite name = "Thermite" description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." reagent_state = SOLID - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + color = "#550000" taste_description = "sweet tasting metal" -/datum/reagent/thermite/expose_turf(turf/exposed_turf, reac_volume) +/datum/reagent/thermite/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) . = ..() if(reac_volume >= 1) exposed_turf.AddComponent(/datum/component/thermite, reac_volume) -/datum/reagent/thermite/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustFireLoss(1 * REM * delta_time, 0) - ..() +/datum/reagent/thermite/affect_blood(mob/living/carbon/C, removed) + C.adjustFireLoss(1 * removed, 0) return TRUE /datum/reagent/nitroglycerin @@ -22,7 +45,7 @@ description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." color = "#808080" // rgb: 128, 128, 128 taste_description = "oil" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/stabilizing_agent name = "Stabilizing Agent" @@ -30,14 +53,15 @@ reagent_state = LIQUID color = "#FFFF00" taste_description = "metal" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - //It has stable IN THE NAME. IT WAS MADE FOR THIS MOMENT. + +//It has stable IN THE NAME. IT WAS MADE FOR THIS MOMENT. /datum/reagent/stabilizing_agent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) . = ..() if(myseed && chems.has_reagent(type, 1)) myseed.adjust_instability(-1) + /datum/reagent/clf3 name = "Chlorine Trifluoride" description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." @@ -46,12 +70,16 @@ metabolization_rate = 10 * REAGENTS_METABOLISM taste_description = "burning" penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/clf3/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_fire_stacks(2 * REM * delta_time) - M.adjustFireLoss(0.3 * max(M.fire_stacks, 1) * REM * delta_time, 0) - ..() + +/datum/reagent/clf3/affect_blood(mob/living/carbon/C, removed) + C.adjust_fire_stacks(2 * removed) + C.adjustFireLoss(0.3 * max(C.fire_stacks, 1) * removed, 0) + return TRUE + +/datum/reagent/clf3/affect_touch(mob/living/carbon/C, removed) + C.adjust_fire_stacks(2 * removed) + C.adjustFireLoss(0.3 * max(C.fire_stacks, 1) * removed, 0) return TRUE /datum/reagent/clf3/expose_turf(turf/exposed_turf, reac_volume) @@ -67,31 +95,20 @@ exposed_turf.burn_tile() if(isfloorturf(exposed_turf)) for(var/turf/nearby_turf in RANGE_TURFS(1, exposed_turf)) - /*if(!locate(/obj/effect/hotspot) in nearby_turf) - new /obj/effect/hotspot(nearby_turf)*/ nearby_turf.create_fire(1, 10) -/datum/reagent/clf3/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/clf3/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() exposed_mob.adjust_fire_stacks(min(reac_volume/5, 10)) var/turf/T = get_turf(exposed_mob) T.create_fire(1, 10) - -/datum/reagent/sorium - name = "Sorium" - description = "Sends everything flying from the detonation point." - reagent_state = LIQUID - color = "#5A64C8" - taste_description = "air and bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - /datum/reagent/liquid_dark_matter name = "Liquid Dark Matter" description = "Sucks everything into the detonation point." reagent_state = LIQUID color = "#210021" taste_description = "compressed bitterness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/gunpowder name = "Gunpowder" @@ -100,7 +117,7 @@ color = "#000000" metabolization_rate = 0.125 * REAGENTS_METABOLISM taste_description = "salt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/gunpowder/on_new(data) . = ..() @@ -112,14 +129,13 @@ UnregisterSignal(holder.my_atom, COMSIG_ATOM_EX_ACT) return ..() -/datum/reagent/gunpowder/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - . = TRUE - ..() - if(!isplasmaman(M)) +/datum/reagent/gunpowder/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(!isplasmaman(C)) return - M.set_timed_status_effect(30 SECONDS * REM * delta_time, /datum/status_effect/drugginess) - if(M.hallucination < volume) - M.hallucination += 5 * REM * delta_time + C.set_timed_status_effect(30 SECONDS * removed, /datum/status_effect/drugginess) + if(C.hallucination < volume) + C.hallucination += 5 * removed /datum/reagent/gunpowder/proc/on_ex_act(atom/source, severity, target) SIGNAL_HANDLER @@ -137,7 +153,7 @@ reagent_state = SOLID color = "#FFFFFF" taste_description = "salt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/tatp name = "TaTP" @@ -145,7 +161,7 @@ reagent_state = SOLID color = "#FFFFFF" taste_description = "death" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/flash_powder name = "Flash Powder" @@ -153,7 +169,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "salt" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/smoke_powder name = "Smoke Powder" @@ -161,7 +177,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "smoke" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/sonic_powder name = "Sonic Powder" @@ -169,29 +185,7 @@ reagent_state = LIQUID color = "#C8C8C8" taste_description = "loud noises" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/phlogiston - name = "Phlogiston" - description = "Catches you on fire and makes you ignite." - reagent_state = LIQUID - color = "#FA00AF" - taste_description = "burning" - self_consuming = TRUE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/phlogiston/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - exposed_mob.adjust_fire_stacks(1) - var/burndmg = max(0.3*exposed_mob.fire_stacks, 0.3) - exposed_mob.adjustFireLoss(burndmg, 0) - exposed_mob.ignite_mob() -/datum/reagent/phlogiston/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) - metabolizer.adjust_fire_stacks(1 * REM * delta_time) - metabolizer.adjustFireLoss(0.3 * max(metabolizer.fire_stacks, 0.15) * REM * delta_time, 0) - ..() - return TRUE /datum/reagent/napalm name = "Napalm" @@ -201,7 +195,7 @@ taste_description = "burning" self_consuming = TRUE penetrates_skin = NONE - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // why, just why /datum/reagent/napalm/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -212,72 +206,16 @@ mytray.adjust_toxic(round(chems.get_reagent_amount(type) * 7)) mytray.adjust_weedlevel(-rand(5,9)) //At least give them a small reward if they bother. -/datum/reagent/napalm/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_fire_stacks(1 * REM * delta_time) - ..() +/datum/reagent/napalm/affect_blood(mob/living/carbon/C, removed) + C.adjust_fire_stacks(1 * removed) -/datum/reagent/napalm/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) - . = ..() - if(istype(exposed_mob) && (methods & (TOUCH|VAPOR|PATCH))) - exposed_mob.adjust_fire_stacks(min(reac_volume/4, 20)) +/datum/reagent/napalm/affect_touch(mob/living/carbon/C, removed) + C.adjust_fire_stacks(1 * removed) -#define CRYO_SPEED_PREFACTOR 0.4 -#define CRYO_SPEED_CONSTANT 0.1 - -/datum/reagent/cryostylane - name = "Cryostylane" - description = "Induces a cryostasis like state in a patient's organs, preventing them from decaying while dead. Slows down surgery while in a patient however. When reacted with oxygen, it will slowly consume it and reduce a container's temperature to 0K. Also damages slime simplemobs when 5u is sprayed." - color = "#0000DC" - ph = 8.6 - metabolization_rate = 0.05 * REAGENTS_METABOLISM - taste_description = "icey bitterness" - purity = REAGENT_STANDARD_PURITY - self_consuming = TRUE - inverse_chem_val = 0.5 - inverse_chem = /datum/reagent/inverse/cryostylane - burning_volume = 0.05 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED | REAGENT_DEAD_PROCESS - -/datum/reagent/cryostylane/burn(datum/reagents/holder) - if(holder.has_reagent(/datum/reagent/oxygen)) - burning_temperature = 0//king chilly - return - burning_temperature = null - -/datum/reagent/cryostylane/on_mob_add(mob/living/consumer, amount) +/datum/reagent/napalm/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - consumer.mob_surgery_speed_mod = 1-((CRYO_SPEED_PREFACTOR * (1 - creation_purity))+CRYO_SPEED_CONSTANT) //10% - 30% slower - consumer.color = COLOR_CYAN - -/datum/reagent/cryostylane/on_mob_delete(mob/living/consumer) - . = ..() - consumer.mob_surgery_speed_mod = 1 - consumer.color = COLOR_WHITE - -//Pauses decay! Does do something, I promise. -/datum/reagent/cryostylane/on_mob_dead(mob/living/carbon/consumer, delta_time) - . = ..() - metabolization_rate = 0.05 * REM //slower consumption when dead - -/datum/reagent/cryostylane/on_mob_life(mob/living/carbon/consumer, delta_time, times_fired) - metabolization_rate = 0.25 * REM//faster consumption when alive - if(consumer.reagents.has_reagent(/datum/reagent/oxygen)) - consumer.reagents.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * delta_time) - consumer.adjust_bodytemperature(-15 * REM * delta_time) - if(ishuman(consumer)) - var/mob/living/carbon/human/humi = consumer - humi.adjust_coretemperature(-15 * REM * delta_time) - ..() - -/datum/reagent/cryostylane/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(reac_volume < 5) - return - for(var/mob/living/simple_animal/slime/exposed_slime in exposed_turf) - exposed_slime.adjustToxLoss(rand(15,30)) - -#undef CRYO_SPEED_PREFACTOR -#undef CRYO_SPEED_CONSTANT + if(istype(exposed_mob) && (methods & (TOUCH|VAPOR))) + exposed_mob.adjust_fire_stacks(min(reac_volume/4, 20)) /datum/reagent/pyrosium name = "Pyrosium" @@ -288,16 +226,12 @@ self_consuming = TRUE burning_temperature = null burning_volume = 0.05 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/pyrosium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + +/datum/reagent/pyrosium/affect_blood(mob/living/carbon/C, removed) if(holder.has_reagent(/datum/reagent/oxygen)) - holder.remove_reagent(/datum/reagent/oxygen, 0.5 * REM * delta_time) - M.adjust_bodytemperature(15 * REM * delta_time) - if(ishuman(M)) - var/mob/living/carbon/human/humi = M - humi.adjust_coretemperature(15 * REM * delta_time) - ..() + holder.remove_reagent(/datum/reagent/oxygen, 0.5 * removed) + C.adjust_bodytemperature(15 * removed) /datum/reagent/pyrosium/burn(datum/reagents/holder) if(holder.has_reagent(/datum/reagent/oxygen)) @@ -305,63 +239,13 @@ return burning_temperature = null -/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective. - name = "Teslium" - description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water." - reagent_state = LIQUID - color = "#20324D" //RGB: 32, 50, 77 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - taste_description = "charged metal" - self_consuming = TRUE - var/shock_timer = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/teslium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - shock_timer++ - if(shock_timer >= rand(5, 30)) //Random shocks are wildly unpredictable - shock_timer = 0 - M.electrocute_act(rand(5, 20), "Teslium in their body", 1, SHOCK_NOGLOVES) //SHOCK_NOGLOVES because it's caused from INSIDE of you - playsound(M, SFX_SPARKS, 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - ..() - -/datum/reagent/teslium/on_mob_metabolize(mob/living/carbon/human/L) - . = ..() - if(!istype(L)) - return - L.physiology.siemens_coeff *= 2 - -/datum/reagent/teslium/on_mob_end_metabolize(mob/living/carbon/human/L) - . = ..() - if(!istype(L)) - return - L.physiology.siemens_coeff *= 0.5 - -/datum/reagent/teslium/energized_jelly - name = "Energized Jelly" - description = "Electrically-charged jelly. Boosts jellypeople's nervous system, but only shocks other lifeforms." - reagent_state = LIQUID - color = "#CAFF43" - taste_description = "jelly" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(isjellyperson(M)) - shock_timer = 0 //immune to shocks - M.AdjustAllImmobility(-40 *REM * delta_time) - M.stamina.adjust(2 * REM * delta_time) - if(isluminescent(M)) - var/mob/living/carbon/human/H = M - var/datum/species/jelly/luminescent/L = H.dna.species - L.extract_cooldown = max(L.extract_cooldown - (20 * REM * delta_time), 0) - ..() - /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." reagent_state = LIQUID color = "#A6FAFF55" taste_description = "the inside of a fire extinguisher" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/firefighting_foam/expose_turf(turf/open/exposed_turf, reac_volume) . = ..() @@ -369,24 +253,31 @@ return if(reac_volume >= 1) - var/obj/effect/particle_effect/foam/firefighting/foam = (locate(/obj/effect/particle_effect/foam) in exposed_turf) + var/obj/effect/particle_effect/fluid/foam/firefighting/foam = (locate(/obj/effect/particle_effect/fluid/foam) in exposed_turf) if(!foam) foam = new(exposed_turf) else if(istype(foam)) foam.lifetime = initial(foam.lifetime) //reduce object churn a little bit when using smoke by keeping existing foam alive a bit longer - var/obj/effect/hotspot/hotspot = exposed_turf.fire + var/obj/effect/hotspot/hotspot = exposed_turf.active_hotspot var/datum/gas_mixture/environment = exposed_turf.return_air() if(hotspot && !isspaceturf(exposed_turf) && environment) if(environment.temperature > T20C) environment.temperature = max(environment.temperature/2,T20C) qdel(hotspot) -/datum/reagent/firefighting_foam/expose_obj(obj/exposed_obj, reac_volume) +/datum/reagent/firefighting_foam/expose_obj(obj/exposed_obj, reac_volume, exposed_temperature) . = ..() exposed_obj.extinguish() -/datum/reagent/firefighting_foam/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/firefighting_foam/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() if(methods & (TOUCH|VAPOR)) exposed_mob.extinguish_mob() //All stacks are removed + +/datum/reagent/sorium + name = "Sorium" + description = "Sends everything flying from the detonation point." + reagent_state = LIQUID + color = "#5A64C8" + taste_description = "air and bitterness" diff --git a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm b/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm deleted file mode 100644 index c1a13295ef34..000000000000 --- a/code/modules/reagents/chemistry/reagents/reaction_agents_reagents.dm +++ /dev/null @@ -1,128 +0,0 @@ -/datum/reagent/reaction_agent - name = "Reaction Agent" - abstract_type = /datum/reagent/reaction_agent - -/datum/reagent/reaction_agent/intercept_reagents_transfer(datum/reagents/target, amount) - if(!target) - return FALSE - if(target.flags & NO_REACT) - return FALSE - if(target.has_reagent(/datum/reagent/stabilizing_agent)) - return FALSE - if(LAZYLEN(target.reagent_list) == 0) - return FALSE - if(LAZYLEN(target.reagent_list) == 1) - if(target.has_reagent(type)) //Allow dispensing into self - return FALSE - return TRUE - -/datum/reagent/reaction_agent/acidic_buffer - name = "Strong Acidic Buffer" - description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another." - color = "#fbc314" - ph = 0 - inverse_chem = null - fallback_icon_state = "acid_buffer_fallback" - ///The strength of the buffer where (volume/holder.total_volume)*strength. So for 1u added to 50u the ph will decrease by 0.4 - var/strength = 30 - -//Consumes self on addition and shifts ph -/datum/reagent/reaction_agent/acidic_buffer/intercept_reagents_transfer(datum/reagents/target, amount) - . = ..() - if(!.) - return - if(target.ph <= ph) - target.my_atom.audible_message(span_warning("The beaker froths as the buffer is added, to no effect.")) - playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) - holder.remove_reagent(type, amount)//Remove from holder because it's not transfered - return - var/ph_change = -((amount/target.total_volume)*strength) - target.adjust_all_reagents_ph(ph_change, ph, 14) - target.my_atom.audible_message(span_warning("The beaker fizzes as the ph changes!")) - playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) - holder.remove_reagent(type, amount) - -/datum/reagent/reaction_agent/basic_buffer - name = "Strong Basic Buffer" - description = "This reagent will consume itself and move the pH of a beaker towards alkalinity when added to another." - color = "#3853a4" - ph = 14 - inverse_chem = null - fallback_icon_state = "base_buffer_fallback" - ///The strength of the buffer where (volume/holder.total_volume)*strength. So for 1u added to 50u the ph will increase by 0.4 - var/strength = 30 - -/datum/reagent/reaction_agent/basic_buffer/intercept_reagents_transfer(datum/reagents/target, amount) - . = ..() - if(!.) - return - if(target.ph >= ph) - target.my_atom.audible_message(span_warning("The beaker froths as the buffer is added, to no effect.")) - playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) - holder.remove_reagent(type, amount)//Remove from holder because it's not transfered - return - var/ph_change = (amount/target.total_volume)*strength - target.adjust_all_reagents_ph(ph_change, 0, ph) - target.my_atom.audible_message(span_warning("The beaker froths as the ph changes!")) - playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) - holder.remove_reagent(type, amount) - -//purity testor/reaction agent prefactors - -/datum/reagent/prefactor_a - name = "Interim Product Alpha" - description = "This reagent is a prefactor to the purity tester reagent, and will react with stable plasma to create it" - color = "#bafa69" - -/datum/reagent/prefactor_b - name = "Interim Product Beta" - description = "This reagent is a prefactor to the reaction speed agent reagent, and will react with stable plasma to create it" - color = "#8a3aa9" - -/datum/reagent/reaction_agent/purity_tester - name = "Purity Tester" - description = "This reagent will consume itself and violently react if there is a highly impure reagent in the beaker." - ph = 3 - color = "#ffffff" - -/datum/reagent/reaction_agent/purity_tester/intercept_reagents_transfer(datum/reagents/target, amount) - . = ..() - if(!.) - return - var/is_inverse = FALSE - for(var/_reagent in target.reagent_list) - var/datum/reagent/reaction_agent/reagent = _reagent - if(reagent.purity <= reagent.inverse_chem_val) - is_inverse = TRUE - if(is_inverse) - target.my_atom.audible_message(span_warning("The beaker bubbles violently as the reagent is added!")) - playsound(target.my_atom, 'sound/chemistry/bufferadd.ogg', 50, TRUE) - else - target.my_atom.audible_message(span_warning("The added reagent doesn't seem to do much.")) - holder.remove_reagent(type, amount) - -/datum/reagent/reaction_agent/speed_agent - name = "Tempomyocin" - description = "This reagent will consume itself and speed up an ongoing reaction, modifying the current reaction's purity by it's own." - ph = 10 - color = "#e61f82" - ///How much the reaction speed is sped up by - for 5u added to 100u, an additional step of 1 will be done up to a max of 2x - var/strength = 20 - - -/datum/reagent/reaction_agent/speed_agent/intercept_reagents_transfer(datum/reagents/target, amount) - . = ..() - if(!.) - return FALSE - if(!length(target.reaction_list))//you can add this reagent to a beaker with no ongoing reactions, so this prevents it from being used up. - return FALSE - amount /= target.reaction_list.len - for(var/_reaction in target.reaction_list) - var/datum/equilibrium/reaction = _reaction - if(!reaction) - CRASH("[_reaction] is in the reaction list, but is not an equilibrium") - var/power = (amount/reaction.target_vol)*strength - power *= creation_purity - power = clamp(power, 0, 2) - reaction.react_timestep(power, creation_purity) - holder.remove_reagent(type, amount) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 7fc61423275d..432d9f905cc6 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -2,14 +2,14 @@ //////////////////////////Poison stuff (Toxins & Acids)/////////////////////// /datum/reagent/toxin - name = "Toxin" + name = "Generic Toxin" description = "A toxic chemical." color = "#CF3600" // rgb: 207, 54, 0 taste_description = "bitterness" taste_mult = 1.2 harmful = TRUE var/toxpwr = 1.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/silent_toxin = FALSE //won't produce a pain message when processed by liver/life() if there isn't another non-silent toxin present. // Are you a bad enough dude to poison your own plants? @@ -18,11 +18,10 @@ if(chems.has_reagent(type, 1)) mytray.adjust_toxic(round(chems.get_reagent_amount(type) * 2)) -/datum/reagent/toxin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/affect_blood(mob/living/carbon/C, removed) if(toxpwr) - M.adjustToxLoss(toxpwr * REM * normalise_creation_purity() * delta_time, 0) + C.adjustToxLoss(toxpwr * removed, 0) . = TRUE - ..() /datum/reagent/toxin/amatoxin name = "Amatoxin" @@ -30,46 +29,36 @@ color = "#792300" // rgb: 121, 35, 0 toxpwr = 2.5 taste_description = "mushroom" - ph = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/mutagen name = "Unstable Mutagen" description = "Might cause unpredictable mutations. Keep away from children." color = "#00FF00" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY - toxpwr = 0 + toxpwr = 0.5 taste_description = "slime" taste_mult = 0.9 - ph = 2.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/mutagen/expose_mob(mob/living/carbon/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/toxin/mutagen/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() - if(!exposed_mob.has_dna() || HAS_TRAIT(exposed_mob, TRAIT_GENELESS) || HAS_TRAIT(exposed_mob, TRAIT_BADDNA)) + if(!iscarbon(exposed_mob) || !exposed_mob.has_dna() || HAS_TRAIT(exposed_mob, TRAIT_GENELESS) || HAS_TRAIT(exposed_mob, TRAIT_BADDNA)) return //No robots, AIs, aliens, Ians or other mobs should be affected by this. - if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|PATCH|INJECT))) - exposed_mob.random_mutate_unique_identity() - exposed_mob.random_mutate_unique_features() + var/mob/living/carbon/C = exposed_mob + if(((methods & VAPOR) && prob(min(33, reac_volume))) || (methods & (INGEST|INJECT))) + C.random_mutate_unique_identity() + C.random_mutate_unique_features() if(prob(98)) - exposed_mob.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) + C.easy_random_mutate(NEGATIVE+MINOR_NEGATIVE) else - exposed_mob.easy_random_mutate(POSITIVE) - exposed_mob.updateappearance() - exposed_mob.domutcheck() - -/datum/reagent/toxin/mutagen/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - C.adjustToxLoss(0.5 * delta_time * REM) - return ..() + C.easy_random_mutate(POSITIVE) + C.updateappearance() + C.domutcheck() /datum/reagent/toxin/mutagen/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) mytray.mutation_roll(user) if(chems.has_reagent(type, 1)) mytray.adjust_toxic(3) //It is still toxic, mind you, but not to the same degree. -#define LIQUID_PLASMA_BP (50+T0C) - /datum/reagent/toxin/plasma name = "Plasma" description = "Plasma in its liquid form." @@ -80,10 +69,9 @@ toxpwr = 3 material = /datum/material/plasma penetrates_skin = NONE - ph = 4 burning_temperature = 4500//plasma is hot!! burning_volume = 0.3//But burns fast - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + codex_mechanics = "Plasma will ignite at 519.15 K, take care when handling." /datum/reagent/toxin/plasma/on_new(data) . = ..() @@ -93,35 +81,41 @@ UnregisterSignal(holder, COMSIG_REAGENTS_TEMP_CHANGE) return ..() -/datum/reagent/toxin/plasma/on_mob_life(mob/living/carbon/C, delta_time, times_fired) +/datum/reagent/toxin/plasma/affect_blood(mob/living/carbon/C, removed) + . = ..() if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) - holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * delta_time) - C.adjustPlasma(20 * REM * delta_time) - return ..() - -/// Handles plasma boiling. + holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * removed) + C.adjustPlasma(20 * removed) + if(isplasmaman(C)) + if(prob(10)) + for(var/obj/item/bodypart/BP as anything in C.bodyparts) + BP.heal_bones() + +// Plasma will attempt to ignite at the ignition temperature. /datum/reagent/toxin/plasma/proc/on_temp_change(datum/reagents/_holder, old_temp) SIGNAL_HANDLER - if(holder.chem_temp < LIQUID_PLASMA_BP) + if(holder.chem_temp < PHORON_FLASHPOINT) return - if(!holder.my_atom) + if(!holder.my_atom || !(holder.flags & OPENCONTAINER)) return var/turf/open/T = get_turf(holder.my_atom) if(!istype(T)) return - T.assume_gas(GAS_PLASMA, volume, holder.chem_temp) + + holder.my_atom.visible_message(span_danger("[holder.my_atom] emits a shriek as hot plasma fills the air.")) + T.assume_gas(GAS_PLASMA, volume / REAGENT_GAS_EXCHANGE_FACTOR, holder.chem_temp) holder.del_reagent(type) -/datum/reagent/toxin/plasma/expose_turf(turf/open/exposed_turf, reac_volume) +/datum/reagent/toxin/plasma/expose_turf(turf/exposed_turf, reac_volume, exposed_temperature) + . = ..() if(!istype(exposed_turf)) return - var/temp = holder ? holder.chem_temp : T20C - if(temp >= LIQUID_PLASMA_BP) - exposed_turf.assume_gas(GAS_PLASMA, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, holder.chem_temp) - return ..() -/datum/reagent/toxin/plasma/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel! + if(exposed_temperature >= PHORON_FLASHPOINT) + exposed_turf.assume_gas(GAS_PLASMA, reac_volume / REAGENT_GAS_EXCHANGE_FACTOR, exposed_temperature) + +/datum/reagent/toxin/plasma/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature, datum/reagents/source, methods, show_message, touch_protection) . = ..() if(methods & (TOUCH|VAPOR)) exposed_mob.adjust_fire_stacks(reac_volume / 5) @@ -138,41 +132,37 @@ specific_heat = SPECIFIC_HEAT_PLASMA toxpwr = 3 material = /datum/material/hot_ice - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/hot_ice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + +/datum/reagent/toxin/hot_ice/affect_blood(mob/living/carbon/C, removed) + . = ..() if(holder.has_reagent(/datum/reagent/medicine/epinephrine)) - holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * REM * delta_time) - M.adjustPlasma(20 * REM * delta_time) - M.adjust_bodytemperature(-7 * TEMPERATURE_DAMAGE_COEFFICIENT * REM * delta_time, M.get_body_temp_normal()) - if(ishuman(M)) - var/mob/living/carbon/human/humi = M - humi.adjust_coretemperature(-7 * REM * TEMPERATURE_DAMAGE_COEFFICIENT * delta_time, M.get_body_temp_normal()) - return ..() + holder.remove_reagent(/datum/reagent/medicine/epinephrine, 2 * removed) + C.adjustPlasma(20 * removed) + C.adjust_bodytemperature(-7 * TEMPERATURE_DAMAGE_COEFFICIENT * removed, C.get_body_temp_normal()) /datum/reagent/toxin/lexorin name = "Lexorin" description = "A powerful poison used to stop respiration." color = "#7DC3A0" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY - toxpwr = 0 taste_description = "acid" - ph = 1.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/lexorin/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - . = TRUE - if(HAS_TRAIT(C, TRAIT_NOBREATH)) - . = FALSE +/datum/reagent/toxin/lexorin/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustBruteLoss(10 * removed, FALSE) + if (prob(10)) + C.visible_message( + span_warning("\The [C]'s skin fizzles and flakes away!"), + span_danger("Your skin fizzles and flakes away!") + ) + + if(!HAS_TRAIT(C, TRAIT_NOBREATH)) + C.adjustOxyLoss(15 * removed, 0) + if(C.losebreath < (30)) + C.losebreath++ - if(.) - C.adjustOxyLoss(5 * REM * normalise_creation_purity() * delta_time, 0) - C.losebreath += 2 * REM * normalise_creation_purity() * delta_time - if(DT_PROB(10, delta_time)) - C.emote("gasp") - ..() + return TRUE /datum/reagent/toxin/slimejelly name = "Slime Jelly" @@ -181,18 +171,15 @@ toxpwr = 0 taste_description = "slime" taste_mult = 1.3 - ph = 10 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/slimejelly/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(5, delta_time)) - to_chat(M, span_danger("Your insides are burning!")) - M.adjustToxLoss(rand(20, 60), 0) - . = TRUE - else if(DT_PROB(23, delta_time)) - M.heal_bodypart_damage(5) - . = TRUE - ..() + +/datum/reagent/toxin/slimejelly/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(prob(5)) + to_chat(C, span_danger("Your insides burn!")) + C.adjustToxLoss(rand(20, 60), 0) + else if(prob(30)) + C.heal_bodypart_damage(5, updating_health = FALSE) /datum/reagent/toxin/minttoxin name = "Mint Toxin" @@ -200,13 +187,12 @@ color = "#CF3600" // rgb: 207, 54, 0 toxpwr = 0 taste_description = "mint" - ph = 8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/minttoxin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(HAS_TRAIT(M, TRAIT_FAT)) - M.inflate_gib() - return ..() + +/datum/reagent/toxin/minttoxin/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(HAS_TRAIT(C, TRAIT_FAT)) + C.inflate_gib() /datum/reagent/toxin/carpotoxin name = "Carpotoxin" @@ -215,32 +201,33 @@ color = "#003333" // rgb: 0, 51, 51 toxpwr = 1 taste_description = "fish" - ph = 12 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/zombiepowder name = "Zombie Powder" description = "A strong neurotoxin that puts the subject into a death-like state." silent_toxin = TRUE reagent_state = SOLID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#669900" // rgb: 102, 153, 0 toxpwr = 0.5 taste_description = "death" penetrates_skin = NONE - ph = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/zombiepowder/on_mob_metabolize(mob/living/holder_mob) + +/datum/reagent/toxin/zombiepowder/affect_blood(mob/living/carbon/C, removed) . = ..() - holder_mob.adjustOxyLoss(0.5*REM, 0) - if(data?["method"] & INGEST) - holder_mob.fakedeath(type) + if(!HAS_TRAIT(C, TRAIT_ZOMBIEPOWDER)) + if(data?["method"] & INGEST) + spawn(-1) + C.fakedeath(type) -/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/holder_mob) - holder_mob.cure_fakedeath(type) - return ..() + ADD_TRAIT(C, TRAIT_ZOMBIEPOWDER, CHEM_TRAIT_SOURCE(CHEM_BLOOD)) + C.adjustOxyLoss(0.5*removed, 0) + +/datum/reagent/toxin/zombiepowder/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_ZOMBIEPOWDER, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT(C, TRAIT_ZOMBIEPOWDER)) + C.cure_fakedeath(type) /datum/reagent/toxin/zombiepowder/on_transfer(atom/target_atom, methods, trans_volume) . = ..() @@ -250,65 +237,55 @@ LAZYINITLIST(zombiepowder.data) zombiepowder.data["method"] |= INGEST -/datum/reagent/toxin/zombiepowder/on_mob_life(mob/living/M, delta_time, times_fired) - ..() - if(HAS_TRAIT(M, TRAIT_FAKEDEATH) && HAS_TRAIT(M, TRAIT_DEATHCOMA)) +/datum/reagent/toxin/zombiepowder/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(HAS_TRAIT(C, TRAIT_FAKEDEATH) && HAS_TRAIT(C, TRAIT_DEATHCOMA)) return TRUE switch(current_cycle) if(1 to 5) - M.adjust_timed_status_effect(1 SECONDS * REM * delta_time, /datum/status_effect/confusion) - M.adjust_drowsyness(1 * REM * delta_time) - M.adjust_timed_status_effect(6 SECONDS * REM * delta_time, /datum/status_effect/speech/slurring/drunk) + C.adjust_timed_status_effect(1 SECONDS * removed, /datum/status_effect/confusion) + C.adjust_drowsyness(1 * removed) + C.adjust_timed_status_effect(6 SECONDS * removed, /datum/status_effect/speech/slurring/drunk) if(5 to 8) - M.stamina.adjust(40 * REM * delta_time) + C.stamina.adjust(40 * removed) if(9 to INFINITY) - M.fakedeath(type) + spawn(-1) + C.fakedeath(type) /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." reagent_state = SOLID color = "#664700" // rgb: 102, 71, 0 - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 0.8 taste_description = "death" - ph = 14.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_FAKEDEATH, type) -/datum/reagent/toxin/ghoulpowder/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_FAKEDEATH, type) - ..() +/datum/reagent/toxin/ghoulpowder/on_mob_metabolize(mob/living/carbon/C, class) + ADD_TRAIT(C, TRAIT_FAKEDEATH, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/toxin/ghoulpowder/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOxyLoss(1 * REM * delta_time, 0) - ..() - . = TRUE +/datum/reagent/toxin/ghoulpowder/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_FAKEDEATH, CHEM_TRAIT_SOURCE(class)) + +/datum/reagent/toxin/ghoulpowder/affect_blood(mob/living/carbon/C, removed) + C.adjustOxyLoss(1 * removed, 0) + return ..() /datum/reagent/toxin/mindbreaker - name = "Mindbreaker Toxin" + name = "Lysergic acid diethylamide" description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality." color = "#B31008" // rgb: 139, 166, 233 toxpwr = 0 taste_description = "sourness" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY - ph = 11 - inverse_chem = /datum/reagent/impurity/rosenol - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/hallucinogens = 18) //7.2 per 2 seconds -/datum/reagent/toxin/mindbreaker/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(HAS_TRAIT(M, TRAIT_INSANITY)) - M.hallucination = 0 +/datum/reagent/toxin/mindbreaker/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(HAS_TRAIT(C, TRAIT_INSANITY)) + C.hallucination = 0 else - M.hallucination += 5 * REM * delta_time - - return ..() + C.hallucination += 5 * removed /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" @@ -317,8 +294,7 @@ toxpwr = 1 taste_mult = 1 penetrates_skin = NONE - ph = 2.7 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + // Plant-B-Gone is just as bad /datum/reagent/toxin/plantbgone/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -339,7 +315,7 @@ var/obj/structure/spacevine/SV = exposed_obj SV.on_chem_effect(src) -/datum/reagent/toxin/plantbgone/expose_mob(mob/living/exposed_mob, methods = TOUCH, reac_volume) +/datum/reagent/toxin/plantbgone/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() var/damage = min(round(0.4 * reac_volume, 0.1), 10) if(exposed_mob.mob_biotypes & MOB_PLANT) @@ -354,8 +330,7 @@ name = "Weed Killer" description = "A harmful toxic mixture to kill weeds. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 - ph = 3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //Weed Spray /datum/reagent/toxin/plantbgone/weedkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -370,8 +345,7 @@ description = "A harmful toxic mixture to kill pests. Do not ingest!" color = "#4B004B" // rgb: 75, 0, 75 toxpwr = 1 - ph = 3.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //Pest Spray /datum/reagent/toxin/pestkiller/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -381,18 +355,28 @@ mytray.adjust_toxic(round(chems.get_reagent_amount(type) * 1)) mytray.adjust_pestlevel(-rand(1,2)) -/datum/reagent/toxin/pestkiller/expose_mob(mob/living/exposed_mob, methods=TOUCH, reac_volume) +/datum/reagent/toxin/pestkiller/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature = T20C, datum/reagents/source, methods=TOUCH, show_message = TRUE, touch_protection = 0) . = ..() if(exposed_mob.mob_biotypes & MOB_BUG) var/damage = min(round(0.4*reac_volume, 0.1),10) exposed_mob.adjustToxLoss(damage) +/datum/reagent/toxin/pestkiller/affect_blood(mob/living/carbon/C, removed) + if(!(ismoth(C) || isflyperson(C))) + return + + C.adjustToxLoss(3 * removed, FALSE) + return TRUE + +/datum/reagent/toxin/pestkiller/affect_touch(mob/living/carbon/C, removed) + return affect_blood(C, removed) + /datum/reagent/toxin/pestkiller/organic name = "Natural Pest Killer" description = "An organic mixture used to kill pests, with less of the side effects. Do not ingest!" color = "#4b2400" // rgb: 75, 0, 75 toxpwr = 1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + //Pest Spray /datum/reagent/toxin/pestkiller/organic/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -407,14 +391,12 @@ description = "A natural toxin produced by blob spores that inhibits vision when ingested." color = "#9ACD32" toxpwr = 1 - ph = 11 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/spore/on_mob_life(mob/living/carbon/C, delta_time, times_fired) +/datum/reagent/toxin/spore/affect_blood(mob/living/carbon/C, removed) + . = ..() C.damageoverlaytemp = 60 - C.update_damage_hud() - C.blur_eyes(3 * REM * delta_time) - return ..() + C.blur_eyes(3 * removed) /datum/reagent/toxin/spore_burning name = "Burning Spore Toxin" @@ -422,41 +404,34 @@ color = "#9ACD32" toxpwr = 0.5 taste_description = "burning" - ph = 13 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/spore_burning/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjust_fire_stacks(2 * REM * delta_time) - M.ignite_mob() - return ..() +/datum/reagent/toxin/spore_burning/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjust_fire_stacks(2 * removed) + C.ignite_mob() /datum/reagent/toxin/chloralhydrate name = "Chloral Hydrate" description = "A powerful sedative that induces confusion and drowsiness before putting its target to sleep." silent_toxin = TRUE reagent_state = SOLID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#000067" // rgb: 0, 0, 103 toxpwr = 0 - metabolization_rate = 1.5 * REAGENTS_METABOLISM - ph = 11 - inverse_chem = /datum/reagent/impurity/chloralax - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + metabolization_rate = 0.3 -/datum/reagent/toxin/chloralhydrate/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/chloralhydrate/affect_blood(mob/living/carbon/C, removed) + . = ..() switch(current_cycle) if(1 to 10) - M.adjust_timed_status_effect(2 SECONDS * REM * normalise_creation_purity() * delta_time, /datum/status_effect/confusion) - M.adjust_drowsyness(2 * REM * normalise_creation_purity() * delta_time) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/confusion) + C.adjust_drowsyness(2 * removed) if(10 to 50) - M.Sleeping(40 * REM * normalise_creation_purity() * delta_time) - . = TRUE + C.Sleeping(40 * removed) if(51 to INFINITY) - M.Sleeping(40 * REM * normalise_creation_purity() * delta_time) - M.adjustToxLoss(1 * (current_cycle - 50) * REM * normalise_creation_purity() * delta_time, 0) + C.Sleeping(40 * removed) + C.adjustToxLoss(1 * (current_cycle - 50) * removed, 0) . = TRUE - ..() /datum/reagent/toxin/fakebeer //disguised as normal beer for use by emagged brobots name = "Beer...?" @@ -467,17 +442,17 @@ glass_icon_state = "beerglass" glass_name = "glass of beer" glass_desc = "A freezing pint of beer." - ph = 2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/fakebeer/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/fakebeer/affect_blood(mob/living/carbon/C, removed) + . = ..() switch(current_cycle) - if(1 to 50) - M.Sleeping(40 * REM * delta_time) + if(40 to 50) + C.adjust_timed_status_effect(2 SECONDS * removed, /datum/status_effect/confusion) + C.adjust_drowsyness(2 * removed) if(51 to INFINITY) - M.Sleeping(40 * REM * delta_time) - M.adjustToxLoss(1 * (current_cycle - 50) * REM * delta_time, 0) - return ..() + C.Sleeping(40 * removed) + C.adjustToxLoss(1 * (current_cycle - 50) * removed, 0) /datum/reagent/toxin/coffeepowder name = "Coffee Grounds" @@ -485,8 +460,7 @@ reagent_state = SOLID color = "#5B2E0D" // rgb: 91, 46, 13 toxpwr = 0.5 - ph = 4.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/teapowder name = "Ground Tea Leaves" @@ -495,8 +469,7 @@ color = "#7F8400" // rgb: 127, 132, 0 toxpwr = 0.1 taste_description = "green tea" - ph = 4.9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/mushroom_powder name = "Mushroom Powder" @@ -505,24 +478,19 @@ color = "#67423A" // rgb: 127, 132, 0 toxpwr = 0.1 taste_description = "mushrooms" - ph = 8.0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" description = "A nonlethal poison that inhibits speech in its victim." silent_toxin = TRUE - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#F0F8FF" // rgb: 240, 248, 255 toxpwr = 0 taste_description = "silence" - ph = 12.2 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.silent = max(M.silent, 3 * REM * normalise_creation_purity() * delta_time) - ..() +/datum/reagent/toxin/mutetoxin/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.silent = max(C.silent, 3 * removed) /datum/reagent/toxin/staminatoxin name = "Tirizene" @@ -531,13 +499,12 @@ color = "#6E2828" data = 15 toxpwr = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.stamina.adjust(data * REM * delta_time) + +/datum/reagent/toxin/staminatoxin/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.stamina.adjust(data * removed) data = max(data - 1, 3) - ..() - . = TRUE /datum/reagent/toxin/polonium name = "Polonium" @@ -546,15 +513,15 @@ color = "#787878" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/polonium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if (!HAS_TRAIT(M, TRAIT_IRRADIATED) && SSradiation.can_irradiate_basic(M)) - M.AddComponent(/datum/component/irradiated) +/datum/reagent/toxin/polonium/affect_blood(mob/living/carbon/C, removed) + . = ..() + if (!HAS_TRAIT(C, TRAIT_IRRADIATED) && SSradiation.can_irradiate_basic(C)) + C.AddComponent(/datum/component/irradiated) else - M.adjustToxLoss(1 * REM * delta_time) - - ..() + C.adjustToxLoss(1 * removed, FALSE) + return TRUE /datum/reagent/toxin/histamine name = "Histamine" @@ -565,53 +532,32 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM overdose_threshold = 30 toxpwr = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/histamine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(30, delta_time)) +/datum/reagent/toxin/histamine/affect_blood(mob/living/carbon/C, removed) + if(prob(33)) switch(pick(1, 2, 3, 4)) if(1) - to_chat(M, span_danger("You can barely see!")) - M.blur_eyes(3) + to_chat(C, span_danger("You can barely see!")) + C.blur_eyes(3) if(2) - M.emote("cough") + spawn(-1) + C.emote("cough") if(3) - M.emote("sneeze") + spawn(-1) + C.emote("sneeze") if(4) if(prob(75)) - to_chat(M, span_danger("You scratch at an itch.")) - M.adjustBruteLoss(2*REM, 0) + to_chat(C, span_danger("You scratch at an itch.")) + C.adjustBruteLoss(2*removed, 0) . = TRUE - ..() -/datum/reagent/toxin/histamine/overdose_process(mob/living/M, delta_time, times_fired) - M.adjustOxyLoss(2 * REM * delta_time, FALSE) - M.adjustBruteLoss(2 * REM * delta_time, FALSE, FALSE, BODYTYPE_ORGANIC) - M.adjustToxLoss(2 * REM * delta_time, FALSE) - ..() +/datum/reagent/toxin/histamine/overdose_process(mob/living/carbon/C) + C.adjustOxyLoss(2, FALSE) + C.adjustBruteLoss(2, FALSE, FALSE, BODYTYPE_ORGANIC) + C.adjustToxLoss(2, FALSE) . = TRUE -/datum/reagent/toxin/formaldehyde - name = "Formaldehyde" - description = "Formaldehyde, on its own, is a fairly weak toxin. It contains trace amounts of Histamine, very rarely making it decay into Histamine." - silent_toxin = TRUE - reagent_state = LIQUID - color = "#B4004B" - metabolization_rate = 0.5 * REAGENTS_METABOLISM - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY - toxpwr = 1 - ph = 2.0 - inverse_chem = /datum/reagent/impurity/methanol - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/formaldehyde/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(2.5, delta_time)) - holder.add_reagent(/datum/reagent/toxin/histamine, pick(5,15)) - holder.remove_reagent(/datum/reagent/toxin/formaldehyde, 1.2) - else - return ..() - /datum/reagent/toxin/venom name = "Venom" description = "An exotic poison extracted from highly toxic fauna. Causes scaling amounts of toxin damage and bruising depending and dosage. Often decays into Histamine." @@ -619,30 +565,32 @@ color = "#F0FFF0" metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE ///Mob Size of the current mob sprite. var/current_size = RESIZE_DEFAULT_SIZE -/datum/reagent/toxin/venom/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/venom/affect_blood(mob/living/carbon/C, removed) + ADD_TRAIT(C, TRAIT_VENOMSIZE, CHEM_TRAIT_SOURCE(CHEM_BLOOD)) var/newsize = 1.1 * RESIZE_DEFAULT_SIZE - M.resize = newsize/current_size + C.resize = newsize/current_size current_size = newsize - M.update_transform() + C.update_transform() toxpwr = 0.1 * volume - M.adjustBruteLoss((0.3 * volume) * REM * delta_time, 0) + C.adjustBruteLoss((0.3 * volume) * removed, 0) . = TRUE - if(DT_PROB(8, delta_time)) + if(prob(15)) holder.add_reagent(/datum/reagent/toxin/histamine, pick(5, 10)) holder.remove_reagent(/datum/reagent/toxin/venom, 1.1) else ..() -/datum/reagent/toxin/venom/on_mob_end_metabolize(mob/living/M) - M.resize = RESIZE_DEFAULT_SIZE/current_size - current_size = RESIZE_DEFAULT_SIZE - M.update_transform() - ..() +/datum/reagent/toxin/venom/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_VENOMSIZE, CHEM_TRAIT_SOURCE(class)) + if(!HAS_TRAIT(C, TRAIT_VENOMSIZE)) + C.resize = RESIZE_DEFAULT_SIZE/current_size + current_size = RESIZE_DEFAULT_SIZE + C.update_transform() /datum/reagent/toxin/fentanyl name = "Fentanyl" @@ -650,22 +598,16 @@ reagent_state = LIQUID color = "#64916E" metabolization_rate = 0.5 * REAGENTS_METABOLISM - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 0 - ph = 9 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + addiction_types = list(/datum/addiction/opiods = 25) -/datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * REM * normalise_creation_purity() * delta_time, 150) - if(M.toxloss <= 60) - M.adjustToxLoss(1 * REM * normalise_creation_purity() * delta_time, 0) - if(current_cycle >= 4) - SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smacked out", /datum/mood_event/narcotic_heavy, name) +/datum/reagent/toxin/fentanyl/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3 * removed, 150, updating_health = FALSE) + if(C.getToxLoss() <= 60) + C.adjustToxLoss(1 * removed, 0) if(current_cycle >= 18) - M.Sleeping(40 * REM * normalise_creation_purity() * delta_time) - ..() + C.Sleeping(40 * removed) return TRUE /datum/reagent/toxin/cyanide @@ -673,21 +615,18 @@ description = "An infamous poison known for its use in assassination. Causes small amounts of toxin damage with a small chance of oxygen damage or a stun." reagent_state = LIQUID color = "#00B4FF" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 1.25 - ph = 9.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/cyanide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(2.5, delta_time)) - M.losebreath += 1 - if(DT_PROB(4, delta_time)) - to_chat(M, span_danger("You feel horrendously weak!")) - M.Stun(40) - M.adjustToxLoss(2*REM * normalise_creation_purity(), 0) - return ..() + + +/datum/reagent/toxin/cyanide/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(prob(5)) + C.losebreath += 1 + if(prob(8)) + to_chat(C, span_danger("You feel horrendously weak!")) + C.Stun(40) + C.adjustToxLoss(2 * removed, 0) /datum/reagent/toxin/bad_food name = "Bad Food" @@ -697,40 +636,55 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0.5 taste_description = "bad cooking" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + /datum/reagent/toxin/itching_powder name = "Itching Powder" description = "A powder that induces itching upon contact with the skin. Causes the victim to scratch at their itches and has a very low chance to decay into Histamine." silent_toxin = TRUE reagent_state = LIQUID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#C8C8C8" metabolization_rate = 0.4 * REAGENTS_METABOLISM toxpwr = 0 - ph = 7 penetrates_skin = TOUCH|VAPOR - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/itching_powder/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(8, delta_time)) - to_chat(M, span_danger("You scratch at your head.")) - M.adjustBruteLoss(0.2*REM, 0) + +/datum/reagent/toxin/itching_powder/affect_blood(mob/living/carbon/C, removed) + if(prob(15)) + to_chat(C, span_danger("You scratch at your head.")) + C.adjustBruteLoss(0.2*removed, 0) . = TRUE - if(DT_PROB(8, delta_time)) - to_chat(M, span_danger("You scratch at your leg.")) - M.adjustBruteLoss(0.2*REM, 0) + if(prob(15)) + to_chat(C, span_danger("You scratch at your leg.")) + C.adjustBruteLoss(0.2*removed, 0) . = TRUE - if(DT_PROB(8, delta_time)) - to_chat(M, span_danger("You scratch at your arm.")) - M.adjustBruteLoss(0.2*REM, 0) + if(prob(15)) + to_chat(C, span_danger("You scratch at your arm.")) + C.adjustBruteLoss(0.2*removed, 0) . = TRUE - if(DT_PROB(1.5, delta_time)) + if(prob(3)) holder.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) holder.remove_reagent(/datum/reagent/toxin/itching_powder,1.2) return ..() + return TRUE + +/datum/reagent/toxin/itching_powder/affect_touch(mob/living/carbon/C, removed) + if(prob(15)) + to_chat(C, span_danger("You scratch at your head.")) + C.adjustBruteLoss(0.2*removed, 0) + . = TRUE + if(prob(15)) + to_chat(C, span_danger("You scratch at your leg.")) + C.adjustBruteLoss(0.2*removed, 0) + . = TRUE + if(prob(15)) + to_chat(C, span_danger("You scratch at your arm.")) + C.adjustBruteLoss(0.2*removed, 0) + . = TRUE + if(prob(3)) + C.bloodstream.add_reagent(/datum/reagent/toxin/histamine,rand(1,3)) + return /datum/reagent/toxin/initropidril name = "Initropidril" @@ -740,10 +694,10 @@ color = "#7F10C0" metabolization_rate = 0.5 * REAGENTS_METABOLISM toxpwr = 2.5 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/initropidril/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - if(DT_PROB(13, delta_time)) +/datum/reagent/toxin/initropidril/affect_blood(mob/living/carbon/C, removed) + if(prob(25)) var/picked_option = rand(1,3) switch(picked_option) if(1) @@ -754,10 +708,10 @@ C.adjustOxyLoss(rand(5,25), 0) . = TRUE if(3) - if(!C.undergoing_cardiac_arrest() && C.can_heartattack()) - C.set_heartattack(TRUE) - if(C.stat <= SOFT_CRIT) - C.visible_message(span_userdanger("[C] clutches at [C.p_their()] chest as if [C.p_their()] heart stopped!")) + if(C.set_heartattack(TRUE)) + log_health(C, "Heart stopped due to initropidil.") + if(C.stat < UNCONSCIOUS) + C.visible_message(span_userdanger("[C] clutches at [C.p_their()] chest!")) else C.losebreath += 10 C.adjustOxyLoss(rand(5,25), 0) @@ -773,15 +727,13 @@ metabolization_rate = 0.25 * REAGENTS_METABOLISM toxpwr = 0 taste_mult = 0 // undetectable, I guess? - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/pancuronium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/pancuronium/affect_blood(mob/living/carbon/C, removed) if(current_cycle >= 10) - M.Stun(40 * REM * delta_time) - . = TRUE - if(DT_PROB(10, delta_time)) - M.losebreath += 4 - ..() + C.Stun(40 * removed) + if(prob(20)) + C.losebreath += 4 /datum/reagent/toxin/sodium_thiopental name = "Sodium Thiopental" @@ -791,21 +743,20 @@ color = "#6496FA" metabolization_rate = 0.75 * REAGENTS_METABOLISM toxpwr = 0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/sodium_thiopental/on_mob_add(mob/living/L, amount) +/datum/reagent/toxin/sodium_thiopental/on_mob_add(mob/living/carbon/C, amount, class) . = ..() - ADD_TRAIT(L, TRAIT_ANTICONVULSANT, name) + ADD_TRAIT(C, TRAIT_ANTICONVULSANT, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/toxin/sodium_thiopental/on_mob_delete(mob/living/L) +/datum/reagent/toxin/sodium_thiopental/on_mob_delete(mob/living/carbon/C, class) . = ..() - REMOVE_TRAIT(L, TRAIT_ANTICONVULSANT, name) + REMOVE_TRAIT(C, TRAIT_ANTICONVULSANT, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/toxin/sodium_thiopental/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/sodium_thiopental/affect_blood(mob/living/carbon/C, removed) if(current_cycle >= 10) - M.Sleeping(40 * REM * delta_time) - M.stamina.adjust(-10 * REM * delta_time) - ..() + C.Sleeping(40 * removed) + C.stamina.adjust(-10 * removed) return TRUE /datum/reagent/toxin/sulfonal @@ -813,18 +764,15 @@ description = "A stealthy poison that deals minor toxin damage and eventually puts the target to sleep." silent_toxin = TRUE reagent_state = LIQUID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#7DC3A0" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 0.5 - ph = 6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/sulfonal/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + +/datum/reagent/toxin/sulfonal/affect_blood(mob/living/carbon/C, removed) + . = ..() if(current_cycle >= 22) - M.Sleeping(40 * REM * normalise_creation_purity() * delta_time) - return ..() + C.Sleeping(40 * removed) /datum/reagent/toxin/amanitin name = "Amanitin" @@ -834,17 +782,18 @@ color = "#FFFFFF" toxpwr = 0 metabolization_rate = 0.5 * REAGENTS_METABOLISM - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + var/delayed_toxin_damage = 0 -/datum/reagent/toxin/amanitin/on_mob_life(mob/living/M, delta_time, times_fired) - delayed_toxin_damage += (delta_time * 3) +/datum/reagent/toxin/amanitin/affect_blood(mob/living/carbon/C, removed) . = ..() + delayed_toxin_damage += (removed * 3) -/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M) - M.log_message("has taken [delayed_toxin_damage] toxin damage from amanitin toxin", LOG_ATTACK) - M.adjustToxLoss(delayed_toxin_damage) - . = ..() +/datum/reagent/toxin/amanitin/on_mob_end_metabolize(mob/living/carbon/C, class) + C.log_message("has taken [delayed_toxin_damage] toxin damage from amanitin toxin", LOG_ATTACK) + C.adjustToxLoss(delayed_toxin_damage, FALSE) + delayed_toxin_damage = 0 + return TRUE /datum/reagent/toxin/lipolicide name = "Lipolicide" @@ -852,61 +801,17 @@ silent_toxin = TRUE taste_description = "mothballs" reagent_state = LIQUID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#F0FFF0" metabolization_rate = 0.5 * REAGENTS_METABOLISM toxpwr = 0 - ph = 6 - inverse_chem = /datum/reagent/impurity/ipecacide - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/lipolicide/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.nutrition <= NUTRITION_LEVEL_STARVING) - M.adjustToxLoss(1 * REM * delta_time, 0) - M.adjust_nutrition(-3 * REM * normalise_creation_purity() * delta_time) // making the chef more valuable, one meme trap at a time - M.overeatduration = 0 - return ..() -/datum/reagent/toxin/coniine - name = "Coniine" - description = "Coniine metabolizes extremely slowly, but deals high amounts of toxin damage and stops breathing." - reagent_state = LIQUID - color = "#7DC3A0" - metabolization_rate = 0.06 * REAGENTS_METABOLISM - toxpwr = 1.75 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/coniine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.losebreath < 5) - M.losebreath = min(M.losebreath + 5 * REM * delta_time, 5) - return ..() - -/datum/reagent/toxin/spewium - name = "Spewium" - description = "A powerful emetic, causes uncontrollable vomiting. May result in vomiting organs at high doses." - reagent_state = LIQUID - color = "#2f6617" //A sickly green color - metabolization_rate = REAGENTS_METABOLISM - overdose_threshold = 29 - toxpwr = 0 - taste_description = "vomit" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE - -/datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C, delta_time, times_fired) - .=..() - if(current_cycle >= 11 && DT_PROB(min(30, current_cycle), delta_time)) - C.vomit(10, prob(10), prob(50), rand(0,4), TRUE) - for(var/datum/reagent/toxin/R in C.reagents.reagent_list) - if(R != src) - C.reagents.remove_reagent(R.type,1) - -/datum/reagent/toxin/spewium/overdose_process(mob/living/carbon/C, delta_time, times_fired) +/datum/reagent/toxin/lipolicide/affect_blood(mob/living/carbon/C, removed) . = ..() - if(current_cycle >= 33 && DT_PROB(7.5, delta_time)) - C.spew_organ() - C.vomit(0, TRUE, TRUE, 4) - to_chat(C, span_userdanger("You feel something lumpy come up as you vomit.")) + if(C.nutrition <= NUTRITION_LEVEL_STARVING) + C.adjustToxLoss(1 * removed, 0) + . = TRUE + C.adjust_nutrition(-3 * removed) // making the chef more valuable, one meme trap at a time + C.overeatduration = 0 /datum/reagent/toxin/curare name = "Curare" @@ -915,67 +820,68 @@ color = "#191919" metabolization_rate = 0.125 * REAGENTS_METABOLISM toxpwr = 1 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/curare/affect_blood(mob/living/carbon/C, removed) + . = ..() if(current_cycle >= 11) - M.Paralyze(60 * REM * delta_time) - M.adjustOxyLoss(0.5*REM*delta_time, 0) + C.Paralyze(60 * removed) + C.adjustOxyLoss(0.5 * removed, 0) . = TRUE - ..() /datum/reagent/toxin/heparin //Based on a real-life anticoagulant. I'm not a doctor, so this won't be realistic. name = "Heparin" description = "A powerful anticoagulant. All open cut wounds on the victim will open up and bleed much faster" silent_toxin = TRUE reagent_state = LIQUID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#C8C8C8" //RGB: 200, 200, 200 metabolization_rate = 0.2 * REAGENTS_METABOLISM toxpwr = 0 - ph = 11.6 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/heparin/on_mob_metabolize(mob/living/M) - ADD_TRAIT(M, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() +/datum/reagent/toxin/heparin/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_BLOODY_MESS, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/toxin/heparin/on_mob_end_metabolize(mob/living/M) - REMOVE_TRAIT(M, TRAIT_BLOODY_MESS, /datum/reagent/toxin/heparin) - return ..() +/datum/reagent/toxin/heparin/affect_blood(mob/living/carbon/C, removed) + . = ..() + APPLY_CHEM_EFFECT(C, CE_ANTICOAGULANT, 1) + +/datum/reagent/toxin/heparin/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_BLOODY_MESS, CHEM_TRAIT_SOURCE(class)) /datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious name = "Rotatium" description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild." silent_toxin = TRUE reagent_state = LIQUID - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY color = "#AC88CA" //RGB: 172, 136, 202 metabolization_rate = 0.6 * REAGENTS_METABOLISM toxpwr = 0.5 - ph = 6.2 taste_description = "spinning" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/rotatium/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - if(M.hud_used) + +/datum/reagent/toxin/rotatium/affect_blood(mob/living/carbon/C, removed) + . = ..() + if(C.hud_used) if(current_cycle >= 20 && (current_cycle % 20) == 0) - var/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + ADD_TRAIT(C, TRAIT_ROTATIUM, CHEM_TRAIT_SOURCE(CHEM_BLOOD)) + var/atom/movable/plane_master_controller/pm_controller = C.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/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?.hud_used) - var/atom/movable/plane_master_controller/pm_controller = M.hud_used.plane_master_controllers[PLANE_MASTERS_GAME] + +/datum/reagent/toxin/rotatium/on_mob_end_metabolize(mob/living/carbon/C, class) + REMOVE_TRAIT(C, TRAIT_ROTATIUM, CHEM_TRAIT_SOURCE(class)) + if(C?.hud_used && !HAS_TRAIT(C, TRAIT_ROTATIUM)) + var/atom/movable/plane_master_controller/pm_controller = C.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" @@ -983,79 +889,24 @@ reagent_state = LIQUID color = "#3C5133" metabolization_rate = 0.08 * REAGENTS_METABOLISM - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 0.15 - ph = 8 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/anacea/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - var/remove_amt = 5 - if(holder.has_reagent(/datum/reagent/medicine/calomel) || holder.has_reagent(/datum/reagent/medicine/pen_acid)) - remove_amt = 0.5 - for(var/datum/reagent/medicine/R in M.reagents.reagent_list) - M.reagents.remove_reagent(R.type, remove_amt * REM * normalise_creation_purity() * delta_time) - return ..() - -//ACID - - -/datum/reagent/toxin/acid - name = "Sulfuric Acid" - description = "A strong mineral acid with the molecular formula H2SO4." - color = "#00FF32" - toxpwr = 1 - var/acidpwr = 10 //the amount of protection removed from the armour - taste_description = "acid" - self_consuming = TRUE - ph = 2.75 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -// ...Why? I mean, clearly someone had to have done this and thought, well, acid doesn't hurt plants, but what brought us here, to this point? -/datum/reagent/toxin/acid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) - . = ..() - if(chems.has_reagent(type, 1)) - mytray.adjust_plant_health(-round(chems.get_reagent_amount(type) * 1)) - mytray.adjust_toxic(round(chems.get_reagent_amount(type) * 1.5)) - mytray.adjust_weedlevel(-rand(1,2)) - -/datum/reagent/toxin/acid/expose_mob(mob/living/carbon/exposed_carbon, methods=TOUCH, reac_volume) - . = ..() - if(!istype(exposed_carbon)) - return - reac_volume = round(reac_volume,0.1) - if(methods & INGEST) - exposed_carbon.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr)) - return - if(methods & INJECT) - exposed_carbon.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr)) - return - exposed_carbon.acid_act(acidpwr, reac_volume) -/datum/reagent/toxin/acid/expose_obj(obj/exposed_obj, reac_volume) +/datum/reagent/toxin/anacea/affect_blood(mob/living/carbon/C, removed) . = ..() - if(ismob(exposed_obj.loc)) //handled in human acid_act() - return - reac_volume = round(reac_volume,0.1) - exposed_obj.acid_act(acidpwr, reac_volume) - -/datum/reagent/toxin/acid/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if (!istype(exposed_turf)) - return - reac_volume = round(reac_volume,0.1) - exposed_turf.acid_act(acidpwr, reac_volume) + var/remove_amt = 5 + if(holder.has_reagent(/datum/reagent/medicine/activated_charcoal)) + remove_amt = 0.5 + for(var/datum/reagent/medicine/R in holder.reagent_list) + holder.remove_reagent(R.type, remove_amt * removed) /datum/reagent/toxin/acid/fluacid name = "Fluorosulfuric Acid" description = "Fluorosulfuric acid is an extremely corrosive chemical substance." color = "#5050FF" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 2 - acidpwr = 42.0 - ph = 0.0 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + acidpwr = 42 + // SERIOUSLY /datum/reagent/toxin/acid/fluacid/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user) @@ -1065,26 +916,20 @@ mytray.adjust_toxic(round(chems.get_reagent_amount(type) * 3)) mytray.adjust_weedlevel(-rand(1,4)) -/datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustFireLoss((current_cycle/15) * REM * normalise_creation_purity() * delta_time, 0) - . = TRUE - ..() +/datum/reagent/toxin/acid/fluacid/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustFireLoss((current_cycle/15) * removed, 0) /datum/reagent/toxin/acid/nitracid name = "Nitric Acid" description = "Nitric acid is an extremely corrosive chemical substance that violently reacts with living organic tissue." color = "#5050FF" - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 3 acidpwr = 5.0 - ph = 1.3 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustFireLoss((volume/10) * REM * normalise_creation_purity() * delta_time, FALSE) //here you go nervar - . = TRUE - ..() +/datum/reagent/toxin/acid/nitracid/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustFireLoss(10 * removed, FALSE) //here you go nervar /datum/reagent/toxin/delayed name = "Toxin Microcapsules" @@ -1095,77 +940,72 @@ toxpwr = 0 var/actual_toxpwr = 5 var/delay = 30 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED|REAGENT_NO_RANDOM_RECIPE + chemical_flags = REAGENT_NO_RANDOM_RECIPE -/datum/reagent/toxin/delayed/on_mob_life(mob/living/carbon/M, delta_time, times_fired) +/datum/reagent/toxin/delayed/affect_blood(mob/living/carbon/C, removed) if(current_cycle > delay) - holder.remove_reagent(type, actual_metaboliztion_rate * M.metabolism_efficiency * delta_time) - M.adjustToxLoss(actual_toxpwr * REM * delta_time, 0) - if(DT_PROB(5, delta_time)) - M.Paralyze(20) + C.adjustToxLoss(actual_toxpwr * removed, 0) + if(prob(10)) + C.Paralyze(20) . = TRUE - ..() + else + holder.add_reagent(type, removed) // GET BACK IN THERE /datum/reagent/toxin/mimesbane name = "Mime's Bane" description = "A nonlethal neurotoxin that interferes with the victim's ability to gesture." silent_toxin = TRUE color = "#F0F8FF" // rgb: 240, 248, 255 - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 0 - ph = 1.7 taste_description = "stillness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/L) - ADD_TRAIT(L, TRAIT_EMOTEMUTE, type) +/datum/reagent/toxin/mimesbane/on_mob_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + ADD_TRAIT(C, TRAIT_EMOTEMUTE, CHEM_TRAIT_SOURCE(class)) -/datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_EMOTEMUTE, type) +/datum/reagent/toxin/mimesbane/on_mob_end_metabolize(mob/living/carbon/C, class) + if(class != CHEM_BLOOD) + return + REMOVE_TRAIT(C, TRAIT_EMOTEMUTE, CHEM_TRAIT_SOURCE(class)) /datum/reagent/toxin/bonehurtingjuice //oof ouch name = "Bone Hurting Juice" description = "A strange substance that looks a lot like water. Drinking it is oddly tempting. Oof ouch." silent_toxin = TRUE //no point spamming them even more. color = "#AAAAAA77" //RGBA: 170, 170, 170, 77 - creation_purity = REAGENT_STANDARD_PURITY - purity = REAGENT_STANDARD_PURITY toxpwr = 0 - ph = 3.1 taste_description = "bone hurting" overdose_threshold = 50 - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/bonehurtingjuice/on_mob_add(mob/living/carbon/M) - M.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() +/datum/reagent/toxin/bonehurtingjuice/on_mob_metabolize(mob/living/carbon/C, class) + if(class == CHEM_BLOOD) + spawn(-1) + C.say("oof ouch my bones", forced = /datum/reagent/toxin/bonehurtingjuice) -/datum/reagent/toxin/bonehurtingjuice/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.stamina.adjust(-7.5 * REM * delta_time) - if(DT_PROB(10, delta_time)) - switch(rand(1, 3)) +/datum/reagent/toxin/bonehurtingjuice/affect_blood(mob/living/carbon/C, removed) + C.stamina.adjust(-7.5 * removed) + if(prob(20)) + switch(rand(1, 2)) if(1) - M.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) + spawn(-1) + C.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice) if(2) - M.manual_emote(pick("oofs silently.", "looks like [M.p_their()] bones hurt.", "grimaces, as though [M.p_their()] bones hurt.")) - if(3) - to_chat(M, span_warning("Your bones hurt!")) - return ..() + to_chat(C, span_warning("Your bones hurt!")) -/datum/reagent/toxin/bonehurtingjuice/overdose_process(mob/living/carbon/M, delta_time, times_fired) - if(DT_PROB(2, delta_time) && iscarbon(M)) //big oof +/datum/reagent/toxin/bonehurtingjuice/overdose_process(mob/living/carbon/C) + if(prob(4)) //big oof var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly. - var/obj/item/bodypart/bp = M.get_bodypart(selected_part) + var/obj/item/bodypart/bp = C.get_bodypart(selected_part) if(bp) - playsound(M, get_sfx(SFX_DESECRATION), 50, TRUE, -1) - M.visible_message(span_warning("[M]'s bones hurt too much!!"), span_danger("Your bones hurt too much!!")) - M.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) - bp.receive_damage(20, 0, 200) + if(bp.break_bones()) + playsound(C, get_sfx(SFX_DESECRATION), 50, TRUE, -1) + spawn(-1) + C.say("OOF!!", forced = /datum/reagent/toxin/bonehurtingjuice) else //SUCH A LUST FOR REVENGE!!! - to_chat(M, span_warning("A phantom limb hurts!")) - M.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) - return ..() + to_chat(C, span_warning("A phantom limb hurts!")) + spawn(-1) + C.say("Why are we still here, just to suffer?", forced = /datum/reagent/toxin/bonehurtingjuice) /datum/reagent/toxin/bungotoxin name = "Bungotoxin" @@ -1175,23 +1015,23 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM toxpwr = 0 taste_description = "tannin" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED -/datum/reagent/toxin/bungotoxin/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * REM * delta_time) + +/datum/reagent/toxin/bungotoxin/affect_blood(mob/living/carbon/C, removed) + . = ..() + C.adjustOrganLoss(ORGAN_SLOT_HEART, 3 * removed, updating_health = FALSE) // If our mob's currently dizzy from anything else, we will also gain confusion - var/mob_dizziness = M.get_timed_status_effect_duration(/datum/status_effect/confusion) + var/mob_dizziness = C.get_timed_status_effect_duration(/datum/status_effect/confusion) if(mob_dizziness > 0) // Gain confusion equal to about half the duration of our current dizziness - M.set_timed_status_effect(mob_dizziness / 2, /datum/status_effect/confusion) + C.set_timed_status_effect(mob_dizziness / 2, /datum/status_effect/confusion) - if(current_cycle >= 12 && DT_PROB(4, delta_time)) + if(current_cycle >= 12 && prob(8)) var/tox_message = pick("You feel your heart spasm in your chest.", "You feel faint.","You feel you need to catch your breath.","You feel a prickle of pain in your chest.") - to_chat(M, span_notice("[tox_message]")) - . = TRUE - ..() + to_chat(C, span_warning("[tox_message]")) + return TRUE /datum/reagent/toxin/leadacetate name = "Lead Acetate" description = "Used hundreds of years ago as a sweetener, before it was realized that it's incredibly poisonous." @@ -1200,12 +1040,12 @@ toxpwr = 0.5 taste_mult = 1.3 taste_description = "sugary sweetness" - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED - -/datum/reagent/toxin/leadacetate/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * REM * delta_time) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM * delta_time) - if(DT_PROB(0.5, delta_time)) - to_chat(M, span_notice("Ah, what was that? You thought you heard something...")) - M.adjust_timed_status_effect(5 SECONDS, /datum/status_effect/confusion) - return ..() + + +/datum/reagent/toxin/leadacetate/affect_blood(mob/living/carbon/C, removed) + C.adjustOrganLoss(ORGAN_SLOT_EARS, 1 * removed, updating_health = FALSE) + C.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * removed, updating_health = FALSE) + if(prob(1)) + to_chat(C, span_notice("What was that? Did I hear something?")) + C.adjust_timed_status_effect(5 SECONDS, /datum/status_effect/confusion) + return ..() || TRUE diff --git a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm b/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm deleted file mode 100644 index 29ca934a1262..000000000000 --- a/code/modules/reagents/chemistry/reagents/unique/eigenstasium.dm +++ /dev/null @@ -1,121 +0,0 @@ - -/*eigenstate themed Chem - *Teleports you to the creation location on consumption and back when the reagent is removed from you - *OD teleports you randomly around the Station and gives you a status effect - *The status effect slowly send you on a wild ride and replaces you with an alternative reality version of yourself unless you consume eigenstasium/bluespace dust/stabilising agent. - *During the process you get really hungry, - *Then some of your items slowly start teleport around you, - *then alternative versions of yourself are brought in from a different universe and they yell at you. - *and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative - *Spraying this on lockers allows you to create eigenlinked lockers - see the eigenstate subsystem for using this to create your own links -*/ -/datum/reagent/eigenstate - name = "Eigenstasium" - description = "A strange mixture formed from a controlled reaction of bluespace with plasma, that causes localised eigenstate fluxuations within the patient" - taste_description = "wiggly cosmic dust." - color = "#5020F4" - overdose_threshold = 15 - metabolization_rate = 1 * REAGENTS_METABOLISM - ph = 3.7 - purity = 0.5 - creation_purity = 0.5 - inverse_chem = /datum/reagent/impurity/eigenswap - inverse_chem_val = 0 - chemical_flags = REAGENT_DEAD_PROCESS //So if you die with it in your body, you still get teleported back to the location as a corpse - data = list("location_created" = null, "ingested" = FALSE)//So we retain the target location and creator between reagent instances - ///The creation point assigned during the reaction - var/turf/location_created - ///The return point indicator - var/obj/effect/overlay/holo_pad_hologram/eigenstate - ///The point you're returning to after the reagent is removed - var/turf/open/location_return = null - -/datum/reagent/eigenstate/on_new(list/data) - . = ..() - if(!data) - return - location_created = data["location_created"] - -/datum/reagent/eigenstate/expose_mob(mob/living/living_mob, methods, reac_volume, show_message, touch_protection) - . = ..() - if(!(methods & INGEST) || !iscarbon(living_mob)) - return - //This looks rediculous, but expose is usually called from the donor reagents datum - we want to edit the post exposure version present in the mob. - var/mob/living/carbon/carby = living_mob - //But because carbon mobs have stomachs we have to search in there because we're ingested - var/obj/item/organ/stomach/stomach = carby.getorganslot(ORGAN_SLOT_STOMACH) - var/datum/reagent/eigenstate/eigen - if(stomach) - eigen = stomach.reagents.has_reagent(/datum/reagent/eigenstate) - if(!eigen)//But what if they have no stomach! I want to get off expose_mob's wild ride - eigen = carby.reagents.has_reagent(/datum/reagent/eigenstate) - //Because expose_mob and on_mob_add() across all of the different things call them in different orders, so I want to make sure whatever is the first one to call it sets up the location correctly. - eigen.data["ingested"] = TRUE - -//Main functions -/datum/reagent/eigenstate/on_mob_add(mob/living/living_mob, amount) - //make hologram at return point to indicate where someone will go back to - eigenstate = new (living_mob.loc) - eigenstate.appearance = living_mob.appearance - eigenstate.alpha = 170 - eigenstate.add_atom_colour(LIGHT_COLOR_LIGHT_CYAN, FIXED_COLOUR_PRIORITY) - eigenstate.mouse_opacity = MOUSE_OPACITY_TRANSPARENT//So you can't click on it. - eigenstate.layer = FLY_LAYER//Above all the other objects/mobs. Or the vast majority of them. - eigenstate.set_anchored(TRUE) //So space wind cannot drag it. - eigenstate.name = "[living_mob.name]'s Eigenstate"//If someone decides to right click. - eigenstate.set_light(2) //hologram lighting - - location_return = get_turf(living_mob) //sets up return point - to_chat(living_mob, span_userdanger("You feel like part of yourself has split off!")) - - //Teleports you home if it's pure enough - if(creation_purity > 0.9 && location_created && data["ingested"]) - do_sparks(5,FALSE,living_mob) - do_teleport(living_mob, location_created, 0, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5,FALSE,living_mob) - - return ..() - -/datum/reagent/eigenstate/on_mob_life(mob/living/carbon/living_mob) - if(prob(20)) - do_sparks(5,FALSE,living_mob) - - return ..() - -/datum/reagent/eigenstate/on_mob_delete(mob/living/living_mob) //returns back to original location - do_sparks(5,FALSE,living_mob) - to_chat(living_mob, span_userdanger("You feel strangely whole again.")) - if(!living_mob.reagents.has_reagent(/datum/reagent/stabilizing_agent)) - do_teleport(living_mob, location_return, 0, asoundin = 'sound/effects/phasein.ogg') //Teleports home - do_sparks(5,FALSE,living_mob) - qdel(eigenstate) - return ..() - -/datum/reagent/eigenstate/overdose_start(mob/living/living_mob) //Overdose, makes you teleport randomly - to_chat(living_mob, span_userdanger("You feel like your perspective is being ripped apart as you begin flitting in and out of reality!")) - living_mob.set_timed_status_effect(40 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE) - metabolization_rate += 0.5 //So you're not stuck forever teleporting. - if(iscarbon(living_mob)) - var/mob/living/carbon/carbon_mob = living_mob - carbon_mob.apply_status_effect(/datum/status_effect/eigenstasium) - return ..() - -/datum/reagent/eigenstate/overdose_process(mob/living/living_mob) //Overdose, makes you teleport randomly - do_sparks(5, FALSE, living_mob) - do_teleport(living_mob, get_turf(living_mob), 10, asoundin = 'sound/effects/phasein.ogg') - do_sparks(5, FALSE, living_mob) - return ..() - -//FOR ADDICTION-LIKE EFFECTS, SEE datum/status_effect/eigenstasium - -///Lets you link lockers together -/datum/reagent/eigenstate/expose_turf(turf/exposed_turf, reac_volume) - . = ..() - if(creation_purity < 0.8) - return - var/list/lockers = list() - for(var/obj/structure/closet/closet in exposed_turf.contents) - lockers += closet - if(!length(lockers)) - return - SSeigenstates.create_new_link(lockers) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 513569993a46..0781c2c9cb25 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -7,16 +7,17 @@ */ /datum/chemical_reaction ///Results of the chemical reactions - var/list/results = new/list() + var/list/results = list() ///Required chemicals that are USED in the reaction - var/list/required_reagents = new/list() + var/list/required_reagents = list() ///Required chemicals that must be present in the container but are not USED. - var/list/required_catalysts = new/list() + var/list/required_catalysts = list() + ///Reagents that block the reaction from occuring, like an inverse catalyst. + var/list/inhibitors = list() - // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things - /// the exact container path required for the reaction to happen + /// the exact container path required for the reaction to happen. var/required_container - /// an integer required for the reaction to happen + /// Some stupid magic bullshit for slime reactions. Literally what the fuck. var/required_other = 0 ///Determines if a chemical reaction can occur inside a mob @@ -35,29 +36,17 @@ var/optimal_temp = 500 /// Temperature at which reaction explodes - If any reaction is this hot, it explodes! var/overheat_temp = 900 - /// Lowest value of pH determining pH a 1 value for pH based rate reactions (Plateu phase) - var/optimal_ph_min = 5 - /// Higest value for above - var/optimal_ph_max = 9 - /// How far out pH wil react, giving impurity place (Exponential phase) - var/determin_ph_range = 4 + /// How sharp the temperature exponential curve is (to the power of value) var/temp_exponent_factor = 2 - /// How sharp the pH exponential curve is (to the power of value) - var/ph_exponent_factor = 2 - /// How much the temperature will change (with no intervention) (i.e. for 30u made the temperature will increase by 100, same with 300u. The final temp will always be start + this value, with the exception con beakers with different specific heats) + + /// How much the temperature changes per unit of chem used. without REACTION_HEAT_ARBITARY flag the rate of change depends on the holder heat capacity else results are more accurate var/thermic_constant = 50 - /// pH change per 1u reaction - var/H_ion_release = 0.01 /// Optimal/max rate possible if all conditions are perfect var/rate_up_lim = 30 - /// If purity is below 0.15, it calls OverlyImpure() too. Set to 0 to disable this. - var/purity_min = 0.15 - /// bitflags for clear conversions; REACTION_CLEAR_IMPURE, REACTION_CLEAR_INVERSE, REACTION_CLEAR_RETAIN, REACTION_INSTANT + + /// Affects how reactions occur var/reaction_flags = NONE - ///Tagging vars - ///A bitflag var for tagging reagents for the reagent loopup functon - var/reaction_tags = NONE /datum/chemical_reaction/New() . = ..() @@ -114,9 +103,6 @@ * Stuff that occurs at the end of a reaction. This will proc if the beaker is forced to stop and start again (say for sudden temperature changes). * Only procs at the END of reaction * If reaction_flags & REACTION_INSTANT then this isn't called - * if reaction_flags REACTION_CLEAR_IMPURE then the impurity chem is handled here, producing the result in the beaker instead of in a mob - * Likewise for REACTION_CLEAR_INVERSE the inverse chem is produced at the end of the reaction in the beaker - * You should be calling ..() if you're writing a child function of this proc otherwise purity methods won't work correctly * * Proc where the additional magic happens. * You dont want to handle mob spawning in this since there is a dedicated proc for that.client @@ -125,37 +111,7 @@ * * react_volume - volume created across the whole reaction */ /datum/chemical_reaction/proc/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) - //failed_chem handler - var/cached_temp = holder.chem_temp - for(var/id in results) - var/datum/reagent/reagent = holder.has_reagent(id) - if(!reagent) - continue - //Split like this so it's easier for people to edit this function in a child - reaction_clear_check(reagent, holder) - holder.chem_temp = cached_temp - -/** - * REACTION_CLEAR handler - * If the reaction has the REACTION_CLEAR flag, then it will split using purity methods in the beaker instead - * - * Arguments: - * * reagent - the target reagent to convert - */ -/datum/chemical_reaction/proc/reaction_clear_check(datum/reagent/reagent, datum/reagents/holder) - if(!reagent)//Failures can delete R - return - if(reaction_flags & (REACTION_CLEAR_IMPURE | REACTION_CLEAR_INVERSE)) - if(reagent.purity == 1) - return - var/cached_volume = reagent.volume - var/cached_purity = reagent.purity - if((reaction_flags & REACTION_CLEAR_INVERSE) && reagent.inverse_chem) - if(reagent.inverse_chem_val > reagent.purity) - holder.remove_reagent(reagent.type, cached_volume, FALSE) - holder.add_reagent(reagent.inverse_chem, cached_volume, FALSE, added_purity = 1-cached_purity) - return /** * Occurs when a reation is overheated (i.e. past it's overheatTemp) @@ -171,30 +127,11 @@ */ /datum/chemical_reaction/proc/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) for(var/id in results) - var/datum/reagent/reagent = holder.get_reagent(id) + var/datum/reagent/reagent = holder.has_reagent(id) if(!reagent) return - reagent.volume = round((reagent.volume*0.98), 0.01) //Slowly lower yield per tick - -/** - * Occurs when a reation is too impure (i.e. it's below purity_min) - * Will be called every tick in the reaction that it is too impure - * If you want this to be a once only proc (i.e. the reaction is stopped after) set reaction.toDelete = TRUE - * The above is useful if you're writing an explosion - * By default the parent proc will reduce the purity of all reagents involved in the reaction in the beaker slightly. If you don't want that don't add ..() - * - * Arguments: - * * holder - the datum that holds this reagent, be it a beaker or anything else - * * equilibrium - the equilibrium datum that contains the equilibrium reaction properties and methods - * * step_volume_added - how much product (across all products) was added for this single step - */ -/datum/chemical_reaction/proc/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - var/affected_list = results + required_reagents - for(var/_reagent in affected_list) - var/datum/reagent/reagent = holder.get_reagent(_reagent) - if(!reagent) - continue - reagent.purity = clamp((reagent.purity-0.01), 0, 1) //slowly reduce purity of reagents + reagent.volume *= 0.98 //Slowly lower yield per tick + holder.update_total() /** * Magical mob spawning when chemicals react @@ -300,9 +237,7 @@ if(lastkey) var/mob/toucher = get_mob_by_key(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].") - log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + log_game("Reagent explosion reaction occurred at [AREACOORD(T)][inside_msg]. Last Fingerprint: [lastkey ? lastkey : "N/A"][touch_msg]." ) var/datum/effect_system/reagents_explosion/e = new() e.set_up(power , T, 0, 0) e.start(holder.my_atom) @@ -335,47 +270,20 @@ for(var/mob/living/carbon/carbon_mob in get_hearers_in_view(range, location)) carbon_mob.soundbang_act(1, stun, power) -//Spews out the inverse of the chems in the beaker of the products/reactants only -/datum/chemical_reaction/proc/explode_invert_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, force_range = 0, clear_products = TRUE, clear_reactants = TRUE, accept_impure = TRUE) - var/datum/reagents/invert_reagents = new (2100, NO_REACT)//I think the biggest size we can get is 2100? - var/datum/effect_system/smoke_spread/chem/smoke = new() - var/sum_volume = 0 - invert_reagents.my_atom = holder.my_atom //Give the gas a fingerprint - for(var/datum/reagent/reagent as anything in holder.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding - if(!(reagent.type in required_reagents) || !(reagent.type in results)) - continue - if(reagent.inverse_chem) - invert_reagents.add_reagent(reagent.inverse_chem, reagent.volume, no_react = TRUE) - holder.remove_reagent(reagent.type, reagent.volume) - continue - invert_reagents.add_reagent(reagent.type, reagent.volume, added_purity = reagent.purity, no_react = TRUE) - sum_volume += reagent.volume - holder.remove_reagent(reagent.type, reagent.volume) - if(!force_range) - force_range = (sum_volume/6) + 3 - if(invert_reagents.reagent_list) - smoke.set_up(invert_reagents, force_range, holder.my_atom) - smoke.start() - holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") - if(clear_reactants) - clear_reactants(holder) - if(clear_products) - clear_products(holder) - //Spews out the corrisponding reactions reagents (products/required) of the beaker in a smokecloud. Doesn't spew catalysts /datum/chemical_reaction/proc/explode_smoke(datum/reagents/holder, datum/equilibrium/equilibrium, force_range = 0, clear_products = TRUE, clear_reactants = TRUE) var/datum/reagents/reagents = new/datum/reagents(2100, NO_REACT)//Lets be safe first - var/datum/effect_system/smoke_spread/chem/smoke = new() + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new() reagents.my_atom = holder.my_atom //fingerprint var/sum_volume = 0 for (var/datum/reagent/reagent as anything in holder.reagent_list) if((reagent.type in required_reagents) || (reagent.type in results)) - reagents.add_reagent(reagent.type, reagent.volume, added_purity = reagent.purity, no_react = TRUE) + reagents.add_reagent(reagent.type, reagent.volume, no_react = TRUE) holder.remove_reagent(reagent.type, reagent.volume) if(!force_range) force_range = (sum_volume/6) + 3 if(reagents.reagent_list) - smoke.set_up(reagents, force_range, holder.my_atom) + smoke.set_up(force_range, location = holder.my_atom, carry = reagents) smoke.start() holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, launching the aerosolized reagents into the air!") if(clear_reactants) @@ -389,10 +297,9 @@ if(sound_and_text) holder.my_atom.audible_message("The [holder.my_atom] suddenly explodes, sending a shockwave rippling through the air!") playsound(this_turf, 'sound/chemistry/shockwave_explosion.ogg', 80, TRUE) + //Modified goonvortex - for(var/atom/movable/movey as anything in orange(range, this_turf)) - if(!istype(movey, /atom/movable)) - continue + for(var/atom/movable/movey in orange(range, this_turf)) if(isliving(movey) && damage) var/mob/living/live = movey live.apply_damage(damage)//Since this can be called multiple times @@ -536,7 +443,6 @@ to_chat(target, "The [holder.my_atom.name] launches some of [holder.p_their()] contents at you!") target.reagents.add_reagent(reagent, vol) - /* * Applys a cooldown to the reaction * Returns false if time is below required, true if it's above required diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm deleted file mode 100644 index ecbf33d3fc18..000000000000 --- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm +++ /dev/null @@ -1,367 +0,0 @@ - -/*****BRUTE*****/ -//oops no theme - standard reactions with no whistles - -/datum/chemical_reaction/medicine/helbital - results = list(/datum/reagent/medicine/c2/helbital = 3) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1) - mix_message = "The mixture turns into a thick, yellow powder." - //FermiChem vars: - required_temp = 250 - optimal_temp = 1000 - overheat_temp = 550 - optimal_ph_min = 5 - optimal_ph_max = 9.5 - determin_ph_range = 4 - temp_exponent_factor = 1 - ph_exponent_factor = 4 - thermic_constant = 100 - H_ion_release = 4 - rate_up_lim = 55 - purity_min = 0.55 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE - -/datum/chemical_reaction/medicine/helbital/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - explode_fire_vortex(holder, equilibrium, 1, 1, "impure") - holder.chem_temp += 2.5 - var/datum/reagent/helbital = holder.get_reagent(/datum/reagent/medicine/c2/helbital) - if(!helbital) - return - if(helbital.purity <= 0.25) - if(prob(25)) - //new /obj/effect/hotspot(holder.my_atom.loc) - var/turf/T = get_turf(holder.my_atom) - T.create_fire(1, 10) - holder.remove_reagent(/datum/reagent/medicine/c2/helbital, 2) - holder.chem_temp += 5 - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The impurity of the reacting helbital is too great causing [holder.my_atom] to let out a hearty burst of flame, evaporating part of the product!")) - -/datum/chemical_reaction/medicine/helbital/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..()//drains product - explode_fire_vortex(holder, equilibrium, 2, 2, "overheat", TRUE) - -/datum/chemical_reaction/medicine/helbital/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) - . = ..() - var/datum/reagent/helbital = holder.get_reagent(/datum/reagent/medicine/c2/helbital) - if(!helbital) - return - if(helbital.purity <= 0.1) //So people don't ezmode this by keeping it at min - explode_fire(holder, null, 3) - clear_products(holder) - -/datum/chemical_reaction/medicine/libital - results = list(/datum/reagent/medicine/c2/libital = 3) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1) - required_temp = 225 - optimal_temp = 700 - overheat_temp = 840 - optimal_ph_min = 6 - optimal_ph_max = 10 - determin_ph_range = 4 - temp_exponent_factor = 1.75 - ph_exponent_factor = 1 - thermic_constant = 75 - H_ion_release = -6.5 - rate_up_lim = 40 - purity_min = 0.2 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE - -/datum/chemical_reaction/medicine/probital - results = list(/datum/reagent/medicine/c2/probital = 4) - required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1) - required_temp = 225 - optimal_temp = 700 - overheat_temp = 750 - optimal_ph_min = 4.5 - optimal_ph_max = 12 - determin_ph_range = 2 - temp_exponent_factor = 0.75 - ph_exponent_factor = 4 - thermic_constant = 50 - H_ion_release = -2.5 - rate_up_lim = 30 - purity_min = 0.35//15% window - reaction_flags = REACTION_CLEAR_INVERSE | REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE - -/*****BURN*****/ -//These are all endothermic! - -//This is a relatively simple demonstration have splitting negatives/having purity based negatives -//Since it requires silver - I don't want to make it too hard -/datum/chemical_reaction/medicine/lenturi - results = list(/datum/reagent/medicine/c2/lenturi = 5) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) - required_temp = 200 - optimal_temp = 300 - overheat_temp = 500 - optimal_ph_min = 6 - optimal_ph_max = 11 - determin_ph_range = 6 - temp_exponent_factor = 1 - ph_exponent_factor = 2 - thermic_constant = -175 //Though, it is a test in endothermicity - H_ion_release = -2.5 - rate_up_lim = 30 - purity_min = 0.25 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/aiuri - results = list(/datum/reagent/medicine/c2/aiuri = 4) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2) - required_temp = 50 - optimal_temp = 300 - overheat_temp = 315 - optimal_ph_min = 4.8 - optimal_ph_max = 9 - determin_ph_range = 3 - temp_exponent_factor = 5 - ph_exponent_factor = 2 - thermic_constant = -400 - H_ion_release = 3 - rate_up_lim = 35 - purity_min = 0.25 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/aiuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - for(var/mob/living/living_mob in orange(3, get_turf(holder.my_atom))) - if(living_mob.flash_act(1, length = 5)) - living_mob.set_blurriness(10) - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The [holder.my_atom] lets out a loud bang!")) - playsound(holder.my_atom, 'sound/effects/explosion1.ogg', 50, 1) - -/datum/chemical_reaction/medicine/hercuri - results = list(/datum/reagent/medicine/c2/hercuri = 5) - required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1) - is_cold_recipe = TRUE - required_temp = 47 - optimal_temp = 10 - overheat_temp = 5 - optimal_ph_min = 6 - optimal_ph_max = 10 - determin_ph_range = 1 - temp_exponent_factor = 3 - thermic_constant = -40 - H_ion_release = 3.7 - rate_up_lim = 50 - purity_min = 0.15 - reaction_flags = REACTION_PH_VOL_CONSTANT | REACTION_CLEAR_INVERSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/hercuri/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - if(off_cooldown(holder, equilibrium, 2, "hercuri_freeze")) - return - playsound(holder.my_atom, 'sound/magic/ethereal_exit.ogg', 50, 1) - holder.my_atom.visible_message("The reaction frosts over, releasing it's chilly contents!") - var/radius = max((equilibrium.step_target_vol/50), 1) - freeze_radius(holder, equilibrium, 200, radius, 60 SECONDS) //drying agent exists - explode_shockwave(holder, equilibrium, sound_and_text = FALSE) - -/*****OXY*****/ -//These react faster with optional oxygen, and have blastback effects! (the oxygen makes their fail states deadlier) - -/datum/chemical_reaction/medicine/convermol - results = list(/datum/reagent/medicine/c2/convermol = 3) - required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1) - required_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." - optimal_temp = 420 - overheat_temp = 570 //Ash will be created before this - so it's pretty rare that overheat is actually triggered - optimal_ph_min = 3.045 //Rigged to blow once without oxygen - optimal_ph_max = 8.5 - determin_ph_range = 2 - temp_exponent_factor = 0.75 - ph_exponent_factor = 1.25 - thermic_constant = 15 - H_ion_release = -1 - rate_up_lim = 50 - purity_min = 0.25 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OXY - -/datum/chemical_reaction/medicine/convermol/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - var/datum/reagent/oxy = holder.has_reagent(/datum/reagent/oxygen) - if(oxy) - holder.remove_reagent(/datum/reagent/oxygen, 0.25) - else - reaction.delta_t = delta_t/10 //slow without oxygen - -/datum/chemical_reaction/medicine/convermol/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, impure = FALSE) - var/range = impure ? 4 : 3 - if(holder.has_reagent(/datum/reagent/oxygen)) - explode_shockwave(holder, equilibrium, range) //damage 5 - else - explode_shockwave(holder, equilibrium, range, damage = 2) - -/datum/chemical_reaction/medicine/convermol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - overheated(holder, equilibrium, impure = TRUE) - if(holder.has_reagent(/datum/reagent/oxygen)) - clear_reactants(holder, step_volume_added*2) - else - clear_reactants(holder) - - -/datum/chemical_reaction/medicine/tirimol - results = list(/datum/reagent/medicine/c2/tirimol = 5) - required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2) - required_catalysts = list(/datum/reagent/toxin/acid = 1) - mix_message = "The mixture turns into a tired reddish pink liquid." - optimal_temp = 1 - optimal_temp = 900 - overheat_temp = 720 - optimal_ph_min = 2 - optimal_ph_max = 7.1 - determin_ph_range = 2 - temp_exponent_factor = 4 - ph_exponent_factor = 1.8 - thermic_constant = -20 - H_ion_release = 3 - rate_up_lim = 50 - purity_min = 0.2 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OXY - -/datum/chemical_reaction/medicine/tirimol/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - var/datum/reagent/oxy = holder.has_reagent(/datum/reagent/oxygen) - if(oxy) - holder.remove_reagent(/datum/reagent/oxygen, 0.25) - else - holder.adjust_all_reagents_ph(-0.05*step_reaction_vol)//pH drifts faster - -//Sleepytime for chem -/datum/chemical_reaction/medicine/tirimol/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, impure = FALSE) - var/bonus = impure ? 2 : 1 - if(holder.has_reagent(/datum/reagent/oxygen)) - explode_attack_chem(holder, equilibrium, /datum/reagent/inverse/healing/tirimol, 7.5*bonus, 2, ignore_eyes = TRUE) //since we're smoke/air based - clear_products(holder, 5)//since we attacked - explode_invert_smoke(holder, equilibrium, 3) - else - explode_invert_smoke(holder, equilibrium, 3) - -/datum/chemical_reaction/medicine/tirimol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - overheated(holder, equilibrium, TRUE) - clear_reactants(holder, 2) - -/*****TOX*****/ -//These all care about purity in their reactions - -/datum/chemical_reaction/medicine/seiver - results = list(/datum/reagent/medicine/c2/seiver = 3) - required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1) - mix_message = "The mixture gives out a goopy slorp." - is_cold_recipe = TRUE - required_temp = 320 - optimal_temp = 280 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 5 - optimal_ph_max = 8 - determin_ph_range = 2 - temp_exponent_factor = 1 - ph_exponent_factor = 0.5 - thermic_constant = -500 - H_ion_release = -2 - rate_up_lim = 15 - purity_min = 0.2 - reaction_flags = REACTION_PH_VOL_CONSTANT | REACTION_CLEAR_INVERSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN - -/datum/chemical_reaction/medicine/multiver - results = list(/datum/reagent/medicine/c2/multiver = 2) - required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/salt = 1) - mix_message = "The mixture yields a fine black powder." - required_temp = 380 - optimal_temp = 400 - overheat_temp = 410 - optimal_ph_min = 5 - optimal_ph_max = 9.5 - determin_ph_range = 4 - temp_exponent_factor = 0.1 - ph_exponent_factor = 1 - thermic_constant = 0 - H_ion_release = 0.015 - rate_up_lim = 10 - purity_min = 0.1 //Fire is our worry for now - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_PLANT | REACTION_TAG_TOXIN - -//You get nothing! I'm serious about staying under the heating requirements! -/datum/chemical_reaction/medicine/multiver/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - var/datum/reagent/monover = holder.has_reagent(/datum/reagent/inverse/healing/monover) - if(monover) - holder.remove_reagent(/datum/reagent/inverse/healing/monover, monover.volume) - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The Monover bursts into flames from the heat!")) - explode_fire_square(holder, equilibrium, 1) - holder.my_atom.fire_act(holder.chem_temp, monover.volume)//I'm kinda banking on this setting the thing on fire. If you see this, then it didn't! - -/datum/chemical_reaction/medicine/multiver/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - if(delta_ph < 0.35) - //normalise delta_ph - var/norm_d_ph = 1-(delta_ph/0.35) - holder.chem_temp += norm_d_ph*12 //0 - 48 per second) - if(delta_ph < 0.1) - holder.my_atom.visible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The Monover begins to glow!")) - -/datum/chemical_reaction/medicine/syriniver - results = list(/datum/reagent/medicine/c2/syriniver = 5) - required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2) - required_temp = 250 - optimal_temp = 310 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 6.5 - optimal_ph_max = 9 - determin_ph_range = 6 - temp_exponent_factor = 2 - ph_exponent_factor = 0.5 - thermic_constant = -20 - H_ion_release = -5.5 - rate_up_lim = 20 //affected by pH too - purity_min = 0.3 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN - -/datum/chemical_reaction/medicine/syriniver/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - reaction.delta_t = delta_t * delta_ph - -/datum/chemical_reaction/medicine/penthrite - results = list(/datum/reagent/medicine/c2/penthrite = 3) - required_reagents = list(/datum/reagent/pentaerythritol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/wittel = 1) - required_temp = 255 - optimal_temp = 350 - overheat_temp = 450 - optimal_ph_min = 5 - optimal_ph_max = 9 - determin_ph_range = 3 - temp_exponent_factor = 1 - ph_exponent_factor = 1 - thermic_constant = 150 - H_ion_release = -0.5 - rate_up_lim = 15 - purity_min = 0.55 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_TOXIN - -//overheat beats like a heart! (or is it overbeat?) -/datum/chemical_reaction/medicine/penthrite/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - if(off_cooldown(holder, equilibrium, 1, "lub")) - explode_shockwave(holder, equilibrium, 3, 2) - playsound(holder.my_atom, 'sound/health/slowbeat.ogg', 50, 1) // this is 2 mintues long (!) cut it up! - if(off_cooldown(holder, equilibrium, 1, "dub", 0.5)) - explode_shockwave(holder, equilibrium, 3, 2, implosion = TRUE) - playsound(holder.my_atom, 'sound/health/slowbeat.ogg', 50, 1) - explode_fire_vortex(holder, equilibrium, 1, 1) - -//enabling hardmode -/datum/chemical_reaction/medicine/penthrite/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - holder.chem_temp += 15 diff --git a/code/modules/reagents/chemistry/recipes/catalysts.dm b/code/modules/reagents/chemistry/recipes/catalysts.dm deleted file mode 100644 index cfd112935c10..000000000000 --- a/code/modules/reagents/chemistry/recipes/catalysts.dm +++ /dev/null @@ -1,27 +0,0 @@ - -///////////////////////////MEDICINES//////////////////////////// - -/datum/chemical_reaction/medical_speed_catalyst - results = list(/datum/reagent/catalyst_agent/speed/medicine = 2) - required_reagents = list(/datum/reagent/medicine/c2/libital = 3, /datum/reagent/medicine/c2/probital = 4, /datum/reagent/toxin/plasma = 2) - mix_message = "The reaction evaporates slightly as the mixture solidifies" - mix_sound = 'sound/chemistry/catalyst.ogg' - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_UNIQUE | REACTION_TAG_CHEMICAL - required_temp = 320 - optimal_temp = 600 - overheat_temp = 800 - optimal_ph_min = 5 - optimal_ph_max = 6 - determin_ph_range = 5 - temp_exponent_factor = 0.5 - ph_exponent_factor = 4 - thermic_constant = 1000 - H_ion_release = -0.25 - rate_up_lim = 1 - purity_min = 0 - -/datum/chemical_reaction/medical_speed_catalyst/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - explode_invert_smoke(holder, equilibrium) //Will be better when the inputs have proper invert chems - -/datum/chemical_reaction/medical_speed_catalyst/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - explode_invert_smoke(holder, equilibrium) diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm index 0a820469dd1e..3ddc66d1ccd7 100644 --- a/code/modules/reagents/chemistry/recipes/drugs.dm +++ b/code/modules/reagents/chemistry/recipes/drugs.dm @@ -1,14 +1,25 @@ +/datum/chemical_reaction/cryptobiolin + results = list(/datum/reagent/cryptobiolin = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/acetone = 1, /datum/reagent/consumable/sugar = 1) + required_temp = 30 CELSIUS + optimal_temp = 45 CELSIUS + overheat_temp = 60 CELSIUS + +/datum/chemical_reaction/impedrezene + results = list(/datum/reagent/impedrezene = 2) + required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/acetone = 1, /datum/reagent/consumable/sugar = 1) + /datum/chemical_reaction/space_drugs results = list(/datum/reagent/drug/space_drugs = 3) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG + /datum/chemical_reaction/krokodil results = list(/datum/reagent/drug/krokodil = 6) required_reagents = list(/datum/reagent/medicine/diphenhydramine = 1, /datum/reagent/medicine/morphine = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/potassium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/fuel = 1) mix_message = "The mixture dries into a pale blue powder." required_temp = 380 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG + /datum/chemical_reaction/methamphetamine results = list(/datum/reagent/drug/methamphetamine = 4) @@ -16,41 +27,19 @@ required_temp = 372 optimal_temp = 376//Wow this is tight overheat_temp = 380 - optimal_ph_min = 6.5 - optimal_ph_max = 7.5 - determin_ph_range = 5 temp_exponent_factor = 1 - ph_exponent_factor = 1.4 thermic_constant = 0.1 //exothermic nature is equal to impurty - H_ion_release = -0.025 rate_up_lim = 12.5 - purity_min = 0.5 //100u will natrually just dip under this w/ no buffer reaction_flags = REACTION_HEAT_ARBITARY //Heating up is arbitary because of submechanics of this reaction. - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DRUG | REACTION_TAG_DANGEROUS - -//The less pure it is, the faster it heats up. tg please don't hate me for making your meth even more dangerous -/datum/chemical_reaction/methamphetamine/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine) - if(!meth)//First step - reaction.thermic_mod = (1-delta_ph)*5 - return - reaction.thermic_mod = (1-meth.purity)*5 /datum/chemical_reaction/methamphetamine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) . = ..() temp_meth_explosion(holder, equilibrium.reacted_vol) -/datum/chemical_reaction/methamphetamine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - temp_meth_explosion(holder, equilibrium.reacted_vol) - /datum/chemical_reaction/methamphetamine/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) var/datum/reagent/meth = holder.get_reagent(/datum/reagent/drug/methamphetamine) if(!meth)//Other procs before this can already blow us up return ..() - if(meth.purity < purity_min) - temp_meth_explosion(holder, react_vol) - return return ..() //Refactoring of explosions is coming later, this is till then so it still explodes @@ -68,9 +57,7 @@ if(lastkey) var/mob/toucher = get_mob_by_key(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].") - log_game("Reagent explosion reaction occurred at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"]." ) + log_game("Reagent explosion reaction occurred at [AREACOORD(T)][inside_msg]. Last Fingerprint: [lastkey ? lastkey : "N/A"][touch_msg]." ) var/datum/effect_system/reagents_explosion/e = new() e.set_up(power, T, 0, 0) e.start(holder.my_atom) @@ -80,63 +67,43 @@ results = list(/datum/reagent/drug/bath_salts = 7) required_reagents = list(/datum/reagent/toxin/bad_food = 1, /datum/reagent/saltpetre = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/space_cleaner = 1, /datum/reagent/consumable/enzyme = 1, /datum/reagent/consumable/tea = 1, /datum/reagent/mercury = 1) required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/aranesp results = list(/datum/reagent/drug/aranesp = 3) required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/medicine/atropine = 1, /datum/reagent/medicine/morphine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_TOXIN | REACTION_TAG_DAMAGING -/datum/chemical_reaction/happiness - 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) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING /datum/chemical_reaction/pumpup results = list(/datum/reagent/drug/pumpup = 5) required_reagents = list(/datum/reagent/medicine/epinephrine = 2, /datum/reagent/consumable/coffee = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_TOXIN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/maint_tar1 results = list(/datum/reagent/toxin/acid = 1 ,/datum/reagent/drug/maint/tar = 3) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/yuck = 1 , /datum/reagent/fuel = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_TOXIN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/maint_tar2 results = list(/datum/reagent/toxin/acid = 1 ,/datum/reagent/drug/maint/tar = 3) required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/consumable/enzyme = 3 , /datum/reagent/fuel = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_TOXIN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/maint_sludge results = list(/datum/reagent/drug/maint/sludge = 1) required_reagents = list(/datum/reagent/drug/maint/tar = 3 , /datum/reagent/toxin/acid/fluacid = 1) - required_catalysts = list(/datum/reagent/hydrogen_peroxide = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_TOXIN | REACTION_TAG_DAMAGING + required_catalysts = list(/datum/reagent/space_cleaner = 5) + /datum/chemical_reaction/maint_powder results = list(/datum/reagent/drug/maint/powder = 1) required_reagents = list(/datum/reagent/drug/maint/sludge = 6 , /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/consumable/enzyme = 1) - required_catalysts = list(/datum/reagent/acetone_oxide = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING - -//These drug item reactions should probably be converted to fermichem in the future. -/datum/chemical_reaction/moon_rock //botany is real easy so it requires a lot of kronkus_extract, make it cheaper if it doesnt get amde. - required_reagents = list(/datum/reagent/kronkus_extract = 15, /datum/reagent/fuel = 10, /datum/reagent/ammonia = 5) - mob_react = FALSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING - -/datum/chemical_reaction/moon_rock/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - var/obj/item/food/drug/moon_rock/new_rock = new(location) - new_rock.pixel_x = rand(-6, 6) - new_rock.pixel_y = rand(-6, 6) + required_catalysts = list(/datum/reagent/acetone = 5, /datum/reagent/oxygen = 5) /datum/chemical_reaction/blastoff_ampoule required_reagents = list(/datum/reagent/silver = 10, /datum/reagent/toxin/cyanide = 10, /datum/reagent/lye = 5) mob_react = FALSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/blastoff_ampoule/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -148,7 +115,7 @@ /datum/chemical_reaction/saturnx_glob required_reagents = list(/datum/reagent/lead = 5, /datum/reagent/consumable/nothing = 5, /datum/reagent/drug/maint/tar = 10) mob_react = FALSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DRUG | REACTION_TAG_ORGAN | REACTION_TAG_DAMAGING + /datum/chemical_reaction/saturnx_glob/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/gateway.dm b/code/modules/reagents/chemistry/recipes/gateway.dm new file mode 100644 index 000000000000..139d619d3c10 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/gateway.dm @@ -0,0 +1,16 @@ +// Reagents whose primary purpose is to be upgraded to another reagent. +/datum/chemical_reaction/acetone + results = list(/datum/reagent/acetone = 3) + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) + +/datum/chemical_reaction/oil + results = list(/datum/reagent/fuel/oil = 3) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/hydrogen = 1, /datum/reagent/carbon = 1) + +/datum/chemical_reaction/glycerol + results = list(/datum/reagent/glycerol = 1) + required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) + +/datum/chemical_reaction/phenol + results = list(/datum/reagent/phenol = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1) diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm index c1a6b44b3fd9..53b5cf626129 100644 --- a/code/modules/reagents/chemistry/recipes/medicine.dm +++ b/code/modules/reagents/chemistry/recipes/medicine.dm @@ -1,377 +1,199 @@ -/datum/chemical_reaction/medicine - required_reagents = null //Don't add this to master list - optimal_temp = 700 - optimal_ph_max = 10 - temp_exponent_factor = 1.2 - ph_exponent_factor = 0.8 - purity_min = 0.1 - rate_up_lim = 35 - reaction_tags = REACTION_TAG_HEALING | REACTION_TAG_EASY - -/datum/chemical_reaction/medicine/leporazine - results = list(/datum/reagent/medicine/leporazine = 2) - required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) - required_catalysts = list(/datum/reagent/toxin/plasma = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER +/datum/chemical_reaction/inaprovaline + results = list(/datum/reagent/medicine/inaprovaline = 3) + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/carbon = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phenol = 1) -/datum/chemical_reaction/medicine/rezadone - results = list(/datum/reagent/medicine/rezadone = 3) - required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_CLONE +/datum/chemical_reaction/dylovene + results = list(/datum/reagent/medicine/dylovene = 3) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/potassium = 1, /datum/reagent/ammonia = 1) -/datum/chemical_reaction/medicine/spaceacillin - results = list(/datum/reagent/medicine/spaceacillin = 2) - required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/oculine - results = list(/datum/reagent/medicine/oculine = 3) - required_reagents = list(/datum/reagent/medicine/c2/multiver = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) - mix_message = "The mixture bubbles noticeably and becomes a dark grey color!" - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN - //Fermichem vars - required_temp = 200 - optimal_temp = 400 - overheat_temp = 600 - optimal_ph_min = 4.8 - optimal_ph_max = 8.5 - determin_ph_range = 5 - temp_exponent_factor = 0.4 - ph_exponent_factor = 1.7 - thermic_constant = 1 - H_ion_release = 0.01 - rate_up_lim = 14.5 - purity_min = 0.3 - -/datum/chemical_reaction/medicine/oculine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - . = ..() - explode_flash(holder, equilibrium, equilibrium.reacted_vol/10, 10) +/datum/chemical_reaction/bicaridine + results = list(/datum/reagent/medicine/bicaridine = 2) + required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/carbon = 1, /datum/reagent/acetone = 1) -/datum/chemical_reaction/medicine/oculine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) +/datum/chemical_reaction/meralyne + results = list(/datum/reagent/medicine/meralyne = 2) + required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/medicine/epinephrine = 1, /datum/reagent/acetone = 1) + inhibitors = list(/datum/reagent/consumable/sugar = 1) // Messes up with inaprovaline + +/datum/chemical_reaction/meralyne/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) + . = ..() + explode_fire_vortex(holder, equilibrium, 2, 2, "overheat", TRUE) + +/datum/chemical_reaction/kelotane + results = list(/datum/reagent/medicine/kelotane = 2) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/carbon = 1) + is_cold_recipe = TRUE + optimal_temp = (-50 CELSIUS) - 50 + required_temp = -50 CELSIUS + overheat_temp = NO_OVERHEAT + +/datum/chemical_reaction/dermaline + results = list(/datum/reagent/medicine/dermaline = 3) + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/phosphorus = 1, /datum/reagent/medicine/kelotane = 1) + optimal_temp = (-50 CELSIUS) - 25 + required_temp = -50 CELSIUS + overheat_temp = NO_OVERHEAT + is_cold_recipe = TRUE + +/datum/chemical_reaction/dermaline/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) . = ..() - explode_flash(holder, equilibrium, 3, 30) + explode_fire_vortex(holder, equilibrium, 2, 2, "overheat", TRUE) +/datum/chemical_reaction/dexalin + results = list(/datum/reagent/medicine/dexalin = 1) + required_reagents = list(/datum/reagent/acetone = 2, /datum/reagent/toxin/plasma = 0.1) + inhibitors = list(/datum/reagent/water = 1) // Messes with cryox + thermic_constant = 20 // Harder to ignite plasma -/datum/chemical_reaction/medicine/inacusiate - results = list(/datum/reagent/medicine/inacusiate = 2) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/multiver = 1) - mix_message = "The mixture sputters loudly and becomes a light grey color!" - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN - //Fermichem vars - required_temp = 300 - optimal_temp = 400 - overheat_temp = 500 - optimal_ph_min = 5 - optimal_ph_max = 10 - determin_ph_range = 10 - temp_exponent_factor = 0.35 - ph_exponent_factor = 0.5 - thermic_constant = 20 - H_ion_release = 1.5 - rate_up_lim = 3 - purity_min = 0.25 +/datum/chemical_reaction/tricordrazine + results = list(/datum/reagent/medicine/tricordrazine = 5) + required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/medicine/kelotane = 1, /datum/reagent/medicine/dylovene = 1) + +/datum/chemical_reaction/ryetalyn + results = list(/datum/reagent/medicine/ryetalyn = 2) + required_reagents = list(/datum/reagent/medicine/potass_iodide = 1, /datum/reagent/carbon = 1) + +/datum/chemical_reaction/cryoxadone + results = list(/datum/reagent/medicine/cryoxadone = 3) + required_reagents = list(/datum/reagent/medicine/dexalin = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/acetone = 1) + required_temp = (-25 CELSIUS) - 100 + optimal_temp = (-25 CELSIUS) - 50 + overheat_temp = -25 CELSIUS + mix_message = "The solution turns into a blue sludge." -///Calls it over and over -/datum/chemical_reaction/medicine/inacusiate/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))]The [holder.my_atom] suddenly gives out a loud bang!")) - explode_deafen(holder, equilibrium, 0.5, 10, 3) +/datum/chemical_reaction/clonexadone + results = list(/datum/reagent/medicine/clonexadone = 2) + required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) + required_temp = -100 CELSIUS + optimal_temp = -100 CELSIUS + overheat_temp = -75 CELSIUS + mix_message = "The solution thickens into translucent slime." + +/datum/chemical_reaction/hyperzine + results = list(/datum/reagent/medicine/hyperzine = 3) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1, /datum/reagent/sulfur = 1) + +/datum/chemical_reaction/tramadol + results = list(/datum/reagent/medicine/tramadol = 3) + required_reagents = list(/datum/reagent/medicine/epinephrine = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1) + +/datum/chemical_reaction/oxycodone + results = list(/datum/reagent/medicine/tramadol/oxycodone = 1) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/tramadol = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) -/datum/chemical_reaction/medicine/inacusiate/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - var/power = equilibrium.reacted_vol/10 - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))]The [holder.my_atom] suddenly gives out an ear-crushingly loud bang!")) - explode_deafen(holder, equilibrium, power/2, power*2, max(power/2, 3)) - clear_products(holder) +/datum/chemical_reaction/spaceacillin + results = list(/datum/reagent/medicine/spaceacillin = 2) + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1) -/datum/chemical_reaction/medicine/synaptizine +/datum/chemical_reaction/synaptizine results = list(/datum/reagent/medicine/synaptizine = 3) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/salglu_solution - results = list(/datum/reagent/medicine/salglu_solution = 3) - required_reagents = list(/datum/reagent/consumable/salt = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN - -/datum/chemical_reaction/medicine/mine_salve - results = list(/datum/reagent/medicine/mine_salve = 3) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/mine_salve2 - results = list(/datum/reagent/medicine/mine_salve = 15) - required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/synthflesh - results = list(/datum/reagent/medicine/c2/synthflesh = 3) - required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1) - required_temp = 250 - optimal_temp = 310 - overheat_temp = 325 - optimal_ph_min = 5.5 - optimal_ph_max = 9.5 - determin_ph_range = 3 - temp_exponent_factor = 1 - ph_exponent_factor = 2 - thermic_constant = 10 - H_ion_release = -3.5 - rate_up_lim = 20 //affected by pH too - purity_min = 0.3 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/calomel - results = list(/datum/reagent/medicine/calomel = 2) - required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1) - required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/potass_iodide - results = list(/datum/reagent/medicine/potass_iodide = 2) - required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER + required_temp = 30 CELSIUS + optimal_temp = 80 CELSIUS + overheat_temp = 130 CELSIUS -/datum/chemical_reaction/medicine/pen_acid - results = list(/datum/reagent/medicine/pen_acid = 6) - required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER +/datum/chemical_reaction/alkysine + results = list(/datum/reagent/medicine/alkysine = 2) + required_reagents = list(/datum/reagent/toxin/acid/hydrochloric = 1, /datum/reagent/ammonia = 1, /datum/reagent/medicine/dylovene = 1) -/datum/chemical_reaction/medicine/sal_acid - results = list(/datum/reagent/medicine/sal_acid = 5) - required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE +/datum/chemical_reaction/morphine + results = list(/datum/reagent/medicine/morphine = 2) + required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) + required_temp = 480 -/datum/chemical_reaction/medicine/oxandrolone - results = list(/datum/reagent/medicine/oxandrolone = 6) - required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN +/datum/chemical_reaction/imidazoline + results = list(/datum/reagent/medicine/imidazoline = 2) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/phosphorus = 1, /datum/reagent/medicine/dylovene = 1) -/datum/chemical_reaction/medicine/salbutamol - results = list(/datum/reagent/medicine/salbutamol = 5) - required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OXY +/datum/chemical_reaction/peridaxon + results = list(/datum/reagent/medicine/peridaxon = 2) + required_reagents = list(/datum/reagent/medicine/bicaridine = 2, /datum/reagent/medicine/clonexadone = 2) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) -/datum/chemical_reaction/medicine/ephedrine +/datum/chemical_reaction/leporazine + results = list(/datum/reagent/medicine/leporazine = 2) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1) + required_catalysts = list(/datum/reagent/toxin/plasma = 5) + +/datum/chemical_reaction/coagulant + results = list(/datum/reagent/medicine/coagulant = 2) + required_reagents = list(/datum/reagent/calcium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/glycerol = 1) + +/datum/chemical_reaction/epinephrine + results = list(/datum/reagent/medicine/epinephrine = 6) + required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) + +/datum/chemical_reaction/ephedrine results = list(/datum/reagent/medicine/ephedrine = 4) required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1) mix_message = "The solution fizzes and gives off toxic fumes." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER | REACTION_TAG_DANGEROUS - //FermiChem vars: required_temp = 200 optimal_temp = 300 overheat_temp = 500 - optimal_ph_min = 7 - optimal_ph_max = 9 - determin_ph_range = 3 temp_exponent_factor = 0.1 - ph_exponent_factor = 0.8 thermic_constant = -0.25 - H_ion_release = -0.02 rate_up_lim = 15 - purity_min = 0.32 -/datum/chemical_reaction/medicine/ephedrine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) +/datum/chemical_reaction/ephedrine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) default_explode(holder, equilibrium.reacted_vol, 0, 25) -/datum/chemical_reaction/medicine/ephedrine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - default_explode(holder, equilibrium.reacted_vol, 0, 20) +/datum/chemical_reaction/haloperidol + results = list(/datum/reagent/medicine/haloperidol = 4) + required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) -/datum/chemical_reaction/medicine/diphenhydramine - results = list(/datum/reagent/medicine/diphenhydramine = 4) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) - mix_message = "The mixture dries into a pale blue powder." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER +/datum/chemical_reaction/potass_iodide + results = list(/datum/reagent/medicine/potass_iodide = 2) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/iodine = 1) + mix_message = "The solution settles calmly and emits gentle fumes." -/datum/chemical_reaction/medicine/atropine - results = list(/datum/reagent/medicine/atropine = 5) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE |REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY +/datum/chemical_reaction/salgu_solution + results = list(/datum/reagent/medicine/saline_glucose = 3) + required_reagents = list(/datum/reagent/consumable/salt = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/water = 1) -/datum/chemical_reaction/medicine/epinephrine - results = list(/datum/reagent/medicine/epinephrine = 6) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE |REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/strange_reagent - results = list(/datum/reagent/medicine/strange_reagent = 3) - required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/strange_reagent/alt - results = list(/datum/reagent/medicine/strange_reagent = 2) - required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_PLANT | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/mannitol - results = list(/datum/reagent/medicine/mannitol = 3) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/hydrogen = 1, /datum/reagent/water = 1) - mix_message = "The solution slightly bubbles, becoming thicker." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN - //FermiChem vars: - required_temp = 50 - optimal_temp = 300 - overheat_temp = 650 - optimal_ph_min = 5 - optimal_ph_max = 7.5 - determin_ph_range = 3 - temp_exponent_factor = 1 - ph_exponent_factor = 1 - thermic_constant = 100 - H_ion_release = 0 - rate_up_lim = 10 - purity_min = 0.4 - -/datum/chemical_reaction/medicine/mannitol/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - if(off_cooldown(holder, equilibrium, 10, "mannitol")) - explode_attack_chem(holder, equilibrium, /datum/reagent/impurity/mannitol, 5) - explode_invert_smoke(holder, equilibrium) - -/datum/chemical_reaction/medicine/mannitol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - overheated(holder, equilibrium, vol_added) - -/datum/chemical_reaction/medicine/neurine - results = list(/datum/reagent/medicine/neurine = 3) - required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN - //FermiChem vars: - required_temp = 100 - optimal_temp = 500 - overheat_temp = 700 - optimal_ph_min = 6.8 - optimal_ph_max = 10 - determin_ph_range = 8 - temp_exponent_factor = 0.8 - ph_exponent_factor = 2 - thermic_constant = 87 - H_ion_release = -0.05 - rate_up_lim = 15 - purity_min = 0.4 - -/datum/chemical_reaction/medicine/neurine/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - if(off_cooldown(holder, equilibrium, 10, "neurine")) - explode_invert_smoke(holder, equilibrium, clear_products = FALSE, clear_reactants = FALSE) - explode_attack_chem(holder, equilibrium, /datum/reagent/inverse/neurine, 10) - clear_products(holder, 5) - -/datum/chemical_reaction/medicine/neurine/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - overheated(holder, equilibrium, vol_added) - -/datum/chemical_reaction/medicine/mutadone - results = list(/datum/reagent/medicine/mutadone = 3) - required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/antihol - results = list(/datum/reagent/medicine/antihol = 3) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/c2/multiver = 1, /datum/reagent/copper = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - //FermiChem vars: - required_temp = 1 - optimal_temp = 300 - overheat_temp = 550 - optimal_ph_min = 3.5 - optimal_ph_max = 8.5 - determin_ph_range = 5 - temp_exponent_factor = 2 - ph_exponent_factor = 2 - thermic_constant = -100 - H_ion_release = 0.09 - rate_up_lim = 25 - purity_min = 0.15 - reaction_flags = REACTION_CLEAR_INVERSE - -/datum/chemical_reaction/medicine/antihol/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - explode_smoke(holder, equilibrium) - -/datum/chemical_reaction/medicine/antihol/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - explode_smoke(holder, equilibrium) - - -/datum/chemical_reaction/medicine/cryoxadone - results = list(/datum/reagent/medicine/cryoxadone = 3) - required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_PLANT | REACTION_TAG_BRUTE |REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY | REACTION_TAG_CLONE +/datum/chemical_reaction/synthflesh + results = list(/datum/reagent/medicine/synthflesh = 3) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/blood = 1, /datum/reagent/medicine/meralyne = 1) + mix_message = "The mixture bubbles, emitting an acrid reek." -/datum/chemical_reaction/medicine/pyroxadone - results = list(/datum/reagent/medicine/pyroxadone = 2) - required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE |REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY | REACTION_TAG_CLONE +/datum/chemical_reaction/atropine + results = list(/datum/reagent/medicine/atropine = 4) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/diethylamine = 1, /datum/reagent/acetone = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1) + mix_message = "A horrid smell like something died drifts from the mixture." -/datum/chemical_reaction/medicine/clonexadone - results = list(/datum/reagent/medicine/clonexadone = 2) - required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1) - required_catalysts = list(/datum/reagent/toxin/plasma = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_CLONE +/datum/chemical_reaction/chlorpromazine + results = list(/datum/reagent/medicine/chlorpromazine = 2) + required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/haloperidol = 1, /datum/reagent/chlorine = 1) -/datum/chemical_reaction/medicine/haloperidol - results = list(/datum/reagent/medicine/haloperidol = 5) - required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER +/datum/chemical_reaction/inacusiate + results = list(/datum/reagent/medicine/inacusiate = 2) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/dylovene = 1) + mix_message = "The mixture sputters loudly and becomes a light grey color." + required_temp = 300 + optimal_temp = 400 + overheat_temp = 500 + temp_exponent_factor = 0.35 + thermic_constant = 20 + rate_up_lim = 3 -/datum/chemical_reaction/medicine/regen_jelly - results = list(/datum/reagent/medicine/regen_jelly = 2) - required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE |REACTION_TAG_BURN | REACTION_TAG_TOXIN | REACTION_TAG_OXY +/datum/chemical_reaction/ipecac + results = list(/datum/reagent/medicine/ipecac = 2) + required_reagents = list(/datum/reagent/glycerol = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/dylovene = 1) -/datum/chemical_reaction/medicine/higadrite - results = list(/datum/reagent/medicine/higadrite = 3) - required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_ORGAN +/datum/chemical_reaction/charcoal + results = list(/datum/reagent/medicine/activated_charcoal = 3) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/salt = 1) + mix_message = "The mixture yields a fine black powder." + mix_sound = 'sound/effects/fuse.ogg' -/datum/chemical_reaction/medicine/morphine - results = list(/datum/reagent/medicine/morphine = 2) - required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1) - required_temp = 480 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER | REACTION_TAG_DRUG - -/datum/chemical_reaction/medicine/modafinil - results = list(/datum/reagent/medicine/modafinil = 5) - required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1) - required_catalysts = list(/datum/reagent/bromine = 1) // as close to the real world synthesis as possible - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/psicodine - results = list(/datum/reagent/medicine/psicodine = 5) - required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/medicine/granibitaluri - results = list(/datum/reagent/medicine/granibitaluri = 3) - required_reagents = list(/datum/reagent/consumable/salt = 1, /datum/reagent/carbon = 1, /datum/reagent/toxin/acid = 1) - required_catalysts = list(/datum/reagent/iron = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN - -///medical stacks - -/datum/chemical_reaction/medicine/medsuture - required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) //This might be a bit much, reagent cost should be reviewed after implementation. - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE - -/datum/chemical_reaction/medicine/medsuture/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/medical/suture/medicated(location) - -/datum/chemical_reaction/medicine/medmesh - required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/medmesh/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/medical/mesh/advanced(location) - -/datum/chemical_reaction/medicine/poultice - required_reagents = list(/datum/reagent/toxin/bungotoxin = 20, /datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_HEALING | REACTION_TAG_BRUTE | REACTION_TAG_BURN - -/datum/chemical_reaction/medicine/poultice/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/medical/poultice(location) - -/datum/chemical_reaction/medicine/seraka_destroy //seraka extract is destroyed by sodium hydroxide - results = list(/datum/reagent/consumable/sugar = 1) - required_reagents = list(/datum/reagent/medicine/coagulant/seraka_extract = 1, /datum/reagent/lye = 1) - reaction_tags = REACTION_TAG_EASY +/datum/chemical_reaction/antihol + results = list(/datum/reagent/medicine/antihol = 2) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/activated_charcoal = 1) + mix_message = "A minty and refreshing smell drifts from the effervescent mixture." + +/datum/chemical_reaction/diphenhydramine + results = list(/datum/reagent/medicine/diphenhydramine = 4) + // Chlorine is a good enough substitute for bromine right? + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/chlorine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1) + mix_message = "The mixture fizzes gently." diff --git a/code/modules/reagents/chemistry/recipes/other.dm b/code/modules/reagents/chemistry/recipes/other.dm new file mode 100644 index 000000000000..f2f3fcf10f84 --- /dev/null +++ b/code/modules/reagents/chemistry/recipes/other.dm @@ -0,0 +1,631 @@ +/datum/chemical_reaction/lube + results = list(/datum/reagent/lube = 4) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) + + +/datum/chemical_reaction/impedrezene + 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/cryptobiolin + results = list(/datum/reagent/cryptobiolin = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) + + +/datum/chemical_reaction/glycerol + results = list(/datum/reagent/glycerol = 1) + required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) + + +/datum/chemical_reaction/sodiumchloride + results = list(/datum/reagent/consumable/salt = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) + + +/datum/chemical_reaction/hydrochloric + results = list(/datum/reagent/toxin/acid/hydrochloric = 3) + required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/chlorine = 1, /datum/reagent/water = 1) + +/datum/chemical_reaction/stable_plasma + results = list(/datum/reagent/stable_plasma = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1) + required_catalysts = list(/datum/reagent/stabilizing_agent = 1) + +/datum/chemical_reaction/unstable_mutagen + results = list(/datum/reagent/toxin/mutagen = 1) + required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/toxin/plasma = 1, /datum/reagent/uranium/radium = 1) + +/datum/chemical_reaction/plasma_solidification + required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/plasma_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/mineral/plasma(location) + +/datum/chemical_reaction/gold_solidification + required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/gold_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/mineral/gold(location) + +/datum/chemical_reaction/uranium_solidification + required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/uranium = 20, /datum/reagent/potassium = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/uranium_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/mineral/uranium(location) + +/datum/chemical_reaction/capsaicincondensation + results = list(/datum/reagent/consumable/condensedcapsaicin = 5) + required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5) + + +/datum/chemical_reaction/soapification + required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles + required_temp = 374 + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/soap/homemade(location) + +/datum/chemical_reaction/omegasoapification + required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) + required_temp = 999 + optimal_temp = 999 + overheat_temp = 1200 + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/omegasoapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/soap/omega(location) + +/datum/chemical_reaction/candlefication + required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) // + required_temp = 374 + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/candle(location) + +/datum/chemical_reaction/meatification + required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/food/meat/slab/meatproduct(location) + return + +/datum/chemical_reaction/carbondioxide + results = list(/datum/reagent/carbondioxide = 3) + required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 2) + required_temp = 777 // pure carbon isn't especially reactive. + + +/datum/chemical_reaction/nitrous_oxide + results = list(/datum/reagent/nitrous_oxide = 5) + required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2) + required_temp = 525 + optimal_temp = 550 + overheat_temp = 575 + temp_exponent_factor = 0.2 + thermic_constant = 35 //gives a bonus 15C wiggle room + rate_up_lim = 25 //Give a chance to pull back + +/datum/chemical_reaction/nitrous_oxide/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) + return //This is empty because the explosion reaction will occur instead (see pyrotechnics.dm). This is just here to update the lookup ui. + + +//Technically a mutation toxin +/datum/chemical_reaction/mulligan + results = list(/datum/reagent/mulligan = 1) + required_reagents = list(/datum/reagent/mutationtoxin/jelly = 1, /datum/reagent/toxin/mutagen = 1) + + + +////////////////////////////////// VIROLOGY ////////////////////////////////////////// + +/datum/chemical_reaction/virus_food + results = list(/datum/reagent/consumable/virus_food = 15) + required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/milk = 5) + +/datum/chemical_reaction/virus_food_mutagen + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) + required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/consumable/virus_food = 1) + +/datum/chemical_reaction/virus_food_synaptizine + results = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) + required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/virus_food = 1) + +/datum/chemical_reaction/virus_food_plasma + results = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) + required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/virus_food = 1) + thermic_constant = 20 // Harder to ignite plasma + +/datum/chemical_reaction/virus_food_plasma_synaptizine + results = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 2) + required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/toxin/plasma/plasmavirusfood = 1) + thermic_constant = 20 // Harder to ignite plasma + +/datum/chemical_reaction/virus_food_mutagen_sugar + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) + +/datum/chemical_reaction/virus_food_mutagen_salineglucose + results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) + required_reagents = list(/datum/reagent/medicine/saline_glucose = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) + +/datum/chemical_reaction/virus_food_uranium + results = list(/datum/reagent/uranium/uraniumvirusfood = 1) + required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/virus_food = 1) + +/datum/chemical_reaction/virus_food_uranium_plasma + results = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) + required_reagents = list(/datum/reagent/uranium = 5, /datum/reagent/toxin/plasma/plasmavirusfood = 1) + +/datum/chemical_reaction/virus_food_uranium_plasma_gold + results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) + required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/gold = 10, /datum/reagent/toxin/plasma = 1) + +/datum/chemical_reaction/virus_food_uranium_plasma_silver + results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) + required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/silver = 10, /datum/reagent/toxin/plasma = 1) + +/datum/chemical_reaction/mix_virus + results = list(/datum/reagent/blood = 1) + required_reagents = list(/datum/reagent/consumable/virus_food = 1) + required_catalysts = list(/datum/reagent/blood = 1) + var/level_min = 1 + var/level_max = 2 + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B?.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level_min, level_max) + + +/datum/chemical_reaction/mix_virus/mix_virus_2 + required_reagents = list(/datum/reagent/toxin/mutagen = 1) + level_min = 2 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_3 + required_reagents = list(/datum/reagent/toxin/plasma = 1) + level_min = 4 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_4 + required_reagents = list(/datum/reagent/uranium = 1) + level_min = 5 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_5 + required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) + level_min = 3 + level_max = 3 + +/datum/chemical_reaction/mix_virus/mix_virus_6 + required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 1) + level_min = 4 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_7 + required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 1) + level_min = 5 + level_max = 5 + +/datum/chemical_reaction/mix_virus/mix_virus_8 + required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) + level_min = 6 + level_max = 6 + +/datum/chemical_reaction/mix_virus/mix_virus_9 + required_reagents = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) + level_min = 1 + level_max = 1 + +/datum/chemical_reaction/mix_virus/mix_virus_10 + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood = 1) + level_min = 6 + level_max = 7 + +/datum/chemical_reaction/mix_virus/mix_virus_11 + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) + level_min = 7 + level_max = 7 + +/datum/chemical_reaction/mix_virus/mix_virus_12 + required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) + level_min = 8 + level_max = 8 + +/datum/chemical_reaction/mix_virus/rem_virus + required_reagents = list(/datum/reagent/medicine/synaptizine = 1) + required_catalysts = list(/datum/reagent/blood = 1) + +/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B?.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() + +/datum/chemical_reaction/mix_virus/neuter_virus + required_reagents = list(/datum/reagent/space_cleaner = 1) + required_catalysts = list(/datum/reagent/blood = 1) + +/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B?.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Neuter() + + + +////////////////////////////////// foam and foam precursor /////////////////////////////////////////////////// + + +/datum/chemical_reaction/surfactant + results = list(/datum/reagent/fluorosurfactant = 5) + required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1) + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/foam + required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + holder.create_foam(/datum/effect_system/fluid_spread/foam, 2*created_volume, notification = span_danger("The solution spews out foam!")) + + +/datum/chemical_reaction/metalfoam + required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + holder.create_foam(/datum/effect_system/fluid_spread/foam/metal, 5*created_volume, /obj/structure/foamedmetal, span_danger("The solution spews out a metallic foam!")) + +/datum/chemical_reaction/ironfoam + required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + holder.create_foam(/datum/effect_system/fluid_spread/foam/metal/iron, 5 * created_volume, /obj/structure/foamedmetal/iron, span_danger("The solution spews out a metallic foam!")) + +/datum/chemical_reaction/foaming_agent + results = list(/datum/reagent/foaming_agent = 1) + required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrogen = 1) + + +/////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// + +/datum/chemical_reaction/ammonia + results = list(/datum/reagent/ammonia = 3) + required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1) + + +/datum/chemical_reaction/diethylamine + results = list(/datum/reagent/diethylamine = 2) + required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1) + + +/datum/chemical_reaction/plantbgone + results = list(/datum/reagent/toxin/plantbgone = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) + + +/datum/chemical_reaction/weedkiller + results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4) + +/datum/chemical_reaction/pestkiller + results = list(/datum/reagent/toxin/pestkiller = 5) + required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/ethanol = 4) + + +//////////////////////////////////// Other goon stuff /////////////////////////////////////////// + +/datum/chemical_reaction/acetone + results = list(/datum/reagent/acetone = 3) + required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) + +/datum/chemical_reaction/oil + results = list(/datum/reagent/fuel/oil = 3) + required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) + + +/datum/chemical_reaction/phenol + results = list(/datum/reagent/phenol = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1) + + +/datum/chemical_reaction/ash + results = list(/datum/reagent/ash = 1) + required_reagents = list(/datum/reagent/fuel/oil = 1) + required_temp = 480 + + +/datum/chemical_reaction/colorful_reagent + results = list(/datum/reagent/colorful_reagent = 5) + required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) + +/datum/chemical_reaction/life + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/blood = 1) + required_temp = 374 + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN + +/datum/chemical_reaction/life_friendly + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/consumable/sugar = 1) + required_temp = 374 + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) + +/datum/chemical_reaction/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 + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + 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) + ..() + +//monkey powder heehoo +/datum/chemical_reaction/monkey_powder + results = list(/datum/reagent/monkey_powder = 5) + required_reagents = list(/datum/reagent/consumable/banana = 1, /datum/reagent/consumable/nutriment=2, /datum/reagent/liquidgibs = 1) + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/monkey + required_reagents = list(/datum/reagent/monkey_powder = 50, /datum/reagent/water = 1) + mix_message = "Expands into a brown mass before shaping itself into a monkey!." + +/datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/mob/living/carbon/M = holder.my_atom + var/location = get_turf(M) + if(istype(M, /mob/living/carbon)) + if(ismonkey(M)) + M.gib() + else + M.vomit(blood = TRUE, stun = TRUE) //not having a redo of itching powder (hopefully) + new /mob/living/carbon/human/species/monkey(location, TRUE) + +//water electrolysis +/datum/chemical_reaction/electrolysis + results = list(/datum/reagent/oxygen = 1.5, /datum/reagent/hydrogen = 3) + required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5) + + +//butterflium +/datum/chemical_reaction/butterflium + required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in rand(1, created_volume) to created_volume) + new /mob/living/simple_animal/butterfly(location) + ..() +//scream powder +/datum/chemical_reaction/scream + required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/cream = 5) + required_temp = 374 + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/scream/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE) + +/datum/chemical_reaction/hair_dye + results = list(/datum/reagent/hair_dye = 5) + required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) + +/datum/chemical_reaction/saltpetre + results = list(/datum/reagent/saltpetre = 3) + required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3) + + +/datum/chemical_reaction/lye + results = list(/datum/reagent/lye = 3) + required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) + required_temp = 10 //So hercuri still shows life. + + +/datum/chemical_reaction/lye2 + results = list(/datum/reagent/lye = 2) + required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1) + + +/datum/chemical_reaction/royal_bee_jelly + results = list(/datum/reagent/royal_bee_jelly = 5) + required_reagents = list(/datum/reagent/toxin/mutagen = 10, /datum/reagent/consumable/honey = 40) + + +/datum/chemical_reaction/laughter + results = list(/datum/reagent/consumable/laughter = 10) // Fuck it. I'm not touching this one. + required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/banana = 1) + + +/datum/chemical_reaction/plastic_polymers + required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) + required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/plastic(location) + +/datum/chemical_reaction/pax + results = list(/datum/reagent/pax = 3) + required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1) + + +/datum/chemical_reaction/yuck + results = list(/datum/reagent/yuck = 4) + required_reagents = list(/datum/reagent/fuel = 3) + required_container = /obj/item/food/deadmouse + + + +/datum/chemical_reaction/slimejelly + results = list(/datum/reagent/toxin/slimejelly = 5) + required_reagents = list(/datum/reagent/fuel/oil = 3, /datum/reagent/uranium/radium = 2, /datum/reagent/consumable/tinlux =1) + required_container = /obj/item/food/grown/mushroom/glowshroom + mix_message = "The mushroom's insides bubble and pop and it becomes very limp." + + +/datum/chemical_reaction/slime_extractification + required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) + mix_message = "The mixture condenses into a ball." + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/slime_extract/grey(location) + +/datum/chemical_reaction/cellulose_carbonization + results = list(/datum/reagent/carbon = 1) + required_reagents = list(/datum/reagent/cellulose = 1) + required_temp = 512 + + +/datum/chemical_reaction/space_cleaner + results = list(/datum/reagent/space_cleaner = 3) + required_reagents = list(/datum/reagent/water = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) + +/datum/chemical_reaction/holywater + results = list(/datum/reagent/water/holywater = 1) + required_reagents = list(/datum/reagent/water/hollowwater = 1) + required_catalysts = list(/datum/reagent/water/holywater = 1) + +/datum/chemical_reaction/silver_solidification + required_reagents = list(/datum/reagent/silver = 20, /datum/reagent/carbon = 10) + required_temp = 630 + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/silver_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/mineral/silver(location) + +/datum/chemical_reaction/bone_gel + required_reagents = list(/datum/reagent/bone_dust = 10, /datum/reagent/carbon = 10) + required_temp = 630 + mob_react = FALSE + reaction_flags = REACTION_INSTANT + + mix_message = "The solution clarifies, leaving an ashy gel." + +/datum/chemical_reaction/bone_gel/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/medical/bone_gel(location) + +////Ice and water + +/datum/chemical_reaction/ice + results = list(/datum/reagent/consumable/ice = 1.09)//density + required_reagents = list(/datum/reagent/water = 1) + is_cold_recipe = TRUE + required_temp = WATER_MATTERSTATE_CHANGE_TEMP-0.5 //274 So we can be sure that basic ghetto rigged stuff can freeze + optimal_temp = 200 + overheat_temp = 0 + thermic_constant = 0 + rate_up_lim = 50 + mix_message = "The solution freezes up into ice!" + reaction_flags = REACTION_COMPETITIVE + +/datum/chemical_reaction/water + results = list(/datum/reagent/water = 0.92)//rough density excahnge + required_reagents = list(/datum/reagent/consumable/ice = 1) + required_temp = WATER_MATTERSTATE_CHANGE_TEMP+0.5 + optimal_temp = 350 + overheat_temp = NO_OVERHEAT + thermic_constant = 0 + rate_up_lim = 50 + mix_message = "The ice melts back into water!" + + +//////////////////////////////////// + +/datum/chemical_reaction/ants // Breeding ants together, high sugar cost makes this take a while to farm. + results = list(/datum/reagent/ants = 3) + required_reagents = list(/datum/reagent/ants = 2, /datum/reagent/consumable/sugar = 8) + required_temp = 50 + reaction_flags = REACTION_INSTANT + + +/datum/chemical_reaction/ant_slurry // We're basically gluing ants together with synthflesh & maint sludge to make a bigger ant. + required_reagents = list(/datum/reagent/ants = 50, /datum/reagent/medicine/synthflesh = 20, /datum/reagent/drug/maint/sludge = 5) + required_temp = 480 + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/ant_slurry/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in rand(1, created_volume) to created_volume) + new /mob/living/simple_animal/hostile/ant(location) + ..() + +/datum/chemical_reaction/plastic_polymers + required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) + required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. + reaction_flags = REACTION_INSTANT + +/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + var/location = get_turf(holder.my_atom) + for(var/i in 1 to created_volume) + new /obj/item/stack/sheet/plastic(location) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm deleted file mode 100644 index 5e6f04a94bcb..000000000000 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ /dev/null @@ -1,934 +0,0 @@ - -/datum/chemical_reaction/sterilizine - results = list(/datum/reagent/space_cleaner/sterilizine = 3) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/c2/multiver = 1, /datum/reagent/chlorine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/lube - results = list(/datum/reagent/lube = 4) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/spraytan - results = list(/datum/reagent/spraytan = 2) - required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/spraytan2 - results = list(/datum/reagent/spraytan = 2) - required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/impedrezene - results = list(/datum/reagent/impedrezene = 2) - required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_ORGAN - -/datum/chemical_reaction/cryptobiolin - results = list(/datum/reagent/cryptobiolin = 3) - required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/glycerol - results = list(/datum/reagent/glycerol = 1) - required_reagents = list(/datum/reagent/consumable/cornoil = 3, /datum/reagent/toxin/acid = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_EXPLOSIVE - -/datum/chemical_reaction/sodiumchloride - results = list(/datum/reagent/consumable/salt = 3) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_FOOD - -/datum/chemical_reaction/stable_plasma - results = list(/datum/reagent/stable_plasma = 1) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_catalysts = list(/datum/reagent/stabilizing_agent = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/plasma_solidification - required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 20) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/plasma_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/sheet/mineral/plasma(location) - -/datum/chemical_reaction/gold_solidification - required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/gold = 20, /datum/reagent/iron = 1) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/gold_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/sheet/mineral/gold(location) - -/datum/chemical_reaction/uranium_solidification - required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/uranium = 20, /datum/reagent/potassium = 1) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/uranium_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/sheet/mineral/uranium(location) - -/datum/chemical_reaction/capsaicincondensation - results = list(/datum/reagent/consumable/condensedcapsaicin = 5) - required_reagents = list(/datum/reagent/consumable/capsaicin = 1, /datum/reagent/consumable/ethanol = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/soapification - required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/lye = 10) // requires two scooped gib tiles - required_temp = 374 - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/soap/homemade(location) - -/datum/chemical_reaction/omegasoapification - required_reagents = list(/datum/reagent/consumable/potato_juice = 10, /datum/reagent/consumable/ethanol/lizardwine = 10, /datum/reagent/monkey_powder = 10, /datum/reagent/drug/krokodil = 10, /datum/reagent/toxin/acid/nitracid = 10, /datum/reagent/baldium = 10, /datum/reagent/consumable/ethanol/hooch = 10, /datum/reagent/bluespace = 10, /datum/reagent/drug/pumpup = 10, /datum/reagent/consumable/space_cola = 10) - required_temp = 999 - optimal_temp = 999 - overheat_temp = 1200 - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/omegasoapification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/soap/omega(location) - -/datum/chemical_reaction/candlefication - required_reagents = list(/datum/reagent/liquidgibs = 5, /datum/reagent/oxygen = 5) // - required_temp = 374 - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/candle(location) - -/datum/chemical_reaction/meatification - required_reagents = list(/datum/reagent/liquidgibs = 10, /datum/reagent/consumable/nutriment = 10, /datum/reagent/carbon = 10) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/food/meat/slab/meatproduct(location) - return - -/datum/chemical_reaction/carbondioxide - results = list(/datum/reagent/carbondioxide = 3) - required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 2) - required_temp = 777 // pure carbon isn't especially reactive. - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/nitrous_oxide - results = list(/datum/reagent/nitrous_oxide = 5) - required_reagents = list(/datum/reagent/ammonia = 2, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 2) - required_temp = 525 - optimal_temp = 550 - overheat_temp = 575 - temp_exponent_factor = 0.2 - purity_min = 0.3 - thermic_constant = 35 //gives a bonus 15C wiggle room - rate_up_lim = 25 //Give a chance to pull back - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/nitrous_oxide/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - var/turf/exposed_turf = get_turf(holder.my_atom) - if(!exposed_turf) - return - exposed_turf.atmos_spawn_air(GAS_N2O, equilibrium.step_target_vol/2, holder?.chem_temp || T20C) - clear_products(holder, equilibrium.step_target_vol) - -/datum/chemical_reaction/nitrous_oxide/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - return //This is empty because the explosion reaction will occur instead (see pyrotechnics.dm). This is just here to update the lookup ui. - - -//Technically a mutation toxin -/datum/chemical_reaction/mulligan - results = list(/datum/reagent/mulligan = 1) - required_reagents = list(/datum/reagent/mutationtoxin/jelly = 1, /datum/reagent/toxin/mutagen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - - -////////////////////////////////// VIROLOGY ////////////////////////////////////////// - -/datum/chemical_reaction/virus_food - results = list(/datum/reagent/consumable/virus_food = 15) - required_reagents = list(/datum/reagent/water = 5, /datum/reagent/consumable/milk = 5) - -/datum/chemical_reaction/virus_food_mutagen - results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) - required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/consumable/virus_food = 1) - -/datum/chemical_reaction/virus_food_synaptizine - results = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) - required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/virus_food = 1) - -/datum/chemical_reaction/virus_food_plasma - results = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) - required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/consumable/virus_food = 1) - thermic_constant = 20 // To avoid the plasma boiling - -/datum/chemical_reaction/virus_food_plasma_synaptizine - results = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 2) - required_reagents = list(/datum/reagent/medicine/synaptizine = 1, /datum/reagent/toxin/plasma/plasmavirusfood = 1) - thermic_constant = 20 // To avoid the plasma boiling - -/datum/chemical_reaction/virus_food_mutagen_sugar - results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) - -/datum/chemical_reaction/virus_food_mutagen_salineglucose - results = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 2) - required_reagents = list(/datum/reagent/medicine/salglu_solution = 1, /datum/reagent/toxin/mutagen/mutagenvirusfood = 1) - -/datum/chemical_reaction/virus_food_uranium - results = list(/datum/reagent/uranium/uraniumvirusfood = 1) - required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/virus_food = 1) - -/datum/chemical_reaction/virus_food_uranium_plasma - results = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) - required_reagents = list(/datum/reagent/uranium = 5, /datum/reagent/toxin/plasma/plasmavirusfood = 1) - -/datum/chemical_reaction/virus_food_uranium_plasma_gold - results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) - required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/gold = 10, /datum/reagent/toxin/plasma = 1) - -/datum/chemical_reaction/virus_food_uranium_plasma_silver - results = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) - required_reagents = list(/datum/reagent/uranium = 10, /datum/reagent/silver = 10, /datum/reagent/toxin/plasma = 1) - -/datum/chemical_reaction/mix_virus - results = list(/datum/reagent/blood = 1) - required_reagents = list(/datum/reagent/consumable/virus_food = 1) - required_catalysts = list(/datum/reagent/blood = 1) - var/level_min = 1 - var/level_max = 2 - reaction_flags = REACTION_INSTANT - -/datum/chemical_reaction/mix_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B?.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level_min, level_max) - - -/datum/chemical_reaction/mix_virus/mix_virus_2 - required_reagents = list(/datum/reagent/toxin/mutagen = 1) - level_min = 2 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_3 - required_reagents = list(/datum/reagent/toxin/plasma = 1) - level_min = 4 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_4 - required_reagents = list(/datum/reagent/uranium = 1) - level_min = 5 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_5 - required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood = 1) - level_min = 3 - level_max = 3 - -/datum/chemical_reaction/mix_virus/mix_virus_6 - required_reagents = list(/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar = 1) - level_min = 4 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_7 - required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood/weak = 1) - level_min = 5 - level_max = 5 - -/datum/chemical_reaction/mix_virus/mix_virus_8 - required_reagents = list(/datum/reagent/toxin/plasma/plasmavirusfood = 1) - level_min = 6 - level_max = 6 - -/datum/chemical_reaction/mix_virus/mix_virus_9 - required_reagents = list(/datum/reagent/medicine/synaptizine/synaptizinevirusfood = 1) - level_min = 1 - level_max = 1 - -/datum/chemical_reaction/mix_virus/mix_virus_10 - required_reagents = list(/datum/reagent/uranium/uraniumvirusfood = 1) - level_min = 6 - level_max = 7 - -/datum/chemical_reaction/mix_virus/mix_virus_11 - required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/unstable = 1) - level_min = 7 - level_max = 7 - -/datum/chemical_reaction/mix_virus/mix_virus_12 - required_reagents = list(/datum/reagent/uranium/uraniumvirusfood/stable = 1) - level_min = 8 - level_max = 8 - -/datum/chemical_reaction/mix_virus/rem_virus - required_reagents = list(/datum/reagent/medicine/synaptizine = 1) - required_catalysts = list(/datum/reagent/blood = 1) - -/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B?.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() - -/datum/chemical_reaction/mix_virus/neuter_virus - required_reagents = list(/datum/reagent/toxin/formaldehyde = 1) - required_catalysts = list(/datum/reagent/blood = 1) - -/datum/chemical_reaction/mix_virus/neuter_virus/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B?.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Neuter() - - - -////////////////////////////////// foam and foam precursor /////////////////////////////////////////////////// - - -/datum/chemical_reaction/surfactant - results = list(/datum/reagent/fluorosurfactant = 5) - required_reagents = list(/datum/reagent/fluorine = 2, /datum/reagent/carbon = 2, /datum/reagent/toxin/acid = 1) - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/foam - required_reagents = list(/datum/reagent/fluorosurfactant = 1, /datum/reagent/water = 1) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - -/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/foam_spread,2*created_volume,notification=span_danger("The solution spews out foam!")) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/metalfoam - required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,1,span_danger("The solution spews out a metallic foam!")) - -/datum/chemical_reaction/smart_foam - required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/smart_foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) - mob_react = TRUE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/smart_foam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/foam_spread/metal/smart,5*created_volume,1,span_danger("The solution spews out metallic foam!")) - -/datum/chemical_reaction/ironfoam - required_reagents = list(/datum/reagent/iron = 3, /datum/reagent/foaming_agent = 1, /datum/reagent/toxin/acid/fluacid = 1) - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/foam_spread/metal,5*created_volume,2,span_danger("The solution spews out a metallic foam!")) - -/datum/chemical_reaction/foaming_agent - results = list(/datum/reagent/foaming_agent = 1) - required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/smart_foaming_agent - results = list(/datum/reagent/smart_foaming_agent = 3) - required_reagents = list(/datum/reagent/foaming_agent = 3, /datum/reagent/acetone = 1, /datum/reagent/iron = 1) - mix_message = "The solution mixes into a frothy metal foam and conforms to the walls of its container." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - - -/////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// - -/datum/chemical_reaction/ammonia - results = list(/datum/reagent/ammonia = 3) - required_reagents = list(/datum/reagent/hydrogen = 3, /datum/reagent/nitrogen = 1) - optimal_ph_min = 1 // Lets increase our range for this basic chem - optimal_ph_max = 12 - H_ion_release = -0.02 //handmade is more neutral - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT - -/datum/chemical_reaction/diethylamine - results = list(/datum/reagent/diethylamine = 2) - required_reagents = list (/datum/reagent/ammonia = 1, /datum/reagent/consumable/ethanol = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT - -/datum/chemical_reaction/space_cleaner - results = list(/datum/reagent/space_cleaner = 2) - required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/water = 1) - rate_up_lim = 40 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/plantbgone - results = list(/datum/reagent/toxin/plantbgone = 5) - required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/water = 4) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT - -/datum/chemical_reaction/weedkiller - results = list(/datum/reagent/toxin/plantbgone/weedkiller = 5) - required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/ammonia = 4) - H_ion_release = -0.05 // Push towards acidic - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT - -/datum/chemical_reaction/pestkiller - results = list(/datum/reagent/toxin/pestkiller = 5) - required_reagents = list(/datum/reagent/toxin = 1, /datum/reagent/consumable/ethanol = 4) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT - -/datum/chemical_reaction/drying_agent - results = list(/datum/reagent/drying_agent = 3) - required_reagents = list(/datum/reagent/stable_plasma = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/sodium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -//////////////////////////////////// Other goon stuff /////////////////////////////////////////// - -/datum/chemical_reaction/acetone - results = list(/datum/reagent/acetone = 3) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/carpet - results = list(/datum/reagent/carpet = 2) - required_reagents = list(/datum/reagent/drug/space_drugs = 1, /datum/reagent/blood = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/carpet/black - results = list(/datum/reagent/carpet/black = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/fuel/oil = 1) - -/datum/chemical_reaction/carpet/blue - results = list(/datum/reagent/carpet/blue = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/cryostylane = 1) - -/datum/chemical_reaction/carpet/cyan - results = list(/datum/reagent/carpet/cyan = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/toxin/cyanide = 1) - //cyan = cyanide get it huehueuhuehuehheuhe - -/datum/chemical_reaction/carpet/green - results = list(/datum/reagent/carpet/green = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/ethanol/beer/green = 1) - //make green beer by grinding up green crayons and mixing with beer - -/datum/chemical_reaction/carpet/orange - results = list(/datum/reagent/carpet/orange = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/orangejuice = 1) - -/datum/chemical_reaction/carpet/purple - results = list(/datum/reagent/carpet/purple = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/medicine/regen_jelly = 1) - //slimes only party - -/datum/chemical_reaction/carpet/red - results = list(/datum/reagent/carpet/red = 2) - required_reagents = list(/datum/reagent/carpet/ = 1, /datum/reagent/liquidgibs = 1) - -/datum/chemical_reaction/carpet/royalblack - results = list(/datum/reagent/carpet/royal/black = 2) - required_reagents = list(/datum/reagent/carpet/black = 1, /datum/reagent/royal_bee_jelly = 1) - -/datum/chemical_reaction/carpet/royalblue - results = list(/datum/reagent/carpet/royal/blue = 2) - required_reagents = list(/datum/reagent/carpet/blue = 1, /datum/reagent/royal_bee_jelly = 1) - -/datum/chemical_reaction/carpet/simple_neon_white - results = list(/datum/reagent/carpet/neon/simple_white = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/sodium = 1) - -/datum/chemical_reaction/carpet/simple_neon_red - results = list(/datum/reagent/carpet/neon/simple_red = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/toxin/mindbreaker = 1) - -/datum/chemical_reaction/carpet/simple_neon_orange - results = list(/datum/reagent/carpet/neon/simple_orange = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/consumable/vitfro = 1) - -/datum/chemical_reaction/carpet/simple_neon_yellow - results = list(/datum/reagent/carpet/neon/simple_yellow = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/stabilizing_agent = 1) - -/datum/chemical_reaction/carpet/simple_neon_lime - results = list(/datum/reagent/carpet/neon/simple_lime = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/consumable/limejuice = 1) - -/datum/chemical_reaction/carpet/simple_neon_green - results = list(/datum/reagent/carpet/neon/simple_green = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/toxin/mutagen = 1) - -/datum/chemical_reaction/carpet/simple_neon_cyan - results = list(/datum/reagent/carpet/neon/simple_cyan = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/salbutamol = 1) - -/datum/chemical_reaction/carpet/simple_neon_teal - results = list(/datum/reagent/carpet/neon/simple_teal = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/drug/nicotine = 1) - -/datum/chemical_reaction/carpet/simple_neon_blue - results = list(/datum/reagent/carpet/neon/simple_blue = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/drug/happiness = 1) - -/datum/chemical_reaction/carpet/simple_neon_purple - results = list(/datum/reagent/carpet/neon/simple_purple = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/plasma_oxide = 1) - -/datum/chemical_reaction/carpet/simple_neon_violet - results = list(/datum/reagent/carpet/neon/simple_violet = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/c2/helbital = 1) - -/datum/chemical_reaction/carpet/simple_neon_pink - results = list(/datum/reagent/carpet/neon/simple_pink = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/impedrezene = 1) - -/datum/chemical_reaction/carpet/simple_neon_black - results = list(/datum/reagent/carpet/neon/simple_black = 2) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/consumable/tinlux = 1, /datum/reagent/medicine/c2/multiver = 1) - -/datum/chemical_reaction/oil - results = list(/datum/reagent/fuel/oil = 3) - required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/phenol - results = list(/datum/reagent/phenol = 3) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/chlorine = 1, /datum/reagent/fuel/oil = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/ash - results = list(/datum/reagent/ash = 1) - required_reagents = list(/datum/reagent/fuel/oil = 1) - required_temp = 480 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT - -/datum/chemical_reaction/colorful_reagent - results = list(/datum/reagent/colorful_reagent = 5) - required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) - -/datum/chemical_reaction/life - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/blood = 1) - required_temp = 374 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN - -/datum/chemical_reaction/life_friendly - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/c2/synthflesh = 1, /datum/reagent/consumable/sugar = 1) - required_temp = 374 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) - -/datum/chemical_reaction/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 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - 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) - ..() - -//monkey powder heehoo -/datum/chemical_reaction/monkey_powder - results = list(/datum/reagent/monkey_powder = 5) - required_reagents = list(/datum/reagent/consumable/banana = 1, /datum/reagent/consumable/nutriment=2, /datum/reagent/liquidgibs = 1) - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/monkey - required_reagents = list(/datum/reagent/monkey_powder = 50, /datum/reagent/water = 1) - mix_message = "Expands into a brown mass before shaping itself into a monkey!." - -/datum/chemical_reaction/monkey/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/mob/living/carbon/M = holder.my_atom - var/location = get_turf(M) - if(istype(M, /mob/living/carbon)) - if(ismonkey(M)) - M.gib() - else - M.vomit(blood = TRUE, stun = TRUE) //not having a redo of itching powder (hopefully) - new /mob/living/carbon/human/species/monkey(location, TRUE) - -//water electrolysis -/datum/chemical_reaction/electrolysis - results = list(/datum/reagent/oxygen = 1.5, /datum/reagent/hydrogen = 3) - required_reagents = list(/datum/reagent/consumable/liquidelectricity = 1, /datum/reagent/water = 5) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -//butterflium -/datum/chemical_reaction/butterflium - required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1) - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in rand(1, created_volume) to created_volume) - new /mob/living/simple_animal/butterfly(location) - ..() -//scream powder -/datum/chemical_reaction/scream - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/cream = 5, /datum/reagent/consumable/ethanol/lizardwine = 5 ) - required_temp = 374 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/scream/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - playsound(holder.my_atom, pick(list( 'sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg', 'sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg', 'sound/voice/human/wilhelm_scream.ogg')), created_volume*5,TRUE) - -/datum/chemical_reaction/hair_dye - results = list(/datum/reagent/hair_dye = 5) - required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/barbers_aid - results = list(/datum/reagent/barbers_aid = 5) - required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/concentrated_barbers_aid - results = list(/datum/reagent/concentrated_barbers_aid = 2) - required_reagents = list(/datum/reagent/barbers_aid = 1, /datum/reagent/toxin/mutagen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/baldium - results = list(/datum/reagent/baldium = 1) - required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/lye = 1) - required_temp = 395 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/saltpetre - results = list(/datum/reagent/saltpetre = 3) - required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/nitrogen = 1, /datum/reagent/oxygen = 3) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT - -/datum/chemical_reaction/lye - results = list(/datum/reagent/lye = 3) - required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1) - required_temp = 10 //So hercuri still shows life. - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/lye2 - results = list(/datum/reagent/lye = 2) - required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/water = 1, /datum/reagent/carbon = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/royal_bee_jelly - results = list(/datum/reagent/royal_bee_jelly = 5) - required_reagents = list(/datum/reagent/toxin/mutagen = 10, /datum/reagent/consumable/honey = 40) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT - -/datum/chemical_reaction/laughter - results = list(/datum/reagent/consumable/laughter = 10) // Fuck it. I'm not touching this one. - required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/banana = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/plastic_polymers - required_reagents = list(/datum/reagent/fuel/oil = 5, /datum/reagent/toxin/acid = 2, /datum/reagent/ash = 3) - required_temp = 374 //lazily consistent with soap & other crafted objects generically created with heat. - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/plastic_polymers/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/sheet/plastic(location) - -/datum/chemical_reaction/pax - results = list(/datum/reagent/pax = 3) - required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/water = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/yuck - results = list(/datum/reagent/yuck = 4) - required_reagents = list(/datum/reagent/fuel = 3) - required_container = /obj/item/food/deadmouse - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_FOOD | REACTION_TAG_DAMAGING - - -/datum/chemical_reaction/slimejelly - results = list(/datum/reagent/toxin/slimejelly = 5) - required_reagents = list(/datum/reagent/fuel/oil = 3, /datum/reagent/uranium/radium = 2, /datum/reagent/consumable/tinlux =1) - required_container = /obj/item/food/grown/mushroom/glowshroom - mix_message = "The mushroom's insides bubble and pop and it becomes very limp." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_PLANT | REACTION_TAG_DAMAGING | REACTION_TAG_TOXIN | REACTION_TAG_SLIME - -/datum/chemical_reaction/slime_extractification - required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) - mix_message = "The mixture condenses into a ball." - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME - -/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/slime_extract/grey(location) - -/datum/chemical_reaction/metalgen_imprint - required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) - results = list(/datum/reagent/metalgen = 1) - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/metalgen_imprint/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/datum/reagent/metalgen/MM = holder.get_reagent(/datum/reagent/metalgen) - for(var/datum/reagent/R in holder.reagent_list) - if(R.material && R.volume >= 40) - MM.data["material"] = R.material - holder.remove_reagent(R.type, 40) - -/datum/chemical_reaction/gravitum - required_reagents = list(/datum/reagent/wittel = 1, /datum/reagent/sorium = 10) - results = list(/datum/reagent/gravitum = 10) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/cellulose_carbonization - results = list(/datum/reagent/carbon = 1) - required_reagents = list(/datum/reagent/cellulose = 1) - required_temp = 512 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_PLANT - -/datum/chemical_reaction/hydrogen_peroxide - results = list(/datum/reagent/hydrogen_peroxide = 3) - required_reagents = list(/datum/reagent/water = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DAMAGING | REACTION_TAG_BURN - -/datum/chemical_reaction/acetone_oxide - results = list(/datum/reagent/acetone_oxide = 2) - required_reagents = list(/datum/reagent/acetone = 2, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen_peroxide = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DAMAGING | REACTION_TAG_BURN - -/datum/chemical_reaction/pentaerythritol - results = list(/datum/reagent/pentaerythritol = 2) - required_reagents = list(/datum/reagent/acetaldehyde = 1, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/water = 1 ) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/acetaldehyde - results = list(/datum/reagent/acetaldehyde = 3) - required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/water = 1) - required_temp = 450 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/holywater - results = list(/datum/reagent/water/holywater = 1) - required_reagents = list(/datum/reagent/water/hollowwater = 1) - required_catalysts = list(/datum/reagent/water/holywater = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_PLANT | REACTION_TAG_OTHER - -/datum/chemical_reaction/exotic_stabilizer - results = list(/datum/reagent/exotic_stabilizer = 2) - required_reagents = list(/datum/reagent/plasma_oxide = 1,/datum/reagent/stabilizing_agent = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/silver_solidification - required_reagents = list(/datum/reagent/silver = 20, /datum/reagent/carbon = 10) - required_temp = 630 - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/silver_solidification/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/sheet/mineral/silver(location) - -/datum/chemical_reaction/bone_gel - required_reagents = list(/datum/reagent/bone_dust = 10, /datum/reagent/carbon = 10) - required_temp = 630 - mob_react = FALSE - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - mix_message = "The solution clarifies, leaving an ashy gel." - -/datum/chemical_reaction/bone_gel/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in 1 to created_volume) - new /obj/item/stack/medical/bone_gel(location) - -////Ice and water - -/datum/chemical_reaction/ice - results = list(/datum/reagent/consumable/ice = 1.09)//density - required_reagents = list(/datum/reagent/water = 1) - is_cold_recipe = TRUE - required_temp = WATER_MATTERSTATE_CHANGE_TEMP-0.5 //274 So we can be sure that basic ghetto rigged stuff can freeze - optimal_temp = 200 - overheat_temp = 0 - optimal_ph_min = 0 - optimal_ph_max = 14 - thermic_constant = 0 - H_ion_release = 0 - rate_up_lim = 50 - purity_min = 0 - mix_message = "The solution freezes up into ice!" - reaction_flags = REACTION_COMPETITIVE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK - -/datum/chemical_reaction/water - results = list(/datum/reagent/water = 0.92)//rough density excahnge - required_reagents = list(/datum/reagent/consumable/ice = 1) - required_temp = WATER_MATTERSTATE_CHANGE_TEMP+0.5 - optimal_temp = 350 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 0 - optimal_ph_max = 14 - thermic_constant = 0 - H_ion_release = 0 - rate_up_lim = 50 - purity_min = 0 - mix_message = "The ice melts back into water!" - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DRINK - -//////////////////////////////////// - -/datum/chemical_reaction/universal_indicator - results = list(/datum/reagent/universal_indicator = 3)//rough density excahnge - required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/ethanol = 1, /datum/reagent/iodine = 1) - required_temp = 274 - optimal_temp = 350 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 0 - optimal_ph_max = 14 - thermic_constant = 0 - H_ion_release = 0 - rate_up_lim = 50 - purity_min = 0 - mix_message = "The mixture's colors swirl together." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/eigenstate - results = list(/datum/reagent/eigenstate = 1) - required_reagents = list(/datum/reagent/bluespace = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/consumable/caramel = 1) - mix_message = "the reaction zaps suddenly!" - mix_sound = 'sound/chemistry/bluespace.ogg' - //FermiChem vars: - required_temp = 350 - optimal_temp = 600 - overheat_temp = 650 - optimal_ph_min = 9 - optimal_ph_max = 12 - determin_ph_range = 5 - temp_exponent_factor = 1.5 - ph_exponent_factor = 3 - thermic_constant = 12 - H_ion_release = -0.05 - rate_up_lim = 10 - purity_min = 0.4 - reaction_flags = REACTION_HEAT_ARBITARY - reaction_tags = REACTION_TAG_HARD | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER - -/datum/chemical_reaction/eigenstate/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) - . = ..() - var/turf/open/location = get_turf(holder.my_atom) - if(reaction.data["ducts_teleported"] == TRUE) //If we teleported an duct, then we reconnect it at the end - for(var/obj/item/stack/ducts/duct in range(location, 3)) - duct.check_attach_turf(duct.loc) - - var/datum/reagent/eigenstate/eigen = holder.has_reagent(/datum/reagent/eigenstate) - if(!eigen) - return - if(location) - eigen.location_created = location - eigen.data["location_created"] = location - - do_sparks(5,FALSE,location) - playsound(location, 'sound/effects/phasein.ogg', 80, TRUE) - -/datum/chemical_reaction/eigenstate/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - if(!off_cooldown(holder, equilibrium, 0.5, "eigen")) - return - var/turf/location = get_turf(holder.my_atom) - do_sparks(3,FALSE,location) - playsound(location, 'sound/effects/phasein.ogg', 80, TRUE) - for(var/mob/living/nearby_mob in range(location, 3)) - do_sparks(3,FALSE,nearby_mob) - do_teleport(nearby_mob, get_turf(holder.my_atom), 3, no_effects=TRUE) - nearby_mob.Knockdown(20, TRUE) - nearby_mob.add_atom_colour("#cebfff", WASHABLE_COLOUR_PRIORITY) - to_chat() - do_sparks(3,FALSE,nearby_mob) - clear_products(holder, step_volume_added) - -/datum/chemical_reaction/eigenstate/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - if(!off_cooldown(holder, equilibrium, 1, "eigen")) - return - var/turf/location = get_turf(holder.my_atom) - do_sparks(3,FALSE,location) - holder.chem_temp += 10 - playsound(location, 'sound/effects/phasein.ogg', 80, TRUE) - for(var/obj/machinery/duct/duct in range(location, 3)) - do_teleport(duct, location, 3, no_effects=TRUE) - equilibrium.data["ducts_teleported"] = TRUE //If we teleported a duct - call the process in - var/lets_not_go_crazy = 15 //Teleport 15 items at max - var/list/items = list() - for(var/obj/item/item in range(location, 3)) - items += item - shuffle(items) - for(var/obj/item/item in items) - do_teleport(item, location, 3, no_effects=TRUE) - lets_not_go_crazy -= 1 - item.add_atom_colour("#c4b3fd", WASHABLE_COLOUR_PRIORITY) - if(!lets_not_go_crazy) - clear_products(holder, step_volume_added) - return - clear_products(holder, step_volume_added) - holder.my_atom.audible_message(span_notice("[icon2html(holder.my_atom, viewers(DEFAULT_MESSAGE_RANGE, src))] The reaction gives out a fizz, teleporting items everywhere!")) - -/datum/chemical_reaction/ants // Breeding ants together, high sugar cost makes this take a while to farm. - results = list(/datum/reagent/ants = 3) - required_reagents = list(/datum/reagent/ants = 2, /datum/reagent/consumable/sugar = 8) - //FermiChem vars: - optimal_ph_min = 3 - optimal_ph_max = 12 - required_temp = 50 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/ant_slurry // We're basically gluing ants together with synthflesh & maint sludge to make a bigger ant. - required_reagents = list(/datum/reagent/ants = 50, /datum/reagent/medicine/c2/synthflesh = 20, /datum/reagent/drug/maint/sludge = 5) - required_temp = 480 - reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE - -/datum/chemical_reaction/ant_slurry/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/location = get_turf(holder.my_atom) - for(var/i in rand(1, created_volume) to created_volume) - new /mob/living/simple_animal/hostile/ant(location) - ..() diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 7c523d59895e..d198c1280745 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -2,7 +2,6 @@ var/strengthdiv = 10 var/modifier = 0 reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EXPLOSIVE | REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS required_temp = 0 //Prevent impromptu RPGs /datum/chemical_reaction/reagent_explosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) @@ -14,9 +13,6 @@ strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - - if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 25, CHEMICAL_QUANTISATION_LEVEL))) - return holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume*2) ..() @@ -26,8 +22,8 @@ strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/rdx - results = list(/datum/reagent/rdx= 2) - required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1 ) + results = list(/datum/reagent/rdx = 2) + required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1) required_catalysts = list(/datum/reagent/gold) //royal explosive required_temp = 404 strengthdiv = 8 @@ -58,24 +54,17 @@ holder.chem_temp = 500 ..() -/datum/chemical_reaction/reagent_explosion/rdx_explosion3 - required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/teslium = 1) - strengthdiv = 3.5 //actually a decrease of 1 becaused of how explosions are calculated. This is due to the fact we require 2 reagents - modifier = 6 - - /datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/fire_range = round(created_volume/20) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf as anything in RANGE_TURFS(fire_range,T)) - //new /obj/effect/hotspot(turf) turf.create_fire(1, 10) holder.chem_temp = 750 ..() /datum/chemical_reaction/reagent_explosion/tatp results = list(/datum/reagent/tatp= 1) - required_reagents = list(/datum/reagent/acetone_oxide = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/pentaerythritol = 1 ) + required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/consumable/ethanol = 1 ) required_temp = 450 strengthdiv = 3 @@ -83,8 +72,6 @@ required_temp = 450 + rand(-49,49) //this gets loaded only on round start /datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 50, CHEMICAL_QUANTISATION_LEVEL))) // we like exotic stabilizer - return holder.remove_reagent(/datum/reagent/tatp, created_volume) ..() @@ -102,15 +89,6 @@ /datum/chemical_reaction/reagent_explosion/tatp_explosion/update_info() required_temp = 550 + rand(-49,49) -/datum/chemical_reaction/reagent_explosion/penthrite_explosion_epinephrine - required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) - strengthdiv = 5 - -/datum/chemical_reaction/reagent_explosion/penthrite_explosion_atropine - required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/atropine = 1) - strengthdiv = 5 - modifier = 5 - /datum/chemical_reaction/reagent_explosion/potassium_explosion required_reagents = list(/datum/reagent/water = 1, /datum/reagent/potassium = 1) strengthdiv = 20 @@ -147,8 +125,7 @@ /datum/chemical_reaction/gunpowder results = list(/datum/reagent/gunpowder = 3) - required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/c2/multiver = 1, /datum/reagent/sulfur = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE + required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/sulfur = 1) /datum/chemical_reaction/reagent_explosion/gunpowder_explosion required_reagents = list(/datum/reagent/gunpowder = 1) @@ -163,11 +140,9 @@ /datum/chemical_reaction/thermite results = list(/datum/reagent/thermite = 3) required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/iron = 1, /datum/reagent/oxygen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_OTHER /datum/chemical_reaction/emp_pulse required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/iron = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -179,7 +154,6 @@ /datum/chemical_reaction/beesplosion required_reagents = list(/datum/reagent/consumable/honey = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/uranium/radium = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = holder.my_atom.drop_location() @@ -202,14 +176,12 @@ /datum/chemical_reaction/stabilizing_agent results = list(/datum/reagent/stabilizing_agent = 3) required_reagents = list(/datum/reagent/iron = 1, /datum/reagent/oxygen = 1, /datum/reagent/hydrogen = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_CHEMICAL | REACTION_TAG_PLANT /datum/chemical_reaction/clf3 results = list(/datum/reagent/clf3 = 4) required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 3) required_temp = 424 overheat_temp = 1050 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_DANGEROUS | REACTION_TAG_BURN /datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -240,7 +212,6 @@ /datum/chemical_reaction/sorium results = list(/datum/reagent/sorium = 4) required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -253,7 +224,6 @@ /datum/chemical_reaction/sorium_vortex required_reagents = list(/datum/reagent/sorium = 1) required_temp = 474 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/sorium_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -263,7 +233,6 @@ /datum/chemical_reaction/liquid_dark_matter results = list(/datum/reagent/liquid_dark_matter = 3) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/carbon = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -276,7 +245,6 @@ /datum/chemical_reaction/ldm_vortex required_reagents = list(/datum/reagent/liquid_dark_matter = 1) required_temp = 474 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/ldm_vortex/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -287,7 +255,6 @@ results = list(/datum/reagent/flash_powder = 3) required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/potassium = 1, /datum/reagent/sulfur = 1 ) reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -309,7 +276,6 @@ /datum/chemical_reaction/flash_powder_flash required_reagents = list(/datum/reagent/flash_powder = 1) required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -329,7 +295,6 @@ results = list(/datum/reagent/smoke_powder = 3) required_reagents = list(/datum/reagent/potassium = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/phosphorus = 1) reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -337,11 +302,11 @@ holder.remove_reagent(/datum/reagent/smoke_powder, created_volume*3) var/smoke_radius = round(sqrt(created_volume * 1.5), 1) var/location = get_turf(holder.my_atom) - var/datum/effect_system/smoke_spread/chem/S = new + var/datum/effect_system/fluid_spread/smoke/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3) if(S) - S.set_up(holder, smoke_radius, location, 0) + S.set_up(smoke_radius, location = location, carry = holder, silent = FALSE) S.start() if(holder?.my_atom) holder.clear_reagents() @@ -351,16 +316,15 @@ required_temp = 374 mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/smoke_powder_smoke/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) var/smoke_radius = round(sqrt(created_volume / 2), 1) - var/datum/effect_system/smoke_spread/chem/S = new + var/datum/effect_system/fluid_spread/smoke/chem/S = new S.attach(location) playsound(location, 'sound/effects/smoke.ogg', 50, TRUE, -3) if(S) - S.set_up(holder, smoke_radius, location, 0) + S.set_up(smoke_radius, location = location, carry = holder, silent = FALSE) S.start() if(holder?.my_atom) holder.clear_reagents() @@ -368,7 +332,6 @@ /datum/chemical_reaction/sonic_powder results = list(/datum/reagent/sonic_powder = 3) required_reagents = list(/datum/reagent/oxygen = 1, /datum/reagent/consumable/space_cola = 1, /datum/reagent/phosphorus = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -382,7 +345,6 @@ /datum/chemical_reaction/sonic_powder_deafen required_reagents = list(/datum/reagent/sonic_powder = 1) required_temp = 374 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/location = get_turf(holder.my_atom) @@ -393,7 +355,6 @@ /datum/chemical_reaction/phlogiston results = list(/datum/reagent/phlogiston = 3) required_reagents = list(/datum/reagent/phosphorus = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/stable_plasma = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS /datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) if(holder.has_reagent(/datum/reagent/stabilizing_agent)) @@ -407,108 +368,15 @@ /datum/chemical_reaction/napalm results = list(/datum/reagent/napalm = 3) required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol = 1 ) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_PLANT - -#define CRYOSTYLANE_UNDERHEAT_TEMP 50 -#define CRYOSTYLANE_IMPURE_TEMPERATURE_RANGE 200 - -/datum/chemical_reaction/cryostylane - results = list(/datum/reagent/cryostylane = 3) - required_reagents = list(/datum/reagent/consumable/ice = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/nitrogen = 1) - required_temp = -200 - optimal_temp = 300 - overheat_temp = NO_OVERHEAT //There is an overheat - 50 see reaction_step() - optimal_ph_min = 4 - optimal_ph_max = 10 - determin_ph_range = 6 - temp_exponent_factor = 0.5 - ph_exponent_factor = 1 - thermic_constant = -7.5 - H_ion_release = 0 - rate_up_lim = 10 - purity_min = 0.2 - reaction_flags = REACTION_HEAT_ARBITARY - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE | REACTION_TAG_ORGAN - -//Halve beaker temp on reaction -/datum/chemical_reaction/cryostylane/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/datum/reagent/oxygen = holder.has_reagent(/datum/reagent/oxygen) //If we have oxygen, bring in the old cooling effect - if(oxygen) - holder.chem_temp = max(holder.chem_temp - (10 * oxygen.volume * 2),0) - holder.remove_reagent(/datum/reagent/oxygen, oxygen.volume) // halves the temperature - tried to bring in some of the old effects at least! - return - -//purity != temp (above 50) - the colder you are the more impure it becomes -/datum/chemical_reaction/cryostylane/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - if(holder.chem_temp < CRYOSTYLANE_UNDERHEAT_TEMP) - overheated(holder, reaction, step_reaction_vol) - //Modify our purity by holder temperature - var/step_temp = ((holder.chem_temp-CRYOSTYLANE_UNDERHEAT_TEMP)/CRYOSTYLANE_IMPURE_TEMPERATURE_RANGE) - if(step_temp >= 1) //We're hotter than 300 - return - reaction.delta_ph *= step_temp - -/datum/chemical_reaction/cryostylane/reaction_finish(datum/reagents/holder, datum/equilibrium/reaction, react_vol) - . = ..() - if(holder.chem_temp < CRYOSTYLANE_UNDERHEAT_TEMP) - overheated(holder, null, react_vol) //replace null with fix win 2.3 is merged - -//Freezes the area around you! -/datum/chemical_reaction/cryostylane/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - var/datum/reagent/cryostylane/cryostylane = holder.has_reagent(/datum/reagent/cryostylane) - if(!cryostylane) - return ..() - var/turf/local_turf = get_turf(holder.my_atom) - playsound(local_turf, 'sound/magic/ethereal_exit.ogg', 50, 1) - local_turf.visible_message("The reaction frosts over, releasing it's chilly contents!") - freeze_radius(holder, null, holder.chem_temp*2, clamp(cryostylane.volume/30, 2, 6), 120 SECONDS, 2) - clear_reactants(holder, 15) - holder.chem_temp += 100 - -//Makes a snowman if you're too impure! -/datum/chemical_reaction/cryostylane/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, vol_added) - var/datum/reagent/cryostylane/cryostylane = holder.has_reagent(/datum/reagent/cryostylane) - var/turf/local_turf = get_turf(holder.my_atom) - playsound(local_turf, 'sound/magic/ethereal_exit.ogg', 50, 1) - local_turf.visible_message("The reaction furiously freezes up as a snowman suddenly rises out of the [holder.my_atom.name]!") - freeze_radius(holder, equilibrium, holder.chem_temp, clamp(cryostylane.volume/15, 3, 10), 180 SECONDS, 5) - new /obj/structure/statue/snow/snowman(local_turf) - clear_reactants(holder) - clear_products(holder) - -#undef CRYOSTYLANE_UNDERHEAT_TEMP -#undef CRYOSTYLANE_IMPURE_TEMPERATURE_RANGE - -/datum/chemical_reaction/cryostylane_oxygen - results = list(/datum/reagent/cryostylane = 1) - required_reagents = list(/datum/reagent/cryostylane = 1, /datum/reagent/oxygen = 1) - mob_react = FALSE - is_cold_recipe = TRUE - required_temp = 99999 - optimal_temp = 300 - overheat_temp = 0 - optimal_ph_min = 0 - optimal_ph_max = 14 - determin_ph_range = 0 - temp_exponent_factor = 1 - ph_exponent_factor = 1 - thermic_constant = -50 //This is the part that cools things down now - H_ion_release = 0 - rate_up_lim = 4 - purity_min = 0.15 - reaction_flags = REACTION_HEAT_ARBITARY - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/pyrosium_oxygen results = list(/datum/reagent/pyrosium = 1) required_reagents = list(/datum/reagent/pyrosium = 1, /datum/reagent/oxygen = 1) mob_react = FALSE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/pyrosium_oxygen/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.chem_temp += 10*created_volume + holder.expose_temperature(holder.chem_temp + (10 * created_volume), 1) /datum/chemical_reaction/pyrosium results = list(/datum/reagent/pyrosium = 3) @@ -518,58 +386,9 @@ overheat_temp = NO_OVERHEAT temp_exponent_factor = 10 thermic_constant = 0 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/pyrosium/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.chem_temp = 20 // also cools the fuck down - return - -/datum/chemical_reaction/teslium - results = list(/datum/reagent/teslium = 3) - required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/silver = 1, /datum/reagent/gunpowder = 1) - mix_message = "A jet of sparks flies from the mixture as it merges into a flickering slurry." - required_temp = 400 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE - -/datum/chemical_reaction/energized_jelly - results = list(/datum/reagent/teslium/energized_jelly = 2) - required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/teslium = 1) - mix_message = "The slime jelly starts glowing intermittently." - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DANGEROUS | REACTION_TAG_HEALING | REACTION_TAG_OTHER - -/datum/chemical_reaction/reagent_explosion/teslium_lightning - required_reagents = list(/datum/reagent/teslium = 1, /datum/reagent/water = 1) - strengthdiv = 100 - modifier = -100 - mix_message = "The teslium starts to spark as electricity arcs away from it!" - mix_sound = 'sound/machines/defib_zap.ogg' - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN | ZAP_LOW_POWER_GEN - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_EXPLOSIVE | REACTION_TAG_DANGEROUS - -/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - 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 - var/added_delay = 0.5 SECONDS - if(created_volume >= 75) - addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T1), added_delay) - added_delay += 1.5 SECONDS - if(created_volume >= 40) - addtimer(CALLBACK(src, PROC_REF(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. - addtimer(CALLBACK(src, PROC_REF(zappy_zappy), holder, T3), added_delay) - addtimer(CALLBACK(src, PROC_REF(default_explode), holder, created_volume, modifier, strengthdiv), 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, zap_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE) - -/datum/chemical_reaction/reagent_explosion/teslium_lightning/heat - required_temp = 474 - required_reagents = list(/datum/reagent/teslium = 1) + holder.expose_temperature(20, 1) // also cools the fuck down /datum/chemical_reaction/reagent_explosion/nitrous_oxide required_reagents = list(/datum/reagent/nitrous_oxide = 1) @@ -596,8 +415,6 @@ optimal_temp = 50 overheat_temp = 5 thermic_constant= -1 - H_ion_release = -0.02 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_UNIQUE /datum/chemical_reaction/reagent_explosion/patriotism_overload required_reagents = list(/datum/reagent/consumable/ethanol/planet_cracker = 1, /datum/reagent/consumable/ethanol/triumphal_arch = 1) diff --git a/code/modules/reagents/chemistry/recipes/reaction_agents.dm b/code/modules/reagents/chemistry/recipes/reaction_agents.dm deleted file mode 100644 index f9292cf8c14b..000000000000 --- a/code/modules/reagents/chemistry/recipes/reaction_agents.dm +++ /dev/null @@ -1,123 +0,0 @@ -/datum/chemical_reaction/basic_buffer - results = list(/datum/reagent/reaction_agent/basic_buffer = 10) - required_reagents = list(/datum/reagent/ammonia = 3, /datum/reagent/chlorine = 2, /datum/reagent/hydrogen = 2, /datum/reagent/oxygen = 2) //vagely NH4OH + NH4Cl buffer - mix_message = "The solution fizzes in the beaker." - //FermiChem vars: - required_temp = 250 - optimal_temp = 500 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 0 - optimal_ph_max = 14 - determin_ph_range = 0 - temp_exponent_factor = 4 - ph_exponent_factor = 0 - thermic_constant = 0 - H_ion_release = 0.01 - rate_up_lim = 15 - purity_min = 0 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/datum/chemical_reaction/acidic_buffer - results = list(/datum/reagent/reaction_agent/acidic_buffer = 10) - required_reagents = list(/datum/reagent/sodium = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 2, /datum/reagent/water = 2) - mix_message = "The solution froths in the beaker." - required_temp = 250 - optimal_temp = 500 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 0 - optimal_ph_max = 14 - determin_ph_range = 0 - temp_exponent_factor = 4 - ph_exponent_factor = 0 - thermic_constant = 0 - H_ion_release = -0.01 - rate_up_lim = 20 - purity_min = 0 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL - -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////// Example competitive reaction (REACTION_COMPETITIVE) ////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -/datum/chemical_reaction/prefactor_a - results = list(/datum/reagent/prefactor_a = 5) - required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/consumable/ethanol = 3, /datum/reagent/toxin/plasma = 1) - mix_message = "The solution's viscosity increases." - is_cold_recipe = TRUE - required_temp = 800 - optimal_temp = 300 - overheat_temp = -1 //no overheat - optimal_ph_min = 2 - optimal_ph_max = 12 - determin_ph_range = 5 - temp_exponent_factor = 1 - ph_exponent_factor = 0 - thermic_constant = -400 - H_ion_release = 0 - rate_up_lim = 4 - purity_min = 0.25 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE - - -/datum/chemical_reaction/prefactor_b - results = list(/datum/reagent/prefactor_b = 5) - required_reagents = list(/datum/reagent/prefactor_a = 5) - mix_message = "The solution's viscosity decreases." - mix_sound = 'sound/chemistry/bluespace.ogg' //Maybe use this elsewhere instead - required_temp = 50 - optimal_temp = 500 - overheat_temp = 500 - optimal_ph_min = 5 - optimal_ph_max = 8 - determin_ph_range = 5 - temp_exponent_factor = 1 - ph_exponent_factor = 2 - thermic_constant = -800 - H_ion_release = -0.02 - rate_up_lim = 6 - purity_min = 0.35 - reaction_flags = REACTION_COMPETITIVE //Competes with /datum/chemical_reaction/prefactor_a/competitive - reaction_tags = REACTION_TAG_MODERATE | REACTION_TAG_DANGEROUS | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE - -/datum/chemical_reaction/prefactor_b/reaction_step(datum/reagents/holder, datum/equilibrium/reaction, delta_t, delta_ph, step_reaction_vol) - . = ..() - if(holder.has_reagent(/datum/reagent/bluespace)) - holder.remove_reagent(/datum/reagent/bluespace, 1) - reaction.delta_t *= 5 - -/datum/chemical_reaction/prefactor_b/overheated(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - . = ..() - explode_shockwave(holder, equilibrium) - var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5 - clear_reagents(holder, vol)//Lest we explode forever - -/datum/chemical_reaction/prefactor_b/overly_impure(datum/reagents/holder, datum/equilibrium/equilibrium, step_volume_added) - explode_fire(holder, equilibrium) - var/vol = max(20, holder.total_volume/5) //Not letting you have more than 5 - clear_reagents(holder, vol) - -/datum/chemical_reaction/prefactor_a/competitive //So we have a back and forth reaction - results = list(/datum/reagent/prefactor_a = 5) - required_reagents = list(/datum/reagent/prefactor_b = 5) - rate_up_lim = 3 - reaction_flags = REACTION_COMPETITIVE //Competes with /datum/chemical_reaction/prefactor_b - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE - -//The actual results -/datum/chemical_reaction/prefactor_a/purity_tester - results = list(/datum/reagent/reaction_agent/purity_tester = 5) - required_reagents = list(/datum/reagent/prefactor_a = 5, /datum/reagent/stable_plasma = 5) - H_ion_release = 0.05 - thermic_constant = 0 - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE - - -/datum/chemical_reaction/prefactor_b/speed_agent - results = list(/datum/reagent/reaction_agent/speed_agent = 5) - required_reagents = list(/datum/reagent/prefactor_b = 5, /datum/reagent/stable_plasma = 5) - H_ion_release = -0.15 - thermic_constant = 0 - reaction_tags = REACTION_TAG_HARD | REACTION_TAG_DANGEROUS | REACTION_TAG_CHEMICAL | REACTION_TAG_COMPETITIVE - -////////////////////////////////End example///////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 80055429fef7..5a0c26afb685 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -2,7 +2,7 @@ /datum/chemical_reaction/slime var/deletes_extract = TRUE reaction_flags = REACTION_INSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME + /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) use_slime_core(holder) @@ -92,7 +92,7 @@ required_container = /obj/item/slime_extract/gold required_other = TRUE deletes_extract = FALSE //we do delete, but we don't do so instantly - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS + /datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -120,15 +120,6 @@ T.visible_message(span_danger("The slime extract begins to vibrate adorably!")) addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50) -/datum/chemical_reaction/slime/slimemobspawn/spider - required_reagents = list(/datum/reagent/spider_extract = 1) - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS - -/datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message(span_danger("The slime extract begins to vibrate crikey-ingly!")) - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/simple_animal/hostile/giant_spider/midwife, "neutral", FALSE), 50) - - //Silver /datum/chemical_reaction/slime/slimebork required_reagents = list(/datum/reagent/toxin/plasma = 1) @@ -190,7 +181,7 @@ required_other = TRUE /datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - holder.create_foam(/datum/effect_system/foam_spread,80, span_danger("[src] spews out foam!")) + holder.create_foam(/datum/effect_system/fluid_spread/foam, 80, span_danger("[src] spews out foam!")) //Dark Blue /datum/chemical_reaction/slime/slimefreeze @@ -262,7 +253,7 @@ required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/yellow required_other = TRUE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS + /datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) empulse(get_turf(holder.my_atom), 3, 7) @@ -328,7 +319,7 @@ required_reagents = list(/datum/reagent/blood = 1) required_container = /obj/item/slime_extract/red required_other = TRUE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS + /datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) @@ -369,20 +360,13 @@ new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom)) ..() -//Black -/datum/chemical_reaction/slime/slimemutate2 - results = list(/datum/reagent/aslimetoxin = 1) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/black - //Oil /datum/chemical_reaction/slime/slimeexplosion required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/oil required_other = TRUE deletes_extract = FALSE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_SLIME | REACTION_TAG_DANGEROUS + /datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) var/turf/T = get_turf(holder.my_atom) @@ -430,17 +414,6 @@ new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location()) ..() - -//Adamantine -/datum/chemical_reaction/slime/adamantine - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/adamantine - required_other = TRUE - -/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom)) - ..() - //Bluespace /datum/chemical_reaction/slime/slimefloor2 required_reagents = list(/datum/reagent/blood = 1) @@ -462,15 +435,6 @@ BC.visible_message(span_notice("The [BC.name] appears out of thin air!")) ..() -/datum/chemical_reaction/slime/slimeradio - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom)) - ..() - //Cerulean /datum/chemical_reaction/slime/slimepsteroid2 required_reagents = list(/datum/reagent/toxin/plasma = 1) @@ -530,14 +494,13 @@ ..() //Pyrite -/datum/chemical_reaction/slime/slimepaint +/datum/chemical_reaction/slime/slimespraycan required_reagents = list(/datum/reagent/toxin/plasma = 1) required_container = /obj/item/slime_extract/pyrite required_other = TRUE -/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - var/chosen = pick(subtypesof(/obj/item/paint)) - new chosen(get_turf(holder.my_atom)) +/datum/chemical_reaction/slime/slimespraycan/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) + new /obj/item/toy/crayon/spraycan/infinite(get_turf(holder.my_atom)) ..() /datum/chemical_reaction/slime/slimecrayon @@ -597,12 +560,3 @@ /datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) new /obj/item/slimepotion/transference(get_turf(holder.my_atom)) ..() - -/datum/chemical_reaction/slime/flight_potion - required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder, datum/equilibrium/reaction, created_volume) - new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) - ..() diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index ed1a82169e5b..ea23a2e94dc9 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -1,7 +1,7 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related food types GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) -#define VALID_RANDOM_RECIPE_REAGENT(chemical_flags) (chemical_flags & REAGENT_CAN_BE_SYNTHESIZED && !(chemical_flags & REAGENT_NO_RANDOM_RECIPE)) +#define VALID_RANDOM_RECIPE_REAGENT(chemical_flags) (!(chemical_flags & REAGENT_SPECIAL) && !(chemical_flags & REAGENT_NO_RANDOM_RECIPE)) /proc/build_reagents_to_food() . = list() @@ -43,12 +43,7 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) /datum/chemical_reaction/randomized //Increase default leniency because these are already hard enough - optimal_ph_min = 1 - optimal_ph_max = 13 temp_exponent_factor = 0 - ph_exponent_factor = 1 - H_ion_release = 0 - var/persistent = FALSE var/persistence_period = 7 //Will reset every x days var/created //creation timestamp @@ -116,20 +111,6 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) if(exo_or_endothermic) thermic_constant = (rand(-200, 200)) - if(randomize_req_ph) - optimal_ph_min = min_ph + rand(0, inoptimal_range_ph) - optimal_ph_max = max((max_ph + rand(0, inoptimal_range_ph)), (min_ph + 1)) //Always ensure we've a window of 1 - determin_ph_range = inoptimal_range_ph - H_ion_release = (rand(0, 25)/100)// 0 - 0.25 - - if(randomize_impurity_minimum) - purity_min = (rand(0, 4)/10) - - if(randomize_impurity_reagents) - for(var/rid in required_reagents) - var/datum/reagent/R = GLOB.chemical_reagents_list[rid] - R.inverse_chem = get_random_reagent_id() - if(randomize_results) results = list() var/list/remaining_possible_results = GetPossibleReagents(RNGCHEM_OUTPUT) @@ -175,7 +156,7 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) /datum/chemical_reaction/randomized/proc/HasConflicts() for(var/x in required_reagents) - for(var/datum/chemical_reaction/R in GLOB.chemical_reactions_list_reactant_index[x]) + for(var/datum/chemical_reaction/R in SSreagents.chemical_reactions_list_reactant_index[x]) if(chem_recipes_do_conflict(R,src)) return TRUE return FALSE @@ -207,13 +188,6 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) overheat_temp = recipe_data["overheat_temp"] thermic_constant = recipe_data["thermic_constant"] - optimal_ph_min = recipe_data["optimal_ph_min"] - optimal_ph_max = recipe_data["optimal_ph_max"] - determin_ph_range = recipe_data["determin_ph_range"] - H_ion_release = recipe_data["H_ion_release"] - - purity_min = recipe_data["purity_min"] - var/temp_results = unwrap_reagent_list(recipe_data["results"]) if(!temp_results) return FALSE @@ -243,27 +217,11 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) return food_reagent_ids return ..() -///Random recipe for meme chem metalgen. Always requires wittel and resets every 3 days -/datum/chemical_reaction/randomized/metalgen - persistent = TRUE - persistence_period = 3 //Resets every three days. It's the ultimate meme and is best not worn out - randomize_req_temperature = TRUE - possible_catalysts = list(/datum/reagent/wittel) - min_catalysts = 1 - max_catalysts = 1 - results = list(/datum/reagent/metalgen=20) - -/datum/chemical_reaction/randomized/metalgen/GetPossibleReagents(kind) - switch(kind) - if(RNGCHEM_INPUT) - return GLOB.medicine_reagents - return ..() - /obj/item/paper/secretrecipe name = "old recipe" ///List of possible recipes we could display - var/list/possible_recipes = list(/datum/chemical_reaction/randomized/secret_sauce, /datum/chemical_reaction/randomized/metalgen) + var/list/possible_recipes = list(/datum/chemical_reaction/randomized/secret_sauce) ///The one we actually end up displaying var/recipe_id = null @@ -295,13 +253,13 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) return var/list/dat = list("
    ") for(var/rid in recipe.required_reagents) - var/datum/reagent/R = GLOB.chemical_reagents_list[rid] + var/datum/reagent/R = SSreagents.chemical_reagents_list[rid] dat += "
  • [recipe.required_reagents[rid]]u of [R.name]
  • " dat += "
" if(recipe.required_catalysts.len) dat += "With following present:
    " for(var/rid in recipe.required_catalysts) - var/datum/reagent/R = GLOB.chemical_reagents_list[rid] + var/datum/reagent/R = SSreagents.chemical_reagents_list[rid] dat += "
  • [recipe.required_catalysts[rid]]u of [R.name]
  • " dat += "
" dat += "Mix slowly
    " @@ -319,12 +277,6 @@ GLOBAL_LIST_INIT(medicine_reagents, build_medicine_reagents()) dat += "
  • taking care of it's exothermic nature
  • " else if(recipe.thermic_constant < 0) dat += "
  • taking care of it's endothermic nature
  • " - var/datum/chemical_reaction/randomized/random_recipe = recipe - if(random_recipe) - if(random_recipe.randomize_req_ph) - dat += "
  • keeping your pH between [recipe.optimal_ph_min] and [recipe.optimal_ph_max]
  • " - if(random_recipe.randomize_impurity_minimum) - dat += "
  • and your purity above [recipe.purity_min]
  • " dat += "
" dat += "." info = dat.Join("") diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm index b4e80e01cd02..3f05c1023bc5 100644 --- a/code/modules/reagents/chemistry/recipes/toxins.dm +++ b/code/modules/reagents/chemistry/recipes/toxins.dm @@ -1,407 +1,38 @@ - -/datum/chemical_reaction/formaldehyde - results = list(/datum/reagent/toxin/formaldehyde = 3) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1) - mix_message = "The mixture fizzles and gives off a fierce smell." - is_cold_recipe = FALSE - required_temp = 420 - optimal_temp = 520 - overheat_temp = 900 - optimal_ph_min = 0 - optimal_ph_max = 7 - determin_ph_range = 2 - temp_exponent_factor = 2 - ph_exponent_factor = 1.2 - thermic_constant = 200 - H_ion_release = -3 - rate_up_lim = 15 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_CHEMICAL | REACTION_TAG_BRUTE | REACTION_TAG_TOXIN - -/datum/chemical_reaction/fentanyl - results = list(/datum/reagent/toxin/fentanyl = 1) - required_reagents = list(/datum/reagent/drug/space_drugs = 1) - mix_message = "The mixture turns cloudy, then becomes clear again." - is_cold_recipe = FALSE - required_temp = 674 - optimal_temp = 774 - overheat_temp = 874 - optimal_ph_min = 7 - optimal_ph_max = 11 - determin_ph_range = 3 - temp_exponent_factor = 0.7 - ph_exponent_factor = 10 - thermic_constant = 50 - H_ion_release = 3 - rate_up_lim = 5 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_ORGAN | REACTION_TAG_TOXIN - -/datum/chemical_reaction/cyanide - results = list(/datum/reagent/toxin/cyanide = 3) - required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1) - mix_message = "The mixture emits the faint smell of almonds." - is_cold_recipe = FALSE - required_temp = 380 - optimal_temp = 420 - overheat_temp = NO_OVERHEAT - optimal_ph_min = 9 - optimal_ph_max = 11 - determin_ph_range = 3 - temp_exponent_factor = 0.7 - ph_exponent_factor = 2 - thermic_constant = -300 - H_ion_release = 3.2 - rate_up_lim = 10 - purity_min = 0.4 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OXY | REACTION_TAG_TOXIN - -/datum/chemical_reaction/itching_powder - results = list(/datum/reagent/toxin/itching_powder = 3) - required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ammonia = 1, /datum/reagent/medicine/c2/multiver = 1) - mix_message = "The mixture emits nose-irritating fumes." - is_cold_recipe = FALSE - required_temp = 280 - optimal_temp = 360 - overheat_temp = 700 - optimal_ph_min = 5 - optimal_ph_max = 9 - determin_ph_range = 4 - temp_exponent_factor = 0.7 - ph_exponent_factor = 1.5 - thermic_constant = -200 - H_ion_release = 5.7 - rate_up_lim = 20 - purity_min = 0.3 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_BRUTE - -/datum/chemical_reaction/facid - results = list(/datum/reagent/toxin/acid/fluacid = 4) - required_reagents = list(/datum/reagent/toxin/acid = 1, /datum/reagent/fluorine = 1, /datum/reagent/hydrogen = 1, /datum/reagent/potassium = 1) - mix_message = "The mixture bubbles fiercly." - is_cold_recipe = FALSE - required_temp = 380 - optimal_temp = 680 - overheat_temp = 800 - optimal_ph_min = 0 - optimal_ph_max = 2 - determin_ph_range = 5 - temp_exponent_factor = 2 - ph_exponent_factor = 10 - thermic_constant = -200 - H_ion_release = -25 - rate_up_lim = 20 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_PLANT | REACTION_TAG_BURN | REACTION_TAG_TOXIN - -/datum/chemical_reaction/nitracid - results = list(/datum/reagent/toxin/acid/nitracid = 2) - required_reagents = list(/datum/reagent/toxin/acid/fluacid = 1, /datum/reagent/nitrogen = 1, /datum/reagent/hydrogen_peroxide = 1) - mix_message = "The mixture bubbles fiercly and gives off a pungent smell." - is_cold_recipe = FALSE - required_temp = 480 - optimal_temp = 680 - overheat_temp = 900 - optimal_ph_min = 0 - optimal_ph_max = 4.1 - determin_ph_range = 5 - temp_exponent_factor = 2 - ph_exponent_factor = 10 - thermic_constant = -200 - H_ion_release = -20 - rate_up_lim = 20 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_BURN | REACTION_TAG_TOXIN - -/datum/chemical_reaction/sulfonal - results = list(/datum/reagent/toxin/sulfonal = 3) - required_reagents = list(/datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/sulfur = 1) - mix_message = "The mixture changes color and becomes clear." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 4 - optimal_ph_max = 9 - determin_ph_range = 2 - temp_exponent_factor = 1.5 - ph_exponent_factor = 1.5 - thermic_constant = 200 - H_ion_release = 5 - rate_up_lim = 10 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_TOXIN | REACTION_TAG_OTHER - -/datum/chemical_reaction/lipolicide - results = list(/datum/reagent/toxin/lipolicide = 3) - required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/diethylamine = 1, /datum/reagent/medicine/ephedrine = 1) - mix_message = "The mixture becomes cloudy." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 4 - optimal_ph_max = 8.5 - determin_ph_range = 2 - temp_exponent_factor = 1 - ph_exponent_factor = 0.2 - thermic_constant = 500 - H_ion_release = 2.5 - rate_up_lim = 10 - purity_min = 0.7 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - -/datum/chemical_reaction/mutagen - results = list(/datum/reagent/toxin/mutagen = 3) - required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/phosphorus = 1, /datum/reagent/chlorine = 1) - mix_message = "The mixture glows faintly, then stops." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 3 - optimal_ph_max = 9 - determin_ph_range = 1 - temp_exponent_factor = 2 - ph_exponent_factor = 5 - thermic_constant = 350 - H_ion_release = 0.1 - rate_up_lim = 10 - purity_min = 0.7 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_PLANT | REACTION_TAG_OTHER - -/datum/chemical_reaction/lexorin - results = list(/datum/reagent/toxin/lexorin = 3) - required_reagents = list(/datum/reagent/toxin/plasma = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/salbutamol = 1) - mix_message = "The mixture turns clear and stops reacting." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 1.8 - optimal_ph_max = 7 - determin_ph_range = 3 - temp_exponent_factor = 2 - ph_exponent_factor = 5 - thermic_constant = -400 - H_ion_release = 0.1 - rate_up_lim = 25 - purity_min = 0.4 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OXY - -/datum/chemical_reaction/hot_ice_melt - results = list(/datum/reagent/toxin/plasma = 12) //One sheet of hot ice makes 200m of plasma - required_reagents = list(/datum/reagent/toxin/hot_ice = 1) - required_temp = T0C + 30 //Don't burst into flames when you melt - thermic_constant = -200//Counter the heat - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_CHEMICAL | REACTION_TAG_TOXIN - -/datum/chemical_reaction/chloralhydrate - results = list(/datum/reagent/toxin/chloralhydrate = 1) - required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 3, /datum/reagent/water = 1) - mix_message = "The mixture turns deep blue." - is_cold_recipe = FALSE - required_temp = 200 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 7 - optimal_ph_max = 9 - determin_ph_range = 2 - temp_exponent_factor = 2 - ph_exponent_factor = 2 - thermic_constant = 250 - H_ion_release = 2 - rate_up_lim = 10 - purity_min = 0.6 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - -/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v - results = list(/datum/reagent/toxin/mutetoxin = 2) - required_reagents = list(/datum/reagent/uranium = 2, /datum/reagent/water = 1, /datum/reagent/carbon = 1) - mix_message = "The mixture calms down." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 6 - optimal_ph_max = 14 - determin_ph_range = 2 - temp_exponent_factor = 3 - ph_exponent_factor = 1 - thermic_constant = -250 - H_ion_release = -0.2 - rate_up_lim = 15 - purity_min = 0.4 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - -/datum/chemical_reaction/zombiepowder - results = list(/datum/reagent/toxin/zombiepowder = 2) - required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/medicine/morphine = 5, /datum/reagent/copper = 5) - mix_message = "The mixture turns into a strange green powder." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 5 - optimal_ph_max = 14 - determin_ph_range = 2 - temp_exponent_factor = 3 - ph_exponent_factor = 1 - thermic_constant = 150 - H_ion_release = -0.25 - rate_up_lim = 15 - purity_min = 0.3 - reaction_flags = REACTION_CLEAR_IMPURE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - -/datum/chemical_reaction/ghoulpowder - results = list(/datum/reagent/toxin/ghoulpowder = 2) - required_reagents = list(/datum/reagent/toxin/zombiepowder = 1, /datum/reagent/medicine/epinephrine = 1) - mix_message = "The mixture turns into a strange brown powder." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 5 - optimal_ph_max = 14 - determin_ph_range = 2 - temp_exponent_factor = 3 - ph_exponent_factor = 1 - thermic_constant = 150 - H_ion_release = -0.25 - rate_up_lim = 15 - purity_min = 0.4 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - /datum/chemical_reaction/mindbreaker results = list(/datum/reagent/toxin/mindbreaker = 5) - required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/c2/multiver = 1) + required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/hydrogen = 1, /datum/reagent/medicine/dylovene = 1) mix_message = "The mixture turns into a vivid red liquid." - is_cold_recipe = FALSE required_temp = 100 optimal_temp = 450 overheat_temp = 900 - optimal_ph_min = 6 - optimal_ph_max = 14 - determin_ph_range = 3 temp_exponent_factor = 2.5 - ph_exponent_factor = 2 thermic_constant = 150 - H_ion_release = -0.06 rate_up_lim = 15 - purity_min = 0.4 - reaction_flags = REACTION_CLEAR_IMPURE - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER -/datum/chemical_reaction/heparin - results = list(/datum/reagent/toxin/heparin = 4) - required_reagents = list(/datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/chlorine = 1, /datum/reagent/lithium = 1) - mix_message = "The mixture thins and loses all color." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 800 - optimal_ph_min = 5 - optimal_ph_max = 9.5 - determin_ph_range = 3 - temp_exponent_factor = 2.5 - ph_exponent_factor = 2 - thermic_constant = 375 - H_ion_release = -0.6 - rate_up_lim = 10 - purity_min = 0.6 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER +/datum/chemical_reaction/zombiepowder + results = list(/datum/reagent/toxin/zombiepowder = 2) + required_reagents = list(/datum/reagent/toxin/carpotoxin = 5, /datum/reagent/medicine/morphine = 5, /datum/reagent/copper = 5) + required_temp = 90 CELSIUS + optimal_temp = 95 CELSIUS + overheat_temp = 99 CELSIUS + mix_message = "The solution boils off to form a fine powder." -/datum/chemical_reaction/rotatium - results = list(/datum/reagent/toxin/rotatium = 3) - 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." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 3 - optimal_ph_max = 9 - determin_ph_range = 2.5 - temp_exponent_factor = 2.5 - ph_exponent_factor = 2 - thermic_constant = -425 - H_ion_release = 4 - rate_up_lim = 15 - purity_min = 0.6 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_TOXIN | REACTION_TAG_OTHER +/datum/chemical_reaction/toxin + results = list(/datum/reagent/toxin = 2) + required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/mercury = 1, /datum/reagent/medicine/dylovene = 1) + +/datum/chemical_reaction/lipolicide + results = list(/datum/reagent/toxin/lipolicide = 2) + required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/mercury = 1) + mix_message = "A vague smell similar to tofu rises from the mixture." /datum/chemical_reaction/anacea results = list(/datum/reagent/toxin/anacea = 3) required_reagents = list(/datum/reagent/medicine/haloperidol = 1, /datum/reagent/impedrezene = 1, /datum/reagent/uranium/radium = 1) mix_message = "The mixture turns into a strange green ooze." - is_cold_recipe = FALSE required_temp = 100 optimal_temp = 450 overheat_temp = 900 - optimal_ph_min = 6 - optimal_ph_max = 9 - determin_ph_range = 4 temp_exponent_factor = 1.6 - ph_exponent_factor = 2.4 thermic_constant = 250 - H_ion_release = 3 rate_up_lim = 10 - purity_min = 0.7 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_TOXIN | REACTION_TAG_OTHER - -/datum/chemical_reaction/mimesbane - results = list(/datum/reagent/toxin/mimesbane = 3) - required_reagents = list(/datum/reagent/uranium/radium = 1, /datum/reagent/toxin/mutetoxin = 1, /datum/reagent/consumable/nothing = 1) - mix_message = "The mixture turns into an indescribable white." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 0 - optimal_ph_max = 8 - determin_ph_range = 4 - temp_exponent_factor = 1.5 - ph_exponent_factor = 3 - thermic_constant = -400 - H_ion_release = -2 - rate_up_lim = 15 - purity_min = 0.5 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER - -/datum/chemical_reaction/bonehurtingjuice - results = list(/datum/reagent/toxin/bonehurtingjuice = 5) - required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/toxin/itching_powder = 3, /datum/reagent/consumable/milk = 1) - mix_message = "The mixture suddenly becomes clear and looks a lot like water. You feel a strong urge to drink it." - is_cold_recipe = FALSE - required_temp = 100 - optimal_temp = 450 - overheat_temp = 900 - optimal_ph_min = 5 - optimal_ph_max = 9 - determin_ph_range = 3 - temp_exponent_factor = 0.5 - ph_exponent_factor = 1 - thermic_constant = -400 - H_ion_release = -0.4 - rate_up_lim = 15 - purity_min = 0.4 - reaction_flags = REACTION_PH_VOL_CONSTANT - reaction_tags = REACTION_TAG_EASY | REACTION_TAG_DAMAGING | REACTION_TAG_OTHER diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index d4ca8ee05b6a..b9df6591973b 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -29,6 +29,10 @@ add_initial_reagents() +/obj/item/reagent_containers/Destroy(force) + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/reagent_containers/examine() . = ..() if(possible_transfer_amounts.len > 1) @@ -41,8 +45,15 @@ RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) +/obj/item/reagent_containers/pre_attack(atom/A, mob/living/user, params) + if (user.combat_mode) + if(try_splash(user, A)) + return TRUE + + return ..() + /obj/item/reagent_containers/attack(mob/living/M, mob/living/user, params) - if (!user.combat_mode) + if(!user.combat_mode) return return ..() @@ -80,10 +91,6 @@ mode_change_message(user) /obj/item/reagent_containers/pre_attack_secondary(atom/target, mob/living/user, params) - if(HAS_TRAIT(target, DO_NOT_SPLASH)) - return ..() - if(!user.combat_mode) - return ..() if (try_splash(user, target)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN @@ -95,23 +102,23 @@ return FALSE if (!reagents?.total_volume) + to_chat(user, span_warning("There are no reagents in this container to splash!")) return FALSE var/punctuation = ismob(target) ? "!" : "." var/reagent_text user.visible_message( - span_danger("[user] splashes the contents of [src] onto [target][punctuation]"), - span_danger("You splash the contents of [src] onto [target][punctuation]"), + span_danger("[user] splashes the contents of [src] onto [target == user ? "themself" : target][punctuation]"), + span_danger("You splash the contents of [src] onto [target == user ? "themself" : target][punctuation]"), ignored_mobs = target, ) - - if (ismob(target)) - var/mob/target_mob = target - target_mob.show_message( - span_userdanger("[user] splash the contents of [src] onto you!"), + if(user != target && ismob(target)) + var/mob/living/L = target + L.show_message( + span_userdanger("You're soaked in the contents of [src]!"), MSG_VISUAL, - span_userdanger("You feel drenched!"), + span_userdanger("You're soaked by a splash of liquid!") ) for(var/datum/reagent/reagent as anything in reagents.reagent_list) @@ -122,10 +129,10 @@ log_combat(thrown_by, target, "splashed (thrown) [english_list(reagents.reagent_list)]") message_admins("[ADMIN_LOOKUPFLW(thrown_by)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") - reagents.expose(target, TOUCH) + if(!reagents.trans_to(target, reagents.total_volume, methods = TOUCH)) + reagents.expose(target, TOUCH) + reagents.clear_reagents() log_combat(user, target, "splashed", reagent_text) - reagents.clear_reagents() - return TRUE /obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user) @@ -133,6 +140,9 @@ return FALSE var/mob/living/carbon/C = eater var/covered = "" + if(!C.has_mouth()) + to_chat(user, span_warning("You don't have a mouth.")) + return FALSE if(C.is_mouth_covered(head_only = 1)) covered = "headgear" else if(C.is_mouth_covered(mask_only = 1)) @@ -154,7 +164,7 @@ return ..() -/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) +/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume, turf/adjacent) reagents.expose_temperature(exposed_temperature) ..() @@ -207,7 +217,7 @@ reagents.expose_temperature(1000) ..() -/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume) +/obj/item/reagent_containers/fire_act(exposed_temperature, exposed_volume, turf/adjacent) reagents.expose_temperature(exposed_temperature) /// Updates the icon of the container when the reagents change. Eats signal args diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 854e3cd2a1ae..aece6ffc508c 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -4,16 +4,20 @@ icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" volume = 200 - var/blood_type = null + var/datum/blood/blood_type = null var/unique_blood = null var/labelled = FALSE fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) /obj/item/reagent_containers/blood/Initialize(mapload) . = ..() - if(blood_type != 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_appearance() + if(ispath(blood_type)) + blood_type = GET_BLOOD_REF(blood_type) + reagents.add_reagent(unique_blood || /datum/reagent/blood, 200, list("viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + update_appearance(UPDATE_NAME) + else if(blood_type) + reagents.add_reagent(unique_blood, 200, list("viruses"=null,"blood_DNA"=null,"resistances"=null,"trace_chem"=null)) + update_appearance(UPDATE_NAME) /// Handles updating the container when the reagents change. /obj/item/reagent_containers/blood/on_reagent_change(datum/reagents/holder, ...) @@ -30,46 +34,46 @@ . = ..() if(labelled) return - name = "blood pack[blood_type ? " - [blood_type]" : null]" + if(istype(blood_type)) + name = "blood pack - [blood_type.name]" + else + name = "blood pack[blood_type ? " - [blood_type]" : null]" /obj/item/reagent_containers/blood/random icon_state = "random_bloodpack" /obj/item/reagent_containers/blood/random/Initialize(mapload) icon_state = "bloodpack" - blood_type = pick("A+", "A-", "B+", "B-", "O+", "O-", "L", "S") + blood_type = pick(GLOB.blood_datums):type return ..() /obj/item/reagent_containers/blood/a_plus - blood_type = "A+" + blood_type = /datum/blood/human/apos /obj/item/reagent_containers/blood/a_minus - blood_type = "A-" + blood_type = /datum/blood/human/amin /obj/item/reagent_containers/blood/b_plus - blood_type = "B+" + blood_type = /datum/blood/human/bpos /obj/item/reagent_containers/blood/b_minus - blood_type = "B-" + blood_type = /datum/blood/human/bmin /obj/item/reagent_containers/blood/o_plus - blood_type = "O+" + blood_type = /datum/blood/human/opos /obj/item/reagent_containers/blood/o_minus - blood_type = "O-" + blood_type = /datum/blood/human/omin /obj/item/reagent_containers/blood/lizard - blood_type = "L" + blood_type = /datum/blood/lizard /obj/item/reagent_containers/blood/ethereal blood_type = "LE" unique_blood = /datum/reagent/consumable/liquidelectricity -/obj/item/reagent_containers/blood/skrell - blood_type = "S" - /obj/item/reagent_containers/blood/universal - blood_type = "U" + blood_type = /datum/blood/universal /obj/item/reagent_containers/blood/attackby(obj/item/tool, mob/user, params) if (istype(tool, /obj/item/pen) || istype(tool, /obj/item/toy/crayon)) @@ -77,7 +81,7 @@ to_chat(user, span_notice("You scribble illegibly on the label of [src]!")) return var/custom_label = tgui_input_text(user, "What would you like to label the blood pack?", "Blood Pack", name, MAX_NAME_LEN) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(user.get_active_held_item() != tool) return diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 8c5def625c01..feef996ac569 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -1,4 +1,3 @@ -#define C2NAMEREAGENT "[initial(reagent.name)] (Has Side-Effects)" /* Contains: Borg Hypospray @@ -28,7 +27,7 @@ Borg Hypospray var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list(/datum/reagent/medicine/c2/convermol, /datum/reagent/medicine/c2/libital, /datum/reagent/medicine/c2/multiver, /datum/reagent/medicine/c2/aiuri, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution) + var/list/reagent_ids = list(/datum/reagent/medicine/bicaridine, /datum/reagent/medicine/dylovene, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/saline_glucose) var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. //Used as list for input() in shakers. @@ -69,17 +68,11 @@ Borg Hypospray modes[reagent] = length(modes) + 1 - if(initial(reagent.harmful)) - reagent_names[C2NAMEREAGENT] = reagent - else - reagent_names[initial(reagent.name)] = reagent + reagent_names[initial(reagent.name)] = reagent /obj/item/reagent_containers/borghypo/proc/del_reagent(datum/reagent/reagent) reagent_ids -= reagent - if(istype(reagent, /datum/reagent/medicine/c2)) - reagent_names -= C2NAMEREAGENT - else - reagent_names -= initial(reagent.name) + reagent_names -= initial(reagent.name) var/datum/reagents/RG var/datum/reagents/TRG for(var/i in 1 to length(reagent_ids)) @@ -111,7 +104,7 @@ Borg Hypospray if(!istype(M)) return if(R.total_volume && M.try_inject(user, user.zone_selected, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE | (bypass_protection ? INJECT_CHECK_PENETRATE_THICK : 0))) - to_chat(M, span_warning("You feel a tiny prick!")) + M.apply_pain(1, user.zone_selected, "You feel a tiny prick!") to_chat(user, span_notice("You inject [M] with the injector.")) if(M.reagents) var/trans = R.trans_to(M, amount_per_transfer_from_this, transfered_by = user, methods = INJECT) @@ -131,7 +124,7 @@ Borg Hypospray var/chosen_reagent = modes[reagent_names[choice]] mode = chosen_reagent playsound(loc, 'sound/effects/pop.ogg', 50, FALSE) - var/datum/reagent/R = GLOB.chemical_reagents_list[reagent_ids[mode]] + var/datum/reagent/R = SSreagents.chemical_reagents_list[reagent_ids[mode]] to_chat(user, span_notice("[src] is now dispensing '[R.name]'.")) return @@ -189,7 +182,7 @@ Borg Hypospray charge_cost = 20 recharge_time = 2 reagent_ids = list( - /datum/reagent/medicine/syndicate_nanites, + /datum/reagent/medicine/omnizine, /datum/reagent/medicine/inacusiate, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine, @@ -217,7 +210,7 @@ Borg Shaker /datum/reagent/consumable/limejuice, /datum/reagent/consumable/menthol, /datum/reagent/consumable/milk, /datum/reagent/consumable/nothing, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/peachjuice, /datum/reagent/consumable/sodawater, /datum/reagent/consumable/space_cola, /datum/reagent/consumable/spacemountainwind, - /datum/reagent/consumable/pwr_game, /datum/reagent/consumable/shamblers, /datum/reagent/consumable/soymilk, + /datum/reagent/consumable/shamblers, /datum/reagent/consumable/soymilk, /datum/reagent/consumable/space_up, /datum/reagent/consumable/sugar, /datum/reagent/consumable/tea, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/tonic, /datum/reagent/water, /datum/reagent/consumable/pineapplejuice, /datum/reagent/consumable/sol_dry, @@ -284,13 +277,13 @@ Borg Shaker /obj/item/reagent_containers/borghypo/peace name = "Peace Hypospray" - reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg) + reagent_ids = list(/datum/reagent/cryptobiolin, /datum/reagent/pax) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/peace/hacked desc = "Everything's peaceful in death!" icon_state = "borghypo_s" - reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl) + reagent_ids = list(/datum/reagent/cryptobiolin,/datum/reagent/pax,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl) accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/epi @@ -298,5 +291,3 @@ Borg Shaker desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients." reagent_ids = list(/datum/reagent/medicine/epinephrine) accepts_reagent_upgrades = FALSE - -#undef C2NAMEREAGENT diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 0cca5b225f59..8cc3c559459d 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -32,11 +32,6 @@ desc = "A small bottle of cyanide. Bitter almonds?" list_reagents = list(/datum/reagent/toxin/cyanide = 30) -/obj/item/reagent_containers/glass/bottle/spewium - name = "spewium bottle" - desc = "A small bottle of spewium." - list_reagents = list(/datum/reagent/toxin/spewium = 30) - /obj/item/reagent_containers/glass/bottle/morphine name = "morphine bottle" desc = "A small bottle of morphine." @@ -49,25 +44,30 @@ icon_state = "bottle20" list_reagents = list(/datum/reagent/toxin/chloralhydrate = 15) -/obj/item/reagent_containers/glass/bottle/mannitol - name = "mannitol bottle" - desc = "A small bottle of Mannitol. Useful for healing brain damage." - list_reagents = list(/datum/reagent/medicine/mannitol = 30) +/obj/item/reagent_containers/glass/bottle/alkysine + name = "alkysine bottle" + desc = "A small bottle of Alkysine. Useful for healing brain damage." + list_reagents = list(/datum/reagent/medicine/alkysine = 30) + +/obj/item/reagent_containers/glass/bottle/kelotane + name = "kelotane bottle" + desc = "A small bottle of kelotane, which helps the body close physical injuries. All effects scale with the amount of reagents in the patient." + list_reagents = list(/datum/reagent/medicine/kelotane = 30) -/obj/item/reagent_containers/glass/bottle/multiver - name = "multiver bottle" - desc = "A small bottle of multiver, which removes toxins and other chemicals from the bloodstream but causes shortness of breath. All effects scale with the amount of reagents in the patient." - list_reagents = list(/datum/reagent/medicine/c2/multiver = 30) +/obj/item/reagent_containers/glass/bottle/bicaridine + name = "bicaridine bottle" + desc = "A small bottle of bicaridine, which helps heal burns. All effects scale with the amount of reagents in the patient." + list_reagents = list(/datum/reagent/medicine/bicaridine = 30) -/obj/item/reagent_containers/glass/bottle/calomel - name = "calomel bottle" - desc = "A small bottle of calomel, which quickly purges all chemicals from the patient. Causes toxin damage if the patient is not heavily injured." - list_reagents = list(/datum/reagent/medicine/calomel = 30) +/obj/item/reagent_containers/glass/bottle/dylovene + name = "dylovene bottle" + desc = "A small bottle of dylovene, which removes toxins and other chemicals from the bloodstream but causes shortness of breath. All effects scale with the amount of reagents in the patient." + list_reagents = list(/datum/reagent/medicine/dylovene = 30) -/obj/item/reagent_containers/glass/bottle/syriniver - name = "syriniver bottle" - desc = "A small bottle of syriniver." - list_reagents = list(/datum/reagent/medicine/c2/syriniver = 30) +/obj/item/reagent_containers/glass/bottle/ipecac + name = "ipecac bottle" + desc = "A small bottle of ipecac, which rapidly induces vomitting to purge the stomach of reagents." + list_reagents = list(/datum/reagent/medicine/ipecac = 30) /obj/item/reagent_containers/glass/bottle/mutagen name = "unstable mutagen bottle" @@ -117,14 +117,11 @@ list_reagents = list(/datum/reagent/consumable/frostoil = 30) /obj/item/reagent_containers/glass/bottle/traitor - name = "syndicate bottle" - desc = "A small bottle. Contains a random nasty chemical." - icon = 'icons/obj/chemical.dmi' var/extra_reagent = null /obj/item/reagent_containers/glass/bottle/traitor/Initialize(mapload) . = ..() - extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide) + extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide) reagents.add_reagent(extra_reagent, 3) /obj/item/reagent_containers/glass/bottle/polonium @@ -132,11 +129,6 @@ desc = "A small bottle. Contains Polonium." list_reagents = list(/datum/reagent/toxin/polonium = 30) -/obj/item/reagent_containers/glass/bottle/magillitis - name = "magillitis bottle" - desc = "A small bottle. Contains a serum known only as 'magillitis'." - list_reagents = list(/datum/reagent/magillitis = 5) - /obj/item/reagent_containers/glass/bottle/venom name = "venom bottle" desc = "A small bottle. Contains Venom." @@ -147,11 +139,6 @@ desc = "A small bottle. Contains Fentanyl." list_reagents = list(/datum/reagent/toxin/fentanyl = 30) -/obj/item/reagent_containers/glass/bottle/formaldehyde - name = "formaldehyde bottle" - desc = "A small bottle. Contains formaldehyde, a chemical that prevents organs from decaying." - list_reagents = list(/datum/reagent/toxin/formaldehyde = 30) - /obj/item/reagent_containers/glass/bottle/initropidril name = "initropidril bottle" desc = "A small bottle. Contains initropidril." @@ -167,10 +154,10 @@ desc = "A small bottle. Contains sodium thiopental." list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 30) -/obj/item/reagent_containers/glass/bottle/coniine - name = "coniine bottle" - desc = "A small bottle. Contains coniine." - list_reagents = list(/datum/reagent/toxin/coniine = 30) +/obj/item/reagent_containers/glass/bottle/lexorin + name = "lexorin bottle" + desc = "A small bottle. Contains lexorin." + list_reagents = list(/datum/reagent/toxin/lexorin = 30) /obj/item/reagent_containers/glass/bottle/curare name = "curare bottle" @@ -197,41 +184,16 @@ desc = "A small bottle of potassium iodide." list_reagents = list(/datum/reagent/medicine/potass_iodide = 30) -/obj/item/reagent_containers/glass/bottle/salglu_solution +/obj/item/reagent_containers/glass/bottle/saline_glucose name = "saline-glucose solution bottle" desc = "A small bottle of saline-glucose solution." - list_reagents = list(/datum/reagent/medicine/salglu_solution = 30) + list_reagents = list(/datum/reagent/medicine/saline_glucose = 30) /obj/item/reagent_containers/glass/bottle/atropine name = "atropine bottle" desc = "A small bottle of atropine." list_reagents = list(/datum/reagent/medicine/atropine = 30) -/obj/item/reagent_containers/glass/bottle/random_buffer - name = "Buffer bottle" - desc = "A small bottle of chemical buffer." - -/obj/item/reagent_containers/glass/bottle/random_buffer/Initialize(mapload) - . = ..() - if(prob(50)) - name = "Acidic buffer bottle" - desc = "A small bottle of acidic buffer." - reagents.add_reagent(/datum/reagent/reaction_agent/acidic_buffer, 30) - else - name = "Basic buffer bottle" - desc = "A small bottle of basic buffer." - reagents.add_reagent(/datum/reagent/reaction_agent/basic_buffer, 30) - -/obj/item/reagent_containers/glass/bottle/acidic_buffer - name = "Acidic buffer bottle" - desc = "A small bottle of acidic buffer." - list_reagents = list(/datum/reagent/reaction_agent/acidic_buffer = 30) - -/obj/item/reagent_containers/glass/bottle/basic_buffer - name = "Basic buffer bottle" - desc = "A small bottle of basic buffer." - list_reagents = list(/datum/reagent/reaction_agent/basic_buffer = 30) - /obj/item/reagent_containers/glass/bottle/romerol name = "romerol bottle" desc = "A small bottle of Romerol. The REAL zombie powder." @@ -412,10 +374,6 @@ name = "iodine bottle" list_reagents = list(/datum/reagent/iodine = 30) -/obj/item/reagent_containers/glass/bottle/bromine - name = "bromine bottle" - list_reagents = list(/datum/reagent/bromine = 30) - /obj/item/reagent_containers/glass/bottle/thermite name = "thermite bottle" list_reagents = list(/datum/reagent/thermite = 30) @@ -437,11 +395,6 @@ desc = "A small bottle. Contains flash powder." list_reagents = list(/datum/reagent/flash_powder = 30) -/obj/item/reagent_containers/glass/bottle/exotic_stabilizer - name = "exotic stabilizer bottle" - desc = "A small bottle. Contains exotic stabilizer." - list_reagents = list(/datum/reagent/exotic_stabilizer = 30) - /obj/item/reagent_containers/glass/bottle/leadacetate name = "lead acetate bottle" desc = "A small bottle. Contains lead acetate." @@ -451,3 +404,8 @@ name = "bottle of caramel" desc = "A bottle containing caramalized sugar, also known as caramel. Do not lick." list_reagents = list(/datum/reagent/consumable/caramel = 30) + +/obj/item/reagent_containers/glass/bottle/space_cleaner + name = "bottle of space cleaner" + desc = "A small bottle. Contains space cleaner." + list_reagents = list(/datum/reagent/space_cleaner = 30) diff --git a/code/modules/reagents/reagent_containers/chem_pack.dm b/code/modules/reagents/reagent_containers/chem_pack.dm index 62441ee00e96..255cacd38ad6 100644 --- a/code/modules/reagents/reagent_containers/chem_pack.dm +++ b/code/modules/reagents/reagent_containers/chem_pack.dm @@ -13,7 +13,7 @@ possible_transfer_amounts = list() /obj/item/reagent_containers/chem_pack/AltClick(mob/living/user) - if(user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY) && !sealed) + if(user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY) && !sealed) if(iscarbon(user) && (HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50))) to_chat(user, span_warning("Uh... whoops! You accidentally spill the content of the bag onto yourself.")) SplashReagents(user) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 60b73ac09bcd..d4b79538e68a 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -27,7 +27,6 @@ return var/trans = 0 - var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) if(ismob(target)) if(ishuman(target)) @@ -54,7 +53,6 @@ target.visible_message(span_danger("[user] squirts something into [target]'s eyes!"), \ span_userdanger("[user] squirts something into your eyes!")) - reagents.expose(target, TOUCH, fraction) var/mob/M = target var/R if(reagents) @@ -63,7 +61,7 @@ log_combat(user, M, "squirted", R) - trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user) + trans = src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user, methods = TOUCH) to_chat(user, span_notice("You transfer [trans] unit\s of the solution.")) update_appearance() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index fc5da807bb0a..5b1b6aff383b 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -24,15 +24,18 @@ if(M != user) M.visible_message(span_danger("[user] attempts to feed [M] something from [src]."), \ span_userdanger("[user] attempts to feed you something from [src].")) - if(!do_after(user, M)) + if(!do_after(user, M, 3 SECONDS)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding + M.visible_message(span_danger("[user] feeds [M] something from [src]."), \ span_userdanger("[user] feeds you something from [src].")) log_combat(user, M, "fed", reagents.get_reagent_log_string()) else to_chat(user, span_notice("You swallow a gulp of [src].")) + + add_trace_DNA(M.get_trace_dna()) SEND_SIGNAL(src, COMSIG_GLASS_DRANK, M, user) addtimer(CALLBACK(reagents, TYPE_PROC_REF(/datum/reagents, trans_to), M, 5, TRUE, TRUE, FALSE, user, FALSE, INGEST), 5) playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE) @@ -146,13 +149,15 @@ /obj/item/reagent_containers/glass/beaker name = "beaker" - desc = "A beaker. It can hold up to 50 units." + desc = "A beaker. It can hold up to 60 units." icon = 'icons/obj/chemical.dmi' icon_state = "beaker" inhand_icon_state = "beaker" worn_icon_state = "beaker" custom_materials = list(/datum/material/glass=500) fill_icon_thresholds = list(0, 1, 20, 40, 60, 80, 100) + possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 60) + volume = 60 /obj/item/reagent_containers/glass/beaker/Initialize(mapload) . = ..() @@ -169,23 +174,23 @@ /obj/item/reagent_containers/glass/beaker/large name = "large beaker" - desc = "A large beaker. Can hold up to 100 units." + desc = "A large beaker. Can hold up to 120 units." icon_state = "beakerlarge" custom_materials = list(/datum/material/glass=2500) - volume = 100 + volume = 120 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100) + possible_transfer_amounts = list(5,10,15,20,25,30,40,60,120) fill_icon_thresholds = list(0, 1, 20, 40, 60, 80, 100) /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" - desc = "An extra-large beaker. Can hold up to 120 units." + desc = "An extra-large beaker. Can hold up to 150 units." icon_state = "beakerwhite" custom_materials = list(/datum/material/glass=2500, /datum/material/plastic=3000) - volume = 120 + volume = 150 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120) - fill_icon_thresholds = list(0, 1, 10, 20, 40, 60, 80, 100) + possible_transfer_amounts = list(5,10,15,20,30,50,60,120,150) + fill_icon_thresholds = list(0, 1, 20, 40, 60, 80, 100) /obj/item/reagent_containers/glass/beaker/meta name = "metamaterial beaker" @@ -194,7 +199,7 @@ custom_materials = list(/datum/material/glass=2500, /datum/material/plastic=3000, /datum/material/gold=1000, /datum/material/titanium=1000) volume = 180 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,60,120,180) + possible_transfer_amounts = list(5,10,15,20,30,40,60,120,180) fill_icon_thresholds = list(0, 1, 10, 25, 35, 50, 60, 80, 100) /obj/item/reagent_containers/glass/beaker/noreact @@ -227,24 +232,24 @@ /obj/item/reagent_containers/glass/beaker/slime list_reagents = list(/datum/reagent/toxin/slimejelly = 50) -/obj/item/reagent_containers/glass/beaker/large/libital - name = "libital reserve tank (diluted)" - list_reagents = list(/datum/reagent/medicine/c2/libital = 10,/datum/reagent/medicine/granibitaluri = 40) +/obj/item/reagent_containers/glass/beaker/large/bicaridine + name = "bicaridine reserve tank" + list_reagents = list(/datum/reagent/medicine/bicaridine = 50) -/obj/item/reagent_containers/glass/beaker/large/aiuri - name = "aiuri reserve tank (diluted)" - list_reagents = list(/datum/reagent/medicine/c2/aiuri = 10, /datum/reagent/medicine/granibitaluri = 40) +/obj/item/reagent_containers/glass/beaker/large/kelotane + name = "kelotane reserve tank" + list_reagents = list(/datum/reagent/medicine/kelotane = 50) -/obj/item/reagent_containers/glass/beaker/large/multiver - name = "multiver reserve tank (diluted)" - list_reagents = list(/datum/reagent/medicine/c2/multiver = 10, /datum/reagent/medicine/granibitaluri = 40) +/obj/item/reagent_containers/glass/beaker/large/dylovene + name = "dylovene reserve tank" + list_reagents = list(/datum/reagent/medicine/dylovene = 50) /obj/item/reagent_containers/glass/beaker/large/epinephrine - name = "epinephrine reserve tank (diluted)" + name = "epinephrine reserve tank" list_reagents = list(/datum/reagent/medicine/epinephrine = 50) /obj/item/reagent_containers/glass/beaker/synthflesh - list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 50) + list_reagents = list(/datum/reagent/medicine/synthflesh = 50) /obj/item/reagent_containers/glass/bucket name = "bucket" @@ -262,7 +267,7 @@ 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, FIRE = 75, ACID = 50) //Weak melee protection, because you can wear it on your head + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 75, ACID = 50) //Weak melee protection, because you can wear it on your head supports_variations_flags = CLOTHING_TESHARI_VARIATION | CLOTHING_VOX_VARIATION slot_equipment_priority = list( \ ITEM_SLOT_BACK, ITEM_SLOT_ID,\ @@ -280,7 +285,7 @@ icon_state = "woodbucket" inhand_icon_state = "woodbucket" custom_materials = list(/datum/material/wood = MINERAL_MATERIAL_AMOUNT * 2) - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 50) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 50) resistance_flags = FLAMMABLE supports_variations_flags = NONE @@ -383,8 +388,3 @@ grinded = I return to_chat(user, span_warning("You can't grind this!")) - -/obj/item/reagent_containers/glass/saline - name = "saline canister" - volume = 5000 - list_reagents = list(/datum/reagent/medicine/salglu_solution = 5000) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 235ced2a4bda..b47e84a55ba9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -39,7 +39,7 @@ log_combat(user, affected_mob, "attempted to inject", src, "([contained])") if(reagents.total_volume && (ignore_flags || affected_mob.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))) // Ignore flag should be checked first or there will be an error message. - to_chat(affected_mob, span_warning("You feel a tiny prick!")) + affected_mob.apply_pain(1, BODY_ZONE_CHEST, "You feel a tiny prick!") to_chat(user, span_notice("You inject [affected_mob] with [src].")) var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1) @@ -53,12 +53,13 @@ trans = reagents.copy_to(affected_mob, amount_per_transfer_from_this) to_chat(user, span_notice("[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src].")) log_combat(user, affected_mob, "injected", src, "([contained])") + playsound(src, 'sound/effects/autoinjector.ogg', 25) return TRUE return FALSE /obj/item/reagent_containers/hypospray/cmo - list_reagents = list(/datum/reagent/medicine/omnizine = 30) + list_reagents = list(/datum/reagent/medicine/tricordrazine = 30) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF //combat @@ -72,7 +73,7 @@ volume = 90 possible_transfer_amounts = list(5,10) 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/tricordrazine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15) /obj/item/reagent_containers/hypospray/combat/nanites name = "experimental combat stimulant injector" @@ -94,14 +95,14 @@ icon_state = "holy_hypo" volume = 250 possible_transfer_amounts = list(25,50) - list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/peaceborg/tire = 50, /datum/reagent/peaceborg/confuse = 50) + list_reagents = list(/datum/reagent/water/holywater = 150, /datum/reagent/cryptobiolin = 50) amount_per_transfer_from_this = 50 //MediPens /obj/item/reagent_containers/hypospray/medipen - name = "epinephrine medipen" - desc = "A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge. Contains a powerful preservative that can delay decomposition when applied to a dead body, and stop the production of histamine during an allergic reaction." + name = "emergency medipen" + desc = "A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge." icon_state = "medipen" inhand_icon_state = "medipen" worn_icon_state = "medipen" @@ -113,7 +114,7 @@ ignore_flags = 1 //so you can medipen through spacesuits reagent_flags = DRAWABLE flags_1 = null - list_reagents = list(/datum/reagent/medicine/epinephrine = 10, /datum/reagent/toxin/formaldehyde = 3, /datum/reagent/medicine/coagulant = 2) + list_reagents = list(/datum/reagent/medicine/inaprovaline = 10, /datum/reagent/medicine/peridaxon = 10, /datum/reagent/medicine/coagulant = 5) custom_price = PAYCHECK_MEDIUM custom_premium_price = PAYCHECK_HARD @@ -129,7 +130,7 @@ update_appearance() /obj/item/reagent_containers/hypospray/medipen/attack_self(mob/user) - if(user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK, FALSE, FLOOR_OKAY)) + if(user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK|USE_RESTING)) inject(user, user) /obj/item/reagent_containers/hypospray/medipen/update_icon_state() @@ -144,7 +145,7 @@ . += span_notice("It is spent.") /obj/item/reagent_containers/hypospray/medipen/stimpack //goliath kiting - name = "stimpack medipen" + name = "stimpack autoinjector" desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor." icon_state = "stimpen" inhand_icon_state = "stimpen" @@ -155,57 +156,57 @@ /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor desc = "A modified stimulants autoinjector for use in combat situations. Has a mild healing effect." - list_reagents = list(/datum/reagent/medicine/stimulants = 10, /datum/reagent/medicine/omnizine = 10) + list_reagents = list(/datum/reagent/stimulants = 10, /datum/reagent/medicine/tricordrazine = 10) /obj/item/reagent_containers/hypospray/medipen/stimulants - name = "stimulant medipen" + name = "stimulant autoinjector" desc = "Contains a very large amount of an incredibly powerful stimulant, vastly increasing your movement speed and reducing stuns by a very large amount for around five minutes. Do not take if pregnant." icon_state = "syndipen" inhand_icon_state = "tbpen" base_icon_state = "syndipen" volume = 50 amount_per_transfer_from_this = 50 - list_reagents = list(/datum/reagent/medicine/stimulants = 50) + list_reagents = list(/datum/reagent/stimulants = 50) /obj/item/reagent_containers/hypospray/medipen/morphine - name = "morphine medipen" + name = "morphine autoinjector" desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though." icon_state = "morphen" inhand_icon_state = "morphen" base_icon_state = "morphen" list_reagents = list(/datum/reagent/medicine/morphine = 10) -/obj/item/reagent_containers/hypospray/medipen/oxandrolone - name = "oxandrolone medipen" - desc = "An autoinjector containing oxandrolone, used to treat severe burns." +/obj/item/reagent_containers/hypospray/medipen/dermaline + name = "dermaline autoinjector" + desc = "An autoinjector containing dermaline, used to treat severe burns." icon_state = "oxapen" inhand_icon_state = "oxapen" base_icon_state = "oxapen" - list_reagents = list(/datum/reagent/medicine/oxandrolone = 10) - -/obj/item/reagent_containers/hypospray/medipen/penacid - name = "pentetic acid medipen" - desc = "An autoinjector containing pentetic acid, used to reduce high levels of radiations and moderate toxins." - icon_state = "penacid" - inhand_icon_state = "penacid" - base_icon_state = "penacid" - list_reagents = list(/datum/reagent/medicine/pen_acid = 10) - -/obj/item/reagent_containers/hypospray/medipen/salacid - name = "salicylic acid medipen" - desc = "An autoinjector containing salicylic acid, used to treat severe brute damage." + list_reagents = list(/datum/reagent/medicine/dermaline = 10) + +/obj/item/reagent_containers/hypospray/medipen/meralyne + name = "meralyne autoinjector" + desc = "An autoinjector containing meralyne, used to treat severe brute damage." icon_state = "salacid" inhand_icon_state = "salacid" base_icon_state = "salacid" - list_reagents = list(/datum/reagent/medicine/sal_acid = 10) + list_reagents = list(/datum/reagent/medicine/meralyne = 10) + +/obj/item/reagent_containers/hypospray/medipen/dexalin + name = "dexalin autoinjector" + desc = "An autoinjector containing dexalin, used to heal oxygen damage quickly." + icon_state = "salpen" + inhand_icon_state = "salpen" + base_icon_state = "salpen" + list_reagents = list(/datum/reagent/medicine/dexalin = 10) -/obj/item/reagent_containers/hypospray/medipen/salbutamol - name = "salbutamol medipen" - desc = "An autoinjector containing salbutamol, used to heal oxygen damage quickly." +/obj/item/reagent_containers/hypospray/medipen/dylovene + name = "dylovene autoinjector" + desc = "An autoinjector containing dylovene, used to heal toxin damage quickly." icon_state = "salpen" inhand_icon_state = "salpen" base_icon_state = "salpen" - list_reagents = list(/datum/reagent/medicine/salbutamol = 10) + list_reagents = list(/datum/reagent/medicine/dylovene = 10) /obj/item/reagent_containers/hypospray/medipen/tuberculosiscure name = "BVAK autoinjector" @@ -225,20 +226,16 @@ icon_state = "[base_icon_state][(reagents.total_volume > 0) ? 1 : 0]" /obj/item/reagent_containers/hypospray/medipen/survival - name = "survival emergency medipen" + name = "survival emergency autoinjector" desc = "A medipen for surviving in the harsh environments, heals most common damage sources. WARNING: May cause organ damage." icon_state = "stimpen" inhand_icon_state = "stimpen" base_icon_state = "stimpen" volume = 30 amount_per_transfer_from_this = 30 - list_reagents = list( /datum/reagent/medicine/epinephrine = 8, /datum/reagent/medicine/c2/aiuri = 8, /datum/reagent/medicine/c2/libital = 8, /datum/reagent/medicine/leporazine = 6) + list_reagents = list(/datum/reagent/medicine/synaptizine = 4, /datum/reagent/medicine/dermaline = 8, /datum/reagent/medicine/meralyne = 8, /datum/reagent/medicine/leporazine = 6) /obj/item/reagent_containers/hypospray/medipen/survival/inject(mob/living/affected_mob, mob/user) - if(lavaland_equipment_pressure_check(get_turf(user))) - amount_per_transfer_from_this = initial(amount_per_transfer_from_this) - return ..() - if(DOING_INTERACTION(user, DOAFTER_SOURCE_SURVIVALPEN)) to_chat(user,span_notice("You are too busy to use \the [src]!")) return @@ -252,14 +249,14 @@ /obj/item/reagent_containers/hypospray/medipen/survival/luxury - name = "luxury medipen" - desc = "Cutting edge bluespace technology allowed Nanotrasen to compact 60u of volume into a single medipen. Contains rare and powerful chemicals used to aid in exploration of very hard enviroments. WARNING: DO NOT MIX WITH EPINEPHRINE OR ATROPINE." + name = "luxury autoinjector" + desc = "Cutting edge technology allowed humanity to compact 50u of volume into a single medipen. Contains rare and powerful chemicals used to aid in exploration of very hard enviroments." icon_state = "luxpen" inhand_icon_state = "atropen" base_icon_state = "luxpen" - volume = 60 - amount_per_transfer_from_this = 60 - list_reagents = list(/datum/reagent/medicine/salbutamol = 10, /datum/reagent/medicine/c2/penthrite = 10, /datum/reagent/medicine/oxandrolone = 10, /datum/reagent/medicine/sal_acid = 10 ,/datum/reagent/medicine/omnizine = 10 ,/datum/reagent/medicine/leporazine = 10) + volume = 50 + amount_per_transfer_from_this = 50 + list_reagents = list(/datum/reagent/medicine/dexalin = 10, /datum/reagent/medicine/meralyne = 10, /datum/reagent/medicine/dermaline = 10, /datum/reagent/medicine/tricordrazine = 10 ,/datum/reagent/medicine/leporazine = 10) /obj/item/reagent_containers/hypospray/medipen/atropine name = "atropine autoinjector" @@ -269,25 +266,6 @@ base_icon_state = "atropen" list_reagents = list(/datum/reagent/medicine/atropine = 10) -/obj/item/reagent_containers/hypospray/medipen/snail - name = "snail shot" - desc = "All-purpose snail medicine! Do not use on non-snails!" - icon_state = "snail" - inhand_icon_state = "snail" - base_icon_state = "snail" - list_reagents = list(/datum/reagent/snail = 10) - -/obj/item/reagent_containers/hypospray/medipen/magillitis - name = "experimental autoinjector" - desc = "A custom-frame needle injector with a small single-use reservoir, containing an experimental serum. Unlike the more common medipen frame, it cannot pierce through protective armor or space suits, nor can the chemical inside be extracted." - icon_state = "gorillapen" - inhand_icon_state = "gorillapen" - base_icon_state = "gorillapen" - volume = 5 - ignore_flags = 0 - reagent_flags = NONE - list_reagents = list(/datum/reagent/magillitis = 5) - /obj/item/reagent_containers/hypospray/medipen/pumpup name = "maintenance pump-up" desc = "A ghetto looking autoinjector filled with a cheap adrenaline shot... Great for shrugging off the effects of stunbatons." @@ -313,4 +291,4 @@ base_icon_state = "hypovolemic" volume = 15 amount_per_transfer_from_this = 15 - list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4) + list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/saline_glucose = 4) diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index 995644fc6c7e..1656e8557688 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -13,13 +13,12 @@ slot_flags = ITEM_SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 7 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10) volume = 60 var/can_fill_from_container = TRUE - var/apply_type = PATCH + var/apply_type = TOUCH var/apply_method = "spray" //the thick gel is sprayed and then dries into patch like film. var/self_delay = 30 var/squirt_mode = 0 @@ -78,32 +77,10 @@ reagents.trans_to(M, amount_per_transfer_from_this, transfered_by = user, methods = apply_type) return -/obj/item/reagent_containers/medigel/libital - name = "medical gel (libital)" - desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains libital, for treating cuts and bruises. Libital does minor liver damage. Diluted with granibitaluri." - icon_state = "brutegel" - current_skin = "brutegel" - list_reagents = list(/datum/reagent/medicine/c2/libital = 24, /datum/reagent/medicine/granibitaluri = 36) - -/obj/item/reagent_containers/medigel/aiuri - name = "medical gel (aiuri)" - desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains aiuri, useful for treating burns. Aiuri does minor eye damage. Diluted with granibitaluri." - icon_state = "burngel" - current_skin = "burngel" - list_reagents = list(/datum/reagent/medicine/c2/aiuri = 24, /datum/reagent/medicine/granibitaluri = 36) - /obj/item/reagent_containers/medigel/synthflesh name = "medical gel (synthflesh)" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains synthflesh, a slightly toxic medicine capable of healing both bruises and burns." icon_state = "synthgel" current_skin = "synthgel" - list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 60) + list_reagents = list(/datum/reagent/medicine/synthflesh = 60) custom_price = PAYCHECK_MEDIUM * 5 - -/obj/item/reagent_containers/medigel/sterilizine - name = "sterilizer gel" - desc = "gel bottle loaded with non-toxic sterilizer. Useful in preparation for surgery." - icon_state = "medigel_blue" - current_skin = "medigel_blue" - list_reagents = list(/datum/reagent/space_cleaner/sterilizine = 60) - custom_price = PAYCHECK_MEDIUM * 2 diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm index bf8f013255c0..01bcaefa0c9a 100644 --- a/code/modules/reagents/reagent_containers/misc.dm +++ b/code/modules/reagents/reagent_containers/misc.dm @@ -37,7 +37,6 @@ return FALSE var/max_temp = min(500 + (500 * (0.2 * cell.rating)), 1000) // 373 to 1000 reagents.adjust_thermal_energy(0.4 * cell.maxcharge * reagents.total_volume * delta_time, max_temp = max_temp) // 4 kelvin every tick on a basic cell. 160k on bluespace - reagents.handle_reactions() update_appearance() if(reagents.chem_temp >= max_temp) change_power_status(FALSE) @@ -73,7 +72,7 @@ update_appearance() /obj/item/reagent_containers/glass/maunamug/attackby(obj/item/I, mob/user, params) - add_fingerprint(user) + I.leave_evidence(user, src) if(!istype(I, /obj/item/stock_parts/cell)) return ..() if(!open) @@ -141,7 +140,7 @@ var/mob/living/carbon/C = A var/reagentlist = pretty_string_from_reagent_list(reagents) var/log_object = "containing [reagentlist]" - if(user.combat_mode && !C.is_mouth_covered()) + if(user.combat_mode && C.has_mouth() && !C.is_mouth_covered()) reagents.trans_to(C, reagents.total_volume, transfered_by = user, methods = INGEST) C.visible_message(span_danger("[user] smothers \the [C] with \the [src]!"), span_userdanger("[user] smothers you with \the [src]!"), span_hear("You hear some struggling and muffled cries of surprise.")) log_combat(user, C, "smothered", src, log_object) diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm index 722da9e3b1a5..0f14e25b5f78 100644 --- a/code/modules/reagents/reagent_containers/patch.dm +++ b/code/modules/reagents/reagent_containers/patch.dm @@ -6,14 +6,14 @@ inhand_icon_state = "bandaid" possible_transfer_amounts = list() volume = 40 - apply_type = PATCH + apply_type = TOUCH apply_method = "apply" self_delay = 30 // three seconds dissolvable = FALSE /obj/item/reagent_containers/pill/patch/attack(mob/living/L, mob/user) if(ishuman(L)) - var/obj/item/bodypart/affecting = L.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = L.get_bodypart(deprecise_zone(user.zone_selected)) if(!affecting) to_chat(user, span_warning("The limb is missing!")) return @@ -27,20 +27,8 @@ return FALSE return TRUE // Masks were stopping people from "eating" patches. Thanks, inheritance. -/obj/item/reagent_containers/pill/patch/libital - name = "libital patch (brute)" - desc = "A pain reliever. Does minor liver damage. Diluted with Granibitaluri." - list_reagents = list(/datum/reagent/medicine/c2/libital = 2, /datum/reagent/medicine/granibitaluri = 8) //10 iterations - icon_state = "bandaid_brute" - -/obj/item/reagent_containers/pill/patch/aiuri - name = "aiuri patch (burn)" - desc = "Helps with burn injuries. Does minor eye damage. Diluted with Granibitaluri." - list_reagents = list(/datum/reagent/medicine/c2/aiuri = 2, /datum/reagent/medicine/granibitaluri = 8) - icon_state = "bandaid_burn" - /obj/item/reagent_containers/pill/patch/synthflesh name = "synthflesh patch" desc = "Helps with brute and burn injuries. Slightly toxic." - list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 20) + list_reagents = list(/datum/reagent/medicine/synthflesh = 20) icon_state = "bandaid_both" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 6402db84230c..593db090a0ad 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -46,8 +46,9 @@ ///Runs the consumption code, can be overriden for special effects /obj/item/reagent_containers/pill/proc/on_consumption(mob/M, mob/user) + M.playsound_local(get_turf(M), 'sound/effects/swallow.ogg', 50) 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 - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), M, span_notice("[pick(strings(REDPILL_FILE, "redpill_questions"))]")), 50) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), M , span_notice("[pick(strings(REDPILL_FILE, "redpill_questions"))]")), 50) if(reagents.total_volume) reagents.trans_to(M, reagents.total_volume, transfered_by = user, methods = apply_type) @@ -114,18 +115,18 @@ icon_state = "pill19" list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/medicine/antihol = 10, /datum/reagent/consumable/coffee = 30) -/obj/item/reagent_containers/pill/salbutamol - name = "salbutamol pill" +/obj/item/reagent_containers/pill/dexalin + name = "dexalin pill" desc = "Used to treat oxygen deprivation." icon_state = "pill16" - list_reagents = list(/datum/reagent/medicine/salbutamol = 30) + list_reagents = list(/datum/reagent/medicine/dexalin = 30) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/multiver - name = "multiver pill" - desc = "Neutralizes many common toxins and scales with unique medicine in the system. Diluted with granibitaluri." +/obj/item/reagent_containers/pill/dylovene + name = "dylovene pill" + desc = "Helps counteract nervous system damage induced by toxins." icon_state = "pill17" - list_reagents = list(/datum/reagent/medicine/c2/multiver = 5, /datum/reagent/medicine/granibitaluri = 5) + list_reagents = list(/datum/reagent/medicine/dylovene = 5) rename_with_volume = TRUE /obj/item/reagent_containers/pill/epinephrine @@ -135,37 +136,23 @@ list_reagents = list(/datum/reagent/medicine/epinephrine = 15) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/mannitol - name = "mannitol pill" +/obj/item/reagent_containers/pill/alkysine + name = "alkysine pill" desc = "Used to treat brain damage." icon_state = "pill17" - list_reagents = list(/datum/reagent/medicine/mannitol = 14) + list_reagents = list(/datum/reagent/medicine/alkysine = 14) rename_with_volume = TRUE -//Lower quantity mannitol pills (50u pills heal 250 brain damage, 5u pills heal 25) -/obj/item/reagent_containers/pill/mannitol/braintumor +//Lower quantity alkysine pills (50u pills heal 250 brain damage, 5u pills heal 25) +/obj/item/reagent_containers/pill/alkysine/braintumor desc = "Used to treat symptoms for brain tumors." - list_reagents = list(/datum/reagent/medicine/mannitol = 5) + list_reagents = list(/datum/reagent/medicine/alkysine = 5) -/obj/item/reagent_containers/pill/mutadone - name = "mutadone pill" +/obj/item/reagent_containers/pill/ryetalyn + name = "ryetalyn pill" desc = "Used to treat genetic damage." icon_state = "pill20" - list_reagents = list(/datum/reagent/medicine/mutadone = 50) - rename_with_volume = TRUE - -/obj/item/reagent_containers/pill/salicylic - name = "salicylic acid pill" - desc = "Used to dull pain." - icon_state = "pill9" - list_reagents = list(/datum/reagent/medicine/sal_acid = 24) - 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/ryetalyn = 50) rename_with_volume = TRUE /obj/item/reagent_containers/pill/insulin @@ -175,24 +162,17 @@ list_reagents = list(/datum/reagent/medicine/insulin = 50) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/psicodine - name = "psicodine pill" - desc = "Used to treat mental instability and phobias." - list_reagents = list(/datum/reagent/medicine/psicodine = 10) - icon_state = "pill22" - rename_with_volume = TRUE - -/obj/item/reagent_containers/pill/penacid - name = "pentetic acid pill" - desc = "Used to expunge radiation and toxins." - list_reagents = list(/datum/reagent/medicine/pen_acid = 10) +/obj/item/reagent_containers/pill/alkysine + name = "alkysine pill" + desc = "Used to treat non-severe mental traumas." + list_reagents = list(/datum/reagent/medicine/alkysine = 10) icon_state = "pill22" rename_with_volume = TRUE -/obj/item/reagent_containers/pill/neurine - name = "neurine pill" - desc = "Used to treat non-severe mental traumas." - list_reagents = list(/datum/reagent/medicine/neurine = 10) +/obj/item/reagent_containers/pill/ipecac + name = "ipecac pill" + desc = "Used to purge the stomach of reagents." + list_reagents = list(/datum/reagent/medicine/ipecac = 5) icon_state = "pill22" rename_with_volume = TRUE @@ -205,12 +185,6 @@ list_reagents = list(/datum/reagent/mutationtoxin/shadow = 5) ///////////////////////////////////////// Psychologist inventory pills -/obj/item/reagent_containers/pill/happinesspsych - name = "mood stabilizer pill" - desc = "Used to temporarily alleviate anxiety and depression, take only as prescribed." - list_reagents = list(/datum/reagent/drug/happiness = 5) - icon_state = "pill_happy" - rename_with_volume = TRUE /obj/item/reagent_containers/pill/paxpsych name = "pacification pill" @@ -222,7 +196,7 @@ /obj/item/reagent_containers/pill/lsdpsych name = "antipsychotic pill" desc = "Talk to your healthcare provider immediately if hallucinations worsen or new hallucinations emerge." - list_reagents = list(/datum/reagent/toxin/mindbreaker = 5) + list_reagents = list(/datum/reagent/medicine/chlorpromazine = 5) icon_state = "pill14" rename_with_volume = TRUE @@ -282,11 +256,32 @@ list_reagents = list(/datum/reagent/medicine/potass_iodide = 15) rename_with_volume = TRUE -/obj/item/reagent_containers/pill/probital - name = "Probital pill" - desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'. Causes fatigue and diluted with granibitaluri." +/obj/item/reagent_containers/pill/bicaridine + name = "bicaridine pill" + desc = "Used to treat minor physical trauma. The carving in the pill says 'Eat before ingesting'." icon_state = "pill12" - list_reagents = list(/datum/reagent/medicine/c2/probital = 5, /datum/reagent/medicine/granibitaluri = 10) + list_reagents = list(/datum/reagent/medicine/bicaridine = 5) + rename_with_volume = TRUE + +/obj/item/reagent_containers/pill/meralyne + name = "meralyne pill" + desc = "Used to treat brute damage of minor and moderate severity. The carving in the pill says 'Eat before ingesting'." + icon_state = "pill12" + list_reagents = list(/datum/reagent/medicine/meralyne = 5) + rename_with_volume = TRUE + +/obj/item/reagent_containers/pill/kelotane + name = "kelotane pill" + desc = "Used to treat minor burns. The carving in the pill says 'Eat before ingesting'." + icon_state = "pill12" + list_reagents = list(/datum/reagent/medicine/kelotane = 5) + rename_with_volume = TRUE + +/obj/item/reagent_containers/pill/dermaline + name = "dermaline pill" + desc = "Used to treat second and third degree burns. The carving in the pill says 'Eat before ingesting'." + icon_state = "pill12" + list_reagents = list(/datum/reagent/medicine/dermaline = 5) rename_with_volume = TRUE /obj/item/reagent_containers/pill/iron @@ -295,3 +290,10 @@ icon_state = "pill8" list_reagents = list(/datum/reagent/iron = 30) rename_with_volume = TRUE + +/obj/item/reagent_containers/pill/haloperidol + name = "haloperidol pill" + desc = "Used to treat drug abuse and psychosis." + icon_state = "pill8" + list_reagents = list(/datum/reagent/medicine/haloperidol = 5) + rename_with_volume = TRUE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index b5efe22f177d..30702824f0ba 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -12,7 +12,6 @@ slot_flags = ITEM_SLOT_BELT throwforce = 0 w_class = WEIGHT_CLASS_SMALL - throw_speed = 3 throw_range = 7 var/stream_mode = FALSE //whether we use the more focused mode var/current_range = 3 //the range of tiles the sprayer will reach. @@ -187,14 +186,6 @@ user.visible_message(span_suicide("[user] decided life was worth living.")) return MANUAL_SUICIDE_NONLETHAL -//spray tan -/obj/item/reagent_containers/spray/spraytan - name = "spray tan" - volume = 50 - desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices." - list_reagents = list(/datum/reagent/spraytan = 50) - - //pepperspray /obj/item/reagent_containers/spray/pepper name = "pepperspray" @@ -236,7 +227,6 @@ volume = 10 list_reagents = list(/datum/reagent/water = 10) -///Subtype used for the lavaland clown ruin. /obj/item/reagent_containers/spray/waterflower/superlube name = "clown flower" desc = "A delightly devilish flower... you got a feeling where this is going." @@ -322,7 +312,7 @@ ..(the_targets[i], user) /obj/item/reagent_containers/spray/chemsprayer/bioterror - list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 100, /datum/reagent/toxin/coniine = 100, /datum/reagent/toxin/venom = 100, /datum/reagent/consumable/condensedcapsaicin = 100, /datum/reagent/toxin/initropidril = 100, /datum/reagent/toxin/polonium = 100) + list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 100, /datum/reagent/toxin/lexorin = 100, /datum/reagent/toxin/venom = 100, /datum/reagent/consumable/condensedcapsaicin = 100, /datum/reagent/toxin/initropidril = 100, /datum/reagent/toxin/polonium = 100) /obj/item/reagent_containers/spray/chemsprayer/janitor @@ -397,7 +387,7 @@ "Blue" = "sprayer_med_blue") /obj/item/reagent_containers/spray/medical/AltClick(mob/user) - if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) + if(unique_reskin && !current_skin && user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) reskin_obj(user) /obj/item/reagent_containers/spray/medical/reskin_obj(mob/M) @@ -410,9 +400,3 @@ if("sprayer_med_blue") inhand_icon_state = "sprayer_med_blue" M.update_held_items() - -/obj/item/reagent_containers/spray/hercuri - name = "medical spray (hercuri)" - desc = "A medical spray bottle.This one contains hercuri, a medicine used to negate the effects of dangerous high-temperature environments. Careful not to freeze the patient!" - icon_state = "sprayer_large" - list_reagents = list(/datum/reagent/medicine/c2/hercuri = 100) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index a03aa5c8eec2..47b9f9ff3615 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -29,6 +29,10 @@ return FALSE if(!target.reagents) return FALSE + if(isliving(user)) + var/mob/living/L = user + if(L.combat_mode) + return FALSE if(isliving(target)) var/mob/living/living_target = target @@ -117,7 +121,7 @@ var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this, transfered_by = user) // transfer from, transfer to - who cares? to_chat(user, span_notice("You fill [src] with [trans] units of the solution. It now contains [reagents.total_volume] units.")) - + playsound(src, 'sound/effects/syringe_extract.ogg', 50) return SECONDARY_ATTACK_CONTINUE_CHAIN /* @@ -157,15 +161,10 @@ desc = "Contains epinephrine - used to stabilize patients." list_reagents = list(/datum/reagent/medicine/epinephrine = 15) -/obj/item/reagent_containers/syringe/multiver - name = "syringe (multiver)" - desc = "Contains multiver. Diluted with granibitaluri." - list_reagents = list(/datum/reagent/medicine/c2/multiver = 6, /datum/reagent/medicine/granibitaluri = 9) - -/obj/item/reagent_containers/syringe/convermol - name = "syringe (convermol)" - desc = "Contains convermol. Diluted with granibitaluri." - list_reagents = list(/datum/reagent/medicine/c2/convermol = 6, /datum/reagent/medicine/granibitaluri = 9) +/obj/item/reagent_containers/syringe/dylovene + name = "syringe (dylovene)" + desc = "Contains dylovene. Diluted with granibitaluri." + list_reagents = list(/datum/reagent/medicine/dylovene = 15) /obj/item/reagent_containers/syringe/antiviral name = "syringe (spaceacillin)" @@ -177,10 +176,10 @@ desc = "Contains several paralyzing reagents." list_reagents = list(/datum/reagent/consumable/ethanol/neurotoxin = 5, /datum/reagent/toxin/mutetoxin = 5, /datum/reagent/toxin/sodium_thiopental = 5) -/obj/item/reagent_containers/syringe/calomel - name = "syringe (calomel)" - desc = "Contains calomel." - list_reagents = list(/datum/reagent/medicine/calomel = 15) +/obj/item/reagent_containers/syringe/dexalin + name = "syringe (dexalin)" + desc = "Contains dexalin." + list_reagents = list(/datum/reagent/medicine/dexalin = 15) /obj/item/reagent_containers/syringe/plasma name = "syringe (plasma)" @@ -197,7 +196,7 @@ list_reagents = list(/datum/reagent/toxin/chloralhydrate = 50) /obj/item/reagent_containers/syringe/lethal/execution - list_reagents = list(/datum/reagent/toxin/plasma = 15, /datum/reagent/toxin/formaldehyde = 15, /datum/reagent/toxin/cyanide = 10, /datum/reagent/toxin/acid/fluacid = 10) + list_reagents = list(/datum/reagent/toxin/plasma = 15, /datum/reagent/toxin/cyanide = 10, /datum/reagent/toxin/acid/fluacid = 10) /obj/item/reagent_containers/syringe/mulligan name = "Mulligan" @@ -206,13 +205,6 @@ volume = 1 list_reagents = list(/datum/reagent/mulligan = 1) -/obj/item/reagent_containers/syringe/gluttony - name = "Gluttony's Blessing" - desc = "A syringe recovered from a dread place. It probably isn't wise to use." - amount_per_transfer_from_this = 1 - volume = 1 - list_reagents = list(/datum/reagent/gluttonytoxin = 1) - /obj/item/reagent_containers/syringe/bluespace name = "bluespace syringe" desc = "An advanced syringe that can hold 60 units of chemicals." @@ -244,26 +236,6 @@ desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world." list_reagents = list(/datum/reagent/spider_extract = 1) -/obj/item/reagent_containers/syringe/oxandrolone - name = "syringe (oxandrolone)" - desc = "Contains oxandrolone, used to treat severe burns." - list_reagents = list(/datum/reagent/medicine/oxandrolone = 15) - -/obj/item/reagent_containers/syringe/salacid - name = "syringe (salicylic acid)" - desc = "Contains salicylic acid, used to treat severe brute damage." - list_reagents = list(/datum/reagent/medicine/sal_acid = 15) - -/obj/item/reagent_containers/syringe/penacid - name = "syringe (pentetic acid)" - desc = "Contains pentetic acid, used to reduce high levels of radiation and heal severe toxins." - list_reagents = list(/datum/reagent/medicine/pen_acid = 15) - -/obj/item/reagent_containers/syringe/syriniver - name = "syringe (syriniver)" - desc = "Contains syriniver, used to treat toxins and purge chemicals.The tag on the syringe states 'Inject one time per minute'" - list_reagents = list(/datum/reagent/medicine/c2/syriniver = 15) - /obj/item/reagent_containers/syringe/contraband name = "unlabeled syringe" desc = "A syringe containing some sort of unknown chemical cocktail." diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 0bc8bc897a03..d03e11301f8a 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -11,42 +11,21 @@ var/tank_volume = 1000 ///The ID of the reagent that the dispenser uses var/reagent_id = /datum/reagent/water - ///Can you turn this into a plumbing tank? - var/can_be_tanked = TRUE - ///Is this source self-replenishing? - var/refilling = FALSE /obj/structure/reagent_dispensers/Initialize(mapload) . = ..() - if(icon_state == "water" && SSevents.holidays?[APRIL_FOOLS]) icon_state = "water_fools" -/obj/structure/reagent_dispensers/examine(mob/user) - . = ..() - if(can_be_tanked) - . += span_notice("Use a sheet of iron to convert this into a plumbing-compatible tank.") - /obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(. && atom_integrity > 0) - if(tank_volume && (damage_flag == BULLET || damage_flag == LASER)) + if(tank_volume && (damage_flag == PUNCTURE || damage_flag == LASER)) boom() /obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params) if(W.is_refillable()) return FALSE //so we can refill them via their afterattack. - if(istype(W, /obj/item/stack/sheet/iron) && can_be_tanked) - var/obj/item/stack/sheet/iron/metal_stack = W - metal_stack.use(1) - var/obj/structure/reagent_dispensers/plumbed/storage/new_tank = new /obj/structure/reagent_dispensers/plumbed/storage(drop_location()) - new_tank.reagents.maximum_volume = reagents.maximum_volume - reagents.trans_to(new_tank, reagents.total_volume) - new_tank.name = "stationary [name]" - new_tank.update_appearance(UPDATE_OVERLAYS) - new_tank.set_anchored(anchored) - qdel(src) - return FALSE else return ..() @@ -99,8 +78,9 @@ icon_state = "fuel_fools" /obj/structure/reagent_dispensers/fueltank/boom() - explosion(src, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) + var/turf/explode_turf = get_turf(src) qdel(src) + explosion(explode_turf, heavy_impact_range = 1, light_impact_range = 5, flame_range = 5) /obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B) boom() @@ -108,7 +88,7 @@ /obj/structure/reagent_dispensers/fueltank/ex_act() boom() -/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume) +/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume, turf/adjacent) boom() /obj/structure/reagent_dispensers/fueltank/zap_act(power, zap_flags) @@ -151,14 +131,15 @@ tank_volume = 5000 /obj/structure/reagent_dispensers/fueltank/large/boom() + if(QDELETED(src)) + return explosion(src, devastation_range = 1, heavy_impact_range = 2, light_impact_range = 7, flame_range = 12) qdel(src) -/// Wall mounted dispeners, like pepper spray or virus food. Not a normal tank, and shouldn't be able to be turned into a plumbed stationary one. +/// Wall mounted dispeners, like pepper spray or virus food. Not a normal tank. /obj/structure/reagent_dispensers/wall anchored = TRUE density = FALSE - can_be_tanked = FALSE /obj/structure/reagent_dispensers/wall/peppertank name = "pepper spray refiller" @@ -236,49 +217,3 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/reagent_dispensers/wall/virusfood, 30 icon_state = "serving" anchored = TRUE reagent_id = /datum/reagent/consumable/nutraslop - -/obj/structure/reagent_dispensers/plumbed - name = "stationary water tank" - anchored = TRUE - icon_state = "water_stationary" - desc = "A stationary, plumbed, water tank." - can_be_tanked = FALSE - -/obj/structure/reagent_dispensers/plumbed/Initialize(mapload) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply) - -/obj/structure/reagent_dispensers/plumbed/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/structure/reagent_dispensers/plumbed/storage - name = "stationary storage tank" - icon_state = "tank_stationary" - reagent_id = null //start empty - -/obj/structure/reagent_dispensers/plumbed/storage/Initialize(mapload) - . = ..() - AddComponent(/datum/component/simple_rotation) - -/obj/structure/reagent_dispensers/plumbed/storage/AltClick(mob/user) - return ..() // This hotkey is BLACKLISTED since it's used by /datum/component/simple_rotation - -/obj/structure/reagent_dispensers/plumbed/storage/update_overlays() - . = ..() - if(!reagents) - return - - if(!reagents.total_volume) - return - - var/mutable_appearance/tank_color = mutable_appearance('icons/obj/chemical_tanks.dmi', "tank_chem_overlay") - tank_color.color = mix_color_from_reagents(reagents.reagent_list) - . += tank_color - -/obj/structure/reagent_dispensers/plumbed/fuel - name = "stationary fuel tank" - icon_state = "fuel_stationary" - desc = "A stationary, plumbed, fuel tank." - reagent_id = /datum/reagent/fuel diff --git a/code/modules/reagents/withdrawal/_addiction.dm b/code/modules/reagents/withdrawal/_addiction.dm index 9096305509de..fdd8368a982d 100644 --- a/code/modules/reagents/withdrawal/_addiction.dm +++ b/code/modules/reagents/withdrawal/_addiction.dm @@ -14,12 +14,6 @@ var/high_sanity_addiction_loss = 2 ///Amount of drugs you need in your system to be satisfied var/addiction_relief_treshold = MIN_ADDICTION_REAGENT_AMOUNT - ///moodlet for light withdrawal - var/light_withdrawal_moodlet = /datum/mood_event/withdrawal_light - ///moodlet for medium withdrawal - var/medium_withdrawal_moodlet = /datum/mood_event/withdrawal_medium - ///moodlet for severe withdrawal - var/severe_withdrawal_moodlet = /datum/mood_event/withdrawal_severe ///Called when you gain addiction points somehow. Takes a mind as argument and sees if you gained the addiction /datum/addiction/proc/on_gain_addiction_points(datum/mind/victim_mind) @@ -49,7 +43,6 @@ return TRUE /datum/addiction/proc/lose_addiction(datum/mind/victim_mind) - SEND_SIGNAL(victim_mind.current, COMSIG_CLEAR_MOOD_EVENT, "[type]_addiction") SEND_SIGNAL(victim_mind.current, COMSIG_CARBON_LOSE_ADDICTION, victim_mind) to_chat(victim_mind.current, span_notice("You feel like you've gotten over your need for drugs.")) end_withdrawal(victim_mind.current) @@ -106,19 +99,15 @@ /// Called when addiction enters stage 1 /datum/addiction/proc/withdrawal_enters_stage_1(mob/living/carbon/affected_carbon) - SEND_SIGNAL(affected_carbon, COMSIG_ADD_MOOD_EVENT, "[type]_addiction", light_withdrawal_moodlet, name) /// Called when addiction enters stage 2 /datum/addiction/proc/withdrawal_enters_stage_2(mob/living/carbon/affected_carbon) - SEND_SIGNAL(affected_carbon, COMSIG_ADD_MOOD_EVENT, "[type]_addiction", medium_withdrawal_moodlet, name) /// Called when addiction enters stage 3 /datum/addiction/proc/withdrawal_enters_stage_3(mob/living/carbon/affected_carbon) - SEND_SIGNAL(affected_carbon, COMSIG_ADD_MOOD_EVENT, "[type]_addiction", severe_withdrawal_moodlet, name) /datum/addiction/proc/end_withdrawal(mob/living/carbon/affected_carbon) LAZYSET(affected_carbon.mind.active_addictions, type, 1) //Keeps withdrawal at first cycle. - SEND_SIGNAL(affected_carbon, COMSIG_CLEAR_MOOD_EVENT, "[type]_addiction") /// Called when addiction is in stage 1 every process /datum/addiction/proc/withdrawal_stage_1_process(mob/living/carbon/affected_carbon, delta_time) diff --git a/code/modules/reagents/withdrawal/generic_addictions.dm b/code/modules/reagents/withdrawal/generic_addictions.dm index 7a41f6f0d515..e6bc942dd2cd 100644 --- a/code/modules/reagents/withdrawal/generic_addictions.dm +++ b/code/modules/reagents/withdrawal/generic_addictions.dm @@ -11,6 +11,7 @@ /datum/addiction/opiods/withdrawal_enters_stage_2(mob/living/carbon/affected_carbon) . = ..() affected_carbon.apply_status_effect(/datum/status_effect/high_blood_pressure) + affected_carbon.stats?.set_skill_modifier(-1, /datum/rpg_skill/willpower, SKILL_SOURCE_OPIOD_WITHDRAWL) /datum/addiction/opiods/withdrawal_stage_3_process(mob/living/carbon/affected_carbon, delta_time) . = ..() @@ -22,6 +23,7 @@ . = ..() affected_carbon.remove_status_effect(/datum/status_effect/high_blood_pressure) affected_carbon.set_disgust(affected_carbon.disgust * 0.5) //half their disgust to help + affected_carbon.stats?.remove_skill_modifier(-1, /datum/rpg_skill/willpower, SKILL_SOURCE_OPIOD_WITHDRAWL) ///Stimulants @@ -55,6 +57,7 @@ /datum/addiction/alcohol/withdrawal_stage_1_process(mob/living/carbon/affected_carbon, delta_time) . = ..() affected_carbon.set_timed_status_effect(10 SECONDS * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) + affected_carbon.stats?.set_skill_modifier(-2, /datum/rpg_skill/handicraft, SKILL_SOURCE_ALCHOHOL_WITHDRAWL) /datum/addiction/alcohol/withdrawal_stage_2_process(mob/living/carbon/affected_carbon, delta_time) . = ..() @@ -69,6 +72,10 @@ if(!HAS_TRAIT(affected_carbon, TRAIT_ANTICONVULSANT)) affected_carbon.apply_status_effect(/datum/status_effect/seizure) +/datum/addiction/alcohol/end_withdrawal(mob/living/carbon/affected_carbon) + . = ..() + affected_carbon.stats?.remove_skill_modifier(-2, /datum/rpg_skill/handicraft, SKILL_SOURCE_ALCHOHOL_WITHDRAWL) + /datum/addiction/hallucinogens name = "hallucinogen" withdrawal_stage_messages = list("I feel so empty...", "I wonder what the machine elves are up to?..", "I need to see the beautiful colors again!!") @@ -136,11 +143,8 @@ var/turf/T = get_turf(affected_human) var/lums = T.get_lumcount() if(lums > 0.5) - SEND_SIGNAL(affected_human, COMSIG_ADD_MOOD_EVENT, "too_bright", /datum/mood_event/bright_light) affected_human.adjust_timed_status_effect(6 SECONDS, /datum/status_effect/dizziness, max_duration = 80 SECONDS) affected_human.adjust_timed_status_effect(0.5 SECONDS * delta_time, /datum/status_effect/confusion, max_duration = 20 SECONDS) - else - SEND_SIGNAL(affected_carbon, COMSIG_CLEAR_MOOD_EVENT, "too_bright") /datum/addiction/maintenance_drugs/end_withdrawal(mob/living/carbon/affected_carbon) . = ..() @@ -211,7 +215,7 @@ return if(DT_PROB(65, delta_time)) return - if(affected_carbon.stat >= SOFT_CRIT) + if(affected_carbon.stat != CONSCIOUS) return var/obj/item/organ/organ = pick(affected_carbon.processing_organs) @@ -235,12 +239,10 @@ addiction_relief_treshold = MIN_NICOTINE_ADDICTION_REAGENT_AMOUNT //much less because your intake is probably from ciggies withdrawal_stage_messages = list("Feel like having a smoke...", "Getting antsy. Really need a smoke now.", "I can't take it! Need a smoke NOW!") - medium_withdrawal_moodlet = /datum/mood_event/nicotine_withdrawal_moderate - severe_withdrawal_moodlet = /datum/mood_event/nicotine_withdrawal_severe - /datum/addiction/nicotine/withdrawal_enters_stage_1(mob/living/carbon/affected_carbon, delta_time) . = ..() affected_carbon.set_timed_status_effect(10 SECONDS * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) + affected_carbon.stats?.set_skill_modifier(-2, /datum/rpg_skill/handicraft, SKILL_SOURCE_NICOTINE_WITHDRAWL) //can't focus without my cigs /datum/addiction/nicotine/withdrawal_stage_2_process(mob/living/carbon/affected_carbon, delta_time) . = ..() @@ -253,3 +255,7 @@ affected_carbon.set_timed_status_effect(30 SECONDS * delta_time, /datum/status_effect/jitter, only_if_higher = TRUE) if(DT_PROB(15, delta_time)) affected_carbon.emote("cough") + +/datum/addiction/nicotine/end_withdrawal(mob/living/carbon/affected_carbon) + . = ..() + affected_carbon.stats?.remove_skill_modifier(-2, /datum/rpg_skill/handicraft, SKILL_SOURCE_NICOTINE_WITHDRAWL) diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm index 09ed43a4c645..b87445232e99 100644 --- a/code/modules/recycling/conveyor.dm +++ b/code/modules/recycling/conveyor.dm @@ -295,11 +295,13 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) // attack with hand, move pulled object onto conveyor -/obj/machinery/conveyor/attack_hand(mob/user, list/modifiers) +/obj/machinery/conveyor/attack_hand(mob/living/user, list/modifiers) . = ..() if(.) return - user.Move_Pulled(src) + + if(!istype(user)) + user.move_grabbed_atoms_towards(src) /obj/machinery/conveyor/power_change() . = ..() @@ -410,7 +412,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor_switch/multitool_act(mob/living/user, obj/item/I) var/input_speed = tgui_input_number(user, "Set the speed of the conveyor belts in seconds", "Speed", conveyor_speed, 20, 0.2) - if(!input_speed || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) + if(!input_speed || QDELETED(user) || QDELETED(src) || !usr.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK)) return conveyor_speed = input_speed to_chat(user, span_notice("You change the time between moves to [input_speed] seconds.")) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 107ffa7e6e59..fb5132d9ef24 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, FIRE = 90, ACID = 30) + armor = list(BLUNT = 25, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 90, ACID = 30) 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 @@ -85,7 +85,7 @@ trunk_check() /obj/machinery/disposal/attackby(obj/item/I, mob/living/user, params) - add_fingerprint(user) + I.leave_evidence(user, src) if(!pressure_charging && !full_pressure && !flush) if(I.tool_behaviour == TOOL_SCREWDRIVER) panel_open = !panel_open @@ -135,7 +135,7 @@ user.visible_message(span_notice("[user.name] places \the [I] into \the [src]."), span_notice("You place \the [I] into \the [src].")) //mouse drop another mob or self -/obj/machinery/disposal/MouseDrop_T(mob/living/target, mob/living/user) +/obj/machinery/disposal/MouseDroppedOn(mob/living/target, mob/living/user) if(istype(target)) stuff_mob_in(target, user) @@ -230,7 +230,7 @@ return /obj/machinery/disposal/proc/flushAnimation() - flick("[icon_state]-flush", src) + z_flick("[icon_state]-flush", src) // called when holder is expelled from a disposal /obj/machinery/disposal/proc/expel(obj/structure/disposalholder/H) @@ -301,9 +301,6 @@ // handle machine interaction -/obj/machinery/disposal/bin/ui_state(mob/user) - return GLOB.notcontained_state - /obj/machinery/disposal/bin/ui_interact(mob/user, datum/tgui/ui) if(machine_stat & BROKEN) return @@ -479,7 +476,7 @@ ..() flush() -/obj/machinery/disposal/delivery_chute/Bumped(atom/movable/AM) //Go straight into the chute +/obj/machinery/disposal/delivery_chute/BumpedBy(atom/movable/AM) //Go straight into the chute if(QDELETED(AM) || !AM.CanEnterDisposals()) return switch(dir) diff --git a/code/modules/recycling/disposal/holder.dm b/code/modules/recycling/disposal/holder.dm index f33f84ee017c..b018dc4267a8 100644 --- a/code/modules/recycling/disposal/holder.dm +++ b/code/modules/recycling/disposal/holder.dm @@ -79,7 +79,8 @@ SIGNAL_HANDLER last_pipe = loc -/obj/structure/disposalholder/proc/try_expel(datum/move_loop/source, succeed, visual_delay) +/// Handles the postprocess check signal, tries to leave the pipe +/obj/structure/disposalholder/proc/try_expel(datum/move_loop/source, result, visual_delay) SIGNAL_HANDLER if(current_pipe || !active) return @@ -141,10 +142,14 @@ /obj/structure/disposalholder/relaymove(mob/living/user, direction) if(user.incapacitated()) return - for(var/mob/M in range(5, get_turf(src))) - M.show_message("CLONG, clong!", MSG_AUDIBLE) + + var/message = pick("CLUNK!", "CLONK!", "CLANK!", "BANG!") + audible_message(span_hear("[icon2html(src, hearers(src) | user)] [message]")) playsound(src.loc, 'sound/effects/clang.ogg', 50, FALSE, FALSE) + var/armor = user.run_armor_check(attack_flag = BLUNT, silent = TRUE) + user.apply_damage(2, BRUTE, blocked = armor, spread_damage = TRUE) + // called to vent all gas in holder to a location /obj/structure/disposalholder/proc/vent_gas(turf/T) T.assume_air(gas) diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index c077e6d25fc0..d02c6023f7c2 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -6,12 +6,12 @@ icon = 'icons/obj/atmospherics/pipes/disposal.dmi' anchored = TRUE density = FALSE - obj_flags = CAN_BE_HIT | ON_BLUEPRINTS + obj_flags = CAN_BE_HIT 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, FIRE = 90, ACID = 30) + armor = list(BLUNT = 25, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, FIRE = 90, ACID = 30) layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes - damage_deflection = 10 + damage_deflection = 5 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 @@ -42,6 +42,9 @@ dpdir |= turn(dir, 180) AddElement(/datum/element/undertile, TRAIT_T_RAY_VISIBLE) + if(isturf(loc)) + var/turf/turf_loc = loc + turf_loc.add_blueprints_preround(src) // pipe is deleted // ensure if holder is present, it is expelled @@ -80,6 +83,20 @@ if(H2 && !H2.active) H.merge(H2) + if(prob(5) && (locate(/mob/living) in H)) + var/list/mobs = list() + + for(var/mob/living/L in H) + mobs += L + + var/message = pick("CLUNK!", "CLONK!", "CLANK!", "BANG!") + audible_message(span_hear("[icon2html(src, hearers(src) | mobs)] [message]")) + playsound(src, 'sound/effects/clang.ogg', 50, FALSE, FALSE) + + for(var/mob/living/L as anything in mobs) + var/armor = L.run_armor_check(attack_flag = BLUNT, silent = TRUE) + L.apply_damage(5, BRUTE, blocked = armor, spread_damage = TRUE) + H.forceMove(P) return P diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 83c324cbe864..78833f3b3534 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -38,15 +38,6 @@ qdel(src) -/obj/item/delivery/contents_explosion(severity, target) - switch(severity) - if(EXPLODE_DEVASTATE) - SSexplosions.high_mov_atom += contents - if(EXPLODE_HEAVY) - SSexplosions.med_mov_atom += contents - if(EXPLODE_LIGHT) - SSexplosions.low_mov_atom += contents - /obj/item/delivery/deconstruct() unwrap_contents() post_unwrap_contents() @@ -116,7 +107,7 @@ to_chat(user, span_notice("You scribble illegibly on the side of [src]!")) return var/str = tgui_input_text(user, "Label text?", "Set label", max_length = MAX_NAME_LEN) - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(!str || !length(str)) to_chat(user, span_warning("Invalid text!")) @@ -381,7 +372,7 @@ new_barcode.cut_multiplier = cut_multiplier // Also the registered percent cut. user.put_in_hands(new_barcode) -/obj/item/sales_tagger/CtrlClick(mob/user) +/obj/item/sales_tagger/CtrlClick(mob/user, list/params) . = ..() payments_acc = null to_chat(user, span_notice("You clear the registered account.")) diff --git a/code/modules/religion/festival/instrument_rites.dm b/code/modules/religion/festival/instrument_rites.dm index 9afa5bb5c6db..82912c4e5ec6 100644 --- a/code/modules/religion/festival/instrument_rites.dm +++ b/code/modules/religion/festival/instrument_rites.dm @@ -63,10 +63,6 @@ continue GLOB.religious_sect.adjust_favor(0.2) -/datum/religion_rites/song_tuner/evangelism/finish_effect(atom/song_player, datum/song/song_datum) - for(var/mob/living/carbon/human/listener in song_datum.hearing_mobs) - SEND_SIGNAL(listener, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) - /datum/religion_rites/song_tuner/nullwave name = "Nullwave Vibrato" desc = "Sing a dull song, protecting those who listen from magic." diff --git a/code/modules/religion/festival/note_particles.dm b/code/modules/religion/festival/note_particles.dm index cf8072b88545..a959bf4537a5 100644 --- a/code/modules/religion/festival/note_particles.dm +++ b/code/modules/religion/festival/note_particles.dm @@ -19,8 +19,8 @@ fade = 1 SECONDS grow = -0.01 velocity = list(0, 0) - position = generator("circle", 0, 16, NORMAL_RAND) - drift = generator("vector", list(0, -0.2), list(0, 0.2)) + position = generator(GEN_CIRCLE, 0, 16, NORMAL_RAND) + drift = generator(GEN_VECTOR, list(0, -0.2), list(0, 0.2)) gravity = list(0, 0.95) /particles/musical_notes/holy diff --git a/code/modules/religion/religion_sects.dm b/code/modules/religion/religion_sects.dm index 31f3fd9d540b..05dd4e40df52 100644 --- a/code/modules/religion/religion_sects.dm +++ b/code/modules/religion/religion_sects.dm @@ -110,12 +110,11 @@ if(hurt_limbs.len) for(var/X in hurt_limbs) var/obj/item/bodypart/affecting = X - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) - blessed.update_damage_overlays() + affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC) + blessed.visible_message(span_notice("[chap] heals [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed!")) playsound(chap, SFX_PUNCH, 25, TRUE, -1) - SEND_SIGNAL(blessed, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return TRUE /**** Nanotrasen Approved God ****/ @@ -149,7 +148,6 @@ R.cell?.charge += charge_amt R.visible_message(span_notice("[chap] charges [R] with the power of [GLOB.deity]!")) to_chat(R, span_boldnotice("You are charged by the power of [GLOB.deity]!")) - SEND_SIGNAL(R, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) playsound(chap, 'sound/effects/bang.ogg', 25, TRUE, -1) return TRUE if(!ishuman(target)) @@ -171,18 +169,15 @@ else blessed.visible_message(span_notice("[chap] charges [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("You feel charged by the power of [GLOB.deity]!")) - SEND_SIGNAL(blessed, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) playsound(chap, 'sound/machines/synth_yes.ogg', 25, TRUE, -1) return TRUE //charge(?) and go - if(bodypart.heal_damage(5,5,BODYTYPE_ROBOTIC)) - blessed.update_damage_overlays() + bodypart.heal_damage(5,5,BODYTYPE_ROBOTIC) blessed.visible_message(span_notice("[chap] [did_we_charge ? "repairs" : "repairs and charges"] [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("The inner machinations of [GLOB.deity] [did_we_charge ? "repairs" : "repairs and charges"] you!")) playsound(chap, 'sound/effects/bang.ogg', 25, TRUE, -1) - SEND_SIGNAL(blessed, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return TRUE /datum/religion_sect/mechanical/on_sacrifice(obj/item/I, mob/living/chap) @@ -261,12 +256,11 @@ var/list/hurt_limbs = blessed.get_damaged_bodyparts(1, 1, BODYTYPE_ORGANIC) if(hurt_limbs.len) for(var/obj/item/bodypart/affecting as anything in hurt_limbs) - if(affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC)) - blessed.update_damage_overlays() + affecting.heal_damage(heal_amt, heal_amt, BODYTYPE_ORGANIC) + blessed.visible_message(span_notice("[chap] barters a heal for [blessed] from [GLOB.deity]!")) to_chat(blessed, span_boldnotice("May the power of [GLOB.deity] compel you to be healed! Thank you for choosing [GLOB.deity]!")) playsound(chap, 'sound/effects/cashregister.ogg', 60, TRUE) - SEND_SIGNAL(blessed, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return TRUE #undef GREEDY_HEAL_COST @@ -361,7 +355,6 @@ blessed.visible_message(span_notice("[chap] empowers [blessed] with the power of [GLOB.deity]!")) to_chat(blessed, span_boldnotice("The power of [GLOB.deity] has made you harder to wound for a while!")) playsound(chap, SFX_PUNCH, 25, TRUE, -1) - SEND_SIGNAL(blessed, COMSIG_ADD_MOOD_EVENT, "blessing", /datum/mood_event/blessing) return TRUE //trust me, you'll be feeling the pain from the maint drugs all well enough /datum/religion_sect/maintenance/on_sacrifice(obj/item/reagent_containers/offering, mob/living/user) diff --git a/code/modules/religion/religion_structures.dm b/code/modules/religion/religion_structures.dm index 8c054843545c..c9c41175cb3b 100644 --- a/code/modules/religion/religion_structures.dm +++ b/code/modules/religion/religion_structures.dm @@ -17,9 +17,6 @@ reflect_sect_in_icons() GLOB.chaplain_altars += src AddElement(/datum/element/climbable) - -/obj/structure/altar_of_gods/ComponentInitialize() - . = ..() AddComponent(/datum/component/religious_tool, ALL, FALSE, CALLBACK(src, PROC_REF(reflect_sect_in_icons))) /obj/structure/altar_of_gods/Destroy() @@ -33,20 +30,21 @@ new_overlays += "convertaltarcandle" return new_overlays -/obj/structure/altar_of_gods/attack_hand(mob/living/user, list/modifiers) - if(!Adjacent(user) || !user.pulling) - return ..() - if(!isliving(user.pulling)) - return ..() - var/mob/living/pushed_mob = user.pulling +/obj/structure/altar_of_gods/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + . = ..() + if(!isliving(victim)) + return + + var/mob/living/pushed_mob = victim if(pushed_mob.buckled) to_chat(user, span_warning("[pushed_mob] is buckled to [pushed_mob.buckled]!")) - return ..() + return TRUE + to_chat(user, span_notice("You try to coax [pushed_mob] onto [src]...")) if(!do_after(user,(5 SECONDS),target = pushed_mob)) - return ..() + return TRUE pushed_mob.forceMove(loc) - return ..() + return TRUE /obj/structure/altar_of_gods/examine_more(mob/user) if(!isobserver(user)) @@ -107,7 +105,7 @@ new /obj/effect/decal/cleanable/ash(drop_location()) qdel(src) -/obj/item/ritual_totem/can_be_pulled(user, grab_state, force) +/obj/item/ritual_totem/can_be_grabbed(mob/living/grabber, target_zone, force) . = ..() return FALSE //no diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index 0d21596cc3cc..133e94ce46f1 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -509,8 +509,6 @@ to_chat(user, span_warning("You feel your genes rattled and reshaped. You're becoming something new.")) user.emote("laughs") ADD_TRAIT(user, TRAIT_HOPELESSLY_ADDICTED, "maint_adaptation") - //addiction sends some nasty mood effects but we want the maint adaption to be enjoyed like a fine wine - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "maint_adaptation", /datum/mood_event/maintenance_adaptation) if(iscarbon(user)) var/mob/living/carbon/vomitorium = user vomitorium.vomit() @@ -656,7 +654,7 @@ /datum/religion_rites/declare_arena/perform_rite(mob/living/user, atom/religious_tool) var/list/filtered = list() - for(var/area/unfiltered_area as anything in GLOB.sortedAreas) + for(var/area/unfiltered_area as anything in GLOB.areas) if(istype(unfiltered_area, /area/centcom)) //youuu dont need thaaat continue if(!(unfiltered_area.area_flags & HIDDEN_AREA)) diff --git a/code/modules/religion/sparring/ceremonial_gear.dm b/code/modules/religion/sparring/ceremonial_gear.dm index ddd291fd3eac..8860706ff2ca 100644 --- a/code/modules/religion/sparring/ceremonial_gear.dm +++ b/code/modules/religion/sparring/ceremonial_gear.dm @@ -23,7 +23,7 @@ sharpness = SHARP_EDGED max_integrity = 200 material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE //doesn't affect stats of the weapon as to avoid gamering your opponent with a dope weapon - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF /obj/item/ceremonial_blade/Initialize(mapload) @@ -42,13 +42,14 @@ force = old_force throwforce = old_throwforce -/obj/item/ceremonial_blade/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/ceremonial_blade/get_block_chance(mob/living/carbon/human/wielder, atom/movable/hitby, damage, attack_type, armor_penetration) if(attack_type != MELEE_ATTACK || !ishuman(hitby.loc)) return ..() + + . = ..() if(HAS_TRAIT(hitby.loc, TRAIT_SPARRING)) //becomes 30 block - final_block_chance *= 10 - . = ..() + . *= 10 /obj/item/ceremonial_blade/proc/block_sharpening(datum/source, increment, max) SIGNAL_HANDLER diff --git a/code/modules/religion/sparring/sparring_contract.dm b/code/modules/religion/sparring/sparring_contract.dm index 6c37f0cac2e7..6deea262aad1 100644 --- a/code/modules/religion/sparring/sparring_contract.dm +++ b/code/modules/religion/sparring/sparring_contract.dm @@ -5,7 +5,6 @@ drop_sound = 'sound/items/handling/paper_drop.ogg' pickup_sound = 'sound/items/handling/paper_pickup.ogg' throw_range = 1 - throw_speed = 1 w_class = WEIGHT_CLASS_TINY ///what weapons will be allowed during the sparring match var/weapons_condition = CONDITION_MELEE_ONLY diff --git a/code/modules/religion/sparring/sparring_datum.dm b/code/modules/religion/sparring/sparring_datum.dm index 73a73784a1ae..dfc9cb56c26f 100644 --- a/code/modules/religion/sparring/sparring_datum.dm +++ b/code/modules/religion/sparring/sparring_datum.dm @@ -285,7 +285,6 @@ return to_chat(loser, span_userdanger("[GLOB.deity] is enraged by your lackluster sparring record!")) lightningbolt(loser) - SEND_SIGNAL(loser, COMSIG_ADD_MOOD_EVENT, "sparring", /datum/mood_event/banished) loser.mind.holy_role = NONE to_chat(loser, span_userdanger("You have been excommunicated! You are no longer holy!")) if(STAKES_MONEY_MATCH) diff --git a/code/modules/requests/request_manager.dm b/code/modules/requests/request_manager.dm index de8fc5e0f63d..957619f3edb2 100644 --- a/code/modules/requests/request_manager.dm +++ b/code/modules/requests/request_manager.dm @@ -189,7 +189,7 @@ GLOBAL_DATUM_INIT(requests, /datum/request_manager, new) to_chat(usr, "You cannot set the nuke code for a non-nuke-code-request request!", confidential = TRUE) return TRUE var/code = random_nukecode() - for(var/obj/machinery/nuclearbomb/selfdestruct/SD in GLOB.nuke_list) + for(var/obj/machinery/nuclearbomb/selfdestruct/SD in INSTANCES_OF(/obj/machinery/nuclearbomb)) SD.r_code = code message_admins("[key_name_admin(usr)] has set the self-destruct code to \"[code]\".") return TRUE diff --git a/code/modules/research/designs/AI_module_designs.dm b/code/modules/research/designs/AI_module_designs.dm index 3aa60f0cf1de..690dc8045462 100644 --- a/code/modules/research/designs/AI_module_designs.dm +++ b/code/modules/research/designs/AI_module_designs.dm @@ -20,7 +20,6 @@ id = "safeguard_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/supplied/safeguard - category = list(DCAT_AI_LAW) /datum/design/law/onehuman_module name = "Law Board (OneHuman)" @@ -28,7 +27,6 @@ id = "onehuman_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 6000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/zeroth/onehuman - category = list(DCAT_AI_LAW) /datum/design/law/protectstation_module name = "Law Board (ProtectStation)" @@ -36,7 +34,6 @@ id = "protectstation_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/supplied/protect_station - category = list(DCAT_AI_LAW) /datum/design/law/quarantine_module name = "Law Board (Quarantine)" @@ -44,7 +41,6 @@ id = "quarantine_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/supplied/quarantine - category = list(DCAT_AI_LAW) /datum/design/law/oxygen_module name = "Law Board (OxygenIsToxicToHumans)" @@ -52,7 +48,6 @@ id = "oxygen_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/supplied/oxygen - category = list(DCAT_AI_LAW) /datum/design/law/freeform_module name = "Law Board (Freeform)" @@ -60,7 +55,6 @@ id = "freeform_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 10000, /datum/material/bluespace = 2000)//Custom inputs should be more expensive to get build_path = /obj/item/ai_module/supplied/freeform - category = list(DCAT_AI_LAW) /datum/design/law/reset_module name = "Law Board (Reset)" @@ -68,7 +62,6 @@ id = "reset_module" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000) build_path = /obj/item/ai_module/reset - category = list(DCAT_AI_LAW) /datum/design/law/purge_module name = "Law Board (Purge)" @@ -76,7 +69,6 @@ id = "purge_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/reset/purge - category = list(DCAT_AI_LAW) /datum/design/law/remove_module name = "Law Board (Law Removal)" @@ -84,7 +76,6 @@ id = "remove_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/remove - category = list(DCAT_AI_LAW) /datum/design/law/freeformcore_module name = "AI Core Module (Freeform)" @@ -92,7 +83,6 @@ id = "freeformcore_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 10000, /datum/material/bluespace = 2000)//Ditto build_path = /obj/item/ai_module/core/freeformcore - category = list(DCAT_AI_LAW) /datum/design/law/asimov name = "Core Law Board (Asimov)" @@ -100,7 +90,6 @@ id = "asimov_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/asimov - category = list(DCAT_AI_LAW) /datum/design/law/paladin_module name = "Core Law Board (P.A.L.A.D.I.N.)" @@ -108,7 +97,6 @@ id = "paladin_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/paladin - category = list(DCAT_AI_LAW) /datum/design/law/tyrant_module name = "Core Law Board (T.Y.R.A.N.T.)" @@ -116,7 +104,6 @@ id = "tyrant_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/tyrant - category = list(DCAT_AI_LAW) /datum/design/law/overlord_module name = "Core Law Board (Overlord)" @@ -124,7 +111,6 @@ id = "overlord_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/overlord - category = list(DCAT_AI_LAW) /datum/design/law/corporate_module name = "Core Law Board (Corporate)" @@ -132,7 +118,6 @@ id = "corporate_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/corp - category = list(DCAT_AI_LAW) /datum/design/law/default_module name = "Core Law Board (Default)" @@ -140,4 +125,3 @@ id = "default_module" materials = list(/datum/material/glass = 1000, /datum/material/diamond = 2000, /datum/material/bluespace = 1000) build_path = /obj/item/ai_module/core/full/custom - category = list(DCAT_AI_LAW) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 0729f4e73ba4..9e2bab77c303 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -207,7 +207,7 @@ build_type = AUTOLATHE | FABRICATOR materials = list(/datum/material/iron = 50, /datum/material/glass = 50) build_path = /obj/item/airlock_painter - category = list(DCAT_MISC_TOOL) + category = list(DCAT_PAINTER) mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI /datum/design/airlock_painter/decal @@ -216,7 +216,7 @@ build_type = AUTOLATHE | FABRICATOR materials = list(/datum/material/iron = 50, /datum/material/glass = 50) build_path = /obj/item/airlock_painter/decal - category = list(DCAT_MISC_TOOL) + category = list(DCAT_PAINTER) mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI /datum/design/airlock_painter/decal/tile @@ -225,9 +225,19 @@ build_type = AUTOLATHE | FABRICATOR materials = list(/datum/material/iron = 50, /datum/material/glass = 50) build_path = /obj/item/airlock_painter/decal/tile - category = list(DCAT_MISC_TOOL) + category = list(DCAT_PAINTER) + mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + +/datum/design/paint_sprayer + name = "Paint Sprayer" + id = "paint_sprayer" + build_type = AUTOLATHE | FABRICATOR + materials = list(/datum/material/iron = 50, /datum/material/glass = 50) + build_path = /obj/item/paint_sprayer + category = list(DCAT_PAINTER) mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + /datum/design/emergency_oxygen name = "Emergency Oxygen Tank" id = "emergency_oxygen" @@ -487,6 +497,15 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI +/datum/design/fixovein + name = "Vascular Recoupler" + id = "vascroup" + build_type = AUTOLATHE | FABRICATOR + materials = list(/datum/material/iron = 4000, /datum/material/glass = 1500, /datum/material/silver = 500) + build_path = /obj/item/fixovein + category = list(DCAT_MEDICAL) + mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + /datum/design/circular_saw name = "Circular Saw" id = "circular_saw" @@ -995,24 +1014,6 @@ maxstack = 5 mapload_design_flags = DESIGN_FAB_CIV -/datum/design/petridish - name = "Petri Dish" - id = "petri_dish" - build_type = FABRICATOR | AUTOLATHE - materials = list(/datum/material/glass = 500) - build_path = /obj/item/petri_dish - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_MEDICAL - -/datum/design/swab - name = "Sterile Swab" - id = "swab" - build_type = FABRICATOR | AUTOLATHE - materials = list(/datum/material/plastic = 200) - build_path = /obj/item/swab - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_MEDICAL - /datum/design/chisel name = "Chisel" id = "chisel" diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index a6306a748735..eefc695f63bd 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -223,7 +223,7 @@ id = "s_holster" build_type = BIOGENERATOR materials = list(/datum/material/biomass= 400) - build_path = /obj/item/storage/belt/holster + build_path = /obj/item/storage/belt/holster/shoulder/generic category = list("Organic Materials") mapload_design_flags = DESIGN_BIOGENERATOR diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index fbeece70f066..93dab29d6a36 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -7,46 +7,37 @@ build_type = IMPRINTER | AWAY_IMPRINTER materials = list(/datum/material/glass = 1000) category = list(DCAT_CIRCUIT) + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/arcade_battle name = "Circuit Board (Battle Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new arcade machine." id = "arcade_battle" build_path = /obj/item/circuitboard/computer/arcade/battle - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/orion_trail name = "Circuit Board (Orion Trail Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new Orion Trail machine." id = "arcade_orion" build_path = /obj/item/circuitboard/computer/arcade/orion_trail - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/seccamera name = "Circuit Board (Security Camera)" desc = "Allows for the construction of circuit boards used to build security camera computers." id = "seccamera" build_path = /obj/item/circuitboard/computer/security - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/rdcamera name = "Circuit Board (Research Monitor)" desc = "Allows for the construction of circuit boards used to build research camera computers." id = "rdcamera" build_path = /obj/item/circuitboard/computer/research - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/xenobiocamera name = "Circuit Board (Xenobiology Console)" desc = "Allows for the construction of circuit boards used to build xenobiology camera computers." id = "xenobioconsole" build_path = /obj/item/circuitboard/computer/xenobiology - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/aiupload name = "Circuit Board (AI Upload)" @@ -54,8 +45,6 @@ id = "aiupload" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/diamond = 2000, /datum/material/bluespace = 2000) build_path = /obj/item/circuitboard/computer/aiupload - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/borgupload name = "Circuit Board (Cyborg Upload)" @@ -63,48 +52,30 @@ id = "borgupload" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000, /datum/material/diamond = 2000, /datum/material/bluespace = 2000) build_path = /obj/item/circuitboard/computer/borgupload - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/med_data name = "Circuit Board (Medical Records)" desc = "Allows for the construction of circuit boards used to build a medical records console." id = "med_data" build_path = /obj/item/circuitboard/computer/med_data - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER - -/datum/design/board/operating - name = "Circuit Board (Operating Computer)" - desc = "Allows for the construction of circuit boards used to build an operating computer console." - id = "operating" - build_path = /obj/item/circuitboard/computer/operating - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/pandemic name = "Circuit Board (PanD.E.M.I.C. 2200)" desc = "Allows for the construction of circuit boards used to build a PanD.E.M.I.C. 2200 console." id = "pandemic" build_path = /obj/item/circuitboard/computer/pandemic - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/scan_console name = "Circuit Board (DNA Console)" desc = "Allows for the construction of circuit boards used to build a new DNA console." id = "scan_console" build_path = /obj/item/circuitboard/computer/scan_consolenew - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/comconsole name = "Circuit Board (Communications)" desc = "Allows for the construction of circuit boards used to build a communications console." id = "comconsole" build_path = /obj/item/circuitboard/computer/communications - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/crewconsole name = "Circuit Board (Crew monitoring computer)" @@ -112,32 +83,24 @@ id = "crewconsole" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/crew - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/secdata name = "Circuit Board (Security Records Console)" desc = "Allows for the construction of circuit boards used to build a security records console." id = "secdata" build_path = /obj/item/circuitboard/computer/secure_data - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/atmosalerts name = "Circuit Board (Atmosphere Alert)" desc = "Allows for the construction of circuit boards used to build an atmosphere alert console." id = "atmosalerts" build_path = /obj/item/circuitboard/computer/atmos_alert - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/atmos_control name = "Circuit Board (Atmospheric Monitor)" desc = "Allows for the construction of circuit boards used to build an Atmospheric Monitor." id = "atmos_control" build_path = /obj/item/circuitboard/computer/atmos_control - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/robocontrol name = "Circuit Board (Robotics Control Console)" @@ -145,55 +108,41 @@ id = "robocontrol" materials = list(/datum/material/glass = 1000, /datum/material/gold = 1000, /datum/material/silver = 1000, /datum/material/bluespace = 2000) build_path = /obj/item/circuitboard/computer/robotics - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/slot_machine name = "Circuit Board (Slot Machine)" desc = "Allows for the construction of circuit boards used to build a new slot machine." id = "slotmachine" build_path = /obj/item/circuitboard/computer/slot_machine - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/powermonitor name = "Circuit Board (Power Monitor)" desc = "Allows for the construction of circuit boards used to build a new power monitor." id = "powermonitor" build_path = /obj/item/circuitboard/computer/powermonitor - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/solarcontrol name = "Circuit Board (Solar Control)" desc = "Allows for the construction of circuit boards used to build a solar control console." id = "solarcontrol" build_path = /obj/item/circuitboard/computer/solar_control - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/prisonmanage name = "Circuit Board (Prisoner Management Console)" desc = "Allows for the construction of circuit boards used to build a prisoner management console." id = "prisonmanage" build_path = /obj/item/circuitboard/computer/prisoner - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER - /datum/design/board/mechacontrol name = "Circuit Board (Exosuit Control Console)" desc = "Allows for the construction of circuit boards used to build an exosuit control console." id = "mechacontrol" build_path = /obj/item/circuitboard/computer/mecha_control - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/mechapower name = "Circuit Board (Mech Bay Power Control Console)" desc = "Allows for the construction of circuit boards used to build a mech bay power control console." id = "mechapower" build_path = /obj/item/circuitboard/computer/mech_bay_power_console - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/cargo name = "Circuit Board (Supply Console)" @@ -201,8 +150,6 @@ id = "cargo" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/cargo - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SUPPLY /datum/design/board/cargorequest name = "Circuit Board (Supply Request Console)" @@ -210,78 +157,54 @@ id = "cargorequest" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/cargo/request - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/mining name = "Circuit Board (Outpost Status Display)" desc = "Allows for the construction of circuit boards used to build an outpost status display console." id = "mining" build_path = /obj/item/circuitboard/computer/mining - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/comm_monitor name = "Circuit Board (Telecommunications Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunications monitor." id = "comm_monitor" build_path = /obj/item/circuitboard/computer/comm_monitor - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/comm_server name = "Circuit Board (Telecommunications Server Monitoring Console)" desc = "Allows for the construction of circuit boards used to build a telecommunication server browser and monitor." id = "comm_server" build_path = /obj/item/circuitboard/computer/comm_server - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/message_monitor name = "Circuit Board (Messaging Monitor Console)" desc = "Allows for the construction of circuit boards used to build a messaging monitor console." id = "message_monitor" build_path = /obj/item/circuitboard/computer/message_monitor - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/aifixer name = "Circuit Board (AI Integrity Restorer)" desc = "Allows for the construction of circuit boards used to build an AI Integrity Restorer." id = "aifixer" build_path = /obj/item/circuitboard/computer/aifixer - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/libraryconsole name = "Circuit Board (Library Console)" desc = "Allows for the construction of circuit boards used to build a new library console." id = "libraryconsole" build_path = /obj/item/circuitboard/computer/libraryconsole - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/apc_control name = "Circuit Board (APC Control)" desc = "Allows for the construction of circuit boards used to build a new APC control console." id = "apc_control" build_path = /obj/item/circuitboard/computer/apc_control - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/advanced_camera name = "Circuit Board (Advanced Camera Console)" desc = "Allows for the construction of circuit boards used to build advanced camera consoles." id = "advanced_camera" build_path = /obj/item/circuitboard/computer/advanced_camera - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER - -/datum/design/board/bountypad_control - name = "Circuit Board (Civilian Bounty Pad Control)" - desc = "Allows for the construction of circuit boards used to build a new civilian bounty pad console." - id = "bounty_pad_control" - build_path = /obj/item/circuitboard/computer/bountypad - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/exoscanner_console name = "Circuit Board (Scanner Array Control Console)" @@ -289,7 +212,6 @@ id = "exoscanner_console" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/exoscanner_console - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/exodrone_console name = "Circuit Board (Exploration Drone Control Console)" @@ -297,7 +219,6 @@ id = "exodrone_console" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/exodrone_console - mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/accounting_console name = "Circuit Board (Account Lookup Console)" @@ -305,5 +226,17 @@ id = "account_console" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/accounting - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_IMPRINTER + +/datum/design/board/bodyscanner + name = "Circuit Board (Body Scanner)" + desc = "Allows for the construction of circuit boards used to assess the wealth of crewmates on station." + id = "bodyscanner" + build_type = IMPRINTER + build_path = /obj/item/circuitboard/machine/bodyscanner + +/datum/design/board/bodyscanner_console + name = "Circuit Board (Body Scanner)" + desc = "Allows for the construction of circuit boards used to assess the wealth of crewmates on station." + id = "bodyscanner_console" + build_type = IMPRINTER + build_path = /obj/item/circuitboard/machine/bodyscanner_console diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index 33fd6d693bed..7933f44f0fee 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -6,7 +6,7 @@ name = "Left Arm" id = "l_arm" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/arm/left category = list(SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -15,7 +15,7 @@ name = "Right Arm" id = "r_arm" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/arm/right category = list(SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -24,7 +24,7 @@ name = "Left Leg" id = "l_leg" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/leg/left category = list(SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL, "digitigrade") mapload_design_flags = DESIGN_LIMBGROWER @@ -33,7 +33,7 @@ name = "Right Leg" id = "r_leg" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25) + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/bodypart/leg/right category = list(SPECIES_HUMAN,SPECIES_LIZARD,SPECIES_MOTH,SPECIES_PLASMAMAN,SPECIES_ETHEREAL, "digitigrade") mapload_design_flags = DESIGN_LIMBGROWER @@ -44,7 +44,7 @@ name = "Heart" id = "heart" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 30) + reagents_list = list(/datum/reagent/medicine/synthflesh = 30) build_path = /obj/item/organ/heart category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -53,7 +53,7 @@ name = "Lungs" id = "lungs" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/lungs category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -62,7 +62,7 @@ name = "Liver" id = "liver" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/liver category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -71,7 +71,7 @@ name = "Stomach" id = "stomach" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 15) + reagents_list = list(/datum/reagent/medicine/synthflesh = 15) build_path = /obj/item/organ/stomach category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -80,7 +80,7 @@ name = "Appendix" id = "appendix" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 5) //why would you need this + reagents_list = list(/datum/reagent/medicine/synthflesh = 5) //why would you need this build_path = /obj/item/organ/appendix category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -89,7 +89,7 @@ name = "Eyes" id = "eyes" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10) build_path = /obj/item/organ/eyes category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -98,7 +98,7 @@ name = "Ears" id = "ears" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10) build_path = /obj/item/organ/ears category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -107,17 +107,17 @@ name = "Tongue" id = "tongue" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10) build_path = /obj/item/organ/tongue category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER // Grows a fake lizard tail - not usable in lizard wine and other similar recipes. /datum/design/lizard_tail - name = "Unathi Tail" + name = "Jinan Tail" id = "liztail" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/tail/lizard/fake category = list(SPECIES_LIZARD) mapload_design_flags = DESIGN_LIMBGROWER @@ -126,7 +126,7 @@ name = "Forked Tongue" id = "liztongue" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/tongue/lizard category = list(SPECIES_LIZARD) mapload_design_flags = DESIGN_LIMBGROWER @@ -135,7 +135,7 @@ name = "Monkey Tail" id = "monkeytail" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/tail/monkey category = list("other") mapload_design_flags = DESIGN_LIMBGROWER @@ -144,7 +144,7 @@ name = "Cat Tail" id = "cattail" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 20) build_path = /obj/item/organ/tail/cat category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -153,7 +153,7 @@ name = "Cat Ears" id = "catears" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10) build_path = /obj/item/organ/ears/cat category = list(SPECIES_HUMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -162,7 +162,7 @@ name = "Plasma Filter" id = "plasmamanlungs" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/toxin/plasma = 20) build_path = /obj/item/organ/lungs/plasmaman category = list(SPECIES_PLASMAMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -171,7 +171,7 @@ name = "Plasma Bone Tongue" id = "plasmamantongue" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/toxin/plasma = 20) build_path = /obj/item/organ/tongue/bone/plasmaman category = list(SPECIES_PLASMAMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -180,7 +180,7 @@ name = "Reagent Processing Crystal" id = "plasmamanliver" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/toxin/plasma = 20) build_path = /obj/item/organ/liver/plasmaman category = list(SPECIES_PLASMAMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -189,7 +189,7 @@ name = "Digestive Crystal" id = "plasmamanstomach" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/toxin/plasma = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/toxin/plasma = 20) build_path = /obj/item/organ/stomach/bone/plasmaman category = list(SPECIES_PLASMAMAN) mapload_design_flags = DESIGN_LIMBGROWER @@ -198,7 +198,7 @@ name = "Biological Battery" id = "etherealstomach" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) build_path = /obj/item/organ/stomach/ethereal category = list(SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -207,7 +207,7 @@ name = "Electrical Discharger" id = "etherealtongue" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) build_path = /obj/item/organ/tongue/ethereal category = list(SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -216,7 +216,7 @@ name = "Aeration Reticulum" id = "ethereallungs" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) build_path = /obj/item/organ/lungs/ethereal category = list(SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -226,7 +226,7 @@ name = "Crystal Core" id = "etherealheart" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) + reagents_list = list(/datum/reagent/medicine/synthflesh = 10, /datum/reagent/consumable/liquidelectricity/enriched = 20) build_path = /obj/item/organ/heart/ethereal category = list(SPECIES_ETHEREAL) mapload_design_flags = DESIGN_LIMBGROWER @@ -235,7 +235,7 @@ name = "Arm Blade" id = "armblade" build_type = LIMBGROWER - reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 75) + reagents_list = list(/datum/reagent/medicine/synthflesh = 75) build_path = /obj/item/melee/synthetic_arm_blade category = list("other","emagged") @@ -263,23 +263,13 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL -/obj/item/disk/data/limbs/felinid - name = "Felinid Organ Design Disk" - limb_designs = list(/datum/design/cat_tail, /datum/design/cat_ears) - -/datum/design/limb_disk/felinid - name = "Felinid Organ Design Disk" - desc = "Contains designs for felinid organs for the limbgrower - Felinid ears and tail." - id = "limbdesign_felinid" - build_path = /obj/item/disk/data/limbs/felinid - /obj/item/disk/data/limbs/lizard - name = "Unathi Organ Design Disk" + name = "Jinan Organ Design Disk" limb_designs = list(/datum/design/lizard_tail, /datum/design/lizard_tongue) /datum/design/limb_disk/lizard - name = "Unathi Organ Design Disk" - desc = "Contains designs for unathi organs for the limbgrower - Unathi tongue, and tail" + name = "Jinan Organ Design Disk" + desc = "Contains designs for Jinan organs for the limbgrower - Jinan tongue, and tail" id = "limbdesign_unathi" build_path = /obj/item/disk/data/limbs/lizard diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index b432f8289c02..6d9cc5d55375 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -6,48 +6,42 @@ desc = "The circuit board for an electrolyzer." id = "electrolyzer" build_path = /obj/item/circuitboard/machine/electrolyzer - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/smes name = "Machine Board (SMES Board)" desc = "The circuit board for a SMES." id = "smes" build_path = /obj/item/circuitboard/machine/smes - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/announcement_system name = "Machine Board (Automated Announcement System Board)" desc = "The circuit board for an automated announcement system." id = "automated_announcement" build_path = /obj/item/circuitboard/machine/announcement_system - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/emitter name = "Machine Board (Emitter Board)" desc = "The circuit board for an emitter." id = "emitter" build_path = /obj/item/circuitboard/machine/emitter - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/thermomachine name = "Machine Board (Thermomachine Board)" desc = "The circuit board for a thermomachine." id = "thermomachine" build_path = /obj/item/circuitboard/machine/thermomachine - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/space_heater name = "Machine Board (Space Heater Board)" desc = "The circuit board for a space heater." id = "space_heater" build_path = /obj/item/circuitboard/machine/space_heater - category = list (DCAT_CIRCUIT) - mapload_design_flags = ALL + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/teleport_station name = "Machine Board (Teleportation Station Board)" @@ -55,8 +49,7 @@ id = "tele_station" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/teleporter_station - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/teleport_hub name = "Machine Board (Teleportation Hub Board)" @@ -64,8 +57,7 @@ id = "tele_hub" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/teleporter_hub - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/quantumpad name = "Machine Board (Quantum Pad Board)" @@ -73,8 +65,7 @@ id = "quantumpad" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/quantumpad - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/launchpad name = "Machine Board (Bluespace Launchpad Board)" @@ -82,17 +73,14 @@ id = "launchpad" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/launchpad - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI - + mapload_design_flags = NONE /datum/design/board/launchpad_console name = "Machine Board (Bluespace Launchpad Console Board)" desc = "The circuit board for a bluespace launchpad Console." id = "launchpad_console" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/launchpad_console - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/teleconsole name = "Computer Design (Teleporter Console)" @@ -100,69 +88,68 @@ id = "teleconsole" build_type = IMPRINTER build_path = /obj/item/circuitboard/computer/teleporter - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/cryotube name = "Machine Board (Cryotube Board)" desc = "The circuit board for a cryotube." id = "cryotube" build_path = /obj/item/circuitboard/machine/cryo_tube - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_MEDICAL - category = list (DCAT_CIRCUIT) + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/chem_dispenser - name = "Machine Board (Portable Chem Dispenser Board)" - desc = "The circuit board for a portable chem dispenser." + name = "Machine Board (Chem Dispenser Board)" + desc = "The circuit board for a chem dispenser." id = "chem_dispenser" build_path = /obj/item/circuitboard/machine/chem_dispenser - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_MEDICAL - category = list (DCAT_CIRCUIT) + mapload_design_flags = DESIGN_IMPRINTER + +/datum/design/board/mini_chem_dispenser + name = "Machine Board (Mini Chem Dispenser Board)" + desc = "The circuit board for a mini chem dispenser." + id = "chem_dispenser" + build_path = /obj/item/circuitboard/machine/chem_dispenser/mini + mapload_design_flags = DESIGN_IMPRINTER + +/datum/design/board/chem_dispenser + name = "Machine Board (Big Chem Dispenser Board)" + desc = "The circuit board for a big chem dispenser." + id = "chem_dispenser" + build_path = /obj/item/circuitboard/machine/chem_dispenser/big + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/chem_master name = "Machine Board (Chem Master Board)" desc = "The circuit board for a Chem Master 3000." id = "chem_master" - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_MEDICAL + mapload_design_flags = DESIGN_IMPRINTER build_path = /obj/item/circuitboard/machine/chem_master - category = list (DCAT_CIRCUIT) /datum/design/board/chem_heater name = "Machine Board (Chemical Heater Board)" desc = "The circuit board for a chemical heater." id = "chem_heater" - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_MEDICAL + mapload_design_flags = DESIGN_IMPRINTER build_path = /obj/item/circuitboard/machine/chem_heater - category = list (DCAT_CIRCUIT) - -/datum/design/board/chem_mass_spec - name = "Machine Board (High-Performance Liquid Chromatography)" - desc = "The circuit board for a High-Performance Liquid Chromatography (Machine Board)" - id = "chem_mass_spec" - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_MEDICAL - build_path = /obj/item/circuitboard/machine/chem_mass_spec - category = list (DCAT_CIRCUIT) /datum/design/board/smoke_machine name = "Machine Board (Smoke Machine)" desc = "The circuit board for a smoke machine." id = "smoke_machine" build_path = /obj/item/circuitboard/machine/smoke_machine - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/reagentgrinder name = "Machine Board (All-In-One Grinder)" desc = "The circuit board for an All-In-One Grinder." id = "reagentgrinder" build_path = /obj/item/circuitboard/machine/reagentgrinder - category = list (DCAT_CIRCUIT) /datum/design/board/hypnochair name = "Machine Board (Enhanced Interrogation Chamber)" desc = "Allows for the construction of circuit boards used to build an Enhanced Interrogation Chamber." id = "hypnochair" - mapload_design_flags = DESIGN_FAB_SECURITY + mapload_design_flags = NONE build_path = /obj/item/circuitboard/machine/hypnochair category = list(DCAT_CIRCUIT) @@ -172,23 +159,21 @@ id = "biogenerator" build_path = /obj/item/circuitboard/machine/biogenerator category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/hydroponics name = "Machine Board (Hydroponics Tray Board)" desc = "The circuit board for a hydroponics tray." id = "hydro_tray" build_path = /obj/item/circuitboard/machine/hydroponics - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/destructive_analyzer name = "Machine Board (Destructive Analyzer Board)" desc = "The circuit board for a destructive analyzer." id = "destructive_analyzer" build_path = /obj/item/circuitboard/machine/destructive_analyzer - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/fabricator name = "Machine Board (Fabricator Board)" @@ -196,8 +181,7 @@ id = "protolathe" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/fabricator - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/fabricator/offstation name = "Machine Board (Ancient Fabricator Board)" @@ -205,8 +189,7 @@ id = "protolathe_offstation" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/fabricator/offstation - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OFFSTATION + mapload_design_flags = AWAY_IMPRINTER /datum/design/board/circuit_imprinter name = "Machine Board (Circuit Imprinter Board)" @@ -214,8 +197,7 @@ id = "circuit_imprinter" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/circuit_imprinter - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/circuit_imprinter/offstation name = "Machine Board (Ancient Circuit Imprinter Board)" @@ -223,7 +205,6 @@ id = "circuit_imprinter_offstation" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/circuit_imprinter/offstation - category = list(DCAT_CIRCUIT) mapload_design_flags = DESIGN_FAB_OFFSTATION /datum/design/board/cyborgrecharger @@ -231,144 +212,127 @@ desc = "The circuit board for a Cyborg Recharger." id = "cyborgrecharger" build_path = /obj/item/circuitboard/machine/cyborgrecharger - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/mech_recharger name = "Machine Board (Mechbay Recharger Board)" desc = "The circuit board for a Mechbay Recharger." id = "mech_recharger" build_path = /obj/item/circuitboard/machine/mech_recharger - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/dnascanner name = "Machine Board (DNA Scanner)" desc = "The circuit board for a DNA Scanner." id = "dnascanner" - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER build_path = /obj/item/circuitboard/machine/dnascanner - category = list(DCAT_CIRCUIT) /datum/design/board/doppler_array name = "Machine Board (Tachyon-Doppler Research Array Board)" desc = "The circuit board for a tachyon-doppler research array" id = "doppler_array" build_path = /obj/item/circuitboard/machine/doppler_array - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/anomaly_refinery name = "Machine Board (Anomaly Refinery Board)" desc = "The circuit board for an anomaly refinery" id = "anomaly_refinery" build_path = /obj/item/circuitboard/machine/anomaly_refinery - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/tank_compressor name = "Machine Board (Tank Compressor Board)" desc = "The circuit board for a tank compressor" id = "tank_compressor" build_path = /obj/item/circuitboard/machine/tank_compressor - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/microwave name = "Machine Board (Microwave Board)" desc = "The circuit board for a microwave." id = "microwave" build_path = /obj/item/circuitboard/machine/microwave - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER + /datum/design/board/gibber name = "Machine Board (Gibber Board)" desc = "The circuit board for a gibber." id = "gibber" build_path = /obj/item/circuitboard/machine/gibber - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER //oh god /datum/design/board/smartfridge name = "Machine Board (Smartfridge Board)" desc = "The circuit board for a smartfridge." id = "smartfridge" build_path = /obj/item/circuitboard/machine/smartfridge - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/monkey_recycler name = "Machine Board (Monkey Recycler Board)" desc = "The circuit board for a monkey recycler." id = "monkey_recycler" build_path = /obj/item/circuitboard/machine/monkey_recycler - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/seed_extractor name = "Machine Board (Seed Extractor Board)" desc = "The circuit board for a seed extractor." id = "seed_extractor" build_path = /obj/item/circuitboard/machine/seed_extractor - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/processor name = "Machine Board (Food/Slime Processor Board)" desc = "The circuit board for a processing unit. Screwdriver the circuit to switch between food (default) or slime processing." id = "processor" build_path = /obj/item/circuitboard/machine/processor - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/soda_dispenser name = "Machine Board (Portable Soda Dispenser Board)" desc = "The circuit board for a portable soda dispenser." id = "soda_dispenser" build_path = /obj/item/circuitboard/machine/chem_dispenser/drinks - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE - category = list (DCAT_CIRCUIT) + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/beer_dispenser name = "Machine Board (Portable Booze Dispenser Board)" desc = "The circuit board for a portable booze dispenser." id = "beer_dispenser" build_path = /obj/item/circuitboard/machine/chem_dispenser/drinks/beer - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SERVICE - category = list (DCAT_CIRCUIT) + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/recycler name = "Machine Board (Recycler Board)" desc = "The circuit board for a recycler." id = "recycler" build_path = /obj/item/circuitboard/machine/recycler - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/scanner_gate name = "Machine Board (Scanner Gate)" desc = "The circuit board for a scanner gate." id = "scanner_gate" build_path = /obj/item/circuitboard/machine/scanner_gate - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_MEDICAL + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/holopad name = "Machine Board (AI Holopad Board)" desc = "The circuit board for a holopad." id = "holopad" build_path = /obj/item/circuitboard/machine/holopad - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/autolathe name = "Machine Board (Autolathe Board)" desc = "The circuit board for an autolathe." id = "autolathe" build_path = /obj/item/circuitboard/machine/autolathe - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/recharger name = "Machine Board (Weapon Recharger Board)" @@ -376,48 +340,42 @@ id = "recharger" materials = list(/datum/material/glass = 1000, /datum/material/gold = 2000) build_path = /obj/item/circuitboard/machine/recharger - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/vendor name = "Machine Board (Vendor Board)" desc = "The circuit board for a Vendor." id = "vendor" build_path = /obj/item/circuitboard/machine/vendor - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/ore_redemption name = "Machine Board (Ore Redemption Board)" desc = "The circuit board for an Ore Redemption machine." id = "ore_redemption" build_path = /obj/item/circuitboard/machine/ore_redemption - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/mining_equipment_vendor name = "Machine Board (Mining Rewards Vendor Board)" desc = "The circuit board for a Mining Rewards Vendor." id = "mining_equipment_vendor" build_path = /obj/item/circuitboard/machine/mining_equipment_vendor - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/tesla_coil name = "Machine Board (Tesla Coil Board)" desc = "The circuit board for a tesla coil." id = "tesla_coil" build_path = /obj/item/circuitboard/machine/tesla_coil - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/grounding_rod name = "Machine Board (Grounding Rod Board)" desc = "The circuit board for a grounding rod." id = "grounding_rod" build_path = /obj/item/circuitboard/machine/grounding_rod - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/ntnet_relay name = "Machine Board (NTNet Relay Board)" @@ -425,55 +383,48 @@ id = "ntnet_relay" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/ntnet_relay - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/limbgrower name = "Machine Board (Limb Grower Board)" desc = "The circuit board for a limb grower." id = "limbgrower" build_path = /obj/item/circuitboard/machine/limbgrower - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/harvester name = "Machine Board (Organ Harvester Board)" desc = "The circuit board for an organ harvester." id = "harvester" build_path = /obj/item/circuitboard/machine/harvester - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/deepfryer name = "Machine Board (Deep Fryer)" desc = "The circuit board for a Deep Fryer." id = "deepfryer" build_path = /obj/item/circuitboard/machine/deep_fryer - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/griddle name = "Machine Board (Griddle)" desc = "The circuit board for a Griddle." id = "griddle" build_path = /obj/item/circuitboard/machine/griddle - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/oven name = "Machine Board (Oven)" desc = "The circuit board for a Oven." id = "oven" build_path = /obj/item/circuitboard/machine/oven - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/donksofttoyvendor name = "Machine Board (Donksoft Toy Vendor Board)" desc = "The circuit board for a Donksoft Toy Vendor." id = "donksofttoyvendor" build_path = /obj/item/circuitboard/machine/vending/donksofttoyvendor - category = list (DCAT_CIRCUIT) /datum/design/board/cell_charger @@ -481,56 +432,49 @@ desc = "The circuit board for a cell charger." id = "cell_charger" build_path = /obj/item/circuitboard/machine/cell_charger - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/dish_drive name = "Machine Board (Dish Drive)" desc = "The circuit board for a dish drive." id = "dish_drive" build_path = /obj/item/circuitboard/machine/dish_drive - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/stacking_unit_console name = "Machine Board (Stacking Machine Console)" desc = "The circuit board for a Stacking Machine Console." id = "stack_console" build_path = /obj/item/circuitboard/machine/stacking_unit_console - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY | DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/stacking_machine name = "Machine Board (Stacking Machine)" desc = "The circuit board for a Stacking Machine." id = "stack_machine" build_path = /obj/item/circuitboard/machine/stacking_machine - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY | DESIGN_FAB_ENGINEERING + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/ore_silo name = "Machine Board (Ore Silo)" desc = "The circuit board for an ore silo." id = "ore_silo" build_path = /obj/item/circuitboard/machine/ore_silo - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/fat_sucker name = "Machine Board (Lipid Extractor)" desc = "The circuit board for a lipid extractor." id = "fat_sucker" build_path = /obj/item/circuitboard/machine/fat_sucker - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/stasis name = "Machine Board (Lifeform Stasis Unit)" desc = "The circuit board for a stasis unit." id = "stasis" build_path = /obj/item/circuitboard/machine/stasis - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/spaceship_navigation_beacon name = "Machine Board (Bluespace Navigation Gigabeacon)" @@ -538,103 +482,67 @@ id = "spaceship_navigation_beacon" build_type = IMPRINTER build_path = /obj/item/circuitboard/machine/spaceship_navigation_beacon - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_ENGINEERING | DESIGN_FAB_OMNI - -/datum/design/board/medical_kiosk - name = "Machine Board (Medical Kiosk)" - desc = "The circuit board for a Medical Kiosk." - id = "medical_kiosk" - build_path = /obj/item/circuitboard/machine/medical_kiosk - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/medipen_refiller name = "Machine Board (Medipen Refiller)" desc = "The circuit board for a Medipen Refiller." id = "medipen_refiller" build_path = /obj/item/circuitboard/machine/medipen_refiller - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI - -/datum/design/board/plumbing_receiver - name = "Machine Board (Chemical Recipient)" - desc = "The circuit board for a Chemical Recipient." - id = "plumbing_receiver" - build_path = /obj/item/circuitboard/machine/plumbing_receiver - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI - + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/sheetifier name = "Machine Board (Sheet-meister 2000)" desc = "The circuit board for a Sheet-meister 2000." id = "sheetifier" build_path = /obj/item/circuitboard/machine/sheetifier - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI - + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/restaurant_portal name = "Machine Board (Restaurant Portal)" desc = "The circuit board for a restaurant portal" id = "restaurant_portal" build_path = /obj/item/circuitboard/machine/restaurant_portal - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/vendatray name = "Machine Board (Vend-a-Tray)" desc = "The circuit board for a Vend-a-Tray." id = "vendatray" build_path = /obj/item/circuitboard/machine/vendatray - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI | DESIGN_FAB_SUPPLY - -/datum/design/board/bountypad - name = "Machine Board (Civilian Bounty Pad)" - desc = "The circuit board for a Civilian Bounty Pad." - id = "bounty_pad" - build_path = /obj/item/circuitboard/machine/bountypad - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/skill_station name = "Machine Board (Skill station)" desc = "The circuit board for Skill station." id = "skill_station" build_path = /obj/item/circuitboard/machine/skill_station - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/exoscanner name = "Machine Board (Scanner Array)" desc = "The circuit board for scanner array." id = "exoscanner" build_path = /obj/item/circuitboard/machine/exoscanner - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SUPPLY + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/exodrone_launcher name = "Machine Board (Exploration Drone Launcher)" desc = "The circuit board for exodrone launcher." id = "exodrone_launcher" build_path = /obj/item/circuitboard/machine/exodrone_launcher - category = list (DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/component_printer name = "Machine Board (Component Printer)" desc = "The circuit board for a component printer" id = "component_printer" build_path = /obj/item/circuitboard/machine/component_printer - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER /datum/design/board/module_printer name = "Machine Board (Module Duplicator)" desc = "The circuit board for a module duplicator" id = "module_duplicator" build_path = /obj/item/circuitboard/machine/module_duplicator - category = list(DCAT_CIRCUIT) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = DESIGN_IMPRINTER diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm index 01ecbd2a50ba..595feb1e5f4e 100644 --- a/code/modules/research/designs/mecha_designs.dm +++ b/code/modules/research/designs/mecha_designs.dm @@ -8,7 +8,7 @@ id = "ripley_main" build_path = /obj/item/circuitboard/mecha/ripley/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/ripley_peri name = "APLU \"Ripley\" Peripherals Control module" @@ -16,7 +16,7 @@ id = "ripley_peri" build_path = /obj/item/circuitboard/mecha/ripley/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/odysseus_main name = "\"Odysseus\" Central Control module" @@ -24,7 +24,7 @@ id = "odysseus_main" build_path = /obj/item/circuitboard/mecha/odysseus/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/odysseus_peri name = "\"Odysseus\" Peripherals Control module" @@ -32,7 +32,7 @@ id = "odysseus_peri" build_path = /obj/item/circuitboard/mecha/odysseus/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/gygax_main name = "\"Gygax\" Central Control module" @@ -40,7 +40,7 @@ id = "gygax_main" build_path = /obj/item/circuitboard/mecha/gygax/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/gygax_peri name = "\"Gygax\" Peripherals Control module" @@ -48,7 +48,7 @@ id = "gygax_peri" build_path = /obj/item/circuitboard/mecha/gygax/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/gygax_targ name = "\"Gygax\" Weapons & Targeting Control module" @@ -56,7 +56,7 @@ id = "gygax_targ" build_path = /obj/item/circuitboard/mecha/gygax/targeting category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/durand_main name = "\"Durand\" Central Control module" @@ -64,7 +64,7 @@ id = "durand_main" build_path = /obj/item/circuitboard/mecha/durand/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/durand_peri name = "\"Durand\" Peripherals Control module" @@ -72,7 +72,7 @@ id = "durand_peri" build_path = /obj/item/circuitboard/mecha/durand/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/durand_targ name = "\"Durand\" Weapons & Targeting Control module" @@ -80,7 +80,7 @@ id = "durand_targ" build_path = /obj/item/circuitboard/mecha/durand/targeting category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/honker_main name = "\"H.O.N.K\" Central Control module" @@ -88,7 +88,7 @@ id = "honker_main" build_path = /obj/item/circuitboard/mecha/honker/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/honker_peri name = "\"H.O.N.K\" Peripherals Control module" @@ -96,7 +96,7 @@ id = "honker_peri" build_path = /obj/item/circuitboard/mecha/honker/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/honker_targ name = "\"H.O.N.K\" Weapons & Targeting Control module" @@ -104,7 +104,7 @@ id = "honker_targ" build_path = /obj/item/circuitboard/mecha/honker/targeting category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/phazon_main name = "\"Phazon\" Central Control module" @@ -113,7 +113,7 @@ materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) build_path = /obj/item/circuitboard/mecha/phazon/main category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/phazon_peri name = "\"Phazon\" Peripherals Control module" @@ -122,7 +122,7 @@ materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) build_path = /obj/item/circuitboard/mecha/phazon/peripherals category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/phazon_targ name = "\"Phazon\" Weapons & Targeting Control module" @@ -131,7 +131,7 @@ materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 100) build_path = /obj/item/circuitboard/mecha/phazon/targeting category = list(DCAT_EXOSUIT_MOD) - mapload_design_flags = DESIGN_FAB_OMNI + mapload_design_flags = NONE /datum/design/board/clarke_main name = "\"Clarke\" Central Control module" @@ -245,6 +245,7 @@ materials = list(/datum/material/iron=10000) construction_time = 100 category = list(DCAT_MECHA_OBJ) + mapload_design_flags = DESIGN_FAB_ROBOTICS /datum/design/mech_laser_heavy name = "Exosuit Weapon (CH-LC \"Solaris\" Laser Cannon)" @@ -255,6 +256,7 @@ materials = list(/datum/material/iron=10000) construction_time = 100 category = list(DCAT_MECHA_OBJ) + mapload_design_flags = DESIGN_FAB_ROBOTICS /datum/design/mech_disabler name = "Exosuit Weapon (CH-DS \"Peacemaker\" Disabler)" @@ -397,6 +399,7 @@ materials = list(/datum/material/iron=20000,/datum/material/silver=5000) construction_time = 100 category = list(DCAT_MECHA_OBJ) + mapload_design_flags = DESIGN_FAB_ROBOTICS /datum/design/mech_proj_armor name = "Exosuit Module (Reflective Armor Booster Module)" @@ -407,6 +410,7 @@ materials = list(/datum/material/iron=20000,/datum/material/gold=5000) construction_time = 100 category = list(DCAT_MECHA_OBJ) + mapload_design_flags = DESIGN_FAB_ROBOTICS /datum/design/mech_diamond_drill name = "Exosuit Mining (Diamond Mining Drill)" @@ -430,17 +434,6 @@ category = list(DCAT_MECHA_OBJ) mapload_design_flags = DESIGN_FAB_ROBOTICS -/datum/design/mecha_kineticgun - name = "Exosuit Mining (Proto-kinetic Accelerator)" - desc = "An exosuit-mounted mining tool that does increased damage in low pressure. Drawing from an onboard power source allows it to project further than the handheld version." - id = "mecha_kineticgun" - build_type = MECHFAB - build_path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun - materials = list(/datum/material/iron = 8000, /datum/material/glass = 1000) - construction_time = 100 - category = list(DCAT_MECHA_OBJ) - mapload_design_flags = DESIGN_FAB_ROBOTICS - /datum/design/mech_lmg name = "Exosuit Weapon (\"Ultra AC 2\" LMG)" desc = "A weapon for combat exosuits. Shoots a rapid, three shot burst." diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index df9a84cf1aff..baeba7681fdb 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -69,6 +69,68 @@ category = list(DCAT_CYBORG) mapload_design_flags = DESIGN_FAB_ROBOTICS +//Teshari Augs +/datum/design/teshari_chest + name = "Prototype Teshari Torso" + id = "teshari_borg_chest" + build_type = MECHFAB + build_path = /obj/item/bodypart/chest/robot/surplus/teshari + materials = list(/datum/material/iron=40000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + + +/datum/design/teshari_head + name = "Prototype Teshari Head" + id = "teshari_borg_head" + build_type = MECHFAB + build_path = /obj/item/bodypart/head/robot/surplus/teshari + materials = list(/datum/material/iron=5000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + +/datum/design/teshari_r_arm + name = "Prototype Teshari Right Arm" + id = "teshari_borg_r_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/right/robot/surplus/teshari + materials = list(/datum/material/iron=10000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + +/datum/design/teshari_l_arm + name = "Prototype Teshari Left Arm" + id = "teshari_borg_l_arm" + build_type = MECHFAB + build_path = /obj/item/bodypart/arm/left/robot/surplus/teshari + materials = list(/datum/material/iron=10000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + +/datum/design/teshari_l_leg + name = "Prototype Teshari Left Leg" + id = "teshari_borg_l_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/left/robot/surplus/teshari + materials = list(/datum/material/iron=10000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + +/datum/design/teshari_r_leg + name = "Prototype Teshari Right Leg" + id = "teshari_borg_r_leg" + build_type = MECHFAB + build_path = /obj/item/bodypart/leg/right/robot/surplus/teshari + materials = list(/datum/material/iron=10000) + construction_time = 350 + category = list(DCAT_CYBORG) + mapload_design_flags = DESIGN_FAB_ROBOTICS + //Ripley /datum/design/ripley_chassis name = "Exosuit Chassis (APLU \"Ripley\")" @@ -915,16 +977,6 @@ category = list(DCAT_SILICON) mapload_design_flags = DESIGN_FAB_ROBOTICS -/datum/design/borg_upgrade_surgicalprocessor - name = "Cyborg Upgrade (Surgical Processor)" - id = "borg_upgrade_surgicalprocessor" - build_type = MECHFAB - build_path = /obj/item/borg/upgrade/processor - materials = list(/datum/material/iron = 5000, /datum/material/glass = 4000, /datum/material/silver = 4000) - construction_time = 40 - category = list(DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_ROBOTICS - /datum/design/borg_upgrade_trashofholding name = "Cyborg Upgrade (Trash Bag of Holding)" id = "borg_upgrade_trashofholding" @@ -1197,18 +1249,6 @@ var/obj/item/mod/module/module = build_path desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity." -/datum/design/module/mod_storage - name = "MOD Module: Storage" - id = "mod_storage" - materials = list(/datum/material/iron = 2500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/storage - -/datum/design/module/mod_storage_expanded - name = "MOD Module: Expanded Storage" - id = "mod_storage_expanded" - materials = list(/datum/material/iron = 5000, /datum/material/uranium = 2000) - build_path = /obj/item/mod/module/storage/large_capacity - /datum/design/module/mod_visor_medhud name = "MOD Module: Medical Visor" id = "mod_visor_medhud" @@ -1431,12 +1471,6 @@ materials = list(/datum/material/plasma = 1000, /datum/material/glass = 1000) build_path = /obj/item/mod/module/plasma_stabilizer -/datum/design/module/mod_glove_translator - name = "MOD Module: Glove Translator" - id = "mod_sign_radio" - materials = list(/datum/material/iron = 750, /datum/material/glass = 500) - build_path = /obj/item/mod/module/signlang_radio - /datum/design/module/mister_atmos name = "MOD Module: Resin Mister" id = "mod_mister_atmos" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 38067a5a4fcd..c7c774704c83 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -29,7 +29,7 @@ build_type = FABRICATOR | MECHFAB materials = list(/datum/material/iron = 1700, /datum/material/glass = 1350, /datum/material/gold = 500) //Gold, because SWAG. construction_time = 75 - build_path = /obj/item/mmi/posibrain + build_path = /obj/item/organ/posibrain category = list(DCAT_SILICON) mapload_design_flags = DESIGN_FAB_OMNI @@ -61,15 +61,6 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI -/datum/design/ph_meter - name = "Chemical Analyzer" - id = "ph_meter" - build_type = FABRICATOR - materials = list(/datum/material/glass = 2500, /datum/material/gold = 1000, /datum/material/titanium = 1000) - build_path = /obj/item/ph_meter - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI - /datum/design/dna_disk name = "Genetic Data Disk" desc = "Produce additional disks for storing genetic data." @@ -140,16 +131,6 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI -/datum/design/healthanalyzer_advanced - name = "Advanced Health Analyzer" - desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy." - id = "healthanalyzer_advanced" - build_path = /obj/item/healthanalyzer/advanced - build_type = FABRICATOR - materials = list(/datum/material/iron = 5000, /datum/material/glass = 2500, /datum/material/silver = 2000, /datum/material/gold = 1500) - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI - /datum/design/medigel name = "Medical Gel" desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap." @@ -160,15 +141,6 @@ category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI -/datum/design/surgical_drapes - name = "Surgical Drapes" - id = "surgical_drapes" - build_type = FABRICATOR - materials = list(/datum/material/plastic = 2000) - build_path = /obj/item/surgical_drapes - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI - /datum/design/laserscalpel name = "Laser Scalpel" desc = "A laser scalpel used for precise cutting." @@ -224,12 +196,39 @@ desc = "Is used to contain blood used for transfusion. Must be attached to an IV drip." id = "blood_pack" build_type = FABRICATOR - mapload_design_flags = DESIGN_FAB_MEDICAL materials = list(/datum/material/plastic = 1000) build_path = /obj/item/reagent_containers/blood category = list(DCAT_MEDICAL) mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI +/datum/design/blood_pack + name = "Bone Gel" + desc = "Used to mend bone fractures." + id = "bone_gel" + build_type = FABRICATOR + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/medical/bone_gel + category = list(DCAT_MEDICAL) + mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + +/datum/design/sticky_tape/surgical + name = "Surgical Tape" + id = "surgical_tape" + build_type = FABRICATOR + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/sticky_tape/surgical + category = list(DCAT_MEDICAL) + mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + +/datum/design/suture + name = "Sutures" + id = "suture" + build_type = FABRICATOR + materials = list(/datum/material/plastic = 500) + build_path = /obj/item/stack/medical/suture + category = list(DCAT_MEDICAL) + mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI + ///////////////////////////////////////// //////////Cybernetic Implants//////////// ///////////////////////////////////////// @@ -569,82 +568,3 @@ desc = "A pair of cybernetic eyes." id = "cybernetic_eyes_improved" build_path = /obj/item/organ/eyes/robotic - -///////////////////// -///Surgery Designs/// -///////////////////// - -/datum/design/surgery - name = "Surgery Design" - desc = "what" - id = "surgery_parent" - research_icon = 'icons/obj/surgery.dmi' - research_icon_state = "surgery_any" - var/surgery - -/datum/design/surgery/lobotomy - name = "Lobotomy" - desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." - id = "surgery_lobotomy" - surgery = /datum/surgery/advanced/lobotomy - research_icon_state = "surgery_head" - -/datum/design/surgery/viral_bonding - name = "Viral Bonding" - desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. The patient must be dosed with spaceacillin, virus food, and formaldehyde." - id = "surgery_viral_bond" - surgery = /datum/surgery/advanced/viral_bonding - research_icon_state = "surgery_chest" - -/datum/design/surgery/healing //PLEASE ACCOUNT FOR UNIQUE HEALING BRANCHES IN THE hptech HREF (currently 2 for Brute/Burn; Combo is bonus) - name = "Tend Wounds" - desc = "An upgraded version of the original surgery." - id = "surgery_healing_base" //holder because CI cries otherwise. Not used in techweb unlocks. - surgery = /datum/surgery/healing - research_icon_state = "surgery_chest" - -/datum/design/surgery/healing/brute_upgrade - name = "Tend Wounds (Brute) Upgrade" - surgery = /datum/surgery/healing/brute/upgraded - id = "surgery_heal_brute_upgrade" - -/datum/design/surgery/healing/burn_upgrade - name = "Tend Wounds (Burn) Upgrade" - surgery = /datum/surgery/healing/burn/upgraded - id = "surgery_heal_burn_upgrade" - -/datum/design/surgery/healing/combo - name = "Tend Wounds (Physical)" - desc = "A surgical procedure that repairs both bruises and burns. Repair efficiency is not as high as the individual surgeries but it is faster." - surgery = /datum/surgery/healing/combo - id = "surgery_heal_combo" - -/datum/design/surgery/brainwashing // This is a traitor item - name = "Brainwashing" - desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." - id = "surgery_brainwashing" - surgery = /datum/surgery/advanced/brainwashing - research_icon_state = "surgery_head" - -/datum/design/surgery/necrotic_revival // While romerol is a thing, this HAS to exist. - name = "Necrotic Revival" - desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone." - id = "surgery_zombie" - surgery = /datum/surgery/advanced/necrotic_revival - research_icon_state = "surgery_head" - -/datum/design/surgery/wing_reconstruction - name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of moths. Requires Synthflesh." - id = "surgery_wing_reconstruction" - surgery = /datum/surgery/advanced/wing_reconstruction - research_icon_state = "surgery_chest" - -/datum/design/sticky_tape/surgical - name = "Surgical Tape" - id = "surgical_tape" - build_type = FABRICATOR - materials = list(/datum/material/plastic = 500) - build_path = /obj/item/stack/sticky_tape/surgical - category = list(DCAT_MEDICAL) - mapload_design_flags = DESIGN_FAB_MEDICAL | DESIGN_FAB_OMNI diff --git a/code/modules/research/designs/mining_designs.dm b/code/modules/research/designs/mining_designs.dm index 85e6d238a088..3b35f26d6953 100644 --- a/code/modules/research/designs/mining_designs.dm +++ b/code/modules/research/designs/mining_designs.dm @@ -2,15 +2,13 @@ ///////////////////////////////////////// /////////////////Mining////////////////// ///////////////////////////////////////// -/datum/design/cargo_express +/datum/design/board/cargo_express name = "Computer Design (Express Supply Console)"//shes beautiful desc = "Allows for the construction of circuit boards used to build an Express Supply Console."//who? id = "cargoexpress"//the coder reading this build_type = IMPRINTER materials = list(/datum/material/glass = 1000) build_path = /obj/item/circuitboard/computer/cargo/express - category = list(DCAT_MINING) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI /datum/design/bluespace_pod name = "Supply Drop Pod Upgrade Disk" @@ -81,53 +79,3 @@ build_path = /obj/item/resonator/upgraded category = list(DCAT_MINING) mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI - -/datum/design/trigger_guard_mod - name = "Kinetic Accelerator Trigger Guard Mod" - desc = "A device which allows kinetic accelerators to be wielded by any organism." - id = "triggermod" - build_type = FABRICATOR - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500, /datum/material/gold = 1500, /datum/material/uranium = 1000) - build_path = /obj/item/borg/upgrade/modkit/trigger_guard - category = list(DCAT_MINING) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI - -/datum/design/damage_mod - name = "Kinetic Accelerator Damage Mod" - desc = "A device which allows kinetic accelerators to deal more damage." - id = "damagemod" - build_type = FABRICATOR | MECHFAB - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500, /datum/material/gold = 1500, /datum/material/uranium = 1000) - build_path = /obj/item/borg/upgrade/modkit/damage - category = list(DCAT_MINING, DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI - -/datum/design/cooldown_mod - name = "Kinetic Accelerator Cooldown Mod" - desc = "A device which decreases the cooldown of a Kinetic Accelerator." - id = "cooldownmod" - build_type = FABRICATOR | MECHFAB - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500, /datum/material/gold = 1500, /datum/material/uranium = 1000) - build_path = /obj/item/borg/upgrade/modkit/cooldown - category = list(DCAT_MINING, DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI - -/datum/design/range_mod - name = "Kinetic Accelerator Range Mod" - desc = "A device which allows kinetic accelerators to fire at a further range." - id = "rangemod" - build_type = FABRICATOR | MECHFAB - materials = list(/datum/material/iron = 2000, /datum/material/glass = 1500, /datum/material/gold = 1500, /datum/material/uranium = 1000) - build_path = /obj/item/borg/upgrade/modkit/range - category = list(DCAT_MINING, DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI - -/datum/design/hyperaccelerator - name = "Kinetic Accelerator Mining AoE Mod" - desc = "A modification kit for Kinetic Accelerators which causes it to fire AoE blasts that destroy rock." - id = "hypermod" - build_type = FABRICATOR | MECHFAB - materials = list(/datum/material/iron = 8000, /datum/material/glass = 1500, /datum/material/silver = 2000, /datum/material/gold = 2000, /datum/material/diamond = 2000) - build_path = /obj/item/borg/upgrade/modkit/aoe/turfs - category = list(DCAT_MINING, DCAT_SILICON) - mapload_design_flags = DESIGN_FAB_SUPPLY | DESIGN_FAB_OMNI diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 95bca9ee0683..cc1788642414 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -403,23 +403,13 @@ category = list(DCAT_SECURITY) mapload_design_flags = DESIGN_FAB_SECURITY -/datum/design/detective_scanner - name = "Forensic Scanner" - desc = "Used to remotely scan objects and biomass for DNA and fingerprints. Can print a report of the findings." - id = "detective_scanner" - build_type = FABRICATOR - materials = list(/datum/material/iron = 5000, /datum/material/glass = 1000, /datum/material/gold = 2500, /datum/material/silver = 2000) - build_path = /obj/item/detective_scanner - category = list(DCAT_FORENSICS) - mapload_design_flags = DESIGN_FAB_SECURITY - /datum/design/evidencebag name = "Evidence Bag" desc = "An empty evidence bag." id = "evidencebag" build_type = FABRICATOR materials = list(/datum/material/plastic = 100) - build_path = /obj/item/evidencebag + build_path = /obj/item/storage/evidencebag category = list(DCAT_FORENSICS) mapload_design_flags = DESIGN_FAB_SECURITY @@ -474,3 +464,17 @@ build_path = /obj/item/plate/oven_tray category = list(DCAT_DINNERWARE) mapload_design_flags = DESIGN_FAB_SERVICE + +///////////////////////////////////////// +////////////////Data Terminal//////////// +///////////////////////////////////////// + +/datum/design/data_terminal + name = "Data Terminal" + desc = "A floor-mountable data terminal for powerline networks." + id = "data_terminal" + build_type = FABRICATOR + materials = list(/datum/material/iron = 500) + build_path = /obj/item/data_terminal_construct + category = list(DCAT_ASSEMBLY, DCAT_RADIO) + mapload_design_flags = DESIGN_FAB_ENGINEERING diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index 396d8c7ca4ea..8103572a76e0 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -70,13 +70,10 @@ desc = "The circuit board that for a PACMAN-type portable generator." id = "pacman" build_path = /obj/item/circuitboard/machine/pacman - category = list(DCAT_POWER) - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/pacman/super name = "Machine Board (SUPERPACMAN-type Generator Board)" desc = "The circuit board that for a SUPERPACMAN-type portable generator." id = "superpacman" build_path = /obj/item/circuitboard/machine/pacman/super - mapload_design_flags = DESIGN_FAB_ENGINEERING diff --git a/code/modules/research/designs/telecomms_designs.dm b/code/modules/research/designs/telecomms_designs.dm index e775a65600b4..35f173da4342 100644 --- a/code/modules/research/designs/telecomms_designs.dm +++ b/code/modules/research/designs/telecomms_designs.dm @@ -7,42 +7,36 @@ desc = "Allows for the construction of Subspace Receiver equipment." id = "s-receiver" build_path = /obj/item/circuitboard/machine/telecomms/receiver - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_bus name = "Machine Board (Bus Mainframe)" desc = "Allows for the construction of Telecommunications Bus Mainframes." id = "s-bus" build_path = /obj/item/circuitboard/machine/telecomms/bus - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_hub name = "Machine Board (Hub Mainframe)" desc = "Allows for the construction of Telecommunications Hub Mainframes." id = "s-hub" build_path = /obj/item/circuitboard/machine/telecomms/hub - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_relay name = "Machine Board (Relay Mainframe)" desc = "Allows for the construction of Telecommunications Relay Mainframes." id = "s-relay" build_path = /obj/item/circuitboard/machine/telecomms/relay - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_processor name = "Machine Board (Processor Unit)" desc = "Allows for the construction of Telecommunications Processor equipment." id = "s-processor" build_path = /obj/item/circuitboard/machine/telecomms/processor - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_server name = "Machine Board (Server Mainframe)" desc = "Allows for the construction of Telecommunications Servers." id = "s-server" build_path = /obj/item/circuitboard/machine/telecomms/server - mapload_design_flags = DESIGN_FAB_ENGINEERING /datum/design/board/telecomms_messaging name = "Machine Board (Messaging Server)" @@ -56,4 +50,3 @@ desc = "Allows for the construction of Subspace Broadcasting equipment." id = "s-broadcaster" build_path = /obj/item/circuitboard/machine/telecomms/broadcaster - mapload_design_flags = DESIGN_FAB_ENGINEERING diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 406e3dd02deb..be5c51eaf1f8 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -52,15 +52,6 @@ category = list(DCAT_BOTANICAL) mapload_design_flags = DESIGN_FAB_SERVICE | DESIGN_FAB_OMNI -/datum/design/biopsy_tool - name = "Biopsy Tool" - id = "biopsy_tool" - build_type = FABRICATOR - materials = list(/datum/material/iron = 4000, /datum/material/glass = 3000) - build_path = /obj/item/biopsy_tool - category = list(DCAT_MISC_TOOL) - mapload_design_flags = DESIGN_FAB_OMNI - /datum/design/wirebrush name = "Wirebrush" desc = "A tool to remove rust from walls." diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1f796569f752..8110a5e4adac 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -16,26 +16,6 @@ category = list(DCAT_AMMO) mapload_design_flags = DESIGN_FAB_SECURITY -/datum/design/pin_testing - name = "Test-Range Firing Pin" - desc = "This safety firing pin allows firearms to be operated within proximity to a firing range." - id = "pin_testing" - build_type = FABRICATOR - materials = list(/datum/material/iron = 500, /datum/material/glass = 300) - build_path = /obj/item/firing_pin/test_range - category = list("Firing Pins") - mapload_design_flags = DESIGN_FAB_SECURITY - -/datum/design/pin_mindshield - name = "Mindshield Firing Pin" - desc = "This is a security firing pin which only authorizes users who are mindshield-implanted." - id = "pin_loyalty" - build_type = FABRICATOR - materials = list(/datum/material/silver = 600, /datum/material/diamond = 600, /datum/material/uranium = 200) - build_path = /obj/item/firing_pin/implant/mindshield - category = list("Firing Pins") - mapload_design_flags = DESIGN_FAB_SECURITY - /datum/design/stunrevolver name = "Tesla Cannon Part Kit" desc = "The kit for a high-tech cannon that fires internal, reusable bolt cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 384bafee456f..4ae96e9a1b21 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -218,11 +218,6 @@ id = "comp_split" build_path = /obj/item/circuit_component/split -/datum/design/component/pull - name = "Pull Component" - id = "comp_pull" - build_path = /obj/item/circuit_component/pull - /datum/design/component/soundemitter name = "Sound Emitter Component" id = "comp_soundemitter" @@ -303,16 +298,6 @@ id = "comp_module" build_path = /obj/item/circuit_component/module -/datum/design/component/ntnet_receive - name = "NTNet Receiver" - id = "comp_ntnet_receive" - build_path = /obj/item/circuit_component/ntnet_receive - -/datum/design/component/ntnet_send - name = "NTNet Transmitter" - id = "comp_ntnet_send" - build_path = /obj/item/circuit_component/ntnet_send - /datum/design/component/list_literal name = "List Literal Component" id = "comp_list_literal" diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 11c69f726a0a..c7d4aa7f2ed0 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -1,3 +1,8 @@ +#define MODE_QUEUE 1 +#define MODE_BUILD 0 +#define MAX_QUEUE_LEN 5 + +DEFINE_INTERACTABLE(/obj/machinery/rnd/production) /obj/machinery/rnd/production name = "technology fabricator" desc = "Makes researched and prototype items with materials and energy." @@ -21,8 +26,14 @@ /// What color is this machine's stripe? Leave null to not have a stripe. var/stripe_color = null + /// The queue of things to produce. It's a list of lists. + var/list/queue + /// A queue packet we are processing + var/list/processing_packet + /obj/machinery/rnd/production/Initialize(mapload) . = ..() + queue = list() selected_disk = internal_disk create_reagents(0, OPENCONTAINER) matching_designs = list() @@ -73,16 +84,109 @@ reagents.trans_to(G, G.reagents.maximum_volume) return ..() -/obj/machinery/rnd/production/proc/do_print(path, amount, list/matlist, notify_admins) +/obj/machinery/rnd/production/proc/add_to_queue(datum/design/D, amount, notify_admins) + if(length(queue) >= MAX_QUEUE_LEN) + say("The build queue is full.") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return + + queue += list(list(D, amount)) + if(notify_admins) - investigate_log("[key_name(usr)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) - message_admins("[ADMIN_LOOKUPFLW(usr)] has built [amount] of [path] at \a [src]([type]).") + investigate_log("[key_name(usr)] queued [amount] of [D.build_path] at [src]([type]).", INVESTIGATE_RESEARCH) + message_admins("[ADMIN_LOOKUPFLW(usr)] has queued [amount] of [D.build_path] at \a [src]([type]).") + + if(!busy) + run_queue() + +/obj/machinery/rnd/production/proc/run_queue() + set waitfor = FALSE + if(busy) + return + busy = TRUE + + update_appearance(UPDATE_OVERLAYS) + while(length(queue)) + var/list/queue_packet = queue[1] + queue -= list(queue_packet) + processing_packet = queue_packet + updateUsrDialog() + do_print(queue_packet[1], queue_packet[2]) + + processing_packet = null + busy = FALSE + update_appearance(UPDATE_OVERLAYS) + updateUsrDialog() + +/obj/machinery/rnd/production/proc/do_print(datum/design/D, amount) + if(!can_build_design(D, amount)) + return FALSE + + var/atom/path = D.build_path + + var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1 + var/list/efficient_mats = list() + for(var/MAT in D.materials) + efficient_mats[MAT] = D.materials[MAT]/coeff + + var/power = active_power_usage + amount = clamp(amount, 1, 50) + + for(var/M in D.materials) + power += round(D.materials[M] * amount / 35) + + power = min(active_power_usage, power) + use_power(power) + + materials.mat_container.use_materials(efficient_mats, amount) + materials.silo_log(src, "built", -amount, "[D.name]", efficient_mats) + + for(var/R in D.reagents_list) + reagents.remove_reagent(R, D.reagents_list[R]*amount/coeff) + + var/time = (((D.construction_time || 2 SECONDS) / efficiency_coeff) * amount) ** 0.8 + if(!do_after(src, src, time, IGNORE_USER_LOC_CHANGE)) + return FALSE + for(var/i in 1 to amount) new path(get_turf(src)) + SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) - busy = FALSE playsound(src, 'goon/sounds/chime.ogg', 50, FALSE, ignore_walls = FALSE) - update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/rnd/production/proc/can_build_design(datum/design/D, amount) + var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1 + var/list/efficient_mats = list() + for(var/MAT in D.materials) + efficient_mats[MAT] = D.materials[MAT]/coeff + + if(!materials.mat_container.has_materials(efficient_mats, amount)) + say("Not enough materials to complete object[amount > 1? "s" : ""].") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return FALSE + + for(var/R in D.reagents_list) + if(!reagents.has_reagent(R, D.reagents_list[R]*amount/coeff)) + say("Not enough reagents to complete object[amount > 1? "s" : ""].") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return FALSE + + if(D.build_type && !(D.build_type & allowed_buildtypes)) + say("This machine does not have the necessary manipulation systems for this design. Please contact Ananke Support!") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return FALSE + + if(!materials.mat_container) + say("No connection to material storage, please contact the quartermaster.") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return FALSE + + if(materials.on_hold()) + say("Mineral access is on hold, please contact the quartermaster.") + playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + return FALSE + + return TRUE /** * Returns how many times over the given material requirement for the given design is satisfied. @@ -139,41 +243,10 @@ return FALSE if(!(D in internal_disk.read(DATA_IDX_DESIGNS))) CRASH("Tried to print a design we don't have! Potential exploit?") - if(D.build_type && !(D.build_type & allowed_buildtypes)) - say("This machine does not have the necessary manipulation systems for this design. Please contact Nanotrasen Support!") - return FALSE - if(!materials.mat_container) - say("No connection to material storage, please contact the quartermaster.") - return FALSE - if(materials.on_hold()) - say("Mineral access is on hold, please contact the quartermaster.") - return FALSE - var/power = active_power_usage - amount = clamp(amount, 1, 50) - for(var/M in D.materials) - power += round(D.materials[M] * amount / 35) - power = min(active_power_usage, power) - use_power(power) - var/coeff = efficient_with(D.build_path) ? efficiency_coeff : 1 - var/list/efficient_mats = list() - for(var/MAT in D.materials) - efficient_mats[MAT] = D.materials[MAT]/coeff - if(!materials.mat_container.has_materials(efficient_mats, amount)) - say("Not enough materials to complete object[amount > 1? "s" : ""].") - return FALSE - for(var/R in D.reagents_list) - if(!reagents.has_reagent(R, D.reagents_list[R]*amount/coeff)) - say("Not enough reagents to complete object[amount > 1? "s" : ""].") - return FALSE - materials.mat_container.use_materials(efficient_mats, amount) - materials.silo_log(src, "built", -amount, "[D.name]", efficient_mats) - for(var/R in D.reagents_list) - reagents.remove_reagent(R, D.reagents_list[R]*amount/coeff) - busy = TRUE - playsound(src, 'goon/sounds/button.ogg') + + playsound(src, 'goon/sounds/button.ogg', 100) update_appearance(UPDATE_OVERLAYS) - var/timecoeff = D.construction_time * efficiency_coeff - addtimer(CALLBACK(src, PROC_REF(do_print), D.build_path, amount, efficient_mats, D.dangerous_construction), (32 * timecoeff * amount) ** 0.8) + add_to_queue(D, amount, D.dangerous_construction) return TRUE /obj/machinery/rnd/production/proc/search(string) @@ -198,6 +271,8 @@ ui += ui_screen_category_view() if(FABRICATOR_SCREEN_MODIFY_MEMORY) ui += ui_screen_modify_memory() + if(FABRICATOR_SCREEN_QUEUE) + ui += ui_screen_queue() else ui += ui_screen_main() for(var/i in 1 to length(ui)) @@ -215,7 +290,8 @@ l += "No material storage connected, please contact the quartermaster." l += "Chemical volume: [reagents.total_volume] / [reagents.maximum_volume]" l += "Manage Data" - l += "Main Screen[RDSCREEN_NOBREAK]" + l += "Main Screen
" + l += "View Queue[RDSCREEN_NOBREAK]" return l /obj/machinery/rnd/production/proc/ui_screen_materials() @@ -278,9 +354,9 @@ temp_material += " | " if (enough_mats < 1) - temp_material += "[cached_mats[material]/coeff] [SSmaterials.CallMaterialName(material)]" + temp_material += "[cached_mats[material]/coeff] [SSmaterials.GetMaterialName(material)]" else - temp_material += " [cached_mats[material]/coeff] [SSmaterials.CallMaterialName(material)]" + temp_material += " [cached_mats[material]/coeff] [SSmaterials.GetMaterialName(material)]" var/list/cached_reagents = D.reagents_list for(var/reagent in cached_reagents) @@ -289,9 +365,9 @@ temp_material += " | " if (enough_chems < 1) - temp_material += "[cached_reagents[reagent]/coeff] [SSmaterials.CallMaterialName(reagent)]" + temp_material += "[cached_reagents[reagent]/coeff] [SSmaterials.GetMaterialName(reagent)]" else - temp_material += " [cached_reagents[reagent]/coeff] [SSmaterials.CallMaterialName(reagent)]" + temp_material += " [cached_reagents[reagent]/coeff] [SSmaterials.GetMaterialName(reagent)]" if (max_production >= 1) entry_text += "[D.name][RDSCREEN_NOBREAK]" @@ -313,11 +389,12 @@ screen = text2num(ls["switch_screen"]) if(ls["build"]) //Causes the Protolathe to build something. - if(busy) - say("Warning: Fabricators busy!") - else - if(!user_try_print_id(ls["build"], ls["amount"])) - playsound(src, 'sound/machines/buzz-two.ogg', 50, FALSE) + user_try_print_id(ls["build"], ls["amount"]) + + if(ls["dequeue"]) + var/index = text2num(ls["dequeue"]) + if(!isnull(index)) + queue -= list(queue[index]) if(ls["search"]) //Search for designs with name matching pattern search(ls["to_search"]) @@ -438,6 +515,31 @@ l += "[RDSCREEN_NOBREAK]" return l +/obj/machinery/rnd/production/proc/ui_screen_queue() + var/list/l = list() + l += "
Queue[RDSCREEN_NOBREAK]" + if(processing_packet) + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + var/datum/design/D = processing_packet[1] + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + + for(var/i in 1 to length(queue)) + var/list/queue_packet = queue[i] + D = queue_packet[1] + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + l += "[RDSCREEN_NOBREAK]" + l +="
DesignAmountOptions
[D.name][processing_packet[2]]PROCESSING
[D.name][queue_packet[2]]CANCEL
[RDSCREEN_NOBREAK]" + else + l += "

Nothing queued!

[RDSCREEN_NOBREAK]" + l += "
[RDSCREEN_NOBREAK]" + return l + // Stuff for the stripe on the department machines /obj/machinery/rnd/production/default_deconstruction_screwdriver(mob/user, icon_state_open, icon_state_closed, obj/item/screwdriver) . = ..() @@ -482,3 +584,7 @@ if(!.) return compile_categories() + +#undef MODE_BUILD +#undef MODE_QUEUE +#undef MAX_QUEUE_LEN diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm index 53e5ba0236a8..e35952bef03b 100644 --- a/code/modules/research/ordnance/doppler_array.dm +++ b/code/modules/research/ordnance/doppler_array.dm @@ -18,7 +18,7 @@ var/obj/item/computer_hardware/hard_drive/portable/inserted_drive // Lighting system to better communicate the directions. - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_outer_range = 4 light_power = 1 light_color = COLOR_RED diff --git a/code/modules/research/ordnance/tank_compressor.dm b/code/modules/research/ordnance/tank_compressor.dm index 4840fdccefbd..231508c8bda3 100644 --- a/code/modules/research/ordnance/tank_compressor.dm +++ b/code/modules/research/ordnance/tank_compressor.dm @@ -27,9 +27,6 @@ . = ..() leaked_gas_buffer = new(200) compressor_record = list() - -/obj/machinery/atmospherics/components/binary/tank_compressor/ComponentInitialize() - . = ..() RegisterSignal(src, COMSIG_ATOM_INTERNAL_EXPLOSION, PROC_REF(explosion_handle)) /obj/machinery/atmospherics/components/binary/tank_compressor/examine() diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 643a300c1023..ce2666cf4d7e 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -7,6 +7,8 @@ icon = 'icons/obj/machines/research.dmi' density = TRUE use_power = IDLE_POWER_USE + has_disk_slot = TRUE + var/busy = FALSE var/hacked = FALSE var/disabled = FALSE @@ -52,10 +54,10 @@ return default_deconstruction_crowbar(tool) /obj/machinery/rnd/screwdriver_act(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool) + return default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), tool) /obj/machinery/rnd/screwdriver_act_secondary(mob/living/user, obj/item/tool) - return default_deconstruction_screwdriver(user, "[initial(icon_state)]_t", initial(icon_state), tool) + return default_deconstruction_screwdriver(user, initial(icon_state), initial(icon_state), tool) /obj/machinery/rnd/multitool_act(mob/living/user, obj/item/tool) if(panel_open) diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm index ae50e186dbf5..6634b8a1b571 100644 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ b/code/modules/research/xenobiology/crossbreeding/__corecross.dm @@ -34,8 +34,8 @@ To add a crossbreed: var/effect_desc = "null" force = 0 w_class = WEIGHT_CLASS_TINY + throwforce = 0 - throw_speed = 3 throw_range = 6 /obj/item/slimecross/examine(mob/user) @@ -90,6 +90,10 @@ To add a crossbreed: itemcolor = "#008B8B" add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) +/obj/item/slimecross/Destroy(force) + STOP_PROCESSING(SSobj, src) + return ..() + /obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals. name = "result extract" desc = "You shouldn't see this." @@ -122,17 +126,17 @@ To add a crossbreed: color = "#FF0000" list_reagents = list(/datum/reagent/blood = 50) -/obj/item/slimecrossbeaker/pax //5u synthpax. +/obj/item/slimecrossbeaker/pax name = "peace-inducing extract" desc = "A small blob of synthetic pax." color = "#FFCCCC" - list_reagents = list(/datum/reagent/pax/peaceborg = 5) + list_reagents = list(/datum/reagent/pax = 2) -/obj/item/slimecrossbeaker/omnizine //15u omnizine. +/obj/item/slimecrossbeaker/tricordrazine //15u tricordrazine. name = "healing extract" - desc = "A gelatinous extract of pure omnizine." + desc = "A gelatinous extract of pure tricordrazine." color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/omnizine = 15) + list_reagents = list(/datum/reagent/medicine/tricordrazine = 15) /obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. var/ignore_flags = FALSE @@ -180,7 +184,7 @@ To add a crossbreed: name = "peaceful distillation" desc = "A light pink gooey sphere. Simply touching it makes you a little dizzy." color = "#DDAAAA" - list_reagents = list(/datum/reagent/pax/peaceborg = 10, /datum/reagent/drug/space_drugs = 15) //Peace, dudes + list_reagents = list(/datum/reagent/pax = 5, /datum/reagent/drug/space_drugs = 15) //Peace, dudes /obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize(mapload) . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 096b03b47cb4..42cad8431347 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -107,6 +107,7 @@ Slimecrossing Armor w_class = WEIGHT_CLASS_TINY throw_speed = 1 throw_range = 3 + /obj/item/clothing/head/peaceflower/proc/at_peace_check(mob/user) if(iscarbon(user)) var/mob/living/carbon/carbon_user = user @@ -124,19 +125,3 @@ Slimecrossing Armor if(at_peace_check(usr)) return return ..() - -/obj/item/clothing/suit/armor/heavy/adamantine - name = "adamantine armor" - desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do." - icon_state = "adamsuit" - inhand_icon_state = "adamsuit" - flags_inv = NONE - obj_flags = IMMUTABLE_SLOW - slowdown = 4 - var/hit_reflect_chance = 40 - -/obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) - if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) - return TRUE - else - return FALSE diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index b6331f646685..dd7fc0a637fd 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -37,7 +37,7 @@ Slimecrossing Items if(!already || already != saved_part.old_part) saved_part.old_part.replace_limb(src, TRUE) saved_part.old_part.heal_damage(INFINITY, INFINITY, null, FALSE) - saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam,) + saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam) dont_chop[zone] = TRUE for(var/_part in bodyparts) var/obj/item/bodypart/part = _part @@ -151,7 +151,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, FIRE = -80, ACID = 30) + armor = list(BLUNT = 30, PUNCTURE = 50, SLASH = 0, LASER = -50, ENERGY = -50, BOMB = 0, BIO = 100, FIRE = -80, ACID = 30) /obj/structure/ice_stasis/Initialize(mapload) . = ..() @@ -181,7 +181,7 @@ Slimecrossing Items if(M.mind) to_chat(user, span_notice("You offer the device to [M].")) if(tgui_alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", list("Yes", "No")) == "Yes") - if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE)) + if(user.canUseTopic(src, USE_CLOSE) && user.canUseTopic(M, USE_CLOSE)) to_chat(user, span_notice("You store [M] in the capture device.")) to_chat(M, span_notice("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) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 06344930afd1..852bacb22802 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -28,35 +28,6 @@ owner.visible_message(span_notice("[owner] stops glowing, the rainbow light fading away."), span_warning("You no longer feel protected...")) -/atom/movable/screen/alert/status_effect/slimeskin - name = "Adamantine Slimeskin" - desc = "You are covered in a thick, non-neutonian gel." - icon_state = "slime_stoneskin" - -/datum/status_effect/slimeskin - id = "slimeskin" - duration = 300 - alert_type = /atom/movable/screen/alert/status_effect/slimeskin - var/originalcolor - -/datum/status_effect/slimeskin/on_apply() - originalcolor = owner.color - owner.color = "#3070CC" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 10 - owner.visible_message(span_warning("[owner] is suddenly covered in a strange, blue-ish gel!"), - span_notice("You are covered in a thick, rubbery gel.")) - return ..() - -/datum/status_effect/slimeskin/on_remove() - owner.color = originalcolor - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 10 - owner.visible_message(span_warning("[owner]'s gel coating liquefies and dissolves away."), - span_notice("Your gel second-skin dissolves!")) - /datum/status_effect/slimerecall id = "slime_recall" duration = -1 //Will be removed by the extract. @@ -136,7 +107,7 @@ var/mob/living/carbon/O = owner var/mob/living/carbon/C = clone if(istype(C) && istype(O)) - C.real_name = O.real_name + C.set_real_name(O.real_name) O.dna.transfer_identity(C) C.updateappearance(mutcolor_update=1) if(owner.mind) @@ -385,7 +356,7 @@ /datum/status_effect/spookcookie/on_apply() var/image/I = image(icon = 'icons/mob/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) I.override = 1 - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I) + owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/living, "spookyscary", I) return ..() /datum/status_effect/spookcookie/on_remove() @@ -414,22 +385,6 @@ /datum/status_effect/plur/on_remove() REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") -/datum/status_effect/adamantinecookie - id = "adamantinecookie" - status_type = STATUS_EFFECT_REFRESH - alert_type = null - duration = 100 - -/datum/status_effect/adamantinecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod *= 0.9 - return ..() - -/datum/status_effect/adamantinecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod /= 0.9 /////////////////////////////////////////////////////// //////////////////STABILIZED EXTRACTS////////////////// @@ -439,38 +394,29 @@ id = "stabilizedbase" duration = -1 alert_type = null + /// Item which provides this buff var/obj/item/slimecross/stabilized/linked_extract + /// Colour of the extract providing the buff var/colour = "null" -/datum/status_effect/stabilized/proc/location_check() - if(linked_extract.loc == owner) - return TRUE - if(linked_extract.loc.loc == owner) - return TRUE - for(var/atom/storage_loc as anything in get_storage_locs(linked_extract)) - if(storage_loc == owner) - return TRUE - if(storage_loc.loc == owner) - return TRUE - for(var/atom/storage_loc_storage_loc as anything in get_storage_locs(storage_loc)) - if(storage_loc_storage_loc == owner) - return TRUE - for(var/atom/loc_storage_loc as anything in get_storage_locs(linked_extract.loc)) - if(loc_storage_loc == owner) - return TRUE - return FALSE +/datum/status_effect/stabilized/on_creation(mob/living/new_owner, obj/item/slimecross/stabilized/linked_extract) + src.linked_extract = linked_extract + return ..() /datum/status_effect/stabilized/tick() - if(!linked_extract || !linked_extract.loc) //Sanity checking + if(isnull(linked_extract)) //Sanity checking qdel(src) return - if(linked_extract && !location_check()) - linked_extract.linked_effect = null - if(!QDELETED(linked_extract)) - linked_extract.owner = null - START_PROCESSING(SSobj,linked_extract) - qdel(src) - return ..() + + if(linked_extract.get_held_mob() == owner) + return + + to_chat(owner, "The [colour] extract fades away.") + + if(!QDELETED(linked_extract)) + START_PROCESSING(SSobj,linked_extract) + + qdel(src) /datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case. id = "stabilizednull" @@ -722,11 +668,11 @@ /datum/status_effect/stabilized/sepia/tick() if(prob(50) && mod > -1) mod-- - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = -0.5) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, slowdown = -0.5) else if(mod < 1) mod++ // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, slowdown = 0) return ..() /datum/status_effect/stabilized/sepia/on_remove() @@ -743,7 +689,7 @@ var/mob/living/carbon/O = owner var/mob/living/carbon/C = clone if(istype(C) && istype(O)) - C.real_name = O.real_name + C.set_real_name(O.real_name) O.dna.transfer_identity(C) C.updateappearance(mutcolor_update=1) return ..() @@ -825,7 +771,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/H = owner originalDNA.transfer_identity(H) - H.real_name = originalname + H.set_real_name(originalname) H.updateappearance(mutcolor_update=1) /datum/status_effect/brokenpeace @@ -848,48 +794,73 @@ /datum/status_effect/stabilized/pink id = "stabilizedpink" colour = "pink" + /// List of weakrefs to mobs we have pacified var/list/mobs = list() + /// Name of our faction var/faction_name /datum/status_effect/stabilized/pink/on_apply() - faction_name = REF(owner) + faction_name = "pink_[REF(owner)]" + owner.faction |= faction_name return ..() /datum/status_effect/stabilized/pink/tick() - for(var/mob/living/simple_animal/M in view(7,get_turf(owner))) - if(!(M in mobs)) - mobs += M - 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)))) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - mobs -= M - var/datum/status_effect/pinkdamagetracker/C = M.has_status_effect(/datum/status_effect/pinkdamagetracker) - if(istype(C) && C.damage > 0) - C.damage = 0 - owner.apply_status_effect(/datum/status_effect/brokenpeace) - var/HasFaction = FALSE - for(var/i in owner.faction) - if(i == faction_name) - HasFaction = TRUE - - if(HasFaction && owner.has_status_effect(/datum/status_effect/brokenpeace)) - owner.faction -= faction_name - to_chat(owner, span_userdanger("The peace has been broken! Hostile creatures will now react to you!")) - if(!HasFaction && !owner.has_status_effect(/datum/status_effect/brokenpeace)) + update_nearby_mobs() + var/has_faction = FALSE + for (var/check_faction in owner.faction) + if(check_faction != faction_name) + continue + has_faction = TRUE + break + + if(has_faction) + if(owner.has_status_effect(/datum/status_effect/brokenpeace)) + owner.faction -= faction_name + to_chat(owner, span_userdanger("The peace has been broken! Hostile creatures will now react to you!")) + else if(!owner.has_status_effect(/datum/status_effect/brokenpeace)) to_chat(owner, span_notice("[linked_extract] pulses, generating a fragile aura of peace.")) owner.faction |= faction_name return ..() +/// Pacifies mobs you can see and unpacifies mobs you no longer can +/datum/status_effect/stabilized/pink/proc/update_nearby_mobs() + var/list/visible_things = view(7, get_turf(owner)) + // Unpacify far away or offended mobs + for(var/datum/weakref/weak_mob as anything in mobs) + var/mob/living/beast = weak_mob.resolve() + if(isnull(beast)) + mobs -= weak_mob + continue + var/datum/status_effect/pinkdamagetracker/damage_tracker = beast.has_status_effect(/datum/status_effect/pinkdamagetracker) + if(istype(damage_tracker) && damage_tracker.damage > 0) + damage_tracker.damage = 0 + owner.apply_status_effect(/datum/status_effect/brokenpeace) + return // No point continuing from here if we're going to end the effect + if(beast in visible_things) + continue + beast.faction -= faction_name + beast.remove_status_effect(/datum/status_effect/pinkdamagetracker) + mobs -= weak_mob + + // Pacify nearby mobs + for(var/mob/living/beast in visible_things) + if(!isanimal_or_basicmob(beast)) + continue + var/datum/weakref/weak_mob = WEAKREF(beast) + if(weak_mob in mobs) + continue + mobs += weak_mob + beast.apply_status_effect(/datum/status_effect/pinkdamagetracker) + beast.faction |= faction_name + /datum/status_effect/stabilized/pink/on_remove() - for(var/mob/living/simple_animal/M in mobs) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - for(var/i in owner.faction) - if(i == faction_name) - owner.faction -= faction_name + for(var/datum/weakref/weak_mob as anything in mobs) + var/mob/living/beast = weak_mob.resolve() + if(isnull(beast)) + continue + beast.faction -= faction_name + beast.remove_status_effect(/datum/status_effect/pinkdamagetracker) + owner.faction -= faction_name /datum/status_effect/stabilized/oil id = "stabilizedoil" @@ -927,11 +898,11 @@ /datum/status_effect/stabilized/black/proc/on_grab(mob/living/source, new_state) SIGNAL_HANDLER - if(new_state < GRAB_KILL || !isliving(source.pulling)) + if(new_state < GRAB_KILL || !isliving(source.get_active_grab()?.affecting)) draining_ref = null return - var/mob/living/draining = source.pulling + var/mob/living/draining = source.get_active_grab()?.affecting if(draining.stat == DEAD) return @@ -947,7 +918,11 @@ return span_warning("[owner.p_they(TRUE)] [owner.p_are()] draining health from [draining]!") /datum/status_effect/stabilized/black/tick() - if(owner.grab_state < GRAB_KILL || !IS_WEAKREF_OF(owner.pulling, draining_ref)) + var/obj/item/hand_item/grab/G = owner.get_active_grab() + if(!G) + return + + if(G.current_grab.damage_stage < GRAB_KILL || !IS_WEAKREF_OF(G.affecting, draining_ref)) return var/mob/living/drained = draining_ref.resolve() @@ -995,13 +970,6 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_TRAIT) -/datum/status_effect/stabilized/adamantine - id = "stabilizedadamantine" - colour = "adamantine" - -/datum/status_effect/stabilized/adamantine/get_examine_text() - return span_warning("[owner.p_they(TRUE)] [owner.p_have()] strange metallic coating on [owner.p_their()] skin.") - /datum/status_effect/stabilized/gold id = "stabilizedgold" colour = "gold" @@ -1027,17 +995,6 @@ if(familiar) qdel(familiar) -/datum/status_effect/stabilized/adamantine/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 5 - return ..() - -/datum/status_effect/stabilized/adamantine/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 5 - /datum/status_effect/stabilized/rainbow id = "stabilizedrainbow" colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 27645495623b..da02d7c6e9f9 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -33,48 +33,31 @@ Slimecrossing Weapons switch(damtype) if(BRUTE) hitsound = 'sound/weapons/bladeslice.ogg' + wielded_hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = string_list(list("slashes", "slices", "cuts")) attack_verb_simple = string_list(list("slash", "slice", "cut")) if(BURN) hitsound = 'sound/weapons/sear.ogg' + wielded_hitsound = 'sound/weapons/sear.ogg' attack_verb_continuous = string_list(list("burns", "singes", "heats")) attack_verb_simple = string_list(list("burn", "singe", "heat")) if(TOX) hitsound = 'sound/weapons/pierce.ogg' + wielded_hitsound = 'sound/weapons/pierce.ogg' attack_verb_continuous = string_list(list("poisons", "doses", "toxifies")) attack_verb_simple = string_list(list("poison", "dose", "toxify")) if(OXY) hitsound = 'sound/effects/space_wind.ogg' + wielded_hitsound = 'sound/effects/space_wind.ogg' attack_verb_continuous = string_list(list("suffocates", "winds", "vacuums")) attack_verb_simple = string_list(list("suffocate", "wind", "vacuum")) if(CLONE) hitsound = 'sound/items/geiger/ext1.ogg' + wielded_hitsound = 'sound/items/geiger/ext1.ogg' attack_verb_continuous = string_list(list("irradiates", "mutates", "maligns")) attack_verb_simple = string_list(list("irradiate", "mutate", "malign")) return ..() -//Adamantine shield - Chilling Adamantine -/obj/item/shield/adamantineshield - name = "adamantine shield" - desc = "A gigantic shield made of solid adamantium." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "adamshield" - inhand_icon_state = "adamshield" - w_class = WEIGHT_CLASS_HUGE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 70) - slot_flags = ITEM_SLOT_BACK - block_chance = 75 - force = 0 - throw_range = 1 //How far do you think you're gonna throw a solid crystalline shield...? - throw_speed = 2 - attack_verb_continuous = list("bashes", "pounds", "slams") - attack_verb_simple = list("bash", "pound", "slam") - 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" diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm index 8bd177783c9b..dbe4f485a211 100644 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ b/code/modules/research/xenobiology/crossbreeding/burning.dm @@ -48,8 +48,8 @@ Burning extracts: var/datum/reagents/R = new/datum/reagents(100) R.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100) - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new + smoke.set_up(7, location = get_turf(user), carry = R) smoke.start() ..() @@ -123,8 +123,8 @@ Burning extracts: var/datum/reagents/R = new/datum/reagents(100) R.add_reagent(/datum/reagent/consumable/frostoil, 40) user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new + smoke.set_up(7, location = get_turf(user), carry = R) smoke.start() ..() @@ -188,7 +188,7 @@ Burning extracts: for(var/obj/machinery/light/L in A) //Shamelessly copied from the APC effect. L.on = TRUE L.break_light_tube() - stoplag() + CHECK_TICK ..() /obj/item/slimecross/burning/red @@ -268,7 +268,7 @@ Burning extracts: playsound(T, 'sound/effects/explosion2.ogg', 200, TRUE) for(var/mob/living/target in range(2, T)) new /obj/effect/temp_visual/explosion(get_turf(target)) - SSexplosions.med_mov_atom += target + EX_ACT(target, EXPLODE_HEAVY) qdel(src) /obj/item/slimecross/burning/black @@ -287,21 +287,12 @@ Burning extracts: /obj/item/slimecross/burning/lightpink colour = "light pink" - effect_desc = "Paxes everyone in sight." + effect_desc = "Drugs everyone in sight." /obj/item/slimecross/burning/lightpink/do_effect(mob/user) user.visible_message(span_danger("[src] lets off a hypnotizing pink glow!")) for(var/mob/living/carbon/C in view(7, get_turf(user))) - C.reagents.add_reagent(/datum/reagent/pax,5) - ..() - -/obj/item/slimecross/burning/adamantine - colour = "adamantine" - effect_desc = "Creates a mighty adamantine shield." - -/obj/item/slimecross/burning/adamantine/do_effect(mob/user) - user.visible_message(span_notice("[src] crystallizes into a large shield!")) - new /obj/item/shield/adamantineshield(get_turf(user)) + C.reagents.add_reagent(/datum/reagent/medicine/haloperidol, 10) ..() /obj/item/slimecross/burning/rainbow diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm index b828b4416054..5d6bdecd539a 100644 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ b/code/modules/research/xenobiology/crossbreeding/charged.dm @@ -51,10 +51,10 @@ Charged extracts: /obj/item/slimecross/charged/purple colour = "purple" - effect_desc = "Creates a packet of omnizine." + effect_desc = "Creates a packet of tricordrazine." /obj/item/slimecross/charged/purple/do_effect(mob/user) - new /obj/item/slimecrossbeaker/omnizine(get_turf(user)) + new /obj/item/slimecrossbeaker/tricordrazine(get_turf(user)) user.visible_message(span_notice("[src] sparks, and floods with a regenerative solution!")) ..() @@ -174,7 +174,7 @@ Charged extracts: if(isnull(racechoice)) to_chat(user, span_notice("You decide not to become a slime for now.")) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return H.set_species(racechoice, icon_update=1) H.visible_message(span_warning("[H] suddenly shifts form as [src] dissolves into [H.p_their()] skin!")) @@ -258,15 +258,6 @@ Charged extracts: user.visible_message(span_notice("[src] distills into a potion!")) ..() -/obj/item/slimecross/charged/adamantine - colour = "adamantine" - effect_desc = "Creates a completed golem shell." - -/obj/item/slimecross/charged/adamantine/do_effect(mob/user) - user.visible_message(span_notice("[src] produces a fully formed golem shell!")) - new /obj/effect/mob_spawn/ghost_role/human/golem/servant(get_turf(src), /datum/species/golem/adamantine, user) - ..() - /obj/item/slimecross/charged/rainbow colour = "rainbow" effect_desc = "Produces three living slimes of random colors." diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 899e3731589a..c33905ca8f4d 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -294,21 +294,7 @@ Chilling extracts: /obj/item/slimecross/chilling/black colour = "black" - effect_desc = "Transforms the user into a random type of golem." - -/obj/item/slimecross/chilling/black/do_effect(mob/user) - if(ishuman(user)) - user.visible_message(span_notice("[src] crystallizes along [user]'s skin, turning into metallic scales!")) - var/mob/living/carbon/human/H = user - - var/static/list/random_golem_types - random_golem_types = subtypesof(/datum/species/golem) - type - - for(var/datum/species/golem/golem as anything in random_golem_types) - if(!initial(golem.random_eligible)) - random_golem_types -= golem - H.set_species(pick(random_golem_types)) - ..() + effect_desc = "Inert. One must wonder what this once did..." /obj/item/slimecross/chilling/lightpink colour = "light pink" @@ -319,15 +305,6 @@ Chilling extracts: new /obj/item/clothing/head/peaceflower(get_turf(user)) ..() -/obj/item/slimecross/chilling/adamantine - colour = "adamantine" - effect_desc = "Solidifies into a set of adamantine armor." - -/obj/item/slimecross/chilling/adamantine/do_effect(mob/user) - user.visible_message(span_notice("[src] creaks and breaks as it shifts into a heavy set of armor!")) - new /obj/item/clothing/suit/armor/heavy/adamantine(get_turf(user)) - ..() - /obj/item/slimecross/chilling/rainbow colour = "rainbow" effect_desc = "Makes an unpassable wall in every door in the area." diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index d12042941d69..18b6d2f43e07 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -53,7 +53,7 @@ Consuming extracts: force = 0 w_class = WEIGHT_CLASS_TINY throwforce = 0 - throw_speed = 3 + throw_speed = 1.5 throw_range = 6 /obj/item/slime_cookie/proc/do_effect(mob/living/M, mob/user) @@ -120,12 +120,13 @@ Consuming extracts: taste = "fruit jam and cough medicine" /obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - M.adjustToxLoss(-5, forced=1) //To heal slimepeople. - M.adjustOxyLoss(-5) - M.adjustCloneLoss(-5) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) + M.adjustBruteLoss(-5, FALSE) + M.adjustFireLoss(-5, FALSE) + M.adjustToxLoss(-5, FALSE, forced=1) //To heal slimepeople. + M.adjustOxyLoss(-5, FALSE) + M.adjustCloneLoss(-5, FALSE) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5, updating_health = FALSE) + M.updatehealth() /obj/item/slimecross/consuming/blue colour = "blue" @@ -433,20 +434,6 @@ Consuming extracts: /obj/item/slime_cookie/lightpink/do_effect(mob/living/M, mob/user) M.apply_status_effect(/datum/status_effect/peacecookie) -/obj/item/slimecross/consuming/adamantine - colour = "adamantine" - effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." - cookietype = /obj/item/slime_cookie/adamantine - -/obj/item/slime_cookie/adamantine - name = "crystal cookie" - desc = "A translucent rock candy in the shape of a cookie. Surprisingly chewy." - icon_state = "adamantine" - taste = "crystalline sugar and metal" - -/obj/item/slime_cookie/adamantine/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/adamantinecookie) - /obj/item/slimecross/consuming/rainbow colour = "rainbow" effect_desc = "Creates a slime cookie that has the effect of a random cookie." diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm index ab0907446958..048bcd385e84 100644 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ b/code/modules/research/xenobiology/crossbreeding/industrial.dm @@ -193,12 +193,6 @@ Industrial extracts: plasmarequired = 3 itempath = /obj/item/storage/fancy/heart_box -/obj/item/slimecross/industrial/adamantine - colour = "adamantine" - effect_desc = "Produces sheets of adamantine." - plasmarequired = 10 - itempath = /obj/item/stack/sheet/mineral/adamantine - /obj/item/slimecross/industrial/rainbow colour = "rainbow" effect_desc = "Produces random slime extracts." diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm index 9cfc4542d526..0f20f9ef5d5b 100644 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ b/code/modules/research/xenobiology/crossbreeding/prismatic.dm @@ -106,10 +106,6 @@ Prismatic extracts: paintcolor = "#FFB6C1" colour = "light pink" -/obj/item/slimecross/prismatic/adamantine - paintcolor = "#008B8B" - colour = "adamantine" - /obj/item/slimecross/prismatic/rainbow paintcolor = "#FFFFFF" colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm index 5f7e2b2e0fc7..467b3fa01a65 100644 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ b/code/modules/research/xenobiology/crossbreeding/recurring.dm @@ -127,11 +127,6 @@ Recurring extracts: extract_type = /obj/item/slime_extract/lightpink colour = "light pink" -/obj/item/slimecross/recurring/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - max_cooldown = 20 - /obj/item/slimecross/recurring/rainbow extract_type = /obj/item/slime_extract/rainbow colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 77ed699dc876..3cad721d1b33 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -247,7 +247,7 @@ Regenerative extracts: var/mob/living/carbon/D = dummy T.dna.transfer_identity(D) D.updateappearance(mutcolor_update=1) - D.real_name = T.real_name + D.set_real_name(T.real_name) dummy.adjustBruteLoss(target.getBruteLoss()) dummy.adjustFireLoss(target.getFireLoss()) dummy.adjustToxLoss(target.getToxLoss()) @@ -266,13 +266,6 @@ Regenerative extracts: U.revive(full_heal = TRUE, admin_revive = FALSE) to_chat(U, span_notice("Some of the milky goo sprays onto you, as well!")) -/obj/item/slimecross/regenerative/adamantine - colour = "adamantine" - effect_desc = "Fully heals the target and boosts their armor." - -/obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. - target.apply_status_effect(/datum/status_effect/slimeskin) - /obj/item/slimecross/regenerative/rainbow colour = "rainbow" effect_desc = "Fully heals the target and temporarily makes them immortal, but pacifistic." diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm index 8fe45940a93e..dbe2ea572abc 100644 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ b/code/modules/research/xenobiology/crossbreeding/reproductive.dm @@ -138,10 +138,6 @@ Reproductive extracts: extract_type = /obj/item/slime_extract/lightpink colour = "light pink" -/obj/item/slimecross/reproductive/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - /obj/item/slimecross/reproductive/rainbow extract_type = /obj/item/slime_extract/rainbow colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm index ab6f9381086a..4aaed120bbf3 100644 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm @@ -142,10 +142,6 @@ Self-sustaining extracts: extract_type = /obj/item/slime_extract/lightpink colour = "light pink" -/obj/item/slimecross/selfsustaining/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - /obj/item/slimecross/selfsustaining/rainbow extract_type = /obj/item/slime_extract/rainbow colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index 0b4e5f00998c..c391da9fac07 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -12,7 +12,6 @@ Stabilized extracts: effect = "stabilized" icon_state = "stabilized" var/datum/status_effect/linked_effect - var/mob/living/owner /obj/item/slimecross/stabilized/Initialize(mapload) . = ..() @@ -24,42 +23,44 @@ Stabilized extracts: return ..() /obj/item/slimecross/stabilized/process() - var/humanfound = null - if(ishuman(loc)) - humanfound = loc - if(ishuman(loc.loc)) //Check if in backpack. - humanfound = (loc.loc) - for(var/atom/storage_loc as anything in get_storage_locs(src)) - if(ishuman(storage_loc)) - humanfound = storage_loc - break - if(ishuman(storage_loc.loc)) - humanfound = storage_loc.loc - break - for(var/atom/storage_loc_storage_loc as anything in get_storage_locs(storage_loc)) - if(ishuman(storage_loc_storage_loc)) - humanfound = storage_loc_storage_loc - break - for(var/atom/loc_storage_loc as anything in get_storage_locs(loc)) - if(ishuman(loc_storage_loc)) - humanfound = loc_storage_loc - break - if(!humanfound) + var/mob/living/holder = get_held_mob() + if(isnull(holder)) return - var/mob/living/carbon/human/H = humanfound + var/effectpath = /datum/status_effect/stabilized + var/static/list/effects = subtypesof(/datum/status_effect/stabilized) - for(var/X in effects) - var/datum/status_effect/stabilized/S = X - if(initial(S.colour) == colour) - effectpath = S - break - if(!H.has_status_effect(effectpath)) - var/datum/status_effect/stabilized/S = H.apply_status_effect(effectpath) - owner = H - S.linked_extract = src - STOP_PROCESSING(SSobj,src) + for(var/datum/status_effect/stabilized/effect as anything in effects) + if(initial(effect.colour) != colour) + continue + effectpath = effect + break + + if (holder.has_status_effect(effectpath)) + return + + holder.apply_status_effect(effectpath, src) + STOP_PROCESSING(SSobj, src) + +/// Returns the mob that is currently holding us if we are either in their inventory or a backpack analogue. +/// Returns null if it's in an invalid location, so that we can check explicitly for null later. +/obj/item/slimecross/stabilized/proc/get_held_mob() + if(isnull(loc)) + return null + if(isliving(loc)) + return loc + + // Snowflake check for modsuit backpacks, which should be valid but are 3 rather than 2 steps from the owner + if(istype(loc, /obj/item/mod/module/storage)) + var/obj/item/mod/module/storage/mod_backpack = loc + var/mob/living/modsuit_wearer = mod_backpack.mod?.wearer + return modsuit_wearer ? modsuit_wearer : null + + var/nested_loc = loc.loc + if (isliving(nested_loc)) + return nested_loc + return null //Colors and subtypes: @@ -152,7 +153,7 @@ Stabilized extracts: var/choice = tgui_input_list(user, "Which do you want to reset?", "Familiar Adjustment", sort_list(list("Familiar Location", "Familiar Species", "Familiar Sentience", "Familiar Name"))) if(isnull(choice)) return - if(!user.canUseTopic(src, BE_CLOSE)) + if(!user.canUseTopic(src, USE_CLOSE)) return if(isliving(user)) var/mob/living/L = user @@ -188,10 +189,6 @@ Stabilized extracts: colour = "light pink" effect_desc = "The owner moves at high speeds while holding this extract, also stabilizes anyone in critical condition around you using Epinephrine." -/obj/item/slimecross/stabilized/adamantine - colour = "adamantine" - effect_desc = "Owner gains a slight boost in damage resistance to all types." - /obj/item/slimecross/stabilized/rainbow colour = "rainbow" effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." diff --git a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm deleted file mode 100644 index 43d013abd2dd..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm +++ /dev/null @@ -1,18 +0,0 @@ -///Tool capable of taking biological samples from mobs -/obj/item/biopsy_tool - name = "biopsy tool" - desc = "Don't worry, it won't sting." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' - icon_state = "biopsy" - -///Adds the swabbing component to the biopsy tool -/obj/item/biopsy_tool/Initialize(mapload) - . = ..() - AddComponent(/datum/component/swabbing, FALSE, FALSE, TRUE, CALLBACK(src, PROC_REF(update_swab_icon)), max_items = 1) - - -/obj/item/biopsy_tool/proc/update_swab_icon(list/swabbed_items) - if(LAZYLEN(swabbed_items)) - icon_state = "biopsy_full" - else - icon_state = "biopsy" diff --git a/code/modules/research/xenobiology/vatgrowing/microscope.dm b/code/modules/research/xenobiology/vatgrowing/microscope.dm deleted file mode 100644 index 9fd4c58bc088..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/microscope.dm +++ /dev/null @@ -1,81 +0,0 @@ -/obj/structure/microscope - name = "Microscope" - desc = "A simple microscope, allowing you to examine micro-organisms." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' - icon_state = "microscope" - var/obj/item/petri_dish/current_dish - -/obj/structure/microscope/attacked_by(obj/item/I, mob/living/user) - if(!istype(I, /obj/item/petri_dish)) - return ..() - if(current_dish) - to_chat(user, span_warning("There is already a petridish in \the [src].")) - return - to_chat(user, span_notice("You put [I] into \the [src].")) - current_dish = I - current_dish.forceMove(src) - -/obj/structure/microscope/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "Microscope", name) - ui.open() - -/obj/structure/microscope/ui_data(mob/user) - var/list/data = list() - - data["has_dish"] = current_dish ? TRUE : FALSE - data["cell_lines"] = list() - data["viruses"] = list() - - if(!current_dish) - return data - if(!current_dish.sample) - return data - - for(var/organism in current_dish.sample.micro_organisms) //All the microorganisms in the dish - if(istype(organism, /datum/micro_organism/cell_line)) - var/datum/micro_organism/cell_line/cell_line = organism - var/list/organism_data = list( - type = "cell line", - name = cell_line.name, - desc = cell_line.desc, - growth_rate = cell_line.growth_rate, - suspectibility = cell_line.virus_suspectibility, - requireds = get_reagent_list(cell_line.required_reagents), - supplementaries = get_reagent_list(cell_line.supplementary_reagents), - suppressives = get_reagent_list(cell_line.suppressive_reagents) - ) - data["cell_lines"] += list(organism_data) - - if(istype(organism, /datum/micro_organism/virus)) - var/datum/micro_organism/virus/virus = organism - var/list/virus_data = list( - type = "virus", - name = virus.name, - desc = virus.desc - ) - data["viruses"] += list(virus_data) - - return data - -/obj/structure/microscope/proc/get_reagent_list(list/reagents) - var/list/reagent_list = list() - for(var/i in reagents) //Convert from assoc to normal. Yeah very shit. - var/datum/reagent/reagent = i - reagent_list += initial(reagent.name) - return reagent_list.Join(", ") - - -/obj/structure/microscope/ui_act(action, params) - . = ..() - if(.) - return - switch(action) - if("eject_petridish") - if(!current_dish) - return FALSE - current_dish.forceMove(get_turf(src)) - current_dish = null - . = TRUE - update_appearance() diff --git a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm deleted file mode 100644 index 488890052ce7..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm +++ /dev/null @@ -1,68 +0,0 @@ -///Holds a biological sample which can then be put into the growing vat -/obj/item/petri_dish - name = "petri dish" - desc = "This makes you feel well-cultured." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' - icon_state = "petri_dish" - w_class = WEIGHT_CLASS_TINY - ///The sample stored on the dish - var/datum/biological_sample/sample - -/obj/item/petri_dish/Destroy() - . = ..() - QDEL_NULL(sample) - -/obj/item/petri_dish/vv_edit_var(vname, vval) - . = ..() - if(vname == NAMEOF(src, sample)) - update_appearance() - -/obj/item/petri_dish/examine(mob/user) - . = ..() - if(!sample) - return - . += span_notice("You can see the following micro-organisms:") - for(var/i in sample.micro_organisms) - var/datum/micro_organism/MO = i - . += MO.get_details() - -/obj/item/petri_dish/pre_attack(atom/A, mob/living/user, params) - . = ..() - if(!sample || !istype(A, /obj/structure/sink)) - return FALSE - to_chat(user, span_notice("You wash the sample out of [src].")) - sample = null - update_appearance() - -/obj/item/petri_dish/update_overlays() - . = ..() - if(!sample) - return - var/reagentcolor = sample.sample_color - var/mutable_appearance/base_overlay = mutable_appearance(icon, "petri_dish_overlay") - base_overlay.appearance_flags = RESET_COLOR - base_overlay.color = reagentcolor - . += base_overlay - var/mutable_appearance/overlay2 = mutable_appearance(icon, "petri_dish_overlay2") - . += overlay2 - -/obj/item/petri_dish/proc/deposit_sample(user, datum/biological_sample/deposited_sample) - sample = deposited_sample - to_chat(user, span_notice("You deposit a sample into [src].")) - update_appearance() - -/// Petri dish with random sample already in it. -/obj/item/petri_dish/random - var/static/list/possible_samples = list( - list(CELL_LINE_TABLE_CORGI, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5), - list(CELL_LINE_TABLE_SNAKE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5), - list(CELL_LINE_TABLE_COCKROACH, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 7), - list(CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - ) - -/obj/item/petri_dish/random/Initialize(mapload) - . = ..() - var/list/chosen = pick(possible_samples) - sample = new - sample.GenerateSample(chosen[1],chosen[2],chosen[3],chosen[4]) - update_appearance() diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm deleted file mode 100644 index b3d2b45f5663..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm +++ /dev/null @@ -1,126 +0,0 @@ -///A single type of growth. -/datum/micro_organism - ///Name, shown on microscope - var/name = "Unknown fluids" - ///Desc, shown by science goggles - var/desc = "White fluid that tastes like salty coins and milk" - -///Returns a short description of the cell line -/datum/micro_organism/proc/get_details(show_details) - return span_notice("[desc]") - -///A "mob" cell. Can grow into a mob in a growing vat. -/datum/micro_organism/cell_line - ///Our growth so far, needs to get up to 100 - var/growth = 0 - ///All the reagent types required for letting this organism grow into whatever it should become - var/list/required_reagents - ///Reagent types that further speed up growth, but aren't needed. Assoc list of reagent datum type || bonus growth per tick - var/list/supplementary_reagents - ///Reagent types that surpress growth. Assoc list of reagent datum type || lost growth per tick - var/list/suppressive_reagents - ///This var modifies how much this micro_organism is affected by viruses. Higher is more slowdown - var/virus_suspectibility = 1 - ///This var defines how much % the organism grows per process(), without modifiers, if you have all required reagents - var/growth_rate = 4 - ///Resulting atoms from growing this cell line. List is assoc atom type || amount - var/list/resulting_atoms = list() - -///Handles growth of the micro_organism. This only runs if the micro organism is in the growing vat. Reagents is the growing vats reagents -/datum/micro_organism/cell_line/proc/handle_growth(obj/machinery/plumbing/growing_vat/vat) - if(!try_eat(vat.reagents)) - return FALSE - growth = max(growth, growth + calculate_growth(vat.reagents, vat.biological_sample)) //Prevent you from having minus growth. - if(growth >= 100) - finish_growing(vat) - return TRUE - -///Tries to consume the required reagents. Can only do this if all of them are available. Reagents is the growing vats reagents -/datum/micro_organism/cell_line/proc/try_eat(datum/reagents/reagents) - for(var/i in required_reagents) - if(!reagents.has_reagent(i)) - return FALSE - for(var/i in required_reagents) //Delete the required reagents if used - reagents.remove_reagent(i, REAGENTS_METABOLISM) - return TRUE - -///Apply modifiers on growth_rate based on supplementary and supressive reagents. Reagents is the growing vats reagents -/datum/micro_organism/cell_line/proc/calculate_growth(datum/reagents/reagents, datum/biological_sample/biological_sample) - . = growth_rate - - //Handle growth based on supplementary reagents here. - for(var/i in supplementary_reagents) - if(!reagents.has_reagent(i, REAGENTS_METABOLISM)) - continue - . += supplementary_reagents[i] - reagents.remove_reagent(i, REAGENTS_METABOLISM) - - //Handle degrowth based on supressive reagents here. - for(var/i in suppressive_reagents) - if(!reagents.has_reagent(i, REAGENTS_METABOLISM)) - continue - . += suppressive_reagents[i] - reagents.remove_reagent(i, REAGENTS_METABOLISM) - - //Handle debuffing growth based on viruses here. - for(var/datum/micro_organism/virus/active_virus in biological_sample.micro_organisms) - if(reagents.has_reagent(/datum/reagent/medicine/spaceacillin, REAGENTS_METABOLISM)) - reagents.remove_reagent(/datum/reagent/medicine/spaceacillin, REAGENTS_METABOLISM) - continue //This virus is stopped, We have antiviral stuff - . -= virus_suspectibility - -///Called once a cell line reaches 100 growth. Then we check if any cell_line is too far so we can perform an epic fail roll -/datum/micro_organism/cell_line/proc/finish_growing(obj/machinery/plumbing/growing_vat/vat) - var/risk = 0 //Penalty for failure, goes up based on how much growth the other cell_lines have - - for(var/datum/micro_organism/cell_line/cell_line in vat.biological_sample.micro_organisms) - if(cell_line == src) //well duh - continue - if(cell_line.growth >= VATGROWING_DANGER_MINIMUM) - risk += cell_line.growth * 0.6 //60% per cell_line potentially. Kryson should probably tweak this - playsound(vat, 'sound/effects/splat.ogg', 50, TRUE) - if(rand(1, 100) < risk) //Fail roll! - fuck_up_growing(vat) - - return FALSE - succeed_growing(vat) - return TRUE - -/datum/micro_organism/cell_line/proc/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) - vat.visible_message(span_warning("The biological sample in [vat] seems to have dissipated!")) - if(prob(50)) - new /obj/effect/gibspawner/generic(get_turf(vat)) //Spawn some gibs. - if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) - return - QDEL_NULL(vat.biological_sample) - -/datum/micro_organism/cell_line/proc/succeed_growing(obj/machinery/plumbing/growing_vat/vat) - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, vat.loc) - smoke.start() - for(var/created_thing in resulting_atoms) - for(var/x in 1 to resulting_atoms[created_thing]) - var/atom/thing = new created_thing(get_turf(vat)) - ADD_TRAIT(thing, TRAIT_VATGROWN, "vatgrowing") - vat.visible_message(span_nicegreen("[thing] pops out of [vat]!")) - if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) - return - QDEL_NULL(vat.biological_sample) - -///Overriden to show more info like needs, supplementary and supressive reagents and also growth. -/datum/micro_organism/cell_line/get_details(show_details) - . += "[span_notice("[desc] - growth progress: [growth]%")]\n" - if(show_details) - . += return_reagent_text("It requires:", required_reagents) - . += return_reagent_text("It likes:", supplementary_reagents) - . += return_reagent_text("It hates:", suppressive_reagents) - -///Return a nice list of all the reagents in a specific category with a specific prefix. This needs to be reworked because the formatting sucks ass. -/datum/micro_organism/cell_line/proc/return_reagent_text(prefix_text = "It requires:", list/reagentlist) - if(!reagentlist.len) - return - var/all_reagents_text - for(var/i in reagentlist) - var/datum/reagent/reagent = i - all_reagents_text += " - [initial(reagent.name)]\n" - return span_notice("[prefix_text]\n[all_reagents_text]") diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm b/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm deleted file mode 100644 index eda9d2771ebf..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm +++ /dev/null @@ -1,41 +0,0 @@ -///This datum is a simple holder for the micro_organisms in a sample. -/datum/biological_sample - ///List of all micro_organisms in the sample. These are instantiated - var/list/micro_organisms = list() - ///Prevents someone from stacking too many layers onto a swabber - var/sample_layers = 1 - ///Picked from a specific group of colors, limited to a specific group. - var/sample_color = COLOR_SAMPLE_YELLOW - -///Generate a sample from a specific weighted list, and a specific amount of cell line with a chance for a virus -/datum/biological_sample/proc/GenerateSample(cell_line_define, virus_define, cell_line_amount, virus_chance) - sample_color = pick(GLOB.xeno_sample_colors) - - var/list/temp_weight_list = GLOB.cell_line_tables[cell_line_define].Copy() //Temp list to prevent double picking - for(var/i in 1 to cell_line_amount) - var/datum/micro_organism/chosen_type = pick_weight(temp_weight_list) - temp_weight_list -= chosen_type - micro_organisms += new chosen_type - if(prob(virus_chance)) - if(!GLOB.cell_virus_tables[virus_define]) - return - var/datum/micro_organism/chosen_type = pick_weight(GLOB.cell_virus_tables[virus_define]) - micro_organisms += new chosen_type - -///Takes another sample and merges it into use. This can cause one very big sample but we limit it to 3 layers. -/datum/biological_sample/proc/Merge(datum/biological_sample/other_sample) - if(sample_layers >= 3)//No more than 3 layers, at that point you're entering danger zone. - return FALSE - micro_organisms += other_sample.micro_organisms - qdel(other_sample) - return TRUE - -///Call handle_growth on all our microorganisms. -/datum/biological_sample/proc/handle_growth(obj/machinery/plumbing/growing_vat/vat) - for(var/datum/micro_organism/cell_line/organism in micro_organisms) //Types because we don't grow viruses. - organism.handle_growth(vat) - -///resets the progress of all cell ines -/datum/biological_sample/proc/reset_sample() - for(var/datum/micro_organism/cell_line/organism in micro_organisms) //Types because we don't grow viruses. - organism.growth = 0 diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm deleted file mode 100644 index 1c2da8d5ac7b..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ /dev/null @@ -1,694 +0,0 @@ -#define VAT_GROWTH_RATE 4 - -//////////////////////////////// -//// VERTEBRATES //// -//////////////////////////////// - -/datum/micro_organism/cell_line/mouse //nuisance cell line designed to complicate the growing of animal type cell lines. - desc = "Murine cells" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - supplementary_reagents = list( - /datum/reagent/growthserum = 2, - /datum/reagent/liquidgibs = 2, - /datum/reagent/consumable/cornoil = 2, - /datum/reagent/consumable/nutriment = 1, - /datum/reagent/consumable/nutriment/vitamin = 1, - /datum/reagent/consumable/sugar = 1, - /datum/reagent/consumable/cooking_oil = 1, - /datum/reagent/consumable/rice = 1, - /datum/reagent/consumable/eggyolk = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/heparin = -6, - /datum/reagent/consumable/astrotame = -4, //Saccarin gives rats cancer. - /datum/reagent/consumable/ethanol/rubberneck = -3, - /datum/reagent/consumable/grey_bull = -1) - - virus_suspectibility = 2 - growth_rate = VAT_GROWTH_RATE - resulting_atoms = list(/mob/living/simple_animal/mouse = 2) - -/datum/micro_organism/cell_line/chicken //basic cell line designed as a good source of protein and eggyolk. - desc = "Galliform skin cells." - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - - supplementary_reagents = list( - /datum/reagent/consumable/rice = 4, - /datum/reagent/growthserum = 3, - /datum/reagent/consumable/eggyolk = 1, - /datum/reagent/consumable/nutriment/vitamin = 2) - - suppressive_reagents = list( - /datum/reagent/fuel/oil = -4, - /datum/reagent/toxin = -2) - - virus_suspectibility = 1 - growth_rate = VAT_GROWTH_RATE - resulting_atoms = list(/mob/living/simple_animal/chicken = 1) - -/datum/micro_organism/cell_line/cow - desc = "Bovine stem cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/nutriment, - /datum/reagent/cellulose) - - supplementary_reagents = list( - /datum/reagent/growthserum = 4, - /datum/reagent/consumable/nutriment/vitamin = 2, - /datum/reagent/consumable/rice = 2, - /datum/reagent/consumable/flour = 1) - - suppressive_reagents = list(/datum/reagent/toxin = -2, - /datum/reagent/toxin/carpotoxin = -5) - - virus_suspectibility = 1 - resulting_atoms = list(/mob/living/basic/cow = 1) - -/datum/micro_organism/cell_line/moonicorn - desc = "Fairyland Bovine stem cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/nutriment, - /datum/reagent/drug/mushroomhallucinogen, - ) - - supplementary_reagents = list( - /datum/reagent/growthserum = 4, - /datum/reagent/consumable/tinlux = 2, - /datum/reagent/consumable/vitfro = 2, - /datum/reagent/consumable/astrotame = 1, - ) - - suppressive_reagents = list( - /datum/reagent/toxin = -2, - /datum/reagent/toxin/carpotoxin = -5, - /datum/reagent/consumable/coffee = -3, - /datum/reagent/consumable/triple_citrus = -5, - ) - - virus_suspectibility = 1 - resulting_atoms = list(/mob/living/basic/cow/moonicorn = 1) - -/datum/micro_organism/cell_line/cat - desc = "Feliform cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/liquidgibs) - - supplementary_reagents = list( - /datum/reagent/growthserum = 3, - /datum/reagent/consumable/nutriment/vitamin = 2, - /datum/reagent/medicine/oculine = 2, - /datum/reagent/consumable/milk = 1) //milkies - - suppressive_reagents = list( - /datum/reagent/consumable/coco = -4, - /datum/reagent/consumable/hot_coco = -2, - /datum/reagent/consumable/chocolatepudding = -2, - /datum/reagent/consumable/milk/chocolate_milk = -1) - - virus_suspectibility = 1.5 - resulting_atoms = list(/mob/living/simple_animal/pet/cat = 1) //The basic cat mobs are all male, so you mightt need a gender swap potion if you want to fill the fortress with kittens. - -/datum/micro_organism/cell_line/corgi - desc = "Canid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/liquidgibs) - - supplementary_reagents = list( - /datum/reagent/growthserum = 3, - /datum/reagent/barbers_aid = 3, - /datum/reagent/consumable/nutriment/vitamin = 2) - - suppressive_reagents = list( - /datum/reagent/consumable/garlic = -2, - /datum/reagent/consumable/tearjuice = -3, - /datum/reagent/consumable/coco = -2) - - virus_suspectibility = 1 - resulting_atoms = list(/mob/living/simple_animal/pet/dog/corgi = 1) - -/datum/micro_organism/cell_line/pug - desc = "Squat canid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/liquidgibs) - - supplementary_reagents = list( - /datum/reagent/growthserum = 2, - /datum/reagent/consumable/nutriment/vitamin = 3) - - suppressive_reagents = list( - /datum/reagent/consumable/garlic = -2, - /datum/reagent/consumable/tearjuice = -3, - /datum/reagent/consumable/coco = -2) - - virus_suspectibility = 3 - resulting_atoms = list(/mob/living/simple_animal/pet/dog/pug = 1) - -/datum/micro_organism/cell_line/bear //bears can't really compete directly with more powerful creatures, so i made it possible to grow them real fast. - desc = "Ursine cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/liquidgibs, - /datum/reagent/medicine/c2/synthflesh) //Nuke this if the dispenser becomes xenobio meta. - - supplementary_reagents = list( - /datum/reagent/consumable/honey = 8, //Hunny. - /datum/reagent/growthserum = 5, - /datum/reagent/medicine/morphine = 4, //morphine is a vital nutrient for space bears, but it is better as a supplemental for gameplay reasons. - /datum/reagent/consumable/nutriment/vitamin = 3) - - suppressive_reagents = list( - /datum/reagent/consumable/condensedcapsaicin = -4, //bear mace, steal it from the sec checkpoint. - /datum/reagent/toxin/carpotoxin = -2, - /datum/reagent/medicine/insulin = -2) //depletes hunny. - - virus_suspectibility = 2 - resulting_atoms = list(/mob/living/simple_animal/hostile/bear = 1) - -/datum/micro_organism/cell_line/carp - desc = "Cyprinid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/nutriment) - - supplementary_reagents = list( - /datum/reagent/consumable/cornoil = 4, //Carp are oily fish - /datum/reagent/toxin/carpotoxin = 3, - /datum/reagent/consumable/cooking_oil = 2, - /datum/reagent/consumable/nutriment/vitamin = 2) - - suppressive_reagents = list( - /datum/reagent/toxin/bungotoxin = -6, - /datum/reagent/mercury = -4, - /datum/reagent/oxygen = -3) - - virus_suspectibility = 2 - resulting_atoms = list(/mob/living/simple_animal/hostile/carp = 1) - -/datum/micro_organism/cell_line/megacarp - desc = "Cartilaginous cyprinid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/medicine/c2/synthflesh, - /datum/reagent/consumable/nutriment) - - supplementary_reagents = list( - /datum/reagent/consumable/cornoil = 4, - /datum/reagent/growthserum = 3, - /datum/reagent/toxin/carpotoxin = 2, - /datum/reagent/consumable/cooking_oil = 2, - /datum/reagent/consumable/nutriment/vitamin = 2) - - suppressive_reagents = list( - /datum/reagent/toxin/bungotoxin = -6, - /datum/reagent/oxygen = -3) - - virus_suspectibility = 1 - resulting_atoms = list(/mob/living/simple_animal/hostile/carp/megacarp = 1) - -/datum/micro_organism/cell_line/snake - desc = "Ophidic cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/liquidgibs) - - supplementary_reagents = list( - /datum/reagent/growthserum = 3, - /datum/reagent/consumable/nutriment/peptides = 3, - /datum/reagent/consumable/eggyolk = 2, - /datum/reagent/consumable/nutriment/vitamin = 2) - - suppressive_reagents = list( - /datum/reagent/consumable/corn_syrup = -6, - /datum/reagent/sulfur = -3) //sulfur repels snakes according to professor google. - - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/snake = 1) - - -/////////////////////////////////////////// -/// SLIMES, OOZES & BLOBS /// -////////////////////////////////////////// - -/datum/micro_organism/cell_line/slime - desc = "Slime particles" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - - supplementary_reagents = list( - /datum/reagent/toxin/slimejelly = 2, - /datum/reagent/liquidgibs = 2, - /datum/reagent/consumable/enzyme = 1) - - suppressive_reagents = list( - /datum/reagent/consumable/frostoil = -4, - /datum/reagent/cryostylane = -4, - /datum/reagent/medicine/morphine = -2, - /datum/reagent/consumable/ice = -2) //Brrr! - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/slime = 1) - -/datum/micro_organism/cell_line/blob_spore //shitty cell line to dilute the pool, feel free to make easier to grow if it doesn't interfer with growing the powerful mobs enough. - desc = "Immature blob spores" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - - supplementary_reagents = list( - /datum/reagent/consumable/nutriment/vitamin = 3, - /datum/reagent/liquidgibs = 2, - /datum/reagent/sulfur = 2) - - suppressive_reagents = list( - /datum/reagent/consumable/tinlux = -6, - /datum/reagent/napalm = -4) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobspore/independent = 2) //These are useless so we might as well spawn 2. - -/datum/micro_organism/cell_line/blobbernaut - desc = "Blobular myocytes" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/medicine/c2/synthflesh, - /datum/reagent/sulfur) //grind flares to get this - - supplementary_reagents = list( - /datum/reagent/growthserum = 3, - /datum/reagent/consumable/nutriment/vitamin = 2, - /datum/reagent/liquidgibs = 2, - /datum/reagent/consumable/eggyolk = 2, - /datum/reagent/consumable/shamblers = 1) - - suppressive_reagents = list(/datum/reagent/consumable/tinlux = -6) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/blob/blobbernaut/independent = 1) - -/datum/micro_organism/cell_line/gelatinous_cube - desc = "Cubic ooze particles" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/toxin/slimejelly, - /datum/reagent/yuck, - /datum/reagent/consumable/enzyme) //Powerful enzymes helps the cube digest prey. - - supplementary_reagents = list( - /datum/reagent/water/hollowwater = 4, - /datum/reagent/consumable/corn_syrup = 3, - /datum/reagent/gold = 2, //This is why they eat so many adventurers. - /datum/reagent/consumable/nutriment/peptides = 2, - /datum/reagent/consumable/potato_juice = 1, - /datum/reagent/liquidgibs = 1, - /datum/reagent/consumable/nutriment/vitamin = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/minttoxin = -3, - /datum/reagent/consumable/frostoil = -2, - /datum/reagent/consumable/ice = -1) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/ooze/gelatinous = 1) - -/datum/micro_organism/cell_line/sholean_grapes - desc = "Globular ooze particles" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/toxin/slimejelly, - /datum/reagent/yuck, - /datum/reagent/consumable/vitfro) - - supplementary_reagents = list( - /datum/reagent/medicine/omnizine = 4, - /datum/reagent/consumable/nutriment/peptides = 3, - /datum/reagent/consumable/corn_syrup = 2, - /datum/reagent/consumable/ethanol/squirt_cider = 2, - /datum/reagent/consumable/doctor_delight = 1, - /datum/reagent/medicine/salglu_solution = 1, - /datum/reagent/liquidgibs = 1, - /datum/reagent/consumable/nutriment/vitamin = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/carpotoxin = -3, - /datum/reagent/toxin/coffeepowder = -2, - /datum/reagent/consumable/frostoil = -2, - /datum/reagent/consumable/ice = -1) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/ooze/grapes = 1) - -//////////////////// -//// MISC //// -//////////////////// -/datum/micro_organism/cell_line/cockroach //nuisance cell line designed to complicate the growing of slime type cell lines. - desc = "Blattodeoid anthropod cells" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - supplementary_reagents = list( - /datum/reagent/yuck = 4, - /datum/reagent/growthserum = 2, - /datum/reagent/toxin/slimejelly = 2, - /datum/reagent/consumable/nutriment/vitamin = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/pestkiller = -2, - /datum/reagent/consumable/poisonberryjuice = -4, - /datum/reagent/consumable/ethanol/bug_spray = -4) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/basic/cockroach = 5) - -/datum/micro_organism/cell_line/glockroach - desc = "Gattodeoid anthropod cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/drug/maint/powder, - /datum/reagent/iron) - - supplementary_reagents = list( - /datum/reagent/gunpowder = 6, - /datum/reagent/drug/maint/tar = 4, - /datum/reagent/yuck = 2, - /datum/reagent/growthserum = 2) - - suppressive_reagents = list( - /datum/reagent/toxin/pestkiller = -2, - /datum/reagent/consumable/coffee = -3, //a quick google search said roaches don't like coffee grounds, and I needed a different suppressive reagent - /datum/reagent/consumable/ethanol/bug_spray = -4) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/basic/cockroach/glockroach = 2) - -/datum/micro_organism/cell_line/hauberoach - desc = "Hattodeoid anthropod cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/ethanol/beer, - /datum/reagent/iron) - - supplementary_reagents = list( - /datum/reagent/gunpowder = 6, - /datum/reagent/medicine/pen_acid = 4, //Prussian Blue is an antidote for radioactive thallium poisoning, among other things. The pickelhaube was worn by Prussian/German officers. You can tell I'm running out of ideas here. - /datum/reagent/yuck = 2, - /datum/reagent/blood = 2) - - suppressive_reagents = list( - /datum/reagent/toxin/pestkiller = -2, - /datum/reagent/consumable/coffee = -3, - /datum/reagent/consumable/ethanol/cognac = -4) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/basic/cockroach/hauberoach = 2) - -/datum/micro_organism/cell_line/pine - desc = "Coniferous plant cells" - required_reagents = list( - /datum/reagent/ammonia, - /datum/reagent/ash, - /datum/reagent/plantnutriment/robustharvestnutriment) //A proper source of phosphorous like would be thematically more appropriate but this is what we have. - - supplementary_reagents = list( - /datum/reagent/saltpetre = 5, - /datum/reagent/carbondioxide = 2, - /datum/reagent/consumable/nutriment = 2, - /datum/reagent/consumable/space_cola = 2, //A little extra phosphorous - /datum/reagent/water/holywater = 2, - /datum/reagent/water = 1, - /datum/reagent/cellulose = 1) - - suppressive_reagents = list(/datum/reagent/toxin/plantbgone = -8) - - virus_suspectibility = 1 - resulting_atoms = list(/mob/living/simple_animal/hostile/tree = 1) - -/datum/micro_organism/cell_line/vat_beast - desc = "Hypergenic xenocytes" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/nutriment/vitamin, - /datum/reagent/consumable/nutriment/peptides, - /datum/reagent/consumable/liquidelectricity/enriched, - /datum/reagent/growthserum, - /datum/reagent/yuck) - - supplementary_reagents = list( - /datum/reagent/medicine/rezadone = 3, - /datum/reagent/consumable/entpoly = 3, - /datum/reagent/consumable/red_queen = 2, - /datum/reagent/consumable/peachjuice = 2, - /datum/reagent/uranium = 1, - /datum/reagent/liquidgibs = 1) - - suppressive_reagents = list( - /datum/reagent/consumable/salt = -3, - /datum/reagent/medicine/c2/syriniver = -2) - - virus_suspectibility = 0.5 - resulting_atoms = list(/mob/living/simple_animal/hostile/vatbeast = 1) - -/datum/micro_organism/cell_line/vat_beast/succeed_growing(obj/machinery/plumbing/growing_vat/vat) - . = ..() - qdel(vat) - -//randomizes from the netherworld pool! -/datum/micro_organism/cell_line/netherworld - desc = "Aberrant residue" - required_reagents = list(//theme here: very odd requirements - /datum/reagent/water/hollowwater,//geyser reagent, so plentiful when found - /datum/reagent/consumable/ethanol/wizz_fizz, //EZ bartender drink, like brainless - /datum/reagent/yuck) //since the other two are easy to make tons of, this is kind of a limiter - - supplementary_reagents = list( //all of these are just geyser stuff, rated by their rarity - /datum/reagent/wittel = 10, //stupid rare - /datum/reagent/medicine/omnizine/protozine = 5, - /datum/reagent/plasma_oxide = 3, - /datum/reagent/clf3 = 1)//since this is also chemistry it's worth near nothing - - suppressive_reagents = list(//generics you would regularly put in a vat kill abberant residue - /datum/reagent/consumable/nutriment/peptides = -6, - /datum/reagent/consumable/nutriment/protein = -4, - /datum/reagent/consumable/nutriment = -3, - /datum/reagent/liquidgibs = -2) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/netherworld = 1) - -/datum/micro_organism/cell_line/netherworld/succeed_growing(obj/machinery/plumbing/growing_vat/vat) - var/random_result = pick(typesof(/mob/living/simple_animal/hostile/netherworld)) //i looked myself, pretty much all of them are reasonably strong and somewhat on the same level. except migo is the jackpot and the blank body is whiff. - resulting_atoms = list() - resulting_atoms[random_result] = 1 - return ..() - -/datum/micro_organism/cell_line/clown/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) - vat.visible_message(span_warning("The biological sample in [vat] seems to have created something horrific!")) - - var/mob/selected_mob = pick(list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/slow, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown)) - - new selected_mob(get_turf(vat)) - if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) - return - QDEL_NULL(vat.biological_sample) - -/datum/micro_organism/cell_line/clown/bananaclown - desc = "Clown bits with banana chunks" - - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/banana) - - supplementary_reagents = list( - /datum/reagent/saltpetre = 4, - /datum/reagent/ammonia = 3, - /datum/reagent/carbondioxide = 3, - /datum/reagent/medicine/coagulant/banana_peel = 2, - /datum/reagent/plantnutriment/robustharvestnutriment = 1) - - suppressive_reagents = list( - /datum/reagent/consumable/clownstears = -8, - /datum/reagent/toxin/plantbgone = -4, - /datum/reagent/consumable/ethanol/silencer = -3, - /datum/reagent/consumable/nothing = -2, - /datum/reagent/fuel/oil = -1) - - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/banana = 1) - -/datum/micro_organism/cell_line/clown/glutton - desc = "hyperadipogenic clown stem cells" - - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/banana, - /datum/reagent/medicine/c2/synthflesh) - //r/chonkers - supplementary_reagents = list( - /datum/reagent/consumable/vanillapudding = 8, - /datum/reagent/growthserum = 6, - /datum/reagent/consumable/nutriment/peptides = 4, - /datum/reagent/consumable/cornoil = 3, - /datum/reagent/consumable/cooking_oil = 1, - /datum/reagent/consumable/space_cola = 1) - - suppressive_reagents = list( - /datum/reagent/consumable/clownstears = -8, - /datum/reagent/toxin/minttoxin = -6, - /datum/reagent/consumable/ethanol/silencer = -3, - /datum/reagent/consumable/ethanol/fernet = -3, - /datum/reagent/toxin/lipolicide = -3, - /datum/reagent/consumable/nothing = -2, - /datum/reagent/toxin/bad_food = -1) - - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/mutant/glutton = 1) - -/datum/micro_organism/cell_line/clown/longclown - desc = "long clown bits" - - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/banana) - - supplementary_reagents = list( - /datum/reagent/drug/happiness = 5, - /datum/reagent/toxin/mimesbane = 4, - /datum/reagent/consumable/laughter = 3, - /datum/reagent/nitrous_oxide = 2) - - suppressive_reagents = list( - /datum/reagent/consumable/clownstears = -8, - /datum/reagent/consumable/ethanol/beepsky_smash = -3, - /datum/reagent/consumable/ethanol/silencer = -3, - /datum/reagent/toxin/mutetoxin = -3, - /datum/reagent/consumable/nothing = -2, - /datum/reagent/sulfur = -1) - - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/clown/longface = 1) - -/datum/micro_organism/cell_line/frog - desc = "amphibian cells" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - - supplementary_reagents = list( - /datum/reagent/ants = 3, - /datum/reagent/consumable/eggwhite= 2, - /datum/reagent/consumable/nutriment/vitamin = 1,) - - suppressive_reagents = list( - /datum/reagent/toxin/carpotoxin = -3, - /datum/reagent/toxin/bungotoxin = -3, - /datum/reagent/toxin/spore = -3, - /datum/reagent/toxin/plantbgone = -2, //GAY FROGS - /datum/reagent/drying_agent = -2, - /datum/reagent/consumable/mold = -2, - /datum/reagent/toxin = -1) - - virus_suspectibility = 0.5 - resulting_atoms = list(/mob/living/simple_animal/hostile/retaliate/frog = 1) - -/datum/micro_organism/cell_line/walking_mushroom - desc = "motile fungal hyphae" - required_reagents = list(/datum/reagent/consumable/nutriment/protein) - - supplementary_reagents = list( - /datum/reagent/toxin/polonium = 6, - /datum/reagent/consumable/corn_syrup = 3, - /datum/reagent/consumable/mushroom_tea = 3, - /datum/reagent/toxin/coffeepowder = 2, - /datum/reagent/consumable/nuka_cola = 2, - /datum/reagent/consumable/mold = 2, - /datum/reagent/consumable/sugar = 1, - /datum/reagent/cellulose = 1) - - suppressive_reagents = list( - /datum/reagent/lead = -4, - /datum/reagent/consumable/garlic = -3, - /datum/reagent/toxin/plasma = -2, - /datum/reagent/flash_powder = -2, - /datum/reagent/pax = -2, - /datum/reagent/copper = -1) - - virus_suspectibility = 0 - resulting_atoms = list(/mob/living/simple_animal/hostile/mushroom = 1) - -/datum/micro_organism/cell_line/queen_bee - desc = "aphid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/consumable/corn_syrup) - - supplementary_reagents = list( - /datum/reagent/consumable/honey = 4, - /datum/reagent/consumable/korta_nectar = 3, - /datum/reagent/consumable/red_queen = 3, - /datum/reagent/consumable/ethanol/champagne = 2, - /datum/reagent/consumable/ethanol/sugar_rush = 2, - /datum/reagent/consumable/sugar = 1, - /datum/reagent/consumable/lemonade = 1, - /datum/reagent/consumable/nutriment/vitamin = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/carpotoxin = -3, - /datum/reagent/toxin/pestkiller = -2, - /datum/reagent/consumable/potato_juice = -2, - /datum/reagent/drug/nicotine = -1) - - virus_suspectibility = 0 - resulting_atoms = list(/obj/item/queen_bee = 1) - -/datum/micro_organism/cell_line/queen_bee/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) //we love job hazards - vat.visible_message(span_warning("You hear angry buzzing coming from the inside of the vat!")) - for(var/i in 1 to 5) - new /mob/living/simple_animal/hostile/bee(get_turf(vat)) - if(SEND_SIGNAL(vat.biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) & SPARE_SAMPLE) - return - QDEL_NULL(vat.biological_sample) - -/datum/micro_organism/cell_line/leaper - desc = "atypical amphibian cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/ants, - /datum/reagent/consumable/eggyolk, - /datum/reagent/medicine/c2/synthflesh) - - supplementary_reagents = list( - /datum/reagent/growthserum = 4, - /datum/reagent/drug/blastoff = 3, - /datum/reagent/drug/space_drugs = 2, - /datum/reagent/consumable/ethanol/eggnog = 2, - /datum/reagent/consumable/vanilla = 2, - /datum/reagent/consumable/banana = 1, - /datum/reagent/consumable/nutriment/vitamin = 1) - - suppressive_reagents = list( - /datum/reagent/toxin/cyanide = -5, - /datum/reagent/consumable/mold = -2, - /datum/reagent/toxin/spore = -1) - - resulting_atoms = list(/mob/living/simple_animal/hostile/jungle/leaper = 1) - -/datum/micro_organism/cell_line/mega_arachnid - desc = "pseudoarachnoid cells" - required_reagents = list( - /datum/reagent/consumable/nutriment/protein, - /datum/reagent/ants, - /datum/reagent/medicine/omnizine) - - supplementary_reagents = list( - /datum/reagent/toxin/venom = 6, - /datum/reagent/drug/kronkaine = 4, - /datum/reagent/consumable/nutriment/peptides = 3, - /datum/reagent/consumable/ethanol/squirt_cider = 2, - /datum/reagent/consumable/nutraslop = 2, - /datum/reagent/consumable/nutriment/vitamin = 1, - /datum/reagent/toxin/plasma = 1, - /datum/reagent/consumable/nutriment/organ_tissue = 1, - /datum/reagent/liquidgibs = 1, - /datum/reagent/consumable/enzyme = 1) - - suppressive_reagents = list( - /datum/reagent/consumable/ethanol/bug_spray = -3, - /datum/reagent/drug/nicotine = -1, - /datum/reagent/toxin/pestkiller = -1) - - resulting_atoms = list(/mob/living/simple_animal/hostile/jungle/mega_arachnid = 1) - -#undef VAT_GROWTH_RATE diff --git a/code/modules/research/xenobiology/vatgrowing/samples/viruses/_virus.dm b/code/modules/research/xenobiology/vatgrowing/samples/viruses/_virus.dm deleted file mode 100644 index d33e2243fb95..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/samples/viruses/_virus.dm +++ /dev/null @@ -1,3 +0,0 @@ -///A micro_organism that supports the ability to be converted to a real virus, allowing virology to get new symptoms -/datum/micro_organism/virus - desc = "A virus of unknown origin" diff --git a/code/modules/research/xenobiology/vatgrowing/swab.dm b/code/modules/research/xenobiology/vatgrowing/swab.dm deleted file mode 100644 index 92dd767ea16d..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/swab.dm +++ /dev/null @@ -1,19 +0,0 @@ -///Tool capable of taking biological samples from mobs -/obj/item/swab - name = "swab" - desc = "Some men use these for different reasons." - icon = 'icons/obj/xenobiology/vatgrowing.dmi' - icon_state = "swab" - w_class = WEIGHT_CLASS_TINY - -///Adds the swabbing component to the biopsy tool -/obj/item/swab/Initialize(mapload) - . = ..() - AddComponent(/datum/component/swabbing, TRUE, TRUE, FALSE, null, CALLBACK(src, PROC_REF(update_swab_icon)), max_items = 1) - -/obj/item/swab/proc/update_swab_icon(overlays, list/swabbed_items) - if(LAZYLEN(swabbed_items)) - var/datum/biological_sample/sample = LAZYACCESS(swabbed_items, 1) //Use the first one as our target - var/mutable_appearance/swab_overlay = mutable_appearance(icon, "swab_[sample.sample_color]") - swab_overlay.appearance_flags = RESET_COLOR - overlays += swab_overlay diff --git a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm deleted file mode 100644 index af6d40878da3..000000000000 --- a/code/modules/research/xenobiology/vatgrowing/vatgrower.dm +++ /dev/null @@ -1,138 +0,0 @@ -///Used to make mobs from microbiological samples. Grow grow grow. -/obj/machinery/plumbing/growing_vat - name = "growing vat" - desc = "Tastes just like the chef's soup." - icon_state = "growing_vat" - buffer = 300 - zmm_flags = ZMM_MANGLE_PLANES - ///List of all microbiological samples in this soup. - var/datum/biological_sample/biological_sample - ///If the vat will restart the sample upon completion - var/resampler_active = FALSE - -///Add that sexy demnand component -/obj/machinery/plumbing/growing_vat/Initialize(mapload, bolt) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt) - -/obj/machinery/plumbing/growing_vat/create_reagents(max_vol, flags) - . = ..() - RegisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) - RegisterSignal(reagents, COMSIG_PARENT_QDELETING, PROC_REF(on_reagents_del)) - -/// Handles properly detaching signal hooks. -/obj/machinery/plumbing/growing_vat/proc/on_reagents_del(datum/reagents/reagents) - SIGNAL_HANDLER - UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_PARENT_QDELETING)) - return NONE - -///When we process, we make use of our reagents to try and feed the samples we have. -/obj/machinery/plumbing/growing_vat/process() - if(!is_operational) - return - if(!biological_sample) - return - if(biological_sample.handle_growth(src)) - if(!prob(10)) - return - playsound(loc, 'sound/effects/slosh.ogg', 25, TRUE) - audible_message(pick(list(span_notice("[src] grumbles!"), span_notice("[src] makes a splashing noise!"), span_notice("[src] sloshes!")))) - -///Handles the petri dish depositing into the vat. -/obj/machinery/plumbing/growing_vat/attacked_by(obj/item/I, mob/living/user) - if(!istype(I, /obj/item/petri_dish)) - return ..() - - var/obj/item/petri_dish/petri = I - - if(!petri.sample) - return ..() - - if(biological_sample) - to_chat(user, span_warning("There is already a sample in the vat!")) - return - deposit_sample(user, petri) - -///Creates a clone of the supplied sample and puts it in the vat -/obj/machinery/plumbing/growing_vat/proc/deposit_sample(mob/user, obj/item/petri_dish/petri) - biological_sample = new - for(var/datum/micro_organism/m in petri.sample.micro_organisms) - biological_sample.micro_organisms += new m.type() - biological_sample.sample_layers = petri.sample.sample_layers - biological_sample.sample_color = petri.sample.sample_color - to_chat(user, span_warning("You put some of the sample in the vat!")) - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - update_appearance() - RegisterSignal(biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED, PROC_REF(on_sample_growth_completed)) - -///Adds text for when there is a sample in the vat -/obj/machinery/plumbing/growing_vat/examine_more(mob/user) - . = ..() - if(!biological_sample) - return - . += span_notice("It seems to have a sample in it!") - for(var/i in biological_sample.micro_organisms) - var/datum/micro_organism/MO = i - . += MO.get_details(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER)) - -/obj/machinery/plumbing/growing_vat/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - . = ..() - QDEL_NULL(biological_sample) - -/// Call update icon when reagents change to update the reagent content icons. Eats signal args. -/obj/machinery/plumbing/growing_vat/proc/on_reagent_change(datum/reagents/holder, ...) - SIGNAL_HANDLER - update_appearance() - return NONE - -///Adds overlays to show the reagent contents -/obj/machinery/plumbing/growing_vat/update_overlays() - . = ..() - var/static/image/on_overlay - var/static/image/off_overlay - var/static/image/emissive_overlay - if(isnull(on_overlay)) - on_overlay = iconstate2appearance(icon, "growing_vat_on") - off_overlay = iconstate2appearance(icon, "growing_vat_off") - emissive_overlay = emissive_appearance(icon, "growing_vat_glow", alpha = src.alpha) - . += emissive_overlay - if(is_operational) - if(resampler_active) - . += on_overlay - else - . += off_overlay - if(!reagents.total_volume) - return - var/reagentcolor = mix_color_from_reagents(reagents.reagent_list) - var/mutable_appearance/base_overlay = mutable_appearance(icon, "vat_reagent") - base_overlay.appearance_flags = RESET_COLOR - base_overlay.color = reagentcolor - . += base_overlay - if(biological_sample && is_operational) - var/mutable_appearance/bubbles_overlay = mutable_appearance(icon, "vat_bubbles") - . += bubbles_overlay - -/obj/machinery/plumbing/growing_vat/attack_hand(mob/living/user, list/modifiers) - . = ..() - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - if(obj_flags & EMAGGED) - return - resampler_active = !resampler_active - balloon_alert_to_viewers("resampler [resampler_active ? "activated" : "deactivated"]") - update_appearance() - -/obj/machinery/plumbing/growing_vat/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - obj_flags |= EMAGGED - playsound(src, SFX_SPARKS, 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - to_chat(user, span_warning("You overload [src]'s resampling circuit.")) - flick("growing_vat_emagged", src) - -/obj/machinery/plumbing/growing_vat/proc/on_sample_growth_completed() - SIGNAL_HANDLER - if(resampler_active) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(src), 'sound/effects/servostep.ogg', 100, 1), 1.5 SECONDS) - biological_sample.reset_sample() - return SPARE_SAMPLE - UnregisterSignal(biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED) diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index d289f14b1f4c..baaa3b87ee61 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -17,7 +17,7 @@ else return -/mob/camera/ai_eye/remote/xenobio/can_z_move(direction, turf/start, turf/destination, z_move_flags = NONE, mob/living/rider) +/mob/camera/ai_eye/remote/xenobio/can_z_move(direction, turf/start, z_move_flags = NONE, mob/living/rider) . = ..() if(!.) return @@ -322,17 +322,17 @@ ..() //scans slimes -/mob/living/simple_animal/slime/CtrlClick(mob/user) +/mob/living/simple_animal/slime/CtrlClick(mob/user, list/params) SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) ..() //picks up dead monkies -/mob/living/carbon/human/species/monkey/CtrlClick(mob/user) +/mob/living/carbon/human/species/monkey/CtrlClick(mob/user, list/params) SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) ..() //places monkies -/turf/open/CtrlClick(mob/user) +/turf/open/CtrlClick(mob/user, list/params) SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) ..() diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 2672cb99187c..3bb9f5b672eb 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -8,7 +8,6 @@ force = 0 w_class = WEIGHT_CLASS_TINY throwforce = 0 - throw_speed = 3 throw_range = 6 grind_results = list() var/Uses = 1 ///uses before it goes inert @@ -311,12 +310,12 @@ if(SLIME_ACTIVATE_MINOR) to_chat(user, span_notice("You activate [src]. Your genome feels more stable!")) user.adjustCloneLoss(-15) - user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) + user.reagents.add_reagent(/datum/reagent/medicine/ryetalyn, 10) user.reagents.add_reagent(/datum/reagent/medicine/potass_iodide, 10) return 250 if(SLIME_ACTIVATE_MAJOR) - user.reagents.create_foam(/datum/effect_system/foam_spread,20) + user.reagents.create_foam(/datum/effect_system/fluid_spread/foam, 20) user.visible_message(span_danger("Foam spews out from [user]'s skin!"), span_warning("You activate [src], and foam bursts out of your skin!")) return 600 @@ -349,28 +348,6 @@ effectmod = "gentle" activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) -/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(user.gender != MALE && user.gender != FEMALE) - to_chat(user, span_warning("You can't swap your gender!")) - return - - if(user.gender == MALE) - user.gender = FEMALE - user.visible_message(span_boldnotice("[user] suddenly looks more feminine!"), span_boldwarning("You suddenly feel more feminine!")) - else - user.gender = MALE - user.visible_message(span_boldnotice("[user] suddenly looks more masculine!"), span_boldwarning("You suddenly feel more masculine!")) - return 100 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message(span_warning("[user]'s skin starts flashing hypnotically..."), span_notice("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) - return 600 - /obj/item/slime_extract/green name = "green slime extract" icon_state = "green slime extract" @@ -463,35 +440,6 @@ return to_chat(user, span_notice("You stop feeding [src], and the feeling passes.")) -/obj/item/slime_extract/adamantine - name = "adamantine slime extract" - icon_state = "adamantine slime extract" - effectmod = "crystalline" - activate_reagents = list(/datum/reagent/toxin/plasma) - -/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(species.armor > 0) - to_chat(user, span_warning("Your skin is already hardened!")) - return - to_chat(user, span_notice("You feel your skin harden and become more resistant.")) - species.armor += 25 - addtimer(CALLBACK(src, PROC_REF(reset_armor), species), 1200) - return 450 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, span_warning("You feel your body rapidly crystallizing...")) - if(do_after(user, user, 120)) - to_chat(user, span_warning("You feel solid.")) - user.set_species(pick(/datum/species/golem/adamantine)) - return - to_chat(user, span_notice("You stop feeding [src], and your body returns to its slimelike state.")) - -/obj/item/slime_extract/adamantine/proc/reset_armor(datum/species/jelly/luminescent/species) - if(istype(species)) - species.armor -= 25 - /obj/item/slime_extract/bluespace name = "bluespace slime extract" icon_state = "bluespace slime extract" @@ -564,7 +512,7 @@ /obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - user.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) + user.reagents.add_reagent(/datum/reagent/medicine/dexalin,15) to_chat(user, span_notice("You feel like you don't need to breathe!")) return 150 @@ -675,8 +623,7 @@ if (!newname) newname = "Pet Slime" - M.name = newname - M.real_name = newname + M.set_real_name(newname) qdel(src) /obj/item/slimepotion/slime/sentience @@ -1003,28 +950,6 @@ qdel(src) -/obj/item/slimepotion/slime/slimeradio - name = "bluespace radio potion" - desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves." - icon = 'icons/obj/chemical.dmi' - icon_state = "potgrey" - -/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user) - if(!ismob(M)) - return - if(!isanimal(M)) - to_chat(user, span_warning("[M] is too complex for the potion!")) - return - if(M.stat) - to_chat(user, span_warning("[M] is dead!")) - return - - to_chat(user, span_notice("You feed the potion to [M].")) - to_chat(M, span_notice("Your mind tingles as you are fed the potion. You can hear radio waves now!")) - var/obj/item/implant/radio/slime/imp = new(src) - imp.implant(M, user) - qdel(src) - ///Definitions for slime products that don't have anywhere else to go (Floor tiles, blueprints). /obj/item/stack/tile/bluespace @@ -1037,7 +962,6 @@ force = 6 mats_per_unit = list(/datum/material/iron=500) throwforce = 10 - throw_speed = 3 throw_range = 7 flags_1 = CONDUCT_1 max_amount = 60 diff --git a/code/modules/screen_alerts/_screen_alerts.dm b/code/modules/screen_alerts/_screen_alerts.dm new file mode 100644 index 000000000000..56d72f74c768 --- /dev/null +++ b/code/modules/screen_alerts/_screen_alerts.dm @@ -0,0 +1,150 @@ +/** + * proc for playing a screen_text on a mob. + * enqueues it if a screen text is running and plays i otherwise + * Arguments: + * * text: text we want to be displayed + * * alert_type: typepath for screen text type we want to play here + */ +/mob/proc/play_screen_text(text, alert = /atom/movable/screen/text/screen_text) + set waitfor = FALSE + if(!client) + return + + var/atom/movable/screen/text/screen_text/text_box + if(ispath(alert)) + text_box = new alert() + else + text_box = alert + + if(text) + text_box.text_to_play = text + + LAZYADD(client.screen_texts, text_box) + text_box.owner_ref = WEAKREF(client) + + if(LAZYLEN(client.screen_texts) == 1) //lets only play one at a time, for thematic effect and prevent overlap + text_box.play_to_client() + return + +/atom/movable/screen/text/screen_text + icon = null + icon_state = null + alpha = 255 + plane = HUD_PLANE + + maptext_height = 64 + maptext_width = 480 + maptext_x = 0 + maptext_y = 0 + screen_loc = "LEFT,TOP-3" + + ///A weakref to the client this belongs to + var/datum/weakref/owner_ref + + ///Time taken to fade in as we start printing text + var/fade_in_time = 0 + ///Time before fade out after printing is finished + var/fade_out_delay = 8 SECONDS + ///Time taken when fading out after fade_out_delay + var/fade_out_time = 0.5 SECONDS + ///delay between playing each letter. in general use 1 for fluff and 0.5 for time sensitive messsages + var/play_delay = 1 + ///letters to update by per text to per play_delay + var/letters_per_update = 1 + + ///opening styling for the message + var/style_open = "" + ///closing styling for the message + var/style_close = "" + ///var for the text we are going to play + var/text_to_play + + /// Should this automatically end? + var/auto_end = TRUE + +/atom/movable/screen/text/screen_text/Destroy() + if(owner_ref) + remove_from_screen() + return ..() + +/** + * proc for actually playing this screen_text on a mob. + */ +/atom/movable/screen/text/screen_text/proc/play_to_client() + + var/client/owner = owner_ref.resolve() + if(!owner) + return + + owner.screen += src + + if(fade_in_time) + animate(src, alpha = 255) + + var/list/lines_to_skip = list() + var/static/html_locate_regex = regex("<.*>") + var/tag_position = findtext(text_to_play, html_locate_regex) + var/reading_tag = TRUE + + while(tag_position) + if(reading_tag) + if(text_to_play[tag_position] == ">") + reading_tag = FALSE + lines_to_skip += tag_position + else + lines_to_skip += tag_position + tag_position++ + else + tag_position = findtext(text_to_play, html_locate_regex, tag_position) + reading_tag = TRUE + + // tag_position = findtext(text_to_play, " ") + // while(tag_position) + // lines_to_skip.Add(tag_position, tag_position+1, tag_position+2, tag_position+3, tag_position+4, tag_position+5) + // tag_position = tag_position + 6 + // tag_position = findtext(text_to_play, " ", tag_position) + + for(var/letter = 2 to length(text_to_play) + letters_per_update step letters_per_update) + if(letter in lines_to_skip) + continue + + maptext = "[style_open][copytext_char(text_to_play, 1, letter)][style_close]" + if(QDELETED(src)) + return + sleep(play_delay) + + if(auto_end) + addtimer(CALLBACK(src, PROC_REF(fade_out)), fade_out_delay) + +///handles post-play effects like fade out after the fade out delay +/atom/movable/screen/text/screen_text/proc/fade_out() + if(!fade_out_time) + end_play() + return + + animate(src, alpha = 0, time = fade_out_time) + addtimer(CALLBACK(src, PROC_REF(end_play)), fade_out_time) + +///ends the play then deletes this screen object and plalys the next one in queue if it exists +/atom/movable/screen/text/screen_text/proc/end_play() + remove_and_play_next() + qdel(src) + +/// Removes the text from the player's screen and plays the next one if present. +/atom/movable/screen/text/screen_text/proc/remove_and_play_next() + var/client/owner = owner_ref.resolve() + if(isnull(owner)) + return + + remove_from_screen() + if(!LAZYLEN(owner.screen_texts)) + return + owner.screen_texts[1].play_to_client() + +/atom/movable/screen/text/screen_text/proc/remove_from_screen() + var/client/owner = owner_ref.resolve() + if(isnull(owner)) + return + + owner.screen -= src + LAZYREMOVE(owner.screen_texts, src) diff --git a/code/modules/screen_alerts/atom_hud_text.dm b/code/modules/screen_alerts/atom_hud_text.dm new file mode 100644 index 000000000000..54427cb60c28 --- /dev/null +++ b/code/modules/screen_alerts/atom_hud_text.dm @@ -0,0 +1,15 @@ +/atom/movable/screen/text/screen_text/atom_hud + appearance_flags = parent_type::appearance_flags & ~(NO_CLIENT_COLOR) + screen_loc = "WEST+25%,CENTER+2" + style_open = "" + style_close = "" + + maptext_width = 128 + maptext_height = 256 + + maptext_x = -64 + maptext_y = -192 + + play_delay = 0.5 + + auto_end = FALSE diff --git a/code/modules/screen_alerts/picture_alert.dm b/code/modules/screen_alerts/picture_alert.dm new file mode 100644 index 000000000000..fb5684449a68 --- /dev/null +++ b/code/modules/screen_alerts/picture_alert.dm @@ -0,0 +1,22 @@ +/atom/movable/screen/text/screen_text/picture + maptext_x = 0 + maptext_y = 0 + style_open = "" + style_close = "" + + ///image that will display on the left of the screen alert + var/image_file = 'icons/hud/screen_alerts.dmi' + var/image_state + ///y offset of image + var/image_to_play_offset_y = 48 + ///x offset of image + var/image_to_play_offset_x = 32 + +/atom/movable/screen/text/screen_text/picture/Initialize(mapload) + . = ..() + overlays += image(image_file, image_state, pixel_y = image_to_play_offset_y, pixel_x = image_to_play_offset_x) + +/atom/movable/screen/text/screen_text/picture/hardsuit_visor + play_delay = 0.4 + style_open = "" + image_state = "exclamation" diff --git a/code/modules/screen_alerts/screen_alerts.dm b/code/modules/screen_alerts/screen_alerts.dm deleted file mode 100644 index ae4ed50581e5..000000000000 --- a/code/modules/screen_alerts/screen_alerts.dm +++ /dev/null @@ -1,96 +0,0 @@ -/** - * proc for playing a screen_text on a mob. - * enqueues it if a screen text is running and plays i otherwise - * Arguments: - * * text: text we want to be displayed - * * alert_type: typepath for screen text type we want to play here - */ -/mob/proc/play_screen_text(text, alert_type = /atom/movable/screen/text/screen_text) - if(!client) - return - var/atom/movable/screen/text/screen_text/text_box = new alert_type() - text_box.text_to_play = text - LAZYADD(client.screen_texts, text_box) - if(LAZYLEN(client.screen_texts) == 1) //lets only play one at a time, for thematic effect and prevent overlap - INVOKE_ASYNC(text_box, TYPE_PROC_REF(/atom/movable/screen/text/screen_text, play_to_client), client) - return - client.screen_texts += text_box - - -/atom/movable/screen/text/screen_text - icon = null - icon_state = null - alpha = 255 - plane = HUD_PLANE - - maptext_height = 64 - maptext_width = 480 - maptext_x = 0 - maptext_y = 0 - screen_loc = "LEFT,TOP-3" - - ///Time taken to fade in as we start printing text - var/fade_in_time = 0 - ///Time before fade out after printing is finished - var/fade_out_delay = 8 SECONDS - ///Time taken when fading out after fade_out_delay - var/fade_out_time = 0.5 SECONDS - ///delay between playing each letter. in general use 1 for fluff and 0.5 for time sensitive messsages - var/play_delay = 1 - ///letters to update by per text to per play_delay - var/letters_per_update = 1 - - ///opening styling for the message - var/style_open = "" - ///closing styling for the message - var/style_close = "" - ///var for the text we are going to play - var/text_to_play - -/** - * proc for actually playing this screen_text on a mob. - * Arguments: - * * player: client to play to - */ -/atom/movable/screen/text/screen_text/proc/play_to_client(client/player) - player?.screen += src - if(fade_in_time) - animate(src, alpha = 255) - var/list/lines_to_skip = list() - var/static/html_locate_regex = regex("<.*>") - var/tag_position = findtext(text_to_play, html_locate_regex) - var/reading_tag = TRUE - while(tag_position) - if(reading_tag) - if(text_to_play[tag_position] == ">") - reading_tag = FALSE - lines_to_skip += tag_position - else - lines_to_skip += tag_position - tag_position++ - else - tag_position = findtext(text_to_play, html_locate_regex, tag_position) - reading_tag = TRUE - for(var/letter = 2 to length(text_to_play) + 1 step letters_per_update) - if(letter in lines_to_skip) - continue - maptext = "[style_open][copytext_char(text_to_play, 1, letter)][style_close]" - sleep(play_delay) - addtimer(CALLBACK(src, PROC_REF(after_play), player), fade_out_delay) - -///handles post-play effects like fade out after the fade out delay -/atom/movable/screen/text/screen_text/proc/after_play(client/player) - if(!fade_out_time) - end_play(player) - return - animate(src, alpha = 0, time = fade_out_time) - addtimer(CALLBACK(src, PROC_REF(end_play), player), fade_out_time) - -///ends the play then deletes this screen object and plalys the next one in queue if it exists -/atom/movable/screen/text/screen_text/proc/end_play(client/player) - player.screen -= src - LAZYREMOVE(player.screen_texts, src) - qdel(src) - if(!LAZYLEN(player.screen_texts)) - return - player.screen_texts[1].play_to_client(player) diff --git a/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm new file mode 100644 index 000000000000..db81d763b5fa --- /dev/null +++ b/code/modules/security_levels/keycard_auth/keycard_auth_actions.dm @@ -0,0 +1,51 @@ +/datum/keycard_auth_action + abstract_type = /datum/keycard_auth_action + /// Display name of the action + var/name = "Abstract KAD Action" + /// FontAwesome Icon for TGUI display + var/ui_icon = "exclamation-triangle" + + + + // I don't *PLAN* to do this right now, but it's easy as fuck to support so why not. + /// Are we added to the actions list roundstart? + var/available_roundstart = TRUE + +/// Called by KAD upon successful 2-person auth, +/// You should probably call parent in this just to make sure it's safe. +/// Return value is discarded. +/datum/keycard_auth_action/proc/trigger() + if(is_available()) + return TRUE + return FALSE + +/// Is this action available for use (Alert level, Time, Etc) +/datum/keycard_auth_action/proc/is_available() + return TRUE + +/datum/keycard_auth_action/red_alert + name = "Red Alert" + +/datum/keycard_auth_action/red_alert/trigger() + set_security_level(SEC_LEVEL_RED) + +/datum/keycard_auth_action/emergency_maintenance + name = "Emergency Maintenance Access" + ui_icon = "wrench" + +/datum/keycard_auth_action/emergency_maintenance/trigger() + make_maint_all_access() + + +/datum/keycard_auth_action/bsa_firing_toggle + name = "Bluespace Artillery Unlock" + ui_icon = "meteor" + +/datum/keycard_auth_action/bsa_firing_toggle/trigger() + . = ..() + if(!.) //Verify we can still do this + return + GLOB.bsa_unlock = !GLOB.bsa_unlock + minor_announce("Bluespace Artillery firing protocols have been [GLOB.bsa_unlock? "unlocked" : "locked"]", "Weapons Systems Update:") + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("bluespace artillery", GLOB.bsa_unlock? "unlocked" : "locked")) + diff --git a/code/modules/security_levels/keycard_auth/keycard_authentication.dm b/code/modules/security_levels/keycard_auth/keycard_authentication.dm new file mode 100644 index 000000000000..9650324582da --- /dev/null +++ b/code/modules/security_levels/keycard_auth/keycard_authentication.dm @@ -0,0 +1,171 @@ +GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) + +#define KEYCARD_RED_ALERT "Red Alert" +#define KEYCARD_EMERGENCY_MAINTENANCE_ACCESS "Emergency Maintenance Access" +#define KEYCARD_BSA_UNLOCK "Bluespace Artillery Unlock" + +/obj/machinery/keycard_auth + name = "Keycard Authentication Device" + desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." + icon = 'icons/obj/monitors.dmi' + icon_state = "auth_off" + power_channel = AREA_USAGE_ENVIRON + req_access = list(ACCESS_KEYCARD_AUTH) + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + zmm_flags = ZMM_MANGLE_PLANES + + var/datum/callback/ev + var/datum/keycard_auth_action/event = "" + var/obj/machinery/keycard_auth/event_source + var/mob/triggerer = null + var/waiting = FALSE + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) + +/obj/machinery/keycard_auth/Initialize(mapload) + . = ..() + ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) + +/obj/machinery/keycard_auth/Destroy() + GLOB.keycard_events.clearEvent("triggerEvent", ev) + ev = null + return ..() + +/obj/machinery/keycard_auth/ui_state(mob/user) + return GLOB.physical_state + +/obj/machinery/keycard_auth/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "KeycardAuth", name) + ui.open() + +/obj/machinery/keycard_auth/ui_static_data(mob/user) + var/list/data = list() + var/list/kad_optmap = list() + + for(var/datum/keycard_auth_action/possible_action as anything in SSsecurity_level.kad_actions) + var/list/i_optlist = list() + i_optlist["trigger_key"] = possible_action //Used to index back into kad_actions later. + possible_action = SSsecurity_level.kad_actions[possible_action] //Key-data moment + i_optlist["displaymsg"] = possible_action.name + i_optlist["icon"] = possible_action.ui_icon + i_optlist["is_valid"] = possible_action.is_available() + kad_optmap += list(i_optlist) //Wrap to prevent mangling + data["optmap"] = kad_optmap + return data + + +/obj/machinery/keycard_auth/ui_data() + var/list/data = list() + data["waiting"] = waiting + data["auth_required"] = event_source ? event_source.event : 0 + data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0 + data["emergency_maint"] = GLOB.emergency_access + data["bsa_unlock"] = GLOB.bsa_unlock + return data + +/obj/machinery/keycard_auth/ui_status(mob/user) + if(isdrone(user)) + return UI_CLOSE + if(!isanimal(user)) + return ..() + var/mob/living/simple_animal/A = user + if(!A.dextrous) + to_chat(user, span_warning("You are too primitive to use this device!")) + return UI_CLOSE + return ..() + +/obj/machinery/keycard_auth/ui_act(action, params) + . = ..() + + if(. || waiting || !allowed(usr)) + return + switch(action) + if("trigger") + var/datum/keycard_auth_action = SSsecurity_level.kad_actions[text2path(params["path"])] + if(!keycard_auth_action) + CRASH("Sent invalid KAD trigger data [params["path"]]") + sendEvent(keycard_auth_action) + . = TRUE + if("auth_swipe") + if(event_source) + event_source.trigger_event(usr) + event_source = null + update_appearance() + . = TRUE + + +/obj/machinery/keycard_auth/update_appearance(updates) + . = ..() + + if(event_source && !(machine_stat & (NOPOWER|BROKEN))) + set_light(l_outer_range = 1.4, l_power = 0.7, l_color = "#5668E1") + else + set_light(0) + +/obj/machinery/keycard_auth/update_overlays() + . = ..() + + if(event_source && !(machine_stat & (NOPOWER|BROKEN))) + . += mutable_appearance(icon, "auth_on") + . += emissive_appearance(icon, "auth_on", alpha = src.alpha) + +/obj/machinery/keycard_auth/proc/sendEvent(event_type) + triggerer = usr + event = event_type + waiting = TRUE + GLOB.keycard_events.fireEvent("triggerEvent", src) + addtimer(CALLBACK(src, PROC_REF(eventSent)), 20) + +/obj/machinery/keycard_auth/proc/eventSent() + triggerer = null + event = "" + waiting = FALSE + +/obj/machinery/keycard_auth/proc/triggerEvent(source) + event_source = source + update_appearance() + addtimer(CALLBACK(src, PROC_REF(eventTriggered)), 20) + +/obj/machinery/keycard_auth/proc/eventTriggered() + event_source = null + update_appearance() + +/obj/machinery/keycard_auth/proc/trigger_event(confirmer) + log_game("[key_name(triggerer)] triggered and [key_name(confirmer)] confirmed event [event.name]") + message_admins("[ADMIN_LOOKUPFLW(triggerer)] triggered and [ADMIN_LOOKUPFLW(confirmer)] confirmed event [event.name]") + + var/area/A1 = get_area(triggerer) + deadchat_broadcast(" triggered [event.name] at [span_name("[A1.name]")].", span_name("[triggerer]"), triggerer, message_type=DEADCHAT_ANNOUNCEMENT) + + var/area/A2 = get_area(confirmer) + deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT) + event.trigger() + +GLOBAL_VAR_INIT(emergency_access, FALSE) +/proc/make_maint_all_access() + for(var/area/station/maintenance/A in GLOB.areas) + for(var/turf/in_area as anything in A.get_contained_turfs()) + for(var/obj/machinery/door/airlock/D in in_area) + D.emergency = TRUE + D.update_icon(ALL, 0) + + 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/station/maintenance/A in GLOB.areas) + for(var/turf/in_area as anything in A.get_contained_turfs()) + for(var/obj/machinery/door/airlock/D in in_area) + D.emergency = FALSE + D.update_icon(ALL, 0) + 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")) + + +#undef KEYCARD_RED_ALERT +#undef KEYCARD_EMERGENCY_MAINTENANCE_ACCESS +#undef KEYCARD_BSA_UNLOCK diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm deleted file mode 100644 index ac960ba136db..000000000000 --- a/code/modules/security_levels/keycard_authentication.dm +++ /dev/null @@ -1,167 +0,0 @@ -GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) - -#define KEYCARD_RED_ALERT "Red Alert" -#define KEYCARD_EMERGENCY_MAINTENANCE_ACCESS "Emergency Maintenance Access" -#define KEYCARD_BSA_UNLOCK "Bluespace Artillery Unlock" - -/obj/machinery/keycard_auth - name = "Keycard Authentication Device" - desc = "This device is used to trigger station functions, which require more than one ID card to authenticate." - icon = 'icons/obj/monitors.dmi' - icon_state = "auth_off" - power_channel = AREA_USAGE_ENVIRON - req_access = list(ACCESS_KEYCARD_AUTH) - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - zmm_flags = ZMM_MANGLE_PLANES - - var/datum/callback/ev - var/event = "" - var/obj/machinery/keycard_auth/event_source - var/mob/triggerer = null - var/waiting = FALSE - -MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) - -/obj/machinery/keycard_auth/Initialize(mapload) - . = ..() - ev = GLOB.keycard_events.addEvent("triggerEvent", CALLBACK(src, PROC_REF(triggerEvent))) - -/obj/machinery/keycard_auth/Destroy() - GLOB.keycard_events.clearEvent("triggerEvent", ev) - QDEL_NULL(ev) - return ..() - -/obj/machinery/keycard_auth/ui_state(mob/user) - return GLOB.physical_state - -/obj/machinery/keycard_auth/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "KeycardAuth", name) - ui.open() - -/obj/machinery/keycard_auth/ui_data() - var/list/data = list() - data["waiting"] = waiting - data["auth_required"] = event_source ? event_source.event : 0 - data["red_alert"] = (seclevel2num(get_security_level()) >= SEC_LEVEL_RED) ? 1 : 0 - data["emergency_maint"] = GLOB.emergency_access - data["bsa_unlock"] = GLOB.bsa_unlock - return data - -/obj/machinery/keycard_auth/ui_status(mob/user) - if(isdrone(user)) - return UI_CLOSE - if(!isanimal(user)) - return ..() - var/mob/living/simple_animal/A = user - if(!A.dextrous) - to_chat(user, span_warning("You are too primitive to use this device!")) - return UI_CLOSE - return ..() - -/obj/machinery/keycard_auth/ui_act(action, params) - . = ..() - - if(. || waiting || !allowed(usr)) - return - switch(action) - if("red_alert") - if(!event_source) - sendEvent(KEYCARD_RED_ALERT) - . = TRUE - if("emergency_maint") - if(!event_source) - sendEvent(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS) - . = TRUE - if("auth_swipe") - if(event_source) - event_source.trigger_event(usr) - event_source = null - update_appearance() - . = TRUE - if("bsa_unlock") - if(!event_source) - sendEvent(KEYCARD_BSA_UNLOCK) - . = TRUE - -/obj/machinery/keycard_auth/update_appearance(updates) - . = ..() - - if(event_source && !(machine_stat & (NOPOWER|BROKEN))) - set_light(l_outer_range = 1.4, l_power = 0.7, l_color = "#5668E1") - else - set_light(0) - -/obj/machinery/keycard_auth/update_overlays() - . = ..() - - if(event_source && !(machine_stat & (NOPOWER|BROKEN))) - . += mutable_appearance(icon, "auth_on") - . += emissive_appearance(icon, "auth_on", alpha = src.alpha) - -/obj/machinery/keycard_auth/proc/sendEvent(event_type) - triggerer = usr - event = event_type - waiting = TRUE - GLOB.keycard_events.fireEvent("triggerEvent", src) - addtimer(CALLBACK(src, PROC_REF(eventSent)), 20) - -/obj/machinery/keycard_auth/proc/eventSent() - triggerer = null - event = "" - waiting = FALSE - -/obj/machinery/keycard_auth/proc/triggerEvent(source) - event_source = source - update_appearance() - addtimer(CALLBACK(src, PROC_REF(eventTriggered)), 20) - -/obj/machinery/keycard_auth/proc/eventTriggered() - event_source = null - update_appearance() - -/obj/machinery/keycard_auth/proc/trigger_event(confirmer) - log_game("[key_name(triggerer)] triggered and [key_name(confirmer)] confirmed event [event]") - message_admins("[ADMIN_LOOKUPFLW(triggerer)] triggered and [ADMIN_LOOKUPFLW(confirmer)] confirmed event [event]") - - var/area/A1 = get_area(triggerer) - deadchat_broadcast(" triggered [event] at [span_name("[A1.name]")].", span_name("[triggerer]"), triggerer, message_type=DEADCHAT_ANNOUNCEMENT) - - var/area/A2 = get_area(confirmer) - deadchat_broadcast(" confirmed [event] at [span_name("[A2.name]")].", span_name("[confirmer]"), confirmer, message_type=DEADCHAT_ANNOUNCEMENT) - switch(event) - if(KEYCARD_RED_ALERT) - set_security_level(SEC_LEVEL_RED) - if(KEYCARD_EMERGENCY_MAINTENANCE_ACCESS) - make_maint_all_access() - if(KEYCARD_BSA_UNLOCK) - toggle_bluespace_artillery() - -GLOBAL_VAR_INIT(emergency_access, FALSE) -/proc/make_maint_all_access() - for(var/area/station/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = TRUE - D.update_icon(ALL, 0) - 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/station/maintenance/A in world) - for(var/obj/machinery/door/airlock/D in A) - D.emergency = FALSE - D.update_icon(ALL, 0) - 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")) - -/proc/toggle_bluespace_artillery() - GLOB.bsa_unlock = !GLOB.bsa_unlock - minor_announce("Bluespace Artillery firing protocols have been [GLOB.bsa_unlock? "unlocked" : "locked"]", "Weapons Systems Update:") - SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("bluespace artillery", GLOB.bsa_unlock? "unlocked" : "locked")) - -#undef KEYCARD_RED_ALERT -#undef KEYCARD_EMERGENCY_MAINTENANCE_ACCESS -#undef KEYCARD_BSA_UNLOCK diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index c289f90b6073..2d2cff94b751 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -13,33 +13,41 @@ if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != SSsecurity_level.current_level) switch(level) if(SEC_LEVEL_GREEN) - minor_announce(CONFIG_GET(string/alert_green), "Attention! Security level lowered to green:") + priority_announce(CONFIG_GET(string/alert_green), sub_title = "Security level lowered to green.", do_not_modify = TRUE) + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) if(SSsecurity_level.current_level >= SEC_LEVEL_RED) SSshuttle.emergency.modTimer(4) else SSshuttle.emergency.modTimer(2) + if(SEC_LEVEL_BLUE) if(SSsecurity_level.current_level < SEC_LEVEL_BLUE) - minor_announce(CONFIG_GET(string/alert_blue_upto), "Attention! Security level elevated to blue:",1) + priority_announce(CONFIG_GET(string/alert_blue_upto), sub_title = "Security level elevated to blue.", do_not_modify = TRUE, sound_type = ANNOUNCER_ALERT) + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) SSshuttle.emergency.modTimer(0.5) + else - minor_announce(CONFIG_GET(string/alert_blue_downto), "Attention! Security level lowered to blue:") + priority_announce(CONFIG_GET(string/alert_blue_downto), sub_title = "Security level lowered to blue.", do_not_modify = TRUE, sound_type = ANNOUNCER_ALERT) if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) SSshuttle.emergency.modTimer(2) + if(SEC_LEVEL_RED) if(SSsecurity_level.current_level < SEC_LEVEL_RED) - minor_announce(CONFIG_GET(string/alert_red_upto), "Attention! Code red!",1) + priority_announce(CONFIG_GET(string/alert_red_upto), sub_title = "Security level elevated to red.", do_not_modify = TRUE, sound_type = ANNOUNCER_ALERT) + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) if(SSsecurity_level.current_level == SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(0.25) else SSshuttle.emergency.modTimer(0.5) else - minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!") + priority_announce(CONFIG_GET(string/alert_red_upto), sub_title = "Security level lowered to red.", do_not_modify = TRUE, sound_type = ANNOUNCER_ALERT) + if(SEC_LEVEL_DELTA) - minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1) + priority_announce(CONFIG_GET(string/alert_delta), sub_title = "Security level elevated to delta.", do_not_modify = TRUE, sound_type = ANNOUNCER_ALERT) + if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL) if(SSsecurity_level.current_level == SEC_LEVEL_GREEN) SSshuttle.emergency.modTimer(0.25) diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index 8642d2cd264c..97a5fa5ed6f0 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -18,7 +18,7 @@ var/sound_played var/damaged //too damaged to undock? var/list/areas //areas in our shuttle - var/list/queued_announces //people coming in that we have to announce + var/list/on_arrival_callbacks //people coming in that we have to announce var/obj/machinery/requests_console/console var/force_depart = FALSE var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!! @@ -39,13 +39,19 @@ areas = list() var/list/new_latejoin = list() - for(var/area/shuttle/arrival/A in GLOB.sortedAreas) - for(var/obj/structure/chair/C in A) - new_latejoin += C - if(!console) - console = locate(/obj/machinery/requests_console) in A + for(var/area/shuttle/arrival/A in GLOB.areas) areas += A + for(var/obj/structure/chair/C as anything in INSTANCES_OF(/obj/structure/chair)) + if(get_area(C) in areas) + new_latejoin += C + + if(!console) + for(var/obj/machinery/requests_console/RQ as anything in INSTANCES_OF(/obj/machinery/requests_console)) + if(get_area(RQ) in areas) + console = RQ + break + if(SSjob.latejoin_trackers.len) log_mapping("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.") @@ -158,15 +164,17 @@ console.say("Launch cancelled, [cancel_reason].") return force_depart = FALSE + . = ..() + if(!. && !docked && !damaged) if(console) console.say("Welcome to [station_name()], have a safe and productive day!") playsound(console, 'sound/voice/ApproachingDaedalus.ogg', 50, FALSE, extrarange = 4) - for(var/L in queued_announces) - var/datum/callback/C = L - C.Invoke() - LAZYCLEARLIST(queued_announces) + + for(var/datum/callback/C in on_arrival_callbacks) + C.InvokeAsync() + LAZYCLEARLIST(on_arrival_callbacks) /obj/docking_port/mobile/arrivals/check_effects() ..() @@ -222,7 +230,14 @@ if(mode != SHUTTLE_CALL) announce_arrival(mob, rank) else - LAZYADD(queued_announces, CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(announce_arrival), mob, rank)) + OnDock(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(announce_arrival), mob, rank)) + +/// Add a callback to execute when the shuttle is not in transit. +/obj/docking_port/mobile/arrivals/proc/OnDock(datum/callback/cb) + if(mode != SHUTTLE_CALL) + cb.InvokeAsync() + else + LAZYADD(on_arrival_callbacks, cb) /obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value) switch(var_name) diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 02a7c2ae43e6..2577fffd8340 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -57,7 +57,7 @@ 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/S as anything in INSTANCES_OF(/obj/machinery/computer/shuttle)) if(S.shuttleId == shuttle_id) S.possible_destinations = "[landing_zone.id]" diff --git a/code/modules/shuttle/battlecruiser_starfury.dm b/code/modules/shuttle/battlecruiser_starfury.dm index 72b837dcb5db..6bda989e1430 100644 --- a/code/modules/shuttle/battlecruiser_starfury.dm +++ b/code/modules/shuttle/battlecruiser_starfury.dm @@ -135,56 +135,35 @@ possible_destinations = "SBC_corvette_custom;SBC_corvette_bay;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s" req_access = list(ACCESS_SYNDICATE) -/* - * Summons the SBC Starfury, a large syndicate battlecruiser, in Deep Space. - * It can be piloted into the station's area. - */ -/proc/summon_battlecruiser(datum/team/battlecruiser/team) - - var/list/candidates = poll_ghost_candidates("Do you wish to be considered for battlecruiser crew?", ROLE_TRAITOR) - shuffle_inplace(candidates) - - var/datum/map_template/ship = SSmapping.map_templates["battlecruiser_starfury.dmm"] - var/x = rand(TRANSITIONEDGE, world.maxx - TRANSITIONEDGE - ship.width) - var/y = rand(TRANSITIONEDGE, world.maxy - TRANSITIONEDGE - ship.height) - var/z = SSmapping.empty_space?.z_value - if(isnull(z)) - CRASH("Battlecruiser found no empty space level to load in!") - - var/turf/battlecruiser_loading_turf = locate(x, y, z) - if(!battlecruiser_loading_turf) - CRASH("Battlecruiser found no turf to load in!") - - if(!ship.load(battlecruiser_loading_turf)) - CRASH("Loading battlecruiser ship failed!") - - if(!team) - team = new() - var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in GLOB.nuke_list - if(nuke.r_code == "ADMIN") - nuke.r_code = random_nukecode() - team.nuke = nuke - team.update_objectives() - - for(var/turf/open/spawned_turf as anything in ship.get_affected_turfs(battlecruiser_loading_turf)) //not as anything to filter out closed turfs - for(var/obj/effect/mob_spawn/ghost_role/human/syndicate/battlecruiser/spawner in spawned_turf) - spawner.antag_team = team - if(candidates.len > 0) - var/mob/our_candidate = candidates[1] - spawner.create(our_candidate) - candidates.Splice(1, 2) - notify_ghosts( - "The battlecruiser has an object of interest: [our_candidate]!", - source = our_candidate, - action = NOTIFY_ORBIT, - header = "Something's Interesting!" - ) - else - notify_ghosts( - "The battlecruiser has an object of interest: [spawner]!", - source = spawner, - action = NOTIFY_ORBIT, - header="Something's Interesting!" - ) - - priority_announce("Unidentified armed ship detected near the station.") +/obj/machinery/vending/medical/syndicate_access/cybersun + name = "\improper CyberMed ++" + desc = "An advanced vendor that dispenses medical drugs, both recreational and medicinal." + products = list(/obj/item/reagent_containers/syringe = 4, + /obj/item/healthanalyzer = 4, + /obj/item/reagent_containers/glass/bottle/bicaridine = 2, + /obj/item/reagent_containers/glass/bottle/kelotane = 5, + /obj/item/reagent_containers/glass/bottle/dylovene = 1, + /obj/item/reagent_containers/glass/bottle/epinephrine = 3, + /obj/item/reagent_containers/glass/bottle/morphine = 3, + /obj/item/reagent_containers/glass/bottle/potass_iodide = 1, + /obj/item/reagent_containers/glass/bottle/saline_glucose = 3, + /obj/item/reagent_containers/syringe/antiviral = 5, + ) + contraband = list(/obj/item/reagent_containers/glass/bottle/cold = 2, + /obj/item/restraints/handcuffs = 4, + /obj/item/storage/backpack/duffelbag/syndie/surgery = 1, + /obj/item/storage/medkit/tactical = 1) + premium = list(/obj/item/storage/pill_bottle/ryetalyn = 2, + /obj/item/reagent_containers/hypospray/medipen = 3, + /obj/item/reagent_containers/hypospray/medipen/atropine = 2, + /obj/item/storage/medkit/regular = 3, + /obj/item/storage/medkit/brute = 1, + /obj/item/storage/medkit/fire = 1, + /obj/item/storage/medkit/toxin = 1, + /obj/item/storage/medkit/o2 = 1, + /obj/item/storage/medkit/advanced = 1, + /obj/item/defibrillator/loaded = 1, + /obj/item/wallframe/defib_mount = 1, + /obj/item/sensor_device = 2, + /obj/item/pinpointer/crew = 2, + /obj/item/shears = 1) diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm index cffe675b72ad..f82ca6ea4b0f 100644 --- a/code/modules/shuttle/computer.dm +++ b/code/modules/shuttle/computer.dm @@ -22,9 +22,14 @@ /obj/machinery/computer/shuttle/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) if(!mapload) connect_to_shuttle(SSshuttle.get_containing_shuttle(src)) +/obj/machinery/computer/shuttle/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/computer/shuttle/ui_interact(mob/user, datum/tgui/ui) . = ..() ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index bb92ed274744..048714787dd7 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -97,7 +97,7 @@ to_chat(user, span_warning("You don't have an ID.")) return - if(!(ACCESS_HEADS in ID.access)) + if(!(ACCESS_MANAGEMENT in ID.access)) to_chat(user, span_warning("The access level of your card is not high enough.")) return @@ -480,7 +480,7 @@ if(time_left <= 50 && !sound_played) //4 seconds left:REV UP THOSE ENGINES BOYS. - should sync up with the launch sound_played = 1 //Only rev them up once. var/list/areas = list() - for(var/area/shuttle/escape/E in GLOB.sortedAreas) + for(var/area/shuttle/escape/E in GLOB.areas) areas += E priority_announce("Engines spooling up. Prepare for resonance jump.", "LRSV Icarus Announcement", do_not_modify = TRUE) hyperspace_sound(HYPERSPACE_WARMUP, areas) @@ -493,7 +493,7 @@ //now move the actual emergency shuttle to its transit dock var/list/areas = list() - for(var/area/shuttle/escape/E in GLOB.sortedAreas) + for(var/area/shuttle/escape/E in GLOB.areas) areas += E hyperspace_sound(HYPERSPACE_LAUNCH, areas) enterTransit() @@ -515,7 +515,7 @@ if(SHUTTLE_ESCAPE) if(sound_played && time_left <= HYPERSPACE_END_TIME) var/list/areas = list() - for(var/area/shuttle/escape/E in GLOB.sortedAreas) + for(var/area/shuttle/escape/E in GLOB.areas) areas += E hyperspace_sound(HYPERSPACE_END, areas) if(time_left <= PARALLAX_LOOP_TIME) @@ -591,15 +591,13 @@ possible_destinations = "pod_asteroid" icon = 'icons/obj/terminals.dmi' icon_state = "dorm_available" + icon_keyboard = null light_color = LIGHT_COLOR_BLUE density = FALSE /obj/machinery/computer/shuttle/pod/Initialize(mapload) . = ..() RegisterSignal(SSsecurity_level, COMSIG_SECURITY_LEVEL_CHANGED, PROC_REF(check_lock)) - -/obj/machinery/computer/shuttle/pod/ComponentInitialize() - . = ..() AddElement(/datum/element/update_icon_blocker) /obj/machinery/computer/shuttle/pod/emag_act(mob/user) @@ -635,7 +633,7 @@ width = 3 height = 4 hidden = TRUE - var/target_area = /area/lavaland/surface/outdoors + var/target_area = /area/mine/unexplored var/edge_distance = 16 // Minimal distance from the map edge, setting this too low can result in shuttle landing on the edge and getting "sliced" @@ -645,8 +643,8 @@ return var/list/turfs = get_area_turfs(target_area) - var/original_len = turfs.len - while(turfs.len) + var/original_len = turfs?.len + while(turfs?.len) var/turf/T = pick(turfs) if(T.x= threshold) - break - payees[AM] += C.value - counted_money += C - for(var/obj/item/stack/spacecash/S in AM.get_all_contents()) //Paper Cash - if(payees[AM] >= threshold) - break - payees[AM] += S.value * S.amount - counted_money += S - for(var/obj/item/holochip/H in AM.get_all_contents()) //Holocredits - if(payees[AM] >= threshold) - break - payees[AM] += H.credits - counted_money += H - - if(payees[AM] < threshold && istype(AM.pulling, /obj/item/coin)) //Coins(Pulled). - var/obj/item/coin/C = AM.pulling - payees[AM] += C.value - counted_money += C - - else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/stack/spacecash)) //Cash(Pulled). - var/obj/item/stack/spacecash/S = AM.pulling - payees[AM] += S.value * S.amount - counted_money += S - - else if(payees[AM] < threshold && istype(AM.pulling, /obj/item/holochip)) //Holocredits(pulled). - var/obj/item/holochip/H = AM.pulling - payees[AM] += H.credits - counted_money += H - - if(payees[AM] < threshold) //Suggestions for those with no arms/simple animals. - var/armless - if(!ishuman(AM) && !istype(AM, /mob/living/simple_animal/slime)) - armless = TRUE - else - var/mob/living/carbon/human/H = AM - if(!H.get_bodypart(BODY_ZONE_L_ARM) && !H.get_bodypart(BODY_ZONE_R_ARM)) - armless = TRUE - - if(armless) - if(!AM.pulling || !iscash(AM.pulling) && !istype(AM.pulling, /obj/item/card/id)) - if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message - to_chat(AM, span_notice("Try pulling a valid ID, space cash, holochip or coin into \the [src]!")) - check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN - - if(payees[AM] >= threshold) - for(var/obj/I in counted_money) - qdel(I) - payees[AM] -= threshold - - var/change = FALSE - if(payees[AM] > 0) - change = TRUE - var/obj/item/holochip/HC = new /obj/item/holochip(AM.loc) //Change is made in holocredits exclusively. - HC.credits = payees[AM] - HC.name = "[HC.credits] credit holochip" - if(istype(AM, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - if(!H.put_in_hands(HC)) - AM.pulling = HC - else - AM.pulling = HC - payees[AM] -= payees[AM] - - say("Welcome to first class, [driver_holdout ? "[driver_holdout]" : "[AM]" ]![change ? " Here is your change." : ""]") - approved_passengers |= AM - if(vehicle) - approved_passengers |= vehicle - if(driver_holdout) - approved_passengers |= driver_holdout - - check_times -= AM - return - else if (payees[AM] > 0) - for(var/obj/I in counted_money) - qdel(I) - if(!check_times[AM] || check_times[AM] < world.time) //Let's not spam the message - to_chat(AM, span_notice("[payees[AM]] cr received. You need [threshold-payees[AM]] cr more.")) - check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN - alarm_beep() - return ..() - else - alarm_beep() - return ..() - /mob/living/simple_animal/hostile/bear/fightpit name = "fight pit bear" desc = "This bear's trained through ancient Russian secrets to fear the walls of its glass prison." diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index beb0eedd77b6..16dec837fb79 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -2,7 +2,6 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /mob/living, /obj/structure/blob, /obj/effect/rune, - /obj/structure/spider/spiderling, /obj/item/disk/nuclear, /obj/machinery/nuclearbomb, /obj/item/beacon, @@ -12,14 +11,11 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( /obj/machinery/teleport/hub, /obj/machinery/quantumpad, /obj/effect/mob_spawn, - /obj/effect/hierophant, /obj/structure/receiving_pad, - /obj/item/warp_cube, /obj/machinery/rnd/production, //print tracking beacons, send shuttle /obj/machinery/autolathe, //same /obj/projectile/beam/wormhole, /obj/effect/portal, - /obj/item/shared_storage, /obj/structure/extraction_point, /obj/machinery/syndicatebomb, /obj/item/hilbertshotel, @@ -112,7 +108,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( investigate_log("Chef's [SSshuttle.chef_groceries.len] sized produce order arrived. Cost was deducted from orderer, not cargo.", INVESTIGATE_CARGO) for(var/datum/orderable_item/item as anything in SSshuttle.chef_groceries)//every order for(var/amt in 1 to SSshuttle.chef_groceries[item])//every order amount - new item.item_instance.type(grocery_crate) + new item.item_path(grocery_crate) SSshuttle.chef_groceries.Cut() //This lets the console know it can order another round. if(!SSshuttle.shopping_list.len) diff --git a/code/modules/shuttle/white_ship.dm b/code/modules/shuttle/white_ship.dm index a293e17cf487..95fb9cfd565a 100644 --- a/code/modules/shuttle/white_ship.dm +++ b/code/modules/shuttle/white_ship.dm @@ -3,7 +3,7 @@ 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" + possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_custom" /// Console used on the whiteship bridge. Comes with GPS pre-baked. /obj/machinery/computer/shuttle/white_ship/bridge diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_items.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_items.dm new file mode 100644 index 000000000000..ba6f4cc5bd74 --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_items.dm @@ -0,0 +1,111 @@ +/// A parent type that denotes inserting an item +/datum/slapcraft_step/item + abstract_type = /datum/slapcraft_step/item + insert_item_into_result = TRUE + +/datum/slapcraft_step/item/welder + desc = "Start with normal sized welding tool." + finished_desc = "A welding tool has been added." + item_types = list(/obj/item/weldingtool) + +/datum/slapcraft_step/item/welder/base_only + blacklist_item_types = list(/obj/item/weldingtool/mini, /obj/item/weldingtool/largetank, /obj/item/weldingtool/experimental) + +/datum/slapcraft_step/item/crowbar + desc = "Start with a crowbar." + finished_desc = "A crowbar has been added." + item_types = list(/obj/item/crowbar) + +/datum/slapcraft_step/item/metal_knife //because /obj/item/knife has a LOT of subtypes + desc = "Add a metal knife." + finished_desc = "A knife has been added." + item_types = list(/obj/item/knife/kitchen, /obj/item/knife/hunting, /obj/item/knife/combat) + blacklist_item_types = list(/obj/item/knife/combat/bone) + +/datum/slapcraft_step/item/igniter + desc = "Attach an igniter" + finished_desc = "An igniter has been added." + todo_desc = "You could add an igniter..." + item_types = list(/obj/item/assembly/igniter) + + start_msg = "%USER% begins attaching an igniter to the %TARGET%." + start_msg_self = "You begin attaching an igniter to the %TARGET%." + +/datum/slapcraft_step/item/glass_shard + desc = "Attach a shard of glass." + finished_desc = "A shard of glass has been added." + todo_desc = "You could add a shard of glass..." + item_types = list(/obj/item/shard) + + start_msg = "%USER% begins attaching shard of glass to the %TARGET%." + start_msg_self = "You begin attaching shard of glass to the %TARGET%." + +/datum/slapcraft_step/item/glass_shard/insert + insert_item_into_result = TRUE + +/datum/slapcraft_step/item/wirerod + desc = "Attach a wirerod." + todo_desc = "You could attach a wired rod..." + finished_desc = "A wired rod has been added." + item_types = list(/obj/item/wirerod) + + start_msg = "%USER% begins attaching a wirerod to the %TARGET%." + start_msg_self = "You begin attaching a wirerod to the %TARGET%." + +/datum/slapcraft_step/item/metal_ball + desc = "Attach a metal ball." + todo_desc = "You could attach a metal ball..." + finished_desc = "A metal ball has been added." + item_types = list(/obj/item/wirerod) + + start_msg = "%USER% begins attaching a metal ball to the %TARGET%." + start_msg_self = "You begin attaching a metal ball to the %TARGET%." + +/datum/slapcraft_step/item/metal_ball/second + +/datum/slapcraft_step/item/metal_ball/third + +/datum/slapcraft_step/item/grenade + desc = "Attach a grenade." + todo_desc = "You could attach a grenade..." + finished_desc = "A grenade has been added." + item_types = list(/obj/item/grenade) + perform_time = 0 + finish_msg = "%USER% attaches an explosive to the %TARGET%." + finish_msg_self = "You attach an explosive to the %TARGET%." + +/datum/slapcraft_step/item/pipe + desc = "Attach a pipe." + item_types = list(/obj/item/pipe/quaternary) + finish_msg = "%USER% attaches a pipe to the %TARGET%." + finish_msg_self = "You attach a pipe to the %TARGET%." + +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/pipe/second + +/datum/slapcraft_step/item/paper + desc = "Attach a sheet of paper." + item_types = list(/obj/item/paper) + perform_time = 0 + finish_msg = "%USER% adds a sheet of paper to the %TARGET%." + finish_msg_self = "You add a sheet of paper to the %TARGET%." + +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/paper/second +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/paper/third +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/paper/fourth +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/paper/fifth + +/datum/slapcraft_step/item/flashlight + desc = "Attach a flashlight." + item_types = list(/obj/item/flashlight) + blacklist_item_types = list(/obj/item/flashlight/lamp, /obj/item/flashlight/lantern) + finish_msg = "%USER% attaches a flashlight to the %TARGET%." + finish_msg_self = "You attach a flashlight to the %TARGET%." + +/// Disambiguation go BRRRR +/datum/slapcraft_step/item/flashlight/again + diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_material.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_material.dm new file mode 100644 index 000000000000..04150d50a810 --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_material.dm @@ -0,0 +1,38 @@ +/// This step requires an amount of a stack items which will be split off and put into the assembly. +/datum/slapcraft_step/material + abstract_type = /datum/slapcraft_step/material + insert_item = TRUE + item_types = list(/obj/item/stack) + + /// The type of material required + var/datum/material/mat_type + /// Amount (cm3) of the material required + var/amount = 0 + +/datum/slapcraft_step/material/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + var/obj/item/stack/stack = item + var/datum/material/mat = GET_MATERIAL_REF(mat_type) + if(stack.custom_materials[mat] < amount) + error_list += "Not enough [mat.name] (need [amount])." + . = FALSE + +/datum/slapcraft_step/material/move_item_to_assembly(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + var/obj/item/stack/stack = item + var/obj/item/item_to_move + + var/sheets_needed = ceil(amount / stack.mats_per_unit[GET_MATERIAL_REF(mat_type)]) + + // Exactly how much we needed, just put the entirety in the assembly + if(stack.amount == sheets_needed) + item_to_move = stack + else + // We have more than we need, split the stacks off + var/obj/item/stack/split_stack = stack.split_stack(null, amount) + item_to_move = split_stack + item = item_to_move + return ..() + +/datum/slapcraft_step/material/make_list_desc() + return "[amount] cm3 [initial(mat_type.name)]" diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_reagent.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_reagent.dm new file mode 100644 index 000000000000..611b1954932b --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_reagent.dm @@ -0,0 +1,131 @@ +/// This step requires and uses a reagent to finish itself. This step is great as a last step since reagents can't be recovered from disassembly. +/// This alternatively can also transfer to a container inside the crafting assembly too! +/datum/slapcraft_step/reagent + abstract_type = /datum/slapcraft_step/reagent + check_if_mob_can_drop_item = FALSE + insert_item = FALSE + item_types = list(/obj/item/reagent_containers) + finish_msg = "%USER% finishes adding some reagents to %TARGET%." + start_msg = "%USER% starts adding some reagents to %TARGET%." + finish_msg_self = "You add some reagents to %TARGET%." + start_msg_self = "You begin adding some reagents to %TARGET%." + /// Readable string describing reagentst that we auto generate. such as "fuel, acid and milk". Used as a helper in auto desc generations + var/readable_reagent_string + /// Type of the reagent to use. + var/reagent_type + /// Volume of the reagent to use. + var/reagent_volume + /// Reagent list to be used for checks and interactions instead of above single type. + var/list/reagent_list + /// Whether we need an open container to do this + var/needs_open_container = TRUE + /// Whether we want to transfer to another container in the assembly. Requires a container in assembly and enough space for that inside it. + var/transfer_to_assembly_container = FALSE + /// If defined, it's the minimum required temperature for the step to work. + var/temperature_min + /// If defined it's the maximum required temperature for the step to work. + var/temperature_max + +/datum/slapcraft_step/reagent/New() + make_readable_reagent_string() + return ..() + +/datum/slapcraft_step/reagent/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + if(!.) + return + + var/obj/item/reagent_containers/container = item + if(!container.reagents) + return FALSE + if(needs_open_container && !container.is_open_container()) + return FALSE + if(!isnull(temperature_min) && container.reagents.chem_temp < temperature_min) + return FALSE + if(!isnull(temperature_max) && container.reagents.chem_temp > temperature_max) + return FALSE + if(reagent_list) + if(!container.reagents.has_reagent_list(reagent_list)) + return FALSE + else + if(!container.reagents.has_reagent(reagent_type, reagent_volume)) + return FALSE + if(transfer_to_assembly_container && assembly) + var/obj/item/reagent_containers/assembly_container = locate() in assembly + if(!assembly_container) + return FALSE + var/required_free_volume + if(reagent_list) + required_free_volume = 0 + for(var/r_id in reagent_list) + required_free_volume += reagent_list[r_id] + else + required_free_volume = reagent_volume + var/free_space = assembly_container.reagents.maximum_volume - assembly_container.reagents.total_volume + if(free_space < required_free_volume) + return FALSE + return TRUE + +/datum/slapcraft_step/reagent/on_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + var/obj/item/reagent_containers/container = item + if(transfer_to_assembly_container) + // Here we already asserted that the container exists and has free space in `can_perform()` + var/obj/item/reagent_containers/assembly_container = locate() in assembly + // Well it says "transfer", but it actually adds new because there isn't an easy way to transfer specifically a certain type. + // I guess this issue is only relevant for blood and viruses, which I doubt people will slapcraft with. + if(reagent_list) + assembly_container.reagents.add_reagent_list(reagent_list) + else + assembly_container.reagents.add_reagent(reagent_type, reagent_volume) + + if(reagent_list) + container.reagents.remove_reagent_list(reagent_list) + else + container.reagents.remove_reagent(reagent_type, reagent_volume) + +/datum/slapcraft_step/reagent/make_list_desc() + if(reagent_list) + var/string = "" + var/first = TRUE + for(var/r_id in reagent_list) + if(!first) + string += ", " + var/datum/reagent/reagent_cast = r_id + var/volume = reagent_list[r_id] + string += "[volume]u. [lowertext(initial(reagent_cast.name))]" + first = FALSE + return string + else + var/datum/reagent/reagent_cast = reagent_type + return "[reagent_volume]u. [lowertext(initial(reagent_cast.name))]" + +/datum/slapcraft_step/reagent/proc/make_readable_reagent_string() + var/list/reagent_types_to_describe = list() + if(reagent_list) + for(var/reagent_type in reagent_list) + reagent_types_to_describe += reagent_type + else + reagent_types_to_describe += reagent_type + var/string_so_far = "" + var/i = 0 + var/first = TRUE + for(var/reagent_type in reagent_types_to_describe) + i++ + if(!first) + if(i == reagent_types_to_describe.len) + string_so_far += " and " + else + string_so_far += ", " + var/datum/reagent/cast = reagent_type + string_so_far += lowertext(initial(cast.name)) + first = FALSE + readable_reagent_string = string_so_far + +/datum/slapcraft_step/reagent/make_desc() + return "Add some [readable_reagent_string] to the assembly" + +/datum/slapcraft_step/reagent/make_finished_desc() + return "Some [readable_reagent_string] has been added." + +/datum/slapcraft_step/reagent/make_todo_desc() + return "You could add some [readable_reagent_string] to the assembly" diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_reagent_container.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_reagent_container.dm new file mode 100644 index 000000000000..da34b4d4c421 --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_reagent_container.dm @@ -0,0 +1,69 @@ +/// This step requires to input a reagent container, possibly with some reagent inside, or with some volume specifications. +/datum/slapcraft_step/reagent_container + abstract_type = /datum/slapcraft_step/reagent_container + insert_item = TRUE + item_types = list(/obj/item/reagent_containers) + /// Type of the reagent needed. + var/reagent_type + /// Volume of the reagent needed. + var/reagent_volume + /// Instead of just one reagent type you can input a list to be used instead for the checks. + var/list/reagent_list + /// The amount of container volume we require if any. + var/container_volume + /// The maximum volume of the container, if any. + var/maximum_volume + /// Amount of free volume we require if any. + var/free_volume + /// Whether we need an open container to do this. + var/needs_open_container = TRUE + /// If defined, it's the minimum required temperature for the step to work. + var/temperature_min + /// If defined it's the maximum required temperature for the step to work. + var/temperature_max + +/datum/slapcraft_step/reagent_container/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + var/obj/item/reagent_containers/container = item + if(!container.reagents) + return FALSE + if(needs_open_container && !container.is_open_container()) + return FALSE + if(!isnull(temperature_min) && container.reagents.chem_temp < temperature_min) + return FALSE + if(!isnull(temperature_max) && container.reagents.chem_temp > temperature_max) + return FALSE + if(reagent_list) + if(!container.reagents.has_reagent_list(reagent_list)) + return FALSE + else if (reagent_type) + if(!container.reagents.has_reagent(reagent_type, reagent_volume)) + return FALSE + + if(!isnull(container_volume) && container.reagents.maximum_volume < container_volume) + return FALSE + + if(!isnull(maximum_volume) && container.reagents.maximum_volume > maximum_volume) + return FALSE + + if(!isnull(free_volume) && (container.reagents.maximum_volume - container.reagents.total_volume) < free_volume) + return FALSE + + +/datum/slapcraft_step/reagent_container/make_list_desc() + . = ..() + if(reagent_list) + var/string = "" + var/first = TRUE + for(var/r_id in reagent_list) + if(!first) + string += ", " + var/datum/reagent/reagent_cast = r_id + var/volume = reagent_list[r_id] + string += "[volume]u. [lowertext(initial(reagent_cast.name))]" + first = FALSE + . += string + else if(reagent_type) + var/datum/reagent/reagent_cast = reagent_type + . += " - [reagent_volume]u. [lowertext(initial(reagent_cast.name))]" diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_stack.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_stack.dm new file mode 100644 index 000000000000..9016ee62eff2 --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_stack.dm @@ -0,0 +1,194 @@ +/// This step requires an amount of a stack items which will be split off and put into the assembly. +/datum/slapcraft_step/stack + abstract_type = /datum/slapcraft_step/stack + insert_item = TRUE + item_types = list(/obj/item/stack) + /// Amount of the stack items to be put into the assembly. + var/amount = 1 + +/datum/slapcraft_step/stack/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + var/obj/item/stack/stack = item + if(istype(stack) && stack.amount < amount) + if(item.gender == PLURAL) //this looks really funny if you dont know byond + error_list += "There are not enough [initial(item.name)] (need [amount])." + else + error_list += "There is not enough [initial(item.name)] (need [amount])." + . = FALSE + +/datum/slapcraft_step/stack/move_item_to_assembly(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + var/obj/item/stack/stack = item + if(!istype(stack)) // Children of this type may not actually pass stacks + return ..() + + var/obj/item/item_to_move + // Exactly how much we needed, just put the entirety in the assembly + if(stack.amount == amount) + item_to_move = stack + else + // We have more than we need, split the stacks off + var/obj/item/stack/split_stack = stack.split_stack(null, amount, null) + item_to_move = split_stack + item = item_to_move + return ..() + +/datum/slapcraft_step/stack/make_list_desc() + var/obj/item/stack/stack_cast = item_types[1] + if(istype(stack_cast)) + return "[amount]x [initial(stack_cast.singular_name)]" + return ..() + +/// Can be a stack, another stack, or another item. +/datum/slapcraft_step/stack/or_other + abstract_type = /datum/slapcraft_step/stack/or_other + /// An associative list of stack_type : amount. + var/list/amounts + // Do not set this on or_other, its set dynamically! + amount = 0 + +/datum/slapcraft_step/stack/or_other/New() + . = ..() + for(var/path in amounts) + var/required_amt = amounts[path] + var/list/path_tree = subtypesof(path) + for(var/child in path_tree) + path_tree[child] = required_amt + + amounts += path_tree + +/datum/slapcraft_step/stack/or_other/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + if(isstack(item)) + var/obj/item/stack/S = item + if(S.amount < amounts[S.type]) + error_list += "There are not enough [initial(item.name)] (need [amounts[S.type]])." + . = FALSE + +/datum/slapcraft_step/stack/or_other/move_item_to_assembly(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + amount = amounts[item.type] + . = ..() + amount = 0 + +/datum/slapcraft_step/stack/or_other/binding + desc = "Tie the assembly together." + todo_desc = "You could use something to tie this the assembly together..." + item_types = list( + /obj/item/stack/sticky_tape, + /obj/item/stack/cable_coil, + /obj/item/stack/sheet/cloth + ) + amounts = list( + /obj/item/stack/sticky_tape = 2, + /obj/item/stack/sheet/cloth = 1, + /obj/item/stack/cable_coil = 10, + ) + + +/datum/slapcraft_step/stack/rod/one + desc = "Add a rod to the assembly." + todo_desc = "You could add a rod..." + item_types = list(/obj/item/stack/rods) + amount = 1 + + start_msg = "%USER% begins inserts a rod to the %TARGET%." + start_msg_self = "You begin inserting a rod to the %TARGET%." + finish_msg = "%USER% inserts a rod to the %TARGET%." + finish_msg_self = "You insert a rod to the %TARGET%." + +/datum/slapcraft_step/stack/rod/two + desc = "Add two rods to the assembly." + todo_desc = "You could add some rods..." + item_types = list(/obj/item/stack/rods) + amount = 2 + + start_msg = "%USER% adds some rods to the %TARGET%." + start_msg_self = "You add some rods to the %TARGET%." + finish_msg = "%USER% adds some rods to the %TARGET%." + finish_msg_self = "You add some rods to the %TARGET%." + +/datum/slapcraft_step/stack/iron/one + desc = "Add a sheet of metal to the assembly." + todo_desc = "You could add a sheet of metal..." + item_types = list(/obj/item/stack/sheet/iron) + amount = 1 + + start_msg = "%USER% begins adds a sheet of metal to the %TARGET%." + start_msg_self = "You begin adds a sheet of metal to the %TARGET%." + finish_msg = "%USER% adds a sheet of metal to the %TARGET%." + finish_msg_self = "You adds a sheet of metal to the %TARGET%." + +/datum/slapcraft_step/stack/iron/five + desc = "Add 5 sheets of metal to the assembly." + todo_desc = "You could add some metal sheets..." + item_types = list(/obj/item/stack/sheet/iron) + amount = 5 + + start_msg = "%USER% starts adding some metal to the %TARGET%." + start_msg_self = "You begin adds some metal to the %TARGET%." + finish_msg = "%USER% adds some metal to the %TARGET%." + finish_msg_self = "You add some metal to the %TARGET%." + +/datum/slapcraft_step/stack/cable/one + desc = "Add a cable to the assembly." + todo_desc = "You could add a cable..." + item_types = list(/obj/item/stack/cable_coil) + amount = 1 + + start_msg = "%USER% begins attaching some cable to the %TARGET%." + start_msg_self = "You begin inserting some cable to the %TARGET%." + finish_msg = "%USER% attaches some cable to the %TARGET%." + finish_msg_self = "You attach some cable to the %TARGET%." + +/datum/slapcraft_step/stack/cable/five + desc = "Add 5 cable to the assembly." + todo_desc = "You could add some cable..." + item_types = list(/obj/item/stack/cable_coil) + amount = 5 + + start_msg = "%USER% begins attaching some cable to the %TARGET%." + start_msg_self = "You begin inserting some cable to the %TARGET%." + finish_msg = "%USER% attaches some cable to the %TARGET%." + finish_msg_self = "You attach some cable to the %TARGET%." + +/datum/slapcraft_step/stack/cable/ten + desc = "Add 10 cable to the assembly." + item_types = list(/obj/item/stack/cable_coil) + amount = 10 + + start_msg = "%USER% begins attaching some cable to the %TARGET%." + start_msg_self = "You begin inserting some cable to the %TARGET%." + finish_msg = "%USER% attaches some cable to the %TARGET%." + finish_msg_self = "You attach some cable to the %TARGET%." + +/datum/slapcraft_step/stack/cable/fifteen + desc = "Add 15 cable to the assembly." + item_types = list(/obj/item/stack/cable_coil) + amount = 15 + + start_msg = "%USER% begins attaching some cable to the %TARGET%." + start_msg_self = "You begin inserting some cable to the %TARGET%." + finish_msg = "%USER% attaches some cable to the %TARGET%." + finish_msg_self = "You attach some cable to the %TARGET%." + +/datum/slapcraft_step/stack/cardboard/one + desc = "Add a sheet of cardboard to the assembly." + todo_desc = "You could add a sheet of cardboard..." + item_types = list(/obj/item/stack/sheet/cardboard) + amount = 1 + perform_time = 0 + + finish_msg = "%USER% adds a sheet of cardboard to the %TARGET%." + finish_msg_self = "You add a sheet of cardboard to the %TARGET%." + +/datum/slapcraft_step/stack/wood/one + desc = "Add a plank of wood to the assembly." + todo_desc = "You could add a plank of wood..." + item_types = list(/obj/item/stack/sheet/mineral/wood) + amount = 1 + + start_msg = "%USER% begins attaching a wooden plank to the %TARGET%." + start_msg_self = "You begin attaching a wooden plank to the %TARGET%." + finish_msg = "%USER% attaches a wooden plank to the %TARGET%." + finish_msg_self = "You attach a wooden plank to the %TARGET%." diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_tool.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_tool.dm new file mode 100644 index 000000000000..eb10321b7c3e --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_tool.dm @@ -0,0 +1,91 @@ +/// This step requires an item with a specific tool behaviour. +/datum/slapcraft_step/tool + abstract_type = /datum/slapcraft_step/tool + insert_item = FALSE + check_types = FALSE + check_if_mob_can_drop_item = FALSE + + /// What tool behaviour do we need for this step. + var/tool_behaviour + /// How much fuel is required, only relevant for welding tools. + var/required_fuel = 0 + +/datum/slapcraft_step/tool/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + if(item.tool_behaviour != tool_behaviour) + . = FALSE + + if(!item.tool_use_check(user, required_fuel)) + . = FALSE + +/datum/slapcraft_step/tool/perform_do_after(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, time_to_do) + // This will play the tool sound aswell. Rackety + if(!item.use_tool(assembly, user, time_to_do, volume = 50)) + return FALSE + return TRUE + +// Only relevant for welding tools I believe. +/datum/slapcraft_step/tool/on_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + item.use(required_fuel) + +/datum/slapcraft_step/tool/crowbar + list_desc = "crowbar" + tool_behaviour = TOOL_CROWBAR + +/datum/slapcraft_step/tool/multitool + list_desc = "multitool" + tool_behaviour = TOOL_MULTITOOL + +/datum/slapcraft_step/tool/screwdriver + list_desc = "screwdriver" + tool_behaviour = TOOL_SCREWDRIVER + +/datum/slapcraft_step/tool/screwdriver/secure + desc = "Secure the parts with a screwdriver." + todo_desc = "You could secure the parts with a screwdriver..." + + start_msg = "%USER% begins to secure the %TARGET%." + start_msg_self = "You begin to secure the %TARGET%." + finish_msg = "%USER% secures the %TARGET%." + finish_msg_self = "You secure the %TARGET%." + +/datum/slapcraft_step/tool/wirecutter + list_desc = "wirecutter" + tool_behaviour = TOOL_WIRECUTTER + +/datum/slapcraft_step/tool/wrench + list_desc = "wrench" + tool_behaviour = TOOL_WRENCH + +/datum/slapcraft_step/tool/welder + list_desc = "welding tool" + tool_behaviour = TOOL_WELDER + required_fuel = 2 + +/datum/slapcraft_step/tool/welder/weld_together + desc = "Weld the assembly together." + todo_desc = "You need to weld the assembly together..." + required_fuel = 3 + perform_time = 4 //this is intended to be a "finishing" step + + start_msg = "%USER% begins to secure the %TARGET%." + start_msg_self = "You begin to secure the %TARGET%." + finish_msg = "%USER% secures the %TARGET%." + finish_msg_self = "You secure the %TARGET%." + +/datum/slapcraft_step/tool/saw + list_desc = "saw" + tool_behaviour = TOOL_SAW + +/datum/slapcraft_step/tool/drill + list_desc = "drill" + tool_behaviour = TOOL_DRILL + +/datum/slapcraft_step/tool/knife + list_desc = "knife" + tool_behaviour = TOOL_KNIFE + +/datum/slapcraft_step/tool/rolling_pin + list_desc = "rolling pin" + tool_behaviour = TOOL_ROLLINGPIN diff --git a/code/modules/slapcrafting/base_steps/slapcraft_step_weapon.dm b/code/modules/slapcrafting/base_steps/slapcraft_step_weapon.dm new file mode 100644 index 000000000000..390bbab52233 --- /dev/null +++ b/code/modules/slapcrafting/base_steps/slapcraft_step_weapon.dm @@ -0,0 +1,74 @@ +/// This steps can check sufficient weapon variables, such as sharpness or force +/datum/slapcraft_step/attack + abstract_type = /datum/slapcraft_step/attack + insert_item = FALSE + check_types = FALSE + check_if_mob_can_drop_item = FALSE + + list_desc = "sharp implement" + /// Sharpness flags needed to perform. + var/require_sharpness = NONE + /// If we want exactly this bitfield, not "has any" + var/require_exact = FALSE + /// Required force of the item. + var/force = 0 + +/datum/slapcraft_step/attack/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + if(require_sharpness || require_exact) + if(require_exact) + if(!(require_sharpness == item.sharpness)) + error_list += sharpness_error(item) + . = FALSE + + else if(!(require_sharpness & item.sharpness)) + error_list += sharpness_error(item) + . = FALSE + + if(item.force < force) + error_list += "[item] is not strong enough." + . = FALSE + +/datum/slapcraft_step/attack/play_perform_sound(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + // Sharpness was required, so play a slicing sound + if(require_sharpness) + playsound(assembly, 'sound/weapons/slice.ogg', 50, TRUE, -1) + // Else, play an attack sound if there is one. + else if (item.get_hitsound()) + playsound(assembly, item.get_hitsound(), 50, TRUE, -1) + +/datum/slapcraft_step/attack/proc/sharpness_error(obj/item/item) + switch(require_sharpness) + if(SHARP_EDGED) + return "[item] does not have a sharp edge." + if(SHARP_POINTY) + return "[item] does not have a sharp point." + if(SHARP_POINTY|SHARP_EDGED) + return "[item] does not have a sharp point and sharp edge." + else + return "[item] is not blunt." + +/datum/slapcraft_step/attack/sharp + desc = "Cut the assembly with something sharp." + todo_desc = "Now you'll need to cut it with something..." + require_sharpness = SHARP_EDGED + +/datum/slapcraft_step/attack/bludgeon + list_desc = "blunt object" + require_sharpness = NONE + require_exact = TRUE + +/datum/slapcraft_step/attack/bludgeon/heavy + force = 10 //strength of a fire extinguisher, toolboxes and batons will easily pass this too + +/datum/slapcraft_step/attack/sharp/chop + perform_time = 0.7 SECONDS + desc = "Chop the log into planks." + todo_desc = "You could chop logs in to planks..." + + finish_msg = "You finish chopping down the log into planks." + start_msg = "%USER% begins chopping the log." + start_msg_self = "You begin chopping the log with the sharp tool." + finish_msg = "%USER% chops down the log into planks." + finish_msg_self = "You chop the log into planks." diff --git a/code/modules/slapcrafting/crafting_items/components.dm b/code/modules/slapcrafting/crafting_items/components.dm new file mode 100644 index 000000000000..245a53a5af6c --- /dev/null +++ b/code/modules/slapcrafting/crafting_items/components.dm @@ -0,0 +1,28 @@ +//Misc. items that exist for other crafting recipes. Only add new ones if you can't justify making a crafting step instead. +/obj/item/wirerod + name = "wired rod" + desc = "A rod with some wire wrapped around the top. It'd be easy to attach something to the top bit." + icon = 'icons/obj/slapcrafting/components.dmi' + icon_state = "wiredrod" + inhand_icon_state = "rods" + flags_1 = CONDUCT_1 + force = 9 + throwforce = 10 + w_class = WEIGHT_CLASS_BULKY + custom_materials = list(/datum/material/iron=1150, /datum/material/glass=75) + attack_verb_continuous = list("hits", "bludgeons", "whacks", "bonks") + attack_verb_simple = list("hit", "bludgeon", "whack", "bonk") + +/obj/item/metal_ball + name = "metal ball" + desc = "A small metal ball. It's rather heavy, and could roll easily." + icon = 'icons/obj/slapcrafting/components.dmi' + icon_state = "metalball" //this is a shitty placeholder sprite PLEASE replace it later + inhand_icon_state = "minimeteor" //conveniently grey and ball-shaped + flags_1 = CONDUCT_1 + force = 6 + throwforce = 10 //time to go bowling! + w_class = WEIGHT_CLASS_BULKY + custom_materials = list(/datum/material/iron=2000) + attack_verb_continuous = list("hits", "thwacks", "bowls") + attack_verb_simple = list("hit", "thwack", "bowl") diff --git a/code/modules/slapcrafting/living_slapcraft.dm b/code/modules/slapcrafting/living_slapcraft.dm new file mode 100644 index 000000000000..4ee3550ad2e4 --- /dev/null +++ b/code/modules/slapcrafting/living_slapcraft.dm @@ -0,0 +1,101 @@ +/// Have a living mob attempt to do a slapcraft. The mob is using the second item on the first item. +/mob/living/proc/try_slapcraft(obj/item/first_item, obj/item/second_item) + // You cannot craft with items in storage, you must be holding them in hand + // or they must be on the floor + if((first_item.item_flags | second_item.item_flags) & IN_STORAGE) + return FALSE + + // We need to find a recipe where the first item corresponds to the first step + // ..and the second item corresponds to the second step + var/list/available_recipes = slapcraft_recipes_for_type(first_item.type) + if(!available_recipes) + return FALSE + + var/list/recipes = list() + for(var/datum/slapcraft_recipe/recipe in available_recipes) + //Always start from step one. + var/datum/slapcraft_step/step_one = SLAPCRAFT_STEP(recipe.steps[1]) + if(!step_one.perform_check(src, first_item, null)) + continue + + // Get next suitable step that is available after the first one would be performed. + var/list/pretend_list = list() + pretend_list[step_one.type] = TRUE + + var/datum/slapcraft_step/next_step = recipe.next_suitable_step(src, second_item, pretend_list, check_type_only = TRUE) + if(!next_step) + continue + if(!next_step.perform_check(src, second_item, null, check_type_only = TRUE)) + continue + + recipes += recipe + + if(!length(recipes)) + return FALSE + + var/datum/slapcraft_recipe/target_recipe + // If we have only one recipe, choose it instantly + if(recipes.len == 1) + target_recipe = recipes[1] + // If we have more recipes, let the user choose one with a radial menu. + else + var/list/recipe_choices = list() + var/list/recipe_choice_translation = list() + for(var/datum/slapcraft_recipe/recipe as anything in recipes) + recipe_choices[recipe.name] = recipe.get_radial_image() + recipe_choice_translation[recipe.name] = recipe + + var/choice = show_radial_menu(src, first_item, recipe_choices, custom_check = FALSE, require_near = TRUE) + if(choice) + target_recipe = recipe_choice_translation[choice] + if(!target_recipe) + return TRUE + + // We have found the recipe we want to do, make an assembly item where the first item used to be. + var/obj/item/slapcraft_assembly/assembly = new() + assembly.set_recipe(target_recipe) + + /// The location to place the assembly or items if the user cannot hold them + var/atom/fallback_loc = drop_location() + + var/datum/slapcraft_step/step_one = SLAPCRAFT_STEP(target_recipe.steps[1]) + + var/list/errors = list() + + // Instantly and silently perform the first step on the assembly, disassemble it if something went wrong + if(!step_one.perform(src, first_item, assembly, instant = TRUE, silent = TRUE, error_list = errors)) + assembly.disassemble() + if(length(errors)) + errors = span_danger("I cannot craft that.
[jointext(errors, "
")]") + to_chat(src, examine_block(errors)) + return TRUE + + fallback_loc = drop_location() //We may have moved + + if(!put_in_hands(assembly)) + assembly.forceMove(fallback_loc) + + var/datum/slapcraft_step/step_two = target_recipe.next_suitable_step(src, second_item, assembly.step_states, check_type_only = TRUE) + // Perform the second step, also disassemble it if we stopped working on it, because keeping 1 component assembly is futile. + if(!step_two.perform(src, second_item, assembly, error_list = errors)) + assembly.disassemble() + if(length(errors)) + errors = span_danger("I cannot craft that.
[jointext(errors, "
")]") + to_chat(src, examine_block(errors)) + return TRUE + + if(QDELING(assembly) && assembly.being_finished) + var/in_hands = FALSE + if(length(assembly.finished_items) == 1) + var/obj/item/finished_item = assembly.finished_items[1].resolve() + if(isitem(finished_item) && put_in_hands(finished_item)) + in_hands = TRUE + + if(!in_hands) + for(var/datum/weakref/W as anything in assembly.finished_items) + var/obj/item/finished_item = W.resolve() + finished_item.forceMove(fallback_loc) + + assembly.finished_items = null + + return TRUE diff --git a/code/modules/slapcrafting/recipes/components/metal_shaping.dm b/code/modules/slapcrafting/recipes/components/metal_shaping.dm new file mode 100644 index 000000000000..d120daedf5c5 --- /dev/null +++ b/code/modules/slapcrafting/recipes/components/metal_shaping.dm @@ -0,0 +1,49 @@ +//generic "shaping metal sheet(s) into items" recipies go here. +//these are a bit silly, and a more fleshed-out method of making metal crafts by hand would be nice to add later. +/datum/slapcraft_recipe/metal_rods + name = "metal rods" + examine_hint = "You could cut this into rods with a welder..." + category = SLAP_CAT_COMPONENTS + steps = list( + /datum/slapcraft_step/stack/iron/one, + /datum/slapcraft_step/tool/welder + ) + result_type = /obj/item/stack/rods/two + + +/datum/slapcraft_recipe/metal_ball + name = "metal pipe" + examine_hint = "You could form this into a ball, starting by heating it with a welder..." + category = SLAP_CAT_COMPONENTS + can_disassemble = FALSE + steps = list( + /datum/slapcraft_step/stack/iron/one, + /datum/slapcraft_step/tool/welder, + /datum/slapcraft_step/attack/bludgeon/heavy/metal + ) + result_type = /obj/item/metal_ball + +/datum/slapcraft_step/attack/bludgeon/heavy/metal + desc = "Use something heavy and blunt to hammer the metal into shape." + todo_desc = "You'll need to hammer the metal into shape..." + +/datum/slapcraft_recipe/pipe_from_metal + name = "metal pipe" + examine_hint = "You could form this into a pipe, starting by heating it with a welder..." + category = SLAP_CAT_COMPONENTS + can_disassemble = FALSE + steps = list( + /datum/slapcraft_step/stack/iron/one, + /datum/slapcraft_step/tool/welder, + /datum/slapcraft_step/attack/bludgeon/heavy/metal + ) + result_type = /obj/item/pipe/quaternary + +/datum/slapcraft_recipe/pipe_from_metal/create_item(item_path, obj/item/slapcraft_assembly/assembly) + var/obj/item/pipe/crafted_pipe = ..()//say thanks to smart pipes for this + crafted_pipe.pipe_type = /obj/machinery/atmospherics/pipe/smart + crafted_pipe.pipe_color = COLOR_VERY_LIGHT_GRAY + crafted_pipe.p_init_dir = ALL_CARDINALS + crafted_pipe.setDir(SOUTH) + crafted_pipe.update() + return crafted_pipe diff --git a/code/modules/slapcrafting/recipes/components/wired_rod.dm b/code/modules/slapcrafting/recipes/components/wired_rod.dm new file mode 100644 index 000000000000..056650d3ef6c --- /dev/null +++ b/code/modules/slapcrafting/recipes/components/wired_rod.dm @@ -0,0 +1,22 @@ +/datum/slapcraft_recipe/wirerod + name = "wired rod" + examine_hint = "With ten cable, you could attach something to this rod..." + category = SLAP_CAT_COMPONENTS + steps = list( + /datum/slapcraft_step/stack/rod/one, + /datum/slapcraft_step/stack/cable/ten + ) + result_type = /obj/item/wirerod + +/datum/slapcraft_recipe/wirerod_dissasemble + name = "unwired rod" + examine_hint = "You could cut the wire off with wirecutters..." + category = SLAP_CAT_COMPONENTS + steps = list( + /datum/slapcraft_step/item/wirerod, + /datum/slapcraft_step/tool/wirecutter, + ) + result_list = list( + /obj/item/stack/rods, + /obj/item/stack/cable_coil/ten + ) diff --git a/code/modules/slapcrafting/recipes/medical/prosthetics.dm b/code/modules/slapcrafting/recipes/medical/prosthetics.dm new file mode 100644 index 000000000000..f3181a22a3df --- /dev/null +++ b/code/modules/slapcrafting/recipes/medical/prosthetics.dm @@ -0,0 +1,12 @@ +//this is incredibly silly, but it's not like they function as eyes. +//it would still be nice to add more sane prosthetic crafts later. +/datum/slapcraft_recipe/flashlight_eyes + name = "flashlight eyes" + examine_hint = "You could connect two flashlights with some cable. Not sure why you'd want to..." + category = SLAP_CAT_MEDICAL + steps = list( + /datum/slapcraft_step/item/flashlight, + /datum/slapcraft_step/stack/cable/fifteen, + /datum/slapcraft_step/item/flashlight/again + ) + result_type = /obj/item/organ/eyes/robotic/flashlight diff --git a/code/modules/slapcrafting/recipes/misc/misc_items.dm b/code/modules/slapcrafting/recipes/misc/misc_items.dm new file mode 100644 index 000000000000..786530b3e694 --- /dev/null +++ b/code/modules/slapcrafting/recipes/misc/misc_items.dm @@ -0,0 +1,48 @@ +//these are items that don't fit in a category, and don't justify adding a new category. +//Try to avoid adding to this if you can so it's easier to find recipes. + +/datum/slapcraft_recipe/mousetrap + name = "mouse trap" + examine_hint = "You could add a metal rod to make a mouse trap..." + category = SLAP_CAT_MISC + steps = list( + /datum/slapcraft_step/stack/cardboard/one, + /datum/slapcraft_step/stack/rod/one + ) + result_type = /obj/item/assembly/mousetrap + +//paper +/datum/slapcraft_recipe/papersack + name = "paper sack" + examine_hint = "With a cutting tool and more paper, you could make a bag..." + category = SLAP_CAT_MISC + steps = list( + /datum/slapcraft_step/item/paper, + /datum/slapcraft_step/attack/sharp, + /datum/slapcraft_step/item/paper/second + ) + result_type = /obj/item/storage/box/papersack + +/datum/slapcraft_recipe/papercup + name = "paper cup" + examine_hint = "If you cut this and add a second sheet of paper, you could make a cup..." + category = SLAP_CAT_MISC + steps = list( + /datum/slapcraft_step/item/paper, + /datum/slapcraft_step/attack/sharp, + ) + result_type = /obj/item/reagent_containers/food/drinks/sillycup + +/datum/slapcraft_recipe/paperframe + name = "paper frame" + examine_hint = "With a plank of wood and some paper, you could make a paper frame for a wall or window..." + category = SLAP_CAT_MISC + steps = list( + /datum/slapcraft_step/stack/wood/one, + /datum/slapcraft_step/item/paper, + /datum/slapcraft_step/item/paper/second, + /datum/slapcraft_step/item/paper/third, + /datum/slapcraft_step/item/paper/fourth, + /datum/slapcraft_step/item/paper/fifth //okay maybe we need paper as a sheet type + ) + result_type = /obj/item/stack/sheet/paperframes diff --git a/code/modules/slapcrafting/recipes/processing/wood_processing.dm b/code/modules/slapcrafting/recipes/processing/wood_processing.dm new file mode 100644 index 000000000000..b7cc016fd774 --- /dev/null +++ b/code/modules/slapcrafting/recipes/processing/wood_processing.dm @@ -0,0 +1,34 @@ +/datum/slapcraft_recipe/chop_log + name = "chop log" + examine_hint = "You could chop it down into planks with something sharp..." + category = SLAP_CAT_PROCESSING + steps = list( + /datum/slapcraft_step/chop_log, + /datum/slapcraft_step/attack/sharp/chop_log + ) + result_type = /obj/item/stack/sheet/mineral/wood + +/datum/slapcraft_recipe/chop_log/create_item(item_path, obj/item/slapcraft_assembly/assembly) + var/obj/item/grown/log/log = locate() in assembly + var/plank_amount = log.get_plank_amount() + var/plank_type = log.plank_type + return new plank_type(null, plank_amount) + +/datum/slapcraft_step/chop_log + desc = "Start with a log." + finished_desc = "It's waiting to be chopped down into planks." + item_types = list(/obj/item/grown/log) + +/datum/slapcraft_step/attack/sharp/chop_log + perform_time = 0.7 SECONDS + force = 10 //hatchets have a force of 12, as reference + desc = "Chop the log into planks." + todo_desc = "You could chop logs in to planks..." + + finish_msg = "You finish chopping down the log into planks." + start_msg = "%USER% begins chopping the log." + start_msg_self = "You begin chopping the log with the sharp tool." + finish_msg = "%USER% chops down the log into planks." + finish_msg_self = "You chop the log into planks." + +//paper processing will be added here later diff --git a/code/modules/slapcrafting/recipes/rustic/torch.dm b/code/modules/slapcrafting/recipes/rustic/torch.dm new file mode 100644 index 000000000000..44e58e12ab69 --- /dev/null +++ b/code/modules/slapcrafting/recipes/rustic/torch.dm @@ -0,0 +1,50 @@ +/datum/slapcraft_recipe/torch + name = "torch" + examine_hint = "You could craft a torch, starting by adding dried leaf to a log..." + category = SLAP_CAT_RUSTIC + steps = list( + /datum/slapcraft_step/log, + /datum/slapcraft_step/dried_leaf, + /datum/slapcraft_step/tool/knife/carve_torch + ) + result_type = /obj/item/flashlight/flare/torch + +/datum/slapcraft_step/log + desc = "Start with a log." + item_types = list(/obj/item/grown/log) + blacklist_item_types = list( + /obj/item/grown/log/steel, + /obj/item/grown/log/bamboo, + ) + +/datum/slapcraft_step/dried_leaf + desc = "Add a dried leaf to a log." + finished_desc = "A dried leaf has been added." + + start_msg = "%USER% begins wrapping the log with some dried leaf." + start_msg_self = "You begin wrapping the log with some dried leaf." + finish_msg = "%USER% wraps the log with some dried leaf." + finish_msg_self = "You wrap the log with some dried leaf." + item_types = list( + /obj/item/food/grown/tobacco, + /obj/item/food/grown/tea, + /obj/item/food/grown/ambrosia/vulgaris, + /obj/item/food/grown/ambrosia/deus, + /obj/item/food/grown/wheat, + ) + +/datum/slapcraft_step/dried_leaf/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + . = ..() + + if(!HAS_TRAIT(item, TRAIT_DRIED)) + error_list += "[item] is not dried." + . = FALSE + +/datum/slapcraft_step/tool/knife/carve_torch + desc = "Carve the torch from a log." + todo_desc = "You could carve out the torch and piece it together..." + + start_msg = "%USER% begins to cobble the torch together." + start_msg_self = "You begin to cobble the torch together." + finish_msg = "%USER% finishes cobbling the torch together." + finish_msg_self = "You finish cobbling the torch together." diff --git a/code/modules/slapcrafting/recipes/tools/hand_tools.dm b/code/modules/slapcrafting/recipes/tools/hand_tools.dm new file mode 100644 index 000000000000..fffd2f606749 --- /dev/null +++ b/code/modules/slapcrafting/recipes/tools/hand_tools.dm @@ -0,0 +1,10 @@ +/datum/slapcraft_recipe/improvised_pickaxe + name = "improvised_pickaxe" + examine_hint = "You could attach a knife and use it as a makeshift pickaxe..." + category = SLAP_CAT_TOOLS + steps = list( + /datum/slapcraft_step/item/crowbar, + /datum/slapcraft_step/item/metal_knife, + /datum/slapcraft_step/tool/welder/weld_together + ) + result_type = /obj/item/pickaxe/improvised diff --git a/code/modules/slapcrafting/recipes/weapons/grenades.dm b/code/modules/slapcrafting/recipes/weapons/grenades.dm new file mode 100644 index 000000000000..0f507f46315a --- /dev/null +++ b/code/modules/slapcrafting/recipes/weapons/grenades.dm @@ -0,0 +1,46 @@ +/datum/slapcraft_recipe/ied + name = "improvised explosive device" + examine_hint = "You could craft an IED, starting by filling this with fuel and adding an igniter..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/reagent_container/ied_can, + /datum/slapcraft_step/item/igniter, + /datum/slapcraft_step/stack/cable/five + ) + result_type = /obj/item/grenade/iedcasing + +/datum/slapcraft_step/reagent_container/ied_can + desc = "Start with a soda can filled with welding fuel." + finished_desc = "A soda can filled with welding fuel has been added." + item_types = list(/obj/item/reagent_containers/food/drinks/soda_cans) + reagent_type = /datum/reagent/fuel + reagent_volume = 50 + insert_item_into_result = TRUE + +/datum/slapcraft_recipe/molotov + name = "molotov cocktail" + examine_hint = "With a bottle of flammable liquid and something to light, you could create a molotov..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/booze_bottle, + /datum/slapcraft_step/stack/or_other/molotov_fuse + ) + result_type = /obj/item/reagent_containers/food/drinks/bottle/molotov + +/datum/slapcraft_step/booze_bottle + desc = "Get a bottle full of alcohol or another flammable substance." + finished_desc = "Now you just need some kind of fuse..." + insert_item_into_result = TRUE //the rest is handled in bottle.dm + item_types = list(/obj/item/reagent_containers/food/drinks/bottle) + +/datum/slapcraft_step/stack/or_other/molotov_fuse + desc = "Add a rag, cloth, or something else to work as a fuse." + todo_desc = "Now you just need some kind of fuse..." + item_types = list( + /obj/item/reagent_containers/glass/rag, + /obj/item/stack/sheet/cloth, + /obj/item/clothing/neck/tie + ) + amounts = list( + /obj/item/stack/sheet/cloth = 1 + ) diff --git a/code/modules/slapcrafting/recipes/weapons/melee.dm b/code/modules/slapcrafting/recipes/weapons/melee.dm new file mode 100644 index 000000000000..03b66b62834c --- /dev/null +++ b/code/modules/slapcrafting/recipes/weapons/melee.dm @@ -0,0 +1,98 @@ +//Spears +/datum/slapcraft_recipe/spear + name = "makeshift spear" + examine_hint = "You could attach a shard of glass to make a crude spear..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/wirerod, + /datum/slapcraft_step/item/glass_shard/insert //this is for different glass types + ) + result_type = /obj/item/spear + +/datum/slapcraft_recipe/explosive_lance + name = "explosive lance" + examine_hint = "You could attach a grenade, though that might be a bad idea..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/spear, + /datum/slapcraft_step/item/grenade, + /datum/slapcraft_step/stack/or_other/binding + ) + result_type = /obj/item/spear/explosive + +/datum/slapcraft_step/spear + desc = "Start with a spear." + item_types = list(/obj/item/spear) + +/datum/slapcraft_recipe/explosive_lance/create_item(item_path, obj/item/slapcraft_assembly/assembly) + var/obj/item/spear/explosive/spear = new item_path(assembly.drop_location()) + var/obj/item/grenade/G = locate() in assembly + spear.set_explosive(G) + return spear + + +//Stunprods +/datum/slapcraft_recipe/stunprod + name = "stunprod" + examine_hint = "You could attach an igniter to use as a stunprod..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/wirerod, + /datum/slapcraft_step/item/igniter + ) + result_type = /obj/item/melee/baton/security/cattleprod + +/datum/slapcraft_recipe/teleprod + name = "teleprod" + examine_hint = "A bluespace crystal could fit in the igniter..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/cattleprod, + /datum/slapcraft_step/stack/teleprod_crystal + ) + result_type = /obj/item/melee/baton/security/cattleprod/teleprod + +/datum/slapcraft_step/item/cattleprod + desc = "Start with a stunprod." + item_types = list(/obj/item/melee/baton/security/cattleprod) + +/datum/slapcraft_step/stack/teleprod_crystal + desc = "Attach a bluespace crystal to the igniter." + item_types = list(/obj/item/stack/ore/bluespace_crystal) + + +//shivs +/datum/slapcraft_recipe/glass_shiv + name = "glass shiv" + examine_hint = "With some cloth or tape wrapped around the base, this could work as a shiv..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/glass_shard/insert, //this is for different glass types + /datum/slapcraft_step/stack/or_other/shiv_wrap + + ) + result_type = /obj/item/knife/shiv + +/datum/slapcraft_step/stack/or_other/shiv_wrap + desc = "Wrap some cloth or tape around the base." + todo_desc = "You could use some cloth or tape to hold the shard without cutting your hand..." + item_types = list( + /obj/item/stack/sticky_tape, + /obj/item/stack/sheet/cloth + ) + amounts = list( + /obj/item/stack/sticky_tape = 3, + /obj/item/stack/sheet/cloth = 1, + ) + +//misc. weapons +/datum/slapcraft_recipe/mace + name = "iron mace" + examine_hint = "You could attach a metal ball to make a crude mace..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/stack/rod/one, + /datum/slapcraft_step/item/metal_ball, + /datum/slapcraft_step/tool/welder/weld_together + ) + result_type = /obj/item/mace diff --git a/code/modules/slapcrafting/recipes/weapons/ranged.dm b/code/modules/slapcrafting/recipes/weapons/ranged.dm new file mode 100644 index 000000000000..3d5148fb092f --- /dev/null +++ b/code/modules/slapcrafting/recipes/weapons/ranged.dm @@ -0,0 +1,23 @@ +//Is a flamethrower a gun? I'm still not sure. +/datum/slapcraft_recipe/flamethrower + name = "flamethrower" + examine_hint = "You could craft a flamethrower, starting by attaching an igniter..." + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/welder/base_only, + /datum/slapcraft_step/item/igniter, + /datum/slapcraft_step/stack/rod/one, + /datum/slapcraft_step/tool/screwdriver/secure + ) + result_type = /obj/item/flamethrower + +/datum/slapcraft_recipe/pneumatic_cannon + name = "pneumatic cannon" + category = SLAP_CAT_WEAPONS + steps = list( + /datum/slapcraft_step/item/pipe, + /datum/slapcraft_step/stack/rod/two, + /datum/slapcraft_step/item/pipe/second, + /datum/slapcraft_step/tool/welder/weld_together + ) + result_type = /obj/item/pneumatic_cannon/ghetto diff --git a/code/modules/slapcrafting/recipes/weapons/thrown.dm b/code/modules/slapcrafting/recipes/weapons/thrown.dm new file mode 100644 index 000000000000..0ddb3b1e8383 --- /dev/null +++ b/code/modules/slapcrafting/recipes/weapons/thrown.dm @@ -0,0 +1,12 @@ +/datum/slapcraft_recipe/bola + name = "bola" + examine_hint = "You could tie some weighted balls together with cable to make a bola..." + category = SLAP_CAT_WEAPONS + steps = list( + //this looks deranged but it makes more sense to use cable on a ball, rather then the other way around. + /datum/slapcraft_step/item/metal_ball, + /datum/slapcraft_step/stack/cable/fifteen, + /datum/slapcraft_step/item/metal_ball/second, + /datum/slapcraft_step/item/metal_ball/third + ) + result_type = /obj/item/restraints/legcuffs/bola diff --git a/code/modules/slapcrafting/slapcraft_assembly.dm b/code/modules/slapcrafting/slapcraft_assembly.dm new file mode 100644 index 000000000000..e18527b9f886 --- /dev/null +++ b/code/modules/slapcrafting/slapcraft_assembly.dm @@ -0,0 +1,139 @@ +/obj/item/slapcraft_assembly + name = "slapcraft assembly" + w_class = WEIGHT_CLASS_NORMAL + /// Recipe this assembly is trying to make + var/datum/slapcraft_recipe/recipe + /// Associative list of whether the steps are finished or not + var/list/step_states + /// Whether it's in the process of being disassembled. + var/disassembling = FALSE + /// Whether it's in the process of being finished. + var/being_finished = FALSE + /// All items that want to place itself in the resulting item after the recipe is finished. + var/list/items_to_place_in_result = list() + + ///A list of weakrefs to finished items (not including items-in-items), used to move items around after they're complete and this object is qdeling. + var/list/datum/weakref/finished_items = list() + +/obj/item/slapcraft_assembly/examine(mob/user) + . = ..() + // Describe the steps that already have been performed on the assembly + for(var/step_path in recipe.steps) + if(step_states[step_path]) + var/datum/slapcraft_step/done_step = SLAPCRAFT_STEP(step_path) + . += span_notice(done_step.finished_desc) + // Describe how the next steps could be performed + var/list/next_steps = recipe.get_possible_next_steps(step_states) + for(var/step_type in next_steps) + var/datum/slapcraft_step/next_step = SLAPCRAFT_STEP(step_type) + . += span_boldnotice(next_step.todo_desc) + // And tell them if it can be disassembled back into the components aswell. + if(recipe.can_disassemble) + . += span_boldnotice("Use in hand to disassemble this back into components.") + +/obj/item/slapcraft_assembly/attackby(obj/item/item, mob/user, params) + // Get the next step + var/datum/slapcraft_step/next_step = recipe.next_suitable_step(user, item, step_states) + if(!next_step) + return ..() + // Try and do it + next_step.perform(user, item, src) + return TRUE + +/obj/item/slapcraft_assembly/update_overlays() + . = ..() + /// Add the appearance of all the components that the assembly is being made with. + for(var/obj/item/component as anything in contents) + var/mutable_appearance/component_overlay = mutable_appearance(component.icon, component.icon_state) + component_overlay.pixel_x = component.pixel_x + component_overlay.pixel_y = component.pixel_y + component_overlay.overlays = component.overlays + . += component_overlay + +/obj/item/slapcraft_assembly/attack_self(mob/user) + if(recipe.can_disassemble) + to_chat(user, span_notice("You take apart \the [src]")) + disassemble() + else + to_chat(user, span_warning("You can't take this apart!")) + +// Something in the assembly got deleted. Perhaps burned, melted or otherwise. +/obj/item/slapcraft_assembly/handle_atom_del(atom/deleted_atom) + disassemble() + +// Most likely something gets teleported out of the assembly, or pulled out by other means +/obj/item/slapcraft_assembly/Exited(atom/movable/gone, direction) + . = ..() + items_to_place_in_result -= gone + disassemble() + +/obj/item/slapcraft_assembly/Entered(atom/movable/arrived, direction) + . = ..() + update_appearance() + +/obj/item/slapcraft_assembly/Destroy(force) + disassembling = TRUE + for(var/obj/item/component as anything in contents) + if(QDELETED(component)) + continue + qdel(component) + return ..() + +/// Disassembles the assembly, either qdeling it if its in nullspace, or dumping all of its components on the ground and then qdeling it. +/obj/item/slapcraft_assembly/proc/disassemble(force = FALSE) + if((disassembling || being_finished) && !force) + return + + disassembling = TRUE + + var/atom/dump_loc = drop_location() + + if(!dump_loc) + qdel(src) + return + + var/mob/living/holder + if(ismob(loc)) + holder = loc + if(!holder.is_holding(src)) + holder = null + + moveToNullspace() + + if(length(contents) <= 2 && holder) + for(var/obj/item/component as anything in contents) + // Handle atom del causing the assembly to disassemble, don't touch the deleted atom + if(QDELETED(component)) + continue + + if(!holder.put_in_hands(component)) + component.forceMove(dump_loc) + else + for(var/obj/item/component as anything in contents) + // Handle atom del causing the assembly to disassemble, don't touch the deleted atom + if(QDELETED(component)) + continue + component.forceMove(dump_loc) + + qdel(src) + +/// Progresses the assembly to the next step and finishes it if made it through the last step. +/obj/item/slapcraft_assembly/proc/finished_step(mob/living/user, datum/slapcraft_step/step_datum) + // Mark the step as finished. + step_states[step_datum.type] = TRUE + + if(recipe.is_finished(step_states)) + recipe.finish_recipe(user, src) + +/// Sets the recipe of this assembly aswell making the name and description matching. +/obj/item/slapcraft_assembly/proc/set_recipe(datum/slapcraft_recipe/set_recipe) + recipe = set_recipe + w_class = recipe.assembly_weight_class + name = "[set_recipe.name] [set_recipe.assembly_name_suffix]" + desc = "This seems to be an assembly to craft \the [set_recipe.name]" + + // Set step states for this recipe. + step_states = list() + for(var/step_path in set_recipe.steps) + step_states[step_path] = FALSE + diff --git a/code/modules/slapcrafting/slapcraft_handbook.dm b/code/modules/slapcrafting/slapcraft_handbook.dm new file mode 100644 index 000000000000..6919614ec740 --- /dev/null +++ b/code/modules/slapcrafting/slapcraft_handbook.dm @@ -0,0 +1,125 @@ +/datum/slapcraft_handbook + var/current_category = SLAP_CAT_WEAPONS + var/current_subcategory = SLAP_SUBCAT_MISC + var/current_recipe + +/// Gets the description of the step. This can include a href link. +/datum/slapcraft_handbook/proc/print_step_description(datum/slapcraft_step/craft_step) + if(!craft_step.recipe_link) + return craft_step.desc + // This step links to some recipe, linkify the description with a href + . = craft_step.desc + . = replacetext(., "%ENDLINK%", "") + . = replacetext(., "%LINK%", "") + +/datum/slapcraft_handbook/proc/print_recipe(datum/slapcraft_recipe/recipe, in_handbook = FALSE, background_color = "#23273C") + var/list/dat = list() + var/recipe_type = recipe.type + var/first_cell + var/second_cell + if(in_handbook) + first_cell = "[recipe.name]" + second_cell = "Popup Recipe" + else + first_cell = "[recipe.name]" + second_cell = "Goto Recipe" + dat += "" + dat += "[first_cell][second_cell]" + dat += "" + if(!in_handbook || recipe_type == current_recipe) + var/steps_string = "" + var/list_string = "" + var/first = TRUE + var/step_count = 0 + for(var/step_type in recipe.steps) + var/datum/slapcraft_step/step_datum = SLAPCRAFT_STEP(step_type) + step_count++ + if(!first) + steps_string += "
" + list_string += "
" + var/count_string + switch(recipe.step_order) + if(SLAP_ORDER_STEP_BY_STEP) + count_string = step_count + if(SLAP_ORDER_FIRST_AND_LAST) + if(step_count == 1 || step_count == recipe.steps.len) + count_string = step_count + else + count_string = "X" + if(SLAP_ORDER_FIRST_THEN_FREEFORM) + if(step_count == 1) + count_string = step_count + else + count_string = "X" + var/opt_string = step_datum.optional ? "(optional)" : "" + steps_string += "[count_string]. [opt_string] [print_step_description(step_datum)]" + list_string += "[step_datum.list_desc]" + first = FALSE + // If there's a recipe, add a row with it. + if(recipe.desc) + dat += "[recipe.desc]" + dat += "[steps_string][list_string]" + return dat + +/datum/slapcraft_handbook/proc/show(mob/user) + var/list/dat = list() + + for(var/category in GLOB.slapcraft_categorized_recipes) + dat += "[category] " + dat += "
" + var/list/subcategory_list = GLOB.slapcraft_categorized_recipes[current_category] + for(var/subcategory in subcategory_list) + dat += "[current_subcategory] " + dat += "
" + + dat += "" + var/even = FALSE + var/list/recipe_list = subcategory_list[current_subcategory] + for(var/datum/slapcraft_recipe/recipe as anything in recipe_list) + var/background_cl = even ? "#17191C" : "#23273C" + even = !even + dat += print_recipe(recipe, TRUE, background_cl) + + dat += "
" + + var/datum/browser/popup = new(user, "slapcraft_handbook", "Slapcraft Handbook", 600, 800) + popup.set_content(dat.Join()) + popup.open() + return + +/datum/slapcraft_handbook/Topic(href, href_list) + if(..()) + return + if(href_list["preference"]) + switch(href_list["preference"]) + if("set_category") + current_category = href_list["tab"] + if("set_subcategory") + current_subcategory = href_list["tab"] + if("set_recipe") + current_recipe = text2path(href_list["recipe"]) + if("popup_recipe") + var/recipe_type_to_pop = text2path(href_list["recipe"]) + popup_recipe(usr, recipe_type_to_pop) + return + if("goto_recipe") + var/recipe_type = text2path(href_list["recipe"]) + var/datum/slapcraft_recipe/recipe = SLAPCRAFT_RECIPE(recipe_type) + current_recipe = recipe_type + current_category = recipe.category + current_subcategory = recipe.subcategory + + show(usr) + +/datum/slapcraft_handbook/proc/popup_recipe(mob/user, recipe_type) + var/list/dat = list() + + dat += "" + var/datum/slapcraft_recipe/recipe = SLAPCRAFT_RECIPE(recipe_type) + dat += print_recipe(recipe) + dat += "
" + + var/datum/browser/popup = new(user, "[recipe_type]_popup", "[recipe.category] - [recipe.subcategory] - [recipe.name]", 500, 200) + popup.set_content(dat.Join()) + popup.open() + return diff --git a/code/modules/slapcrafting/slapcraft_recipe.dm b/code/modules/slapcrafting/slapcraft_recipe.dm new file mode 100644 index 000000000000..f9bdf68c0177 --- /dev/null +++ b/code/modules/slapcrafting/slapcraft_recipe.dm @@ -0,0 +1,246 @@ +/datum/slapcraft_recipe + abstract_type = /datum/slapcraft_recipe + /// Name of the recipe. Will use the resulting atom's name if not specified + var/name + /// Description of the recipe. May be displayed as additional info in the handbook. + var/desc + /// Hint displayed to the user which examines the item required for the first step. + var/examine_hint + + /// List of all steps to finish this recipe + var/list/steps + + /// Type of the item that will be yielded as the result. + var/result_type + /// Amount of how many resulting types will be crafted. + var/result_amount = 1 + /// Instead of result type you can use this as associative list of types to amounts for a more varied output + var/list/result_list + + /// Weight class of the assemblies for this recipe. + var/assembly_weight_class = WEIGHT_CLASS_NORMAL + /// Suffix for the assembly name. + var/assembly_name_suffix = "assembly" + + /// Category this recipe is in the handbook. + var/category = SLAP_CAT_MISC + /// Subcategory this recipe is in the handbook. + var/subcategory = SLAP_SUBCAT_MISC + + /// Appearance in the radial menu for the user to choose from if there are recipe collisions. + var/image/radial_appearance + /// Order in which the steps should be performed. + var/step_order = SLAP_ORDER_STEP_BY_STEP + // Can this assembly be taken apart before it's finished? + var/can_disassemble = TRUE + + /// Should we print text when we finish? Mostly used to de-bloat chat. + var/show_finish_text = FALSE + +/datum/slapcraft_recipe/New() + . = ..() + + // Set the name from the resulting atom if the name is missing and resulting type is present. + if(!name) + var/atom/movable/result_cast + if(result_list) + for(var/path in result_list) + // First association it can get, then break. + result_cast = path + break + else if(result_type) + result_cast = result_type + if(result_cast) + name = initial(result_cast.name) + +/datum/slapcraft_recipe/proc/get_radial_image() + if(!radial_appearance) + radial_appearance = make_radial_image() + return radial_appearance + +/// Returns the next suitable step to be performed with the item by the user with such step_states +/datum/slapcraft_recipe/proc/next_suitable_step(mob/living/user, obj/item/item, list/step_states, check_type_only) + var/datum/slapcraft_step/chosen_step + for(var/step_type in steps) + if(!check_correct_step(step_type, step_states)) + continue + var/datum/slapcraft_step/iterated_step = SLAPCRAFT_STEP(step_type) + if(!iterated_step.perform_check(user, item, null, check_type_only = check_type_only)) + continue + chosen_step = iterated_step + break + return chosen_step + +/datum/slapcraft_recipe/proc/is_finished(list/step_states, add_step) + // Adds step checks if the recipe would be finished with the added step + if(add_step) + step_states = step_states.Copy() + step_states[add_step] = TRUE + switch(step_order) + if(SLAP_ORDER_STEP_BY_STEP, SLAP_ORDER_FIRST_AND_LAST) + //See if the last step was finished. + var/last_path = steps[steps.len] + if(step_states[last_path]) + return TRUE + if(SLAP_ORDER_FIRST_THEN_FREEFORM) + var/any_missing = FALSE + for(var/step_path in steps) + if(!step_states[step_path]) + any_missing = TRUE + break + if(!any_missing) + return TRUE + return FALSE + +/datum/slapcraft_recipe/proc/get_possible_next_steps(list/step_states) + var/list/possible = list() + for(var/step_type in steps) + if(!check_correct_step(step_type, step_states)) + continue + possible += step_type + return possible + +/// Checks if a step of type `step_type` can be performed with the given `step_states` state. +/datum/slapcraft_recipe/proc/check_correct_step(step_type, list/step_states) + // Already finished this step. + if(step_states[step_type]) + return FALSE + var/first_step = steps[1] + // We are missing the first step being done, only allow it until we allow something else + if(!step_states[first_step]) + if(step_type == first_step) + return TRUE + else + return FALSE + switch(step_order) + if(SLAP_ORDER_STEP_BY_STEP) + // Just in case any step is optional we need to figure out which is the furthest step performed. + var/furthest_step = 0 + var/step_count = 0 + for(var/iterated_step in steps) + step_count++ + if(step_states[iterated_step]) + furthest_step = step_count + + step_count = 0 + for(var/iterated_step in steps) + step_count++ + // Step is done, continue + if(step_states[iterated_step]) + continue + // This step is before one we have already completed, continue + // (essentially when skipping an optional step, we dont want to allow that step to be performed) + if(step_count <= furthest_step) + continue + //We reach a step that isn't done. Check if the checked step is the one + if(iterated_step == step_type) + return TRUE + // If the step is optional, perhaps the next one will be eligible. + var/datum/slapcraft_step/iterated_step_datum = SLAPCRAFT_STEP(iterated_step) + if(iterated_step_datum.optional) + continue + // It wasn't it, return FALSE + return FALSE + if(SLAP_ORDER_FIRST_AND_LAST) + var/last_step = steps[steps.len] + // If we are trying to do the last step, make sure all the rest ones are finished + if(step_type == last_step) + for(var/iterated_step in steps) + if(step_states[iterated_step]) + continue + if(iterated_step == last_step) + return TRUE + // If the step is optional, we don't mind. + var/datum/slapcraft_step/iterated_step_datum = SLAPCRAFT_STEP(iterated_step) + if(iterated_step_datum.optional) + continue + return FALSE + + // Middle step, with the last step not being finished, and the first step being finished + return TRUE + + if(SLAP_ORDER_FIRST_THEN_FREEFORM) + // We have the first one and we are not repeating a step. + return TRUE + + return FALSE + +/datum/slapcraft_recipe/proc/make_radial_image() + // If we make an explicit result type, use its icon and icon state in the radial menu to display it. + var/atom/movable/result_cast = result_type + if(result_list) + for(var/path in result_list) + // First association it can get, then break. + result_cast = path + break + else if(result_type) + result_cast = result_type + if(result_cast) + return image(icon = initial(result_cast.icon), icon_state = initial(result_cast.icon_state)) + //Fallback image idk what to put here. + return image(icon = 'icons/hud/radial.dmi', icon_state = "radial_rotate") + +/// User has finished the recipe in an assembly. +/datum/slapcraft_recipe/proc/finish_recipe(mob/living/user, obj/item/slapcraft_assembly/assembly) + if(show_finish_text) + to_chat(user, span_notice("You finish \the [name].")) + + assembly.being_finished = TRUE + var/list/results = list() + create_items(assembly, results) + + // Move items which wanted to go to the resulted item into it. Only supports for the first created item. + var/atom/movable/first_item = results[1] + + for(var/obj/item/item as anything in assembly.items_to_place_in_result) + item.forceMove(first_item) + + for(var/obj/item/item as anything in (results - assembly.items_to_place_in_result)) + assembly.finished_items += WEAKREF(item) + + after_create_items(results, assembly) + dispose_assembly(assembly) + + //Finally, CheckParts on the resulting items. + for(var/atom/movable/result_item as anything in results) + result_item.CheckParts() + +/// Runs when the last step tries to be performed and cancels the step if it returns FALSE. Could be used to validate location in structure construction via slap crafting. +/datum/slapcraft_recipe/proc/can_finish(mob/living/user, obj/item/slapcraft_assembly/assembly) + return TRUE + +/// The proc that creates the resulted item(s). Make sure to add them to the passed `results` list. +/datum/slapcraft_recipe/proc/create_items(obj/item/slapcraft_assembly/assembly, list/results) + /// Check if we want to craft multiple items, if yes then populate the list passed by the argument with them. + var/list/multi_to_craft + if(result_list) + multi_to_craft = result_list + else if (result_amount) + multi_to_craft = list() + multi_to_craft[result_type] = result_amount + + if(multi_to_craft.len) + for(var/path in multi_to_craft) + var/amount = multi_to_craft[path] + var/shift_pixels = (amount > 1) + + for(var/i in 1 to amount) + var/atom/movable/new_thing = create_item(path, assembly) + + if(shift_pixels) + new_thing.pixel_x += rand(-4,4) + new_thing.pixel_y += rand(-4,4) + results += new_thing + +/// Creates and returns a new item. This gets called for every item that is supposed to be created in the recipe. +/datum/slapcraft_recipe/proc/create_item(item_path, obj/item/slapcraft_assembly/assembly) + return new item_path() + +/// Behaviour after the item is created, and before the slapcrafting assembly is disposed. +/// Here you can move the components into the item if you wish, or do other stuff with them. +/datum/slapcraft_recipe/proc/after_create_items(list/items_list, obj/item/slapcraft_assembly/assembly) + return + +/// Here is the proc to get rid of the assembly, should one want to override it to handle that differently. +/datum/slapcraft_recipe/proc/dispose_assembly(obj/item/slapcraft_assembly/assembly) + qdel(assembly) diff --git a/code/modules/slapcrafting/slapcraft_step.dm b/code/modules/slapcrafting/slapcraft_step.dm new file mode 100644 index 000000000000..2fe6f290b1ef --- /dev/null +++ b/code/modules/slapcrafting/slapcraft_step.dm @@ -0,0 +1,251 @@ +/datum/slapcraft_step + abstract_type = /datum/slapcraft_step + /// The description of the step, it shows in the slapcraft handbook + var/desc + /// The description of the finished step when you examine the assembly. + var/finished_desc + /// The description of the step when it's the next one to perform in the assembly. + var/todo_desc + + /// Quantified description of the required element of this step. "screwdriver" or "15 cable", or "can with 50u. fuel" etc. + var/list_desc + + /// Visible message when you finish the step. + var/finish_msg + /// Visible message when you start the step. + var/start_msg + /// Personalized visible message when you finish the step. + var/finish_msg_self + /// Personalized visible message when you start the step. + var/start_msg_self + + /// If the user is holding the item, check if they need to be able to drop it to be able to craft with it. + var/check_if_mob_can_drop_item = TRUE + /// Whether we insert the valid item in the assembly. + var/insert_item = TRUE + /// Whether we insert the item into the resulting item's contents + var/insert_item_into_result = FALSE + /// How long does it take to perform the step. + var/perform_time = 2 SECONDS + /// Whether we should check the types of the item, if FALSE then make sure `can_perform()` checks conditions. + var/check_types = TRUE + /// List of types of items that can be used. Only relevant if `check_types` is TRUE + var/list/item_types + /// The typecache of types of the items. + var/list/typecache + /// Item types to make a typecache of for blacklisting. + var/list/blacklist_item_types + /// Typecache of the blacklist + var/list/blacklist_typecache + /// The recipe this step can link to. Make sure to include %LINK% and %ENDLINK% in `desc` to properly linkify it. + var/recipe_link + /// Whether this step is optional. This is forbidden for first and last steps of recipes, and cannot be used on recipes with an order of SLAP_ORDER_FIRST_THEN_FREEFORM + var/optional = FALSE + +/datum/slapcraft_step/New() + . = ..() + if(check_types) + if(!item_types || !length(item_types)) + CRASH("Slapcraft step of type [type] wants to check types but is missing `item_types`") + typecache = typecacheof(item_types) + if(blacklist_item_types) + blacklist_typecache = typecacheof(blacklist_item_types) + if(!list_desc) + list_desc = make_list_desc() + if(!desc) + desc = make_desc() + if(!todo_desc) + todo_desc = make_todo_desc() + if(!finished_desc) + finished_desc = make_finished_desc() + + if(!finish_msg) + finish_msg = make_finish_msg() + if(!start_msg && perform_time) + start_msg = make_start_msg() + if(!finish_msg_self) + finish_msg_self = make_finish_msg_self() + if(!start_msg_self && perform_time) + start_msg_self = make_start_msg_self() + +/// Checks whether a type is in the typecache of the step. +/datum/slapcraft_step/proc/check_type(checked_type) + if(!typecache) + CRASH("Slapcraft step [type] tried to check a type without a typecache!") + if(typecache[checked_type]) + if(blacklist_typecache?[checked_type]) + return FALSE + return TRUE + + return FALSE + +/// Checks if the passed item is a proper type to perform this step, and whether it passes the `can_perform()` check. Assembly can be null +/datum/slapcraft_step/proc/perform_check( + mob/living/user, + obj/item/item, + obj/item/slapcraft_assembly/assembly, + check_type_only, + error_list = list() + ) + + if(check_types && !check_type(item.type)) + return FALSE + + if(!can_perform(user, item, assembly, error_list)) + if(check_types && check_type_only) + return TRUE + return FALSE + + //Check if we finish the assembly, and whether that's possible + if(assembly) + // If would be finished, but can't be + if(assembly.recipe.is_finished(assembly.step_states, type) && !assembly.recipe.can_finish(user, assembly)) + return FALSE + return TRUE + +/// Make a user perform this step, by using an item on the assembly, trying to progress the assembly. +/datum/slapcraft_step/proc/perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, instant = FALSE, silent = FALSE, list/error_list = list()) + if(!perform_check(user, item, assembly, error_list = error_list) || !assembly.recipe.check_correct_step(type, assembly.step_states)) + return FALSE + + if(perform_time && !instant) + if(!silent) + user.visible_message( + span_notice(step_replace_text(start_msg, user, item, assembly)), + span_notice(step_replace_text(start_msg_self, user, item, assembly)) + ) + if(!perform_do_after(user, item, assembly, perform_time * get_speed_multiplier(user, item, assembly))) + return FALSE + + // Do checks again because we spent time in a do_after(), this time also check deletions. + if(QDELETED(assembly) || QDELETED(item) || !perform_check(user, item, assembly) || !assembly.recipe.check_correct_step(type, assembly.step_states)) + return FALSE + + if(!silent) + user.visible_message( + span_notice(step_replace_text(finish_msg, user, item, assembly)), + span_notice(step_replace_text(finish_msg_self, user, item, assembly)) + ) + + if(!silent) + play_perform_sound(user, item, assembly) + + on_perform(user, item, assembly) + + if(insert_item) + move_item_to_assembly(user, item, assembly) + + if(progress_crafting(user, item, assembly)) + assembly.finished_step(user, src) + return TRUE + +/// Text replacing for sending visibile messages when the steps are happening. +/datum/slapcraft_step/proc/step_replace_text(msg, mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + msg = replacetext(msg,"%USER%","[user]") + msg = replacetext(msg,"%ITEM%","\improper [item]") + msg = replacetext(msg,"%TARGET%","\improper [assembly]") + return msg + +/// Below are virtual procs I allow steps to override for their specific behaviours. + +/// Checks whether a user can perform this step with an item. Exists so steps can override this proc for their own behavioural checks. +/// `assembly` can be null here, when the recipe finding checks are trying to figure out what recipe we can make. +/datum/slapcraft_step/proc/can_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, list/error_list = list()) + SHOULD_CALL_PARENT(TRUE) + . = TRUE + // Check if the mob can actually remove the item from their inventory + if(check_if_mob_can_drop_item && (item.item_flags & IN_INVENTORY) && !user.canUnequipItem(item)) + error_list += "I cannot drop [item]." + . = FALSE + +/// Behaviour to happen on performing this step. Perhaps removing a portion of reagents to create an IED or something. +/datum/slapcraft_step/proc/on_perform(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + return + +/// Behaviour to move the item into the assembly. Stackable items may want to change how they do this. +/datum/slapcraft_step/proc/move_item_to_assembly(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + item.forceMove(assembly) + if(insert_item_into_result) + assembly.items_to_place_in_result += item + +/// Whether the step progresses towards the next step when successfully performed. +/// This can be used to allow "freeform" crafting to put more things into an assembly than required, possibly utilizing it for things like custom burgers +/datum/slapcraft_step/proc/progress_crafting(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + return TRUE + +/// Returns a speed multiplier to the time it takes for the step to complete. Useful for tool-related steps +/datum/slapcraft_step/proc/get_speed_multiplier(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + return 1 + +/// Proc to perform handling a do_after, return FALSE if it failed, TRUE if succeeded. +/datum/slapcraft_step/proc/perform_do_after(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly, time_to_do) + var/flags = DO_PUBLIC + if(user.is_holding(item) && user.is_holding(assembly)) + flags |= IGNORE_USER_LOC_CHANGE + + if(!do_after(user, item, time_to_do, flags, interaction_key = "SLAPCRAFT", display = image('icons/hud/do_after.dmi', "hammer"))) + return FALSE + return TRUE + +/// Plays a sound on successfully performing the step. +/datum/slapcraft_step/proc/play_perform_sound(mob/living/user, obj/item/item, obj/item/slapcraft_assembly/assembly) + if(!insert_item || !item.drop_sound) + return + playsound(assembly, item.drop_sound, DROP_SOUND_VOLUME, ignore_walls = FALSE) + +// Procs to generate strings for description steps. +/// Makes a description for the step. +/datum/slapcraft_step/proc/make_desc() + if(insert_item) + return "Insert a [list_desc] into the assembly." + else + return "Use a [list_desc] on the assembly" + +/// Makes a finished description for the step. +/datum/slapcraft_step/proc/make_finished_desc() + if(insert_item) + return "\The [list_desc] has been inserted." + else + return "\The [list_desc] has been applied." + +/// Makes a todo description for the step. +/datum/slapcraft_step/proc/make_todo_desc() + if(insert_item) + return "You could insert a [list_desc] into the assembly." + else + return "You could use a [list_desc] on the assembly" + +/// Makes a list description for the item. +/datum/slapcraft_step/proc/make_list_desc() + // By default if we check types just grab the first type in the list and use that to describe the step. + if(check_types) + var/obj/item/first_path_cast = item_types[1] + return initial(first_path_cast.name) + +/// Makes a description for the visible message of finishing a step. +/datum/slapcraft_step/proc/make_finish_msg() + if(insert_item) + return "%USER% inserts %ITEM% into the %TARGET%." + else + return "%USER% uses %ITEM% on the %TARGET%." + +/// Makes a description for the visible message of starting a step that requires some time to perform. +/datum/slapcraft_step/proc/make_start_msg() + if(insert_item) + return "%USER% begins inserting %ITEM% into the %TARGET%." + else + return "%USER% begins using %ITEM% on the %TARGET%." + +/// Makes a personalized description for the visible message of finishing a step. +/datum/slapcraft_step/proc/make_finish_msg_self() + if(insert_item) + return "You insert %ITEM% into the %TARGET%." + else + return "You use %ITEM% on the %TARGET%." + +/// Makes a personalized description for the visible message of starting a step that requires some time to perform. +/datum/slapcraft_step/proc/make_start_msg_self() + if(insert_item) + return "You begin inserting %ITEM% into the %TARGET%." + else + return "You begin using %ITEM% on the %TARGET%." diff --git a/code/modules/spatial_grid/cell_tracker.dm b/code/modules/spatial_grid/cell_tracker.dm index fb0d2e0bcf1b..3b02ba5e7b0f 100644 --- a/code/modules/spatial_grid/cell_tracker.dm +++ b/code/modules/spatial_grid/cell_tracker.dm @@ -74,6 +74,16 @@ new_members += cell.atmos_contents for(var/datum/spatial_grid_cell/cell as anything in new_and_old[2]) former_members += cell.atmos_contents + if(SPATIAL_GRID_CONTENTS_TYPE_RADIO_ATMOS) + for(var/datum/spatial_grid_cell/cell as anything in new_and_old[1]) + new_members += cell.radio_atmos_contents + for(var/datum/spatial_grid_cell/cell as anything in new_and_old[2]) + former_members += cell.radio_atmos_contents + if(SPATIAL_GRID_CONTENTS_TYPE_RADIO_NONATMOS) + for(var/datum/spatial_grid_cell/cell as anything in new_and_old[1]) + new_members += cell.radio_nonatmos_contents + for(var/datum/spatial_grid_cell/cell as anything in new_and_old[2]) + former_members += cell.radio_nonatmos_contents return list(new_members, former_members) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index a716084fd3fa..27b1cf4d61dd 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -210,16 +210,6 @@ return TRUE -/** - * Check if the target we're casting on is a valid target. - * For self-casted spells, the target being checked (cast_on) is the caster. - * For click_to_activate spells, the target being checked is the clicked atom. - * - * Return TRUE if cast_on is valid, FALSE otherwise - */ -/datum/action/cooldown/spell/proc/is_valid_target(atom/cast_on) - return TRUE - // The actual cast chain occurs here, in Activate(). // You should generally not be overriding or extending Activate() for spells. // Defer to any of the cast chain procs instead. @@ -309,9 +299,9 @@ if(sparks_amt) do_sparks(sparks_amt, FALSE, get_turf(owner)) - if(ispath(smoke_type, /datum/effect_system/smoke_spread)) - var/datum/effect_system/smoke_spread/smoke = new smoke_type() - smoke.set_up(smoke_amt, get_turf(owner)) + if(ispath(smoke_type, /datum/effect_system/fluid_spread/smoke)) + var/datum/effect_system/fluid_spread/smoke/smoke = new smoke_type() + smoke.set_up(smoke_amt, holder = owner, location = get_turf(owner)) smoke.start() /// Provides feedback after a spell cast occurs, in the form of a cast sound and/or invocation diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index 4cbbca3d9990..85e1f128753f 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -142,7 +142,15 @@ // Make the mob have the color of the blood pool it came out of var/obj/effect/decal/cleanable/came_from = locate() in landing_turf - var/new_color = came_from?.get_blood_color() + if(!came_from) + return + + var/list/blood_DNA = came_from.return_blood_DNA() + if(!blood_DNA) + return + + var/datum/blood/path = blood_DNA[blood_DNA[1]] + var/new_color = initial(path.color) if(!new_color) return @@ -163,7 +171,7 @@ /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/try_enter_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter) // Save this before the actual jaunt - var/atom/coming_with = jaunter.pulling + var/atom/coming_with = jaunter.get_active_grab()?.affecting // Does the actual jaunt . = ..() @@ -188,7 +196,7 @@ return FALSE victim.forceMove(jaunter) - victim.emote("scream") + victim.emote("agony") jaunt_turf.visible_message( span_boldwarning("[jaunter] drags [victim] into [blood]!"), blind_message = span_notice("You hear a splash."), diff --git a/code/modules/spells/spell_types/pointed/spell_cards.dm b/code/modules/spells/spell_types/pointed/spell_cards.dm index 6f44f72afdfe..b47bebe23641 100644 --- a/code/modules/spells/spell_types/pointed/spell_cards.dm +++ b/code/modules/spells/spell_types/pointed/spell_cards.dm @@ -2,7 +2,7 @@ /datum/action/cooldown/spell/pointed/projectile/spell_cards name = "Spell Cards" desc = "Blazing hot rapid-fire homing cards. Send your foes to the shadow realm with their mystical power!" - button_icon_state = "spellcard0" + button_icon_state = "spellcard" click_cd_override = 1 school = SCHOOL_EVOCATION @@ -30,7 +30,7 @@ /// The location spread of the spell cards when fired. var/projectile_location_spread_amount = 12 /// A ref to our lockon component, which is created and destroyed on activation and deactivation. - var/datum/component/lockon_aiming/lockon_component + var/datum/component/lock_on_cursor/lockon_component /datum/action/cooldown/spell/pointed/projectile/spell_cards/Destroy() QDEL_NULL(lockon_component) @@ -43,11 +43,12 @@ QDEL_NULL(lockon_component) lockon_component = owner.AddComponent( \ - /datum/component/lockon_aiming, \ - range = 5, \ - typecache = GLOB.typecache_living, \ - amount = 1, \ - when_locked = CALLBACK(src, PROC_REF(on_lockon_component))) + /datum/component/lock_on_cursor, \ + lock_cursor_range = 5, \ + target_typecache = GLOB.typecache_living, \ + lock_amount = 1, \ + on_lock = CALLBACK(src, PROC_REF(on_lockon_component)), \ + ) /datum/action/cooldown/spell/pointed/projectile/spell_cards/proc/on_lockon_component(list/locked_weakrefs) if(!length(locked_weakrefs)) diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index 595c23e8275d..80baa734adef 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -39,7 +39,6 @@ GLOBAL_LIST_INIT(summoned_guns, list( /obj/item/gun/energy/pulse/carbine, /obj/item/gun/energy/decloner, /obj/item/gun/energy/mindflayer, - /obj/item/gun/energy/recharge/kinetic_accelerator, /obj/item/gun/energy/plasmacutter/adv, /obj/item/gun/energy/wormhole_projector, /obj/item/gun/ballistic/automatic/wt550, @@ -76,9 +75,7 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/gun/magic/staff/healing, /obj/item/gun/magic/staff/door, /obj/item/scrying, - /obj/item/warpwhistle, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword)) + /obj/item/warpwhistle)) GLOBAL_LIST_INIT(summoned_special_magic, list( /obj/item/gun/magic/staff/change, @@ -92,8 +89,6 @@ GLOBAL_LIST_INIT(summoned_special_magic, list( GLOBAL_LIST_INIT(summoned_magic_objectives, list( /obj/item/antag_spawner/contract, /obj/item/gun/magic, - /obj/item/immortality_talisman, - /obj/item/melee/ghost_sword, /obj/item/necromantic_stone, /obj/item/scrying, /obj/item/spellbook, diff --git a/code/modules/spells/spell_types/self/charge.dm b/code/modules/spells/spell_types/self/charge.dm index 87d7ae287d33..d8ee8db134f8 100644 --- a/code/modules/spells/spell_types/self/charge.dm +++ b/code/modules/spells/spell_types/self/charge.dm @@ -21,8 +21,8 @@ . = ..() // Charge people we're pulling first and foremost - if(isliving(cast_on.pulling)) - var/mob/living/pulled_living = cast_on.pulling + if(isliving(cast_on.get_active_grab()?.affecting)) + var/mob/living/pulled_living = cast_on.get_active_grab()?.affecting var/pulled_has_spells = FALSE for(var/datum/action/cooldown/spell/spell in pulled_living.actions) diff --git a/code/modules/spells/spell_types/self/lightning.dm b/code/modules/spells/spell_types/self/lightning.dm index 7423fb8a374a..b2aae7c38a70 100644 --- a/code/modules/spells/spell_types/self/lightning.dm +++ b/code/modules/spells/spell_types/self/lightning.dm @@ -117,7 +117,7 @@ for(var/mob/living/carbon/to_check in view(shock_radius, center)) if(to_check == center || to_check == owner) continue - if(!length(get_path_to(center, to_check, max_distance = shock_radius, simulated_only = FALSE))) + if(!length(jps_path_to(center, to_check, max_distance = shock_radius, simulated_only = FALSE))) continue possibles += to_check diff --git a/code/modules/spells/spell_types/self/mime_vow.dm b/code/modules/spells/spell_types/self/mime_vow.dm index b569be46135a..323bfd27c023 100644 --- a/code/modules/spells/spell_types/self/mime_vow.dm +++ b/code/modules/spells/spell_types/self/mime_vow.dm @@ -17,8 +17,6 @@ cast_on.mind.miming = !cast_on.mind.miming if(cast_on.mind.miming) to_chat(cast_on, span_notice("You make a vow of silence.")) - SEND_SIGNAL(cast_on, COMSIG_CLEAR_MOOD_EVENT, "vow") else to_chat(cast_on, span_notice("You break your vow of silence.")) - SEND_SIGNAL(cast_on, COMSIG_ADD_MOOD_EVENT, "vow", /datum/mood_event/broken_vow) cast_on?.update_mob_action_buttons() diff --git a/code/modules/spells/spell_types/self/smoke.dm b/code/modules/spells/spell_types/self/smoke.dm index 61fa5387744e..b2c7e924f191 100644 --- a/code/modules/spells/spell_types/self/smoke.dm +++ b/code/modules/spells/spell_types/self/smoke.dm @@ -11,7 +11,7 @@ invocation_type = INVOCATION_NONE - smoke_type = /datum/effect_system/smoke_spread/bad + smoke_type = /datum/effect_system/fluid_spread/smoke/bad smoke_amt = 4 /// Chaplain smoke. @@ -23,7 +23,7 @@ cooldown_time = 36 SECONDS spell_requirements = NONE - smoke_type = /datum/effect_system/smoke_spread + smoke_type = /datum/effect_system/fluid_spread/smoke smoke_amt = 2 /// Unused smoke that makes people sleep. Used to be for cult? @@ -34,4 +34,4 @@ cooldown_time = 20 SECONDS - smoke_type = /datum/effect_system/smoke_spread/sleeping + smoke_type = /datum/effect_system/fluid_spread/smoke/sleeping diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm index 95d7f740f3a3..637d0307b2ca 100644 --- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -163,11 +163,11 @@ stored.forceMove(src) stored.notransform = TRUE if(source.convert_damage) - var/damage_percent = (stored.maxHealth - stored.health) / stored.maxHealth; - var/damapply = damage_percent * shape.maxHealth; + var/damage_percent = (stored.maxHealth - stored.health) / stored.maxHealth + var/damapply = damage_percent * shape.maxHealth - shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE); - shape.blood_volume = stored.blood_volume; + shape.apply_damage(damapply, source.convert_damage_type, forced = TRUE) + shape.setBloodVolume(stored.blood_volume) RegisterSignal(shape, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(shape_death)) RegisterSignal(stored, list(COMSIG_PARENT_QDELETING, COMSIG_LIVING_DEATH), PROC_REF(caster_death)) @@ -191,6 +191,7 @@ restore() /obj/shapeshift_holder/Exited(atom/movable/gone, direction) + . = ..() if(stored == gone && !restoring) restore() @@ -233,7 +234,7 @@ stored.apply_damage(damapply, source.convert_damage_type, forced = TRUE) if(source.convert_damage) - stored.blood_volume = shape.blood_volume; + stored.setBloodVolume(shape.blood_volume) // This guard is important because restore() can also be called on COMSIG_PARENT_QDELETING for shape, as well as on death. // This can happen in, for example, [/proc/wabbajack] where the mob hit is qdel'd. diff --git a/code/modules/spells/spell_types/shapeshift/dragon.dm b/code/modules/spells/spell_types/shapeshift/dragon.dm deleted file mode 100644 index 358ff8a44fdd..000000000000 --- a/code/modules/spells/spell_types/shapeshift/dragon.dm +++ /dev/null @@ -1,8 +0,0 @@ - -/datum/action/cooldown/spell/shapeshift/dragon - name = "Dragon Form" - desc = "Take on the shape a lesser ash drake." - invocation = "RAAAAAAAAWR!" - spell_requirements = NONE - - possible_shapes = list(/mob/living/simple_animal/hostile/megafauna/dragon/lesser) diff --git a/code/modules/spells/spell_types/shapeshift/shapechange.dm b/code/modules/spells/spell_types/shapeshift/shapechange.dm index a858ac414d96..32a56203c0bc 100644 --- a/code/modules/spells/spell_types/shapeshift/shapechange.dm +++ b/code/modules/spells/spell_types/shapeshift/shapechange.dm @@ -17,6 +17,5 @@ /mob/living/simple_animal/pet/dog/corgi, /mob/living/simple_animal/hostile/carp/ranged/chaos, /mob/living/simple_animal/bot/secbot/ed209, - /mob/living/simple_animal/hostile/giant_spider/viper/wizard, /mob/living/simple_animal/hostile/construct/juggernaut/mystic, ) diff --git a/code/modules/spells/spell_types/teleport/blink.dm b/code/modules/spells/spell_types/teleport/blink.dm index b55a773c904a..623bef237fb6 100644 --- a/code/modules/spells/spell_types/teleport/blink.dm +++ b/code/modules/spells/spell_types/teleport/blink.dm @@ -10,7 +10,7 @@ invocation_type = INVOCATION_NONE - smoke_type = /datum/effect_system/smoke_spread + smoke_type = /datum/effect_system/fluid_spread/smoke smoke_amt = 0 inner_tele_radius = 0 diff --git a/code/modules/spells/spell_types/teleport/teleport.dm b/code/modules/spells/spell_types/teleport/teleport.dm index bb128cbc4973..1dfcf6f2608e 100644 --- a/code/modules/spells/spell_types/teleport/teleport.dm +++ b/code/modules/spells/spell_types/teleport/teleport.dm @@ -12,7 +12,7 @@ invocation = "SCYAR NILA" invocation_type = INVOCATION_SHOUT - smoke_type = /datum/effect_system/smoke_spread + smoke_type = /datum/effect_system/fluid_spread/smoke smoke_amt = 2 post_teleport_sound = 'sound/magic/teleport_app.ogg' diff --git a/code/modules/spooky/abilities/chilling_presence.dm b/code/modules/spooky/abilities/chilling_presence.dm new file mode 100644 index 000000000000..569535e937c2 --- /dev/null +++ b/code/modules/spooky/abilities/chilling_presence.dm @@ -0,0 +1,30 @@ +/datum/action/cooldown/chilling_presence + name = "Chilling Presence" + desc = "Send a chill up your target's spine." + + click_to_activate = TRUE + cooldown_time = 120 SECONDS + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/cooldown/chilling_presence/is_valid_target(atom/cast_on) + . = ..() + if(!isliving(cast_on)) + return FALSE + + var/mob/living/L = cast_on + if(L.stat == DEAD) + to_chat(owner, span_warning("That one has no life force left.")) + return FALSE + + if(L.stat == CONSCIOUS) + to_chat(owner, span_warning("I cannot influence those that are awake.")) + return FALSE + +/datum/action/cooldown/chilling_presence/Activate(atom/target) + . = ..() + var/mob/living/L = target + to_chat(target, span_obviousnotice("You feel a chill run up your spine.")) + L.emote("shiver") + + RECORD_GHOST_POWER(src) diff --git a/code/modules/spooky/abilities/flicker.dm b/code/modules/spooky/abilities/flicker.dm new file mode 100644 index 000000000000..56a96239d229 --- /dev/null +++ b/code/modules/spooky/abilities/flicker.dm @@ -0,0 +1,18 @@ +/datum/action/cooldown/flicker + name = "Flicker" + desc = "Use your electromagnetic influence to disrupt a nearby light fixture." + + click_to_activate = TRUE + cooldown_time = 120 SECONDS + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/cooldown/flicker/is_valid_target(atom/cast_on) + return istype(cast_on, /obj/machinery/light) + +/datum/action/cooldown/flicker/Activate(atom/target) + . = ..() + var/obj/machinery/light/L = target + L.flicker() + + RECORD_GHOST_POWER(src) diff --git a/code/modules/spooky/abilities/ghost_light.dm b/code/modules/spooky/abilities/ghost_light.dm new file mode 100644 index 000000000000..1503d188d72f --- /dev/null +++ b/code/modules/spooky/abilities/ghost_light.dm @@ -0,0 +1,28 @@ +/datum/action/cooldown/ghost_light + name = "Ghastly Light" + desc = "Emit feint light for a short period of time" + + click_to_activate = TRUE + cooldown_time = 5 MINUTES + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + + var/timer + +/datum/action/cooldown/ghost_light/Activate(atom/target) + . = ..() + + timer = addtimer(CALLBACK(src, PROC_REF(disable_light)), 60 SECONDS, TIMER_STOPPABLE) + owner.set_light_color("#7bfc6a") + owner.set_light_on(TRUE) + + RECORD_GHOST_POWER(src) + +/datum/action/cooldown/ghost_light/Remove(mob/removed_from) + deltimer(timer) + disable_light() + return ..() + +/datum/action/cooldown/ghost_light/proc/disable_light() + owner.set_light_color(initial(owner.light_color)) + owner.set_light_on(FALSE) diff --git a/code/modules/spooky/abilities/knock_on_window_or_door.dm b/code/modules/spooky/abilities/knock_on_window_or_door.dm new file mode 100644 index 000000000000..dd948953d121 --- /dev/null +++ b/code/modules/spooky/abilities/knock_on_window_or_door.dm @@ -0,0 +1,24 @@ +/datum/action/cooldown/knock_sound + name = "Knock" + desc = "Create an audio phenomena centered on a door or window." + + click_to_activate = TRUE + cooldown_time = 120 SECONDS + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/cooldown/knock_sound/is_valid_target(atom/cast_on) + return istype(cast_on, /obj/structure/window) || istype(cast_on, /obj/machinery/door) + +/datum/action/cooldown/knock_sound/Activate(atom/target) + . = ..() + if(istype(target, /obj/machinery/door)) + var/obj/machinery/door/D = target + D.knock_on() + + else if(istype(target, /obj/structure/window)) + var/obj/structure/window/W = target + W.knock_on() + + RECORD_GHOST_POWER(src) + diff --git a/code/modules/spooky/abilities/shatter_glass.dm b/code/modules/spooky/abilities/shatter_glass.dm new file mode 100644 index 000000000000..b56c7da3024e --- /dev/null +++ b/code/modules/spooky/abilities/shatter_glass.dm @@ -0,0 +1,25 @@ +/datum/action/cooldown/shatter_glass + name = "Resonance" + desc = "Vibrate a nearby glass object enough to cause integrity failure." + + click_to_activate = TRUE + cooldown_time = 30 MINUTES + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/cooldown/shatter_glass/is_valid_target(atom/cast_on) + if(istype(target, /obj/structure/window)) + var/obj/structure/window/W = target + if(W.reinf) + to_chat(owner, span_warning("I cannot shatter that, it is too strong.")) + return FALSE + return TRUE + + return istype(target, /obj/structure/table/glass) + +/datum/action/cooldown/shatter_glass/Activate(atom/target) + . = ..() + var/obj/structure/S = target + S.deconstruct() + + RECORD_GHOST_POWER(src) diff --git a/code/modules/spooky/abilities/shatter_light.dm b/code/modules/spooky/abilities/shatter_light.dm new file mode 100644 index 000000000000..f1223a79a171 --- /dev/null +++ b/code/modules/spooky/abilities/shatter_light.dm @@ -0,0 +1,18 @@ +/datum/action/cooldown/shatter_light + name = "Snuff Light" + desc = "Overload a nearby source of light." + + click_to_activate = TRUE + cooldown_time = 20 MINUTES + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + +/datum/action/cooldown/shatter_light/is_valid_target(atom/cast_on) + return istype(cast_on, /obj/machinery/light) + +/datum/action/cooldown/shatter_light/Activate(atom/target) + . = ..() + var/obj/machinery/light/L = target + L.break_light_tube() + + RECORD_GHOST_POWER(src) diff --git a/code/modules/spooky/abilities/sleep_whisper.dm b/code/modules/spooky/abilities/sleep_whisper.dm new file mode 100644 index 000000000000..bbbd6463a2b2 --- /dev/null +++ b/code/modules/spooky/abilities/sleep_whisper.dm @@ -0,0 +1,49 @@ +/datum/action/cooldown/ghost_whisper + name = "Dream Daemon" + desc = "Allows you to influence the dreams of a sleeping creature." + + click_to_activate = TRUE + cooldown_time = 60 SECONDS + write_log = TRUE + ranged_mousepointer = 'icons/effects/mouse_pointers/supplypod_target.dmi' + + var/message_to_send + +/datum/action/cooldown/ghost_whisper/is_valid_target(atom/cast_on) + . = ..() + if(!isliving(cast_on)) + return FALSE + + var/mob/living/L = cast_on + if(L.stat == DEAD) + to_chat(owner, span_warning("That one has no life force left.")) + return FALSE + + if(L.stat == CONSCIOUS) + to_chat(owner, span_warning("I cannot influence those that are awake.")) + return FALSE + + if(!L.client) + to_chat(owner, span_warning("There is nobody inside of there to listen.")) + return FALSE + +/datum/action/cooldown/ghost_whisper/PreActivate(atom/target, list/params) + message_to_send = "" + var/input = tgui_input_text(owner, "What do you want to say?", max_length = 20) + if(!input) + return FALSE + + var/confirmation = tgui_alert(owner, "\"... [input] ...\"", "Confirm Whisper", list("Ok", "Cancel")) + if(confirmation != "Ok") + return FALSE + + if(!IsAvailable()) + return FALSE + return ..() + +/datum/action/cooldown/ghost_whisper/Activate(atom/target) + . = ..() + to_chat(target, span_obviousnotice("... [message_to_send] ...")) + message_to_send = "" + + RECORD_GHOST_POWER(src) diff --git a/code/modules/spooky/components/spook_factor.dm b/code/modules/spooky/components/spook_factor.dm new file mode 100644 index 000000000000..a53c730c4c60 --- /dev/null +++ b/code/modules/spooky/components/spook_factor.dm @@ -0,0 +1,54 @@ +/datum/component/spook_factor + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + + var/spook_contribution = 0 + var/area/affecting_area + +/datum/component/spook_factor/Initialize(spook_contribution) + . = ..() + if(!ismovable(parent)) + return INITIALIZE_HINT_QDEL + + src.spook_contribution = spook_contribution + var/area/A = get_area(parent) + if(!A) + return + + affect_area(A) + +/datum/component/spook_factor/Destroy(force, silent) + affect_area(null) + return ..() + +/datum/component/spook_factor/RegisterWithParent() + var/atom/movable/movable_parent = parent + movable_parent.become_area_sensitive(REF(src)) + RegisterSignal(movable_parent, COMSIG_ENTER_AREA, PROC_REF(enter_area)) + RegisterSignal(movable_parent, COMSIG_EXIT_AREA, PROC_REF(exit_area)) + +/datum/component/spook_factor/UnregisterFromParent() + var/atom/movable/movable_parent = parent + UnregisterSignal(movable_parent, list(COMSIG_EXIT_AREA, COMSIG_ENTER_AREA)) + movable_parent.lose_area_sensitivity(REF(src)) + +/datum/component/spook_factor/InheritComponent(datum/component/C, i_am_original, spook_contribution) + var/area/A = affecting_area + affect_area(null) + src.spook_contribution = spook_contribution + affect_area(A) + +/datum/component/spook_factor/proc/affect_area(area/A) + if(affecting_area == A) + return + + affecting_area?.adjust_spook_level(-spook_contribution) + affecting_area = A + affecting_area?.adjust_spook_level(spook_contribution) + +/datum/component/spook_factor/proc/enter_area(atom/movable/source, area/A) + SIGNAL_HANDLER + affect_area(A) + +/datum/component/spook_factor/proc/exit_area(atom/movable/source, area/A) + SIGNAL_HANDLER + affect_area(null) diff --git a/code/modules/spooky/components/spooky_powers.dm b/code/modules/spooky/components/spooky_powers.dm new file mode 100644 index 000000000000..633829cb97ea --- /dev/null +++ b/code/modules/spooky/components/spooky_powers.dm @@ -0,0 +1,84 @@ +/// Grants powers to the parent mob based on the spookiness of their area. +/datum/component/spooky_powers + dupe_mode = COMPONENT_DUPE_UNIQUE + + var/list/powers = list() + var/area/current_area + +/datum/component/spooky_powers/Initialize(power_list) + . = ..() + if(!ismob(parent)) + return INITIALIZE_HINT_QDEL + + for(var/action_type in power_list) + var/datum/action/new_action = new action_type + powers[new_action] = power_list[action_type] + +/datum/component/spooky_powers/Destroy(force, silent) + powers = null + return ..() + +/datum/component/spooky_powers/RegisterWithParent() + . = ..() + var/atom/movable/movable_parent = parent + if(isobserver(movable_parent)) + RegisterSignal(movable_parent, COMSIG_MOVABLE_MOVED, PROC_REF(observer_moved)) + else + movable_parent.become_area_sensitive(REF(src)) + RegisterSignal(movable_parent, COMSIG_ENTER_AREA, PROC_REF(enter_area)) + + update_area(get_area(parent)) + +/datum/component/spooky_powers/UnregisterFromParent() + . = ..() + var/atom/movable/movable_parent = parent + if(isobserver(movable_parent)) + UnregisterSignal(movable_parent, COMSIG_MOVABLE_MOVED) + else + UnregisterSignal(movable_parent, list(COMSIG_ENTER_AREA)) + movable_parent.lose_area_sensitivity(REF(src)) + + update_area(null) + +/datum/component/spooky_powers/proc/update_powers() + if(QDELETED(parent)) + return + + var/spook = current_area?.spook_level || 0 + for(var/datum/action/power in powers) + if((powers[power] > spook) && (power.owner == parent)) + power.Remove(parent) + continue + + if((powers[power] <= spook) && (power.owner != parent)) + power.Grant(parent) + +/datum/component/spooky_powers/proc/update_area(area/A) + if(A == current_area) + return + + if(current_area) + UnregisterSignal(current_area, AREA_SPOOK_LEVEL_CHANGED) + + current_area = A + + if(current_area) + RegisterSignal(current_area, AREA_SPOOK_LEVEL_CHANGED, PROC_REF(area_spook_changed)) + + update_powers() + +/datum/component/spooky_powers/proc/area_spook_changed(area/source, old_spook_level) + SIGNAL_HANDLER + update_powers() + +/datum/component/spooky_powers/proc/enter_area(atom/movable/source, area/A) + SIGNAL_HANDLER + update_area(A) + +/datum/component/spooky_powers/proc/observer_moved(atom/movable/source, old_loc, movement_dir, forced, old_locs, momentum_change) + SIGNAL_HANDLER + var/area/A = get_area(source) + if(A == current_area) + return + + update_area(A) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index 2e1e81813021..3b706e0f36df 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -208,7 +208,7 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) target = tile break else - SSexplosions.highturf += tile //also fucks everything else on the turf + EX_ACT(tile, EXPLODE_DEVASTATE) //also fucks everything else on the turf point.Beam(target, icon_state = "bsa_beam", time = 5 SECONDS, maxdistance = world.maxx) //ZZZAP new /obj/effect/temp_visual/bsa_splash(point, dir) @@ -348,8 +348,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) if(notice) return null //Totally nanite construction system not an immersion breaking spawning - var/datum/effect_system/smoke_spread/s = new - s.set_up(4,get_turf(centerpiece)) + var/datum/effect_system/fluid_spread/smoke/s = new + s.set_up(4, location = get_turf(centerpiece)) s.start() var/obj/machinery/bsa/full/cannon = new(get_turf(centerpiece),centerpiece.get_cannon_direction()) QDEL_NULL(centerpiece.front_ref) diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index 25f2502fa35d..5b495872ad16 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -53,7 +53,7 @@ /datum/station_goal/dna_vault/check_completion() if(..()) return TRUE - for(var/obj/machinery/dna_vault/V in GLOB.machines) + for(var/obj/machinery/dna_vault/V as anything in INSTANCES_OF(/obj/machinery/dna_vault)) if(V.animals.len >= animal_count && V.plants.len >= plant_count && V.dna.len >= human_count) return TRUE return FALSE @@ -87,6 +87,7 @@ var/list/obj/structure/fillers = list() /obj/machinery/dna_vault/Initialize(mapload) + SET_TRACKING(__TYPE__) //TODO: Replace this,bsa and gravgen with some big machinery datum var/list/occupied = list() for(var/direct in list(EAST,WEST,SOUTHEAST,SOUTHWEST)) @@ -112,6 +113,8 @@ var/obj/structure/filler/filler = V filler.parent = null qdel(filler) + + UNSET_TRACKING(__TYPE__) . = ..() /obj/machinery/dna_vault/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm index 6ce8ed814d92..d77f176b52da 100644 --- a/code/modules/station_goals/shield.dm +++ b/code/modules/station_goals/shield.dm @@ -30,7 +30,7 @@ /datum/station_goal/proc/get_coverage() var/list/coverage = list() - for(var/obj/machinery/satellite/meteor_shield/A in GLOB.machines) + for(var/obj/machinery/satellite/meteor_shield/A in INSTANCES_OF(/obj/machinery/satellite)) if(!A.active || !is_station_level(A.z)) continue coverage |= view(A.kill_range,A) @@ -60,7 +60,7 @@ . = TRUE /obj/machinery/computer/sat_control/proc/toggle(id) - for(var/obj/machinery/satellite/S in GLOB.machines) + for(var/obj/machinery/satellite/S as anything in INSTANCES_OF(/obj/machinery/satellite)) if(S.id == id && S.z == z) S.toggle() @@ -68,7 +68,7 @@ var/list/data = list() data["satellites"] = list() - for(var/obj/machinery/satellite/S in GLOB.machines) + for(var/obj/machinery/satellite/S as anything in INSTANCES_OF(/obj/machinery/satellite)) data["satellites"] += list(list( "id" = S.id, "active" = S.active, @@ -101,8 +101,13 @@ /obj/machinery/satellite/Initialize(mapload) . = ..() + SET_TRACKING(__TYPE__) id = gid++ +/obj/machinery/satellite/Destroy() + UNSET_TRACKING(__TYPE__) + return ..() + /obj/machinery/satellite/interact(mob/user) toggle(user) diff --git a/code/modules/surgery/advanced/bioware/bioware.dm b/code/modules/surgery/advanced/bioware/bioware.dm deleted file mode 100644 index 6a4ce36a83f4..000000000000 --- a/code/modules/surgery/advanced/bioware/bioware.dm +++ /dev/null @@ -1,34 +0,0 @@ -//Bioware -//Body modifications applied through surgery. They generally affect physiology. - -/datum/bioware - var/name = "Generic Bioware" - var/mob/living/carbon/human/owner - var/desc = "If you see this something's wrong, warn a coder." - var/active = FALSE - var/can_process = FALSE - var/mod_type = BIOWARE_GENERIC - -/datum/bioware/New(mob/living/carbon/human/_owner) - owner = _owner - for(var/datum/bioware/bioware as anything in owner.bioware) - if(bioware.mod_type == mod_type) - qdel(src) - return - owner.bioware += src - on_gain() - -/datum/bioware/Destroy() - owner = null - if(active) - on_lose() - return ..() - -/datum/bioware/proc/on_gain() - active = TRUE - if(can_process) - START_PROCESSING(SSobj, src) - -/datum/bioware/proc/on_lose() - STOP_PROCESSING(SSobj, src) - return diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm deleted file mode 100644 index 203c8b17fba8..000000000000 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ /dev/null @@ -1,13 +0,0 @@ -/datum/surgery/advanced/bioware - name = "Enhancement surgery" - var/bioware_target = BIOWARE_GENERIC - -/datum/surgery/advanced/bioware/can_start(mob/user, mob/living/carbon/human/target) - if(!..()) - return FALSE - if(!istype(target)) - return FALSE - for(var/datum/bioware/bioware as anything in target.bioware) - if(bioware.mod_type == bioware_target) - return FALSE - return TRUE diff --git a/code/modules/surgery/advanced/bioware/cortex_folding.dm b/code/modules/surgery/advanced/bioware/cortex_folding.dm deleted file mode 100644 index f17d50524a53..000000000000 --- a/code/modules/surgery/advanced/bioware/cortex_folding.dm +++ /dev/null @@ -1,64 +0,0 @@ -/datum/surgery/advanced/bioware/cortex_folding - name = "Cortex Folding" - desc = "A surgical procedure which modifies the cerebral cortex into a complex fold, giving space to non-standard neural patterns." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/fold_cortex, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_HEAD) - target_mobtypes = list(/mob/living/carbon/human) - bioware_target = BIOWARE_CORTEX - -/datum/surgery/advanced/bioware/cortex_folding/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return ..() - -/datum/surgery_step/fold_cortex - name = "fold cortex" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/fold_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start folding [target]'s outer cerebral cortex into a fractal pattern."), - span_notice("[user] starts folding [target]'s outer cerebral cortex into a fractal pattern."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") - -/datum/surgery_step/fold_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You fold [target]'s outer cerebral cortex into a fractal pattern!"), - span_notice("[user] folds [target]'s outer cerebral cortex into a fractal pattern!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your brain feels stronger... more flexible!") - new /datum/bioware/cortex_fold(target) - return ..() - -/datum/surgery_step/fold_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorganslot(ORGAN_SLOT_BRAIN)) - display_results(user, target, span_warning("You screw up, damaging the brain!"), - span_warning("[user] screws up, damaging the brain!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your brain throbs with intense pain; thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE - -/datum/bioware/cortex_fold - name = "Cortex Fold" - desc = "The cerebral cortex has been folded into a complex fractal pattern, and can support non-standard neural patterns." - mod_type = BIOWARE_CORTEX - -/datum/bioware/cortex_fold/on_gain() - . = ..() - ADD_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/cortex_fold/on_lose() - REMOVE_TRAIT(owner, TRAIT_SPECIAL_TRAUMA_BOOST, EXPERIMENTAL_SURGERY_TRAIT) - return ..() diff --git a/code/modules/surgery/advanced/bioware/cortex_imprint.dm b/code/modules/surgery/advanced/bioware/cortex_imprint.dm deleted file mode 100644 index 65e961c1224b..000000000000 --- a/code/modules/surgery/advanced/bioware/cortex_imprint.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/surgery/advanced/bioware/cortex_imprint - name = "Cortex Imprint" - desc = "A surgical procedure which modifies the cerebral cortex into a redundant neural pattern, making the brain able to bypass impediments caused by minor brain traumas." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/imprint_cortex, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_HEAD) - target_mobtypes = list(/mob/living/carbon/human) - bioware_target = BIOWARE_CORTEX - -/datum/surgery/advanced/bioware/cortex_imprint/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return ..() - -/datum/surgery_step/imprint_cortex - name = "imprint cortex" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/imprint_cortex/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start carving [target]'s outer cerebral cortex into a self-imprinting pattern."), - span_notice("[user] starts carving [target]'s outer cerebral cortex into a self-imprinting pattern."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head throbs with gruesome pain, it's nearly too much to handle!") - -/datum/surgery_step/imprint_cortex/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You reshape [target]'s outer cerebral cortex into a self-imprinting pattern!"), - span_notice("[user] reshapes [target]'s outer cerebral cortex into a self-imprinting pattern!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your brain feels stronger... more resillient!") - new /datum/bioware/cortex_imprint(target) - return ..() - -/datum/surgery_step/imprint_cortex/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorganslot(ORGAN_SLOT_BRAIN)) - display_results(user, target, span_warning("You screw up, damaging the brain!"), - span_warning("[user] screws up, damaging the brain!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your brain throbs with intense pain; Thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE - -/datum/bioware/cortex_imprint - name = "Cortex Imprint" - desc = "The cerebral cortex has been reshaped into a redundant neural pattern, making the brain able to bypass impediments caused by minor brain traumas." - mod_type = BIOWARE_CORTEX - can_process = TRUE - -/datum/bioware/cortex_imprint/process() - owner.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC) diff --git a/code/modules/surgery/advanced/bioware/ligament_hook.dm b/code/modules/surgery/advanced/bioware/ligament_hook.dm deleted file mode 100644 index 01ad51e84388..000000000000 --- a/code/modules/surgery/advanced/bioware/ligament_hook.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/surgery/advanced/bioware/ligament_hook - name = "Ligament Hook" - desc = "A surgical procedure which reshapes the connections between torso and limbs, making it so limbs can be attached manually if severed. \ - However this weakens the connection, making them easier to detach as well." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/reshape_ligaments, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_LIGAMENTS - -/datum/surgery_step/reshape_ligaments - name = "reshape ligaments" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/reshape_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start reshaping [target]'s ligaments into a hook-like shape."), - span_notice("[user] starts reshaping [target]'s ligaments into a hook-like shape."), - span_notice("[user] starts manipulating [target]'s ligaments.")) - display_pain(target, "Your limbs burn with severe pain!") - -/datum/surgery_step/reshape_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You reshape [target]'s ligaments into a connective hook!"), - span_notice("[user] reshapes [target]'s ligaments into a connective hook!"), - span_notice("[user] finishes manipulating [target]'s ligaments.")) - display_pain(target, "Your limbs feel... strangely loose.") - new /datum/bioware/hooked_ligaments(target) - return ..() - -/datum/bioware/hooked_ligaments - name = "Hooked Ligaments" - desc = "The ligaments and nerve endings that connect the torso to the limbs are formed into a hook-like shape, so limbs can be attached without requiring surgery, but are easier to sever." - mod_type = BIOWARE_LIGAMENTS - -/datum/bioware/hooked_ligaments/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_LIMBATTACHMENT, EXPERIMENTAL_SURGERY_TRAIT) - ADD_TRAIT(owner, TRAIT_EASYDISMEMBER, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/hooked_ligaments/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_LIMBATTACHMENT, EXPERIMENTAL_SURGERY_TRAIT) - REMOVE_TRAIT(owner, TRAIT_EASYDISMEMBER, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm b/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm deleted file mode 100644 index d6c41c984666..000000000000 --- a/code/modules/surgery/advanced/bioware/ligament_reinforcement.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/surgery/advanced/bioware/ligament_reinforcement - name = "Ligament Reinforcement" - desc = "A surgical procedure which adds a protective tissue and bone cage around the connections between the torso and limbs, preventing dismemberment. \ - However, the nerve connections as a result are more easily interrupted, making it easier to disable limbs with damage." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/reinforce_ligaments, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_LIGAMENTS - -/datum/surgery_step/reinforce_ligaments - name = "reinforce ligaments" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/reinforce_ligaments/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start reinforcing [target]'s ligaments."), - span_notice("[user] starts reinforce [target]'s ligaments."), - span_notice("[user] starts manipulating [target]'s ligaments.")) - display_pain(target, "Your limbs burn with severe pain!") - -/datum/surgery_step/reinforce_ligaments/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You reinforce [target]'s ligaments!"), - span_notice("[user] reinforces [target]'s ligaments!"), - span_notice("[user] finishes manipulating [target]'s ligaments.")) - display_pain(target, "Your limbs feel more secure, but also more frail.") - new /datum/bioware/reinforced_ligaments(target) - return ..() - -/datum/bioware/reinforced_ligaments - name = "Reinforced Ligaments" - desc = "The ligaments and nerve endings that connect the torso to the limbs are protected by a mix of bone and tissues, and are much harder to separate from the body, but are also easier to wound." - mod_type = BIOWARE_LIGAMENTS - -/datum/bioware/reinforced_ligaments/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_NODISMEMBER, EXPERIMENTAL_SURGERY_TRAIT) - ADD_TRAIT(owner, TRAIT_EASILY_WOUNDED, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/reinforced_ligaments/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_NODISMEMBER, EXPERIMENTAL_SURGERY_TRAIT) - REMOVE_TRAIT(owner, TRAIT_EASILY_WOUNDED, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/muscled_veins.dm b/code/modules/surgery/advanced/bioware/muscled_veins.dm deleted file mode 100644 index 45b00cae074f..000000000000 --- a/code/modules/surgery/advanced/bioware/muscled_veins.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/surgery/advanced/bioware/muscled_veins - name = "Vein Muscle Membrane" - desc = "A surgical procedure which adds a muscled membrane to blood vessels, allowing them to pump blood without a heart." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/muscled_veins, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_CIRCULATION - -/datum/surgery_step/muscled_veins - name = "shape vein muscles" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/muscled_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start wrapping muscles around [target]'s circulatory system."), - span_notice("[user] starts wrapping muscles around [target]'s circulatory system."), - span_notice("[user] starts manipulating [target]'s circulatory system.")) - display_pain(target, "Your entire body burns in agony!") - -/datum/surgery_step/muscled_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You reshape [target]'s circulatory system, adding a muscled membrane!"), - span_notice("[user] reshapes [target]'s circulatory system, adding a muscled membrane!"), - span_notice("[user] finishes manipulating [target]'s circulatory system.")) - display_pain(target, "You can feel your heartbeat's powerful pulses ripple through your body!") - new /datum/bioware/muscled_veins(target) - return ..() - -/datum/bioware/muscled_veins - name = "Muscled Veins" - desc = "The circulatory system is affixed with a muscled membrane, allowing the veins to pump blood without the need for a heart." - mod_type = BIOWARE_CIRCULATION - -/datum/bioware/muscled_veins/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_STABLEHEART, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/muscled_veins/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_STABLEHEART, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/nerve_grounding.dm b/code/modules/surgery/advanced/bioware/nerve_grounding.dm deleted file mode 100644 index 460b18937064..000000000000 --- a/code/modules/surgery/advanced/bioware/nerve_grounding.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/surgery/advanced/bioware/nerve_grounding - name = "Nerve Grounding" - desc = "A surgical procedure which makes the patient's nerves act as grounding rods, protecting them from electrical shocks." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/ground_nerves, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_NERVES - -/datum/surgery_step/ground_nerves - name = "ground nerves" - accept_hand = TRUE - time = 155 - -/datum/surgery_step/ground_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start rerouting [target]'s nerves."), - span_notice("[user] starts rerouting [target]'s nerves."), - span_notice("[user] starts manipulating [target]'s nervous system.")) - display_pain(target, "Your entire body goes numb!") - -/datum/surgery_step/ground_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You successfully reroute [target]'s nervous system!"), - span_notice("[user] successfully reroutes [target]'s nervous system!"), - span_notice("[user] finishes manipulating [target]'s nervous system.")) - display_pain(target, "You regain feeling in your body! You feel energzed!") - new /datum/bioware/grounded_nerves(target) - return ..() - -/datum/bioware/grounded_nerves - name = "Grounded Nerves" - desc = "Nerves form a safe path for electricity to traverse, protecting the body from electric shocks." - mod_type = BIOWARE_NERVES - -/datum/bioware/grounded_nerves/on_gain() - ..() - ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, EXPERIMENTAL_SURGERY_TRAIT) - -/datum/bioware/grounded_nerves/on_lose() - ..() - REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, EXPERIMENTAL_SURGERY_TRAIT) diff --git a/code/modules/surgery/advanced/bioware/nerve_splicing.dm b/code/modules/surgery/advanced/bioware/nerve_splicing.dm deleted file mode 100644 index 8e701a870643..000000000000 --- a/code/modules/surgery/advanced/bioware/nerve_splicing.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/surgery/advanced/bioware/nerve_splicing - name = "Nerve Splicing" - desc = "A surgical procedure which splices the patient's nerves, making them more resistant to stuns." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/splice_nerves, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_NERVES - -/datum/surgery_step/splice_nerves - name = "splice nerves" - accept_hand = TRUE - time = 155 - -/datum/surgery_step/splice_nerves/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start splicing together [target]'s nerves."), - span_notice("[user] starts splicing together [target]'s nerves."), - span_notice("[user] starts manipulating [target]'s nervous system.")) - display_pain(target, "Your entire body goes numb!") - -/datum/surgery_step/splice_nerves/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You successfully splice [target]'s nervous system!"), - span_notice("[user] successfully splices [target]'s nervous system!"), - span_notice("[user] finishes manipulating [target]'s nervous system.")) - display_pain(target, "You regain feeling in your body; It feels like everything's happening around you in slow motion!") - new /datum/bioware/spliced_nerves(target) - return ..() - -/datum/bioware/spliced_nerves - name = "Spliced Nerves" - desc = "Nerves are connected to each other multiple times, greatly reducing the impact of stunning effects." - mod_type = BIOWARE_NERVES - -/datum/bioware/spliced_nerves/on_gain() - ..() - owner.physiology.stun_mod *= 0.5 - -/datum/bioware/spliced_nerves/on_lose() - ..() - owner.physiology.stun_mod *= 2 diff --git a/code/modules/surgery/advanced/bioware/vein_threading.dm b/code/modules/surgery/advanced/bioware/vein_threading.dm deleted file mode 100644 index 8f18aca6eb22..000000000000 --- a/code/modules/surgery/advanced/bioware/vein_threading.dm +++ /dev/null @@ -1,45 +0,0 @@ -/datum/surgery/advanced/bioware/vein_threading - name = "Vein Threading" - desc = "A surgical procedure which severely reduces the amount of blood lost in case of injury." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/incise, - /datum/surgery_step/thread_veins, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - bioware_target = BIOWARE_CIRCULATION - -/datum/surgery_step/thread_veins - name = "thread veins" - accept_hand = TRUE - time = 125 - -/datum/surgery_step/thread_veins/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start weaving [target]'s circulatory system."), - span_notice("[user] starts weaving [target]'s circulatory system."), - span_notice("[user] starts manipulating [target]'s circulatory system.")) - display_pain(target, "Your entire body burns in agony!") - -/datum/surgery_step/thread_veins/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You weave [target]'s circulatory system into a resistant mesh!"), - span_notice("[user] weaves [target]'s circulatory system into a resistant mesh!"), - span_notice("[user] finishes manipulating [target]'s circulatory system.")) - display_pain(target, "You can feel your blood pumping through reinforced veins!") - new /datum/bioware/threaded_veins(target) - return ..() - -/datum/bioware/threaded_veins - name = "Threaded Veins" - desc = "The circulatory system is woven into a mesh, severely reducing the amount of blood lost from wounds." - mod_type = BIOWARE_CIRCULATION - -/datum/bioware/threaded_veins/on_gain() - ..() - owner.physiology.bleed_mod *= 0.25 - -/datum/bioware/threaded_veins/on_lose() - ..() - owner.physiology.bleed_mod *= 4 diff --git a/code/modules/surgery/advanced/brainwashing.dm b/code/modules/surgery/advanced/brainwashing.dm deleted file mode 100644 index 9a364e818eec..000000000000 --- a/code/modules/surgery/advanced/brainwashing.dm +++ /dev/null @@ -1,78 +0,0 @@ -/obj/item/disk/surgery/brainwashing - name = "Brainwashing Surgery Disk" - desc = "The disk provides instructions on how to impress an order on a brain, making it the primary objective of the patient." - surgeries = list(/datum/surgery/advanced/brainwashing) - -/datum/surgery/advanced/brainwashing - name = "Brainwashing" - desc = "A surgical procedure which directly implants a directive into the patient's brain, making it their absolute priority. It can be cleared using a mindshield implant." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/brainwash, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_HEAD) - -/datum/surgery/advanced/brainwashing/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/brainwash - name = "brainwash" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_WIRECUTTER = 50, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - time = 200 - preop_sound = 'sound/surgery/hemostat1.ogg' - success_sound = 'sound/surgery/hemostat1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - var/objective - -/datum/surgery_step/brainwash/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - objective = tgui_input_text(user, "Choose the objective to imprint on your victim's brain", "Brainwashing") - if(!objective) - return -1 - display_results(user, target, span_notice("You begin to brainwash [target]..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/brainwash/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(!target.mind) - to_chat(user, span_warning("[target] doesn't respond to the brainwashing, as if [target.p_they()] lacked a mind...")) - return FALSE - if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) - to_chat(user, span_warning("You hear a faint buzzing from a device inside [target]'s brain, and the brainwashing is erased.")) - return FALSE - display_results(user, target, span_notice("You succeed in brainwashing [target]."), - span_notice("[user] successfully fixes [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - to_chat(target, span_userdanger("A new compulsion fills your mind... you feel forced to obey it!")) - brainwash(target, objective) - message_admins("[ADMIN_LOOKUPFLW(user)] surgically brainwashed [ADMIN_LOOKUPFLW(target)] with the objective '[objective]'.") - user.log_message("has brainwashed [key_name(target)] with the objective '[objective]' using brainwashing surgery.", LOG_ATTACK) - target.log_message("has been brainwashed with the objective '[objective]' by [key_name(user)] using brainwashing surgery.", LOG_VICTIM, log_globally=FALSE) - log_game("[key_name(user)] surgically brainwashed [key_name(target)] with the objective '[objective]'.") - return ..() - -/datum/surgery_step/brainwash/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorganslot(ORGAN_SLOT_BRAIN)) - display_results(user, target, span_warning("You screw up, bruising the brain tissue!"), - span_warning("[user] screws up, causing brain damage!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your head throbs with horrible pain!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 40) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/lobotomy.dm b/code/modules/surgery/advanced/lobotomy.dm deleted file mode 100644 index 0081d92de70d..000000000000 --- a/code/modules/surgery/advanced/lobotomy.dm +++ /dev/null @@ -1,91 +0,0 @@ -/datum/surgery/advanced/lobotomy - name = "Lobotomy" - desc = "An invasive surgical procedure which guarantees removal of almost all brain traumas, but might cause another permanent trauma in return." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/lobotomize, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_HEAD) - requires_bodypart_type = 0 - -/datum/surgery/advanced/lobotomy/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/lobotomize - name = "perform lobotomy" - implements = list( - TOOL_SCALPEL = 85, - /obj/item/melee/energy/sword = 55, - /obj/item/knife = 35, - /obj/item/shard = 25, - /obj/item = 20) - time = 100 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/scalpel2.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/lobotomize/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.sharpness) - return FALSE - return TRUE - -/datum/surgery_step/lobotomize/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to perform a lobotomy on [target]'s brain..."), - span_notice("[user] begins to perform a lobotomy on [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head pounds with unimaginable pain!") - -/datum/surgery_step/lobotomize/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You succeed in lobotomizing [target]."), - span_notice("[user] successfully lobotomizes [target]!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") - - target.cure_all_traumas(TRAUMA_RESILIENCE_LOBOTOMY) - if(target.mind && target.mind.has_antag_datum(/datum/antagonist/brainwashed)) - target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - if(prob(75)) // 75% chance to get a trauma from this - switch(rand(1,3))//Now let's see what hopefully-not-important part of the brain we cut off - if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) - if(2) - if(HAS_TRAIT(target, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) - if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - return ..() - -/datum/surgery_step/lobotomize/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(target_brain) - display_results(user, target, span_warning("You remove the wrong part, causing more damage!"), - span_notice("[user] successfully lobotomizes [target]!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "The pain in your head only seems to get worse!") - target_brain.applyOrganDamage(80) - switch(rand(1,3)) - if(1) - target.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_MAGIC) - if(2) - if(HAS_TRAIT(target, TRAIT_SPECIAL_TRAUMA_BOOST) && prob(50)) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_MAGIC) - if(3) - target.gain_trauma_type(BRAIN_TRAUMA_SPECIAL, TRAUMA_RESILIENCE_MAGIC) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/advanced/necrotic_revival.dm b/code/modules/surgery/advanced/necrotic_revival.dm deleted file mode 100644 index b3521d28d8de..000000000000 --- a/code/modules/surgery/advanced/necrotic_revival.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/surgery/advanced/necrotic_revival - name = "Necrotic Revival" - desc = "An experimental surgical procedure that stimulates the growth of a Romerol tumor inside the patient's brain. Requires zombie powder or rezadone." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/bionecrosis, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - possible_locs = list(BODY_ZONE_HEAD) - -/datum/surgery/advanced/necrotic_revival/can_start(mob/user, mob/living/carbon/target) - . = ..() - var/obj/item/organ/zombie_infection/z_infection = target.getorganslot(ORGAN_SLOT_ZOMBIE) - if(z_infection) - return FALSE - -/datum/surgery_step/bionecrosis - name = "start bionecrosis" - implements = list( - /obj/item/reagent_containers/syringe = 100, - /obj/item/pen = 30) - time = 50 - chems_needed = list(/datum/reagent/toxin/zombiepowder, /datum/reagent/medicine/rezadone) - require_all_chems = FALSE - -/datum/surgery_step/bionecrosis/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to grow a romerol tumor on [target]'s brain..."), - span_notice("[user] begins to tinker with [target]'s brain..."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head pounds with unimaginable pain!") // Same message as other brain surgeries - -/datum/surgery_step/bionecrosis/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You succeed in growing a romerol tumor on [target]'s brain."), - span_notice("[user] successfully grows a romerol tumor on [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your head goes totally numb for a moment, the pain is overwhelming!") - if(!target.getorganslot(ORGAN_SLOT_ZOMBIE)) - var/obj/item/organ/zombie_infection/z_infection = new() - z_infection.Insert(target) - return ..() diff --git a/code/modules/surgery/advanced/viral_bonding.dm b/code/modules/surgery/advanced/viral_bonding.dm deleted file mode 100644 index 26dc1c0c7d34..000000000000 --- a/code/modules/surgery/advanced/viral_bonding.dm +++ /dev/null @@ -1,50 +0,0 @@ -/datum/surgery/advanced/viral_bonding - name = "Viral Bonding" - desc = "A surgical procedure that forces a symbiotic relationship between a virus and its host. The patient must be dosed with spaceacillin, virus food, and formaldehyde." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/viral_bond, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - -/datum/surgery/advanced/viral_bonding/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - if(!LAZYLEN(target.diseases)) - return FALSE - return TRUE - -/datum/surgery_step/viral_bond - name = "viral bond" - implements = list( - TOOL_CAUTERY = 100, - TOOL_WELDER = 50, - /obj/item = 30) // 30% success with any hot item. - time = 100 - chems_needed = list(/datum/reagent/medicine/spaceacillin,/datum/reagent/consumable/virus_food,/datum/reagent/toxin/formaldehyde) - -/datum/surgery_step/viral_bond/tool_check(mob/user, obj/item/tool) - if(implement_type == TOOL_WELDER || implement_type == /obj/item) - return tool.get_temperature() - - return TRUE - -/datum/surgery_step/viral_bond/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You start heating [target]'s bone marrow with [tool]..."), - span_notice("[user] starts heating [target]'s bone marrow with [tool]..."), - span_notice("[user] starts heating something in [target]'s chest with [tool]...")) - display_pain(target, "You feel a searing heat spread through your chest!") - -/datum/surgery_step/viral_bond/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - display_results(user, target, span_notice("[target]'s bone marrow begins pulsing slowly. The viral bonding is complete."), - span_notice("[target]'s bone marrow begins pulsing slowly."), - span_notice("[user] finishes the operation.")) - display_pain(target, "You feel a faint throbbing in your chest.") - for(var/datum/disease/infected_disease as anything in target.diseases) - infected_disease.carrier = TRUE - return TRUE diff --git a/code/modules/surgery/advanced/wingreconstruction.dm b/code/modules/surgery/advanced/wingreconstruction.dm deleted file mode 100644 index c6719ee85edd..000000000000 --- a/code/modules/surgery/advanced/wingreconstruction.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/surgery/advanced/wing_reconstruction - name = "Wing Reconstruction" - desc = "An experimental surgical procedure that reconstructs the damaged wings of gamuioda. Requires Synthflesh." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/wing_reconstruction) - possible_locs = list(BODY_ZONE_CHEST) - target_mobtypes = list(/mob/living/carbon/human) - -/datum/surgery/advanced/wing_reconstruction/can_start(mob/user, mob/living/carbon/target) - if(!istype(target)) - return FALSE - var/obj/item/organ/wings/moth/wings = target.getorganslot(ORGAN_SLOT_EXTERNAL_WINGS) - return ..() && wings?.burnt - -/datum/surgery_step/wing_reconstruction - name = "start wing reconstruction" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15) - time = 200 - chems_needed = list(/datum/reagent/medicine/c2/synthflesh) - require_all_chems = FALSE - -/datum/surgery_step/wing_reconstruction/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to fix [target]'s charred wing membranes..."), - span_notice("[user] begins to fix [target]'s charred wing membranes."), - span_notice("[user] begins to perform surgery on [target]'s charred wing membranes.")) - display_pain(target, "Your wings sting like hell!") - -/datum/surgery_step/wing_reconstruction/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - display_results(user, target, span_notice("You succeed in reconstructing [target]'s wings."), - span_notice("[user] successfully reconstructs [target]'s wings!"), - span_notice("[user] completes the surgery on [target]'s wings.")) - display_pain(target, "You can feel your wings again!") - var/obj/item/organ/wings/moth/wings = target.getorganslot(ORGAN_SLOT_EXTERNAL_WINGS) - wings?.heal_wings() - - var/obj/item/organ/antennae/antennae = target.getorganslot(ORGAN_SLOT_EXTERNAL_ANTENNAE) //i mean we might aswell heal their antennae too - antennae?.heal_antennae() - - human_target.update_body_parts() - return ..() diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm deleted file mode 100644 index cbe6348c7804..000000000000 --- a/code/modules/surgery/amputation.dm +++ /dev/null @@ -1,45 +0,0 @@ - -/datum/surgery/amputation - name = "Amputation" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/sever_limb) - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD) - requires_bodypart_type = 0 - - -/datum/surgery_step/sever_limb - name = "sever limb" - implements = list( - /obj/item/shears = 300, - TOOL_SCALPEL = 100, - TOOL_SAW = 100, - /obj/item/melee/arm_blade = 80, - /obj/item/fireaxe = 50, - /obj/item/hatchet = 40, - /obj/item/knife/butcher = 25) - time = 64 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/sever_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to sever [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to sever [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] begins to sever [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "You feel a gruesome pain in your [parse_zone(target_zone)]'s joint!") - - -/datum/surgery_step/sever_limb/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You sever [target]'s [parse_zone(target_zone)]."), - span_notice("[user] severs [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] severs [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "You lose all feeling in your [parse_zone(target_zone)]!") - if(surgery.operated_bodypart) - var/obj/item/bodypart/target_limb = surgery.operated_bodypart - target_limb.drop_limb() - return ..() diff --git a/code/modules/surgery/blood_filter.dm b/code/modules/surgery/blood_filter.dm deleted file mode 100644 index b52bed3186b1..000000000000 --- a/code/modules/surgery/blood_filter.dm +++ /dev/null @@ -1,81 +0,0 @@ -/datum/surgery/blood_filter - name = "Filter blood" - steps = list(/datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/filter_blood, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - requires_bodypart_type = TRUE - ignore_clothes = FALSE - -/datum/surgery/blood_filter/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_HUSK)) //You can filter the blood of a dead person just not husked - return FALSE - return ..() - -/datum/surgery_step/filter_blood/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - if(!..()) - return - while(has_filterable_chems(target, tool)) - if(!..()) - break - -/** - * Checks if the mob contains chems we can filter - * - * If the blood filter's whitelist is empty this checks if the mob contains any chems - * If the whitelist contains chems it checks if any chems in the mob match chems in the whitelist - * - * Arguments: - * * target - The mob to check the chems of - * * bloodfilter - The blood filter to check the whitelist of - */ -/datum/surgery_step/filter_blood/proc/has_filterable_chems(mob/living/carbon/target, obj/item/blood_filter/bloodfilter) - if(!length(target.reagents?.reagent_list)) - return FALSE - - if(!length(bloodfilter.whitelist)) - return TRUE - - for(var/datum/reagent/chem as anything in target.reagents.reagent_list) - if(chem.type in bloodfilter.whitelist) - return TRUE - - return FALSE - -/datum/surgery_step/filter_blood - name = "Filter blood" - implements = list(/obj/item/blood_filter = 95) - repeatable = TRUE - time = 2.5 SECONDS - success_sound = 'sound/machines/ping.ogg' - -/datum/surgery_step/filter_blood/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin filtering [target]'s blood..."), - span_notice("[user] uses [tool] to filter [target]'s blood."), - span_notice("[user] uses [tool] on [target]'s chest.")) - display_pain(target, "You feel a throbbing pain in your chest!") - -/datum/surgery_step/filter_blood/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/blood_filter/bloodfilter = tool - if(target.reagents?.total_volume) - for(var/datum/reagent/chem as anything in target.reagents.reagent_list) - if(!length(bloodfilter.whitelist) || (chem.type in bloodfilter.whitelist)) - target.reagents.remove_reagent(chem.type, min(chem.volume * 0.22, 10)) - display_results(user, target, span_notice("\The [tool] pings as it finishes filtering [target]'s blood."), - span_notice("\The [tool] pings as it stops pumping [target]'s blood."), - "\The [tool] pings as it stops pumping.") - - if(locate(/obj/item/healthanalyzer) in user.held_items) - chemscan(user, target) - - return ..() - -/datum/surgery_step/filter_blood/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_warning("You screw up, bruising [target]'s chest!"), - span_warning("[user] screws up, brusing [target]'s chest!"), - span_warning("[user] screws up!")) - target.adjustBruteLoss(5) diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index b9fe613662c2..9c1e6a173041 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -2,6 +2,8 @@ name = "limb" desc = "Why is it detached..." + germ_level = 0 + force = 6 throwforce = 3 stamina_damage = 40 @@ -24,6 +26,10 @@ VAR_PROTECTED/icon_husk = 'icons/mob/human_parts.dmi' ///The type of husk for building an iconstate var/husk_type = "humanoid" + ///The file to pull damage overlays from. Null is valid. + var/icon_dmg_overlay = 'icons/mob/species/human/damage.dmi' + /// The file to pull bloody clothing overlays from. Null is valid. + var/icon_bloodycover = 'icons/effects/blood.dmi' grind_results = list(/datum/reagent/bone_dust = 10, /datum/reagent/liquidgibs = 5) // robotic bodyparts and chests/heads cannot be ground @@ -58,8 +64,6 @@ var/aux_layer /// bitflag used to check which clothes cover this bodypart var/body_part - /// List of obj/item's embedded inside us. Managed by embedded components, do not modify directly - var/list/embedded_objects = list() /// are we a hand? if so, which one! var/held_index = 0 /// For limbs that don't really exist, eg chainsaws @@ -71,8 +75,9 @@ var/disable_threshold = 0 ///Controls whether bodypart_disabled makes sense or not for this limb. var/can_be_disabled = FALSE - ///Multiplier of the limb's damage that gets applied to the mob - var/body_damage_coeff = 1 + /// The interaction speed modifier when this limb is used to interact with the world. ONLY WORKS FOR ARMS + var/interaction_speed_modifier = 1 + var/brutestate = 0 var/burnstate = 0 @@ -88,11 +93,47 @@ var/brute_ratio = 0 ///The % of current_damage that is burn var/burn_ratio = 0 + /// How much pain is on this limb from wounds. + VAR_PRIVATE/wound_pain = 0 + /// How much temporary pain is on this limb + VAR_PRIVATE/temporary_pain = 0 ///The minimum damage a part must have before it's bones may break. Defaults to max_damage * BODYPART_MINIMUM_BREAK_MOD var/minimum_break_damage = 0 + /// Bleed multiplier + var/arterial_bleed_severity = 1 + + /// Needs to be opened with a saw to access the organs. For robotic bodyparts, you can open the "hatch" + var/encased + /// Is a stump. This is handled at runtime, do not touch. + var/is_stump + /// Does this limb have a cavity? + var/cavity + /// The name of the cavity of the limb + var/cavity_name + /// The type of storage datum to use for cavity storage. + var/cavity_storage_max_weight = WEIGHT_CLASS_SMALL + /// For robotic limbs: Hatch states, used by "surgery" + var/hatch_state + + /// List of obj/item's embedded inside us. Managed by embedded components, do not modify directly + var/list/embedded_objects = list() + /// List of obj/items stuck TO us. Managed by embedded components, do not directly modify + var/list/stuck_objects = list() + /// The items stored in our cavity + var/list/cavity_items = list() ///Bodypart flags, keeps track of blood, bones, arteries, tendons, and the like. var/bodypart_flags = NONE + /// The name of the artery this limb has + var/artery_name = "artery" + /// The name of the tendon this limb has + var/tendon_name = "tendon" + /// The name of the joint you can dislocate + var/joint_name = "joint" + /// The name for the amputation point of the limb + var/amputation_point + /// Surgical stage. Magic BS. Do not touch + var/stage = 0 ///Gradually increases while burning when at full damage, destroys the limb when at 100 var/cremation_progress = 0 @@ -116,8 +157,6 @@ var/px_y = 0 var/species_flags_list = list() - ///the type of damage overlay (if any) to use when this bodypart is bruised/burned. - var/dmg_overlay_type = "human" /// If we're bleeding, which icon are we displaying on this part var/bleed_overlay_icon @@ -153,13 +192,14 @@ var/cached_bleed_rate = 0 /// How much generic bleedstacks we have on this bodypart var/generic_bleedstacks - /// If we have a gauze wrapping currently applied (not including splints) - var/obj/item/stack/current_gauze - /// If something is currently grasping this bodypart and trying to staunch bleeding (see [/obj/item/hand_item/self_grasp]) - var/obj/item/hand_item/self_grasp/grasped_by - ///A list of all the cosmetic organs we've got stored to draw horns, wings and stuff with (special because we are actually in the limbs unlike normal organs :/ ) - var/list/obj/item/organ/cosmetic_organs = list() + /// If something is currently supporting this limb as a splint + var/obj/item/splint + /// The bandage that may-or-may-not be absorbing our blood + var/obj/item/stack/bandage + + ///A list of all the organs inside of us. + var/list/obj/item/organ/contained_organs = list() /// Type of an attack from this limb does. Arms will do punches, Legs for kicks, and head for bites. (TO ADD: tactical chestbumps) var/attack_type = BRUTE @@ -168,7 +208,7 @@ /// what visual effect is used when this limb is used to strike someone. var/unarmed_attack_effect = ATTACK_EFFECT_PUNCH /// Sounds when this bodypart is used in an umarmed attack - var/sound/unarmed_attack_sound = 'sound/weapons/punch1.ogg' + var/sound/unarmed_attack_sound = SFX_PUNCH var/sound/unarmed_miss_sound = 'sound/weapons/punchmiss.ogg' ///Lowest possible punch damage this bodypart can give. If this is set to 0, unarmed attacks will always miss. var/unarmed_damage_low = 1 @@ -187,8 +227,6 @@ /obj/item/bodypart/Initialize(mapload) . = ..() - if(!minimum_break_damage) - minimum_break_damage = max_damage * BODYPART_MINIMUM_BREAK_MOD if(can_be_disabled) RegisterSignal(src, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS), PROC_REF(on_paralysis_trait_gain)) @@ -206,34 +244,64 @@ if(length(wounds)) stack_trace("[type] qdeleted with [length(wounds)] uncleared wounds") wounds.Cut() + + QDEL_LIST(contained_organs) + QDEL_LIST(cavity_items) if(owner) drop_limb(TRUE) - for(var/external_organ in cosmetic_organs) - qdel(external_organ) + + QDEL_NULL(splint) + QDEL_NULL(bandage) return ..() /obj/item/bodypart/forceMove(atom/destination) //Please. Never forcemove a limb if its's actually in use. This is only for borgs. SHOULD_CALL_PARENT(TRUE) - . = ..() + if(isturf(destination)) update_icon_dropped() +/obj/item/bodypart/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(owner && loc != owner) + drop_limb(FALSE, TRUE) + stack_trace("Bodypart moved while it still had an owner") + /obj/item/bodypart/examine(mob/user) SHOULD_CALL_PARENT(TRUE) . = ..() . += mob_examine() -/obj/item/bodypart/proc/mob_examine(hallucinating) - if(!current_damage || hallucinating == SCREWYHUD_HEALTHY) +/obj/item/bodypart/proc/mob_examine(hallucinating, covered, just_wounds_please) + . = list() + + if(covered) + for(var/obj/item/I in embedded_objects) + if(I.isEmbedHarmless()) + . += "There is \a [I] stuck to [owner.p_their()] [plaintext_zone]!" + else + . += "There is \a [I] embedded in [owner.p_their()] [plaintext_zone]!" + + if(splint && istype(splint, /obj/item/stack)) + . += span_notice("\t [owner.p_their(TRUE)] [plaintext_zone] is splinted with [splint].") + + if(bandage) + . += span_notice("\t [owner.p_their(TRUE)] [plaintext_zone] is bandaged with [bandage][bandage.absorption_capacity ? "." : ", blood is trickling out."]") return + + if(hallucinating == SCREWYHUD_HEALTHY) + return + if(hallucinating == SCREWYHUD_CRIT) var/list/flavor_text = list("a") flavor_text += pick(" pair of ", " ton of ", " several ") flavor_text += pick("large cuts", "severe burns") - return "[owner.p_they(TRUE)] [owner.p_have()] [english_list(flavor_text)] on [owner.p_their()] [plaintext_zone].
" + . += "[owner.p_they(TRUE)] [owner.p_have()] [english_list(flavor_text)] on [owner.p_their()] [plaintext_zone]." + return var/list/flavor_text = list() + if((bodypart_flags & BP_CUT_AWAY) && !is_stump) + flavor_text += "a tear at the [amputation_point] so severe that it hangs by a scrap of flesh" if(!IS_ORGANIC_LIMB(src)) if(brute_dam) @@ -255,6 +323,24 @@ if(descriptor) wound_descriptors[descriptor] += W.amount + if(how_open() >= SURGERY_RETRACTED) + var/bone = encased ? encased : "bone" + if(bodypart_flags & BP_BROKEN_BONES) + bone = "broken [bone]" + wound_descriptors["[bone] exposed"] = 1 + + if(!encased || how_open() >= SURGERY_DEENCASED) + var/list/bits = list() + for(var/obj/item/organ/organ in contained_organs) + if(organ.cosmetic_only) + continue + bits += organ.get_visible_state() + + for(var/obj/item/implant in cavity_items) + bits += implant.name + if(length(bits)) + wound_descriptors["[english_list(bits)] visible in the wounds"] = 1 + for(var/wound in wound_descriptors) switch(wound_descriptors[wound]) if(1) @@ -265,39 +351,71 @@ flavor_text += "several [wound]s" if(6 to INFINITY) flavor_text += "a ton of [wound]\s" + + if(just_wounds_please) + return english_list(flavor_text) + if(owner) - return "[owner.p_they(TRUE)] [owner.p_have()] [english_list(flavor_text)] on [owner.p_their()] [plaintext_zone].
" + if(current_damage) + . += "[owner.p_they(TRUE)] [owner.p_have()] [english_list(flavor_text)] on [owner.p_their()] [plaintext_zone]." + + for(var/obj/item/I in embedded_objects) + if(I.isEmbedHarmless()) + . += "\t There is \a [I] stuck to [owner.p_their()] [plaintext_zone]!" + else + . += "\t There is \a [I] embedded in [owner.p_their()] [plaintext_zone]!" + + if(splint && istype(splint, /obj/item/stack)) + . += span_notice("\t [owner.p_their(TRUE)] [plaintext_zone] is splinted with [splint].") + if(bandage) + . += span_notice("\n\t [owner.p_their(TRUE)] [plaintext_zone] is bandaged with [bandage][bandage.absorption_capacity ? "." : ", it is no longer absorbing blood."]") + return + else - return "it has [english_list(flavor_text)].
" + if(current_damage) + . += "It has [english_list(flavor_text)]." + if(bodypart_flags & BP_BROKEN_BONES) + . += span_warning("It is dented and swollen.") + return /obj/item/bodypart/blob_act() receive_damage(max_damage) +/obj/item/bodypart/ex_act(severity, target) + if(owner) // Do not explode if we are attached to a person. + return + return ..() + /obj/item/bodypart/attack(mob/living/carbon/victim, mob/user) SHOULD_CALL_PARENT(TRUE) - if(ishuman(victim)) - var/mob/living/carbon/human/human_victim = victim - if(HAS_TRAIT(victim, TRAIT_LIMBATTACHMENT)) - if(!human_victim.get_bodypart(body_zone)) - user.temporarilyRemoveItemFromInventory(src, TRUE) - if(!attach_limb(victim)) - to_chat(user, span_warning("[human_victim]'s body rejects [src]!")) - forceMove(human_victim.loc) - if(human_victim == user) - human_victim.visible_message(span_warning("[human_victim] jams [src] into [human_victim.p_their()] empty socket!"),\ - span_notice("You force [src] into your empty socket, and it locks into place!")) - else - human_victim.visible_message(span_warning("[user] jams [src] into [human_victim]'s empty socket!"),\ - span_notice("[user] forces [src] into your empty socket, and it locks into place!")) - return - ..() + if(!ishuman(victim) || !HAS_TRAIT(victim, TRAIT_LIMBATTACHMENT)) + return ..() + + var/mob/living/carbon/human/human_victim = victim + if(human_victim.get_bodypart(body_zone)) + return ..() + + if(!user.temporarilyRemoveItemFromInventory(src)) + return ..() + + if(!attach_limb(victim)) + to_chat(user, span_warning("[human_victim]'s body rejects [src]!")) + return + + if(human_victim == user) + human_victim.visible_message(span_warning("[human_victim] jams [src] into [human_victim.p_their()] empty socket!"),\ + span_notice("You force [src] into your empty socket, and it locks into place!")) + else + human_victim.visible_message(span_warning("[user] jams [src] into [human_victim]'s empty socket!"),\ + span_notice("[user] forces [src] into your empty socket, and it locks into place!")) + /obj/item/bodypart/attackby(obj/item/weapon, mob/user, params) SHOULD_CALL_PARENT(TRUE) if(weapon.sharpness) - add_fingerprint(user) + weapon.leave_evidence(user, src) if(!contents.len) to_chat(user, span_warning("There is nothing left inside [src]!")) return @@ -305,7 +423,7 @@ user.visible_message(span_warning("[user] begins to cut open [src]."),\ span_notice("You begin to cut open [src]...")) if(do_after(user, src, 54)) - drop_organs(user, TRUE) + drop_contents(user, TRUE) else return ..() @@ -322,48 +440,50 @@ /obj/item/bodypart/setDir(newdir) . = ..() dir = SOUTH - return //empties the bodypart from its organs and other things inside it -/obj/item/bodypart/proc/drop_organs(mob/user, violent_removal) +/obj/item/bodypart/proc/drop_contents(mob/user, violent_removal) SHOULD_CALL_PARENT(TRUE) var/turf/bodypart_turf = get_turf(src) if(IS_ORGANIC_LIMB(src)) playsound(bodypart_turf, 'sound/misc/splort.ogg', 50, TRUE, -1) - seep_gauze(9999) // destroy any existing gauze if any exists - for(var/obj/item/organ/bodypart_organ in get_organs()) - bodypart_organ.transfer_to_limb(src, null) + if(splint) + remove_splint() + if(bandage) + remove_bandage() + + for(var/obj/item/I in cavity_items) + remove_cavity_item(I) + I.forceMove(bodypart_turf) for(var/obj/item/item_in_bodypart in src) - if(istype(item_in_bodypart, /obj/item/organ)) + if(isorgan(item_in_bodypart)) var/obj/item/organ/O = item_in_bodypart if(O.organ_flags & ORGAN_UNREMOVABLE) continue + else + if(O.owner) + O.Remove(O.owner) + else + remove_organ(O) item_in_bodypart.forceMove(bodypart_turf) + if(!violent_removal) + continue + item_in_bodypart.throw_at(get_edge_target_turf(item_in_bodypart, pick(GLOB.alldirs)), rand(1,3), 5) -///since organs aren't actually stored in the bodypart themselves while attached to a person, we have to query the owner for what we should have -/obj/item/bodypart/proc/get_organs() - SHOULD_CALL_PARENT(TRUE) - RETURN_TYPE(/list) - - if(!owner) - return FALSE - - var/list/bodypart_organs - for(var/obj/item/organ/organ_check as anything in owner.processing_organs) //internal organs inside the dismembered limb are dropped. - if(check_zone(organ_check.zone) == body_zone) - LAZYADD(bodypart_organs, organ_check) // this way if we don't have any, it'll just return null - - return bodypart_organs //Return TRUE to get whatever mob this is in to update health. /obj/item/bodypart/proc/on_life(delta_time, times_fired, stam_heal) SHOULD_CALL_PARENT(TRUE) - . |= wound_life() - return + if(owner.stat != DEAD) + . |= wound_life() + if(temporary_pain) + temporary_pain = owner.body_position == LYING_DOWN ? max(0, temporary_pain - 3) : max(0, temporary_pain - 1) + . |= BODYPART_LIFE_UPDATE_HEALTH_HUD + . |= update_germs() /obj/item/bodypart/proc/wound_life() if(!LAZYLEN(wounds)) @@ -379,6 +499,7 @@ // wounds can disappear after 10 minutes at the earliest if(W.damage <= 0 && W.created + (10 MINUTES) <= world.time) qdel(W) + stack_trace("Wound with zero health collected") continue // let the GC handle the deletion of the wound @@ -401,17 +522,17 @@ W.heal_damage(heal_amt) // sync the bodypart's damage with its wounds - if(update_damage()) - return BODYPART_LIFE_UPDATE_HEALTH + return update_damage() + +/obj/item/bodypart/proc/is_damageable(added_damage) + return !IS_ORGANIC_LIMB(src) || ((brute_dam + burn_dam + added_damage) < max_damage * 4) //Applies brute and burn damage to the organ. Returns 1 if the damage-icon states changed at all. //Damage will not exceed max_damage using this proc //Cannot apply negative damage -/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, stamina = 0, blocked = 0, updating_health = TRUE, required_status = null, sharpness = NONE, breaks_bones = TRUE) +/obj/item/bodypart/proc/receive_damage(brute = 0, burn = 0, blocked = 0, updating_health = TRUE, required_status = null, sharpness = NONE, modifiers = DEFAULT_DAMAGE_FLAGS) SHOULD_CALL_PARENT(TRUE) var/hit_percent = (100-blocked)/100 - if(stamina) - stack_trace("Bodypart took stamina damage!") if((!brute && !burn) || hit_percent <= 0) return FALSE if(owner && (owner.status_flags & GODMODE)) @@ -433,32 +554,43 @@ var/spillover = 0 var/pure_brute = brute - var/damagable = ((brute_dam + burn_dam) < max_damage) + var/damagable = is_damageable() + var/total = brute + burn - spillover = brute_dam + burn_dam + brute - max_damage - if(spillover > 0) - brute = max(brute - spillover, 0) - else - spillover = brute_dam + burn_dam + brute + burn - max_damage + if(!is_damageable()) + spillover = brute_dam + burn_dam + brute - max_damage if(spillover > 0) - burn = max(burn - spillover, 0) + brute = max(brute - spillover, 0) + else + spillover = brute_dam + burn_dam + brute + burn - max_damage + if(spillover > 0) + burn = max(burn - spillover, 0) + var/can_dismember = modifiers & DAMAGE_CAN_DISMEMBER + var/can_jostle_bones = modifiers & DAMAGE_CAN_JOSTLE_BONES + var/can_break_bones = modifiers & DAMAGE_CAN_FRACTURE + + #ifndef UNIT_TESTS /* - // DISMEMBERMENT + // DISMEMBERMENT - Doesn't happen during unit tests due to fucking up damage. */ - if(owner) - var/total_damage = brute_dam + burn_dam + burn + brute + if(owner && can_dismember) + var/total_damage = brute_dam + burn_dam + burn + brute + spillover if(total_damage >= max_damage * LIMB_DISMEMBERMENT_PERCENT) - if(attempt_dismemberment(pure_brute, burn, sharpness)) - return update_bodypart_damage_state() || . + if(attempt_dismemberment(pure_brute, burn, sharpness, total_damage > max_damage * LIMB_AUTODISMEMBER_PERCENT)) + return update_damage() || . + #endif + if(can_break_bones || can_jostle_bones) + brute -= damage_internal_organs(round(brute/2, DAMAGE_PRECISION), null, sharpness) // Absorb some brute damage + burn -= damage_internal_organs(null, round(burn/2, DAMAGE_PRECISION)) //blunt damage is gud at fracturing - if(breaks_bones) - if(brute) + if(brute && (can_break_bones || can_jostle_bones)) + if((bodypart_flags & BP_BROKEN_BONES) && can_jostle_bones) jostle_bones(brute) - if((brute_dam + brute > minimum_break_damage) && prob((brute_dam + brute * (1 + !sharpness)) * BODYPART_BONES_BREAK_CHANCE_MOD)) - break_bones() + else if(can_break_bones && (brute_dam + brute > minimum_break_damage) && prob((brute_dam + brute * (1 + !sharpness)) * BODYPART_BONES_BREAK_CHANCE_MOD)) + break_bones() if(!damagable) @@ -480,14 +612,16 @@ create_wound(to_create, brute, update_damage = FALSE) if(burn) - /* Laser damage isnt a damage type yet - if(laser) - createwound(INJURY_TYPE_LASER, burn) - if(prob(40)) - owner.IgniteMob() - else - */ create_wound(WOUND_BURN, burn, update_damage = FALSE) + + //Initial pain spike + if(owner) + var/pain_reduction = CHEM_EFFECT_MAGNITUDE(owner, CE_PAINKILLER) / length(owner.bodyparts) + owner?.notify_pain(getPain() - pain_reduction) + + if(owner && total > 15 && prob(total*4) && !(bodypart_flags & BP_NO_PAIN)) + owner.bloodstream.add_reagent(/datum/reagent/medicine/epinephrine, round(total/10)) + //Disturb treated burns if(brute > 5) var/disturbed = 0 @@ -496,8 +630,15 @@ W.disinfected = 0 W.salved = 0 disturbed += W.damage + if(disturbed) to_chat(owner, span_warning("Ow! Your burns were disturbed.")) + owner.apply_pain(0.2*burn, body_zone, updating_health = FALSE) + + if(owner && can_break_bones && istype(src, /obj/item/bodypart/head) && (bodypart_flags & BP_HAS_BLOOD) && sharpness == NONE && (owner.stat == CONSCIOUS) && owner.has_mouth()) + if(prob(8) && owner.bleed(5)) + owner.spray_blood(pick(GLOB.alldirs), 1) + owner.visible_message(span_danger("Blood sprays from [owner]'s mouth!")) /* // END WOUND HANDLING @@ -510,19 +651,58 @@ brute = round(brute * (can_inflict / total_damage),DAMAGE_PRECISION) burn = round(burn * (can_inflict / total_damage),DAMAGE_PRECISION) - if(can_inflict <= 0) - return FALSE - if(brute) - set_brute_dam(brute_dam + brute) - if(burn) - set_burn_dam(burn_dam + burn) - + . = update_damage() if(owner) - if(can_be_disabled) - update_disabled() + update_disabled() if(updating_health) owner.updatehealth() - return update_bodypart_damage_state() + if(. & BODYPART_LIFE_UPDATE_DAMAGE_OVERLAYS) + owner.update_damage_overlays() + return . + +/// Damages internal organs. Does not call updatehealth(), be mindful. +/obj/item/bodypart/proc/damage_internal_organs(brute, burn, sharpness) + #ifdef UNIT_TESTS + return // This randomly changes the damage outcomes, this is bad for unit testing. + #endif + if(!LAZYLEN(contained_organs) || !(brute || burn)) + return FALSE + + var/organ_damage_threshold = 10 + if(sharpness & SHARP_POINTY) + organ_damage_threshold *= 0.5 + + var/damage + if(brute) + if(!(brute_dam + brute >= max_damage) && !(brute >= organ_damage_threshold)) + return FALSE + damage = brute + else + if(!(burn_dam + burn >= max_damage) && !(burn >= organ_damage_threshold)) + return FALSE + damage = burn + + var/list/victims = list() + var/organ_hit_chance = 0 + for(var/obj/item/organ/I as anything in contained_organs) + if(!I.cosmetic_only && I.damage < I.maxHealth) + victims[I] = I.relative_size + organ_hit_chance += I.relative_size + + //No damageable organs + if(!length(victims)) + return FALSE + + organ_hit_chance += 5 * damage/organ_damage_threshold + + if(encased && !(bodypart_flags & BP_BROKEN_BONES)) //ribs protect + organ_hit_chance *= 0.6 + + organ_hit_chance = min(organ_hit_chance, 100) + if(prob(organ_hit_chance)) + var/obj/item/organ/victim = pick_weight(victims) + damage *= victim.external_damage_modifier + return victim.applyOrganDamage(damage, updating_health = FALSE) //Heals brute and burn damage for the organ. Returns 1 if the damage-icon states changed at all. //Damage cannot go below zero. @@ -544,16 +724,16 @@ else brute = W.heal_damage(brute) - update_damage() + . = update_damage() if(owner) - if(can_be_disabled) - update_disabled() + update_disabled() if(updating_health) owner.updatehealth() + if(. & BODYPART_LIFE_UPDATE_DAMAGE_OVERLAYS) + owner.update_damage_overlays() cremation_progress = min(0, cremation_progress - ((brute_dam + burn_dam)*(100/max_damage))) - return update_bodypart_damage_state() - + return . ///Proc to hook behavior associated to the change of the brute_dam variable's value. /obj/item/bodypart/proc/set_brute_dam(new_value) @@ -582,13 +762,15 @@ /obj/item/bodypart/proc/update_damage() var/old_brute = brute_dam var/old_burn = burn_dam + var/old_pain = wound_pain + real_wound_count = 0 brute_dam = 0 burn_dam = 0 + wound_pain = 0 //update damage counts for(var/datum/wound/W as anything in wounds) - if(W.damage <= 0) qdel(W) continue @@ -598,20 +780,35 @@ else brute_dam += W.damage + wound_pain += W.damage * W.pain_factor real_wound_count += W.amount current_damage = round(brute_dam + burn_dam, DAMAGE_PRECISION) burn_dam = round(burn_dam, DAMAGE_PRECISION) brute_dam = round(brute_dam, DAMAGE_PRECISION) + wound_pain = min(round(wound_pain, DAMAGE_PRECISION), max_damage) + var/limb_loss_threshold = max_damage + brute_ratio = brute_dam / (limb_loss_threshold * 2) burn_ratio = burn_dam / (limb_loss_threshold * 2) - . = (old_brute != brute_dam || old_burn != burn_dam) + var/tbrute = min(round( (brute_dam/max_damage)*3, 1 ), 3) + var/tburn = min(round( (burn_dam/max_damage)*3, 1 ), 3) + if((tbrute != brutestate) || (tburn != burnstate)) + brutestate = tbrute + burnstate = tburn + . |= BODYPART_LIFE_UPDATE_DAMAGE_OVERLAYS + + if(old_brute != brute_dam || old_burn != burn_dam) + . |= BODYPART_LIFE_UPDATE_HEALTH + + if(old_pain != wound_pain) + . |= BODYPART_LIFE_UPDATE_HEALTH_HUD + if(.) refresh_bleed_rate() - //Checks disabled status thresholds /obj/item/bodypart/proc/update_disabled() SHOULD_CALL_PARENT(TRUE) @@ -619,14 +816,22 @@ if(!owner) return + if(bodypart_flags & (BP_CUT_AWAY|BP_TENDON_CUT)) + set_disabled(TRUE) + return + if(!can_be_disabled) set_disabled(FALSE) - CRASH("update_disabled called with can_be_disabled false") + return if(HAS_TRAIT(src, TRAIT_PARALYSIS)) set_disabled(TRUE) return + if(bodypart_flags & BP_NECROTIC) + set_disabled(TRUE) + return + var/total_damage = max(brute_dam + burn_dam) // this block of checks is for limbs that can be disabled, but not through pure damage (AKA limbs that suffer wounds, human/monkey parts and such) @@ -635,7 +840,7 @@ last_maxed = FALSE else if(!last_maxed && owner.stat < UNCONSCIOUS) - INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "agony") last_maxed = TRUE set_disabled(FALSE) // we only care about the paralysis trait return @@ -644,7 +849,7 @@ if(total_damage >= max_damage * disable_threshold) if(!last_maxed) if(owner.stat < UNCONSCIOUS) - INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "agony") last_maxed = TRUE set_disabled(TRUE) return @@ -672,7 +877,7 @@ if(bodypart_disabled) owner.set_usable_legs(owner.usable_legs - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("Your lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) else if(!bodypart_disabled) owner.set_usable_legs(owner.usable_legs + 1) @@ -681,7 +886,7 @@ if(bodypart_disabled) owner.set_usable_hands(owner.usable_hands - 1) if(owner.stat < UNCONSCIOUS) - to_chat(owner, span_userdanger("Your lose control of your [name]!")) + to_chat(owner, span_userdanger("You lose control of your [plaintext_zone]!")) if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) else if(!bodypart_disabled) @@ -790,23 +995,10 @@ set_can_be_disabled(initial(can_be_disabled)) -//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() - SHOULD_CALL_PARENT(TRUE) - - var/tbrute = round( (brute_dam/max_damage)*3, 1 ) - var/tburn = round( (burn_dam/max_damage)*3, 1 ) - if((tbrute != brutestate) || (tburn != burnstate)) - brutestate = tbrute - burnstate = tburn - return TRUE - return FALSE - /obj/item/bodypart/deconstruct(disassembled = TRUE) SHOULD_CALL_PARENT(TRUE) - drop_organs() + drop_contents() return ..() /// INTERNAL PROC, DO NOT USE @@ -877,7 +1069,7 @@ cached_bleed_rate += 0.5 if(check_artery() & CHECKARTERY_SEVERED) - cached_bleed_rate += 5 + cached_bleed_rate += 4 for(var/obj/item/embeddies in embedded_objects) if(!embeddies.isEmbedHarmless()) @@ -885,12 +1077,9 @@ for(var/datum/wound/iter_wound as anything in wounds) if(iter_wound.bleeding()) - cached_bleed_rate += round(iter_wound.damage / 40, DAMAGE_PRECISION) + cached_bleed_rate += WOUND_BLEED_RATE(iter_wound) bodypart_flags |= BP_BLEEDING - if(!cached_bleed_rate) - QDEL_NULL(grasped_by) - // Our bleed overlay is based directly off bleed_rate, so go aheead and update that would you? if(cached_bleed_rate != old_bleed_rate) update_part_wound_overlay() @@ -902,8 +1091,20 @@ var/bleed_rate = cached_bleed_rate if(owner.body_position == LYING_DOWN) bleed_rate *= 0.75 - if(grasped_by) - bleed_rate *= 0.7 + + if(HAS_TRAIT(src, TRAIT_BODYPART_GRABBED)) + bleed_rate *= 0.4 + + if(bandage) + bleed_rate *= bandage.absorption_rate_modifier + + var/coag_level = CHEM_EFFECT_MAGNITUDE(owner, CE_ANTICOAGULANT) + if(coag_level) + if(coag_level > 0) + bleed_rate *= 1 + coag_level + else + bleed_rate *= 0.5 / coag_level + return bleed_rate // how much blood the limb needs to be losing per tick (not counting laying down/self grasping modifiers) to get the different bleed icons @@ -912,8 +1113,9 @@ #define BLEED_OVERLAY_GUSH 3.25 /obj/item/bodypart/proc/update_part_wound_overlay() - if(!owner) + if(!owner || is_stump) return FALSE + if(HAS_TRAIT(owner, TRAIT_NOBLEED) || !IS_ORGANIC_LIMB(src) || (NOBLOOD in species_flags_list)) if(bleed_overlay_icon) bleed_overlay_icon = null @@ -947,61 +1149,88 @@ #undef BLEED_OVERLAY_MED #undef BLEED_OVERLAY_GUSH -/** - * apply_gauze() is used to- well, apply gauze to a bodypart - * - * As of the Wounds 2 PR, all bleeding is now bodypart based rather than the old bleedstacks system, and 90% of standard bleeding comes from flesh wounds (the exception is embedded weapons). - * The same way bleeding is totaled up by bodyparts, gauze now applies to all wounds on the same part. Thus, having a slash wound, a pierce wound, and a broken bone wound would have the gauze - * applying blood staunching to the first two wounds, while also acting as a sling for the third one. Once enough blood has been absorbed or all wounds with the ACCEPTS_GAUZE flag have been cleared, - * the gauze falls off. - * - * Arguments: - * * gauze- Just the gauze stack we're taking a sheet from to apply here - */ -/obj/item/bodypart/proc/apply_gauze(obj/item/stack/gauze) - if(!istype(gauze) || !gauze.absorption_capacity) +/obj/item/bodypart/proc/apply_bandage(obj/item/stack/new_bandage) + if(bandage || !istype(new_bandage) || !new_bandage.absorption_capacity) return - var/newly_gauzed = FALSE - if(!current_gauze) - newly_gauzed = TRUE - QDEL_NULL(current_gauze) - current_gauze = new gauze.type(src, 1) - gauze.use(1) - if(newly_gauzed) - SEND_SIGNAL(src, COMSIG_BODYPART_GAUZED, gauze) - -/** - * seep_gauze() is for when a gauze wrapping absorbs blood or pus from wounds, lowering its absorption capacity. - * - * The passed amount of seepage is deducted from the bandage's absorption capacity, and if we reach a negative absorption capacity, the bandages falls off and we're left with nothing. - * - * Arguments: - * * seep_amt - How much absorption capacity we're removing from our current bandages (think, how much blood or pus are we soaking up this tick?) - */ -/obj/item/bodypart/proc/seep_gauze(seep_amt = 0) - if(!current_gauze) + + bandage = new_bandage.split_stack(null, 1, src) + RegisterSignal(bandage, COMSIG_PARENT_QDELETING, PROC_REF(bandage_gone)) + if(bandage.absorption_capacity && owner.stat < UNCONSCIOUS) + for(var/datum/wound/iter_wound as anything in wounds) + if(iter_wound.bleeding()) + to_chat(owner, span_warning("You feel blood pool on your [plaintext_zone].")) + break + +/obj/item/bodypart/proc/remove_bandage() + if(!bandage) + return FALSE + + . = bandage + UnregisterSignal(bandage, COMSIG_PARENT_QDELETING) + if(bandage.loc == src) + bandage.forceMove(drop_location()) + bandage = null + +/obj/item/bodypart/proc/bandage_gone(obj/item/stack/bandage) + SIGNAL_HANDLER + remove_bandage() + +/obj/item/bodypart/proc/apply_splint(obj/item/splint) + if(src.splint) + return FALSE + + src.splint = splint + if(istype(splint, /obj/item/stack)) + splint.forceMove(src) + + update_interaction_speed() + RegisterSignal(splint, COMSIG_PARENT_QDELETING, PROC_REF(splint_gone)) + SEND_SIGNAL(src, COMSIG_LIMB_SPLINTED, splint) + return TRUE + +/obj/item/bodypart/leg/apply_splint(obj/item/splint) + . = ..() + if(!.) return - current_gauze.absorption_capacity -= seep_amt - if(current_gauze.absorption_capacity <= 0) - owner.visible_message(span_danger("\The [current_gauze.name] on [owner]'s [name] falls away in rags."), span_warning("\The [current_gauze.name] on your [name] falls away in rags."), vision_distance=COMBAT_MESSAGE_RANGE) - QDEL_NULL(current_gauze) - SEND_SIGNAL(src, COMSIG_BODYPART_GAUZE_DESTROYED) + owner.apply_status_effect(/datum/status_effect/limp) + +/obj/item/bodypart/proc/remove_splint() + if(!splint) + return FALSE + + . = splint + + UnregisterSignal(splint, COMSIG_PARENT_QDELETING) + if(splint.loc == src) + splint.forceMove(drop_location()) + + splint = null + update_interaction_speed() + SEND_SIGNAL(src, COMSIG_LIMB_UNSPLINTED, splint) + +/obj/item/bodypart/proc/splint_gone(obj/item/source) + SIGNAL_HANDLER + remove_splint() + +/obj/item/bodypart/drop_location() + if(owner) + return owner.drop_location() + return ..() ///Loops through all of the bodypart's external organs and update's their color. /obj/item/bodypart/proc/recolor_cosmetic_organs() - for(var/obj/item/organ/ext_organ as anything in cosmetic_organs) - ext_organ.inherit_color(force = TRUE) + for(var/obj/item/organ/O as anything in contained_organs) + if(!O.visual) + continue + O.inherit_color(force = TRUE) ///A multi-purpose setter for all things immediately important to the icon and iconstate of the limb. -/obj/item/bodypart/proc/change_appearance(icon, id, greyscale, dimorphic) - var/icon_holder - if(greyscale) - icon_greyscale = icon - icon_holder = icon +/obj/item/bodypart/proc/change_appearance(icon, id, greyscale, dimorphic, update_owner = TRUE) + if(!isnull(greyscale) && greyscale == TRUE) + icon_greyscale = icon || icon_greyscale should_draw_greyscale = TRUE - else - icon_static = icon - icon_holder = icon + else if(greyscale == FALSE) + icon_static = icon || icon_static should_draw_greyscale = FALSE if(id) //limb_id should never be falsey @@ -1010,15 +1239,15 @@ if(!isnull(dimorphic)) is_dimorphic = dimorphic - if(owner) + if(owner && update_owner) owner.update_body_parts() else update_icon_dropped() //This foot gun needs a safety - if(!icon_exists(icon_holder, "[limb_id]_[body_zone][is_dimorphic ? "_[limb_gender]" : ""]")) + if(!icon_exists(should_draw_greyscale ? icon_greyscale : icon_static, "[limb_id]_[body_zone][is_dimorphic ? "_[limb_gender]" : ""]")) reset_appearance() - stack_trace("change_appearance([icon], [id], [greyscale], [dimorphic]) generated null icon") + stack_trace("change_appearance([icon || "NULL"], [id || "NULL"], [greyscale|| "NULL"], [dimorphic|| "NULL"]) generated null icon. Appearance not applied.") ///Resets the base appearance of a limb to it's default values. /obj/item/bodypart/proc/reset_appearance() @@ -1057,3 +1286,222 @@ return list(0,-3) if(WEST) return list(0,-3) + +/obj/item/bodypart/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_WIRES || !(bodytype & BODYTYPE_ROBOTIC)) + return FALSE + + if(!(body_zone == BODY_ZONE_CHEST)) + owner.visible_message(span_danger("[owner]'s [src.name] falls limp!")) + + var/time_needed = 10 SECONDS + var/brute_damage = 1.5 + var/burn_damage = 2.5 + + if(severity == EMP_HEAVY) + time_needed *= 2 + brute_damage *= 2 + burn_damage *= 2 + + receive_damage(brute_damage, burn_damage, modifiers = NONE) + do_sparks(number = 1, cardinal_only = FALSE, source = owner) + ADD_TRAIT(src, TRAIT_PARALYSIS, EMP_TRAIT) + addtimer(CALLBACK(src, PROC_REF(un_paralyze)), time_needed) + return TRUE + +/obj/item/bodypart/proc/un_paralyze() + REMOVE_TRAITS_IN(src, EMP_TRAIT) + +/obj/item/bodypart/leg/emp_act(severity) + . = ..() + if(!.) + return + owner.Knockdown(severity == EMP_HEAVY ? 20 SECONDS : 10 SECONDS) + +/obj/item/bodypart/chest/robot/emp_act(severity) + . = ..() + if(!.) + return + to_chat(owner, span_danger("Your [src.name]'s logic boards temporarily become unresponsive!")) + if(severity == EMP_HEAVY) + owner.Stun(6 SECONDS) + owner.Shake(pixelshiftx = 5, pixelshifty = 2, duration = 4 SECONDS) + return + + owner.Stun(3 SECONDS) + owner.Shake(pixelshiftx = 3, pixelshifty = 0, duration = 2.5 SECONDS) + +/// Add an item to our cavity. Call AFTER physically moving it via a proc like forceMove(). +/obj/item/bodypart/proc/add_cavity_item(obj/item/I) + cavity_items += I + RegisterSignal(I, COMSIG_MOVABLE_MOVED, PROC_REF(item_gone)) + RegisterSignal(I, COMSIG_PARENT_QDELETING, PROC_REF(item_gone)) + +/obj/item/bodypart/proc/remove_cavity_item(obj/item/I) + cavity_items -= I + UnregisterSignal(I, COMSIG_MOVABLE_MOVED) + UnregisterSignal(I, COMSIG_PARENT_QDELETING) + +/obj/item/bodypart/proc/item_gone(datum/source) + SIGNAL_HANDLER + remove_cavity_item(source) + +/obj/item/bodypart/proc/get_scan_results(tag) + RETURN_TYPE(/list) + SHOULD_CALL_PARENT(TRUE) + . = list() + if(!IS_ORGANIC_LIMB(src)) + . += tag ? "Mechanical" : "Mechanical" + + if(bodypart_flags & BP_CUT_AWAY) + . += tag ? "Severed" : "Severed" + + if(check_tendon() & CHECKTENDON_SEVERED) + . += tag ? "Severed [tendon_name]" : "Severed [tendon_name]" + + if(check_artery() & CHECKARTERY_SEVERED) + . += tag ? "Severed [artery_name]" : "Severed [artery_name]" + + if(check_bones() & CHECKBONES_BROKEN) + . += tag ? "Fractured" : "Fractured" + + if(bodypart_flags & BP_DISLOCATED) + . += tag ? "Dislocated" : "Dislocated" + + if (length(cavity_items) || length(embedded_objects)) + var/unknown_body = 0 + for(var/obj/item/I in cavity_items + embedded_objects) + if(istype(I,/obj/item/implant)) + var/obj/item/implant/imp = I + if(imp.implant_flags & IMPLANT_HIDDEN) + continue + if (imp.implant_flags & IMPLANT_KNOWN) + . += tag ? "[capitalize(imp.name)] implanted" : "[capitalize(imp.name)] implanted" + continue + unknown_body++ + + if(unknown_body) + . += tag ? "Unknown body present" : "Unknown body present" + +/obj/item/bodypart/Topic(href, href_list) + . = ..() + if(QDELETED(src) || !owner) + return + + if(!ishuman(usr)) + return + + var/mob/living/carbon/human/user = usr + if(!user.Adjacent(owner)) + return + + if(user.get_active_held_item()) + return + + if(href_list["embedded_object"]) + var/obj/item/I = locate(href_list["embedded_object"]) in 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_LIMB_EMBED_RIP, I, user) + return + + if(href_list["splint_remove"]) + if(!splint) + return + + if(do_after(user, owner, 5 SECONDS, DO_PUBLIC)) + var/obj/item/removed = remove_splint() + if(!removed) + return + if(!user.put_in_hands(removed)) + removed.forceMove(user.drop_location()) + if(user == owner) + user.visible_message(span_notice("[user] removes [removed] from [user.p_their()] [plaintext_zone].")) + else + user.visible_message(span_notice("[user] removes [removed] from [owner]'s [plaintext_zone].")) + return + + if(href_list["bandage_remove"]) + if(!bandage) + return + + if(do_after(user, owner, 5 SECONDS, DO_PUBLIC)) + var/obj/item/removed = remove_bandage() + if(!removed) + return + if(!user.put_in_hands(removed)) + removed.forceMove(user.drop_location()) + if(user == owner) + user.visible_message(span_notice("[user] removes [removed] from [user.p_their()] [plaintext_zone].")) + else + user.visible_message(span_notice("[user] removes [removed] from [owner]'s [plaintext_zone].")) + return + +/obj/item/bodypart/proc/inspect(mob/user) + if(is_stump) + to_chat(user, span_notice("[owner] is missing that bodypart.")) + return + + user.visible_message(span_notice("[user] starts inspecting [owner]'s [plaintext_zone] carefully.")) + if(LAZYLEN(wounds)) + to_chat(user, span_warning("You find [mob_examine(just_wounds_please = TRUE)].")) + var/list/stuff = list() + for(var/datum/wound/wound as anything in wounds) + if(LAZYLEN(wound.embedded_objects)) + stuff |= wound.embedded_objects + + if(length(stuff)) + to_chat(user, span_warning("There's [english_list(stuff)] sticking out of [owner]'s [plaintext_zone].")) + else + to_chat(user, span_notice("You find no visible wounds.")) + + to_chat(user, span_notice("Checking skin now...")) + + if(!do_after(user, owner, 1 SECOND, DO_PUBLIC)) + return + + to_chat(user, span_notice("Checking bones now...")) + if(!do_after(user, owner, 1 SECOND, DO_PUBLIC)) + return + + if(bodypart_flags & BP_BROKEN_BONES) + to_chat(user, span_warning("The [encased ? encased : "bone in the [plaintext_zone]"] moves slightly when you poke it!")) + owner.apply_pain(40, body_zone, "Your [plaintext_zone] hurts where it's poked.") + else + to_chat(user, span_notice("The [encased ? encased : "bones in the [plaintext_zone]"] seem to be fine.")) + + if(bodypart_flags & BP_TENDON_CUT) + to_chat(user, span_warning("The tendons in the [plaintext_zone] are severed!")) + if(bodypart_flags & BP_DISLOCATED) + to_chat(user, span_warning("The [joint_name] is dislocated!")) + return TRUE + +/// Applies all bodypart traits to the target. +/obj/item/bodypart/proc/apply_traits(mob/target) + if(isnull(target)) + return + + for(var/trait in bodypart_traits) + ADD_TRAIT(target, trait, bodypart_trait_source) + +/// Adds a trait to be applied by this bodypart. +/obj/item/bodypart/proc/add_bodypart_trait(trait) + bodypart_traits |= trait + apply_traits(owner) + +/// Removes a trait applied by this bodypart. +/obj/item/bodypart/proc/remove_bodypart_trait(trait) + bodypart_traits -= trait + if(owner) + REMOVE_TRAIT(owner, trait, bodypart_trait_source) + +/// Remove all bodypart traits this part grants. +/obj/item/bodypart/proc/remove_traits_from(mob/target) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) + if(isnull(target)) + return + + for(var/trait in bodypart_traits) + REMOVE_TRAIT(target, trait, bodypart_trait_source) diff --git a/code/modules/surgery/bodyparts/digitigrade.dm b/code/modules/surgery/bodyparts/digitigrade.dm new file mode 100644 index 000000000000..7127dbfc13b6 --- /dev/null +++ b/code/modules/surgery/bodyparts/digitigrade.dm @@ -0,0 +1,43 @@ +/obj/item/bodypart/leg/proc/set_digitigrade(is_digi) + if(is_digi) + if(!can_be_digitigrade) + return FALSE + + bodytype |= BODYTYPE_DIGITIGRADE + . = TRUE + else + if(!(bodytype & BODYTYPE_DIGITIGRADE)) + return FALSE + + bodytype &= ~BODYTYPE_DIGITIGRADE + if(old_limb_id) + limb_id = old_limb_id + . = TRUE + + if(.) + if(owner) + synchronize_bodytypes(owner) + owner.update_body_parts() + else + update_icon_dropped() + + +/obj/item/bodypart/leg/update_limb(dropping_limb, is_creating) + . = ..() + if(!ishuman(owner) || !(bodytype & BODYTYPE_DIGITIGRADE)) + return + + var/mob/living/carbon/human/human_owner = owner + var/uniform_compatible = FALSE + var/suit_compatible = FALSE + if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility + uniform_compatible = TRUE + if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability + suit_compatible = TRUE + + if((uniform_compatible && suit_compatible) || (suit_compatible && (human_owner.obscured_slots & HIDEJUMPSUIT))) //If the uniform is hidden, it doesnt matter if its compatible + if(limb_id != digitigrade_id) + old_limb_id = limb_id + limb_id = digitigrade_id + else + limb_id = old_limb_id diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 936587a359cf..5a50f16ca43c 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -4,8 +4,8 @@ return TRUE ///Remove target limb from it's owner, with side effects. -/obj/item/bodypart/proc/dismember(dismember_type = DROPLIMB_EDGE, silent=TRUE, clean = FALSE) - if(!owner || !dismemberable) +/obj/item/bodypart/proc/dismember(dismember_type = DROPLIMB_EDGE, silent=FALSE, clean = FALSE) + if(!owner || !dismemberable || (is_stump && !clean)) return FALSE var/mob/living/carbon/limb_owner = owner @@ -15,17 +15,31 @@ if(HAS_TRAIT(limb_owner, TRAIT_NODISMEMBER)) return FALSE - var/obj/item/bodypart/affecting = limb_owner.get_bodypart(BODY_ZONE_CHEST) - affecting.receive_damage(clamp(brute_dam/2 * affecting.body_damage_coeff, 15, 50), clamp(burn_dam/2 * affecting.body_damage_coeff, 0, 50)) //Damage the chest based on limb's existing damage if(!silent) - limb_owner.visible_message(span_danger("[limb_owner]'s [name] is violently dismembered!")) + var/list/messages = violent_dismember_messages(dismember_type, clean) + if(length(messages)) + limb_owner.visible_message( + span_danger("[messages[1]]"), + span_userdanger("[messages[2]]"), + span_hear("[messages[3]]") + ) + if(!(bodypart_flags & BP_NO_PAIN) && !HAS_TRAIT(limb_owner, TRAIT_NO_PAINSHOCK) && prob(80)) + INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/living/carbon, pain_emote), PAIN_AMT_AGONIZING, TRUE) + + // We need to create a stump *now* incase the limb being dropped destroys it or otherwise changes it. + var/obj/item/bodypart/stump - INVOKE_ASYNC(limb_owner, TYPE_PROC_REF(/mob, emote), "scream") - playsound(get_turf(limb_owner), 'sound/effects/dismember.ogg', 80, TRUE) - - SEND_SIGNAL(limb_owner, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered) + if(!clean) + playsound(get_turf(limb_owner), 'sound/effects/dismember.ogg', 80, TRUE) + limb_owner.shock_stage += minimum_break_damage + if(bodypart_flags & BP_HAS_BLOOD) + limb_owner.bleed(rand(20, 40)) + stump = create_stump() limb_owner.mind?.add_memory(MEMORY_DISMEMBERED, list(DETAIL_LOST_LIMB = src, DETAIL_PROTAGONIST = limb_owner), story_value = STORY_VALUE_AMAZING) + + // At this point the limb has been removed from it's parent mob. + limb_owner.apply_pain(60, body_zone, "OH GOD MY [uppertext(plaintext_zone)]!!!", TRUE) drop_limb() limb_owner.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment @@ -33,23 +47,34 @@ if(istype(owner_location)) limb_owner.add_splatter_floor(owner_location) + // * Stumpty Dumpty *// + var/obj/item/bodypart/parent_bodypart = limb_owner.get_bodypart(BODY_ZONE_CHEST) + var/obj/item/bodypart/damaged_bodypart = stump || parent_bodypart + if(!QDELETED(parent_bodypart) && !QDELETED(limb_owner)) + var/datum/wound/lost_limb/W = new(src, dismember_type, clean) + if(stump) + damaged_bodypart = stump + stump.attach_limb(limb_owner) + stump.adjustPain(max_damage) + if(dismember_type != DROPLIMB_BURN) + stump.set_sever_artery(TRUE) + + LAZYADD(damaged_bodypart.wounds, W) + W.parent = damaged_bodypart + damaged_bodypart.update_damage() + if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever return TRUE - var/obj/item/bodypart/chest/parent_chest = limb_owner.get_bodypart(BODY_ZONE_CHEST) - if(!QDELETED(parent_chest)) - var/datum/wound/lost_limb/W = new(src, dismember_type, clean, parent_chest) - LAZYADD(parent_chest.wounds, W) - if(dismember_type == DROPLIMB_BURN) burn() return TRUE add_mob_blood(limb_owner) - limb_owner.bleed(rand(20, 40)) - var/direction = pick(GLOB.cardinals) - if(!clean) + var/direction = pick(GLOB.alldirs) + + if(dismember_type == DROPLIMB_EDGE && !clean) var/t_range = rand(2,max(throw_range/2, 2)) var/turf/target_turf = get_turf(src) for(var/i in 1 to t_range-1) @@ -61,13 +86,20 @@ break throw_at(target_turf, throw_range, throw_speed) - if(dismember_type == DROPLIMB_BLUNT) - limb_owner.spray_blood(direction, 2) + if(dismember_type == DROPLIMB_BLUNT) + limb_owner.spray_blood(direction, 2) + if(IS_ORGANIC_LIMB(src)) + new /obj/effect/decal/cleanable/blood/gibs(get_turf(limb_owner)) + else + new /obj/effect/decal/cleanable/robot_debris(get_turf(limb_owner)) + + drop_contents() + qdel(src) return TRUE -/obj/item/bodypart/chest/dismember() +/obj/item/bodypart/chest/dismember(dismember_type = DROPLIMB_EDGE, silent=TRUE, clean = FALSE) if(!owner) return FALSE @@ -77,31 +109,32 @@ if(HAS_TRAIT(chest_owner, TRAIT_NODISMEMBER)) return FALSE + . = list() - if(isturf(chest_owner.loc)) - chest_owner.add_splatter_floor(chest_owner.loc) + + var/drop_loc = chest_owner.drop_location() + if(isturf(drop_loc)) + chest_owner.add_splatter_floor(drop_loc) + playsound(get_turf(chest_owner), 'sound/misc/splort.ogg', 80, TRUE) + for(var/obj/item/organ/organ as anything in chest_owner.processing_organs) - var/org_zone = check_zone(organ.zone) + var/org_zone = deprecise_zone(organ.zone) if(org_zone != BODY_ZONE_CHEST) continue organ.Remove(chest_owner) - organ.forceMove(chest_owner.loc) + organ.forceMove(drop_loc) . += organ for(var/obj/item/organ/O in src) if((O.organ_flags & ORGAN_UNREMOVABLE)) continue O.Remove(chest_owner) - O.forceMove(chest_owner.loc) + O.forceMove(drop_loc) . += O - if(cavity_item) - cavity_item.forceMove(chest_owner.loc) - . += cavity_item - cavity_item = null - - + for(var/obj/item/I in cavity_items) + I.forceMove(drop_loc) ///limb removal. The "special" argument is used for swapping a limb with a new one without the effects of losing a limb kicking in. /obj/item/bodypart/proc/drop_limb(special, dismembered) @@ -109,10 +142,11 @@ return var/atom/drop_loc = owner.drop_location() - SEND_SIGNAL(owner, COMSIG_CARBON_REMOVE_LIMB, src, dismembered) + SEND_SIGNAL(src, COMSIG_LIMB_REMOVE, owner, dismembered) update_limb(1) owner.remove_bodypart(src) + SEND_SIGNAL(owner, COMSIG_CARBON_REMOVED_LIMB, src, dismembered) if(held_index) if(owner.hand_bodyparts[held_index] == src) @@ -121,26 +155,19 @@ owner.dropItemToGround(owner.get_item_for_held_index(held_index), 1) owner.hand_bodyparts[held_index] = null - for(var/obj/item/organ/ext_organ as anything in cosmetic_organs) - ext_organ.transfer_to_limb(src, null) - var/mob/living/carbon/phantom_owner = set_owner(null) // so we can still refer to the guy who lost their limb after said limb forgets 'em - for(var/datum/surgery/surgery as anything in phantom_owner.surgeries) //if we had an ongoing surgery on that limb, we stop it. - if(surgery.operated_bodypart == src) - phantom_owner.surgeries -= surgery - qdel(surgery) - break + // * Remove surgeries on this limb * // + remove_surgeries_from_mob(phantom_owner) + // * Remove embedded objects * // for(var/obj/item/embedded in embedded_objects) embedded.forceMove(src) // It'll self remove via signal reaction, just need to move it + if(!phantom_owner.has_embedded_objects()) phantom_owner.clear_alert(ALERT_EMBEDDED_OBJECT) - SEND_SIGNAL(phantom_owner, COMSIG_CLEAR_MOOD_EVENT, "embedded") - - for(var/datum/wound/W as anything in wounds) - W.unregister_from_mob(phantom_owner) + bodypart_flags |= BP_CUT_AWAY if(!special) if(phantom_owner.dna) @@ -149,149 +176,128 @@ to_chat(phantom_owner, span_warning("You feel your [mutation] deactivating from the loss of your [body_zone]!")) phantom_owner.dna.force_lose(mutation) - for(var/obj/item/organ/organ as anything in phantom_owner.processing_organs) //internal organs inside the dismembered limb are dropped. - var/org_zone = check_zone(organ.zone) - if(org_zone != body_zone) - continue - organ.transfer_to_limb(src, null) + for(var/obj/item/organ/O as anything in contained_organs) + O.Remove(phantom_owner, special) + add_organ(O) //Remove() removes it from the limb as well. - for(var/trait in bodypart_traits) - REMOVE_TRAIT(phantom_owner, trait, bodypart_trait_source) + remove_traits_from(phantom_owner) + + remove_splint() update_icon_dropped() synchronize_bodytypes(phantom_owner) + phantom_owner.update_health_hud() //update the healthdoll phantom_owner.update_body() - phantom_owner.update_body_parts() - if(!drop_loc) // drop_loc = null happens when a "dummy human" used for rendering icons on prefs screen gets its limbs replaced. + if(!drop_loc || is_stump) // drop_loc = null happens when a "dummy human" used for rendering icons on prefs screen gets its limbs replaced. if(!QDELETED(src)) qdel(src) return if(is_pseudopart) - drop_organs(phantom_owner) //Psuedoparts shouldn't have organs, but just in case + drop_contents(phantom_owner) //Psuedoparts shouldn't have organs, but just in case if(!QDELETED(src)) qdel(src) return - forceMove(drop_loc) + if(!QDELETED(src)) + forceMove(drop_loc) + +/obj/item/bodypart/proc/remove_surgeries_from_mob(mob/living/carbon/human/H) + LAZYREMOVE(H.surgeries_in_progress, body_zone) + switch(body_zone) + if(BODY_ZONE_HEAD) + LAZYREMOVE(H.surgeries_in_progress, BODY_ZONE_PRECISE_EYES) + LAZYREMOVE(H.surgeries_in_progress, BODY_ZONE_PRECISE_MOUTH) -///Transfers the organ to the limb, and to the limb's owner, if it has one. This is done on drop_limb(). -/obj/item/organ/proc/transfer_to_limb(obj/item/bodypart/bodypart, mob/living/carbon/bodypart_owner) - if(owner) - Remove(owner, TRUE) - else if(ownerlimb) - remove_from_limb() + if(BODY_ZONE_CHEST) + LAZYREMOVE(H.surgeries_in_progress, BODY_ZONE_PRECISE_GROIN) - if(bodypart_owner) - Insert(bodypart_owner, TRUE) - else - add_to_limb(bodypart) +///Adds the organ to a bodypart. +/obj/item/bodypart/proc/add_organ(obj/item/organ/O) + O.ownerlimb = src + contained_organs |= O + ADD_TRAIT(O, TRAIT_INSIDE_BODY, bodypart_trait_source) -///Adds the organ to a bodypart, used in transfer_to_limb() -/obj/item/organ/proc/add_to_limb(obj/item/bodypart/bodypart) - if(visual) - ownerlimb = bodypart - ownerlimb.cosmetic_organs |= src - inherit_color() + if(O.visual) + if(owner && O.external_bodytypes) + synchronize_bodytypes(owner) + O.inherit_color() - forceMove(bodypart) +///Removes the organ from the limb. +/obj/item/bodypart/proc/remove_organ(obj/item/organ/O) + contained_organs -= O -///Removes the organ from the limb, placing it into nullspace. -/obj/item/organ/proc/remove_from_limb() - if(visual) - ownerlimb.cosmetic_organs -= src - if(ownerlimb.owner && external_bodytypes) - ownerlimb.synchronize_bodytypes(ownerlimb.owner) - ownerlimb = null + REMOVE_TRAIT(O, TRAIT_INSIDE_BODY, bodypart_trait_source) + if(owner && O.visual && O.external_bodytypes) + synchronize_bodytypes(owner) - moveToNullspace() + O.ownerlimb = null -/obj/item/organ/brain/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) +/obj/item/bodypart/head/add_organ(obj/item/organ/O) . = ..() - head.brain = src - if(brainmob) - head.brainmob = brainmob - brainmob = null - head.brainmob.forceMove(head) - head.brainmob.set_stat(DEAD) + if(istype(O, /obj/item/organ/ears)) + ears = O + + else if(istype(O, /obj/item/organ/eyes)) + eyes = O + + else if(istype(O, /obj/item/organ/tongue)) + tongue = O -/obj/item/organ/eyes/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) - head.eyes = src - ..() + else if(istype(O, /obj/item/organ/brain)) + brain = O -/obj/item/organ/ears/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) - head.ears = src - ..() +/obj/item/bodypart/head/remove_organ(obj/item/organ/O) + if(O == brain) + if(brainmob) + var/obj/item/organ/brain/B = O + brainmob.container = null + B.brainmob = brainmob + brainmob = null + brain = null -/obj/item/organ/tongue/transfer_to_limb(obj/item/bodypart/head/head, mob/living/carbon/human/head_owner) - head.tongue = src - ..() + else if(O == tongue) + tongue = null + + else if(O == eyes) + eyes = null + + else if(O == ears) + ears = null + + return ..() /obj/item/bodypart/chest/drop_limb(special) if(special) return ..() -/obj/item/bodypart/arm/right/drop_limb(special) - . = ..() - - var/mob/living/carbon/arm_owner = owner - if(arm_owner && !special) - if(arm_owner.handcuffed) - arm_owner.handcuffed.forceMove(drop_location()) - arm_owner.handcuffed.dropped(arm_owner) - arm_owner.set_handcuffed(null) - arm_owner.update_handcuffed() - if(arm_owner.hud_used) - var/atom/movable/screen/inventory/hand/R_hand = arm_owner.hud_used.hand_slots["[held_index]"] - if(R_hand) - R_hand.update_appearance() - if(arm_owner.gloves) - arm_owner.dropItemToGround(arm_owner.gloves, TRUE) - arm_owner.update_worn_gloves() //to remove the bloody hands overlay - +/obj/item/bodypart/arm/drop_limb(special) -/obj/item/bodypart/arm/left/drop_limb(special) var/mob/living/carbon/arm_owner = owner - . = ..() if(arm_owner && !special) if(arm_owner.handcuffed) - arm_owner.handcuffed.forceMove(drop_location()) - arm_owner.handcuffed.dropped(arm_owner) - arm_owner.set_handcuffed(null) - arm_owner.update_handcuffed() + arm_owner.remove_handcuffs() if(arm_owner.hud_used) - var/atom/movable/screen/inventory/hand/L_hand = arm_owner.hud_used.hand_slots["[held_index]"] - if(L_hand) - L_hand.update_appearance() + var/atom/movable/screen/inventory/hand/associated_hand = arm_owner.hud_used.hand_slots["[held_index]"] + if(associated_hand) + associated_hand.update_appearance() if(arm_owner.gloves) arm_owner.dropItemToGround(arm_owner.gloves, TRUE) arm_owner.update_worn_gloves() //to remove the bloody hands overlay - - -/obj/item/bodypart/leg/right/drop_limb(special) - if(owner && !special) - if(owner.legcuffed) - owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace - owner.legcuffed.dropped(owner) - owner.legcuffed = null - owner.update_worn_legcuffs() - if(owner.shoes) - owner.dropItemToGround(owner.shoes, TRUE) return ..() -/obj/item/bodypart/leg/left/drop_limb(special) //copypasta +/obj/item/bodypart/leg/drop_limb(special) if(owner && !special) if(owner.legcuffed) - owner.legcuffed.forceMove(owner.drop_location()) - owner.legcuffed.dropped(owner) - owner.legcuffed = null - owner.update_worn_legcuffs() + owner.remove_legcuffs() if(owner.shoes) owner.dropItemToGround(owner.shoes, TRUE) return ..() + + /obj/item/bodypart/head/drop_limb(special) if(!special) //Drop all worn head items @@ -308,7 +314,17 @@ pill.forceMove(src) name = "[owner.real_name]'s head" - return ..() + + var/mob/living/carbon/human/old_owner = owner + . = ..() + + old_owner.update_name() + + if(!special) + if(brain?.brainmob) + brainmob = brain.brainmob + brain.brainmob = null + brainmob.set_stat(DEAD) ///Try to attach this bodypart to a mob, while replacing one if it exists, does nothing if it fails. /obj/item/bodypart/proc/replace_limb(mob/living/carbon/limb_owner, special) @@ -322,8 +338,21 @@ if(!.) //If it failed to replace, re-attach their old limb as if nothing happened. old_limb.attach_limb(limb_owner, TRUE) + /// Replace organs gracefully + for(var/obj/item/organ/O as anything in old_limb?.contained_organs) + O.Insert(limb_owner, TRUE) + + /// Transfer cavity items like implants. + for(var/obj/item/I in old_limb?.cavity_items) + I.forceMove(src) + add_cavity_item(I) + ///Attach src to target mob if able. /obj/item/bodypart/proc/attach_limb(mob/living/carbon/new_limb_owner, special) + var/obj/item/bodypart/existing = new_limb_owner.get_bodypart(body_zone, TRUE) + if(existing && !existing.is_stump) + return FALSE + if(SEND_SIGNAL(new_limb_owner, COMSIG_CARBON_ATTACH_LIMB, src, special) & COMPONENT_NO_ATTACH) return FALSE @@ -331,7 +360,17 @@ if(mob_chest && !(mob_chest.acceptable_bodytype & bodytype) && !special) return FALSE - moveToNullspace() + SEND_SIGNAL(src, COMSIG_LIMB_ATTACH, new_limb_owner, special) + + if((!existing || existing.is_stump) && mob_chest) + var/datum/wound/lost_limb/W = locate() in mob_chest.wounds + if(W) + qdel(W) + mob_chest.update_damage() + + if(existing?.is_stump) + qdel(existing) + set_owner(new_limb_owner) new_limb_owner.add_bodypart(src) if(held_index) @@ -347,35 +386,23 @@ new_limb_owner.update_worn_gloves() if(special) //non conventional limb attachment - for(var/datum/surgery/attach_surgery as anything in new_limb_owner.surgeries) //if we had an ongoing surgery to attach a new limb, we stop it. - var/surgery_zone = check_zone(attach_surgery.location) - if(surgery_zone == body_zone) - new_limb_owner.surgeries -= attach_surgery - qdel(attach_surgery) - break + remove_surgeries_from_mob(new_limb_owner) + bodypart_flags &= ~BP_CUT_AWAY - for(var/obj/item/organ/limb_organ in contents) - limb_organ.Insert(new_limb_owner, TRUE) - - for(var/datum/wound/W as anything in wounds) - W.register_to_mob(new_limb_owner) + for(var/obj/item/organ/limb_organ as anything in contained_organs) + limb_organ.Insert(new_limb_owner, special) if(check_bones() & CHECKBONES_BROKEN) apply_bone_break(new_limb_owner) - //Remove any stumps that may be present there, since we have a limb now - if(mob_chest) - for(var/datum/wound/lost_limb/W in mob_chest.wounds) - if(W.zone == src.body_zone) - qdel(W) - break + else if(splint) + new_limb_owner.apply_status_effect(/datum/status_effect/limp) - update_bodypart_damage_state() - if(can_be_disabled) - update_disabled() + update_interaction_speed() - for(var/trait in bodypart_traits) - ADD_TRAIT(owner, trait, bodypart_trait_source) + update_disabled() + + apply_traits() // Bodyparts need to be sorted for leg masking to be done properly. It also will allow for some predictable // behavior within said bodyparts list. We sort it here, as it's the only place we make changes to bodyparts. @@ -393,24 +420,10 @@ . = ..() if(!.) return . - //Transfer some head appearance vars over - if(brain) - if(brainmob) - brainmob.container = null //Reset brainmob head var. - brainmob.forceMove(brain) //Throw mob into brain. - brain.brainmob = brainmob //Set the brain to use the brainmob - brainmob = null //Set head brainmob var to null - brain.Insert(new_head_owner) //Now insert the brain proper - - if(tongue) - tongue = null - if(ears) - ears = null - if(eyes) - eyes = null if(real_name) - new_head_owner.real_name = real_name + new_head_owner.set_real_name(real_name) + real_name = "" //Handle dental implants @@ -443,14 +456,21 @@ /obj/item/bodypart/proc/synchronize_bodytypes(mob/living/carbon/carbon_owner) if(!carbon_owner?.dna?.species) //carbon_owner and dna can somehow be null during garbage collection, at which point we don't care anyway. return + var/old_limb_flags = carbon_owner.dna.species.bodytype var/all_limb_flags for(var/obj/item/bodypart/limb as anything in carbon_owner.bodyparts) - for(var/obj/item/organ/ext_organ as anything in limb.cosmetic_organs) + for(var/obj/item/organ/ext_organ as anything in limb.contained_organs) + if(!ext_organ.visual) + continue all_limb_flags = all_limb_flags | ext_organ.external_bodytypes all_limb_flags = all_limb_flags | limb.bodytype carbon_owner.dna.species.bodytype = all_limb_flags + //Redraw bodytype dependant clothing + if(all_limb_flags != old_limb_flags) + carbon_owner.update_clothing(ALL) + //Regenerates all limbs. Returns amount of limbs regenerated /mob/living/proc/regenerate_limbs(list/excluded_zones = list()) SEND_SIGNAL(src, COMSIG_LIVING_REGENERATE_LIMBS, excluded_zones) diff --git a/code/modules/surgery/bodyparts/germs_bodypart.dm b/code/modules/surgery/bodyparts/germs_bodypart.dm new file mode 100644 index 000000000000..156099a7ce15 --- /dev/null +++ b/code/modules/surgery/bodyparts/germs_bodypart.dm @@ -0,0 +1,132 @@ +//Updating germ levels. Handles organ germ levels and necrosis. +/* +The INFECTION_LEVEL values defined in setup.dm control the time it takes to reach the different +infection levels. Since infection growth is exponential, you can adjust the time it takes to get +from one germ_level to another using the rough formula: + +desired_germ_level = initial_germ_level*e^(desired_time_in_seconds/1000) + +So if I wanted it to take an average of 15 minutes to get from level one (100) to level two +I would set INFECTION_LEVEL_TWO to 100*e^(15*60/1000) = 245. Note that this is the average time, +the actual time is dependent on RNG. + +INFECTION_LEVEL_ONE below this germ level nothing happens, and the infection doesn't grow +INFECTION_LEVEL_TWO above this germ level the infection will start to spread to internal and adjacent organs and rest will be required to recover +INFECTION_LEVEL_THREE above this germ level the player will take additional toxin damage per second, and will die in minutes without + antitox. also, above this germ level you will need to overdose on spaceacillin and get rest to reduce the germ_level. + +Note that amputating the affected organ does in fact remove the infection from the player's body. +*/ +/obj/item/bodypart/proc/update_germs() + if(!IS_ORGANIC_LIMB(src)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs. + germ_level = 0 + return + + if(owner.bodytemperature > TCRYO) //cryo stops germs from moving and doing their bad stuffs + // Syncing germ levels with external wounds + handle_germ_sync() + + if(germ_level && CHEM_EFFECT_MAGNITUDE(owner, CE_ANTIBIOTIC)) + // Handle antibiotics and curing infections + handle_antibiotics() + + if(germ_level) + // Handle the effects of infections + . = handle_germ_effects() + +/// Syncing germ levels with external wounds +/obj/item/bodypart/proc/handle_germ_sync() + if(!length(wounds)) + return + + // Infection can occur even while on anti biotics + for(var/datum/wound/W as anything in wounds) + if((2*owner.germ_level > W.germ_level) && W.infection_check()) + W.germ_level++ + + if(!CHEM_EFFECT_MAGNITUDE(owner, CE_ANTIBIOTIC)) + // Spread germs from wounds to bodypart + for(var/datum/wound/W as anything in wounds) + if (W.germ_level > germ_level || prob(min(W.germ_level, 30))) + germ_level++ + break // max 1 germ per cycle + +/// Handle antibiotics and curing infections +/obj/item/bodypart/proc/handle_antibiotics() + if (germ_level < INFECTION_LEVEL_ONE) + germ_level = 0 //cure instantly + else if (germ_level < INFECTION_LEVEL_TWO) + germ_level -= 5 //at germ_level == 500, this should cure the infection in 5 minutes + else + germ_level -= 3 //at germ_level == 1000, this will cure the infection in 10 minutes + if(owner.body_position == LYING_DOWN) + germ_level -= 2 + germ_level = max(0, germ_level) + +/// Handle the effects of infections +/obj/item/bodypart/proc/handle_germ_effects() + var/antibiotics = CHEM_EFFECT_MAGNITUDE(owner, CE_ANTIBIOTIC) + //** Handle the effects of infections + if(germ_level < INFECTION_LEVEL_TWO) + if(isnull(owner) || owner.stat != DEAD) + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(0.3)) + germ_level-- + + if (germ_level >= INFECTION_LEVEL_ONE/2) + //aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes, when immunity is full. + if(antibiotics < 5 && prob(round(germ_level/6 * 0.01))) + germ_level += 1 + + if(germ_level >= INFECTION_LEVEL_ONE) + var/fever_temperature = (owner.dna.species.heat_level_1 - owner.dna.species.bodytemp_normal - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.dna.species.bodytemp_normal + owner.bodytemperature += clamp((fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, 0, fever_temperature - owner.bodytemperature) + + return + + if(germ_level >= INFECTION_LEVEL_TWO) + //spread the infection to internal organs + var/obj/item/organ/target_organ = null //make internal organs become infected one at a time instead of all at once + for (var/obj/item/organ/I as anything in contained_organs) + if(I.cosmetic_only) + continue + if (I.germ_level > 0 && I.germ_level < min(germ_level, INFECTION_LEVEL_TWO)) //once the organ reaches whatever we can give it, or level two, switch to a different one + if (!target_organ || I.germ_level > target_organ.germ_level) //choose the organ with the highest germ_level + target_organ = I + + if (!target_organ) + //figure out which organs we can spread germs to and pick one at random + var/list/candidate_organs = list() + for (var/obj/item/organ/I in contained_organs) + if(I.cosmetic_only) + continue + if (I.germ_level < germ_level) + candidate_organs |= I + if (length(candidate_organs)) + target_organ = pick(candidate_organs) + + if (target_organ) + target_organ.germ_level++ + + if(istype(src, /obj/item/bodypart/chest)) + for (var/obj/item/bodypart/child as anything in owner.bodyparts) + if(child == src || !IS_ORGANIC_LIMB(child)) + continue + if (child.germ_level < germ_level) + if (child.germ_level < INFECTION_LEVEL_ONE*2 || prob(30)) + child.germ_level++ + else + + var/obj/item/bodypart/chest/parent = owner.get_bodypart(BODY_ZONE_CHEST) + if (parent.germ_level < germ_level && IS_ORGANIC_LIMB(parent)) + if (parent.germ_level < INFECTION_LEVEL_ONE*2 || prob(30)) + parent.germ_level++ + + if(germ_level >= INFECTION_LEVEL_THREE && antibiotics < 30) //overdosing is necessary to stop severe infections + if (!(bodypart_flags & BP_NECROTIC)) + bodypart_flags |= BP_NECROTIC + to_chat(owner, span_warning("You can't feel your [plaintext_zone] anymore...")) + update_disabled() + + germ_level++ + if(owner.adjustToxLoss(1, FALSE)) + return BODYPART_LIFE_UPDATE_HEALTH diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index d801b03a9235..cafb07c6516b 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -3,7 +3,7 @@ desc = "Didn't make sense not to live for fun, your brain gets smart but your head gets dumb." icon = 'icons/mob/human_parts.dmi' icon_state = "default_human_head" - max_damage = 200 + max_damage = 75 body_zone = BODY_ZONE_HEAD body_part = HEAD plaintext_zone = "head" @@ -25,7 +25,15 @@ unarmed_stun_threshold = 4 bodypart_trait_source = HEAD_TRAIT - bodypart_flags = STOCK_BP_FLAGS_HEAD + bodypart_flags = (BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_ARTERY | BP_CAN_BE_DISLOCATED) + + amputation_point = "neck" + encased = "skull" + artery_name = "carotid artery" + cavity_name = "cranial" + joint_name = "jaw" + + minimum_break_damage = 60 //It's really high because of how crippling the effect is. var/mob/living/brain/brainmob //The current occupant. var/obj/item/organ/brain/brain //The brain organ @@ -33,6 +41,9 @@ var/obj/item/organ/ears/ears var/obj/item/organ/tongue/tongue + ///See [mob/living/proc/has_mouth()] + var/can_ingest_reagents = TRUE + var/eyes_icon_file = 'icons/mob/human_face.dmi' ///Render sclera for this species? var/eye_sclera = FALSE @@ -142,44 +153,40 @@ if(!tongue) . += span_info("[real_name]'s tongue has been removed.") - -/obj/item/bodypart/head/can_dismember(obj/item/item) - if(owner.stat < HARD_CRIT) - return FALSE - return ..() - -/obj/item/bodypart/head/drop_organs(mob/user, violent_removal) +/obj/item/bodypart/head/drop_contents(mob/user, violent_removal) var/turf/head_turf = get_turf(src) for(var/obj/item/head_item in src.contents) if(head_item == brain) + var/obj/item/organ/brain/old_brain = brain // I am so scared of order of operations weirdness with brains, so this is how things are being done. + remove_organ(brain) if(user) user.visible_message(span_warning("[user] saws [src] open and pulls out a brain!"), span_notice("You saw [src] open and pull out a brain.")) - if(brainmob) - brainmob.container = null - brainmob.forceMove(brain) - brain.brainmob = brainmob - brainmob = null if(violent_removal && prob(rand(80, 100))) //ghetto surgery can damage the brain. to_chat(user, span_warning("[brain] was damaged in the process!")) - brain.setOrganDamage(brain.maxHealth) - brain.forceMove(head_turf) - brain = null + old_brain.setOrganDamage(old_brain.maxHealth) + old_brain.forceMove(head_turf) update_icon_dropped() else if(istype(head_item, /obj/item/reagent_containers/pill)) for(var/datum/action/item_action/hands_free/activate_pill/pill_action in head_item.actions) qdel(pill_action) - else if(istype(head_item, /obj/item/organ)) - var/obj/item/organ/organ = head_item - if(organ.organ_flags & ORGAN_UNREMOVABLE) - continue - head_item.forceMove(head_turf) + eyes = null ears = null tongue = null return ..() +/obj/item/bodypart/head/apply_bone_break(mob/living/carbon/C) + . = ..() + //add_bodypart_trait(TRAIT_BLURRY_VISION) + C.apply_status_effect(/datum/status_effect/concussion) + +/obj/item/bodypart/head/apply_bone_heal(mob/living/carbon/C) + . = ..() + //remove_bodypart_trait(TRAIT_BLURRY_VISION) + C.remove_status_effect(/datum/status_effect/concussion) + /obj/item/bodypart/head/update_limb(dropping_limb, is_creating) . = ..() @@ -250,6 +257,11 @@ eye_right.color = eyes.eye_color_right . += eye_left . += eye_right + if(eye_sclera) + var/image/sclera = image(eyes_icon_file, "eyes_sclera", -BODY_LAYER) + sclera.color = eyes.sclera_color + . += sclera + else . += image(eyes_icon_file, "eyes_missing_both", -BODY_LAYER, SOUTH) else @@ -295,6 +307,12 @@ return gradient_overlay /obj/item/bodypart/head/talk_into(mob/holder, message, channel, spans, datum/language/language, list/message_mods) + if(isnull(language)) + language = holder?.get_selected_language() + + if(istype(language, /datum/language/visual)) + return + var/mob/headholder = holder if(istype(headholder)) headholder.log_talk(message, LOG_SAY, tag = "beheaded talk") @@ -317,7 +335,7 @@ limb_id = SPECIES_MONKEY bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC should_draw_greyscale = FALSE - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' is_dimorphic = FALSE /obj/item/bodypart/head/alien diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 302911c633a2..1337c4863bd7 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -2,13 +2,13 @@ /mob/living/proc/get_bodypart(zone) return -/mob/living/carbon/get_bodypart(zone) +/mob/living/carbon/get_bodypart(zone, get_stump) RETURN_TYPE(/obj/item/bodypart) if(!zone) zone = BODY_ZONE_CHEST for(var/obj/item/bodypart/bodypart as anything in bodyparts) - if(bodypart.body_zone == zone) + if(bodypart.body_zone == zone && (!bodypart.is_stump || get_stump)) return bodypart @@ -23,14 +23,27 @@ ///Get the bodypart for whatever hand we have active, Only relevant for carbons /mob/proc/get_active_hand() + RETURN_TYPE(/obj/item/bodypart) + return FALSE + +/mob/proc/get_inactive_hand() + RETURN_TYPE(/obj/item/bodypart) return FALSE /mob/living/carbon/get_active_hand() + RETURN_TYPE(/obj/item/bodypart) + var/which_hand = BODY_ZONE_PRECISE_L_HAND if(!(active_hand_index % 2)) which_hand = BODY_ZONE_PRECISE_R_HAND - return get_bodypart(check_zone(which_hand)) + return get_bodypart(deprecise_zone(which_hand)) +/mob/living/carbon/get_inactive_hand() + RETURN_TYPE(/obj/item/bodypart) + var/which_hand = BODY_ZONE_PRECISE_L_HAND + if(active_hand_index % 2) + which_hand = BODY_ZONE_PRECISE_R_HAND + return get_bodypart(deprecise_zone(which_hand)) /mob/proc/has_left_hand(check_disabled = TRUE) return TRUE diff --git a/code/modules/surgery/bodyparts/injuries.dm b/code/modules/surgery/bodyparts/injuries.dm index d077ba6a440c..f3ea04f954f2 100644 --- a/code/modules/surgery/bodyparts/injuries.dm +++ b/code/modules/surgery/bodyparts/injuries.dm @@ -23,7 +23,7 @@ return CHECKTENDON_OK -/obj/item/bodypart/proc/break_bones() +/obj/item/bodypart/proc/break_bones(painful = TRUE) SHOULD_NOT_OVERRIDE(TRUE) if(check_bones() & (CHECKBONES_NONE|CHECKBONES_BROKEN)) @@ -32,14 +32,17 @@ if(owner) owner.visible_message( span_danger("You hear a loud cracking sound coming from \the [owner]."), - span_danger("Something feels like it shattered in your [name]!"), + span_danger("Something feels like it shattered in your [plaintext_zone]!"), span_danger("You hear a sickening crack.") ) jostle_bones() - INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") + if(painful && !(bodypart_flags & BP_NO_PAIN) && !HAS_TRAIT(owner, TRAIT_NO_PAINSHOCK)) + spawn(-1) + owner.pain_emote(1000, TRUE) // We want broken bones to always do the agony scream, so we do it before applying pain. + owner.apply_pain(60, src) - playsound(loc, SFX_BREAK_BONE, 100, 1, -2) + playsound(loc, SFX_BREAK_BONE, 100, FALSE, -2) if(!IS_ORGANIC_LIMB(src)) broken_description = pick("broken","shattered","structural rupture") @@ -47,31 +50,60 @@ broken_description = pick("broken","fracture","hairline fracture") bodypart_flags |= BP_BROKEN_BONES + + update_interaction_speed() + if(owner) apply_bone_break(owner) return TRUE +/// Applies the effect of a broken bone to the owner. /obj/item/bodypart/proc/apply_bone_break(mob/living/carbon/C) SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) SEND_SIGNAL(C, COMSIG_CARBON_BREAK_BONE, src) return TRUE +/obj/item/bodypart/arm/apply_bone_break(mob/living/carbon/C) + . = ..() + if(!.) + return + + if(C.legcuffed && prob(25)) + C.remove_legcuffs(C.drop_location(), silent = TRUE) + /obj/item/bodypart/leg/apply_bone_break(mob/living/carbon/C) . = ..() if(!.) - return TRUE + return C.apply_status_effect(/datum/status_effect/limp) + if(C.handcuffed && prob(25)) + C.remove_handcuffs(C.drop_location(), silent = TRUE) + /obj/item/bodypart/proc/heal_bones() + SHOULD_NOT_OVERRIDE(TRUE) if(!(check_bones() & CHECKBONES_BROKEN)) return FALSE bodypart_flags &= ~BP_BROKEN_BONES + update_interaction_speed() + if(owner) - SEND_SIGNAL(owner, COMSIG_CARBON_HEAL_BONE, src) + apply_bone_heal(owner) + + return TRUE + +/// Removes the effects of a broken bone from the owner. +/obj/item/bodypart/proc/apply_bone_heal(mob/living/carbon/C) + SHOULD_CALL_PARENT(TRUE) + PROTECTED_PROC(TRUE) + + SEND_SIGNAL(C, COMSIG_CARBON_HEAL_BONE, src) + return TRUE /obj/item/bodypart/proc/jostle_bones(force) if(!(bodypart_flags & BP_BROKEN_BONES)) //intact bones stay still @@ -79,22 +111,105 @@ if(brute_dam + force < BODYPART_MINIMUM_DAMAGE_TO_JIGGLEBONES) //no papercuts moving bones return - if(!prob(brute_dam + force)) + if(!length(contained_organs) || !prob(brute_dam + force)) + return + + var/obj/item/organ/O + var/list/organs = shuffle(contained_organs) + while(!O && length(organs)) + O = pick_n_take(organs) + if(O.cosmetic_only) + O = null + if(!O) return - receive_damage(force, breaks_bones = FALSE) //NO RECURSIVE BONE JOSTLING + O.applyOrganDamage(rand(3,5)) + if(owner) - owner.audible_message( - span_warning("A sickening noise comes from [owner]'s [plaintext_zone]!"), - null, - 2, - span_warning("You feel something moving in your [plaintext_zone]!") - ) - INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream") + owner.notify_pain(max_damage * BROKEN_BONE_PAIN_FACTOR, "You feel something moving in your [plaintext_zone]!", TRUE) + +/// Updates the interaction speed modifier of this limb, used by Limping and similar to determine delay. +/obj/item/bodypart/proc/update_interaction_speed() + if(bodypart_flags & BP_BROKEN_BONES) + if(!splint) + interaction_speed_modifier = 7 + else + if(istype(splint, /obj/item/stack)) + var/obj/item/stack/S = splint + interaction_speed_modifier = 2 * (1 + S.splint_slowdown) + + else + interaction_speed_modifier = initial(interaction_speed_modifier) + + SEND_SIGNAL(src, COMSIG_LIMB_UPDATE_INTERACTION_SPEED, interaction_speed_modifier) + return interaction_speed_modifier + +/obj/item/bodypart/arm/update_interaction_speed() + . = ..() + if(. != 1) + owner.apply_status_effect(/datum/status_effect/arm_slowdown) + +/obj/item/bodypart/proc/set_sever_artery(val = TRUE) + if(val) + if(check_artery() & (CHECKARTERY_NONE|CHECKARTERY_SEVERED)) + return FALSE + else + if(check_artery() & (CHECKARTERY_NONE|CHECKARTERY_OK)) + return FALSE + + if(val) + bodypart_flags |= BP_ARTERY_CUT + else + bodypart_flags &= ~BP_ARTERY_CUT + + refresh_bleed_rate() + return TRUE + +/obj/item/bodypart/proc/set_sever_tendon(val = TRUE) + if(val) + if(check_tendon() & (CHECKTENDON_NONE|CHECKTENDON_SEVERED)) + return FALSE + else + if(check_tendon() & (CHECKTENDON_NONE|CHECKTENDON_OK)) + return FALSE + + if(val) + bodypart_flags |= BP_TENDON_CUT + else + bodypart_flags &= ~BP_TENDON_CUT + playsound(loc, pick('sound/effects/wounds/tendon_snap1.ogg', 'sound/effects/wounds/tendon_snap2.ogg', 'sound/effects/wounds/tendon_snap3.ogg'), 50) + + update_disabled() + return TRUE + +/obj/item/bodypart/proc/can_be_dislocated() + if(!(bodypart_flags & BP_CAN_BE_DISLOCATED)) + return FALSE + if(bodypart_flags & BP_DISLOCATED) + return FALSE + return TRUE + +/obj/item/bodypart/proc/set_dislocated(val, painless) + if(val) + if(!can_be_dislocated()) + return FALSE + else + if(can_be_dislocated()) + return FALSE + + if(val) + bodypart_flags |= BP_DISLOCATED + if(!painless) + owner?.apply_pain(max_damage * DISLOCATED_LIMB_PAIN_FACTOR, body_zone, "A surge of pain shoots through your [plaintext_zone].") + else + bodypart_flags &= BP_DISLOCATED + + return TRUE + /obj/item/bodypart/proc/clamp_wounds() for(var/datum/wound/W as anything in wounds) - . |= !W.clamped + . ||= !W.clamped W.clamped = 1 refresh_bleed_rate() @@ -102,39 +217,49 @@ /obj/item/bodypart/proc/remove_clamps() for(var/datum/wound/W as anything in wounds) - . |= W.clamped + . ||= !!W.clamped W.clamped = 0 refresh_bleed_rate() return . /obj/item/bodypart/proc/clamped() + . = TRUE for(var/datum/wound/W as anything in wounds) - if(W.clamped) - return TRUE + if(!W.clamped) + return FALSE /obj/item/bodypart/proc/how_open() - . = 0 + . = SURGERY_CLOSED var/datum/wound/incision = get_incision() if(!incision) return var/smol_threshold = minimum_break_damage * 0.4 var/beeg_threshold = minimum_break_damage * 0.6 + // Clamp it to the largest that the wound can be + beeg_threshold = min(beeg_threshold, incision.damage_list[1]) + if(!(incision.autoheal_cutoff == 0)) //not clean incision smol_threshold *= 1.5 beeg_threshold = max(beeg_threshold, min(beeg_threshold * 1.5, incision.damage_list[1])) //wounds can't achieve bigger + if(incision.damage >= smol_threshold) //smol incision . = SURGERY_OPEN + if(incision.damage >= beeg_threshold) //beeg incision . = SURGERY_RETRACTED + if(encased && (bodypart_flags & BP_BROKEN_BONES)) + . |= SURGERY_DEENCASED /obj/item/bodypart/proc/get_incision(strict) + if(bandage) + return FALSE var/datum/wound/incision for(var/datum/wound/cut/W in wounds) - if(W.bandaged || W.current_stage > W.max_bleeding_stage) // Shit's unusable + if(W.current_stage > W.max_bleeding_stage) // Shit's unusable continue if(strict && !W.is_surgical()) //We don't need dirty ones continue @@ -147,6 +272,7 @@ incision = W else if(W.is_surgical()) //otherwise surgical one takes priority incision = W + return incision /obj/item/bodypart/proc/open_incision() @@ -154,3 +280,14 @@ if(!W) return W.open_wound(min(W.damage * 2, W.damage_list[1] - W.damage)) + +/obj/item/bodypart/proc/jointlock(mob/living/user) + if(!IS_ORGANIC_LIMB(src)) + return + + var/armor = owner.run_armor_check(body_zone, BLUNT, silent = TRUE) + if(armor > 70) + return + + var/max_halloss = round(owner.maxHealth * 0.8 * ((100 - armor) / 100)) //up to 80% of passing out, further reduced by armour + owner.apply_pain(max(30, max_halloss - owner.getPain()), body_zone, "your [plaintext_zone] is in excruciating pain") diff --git a/code/modules/surgery/bodyparts/pain.dm b/code/modules/surgery/bodyparts/pain.dm new file mode 100644 index 000000000000..f3af3be7cdaf --- /dev/null +++ b/code/modules/surgery/bodyparts/pain.dm @@ -0,0 +1,29 @@ +/// Adjusts the pain of a limb, returning the difference. Do not call directly, use carbon.apply_pain(). +/obj/item/bodypart/proc/adjustPain(amount) + if(bodypart_flags & BP_NO_PAIN) + return + + var/last_pain = temporary_pain + temporary_pain = clamp(temporary_pain + amount, 0, max_damage) + return temporary_pain - last_pain + +/// Returns the amount of pain this bodypart is contributing +/obj/item/bodypart/proc/getPain() + if(bodypart_flags & BP_NO_PAIN) + return + + var/lasting_pain = 0 + if(bodypart_flags & BP_BROKEN_BONES) + lasting_pain += max_damage * BROKEN_BONE_PAIN_FACTOR + + if(bodypart_flags & BP_DISLOCATED) + lasting_pain += max_damage * DISLOCATED_LIMB_PAIN_FACTOR + + var/organ_dam = 0 + for(var/obj/item/organ/O as anything in contained_organs) + if(O.cosmetic_only || istype(O, /obj/item/organ/brain)) + continue + + organ_dam += min(O.damage, O.maxHealth) + + return min(wound_pain + temporary_pain + lasting_pain + (0.3 * organ_dam), max_damage) diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 4e11310e8dcb..46d72be2c578 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -1,4 +1,3 @@ - /obj/item/bodypart/chest name = BODY_ZONE_CHEST desc = "It's impolite to stare at a person's chest." @@ -14,28 +13,23 @@ wound_resistance = 10 bodypart_trait_source = CHEST_TRAIT - bodypart_flags = STOCK_BP_FLAGS_CHEST + encased = "ribcage" + artery_name = "aorta" + cavity_name = "thoracic" + joint_name = "neck" + + minimum_break_damage = 35 + + bodypart_flags = (BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_ARTERY | BP_CAN_BE_DISLOCATED) ///The bodytype(s) allowed to attach to this chest. var/acceptable_bodytype = BODYTYPE_HUMANOID - var/obj/item/cavity_item - /obj/item/bodypart/chest/can_dismember(obj/item/item) - if(owner.stat < HARD_CRIT || !get_organs()) + if(owner.getBruteLoss() < owner.maxHealth * 2 || !length(contained_organs)) return FALSE return ..() -/obj/item/bodypart/chest/Destroy() - QDEL_NULL(cavity_item) - return ..() - -/obj/item/bodypart/chest/drop_organs(mob/user, violent_removal) - if(cavity_item) - cavity_item.forceMove(drop_location()) - cavity_item = null - ..() - /obj/item/bodypart/chest/monkey icon = 'icons/mob/animal_parts.dmi' icon_static = 'icons/mob/animal_parts.dmi' @@ -46,7 +40,7 @@ wound_resistance = -10 bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC acceptable_bodytype = BODYTYPE_MONKEY - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' /obj/item/bodypart/chest/alien icon = 'icons/mob/animal_parts.dmi' @@ -77,17 +71,28 @@ desc = "Hey buddy give me a HAND and report this to the github because you shouldn't be seeing this." attack_verb_continuous = list("slaps", "punches") attack_verb_simple = list("slap", "punch") - max_damage = 50 + max_damage = 80 aux_layer = BODYPARTS_HIGH_LAYER - body_damage_coeff = 0.75 can_be_disabled = TRUE unarmed_attack_verb = "punch" /// The classic punch, wonderfully classic and completely random - unarmed_damage_low = 1 - unarmed_damage_high = 10 + unarmed_damage_low = 5 + unarmed_damage_high = 7 unarmed_stun_threshold = 10 body_zone = BODY_ZONE_L_ARM - bodypart_flags = STOCK_BP_FLAGS_ARMS + bodypart_flags = (BP_IS_GRABBY_LIMB | BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_TENDON | BP_HAS_ARTERY | BP_CAN_BE_DISLOCATED) + + artery_name = "basilic vein" + tendon_name = "palmaris longus tendon" + + minimum_break_damage = 30 + + var/fingerprints = "" + +/obj/item/bodypart/arm/update_limb(dropping_limb, is_creating) + . = ..() + if(is_creating && owner?.has_dna()) + fingerprints = md5(owner.dna.unique_identity) /obj/item/bodypart/arm/left name = "left arm" @@ -107,6 +112,8 @@ px_x = -6 px_y = 0 bodypart_trait_source = LEFT_ARM_TRAIT + amputation_point = "left shoulder" + joint_name = "left elbow" /obj/item/bodypart/arm/left/set_owner(new_owner) @@ -156,7 +163,7 @@ wound_resistance = -10 px_x = -5 px_y = -3 - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' unarmed_damage_low = 1 /// monkey punches must be really weak, considering they bite people instead and their bites are weak as hell. unarmed_damage_high = 2 unarmed_stun_threshold = 3 @@ -174,7 +181,6 @@ max_damage = 100 should_draw_greyscale = FALSE - /obj/item/bodypart/arm/right name = "right arm" desc = "Over 87% of humans are right handed. That figure is much lower \ @@ -190,6 +196,8 @@ px_y = 0 bodypart_trait_source = RIGHT_ARM_TRAIT can_be_disabled = TRUE + amputation_point = "right shoulder" + joint_name = "right elbow" /obj/item/bodypart/arm/right/set_owner(new_owner) . = ..() @@ -238,7 +246,7 @@ wound_resistance = -10 px_x = 5 px_y = -3 - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' unarmed_damage_low = 1 unarmed_damage_high = 2 unarmed_stun_threshold = 3 @@ -262,17 +270,32 @@ desc = "This item shouldn't exist. Talk about breaking a leg. Badum-Tss!" attack_verb_continuous = list("kicks", "stomps") attack_verb_simple = list("kick", "stomp") - max_damage = 50 - body_damage_coeff = 0.75 + max_damage = 80 can_be_disabled = TRUE unarmed_attack_effect = ATTACK_EFFECT_KICK body_zone = BODY_ZONE_L_LEG unarmed_attack_verb = "kick" // The lovely kick, typically only accessable by attacking a grouded foe. 1.5 times better than the punch. - unarmed_damage_low = 2 - unarmed_damage_high = 15 + unarmed_damage_low = 5 + unarmed_damage_high = 12 unarmed_stun_threshold = 10 - bodypart_flags = STOCK_BP_FLAGS_LEGS + bodypart_flags = (BP_IS_MOVEMENT_LIMB | BP_HAS_BLOOD | BP_HAS_BONES | BP_HAS_TENDON | BP_HAS_ARTERY| BP_CAN_BE_DISLOCATED) + + artery_name = "femoral artery" + tendon_name = "cruciate ligament" + + minimum_break_damage = 30 + + /// Used by the bloodysoles component to make blood tracks + var/blood_print = BLOOD_PRINT_HUMAN + /// Can these legs be digitigrade? See digitigrade.dm + var/can_be_digitigrade = FALSE + ///Set limb_id to this when in "digi mode". MUST BE UNIQUE LIKE ALL LIMB IDS + var/digitigrade_id + /// Used solely by digitigrade limbs to remember what their old limb ID was. + var/old_limb_id + /// Used by the footstep element. + var/barefoot_step_type = FOOTSTEP_MOB_BAREFOOT /obj/item/bodypart/leg/left name = "left leg" @@ -286,6 +309,9 @@ px_y = 12 can_be_disabled = TRUE bodypart_trait_source = LEFT_LEG_TRAIT + amputation_point = "left hip" + joint_name = "left knee" + /obj/item/bodypart/leg/left/set_owner(new_owner) . = ..() @@ -332,7 +358,7 @@ bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC wound_resistance = -10 px_y = 4 - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' unarmed_damage_low = 2 unarmed_damage_high = 3 unarmed_stun_threshold = 4 @@ -364,6 +390,8 @@ px_y = 12 bodypart_trait_source = RIGHT_LEG_TRAIT can_be_disabled = TRUE + amputation_point = "right hip" + joint_name = "right knee" /obj/item/bodypart/leg/right/set_owner(new_owner) . = ..() @@ -410,7 +438,7 @@ bodytype = BODYTYPE_MONKEY | BODYTYPE_ORGANIC wound_resistance = -10 px_y = 4 - dmg_overlay_type = SPECIES_MONKEY + icon_dmg_overlay = 'icons/mob/species/monkey/damage.dmi' unarmed_damage_low = 2 unarmed_damage_high = 3 unarmed_stun_threshold = 4 diff --git a/code/modules/surgery/bodyparts/rendering.dm b/code/modules/surgery/bodyparts/rendering.dm index d772fb2cfd48..ed322bfb5f1a 100644 --- a/code/modules/surgery/bodyparts/rendering.dm +++ b/code/modules/surgery/bodyparts/rendering.dm @@ -6,10 +6,8 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) SHOULD_CALL_PARENT(TRUE) if(HAS_TRAIT(owner, TRAIT_HUSK) && IS_ORGANIC_LIMB(src)) - dmg_overlay_type = "" //no damage overlay shown when husked is_husked = TRUE else - dmg_overlay_type = initial(dmg_overlay_type) is_husked = FALSE if(variable_color) @@ -56,6 +54,9 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) SHOULD_CALL_PARENT(TRUE) cut_overlays() + if(is_stump) + return + dir = SOUTH var/key = json_encode(generate_icon_key()) var/list/standing = GLOB.limb_overlays_cache[key] @@ -114,6 +115,7 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) current_icon = new_icon if(draw_color && (body_zone != BODY_ZONE_L_LEG && body_zone != BODY_ZONE_R_LEG)) current_icon.Blend(draw_color, ICON_MULTIPLY) + if(aux_layer) var/icon/new_aux_icon = icon(chosen_icon, chosen_aux_state) current_aux_icon = new_aux_icon @@ -147,11 +149,11 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) if(dropped) - if(dmg_overlay_type) + if(icon_dmg_overlay && !is_husked) if(brutestate) - . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) + . += image(icon_dmg_overlay, "[body_zone]_[brutestate]0", -DAMAGE_LAYER, image_dir) if(burnstate) - . += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) + . += image(icon_dmg_overlay, "[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir) @@ -170,8 +172,8 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) if(!is_husked) //Draw external organs like horns and frills - for(var/obj/item/organ/visual_organ in cosmetic_organs) - if(!dropped && !visual_organ.can_draw_on_bodypart(owner)) + for(var/obj/item/organ/visual_organ as anything in contained_organs) + if(!visual_organ.visual || (!dropped && !visual_organ.can_draw_on_bodypart(owner))) continue //Some externals have multiple layers for background, foreground and between . += visual_organ.get_overlays(limb_gender, image_dir) @@ -201,7 +203,9 @@ GLOBAL_LIST_INIT(limb_overlays_cache, list()) if(should_draw_greyscale && draw_color) . += "-[draw_color]" - for(var/obj/item/organ/O as anything in cosmetic_organs) + for(var/obj/item/organ/O as anything in contained_organs) + if(!O.visual) + continue . += "-[json_encode(O.build_cache_key())]" for(var/datum/appearance_modifier/mod as anything in appearance_mods) @@ -281,14 +285,15 @@ GLOBAL_LIST_EMPTY(masked_leg_icons_cache) if(draw_color) new_leg_icon_lower.Blend(draw_color, ICON_MULTIPLY) + for(var/datum/appearance_modifier/mod as anything in appearance_mods) + mod.BlendOnto(new_leg_icon) + mod.BlendOnto(new_leg_icon_lower) + GLOB.masked_leg_icons_cache[icon_cache_key] = list(new_leg_icon, new_leg_icon_lower) new_leg_icon = GLOB.masked_leg_icons_cache[icon_cache_key][1] new_leg_icon_lower = GLOB.masked_leg_icons_cache[icon_cache_key][2] - for(var/datum/appearance_modifier/mod as anything in appearance_mods) - mod.BlendOnto(new_leg_icon) - mod.BlendOnto(new_leg_icon_lower) //this could break layering in oddjob cases, but i'm sure it will work fine most of the time... right? var/mutable_appearance/new_leg_appearance = new(limb_overlay) diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm index c6bcec35e047..ff1d0b195e06 100644 --- a/code/modules/surgery/bodyparts/robot_bodyparts.dm +++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm @@ -23,13 +23,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -52,13 +50,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -81,13 +77,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -110,13 +104,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -138,13 +130,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -154,6 +144,8 @@ medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG + dismemberable = FALSE + var/wired = FALSE var/obj/item/stock_parts/cell/cell = null @@ -227,7 +219,7 @@ else . += span_info("It has a couple spots that still need to be wired.") -/obj/item/bodypart/chest/robot/drop_organs(mob/user, violent_removal) +/obj/item/bodypart/chest/robot/drop_contents(mob/user, violent_removal) if(wired) new /obj/item/stack/cable_coil(drop_location(), 1) wired = FALSE @@ -249,13 +241,11 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE bodytype = BODYTYPE_HUMANOID | BODYTYPE_ROBOTIC - change_exempt_flags = BP_BLOCK_CHANGE_SPECIES - dmg_overlay_type = "robotic" + icon_dmg_overlay = 'icons/mob/species/misc/robotic_damage.dmi' - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + armor = list(BLUNT = 5, PUNCTURE = 5, SLASH = 0, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 5, ACID = 10) - brute_reduction = 5 - burn_reduction = 4 + bodypart_flags = (parent_type::bodypart_flags | BP_NO_PAIN) & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) light_brute_msg = ROBOTIC_LIGHT_BRUTE_MSG medium_brute_msg = ROBOTIC_MEDIUM_BRUTE_MSG @@ -330,7 +320,7 @@ return TRUE -/obj/item/bodypart/head/robot/drop_organs(mob/user, violent_removal) +/obj/item/bodypart/head/robot/drop_contents(mob/user, violent_removal) if(flash1) flash1.forceMove(user.loc) flash1 = null @@ -346,32 +336,32 @@ name = "surplus prosthetic left arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + icon_static = 'icons/mob/augmentation/surplus_augments.dmi' + limb_id = "surplus" max_damage = 20 /obj/item/bodypart/arm/right/robot/surplus name = "surplus prosthetic right arm" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + icon_static = 'icons/mob/augmentation/surplus_augments.dmi' + limb_id = "surplus" max_damage = 20 /obj/item/bodypart/leg/left/robot/surplus name = "surplus prosthetic left leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + icon_static = 'icons/mob/augmentation/surplus_augments.dmi' + limb_id = "surplus" max_damage = 20 /obj/item/bodypart/leg/right/robot/surplus name = "surplus prosthetic right leg" desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing." icon = 'icons/mob/augmentation/surplus_augments.dmi' - brute_reduction = 0 - burn_reduction = 0 + icon_static = 'icons/mob/augmentation/surplus_augments.dmi' + limb_id = "surplus" max_damage = 20 diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm index 767ee35cb7d7..a03982e0efad 100644 --- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm @@ -2,7 +2,7 @@ icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL is_dimorphic = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' @@ -18,7 +18,7 @@ icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL is_dimorphic = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null /obj/item/bodypart/chest/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -30,7 +30,7 @@ /obj/item/bodypart/arm/left/ethereal icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL - dmg_overlay_type = null + icon_dmg_overlay = null attack_type = BURN //burn bish unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' @@ -46,7 +46,7 @@ /obj/item/bodypart/arm/right/ethereal icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL - dmg_overlay_type = null + icon_dmg_overlay = null attack_type = BURN // bish buzz unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' @@ -63,7 +63,7 @@ /obj/item/bodypart/leg/left/ethereal icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL - dmg_overlay_type = null + icon_dmg_overlay = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' @@ -78,7 +78,7 @@ /obj/item/bodypart/leg/right/ethereal icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL - dmg_overlay_type = null + icon_dmg_overlay = null attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' diff --git a/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm new file mode 100644 index 000000000000..7bac1dfff335 --- /dev/null +++ b/code/modules/surgery/bodyparts/species_parts/ipc_bodyparts.dm @@ -0,0 +1,78 @@ +/obj/item/bodypart/head/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + can_ingest_reagents = FALSE + +/obj/item/bodypart/chest/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + is_dimorphic = FALSE + +/obj/item/bodypart/arm/left/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + +/obj/item/bodypart/arm/right/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + +/obj/item/bodypart/leg/left/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + +/obj/item/bodypart/leg/right/robot/ipc + icon = 'icons/mob/species/ipc/bodyparts.dmi' + icon_static = 'icons/mob/species/ipc/bodyparts.dmi' + limb_id = SPECIES_IPC + + +// Lizard variation +/obj/item/bodypart/head/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/chest/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + is_dimorphic = TRUE + +/obj/item/bodypart/arm/left/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/arm/right/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + +/obj/item/bodypart/leg/left/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + can_be_digitigrade = TRUE + digitigrade_id = "digifurry" + +// This needs to be new() because bodyparts dont immediately initialize, and this needs to render right in prefs +/obj/item/bodypart/leg/left/robot/ipc/saurian/New(loc, ...) + . = ..() + set_digitigrade(TRUE) + +/obj/item/bodypart/leg/right/robot/ipc/saurian + icon = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + icon_greyscale = 'icons/mob/species/ipc/saurian/saurian_bodyparts.dmi' + should_draw_greyscale = TRUE + can_be_digitigrade = TRUE + digitigrade_id = "digifurry" + +// This needs to be new() because bodyparts dont immediately initialize, and this needs to render right in prefs +/obj/item/bodypart/leg/right/robot/ipc/saurian/New(loc, ...) + . = ..() + set_digitigrade(TRUE) diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm index cd416acbbb7f..3d35da3b6df3 100644 --- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm @@ -34,51 +34,13 @@ /obj/item/bodypart/leg/left/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD + can_be_digitigrade = TRUE + digitigrade_id = "digitigrade" + barefoot_step_type = FOOTSTEP_MOB_CLAW /obj/item/bodypart/leg/right/lizard icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' limb_id = SPECIES_LIZARD - -/obj/item/bodypart/leg/left/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' - limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE - -/obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) - . = ..() - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - var/uniform_compatible = FALSE - var/suit_compatible = FALSE - if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility - uniform_compatible = TRUE - if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability - suit_compatible = TRUE - - if((uniform_compatible && suit_compatible) || (suit_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible - limb_id = BODYPART_ID_DIGITIGRADE - - else - limb_id = "lizard" - -/obj/item/bodypart/leg/right/digitigrade - icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi' - limb_id = BODYPART_ID_DIGITIGRADE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE - -/obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE) - . = ..() - if(ishuman(owner)) - var/mob/living/carbon/human/human_owner = owner - var/uniform_compatible = FALSE - var/suit_compatible = FALSE - if(!(human_owner.w_uniform) || (human_owner.w_uniform.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON))) //Checks uniform compatibility - uniform_compatible = TRUE - if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & (CLOTHING_DIGITIGRADE_VARIATION|CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON)) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability - suit_compatible = TRUE - - if((uniform_compatible && suit_compatible) || (suit_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible - limb_id = BODYPART_ID_DIGITIGRADE - - else - limb_id = "lizard" + can_be_digitigrade = TRUE + digitigrade_id = "digitigrade" + barefoot_step_type = FOOTSTEP_MOB_CLAW diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index 49f8f9279157..f314de247566 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -33,106 +33,106 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD /obj/item/bodypart/chest/abductor limb_id = SPECIES_ABDUCTOR is_dimorphic = FALSE should_draw_greyscale = FALSE - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD /obj/item/bodypart/arm/left/abductor limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD /obj/item/bodypart/arm/right/abductor limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE bodypart_traits = list(TRAIT_CHUNKYFINGERS) - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD /obj/item/bodypart/leg/left/abductor limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD /obj/item/bodypart/leg/right/abductor limb_id = SPECIES_ABDUCTOR should_draw_greyscale = FALSE - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~BP_HAS_BLOOD + bodypart_flags = parent_type::bodypart_flags & ~BP_HAS_BLOOD ///JELLY /obj/item/bodypart/head/jelly limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/chest/jelly limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/arm/left/jelly limb_id = SPECIES_JELLYPERSON - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/arm/right/jelly limb_id = SPECIES_JELLYPERSON - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/leg/left/jelly limb_id = SPECIES_JELLYPERSON - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/leg/right/jelly limb_id = SPECIES_JELLYPERSON - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) ///SLIME /obj/item/bodypart/head/slime limb_id = SPECIES_SLIMEPERSON is_dimorphic = FALSE - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/chest/slime limb_id = SPECIES_SLIMEPERSON is_dimorphic = TRUE - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/arm/left/slime limb_id = SPECIES_SLIMEPERSON - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/arm/right/slime limb_id = SPECIES_SLIMEPERSON - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/leg/left/slime limb_id = SPECIES_SLIMEPERSON - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) /obj/item/bodypart/leg/right/slime limb_id = SPECIES_SLIMEPERSON - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) ///LUMINESCENT /obj/item/bodypart/head/luminescent @@ -276,45 +276,45 @@ limb_id = SPECIES_SKELETON is_dimorphic = FALSE should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/chest/skeleton limb_id = SPECIES_SKELETON is_dimorphic = FALSE should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/arm/left/skeleton limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/arm/right/skeleton limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/leg/left/skeleton limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/leg/right/skeleton limb_id = SPECIES_SKELETON should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) ///MUSHROOM /obj/item/bodypart/head/mushroom @@ -348,342 +348,3 @@ unarmed_damage_low = 9 unarmed_damage_high = 21 unarmed_stun_threshold = 14 - -///GOLEMS (i hate xenobio SO FUCKING MUCH) (from 2022: Yeah I fucking feel your pain brother) -/obj/item/bodypart/head/golem - limb_id = SPECIES_GOLEM - is_dimorphic = FALSE - dmg_overlay_type = null - - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/obj/item/bodypart/chest/golem - limb_id = SPECIES_GOLEM - is_dimorphic = TRUE - dmg_overlay_type = null - - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/obj/item/bodypart/arm/left/golem - limb_id = SPECIES_GOLEM - dmg_overlay_type = null - bodypart_traits = list(TRAIT_CHUNKYFINGERS) - unarmed_damage_low = 5 // I'd like to take the moment that maintaining all of these random ass golem speciese is hell and oranges was right - unarmed_damage_high = 14 - unarmed_stun_threshold = 11 - - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/obj/item/bodypart/arm/right/golem - limb_id = SPECIES_GOLEM - dmg_overlay_type = null - bodypart_traits = list(TRAIT_CHUNKYFINGERS) - unarmed_damage_low = 5 - unarmed_damage_high = 14 - unarmed_stun_threshold = 11 - - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/obj/item/bodypart/leg/left/golem - limb_id = SPECIES_GOLEM - dmg_overlay_type = null - unarmed_damage_low = 7 - unarmed_damage_high = 21 - unarmed_stun_threshold = 11 - - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/obj/item/bodypart/leg/right/golem - limb_id = SPECIES_GOLEM - dmg_overlay_type = null - unarmed_damage_low = 7 - unarmed_damage_high = 21 - unarmed_stun_threshold = 11 - - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD|BP_HAS_BONES|BP_HAS_TENDON|BP_HAS_ARTERY) - -/// -/obj/item/bodypart/head/golem/cult - limb_id = SPECIES_GOLEM_CULT - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/cult - limb_id = SPECIES_GOLEM_CULT - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/cult - limb_id = SPECIES_GOLEM_CULT - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/right/golem/cult - limb_id = SPECIES_GOLEM_CULT - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/left/golem/cult - limb_id = SPECIES_GOLEM_CULT - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/right/golem/cult - limb_id = SPECIES_GOLEM_CULT - should_draw_greyscale = FALSE - -/// -/obj/item/bodypart/head/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - should_draw_greyscale = FALSE - unarmed_damage_low = 4 - unarmed_stun_threshold = 7 - unarmed_damage_high = 8 - -/obj/item/bodypart/arm/right/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - should_draw_greyscale = FALSE - unarmed_damage_low = 4 - unarmed_stun_threshold = 7 - unarmed_damage_high = 8 - -/obj/item/bodypart/leg/left/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - should_draw_greyscale = FALSE - unarmed_damage_low = 6 - unarmed_stun_threshold = 7 - unarmed_damage_high = 12 - -/obj/item/bodypart/leg/right/golem/cloth - limb_id = SPECIES_GOLEM_CLOTH - should_draw_greyscale = FALSE - unarmed_damage_low = 6 - unarmed_stun_threshold = 7 - unarmed_damage_high = 12 - -/// -/obj/item/bodypart/head/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - is_dimorphic = TRUE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - should_draw_greyscale = FALSE - unarmed_attack_verb = "whip" - unarmed_attack_sound = 'sound/weapons/whip.ogg' - unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' - unarmed_damage_low = 4 - unarmed_stun_threshold = 7 - unarmed_damage_high = 8 - -/obj/item/bodypart/arm/right/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - should_draw_greyscale = FALSE - unarmed_attack_verb = "whip" - unarmed_attack_sound = 'sound/weapons/whip.ogg' - unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' - unarmed_damage_low = 4 - unarmed_stun_threshold = 7 - unarmed_damage_high = 8 - -/obj/item/bodypart/leg/left/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - should_draw_greyscale = FALSE - unarmed_attack_sound = 'sound/weapons/whip.ogg' - unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' - unarmed_damage_low = 6 - unarmed_stun_threshold = 7 - unarmed_damage_high = 12 - -/obj/item/bodypart/leg/right/golem/cardboard - limb_id = SPECIES_GOLEM_CARDBOARD - should_draw_greyscale = FALSE - unarmed_attack_sound = 'sound/weapons/whip.ogg' - unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' - unarmed_damage_low = 6 - unarmed_stun_threshold = 7 - unarmed_damage_high = 12 - -/// -/obj/item/bodypart/head/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/right/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/left/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/right/golem/durathread - limb_id = SPECIES_GOLEM_DURATHREAD - should_draw_greyscale = FALSE - -/// -/obj/item/bodypart/head/golem/bone - limb_id = SPECIES_GOLEM_BONE - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/bone - limb_id = SPECIES_GOLEM_BONE - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/bone - limb_id = SPECIES_GOLEM_BONE - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/right/golem/bone - limb_id = SPECIES_GOLEM_BONE - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/left/golem/bone - limb_id = SPECIES_GOLEM_BONE - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/right/golem/bone - limb_id = SPECIES_GOLEM_BONE - should_draw_greyscale = FALSE - -/// -/obj/item/bodypart/head/golem/snow - limb_id = SPECIES_GOLEM_SNOW - is_dimorphic = FALSE - should_draw_greyscale = FALSE - -/obj/item/bodypart/chest/golem/snow - limb_id = SPECIES_GOLEM_SNOW - is_dimorphic = TRUE //WHO MADE SNOW BREASTS? - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/left/golem/snow - limb_id = SPECIES_GOLEM_SNOW - should_draw_greyscale = FALSE - -/obj/item/bodypart/arm/right/golem/snow - limb_id = SPECIES_GOLEM_SNOW - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/left/golem/snow - limb_id = SPECIES_GOLEM_SNOW - should_draw_greyscale = FALSE - -/obj/item/bodypart/leg/right/golem/snow - limb_id = SPECIES_GOLEM_SNOW - should_draw_greyscale = FALSE - - -/obj/item/bodypart/arm/left/golem/uranium - attack_type = BURN - unarmed_attack_verb = "burn" - unarmed_attack_sound = 'sound/weapons/sear.ogg' - unarmed_damage_low = 1 - unarmed_damage_high = 10 - unarmed_stun_threshold = 9 - -/obj/item/bodypart/arm/right/golem/uranium - attack_type = BURN - unarmed_attack_verb = "burn" - unarmed_attack_sound = 'sound/weapons/sear.ogg' - unarmed_damage_low = 1 - unarmed_damage_high = 10 - unarmed_stun_threshold = 9 - -/obj/item/bodypart/leg/left/golem/uranium - attack_type = BURN - unarmed_attack_sound = 'sound/weapons/sear.ogg' - unarmed_damage_low = 2 - unarmed_damage_high = 15 - unarmed_stun_threshold = 9 - -/obj/item/bodypart/leg/right/golem/uranium - attack_type = BURN - unarmed_attack_sound = 'sound/weapons/sear.ogg' - unarmed_damage_low = 2 - unarmed_damage_high = 15 - unarmed_stun_threshold = 9 - -/obj/item/bodypart/arm/left/golem/plasteel - unarmed_attack_verb = "smash" - unarmed_attack_effect = ATTACK_EFFECT_SMASH - unarmed_attack_sound = 'sound/effects/meteorimpact.ogg' //hits pretty hard - unarmed_damage_low = 12 - unarmed_damage_high = 21 - unarmed_stun_threshold = 18 - -/obj/item/bodypart/arm/right/golem/plasteel - unarmed_attack_verb = "smash" - unarmed_attack_effect = ATTACK_EFFECT_SMASH - unarmed_attack_sound = 'sound/effects/meteorimpact.ogg' - unarmed_damage_low = 12 - unarmed_damage_high = 21 - unarmed_stun_threshold = 18 - - -/obj/item/bodypart/leg/left/golem/plasteel - unarmed_attack_effect = ATTACK_EFFECT_SMASH - unarmed_attack_sound = 'sound/effects/meteorimpact.ogg' - unarmed_damage_low = 18 - unarmed_damage_high = 32 - unarmed_stun_threshold = 18 - -/obj/item/bodypart/leg/right/golem/plasteel - unarmed_attack_effect = ATTACK_EFFECT_SMASH - unarmed_attack_sound = 'sound/effects/meteorimpact.ogg' - unarmed_damage_low = 18 - unarmed_damage_high = 32 - unarmed_stun_threshold = 18 - -/obj/item/bodypart/arm/left/golem/bananium - unarmed_attack_verb = "honk" - unarmed_attack_sound = 'sound/items/airhorn2.ogg' - unarmed_damage_low = 0 - unarmed_damage_high = 1 - unarmed_stun_threshold = 2 //Harmless and can't stun - -/obj/item/bodypart/arm/right/golem/bananium - unarmed_attack_verb = "honk" - unarmed_attack_sound = 'sound/items/airhorn2.ogg' - unarmed_damage_low = 0 - unarmed_damage_high = 1 - unarmed_stun_threshold = 2 - -/obj/item/bodypart/leg/right/golem/bananium - unarmed_attack_verb = "honk" - unarmed_attack_sound = 'sound/items/airhorn2.ogg' - unarmed_damage_low = 0 - unarmed_damage_high = 1 - unarmed_stun_threshold = 2 - -/obj/item/bodypart/leg/left/golem/bananium - unarmed_attack_verb = "honk" - unarmed_attack_sound = 'sound/items/airhorn2.ogg' - unarmed_damage_low = 0 - unarmed_damage_high = 1 - unarmed_stun_threshold = 2 diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 68393d9c96f8..b57b8bd853a9 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -5,9 +5,9 @@ limb_id = SPECIES_PLASMAMAN is_dimorphic = FALSE should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_HEAD & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/chest/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -16,9 +16,9 @@ limb_id = SPECIES_PLASMAMAN is_dimorphic = FALSE should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_CHEST & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/arm/left/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -26,9 +26,9 @@ icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/arm/right/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -36,9 +36,9 @@ icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE - dmg_overlay_type = null + icon_dmg_overlay = null - bodypart_flags = STOCK_BP_FLAGS_ARMS & ~(BP_HAS_BLOOD) + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/leg/left/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -46,8 +46,8 @@ icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE - dmg_overlay_type = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD) + icon_dmg_overlay = null + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) /obj/item/bodypart/leg/right/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -55,5 +55,5 @@ icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi' limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE - dmg_overlay_type = null - bodypart_flags = STOCK_BP_FLAGS_LEGS & ~(BP_HAS_BLOOD) + icon_dmg_overlay = null + bodypart_flags = parent_type::bodypart_flags & ~(BP_HAS_BLOOD) diff --git a/code/modules/surgery/bodyparts/species_parts/skrell_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/skrell_bodyparts.dm deleted file mode 100644 index 14206d4ee823..000000000000 --- a/code/modules/surgery/bodyparts/species_parts/skrell_bodyparts.dm +++ /dev/null @@ -1,34 +0,0 @@ -/obj/item/bodypart/head/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - is_dimorphic = FALSE - should_draw_greyscale = TRUE - bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_SKRELL - - eyes_icon_file = 'icons/mob/species/skrell/eyes.dmi' - -/obj/item/bodypart/chest/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - should_draw_greyscale = TRUE - is_dimorphic = TRUE - -/obj/item/bodypart/arm/left/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - should_draw_greyscale = TRUE - -/obj/item/bodypart/arm/right/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - should_draw_greyscale = TRUE - -/obj/item/bodypart/leg/left/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - should_draw_greyscale = TRUE - -/obj/item/bodypart/leg/right/skrell - icon_greyscale = 'icons/mob/species/skrell/bodyparts.dmi' - limb_id = SPECIES_SKRELL - should_draw_greyscale = TRUE diff --git a/code/modules/surgery/bodyparts/species_parts/teshari_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/teshari_bodyparts.dm index ec3ae1766635..7509a2a17449 100644 --- a/code/modules/surgery/bodyparts/species_parts/teshari_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/teshari_bodyparts.dm @@ -2,6 +2,8 @@ icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE is_dimorphic = FALSE @@ -13,6 +15,8 @@ icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE is_dimorphic = FALSE @@ -23,6 +27,8 @@ icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE bodytype = BODYTYPE_TESHARI | BODYTYPE_ORGANIC @@ -36,6 +42,8 @@ icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE bodytype = BODYTYPE_TESHARI | BODYTYPE_ORGANIC @@ -44,18 +52,68 @@ unarmed_attack_sound = 'sound/weapons/slash.ogg' unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' unarmed_damage_high = 6 + /obj/item/bodypart/leg/right/teshari icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE bodytype = BODYTYPE_TESHARI | BODYTYPE_ORGANIC + barefoot_step_type = FOOTSTEP_MOB_CLAW /obj/item/bodypart/leg/left/teshari icon_greyscale = 'icons/mob/species/teshari/bodyparts.dmi' icon_husk = 'icons/mob/species/teshari/bodyparts.dmi' husk_type = "teshari" + icon_dmg_overlay = 'icons/mob/species/teshari/damage.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' limb_id = SPECIES_TESHARI should_draw_greyscale = TRUE bodytype = BODYTYPE_TESHARI | BODYTYPE_ORGANIC + barefoot_step_type = FOOTSTEP_MOB_CLAW + +/////////////////////////////////////////////////////////// +/obj/item/bodypart/head/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC + +/obj/item/bodypart/chest/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC + +/obj/item/bodypart/arm/right/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC + +/obj/item/bodypart/arm/left/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC + +/obj/item/bodypart/leg/right/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC + +/obj/item/bodypart/leg/left/robot/surplus/teshari + icon = 'icons/mob/species/teshari/augments.dmi' + icon_static = 'icons/mob/species/teshari/augments.dmi' + icon_bloodycover = 'icons/mob/species/teshari/blood_mask.dmi' + limb_id = "robotesh" + bodytype = BODYTYPE_TESHARI | BODYTYPE_ROBOTIC diff --git a/code/modules/surgery/bodyparts/species_parts/vox_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/vox_bodyparts.dm index 0e648482a2c9..99a009c60b70 100644 --- a/code/modules/surgery/bodyparts/species_parts/vox_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/vox_bodyparts.dm @@ -38,6 +38,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_VOX_LEGS icon_greyscale = 'icons/mob/species/vox/bodyparts.dmi' limb_id = "vox_digitigrade" + blood_print = BLOOD_PRINT_CLAWS + barefoot_step_type = FOOTSTEP_MOB_CLAW /obj/item/bodypart/leg/left/vox/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() @@ -50,7 +52,7 @@ if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & CLOTHING_VOX_VARIATION) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability suit_compatible = TRUE - if((uniform_compatible && suit_compatible) || (suit_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible + if((uniform_compatible && suit_compatible) || (suit_compatible && (human_owner.obscured_slots & HIDEJUMPSUIT))) //If the uniform is hidden, it doesnt matter if its compatible limb_id = "vox_digitigrade" else @@ -61,6 +63,8 @@ bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_VOX_LEGS icon_greyscale = 'icons/mob/species/vox/bodyparts.dmi' limb_id = "vox_digitigrade" + blood_print = BLOOD_PRINT_CLAWS + barefoot_step_type = FOOTSTEP_MOB_CLAW /obj/item/bodypart/leg/right/vox/update_limb(dropping_limb = FALSE, is_creating = FALSE) . = ..() @@ -73,7 +77,7 @@ if((!human_owner.wear_suit) || (human_owner.wear_suit.supports_variations_flags & CLOTHING_VOX_VARIATION) || !(human_owner.wear_suit.body_parts_covered & LEGS)) //Checks suit compatability suit_compatible = TRUE - if((uniform_compatible && suit_compatible) || (suit_compatible && human_owner.wear_suit?.flags_inv & HIDEJUMPSUIT)) //If the uniform is hidden, it doesnt matter if its compatible + if((uniform_compatible && suit_compatible) || (suit_compatible && (human_owner.obscured_slots & HIDEJUMPSUIT))) //If the uniform is hidden, it doesnt matter if its compatible limb_id = "vox_digitigrade" else diff --git a/code/modules/surgery/bodyparts/stump.dm b/code/modules/surgery/bodyparts/stump.dm new file mode 100644 index 000000000000..dbf21249548f --- /dev/null +++ b/code/modules/surgery/bodyparts/stump.dm @@ -0,0 +1,44 @@ +/obj/item/bodypart/proc/create_stump() + var/path + switch(body_zone) + if(BODY_ZONE_HEAD) + path = /obj/item/bodypart/head + if(BODY_ZONE_R_LEG) + path = /obj/item/bodypart/leg/right + if(BODY_ZONE_L_LEG) + path = /obj/item/bodypart/leg/left + if(BODY_ZONE_R_ARM) + path = /obj/item/bodypart/arm/right + if(BODY_ZONE_L_ARM) + path = /obj/item/bodypart/arm/left + else + CRASH("Insane stump!") + + + var/obj/item/bodypart/stump = new path() + stump.can_be_disabled = TRUE + ADD_TRAIT(stump, TRAIT_PARALYSIS, STUMP_TRAIT) + stump.update_disabled() + stump.bodypart_flags = IS_ORGANIC_LIMB(src) ? BP_HAS_BLOOD|BP_HAS_ARTERY : NONE + if(bodypart_flags & BP_NO_PAIN) + stump.bodypart_flags |= BP_NO_PAIN + stump.is_stump = TRUE + + stump.held_index = held_index + stump.bleed_overlay_icon = null + stump.max_damage = max_damage + stump.icon = null + stump.icon_static = null + stump.icon_greyscale = null + stump.icon_state = null + stump.body_zone = body_zone + stump.bodytype = bodytype + stump.body_part = body_part + stump.amputation_point = amputation_point + + + stump.name = "stump of \a [name]" + stump.plaintext_zone = "stump of \a [plaintext_zone]" + stump.artery_name = "mangled [artery_name]" + return stump + diff --git a/code/modules/surgery/bodyparts/wounds/_wounds.dm b/code/modules/surgery/bodyparts/wounds/_wounds.dm index 8c4d09746001..5efed5214ce0 100644 --- a/code/modules/surgery/bodyparts/wounds/_wounds.dm +++ b/code/modules/surgery/bodyparts/wounds/_wounds.dm @@ -5,9 +5,8 @@ /datum/wound ///The bodypart this wound is on var/obj/item/bodypart/parent - ///The mob this wound belongs to - var/mob/living/carbon/mob_parent + var/pain_factor = 0 ///Number representing the current stage var/current_stage = 0 ///Description of the wound. @@ -21,8 +20,6 @@ ///Amount of damage the current wound type requires(less means we need to apply the next healing stage) var/min_damage = 0 - ///Is bandaged? - var/bandaged = 0 ///Is clamped? var/clamped = 0 ///Is salved? @@ -52,6 +49,7 @@ // helper lists var/tmp/list/desc_list = list() var/tmp/list/damage_list = list() + var/tmp/list/embedded_objects //lazy /datum/wound/New(damage, obj/item/bodypart/BP = null) @@ -72,33 +70,15 @@ if(istype(BP)) parent = BP - if(BP.current_gauze) - bandage() - RegisterSignal(parent, COMSIG_BODYPART_GAUZED, PROC_REF(on_gauze)) - RegisterSignal(parent, COMSIG_BODYPART_GAUZE_DESTROYED, PROC_REF(on_ungauze)) - if(parent.owner) - register_to_mob(parent.owner) /datum/wound/Destroy() - if(mob_parent) - unregister_from_mob() if(parent) LAZYREMOVE(parent.wounds, src) parent = null + LAZYCLEARLIST(embedded_objects) return ..() -/datum/wound/proc/register_to_mob(mob/living/carbon/C) - if(mob_parent) - unregister_from_mob() - mob_parent = C - SEND_SIGNAL(mob_parent, COMSIG_CARBON_GAIN_WOUND, src, parent) - -/datum/wound/proc/unregister_from_mob() - SEND_SIGNAL(mob_parent, COMSIG_CARBON_LOSE_WOUND, src, parent) - mob_parent = null - - ///Returns 1 if there's a next stage, 0 otherwise /datum/wound/proc/init_stage(initial_damage) current_stage = stages.len @@ -114,13 +94,26 @@ return src.damage / src.amount /datum/wound/proc/can_autoheal() - return (wound_damage() <= autoheal_cutoff) ? 1 : is_treated() + if(LAZYLEN(embedded_objects)) + return FALSE + + switch(wound_type) //OOP is a lie. Should bruises, cuts, and punctures all share a common parent? Probably. Fuck you! + if (WOUND_BRUISE, WOUND_CUT, WOUND_PIERCE) + if(parent.bandage) + return wound_damage() <= initial(autoheal_cutoff) + if(WOUND_BURN) + . = salved + + . ||= (wound_damage() <= autoheal_cutoff) ///Checks whether the wound has been appropriately treated /datum/wound/proc/is_treated() + if(LAZYLEN(embedded_objects)) + return FALSE + switch(wound_type) if (WOUND_BRUISE, WOUND_CUT, WOUND_PIERCE) - return bandaged + return parent.bandage if (WOUND_BURN) return salved @@ -131,7 +124,6 @@ if (other.wound_type != src.wound_type) return 0 if (!(other.can_autoheal()) != !(src.can_autoheal())) return 0 if (other.is_surgical() != src.is_surgical()) return 0 - if (!(other.bandaged) != !(src.bandaged)) return 0 if (!(other.clamped) != !(src.clamped)) return 0 if (!(other.salved) != !(src.salved)) return 0 if (!(other.disinfected) != !(src.disinfected)) return 0 @@ -139,6 +131,10 @@ return 1 /datum/wound/proc/merge_wound(datum/wound/other) + for(var/obj/item/I as anything in other.embedded_objects) + RegisterSignal(I, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING), PROC_REF(item_gone)) + LAZYDISTINCTADD(embedded_objects, I) + src.damage += other.damage src.amount += other.amount src.bleed_timer += other.bleed_timer @@ -171,12 +167,6 @@ return 0 -/datum/wound/proc/bandage() - if(bandaged) - return FALSE - bandaged = 1 - return TRUE - /datum/wound/proc/salve() if(salved) return FALSE @@ -200,11 +190,13 @@ // heal the given amount of damage, and if the given amount of damage was more // than what needed to be healed, return how much heal was left /datum/wound/proc/heal_damage(amount) + /* UNREPAIRABLE DAMAGE if(parent) if (wound_type == WOUND_BURN && parent.burn_ratio > 1) return amount //We don't want to heal wounds on irreparable organs. else if(parent.brute_ratio > 1) return amount + */ var/healed_damage = min(src.damage, amount) amount -= healed_damage @@ -219,7 +211,7 @@ return amount // opens the wound again -/datum/wound/proc/open_wound(damage) +/datum/wound/proc/open_wound(damage, update_damage = TRUE) src.damage += damage bleed_timer += damage @@ -229,6 +221,9 @@ src.desc = desc_list[current_stage] src.min_damage = damage_list[current_stage] + if(update_damage) + parent.update_damage() + /datum/wound/proc/close_wound() return @@ -249,22 +244,20 @@ return 0 return 1 +/// Returns if the wound is currently bleeding. /datum/wound/proc/bleeding() - if(bandaged || clamped) + if(clamped) return FALSE + if(length(embedded_objects)) + for(var/obj/item/thing in embedded_objects) + if(thing.w_class > WEIGHT_CLASS_SMALL) + return FALSE + // If the bleed_timer is greater than zero, OR the wound_damage() is greater than the damage required to bleed constantly. return ((bleed_timer > 0 || wound_damage() > bleed_threshold) && current_stage <= max_bleeding_stage) /datum/wound/proc/is_surgical() return 0 -/datum/wound/proc/on_gauze(datum/source) - SIGNAL_HANDLER - bandage() - -/datum/wound/proc/on_ungauze(datum/source) - SIGNAL_HANDLER - bandaged = FALSE - /datum/wound/proc/get_examine_desc() var/this_wound_desc = desc if (wound_type == WOUND_BURN && salved) @@ -275,7 +268,7 @@ this_wound_desc = "bleeding [this_wound_desc]" else this_wound_desc = "bleeding [this_wound_desc]" - else if(bandaged) + else if(parent.bandage) this_wound_desc = "bandaged [this_wound_desc]" if(germ_level > 600) @@ -286,6 +279,12 @@ return this_wound_desc + +/datum/wound/proc/item_gone(datum/source) + SIGNAL_HANDLER + LAZYREMOVE(embedded_objects, source) + UnregisterSignal(source, list(COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING)) + /*Note that the MINIMUM damage before a wound can be applied should correspond to //the damage amount for the stage with the same name as the wound. //e.g. /datum/wound/cut/deep should only be applied for 15 damage and up, @@ -335,13 +334,22 @@ return /datum/wound/burn/moderate return null //no wound -/obj/item/bodypart/proc/attempt_dismemberment(brute as num, burn as num, sharpness) - if((sharpness & SHARP_EDGED) && brute >= max_damage * DROPLIMB_THRESHOLD_EDGE) +/obj/item/bodypart/proc/attempt_dismemberment(brute as num, burn as num, sharpness, force_dismember) + if(force_dismember) + if(burn) + return dismember(DROPLIMB_BURN) + if(brute) + return dismember(sharpness & SHARP_EDGED ? DROPLIMB_EDGE : DROPLIMB_BLUNT) + + if(sharpness & SHARP_POINTY) + brute *= 0.5 + + if((sharpness & SHARP_EDGED) && (brute) >= max_damage * DROPLIMB_THRESHOLD_EDGE) if(prob(brute)) return dismember(DROPLIMB_EDGE, FALSE, FALSE) else if(burn >= max_damage * DROPLIMB_THRESHOLD_DESTROY) - if(prob(burn)) + if(prob(burn/3)) return dismember(DROPLIMB_BURN, FALSE, FALSE) else if(brute >= max_damage * DROPLIMB_THRESHOLD_DESTROY) @@ -349,5 +357,35 @@ return dismember(DROPLIMB_BLUNT, FALSE, FALSE) else if(brute >= max_damage * DROPLIMB_THRESHOLD_TEAROFF) - if(prob(brute)) + if(prob(brute/3)) return dismember(DROPLIMB_EDGE, FALSE, FALSE) + +/obj/item/bodypart/proc/violent_dismember_messages(droptype, clean) + var/gore + var/gore_sound + switch(droptype) + if(DROPLIMB_EDGE) + if(!clean) + gore_sound = "[!IS_ORGANIC_LIMB(src) ? "tortured metal" : "ripping tendons and flesh"]" + return list( + "\The [owner]'s [src.plaintext_zone] flies off in an arc!", + "Your [src.plaintext_zone] goes flying off!", + "You hear a terrible sound of [gore_sound]." + ) + + if(DROPLIMB_BURN) + gore = "[!IS_ORGANIC_LIMB(src) ? "": " of burning flesh"]" + return list( + "\The [owner]'s [src.plaintext_zone] flashes away into ashes!", + "Your [src.plaintext_zone] flashes away into ashes!", + "You hear a crackling sound[gore]." + ) + + if(DROPLIMB_BLUNT) + gore = "[!IS_ORGANIC_LIMB(src) ? "": " in shower of gore"]" + gore_sound = "[!IS_ORGANIC_LIMB(src) ? "rending sound of tortured metal" : "sickening splatter of gore"]" + return list( + "\The [owner]'s [src.plaintext_zone] explodes[gore]!", + "Your [src.plaintext_zone] explodes[gore]!", + "You hear the [gore_sound]." + ) diff --git a/code/modules/surgery/bodyparts/wounds/bruises.dm b/code/modules/surgery/bodyparts/wounds/bruises.dm index d08d468b6f33..096667d6944e 100644 --- a/code/modules/surgery/bodyparts/wounds/bruises.dm +++ b/code/modules/surgery/bodyparts/wounds/bruises.dm @@ -1,5 +1,6 @@ /** BRUISES **/ /datum/wound/bruise + pain_factor = 1.25 stages = list( "monumental bruise" = 80, "huge bruise" = 50, diff --git a/code/modules/surgery/bodyparts/wounds/burns.dm b/code/modules/surgery/bodyparts/wounds/burns.dm index 92a12646a842..30b853abfcb1 100644 --- a/code/modules/surgery/bodyparts/wounds/burns.dm +++ b/code/modules/surgery/bodyparts/wounds/burns.dm @@ -1,10 +1,11 @@ /** BURNS **/ /datum/wound/burn + pain_factor = 1.875 wound_type = WOUND_BURN max_bleeding_stage = 0 /datum/wound/burn/bleeding() - return 0 + return FALSE /datum/wound/burn/moderate stages = list( diff --git a/code/modules/surgery/bodyparts/wounds/create_wound.dm b/code/modules/surgery/bodyparts/wounds/create_wound.dm index ffcc3bbdc58f..ba7a25dcf748 100644 --- a/code/modules/surgery/bodyparts/wounds/create_wound.dm +++ b/code/modules/surgery/bodyparts/wounds/create_wound.dm @@ -2,10 +2,24 @@ if(damage <= 0) return - var/static/list/interal_wounds_check = list(WOUND_CUT, WOUND_PIERCE, WOUND_BRUISE) + var/static/list/internal_wounds_check = list(WOUND_CUT, WOUND_PIERCE) var/static/list/fluid_wounds_check = list(WOUND_BURN, WOUND_LASER) + + //moved these before the open_wound check so that having many small wounds for example doesn't somehow protect you from taking internal damage (because of the return) + //Brute damage can possibly trigger an internal wound, too. + var/local_damage = brute_dam + burn_dam + damage + if (!surgical && (wound_type in internal_wounds_check) && damage > 15 && local_damage > 30) + + var/internal_damage + if(prob(damage) && set_sever_artery(TRUE)) + internal_damage = TRUE + if(prob(Ceil(damage/4)) && set_sever_tendon(TRUE)) + internal_damage = TRUE + if(internal_damage) + owner?.apply_pain(50, body_zone, "You feel something rip in your [plaintext_zone]!") + //Burn damage can cause fluid loss due to blistering and cook-off if(owner && !surgical && (damage > FLUIDLOSS_BURN_REQUIRED) && (bodypart_flags & BP_HAS_BLOOD) && (wound_type in fluid_wounds_check)) var/fluid_loss_severity @@ -14,8 +28,8 @@ fluid_loss_severity = FLUIDLOSS_BURN_WIDE if (WOUND_LASER) fluid_loss_severity = FLUIDLOSS_BURN_CONCENTRATED - var/fluid_loss = (damage/(owner.maxHealth)) * BLOOD_VOLUME_NORMAL * fluid_loss_severity - owner.bleed(fluid_loss) + var/fluid_loss = (damage / (owner.maxHealth)) * BLOOD_VOLUME_NORMAL * fluid_loss_severity + owner.adjustBloodVolume(-fluid_loss) //Check whether we can widen an existing wound if(!surgical && LAZYLEN(wounds) && prob(max(50+(real_wound_count-1)*10,90))) @@ -23,24 +37,26 @@ //we need to make sure that the wound we are going to worsen is compatible with the type of damage... var/list/compatible_wounds = list() for (var/datum/wound/W as anything in wounds) - if (W.can_worsen(type, damage)) + if (W.can_worsen(wound_type, damage)) compatible_wounds += W if(length(compatible_wounds)) var/datum/wound/W = pick(compatible_wounds) - W.open_wound(damage) + W.open_wound(damage, update_damage) if(prob(25)) if(!IS_ORGANIC_LIMB(src)) owner.visible_message( - span_danger("The damage to \the [owner]'s [name] worsens."),\ - span_danger("The damage to your [name] worsens."),\ - span_danger("You hear the screech of abused metal.") + span_warning("The damage to \the [owner]'s [plaintext_zone] worsens."), + span_warning("The damage to your [name] worsens."), + span_hear("You hear the screech of abused metal."), + COMBAT_MESSAGE_RANGE, ) else owner.visible_message( - span_danger("The wound on \the [owner]'s [name] widens with a nasty ripping noise."),\ - span_danger("The wound on your [name] widens with a nasty ripping noise."),\ - span_danger("You hear a nasty ripping noise, as if flesh is being torn apart.") + span_warning("The wound on \the [owner]'s [plaintext_zone] widens with a nasty ripping noise."), + span_warning("The wound on your [plaintext_zone] widens with a nasty ripping noise."), + span_hear("You hear a nasty ripping noise, as if flesh is being torn apart."), + COMBAT_MESSAGE_RANGE, ) return W diff --git a/code/modules/surgery/bodyparts/wounds/cuts.dm b/code/modules/surgery/bodyparts/wounds/cuts.dm index fc7774d73a1c..b81691bc3879 100644 --- a/code/modules/surgery/bodyparts/wounds/cuts.dm +++ b/code/modules/surgery/bodyparts/wounds/cuts.dm @@ -1,13 +1,9 @@ /** CUTS **/ /datum/wound/cut + pain_factor = 1.25 bleed_threshold = 5 wound_type = WOUND_CUT -/datum/wound/cut/bandage() - ..() - if(!autoheal_cutoff) - autoheal_cutoff = initial(autoheal_cutoff) - /datum/wound/cut/is_surgical() return autoheal_cutoff == 0 @@ -18,6 +14,8 @@ if(damage > min_damage) heal_damage(damage-min_damage) + parent.update_damage() + /datum/wound/cut/small // link wound descriptions to amounts of damage // Minor cuts have max_bleeding_stage set to the stage that bears the wound type's name. diff --git a/code/modules/surgery/bodyparts/wounds/lost_limb.dm b/code/modules/surgery/bodyparts/wounds/lost_limb.dm index e3b874acf3b4..1c46e61b6e95 100644 --- a/code/modules/surgery/bodyparts/wounds/lost_limb.dm +++ b/code/modules/surgery/bodyparts/wounds/lost_limb.dm @@ -1,13 +1,10 @@ /** BODYPART LOSS **/ /datum/wound/lost_limb - var/zone = null - var/plaintext_zone = "" -/datum/wound/lost_limb/New(obj/item/bodypart/lost_limb, losstype, clean, obj/item/bodypart/affected_limb) - zone = lost_limb.body_zone - plaintext_zone = lost_limb.plaintext_zone +/datum/wound/lost_limb/New(obj/item/bodypart/lost_limb, losstype, clean) var/damage_amt = lost_limb.max_damage - if(clean) damage_amt /= 2 + if(clean) + damage_amt /= 2 switch(losstype) if(DROPLIMB_EDGE, DROPLIMB_BLUNT) @@ -33,20 +30,7 @@ "scarred stump" = 0 ) - ..(damage_amt, affected_limb) + ..(damage_amt) /datum/wound/lost_limb/can_merge(datum/wound/other) return 0 //cannot be merged - -/datum/wound/lost_limb/get_examine_desc() - var/this_wound_desc = desc - - if(bleeding()) - if(wound_damage() > bleed_threshold) - this_wound_desc = "bleeding [this_wound_desc]" - else - this_wound_desc = "bleeding [this_wound_desc]" - else if(bandaged) - this_wound_desc = "bandaged [this_wound_desc]" - - return "[this_wound_desc] where a [plaintext_zone] should be" diff --git a/code/modules/surgery/bodyparts/wounds/punctures.dm b/code/modules/surgery/bodyparts/wounds/punctures.dm index 4982ea87b2fd..7c924b133505 100644 --- a/code/modules/surgery/bodyparts/wounds/punctures.dm +++ b/code/modules/surgery/bodyparts/wounds/punctures.dm @@ -1,5 +1,6 @@ /** PUNCTURES **/ /datum/wound/puncture + pain_factor = 1.25 bleed_threshold = 10 wound_type = WOUND_PIERCE diff --git a/code/modules/surgery/bone_surgery.dm b/code/modules/surgery/bone_surgery.dm deleted file mode 100644 index d0ebf7298dad..000000000000 --- a/code/modules/surgery/bone_surgery.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/surgery/repair_bone - name = "Repair bone fracture" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/repair_bone, - /datum/surgery_step/set_bone, - /datum/surgery_step/close) - target_mobtypes = list(/mob/living/carbon/human) - 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/repair_bone/can_start(mob/living/user, mob/living/carbon/target) - if(!istype(target)) - return FALSE - if(..()) - var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) - return(targeted_bodypart.check_bones() & CHECKBONES_BROKEN) - -/datum/surgery_step/set_bone - name = "set bone (bonesetter)" - implements = list( - /obj/item/bonesetter = 100, - TOOL_CROWBAR = 30, - ) - time = 40 - -/datum/surgery_step/set_bone/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(surgery.operated_bodypart.check_bones() & CHECKBONES_BROKEN) - display_results(user, target, span_notice("You begin to reset the bone in [target]'s [parse_zone(user.zone_selected)]..."), - span_notice("[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)] with [tool]."), - span_notice("[user] begins to reset the bone in [target]'s [parse_zone(user.zone_selected)].")) - display_pain(target, "Your [parse_zone(user.zone_selected)] aches with pain!") - else - user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) - - -/datum/surgery_step/set_bone/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(surgery.operated_bodypart.check_bones() & CHECKBONES_BROKEN) - display_results(user, target, span_notice("You successfully reset the bone in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully reset the bone in [target]'s [parse_zone(target_zone)] with [tool]!"), - span_notice("[user] successfully reset the bone in [target]'s [parse_zone(target_zone)]!")) - log_combat(user, target, "reset the bone in", addition="COMBAT_MODE: [uppertext(user.combat_mode)]") - surgery.operated_bodypart.heal_bones() - - else if(surgery.operated_bodypart.check_bones() & CHECKBONES_OK) - display_results(user, target, - span_notice("You successfully set the bone in the WRONG place in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully set the bone in the WRONG place in [target]'s [parse_zone(target_zone)] with [tool]!"), - span_notice("[user] successfully set the bone in the WRONG place in [target]'s [parse_zone(target_zone)]!") - ) - log_combat(usr, target, "incorrectly set a bone in ", addition="COMBAT_MODE: [uppertext(user.combat_mode)]") - surgery.operated_bodypart.break_bones() - else - to_chat(user, span_notice("There is no bone there!")) - - return ..() - -/datum/surgery_step/set_bone/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - ..() - if(istype(tool, /obj/item/stack)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - if(surgery.operated_bodypart.check_bones() & CHECKBONES_OK) - surgery.operated_bodypart.break_bones() - surgery.operated_bodypart.receive_damage(5) - -/datum/surgery_step/repair_bone - name = "repair bone (gel/tape)" - implements = list( - /obj/item/stack/medical/bone_gel = 100, - /obj/item/stack/sticky_tape/surgical = 100, - /obj/item/stack/sticky_tape/super = 50, - /obj/item/stack/sticky_tape = 30 - ) - time = 4 SECONDS - -/datum/surgery_step/repair_bone/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to repair the fracture in [target]'s [parse_zone(user.zone_selected)]..."), - span_notice("[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)] with [tool]."), - span_notice("[user] begins to repair the fracture in [target]'s [parse_zone(user.zone_selected)].")) - display_pain(target, "Your [parse_zone(user.zone_selected)] aches with pain!") - - return ..() - - -/datum/surgery_step/repair_bone/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(istype(tool, /obj/item/stack)) - var/obj/item/stack/used_stack = tool - used_stack.use(1) - display_results(user, target, span_notice("You successfully repair the fracture in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)] with [tool]!"), - span_notice("[user] successfully repairs the fracture in [target]'s [parse_zone(target_zone)]!")) - log_combat(user, target, "repaired a broken bone in", addition="COMBAT_MODE: [uppertext(user.combat_mode)]") - - return ..() - - diff --git a/code/modules/surgery/brain_surgery.dm b/code/modules/surgery/brain_surgery.dm deleted file mode 100644 index b38eff7cc90e..000000000000 --- a/code/modules/surgery/brain_surgery.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/surgery/brain_surgery - name = "Brain surgery" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/fix_brain, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_HEAD) - requires_bodypart_type = 0 - -/datum/surgery_step/fix_brain - name = "fix brain" - implements = list( - TOOL_HEMOSTAT = 85, - TOOL_SCREWDRIVER = 35, - /obj/item/pen = 15) //don't worry, pouring some alcohol on their open brain will get that chance to 100 - repeatable = TRUE - time = 100 //long and complicated - preop_sound = 'sound/surgery/hemostat1.ogg' - success_sound = 'sound/surgery/hemostat1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery/brain_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/fix_brain/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to fix [target]'s brain..."), - span_notice("[user] begins to fix [target]'s brain."), - span_notice("[user] begins to perform surgery on [target]'s brain.")) - display_pain(target, "Your head pounds with unimaginable pain!") - -/datum/surgery_step/fix_brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You succeed in fixing [target]'s brain."), - span_notice("[user] successfully fixes [target]'s brain!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "The pain in your head receeds, thinking becomes a bit easier!") - if(target.mind?.has_antag_datum(/datum/antagonist/brainwashed)) - target.mind.remove_antag_datum(/datum/antagonist/brainwashed) - target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 50) //we set damage in this case in order to clear the "failing" flag - target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) - if(target.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) - to_chat(user, "[target]'s brain looks like it could be fixed further.") - return ..() - -/datum/surgery_step/fix_brain/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorganslot(ORGAN_SLOT_BRAIN)) - display_results(user, target, span_warning("You screw up, causing more damage!"), - span_warning("[user] screws up, causing brain damage!"), - span_notice("[user] completes the surgery on [target]'s brain.")) - display_pain(target, "Your head throbs with horrible pain; thinking hurts!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) - target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_LOBOTOMY) - else - user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), span_warning("You suddenly notice that the brain you were working on is not there anymore.")) - return FALSE diff --git a/code/modules/surgery/cavity_implant.dm b/code/modules/surgery/cavity_implant.dm deleted file mode 100644 index 0749e012f9af..000000000000 --- a/code/modules/surgery/cavity_implant.dm +++ /dev/null @@ -1,67 +0,0 @@ -/datum/surgery/cavity_implant - name = "Cavity implant" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/handle_cavity, - /datum/surgery_step/close) - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - - -//handle cavity -/datum/surgery_step/handle_cavity - name = "implant item" - accept_hand = 1 - implements = list(/obj/item = 100) - repeatable = TRUE - time = 32 - preop_sound = 'sound/surgery/organ1.ogg' - success_sound = 'sound/surgery/organ2.ogg' - var/obj/item/item_for_cavity - -/datum/surgery_step/handle_cavity/tool_check(mob/user, obj/item/tool) - if(tool.tool_behaviour == TOOL_CAUTERY || istype(tool, /obj/item/gun/energy/laser)) - return FALSE - return !tool.get_temperature() - -/datum/surgery_step/handle_cavity/preop(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/bodypart/chest/target_chest = target.get_bodypart(BODY_ZONE_CHEST) - item_for_cavity = target_chest.cavity_item - if(tool) - display_results(user, target, span_notice("You begin to insert [tool] into [target]'s [target_zone]..."), - span_notice("[user] begins to insert [tool] into [target]'s [target_zone]."), - span_notice("[user] begins to insert [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")) - display_pain(target, "You can feel something being inserted into your [target_zone], it hurts like hell!") - else - display_results(user, target, span_notice("You check for items in [target]'s [target_zone]..."), - span_notice("[user] checks for items in [target]'s [target_zone]."), - span_notice("[user] looks for something in [target]'s [target_zone].")) - -/datum/surgery_step/handle_cavity/success(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery = FALSE) - var/obj/item/bodypart/chest/target_chest = target.get_bodypart(BODY_ZONE_CHEST) - if(tool) - if(item_for_cavity || tool.w_class > WEIGHT_CLASS_NORMAL || HAS_TRAIT(tool, TRAIT_NODROP) || istype(tool, /obj/item/organ)) - to_chat(user, span_warning("You can't seem to fit [tool] in [target]'s [target_zone]!")) - return FALSE - else - display_results(user, target, span_notice("You stuff [tool] into [target]'s [target_zone]."), - span_notice("[user] stuffs [tool] into [target]'s [target_zone]!"), - span_notice("[user] stuffs [tool.w_class > WEIGHT_CLASS_SMALL ? tool : "something"] into [target]'s [target_zone].")) - user.transferItemToLoc(tool, target, TRUE) - target_chest.cavity_item = tool - return ..() - else - if(item_for_cavity) - display_results(user, target, span_notice("You pull [item_for_cavity] out of [target]'s [target_zone]."), - span_notice("[user] pulls [item_for_cavity] out of [target]'s [target_zone]!"), - span_notice("[user] pulls [item_for_cavity.w_class > WEIGHT_CLASS_SMALL ? item_for_cavity : "something"] out of [target]'s [target_zone].")) - display_pain(target, "Something is pulled out of your [target_zone]! It hurts like hell!") - user.put_in_hands(item_for_cavity) - target_chest.cavity_item = null - return ..() - else - to_chat(user, span_warning("You don't find anything in [target]'s [target_zone].")) - return FALSE diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm deleted file mode 100644 index 3c73208944fc..000000000000 --- a/code/modules/surgery/core_removal.dm +++ /dev/null @@ -1,47 +0,0 @@ -/datum/surgery/core_removal - name = "Core removal" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/extract_core) - target_mobtypes = list(/mob/living/simple_animal/slime) - 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) - lying_required = FALSE - ignore_clothes = TRUE - requires_bodypart = FALSE - -/datum/surgery/core_removal/can_start(mob/user, mob/living/target) - if(target.stat == DEAD) - return TRUE - return FALSE - -//extract brain -/datum/surgery_step/extract_core - name = "extract core" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 100) - time = 16 - -/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to extract a core from [target]..."), - span_notice("[user] begins to extract a core from [target]."), - span_notice("[user] begins to extract a core from [target].")) - -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/simple_animal/slime/target_slime = target - if(target_slime.cores > 0) - target_slime.cores-- - display_results(user, target, span_notice("You successfully extract a core from [target]. [target_slime.cores] core\s remaining."), - span_notice("[user] successfully extracts a core from [target]!"), - span_notice("[user] successfully extracts a core from [target]!")) - - new target_slime.coretype(target_slime.loc) - - if(target_slime.cores <= 0) - target_slime.icon_state = "[target_slime.colour] baby slime dead-nocore" - return ..() - else - return FALSE - else - to_chat(user, span_warning("There aren't any cores left in [target]!")) - return ..() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm deleted file mode 100644 index f86663945e3d..000000000000 --- a/code/modules/surgery/coronary_bypass.dm +++ /dev/null @@ -1,105 +0,0 @@ -/datum/surgery/coronary_bypass - name = "Coronary Bypass" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise_heart, - /datum/surgery_step/coronary_bypass, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - organ_to_manipulate = ORGAN_SLOT_HEART - -/datum/surgery/coronary_bypass/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) - if(target_heart) - if(target_heart.damage > 60 && !target_heart.operated) - return TRUE - return FALSE - - -//an incision but with greater bleed, and a 90% base success chance -/datum/surgery_step/incise_heart - name = "incise heart" - implements = list( - TOOL_SCALPEL = 90, - /obj/item/melee/energy/sword = 45, - /obj/item/knife = 45, - /obj/item/shard = 25) - time = 16 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/scalpel2.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/incise_heart/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to make an incision in [target]'s heart..."), - span_notice("[user] begins to make an incision in [target]'s heart."), - span_notice("[user] begins to make an incision in [target]'s heart.")) - display_pain(target, "You feel a horrendous pain in your heart, it's almost enough to make you pass out!") - -/datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - if (!(NOBLOOD in target_human.dna.species.species_traits)) - display_results(user, target, span_notice("Blood pools around the incision in [target_human]'s heart."), - span_notice("Blood pools around the incision in [target_human]'s heart."), - "") - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(10) - target_human.adjustBruteLoss(10) - return ..() - -/datum/surgery_step/incise_heart/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results(user, target, span_warning("You screw up, cutting too deeply into the heart!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest!")) - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(10) - target_human.adjustOrganLoss(ORGAN_SLOT_HEART, 10) - target_human.adjustBruteLoss(10) - -//grafts a coronary bypass onto the individual's heart, success chance is 90% base again -/datum/surgery_step/coronary_bypass - name = "graft coronary bypass" - implements = list( - TOOL_HEMOSTAT = 90, - TOOL_WIRECUTTER = 35, - /obj/item/stack/package_wrap = 15, - /obj/item/stack/cable_coil = 5) - time = 90 - preop_sound = 'sound/surgery/hemostat1.ogg' - success_sound = 'sound/surgery/hemostat1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/coronary_bypass/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to graft a bypass onto [target]'s heart..."), - span_notice("[user] begins to graft something onto [target]'s heart!"), - span_notice("[user] begins to graft something onto [target]'s heart!")) - display_pain(target, "The pain in your chest is unbearable! You can barely take it anymore!") - -/datum/surgery_step/coronary_bypass/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - target.setOrganLoss(ORGAN_SLOT_HEART, 60) - var/obj/item/organ/heart/target_heart = target.getorganslot(ORGAN_SLOT_HEART) - if(target_heart) //slightly worrying if we lost our heart mid-operation, but that's life - target_heart.operated = TRUE - display_results(user, target, span_notice("You successfully graft a bypass onto [target]'s heart."), - span_notice("[user] finishes grafting something onto [target]'s heart."), - span_notice("[user] finishes grafting something onto [target]'s heart.")) - display_pain(target, "The pain in your chest throbs, but your heart feels better than ever!") - return ..() - -/datum/surgery_step/coronary_bypass/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results(user, target, span_warning("You screw up in attaching the graft, and it tears off, tearing part of the heart!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest profusely!"), - span_warning("[user] screws up, causing blood to spurt out of [target_human]'s chest profusely!")) - display_pain(target, "Your chest burns; you feel like you're going insane!") - target_human.adjustOrganLoss(ORGAN_SLOT_HEART, 20) - var/obj/item/bodypart/target_bodypart = target_human.get_bodypart(target_zone) - target_bodypart.adjustBleedStacks(30) - return FALSE diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm deleted file mode 100644 index d99206917e5a..000000000000 --- a/code/modules/surgery/dental_implant.dm +++ /dev/null @@ -1,48 +0,0 @@ -/datum/surgery/dental_implant - name = "Dental implant" - steps = list( - /datum/surgery_step/drill, - /datum/surgery_step/insert_pill) - possible_locs = list(BODY_ZONE_PRECISE_MOUTH) - -/datum/surgery_step/insert_pill - name = "insert pill" - implements = list(/obj/item/reagent_containers/pill = 100) - time = 16 - -/datum/surgery_step/insert_pill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to wedge [tool] in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to wedge \the [tool] in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to wedge something in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "Something's being jammed into your [parse_zone(target_zone)]!") - -/datum/surgery_step/insert_pill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/reagent_containers/pill/tool, datum/surgery/surgery, default_display_results = FALSE) - if(!istype(tool)) - return FALSE - - user.transferItemToLoc(tool, target, TRUE) - - var/datum/action/item_action/hands_free/activate_pill/pill_action = new(tool) - pill_action.name = "Activate [tool.name]" - pill_action.build_all_button_icons() - pill_action.target = tool - pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it - - display_results(user, target, span_notice("You wedge [tool] into [target]'s [parse_zone(target_zone)]."), - span_notice("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] wedges something into [target]'s [parse_zone(target_zone)]!")) - return ..() - -/datum/action/item_action/hands_free/activate_pill - name = "Activate Pill" - -/datum/action/item_action/hands_free/activate_pill/Trigger(trigger_flags) - if(!..()) - return FALSE - var/obj/item/item_target = target - to_chat(owner, span_notice("You grit your teeth and burst the implanted [item_target.name]!")) - log_combat(owner, null, "swallowed an implanted pill", target) - if(item_target.reagents.total_volume) - item_target.reagents.trans_to(owner, item_target.reagents.total_volume, transfered_by = owner, methods = INGEST) - qdel(target) - return TRUE diff --git a/code/modules/surgery/dissection.dm b/code/modules/surgery/dissection.dm deleted file mode 100644 index e904371698d5..000000000000 --- a/code/modules/surgery/dissection.dm +++ /dev/null @@ -1,86 +0,0 @@ -/datum/surgery/dissection - name = "Dissection" - target_mobtypes = list( - /mob/living/carbon/human, - /mob/living/carbon/alien, - ) - possible_locs = list(BODY_ZONE_CHEST) - requires_real_bodypart = TRUE - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/dissection, - /datum/surgery_step/close, - ) - -/datum/surgery/dissection/can_start(mob/user, mob/living/patient) - . = ..() - - // This isn't a real advanced tech, but it doesn't make sense using it without an operating computer - if (isnull(locate_operating_computer(get_turf(patient)))) - return FALSE - - if (HAS_TRAIT(patient, TRAIT_DISSECTED)) - return FALSE - - if (patient.stat != DEAD) - return FALSE - - return TRUE - -/datum/surgery_step/dissection - name = "dissect" - time = 16 SECONDS - implements = list( - TOOL_SCALPEL = 100, - /obj/item/melee/energy/sword = 75, - /obj/item/knife = 65, - /obj/item/shard = 45, - /obj/item = 30, - ) - -/datum/surgery_step/dissection/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/ending = "..." - if (isnull(surgery.locate_operating_computer(get_turf(target)))) - ending = ", but without a linked operating computer, you won't get any research!" - - display_results( - user, - target, - span_notice("You start to dissect [target][ending]"), - span_notice("[user] starts to dissect [target]..."), - span_notice("[user] begins to start poking around inside your corpse...hey, wait a minute!"), - ) - -/datum/surgery_step/dissection/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - ADD_TRAIT(target, TRAIT_DISSECTED, REF(src)) - - var/obj/machinery/computer/operating/operating_computer = surgery.locate_operating_computer(get_turf(target)) - if (!isnull(operating_computer)) - SEND_SIGNAL(operating_computer, COMSIG_OPERATING_COMPUTER_DISSECTION_COMPLETE, target) - - return TRUE - -/datum/surgery_step/dissection/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_results( - user, - target, - span_notice("You mess up, damaging some of the internal organs!"), - span_notice("[user] messes up, damaging some of the internal organs!"), - span_notice("[user] messes up, damaging some of your internal organs!") - ) - - target.adjustOrganLoss(pick( - ORGAN_SLOT_APPENDIX, - ORGAN_SLOT_BRAIN, - ORGAN_SLOT_HEART, - ORGAN_SLOT_LIVER, - ORGAN_SLOT_LUNGS, - ORGAN_SLOT_STOMACH, - ), 20) - - return FALSE - -/datum/surgery_step/dissection/tool_check(mob/user, obj/item/tool) - return implement_type != /obj/item || tool.sharpness diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm deleted file mode 100644 index 083e0f6cd5db..000000000000 --- a/code/modules/surgery/eye_surgery.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/surgery/eye_surgery - name = "Eye surgery" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/fix_eyes, - /datum/surgery_step/close) - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_PRECISE_EYES) - requires_bodypart_type = 0 - organ_to_manipulate = ORGAN_SLOT_EYES - -//fix eyes -/datum/surgery_step/fix_eyes - name = "fix eyes" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 45, - /obj/item/pen = 25) - time = 64 - -/datum/surgery/eye_surgery/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/eyes/target_eyes = target.getorganslot(ORGAN_SLOT_EYES) - if(!target_eyes) - to_chat(user, span_warning("It's hard to do surgery on someone's eyes when [target.p_they()] [target.p_do()]n't have any.")) - return FALSE - return TRUE - -/datum/surgery_step/fix_eyes/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to fix [target]'s eyes..."), - span_notice("[user] begins to fix [target]'s eyes."), - span_notice("[user] begins to perform surgery on [target]'s eyes.")) - display_pain(target, "You feel a stabbing pain in your eyes!") - -/datum/surgery_step/fix_eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/obj/item/organ/eyes/target_eyes = target.getorganslot(ORGAN_SLOT_EYES) - user.visible_message(span_notice("[user] successfully fixes [target]'s eyes!"), span_notice("You succeed in fixing [target]'s eyes.")) - display_results(user, target, span_notice("You succeed in fixing [target]'s eyes."), - span_notice("[user] successfully fixes [target]'s eyes!"), - span_notice("[user] completes the surgery on [target]'s eyes.")) - display_pain(target, "Your vision blurs, but it seems like you can see a little better now!") - target.cure_blind(list(EYE_DAMAGE)) - target.set_blindness(0) - target.cure_nearsighted(list(EYE_DAMAGE)) - target.blur_eyes(35) //this will fix itself slowly. - target_eyes.setOrganDamage(0) - return ..() - -/datum/surgery_step/fix_eyes/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(target.getorgan(/obj/item/organ/brain)) - display_results(user, target, span_warning("You accidentally stab [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!"), - span_warning("[user] accidentally stabs [target] right in the brain!")) - display_pain(target, "You feel a visceral stabbing pain right through your head, into your brain!") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 70) - else - display_results(user, target, span_warning("You accidentally stab [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain! Or would have, if [target] had a brain."), - span_warning("[user] accidentally stabs [target] right in the brain!")) - display_pain(target, "You feel a visceral stabbing pain right through your head!") // dunno who can feel pain w/o a brain but may as well be consistent. - return FALSE diff --git a/code/modules/surgery/gastrectomy.dm b/code/modules/surgery/gastrectomy.dm deleted file mode 100644 index 1b87e345b2e4..000000000000 --- a/code/modules/surgery/gastrectomy.dm +++ /dev/null @@ -1,59 +0,0 @@ -/datum/surgery/gastrectomy - name = "Gastrectomy" - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - requires_real_bodypart = TRUE - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/gastrectomy, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - organ_to_manipulate = ORGAN_SLOT_STOMACH - -/datum/surgery/gastrectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) - if(target_stomach?.damage > 50 && !(target_stomach.organ_flags & ORGAN_FAILING)) - return TRUE - -////Gastrectomy, because we truly needed a way to repair stomachs. -//95% chance of success to be consistent with most organ-repairing surgeries. -/datum/surgery_step/gastrectomy - name = "remove lower duodenum" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 52 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/organ1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/gastrectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to cut out a damaged piece of [target]'s stomach..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target].")) - display_pain(target, "You feel a horrible stab in your gut!") - -/datum/surgery_step/gastrectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/carbon/human/target_human = target - target_human.setOrganLoss(ORGAN_SLOT_STOMACH, 20) // Stomachs have a threshold for being able to even digest food, so I might tweak this number - display_results(user, target, span_notice("You successfully remove the damaged part of [target]'s stomach."), - span_notice("[user] successfully removes the damaged part of [target]'s stomach."), - span_notice("[user] successfully removes the damaged part of [target]'s stomach.")) - display_pain(target, "The pain in your gut ebbs and fades somewhat.") - return ..() - -/datum/surgery_step/gastrectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) - var/mob/living/carbon/human/target_human = target - target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 15) - display_results(user, target, span_warning("You cut the wrong part of [target]'s stomach!"), - span_warning("[user] cuts the wrong part of [target]'s stomach!"), - span_warning("[user] cuts the wrong part of [target]'s stomach!")) - display_pain(target, "Your stomach throbs with pain; it's not getting any better!") - diff --git a/code/modules/surgery/healing.dm b/code/modules/surgery/healing.dm deleted file mode 100644 index 010f7c4f0fd0..000000000000 --- a/code/modules/surgery/healing.dm +++ /dev/null @@ -1,329 +0,0 @@ -/datum/surgery/healing - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/heal, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living) - possible_locs = list(BODY_ZONE_CHEST) - requires_bodypart_type = FALSE - replaced_by = /datum/surgery - ignore_clothes = TRUE - var/healing_step_type - var/antispam = FALSE - -/datum/surgery/healing/can_start(mob/user, mob/living/patient) - . = ..() - if(isanimal(patient)) - var/mob/living/simple_animal/critter = patient - if(!critter.healable) - return FALSE - if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID))) - return FALSE - -/datum/surgery/healing/New(surgery_target, surgery_location, surgery_bodypart) - ..() - if(healing_step_type) - steps = list( - /datum/surgery_step/incise/nobleed, - healing_step_type, //hehe cheeky - /datum/surgery_step/close) - -/datum/surgery_step/heal - name = "repair body" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_SCREWDRIVER = 65, - /obj/item/pen = 55) - repeatable = TRUE - time = 25 - success_sound = 'sound/surgery/retractor2.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - var/brutehealing = 0 - var/burnhealing = 0 - var/brute_multiplier = 0 //multiplies the damage that the patient has. if 0 the patient wont get any additional healing from the damage he has. - var/burn_multiplier = 0 - -/// Returns a string letting the surgeon know roughly how much longer the surgery is estimated to take at the going rate -/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) - woundtype = "wounds" - else if(brutehealing) - woundtype = "bruises" - else //why are you trying to 0,0...? - woundtype = "burns" - if(istype(surgery,/datum/surgery/healing)) - var/datum/surgery/healing/the_surgery = surgery - if(!the_surgery.antispam) - display_results(user, target, span_notice("You attempt to patch some of [target]'s [woundtype]."), - span_notice("[user] attempts to patch some of [target]'s [woundtype]."), - span_notice("[user] attempts to patch some of [target]'s [woundtype].")) - display_pain(target, "Your [woundtype] sting like hell!") - -/datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - if(!..()) - return - while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss())) - if(!..()) - break - -/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/user_msg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons" - var/target_msg = "[user] fixes some of [target]'s wounds" //see above - var/brute_healed = brutehealing - var/burn_healed = burnhealing - if(target.stat == DEAD) //dead patients get way less additional heal from the damage they have. - brute_healed += round((target.getBruteLoss() * (brute_multiplier * 0.2)),0.1) - burn_healed += round((target.getFireLoss() * (burn_multiplier * 0.2)),0.1) - else - brute_healed += round((target.getBruteLoss() * brute_multiplier),0.1) - burn_healed += round((target.getFireLoss() * burn_multiplier),0.1) - if(!get_location_accessible(target, target_zone)) - brute_healed *= 0.55 - burn_healed *= 0.55 - user_msg += " as best as you can while [target.p_they()] [target.p_have()] clothing on" - target_msg += " as best as [user.p_they()] can while [target.p_they()] [target.p_have()] clothing on" - target.heal_bodypart_damage(brute_healed,burn_healed) - - user_msg += get_progress(user, target, brute_healed, burn_healed) - - display_results(user, target, span_notice("[user_msg]."), - "[target_msg].", - "[target_msg].") - if(istype(surgery, /datum/surgery/healing)) - var/datum/surgery/healing/the_surgery = surgery - the_surgery.antispam = TRUE - return ..() - -/datum/surgery_step/heal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_warning("You screwed up!"), - span_warning("[user] screws up!"), - span_notice("[user] fixes some of [target]'s wounds."), TRUE) - var/brute_dealt = brutehealing * 0.8 - var/burn_dealt = burnhealing * 0.8 - brute_dealt += round((target.getBruteLoss() * (brute_multiplier * 0.5)),0.1) - burn_dealt += round((target.getFireLoss() * (burn_multiplier * 0.5)),0.1) - target.take_bodypart_damage(brute_dealt, burn_dealt) - return FALSE - -/***************************BRUTE***************************/ -/datum/surgery/healing/brute - name = "Tend Wounds (Bruises)" - -/datum/surgery/healing/brute/basic - name = "Tend Wounds (Bruises, Basic)" - replaced_by = /datum/surgery/healing/brute/upgraded - healing_step_type = /datum/surgery_step/heal/brute/basic - desc = "A surgical procedure that provides basic treatment for a patient's brute traumas. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/brute/upgraded - name = "Tend Wounds (Bruises, Adv.)" - replaced_by = /datum/surgery/healing/brute/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/brute/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's brute traumas. Heals more when the patient is severely injured." - -/datum/surgery/healing/brute/upgraded/femto - name = "Tend Wounds (Bruises, Exp.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/brute/upgraded/femto - 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 - brute_multiplier = 0.07 - -/datum/surgery_step/heal/brute/upgraded - brutehealing = 5 - brute_multiplier = 0.1 - -/datum/surgery_step/heal/brute/upgraded/femto - brutehealing = 5 - brute_multiplier = 0.2 - -/***************************BURN***************************/ -/datum/surgery/healing/burn - name = "Tend Wounds (Burn)" - -/datum/surgery/healing/burn/basic - name = "Tend Wounds (Burn, Basic)" - replaced_by = /datum/surgery/healing/burn/upgraded - healing_step_type = /datum/surgery_step/heal/burn/basic - desc = "A surgical procedure that provides basic treatment for a patient's burns. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/burn/upgraded - name = "Tend Wounds (Burn, Adv.)" - replaced_by = /datum/surgery/healing/burn/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/burn/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's burns. Heals more when the patient is severely injured." - -/datum/surgery/healing/burn/upgraded/femto - name = "Tend Wounds (Burn, Exp.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/burn/upgraded/femto - 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 burn: [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 - burn_multiplier = 0.07 - -/datum/surgery_step/heal/burn/upgraded - burnhealing = 5 - burn_multiplier = 0.1 - -/datum/surgery_step/heal/burn/upgraded/femto - burnhealing = 5 - burn_multiplier = 0.2 - -/***************************COMBO***************************/ -/datum/surgery/healing/combo - - -/datum/surgery/healing/combo - name = "Tend Wounds (Mixture, Basic)" - replaced_by = /datum/surgery/healing/combo/upgraded - requires_tech = TRUE - healing_step_type = /datum/surgery_step/heal/combo - desc = "A surgical procedure that provides basic treatment for a patient's burns and brute traumas. Heals slightly more when the patient is severely injured." - -/datum/surgery/healing/combo/upgraded - name = "Tend Wounds (Mixture, Adv.)" - replaced_by = /datum/surgery/healing/combo/upgraded/femto - healing_step_type = /datum/surgery_step/heal/combo/upgraded - desc = "A surgical procedure that provides advanced treatment for a patient's burns and brute traumas. Heals more when the patient is severely injured." - - -/datum/surgery/healing/combo/upgraded/femto //no real reason to type it like this except consistency, don't worry you're not missing anything - name = "Tend Wounds (Mixture, Exp.)" - replaced_by = null - healing_step_type = /datum/surgery_step/heal/combo/upgraded/femto - 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 - burnhealing = 3 - brute_multiplier = 0.07 - burn_multiplier = 0.07 - time = 10 - -/datum/surgery_step/heal/combo/upgraded - brutehealing = 3 - burnhealing = 3 - brute_multiplier = 0.1 - burn_multiplier = 0.1 - -/datum/surgery_step/heal/combo/upgraded/femto - brutehealing = 1 - burnhealing = 1 - brute_multiplier = 0.4 - burn_multiplier = 0.4 - -/datum/surgery_step/heal/combo/upgraded/femto/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_warning("You screwed up!"), - span_warning("[user] screws up!"), - span_notice("[user] fixes some of [target]'s wounds."), TRUE) - target.take_bodypart_damage(5,5) diff --git a/code/modules/surgery/hepatectomy.dm b/code/modules/surgery/hepatectomy.dm deleted file mode 100644 index cad47af9542a..000000000000 --- a/code/modules/surgery/hepatectomy.dm +++ /dev/null @@ -1,57 +0,0 @@ -/datum/surgery/hepatectomy - name = "Hepatectomy" - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - requires_real_bodypart = TRUE - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/hepatectomy, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - organ_to_manipulate = ORGAN_SLOT_LIVER - -/datum/surgery/hepatectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/liver/target_liver = target.getorganslot(ORGAN_SLOT_LIVER) - if(target_liver?.damage > 50 && !(target_liver.organ_flags & ORGAN_FAILING)) - return TRUE - -////hepatectomy, removes damaged parts of the liver so that the liver may regenerate properly -//95% chance of success, not 100 because organs are delicate -/datum/surgery_step/hepatectomy - name = "remove damaged liver section" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 52 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/organ1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/hepatectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to cut out a damaged piece of [target]'s liver..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target].")) - display_pain(target, "Your abdomen burns in horrific stabbing pain!") - -/datum/surgery_step/hepatectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/carbon/human/human_target = target - human_target.setOrganLoss(ORGAN_SLOT_LIVER, 10) //not bad, not great - display_results(user, target, span_notice("You successfully remove the damaged part of [target]'s liver."), - span_notice("[user] successfully removes the damaged part of [target]'s liver."), - span_notice("[user] successfully removes the damaged part of [target]'s liver.")) - display_pain(target, "The pain receeds slightly.") - return ..() - -/datum/surgery_step/hepatectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery) - var/mob/living/carbon/human/human_target = target - human_target.adjustOrganLoss(ORGAN_SLOT_LIVER, 15) - display_results(user, target, span_warning("You cut the wrong part of [target]'s liver!"), - span_warning("[user] cuts the wrong part of [target]'s liver!"), - span_warning("[user] cuts the wrong part of [target]'s liver!")) - display_pain(target, "You feel a sharp stab inside your abdomen!") diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm deleted file mode 100644 index f0860fac8f6a..000000000000 --- a/code/modules/surgery/implant_removal.dm +++ /dev/null @@ -1,75 +0,0 @@ -/datum/surgery/implant_removal - name = "Implant removal" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/retract_skin, - /datum/surgery_step/extract_implant, - /datum/surgery_step/close) - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - - -//extract implant -/datum/surgery_step/extract_implant - name = "extract implant" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 65, - /obj/item/kitchen/fork = 35) - time = 64 - success_sound = 'sound/surgery/hemostat1.ogg' - var/obj/item/implant/implant - -/datum/surgery_step/extract_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - for(var/obj/item/object in target.implants) - implant = object - break - if(implant) - display_results(user, target, span_notice("You begin to extract [implant] from [target]'s [target_zone]..."), - span_notice("[user] begins to extract [implant] from [target]'s [target_zone]."), - span_notice("[user] begins to extract something from [target]'s [target_zone].")) - display_pain(target, "You feel a serious pain in your [target_zone]!") - else - display_results(user, target, span_notice("You look for an implant in [target]'s [target_zone]..."), - span_notice("[user] looks for an implant in [target]'s [target_zone]."), - span_notice("[user] looks for something in [target]'s [target_zone].")) - -/datum/surgery_step/extract_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(implant) - display_results(user, target, span_notice("You successfully remove [implant] from [target]'s [target_zone]."), - span_notice("[user] successfully removes [implant] from [target]'s [target_zone]!"), - span_notice("[user] successfully removes something from [target]'s [target_zone]!")) - display_pain(target, "You can feel your [implant] pulled out of you!") - implant.removed(target) - - var/obj/item/implantcase/case - for(var/obj/item/implantcase/implant_case in user.held_items) - case = implant_case - break - if(!case) - case = locate(/obj/item/implantcase) in get_turf(target) - if(case && !case.imp) - case.imp = implant - implant.forceMove(case) - case.update_appearance() - display_results(user, target, span_notice("You place [implant] into [case]."), - span_notice("[user] places [implant] into [case]!"), - span_notice("[user] places it into [case]!")) - else - qdel(implant) - - else - to_chat(user, span_warning("You can't find anything in [target]'s [target_zone]!")) - return ..() - -/datum/surgery/implant_removal/mechanic - name = "implant removal" - requires_bodypart_type = BODYTYPE_ROBOTIC - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/extract_implant, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close) diff --git a/code/modules/surgery/limb_augmentation.dm b/code/modules/surgery/limb_augmentation.dm deleted file mode 100644 index cfd3e471c47a..000000000000 --- a/code/modules/surgery/limb_augmentation.dm +++ /dev/null @@ -1,75 +0,0 @@ - -/////AUGMENTATION SURGERIES////// - - -//SURGERY STEPS - -/datum/surgery_step/replace_limb - name = "replace limb" - implements = list( - /obj/item/bodypart = 100, - /obj/item/borg/apparatus/organ_storage = 100) - time = 32 - var/obj/item/bodypart/target_limb - - -/datum/surgery_step/replace_limb/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(NOAUGMENTS in target.dna.species.species_traits) - to_chat(user, span_warning("[target] cannot be augmented!")) - return -1 - if(istype(tool, /obj/item/borg/apparatus/organ_storage) && istype(tool.contents[1], /obj/item/bodypart)) - tool = tool.contents[1] - var/obj/item/bodypart/aug = tool - if(IS_ORGANIC_LIMB(aug)) - to_chat(user, span_warning("That's not an augment, silly!")) - return -1 - if(aug.body_zone != target_zone) - to_chat(user, span_warning("[tool] isn't the right type for [parse_zone(target_zone)].")) - return -1 - target_limb = surgery.operated_bodypart - if(target_limb) - display_results(user, target, span_notice("You begin to augment [target]'s [parse_zone(user.zone_selected)]..."), - span_notice("[user] begins to augment [target]'s [parse_zone(user.zone_selected)] with [aug]."), - span_notice("[user] begins to augment [target]'s [parse_zone(user.zone_selected)].")) - display_pain(target, "You feel a horrible pain in your [parse_zone(user.zone_selected)]!") - else - user.visible_message(span_notice("[user] looks for [target]'s [parse_zone(user.zone_selected)]."), span_notice("You look for [target]'s [parse_zone(user.zone_selected)]...")) - - -//ACTUAL SURGERIES - -/datum/surgery/augmentation - name = "Augmentation" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/replace_limb) - target_mobtypes = list(/mob/living/carbon/human) - 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 - -//SURGERY STEP SUCCESSES - -/datum/surgery_step/replace_limb/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/bodypart/tool, datum/surgery/surgery, default_display_results = FALSE) - if(target_limb) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - tool.icon_state = initial(tool.icon_state) - tool.desc = initial(tool.desc) - tool.cut_overlays() - tool = tool.contents[1] - if(istype(tool) && user.temporarilyRemoveItemFromInventory(tool)) - if(!tool.replace_limb(target)) - display_results(user, target, span_warning("You fail in replacing [target]'s [parse_zone(target_zone)]! Their body has rejected [tool]!"), - span_warning("[user] fails to replace [target]'s [parse_zone(target_zone)]!"), - span_warning("[user] fails to replaces [target]'s [parse_zone(target_zone)]!")) - tool.forceMove(target.loc) - return - display_results(user, target, span_notice("You successfully augment [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully augments [target]'s [parse_zone(target_zone)] with [tool]!"), - span_notice("[user] successfully augments [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "Your [parse_zone(target_zone)] comes awash with synthetic sensation!", mechanical_surgery = TRUE) - log_combat(user, target, "augmented", addition="by giving him new [parse_zone(target_zone)] COMBAT MODE: [uppertext(user.combat_mode)]") - else - to_chat(user, span_warning("[target] has no organic [parse_zone(target_zone)] there!")) - return ..() diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm deleted file mode 100644 index 1cd4a63204a6..000000000000 --- a/code/modules/surgery/lipoplasty.dm +++ /dev/null @@ -1,76 +0,0 @@ -/datum/surgery/lipoplasty - name = "Lipoplasty" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/cut_fat, - /datum/surgery_step/remove_fat, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - -/datum/surgery/lipoplasty/can_start(mob/user, mob/living/carbon/target) - if(HAS_TRAIT(target, TRAIT_FAT) && target.nutrition >= NUTRITION_LEVEL_WELL_FED) - return TRUE - return FALSE - - -//cut fat -/datum/surgery_step/cut_fat - name = "cut excess fat" - implements = list( - TOOL_SAW = 100, - /obj/item/hatchet = 35, - /obj/item/knife/butcher = 25) - time = 64 - -/datum/surgery_step/cut_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] begins to cut away [target]'s excess fat."), span_notice("You begin to cut away [target]'s excess fat...")) - display_results(user, target, span_notice("You begin to cut away [target]'s excess fat..."), - span_notice("[user] begins to cut away [target]'s excess fat."), - span_notice("[user] begins to cut [target]'s [target_zone] with [tool].")) - display_pain(target, "You feel a stabbing in your [target_zone]!") - -/datum/surgery_step/cut_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - display_results(user, target, span_notice("You cut [target]'s excess fat loose."), - span_notice("[user] cuts [target]'s excess fat loose!"), - span_notice("[user] finishes the cut on [target]'s [target_zone].")) - display_pain(target, "The fat in your [target_zone] comes loose, dangling and hurting like hell!") - return TRUE - -//remove fat -/datum/surgery_step/remove_fat - name = "remove loose fat" - implements = list( - TOOL_RETRACTOR = 100, - TOOL_SCREWDRIVER = 45, - TOOL_WIRECUTTER = 35) - time = 32 - -/datum/surgery_step/remove_fat/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to extract [target]'s loose fat..."), - span_notice("[user] begins to extract [target]'s loose fat!"), - span_notice("[user] begins to extract something from [target]'s [target_zone].")) - display_pain(target, "You feel an oddly painless tugging on your loose fat!") - -/datum/surgery_step/remove_fat/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You extract [target]'s fat."), - span_notice("[user] extracts [target]'s fat!"), - span_notice("[user] extracts [target]'s fat!")) - target.overeatduration = 0 //patient is unfatted - var/removednutriment = target.nutrition - target.set_nutrition(NUTRITION_LEVEL_WELL_FED) - removednutriment -= NUTRITION_LEVEL_WELL_FED //whatever was removed goes into the meat - var/mob/living/carbon/human/human = target - var/typeofmeat = /obj/item/food/meat/slab/human - - if(human.dna && human.dna.species) - typeofmeat = human.dna.species.meat - - var/obj/item/food/meat/slab/human/newmeat = new typeofmeat - newmeat.name = "fatty meat" - newmeat.desc = "Extremely fatty tissue taken from a patient." - newmeat.subjectname = human.real_name - newmeat.subjectjob = human.job - newmeat.reagents.add_reagent (/datum/reagent/consumable/nutriment, (removednutriment / 15)) //To balance with nutriment_factor of nutriment - newmeat.forceMove(target.loc) - return ..() diff --git a/code/modules/surgery/lobectomy.dm b/code/modules/surgery/lobectomy.dm deleted file mode 100644 index af0996c4f892..000000000000 --- a/code/modules/surgery/lobectomy.dm +++ /dev/null @@ -1,62 +0,0 @@ -/datum/surgery/lobectomy - name = "Lobectomy" //not to be confused with lobotomy - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/lobectomy, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_CHEST) - organ_to_manipulate = ORGAN_SLOT_LUNGS - -/datum/surgery/lobectomy/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/lungs/target_lungs = target.getorganslot(ORGAN_SLOT_LUNGS) - if(target_lungs) - if(target_lungs.damage > 60 && !target_lungs.operated) - return TRUE - return FALSE - - -//lobectomy, removes the most damaged lung lobe with a 95% base success chance -/datum/surgery_step/lobectomy - name = "excise damaged lung node" - implements = list( - TOOL_SCALPEL = 95, - /obj/item/melee/energy/sword = 65, - /obj/item/knife = 45, - /obj/item/shard = 35) - time = 42 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/organ1.ogg' - failure_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/lobectomy/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to make an incision in [target]'s lungs..."), - span_notice("[user] begins to make an incision in [target]."), - span_notice("[user] begins to make an incision in [target].")) - display_pain(target, "You feel a stabbing pain in your chest!") - -/datum/surgery_step/lobectomy/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/organ/lungs/target_lungs = human_target.getorganslot(ORGAN_SLOT_LUNGS) - target_lungs.operated = TRUE - human_target.setOrganLoss(ORGAN_SLOT_LUNGS, 60) - display_results(user, target, span_notice("You successfully excise [human_target]'s most damaged lobe."), - span_notice("Successfully removes a piece of [human_target]'s lungs."), - "") - display_pain(target, "Your chest hurts like hell, but breathng becomes slightly easier.") - return ..() - -/datum/surgery_step/lobectomy/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - display_results(user, target, span_warning("You screw up, failing to excise [human_target]'s damaged lobe!"), - span_warning("[user] screws up!"), - span_warning("[user] screws up!")) - display_pain(target, "You feel a sharp stab in your chest; the wind is knocked out of you and it hurts to catch your breath!") - human_target.losebreath += 4 - human_target.adjustOrganLoss(ORGAN_SLOT_LUNGS, 10) - return FALSE diff --git a/code/modules/surgery/machines/bodyscanner.dm b/code/modules/surgery/machines/bodyscanner.dm new file mode 100644 index 000000000000..dbbed0687229 --- /dev/null +++ b/code/modules/surgery/machines/bodyscanner.dm @@ -0,0 +1,593 @@ +/obj/machinery/bodyscanner + name = "body scanner" + desc = "A large full-body scanning machine that provides a complete physical assessment of a patient placed inside. Operated using an adjacent console." + icon = 'icons/obj/machines/bodyscanner.dmi' + icon_state = "body_scanner_open" + dir = EAST + density = TRUE + + var/obj/machinery/bodyscanner_console/linked_console + +/obj/machinery/bodyscanner/Initialize(mapload) + . = ..() + rediscover() + +/obj/machinery/bodyscanner/Destroy() + if(!QDELETED(linked_console)) + qdel(linked_console) + return ..() + +/obj/machinery/bodyscanner/update_icon_state() + . = ..() + if(occupant) + icon_state = "body_scanner_closed" + else + icon_state = "body_scanner_open" + +/obj/machinery/bodyscanner/setDir(ndir) + . = ..() + rediscover() + +/obj/machinery/bodyscanner/proc/rediscover() + if(linked_console) + linked_console.linked_scanner = null + linked_console = null + + var/turf/T = get_step(src, turn(dir, 180)) + if(!T) + return + linked_console = locate(/obj/machinery/bodyscanner_console) in T + if(linked_console) + linked_console.linked_scanner = src + linked_console.update_appearance() + +/obj/machinery/bodyscanner/set_occupant(atom/movable/new_occupant) + . = ..() + update_icon_state() + +/obj/machinery/bodyscanner/deconstruct(disassembled) + . = ..() + if(linked_console) + linked_console.linked_scanner = null + linked_console.update_appearance() + linked_console = null + +/obj/machinery/bodyscanner/wrench_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 50) + setDir(turn(dir, 180)) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/bodyscanner/MouseDroppedOn(mob/living/carbon/human/target, mob/user) + if(!istype(target) || !can_interact(user) || HAS_TRAIT(user, TRAIT_UI_BLOCKED) || !Adjacent(user, mover = target) || target.buckled || target.has_buckled_mobs()) + return + + if(occupant) + to_chat(user, span_warning("[src] is currently occupied!")) + return + + target.forceMove(src) + set_occupant(target) + if(user == target) + user.visible_message( + span_notice("\The [user] climbs into \the [src]."), + span_notice("You climb into \the [src]."), + span_hear("You hear metal clanking, then a pressurized hiss.") + ) + else + user.visible_message(span_notice("[user] moves [target] into [src]."), blind_message = span_hear("You hear metal clanking, then a pressurized hiss.")) + + target.forceMove(src) + set_occupant(target) + +/obj/machinery/bodyscanner/AltClick(mob/user) + . = ..() + if(!user.canUseTopic(src, USE_CLOSE|USE_SILICON_REACH)) + return + eject_occupant(user) + +/obj/machinery/bodyscanner/proc/eject_occupant(mob/user, resisted) + if(!occupant) + return + + if(!resisted) + if(user) + visible_message( + span_notice("[user] opens \the [src]."), + blind_message = span_hear("You hear a pressurized hiss, then a sound like glass creaking.") + ) + else + visible_message( + span_notice("[src] opens with a hiss."), + blind_message = span_hear("You hear a pressurized hiss, then a sound like glass creaking.") + ) + + else + visible_message( + span_notice("[occupant] climbs out of [src]"), + blind_message = span_hear("You hear a pressurized hiss, then a sound like glass creaking.") + ) + + occupant.forceMove(get_turf(src)) + set_occupant(null) + + +/obj/machinery/bodyscanner/container_resist_act(mob/living/user) + if(!user.incapacitated()) + eject_occupant(src, TRUE) + +/////// The Console //////// +DEFINE_INTERACTABLE(/obj/machinery/bodyscanner_console) +/obj/machinery/bodyscanner_console + name = "body scanner console" + icon = 'icons/obj/machines/bodyscanner.dmi' + icon_state = "bodyscanner_console_powered" + dir = EAST + mouse_drop_pointer = TRUE + + var/obj/machinery/bodyscanner/linked_scanner + /// Data! Maybe there's something to be done with data disks here. + var/list/scan + +/obj/machinery/bodyscanner_console/Initialize(mapload) + . = ..() + rediscover() + +/obj/machinery/bodyscanner_console/Destroy() + if(!QDELETED(linked_scanner)) + qdel(linked_scanner) + + return ..() + +/obj/machinery/bodyscanner_console/setDir(ndir) + . = ..() + rediscover() + +/obj/machinery/bodyscanner_console/proc/rediscover() + if(linked_scanner) + linked_scanner.linked_console = null + linked_scanner = null + + var/turf/T = get_step(src, dir) + if(!T) + return + + linked_scanner = locate(/obj/machinery/bodyscanner) in T + if(linked_scanner) + linked_scanner.linked_console = src + +/obj/machinery/bodyscanner_console/wrench_act(mob/living/user, obj/item/tool) + tool.play_tool_sound(src, 50) + setDir(turn(dir, 180)) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/machinery/bodyscanner_console/deconstruct(disassembled) + . = ..() + if(linked_scanner) + linked_scanner.linked_console = null + linked_scanner = null + +/obj/machinery/bodyscanner_console/update_icon_state() + . = ..() + if((machine_stat & NOPOWER) || !linked_scanner) + icon_state = "bodyscanner_console_unpowered" + else + icon_state = "bodyscanner_console_powered" + +/obj/machinery/bodyscanner_console/proc/scan_patient() + if(!linked_scanner?.occupant) + return + + var/mob/living/carbon/human/H = linked_scanner.occupant + scan = H.get_bodyscanner_data() + playsound(linked_scanner, 'sound/machines/medbayscanner.ogg', 50) + updateUsrDialog() + +/obj/machinery/bodyscanner_console/proc/clear_scan() + scan = null + updateUsrDialog() + +/obj/machinery/bodyscanner_console/Topic(href, href_list) + . = ..() + if(.) + return + + if(href_list["scan"]) + scan_patient() + return TRUE + + if(href_list["eject"]) + linked_scanner?.eject_occupant() + return TRUE + + if(href_list["erase"]) + clear_scan() + return TRUE + + if(href_list["send2display"]) + var/choices = list() + for(var/obj/machinery/body_scan_display/display as anything in GLOB.bodyscanscreens) + if(!SSmapping.are_same_zstack(src.z, display.z)) + return + var/name = "[capitalize(display.name)] at [(get_area(display)).name]" + if(choices[name]) + choices[name + " (1)"] = choices[name] + choices -= name + name = name + " (2)" + else if(choices[name + " (1)"]) + name = name + " (1)" + + while(choices[name]) + name = splicetext(name, -4) + " ([(text2num(copytext(name, -2, -1)) + 1)])" + + choices[name] = display + + if(!length(choices)) + return TRUE + + var/choice = input(usr, "Select Display", "Push to Display") as null|anything in choices + if(!(choice in choices)) + return + + var/obj/machinery/body_scan_display/display = choices[choice] + display.push_content(jointext(get_content(scan), null)) + return TRUE + +/obj/machinery/bodyscanner_console/ui_interact(mob/user, datum/tgui/ui) + . = ..() + + var/datum/browser/popup = new(user, "bodyscanner", "Body Scanner", 600, 800) + var/content = {" +
+ [button_element(src, "Scan", "scan=1")] + [button_element(src, "Eject Occupant", "eject=1")] + [button_element(src, "Erase Scan", "erase=1")] + [button_element(src, "Push to Display", "send2display=1")] +
+ "} + + popup.set_content(content + jointext(get_content(scan), null)) + popup.open() + + +/obj/machinery/bodyscanner_console/proc/get_content(list/scan) + RETURN_TYPE(/list) + . = list() + + . += {" +
+ "} + + if(!scan) + . += "
["NO DATA TO DISPLAY"]
" + return + + if(!scan["name"]) + . += "
[span_bad("SCAN READOUT ERROR.")]
" + return + + .+= {" + + + + + + + + + + "} + + var/brain_activity = scan["brain_activity"] + switch(brain_activity) + if(0) + brain_activity = span_bad("None, patient is braindead") + if(-1) + brain_activity = span_bad("Patient is missing a brain") + if(100) + brain_activity = span_good("[brain_activity]%") + else + brain_activity = span_mild("[brain_activity]%") + + . += {" + + + + + "} + var/pulse_string + if(scan["pulse"] == -1) + pulse_string = "[span_average("ERROR - Nonstandard biology")]" + else if(scan["pulse"] == -2) + pulse_string = "N/A" + else if(scan["pulse"] == -3) + pulse_string = "[span_bad("250+bpm")]" + else if(scan["pulse"] == 0) + pulse_string = "[span_bad("[scan["pulse"]]bpm")]" + else if(scan["pulse"] >= 140) + pulse_string = "[span_bad("[scan["pulse"]]bpm")]" + else if(scan["pulse"] >= 120) + pulse_string = "[span_average("[scan["pulse"]]bpm")]" + else + pulse_string = "[scan["pulse"]]bpm" + + . += {" + + + + + "} + var/pressure_string + var/ratio = scan["blood_volume"]/scan["blood_volume_max"] + if(scan["blood_o2"] <= 70) + pressure_string = "([span_bad("[scan["blood_o2"]]% blood oxygenation")])" + else if(scan["blood_o2"] <= 85) + pressure_string = "([span_average("[scan["blood_o2"]]% blood oxygenation")])" + else if(scan["blood_o2"] <= 90) + pressure_string = "(["[scan["blood_o2"]]% blood oxygenation"])" + else + pressure_string = "([scan["blood_o2"]]% blood oxygenation)" + + . += {" + + + + + "} + if(ratio <= 0.7) + . += {" + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + . += {" + + + + + "} + + if(scan["dna_ruined"]) + . += {" + + + + + "} + + if(scan["husked"]) + . += {" + + + + + "} + if(scan["radiation"]) + . += {" + + + + + "} + + if(scan["genetic_instability"]) + . += {" + + + + + "} + + + if(length(scan["reagents"])) + . += {" + + + + + + + + "} + else + . += {" + + + + "} + + . += {" + + " + . += "
+ Scan Results For: + + [scan["name"]] +
+ Scan Performed At: + + [scan["time"]] +
+ Brain Activity: + + [brain_activity] +
+ Pulse Rate: + + [pulse_string] +
+ Blood Pressure: + + [pressure_string] +
+ [span_bad("Patient is in hypovolemic shock. Transfusion highly recommended.")] +
+ Blood Volume: + + [scan["blood_volume"]]u/[scan["blood_volume_max"]]u ([scan["blood_type"]]) +
+ Body Temperature: + + [scan["temperature"]-T0C]°C ([FAHRENHEIT(scan["temperature"])]°F) +
+ DNA: + + [scan["dna"]] +
+ Physical Trauma: + + [get_severity(scan["brute"],TRUE)] +
+ Burn Severity: + + [get_severity(scan["burn"],TRUE)] +
+ Systematic Organ Failure: + + [get_severity(scan["toxin"],TRUE)] +
+ Oxygen Deprivation: + + [get_severity(scan["oxygen"],TRUE)] +
+ Genetic Damage: + + [get_severity(scan["genetic"],TRUE)] +
+ [span_bad("ERROR: patient's DNA sequence is unreadable.")] +
+ [span_bad("Husked cadaver detected: Replacement tissue required.")] +
+ Irradiated +
+ [span_bad("Genetic instability detected.")] +
+ Reagents detected in patient's bloodstream: +
+ "} + for(var/list/R as anything in scan["reagents"]) + if(R["visible"]) + . += {" +
+ ["[R["quantity"]]u [R["name"]][R["overdosed"] ? " OVERDOSED" : ""]"] +
+ [span_average("Unknown Reagent")] +
+
+ + + + + + + + + + "} + + for(var/list/limb as anything in scan["bodyparts"]) + .+= {" + + + "} + + if(limb["is_stump"]) + . += {" + + + "} + else + . += "" + + if(limb["brute_dam"]) + . += {" + [capitalize(get_wound_severity(limb["brute_ratio"]))] physical trauma
+ "} + if(limb["burn_dam"]) + . += {" + [capitalize(get_wound_severity(limb["burn_ratio"]))] burns + + "} + . += {" + + "} + . += "" + + . += "" + for(var/list/organ as anything in scan["organs"]) + . += "" + + if(organ["damage_percent"]) + . += "" + else + . += "" + + . += {" + + + "} + + if(scan["nearsight"]) + . += "" + + . += "
Body Status
OrganDamageStatus
[limb["name"]] + + Missing + + [english_list(limb["scan_results"], nothing_text = " ")] + " + if(!(limb["brute_dam"] || limb["burn_dam"])) + . += "None + [english_list(limb["scan_results"], nothing_text = " ")] +
Internal Organs
[organ["name"]][get_severity(organ["damage_percent"], TRUE)]None + [span_bad("[english_list(organ["scan_results"], nothing_text=" ")]")] +
[span_average( "Retinal misalignment detected.")]
" diff --git a/code/modules/surgery/machines/bodyscanner_display.dm b/code/modules/surgery/machines/bodyscanner_display.dm new file mode 100644 index 000000000000..aaa229126288 --- /dev/null +++ b/code/modules/surgery/machines/bodyscanner_display.dm @@ -0,0 +1,83 @@ +GLOBAL_LIST_EMPTY(bodyscanscreens) + +DEFINE_INTERACTABLE(/obj/machinery/body_scan_display) +/obj/machinery/body_scan_display + name = "body scan display" + desc = "A wall-mounted display linked to a body scanner." + icon = 'icons/obj/machines/bodyscan_displays.dmi' + icon_state = "telescreen" + + var/current_content = "" + +/obj/machinery/body_scan_display/Initialize(mapload) + . = ..() + GLOB.bodyscanscreens += src + setDir(dir) + +/obj/machinery/body_scan_display/Destroy() + GLOB.bodyscanscreens -= src + return ..() + +MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/body_scan_display, 32) + +/obj/machinery/body_scan_display/setDir(ndir) + . = ..() + switch(dir) + if(NORTH) + pixel_y = 32 + base_pixel_y = 32 + pixel_x = 0 + base_pixel_x = 0 + if(SOUTH) + pixel_y = -32 + base_pixel_y = -32 + pixel_x = 0 + base_pixel_x = 0 + if(EAST) + pixel_y = 0 + base_pixel_y = 0 + pixel_x = 32 + base_pixel_x = 32 + if(WEST) + pixel_y = 0 + base_pixel_y = 0 + pixel_x = -32 + base_pixel_x = -32 + +/obj/machinery/body_scan_display/update_overlays() + . = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return + + . += image(icon, "operating") + . += emissive_appearance(icon, "operating") + +/obj/machinery/body_scan_display/Topic(href, href_list) + . = ..() + if(.) + return + + if(href_list["erase"]) + current_content = null + updateUsrDialog() + return TRUE + +/obj/machinery/body_scan_display/ui_interact(mob/user, datum/tgui/ui) + . = ..() + var/datum/browser/popup = new(user, "bodyscanner", "Body Scanner", 600, 800) + popup.set_content(get_content()) + popup.open() + +/obj/machinery/body_scan_display/proc/push_content(content) + current_content = content + updateUsrDialog() + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/body_scan_display/proc/get_content() + . += {" +
+ [button_element(src, "Erase Scan", "erase=1")] +
+ "} + + . += current_content diff --git a/code/modules/surgery/machines/bodyscanner_helpers.dm b/code/modules/surgery/machines/bodyscanner_helpers.dm new file mode 100644 index 000000000000..17787a2de97c --- /dev/null +++ b/code/modules/surgery/machines/bodyscanner_helpers.dm @@ -0,0 +1,115 @@ +/mob/living/carbon/human/proc/get_bodyscanner_data() + RETURN_TYPE(/list) + + . = list() + + .["name"] = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) ? "Unknown" : name + .["age"] = age + .["time"] = stationtime2text("hh:mm") + + var/obj/item/organ/brain/B = getorganslot(ORGAN_SLOT_BRAIN) + if(!B) + .["brain_activity"] = -1 + else + .["brain_activity"] = (B.maxHealth - B.damage) / B.maxHealth * 100 + + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + var/pulse_result + if(needs_organ(ORGAN_SLOT_HEART)) + if(!heart) + pulse_result = 0 + else if(heart.organ_flags & ORGAN_SYNTHETIC) + pulse_result = -2 + else if(HAS_TRAIT(src, TRAIT_FAKEDEATH)) + pulse_result = 0 + else + pulse_result = get_pulse(GETPULSE_TOOL) + else + pulse_result = -1 + + if(pulse_result == ">250") + pulse_result = -3 + + .["pulse"] = text2num(pulse_result) + .["blood_pressure"] = get_blood_pressure() + .["blood_o2"] = get_blood_oxygenation() + .["blood_volume"] = blood_volume + .["blood_volume_max"] = BLOOD_VOLUME_NORMAL + .["blood_type"] = dna.blood_type + + .["temperature"] = round(bodytemperature, 0.1) + .["dna"] = dna.unique_enzymes + + .["brute"] = getBruteLoss() + .["burn"] = getFireLoss() + .["toxin"] = getToxLoss() + .["oxygen"] = getOxyLoss() + .["genetic"] = getCloneLoss() + + .["radiation"] = HAS_TRAIT(src, TRAIT_IRRADIATED) + .["husked"] = HAS_TRAIT(src, TRAIT_HUSK) + .["dna_ruined"] = HAS_TRAIT(src, TRAIT_BADDNA) + + .["reagents"] = list() + if(reagents.total_volume) + for(var/datum/reagent/R in reagents.reagent_list) + var/list/reagent = list() + reagent["name"] = R.name + reagent["quantity"] = round(R.volume, 1) + reagent["visible"] = !(R.chemical_flags & (REAGENT_INVISIBLE)) + reagent["overdosed"] = R.overdosed + .["reagents"] += list(reagent) + + .["bodyparts"] = list() + + var/list/bodyparts = sort_list(src.bodyparts, GLOBAL_PROC_REF(cmp_bodyparts_display_order)) + for(var/obj/item/bodypart/BP as anything in bodyparts) + var/list/part = list() + part["name"] = BP.plaintext_zone + part["is_stump"] = BP.is_stump + part["brute_ratio"] = BP.brute_ratio + part["burn_ratio"] = BP.burn_ratio + part["limb_flags"] = BP.bodypart_flags + part["brute_dam"] = BP.brute_dam + part["burn_dam"] = BP.burn_dam + part["scan_results"] = BP.get_scan_results(TRUE) + .["bodyparts"] += list(part) + + .["organs"] = list() + + for(var/obj/item/organ/O as anything in processing_organs) + var/list/org = list() + org["name"] = O.name + org["damage_percent"] = O.damage / O.maxHealth * 100 + org["scan_results"] = O.get_scan_results(TRUE) + + .["organs"] += list(org) + + .["nearsight"] = HAS_TRAIT_FROM(src, TRAIT_NEARSIGHT, QUIRK_TRAIT) || HAS_TRAIT_FROM(src, TRAIT_NEARSIGHT, GENETIC_MUTATION) + .["blind"] = HAS_TRAIT(src, TRAIT_BLIND) + .["genetic_instability"] = !!GetComponent(/datum/component/genetic_damage) + +/obj/machinery/bodyscanner_console/proc/get_severity(amount, tag = FALSE) + if(!amount) + return "none" + + if(amount > 50) + if(tag) + . = span_bad("severe") + else + . = "severe" + else if(amount > 25) + if(tag) + . = span_bad("significant") + else + . = "significant" + else if(amount > 10) + if(tag) + . = span_average("moderate") + else + . = "moderate" + else + if (tag) + . = span_mild("minor") + else + . = "minor" diff --git a/code/modules/surgery/machines/vitals_monitor.dm b/code/modules/surgery/machines/vitals_monitor.dm new file mode 100644 index 000000000000..b9c7a3547af4 --- /dev/null +++ b/code/modules/surgery/machines/vitals_monitor.dm @@ -0,0 +1,274 @@ +#define PULSE_ALERT 1 +#define BRAIN_ALERT 2 +#define LUNGS_ALERT 3 + +DEFINE_INTERACTABLE(/obj/machinery/vitals_monitor) + +/obj/machinery/vitals_monitor + name = "vitals monitor" + desc = "A bulky yet mobile machine, showing some odd graphs." + icon = 'icons/obj/machines/heartmonitor.dmi' + icon_state = "base" + anchored = FALSE + power_channel = AREA_USAGE_EQUIP + idle_power_usage = 10 + active_power_usage = 100 + processing_flags = START_PROCESSING_MANUALLY + + var/obj/structure/table/optable/connected_optable + var/beep = TRUE + + //alert stuff + var/read_alerts = TRUE + COOLDOWN_DECLARE(alert_cooldown) // buffer to prevent rapid changes in state + var/list/alerts = null + var/list/last_alert = null + +/obj/machinery/vitals_monitor/Initialize() + . = ..() + alerts = new /list(3) + last_alert = new /list(3) + for (dir in GLOB.cardinals) + var/optable = locate(/obj/structure/table/optable, get_step(src, dir)) + if (optable) + set_optable(optable) + break + +/obj/machinery/vitals_monitor/Destroy() + set_optable(null) + return ..() + +/obj/machinery/vitals_monitor/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(connected_optable && !Adjacent(connected_optable)) + set_optable(null) + +/obj/machinery/vitals_monitor/proc/set_optable(obj/structure/table/optable/target) + if (target == connected_optable) + return + + STOP_PROCESSING(SSmachines, src) + if (connected_optable) //gotta clear existing connections first + connected_optable.connected_monitor = null + + connected_optable = target + + if (connected_optable) + connected_optable.connected_monitor = src + visible_message(span_notice("\The [src] is now relaying information from \the [connected_optable]")) + START_PROCESSING(SSmachines, src) + + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/vitals_monitor/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + if(!.) + return + + if (istype(over, /obj/structure/table/optable)) + set_optable(over) + +/obj/machinery/vitals_monitor/update_overlays() + . = ..() + if (machine_stat & NOPOWER) + return + . += image(icon, icon_state = "screen") + + if(connected_optable?.patient) + handle_pulse(.) + handle_brain(.) + handle_lungs(.) + handle_alerts(.) + +/obj/machinery/vitals_monitor/process() + if(!Adjacent(connected_optable)) + set_optable(null) + return + + if (connected_optable.patient) + update_appearance(UPDATE_OVERLAYS) + +/obj/machinery/vitals_monitor/proc/handle_pulse(list/overlays) + . = overlays + var/obj/item/organ/heart/heart = connected_optable.patient.getorganslot(ORGAN_SLOT_HEART) + if (istype(heart) && !(heart.organ_flags & ORGAN_SYNTHETIC)) + switch (connected_optable.patient.pulse()) + if (PULSE_NONE) + . += emissive_appearance(icon, "pulse_flatline") + . += emissive_appearance(icon, "pulse_warning") + . += image(icon, icon_state = "pulse_flatline") + . += image(icon, icon_state = "pulse_warning") + if (beep) + playsound(src, 'sound/machines/flatline.ogg', 20) + if (read_alerts) + alerts[PULSE_ALERT] = "Cardiac flatline detected!" + + if (PULSE_SLOW, PULSE_NORM) + . += emissive_appearance(icon, "pulse_normal") + . += image(icon, icon_state = "pulse_normal") + if (beep) + playsound(src, 'sound/machines/quiet_beep.ogg', 30) + + if (PULSE_FAST, PULSE_2FAST) + . += emissive_appearance(icon, "pulse_veryfast") + . += image(icon, icon_state = "pulse_veryfast") + if (beep) + playsound(src, 'sound/machines/quiet_double_beep.ogg', 40) + + if (PULSE_THREADY) + . += emissive_appearance(icon, "pulse_thready") + . += image(icon, icon_state = "pulse_thready") + . += emissive_appearance(icon, "pulse_warning") + . += image(icon, icon_state = "pulse_warning") + if (beep) + playsound(src, 'sound/machines/ekg_alert.ogg', 40) + + if (read_alerts) + alerts[PULSE_ALERT] = "Excessive heartbeat! Possible Shock Detected!" + else + . += emissive_appearance(icon, "pulse_warning") + . += image(icon, icon_state = "pulse_warning") + +/obj/machinery/vitals_monitor/proc/handle_brain(list/overlays) + . = overlays + var/obj/item/organ/brain/brain = connected_optable.patient.getorganslot(ORGAN_SLOT_BRAIN) + if (istype(brain) && connected_optable.patient.stat != DEAD && !HAS_TRAIT(connected_optable.patient, TRAIT_FAKEDEATH)) + switch (round(brain.damage / brain.damage_threshold_value)) + if (0 to 2) + . += (emissive_appearance(icon, "brain_ok")) + . += (image(icon, icon_state = "brain_ok")) + if (3 to 5) + . += (emissive_appearance(icon, "breathing_bad")) + . += (image(icon, icon_state = "brain_bad")) + if (read_alerts) + alerts[BRAIN_ALERT] = "Weak brain activity!" + if (6 to INFINITY) + . += (emissive_appearance(icon, "brain_verybad")) + . += (image(icon, icon_state = "brain_verybad")) + . += (emissive_appearance(icon, "brain_warning")) + . += (image(icon, icon_state = "brain_warning")) + if (read_alerts) + alerts[BRAIN_ALERT] = "Very weak brain activity!" + else + . += (emissive_appearance(icon, "brain_warning")) + . += (image(icon, icon_state = "brain_warning")) + +/obj/machinery/vitals_monitor/proc/handle_lungs(list/overlays) + . = overlays + var/obj/item/organ/lungs/lungs = connected_optable.patient.getorganslot(ORGAN_SLOT_LUNGS) + if (istype(lungs) && !HAS_TRAIT(connected_optable.patient, TRAIT_FAKEDEATH)) + if (!connected_optable.patient.failed_last_breath) + . += (emissive_appearance(icon, "breathing_normal")) + . += (image(icon, icon_state = "breathing_normal")) + else if (connected_optable.patient.losebreath) + . += (emissive_appearance(icon, "breathing_shallow")) + . += (image(icon, icon_state = "breathing_shallow")) + if (read_alerts) + alerts[LUNGS_ALERT] = "Abnormal breathing detected!" + else + . += (emissive_appearance(icon, "breathing_warning")) + . += (image(icon, icon_state = "breathing_warning")) + if (read_alerts) + alerts[LUNGS_ALERT] = "Patient is not breathing!" + else + . += (emissive_appearance(icon, "breathing_warning")) + . += (image(icon, icon_state = "breathing_warning")) + +/obj/machinery/vitals_monitor/proc/handle_alerts(list/overlays) + . = overlays + if (!connected_optable?.patient || !read_alerts) //Clear our alerts + alerts[PULSE_ALERT] = "" + alerts[BRAIN_ALERT] = "" + alerts[LUNGS_ALERT] = "" + return + + if (COOLDOWN_FINISHED(src, alert_cooldown)) + if (alerts[PULSE_ALERT] && alerts[PULSE_ALERT] != last_alert[PULSE_ALERT]) + audible_message(span_warning("\The [src] beeps, \"[alerts[PULSE_ALERT]]\"")) + if (alerts[BRAIN_ALERT] && alerts[BRAIN_ALERT] != last_alert[BRAIN_ALERT]) + audible_message(span_warning("\The [src] alarms, \"[alerts[BRAIN_ALERT]]\"")) + if (alerts[LUNGS_ALERT] && alerts[LUNGS_ALERT] != last_alert[LUNGS_ALERT]) + audible_message(span_warning("\The [src] warns, \"[alerts[LUNGS_ALERT]]\"")) + last_alert = alerts.Copy() + COOLDOWN_START(src, alert_cooldown, 5 SECONDS) + +/obj/machinery/vitals_monitor/examine(mob/user) + . = ..() + if(machine_stat & NOPOWER) + . += span_notice("It's unpowered.") + return + if(!connected_optable?.patient) + return + var/mob/living/carbon/victim = connected_optable.patient + + . += span_notice("Vitals of [victim]:") + . += span_notice("Pulse: [victim.get_pulse(GETPULSE_TOOL)]") + . += span_notice("Blood pressure: [victim.get_blood_pressure()]") + . += span_notice("Blood oxygenation: [victim.get_blood_oxygenation()]%") + . += span_notice("Body temperature: [victim.bodytemperature-T0C]°C ([victim.bodytemperature*1.8-459.67]°F)") + + var/brain_activity = "none" + var/obj/item/organ/brain/brain = victim.getorganslot(ORGAN_SLOT_BRAIN) + var/danger = FALSE + if (istype(brain) && victim.stat != DEAD && !HAS_TRAIT(victim, TRAIT_FAKEDEATH)) + switch (round(brain.damage / brain.damage_threshold_value)) + if (0) + brain_activity = "normal" + if (1 to 2) + brain_activity = "minor brain damage" + if (3 to 5) + brain_activity = "weak" + danger = TRUE + if (6 to 8) + brain_activity = "extremely weak" + danger = TRUE + if (9 to INFINITY) + brain_activity = "fading" + danger = TRUE + + if (!danger) + . += span_notice("Brain activity: [brain_activity]") + else + . += span_warning("Brain activity: [brain_activity]") + + var/breathing = "normal" + var/obj/item/organ/lungs/lungs = victim.getorganslot(ORGAN_SLOT_LUNGS) + if (istype(lungs) && !HAS_TRAIT(victim, TRAIT_FAKEDEATH)) + if (victim.failed_last_breath) + breathing = "none" + else if(victim.losebreath) + breathing = "shallow" + else + breathing = "none" + + . += span_notice("Breathing: [breathing]") + +/obj/machinery/vitals_monitor/verb/toggle_beep() + set name = "Toggle Monitor Beeping" + set category = "Object" + set src in view(1) + + var/mob/living/user = usr + if (!istype(user)) + return + + if (can_interact(user)) + beep = !beep + to_chat(user, span_notice("You turn the sound on \the [src] [beep ? "on" : "off"].")) + +/obj/machinery/vitals_monitor/verb/toggle_alerts() + set name = "Toggle Alert Annunciator" + set category = "Object" + set src in view(1) + + var/mob/living/user = usr + if (!istype(user)) + return + + if (can_interact(user)) + read_alerts = !read_alerts + to_chat(user, span_notice("You turn the alert reader on \the [src] [read_alerts ? "on" : "off"].")) + +#undef PULSE_ALERT +#undef BRAIN_ALERT +#undef LUNGS_ALERT diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm deleted file mode 100644 index 5f11b3e0c6e4..000000000000 --- a/code/modules/surgery/mechanic_steps.dm +++ /dev/null @@ -1,129 +0,0 @@ -//open shell -/datum/surgery_step/mechanic_open - name = "unscrew shell" - implements = list( - TOOL_SCREWDRIVER = 100, - TOOL_SCALPEL = 75, // med borgs could try to unscrew shell with scalpel - /obj/item/knife = 50, - /obj/item = 10) // 10% success with any sharp item. - time = 24 - preop_sound = 'sound/items/screwdriver.ogg' - success_sound = 'sound/items/screwdriver2.ogg' - -/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You can feel your [parse_zone(target_zone)] grow numb as the sensory panel is unscrewed.", TRUE) - -/datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.sharpness) - return FALSE - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//close shell -/datum/surgery_step/mechanic_close - name = "screw shell" - implements = list( - TOOL_SCREWDRIVER = 100, - TOOL_SCALPEL = 75, - /obj/item/knife = 50, - /obj/item = 10) // 10% success with any sharp item. - time = 24 - preop_sound = 'sound/items/screwdriver.ogg' - success_sound = 'sound/items/screwdriver2.ogg' - -/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to screw the shell of [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to screw the shell of [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel the faint pricks of sensation return as your [parse_zone(target_zone)]'s panel is screwed in.", TRUE) - -/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.sharpness) - return FALSE - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//prepare electronics -/datum/surgery_step/prepare_electronics - name = "prepare electronics" - implements = list( - TOOL_MULTITOOL = 100, - TOOL_HEMOSTAT = 10) // try to reboot internal controllers via short circuit with some conductor - time = 24 - preop_sound = 'sound/items/taperecorder/tape_flip.ogg' - success_sound = 'sound/items/taperecorder/taperecorder_close.ogg' - -/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to prepare electronics in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You can feel a faint buzz in your [parse_zone(target_zone)] as the electronics reboot.", TRUE) - -//unwrench -/datum/surgery_step/mechanic_unwrench - name = "unwrench bolts" - implements = list( - TOOL_WRENCH = 100, - TOOL_RETRACTOR = 10) - time = 24 - preop_sound = 'sound/items/ratchet.ogg' - -/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a jostle in your [parse_zone(target_zone)] as the bolts begin to loosen.", TRUE) - -/datum/surgery_step/mechanic_unwrench/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//wrench -/datum/surgery_step/mechanic_wrench - name = "wrench bolts" - implements = list( - TOOL_WRENCH = 100, - TOOL_RETRACTOR = 10) - time = 24 - preop_sound = 'sound/items/ratchet.ogg' - -/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a jostle in your [parse_zone(target_zone)] as the bolts begin to tighten.", TRUE) - -/datum/surgery_step/mechanic_wrench/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE - -//open hatch -/datum/surgery_step/open_hatch - name = "open the hatch" - accept_hand = TRUE - time = 10 - preop_sound = 'sound/items/ratchet.ogg' - preop_sound = 'sound/machines/doorclick.ogg' - -/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "The last faint pricks of tactile sensation fade from your [parse_zone(target_zone)] as the hatch is opened.", TRUE) - -/datum/surgery_step/open_hatch/tool_check(mob/user, obj/item/tool) - if(tool.usesound) - preop_sound = tool.usesound - - return TRUE diff --git a/code/modules/surgery/new_surgery/_surgery_step.dm b/code/modules/surgery/new_surgery/_surgery_step.dm new file mode 100644 index 000000000000..9a90234f0ada --- /dev/null +++ b/code/modules/surgery/new_surgery/_surgery_step.dm @@ -0,0 +1,492 @@ +// A list of types that will not attempt to perform surgery if the user is on help intent. +GLOBAL_LIST_INIT(surgery_tool_exceptions, typecacheof(list( + /obj/item/healthanalyzer, + /obj/item/shockpaddles, + /obj/item/reagent_containers/hypospray, + /obj/item/modular_computer, + /obj/item/reagent_containers/syringe, + /obj/item/reagent_containers/borghypo +))) + +/datum/surgery_step + abstract_type = /datum/surgery_step + var/name + var/desc + /// type path referencing tools that can be used for this step, and how well are they suited for it + var/list/allowed_tools + // type paths referencing races that this step applies to. All if null. + var/list/allowed_species + /// duration of the step + var/min_duration = 0 + /// duration of the step + var/max_duration = 0 + /// evil infection stuff that will make everyone hate me + var/can_infect = 0 + /// How much pain to deliver to the patient + var/pain_given =0 + /// if this step NEEDS stable optable or can be done on any valid surface with no penalty + var/delicate = 0 + /// Various bitflags for requirements of the surgery. + var/surgery_flags = 0 // Various bitflags for requirements of the surgery. + /// Whether or not this surgery will be fuzzy on size requirements. + var/strict_access_requirement = TRUE + /// Does this step attempt to repeat itself after every success? + var/looping = FALSE + + /// Sound to play during begin_step(). Can be a sound, and associative list of sound:path, or a flat list of sounds. + var/preop_sound + /// Sound to play on success. + var/success_sound + /// Sound to play on failure. + var/failure_sound + + +/datum/surgery_step/New() + . = ..() + #ifdef UNIT_TESTS + min_duration = 0 + max_duration = 0 + #endif + +/// Returns how well tool is suited for this step +/datum/surgery_step/proc/tool_potency(obj/item/tool) + if(tool.tool_behaviour) + . = allowed_tools["[tool.tool_behaviour]"] + if(!isnull(.)) + return + + for (var/T in allowed_tools) + if (istype(tool,T)) + return allowed_tools[T] + + return 0 + +/// Checks if the target is valid. +/datum/surgery_step/proc/is_valid_target(mob/living/carbon/human/H) + if(!istype(H)) + return FALSE + + if(length(allowed_species)) + if(!(H.dna.species.type in allowed_species)) + return FALSE + + return TRUE + +/// Checks if this surgery step can be performed with the given parameters. +/datum/surgery_step/proc/can_operate(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + return is_valid_target(target) && assess_bodypart(user, target, target_zone, tool) + +/datum/surgery_step/proc/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!istype(target) || !target_zone) + return FALSE + + var/obj/item/bodypart/affected = target.get_bodypart(target_zone, TRUE) + if(!affected) + return FALSE + + // Check various conditional flags. + if(((surgery_flags & SURGERY_NO_ROBOTIC) && !IS_ORGANIC_LIMB(affected)) || \ + ((surgery_flags & SURGERY_NO_STUMP) && affected.is_stump) || \ + ((surgery_flags & SURGERY_NO_FLESH) && (IS_ORGANIC_LIMB(affected)))) + return FALSE + + // Check if the surgery target is accessible. + if(!IS_ORGANIC_LIMB(affected)) + if(((surgery_flags & SURGERY_NEEDS_DEENCASEMENT) || \ + (surgery_flags & SURGERY_NEEDS_INCISION) || \ + (surgery_flags & SURGERY_NEEDS_RETRACTED)) && \ + affected.hatch_state != HATCH_OPENED) + return FALSE + else + var/open_threshold = 0 + if(surgery_flags & SURGERY_NEEDS_INCISION) + open_threshold = SURGERY_OPEN + + else if(surgery_flags & SURGERY_NEEDS_RETRACTED) + open_threshold = SURGERY_RETRACTED + + else if(surgery_flags & SURGERY_NEEDS_DEENCASEMENT) + open_threshold = (affected.encased ? SURGERY_DEENCASED : SURGERY_RETRACTED) + + if(open_threshold && ((strict_access_requirement && affected.how_open() != open_threshold) || \ + affected.how_open() < open_threshold)) + return FALSE + + // Check if clothing is blocking access + for(var/obj/item/I as anything in target.clothingonpart(affected)) + if(I.obj_flags & THICKMATERIAL) + to_chat(user, span_notice("The material covering this area is too thick for you to do surgery through!")) + return FALSE + + return affected + +/datum/surgery_step/proc/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return TRUE + +/// Does stuff to begin the step, usually just printing messages. Moved germs transfering and bloodying here too +/datum/surgery_step/proc/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + + play_preop_sound(user, target, target_zone, tool) + + var/obj/item/bodypart/affected = target.get_bodypart(deprecise_zone(target_zone), TRUE) + + if (can_infect) + spread_germs(user, affected) + + if(affected) + if(IS_ORGANIC_LIMB(affected) && !istype(tool, /obj/item/reagent_containers)) + tool.transfer_mob_blood_dna(target) + + var/mob/living/carbon/human/human_user + // Bloody items + if(ishuman(user)) + human_user = user + + if(prob(60) && (affected.bodypart_flags & BP_HAS_BLOOD)) + if(surgery_flags & SURGERY_BLOODY_BODY) + human_user.add_blood_DNA_to_items(target.get_blood_dna_list(), ITEM_SLOT_GLOVES|ITEM_SLOT_OCLOTHING|ITEM_SLOT_ICLOTHING) + + else if(surgery_flags & SURGERY_BLOODY_GLOVES) + human_user.add_blood_DNA_to_items(target.get_blood_dna_list(), ITEM_SLOT_GLOVES) + + // Transmit diseases if no gloves. + if(IS_ORGANIC_LIMB(affected) && !human_user?.gloves) + for(var/datum/disease/D as anything in user.diseases) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + target.ContactContractDisease(D) + + for(var/datum/disease/D as anything in target.diseases) + if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) + user.ContactContractDisease(D) + + if(pain_given && !(affected.bodypart_flags & BP_NO_PAIN) && target.stat == CONSCIOUS) + target.apply_pain(pain_given, affected.body_zone, ignore_cd = TRUE) + + if (target.stat == UNCONSCIOUS && prob(20)) + to_chat(target, span_boldnotice("... [pick("bright light", "faraway pain", "something moving in you", "soft beeping")] ...")) + return + +// Does stuff to end the step, which is normally print a message + do whatever this step changes +/datum/surgery_step/proc/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + tool.handle_post_surgery() + if(!success_sound) + return + playsound(get_turf(target), success_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + +// Stuff that happens when the step fails +/datum/surgery_step/proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + SHOULD_CALL_PARENT(TRUE) + if(!failure_sound) + return + + playsound(get_turf(target), failure_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + + +/// The chance for success vs failure +/datum/surgery_step/proc/success_modifier(mob/living/user, mob/living/carbon/human/target, obj/item/tool, target_zone) + SHOULD_CALL_PARENT(TRUE) + var/potency = tool_potency(tool) + if(potency == 0) + return 0 + + if(surgery_flags & SURGERY_CANNOT_FAIL) + return 100 + + var/modifier = 0 + if(prob(100 - potency)) + modifier -= 4 + + if(user == target) + modifier -= 1 + + var/turf/T = get_turf(target) + var/has_op_table = locate(/obj/structure/table/optable, T) + if(has_op_table) + modifier += 2 + + if(delicate) + if(target.body_position == STANDING_UP) + . -= 2 + + if(!has_op_table) + if(locate(/obj/structure/bed, T)) + modifier += 1 + else if(locate(/obj/structure/table, T)) + modifier += 1 + else if(locate(/obj/effect/rune, T)) + modifier -= 1 + else + modifier -= 3 + +/datum/surgery_step/proc/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool) + if(!preop_sound) + return + var/sound_file_use + if(islist(preop_sound)) + if(!preop_sound[1]) //Test to see if the list is assoc + sound_file_use = pick(preop_sound) + + for(var/typepath in preop_sound)//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last + if(istype(tool, typepath)) + sound_file_use = preop_sound[typepath] + break + else + sound_file_use = preop_sound + playsound(get_turf(target), sound_file_use, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) + +/datum/surgery_step/proc/spread_germs(mob/living/carbon/user, obj/item/bodypart/BP) + if(!istype(user) || !istype(BP)) + return + + if(!IS_ORGANIC_LIMB(BP)) + return + + var/germ_level = user.germ_level + var/wearing_gloves = FALSE + if(user.gloves) + wearing_gloves = TRUE + germ_level = user.gloves.germ_level + + germ_level = max(germ_level, BP.germ_level) + if(!wearing_gloves) + user.germ_level = germ_level + else + user.germ_level = germ_level + + BP.germ_level = germ_level //as funny as scrubbing microbes out with clean gloves is - no. + +/// Can a mob perform surgery with this item. Step is optional. +/obj/item/proc/surgery_sanity_check(mob/living/carbon/target, mob/living/user, datum/surgery_step/step, target_zone) + if(!istype(target)) + return FALSE + + if(QDELETED(target) || QDELETED(user)) + return FALSE + + if(user.combat_mode) + return FALSE + + if(user.get_active_held_item() != src) + return FALSE + + if(!user.can_perform_surgery_on(target)) + return FALSE + + if(step && !step.can_operate(user, target, target_zone, src)) + return FALSE + + return TRUE + +/// Attempt to perform a surgery step. +/obj/item/proc/attempt_surgery(mob/living/carbon/target, mob/living/user) + // Check for the Hippocratic oath. + if(GLOB.surgery_tool_exceptions[type]) + return FALSE + + if(!surgery_sanity_check(target, user)) + return FALSE + + // Check for multi-surgery drifting. + var/zone = deprecise_zone(user.zone_selected) + if(LAZYACCESS(target.surgeries_in_progress, zone)) + to_chat(user, span_warning("You can't operate on this area while surgery is already in progress.")) + return TRUE + + // What surgeries does our tool/target enable? + var/list/possible_surgeries + for(var/datum/surgery_step/step in GLOB.surgeries_list) + if(step.tool_potency(src) && step.can_operate(user, target, zone, src)) + LAZYSET(possible_surgeries, step, TRUE) + + // Which surgery, if any, do we actually want to do? + var/datum/surgery_step/step + if(LAZYLEN(possible_surgeries) == 1) + step = possible_surgeries[1] + + #ifdef UNIT_TESTS + if(!istype(step, user.desired_surgery)) + CRASH("User ended up with a surgery that wasn't the desied [user.desired_surgery]!") + #endif + + else if(LAZYLEN(possible_surgeries) >= 1) + if(user.client) // In case of future autodocs. + step = input(user, "Which surgery would you like to perform?", "Surgery") as null|anything in possible_surgeries + if(!step) + return TRUE + #ifdef UNIT_TESTS + if(!step) + step = locate(user.desired_surgery) in possible_surgeries + if(!step) + CRASH("Failed to find desired surgery [user.desired_surgery]!") + #else + if(!step) + step = pick(possible_surgeries) + #endif + + // We didn't find a surgery. + if(!istype(step)) + return FALSE + + // The step selector contains an input, so we need to check again after. + if(!surgery_sanity_check(target, user, step, zone)) + return TRUE + + var/obj/item/bodypart/BP = target.get_bodypart(zone) + if(BP?.bandage) + to_chat(user, span_warning("You cannot operate on a bandaged bodypart, remove it!")) + return TRUE + + if(target == user) + if(user.zone_selected == BODY_ZONE_HEAD) + to_chat(user, span_warning("You cannot operate on your own head!")) + return TRUE + + var/hand = user.get_active_hand().body_zone + if(user.zone_selected == hand) + to_chat(src, span_warning("You cannot operate on that arm with that hand!")) + return TRUE + + perform_surgery(target, user, step, zone) + return TRUE + +/obj/item/proc/perform_surgery(mob/living/carbon/target, mob/living/user, datum/surgery_step/step, zone) + SHOULD_NOT_OVERRIDE(TRUE) + PRIVATE_PROC(TRUE) // Should not be called from anywhere besides attempt_surgery() + + var/datum/callback/sanity_check_callback = CALLBACK(src, PROC_REF(surgery_sanity_check), target, user) + var/can_loop = FALSE + + do + if(!surgery_sanity_check(target, user, step, zone)) + return + + // Double-check this in case it changed between initial check and now. + if(zone in target.surgeries_in_progress) + to_chat(user, span_warning("You can't operate on this area while surgery is already in progress.")) + return + + var/operation_data = step.pre_surgery_step(user, target, zone, src) + if(!operation_data) // Surgery step recognized but failed for some reason + return + + LAZYSET(target.surgeries_in_progress, zone, operation_data) + + step.begin_step(user, target, zone, src) + + var/roll_modifier = step.success_modifier(user, target, src, zone) + if(roll_modifier == -INFINITY) + return + + // It's a surprise tool that'll help us later + #ifndef UNIT_TESTS + var/datum/roll_result/result = user.stat_roll(6, /datum/rpg_skill/handicraft, roll_modifier) + #else + var/datum/roll_result/result = GLOB.success_roll + #endif + var/duration = rand(step.min_duration, step.max_duration) + + if(do_after(user, target, duration, DO_PUBLIC, extra_checks = sanity_check_callback, display = src)) + switch(result.outcome) + if(SUCCESS, CRIT_SUCCESS) + step.succeed_step(user, target, zone, src) + can_loop = TRUE + else + step.fail_step(user, target, zone, src) + + else if(!(QDELING(user) || QDELING(target) || QDELING(src))) + step.fail_step(user, target, zone, src) + + if(!QDELETED(target)) + LAZYREMOVE(target.surgeries_in_progress, zone) // Clear the in-progress flag. + /*if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.update_surgery()*/ + + while(step.looping && can_loop) + +/obj/item/proc/handle_post_surgery(mob/living/user, mob/living/carbon/human/target) + use(1) + return + +/mob/proc/can_perform_surgery_on(mob/living/target) + var/turf/T = get_turf(target) + + if(target.body_position == LYING_DOWN) + . = TRUE + else if(locate(/obj/structure/table, T)) + . = TRUE + else if(locate(/obj/structure/bed, T)) + . = TRUE + else if(locate(/obj/effect/rune, T)) + . = TRUE + + return . || FALSE + +/mob/living/can_perform_surgery_on(mob/living/target, silent) + if(combat_mode) + return FALSE + return ..() + + +/proc/get_location_accessible(mob/located_mob, location) + var/covered_locations = 0 //based on body_parts_covered + var/face_covered = 0 //based on flags_inv + var/eyesmouth_covered = 0 //based on flags_cover + if(iscarbon(located_mob)) + var/mob/living/carbon/clothed_carbon = located_mob + for(var/obj/item/clothing/clothes in list(clothed_carbon.back, clothed_carbon.wear_mask, clothed_carbon.head)) + covered_locations |= clothes.body_parts_covered + face_covered |= clothes.flags_inv + eyesmouth_covered |= clothes.flags_cover + if(ishuman(clothed_carbon)) + var/mob/living/carbon/human/clothed_human = clothed_carbon + for(var/obj/item/clothes in list(clothed_human.wear_suit, clothed_human.w_uniform, clothed_human.shoes, clothed_human.belt, clothed_human.gloves, clothed_human.glasses, clothed_human.ears)) + covered_locations |= clothes.body_parts_covered + face_covered |= clothes.flags_inv + eyesmouth_covered |= clothes.flags_cover + + switch(location) + if(BODY_ZONE_HEAD) + if(covered_locations & HEAD) + return FALSE + if(BODY_ZONE_PRECISE_EYES) + if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES) + return FALSE + if(BODY_ZONE_PRECISE_MOUTH) + if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH) + return FALSE + if(BODY_ZONE_CHEST) + if(covered_locations & CHEST) + return FALSE + if(BODY_ZONE_PRECISE_GROIN) + if(covered_locations & GROIN) + return FALSE + if(BODY_ZONE_L_ARM) + if(covered_locations & ARM_LEFT) + return FALSE + if(BODY_ZONE_R_ARM) + if(covered_locations & ARM_RIGHT) + return FALSE + if(BODY_ZONE_L_LEG) + if(covered_locations & LEG_LEFT) + return FALSE + if(BODY_ZONE_R_LEG) + if(covered_locations & LEG_RIGHT) + return FALSE + if(BODY_ZONE_PRECISE_L_HAND) + if(covered_locations & HAND_LEFT) + return FALSE + if(BODY_ZONE_PRECISE_R_HAND) + if(covered_locations & HAND_RIGHT) + return FALSE + if(BODY_ZONE_PRECISE_L_FOOT) + if(covered_locations & FOOT_LEFT) + return FALSE + if(BODY_ZONE_PRECISE_R_FOOT) + if(covered_locations & FOOT_RIGHT) + return FALSE + + return TRUE diff --git a/code/modules/surgery/new_surgery/bones.dm b/code/modules/surgery/new_surgery/bones.dm new file mode 100644 index 000000000000..50e86e490ca7 --- /dev/null +++ b/code/modules/surgery/new_surgery/bones.dm @@ -0,0 +1,101 @@ +//Procedures in this file: Fracture repair surgery +////////////////////////////////////////////////////////////////// +// BONE SURGERY // +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/bone + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NEEDS_RETRACTED + abstract_type = /datum/surgery_step/bone + strict_access_requirement = FALSE + +////////////////////////////////////////////////////////////////// +// bone setting surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/bone/set_bone + name = "Set bone" + desc = "Sets a bone in it's correct position to be " + CODEX_LINK("mended", "repair bone") + "." + allowed_tools = list( + /obj/item/bonesetter = 100, + /obj/item/wrench = 75 + ) + min_duration = 3 SECONDS + max_duration = 6 SECONDS + pain_given =40 + delicate = 1 + +/datum/surgery_step/bone/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + + var/bone = affected.encased ? "\the [target]'s [affected.encased]" : "bones in [target]'s [affected.name]" + if(affected.encased == "skull") + user.visible_message(span_notice("[user] begins to piece [bone] back together with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + else + user.visible_message(span_notice("[user] begins to set [bone] in place with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/bone/set_bone/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + + var/bone = affected.encased ? "\the [target]'s [affected.encased]" : "bones in \the [target]'s [affected.name]" + + if (affected.check_bones() & CHECKBONES_BROKEN) + if(affected.encased == "skull") + user.visible_message(span_notice("[user] pieces [bone] back together with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + else + user.visible_message(span_notice("[user] sets [bone] in place with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.stage = 1 + else + user.visible_message("[span_notice("[user] sets [bone]")] [span_warning("in the WRONG place with [tool].")]", vision_distance = COMBAT_MESSAGE_RANGE) + affected.break_bones() + ..() + +/datum/surgery_step/bone/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + + user.visible_message(span_warning("[user]'s hand slips, damaging the [affected.encased ? affected.encased : "bones"] in [target]'s [affected.name] with [tool]!")) + affected.receive_damage(5) + affected.break_bones() + ..() + +////////////////////////////////////////////////////////////////// +// post setting bone-gelling surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/bone/finish + name = "Repair bone" + desc = "Mends a broken bone." + + surgery_flags = parent_type::surgery_flags | SURGERY_BLOODY_GLOVES + + allowed_tools = list( + /obj/item/stack/medical/bone_gel = 100, + /obj/item/stack/sticky_tape/surgical = 100, + /obj/item/stack/sticky_tape = 75 + ) + + can_infect = 1 + min_duration = 2 SECONDS + max_duration = 3 SECONDS + pain_given =20 + +/datum/surgery_step/bone/finish/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && (affected.bodypart_flags & BP_BROKEN_BONES)) + return affected + +/datum/surgery_step/bone/finish/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/bone = affected.encased ? "\the [target]'s damaged [affected.encased]" : "damaged bones in \the [target]'s [affected.name]" + user.visible_message(span_notice("[user] starts to finish mending [bone] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/bone/finish/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/bone = affected.encased ? "\the [target]'s damaged [affected.encased]" : "damaged bones in [target]'s [affected.name]" + user.visible_message(span_notice("[user] has mended [bone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.heal_bones() + ..() + +/datum/surgery_step/bone/finish/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!"), vision_distance = COMBAT_MESSAGE_RANGE) + ..() diff --git a/code/modules/surgery/new_surgery/brain_trauma.dm b/code/modules/surgery/new_surgery/brain_trauma.dm new file mode 100644 index 000000000000..4532e3afc1f8 --- /dev/null +++ b/code/modules/surgery/new_surgery/brain_trauma.dm @@ -0,0 +1,49 @@ +/datum/surgery_step/brain_trauma + name = "Repair brain trauma" + desc = "Repairs physiological and psychological damage to a patient's brain." + surgery_flags = SURGERY_NEEDS_DEENCASEMENT + allowed_tools = list( + TOOL_HEMOSTAT = 85, + TOOL_SCREWDRIVER = 35 + ) + +/datum/surgery_step/brain_trauma/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return + if(affected.body_zone == BODY_ZONE_HEAD) + return TRUE + +/datum/surgery_step/brain_trauma/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!target_brain) + to_chat(user, span_warning("[target] doesn't have a brain.")) + return FALSE + +/datum/surgery_step/brain_trauma/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + user.visible_message(span_notice("[user] begins to repair [target]'s brain."), vision_distance = COMBAT_MESSAGE_RANGE) + +/datum/surgery_step/brain_trauma/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/brain/brain = target.getorganslot(ORGAN_SLOT_BRAIN) + if(!brain) + return + if(target.mind?.has_antag_datum(/datum/antagonist/brainwashed)) + target.mind.remove_antag_datum(/datum/antagonist/brainwashed) + target.setOrganLoss(ORGAN_SLOT_BRAIN, target.getOrganLoss(ORGAN_SLOT_BRAIN) - 50) + target.cure_all_traumas(TRAUMA_RESILIENCE_SURGERY) + if(target.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) + to_chat(user, "[target]'s brain looks like it could be fixed further.") + ..() + +/datum/surgery_step/brain_trauma/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + if(target.getorganslot(ORGAN_SLOT_BRAIN)) + user.visible_message(span_warning("[user] screws up, scraping [target]'s brain!"), vision_distance = COMBAT_MESSAGE_RANGE) + if(target.stat < UNCONSCIOUS) + to_chat(target, span_userdanger("Your head throbs with horrible pain; thinking hurts!")) + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 60) + target.gain_trauma_type(BRAIN_TRAUMA_SEVERE, TRAUMA_RESILIENCE_SURGERY) + else + user.visible_message(span_warning("[user] suddenly notices that the brain [user.p_they()] [user.p_were()] working on is not there anymore."), vision_distance = COMBAT_MESSAGE_RANGE) diff --git a/code/modules/surgery/new_surgery/cavity.dm b/code/modules/surgery/new_surgery/cavity.dm new file mode 100644 index 000000000000..14a2676eacd1 --- /dev/null +++ b/code/modules/surgery/new_surgery/cavity.dm @@ -0,0 +1,254 @@ +//Procedures in this file: Putting items in body cavity. Implant removal. Items removal. + +////////////////////////////////////////////////////////////////// +// ITEM PLACEMENT SURGERY // +////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////// +// generic implant surgery step datum +////////////////////////////////////////////////////////////////// +/datum/surgery_step/cavity + pain_given =40 + delicate = 1 + surgery_flags = SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + abstract_type = /datum/surgery_step/cavity + +/datum/surgery_step/cavity/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message( + span_warning("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!"), + span_warning("Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!"), + vision_distance = COMBAT_MESSAGE_RANGE + ) + affected.receive_damage(20, sharpness = SHARP_EDGED|SHARP_POINTY) + ..() + +////////////////////////////////////////////////////////////////// +// create implant space surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/cavity/make_space + name = "Hollow out cavity" + desc = "Grants access to an internal cavity. Often used to gain access to a patient's internal organs." + allowed_tools = list( + TOOL_DRILL = 100, + /obj/item/pen = 75, + /obj/item/stack/rods = 50, + ) + min_duration = 3 SECONDS + max_duration = 4 SECONDS + +/datum/surgery_step/cavity/make_space/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.cavity_name && !affected.cavity) + return affected + +/datum/surgery_step/cavity/make_space/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts making some space inside [target]'s [affected.cavity_name] cavity with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/cavity/make_space/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] makes some space inside [target]'s [affected.cavity_name] cavity with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.cavity = TRUE + ..() + +////////////////////////////////////////////////////////////////// +// implant cavity sealing surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/cavity/close_space + name = "Close cavity" + desc = "Seals a patient's internal cavity, preventing access." + allowed_tools = list( + TOOL_CAUTERY = 100, + /obj/item/clothing/mask/cigarette = 75, + /obj/item/lighter = 50, + TOOL_WELDER = 25 + ) + min_duration = 3 SECONDS + max_duration = 4 SECONDS + + preop_sound = 'sound/surgery/cautery1.ogg' + success_sound = 'sound/surgery/cautery2.ogg' + +/datum/surgery_step/cavity/close_space/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.cavity) + return affected + +/datum/surgery_step/cavity/close_space/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts mending [target]'s [affected.cavity_name] cavity wall with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + ..() + +/datum/surgery_step/cavity/close_space/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] mends [target]'s [affected.cavity_name] cavity walls with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.cavity = FALSE + ..() + +////////////////////////////////////////////////////////////////// +// implanting surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/cavity/place_item + name = "Place item in cavity" + desc = "Inserts an object into a patient's cavity." + allowed_tools = list(/obj/item = 100) + min_duration = 4 SECONDS + max_duration = 6 SECONDS + + preop_sound = 'sound/surgery/organ1.ogg' + success_sound = 'sound/surgery/organ2.ogg' + +/datum/surgery_step/cavity/place_item/can_operate(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(istype(user,/mob/living/silicon/robot)) + return FALSE + . = ..() + +/datum/surgery_step/cavity/place_item/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.cavity && !isorgan(tool)) + return affected + +/datum/surgery_step/cavity/place_item/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected && affected.cavity) + var/max_volume = 7 * (affected.cavity_storage_max_weight -1) + if(tool.w_class > affected.cavity_storage_max_weight) + to_chat(user, span_warning("\The [tool] is too big for [affected.cavity_name] cavity.")) + return FALSE + + var/total_volume = (tool.w_class - 1) ** 2 + + for(var/obj/item/I in affected.cavity_items) + if(istype(I,/obj/item/implant)) + continue + total_volume += (tool.w_class - 1) ** 2 + + if(total_volume > max_volume) + to_chat(user, span_warning("There isn't enough space left in [affected.cavity_name] cavity for [tool].")) + return FALSE + return TRUE + +/datum/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts putting [tool] inside [target]'s [affected.cavity_name] cavity."), vision_distance = COMBAT_MESSAGE_RANGE) + + playsound(target.loc, 'sound/effects/squelch1.ogg', 25, 1) + ..() + +/datum/surgery_step/cavity/place_item/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(!user.transferItemToLoc(tool, affected)) + return + affected.add_cavity_item(tool) + + user.visible_message(span_notice("[user] puts \the [tool] inside [target]'s [affected.cavity_name] cavity."), vision_distance = COMBAT_MESSAGE_RANGE) + + if (tool.w_class == affected.cavity_storage_max_weight && prob(50) && IS_ORGANIC_LIMB(affected) && affected.set_sever_artery(TRUE)) + to_chat(user, span_warning("You tear some blood vessels trying to fit such a big object in this cavity.")) + target.bleed(15) + ..() + +////////////////////////////////////////////////////////////////// +// implant removal surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/cavity/implant_removal + name = "Remove foreign body" + desc = "Removes an object from the patient's cavity." + allowed_tools = list( + TOOL_HEMOSTAT = 100, + TOOL_WIRECUTTER = 75, + /obj/item/kitchen/fork = 20 + ) + min_duration = 4 SECONDS + max_duration = 6 SECONDS + + preop_sound = 'sound/surgery/hemostat1.ogg' + +/datum/surgery_step/cavity/implant_removal/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return FALSE + for(var/obj/item/I in affected.cavity_items) + if(!isorgan(I)) + return affected + +/datum/surgery_step/cavity/implant_removal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts poking around inside [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/cavity/implant_removal/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/exposed = 0 + if(affected.how_open() >= (affected.encased ? SURGERY_DEENCASED : SURGERY_RETRACTED)) + exposed = 1 + + if(!IS_ORGANIC_LIMB(affected) && affected.how_open() == SURGERY_DEENCASED) + exposed = 1 + + var/find_prob = 0 + var/list/loot = list() + + if(exposed) + loot = affected.cavity_items + else + for(var/datum/wound/wound in affected.wounds) + if(LAZYLEN(wound.embedded_objects)) + loot |= wound.embedded_objects + find_prob += 50 + + for(var/datum/component/embedded/E as anything in affected.GetComponents(/datum/component/embedded)) + if(E.harmful) + continue // handled by the above loop + find_prob += 10 + loot |= E.weapon + + if (length(loot)) + + var/obj/item/obj = pick(loot) + + if(istype(obj,/obj/item/implant)) + find_prob +=40 + else + find_prob +=50 + + if (prob(find_prob)) + user.visible_message(span_notice("[user] takes something out of incision on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + if(istype(obj, /obj/item/implant)) + var/obj/item/implant/I = obj + I.removed(target) + + if(!user.put_in_hands(obj)) + obj.forceMove(get_turf(target)) + + playsound(target.loc, 'sound/effects/squelch1.ogg', 15, 1) + + else + user.visible_message( + span_notice("[user] removes [tool] from [target]'s [affected.plaintext_zone]."), + span_notice("There's something inside [target]'s [affected.plaintext_zone], but you just missed it this time."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + + else + user.visible_message( + span_notice("[user] could not find anything inside [target]'s [affected.name], and pulls [tool] out."), + span_notice("You could not find anything inside [target]'s [affected.name]."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + ..() + +/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + ..() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + for(var/obj/item/implant/imp in affected.cavity_items) + var/fail_prob = 10 + fail_prob += 100 - tool_potency(tool) + if (prob(fail_prob)) + user.visible_message(span_warning("Something beeps inside [target]'s [affected.name]!"), vision_distance = COMBAT_MESSAGE_RANGE) + playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3) + spawn(25) + imp.activate() diff --git a/code/modules/surgery/new_surgery/dental_implant.dm b/code/modules/surgery/new_surgery/dental_implant.dm new file mode 100644 index 000000000000..5cefea935163 --- /dev/null +++ b/code/modules/surgery/new_surgery/dental_implant.dm @@ -0,0 +1,51 @@ +/datum/surgery_step/insert_pill + name = "Insert pill dental implant" + desc = "Implants a pill for the patient to activate by biting down hard." + allowed_tools = list( + /obj/item/reagent_containers/pill = 100 + ) + min_duration = 1 SECOND + max_duration = 3 SECONDS + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/insert_pill/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + user.visible_message(span_notice("[user] begins inserting [tool] into [target]'s tooth."), vision_distance = COMBAT_MESSAGE_RANGE) + +/datum/surgery_step/insert_pill/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!istype(tool, /obj/item/reagent_containers/pill)) //what + return FALSE + + user.transferItemToLoc(tool, target, TRUE) + + var/datum/action/item_action/hands_free/activate_pill/pill_action = new(tool) + pill_action.name = "Activate [tool.name]" + pill_action.build_all_button_icons() + pill_action.target = tool + pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it + + user.visible_message(span_notice("[user] inserts [tool] into [target]'s tooth."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/insert_pill/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!istype(tool, /obj/item/reagent_containers/pill)) //what + return + + var/obj/item/reagent_containers/pill/pill = tool + pill.on_consumption(target, user) + user.visible_message(span_warning("[pill] slips out of [user]'s hand, right down [target]'s throat!"), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/action/item_action/hands_free/activate_pill + name = "Activate Pill" + +/datum/action/item_action/hands_free/activate_pill/Trigger(trigger_flags) + if(!..()) + return FALSE + var/obj/item/item_target = target + to_chat(owner, span_notice("You grit your teeth and burst the implanted [item_target.name]!")) + log_combat(owner, null, "swallowed an implanted pill", target) + if(item_target.reagents.total_volume) + item_target.reagents.trans_to(owner, item_target.reagents.total_volume, transfered_by = owner, methods = INGEST) + qdel(target) + return TRUE diff --git a/code/modules/surgery/new_surgery/generic_organic.dm b/code/modules/surgery/new_surgery/generic_organic.dm new file mode 100644 index 000000000000..81e6d50cb9c5 --- /dev/null +++ b/code/modules/surgery/new_surgery/generic_organic.dm @@ -0,0 +1,298 @@ +/datum/surgery_step/generic_organic + can_infect = 1 + pain_given =10 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP + abstract_type = /datum/surgery_step/generic_organic + +/datum/surgery_step/generic_organic/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(target_zone != BODY_ZONE_PRECISE_EYES) //there are specific steps for eye surgery + return ..() + + +////////////////////////////////////////////////////////////////// +// laser scalpel surgery step +// acts as both cutting and bleeder clamping surgery steps +////////////////////////////////////////////////////////////////// +/datum/surgery_step/generic_organic/laser_incise + name = "Make laser incision" + desc = "Creates an incision on a patient without causing bleeding." + allowed_tools = list( + /obj/item/scalpel/advanced = 100, + /obj/item/melee/energy/sword = 5 + ) + min_duration = 2 SECONDS + max_duration = 4 SECONDS + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/scalpel2.ogg' + failure_sound = 'sound/surgery/organ2.ogg' + +/datum/surgery_step/generic_organic/laser_incise/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts the bloodless incision on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + return ..() + +/datum/surgery_step/generic_organic/laser_incise/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has made a bloodless incision on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.create_wound(WOUND_CUT, affected.minimum_break_damage/2, TRUE) + affected.clamp_wounds() + //spread_germs_to_organ(affected, user) + ..() + +/datum/surgery_step/generic_organic/laser_incise/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(15, 5, sharpness = SHARP_EDGED|SHARP_POINTY) + ..() + +////////////////////////////////////////////////////////////////// +// scalpel surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/generic_organic/incise + name = "Make incision" + desc = "Creates a surgerical cut on a patient, can be widened to operate deeper in their body." + allowed_tools = list( + TOOL_SCALPEL = 100, + /obj/item/knife = 75, + /obj/item/broken_bottle = 50, + /obj/item/shard = 50 + ) + min_duration = 3 SECONDS + max_duration = 5.5 SECONDS + preop_sound = 'sound/surgery/scalpel1.ogg' + success_sound = 'sound/surgery/scalpel2.ogg' + failure_sound = 'sound/surgery/organ2.ogg' + + var/fail_string = "slicing open" + var/access_string = "an incision" + +/datum/surgery_step/generic_organic/incise/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + if(.) + var/obj/item/bodypart/affected = . + if(affected.how_open()) + var/datum/wound/cut/incision = affected.get_incision() + to_chat(user, span_notice("The [incision.desc] provides enough access to the [affected.plaintext_zone].")) + return FALSE + +/datum/surgery_step/generic_organic/incise/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts [access_string] on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/generic_organic/incise/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has made [access_string] on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.create_wound(WOUND_CUT, affected.minimum_break_damage/2, TRUE) + playsound(target.loc, 'sound/weapons/bladeslice.ogg', 15, 1) + ..() + +/datum/surgery_step/generic_organic/incise/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, [fail_string] \the [target]'s [affected.plaintext_zone] in the wrong place with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(10, sharpness = SHARP_EDGED|SHARP_POINTY) + ..() + +////////////////////////////////////////////////////////////////// +// bleeder clamping surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/generic_organic/clamp_bleeders + name = "Clamp bleeders" + desc = "Clamps bleeding tissue to prevent blood loss during an operation." + allowed_tools = list( + TOOL_HEMOSTAT = 100, + /obj/item/stack/cable_coil = 75, + /obj/item/assembly/mousetrap = 20 + ) + min_duration = 3 SECONDS + max_duration = 5 SECONDS + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_INCISION + strict_access_requirement = FALSE + preop_sound = 'sound/surgery/hemostat1.ogg' + +/datum/surgery_step/generic_organic/clamp_bleeders/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && !affected.clamped()) + return affected + +/datum/surgery_step/generic_organic/clamp_bleeders/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts clamping bleeders in [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/generic_organic/clamp_bleeders/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] clamps bleeders in [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.clamp_wounds() + //spread_germs_to_organ(affected, user) + ..() + + +////////////////////////////////////////////////////////////////// +// retractor surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/generic_organic/retract_skin + name = "Widen incision" + desc = "Retracts the flesh of a patient to grant access to deeper portions of the body." + allowed_tools = list( + TOOL_RETRACTOR = 100, + TOOL_CROWBAR = 75, + /obj/item/knife = 50, + /obj/item/kitchen/fork = 50 + ) + min_duration = 3 SECONDS + max_duration = 5 SECONDS + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_INCISION | SURGERY_BLOODY_GLOVES + strict_access_requirement = TRUE + preop_sound = 'sound/surgery/retractor1.ogg' + success_sound = 'sound/surgery/retractor2.ogg' + +/datum/surgery_step/generic_organic/retract_skin/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = FALSE + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected) + if(affected.how_open() >= SURGERY_RETRACTED) + var/datum/wound/cut/incision = affected.get_incision() + to_chat(user, span_notice("The [incision.desc] provides enough access, a larger incision isn't needed.")) + else + . = TRUE + +/datum/surgery_step/generic_organic/retract_skin/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts to pry open the incision on [target]'s [affected.plaintext_zone] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/generic_organic/retract_skin/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] keeps the incision open on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.open_incision() + ..() + +/datum/surgery_step/generic_organic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(12, sharpness = SHARP_EDGED|SHARP_POINTY) + ..() + +////////////////////////////////////////////////////////////////// +// skin cauterization surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/generic_organic/cauterize + name = "Cauterize incision" + desc = "Mends any surgical incisions on a patient's limb." + allowed_tools = list( + TOOL_CAUTERY = 100, + /obj/item/clothing/mask/cigarette = 75, + /obj/item/lighter = 50, + TOOL_WELDER = 25 + ) + min_duration = 4 SECONDS + max_duration = 6 SECONDS + surgery_flags = SURGERY_NO_ROBOTIC + preop_sound = 'sound/surgery/cautery1.ogg' + success_sound = 'sound/surgery/cautery2.ogg' + + var/cauterize_term = "cauterize" + var/post_cauterize_term = "cauterized" + +/datum/surgery_step/generic_organic/cauterize/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = FALSE + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected) + if(affected.is_stump) + if(affected.bodypart_flags & BP_ARTERY_CUT) + . = TRUE + else + to_chat(user, span_warning("There is no bleeding to repair within this stump.")) + else if(!affected.get_incision(1)) + to_chat(user, span_warning("There are no incisions on [target]'s [affected.plaintext_zone] that can be closed cleanly with \the [tool]!")) + else + . = TRUE + +/datum/surgery_step/generic_organic/cauterize/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected) + if(affected.is_stump) + if(affected.bodypart_flags & BP_ARTERY_CUT) + return affected + else if(affected.how_open()) + return affected + +/datum/surgery_step/generic_organic/cauterize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/datum/wound/W = affected.get_incision() + user.visible_message(span_notice("[user] begins to [cauterize_term][W ? " \a [W.desc] on" : ""] \the [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/generic_organic/cauterize/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/datum/wound/W = affected.get_incision() + user.visible_message(span_notice("[user] [post_cauterize_term][W ? " \a [W.desc] on" : ""] \the [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + if(istype(W)) + W.close_wound() + + if(affected.is_stump) + affected.set_sever_artery(FALSE) + + if(affected.clamped()) + affected.remove_clamps() + ..() + +/datum/surgery_step/generic_organic/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, damaging [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(0, 3) + ..() + + +////////////////////////////////////////////////////////////////// +// limb amputation surgery step +////////////////////////////////////////////////////////////////// + +/datum/surgery_step/generic_organic/amputate + name = "Amputate limb" + desc = "Removes a patient's limb." + allowed_tools = list( + TOOL_SAW = 100, + /obj/item/fireaxe = 95, + /obj/item/hatchet = 75, + /obj/item/knife/butcher = 40, + /obj/item/knife = 20 + ) + min_duration = 11 SECONDS + max_duration = 16 SECONDS + surgery_flags = NONE + pain_given = PAIN_AMT_AGONIZING + 30 + + preop_sound = list( + /obj/item/circular_saw = 'sound/surgery/saw.ogg', + /obj/item/fireaxe = 'sound/surgery/scalpel1.ogg', + /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', + /obj/item/knife = 'sound/surgery/scalpel1.ogg', + ) + success_sound = 'sound/surgery/organ2.ogg' + +/datum/surgery_step/generic_organic/amputate/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && (affected.dismemberable) && !affected.how_open() && !(target_zone == BODY_ZONE_CHEST)) + return affected + +/datum/surgery_step/generic_organic/amputate/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone, TRUE) + user.visible_message(span_notice("[user] begins to amputate [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/generic_organic/amputate/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone, TRUE) + user.visible_message(span_notice("[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.dismember(DROPLIMB_EDGE, clean = TRUE) + ..() + +/datum/surgery_step/generic_organic/amputate/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone, TRUE) + user.visible_message(span_warning("[user]'s hand slips, sawing through the bone in [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(30, sharpness = SHARP_EDGED|SHARP_POINTY) + affected.break_bones() + ..() diff --git a/code/modules/surgery/new_surgery/internal_organs.dm b/code/modules/surgery/new_surgery/internal_organs.dm new file mode 100644 index 000000000000..60ba71b7582f --- /dev/null +++ b/code/modules/surgery/new_surgery/internal_organs.dm @@ -0,0 +1,516 @@ +//Procedures in this file: internal organ surgery, removal, transplants +////////////////////////////////////////////////////////////////// +// INTERNAL ORGANS // +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal + can_infect = 1 + pain_given = 40 + delicate = 1 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT | SURGERY_BLOODY_GLOVES + abstract_type = /datum/surgery_step/internal + +////////////////////////////////////////////////////////////////// +// Organ mending surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/fix_organ + name = "Repair internal organ" + desc = "Repairs damage to a patient's internal organ." + allowed_tools = list( + /obj/item/stack/medical/suture = 100, + /obj/item/stack/medical/bruise_pack = 100, + /obj/item/stack/sticky_tape = 20 + ) + min_duration = 3 SECONDS + max_duration = 5 SECONDS + +/datum/surgery_step/internal/fix_organ/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return + + for(var/obj/item/organ/I in affected.contained_organs) + if(istype(I, /obj/item/organ/brain)) + continue + if(!(I.organ_flags & (ORGAN_SYNTHETIC)) && I.damage > 0) + return TRUE + +/datum/surgery_step/internal/fix_organ/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/list/organs = list() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + for(var/obj/item/organ/I in affected.contained_organs) + if(istype(I, /obj/item/organ/brain)) + continue + if(!(I.organ_flags & (ORGAN_SYNTHETIC)) && I.damage > 0) + organs[I.name] = I.slot + + var/obj/item/organ/O + var/organ_to_replace = -1 + while(organ_to_replace == -1) + organ_to_replace = input(user, "Which organ do you want to repair?") as null|anything in organs + if(!organ_to_replace) + break + O = organs[organ_to_replace] + if(!O.can_recover()) + to_chat(user, span_warning("[O] is too far gone, it cannot be salvaged.")) + organ_to_replace = -1 + continue + // You need to treat the necrotization, bro + if(O.organ_flags & ORGAN_DEAD) + to_chat(user, span_warning("[O] is decayed, you must replace it or perform Treat Necrosis.")) + continue + + return list(organ_to_replace, O) + +/datum/surgery_step/internal/fix_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/tool_name = "\the [tool]" + if (istype(tool, /obj/item/stack/medical/bruise_pack)) + tool_name = "the bandaid" + + user.visible_message(span_notice("[user] starts treating damage to [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool_name]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/fix_organ/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/tool_name = "\the [tool]" + if (istype(tool, /obj/item/stack/medical/bruise_pack)) + tool_name = "the bandaid" + + var/obj/item/organ/O = target.getorganslot((LAZYACCESS(target.surgeries_in_progress, target_zone))[2]) + if(!O) + return + if(!O.can_recover()) + to_chat(user, span_warning("[O] is too far gone, it cannot be salvaged.")) + return ..() + + O.surgically_fix(user) + user.visible_message(span_notice("[user] finishes treating damage to [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool_name]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/fix_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + var/dam_amt = 2 + + dam_amt = 5 + target.adjustToxLoss(10) + affected.receive_damage(dam_amt, sharpness = SHARP_EDGED|SHARP_POINTY) + + for(var/obj/item/organ/I in affected.contained_organs) + if(I.damage > 0 && !(I.organ_flags & ORGAN_SYNTHETIC) && (affected.how_open() >= (affected.encased ? SURGERY_DEENCASED : SURGERY_RETRACTED))) + I.applyOrganDamage(dam_amt) + ..() + +////////////////////////////////////////////////////////////////// +// Organ detatchment surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/detach_organ + name = "Detach organ" + desc = "Detaches a patient's organ from their body, leaving it stranded in their chest cavity for removal." + allowed_tools = list( + TOOL_SCALPEL = 100, + /obj/item/shard = 50 + ) + min_duration = 90 + max_duration = 110 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/internal/detach_organ/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/list/attached_organs = list() + + for(var/obj/item/organ/I in affected.contained_organs) + if(I.organ_flags & ORGAN_UNREMOVABLE) + continue + attached_organs[I.name] = I.slot + + if(!length(attached_organs)) + to_chat(user, span_warning("There are no appropriate internal components to decouple.")) + return FALSE + + var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs + if(organ_to_remove) + return list(organ_to_remove,attached_organs[organ_to_remove]) + +/datum/surgery_step/internal/detach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] starts to separate [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/detach_organ/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] has separated [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + var/obj/item/organ/I = target.getorganslot((LAZYACCESS(target.surgeries_in_progress, target_zone))[2]) + if(istype(I)) + I.cut_away() + ..() + +/datum/surgery_step/internal/detach_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected.check_artery() & CHECKARTERY_OK) + user.visible_message(span_warning("[user]'s hand slips, slicing an artery inside [target]'s [affected.plaintext_zone] with \the [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.set_sever_artery(TRUE) + affected.receive_damage(rand(10,15), sharpness = SHARP_EDGED|SHARP_POINTY) + else + user.visible_message(span_warning("[user]'s hand slips, slicing up inside [target]'s [affected.plaintext_zone] with \the [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(rand(15, 25), sharpness = SHARP_EDGED|SHARP_POINTY) + ..() + +////////////////////////////////////////////////////////////////// +// Organ removal surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/remove_organ + name = "Remove internal organ" + desc = "Retrieves an organ from a patient's cavity." + allowed_tools = list( + TOOL_HEMOSTAT = 100, + /obj/item/wirecutters = 75, + /obj/item/knife = 75, + /obj/item/kitchen/fork = 20 + ) + min_duration = 60 + max_duration = 80 + +/datum/surgery_step/internal/remove_organ/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/list/removable_organs = list() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + for(var/obj/item/organ/I in affected.cavity_items) + if (I.organ_flags & ORGAN_CUT_AWAY) + removable_organs[I.name] = REF(I) + + if(!length(removable_organs)) + to_chat(user, span_warning("You cannot find any organs to remove.")) + return + + var/organ_to_remove= input(user, "Which organ do you want to remove?") as null|anything in removable_organs + if(organ_to_remove) + return list(organ_to_remove, removable_organs[organ_to_remove]) + +/datum/surgery_step/internal/remove_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("\The [user] starts removing [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/remove_organ/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/obj/item/organ/O = locate((LAZYACCESS(target.surgeries_in_progress, target_zone))[2]) in affected.cavity_items + if(!O) + return + + user.visible_message(span_notice("[user] has removed [target]'s [O.name] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + if(istype(O) && istype(affected)) + affected.remove_cavity_item(O) + if(!user.put_in_hands(O)) + O.forceMove(target.drop_location()) + + ..() + +/datum/surgery_step/internal/remove_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, damaging [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(20, sharpness = tool.sharpness) + ..() + +////////////////////////////////////////////////////////////////// +// Organ inserting surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/replace_organ + name = "Replace internal organ" + desc = "Places an organ into the patient's cavity, where it is able to be attached to them." + allowed_tools = list( + /obj/item/organ = 100 + ) + min_duration = 60 + max_duration = 80 + var/robotic_surgery = FALSE + +/datum/surgery_step/internal/replace_organ/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = FALSE + var/obj/item/organ/O = tool + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + + if(istype(O) && istype(affected)) + var/o_is = (O.gender == PLURAL) ? "are" : "is" + var/o_a = (O.gender == PLURAL) ? "" : "a " + if(O.w_class > affected.cavity_storage_max_weight) + to_chat(user, span_warning("\The [O.name] [o_is] too big for [affected.cavity_name] cavity!")) + else + var/obj/item/organ/I = target.getorganslot(O.slot) + if(I) + to_chat(user, span_warning("\The [target] already has [o_a][O.name].")) + else + . = TRUE + +/datum/surgery_step/internal/replace_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts [robotic_surgery ? "reinstalling" : "transplanting"] [tool] into [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/replace_organ/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("\The [user] has [robotic_surgery ? "reinstalled" : "transplanted"] [tool] into [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + + var/obj/item/organ/O = tool + if(istype(O) && user.transferItemToLoc(O, target)) + affected.add_cavity_item(O) //move the organ into the patient. The organ is properly reattached in the next step + + if(!(O.organ_flags & ORGAN_CUT_AWAY)) + stack_trace("[user] ([user.ckey]) replaced organ [O.type], which didn't have ORGAN_CUT_AWAY set, in [target] ([target.ckey])") + O.organ_flags |= ORGAN_CUT_AWAY + ..() + +/datum/surgery_step/internal/replace_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_warning("[user]'s hand slips, damaging \the [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + var/obj/item/organ/I = tool + if(istype(I)) + I.applyOrganDamage(rand(3,5)) + ..() + +////////////////////////////////////////////////////////////////// +// Organ attachment surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/attach_organ + name = "Attach internal organ" + desc = "Connects an organ to the patient's body, allowing them to utilize it." + allowed_tools = list( + /obj/item/fixovein = 100, + /obj/item/stack/cable_coil = 75, + /obj/item/stack/sticky_tape = 50 + ) + min_duration = 100 + max_duration = 120 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/internal/attach_organ/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + + var/list/attachable_organs = list() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/obj/item/organ/O + for(var/obj/item/organ/I in affected.cavity_items) + if((I.organ_flags & ORGAN_CUT_AWAY)) + attachable_organs[I.name] = REF(I) + + if(!length(attachable_organs)) + return FALSE + + var/obj/item/organ/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in attachable_organs + if(!organ_to_replace) + return FALSE + + organ_to_replace = locate(attachable_organs[organ_to_replace]) in affected.cavity_items + + if((deprecise_zone(organ_to_replace.zone) != affected.body_zone)) + to_chat(user, span_warning("You can't find anywhere to attach \the [organ_to_replace] to!")) + return FALSE + + O = locate(attachable_organs[organ_to_replace]) in affected.cavity_items + if(O) + to_chat(user, span_warning("\The [target] already has \a [O].")) + return FALSE + + return list(organ_to_replace, attachable_organs[organ_to_replace.name]) + +/datum/surgery_step/internal/attach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_warning("[user] begins reattaching [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/attach_organ/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/obj/item/organ/I = locate(LAZYACCESS(target.surgeries_in_progress, target_zone)[2]) in affected.cavity_items + if(!I) + return + + user.visible_message(span_notice("[user] has reattached [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + if(istype(I) && affected && deprecise_zone(I.zone) == affected.body_zone && (I in affected.cavity_items)) + affected.remove_cavity_item(I) + I.Insert(target) + ..() + +/datum/surgery_step/internal/attach_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, damaging the flesh in [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/brain_revival + name = "Brain revival" + desc = "Utilizes the incredible power of Alkysine to restore the spark of life." + + min_duration = 100 + max_duration = 150 + + surgery_flags = SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT | SURGERY_CANNOT_FAIL + +/datum/surgery_step/internal/brain_revival/tool_potency(obj/item/tool) + if(!tool.reagents) + return 0 + + if(!(tool.reagents.flags & (OPENCONTAINER))) + return 0 + + return 100 + +/datum/surgery_step/internal/brain_revival/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = ..() + if(!BP) + return + if(target_zone != BODY_ZONE_HEAD) + return + var/obj/item/organ/brain/B = locate() in BP.contained_organs + if(!(B?.organ_flags & ORGAN_DEAD)) + return + + return TRUE + +/datum/surgery_step/internal/brain_revival/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = FALSE + + var/obj/item/reagent_containers/glass/S = tool + if(!S.reagents.has_reagent(/datum/reagent/medicine/alkysine, 5)) + to_chat(user, span_warning("\The [S] doesn't contain enough alkysine!")) + return + + var/obj/item/bodypart/head/head = target.get_bodypart(BODY_ZONE_HEAD) + if(!locate(/obj/item/organ/brain) in head) + to_chat(user, span_warning("\The [S] doesn't contain a brain to repair!")) + return + + return TRUE + +/datum/surgery_step/internal/brain_revival/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user] begins pouring [tool] into [target]'s [affected]..."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/internal/brain_revival/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!tool.reagents.has_reagent(/datum/reagent/medicine/alkysine, 5)) + return + + var/obj/item/bodypart/head/head = target.get_bodypart(BODY_ZONE_HEAD) + var/obj/item/organ/brain/brain = locate() in head?.contained_organs + if(!head || !brain) + return + + tool.reagents.remove_reagent(/datum/reagent/medicine/alkysine, 5) + brain.setOrganDamage(0) + ..() + +////////////////////////////////////////////////////////////////// +// Peridaxon necrosis treatment surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/internal/treat_necrosis + name = "Treat necrosis" + desc = "Utilizes the restorative power of even the slightest amount of Peridaxon to restore functionality to an organ." + + surgery_flags = parent_type::surgery_flags & ~SURGERY_BLOODY_GLOVES + + can_infect = FALSE + + min_duration = 5 SECONDS + max_duration = 6 SECONDS + +/datum/surgery_step/internal/treat_necrosis/tool_potency(obj/item/tool) + if(!tool.reagents) + return 0 + + if(!(tool.reagents.flags & OPENCONTAINER)) + return 0 + + return 100 + +/datum/surgery_step/internal/treat_necrosis/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return + + for(var/obj/item/organ/O as anything in affected.contained_organs) + if((O.organ_flags & ORGAN_DEAD) && !(O.organ_flags & ORGAN_SYNTHETIC)) + return affected + +/datum/surgery_step/internal/treat_necrosis/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!..()) + return FALSE + + if(!tool.reagents.has_reagent(/datum/reagent/medicine/peridaxon)) + to_chat(user, span_warning("[tool] does not contain any peridaxon.")) + return FALSE + + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/list/obj/item/organ/dead_organs = list() + + for(var/obj/item/organ/I in affected.contained_organs) + if(!(I.organ_flags & (ORGAN_CUT_AWAY|ORGAN_SYNTHETIC)) && (I.organ_flags & ORGAN_DEAD)) + dead_organs[I.name] = I + + if(!length(dead_organs)) + to_chat(user, span_warning("[target.name] does not have any dead organs.")) + return FALSE + + var/obj/item/organ/O + var/organ_to_fix = -1 + while(organ_to_fix == -1) + organ_to_fix = input(user, "Which organ do you want to repair?") as null|anything in dead_organs + if(!organ_to_fix) + break + O = dead_organs[organ_to_fix] + + if(!O.can_recover()) + to_chat(user, span_warning("The [organ_to_fix] is necrotic and can't be saved, it will need to be replaced.")) + organ_to_fix = -1 + continue + + if(O.damage >= O.maxHealth) + to_chat(user, span_warning("The [organ_to_fix] needs to be repaired before it is regenerated.")) + organ_to_fix = -1 + continue + + if(organ_to_fix) + return list(organ_to_fix, dead_organs[organ_to_fix]) + +/datum/surgery_step/internal/treat_necrosis/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message( + span_notice("[user] starts applying medication to the affected tissue in [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with \the [tool]."), + span_notice("You start applying medication to the affected tissue in [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with \the [tool]."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + target.apply_pain(50, target_zone) + ..() + +/datum/surgery_step/internal/treat_necrosis/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/affected = LAZYACCESS(target.surgeries_in_progress, target_zone)[2] + + var/transfer_amount + if(is_reagent_container(tool)) + var/obj/item/reagent_containers/container = tool + transfer_amount = container.amount_per_transfer_from_this + else + transfer_amount = tool.reagents.total_volume + + var/rejuvenate = tool.reagents.has_reagent(/datum/reagent/medicine/peridaxon) + var/transered_amount = tool.reagents.trans_to(target, transfer_amount, methods = INJECT) + if(transered_amount > 0) + if(rejuvenate) + affected.set_organ_dead(FALSE) + + user.visible_message( + span_notice("[user] applies [transered_amount] unit\s of the solution to affected tissue in [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]]."), + span_notice("You apply [transered_amount] unit\s of the solution to affected tissue in [target]'s [LAZYACCESS(target.surgeries_in_progress, target_zone)[1]] with \the [tool]."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + ..() + +/datum/surgery_step/internal/treat_necrosis/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + + var/transfer_amount + if(is_reagent_container(tool)) + var/obj/item/reagent_containers/container = tool + transfer_amount = container.amount_per_transfer_from_this + else + transfer_amount = tool.reagents.total_volume + + var/trans = tool.reagents.trans_to(target, transfer_amount, methods = INJECT) + + user.visible_message( + span_warning("[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!"), + span_warning("Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!"), + vision_distance = COMBAT_MESSAGE_RANGE + ) + ..() diff --git a/code/modules/surgery/new_surgery/other.dm b/code/modules/surgery/new_surgery/other.dm new file mode 100644 index 000000000000..4a3451dfcf6a --- /dev/null +++ b/code/modules/surgery/new_surgery/other.dm @@ -0,0 +1,85 @@ +//Procedures in this file: Internal wound patching, Implant removal. +////////////////////////////////////////////////////////////////// +// INTERNAL WOUND PATCHING // +////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////// +// Tendon fix surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/fix_tendon + name = "Repair tendon" + desc = "Repairs the tendon of a patient's limb." + allowed_tools = list( + /obj/item/fixovein = 100, + /obj/item/stack/cable_coil = 75, + /obj/item/stack/sticky_tape = 50 + ) + can_infect = 1 + min_duration = 5 SECONDS + max_duration = 8 SECONDS + pain_given =40 + delicate = 1 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_RETRACTED | SURGERY_BLOODY_GLOVES + +/datum/surgery_step/fix_tendon/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && (affected.bodypart_flags & BP_TENDON_CUT)) + return affected + +/datum/surgery_step/fix_tendon/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts reattaching the damaged [affected.tendon_name] in [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/fix_tendon/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has reattached the [affected.tendon_name] in [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.set_sever_tendon(FALSE) + ..() + +/datum/surgery_step/fix_tendon/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.plaintext_zone]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(5, sharpness = tool.sharpness) + ..() + +////////////////////////////////////////////////////////////////// +// IB fix surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/fix_vein + name = "Repair arterial bleeding" + desc = "Stops bleeding from an artery in a patient's limb." + allowed_tools = list( + /obj/item/fixovein = 100, + /obj/item/stack/cable_coil = 75, + /obj/item/stack/sticky_tape = 50 + ) + can_infect = 1 + min_duration = 5 SECONDS + max_duration = 8 SECONDS + pain_given =40 + delicate = 1 + strict_access_requirement = FALSE + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_RETRACTED | SURGERY_BLOODY_BODY + +/datum/surgery_step/fix_vein/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && (affected.bodypart_flags & BP_ARTERY_CUT)) + return affected + +/datum/surgery_step/fix_vein/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts patching the damaged [affected.artery_name] in [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/fix_vein/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has patched the [affected.artery_name] in [target]'s [affected.plaintext_zone] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.set_sever_artery(FALSE) + ..() + +/datum/surgery_step/fix_vein/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.plaintext_zone]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(5, sharpness = tool.sharpness) + ..() diff --git a/code/modules/surgery/new_surgery/reattach_limb.dm b/code/modules/surgery/new_surgery/reattach_limb.dm new file mode 100644 index 000000000000..c297a9bcb0b4 --- /dev/null +++ b/code/modules/surgery/new_surgery/reattach_limb.dm @@ -0,0 +1,98 @@ +//Procedures in this file: Robotic limbs attachment, meat limbs attachment +////////////////////////////////////////////////////////////////// +// LIMB SURGERY // +////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////// +// generic limb surgery step datum +////////////////////////////////////////////////////////////////// +/datum/surgery_step/limb + can_infect = 0 + delicate = 1 + abstract_type = /datum/surgery_step/limb + +/datum/surgery_step/limb/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return TRUE + +////////////////////////////////////////////////////////////////// +// limb attachment surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/limb/attach + name = "Attach limb" + desc = "Affixes a limb to a patient, where it can then be " + CODEX_LINK("connected", "connect limb") + "." //String interpolation isn't const folded + allowed_tools = list(/obj/item/bodypart = 100) + min_duration = 50 + max_duration = 70 + +/datum/surgery_step/limb/attach/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + if(BP) + to_chat(user, span_warning("There is already [BP.plaintext_zone]!")) + return FALSE + return TRUE + +/datum/surgery_step/limb/attach/can_operate(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + if(.) + var/obj/item/bodypart/BP = tool + var/obj/item/bodypart/chest/mob_chest = target.get_bodypart(BODY_ZONE_CHEST) + if(!(mob_chest.acceptable_bodytype & BP.bodytype)) + return FALSE + +/datum/surgery_step/limb/attach/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = tool + user.visible_message(span_notice("[user] starts attaching the [BP.plaintext_zone] to [target]'s [BP.amputation_point]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/limb/attach/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(!user.temporarilyRemoveItemFromInventory(tool)) + return + var/obj/item/bodypart/BP = tool + user.visible_message(span_notice("[user] has attached the [BP.plaintext_zone] to [target]'s [BP.amputation_point]."), vision_distance = COMBAT_MESSAGE_RANGE) + BP.attach_limb(target) + ..() + +/datum/surgery_step/limb/attach/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone, TRUE) + user.visible_message(span_warning("[user]'s hand slips, damaging [target]'s [BP.amputation_point]!"), vision_distance = COMBAT_MESSAGE_RANGE) + target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, sharpness = SHARP_EDGED) + ..() + +////////////////////////////////////////////////////////////////// +// limb connecting surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/limb/connect + name = "Connect limb" + desc = "Connects a limb to a patient's nervous system, granting them the ability to use it." + allowed_tools = list( + /obj/item/fixovein = 100, + /obj/item/stack/cable_coil = 75, + ) + can_infect = 1 + min_duration = 10 SECONDS + max_duration = 12 SECONDS + pain_given = PAIN_AMT_AGONIZING //THEMS ARE NERVES + +/datum/surgery_step/limb/connect/can_operate(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(..()) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + return BP && !BP.is_stump && (BP.bodypart_flags & BP_CUT_AWAY) + +/datum/surgery_step/limb/connect/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts connecting tendons and muscles in [target]'s [BP.amputation_point] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/limb/connect/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has connected tendons and muscles in [target]'s [BP.amputation_point] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + BP.bodypart_flags &= ~BP_CUT_AWAY + BP.update_disabled() + ..() + +/datum/surgery_step/limb/connect/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/BP = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, damaging [target]'s [BP.amputation_point]!"), vision_distance = COMBAT_MESSAGE_RANGE) + target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, sharpness = tool.sharpness) + ..() diff --git a/code/modules/surgery/new_surgery/remove_embedded.dm b/code/modules/surgery/new_surgery/remove_embedded.dm new file mode 100644 index 000000000000..e205e5832ccd --- /dev/null +++ b/code/modules/surgery/new_surgery/remove_embedded.dm @@ -0,0 +1,34 @@ +/datum/surgery_step/remove_embedded_item + name = "Remove embedded item" + desc = "Removes an object embedded at the surface of a patient's flesh." + allowed_tools = list( + TOOL_HEMOSTAT = 100, + TOOL_WIRECUTTER = 50, + TOOL_CROWBAR = 30, + /obj/item/kitchen/fork = 20 + ) + min_duration = 0 + max_duration = 0 + +/datum/surgery_step/remove_embedded_item/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + if(!.) + return + var/obj/item/bodypart/affected = . + if(!length(affected.embedded_objects)) + return FALSE + +/datum/surgery_step/remove_embedded_item/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/obj/item/embedded = input(user, "Remove embedded item", "Surgery") as null|anything in affected.embedded_objects + if(!embedded) + return + + if(!user.put_in_hands(embedded)) + embedded.forceMove(user.drop_location()) + + user.visible_message( + span_notice("[user] pulls [embedded] from [target]'s [affected.plaintext_zone]."), + vision_distance = COMBAT_MESSAGE_RANGE + ) + ..() diff --git a/code/modules/surgery/new_surgery/ribcage.dm b/code/modules/surgery/new_surgery/ribcage.dm new file mode 100644 index 000000000000..b403808e8092 --- /dev/null +++ b/code/modules/surgery/new_surgery/ribcage.dm @@ -0,0 +1,53 @@ +//Procedures in this file: Generic ribcage opening steps, Removing alien embryo, Fixing internal organs. +////////////////////////////////////////////////////////////////// +// GENERIC RIBCAGE SURGERY // +////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////// +// generic ribcage surgery step datum +////////////////////////////////////////////////////////////////// +/datum/surgery_step/open_encased + name = "Saw through bone" + desc = "Surgerically fractures the bones of a patient's limb, granting access to any organs underneath." + allowed_tools = list( + TOOL_SAW = 100, + /obj/item/knife = 50, + /obj/item/hatchet = 75 + ) + can_infect = 1 + min_duration = 5 SECONDS + max_duration = 7 SECONDS + pain_given = PAIN_AMT_AGONIZING + delicate = 1 + surgery_flags = SURGERY_NO_ROBOTIC | SURGERY_NO_STUMP | SURGERY_NEEDS_RETRACTED | SURGERY_BLOODY_BODY + strict_access_requirement = TRUE + + preop_sound = list( + /obj/item/circular_saw = 'sound/surgery/saw.ogg', + /obj/item/fireaxe = 'sound/surgery/scalpel1.ogg', + /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', + /obj/item/knife = 'sound/surgery/scalpel1.ogg', + ) + +/datum/surgery_step/open_encased/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.encased) + return affected + +/datum/surgery_step/open_encased/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] begins to cut through [target]'s [affected.encased] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/open_encased/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has cut [target]'s [affected.encased] open with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.break_bones(FALSE) + ..() + +/datum/surgery_step/open_encased/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(15, sharpness = SHARP_EDGED|SHARP_POINTY) + affected.break_bones() + ..() diff --git a/code/modules/surgery/new_surgery/robotics.dm b/code/modules/surgery/new_surgery/robotics.dm new file mode 100644 index 000000000000..94722e827fa3 --- /dev/null +++ b/code/modules/surgery/new_surgery/robotics.dm @@ -0,0 +1,347 @@ +/datum/surgery_step/robotics + can_infect = 0 + surgery_flags = SURGERY_NO_FLESH | SURGERY_NO_STUMP + abstract_type = /datum/surgery_step/robotics + +/datum/surgery_step/robotics/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && !(affected.bodypart_flags & BP_CUT_AWAY)) + return affected + +/datum/surgery_step/internal/remove_organ/robotic + name = "Remove robotic component" + can_infect = 0 + surgery_flags = SURGERY_NO_FLESH | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/internal/replace_organ/robotic + name = "Replace robotic component" + can_infect = 0 + robotic_surgery = TRUE + surgery_flags = SURGERY_NO_FLESH | SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +////////////////////////////////////////////////////////////////// +// unscrew robotic limb hatch surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/unscrew_hatch + name = "Screw/Unscrew maintenance hatch" + allowed_tools = list( + TOOL_SCREWDRIVER = 100, + /obj/item/coin = 50, + /obj/item/knife = 50 + ) + min_duration = 4 SECONDS + max_duration = 6 SECONDS + + success_sound = 'sound/items/screwdriver.ogg' + +/datum/surgery_step/robotics/unscrew_hatch/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.hatch_state != HATCH_OPENED) + return affected + +/datum/surgery_step/robotics/unscrew_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts to [affected.hatch_state == HATCH_CLOSED ? "unscrew" : "screw"] the maintenance hatch on [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/unscrew_hatch/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] has [affected.hatch_state == HATCH_CLOSED ? "unscrewed" : "screwed"] the maintenance hatch on [target]'s [affected.plaintext_zone] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + if(affected.hatch_state == HATCH_CLOSED) + affected.hatch_state = HATCH_UNSCREWED + else + affected.hatch_state = HATCH_CLOSED + ..() + +/datum/surgery_step/robotics/unscrew_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s [tool.name] slips, failing to [affected.hatch_state == HATCH_CLOSED ? "unscrew" : "screw"] [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +////////////////////////////////////////////////////////////////// +// open robotic limb surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/open_hatch + name = "Open/close maintenance hatch" + allowed_tools = list( + TOOL_RETRACTOR = 100, + TOOL_CROWBAR = 100, + /obj/item/kitchen = 50 + ) + + min_duration = 2 SECONDS + max_duration = 3 SECONDS + + success_sound = 'sound/items/crowbar.ogg' + +/datum/surgery_step/robotics/open_hatch/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.hatch_state != HATCH_CLOSED) + return affected + +/datum/surgery_step/robotics/open_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts to [affected.hatch_state == HATCH_UNSCREWED ? "pry open" : "close"] the maintenance hatch on [target]'s [affected.name] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/open_hatch/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] opens the maintenance hatch on [target]'s [affected.name] with [tool].")) + if(affected.hatch_state == HATCH_UNSCREWED) + affected.hatch_state = HATCH_OPENED + else + affected.hatch_state = HATCH_UNSCREWED + ..() + +/datum/surgery_step/robotics/open_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s [tool.name] slips, failing to [affected.hatch_state == HATCH_UNSCREWED ? "open" : "close"] the hatch on [target]'s [affected.name]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +////////////////////////////////////////////////////////////////// +// robotic limb brute damage repair surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/repair_brute + name = "Repair damage to prosthetic" + allowed_tools = list( + TOOL_WELDER = 100, + /obj/item/gun/energy/plasmacutter = 50, + ) + + min_duration = 3 SECONDS + max_duration = 6 SECONDS + + success_sound = 'sound/items/welder.ogg' + +/datum/surgery_step/robotics/repair_brute/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected) + if(!affected.brute_dam) + to_chat(user, span_warning("There is no damage to repair.")) + return FALSE + if(!tool.tool_use_check(user, 1)) + return FALSE + return TRUE + return FALSE + +/datum/surgery_step/robotics/repair_brute/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.hatch_state == HATCH_OPENED && (affected.brute_dam > 0)) + return affected + +/datum/surgery_step/robotics/repair_brute/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] begins to patch damage to [target]'s [affected.plaintext_zone]'s support structure with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/repair_brute/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] finishes patching damage to [target]'s [affected.plaintext_zone] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/repair_brute/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(0, rand(5, 10)) + ..() + +////////////////////////////////////////////////////////////////// +// robotic limb burn damage repair surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/repair_burn + name = "Repair burns on prosthetic" + allowed_tools = list( + /obj/item/stack/cable_coil = 100 + ) + min_duration = 3 SECONDS + max_duration = 6 SECONDS + +/datum/surgery_step/robotics/repair_burn/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(affected) + if(!affected.burn_dam) + to_chat(user, span_warning("There is no damage to repair.")) + return FALSE + else + var/obj/item/stack/cable_coil/C = tool + if(istype(C)) + if(!C.tool_use_check(3)) + to_chat(user, span_warning("You need three or more cable pieces to repair this damage.")) + else + return TRUE + return FALSE + +/datum/surgery_step/robotics/repair_burn/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(affected && affected.hatch_state == HATCH_OPENED && (affected.burn_dam > 0)) + return affected + +/datum/surgery_step/robotics/repair_burn/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] begins to splice new cabling into [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/repair_burn/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] finishes splicing cable into [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + affected.heal_damage(0, rand(30,50), BODYTYPE_ROBOTIC) + tool.use(2) // We need 3 cable coil, and `handle_post_surgery()` removes 1. + ..() + +/datum/surgery_step/robotics/repair_burn/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user] causes a short circuit in [target]'s [affected.plaintext_zone]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.receive_damage(0, rand(5,10)) + ..() + +////////////////////////////////////////////////////////////////// +// artificial organ repair surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs + name = "Repair prosthetic organ" + allowed_tools = list( + TOOL_SCREWDRIVER = 70, + /obj/item/stack/medical/bone_gel = 30, + ) + min_duration = 4 SECONDS + max_duration = 6 SECONDS + surgery_flags = SURGERY_NO_STUMP | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/robotics/fix_organ_robotic/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return + for(var/obj/item/organ/I in affected.contained_organs) + if((I.organ_flags & ORGAN_SYNTHETIC) && I.damage > 0) + return TRUE + ..() + +/datum/surgery_step/robotics/fix_organ_robotic/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(!affected) + return FALSE + + var/list/organs = list() + for(var/obj/item/organ/I in affected.contained_organs) + if((I.organ_flags & ORGAN_SYNTHETIC) && I.damage > 0) + organs[I.name] = I.slot + + if(!length(organs)) + to_chat(span_warning("[target.p_they(TRUE)] has no robotic organs there.")) + return FALSE + + var/organ = input(user, "Which organ do you want to prepare for surgery?", "Repair Organ", "Surgery") as null|anything in organs + if(organ) + return list(organ, organs[organ]) + +/datum/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] starts mending the damage to [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] mechanisms."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/fix_organ_robotic/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/I = target.getorganslot((LAZYACCESS(target.surgeries_in_progress, target_zone))?[2]) + if(!I || !I.owner == target) + return + + user.visible_message(span_notice("[user] repairs [target]'s [I.name] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + I.damage = 0 + ..() + +/datum/surgery_step/robotics/fix_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_warning("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.plaintext_zone] with [tool]!"), vision_distance = COMBAT_MESSAGE_RANGE) + affected.create_wound(WOUND_CUT, 5) + for(var/obj/item/organ/I in affected.contained_organs) + I.applyOrganDamage(rand(3,5)) + ..() + +////////////////////////////////////////////////////////////////// +// robotic organ detachment surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/detach_organ_robotic + name = "Decouple prosthetic organ" + allowed_tools = list( + TOOL_MULTITOOL = 100 + ) + min_duration = 9 SECONDS + max_duration = 11 SECONDS + surgery_flags = SURGERY_NO_STUMP | SURGERY_NO_FLESH | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/robotics/detach_organ_robotic/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/list/attached_organs = list() + + for(var/obj/item/organ/I in affected.contained_organs) + attached_organs[I.name] = I.slot + + if(!length(attached_organs)) + to_chat(user, span_warning("There are no appropriate internal components to decouple.")) + return FALSE + + var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs + if(organ_to_remove) + return list(organ_to_remove,attached_organs[organ_to_remove]) + +/datum/surgery_step/robotics/detach_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] starts to decouple [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/detach_organ_robotic/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] has decoupled [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + var/obj/item/organ/I = target.getorganslot((LAZYACCESS(target.surgeries_in_progress, target_zone))[2]) + if(istype(I)) + I.cut_away() + ..() + +/datum/surgery_step/robotics/detach_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_warning("[user]'s hand slips, disconnecting [tool].")) + ..() + + +////////////////////////////////////////////////////////////////// +// robotic organ transplant finalization surgery step +////////////////////////////////////////////////////////////////// +/datum/surgery_step/robotics/attach_organ_robotic + name = "Reattach prosthetic organ" + allowed_tools = list( + TOOL_SCREWDRIVER = 100, + ) + min_duration = 10 SECONDS + max_duration = 12 SECONDS + surgery_flags = SURGERY_NO_STUMP | SURGERY_NO_FLESH | SURGERY_NEEDS_DEENCASEMENT + +/datum/surgery_step/robotics/attach_organ_robotic/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/list/removable_organs = list() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + for(var/obj/item/organ/I in affected.cavity_items) + if ((deprecise_zone(I.zone) == affected.body_zone)) + removable_organs[I.name] = REF(I) + + if(!length(removable_organs)) + to_chat(user, span_warning("You cannot find any organs to attach.")) + return + + var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs + if(organ_to_replace) + return list(organ_to_replace, removable_organs[organ_to_replace]) + +/datum/surgery_step/robotics/attach_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_notice("[user] begins reattaching [target]'s [(LAZYACCESS(target.surgeries_in_progress, target_zone))[1]] with [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/robotics/attach_organ_robotic/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + var/obj/item/organ/O = locate((LAZYACCESS(target.surgeries_in_progress, target_zone))[2]) in affected.cavity_items + if(!O) + return + + user.visible_message(span_notice("[user] has reattached [target]'s [O.name] with \the [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + + O.organ_flags &= ~ORGAN_CUT_AWAY + affected.remove_cavity_item(O) + O.Insert(target) + ..() + +/datum/surgery_step/robotics/attach_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message(span_warning("[user]'s hand slips, disconnecting [tool]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() diff --git a/code/modules/surgery/new_surgery/tend_wounds.dm b/code/modules/surgery/new_surgery/tend_wounds.dm new file mode 100644 index 000000000000..37b7fc920ad9 --- /dev/null +++ b/code/modules/surgery/new_surgery/tend_wounds.dm @@ -0,0 +1,78 @@ +/datum/surgery_step/tend_wounds + name = "Repair greivous physical trauma (organic)" + desc = "Repairs extreme damage from cuts, bruises, and punctures." + surgery_flags = SURGERY_NO_ROBOTIC + allowed_tools = list( + TOOL_HEMOSTAT = 100 + ) + looping = TRUE + min_duration = 1 SECONDS + max_duration = 2 SECONDS + var/damage_type = BRUTE + + preop_sound = list('sound/surgery/hemostat1.ogg', 'sound/surgery/scalpel1.ogg') + +/datum/surgery_step/tend_wounds/assess_bodypart(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = ..() + if(!affected) + return + + if(damage_type == BRUTE) + if(affected.brute_dam >= affected.max_damage * 0.1) + return affected + else + if(affected.burn_dam >= affected.max_damage * 0.1) + return affected + +/datum/surgery_step/tend_wounds/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + if(damage_type == BRUTE) + if(affected.brute_dam >= affected.max_damage * 0.1) + . = TRUE + else + if(affected.burn_dam >= affected.max_damage * 0.1) + . = TRUE + if(!.) + to_chat(user, span_warning("[target]'s [affected.plaintext_zone] [(damage_type == BRUTE) ? "trauma" : "burns"] cannot be repaired any more through surgery.")) + +/datum/surgery_step/tend_wounds/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] starts to mend [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + ..() + +/datum/surgery_step/tend_wounds/succeed_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + ..() + var/obj/item/bodypart/affected = target.get_bodypart(target_zone) + user.visible_message(span_notice("[user] successfully mends [target]'s [affected.plaintext_zone]."), vision_distance = COMBAT_MESSAGE_RANGE) + if(damage_type == BRUTE) + affected.heal_damage(15) + else + affected.heal_damage(0, 15) + +/datum/surgery_step/tend_wounds/burn + name = "Repair third degree burns (organic)" + desc = "Repairs extreme damage from burns." + damage_type = BURN + +/datum/surgery_step/tend_wounds/robotic + name = "Repair greivous physical trauma (robotic)" + desc = "Repairs extreme damage from dents or punctures" + surgery_flags = SURGERY_NO_FLESH + allowed_tools = list( + TOOL_WELDER = 95 + ) + success_sound = 'sound/items/welder.ogg' + +/datum/surgery_step/tend_wounds/robotic/pre_surgery_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + . = ..() + if(!.) + return + + if(!tool.tool_use_check(1)) + to_chat(user, span_warning("[tool] cannot be used right now.")) + return FALSE + +/datum/surgery_step/tend_wounds/robotic/burn + name = "Repair third degree burns (robotic)" + desc = "Repairs extreme damage from burns." + surgery_flags = SURGERY_NO_FLESH diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm deleted file mode 100644 index e039e880d972..000000000000 --- a/code/modules/surgery/organ_manipulation.dm +++ /dev/null @@ -1,181 +0,0 @@ -/datum/surgery/organ_manipulation - name = "Organ manipulation" - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) - requires_real_bodypart = TRUE - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/manipulate_organs, //there should be bone fixing - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - -/datum/surgery/organ_manipulation/soft - possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/manipulate_organs, - /datum/surgery_step/close) - -/datum/surgery/organ_manipulation/alien - name = "Alien organ manipulation" - possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - target_mobtypes = list(/mob/living/carbon/alien/humanoid) - steps = list( - /datum/surgery_step/saw, - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/manipulate_organs, - /datum/surgery_step/repair_bone, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - -/datum/surgery/organ_manipulation/mechanic - name = "Prosthesis organ manipulation" - possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD) - requires_bodypart_type = BODYTYPE_ROBOTIC - lying_required = FALSE - self_operable = TRUE - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/mechanic_unwrench, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs, - /datum/surgery_step/mechanic_wrench, - /datum/surgery_step/mechanic_close) - -/datum/surgery/organ_manipulation/mechanic/soft - possible_locs = list(BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_EYES, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM) - steps = list( - /datum/surgery_step/mechanic_open, - /datum/surgery_step/open_hatch, - /datum/surgery_step/prepare_electronics, - /datum/surgery_step/manipulate_organs, - /datum/surgery_step/mechanic_close) - -/datum/surgery_step/manipulate_organs - time = 64 - name = "manipulate organs" - repeatable = TRUE - implements = list( - /obj/item/organ = 100, - /obj/item/borg/apparatus/organ_storage = 100) - preop_sound = 'sound/surgery/organ2.ogg' - success_sound = 'sound/surgery/organ1.ogg' - var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55, /obj/item/kitchen/fork = 35) - var/current_type - var/obj/item/organ/target_organ - -/datum/surgery_step/manipulate_organs/New() - ..() - implements = implements + implements_extract - -/datum/surgery_step/manipulate_organs/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - target_organ = null - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - preop_sound = initial(preop_sound) - success_sound = initial(success_sound) - if(!length(tool.contents)) - to_chat(user, span_warning("There is nothing inside [tool]!")) - return -1 - target_organ = tool.contents[1] - if(!isorgan(target_organ)) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - to_chat(user, span_warning("You cannot put [target_organ] into [target]'s [parse_zone(target_zone)]!")) - return -1 - tool = target_organ - if(isorgan(tool)) - current_type = "insert" - preop_sound = 'sound/surgery/hemostat1.ogg' - success_sound = 'sound/surgery/organ2.ogg' - target_organ = tool - if(target_zone != target_organ.zone || target.getorganslot(target_organ.slot)) - to_chat(user, span_warning("There is no room for [target_organ] in [target]'s [parse_zone(target_zone)]!")) - return -1 - var/obj/item/organ/meatslab = tool - if(!meatslab.useable) - to_chat(user, span_warning("[target_organ] seems to have been chewed on, you can't use this!")) - return -1 - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - display_results(user, target, span_notice("You begin to insert [tool] into [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to insert something into [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You can feel your something being placed in your [parse_zone(target_zone)]!") - - - else if(implement_type in implements_extract) - current_type = "extract" - var/list/organs = target.getorgansofzone(target_zone, FALSE, TRUE) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - if(!length(organs)) - to_chat(user, span_warning("There are no removable organs in [target]'s [parse_zone(target_zone)]!")) - return -1 - else - for(var/obj/item/organ/organ in organs) - organ.on_find(user) - organs -= organ - organs[organ.name] = organ - - var/chosen_organ = tgui_input_list(user, "Remove which organ?", "Surgery", sort_list(organs)) - if(isnull(chosen_organ)) - return -1 - target_organ = chosen_organ - if(user && target && user.Adjacent(target) && user.get_active_held_item() == tool) - target_organ = organs[target_organ] - if(!target_organ) - return -1 - if(target_organ.organ_flags & ORGAN_UNREMOVABLE) - to_chat(user, span_warning("[target_organ] is too well connected to take out!")) - return -1 - display_results(user, target, span_notice("You begin to extract [target_organ] from [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to extract [target_organ] from [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to extract something from [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You can feel your [target_organ] being removed from your [parse_zone(target_zone)]!") - else - return -1 - - -/datum/surgery_step/manipulate_organs/success(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if (target_zone == BODY_ZONE_PRECISE_EYES) - target_zone = check_zone(target_zone) - if(current_type == "insert") - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - target_organ = tool.contents[1] - tool.icon_state = initial(tool.icon_state) - tool.desc = initial(tool.desc) - tool.cut_overlays() - tool = target_organ - else - target_organ = tool - user.temporarilyRemoveItemFromInventory(target_organ, TRUE) - target_organ.Insert(target) - display_results(user, target, span_notice("You insert [tool] into [target]'s [parse_zone(target_zone)]."), - span_notice("[user] inserts [tool] into [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] inserts something into [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "Your [parse_zone(target_zone)] throbs with pain as your new [tool] comes to life!") - - else if(current_type == "extract") - if(target_organ && target_organ.owner == target) - display_results(user, target, span_notice("You successfully extract [target_organ] from [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully extracts [target_organ] from [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] successfully extracts something from [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "Your [parse_zone(target_zone)] throbs with pain, you can't feel your [target_organ] anymore!") - log_combat(user, target, "surgically removed [target_organ.name] from", addition="COMBAT MODE: [uppertext(user.combat_mode)]") - target_organ.Remove(target) - target_organ.forceMove(get_turf(target)) - else - display_results(user, target, span_warning("You can't extract anything from [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!")) - return FALSE diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm deleted file mode 100644 index 6ed6a3e2368e..000000000000 --- a/code/modules/surgery/organic_steps.dm +++ /dev/null @@ -1,218 +0,0 @@ - -//make incision -/datum/surgery_step/incise - name = "make incision" - implements = list( - TOOL_SCALPEL = 100, - /obj/item/melee/energy/sword = 75, - /obj/item/knife = 65, - /obj/item/shard = 45, - /obj/item = 30) // 30% success with any sharp item. - time = 16 - preop_sound = 'sound/surgery/scalpel1.ogg' - success_sound = 'sound/surgery/scalpel2.ogg' - -/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(surgery.operated_bodypart?.how_open()) - var/datum/wound/incision = surgery.operated_bodypart.get_incision() - to_chat(user, span_notice("The [incision.desc] provides enough access.")) - return TRUE - - display_results(user, target, span_notice("You begin to make an incision in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to make an incision in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a stabbing in your [parse_zone(target_zone)].") - -/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !tool.sharpness) - return FALSE - - return TRUE - -/datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if ishuman(target) - var/mob/living/carbon/human/human_target = target - if (!(NOBLOOD in human_target.dna.species.species_traits)) - display_results(user, target, span_notice("Blood pools around the incision in [human_target]'s [parse_zone(target_zone)]."), - span_notice("Blood pools around the incision in [human_target]'s [parse_zone(target_zone)]."), - span_notice("Blood pools around the incision in [human_target]'s [parse_zone(target_zone)].")) - var/obj/item/bodypart/target_bodypart = target.get_bodypart(target_zone) - if(target_bodypart) - target_bodypart.adjustBleedStacks(10) - target_bodypart.create_wound(WOUND_CUT, target_bodypart.minimum_break_damage/2, TRUE) - return ..() - -/datum/surgery_step/incise/nobleed/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to carefully make an incision in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to carefully make an incision in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to carefully make an incision in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a careful stabbing in your [parse_zone(target_zone)].") - -//clamp bleeders -/datum/surgery_step/clamp_bleeders - name = "clamp bleeders" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_WIRECUTTER = 60, - /obj/item/stack/package_wrap = 35, - /obj/item/stack/cable_coil = 15) - time = 24 - preop_sound = 'sound/surgery/hemostat1.ogg' - -/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a pinch as the bleeding in your [parse_zone(target_zone)] is slowed.") - -/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if (ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/bodypart/target_bodypart = human_target.get_bodypart(target_zone) - if(target_bodypart) - target_bodypart.clamp_wounds() - return ..() - -//retract skin -/datum/surgery_step/retract_skin - name = "retract skin" - implements = list( - TOOL_RETRACTOR = 100, - TOOL_SCREWDRIVER = 45, - TOOL_WIRECUTTER = 35, - /obj/item/stack/rods = 35) - time = 24 - preop_sound = 'sound/surgery/retractor1.ogg' - success_sound = 'sound/surgery/retractor2.ogg' - -/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - var/obj/item/bodypart/affected = surgery.operated_bodypart - if(affected) - if(affected.how_open() >= SURGERY_RETRACTED) - var/datum/wound/cut/incision = affected.get_incision() - to_chat(user, span_notice("The [incision.desc] provides enough access, a larger incision isn't needed.")) - return TRUE - - display_results(user, target, span_notice("You begin to retract the skin in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a severe stinging pain spreading across your [parse_zone(target_zone)] as the skin is pulled back!") - -/datum/surgery_step/retract_skin/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if(surgery.operated_bodypart) - surgery.operated_bodypart.open_incision() - surgery.operated_bodypart.update_damage() - return ..() - -/datum/surgery_step/retract_skin/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob) - display_results(user, target, - span_warning("Your hand slips, tearing the edges of the incision on [target]'s [surgery.operated_bodypart.name] with [tool]!"), - span_warning("[user]'s hand slips, tearing the edges of the incision on [target]'s [surgery.operated_bodypart.name] with [tool]!") - ) - display_pain(target, "You feel a stinging pain on your [parse_zone(target_zone)]") - if(surgery.operated_bodypart) - surgery.operated_bodypart.receive_damage(12, sharpness = (SHARP_EDGED|SHARP_POINTY)) - return ..() - -//close incision -/datum/surgery_step/close - name = "mend incision" - implements = list( - TOOL_CAUTERY = 100, - /obj/item/gun/energy/laser = 90, - TOOL_WELDER = 70, - /obj/item = 30) // 30% success with any hot item. - time = 24 - preop_sound = 'sound/surgery/cautery1.ogg' - success_sound = 'sound/surgery/cautery2.ogg' - -/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to mend the incision in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "Your [parse_zone(target_zone)] is being burned!") - -/datum/surgery_step/close/tool_check(mob/user, obj/item/tool) - if(implement_type == TOOL_WELDER || implement_type == /obj/item) - return tool.get_temperature() - - return TRUE - -/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - if (ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/bodypart/target_bodypart = human_target.get_bodypart(target_zone) - var/datum/wound/W = target_bodypart.get_incision() - if(W) - W.close_wound() - if(target_bodypart.clamped()) - target_bodypart.remove_clamps() - - target_bodypart.update_damage() //Also calls refresh_bleed_rate() - - return ..() - - - -//saw bone -/datum/surgery_step/saw - name = "saw bone" - implements = list( - TOOL_SAW = 100, - /obj/item/melee/arm_blade = 75, - /obj/item/fireaxe = 50, - /obj/item/hatchet = 35, - /obj/item/knife/butcher = 25, - /obj/item = 20) //20% success (sort of) with any sharp item with a force>=10 - time = 54 - preop_sound = list( - /obj/item/circular_saw = 'sound/surgery/saw.ogg', - /obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg', - /obj/item/fireaxe = 'sound/surgery/scalpel1.ogg', - /obj/item/hatchet = 'sound/surgery/scalpel1.ogg', - /obj/item/knife/butcher = 'sound/surgery/scalpel1.ogg', - /obj/item = 'sound/surgery/scalpel1.ogg', - ) - success_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to saw through the bone in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a horrid ache spread through the inside of your [parse_zone(target_zone)]!") - -/datum/surgery_step/saw/tool_check(mob/user, obj/item/tool) - if(implement_type == /obj/item && !(tool.sharpness && (tool.force >= 10))) - return FALSE - return TRUE - -/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - surgery.operated_bodypart.break_bones() - display_results(user, target, span_notice("You saw [target]'s [parse_zone(target_zone)] open."), - span_notice("[user] saws [target]'s [parse_zone(target_zone)] open!"), - span_notice("[user] saws [target]'s [parse_zone(target_zone)] open!")) - display_pain(target, "It feels like something just broke in your [parse_zone(target_zone)]!") - return ..() - -//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 = 25, - /obj/item/kitchen/spoon = 20) - time = 30 - -/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin to drill into the bone in [target]'s [parse_zone(target_zone)]..."), - span_notice("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].")) - display_pain(target, "You feel a horrible piercing pain in your [parse_zone(target_zone)]!") - -/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - display_results(user, target, span_notice("You drill into [target]'s [parse_zone(target_zone)]."), - span_notice("[user] drills into [target]'s [parse_zone(target_zone)]!"), - span_notice("[user] drills into [target]'s [parse_zone(target_zone)]!")) - return ..() diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm index 271043dbf1d6..47ad4e5e0e21 100644 --- a/code/modules/surgery/organs/_organ.dm +++ b/code/modules/surgery/organs/_organ.dm @@ -4,25 +4,37 @@ icon = 'icons/obj/surgery.dmi' w_class = WEIGHT_CLASS_SMALL throwforce = 0 + + //Germ level starts at 0 + germ_level = 0 + ///The mob that owns this organ. var/mob/living/carbon/owner = null - var/status = ORGAN_ORGANIC ///The body zone this organ is supposed to inhabit. var/zone = BODY_ZONE_CHEST ///The organ slot this organ is supposed to inhabit. This should be unique by type. (Lungs, Appendix, Stomach, etc) var/slot // DO NOT add slots with matching names to different zones - it will break organs_by_slot list! var/organ_flags = ORGAN_EDIBLE - var/maxHealth = STANDARD_ORGAN_THRESHOLD + var/maxHealth = 30 /// Total damage this organ has sustained /// Should only ever be modified by applyOrganDamage var/damage = 0 - ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick - var/healing_factor = 0 //fraction of maxhealth healed per on_life(), set to 0 for generic organs var/decay_factor = 0 //same as above but when without a living owner, set to 0 for generic organs - var/high_threshold = STANDARD_ORGAN_THRESHOLD * 0.45 //when severe organ damage occurs - var/low_threshold = STANDARD_ORGAN_THRESHOLD * 0.1 //when minor organ damage occurs - var/severe_cooldown //cooldown for severe effects, used for synthetic organ emp effects. + var/high_threshold = 0.66 + var/low_threshold = 0.33 //when minor organ damage occurs + + /// The world.time of this organ's death + var/time_of_death = 0 + + /// The relative size of this organ, used for probability to hit. + var/relative_size = 25 + /// Amount of damage to take when taking damage from an external source + var/external_damage_modifier = 0.5 + + ///cooldown for severe effects, used for synthetic organ emp effects. + var/severe_cooldown + ///Organ variables for determining what we alert the owner with when they pass/clear the damage thresholds var/prev_damage = 0 var/low_threshold_passed @@ -38,8 +50,6 @@ ///The size of the reagent container var/reagent_vol = 10 - var/failure_time = 0 - ///Do we effect the appearance of our mob. Used to save time in preference code var/visual = FALSE ///If the organ is cosmetic only, it loses all organ functionality. @@ -70,37 +80,39 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) color = "#[random_color()]" //A temporary random color that gets overwritten on insertion. else START_PROCESSING(SSobj, src) + organ_flags |= ORGAN_CUT_AWAY /obj/item/organ/Destroy(force) if(owner) // The special flag is important, because otherwise mobs can die // while undergoing transformation into different mobs. Remove(owner, special=TRUE) - else - if(visual) - if(ownerlimb) - remove_from_limb() - else - STOP_PROCESSING(SSobj, src) + if(ownerlimb) + ownerlimb.remove_organ(src) - return ..() + if(!cosmetic_only) + STOP_PROCESSING(SSobj, src) -/obj/item/organ/forceMove(atom/destination, check_dest = TRUE) - if(check_dest && destination) //Nullspace is always a valid location for organs. Because reasons. - if(organ_flags & ORGAN_UNREMOVABLE) //If this organ is unremovable, it should delete itself if it tries to be moved to anything besides a bodypart. - if(!istype(destination, /obj/item/bodypart) && !iscarbon(destination)) - stack_trace("Unremovable organ tried to be removed!") - qdel(src) - return //Don't move it out of nullspace if it's deleted. return ..() -/// A little hack to ensure old behavior for now. +/// A little hack to ensure old behavior. /obj/item/organ/ex_act(severity, target) - if(visual && ownerlimb) + if(ownerlimb) return return ..() +/obj/item/organ/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + if(owner) + Remove(owner) + stack_trace("Organ removed while it still had an owner.") + + if(ownerlimb) + ownerlimb.remove_organ(src) + stack_trace("Organ removed while it still had an ownerlimb.") + + /* * Insert the organ into the select mob. * @@ -113,10 +125,9 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) return FALSE var/obj/item/bodypart/limb - if(visual) - limb = reciever.get_bodypart(deprecise_zone(zone)) - if(!limb) - return FALSE + limb = reciever.get_bodypart(deprecise_zone(zone)) + if(!limb) + return FALSE var/obj/item/organ/replaced = reciever.getorganslot(slot) if(replaced) @@ -126,11 +137,19 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) else qdel(replaced) + organ_flags &= ~ORGAN_CUT_AWAY + SEND_SIGNAL(src, COMSIG_ORGAN_IMPLANTED, reciever) SEND_SIGNAL(reciever, COMSIG_CARBON_GAIN_ORGAN, src, special) + if(ownerlimb) + ownerlimb.remove_organ(src) + + forceMove(limb) + limb.add_organ(src) + item_flags |= ABSTRACT + owner = reciever - moveToNullspace() RegisterSignal(owner, COMSIG_PARENT_EXAMINE, PROC_REF(on_owner_examine)) update_organ_traits(reciever) for(var/datum/action/action as anything in actions) @@ -139,6 +158,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) //Add to internal organs owner.organs |= src owner.organs_by_slot[slot] = src + ADD_TRAIT(src, TRAIT_INSIDE_BODY, REF(owner)) if(!cosmetic_only) STOP_PROCESSING(SSobj, src) @@ -147,21 +167,26 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// Otherwise life processing breaks down sortTim(owner.processing_organs, GLOBAL_PROC_REF(cmp_organ_slot_asc)) - if(visual) //Brains are visual and I don't know why. Blame lemon. + if(visual) if(!stored_feature_id && reciever.dna?.features) //We only want this set *once* stored_feature_id = reciever.dna.features[feature_key] reciever.cosmetic_organs.Add(src) + reciever.update_body_parts() - ownerlimb = limb - add_to_limb(ownerlimb) - - if(external_bodytypes) - limb.synchronize_bodytypes(reciever) + PreRevivalInsertion(special) + if(!special && !cosmetic_only && owner.stat == DEAD && (organ_flags & ORGAN_VITAL) && !(organ_flags & ORGAN_DEAD) && owner.needs_organ(slot)) + attempt_vital_organ_revival(owner) - reciever.update_body_parts() return TRUE +/* + * Called before attempt_vital_organ_revival during a successful Insert() + * + * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment + */ +/obj/item/organ/proc/PreRevivalInsertion(special) + return /* * Remove the organ from the select mob. @@ -170,37 +195,51 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) * special - "quick swapping" an organ out - when TRUE, the mob will be unaffected by not having that organ for the moment */ /obj/item/organ/proc/Remove(mob/living/carbon/organ_owner, special = FALSE) + if(!istype(organ_owner)) + CRASH("Tried to remove an organ with no owner argument.") UnregisterSignal(owner, COMSIG_PARENT_EXAMINE) + item_flags &= ~ABSTRACT + owner = null for(var/datum/action/action as anything in actions) action.Remove(organ_owner) + for(var/trait in organ_traits) REMOVE_TRAIT(organ_owner, trait, REF(src)) SEND_SIGNAL(src, COMSIG_ORGAN_REMOVED, organ_owner) SEND_SIGNAL(organ_owner, COMSIG_CARBON_LOSE_ORGAN, src, special) - if(organ_owner) - organ_owner.organs -= src - if(organ_owner.organs_by_slot[slot] == src) - organ_owner.organs_by_slot.Remove(slot) - if(!cosmetic_only) - if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE)) - organ_owner.death() - organ_owner.processing_organs -= src + organ_flags |= ORGAN_CUT_AWAY + + REMOVE_TRAIT(src, TRAIT_INSIDE_BODY, REF(organ_owner)) + organ_owner.organs -= src + if(organ_owner.organs_by_slot[slot] == src) + organ_owner.organs_by_slot.Remove(slot) if(!cosmetic_only) + if((organ_flags & ORGAN_VITAL) && !special && !(organ_owner.status_flags & GODMODE) && organ_owner.needs_organ(slot)) + organ_owner.death() + organ_owner.processing_organs -= src START_PROCESSING(SSobj, src) + if(ownerlimb) + ownerlimb.remove_organ(src) + if(visual) - if(ownerlimb) - remove_from_limb() + organ_owner.cosmetic_organs.Remove(src) + organ_owner.update_body_parts() + +/// Cut an organ away from it's container, but do not remove it from the container physically. +/obj/item/organ/proc/cut_away() + if(!ownerlimb) + return - if(organ_owner) - organ_owner.cosmetic_organs.Remove(src) - organ_owner.update_body_parts() + var/obj/item/bodypart/old_owner = ownerlimb + Remove(owner) + old_owner.add_cavity_item(src) /// Updates the traits of the organ on the specific organ it is called on. Should be called anytime an organ is given a trait while it is already in a body. /obj/item/organ/proc/update_organ_traits() @@ -209,7 +248,7 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// Add a trait to an organ that it will give its owner. /obj/item/organ/proc/add_organ_trait(trait) - organ_traits += trait + organ_traits |= trait update_organ_traits() /// Removes a trait from an organ, and by extension, its owner. @@ -232,53 +271,124 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /// This is on_life() but for when the organ is dead or outside of a mob. Bad name. /obj/item/organ/proc/on_death(delta_time, times_fired) - if(organ_flags & (ORGAN_SYNTHETIC | ORGAN_FROZEN)) + if(organ_flags & (ORGAN_SYNTHETIC|ORGAN_FROZEN|ORGAN_DEAD)) return - applyOrganDamage(decay_factor * maxHealth * delta_time) + + if(isnull(owner)) + germ_level += rand(1,3) + if(germ_level >= INFECTION_LEVEL_TWO) + germ_level += rand(1,3) + if(germ_level >= INFECTION_LEVEL_THREE) + set_organ_dead(TRUE) /// Called once every life tick on every organ in a carbon's body /// NOTE: THIS IS VERY HOT. Be careful what you put in here /// To give you some scale, if there's 100 carbons in the game, they each have maybe 9 organs /// So that's 900 calls to this proc every life process. Please don't be dumb +/// Return TRUE to call updatehealth(). Please only call inside of on_life() if it's important. /obj/item/organ/proc/on_life(delta_time, times_fired) if(cosmetic_only) CRASH("Cosmetic organ processing!") - if(organ_flags & ORGAN_FAILING) - handle_failing_organs(delta_time) + if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. + return applyOrganDamage(decay_factor * maxHealth * delta_time, updating_health = FALSE) + + if(organ_flags & ORGAN_SYNTHETIC) return - if(failure_time > 0) - failure_time-- + if(owner.bodytemperature > TCRYO && !(organ_flags & ORGAN_FROZEN)) + handle_antibiotics() + . = handle_germ_effects() - if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. - applyOrganDamage(decay_factor * maxHealth * delta_time) + + if(damage) // No sense healing if you're not even hurt bro + . = handle_regeneration() || . + +/obj/item/organ/proc/handle_regeneration() + if((organ_flags & ORGAN_SYNTHETIC) || CHEM_EFFECT_MAGNITUDE(owner, CE_TOXIN) || owner.undergoing_cardiac_arrest()) + return + + if(damage < maxHealth * 0.1) + return applyOrganDamage(-0.1, updating_health = FALSE) + +//Germs +/obj/item/organ/proc/handle_antibiotics() + if(!owner || !germ_level) return - if(!damage) // No sense healing if you're not even hurt bro + if (!CHEM_EFFECT_MAGNITUDE(owner, CE_ANTIBIOTIC)) return - ///Damage decrements by a percent of its maxhealth - var/healing_amount = healing_factor - ///Damage decrements again by a percent of its maxhealth, up to a total of 4 extra times depending on the owner's health - healing_amount += (owner.satiety > 0) ? (4 * healing_factor * owner.satiety / MAX_SATIETY) : 0 - applyOrganDamage(-healing_amount * maxHealth * delta_time, damage) // pass curent damage incase we are over cap + if (germ_level < INFECTION_LEVEL_ONE) + germ_level = 0 //cure instantly + else if (germ_level < INFECTION_LEVEL_TWO) + germ_level -= 5 //at germ_level == 500, this should cure the infection in 5 minutes + else + germ_level -= 3 //at germ_level == 1000, this will cure the infection in 10 minutes + + if(owner.body_position == LYING_DOWN) + germ_level -= 2 + + germ_level = max(0, germ_level) + + +/obj/item/organ/proc/handle_germ_effects() + //** Handle the effects of infections + var/antibiotics = owner.reagents.get_reagent_amount(/datum/reagent/medicine/spaceacillin) + + if (germ_level > 0 && germ_level < INFECTION_LEVEL_ONE/2 && prob(0.3)) + germ_level-- + + if (germ_level >= INFECTION_LEVEL_ONE/2) + //aiming for germ level to go from ambient to INFECTION_LEVEL_TWO in an average of 15 minutes, when immunity is full. + if(antibiotics < 5 && prob(round(germ_level/6 * 0.01))) + germ_level += 1 + + if(germ_level >= INFECTION_LEVEL_ONE) + var/fever_temperature = (owner.dna.species.heat_level_1 - owner.dna.species.bodytemp_normal - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.dna.species.bodytemp_normal + owner.bodytemperature += clamp((fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, 0, fever_temperature - owner.bodytemperature) + + if (germ_level >= INFECTION_LEVEL_TWO) + //spread germs + if (antibiotics < 5 && ownerlimb.germ_level < germ_level && ( ownerlimb.germ_level < INFECTION_LEVEL_ONE*2 || prob(0.3) )) + ownerlimb.germ_level++ + + if (prob(3)) //about once every 30 seconds + . = applyOrganDamage(1,silent=prob(30), updating_health = FALSE) /obj/item/organ/examine(mob/user) . = ..() . += span_notice("It should be inserted in the [parse_zone(zone)].") - if(organ_flags & ORGAN_FAILING) - if(status == ORGAN_ROBOTIC) - . += span_warning("[src] seems to be broken.") - return - . += span_warning("[src] has decayed for too long, and has turned a sickly color. It probably won't work without repairs.") - return + if(organ_flags & ORGAN_DEAD) + if(organ_flags & ORGAN_SYNTHETIC) + . += span_warning("\The [src] looks completely spent.") + else + if(can_recover()) + . += span_warning("It has begun to decay.") + else + . += span_warning("The decay has set into [src].") - if(damage > high_threshold) + else if(damage > high_threshold * maxHealth) . += span_warning("[src] is starting to look discolored.") +/obj/item/organ/proc/get_visible_state() + if(damage > maxHealth) + . = "bits and pieces of a destroyed " + else if(damage > (maxHealth * high_threshold)) + . = "broken " + else if(damage > (maxHealth * low_threshold)) + . = "badly damaged " + else if(damage > 5) + . = "damaged " + if(organ_flags & ORGAN_DEAD) + if(can_recover()) + . = "decaying [.]" + else + . = "necrotic [.]" + . = "[.][name]" + ///Used as callbacks by object pooling /obj/item/organ/proc/exit_wardrobe() if(!cosmetic_only) @@ -295,22 +405,51 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. +/obj/item/organ/proc/set_max_health(new_max) + maxHealth = FLOOR(new_max, 1) + damage = min(damage, maxHealth) + ///Adjusts an organ's damage by the amount "damage_amount", up to a maximum amount, which is by default max damage -/obj/item/organ/proc/applyOrganDamage(damage_amount, maximum = maxHealth) //use for damaging effects - if(!damage_amount) //Micro-optimization. +/obj/item/organ/proc/applyOrganDamage(damage_amount, maximum = maxHealth, silent, updating_health = TRUE) //use for damaging effects + if(!damage_amount || cosmetic_only) //Micro-optimization. return if(maximum < damage) return - damage = clamp(damage + damage_amount, 0, maximum) + // If the organ can't be healed, don't heal it. + if(damage_amount < 0 && !can_recover()) + return + + var/old_damage = damage + damage = min(clamp(damage + damage_amount, 0, maximum), maxHealth) + . = damage - old_damage + var/mess = check_damage_thresholds(owner) check_failing_thresholds() prev_damage = damage - if(mess && owner && owner.stat <= SOFT_CRIT) - to_chat(owner, mess) + if(!silent && damage_amount > 0 && owner && owner.stat < UNCONSCIOUS && !(organ_flags & ORGAN_SYNTHETIC) && (damage_amount > 5 || prob(10))) + if(!mess) + var/obj/item/bodypart/BP = loc + if(!BP) + return + var/degree = "" + if(damage < low_threshold) + degree = " a lot" + else if(damage_amount < 5) + degree = " a bit" + + owner.apply_pain(damage_amount, ownerlimb.body_zone, "Something inside your [BP.plaintext_zone] hurts[degree].", updating_health = FALSE) + + if(updating_health && owner) + owner.updatehealth() + ///SETS an organ's damage to the amount "damage_amount", and in doing so clears or sets the failing flag, good for when you have an effect that should fix an organ if broken /obj/item/organ/proc/setOrganDamage(damage_amount) //use mostly for admin heals applyOrganDamage(damage_amount - damage) + check_failing_thresholds(TRUE) + +/obj/item/organ/proc/getToxLoss() + return organ_flags & ORGAN_SYNTHETIC ? damage * 0.5 : damage /** check_damage_thresholds * input: mob/organ_owner (a mob, the owner of the organ we call the proc on) @@ -325,27 +464,65 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) if(delta > 0) if(damage >= maxHealth) return now_failing - if(damage > high_threshold && prev_damage <= high_threshold) + if(damage > (high_threshold * maxHealth) && prev_damage <= (high_threshold * maxHealth)) return high_threshold_passed - if(damage > low_threshold && prev_damage <= low_threshold) + if(damage > (low_threshold * maxHealth) && prev_damage <= (low_threshold * maxHealth)) return low_threshold_passed else - if(prev_damage > low_threshold && damage <= low_threshold) + if(prev_damage > (low_threshold * maxHealth) && damage <= (low_threshold * maxHealth)) return low_threshold_cleared - if(prev_damage > high_threshold && damage <= high_threshold) + if(prev_damage > (high_threshold * maxHealth) && damage <= (high_threshold * maxHealth)) return high_threshold_cleared if(prev_damage == maxHealth) return now_fixed ///Checks if an organ should/shouldn't be failing and gives the appropriate organ flag -/obj/item/organ/proc/check_failing_thresholds() +/obj/item/organ/proc/check_failing_thresholds(revivable) if(damage >= maxHealth) - organ_flags |= ORGAN_FAILING - if(damage < maxHealth) - organ_flags &= ~ORGAN_FAILING + set_organ_dead(TRUE) + else if(revivable) + set_organ_dead(FALSE) + +/// Set or unset the organ as failing. Returns TRUE on success. +/obj/item/organ/proc/set_organ_dead(failing) + if(failing) + if(organ_flags & ORGAN_DEAD) + return FALSE + organ_flags |= ORGAN_DEAD + time_of_death = world.time + return TRUE + else + if(organ_flags & ORGAN_DEAD) + organ_flags &= ~ORGAN_DEAD + time_of_death = 0 + return TRUE + +/// Can this organ be revived from the dead? +/obj/item/organ/proc/can_recover() + if(maxHealth < 0) + return FALSE + + // You can always repair a cyber organ + if((organ_flags & ORGAN_SYNTHETIC)) + return TRUE + + if(organ_flags & ORGAN_DEAD) + if(world.time >= (time_of_death + ORGAN_RECOVERY_THRESHOLD)) + return FALSE + + return TRUE + +/// Called by Insert() if the organ is vital and the target is dead. +/obj/item/organ/proc/attempt_vital_organ_revival(mob/living/carbon/human/owner) + set waitfor = FALSE + if(!owner.revive()) + return FALSE -//Looking for brains? -//Try code/modules/mob/living/carbon/brain/brain_item.dm + . = TRUE + owner.grab_ghost() + if(!HAS_TRAIT(owner, TRAIT_NOBREATH)) + spawn(-1) + owner.emote("gasp") /mob/living/proc/regenerate_organs() return FALSE @@ -386,22 +563,6 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) ears.Insert(src) ears.setOrganDamage(0) -/obj/item/organ/proc/handle_failing_organs(delta_time) - if(owner.stat == DEAD) - return - - failure_time += delta_time - organ_failure(delta_time) - -/** organ_failure - * generic proc for handling dying organs - * - * Arguments: - * delta_time - seconds since last tick - */ -/obj/item/organ/proc/organ_failure(delta_time) - return - /** get_availability * returns whether the species should innately have this organ. * @@ -418,15 +579,61 @@ INITIALIZE_IMMEDIATE(/obj/item/organ) return /// Called by medical scanners to get a simple summary of how healthy the organ is. Returns an empty string if things are fine. -/obj/item/organ/proc/get_status_text() - var/status = "" - if(owner.has_reagent(/datum/reagent/inverse/technetium)) - status = " organ is [round((damage/maxHealth)*100, 1)]% damaged." - else if(organ_flags & ORGAN_FAILING) - status = "Non-Functional" +/obj/item/organ/proc/get_scan_results(tag) + RETURN_TYPE(/list) + SHOULD_CALL_PARENT(TRUE) + . = list() + + // Necrotic + if(organ_flags & ORGAN_DEAD) + if(organ_flags & ORGAN_SYNTHETIC) + if(can_recover()) + . += tag ? "Failing" : "Failing" + else + . += tag ? "Irreparably Damaged" : "Irreperably Damaged" + else + if(can_recover()) + . += tag ? "Decaying" : "Decaying" + else + . += tag ? "Necrotic" : "Necrotic" + + // Infection + var/germ_message + switch (germ_level) + if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + ((INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3)) + germ_message = "Mild Infection" + if (INFECTION_LEVEL_ONE + ((INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3) to INFECTION_LEVEL_ONE + (2 * (INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3)) + germ_message = "Mild Infection+" + if (INFECTION_LEVEL_ONE + (2 * (INFECTION_LEVEL_TWO - INFECTION_LEVEL_ONE) / 3) to INFECTION_LEVEL_TWO) + germ_message = "Mild Infection++" + if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + ((INFECTION_LEVEL_THREE - INFECTION_LEVEL_THREE) / 3)) + germ_message = "Acute Infection" + if (INFECTION_LEVEL_TWO + ((INFECTION_LEVEL_THREE - INFECTION_LEVEL_THREE) / 3) to INFECTION_LEVEL_TWO + (2 * (INFECTION_LEVEL_THREE - INFECTION_LEVEL_TWO) / 3)) + germ_message = "Acute Infection+" + if (INFECTION_LEVEL_TWO + (2 * (INFECTION_LEVEL_THREE - INFECTION_LEVEL_TWO) / 3) to INFECTION_LEVEL_THREE) + germ_message = "Acute Infection++" + if (INFECTION_LEVEL_THREE to INFINITY) + germ_message = "Septic" + if (germ_message) + . += tag ? "[germ_message]" : germ_message + + // Add more info if Technetium is in their blood + if(owner.has_reagent(/datum/reagent/technetium)) + . += tag ? " organ is [round((damage/maxHealth)*100, 1)]% damaged." : "[round((damage/maxHealth)*100, 1)]" else if(damage > high_threshold) - status = "Severely Damaged" + . += tag ? "Severely Damaged" : "Severely Damaged" else if (damage > low_threshold) - status = "Mildly Damaged" + . += tag ? "Mildly Damaged" : "Mildly Damaged" + + return - return status +/// Used for the fix_organ surgery, lops off some of the maxHealth if the organ was very damaged. +/obj/item/organ/proc/surgically_fix(mob/user) + if(damage > maxHealth * low_threshold) + var/scarring = damage/maxHealth + scarring = 1 - 0.3 * scarring ** 2 // Between ~15 and 30 percent loss + var/new_max_dam = FLOOR(scarring * maxHealth, 1) + if(new_max_dam < maxHealth) + to_chat(user, span_warning("Not every part of [src] could be saved, some dead tissue had to be removed, making it more suspectable to damage in the future.")) + set_max_health(new_max_dam) + applyOrganDamage(-damage) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index 1abd993ca45f..c57a24481d98 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -11,8 +11,8 @@ slot = ORGAN_SLOT_APPENDIX food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/bad_food = 5) grind_results = list(/datum/reagent/toxin/bad_food = 5) - healing_factor = STANDARD_ORGAN_HEALING - decay_factor = STANDARD_ORGAN_DECAY + + relative_size = 5 now_failing = "An explosion of pain erupts in your lower right abdomen!" now_fixed = "The pain in your abdomen has subsided." @@ -28,16 +28,18 @@ return ..() /obj/item/organ/appendix/on_life(delta_time, times_fired) - ..() + . = ..() var/mob/living/carbon/organ_owner = owner if(!organ_owner) return - if(organ_flags & ORGAN_FAILING) + if(organ_flags & ORGAN_DEAD) // forced to ensure people don't use it to gain tox as slime person - organ_owner.adjustToxLoss(2 * delta_time, updating_health = TRUE, forced = TRUE) + organ_owner.adjustToxLoss(2 * delta_time, updating_health = FALSE, forced = TRUE) + return TRUE else if(inflamation_stage) - inflamation(delta_time) + return inflamation(delta_time) + else if(DT_PROB(APPENDICITIS_PROB, delta_time)) become_inflamed() @@ -62,15 +64,13 @@ to_chat(organ_owner, span_warning("You feel a stabbing pain in your abdomen!")) organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5) organ_owner.Stun(rand(40, 60)) - organ_owner.adjustToxLoss(1, updating_health = TRUE, forced = TRUE) + organ_owner.adjustToxLoss(1, updating_health = FALSE, forced = TRUE) + . = TRUE if(3) if(DT_PROB(0.5, delta_time)) organ_owner.vomit(95) - organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) - - -/obj/item/organ/appendix/get_availability(datum/species/owner_species) - return !(TRAIT_NOHUNGER in owner_species.inherent_traits) + organ_owner.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15, updating_health = FALSE) + . = TRUE /obj/item/organ/appendix/Remove(mob/living/carbon/organ_owner, special = FALSE) REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) @@ -86,11 +86,10 @@ ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type) organ_owner.med_hud_set_status() -/obj/item/organ/appendix/get_status_text() - if((!(organ_flags & ORGAN_FAILING)) && inflamation_stage) - return "Inflamed" - else - return ..() +/obj/item/organ/appendix/get_scan_results(tag) + . = ..() + if((!(organ_flags & ORGAN_DEAD)) && inflamation_stage) + . += tag ? "Inflamed" : "Inflamed" #undef APPENDICITIS_PROB #undef INFLAMATION_ADVANCEMENT_PROB diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 507683a0878d..5a401246a31f 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -57,7 +57,7 @@ /obj/item/organ/cyberimp/arm/examine(mob/user) . = ..() - if(status == ORGAN_ROBOTIC) + if(organ_flags & ORGAN_SYNTHETIC) . += span_info("[src] is assembled in the [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm configuration. You can use a screwdriver to reassemble it.") /obj/item/organ/cyberimp/arm/screwdriver_act(mob/living/user, obj/item/screwtool) @@ -97,7 +97,7 @@ /obj/item/organ/cyberimp/arm/emp_act(severity) . = ..() - if(. & EMP_PROTECT_SELF || status == ORGAN_ROBOTIC) + if(. & EMP_PROTECT_SELF || (organ_flags & ORGAN_SYNTHETIC)) return if(prob(15/severity) && owner) to_chat(owner, span_warning("The electromagnetic pulse causes [src] to malfunction!")) @@ -170,7 +170,7 @@ playsound(get_turf(owner), extend_sound, 50, TRUE) /obj/item/organ/cyberimp/arm/ui_action_click() - if((organ_flags & ORGAN_FAILING) || (!active_item && !contents.len)) + if((organ_flags & ORGAN_DEAD) || (!active_item && !contents.len)) to_chat(owner, span_warning("The implant doesn't respond. It seems to be broken...")) return @@ -198,7 +198,7 @@ . = ..() if(. & EMP_PROTECT_SELF) return - if(prob(30/severity) && owner && !(organ_flags & ORGAN_FAILING)) + if(prob(30/severity) && owner && !(organ_flags & ORGAN_DEAD)) Retract() owner.visible_message(span_danger("A loud bang comes from [owner]\'s [zone == BODY_ZONE_R_ARM ? "right" : "left"] arm!")) playsound(get_turf(owner), 'sound/weapons/flashbang.ogg', 100, TRUE) @@ -206,8 +206,7 @@ owner.adjust_fire_stacks(20) owner.ignite_mob() owner.adjustFireLoss(25) - organ_flags |= ORGAN_FAILING - + set_organ_dead(TRUE) /obj/item/organ/cyberimp/arm/gun/laser name = "arm-mounted laser implant" @@ -302,4 +301,4 @@ /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." - 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) + 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) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index 5c11fbc2a81a..8fd9d52e2046 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -57,23 +57,21 @@ /obj/item/organ/cyberimp/chest/reviver/on_life(delta_time, times_fired) if(reviving) - switch(owner.stat) - if(UNCONSCIOUS, HARD_CRIT) - addtimer(CALLBACK(src, PROC_REF(heal)), 3 SECONDS) - else - COOLDOWN_START(src, reviver_cooldown, revive_cost) - reviving = FALSE - to_chat(owner, span_notice("Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].")) + if(owner.stat == UNCONSCIOUS) + addtimer(CALLBACK(src, PROC_REF(heal)), 3 SECONDS) + else + COOLDOWN_START(src, reviver_cooldown, revive_cost) + reviving = FALSE + to_chat(owner, span_notice("Your reviver implant shuts down and starts recharging. It will be ready again in [DisplayTimeText(revive_cost)].")) return if(!COOLDOWN_FINISHED(src, reviver_cooldown) || owner.suiciding) return - switch(owner.stat) - if(UNCONSCIOUS, HARD_CRIT) - revive_cost = 0 - reviving = TRUE - to_chat(owner, span_notice("You feel a faint buzzing as your reviver implant starts patching your wounds...")) + if(owner.stat == UNCONSCIOUS) + revive_cost = 0 + reviving = TRUE + to_chat(owner, span_notice("You feel a faint buzzing as your reviver implant starts patching your wounds...")) /obj/item/organ/cyberimp/chest/reviver/proc/heal() @@ -102,8 +100,7 @@ if(ishuman(owner)) var/mob/living/carbon/human/human_owner = owner - if(human_owner.stat != DEAD && prob(50 / severity) && human_owner.can_heartattack()) - human_owner.set_heartattack(TRUE) + if(human_owner.stat != DEAD && prob(50 / severity) && human_owner.set_heartattack(TRUE)) to_chat(human_owner, span_userdanger("You feel a horrible agony in your chest!")) addtimer(CALLBACK(src, PROC_REF(undo_heart_attack)), 600 / severity) @@ -111,9 +108,10 @@ var/mob/living/carbon/human/human_owner = owner if(!istype(human_owner)) return - human_owner.set_heartattack(FALSE) - if(human_owner.stat == CONSCIOUS) - to_chat(human_owner, span_notice("You feel your heart beating again!")) + if(human_owner.resuscitate()) + log_health(human_owner, "Heart restarted due to reviver implant.") + if(human_owner.stat == CONSCIOUS) + to_chat(human_owner, span_notice("You feel your heart beating again!")) /obj/item/organ/cyberimp/chest/thrusters @@ -162,7 +160,7 @@ /obj/item/organ/cyberimp/chest/thrusters/proc/activate(silent = FALSE) if(on) return - if(organ_flags & ORGAN_FAILING) + if(organ_flags & (ORGAN_DEAD|ORGAN_CUT_AWAY)) if(!silent) to_chat(owner, span_warning("Your thrusters set seems to be broken!")) return diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm index e247309ffccd..1c07b09637d4 100644 --- a/code/modules/surgery/organs/augments_eyes.dm +++ b/code/modules/surgery/organs/augments_eyes.dm @@ -22,14 +22,14 @@ if(HUD_type) var/datum/atom_hud/hud = GLOB.huds[HUD_type] - hud.add_hud_to(eye_owner) + hud.show_to(eye_owner) if(HUD_trait) ADD_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) /obj/item/organ/cyberimp/eyes/hud/Remove(mob/living/carbon/eye_owner, special = 0) if(HUD_type) var/datum/atom_hud/hud = GLOB.huds[HUD_type] - hud.remove_hud_from(eye_owner) + hud.hide_from(eye_owner) if(HUD_trait) REMOVE_TRAIT(eye_owner, HUD_trait, ORGAN_TRAIT) ..() diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 8f05c9617f10..d0da5ff285d5 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -3,7 +3,6 @@ name = "cybernetic implant" desc = "A state-of-the-art implant that improves a baseline's functionality." visual = FALSE - status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC var/implant_color = "#FFFFFF" var/implant_overlay @@ -129,11 +128,11 @@ /obj/item/organ/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) SIGNAL_HANDLER - if(!(organ_flags & ORGAN_FAILING) && amount > 0) + if(!(organ_flags & (ORGAN_DEAD|ORGAN_CUT_AWAY)) && amount > 0) addtimer(CALLBACK(src, PROC_REF(clear_stuns)), stun_cap_amount, TIMER_UNIQUE|TIMER_OVERRIDE) /obj/item/organ/cyberimp/brain/anti_stun/proc/clear_stuns() - if(owner || !(organ_flags & ORGAN_FAILING)) + if(owner || !(organ_flags & (ORGAN_DEAD|ORGAN_CUT_AWAY))) owner.SetStun(0) owner.SetKnockdown(0) owner.SetImmobilized(0) @@ -141,13 +140,13 @@ /obj/item/organ/cyberimp/brain/anti_stun/emp_act(severity) . = ..() - if((organ_flags & ORGAN_FAILING) || . & EMP_PROTECT_SELF) + if((organ_flags & (ORGAN_DEAD|ORGAN_CUT_AWAY)) || . & EMP_PROTECT_SELF) return - organ_flags |= ORGAN_FAILING + set_organ_dead(TRUE) addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) /obj/item/organ/cyberimp/brain/anti_stun/proc/reboot() - organ_flags &= ~ORGAN_FAILING + set_organ_dead(FALSE) //[[[[MOUTH]]]] /obj/item/organ/cyberimp/mouth diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm index e4d0f869a312..f50e52a25054 100644 --- a/code/modules/surgery/organs/autosurgeon.dm +++ b/code/modules/surgery/organs/autosurgeon.dm @@ -80,7 +80,7 @@ "[user] prepares to use [src] on [target].", "You begin to prepare to use [src] on [target]." ) - if(!do_after(user, (8 SECONDS * surgery_speed), target)) + if(!do_after(user, target, (8 SECONDS * surgery_speed))) return user.visible_message(span_notice("[user] presses a button on [src], and you hear a short mechanical noise."), span_notice("You press a button on [src] as it plunges into [target]'s body.")) to_chat(target, span_notice("You feel a sharp sting as something plunges into your body!")) diff --git a/code/modules/surgery/organs/cell.dm b/code/modules/surgery/organs/cell.dm new file mode 100644 index 000000000000..963cf9282e46 --- /dev/null +++ b/code/modules/surgery/organs/cell.dm @@ -0,0 +1,173 @@ +/obj/item/organ/cell + name = "microbattery" + desc = "A housing for a stadndard cell to convert power for use in fully prosthetic bodies." + icon_state = "cell" + + organ_flags = ORGAN_SYNTHETIC | ORGAN_VITAL + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_CELL + + /// Is the cell housing open? + var/open + /// The internal cell that actually holds power. + var/obj/item/stock_parts/cell/high/cell = /obj/item/stock_parts/cell/high + //at 2.6 completely depleted after 60ish minutes of constant walking or 130 minutes of standing still + var/servo_cost = 2.6 + +/obj/item/organ/cell/Initialize(mapload, mob_sprite) + . = ..() + cell = new cell(src) + +/obj/item/organ/cell/Insert(mob/living/carbon/carbon, special = 0) + if(!(carbon.needs_organ(ORGAN_SLOT_CELL))) + return FALSE + . = ..() + if(!.) + return + + RegisterSignal(owner, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(give)) + RegisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT, PROC_REF(on_electrocute)) + +/obj/item/organ/cell/Remove(mob/living/carbon/carbon, special = 0) + UnregisterSignal(carbon, COMSIG_PROCESS_BORGCHARGER_OCCUPANT) + UnregisterSignal(carbon, COMSIG_LIVING_ELECTROCUTE_ACT) + + carbon.clear_alert(ALERT_CHARGE) + return ..() + +/obj/item/organ/cell/on_life(delta_time, times_fired) + use(get_power_drain(), TRUE) + +/obj/item/organ/cell/proc/charge(datum/source, amount, repairs) + SIGNAL_HANDLER + if(!cell) + return + give(amount) + +/obj/item/organ/cell/proc/give(amount) + var/old = get_percent() + . = cell.give(amount) + handle_charge(owner, old) + +/obj/item/organ/cell/proc/on_electrocute(datum/source, shock_damage, siemens_coeff = 1, flags = NONE) + SIGNAL_HANDLER + if(flags & SHOCK_ILLUSION) + return + give(null, shock_damage * siemens_coeff * 2) + to_chat(owner, span_notice("You absorb some of the shock into your body!")) + +/obj/item/organ/cell/proc/handle_charge(mob/living/carbon/carbon, last_charge) + var/percent = get_percent() + if(percent == 0) + carbon.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/emptycell) + carbon.death() + else + switch(percent) + if(0 to 25) + carbon.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell, 3) + if(last_charge > 25) + to_chat(owner, span_warning("Your internal battery beeps an alert code, it is low on charge!")) + + if(25 to 50) + carbon.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell, 2) + + if(50 to 75) + carbon.throw_alert(ALERT_CHARGE, /atom/movable/screen/alert/lowcell, 1) + + else + carbon.clear_alert(ALERT_CHARGE) + + if(last_charge == 0) + attempt_vital_organ_revival(owner) + +/obj/item/organ/cell/proc/get_percent() + if(!cell) + return 0 + return get_charge()/cell.maxcharge * 100 + +/obj/item/organ/cell/proc/get_charge() + if(!cell) + return 0 + if(organ_flags & ORGAN_DEAD) + return 0 + return round(cell.charge*(1 - damage/maxHealth)) + +/obj/item/organ/cell/use(amount, force) + if(organ_flags & ORGAN_DEAD) + return FALSE + if(!cell) + return + var/old = get_percent() + . = cell.use(amount, force) + handle_charge(owner, old) + +/// Power drain per tick or per step, scales with damage taken. +/obj/item/organ/cell/proc/get_power_drain() + var/damage_factor = 1 + 10 * damage/maxHealth + return servo_cost * damage_factor + +#define OWNER_CHECK \ + if(QDELETED(src) || QDELETED(owner) || owner != ipc || !get_percent() || owner.stat == DEAD) { \ + if(!QDELETED(screen)) { \ + screen.set_sprite("None"); \ + if(!QDELETED(ipc)) { \ + ipc.update_body_parts();\ + } \ + } \ + if(!QDELETED(ipc)) { \ + REMOVE_TRAIT(ipc, TRAIT_INCAPACITATED, ref(src)); \ + REMOVE_TRAIT(ipc, TRAIT_FLOORED, ref(src)); \ + REMOVE_TRAIT(ipc, TRAIT_IMMOBILIZED, ref(src)); \ + REMOVE_TRAIT(ipc, TRAIT_HANDS_BLOCKED, ref(src)); \ + REMOVE_TRAIT(ipc, TRAIT_NO_VOLUNTARY_SPEECH, ref(src)); \ + REMOVE_TRAIT(ipc, TRAIT_BLIND, ref(src)); \ + } \ + return \ + } + +/obj/item/organ/cell/attempt_vital_organ_revival(mob/living/carbon/human/ipc) + set waitfor = FALSE + if(!(ipc.stat == DEAD && (organ_flags & ORGAN_VITAL) && !(organ_flags & ORGAN_DEAD) && ipc.needs_organ(slot))) + return + + if(ipc.revive()) + ipc.notify_ghost_revival("Your chassis power has been restored!") + ipc.grab_ghost() + else + return + + ADD_TRAIT(ipc, TRAIT_INCAPACITATED, ref(src)) + ADD_TRAIT(ipc, TRAIT_FLOORED, ref(src)) + ADD_TRAIT(ipc, TRAIT_IMMOBILIZED, ref(src)) + ADD_TRAIT(ipc, TRAIT_HANDS_BLOCKED, ref(src)) + ADD_TRAIT(ipc, TRAIT_NO_VOLUNTARY_SPEECH, ref(src)) + ADD_TRAIT(ipc, TRAIT_BLIND, ref(src)) + + + var/obj/item/organ/ipc_screen/screen = ipc.getorganslot(ORGAN_SLOT_EXTERNAL_IPC_SCREEN) + if(screen) + screen.set_sprite("BSOD") + ipc.update_body_parts() + sleep(3 SECONDS) + OWNER_CHECK + + ipc.say("Reactivating [pick("core systems", "central subroutines", "key functions")]...", forced = "ipc reboot") + sleep(3 SECONDS) + OWNER_CHECK + + ipc.say("Initializing motor functionality...", forced = "ipc reboot") + sleep(3 SECONDS) + OWNER_CHECK + + screen.set_sprite(ipc.dna.features[screen.feature_key]) + ipc.update_body_parts() + ipc.emote("ping") + + REMOVE_TRAIT(ipc, TRAIT_INCAPACITATED, ref(src)) + REMOVE_TRAIT(ipc, TRAIT_FLOORED, ref(src)) + REMOVE_TRAIT(ipc, TRAIT_IMMOBILIZED, ref(src)) + REMOVE_TRAIT(ipc, TRAIT_HANDS_BLOCKED, ref(src)) + REMOVE_TRAIT(ipc, TRAIT_NO_VOLUNTARY_SPEECH, ref(src)) + REMOVE_TRAIT(ipc, TRAIT_BLIND, ref(src)) + +#undef OWNER_CHECK diff --git a/code/modules/surgery/organs/ears.dm b/code/modules/surgery/organs/ears.dm index 91b1c6492271..79066a64aa65 100644 --- a/code/modules/surgery/organs/ears.dm +++ b/code/modules/surgery/organs/ears.dm @@ -7,14 +7,13 @@ visual = FALSE gender = PLURAL - healing_factor = STANDARD_ORGAN_HEALING - decay_factor = STANDARD_ORGAN_DECAY - low_threshold_passed = "Your ears begin to resonate with an internal ring." now_failing = "You are unable to hear at all!" now_fixed = "Noise slowly begins filling your ears once more." low_threshold_cleared = "The ringing in your ears has died down." + relative_size = 5 + // `deaf` measures "ticks" of deafness. While > 0, the person is unable // to hear anything. var/deaf = 0 @@ -30,7 +29,7 @@ /obj/item/organ/ears/on_life(delta_time, times_fired) // only inform when things got worse, needs to happen before we heal - if((damage > low_threshold && prev_damage < low_threshold) || (damage > high_threshold && prev_damage < high_threshold)) + if((damage > (low_threshold * maxHealth) && prev_damage < (low_threshold * maxHealth)) || (damage > (high_threshold * maxHealth) && prev_damage < (high_threshold * maxHealth))) to_chat(owner, span_warning("The ringing in your ears grows louder, blocking out any external noises for a moment.")) . = ..() @@ -38,7 +37,7 @@ if(HAS_TRAIT_NOT_FROM(owner, TRAIT_DEAF, EAR_DAMAGE)) return - if((organ_flags & ORGAN_FAILING)) + if((organ_flags & ORGAN_DEAD)) deaf = max(deaf, 1) // if we're failing we always have at least 1 deaf stack (and thus deafness) else // only clear deaf stacks if we're not failing deaf = max(deaf - (0.5 * delta_time), 0) @@ -67,23 +66,25 @@ visual = TRUE damage_multiplier = 2 -/obj/item/organ/ears/cat/Insert(mob/living/carbon/human/ear_owner, special = 0, drop_if_replaced = TRUE) + dna_block = DNA_EARS_BLOCK + feature_key = "ears" + layers = list(BODY_FRONT_LAYER, BODY_BEHIND_LAYER) + color_source = ORGAN_COLOR_HAIR + +/obj/item/organ/ears/cat/can_draw_on_bodypart(mob/living/carbon/human/human) . = ..() - if(!.) - return + if(human.head && (human.head.flags_inv & HIDEHAIR) || (human.wear_mask && (human.wear_mask.flags_inv & HIDEHAIR))) + return FALSE - if(istype(ear_owner)) - color = ear_owner.hair_color - ear_owner.dna.features["ears"] = ear_owner.dna.species.mutant_bodyparts["ears"] = "Cat" - ear_owner.dna.update_uf_block(DNA_EARS_BLOCK) - ear_owner.update_body() +/obj/item/organ/ears/cat/get_global_feature_list() + return GLOB.ears_list + +/obj/item/organ/ears/cat/build_overlays(physique, image_dir) + . = ..() + if(sprite_datum.hasinner) + for(var/image_layer in layers) + . += image(sprite_datum.icon, "m_earsinner_[sprite_datum.icon_state]_[global.layer2text["[image_layer]"]]", layer = -image_layer) -/obj/item/organ/ears/cat/Remove(mob/living/carbon/human/ear_owner, special = 0) - ..() - if(istype(ear_owner)) - color = ear_owner.hair_color - ear_owner.dna.species.mutant_bodyparts -= "ears" - ear_owner.update_body() /obj/item/organ/ears/penguin name = "penguin ears" diff --git a/code/modules/surgery/organs/external/_external_organs.dm b/code/modules/surgery/organs/external/_external_organs.dm index dec0d5f8dbf5..3e961523e6d3 100644 --- a/code/modules/surgery/organs/external/_external_organs.dm +++ b/code/modules/surgery/organs/external/_external_organs.dm @@ -26,7 +26,10 @@ ///Update our features after something changed our appearance /obj/item/organ/proc/mutate_feature(features, mob/living/carbon/human/human) - if(!dna_block || !get_global_feature_list()) + if(!dna_block) + return + + if(!get_global_feature_list()) CRASH("External organ has no dna block/feature_list implimented!") var/list/feature_list = get_global_feature_list() @@ -56,7 +59,7 @@ if(ORGAN_COLOR_INHERIT_ALL) mutcolors = ownerlimb.mutcolors.Copy() - draw_color = mutcolors["[mutcolor_used]_1"] + draw_color = mutcolors["[mutcolor_used]_[mutcolor_index]"] color = draw_color return TRUE @@ -83,7 +86,7 @@ dna_block = DNA_HORNS_BLOCK /obj/item/organ/horns/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + if(!(human.obscured_slots & HIDEHAIR)) return TRUE return FALSE @@ -108,7 +111,7 @@ dna_block = DNA_FRILLS_BLOCK /obj/item/organ/frills/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEEARS)) + if(!(human.obscured_slots & HIDEEARS)) return TRUE return FALSE @@ -199,7 +202,7 @@ color_source = ORGAN_COLOR_OVERRIDE /obj/item/organ/pod_hair/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + if(!(human.obscured_slots & HIDEHAIR)) return TRUE return FALSE @@ -210,31 +213,6 @@ var/list/rgb_list = rgb2num(rgb_value) return rgb(255 - rgb_list[1], 255 - rgb_list[2], 255 - rgb_list[3]) -//skrell -/obj/item/organ/headtails - ///Unremovable is until the features are completely finished - organ_flags = ORGAN_UNREMOVABLE | ORGAN_EDIBLE - visual = TRUE - cosmetic_only = TRUE - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_HEADTAILS - layers = list(BODY_FRONT_LAYER | BODY_ADJ_LAYER) - dna_block = DNA_HEADTAILS_BLOCK - - feature_key = "headtails" - preference = "feature_headtails" - -/obj/item/organ/headtails/can_draw_on_bodypart(mob/living/carbon/human/human) - . = TRUE - if(human.head && (human.head.flags_inv & HIDEHAIR)) - return FALSE - if(human.wear_mask && (human.wear_mask.flags_inv & HIDEHAIR)) - return FALSE - -/obj/item/organ/headtails/get_global_feature_list() - return GLOB.headtails_list - // Teshari head feathers /obj/item/organ/teshari_feathers name = "head feathers" @@ -254,7 +232,7 @@ color_source = ORGAN_COLOR_HAIR /obj/item/organ/teshari_feathers/can_draw_on_bodypart(mob/living/carbon/human/human) - if(human.head && (human.head.flags_inv & HIDEHAIR) || human.wear_mask && (human.wear_mask.flags_inv & HIDEHAIR)) + if(human.obscured_slots & HIDEHAIR) return FALSE return TRUE @@ -279,7 +257,7 @@ dna_block = DNA_TESHARI_EARS_BLOCK /obj/item/organ/teshari_ears/can_draw_on_bodypart(mob/living/carbon/human/human) - if(human.head && (human.head.flags_inv & HIDEHAIR) || human.wear_mask && (human.wear_mask.flags_inv & HIDEHAIR)) + if(human.obscured_slots & HIDEHAIR) return FALSE return TRUE @@ -323,7 +301,7 @@ /obj/item/organ/teshari_body_feathers/can_draw_on_bodypart(mob/living/carbon/human/human) if(!human) return TRUE - if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(human.obscured_slots & HIDEJUMPSUIT) return FALSE return TRUE @@ -347,6 +325,8 @@ var/state2use = build_icon_state(physique, image_layer) for(var/obj/item/bodypart/BP as anything in owner.bodyparts - owner.get_bodypart(BODY_ZONE_CHEST)) + if(!IS_ORGANIC_LIMB(BP)) + continue var/mutable_appearance/new_overlay = mutable_appearance(sprite_datum.icon, "[state2use]_[BP.body_zone]", layer = -image_layer) new_overlay.color = mutcolors[bodypart_color_indexes[BP.body_zone]] . += new_overlay @@ -354,11 +334,17 @@ /obj/item/organ/teshari_body_feathers/build_cache_key() . = ..() if(ishuman(owner)) - . += "[!!owner.get_bodypart(BODY_ZONE_CHEST)]" - . += "[!!owner.get_bodypart(BODY_ZONE_HEAD)]" - . += "[!!owner.get_bodypart(BODY_ZONE_L_ARM)]" - . += "[!!owner.get_bodypart(BODY_ZONE_R_ARM)]" - . += "[!!owner.get_bodypart(BODY_ZONE_L_LEG)]" - . += "[!!owner.get_bodypart(BODY_ZONE_R_LEG)]" + var/obj/item/bodypart/BP = owner.get_bodypart(BODY_ZONE_CHEST) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" + BP = owner.get_bodypart(BODY_ZONE_HEAD) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" + BP = owner.get_bodypart(BODY_ZONE_R_ARM) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" + BP = owner.get_bodypart(BODY_ZONE_L_ARM) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" + BP = owner.get_bodypart(BODY_ZONE_R_LEG) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" + BP = owner.get_bodypart(BODY_ZONE_L_LEG) + . += BP ? "[IS_ORGANIC_LIMB(BP)]" : "NOAPPLY" else . += "CHEST_ONLY" diff --git a/code/modules/surgery/organs/external/ipc.dm b/code/modules/surgery/organs/external/ipc.dm new file mode 100644 index 000000000000..00a1232a740c --- /dev/null +++ b/code/modules/surgery/organs/external/ipc.dm @@ -0,0 +1,240 @@ +/obj/item/organ/ipc_screen + name = "ipc screen" + organ_flags = ORGAN_UNREMOVABLE + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_IPC_SCREEN + layers = list(BODY_ADJ_LAYER) + + feature_key = "ipc_screen" + preference = "ipc_screen" + + dna_block = DNA_IPC_SCREEN_BLOCK + + actions_types = list(/datum/action/innate/ipc_screen_change) + +/obj/item/organ/ipc_screen/get_global_feature_list() + return GLOB.ipc_screens_list + +/obj/item/organ/ipc_screen/can_draw_on_bodypart(mob/living/carbon/human/human) + return human.is_face_visible() + +/datum/action/innate/ipc_screen_change + name = "Change Screen" + desc = "Change your display's image." + var/obj/item/organ/ipc_screen/screen + +/datum/action/innate/ipc_screen_change/New(Target) + . = ..() + screen = Target + +/datum/action/innate/ipc_screen_change/Destroy() + screen = null + return ..() + +/datum/action/innate/ipc_screen_change/Activate() + var/mob/living/carbon/C = owner + if(C.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) + to_chat(C, span_warning("You can't do that right now.")) + return + var/input = tgui_input_list(C, "Select Screen", "IPC Screen", screen.get_global_feature_list()) + if(C.incapacitated(IGNORE_RESTRAINTS|IGNORE_GRAB)) + to_chat(C, span_warning("You can't do that right now.")) + return + + screen.set_sprite(input) + C.update_body_parts() + +/obj/item/organ/ipc_antenna + name = "ipc antenna" + organ_flags = ORGAN_UNREMOVABLE + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_IPC_ANTENNA + layers = list(BODY_ADJ_LAYER) + + feature_key = "ipc_antenna" + preference = "ipc_antenna" + + dna_block = DNA_IPC_ANTENNA_BLOCK + color_source = ORGAN_COLOR_INHERIT_ALL + mutcolor_used = MUTCOLORS_KEY_IPC_ANTENNA + +/obj/item/organ/ipc_antenna/get_global_feature_list() + return GLOB.ipc_antenna_list + +/obj/item/organ/ipc_antenna/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.obscured_slots & HIDEHAIR)) + return TRUE + return FALSE + +/obj/item/organ/saurian_screen + name = "saurian ipc screen" + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_SAURIAN_SCREEN + layers = list(BODY_ADJ_LAYER) + + feature_key = "saurian_screen" + preference = "saurian_screen" + + dna_block = DNA_SAURIAN_SCREEN_BLOCK + color_source = ORGAN_COLOR_INHERIT_ALL + mutcolor_used = MUTCOLORS_KEY_GENERIC + +/obj/item/organ/saurian_screen/get_global_feature_list() + return GLOB.saurian_screens_list + +/obj/item/organ/saurian_screen/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.obscured_slots & HIDESNOUT)) + return TRUE + return FALSE + +/obj/item/organ/saurian_screen/build_overlays(physique, image_dir) + . = ..() + + for(var/image_layer in layers) + var/state2use = build_icon_state(physique, image_layer) + + if(!icon_exists(sprite_datum.icon, "[state2use]_secondary", FALSE)) + continue + var/image/secondary = image(sprite_datum.icon, "[state2use]_secondary") + secondary.color = mutcolors[MUTCOLORS_GENERIC_2] + . += secondary + + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/H = owner + + var/image/I = image(sprite_datum.icon, "eyes", layer = -EYE_LAYER) + I.color = H.eye_color_left + . += I + . += emissive_appearance(sprite_datum.icon, "eyes", -EYE_LAYER) + +/obj/item/organ/saurian_tail + name = "tail" + desc = "A severed tail. What did you cut this off of?" + icon_state = "severedtail" + organ_flags = ORGAN_UNREMOVABLE + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_PRECISE_GROIN + slot = ORGAN_SLOT_EXTERNAL_TAIL + layers = list(BODY_FRONT_LAYER, BODY_BEHIND_LAYER) + feature_key = "saurian_tail" + dna_block = DNA_SAURIAN_TAIL_BLOCK + +/obj/item/organ/saurian_tail/get_global_feature_list() + return GLOB.saurian_tails_list + +/obj/item/organ/saurian_scutes + name = "scutes" + organ_flags = ORGAN_UNREMOVABLE + + visual = TRUE + cosmetic_only = TRUE + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_SAURIAN_SCUTES + layers = list(BODY_ADJ_LAYER) + feature_key = "saurian_scutes" + dna_block = DNA_SAURIAN_SCUTES_BLOCK + + color_source = ORGAN_COLOR_INHERIT_ALL + mutcolor_used = MUTCOLORS_KEY_GENERIC + mutcolor_index = 3 + +/obj/item/organ/saurian_scutes/get_global_feature_list() + return GLOB.saurian_scutes_list + +/obj/item/organ/saurian_screen + name = "saurian ipc screen" + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_SAURIAN_SCREEN + layers = list(BODY_ADJ_LAYER) + + feature_key = "saurian_screen" + preference = "saurian_screen" + + dna_block = DNA_SAURIAN_SCREEN_BLOCK + color_source = ORGAN_COLOR_INHERIT_ALL + mutcolor_used = MUTCOLORS_KEY_GENERIC + +/obj/item/organ/saurian_screen/get_global_feature_list() + return GLOB.saurian_screens_list + +/obj/item/organ/saurian_screen/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.obscured_slots & HIDESNOUT)) + return TRUE + return FALSE + +/obj/item/organ/saurian_screen/build_overlays(physique, image_dir) + . = ..() + + for(var/image_layer in layers) + var/state2use = build_icon_state(physique, image_layer) + + if(!icon_exists(sprite_datum.icon, "[state2use]_secondary", FALSE)) + continue + var/image/secondary = image(sprite_datum.icon, "[state2use]_secondary") + secondary.color = mutcolors[MUTCOLORS_GENERIC_2] + . += secondary + + if(!ishuman(owner)) + return + + var/mob/living/carbon/human/H = owner + + var/image/I = image(sprite_datum.icon, "eyes", layer = -EYE_LAYER) + I.color = H.eye_color_left + . += I + . += emissive_appearance(sprite_datum.icon, "eyes", -EYE_LAYER) + + +/obj/item/organ/saurian_antenna + name = "saurian_antenna" + organ_flags = ORGAN_UNREMOVABLE + visual = TRUE + cosmetic_only = TRUE + + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_IPC_ANTENNA + layers = list(BODY_ADJ_LAYER) + + feature_key = "saurian_antenna" + preference = "saurian_antenna" + render_key = "ipc_antenna_synth" + + dna_block = DNA_SAURIAN_ANTENNA_BLOCK + color_source = ORGAN_COLOR_INHERIT_ALL + mutcolor_used = MUTCOLORS_KEY_SAURIAN_ANTENNA + +/obj/item/organ/saurian_antenna/get_global_feature_list() + return GLOB.saurian_antenna_list + +/obj/item/organ/saurian_antenna/can_draw_on_bodypart(mob/living/carbon/human/human) + if(!(human.obscured_slots & HIDEHAIR)) + return TRUE + return FALSE + +/obj/item/organ/saurian_antenna/build_overlays(physique, image_dir) + . = ..() + + for(var/image_layer in layers) + var/state2use = build_icon_state(physique, image_layer) + + if(!icon_exists(sprite_datum.icon, "[state2use]_secondary", FALSE)) + continue + var/image/secondary = image(sprite_datum.icon, "[state2use]_secondary") + secondary.color = mutcolors[MUTCOLORS_GENERIC_2] + . += secondary diff --git a/code/modules/surgery/organs/external/rendering.dm b/code/modules/surgery/organs/external/rendering.dm index 9d7d9a3b8d07..58f219200b1f 100644 --- a/code/modules/surgery/organs/external/rendering.dm +++ b/code/modules/surgery/organs/external/rendering.dm @@ -39,6 +39,8 @@ GLOBAL_LIST_EMPTY(organ_overlays_cache) var/list/mutcolors = list() ///See above var/mutcolor_used + ///Which index of the mutcolor key list to use. Defaults to 1, so MUTCOLORS_GENERIC_1 if mutcolor_used is MUTCOLORS_KEY_GENERIC + var/mutcolor_index = 1 ///Does this organ have any bodytypes to pass to it's ownerlimb? var/external_bodytypes = NONE @@ -109,7 +111,7 @@ GLOBAL_LIST_EMPTY(organ_overlays_cache) if(!icon_exists(sprite_datum.icon, finished_icon_state)) stack_trace("Organ state layer [layer_text] missing from [sprite_datum.type]!") - dump_error = TRUE + //dump_error = TRUE var/icon/temp_icon = icon(sprite_datum.icon, finished_icon_state) if(sprite_datum.color_src && draw_color) diff --git a/code/modules/surgery/organs/external/skrell_headtails.dm b/code/modules/surgery/organs/external/skrell_headtails.dm deleted file mode 100644 index 8c62111d6224..000000000000 --- a/code/modules/surgery/organs/external/skrell_headtails.dm +++ /dev/null @@ -1,24 +0,0 @@ -/obj/item/organ/skrell_headtails - ///Unremovable is until the features are completely finished - organ_flags = ORGAN_UNREMOVABLE | ORGAN_EDIBLE - visual = TRUE - cosmetic_only = TRUE - - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_HEADTAILS - layers = list(BODY_FRONT_LAYER, BODY_ADJ_LAYER) - - dna_block = DNA_HEADTAILS_BLOCK - - feature_key = "headtails" - preference = "feature_headtails" - - color_source = ORGAN_COLOR_HAIR - -/obj/item/organ/skrell_headtails/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) - return TRUE - return FALSE - -/obj/item/organ/skrell_headtails/get_global_feature_list() - return GLOB.headtails_list diff --git a/code/modules/surgery/organs/external/snouts.dm b/code/modules/surgery/organs/external/snouts.dm index 8d52ccee7586..e592fc174c0a 100644 --- a/code/modules/surgery/organs/external/snouts.dm +++ b/code/modules/surgery/organs/external/snouts.dm @@ -16,7 +16,7 @@ dna_block = DNA_SNOUT_BLOCK /obj/item/organ/snout/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.wear_mask?.flags_inv & HIDESNOUT) && !(human.head?.flags_inv & HIDESNOUT)) + if(!(human.obscured_slots & HIDESNOUT)) return TRUE return FALSE @@ -27,6 +27,7 @@ /obj/item/organ/snout/vox name = "beak" feature_key = "vox_snout" + preference = null external_bodytypes = BODYTYPE_VOX_BEAK dna_block = DNA_VOX_SNOUT_BLOCK diff --git a/code/modules/surgery/organs/external/spines.dm b/code/modules/surgery/organs/external/spines.dm index 6c5f6efd55f2..b35658ca5d10 100644 --- a/code/modules/surgery/organs/external/spines.dm +++ b/code/modules/surgery/organs/external/spines.dm @@ -20,7 +20,7 @@ /obj/item/organ/spines/can_draw_on_bodypart(mob/living/carbon/human/human) . = ..() - if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(human.obscured_slots & HIDEJUMPSUIT) return FALSE /obj/item/organ/spines/Insert(mob/living/carbon/reciever, special, drop_if_replaced) diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 076fa562ee32..d29fccfffd2e 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -15,73 +15,23 @@ feature_key = "tail" render_key = "tail" dna_block = DNA_TAIL_BLOCK - ///Does this tail have a wagging sprite, and is it currently wagging? - var/wag_flags = NONE - ///The original owner of this tail - var/original_owner //Yay, snowflake code! /obj/item/organ/tail/Destroy() - original_owner = null return ..() /obj/item/organ/tail/can_draw_on_bodypart(mob/living/carbon/human/human) - if(human.wear_suit && (human.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(human.obscured_slots & HIDEJUMPSUIT) return FALSE return TRUE -/obj/item/organ/tail/Insert(mob/living/carbon/reciever, special, drop_if_replaced) - . = ..() - if(.) - RegisterSignal(reciever, COMSIG_ORGAN_WAG_TAIL, PROC_REF(wag)) - original_owner ||= reciever //One and done - - SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_lost") - SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "tail_balance_lost") - - if(original_owner == reciever) - SEND_SIGNAL(reciever, COMSIG_CLEAR_MOOD_EVENT, "wrong_tail_regained") - else if(type in reciever.dna.species.cosmetic_organs) - SEND_SIGNAL(reciever, COMSIG_ADD_MOOD_EVENT, "wrong_tail_regained", /datum/mood_event/tail_regained_wrong) - -/obj/item/organ/tail/Remove(mob/living/carbon/organ_owner, special, moving) - if(wag_flags & WAG_WAGGING) - wag(FALSE) - . = ..() - UnregisterSignal(organ_owner, COMSIG_ORGAN_WAG_TAIL) - - if(type in organ_owner.dna.species.cosmetic_organs) - SEND_SIGNAL(organ_owner, COMSIG_ADD_MOOD_EVENT, "tail_lost", /datum/mood_event/tail_lost) - SEND_SIGNAL(organ_owner, COMSIG_ADD_MOOD_EVENT, "tail_balance_lost", /datum/mood_event/tail_balance_lost) - -/obj/item/organ/tail/build_cache_key() - . = ..() - if((wag_flags & WAG_WAGGING)) - . += "wagging" - return . - /obj/item/organ/tail/get_global_feature_list() return GLOB.tails_list -/obj/item/organ/tail/proc/wag(mob/user, start = TRUE, stop_after = 0) - if(!(wag_flags & WAG_ABLE)) - return - - if(start) - render_key = "wagging[initial(render_key)]" - wag_flags |= WAG_WAGGING - if(stop_after) - addtimer(CALLBACK(src, PROC_REF(wag), FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) - else - render_key = initial(render_key) - wag_flags &= ~WAG_WAGGING - owner.update_body_parts() - /obj/item/organ/tail/cat name = "tail" preference = "feature_human_tail" feature_key = "tail_cat" color_source = ORGAN_COLOR_HAIR - wag_flags = WAG_ABLE /obj/item/organ/tail/monkey color_source = NONE @@ -91,8 +41,8 @@ desc = "A severed lizard tail. Somewhere, no doubt, a lizard hater is very pleased with themselves." preference = "feature_lizard_tail" feature_key = "tail_lizard" - wag_flags = WAG_ABLE dna_block = DNA_LIZARD_TAIL_BLOCK + ///A reference to the paired_spines, since for some fucking reason tail spines are tied to the spines themselves. var/obj/item/organ/spines/paired_spines @@ -115,25 +65,6 @@ if(paired_spines) paired_spines.paired_tail = src -/obj/item/organ/tail/lizard/wag(mob/user, start = TRUE, stop_after = 0) - if(!(wag_flags & WAG_ABLE)) - return - - if(start) - render_key = "wagging[initial(render_key)]" - wag_flags |= WAG_WAGGING - if(stop_after) - addtimer(CALLBACK(src, PROC_REF(wag), FALSE), stop_after, TIMER_STOPPABLE|TIMER_DELETE_ME) - if(paired_spines) - paired_spines.render_key = "wagging[initial(paired_spines.render_key)]" - else - render_key = initial(render_key) - wag_flags &= ~WAG_WAGGING - if(paired_spines) - paired_spines.render_key = initial(paired_spines.render_key) - - owner.update_body_parts() - /obj/item/organ/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." @@ -177,10 +108,8 @@ // Vox tail /obj/item/organ/tail/vox - wag_flags = WAG_ABLE - feature_key = "tail_vox" - preference = "tail_vox" + preference = null render_key = "tail_vox" dna_block = DNA_VOX_TAIL_BLOCK diff --git a/code/modules/surgery/organs/external/vox_hair.dm b/code/modules/surgery/organs/external/vox_hair.dm index 7f47297814a4..3765b9b4dedf 100644 --- a/code/modules/surgery/organs/external/vox_hair.dm +++ b/code/modules/surgery/organs/external/vox_hair.dm @@ -18,7 +18,7 @@ //draw_color = "#997C28" /obj/item/organ/vox_hair/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.head?.flags_inv & HIDEHAIR) || (human.wear_mask?.flags_inv & HIDEHAIR)) + if(!(human.obscured_slots & HIDEHAIR)) return TRUE return FALSE diff --git a/code/modules/surgery/organs/external/wings.dm b/code/modules/surgery/organs/external/wings.dm index e4fa8c2f4d65..69a744d8e5c2 100644 --- a/code/modules/surgery/organs/external/wings.dm +++ b/code/modules/surgery/organs/external/wings.dm @@ -12,9 +12,7 @@ feature_key = "wings" /obj/item/organ/wings/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!human.wear_suit) - return TRUE - if(!(human.wear_suit.flags_inv & HIDEJUMPSUIT)) + if(!(human.obscured_slots & HIDEJUMPSUIT)) return TRUE if(human.wear_suit.species_exception && is_type_in_list(src, human.wear_suit.species_exception)) return TRUE @@ -106,7 +104,7 @@ var/olddir = human.dir - human.stop_pulling() + human.release_all_grabs() if(buckled_obj) buckled_obj.unbuckle_mob(human) step(buckled_obj, olddir) @@ -181,7 +179,7 @@ return GLOB.moth_wings_list /obj/item/organ/wings/moth/can_draw_on_bodypart(mob/living/carbon/human/human) - if(!(human.wear_suit?.flags_inv & HIDEMUTWINGS)) + if(!(human.obscured_slots & HIDEMUTWINGS)) return TRUE return FALSE @@ -221,7 +219,6 @@ if(!burnt && human.bodytemperature >= 800 && human.fire_stacks > 0) //do not go into the extremely hot light. you will not survive to_chat(human, span_danger("Your precious wings burn to a crisp!")) - SEND_SIGNAL(human, COMSIG_ADD_MOOD_EVENT, "burnt_wings", /datum/mood_event/burnt_wings) burn_wings() human.update_body_parts() diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index ad204a107a58..17db118f1013 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -7,11 +7,9 @@ slot = ORGAN_SLOT_EYES gender = PLURAL - healing_factor = STANDARD_ORGAN_HEALING decay_factor = STANDARD_ORGAN_DECAY - maxHealth = 0.5 * STANDARD_ORGAN_THRESHOLD //half the normal health max since we go blind at 30, a permanent blindness at 50 therefore makes sense unless medicine is administered - high_threshold = 0.3 * STANDARD_ORGAN_THRESHOLD //threshold at 30 - low_threshold = 0.2 * STANDARD_ORGAN_THRESHOLD //threshold at 20 + maxHealth = 45 + relative_size = 5 low_threshold_passed = "Distant objects become somewhat less tangible." high_threshold_passed = "Everything starts to look a lot less clear." @@ -50,6 +48,17 @@ refresh(TRUE) if(eye_owner.has_dna()) eye_owner.update_eyes() + if(damaged) + eye_owner.become_blind(EYE_DAMAGE) + if(damage > maxHealth * low_threshold) + var/obj/item/clothing/glasses/eyewear = eye_owner.glasses + var/has_prescription_glasses = istype(eyewear) && eyewear.vision_correction + + if(has_prescription_glasses) + return + + var/severity = damage > 30 ? 2 : 1 + eye_owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, severity) /obj/item/organ/eyes/proc/refresh(update_sight = TRUE) if(ishuman(owner)) @@ -149,16 +158,20 @@ eye_color_left = initial(eye_color_left) eye_color_right = initial(eye_color_right) -/obj/item/organ/eyes/on_life(delta_time, times_fired) +/obj/item/organ/eyes/check_damage_thresholds(mob/organ_owner) . = ..() - var/mob/living/carbon/eye_owner = owner - //various degrees of "oh fuck my eyes", from "point a laser at your eye" to "staring at the Sun" intensities - if(damage > 20) - damaged = TRUE - if((organ_flags & ORGAN_FAILING)) - eye_owner.become_blind(EYE_DAMAGE) + var/mob/living/carbon/eye_owner = organ_owner + // Can't be a switch, these are non-constant :( + if(. == high_threshold_passed) + if(damaged) return + eye_owner?.become_blind(EYE_DAMAGE) + damaged = TRUE + return + else if(. == low_threshold_passed) + if(!eye_owner) + return var/obj/item/clothing/glasses/eyewear = eye_owner.glasses var/has_prescription_glasses = istype(eyewear) && eyewear.vision_correction @@ -169,11 +182,15 @@ eye_owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, severity) return - //called once since we don't want to keep clearing the screen of eye damage for people who are below 20 damage - if(damaged) - damaged = FALSE - eye_owner.clear_fullscreen("eye_damage") - eye_owner.cure_blind(EYE_DAMAGE) + else if(. == low_threshold_cleared) + eye_owner?.clear_fullscreen("eye_damage") + return + + else if(. == high_threshold_cleared) + if(damaged) + damaged = FALSE + eye_owner?.cure_blind(EYE_DAMAGE) + return /obj/item/organ/eyes/night_vision name = "shadow eyes" @@ -221,9 +238,17 @@ name = "robotic eyes" icon_state = "cybernetic_eyeballs" desc = "Your vision is augmented." - status = ORGAN_ROBOTIC organ_flags = ORGAN_SYNTHETIC + ///Incase the eyes are removed before the timer expires + var/emp_timer + +/obj/item/organ/eyes/robotic/Remove(mob/living/carbon/eye_owner, special) + if(emp_timer) + deltimer(emp_timer) + remove_malfunction() + ..() + /obj/item/organ/eyes/robotic/emp_act(severity) . = ..() if(!owner || . & EMP_PROTECT_SELF) @@ -232,6 +257,12 @@ return to_chat(owner, span_warning("Static obfuscates your vision!")) owner.flash_act(visual = 1) + owner.add_client_colour(/datum/client_colour/malfunction) + emp_timer = addtimer(CALLBACK(src, PROC_REF(remove_malfunction)), 10 SECONDS, TIMER_STOPPABLE) + +/obj/item/organ/eyes/robotic/proc/remove_malfunction() + owner.remove_client_colour(/datum/client_colour/malfunction) + emp_timer = null /obj/item/organ/eyes/robotic/basic name = "basic robotic eyes" @@ -504,7 +535,7 @@ /obj/effect/abstract/eye_lighting - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT var/obj/item/organ/eyes/robotic/glow/parent @@ -542,12 +573,6 @@ eye_icon_state = "flyeyes" icon_state = "eyeballs-fly" -/obj/item/organ/eyes/skrell - name = "amphibian eyes" - desc = "Large black orbs." - eye_icon_state = "skrelleyes" - icon_state = "eyeballs-skrell" - /obj/item/organ/eyes/fly/Insert(mob/living/carbon/eye_owner, special = FALSE) . = ..() if(!.) @@ -594,11 +619,12 @@ var/lums = owner_turf.get_lumcount() if(lums > 0.5) //we allow a little more than usual so we can produce light from the adapted eyes to_chat(owner, span_danger("Your eyes! They burn in the light!")) - applyOrganDamage(10) //blind quickly + applyOrganDamage(10, updating_health = FALSE) //blind quickly playsound(owner, 'sound/machines/grill/grillsizzle.ogg', 50) else - applyOrganDamage(-10) //heal quickly - . = ..() + applyOrganDamage(-10, updating_health = FALSE) //heal quickly + . = TRUE + return ..() || . /obj/item/organ/eyes/night_vision/maintenance_adapted/Remove(mob/living/carbon/unadapted, special = FALSE) //remove lighting diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 084e88c0f87f..af8e39031208 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -7,180 +7,205 @@ zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_HEART - healing_factor = STANDARD_ORGAN_HEALING decay_factor = 2.5 * STANDARD_ORGAN_DECAY //designed to fail around 6 minutes after death + maxHealth = 45 + high_threshold = 0.66 + low_threshold = 0.15 + relative_size = 5 + external_damage_modifier = 0.7 + low_threshold_passed = "Prickles of pain appear then die out from within your chest..." high_threshold_passed = "Something inside your chest hurts, and the pain isn't subsiding. You notice yourself breathing far faster than before." now_fixed = "Your heart begins to beat again." high_threshold_cleared = "The pain in your chest has died down, and your breathing becomes more relaxed." // Heart attack code is in code/modules/mob/living/carbon/human/life.dm - var/beating = TRUE + attack_verb_continuous = list("beats", "thumps") attack_verb_simple = list("beat", "thump") + var/beat = BEAT_NONE//is this mob having a heatbeat sound played? if so, which? var/failed = FALSE //to prevent constantly running failing code - var/operated = FALSE //whether the heart's been operated on to fix some of its damages + + var/blockage = FALSE + /// How fast is our heart pumping blood + var/pulse = PULSE_NORM + /// Data containing information about a pump that just occured. + var/list/external_pump + + /// A grace period applied upon being resuscitated, so bad RNG wont immediately stop the heart. + COOLDOWN_DECLARE(arrhythmia_grace_period) /obj/item/organ/heart/update_icon_state() - icon_state = "[base_icon_state]-[beating ? "on" : "off"]" + icon_state = "[base_icon_state]-[pulse ? "on" : "off"]" return ..() +/obj/item/organ/heart/Insert(mob/living/carbon/reciever, special, drop_if_replaced) + . = ..() + if(!.) + return + + owner.med_hud_set_health() + /obj/item/organ/heart/Remove(mob/living/carbon/heartless, special = 0) ..() if(!special) addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 120) -/obj/item/organ/heart/proc/stop_if_unowned() - if(!owner) - Stop() + heartless.med_hud_set_health() -/obj/item/organ/heart/attack_self(mob/user) - ..() - if(!beating) - user.visible_message("[user] squeezes [src] to \ - make it beat again!",span_notice("You squeeze [src] to make it beat again!")) - Restart() - addtimer(CALLBACK(src, PROC_REF(stop_if_unowned)), 80) +/obj/item/organ/heart/proc/Restart() + pulse = PULSE_NORM + update_appearance(UPDATE_ICON_STATE) + owner?.med_hud_set_health() /obj/item/organ/heart/proc/Stop() - beating = FALSE - update_appearance() - return TRUE + pulse = PULSE_NONE + update_appearance(UPDATE_ICON_STATE) + owner?.med_hud_set_health() -/obj/item/organ/heart/proc/Restart() - beating = TRUE - update_appearance() - return TRUE +/obj/item/organ/heart/proc/stop_if_unowned() + if(!owner) + Stop() /obj/item/organ/heart/OnEatFrom(eater, feeder) . = ..() - beating = FALSE - update_appearance() + Stop() -/obj/item/organ/heart/on_life(delta_time, times_fired) - ..() +/obj/item/organ/heart/proc/is_working() + if(organ_flags & ORGAN_DEAD) + return FALSE + return pulse > PULSE_NONE || (organ_flags & ORGAN_SYNTHETIC) + +/obj/item/organ/heart/on_death(delta_time, times_fired) + . = ..() + if(pulse) + Stop() +/obj/item/organ/heart/on_life(delta_time, times_fired) + . = ..() + handle_pulse() // If the owner doesn't need a heart, we don't need to do anything with it. - if(!owner.needs_heart()) + if(!owner.needs_organ(ORGAN_SLOT_HEART)) + return + if(pulse) + handle_heartbeat() + if(pulse == PULSE_2FAST && prob(1)) + applyOrganDamage(0.25, updating_health = FALSE) + . = TRUE + if(pulse == PULSE_THREADY && prob(5)) + applyOrganDamage(0.35, updating_health = FALSE) + . = TRUE + +/obj/item/organ/heart/proc/handle_pulse() + if(organ_flags & ORGAN_SYNTHETIC) + if(pulse != PULSE_NONE) + Stop() //that's it, you're dead (or your metal heart is), nothing can influence your pulse return - if(owner.client && beating) - failed = FALSE - var/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) - var/sound/fastbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) - - if(owner.health <= owner.crit_threshold && beat != BEAT_SLOW) - beat = BEAT_SLOW - owner.playsound_local(get_turf(owner), slowbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) - to_chat(owner, span_notice("You feel your heart slow down...")) - if(beat == BEAT_SLOW && owner.health > owner.crit_threshold) - owner.stop_sound_channel(CHANNEL_HEARTBEAT) - beat = BEAT_NONE - - if(owner.has_status_effect(/datum/status_effect/jitter)) - if(owner.health > HEALTH_THRESHOLD_FULLCRIT && (!beat || beat == BEAT_SLOW)) - owner.playsound_local(get_turf(owner), fastbeat, 40, 0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) - beat = BEAT_FAST - - else if(beat == BEAT_FAST) - owner.stop_sound_channel(CHANNEL_HEARTBEAT) - beat = BEAT_NONE - - if(organ_flags & ORGAN_FAILING && owner.can_heartattack() && !(HAS_TRAIT(src, TRAIT_STABLEHEART))) //heart broke, stopped beating, death imminent... unless you have veins that pump blood without a heart - if(owner.stat <= SOFT_CRIT) - owner.visible_message(span_danger("[owner] clutches at [owner.p_their()] chest as if [owner.p_their()] heart is stopping!"), \ - span_userdanger("You feel a terrible pain in your chest, as if your heart has stopped!")) - owner.set_heartattack(TRUE) - failed = TRUE - -/obj/item/organ/heart/get_availability(datum/species/owner_species) - return !(NOBLOOD in owner_species.species_traits) - -/obj/item/organ/heart/skrell - name = "skrell heart" - icon_state = "heart-skrell-on" - base_icon_state = "heart-skrell" - -/obj/item/organ/heart/cursed - name = "cursed heart" - desc = "A heart that, when inserted, will force you to pump it manually." - icon_state = "cursedheart-off" - base_icon_state = "cursedheart" - decay_factor = 0 - actions_types = list(/datum/action/item_action/organ_action/cursed_heart) - var/last_pump = 0 - var/add_colour = TRUE //So we're not constantly recreating colour datums - var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal) - var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?) - - //How much to heal per pump, negative numbers would HURT the player - var/heal_brute = 0 - var/heal_burn = 0 - var/heal_oxy = 0 - - -/obj/item/organ/heart/cursed/attack(mob/living/carbon/human/accursed, mob/living/carbon/human/user, obj/target) - if(accursed == user && istype(accursed)) - playsound(user,'sound/effects/singlebeat.ogg',40,TRUE) - user.temporarilyRemoveItemFromInventory(src, TRUE) - Insert(user) - else - return ..() + var/starting_pulse = pulse -/obj/item/organ/heart/cursed/on_life(delta_time, times_fired) - if(world.time > (last_pump + pump_delay)) - if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects. - var/mob/living/carbon/human/accursed_human = owner - if(accursed_human.dna && !(NOBLOOD in accursed_human.dna.species.species_traits)) - accursed_human.blood_volume = max(accursed_human.blood_volume - blood_loss, 0) - to_chat(accursed_human, span_userdanger("You have to keep pumping your blood!")) - if(add_colour) - accursed_human.add_client_colour(/datum/client_colour/cursed_heart_blood) //bloody screen so real - add_colour = FALSE - else - last_pump = world.time //lets be extra fair *sigh* + // pulse mod starts out as just the chemical effect amount + var/pulse_mod = CHEM_EFFECT_MAGNITUDE(owner, CE_PULSE) + var/is_stable = CHEM_EFFECT_MAGNITUDE(owner, CE_STABLE) -/obj/item/organ/heart/cursed/Insert(mob/living/carbon/accursed, special = 0) - . = ..() - if(!.) + var/can_heartattack = owner.can_heartattack() + + // If you have enough heart chemicals to be over 2, you're likely to take extra damage. + if(pulse_mod > 2 && !is_stable) + var/damage_chance = (pulse_mod - 2) ** 2 + if(prob(damage_chance)) + applyOrganDamage(0.5, updating_health = FALSE) + . = TRUE + + // Now pulse mod is impacted by shock stage and other things too + if(owner.shock_stage > SHOCK_TIER_2) + pulse_mod++ + if(owner.shock_stage > SHOCK_TIER_5) + pulse_mod++ + + var/blood_oxygenation = owner.get_blood_oxygenation() + if(blood_oxygenation < BLOOD_CIRC_BAD + 10) //brain wants us to get MOAR OXY + pulse_mod++ + if(blood_oxygenation < BLOOD_CIRC_BAD) //MOAR + pulse_mod++ + + //If heart is stopped, it isn't going to restart itself randomly. + if(pulse == PULSE_NONE) return - if(owner) - to_chat(owner, span_userdanger("Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!")) + else if(can_heartattack)//and if it's beating, let's see if it should + // Cardiovascular shock, not enough liquid to pump + var/blood_circulation = owner.get_blood_circulation() + var/should_stop = prob(80) && (blood_circulation < BLOOD_CIRC_SURVIVE) + if(should_stop) + log_health(owner, "Heart stopped due to poor blood circulation: [blood_circulation]%") + + // Severe brain damage, unable to operate the heart. + if(!should_stop) + var/brainloss_stop_chance = max(0, owner.getBrainLoss() - owner.maxHealth * 0.75) + should_stop = prob(brainloss_stop_chance) + if(should_stop) + log_health(owner, "Heart stopped due to brain damage: [brainloss_stop_chance]% chance. ") + + // Erratic heart patterns, usually caused by oxyloss. + if(!should_stop && COOLDOWN_FINISHED(src, arrhythmia_grace_period)) + should_stop = (prob(5) && pulse == PULSE_THREADY) + if(should_stop) + log_health(owner, "Heart stopped due to cardiac arrhythmia. Oxyloss: [owner.getOxyLoss()]") + + // The heart has stopped due to going into traumatic or cardiovascular shock. + if(should_stop) + if(owner.stat != DEAD) + to_chat(owner, span_alert("Your heart has stopped.")) + if(pulse != NONE) + Stop() + return + + // Pulse normally shouldn't go above PULSE_2FAST, unless extreme amounts of bad stuff in blood + if (pulse_mod < 6) + pulse = clamp(PULSE_NORM + pulse_mod, PULSE_SLOW, PULSE_2FAST) + else + pulse = clamp(PULSE_NORM + pulse_mod, PULSE_SLOW, PULSE_THREADY) -/obj/item/organ/heart/cursed/Remove(mob/living/carbon/accursed, special = 0) - ..() - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) + // If fibrillation, then it can be PULSE_THREADY + var/fibrillation = blood_oxygenation <= BLOOD_CIRC_SURVIVE || (prob(30) && owner.shock_stage > SHOCK_AMT_FOR_FIBRILLATION) -/datum/action/item_action/organ_action/cursed_heart - name = "Pump your blood" + if(pulse && fibrillation) //I SAID MOAR OXYGEN + pulse = PULSE_THREADY -//You are now brea- pumping blood manually -/datum/action/item_action/organ_action/cursed_heart/Trigger(trigger_flags) - . = ..() - if(. && istype(target, /obj/item/organ/heart/cursed)) - var/obj/item/organ/heart/cursed/cursed_heart = target + // Stablising chemicals pull the heartbeat towards the center + if(pulse != PULSE_NORM && is_stable) + if(pulse > PULSE_NORM) + pulse-- + else + pulse++ - if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam - to_chat(owner, span_userdanger("Too soon!")) - return + if(pulse != starting_pulse) + owner.med_hud_set_health() - cursed_heart.last_pump = world.time - playsound(owner,'sound/effects/singlebeat.ogg',40,TRUE) - to_chat(owner, span_notice("Your heart beats.")) +/obj/item/organ/heart/proc/handle_heartbeat() + var/can_hear_heart = owner.shock_stage >= SHOCK_TIER_3 || get_step(owner, 0)?.is_below_sound_pressure() || owner.has_status_effect(owner.has_status_effect(/datum/status_effect/jitter)) - var/mob/living/carbon/human/accursed = owner - if(istype(accursed)) - if(accursed.dna && !(NOBLOOD in accursed.dna.species.species_traits)) - accursed.blood_volume = min(accursed.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_MAXIMUM) - accursed.remove_client_colour(/datum/client_colour/cursed_heart_blood) - cursed_heart.add_colour = TRUE - accursed.adjustBruteLoss(-cursed_heart.heal_brute) - accursed.adjustFireLoss(-cursed_heart.heal_burn) - accursed.adjustOxyLoss(-cursed_heart.heal_oxy) + var/static/sound/slowbeat = sound('sound/health/slowbeat.ogg', repeat = TRUE) + var/static/sound/fastbeat = sound('sound/health/fastbeat.ogg', repeat = TRUE) + if(!can_hear_heart) + owner.stop_sound_channel(CHANNEL_HEARTBEAT) + beat = BEAT_NONE + return + if(pulse >= PULSE_2FAST && beat != BEAT_FAST) + owner.playsound_local(owner, fastbeat, 55, 0, channel = CHANNEL_HEARTBEAT, pressure_affected = FALSE, use_reverb = FALSE) + beat = BEAT_FAST + else if(beat != BEAT_SLOW) + owner.playsound_local(owner, slowbeat, 55, 0, channel = CHANNEL_HEARTBEAT, pressure_affected = FALSE, use_reverb = FALSE) + beat = BEAT_SLOW + +/obj/item/organ/heart/get_scan_results(tag) + . = ..() + if(pulse == PULSE_NONE) + . += tag ? "Asystole" : "Asystole" /datum/client_colour/cursed_heart_blood priority = 100 //it's an indicator you're dying, so it's very high priority @@ -191,7 +216,6 @@ desc = "A basic electronic device designed to mimic the functions of an organic human heart." icon_state = "heart-c" organ_flags = ORGAN_SYNTHETIC - maxHealth = STANDARD_ORGAN_THRESHOLD*0.75 //This also hits defib timer, so a bit higher than its less important counterparts var/dose_available = FALSE var/rid = /datum/reagent/medicine/epinephrine @@ -202,7 +226,7 @@ name = "cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma." icon_state = "heart-c-u" - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + maxHealth = 60 dose_available = TRUE emp_vulnerability = 40 @@ -210,7 +234,7 @@ name = "upgraded cybernetic heart" desc = "An electronic device designed to mimic the functions of an organic human heart. Also holds an emergency dose of epinephrine, used automatically after facing severe trauma. This upgraded model can regenerate its dose after use." icon_state = "heart-c-u2" - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + maxHealth = 90 dose_available = TRUE emp_vulnerability = 20 @@ -218,7 +242,7 @@ . = ..() // If the owner doesn't need a heart, we don't need to do anything with it. - if(!owner.needs_heart()) + if(!owner.needs_organ(ORGAN_SLOT_HEART)) return if(. & EMP_PROTECT_SELF) @@ -260,8 +284,8 @@ COOLDOWN_START(src, adrenaline_cooldown, rand(25 SECONDS, 1 MINUTES)) to_chat(owner, span_userdanger("You feel yourself dying, but you refuse to give up!")) owner.heal_overall_damage(15, 15, BODYTYPE_ORGANIC) - if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/ephedrine) < 20) - owner.reagents.add_reagent(/datum/reagent/medicine/ephedrine, 10) + if(owner.reagents.get_reagent_amount(/datum/reagent/medicine/epinephrine) < 20) + owner.reagents.add_reagent(/datum/reagent/medicine/epinephrine, 10) /obj/item/organ/heart/ethereal name = "crystal core" @@ -286,6 +310,9 @@ /obj/item/organ/heart/ethereal/Insert(mob/living/carbon/owner, special = 0) . = ..() + if(!.) + return + RegisterSignal(owner, COMSIG_MOB_STATCHANGE, PROC_REF(on_stat_change)) RegisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_owner_fully_heal)) RegisterSignal(owner, COMSIG_PARENT_PREQDELETED, PROC_REF(owner_deleted)) diff --git a/code/modules/surgery/organs/helpers.dm b/code/modules/surgery/organs/helpers.dm index be76262a9a82..f24f96ac2d95 100644 --- a/code/modules/surgery/organs/helpers.dm +++ b/code/modules/surgery/organs/helpers.dm @@ -45,5 +45,6 @@ return returnorg /mob/living/carbon/getorganslot(slot) + RETURN_TYPE(/obj/item/organ) . = organs_by_slot[slot] diff --git a/code/modules/surgery/organs/kidneys.dm b/code/modules/surgery/organs/kidneys.dm new file mode 100644 index 000000000000..780a20b88610 --- /dev/null +++ b/code/modules/surgery/organs/kidneys.dm @@ -0,0 +1,48 @@ +/obj/item/organ/kidneys + name = "kidneys" + icon_state = "kidneys" + gender = PLURAL + + maxHealth = 70 + high_threshold = 0.5 + low_threshold = 0.35 + + slot = ORGAN_SLOT_KIDNEYS + zone = BODY_ZONE_CHEST + relative_size = 10 + +/obj/item/organ/kidneys/on_life(delta_time, times_fired) + . = ..() + + // This is really stupid code copy pasting but muh Life() ticks + if(damage > maxHealth * high_threshold) + var/datum/reagent/coffee = locate(/datum/reagent/consumable/coffee) in owner.reagents.reagent_list + if(coffee) + owner.adjustToxLoss(0.3, FALSE) + . = TRUE + + if(!owner.reagents.has_reagent(/datum/reagent/potassium, 15)) + owner.reagents.add_reagent(/datum/reagent/potassium, 0.4) + + if(!CHEM_EFFECT_MAGNITUDE(owner, CE_ANTITOX) && prob(33)) + owner.adjustToxLoss(0.3, FALSE) + . = TRUE + + else if(damage > maxHealth * low_threshold) + var/datum/reagent/coffee = locate(/datum/reagent/consumable/coffee) in owner.reagents.reagent_list + if(coffee) + owner.adjustToxLoss(0.1, FALSE) + . = TRUE + + if(!owner.reagents.has_reagent(/datum/reagent/potassium, 5)) + owner.reagents.add_reagent(/datum/reagent/potassium, 1) + + +/obj/item/organ/kidneys/on_death(delta_time, times_fired) + . = ..() + if(!owner || (owner.stat == DEAD)) + return + + if(!CHEM_EFFECT_MAGNITUDE(owner, CE_ANTITOX) && prob(33)) + owner.adjustToxLoss(1, FALSE) + . = TRUE diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index cde1a39f8ae3..3457f41a06b4 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -10,20 +10,16 @@ slot = ORGAN_SLOT_LIVER desc = "Pairing suggestion: chianti and fava beans." - maxHealth = STANDARD_ORGAN_THRESHOLD - healing_factor = STANDARD_ORGAN_HEALING + maxHealth = 70 + low_threshold = 0.22 + high_threshold = 0.5 + relative_size = 60 + decay_factor = STANDARD_ORGAN_DECAY // smack in the middle of decay times food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) grind_results = list(/datum/reagent/consumable/nutriment/peptides = 5) - var/alcohol_tolerance = ALCOHOL_RATE//affects how much damage the liver takes from alcohol - /// The maximum volume of toxins the liver will quickly purge - var/toxTolerance = LIVER_DEFAULT_TOX_TOLERANCE - /// Scaling factor for how much damage toxins deal to the liver - var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY - var/filterToxins = TRUE //whether to filter toxins - /obj/item/organ/liver/Initialize(mapload) . = ..() // If the liver handles foods like a clown, it honks like a bike horn @@ -79,130 +75,80 @@ if(!istype(liver_owner)) return - if(organ_flags & ORGAN_FAILING || HAS_TRAIT(liver_owner, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver + if(organ_flags & ORGAN_DEAD) return - // How much damage to inflict on our liver - var/damange_to_deal = 0 - - var/provide_pain_message = HAS_NO_TOXIN - var/obj/belly = liver_owner.getorganslot(ORGAN_SLOT_STOMACH) - if(filterToxins && !HAS_TRAIT(owner, TRAIT_TOXINLOVER)) - //handle liver toxin filtration - for(var/datum/reagent/toxin/toxin in liver_owner.reagents.reagent_list) - var/thisamount = liver_owner.reagents.get_reagent_amount(toxin.type) - if(belly) - thisamount += belly.reagents.get_reagent_amount(toxin.type) - if (thisamount && thisamount <= toxTolerance * (maxHealth - damage) / maxHealth ) //toxTolerance is effectively multiplied by the % that your liver's health is at - liver_owner.reagents.remove_reagent(toxin.type, 0.5 * delta_time) - else - damange_to_deal += (thisamount * toxLethality * delta_time) - if(provide_pain_message != HAS_PAINFUL_TOXIN) - provide_pain_message = toxin.silent_toxin ? HAS_SILENT_TOXIN : HAS_PAINFUL_TOXIN - - //metabolize reagents - liver_owner.reagents.metabolize(liver_owner, delta_time, times_fired, can_overdose=TRUE) - - if(damange_to_deal) - applyOrganDamage(damange_to_deal) - - if(provide_pain_message && damage > 10 && DT_PROB(damage/6, delta_time)) //the higher the damage the higher the probability + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(1)) + to_chat(owner, span_danger("Your skin itches.")) + if (germ_level > INFECTION_LEVEL_TWO) + if(prob(1)) + owner.vomit(50, TRUE) + + //Detox can heal small amounts of damage + if (damage < maxHealth && !owner.chem_effects[CE_TOXIN]) + applyOrganDamage(-0.2 * owner.chem_effects[CE_ANTITOX], updating_health = FALSE) + . = TRUE + + // Get the effectiveness of the liver. + var/filter_effect = 3 + if(damage > (low_threshold * maxHealth)) + filter_effect -= 1 + if(damage > (high_threshold * maxHealth)) + filter_effect -= 2 + // Robotic organs filter better but don't get benefits from dylovene for filtering. + if(organ_flags & ORGAN_SYNTHETIC) + filter_effect += 1 + else if(owner.chem_effects[CE_ANTITOX]) + filter_effect += 1 + + // If you're not filtering well, you're in trouble. Ammonia buildup to toxic levels and damage from alcohol + if(filter_effect < 2) + if(owner.chem_effects[CE_ALCOHOL]) + owner.adjustToxLoss(0.5 * max(2 - filter_effect, 0) * (owner.chem_effects[CE_ALCOHOL_TOXIC] + 0.5 * owner.chem_effects[CE_ALCOHOL])) + + if(owner.chem_effects[CE_ALCOHOL_TOXIC]) + applyOrganDamage(owner.chem_effects[CE_ALCOHOL_TOXIC], updating_health = FALSE) + . = TRUE + // Heal a bit if needed and we're not busy. This allows recovery from low amounts of toxloss. + if(!owner.chem_effects[CE_ALCOHOL] && !owner.chem_effects[CE_TOXIN] && !HAS_TRAIT(owner, TRAIT_IRRADIATED) && damage > 0) + if(damage < low_threshold * maxHealth) + applyOrganDamage(-0.3, updating_health = FALSE) + . = TRUE + else if(damage < high_threshold * maxHealth) + applyOrganDamage(-0.2, updating_health = FALSE) + . = TRUE + + if(damage > 10 && DT_PROB(damage/4, delta_time)) //the higher the damage the higher the probability to_chat(liver_owner, span_warning("You feel a dull pain in your abdomen.")) + if(owner.blood_volume < BLOOD_VOLUME_NORMAL) + if(!HAS_TRAIT(owner, TRAIT_NOHUNGER)) + owner.adjust_nutrition(-0.1 * HUNGER_DECAY) + owner.adjustBloodVolumeUpTo(0.1, BLOOD_VOLUME_NORMAL) -/obj/item/organ/liver/handle_failing_organs(delta_time) - if(HAS_TRAIT(src, TRAIT_STABLELIVER) || HAS_TRAIT(src, TRAIT_NOMETABOLISM)) - return - return ..() - -/obj/item/organ/liver/organ_failure(delta_time) - - switch(failure_time/LIVER_FAILURE_STAGE_SECONDS) - if(1) - to_chat(owner, span_userdanger("You feel stabbing pain in your abdomen!")) - if(2) - to_chat(owner, span_userdanger("You feel a burning sensation in your gut!")) - owner.vomit() - if(3) - to_chat(owner, span_userdanger("You feel painful acid in your throat!")) - owner.vomit(blood = TRUE) - if(4) - to_chat(owner, span_userdanger("Overwhelming pain knocks you out!")) - owner.vomit(blood = TRUE, distance = rand(1,2)) - owner.emote("Scream") - owner.AdjustUnconscious(2.5 SECONDS) - if(5) - to_chat(owner, span_userdanger("You feel as if your guts are about to melt!")) - owner.vomit(blood = TRUE,distance = rand(1,3)) - owner.emote("Scream") - owner.AdjustUnconscious(5 SECONDS) - - switch(failure_time) - //After 60 seconds we begin to feel the effects - if(1 * LIVER_FAILURE_STAGE_SECONDS to 2 * LIVER_FAILURE_STAGE_SECONDS - 1) - owner.adjustToxLoss(0.2 * delta_time,forced = TRUE) - owner.adjust_disgust(0.1 * delta_time) - - if(2 * LIVER_FAILURE_STAGE_SECONDS to 3 * LIVER_FAILURE_STAGE_SECONDS - 1) - owner.adjustToxLoss(0.4 * delta_time,forced = TRUE) - owner.adjust_drowsyness(0.25 * delta_time) - owner.adjust_disgust(0.3 * delta_time) - - if(3 * LIVER_FAILURE_STAGE_SECONDS to 4 * LIVER_FAILURE_STAGE_SECONDS - 1) - owner.adjustToxLoss(0.6 * delta_time,forced = TRUE) - owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.2 * delta_time) - owner.adjust_drowsyness(0.5 * delta_time) - owner.adjust_disgust(0.6 * delta_time) - - if(DT_PROB(1.5, delta_time)) - owner.emote("drool") - - if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) - owner.adjustToxLoss(0.8 * delta_time,forced = TRUE) - owner.adjustOrganLoss(pick(ORGAN_SLOT_HEART,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_EYES,ORGAN_SLOT_EARS),0.5 * delta_time) - owner.adjust_drowsyness(0.8 * delta_time) - owner.adjust_disgust(1.2 * delta_time) - - if(DT_PROB(3, delta_time)) - owner.emote("drool") +//We got it covered in on_life() with more detailed thing +/obj/item/organ/liver/handle_regeneration() + return /obj/item/organ/liver/on_owner_examine(datum/source, mob/user, list/examine_list) - if(!ishuman(owner) || !(organ_flags & ORGAN_FAILING)) + if(!ishuman(owner) || !(organ_flags & ORGAN_DEAD)) return var/mob/living/carbon/human/humie_owner = owner if(!humie_owner.getorganslot(ORGAN_SLOT_EYES) || humie_owner.is_eyes_covered()) return - switch(failure_time) - if(0 to 3 * LIVER_FAILURE_STAGE_SECONDS - 1) - examine_list += span_notice("[owner]'s eyes are slightly yellow.") - if(3 * LIVER_FAILURE_STAGE_SECONDS to 4 * LIVER_FAILURE_STAGE_SECONDS - 1) - examine_list += span_notice("[owner]'s eyes are completely yellow, and he is visibly suffering.") - if(4 * LIVER_FAILURE_STAGE_SECONDS to INFINITY) - examine_list += span_danger("[owner]'s eyes are completely yellow and swelling with pus. [owner.p_they()] don't look like they will be alive for much longer.") - -/obj/item/organ/liver/on_death(delta_time, times_fired) - . = ..() - var/mob/living/carbon/carbon_owner = owner - if(!owner)//If we're outside of a mob - return - if(!iscarbon(carbon_owner)) - CRASH("on_death() called for [src] ([type]) with invalid owner ([isnull(owner) ? "null" : owner.type])") - if(carbon_owner.stat != DEAD) - CRASH("on_death() called for [src] ([type]) with not-dead owner ([owner])") - if((organ_flags & ORGAN_FAILING) && HAS_TRAIT(carbon_owner, TRAIT_NOMETABOLISM))//can't process reagents with a failing liver - return - for(var/datum/reagent/chem as anything in carbon_owner.reagents.reagent_list) - chem.on_mob_dead(carbon_owner, delta_time) + + if(damage > maxHealth * low_threshold) + examine_list += span_notice("[owner]'s eyes are slightly yellow.") + else if(damage > maxHealth * high_threshold) + examine_list += span_notice("[owner]'s eyes are completely yellow, and he is visibly suffering.") #undef HAS_SILENT_TOXIN #undef HAS_NO_TOXIN #undef HAS_PAINFUL_TOXIN #undef LIVER_FAILURE_STAGE_SECONDS -/obj/item/organ/liver/get_availability(datum/species/species) - return !(TRAIT_NOMETABOLISM in species.inherent_traits) - /obj/item/organ/liver/plasmaman name = "reagent processing crystal" icon_state = "liver-p" @@ -212,49 +158,30 @@ name = "alien liver" // doesnt matter for actual aliens because they dont take toxin damage icon_state = "liver-x" // Same sprite as fly-person liver. desc = "A liver that used to belong to a killer alien, who knows what it used to eat." - toxLethality = 2.5 * LIVER_DEFAULT_TOX_LETHALITY // rejects its owner early after too much punishment - toxTolerance = 15 // complete toxin immunity like xenos have would be too powerful /obj/item/organ/liver/vox name = "vox liver" icon_state = "vox-liver" - alcohol_tolerance = 0.008 // 60% more toxic - -/obj/item/organ/liver/skrell - name = "skrell liver" - icon_state = "liver-skrell" - alcohol_tolerance = 5 - toxTolerance = 10 //can shrug off up to 10u of toxins. - toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver /obj/item/organ/liver/cybernetic name = "basic cybernetic liver" icon_state = "liver-c" desc = "A very basic device designed to mimic the functions of a human liver. Handles toxins slightly worse than an organic liver." organ_flags = ORGAN_SYNTHETIC - toxTolerance = 2 - toxLethality = 1.1 * LIVER_DEFAULT_TOX_LETHALITY - maxHealth = STANDARD_ORGAN_THRESHOLD*0.5 - var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. /obj/item/organ/liver/cybernetic/tier2 name = "cybernetic liver" icon_state = "liver-c-u" desc = "An electronic device designed to mimic the functions of a human liver. Handles toxins slightly better than an organic liver." - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD - toxTolerance = 5 //can shrug off up to 5u of toxins - toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver + maxHealth = 100 emp_vulnerability = 40 /obj/item/organ/liver/cybernetic/tier3 name = "upgraded cybernetic liver" icon_state = "liver-c-u2" desc = "An upgraded version of the cybernetic liver, designed to improve further upon organic livers. It is resistant to alcohol poisoning and is very robust at filtering toxins." - alcohol_tolerance = 0.001 - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - toxTolerance = 10 //can shrug off up to 10u of toxins - toxLethality = 0.8 * LIVER_DEFAULT_TOX_LETHALITY //20% less damage than a normal liver + maxHealth = 140 emp_vulnerability = 20 /obj/item/organ/liver/cybernetic/emp_act(severity) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index 3bf2980055c8..e01fd747ef7d 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -7,7 +7,11 @@ gender = PLURAL w_class = WEIGHT_CLASS_SMALL - healing_factor = STANDARD_ORGAN_HEALING + maxHealth = 70 + high_threshold = 0.5 + low_threshold = 0.35 + relative_size = 60 + decay_factor = STANDARD_ORGAN_DECAY * 0.9 // fails around 16.5 minutes, lungs are one of the last organs to die (of the ones we have) low_threshold_passed = "You feel short of breath." @@ -16,11 +20,10 @@ low_threshold_cleared = "You can breathe normally again." high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down." - var/failed = FALSE var/operated = FALSE //whether we can still have our damages fixed through surgery - food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/dexalin = 5) //Breath damage //These thresholds are checked against what amounts to total_mix_pressure * (gas_type_mols/total_mols) @@ -82,23 +85,20 @@ var/heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 var/heat_damage_type = BURN - var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine - -/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather) +/obj/item/organ/lungs/proc/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/breather, forced = FALSE) if(breather.status_flags & GODMODE) breather.failed_last_breath = FALSE //clear oxy issues breather.clear_alert(ALERT_NOT_ENOUGH_OXYGEN) - return + return BREATH_OKAY + if(HAS_TRAIT(breather, TRAIT_NOBREATH)) - return + return BREATH_OKAY + + . = BREATH_OKAY if(!breath || (breath.total_moles == 0)) - if(breather.reagents.has_reagent(crit_stabilizing_reagent, needs_metabolizing = TRUE)) - return - if(breather.health >= breather.crit_threshold) - breather.adjustOxyLoss(HUMAN_MAX_OXYLOSS) - else if(!HAS_TRAIT(breather, TRAIT_NOCRITDAMAGE)) - breather.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + if(!HAS_TRAIT(breather, TRAIT_NOCRITDAMAGE)) + breather.adjustOxyLoss(HUMAN_FAILBREATH_OXYLOSS) breather.failed_last_breath = TRUE if(safe_oxygen_min) @@ -109,7 +109,7 @@ breather.throw_alert(ALERT_NOT_ENOUGH_CO2, /atom/movable/screen/alert/not_enough_co2) else if(safe_nitro_min) breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) - return FALSE + return BREATH_FAILED if(istype(breather.wear_mask) && (breather.wear_mask.clothing_flags & GAS_FILTERING) && breather.wear_mask.has_filter) breath = breather.wear_mask.consume_filter(breath) @@ -133,18 +133,18 @@ var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) var/SA_pp = breath.getBreathPartialPressure(SA_moles) - //Vars for n2o and healium induced euphorias. - var/n2o_euphoria = EUPHORIA_LAST_FLAG - var/healium_euphoria = EUPHORIA_LAST_FLAG //-- OXY --// //Too much oxygen! //Yes, some species may not like it. if(safe_oxygen_max) if(O2_pp > safe_oxygen_max) - var/ratio = (O2_moles/safe_oxygen_max) * 10 - breather.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) + if(!forced) + var/ratio = (O2_moles/safe_oxygen_max) * 10 + breather.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) breather.throw_alert(ALERT_TOO_MUCH_OXYGEN, /atom/movable/screen/alert/too_much_oxy) + . = BREATH_DAMAGING + else breather.clear_alert(ALERT_TOO_MUCH_OXYGEN) @@ -153,6 +153,7 @@ if(O2_pp < safe_oxygen_min) gas_breathed = handle_too_little_breath(breather, O2_pp, safe_oxygen_min, O2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_OXYGEN, /atom/movable/screen/alert/not_enough_oxy) + . = BREATH_DAMAGING else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) @@ -170,9 +171,11 @@ //Too much nitrogen! if(safe_nitro_max) if(N2_pp > safe_nitro_max) - var/ratio = (N2_moles/safe_nitro_max) * 10 - breather.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) + if(!forced) + var/ratio = (N2_moles/safe_nitro_max) * 10 + breather.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) breather.throw_alert(ALERT_TOO_MUCH_NITRO, /atom/movable/screen/alert/too_much_nitro) + . = BREATH_DAMAGING else breather.clear_alert(ALERT_TOO_MUCH_NITRO) @@ -181,6 +184,7 @@ if(N2_pp < safe_nitro_min) gas_breathed = handle_too_little_breath(breather, N2_pp, safe_nitro_min, N2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_NITRO, /atom/movable/screen/alert/not_enough_nitro) + . = BREATH_DAMAGING else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) @@ -206,8 +210,7 @@ if(world.time - breather.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! breather.apply_damage_type(8, co2_damage_type) breather.throw_alert(ALERT_TOO_MUCH_CO2, /atom/movable/screen/alert/too_much_co2) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - breather.emote("cough") + . = BREATH_DAMAGING else breather.co2overloadtime = 0 @@ -218,6 +221,7 @@ if(CO2_pp < safe_co2_min) gas_breathed = handle_too_little_breath(breather, CO2_pp, safe_co2_min, CO2_moles) breather.throw_alert(ALERT_NOT_ENOUGH_CO2, /atom/movable/screen/alert/not_enough_co2) + . = BREATH_DAMAGING else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) @@ -236,9 +240,11 @@ //Too much plasma! if(safe_plasma_max) if(Plasma_pp > safe_plasma_max) - var/ratio = (plasma_moles/safe_plasma_max) * 10 - breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) + if(!forced) + var/ratio = (plasma_moles/safe_plasma_max) * 10 + breather.apply_damage_type(clamp(ratio, plas_breath_dam_min, plas_breath_dam_max), plas_damage_type) breather.throw_alert(ALERT_TOO_MUCH_PLASMA, /atom/movable/screen/alert/too_much_plas) + . = BREATH_DAMAGING else breather.clear_alert(ALERT_TOO_MUCH_PLASMA) @@ -248,6 +254,7 @@ if(Plasma_pp < safe_plasma_min) gas_breathed = handle_too_little_breath(breather, Plasma_pp, safe_plasma_min, plasma_moles) breather.throw_alert(ALERT_NOT_ENOUGH_PLASMA, /atom/movable/screen/alert/not_enough_plas) + . = BREATH_DAMAGING else breather.failed_last_breath = FALSE if(breather.health >= breather.crit_threshold) @@ -271,24 +278,19 @@ breather.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 breather.Sleeping(min(breather.AmountSleeping() + 100, 200)) + else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning breather.clear_alert(ALERT_TOO_MUCH_N2O) if(prob(20)) - n2o_euphoria = EUPHORIA_ACTIVE breather.emote(pick("giggle", "laugh")) else - n2o_euphoria = EUPHORIA_INACTIVE breather.clear_alert(ALERT_TOO_MUCH_N2O) - if (n2o_euphoria == EUPHORIA_ACTIVE || healium_euphoria == EUPHORIA_ACTIVE) - SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "chemical_euphoria", /datum/mood_event/chemical_euphoria) - else if (n2o_euphoria == EUPHORIA_INACTIVE && healium_euphoria == EUPHORIA_INACTIVE) - SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") // Activate mood on first flag, remove on second, do nothing on third. handle_breath_temperature(breath, breather) - return TRUE + return . ///override this for breath handling unique to lung subtypes, breath_gas is the list of gas in the breath while gas breathed is just what is being added or removed from that list, just as they are when this is called in check_breath() /obj/item/organ/lungs/proc/handle_gas_override(mob/living/carbon/human/breather, datum/gas_mixture/breath, gas_breathed) @@ -301,11 +303,11 @@ if(breath_pp > 0) var/ratio = safe_breath_min/breath_pp - suffocator.adjustOxyLoss(min(5*ratio, HUMAN_MAX_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_MAX_OXYLOSS after all! + suffocator.adjustOxyLoss(min(5*ratio, HUMAN_FAILBREATH_OXYLOSS)) // Don't fuck them up too fast (space only does HUMAN_FAILBREATH_OXYLOSS after all! suffocator.failed_last_breath = TRUE . = true_pp*ratio/6 else - suffocator.adjustOxyLoss(HUMAN_MAX_OXYLOSS) + suffocator.adjustOxyLoss(HUMAN_FAILBREATH_OXYLOSS) suffocator.failed_last_breath = TRUE @@ -346,19 +348,26 @@ /obj/item/organ/lungs/on_life(delta_time, times_fired) . = ..() - if(failed && !(organ_flags & ORGAN_FAILING)) - failed = FALSE - return + if (germ_level > INFECTION_LEVEL_ONE) + if(prob(5)) + spawn(-1) + owner.emote("cough") //respitory tract infection + if(damage >= low_threshold) - var/do_i_cough = DT_PROB((damage < high_threshold) ? 2.5 : 5, delta_time) // between : past high - if(do_i_cough) - owner.emote("cough") - if(organ_flags & ORGAN_FAILING && owner.stat == CONSCIOUS) - owner.visible_message(span_danger("[owner] grabs [owner.p_their()] throat, struggling for breath!"), span_userdanger("You suddenly feel like you can't breathe!")) - failed = TRUE + if(prob(2) && owner.blood_volume) + owner.visible_message("[owner] coughs up blood!", span_warning("You cough up blood."), span_hear("You hear someone coughing.")) + owner.bleed(1) -/obj/item/organ/lungs/get_availability(datum/species/owner_species) - return !(TRAIT_NOBREATH in owner_species.inherent_traits) + else if(prob(4)) + to_chat(owner, span_warning(pick("I can't breathe...", "Air!", "It's getting hard to breathe."))) + spawn(-1) + owner.emote("gasp") + owner.losebreath = max(round(damage/2), owner.losebreath) + +/obj/item/organ/lungs/check_damage_thresholds(mob/organ_owner) + . = ..() + if(. == high_threshold_passed && owner) + owner.visible_message(span_danger("[owner] grabs at [owner.p_their()] throat, struggling for breath!"), span_userdanger("You suddenly feel like you can't breathe.")) /obj/item/organ/lungs/plasmaman name = "plasma filter" @@ -381,28 +390,6 @@ var/plasma_pp = breath.getBreathPartialPressure(breath.getGroupGas(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/skrell - name = "skrell lungs" - icon_state = "lungs-skrell" - safe_plasma_max = 40 - safe_co2_max = 40 - - cold_level_1_threshold = 248 - cold_level_2_threshold = 220 - cold_level_3_threshold = 170 - cold_level_1_damage = COLD_GAS_DAMAGE_LEVEL_2 //Keep in mind with gas damage levels, you can set these to be negative, if you want someone to heal, instead. - cold_level_2_damage = COLD_GAS_DAMAGE_LEVEL_2 - cold_level_3_damage = COLD_GAS_DAMAGE_LEVEL_3 - cold_damage_type = BRUTE - - heat_level_1_threshold = 318 - heat_level_2_threshold = 348 - heat_level_3_threshold = 1000 - heat_level_1_damage = HEAT_GAS_DAMAGE_LEVEL_2 - heat_level_2_damage = HEAT_GAS_DAMAGE_LEVEL_2 - heat_level_3_damage = HEAT_GAS_DAMAGE_LEVEL_3 - heat_damage_type = BURN - /obj/item/organ/lungs/teshari name = "teshari lungs" @@ -416,7 +403,6 @@ desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." icon_state = "lungs-c" organ_flags = ORGAN_SYNTHETIC - maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. @@ -424,7 +410,7 @@ name = "cybernetic lungs" desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure." icon_state = "lungs-c-u" - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + maxHealth = 100 safe_oxygen_min = 13 emp_vulnerability = 40 @@ -434,7 +420,7 @@ icon_state = "lungs-c-u2" safe_plasma_max = 20 safe_co2_max = 20 - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + maxHealth = 140 safe_oxygen_min = 13 emp_vulnerability = 20 @@ -452,53 +438,6 @@ if(prob(emp_vulnerability/severity)) //Chance of permanent effects organ_flags |= ORGAN_SYNTHETIC_EMP //Starts organ faliure - gonna need replacing soon. - -/obj/item/organ/lungs/ashwalker - name = "blackened frilled lungs" // blackened from necropolis exposure - desc = "Exposure to the necropolis has mutated these lungs to breathe the air of Indecipheres, the lava-covered moon." - icon_state = "lungs-ashwalker" - -// Normal oxygen is 21 kPa partial pressure, but SS13 humans can tolerate down -// to 16 kPa. So it follows that ashwalkers, as humanoids, follow the same rules. -#define GAS_TOLERANCE 5 - -/obj/item/organ/lungs/ashwalker/Initialize(mapload) - . = ..() - - var/datum/gas_mixture/mix = SSzas.lavaland_atmos - - if(!mix?.total_moles) // this typically means we didn't load lavaland, like if we're using #define LOWMEMORYMODE - return - - // Take a "breath" of the air - var/datum/gas_mixture/breath = mix.remove(mix.total_moles * BREATH_PERCENTAGE) - - var/list/breath_gases = breath.gas - var/O2_moles = breath_gases[GAS_OXYGEN] - var/N2_moles = breath_gases[GAS_NITROGEN] - var/plasma_moles = breath_gases[GAS_PLASMA] - var/CO2_moles = breath_gases[GAS_CO2] - - //Partial pressures in our breath - var/O2_pp = breath.getBreathPartialPressure(O2_moles) - var/N2_pp = breath.getBreathPartialPressure(N2_moles) - var/Plasma_pp = breath.getBreathPartialPressure(plasma_moles) - var/CO2_pp = breath.getBreathPartialPressure(CO2_moles) - - safe_oxygen_min = max(0, O2_pp - GAS_TOLERANCE) - safe_nitro_min = max(0, N2_pp - GAS_TOLERANCE) - safe_plasma_min = max(0, Plasma_pp - GAS_TOLERANCE) - - // Increase plasma tolerance based on amount in base air - safe_plasma_max += Plasma_pp - - // CO2 is always a waste gas, so none is required, but ashwalkers - // tolerate the base amount plus tolerance*2 (humans tolerate only 10 pp) - - safe_co2_max = CO2_pp + GAS_TOLERANCE * 2 - -#undef GAS_TOLERANCE - /obj/item/organ/lungs/ethereal name = "aeration reticulum" desc = "These exotic lungs seem crunchier than most." @@ -519,7 +458,7 @@ /obj/item/organ/lungs/vox name = "Vox lungs" desc = "They're filled with dust....wow." - icon_state = "vox-lungs" + icon_state = "lungs-vox" safe_oxygen_min = 0 //We don't breathe this safe_oxygen_max = 0.05 //This is toxic to us @@ -531,5 +470,3 @@ cold_level_1_threshold = 0 // Vox should be able to breathe in cold gas without issues? cold_level_2_threshold = 0 cold_level_3_threshold = 0 - status = ORGAN_ROBOTIC - organ_flags = ORGAN_SYNTHETIC diff --git a/code/modules/surgery/organs/stomach/_stomach.dm b/code/modules/surgery/organs/stomach/_stomach.dm index 17ba43a15de5..14bac809bdb0 100644 --- a/code/modules/surgery/organs/stomach/_stomach.dm +++ b/code/modules/surgery/organs/stomach/_stomach.dm @@ -12,7 +12,6 @@ attack_verb_simple = list("gore", "squish", "slap", "digest") desc = "Onaka ga suite imasu." - healing_factor = STANDARD_ORGAN_HEALING decay_factor = STANDARD_ORGAN_DECAY * 1.15 // ~13 minutes, the stomach is one of the first organs to die low_threshold_passed = "Your stomach flashes with pain before subsiding. Food doesn't seem like a good idea right now." @@ -27,58 +26,50 @@ ///The rate that disgust decays var/disgust_metabolism = 1 - ///The rate that the stomach will transfer reagents to the body - var/metabolism_efficiency = 0.05 // the lowest we should go is 0.05 - - /obj/item/organ/stomach/Initialize(mapload) . = ..() //None edible organs do not get a reagent holder by default if(!reagents) - create_reagents(reagent_vol, REAGENT_HOLDER_ALIVE) - else - reagents.flags |= REAGENT_HOLDER_ALIVE + create_reagents(reagent_vol) -/obj/item/organ/stomach/on_life(delta_time, times_fired) +/obj/item/organ/create_reagents(max_vol, flags) . = ..() + reagents.metabolism_class = CHEM_INGEST - //Manage species digestion - if(istype(owner, /mob/living/carbon/human)) - var/mob/living/carbon/human/humi = owner - if(!(organ_flags & ORGAN_FAILING)) - handle_hunger(humi, delta_time, times_fired) - - var/mob/living/carbon/body = owner +/obj/item/organ/stomach/Insert(mob/living/carbon/reciever, special, drop_if_replaced) + . = ..() + if(!.) + return - // digest food, sent all reagents that can metabolize to the body - for(var/datum/reagent/bit as anything in reagents.reagent_list) + reagents.my_atom = reciever - // If the reagent does not metabolize then it will sit in the stomach - // This has an effect on items like plastic causing them to take up space in the stomach - if(bit.metabolization_rate <= 0) - continue +/obj/item/organ/stomach/Remove(mob/living/carbon/stomach_owner, special) + reagents.my_atom = src + reagents.end_metabolization(stomach_owner) + if(ishuman(stomach_owner)) + var/mob/living/carbon/human/human_owner = owner + human_owner.clear_alert(ALERT_DISGUST) + human_owner.clear_alert(ALERT_NUTRITION) + return ..() - //Ensure that the the minimum is equal to the metabolization_rate of the reagent if it is higher then the STOMACH_METABOLISM_CONSTANT - var/rate_min = max(bit.metabolization_rate, STOMACH_METABOLISM_CONSTANT) - //Do not transfer over more then we have - var/amount_max = bit.volume +/obj/item/organ/stomach/set_organ_dead(failing) + . = ..() + if(!.) + return - //If the reagent is part of the food reagents for the organ - //prevent all the reagents form being used leaving the food reagents - var/amount_food = food_reagents[bit.type] - if(amount_food) - amount_max = max(amount_max - amount_food, 0) + if((organ_flags & ORGAN_DEAD) && owner) + reagents.end_metabolization(owner) - // Transfer the amount of reagents based on volume with a min amount of 1u - var/amount = min((round(metabolism_efficiency * amount_max, 0.05) + rate_min) * delta_time, amount_max) +/obj/item/organ/stomach/on_life(delta_time, times_fired) + . = ..() - if(amount <= 0) - continue + //Manage species digestion + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/humi = owner + if(!(organ_flags & ORGAN_DEAD)) + handle_hunger(humi, delta_time, times_fired) - // transfer the reagents over to the body at the rate of the stomach metabolim - // this way the body is where all reagents that are processed and react - // the stomach manages how fast they are feed in a drip style - reagents.trans_id_to(body, bit.type, amount=amount) + var/mob/living/carbon/body = owner //Handle disgust if(body) @@ -111,7 +102,7 @@ return // the change of vomit is now high - if(damage > high_threshold && DT_PROB(0.05 * damage * nutri_vol * nutri_vol, delta_time)) + if(damage > (high_threshold * maxHealth) && DT_PROB(0.05 * damage * nutri_vol * nutri_vol, delta_time)) body.vomit(damage) to_chat(body, span_warning("Your stomach reels in pain as you're incapable of holding down all that food!")) @@ -139,9 +130,6 @@ if (human.nutrition > 0 && human.stat != DEAD) // THEY HUNGER var/hunger_rate = HUNGER_DECAY - var/datum/component/mood/mood = human.GetComponent(/datum/component/mood) - if(mood && mood.sanity > SANITY_DISTURBED) - hunger_rate *= max(1 - 0.002 * mood.sanity, 0.5) //0.85 to 0.75 // Whether we cap off our satiety or move it towards 0 if(human.satiety > MAX_SATIETY) human.satiety = MAX_SATIETY @@ -181,9 +169,7 @@ to_chat(human, span_notice("You no longer feel vigorous.")) human.metabolism_efficiency = 1 - //Hunger slowdown for if mood isn't enabled - if(CONFIG_GET(flag/disable_human_mood)) - handle_hunger_slowdown(human) + handle_hunger_slowdown(human) // If we did anything more then just set and throw alerts here I would add bracketing // But well, it is all we do, so there's not much point bothering with it you get me? @@ -201,13 +187,10 @@ /obj/item/organ/stomach/proc/handle_hunger_slowdown(mob/living/carbon/human/human) var/hungry = (500 - human.nutrition) / 5 //So overeat would be 100 and default level would be 80 if(hungry >= 70) - human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (hungry / 50)) + human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, slowdown = (hungry / 50)) else human.remove_movespeed_modifier(/datum/movespeed_modifier/hunger) -/obj/item/organ/stomach/get_availability(datum/species/owner_species) - return !(NOSTOMACH in owner_species.inherent_traits) - /obj/item/organ/stomach/proc/handle_disgust(mob/living/carbon/human/disgusted, delta_time, times_fired) var/old_disgust = disgusted.old_disgust var/disgust = disgusted.disgust @@ -243,29 +226,15 @@ switch(disgust) if(0 to DISGUST_LEVEL_GROSS) disgusted.clear_alert(ALERT_DISGUST) - SEND_SIGNAL(disgusted, COMSIG_CLEAR_MOOD_EVENT, "disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/gross) - SEND_SIGNAL(disgusted, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/verygross) - SEND_SIGNAL(disgusted, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) disgusted.throw_alert(ALERT_DISGUST, /atom/movable/screen/alert/disgusted) - SEND_SIGNAL(disgusted, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted) - -/obj/item/organ/stomach/Remove(mob/living/carbon/stomach_owner, special = 0) - if(ishuman(stomach_owner)) - var/mob/living/carbon/human/human_owner = owner - human_owner.clear_alert(ALERT_DISGUST) - SEND_SIGNAL(human_owner, COMSIG_CLEAR_MOOD_EVENT, "disgust") - human_owner.clear_alert(ALERT_NUTRITION) - - return ..() /obj/item/organ/stomach/bone desc = "You have no idea what this strange ball of bones does." - metabolism_efficiency = 0.025 //very bad /// How much [BRUTE] damage milk heals every second var/milk_brute_healing = 2.5 /// How much [BURN] damage milk heals every second @@ -278,7 +247,7 @@ if(milk.volume > 50) reagents.remove_reagent(milk.type, milk.volume - 5) to_chat(owner, span_warning("The excess milk is dripping off your bones!")) - body.heal_bodypart_damage(milk_brute_healing * REAGENTS_EFFECT_MULTIPLIER * delta_time, milk_burn_healing * REAGENTS_EFFECT_MULTIPLIER * delta_time) + body.heal_bodypart_damage(milk_brute_healing * milk.metabolization_rate, milk_burn_healing * milk.metabolization_rate) if(prob(10)) for(var/obj/item/bodypart/BP as anything in body.bodyparts) BP.heal_bones() @@ -289,7 +258,6 @@ name = "digestive crystal" icon_state = "stomach-p" desc = "A strange crystal that is responsible for metabolizing the unseen energy force that feeds plasmamen." - metabolism_efficiency = 0.06 milk_burn_healing = 0 /obj/item/organ/stomach/cybernetic @@ -297,27 +265,23 @@ icon_state = "stomach-c" desc = "A basic device designed to mimic the functions of a human stomach" organ_flags = ORGAN_SYNTHETIC - maxHealth = STANDARD_ORGAN_THRESHOLD * 0.5 var/emp_vulnerability = 80 //Chance of permanent effects if emp-ed. - metabolism_efficiency = 0.35 // not as good at digestion /obj/item/organ/stomach/cybernetic/tier2 name = "cybernetic stomach" icon_state = "stomach-c-u" desc = "An electronic device designed to mimic the functions of a human stomach. Handles disgusting food a bit better." - maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD + maxHealth = 45 disgust_metabolism = 2 emp_vulnerability = 40 - metabolism_efficiency = 0.07 /obj/item/organ/stomach/cybernetic/tier3 name = "upgraded cybernetic stomach" icon_state = "stomach-c-u2" desc = "An upgraded version of the cybernetic stomach, designed to improve further upon organic stomachs. Handles disgusting food very well." - maxHealth = 2 * STANDARD_ORGAN_THRESHOLD + maxHealth = 60 disgust_metabolism = 3 emp_vulnerability = 20 - metabolism_efficiency = 0.1 /obj/item/organ/stomach/cybernetic/emp_act(severity) . = ..() diff --git a/code/modules/surgery/organs/stomach/stomach_ethereal.dm b/code/modules/surgery/organs/stomach/stomach_ethereal.dm index d3d474e32b82..809ec912c3f6 100644 --- a/code/modules/surgery/organs/stomach/stomach_ethereal.dm +++ b/code/modules/surgery/organs/stomach/stomach_ethereal.dm @@ -26,14 +26,13 @@ UnregisterSignal(owner, COMSIG_LIVING_ELECTROCUTE_ACT) REMOVE_TRAIT(owner, TRAIT_NOHUNGER, src) - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "charge") carbon.clear_alert(ALERT_ETHEREAL_CHARGE) carbon.clear_alert(ALERT_ETHEREAL_OVERCHARGE) return ..() /obj/item/organ/stomach/ethereal/handle_hunger_slowdown(mob/living/carbon/human/human) - human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, multiplicative_slowdown = (1.5 * (1 - crystal_charge / 100))) + human.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/hunger, slowdown = (1.5 * (1 - crystal_charge / 100))) /obj/item/organ/stomach/ethereal/proc/charge(datum/source, amount, repairs) SIGNAL_HANDLER @@ -52,32 +51,28 @@ /obj/item/organ/stomach/ethereal/proc/handle_charge(mob/living/carbon/carbon, delta_time, times_fired) switch(crystal_charge) if(-INFINITY to ETHEREAL_CHARGE_NONE) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/decharged) carbon.throw_alert(ALERT_ETHEREAL_CHARGE, /atom/movable/screen/alert/emptycell/ethereal) if(carbon.health > 10.5) carbon.apply_damage(0.65, TOX, null, null, carbon) + if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/decharged) carbon.throw_alert(ALERT_ETHEREAL_CHARGE, /atom/movable/screen/alert/lowcell/ethereal, 3) if(carbon.health > 10.5) carbon.apply_damage(0.325 * delta_time, TOX, null, null, carbon) + if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/lowpower) carbon.throw_alert(ALERT_ETHEREAL_CHARGE, /atom/movable/screen/alert/lowcell/ethereal, 2) - if(ETHEREAL_CHARGE_ALMOSTFULL to ETHEREAL_CHARGE_FULL) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/charged) + if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/overcharged) carbon.throw_alert(ALERT_ETHEREAL_OVERCHARGE, /atom/movable/screen/alert/ethereal_overcharge, 1) carbon.apply_damage(0.2, TOX, null, null, carbon) + if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) - SEND_SIGNAL(carbon, COMSIG_ADD_MOOD_EVENT, "charge", /datum/mood_event/supercharged) carbon.throw_alert(ALERT_ETHEREAL_OVERCHARGE, /atom/movable/screen/alert/ethereal_overcharge, 2) carbon.apply_damage(0.325 * delta_time, TOX, null, null, carbon) if(DT_PROB(5, delta_time)) // 5% each seacond for ethereals to explosively release excess energy if it reaches dangerous levels discharge_process(carbon) else - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "charge") carbon.clear_alert(ALERT_ETHEREAL_CHARGE) carbon.clear_alert(ALERT_ETHEREAL_OVERCHARGE) diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index afee55f40918..56ef1e729cd0 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -7,9 +7,25 @@ slot = ORGAN_SLOT_TONGUE attack_verb_continuous = list("licks", "slobbers", "slaps", "frenches", "tongues") attack_verb_simple = list("lick", "slobber", "slap", "french", "tongue") + + relative_size = 5 + var/list/languages_possible var/list/languages_native //human mobs can speak with this languages without the accent (letters replaces) - var/say_mod = null + + /// Replaces the "says" text with something else + var/tongue_say_verb = null + /// Replaces the "asks" text with something else + var/tongue_ask_verb = null + /// Replaces the "exclaims" text with something else + var/tongue_exclaim_verb = null + /// Replaces the "exclaims" text with something else + var/tongue_yell_verb = null + /// Replaces the "whispers" text with something else + var/tongue_whisper_verb = null + /// Replaces the "sings" text with something else + var/tongue_sing_verb = null + /// Whether the owner of this tongue can taste anything. Being set to FALSE will mean no taste feedback will be provided. var/sense_of_taste = TRUE @@ -30,9 +46,8 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, - /datum/language/skrell, /datum/language/schechi, + /datum/language/spacer, /datum/language/vox, )) @@ -42,6 +57,9 @@ /obj/item/organ/tongue/proc/handle_speech(datum/source, list/speech_args) SIGNAL_HANDLER + var/datum/language/language = speech_args[SPEECH_LANGUAGE] + if(istype(language, /datum/language/visual)) + return FALSE if(speech_args[SPEECH_LANGUAGE] in languages_native) return FALSE //no changes modify_speech(source, speech_args) @@ -54,8 +72,21 @@ if(!.) return - if(say_mod && tongue_owner.dna && tongue_owner.dna.species) - tongue_owner.dna.species.say_mod = say_mod + if(tongue_say_verb) + tongue_owner.verb_say = tongue_say_verb + tongue_owner.dna?.species.say_mod = tongue_say_verb + if(tongue_ask_verb) + tongue_owner.verb_ask = tongue_ask_verb + if(tongue_exclaim_verb) + tongue_owner.verb_exclaim = tongue_exclaim_verb + if(tongue_whisper_verb) + tongue_owner.verb_whisper = tongue_whisper_verb + if(tongue_sing_verb) + tongue_owner.verb_sing = tongue_sing_verb + if(tongue_yell_verb) + tongue_owner.verb_sing = tongue_yell_verb + + if (modifies_speech) RegisterSignal(tongue_owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) tongue_owner.UnregisterSignal(tongue_owner, COMSIG_MOB_SAY) @@ -71,22 +102,29 @@ /obj/item/organ/tongue/Remove(mob/living/carbon/tongue_owner, special = 0) . = ..() - if(say_mod && tongue_owner.dna && tongue_owner.dna.species) - tongue_owner.dna.species.say_mod = initial(tongue_owner.dna.species.say_mod) UnregisterSignal(tongue_owner, COMSIG_MOB_SAY) - RegisterSignal(tongue_owner, COMSIG_MOB_SAY, TYPE_PROC_REF(/mob/living/carbon, handle_tongueless_speech)) + tongue_owner.RegisterSignal(tongue_owner, COMSIG_MOB_SAY, TYPE_PROC_REF(/mob/living/carbon, handle_tongueless_speech)) REMOVE_TRAIT(tongue_owner, TRAIT_AGEUSIA, ORGAN_TRAIT) // Carbons by default start with NO_TONGUE_TRAIT caused TRAIT_AGEUSIA ADD_TRAIT(tongue_owner, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) -/obj/item/organ/tongue/could_speak_language(language) + tongue_owner.dna?.species?.say_mod = initial(tongue_owner.dna.species.say_mod) + tongue_owner.verb_say = initial(tongue_owner.verb_say) + tongue_owner.verb_ask = initial(tongue_owner.verb_ask) + tongue_owner.verb_exclaim = initial(tongue_owner.verb_exclaim) + tongue_owner.verb_whisper = initial(tongue_owner.verb_whisper) + tongue_owner.verb_sing = initial(tongue_owner.verb_sing) + tongue_owner.verb_yell = initial(tongue_owner.verb_yell) + +/obj/item/organ/tongue/proc/can_physically_speak_language(language) return is_type_in_typecache(language, languages_possible) /obj/item/organ/tongue/lizard name = "forked tongue" desc = "A thin and long muscle typically found in reptilian races, apparently moonlights as a nose." icon_state = "tonguelizard" - say_mod = "hisses" + tongue_say_verb = "hisses" + tongue_whisper_verb = "hisses quietly" taste_sensitivity = 10 // combined nose + tongue, extra sensitive modifies_speech = TRUE languages_native = list(/datum/language/draconic) @@ -192,7 +230,7 @@ name = "proboscis" desc = "A freakish looking meat tube that apparently can take in liquids." icon_state = "tonguefly" - say_mod = "buzzes" + tongue_say_verb = "buzzes" taste_sensitivity = 25 // you eat vomit, this is a mercy modifies_speech = TRUE languages_native = list(/datum/language/buzzwords) @@ -209,7 +247,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/buzzwords )) @@ -232,7 +269,7 @@ name = "superlingual matrix" desc = "A mysterious structure that allows for instant communication between users. Pretty impressive until you need to eat something." icon_state = "tongueayylmao" - say_mod = "gibbers" + tongue_say_verb = "gibbers" sense_of_taste = FALSE modifies_speech = TRUE var/mothership @@ -285,7 +322,7 @@ name = "rotting tongue" desc = "Between the decay and the fact that it's just lying there you doubt a tongue has ever seemed less sexy." icon_state = "tonguezombie" - say_mod = "moans" + tongue_say_verb = "moans" modifies_speech = TRUE taste_sensitivity = 32 @@ -309,7 +346,7 @@ name = "alien tongue" desc = "According to leading xenobiologists the evolutionary benefit of having a second mouth in your mouth is \"that it looks badass\"." icon_state = "tonguexeno" - say_mod = "hisses" + tongue_say_verb = "hisses" taste_sensitivity = 10 // LIZARDS ARE ALIENS CONFIRMED modifies_speech = TRUE // not really, they just hiss var/static/list/languages_possible_alien = typecacheof(list( @@ -325,17 +362,11 @@ /obj/item/organ/tongue/alien/modify_speech(datum/source, list/speech_args) playsound(owner, SFX_HISS, 25, TRUE, TRUE) -/obj/item/organ/tongue/skrell - name = "internal vocal sacs" - desc = "A strange looking sac." - icon_state = "tongue-skrell" - taste_sensitivity = 5 - /obj/item/organ/tongue/bone name = "bone \"tongue\"" desc = "Apparently skeletons alter the sounds they produce through oscillation of their teeth, hence their characteristic rattling." icon_state = "tonguebone" - say_mod = "rattles" + tongue_say_verb = "rattles" attack_verb_continuous = list("bites", "chatters", "chomps", "enamelles", "bones") attack_verb_simple = list("bite", "chatter", "chomp", "enamel", "bone") sense_of_taste = FALSE @@ -356,8 +387,7 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, - /datum/language/calcic + /datum/language/spacer, )) /obj/item/organ/tongue/bone/Initialize(mapload) @@ -383,10 +413,14 @@ /obj/item/organ/tongue/robot name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." - status = ORGAN_ROBOTIC - organ_flags = NONE + organ_flags = ORGAN_SYNTHETIC icon_state = "tonguerobot" - say_mod = "states" + + tongue_say_verb = "whistles" + tongue_ask_verb = "chirps" + tongue_exclaim_verb = "whistles loudly" + tongue_whisper_verb = "whistles quietly" + attack_verb_continuous = list("beeps", "boops") attack_verb_simple = list("beep", "boop") modifies_speech = TRUE @@ -395,6 +429,9 @@ /obj/item/organ/tongue/robot/can_speak_language(language) return TRUE // THE MAGIC OF ELECTRONICS +/obj/item/organ/tongue/robot/can_physically_speak_language(language) + return TRUE + /obj/item/organ/tongue/robot/modify_speech(datum/source, list/speech_args) speech_args[SPEECH_SPANS] |= SPAN_ROBOT @@ -418,7 +455,7 @@ name = "electric discharger" desc = "A sophisticated ethereal organ, capable of synthesising speech via electrical discharge." icon_state = "electrotongue" - say_mod = "crackles" + tongue_say_verb = "crackles" taste_sensitivity = 10 // ethereal tongues function (very loosely) like a gas spectrometer: vaporising a small amount of the food and allowing it to pass to the nose, resulting in more sensitive taste attack_verb_continuous = list("shocks", "jolts", "zaps") attack_verb_simple = list("shock", "jolt", "zap") @@ -435,7 +472,6 @@ /datum/language/sylvan, /datum/language/shadowtongue, /datum/language/terrum, - /datum/language/nekomimetic, /datum/language/voltaic )) @@ -443,36 +479,6 @@ . = ..() languages_possible = languages_possible_ethereal -//Sign Language Tongue - yep, that's how you speak sign language. -/obj/item/organ/tongue/tied - name = "tied tongue" - desc = "If only one had a sword so we may finally untie this knot." - say_mod = "signs" - icon_state = "tonguetied" - modifies_speech = TRUE - -/obj/item/organ/tongue/tied/Insert(mob/living/carbon/signer) - . = ..() - if(!.) - return - - signer.verb_ask = "signs" - signer.verb_exclaim = "signs" - signer.verb_whisper = "subtly signs" - signer.verb_sing = "rythmically signs" - signer.verb_yell = "emphatically signs" - ADD_TRAIT(signer, TRAIT_SIGN_LANG, ORGAN_TRAIT) - REMOVE_TRAIT(signer, TRAIT_MUTE, ORGAN_TRAIT) - -/obj/item/organ/tongue/tied/Remove(mob/living/carbon/speaker, special = 0) - ..() - speaker.verb_ask = initial(verb_ask) - speaker.verb_exclaim = initial(verb_exclaim) - speaker.verb_whisper = initial(verb_whisper) - speaker.verb_sing = initial(verb_sing) - speaker.verb_yell = initial(verb_yell) - REMOVE_TRAIT(speaker, TRAIT_SIGN_LANG, ORGAN_TRAIT) - //Thank you Jwapplephobia for helping me with the literal hellcode below /obj/item/organ/tongue/tied/modify_speech(datum/source, list/speech_args) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 097fd92a2b67..c93f4df08c01 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -6,7 +6,6 @@ slot = ORGAN_SLOT_VOICE gender = PLURAL decay_factor = 0 //we don't want decaying vocal cords to somehow matter or appear on scanners since they don't do anything damaged - healing_factor = 0 var/list/spans = null /obj/item/organ/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords @@ -18,41 +17,6 @@ /obj/item/organ/vocal_cords/proc/handle_speech(message) //actually say the message owner.say(message, spans = spans, sanitize = FALSE) -/obj/item/organ/adamantine_resonator - visual = FALSE - name = "adamantine resonator" - desc = "Fragments of adamantine exist in all golems, stemming from their origins as purely magical constructs. These are used to \"hear\" messages from their leaders." - zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_ADAMANTINE_RESONATOR - icon_state = "adamantine_resonator" - -/obj/item/organ/vocal_cords/adamantine - name = "adamantine vocal cords" - desc = "When adamantine resonates, it causes all nearby pieces of adamantine to resonate as well. Adamantine golems use this to broadcast messages to nearby golems." - actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) - icon_state = "adamantine_cords" - -/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger(trigger_flags) - if(!IsAvailable()) - return - var/message = tgui_input_text(owner, "Resonate a message to all nearby golems", "Resonate") - if(!message) - return - if(QDELETED(src) || QDELETED(owner)) - return - owner.say(".x[message]") - -/obj/item/organ/vocal_cords/adamantine/handle_speech(message) - var/msg = span_resonate(span_name("[owner.real_name]
resonates, \"[message]\"")) - for(var/player in GLOB.player_list) - if(iscarbon(player)) - var/mob/living/carbon/speaker = player - if(speaker.getorganslot(ORGAN_SLOT_ADAMANTINE_RESONATOR)) - to_chat(speaker, msg) - if(isobserver(player)) - var/link = FOLLOW_LINK(player, owner) - to_chat(player, "[link] [msg]") - //Colossus drop, forces the listeners to obey certain commands /obj/item/organ/vocal_cords/colossus name = "divine vocal cords" diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm deleted file mode 100644 index bfc25433aee5..000000000000 --- a/code/modules/surgery/plastic_surgery.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/surgery/plastic_surgery - name = "Plastic surgery" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/reshape_face, - /datum/surgery_step/close) - possible_locs = list(BODY_ZONE_HEAD) - -//reshape_face -/datum/surgery_step/reshape_face - name = "reshape face" - implements = list( - TOOL_SCALPEL = 100, - /obj/item/knife = 50, - TOOL_WIRECUTTER = 35) - time = 64 - -/datum/surgery_step/reshape_face/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message(span_notice("[user] begins to alter [target]'s appearance."), span_notice("You begin to alter [target]'s appearance...")) - display_results(user, target, span_notice("You begin to alter [target]'s appearance..."), - span_notice("[user] begins to alter [target]'s appearance."), - span_notice("[user] begins to make an incision in [target]'s face.")) - display_pain(target, "You feel slicing pain across your face!") - -/datum/surgery_step/reshape_face/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(HAS_TRAIT_FROM(target, TRAIT_DISFIGURED, TRAIT_GENERIC)) - REMOVE_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC) - display_results(user, target, span_notice("You successfully restore [target]'s appearance."), - span_notice("[user] successfully restores [target]'s appearance!"), - span_notice("[user] finishes the operation on [target]'s face.")) - display_pain(target, "The pain fades, your face feels normal again!") - else - var/list/names = list() - if(!isabductor(user)) - for(var/i in 1 to 10) - names += target.dna.species.random_name(target.gender, TRUE) - else - for(var/_i in 1 to 9) - names += "Subject [target.gender == MALE ? "i" : "o"]-[pick("a", "b", "c", "d", "e")]-[rand(10000, 99999)]" - names += target.dna.species.random_name(target.gender, TRUE) //give one normal name in case they want to do regular plastic surgery - var/chosen_name = tgui_input_list(user, "New name to assign", "Plastic Surgery", names) - if(isnull(chosen_name)) - return - var/oldname = target.real_name - target.real_name = chosen_name - var/newname = target.real_name //something about how the code handles names required that I use this instead of target.real_name - display_results(user, target, span_notice("You alter [oldname]'s appearance completely, [target.p_they()] is now [newname]."), - span_notice("[user] alters [oldname]'s appearance completely, [target.p_they()] is now [newname]!"), - span_notice("[user] finishes the operation on [target]'s face.")) - display_pain(target, "The pain fades, your face feels new and unfamiliar!") - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - human_target.sec_hud_set_ID() - return ..() - -/datum/surgery_step/reshape_face/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_warning("You screw up, leaving [target]'s appearance disfigured!"), - span_notice("[user] screws up, disfiguring [target]'s appearance!"), - span_notice("[user] finishes the operation on [target]'s face.")) - display_pain(target, "Your face feels horribly scarred and deformed!") - ADD_TRAIT(target, TRAIT_DISFIGURED, TRAIT_GENERIC) - return FALSE diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm deleted file mode 100644 index fb0f462d010d..000000000000 --- a/code/modules/surgery/prosthetic_replacement.dm +++ /dev/null @@ -1,115 +0,0 @@ -/datum/surgery/prosthetic_replacement - name = "Prosthetic replacement" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/add_prosthetic) - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD) - requires_bodypart = FALSE //need a missing limb - requires_bodypart_type = 0 - -/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target) - if(!iscarbon(target)) - return FALSE - var/mob/living/carbon/carbon_target = target - if(!carbon_target.get_bodypart(user.zone_selected)) //can only start if limb is missing - return TRUE - return FALSE - - - -/datum/surgery_step/add_prosthetic - name = "add prosthetic" - implements = list( - /obj/item/bodypart = 100, - /obj/item/borg/apparatus/organ_storage = 100, - /obj/item/chainsaw = 100, - /obj/item/melee/synthetic_arm_blade = 100) - time = 32 - var/organ_rejection_dam = 0 - -/datum/surgery_step/add_prosthetic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - if(!tool.contents.len) - to_chat(user, span_warning("There is nothing inside [tool]!")) - return -1 - var/obj/item/organ_storage_contents = tool.contents[1] - if(!isbodypart(organ_storage_contents)) - to_chat(user, span_warning("[organ_storage_contents] cannot be attached!")) - return -1 - tool = organ_storage_contents - if(istype(tool, /obj/item/bodypart)) - var/obj/item/bodypart/bodypart_to_attach = tool - if(IS_ORGANIC_LIMB(bodypart_to_attach)) - organ_rejection_dam = 10 - if(ishuman(target)) - var/mob/living/carbon/human/human_target = target - var/obj/item/bodypart/chest/target_chest = human_target.get_bodypart(BODY_ZONE_CHEST) - if(!(bodypart_to_attach.bodytype & target_chest.acceptable_bodytype)) - to_chat(user, span_warning("[bodypart_to_attach] doesn't match the patient's morphology.")) - return -1 - if(human_target.dna.species.id != bodypart_to_attach.limb_id) - organ_rejection_dam = 30 - - if(target_zone == bodypart_to_attach.body_zone) //so we can't replace a leg with an arm, or a human arm with a monkey arm. - display_results(user, target, span_notice("You begin to replace [target]'s [parse_zone(target_zone)] with [tool]..."), - span_notice("[user] begins to replace [target]'s [parse_zone(target_zone)] with [tool]."), - span_notice("[user] begins to replace [target]'s [parse_zone(target_zone)].")) - else - to_chat(user, span_warning("[tool] isn't the right type for [parse_zone(target_zone)].")) - return -1 - else if(target_zone == BODY_ZONE_L_ARM || target_zone == BODY_ZONE_R_ARM) - display_results(user, target, span_notice("You begin to attach [tool] onto [target]..."), - span_notice("[user] begins to attach [tool] onto [target]'s [parse_zone(target_zone)]."), - span_notice("[user] begins to attach something onto [target]'s [parse_zone(target_zone)].")) - else - to_chat(user, span_warning("[tool] must be installed onto an arm.")) - return -1 - -/datum/surgery_step/add_prosthetic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - . = ..() - if(istype(tool, /obj/item/borg/apparatus/organ_storage)) - tool.icon_state = initial(tool.icon_state) - tool.desc = initial(tool.desc) - tool.cut_overlays() - tool = tool.contents[1] - if(istype(tool, /obj/item/bodypart) && user.temporarilyRemoveItemFromInventory(tool)) - var/obj/item/bodypart/limb_to_attach = tool - if(!limb_to_attach.attach_limb(target)) - display_results(user, target, span_warning("You fail in replacing [target]'s [parse_zone(target_zone)]! Their body has rejected [limb_to_attach]!"), - span_warning("[user] fails to replace [target]'s [parse_zone(target_zone)]!"), - span_warning("[user] fails to replaces [target]'s [parse_zone(target_zone)]!")) - return - if(organ_rejection_dam) - target.adjustToxLoss(organ_rejection_dam) - display_results(user, target, span_notice("You succeed in replacing [target]'s [parse_zone(target_zone)]."), - span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)] with [tool]!"), - span_notice("[user] successfully replaces [target]'s [parse_zone(target_zone)]!")) - display_pain(target, "You feel synthetic sensation wash from your [parse_zone(target_zone)], which you can feel again!", TRUE) - return - else - var/obj/item/bodypart/limb_to_attach = target.newBodyPart(target_zone, FALSE, FALSE) - limb_to_attach.is_pseudopart = TRUE - if(!limb_to_attach.attach_limb(target)) - display_results(user, target, span_warning("You fail in attaching [target]'s [parse_zone(target_zone)]! Their body has rejected [limb_to_attach]!"), - span_warning("[user] fails to attach [target]'s [parse_zone(target_zone)]!"), - span_warning("[user] fails to attach [target]'s [parse_zone(target_zone)]!")) - limb_to_attach.forceMove(target.loc) - return - user.visible_message(span_notice("[user] finishes attaching [tool]!"), span_notice("You attach [tool].")) - display_results(user, target, span_notice("You attach [tool]."), - span_notice("[user] finishes attaching [tool]!"), - span_notice("[user] finishes the attachment procedure!")) - display_pain(target, "You feel a strange sensation from your new [parse_zone(target_zone)].", TRUE) - qdel(tool) - if(istype(tool, /obj/item/chainsaw)) - var/obj/item/mounted_chainsaw/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 - else if(istype(tool, /obj/item/melee/synthetic_arm_blade)) - 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 - return ..() //if for some reason we fail everything we'll print out some text okay? diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm deleted file mode 100644 index a03a01f18874..000000000000 --- a/code/modules/surgery/revival.dm +++ /dev/null @@ -1,97 +0,0 @@ -/datum/surgery/revival - name = "Revival" - desc = "An experimental surgical procedure which involves reconstruction and reactivation of the patient's brain even long after death. The body must still be able to sustain life." - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/saw, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/incise, - /datum/surgery_step/revive, - /datum/surgery_step/repair_bone, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_HEAD) - requires_bodypart_type = 0 - -/datum/surgery/revival/can_start(mob/user, mob/living/carbon/target) - if(!..()) - return FALSE - if(target.stat != DEAD) - return FALSE - if(target.suiciding || HAS_TRAIT(target, TRAIT_HUSK)) - return FALSE - if(HAS_TRAIT(target, TRAIT_DEFIB_BLACKLISTED)) - return FALSE - var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN) - if(!target_brain) - return FALSE - return TRUE - -/datum/surgery_step/revive - name = "shock brain" - implements = list( - /obj/item/shockpaddles = 100, - /obj/item/melee/touch_attack/shock = 100, - /obj/item/melee/baton/security = 75, - /obj/item/gun/energy = 60) - repeatable = TRUE - time = 5 SECONDS - success_sound = 'sound/magic/lightningbolt.ogg' - failure_sound = 'sound/magic/lightningbolt.ogg' - -/datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) - . = TRUE - if(istype(tool, /obj/item/shockpaddles)) - var/obj/item/shockpaddles/paddles = tool - if((paddles.req_defib && !paddles.defib.powered) || !paddles.wielded || paddles.cooldown || paddles.busy) - to_chat(user, span_warning("You need to wield both paddles, and [paddles.defib] must be powered!")) - return FALSE - if(istype(tool, /obj/item/melee/baton/security)) - var/obj/item/melee/baton/security/baton = tool - if(!baton.active) - to_chat(user, span_warning("[baton] needs to be active!")) - return FALSE - if(istype(tool, /obj/item/gun/energy)) - var/obj/item/gun/energy/egun = tool - if(egun.chambered && istype(egun.chambered, /obj/item/ammo_casing/energy/electrode)) - return TRUE - else - to_chat(user, span_warning("You need an electrode for this!")) - return FALSE - -/datum/surgery_step/revive/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You prepare to give [target]'s brain the spark of life with [tool]."), - span_notice("[user] prepares to shock [target]'s brain with [tool]."), - span_notice("[user] prepares to shock [target]'s brain with [tool].")) - target.notify_ghost_cloning("Someone is trying to zap your brain.", source = target) - -/datum/surgery_step/revive/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool, /obj/item/shockpaddles)) - playsound(tool, 'sound/machines/defib_charge.ogg', 75, 0) - else - ..() - -/datum/surgery_step/revive/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) - display_results(user, target, span_notice("You successfully shock [target]'s brain with [tool]..."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool]..."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool]...")) - target.grab_ghost() - target.adjustOxyLoss(-50, 0) - target.updatehealth() - if(target.revive(full_heal = FALSE, admin_revive = FALSE)) - target.visible_message(span_notice("...[target] wakes up, alive and aware!")) - target.emote("gasp") - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 50, 199) //MAD SCIENCE - return TRUE - else - target.visible_message(span_warning("...[target.p_they()] convulses, then lies still.")) - return FALSE - -/datum/surgery_step/revive/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You shock [target]'s brain with [tool], but [target.p_they()] doesn't react."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react."), - span_notice("[user] send a powerful shock to [target]'s brain with [tool], but [target.p_they()] doesn't react.")) - target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 15, 180) - return FALSE diff --git a/code/modules/surgery/stomachpump.dm b/code/modules/surgery/stomachpump.dm deleted file mode 100644 index ffd179e5868a..000000000000 --- a/code/modules/surgery/stomachpump.dm +++ /dev/null @@ -1,55 +0,0 @@ -/datum/surgery/stomach_pump - name = "Stomach Pump" - steps = list( - /datum/surgery_step/incise, - /datum/surgery_step/retract_skin, - /datum/surgery_step/incise, - /datum/surgery_step/clamp_bleeders, - /datum/surgery_step/stomach_pump, - /datum/surgery_step/close) - - target_mobtypes = list(/mob/living/carbon/human) - possible_locs = list(BODY_ZONE_CHEST) - requires_bodypart_type = TRUE - ignore_clothes = FALSE - var/accumulated_experience = 0 - -/datum/surgery/stomach_pump/can_start(mob/user, mob/living/carbon/target) - var/obj/item/organ/stomach/target_stomach = target.getorganslot(ORGAN_SLOT_STOMACH) - if(HAS_TRAIT(target, TRAIT_HUSK)) - return FALSE - if(!target_stomach) - return FALSE - return ..() - -//Working the stomach by hand in such a way that you induce vomiting. -/datum/surgery_step/stomach_pump - name = "Pump Stomach" - accept_hand = TRUE - repeatable = TRUE - time = 20 - success_sound = 'sound/surgery/organ2.ogg' - -/datum/surgery_step/stomach_pump/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, span_notice("You begin pumping [target]'s stomach..."), - span_notice("[user] begins to pump [target]'s stomach."), - span_notice("[user] begins to press on [target]'s chest.")) - display_pain(target, "You feel a horrible sloshing feeling in your gut! You're going to be sick!") - -/datum/surgery_step/stomach_pump/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results(user, target, span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), - span_notice("[user] forces [target_human] to vomit, cleansing their stomach of some chemicals!"), - "[user] forces [target_human] to vomit!") - target_human.vomit(20, FALSE, TRUE, 1, TRUE, FALSE, purge_ratio = 0.67) //higher purge ratio than regular vomiting - return ..() - -/datum/surgery_step/stomach_pump/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(ishuman(target)) - var/mob/living/carbon/human/target_human = target - display_results(user, target, span_warning("You screw up, brusing [target_human]'s chest!"), - span_warning("[user] screws up, brusing [target_human]'s chest!"), - span_warning("[user] screws up!")) - target_human.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) - target_human.adjustBruteLoss(5) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm deleted file mode 100644 index 6dd066367c3d..000000000000 --- a/code/modules/surgery/surgery.dm +++ /dev/null @@ -1,190 +0,0 @@ -/datum/surgery - 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/target_mobtypes = list(/mob/living/carbon/human) //Acceptable Species - var/location = BODY_ZONE_CHEST //Surgery location - var/requires_bodypart_type = BODYTYPE_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/datum/wound/operated_wound //The actual wound datum instance we're targeting - var/requires_bodypart = TRUE //Surgery available only when a bodypart is present, or only when it is missing. - var/speed_modifier = 0 //Step speed modifier - 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) - /// Organ being directly manipulated, used for checking if the organ is still in the body after surgery has begun - var/organ_to_manipulate - -/datum/surgery/New(atom/surgery_target, surgery_location, surgery_bodypart) - ..() - if(!surgery_target) - return - target = surgery_target - target.surgeries += src - if(surgery_location) - location = surgery_location - if(!surgery_bodypart) - return - operated_bodypart = surgery_bodypart - - SEND_SIGNAL(surgery_target, COMSIG_MOB_SURGERY_STARTED, src, surgery_location, surgery_bodypart) - -/datum/surgery/Destroy() - if(target) - target.surgeries -= src - target = null - operated_bodypart = null - return ..() - - -/datum/surgery/proc/can_start(mob/user, mob/living/patient) //FALSE to not show in list - . = TRUE - if(replaced_by == /datum/surgery) - return FALSE - - // True surgeons (like abductor scientists) need no instructions - if(HAS_TRAIT(user, TRAIT_SURGEON) || (!isnull(user.mind) && HAS_TRAIT(user.mind, TRAIT_SURGEON))) - if(replaced_by) // only show top-level surgeries - return FALSE - else - return TRUE - - if(!requires_tech && !replaced_by) - return TRUE - - if(requires_tech) - . = FALSE - - if(iscyborg(user)) - var/mob/living/silicon/robot/robo_surgeon = user - var/obj/item/surgical_processor/surgical_processor = locate() in robo_surgeon.model.modules - if(surgical_processor) //no early return for !surgical_processor since we want to check optable should this not exist. - if(replaced_by in surgical_processor.advanced_surgeries) - return FALSE - if(type in surgical_processor.advanced_surgeries) - return TRUE - - var/turf/patient_turf = get_turf(patient) - - //Get the relevant operating computer - var/obj/machinery/computer/operating/opcomputer = locate_operating_computer(patient_turf) - if (isnull(opcomputer)) - return . - if(replaced_by in opcomputer.advanced_surgeries) - return FALSE - if(type in opcomputer.advanced_surgeries) - return TRUE - -/datum/surgery/proc/next_step(mob/living/user, modifiers) - if(location != user.zone_selected) - return FALSE - if(step_in_progress) - return TRUE - - var/try_to_fail = FALSE - if(LAZYACCESS(modifiers, RIGHT_CLICK)) - try_to_fail = TRUE - - var/datum/surgery_step/step = get_surgery_step() - if(step) - var/obj/item/tool = user.get_active_held_item() - if(step.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) - return TRUE - if(tool && tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it - to_chat(user, span_warning("This step requires a different tool!")) - return TRUE - return FALSE - -/datum/surgery/proc/get_surgery_step() - var/step_type = steps[status] - return new step_type - -/datum/surgery/proc/get_surgery_next_step() - if(status < steps.len) - var/step_type = steps[status + 1] - return new step_type - else - return null - -/datum/surgery/proc/complete(mob/surgeon) - SSblackbox.record_feedback("tally", "surgeries_completed", 1, type) - surgeon.mind.add_memory( - MEMORY_SUCCESSFUL_SURGERY, - list( - DETAIL_PROTAGONIST = surgeon, - DETAIL_DEUTERAGONIST = target, - DETAIL_SURGERY_TYPE = src, - ), - story_value = STORY_VALUE_OKAY - ) - qdel(src) - -/// Returns a nearby operating computer linked to an operating table -/datum/surgery/proc/locate_operating_computer(turf/patient_turf) - if (isnull(patient_turf)) - return null - - var/obj/structure/table/optable/operating_table = locate(/obj/structure/table/optable, patient_turf) - var/obj/machinery/computer/operating/operating_computer = operating_table?.computer - - if (isnull(operating_computer)) - return null - - if(operating_computer.machine_stat & (NOPOWER|BROKEN)) - return null - - return operating_computer - -/datum/surgery/advanced - name = "advanced surgery" - requires_tech = TRUE - -/obj/item/disk/surgery - name = "Surgery Procedure Disk" - desc = "A disk that contains advanced surgery procedures, must be loaded into an Operating Console." - icon_state = "datadisk1" - custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) - var/list/surgeries - -/obj/item/disk/surgery/debug - name = "Debug Surgery Disk" - desc = "A disk that contains all existing surgery procedures." - icon_state = "datadisk1" - custom_materials = list(/datum/material/iron=300, /datum/material/glass=100) - -/obj/item/disk/surgery/debug/Initialize(mapload) - . = ..() - surgeries = list() - var/list/req_tech_surgeries = subtypesof(/datum/surgery) - for(var/datum/surgery/beep as anything in req_tech_surgeries) - if(initial(beep.requires_tech)) - surgeries += beep - -//INFO -//Check /mob/living/carbon/attackby for how surgery progresses, and also /mob/living/carbon/attack_hand. -//As of Feb 21 2013 they are in code/modules/mob/living/carbon/carbon.dm, lines 459 and 51 respectively. -//Other important variables are var/list/surgeries (/mob/living) and var/list/internal_organs (/mob/living/carbon) -// var/list/bodyparts (/mob/living/carbon/human) is the LIMBS of a Mob. -//Surgical procedures are initiated by attempt_initiate_surgery(), which is called by surgical drapes and bedsheets. - - -//TODO -//specific steps for some surgeries (fluff text) -//more interesting failure options -//randomised complications -//more surgeries! -//add a probability modifier for the state of the surgeon- health, twitching, etc. blindness, god forbid. -//helper for converting a zone_sel.selecting to body part (for damage) - - -//RESOLVED ISSUES //"Todo" jobs that have been completed -//combine hands/feet into the arms - Hands/feet were removed - RR -//surgeries (not steps) that can be initiated on any body part (corresponding with damage locations) - Call this one done, see possible_locs var - c0 diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm deleted file mode 100644 index 922ef836dbb4..000000000000 --- a/code/modules/surgery/surgery_helpers.dm +++ /dev/null @@ -1,73 +0,0 @@ -/proc/get_location_modifier(mob/located_mob) - var/turf/mob_turf = get_turf(located_mob) - if(locate(/obj/structure/table/optable, mob_turf)) - return 1 - else if(locate(/obj/machinery/stasis, mob_turf)) - return 0.9 - else if(locate(/obj/structure/table, mob_turf)) - return 0.8 - else if(locate(/obj/structure/bed, mob_turf)) - return 0.7 - else - return 0.5 - - -/proc/get_location_accessible(mob/located_mob, location) - var/covered_locations = 0 //based on body_parts_covered - var/face_covered = 0 //based on flags_inv - var/eyesmouth_covered = 0 //based on flags_cover - if(iscarbon(located_mob)) - var/mob/living/carbon/clothed_carbon = located_mob - for(var/obj/item/clothing/clothes in list(clothed_carbon.back, clothed_carbon.wear_mask, clothed_carbon.head)) - covered_locations |= clothes.body_parts_covered - face_covered |= clothes.flags_inv - eyesmouth_covered |= clothes.flags_cover - if(ishuman(clothed_carbon)) - var/mob/living/carbon/human/clothed_human = clothed_carbon - for(var/obj/item/clothes in list(clothed_human.wear_suit, clothed_human.w_uniform, clothed_human.shoes, clothed_human.belt, clothed_human.gloves, clothed_human.glasses, clothed_human.ears)) - covered_locations |= clothes.body_parts_covered - face_covered |= clothes.flags_inv - eyesmouth_covered |= clothes.flags_cover - - switch(location) - if(BODY_ZONE_HEAD) - if(covered_locations & HEAD) - return FALSE - if(BODY_ZONE_PRECISE_EYES) - if(covered_locations & HEAD || face_covered & HIDEEYES || eyesmouth_covered & GLASSESCOVERSEYES) - return FALSE - if(BODY_ZONE_PRECISE_MOUTH) - if(covered_locations & HEAD || face_covered & HIDEFACE || eyesmouth_covered & MASKCOVERSMOUTH || eyesmouth_covered & HEADCOVERSMOUTH) - return FALSE - if(BODY_ZONE_CHEST) - if(covered_locations & CHEST) - return FALSE - if(BODY_ZONE_PRECISE_GROIN) - if(covered_locations & GROIN) - return FALSE - if(BODY_ZONE_L_ARM) - if(covered_locations & ARM_LEFT) - return FALSE - if(BODY_ZONE_R_ARM) - if(covered_locations & ARM_RIGHT) - return FALSE - if(BODY_ZONE_L_LEG) - if(covered_locations & LEG_LEFT) - return FALSE - if(BODY_ZONE_R_LEG) - if(covered_locations & LEG_RIGHT) - return FALSE - if(BODY_ZONE_PRECISE_L_HAND) - if(covered_locations & HAND_LEFT) - return FALSE - if(BODY_ZONE_PRECISE_R_HAND) - if(covered_locations & HAND_RIGHT) - return FALSE - if(BODY_ZONE_PRECISE_L_FOOT) - if(covered_locations & FOOT_LEFT) - return FALSE - if(BODY_ZONE_PRECISE_R_FOOT) - if(covered_locations & FOOT_RIGHT) - return FALSE - - return TRUE diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm deleted file mode 100644 index 1087278862eb..000000000000 --- a/code/modules/surgery/surgery_step.dm +++ /dev/null @@ -1,233 +0,0 @@ -/datum/surgery_step - var/name - var/list/implements = list() //format is path = probability of success. alternatively - var/implement_type = null //the current type of implement used. This has to be stored, as the actual typepath of the tool may not match the list type. - var/accept_hand = FALSE //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item. - var/accept_any_item = FALSE //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand. - var/time = 10 //how long does the step take? - var/repeatable = FALSE //can this step be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop - var/list/chems_needed = list() //list of chems needed to complete the step. Even on success, the step will have no effect if there aren't the chems required in the mob. - var/require_all_chems = TRUE //any on the list or all on the list? - var/silicons_obey_prob = FALSE - var/preop_sound //Sound played when the step is started - var/success_sound //Sound played if the step succeeded - var/failure_sound //Sound played if the step fails - -/datum/surgery_step/proc/try_op(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - var/success = FALSE - if(surgery.organ_to_manipulate && !target.getorganslot(surgery.organ_to_manipulate)) - to_chat(user, span_warning("[target] seems to be missing the organ necessary to complete this surgery!")) - return FALSE - - if(accept_hand) - if(!tool) - success = TRUE - if(iscyborg(user)) - success = TRUE - - if(accept_any_item) - if(tool && tool_check(user, tool)) - success = TRUE - - else if(tool) - for(var/key in implements) - var/match = FALSE - - if(ispath(key) && istype(tool, key)) - match = TRUE - else if(tool.tool_behaviour == key) - match = TRUE - - if(match) - implement_type = key - if(tool_check(user, tool)) - success = TRUE - break - - if(success) - if(target_zone == surgery.location) - if(get_location_accessible(target, target_zone) || surgery.ignore_clothes) - initiate(user, target, target_zone, tool, surgery, try_to_fail) - else - to_chat(user, span_warning("You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!")) - return TRUE //returns TRUE so we don't stab the guy in the dick or wherever. - - if(repeatable) - var/datum/surgery_step/next_step = surgery.get_surgery_next_step() - if(next_step) - surgery.status++ - if(next_step.try_op(user, target, user.zone_selected, user.get_active_held_item(), surgery)) - return TRUE - else - surgery.status-- - - return FALSE - -#define SURGERY_SLOWDOWN_CAP_MULTIPLIER 2 //increase to make surgery slower but fail less, and decrease to make surgery faster but fail more - -/datum/surgery_step/proc/initiate(mob/living/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE) - // Only followers of Asclepius have the ability to use Healing Touch and perform miracle feats of surgery. - // Prevents people from performing multiple simultaneous surgeries unless they're holding a Rod of Asclepius. - - surgery.step_in_progress = TRUE - var/speed_mod = 1 - var/fail_prob = 0//100 - fail_prob = success_prob - var/advance = FALSE - - var/preop_result = preop(user, target, target_zone, tool, surgery) - switch(preop_result) - if(-1) - surgery.step_in_progress = FALSE - return FALSE - if(1) - surgery.step_in_progress = FALSE - surgery.status++ - if(surgery.status > surgery.steps.len) - surgery.complete(user) - return TRUE - - play_preop_sound(user, target, target_zone, tool, surgery) // Here because most steps overwrite preop - - if(tool) - speed_mod = tool.toolspeed - - 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_location_modifier(target) * (1 + surgery.speed_modifier) * implement_speed_mod) * target.mob_surgery_speed_mod - var/modded_time = time * speed_mod - - - fail_prob = min(max(0, modded_time - (time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)),99)//if modded_time > time * modifier, then fail_prob = modded_time - time*modifier. starts at 0, caps at 99 - modded_time = min(modded_time, time * SURGERY_SLOWDOWN_CAP_MULTIPLIER)//also if that, then cap modded_time at time*modifier - - if(iscyborg(user))//any immunities to surgery slowdown should go in this check. - modded_time = time - - var/was_sleeping = (target.stat != DEAD && target.IsSleeping()) - - if(do_after(user, target, modded_time, DO_PUBLIC, interaction_key = user.has_status_effect(/datum/status_effect/hippocratic_oath) ? target : DOAFTER_SOURCE_SURGERY, display = (tool || image('icons/hud/do_after.dmi', "help")))) //If we have the hippocratic oath, we can perform one surgery on each target, otherwise we can only do one surgery in total. - - var/chem_check_result = chem_check(target) - if((prob(100-fail_prob) || (iscyborg(user) && !silicons_obey_prob)) && chem_check_result && !try_to_fail) - - if(success(user, target, target_zone, tool, surgery)) - play_success_sound(user, target, target_zone, tool, surgery) - advance = TRUE - else - if(failure(user, target, target_zone, tool, surgery, fail_prob)) - play_failure_sound(user, target, target_zone, tool, surgery) - advance = TRUE - if(chem_check_result) - return .(user, target, target_zone, tool, surgery, try_to_fail) //automatically re-attempt if failed for reason other than lack of required chemical - if(advance && !repeatable) - surgery.status++ - if(surgery.status > surgery.steps.len) - surgery.complete(user) - - if(target.stat == DEAD && was_sleeping && user.client) - user.client.give_award(/datum/award/achievement/misc/sandman, user) - - 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, span_notice("You begin to perform surgery on [target]..."), - span_notice("[user] begins to perform surgery on [target]."), - span_notice("[user] begins to perform surgery on [target].")) - -/datum/surgery_step/proc/play_preop_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(!preop_sound) - return - var/sound_file_use - if(islist(preop_sound)) - for(var/typepath in preop_sound)//iterate and assign subtype to a list, works best if list is arranged from subtype first and parent last - if(istype(tool, typepath)) - sound_file_use = preop_sound[typepath] - break - else - sound_file_use = preop_sound - playsound(get_turf(target), sound_file_use, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/success(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = TRUE) - SEND_SIGNAL(user, COMSIG_MOB_SURGERY_STEP_SUCCESS, src, target, target_zone, tool, surgery, default_display_results) - if(default_display_results) - display_results(user, target, span_notice("You succeed."), - span_notice("[user] succeeds!"), - span_notice("[user] finishes.")) - return TRUE - -/datum/surgery_step/proc/play_success_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(!success_sound) - return - playsound(get_turf(target), success_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/failure(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, fail_prob = 0) - var/screwedmessage = "" - switch(fail_prob) - if(0 to 24) - screwedmessage = " You almost had it, though." - if(50 to 74)//25 to 49 = no extra text - screwedmessage = " This is hard to get right in these conditions..." - if(75 to 99) - screwedmessage = " This is practically impossible in these conditions..." - - display_results(user, target, span_warning("You screw up![screwedmessage]"), - span_warning("[user] screws up!"), - span_notice("[user] finishes."), TRUE) //By default the patient will notice if the wrong thing has been cut - return FALSE - -/datum/surgery_step/proc/play_failure_sound(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(!failure_sound) - return - playsound(get_turf(target), failure_sound, 75, TRUE, falloff_exponent = 12, falloff_distance = 1) - -/datum/surgery_step/proc/tool_check(mob/user, obj/item/tool) - return TRUE - -/datum/surgery_step/proc/chem_check(mob/living/target) - if(!LAZYLEN(chems_needed)) - return TRUE - - if(require_all_chems) - . = TRUE - for(var/reagent in chems_needed) - if(!target.reagents.has_reagent(reagent)) - return FALSE - else - . = FALSE - for(var/reagent in chems_needed) - if(target.reagents.has_reagent(reagent)) - return TRUE - -/datum/surgery_step/proc/get_chem_list() - if(!LAZYLEN(chems_needed)) - return - var/list/chems = list() - for(var/reagent in chems_needed) - var/datum/reagent/temp = GLOB.chemical_reagents_list[reagent] - if(temp) - var/chemname = temp.name - chems += chemname - return english_list(chems, and_text = require_all_chems ? " and " : " or ") - -//Replaces visible_message during operations so only people looking over the surgeon can see them. -/datum/surgery_step/proc/display_results(mob/user, mob/living/target, self_message, detailed_message, vague_message, target_detailed = FALSE) - user.visible_message(detailed_message, self_message, vision_distance = 1, ignored_mobs = target_detailed ? null : target) - if(!target_detailed) - var/you_feel = pick("a brief pain", "your body tense up", "an unnerving sensation") - target.show_message(vague_message, MSG_VISUAL, span_notice("You feel [you_feel] as you are operated on.")) -/** - * Sends a pain message to the target, including a chance of screaming. - * - * Arguments: - * * target - Who the message will be sent to - * * pain_message - The message to be displayed - * * mechanical_surgery - Boolean flag that represents if a surgery step is done on a mechanical limb (therefore does not force scream) - */ -/datum/surgery_step/proc/display_pain(mob/living/target, pain_message, mechanical_surgery = FALSE) - if(target.stat < UNCONSCIOUS) - to_chat(target, span_userdanger(pain_message)) - if(prob(30) && !mechanical_surgery) - target.emote("scream") diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 1be6c8e690c3..4e8b25ac2ed5 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -72,7 +72,7 @@ custom_materials = list(/datum/material/iron = 4000, /datum/material/glass = 2000, /datum/material/plasma = 2000, /datum/material/uranium = 3000, /datum/material/titanium = 3000) hitsound = 'sound/items/welder.ogg' toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_color = COLOR_SOFT_RED @@ -154,7 +154,7 @@ force = 10 throwforce = 5 - throw_speed = 3 + throw_speed = 1.5 throw_range = 5 stamina_damage = 5 stamina_cost = 5 @@ -197,7 +197,6 @@ force = 15 w_class = WEIGHT_CLASS_NORMAL throwforce = 9 - throw_speed = 2 throw_range = 5 stamina_damage = 5 stamina_cost = 5 @@ -219,50 +218,6 @@ w_class = WEIGHT_CLASS_SMALL toolspeed = 0.5 - -/obj/item/surgical_drapes - name = "surgical drapes" - desc = "Nanotrasen brand surgical drapes provide optimal safety and infection control." - icon = 'icons/obj/surgery.dmi' - icon_state = "surgical_drapes" - lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' - inhand_icon_state = "drapes" - w_class = WEIGHT_CLASS_TINY - attack_verb_continuous = list("slaps") - attack_verb_simple = list("slap") - -/obj/item/surgical_drapes/Initialize(mapload) - . = ..() - AddComponent(/datum/component/surgery_initiator) - - -/obj/item/surgical_processor //allows medical cyborgs to scan and initiate advanced surgeries - name = "\improper Surgical Processor" - desc = "A device for scanning and initiating surgeries from a disk or operating computer." - icon = 'icons/obj/device.dmi' - icon_state = "spectrometer" - item_flags = NOBLUDGEON - var/list/advanced_surgeries = list() - -/obj/item/surgical_processor/afterattack(obj/item/design_holder, mob/user, proximity) - . = ..() - if(!proximity) - return - if(istype(design_holder, /obj/item/disk/surgery)) - to_chat(user, span_notice("You load the surgery protocol from [design_holder] into [src].")) - var/obj/item/disk/surgery/surgery_disk = design_holder - if(do_after(user, design_holder, 10)) - advanced_surgeries |= surgery_disk.surgeries - return TRUE - if(istype(design_holder, /obj/machinery/computer/operating)) - to_chat(user, span_notice("You copy surgery protocols from [design_holder] into [src].")) - var/obj/machinery/computer/operating/OC = design_holder - if(do_after(user, design_holder, 10)) - advanced_surgeries |= OC.advanced_surgeries - return TRUE - return - /obj/item/scalpel/advanced name = "laser scalpel" desc = "An advanced scalpel which uses laser technology to cut." @@ -272,7 +227,7 @@ hitsound = 'sound/weapons/blade1.ogg' force = 16 toolspeed = 0.7 - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = 1 light_color = LIGHT_COLOR_GREEN sharpness = SHARP_EDGED @@ -358,7 +313,6 @@ force = 12 w_class = WEIGHT_CLASS_NORMAL throwforce = 6 - throw_speed = 2 throw_range = 5 custom_materials = list(/datum/material/iron=8000, /datum/material/titanium=6000) attack_verb_continuous = list("shears", "snips") @@ -391,7 +345,7 @@ candidate_name = tail_snip_candidate.name else - limb_snip_candidate = patient.get_bodypart(check_zone(user.zone_selected)) + limb_snip_candidate = patient.get_bodypart(deprecise_zone(user.zone_selected)) if(!limb_snip_candidate) to_chat(user, span_warning("[patient] is already missing that limb, what more do you want?")) return @@ -494,3 +448,12 @@ var/chem_name = params["reagent"] var/chem_id = get_chem_id(chem_name) whitelist -= chem_id + +/obj/item/fixovein + name = "vascular recoupler" + desc = "Derived from a Vey-Med design, this miniature 3D printer is used to quickly synthetize and thread new organic tissue during surgical procedures." + icon = 'icons/obj/surgery.dmi' + icon_state = "fixovein" + force = 0 + throwforce = 1.0 + w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/tables/table_flipping.dm b/code/modules/tables/table_flipping.dm new file mode 100644 index 000000000000..b4b1e126aad8 --- /dev/null +++ b/code/modules/tables/table_flipping.dm @@ -0,0 +1,129 @@ +/obj/structure/table/verb/verbflip() + set name = "Flip table" + set desc = "Flips a non-reinforced table" + set category = "Object" + set src in oview(1) + + if(!usr.canUseTopic(src, USE_CLOSE|USE_NEED_HANDS)) + return + + flip(usr, get_cardinal_dir(usr, src)) + +/obj/structure/table/proc/verbunflip() + set name = "Flip table upright" + set desc = "Fixes the position of a table" + set category = "Object" + set src in oview(1) + + if(!usr.canUseTopic(src, USE_CLOSE|USE_NEED_HANDS)) + return + + unflip(usr) + +/obj/structure/table/proc/flip(user, direction, skip_delay) + if(flipped == -1) + to_chat(user, span_warning("[src] won't budge.")) + return FALSE + if(flipped == TRUE) + return FALSE + if(!straight_table_check(turn(direction,90)) || !straight_table_check(turn(direction,-90)) ) + return FALSE + + if(!skip_delay && !do_after(user, src, 1 SECOND, DO_PUBLIC)) + return FALSE + + + var/turf/T = get_turf(src) + var/list/targets = list( + get_step(src,direction), + get_step(src,turn(direction, 45)), + get_step(src,turn(direction, -45)), + ) + list_clear_nulls(targets) + for(var/atom/movable/AM as anything in T) + if(AM == src) + continue + if(isliving(AM)) + AM.throw_at(get_edge_target_turf(T, direction), 7, 5) //Trolling + else + AM.throw_at(pick(targets), 1, 1) + + flipped = TRUE + setDir(direction) + + flags_1 |= ON_BORDER_1 + for(var/D in list(turn(direction, 90), turn(direction, -90))) + var/obj/structure/table/neighbor = locate() in get_step(src, D) + if(!neighbor) + continue + if(!neighbor.flipped && neighbor.buildstack == buildstack) + neighbor.flip(user, direction, TRUE) + + smoothing_flags = null + verbs -= /obj/structure/table/verb/verbflip + verbs += /obj/structure/table/proc/verbunflip + + update_icon() + +/obj/structure/table/proc/unflip(user, skip_delay) + if(!flipped) + return FALSE + if(!skip_delay && !do_after(user, src, 1 SECOND, DO_PUBLIC, extra_checks = CALLBACK(src, PROC_REF(unflipping_check), user))) + return FALSE + + + verbs += /obj/structure/table/verb/verbflip + verbs -= /obj/structure/table/proc/verbunflip + + flipped = 0 + flags_1 &= ~ON_BORDER_1 + setDir(0) + + for(var/D in list(turn(dir, 90), turn(dir, -90))) + var/obj/structure/table/neighbor = locate() in get_step(src.loc,D) + if(neighbor && neighbor.flipped == 1 && neighbor.dir == src.dir && neighbor.buildstack == buildstack) + neighbor.unflip(user, TRUE) + + smoothing_flags = initial(smoothing_flags) + update_icon() + + return TRUE + +/obj/structure/table/proc/straight_table_check(direction) + var/obj/structure/table/T + + for(var/angle in list(-90,90)) + + T = locate() in get_step(src.loc,turn(direction,angle)) + + if(T && T.flipped == 0 && T.buildstack == buildstack) + return FALSE + + T = locate() in get_step(src.loc,direction) + if (!T || T.flipped == 1 || T.buildstack != buildstack) + return TRUE + + return T.straight_table_check(direction) + +/obj/structure/table/proc/unflipping_check(user, direction, silent) + var/turf/turfloc = get_turf(src) + var/obj/occupied = turfloc.contains_dense_objects() + if(occupied) + if(!silent) + to_chat(user, span_warning("There's \a [occupied] in the way.")) + return FALSE + + var/list/L = list() + if(direction) + L.Add(direction) + else + L.Add(turn(src.dir,-90)) + L.Add(turn(src.dir,90)) + + for(var/new_dir in L) + var/obj/structure/table/T = locate() in get_step(src.loc,new_dir) + if(T && T.buildstack == T.buildstack) + if(T.flipped == 1 && T.dir == src.dir && !T.unflipping_check(user, new_dir, TRUE)) + return FALSE + + return TRUE diff --git a/code/game/objects/structures/table_frames.dm b/code/modules/tables/table_frames.dm similarity index 99% rename from code/game/objects/structures/table_frames.dm rename to code/modules/tables/table_frames.dm index 1dbb4ad2f0d7..b74061507906 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/modules/tables/table_frames.dm @@ -13,7 +13,7 @@ name = "table frame" desc = "Four metal legs with four framing rods for a table. You could easily pass through this." icon = 'icons/obj/structures.dmi' - icon_state = "nu_table_frame" + icon_state = "table_frame" density = FALSE anchored = FALSE layer = PROJECTILE_HIT_THRESHHOLD_LAYER @@ -21,7 +21,6 @@ var/framestack = /obj/item/stack/rods var/framestackamount = 2 - /obj/structure/table_frame/wrench_act(mob/living/user, obj/item/I) to_chat(user, span_notice("You start disassembling [src]...")) I.play_tool_sound(src) diff --git a/code/modules/tables/tables_racks.dm b/code/modules/tables/tables_racks.dm new file mode 100644 index 000000000000..d72baca92078 --- /dev/null +++ b/code/modules/tables/tables_racks.dm @@ -0,0 +1,1067 @@ +/* Tables and Racks + * Contains: + * Tables + * Glass Tables + * Wooden Tables + * Reinforced Tables + * Racks + * Rack Parts + */ + +/* + * Tables + */ + +/obj/structure/table + name = "table" + desc = "A square piece of iron standing on four metal legs. It can not move." + icon = 'icons/obj/smooth_structures/table.dmi' + icon_state = "table-0" + base_icon_state = "table" + density = TRUE + anchored = TRUE + pass_flags_self = PASSTABLE | LETPASSTHROW + layer = TABLE_LAYER + custom_materials = list(/datum/material/iron = 2000) + max_integrity = 100 + integrity_failure = 0.33 + smoothing_flags = SMOOTH_BITMASK + smoothing_groups = SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_TABLES + flags_1 = BUMP_PRIORITY_1 + mouse_drop_pointer = TRUE + + /// A url-encoded list defining the bounds that objects can be placed on. Just a visual enhancement + var/placable_bounds = "x1=6&y1=11&x2=27&y2=27" + + var/frame = /obj/structure/table_frame + var/framestack = /obj/item/stack/rods + var/buildstack = /obj/item/stack/sheet/iron + var/busy = FALSE + var/buildstackamount = 1 + var/framestackamount = 2 + var/deconstruction_ready = 1 + /// Are we flipped over? -1 is unflippable + var/flipped = FALSE + +/obj/structure/table/Initialize(mapload, _buildstack) + . = ..() + if(_buildstack) + buildstack = _buildstack + + AddElement(/datum/element/footstep_override, priority = STEP_SOUND_TABLE_PRIORITY) + AddElement(/datum/element/climbable) + + var/static/list/loc_connections = list( + COMSIG_CARBON_DISARM_COLLIDE = PROC_REF(table_carbon), + COMSIG_ATOM_ENTERED = PROC_REF(on_crossed), + COMSIG_ATOM_EXIT = PROC_REF(check_exit), + COMSIG_ATOM_EXITED = PROC_REF(on_uncrossed), + ) + + AddElement(/datum/element/connect_loc, loc_connections) + + if (!(flags_1 & NODECONSTRUCT_1)) + var/static/list/tool_behaviors = list( + TOOL_SCREWDRIVER = list( + SCREENTIP_CONTEXT_RMB = "Disassemble", + ), + + TOOL_WRENCH = list( + SCREENTIP_CONTEXT_RMB = "Deconstruct", + ), + ) + + AddElement(/datum/element/contextual_screentip_tools, tool_behaviors) + register_context() + +/obj/structure/table/examine(mob/user) + . = ..() + . += deconstruction_hints(user) + +/obj/structure/table/proc/deconstruction_hints(mob/user) + return span_notice("The top is screwed on, but the main bolts are also visible.") + +/obj/structure/table/update_icon(updates=ALL) + . = ..() + + if(flipped == TRUE) + icon = 'icons/obj/flipped_tables.dmi' + icon_state = base_icon_state + else + icon = initial(icon) + + if((updates & UPDATE_SMOOTHING)) + QUEUE_SMOOTH(src) + QUEUE_SMOOTH_NEIGHBORS(src) + + +/obj/structure/table/narsie_act() + var/atom/A = loc + qdel(src) + new /obj/structure/table/wood(A) + +/obj/structure/table/attack_paw(mob/user, list/modifiers) + return attack_hand(user, modifiers) + +/obj/structure/table/attack_tk(mob/user) + return + +/obj/structure/table/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) + . = ..() + var/mob/living/L = usr + if(!istype(L)) + return + if(!L.combat_mode) + return + if(!can_interact(L)) + return + if(!over.Adjacent(src)) + return + + if(flipped) + if(get_turf(over) == loc) + unflip(L) + return + else + flip(L, get_cardinal_dir(src, over)) + return + +/obj/structure/table/MouseDroppedOn(atom/dropping, mob/living/user, list/params) + . = ..() + if(ishuman(dropping)) + if(dropping != user) + try_place_pulled_onto_table(user, dropping) + return + var/mob/living/carbon/human/H = user + if(H.incapacitated() || H.body_position == LYING_DOWN || !H.combat_mode) + return + if(!H.Adjacent(src)) + return FALSE + if(!H.Enter(get_turf(src), TRUE)) + return + + H.apply_damage(5, BRUTE, BODY_ZONE_HEAD) + H.apply_pain(80, BODY_ZONE_HEAD, "Your head screams with pain!") + H.Paralyze(1 SECOND) + playsound(H, 'sound/items/trayhit1.ogg', 50, 1) + H.visible_message( + span_danger("[H] bangs [H.p_their()] head on [src]."), + span_danger("You bang your head on [src]."), + span_hear("You hear a metallic clang.") + + ) + return + + if(isitem(dropping)) + if(!LAZYACCESS(params, ICON_X) || !LAZYACCESS(params, ICON_Y)) + return + + var/obj/item/I = dropping + if(!user.can_equip(I, ITEM_SLOT_HANDS, TRUE, TRUE)) + return + + if(!(I.loc == loc)) + return + + var/list/center = I.get_icon_center() + var/half_icon_width = world.icon_size / 2 + + var/x_offset = center["x"] - half_icon_width + var/y_offset = center["y"] - half_icon_width + + var/x_diff = (text2num(params[ICON_X]) - half_icon_width) + var/y_diff = (text2num(params[ICON_Y]) - half_icon_width) + + var/list/bounds = get_placable_bounds() + var/new_x = clamp(pixel_x + x_diff, bounds["x1"] - half_icon_width, bounds["x2"] - half_icon_width) + var/new_y = clamp(pixel_y + y_diff, bounds["y1"] - half_icon_width, bounds["y2"] - half_icon_width) + + for(var/atom/movable/AM as anything in I.get_associated_mimics() + I) + animate(AM, pixel_x = new_x + x_offset, time = 0.5 SECONDS, flags = ANIMATION_PARALLEL) + animate(pixel_y = new_y + y_offset, time = 0.5 SECONDS, flags = ANIMATION_PARALLEL) + return + +/obj/structure/table/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(.) + return + if(isprojectile(mover)) + return check_cover(mover, get_turf(mover)) + + if(mover.throwing) + return TRUE + + var/obj/structure/table/T = locate() in get_turf(mover) + if(T && T.flipped != TRUE) + return TRUE + var/obj/structure/low_wall/L = locate() in get_turf(mover) + if(L) + return TRUE + + if(flipped == TRUE && !(border_dir & dir)) + return TRUE + +/obj/structure/table/CanAStarPass(to_dir, datum/can_pass_info/pass_info) + if(!density) + return TRUE + + if((pass_info.pass_flags & PASSTABLE) || (flipped == TRUE && (dir != to_dir))) + return TRUE + + return FALSE + +/obj/structure/table/proc/check_exit(datum/source, atom/movable/leaving, direction) + SIGNAL_HANDLER + if(!density) + return + + if(isprojectile(leaving) && !check_cover(leaving, get_turf(leaving))) + leaving.Bump(src) + return COMPONENT_ATOM_BLOCK_EXIT + + if(flipped == TRUE && (direction & dir)) + return COMPONENT_ATOM_BLOCK_EXIT + +//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops. +/obj/structure/table/proc/check_cover(obj/projectile/P, turf/from) + var/turf/cover + if(flipped == TRUE) + cover = get_turf(src) + else + cover = get_step(loc, get_dir(from, loc)) + if(!cover) + return TRUE + if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close + return TRUE + + var/chance = 0 + if(ismob(P.original) && get_turf(P.original) == cover) + var/mob/living/L = P.original + if (L.body_position == LYING_DOWN) + chance += 40 //Lying down lets you catch less bullets + + if(flipped == TRUE) + if(get_dir(loc, from) == dir || get_dir(loc, from) == turn(dir, 180)) //Flipped tables catch more bullets + chance += 30 + + if(prob(chance)) + return FALSE //blocked + return TRUE + +/obj/structure/table/proc/on_crossed(atom/movable/crossed_by, oldloc, list/old_locs) + SIGNAL_HANDLER + if(!isliving(crossed_by)) + return + + if(!istype(src, /obj/structure/table/optable)) + if(!HAS_TRAIT(crossed_by, TRAIT_TABLE_RISEN)) + ADD_TRAIT(crossed_by, TRAIT_TABLE_RISEN, TRAIT_GENERIC) + +/obj/structure/table/proc/on_uncrossed(datum/source, atom/movable/gone, direction) + SIGNAL_HANDLER + if(!isliving(gone)) + return + + if(!istype(src, /obj/structure/table/optable)) + if(HAS_TRAIT(gone, TRAIT_TABLE_RISEN)) + REMOVE_TRAIT(gone, TRAIT_TABLE_RISEN, TRAIT_GENERIC) + +/obj/structure/table/setDir(ndir) + . = ..() + if(dir != NORTH && dir != 0 && (flipped > 0)) + layer = ABOVE_MOB_LAYER + else + layer = TABLE_LAYER + +/obj/structure/table/attack_grab(mob/living/user, atom/movable/victim, obj/item/hand_item/grab/grab, list/params) + try_place_pulled_onto_table(user, victim, grab) + return TRUE + +/obj/structure/table/proc/try_place_pulled_onto_table(mob/living/user, atom/movable/target, obj/item/hand_item/grab/grab) + if(!Adjacent(user)) + return + + if(isliving(target)) + var/mob/living/pushed_mob = target + if(pushed_mob.buckled) + to_chat(user, span_warning("[pushed_mob] is buckled to [pushed_mob.buckled]!")) + return + + if(user.combat_mode && grab) + switch(grab.current_grab.damage_stage) + if(GRAB_PASSIVE) + to_chat(user, span_warning("You need a better grip to do that!")) + return + + if(GRAB_NECK, GRAB_KILL) + tablepush(user, pushed_mob) + else + if(grab.target_zone == BODY_ZONE_HEAD) + tablelimbsmash(user, pushed_mob) + else + pushed_mob.visible_message(span_notice("[user] begins to place [pushed_mob] onto [src]..."), \ + span_userdanger("[user] begins to place [pushed_mob] onto [src]...")) + if(do_after(user, pushed_mob, 3.5 SECONDS, DO_PUBLIC)) + tableplace(user, pushed_mob) + else + return + user.release_grabs(pushed_mob) + + else if(target.pass_flags & PASSTABLE) + grab.move_victim_towards(src) + if (target.loc == loc) + user.visible_message(span_notice("[user] places [target] onto [src]."), + span_notice("You place [target] onto [src].")) + + user.release_grabs(target) + +/obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) + pushed_mob.forceMove(loc) + pushed_mob.set_resting(TRUE, TRUE) + pushed_mob.visible_message(span_notice("[user] places [pushed_mob] onto [src]."), \ + span_notice("[user] places [pushed_mob] onto [src].")) + log_combat(user, pushed_mob, "places", null, "onto [src]") + +/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, span_danger("Throwing [pushed_mob] onto the table might hurt them!")) + return + var/added_passtable = FALSE + if(!(pushed_mob.pass_flags & PASSTABLE)) + added_passtable = TRUE + pushed_mob.pass_flags |= PASSTABLE + for (var/obj/obj in user.loc.contents) + if(!obj.CanAllowThrough(pushed_mob)) + return + pushed_mob.Move(src.loc) + if(added_passtable) + pushed_mob.pass_flags &= ~PASSTABLE + if(pushed_mob.loc != loc) //Something prevented the tabling + return + pushed_mob.Knockdown(30) + pushed_mob.apply_damage(10, BRUTE) + pushed_mob.stamina.adjust(-40) + if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + deconstruct(FALSE) + playsound(pushed_mob, 'sound/effects/tableslam.ogg', 90, TRUE) + pushed_mob.visible_message(span_danger("[user] slams [pushed_mob] onto \the [src]!"), \ + span_userdanger("[user] slams you onto \the [src]!")) + log_combat(user, pushed_mob, "tabled", null, "onto [src]") + +/obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) + var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(BODY_ZONE_HEAD) + if(!banged_limb) + return + + var/blocked = pushed_mob.run_armor_check(BODY_ZONE_HEAD, BLUNT) + pushed_mob.apply_damage(30, BRUTE, BODY_ZONE_HEAD, blocked) + if (prob(30 * ((100-blocked)/100))) + pushed_mob.Knockdown(10 SECONDS) + + pushed_mob.stamina.adjust(-60) + take_damage(50) + if(user.mind?.martial_art.smashes_tables && user.mind?.martial_art.can_use(user)) + deconstruct(FALSE) + + playsound(pushed_mob, 'sound/items/trayhit1.ogg', 70, TRUE) + pushed_mob.visible_message( + span_danger("[user] smashes [pushed_mob]'s [banged_limb.plaintext_zone] against \the [src]!"), + ) + log_combat(user, pushed_mob, "head slammed", null, "against [src]") + +/obj/structure/table/screwdriver_act_secondary(mob/living/user, obj/item/tool) + if(flags_1 & NODECONSTRUCT_1 || !deconstruction_ready) + return FALSE + to_chat(user, span_notice("You start disassembling [src]...")) + if(tool.use_tool(src, user, 2 SECONDS, volume=50)) + deconstruct(TRUE) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/structure/table/wrench_act_secondary(mob/living/user, obj/item/tool) + if(flags_1 & NODECONSTRUCT_1 || !deconstruction_ready) + return FALSE + to_chat(user, span_notice("You start deconstructing [src]...")) + if(tool.use_tool(src, user, 4 SECONDS, volume=50)) + playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE, 1) + return TOOL_ACT_TOOLTYPE_SUCCESS + +/obj/structure/table/attackby(obj/item/I, mob/living/user, params) + var/list/modifiers = params2list(params) + if(flipped == TRUE) + return ..() + + if(istype(I, /obj/item/storage/bag/tray)) + var/obj/item/storage/bag/tray/T = I + if(T.contents.len > 0) // If the tray isn't empty + for(var/x in T.contents) + var/obj/item/item = x + AfterPutItemOnTable(item, user) + I.atom_storage.remove_all(drop_location()) + user.visible_message(span_notice("[user] empties [I] on [src].")) + return + // If the tray IS empty, continue on (tray will be placed on the table like other items) + + if(istype(I, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = I + if(dealer_deck.wielded) // deal a card facedown on the table + var/obj/item/toy/singlecard/card = dealer_deck.draw(user) + if(card) + attackby(card, user, params) + return + + 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 + if(user.combat_mode) + user.unbuckle_mob(carried_mob) + tablelimbsmash(user, carried_mob) + else + 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(span_notice("[user] begins to[skills_space] place [carried_mob] onto [src]..."), + span_userdanger("[user] begins to[skills_space] place [carried_mob] onto [src]...")) + if(do_after(user, carried_mob, tableplace_delay, DO_PUBLIC)) + user.unbuckle_mob(carried_mob) + tableplace(user, carried_mob) + return TRUE + + if(!user.combat_mode && !(I.item_flags & ABSTRACT)) + if(user.transferItemToLoc(I, drop_location(), silent = FALSE)) + //Center the icon where the user clicked. + if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) + return + + var/list/center = I.get_icon_center() + var/half_icon_width = world.icon_size / 2 + + var/x_offset = center["x"] - half_icon_width + var/y_offset = center["y"] - half_icon_width + + var/x_diff = (text2num(modifiers[ICON_X]) - half_icon_width) + var/y_diff = (text2num(modifiers[ICON_Y]) - half_icon_width) + + var/list/bounds = get_placable_bounds() + var/new_x = clamp(pixel_x + x_diff, bounds["x1"] - half_icon_width, bounds["x2"] - half_icon_width) + var/new_y = clamp(pixel_y + y_diff, bounds["y1"] - half_icon_width, bounds["y2"] - half_icon_width) + + I.pixel_x = new_x + x_offset + I.pixel_y = new_y + y_offset + AfterPutItemOnTable(I, user) + return TRUE + + return ..() + +/obj/structure/table/attackby_secondary(obj/item/weapon, mob/user, params) + if(istype(weapon, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = weapon + if(dealer_deck.wielded) // deal a card faceup on the table + var/obj/item/toy/singlecard/card = dealer_deck.draw(user) + if(card) + card.Flip() + attackby(card, user, params) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + ..() + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/obj/structure/table/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(istype(held_item, /obj/item/toy/cards/deck)) + var/obj/item/toy/cards/deck/dealer_deck = held_item + if(dealer_deck.wielded) + context[SCREENTIP_CONTEXT_LMB] = "Deal card" + context[SCREENTIP_CONTEXT_RMB] = "Deal card faceup" + return CONTEXTUAL_SCREENTIP_SET + return NONE + +/obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) + return + +/obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) + if(!(flags_1 & NODECONSTRUCT_1)) + var/turf/T = get_turf(src) + if(buildstack) + new buildstack(T, buildstackamount) + else + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(T, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + if(!wrench_disassembly) + new frame(T) + else + new framestack(T, framestackamount) + qdel(src) + +/obj/structure/table/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + switch(the_rcd.mode) + if(RCD_DECONSTRUCT) + return list("mode" = RCD_DECONSTRUCT, "delay" = 24, "cost" = 16) + return FALSE + +/obj/structure/table/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + switch(passed_mode) + if(RCD_DECONSTRUCT) + to_chat(user, span_notice("You deconstruct the table.")) + qdel(src) + return TRUE + return FALSE + +/obj/structure/table/proc/table_carbon(datum/source, mob/living/carbon/shover, mob/living/carbon/target, shove_blocked) + SIGNAL_HANDLER + if(!shove_blocked) + return + target.Knockdown(SHOVE_KNOCKDOWN_TABLE) + target.visible_message(span_danger("[shover.name] shoves [target.name] onto \the [src]!"), + span_userdanger("You're shoved onto \the [src] by [shover.name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) + to_chat(shover, span_danger("You shove [target.name] onto \the [src]!")) + target.throw_at(src, 1, 1, null, FALSE) //1 speed throws with no spin are basically just forcemoves with a hard collision check + log_combat(src, target, "shoved", "onto [src] (table)") + return COMSIG_CARBON_SHOVE_HANDLED + +/// Returns a list of placable bounds, see placable_bounds +/obj/structure/table/proc/get_placable_bounds() + var/list/bounds = params2list(placable_bounds) + for(var/key in bounds) + bounds[key] = text2num(bounds[key]) + return bounds + +/obj/structure/table/greyscale + icon = 'icons/obj/smooth_structures/table_greyscale.dmi' + icon_state = "table_greyscale-0" + base_icon_state = "table_greyscale" + material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + buildstack = null //No buildstack, so generate from mat datums + +///Table on wheels +/obj/structure/table/rolling + name = "Rolling table" + desc = "An NT brand \"Rolly poly\" rolling table. It can and will move." + anchored = FALSE + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null + icon = 'icons/obj/smooth_structures/rollingtable.dmi' + icon_state = "rollingtable" + var/list/attached_items = list() + +/obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) + . = ..() + attached_items += I + RegisterSignal(I, COMSIG_MOVABLE_MOVED, PROC_REF(RemoveItemFromTable)) //Listen for the pickup event, unregister on pick-up so we aren't moved + +/obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) + SIGNAL_HANDLER + + if(newloc != loc) //Did we not move with the table? because that shit's ok + return FALSE + attached_items -= source + UnregisterSignal(source, COMSIG_MOVABLE_MOVED) + +/obj/structure/table/rolling/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) + . = ..() + if(!loc) + return + for(var/mob/living/living_mob in old_loc.contents)//Kidnap everyone on top + living_mob.forceMove(loc) + for(var/atom/movable/attached_movable as anything in attached_items) + if(!attached_movable.Move(loc)) + RemoveItemFromTable(attached_movable, attached_movable.loc) + +/* + * Glass tables + */ +/obj/structure/table/glass + name = "glass table" + desc = "What did I say about leaning on the glass tables? Now you need surgery." + icon = 'icons/obj/smooth_structures/glass_table.dmi' + icon_state = "glass_table-0" + base_icon_state = "glass_table" + custom_materials = list(/datum/material/glass = 2000) + buildstack = /obj/item/stack/sheet/glass + smoothing_groups = SMOOTH_GROUP_GLASS_TABLES + canSmoothWith = SMOOTH_GROUP_GLASS_TABLES + max_integrity = 70 + resistance_flags = ACID_PROOF + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 80, ACID = 100) + var/glass_shard_type = /obj/item/shard + +/obj/structure/table/glass/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(. || !flipped) + return + if(mover.pass_flags & PASSGLASS) + return TRUE + +/obj/structure/table/glass/check_exit(datum/source, atom/movable/leaving, direction) + . = ..() + if(. || !flipped) + return + if(leaving.pass_flags & PASSGLASS) + return COMPONENT_ATOM_BLOCK_EXIT + +/obj/structure/table/glass/on_crossed(atom/movable/crossed_by, oldloc) + . = ..() + if(flags_1 & NODECONSTRUCT_1) + return + if(!isliving(crossed_by)) + return + // Don't break if they're just flying past + if(crossed_by.throwing) + addtimer(CALLBACK(src, PROC_REF(throw_check), crossed_by), 5) + else + check_break(crossed_by) + +/obj/structure/table/glass/proc/throw_check(mob/living/M) + if(M.loc == get_turf(src)) + check_break(M) + +/obj/structure/table/glass/proc/check_break(mob/living/M) + if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING)) + table_shatter(M) + +/obj/structure/table/glass/proc/table_shatter(mob/living/victim) + visible_message(span_warning("[src] breaks!"), + span_danger("You hear breaking glass.")) + + playsound(loc, SFX_SHATTER, 50, TRUE) + + new frame(loc) + + var/obj/item/shard/shard = new glass_shard_type(loc) + shard.throw_impact(victim) + + victim.Paralyze(100) + qdel(src) + +/obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) + if(!(flags_1 & NODECONSTRUCT_1)) + if(disassembled) + ..() + return + else + var/turf/T = get_turf(src) + playsound(T, SFX_SHATTER, 50, TRUE) + new frame(loc) + var/obj/item/shard = new glass_shard_type(loc) + shard.color = color + qdel(src) + +/obj/structure/table/glass/narsie_act() + color = NARSIE_WINDOW_COLOUR + +/obj/structure/table/glass/plasmaglass + name = "plasma glass table" + desc = "Someone thought this was a good idea." + icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' + icon_state = "plasmaglass_table-0" + base_icon_state = "plasmaglass_table" + custom_materials = list(/datum/material/alloy/plasmaglass = 2000) + buildstack = /obj/item/stack/sheet/plasmaglass + max_integrity = 100 + glass_shard_type = /obj/item/shard/plasma + +/* + * Wooden tables + */ + +/obj/structure/table/wood + name = "wooden table" + desc = "Do not apply fire to this. Rumour says it burns easily." + icon = 'icons/obj/smooth_structures/wood_table.dmi' + icon_state = "wood_table-0" + base_icon_state = "wood_table" + frame = /obj/structure/table_frame/wood + framestack = /obj/item/stack/sheet/mineral/wood + buildstack = /obj/item/stack/sheet/mineral/wood + resistance_flags = FLAMMABLE + max_integrity = 70 + smoothing_groups = SMOOTH_GROUP_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_WOOD_TABLES + +/obj/structure/table/wood/narsie_act(total_override = TRUE) + if(!total_override) + ..() + +/obj/structure/table/wood/poker //No specialties, Just a mapping object. + name = "gambling table" + desc = "A seedy table for seedy dealings in seedy places." + icon = 'icons/obj/smooth_structures/poker_table.dmi' + icon_state = "poker_table-0" + base_icon_state = "poker_table" + buildstack = /obj/item/stack/tile/carpet + +/obj/structure/table/wood/poker/narsie_act() + ..(FALSE) + +/obj/structure/table/wood/fancy + name = "fancy table" + desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." + icon = 'icons/obj/structures.dmi' + icon_state = "fancy_table" + base_icon_state = "fancy_table" + frame = /obj/structure/table_frame + framestack = /obj/item/stack/rods + buildstack = /obj/item/stack/tile/carpet + smoothing_groups = SMOOTH_GROUP_FANCY_WOOD_TABLES //Don't smooth with SMOOTH_GROUP_TABLES or SMOOTH_GROUP_WOOD_TABLES + canSmoothWith = SMOOTH_GROUP_FANCY_WOOD_TABLES // see Initialize() + +/obj/structure/table/wood/fancy/black + icon_state = "fancy_table_black-0" + base_icon_state = "fancy_table_black" + buildstack = /obj/item/stack/tile/carpet/black + icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' + +/obj/structure/table/wood/fancy/blue + icon_state = "fancy_table_blue-0" + base_icon_state = "fancy_table_blue" + buildstack = /obj/item/stack/tile/carpet/blue + icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' + +/obj/structure/table/wood/fancy/cyan + icon_state = "fancy_table_cyan-0" + base_icon_state = "fancy_table_cyan" + buildstack = /obj/item/stack/tile/carpet/cyan + icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' + +/obj/structure/table/wood/fancy/green + icon_state = "fancy_table_green-0" + base_icon_state = "fancy_table_green" + buildstack = /obj/item/stack/tile/carpet/green + icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' + +/obj/structure/table/wood/fancy/orange + icon_state = "fancy_table_orange-0" + base_icon_state = "fancy_table_orange" + buildstack = /obj/item/stack/tile/carpet/orange + icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' + +/obj/structure/table/wood/fancy/purple + icon_state = "fancy_table_purple-0" + base_icon_state = "fancy_table_purple" + buildstack = /obj/item/stack/tile/carpet/purple + icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' + +/obj/structure/table/wood/fancy/red + icon_state = "fancy_table_red-0" + base_icon_state = "fancy_table_red" + buildstack = /obj/item/stack/tile/carpet/red + icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' + +/obj/structure/table/wood/fancy/royalblack + icon_state = "fancy_table_royalblack-0" + base_icon_state = "fancy_table_royalblack" + buildstack = /obj/item/stack/tile/carpet/royalblack + icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' + +/obj/structure/table/wood/fancy/royalblue + icon_state = "fancy_table_royalblue-0" + base_icon_state = "fancy_table_royalblue" + buildstack = /obj/item/stack/tile/carpet/royalblue + icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' + +/* + * Reinforced tables + */ +/obj/structure/table/reinforced + name = "reinforced table" + desc = "A reinforced version of the four legged table." + icon = 'icons/obj/smooth_structures/reinforced_table.dmi' + icon_state = "reinforced_table-0" + base_icon_state = "reinforced_table" + deconstruction_ready = 0 + buildstack = /obj/item/stack/sheet/plasteel + max_integrity = 200 + integrity_failure = 0.25 + armor = list(BLUNT = 10, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, FIRE = 80, ACID = 70) + flipped = -1 + +/obj/structure/table/reinforced/deconstruction_hints(mob/user) + if(deconstruction_ready) + return span_notice("The top cover has been welded loose and the main frame's bolts are exposed.") + else + return span_notice("The top cover is firmly welded on.") + +/obj/structure/table/reinforced/attackby_secondary(obj/item/weapon, mob/user, params) + if(weapon.tool_behaviour == TOOL_WELDER) + if(weapon.tool_start_check(user, amount = 0)) + if(deconstruction_ready) + to_chat(user, span_notice("You start strengthening the reinforced table...")) + if (weapon.use_tool(src, user, 50, volume = 50)) + to_chat(user, span_notice("You strengthen the table.")) + deconstruction_ready = FALSE + else + to_chat(user, span_notice("You start weakening the reinforced table...")) + if (weapon.use_tool(src, user, 50, volume = 50)) + to_chat(user, span_notice("You weaken the table.")) + deconstruction_ready = TRUE + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + else + . = ..() + +/obj/structure/table/bronze + name = "bronze table" + desc = "A solid table made out of bronze." + icon = 'icons/obj/smooth_structures/brass_table.dmi' + icon_state = "brass_table-0" + base_icon_state = "brass_table" + resistance_flags = FIRE_PROOF | ACID_PROOF + buildstack = /obj/item/stack/sheet/bronze + smoothing_groups = SMOOTH_GROUP_BRONZE_TABLES //Don't smooth with SMOOTH_GROUP_TABLES + canSmoothWith = SMOOTH_GROUP_BRONZE_TABLES + +/obj/structure/table/bronze/tablepush(mob/living/user, mob/living/pushed_mob) + ..() + playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) + +/obj/structure/table/reinforced/rglass + name = "reinforced glass table" + desc = "A reinforced version of the glass table." + icon = 'icons/obj/smooth_structures/rglass_table.dmi' + icon_state = "rglass_table-0" + base_icon_state = "rglass_table" + custom_materials = list(/datum/material/glass = 2000, /datum/material/iron = 2000) + buildstack = /obj/item/stack/sheet/rglass + max_integrity = 150 + +/obj/structure/table/reinforced/plasmarglass + name = "reinforced plasma glass table" + desc = "A reinforced version of the plasma glass table." + icon = 'icons/obj/smooth_structures/rplasmaglass_table.dmi' + icon_state = "rplasmaglass_table-0" + base_icon_state = "rplasmaglass_table" + custom_materials = list(/datum/material/alloy/plasmaglass = 2000, /datum/material/iron = 2000) + buildstack = /obj/item/stack/sheet/plasmarglass + +/obj/structure/table/reinforced/titaniumglass + name = "titanium glass table" + desc = "A titanium reinforced glass table, with a fresh coat of NT white paint." + icon = 'icons/obj/smooth_structures/titaniumglass_table.dmi' + icon_state = "titaniumglass_table-o" + base_icon_state = "titaniumglass_table" + custom_materials = list(/datum/material/alloy/titaniumglass = 2000) + buildstack = /obj/item/stack/sheet/titaniumglass + max_integrity = 250 + +/obj/structure/table/reinforced/plastitaniumglass + name = "plastitanium glass table" + desc = "A table made of titanium reinforced silica-plasma composite. About as durable as it sounds." + icon = 'icons/obj/smooth_structures/plastitaniumglass_table.dmi' + icon_state = "plastitaniumglass_table-0" + base_icon_state = "plastitaniumglass_table" + custom_materials = list(/datum/material/alloy/plastitaniumglass = 2000) + buildstack = /obj/item/stack/sheet/plastitaniumglass + max_integrity = 300 + +/* + * Surgery Tables + */ + +/obj/structure/table/optable + name = "operating table" + desc = "Used for advanced medical procedures." + icon = 'icons/obj/surgery.dmi' + base_icon_state = "optable" + icon_state = "optable" + buildstack = /obj/item/stack/sheet/mineral/silver + smoothing_flags = NONE + smoothing_groups = null + canSmoothWith = null + can_buckle = 1 + buckle_lying = NO_BUCKLE_LYING + buckle_requires_restraints = TRUE + custom_materials = list(/datum/material/silver = 2000) + flipped = -1 + + var/obj/machinery/vitals_monitor/connected_monitor + var/mob/living/carbon/human/patient = null + +/obj/structure/table/optable/Destroy() + if(patient) + set_patient(null) + if(connected_monitor) + connected_monitor.set_optable(null) + connected_monitor = null + return ..() + +/obj/structure/table/optable/MouseDroppedOn(atom/dropping, mob/living/user) + if(!iscarbon(dropping)) + return ..() + + if(dropping.loc == loc) + set_patient(dropping) + else + return ..() + +/obj/structure/table/optable/on_uncrossed(datum/source, atom/movable/gone, direction) + . = ..() + if(gone == patient) + set_patient(null) + +/obj/structure/table/optable/tableplace(mob/living/user, mob/living/pushed_mob) + . = ..() + pushed_mob.set_resting(TRUE, TRUE) + get_patient() + +/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) + . = ..() + pushed_mob.set_resting(TRUE, TRUE) + get_patient() + +/obj/structure/table/optable/proc/get_patient() + var/mob/living/carbon/M = locate(/mob/living/carbon) in loc + if(M) + if(M.body_position == LYING_DOWN) + set_patient(M) + else + set_patient(null) + +/obj/structure/table/optable/proc/set_patient(new_patient) + if(patient) + REMOVE_TRAIT(patient, TRAIT_CANNOTFACE, OPTABLE_TRAIT) + UnregisterSignal(patient, COMSIG_PARENT_QDELETING) + patient = new_patient + if(patient) + ADD_TRAIT(patient, TRAIT_CANNOTFACE, OPTABLE_TRAIT) + patient.set_lying_angle(90) + patient.setDir(SOUTH) + RegisterSignal(patient, COMSIG_PARENT_QDELETING, PROC_REF(patient_deleted)) + + if(connected_monitor) + connected_monitor.update_appearance(UPDATE_OVERLAYS) + +/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)) + return TRUE + return FALSE + +/* + * Racks + */ +/obj/structure/rack + name = "rack" + desc = "Different from the Middle Ages version." + icon = 'icons/obj/objects.dmi' + icon_state = "rack" + layer = TABLE_LAYER + density = TRUE + anchored = TRUE + pass_flags_self = LETPASSTHROW //You can throw objects over this, despite it's density. + max_integrity = 20 + +/obj/structure/rack/examine(mob/user) + . = ..() + . += span_notice("It's held together by a couple of bolts.") + +/obj/structure/rack/CanAllowThrough(atom/movable/mover, border_dir) + . = ..() + if(.) + return + if(istype(mover) && (mover.pass_flags & PASSTABLE)) + return TRUE + +/obj/structure/rack/MouseDroppedOn(obj/O, mob/user) + . = ..() + if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) + return + if(!user.dropItemToGround(O)) + return + if(O.loc != src.loc) + step(O, get_dir(O, src)) + +/obj/structure/rack/attackby(obj/item/W, mob/living/user, params) + var/list/modifiers = params2list(params) + if (W.tool_behaviour == TOOL_WRENCH && !(flags_1&NODECONSTRUCT_1) && LAZYACCESS(modifiers, RIGHT_CLICK)) + W.play_tool_sound(src) + deconstruct(TRUE) + return + if(user.combat_mode) + return ..() + if(user.transferItemToLoc(W, drop_location())) + return 1 + +/obj/structure/rack/attack_paw(mob/living/user, list/modifiers) + attack_hand(user, modifiers) + +/obj/structure/rack/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(.) + return + if(user.body_position == LYING_DOWN || user.usable_legs < 2) + return + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src, ATTACK_EFFECT_KICK) + user.visible_message(span_danger("[user] kicks [src]."), null, null, COMBAT_MESSAGE_RANGE) + take_damage(rand(4,8), BRUTE, BLUNT, 1) + +/obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) + switch(damage_type) + if(BRUTE) + if(damage_amount) + playsound(loc, 'sound/items/dodgeball.ogg', 80, TRUE) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, TRUE) + if(BURN) + playsound(loc, 'sound/items/welder.ogg', 40, TRUE) + +/* + * Rack destruction + */ + +/obj/structure/rack/deconstruct(disassembled = TRUE) + if(!(flags_1&NODECONSTRUCT_1)) + set_density(FALSE) + var/obj/item/rack_parts/newparts = new(loc) + transfer_fingerprints_to(newparts) + qdel(src) + + +/* + * Rack Parts + */ + +/obj/item/rack_parts + name = "rack parts" + desc = "Parts of a rack." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "rack_parts" + flags_1 = CONDUCT_1 + custom_materials = list(/datum/material/iron=2000) + var/building = FALSE + +/obj/item/rack_parts/attackby(obj/item/W, mob/user, params) + if (W.tool_behaviour == TOOL_WRENCH) + new /obj/item/stack/sheet/iron(user.loc) + qdel(src) + else + . = ..() + +/obj/item/rack_parts/attack_self(mob/user) + if(building) + return + building = TRUE + to_chat(user, span_notice("You start constructing a rack...")) + if(do_after(user, user, 50, DO_PUBLIC, progress=TRUE, display = src)) + if(!user.temporarilyRemoveItemFromInventory(src)) + return + var/obj/structure/rack/R = new /obj/structure/rack(user.loc) + user.visible_message("[user] assembles \a [R].\ + ", span_notice("You assemble \a [R].")) + R.add_fingerprint(user) + qdel(src) + building = FALSE diff --git a/code/modules/tgs/LICENSE b/code/modules/tgs/LICENSE index 221f9e1deb21..324c48e993e1 100644 --- a/code/modules/tgs/LICENSE +++ b/code/modules/tgs/LICENSE @@ -1,6 +1,6 @@ The MIT License -Copyright (c) 2017 Jordan Brown +Copyright (c) 2017-2024 Jordan Brown Permission is hereby granted, free of charge, to any person obtaining a copy of this software and diff --git a/code/modules/tgs/README.md b/code/modules/tgs/README.md index 6319028d8106..35ca73d7e9a8 100644 --- a/code/modules/tgs/README.md +++ b/code/modules/tgs/README.md @@ -1,6 +1,6 @@ # DMAPI Internals -This folder should be placed on it's own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. +This folder should be placed on its own inside a codebase that wishes to use the TGS DMAPI. Warranty void if modified. - [includes.dm](./includes.dm) is the file that should be included by DM code, it handles including the rest. - The [core](./core) folder includes all code not directly part of any API version. diff --git a/code/modules/tgs/core/README.md b/code/modules/tgs/core/README.md index b82d8f49e297..965e21b549a3 100644 --- a/code/modules/tgs/core/README.md +++ b/code/modules/tgs/core/README.md @@ -3,7 +3,7 @@ This folder contains all DMAPI code not directly involved in an API. - [_definitions.dm](./definitions.dm) contains defines needed across DMAPI internals. +- [byond_world_export.dm](./byond_world_export.dm) contains the default `/datum/tgs_http_handler` implementation which uses `world.Export()`. - [core.dm](./core.dm) contains the implementations of the `/world/proc/TgsXXX()` procs. Many map directly to the `/datum/tgs_api` functions. It also contains the /datum selection and setup code. - [datum.dm](./datum.dm) contains the `/datum/tgs_api` declarations that all APIs must implement. - [tgs_version.dm](./tgs_version.dm) contains the `/datum/tgs_version` definition -- diff --git a/code/modules/tgs/core/_definitions.dm b/code/modules/tgs/core/_definitions.dm index ebf6d17c2a07..fd98034eb716 100644 --- a/code/modules/tgs/core/_definitions.dm +++ b/code/modules/tgs/core/_definitions.dm @@ -1,2 +1,10 @@ +#if DM_VERSION < 510 +#error The TGS DMAPI does not support BYOND versions < 510! +#endif + #define TGS_UNIMPLEMENTED "___unimplemented" #define TGS_VERSION_PARAMETER "server_service_version" + +#ifndef TGS_DEBUG_LOG +#define TGS_DEBUG_LOG(message) +#endif diff --git a/code/modules/tgs/core/byond_world_export.dm b/code/modules/tgs/core/byond_world_export.dm new file mode 100644 index 000000000000..6ef8d841b8f7 --- /dev/null +++ b/code/modules/tgs/core/byond_world_export.dm @@ -0,0 +1,22 @@ +/datum/tgs_http_handler/byond_world_export + +/datum/tgs_http_handler/byond_world_export/PerformGet(url) + // This is an infinite sleep until we get a response + var/export_response = world.Export(url) + TGS_DEBUG_LOG("byond_world_export: Export complete") + + if(!export_response) + TGS_ERROR_LOG("byond_world_export: Failed request: [url]") + return new /datum/tgs_http_result(null, FALSE) + + var/content = export_response["CONTENT"] + if(!content) + TGS_ERROR_LOG("byond_world_export: Failed request, missing content!") + return new /datum/tgs_http_result(null, FALSE) + + var/response_json = TGS_FILE2TEXT_NATIVE(content) + if(!response_json) + TGS_ERROR_LOG("byond_world_export: Failed request, failed to load content!") + return new /datum/tgs_http_result(null, FALSE) + + return new /datum/tgs_http_result(response_json, TRUE) diff --git a/code/modules/tgs/core/core.dm b/code/modules/tgs/core/core.dm index 41a047339452..63cb5a2c3514 100644 --- a/code/modules/tgs/core/core.dm +++ b/code/modules/tgs/core/core.dm @@ -1,4 +1,4 @@ -/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE) +/world/TgsNew(datum/tgs_event_handler/event_handler, minimum_required_security_level = TGS_SECURITY_ULTRASAFE, datum/tgs_http_handler/http_handler = null) var/current_api = TGS_READ_GLOBAL(tgs) if(current_api) TGS_ERROR_LOG("API datum already set (\ref[current_api] ([current_api]))! Was TgsNew() called more than once?") @@ -42,11 +42,11 @@ 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.") + TGS_ERROR_LOG("Detected unknown Interop API version! Defaulting to latest. Update the DMAPI to fix this problem.") api_datum = /datum/tgs_api/latest if(!api_datum) - TGS_ERROR_LOG("Found unsupported API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") + TGS_ERROR_LOG("Found unsupported Interop API version: [raw_parameter]. If this is a valid version please report this, backporting is done on demand.") return TGS_INFO_LOG("Activating API for version [version.deprefixed_parameter]") @@ -55,7 +55,10 @@ TGS_ERROR_LOG("Invalid parameter for event_handler: [event_handler]") event_handler = null - var/datum/tgs_api/new_api = new api_datum(event_handler, version) + if(!http_handler) + http_handler = new /datum/tgs_http_handler/byond_world_export + + var/datum/tgs_api/new_api = new api_datum(event_handler, version, http_handler) TGS_WRITE_GLOBAL(tgs, new_api) @@ -107,6 +110,13 @@ if(api) return api.ApiVersion() +/world/TgsEngine() +#ifdef OPENDREAM + return TGS_ENGINE_TYPE_OPENDREAM +#else + return TGS_ENGINE_TYPE_BYOND +#endif + /world/TgsInstanceName() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) @@ -153,4 +163,17 @@ /world/TgsSecurityLevel() var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) if(api) - api.SecurityLevel() + return api.SecurityLevel() + +/world/TgsVisibility() + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + return api.Visibility() + +/world/TgsTriggerEvent(event_name, list/parameters, wait_for_completion = FALSE) + var/datum/tgs_api/api = TGS_READ_GLOBAL(tgs) + if(api) + if(!istype(parameters, /list)) + parameters = list() + + return api.TriggerEvent(event_name, parameters, wait_for_completion) diff --git a/code/modules/tgs/core/datum.dm b/code/modules/tgs/core/datum.dm index 68b0330fe860..3ca53e9bf7c6 100644 --- a/code/modules/tgs/core/datum.dm +++ b/code/modules/tgs/core/datum.dm @@ -6,11 +6,20 @@ TGS_DEFINE_AND_SET_GLOBAL(tgs, null) var/list/warned_deprecated_command_runs -/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version) - . = ..() +/datum/tgs_api/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler) + ..() src.event_handler = event_handler src.version = version +/datum/tgs_api/proc/TerminateWorld() + while(TRUE) + TGS_DEBUG_LOG("About to terminate world. Tick: [world.time], sleep_offline: [world.sleep_offline]") + world.sleep_offline = FALSE // https://www.byond.com/forum/post/2894866 + del(world) + world.sleep_offline = FALSE // just in case, this is BYOND after all... + sleep(world.tick_lag) + TGS_DEBUG_LOG("BYOND DIDN'T TERMINATE THE WORLD!!! TICK IS: [world.time], sleep_offline: [world.sleep_offline]") + /datum/tgs_api/latest parent_type = /datum/tgs_api/v5 @@ -57,3 +66,9 @@ TGS_PROTECT_DATUM(/datum/tgs_api) /datum/tgs_api/proc/SecurityLevel() return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/Visibility() + return TGS_UNIMPLEMENTED + +/datum/tgs_api/proc/TriggerEvent(event_name, list/parameters, wait_for_completion) + return FALSE diff --git a/code/modules/tgs/core/tgs_version.dm b/code/modules/tgs/core/tgs_version.dm index a5dae1241a30..bc561e67487a 100644 --- a/code/modules/tgs/core/tgs_version.dm +++ b/code/modules/tgs/core/tgs_version.dm @@ -1,4 +1,5 @@ /datum/tgs_version/New(raw_parameter) + ..() src.raw_parameter = raw_parameter deprefixed_parameter = replacetext(raw_parameter, "/tg/station 13 Server v", "") var/list/version_bits = splittext(deprefixed_parameter, ".") diff --git a/code/modules/tgs/includes.dm b/code/modules/tgs/includes.dm index 23b714f9d064..f5118ed55a3c 100644 --- a/code/modules/tgs/includes.dm +++ b/code/modules/tgs/includes.dm @@ -1,4 +1,5 @@ #include "core\_definitions.dm" +#include "core\byond_world_export.dm" #include "core\core.dm" #include "core\datum.dm" #include "core\tgs_version.dm" diff --git a/code/modules/tgs/v3210/commands.dm b/code/modules/tgs/v3210/commands.dm index d9bd287465b9..e65c816320dc 100644 --- a/code/modules/tgs/v3210/commands.dm +++ b/code/modules/tgs/v3210/commands.dm @@ -47,7 +47,7 @@ user.friendly_name = sender // Discord hack, fix the mention if it's only numbers (fuck you IRC trolls) - var/regex/discord_id_regex = regex(@"^[0-9]+$") + var/regex/discord_id_regex = regex("^\[0-9\]+$") if(findtext(sender, discord_id_regex)) sender = "<@[sender]>" @@ -55,4 +55,4 @@ var/datum/tgs_message_content/result = stc.Run(user, params) result = UpgradeDeprecatedCommandResponse(result, command) - return result?.text || TRUE + return result ? result.text : TRUE diff --git a/code/modules/tgs/v4/api.dm b/code/modules/tgs/v4/api.dm index b9a75c4abb48..7c87922750b9 100644 --- a/code/modules/tgs/v4/api.dm +++ b/code/modules/tgs/v4/api.dm @@ -73,7 +73,7 @@ if(cached_json["apiValidateOnly"]) TGS_INFO_LOG("Validating API and exiting...") Export(TGS4_COMM_VALIDATE, list(TGS4_PARAMETER_DATA = "[minimum_required_security_level]")) - del(world) + TerminateWorld() security_level = cached_json["securityLevel"] chat_channels_json_path = cached_json["chatChannelsJson"] @@ -181,14 +181,14 @@ var/json = json_encode(data) while(requesting_new_port && !override_requesting_new_port) - sleep(1) + sleep(world.tick_lag) //we need some port open at this point to facilitate return communication if(!world.port) requesting_new_port = TRUE if(!world.OpenPort(0)) //open any port TGS_ERROR_LOG("Unable to open random port to retrieve new port![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() //request a new port export_lock = FALSE @@ -196,20 +196,20 @@ if(!new_port_json) TGS_ERROR_LOG("No new port response from server![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() var/new_port = new_port_json[TGS4_PARAMETER_DATA] if(!isnum(new_port) || new_port <= 0) TGS_ERROR_LOG("Malformed new port json ([json_encode(new_port_json)])![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() if(new_port != world.port && !world.OpenPort(new_port)) TGS_ERROR_LOG("Unable to open port [new_port]![TGS4_PORT_CRITFAIL_MESSAGE]") - del(world) + TerminateWorld() requesting_new_port = FALSE while(export_lock) - sleep(1) + sleep(world.tick_lag) export_lock = TRUE last_interop_response = null @@ -217,7 +217,7 @@ text2file(json, server_commands_json_path) for(var/I = 0; I < EXPORT_TIMEOUT_DS && !last_interop_response; ++I) - sleep(1) + sleep(world.tick_lag) if(!last_interop_response) TGS_ERROR_LOG("Failed to get export result for: [json]") diff --git a/code/modules/tgs/v4/commands.dm b/code/modules/tgs/v4/commands.dm index d6d3d718d471..25dd6740e3af 100644 --- a/code/modules/tgs/v4/commands.dm +++ b/code/modules/tgs/v4/commands.dm @@ -40,5 +40,5 @@ var/datum/tgs_message_content/result = sc.Run(u, params) result = UpgradeDeprecatedCommandResponse(result, command) - return result?.text + return result ? result.text : TRUE return "Unknown command: [command]!" diff --git a/code/modules/tgs/v5/__interop_version.dm b/code/modules/tgs/v5/__interop_version.dm index 5d3d491a7362..f4806f7adb97 100644 --- a/code/modules/tgs/v5/__interop_version.dm +++ b/code/modules/tgs/v5/__interop_version.dm @@ -1 +1 @@ -"5.6.1" +"5.9.0" diff --git a/code/modules/tgs/v5/_defines.dm b/code/modules/tgs/v5/_defines.dm index a3f949081f16..92c7a8388a71 100644 --- a/code/modules/tgs/v5/_defines.dm +++ b/code/modules/tgs/v5/_defines.dm @@ -5,19 +5,20 @@ #define DMAPI5_TOPIC_DATA "tgs_data" #define DMAPI5_BRIDGE_REQUEST_LIMIT 8198 -#define DMAPI5_TOPIC_REQUEST_LIMIT 65529 -#define DMAPI5_TOPIC_RESPONSE_LIMIT 65528 +#define DMAPI5_TOPIC_REQUEST_LIMIT 65528 +#define DMAPI5_TOPIC_RESPONSE_LIMIT 65529 -#define DMAPI5_BRIDGE_COMMAND_PORT_UPDATE 0 #define DMAPI5_BRIDGE_COMMAND_STARTUP 1 #define DMAPI5_BRIDGE_COMMAND_PRIME 2 #define DMAPI5_BRIDGE_COMMAND_REBOOT 3 #define DMAPI5_BRIDGE_COMMAND_KILL 4 #define DMAPI5_BRIDGE_COMMAND_CHAT_SEND 5 #define DMAPI5_BRIDGE_COMMAND_CHUNK 6 +#define DMAPI5_BRIDGE_COMMAND_EVENT 7 #define DMAPI5_PARAMETER_ACCESS_IDENTIFIER "accessIdentifier" #define DMAPI5_PARAMETER_CUSTOM_COMMANDS "customCommands" +#define DMAPI5_PARAMETER_TOPIC_PORT "topicPort" #define DMAPI5_CHUNK "chunk" #define DMAPI5_CHUNK_PAYLOAD "payload" @@ -34,6 +35,7 @@ #define DMAPI5_BRIDGE_PARAMETER_VERSION "version" #define DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE "chatMessage" #define DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL "minimumSecurityLevel" +#define DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION "eventInvocation" #define DMAPI5_BRIDGE_RESPONSE_NEW_PORT "newPort" #define DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION "runtimeInformation" @@ -48,6 +50,7 @@ #define DMAPI5_RUNTIME_INFORMATION_REVISION "revision" #define DMAPI5_RUNTIME_INFORMATION_TEST_MERGES "testMerges" #define DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL "securityLevel" +#define DMAPI5_RUNTIME_INFORMATION_VISIBILITY "visibility" #define DMAPI5_CHAT_UPDATE_CHANNELS "channels" @@ -75,10 +78,12 @@ #define DMAPI5_TOPIC_COMMAND_INSTANCE_RENAMED 4 #define DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE 5 #define DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE 6 -#define DMAPI5_TOPIC_COMMAND_HEARTBEAT 7 +#define DMAPI5_TOPIC_COMMAND_HEALTHCHECK 7 #define DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH 8 #define DMAPI5_TOPIC_COMMAND_SEND_CHUNK 9 #define DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK 10 +#define DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST 11 +#define DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT 12 #define DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE "commandType" #define DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND "chatCommand" @@ -88,6 +93,7 @@ #define DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME "newInstanceName" #define DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE "chatUpdate" #define DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION "newServerVersion" +#define DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE "broadcastMessage" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE "commandResponse" #define DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE "commandResponseMessage" @@ -113,3 +119,9 @@ #define DMAPI5_CUSTOM_CHAT_COMMAND_NAME "name" #define DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT "helpText" #define DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY "adminOnly" + +#define DMAPI5_EVENT_ID "eventId" + +#define DMAPI5_EVENT_INVOCATION_NAME "eventName" +#define DMAPI5_EVENT_INVOCATION_PARAMETERS "parameters" +#define DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION "notifyCompletion" diff --git a/code/modules/tgs/v5/api.dm b/code/modules/tgs/v5/api.dm index 926ea10a8f27..3e328fc7c27d 100644 --- a/code/modules/tgs/v5/api.dm +++ b/code/modules/tgs/v5/api.dm @@ -4,11 +4,16 @@ var/instance_name var/security_level + var/visibility var/reboot_mode = TGS_REBOOT_MODE_NORMAL + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call var/list/intercepted_message_queue + /// List of chat messages list()s that attempted to be sent during a topic call. To be bundled in the result of the call + var/list/offline_message_queue + var/list/custom_commands var/list/test_merges @@ -16,24 +21,43 @@ var/list/chat_channels var/initialized = FALSE + var/initial_bridge_request_received = FALSE + var/datum/tgs_version/interop_version var/chunked_requests = 0 var/list/chunked_topics = list() + var/list/pending_events = list() + var/detached = FALSE + var/datum/tgs_http_handler/http_handler + +/datum/tgs_api/v5/New(datum/tgs_event_handler/event_handler, datum/tgs_version/version, datum/tgs_http_handler/http_handler) + . = ..() + interop_version = version + src.http_handler = http_handler + TGS_DEBUG_LOG("V5 API created: [json_encode(args)]") + /datum/tgs_api/v5/ApiVersion() return new /datum/tgs_version( #include "__interop_version.dm" ) /datum/tgs_api/v5/OnWorldNew(minimum_required_security_level) + TGS_DEBUG_LOG("OnWorldNew()") server_port = world.params[DMAPI5_PARAM_SERVER_PORT] access_identifier = world.params[DMAPI5_PARAM_ACCESS_IDENTIFIER] var/datum/tgs_version/api_version = ApiVersion() - version = null - var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands())) + version = null // we want this to be the TGS version, not the interop version + + // sleep once to prevent an issue where world.Export on the first tick can hang indefinitely + TGS_DEBUG_LOG("Starting Export bug prevention sleep tick. time:[world.time] sleep_offline:[world.sleep_offline]") + sleep(world.tick_lag) + TGS_DEBUG_LOG("Export bug prevention sleep complete") + + var/list/bridge_response = Bridge(DMAPI5_BRIDGE_COMMAND_STARTUP, list(DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL = minimum_required_security_level, DMAPI5_BRIDGE_PARAMETER_VERSION = api_version.raw_parameter, DMAPI5_PARAMETER_CUSTOM_COMMANDS = ListCustomCommands(), DMAPI5_PARAMETER_TOPIC_PORT = GetTopicPort())) if(!istype(bridge_response)) TGS_ERROR_LOG("Failed initial bridge request!") return FALSE @@ -45,10 +69,12 @@ if(runtime_information[DMAPI5_RUNTIME_INFORMATION_API_VALIDATE_ONLY]) TGS_INFO_LOG("DMAPI validation, exiting...") - del(world) + TerminateWorld() - version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) + initial_bridge_request_received = TRUE + version = new /datum/tgs_version(runtime_information[DMAPI5_RUNTIME_INFORMATION_SERVER_VERSION]) // reassigning this because it can change if TGS updates security_level = runtime_information[DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL] + visibility = runtime_information[DMAPI5_RUNTIME_INFORMATION_VISIBILITY] instance_name = runtime_information[DMAPI5_RUNTIME_INFORMATION_INSTANCE_NAME] var/list/revisionData = runtime_information[DMAPI5_RUNTIME_INFORMATION_REVISION] @@ -95,18 +121,36 @@ initialized = TRUE return TRUE +/datum/tgs_api/v5/proc/GetTopicPort() +#if defined(OPENDREAM) && defined(OPENDREAM_TOPIC_PORT_EXISTS) + return "[world.opendream_topic_port]" +#else + return null +#endif + /datum/tgs_api/v5/proc/RequireInitialBridgeResponse() - while(!version) - sleep(1) + TGS_DEBUG_LOG("RequireInitialBridgeResponse()") + var/logged = FALSE + while(!initial_bridge_request_received) + if(!logged) + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Starting sleep") + logged = TRUE + + sleep(world.tick_lag) + + TGS_DEBUG_LOG("RequireInitialBridgeResponse: Passed") /datum/tgs_api/v5/OnInitializationComplete() Bridge(DMAPI5_BRIDGE_COMMAND_PRIME) /datum/tgs_api/v5/OnTopic(T) + TGS_DEBUG_LOG("OnTopic()") RequireInitialBridgeResponse() + TGS_DEBUG_LOG("OnTopic passed bridge request gate") var/list/params = params2list(T) var/json = params[DMAPI5_TOPIC_DATA] if(!json) + TGS_DEBUG_LOG("No \"[DMAPI5_TOPIC_DATA]\" entry found, ignoring...") return FALSE // continue to /world/Topic if(!initialized) @@ -156,7 +200,7 @@ TGS_WARNING_LOG("Received legacy string when a [/datum/tgs_message_content] was expected. Please audit all calls to TgsChatBroadcast, TgsChatTargetedBroadcast, and TgsChatPrivateMessage to ensure they use the new /datum.") return new /datum/tgs_message_content(message) -/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message, list/channels) +/datum/tgs_api/v5/ChatBroadcast(datum/tgs_message_content/message2, list/channels) if(!length(channels)) channels = ChatChannelInfo() @@ -165,52 +209,93 @@ var/datum/tgs_chat_channel/channel = I ids += channel.id - message = UpgradeDeprecatedChatMessage(message) - - if (!length(channels)) - return - - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = ids - if(intercepted_message_queue) - intercepted_message_queue += list(message) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + SendChatMessageRaw(message2, ids) -/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message, admin_only) +/datum/tgs_api/v5/ChatTargetedBroadcast(datum/tgs_message_content/message2, admin_only) var/list/channels = list() for(var/I in ChatChannelInfo()) var/datum/tgs_chat_channel/channel = I if (!channel.is_private_channel && ((channel.is_admin_channel && admin_only) || (!channel.is_admin_channel && !admin_only))) channels += channel.id - message = UpgradeDeprecatedChatMessage(message) + SendChatMessageRaw(message2, channels) - if (!length(channels)) +/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message2, datum/tgs_chat_user/user) + SendChatMessageRaw(message2, list(user.channel.id)) + +/datum/tgs_api/v5/proc/SendChatMessageRaw(datum/tgs_message_content/message2, list/channel_ids) + message2 = UpgradeDeprecatedChatMessage(message2) + + if (!length(channel_ids)) return - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channels + var/list/data = message2._interop_serialize() + data[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = channel_ids if(intercepted_message_queue) - intercepted_message_queue += list(message) - else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + intercepted_message_queue += list(data) + return -/datum/tgs_api/v5/ChatPrivateMessage(datum/tgs_message_content/message, datum/tgs_chat_user/user) - message = UpgradeDeprecatedChatMessage(message) - message = message._interop_serialize() - message[DMAPI5_CHAT_MESSAGE_CHANNEL_IDS] = list(user.channel.id) - if(intercepted_message_queue) - intercepted_message_queue += list(message) + if(offline_message_queue) + offline_message_queue += list(data) + return + + if(detached) + offline_message_queue = list(data) + + WaitForReattach(FALSE) + + data = offline_message_queue + offline_message_queue = null + + for(var/queued_message in data) + SendChatDataRaw(queued_message) else - Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = message)) + SendChatDataRaw(data) + +/datum/tgs_api/v5/proc/SendChatDataRaw(list/data) + Bridge(DMAPI5_BRIDGE_COMMAND_CHAT_SEND, list(DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE = data)) /datum/tgs_api/v5/ChatChannelInfo() RequireInitialBridgeResponse() WaitForReattach(TRUE) return chat_channels.Copy() +/datum/tgs_api/v5/TriggerEvent(event_name, list/parameters, wait_for_completion) + RequireInitialBridgeResponse() + WaitForReattach(TRUE) + + if(interop_version.minor < 9) + TGS_WARNING_LOG("Interop version too low for custom events!") + return FALSE + + var/str_parameters = list() + for(var/i in parameters) + str_parameters += "[i]" + + var/list/response = Bridge(DMAPI5_BRIDGE_COMMAND_EVENT, list(DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION = list(DMAPI5_EVENT_INVOCATION_NAME = event_name, DMAPI5_EVENT_INVOCATION_PARAMETERS = str_parameters, DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION = wait_for_completion))) + if(!response) + return FALSE + + var/event_id = response[DMAPI5_EVENT_ID] + if(!event_id) + return FALSE + + TGS_DEBUG_LOG("Created event ID: [event_id]") + if(!wait_for_completion) + return TRUE + + TGS_DEBUG_LOG("Waiting for completion of event ID: [event_id]") + + while(!pending_events[event_id]) + sleep(world.tick_lag) + + TGS_DEBUG_LOG("Completed wait on event ID: [event_id]") + pending_events -= event_id + + return TRUE + /datum/tgs_api/v5/proc/DecodeChannels(chat_update_json) + TGS_DEBUG_LOG("DecodeChannels()") var/list/chat_channels_json = chat_update_json[DMAPI5_CHAT_UPDATE_CHANNELS] if(istype(chat_channels_json)) chat_channels.Cut() @@ -235,3 +320,7 @@ /datum/tgs_api/v5/SecurityLevel() RequireInitialBridgeResponse() return security_level + +/datum/tgs_api/v5/Visibility() + RequireInitialBridgeResponse() + return visibility diff --git a/code/modules/tgs/v5/bridge.dm b/code/modules/tgs/v5/bridge.dm index 37f58bcdf632..62201fcc9e58 100644 --- a/code/modules/tgs/v5/bridge.dm +++ b/code/modules/tgs/v5/bridge.dm @@ -48,7 +48,9 @@ var/json = CreateBridgeData(command, data, TRUE) var/encoded_json = url_encode(json) - var/url = "http://127.0.0.1:[server_port]/Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" + var/api_prefix = interop_version.minor >= 8 ? "api/" : "" + + var/url = "http://127.0.0.1:[server_port]/[api_prefix]Bridge?[DMAPI5_BRIDGE_DATA]=[encoded_json]" return url /datum/tgs_api/v5/proc/CreateBridgeData(command, list/data, needs_auth) @@ -63,7 +65,7 @@ if(detached) // Wait up to one minute for(var/i in 1 to 600) - sleep(1) + sleep(world.tick_lag) if(!detached && (!require_channels || length(chat_channels))) break @@ -75,20 +77,25 @@ /datum/tgs_api/v5/proc/PerformBridgeRequest(bridge_request) WaitForReattach(FALSE) - // This is an infinite sleep until we get a response - var/export_response = world.Export(bridge_request) - if(!export_response) - TGS_ERROR_LOG("Failed bridge request: [bridge_request]") + TGS_DEBUG_LOG("Bridge request start") + var/datum/tgs_http_result/result = http_handler.PerformGet(bridge_request) + TGS_DEBUG_LOG("Bridge request complete") + + if(isnull(result)) + TGS_ERROR_LOG("Failed bridge request, handler returned null!") + return + + if(!istype(result) || result.type != /datum/tgs_http_result) + TGS_ERROR_LOG("Failed bridge request, handler returned non-[/datum/tgs_http_result]!") return - var/response_json = file2text(export_response["CONTENT"]) - if(!response_json) - TGS_ERROR_LOG("Failed bridge request, missing content!") + if(!result.success) + TGS_DEBUG_LOG("Failed bridge request, HTTP request failed!") return - var/list/bridge_response = json_decode(response_json) + var/list/bridge_response = json_decode(result.response_text) if(!bridge_response) - TGS_ERROR_LOG("Failed bridge request, bad json: [response_json]") + TGS_ERROR_LOG("Failed bridge request, bad json: [result.response_text]") return var/error = bridge_response[DMAPI5_RESPONSE_ERROR_MESSAGE] diff --git a/code/modules/tgs/v5/commands.dm b/code/modules/tgs/v5/commands.dm index a832c81f172d..9557f8a08ed5 100644 --- a/code/modules/tgs/v5/commands.dm +++ b/code/modules/tgs/v5/commands.dm @@ -35,10 +35,10 @@ if(sc) var/datum/tgs_message_content/response = sc.Run(u, params) response = UpgradeDeprecatedCommandResponse(response, command) - + var/list/topic_response = TopicResponse() - topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response?.text - topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response?._interop_serialize() + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE] = response ? response.text : null + topic_response[DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE] = response ? response._interop_serialize() : null return topic_response return TopicResponse("Unknown custom chat command: [command]!") diff --git a/code/modules/tgs/v5/serializers.dm b/code/modules/tgs/v5/serializers.dm index 7f9bc731b792..3a32848ad512 100644 --- a/code/modules/tgs/v5/serializers.dm +++ b/code/modules/tgs/v5/serializers.dm @@ -1,12 +1,12 @@ /datum/tgs_message_content/proc/_interop_serialize() - return list("text" = text, "embed" = embed?._interop_serialize()) + return list("text" = text, "embed" = embed ? embed._interop_serialize() : null) /datum/tgs_chat_embed/proc/_interop_serialize() CRASH("Base /proc/interop_serialize called on [type]!") /datum/tgs_chat_embed/structure/_interop_serialize() var/list/serialized_fields - if(islist(fields)) + if(istype(fields, /list)) serialized_fields = list() for(var/datum/tgs_chat_embed/field/field as anything in fields) serialized_fields += list(field._interop_serialize()) @@ -16,12 +16,12 @@ "url" = url, "timestamp" = timestamp, "colour" = colour, - "image" = image?._interop_serialize(), - "thumbnail" = thumbnail?._interop_serialize(), - "video" = video?._interop_serialize(), - "footer" = footer?._interop_serialize(), - "provider" = provider?._interop_serialize(), - "author" = author?._interop_serialize(), + "image" = src.image ? src.image._interop_serialize() : null, + "thumbnail" = thumbnail ? thumbnail._interop_serialize() : null, + "video" = video ? video._interop_serialize() : null, + "footer" = footer ? footer._interop_serialize() : null, + "provider" = provider ? provider._interop_serialize() : null, + "author" = author ? author._interop_serialize() : null, "fields" = serialized_fields ) @@ -43,7 +43,7 @@ . = ..() .["iconUrl"] = icon_url .["proxyIconUrl"] = proxy_icon_url - + /datum/tgs_chat_embed/footer/_interop_serialize() return list( "text" = text, diff --git a/code/modules/tgs/v5/topic.dm b/code/modules/tgs/v5/topic.dm index 3779db6237a3..e1f2cb638578 100644 --- a/code/modules/tgs/v5/topic.dm +++ b/code/modules/tgs/v5/topic.dm @@ -5,6 +5,7 @@ return response /datum/tgs_api/v5/proc/ProcessTopicJson(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessTopicJson(..., [check_access_identifier])") var/list/result = ProcessRawTopic(json, check_access_identifier) if(!result) result = TopicResponse("Runtime error!") @@ -25,16 +26,20 @@ return response_json /datum/tgs_api/v5/proc/ProcessRawTopic(json, check_access_identifier) + TGS_DEBUG_LOG("ProcessRawTopic(..., [check_access_identifier])") var/list/topic_parameters = json_decode(json) if(!topic_parameters) + TGS_DEBUG_LOG("ProcessRawTopic: json_decode failed") return TopicResponse("Invalid topic parameters json: [json]!"); var/their_sCK = topic_parameters[DMAPI5_PARAMETER_ACCESS_IDENTIFIER] if(check_access_identifier && their_sCK != access_identifier) - return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER]!") + TGS_DEBUG_LOG("ProcessRawTopic: access identifier check failed") + return TopicResponse("Failed to decode [DMAPI5_PARAMETER_ACCESS_IDENTIFIER] or it does not match!") var/command = topic_parameters[DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE] if(!isnum(command)) + TGS_DEBUG_LOG("ProcessRawTopic: command type check failed") return TopicResponse("Failed to decode [DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE]!") return ProcessTopicCommand(command, topic_parameters) @@ -43,6 +48,7 @@ return "response[payload_id]" /datum/tgs_api/v5/proc/ProcessTopicCommand(command, list/topic_parameters) + TGS_DEBUG_LOG("ProcessTopicCommand([command], ...)") switch(command) if(DMAPI5_TOPIC_COMMAND_CHAT_COMMAND) @@ -55,7 +61,6 @@ return result if(DMAPI5_TOPIC_COMMAND_EVENT_NOTIFICATION) - intercepted_message_queue = list() var/list/event_notification = topic_parameters[DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION] if(!istype(event_notification)) return TopicResponse("Invalid [DMAPI5_TOPIC_PARAMETER_EVENT_NOTIFICATION]!") @@ -66,28 +71,30 @@ var/list/event_parameters = event_notification[DMAPI5_EVENT_NOTIFICATION_PARAMETERS] if(event_parameters && !istype(event_parameters)) - return TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + . = TopicResponse("Invalid or missing [DMAPI5_EVENT_NOTIFICATION_PARAMETERS]!") + else + var/list/response = TopicResponse() + . = response + if(event_handler != null) + var/list/event_call = list(event_type) + if(event_parameters) + event_call += event_parameters + + intercepted_message_queue = list() + event_handler.HandleEvent(arglist(event_call)) + response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue + intercepted_message_queue = null - var/list/event_call = list(event_type) if (event_type == TGS_EVENT_WATCHDOG_DETACH) detached = TRUE chat_channels.Cut() // https://github.com/tgstation/tgstation-server/issues/1490 - if(event_parameters) - event_call += event_parameters - - if(event_handler != null) - event_handler.HandleEvent(arglist(event_call)) - - var/list/response = TopicResponse() - response[DMAPI5_TOPIC_RESPONSE_CHAT_RESPONSES] = intercepted_message_queue - intercepted_message_queue = null - return response + return if(DMAPI5_TOPIC_COMMAND_CHANGE_PORT) var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]") if(event_handler != null) event_handler.HandleEvent(TGS_EVENT_PORT_SWAP, new_port) @@ -122,8 +129,10 @@ return TopicResponse() if(DMAPI5_TOPIC_COMMAND_CHAT_CHANNELS_UPDATE) + TGS_DEBUG_LOG("ProcessTopicCommand: It's a chat update") var/list/chat_update_json = topic_parameters[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE] if(!istype(chat_update_json)) + TGS_DEBUG_LOG("ProcessTopicCommand: failed \"[DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]\" check") return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE]!") DecodeChannels(chat_update_json) @@ -132,12 +141,14 @@ if(DMAPI5_TOPIC_COMMAND_SERVER_PORT_UPDATE) var/new_port = topic_parameters[DMAPI5_TOPIC_PARAMETER_NEW_PORT] if (!isnum(new_port) || !(new_port > 0)) - return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]") + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_PORT]") server_port = new_port return TopicResponse() - if(DMAPI5_TOPIC_COMMAND_HEARTBEAT) + if(DMAPI5_TOPIC_COMMAND_HEALTHCHECK) + if(event_handler && event_handler.receive_health_checks) + event_handler.HandleEvent(TGS_EVENT_HEALTH_CHECK) return TopicResponse() if(DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH) @@ -146,7 +157,7 @@ var/error_message = null if (new_port != null) if (!isnum(new_port) || !(new_port > 0)) - error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]]" + error_message = "Invalid [DMAPI5_TOPIC_PARAMETER_NEW_PORT]" else server_port = new_port @@ -154,7 +165,7 @@ if (!istext(new_version_string)) if(error_message != null) error_message += ", " - error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]]" + error_message += "Invalid or missing [DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION]" else var/datum/tgs_version/new_version = new(new_version_string) if (event_handler) @@ -164,6 +175,11 @@ var/list/reattach_response = TopicResponse(error_message) reattach_response[DMAPI5_PARAMETER_CUSTOM_COMMANDS] = ListCustomCommands() + reattach_response[DMAPI5_PARAMETER_TOPIC_PORT] = GetTopicPort() + + for(var/eventId in pending_events) + pending_events[eventId] = TRUE + return reattach_response if(DMAPI5_TOPIC_COMMAND_SEND_CHUNK) @@ -256,4 +272,25 @@ return chunk_to_send + if(DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST) + var/message = topic_parameters[DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE] + if (!istext(message)) + return TopicResponse("Invalid or missing [DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE]") + + TGS_WORLD_ANNOUNCE(message) + return TopicResponse() + + if(DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT) + var/event_id = topic_parameters[DMAPI5_EVENT_ID] + if (!istext(event_id)) + return TopicResponse("Invalid or missing [DMAPI5_EVENT_ID]") + + TGS_DEBUG_LOG("Completing event ID [event_id]...") + pending_events[event_id] = TRUE + return TopicResponse() + return TopicResponse("Unknown command: [command]") + +/datum/tgs_api/v5/proc/WorldBroadcast(message) + set waitfor = FALSE + TGS_WORLD_ANNOUNCE(message) diff --git a/code/modules/tgs/v5/undefs.dm b/code/modules/tgs/v5/undefs.dm index e3455b69d1c6..237207fdfd05 100644 --- a/code/modules/tgs/v5/undefs.dm +++ b/code/modules/tgs/v5/undefs.dm @@ -8,16 +8,17 @@ #undef DMAPI5_TOPIC_REQUEST_LIMIT #undef DMAPI5_TOPIC_RESPONSE_LIMIT -#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_BRIDGE_COMMAND_CHUNK +#undef DMAPI5_BRIDGE_COMMAND_EVENT #undef DMAPI5_PARAMETER_ACCESS_IDENTIFIER #undef DMAPI5_PARAMETER_CUSTOM_COMMANDS +#undef DMAPI5_PARAMETER_TOPIC_PORT #undef DMAPI5_CHUNK #undef DMAPI5_CHUNK_PAYLOAD @@ -34,6 +35,7 @@ #undef DMAPI5_BRIDGE_PARAMETER_VERSION #undef DMAPI5_BRIDGE_PARAMETER_CHAT_MESSAGE #undef DMAPI5_BRIDGE_PARAMETER_MINIMUM_SECURITY_LEVEL +#undef DMAPI5_BRIDGE_PARAMETER_EVENT_INVOCATION #undef DMAPI5_BRIDGE_RESPONSE_NEW_PORT #undef DMAPI5_BRIDGE_RESPONSE_RUNTIME_INFORMATION @@ -48,6 +50,7 @@ #undef DMAPI5_RUNTIME_INFORMATION_REVISION #undef DMAPI5_RUNTIME_INFORMATION_TEST_MERGES #undef DMAPI5_RUNTIME_INFORMATION_SECURITY_LEVEL +#undef DMAPI5_RUNTIME_INFORMATION_VISIBILITY #undef DMAPI5_CHAT_UPDATE_CHANNELS @@ -75,8 +78,12 @@ #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_HEALTHCHECK #undef DMAPI5_TOPIC_COMMAND_WATCHDOG_REATTACH +#undef DMAPI5_TOPIC_COMMAND_SEND_CHUNK +#undef DMAPI5_TOPIC_COMMAND_RECEIVE_CHUNK +#undef DMAPI5_TOPIC_COMMAND_RECEIVE_BROADCAST +#undef DMAPI5_TOPIC_COMMAND_COMPLETE_EVENT #undef DMAPI5_TOPIC_PARAMETER_COMMAND_TYPE #undef DMAPI5_TOPIC_PARAMETER_CHAT_COMMAND @@ -86,6 +93,7 @@ #undef DMAPI5_TOPIC_PARAMETER_NEW_INSTANCE_NAME #undef DMAPI5_TOPIC_PARAMETER_CHAT_UPDATE #undef DMAPI5_TOPIC_PARAMETER_NEW_SERVER_VERSION +#undef DMAPI5_TOPIC_PARAMETER_BROADCAST_MESSAGE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE #undef DMAPI5_TOPIC_RESPONSE_COMMAND_RESPONSE_MESSAGE @@ -111,3 +119,9 @@ #undef DMAPI5_CUSTOM_CHAT_COMMAND_NAME #undef DMAPI5_CUSTOM_CHAT_COMMAND_HELP_TEXT #undef DMAPI5_CUSTOM_CHAT_COMMAND_ADMIN_ONLY + +#undef DMAPI5_EVENT_ID + +#undef DMAPI5_EVENT_INVOCATION_NAME +#undef DMAPI5_EVENT_INVOCATION_PARAMETERS +#undef DMAPI5_EVENT_INVOCATION_NOTIFY_COMPLETION diff --git a/code/modules/tgs_daedalus/tgs_http_rustg.dm b/code/modules/tgs_daedalus/tgs_http_rustg.dm new file mode 100644 index 000000000000..3e1623d4ee05 --- /dev/null +++ b/code/modules/tgs_daedalus/tgs_http_rustg.dm @@ -0,0 +1,22 @@ +/datum/tgs_http_handler/rustg + +/datum/tgs_http_handler/rustg/PerformGet(url) + var/datum/http_request/request = new() + request.prepare(RUSTG_HTTP_METHOD_GET, url) + request.begin_async() + + TGS_DEBUG_LOG("http_rustg: Awaiting response.") + UNTIL(request.is_complete()) + TGS_DEBUG_LOG("http_rustg: Request complete!") + + var/datum/http_response/response = request.into_response() + if(response.errored || response.status_code != 200) + TGS_ERROR_LOG("http_rustg: Failed request: [url] | Code: [response.status_code] | Error: [response.error]") + return new /datum/tgs_http_result(null, FALSE) + + var/body = response.body + if(!body) + TGS_ERROR_LOG("http_rustg: Failed request, missing body!") + return new /datum/tgs_http_result(null, FALSE) + + return new /datum/tgs_http_result(body, TRUE) diff --git a/code/modules/tgui/external.dm b/code/modules/tgui/external.dm index 69888bd64176..424e33774448 100644 --- a/code/modules/tgui/external.dm +++ b/code/modules/tgui/external.dm @@ -62,6 +62,17 @@ if(ui) ui.send_full_update() +/** + * public + * + * Forces an update on static data. Should be done manually whenever something + * happens to change static data. Applies to all UIs tied to this object. + * + */ +/datum/proc/update_static_data_for_all() + for(var/datum/tgui/ui as anything in SStgui.open_uis_by_src[REF(src)]) + ui.send_full_update() + /** * public * diff --git a/code/modules/tgui/status_composers.dm b/code/modules/tgui/status_composers.dm index 453ca50daa8a..b5953b75fa2a 100644 --- a/code/modules/tgui/status_composers.dm +++ b/code/modules/tgui/status_composers.dm @@ -99,7 +99,7 @@ return UI_UPDATE var/mob/living/living_user = user - return (living_user.body_position == LYING_DOWN && living_user.stat <= SOFT_CRIT) \ + return (living_user.body_position == LYING_DOWN && living_user.stat < UNCONSCIOUS) \ ? UI_INTERACTIVE \ : UI_UPDATE diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index ce00650c5374..aa0de3e1d670 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -101,14 +101,17 @@ )) else 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)) + + 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)) + flush_queue |= window.send_asset(get_asset_datum(/datum/asset/json/icon_ref_map)) + for(var/datum/asset/asset in src_object.ui_assets(user)) flush_queue |= window.send_asset(asset) + if (flush_queue) user.client.browse_queue_flush() + window.send_message("update", get_payload( with_data = TRUE, with_static_data = TRUE)) @@ -309,8 +312,7 @@ window = window, src_object = src_object) process_status() - if(src_object.ui_act(act_type, payload, src, state)) - SStgui.update_uis(src_object) + DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(on_act_message), act_type, payload, state)) return FALSE switch(type) if("ready") @@ -333,3 +335,10 @@ LAZYINITLIST(src_object.tgui_shared_states) src_object.tgui_shared_states[href_list["key"]] = href_list["value"] SStgui.update_uis(src_object) + +/// Wrapper for behavior to potentially wait until the next tick if the server is overloaded +/datum/tgui/proc/on_act_message(act_type, payload, state) + if(QDELETED(src) || QDELETED(src_object)) + return + if(src_object.ui_act(act_type, payload, src, state)) + SStgui.update_uis(src_object) diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui/tgui_alert.dm index 71a595500926..76583bfca325 100644 --- a/code/modules/tgui/tgui_alert.dm +++ b/code/modules/tgui/tgui_alert.dm @@ -21,10 +21,15 @@ return // Client does NOT have tgui_input on: Returns regular input if(!user.client.prefs.read_preference(/datum/preference/toggle/tgui_input)) - if(length(buttons) == 2) - return alert(user, message, title, buttons[1], buttons[2]) - if(length(buttons) == 3) - return alert(user, message, title, buttons[1], buttons[2], buttons[3]) + switch(length(buttons)) + if(1) + return alert(user, message, title, buttons[1]) + if(2) + return alert(user, message, title, buttons[1], buttons[2]) + if(3) + return alert(user, message, title, buttons[1], buttons[2], buttons[3]) + /*else + fall back and show them a TGUI one, whether they want it or not.*/ var/datum/tgui_modal/alert = new(user, message, title, buttons, timeout, autofocus) alert.ui_interact(user) alert.wait() diff --git a/code/modules/tgui/tgui_input_text.dm b/code/modules/tgui/tgui_input_text.dm index 62a5efeff8c2..a7c89b38cc85 100644 --- a/code/modules/tgui/tgui_input_text.dm +++ b/code/modules/tgui/tgui_input_text.dm @@ -33,9 +33,11 @@ return stripped_input(user, message, title, default, max_length) else if(multiline) - return input(user, message, title, default) as message|null + . = input(user, message, title, default) as message|null else - return input(user, message, title, default) as text|null + . = input(user, message, title, default) as text|null + return trim(., max_length) + var/datum/tgui_input_text/text_input = new(user, message, title, default, max_length, multiline, encode, timeout) text_input.ui_interact(user) text_input.wait() diff --git a/code/modules/tgui_panel/tgui_panel.dm b/code/modules/tgui_panel/tgui_panel.dm index c2302b740cca..ab54535f8eb1 100644 --- a/code/modules/tgui_panel/tgui_panel.dm +++ b/code/modules/tgui_panel/tgui_panel.dm @@ -47,9 +47,13 @@ assets = list( 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)) + window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/cursors)) + window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/chat_icons)) + // Other setup request_telemetry() addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS) diff --git a/code/modules/three_dsix/roll.dm b/code/modules/three_dsix/roll.dm new file mode 100644 index 000000000000..6b59ac9537d7 --- /dev/null +++ b/code/modules/three_dsix/roll.dm @@ -0,0 +1,220 @@ +GLOBAL_DATUM_INIT(success_roll, /datum/roll_result/success, new) +/** + * Perform a stat roll, returning a roll result datum. + * + * + * args: + * * requirement (int) The baseline value required to roll a Success. + * * stat (string) The stat, if applicable, to take into account. + * * modifier (int) A modifier applied to the value after roll. Lower means the roll is more difficult. + * * crit_fail_modifier (int) A value subtracted from the requirement, which dictates the crit fail threshold. + */ +/mob/living/proc/stat_roll(requirement = STATS_BASELINE_VALUE, datum/rpg_skill/skill_path, modifier = 0, crit_fail_modifier = -10, mob/living/defender) + RETURN_TYPE(/datum/roll_result) + + var/skill_mod = skill_path ? stats.get_skill_modifier(skill_path) : 0 + var/stat_mod = skill_path ? stats.get_stat_modifier(initial(skill_path.parent_stat_type)) : 0 + + if(defender && skill_path) + skill_mod -= defender.stats?.get_skill_modifier(skill_path) || 0 + stat_mod += defender.stats?.get_stat_modifier(initial(skill_path.parent_stat_type)) || 0 + + requirement -= stat_mod + + return roll_3d6(requirement, (skill_mod + modifier), crit_fail_modifier, skill_type_used = skill_path) + +// Handy probabilities for you! +// 3 - 100.00 +// 4 - 99.54 +// 5 - 98.15 +// 6 - 95.37 +// 7 - 90.74 +// 8 - 83.80 +// 9 - 74.07 +// 10 - 62.50 +// 11 - 50.00 +// 12 - 37.50 +// 13 - 25.93 +// 14 - 16.20 +// 15 - 9.26 +// 16 - 4.63 +// 17 - 1.85 +// 18 - 0.46 +/proc/roll_3d6(requirement = STATS_BASELINE_VALUE, modifier, crit_fail_modifier = -10, datum/rpg_skill/skill_type_used) + RETURN_TYPE(/datum/roll_result) + + var/dice = roll("3d6") + modifier + var/crit_fail = max((requirement + crit_fail_modifier), 4) + var/crit_success = min((requirement + 7), 17) + + // if(dice >= requirement) + // var/list/out = list( + // "ROLL: [dice]", + // "SUCCESS PROB: %[round(dice_probability(3, 6, requirement - modifier), 0.01)]", + // "CRIT SP: %[round(dice_probability(3, 6, crit_success), 0.01)]", + // "MOD: [modifier]", + // "LOWEST POSSIBLE: [3 + modifier]", + // "HIGHEST POSSIBLE:[18 + modifier]", + // "CRIT SUCCESS: [crit_success]", + // "SUCCESS: [requirement]", + // "FAIL: [requirement-1]", + // "CRIT FAIL:[crit_fail]", + // "~~~~~~~~~~~~~~~" + // ) + // to_chat(world, span_adminnotice(jointext(out, ""))) + + var/datum/roll_result/result = new() + result.success_prob = round(dice_probability(3, 6, requirement - modifier), 0.01) + result.crit_success_prob = round(dice_probability(3, 6, crit_success), 0.01) + result.roll = dice + result.requirement = requirement + result.skill_type_used = skill_type_used + + if(dice >= requirement) + if(dice >= crit_success) + result.outcome = CRIT_SUCCESS + else + result.outcome = SUCCESS + + else + if(dice <= crit_fail) + result.outcome = CRIT_FAILURE + else + result.outcome = FAILURE + + return result + +/datum/roll_result + /// Outcome of the roll, failure, success, etc. + var/outcome + /// The % chance to have rolled a success (0-100) + var/success_prob + /// The % chance to have rolled a critical success (0-100) + var/crit_success_prob + /// The numerical value rolled. + var/roll + /// The value required to pass the roll. + var/requirement + + /// Typepath of the skill used. Optional. + var/datum/rpg_skill/skill_type_used + +/datum/roll_result/proc/create_tooltip(body) + if(!skill_type_used) + if(outcome >= SUCCESS) + body = span_statsgood(body) + else + body = span_statsbad(body) + return body + + var/prob_string + switch(success_prob) + if(0 to 12) + prob_string = "Impossible" + if(13 to 24) + prob_string = "Legendary" + if(25 to 36) + prob_string = "Formidable" + if(37 to 48) + prob_string = "Challenging" + if(49 to 60) + prob_string = "Hard" + if(61 to 72) + prob_string = "Medium" + if(73 to 84) + prob_string = "Easy" + if(85 to 100) + prob_string = "Trivial" + + var/success = "" + switch(outcome) + if(CRIT_SUCCESS) + success = "Critical Success" + if(SUCCESS) + success = "Success" + if(FAILURE) + success = "Failure" + if(CRIT_FAILURE) + success = "Critical Failure" + + var/finished_prob_string = "\[[prob_string]: [success]\]" + var/prefix + if(outcome >= SUCCESS) + prefix = "[uppertext(initial(skill_type_used.name))]" + body = span_statsgood(body) + else + prefix = "[uppertext(initial(skill_type_used.name))]" + body = span_statsbad(body) + + var/color = (outcome >= SUCCESS) ? "#03fca1" : "#fc4b32" + var/tooltip_html = "[success_prob]% | Result: [roll] | Check: [requirement]" + var/seperator = ": " + + return "[prefix] [finished_prob_string][seperator][body]" + +/datum/roll_result/success + outcome = SUCCESS + success_prob = 100 + crit_success_prob = 0 + roll = 18 + requirement = 3 + +/mob/living/verb/testroll() + name = "testroll" + + var/datum/roll_result/result = stat_roll(11, /datum/rpg_skill/skirmish) + to_chat(usr, result.create_tooltip("This message is a test, and not indicative of the final product.")) + +/// Returns a number between 0 and 100 to roll the desired value when rolling the given dice. +/proc/dice_probability(num, sides, desired) + var/static/list/outcomes_cache = new /list(0, 0) + var/static/list/desired_cache = list() + + . = desired_cache["[num][sides][desired]"] + if(!isnull(.)) + return . + + if(desired < num) + . = desired_cache["[num][sides][desired]"] = 0 + return + + if(desired > num * sides) + . = desired_cache["[num][sides][desired]"] = 100 + return + + if(num > length(outcomes_cache)) + outcomes_cache.len = num + + if(sides > length(outcomes_cache[num])) + if(islist(outcomes_cache[num])) + outcomes_cache[num]:len = sides + else + outcomes_cache[num] = new /list(sides) + + var/list/outcomes = outcomes_cache[num][sides] + if(isnull(outcomes)) + outcomes = outcomes_cache[num][sides] = dice_outcome_map(num, sides) + + var/favorable_outcomes = 0 + for(var/i in desired to num*sides) + favorable_outcomes += outcomes[i] + + . = desired_cache["[num][sides][desired]"] = (favorable_outcomes / (sides ** num)) * 100 + +/// Certified LummoxJR code, this returns an array which is a map of outcomes to roll [index] value. +/proc/dice_outcome_map(n, sides) + var/i,j,k + var/list/outcomes = new(sides) + var/list/next + // 1st die + for(i in 1 to sides) + outcomes[i] = 1 + for(k in 2 to n) + next = new(k*sides) + for(i in 1 to k-1) + next[i] = 0 + for(i in 1 to sides) + for(j in k-1 to length(outcomes)) + next[i+j] += outcomes[j] + outcomes = next + return outcomes diff --git a/code/modules/three_dsix/skills/_skill.dm b/code/modules/three_dsix/skills/_skill.dm new file mode 100644 index 000000000000..7e36ffbc22f2 --- /dev/null +++ b/code/modules/three_dsix/skills/_skill.dm @@ -0,0 +1,21 @@ +/datum/rpg_skill + abstract_type = /datum/rpg_skill + + var/name = "" + var/desc = "" + + var/value = 0 + var/list/modifiers + + /// All skills must have a valid parent stat type. + var/parent_stat_type = null + +/datum/rpg_skill/proc/get(mob/living/user) + return value + +/// Update the modified value with modifiers. +/datum/rpg_skill/proc/update_modifiers() + SHOULD_NOT_OVERRIDE(TRUE) + value = 0 + for(var/source in modifiers) + value += modifiers[source] diff --git a/code/modules/three_dsix/skills/anatomia.dm b/code/modules/three_dsix/skills/anatomia.dm new file mode 100644 index 000000000000..4df0207c3d9d --- /dev/null +++ b/code/modules/three_dsix/skills/anatomia.dm @@ -0,0 +1,5 @@ +/datum/rpg_skill/anatomia + name = "Anatomic Awareness" + desc = "Mend the wounds in flesh and soul." + + parent_stat_type = /datum/rpg_stat/psyche diff --git a/code/modules/three_dsix/skills/coordination.dm b/code/modules/three_dsix/skills/coordination.dm new file mode 100644 index 000000000000..708faa031b3c --- /dev/null +++ b/code/modules/three_dsix/skills/coordination.dm @@ -0,0 +1,26 @@ +/datum/rpg_skill/handicraft + name = "Handicraft" + desc = "Control and manipulate, with style." + + parent_stat_type = /datum/rpg_stat/motorics + +/datum/rpg_skill/handicraft/get(mob/living/user) + . = ..() + + if(CHEM_EFFECT_MAGNITUDE(user, CE_STIMULANT)) + . -= 1 + + if(user.is_blind()) + . -= 4 + else if(user.eye_blurry) + . -= 1 + + if(!iscarbon(user)) + return + + var/mob/living/carbon/carbon_user = user + + if(carbon_user.shock_stage > 30) + . -= 2 + else if(carbon_user.shock_stage > 10) + . -= 1 diff --git a/code/modules/three_dsix/skills/forensics.dm b/code/modules/three_dsix/skills/forensics.dm new file mode 100644 index 000000000000..f3bcd581c85c --- /dev/null +++ b/code/modules/three_dsix/skills/forensics.dm @@ -0,0 +1,5 @@ +/datum/rpg_skill/forensics + name = "Forensic Analysis" + desc = "Reconstruct the past." + + parent_stat_type = /datum/rpg_stat/psyche diff --git a/code/modules/three_dsix/skills/skirmish.dm b/code/modules/three_dsix/skills/skirmish.dm new file mode 100644 index 000000000000..dfff774e9d0a --- /dev/null +++ b/code/modules/three_dsix/skills/skirmish.dm @@ -0,0 +1,34 @@ +/datum/rpg_skill/skirmish + name = "Skirmish" + desc = "The thrill of hand-to-hand combat." + + parent_stat_type = /datum/rpg_stat/soma + +/datum/rpg_skill/skirmish/get(mob/living/user) + . = ..() + if(CHEM_EFFECT_MAGNITUDE(user, CE_STIMULANT)) + . += 1 + if(user.incapacitated()) + . -= 10 //lol fucked + + if(user.is_blind()) + . -= -4 + else if(user.eye_blurry) + . -= 1 + + if(!iscarbon(user)) + return + + var/mob/living/carbon/carbon_user = user + + if(carbon_user.getPain() > 100) + . -= 2 + + if(carbon_user.shock_stage > 30) + . -= 2 + else if(carbon_user.shock_stage > 10) + . -= 1 + + var/obj/item/organ/brain/brain = carbon_user.getorganslot(ORGAN_SLOT_BRAIN) + if(brain && (brain.damage >= (brain.maxHealth * brain.low_threshold))) + . -= 3 diff --git a/code/modules/three_dsix/skills/willpower.dm b/code/modules/three_dsix/skills/willpower.dm new file mode 100644 index 000000000000..0df491523fa7 --- /dev/null +++ b/code/modules/three_dsix/skills/willpower.dm @@ -0,0 +1,5 @@ +/datum/rpg_skill/willpower + name = "Willpower" + desc = "Fight to survive. Live and thrive." + + parent_stat_type = /datum/rpg_stat/psyche diff --git a/code/modules/three_dsix/stats.dm b/code/modules/three_dsix/stats.dm new file mode 100644 index 000000000000..fdf40eba9482 --- /dev/null +++ b/code/modules/three_dsix/stats.dm @@ -0,0 +1,94 @@ +/datum/stats + var/mob/living/owner + + // Higher is better with stats. 11 is the baseline. + /// A lazylist + VAR_PRIVATE/list/stats = list() + + // Higher is better with skills. 0 is the baseline. + VAR_PRIVATE/list/skills = list() + + VAR_PRIVATE/list/stat_cooldowns = list() + + /// A list of weakrefs to examined objects. Used for forensic rolls. THIS DOES JUST KEEP GETTING BIGGER, SO, CAREFUL. + var/list/examined_object_weakrefs = list() + +/datum/stats/New(owner) + . = ..() + src.owner = owner + + for(var/datum/path as anything in typesof(/datum/rpg_stat)) + if(isabstract(path)) + continue + stats[path] = new path + + for(var/datum/path as anything in typesof(/datum/rpg_skill)) + if(isabstract(path)) + continue + skills[path] += new path + +/datum/stats/Destroy() + owner = null + stats = null + skills = null + return ..() + +/// Return a given stat value. +/datum/stats/proc/get_stat_modifier(stat) + var/datum/rpg_stat/S = stats[stat] + return S.get(owner) + +/// Return a given skill value modifier. +/datum/stats/proc/get_skill_modifier(skill) + var/datum/rpg_skill/S = skills[skill] + return S.get(owner) + +/// Add a stat modifier from a given source +/datum/stats/proc/set_stat_modifier(amount, datum/rpg_stat/stat_path, source) + if(!source) + CRASH("No source passed into set_modifiers()") + if(!ispath(stat_path)) + CRASH("Bad stat: [stat_path]") + + var/datum/rpg_stat/S = stats[stat_path] + LAZYSET(S.modifiers, source, amount) + S.update_modifiers() + +/// Remove all stat modifiers given by a source. +/datum/stats/proc/remove_stat_modifier(datum/rpg_stat/stat_path, source) + if(!source) + CRASH("No source passed into remove_modifiers()") + if(!ispath(stat_path)) + CRASH("Bad stat: [stat_path]") + + var/datum/rpg_stat/S = stats[stat_path] + if(LAZYACCESS(S.modifiers, source)) + S.modifiers -= source + S.update_modifiers() + +/datum/stats/proc/set_skill_modifier(amount, datum/rpg_skill/skill, source) + if(!source) + CRASH("No source passed into set_skill_modifier()") + if(!ispath(skill)) + CRASH("Bad skill: [skill]") + + var/datum/rpg_skill/S = skills[skill] + LAZYSET(S.modifiers, source, amount) + S.update_modifiers() + +/datum/stats/proc/remove_skill_modifier(datum/rpg_skill/skill, source) + if(!source) + CRASH("No source passed into remove_skill()") + if(!ispath(skill)) + CRASH("Bad skill: [skill]") + + var/datum/rpg_skill/S = skills[skill] + if(LAZYACCESS(S.modifiers, source)) + LAZYREMOVE(S.modifiers, source) + S.update_modifiers() + +/datum/stats/proc/cooldown_finished(index) + return COOLDOWN_FINISHED(src, stat_cooldowns[index]) + +/datum/stats/proc/set_cooldown(index, value) + COOLDOWN_START(src, stat_cooldowns[index], value) diff --git a/code/modules/three_dsix/stats/_stat.dm b/code/modules/three_dsix/stats/_stat.dm new file mode 100644 index 000000000000..0c95d640580e --- /dev/null +++ b/code/modules/three_dsix/stats/_stat.dm @@ -0,0 +1,17 @@ +/datum/rpg_stat + abstract_type = /datum/rpg_stat + var/name = "" + var/desc = "" + + var/value = STATS_BASELINE_VALUE + var/list/modifiers + +/datum/rpg_stat/proc/get(mob/living/user) + return value - STATS_BASELINE_VALUE + +/// Update the modified value with modifiers. +/datum/rpg_stat/proc/update_modifiers() + SHOULD_NOT_OVERRIDE(TRUE) + value = initial(value) + for(var/source in modifiers) + value += modifiers[source] diff --git a/code/modules/three_dsix/stats/motorics.dm b/code/modules/three_dsix/stats/motorics.dm new file mode 100644 index 000000000000..776c5adb9c58 --- /dev/null +++ b/code/modules/three_dsix/stats/motorics.dm @@ -0,0 +1,19 @@ +/datum/rpg_stat/motorics + name = "Motorics" + desc = "" + + value = STATS_BASELINE_VALUE + +/datum/rpg_stat/motorics/get(mob/living/user) + . = ..() + if(!iscarbon(user)) + return + + var/mob/living/carbon/carbon_user = user + + var/obj/item/organ/brain/brain = carbon_user.getorganslot(ORGAN_SLOT_BRAIN) + if(brain && (brain.damage >= (brain.maxHealth * brain.low_threshold))) + . -= 4 + + if(carbon_user.has_status_effect(/datum/status_effect/speech/slurring/drunk)) + . -= 2 diff --git a/code/modules/three_dsix/stats/psyche.dm b/code/modules/three_dsix/stats/psyche.dm new file mode 100644 index 000000000000..62082556fdfb --- /dev/null +++ b/code/modules/three_dsix/stats/psyche.dm @@ -0,0 +1,17 @@ +/datum/rpg_stat/psyche + name = "Psyche" + desc = "" + + value = STATS_BASELINE_VALUE + + +/datum/rpg_stat/psyche/get(mob/living/user) + . = ..() + if(!iscarbon(user)) + return + + var/mob/living/carbon/carbon_user = user + + var/obj/item/organ/brain/brain = carbon_user.getorganslot(ORGAN_SLOT_BRAIN) + if(brain && (brain.damage >= (brain.maxHealth * brain.low_threshold))) + . -= 4 diff --git a/code/modules/three_dsix/stats/soma.dm b/code/modules/three_dsix/stats/soma.dm new file mode 100644 index 000000000000..68a7dae47629 --- /dev/null +++ b/code/modules/three_dsix/stats/soma.dm @@ -0,0 +1,5 @@ +/datum/rpg_stat/soma + name = "Soma" + desc = "" + + value = STATS_BASELINE_VALUE diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index b18c5d5787b6..36a45b7df354 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -48,6 +48,10 @@ #define TEST_PRE 0 #define TEST_DEFAULT 1 +/// After most test steps, used for tests that run long so shorter issues can be noticed faster +#define TEST_LONGER 10 +/// This must be the last test to run due to the inherent nature of the test iterating every single tangible atom in the game +/// and qdeleting all of them (while taking long sleeps to make sure the garbage collector fires properly) taking a large amount of time. #define TEST_DEL_WORLD INFINITY #ifdef ANSICOLORS @@ -69,11 +73,14 @@ #include "achievements.dm" #include "anchored_mobs.dm" #include "anonymous_themes.dm" +#include "area_contents.dm" #include "atmos_moles_tests.dm" #include "autowiki.dm" +#include "baseturfs.dm" #include "bespoke_id.dm" #include "binary_insert.dm" #include "bloody_footprints.dm" +#include "bodypart_organ_sanity.dm" #include "breath.dm" #include "card_mismatch.dm" #include "chain_pull_through_space.dm" @@ -87,6 +94,7 @@ #include "connect_loc.dm" #include "crayons.dm" #include "create_and_destroy.dm" +#include "dcs_get_id_from_elements.dm" #include "designs.dm" #include "dummy_spawn.dm" #include "dynamic_ruleset_sanity.dm" @@ -96,14 +104,17 @@ #include "gas_transfer.dm" #include "gas_validation.dm" #include "get_turf_pixel.dm" +#include "grabbing.dm" #include "greyscale_config.dm" #include "heretic_knowledge.dm" #include "heretic_rituals.dm" #include "holidays.dm" +#include "hulk.dm" #include "hydroponics_extractor_storage.dm" #include "hydroponics_harvest.dm" #include "hydroponics_self_mutations.dm" #include "keybinding_init.dm" +#include "knockoff_component.dm" #include "load_map_security.dm" #include "machine_disassembly.dm" #include "mapping.dm" @@ -113,14 +124,13 @@ #include "mob_spawn.dm" #include "modsuit.dm" #include "modular_map_loader.dm" +#include "movement_order_sanity.dm" #include "novaflower_burn.dm" -#include "ntnetwork_tests.dm" #include "objectives.dm" #include "outfit_sanity.dm" #include "paintings.dm" #include "pills.dm" #include "plantgrowth_tests.dm" -#include "preference_species.dm" #include "preferences.dm" #include "projectiles.dm" #include "quirks.dm" @@ -136,9 +146,9 @@ #include "screenshot_antag_icons.dm" #include "screenshot_basic.dm" #include "screenshot_humanoids.dm" -#include "security_officer_distribution.dm" #include "serving_tray.dm" #include "siunit.dm" +#include "slapcraft_sanity.dm" #include "spawn_humans.dm" #include "spawn_mobs.dm" #include "species_config_sanity.dm" @@ -152,13 +162,16 @@ #include "stomach.dm" #include "strippable.dm" #include "subsystem_init.dm" +#include "subsystem_sanity.dm" #include "surgeries.dm" +#include "tape_sanity.dm" #include "teleporters.dm" #include "tgui_create_message.dm" #include "timer_sanity.dm" #include "traitor.dm" #include "unit_test.dm" #include "wizard_loadout.dm" +#include "wounds.dm" #ifdef REFERENCE_TRACKING_DEBUG //Don't try and parse this file if ref tracking isn't turned on. IE: don't parse ref tracking please mr linter #include "find_reference_sanity.dm" #endif diff --git a/code/modules/unit_tests/area_contents.dm b/code/modules/unit_tests/area_contents.dm new file mode 100644 index 000000000000..70740a026a5c --- /dev/null +++ b/code/modules/unit_tests/area_contents.dm @@ -0,0 +1,37 @@ +/// Verifies that an area's perception of their "turfs" is correct, and no other area overlaps with them +/// Quite slow, but needed +/datum/unit_test/area_contents + priority = TEST_LONGER + +/datum/unit_test/area_contents/Run() + // First, we check that there are no entries in more then one area + // That or duplicate entries + for(var/area/space in GLOB.areas) + for(var/turf/position as anything in space.get_contained_turfs()) + if(!isturf(position)) + TEST_FAIL("Found a [position.type] in [space.type]'s turf listing") + + if(position.in_contents_of) + var/area/existing = position.in_contents_of + if(existing == space) + TEST_FAIL("Found a duplicate turf [position.type] inside [space.type]'s turf listing") + else + TEST_FAIL("Found a shared turf [position.type] between [space.type] and [existing.type]'s turf listings") + + var/area/dream_spot = position.loc + if(dream_spot != space) + TEST_FAIL("Found a turf [position.type] which is IN [dream_spot.type], but is registered as being in [space.type]") + + position.in_contents_of = space + + for(var/turf/position as anything in ALL_TURFS()) + if(!position.in_contents_of) + TEST_FAIL("Found a turf [position.type] inside [position.loc.type] that is NOT stored in any area's turf listing") + + +/// For the area_contents list unit test +/// Allows us to know our area without needing to preassign it +/// Sorry for the mess +#if defined(UNIT_TESTS) || defined(SPACEMAN_DMM) +/turf/var/area/in_contents_of +#endif diff --git a/code/modules/unit_tests/atmos_moles_tests.dm b/code/modules/unit_tests/atmos_moles_tests.dm index 927c3a686556..839efbdd1fe8 100644 --- a/code/modules/unit_tests/atmos_moles_tests.dm +++ b/code/modules/unit_tests/atmos_moles_tests.dm @@ -42,7 +42,6 @@ return result /datum/unit_test/atmos_machinery/proc/check_moles_conserved(case_name, list/before_gas_mixes, list/after_gas_mixes) - var/failed = FALSE for(var/gasid in xgm_gas_data.gases) var/before = 0 for(var/gasmix in before_gas_mixes) @@ -56,10 +55,6 @@ if(abs(before - after) > ATMOS_PRECISION) Fail("expected [before] moles of [gasid], found [after] moles.") - failed |= TRUE - - if(!failed) - pass("conserved moles of each gas ID.") /datum/unit_test/atmos_machinery/conserve_moles //template = /datum/unit_test/atmos_machinery/conserve_moles diff --git a/code/modules/unit_tests/baseturfs.dm b/code/modules/unit_tests/baseturfs.dm new file mode 100644 index 000000000000..a6193caee12a --- /dev/null +++ b/code/modules/unit_tests/baseturfs.dm @@ -0,0 +1,76 @@ +#define EXPECTED_FLOOR_TYPE /turf/open/floor/iron +// Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior +#define RESET_TO_EXPECTED(turf) \ + turf.ChangeTurf(EXPECTED_FLOOR_TYPE);\ + turf.assemble_baseturfs(initial(turf.baseturfs)) + +/// Validates that unmodified baseturfs tear down properly +/datum/unit_test/baseturfs_unmodified_scrape + +/datum/unit_test/baseturfs_unmodified_scrape/Run() + // What this is specifically doesn't matter, just as long as the test is built for it + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") + + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Iron floors should scrape away to plating") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should scrape away to space") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Space should scrape away to space") + +/datum/unit_test/baseturfs_unmodified_scrape/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +/// Validates that specially placed baseturfs tear down properly +/datum/unit_test/baseturfs_placed_on_top + +/datum/unit_test/baseturfs_placed_on_top/Run() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") + + // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + + run_loc_floor_bottom_left.PlaceOnTop(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Rock wall should've been placed on top") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "Rock wall should've been scraped off, back into the expected type") + +/datum/unit_test/baseturfs_placed_on_top/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +/// Validates that specially placed baseturfs BELOW tear down properly +/datum/unit_test/baseturfs_placed_on_bottom + +/datum/unit_test/baseturfs_placed_on_bottom/Run() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "run_loc_floor_bottom_left should be an iron floor") + + // Do this instead of just ChangeTurf to guarantee that baseturfs is completely default on-init behavior + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + + run_loc_floor_bottom_left.PlaceOnBottom(/turf/closed/wall/rock) + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, EXPECTED_FLOOR_TYPE, "PlaceOnBottom shouldn't have changed turf") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Iron floors should scrape away to plating") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/space, "Plating should've scraped off to space") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/closed/wall/rock, "Space should've scraped down to a rock wall") + + run_loc_floor_bottom_left.ScrapeAway() + TEST_ASSERT_EQUAL(run_loc_floor_bottom_left.type, /turf/open/floor/plating, "Rock wall should've scraped down back to plating (because it's a wall)") + +/datum/unit_test/baseturfs_placed_on_bottom/Destroy() + RESET_TO_EXPECTED(run_loc_floor_bottom_left) + return ..() + +#undef RESET_TO_EXPECTED +#undef EXPECTED_FLOOR_TYPE diff --git a/code/modules/unit_tests/bloody_footprints.dm b/code/modules/unit_tests/bloody_footprints.dm index bddad5187607..2b9378e3a668 100644 --- a/code/modules/unit_tests/bloody_footprints.dm +++ b/code/modules/unit_tests/bloody_footprints.dm @@ -15,13 +15,13 @@ var/obj/effect/decal/cleanable/blood/pool = allocate(/obj/effect/decal/cleanable/blood) //Max out the pools blood, so each step will make things stained enough to matter - pool.bloodiness = BLOOD_POOL_MAX + pool.reagents.add_reagent_up_to(/datum/reagent/blood, BLOOD_POOL_MAX, BLOOD_POOL_MAX) pool.forceMove(run_loc_floor_bottom_left) blood_master.forceMove(run_loc_floor_bottom_left) var/datum/component/bloodysoles/soles = holds_blood.GetComponent(/datum/component/bloodysoles) - var/blood_type = pool.blood_state + var/blood_type = pool.blood_color TEST_ASSERT(soles.bloody_shoes[blood_type], "Shoes didn't become stained after stepping in a pool of [blood_type]") @@ -39,7 +39,7 @@ var/footprint_total = 0 for(var/obj/effect/decal/cleanable/blood/footprints/print_set in move_to) - if(print_set.blood_state == blood_type) + if(print_set.blood_color == blood_type) footprint_total += 1 TEST_ASSERT(footprint_total, "The floor didn't get covered in [blood_type] after being walked over") @@ -54,7 +54,7 @@ footprint_total = 0 for(var/obj/effect/decal/cleanable/blood/footprints/print_set in move_to) - if(print_set.blood_state == blood_type) + if(print_set.blood_color == blood_type) footprint_total += 1 TEST_ASSERT(footprint_total, "The floor somehow lost its footprints after being walked over") diff --git a/code/modules/unit_tests/bodypart_organ_sanity.dm b/code/modules/unit_tests/bodypart_organ_sanity.dm new file mode 100644 index 000000000000..b14d96b93b6d --- /dev/null +++ b/code/modules/unit_tests/bodypart_organ_sanity.dm @@ -0,0 +1,40 @@ +/datum/unit_test/organ_sanity/Run() + var/mob/living/carbon/human/hollow_boy = allocate(/mob/living/carbon/human/consistent) + + // Test if organs are all properly updating when forcefully removed + var/list/removed_organs = list() + + for(var/obj/item/organ/organ as anything in hollow_boy.organs) + var/runtimed = FALSE + // Doing this is considered a bug, so let's discard the error for the sake of this test. + try + organ.moveToNullspace() + + catch + runtimed = TRUE + + if(!runtimed) + TEST_FAIL("Improperly removing an organ ([organ.type]) did not runtime.") + + removed_organs += organ + + for(var/obj/item/organ/organ as anything in removed_organs) + TEST_ASSERT(!(organ in hollow_boy.organs), "Organ '[organ.name] remained inside human after forceMove into nullspace.") + TEST_ASSERT(isnull(organ.loc), "Organ '[organ.name] did not move to nullspace after being forced to.") + TEST_ASSERT(isnull(organ.owner), "Organ '[organ.name] kept reference to human after forceMove into nullspace.") + TEST_ASSERT(isnull(organ.ownerlimb), "Organ '[organ.name] kept reference to bodypart after forceMove into nullspace.") + + for(var/obj/item/bodypart/bodypart as anything in hollow_boy.bodyparts) + bodypart = new bodypart.type() //fresh, duplice bodypart with no insides + + for(var/obj/item/organ/organ as anything in removed_organs) + if(bodypart.body_zone != deprecise_zone(organ.zone)) + continue + organ.Insert(hollow_boy) // Put all the old organs back in + bodypart.replace_limb(hollow_boy, TRUE) //so stick new bodyparts on them with their old organs + + // Check if, after we put the old organs in a new limb, and after we put that new limb on the mob, if the organs came with + for(var/obj/item/organ/organ as anything in removed_organs) //technically readded organ now + if(bodypart.body_zone != deprecise_zone(organ.zone)) + continue + TEST_ASSERT(organ in hollow_boy.organs, "Organ '[organ.name] was put in an empty bodypart that replaced a humans, but the organ did not come with.") diff --git a/code/modules/unit_tests/breath.dm b/code/modules/unit_tests/breath.dm index fa7994e43f1a..cd325f555766 100644 --- a/code/modules/unit_tests/breath.dm +++ b/code/modules/unit_tests/breath.dm @@ -51,38 +51,3 @@ //Prep the mob source.toggle_internals(lab_rat) TEST_ASSERT(!lab_rat.internal, "Plasmaman toggle_internals() failed to toggle internals") - -/// Tests to make sure ashwalkers can breath from the lavaland air -/datum/unit_test/breath_sanity_ashwalker - -/datum/unit_test/breath_sanity_ashwalker/Run() - var/mob/living/carbon/human/species/lizard/ashwalker/lab_rat = allocate(/mob/living/carbon/human/species/lizard/ashwalker) - - //Prep the mob - lab_rat.forceMove(run_loc_floor_bottom_left) - - var/turf/open/to_fill = run_loc_floor_bottom_left - //Prep the floor - to_fill.initial_gas = SSzas.lavaland_atmos.gas - to_fill.make_air() - - lab_rat.breathe() - var/list/reason - if(lab_rat.has_alert(ALERT_NOT_ENOUGH_OXYGEN)) - if(!to_fill.return_air()) - return Fail("Assertion Failed: Turf failed to return air. Type: [to_fill.type], Initial Gas: [json_encode(to_fill.initial_gas)]") - - var/datum/gas_mixture/turf_gas = to_fill.return_air() - LAZYADD(reason, "Turf mix: [json_encode(turf_gas.gas)] | T: [turf_gas.temperature] | P: [turf_gas.returnPressure()] | Initial Gas: [json_encode(to_fill.initial_gas)]") - - if(lab_rat.loc != to_fill) - LAZYADD(reason, "Rat was not located on it's intended turf!") - - if(reason) - return Fail("Assertion Failed: [reason.Join(";")]", __FILE__, __LINE__) - -/datum/unit_test/breath_sanity_ashwalker/Destroy() - //Reset initial_gas to avoid future issues on other tests - var/turf/open/to_fill = run_loc_floor_bottom_left - to_fill.initial_gas = OPENTURF_DEFAULT_ATMOS - return ..() diff --git a/code/modules/unit_tests/chain_pull_through_space.dm b/code/modules/unit_tests/chain_pull_through_space.dm index b718da91c2c6..cc528b457130 100644 --- a/code/modules/unit_tests/chain_pull_through_space.dm +++ b/code/modules/unit_tests/chain_pull_through_space.dm @@ -16,7 +16,7 @@ // Create a space tile that goes to another z-level claimed_tile = run_loc_floor_bottom_left.type - space_tile = new(locate(run_loc_floor_bottom_left.x, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + space_tile = run_loc_floor_bottom_left.ChangeTurf(/turf/open/space) space_tile.destination_x = round(reserved.bottom_left_coords[1] + (reserved.width-1) / 2) space_tile.destination_y = round(reserved.bottom_left_coords[2] + (reserved.height-1) / 2) space_tile.destination_z = reserved.bottom_left_coords[3] @@ -42,8 +42,8 @@ /datum/unit_test/chain_pull_through_space/Run() // Alice pulls Bob, who pulls Charlie // Normally, when Alice moves forward, the rest follow - alice.start_pulling(bob) - bob.start_pulling(charlie) + bob.try_make_grab(charlie) + alice.try_make_grab(bob) // Walk normally to the left, make sure we're still a chain alice.Move(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) diff --git a/code/modules/unit_tests/codex.dm b/code/modules/unit_tests/codex.dm index a88f7b87ac94..c747f9cb1508 100644 --- a/code/modules/unit_tests/codex.dm +++ b/code/modules/unit_tests/codex.dm @@ -1,32 +1,6 @@ -/datum/unit_test/codex_string_uniqueness - -/datum/unit_test/codex_string_uniqueness/Run() - var/list/seen_strings = list() - for(var/datum/codex_entry/entry as anything in SScodex.all_entries) - for(var/associated_string in entry.associated_strings) - if(seen_strings[associated_string]) - TEST_FAIL("Codex String Not Unique:'[associated_string]' - [entry.type]|[entry.name] - first seen: [seen_strings[associated_string]]") - else - seen_strings[associated_string] = "[entry.type]|[entry.name]" - -/datum/unit_test/codex_overlap - -/datum/unit_test/codex_overlap/Run() - for(var/check_string in SScodex.entries_by_string) - var/clean_check_string = lowertext(check_string) - for(var/other_string in SScodex.entries_by_string) - var/clean_other_string = lowertext(other_string) - if(clean_other_string != clean_check_string && SScodex.entries_by_string[other_string] != SScodex.entries_by_string[check_string]) - if(findtext(clean_check_string, clean_other_string)) - TEST_FAIL("Codex Overlap: [check_string], [other_string]") - else if(findtext(clean_other_string, clean_check_string)) - TEST_FAIL("Codex Overlap: [other_string], [check_string]") - - /datum/unit_test/codex_links /datum/unit_test/codex_links/Run() - var/list/failures = list() for(var/datum/codex_entry/entry in SScodex.all_entries) var/entry_body = jointext(entry.get_codex_body(), null) while(SScodex.linkRegex.Find(entry_body)) @@ -34,7 +8,6 @@ if(SScodex.linkRegex.group[2]) regex_key = SScodex.linkRegex.group[3] regex_key = codex_sanitize(regex_key) - var/replacement = SScodex.linkRegex.group[4] var/datum/codex_entry/linked_entry = SScodex.get_entry_by_string(regex_key) if(!linked_entry) - TEST_FAIL("[entry.name] - [replacement]") + TEST_FAIL("Bad codex link: '[regex_key]' in [entry.type]") diff --git a/code/modules/unit_tests/combat.dm b/code/modules/unit_tests/combat.dm index 57f13f24d764..585525575adf 100644 --- a/code/modules/unit_tests/combat.dm +++ b/code/modules/unit_tests/combat.dm @@ -68,3 +68,54 @@ TEST_ASSERT(pre_attack_hit, "Pre-attack signal was not fired") TEST_ASSERT(attack_hit, "Attack signal was not fired") TEST_ASSERT(post_attack_hit, "Post-attack signal was not fired") + +/datum/unit_test/non_standard_damage/Run() + var/mob/living/carbon/human/man = allocate(/mob/living/carbon/human) + + man.adjustOrganLoss(ORGAN_SLOT_BRAIN, 200) + TEST_ASSERT(man.stat == DEAD, "Victim did not die when taking 200 brain damage.") + +/// Tests you can punch yourself +/datum/unit_test/self_punch + +/datum/unit_test/self_punch/Run() + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + ADD_TRAIT(dummy, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) + dummy.set_combat_mode(TRUE) + dummy.ClickOn(dummy) + TEST_ASSERT_NOTEQUAL(dummy.getBruteLoss(), 0, "Dummy took no brute damage after self-punching") + +/// Tests handcuffed (HANDS_BLOCKED) mobs cannot punch +/datum/unit_test/handcuff_punch + +/datum/unit_test/handcuff_punch/Run() + var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) + ADD_TRAIT(attacker, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) + ADD_TRAIT(attacker, TRAIT_HANDS_BLOCKED, TRAIT_SOURCE_UNIT_TESTS) + + attacker.set_combat_mode(TRUE) + attacker.ClickOn(victim) + + TEST_ASSERT_EQUAL(victim.getBruteLoss(), 0, "Victim took brute damage from being punched by a handcuffed attacker") + attacker.next_move = -1 + attacker.next_click = -1 + attacker.ClickOn(attacker) + + TEST_ASSERT_EQUAL(attacker.getBruteLoss(), 0, "Attacker took brute damage from self-punching while handcuffed") + +/// Tests handcuffed (HANDS_BLOCKED) monkeys can still bite despite being cuffed +/datum/unit_test/handcuff_bite + +/datum/unit_test/handcuff_bite/Run() + var/mob/living/carbon/human/attacker = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/victim = allocate(/mob/living/carbon/human/consistent) + + ADD_TRAIT(attacker, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) + ADD_TRAIT(attacker, TRAIT_HANDS_BLOCKED, TRAIT_SOURCE_UNIT_TESTS) + + attacker.set_combat_mode(TRUE) + attacker.set_species(/datum/species/monkey) + attacker.ClickOn(victim) + + TEST_ASSERT_NOTEQUAL(victim.getBruteLoss(), 0, "Victim took no brute damage from being bit by a handcuffed monkey, which is incorrect, as it's a bite attack") diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index fb72861058f1..22efd628dbdd 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -29,6 +29,8 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) /obj/item/bodypart, //Merge conflict marker. It doesn't runtime, but it's not a real object either /obj/merge_conflict_marker, + // Haha, no + /obj/item/hand_item/grab, ) //Say it with me now, type template ignore += typesof(/obj/effect/mapping_helpers) @@ -74,10 +76,6 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ignore += typesof(/mob/living/silicon/robot/model) //This lad also sleeps ignore += typesof(/obj/item/hilbertshotel) - //this boi spawns turf changing stuff, and it stacks and causes pain. Let's just not - ignore += typesof(/obj/effect/sliding_puzzle) - //Stacks baseturfs, can't be tested here - ignore += typesof(/obj/effect/temp_visual/lava_warning) //Stacks baseturfs, can't be tested here ignore += typesof(/obj/effect/landmark/ctf) //Our system doesn't support it without warning spam from unregister calls on things that never registered @@ -96,6 +94,10 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) ignore += typesof(/obj/machinery/computer/holodeck) //runtimes if not paired with a landmark ignore += typesof(/obj/structure/industrial_lift) + //throws garbage to the log if it spawns without neighbors. It's a mapping helper anyways. + ignore += typesof(/obj/structure/cable/smart_cable) + // Throws a warning due to passing a zero-duration argument after mapload + ignore += typesof(/obj/effect/abstract/smell_holder) var/list/cached_contents = spawn_at.contents.Copy() var/original_turf_type = spawn_at.type @@ -132,33 +134,45 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) GLOB.running_create_and_destroy = FALSE //Hell code, we're bound to have ended the round somehow so let's stop if from ending while we work SSticker.delay_end = TRUE - //Prevent the garbage subsystem from harddeling anything, if only to save time - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 10000 HOURS + SSgarbage.collection_timeout[GC_QUEUE_CHECK] = 1 MINUTE //Clear it, just in case cached_contents.Cut() + var/list/queues_we_care_about = list() + // All up to harddel + for(var/i in 1 to GC_QUEUE_HARDDELETE - 1) + queues_we_care_about += i + //Now that we've qdel'd everything, let's sleep until the gc has processed all the shit we care about - var/time_needed = SSgarbage.collection_timeout[GC_QUEUE_CHECK] + // + 2 seconds to ensure that everything gets in the queue. + var/time_needed = 2 SECONDS + for(var/index in queues_we_care_about) + time_needed += SSgarbage.collection_timeout[index] + var/start_time = world.time + var/real_start_time = REALTIMEOFDAY var/garbage_queue_processed = FALSE sleep(time_needed) while(!garbage_queue_processed) - var/list/queue_to_check = SSgarbage.queues[GC_QUEUE_CHECK] - //How the hell did you manage to empty this? Good job! - if(!length(queue_to_check)) - garbage_queue_processed = TRUE - break + var/oldest_packet_creation = INFINITY + for(var/index in queues_we_care_about) + var/list/queue_to_check = SSgarbage.queues[index] + if(!length(queue_to_check)) + continue + + var/list/oldest_packet = queue_to_check[1] + //Pull out the time we inserted at + var/qdeld_at = oldest_packet[GC_QUEUE_ITEM_GCD_DESTROYED] + + oldest_packet_creation = min(qdeld_at, oldest_packet_creation) - var/list/oldest_packet = queue_to_check[1] - //Pull out the time we deld at - var/qdeld_at = oldest_packet[1] //If we've found a packet that got del'd later then we finished, then all our shit has been processed - if(qdeld_at > start_time) + if(oldest_packet_creation > start_time && !length(SSgarbage.queues[GC_QUEUE_HARDDELETE])) garbage_queue_processed = TRUE break - if(world.time > start_time + time_needed + 30 MINUTES) //If this gets us gitbanned I'm going to laugh so hard + if(REALTIMEOFDAY > real_start_time + time_needed + 50 MINUTES) //If this gets us gitbanned I'm going to laugh so hard TEST_FAIL("Something has gone horribly wrong, the garbage queue has been processing for well over 30 minutes. What the hell did you do") break @@ -182,12 +196,12 @@ GLOBAL_VAR_INIT(running_create_and_destroy, FALSE) for(var/path in cache_for_sonic_speed) var/fails = cache_for_sonic_speed[path] if(fails & BAD_INIT_NO_HINT) - TEST_FAIL("[path] didn't return an Initialize hint") + TEST_FAIL("[path] didn't return an Initialize() hint") if(fails & BAD_INIT_QDEL_BEFORE) - TEST_FAIL("[path] qdel'd in New()") + TEST_FAIL("[path] qdeleted before Initialize()") if(fails & BAD_INIT_SLEPT) TEST_FAIL("[path] slept during Initialize()") SSticker.delay_end = FALSE //This shouldn't be needed, but let's be polite - SSgarbage.collection_timeout[GC_QUEUE_HARDDELETE] = 10 SECONDS + SSgarbage.collection_timeout[GC_QUEUE_CHECK] = GC_CHECK_QUEUE diff --git a/code/modules/unit_tests/dcs_get_id_from_elements.dm b/code/modules/unit_tests/dcs_get_id_from_elements.dm new file mode 100644 index 000000000000..3a6e1447657c --- /dev/null +++ b/code/modules/unit_tests/dcs_get_id_from_elements.dm @@ -0,0 +1,46 @@ +/// Tests that DCS' GetIdFromArguments works as expected with standard and odd cases +/datum/unit_test/dcs_get_id_from_arguments + +/datum/unit_test/dcs_get_id_from_arguments/Run() + assert_equal(list(1), list(1)) + assert_equal(list(1, 2), list(1, 2)) + assert_equal(list(src), list(src)) + + assert_equal( + list(a = "x", b = "y", c = "z"), + list(b = "y", a = "x", c = "z"), + list(c = "z", a = "x", b = "y"), + ) + + TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, 2)), get_id_from_arguments(list(2, 1)), "Swapped arguments should not return the same id") + TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, a = "x")), get_id_from_arguments(list(1)), "Named arguments were ignored when creating ids") + TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(1, a = "x")), get_id_from_arguments(list(a = "x")), "Unnamed arguments were ignored when creating ids") + TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list(src)), get_id_from_arguments(list(world)), "References to different datums should not return the same id") + + TEST_ASSERT_NOTEQUAL(get_id_from_arguments(list()), SSdcs.GetIdFromArguments(list(/datum/element/dcs_get_id_from_arguments_mock_element2)), "Different elements should not match the same id") + +/datum/unit_test/dcs_get_id_from_arguments/proc/assert_equal(reference, ...) + var/result = get_id_from_arguments(reference) + + // Start at 1 so the 2nd argument is 2 + var/index = 1 + + for (var/other_case in args) + index += 1 + + var/other_result = get_id_from_arguments(other_case) + + if (other_result == result) + continue + + TEST_FAIL("Case #[index] produces a different GetIdFromArguments result from the first. [other_result] != [result]") + +/datum/unit_test/dcs_get_id_from_arguments/proc/get_id_from_arguments(list/arguments) + return SSdcs.GetIdFromArguments(list(/datum/element/dcs_get_id_from_arguments_mock_element) + arguments) + +// Necessary because GetIdFromArguments uses id_arg_index from an element type +/datum/element/dcs_get_id_from_arguments_mock_element + id_arg_index = 2 + +/datum/element/dcs_get_id_from_arguments_mock_element2 + id_arg_index = 2 diff --git a/code/modules/unit_tests/designs.dm b/code/modules/unit_tests/designs.dm index 064561cdf77d..3029ce6bb4c6 100644 --- a/code/modules/unit_tests/designs.dm +++ b/code/modules/unit_tests/designs.dm @@ -3,11 +3,8 @@ /datum/unit_test/designs/Run() //Can't use allocate because of bug with certain datums var/datum/design/default_design = new /datum/design() - var/datum/design/surgery/default_design_surgery = new /datum/design/surgery() for(var/datum/design/current_design as anything in SStech.designs) - if (istype(current_design, /datum/design/surgery)) //We are checking surgery design separatly later since they work differently - continue if (current_design.id == DESIGN_ID_IGNORE) //Don't check designs with ignore ID continue if (isnull(current_design.name) || current_design.name == default_design.name) //Designs with ID must have non default/null Name @@ -18,18 +15,6 @@ else if (!isnull(current_design.build_path) || !isnull(current_design.build_path)) // //Design requires no materials but creates stuff TEST_FAIL("Design [current_design.type] requires NO materials but has build_path or make_reagents set") - for(var/path in subtypesof(/datum/design/surgery)) - var/datum/design/surgery/current_design = SStech.designs_by_type[path] - - if (isnull(current_design.id) || current_design.id == default_design_surgery.id) //Check if ID was not set - TEST_FAIL("Surgery Design [current_design.type] has no ID set") - if (isnull(current_design.id) || current_design.name == default_design_surgery.name) //Check if name was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null name var") - if (isnull(current_design.desc) || current_design.desc == default_design_surgery.desc) //Check if desc was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null desc var") - if (isnull(current_design.surgery) || current_design.surgery == default_design_surgery.surgery) //Check if surgery was not set - TEST_FAIL("Surgery Design [current_design.type] has default or null surgery var") - // Make sure all fabricator designs are sane. /datum/unit_test/fab_sanity diff --git a/code/modules/unit_tests/egg_glands.dm b/code/modules/unit_tests/egg_glands.dm index 7bb947064130..abee775cbe17 100644 --- a/code/modules/unit_tests/egg_glands.dm +++ b/code/modules/unit_tests/egg_glands.dm @@ -5,9 +5,9 @@ var/obj/item/food/egg/egg = allocate(/obj/item/food/egg) for(var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent)) - if(initial(reagent_type.abstract_type) == reagent_type) + if(isabstract(reagent_type)) continue - if(!(initial(reagent_type.chemical_flags) & REAGENT_CAN_BE_SYNTHESIZED)) + if((initial(reagent_type.chemical_flags) & REAGENT_SPECIAL)) continue try diff --git a/code/modules/unit_tests/emoting.dm b/code/modules/unit_tests/emoting.dm index 3889e062bdad..2d102a94617b 100644 --- a/code/modules/unit_tests/emoting.dm +++ b/code/modules/unit_tests/emoting.dm @@ -11,9 +11,7 @@ human.say("*beep") TEST_ASSERT_EQUAL(emotes_used, 1, "Human beeped, when that should be restricted to silicons") - human.setOxyLoss(140) - - TEST_ASSERT(human.stat != CONSCIOUS, "Human is somehow conscious after receiving suffocation damage") + human.set_stat(UNCONSCIOUS) human.say("*shrug") TEST_ASSERT_EQUAL(emotes_used, 1, "Human shrugged while unconscious") diff --git a/code/modules/unit_tests/find_reference_sanity.dm b/code/modules/unit_tests/find_reference_sanity.dm index 8bd2a14dbf5f..e282153a99ca 100644 --- a/code/modules/unit_tests/find_reference_sanity.dm +++ b/code/modules/unit_tests/find_reference_sanity.dm @@ -15,6 +15,8 @@ return ..() /atom/movable/ref_test + // Gotta make sure we do a full check + references_to_clear = INFINITY var/atom/movable/ref_test/self_ref /atom/movable/ref_test/Destroy(force) @@ -27,12 +29,10 @@ SSgarbage.should_save_refs = TRUE //Sanity check - #if DM_VERSION >= 515 var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 3, "Should be: test references: 0 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(testbed, "Sanity Check", search_time = 1) //We increment search time to get around an optimization - TEST_ASSERT(!victim.found_refs.len, "The ref-tracking tool found a ref where none existed") + victim.DoSearchVar(testbed, "Sanity Check") //We increment search time to get around an optimization + TEST_ASSERT(!LAZYLEN(victim.found_refs), "The ref-tracking tool found a ref where none existed") SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_baseline/Run() @@ -45,15 +45,16 @@ testbed.test_list += victim testbed.test_assoc_list["baseline"] = victim - #if DM_VERSION >= 515 + var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(testbed, "First Run", search_time = 2) - TEST_ASSERT(victim.found_refs["test"], "The ref-tracking tool failed to find a regular value") - TEST_ASSERT(victim.found_refs[testbed.test_list], "The ref-tracking tool failed to find a list entry") - TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list value") + victim.DoSearchVar(testbed, "First Run") + + TEST_ASSERT(LAZYACCESS(victim.found_refs, "test"), "The ref-tracking tool failed to find a regular value") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_list), "The ref-tracking tool failed to find a list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find an assoc list value") + SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_exotic/Run() @@ -66,16 +67,16 @@ testbed.vis_contents += victim testbed.test_assoc_list[victim] = TRUE - #if DM_VERSION >= 515 var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(testbed, "Second Run", search_time = 3) + + victim.DoSearchVar(testbed, "Second Run") //This is another sanity check - TEST_ASSERT(!victim.found_refs[testbed.overlays], "The ref-tracking tool found an overlays entry? That shouldn't be possible") - TEST_ASSERT(victim.found_refs[testbed.vis_contents], "The ref-tracking tool failed to find a vis_contents entry") - TEST_ASSERT(victim.found_refs[testbed.test_assoc_list], "The ref-tracking tool failed to find an assoc list key") + TEST_ASSERT(!LAZYACCESS(victim.found_refs, testbed.overlays), "The ref-tracking tool found an overlays entry? That shouldn't be possible") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.vis_contents), "The ref-tracking tool failed to find a vis_contents entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find an assoc list key") + SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_esoteric/Run() @@ -90,15 +91,17 @@ var/list/to_find_assoc = list(victim) testbed.test_assoc_list["Nesting"] = to_find_assoc - #if DM_VERSION >= 515 + var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 6, "Should be: test references: 3 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(victim, "Third Run Self", search_time = 4) - victim.DoSearchVar(testbed, "Third Run Testbed", search_time = 4) - TEST_ASSERT(victim.found_refs["self_ref"], "The ref-tracking tool failed to find a self reference") - TEST_ASSERT(victim.found_refs[to_find], "The ref-tracking tool failed to find a nested list entry") - TEST_ASSERT(victim.found_refs[to_find_assoc], "The ref-tracking tool failed to find a nested assoc list entry") + + victim.DoSearchVar(victim, "Third Run Self") + victim.DoSearchVar(testbed, "Third Run Testbed") + + TEST_ASSERT(LAZYACCESS(victim.found_refs, "self_ref"), "The ref-tracking tool failed to find a self reference") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find), "The ref-tracking tool failed to find a nested list entry") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_assoc), "The ref-tracking tool failed to find a nested assoc list entry") + SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_null_key_entry/Run() @@ -108,12 +111,12 @@ //Calm before the storm testbed.test_assoc_list = list(null = victim) - #if DM_VERSION >= 515 + var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 4, "Should be: test references: 1 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(testbed, "Fourth Run", search_time = 5) - TEST_ASSERT(testbed.test_assoc_list, "The ref-tracking tool failed to find a null key'd assoc list entry") + + victim.DoSearchVar(testbed, "Fourth Run") + TEST_ASSERT(LAZYACCESS(victim.found_refs, testbed.test_assoc_list), "The ref-tracking tool failed to find a null key'd assoc list entry") /datum/unit_test/find_reference_assoc_investigation/Run() var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) @@ -126,19 +129,20 @@ var/list/to_find_null_assoc_nested = list(victim) testbed.test_assoc_list[null] = to_find_null_assoc_nested - #if DM_VERSION >= 515 + var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 5, "Should be: test references: 2 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(testbed, "Fifth Run", search_time = 6) - TEST_ASSERT(victim.found_refs[to_find_in_key], "The ref-tracking tool failed to find a nested assoc list key") - TEST_ASSERT(victim.found_refs[to_find_null_assoc_nested], "The ref-tracking tool failed to find a null key'd nested assoc list entry") + + victim.DoSearchVar(testbed, "Fifth Run") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_in_key), "The ref-tracking tool failed to find a nested assoc list key") + TEST_ASSERT(LAZYACCESS(victim.found_refs, to_find_null_assoc_nested), "The ref-tracking tool failed to find a null key'd nested assoc list entry") + SSgarbage.should_save_refs = FALSE /datum/unit_test/find_reference_static_investigation/Run() var/atom/movable/ref_test/victim = allocate(/atom/movable/ref_test) var/atom/movable/ref_holder/testbed = allocate(/atom/movable/ref_holder) - pass(testbed) + noop(testbed) //I'm not *sure* why this is here, but cargocult :smug: SSgarbage.should_save_refs = TRUE //Lets check static vars now, since those can be a real headache @@ -150,11 +154,11 @@ for(var/key in global.vars) global_vars[key] = global.vars[key] - #if DM_VERSION >= 515 + var/refcount = refcount(victim) TEST_ASSERT_EQUAL(refcount, 5, "Should be: test references: 2 + baseline references: 3 (victim var,loc,allocated list)") - #endif - victim.DoSearchVar(global_vars, "Sixth Run", search_time = 7) - TEST_ASSERT(victim.found_refs[global_vars], "The ref-tracking tool failed to find a natively global variable") + victim.DoSearchVar(global_vars, "Sixth Run") + + TEST_ASSERT(LAZYACCESS(victim.found_refs, global_vars), "The ref-tracking tool failed to find a natively global variable") SSgarbage.should_save_refs = FALSE diff --git a/code/modules/unit_tests/get_turf_pixel.dm b/code/modules/unit_tests/get_turf_pixel.dm index 8cd292d3b6c0..3583ff20994b 100644 --- a/code/modules/unit_tests/get_turf_pixel.dm +++ b/code/modules/unit_tests/get_turf_pixel.dm @@ -7,5 +7,9 @@ var/turf/north = locate(1, world.maxy, run_loc_floor_bottom_left.z) //hes really long, so hes really good at peaking over the edge of the map - var/mob/living/simple_animal/hostile/megafauna/colossus/long_larry = allocate(/mob/living/simple_animal/hostile/megafauna/colossus, north) - TEST_ASSERT(istype(get_turf_pixel(long_larry), /turf), "get_turf_pixel() isnt clamping a mob whos sprite is above the bounds of the world inside of the map.") + var/obj/effect/turfpixeltester/E = allocate(/obj/effect/turfpixeltester, north) + TEST_ASSERT(istype(get_turf_pixel(E), /turf), "get_turf_pixel() isnt clamping an atom whos sprite is above the bounds of the world inside of the map.") + +/obj/effect/turfpixeltester + icon = 'icons/mob/lavaland/96x96megafauna.dmi' + icon_state = "bubblegum" diff --git a/code/modules/unit_tests/grabbing.dm b/code/modules/unit_tests/grabbing.dm new file mode 100644 index 000000000000..c712a01e5611 --- /dev/null +++ b/code/modules/unit_tests/grabbing.dm @@ -0,0 +1,82 @@ +/datum/unit_test/grab_basic/Run() + var/mob/living/carbon/human/assailant = allocate(__IMPLIED_TYPE__) + var/mob/living/carbon/human/victim = allocate(__IMPLIED_TYPE__) + + victim.set_combat_mode(TRUE) + assailant.try_make_grab(victim) + + var/obj/item/hand_item/grab/the_grab = assailant.is_grabbing(victim) + TEST_ASSERT(!isnull(the_grab), "Assailant failed to grab victim.") + + // Test upgrading works + var/expected_grab_level = the_grab.current_grab.upgrab + assailant.set_combat_mode(TRUE) + + while(expected_grab_level) + if(istype(the_grab.current_grab, /datum/grab/normal/struggle)) + // Struggle grabs are special and need to be treated as such. + var/slept = world.time + while(!(the_grab.done_struggle || world.time > slept + 2 SECONDS)) + TEST_ASSERT(!QDELETED(the_grab), "Grab object qdeleted unexpectedly while waiting for struggle to finish.") + sleep(world.tick_lag) + + if(world.time > slept + 2 SECONDS) + TEST_FAIL("Struggle grab resolution timed out") + return + else + the_grab.attack_self(assailant) + + TEST_ASSERT(!QDELETED(the_grab), "Grab object qdeleted unexpectedly.") + + TEST_ASSERT(the_grab.current_grab == expected_grab_level, "Upgraded grab is not at the expected grab level, expected: [expected_grab_level] | got: [the_grab.current_grab || "NULL"]") + + expected_grab_level = the_grab.current_grab.upgrab + COOLDOWN_RESET(the_grab, upgrade_cd) + + // Test downgrading works + assailant.set_combat_mode(FALSE) + expected_grab_level = the_grab.current_grab.downgrab + + while(TRUE) + the_grab.attack_self(assailant) + + if(expected_grab_level) + TEST_ASSERT(!QDELETED(the_grab), "Grab object qdeleted unexpectedly.") + TEST_ASSERT(the_grab.current_grab == expected_grab_level, "Downgraded grab is not at the expected grab level, expected: [expected_grab_level] | got: [the_grab.current_grab || "NULL"]") + + expected_grab_level = the_grab.current_grab.downgrab + else + QDEL_NULL(the_grab) + break + +/datum/unit_test/grab_contest/Run() + var/mob/living/carbon/human/assailant = allocate(__IMPLIED_TYPE__) + var/mob/living/carbon/human/victim = allocate(__IMPLIED_TYPE__) + var/mob/living/carbon/human/competitor = allocate(__IMPLIED_TYPE__) + + // Start off by making sure both basic grabs work + assailant.try_make_grab(victim) + TEST_ASSERT(assailant.is_grabbing(victim), "Assailant failed to grab victim.") + + competitor.try_make_grab(victim) + TEST_ASSERT(competitor.is_grabbing(victim), "Competitor failed to grab victim.") + TEST_ASSERT(assailant.is_grabbing(victim), "Competitor grab removed initial grab.") + + // Ensure that raising grab level correctly deletes opposition + var/obj/item/hand_item/grab/assailant_grab = assailant.is_grabbing(victim) + assailant.set_combat_mode(TRUE) + assailant_grab.attack_self(assailant) + + TEST_ASSERT(!competitor.is_grabbing(victim), "Competitor is still grabbing victim after initial grabber raised to aggressive.") + + // Ensure that grabbing with a higher pull force replaces the initial grab + competitor.pull_force = assailant.pull_force + 1 + competitor.try_make_grab(victim) + + TEST_ASSERT(competitor.is_grabbing(victim), "Competitor failed to grab victim despite having a superior pull force.") + TEST_ASSERT(!assailant.is_grabbing(victim), "Initial grabber still has a grip on victim despite a superior pull force taking over.") + + // Ensure that a weaker pull force wont take away + assailant.try_make_grab(victim) + TEST_ASSERT(!assailant.is_grabbing(victim), "Initial grabber was able to re-grab victim despite having a weaker pull force.") + diff --git a/code/modules/unit_tests/heretic_rituals.dm b/code/modules/unit_tests/heretic_rituals.dm index 316d2e97bff9..4dd16693fae7 100644 --- a/code/modules/unit_tests/heretic_rituals.dm +++ b/code/modules/unit_tests/heretic_rituals.dm @@ -83,7 +83,7 @@ // Making it here means the ritual was a success. // Let's check all the atoms nearby to see if we got what we wanted. - var/list/atom/movable/nearby_atoms = range(1, our_heretic) + var/list/atom/movable/nearby_atoms = orange(1, our_heretic) nearby_atoms -= our_heretic // Our dude is supposed to be there nearby_atoms -= our_rune // Same with our rune diff --git a/code/modules/unit_tests/hulk.dm b/code/modules/unit_tests/hulk.dm new file mode 100644 index 000000000000..52706e9ac73f --- /dev/null +++ b/code/modules/unit_tests/hulk.dm @@ -0,0 +1,44 @@ +/// Tests hulk attacking over normal attacking +/datum/unit_test/hulk_attack + var/hulk_hits = 0 + var/hand_hits = 0 + +/datum/unit_test/hulk_attack/Run() + var/mob/living/carbon/human/hulk = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + + + RegisterSignal(dummy, COMSIG_ATOM_HULK_ATTACK, PROC_REF(hulk_sig_fire)) + RegisterSignal(dummy, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hand_sig_fire)) + + hulk.dna.add_mutation(/datum/mutation/human/hulk) + hulk.set_combat_mode(TRUE) + hulk.ClickOn(dummy) + + TEST_ASSERT_EQUAL(hulk_hits, 1, "Hulk should have hit the dummy once.") + TEST_ASSERT_EQUAL(hand_hits, 0, "Hulk should not have hit the dummy with attack_hand.") + TEST_ASSERT(dummy.getBruteLoss(), "Dummy should have taken brute damage from being hulk punched.") + +/datum/unit_test/hulk_attack/proc/hulk_sig_fire() + SIGNAL_HANDLER + hulk_hits += 1 + +/datum/unit_test/hulk_attack/proc/hand_sig_fire() + SIGNAL_HANDLER + hand_hits += 1 + +/// Tests that hulks aren't given rapid attacks from rapid attack gloves +/datum/unit_test/hulk_north_star + +/datum/unit_test/hulk_north_star/Run() + var/mob/living/carbon/human/hulk = allocate(/mob/living/carbon/human/consistent) + var/mob/living/carbon/human/dummy = allocate(/mob/living/carbon/human/consistent) + var/obj/item/clothing/gloves/rapid/fotns = allocate(/obj/item/clothing/gloves/rapid) + + hulk.equip_to_appropriate_slot(fotns) + hulk.dna.add_mutation(/datum/mutation/human/hulk) + hulk.set_combat_mode(TRUE) + hulk.ClickOn(dummy) + + TEST_ASSERT_NOTEQUAL(hulk.next_move, world.time + CLICK_CD_RAPID, "Hulk should not gain the effects of the Fists of the North Star.") + TEST_ASSERT_EQUAL(hulk.next_move, world.time + CLICK_CD_MELEE, "Hulk click cooldown was a value not expected.") diff --git a/code/modules/unit_tests/knockoff_component.dm b/code/modules/unit_tests/knockoff_component.dm new file mode 100644 index 000000000000..19054685bccd --- /dev/null +++ b/code/modules/unit_tests/knockoff_component.dm @@ -0,0 +1,81 @@ +/// Test that the knockoff component will properly cause something +/// with it applied to be knocked off when it should be. +/datum/unit_test/knockoff_component + +/datum/unit_test/knockoff_component/Run() + var/mob/living/carbon/human/wears_the_glasses = allocate(/mob/living/carbon/human) + var/mob/living/carbon/human/shoves_the_guy = allocate(/mob/living/carbon/human) + + // No pre-existing items have a 100% chance of being knocked off, + // so we'll just apply it to a relatively generic item (glasses) + var/obj/item/clothing/glasses/sunglasses/glasses = allocate(/obj/item/clothing/glasses/sunglasses) + glasses.AddComponent(/datum/component/knockoff, \ + knockoff_chance = 100, \ + target_zones = list(BODY_ZONE_PRECISE_EYES), \ + slots_knockoffable = glasses.slot_flags) + + // Save this for later, since we wanna reset our dummy positions even after they're shoved about. + var/turf/right_of_shover = locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z) + + // Position shover (bottom left) and the shovee (1 tile right of bottom left, no wall behind them) + shoves_the_guy.forceMove(run_loc_floor_bottom_left) + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy failed to equip the glasses.") + + wears_the_glasses.status_flags &= ~CANKNOCKDOWN //Rng knockdowns aren't apart of this equation + + // Test disarm, targeting chest + // A disarm targeting chest should not knockdown or lose glasses + shoves_the_guy.zone_selected = BODY_ZONE_CHEST + shoves_the_guy.disarm(wears_the_glasses) + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy lost their glasses even thought they were disarmed targeting the wrong slot.") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test disarm, targeting eyes + // A disarm targeting eyes should not knockdown but should lose glasses + shoves_the_guy.zone_selected = BODY_ZONE_PRECISE_EYES + shoves_the_guy.disarm(wears_the_glasses) + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they were shoved targeting the correct zone.") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + wears_the_glasses.status_flags |= CANKNOCKDOWN + + // Test Knockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.Knockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after Knockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by Knockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test AdjustKnockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.AdjustKnockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after AdjustKnockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by AdjustKnockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test SetKnockdown() + // Any amount of positive Kockdown should lose glasses + wears_the_glasses.SetKnockdown(1 SECONDS) + TEST_ASSERT(wears_the_glasses.IsKnockdown(), "Dummy wasn't knocked down after SetKnockdown() was called.") + TEST_ASSERT(wears_the_glasses.glasses != glasses, "Dummy kept their glasses, even though they knocked down by SetKnockdown().") + + set_glasses_wearer(wears_the_glasses, right_of_shover, glasses) + + // Test a negative value applied of Knockdown (AdjustKnockdown, SetKnockdown, and Knockdown should all act the same here) + // Any amount of negative Kockdown should not cause the glasses to be lost + wears_the_glasses.AdjustKnockdown(-1 SECONDS) + TEST_ASSERT(!wears_the_glasses.IsKnockdown(), "Dummy was knocked down after AdjustKnockdown() was called with a negative value.") + TEST_ASSERT(wears_the_glasses.glasses == glasses, "Dummy lost their glasses, even though AdjustKnockdown() was called with a negative value.") + +/// Helper to reset the glasses dummy back to it's original position, clear knockdown, and return glasses (if gone) +/datum/unit_test/knockoff_component/proc/set_glasses_wearer(mob/living/carbon/human/wearer, turf/reset_to, obj/item/clothing/glasses/reset_worn) + wearer.forceMove(reset_to) + wearer.SetKnockdown(0 SECONDS) + if(!wearer.glasses) + wearer.equip_to_slot_if_possible(reset_worn, ITEM_SLOT_EYES) diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index 656ca8d09075..df87672b2775 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -5,10 +5,9 @@ var/mob/living/carbon/human/human = allocate(/mob/living/carbon/human) var/list/blacklisted_reagents = list( - /datum/reagent/eigenstate, //Creates clones after a delay which get into other tests ) for (var/datum/reagent/reagent_type as anything in subtypesof(/datum/reagent)) - if(initial(reagent_type.abstract_type) == reagent_type) //Are we abstract? + if(isabstract(reagent_type)) //Are we abstract? log_test(TEST_OUTPUT_YELLOW("Skipping abstract reagent [reagent_type]")) continue if(reagent_type in blacklisted_reagents) @@ -31,8 +30,8 @@ var/obj/item/reagent_containers/pill/pill = allocate(/obj/item/reagent_containers/pill) var/datum/reagent/drug/methamphetamine/meth = /datum/reagent/drug/methamphetamine - // Give them enough meth to be consumed in 2 metabolizations - pill.reagents.add_reagent(meth, 1.9 * initial(meth.metabolization_rate) * SSMOBS_DT) + // Give them enough meth to be consumed in 2 metabolizations. + pill.reagents.add_reagent(meth, initial(meth.metabolization_rate) * 2) pill.attack(user, user) user.Life(SSMOBS_DT) @@ -84,13 +83,14 @@ pill.reagents.add_reagent(meth.type, 5) pill.attack(pill_user, pill_user) - // Set the metabolism efficiency to 1.0 so it transfers all reagents to the body in one go. - var/obj/item/organ/stomach/pill_belly = pill_user.getorganslot(ORGAN_SLOT_STOMACH) - pill_belly.metabolism_efficiency = 1 + // Set the metabolism it transfers all reagents to the body in one go. + var/datum/reagents/R = pill_user.get_ingested_reagents() + var/datum/reagent/M = R.get_reagent(/datum/reagent/drug/methamphetamine) + M.ingest_met = INFINITY pill_user.Life() - TEST_ASSERT(pill_user.mind.addiction_points[addiction_type_to_check], "User did not gain addiction points after metabolizing meth") + TEST_ASSERT(pill_user.mind.addiction_points[addiction_type_to_check], "User did not gain addiction points after metabolizing ingested meth") // Then injected metabolism syringe.volume = 5 @@ -100,7 +100,7 @@ syringe_user.Life() - TEST_ASSERT(syringe_user.mind.addiction_points[addiction_type_to_check], "User did not gain addiction points after metabolizing meth") + TEST_ASSERT(syringe_user.mind.addiction_points[addiction_type_to_check], "User did not gain addiction points after metabolizing injected meth") // One half syringe syringe.reagents.remove_all() @@ -113,9 +113,8 @@ pill_two.attack(pill_syringe_user, pill_syringe_user) syringe.melee_attack_chain(pill_syringe_user, pill_syringe_user) - // Set the metabolism efficiency to 1.0 so it transfers all reagents to the body in one go. - pill_belly = pill_syringe_user.getorganslot(ORGAN_SLOT_STOMACH) - pill_belly.metabolism_efficiency = 1 + // Set the metabolism so it transfers all reagents to the body in one go. + pill_syringe_user.get_ingested_reagents().get_reagent(/datum/reagent/drug/methamphetamine).ingest_met = INFINITY pill_syringe_user.Life() diff --git a/code/modules/unit_tests/modsuit.dm b/code/modules/unit_tests/modsuit.dm index 42c464e6d6cf..ed149ae992fa 100644 --- a/code/modules/unit_tests/modsuit.dm +++ b/code/modules/unit_tests/modsuit.dm @@ -7,10 +7,6 @@ for(var/modpath in paths) var/obj/item/mod/control/mod = new modpath() TEST_ASSERT(mod.theme, "[modpath] spawned without a theme.") - TEST_ASSERT(mod.helmet, "[modpath] spawned without a helmet.") - TEST_ASSERT(mod.chestplate, "[modpath] spawned without a chestplate.") - TEST_ASSERT(mod.gauntlets, "[modpath] spawned without gauntlets.") - TEST_ASSERT(mod.boots, "[modpath] spawned without boots.") var/list/modules = list() var/complexity_max = mod.complexity_max var/complexity = 0 @@ -19,6 +15,7 @@ complexity += module.complexity TEST_ASSERT(complexity <= complexity_max, "[modpath] starting modules reach above max complexity.") TEST_ASSERT(!is_type_in_list(module, mod.theme.module_blacklist), "[modpath] starting modules are in [mod.theme.type] blacklist.") + TEST_ASSERT(module.has_required_parts(mod.mod_parts), "[modpath] initial module [module.type] is not supported by its parts.") for(var/obj/item/mod/module/module_to_check as anything in modules) TEST_ASSERT(!is_type_in_list(module, module_to_check.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") TEST_ASSERT(!is_type_in_list(module_to_check, module.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") diff --git a/code/modules/unit_tests/movement_order_sanity.dm b/code/modules/unit_tests/movement_order_sanity.dm new file mode 100644 index 000000000000..a9f677b24980 --- /dev/null +++ b/code/modules/unit_tests/movement_order_sanity.dm @@ -0,0 +1,49 @@ +/datum/unit_test/movement_order_sanity/Run() + var/obj/movement_tester/test_obj = allocate(__IMPLIED_TYPE__, run_loc_floor_bottom_left) + var/list/movement_cache = test_obj.movement_order + + var/obj/movement_interceptor/interceptor = allocate(__IMPLIED_TYPE__) + interceptor.forceMove(locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + var/did_move = step(test_obj, EAST) + + TEST_ASSERT(did_move, "Object did not move at all.") + TEST_ASSERT(QDELETED(test_obj), "Object was not qdeleted.") + TEST_ASSERT(length(movement_cache) == 4, "Movement order length was not the expected value of 4, got: [length(movement_cache)].\nMovement Log\n[jointext(movement_cache, "\n")]") + + // Due to when the logging takes place, it will always be Move Move > Moved Moved instead of the reality of + // Move > Moved > Move > Moved + TEST_ASSERT(findtext(movement_cache[1], "Moving from"),"Movement step 1 was not a Move attempt.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[2], "Moving from"),"Movement step 2 was not a Move attempt.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[3], "Moved from"),"Movement step 3 was not a Moved() call.\nMovement Log\n[jointext(movement_cache, "\n")]") + TEST_ASSERT(findtext(movement_cache[4], "Moved from"),"Movement step 4 was not a Moved() call.\nMovement Log\n[jointext(movement_cache, "\n")]") + +/obj/movement_tester + name = "movement debugger" + var/list/movement_order = list() + +/obj/movement_tester/Move(atom/newloc, direct, glide_size_override, z_movement_flags) + movement_order += "Moving from ([loc.x], [loc.y]) to [newloc ? "([newloc.x], [newloc.y])" : "NULL"]" + return ..() + +/obj/movement_tester/doMove(atom/destination) + movement_order += "Abstractly Moving from ([loc.x], [loc.y]) to [destination ? "([destination.x], [destination.y])" : "NULL"]" + return ..() + +/obj/movement_tester/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + movement_order += "Moved from ([old_loc.x], [old_loc.y]) to [loc ? "([loc.x], [loc.y])" : "NULL"]" + return ..() + +/obj/movement_interceptor + name = "movement interceptor" + +/obj/movement_interceptor/Initialize(mapload) + . = ..() + AddElement(/datum/element/connect_loc, list(COMSIG_ATOM_ENTERED = PROC_REF(on_crossed))) + +/obj/movement_interceptor/proc/on_crossed(datum/source, atom/movable/arrived) + SIGNAL_HANDLER + if(src == arrived) + return + + qdel(arrived) diff --git a/code/modules/unit_tests/novaflower_burn.dm b/code/modules/unit_tests/novaflower_burn.dm index c54cb9d6d152..fbc1e582d6b8 100644 --- a/code/modules/unit_tests/novaflower_burn.dm +++ b/code/modules/unit_tests/novaflower_burn.dm @@ -21,6 +21,7 @@ // And give them the plant safe trait so we don't have to worry about attacks being cancelled ADD_TRAIT(botanist, TRAIT_PLANT_SAFE, "unit_test") + botanist.set_combat_mode(TRUE) // Now, let's get a smack with the novaflower and see what happens. weapon.melee_attack_chain(botanist, victim) diff --git a/code/modules/unit_tests/ntnetwork_tests.dm b/code/modules/unit_tests/ntnetwork_tests.dm deleted file mode 100644 index 9ae9efe02874..000000000000 --- a/code/modules/unit_tests/ntnetwork_tests.dm +++ /dev/null @@ -1,68 +0,0 @@ -/datum/unit_test/ntnetwork - var/list/valid_network_names = list("SS13.ATMOS.SCRUBBERS.SM", "DEEPSPACE.HYDRO.PLANT", "SINDIE.STINKS.BUTT") - - var/list/invalid_network_names = list(".SS13.BOB", "SS13.OHMAN.", "SS13.HAS A SPACE" ) - - var/list/valid_network_trees = list(list("SS13","ATMOS","SCRUBBERS","SM"),list("DEEPSPACE","HYDRO","PLANT"), list("SINDIE","STINKS","BUTT")) - - var/list/network_roots = list( - __STATION_NETWORK_ROOT, - __CENTCOM_NETWORK_ROOT, - __SYNDICATE_NETWORK_ROOT, - __LIMBO_NETWORK_ROOT) - - var/list/random_words_for_testing = list( - __NETWORK_TOOLS, __NETWORK_REMOTES, __NETWORK_AIRLOCKS, - __NETWORK_DOORS, __NETWORK_ATMOS, __NETWORK_SCUBBERS, - __NETWORK_AIRALARMS, __NETWORK_CONTROL, __NETWORK_STORAGE, - __NETWORK_CARGO, __NETWORK_BOTS, __NETWORK_COMPUTER, - __NETWORK_CARDS) - - var/number_of_names_to_test = 50 - var/length_of_test_network = 5 - -/datum/unit_test/proc/mangle_word(word) - var/len = length(word) - var/space_pos = round(len/2) - word = copytext(word,1,space_pos) + " " + copytext(word,space_pos,len) - return word - -/datum/unit_test/ntnetwork/Run() - // First check if name checks work - for(var/name in valid_network_names) - TEST_ASSERT(verify_network_name(name), "Network name ([name]) marked as invalid but supposed to valid") - - for(var/name in invalid_network_names) - TEST_ASSERT(!verify_network_name(name), "Network name ([name]) marked as valid but supposed to be invalid") - - // Next check if we can pack and unpack network names - for(var/i in 1 to valid_network_names.len) - var/name = valid_network_names[i] - var/list/name_list = SSnetworks.network_string_to_list(name) - TEST_ASSERT(compare_list(name_list, valid_network_trees[i]), "Network name ([name]) did not unpack into a proper list") - for(var/i in 1 to valid_network_trees.len) - var/list/name_list = valid_network_trees[i] - var/name = SSnetworks.network_list_to_string(name_list) - TEST_ASSERT_EQUAL(name, valid_network_names[i], "Network name ([name]) did not pack into a proper string") - - // Ok, we know we can verify network names now, and that we can pack and unpack. Lets try making some random good names - var/list/generated_network_names = list() - var/test_string - for(var/i in 1 to number_of_names_to_test) - var/list/builder = list() - builder += pick(network_roots) - for(var/j in 1 to length_of_test_network) - builder += pick(random_words_for_testing) - test_string = SSnetworks.network_list_to_string(builder) - var/name_fix = simple_network_name_fix(test_string) - TEST_ASSERT_EQUAL(name_fix, test_string, "Network name ([test_string]) was not fixed correctly to ([name_fix])") - generated_network_names += name_fix // save for future - // test badly generated names - for(var/i in 1 to number_of_names_to_test) - var/list/builder = list() - builder += mangle_word(pick(network_roots)) - for(var/j in 1 to length_of_test_network) - builder += mangle_word(pick(random_words_for_testing)) - test_string = builder.Join(".") - var/name_fix = simple_network_name_fix(test_string) - TEST_ASSERT(verify_network_name(name_fix), "Network name ([test_string]) was not fixed correctly ([name_fix]) with bad name") diff --git a/code/modules/unit_tests/objectives.dm b/code/modules/unit_tests/objectives.dm index 2776ccea5f10..3acd1aa274bf 100644 --- a/code/modules/unit_tests/objectives.dm +++ b/code/modules/unit_tests/objectives.dm @@ -10,7 +10,7 @@ objectives_that_exist += value for(var/datum/traitor_objective/objective_typepath as anything in subtypesof(/datum/traitor_objective)) - if(initial(objective_typepath.abstract_type) == objective_typepath) + if(isabstract(objective_typepath)) continue if(!(objective_typepath in objectives_that_exist)) TEST_FAIL("[objective_typepath] is not in a traitor category and isn't an abstract type! Place it into a [/datum/traitor_objective_category] or remove it from code.") diff --git a/code/modules/unit_tests/orderable_item_descriptions.dm b/code/modules/unit_tests/orderable_item_descriptions.dm new file mode 100644 index 000000000000..877824546c2e --- /dev/null +++ b/code/modules/unit_tests/orderable_item_descriptions.dm @@ -0,0 +1,16 @@ +/// Makes sure that no orderable items have dynamic descriptions, if they +/// don't explicitly set a description. +/datum/unit_test/orderable_item_descriptions + +/datum/unit_test/orderable_item_descriptions/Run() + for (var/datum/orderable_item/orderable_item as anything in subtypesof(/datum/orderable_item)) + if (!isnull(initial(orderable_item.desc))) + continue + + var/item_path = initial(orderable_item.item_path) + + var/obj/item/item_instance = new item_path + var/initial_desc = initial(item_instance.desc) + + if (item_instance.desc != initial_desc) + Fail("[orderable_item] has an item ([item_path]) that has a dynamic description. [item_instance.desc] (dynamic description) != [initial_desc] (initial description)") diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm index 6f2a78600bae..5443e3001e44 100644 --- a/code/modules/unit_tests/outfit_sanity.dm +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -5,7 +5,9 @@ if (!outfit_item) { \ TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \ } \ - outfit_item.on_outfit_equip(H, FALSE, ##slot_name); \ + else { \ + outfit_item.on_outfit_equip(H, FALSE, ##slot_name); \ + }; \ } /// See #66313 and #60901. outfit_sanity used to runtime whenever you had two mergable sheets in either hand. Previously, this only had a 3% chance of occuring. Now 100%. diff --git a/code/modules/unit_tests/plantgrowth_tests.dm b/code/modules/unit_tests/plantgrowth_tests.dm index b1b213f03489..0d58bbb5382d 100644 --- a/code/modules/unit_tests/plantgrowth_tests.dm +++ b/code/modules/unit_tests/plantgrowth_tests.dm @@ -9,7 +9,7 @@ states |= icon_states('icons/obj/hydroponics/growing_mushrooms.dmi') states |= icon_states('icons/obj/hydroponics/growing_vegetables.dmi') states |= icon_states('goon/icons/obj/hydroponics.dmi') - var/list/paths = subtypesof(/obj/item/seeds) - /obj/item/seeds - typesof(/obj/item/seeds/sample) - /obj/item/seeds/lavaland + var/list/paths = subtypesof(/obj/item/seeds) - typesof(/obj/item/seeds/sample) for(var/seedpath in paths) var/obj/item/seeds/seed = new seedpath diff --git a/code/modules/unit_tests/preference_species.dm b/code/modules/unit_tests/preference_species.dm deleted file mode 100644 index 8e49f49cdd6a..000000000000 --- a/code/modules/unit_tests/preference_species.dm +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * Checks that all enabled roundstart species - * selectable within the preferences menu - * have their info / page setup correctly. - */ -/datum/unit_test/preference_species - -/datum/unit_test/preference_species/Run() - - // Go though all selectable species to see if they have their page setup correctly. - for(var/species_id in get_selectable_species()) - - var/species_type = GLOB.species_list[species_id] - var/datum/species/species = new species_type() - - // Check the species decription. - // If it's not overridden, a stack trace will be thrown (and fail the test). - // If it's null, it was improperly overriden. Fail the test. - var/species_desc = species.get_species_description() - if(isnull(species_desc)) - TEST_FAIL("Species [species] ([species_type]) is selectable, but did not properly implement get_species_description().") - - // Check the species lore. - // If it's not overridden, a stack trace will be thrown (and fail the test). - // If it's null, or returned a list, it was improperly overriden. Fail the test. - var/species_lore = species.get_species_lore() - if(isnull(species_lore)) - TEST_FAIL("Species [species] ([species_type]) is selectable, but did not properly implement get_species_lore().") - else if(!islist(species_lore)) - TEST_FAIL("Species [species] ([species_type]) is selectable, but did not properly implement get_species_lore() (Did not return a list).") - - qdel(species) diff --git a/code/modules/unit_tests/projectiles.dm b/code/modules/unit_tests/projectiles.dm index 98c7994bebe6..def311d1cd99 100644 --- a/code/modules/unit_tests/projectiles.dm +++ b/code/modules/unit_tests/projectiles.dm @@ -16,10 +16,12 @@ var/obj/projectile/loaded_bullet = loaded_casing.loaded_projectile TEST_ASSERT(loaded_bullet, "Ammo casing has no loaded bullet") + test_gun.accuracy_falloff = 0 gunner.put_in_hands(test_gun, forced=TRUE) gunner.set_combat_mode(FALSE) // just to make sure we know we're not trying to pistol-whip them var/expected_damage = loaded_bullet.damage - loaded_bullet.def_zone = BODY_ZONE_CHEST + loaded_bullet.aimed_def_zone = BODY_ZONE_CHEST + loaded_bullet.can_miss_zone = FALSE var/did_we_shoot = test_gun.afterattack(victim, gunner) TEST_ASSERT(did_we_shoot, "Gun does not appeared to have successfully fired.") TEST_ASSERT_EQUAL(victim.getBruteLoss(), expected_damage, "Victim took incorrect amount of damage, expected [expected_damage], got [victim.getBruteLoss()].") diff --git a/code/modules/unit_tests/quirks.dm b/code/modules/unit_tests/quirks.dm index 7a2ce474d5e8..17041e849257 100644 --- a/code/modules/unit_tests/quirks.dm +++ b/code/modules/unit_tests/quirks.dm @@ -5,7 +5,7 @@ var/list/used_icons = list() for (var/datum/quirk/quirk_type as anything in subtypesof(/datum/quirk)) - if (initial(quirk_type.abstract_parent_type) == quirk_type) + if (isabstract(quirk_type)) continue var/icon = initial(quirk_type.icon) diff --git a/code/modules/unit_tests/reagent_descriptions.dm b/code/modules/unit_tests/reagent_descriptions.dm index 7d212d8977b4..bce7328169d1 100644 --- a/code/modules/unit_tests/reagent_descriptions.dm +++ b/code/modules/unit_tests/reagent_descriptions.dm @@ -1,9 +1,7 @@ /datum/unit_test/reagent_must_have_description/Run() for (var/datum/reagent/reagent as anything in subtypesof(/datum/reagent)) - // Does it have one. - if(initial(reagent.description)) - continue // Abstract reagents don't need descriptions. - if(initial(reagent.abstract_type) == reagent) + // Otherwise, Does it have one. + if(isabstract(reagent) || initial(reagent.description)) continue TEST_FAIL("[reagent] has no description set and is not abstract") diff --git a/code/modules/unit_tests/reagent_id_typos.dm b/code/modules/unit_tests/reagent_id_typos.dm index 56e55ad906ca..bd6e812fb838 100644 --- a/code/modules/unit_tests/reagent_id_typos.dm +++ b/code/modules/unit_tests/reagent_id_typos.dm @@ -3,11 +3,9 @@ /datum/unit_test/reagent_id_typos /datum/unit_test/reagent_id_typos/Run() - build_chemical_reactions_lists() - - for(var/I in GLOB.chemical_reactions_list_reactant_index) - for(var/V in GLOB.chemical_reactions_list_reactant_index[I]) + for(var/I in SSreagents.chemical_reactions_list_reactant_index) + for(var/V in SSreagents.chemical_reactions_list_reactant_index[I]) var/datum/chemical_reaction/R = V for(var/id in (R.required_reagents + R.required_catalysts)) - if(!GLOB.chemical_reagents_list[id]) + if(!SSreagents.chemical_reagents_list[id]) TEST_FAIL("Unknown chemical id \"[id]\" in recipe [R.type]") diff --git a/code/modules/unit_tests/reagent_mod_expose.dm b/code/modules/unit_tests/reagent_mod_expose.dm index d763d409b04f..a8d5450ad2fa 100644 --- a/code/modules/unit_tests/reagent_mod_expose.dm +++ b/code/modules/unit_tests/reagent_mod_expose.dm @@ -4,12 +4,12 @@ name = "method patch test" description = "Exposure Method Test Reagent" -/datum/reagent/method_patch_test/expose_mob(mob/living/target, methods = PATCH, reac_volume, show_message = TRUE) +/datum/reagent/method_patch_test/expose_mob(mob/living/exposed_mob, reac_volume, exposed_temperature, datum/reagents/source, methods, show_message, touch_protection) . = ..() - if(methods & PATCH) - target.health = 90 - if(methods & INJECT) - target.health = 80 + if(methods == TOUCH) + exposed_mob.health = 90 + else if(methods == INJECT) + exposed_mob.health = 80 /datum/unit_test/reagent_mob_expose/Run() // Life() is handled just by tests @@ -30,9 +30,9 @@ TEST_ASSERT(human.fire_stacks > 1, "Human fire stacks did not increase after life tick") // TOUCH - dropper.reagents.add_reagent(/datum/reagent/water, 1) + dropper.reagents.add_reagent(/datum/reagent/water, 5) dropper.afterattack(human, human, TRUE) - TEST_ASSERT_EQUAL(human.fire_stacks, 0, "Human still has fire stacks after touching water") + TEST_ASSERT(human.fire_stacks < 0, "Human still has fire stacks after touching water") // VAPOR TEST_ASSERT_EQUAL(human.drowsyness, 0, "Human is drowsy at the start of testing") diff --git a/code/modules/unit_tests/reagent_recipe_collisions.dm b/code/modules/unit_tests/reagent_recipe_collisions.dm index 263bef45e1a3..f5f2c70d7057 100644 --- a/code/modules/unit_tests/reagent_recipe_collisions.dm +++ b/code/modules/unit_tests/reagent_recipe_collisions.dm @@ -3,10 +3,9 @@ /datum/unit_test/reagent_recipe_collisions /datum/unit_test/reagent_recipe_collisions/Run() - build_chemical_reactions_lists() var/list/reactions = list() - for(var/V in GLOB.chemical_reactions_list_reactant_index) - reactions += GLOB.chemical_reactions_list_reactant_index[V] + for(var/V in SSreagents.chemical_reactions_list_reactant_index) + reactions += SSreagents.chemical_reactions_list_reactant_index[V] for(var/i in 1 to (reactions.len-1)) for(var/i2 in (i+1) to reactions.len) var/datum/chemical_reaction/r1 = reactions[i] diff --git a/code/modules/unit_tests/resist.dm b/code/modules/unit_tests/resist.dm index 28f6ea880110..b0acc9c8c872 100644 --- a/code/modules/unit_tests/resist.dm +++ b/code/modules/unit_tests/resist.dm @@ -12,6 +12,10 @@ // Stop, drop, and roll has a sleep call. This would delay the test, and is not necessary. call_async(human, /mob/living/verb/resist) + //since resist() is a verb that possibly queues its actual execution for the next tick, we need to make the subsystem that handles the delayed execution process + //the callback. either that or sleep ourselves and see if it ran. + SSverb_manager.run_verb_queue() + TEST_ASSERT(human.fire_stacks < 5, "Human did not lower fire stacks after resisting") /// Test that you can resist out of a container @@ -26,4 +30,9 @@ TEST_ASSERT(human in closet.contents, "Human was not in the contents of the closed closet") human.resist() + + //since resist() is a verb that possibly queues itself for the next tick, we need to make the subsystem that handles the delayed execution process + //the callback. either that or sleep ourselves and see if it ran. + SSverb_manager.run_verb_queue() + TEST_ASSERT(!(human in closet.contents), "Human resisted out of a standard closet, but was still in it") diff --git a/code/modules/unit_tests/say.dm b/code/modules/unit_tests/say.dm index 401572cf9e39..8617a96f8f9e 100644 --- a/code/modules/unit_tests/say.dm +++ b/code/modules/unit_tests/say.dm @@ -3,7 +3,7 @@ var/mob/host_mob /datum/unit_test/get_message_mods/Run() - host_mob = allocate(/mob/living/carbon/human) + host_mob = allocate(/mob/living/carbon/human/consistent) test("Hello", "Hello", list()) test(";HELP", "HELP", list(MODE_HEADSET = TRUE)) @@ -21,3 +21,215 @@ TEST_ASSERT(!expected_mods.len, "Some message mods were expected, but were not returned by get_message_mods: [json_encode(expected_mods)]. Message: [message]") + +/// Test to verify COMSIG_MOB_SAY is sent the exact same list as the message args, as they're operated on +/datum/unit_test/say_signal + +/datum/unit_test/say_signal/Run() + var/mob/living/dummy = allocate(/mob/living) + + RegisterSignal(dummy, COMSIG_MOB_SAY, PROC_REF(check_say)) + dummy.say("Make sure the say signal gets the arglist say is past, no copies!") + +/datum/unit_test/say_signal/proc/check_say(mob/living/source, list/say_args) + SIGNAL_HANDLER + + TEST_ASSERT_EQUAL(REF(say_args), source.last_say_args_ref, "Say signal didn't get the argslist of say as a reference. \ + This is required for the signal to function in most places - do not create a new instance of a list when passing it in to the signal.") + +// For the above test to track the last use of say's message args. +/mob/living + var/last_say_args_ref + +/// This unit test translates a string from one language to another depending on if the person can understand the language +/datum/unit_test/translate_speech + var/mob/host_mob + +/datum/unit_test/translate_speech/Run() + host_mob = allocate(/mob/living/carbon/human/consistent) + var/surfer_quote = "surfing in the USA" + + var/datum/language/lang_instance = GET_LANGUAGE_DATUM(/datum/language/beachbum) + host_mob.grant_language(/datum/language/beachbum, FALSE, TRUE) // can speak but can't understand + host_mob.add_blocked_language(subtypesof(/datum/language) - /datum/language/beachbum, LANGUAGE_STONER) + + TEST_ASSERT_NOTEQUAL(surfer_quote, host_mob.translate_speech(host_mob, lang_instance, surfer_quote), "Language test failed. Mob was supposed to understand: [surfer_quote]") + + host_mob.grant_language(/datum/language/beachbum) // can now understand + TEST_ASSERT_EQUAL(surfer_quote, host_mob.translate_speech(host_mob, lang_instance, surfer_quote), "Language test failed. Mob was supposed NOT to understand: [surfer_quote]") + +/// This runs some simple speech tests on a speaker and listener and determines if a person can hear whispering or speaking as they are moved a distance away +/datum/unit_test/speech + var/mob/living/carbon/human/speaker + var/mob/living/carbon/human/listener + var/list/handle_speech_result = null + var/list/handle_hearing_result = null + + var/obj/item/radio/speaker_radio + var/obj/item/radio/listener_radio + var/speaker_radio_heard_message = FALSE + var/listener_radio_received_message = FALSE + +/datum/unit_test/speech/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + TEST_ASSERT(speech_args[SPEECH_MESSAGE], "Handle speech signal does not have a message arg") + TEST_ASSERT(speech_args[SPEECH_SPANS], "Handle speech signal does not have spans arg") + TEST_ASSERT(speech_args[SPEECH_LANGUAGE], "Handle speech signal does not have a language arg") + TEST_ASSERT(speech_args[SPEECH_RANGE], "Handle speech signal does not have a range arg") + + // saving hearing_args directly via handle_speech_result = speech_args won't work since the arg list + // is a temporary variable that gets garbage collected after it's done being used by procs + // therefore we need to create a new list and transfer the args + handle_speech_result = list() + handle_speech_result += speech_args + +/datum/unit_test/speech/proc/handle_hearing(datum/source, list/hearing_args) + SIGNAL_HANDLER + + // So it turns out that the `message` arg for COMSIG_MOVABLE_HEAR is super redundant and should probably + // be gutted out of both the Hear() proc and signal since it's never used + //TEST_ASSERT(hearing_args[HEARING_MESSAGE], "Handle hearing signal does not have a message arg") + TEST_ASSERT(hearing_args[HEARING_SPEAKER], "Handle hearing signal does not have a speaker arg") + TEST_ASSERT(hearing_args[HEARING_LANGUAGE], "Handle hearing signal does not have a language arg") + TEST_ASSERT(hearing_args[HEARING_RAW_MESSAGE], "Handle hearing signal does not have a raw message arg") + // TODO radio unit tests + //TEST_ASSERT(hearing_args[HEARING_RADIO_FREQ], "Handle hearing signal does not have a radio freq arg") + TEST_ASSERT(hearing_args[HEARING_SPANS], "Handle hearing signal does not have a spans arg") + TEST_ASSERT(hearing_args[HEARING_MESSAGE_MODE], "Handle hearing signal does not have a message mode arg") + + // saving hearing_args directly via handle_hearing_result = hearing_args won't work since the arg list + // is a temporary variable that gets garbage collected after it's done being used by procs + // therefore we need to create a new list and transfer the args + handle_hearing_result = list() + handle_hearing_result += hearing_args + +/datum/unit_test/speech/proc/handle_radio_hearing(datum/source, mob/living/user, message, channel) + SIGNAL_HANDLER + + speaker_radio_heard_message = TRUE + +/datum/unit_test/speech/proc/handle_radio_speech(datum/source, atom/movable/speaker, message, freq_num, list/data) + SIGNAL_HANDLER + + listener_radio_received_message = TRUE + +/datum/unit_test/speech/Run() + speaker = allocate(/mob/living/carbon/human/consistent) + // Name changes to make understanding breakpoints easier + speaker.name = "SPEAKER" + listener = allocate(/mob/living/carbon/human/consistent) + listener.name = "LISTENER" + speaker_radio = allocate(/obj/item/radio) + speaker_radio.name = "SPEAKER RADIO" + listener_radio = allocate(/obj/item/radio) + listener_radio.name = "LISTENER RADIO" + // Hear() requires a client otherwise it will early return + var/datum/client_interface/mock_client = new() + listener.mock_client = mock_client + + RegisterSignal(speaker, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + RegisterSignal(speaker_radio, COMSIG_RADIO_NEW_MESSAGE, PROC_REF(handle_radio_hearing)) + + RegisterSignal(listener, COMSIG_LIVING_HEAR_POST_TRANSLATION, PROC_REF(handle_hearing)) + RegisterSignal(listener_radio, COMSIG_RADIO_RECEIVE, PROC_REF(handle_radio_speech)) + + // speaking and whispering should be hearable + conversation(distance = 1) + // speaking should be hearable but not whispering + conversation(distance = 5) + // neither speaking or whispering should be hearable + conversation(distance = 10) + + // Radio test + radio_test() + + // Language test + speaker.grant_language(/datum/language/beachbum) + speaker.get_language_holder():selected_language = GET_LANGUAGE_DATUM(/datum/language/beachbum) + listener.add_blocked_language(/datum/language/beachbum) + // speaking and whispering should be hearable + conversation(distance = 1) + // speaking should be hearable but not whispering + conversation(distance = 5) + // neither speaking or whispering should be hearable + conversation(distance = 10) + +#define NORMAL_HEARING_RANGE 7 +#define WHISPER_HEARING_RANGE 1 + +/datum/unit_test/speech/proc/conversation(distance = 0) + speaker.forceMove(run_loc_floor_bottom_left) + listener.forceMove(locate((run_loc_floor_bottom_left.x + distance), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + var/pangram_quote = "The quick brown fox jumps over the lazy dog." + + // speaking + speaker.say(pangram_quote) + TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired") + TEST_ASSERT_EQUAL(islist(handle_hearing_result), distance <= NORMAL_HEARING_RANGE, "Handle hearing signal was not fired") + + if(handle_hearing_result) + if(listener.has_language(handle_speech_result[SPEECH_LANGUAGE])) + TEST_ASSERT_EQUAL(pangram_quote, handle_hearing_result[HEARING_RAW_MESSAGE], "Language test failed. Mob was supposed to understand: [pangram_quote] using language [handle_speech_result[SPEECH_LANGUAGE]]") + else + TEST_ASSERT_NOTEQUAL(pangram_quote, handle_hearing_result[HEARING_RAW_MESSAGE], "Language test failed. Mob was NOT supposed to understand: [pangram_quote] using language [handle_speech_result[SPEECH_LANGUAGE]]") + + handle_speech_result = null + handle_hearing_result = null + + // whispering + speaker.whisper(pangram_quote) + TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired") + TEST_ASSERT_EQUAL(islist(handle_hearing_result), distance <= WHISPER_HEARING_RANGE, "Handle hearing signal was not fired") + + handle_speech_result = null + handle_hearing_result = null + +/datum/unit_test/speech/proc/radio_test() + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE + + speaker.forceMove(run_loc_floor_bottom_left) + listener.forceMove(locate((run_loc_floor_bottom_left.x + 10), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + + speaker_radio.forceMove(run_loc_floor_bottom_left) + speaker_radio.set_broadcasting(TRUE) + listener_radio.forceMove(locate((run_loc_floor_bottom_left.x + 10), run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z)) + // Normally speaking, if there isn't a functional telecomms array on the same z-level, then handheld radios + // have a short delay before sending the message. We use the centcom frequency to get around this. + speaker_radio.set_frequency(FREQ_CENTCOM) + speaker_radio.independent = TRUE + listener_radio.set_frequency(FREQ_CENTCOM) + listener_radio.independent = TRUE + + var/pangram_quote = "The quick brown fox jumps over the lazy dog." + + speaker.say(pangram_quote) + TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired (radio test)") + TEST_ASSERT(speaker_radio_heard_message, "Speaker's radio did not hear them speak (radio test)") + TEST_ASSERT_EQUAL(speaker_radio.get_frequency(), listener_radio.get_frequency(), "Radio frequencies were not equal (radio test)") + + TEST_ASSERT(listener_radio_received_message, "Listener's radio did not receive the broadcast (radio test)") + TEST_ASSERT(islist(handle_hearing_result), "Listener failed to hear radio message (radio test)") + + handle_speech_result = null + handle_hearing_result = null + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE + + speaker_radio.set_frequency(FREQ_CTF_RED) + speaker.say(pangram_quote) + + TEST_ASSERT(handle_speech_result, "Handle speech signal was not fired (radio test)") + TEST_ASSERT_NULL(handle_hearing_result, "Listener erroneously heard radio message (radio test)") + TEST_ASSERT_NOTEQUAL(speaker_radio.get_frequency(), listener_radio.get_frequency(), "Radio frequencies were erroneously equal (radio test)") + + handle_speech_result = null + handle_hearing_result = null + speaker_radio_heard_message = FALSE + listener_radio_received_message = FALSE + speaker_radio.set_broadcasting(FALSE) + +#undef NORMAL_HEARING_RANGE +#undef WHISPER_HEARING_RANGE diff --git a/code/modules/unit_tests/screenshot_antag_icons.dm b/code/modules/unit_tests/screenshot_antag_icons.dm index 8c0cb14b4633..30fb32932a2f 100644 --- a/code/modules/unit_tests/screenshot_antag_icons.dm +++ b/code/modules/unit_tests/screenshot_antag_icons.dm @@ -14,7 +14,7 @@ /// Sprites generated for the antagonists panel /datum/asset/spritesheet/antagonists name = "antagonists" - _abstract = /datum/asset/spritesheet/antagonists //This ensures it doesn't load unless it's requested. + abstract_type = /datum/asset/spritesheet/antagonists //This ensures it doesn't load unless it's requested. /// Mapping of spritesheet keys -> icons var/list/antag_icons = list() @@ -24,7 +24,6 @@ var/static/list/non_ruleset_antagonists = list( ROLE_FUGITIVE = /datum/antagonist/fugitive, ROLE_LONE_OPERATIVE = /datum/antagonist/nukeop/lone, - ROLE_DRIFTING_CONTRACTOR = /datum/antagonist/contractor, ) var/list/antagonists = non_ruleset_antagonists.Copy() diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png index e22811eb3f34..d31803d4edce 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_abductor.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png index e3d7acbf5d89..85420289646f 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_blobinfection.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png index cdafe8f24c70..3f87cc9882e3 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_bloodbrother.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png index 50da8ac82e19..ab0a0ebfce73 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_changeling.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png deleted file mode 100644 index d051bfffb5ac..000000000000 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_driftingcontractor.png and /dev/null differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png index 4ffa78dfe2c7..4c5d2cbf1981 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_spaceninja.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc.png new file mode 100644 index 000000000000..8fd80d7e6e9f Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc_saurian.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc_saurian.png new file mode 100644 index 000000000000..5c02b45dfcdf Binary files /dev/null and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_ipc_saurian.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png index f2e8c8f4e8b0..71afc8de3454 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png index 29ce88f47e59..0fd38022ae79 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_ashwalker.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png index 7bbc2c3100ad..173e9d33844b 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_lizard_silverscale.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png index f77e21d1f523..461b22135699 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png index 497cca72afa0..4a8dea92d587 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_teshari.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox.png index ca41a653a1d1..1917786c90cd 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox.png and b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_vox.png differ diff --git a/code/modules/unit_tests/security_officer_distribution.dm b/code/modules/unit_tests/security_officer_distribution.dm deleted file mode 100644 index 9952c02a8a55..000000000000 --- a/code/modules/unit_tests/security_officer_distribution.dm +++ /dev/null @@ -1,110 +0,0 @@ -#define SECURITY_OFFICER_DEPARTMENTS list("a", "b", "c", "d") -#define SECURITY_OFFICER_DEPARTMENTS_TO_NAMES (list( \ - "a" = SEC_DEPT_ENGINEERING, \ - "b" = SEC_DEPT_MEDICAL, \ - "c" = SEC_DEPT_SCIENCE, \ - "d" = SEC_DEPT_SUPPLY, \ -)) - -/// Test that security officers with specific distributions get their departments. -/datum/unit_test/security_officer_roundstart_distribution - -/datum/unit_test/security_officer_roundstart_distribution/proc/test( - list/preferences, - list/expected, -) - var/list/outcome = get_officer_departments(preferences, SECURITY_OFFICER_DEPARTMENTS) - var/failure_message = "Tested with [json_encode(preferences)] and expected [json_encode(expected)], got [json_encode(outcome)]" - - if (outcome.len == expected.len) - for (var/index in 1 to outcome.len) - TEST_ASSERT_EQUAL(outcome[index], expected[index], failure_message) - else - TEST_FAIL(failure_message) - -/datum/unit_test/security_officer_roundstart_distribution/Run() - test_distributions() - test_with_mock_players() - -/datum/unit_test/security_officer_roundstart_distribution/proc/test_distributions() - test(list("a"), list("a")) - test(list("a", "b"), list("a", "a")) - test(list("a", "b", "c"), list("a", "a", "a")) - test(list("a", "a", "b"), list("a", "a", "a")) - test(list("a", "a", "b", "b"), list("a", "a", "b", "b")) - test(list("a", "a", "a", "b"), list("a", "a", "b", "b")) - test(list("a", "b", "c", "d"), list("a", "b", "b", "a")) - test(list(SEC_DEPT_NONE), list("d")) - test(list("a", SEC_DEPT_NONE), list("a", "a")) - test(list(SEC_DEPT_NONE, SEC_DEPT_NONE, SEC_DEPT_NONE, SEC_DEPT_NONE), list("d", "d", "c", "c")) - -/datum/unit_test/security_officer_roundstart_distribution/proc/test_with_mock_players() - var/mob/dead/new_player/officer_a = create_officer("a") - var/mob/dead/new_player/officer_b = create_officer("b") - var/mob/dead/new_player/officer_c = create_officer("c") - var/mob/dead/new_player/officer_d = create_officer("d") - - var/list/outcome = SSticker.decide_security_officer_departments( - list(officer_a, officer_b, officer_c, officer_d), - SECURITY_OFFICER_DEPARTMENTS, - ) - - TEST_ASSERT_EQUAL(outcome[REF(officer_a.new_character)], SECURITY_OFFICER_DEPARTMENTS_TO_NAMES["a"], "Officer A's department outcome was incorrect.") - TEST_ASSERT_EQUAL(outcome[REF(officer_b.new_character)], SECURITY_OFFICER_DEPARTMENTS_TO_NAMES["b"], "Officer B's department outcome was incorrect.") - TEST_ASSERT_EQUAL(outcome[REF(officer_c.new_character)], SECURITY_OFFICER_DEPARTMENTS_TO_NAMES["b"], "Officer C's department outcome was incorrect.") - TEST_ASSERT_EQUAL(outcome[REF(officer_d.new_character)], SECURITY_OFFICER_DEPARTMENTS_TO_NAMES["a"], "Officer D's department outcome was incorrect.") - -/datum/unit_test/security_officer_roundstart_distribution/proc/create_officer(preference) - var/mob/dead/new_player/new_player = allocate(/mob/dead/new_player) - var/datum/client_interface/mock_client = new - - mock_client.prefs = new - var/write_success = mock_client.prefs.write_preference( - GLOB.preference_entries[/datum/preference/choiced/security_department], - SECURITY_OFFICER_DEPARTMENTS_TO_NAMES[preference], - ) - - TEST_ASSERT(write_success, "Couldn't write department [SECURITY_OFFICER_DEPARTMENTS_TO_NAMES[preference]]") - - var/mob/living/carbon/human/new_character = allocate(/mob/living/carbon/human) - new_character.mind_initialize() - new_character.mind.set_assigned_role(SSjob.GetJobType(/datum/job/security_officer)) - - new_player.new_character = new_character - new_player.mock_client = mock_client - return new_player - -/// Test that latejoin security officers are put into the correct department -/datum/unit_test/security_officer_latejoin_distribution - -/datum/unit_test/security_officer_latejoin_distribution/proc/test( - preference, - list/preferences_of_others, - expected, -) - var/list/distribution = list() - - for (var/officer_preference in preferences_of_others) - var/mob/officer = allocate(/mob/living/carbon/human) - distribution[officer] = officer_preference - - var/result = get_new_officer_distribution_from_late_join( - preference, - SECURITY_OFFICER_DEPARTMENTS, - distribution, - ) - - var/failure_message = "Latejoin distribution was incorrect (preference = [preference], preferences_of_others = [json_encode(preferences_of_others)])." - - TEST_ASSERT_EQUAL(result, expected, failure_message) - -/datum/unit_test/security_officer_latejoin_distribution/Run() - test("a", list(), "a") - test("b", list(), "b") - test("a", list("b"), "b") - test("a", list("a", "a"), "b") - test("a", list("a", "a", "b"), "b") - test("a", list("a", "a", "b", "b"), "c") - test("a", list("a", "a", "b", "b", "c", "c", "d", "d"), "a") - -#undef SECURITY_OFFICER_DEPARTMENTS diff --git a/code/modules/unit_tests/slapcraft_sanity.dm b/code/modules/unit_tests/slapcraft_sanity.dm new file mode 100644 index 000000000000..24e10821e797 --- /dev/null +++ b/code/modules/unit_tests/slapcraft_sanity.dm @@ -0,0 +1,38 @@ +/datum/unit_test/slapcraft_recipe_sanity/Run() + + for(var/datum/slapcraft_recipe/R as anything in typesof(/datum/slapcraft_recipe)) + if(isabstract(R)) + continue + + R = new R() + // Check if the recipe has atleast 2 steps. + if(length(R.steps) < 2) + TEST_FAIL("Slapcrafting recipe of type [R.type] has less than 2 steps. This is wrong.") + + // Check if the first step is type checked, this is currently required because an optimization cache lookup works based off this. + // And also required for the examine hints to work properly. + var/datum/slapcraft_step/step_one = SLAPCRAFT_STEP(R.steps[1]) + if(!step_one.check_types) + TEST_FAIL("Slapcrafting recipe of type [R.type] has first step [step_one.type] which doesn't type check. This is incompatible with an optimization cache.") + + // Make sure all steps are unique + var/list/assoc_check = list() + for(var/step_type in R.steps) + if(assoc_check[step_type]) + TEST_FAIL("Slapcrafting recipe of type [R.type] has duplicate step [step_type]. Steps within a recipe must be unique!") + assoc_check[step_type] = TRUE + + // Make sure any optional steps are not invalid. + var/step_count = 0 + for(var/step_type in R.steps) + step_count++ + var/datum/slapcraft_step/iterated_step = SLAPCRAFT_STEP(step_type) + if(!iterated_step.optional) + continue + switch(R.step_order) + if(SLAP_ORDER_STEP_BY_STEP, SLAP_ORDER_FIRST_AND_LAST) + // If first, or last + if(step_count == 1 || step_count == R.steps.len) + TEST_FAIL("Slapcrafting recipe of type [R.type] has an optional step [step_type] as first or last step. This is forbidden!") + if(SLAP_ORDER_FIRST_THEN_FREEFORM) + TEST_FAIL("Slapcrafting recipe of type [R.type] has an optional step [step_type] while the order is SLAP_ORDER_FIRST_THEN_FREEFORM. This is forbidden!") diff --git a/code/modules/unit_tests/species_whitelists.dm b/code/modules/unit_tests/species_whitelists.dm index ec05d0cf9f8f..0d7ee74c7398 100644 --- a/code/modules/unit_tests/species_whitelists.dm +++ b/code/modules/unit_tests/species_whitelists.dm @@ -1,5 +1,5 @@ /datum/unit_test/species_whitelist_check/Run() for(var/typepath in subtypesof(/datum/species)) var/datum/species/S = typepath - if(initial(S.changesource_flags) == NONE) + if(initial(S.changesource_flags) == null) TEST_FAIL("A species type was detected with no changesource flags: [S]") diff --git a/code/modules/unit_tests/strippable.dm b/code/modules/unit_tests/strippable.dm index 64a3e64a4308..841e84432eed 100644 --- a/code/modules/unit_tests/strippable.dm +++ b/code/modules/unit_tests/strippable.dm @@ -32,11 +32,8 @@ TEST_ASSERT_EQUAL(strip_menu.ui_status(user, ui_state), UI_UPDATE, "Being too far away while standing up was not update-only.") var/handcuffs = allocate(/obj/item/restraints/handcuffs, user) - user.forceMove(target.loc) - user.set_handcuffed(handcuffs) - user.update_handcuffed() + user.equip_to_slot_if_possible(handcuffs, ITEM_SLOT_HANDCUFFED, TRUE, TRUE, null, TRUE) TEST_ASSERT_EQUAL(strip_menu.ui_status(user, ui_state), UI_UPDATE, "Being within range but cuffed was not update-only.") - user.set_handcuffed(null) qdel(handcuffs) user.set_body_position(LYING_DOWN) diff --git a/code/modules/unit_tests/subsystem_sanity.dm b/code/modules/unit_tests/subsystem_sanity.dm new file mode 100644 index 000000000000..bca929144899 --- /dev/null +++ b/code/modules/unit_tests/subsystem_sanity.dm @@ -0,0 +1,4 @@ +/datum/unit_test/subsystem_sanity/Run() + for(var/datum/controller/subsystem/SS in Master.subsystems) + if((SS.flags & SS_HIBERNATE) && !length(SS.hibernate_checks)) + TEST_FAIL("[SS.type] is set to hibernate but has no vars to check!") diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index f06cc31ff1b9..a637428a23d4 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -1,120 +1,112 @@ +/mob + /// We use this during unit testing to force a specific surgery by an uncliented mob. + var/desired_surgery + /datum/unit_test/amputation/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + var/obj/structure/table/table = allocate(/obj/structure/table/optable) - TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 0, "Patient is somehow missing limbs before surgery") - - var/datum/surgery/amputation/surgery = new(patient, BODY_ZONE_R_ARM, patient.get_bodypart(BODY_ZONE_R_ARM)) + table.forceMove(get_turf(patient)) //Not really needed but it silences the linter and gives insurance - var/datum/surgery_step/sever_limb/sever_limb = new - sever_limb.success(user, patient, BODY_ZONE_R_ARM, null, surgery) + var/obj/item/circular_saw/saw = allocate(/obj/item/circular_saw) - TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 1, "Patient did not lose any limbs") - TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on") + TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 0, "Patient is somehow missing limbs before surgery.") + user.desired_surgery = /datum/surgery_step/generic_organic/amputate + patient.set_lying_down() + user.zone_selected = BODY_ZONE_R_ARM -/datum/unit_test/brain_surgery/Run() - var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) - patient.gain_trauma_type(BRAIN_TRAUMA_MILD, TRAUMA_RESILIENCE_SURGERY) - patient.setOrganLoss(ORGAN_SLOT_BRAIN, 20) + user.put_in_active_hand(saw) + saw.melee_attack_chain(user, patient) - TEST_ASSERT(patient.has_trauma_type(), "Patient does not have any traumas, despite being given one") - - var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + TEST_ASSERT_EQUAL(patient.get_missing_limbs().len, 1, "Patient did not lose any limbs.") + TEST_ASSERT_EQUAL(patient.get_missing_limbs()[1], BODY_ZONE_R_ARM, "Patient is missing a limb that isn't the one we operated on.") - var/datum/surgery_step/fix_brain/fix_brain = new - fix_brain.success(user, patient) - - TEST_ASSERT(!patient.has_trauma_type(), "Patient kept their brain trauma after brain surgery") - TEST_ASSERT(patient.getOrganLoss(ORGAN_SLOT_BRAIN) < 20, "Patient did not heal their brain damage after brain surgery") - -/datum/unit_test/head_transplant/Run() +/datum/unit_test/limb_attach/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) - var/mob/living/carbon/human/alice = allocate(/mob/living/carbon/human) - var/mob/living/carbon/human/bob = allocate(/mob/living/carbon/human) + var/obj/structure/table/table = allocate(/obj/structure/table/optable) + var/obj/item/fixovein/fixovein = allocate(/obj/item/fixovein) - alice.fully_replace_character_name(null, "Alice") - bob.fully_replace_character_name(null, "Bob") + table.forceMove(get_turf(patient)) //Not really needed but it silences the linter and gives insurance - var/obj/item/bodypart/head/alices_head = alice.get_bodypart(BODY_ZONE_HEAD) - alices_head.drop_limb() + var/obj/item/bodypart/BP = patient.get_bodypart(BODY_ZONE_R_ARM) + BP.dismember(silent = TRUE, clean = TRUE) + TEST_ASSERT(!patient.get_bodypart(BODY_ZONE_R_ARM), "Patient did not lose limb to dismember()") + TEST_ASSERT((BP.bodypart_flags & BP_CUT_AWAY), "Arm did not gain CUT_AWAY flag after dismemberment") - var/obj/item/bodypart/head/bobs_head = bob.get_bodypart(BODY_ZONE_HEAD) - bobs_head.drop_limb() + patient.set_lying_down() + user.desired_surgery = /datum/surgery_step/limb/attach + user.zone_selected = BODY_ZONE_R_ARM + user.put_in_active_hand(BP) + BP.melee_attack_chain(user, patient) - TEST_ASSERT_EQUAL(alice.get_bodypart(BODY_ZONE_HEAD), null, "Alice still has a head after dismemberment") - TEST_ASSERT_EQUAL(alice.get_visible_name(), "Unknown", "Alice's head was dismembered, but they are not Unknown") + TEST_ASSERT(patient.get_bodypart(BODY_ZONE_R_ARM), "Patient did not regain arm after attack chain.") + TEST_ASSERT((BP.bodypart_flags & BP_CUT_AWAY), "Arm lost CUT_AWAY flag after attachment") - TEST_ASSERT_EQUAL(bobs_head.real_name, "Bob", "Bob's head does not remember that it is from Bob") + user.desired_surgery = /datum/surgery_step/limb/connect + user.put_in_active_hand(fixovein) + fixovein.melee_attack_chain(user, patient) - // Put Bob's head onto Alice's body - var/datum/surgery_step/add_prosthetic/add_prosthetic = new - user.put_in_active_hand(bobs_head) - add_prosthetic.success(user, alice, BODY_ZONE_HEAD, bobs_head) + TEST_ASSERT(!(BP.bodypart_flags & BP_CUT_AWAY), "Arm did not lose CUT_AWAY flag after connection.") + TEST_ASSERT(patient.usable_hands == 2, "Patient's hand was not usable after connection.") - TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement") - TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") -/datum/unit_test/multiple_surgeries/Run() +/datum/unit_test/tend_wounds/Run() + var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) - var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human) - var/mob/living/carbon/human/patient_one = allocate(/mob/living/carbon/human) - - var/obj/item/scalpel/scalpel = allocate(/obj/item/scalpel) - - var/datum/surgery_step/incise/surgery_step = new - var/datum/surgery/organ_manipulation/surgery_for_zero = new(patient_zero, BODY_ZONE_CHEST, patient_zero.get_bodypart(BODY_ZONE_CHEST)) + var/obj/structure/table/table = allocate(/obj/structure/table/optable) + var/obj/item/hemostat/hemostat = allocate(/obj/item/hemostat) - INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero) - TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated") + table.forceMove(get_turf(patient)) //Not really needed but it silences the linter and gives insurance - var/datum/surgery/organ_manipulation/surgery_for_one = new(patient_one, BODY_ZONE_CHEST, patient_one.get_bodypart(BODY_ZONE_CHEST)) + var/obj/item/bodypart/BP = patient.get_bodypart(BODY_ZONE_CHEST) + BP.receive_damage(BP.max_damage, modifiers = NONE) + TEST_ASSERT(BP.get_damage() == BP.max_damage, "Patient did not take [BP.max_damage] damage, took [BP.get_damage()]") - // Without waiting for the incision to complete, try to start a new surgery - TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius") - TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating") + patient.set_lying_down() + user.zone_selected = BODY_ZONE_CHEST + user.desired_surgery = /datum/surgery_step/tend_wounds + user.put_in_active_hand(hemostat) + hemostat.melee_attack_chain(user, patient) - user.apply_status_effect(/datum/status_effect/hippocratic_oath) - INVOKE_ASYNC(surgery_step, TYPE_PROC_REF(/datum/surgery_step, initiate), user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one) - TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius") + TEST_ASSERT(BP.get_damage() <= BP.max_damage * 0.25, "Chest did not heal to less than [BP.max_damage/2], healed to [BP.get_damage()]") -/// Ensures that the tend wounds surgery can be started -/datum/unit_test/start_tend_wounds - -/datum/unit_test/start_tend_wounds/Run() +/datum/unit_test/test_retraction/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + var/obj/structure/table/table = allocate(/obj/structure/table/optable) + var/obj/item/scalpel/scalpel = allocate(__IMPLIED_TYPE__) + var/obj/item/retractor/retractor = allocate(__IMPLIED_TYPE__) + var/obj/item/circular_saw/saw = allocate(__IMPLIED_TYPE__) - var/datum/surgery/surgery = new /datum/surgery/healing/brute/basic - - if (!surgery.can_start(user, patient)) - TEST_FAIL("Can't start basic tend wounds!") + table.forceMove(get_turf(patient)) //Not really needed but it silences the linter and gives insurance + patient.set_lying_down() - qdel(surgery) + for(var/zone in list(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + var/obj/item/bodypart/BP = patient.get_bodypart(zone) -/datum/unit_test/tend_wounds/Run() - var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) - patient.take_overall_damage(100, 100) - - var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) + user.zone_selected = zone + user.desired_surgery = /datum/surgery_step/generic_organic/incise + user.put_in_active_hand(scalpel) + scalpel.melee_attack_chain(user, patient) - // Test that tending wounds actually lowers damage - var/datum/surgery_step/heal/brute/basic/basic_brute_heal = new - basic_brute_heal.success(user, patient, BODY_ZONE_CHEST) - TEST_ASSERT(patient.getBruteLoss() < 100, "Tending brute wounds didn't lower brute damage ([patient.getBruteLoss()])") + TEST_ASSERT(BP.how_open() == SURGERY_OPEN, "[parse_zone(zone)] was not incised.") - var/datum/surgery_step/heal/burn/basic/basic_burn_heal = new - basic_burn_heal.success(user, patient, BODY_ZONE_CHEST) - TEST_ASSERT(patient.getFireLoss() < 100, "Tending burn wounds didn't lower burn damage ([patient.getFireLoss()])") + user.desired_surgery = /datum/surgery_step/generic_organic/retract_skin + user.drop_all_held_items() + user.put_in_active_hand(retractor) + retractor.melee_attack_chain(user, patient) - // Test that wearing clothing lowers heal amount - var/mob/living/carbon/human/naked_patient = allocate(/mob/living/carbon/human) - naked_patient.take_overall_damage(100) + TEST_ASSERT(BP.how_open() == SURGERY_RETRACTED, "[parse_zone(zone)]'s incision was not widened (Openness: [BP.how_open()]).") - var/mob/living/carbon/human/clothed_patient = allocate(/mob/living/carbon/human) - clothed_patient.equipOutfit(/datum/outfit/job/doctor, TRUE) - clothed_patient.take_overall_damage(100) + if(BP.encased) + user.desired_surgery = /datum/surgery_step/open_encased + user.drop_all_held_items() + user.put_in_active_hand(saw) + saw.melee_attack_chain(user, patient) - basic_brute_heal.success(user, naked_patient, BODY_ZONE_CHEST) - basic_brute_heal.success(user, clothed_patient, BODY_ZONE_CHEST) + TEST_ASSERT(BP.how_open() == SURGERY_DEENCASED, "[parse_zone(zone)] was not de-encased (Openness: [BP.how_open()]).") - TEST_ASSERT(naked_patient.getBruteLoss() < clothed_patient.getBruteLoss(), "Naked patient did not heal more from wounds tending than a clothed patient") + user.drop_all_held_items() + patient.fully_heal() diff --git a/code/modules/unit_tests/tape_sanity.dm b/code/modules/unit_tests/tape_sanity.dm new file mode 100644 index 000000000000..5567836a66f2 --- /dev/null +++ b/code/modules/unit_tests/tape_sanity.dm @@ -0,0 +1,9 @@ +/datum/unit_test/tape_sanity/Run() + for(var/obj/item/tape/tape as anything in subtypesof(/obj/item/tape)) + tape = allocate(tape) + + if(length(tape.storedinfo) != length(tape.timestamp)) + TEST_FAIL("[tape.type] front side data lengths do not match.") + + if(length(tape.storedinfo_otherside) != length(tape.storedinfo_otherside)) + TEST_FAIL("[tape.type] back side data lengths do not match.") diff --git a/code/modules/unit_tests/traitor.dm b/code/modules/unit_tests/traitor.dm index 012370d93564..e6f2fa429a1b 100644 --- a/code/modules/unit_tests/traitor.dm +++ b/code/modules/unit_tests/traitor.dm @@ -22,8 +22,10 @@ var/datum/antagonist/traitor/traitor = mind.add_antag_datum(/datum/antagonist/traitor) if(!traitor.uplink_handler) TEST_FAIL("[job_name] when made traitor does not have a proper uplink created when spawned in!") + if(!istype(traitor.uplink_handler)) + TEST_FAIL("[job_name] when made traitor has an insane uplink handler, of type [traitor.uplink_handler.type]") for(var/datum/traitor_objective/objective_typepath as anything in subtypesof(/datum/traitor_objective)) - if(initial(objective_typepath.abstract_type) == objective_typepath) + if(isabstract(objective_typepath)) continue var/datum/traitor_objective/objective = allocate(objective_typepath, traitor.uplink_handler) try diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index 87ac40acc1e3..956dc50a4aa6 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -176,9 +176,9 @@ GLOBAL_LIST_EMPTY(unit_test_mapping_logs) fdel(file_name) file(file_name) << json_encode(test_results) - SSticker.force_ending = TRUE + SSticker.end_round() //We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game - SSticker.standard_reboot() + SSticker.declare_completion() /datum/map_template/unit_tests name = "Unit Tests Zone" diff --git a/code/modules/unit_tests/wounds.dm b/code/modules/unit_tests/wounds.dm new file mode 100644 index 000000000000..f74104cae49a --- /dev/null +++ b/code/modules/unit_tests/wounds.dm @@ -0,0 +1,17 @@ +/datum/unit_test/wounds/Run() + var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human) + + var/obj/item/bodypart/BP = H.get_bodypart(BODY_ZONE_CHEST) + + BP.receive_damage(15) + TEST_ASSERT(BP.brute_dam != 0, "Bodypart failed to update brute damage.") + TEST_ASSERT(H.getBruteLoss() != 0, "Human failed to update brute damage.") + + var/old_dam = BP.brute_dam + var/old_human_dam = H.getBruteLoss() + + var/datum/wound/W = BP.wounds[1] + W.open_wound(15) + + TEST_ASSERT(BP.brute_dam != old_dam, "Bodypart failed to update brute damage.") + TEST_ASSERT(H.getBruteLoss() != old_human_dam, "Human failed to update brute damage.") diff --git a/code/modules/universal_states/resonance_jump.dm b/code/modules/universal_states/resonance_jump.dm index 0b1b67041787..664241cc1d1c 100644 --- a/code/modules/universal_states/resonance_jump.dm +++ b/code/modules/universal_states/resonance_jump.dm @@ -130,7 +130,7 @@ H = new daddy.type(get_turf(src)) H.appearance = daddy.appearance - H.real_name = daddy.real_name + H.set_real_name(daddy.real_name) daddy.dust(TRUE) qdel(src) diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 1c0a980dc488..f7d8694a574f 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -16,7 +16,6 @@ flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT - throw_speed = 3 throw_range = 7 w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index ab8a537553dc..bfcdc544b3fa 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -8,62 +8,51 @@ category = /datum/uplink_category/ammo surplus = 40 -// No progression cost - -/datum/uplink_item/ammo/toydarts - name = "Box of Riot Darts" - desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!" - item = /obj/item/ammo_box/foambox/riot - cost = 2 - surplus = 0 - illegal_tech = FALSE - // Low progression cost /datum/uplink_item/ammo/pistol - name = "9mm Handgun Magazine" - desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol." + name = "8-round 9x19mm Magazine" + desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms." progression_minimum = 10 MINUTES item = /obj/item/ammo_box/magazine/m9mm - cost = 1 + cost = 2 purchasable_from = ~UPLINK_CLOWN_OPS illegal_tech = FALSE // Medium progression cost /datum/uplink_item/ammo/pistolap - name = "9mm Armour Piercing Magazine" - desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \ - These rounds are less effective at injuring the target but penetrate protective gear." + name = "8-round 9x19mm Armour Piercing Magazine" + desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \ + These bullets are highly effective against armor." progression_minimum = 30 MINUTES item = /obj/item/ammo_box/magazine/m9mm/ap - cost = 2 + cost = 4 purchasable_from = ~UPLINK_CLOWN_OPS /datum/uplink_item/ammo/pistolhp - name = "9mm Hollow Point Magazine" - desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \ - These rounds are more damaging but ineffective against armour." + name = "8-round 9x19mm Hollow-Point Magazine" + desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \ + These bullets will tear through flesh, but lack penetration." progression_minimum = 30 MINUTES item = /obj/item/ammo_box/magazine/m9mm/hp - cost = 3 + cost = 4 purchasable_from = ~UPLINK_CLOWN_OPS /datum/uplink_item/ammo/pistolfire - name = "9mm Incendiary Magazine" - desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol. \ - Loaded with incendiary rounds which inflict little damage, but ignite the target." + name = "8-round 9x19mm Incendiary Magazine" + desc = "A magazine containing eight 9x19mm rounds, compatible with most small arms. \ + These bullets have low stopping power, but will ignite flesh upon impact." progression_minimum = 30 MINUTES item = /obj/item/ammo_box/magazine/m9mm/fire - cost = 2 + cost = 6 purchasable_from = ~UPLINK_CLOWN_OPS /datum/uplink_item/ammo/revolver - name = ".357 Speed Loader" - desc = "A speed loader that contains seven additional .357 Magnum rounds; usable with the Syndicate revolver. \ - For when you really need a lot of things dead." + name = ".357 S&W Speed Loader" + desc = "A speed loader that contains seven .357 S&W Magnum rounds. Sometimes, you just need a little more gun." progression_minimum = 30 MINUTES item = /obj/item/ammo_box/a357 - cost = 4 + cost = 6 purchasable_from = ~UPLINK_CLOWN_OPS illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm index a4d2717191bb..c0a59f0e0e10 100644 --- a/code/modules/uplink/uplink_items/badass.dm +++ b/code/modules/uplink/uplink_items/badass.dm @@ -27,7 +27,7 @@ /datum/uplink_item/badass/syndiecigs name = "Syndicate Smokes" - desc = "Strong flavor, dense smoke, infused with omnizine." + desc = "Strong flavor, dense smoke, infused with tricordrazine." item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate cost = 2 illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index 17bb0accde8a..7040e27168f7 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -52,8 +52,83 @@ item = /obj/item/stack/telecrystal/twenty cost = 20 -/datum/uplink_item/bundles_tc - name = "Contractor Bundle" - desc = "A box containing everything you need to take contracts from the Syndicate. Kidnap people and drop them off at specified locations for rewards in the form of Telecrystals (Usable in the provided uplink) and Contractor Points." - item = /obj/item/storage/box/syndicate/contract_kit +/datum/uplink_item/bundles_tc/bundle_A + name = "Syndi-kit Tactical" + 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 + cost = 20 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/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 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/syndicate/bundle_b cost = 20 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/bundles_tc/surplus + name = "Syndicate Surplus Crate" + desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ + but you never know. Contents are sorted to always be worth 50 TC." + item = /obj/structure/closet/crate + cost = 20 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + var/crate_tc_value = 40 + /// crate that will be used for the surplus crate + var/crate_type = /obj/structure/closet/crate + +/datum/uplink_item/bundles_tc/surplus/super + name = "Super Surplus Crate" + desc = "A dusty SUPER-SIZED from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ + but you never know. Contents are sorted to always be worth 125 TC." + cost = 40 + crate_tc_value = 100 + +/datum/uplink_item/bundles_tc/surplus/proc/generate_possible_items(mob/user, datum/uplink_handler/handler) + var/list/possible_items = list() + for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) + var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] + if(src == uplink_item || !uplink_item.item) + continue + if(!handler.check_if_restricted(uplink_item)) + continue + if(!uplink_item.surplus) + continue + possible_items += uplink_item + return possible_items + +/// picks items from the list given to proc and generates a valid uplink item that is less or equal to the amount of TC it can spend +/datum/uplink_item/bundles_tc/surplus/proc/pick_possible_item(list/possible_items, tc_budget) + var/datum/uplink_item/uplink_item = pick(possible_items) + if(prob(100 - uplink_item.surplus)) + return null + if(tc_budget < uplink_item.cost) + return null + return uplink_item + +/// fills the crate that will be given to the traitor, edit this to change the crate and how the item is filled +/datum/uplink_item/bundles_tc/surplus/proc/fill_crate(obj/structure/closet/crate/surplus_crate, list/possible_items) + var/tc_budget = crate_tc_value + while(tc_budget) + var/datum/uplink_item/uplink_item = pick_possible_item(possible_items, tc_budget) + if(!uplink_item) + continue + tc_budget -= uplink_item.cost + new uplink_item.item(surplus_crate) + +/datum/uplink_item/bundles_tc/surplus/purchase(mob/user, datum/uplink_handler/handler, atom/movable/source) + var/obj/structure/closet/crate/surplus_crate = new crate_type() + if(!istype(surplus_crate)) + CRASH("crate_type is not a crate") + var/list/possible_items = generate_possible_items(user, handler) + + fill_crate(surplus_crate, possible_items) + + podspawn(list( + "target" = get_turf(user), + "style" = STYLE_SYNDICATE, + "spawn" = surplus_crate, + )) diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 92a25263d3c3..44fbbdd6ca75 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -8,25 +8,14 @@ /datum/uplink_item/dangerous category = /datum/uplink_category/dangerous -// No progression cost - -/datum/uplink_item/dangerous/foampistol - name = "Toy Pistol with Riot Darts" - desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \ - darts effective at incapacitating a target." - item = /obj/item/gun/ballistic/automatic/pistol/toy/riot - cost = 2 - surplus = 10 - // Low progression cost /datum/uplink_item/dangerous/pistol - name = "Makarov Pistol" - desc = "A small, easily concealable handgun that uses 9mm auto rounds in 8-round magazines and is compatible \ - with suppressors." + name = "9x19mm Pistol" + desc = "A servicable handgun chambered in 9x19mm Parabellum." progression_minimum = 10 MINUTES item = /obj/item/gun/ballistic/automatic/pistol - cost = 7 + cost = 10 purchasable_from = ~UPLINK_CLOWN_OPS /datum/uplink_item/dangerous/throwingweapons @@ -40,11 +29,10 @@ /datum/uplink_item/dangerous/sword name = "Energy Sword" - desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \ - pocketed when inactive. Activating it produces a loud, distinctive noise." + desc = "The energy sword is an edged weapon with a blade of pure energy. Activating it produces a loud, distinctive noise." progression_minimum = 20 MINUTES item = /obj/item/melee/energy/sword/saber - cost = 8 + cost = 12 purchasable_from = ~UPLINK_CLOWN_OPS /datum/uplink_item/dangerous/powerfist @@ -66,36 +54,11 @@ // Medium progression cost - -/datum/uplink_item/dangerous/doublesword - 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." - progression_minimum = 30 MINUTES - item = /obj/item/dualsaber - - cost = 16 - purchasable_from = ~UPLINK_CLOWN_OPS - -/datum/uplink_item/dangerous/doublesword/get_discount() - return pick(4;0.8,2;0.65,1;0.5) - -/datum/uplink_item/dangerous/guardian - name = "Holoparasites" - desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \ - organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host." - progression_minimum = 30 MINUTES - item = /obj/item/storage/box/syndie_kit/guardian - cost = 18 - surplus = 0 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) - restricted = TRUE - /datum/uplink_item/dangerous/revolver - name = "Syndicate Revolver" - desc = "A brutally simple Syndicate revolver that fires .357 Magnum rounds and has 7 chambers." + name = ".357 Magnum Revolver" + desc = "A modern classic, 7-chamber revolver chambered in .357 S&W." item = /obj/item/gun/ballistic/revolver progression_minimum = 30 MINUTES - cost = 13 + cost = 14 surplus = 50 purchasable_from = ~UPLINK_CLOWN_OPS diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 39b05e299451..9001396e1577 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -21,7 +21,7 @@ /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." + a Syndicate brand MMI, a straitjacket, an advanced health analyzer, and a muzzle." item = /obj/item/storage/backpack/duffelbag/syndie/surgery cost = 3 @@ -156,6 +156,7 @@ desc = "The Protocol CRAB-17 Phone, a phone borrowed from an unknown third party, it can be used to crash the space market, funneling the losses of the crew to your bank account.\ The crew can move their funds to a new banking site though, unless they HODL, in which case they deserve it." item = /obj/item/suspiciousphone + cant_discount = TRUE //These are loud and obnoxious and discounts bypass the usual stocking limit. restricted = TRUE cost = 7 limited_stock = 1 diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm index 6eed450dce08..b673df4dca18 100644 --- a/code/modules/uplink/uplink_items/explosive.dm +++ b/code/modules/uplink/uplink_items/explosive.dm @@ -24,14 +24,14 @@ minimum setting of 10 seconds." progression_minimum = 10 MINUTES item = /obj/item/grenade/c4 - cost = 1 + cost = 4 /datum/uplink_item/explosives/c4bag name = "Bag of C-4 explosives" - desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives." + desc = "Because sometimes quantity is quality. Contains 4 C-4 plastic explosives." item = /obj/item/storage/backpack/duffelbag/syndie/c4 progression_minimum = 20 MINUTES - cost = 8 //20% discount! + cost = 14 // 22% discount cant_discount = TRUE /datum/uplink_item/explosives/x4bag @@ -41,7 +41,7 @@ For when you want a controlled explosion that leaves a wider, deeper, hole." progression_minimum = 30 MINUTES item = /obj/item/storage/backpack/duffelbag/syndie/x4 - cost = 4 + cost = 14 cant_discount = TRUE /datum/uplink_item/explosives/detomatix @@ -51,7 +51,7 @@ The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer." progression_minimum = 30 MINUTES item = /obj/item/computer_hardware/hard_drive/role/virus/deto - cost = 6 + cost = 10 restricted = TRUE /datum/uplink_item/explosives/emp @@ -100,4 +100,4 @@ The bomb core can be pried out and manually detonated with other explosives." progression_minimum = 40 MINUTES item = /obj/item/sbeacondrop/bomb - cost = 11 + cost = 16 diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 11ca1df7596f..b4d546ddabae 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -16,7 +16,7 @@ Be warned, that spirits are often capricious or just little assholes. To use, simply speak your question aloud, then begin shaking." item = /obj/item/toy/eightball/haunted cost = 2 - restricted_roles = list(JOB_CURATOR) + restricted_roles = list(JOB_ARCHIVIST) limited_stock = 1 //please don't spam deadchat /datum/uplink_item/role_restricted/bureaucratic_error_remote @@ -53,31 +53,13 @@ // Low progression cost -/datum/uplink_item/role_restricted/clownpin - name = "Ultra Hilarious Firing Pin" - desc = "A firing pin that, when inserted into a gun, makes that gun only usable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it." - progression_minimum = 5 MINUTES - cost = 4 - item = /obj/item/firing_pin/clown/ultra - restricted_roles = list(JOB_CLOWN) - illegal_tech = FALSE - -/datum/uplink_item/role_restricted/clownsuperpin - name = "Super Ultra Hilarious Firing Pin" - desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it." - progression_minimum = 5 MINUTES - cost = 7 - item = /obj/item/firing_pin/clown/ultra/selfdestruct - restricted_roles = list(JOB_CLOWN) - illegal_tech = FALSE - /datum/uplink_item/role_restricted/syndimmi name = "Syndicate Brand MMI" desc = "An MMI modified to give cyborgs laws to serve the Syndicate without having their interface damaged by Cryptographic Sequencers, this will not unlock their hidden modules." progression_minimum = 10 MINUTES item = /obj/item/mmi/syndie cost = 2 - restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER) + restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_MEDICAL_DIRECTOR) surplus = 0 /datum/uplink_item/role_restricted/explosive_hot_potato @@ -88,7 +70,7 @@ item = /obj/item/hot_potato/syndicate cost = 4 surplus = 0 - restricted_roles = list(JOB_COOK, JOB_BOTANIST, JOB_CLOWN, JOB_MIME) + restricted_roles = list(JOB_COOK, JOB_BOTANIST, JOB_CLOWN) /datum/uplink_item/role_restricted/ez_clean_bundle name = "EZ Clean Grenade Bundle" @@ -116,7 +98,7 @@ progression_minimum = 15 MINUTES item = /obj/item/gun/syringe/dna cost = 14 - restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) + restricted_roles = list() /datum/uplink_item/role_restricted/meathook name = "Butcher's Meat Hook" @@ -134,15 +116,6 @@ cost = 11 restricted_roles = list(JOB_STATION_ENGINEER) -/datum/uplink_item/role_restricted/magillitis_serum - name = "Magillitis Serum Autoinjector" - desc = "A single-use autoinjector which contains an experimental serum that causes rapid muscular growth in Hominidae. \ - Side-affects may include hypertrichosis, violent outbursts, and an unending affinity for bananas." - progression_minimum = 20 MINUTES - item = /obj/item/reagent_containers/hypospray/medipen/magillitis - cost = 15 - restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) - /datum/uplink_item/role_restricted/gorillacubes name = "Box of Gorilla Cubes" desc = "A box with three Waffle Co. brand gorilla cubes. Eat big to get big. \ @@ -150,31 +123,9 @@ progression_minimum = 20 MINUTES item = /obj/item/storage/box/gorillacubes cost = 6 - restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) + restricted_roles = list() // Medium progression cost - -/datum/uplink_item/role_restricted/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." - progression_minimum = 25 MINUTES - item = /obj/item/disk/surgery/brainwashing - restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) - cost = 5 - -/datum/uplink_item/role_restricted/springlock_module - name = "Heavily Modified Springlock MODsuit Module" - desc = "A module that spans the entire size of the MOD unit, sitting under the outer shell. \ - This mechanical exoskeleton pushes out of the way when the user enters and it helps in booting \ - up, but was taken out of modern suits because of the springlock's tendency to \"snap\" back \ - into place when exposed to humidity. You know what it's like to have an entire exoskeleton enter you? \ - This version of the module has been modified to allow for near instant activation of the MODsuit. \ - Useful for quickly getting your MODsuit on/off, or for taking care of a target via a tragic accident." - item = /obj/item/mod/module/springlock/bite_of_87 - restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) - cost = 2 - /datum/uplink_item/role_restricted/reverse_revolver name = "Reverse Revolver" desc = "A revolver that always fires at its user. \"Accidentally\" drop your weapon, then watch as the greedy corporate pigs blow their own brains all over the wall. \ @@ -184,33 +135,13 @@ item = /obj/item/storage/box/hug/reverse_revolver restricted_roles = list(JOB_CLOWN) -/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. \ - Occupies 35% mod capacity." - progression_minimum = 30 MINUTES - item = /obj/item/borg/upgrade/modkit/indoors - cost = 5 //you need two for full damage, so total of 10 for maximum damage - limited_stock = 2 //you can't use more than two! - restricted_roles = list("Shaft Miner") - -/datum/uplink_item/role_restricted/mimery - name = "Guide to Advanced Mimery Series" - desc = "The classical two part series on how to further hone your mime skills. Upon studying the series, the user should be able to make 3x1 invisible walls, and shoot bullets out of their fingers. \ - Obviously only works for Mimes." - progression_minimum = 30 MINUTES - cost = 12 - item = /obj/item/storage/box/syndie_kit/mimery - restricted_roles = list(JOB_MIME) - surplus = 0 - /datum/uplink_item/role_restricted/laser_arm name = "Laser Arm Implant" desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application." progression_minimum = 30 MINUTES cost = 10 item = /obj/item/autosurgeon/organ/syndicate/laser_arm - restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) + restricted_roles = list() /datum/uplink_item/role_restricted/chemical_gun name = "Reagent Dartgun" @@ -218,7 +149,7 @@ progression_minimum = 30 MINUTES item = /obj/item/gun/chem cost = 12 - restricted_roles = list(JOB_CHEMIST, JOB_CHIEF_MEDICAL_OFFICER, JOB_BOTANIST) + restricted_roles = list(JOB_CHEMIST, JOB_MEDICAL_DIRECTOR, JOB_BOTANIST) /datum/uplink_item/role_restricted/pie_cannon name = "Banana Cream Pie Cannon" @@ -278,7 +209,7 @@ progression_minimum = 40 MINUTES item = /obj/item/reagent_containers/syringe/spider_extract cost = 10 - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST) + restricted_roles = list() /datum/uplink_item/role_restricted/blastcannon name = "Blast Cannon" @@ -289,4 +220,4 @@ progression_minimum = 45 MINUTES item = /obj/item/gun/blastcannon cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. - restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) + restricted_roles = list() diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index c6934a95eeb9..f5e5955a20d3 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -3,7 +3,7 @@ desc = "For the madman: Contains a handheld Bioterror chem sprayer, a Bioterror foam grenade, a box of lethal chemicals, a dart pistol, \ box of syringes, Donksoft assault rifle, and some riot darts. Remember: Seal suit and equip internals before use." item = /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle - cost = 30 // normally 42 + cost = 20 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS /datum/uplink_item/bundles_tc/bulldog @@ -33,7 +33,7 @@ desc = "The support specialist: Aid your fellow operatives with this medical bundle. Contains a tactical medkit, \ a Donksoft LMG, a box of riot darts and a pair of magboots to rescue your friends in no-gravity environments." item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle - cost = 15 // normally 20 + cost = 10 // normally 20 purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/bundles_tc/sniper @@ -90,22 +90,6 @@ surplus = 0 purchasable_from = UPLINK_CLOWN_OPS -/datum/uplink_item/dangerous/clownoppin - name = "Ultra Hilarious Firing Pin" - desc = "A firing pin that, when inserted into a gun, makes that gun only useable by clowns and clumsy people and makes that gun honk whenever anyone tries to fire it." - cost = 1 //much cheaper for clown ops than for clowns - item = /obj/item/firing_pin/clown/ultra - purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE - -/datum/uplink_item/dangerous/clownopsuperpin - name = "Super Ultra Hilarious Firing Pin" - desc = "Like the ultra hilarious firing pin, except the gun you insert this pin into explodes when someone who isn't clumsy or a clown tries to fire it." - cost = 4 //much cheaper for clown ops than for clowns - item = /obj/item/firing_pin/clown/ultra/selfdestruct - purchasable_from = UPLINK_CLOWN_OPS - illegal_tech = FALSE - /datum/uplink_item/dangerous/bioterror name = "Biohazardous Chemical Sprayer" desc = "A handheld chemical sprayer that allows a wide dispersal of selected chemicals. Especially tailored by the Tiger \ diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index ee463446d266..c9791a0e4052 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -54,8 +54,8 @@ /datum/uplink_item/stealthy_weapons/holster name = "Syndicate Holster" - desc = "A useful little device that allows for inconspicuous carrying of guns using chameleon technology. It also allows for badass gun-spinning." - item = /obj/item/storage/belt/holster/chameleon + desc = "A useful little device that allows for inconspicuous carrying of small arms using chameleon technology. It also allows for badass gun-spinning." + item = /obj/item/storage/belt/holster/shoulder/chameleon cost = 1 /datum/uplink_item/stealthy_weapons/sleepy_pen diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index a33ec6941e63..8619d88bbb56 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -16,7 +16,7 @@ This can be done an unlimited amount of times. Some Syndicate areas and devices can only be accessed \ with these cards." item = /obj/item/card/id/advanced/chameleon - cost = 2 + cost = 1 /datum/uplink_item/stealthy_tools/agent_card_advanced name = "Advanced Agent Identification Card" @@ -134,3 +134,10 @@ var/datum/round_event_control/event = locate(/datum/round_event_control/grid_check) in SSevents.control event.runEvent() return source //For log icon + +/datum/uplink_item/stealthy_tools/voice_changer + name = "Voice Changer" + desc = "This voice-modulation device will dynamically disguise your voice to that of whoever is listed on your identification card, \ + via incredibly complex algorithms. Discretely fits inside most gasmasks, and can be removed with wirecutters." + item = /obj/item/voice_changer + cost = 1 diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index 6290da8b5e23..a0e6bc6d72a1 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -19,7 +19,7 @@ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) /datum/uplink_item/suits/space_suit - name = "Syndicate Space Suit" + name = "Crimson Space Suit" desc = "This red and black Syndicate space suit is less encumbering than Nanotrasen variants, \ fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \ sightings, however." @@ -29,7 +29,7 @@ // Low progression cost /datum/uplink_item/suits/modsuit - name = "Syndicate MODsuit" + name = "Crimson MODsuit" desc = "The feared MODsuit of a Syndicate agent. Features armoring and a set of inbuilt modules." item = /obj/item/mod/control/pre_equipped/traitor cost = 8 diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index e0401ba03982..80d000e55f5f 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, FIRE = 60, ACID = 60) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 60, ACID = 60) layer = VEHICLE_LAYER density = TRUE anchored = FALSE diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 247c35d6921e..35e6a79458ea 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, FIRE = 60, ACID = 60) + armor = list(BLUNT = 50, PUNCTURE = 25, SLASH = 0, LASER = 20, ENERGY = 0, BOMB = 50, BIO = 0, FIRE = 60, ACID = 60) key_type = /obj/item/key/atv integrity_failure = 0.5 var/static/mutable_appearance/atvcover @@ -84,8 +84,8 @@ return PROCESS_KILL if(DT_PROB(10, delta_time)) return - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, src) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = src) smoke.start() /obj/vehicle/ridden/atv/bullet_act(obj/projectile/P) diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index f2b515b68123..fca5a1c2bec1 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -20,7 +20,7 @@ if(car_traits & CAN_KIDNAP) initialize_controller_action_type(/datum/action/vehicle/sealed/dump_kidnapped_mobs, VEHICLE_CONTROL_DRIVE) -/obj/vehicle/sealed/car/MouseDrop_T(atom/dropping, mob/M) +/obj/vehicle/sealed/car/MouseDroppedOn(atom/dropping, mob/M) if(M.stat != CONSCIOUS || (HAS_TRAIT(M, TRAIT_HANDS_BLOCKED) && !is_driver(M))) return FALSE if((car_traits & CAN_KIDNAP) && isliving(dropping) && M != dropping) diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 562e7332cd11..9e72113f1feb 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -3,13 +3,13 @@ desc = "How someone could even fit in there is byond me." icon_state = "clowncar" max_integrity = 150 - armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 80) + armor = list(BLUNT = 70, PUNCTURE = 40, SLASH = 0, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 80) enter_delay = 20 max_occupants = 50 movedelay = 0.6 car_traits = CAN_KIDNAP key_type = /obj/item/bikehorn - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_outer_range = 8 light_power = 2 light_on = FALSE @@ -17,8 +17,6 @@ var/headlight_colors = list(COLOR_RED, COLOR_ORANGE, COLOR_YELLOW, COLOR_LIME, COLOR_BRIGHT_BLUE, COLOR_CYAN, COLOR_PURPLE) ///Cooldown time inbetween [/obj/vehicle/sealed/car/clowncar/proc/roll_the_dice()] usages var/dice_cooldown_time = 150 - ///How many times kidnappers in the clown car said thanks - var/thankscount = 0 ///Current status of the cannon, alternates between CLOWN_CANNON_INACTIVE, CLOWN_CANNON_BUSY and CLOWN_CANNON_READY var/cannonmode = CLOWN_CANNON_INACTIVE @@ -26,6 +24,10 @@ . = ..() START_PROCESSING(SSobj,src) +/obj/vehicle/sealed/car/clowncar/Destroy() + STOP_PROCESSING(SSobj, src) + return ..() + /obj/vehicle/sealed/car/clowncar/process() if(light_on && (obj_flags & EMAGGED)) set_light_color(pick(headlight_colors)) @@ -34,7 +36,6 @@ . = ..() initialize_controller_action_type(/datum/action/vehicle/sealed/horn, VEHICLE_CONTROL_DRIVE) initialize_controller_action_type(/datum/action/vehicle/sealed/headlights, VEHICLE_CONTROL_DRIVE) - initialize_controller_action_type(/datum/action/vehicle/sealed/thank, VEHICLE_CONTROL_KIDNAPPED) /obj/vehicle/sealed/car/clowncar/auto_assign_occupant_flags(mob/M) if(ishuman(M)) @@ -64,12 +65,6 @@ dump_mobs() explosion(src, light_impact_range = 1) -/obj/vehicle/sealed/car/clowncar/after_add_occupant(mob/M, control_flags) - . = ..() - if(return_controllers_with_flag(VEHICLE_CONTROL_KIDNAPPED).len >= 30) - for(var/mob/voreman as anything in return_drivers()) - voreman.client.give_award(/datum/award/achievement/misc/round_and_full, voreman) - /obj/vehicle/sealed/car/clowncar/attack_animal(mob/living/simple_animal/user, list/modifiers) if((user.loc != src) || user.environment_smash & (ENVIRONMENT_SMASH_WALLS|ENVIRONMENT_SMASH_RWALLS)) return ..() @@ -82,7 +77,7 @@ . = ..() if(prob(33)) visible_message(span_danger("[src] spews out a ton of space lube!")) - new /obj/effect/particle_effect/foam(loc) //YEET + new /obj/effect/particle_effect/fluid/foam(loc) //YEET /obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user) . = ..() @@ -154,8 +149,8 @@ var/datum/reagents/randomchems = new/datum/reagents(300) randomchems.my_atom = src randomchems.add_reagent(get_random_reagent_id(), 100) - var/datum/effect_system/foam_spread/foam = new - foam.set_up(200, loc, randomchems) + var/datum/effect_system/fluid_spread/foam/foam = new + foam.set_up(200, location = loc, carry = randomchems) foam.start() if(3) visible_message(span_danger("[user] presses one of the colorful buttons on [src], and the clown car turns on its singularity disguise system.")) @@ -167,8 +162,8 @@ var/datum/reagents/funnychems = new/datum/reagents(300) funnychems.my_atom = src funnychems.add_reagent(/datum/reagent/consumable/superlaughter, 50) - var/datum/effect_system/smoke_spread/chem/smoke = new() - smoke.set_up(funnychems, 4) + var/datum/effect_system/fluid_spread/smoke/chem/smoke = new() + smoke.set_up(4, location = src, carry = funnychems) smoke.attach(src) smoke.start() if(5) @@ -247,11 +242,3 @@ unlucky_sod.throw_at(target, 10, 2) log_combat(user, unlucky_sod, "fired", src, "towards [target]") //this doesn't catch if the mob hits something between the car and the target return COMSIG_MOB_CANCEL_CLICKON - -///Increments the thanks counter every time someone thats been kidnapped thanks the driver -/obj/vehicle/sealed/car/clowncar/proc/increment_thanks_counter() - thankscount++ - if(thankscount < 100) - return - for(var/mob/busdriver as anything in return_drivers()) - busdriver.client.give_award(/datum/award/achievement/misc/the_best_driver, busdriver) diff --git a/code/modules/vehicles/cars/vim.dm b/code/modules/vehicles/cars/vim.dm index 4885b2d44f57..2ff5b612dadb 100644 --- a/code/modules/vehicles/cars/vim.dm +++ b/code/modules/vehicles/cars/vim.dm @@ -9,11 +9,11 @@ desc = "An minature exosuit from Nanotrasen, developed to let the irreplacable station pets live a little longer." icon_state = "vim" max_integrity = 50 - armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 80) + armor = list(BLUNT = 70, PUNCTURE = 40, SLASH = 0, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, FIRE = 80, ACID = 80) enter_delay = 20 movedelay = 0.6 engine_sound_length = 0.3 SECONDS - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_outer_range = 4 light_power = 2 light_on = FALSE diff --git a/code/modules/vehicles/lavaboat.dm b/code/modules/vehicles/lavaboat.dm deleted file mode 100644 index 52f20f3ef1f7..000000000000 --- a/code/modules/vehicles/lavaboat.dm +++ /dev/null @@ -1,80 +0,0 @@ - -//Boat - -/obj/vehicle/ridden/lavaboat - name = "lava boat" - desc = "A boat used for traversing lava." - icon_state = "goliath_boat" - icon = 'icons/obj/lavaland/dragonboat.dmi' - resistance_flags = LAVA_PROOF | FIRE_PROOF - can_buckle = TRUE - key_type = /obj/item/oar - var/allowed_turf = /turf/open/lava - -/obj/vehicle/ridden/lavaboat/Initialize(mapload) - . = ..() - AddElement(/datum/element/ridable, /datum/component/riding/vehicle/lavaboat) - -/obj/item/oar - name = "oar" - desc = "Not to be confused with the kind Research hassles you for." - icon = 'icons/obj/vehicles.dmi' - icon_state = "oar" - inhand_icon_state = "oar" - lefthand_file = 'icons/mob/inhands/misc/lavaland_lefthand.dmi' - righthand_file = 'icons/mob/inhands/misc/lavaland_righthand.dmi' - force = 12 - w_class = WEIGHT_CLASS_NORMAL - resistance_flags = LAVA_PROOF | FIRE_PROOF - -/datum/crafting_recipe/oar - name = "Goliath Bone Oar" - result = /obj/item/oar - reqs = list(/obj/item/stack/sheet/bone = 2) - time = 15 - category = CAT_PRIMAL - -/datum/crafting_recipe/boat - name = "Goliath Hide Boat" - result = /obj/vehicle/ridden/lavaboat - reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide = 3) - time = 50 - category = CAT_PRIMAL - -/obj/vehicle/ridden/lavaboat/plasma - name = "plasma boat" - desc = "A boat used for traversing the streams of plasma without turning into an icecube." - icon_state = "goliath_boat" - icon = 'icons/obj/lavaland/dragonboat.dmi' - resistance_flags = FREEZE_PROOF - can_buckle = TRUE - -/datum/crafting_recipe/boat/plasma - name = "Polar Bear Hide Boat" - result = /obj/vehicle/ridden/lavaboat/plasma - reqs = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 3) - -//Dragon Boat - - -/obj/item/ship_in_a_bottle - name = "ship in a bottle" - desc = "A tiny ship inside a bottle." - icon = 'icons/obj/lavaland/artefacts.dmi' - icon_state = "ship_bottle" - -/obj/item/ship_in_a_bottle/attack_self(mob/user) - to_chat(user, span_notice("You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")) - playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE) - new /obj/vehicle/ridden/lavaboat/dragon(get_turf(src)) - qdel(src) - -/obj/vehicle/ridden/lavaboat/dragon - name = "mysterious boat" - desc = "This boat moves where you will it, without the need for an oar." - icon_state = "dragon_boat" - resistance_flags = LAVA_PROOF | FIRE_PROOF | FREEZE_PROOF - -/obj/vehicle/ridden/lavaboat/dragon/Initialize(mapload) - . = ..() - AddElement(/datum/element/ridable, /datum/component/riding/vehicle/lavaboat/dragonboat) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index feba3904a339..1bdd88087196 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -23,17 +23,22 @@ icon = 'icons/mecha/mecha.dmi' resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 300 - armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 100, ACID = 100) force = 5 movedelay = 1 SECONDS move_force = MOVE_FORCE_VERY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG COOLDOWN_DECLARE(mecha_bump_smash) - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE light_outer_range = 8 generic_canpass = FALSE - hud_possible = list(DIAG_STAT_HUD, DIAG_BATT_HUD, DIAG_MECH_HUD, DIAG_TRACK_HUD) + hud_possible = list( + DIAG_STAT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_BATT_HUD = 'icons/mob/huds/hud.dmi', + DIAG_MECH_HUD = 'icons/mob/huds/hud.dmi', + DIAG_TRACK_HUD = 'icons/mob/huds/hud.dmi' + ) ///What direction will the mech face when entered/powered on? Defaults to South. var/dir_in = SOUTH ///How much energy the mech will consume each time it moves. This variable is a backup for when leg actuators affect the energy drain. @@ -146,7 +151,7 @@ ///Currently ejecting, and unable to do things var/is_currently_ejecting = FALSE - var/datum/effect_system/smoke_spread/smoke_system = new + var/datum/effect_system/fluid_spread/smoke/smoke_system = new ////Action vars ///Ref to any active thrusters we might have @@ -181,9 +186,6 @@ ///Cooldown length between bumpsmashes var/smashcooldown = 3 - ///Bool for whether this mech can only be used on lavaland - var/lavaland_only = FALSE - /// Ui size, so you can make the UI bigger if you let it load a lot of stuff var/ui_x = 1100 /// Ui size, so you can make the UI bigger if you let it load a lot of stuff @@ -224,10 +226,10 @@ START_PROCESSING(SSobj, src) SSpoints_of_interest.make_point_of_interest(src) log_message("[src.name] created.", LOG_MECHA) - GLOB.mechas_list += src //global mech list + SET_TRACKING(__TYPE__) prepare_huds() for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) + diag_hud.add_atom_to_hud(src) diag_hud_set_mechhealth() diag_hud_set_mechcell() diag_hud_set_mechstat() @@ -271,9 +273,9 @@ QDEL_NULL(smoke_system) QDEL_NULL(ui_view) - GLOB.mechas_list -= src //global mech list + UNSET_TRACKING(__TYPE__) for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.remove_from_hud(src) //YEET + diag_hud.remove_atom_from_hud(src) //YEET lose_atmos_sensitivity() return ..() @@ -315,7 +317,7 @@ if(!phasing || get_charge() <= phasing_energy_drain || throwing) return ..() if(phase_state) - flick(phase_state, src) + z_flick(phase_state, src) var/turf/destination_turf = get_step(loc, movement_dir) var/area/destination_area = destination_turf.loc if(destination_area.area_flags & NOTELEPORT || SSmapping.level_trait(destination_turf.z, ZTRAIT_NOPHASE)) @@ -351,10 +353,9 @@ normal_step_energy_drain = 500 step_energy_drain = normal_step_energy_drain if(capacitor) - armor = armor.modifyRating(energy = (capacitor.rating * 5)) //Each level of capacitor protects the mech against emp by 5% + setArmor(returnArmor().modifyRating(energy = (capacitor.rating * 5))) //Each level of capacitor protects the mech against emp by 5% else //because we can still be hit without a cap, even if we can't move - armor = armor.setRating(energy = 0) - + setArmor(returnArmor().setRating(energy = 0)) //////////////////////// ////// Helpers ///////// @@ -726,11 +727,6 @@ to_chat(occupants, "[icon2html(src, occupants)][span_warning("Insufficient power to move!")]") TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) return FALSE - if(lavaland_only && is_mining_level(z)) - if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_MESSAGE)) - to_chat(occupants, "[icon2html(src, occupants)][span_warning("Invalid Environment.")]") - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MESSAGE, 2 SECONDS) - return FALSE var/olddir = dir @@ -1090,7 +1086,7 @@ log_message("[brain_obj] moved in as pilot.", LOG_MECHA) if(!internal_damage) SEND_SOUND(brain_obj, sound('sound/mecha/nominal.ogg',volume=50)) - log_game("[key_name(user)] has put the MMI/posibrain of [key_name(brain_mob)] into [src] at [AREACOORD(src)]") + log_game("[key_name(user)] has put the organ/posibrain of [key_name(brain_mob)] into [src] at [AREACOORD(src)]") return TRUE /obj/vehicle/sealed/mecha/container_resist_act(mob/living/user) @@ -1157,11 +1153,14 @@ /obj/vehicle/sealed/mecha/add_occupant(mob/M, control_flags) + . = ..() + if(!.) + return + RegisterSignal(M, COMSIG_LIVING_DEATH, PROC_REF(mob_exit)) RegisterSignal(M, COMSIG_MOB_CLICKON, PROC_REF(on_mouseclick)) RegisterSignal(M, COMSIG_MOB_MIDDLECLICKON, PROC_REF(on_middlemouseclick)) //For AIs RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(display_speech_bubble)) - . = ..() update_appearance() /obj/vehicle/sealed/mecha/remove_occupant(mob/M) diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm index 7f6265fd714e..442e43106b36 100644 --- a/code/modules/vehicles/mecha/combat/combat.dm +++ b/code/modules/vehicles/mecha/combat/combat.dm @@ -1,7 +1,7 @@ /obj/vehicle/sealed/mecha/combat force = 30 internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) - armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) mouse_pointer = 'icons/effects/mouse_pointers/mecha_mouse.dmi' destruction_sleep_duration = 40 exit_delay = 40 diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 47d545711305..51251d4a2a49 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -6,7 +6,7 @@ movedelay = 4 dir_in = 1 //Facing North. max_integrity = 400 - armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 35, SLASH = 0, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 30000 force = 40 wreckage = /obj/structure/mecha_wreckage/durand @@ -152,7 +152,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe pixel_y = 4 max_integrity = 10000 anchored = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_outer_range = MINIMUM_USEFUL_LIGHT_RANGE light_power = 5 light_color = LIGHT_COLOR_ELECTRIC_CYAN diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index ba92d3f162da..fc05ea17cedc 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -7,7 +7,7 @@ movedelay = 3 dir_in = 1 //Facing North. max_integrity = 250 - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 25000 leg_overload_coeff = 80 force = 25 @@ -52,7 +52,7 @@ icon_state = "darkgygax" base_icon_state = "darkgygax" max_integrity = 300 - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 35000 leg_overload_coeff = 70 force = 30 diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index b3b5aa3bc9da..ff41c5d34ee9 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -5,7 +5,7 @@ base_icon_state = "honker" movedelay = 3 max_integrity = 140 - armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = -20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 25000 operation_req_access = list(ACCESS_THEATRE) internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) @@ -31,7 +31,7 @@ name = "\improper Dark H.O.N.K" icon_state = "darkhonker" max_integrity = 300 - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 40, SLASH = 0, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 35000 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index cd50f3a479c1..f95d21d5527a 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -5,7 +5,7 @@ base_icon_state = "marauder" movedelay = 5 max_integrity = 500 - armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 50, PUNCTURE = 55, SLASH = 0, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 60000 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF operation_req_access = list(ACCESS_CENT_SPECOPS) diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index 0a3ede303ebd..0c57c3f8f56f 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -7,7 +7,7 @@ dir_in = 2 //Facing South. step_energy_drain = 3 max_integrity = 200 - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 30, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 25000 wreckage = /obj/structure/mecha_wreckage/phazon force = 15 diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm index afb91667b31b..643b375a256b 100644 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -6,7 +6,7 @@ movedelay = 2 dir_in = 1 //Facing North. max_integrity = 100 - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 25, PUNCTURE = 20, SLASH = 0, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 15000 wreckage = /obj/structure/mecha_wreckage/reticence operation_req_access = list(ACCESS_THEATRE) diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 0d8504f46afa..35cea0ae9e6a 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -22,7 +22,7 @@ mecha_flags = ADDING_ACCESS_POSSIBLE | CANSTRAFE | IS_ENCLOSED | HAS_LIGHTS movedelay = 3 max_integrity = 450 //really tanky, like damn - armor = list(MELEE = 45, BULLET = 40, LASER = 30, ENERGY = 30, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 45, PUNCTURE = 40, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) max_temperature = 30000 wreckage = /obj/structure/mecha_wreckage/savannah_ivanov max_occupants = 2 diff --git a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm index 229633418468..5300c072c4fb 100644 --- a/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/medical_tools.dm @@ -169,10 +169,10 @@ var/core_temp = "" if(ishuman(patient)) var/mob/living/carbon/human/humi = patient - core_temp = {"Body Temperature: [humi.bodytemperature-T0C]°C ([humi.bodytemperature*1.8-459.67]°F)
"} + core_temp = {"Body Temperature: [humi.bodytemperature-T0C]°C ([FAHRENHEIT(humi.bodytemperature)]°F)
"} return {"Health: [patient.stat > 1 ? "[t1]" : "[patient.health]% ([t1])"]
[core_temp] - Body Temperature: [patient.bodytemperature-T0C]°C ([patient.bodytemperature*1.8-459.67]°F)
+ Body Temperature: [patient.bodytemperature-T0C]°C ([FAHRENHEIT(patient.bodytemperature)]°F)
Brute Damage: [patient.getBruteLoss()]%
Respiratory Damage: [patient.getOxyLoss()]%
Toxin Content: [patient.getToxLoss()]%
@@ -272,7 +272,10 @@ /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Initialize(mapload) . = ..() create_reagents(max_volume, NO_REACT) - known_reagents = list(/datum/reagent/medicine/epinephrine="Epinephrine",/datum/reagent/medicine/c2/multiver="Multiver") + known_reagents = list( + /datum/reagent/medicine/epinephrine = "Epinephrine", + /datum/reagent/medicine/dylovene = "Dylovene", + ) /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun/Destroy() STOP_PROCESSING(SSobj, src) @@ -460,7 +463,7 @@ return FALSE to_chat(user, "[icon2html(src, user)][span_notice("Analyzing reagents...")]") for(var/datum/reagent/R in A.reagents.reagent_list) - if((R.chemical_flags & REAGENT_CAN_BE_SYNTHESIZED) && add_known_reagent(R.type,R.name)) + if(!(R.chemical_flags & REAGENT_INVISIBLE) && add_known_reagent(R.type,R.name)) to_chat(user, "[icon2html(src, user)][span_notice("Reagent analyzed, identified as [R.name] and added to database.")]") send_byjax(chassis.occupants,"msyringegun.browser","reagents_form",get_reagents_form()) to_chat(user, "[icon2html(src, user)][span_notice("Analysis complete.")]") @@ -525,7 +528,7 @@ medigun.process(SSOBJ_DT) /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/action(mob/source, atom/movable/target, list/modifiers) - medigun.process_fire(target, loc) + medigun.do_fire_gun(target, loc) /obj/item/mecha_parts/mecha_equipment/medical/mechmedbeam/detach() STOP_PROCESSING(SSobj, src) diff --git a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm index 3ea40b43c512..b36e915cf30e 100644 --- a/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/mining_tools.dm @@ -89,7 +89,7 @@ /turf/closed/mineral/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill, mob/user) for(var/turf/closed/mineral/M in range(drill.chassis,1)) if(get_dir(drill.chassis,M)&drill.chassis.dir) - M.gets_drilled() + M.MinedAway() drill.log_message("[user] drilled through [src]", LOG_MECHA) drill.move_ores() @@ -126,7 +126,7 @@ target.visible_message(span_danger("[chassis] is drilling [target] with [src]!"), \ span_userdanger("[chassis] is drilling you with [src]!")) log_combat(user, target, "drilled", "[name]", "Combat mode: [user.combat_mode ? "On" : "Off"])(DAMTYPE: [uppertext(damtype)])") - if(target.stat == DEAD && target.getBruteLoss() >= (target.maxHealth * 2)) + if(target.stat == DEAD && target.getBruteLoss() >= target.maxHealth) log_combat(user, target, "gibbed", name) if(LAZYLEN(target.butcher_results) || LAZYLEN(target.guaranteed_butcher_results)) var/datum/component/butchering/butchering = src.GetComponent(/datum/component/butchering) @@ -136,7 +136,7 @@ else //drill makes a hole var/obj/item/bodypart/target_part = target.get_bodypart(ran_zone(BODY_ZONE_CHEST)) - target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, MELEE)) + target.apply_damage(10, BRUTE, BODY_ZONE_CHEST, target.run_armor_check(target_part, BLUNT)) //blood splatters var/splatter_dir = get_dir(chassis, target) @@ -173,6 +173,10 @@ . = ..() START_PROCESSING(SSfastprocess, src) +/obj/item/mecha_parts/mecha_equipment/mining_scanner/Destroy() + STOP_PROCESSING(SSfastprocess, src) + return ..() + /obj/item/mecha_parts/mecha_equipment/mining_scanner/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) if(..()) if(istype(M, /obj/vehicle/sealed/mecha/working)) diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm index d1b9f463f5fc..e92f2779a2ef 100644 --- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm @@ -159,17 +159,17 @@ ///icon in armor.dmi that shows in the UI var/iconstate_name //how much the armor of the mech is modified by - var/list/armor_mod = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + var/list/armor_mod = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/mecha_parts/mecha_equipment/armor/attach(obj/vehicle/sealed/mecha/M, attach_right) . = ..() - chassis.armor = chassis.armor.modifyRating(arglist(armor_mod)) + chassis.setArmor(chassis.returnArmor().modifyRating(arglist(armor_mod))) /obj/item/mecha_parts/mecha_equipment/armor/detach(atom/moveto) var/list/removed_armor = armor_mod.Copy() for(var/armor_type in removed_armor) removed_armor[armor_type] = -removed_armor[armor_type] - chassis.armor = chassis.armor.modifyRating(arglist(removed_armor)) + chassis.setArmor(chassis.returnArmor().modifyRating(arglist(removed_armor))) return ..() /obj/item/mecha_parts/mecha_equipment/armor/anticcw_armor_booster @@ -178,7 +178,7 @@ icon_state = "mecha_abooster_ccw" iconstate_name = "melee" protect_name = "Melee Armor" - armor_mod = list(MELEE = 15, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor_mod = list(BLUNT = 15, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) /obj/item/mecha_parts/mecha_equipment/armor/antiproj_armor_booster name = "armor booster module (Ranged Weaponry)" @@ -186,7 +186,7 @@ icon_state = "mecha_abooster_proj" iconstate_name = "range" protect_name = "Ranged Armor" - armor_mod = list(MELEE = 0, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) + armor_mod = list(BLUNT = 0, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0) ////////////////////////////////// REPAIR DROID ////////////////////////////////////////////////// @@ -434,7 +434,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 environments, by expelling gas from the internal life support tank." - effect_type = /obj/effect/particle_effect/smoke + effect_type = /obj/effect/particle_effect/fluid/smoke var/move_cost = 20 //moles per step /obj/item/mecha_parts/mecha_equipment/thrusters/gas/try_attach_part(mob/user, obj/vehicle/sealed/mecha/M, attach_right = FALSE) diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index 0b1de79e6994..24b987bbdcc6 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -251,10 +251,10 @@ /obj/item/mecha_parts/mecha_equipment/rcd/Initialize(mapload) . = ..() - GLOB.rcd_list += src + SET_TRACKING(TRACKING_KEY_RCD) /obj/item/mecha_parts/mecha_equipment/rcd/Destroy() - GLOB.rcd_list -= src + UNSET_TRACKING(TRACKING_KEY_RCD) return ..() /obj/item/mecha_parts/mecha_equipment/rcd/get_snowflake_data() diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index 86d6a775c561..231c4eca71c1 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -134,25 +134,6 @@ return TRUE return FALSE -//Exosuit-mounted kinetic accelerator -/obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun - equip_cooldown = 10 - name = "Exosuit Proto-kinetic Accelerator" - desc = "An exosuit-mounted mining tool that does increased damage in low pressure. Drawing from an onboard power source allows it to project further than the handheld version." - icon_state = "mecha_kineticgun" - energy_drain = 30 - projectile = /obj/projectile/kinetic/mech - fire_sound = 'sound/weapons/kenetic_accel.ogg' - harmful = TRUE - -//attachable to all mechas, like the plasma cutter -/obj/item/mecha_parts/mecha_equipment/weapon/energy/mecha_kineticgun/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE) - . = ..() - if(.) //combat mech - return - if(default_can_attach(M, attach_right)) - return TRUE - /obj/item/mecha_parts/mecha_equipment/weapon/energy/taser name = "\improper PBT \"Pacifier\" mounted taser" desc = "A weapon for combat exosuits. Shoots non-lethal stunning electrodes." diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 7b1261b6f4aa..653d95b05f31 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -41,7 +41,7 @@ return 0 mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) ..() - return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. + return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, BLUNT, FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. /obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) if(!can_be_reached()) diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 2585b2a72a9c..92cb8ed29c40 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -17,7 +17,7 @@ var/list/data = list() var/list/trackerlist = list() - for(var/obj/vehicle/sealed/mecha/MC in GLOB.mechas_list) + for(var/obj/vehicle/sealed/mecha/MC as anything in INSTANCES_OF(/obj/vehicle/sealed/mecha)) trackerlist += MC.trackers data["mechs"] = list() diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm index f85e2dd34e1a..830b1218be56 100644 --- a/code/modules/vehicles/mecha/mecha_defense.dm +++ b/code/modules/vehicles/mecha/mecha_defense.dm @@ -85,7 +85,7 @@ /obj/vehicle/sealed/mecha/attack_alien(mob/living/user, list/modifiers) log_message("Attack by alien. Attacker - [user].", LOG_MECHA, color="red") playsound(loc, 'sound/weapons/slash.ogg', 100, TRUE) - attack_generic(user, rand(user.melee_damage_lower, user.melee_damage_upper), BRUTE, MELEE, 0) + attack_generic(user, rand(user.melee_damage_lower, user.melee_damage_upper), BRUTE, BLUNT, 0) /obj/vehicle/sealed/mecha/attack_animal(mob/living/simple_animal/user, list/modifiers) log_message("Attack by simple animal. Attacker - [user].", LOG_MECHA, color="red") @@ -102,7 +102,7 @@ animal_damage = user.obj_damage animal_damage = min(animal_damage, 20*user.environment_smash) log_combat(user, src, "attacked") - attack_generic(user, animal_damage, user.melee_damage_type, MELEE, play_soundeffect) + attack_generic(user, animal_damage, user.melee_damage_type, BLUNT, play_soundeffect) return 1 @@ -117,7 +117,7 @@ /obj/vehicle/sealed/mecha/blob_act(obj/structure/blob/B) log_message("Attack by blob. Attacker - [B].", LOG_MECHA, color="red") - take_damage(30, BRUTE, MELEE, 0, get_dir(src, B)) + take_damage(30, BRUTE, BLUNT, 0, get_dir(src, B)) /obj/vehicle/sealed/mecha/attack_tk() return @@ -133,7 +133,7 @@ return BULLET_ACT_HIT log_message("Hit by projectile. Type: [hitting_projectile]([hitting_projectile.damage_type]).", LOG_MECHA, color="red") // yes we *have* to run the armor calc proc here I love tg projectile code too - try_damage_component(run_atom_armor(hitting_projectile.damage, hitting_projectile.damage_type, hitting_projectile.damage_type, 0, REVERSE_DIR(hitting_projectile.dir), hitting_projectile.armour_penetration), hitting_projectile.def_zone) + try_damage_component(run_atom_armor(hitting_projectile.damage, hitting_projectile.damage_type, hitting_projectile.armor_flag, 0, REVERSE_DIR(hitting_projectile.dir), hitting_projectile.armor_penetration), hitting_projectile.def_zone) return ..() /obj/vehicle/sealed/mecha/ex_act(severity, target) @@ -146,25 +146,25 @@ switch(severity) if(EXPLODE_DEVASTATE) if(flat_equipment) - SSexplosions.high_mov_atom += flat_equipment + EX_ACT_LIST(flat_equipment, EXPLODE_DEVASTATE) if(trackers) - SSexplosions.high_mov_atom += trackers + EX_ACT_LIST(trackers, EXPLODE_DEVASTATE) if(occupants) - SSexplosions.high_mov_atom += occupants + EX_ACT_LIST(occupants, EXPLODE_DEVASTATE) if(EXPLODE_HEAVY) if(flat_equipment) - SSexplosions.med_mov_atom += flat_equipment + EX_ACT_LIST(flat_equipment, EXPLODE_HEAVY) if(trackers) - SSexplosions.med_mov_atom += trackers + EX_ACT_LIST(trackers, EXPLODE_HEAVY) if(occupants) - SSexplosions.med_mov_atom += occupants + EX_ACT_LIST(occupants, EXPLODE_HEAVY) if(EXPLODE_LIGHT) if(flat_equipment) - SSexplosions.low_mov_atom += flat_equipment + EX_ACT_LIST(flat_equipment, EXPLODE_LIGHT) if(trackers) - SSexplosions.low_mov_atom += trackers + EX_ACT_LIST(trackers, EXPLODE_LIGHT) if(occupants) - SSexplosions.low_mov_atom += occupants + EX_ACT_LIST(occupants, EXPLODE_LIGHT) /obj/vehicle/sealed/mecha/handle_atom_del(atom/A) if(A in occupants) //todo does not work and in wrong file diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index 9950e78311bd..60a6837bb8e9 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -344,8 +344,8 @@ flags_1 = CONDUCT_1 force = 5 w_class = WEIGHT_CLASS_SMALL + throwforce = 0 - throw_speed = 3 throw_range = 7 /obj/item/circuitboard/mecha/ripley/peripherals diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index 3df53a4df212..892501e78f94 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -105,7 +105,7 @@ if(AI.client) //AI player is still in the dead AI and is connected to_chat(AI, span_notice("The remains of your file system have been recovered on a mobile storage device.")) else //Give the AI a heads-up that it is probably going to get fixed. - AI.notify_ghost_cloning("You have been recovered from the wreckage!", source = card) + AI.notify_ghost_revival("You have been recovered from the wreckage!", source = card) to_chat(user, "[span_boldnotice("Backup files recovered")]: [AI.name] ([rand(1000,9999)].exe) salvaged from [name] and stored within local memory.") AI = null diff --git a/code/modules/vehicles/mecha/medical/odysseus.dm b/code/modules/vehicles/mecha/medical/odysseus.dm index fbf4960e6c90..6bc7807fdc0b 100644 --- a/code/modules/vehicles/mecha/medical/odysseus.dm +++ b/code/modules/vehicles/mecha/medical/odysseus.dm @@ -15,13 +15,13 @@ . = ..() if(. && !HAS_TRAIT(H, TRAIT_MEDICAL_HUD)) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - hud.add_hud_to(H) + hud.show_to(H) ADD_TRAIT(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) /obj/vehicle/sealed/mecha/medical/odysseus/remove_occupant(mob/living/carbon/human/H) if(isliving(H) && HAS_TRAIT_FROM(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT)) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] - hud.remove_hud_from(H) + hud.hide_from(H) REMOVE_TRAIT(H, TRAIT_MEDICAL_HUD, VEHICLE_TRAIT) return ..() @@ -30,4 +30,4 @@ if(. && !HAS_TRAIT(M, TRAIT_MEDICAL_HUD)) var/datum/atom_hud/hud = GLOB.huds[DATA_HUD_MEDICAL_ADVANCED] var/mob/living/brain/B = M.brainmob - hud.add_hud_to(B) + hud.show_to(B) diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index 32c4d96264bb..cb48d9de666c 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -10,7 +10,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF lights_power = 7 step_energy_drain = 15 //slightly higher energy drain since you movin those wheels FAST - armor = list(MELEE = 20, BULLET = 10, LASER = 20, ENERGY = 10, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) //low armor to compensate for fire protection and speed + armor = list(BLUNT = 20, PUNCTURE = 10, SLASH = 0, LASER = 20, ENERGY = 10, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) //low armor to compensate for fire protection and speed equip_by_category = list( MECHA_L_ARM = null, MECHA_R_ARM = null, diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 276d3c8950b5..8e9c4c018715 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -9,7 +9,7 @@ max_integrity = 200 ui_x = 1200 lights_power = 7 - armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 20, SLASH = 0, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, FIRE = 100, ACID = 100) max_equip_by_category = list( MECHA_UTILITY = 2, MECHA_POWER = 1, @@ -54,7 +54,7 @@ /obj/vehicle/sealed/mecha/working/ripley/Initialize(mapload) . = ..() - AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) + AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide, list(BLUNT = 10, PUNCTURE = 5, LASER = 5)) /obj/vehicle/sealed/mecha/working/ripley/Destroy() @@ -75,7 +75,7 @@ max_temperature = 30000 max_integrity = 250 possible_int_damage = MECHA_INT_FIRE|MECHA_INT_TEMP_CONTROL|MECHA_INT_TANK_BREACH|MECHA_INT_CONTROL_LOST|MECHA_INT_SHORT_CIRCUIT - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, FIRE = 100, ACID = 100) wreckage = /obj/structure/mecha_wreckage/ripley/mk2 enclosed = TRUE enter_delay = 40 @@ -226,15 +226,13 @@ if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. to_chat(user, span_warning("You fail to push [O] out of [src]!")) -/** - * Makes the mecha go faster and halves the mecha drill cooldown if in Lavaland pressure. - * - * Checks for Lavaland pressure, if that works out the mech's speed is equal to fast_pressure_step_in and the cooldown for the mecha drill is halved. If not it uses slow_pressure_step_in and drill cooldown is normal. - */ +/// Increases movement and drill speed in lower pressure environments because of less air resistance or something /obj/vehicle/sealed/mecha/working/ripley/proc/update_pressure() var/turf/T = get_turf(loc) + var/datum/gas_mixture/environment = T.unsafe_return_air() + var/pressure = environment.returnPressure() - if(lavaland_equipment_pressure_check(T)) + if(pressure < 20) movedelay = fast_pressure_step_in for(var/obj/item/mecha_parts/mecha_equipment/drill/drill in flat_equipment) drill.equip_cooldown = initial(drill.equip_cooldown) * 0.5 diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm index b03229d283ea..58af8bb6602b 100644 --- a/code/modules/vehicles/ridden.dm +++ b/code/modules/vehicles/ridden.dm @@ -40,7 +40,7 @@ inserted_key = I /obj/vehicle/ridden/AltClick(mob/user) - if(!inserted_key || !user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !issilicon(user))) + if(!inserted_key || !user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return ..() if(!is_occupant(user)) to_chat(user, span_warning("You must be riding the [src] to remove [src]'s key!")) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index efabe5c3513c..b8cae0da1e60 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -122,9 +122,10 @@ /obj/vehicle/ridden/scooter/skateboard/proc/grind() step(src, dir) if(!has_buckled_mobs() || !(locate(/obj/structure/table) in loc.contents) && !(locate(/obj/structure/fluff/tram_rail) in loc.contents)) - obj_flags = CAN_BE_HIT + obj_flags |= CAN_BE_HIT grinding = FALSE icon_state = "[initial(icon_state)]" + lose_block_z_out(BLOCK_Z_OUT_DOWN) return var/mob/living/skater = buckled_mobs[1] diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 722a429c29cf..2cd2c2a60f3e 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -14,7 +14,7 @@ if(istype(E)) E.vehicle_entered_target = src -/obj/vehicle/sealed/MouseDrop_T(atom/dropping, mob/M) +/obj/vehicle/sealed/MouseDroppedOn(atom/dropping, mob/M) if(!istype(dropping) || !istype(M)) return ..() if(M == dropping) diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index deba7a96ed70..f028248cd058 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 = 60 - armor = list(MELEE = 10, BULLET = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 60) + armor = list(BLUNT = 10, PUNCTURE = 0, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 60, ACID = 60) key_type = /obj/item/key/security integrity_failure = 0.5 @@ -24,8 +24,8 @@ return PROCESS_KILL if(DT_PROB(10, delta_time)) return - var/datum/effect_system/smoke_spread/smoke = new - smoke.set_up(0, src) + var/datum/effect_system/fluid_spread/smoke/smoke = new + smoke.set_up(0, location = src) smoke.start() /obj/vehicle/ridden/secway/welder_act(mob/living/user, obj/item/I) diff --git a/code/modules/vehicles/trolley.dm b/code/modules/vehicles/trolley.dm index 338633652efa..11762fddb308 100644 --- a/code/modules/vehicles/trolley.dm +++ b/code/modules/vehicles/trolley.dm @@ -4,9 +4,10 @@ name = "trolley" desc = "It's mostly used to move crates around in bulk." icon = 'icons/obj/vehicles.dmi' - icon_state = "trolley_0" + icon_state = "trolley" max_integrity = 150 - armor = list(MELEE = 0, BULLET = 0, LASER = 20, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) + armor = list(BLUNT = 0, PUNCTURE = 0, SLASH = 0, LASER = 20, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 0) + var/cargo_limit = MAX_CARGO_LIMIT var/amount_of_cargo = 0 /obj/vehicle/ridden/trolley/Initialize(mapload) @@ -14,8 +15,12 @@ ADD_TRAIT(src, TRAIT_KEEP_DIRECTION_WHILE_PULLING, INNATE_TRAIT) ADD_TRAIT(src, TRAIT_REJECT_INSERTION, INNATE_TRAIT) AddElement(/datum/element/ridable, /datum/component/riding/vehicle/trolley) - var/handlebars = new /image{icon_state = "trolley_handlebars"; layer = MOB_BELOW_PIGGYBACK_LAYER} - add_overlay(handlebars) + AddComponent(/datum/component/simple_rotation) + update_appearance(UPDATE_OVERLAYS) + +/obj/vehicle/ridden/trolley/update_overlays() + . = ..() + . += image(icon, "trolley_handlebars", layer = TROLLEY_BARS_LAYER) /obj/vehicle/ridden/trolley/atom_destruction(damage_flag) for(var/obj/structure/closet/crate/cargo in contents) @@ -45,15 +50,24 @@ playsound(src, pick('sound/effects/wounds/crack1.ogg', 'sound/effects/wounds/crack2.ogg'), 40) animate(src, pixel_y = -4, time = 0.5 SECONDS, easing = SINE_EASING) animate(occupants[1], pixel_y = 4, time = 0.5 SECONDS, easing = SINE_EASING) + if(amount_of_cargo) + handle_transform() + +/obj/vehicle/ridden/trolley/proc/handle_transform(unloading) + var/matrix/new_transform = matrix() + if(dir == WEST && !unloading) + new_transform.Scale(-1,1) + for(var/obj/structure/closet/crate/cargo in contents) + cargo.transform = new_transform /obj/vehicle/ridden/trolley/examine(mob/user) . = ..() if(amount_of_cargo) - . += "There [amount_of_cargo > 1 ? "are [amount_of_cargo] crates" : "is 1 crate" ] currently loaded on it." + . += span_notice("There [amount_of_cargo > 1 ? "are [amount_of_cargo] crates" : "is 1 crate" ] currently loaded on it.") else if(LAZYLEN(occupants)) - . += "[occupants[1]] is riding it." + . += span_notice("[occupants[1]] is riding it.") -/obj/vehicle/ridden/trolley/MouseDrop_T(atom/dropped_atom, mob/living/user) +/obj/vehicle/ridden/trolley/MouseDroppedOn(atom/dropped_atom, mob/living/user) if(isliving(dropped_atom)) var/mob/living/buckling_mob = dropped_atom return ..(buckling_mob, user) @@ -64,7 +78,7 @@ if(LAZYLEN(occupants)) to_chat(user, span_warning("You cannot load [new_cargo] whilst someone is riding [src]!")) return FALSE - if(amount_of_cargo >= MAX_CARGO_LIMIT) + if(amount_of_cargo >= cargo_limit) to_chat(user, span_warning("[src] is at max capacity!")) return FALSE @@ -75,7 +89,7 @@ if(LAZYLEN(occupants)) to_chat(user, span_warning("You cannot load [new_cargo] whilst someone is riding [src]!")) return FALSE - if(amount_of_cargo >= MAX_CARGO_LIMIT) + if(amount_of_cargo >= cargo_limit) to_chat(user, span_warning("[src] is at max capacity!")) return FALSE @@ -95,8 +109,14 @@ /obj/vehicle/ridden/trolley/proc/load_cargo(obj/structure/closet/crate/cargo) cargo.close() cargo.forceMove(src) + vis_contents += cargo + cargo.vis_flags = VIS_INHERIT_ID + cargo.layer = ABOVE_MOB_LAYER + cargo.pixel_y = 4 + if(amount_of_cargo) + cargo.pixel_y += 12 * amount_of_cargo amount_of_cargo++ - icon_state = "trolley_[amount_of_cargo]" + handle_transform() /obj/vehicle/ridden/trolley/proc/unload_cargo(mob/living/user) if(!amount_of_cargo) @@ -106,16 +126,21 @@ var/obj/structure/closet/crate/cargo = contents[amount_of_cargo] var/turf/deposit_turf = get_turf(get_step(src, dir)) - if(!deposit_turf.Enter(cargo)) + if(!deposit_turf.Enter(cargo, TRUE)) to_chat(user, span_warning("There's no space to unload from [src]!")) return + handle_transform(TRUE) + cargo.pixel_y = initial(pixel_y) + cargo.layer = initial(layer) + cargo.vis_flags &= ~VIS_INHERIT_ID + vis_contents -= cargo cargo.forceMove(deposit_turf) user.visible_message( span_notice("[user] unloads [cargo] from [src]."), span_notice("You unload [cargo] from [src].")) amount_of_cargo-- - icon_state = "trolley_[amount_of_cargo]" + handle_transform() /obj/vehicle/ridden/trolley/attack_hand(mob/living/user, list/modifiers) . = ..() diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index 6880f44adba7..b6ab31deb1d2 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -261,28 +261,6 @@ var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target C.toggle_cannon(owner) - -/datum/action/vehicle/sealed/thank - name = "Thank the Clown Car Driver" - desc = "They're just doing their job." - button_icon_state = "car_thanktheclown" - COOLDOWN_DECLARE(thank_time_cooldown) - - -/datum/action/vehicle/sealed/thank/Trigger(trigger_flags) - if(!istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar)) - return - if(!COOLDOWN_FINISHED(src, thank_time_cooldown)) - return - COOLDOWN_START(src, thank_time_cooldown, 6 SECONDS) - var/obj/vehicle/sealed/car/clowncar/clown_car = vehicle_entered_target - var/mob/living/carbon/human/clown = pick(clown_car.return_drivers()) - if(!clown) - return - owner.say("Thank you for the fun ride, [clown.name]!") - clown_car.increment_thanks_counter() - - /datum/action/vehicle/ridden/scooter/skateboard/ollie name = "Ollie" desc = "Get some air! Land on a table to do a gnarly grind." @@ -309,13 +287,12 @@ vehicle.visible_message(span_danger("[rider] misses the landing and falls on [rider.p_their()] face!")) return if((locate(/obj/structure/table) in landing_turf) || (locate(/obj/structure/fluff/tram_rail) in landing_turf)) - if(locate(/obj/structure/fluff/tram_rail) in vehicle.loc.contents) - rider.client.give_award(/datum/award/achievement/misc/tram_surfer, rider) vehicle.grinding = TRUE vehicle.icon_state = "[initial(vehicle.icon_state)]-grind" addtimer(CALLBACK(vehicle, TYPE_PROC_REF(/obj/vehicle/ridden/scooter/skateboard, grind)), 2) else - vehicle.obj_flags &= ~BLOCK_Z_OUT_DOWN + vehicle.lose_block_z_out(BLOCK_Z_OUT_DOWN) + rider.spin(4, 1) animate(rider, pixel_y = -6, time = 4) animate(vehicle, pixel_y = -6, time = 3) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index b38e78c3c63a..0ecda6daa7d8 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, FIRE = 20, ACID = 30) //Wheelchairs aren't super tough yo + armor = list(BLUNT = 10, PUNCTURE = 10, SLASH = 0, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, FIRE = 20, ACID = 30) //Wheelchairs aren't super tough yo density = FALSE //Thought I couldn't fix this one easily, phew /// Run speed delay is multiplied with this for vehicle move delay. var/delay_multiplier = 6.7 @@ -29,7 +29,8 @@ /obj/vehicle/ridden/wheelchair/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE) . = ..() - playsound(src, 'sound/effects/roll.ogg', 75, TRUE) + if(!forced && !CHECK_MOVE_LOOP_FLAGS(src, MOVEMENT_LOOP_OUTSIDE_CONTROL) && has_gravity()) + playsound(src, 'sound/effects/roll.ogg', 75, TRUE) /obj/vehicle/ridden/wheelchair/post_buckle_mob(mob/living/user) . = ..() @@ -67,7 +68,7 @@ icon_state = "gold_wheelchair" overlay_icon = "gold_wheelchair_overlay" max_integrity = 200 - armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 40) + armor = list(BLUNT = 20, PUNCTURE = 20, SLASH = 0, LASER = 20, ENERGY = 0, BOMB = 20, BIO = 0, FIRE = 30, ACID = 40) custom_materials = list(/datum/material/gold = 10000) foldabletype = /obj/item/wheelchair/gold @@ -101,7 +102,7 @@ . = ..() if(over_object != usr || !Adjacent(usr) || !foldabletype) return FALSE - if(!ishuman(usr) || !usr.canUseTopic(src, BE_CLOSE)) + if(!ishuman(usr) || !usr.canUseTopic(src, USE_CLOSE)) return FALSE if(has_buckled_mobs()) return FALSE diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index a37e03f69a85..f1b37bc33d8c 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -23,7 +23,7 @@ /datum/data/vending_product name = "generic" ///Typepath of the product that is created when this record "sells" - var/product_path = null + var/atom/movable/product_path = null ///How many of this product we currently have var/amount = 0 ///How many we can store at maximum @@ -39,6 +39,7 @@ ///List of items that have been returned to the vending machine. var/list/returned_products +DEFINE_INTERACTABLE(/obj/machinery/vending) /** * # vending machines * @@ -56,7 +57,7 @@ verb_exclaim = "beeps" max_integrity = 300 integrity_failure = 0.33 - armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) + armor = list(BLUNT = 20, PUNCTURE = 0, SLASH = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 50, ACID = 70) circuit = /obj/item/circuitboard/machine/vendor payment_department = ACCOUNT_STATION_MASTER light_power = 0.5 @@ -141,9 +142,9 @@ ///Bills we accept? var/obj/item/stack/spacecash/bill ///Default price of items if not overridden - var/default_price = 25 - ///Default price of premium items if not overridden - var/extra_price = 50 + var/default_price = PAYCHECK_ASSISTANT * 0.4 + /// Default price ADDED to the default price of premium items if they don't have one set. + var/extra_price = PAYCHECK_ASSISTANT * 1.5 ///Whether our age check is currently functional var/age_restrictions = TRUE /** @@ -188,6 +189,7 @@ * * TRUE - all other cases */ /obj/machinery/vending/Initialize(mapload) + SET_TRACKING(__TYPE__) var/build_inv = FALSE if(!refill_canister) circuit = null @@ -220,6 +222,7 @@ Radio.set_listening(FALSE, TRUE) /obj/machinery/vending/Destroy() + UNSET_TRACKING(__TYPE__) QDEL_NULL(wires) QDEL_NULL(coin) QDEL_NULL(bill) @@ -553,7 +556,6 @@ GLOBAL_LIST_EMPTY(vending_products) if(in_range(fatty, src)) for(var/mob/living/L in get_turf(fatty)) - var/was_alive = (L.stat != DEAD) var/mob/living/carbon/C = L SEND_SIGNAL(L, COMSIG_ON_VENDOR_CRUSH) @@ -608,7 +610,7 @@ GLOBAL_LIST_EMPTY(vending_products) C.visible_message(span_danger("[O] explodes in a shower of gore beneath [src]!"), \ span_userdanger("Oh f-")) O.dismember() - O.drop_organs() + O.drop_contents() qdel(O) new /obj/effect/gibspawner/human/bodypartless(get_turf(C)) @@ -624,11 +626,9 @@ GLOBAL_LIST_EMPTY(vending_products) L.apply_damage(squish_damage, forced=TRUE) if(crit_case) L.apply_damage(squish_damage, forced=TRUE) - if(was_alive && L.stat == DEAD && L.client) - L.client.give_award(/datum/award/achievement/misc/vendor_squish, L) // good job losing a fight with an inanimate object idiot L.Paralyze(60) - L.emote("scream") + L.emote("agony") . = TRUE playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE) playsound(L, 'sound/effects/splat.ogg', 50, TRUE) @@ -754,10 +754,10 @@ GLOBAL_LIST_EMPTY(vending_products) if (!Adjacent(user, src)) return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/machinery/vending/ui_assets(mob/user) - return list( - get_asset_datum(/datum/asset/spritesheet/vending), - ) +// /obj/machinery/vending/ui_assets(mob/user) +// return list( +// get_asset_datum(/datum/asset/spritesheet/vending), +// ) /obj/machinery/vending/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -777,7 +777,9 @@ GLOBAL_LIST_EMPTY(vending_products) name = R.name, price = R.custom_price || default_price, max_amount = R.max_amount, - ref = REF(R) + ref = REF(R), + icon = initial(R.product_path.icon), + icon_state = initial(R.product_path.icon_state) ) .["product_records"] += list(data) .["coin_records"] = list() @@ -788,7 +790,9 @@ GLOBAL_LIST_EMPTY(vending_products) price = R.custom_premium_price || extra_price, max_amount = R.max_amount, ref = REF(R), - premium = TRUE + premium = TRUE, + icon = initial(R.product_path.icon), + icon_state = initial(R.product_path.icon_state) ) .["coin_records"] += list(data) .["hidden_records"] = list() @@ -799,7 +803,9 @@ GLOBAL_LIST_EMPTY(vending_products) price = R.custom_premium_price || extra_price, max_amount = R.max_amount, ref = REF(R), - premium = TRUE + premium = TRUE, + icon = initial(R.product_path.icon), + icon_state = initial(R.product_path.icon_state) ) .["hidden_records"] += list(data) @@ -913,7 +919,7 @@ GLOBAL_LIST_EMPTY(vending_products) return if (R.amount <= 0) say("Sold out of [R.name].") - flick(icon_deny,src) + z_flick(icon_deny,src) vend_ready = TRUE return if(onstation) @@ -923,17 +929,17 @@ GLOBAL_LIST_EMPTY(vending_products) C = L.get_idcard(TRUE) if(!C) say("No card found.") - flick(icon_deny,src) + z_flick(icon_deny,src) vend_ready = TRUE return else if (!C.registered_account) say("No account found.") - flick(icon_deny,src) + z_flick(icon_deny,src) vend_ready = TRUE return else if(!C.registered_account.account_job) say("Departmental accounts have been blacklisted from personal expenses due to embezzlement.") - flick(icon_deny, src) + z_flick(icon_deny, src) vend_ready = TRUE return else if(age_restrictions && R.age_restricted && (!C.registered_age || C.registered_age < AGE_MINOR)) @@ -942,7 +948,7 @@ GLOBAL_LIST_EMPTY(vending_products) Radio.set_frequency(FREQ_SECURITY) Radio.talk_into(src, "SECURITY ALERT: Underaged crewmember [usr] recorded attempting to purchase [R.name] in [get_area(src)]. Please watch for substance abuse.", FREQ_SECURITY) GLOB.narcd_underages += usr - flick(icon_deny,src) + z_flick(icon_deny,src) vend_ready = TRUE return @@ -958,7 +964,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(price_to_use && !account.adjust_money(-price_to_use)) say("You do not possess the funds to purchase [R.name].") - flick(icon_deny,src) + z_flick(icon_deny,src) vend_ready = TRUE return @@ -969,6 +975,7 @@ GLOBAL_LIST_EMPTY(vending_products) SSblackbox.record_feedback("amount", "vending_spent", price_to_use) SSeconomy.track_purchase(account, price_to_use, name) log_econ("[price_to_use] credits were inserted into [src] by [account.account_holder] to buy [R].") + if(last_shopper != REF(usr) || purchase_message_cooldown < world.time) say("Thank you for shopping with [src]!") purchase_message_cooldown = world.time + 5 SECONDS @@ -976,7 +983,7 @@ GLOBAL_LIST_EMPTY(vending_products) last_shopper = REF(usr) use_power(active_power_usage) if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) + z_flick(icon_vend,src) playsound(src, 'sound/machines/machine_vend.ogg', 50, TRUE, extrarange = -3) var/obj/item/vended_item if(!LAZYLEN(R.returned_products)) //always give out free returned stuff first, e.g. to avoid walling a traitor objective in a bag behind paid items @@ -1255,7 +1262,7 @@ GLOBAL_LIST_EMPTY(vending_products) vend_ready = FALSE if(!id_card || !id_card.registered_account || !id_card.registered_account.account_job) balloon_alert(usr, "no card found") - flick(icon_deny, src) + z_flick(icon_deny, src) return TRUE var/datum/bank_account/payee = id_card.registered_account for(var/obj/stock in contents) @@ -1264,16 +1271,19 @@ GLOBAL_LIST_EMPTY(vending_products) break if(!dispensed_item) return FALSE + /// Charges the user if its not the owner if(!compartmentLoadAccessCheck(user)) if(!payee.has_money(dispensed_item.custom_price)) balloon_alert(user, "insufficient funds") return TRUE + /// Make the transaction payee.adjust_money(-dispensed_item.custom_price) linked_account.adjust_money(dispensed_item.custom_price) linked_account.bank_card_talk("[payee.account_holder] made a [dispensed_item.custom_price] \ cr purchase at your custom vendor.") + /// Log the transaction SSblackbox.record_feedback("amount", "vending_spent", dispensed_item.custom_price) log_econ("[dispensed_item.custom_price] credits were spent on [src] buying a \ @@ -1316,7 +1326,7 @@ GLOBAL_LIST_EMPTY(vending_products) to_chat(user, span_warning("You must be holding the price tagger to continue!")) return var/chosen_price = tgui_input_number(user, "Set price", "Price", price) - if(!chosen_price || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK) || loc != user) + if(!chosen_price || QDELETED(user) || QDELETED(src) || !user.canUseTopic(src, USE_CLOSE|USE_IGNORE_TK) || loc != user) return price = chosen_price to_chat(user, span_notice(" The [src] will now give things a [price] cr tag.")) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 089b4a89564b..9ea5157e1045 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -31,8 +31,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 = PAYCHECK_ASSISTANT * 0.7 //Default of 35. - extra_price = PAYCHECK_EASY + default_price = PAYCHECK_ASSISTANT * 0.7 payment_department = ACCOUNT_STATION_MASTER light_mask = "parts-light-mask" diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index b709912fa218..2b87277a09b7 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -166,8 +166,7 @@ /obj/item/storage/belt/cummerbund = 1 ) refill_canister = /obj/item/vending_refill/autodrobe - default_price = PAYCHECK_ASSISTANT * 0.8 //Default of 40. - extra_price = PAYCHECK_HARD + default_price = PAYCHECK_ASSISTANT * 0.8 payment_department = ACCOUNT_STATION_MASTER light_mask = "theater-light-mask" diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 3236450ab2ab..445f7a0ff71c 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -58,7 +58,7 @@ req_access = list(ACCESS_BAR) refill_canister = /obj/item/vending_refill/boozeomat default_price = PAYCHECK_ASSISTANT * 0.9 - extra_price = PAYCHECK_COMMAND + extra_price = PAYCHECK_ASSISTANT * 15 //it's the good shit payment_department = ACCOUNT_STATION_MASTER light_mask = "boozeomat-light-mask" diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index eb32dd9b409f..170803c4dad8 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -30,8 +30,8 @@ ) refill_canister = /obj/item/vending_refill/cigarette - default_price = PAYCHECK_ASSISTANT - extra_price = PAYCHECK_HARD + default_price = PAYCHECK_ASSISTANT * 0.9 + extra_price = PAYCHECK_ASSISTANT * 2.75 payment_department = ACCOUNT_STATION_MASTER light_mask = "cigs-light-mask" @@ -48,28 +48,6 @@ /obj/item/storage/fancy/rollingpapers = 5 ) -/obj/machinery/vending/cigarette/beach //Used in the lavaland_biodome_beach.dmm ruin - name = "\improper ShadyCigs Ultra" - desc = "Now with extra premium products!" - product_ads = "Probably not bad for you!;Dope will get you through times of no money better than money will get you through times of no dope!;It's good for you!" - product_slogans = "Turn on, tune in, drop out!;Better living through chemistry!;Toke!;Don't forget to keep a smile on your lips and a song in your heart!" - products = list( - /obj/item/storage/fancy/cigarettes = 5, - /obj/item/storage/fancy/cigarettes/cigpack_uplift = 3, - /obj/item/storage/fancy/cigarettes/cigpack_robust = 3, - /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, - /obj/item/storage/fancy/cigarettes/cigpack_midori = 3, - /obj/item/storage/fancy/cigarettes/cigpack_cannabis = 5, - /obj/item/storage/box/matches = 10, - /obj/item/lighter/greyscale = 4, - /obj/item/storage/fancy/rollingpapers = 5 - ) - premium = list( - /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker = 5, - /obj/item/clothing/mask/vape = 5, - /obj/item/lighter = 3 - ) - /obj/item/vending_refill/cigarette machine_name = "ShadyCigs Deluxe" icon_state = "refill_smoke" diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 50da2fc5de5e..bd75acfcc239 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -208,8 +208,8 @@ /obj/item/instrument/piano_synth/headphones/spacepods = 1 ) refill_canister = /obj/item/vending_refill/clothing - default_price = PAYCHECK_ASSISTANT * 0.7 //Default of - extra_price = PAYCHECK_HARD + default_price = PAYCHECK_ASSISTANT * 0.7 + extra_price = PAYCHECK_ASSISTANT * 3 payment_department = ACCOUNT_STATION_MASTER light_mask = "wardrobe-light-mask" light_color = LIGHT_COLOR_ELECTRIC_GREEN diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index ea6007dc4b1c..512567ffbb18 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -14,7 +14,7 @@ /obj/item/reagent_containers/food/drinks/ice = 12 ) refill_canister = /obj/item/vending_refill/coffee - default_price = PAYCHECK_PRISONER + default_price = PAYCHECK_ASSISTANT extra_price = PAYCHECK_ASSISTANT payment_department = ACCOUNT_STATION_MASTER light_mask = "coffee-light-mask" diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index c4273c9db1db..0114476a5ba6 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -12,14 +12,12 @@ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10, /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10, /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10, - /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10, /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10, /obj/item/reagent_containers/food/drinks/waterbottle = 10, /obj/item/reagent_containers/food/drinks/bottle/mushi_kombucha = 3 ) contraband = list( - /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6, /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6 ) premium = list( @@ -31,7 +29,7 @@ ) refill_canister = /obj/item/vending_refill/cola default_price = PAYCHECK_ASSISTANT * 0.7 - extra_price = PAYCHECK_MEDIUM + extra_price = PAYCHECK_ASSISTANT payment_department = ACCOUNT_STATION_MASTER @@ -96,7 +94,6 @@ /obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb = 10, /obj/item/reagent_containers/food/drinks/soda_cans/starkist = 10, /obj/item/reagent_containers/food/drinks/soda_cans/space_up = 10, - /obj/item/reagent_containers/food/drinks/soda_cans/pwr_game = 10, /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10, /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 10) diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index c6ed0938a3f2..0aaa0ca03f4f 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -30,7 +30,7 @@ ) refill_canister = /obj/item/vending_refill/dinnerware default_price = PAYCHECK_ASSISTANT * 0.8 - extra_price = PAYCHECK_HARD + extra_price = PAYCHECK_ASSISTANT * 3 payment_department = ACCOUNT_STATION_MASTER light_mask = "dinnerware-light-mask" diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index acef92e0784f..0290dc37e1bf 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -9,7 +9,7 @@ /obj/item/clothing/glasses/meson/engine = 2, /obj/item/clothing/glasses/welding = 3, /obj/item/multitool = 4, - /obj/item/grenade/chem_grenade/smart_metal_foam = 10, + /obj/item/grenade/chem_grenade/metalfoam = 10, /obj/item/geiger_counter = 5, /obj/item/stock_parts/cell/high = 10, /obj/item/electronics/airlock = 10, @@ -24,11 +24,10 @@ premium = list( /obj/item/storage/belt/utility = 3, /obj/item/construction/rcd/loaded = 2, - /obj/item/storage/box/smart_metal_foam = 1 ) refill_canister = /obj/item/vending_refill/engivend default_price = PAYCHECK_EASY - extra_price = PAYCHECK_COMMAND * 1.5 + extra_price = PAYCHECK_COMMAND * 2 payment_department = ACCOUNT_ENG light_mask = "engivend-light-mask" diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index 269f801747c1..ed97774dbd8c 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -20,7 +20,7 @@ /obj/item/camera = 3, /obj/item/camera_film = 5, /obj/item/chisel = 3, - /obj/item/stack/pipe_cleaner_coil/random = 10, + /obj/item/stack/cable_coil/random = 10, /obj/item/cardpack/series_one = 10, /obj/item/cardpack/resin = 10, /obj/item/storage/card_binder = 10, @@ -48,7 +48,6 @@ /obj/item/canvas/twentyfour_twentyfour = 5, /obj/item/canvas/thirtysix_twentyfour = 3, /obj/item/canvas/fortyfive_twentyseven = 3, - /obj/item/rcl = 2, /obj/item/airlock_painter = 1, /obj/item/melee/skateboard/pro = 3, /obj/item/clothing/shoes/wheelys/rollerskates= 3, @@ -59,7 +58,7 @@ /obj/item/toy/groan_tube = 2, ) refill_canister = /obj/item/vending_refill/games - default_price = PAYCHECK_ASSISTANT + default_price = PAYCHECK_ASSISTANT * 0.3 extra_price = PAYCHECK_HARD * 1.25 payment_department = ACCOUNT_STATION_MASTER light_mask = "games-light-mask" diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index 3bc757189156..e5cfb0e97112 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -14,7 +14,7 @@ /obj/item/gun/ballistic/automatic/pistol/deagle/gold = 2, /obj/item/gun/ballistic/automatic/pistol/deagle/camo = 2, /obj/item/gun/ballistic/automatic/pistol/m1911 = 2, - /obj/item/gun/ballistic/automatic/proto/unrestricted = 2, + /obj/item/gun/ballistic/automatic/proto = 2, /obj/item/gun/ballistic/shotgun/automatic/combat = 2, /obj/item/gun/ballistic/automatic/gyropistol = 1, /obj/item/gun/ballistic/shotgun = 2, @@ -33,7 +33,7 @@ /obj/item/bedsheet/patriot = 5, /obj/item/food/burger/superbite = 3 ) //U S A - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF default_price = PAYCHECK_HARD * 2.5 extra_price = PAYCHECK_COMMAND * 2.5 diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index c4d60c7b06ec..471f8f89d172 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -8,9 +8,9 @@ vend_reply = "Come back for more!" circuit = /obj/item/circuitboard/machine/vending/syndicatedonksofttoyvendor products = list( - /obj/item/gun/ballistic/automatic/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/toy = 10, /obj/item/gun/ballistic/automatic/pistol/toy = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20, /obj/item/toy/foamblade = 10, @@ -20,14 +20,13 @@ ) contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! - /obj/item/gun/ballistic/automatic/c20r/toy/unrestricted/riot = 10, - /obj/item/gun/ballistic/automatic/l6_saw/toy/unrestricted/riot = 10, - /obj/item/ammo_box/foambox/riot = 20, + /obj/item/gun/ballistic/automatic/c20r/toy = 10, + /obj/item/gun/ballistic/automatic/l6_saw/toy = 10, /obj/item/toy/katana = 10, /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, FIRE = 100, ACID = 50) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft default_price = PAYCHECK_HARD diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index 84cfb950e51c..3447bc97fefd 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -17,7 +17,7 @@ /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, FIRE = 100, ACID = 50) + armor = list(BLUNT = 100, PUNCTURE = 100, SLASH = 0, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, FIRE = 100, ACID = 50) resistance_flags = FIRE_PROOF default_price = 0 //Just in case, since it's primary use is storage. extra_price = PAYCHECK_COMMAND diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 9dc4ab55273d..370dbb946bcb 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -7,7 +7,7 @@ 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/stack/gauze = 8, /obj/item/reagent_containers/syringe = 12, /obj/item/reagent_containers/dropper = 3, /obj/item/healthanalyzer = 4, @@ -15,11 +15,10 @@ /obj/item/stack/sticky_tape/surgical = 3, /obj/item/healthanalyzer/wound = 4, /obj/item/stack/medical/ointment = 2, - /obj/item/stack/medical/suture = 2, - /obj/item/stack/medical/bone_gel/four = 4 + /obj/item/stack/medical/bruise_pack = 2, + /obj/item/stack/medical/bone_gel/twelve = 4 ) contraband = list( - /obj/item/storage/box/gum/happiness = 3, /obj/item/storage/box/hug/medical = 1 ) premium = list( @@ -54,26 +53,23 @@ panel_type = "panel11" product_ads = "Go save some lives!;The best stuff for your medbay.;Only the finest tools.;Natural chemicals!;This stuff saves lives.;Don't you want some?;Ping!" req_access = list(ACCESS_MEDICAL) - products = list(/obj/item/reagent_containers/pill/patch/libital = 5, - /obj/item/reagent_containers/pill/patch/aiuri = 5, - /obj/item/reagent_containers/syringe/convermol = 2, + products = list(/obj/item/reagent_containers/pill/bicaridine = 7, + /obj/item/reagent_containers/pill/kelotane = 7, + /obj/item/reagent_containers/syringe/dexalin = 2, /obj/item/reagent_containers/pill/insulin = 5, - /obj/item/reagent_containers/glass/bottle/multiver = 2, - /obj/item/reagent_containers/glass/bottle/syriniver = 2, + /obj/item/reagent_containers/glass/bottle/dylovene = 2, /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/saline_glucose = 3, /obj/item/reagent_containers/glass/bottle/toxin = 3, /obj/item/reagent_containers/syringe/antiviral = 6, - /obj/item/reagent_containers/medigel/libital = 2, - /obj/item/reagent_containers/medigel/aiuri = 2, - /obj/item/reagent_containers/medigel/sterilizine = 1) + ) contraband = list(/obj/item/reagent_containers/pill/tox = 3, /obj/item/reagent_containers/pill/morphine = 4, - /obj/item/reagent_containers/pill/multiver = 6) + /obj/item/reagent_containers/pill/dylovene = 6) premium = list(/obj/item/reagent_containers/medigel/synthflesh = 2, - /obj/item/storage/pill_bottle/psicodine = 2) + /obj/item/storage/pill_bottle/haloperidol = 2) default_price = 50 extra_price = 100 payment_department = ACCOUNT_MED diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index 55139ed5f5b9..e66eb0541cf1 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -7,23 +7,20 @@ density = FALSE products = list( /obj/item/reagent_containers/syringe = 3, - /obj/item/reagent_containers/pill/patch/libital = 5, - /obj/item/reagent_containers/pill/patch/aiuri = 5, - /obj/item/reagent_containers/pill/multiver = 2, - /obj/item/reagent_containers/medigel/libital = 2, - /obj/item/reagent_containers/medigel/aiuri = 2, - /obj/item/reagent_containers/medigel/sterilizine = 1, + /obj/item/reagent_containers/pill/bicaridine = 7, + /obj/item/reagent_containers/pill/kelotane = 7, + /obj/item/reagent_containers/pill/dylovene = 2, /obj/item/healthanalyzer/wound = 2, - /obj/item/stack/medical/bone_gel/four = 2 + /obj/item/stack/medical/bone_gel/twelve = 2 ) contraband = list( /obj/item/reagent_containers/pill/tox = 2, /obj/item/reagent_containers/pill/morphine = 2, - /obj/item/storage/box/gum/happiness = 1 ) refill_canister = /obj/item/vending_refill/wallmed - default_price = PAYCHECK_HARD //Double the medical price due to being meant for public consumption, not player specfic - extra_price = PAYCHECK_HARD * 1.5 + // These are not meant to be used by medical staff, hence the large cost. + default_price = PAYCHECK_ASSISTANT * 4 + extra_price = PAYCHECK_ASSISTANT * 6 payment_department = ACCOUNT_MED tiltable = FALSE light_mask = "wallmed-light-mask" diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 4f7f16ae0db9..afa396bea059 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -66,9 +66,9 @@ /obj/item/reagent_containers/spray/waterflower = 1 ) refill_canister = /obj/item/vending_refill/hydroseeds - default_price = PAYCHECK_PRISONER + default_price = PAYCHECK_ASSISTANT * 0.2 extra_price = PAYCHECK_ASSISTANT - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_HYDROPONICS diff --git a/code/modules/vending/modularpc.dm b/code/modules/vending/modularpc.dm index c16e11ee7b69..45365c1dde18 100644 --- a/code/modules/vending/modularpc.dm +++ b/code/modules/vending/modularpc.dm @@ -27,7 +27,7 @@ refill_canister = /obj/item/vending_refill/modularpc default_price = PAYCHECK_MEDIUM extra_price = PAYCHECK_HARD - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_ROBOTICS diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm index 6f15f081e0d9..5b64c3261ed7 100644 --- a/code/modules/vending/nutrimax.dm +++ b/code/modules/vending/nutrimax.dm @@ -26,7 +26,7 @@ refill_canister = /obj/item/vending_refill/hydronutrients default_price = PAYCHECK_ASSISTANT * 0.8 extra_price = PAYCHECK_HARD * 0.8 - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_HYDROPONICS diff --git a/code/modules/vending/plasmaresearch.dm b/code/modules/vending/plasmaresearch.dm index 817bf22ab6ce..f861c63ba3dd 100644 --- a/code/modules/vending/plasmaresearch.dm +++ b/code/modules/vending/plasmaresearch.dm @@ -15,6 +15,6 @@ contraband = list(/obj/item/assembly/health = 3) default_price = PAYCHECK_ASSISTANT extra_price = PAYCHECK_ASSISTANT - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_ORDNANCE diff --git a/code/modules/vending/robotics.dm b/code/modules/vending/robotics.dm index 56fbc231064d..c8f242ba6861 100644 --- a/code/modules/vending/robotics.dm +++ b/code/modules/vending/robotics.dm @@ -26,7 +26,7 @@ ) refill_canister = /obj/item/vending_refill/robotics default_price = PAYCHECK_HARD - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_ROBOTICS diff --git a/code/modules/vending/sustenance.dm b/code/modules/vending/sustenance.dm index 3553c5cd5004..83e3785f87f3 100644 --- a/code/modules/vending/sustenance.dm +++ b/code/modules/vending/sustenance.dm @@ -22,8 +22,8 @@ ) refill_canister = /obj/item/vending_refill/sustenance - default_price = PAYCHECK_PRISONER - extra_price = PAYCHECK_PRISONER * 0.6 + default_price = PAYCHECK_ASSISTANT * 0.4 + extra_price = PAYCHECK_ASSISTANT payment_department = ACCOUNT_STATION_MASTER /obj/item/vending_refill/sustenance diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 587d948500cc..a9d4603e389c 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -9,9 +9,9 @@ light_mask = "donksoft-light-mask" circuit = /obj/item/circuitboard/machine/vending/donksofttoyvendor products = list( - /obj/item/gun/ballistic/automatic/toy/unrestricted = 10, + /obj/item/gun/ballistic/automatic/toy = 10, /obj/item/gun/ballistic/automatic/pistol/toy = 10, - /obj/item/gun/ballistic/shotgun/toy/unrestricted = 10, + /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, /obj/item/ammo_box/foambox = 20, /obj/item/toy/foamblade = 10, @@ -21,13 +21,11 @@ ) contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, - /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/dualsaber/toy = 5 ) refill_canister = /obj/item/vending_refill/donksoft - default_price = PAYCHECK_ASSISTANT + default_price = PAYCHECK_ASSISTANT * 2 extra_price = PAYCHECK_HARD payment_department = ACCOUNT_STATION_MASTER diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 9a610fa5a2f9..6c6e1a1b6049 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -2,7 +2,7 @@ icon_state = "refill_clothes" /obj/machinery/vending/wardrobe - default_price = PAYCHECK_ASSISTANT + default_price = PAYCHECK_ASSISTANT * 0.8 extra_price = PAYCHECK_HARD payment_department = NO_FREEBIES input_display_header = "Returned Clothing" @@ -19,19 +19,15 @@ /obj/item/storage/backpack/security = 3, /obj/item/storage/backpack/satchel/sec = 3, /obj/item/storage/backpack/duffelbag/sec = 3, - /obj/item/clothing/under/rank/security/officer = 3, /obj/item/clothing/shoes/jackboots = 3, - /obj/item/clothing/head/beret/sec = 3, + /obj/item/clothing/under/rank/security/officer = 3, + /obj/item/clothing/under/rank/security/officer/garrison = 3, + /obj/item/clothing/head/garrison_cap = 3, /obj/item/clothing/head/soft/sec = 3, /obj/item/clothing/mask/bandana/striped/security = 3, /obj/item/clothing/gloves/color/black = 3, - /obj/item/clothing/under/rank/security/officer/skirt = 3, - /obj/item/clothing/under/rank/security/officer/grey = 3, /obj/item/clothing/under/pants/khaki = 3, /obj/item/clothing/under/rank/security/officer/blueshirt = 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) refill_canister = /obj/item/vending_refill/wardrobe/sec_wardrobe payment_department = ACCOUNT_SEC light_color = COLOR_MOSTLY_PURE_RED @@ -63,7 +59,7 @@ /obj/item/clothing/under/rank/medical/scrubs/blue = 4, /obj/item/clothing/under/rank/medical/scrubs/green = 4, /obj/item/clothing/under/rank/medical/scrubs/purple = 4, - /obj/item/clothing/suit/toggle/labcoat = 4, + /obj/item/clothing/suit/toggle/labcoat/md = 4, /obj/item/clothing/suit/toggle/labcoat/paramedic = 4, /obj/item/clothing/shoes/sneakers/white = 4, /obj/item/clothing/head/beret/medical/paramedic = 4, @@ -186,7 +182,7 @@ /obj/item/organ/tongue/robot = 2) refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe extra_price = PAYCHECK_HARD * 1.2 - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_ROBOTICS /obj/item/vending_refill/wardrobe/robo_wardrobe @@ -211,10 +207,9 @@ /obj/item/clothing/suit/toggle/labcoat/science = 3, /obj/item/clothing/suit/overalls_sci = 3, /obj/item/clothing/shoes/sneakers/white = 3, - /obj/item/radio/headset/headset_sci = 3, /obj/item/clothing/mask/gas = 3) refill_canister = /obj/item/vending_refill/wardrobe/science_wardrobe - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_RESEARCH /obj/item/vending_refill/wardrobe/science_wardrobe @@ -238,7 +233,7 @@ /obj/item/clothing/mask/bandana/striped/botany = 3, /obj/item/clothing/accessory/armband/hydro = 3) refill_canister = /obj/item/vending_refill/wardrobe/hydro_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER light_color = LIGHT_COLOR_ELECTRIC_GREEN discount_access = ACCESS_HYDROPONICS @@ -269,7 +264,7 @@ /obj/item/clothing/glasses/regular/jamjar = 1, /obj/item/storage/bag/books = 1) refill_canister = /obj/item/vending_refill/wardrobe/curator_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_LIBRARY @@ -294,7 +289,7 @@ /obj/item/clothing/shoes/sneakers/black = 2, /obj/item/reagent_containers/glass/rag = 2, /obj/item/storage/box/beanbag = 1, - /obj/item/clothing/suit/armor/vest/alt = 1, + /obj/item/clothing/suit/armor/vest/ballistic = 1, /obj/item/circuitboard/machine/dish_drive = 1, /obj/item/clothing/glasses/sunglasses/reagent = 1, /obj/item/clothing/neck/petcollar = 1, @@ -303,7 +298,7 @@ /obj/item/storage/bag/money = 2) premium = list(/obj/item/storage/box/dishdrive = 1) refill_canister = /obj/item/vending_refill/wardrobe/bar_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER extra_price = PAYCHECK_HARD discount_access = ACCESS_BAR @@ -333,7 +328,7 @@ /obj/item/reagent_containers/glass/rag = 1, /obj/item/clothing/suit/hooded/wintercoat = 2) refill_canister = /obj/item/vending_refill/wardrobe/chef_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_KITCHEN @@ -344,7 +339,7 @@ name = "JaniDrobe" desc = "A self cleaning vending machine capable of dispensing clothing for janitors." icon_state = "janidrobe" - product_ads = "Come and get your janitorial clothing, now endorsed by unathi janitors everywhere!" + product_ads = "Come and get your janitorial clothing, now endorsed by Jinan 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, @@ -365,9 +360,9 @@ /obj/item/watertank/janitor = 1, /obj/item/storage/belt/janitor = 2) refill_canister = /obj/item/vending_refill/wardrobe/jani_wardrobe - default_price = PAYCHECK_EASY + default_price = PAYCHECK_ASSISTANT * 0.8 extra_price = PAYCHECK_HARD * 0.8 - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER light_color = COLOR_STRONG_MAGENTA discount_access = ACCESS_JANITOR @@ -403,7 +398,7 @@ /obj/item/clothing/shoes/laceup = 2, /obj/item/clothing/accessory/lawyers_badge = 2) refill_canister = /obj/item/vending_refill/wardrobe/law_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_LAWYER @@ -441,7 +436,7 @@ premium = list(/obj/item/clothing/suit/chaplainsuit/bishoprobe = 1, /obj/item/clothing/head/bishopmitre = 1) refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe - payment_department = ACCOUNT_SRV + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_CHAPEL_OFFICE @@ -454,17 +449,18 @@ icon_state = "chemdrobe" 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/head/beret/medical = 2, - /obj/item/clothing/shoes/sneakers/white = 2, - /obj/item/clothing/suit/toggle/labcoat/chemist = 2, - /obj/item/clothing/suit/hooded/wintercoat/medical/chemistry = 2, - /obj/item/storage/backpack/chemistry = 2, - /obj/item/storage/backpack/satchel/chem = 2, - /obj/item/storage/backpack/duffelbag/chemistry = 2, - /obj/item/storage/bag/chemistry = 2, - /obj/item/ph_booklet = 3) + products = list( + /obj/item/clothing/under/rank/medical/chemist = 2, + /obj/item/clothing/under/rank/medical/chemist/skirt = 2, + /obj/item/clothing/head/beret/medical = 2, + /obj/item/clothing/shoes/sneakers/white = 2, + /obj/item/clothing/suit/toggle/labcoat/chemist = 2, + /obj/item/clothing/suit/hooded/wintercoat/medical/chemistry = 2, + /obj/item/storage/backpack/chemistry = 2, + /obj/item/storage/backpack/satchel/chem = 2, + /obj/item/storage/backpack/duffelbag/chemistry = 2, + /obj/item/storage/bag/chemistry = 2, + ) contraband = list(/obj/item/reagent_containers/spray/syndicate = 2) refill_canister = /obj/item/vending_refill/wardrobe/chem_wardrobe payment_department = ACCOUNT_MED @@ -491,7 +487,7 @@ /obj/item/storage/backpack/duffelbag/genetics = 2 ) refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe - payment_department = ACCOUNT_SCI + payment_department = ACCOUNT_STATION_MASTER discount_access = ACCESS_GENETICS @@ -556,7 +552,7 @@ /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 = PAYCHECK_COMMAND * 1.75 + extra_price = PAYCHECK_ASSISTANT * 4 payment_department = ACCOUNT_SEC discount_access = ACCESS_FORENSICS diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index 560b3ae866e1..2ddd49f29ceb 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -19,7 +19,7 @@ /obj/item/flashlight/glowstick/red = 3, /obj/item/flashlight = 5, /obj/item/clothing/ears/earmuffs = 1, - /obj/item/paint/anycolor = 5 + /obj/item/paint_sprayer = 2, ) contraband = list( /obj/item/clothing/gloves/color/fyellow = 2 @@ -32,8 +32,8 @@ /obj/item/clothing/gloves/color/yellow = 1 ) refill_canister = /obj/item/vending_refill/youtool - default_price = PAYCHECK_ASSISTANT - extra_price = PAYCHECK_COMMAND * 1.5 + default_price = PAYCHECK_ASSISTANT * 1.5 + extra_price = PAYCHECK_COMMAND * 1.25 payment_department = ACCOUNT_ENG discount_access = ACCESS_ENGINE diff --git a/code/modules/wiremod/components/action/pathfind.dm b/code/modules/wiremod/components/action/pathfind.dm index ad602c32c6ba..1d47733469ca 100644 --- a/code/modules/wiremod/components/action/pathfind.dm +++ b/code/modules/wiremod/components/action/pathfind.dm @@ -98,7 +98,7 @@ TIMER_COOLDOWN_END(parent, COOLDOWN_CIRCUIT_PATHFIND_SAME) old_dest = destination - path = get_path_to(src, destination, max_range, id=path_id) + path = jps_path_to(src, destination, max_range, access = path_id:GetAccess()) if(length(path) == 0 || !path)// Check if we can even path there next_turf = null failed.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/action/pull.dm b/code/modules/wiremod/components/action/pull.dm deleted file mode 100644 index 8c83e938b00a..000000000000 --- a/code/modules/wiremod/components/action/pull.dm +++ /dev/null @@ -1,27 +0,0 @@ -/** - * # 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" - desc = "A component that can force the shell to pull entities. Only works for drone shells." - category = "Action" - - /// Frequency input - var/datum/port/input/target - circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL - -/obj/item/circuit_component/pull/populate_ports() - target = add_input_port("Target", PORT_TYPE_ATOM) - -/obj/item/circuit_component/pull/input_received(datum/port/input/port) - var/atom/target_atom = target.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 - - INVOKE_ASYNC(shell, TYPE_PROC_REF(/atom/movable, start_pulling), target_atom) diff --git a/code/modules/wiremod/components/atom/hear.dm b/code/modules/wiremod/components/atom/hear.dm index 09f23a2729ca..2c47a2be8e47 100644 --- a/code/modules/wiremod/components/atom/hear.dm +++ b/code/modules/wiremod/components/atom/hear.dm @@ -39,7 +39,7 @@ SIGNAL_HANDLER return Hear(arglist(arguments)) -/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc) +/obj/item/circuit_component/hear/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) if(speaker == parent?.shell) return diff --git a/code/modules/wiremod/components/bci/hud/bar_overlay.dm b/code/modules/wiremod/components/bci/hud/bar_overlay.dm index 778e8bf5dd08..b6ef9cea056f 100644 --- a/code/modules/wiremod/components/bci/hud/bar_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/bar_overlay.dm @@ -57,9 +57,10 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "bar_overlay_[REF(src)]", cool_overlay, + null, owner, ) - alt_appearance.add_hud_to(owner) + alt_appearance.show_to(owner) active_overlays[target_atom] = WEAKREF(alt_appearance) diff --git a/code/modules/wiremod/components/bci/hud/counter_overlay.dm b/code/modules/wiremod/components/bci/hud/counter_overlay.dm index 1b411a445875..19e1cdb168bd 100644 --- a/code/modules/wiremod/components/bci/hud/counter_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/counter_overlay.dm @@ -76,9 +76,10 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]", counter, + null, owner, ) - alt_appearance.add_hud_to(owner) + alt_appearance.show_to(owner) counter_appearance = WEAKREF(alt_appearance) @@ -101,9 +102,10 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "counter_overlay_[REF(src)]_[i]", number, + null, owner, ) - number_alt_appearance.add_hud_to(owner) + number_alt_appearance.show_to(owner) numbers += WEAKREF(number_alt_appearance) @@ -115,7 +117,7 @@ numbers = list() var/datum/atom_hud/overlay = counter_appearance?.resolve() - overlay.remove_hud_from(owner) + overlay.hide_from(owner) QDEL_NULL(overlay) /obj/item/circuit_component/counter_overlay/Destroy() diff --git a/code/modules/wiremod/components/bci/hud/object_overlay.dm b/code/modules/wiremod/components/bci/hud/object_overlay.dm index bd7d55d77dd7..20266bc30013 100644 --- a/code/modules/wiremod/components/bci/hud/object_overlay.dm +++ b/code/modules/wiremod/components/bci/hud/object_overlay.dm @@ -117,9 +117,10 @@ /datum/atom_hud/alternate_appearance/basic/one_person, "object_overlay_[REF(src)]", cool_overlay, + null, owner, ) - alt_appearance.add_hud_to(owner) + alt_appearance.show_to(owner) active_overlays[target_atom] = WEAKREF(alt_appearance) diff --git a/code/modules/wiremod/components/ntnet/ntnet_receive.dm b/code/modules/wiremod/components/ntnet/ntnet_receive.dm deleted file mode 100644 index 31e557dcd963..000000000000 --- a/code/modules/wiremod/components/ntnet/ntnet_receive.dm +++ /dev/null @@ -1,54 +0,0 @@ -/** - * # NTNet Receiver Component - * - * Receives data through NTNet. - */ -/obj/item/circuit_component/ntnet_receive - display_name = "NTNet Receiver" - desc = "Receives data packages through NTNet. If Encryption Key is set then only signals with the same Encryption Key will be received." - category = "NTNet" - - circuit_flags = CIRCUIT_FLAG_OUTPUT_SIGNAL //trigger_output - - network_id = __NETWORK_CIRCUITS - - /// The list type - var/datum/port/input/option/list_options - - /// Data being received - var/datum/port/output/data_package - - /// Encryption key - var/datum/port/input/enc_key - -/obj/item/circuit_component/ntnet_receive/populate_options() - list_options = add_option_port("List Type", GLOB.wiremod_basic_types) - -/obj/item/circuit_component/ntnet_receive/populate_ports() - data_package = add_output_port("Data Package", PORT_TYPE_LIST(PORT_TYPE_ANY)) - enc_key = add_input_port("Encryption Key", PORT_TYPE_STRING) - RegisterSignal(src, COMSIG_COMPONENT_NTNET_RECEIVE, PROC_REF(ntnet_receive)) - -/obj/item/circuit_component/ntnet_receive/pre_input_received(datum/port/input/port) - if(port == list_options) - var/new_datatype = list_options.value - data_package.set_datatype(PORT_TYPE_LIST(new_datatype)) - - -/obj/item/circuit_component/ntnet_receive/proc/ntnet_receive(datum/source, datum/netdata/data) - SIGNAL_HANDLER - - if(data.data["enc_key"] != enc_key.value) - return - - var/datum/weakref/ref = data.data["port"] - var/datum/port/input/port = ref?.resolve() - if(!port) - return - - var/datum/circuit_datatype/datatype_handler = data_package.datatype_handler - if(!datatype_handler?.can_receive_from_datatype(port.datatype)) - return - - data_package.set_output(data.data["data"]) - trigger_output.set_output(COMPONENT_SIGNAL) diff --git a/code/modules/wiremod/components/ntnet/ntnet_send.dm b/code/modules/wiremod/components/ntnet/ntnet_send.dm deleted file mode 100644 index f5f544c767fe..000000000000 --- a/code/modules/wiremod/components/ntnet/ntnet_send.dm +++ /dev/null @@ -1,38 +0,0 @@ -/** - * # NTNet Transmitter Component - * - * Sends a data package through NTNet - */ - -/obj/item/circuit_component/ntnet_send - display_name = "NTNet Transmitter" - desc = "Sends a data package through NTNet. If Encryption Key is set then transmitted data will be only picked up by receivers with the same Encryption Key." - category = "NTNet" - - circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL - - network_id = __NETWORK_CIRCUITS - - /// The list type - var/datum/port/input/option/list_options - - /// Data being sent - var/datum/port/input/data_package - - /// Encryption key - var/datum/port/input/enc_key - -/obj/item/circuit_component/ntnet_send/populate_options() - list_options = add_option_port("List Type", GLOB.wiremod_basic_types) - -/obj/item/circuit_component/ntnet_send/populate_ports() - data_package = add_input_port("Data Package", PORT_TYPE_LIST(PORT_TYPE_ANY)) - enc_key = add_input_port("Encryption Key", PORT_TYPE_STRING) - -/obj/item/circuit_component/ntnet_send/pre_input_received(datum/port/input/port) - if(port == list_options) - var/new_datatype = list_options.value - data_package.set_datatype(PORT_TYPE_LIST(new_datatype)) - -/obj/item/circuit_component/ntnet_send/input_received(datum/port/input/port) - ntnet_send(list("data" = data_package.value, "enc_key" = enc_key.value, "port" = WEAKREF(data_package))) diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm index c07acb2783c1..8a21c1eba16e 100644 --- a/code/modules/wiremod/core/component_printer.dm +++ b/code/modules/wiremod/core/component_printer.dm @@ -6,6 +6,8 @@ icon_state = "fab-idle" circuit = /obj/item/circuitboard/machine/component_printer + has_disk_slot = TRUE + /// The internal material bus var/datum/component/remote_materials/materials diff --git a/code/modules/wiremod/shell/bot.dm b/code/modules/wiremod/shell/bot.dm index 463dd52cc052..fc62a70d1de2 100644 --- a/code/modules/wiremod/shell/bot.dm +++ b/code/modules/wiremod/shell/bot.dm @@ -9,7 +9,7 @@ icon_state = "setup_medium_box" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/bot/Initialize(mapload) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 7968f350a7b1..6f659c94a010 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -25,7 +25,7 @@ // Organs are put in nullspace, but this breaks circuit interactions forceMove(reciever) -/obj/item/organ/cyberimp/bci/say(message, bubble_type, list/spans, sanitize, datum/language/language, ignore_spam, forced) +/obj/item/organ/cyberimp/bci/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null, range = 7) if (owner) // Otherwise say_dead will be called. // It's intentional that a circuit for a dead person does not speak from the shell. diff --git a/code/modules/wiremod/shell/compact_remote.dm b/code/modules/wiremod/shell/compact_remote.dm index 41e8e2661f17..48b9c0e54f32 100644 --- a/code/modules/wiremod/shell/compact_remote.dm +++ b/code/modules/wiremod/shell/compact_remote.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/compact_remote/Initialize(mapload) diff --git a/code/modules/wiremod/shell/controller.dm b/code/modules/wiremod/shell/controller.dm index 8a938489cad2..fd2f04c2e22c 100644 --- a/code/modules/wiremod/shell/controller.dm +++ b/code/modules/wiremod/shell/controller.dm @@ -12,7 +12,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/controller/Initialize(mapload) diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm index d29a5d65417d..50ba35a363b8 100644 --- a/code/modules/wiremod/shell/dispenser.dm +++ b/code/modules/wiremod/shell/dispenser.dm @@ -9,7 +9,7 @@ icon_state = "setup_drone_arms" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/max_weight = WEIGHT_CLASS_NORMAL diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index a3e37ee48c74..af180036947a 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/wiremod.dmi' icon_state = "setup_medium_med" living_flags = 0 - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /mob/living/circuit_drone/Initialize(mapload) diff --git a/code/modules/wiremod/shell/gun.dm b/code/modules/wiremod/shell/gun.dm index b6bf2079ed27..fa764d4a4968 100644 --- a/code/modules/wiremod/shell/gun.dm +++ b/code/modules/wiremod/shell/gun.dm @@ -11,7 +11,7 @@ ammo_type = list(/obj/item/ammo_casing/energy/wiremod_gun) cell_type = /obj/item/stock_parts/cell/emproof/wiremod_gun item_flags = NONE - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE automatic_charge_overlays = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL diff --git a/code/modules/wiremod/shell/moneybot.dm b/code/modules/wiremod/shell/moneybot.dm index 2ee9cf6fa023..079f811b6192 100644 --- a/code/modules/wiremod/shell/moneybot.dm +++ b/code/modules/wiremod/shell/moneybot.dm @@ -9,14 +9,14 @@ icon_state = "setup_large" density = FALSE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE var/stored_money = 0 var/locked = FALSE /obj/structure/money_bot/deconstruct(disassembled) - new /obj/item/holochip(drop_location(), stored_money) + SSeconomy.spawn_cash_for_amount(stored_money, drop_location()) return ..() /obj/structure/money_bot/proc/add_money(to_add) @@ -76,7 +76,7 @@ return attached_bot.add_money(-to_dispense) - new /obj/item/holochip(drop_location(), to_dispense) + SSeconomy.spawn_cash_for_amount(to_dispense, drop_location()) /obj/item/circuit_component/money_bot display_name = "Money Bot" diff --git a/code/modules/wiremod/shell/scanner.dm b/code/modules/wiremod/shell/scanner.dm index 6bf3013caded..196cc17c6641 100644 --- a/code/modules/wiremod/shell/scanner.dm +++ b/code/modules/wiremod/shell/scanner.dm @@ -11,7 +11,7 @@ worn_icon_state = "electronic" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' - light_system = MOVABLE_LIGHT_DIRECTIONAL + light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE /obj/item/wiremod_scanner/Initialize(mapload) diff --git a/code/modules/wiremod/shell/server.dm b/code/modules/wiremod/shell/server.dm index 57c4945e2c85..38a1ac8aebb7 100644 --- a/code/modules/wiremod/shell/server.dm +++ b/code/modules/wiremod/shell/server.dm @@ -10,7 +10,7 @@ icon_state = "setup_stationary" density = TRUE - light_system = MOVABLE_LIGHT + light_system = OVERLAY_LIGHT light_on = FALSE /obj/structure/server/Initialize(mapload) diff --git a/code/modules/zmimic/mimic_movable.dm b/code/modules/zmimic/mimic_movable.dm index 48bc84c6f71b..01d8b95f9a8d 100644 --- a/code/modules/zmimic/mimic_movable.dm +++ b/code/modules/zmimic/mimic_movable.dm @@ -6,8 +6,8 @@ /atom/movable/setDir(ndir) . = ..() - if (. && bound_overlay) - bound_overlay.setDir(ndir) + if (bound_overlay) + bound_overlay.setDir(dir) /atom/movable/update_above() if (!bound_overlay || !isturf(loc)) @@ -17,7 +17,7 @@ SSzcopy.queued_overlays += bound_overlay bound_overlay.queued += 1 else if (bound_overlay && !bound_overlay.destruction_timer) - bound_overlay.destruction_timer = QDEL_IN(bound_overlay, 10 SECONDS) + bound_overlay.destruction_timer = QDEL_IN_STOPPABLE(bound_overlay, 10 SECONDS) // Grabs a list of every openspace mimic that's directly or indirectly copying this object. Returns an empty list if none found. /atom/movable/proc/get_associated_mimics() @@ -40,7 +40,7 @@ /atom/movable/openspace/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) return -/atom/movable/openspace/fire_act(exposed_temperature, exposed_volume) +/atom/movable/openspace/fire_act(exposed_temperature, exposed_volume, turf/adjacent) return /atom/movable/openspace/acid_act() @@ -64,6 +64,9 @@ /atom/movable/openspace/has_gravity(turf/T) return FALSE +/atom/movable/openspace/CanZFall(turf/from, direction, anchor_bypass) + return FALSE + // -- MULTIPLIER / SHADOWER -- // Holder object used for dimming openspaces & copying lighting of below turf. @@ -95,8 +98,8 @@ blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/turf/Tloc = loc - if (Tloc.ao_overlays_mimic) - overlays += Tloc.ao_overlays_mimic + if (Tloc.ao_overlay_mimic) + overlays += Tloc.ao_overlay_mimic invisibility = 0 if (islist(color)) @@ -137,12 +140,14 @@ var/have_performed_fixup = FALSE /atom/movable/openspace/mimic/New() - flags_1 |= INITIALIZED_1 + initialized = TRUE SSzcopy.openspace_overlays += 1 /atom/movable/openspace/mimic/Destroy() SSzcopy.openspace_overlays -= 1 queued = 0 + if(HAS_TRAIT(src, TRAIT_HEARING_SENSITIVE)) + lose_hearing_sensitivity() if (associated_atom) associated_atom.bound_overlay = null @@ -153,6 +158,34 @@ return ..() +/// Copies the atom_huds of the given atom. +/atom/movable/openspace/mimic/proc/copy_huds(atom/movable/target) + if(length(hud_list)) + for(var/datum/atom_hud/hud as anything in in_atom_huds) + hud.remove_atom_from_hud(src) + + hud_list = target.hud_list.Copy() + + for(var/hud_key as anything in hud_list) + var/image/target_hud_image = target.hud_list[hud_key] + var/image/new_hud_image = image(target_hud_image.icon, src, target_hud_image.icon_state, target_hud_image.layer) + new_hud_image.plane = target_hud_image.plane + new_hud_image.appearance_flags = RESET_COLOR|RESET_TRANSFORM + hud_list[hud_key] = new_hud_image + + for(var/datum/atom_hud/hud as anything in target.in_atom_huds) + if(istype(hud, /datum/atom_hud/alternate_appearance)) + continue + hud.add_atom_to_hud(src) + + if(length(target.alternate_appearances)) + for(var/key in target.alternate_appearances) + var/datum/atom_hud/alternate_appearance/basic/alt_appearance = target.alternate_appearances[key] + alt_appearance.mimic(src) + + for(var/hud_category in target.active_hud_list) + set_hud_image_active(hud_category) + /atom/movable/openspace/mimic/attackby(obj/item/W, mob/user) to_chat(user, span_notice("\The [src] is too far away.")) return TRUE @@ -172,12 +205,47 @@ deltimer(destruction_timer) destruction_timer = null else if (!destruction_timer) - destruction_timer = QDEL_IN(src, 10 SECONDS) + destruction_timer = QDEL_IN_STOPPABLE(src, 10 SECONDS) + +/atom/movable/openspace/mimic/newtonian_move(direction, instant, start_delay) // No. + return TRUE + +/atom/movable/openspace/mimic/set_glide_size(target) + return + +/atom/movable/openspace/mimic/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, list/message_mods, atom/sound_loc, message_range) + if(speaker.z != src.z) + return + + //Mimics of mimics aren't supposed to become hearing sensitive. + associated_atom.Hear(arglist(args)) + +/atom/movable/openspace/mimic/show_message(msg, type, alt_msg, alt_type, avoid_highlighting = FALSE) + if(ismob(associated_atom)) + associated_atom:show_message(arglist(args)) + +/atom/movable/openspace/mimic/proc/get_root() + RETURN_TYPE(/atom/movable) + + . = associated_atom + while (istype(., /atom/movable/openspace/mimic)) + . = (.):associated_atom // Called when the turf we're on is deleted/changed. /atom/movable/openspace/mimic/proc/owning_turf_changed() if (!destruction_timer) - destruction_timer = QDEL_IN(src, 10 SECONDS) + destruction_timer = QDEL_IN_STOPPABLE(src, 10 SECONDS) + +/atom/movable/openspace/mimic/proc/z_shift() + if (istype(associated_atom, type) && associated_atom:override_depth) + depth = associated_atom:override_depth + else if (isturf(associated_atom.loc)) + depth = min(SSzcopy.zlev_maximums[associated_atom.z] - associated_atom.z, ZMIMIC_MAX_DEPTH) + override_depth = depth + + plane = ZMIMIC_MAX_PLANE - depth + + bound_overlay?.z_shift() // -- TURF PROXY -- diff --git a/code/modules/zmimic/mimic_turf.dm b/code/modules/zmimic/mimic_turf.dm index 126a9f8111dd..75c05ad218a3 100644 --- a/code/modules/zmimic/mimic_turf.dm +++ b/code/modules/zmimic/mimic_turf.dm @@ -83,9 +83,3 @@ if (below) below.above = null below = null - -/turf/Entered(atom/movable/thing, turf/oldLoc) - . = ..() - if (thing.bound_overlay || (thing.zmm_flags & ZMM_IGNORE) || thing.invisibility == INVISIBILITY_ABSTRACT || !TURF_IS_MIMICKING(above)) - return - above.update_mimic() diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm index 93602b11dc5e..9cd47565c438 100644 --- a/code/modules/zombie/items.dm +++ b/code/modules/zombie/items.dm @@ -4,7 +4,7 @@ humans, butchering all other living things to \ sustain the zombie, smashing open airlock doors and opening \ child-safe caps on bottles." - item_flags = ABSTRACT | DROPDEL + item_flags = ABSTRACT | DROPDEL | HAND_ITEM resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF icon = 'icons/effects/blood.dmi' icon_state = "bloodhand_left" @@ -72,6 +72,6 @@ user.adjustToxLoss(-hp_gained, 0) user.adjustFireLoss(-hp_gained, 0) user.adjustCloneLoss(-hp_gained, 0) + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained, updating_health = FALSE) // Zom Bee gibbers "BRAAAAISNSs!1!" user.updatehealth() - user.adjustOrganLoss(ORGAN_SLOT_BRAIN, -hp_gained) // Zom Bee gibbers "BRAAAAISNSs!1!" user.set_nutrition(min(user.nutrition + hp_gained, NUTRITION_LEVEL_FULL)) diff --git a/config/comms.txt b/config/comms.txt index 421a7c6dd981..8abb9c04d125 100644 --- a/config/comms.txt +++ b/config/comms.txt @@ -2,6 +2,12 @@ ## Must be set to something other than 'default_pwd' and at least 7 characters long to be valid. #COMMS_KEY default_pwd +## Github Fine-Grained API Key with AT LEAST `issue.write` scope for the target repository. +#ISSUE_KEY github_pat_EXAMPLE + +##Github API 'slug' for issue reporting, format owner/repo +ISSUE_SLUG daedalusdock/daedalusdock + ## World address and port for server receiving cross server messages ## Use '+' to denote spaces in ServerName ## Repeat this entry to add more servers diff --git a/config/config.txt b/config/config.txt index 226380da4a49..6bbe362477f5 100644 --- a/config/config.txt +++ b/config/config.txt @@ -24,6 +24,9 @@ SERVERSQLNAME daedalusdock ## 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 Daedalus Outpost +## Community slug for AffectedArc's Web Map +#WEBMAP_COMMUNITY DaedalusDock + ## Hub subtitle: A line of text inserted under the server name. Should be no greater than 40 characters. HUB_SUBTITLE Now with custom lighting! @@ -146,7 +149,7 @@ LOG_TRAITOR LOG_MANIFEST ## log job divide debugging information -#LOG_JOB_DEBUG +LOG_JOB_DEBUG ## log all world.Topic() calls # LOG_WORLD_TOPIC @@ -173,6 +176,9 @@ LOG_SHUTTLE ## log tool interactions [/atom/proc/tool_act] LOG_TOOLS +##log graffiti from engraving +LOG_GRAFFITI + ## Log all timers on timer auto reset # LOG_TIMERS_ON_BUCKET_RESET @@ -221,9 +227,6 @@ VOTE_PERIOD 600 ## disable abandon mob NORESPAWN -## set a hosted by name for unix platforms -HOSTEDBY Octus - ## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) GUEST_BAN @@ -296,9 +299,6 @@ GITHUBURL https://github.com/DaedalusDock/Gameserver # INVOKE_YOUTUBEDL youtube-dl ## 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 @@ -378,8 +378,8 @@ NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 ## Requires database and PANIC_BUNKER #PANIC_BUNKER_DISCORD_REQUIRE -## Custom message to show the client if they are not allowed access due to MFA -#PANIC_BUNKER_DISCORD_REGISTER_MESSAGE Sorry but this server requires players to link their Discord account before playing! Please enter the following command, including the token, into this Server's Discord Guild. +## Discord link for the panic bunker +#PANIC_BUNKER_DISCORD_LINK ## Uncomment to enable the interview system for players who are below the living hour requirement instead of explicitly blocking them from the server ## Note this requires the PANIC_BUNKER to be enabled to do anything. @@ -567,22 +567,6 @@ CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search ## of their connection attempt. #ADMIN_2FA_URL https://example.com/id/%ID% -#### DISCORD STUFFS #### -## MAKE SURE ALL SECTIONS OF THIS ARE FILLED OUT BEFORE ENABLING -## Discord IDs can be obtained by following this guide: https://support.discord.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID- - -## Uncomment to enable discord auto-roling when users link their BYOND and Discord accounts -#ENABLE_DISCORD_AUTOROLE - -## Add your discord bot token here. Make sure it has the ability to manage roles -#DISCORD_TOKEN someDiscordToken - -## Add the ID of your guild (server) here -#DISCORD_GUILDID 000000000000000000 - -## Add the ID of the role you want assigning here -#DISCORD_ROLEID 000000000000000000 - ## How long in seconds after which a hard delete is treated as causing lag. This can be a float and supports a precision as low as nanoseconds. #HARD_DELETES_OVERRUN_THRESHOLD 0.5 @@ -646,3 +630,7 @@ PR_ANNOUNCEMENTS_PER_ROUND 5 ## Uncomment to block granting profiling privileges to users with R_DEBUG, for performance purposes #FORBID_ADMIN_PROFILING + +#Included last to allow developers have stable test configs +#this file is gitignored. +$include _config_nogit.txt diff --git a/config/credits_music/README.txt b/config/credits_music/README.txt deleted file mode 100644 index db0be3c02a1b..000000000000 --- a/config/credits_music/README.txt +++ /dev/null @@ -1,9 +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 credits sounds as you like, if there is more than one a random screen is chosen (see name conventions for specifics). - ---- - -All credits music entries require an accompanying json in the /jsons folder. These contain information such as the name of the song and the author, as well as if the song is "rare" or map-specific. Example in /jsons. \ No newline at end of file diff --git a/config/credits_music/jsons/EXAMPLE.json b/config/credits_music/jsons/EXAMPLE.json deleted file mode 100644 index a688229e3f72..000000000000 --- a/config/credits_music/jsons/EXAMPLE.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name" : "EXAMPLE", - "author" : "EXAMPLE", - "file" : "credits_music/sounds/example.ogg", - "map" : false, - "rare" : false -} \ No newline at end of file diff --git a/config/game_options.txt b/config/game_options.txt index e4f82bf8eb7b..78bb0d1d4733 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -8,9 +8,6 @@ DAMAGE_MULTIPLIER 1 ## whether pod plants work or not REVIVAL_POD_PLANTS -## 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 @@ -33,9 +30,9 @@ COMMENDATION_PERCENT_POLL 0.05 ## 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.8 +RUN_DELAY 2.2 WALK_DELAY 4 -SPRINT_DELAY 1.2 +SPRINT_DELAY 1.4 ## 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. @@ -86,10 +83,6 @@ STATION_GOAL_BUDGET 1 ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. #NO_INTERCEPT_REPORT -## Percent weight reductions for three of the most recent modes - -REPEATED_MODE_ADJUST 45 30 10 - ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 @@ -160,9 +153,6 @@ ALLOW_AI_MULTICAM ## AWAY MISSIONS ### -## Uncomment to load the virtual reality hub map -#VIRTUAL_REALITY - ## Uncomment to load one of the missions from awaymissionconfig.txt or away_missions/ at roundstart. #ROUNDSTART_AWAY @@ -198,11 +188,6 @@ MINIMAL_ACCESS_THRESHOLD 20 ## 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 @@ -212,13 +197,6 @@ NEAR_DEATH_EXPERIENCE #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. @@ -313,50 +291,22 @@ SILICON_MAX_LAW_AMOUNT 12 ROUNDSTART_RACES human ## Races that are strictly worse than humans that could probably be turned on without balance concerns -ROUNDSTART_RACES felinid ROUNDSTART_RACES lizard #ROUNDSTART_RACES fly ROUNDSTART_RACES moth ROUNDSTART_RACES plasmaman #ROUNDSTART_RACES shadow ROUNDSTART_RACES teshari +ROUNDSTART_RACES ipc +ROUNDSTART_RACES saurian ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal #ROUNDSTART_RACES jelly #ROUNDSTART_RACES abductor #ROUNDSTART_RACES synth - -ROUNDSTART_RACES skrell ROUNDSTART_RACES vox -## Including all the various golem subtypes that are better than humans in some ways, but worse in others -#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 plasteel_golem -#ROUNDSTART_RACES titanium_golem -#ROUNDSTART_RACES plastitanium_golem -#ROUNDSTART_RACES alloy_golem -#ROUNDSTART_RACES wood_golem -#ROUNDSTART_RACES sand_golem -#ROUNDSTART_RACES glass_golem -#ROUNDSTART_RACES bluespace_golem -#ROUNDSTART_RACES bananium_golem -#ROUNDSTART_RACES runic_golem -#ROUNDSTART_RACES cloth_golem -#ROUNDSTART_RACES plastic_golem -#ROUNDSTART_RACES bronze_golem -#ROUNDSTART_RACES cardboard_golem -#ROUNDSTART_RACES leather_golem -#ROUNDSTART_RACES durathread_golem -#ROUNDSTART_RACES bone_golem -#ROUNDSTART_RACES snow_golem -#ROUNDSTART_RACES metallic_hydrogen_golem ## Races that are straight upgrades. If these are on expect powergamers to always pick them #ROUNDSTART_RACES skeleton @@ -373,7 +323,7 @@ ROUNDSTART_RACES vox #ROUNDSTART_NO_HARD_CHECK felinid ##Overflow job. Default is assistant -OVERFLOW_JOB Assistant +OVERFLOW_JOB Civilian ## Overflow slot cap. Set to -1 for unlimited. If limited, it will still open up if every other job is full. OVERFLOW_CAP -1 @@ -383,7 +333,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 ##Limit Spell Choices## ## Uncomment to disallow wizards from using certain spells that may be too chaotic/fun for your playerbase @@ -409,17 +359,6 @@ BOMBCAP 20 ## 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 - -## Ice Moon Budget -ICEMOON_BUDGET 90 - ## Space Ruin Budget Space_Budget 16 @@ -444,9 +383,6 @@ MICE_ROUNDSTART 10 ## 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 @@ -471,3 +407,15 @@ MAXFINE 2000 ## How many played hours of DRONE_REQUIRED_ROLE required to be a Maintenance Done #DRONE_ROLE_PLAYTIME 14 + +## Enabling this config will cause an unsecured nuke disk to increase the chance of a Lone Nuclear Operative spawning. +#LONE_OP_NAG + +## Enabling this shows all players the job estimates for the round during the lobby phase. +SHOW_JOB_ESTIMATION + +## Enabling this will require a captain to be selected to be able to start the round. +REQUIRE_CAPTAIN + +## Enabling this will require all departments to have atleast one staff member to start the round +REQUIRE_DEPARTMENTS_STAFFED diff --git a/config/iceruinblacklist.txt b/config/iceruinblacklist.txt deleted file mode 100644 index 612ab8f74e33..000000000000 --- a/config/iceruinblacklist.txt +++ /dev/null @@ -1,29 +0,0 @@ -#Listing maps here will blacklist them from generating in the ice moon. -#Maps must be the full path to them -#A list of maps valid to blacklist can be found in _maps\RandomRuins\IceRuins -#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START - -##RESPAWN -#_maps/RandomRuins/AnywhereRuins/golem_ship.dmm - -##MEGAFAUNA -#_maps/RandomRuins/IceRuins/icemoon_surface_mining_site.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_mining_site.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_wendigo_cave.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm - -##MISC -#_maps/RandomRuins/IceRuins/icemoon_surface_lust.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_asteroid.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_engioutpost.dmm -#_maps/RandomRuins/IceRuins/icemoon_surface_pizza.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_puzzle.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_library.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_wrath.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_bathhouse.dmm -#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_hotsprings.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_homestead.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_plasma_facility.dmm -#_maps/RandomRuins/IceRuins/icemoon_underground_frozen_comms.dmm diff --git a/config/jobs.txt b/config/jobs.txt deleted file mode 100644 index 3a4a77c5cc9d..000000000000 --- a/config/jobs.txt +++ /dev/null @@ -1,49 +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 -Medical Director=1,1 - -Assistant=-1,-1 -Prisoner=0,2 - -Quartermaster=1,1 -Cargo Technician=3,2 -Shaft Miner=3,3 - -Bartender=1,1 -Cook=2,1 -Botanist=3,2 -Janitor=2,1 - -Clown=1,1 -Mime=1,1 -Curator=1,1 -Lawyer=2,2 - -Chaplain=1,1 - -Station Engineer=5,5 -Atmospheric Technician=3,2 - -Medical Doctor=5,3 -Paramedic=2,2 -Chemist=2,2 -Geneticist=2,2 -Virologist=1,1 -Psychologist=1,1 - -Scientist=5,3 -Roboticist=2,2 - -Warden=1,1 -Detective=1,1 -Security Officer=5,5 - -AI=0,1 -Cyborg=0,1 diff --git a/config/jukebox_music/LICENSE.txt b/config/jukebox_music/LICENSE.txt deleted file mode 100644 index 8a9d5dd3739b..000000000000 --- a/config/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/jukebox_music/README.txt b/config/jukebox_music/README.txt deleted file mode 100644 index c985746edd5d..000000000000 --- a/config/jukebox_music/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -The enclosed /sounds folder holds the sound files used for 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 \ No newline at end of file diff --git a/config/lavaruinblacklist.txt b/config/lavaruinblacklist.txt deleted file mode 100644 index c75ac5573421..000000000000 --- a/config/lavaruinblacklist.txt +++ /dev/null @@ -1,41 +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/AnywhereRuins/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_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_pizzaparty.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_cultaltar.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_hermit.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_gaia.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm -#_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm -#_maps/RandomRuins/AnywhereRuins/fountain_hall.dmm diff --git a/config/maps.txt b/config/maps.txt index bf2428dec61f..236c95383dd6 100644 --- a/config/maps.txt +++ b/config/maps.txt @@ -13,44 +13,14 @@ Format: votable (is this map votable) endmap -map metastation +map theseus #default - minplayers 25 #voteweight 0.5 votable endmap -map deltastation - minplayers 50 - votable -endmap - -map kilostation - votable -endmap - -map icebox - minplayers 25 - votable -endmap - -map tramstation - minplayers 35 - votable -endmap - map runtimestation endmap -map atmostest -endmap - -map atmostest_multiz -endmap - map multiz_debug endmap - -map pubbystation - voteable -endmap diff --git a/config/media/LICENSE.txt b/config/media/LICENSE.txt new file mode 100644 index 000000000000..22833b9d4e62 --- /dev/null +++ b/config/media/LICENSE.txt @@ -0,0 +1,34 @@ +---LICENSE NOTICE--- + +The server operator(s) is responsible for the copyright status of all sounds placed within the /config/media/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/media/README.txt b/config/media/README.txt new file mode 100644 index 000000000000..a9c9c258df1d --- /dev/null +++ b/config/media/README.txt @@ -0,0 +1,16 @@ +The enclosed /sounds folder holds the sound files for various systems. A wide range of sound types are supported. + +Using unnecessarily huge sounds can cause client side lag and should be avoided. + + +All title music entries require an accompanying json in the /jsons folder. These contain information such as the name of the song and the author, as well as if the song is "rare" or map-specific. +The following media_tags are supported, Mutually exclusive tags are marked with <>, A sound may have multiple tags. ++++ + +LOBBY<>LOBBY_RARE: Common or Rare lobby tracks. The JSON key "map" can be used to restrict their usage to a specific map. + +ROUNDEND<>ROUNDEND_RARE: Common or Rare roundend stingers. The JSON key "map" can be used to restrict their usage to a specific map. + +JUKEBOX: Makes this track available in the jukebox. + + diff --git a/config/media/jsons/___EXAMPLE.json b/config/media/jsons/___EXAMPLE.json new file mode 100644 index 000000000000..6f19ce52934c --- /dev/null +++ b/config/media/jsons/___EXAMPLE.json @@ -0,0 +1,11 @@ +{ + "x-comment-info": "Keys starting with x- are never read, and can safely be used as comments", + "name" : "EXAMPLE", + "x-comment-name": "This file's default name, EXAMPLE, is checked for and ignored, and must be changed.", + "author" : "EXAMPLE", + "file" : "sounds/poacher.ogg", + "media_tags": ["LOBBY", "JUKEBOX"], + "x-comment-duration": "Duration of a given file for use in the jukebox in deciseconds.", + "duration": 260, + "map" : false +} diff --git a/config/credits_music/sounds/exclude b/config/media/sounds/exclude similarity index 100% rename from config/credits_music/sounds/exclude rename to config/media/sounds/exclude diff --git a/config/media/sounds/poacher.ogg b/config/media/sounds/poacher.ogg new file mode 100644 index 000000000000..9e548a96ff39 Binary files /dev/null and b/config/media/sounds/poacher.ogg differ diff --git a/config/motd.txt b/config/motd.txt index c61dfbe8756d..f6ab1634fce9 100644 --- a/config/motd.txt +++ b/config/motd.txt @@ -1,7 +1,9 @@ -

Welcome to Daedalus Dock!

- -This server is running a crafted with care lovechild of Baystation12 and TGStation. - -Enjoy your stay! +
























+
+ + Welcome, Employee.
+
+ We appreciate your assistance in this time of need. +
diff --git a/config/title_music/LICENSE.txt b/config/title_music/LICENSE.txt deleted file mode 100644 index 3f1576d19dfb..000000000000 --- a/config/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/title_music/README.txt b/config/title_music/README.txt deleted file mode 100644 index 88bcfe6f9f42..000000000000 --- a/config/title_music/README.txt +++ /dev/null @@ -1,9 +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). - ---- - -All title music entries require an accompanying json in the /jsons folder. These contain information such as the name of the song and the author, as well as if the song is "rare" or map-specific. \ No newline at end of file diff --git a/config/title_music/jsons/EXAMPLE.json b/config/title_music/jsons/EXAMPLE.json deleted file mode 100644 index f7e49d66449a..000000000000 --- a/config/title_music/jsons/EXAMPLE.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name" : "EXAMPLE", - "author" : "EXAMPLE", - "file" : "title_music/sounds/example.ogg", - "map" : false, - "rare" : false -} \ No newline at end of file diff --git a/config/title_music/sounds/exclude b/config/title_music/sounds/exclude deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/daedalus.dme b/daedalus.dme index 019e26bba275..42fc578f88fa 100644 --- a/daedalus.dme +++ b/daedalus.dme @@ -12,6 +12,10 @@ #define DEBUG // END_PREFERENCES +#if !defined(SPACEMAN_DMM) && defined(OPENDREAM) +#include "tools/ci/od_lints.dme" +#endif + // BEGIN_INCLUDE #include "_maps\_basemap.dm" #include "code\_byond_version_compact.dm" @@ -21,9 +25,11 @@ #include "code\__DEFINES\_click.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_helpers.dm" +#include "code\__DEFINES\_multiz.dm" #include "code\__DEFINES\_profile.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" +#include "code\__DEFINES\abstract.dm" #include "code\__DEFINES\access.dm" #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\acid.dm" @@ -32,6 +38,7 @@ #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\adventure.dm" #include "code\__DEFINES\ai.dm" +#include "code\__DEFINES\aiming.dm" #include "code\__DEFINES\alarm.dm" #include "code\__DEFINES\alerts.dm" #include "code\__DEFINES\antagonists.dm" @@ -39,7 +46,10 @@ #include "code\__DEFINES\apc_defines.dm" #include "code\__DEFINES\aquarium.dm" #include "code\__DEFINES\art.dm" +#include "code\__DEFINES\asteroid_magnet_defines.dm" +#include "code\__DEFINES\atmos_canpass.dm" #include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\augments.dm" #include "code\__DEFINES\basic_mobs.dm" #include "code\__DEFINES\bitfields.dm" #include "code\__DEFINES\blackmarket.dm" @@ -63,6 +73,7 @@ #include "code\__DEFINES\credits.dm" #include "code\__DEFINES\cult.dm" #include "code\__DEFINES\database.dm" +#include "code\__DEFINES\datacore.dm" #include "code\__DEFINES\decal_defines.dm" #include "code\__DEFINES\devices.dm" #include "code\__DEFINES\direction_junctions.dm" @@ -88,16 +99,24 @@ #include "code\__DEFINES\fonts.dm" #include "code\__DEFINES\food.dm" #include "code\__DEFINES\footsteps.dm" +#include "code\__DEFINES\forensics.dm" +#include "code\__DEFINES\gamemodes.dm" +#include "code\__DEFINES\generators.dm" #include "code\__DEFINES\ghost.dm" +#include "code\__DEFINES\grab_defines.dm" +#include "code\__DEFINES\gradient.dm" #include "code\__DEFINES\gravity.dm" #include "code\__DEFINES\greyscale.dm" +#include "code\__DEFINES\holomap.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\icon_smoothing.dm" #include "code\__DEFINES\id_cards.dm" #include "code\__DEFINES\important_recursive_contents.dm" #include "code\__DEFINES\industrial_lift.dm" #include "code\__DEFINES\injection.dm" +#include "code\__DEFINES\input.dm" #include "code\__DEFINES\instruments.dm" +#include "code\__DEFINES\interactable.dm" #include "code\__DEFINES\interaction_flags.dm" #include "code\__DEFINES\interaction_particle.dm" #include "code\__DEFINES\inventory.dm" @@ -114,36 +133,41 @@ #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\magic.dm" #include "code\__DEFINES\maps.dm" +#include "code\__DEFINES\mapswitch.dm" #include "code\__DEFINES\materials.dm" #include "code\__DEFINES\maths.dm" +#include "code\__DEFINES\matrices.dm" #include "code\__DEFINES\MC.dm" #include "code\__DEFINES\mecha.dm" #include "code\__DEFINES\mechcomp.dm" +#include "code\__DEFINES\media.dm" #include "code\__DEFINES\melee.dm" #include "code\__DEFINES\memory_defines.dm" #include "code\__DEFINES\mergers.dm" +#include "code\__DEFINES\midrounds.dm" #include "code\__DEFINES\mob_spawn.dm" #include "code\__DEFINES\mobs.dm" #include "code\__DEFINES\mod.dm" #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" +#include "code\__DEFINES\movement_info.dm" #include "code\__DEFINES\movespeed_modification.dm" -#include "code\__DEFINES\multiz.dm" #include "code\__DEFINES\mutant_colors.dm" -#include "code\__DEFINES\networks.dm" #include "code\__DEFINES\nitrile.dm" #include "code\__DEFINES\nupermatter.dm" #include "code\__DEFINES\obj_flags.dm" #include "code\__DEFINES\packetnet.dm" +#include "code\__DEFINES\pain.dm" #include "code\__DEFINES\paint.dm" #include "code\__DEFINES\paintings.dm" #include "code\__DEFINES\paper.dm" #include "code\__DEFINES\paperwork_defines.dm" +#include "code\__DEFINES\particles.dm" +#include "code\__DEFINES\path.dm" #include "code\__DEFINES\perf_test.dm" #include "code\__DEFINES\pinpointers.dm" #include "code\__DEFINES\pipe_construction.dm" -#include "code\__DEFINES\plumbing.dm" #include "code\__DEFINES\polls.dm" #include "code\__DEFINES\power.dm" #include "code\__DEFINES\preferences.dm" @@ -153,11 +177,13 @@ #include "code\__DEFINES\profile.dm" #include "code\__DEFINES\projectiles.dm" #include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\quirks.dm" #include "code\__DEFINES\radiation.dm" #include "code\__DEFINES\radio.dm" #include "code\__DEFINES\reactions.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\reagents_specific_heat.dm" +#include "code\__DEFINES\records.dm" #include "code\__DEFINES\regex.dm" #include "code\__DEFINES\religion.dm" #include "code\__DEFINES\research.dm" @@ -173,6 +199,7 @@ #include "code\__DEFINES\shuttles.dm" #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\skills.dm" +#include "code\__DEFINES\slapcraft_defines.dm" #include "code\__DEFINES\song.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\space.dm" @@ -181,6 +208,7 @@ #include "code\__DEFINES\spatial_gridmap.dm" #include "code\__DEFINES\species_clothing_paths.dm" #include "code\__DEFINES\speech_controller.dm" +#include "code\__DEFINES\spooky_defines.dm" #include "code\__DEFINES\stamina.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" @@ -189,11 +217,13 @@ #include "code\__DEFINES\storage.dm" #include "code\__DEFINES\strippable.dm" #include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\surgery.dm" #include "code\__DEFINES\tcg.dm" #include "code\__DEFINES\text.dm" #include "code\__DEFINES\tgs.config.dm" #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui.dm" +#include "code\__DEFINES\three_dsix.dm" #include "code\__DEFINES\time.dm" #include "code\__DEFINES\tools.dm" #include "code\__DEFINES\toys.dm" @@ -203,6 +233,7 @@ #include "code\__DEFINES\typeids.dm" #include "code\__DEFINES\uplink.dm" #include "code\__DEFINES\vehicles.dm" +#include "code\__DEFINES\verb_manager.dm" #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\waddling.dm" #include "code\__DEFINES\wall_dents.dm" @@ -213,7 +244,6 @@ #include "code\__DEFINES\xenobiology.dm" #include "code\__DEFINES\zmimic.dm" #include "code\__DEFINES\atmospherics\_ZAS.dm" -#include "code\__DEFINES\atmospherics\atmos_canpass.dm" #include "code\__DEFINES\atmospherics\atmos_core.dm" #include "code\__DEFINES\atmospherics\atmos_helpers.dm" #include "code\__DEFINES\atmospherics\atmos_machines.dm" @@ -237,7 +267,6 @@ #include "code\__DEFINES\dcs\signals\signals_clothing.dm" #include "code\__DEFINES\dcs\signals\signals_container.dm" #include "code\__DEFINES\dcs\signals\signals_customizable.dm" -#include "code\__DEFINES\dcs\signals\signals_cytology.dm" #include "code\__DEFINES\dcs\signals\signals_datum.dm" #include "code\__DEFINES\dcs\signals\signals_fish.dm" #include "code\__DEFINES\dcs\signals\signals_food.dm" @@ -254,13 +283,11 @@ #include "code\__DEFINES\dcs\signals\signals_medical.dm" #include "code\__DEFINES\dcs\signals\signals_mind.dm" #include "code\__DEFINES\dcs\signals\signals_mod.dm" -#include "code\__DEFINES\dcs\signals\signals_mood.dm" #include "code\__DEFINES\dcs\signals\signals_moveloop.dm" #include "code\__DEFINES\dcs\signals\signals_movetype.dm" #include "code\__DEFINES\dcs\signals\signals_music.dm" #include "code\__DEFINES\dcs\signals\signals_NTNet.dm" #include "code\__DEFINES\dcs\signals\signals_object.dm" -#include "code\__DEFINES\dcs\signals\signals_operating_computer.dm" #include "code\__DEFINES\dcs\signals\signals_painting.dm" #include "code\__DEFINES\dcs\signals\signals_radiation.dm" #include "code\__DEFINES\dcs\signals\signals_reagent.dm" @@ -272,7 +299,6 @@ #include "code\__DEFINES\dcs\signals\signals_spell.dm" #include "code\__DEFINES\dcs\signals\signals_storage.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" -#include "code\__DEFINES\dcs\signals\signals_swab.dm" #include "code\__DEFINES\dcs\signals\signals_traitor.dm" #include "code\__DEFINES\dcs\signals\signals_tram.dm" #include "code\__DEFINES\dcs\signals\signals_transform.dm" @@ -314,6 +340,7 @@ #include "code\__HELPERS\admin.dm" #include "code\__HELPERS\ai.dm" #include "code\__HELPERS\areas.dm" +#include "code\__HELPERS\atlas.dm" #include "code\__HELPERS\atmospherics.dm" #include "code\__HELPERS\atoms.dm" #include "code\__HELPERS\bitflag_lists.dm" @@ -331,11 +358,13 @@ #include "code\__HELPERS\files.dm" #include "code\__HELPERS\filters.dm" #include "code\__HELPERS\game.dm" +#include "code\__HELPERS\generators.dm" #include "code\__HELPERS\global_lists.dm" #include "code\__HELPERS\guid.dm" #include "code\__HELPERS\heap.dm" #include "code\__HELPERS\hearted.dm" #include "code\__HELPERS\honkerblast.dm" +#include "code\__HELPERS\html.dm" #include "code\__HELPERS\icon_smoothing.dm" #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\jatum.dm" @@ -348,7 +377,6 @@ #include "code\__HELPERS\mouse_control.dm" #include "code\__HELPERS\nameof.dm" #include "code\__HELPERS\names.dm" -#include "code\__HELPERS\path.dm" #include "code\__HELPERS\piping_colors_lists.dm" #include "code\__HELPERS\priority_announce.dm" #include "code\__HELPERS\pronouns.dm" @@ -362,6 +390,7 @@ #include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" #include "code\__HELPERS\screen_objs.dm" +#include "code\__HELPERS\see_through_maps.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\spatial_info.dm" #include "code\__HELPERS\spawns.dm" @@ -382,6 +411,8 @@ #include "code\__HELPERS\view.dm" #include "code\__HELPERS\weakref.dm" #include "code\__HELPERS\zas.dm" +#include "code\__HELPERS\paths\jps_path.dm" +#include "code\__HELPERS\paths\path.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -401,6 +432,7 @@ #include "code\_globalvars\traits.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\ambience.dm" +#include "code\_globalvars\lists\cables.dm" #include "code\_globalvars\lists\client.dm" #include "code\_globalvars\lists\color.dm" #include "code\_globalvars\lists\flavor_misc.dm" @@ -412,9 +444,9 @@ #include "code\_globalvars\lists\objects.dm" #include "code\_globalvars\lists\poll_ignore.dm" #include "code\_globalvars\lists\quirks.dm" +#include "code\_globalvars\lists\slapcrafting.dm" #include "code\_globalvars\lists\typecache.dm" #include "code\_globalvars\lists\wiremod.dm" -#include "code\_globalvars\lists\xenobiology.dm" #include "code\_js\byjax.dm" #include "code\_js\menus.dm" #include "code\_onclick\adjacent.dm" @@ -494,6 +526,7 @@ #include "code\controllers\subsystem\codex.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\credits.dm" +#include "code\controllers\subsystem\datacore.dm" #include "code\controllers\subsystem\dbcore.dm" #include "code\controllers\subsystem\dcs.dm" #include "code\controllers\subsystem\disease.dm" @@ -504,7 +537,9 @@ #include "code\controllers\subsystem\explosions.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" +#include "code\controllers\subsystem\fluids.dm" #include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\holomap.dm" #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\id_access.dm" #include "code\controllers\subsystem\idlenpcpool.dm" @@ -513,16 +548,17 @@ #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm" #include "code\controllers\subsystem\lag_switch.dm" -#include "code\controllers\subsystem\language.dm" #include "code\controllers\subsystem\library.dm" #include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\machines.dm" #include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\materials.dm" +#include "code\controllers\subsystem\media.dm" #include "code\controllers\subsystem\minor_mapping.dm" #include "code\controllers\subsystem\mobs.dm" #include "code\controllers\subsystem\moods.dm" #include "code\controllers\subsystem\mouse_entered.dm" +#include "code\controllers\subsystem\networks.dm" #include "code\controllers\subsystem\nightshift.dm" #include "code\controllers\subsystem\npcpool.dm" #include "code\controllers\subsystem\overlays.dm" @@ -559,6 +595,7 @@ #include "code\controllers\subsystem\title.dm" #include "code\controllers\subsystem\traitor.dm" #include "code\controllers\subsystem\universe.dm" +#include "code\controllers\subsystem\verb_manager.dm" #include "code\controllers\subsystem\vis_overlays.dm" #include "code\controllers\subsystem\vote.dm" #include "code\controllers\subsystem\wardrobe.dm" @@ -578,11 +615,11 @@ #include "code\controllers\subsystem\processing\aura_healing.dm" #include "code\controllers\subsystem\processing\clock_component.dm" #include "code\controllers\subsystem\processing\conveyors.dm" +#include "code\controllers\subsystem\processing\embeds.dm" #include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\fluids.dm" #include "code\controllers\subsystem\processing\greyscale.dm" #include "code\controllers\subsystem\processing\instruments.dm" -#include "code\controllers\subsystem\processing\networks.dm" +#include "code\controllers\subsystem\processing\kinesis.dm" #include "code\controllers\subsystem\processing\obj.dm" #include "code\controllers\subsystem\processing\obj_tab_items.dm" #include "code\controllers\subsystem\processing\processing.dm" @@ -598,20 +635,22 @@ #include "code\datums\alarm.dm" #include "code\datums\armor.dm" #include "code\datums\beam.dm" +#include "code\datums\blood_types.dm" #include "code\datums\browser.dm" +#include "code\datums\cable_click_manager.dm" #include "code\datums\callback.dm" +#include "code\datums\cartesian_plane.dm" #include "code\datums\chatmessage.dm" #include "code\datums\cinematic.dm" #include "code\datums\dash_weapon.dm" -#include "code\datums\datacore.dm" #include "code\datums\datum.dm" #include "code\datums\datumvars.dm" #include "code\datums\dna.dm" #include "code\datums\dog_fashion.dm" -#include "code\datums\ductnet.dm" #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\forced_movement.dm" +#include "code\datums\forensics.dm" #include "code\datums\hailer_phrase.dm" #include "code\datums\holocall.dm" #include "code\datums\hotkeys_help.dm" @@ -637,28 +676,26 @@ #include "code\datums\station_alert.dm" #include "code\datums\station_integrity.dm" #include "code\datums\tgs_event_handler.dm" +#include "code\datums\verb_callbacks.dm" #include "code\datums\verbs.dm" #include "code\datums\view.dm" #include "code\datums\voice_of_god_command.dm" +#include "code\datums\vote.dm" #include "code\datums\weakrefs.dm" #include "code\datums\world_topic.dm" #include "code\datums\achievements\_achievement_data.dm" #include "code\datums\achievements\_awards.dm" -#include "code\datums\achievements\boss_achievements.dm" -#include "code\datums\achievements\boss_scores.dm" #include "code\datums\achievements\job_achievements.dm" #include "code\datums\achievements\job_scores.dm" #include "code\datums\achievements\mafia_achievements.dm" #include "code\datums\achievements\misc_achievements.dm" #include "code\datums\achievements\misc_scores.dm" -#include "code\datums\achievements\skill_achievements.dm" #include "code\datums\actions\action.dm" #include "code\datums\actions\cooldown_action.dm" #include "code\datums\actions\innate_action.dm" #include "code\datums\actions\item_action.dm" #include "code\datums\actions\items\adjust.dm" #include "code\datums\actions\items\beam_rifle.dm" -#include "code\datums\actions\items\berserk.dm" #include "code\datums\actions\items\boot_dash.dm" #include "code\datums\actions\items\cult_dagger.dm" #include "code\datums\actions\items\hands_free.dm" @@ -667,18 +704,11 @@ #include "code\datums\actions\items\stealth_box.dm" #include "code\datums\actions\items\summon_stickmen.dm" #include "code\datums\actions\items\toggles.dm" -#include "code\datums\actions\items\vortex_recall.dm" #include "code\datums\actions\mobs\blood_warp.dm" #include "code\datums\actions\mobs\charge.dm" #include "code\datums\actions\mobs\dash.dm" -#include "code\datums\actions\mobs\fire_breath.dm" -#include "code\datums\actions\mobs\language_menu.dm" -#include "code\datums\actions\mobs\lava_swoop.dm" -#include "code\datums\actions\mobs\meteors.dm" #include "code\datums\actions\mobs\mobcooldown.dm" #include "code\datums\actions\mobs\projectileattack.dm" -#include "code\datums\actions\mobs\small_sprite.dm" -#include "code\datums\actions\mobs\transform_weapon.dm" #include "code\datums\ai\_ai_behavior.dm" #include "code\datums\ai\_ai_controller.dm" #include "code\datums\ai\_ai_planning_subtree.dm" @@ -791,14 +821,12 @@ #include "code\datums\components\faction_granter.dm" #include "code\datums\components\food_storage.dm" #include "code\datums\components\force_move.dm" -#include "code\datums\components\forensics.dm" #include "code\datums\components\fullauto.dm" #include "code\datums\components\gas_leaker.dm" #include "code\datums\components\geiger_sound.dm" #include "code\datums\components\genetic_damage.dm" #include "code\datums\components\gps.dm" #include "code\datums\components\grillable.dm" -#include "code\datums\components\gunpoint.dm" #include "code\datums\components\hazard_area.dm" #include "code\datums\components\heirloom.dm" #include "code\datums\components\holderloving.dm" @@ -811,16 +839,13 @@ #include "code\datums\components\knockoff.dm" #include "code\datums\components\label.dm" #include "code\datums\components\light_eater.dm" -#include "code\datums\components\lockon_aiming.dm" +#include "code\datums\components\lock_on_cursor.dm" #include "code\datums\components\manual_blinking.dm" #include "code\datums\components\manual_breathing.dm" #include "code\datums\components\material_container.dm" #include "code\datums\components\mind_linker.dm" -#include "code\datums\components\mirage_border.dm" #include "code\datums\components\mirv.dm" -#include "code\datums\components\mood.dm" #include "code\datums\components\multiple_lives.dm" -#include "code\datums\components\ntnet_interface.dm" #include "code\datums\components\omen.dm" #include "code\datums\components\orbiter.dm" #include "code\datums\components\overlay_lighting.dm" @@ -838,6 +863,8 @@ #include "code\datums\components\rotation.dm" #include "code\datums\components\scope.dm" #include "code\datums\components\seclite_attachable.dm" +#include "code\datums\components\seethrough.dm" +#include "code\datums\components\seethrough_mob.dm" #include "code\datums\components\shell.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\shrink.dm" @@ -862,8 +889,6 @@ #include "code\datums\components\strong_pull.dm" #include "code\datums\components\subtype_picker.dm" #include "code\datums\components\summoning.dm" -#include "code\datums\components\surgery_initiator.dm" -#include "code\datums\components\swabbing.dm" #include "code\datums\components\swarming.dm" #include "code\datums\components\tackle.dm" #include "code\datums\components\tactical.dm" @@ -877,7 +902,6 @@ #include "code\datums\components\toggle_suit.dm" #include "code\datums\components\transforming.dm" #include "code\datums\components\trapdoor.dm" -#include "code\datums\components\twohanded.dm" #include "code\datums\components\udder.dm" #include "code\datums\components\unbreakable.dm" #include "code\datums\components\uplink.dm" @@ -898,12 +922,6 @@ #include "code\datums\components\food\decomposition.dm" #include "code\datums\components\food\edible.dm" #include "code\datums\components\food\ice_cream_holder.dm" -#include "code\datums\components\plumbing\_plumbing.dm" -#include "code\datums\components\plumbing\chemical_acclimator.dm" -#include "code\datums\components\plumbing\filter.dm" -#include "code\datums\components\plumbing\IV_drip.dm" -#include "code\datums\components\plumbing\reaction_chamber.dm" -#include "code\datums\components\plumbing\splitter.dm" #include "code\datums\components\riding\riding.dm" #include "code\datums\components\riding\riding_mob.dm" #include "code\datums\components\riding\riding_vehicle.dm" @@ -920,7 +938,6 @@ #include "code\datums\diseases\fake_gbs.dm" #include "code\datums\diseases\flu.dm" #include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\gastrolisis.dm" #include "code\datums\diseases\gbs.dm" #include "code\datums\diseases\heart_failure.dm" #include "code\datums\diseases\magnitis.dm" @@ -998,10 +1015,12 @@ #include "code\datums\elements\eyestab.dm" #include "code\datums\elements\firestacker.dm" #include "code\datums\elements\footstep.dm" +#include "code\datums\elements\footstep_override.dm" #include "code\datums\elements\forced_gravity.dm" #include "code\datums\elements\frozen.dm" #include "code\datums\elements\haunted.dm" #include "code\datums\elements\honkspam.dm" +#include "code\datums\elements\human_biter.dm" #include "code\datums\elements\item_scaling.dm" #include "code\datums\elements\kneecapping.dm" #include "code\datums\elements\kneejerk.dm" @@ -1011,16 +1030,15 @@ #include "code\datums\elements\light_blocking.dm" #include "code\datums\elements\light_eaten.dm" #include "code\datums\elements\light_eater.dm" +#include "code\datums\elements\mirage_border.dm" #include "code\datums\elements\movement_turf_changer.dm" #include "code\datums\elements\movetype_handler.dm" -#include "code\datums\elements\nerfed_pulling.dm" #include "code\datums\elements\obj_regen.dm" #include "code\datums\elements\openspace_item_click_handler.dm" #include "code\datums\elements\pet_bonus.dm" #include "code\datums\elements\plant_backfire.dm" #include "code\datums\elements\point_of_interest.dm" #include "code\datums\elements\prevent_attacking_of_types.dm" -#include "code\datums\elements\projectile_shield.dm" #include "code\datums\elements\radiation_protected_clothing.dm" #include "code\datums\elements\radioactive.dm" #include "code\datums\elements\ranged_attacks.dm" @@ -1036,7 +1054,6 @@ #include "code\datums\elements\spooky.dm" #include "code\datums\elements\squish.dm" #include "code\datums\elements\strippable.dm" -#include "code\datums\elements\swabbable.dm" #include "code\datums\elements\tenacious.dm" #include "code\datums\elements\tool_flash.dm" #include "code\datums\elements\undertile.dm" @@ -1045,7 +1062,6 @@ #include "code\datums\elements\venomous.dm" #include "code\datums\elements\volatile_gas_storage.dm" #include "code\datums\elements\waddling.dm" -#include "code\datums\elements\wall_engraver.dm" #include "code\datums\elements\weather_listener.dm" #include "code\datums\elements\decals\_decal.dm" #include "code\datums\elements\decals\blood.dm" @@ -1097,8 +1113,6 @@ #include "code\datums\mapgen\CaveGenerator.dm" #include "code\datums\mapgen\JungleGenerator.dm" #include "code\datums\mapgen\biomes\_biome.dm" -#include "code\datums\mapgen\Cavegens\IcemoonCaves.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" @@ -1118,14 +1132,6 @@ #include "code\datums\memory\tattoo_kit.dm" #include "code\datums\mergers\_merger.dm" #include "code\datums\mocking\client.dm" -#include "code\datums\mood_events\_mood_event.dm" -#include "code\datums\mood_events\area_events.dm" -#include "code\datums\mood_events\beauty_events.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" -#include "code\datums\mood_events\generic_positive_events.dm" -#include "code\datums\mood_events\needs_events.dm" #include "code\datums\mutations\_combined.dm" #include "code\datums\mutations\_mutations.dm" #include "code\datums\mutations\adaptation.dm" @@ -1155,18 +1161,15 @@ #include "code\datums\proximity_monitor\fields\peaceborg_dampener.dm" #include "code\datums\proximity_monitor\fields\timestop.dm" #include "code\datums\quirks\_quirk.dm" -#include "code\datums\quirks\good.dm" -#include "code\datums\quirks\negative.dm" +#include "code\datums\quirks\bane.dm" +#include "code\datums\quirks\boon.dm" #include "code\datums\quirks\neutral.dm" -#include "code\datums\ruins\icemoon.dm" -#include "code\datums\ruins\lavaland.dm" #include "code\datums\ruins\space.dm" #include "code\datums\screentips\atom_context.dm" #include "code\datums\screentips\item_context.dm" #include "code\datums\skills\_skill.dm" #include "code\datums\skills\cleaning.dm" #include "code\datums\skills\gaming.dm" -#include "code\datums\skills\mining.dm" #include "code\datums\station_traits\_station_trait.dm" #include "code\datums\station_traits\admin_panel.dm" #include "code\datums\station_traits\negative_traits.dm" @@ -1184,6 +1187,7 @@ #include "code\datums\status_effects\song_effects.dm" #include "code\datums\status_effects\stacking_effect.dm" #include "code\datums\status_effects\wound_effects.dm" +#include "code\datums\status_effects\debuffs\concussion.dm" #include "code\datums\status_effects\debuffs\confusion.dm" #include "code\datums\status_effects\debuffs\debuffs.dm" #include "code\datums\status_effects\debuffs\disorient.dm" @@ -1194,15 +1198,23 @@ #include "code\datums\status_effects\debuffs\jitteriness.dm" #include "code\datums\status_effects\debuffs\speech_debuffs.dm" #include "code\datums\status_effects\debuffs\strandling.dm" +#include "code\datums\status_effects\skill_modifiers\negative.dm" +#include "code\datums\status_effects\skill_modifiers\rpg_modifiers.dm" #include "code\datums\storage\storage.dm" +#include "code\datums\storage\subtypes\backpack.dm" #include "code\datums\storage\subtypes\bag_of_holding.dm" +#include "code\datums\storage\subtypes\box.dm" #include "code\datums\storage\subtypes\cards.dm" +#include "code\datums\storage\subtypes\cigarette_box.dm" #include "code\datums\storage\subtypes\extract_inventory.dm" +#include "code\datums\storage\subtypes\holster.dm" #include "code\datums\storage\subtypes\implant.dm" +#include "code\datums\storage\subtypes\latched_box.dm" #include "code\datums\storage\subtypes\organ_box.dm" +#include "code\datums\storage\subtypes\pill_bottle.dm" #include "code\datums\storage\subtypes\pockets.dm" +#include "code\datums\storage\subtypes\toolbox.dm" #include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types\ash_storm.dm" #include "code\datums\weather\weather_types\floor_is_lava.dm" #include "code\datums\weather\weather_types\radiation_storm.dm" #include "code\datums\weather\weather_types\snow_storm.dm" @@ -1254,14 +1266,21 @@ #include "code\game\area\areas\atlas\ai_monitored.dm" #include "code\game\area\areas\atlas\station.dm" #include "code\game\area\areas\ruins\_ruins.dm" -#include "code\game\area\areas\ruins\icemoon.dm" -#include "code\game\area\areas\ruins\lavaland.dm" #include "code\game\area\areas\ruins\space.dm" #include "code\game\area\areas\ruins\templates.dm" +#include "code\game\gamemodes\bloodbrothers.dm" +#include "code\game\gamemodes\bloodcult.dm" +#include "code\game\gamemodes\changelings.dm" #include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\extended.dm" #include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\heretics.dm" +#include "code\game\gamemodes\malfai.dm" +#include "code\game\gamemodes\mixed.dm" +#include "code\game\gamemodes\nuclear_emergency.dm" +#include "code\game\gamemodes\revolution.dm" +#include "code\game\gamemodes\traitor.dm" +#include "code\game\gamemodes\wizard.dm" #include "code\game\gamemodes\dynamic\dynamic.dm" #include "code\game\gamemodes\dynamic\dynamic_hijacking.dm" #include "code\game\gamemodes\dynamic\dynamic_logging.dm" @@ -1271,16 +1290,21 @@ #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\midrounds\_midrounds.dm" +#include "code\game\gamemodes\objectives\_objective.dm" +#include "code\game\gamemodes\objectives\gimmick.dm" +#include "code\game\gamemodes\objectives\objective_items.dm" +#include "code\game\gamemodes\objectives\protect_object.dm" #include "code\game\machinery\_machinery.dm" #include "code\game\machinery\ai_slipper.dm" #include "code\game\machinery\airlock_control.dm" #include "code\game\machinery\announcement_system.dm" +#include "code\game\machinery\atm.dm" #include "code\game\machinery\autolathe.dm" #include "code\game\machinery\bank_machine.dm" #include "code\game\machinery\buttons.dm" #include "code\game\machinery\canister_frame.dm" #include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\civilian_bounties.dm" #include "code\game\machinery\constructable_frame.dm" #include "code\game\machinery\dance_machine.dm" #include "code\game\machinery\data_disk.dm" @@ -1307,7 +1331,6 @@ #include "code\game\machinery\limbgrower.dm" #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\mechlaunchpad.dm" -#include "code\game\machinery\medical_kiosk.dm" #include "code\game\machinery\medipen_refiller.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\PDApainter.dm" @@ -1357,7 +1380,6 @@ #include "code\game\machinery\computer\law.dm" #include "code\game\machinery\computer\mechlaunchpad.dm" #include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\Operating.dm" #include "code\game\machinery\computer\pod.dm" #include "code\game\machinery\computer\robot.dm" #include "code\game\machinery\computer\security.dm" @@ -1435,6 +1457,7 @@ #include "code\game\objects\effects\bump_teleporter.dm" #include "code\game\objects\effects\contraband.dm" #include "code\game\objects\effects\countdown.dm" +#include "code\game\objects\effects\cursor_catcher.dm" #include "code\game\objects\effects\effects.dm" #include "code\game\objects\effects\forcefields.dm" #include "code\game\objects\effects\glowshroom.dm" @@ -1468,11 +1491,14 @@ #include "code\game\objects\effects\effect_system\effect_shield.dm" #include "code\game\objects\effects\effect_system\effect_system.dm" #include "code\game\objects\effects\effect_system\effects_explosion.dm" -#include "code\game\objects\effects\effect_system\effects_foam.dm" #include "code\game\objects\effects\effect_system\effects_other.dm" -#include "code\game\objects\effects\effect_system\effects_smoke.dm" #include "code\game\objects\effects\effect_system\effects_sparks.dm" #include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\effect_system\fluid_spread\effects_foam.dm" +#include "code\game\objects\effects\effect_system\fluid_spread\effects_smoke.dm" +#include "code\game\objects\effects\effect_system\fluid_spread\fluid_spread.dm" +#include "code\game\objects\effects\particles\fire.dm" +#include "code\game\objects\effects\particles\water.dm" #include "code\game\objects\effects\spawners\costume.dm" #include "code\game\objects\effects\spawners\gibspawner.dm" #include "code\game\objects\effects\spawners\structure.dm" @@ -1495,6 +1521,7 @@ #include "code\game\objects\effects\spawners\random\trash.dm" #include "code\game\objects\effects\spawners\random\vending.dm" #include "code\game\objects\effects\temporary_visuals\cult.dm" +#include "code\game\objects\effects\temporary_visuals\explosion.dm" #include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" #include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" #include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" @@ -1519,12 +1546,10 @@ #include "code\game\objects\items\chromosome.dm" #include "code\game\objects\items\cigs_lighters.dm" #include "code\game\objects\items\clown_items.dm" -#include "code\game\objects\items\control_wand.dm" #include "code\game\objects\items\cosmetics.dm" #include "code\game\objects\items\courtroom.dm" #include "code\game\objects\items\crab17.dm" #include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\credit_holochip.dm" #include "code\game\objects\items\debug_items.dm" #include "code\game\objects\items\defib.dm" #include "code\game\objects\items\dehy_carp.dm" @@ -1559,18 +1584,18 @@ #include "code\game\objects\items\maintenance_loot.dm" #include "code\game\objects\items\manuals.dm" #include "code\game\objects\items\mop.dm" -#include "code\game\objects\items\nitrium_crystals.dm" +#include "code\game\objects\items\offhand.dm" #include "code\game\objects\items\paint.dm" #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\plunger.dm" #include "code\game\objects\items\plushes.dm" #include "code\game\objects\items\pneumaticCannon.dm" #include "code\game\objects\items\powerfist.dm" #include "code\game\objects\items\puzzle_pieces.dm" #include "code\game\objects\items\RCD.dm" -#include "code\game\objects\items\RCL.dm" #include "code\game\objects\items\religion.dm" #include "code\game\objects\items\RPD.dm" #include "code\game\objects\items\RSF.dm" @@ -1593,6 +1618,7 @@ #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\vending_items.dm" #include "code\game\objects\items\virgin_mary.dm" +#include "code\game\objects\items\voice_changer.dm" #include "code\game\objects\items\wall_mounted.dm" #include "code\game\objects\items\weaponry.dm" #include "code\game\objects\items\circuitboards\circuitboard.dm" @@ -1634,7 +1660,6 @@ #include "code\game\objects\items\devices\radio\radio.dm" #include "code\game\objects\items\devices\scanners\gas_analyzer.dm" #include "code\game\objects\items\devices\scanners\health_analyzer.dm" -#include "code\game\objects\items\devices\scanners\scanner_wand.dm" #include "code\game\objects\items\devices\scanners\sequence_scanner.dm" #include "code\game\objects\items\devices\scanners\slime_scanner.dm" #include "code\game\objects\items\devices\scanners\t_scanner.dm" @@ -1665,10 +1690,8 @@ #include "code\game\objects\items\granters\_granters.dm" #include "code\game\objects\items\granters\oragami.dm" #include "code\game\objects\items\granters\crafting\_crafting_granter.dm" -#include "code\game\objects\items\granters\crafting\bone_notes.dm" #include "code\game\objects\items\granters\crafting\cannon.dm" #include "code\game\objects\items\granters\crafting\desserts.dm" -#include "code\game\objects\items\granters\crafting\pipegun.dm" #include "code\game\objects\items\granters\magic\_spell_granter.dm" #include "code\game\objects\items\granters\magic\barnyard.dm" #include "code\game\objects\items\granters\magic\blind.dm" @@ -1735,7 +1758,9 @@ #include "code\game\objects\items\stacks\cash.dm" #include "code\game\objects\items\stacks\license_plates.dm" #include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\overfloor_catwalk.dm" #include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\splint.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" @@ -1762,7 +1787,7 @@ #include "code\game\objects\items\storage\briefcase.dm" #include "code\game\objects\items\storage\fancy.dm" #include "code\game\objects\items\storage\garment.dm" -#include "code\game\objects\items\storage\holsters.dm" +#include "code\game\objects\items\storage\holster_items.dm" #include "code\game\objects\items\storage\lockbox.dm" #include "code\game\objects\items\storage\medkit.dm" #include "code\game\objects\items\storage\secure.dm" @@ -1838,8 +1863,6 @@ #include "code\game\objects\structures\spawner.dm" #include "code\game\objects\structures\spirit_board.dm" #include "code\game\objects\structures\stairs.dm" -#include "code\game\objects\structures\table_frames.dm" -#include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\tank_holder.dm" #include "code\game\objects\structures\training_machine.dm" @@ -1858,7 +1881,6 @@ #include "code\game\objects\structures\cannons\cannonballs.dm" #include "code\game\objects\structures\construction_console\construction_actions.dm" #include "code\game\objects\structures\construction_console\construction_console.dm" -#include "code\game\objects\structures\construction_console\construction_console_aux.dm" #include "code\game\objects\structures\construction_console\construction_console_centcom.dm" #include "code\game\objects\structures\crates_lockers\closets.dm" #include "code\game\objects\structures\crates_lockers\crates.dm" @@ -1889,9 +1911,6 @@ #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" -#include "code\game\objects\structures\icemoon\cave_entrance.dm" -#include "code\game\objects\structures\lavaland\geyser.dm" -#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" #include "code\game\objects\structures\plaques\_plaques.dm" #include "code\game\objects\structures\plaques\static_plaques.dm" #include "code\game\objects\structures\signs\_signs.dm" @@ -1930,7 +1949,6 @@ #include "code\game\turfs\open\sand.dm" #include "code\game\turfs\open\snow.dm" #include "code\game\turfs\open\water.dm" -#include "code\game\turfs\open\floor\catwalk_plating.dm" #include "code\game\turfs\open\floor\fancy_floor.dm" #include "code\game\turfs\open\floor\glass.dm" #include "code\game\turfs\open\floor\hull.dm" @@ -1938,6 +1956,7 @@ #include "code\game\turfs\open\floor\light_floor.dm" #include "code\game\turfs\open\floor\mineral_floor.dm" #include "code\game\turfs\open\floor\misc_floor.dm" +#include "code\game\turfs\open\floor\overfloor_catwalk.dm" #include "code\game\turfs\open\floor\plating.dm" #include "code\game\turfs\open\floor\reinforced_floor.dm" #include "code\game\turfs\open\floor\plating\misc_plating.dm" @@ -1946,8 +1965,6 @@ #include "code\modules\actionspeed\_actionspeed_modifier.dm" #include "code\modules\actionspeed\modifiers\addiction.dm" #include "code\modules\actionspeed\modifiers\base.dm" -#include "code\modules\actionspeed\modifiers\drugs.dm" -#include "code\modules\actionspeed\modifiers\mood.dm" #include "code\modules\actionspeed\modifiers\status_effects.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" @@ -1982,6 +1999,7 @@ #include "code\modules\admin\team_panel.dm" #include "code\modules\admin\topic.dm" #include "code\modules\admin\whitelist.dm" +#include "code\modules\admin\admin_clothing\gamemaster.dm" #include "code\modules\admin\callproc\callproc.dm" #include "code\modules\admin\smites\bad_luck.dm" #include "code\modules\admin\smites\berforate.dm" @@ -2001,7 +2019,6 @@ #include "code\modules\admin\smites\lightning.dm" #include "code\modules\admin\smites\nugget.dm" #include "code\modules\admin\smites\phobia_ocky_icky.dm" -#include "code\modules\admin\smites\puzzle.dm" #include "code\modules\admin\smites\rod.dm" #include "code\modules\admin\smites\smite.dm" #include "code\modules\admin\smites\supply_pod.dm" @@ -2062,6 +2079,7 @@ #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\particle_editor.dm" #include "code\modules\admin\view_variables\reference_tracking.dm" #include "code\modules\admin\view_variables\tag_datum.dm" #include "code\modules\admin\view_variables\topic.dm" @@ -2080,7 +2098,6 @@ #include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" #include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" #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\equipment\glands\access.dm" @@ -2093,7 +2110,6 @@ #include "code\modules\antagonists\abductor\equipment\glands\plasma.dm" #include "code\modules\antagonists\abductor\equipment\glands\quantum.dm" #include "code\modules\antagonists\abductor\equipment\glands\slime.dm" -#include "code\modules\antagonists\abductor\equipment\glands\spider.dm" #include "code\modules\antagonists\abductor\equipment\glands\transform.dm" #include "code\modules\antagonists\abductor\equipment\glands\trauma.dm" #include "code\modules\antagonists\abductor\equipment\glands\ventcrawl.dm" @@ -2103,7 +2119,6 @@ #include "code\modules\antagonists\abductor\machinery\dispenser.dm" #include "code\modules\antagonists\abductor\machinery\experiment.dm" #include "code\modules\antagonists\abductor\machinery\pad.dm" -#include "code\modules\antagonists\ashwalker\ashwalker.dm" #include "code\modules\antagonists\blob\blob.dm" #include "code\modules\antagonists\blob\blob_mobs.dm" #include "code\modules\antagonists\blob\overmind.dm" @@ -2154,20 +2169,12 @@ #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\spiders.dm" #include "code\modules\antagonists\changeling\powers\strained_muscles.dm" #include "code\modules\antagonists\changeling\powers\tiny_prick.dm" #include "code\modules\antagonists\changeling\powers\transform.dm" #include "code\modules\antagonists\clown_ops\bananium_bomb.dm" #include "code\modules\antagonists\clown_ops\clown_weapons.dm" #include "code\modules\antagonists\clown_ops\outfits.dm" -#include "code\modules\antagonists\contractor\contract.dm" -#include "code\modules\antagonists\contractor\contractor_hub.dm" -#include "code\modules\antagonists\contractor\contractor_items.dm" -#include "code\modules\antagonists\contractor\contractor_support.dm" -#include "code\modules\antagonists\contractor\contractor_uplink.dm" -#include "code\modules\antagonists\contractor\datum_contractor.dm" -#include "code\modules\antagonists\contractor\outfit.dm" #include "code\modules\antagonists\creep\creep.dm" #include "code\modules\antagonists\cult\blood_magic.dm" #include "code\modules\antagonists\cult\cult.dm" @@ -2184,7 +2191,6 @@ #include "code\modules\antagonists\disease\disease_abilities.dm" #include "code\modules\antagonists\disease\disease_datum.dm" #include "code\modules\antagonists\disease\disease_disease.dm" -#include "code\modules\antagonists\disease\disease_event.dm" #include "code\modules\antagonists\disease\disease_mob.dm" #include "code\modules\antagonists\ert\ert.dm" #include "code\modules\antagonists\fugitive\fugitive.dm" @@ -2228,7 +2234,6 @@ #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_buff.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_knowledge.dm" #include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm" -#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm" #include "code\modules\antagonists\heretic\magic\aggressive_spread.dm" #include "code\modules\antagonists\heretic\magic\ash_ascension.dm" #include "code\modules\antagonists\heretic\magic\ash_jaunt.dm" @@ -2269,28 +2274,20 @@ #include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" #include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" #include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" -#include "code\modules\antagonists\pirate\pirate.dm" #include "code\modules\antagonists\revenant\revenant.dm" #include "code\modules\antagonists\revenant\revenant_abilities.dm" #include "code\modules\antagonists\revenant\revenant_antag.dm" #include "code\modules\antagonists\revenant\revenant_blight.dm" -#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" #include "code\modules\antagonists\revolution\enemy_of_the_revolution.dm" #include "code\modules\antagonists\revolution\enemy_of_the_state.dm" #include "code\modules\antagonists\revolution\revolution.dm" #include "code\modules\antagonists\santa\santa.dm" -#include "code\modules\antagonists\separatist\nation_creation.dm" -#include "code\modules\antagonists\separatist\objectives.dm" -#include "code\modules\antagonists\separatist\separatist.dm" #include "code\modules\antagonists\slaughter\imp_antag.dm" #include "code\modules\antagonists\slaughter\slaughter.dm" #include "code\modules\antagonists\slaughter\slaughter_antag.dm" -#include "code\modules\antagonists\slaughter\slaughterevent.dm" #include "code\modules\antagonists\space_dragon\space_dragon.dm" #include "code\modules\antagonists\space_ninja\space_ninja.dm" #include "code\modules\antagonists\survivalist\survivalist.dm" -#include "code\modules\antagonists\thief\thief.dm" -#include "code\modules\antagonists\thief\thief_objectives.dm" #include "code\modules\antagonists\traitor\balance_helper.dm" #include "code\modules\antagonists\traitor\datum_traitor.dm" #include "code\modules\antagonists\traitor\objective_category.dm" @@ -2303,19 +2300,11 @@ #include "code\modules\antagonists\traitor\equipment\module_picker.dm" #include "code\modules\antagonists\traitor\objectives\assassination.dm" #include "code\modules\antagonists\traitor\objectives\bug_room.dm" -#include "code\modules\antagonists\traitor\objectives\destroy_heirloom.dm" #include "code\modules\antagonists\traitor\objectives\destroy_item.dm" #include "code\modules\antagonists\traitor\objectives\hack_comm_console.dm" #include "code\modules\antagonists\traitor\objectives\kill_pet.dm" -#include "code\modules\antagonists\traitor\objectives\sleeper_protocol.dm" #include "code\modules\antagonists\traitor\objectives\smuggling.dm" #include "code\modules\antagonists\traitor\objectives\steal.dm" -#include "code\modules\antagonists\traitor\objectives\final_objective\battlecruiser.dm" -#include "code\modules\antagonists\traitor\objectives\final_objective\final_objective.dm" -#include "code\modules\antagonists\traitor\objectives\final_objective\romerol.dm" -#include "code\modules\antagonists\traitor\objectives\final_objective\space_dragon.dm" -#include "code\modules\antagonists\valentines\heartbreaker.dm" -#include "code\modules\antagonists\valentines\valentine.dm" #include "code\modules\antagonists\wishgranter\wishgranter.dm" #include "code\modules\antagonists\wizard\wizard.dm" #include "code\modules\antagonists\wizard\equipment\artefact.dm" @@ -2361,16 +2350,18 @@ #include "code\modules\asset_cache\assets\adventure.dm" #include "code\modules\asset_cache\assets\arcade.dm" #include "code\modules\asset_cache\assets\bibles.dm" -#include "code\modules\asset_cache\assets\body_zones.dm" #include "code\modules\asset_cache\assets\chat.dm" +#include "code\modules\asset_cache\assets\chat_icons.dm" #include "code\modules\asset_cache\assets\circuits.dm" #include "code\modules\asset_cache\assets\common.dm" #include "code\modules\asset_cache\assets\condiments.dm" #include "code\modules\asset_cache\assets\contracts.dm" +#include "code\modules\asset_cache\assets\cursors.dm" #include "code\modules\asset_cache\assets\fish.dm" #include "code\modules\asset_cache\assets\fontawesome.dm" #include "code\modules\asset_cache\assets\genetics.dm" #include "code\modules\asset_cache\assets\headers.dm" +#include "code\modules\asset_cache\assets\icon_ref_map.dm" #include "code\modules\asset_cache\assets\inventory.dm" #include "code\modules\asset_cache\assets\irv.dm" #include "code\modules\asset_cache\assets\jquery.dm" @@ -2382,6 +2373,7 @@ #include "code\modules\asset_cache\assets\notes.dm" #include "code\modules\asset_cache\assets\orbit.dm" #include "code\modules\asset_cache\assets\paper.dm" +#include "code\modules\asset_cache\assets\particle_editor.dm" #include "code\modules\asset_cache\assets\patches.dm" #include "code\modules\asset_cache\assets\pda.dm" #include "code\modules\asset_cache\assets\permissions.dm" @@ -2397,7 +2389,6 @@ #include "code\modules\asset_cache\assets\tgui.dm" #include "code\modules\asset_cache\assets\tutorial_advisors.dm" #include "code\modules\asset_cache\assets\uplink.dm" -#include "code\modules\asset_cache\assets\vending.dm" #include "code\modules\asset_cache\assets\vv.dm" #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" @@ -2530,7 +2521,6 @@ #include "code\modules\cards\deck\kotahi.dm" #include "code\modules\cards\deck\tarot.dm" #include "code\modules\cards\deck\wizoff.dm" -#include "code\modules\cargo\bounty.dm" #include "code\modules\cargo\centcom_podlauncher.dm" #include "code\modules\cargo\coupon.dm" #include "code\modules\cargo\department_order.dm" @@ -2539,32 +2529,20 @@ #include "code\modules\cargo\expressconsole.dm" #include "code\modules\cargo\gondolapod.dm" #include "code\modules\cargo\goodies.dm" +#include "code\modules\cargo\govt_supply.dm" #include "code\modules\cargo\order.dm" #include "code\modules\cargo\orderconsole.dm" #include "code\modules\cargo\packs.dm" +#include "code\modules\cargo\packs_govt.dm" #include "code\modules\cargo\supplypod.dm" #include "code\modules\cargo\supplypod_beacon.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\botany.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\mining.dm" -#include "code\modules\cargo\bounties\reagent.dm" -#include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" -#include "code\modules\cargo\bounties\special.dm" -#include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\antiques.dm" -#include "code\modules\cargo\exports\civilain_bounty.dm" #include "code\modules\cargo\exports\food_and_drink.dm" #include "code\modules\cargo\exports\gear.dm" #include "code\modules\cargo\exports\large_objects.dm" -#include "code\modules\cargo\exports\lavaland.dm" #include "code\modules\cargo\exports\manifest.dm" #include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\misc_items.dm" #include "code\modules\cargo\exports\organs.dm" #include "code\modules\cargo\exports\parts.dm" #include "code\modules\cargo\exports\seeds.dm" @@ -2592,12 +2570,14 @@ #include "code\modules\client\preferences_menu.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences\_preference.dm" +#include "code\modules\client\preferences\accessibility.dm" #include "code\modules\client\preferences\admin.dm" #include "code\modules\client\preferences\age.dm" #include "code\modules\client\preferences\ai_core_display.dm" #include "code\modules\client\preferences\antagonists.dm" #include "code\modules\client\preferences\assets.dm" #include "code\modules\client\preferences\auto_fit_viewport.dm" +#include "code\modules\client\preferences\auto_punctuation.dm" #include "code\modules\client\preferences\binary_radials.dm" #include "code\modules\client\preferences\bloom.dm" #include "code\modules\client\preferences\body_size.dm" @@ -2612,12 +2592,15 @@ #include "code\modules\client\preferences\ghost.dm" #include "code\modules\client\preferences\ghost_lighting.dm" #include "code\modules\client\preferences\glasses.dm" +#include "code\modules\client\preferences\glasses_color.dm" #include "code\modules\client\preferences\heterochromatic.dm" #include "code\modules\client\preferences\hotkeys.dm" #include "code\modules\client\preferences\item_outlines.dm" #include "code\modules\client\preferences\jobless_role.dm" +#include "code\modules\client\preferences\languages.dm" #include "code\modules\client\preferences\loadout_override.dm" #include "code\modules\client\preferences\mod_select.dm" +#include "code\modules\client\preferences\monochrome_ghost.dm" #include "code\modules\client\preferences\names.dm" #include "code\modules\client\preferences\occupation.dm" #include "code\modules\client\preferences\ooc.dm" @@ -2627,10 +2610,10 @@ #include "code\modules\client\preferences\playtime_reward_cloak.dm" #include "code\modules\client\preferences\preferred_map.dm" #include "code\modules\client\preferences\quirks.dm" +#include "code\modules\client\preferences\ready_job.dm" #include "code\modules\client\preferences\runechat.dm" #include "code\modules\client\preferences\scaling_method.dm" #include "code\modules\client\preferences\screentips.dm" -#include "code\modules\client\preferences\security_department.dm" #include "code\modules\client\preferences\see_credits.dm" #include "code\modules\client\preferences\skin_tone.dm" #include "code\modules\client\preferences\species.dm" @@ -2642,18 +2625,27 @@ #include "code\modules\client\preferences\uplink_location.dm" #include "code\modules\client\preferences\widescreen.dm" #include "code\modules\client\preferences\window_flashing.dm" +#include "code\modules\client\preferences\augments\_augment.dm" +#include "code\modules\client\preferences\augments\augment_bodypart.dm" +#include "code\modules\client\preferences\augments\augment_organ.dm" +#include "code\modules\client\preferences\augments\augments.dm" +#include "code\modules\client\preferences\augments\implants\implant.dm" #include "code\modules\client\preferences\html_prefs\helpers.dm" #include "code\modules\client\preferences\html_prefs\main_window.dm" #include "code\modules\client\preferences\html_prefs\preference_group.dm" #include "code\modules\client\preferences\html_prefs\categories\antagonists.dm" +#include "code\modules\client\preferences\html_prefs\categories\augments.dm" #include "code\modules\client\preferences\html_prefs\categories\general.dm" +#include "code\modules\client\preferences\html_prefs\categories\languages.dm" #include "code\modules\client\preferences\html_prefs\categories\loadout.dm" #include "code\modules\client\preferences\html_prefs\categories\occupation.dm" #include "code\modules\client\preferences\html_prefs\categories\quirks.dm" #include "code\modules\client\preferences\html_prefs\modules\appearance_mods.dm" #include "code\modules\client\preferences\html_prefs\modules\body.dm" +#include "code\modules\client\preferences\html_prefs\modules\ipc_shackles.dm" #include "code\modules\client\preferences\html_prefs\modules\meta.dm" #include "code\modules\client\preferences\html_prefs\modules\occupational.dm" +#include "code\modules\client\preferences\html_prefs\modules\quirks.dm" #include "code\modules\client\preferences\html_prefs\modules\species.dm" #include "code\modules\client\preferences\loadout\loadout.dm" #include "code\modules\client\preferences\loadout\loadout_helpers.dm" @@ -2672,16 +2664,14 @@ #include "code\modules\client\preferences\middleware\_middleware.dm" #include "code\modules\client\preferences\middleware\keybindings.dm" #include "code\modules\client\preferences\middleware\legacy_toggles.dm" -#include "code\modules\client\preferences\migrations\body_type_migration.dm" -#include "code\modules\client\preferences\migrations\tgui_prefs_migration.dm" #include "code\modules\client\preferences\species_features\basic.dm" #include "code\modules\client\preferences\species_features\ethereal.dm" #include "code\modules\client\preferences\species_features\felinid.dm" +#include "code\modules\client\preferences\species_features\ipc.dm" #include "code\modules\client\preferences\species_features\lizard.dm" #include "code\modules\client\preferences\species_features\moth.dm" #include "code\modules\client\preferences\species_features\mutants.dm" #include "code\modules\client\preferences\species_features\pod.dm" -#include "code\modules\client\preferences\species_features\skrell.dm" #include "code\modules\client\preferences\species_features\teshari.dm" #include "code\modules\client\preferences\species_features\vampire.dm" #include "code\modules\client\preferences\species_features\vox.dm" @@ -2690,6 +2680,7 @@ #include "code\modules\client\verbs\ping.dm" #include "code\modules\client\verbs\reset_held_keys.dm" #include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\testing.dm" #include "code\modules\client\verbs\who.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" @@ -2697,6 +2688,7 @@ #include "code\modules\clothing\glasses\_glasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\sec_hud.dm" #include "code\modules\clothing\gloves\_gloves.dm" #include "code\modules\clothing\gloves\bone.dm" #include "code\modules\clothing\gloves\botany.dm" @@ -2778,6 +2770,13 @@ #include "code\modules\clothing\spacesuits\softsuit.dm" #include "code\modules\clothing\spacesuits\specialops.dm" #include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\hardsuits\_hardsuit_helmets.dm" +#include "code\modules\clothing\spacesuits\hardsuits\_hardsuits.dm" +#include "code\modules\clothing\spacesuits\hardsuits\engineering.dm" +#include "code\modules\clothing\spacesuits\hardsuits\medical.dm" +#include "code\modules\clothing\spacesuits\hardsuits\misc.dm" +#include "code\modules\clothing\spacesuits\hardsuits\science.dm" +#include "code\modules\clothing\spacesuits\hardsuits\security.dm" #include "code\modules\clothing\suits\_suits.dm" #include "code\modules\clothing\suits\ablativecoat.dm" #include "code\modules\clothing\suits\armor.dm" @@ -2834,14 +2833,19 @@ #include "code\modules\codex\categories\categories.dm" #include "code\modules\codex\categories\gases.dm" #include "code\modules\codex\categories\guides.dm" +#include "code\modules\codex\categories\machines.dm" #include "code\modules\codex\categories\mechcomp.dm" #include "code\modules\codex\categories\power.dm" +#include "code\modules\codex\categories\reagents.dm" #include "code\modules\codex\categories\species.dm" +#include "code\modules\codex\categories\surgery.dm" #include "code\modules\codex\categories\tools.dm" #include "code\modules\codex\categories\uncategorized.dm" #include "code\modules\codex\entries\_codex_entry.dm" #include "code\modules\codex\entries\atmospherics.dm" #include "code\modules\codex\entries\codex.dm" +#include "code\modules\codex\entries\floors.dm" +#include "code\modules\codex\entries\items.dm" #include "code\modules\codex\entries\machinery.dm" #include "code\modules\codex\entries\mechcomp.dm" #include "code\modules\codex\entries\power.dm" @@ -2849,30 +2853,38 @@ #include "code\modules\credits_roll\credits_client_procs.dm" #include "code\modules\credits_roll\credits_core.dm" #include "code\modules\credits_roll\episode_name.dm" +#include "code\modules\datacore\crime.dm" +#include "code\modules\datacore\library.dm" +#include "code\modules\datacore\records.dm" +#include "code\modules\debris\debris_atom.dm" +#include "code\modules\debris\debris_mob.dm" +#include "code\modules\debris\debris_obj.dm" +#include "code\modules\debris\debris_particles.dm" +#include "code\modules\debris\debris_turf.dm" +#include "code\modules\debug_health\debug_health.dm" +#include "code\modules\debug_health\organ_debug.dm" #include "code\modules\detectivework\detective_work.dm" +#include "code\modules\detectivework\dna_analyzer.dm" #include "code\modules\detectivework\evidence.dm" -#include "code\modules\detectivework\scanner.dm" +#include "code\modules\detectivework\fibers.dm" +#include "code\modules\detectivework\microscope.dm" +#include "code\modules\detectivework\samples.dm" +#include "code\modules\detectivework\scene_cards.dm" +#include "code\modules\detectivework\storage.dm" +#include "code\modules\detectivework\strings.dm" +#include "code\modules\detectivework\swab.dm" #include "code\modules\discord\discord_embed.dm" #include "code\modules\discord\discord_helpers.dm" #include "code\modules\discord\discord_link_record.dm" #include "code\modules\discord\discord_sql_functions.dm" #include "code\modules\economy\_economy.dm" #include "code\modules\economy\account.dm" -#include "code\modules\economy\holopay.dm" #include "code\modules\emoji\emoji_parse.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\events\_event.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#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\animal_infestation.dm" #include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" #include "code\modules\events\brain_trauma.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\bureaucratic_error.dm" @@ -2881,13 +2893,10 @@ #include "code\modules\events\communications_blackout.dm" #include "code\modules\events\creep_awakening.dm" #include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\drifting_contractor.dm" #include "code\modules\events\dust.dm" #include "code\modules\events\electrical_storm.dm" #include "code\modules\events\fake_virus.dm" #include "code\modules\events\false_alarm.dm" -#include "code\modules\events\fugitive_spawning.dm" -#include "code\modules\events\ghost_role.dm" #include "code\modules\events\grid_check.dm" #include "code\modules\events\heart_attack.dm" #include "code\modules\events\immovable_rod.dm" @@ -2897,33 +2906,23 @@ #include "code\modules\events\mass_hallucination.dm" #include "code\modules\events\meateor_wave.dm" #include "code\modules\events\meteor_wave.dm" -#include "code\modules\events\mice_migration.dm" -#include "code\modules\events\nightmare.dm" -#include "code\modules\events\operative.dm" -#include "code\modules\events\pirates.dm" #include "code\modules\events\portal_storm.dm" #include "code\modules\events\prison_break.dm" #include "code\modules\events\processor_overload.dm" #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\rpgtitles.dm" -#include "code\modules\events\sentience.dm" #include "code\modules\events\shuttle_catastrophe.dm" #include "code\modules\events\shuttle_insurance.dm" #include "code\modules\events\shuttle_loan.dm" -#include "code\modules\events\space_dragon.dm" -#include "code\modules\events\space_ninja.dm" +#include "code\modules\events\solar_flare.dm" #include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" #include "code\modules\events\stray_cargo.dm" -#include "code\modules\events\wisdomcow.dm" #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" -#include "code\modules\events\holiday\vday.dm" #include "code\modules\events\holiday\xmas.dm" #include "code\modules\events\wizard\aid.dm" #include "code\modules\events\wizard\blobies.dm" #include "code\modules\events\wizard\curseditems.dm" -#include "code\modules\events\wizard\departmentrevolt.dm" #include "code\modules\events\wizard\embeddies.dm" #include "code\modules\events\wizard\fakeexplosion.dm" #include "code\modules\events\wizard\ghost.dm" @@ -2998,6 +2997,21 @@ #include "code\modules\food_and_drinks\restaurant\custom_order.dm" #include "code\modules\food_and_drinks\restaurant\generic_venues.dm" #include "code\modules\food_and_drinks\restaurant\customers\_customer.dm" +#include "code\modules\grab\grab_carbon.dm" +#include "code\modules\grab\grab_datum.dm" +#include "code\modules\grab\grab_helpers.dm" +#include "code\modules\grab\grab_living.dm" +#include "code\modules\grab\grab_movable.dm" +#include "code\modules\grab\grab_object.dm" +#include "code\modules\grab\grab_silicon.dm" +#include "code\modules\grab\human_grab.dm" +#include "code\modules\grab\grabs\grab_aggressive.dm" +#include "code\modules\grab\grabs\grab_neck.dm" +#include "code\modules\grab\grabs\grab_normal.dm" +#include "code\modules\grab\grabs\grab_passive.dm" +#include "code\modules\grab\grabs\grab_simple.dm" +#include "code\modules\grab\grabs\grab_strangle.dm" +#include "code\modules\grab\grabs\grab_struggle.dm" #include "code\modules\holiday\easter.dm" #include "code\modules\holiday\foreign_calendar.dm" #include "code\modules\holiday\holidays.dm" @@ -3009,6 +3023,8 @@ #include "code\modules\holodeck\items.dm" #include "code\modules\holodeck\mobs.dm" #include "code\modules\holodeck\turfs.dm" +#include "code\modules\holomap\holomap.dm" +#include "code\modules\holomap\holomap_holder.dm" #include "code\modules\hydroponics\biogenerator.dm" #include "code\modules\hydroponics\fermenting_barrel.dm" #include "code\modules\hydroponics\grafts.dm" @@ -3048,7 +3064,6 @@ #include "code\modules\hydroponics\grown\hedges.dm" #include "code\modules\hydroponics\grown\herbs.dm" #include "code\modules\hydroponics\grown\korta_nut.dm" -#include "code\modules\hydroponics\grown\kronkus.dm" #include "code\modules\hydroponics\grown\melon.dm" #include "code\modules\hydroponics\grown\mushrooms.dm" #include "code\modules\hydroponics\grown\onion.dm" @@ -3108,7 +3123,6 @@ #include "code\modules\jobs\job_types\atmospheric_technician.dm" #include "code\modules\jobs\job_types\bartender.dm" #include "code\modules\jobs\job_types\botanist.dm" -#include "code\modules\jobs\job_types\captain.dm" #include "code\modules\jobs\job_types\cargo_technician.dm" #include "code\modules\jobs\job_types\chaplain.dm" #include "code\modules\jobs\job_types\chemist.dm" @@ -3119,22 +3133,16 @@ #include "code\modules\jobs\job_types\curator.dm" #include "code\modules\jobs\job_types\cyborg.dm" #include "code\modules\jobs\job_types\detective.dm" -#include "code\modules\jobs\job_types\geneticist.dm" -#include "code\modules\jobs\job_types\head_of_personnel.dm" #include "code\modules\jobs\job_types\head_of_security.dm" #include "code\modules\jobs\job_types\janitor.dm" #include "code\modules\jobs\job_types\lawyer.dm" #include "code\modules\jobs\job_types\medical_doctor.dm" -#include "code\modules\jobs\job_types\mime.dm" #include "code\modules\jobs\job_types\paramedic.dm" #include "code\modules\jobs\job_types\personal_ai.dm" #include "code\modules\jobs\job_types\positronic_brain.dm" #include "code\modules\jobs\job_types\prisoner.dm" #include "code\modules\jobs\job_types\psychologist.dm" #include "code\modules\jobs\job_types\quartermaster.dm" -#include "code\modules\jobs\job_types\research_director.dm" -#include "code\modules\jobs\job_types\roboticist.dm" -#include "code\modules\jobs\job_types\scientist.dm" #include "code\modules\jobs\job_types\security_officer.dm" #include "code\modules\jobs\job_types\servant_golem.dm" #include "code\modules\jobs\job_types\shaft_miner.dm" @@ -3161,6 +3169,9 @@ #include "code\modules\jobs\job_types\ert\ert_generic.dm" #include "code\modules\jobs\job_types\event\fugitive.dm" #include "code\modules\jobs\job_types\event\santa.dm" +#include "code\modules\jobs\job_types\management\captain.dm" +#include "code\modules\jobs\job_types\management\head_of_personnel.dm" +#include "code\modules\jobs\job_types\management\security_consultant.dm" #include "code\modules\jobs\job_types\spawner\ancient_crew.dm" #include "code\modules\jobs\job_types\spawner\ash_walker.dm" #include "code\modules\jobs\job_types\spawner\battlecruiser.dm" @@ -3172,16 +3183,13 @@ #include "code\modules\jobs\job_types\spawner\ghost_role.dm" #include "code\modules\jobs\job_types\spawner\hermit.dm" #include "code\modules\jobs\job_types\spawner\hotel_staff.dm" -#include "code\modules\jobs\job_types\spawner\lavaland_syndicate.dm" #include "code\modules\jobs\job_types\spawner\lifebringer.dm" #include "code\modules\jobs\job_types\spawner\maintenance_drone.dm" #include "code\modules\jobs\job_types\spawner\skeleton.dm" #include "code\modules\jobs\job_types\spawner\space_bar_patron.dm" #include "code\modules\jobs\job_types\spawner\space_bartender.dm" #include "code\modules\jobs\job_types\spawner\space_doctor.dm" -#include "code\modules\jobs\job_types\spawner\space_pirate.dm" #include "code\modules\jobs\job_types\spawner\space_syndicate.dm" -#include "code\modules\jobs\job_types\spawner\spider.dm" #include "code\modules\jobs\job_types\spawner\syndicate_cybersun.dm" #include "code\modules\jobs\job_types\spawner\syndicate_cybersun_captain.dm" #include "code\modules\jobs\job_types\spawner\zombie.dm" @@ -3189,35 +3197,34 @@ #include "code\modules\keybindings\bindings_client.dm" #include "code\modules\keybindings\focus.dm" #include "code\modules\keybindings\setup.dm" -#include "code\modules\language\aphasia.dm" -#include "code\modules\language\beachbum.dm" -#include "code\modules\language\buzzwords.dm" -#include "code\modules\language\calcic.dm" -#include "code\modules\language\codespeak.dm" -#include "code\modules\language\common.dm" -#include "code\modules\language\draconic.dm" -#include "code\modules\language\drone.dm" #include "code\modules\language\language.dm" #include "code\modules\language\language_holder.dm" #include "code\modules\language\language_manuals.dm" #include "code\modules\language\language_menu.dm" -#include "code\modules\language\machine.dm" -#include "code\modules\language\moffic.dm" -#include "code\modules\language\monkey.dm" -#include "code\modules\language\mushroom.dm" -#include "code\modules\language\narsian.dm" -#include "code\modules\language\nekomimetic.dm" -#include "code\modules\language\piratespeak.dm" -#include "code\modules\language\schechi.dm" -#include "code\modules\language\shadowtongue.dm" -#include "code\modules\language\skrell.dm" -#include "code\modules\language\slime.dm" -#include "code\modules\language\sylvan.dm" -#include "code\modules\language\terrum.dm" -#include "code\modules\language\uncommon.dm" -#include "code\modules\language\voltaic.dm" -#include "code\modules\language\vox.dm" -#include "code\modules\language\xenocommon.dm" +#include "code\modules\language\language_visual.dm" +#include "code\modules\language\languages\aphasia.dm" +#include "code\modules\language\languages\beachbum.dm" +#include "code\modules\language\languages\buzzwords.dm" +#include "code\modules\language\languages\codespeak.dm" +#include "code\modules\language\languages\common.dm" +#include "code\modules\language\languages\draconic.dm" +#include "code\modules\language\languages\drone.dm" +#include "code\modules\language\languages\machine.dm" +#include "code\modules\language\languages\moffic.dm" +#include "code\modules\language\languages\monkey.dm" +#include "code\modules\language\languages\narsian.dm" +#include "code\modules\language\languages\piratespeak.dm" +#include "code\modules\language\languages\schechi.dm" +#include "code\modules\language\languages\shadowtongue.dm" +#include "code\modules\language\languages\sign.dm" +#include "code\modules\language\languages\slime.dm" +#include "code\modules\language\languages\spacer.dm" +#include "code\modules\language\languages\sylvan.dm" +#include "code\modules\language\languages\terrum.dm" +#include "code\modules\language\languages\uncommon.dm" +#include "code\modules\language\languages\voltaic.dm" +#include "code\modules\language\languages\vox.dm" +#include "code\modules\language\languages\xenocommon.dm" #include "code\modules\library\barcode_scanner.dm" #include "code\modules\library\book.dm" #include "code\modules\library\bookcase.dm" @@ -3240,7 +3247,6 @@ #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\lighting\static_lighting_area.dm" #include "code\modules\lore\kinginyellow.dm" #include "code\modules\mafia\_defines.dm" #include "code\modules\mafia\controller.dm" @@ -3248,19 +3254,6 @@ #include "code\modules\mafia\outfits.dm" #include "code\modules\mafia\roles.dm" #include "code\modules\mapfluff\centcom\nuke_ops.dm" -#include "code\modules\mapfluff\ruins\lavaland_ruin_code.dm" -#include "code\modules\mapfluff\ruins\icemoonruin_code\hotsprings.dm" -#include "code\modules\mapfluff\ruins\icemoonruin_code\library.dm" -#include "code\modules\mapfluff\ruins\icemoonruin_code\mailroom.dm" -#include "code\modules\mapfluff\ruins\icemoonruin_code\wrath.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\biodome_clown_planet.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\biodome_winter.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\elephantgraveyard.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\puzzle.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\sloth.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\surface.dm" -#include "code\modules\mapfluff\ruins\lavalandruin_code\syndicate_base.dm" -#include "code\modules\mapfluff\ruins\objects_and_mobs\ash_walker_den.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\necropolis_gate.dm" #include "code\modules\mapfluff\ruins\objects_and_mobs\sin_ruins.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\asteroid4.dm" @@ -3271,12 +3264,8 @@ #include "code\modules\mapfluff\ruins\spaceruin_code\crashedship.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\deepstorage.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\DJstation.dm" -#include "code\modules\mapfluff\ruins\spaceruin_code\forgottenship.dm" -#include "code\modules\mapfluff\ruins\spaceruin_code\hellfactory.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\hilbertshotel.dm" -#include "code\modules\mapfluff\ruins\spaceruin_code\listeningstation.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\oldstation.dm" -#include "code\modules\mapfluff\ruins\spaceruin_code\originalcontent.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\spacehotel.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\TheDerelict.dm" #include "code\modules\mapfluff\ruins\spaceruin_code\whiteshipruin_box.dm" @@ -3325,7 +3314,6 @@ #include "code\modules\mechcomp\mcobjects\messaging\wifi_split.dm" #include "code\modules\meteors\meteors.dm" #include "code\modules\mining\abandoned_crates.dm" -#include "code\modules\mining\aux_base.dm" #include "code\modules\mining\fulton.dm" #include "code\modules\mining\machine_processing.dm" #include "code\modules\mining\machine_redemption.dm" @@ -3334,14 +3322,16 @@ #include "code\modules\mining\machine_unloading.dm" #include "code\modules\mining\machine_vending.dm" #include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\minebot.dm" #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_coins.dm" #include "code\modules\mining\satchel_ore_boxdm.dm" #include "code\modules\mining\shelters.dm" -#include "code\modules\mining\equipment\explorer_gear.dm" +#include "code\modules\mining\asteroid\asteroid_generation.dm" +#include "code\modules\mining\asteroid\asteroid_magnet.dm" +#include "code\modules\mining\asteroid\asteroid_templates.dm" +#include "code\modules\mining\asteroid\ore_datums.dm" +#include "code\modules\mining\asteroid\templates\simple_asteroid.dm" #include "code\modules\mining\equipment\kheiral_cuffs.dm" -#include "code\modules\mining\equipment\kinetic_crusher.dm" #include "code\modules\mining\equipment\lazarus_injector.dm" #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\mineral_scanner.dm" @@ -3352,10 +3342,6 @@ #include "code\modules\mining\equipment\wormhole_jaunter.dm" #include "code\modules\mining\laborcamp\laborshuttle.dm" #include "code\modules\mining\laborcamp\laborstacker.dm" -#include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\megafauna_loot.dm" -#include "code\modules\mining\lavaland\necropolis_chests.dm" -#include "code\modules\mining\lavaland\tendril_loot.dm" #include "code\modules\mob\emote.dm" #include "code\modules\mob\inventory.dm" #include "code\modules\mob\login.dm" @@ -3372,11 +3358,13 @@ #include "code\modules\mob\status_procs.dm" #include "code\modules\mob\transform_procs.dm" #include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\camera\z_eye.dm" #include "code\modules\mob\dead\crew_manifest.dm" #include "code\modules\mob\dead\dead.dm" #include "code\modules\mob\dead\new_player\login.dm" #include "code\modules\mob\dead\new_player\logout.dm" #include "code\modules\mob\dead\new_player\new_player.dm" +#include "code\modules\mob\dead\new_player\new_player_panel.dm" #include "code\modules\mob\dead\new_player\poll.dm" #include "code\modules\mob\dead\new_player\preferences_setup.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" @@ -3387,7 +3375,6 @@ #include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\hair.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\hair_gradients.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\headtails.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\markings.dm" @@ -3398,6 +3385,9 @@ #include "code\modules\mob\dead\new_player\sprite_accessories\teshari.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" #include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ipc\ipc_antenna.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ipc\ipc_screens.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ipc\saurian.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\notificationprefs.dm" @@ -3430,7 +3420,6 @@ #include "code\modules\mob\living\basic\basic_defense.dm" #include "code\modules\mob\living\basic\health_adjustment.dm" #include "code\modules\mob\living\basic\farm_animals\cows.dm" -#include "code\modules\mob\living\basic\ruin_defender\stickman.dm" #include "code\modules\mob\living\basic\vermin\cockroach.dm" #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\brain_item.dm" @@ -3439,9 +3428,11 @@ #include "code\modules\mob\living\brain\emote.dm" #include "code\modules\mob\living\brain\life.dm" #include "code\modules\mob\living\brain\MMI.dm" -#include "code\modules\mob\living\brain\posibrain.dm" #include "code\modules\mob\living\brain\skillchip.dm" #include "code\modules\mob\living\brain\status_procs.dm" +#include "code\modules\mob\living\brain\posibrain\posibrain.dm" +#include "code\modules\mob\living\brain\posibrain\shackle_sets.dm" +#include "code\modules\mob\living\brain\posibrain\shackles.dm" #include "code\modules\mob\living\carbon\carbon.dm" #include "code\modules\mob\living\carbon\carbon_context.dm" #include "code\modules\mob\living\carbon\carbon_defense.dm" @@ -3455,8 +3446,10 @@ #include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\examine.dm" #include "code\modules\mob\living\carbon\init_signals.dm" +#include "code\modules\mob\living\carbon\internals.dm" #include "code\modules\mob\living\carbon\inventory.dm" #include "code\modules\mob\living\carbon\life.dm" +#include "code\modules\mob\living\carbon\pain.dm" #include "code\modules\mob\living\carbon\skillchip.dm" #include "code\modules\mob\living\carbon\status_procs.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" @@ -3506,6 +3499,8 @@ #include "code\modules\mob\living\carbon\human\human_say.dm" #include "code\modules\mob\living\carbon\human\human_stripping.dm" #include "code\modules\mob\living\carbon\human\human_update_icons.dm" +#include "code\modules\mob\living\carbon\human\init_signals.dm" +#include "code\modules\mob\living\carbon\human\injury_check.dm" #include "code\modules\mob\living\carbon\human\inventory.dm" #include "code\modules\mob\living\carbon\human\life.dm" #include "code\modules\mob\living\carbon\human\login.dm" @@ -3516,23 +3511,18 @@ #include "code\modules\mob\living\carbon\human\monkey\monkey.dm" #include "code\modules\mob\living\carbon\human\species_types\abductors.dm" #include "code\modules\mob\living\carbon\human\species_types\android.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" #include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\golems.dm" #include "code\modules\mob\living\carbon\human\species_types\humans.dm" +#include "code\modules\mob\living\carbon\human\species_types\ipc.dm" #include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" #include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\monkeys.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\plasmamen.dm" #include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" #include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" -#include "code\modules\mob\living\carbon\human\species_types\skrell.dm" -#include "code\modules\mob\living\carbon\human\species_types\snail.dm" #include "code\modules\mob\living\carbon\human\species_types\teshari.dm" #include "code\modules\mob\living\carbon\human\species_types\vampire.dm" #include "code\modules\mob\living\carbon\human\species_types\vox.dm" @@ -3620,6 +3610,7 @@ #include "code\modules\mob\living\simple_animal\friendly\rabbit.dm" #include "code\modules\mob\living\simple_animal\friendly\robot_customer.dm" #include "code\modules\mob\living\simple_animal\friendly\sloth.dm" +#include "code\modules\mob\living\simple_animal\friendly\slug.dm" #include "code\modules\mob\living\simple_animal\friendly\snake.dm" #include "code\modules\mob\living\simple_animal\friendly\trader.dm" #include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" @@ -3652,7 +3643,6 @@ #include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm" #include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" #include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" @@ -3680,7 +3670,6 @@ #include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" #include "code\modules\mob\living\simple_animal\hostile\zombie.dm" #include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" #include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" #include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" #include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" @@ -3689,38 +3678,21 @@ #include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\clockwork_knight.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\demonic_frost_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\brimdemon.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_demon.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\ice_whelp.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\lobstrosity.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\polarbear.dm" #include "code\modules\mob\living\simple_animal\hostile\mining_mobs\wolf.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\elite.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\goliath_broodmother.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\herald.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\legionnaire.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\elites\pandora.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\hog.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" #include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" #include "code\modules\mob\living\simple_animal\slime\death.dm" @@ -3737,14 +3709,6 @@ #include "code\modules\mob_spawn\corpses\nanotrasen_corpses.dm" #include "code\modules\mob_spawn\corpses\nonhuman_corpses.dm" #include "code\modules\mob_spawn\corpses\species_corpses.dm" -#include "code\modules\mob_spawn\ghost_roles\away_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\fugitive_hunter_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\golem_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\mining_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\pirate_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\space_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\spider_roles.dm" -#include "code\modules\mob_spawn\ghost_roles\unused_roles.dm" #include "code\modules\mod\mod_actions.dm" #include "code\modules\mod\mod_activation.dm" #include "code\modules\mod\mod_ai.dm" @@ -3752,7 +3716,9 @@ #include "code\modules\mod\mod_construction.dm" #include "code\modules\mod\mod_control.dm" #include "code\modules\mod\mod_core.dm" +#include "code\modules\mod\mod_link.dm" #include "code\modules\mod\mod_paint.dm" +#include "code\modules\mod\mod_part.dm" #include "code\modules\mod\mod_theme.dm" #include "code\modules\mod\mod_types.dm" #include "code\modules\mod\mod_ui.dm" @@ -3827,6 +3793,7 @@ #include "code\modules\modular_computers\hardware\ai_slot.dm" #include "code\modules\modular_computers\hardware\battery_module.dm" #include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\gprs_card.dm" #include "code\modules\modular_computers\hardware\hard_drive.dm" #include "code\modules\modular_computers\hardware\job_disk.dm" #include "code\modules\modular_computers\hardware\network_card.dm" @@ -3844,6 +3811,7 @@ #include "code\modules\movespeed\modifiers\mobs.dm" #include "code\modules\movespeed\modifiers\reagent.dm" #include "code\modules\movespeed\modifiers\status_effects.dm" +#include "code\modules\multiz\movement.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\ninja_explosive.dm" @@ -3865,7 +3833,6 @@ #include "code\modules\ninja\suit\ninja_equipment_actions\ninja_stealth.dm" #include "code\modules\ninja\suit\ninja_equipment_actions\ninja_suit_initialisation.dm" #include "code\modules\ninja\suit\ninja_equipment_actions\ninja_sword_recall.dm" -#include "code\modules\NTNet\netdata.dm" #include "code\modules\NTNet\network.dm" #include "code\modules\NTNet\relays.dm" #include "code\modules\paperwork\carbonpaper.dm" @@ -3893,21 +3860,6 @@ #include "code\modules\photography\photos\album.dm" #include "code\modules\photography\photos\frame.dm" #include "code\modules\photography\photos\photo.dm" -#include "code\modules\plumbing\ducts.dm" -#include "code\modules\plumbing\plumbers\_plumb_machinery.dm" -#include "code\modules\plumbing\plumbers\acclimator.dm" -#include "code\modules\plumbing\plumbers\bottler.dm" -#include "code\modules\plumbing\plumbers\destroyer.dm" -#include "code\modules\plumbing\plumbers\fermenter.dm" -#include "code\modules\plumbing\plumbers\filter.dm" -#include "code\modules\plumbing\plumbers\grinder_chemical.dm" -#include "code\modules\plumbing\plumbers\pill_press.dm" -#include "code\modules\plumbing\plumbers\plumbing_buffer.dm" -#include "code\modules\plumbing\plumbers\pumps.dm" -#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\plumbing\plumbers\teleporter.dm" #include "code\modules\power\cable.dm" #include "code\modules\power\cell.dm" #include "code\modules\power\data_terminal.dm" @@ -3917,7 +3869,6 @@ #include "code\modules\power\gravitygenerator.dm" #include "code\modules\power\monitor.dm" #include "code\modules\power\multiz.dm" -#include "code\modules\power\pipecleaners.dm" #include "code\modules\power\port_gen.dm" #include "code\modules\power\power.dm" #include "code\modules\power\powernet.dm" @@ -3960,13 +3911,13 @@ #include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" #include "code\modules\procedural_mapping\mapGenerators\cellular.dm" #include "code\modules\procedural_mapping\mapGenerators\cult.dm" -#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" -#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm" #include "code\modules\procedural_mapping\mapGenerators\nature.dm" #include "code\modules\procedural_mapping\mapGenerators\repair.dm" #include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" #include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" +#include "code\modules\projectiles\aiming.dm" #include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\gun_firing_procs.dm" #include "code\modules\projectiles\pins.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\_ammunition.dm" @@ -4026,10 +3977,13 @@ #include "code\modules\projectiles\guns\ballistic\rifle.dm" #include "code\modules\projectiles\guns\ballistic\shotgun.dm" #include "code\modules\projectiles\guns\ballistic\toy.dm" +#include "code\modules\projectiles\guns\bolt_types\_gun_bolt.dm" +#include "code\modules\projectiles\guns\bolt_types\locking_bolt.dm" +#include "code\modules\projectiles\guns\bolt_types\no_bolt.dm" +#include "code\modules\projectiles\guns\bolt_types\open_bolt.dm" #include "code\modules\projectiles\guns\energy\beam_rifle.dm" #include "code\modules\projectiles\guns\energy\dueling.dm" #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" @@ -4091,13 +4045,18 @@ #include "code\modules\reagents\chemistry\chem_wiki_render.dm" #include "code\modules\reagents\chemistry\colors.dm" #include "code\modules\reagents\chemistry\equilibrium.dm" +#include "code\modules\reagents\chemistry\exposure.dm" #include "code\modules\reagents\chemistry\holder.dm" -#include "code\modules\reagents\chemistry\items.dm" #include "code\modules\reagents\chemistry\reagents.dm" #include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\cartridges\_cartridge.dm" +#include "code\modules\reagents\chemistry\cartridges\cartridge_spawn.dm" +#include "code\modules\reagents\chemistry\goon_reagents\combo_reagents.dm" +#include "code\modules\reagents\chemistry\goon_reagents\medicine_reagents.dm" +#include "code\modules\reagents\chemistry\goon_reagents\other_reagents.dm" #include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser_prefabs.dm" #include "code\modules\reagents\chemistry\machinery\chem_heater.dm" -#include "code\modules\reagents\chemistry\machinery\chem_mass_spec.dm" #include "code\modules\reagents\chemistry\machinery\chem_master.dm" #include "code\modules\reagents\chemistry\machinery\chem_recipe_debug.dm" #include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" @@ -4105,27 +4064,21 @@ #include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" #include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" #include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\cat2_medicine_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\catalyst_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\colorful_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\dispenser_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" #include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" #include "code\modules\reagents\chemistry\reagents\food_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" #include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\mutation_toxins.dm" #include "code\modules\reagents\chemistry\reagents\other_reagents.dm" #include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\reaction_agents_reagents.dm" #include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\impure_reagents\impure_medicine_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\impure_reagents\impure_toxin_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\unique\eigenstasium.dm" -#include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm" -#include "code\modules\reagents\chemistry\recipes\catalysts.dm" #include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\gateway.dm" #include "code\modules\reagents\chemistry\recipes\medicine.dm" -#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\other.dm" #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\reaction_agents.dm" #include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" #include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" @@ -4218,19 +4171,13 @@ #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\vatgrowing\biopsy_tool.dm" -#include "code\modules\research\xenobiology\vatgrowing\microscope.dm" -#include "code\modules\research\xenobiology\vatgrowing\petri_dish.dm" -#include "code\modules\research\xenobiology\vatgrowing\swab.dm" -#include "code\modules\research\xenobiology\vatgrowing\vatgrower.dm" -#include "code\modules\research\xenobiology\vatgrowing\samples\_micro_organism.dm" -#include "code\modules\research\xenobiology\vatgrowing\samples\_sample.dm" -#include "code\modules\research\xenobiology\vatgrowing\samples\cell_lines\common.dm" -#include "code\modules\research\xenobiology\vatgrowing\samples\viruses\_virus.dm" +#include "code\modules\screen_alerts\_screen_alerts.dm" +#include "code\modules\screen_alerts\atom_hud_text.dm" #include "code\modules\screen_alerts\location_blurb.dm" -#include "code\modules\screen_alerts\screen_alerts.dm" -#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\screen_alerts\picture_alert.dm" #include "code\modules\security_levels\security_levels.dm" +#include "code\modules\security_levels\keycard_auth\keycard_auth_actions.dm" +#include "code\modules\security_levels\keycard_auth\keycard_authentication.dm" #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\battlecruiser_starfury.dm" @@ -4253,6 +4200,30 @@ #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" +#include "code\modules\slapcrafting\living_slapcraft.dm" +#include "code\modules\slapcrafting\slapcraft_assembly.dm" +#include "code\modules\slapcrafting\slapcraft_handbook.dm" +#include "code\modules\slapcrafting\slapcraft_recipe.dm" +#include "code\modules\slapcrafting\slapcraft_step.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_items.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_material.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_reagent.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_reagent_container.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_stack.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_tool.dm" +#include "code\modules\slapcrafting\base_steps\slapcraft_step_weapon.dm" +#include "code\modules\slapcrafting\crafting_items\components.dm" +#include "code\modules\slapcrafting\recipes\components\metal_shaping.dm" +#include "code\modules\slapcrafting\recipes\components\wired_rod.dm" +#include "code\modules\slapcrafting\recipes\medical\prosthetics.dm" +#include "code\modules\slapcrafting\recipes\misc\misc_items.dm" +#include "code\modules\slapcrafting\recipes\processing\wood_processing.dm" +#include "code\modules\slapcrafting\recipes\rustic\torch.dm" +#include "code\modules\slapcrafting\recipes\tools\hand_tools.dm" +#include "code\modules\slapcrafting\recipes\weapons\grenades.dm" +#include "code\modules\slapcrafting\recipes\weapons\melee.dm" +#include "code\modules\slapcrafting\recipes\weapons\ranged.dm" +#include "code\modules\slapcrafting\recipes\weapons\thrown.dm" #include "code\modules\spatial_grid\cell_tracker.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\madness_curse.dm" @@ -4318,7 +4289,6 @@ #include "code\modules\spells\spell_types\self\summonitem.dm" #include "code\modules\spells\spell_types\self\voice_of_god.dm" #include "code\modules\spells\spell_types\shapeshift\_shapeshift.dm" -#include "code\modules\spells\spell_types\shapeshift\dragon.dm" #include "code\modules\spells\spell_types\shapeshift\polar_bear.dm" #include "code\modules\spells\spell_types\shapeshift\shapechange.dm" #include "code\modules\spells\spell_types\teleport\_teleport.dm" @@ -4328,68 +4298,39 @@ #include "code\modules\spells\spell_types\touch\duffelbag_curse.dm" #include "code\modules\spells\spell_types\touch\flesh_to_stone.dm" #include "code\modules\spells\spell_types\touch\smite.dm" +#include "code\modules\spooky\abilities\chilling_presence.dm" +#include "code\modules\spooky\abilities\flicker.dm" +#include "code\modules\spooky\abilities\ghost_light.dm" +#include "code\modules\spooky\abilities\knock_on_window_or_door.dm" +#include "code\modules\spooky\abilities\shatter_glass.dm" +#include "code\modules\spooky\abilities\shatter_light.dm" +#include "code\modules\spooky\abilities\sleep_whisper.dm" +#include "code\modules\spooky\components\spook_factor.dm" +#include "code\modules\spooky\components\spooky_powers.dm" #include "code\modules\station_goals\bsa.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\blood_filter.dm" -#include "code\modules\surgery\bone_surgery.dm" -#include "code\modules\surgery\brain_surgery.dm" -#include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" -#include "code\modules\surgery\coronary_bypass.dm" -#include "code\modules\surgery\dental_implant.dm" -#include "code\modules\surgery\dissection.dm" -#include "code\modules\surgery\eye_surgery.dm" -#include "code\modules\surgery\gastrectomy.dm" -#include "code\modules\surgery\healing.dm" -#include "code\modules\surgery\hepatectomy.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\lipoplasty.dm" -#include "code\modules\surgery\lobectomy.dm" -#include "code\modules\surgery\mechanic_steps.dm" -#include "code\modules\surgery\organ_manipulation.dm" -#include "code\modules\surgery\organic_steps.dm" -#include "code\modules\surgery\plastic_surgery.dm" -#include "code\modules\surgery\prosthetic_replacement.dm" -#include "code\modules\surgery\revival.dm" -#include "code\modules\surgery\stomachpump.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\surgery_helpers.dm" -#include "code\modules\surgery\surgery_step.dm" #include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\advanced\brainwashing.dm" -#include "code\modules\surgery\advanced\lobotomy.dm" -#include "code\modules\surgery\advanced\necrotic_revival.dm" -#include "code\modules\surgery\advanced\viral_bonding.dm" -#include "code\modules\surgery\advanced\wingreconstruction.dm" -#include "code\modules\surgery\advanced\bioware\bioware.dm" -#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" -#include "code\modules\surgery\advanced\bioware\cortex_folding.dm" -#include "code\modules\surgery\advanced\bioware\cortex_imprint.dm" -#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" -#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" -#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" -#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" -#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" -#include "code\modules\surgery\advanced\bioware\vein_threading.dm" #include "code\modules\surgery\bodyparts\_bodyparts.dm" +#include "code\modules\surgery\bodyparts\digitigrade.dm" #include "code\modules\surgery\bodyparts\dismemberment.dm" +#include "code\modules\surgery\bodyparts\germs_bodypart.dm" #include "code\modules\surgery\bodyparts\hair.dm" #include "code\modules\surgery\bodyparts\head.dm" #include "code\modules\surgery\bodyparts\helpers.dm" #include "code\modules\surgery\bodyparts\injuries.dm" +#include "code\modules\surgery\bodyparts\pain.dm" #include "code\modules\surgery\bodyparts\parts.dm" #include "code\modules\surgery\bodyparts\rendering.dm" #include "code\modules\surgery\bodyparts\robot_bodyparts.dm" +#include "code\modules\surgery\bodyparts\stump.dm" #include "code\modules\surgery\bodyparts\species_parts\ethereal_bodyparts.dm" +#include "code\modules\surgery\bodyparts\species_parts\ipc_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\lizard_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\misc_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\moth_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\plasmaman_bodyparts.dm" -#include "code\modules\surgery\bodyparts\species_parts\skrell_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\teshari_bodyparts.dm" #include "code\modules\surgery\bodyparts\species_parts\vox_bodyparts.dm" #include "code\modules\surgery\bodyparts\wounds\_wounds.dm" @@ -4399,6 +4340,23 @@ #include "code\modules\surgery\bodyparts\wounds\cuts.dm" #include "code\modules\surgery\bodyparts\wounds\lost_limb.dm" #include "code\modules\surgery\bodyparts\wounds\punctures.dm" +#include "code\modules\surgery\machines\bodyscanner.dm" +#include "code\modules\surgery\machines\bodyscanner_display.dm" +#include "code\modules\surgery\machines\bodyscanner_helpers.dm" +#include "code\modules\surgery\machines\vitals_monitor.dm" +#include "code\modules\surgery\new_surgery\_surgery_step.dm" +#include "code\modules\surgery\new_surgery\bones.dm" +#include "code\modules\surgery\new_surgery\brain_trauma.dm" +#include "code\modules\surgery\new_surgery\cavity.dm" +#include "code\modules\surgery\new_surgery\dental_implant.dm" +#include "code\modules\surgery\new_surgery\generic_organic.dm" +#include "code\modules\surgery\new_surgery\internal_organs.dm" +#include "code\modules\surgery\new_surgery\other.dm" +#include "code\modules\surgery\new_surgery\reattach_limb.dm" +#include "code\modules\surgery\new_surgery\remove_embedded.dm" +#include "code\modules\surgery\new_surgery\ribcage.dm" +#include "code\modules\surgery\new_surgery\robotics.dm" +#include "code\modules\surgery\new_surgery\tend_wounds.dm" #include "code\modules\surgery\organs\_organ.dm" #include "code\modules\surgery\organs\appendix.dm" #include "code\modules\surgery\organs\augments_arms.dm" @@ -4406,17 +4364,19 @@ #include "code\modules\surgery\organs\augments_eyes.dm" #include "code\modules\surgery\organs\augments_internal.dm" #include "code\modules\surgery\organs\autosurgeon.dm" +#include "code\modules\surgery\organs\cell.dm" #include "code\modules\surgery\organs\ears.dm" #include "code\modules\surgery\organs\eyes.dm" #include "code\modules\surgery\organs\heart.dm" #include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\kidneys.dm" #include "code\modules\surgery\organs\liver.dm" #include "code\modules\surgery\organs\lungs.dm" #include "code\modules\surgery\organs\tongue.dm" #include "code\modules\surgery\organs\vocal_cords.dm" #include "code\modules\surgery\organs\external\_external_organs.dm" +#include "code\modules\surgery\organs\external\ipc.dm" #include "code\modules\surgery\organs\external\rendering.dm" -#include "code\modules\surgery\organs\external\skrell_headtails.dm" #include "code\modules\surgery\organs\external\snouts.dm" #include "code\modules\surgery\organs\external\spines.dm" #include "code\modules\surgery\organs\external\tails.dm" @@ -4424,9 +4384,13 @@ #include "code\modules\surgery\organs\external\wings.dm" #include "code\modules\surgery\organs\stomach\_stomach.dm" #include "code\modules\surgery\organs\stomach\stomach_ethereal.dm" +#include "code\modules\tables\table_flipping.dm" +#include "code\modules\tables\table_frames.dm" +#include "code\modules\tables\tables_racks.dm" #include "code\modules\tgchat\message.dm" #include "code\modules\tgchat\to_chat.dm" #include "code\modules\tgs\includes.dm" +#include "code\modules\tgs_daedalus\tgs_http_rustg.dm" #include "code\modules\tgui\external.dm" #include "code\modules\tgui\states.dm" #include "code\modules\tgui\status_composers.dm" @@ -4461,6 +4425,18 @@ #include "code\modules\tgui_panel\external.dm" #include "code\modules\tgui_panel\telemetry.dm" #include "code\modules\tgui_panel\tgui_panel.dm" +#include "code\modules\three_dsix\roll.dm" +#include "code\modules\three_dsix\stats.dm" +#include "code\modules\three_dsix\skills\_skill.dm" +#include "code\modules\three_dsix\skills\anatomia.dm" +#include "code\modules\three_dsix\skills\coordination.dm" +#include "code\modules\three_dsix\skills\forensics.dm" +#include "code\modules\three_dsix\skills\skirmish.dm" +#include "code\modules\three_dsix\skills\willpower.dm" +#include "code\modules\three_dsix\stats\_stat.dm" +#include "code\modules\three_dsix\stats\motorics.dm" +#include "code\modules\three_dsix\stats\psyche.dm" +#include "code\modules\three_dsix\stats\soma.dm" #include "code\modules\tooltip\tooltip.dm" #include "code\modules\unit_tests\_unit_tests.dm" #include "code\modules\universal_states\resonance_jump.dm" @@ -4484,7 +4460,6 @@ #include "code\modules\vehicles\_vehicle.dm" #include "code\modules\vehicles\atv.dm" #include "code\modules\vehicles\bicycle.dm" -#include "code\modules\vehicles\lavaboat.dm" #include "code\modules\vehicles\motorized_wheelchair.dm" #include "code\modules\vehicles\pimpin_ride.dm" #include "code\modules\vehicles\ridden.dm" @@ -4570,7 +4545,6 @@ #include "code\modules\wiremod\components\action\mmi.dm" #include "code\modules\wiremod\components\action\pathfind.dm" #include "code\modules\wiremod\components\action\printer.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" @@ -4629,8 +4603,6 @@ #include "code\modules\wiremod\components\math\not.dm" #include "code\modules\wiremod\components\math\random.dm" #include "code\modules\wiremod\components\math\trigonometry.dm" -#include "code\modules\wiremod\components\ntnet\ntnet_receive.dm" -#include "code\modules\wiremod\components\ntnet\ntnet_send.dm" #include "code\modules\wiremod\components\sensors\pressuresensor.dm" #include "code\modules\wiremod\components\sensors\tempsensor.dm" #include "code\modules\wiremod\components\sensors\view_sensor.dm" @@ -4698,12 +4670,8 @@ #include "modular_pariah\master_files\code\_globalvars\lists\chat.dm" #include "modular_pariah\master_files\code\controllers\configuration\entries\pariah_config_entries.dm" #include "modular_pariah\master_files\code\game\sound.dm" -#include "modular_pariah\master_files\code\game\gamemodes\objective.dm" #include "modular_pariah\master_files\code\modules\antagonist\_common\antag_datum.dm" #include "modular_pariah\master_files\code\modules\mob\living\emote_popup.dm" -#include "modular_pariah\master_files\code\modules\mod\mod_clothes.dm" -#include "modular_pariah\master_files\code\modules\mod\modules\mod.dm" -#include "modular_pariah\master_files\code\modules\mod\modules\modules_antag.dm" #include "modular_pariah\modules\admin\code\admin_help.dm" #include "modular_pariah\modules\admin\code\adminhelp.dm" #include "modular_pariah\modules\admin\code\loud_say.dm" @@ -4759,12 +4727,7 @@ #include "modular_pariah\modules\customization\modules\clothing\under\science.dm" #include "modular_pariah\modules\customization\modules\clothing\under\security.dm" #include "modular_pariah\modules\customization\modules\clothing\under\syndicate.dm" -#include "modular_pariah\modules\customization\modules\food_and_drinks\recipes\drink_recipes.dm" #include "modular_pariah\modules\customization\modules\jobs\_job.dm" -#include "modular_pariah\modules\customization\modules\reagents\chemistry\reagents.dm" -#include "modular_pariah\modules\customization\modules\reagents\chemistry\reagents\alcohol_reagents.dm" -#include "modular_pariah\modules\customization\modules\reagents\chemistry\reagents\drink_reagents.dm" -#include "modular_pariah\modules\customization\modules\reagents\chemistry\reagents\other_reagents.dm" #include "modular_pariah\modules\dogfashion\code\head.dm" #include "modular_pariah\modules\GAGS\greyscale_configs.dm" #include "modular_pariah\modules\hyposprays\code\autolathe_designs.dm" @@ -4772,9 +4735,7 @@ #include "modular_pariah\modules\hyposprays\code\hyposprays_II.dm" #include "modular_pariah\modules\hyposprays\code\hypovials.dm" #include "modular_pariah\modules\hyposprays\code\vending_hypospray.dm" -#include "modular_pariah\modules\indicators\code\ssd_indicator.dm" #include "modular_pariah\modules\indicators\code\typing_indicator.dm" #include "modular_pariah\modules\pixel_shift\code\pixel_shift.dm" #include "modular_pariah\modules\radiosound\code\headset.dm" -#include "modular_pariah\modules\tableflip\code\flipped_table.dm" // END_INCLUDE diff --git a/dependencies.sh b/dependencies.sh index 6e4db8de0942..a372eb08c4ca 100755 --- a/dependencies.sh +++ b/dependencies.sh @@ -4,18 +4,18 @@ #Final authority on what's required to fully build the project # byond version -export BYOND_MAJOR=514 -export BYOND_MINOR=1589 +export BYOND_MAJOR=515 +export BYOND_MINOR=1630 #rust_g git tag -export RUST_G_VERSION=1.2.0 +export RUST_G_VERSION=3.1.0 #node version -export NODE_VERSION=14 -export NODE_VERSION_PRECISE=14.16.1 +export NODE_VERSION=20 +export NODE_VERSION_PRECISE=20.14.0 # SpacemanDMM git tag -export SPACEMAN_DMM_VERSION=suite-1.7.1 +export SPACEMAN_DMM_VERSION=suite-1.8 # Python version for mapmerge and other tools -export PYTHON_VERSION=3.7.9 +export PYTHON_VERSION=3.9.0 diff --git a/goon/icons/assets/radio/Mec.png b/goon/icons/assets/radio/Mec.png new file mode 100644 index 000000000000..b823a79d2745 Binary files /dev/null and b/goon/icons/assets/radio/Mec.png differ diff --git a/goon/icons/assets/radio/Min.png b/goon/icons/assets/radio/Min.png new file mode 100644 index 000000000000..2fb079505a63 Binary files /dev/null and b/goon/icons/assets/radio/Min.png differ diff --git a/goon/icons/assets/radio/ai.png b/goon/icons/assets/radio/ai.png new file mode 100644 index 000000000000..8f132b965c88 Binary files /dev/null and b/goon/icons/assets/radio/ai.png differ diff --git a/goon/icons/assets/radio/cap.png b/goon/icons/assets/radio/cap.png new file mode 100644 index 000000000000..f59f9ef690c3 Binary files /dev/null and b/goon/icons/assets/radio/cap.png differ diff --git a/goon/icons/assets/radio/ce.png b/goon/icons/assets/radio/ce.png new file mode 100644 index 000000000000..82feedb405b9 Binary files /dev/null and b/goon/icons/assets/radio/ce.png differ diff --git a/goon/icons/assets/radio/civ.png b/goon/icons/assets/radio/civ.png new file mode 100644 index 000000000000..0b414558ae7e Binary files /dev/null and b/goon/icons/assets/radio/civ.png differ diff --git a/goon/icons/assets/radio/clown.png b/goon/icons/assets/radio/clown.png new file mode 100644 index 000000000000..c3d3449c3c31 Binary files /dev/null and b/goon/icons/assets/radio/clown.png differ diff --git a/goon/icons/assets/radio/co.png b/goon/icons/assets/radio/co.png new file mode 100644 index 000000000000..d94def40a61b Binary files /dev/null and b/goon/icons/assets/radio/co.png differ diff --git a/goon/icons/assets/radio/commentator.png b/goon/icons/assets/radio/commentator.png new file mode 100644 index 000000000000..bef6f56c796c Binary files /dev/null and b/goon/icons/assets/radio/commentator.png differ diff --git a/goon/icons/assets/radio/det.png b/goon/icons/assets/radio/det.png new file mode 100644 index 000000000000..2f6a68c23dc9 Binary files /dev/null and b/goon/icons/assets/radio/det.png differ diff --git a/goon/icons/assets/radio/eng.png b/goon/icons/assets/radio/eng.png new file mode 100644 index 000000000000..2afb14908c93 Binary files /dev/null and b/goon/icons/assets/radio/eng.png differ diff --git a/goon/icons/assets/radio/ghost_buster.png b/goon/icons/assets/radio/ghost_buster.png new file mode 100644 index 000000000000..5e6248072b1c Binary files /dev/null and b/goon/icons/assets/radio/ghost_buster.png differ diff --git a/goon/icons/assets/radio/head.png b/goon/icons/assets/radio/head.png new file mode 100644 index 000000000000..cf7ea55c39bc Binary files /dev/null and b/goon/icons/assets/radio/head.png differ diff --git a/goon/icons/assets/radio/hop.png b/goon/icons/assets/radio/hop.png new file mode 100644 index 000000000000..ff8d830af112 Binary files /dev/null and b/goon/icons/assets/radio/hop.png differ diff --git a/goon/icons/assets/radio/hos.png b/goon/icons/assets/radio/hos.png new file mode 100644 index 000000000000..eae92987951b Binary files /dev/null and b/goon/icons/assets/radio/hos.png differ diff --git a/goon/icons/assets/radio/mail.png b/goon/icons/assets/radio/mail.png new file mode 100644 index 000000000000..71d24f16a02f Binary files /dev/null and b/goon/icons/assets/radio/mail.png differ diff --git a/goon/icons/assets/radio/md.png b/goon/icons/assets/radio/md.png new file mode 100644 index 000000000000..5ac1900020bd Binary files /dev/null and b/goon/icons/assets/radio/md.png differ diff --git a/goon/icons/assets/radio/med.png b/goon/icons/assets/radio/med.png new file mode 100644 index 000000000000..927243b2faad Binary files /dev/null and b/goon/icons/assets/radio/med.png differ diff --git a/goon/icons/assets/radio/note.png b/goon/icons/assets/radio/note.png new file mode 100644 index 000000000000..58e0d2a5e207 Binary files /dev/null and b/goon/icons/assets/radio/note.png differ diff --git a/goon/icons/assets/radio/notebad.png b/goon/icons/assets/radio/notebad.png new file mode 100644 index 000000000000..63e3e25f12ad Binary files /dev/null and b/goon/icons/assets/radio/notebad.png differ diff --git a/goon/icons/assets/radio/noterobot.png b/goon/icons/assets/radio/noterobot.png new file mode 100644 index 000000000000..2f5fe1eaef48 Binary files /dev/null and b/goon/icons/assets/radio/noterobot.png differ diff --git a/goon/icons/assets/radio/nt.png b/goon/icons/assets/radio/nt.png new file mode 100644 index 000000000000..75bb96d7c6b0 Binary files /dev/null and b/goon/icons/assets/radio/nt.png differ diff --git a/goon/icons/assets/radio/ntboss.png b/goon/icons/assets/radio/ntboss.png new file mode 100644 index 000000000000..cea36902b85a Binary files /dev/null and b/goon/icons/assets/radio/ntboss.png differ diff --git a/goon/icons/assets/radio/pirate.png b/goon/icons/assets/radio/pirate.png new file mode 100644 index 000000000000..00c7d8ff8f37 Binary files /dev/null and b/goon/icons/assets/radio/pirate.png differ diff --git a/goon/icons/assets/radio/pirate_captain.png b/goon/icons/assets/radio/pirate_captain.png new file mode 100644 index 000000000000..7a66d42978e4 Binary files /dev/null and b/goon/icons/assets/radio/pirate_captain.png differ diff --git a/goon/icons/assets/radio/pirate_first_mate.png b/goon/icons/assets/radio/pirate_first_mate.png new file mode 100644 index 000000000000..a0107416e6fd Binary files /dev/null and b/goon/icons/assets/radio/pirate_first_mate.png differ diff --git a/goon/icons/assets/radio/qm.png b/goon/icons/assets/radio/qm.png new file mode 100644 index 000000000000..2a47623bae61 Binary files /dev/null and b/goon/icons/assets/radio/qm.png differ diff --git a/goon/icons/assets/radio/radio.png b/goon/icons/assets/radio/radio.png new file mode 100644 index 000000000000..9f72303273dd Binary files /dev/null and b/goon/icons/assets/radio/radio.png differ diff --git a/goon/icons/assets/radio/rd.png b/goon/icons/assets/radio/rd.png new file mode 100644 index 000000000000..ef85bce5cac9 Binary files /dev/null and b/goon/icons/assets/radio/rd.png differ diff --git a/goon/icons/assets/radio/rh.png b/goon/icons/assets/radio/rh.png new file mode 100644 index 000000000000..3e14eddbfacd Binary files /dev/null and b/goon/icons/assets/radio/rh.png differ diff --git a/goon/icons/assets/radio/robo.png b/goon/icons/assets/radio/robo.png new file mode 100644 index 000000000000..6ad9f7526c9b Binary files /dev/null and b/goon/icons/assets/radio/robo.png differ diff --git a/goon/icons/assets/radio/sci.png b/goon/icons/assets/radio/sci.png new file mode 100644 index 000000000000..e1209c239e9b Binary files /dev/null and b/goon/icons/assets/radio/sci.png differ diff --git a/goon/icons/assets/radio/sec.png b/goon/icons/assets/radio/sec.png new file mode 100644 index 000000000000..433856468dd9 Binary files /dev/null and b/goon/icons/assets/radio/sec.png differ diff --git a/goon/icons/assets/radio/syndie.png b/goon/icons/assets/radio/syndie.png new file mode 100644 index 000000000000..62014180917f Binary files /dev/null and b/goon/icons/assets/radio/syndie.png differ diff --git a/goon/icons/assets/radio/syndie_letters/A.png b/goon/icons/assets/radio/syndie_letters/A.png new file mode 100644 index 000000000000..0a3a282652d5 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/A.png differ diff --git a/goon/icons/assets/radio/syndie_letters/B.png b/goon/icons/assets/radio/syndie_letters/B.png new file mode 100644 index 000000000000..aa721da31a57 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/B.png differ diff --git a/goon/icons/assets/radio/syndie_letters/C.png b/goon/icons/assets/radio/syndie_letters/C.png new file mode 100644 index 000000000000..8d162b4836c1 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/C.png differ diff --git a/goon/icons/assets/radio/syndie_letters/D.png b/goon/icons/assets/radio/syndie_letters/D.png new file mode 100644 index 000000000000..8678c7a87d82 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/D.png differ diff --git a/goon/icons/assets/radio/syndie_letters/E.png b/goon/icons/assets/radio/syndie_letters/E.png new file mode 100644 index 000000000000..4897d577fa2b Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/E.png differ diff --git a/goon/icons/assets/radio/syndie_letters/F.png b/goon/icons/assets/radio/syndie_letters/F.png new file mode 100644 index 000000000000..889f0a49a6dd Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/F.png differ diff --git a/goon/icons/assets/radio/syndie_letters/G.png b/goon/icons/assets/radio/syndie_letters/G.png new file mode 100644 index 000000000000..7acd46ef2eff Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/G.png differ diff --git a/goon/icons/assets/radio/syndie_letters/H.png b/goon/icons/assets/radio/syndie_letters/H.png new file mode 100644 index 000000000000..1f5f482b2021 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/H.png differ diff --git a/goon/icons/assets/radio/syndie_letters/I.png b/goon/icons/assets/radio/syndie_letters/I.png new file mode 100644 index 000000000000..c499a89b7e0b Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/I.png differ diff --git a/goon/icons/assets/radio/syndie_letters/J.png b/goon/icons/assets/radio/syndie_letters/J.png new file mode 100644 index 000000000000..5d9aa247a185 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/J.png differ diff --git a/goon/icons/assets/radio/syndie_letters/K.png b/goon/icons/assets/radio/syndie_letters/K.png new file mode 100644 index 000000000000..d2240371e2ca Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/K.png differ diff --git a/goon/icons/assets/radio/syndie_letters/L.png b/goon/icons/assets/radio/syndie_letters/L.png new file mode 100644 index 000000000000..06e2e995bd15 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/L.png differ diff --git a/goon/icons/assets/radio/syndie_letters/M.png b/goon/icons/assets/radio/syndie_letters/M.png new file mode 100644 index 000000000000..2ad532cb1393 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/M.png differ diff --git a/goon/icons/assets/radio/syndie_letters/N.png b/goon/icons/assets/radio/syndie_letters/N.png new file mode 100644 index 000000000000..de0a2eb1988c Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/N.png differ diff --git a/goon/icons/assets/radio/syndie_letters/O.png b/goon/icons/assets/radio/syndie_letters/O.png new file mode 100644 index 000000000000..969de05a9c73 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/O.png differ diff --git a/goon/icons/assets/radio/syndie_letters/P.png b/goon/icons/assets/radio/syndie_letters/P.png new file mode 100644 index 000000000000..13b903e976c7 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/P.png differ diff --git a/goon/icons/assets/radio/syndie_letters/Q.png b/goon/icons/assets/radio/syndie_letters/Q.png new file mode 100644 index 000000000000..11b8db3c1dd9 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/Q.png differ diff --git a/goon/icons/assets/radio/syndie_letters/R.png b/goon/icons/assets/radio/syndie_letters/R.png new file mode 100644 index 000000000000..bdb582bee6df Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/R.png differ diff --git a/goon/icons/assets/radio/syndie_letters/S.png b/goon/icons/assets/radio/syndie_letters/S.png new file mode 100644 index 000000000000..d8ebab03fe90 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/S.png differ diff --git a/goon/icons/assets/radio/syndie_letters/T.png b/goon/icons/assets/radio/syndie_letters/T.png new file mode 100644 index 000000000000..291fdfc7bb6c Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/T.png differ diff --git a/goon/icons/assets/radio/syndie_letters/U.png b/goon/icons/assets/radio/syndie_letters/U.png new file mode 100644 index 000000000000..bd0bd8defc70 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/U.png differ diff --git a/goon/icons/assets/radio/syndie_letters/V.png b/goon/icons/assets/radio/syndie_letters/V.png new file mode 100644 index 000000000000..387b54495842 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/V.png differ diff --git a/goon/icons/assets/radio/syndie_letters/W.png b/goon/icons/assets/radio/syndie_letters/W.png new file mode 100644 index 000000000000..c6c6713ca672 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/W.png differ diff --git a/goon/icons/assets/radio/syndie_letters/X.png b/goon/icons/assets/radio/syndie_letters/X.png new file mode 100644 index 000000000000..f6eb18650bcd Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/X.png differ diff --git a/goon/icons/assets/radio/syndie_letters/Y.png b/goon/icons/assets/radio/syndie_letters/Y.png new file mode 100644 index 000000000000..0c18cc7bb56c Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/Y.png differ diff --git a/goon/icons/assets/radio/syndie_letters/Z.png b/goon/icons/assets/radio/syndie_letters/Z.png new file mode 100644 index 000000000000..f527aa5a0d33 Binary files /dev/null and b/goon/icons/assets/radio/syndie_letters/Z.png differ diff --git a/goon/icons/assets/radio/syndieboss.png b/goon/icons/assets/radio/syndieboss.png new file mode 100644 index 000000000000..22b67225cb3f Binary files /dev/null and b/goon/icons/assets/radio/syndieboss.png differ diff --git a/goon/icons/assets/radio/unknown.png b/goon/icons/assets/radio/unknown.png new file mode 100644 index 000000000000..31e4608a79db Binary files /dev/null and b/goon/icons/assets/radio/unknown.png differ diff --git a/goon/icons/items/grab.dmi b/goon/icons/items/grab.dmi new file mode 100644 index 000000000000..eb4b9699b4c2 Binary files /dev/null and b/goon/icons/items/grab.dmi differ diff --git a/goon/icons/mob/appearancemods/lizardmarks.dmi b/goon/icons/mob/appearancemods/lizardmarks.dmi index 029ad3e10e4d..fd0e5b377ccb 100644 Binary files a/goon/icons/mob/appearancemods/lizardmarks.dmi and b/goon/icons/mob/appearancemods/lizardmarks.dmi differ diff --git a/goon/icons/mob/inhands/baton_left.dmi b/goon/icons/mob/inhands/baton_left.dmi new file mode 100644 index 000000000000..d90ee541791d Binary files /dev/null and b/goon/icons/mob/inhands/baton_left.dmi differ diff --git a/goon/icons/mob/inhands/baton_right.dmi b/goon/icons/mob/inhands/baton_right.dmi new file mode 100644 index 000000000000..8e74debab306 Binary files /dev/null and b/goon/icons/mob/inhands/baton_right.dmi differ diff --git a/goon/icons/obj/effects.dmi b/goon/icons/obj/effects.dmi index c3221abfc5f4..ff94351efd39 100644 Binary files a/goon/icons/obj/effects.dmi and b/goon/icons/obj/effects.dmi differ diff --git a/goon/icons/obj/items.dmi b/goon/icons/obj/items.dmi new file mode 100644 index 000000000000..1fa4e593fe7f Binary files /dev/null and b/goon/icons/obj/items.dmi differ diff --git a/goon/icons/obj/projectiles.dmi b/goon/icons/obj/projectiles.dmi new file mode 100644 index 000000000000..175b841c7356 Binary files /dev/null and b/goon/icons/obj/projectiles.dmi differ diff --git a/goon/icons/obj/wizard.dmi b/goon/icons/obj/wizard.dmi new file mode 100644 index 000000000000..2dce05a39c78 Binary files /dev/null and b/goon/icons/obj/wizard.dmi differ diff --git a/goon/icons/turf/damage_states.dmi b/goon/icons/turf/damage_states.dmi new file mode 100644 index 000000000000..035b8c2e579d Binary files /dev/null and b/goon/icons/turf/damage_states.dmi differ diff --git a/goon/sounds/footstep/floor1.ogg b/goon/sounds/footstep/floor1.ogg index 0a760c30de0b..ff33070931ad 100644 Binary files a/goon/sounds/footstep/floor1.ogg and b/goon/sounds/footstep/floor1.ogg differ diff --git a/goon/sounds/footstep/floor2.ogg b/goon/sounds/footstep/floor2.ogg index ce972252630c..1954cff10398 100644 Binary files a/goon/sounds/footstep/floor2.ogg and b/goon/sounds/footstep/floor2.ogg differ diff --git a/goon/sounds/footstep/floor3.ogg b/goon/sounds/footstep/floor3.ogg index c0a6c6452fa9..36c2bd9ff119 100644 Binary files a/goon/sounds/footstep/floor3.ogg and b/goon/sounds/footstep/floor3.ogg differ diff --git a/goon/sounds/footstep/floor4.ogg b/goon/sounds/footstep/floor4.ogg index b2d7c1dab280..d0b5a0969b8a 100644 Binary files a/goon/sounds/footstep/floor4.ogg and b/goon/sounds/footstep/floor4.ogg differ diff --git a/goon/sounds/footstep/floor5.ogg b/goon/sounds/footstep/floor5.ogg index 14eb0624ed4c..8e1576745406 100644 Binary files a/goon/sounds/footstep/floor5.ogg and b/goon/sounds/footstep/floor5.ogg differ diff --git a/goon/sounds/weapons/Taser.ogg b/goon/sounds/weapons/Taser.ogg new file mode 100644 index 000000000000..67af0f6b22c6 Binary files /dev/null and b/goon/sounds/weapons/Taser.ogg differ diff --git a/goon/sounds/weapons/sparks6.ogg b/goon/sounds/weapons/sparks6.ogg new file mode 100644 index 000000000000..4b0b268a0cff Binary files /dev/null and b/goon/sounds/weapons/sparks6.ogg differ diff --git a/html/browser/chat_icons.css b/html/browser/chat_icons.css new file mode 100644 index 000000000000..1ebbb21d7f5a --- /dev/null +++ b/html/browser/chat_icons.css @@ -0,0 +1,14 @@ +img.chat_tag { + width: 32px; + height: 10px; + min-height:10px; +} + +img.radio_tag { + width: 16px; + height: 16px; + min-height: 16px; + position: relative; + left: -1px; + bottom: -4px; +} diff --git a/html/browser/common.css b/html/browser/common.css index 539df2c4c56b..a80d7e65959a 100644 --- a/html/browser/common.css +++ b/html/browser/common.css @@ -23,20 +23,30 @@ a, button, a:link, a:visited, a:active, .linkOn, .linkOff { color: #ffffff; text-decoration: none; - background: #3f595e ; - border: 1px solid #161616; + background: #4d4d4d ; + border: 1px solid rgba(255, 183, 0, 0.5); padding: 1px 4px 1px 4px; margin: 0 2px 0 0; cursor: default; white-space: nowrap !important; text-shadow: none !important; + -ms-user-select: none; + user-select: none; } +.dmIcon +{ + -ms-interpolation-mode: nearest-neighbor; +} a:hover { color: #ffffff; - background: #aa5f36; + background: #aa8136; +} + +a.inlineblock { + display: inline-block; } a.white, a.white:link, a.white:visited, a.white:active @@ -44,7 +54,7 @@ a.white, a.white:link, a.white:visited, a.white:active color: #40628a; text-decoration: none; background: #ffffff; - border: 1px solid #161616; + border: 1px solid rgba(255, 183, 0, 0.3); padding: 1px 4px 1px 4px; margin: 0 2px 0 0; cursor:default; @@ -59,17 +69,53 @@ a.white:hover .linkOn, a.linkOn:link, a.linkOn:visited, a.linkOn:active, a.linkOn:hover { color: #ffffff; - background: #aa5f36; - border-color: #202020; + background: #aa8136; + border-color: rgba(255, 183, 0, 0.7); } .linkOff, a.linkOff:link, a.linkOff:visited, a.linkOff:active, a.linkOff:hover { - color: #ffffff; + color: #000000; background: #999999; border-color: #666666; } +/* Generic links, use outside of computerPanes*/ +a.genericLink, a.genericLink:visited, a.genericLink:active +{ + color: #ffffff; + text-decoration: none; + background: #3f595e; + border: 1px solid #161616; + padding: 1px 4px 1px 4px; + margin: 0 2px 0 0; + cursor: default; + white-space: nowrap !important; + text-shadow: none !important; +} + +a.genericLink:hover +{ + color: #ffffff; + background: #aa5f36; +} + +a.rawLink +{ + color: inherit; + text-decoration: inherit; + background: inherit; + cursor: pointer; + white-space: nowrap !important; + text-shadow: inherit !important; + border: inherit; +} + +a.rawLink:hover { + color: #ffffff; + text-decoration: underline; +} + a.icon, .linkOn.icon, .linkOff.icon { position: relative; @@ -259,8 +305,10 @@ div.notice padding: 4px; margin: 3px 0; text-align: center; - text-shadow: 0 0 5px #FFCC00; + text-shadow: 0 0 0.417em #FFCC00; overflow: hidden; + font-size: 15px; + font-family: monospace; } .computerPaneNested @@ -270,7 +318,7 @@ div.notice margin: 3px 0; color: #ffffff; overflow: hidden; - background-image: inherit; + background: none; box-shadow: 0 0 10px #FFCC00 } @@ -280,7 +328,7 @@ div.notice } .computerText{ - text-shadow: 0 0 5px #C8C8C8; + text-shadow: 0 0 0.417em #C8C8C8; color: #ffffff; } @@ -484,8 +532,8 @@ ul.sparse { } .severity img { - display: inline-block; - vertical-align: middle; + display: inline-block; + vertical-align: middle; } .codexLore @@ -509,7 +557,7 @@ ul.sparse { .dmCodexBody { - margin-left: 15px; + margin: 0px 10px; } .dmCodexBody td @@ -522,6 +570,11 @@ ul.sparse { text-align: center; } +.dmCodexFooter +{ + margin-top: 10px; +} + .tooltip { font-style:bold; } @@ -565,6 +618,14 @@ span.color_holder_box{ border: 1px solid rgba(255, 183, 0, 0.5); } +.zebraTable div:nth-child(2n){ + background-color: #7c5500; +} + +.zebraTable div:nth-child(2n+1){ + background-color: #533200; +} + .zebraTable tr:nth-child(even){ background-color: #7c5500; } @@ -572,3 +633,76 @@ span.color_holder_box{ .zebraTable tr:nth-child(odd){ background-color: #533200; } + +.good +{ + color: #00ff00; +} + +.mild { + color: #e0d000; +} + +.average +{ + color: #f09000; +} + +.bad +{ + color: #ff0000; +} + +/* Highlights the element on hover. For use with onClick events. */ +.highlighter:hover { + /*background-color: #f0c400 !important;*/ + background-color: #aa8136 !important; +} + +.paragraph { + text-indent: 2em; +} + +/* Used for vertical lists of elements. */ +.flexColumn { + display: flex; + flex-direction: column; +} + +/* Used for horizontal lists of elements. */ +.flexRow { + display: flex; + flex-direction: row; +} + +/* Standard flex item */ +.flexItem { + padding-left: 0.5em; + padding-right: 0.5em; +} + +.consoleInput { + position: relative; + display: inline-block; +} + +.consoleInput::after { + content: ""; + position: absolute; + top: 0; + right: -15px; + /* Remove display: inline-block if not required to be on the same line as text etc */ + display: inline-block; + background-color: #606060; + vertical-align: top; + width: 10px; + /* Set height to the line height of .text */ + height: 24px; + animation: blink 1s step-end infinite; + } + +@keyframes blink { + 0% { opacity: 1.0; } + 50% { opacity: 0.0; } + 100% { opacity: 1.0; } + } diff --git a/html/browser/cursors.css b/html/browser/cursors.css new file mode 100644 index 000000000000..f010888139c1 --- /dev/null +++ b/html/browser/cursors.css @@ -0,0 +1,8 @@ +body +{ + cursor: url("default.cur"), auto !important; +} +a +{ + cursor: url("link_select.cur"), auto !important; +} diff --git a/html/changelogs/AutoChangeLog-pr-1075.yml b/html/changelogs/AutoChangeLog-pr-1075.yml new file mode 100644 index 000000000000..1e8427abb694 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1075.yml @@ -0,0 +1,4 @@ +author: Kapu1178 +delete-after: true +changes: + - bugfix: Mobs with active players no longer show as catatonic diff --git a/html/changelogs/AutoChangeLog-pr-1076.yml b/html/changelogs/AutoChangeLog-pr-1076.yml new file mode 100644 index 000000000000..454cd7dbdeaa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1076.yml @@ -0,0 +1,4 @@ +author: Kapu1178 +delete-after: true +changes: + - bugfix: Fixed an issue that caused the server to fail to restart under rare conditions. diff --git a/html/changelogs/AutoChangeLog-pr-164.yml b/html/changelogs/AutoChangeLog-pr-164.yml deleted file mode 100644 index 090099da2c9d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-164.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: francinum -delete-after: true -changes: - - rscadd: Some reagents have gotten a new description - - refactor: Abstract reagents are no longer detected via a magic list - - code_imp: Instantiating an abstract reagent is now illegal and will error - - admin: Some reagents have disappeared from admin lists due to not being real diff --git a/html/changelogs/AutoChangeLog-pr-296.yml b/html/changelogs/AutoChangeLog-pr-296.yml deleted file mode 100644 index 48baf61182b3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-296.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kapu1178 -delete-after: true -changes: - - code_imp: Nothin' to see here folks diff --git a/html/changelogs/AutoChangeLog-pr-330.yml b/html/changelogs/AutoChangeLog-pr-330.yml deleted file mode 100644 index 4b1b34ec8ec8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-330.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Kapu1178 -delete-after: true -changes: - - rscadd: HTML Prefs. - - rscadd: Loadout 2! diff --git a/html/changelogs/AutoChangeLog-pr-342.yml b/html/changelogs/AutoChangeLog-pr-342.yml deleted file mode 100644 index 15d966268ae2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-342.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Kapu1178 -delete-after: true -changes: - - rscadd: Stamina regeration - - rscadd: Sprinting - - rscadd: Stamina damage during combat - - rscadd: Goon Softcrit diff --git a/html/changelogs/AutoChangeLog-pr-345.yml b/html/changelogs/AutoChangeLog-pr-345.yml deleted file mode 100644 index a24ab94317cc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-345.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Kapu1178 -delete-after: true -changes: - - imageadd: Retiled Metastation diff --git a/html/changelogs/archive/2023-06.yml b/html/changelogs/archive/2023-06.yml new file mode 100644 index 000000000000..3d75e476d974 --- /dev/null +++ b/html/changelogs/archive/2023-06.yml @@ -0,0 +1,110 @@ +2023-06-06: + Jacquerel: + - bugfix: Changing z-level while jaunting will no longer reveal you. + - bugfix: If a shuttle lands on you while jaunting you will die rather than be stuck + in a weird purgatory state. + - bugfix: Mirror Walk will not appear tinted as if it can be cast when it can't, + and vice versa. + - qol: Blood Crawl and Shadow Walk will now display whether you can use them or + not in the same manner as Mirror Walk. + - refactor: Jaunt code which adds and removes temporary traits or effects should + hopefully be easier to work with in the future. + Kapu1178: + - rscadd: HTML Prefs. + - rscadd: Loadout 2! + - code_imp: Nothin' to see here folks + - rscadd: Stamina regeration + - rscadd: Sprinting + - rscadd: Stamina damage during combat + - rscadd: Goon Softcrit + - imageadd: Retiled Metastation + VexingRaven: + - bugfix: Multi-Z Ruins work again (Ice Moon Mining Site spawns again with the Demonic + Frost Miner) + - bugfix: Soul Scythes can no longer phase through the floor into Centcom. + francinum: + - rscadd: Some reagents have gotten a new description + - refactor: Abstract reagents are no longer detected via a magic list + - code_imp: Instantiating an abstract reagent is now illegal and will error + - admin: Some reagents have disappeared from admin lists due to not being real +2023-06-07: + Kapu1178: + - rscdel: H.A.R.S mutation + - bugfix: Force feeding works again +2023-06-11: + Kapu1178: + - balance: Heads lost Telebatons and gained Flashes + - balance: Reduced the blast speed of heirophant's blasts. + - balance: Reduced the stamina cost of sprinting + - balance: Reduced the speed of sprinting + - qol: Sprinting no longer drains stamina if you aren't able to move in that direction. + - qol: The code initializes faster. + francinum: + - rscdel: Airlock controller UIs are reverted to HTML +2023-06-14: + Kapu1178: + - rscadd: You can now climb up Z-levels if you're standing on an object and have + something to grip. Floors and lattice are both grippable. + - rscadd: You can now safely descend 1 Z-Level if you are on Walk intent. + - rscadd: You can now hear across Z-Levels. This means you can talk to eachother + from 1 floor away. + - qol: Improved audio-visual feedback when people fall down Z levels. + - refactor: Look Upwards and Look Downwards are not ass anymore. + - bugfix: Fixed a critical issue with Z-Mimic. + francinum: + - config: Lone Op disk security nagging can now be configured. +2023-06-15: + chesse20: + - rscadd: A bunch of old loadout items + - rscadd: A few new masks + - bugfix: You can see which jobs let you use certain items +2023-06-18: + JohnFulpWillard, LemonInTheDark, MTandi, SmArtKar, Mothblocks: + - refactor: JPS Pathfinding & Bot code. + Kapu1178: + - bugfix: Decapitation is now lethal again. + - bugfix: Tongueless speech works again. + - bugfix: Fabricators no longer get SLOWER with better parts + - qol: Fabricators now have a queue system. + - bugfix: Pref menu window somehow changed size?? Fixed + Kylerace: + - bugfix: Extremely rare and horrific bug relating to the spatial gridmap +2023-06-19: + Kapu1178: + - bugfix: Transformations no longer ghost players due to deleting their brain. + - bugfix: Fabricators now animate correctly. + Spyroshark: + - qol: Mouse spawns are now mapped in, rather then spawning on exposed wires. + - rscadd: 'New Event: Animal Infestation. Comes in different variants, and includes + a hint as to what was spawned.' + - rscdel: Removed the Mice Migration event, replaced by Animal Infestation + - rscdel: Regal Rats no longer spawn roundstart. +2023-06-22: + Kapu1178: + - tweak: You must expose your flesh to be healed by tend wounds. + - rscadd: You can now see player's jobs in the lobby. + - qol: Surgically attaching your head to a body no longer sends your brain to [DATA + EXPUNGED] + KylerAce, Kapu1178: + - code_imp: Verbs are now pushed back 1 tick to prevent overtime (lag) + Spyroshark: + - balance: Lavaland mobs no longer take reduced projectile or throwing damage. +2023-06-25: + MrStonedOne: + - server: Security improvement. +2023-06-26: + Kapu1178: + - bugfix: Disablers like, do stamina damage. + - bugfix: LOOC can be used while in soft crit + - tweak: Darkened the color of the Daedalus walls. + - balance: All air mixture values are rounded to 0.0001. + - rscadd: Augment Customization + - rscdel: Prosthetic Quirk +2023-06-27: + Kapu1178: + - rscdel: Plumbing (FOR REAL) + - rscdel: Cytology + LemonInTheDark, Guillaume Prata: + - bugfix: Maps loaded post init will no longer randomly enter a failed state. Hopefully. + - qol: Be polite! While on walk intent you won't bump, swap places or push other + people now. diff --git a/html/changelogs/archive/2023-07.yml b/html/changelogs/archive/2023-07.yml new file mode 100644 index 000000000000..ffa269e35074 --- /dev/null +++ b/html/changelogs/archive/2023-07.yml @@ -0,0 +1,109 @@ +2023-07-03: + Kapu1178: + - bugfix: A bug with zombie hands, pay no mind + - bugfix: Transformations no longer ghost players. + - bugfix: Changing bodytypes updates clothing to reflect new body. + - bugfix: Alot of circuitboards that were unobtainable are obtainable again via + the circuit imprinter. + - rscdel: Removes Felinids as a species. Felinid character saves will automatically + be updated to be a Human with the Feline Ears and Feline Tail implants. + - server: Bumps minimum savefile version to 42. + - bugfix: TEG circulators no longer lock up if the output network is empty. + - refactor: You may now right click with a gun to hold them at gunpoint from any + range. In addition, your HUD has new options that dictate what your victim will + be allowed to do. + - balance: Clamps all standard status effects to a maximum duration of 30 seconds + - balance: Disablers now deal Disorient. + - balance: Disabler projectile travels 12.5% faster + - rscdel: Syndicate Contractor + Spyroshark: + - rscadd: Inflatable shelters can be found in emergency lockers to help you survive + disasters! Idea, code inspiration, and sprites from vgstation. + - imageadd: Inflatable boxes actually have their own sprite now. + - balance: Inflatable boxes start with an extra wall and door. Inflatables can no + longer activate if a structure or mob is on their tile. +2023-07-04: + Kapu1178: + - balance: Passout threshold from oxyloss from 50 to 100 + - balance: Oxyloss taken when failing a breath from 3 to rand(2, 4) + - balance: Oxyloss taken when failing a breath in critical condition from 3.3 to + rand(3,6) +2023-07-06: + francinum: + - refactor: Keycard Authentication Devices have been made significantly less hardcoded. + They're still awful. +2023-07-09: + Kapu1178: + - bugfix: You can now die from only one damage type again. + - bugfix: Action Buttons that require consciousness can now be used in Soft Crit + - bugfix: Removed a phantom surgery from the operating console + - bugfix: Fixed AoE flash function + - balance: AoE flash now has a cooldown. + - bugfix: Examining someone now shows broken bones. + - qol: Health Analyzers now display broken bones. + - bugfix: Checking yourself for injuries now shows broken bones even if the limb + has no damage. + - bugfix: Detective's revolver is no longer an error + - rscdel: Detective's revolver is no longer reskinnable + - rscadd: Voidsuits! A simpler alternative to MODsuits that does not take the backpack + slot. + - balance: MODsuit slowdowns almost entirely removed, save for a couple. + - balance: MODsuit storage module taken from all non-antag suits. + - balance: MODsuit armor increased on most suits. + - bugfix: Item action buttons change icons again. + - tweak: Spacesuit cell batteries are now removed by using a screwdriver while the + cell compartment is open. + - bugfix: The clockwork HUD has aim intent icons. + - bugfix: do_after() now renders on the correct layer and plane + - bugfix: Auto surgeon do_after() + - balance: Megafauna no longer gib dead players. + - qol: Wall engravings can now be removed with a welding tool. + Kapu1178, AdharaInSpace: + - qol: Batons no longer have a right click interaction. Instead, turn on Combat + Mode to bludgeon crew with it. Don't try it while the baton is on, though... + - imageadd: Batons now have in-hand sprites that show if they are on/flipped. + - tweak: Changed most combat messages to third person regardless of who the attacker + is. +2023-07-12: + BrDown: + - bugfix: Deconstructing a railing will now give the proper amount of iron rods. + Kapu1178: + - code_imp: Saved a large amount of tick time in sound. + - bugfix: Fixed a couple issues with augments/implants. + - bugfix: Fabricator icons update properly. + francinum: + - bugfix: You can no longer get to centcom from the station with one verb. +2023-07-19: + DTraitor: + - bugfix: fixed camera not being able to move between Z levels +2023-07-20: + Cenrus: + - balance: bio bags are unequippable on your belt, but hold slime extracts now + - bugfix: fixed sec fabricator + - bugfix: data disks now available as cargo crates + - rscadd: several new cargo packs to make lost designs attainable again + Kapu1178: + - soundadd: More scream sounds! + francinum: + - bugfix: Commendation polling was asking people in the order they joined the server. + It will now instead pick randomly. +2023-07-25: + Kapu1178: + - qol: Click-drag is now a valid way to place someone onto a table. + - rscadd: Attempting to climb a table with combat mode on will cause you to bonk + your head. + - soundadd: Health Analyzers now have a sound + - soundadd: Replaced the airlock access denied sound. + Kapu1178, Zonespace: + - refactor: Surgery, gauze mechanics, limb breaking mechanics, embedding mechanics + - rscadd: Vascular Recoupler (Fix O Vein) + - rscadd: Splints + - rscadd: You can now remove embedded items, splints, and bandages from yourself + or other players by the Examine menu. + - rscadd: Bodyscanner, bodyscanner console, and bodyscanner display. + - tweak: Sutures now instantly close small wounds, but otherwise do nothing. + - rscdel: Surgical drapes + - rscdel: Operating computers + francinum: + - bugfix: 'Energy guns display charge again. Probably a few other things as well, + Overlay rendering was fucked:tm:' diff --git a/html/changelogs/archive/2023-08.yml b/html/changelogs/archive/2023-08.yml new file mode 100644 index 000000000000..767bfa620878 --- /dev/null +++ b/html/changelogs/archive/2023-08.yml @@ -0,0 +1,151 @@ +2023-08-01: + Kapu1178: + - rscadd: The metabolism rate of mobs now slows down as their body chills. At maximum + effect (most obvious in the Cryogenics Toob), one life tick will occur every + 40 seconds. + - rscadd: All health analyzers have a Surgerical mode. + - rscadd: Cryogenics now has a pump to regulate pressure. + - qol: The cryogenics O2 canister starts pre-chilled. + - balance: Arterial bleeding rate slowed by 20% + - bugfix: Epinephrine no longer heals brute or burn damage. + - bugfix: Body scanners now show embedded objects as foreign bodies. + - bugfix: Teshari now have their own damage sprites instead of using the human ones. + - bugfix: Teshari now have their own bloody clothing sprites instead of using the + human ones. + francinum: + - code_imp: Abstractness changes +2023-08-02: + Kapu1178: + - qol: Removed the "syndicate" prefix from some items. + francinum: + - config: A few config entries with no effect have been removed + - server: "Jobs.txt is no longer supported. If you need to change job numbers like\ + \ that, fork (\u0360\u035C\u0296\u0360)" +2023-08-03: + Kapu1178: + - code_imp: Daedalus now supports the Byond-Tracy profiler. + - bugfix: Fixed a serious bug with bodypart damage. + - balance: Vent Pumps and Vent Scrubbers use 33% less power while idling. + - balance: Thermomachine volume from 70 to 400 + (bin_rating * 200) +2023-08-04: + Kapu1178: + - bugfix: Specific chemical effects no longer last forever + - bugfix: ZMimic failing to recognize new atoms + MrMelbert: + - bugfix: Items getting knocked off (glasses and cigars), bad omens, and spaghetti + falling from pockets should trigger on most knockdowns again like they used + to. + - code_imp: Cleaned up the knockoff component a bit. Also unit tests it. + - bugfix: Frozen stuff is now properly actually recognized as frozen and won't re-freeze. + - bugfix: Tonic Water heals dizziness instead of causing it + - bugfix: Fixes stuttered words with anxiety being capitalized + - rscadd: When you are drunk, the strength of your slurring now varies based on + how drunk you are. Being "a little drunk" only rarely slurs your words, being + average drunk is the same as the old effect, while being very drunk now slurs + your words even more. + - rscadd: Some non-alcohol sources of slurring, such as concussions, now give "generic + slurring" rather than "drunk slurring", which less resemble being drunk (ie, + no burping). + - rscadd: 'Mind restoration now heals ALL slurring, rather than only drunk slurring + (which includes cult / heretic slurring). /:cl:' +2023-08-05: + Kapu1178: + - tweak: Player darksight is now DRASTICALLY weaker. + - bugfix: Limping no longer gets stuck on your character after your legs are fixed. + francinum: + - rscdel: door remotes + - qol: removes ntnet + - bugfix: Silicon 'PDAs' will now properly ring. + - rscadd: Medibelts can store Gauze now +2023-08-06: + Kapu1178: + - bugfix: In some cases organs would be unable to be coupled to a mob, these have + been fixed. + - balance: Addiction phases changed to 10/20/40 minutes from 1/2/3 minutes. + SmoSmoSmoSmok: + - bugfix: mulebots can be turned on/off + francinum: + - code_imp: TESTING mode works again. + - config: Credits music, Lobby tracks, and Jukebox media organization has changed + massively. Check the repo for more information. + - rscdel: Disco Inferno has been made far less disco. +2023-08-08: + Kapu1178: + - rscadd: Added a chance for Runtime to spawn with a different name. +2023-08-12: + Gonenoculer5: + - bugfix: Modifies EXAMPLE.json to contain correct comment text relating to durations + of music files. + Kapu1178: + - rscdel: Mood has been removed. Not like Production ever had it turned on... + - bugfix: Fixed objects that render out of their tile rendering over blackness, + when logically they should be invisible. + francinum: + - admin: DSAY now autocompletes again. +2023-08-14: + Cenrus: + - bugfix: fixed disposals in the new MetaStation medbay + - bugfix: added the chemdrobe back to MetaStation + - bugfix: fixed the virology airlock controls not functioning + Kapu1178: + - bugfix: Fixed a bug that might(?) have existed that caused wounds to not stop + bleeding when they should. + - bugfix: Damage overlays should now always be in the correct state. Cannot say + the same for bleeding overlays, but, cope. + - bugfix: Tendon repair surgery works. + francinum: + - rscadd: You can now view a map of the station with the 'Webmap' button in the + top right cluster + - code_imp: Map JSONS must set the 'webmap_id' key for this to work. + - rscadd: You can now open the codex with the 'Codex' button, In the same place. +2023-08-15: + Kapu1178: + - qol: Changed station lighting. +2023-08-20: + Kapu1178: + - bugfix: Doors of all kinds will no longer "trap" dangerous gas inside when closing. + francinum: + - bugfix: Non-human living mobs can now look up + - rscdel: Snob and Unstable quirk has been removed, as it no longer worked. + - bugfix: Security Helmet flashlight behaviour is now a lot more reliable +2023-08-21: + Francinum, Chinsky: + - rscadd: Some documents now come in sealed, tamper-evident folders. This is mostly + a flavor thing. + Kapu1178: + - balance: Damaging a bodypart with a broken bone has a chance to deal damage to + an organ inside. + - balance: Damage that ignores armor (such as pressure damage) can no longer break + bones or jostle bones. + - balance: Tweaked the dismemberment formula for the 8th time + - code_imp: Removed organ/var/status + - bugfix: Sleeping heals instead of dealing damage. + - qol: Chem splashing can now be done with combat mode instead of right click. + - refactor: Regeants. + - rscdel: Reagent purity and pH + - rscadd: Digest vs Bloodstream vs Touching metabolisms. + - rscadd: You can wash off reagents on your skin using a shower or splashing water. + - refactor: Acid now takes into account the permeability of worn clothing. + - rscdel: Most Fermichem and Cobbychem medicines. + - rscadd: Trekchem and Goonchem reagents. + francinum: + - qol: The Report Issues Button no longer sends you to github, but instead sends + the issue report itself. +2023-08-22: + Kapu1178: + - rscdel: IDs are no longer named after the owner. + - rscadd: IDs can now be examined to see lots of information about the registered + employee. + - rscadd: Chameleon IDs now have an "Impersonate Crew" button, to clone the target's + ID. +2023-08-28: + Kapu1178: + - bugfix: Instruments work again + - bugfix: Added Ammonia to the chem dispenser + francinum: + - imageadd: MD Jobstart icon appears properly in editor (Not that we use them anyways...) +2023-08-29: + FunnyLegJiggle: + - bugfix: Ingesting iron no longer marks you for blood-gib. + francinum: + - bugfix: Issue reporter flow no longer overflows diff --git a/html/changelogs/archive/2023-09.yml b/html/changelogs/archive/2023-09.yml new file mode 100644 index 000000000000..d3e0dbfbc275 --- /dev/null +++ b/html/changelogs/archive/2023-09.yml @@ -0,0 +1,180 @@ +2023-09-01: + bluezorua: + - qol: Large metastation hallways (Central and Aft) have been split into smaller + hallways to make atmos management easier. +2023-09-02: + francinum: + - balance: Crab-17 Phones can no longer go on discount. + - bugfix: Ingame Issue Reporter works now. +2023-09-03: + Kapu1178: + - bugfix: You can't make a headpike out of your own head anymore. + - rscadd: Being in a low or high pressure environment now damages your eyes and + ears. + - qol: Click-Drag can now be used to move items around inventories, including swapping + which hand an item is holding. + - bugfix: Ambience automatically plays again. + - tweak: Increased the volume of ambience (except lavaland) + - bugfix: Supermatter delamination properly triggers a radiation storm. + Kapu1178, Goonstation Spriters: + - balance: Agent ID now costs 1 TC + - balance: The chameleon mask now shows your voice as Unknown if you are not wearing + an ID. + - rscadd: The Voice Changer, can be inserted into most masks to obscure your voice + like a chameleon mask. + francinum: + - bugfix: Phones should more accurately reflect their state visually. + - server: Config Error can now receive new entries post-super-early init. + - server: rustg 2.1.0 + yyzsong: + - rscadd: Chemistry gets a grinder and plasma by default + - qol: updates beaker transfer amounts for the multiple-of-sixtyening. +2023-09-04: + Kapu1178: + - qol: Updated the changelog to include Daedalus contributors. +2023-09-05: + francinum: + - bugfix: Atmospherics has a SMES unit to prop up it's exceptional power load. +2023-09-06: + Cenrus: + - tweak: Pixelshift default hotkey is now J instead of B +2023-09-07: + Spyroshark: + - rscadd: Maint Slugs! They leave behind a slippery trail and can be "milked" if + so desired. Cargo starts with a unique one. + - rscadd: Feral Hogs! Technically a neutral animal, they become aggressive if you + get too close. Security has a private hog. + - rscdel: Sgt. Araneus and Paperwork have been sent off to kindly old spaceman's + farm, where they will happily live out the rest of their natural lives. +2023-09-09: + Kapu1178: + - bugfix: Dermaline and Meralyne pill bottles have the correct pills. +2023-09-10: + Kapu1178: + - rscadd: Traitor's primary objectives are now Gimmicks. + - rscadd: The Announce Objectives button on the administration Antag Panel now shows + a pop-up to the target. + - rscadd: Gimmick objective type. + - rscdel: Removed all of TG's Syndicate/Nanotrasen employers. + - rscdel: 'Removed the following objective types: Martyr, Protect (replaced by Jailbreak), + Survive (Non-AI), Maroon, Escape, Block, Purge, Robot Army.' + - qol: Hijack is no longer a rollable objective. + - rscdel: Removed Thief antagonist. + - rscdel: Removed Valentine's Day event and antagonist. +2023-09-11: + Kapu1178: + - bugfix: Facial Hair Gradients can now be color picked again + - bugfix: Wearing a non-mask object in your mask slot won't break your radio. + - bugfix: You will properly receive your Loadout Uniform as an Assistant + githubuser4141: + - balance: you can print mecha designs that were printable pre-update now. Namely + the mech laser, heavy mech laser and mech armours. You can now print the Gygax + targ board. + yyzsong: + - qol: chemmaster can now make twice the amount of things at once +2023-09-12: + Kapu1178: + - bugfix: Fixed an issue where rarely fires could burn forever. + francinum: + - rscadd: Ghosts will now be told what the crew has collectively hallucinated. +2023-09-13: + Kapu1178: + - refactor: Credits should now consistently reach the bottom of the screen. Even + if a bit.... choppily. + LemonInTheDark: + - rscadd: Adds a grace period for hit detection, between clicking ON someone, and + then moving your mouse off before releasing the click. It's short, hopefully + it helps with stupid + francinum: + - rscdel: Ticket machine tickets no longer magically vanish upon deletion, and the + entire logic chain is generally much simpler. + - bugfix: Turf Decals are now anchored. +2023-09-14: + Cenrus: + - rscadd: Flavor text reintroduced + - bugfix: Fixed aliens being able to hold all items. + - rscadd: Crates loaded on a trolley are now visible + francinum: + - bugfix: maint loot spawners should work again. + - bugfix: Wiki Books now render (more) properly + - bugfix: Space Law book points to Corporate Regulations. +2023-09-15: + Kapu1178: + - tweak: Traitor gets 1 gimmick objective, and can roll 1 additional kill or steal + objective randomly. + - balance: Increased fall damage by alot, damage now varies by bodypart, accounting + for all armor values. +2023-09-16: + Cenrus: + - bugfix: Fixed fancy tables having no sprites. + Kapu1178: + - qol: You can no longer attack mobs without being in Combat Mode. + - code_imp: Added a high pass filter to bloom to cull useless overlays, should help + performance alot. + - refactor: Improved code around species organs to make way for IPCs + - rscdel: Golems, Adamantine, and related goodies. + - code_imp: Fixed some harddels + bluezorua: + - rscdel: a floating air alarm in security shooting gallery + francinum: + - bugfix: Classic input should be a little more functional + - rscadd: Some books will now open codex entries. + - bugfix: The r4407 changelog link works again. +2023-09-17: + Kapu1178: + - bugfix: Having non-living mobs (such as the AI camera) will no longer break the + EOR credits roll. + MrMelbert: + - qol: Haunted 8-ball no longer requires the ghost orbit the petitioner to submit + votes + - qol: Haunted 8-ball ghosts can now change their vote after submitting it + - bugfix: Haunted 8-ball no longer always reports "yes" + - bugfix: Haunted 8-ball no longer always reports default "yes", "no", or "maybe" + and now gives a proper eight ball response + - bugfix: Haunted 8-ball can be picked up via the stat panel + francinum: + - rscadd: Data Terminals are buildable, you can get them from the Engineering Fabricator. + - bugfix: phone connection feedback messages no longer error on trying to connect + to a terminal it's already connected to. + - bugfix: Saline Drip icon now works again. + - bugfix: Security Helmets can now ACTUALLY have flashlights attached again. + - bugfix: diphenhydramine, antihol, lipolicide, and anacea are craftable again. + - bugfix: Antihol shows up in the codex. +2023-09-18: + Kapu1178: + - balance: Non-advanced health analyzers get chem scan mode back + - balance: Health analyzers now output blood oxygenation, and heartrate. + - balance: Husking is no longer caused by burn damage. + - bugfix: Unstable Mutagen has a recipe +2023-09-25: + francinum: + - bugfix: Whiteship custom landing spots work again. +2023-09-26: + A.C.M.O.: + - rscadd: Hermetically sealed and space-worthy helmets can now be used as breathing + apparatuses! + - rscadd: Internals air tanks can now be toggled via AltClick. + - bugfix: Breath masks are fixed, and can now be toggled via AltClick. + - refactor: Refactored and deduplicated a significant portion of internal air tank + functions. + - bugfix: Fixed a bug that caused any type of equipped mask to be auto-adjusted + when toggling internals. + - bugfix: Fixed a bug that prevented toggling of internals via the stripping menu + if the mob only had a breathing tube. + - bugfix: Fixed a bug that allowed two mobs to breathe from the same air tank after + exchanging it between them. + Kapu1178: + - imageadd: Replaced wood floor tiles with the old ones. + - tweak: Changed daedalus wall color. + - qol: Replaced all Unathi lore with Jinan lore. + - bugfix: The ethereal disco ball no longer screams runtimes + - rscadd: Integrated Positronic Chassis & Jinan variant + - bugfix: Pain flashes actually show up in client huds now + - balance: Increased pain taken from brute damage by 50% (0.4 >> 0.6) + - bugfix: Carbon health values now only care about brain loss. + - bugfix: Acid damages you when splashed again. + KylerAce: + - bugfix: queuing clicks should work correctly now + LemonInTheDark: + - tweak: Bitfield entries in View Variables show NONE instead of a blank entry if + the field is empty. diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml new file mode 100644 index 000000000000..8b7682830d2c --- /dev/null +++ b/html/changelogs/archive/2023-10.yml @@ -0,0 +1,43 @@ +2023-10-01: + Kapu1178: + - qol: De-bolded radio channels in chat. Italicized and granted a slightly different + color to speaking verbs, to increase readability. +2023-10-03: + Kapu1178: + - bugfix: Fixed a bug that caused specific projectiles to collide with objects they + shouldn't. + - bugfix: Mutagen's recipe now works. For real this time. +2023-10-09: + Kapu1178: + - qol: Adjusted the time it takes for blood to try. + - bugfix: Vox now die when debrained. + - bugfix: the die of fate no longer has a 5% chance to break the game + - bugfix: IPCs can Read. + - bugfix: Stumps can be sawed off. + - rscdel: An interaction with a heretic path and wounds. + Zandario: + - refactor: Ambient Occlusion looks better and is faster. + - bugfix: Reduced roundstart lag + francinum: + - balance: Ballistics now have recoil by default + - balance: Bullet embedding logic has been changed + itsmeow: + - code_imp: 'Optimized z-level transition mirages, saving ~0.32s init. /:cl:' +2023-10-11: + RimiNosha: + - bugfix: Secoffs should be able to access their EVA suits now. +2023-10-20: + Kapu1178: + - qol: Improved client performance + francinum: + - balance: PDA Messages no longer require a central server + - balance: The Message server now logs any PDA message it can get it's grubby little + hands on, with it's integrated GPRS Receiver. + - code_imp: Modular Computers are now capable of handling radio packets, in a limited + sense, It's easy to remove these limits, but I saw it best to prioritize performance + first. + mc-oofert: + - bugfix: SDQL now displays turf locations instead of saying they are in nullspace +2023-10-25: + Kapu1178: + - code_imp: Cleaned up material code diff --git a/html/changelogs/archive/2023-11.yml b/html/changelogs/archive/2023-11.yml new file mode 100644 index 000000000000..ea0290ef3277 --- /dev/null +++ b/html/changelogs/archive/2023-11.yml @@ -0,0 +1,73 @@ +2023-11-14: + Kapu1178, Ivory, yyzsong: + - imageadd: Added a new mouse cursor + - code_imp: Added support for UIs to have custom cursors + - code_imp: Added support for dynamic cursor behavior with interactables. + francinum: + - bugfix: Media System Validation is less likely to die unexpectedly. + - rscadd: The Meta Bar now has a jukebox + - rscadd: And it can be used by non-bartenders. +2023-11-15: + Kapu1178: + - rscdel: Lavaland and it's baggage +2023-11-18: + Kapu1178: + - bugfix: Under certain circumstances, masks would show as invisible in your mask + slot. This has been fixed. + - tweak: Renamed Metastation to Theseus. You know why. + - bugfix: You can no longer flip operating tables. +2023-11-20: + Kapu1178: + - tweak: The Codex now supports nicer formatting. +2023-11-21: + Kapu1178: + - bugfix: Airlock codex entry works. + - rscadd: Asteroid Magnet codex entry. + - rscadd: The magnet now has a 60 second cooldown between uses. + - bugfix: Summoned asteroids are removed from the list of available asteroids. + - bugfix: Fixed a bug that allowed you to summon multiple asteroids at once. + - balance: Hitting someone with a thrown body now only knocks them down briefly + instead of stunning + knocking down for 2 seconds +2023-11-23: + Kapu1178: + - bugfix: IPCs can remove shackles in their preferences menu + - rscdel: Health indicator due to being confusing. + - balance: Adjusted rate of slowdown from pain. + - tweak: Added healthdoll indicator for pain. + - bugfix: Tackling works again. + - bugfix: Hogs no longer shit runtimes, they just shit. + - rscdel: Removed feedback on trying to grab an anchored object. + - bugfix: Being restrained or incapacitated prevents movement again. + - tweak: Changes event bounds from 3-10 minutes to 20-30 minutes. + Spyroshark: + - rscdel: Removed Anomaly events, Wisdom Cow event, and the Space Dragon spawning + event. + - rscadd: New Solar Flare event to replace the niche of pyro anomalies. + - balance: Spontaneous Brain Trauma events are much less common. Wormholes and Hostile + Mob Infestations are slightly more common. + Time-Green: + - bugfix: AI controlled mobs can no longer disembowel or delimb people randomly. + francinum: + - qol: The new mouse cursors are more pleasant to use + - imageadd: An arrow has been added at the top left which identifies the actual + position of the target pixel. + - bugfix: PDA server now logs messages again +2023-11-25: + Kapu1178: + - bugfix: Inaprovaline will no longer "randomly" stop your heart (specific interaction + that wasn't super rare) +2023-11-28: + Kapu1178: + - bugfix: Fixed a runtime with hog riding + - bugfix: Fixed titanium being replaced with bananium in asteroids + - bugfix: Fixed a runtime in the credits episode draft sequence + - tweak: Adjusted volume of breathing in space. + - bugfix: Fixed an issue where you could hear breathing in space even if you couldn't + actually breathe (no internals, etc). + - qol: The jukebox now works SIGNIFICANTLY better. + KylerAce: + - code_imp: verb callbacks will no longer execute if the original client disconnected +2023-11-29: + MrStonedOne: + - bugfix: Fixed a bug with subsystems that caused some subsystems to fire faster + than intended after having no work for some time. diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml new file mode 100644 index 000000000000..c8948010f70d --- /dev/null +++ b/html/changelogs/archive/2023-12.yml @@ -0,0 +1,63 @@ +2023-12-01: + Fikou: + - rscadd: MODsuits can now call other modsuits with the MODlink feature +2023-12-04: + Kapu1178: + - bugfix: Grabs will now properly break when they logically should, no longer requiring + a user to perform an action to refresh their state. + - bugfix: Edgelocks are no longer one-way doors. + - bugfix: AI can now close the Thermo-Electric Generator TGUI interface (What a + bug!). + - bugfix: Cyborgs and friends can now grab things. + - qol: Clicking an item while grabbing it will now end the grab and pickup the item. + - bugfix: You can no longer sprint in space. + RimiNosha: + - imageadd: Added texture to unreinforced walls. + francinum: + - imageadd: Credits companies have been changed +2023-12-05: + Kapu1178: + - bugfix: Alleviated a bug with space drift + Kapu1178, jlsnow301: + - rscadd: Organ and Limb necrosis + - rscadd: A robust debug interface for human health, courtesy of jlsnow301 +2023-12-07: + Kapu1178: + - bugfix: Maintenance crates have items...again? I don't know anymore. This genuinely + pissed me the hell off. + - bugfix: Maintenance crates are no longer mapping helper munchers. + - bugfix: Holding shift displays the examine icon again + - server: Developers are now required to use BYOND 515 +2023-12-11: + SyncIt21: + - bugfix: Cryostylane and oxygen reaction now cools down temps. Other reactions + with the REACTION_HEAT_ARBITARY flag also cools down temps correctly +2023-12-15: + Lucas Pope: + - soundadd: The security megaphone has a unique sound effect. +2023-12-17: + Kapu1178: + - qol: Added Delosane900 to the list of Immortals, whose names will live on in git + history. +2023-12-19: + Amunak, Zamujasa: + - rscadd: Adds image tags to admin helps and admin PMs + Azarak: + - rscadd: Added old non-smart functionalities for cables + - rscadd: Added a built in RCL functionality to cable coil + - rscadd: Added a smart cable placing mapping helper + - rscdel: Removed "smart" functionalities from cables + - rscdel: Removed the RCL and pipe cleaners + Kapu1178: + - rscadd: A new storage type, Holster, which allows specific items to ignore storage + restrictions. + - bugfix: Quickdraw storages can be opened normally. +2023-12-20: + RimiNosha: + - rscadd: Chemical cartridges! Chem/booze/soda dispensers now draw from cartridges + instead of magically synthesizing chemicals. + - balance: Chem dispensers no longer have infinite chems and will need to be refilled. + Medical has spare cartridges, and more can be bought from cargo. +2023-12-24: + Kapu1178: + - balance: Crawling is slower. diff --git a/html/changelogs/archive/2024-01.yml b/html/changelogs/archive/2024-01.yml new file mode 100644 index 000000000000..76d154f658ac --- /dev/null +++ b/html/changelogs/archive/2024-01.yml @@ -0,0 +1,131 @@ +2024-01-02: + Azarak, Kapu1178: + - rscadd: Modular slapcrafting + CapybaraExtravagante, LemonInTheDark, Time-Green, ninjanomnom: + - bugfix: Mobs will fly around space... less + Kapu1178: + - bugfix: A rare bug with grabs not removing their effects on release. + - tweak: Restyled TGChat for Daedalus. + - bugfix: You can place people onto tables without a grab again. + - bugfix: The suit storage slot icon works correctly again. + - balance: Melee and Bullet armor has been split further into Blunt, Puncture, and + Slash armor. + - balance: Attacks now check against different armor types based on the sharpness + (sharp, pointy, both, blunt) of the weapon. + - balance: Spear force reduced by 3 + - balance: Rubber and DumDum rounds are now 5x weaker to armor than a standard bullet, + from 2x. + - balance: Shrapnel is now 3x weaker to armor, from 2x. + - qol: During Crew Transfer votes, non-afk players will be counted as Continue Playing + if they do not vote. + - bugfix: Map voting works FOR REAL. + LemonInTheDark: + - code_imp: Micro optimized timers + Time-Green: + - bugfix: Odd cases where bodyparts and organs end up outside of mobs are handled. + francinum: + - qol: Hermes Transport has instituted new seat filling algorithms to decrease lap-seating + in long-range transport shuttles. +2024-01-03: + Kapu1178: + - bugfix: Bodyparts are no longer affected by explosions directly when attached + to a mob. The mob handles it. + Profakos: + - rscdel: Removes the slime's reagent holder. This will make them not slow down + from somehow imbibing morphine or frostoil. + francinum: + - code_imp: rust_g 2.2.0 +2024-01-04: + Kapu1178: + - bugfix: Votes run their completion code. +2024-01-05: + MrMelbert, Kapu1178: + - refactor: Refactored unarmed attacking mechanisms, this means dis-coordinated + humans will now bite people like monkeys (like how coordinated monkeys punch + people like humans?) + - refactor: Dis-coordinated humans smashing up machines now use their hands, rather + than their paws +2024-01-06: + Kapu1178: + - rscadd: Mobs now jiggle when attacked. Jiggle jiggle. + - rscadd: Increased brutality of combat. + - soundadd: Added new punch sound effects. +2024-01-11: + Kapu1178: + - rscadd: A wielding hotkey. + - refactor: Rewrites blocking to be more sane. Adds new audiovisual feedback to + successful blocks. + - balance: Adjusted pain numbers. + - refactor: Changed how melee accuracy works to a better(?) distribution. + - rscadd: Added new feedback for being in pain. + - soundadd: Added new sounds for being in pain. + - refactor: Alot of gun code. + - balance: Firing a gun without wielding it will yield increased spread. + - bugfix: Attempting to akimbo guns will no longer fail if the first gun fails to + fire. + - bugfix: Guns with locking bolts will no longer freak out if they run out of ammo + in certain situations. + - bugfix: Suppressing a gun will no longer remove it's pointblank knockback. + - bugfix: You are no longer able to dry fire guns you can't fire at all. + - bugfix: Alot more gun bugs. +2024-01-12: + Kapu1178: + - rscadd: Security Huds now require using a click action to scan a target. This + will print their record information to the chat, and display an on-screen visual. + - rscadd: Glasses color is now a pref and not a weird undocumented alt click feature. +2024-01-13: + Kapu1178: + - bugfix: Default wield hotkey no longer conflicts with other default hotkeys. +2024-01-23: + MisterGrimm: + - balance: Getting flushed into the disposal network damages mobs once more +2024-01-24: + Kapu1178: + - rscadd: Ballistics now emit a long-lasting scent of gunpowder when fired. + - rscadd: Energy weapons now emit a short-lasting scent of ozone when fired. + - qol: You won't see multiple smell messages in a single smell tick. + - code_imp: Cleaned up smell code. + Time-Green, IndieanaJones: + - qol: Adds the seethrough component, allowing people to see behind large objects, + and behind their own mob if they are large +2024-01-27: + Kapu1178: + - bugfix: When you are knocked out from pain, you will stay knocked out until you + recover enough. + - qol: When you are entering shock, you will hear your heartbeat. + - qol: Reduced time gap between pain messages. + - qol: Pain message time gap will scale inversely proportional to the amount of + pain you're in. + - qol: Added more effects to earlier shock stages. + - qol: Added a chat message for gasping caused by lung damage. + - balance: Increased damage required to damage organs from external wounds. + - balance: Reduced heart damage taken from irregular heartbeats. +2024-01-28: + Kapu1178: + - qol: Unloading a firearm is now ALWAYS done with Alt Click or Right Click. + - qol: 'Use-in-Hand with ballistics is now reserved for: gun flipping, bolt dropping, + and racking.' + - rscadd: Energy swords now emit sparks when active. + - rscadd: Examining a gun no longer tells you it's ammo count unless the magazine + is internal. You must instead remove the magazine and examine it. Examining + magazines no longer gives numerical ammo counts. + - balance: Loading a magazine from another magazine takes a small amount of time + to complete. + - balance: Removed most firing pins from the game. Guns who have had their pin type + removed have had it replaced with the standard firing pin. + - balance: Removed hotswapping magazines. Use your hands. + - balance: Makarov TC cost from 7 to 10 + - balance: Makarov Magazine cost from 1 to 2 TC + - balance: Makarov Special Magazines from 3 to 6 TC + - balance: Revolver from 13 to 12 TC + - balance: Revolver Speedloader from 4 to 6 TC + - balance: Energy sword size increased to Normal (cannot be pocketed) + - balance: Energy sword cost from 8 to 12 TC + - balance: Removed double energy sword from the uplink + - balance: C4 charge from 1 to 4 TC + - balance: C4 bag from 8 to 14 TC + - balance: C4 bag C4 count from 10 to 4 + - balance: X4 bag from 4 to 14 TC + - balance: Detomatix from 6 to 10 TC + - balance: Syndicate bomb from 11 to 16 TC + - bugfix: Guns playing the incorrect sounds for ejecting magazines. diff --git a/html/changelogs/archive/2024-02.yml b/html/changelogs/archive/2024-02.yml new file mode 100644 index 000000000000..ddf4e7383cbb --- /dev/null +++ b/html/changelogs/archive/2024-02.yml @@ -0,0 +1,159 @@ +2024-02-01: + DTraitor: + - refactor: Removed unnecessary checks in mod suits code + Kapu1178: + - bugfix: Items with unique appearances for being wielded work again. + - bugfix: Throwing processes at the correct rate. + - bugfix: A code error of which it's impact I am unsure of. + - rscadd: The dual-port vent pump is now in the RCD + - bugfix: Looping sounds play again. + TiviPlus, LemonInTheDark, ChungusGamer666, Watermelon914, vinylspiders, tyeagg, Kapu1178: + - rscadd: Added new particle effects for being on fire or wet. + - rscadd: Added new particle effects for firing ballistic weapons. + - rscadd: Added new particle effects for bullets impacting surfaces. + - rscadd: Bullets are now illuminated. + - rscadd: Bullets leave behind impact holes on most surfaces. +2024-02-05: + DTraitor: + - bugfix: Camera mobs (AI, Blob, etc) can move down on multi Z maps now + Kapu1178: + - bugfix: You can no longer use self-grabs to propel yourself at the speed of light. + - bugfix: You can no longer throw yourself. + francinum: + - bugfix: Corrected mousedrag hotspots on the fancy cursor. +2024-02-06: + Kapu1178: + - bugfix: Fixed missing wire nodes on some APCs on Theseus + - bugfix: Fixed link scryers missing an icon. +2024-02-07: + Ghommie: + - bugfix: Fixed text effects for runechat messages (the stuff enclosed in +, | and + _ characters) sometimes not working. +2024-02-10: + Kapu1178: + - qol: Added an on-screen indicator for when you're unable to click. +2024-02-12: + Kapu1178: + - qol: Thrown objects spin more naturally. + - tweak: Almost all objects have had their throw speed reduced. + - bugfix: Unbuckling from an object no longer locks you out of actions for 2 seconds. + - qol: Using the Observe verb now shows you action buttons of the target. + - qol: Using the Observe verb now allows you to see Tooltips like normal. + - qol: Using the Observe verb now makes you see and hear (almost) exactly what your + target does. + - tweak: The Orbit panel now uses Observe by default. You can still use Orbit by + changing the toggle in the top right. + - bugfix: An 8 year old bug with signallers you never noticed because you don't + use them. + - qol: Added accessibility features to disable blur effects and pain flashes. + - balance: Walking on fractured legs causes pain + - balance: Reduced slowdown caused by pain directly. (pain / 15 to pain / 40) + - rscadd: Head fractures now give you a concussion status effect + whataboutism-alos: + - rscadd: Creates vox scutes + - imageadd: Creates icons for vox arm, leg, and hand scutes + - code_imp: Reorganized the sprites within the vox bodyparts.dmi +2024-02-13: + Kapu1178: + - rscadd: Ghost vision is now monochrome. This can be disabled in preferences. + - bugfix: Damage from overheating would occasionally not update your health display. + - bugfix: Neon carpet works again +2024-02-16: + francinum: + - server: BYOND 515.1630 is now required to compile. +2024-02-18: + Kapu1178: + - refactor: Rewrote fires, please report any oddities using the bug report button. + - bugfix: You will now instantly ignite upon entering a fire. + - bugfix: Crawling over flammable liquid while holding a flammable object will ignite + the fuel. + - bugfix: You take damage in fire again. + - bugfix: Flamethrowers no longer spew plasma into the room (lol oops) + - rscdel: Deleted the "on fire" particle effect, as it looks REALLY BAD when you're + prone. +2024-02-20: + Kapu1178: + - rscadd: Everyone now spawns with a wallet, containing their ID and their starting + funds. You can close them to conceal the ID, but you won't be able to use the + ID's access until you open it. RFID blocking leather! + - rscadd: Everyone now receives a random bank PIN, viewable in the Memories menu + (IC tab if you forgot). + - rscadd: You can now access your bank account via a number of ATMs placed around + the station. + - balance: Crew marked as Deceased in records are no longer given a paycheck. Update + records for more money! + - rscdel: ID cards are no longer magic money dispensers/receptacles. + - rscdel: PDAs no longer take on the name of their owner. + - rscdel: Civilian bounties. + - rscadd: Added a new admin outfit +2024-02-22: + francinum: + - bugfix: Click Catcher works again. +2024-02-24: + francinum: + - rscdel: A majority of existing achievements have been removed. + - bugfix: Railings no longer duplicate rods. +2024-02-25: + francinum: + - rscadd: Hydrogen can now be purchased from cargo. +2024-02-26: + Jacquerel, MrMelbert: + - bugfix: Stabilized slime extracts will now once again work from inside modsuit + storage. + - bugfix: When placing an item into storage (such as backpacks), all nearby mobs + now get a message, rather than just the first mob. + - bugfix: TGC decks of cards should act a bit less odd when looking inside. + - refactor: Refactored a bit of storage, cleaned up a fair bit of its code. Let + me know if you notice anything funky about storage (like backpacks). + Kapu1178: + - bugfix: Fixed IDs being broken + - bugfix: Fixed a missing wire node in engine monitoring + - bugfix: Fixed admin chat using the wrong css class + LemonInTheDark: + - refactor: Lighting should be faster now + - rscdel: Multi-Z lighting, for now. + MrMelbert: + - bugfix: Chasms no longer break your verbs + - bugfix: Maps loaded in after roundstart will no longer have broken smoothing +2024-02-27: + Kapu1178: + - soundadd: Alot of sounds have been added or replaced. + - rscadd: You can now take a drag off a cigarette by clicking yourself while holding + it. + - rscadd: Cigarettes now leave tiny smoke particles sometimes. +2024-02-28: + Kapu1178: + - bugfix: Items hide other items EVEN BETTER. + ? Kapu1178, Fikou, Tau-Ceti, Baystation12, Aurorastation, with help from Lohikar, + Ter, and Lummox. Hitsplatter sprites modified by 13spacemen. + : - bugfix: Fingerprints are now applied in more situations. Did you know that punching + someone didn't apply fingerprints? + - bugfix: Fingerprints are now applied more realistically, attempting to add to + clothing first where applicable. + - bugfix: Blood is now left on items you touch if your hands or gloves are bloody. + - bugfix: Tracking blood on feet/shoes works correctly. + - refactor: Rewrote the forensics component into a datum. + - rscadd: Two new forensic information classes, Trace DNA and Gunshot Residue. + Trace DNA is left by doing things such as biting, smoking a cigarette, or + drinking. Gunshot Residue is left by ballistic firearms. + - rscadd: Fingerprints are now only partially left, sometimes requiring multiple + touches to give full clarity to the print. + - rscadd: Blood can now be colors other than red. + - rscadd: There is more blood. + - rscadd: Detective now gets a filing cabinet that contains a paper copy of each + crew member's record when they joined. + - qol: Cleaned up evidence bag behavior to be in line with other storage objects. + - rscadd: Added sample kits for different forensic information. Fingerprint cards + for fingerprints, swabs for trace DNA or blood DNA, a fiber kit for material + fibers, and finger print powder for finding fingerprints on objects. + - rscadd: Scene cards to mark crime scenes. + - rscadd: Detective now gets an Electron Microscope, to analyze fingerprints, + fibers, and residue. + - refactor: Rewrote the Forensic Scanner into the DNA Scanner. It is now only + used for trace DNA and blood DNA samples. + francinum: + - admin: A Lag Switch has been added to disable VV Icon Previews. +2024-02-29: + Kapu1178: + - bugfix: Storage objects no longer infinitely add action buttons. + - bugfix: Some text effects scale with font size. diff --git a/html/changelogs/archive/2024-03.yml b/html/changelogs/archive/2024-03.yml new file mode 100644 index 000000000000..43ec9905acbc --- /dev/null +++ b/html/changelogs/archive/2024-03.yml @@ -0,0 +1,109 @@ +2024-03-01: + pitaden: + - bugfix: plasma sprites now change with stack size +2024-03-03: + Kapu1178: + - rscadd: ALL reagents now have a codex entry + - balance: Changed plasma vaporization temperature from 323K to 519K (Plasma will + ignite at this temperature!) + - balance: Reduced heat produced by Dexalin reaction. + - bugfix: Codex searches prioritize results where the query was found in the name + again. + - qol: Improved readability of reagent codex entries with multiple reactions. + - qol: Added plasma ignition temperature to the codex. + - rscadd: Engineers start with insulated gloves. + - rscadd: You can now click-drag items on tables to shuffles them around. + - rscadd: Added many new codex entries. + - tweak: Cleaned up a ton of examine text to remove meta information. + - tweak: Extinguisher cabinets can now be opened/closed with right click, in addition + to alt click. + - balance: Crowbars are now normal sized objects (up from small). + - bugfix: Vox players with Leg Scutes no longer crash the server. + pitaden: + - qol: reactions in the codex now show if they're exothermic/endothermic +2024-03-05: + Kapu1178: + - rscadd: Items now autogenerate codex information. + - qol: Improved grammar of examine text. + - bugfix: Admins can use equip outfit on IPCs. + - bugfix: Vox blood, like, works. + - bugfix: Retract Skin surgery works correctly on heads. + - qol: Brain Revival surgery can now be done with most reagent containers, and only + requires 5 units. + - qol: Stripping is now able to be performed any time, unless you are in an aggressive + grab and dont have combat mode turned on. In this case, you will attempt a fireman + carry. + - bugfix: Tables function correctly again. Notably, operating tables will turn off + their vitals monitor if the patient leaves the table. + - balance: Nicotine addiction builds 50% as fast as it used to. + - balance: Many objects that were previously borderline indestructible to players + are now destructible. Most notably, Airlocks and Firedoors can now be destroyed + with weapons as strong as a wrench. It will take a while though. + - balance: Firedoor health reduced substantially. + - rscadd: You can now shimmy through airlock assemblies by clicking on them with + an empty hand. +2024-03-06: + Kapu1178: + - bugfix: Addictive reagents scale with the amount of reagent consumed properly. + - bugfix: IPCs can no longer get addicted to substances. + - bugfix: Rescaled alcohol effects +2024-03-12: + Kapu1178: + - bugfix: Neck-level grabs correctly move the victim. + - bugfix: You can no longer move neck-level grab victims off your tile. + - bugfix: Mobs buckled to a grabbed object now inherit the offset + - qol: Cleaned up how repositioning grabbed movables works. + - bugfix: Two-handed items function better. + - bugfix: Fixed a sound not playing from fabricators. + - bugfix: Cleanbots no longer get stuck spraying acid on specific blood decals. + - bugfix: The monochrome ghost vision pref actually works (lol). +2024-03-13: + Kapu1178: + - bugfix: Handcuffs no longer immobilize you. +2024-03-18: + Kapu1178: + - bugfix: Greatly improved functionality of MODsuit 'Pathfinder' module, renamed + to Recall module. + - bugfix: Attacking with an item will no longer always hit the chest. + - tweak: Roundstart wallets start open + - bugfix: SecHUDs correctly display jobs again. +2024-03-23: + Kapu1178: + - bugfix: Welding goggles' nearsight effect no longer gets stuck. + - bugfix: AI-controlled mobs will now exclude abstract objects from their search + pools. + - bugfix: When you examine an object, mobs that cannot see the object you examined + see a different message. + - rscadd: When you examine an object you're wearing, nearby mobs are told that item + is yours. + - rscadd: When you examine an object inside of a storage container, nearby mobs + are told you examined something inside of the storage container, but are not + told what. + - balance: Pain is now tied to wounds, healing wounds will heal any non-temporary + pain. + - balance: Increased potency of morphine's painkiller effect. + - bugfix: Removed the old damage-based slowdown, it's now purely pain based + - bugfix: Re-added Burn damage causing internal organ damage. The removal of this + made it so burn damage wasn't lethal, even in obscene amounts. + - balance: 'Brainloss-induced knockout no longer stacks. It''s now spurts of unconsciousness. + (Note: This is not the case for knockout caused by having no oxygen in the brain)' + - balance: Added a grace period to hearts after a resuscitation, a heart now has + a 10 second window where it will not be stopped by arrhythmia (the heart pumping + too hard as a result of poor oxygenation). + - balance: Increased the grace period for shock-induced fibrillation after resuscitation + from ~20 ticks to ~25 ticks. + - balance: Increased the oxyloss recovery caused by a defibrillator, effectively + extending the time to stabilize a patient after restarting their heart. + - bugfix: Germs actually increase, meaning infection can occur properly. +2024-03-27: + Kapu1178, timothymtorres: + - qol: Greatly improved sign language. It is now it's own language. + - rscdel: Radio signing gloves. +2024-03-28: + Kapu1178: + - tweak: Restyled UI buttons. +2024-03-31: + Kapu1178: + - tweak: Renamed Quirks to Traits. + - rscdel: Removed several Traits. + - balance: Medicine Allergy bane is now only 1 reagent instead of 5. diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml new file mode 100644 index 000000000000..1fa55f660965 --- /dev/null +++ b/html/changelogs/archive/2024-04.yml @@ -0,0 +1,35 @@ +2024-04-05: + francinum: + - bugfix: Updates webmap url +2024-04-12: + Kapu1178: + - bugfix: AO overlays no longer get stuck when turfs change. This was most obvious + with the stellar body magnet. +2024-04-14: + Kapu1178: + - bugfix: Security armor is armor again. +2024-04-15: + Kapu1178: + - bugfix: Heterochromia works again. + - bugfix: The "Fingerprints" field of ID cards now uses the correct value. +2024-04-20: + Kapu1178: + - rscadd: Gamemodes are back! + - rscdel: Dynamic has been disabled. + - rscdel: Removed all ghost roles. +2024-04-22: + Kapu1178: + - rscadd: Multi-Z now supports things such as med huds and antag huds + - rscadd: Alot of animations now play across Z levels + - bugfix: Progress bars show up again. +2024-04-23: + Kapu1178, PowerfulBacon: + - bugfix: Papercode featureset + - rscadd: Paper now has a help tab. + Lohikar, LemonInTheDark, TemporalOroboros, Kapu1178: + - refactor: Rewrote explosions + - refactor: Smoke and Foam now use a light fluid sim to spread. +2024-04-29: + ToasterBan: + - rscadd: Added bay-style engraving, a wall or floor can be engraved with any sharp + object diff --git a/html/changelogs/archive/2024-05.yml b/html/changelogs/archive/2024-05.yml new file mode 100644 index 000000000000..a3c9f3e5a81e --- /dev/null +++ b/html/changelogs/archive/2024-05.yml @@ -0,0 +1,27 @@ +2024-05-08: + Kapu1178: + - bugfix: Special items like the representation of grabbing can no longer be put + into your pocket. +2024-05-15: + Kapu1178: + - bugfix: Fix massive amount of runtimes thrown from mouse dragging out of the mouse + pane. + - bugfix: Fixed "safe" gibbing attempting to remove bodyparts and organs. + francinum: + - bugfix: Cables now consider all neighbors that share diagonal-edge nodes, instead + of just one inline tile. +2024-05-20: + Kapu1178: + - code_imp: Optimized the process of loading space turfs. + - rscadd: Unverified accounts are no longer instantly kicked, and now sit on the + main menu. + - tweak: Improved the S O U L menu. +2024-05-21: + Kapu1178: + - bugfix: With a specific amount of reagents, a reaction could fail to occur and + repeat infinitely. +2024-05-25: + GPeckman: + - bugfix: Fixed a bug that could cause fire overlays to stick forever. + vinylspiders: + - bugfix: A rare bug that caused mutation effects to linger in weird ways. diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml new file mode 100644 index 000000000000..cf3d74872b13 --- /dev/null +++ b/html/changelogs/archive/2024-06.yml @@ -0,0 +1,117 @@ +2024-06-02: + SyncIt21: + - bugfix: Pyrosium now reacts on creation. +2024-06-03: + jlsnow301: + - bugfix: Chat settings should no longer bluescreen +2024-06-05: + jlsnow301, Kapu1178: + - code_imp: Added DMIcon component for TGUI, a clean way to embed RSC icons. + - tweak: Vending machines now use DMIcon, which will be less accurate but much faster. +2024-06-06: + jlsnow301: + - bugfix: Fixed a bluescreen in tgui kitchensink (dev tool) +2024-06-08: + /vg/station coders, Kapu1178: + - rscadd: Replaced all of the decorative "station map" objects with functioning + map viewing monitors that display a miniature version of the map. + Kapu1178: + - bugfix: Fixed space being 180 kelvin instead of 2.7 kelvin. + jlsnow301: + - bugfix: Fixed scrollbars on NTOS windows +2024-06-09: + Kapu1178: + - bugfix: The "skipped X seconds of silence" message no longer states 10x the duration + skipped. + - rscadd: Scaled the amount of time it takes to skip silence in tapes slightly. + - bugfix: Holomaps are actually visible. + - bugfix: West and South facing holomaps are emissive. +2024-06-10: + Kapu1178: + - rscadd: Added Honkertron, a russian developer, to the list of the deceased devs + in the credits. +2024-06-11: + Kapu1178: + - bugfix: Clicking your inactive hand slot while holding an item in your active + hand slot no longer outputs "You are unable to equip that!" + jlsnow301: + - bugfix: Ampcheck UI should work again +2024-06-12: + Kapu1178: + - bugfix: You can no longer observe yourself. + - bugfix: Observing no longer causes ambience runtimes. + - rscdel: Internals tanks no longer automatically get set to the optimal value. + - rscadd: You can now examine the items worn or held by someone. + Ryan180602: + - imageadd: beagle mug +2024-06-17: + Baystation12 Coders: + - soundadd: Lockers have a new open/close sound. + - soundadd: Backpacks have a new open sound. + - soundadd: Medkits have a new open sound. + - soundadd: Cigarette cartons have a new open sound. + - bugfix: Inserting an item into a storage container no longer plays its drop-to-floor + sound. + - balance: You can no longer manipulate items within a storage container that is + inside another storage container. + Kapu1178: + - bugfix: Brain damage correctly updates health. It is unlikely this actually caused + any bugs, but better safe than sorry. + - bugfix: Dead and Unconscious mobs won't broadcast their examine. + - bugfix: Mobs now enter cardiac arrest when in the maximum shock stage. + francinum: + - code_imp: OpenDream is now used in linting. You do not care. Know that we are + one step closer to luxury gay space communism. + - refactor: Codex entry searching has been outsourced to a local database. This + results in outright comical efficiency and speed gains. + - code_imp: This is disabled by default on development servers, as it introduces + extra initialization time. An override compile flag is available. +2024-06-18: + Kapu1178, Ghommie, Vinylspiders, Mothblocks: + - qol: Catwalk floors now display the turf under them. Because they aren't turfs + anymore. +2024-06-19: + BarteG44: + - qol: Makes the ATM put IDs directly into your hand when you eject them. +2024-06-25: + jlsnow301: + - bugfix: Fixed the keybindings UI. You should be able to reassign properly now. +2024-06-26: + BarteG44: + - rscadd: Adds the crime scene kit to the forensics crate. + Kapu1178: + - rscadd: Species with clawed feet play the claw footstep sounds when barefoot. + - rscadd: Walking now produces footstep sounds, but quieter. + - tweak: Adjusted the sound environment parameters of most of the station. + - qol: Added "Mutadone" as a search term for Ryetalyn. + - rscdel: Removed Spatial Instability mutation. + - bugfix: Fixed cases where weather effects wouldn't go away until you walked into + them. +2024-06-27: + Kapu1178: + - bugfix: Bloom renders properly + Kapu1178, SyncIt21: + - balance: Hydroponics trays now hold water significantly longer. + - qol: Many actions are safer from specific edge cases. You won't notice a difference. +2024-06-28: + LemonInTheDark, Kapu1178: + - refactor: Refactored pathfinding code to be cleaner. + - tweak: Bots will no longer take diagonal paths, which looked weird. + jlsnow301: + - bugfix: The power monitor UI has been changed slightly to give a better UX. You + can scroll without losing your place, there's a loading screen, etc. +2024-06-30: + Kapu1178, MrMelbert: + - bugfix: You can no longer infinitely spread blood to turfs. + - bugfix: Bloody hands are blood colored and not white. + - bugfix: Surgery bloodies only the gloves of the surgeon. + - bugfix: Wearing gloves correctly prevents disease spread during surgery. + - bugfix: Grabs should now properly release... more often. + - qol: Surgery attempts will now fail the moment they become impossible, not after + the do_after(). + - qol: More surgeries provide more detailed feedback when a surgery is not a valid + option. + - rscadd: Improved the logic for getting clothes bloody. + - rscadd: Grabs now spread blood. + jlsnow301: + - bugfix: Fixed the pandemic UI bluescreening on beaker insert diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml new file mode 100644 index 000000000000..b7479bbb509e --- /dev/null +++ b/html/changelogs/archive/2024-07.yml @@ -0,0 +1,29 @@ +2024-07-01: + Kapu1178: + - rscadd: Added an Advanced mode to cable coil, enabling the BEST cable placing + experience in the known universe. Right Click the floor while holding cable + coil to toggle. +2024-07-08: + Kapu1178: + - bugfix: Splitting a stack no longer causes the new stack to have no materials. + ToasterBan: + - bugfix: You can now place down catwalks again +2024-07-12: + Kapu1178: + - balance: Haloperidol's residual sleeping effect has been capped at 3 minutes. + - balance: Haloperidol is 20% as effective to sleeping targets. + - bugfix: Catwalks are now anchored. +2024-07-20: + Kapu1178: + - bugfix: Field of View is ACTUALLY black. +2024-07-23: + Kapu1178: + - bugfix: You no longer receive temperature flavortext while dead. + - bugfix: The Medical Director now has Robotics access + - bugfix: General Practitioners now have Robotics access during skeleton crew. + - balance: Jetpacks no longer provide a massive movespeed boost. + - bugfix: Deaf players can no longer hear ambience. +2024-07-31: + Kapu1178: + - bugfix: O Positive and O Negative blood types are no longer named "AB+" and "AB-" + respectively. diff --git a/html/changelogs/archive/2024-08.yml b/html/changelogs/archive/2024-08.yml new file mode 100644 index 000000000000..3c6ac77afbba --- /dev/null +++ b/html/changelogs/archive/2024-08.yml @@ -0,0 +1,61 @@ +2024-08-01: + francinum: + - bugfix: Removed the random wall in Dorms/Recreation +2024-08-03: + Kapu1178: + - bugfix: Fixed an issue with some UI buttons where they would not trigger onClick + actions due to a byond bug. + SmArtkar: + - bugfix: Fixed an issue with moveloops. +2024-08-06: + Kapu1178: + - qol: Improved ID rendering +2024-08-08: + Kapu1178: + - bugfix: You can tell if someone is dead if you are within 1 tile of them. + - balance: The Haloperidol rounds in the safari rifle have been swapped for Ryetalyn + rounds. + - tweak: Labcoats no longer hold syringe guns. +2024-08-10: + ToasterBan: + - rscadd: the swag set, rollerblades, skateboards, wheelys and delinquent hat to + the loadout shop +2024-08-11: + francinum: + - bugfix: Connector port in botany maint storage closet is now on the right layer + - bugfix: Central Medbay now has an air alarm + - bugfix: You can no longer sneak into medbay with maint access via robotics maintenance. +2024-08-14: + ToasterBan: + - rscadd: Skill debuffs to drug withdrawals + - rscadd: Handicraft skill boost due to nicotine (Daedalus Dock does not promote + nicotine usage but it does not deny how cool and radical it is) + - tweak: using a cheap lighter is now a handicraft check rather than pure RNG + - tweak: the description of the handicraft skill has been changed +2024-08-16: + Kapu1178: + - balance: Disposals damage has been HEAVVVVVVVVVVVVVIIILLLLLLLLYYYYYY reduced. + - qol: Mobs in disposals will now cause loud banging to occur as they travel down + and get hurt. + - qol: You can now use the disposals UI from within the bin. + - tweak: Adjusted the text styling of Hearing. + - bugfix: A stomach that dies now properly removes drug effects from drugs present + inside. + - bugfix: IPCs don't process reagents. + - bugfix: Not having a liver no longer somewhat breaks your bloodstream. + ShadowLarkens: + - bugfix: Fixed action buttons relative to EAST,SOUTH, or CENTER being improperly + moved during view_audit_buttons() + francinum: + - bugfix: Fixes various minor map issues + - balance: The Atmospheric SMES unit starts with input and output on. +2024-08-17: + Spyroshark: + - bugfix: You can now properly set your job title back to Clown. +2024-08-19: + LemonInTheDark: + - refactor: Fucks with how movement keys are handled. Please report any bugs + SmArtKar: + - qol: You no longer goofily swap with others trying to move in the same direction + as you if you're not faster than them + - code_imp: Moved mobswap check logic into a separate proc and made it more readable diff --git a/html/changelogs/blob-70097.yml b/html/changelogs/blob-70097.yml deleted file mode 100644 index a405b60be99f..000000000000 --- a/html/changelogs/blob-70097.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VexingRaven" -delete-after: True -changes: - - bugfix: "Multi-Z Ruins work again (Ice Moon Mining Site spawns again with the Demonic Frost Miner)" diff --git a/html/changelogs/blob-70431.yml b/html/changelogs/blob-70431.yml deleted file mode 100644 index 6c867c272f28..000000000000 --- a/html/changelogs/blob-70431.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Jacquerel" -delete-after: True -changes: - - bugfix: "Changing z-level while jaunting will no longer reveal you." - - bugfix: "If a shuttle lands on you while jaunting you will die rather than be stuck in a weird purgatory state." - - bugfix: "Mirror Walk will not appear tinted as if it can be cast when it can't, and vice versa." - - qol: "Blood Crawl and Shadow Walk will now display whether you can use them or not in the same manner as Mirror Walk." - - refactor: "Jaunt code which adds and removes temporary traits or effects should hopefully be easier to work with in the future." diff --git a/html/changelogs/blob-71171.yml b/html/changelogs/blob-71171.yml deleted file mode 100644 index 93da0e569d43..000000000000 --- a/html/changelogs/blob-71171.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "VexingRaven" -delete-after: True -changes: - - bugfix: "Soul Scythes can no longer phase through the floor into Centcom." diff --git a/html/statbrowser.css b/html/statbrowser.css index dc693f42f756..3f28920c4c1a 100644 --- a/html/statbrowser.css +++ b/html/statbrowser.css @@ -1,3 +1,8 @@ +* +{ + cursor: url("default.cur"), auto !important; +} + body { font-family: Verdana, Geneva, Tahoma, sans-serif; font-size: 12px !important; @@ -27,7 +32,7 @@ body.dark { } .dark #menu { - background-color: #202020; + background-color: #222020; } #statcontent { @@ -46,6 +51,7 @@ a { a:hover, .dark a:hover { text-decoration: underline; + cursor: url("link_select.cur"), pointer; } ul { @@ -91,7 +97,7 @@ li a:hover:not(.active) { text-decoration: none; font-size: 12px; margin: 0; - cursor: pointer; + cursor: url("link_select.cur"), pointer; transition-duration: 100ms; order: 3; min-width: 40px; @@ -178,6 +184,7 @@ li a:hover:not(.active) { .grid-item:hover .grid-item-text { width: auto; text-decoration: underline; + cursor: url("link_select.cur"), pointer; } .grid-item-text { @@ -203,7 +210,7 @@ li a:hover:not(.active) { padding: 7px 14px; color: black; text-decoration: none; - cursor: pointer; + cursor: url("link_select.cur"), pointer; font-size: 13px; margin: 2px 2px; } @@ -214,6 +221,7 @@ li a:hover:not(.active) { .link:hover { text-decoration: underline; + cursor: url("link_select.cur"), pointer; } img { diff --git a/icons/area/areas_misc.dmi b/icons/area/areas_misc.dmi index 8e4b8a3803e1..ca5848167f62 100644 Binary files a/icons/area/areas_misc.dmi and b/icons/area/areas_misc.dmi differ diff --git a/icons/area/areas_station.dmi b/icons/area/areas_station.dmi index 93c789678007..4e7099627800 100644 Binary files a/icons/area/areas_station.dmi and b/icons/area/areas_station.dmi differ diff --git a/icons/blanks/480x480.dmi b/icons/blanks/480x480.dmi new file mode 100644 index 000000000000..3f006394a151 Binary files /dev/null and b/icons/blanks/480x480.dmi differ diff --git a/icons/credits/2bell.png b/icons/credits/2bell.png new file mode 100644 index 000000000000..a6249b22a64f Binary files /dev/null and b/icons/credits/2bell.png differ diff --git a/icons/credits/2cluck.png b/icons/credits/2cluck.png deleted file mode 100644 index 534eff201cb0..000000000000 Binary files a/icons/credits/2cluck.png and /dev/null differ diff --git a/icons/effects/aim.dmi b/icons/effects/aim.dmi new file mode 100644 index 000000000000..507d4d1d3df7 Binary files /dev/null and b/icons/effects/aim.dmi differ diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index 8ba3c28df9d4..018fe410bb1f 100644 Binary files a/icons/effects/blood.dmi and b/icons/effects/blood.dmi differ diff --git a/icons/effects/drip.dmi b/icons/effects/drip.dmi new file mode 100644 index 000000000000..a756bc10f87d Binary files /dev/null and b/icons/effects/drip.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index bec2d6e7c89f..bf3c8abec96a 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi index a98344abe41e..810c17da40ee 100644 Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ diff --git a/icons/effects/glow_weather.dmi b/icons/effects/glow_weather.dmi new file mode 100644 index 000000000000..021da02fe37b Binary files /dev/null and b/icons/effects/glow_weather.dmi differ diff --git a/icons/effects/landmarks_static.dmi b/icons/effects/landmarks_static.dmi index d6a26b050d59..892822543c7b 100644 Binary files a/icons/effects/landmarks_static.dmi and b/icons/effects/landmarks_static.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index b62927c2ddfb..9726adf4b7df 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/mouse_pointers/default.dmi b/icons/effects/mouse_pointers/default.dmi new file mode 100644 index 000000000000..8fc319ec0d6c Binary files /dev/null and b/icons/effects/mouse_pointers/default.dmi differ diff --git a/icons/effects/mouse_pointers/interact.dmi b/icons/effects/mouse_pointers/interact.dmi new file mode 100644 index 000000000000..d1d23ddf9c5e Binary files /dev/null and b/icons/effects/mouse_pointers/interact.dmi differ diff --git a/icons/effects/paint_helpers.dmi b/icons/effects/paint_helpers.dmi index c1733a834f3b..b1a189e96163 100644 Binary files a/icons/effects/paint_helpers.dmi and b/icons/effects/paint_helpers.dmi differ diff --git a/icons/effects/particles/generic.dmi b/icons/effects/particles/generic.dmi new file mode 100644 index 000000000000..c7b1d48899a6 Binary files /dev/null and b/icons/effects/particles/generic.dmi differ diff --git a/icons/effects/shockwave.dmi b/icons/effects/shockwave.dmi new file mode 100644 index 000000000000..c22acfa1d59e Binary files /dev/null and b/icons/effects/shockwave.dmi differ diff --git a/icons/effects/simplified_wall_helpers.dmi b/icons/effects/simplified_wall_helpers.dmi new file mode 100644 index 000000000000..3c3f9040c25b Binary files /dev/null and b/icons/effects/simplified_wall_helpers.dmi differ diff --git a/icons/effects/writing.dmi b/icons/effects/writing.dmi new file mode 100644 index 000000000000..9190eca516e2 Binary files /dev/null and b/icons/effects/writing.dmi differ diff --git a/icons/holomap_z2.png b/icons/holomap_z2.png new file mode 100644 index 000000000000..960d7296877a Binary files /dev/null and b/icons/holomap_z2.png differ diff --git a/icons/hud/do_after.dmi b/icons/hud/do_after.dmi index e6fd53895331..49b9fb0a0ab8 100644 Binary files a/icons/hud/do_after.dmi and b/icons/hud/do_after.dmi differ diff --git a/icons/hud/holomap/holomap_480x480.dmi b/icons/hud/holomap/holomap_480x480.dmi new file mode 100644 index 000000000000..ca6fd340f909 Binary files /dev/null and b/icons/hud/holomap/holomap_480x480.dmi differ diff --git a/icons/hud/holomap/holomap_64x64.dmi b/icons/hud/holomap/holomap_64x64.dmi new file mode 100644 index 000000000000..3a5b74fff3e7 Binary files /dev/null and b/icons/hud/holomap/holomap_64x64.dmi differ diff --git a/icons/hud/holomap/holomap_markers.dmi b/icons/hud/holomap/holomap_markers.dmi new file mode 100644 index 000000000000..59ae14918597 Binary files /dev/null and b/icons/hud/holomap/holomap_markers.dmi differ diff --git a/icons/hud/noimg.dmi b/icons/hud/noimg.dmi new file mode 100644 index 000000000000..bc74771b17fb Binary files /dev/null and b/icons/hud/noimg.dmi differ diff --git a/icons/hud/screen1.dmi b/icons/hud/screen1.dmi new file mode 100644 index 000000000000..7f8db4256da5 Binary files /dev/null and b/icons/hud/screen1.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index 66c2b361e338..d69901598770 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/hud/screen_alerts.dmi b/icons/hud/screen_alerts.dmi new file mode 100644 index 000000000000..3bca758c1c5a Binary files /dev/null and b/icons/hud/screen_alerts.dmi differ diff --git a/icons/hud/screen_clockwork.dmi b/icons/hud/screen_clockwork.dmi index 5d92964abebd..c7233f91fde9 100644 Binary files a/icons/hud/screen_clockwork.dmi and b/icons/hud/screen_clockwork.dmi differ diff --git a/icons/hud/screen_full.dmi b/icons/hud/screen_full.dmi index 1e2a42b98e06..84cbae4871e9 100644 Binary files a/icons/hud/screen_full.dmi and b/icons/hud/screen_full.dmi differ diff --git a/icons/hud/screen_gen.dmi b/icons/hud/screen_gen.dmi index 42bbf8778087..7127ef8d2309 100644 Binary files a/icons/hud/screen_gen.dmi and b/icons/hud/screen_gen.dmi differ diff --git a/icons/hud/screen_glass.dmi b/icons/hud/screen_glass.dmi index ac8ba86d3c3c..368c1dd3c5b2 100644 Binary files a/icons/hud/screen_glass.dmi and b/icons/hud/screen_glass.dmi differ diff --git a/icons/hud/screen_midnight.dmi b/icons/hud/screen_midnight.dmi index a632ec803bc8..80103f6d41e8 100644 Binary files a/icons/hud/screen_midnight.dmi and b/icons/hud/screen_midnight.dmi differ diff --git a/icons/hud/screen_operative.dmi b/icons/hud/screen_operative.dmi index ed89b28a1a33..722ec222585a 100644 Binary files a/icons/hud/screen_operative.dmi and b/icons/hud/screen_operative.dmi differ diff --git a/icons/hud/screen_plasmafire.dmi b/icons/hud/screen_plasmafire.dmi index f8d667e6a479..e81edece8890 100644 Binary files a/icons/hud/screen_plasmafire.dmi and b/icons/hud/screen_plasmafire.dmi differ diff --git a/icons/hud/screen_retro.dmi b/icons/hud/screen_retro.dmi index ac1b121b7e06..16a8f645c360 100644 Binary files a/icons/hud/screen_retro.dmi and b/icons/hud/screen_retro.dmi differ diff --git a/icons/hud/screen_slimecore.dmi b/icons/hud/screen_slimecore.dmi index e7cf6320520e..57660f9006b8 100644 Binary files a/icons/hud/screen_slimecore.dmi and b/icons/hud/screen_slimecore.dmi differ diff --git a/icons/misc/480x480.dmi b/icons/misc/480x480.dmi new file mode 100644 index 000000000000..4d8302bd1bf0 Binary files /dev/null and b/icons/misc/480x480.dmi differ diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index da99c31cef58..fc393e41c11a 100644 Binary files a/icons/misc/language.dmi and b/icons/misc/language.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index e95e21747221..7c72169341ff 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/appearancemods/vox_scutes.dmi b/icons/mob/appearancemods/vox_scutes.dmi new file mode 100644 index 000000000000..c97e905c50c3 Binary files /dev/null and b/icons/mob/appearancemods/vox_scutes.dmi differ diff --git a/icons/mob/augmentation/bs2ipc.dmi b/icons/mob/augmentation/bs2ipc.dmi new file mode 100644 index 000000000000..3c25aa6aa300 Binary files /dev/null and b/icons/mob/augmentation/bs2ipc.dmi differ diff --git a/icons/mob/augmentation/bshipc.dmi b/icons/mob/augmentation/bshipc.dmi new file mode 100644 index 000000000000..8eb7a2668fa6 Binary files /dev/null and b/icons/mob/augmentation/bshipc.dmi differ diff --git a/icons/mob/augmentation/hi2ipc.dmi b/icons/mob/augmentation/hi2ipc.dmi new file mode 100644 index 000000000000..067f217aee9a Binary files /dev/null and b/icons/mob/augmentation/hi2ipc.dmi differ diff --git a/icons/mob/augmentation/hsiipc.dmi b/icons/mob/augmentation/hsiipc.dmi new file mode 100644 index 000000000000..a15c7b94e24c Binary files /dev/null and b/icons/mob/augmentation/hsiipc.dmi differ diff --git a/icons/mob/augmentation/mcgipc.dmi b/icons/mob/augmentation/mcgipc.dmi new file mode 100644 index 000000000000..63b79807d9ed Binary files /dev/null and b/icons/mob/augmentation/mcgipc.dmi differ diff --git a/icons/mob/augmentation/sgmipc.dmi b/icons/mob/augmentation/sgmipc.dmi new file mode 100644 index 000000000000..82d35d770905 Binary files /dev/null and b/icons/mob/augmentation/sgmipc.dmi differ diff --git a/icons/mob/augmentation/surplus_augments.dmi b/icons/mob/augmentation/surplus_augments.dmi index 0fafab053369..1137a8f095b5 100644 Binary files a/icons/mob/augmentation/surplus_augments.dmi and b/icons/mob/augmentation/surplus_augments.dmi differ diff --git a/icons/mob/augmentation/wtmipc.dmi b/icons/mob/augmentation/wtmipc.dmi new file mode 100644 index 000000000000..eb8bf8e727a2 Binary files /dev/null and b/icons/mob/augmentation/wtmipc.dmi differ diff --git a/icons/mob/augmentation/xm2ipc.dmi b/icons/mob/augmentation/xm2ipc.dmi new file mode 100644 index 000000000000..3be3166a846b Binary files /dev/null and b/icons/mob/augmentation/xm2ipc.dmi differ diff --git a/icons/mob/augmentation/xmgipc.dmi b/icons/mob/augmentation/xmgipc.dmi new file mode 100644 index 000000000000..20e94250dd64 Binary files /dev/null and b/icons/mob/augmentation/xmgipc.dmi differ diff --git a/icons/mob/augmentation/zhpipc.dmi b/icons/mob/augmentation/zhpipc.dmi new file mode 100644 index 000000000000..327f0145fe57 Binary files /dev/null and b/icons/mob/augmentation/zhpipc.dmi differ diff --git a/icons/mob/autogen_landmarks.dmi b/icons/mob/autogen_landmarks.dmi new file mode 100644 index 000000000000..e2fb9ecd00d8 Binary files /dev/null and b/icons/mob/autogen_landmarks.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index 8c4049d01879..b0b4773d3a2a 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/hardsuit/hardsuit_body.dmi b/icons/mob/clothing/hardsuit/hardsuit_body.dmi new file mode 100644 index 000000000000..23851baead1d Binary files /dev/null and b/icons/mob/clothing/hardsuit/hardsuit_body.dmi differ diff --git a/icons/mob/clothing/hardsuit/hardsuit_helm.dmi b/icons/mob/clothing/hardsuit/hardsuit_helm.dmi new file mode 100644 index 000000000000..06b8ee2be81e Binary files /dev/null and b/icons/mob/clothing/hardsuit/hardsuit_helm.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index 197d6b4d9d27..3bff5c167f35 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index bc72df75a724..a479452e92ce 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/clothing/species/teshari/head.dmi b/icons/mob/clothing/species/teshari/head.dmi index 823e0a7df475..50ccc5ca6c0c 100644 Binary files a/icons/mob/clothing/species/teshari/head.dmi and b/icons/mob/clothing/species/teshari/head.dmi differ diff --git a/icons/mob/clothing/species/teshari/suit.dmi b/icons/mob/clothing/species/teshari/suit.dmi index 4f54e16b6ce8..47cec003ee15 100644 Binary files a/icons/mob/clothing/species/teshari/suit.dmi and b/icons/mob/clothing/species/teshari/suit.dmi differ diff --git a/icons/mob/clothing/species/vox/suit.dmi b/icons/mob/clothing/species/vox/suit.dmi index 4666d302a74c..ae91b006c3e2 100644 Binary files a/icons/mob/clothing/species/vox/suit.dmi and b/icons/mob/clothing/species/vox/suit.dmi differ diff --git a/icons/mob/clothing/species/vox/uniform.dmi b/icons/mob/clothing/species/vox/uniform.dmi index 498e8e2028db..08e4dc50b33e 100644 Binary files a/icons/mob/clothing/species/vox/uniform.dmi and b/icons/mob/clothing/species/vox/uniform.dmi differ diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi index e86495fdc8e6..28979e2b1ee9 100644 Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ diff --git a/icons/mob/clothing/under/security.dmi b/icons/mob/clothing/under/security.dmi index 3c0abb1ce8f5..04b350a494cf 100644 Binary files a/icons/mob/clothing/under/security.dmi and b/icons/mob/clothing/under/security.dmi differ diff --git a/icons/mob/dam_mob.dmi b/icons/mob/dam_mob.dmi deleted file mode 100644 index fe92746b43ec..000000000000 Binary files a/icons/mob/dam_mob.dmi and /dev/null differ diff --git a/icons/mob/huds/med_hud.dmi b/icons/mob/huds/med_hud.dmi new file mode 100644 index 000000000000..705886a5490f Binary files /dev/null and b/icons/mob/huds/med_hud.dmi differ diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi index 742b676e3725..1bd74b9c27e4 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/equipment/security_lefthand.dmi b/icons/mob/inhands/equipment/security_lefthand.dmi index 0acc816664d2..61763725049d 100644 Binary files a/icons/mob/inhands/equipment/security_lefthand.dmi and b/icons/mob/inhands/equipment/security_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/security_righthand.dmi b/icons/mob/inhands/equipment/security_righthand.dmi index 351c1b38c5be..e23b9723c2e3 100644 Binary files a/icons/mob/inhands/equipment/security_righthand.dmi and b/icons/mob/inhands/equipment/security_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 9f1e81d550e0..51015e4ab844 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 d1343f770001..dc3c56a86804 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index fe8c2e7a7e3b..ea3abef2d274 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 c6614031c7db..1ed1ef1265d5 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 deleted file mode 100644 index 8836f40e8cee..000000000000 Binary files a/icons/mob/landmarks.dmi and /dev/null differ diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi index d86e51bae0f7..dd3a55467798 100644 Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ diff --git a/icons/mob/species/human/damage.dmi b/icons/mob/species/human/damage.dmi new file mode 100644 index 000000000000..2701da0c4c45 Binary files /dev/null and b/icons/mob/species/human/damage.dmi differ diff --git a/icons/mob/species/ipc/accessories.dmi b/icons/mob/species/ipc/accessories.dmi new file mode 100644 index 000000000000..5a75ffaa60d3 Binary files /dev/null and b/icons/mob/species/ipc/accessories.dmi differ diff --git a/icons/mob/species/ipc/bodyparts.dmi b/icons/mob/species/ipc/bodyparts.dmi new file mode 100644 index 000000000000..f1158208152f Binary files /dev/null and b/icons/mob/species/ipc/bodyparts.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_antennas.dmi b/icons/mob/species/ipc/saurian/saurian_antennas.dmi new file mode 100644 index 000000000000..cfde178d0cf2 Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_antennas.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_bodyparts.dmi b/icons/mob/species/ipc/saurian/saurian_bodyparts.dmi new file mode 100644 index 000000000000..10bf58aa7775 Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_bodyparts.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_lights.dmi b/icons/mob/species/ipc/saurian/saurian_lights.dmi new file mode 100644 index 000000000000..a72a2cc603c0 Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_lights.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_scutes.dmi b/icons/mob/species/ipc/saurian/saurian_scutes.dmi new file mode 100644 index 000000000000..5aa4cf37b974 Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_scutes.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_snouts.dmi b/icons/mob/species/ipc/saurian/saurian_snouts.dmi new file mode 100644 index 000000000000..2f03246f2e43 Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_snouts.dmi differ diff --git a/icons/mob/species/ipc/saurian/saurian_tails.dmi b/icons/mob/species/ipc/saurian/saurian_tails.dmi new file mode 100644 index 000000000000..e837b073533e Binary files /dev/null and b/icons/mob/species/ipc/saurian/saurian_tails.dmi differ diff --git a/icons/mob/species/misc/robotic_damage.dmi b/icons/mob/species/misc/robotic_damage.dmi new file mode 100644 index 000000000000..6af514da278c Binary files /dev/null and b/icons/mob/species/misc/robotic_damage.dmi differ diff --git a/icons/mob/species/monkey/damage.dmi b/icons/mob/species/monkey/damage.dmi new file mode 100644 index 000000000000..584911345795 Binary files /dev/null and b/icons/mob/species/monkey/damage.dmi differ diff --git a/icons/mob/species/skrell/bodyparts.dmi b/icons/mob/species/skrell/bodyparts.dmi deleted file mode 100644 index 7b3972abf3fb..000000000000 Binary files a/icons/mob/species/skrell/bodyparts.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/eyes.dmi b/icons/mob/species/skrell/eyes.dmi deleted file mode 100644 index 58cd0d648a51..000000000000 Binary files a/icons/mob/species/skrell/eyes.dmi and /dev/null differ diff --git a/icons/mob/species/skrell/skrell_headtails.dmi b/icons/mob/species/skrell/skrell_headtails.dmi deleted file mode 100644 index 2d9941500c6b..000000000000 Binary files a/icons/mob/species/skrell/skrell_headtails.dmi and /dev/null differ diff --git a/icons/mob/species/teshari/augments.dmi b/icons/mob/species/teshari/augments.dmi new file mode 100644 index 000000000000..b0c0ce182412 Binary files /dev/null and b/icons/mob/species/teshari/augments.dmi differ diff --git a/icons/mob/species/teshari/blood_mask.dmi b/icons/mob/species/teshari/blood_mask.dmi new file mode 100644 index 000000000000..1201633b205e Binary files /dev/null and b/icons/mob/species/teshari/blood_mask.dmi differ diff --git a/icons/mob/species/teshari/blood_mask_greyscale.dmi b/icons/mob/species/teshari/blood_mask_greyscale.dmi new file mode 100644 index 000000000000..104eb8f94dd4 Binary files /dev/null and b/icons/mob/species/teshari/blood_mask_greyscale.dmi differ diff --git a/icons/mob/species/teshari/damage.dmi b/icons/mob/species/teshari/damage.dmi new file mode 100644 index 000000000000..1e987e8db2e3 Binary files /dev/null and b/icons/mob/species/teshari/damage.dmi differ diff --git a/icons/mob/species/vox/bodyparts.dmi b/icons/mob/species/vox/bodyparts.dmi index f036392f6339..0ff117392cfb 100644 Binary files a/icons/mob/species/vox/bodyparts.dmi and b/icons/mob/species/vox/bodyparts.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index b9804546f62d..1e4326560908 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index a9238cf0a52f..572f28ec6130 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index d37de9664f8a..16ca1803837e 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 80eabd9b7de5..5b5c71765d31 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 4c27004edd46..0a90f0b1a54a 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hardsuits/helmet.dmi b/icons/obj/clothing/hardsuits/helmet.dmi new file mode 100644 index 000000000000..5132e21fb006 Binary files /dev/null and b/icons/obj/clothing/hardsuits/helmet.dmi differ diff --git a/icons/obj/clothing/hardsuits/suit.dmi b/icons/obj/clothing/hardsuits/suit.dmi new file mode 100644 index 000000000000..c86f9072c170 Binary files /dev/null and b/icons/obj/clothing/hardsuits/suit.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index ae9c0e2999ab..76cee91cd86f 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 807be4f8a52f..2afd47d3a011 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 473b4569a150..9db68be8f643 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/under/security.dmi b/icons/obj/clothing/under/security.dmi index 32c2e05b26e1..7cdb9744ceac 100644 Binary files a/icons/obj/clothing/under/security.dmi and b/icons/obj/clothing/under/security.dmi differ diff --git a/icons/obj/cryogenics.dmi b/icons/obj/cryogenics.dmi index bd82d4bbacee..b96f29ceca42 100644 Binary files a/icons/obj/cryogenics.dmi and b/icons/obj/cryogenics.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 4da4913ac918..918e02175bd8 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index e5096bb9396a..4b9968123502 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/modular_pariah/modules/tableflip/icons/flipped_tables.dmi b/icons/obj/flipped_tables.dmi similarity index 100% rename from modular_pariah/modules/tableflip/icons/flipped_tables.dmi rename to icons/obj/flipped_tables.dmi diff --git a/icons/obj/forensics.dmi b/icons/obj/forensics.dmi new file mode 100644 index 000000000000..43ba2898ef7b Binary files /dev/null and b/icons/obj/forensics.dmi differ diff --git a/icons/obj/guns/ballistic.dmi b/icons/obj/guns/ballistic.dmi index 31ff256c9229..beb5b8108a18 100644 Binary files a/icons/obj/guns/ballistic.dmi and b/icons/obj/guns/ballistic.dmi differ diff --git a/icons/obj/guns/projectiles.dmi b/icons/obj/guns/projectiles.dmi index 432517ebcb61..785f8b933263 100644 Binary files a/icons/obj/guns/projectiles.dmi and b/icons/obj/guns/projectiles.dmi differ diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index aa2ae527bf00..07296430be15 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 7e06a0c851d2..df9a52b61a48 100644 Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 0f17d6bed520..d894f5bcdad1 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/icons/obj/machines/bodyscan_displays.dmi b/icons/obj/machines/bodyscan_displays.dmi new file mode 100644 index 000000000000..7dbafb35c17c Binary files /dev/null and b/icons/obj/machines/bodyscan_displays.dmi differ diff --git a/icons/obj/machines/bodyscanner.dmi b/icons/obj/machines/bodyscanner.dmi new file mode 100644 index 000000000000..24cbb810c69a Binary files /dev/null and b/icons/obj/machines/bodyscanner.dmi differ diff --git a/icons/obj/machines/forensics/dna_scanner.dmi b/icons/obj/machines/forensics/dna_scanner.dmi new file mode 100644 index 000000000000..f33e9d2988e1 Binary files /dev/null and b/icons/obj/machines/forensics/dna_scanner.dmi differ diff --git a/icons/obj/machines/forensics/microscope.dmi b/icons/obj/machines/forensics/microscope.dmi new file mode 100644 index 000000000000..41eac2676e6b Binary files /dev/null and b/icons/obj/machines/forensics/microscope.dmi differ diff --git a/icons/obj/machines/heartmonitor.dmi b/icons/obj/machines/heartmonitor.dmi new file mode 100644 index 000000000000..1717e1bd0bcf Binary files /dev/null and b/icons/obj/machines/heartmonitor.dmi differ diff --git a/icons/obj/machines/station_map.dmi b/icons/obj/machines/station_map.dmi new file mode 100644 index 000000000000..dbb7323c3902 Binary files /dev/null and b/icons/obj/machines/station_map.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 444eeea9c29c..e25bc541a82f 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/organs.dmi b/icons/obj/organs.dmi new file mode 100644 index 000000000000..895009c33471 Binary files /dev/null and b/icons/obj/organs.dmi differ diff --git a/icons/obj/plumbing/connects.dmi b/icons/obj/plumbing/connects.dmi deleted file mode 100644 index 32277ffac659..000000000000 Binary files a/icons/obj/plumbing/connects.dmi and /dev/null differ diff --git a/icons/obj/plumbing/fluid_ducts.dmi b/icons/obj/plumbing/fluid_ducts.dmi deleted file mode 100644 index d911e25b9c92..000000000000 Binary files a/icons/obj/plumbing/fluid_ducts.dmi and /dev/null differ diff --git a/icons/obj/plumbing/plumbers.dmi b/icons/obj/plumbing/plumbers.dmi deleted file mode 100644 index ea78b1357358..000000000000 Binary files a/icons/obj/plumbing/plumbers.dmi and /dev/null differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index abab765c5166..1eb7270a77e7 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/power_cond/cable.dmi b/icons/obj/power_cond/cable.dmi new file mode 100644 index 000000000000..721fca1dc688 Binary files /dev/null and b/icons/obj/power_cond/cable.dmi differ diff --git a/icons/obj/power_cond/layer_cable.dmi b/icons/obj/power_cond/layer_cable.dmi deleted file mode 100644 index 058c2f2a83b7..000000000000 Binary files a/icons/obj/power_cond/layer_cable.dmi and /dev/null differ diff --git a/icons/obj/power_cond/pipe_cleaner.dmi b/icons/obj/power_cond/pipe_cleaner.dmi deleted file mode 100644 index d5e8ce34e133..000000000000 Binary files a/icons/obj/power_cond/pipe_cleaner.dmi and /dev/null differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 49b5cd81d672..275e55e54c07 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/slapcrafting/components.dmi b/icons/obj/slapcrafting/components.dmi new file mode 100644 index 000000000000..6b9b785a8085 Binary files /dev/null and b/icons/obj/slapcrafting/components.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index 95d07d25dbcd..31a8de0fe500 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 69ee57cf706e..7fd093bd3dbe 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index bc3a2f1ba4c1..ba5c413b71e1 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 16d4adecb489..368b9c5e5b34 100755 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/terminals.dmi b/icons/obj/terminals.dmi index 7909abe0fa86..e3b4457d623d 100644 Binary files a/icons/obj/terminals.dmi and b/icons/obj/terminals.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index 1894d484a2d3..2a93b8ba0388 100644 Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ diff --git a/icons/particles/96x96.dmi b/icons/particles/96x96.dmi new file mode 100644 index 000000000000..f25fb59d26dd Binary files /dev/null and b/icons/particles/96x96.dmi differ diff --git a/icons/particles/generic.dmi b/icons/particles/generic.dmi new file mode 100644 index 000000000000..c7b1d48899a6 Binary files /dev/null and b/icons/particles/generic.dmi differ diff --git a/icons/turf/damage.dmi b/icons/turf/damage.dmi index 6e93766d1491..ff11460ab206 100644 Binary files a/icons/turf/damage.dmi and b/icons/turf/damage.dmi differ diff --git a/icons/turf/floors/catwalk_plating.dmi b/icons/turf/floors/catwalk_plating.dmi index b49c46564de5..139d192153a5 100644 Binary files a/icons/turf/floors/catwalk_plating.dmi and b/icons/turf/floors/catwalk_plating.dmi differ diff --git a/icons/turf/shadows.dmi b/icons/turf/shadows.dmi index 2db9e6a645e0..6a29fbff26f0 100644 Binary files a/icons/turf/shadows.dmi and b/icons/turf/shadows.dmi differ diff --git a/icons/turf/uncut_shadows.dmi b/icons/turf/uncut_shadows.dmi new file mode 100644 index 000000000000..765221d9c1cd Binary files /dev/null and b/icons/turf/uncut_shadows.dmi differ diff --git a/icons/turf/walls/solid_wall.dmi b/icons/turf/walls/solid_wall.dmi index cb68120cc269..881bba4bb3d1 100644 Binary files a/icons/turf/walls/solid_wall.dmi and b/icons/turf/walls/solid_wall.dmi differ diff --git a/icons/turf/wood.dmi b/icons/turf/wood.dmi new file mode 100644 index 000000000000..e0a5326a5c95 Binary files /dev/null and b/icons/turf/wood.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index 6affa6ba900d..6af8083b532e 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ diff --git a/icons/ui_icons/chat/chattags/admin.png b/icons/ui_icons/chat/chattags/admin.png new file mode 100644 index 000000000000..dbbb2295e792 Binary files /dev/null and b/icons/ui_icons/chat/chattags/admin.png differ diff --git a/icons/ui_icons/chat/chattags/aooc.png b/icons/ui_icons/chat/chattags/aooc.png new file mode 100644 index 000000000000..0465c61d1ae6 Binary files /dev/null and b/icons/ui_icons/chat/chattags/aooc.png differ diff --git a/icons/ui_icons/chat/chattags/dead.png b/icons/ui_icons/chat/chattags/dead.png new file mode 100644 index 000000000000..dcb95573ec1b Binary files /dev/null and b/icons/ui_icons/chat/chattags/dead.png differ diff --git a/icons/ui_icons/chat/chattags/help.png b/icons/ui_icons/chat/chattags/help.png new file mode 100644 index 000000000000..5d858d0d371d Binary files /dev/null and b/icons/ui_icons/chat/chattags/help.png differ diff --git a/icons/ui_icons/chat/chattags/looc.png b/icons/ui_icons/chat/chattags/looc.png new file mode 100644 index 000000000000..b46a51ffd42b Binary files /dev/null and b/icons/ui_icons/chat/chattags/looc.png differ diff --git a/icons/ui_icons/chat/chattags/mod.png b/icons/ui_icons/chat/chattags/mod.png new file mode 100644 index 000000000000..372a571dd75c Binary files /dev/null and b/icons/ui_icons/chat/chattags/mod.png differ diff --git a/icons/ui_icons/chat/chattags/ooc.png b/icons/ui_icons/chat/chattags/ooc.png new file mode 100644 index 000000000000..353c2a9b566a Binary files /dev/null and b/icons/ui_icons/chat/chattags/ooc.png differ diff --git a/icons/ui_icons/chat/chattags/pm_in.png b/icons/ui_icons/chat/chattags/pm_in.png new file mode 100644 index 000000000000..4f8f0aa85676 Binary files /dev/null and b/icons/ui_icons/chat/chattags/pm_in.png differ diff --git a/icons/ui_icons/chat/chattags/pm_in_alt.png b/icons/ui_icons/chat/chattags/pm_in_alt.png new file mode 100644 index 000000000000..f548dede798d Binary files /dev/null and b/icons/ui_icons/chat/chattags/pm_in_alt.png differ diff --git a/icons/ui_icons/chat/chattags/pm_other.png b/icons/ui_icons/chat/chattags/pm_other.png new file mode 100644 index 000000000000..1effd31ca308 Binary files /dev/null and b/icons/ui_icons/chat/chattags/pm_other.png differ diff --git a/icons/ui_icons/chat/chattags/pm_out.png b/icons/ui_icons/chat/chattags/pm_out.png new file mode 100644 index 000000000000..22305b54d313 Binary files /dev/null and b/icons/ui_icons/chat/chattags/pm_out.png differ diff --git a/icons/ui_icons/cursors/default.cur b/icons/ui_icons/cursors/default.cur new file mode 100644 index 000000000000..26b8cbc3ca54 Binary files /dev/null and b/icons/ui_icons/cursors/default.cur differ diff --git a/icons/ui_icons/cursors/link_select.cur b/icons/ui_icons/cursors/link_select.cur new file mode 100644 index 000000000000..746601998b6e Binary files /dev/null and b/icons/ui_icons/cursors/link_select.cur differ diff --git a/icons/ui_icons/particle_editor/box_gen.png b/icons/ui_icons/particle_editor/box_gen.png new file mode 100644 index 000000000000..2a6fcd0c7e60 Binary files /dev/null and b/icons/ui_icons/particle_editor/box_gen.png differ diff --git a/icons/ui_icons/particle_editor/circle_gen.png b/icons/ui_icons/particle_editor/circle_gen.png new file mode 100644 index 000000000000..27aed9a0f266 Binary files /dev/null and b/icons/ui_icons/particle_editor/circle_gen.png differ diff --git a/icons/ui_icons/particle_editor/cube_gen.png b/icons/ui_icons/particle_editor/cube_gen.png new file mode 100644 index 000000000000..8f2f743c0268 Binary files /dev/null and b/icons/ui_icons/particle_editor/cube_gen.png differ diff --git a/icons/ui_icons/particle_editor/linear_rand.png b/icons/ui_icons/particle_editor/linear_rand.png new file mode 100644 index 000000000000..72c07fcb58e1 Binary files /dev/null and b/icons/ui_icons/particle_editor/linear_rand.png differ diff --git a/icons/ui_icons/particle_editor/motion.png b/icons/ui_icons/particle_editor/motion.png new file mode 100644 index 000000000000..6cd827782723 Binary files /dev/null and b/icons/ui_icons/particle_editor/motion.png differ diff --git a/icons/ui_icons/particle_editor/normal_rand.png b/icons/ui_icons/particle_editor/normal_rand.png new file mode 100644 index 000000000000..b32e8b677325 Binary files /dev/null and b/icons/ui_icons/particle_editor/normal_rand.png differ diff --git a/icons/ui_icons/particle_editor/num_gen.png b/icons/ui_icons/particle_editor/num_gen.png new file mode 100644 index 000000000000..3771de85219f Binary files /dev/null and b/icons/ui_icons/particle_editor/num_gen.png differ diff --git a/icons/ui_icons/particle_editor/sphere_gen.png b/icons/ui_icons/particle_editor/sphere_gen.png new file mode 100644 index 000000000000..801b0db2e6a4 Binary files /dev/null and b/icons/ui_icons/particle_editor/sphere_gen.png differ diff --git a/icons/ui_icons/particle_editor/square_gen.png b/icons/ui_icons/particle_editor/square_gen.png new file mode 100644 index 000000000000..ee71f16c0b32 Binary files /dev/null and b/icons/ui_icons/particle_editor/square_gen.png differ diff --git a/icons/ui_icons/particle_editor/square_rand.png b/icons/ui_icons/particle_editor/square_rand.png new file mode 100644 index 000000000000..718f8038b58d Binary files /dev/null and b/icons/ui_icons/particle_editor/square_rand.png differ diff --git a/icons/ui_icons/particle_editor/uniform_rand.png b/icons/ui_icons/particle_editor/uniform_rand.png new file mode 100644 index 000000000000..09841b8a2d4f Binary files /dev/null and b/icons/ui_icons/particle_editor/uniform_rand.png differ diff --git a/icons/ui_icons/particle_editor/vector_gen.png b/icons/ui_icons/particle_editor/vector_gen.png new file mode 100644 index 000000000000..b3fe3df4e04f Binary files /dev/null and b/icons/ui_icons/particle_editor/vector_gen.png differ diff --git a/interface/interface.dm b/interface/interface.dm index a32bb758a204..dfb0e9c4c50c 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -58,45 +58,92 @@ set desc = "Report an issue" set hidden = TRUE var/githuburl = CONFIG_GET(string/githuburl) - if(githuburl) - var/message = "This will open the Github issue reporter in your browser. Are you sure?" - if(GLOB.revdata.testmerge.len) - message += "
The following experimental changes are active and are probably the cause of any new or sudden issues you may experience. If possible, please try to find a specific thread for your issue instead of posting to the general issue tracker:
" - message += GLOB.revdata.GetTestMergeInfo(FALSE) - // We still use tgalert here because some people were concerned that if someone wanted to report that tgui wasn't working - // then the report issue button being tgui-based would be problematic. - if(tgalert(src, message, "Report Issue","Yes","No")!="Yes") + var/issue_key = CONFIG_GET(string/issue_key) + if(!issue_key) + to_chat(src, span_danger("Issue Reporting is not properly configured.")) + return + //Are we pre-interview or otherwise not allowed to do this? + if(restricted_mode || is_banned_from(ckey, "Bug Report")) + to_chat(src, span_warning("You are not currently allowed to make a bug report through this system.")) + return + if(tgui_alert(src, "This will start reporting an issue, gathering some information from the server and your client, before submitting it to github.", "Report Issue",list("Continue","Abort"))!="Continue") + return + if(GLOB.revdata.testmerge.len || GLOB.Debug2) + if(tgalert(src, "Experimental code is enabled on the server, Please check Show-Server-Revision for more information.", "Report Issue","Continue","Abort")!="Continue") return - // Keep a static version of the template to avoid reading file - var/static/issue_template = file2text(".github/ISSUE_TEMPLATE/bug_report.md") + // Keep a static version of the template to avoid reading file + var/static/issue_template = file2text(".github/ISSUE_TEMPLATE/bug_report.md") - // Get a local copy of the template for modification - var/local_template = issue_template + // Get a local copy of the template for modification + var/local_template = issue_template - // Remove comment header - var/content_start = findtext(local_template, "<") - if(content_start) - local_template = copytext(local_template, content_start) + // Remove comment header + var/content_start = findtext(local_template, "<") + if(content_start) + local_template = copytext(local_template, content_start) - // Insert round - if(GLOB.round_id) - local_template = replacetext(local_template, "## Round ID:\n", "## Round ID:\n[GLOB.round_id]") + // Insert round + if(GLOB.round_id) + local_template = replacetext(local_template, "## Round ID:\n", "## Round ID:\n[GLOB.round_id]") - // Insert testmerges - if(GLOB.revdata.testmerge.len) - var/list/all_tms = list() - for(var/entry in GLOB.revdata.testmerge) - var/datum/tgs_revision_information/test_merge/tm = entry - all_tms += "- \[[tm.title]\]([githuburl]/pull/[tm.number])" - var/all_tms_joined = all_tms.Join("\n") // for some reason this can't go in the [] - local_template = replacetext(local_template, "## Testmerges:\n", "## Testmerges:\n[all_tms_joined]") + // Insert testmerges + if(GLOB.revdata.testmerge.len) + var/list/all_tms = list() + for(var/entry in GLOB.revdata.testmerge) + var/datum/tgs_revision_information/test_merge/tm = entry + all_tms += "- \[[tm.title]\]([githuburl]/pull/[tm.number])" + var/all_tms_joined = all_tms.Join("\n") // for some reason this can't go in the [] + local_template = replacetext(local_template, "## Testmerges:\n", "## Testmerges:\n[all_tms_joined]") - var/url_params = "Reporting client version: [byond_version].[byond_build]\n\n[local_template]" - DIRECT_OUTPUT(src, link("[githuburl]/issues/new?body=[url_encode(url_params)]")) - else - to_chat(src, span_danger("The Github URL is not set in the server configuration.")) - return + //Collect client info: + var/issue_title = input(src, "Please give the issue a title:","Issue Title") as text|null + if(!issue_title) + return //Consider it aborted + var/user_description = input(src, "Please describe the issue you are reporting:","Issue Body") as message|null + if(!user_description) + return + + local_template = replacetext(local_template, "## Reproduction:\n", "## Reproduction:\n[user_description]") + + var/client_info = "```\ + Client Information:\n\ + BYOND:[byond_version].[byond_build]\n\ + Key:[ckey]\n\ + ```\ + " + var/issue_body = "\nReporting client info:\n[client_info]\n\n[local_template]" + var/list/body_structure = list( + "title" = issue_title, + "body" = issue_body + ) + var/datum/http_request/issue_report = new + rustg_file_write(issue_body, "[GLOB.log_directory]/issue_reports/[ckey]-[world.time]-[SANITIZE_FILENAME(issue_title)].txt") + message_admins("BUGREPORT: Bug report filed by [ADMIN_LOOKUPFLW(src)], Title: [strip_html(issue_title)]") + issue_report.prepare( + RUSTG_HTTP_METHOD_POST, + "https://api.github.com/repos/[CONFIG_GET(string/issue_slug)]/issues", + json_encode(body_structure), //this is slow slow slow but no other options buckaroo + list( + "Accept"="application/vnd.github+json", + "Authorization"="Bearer [issue_key]", + "X-GitHub-Api-Version"="2022-11-28" + ) + ) + to_chat(src, span_notice("Sending issue report...")) + SEND_SOUND(src, 'sound/misc/compiler-stage1.ogg') + issue_report.begin_async() + UNTIL(issue_report.is_complete() || !src) //Client fuckery. + var/datum/http_response/issue_response = issue_report.into_response() + if(issue_response.errored || issue_response.status_code != 201) + SEND_SOUND(src, 'sound/misc/compiler-failure.ogg') + to_chat(src, "[span_alertwarning("Bug report FAILED!")]\n\ + [span_warning("Please adminhelp immediately!")]\n\ + [span_notice("Code:[issue_response.status_code || "9001 CATASTROPHIC ERROR"]")]") + + return + SEND_SOUND(src, 'sound/misc/compiler-stage2.ogg') + to_chat(src, span_notice("Bug submitted successfully.")) /client/verb/changelog() set name = "Changelog" @@ -118,3 +165,14 @@ GLOB.hotkeys_tgui = new /datum/hotkeys_help() GLOB.hotkeys_tgui.ui_interact(mob) + +/client/verb/webmap() + set name = "Open Webmap" + set category = "OOC" + if(!SSmapping.initialized) + to_chat_immediate(src, span_warning("Please wait until the server has fully started!")) + if(!SSmapping.config.webmap_id) + to_chat(src, "Map ID Missing from config.") + if(length(world.TgsTestMerges())) + alert(src, "Notice: Test Merges are active, this map may not be fully accurate!", "Testmerge Notice", "OK") + src << link("https://webmap.affectedarc07.co.uk/[CONFIG_GET(string/webmap_community)]/[SSmapping.config.webmap_id]") diff --git a/interface/skin.dmf b/interface/skin.dmf index 13cc062f142b..ef681077b039 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,12 +1,10 @@ macro "default" - elem ".winset :map.right-click=false" - name = "SHIFT+Shift" - elem "Shift" + elem "PROTECTED-Shift" name = "SHIFT" - command = ".winset :map.right-click=false" - elem "ShiftUp" + command = ".winset :map.right-click=false\nKeyDown Shift" + elem "PROTECTED-ShiftUp" name = "SHIFT+UP" - command = ".winset :map.right-click=true" + command = ".winset :map.right-click=true\nKeyUp Shift" menu "menu" @@ -149,6 +147,26 @@ window "infowindow" anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" is-pane = true + elem "codex_button" + type = BUTTON + pos = 445,5 + size = 50x20 + anchor1 = 70,0 + anchor2 = 77,0 + background-color = none + saved-params = "is-checked" + text = "Codex" + command = "Codex" + elem "webmap" + type = BUTTON + pos = 545,5 + size = 75x20 + anchor1 = 85,0 + anchor2 = 97,0 + background-color = none + saved-params = "is-checked" + text = "Webmap" + command = "webmap" elem "info" type = CHILD pos = 0,30 @@ -162,54 +180,60 @@ window "infowindow" elem "changelog" type = BUTTON pos = 16,5 - size = 104x20 + size = 79x20 anchor1 = 3,0 - anchor2 = 19,0 + anchor2 = 15,0 + background-color = none saved-params = "is-checked" text = "Changelog" command = "changelog" elem "rules" type = BUTTON - pos = 120,5 - size = 100x20 - anchor1 = 19,0 - anchor2 = 34,0 + pos = 395,5 + size = 50x20 + anchor1 = 62,0 + anchor2 = 70,0 + background-color = none saved-params = "is-checked" text = "Rules" command = "rules" elem "wiki" type = BUTTON - pos = 220,5 - size = 100x20 - anchor1 = 34,0 - anchor2 = 50,0 + pos = 495,5 + size = 50x20 + anchor1 = 77,0 + anchor2 = 85,0 + background-color = none saved-params = "is-checked" text = "Wiki" command = "wiki" elem "forum" type = BUTTON - pos = 320,5 + pos = 295,5 size = 100x20 - anchor1 = 50,0 - anchor2 = 66,0 + anchor1 = 46,0 + anchor2 = 62,0 + background-color = none saved-params = "is-checked" text = "Forum" command = "forum" elem "github" type = BUTTON - pos = 420,5 + pos = 195,5 size = 100x20 - anchor1 = 66,0 - anchor2 = 81,0 + anchor1 = 30,0 + anchor2 = 46,0 + background-color = none saved-params = "is-checked" text = "Github" command = "github" elem "report-issue" type = BUTTON - pos = 520,5 + pos = 95,5 size = 100x20 - anchor1 = 81,0 - anchor2 = 97,0 + anchor1 = 15,0 + anchor2 = 30,0 + background-color = none saved-params = "is-checked" text = "Report Issue" command = "report-issue" diff --git a/modular_pariah/master_files/code/game/gamemodes/objective.dm b/modular_pariah/master_files/code/game/gamemodes/objective.dm deleted file mode 100644 index d8fc0c811023..000000000000 --- a/modular_pariah/master_files/code/game/gamemodes/objective.dm +++ /dev/null @@ -1,49 +0,0 @@ -// For modularity, we hook into the update_explanation_text to be sure we have a target to register. -/datum/objective/assassinate/update_explanation_text() - RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(register_target_death)) - return ..() -/datum/objective/assassinate/proc/register_target_death(mob/living/dead_guy, gibbed) - SIGNAL_HANDLER - completed = TRUE - UnregisterSignal(dead_guy, COMSIG_LIVING_DEATH) - -/datum/objective/download - name = "download" - var/datum/design/target_design - -/datum/objective/download/New(text) - . = ..() - var/list/designs = SStech.designs.Copy() - while(!target_design) - var/datum/design/D = pick_n_take(designs) - if(D.mapload_design_flags & (DESIGN_FAB_ENGINEERING|DESIGN_FAB_MEDICAL|DESIGN_FAB_ROBOTICS|DESIGN_FAB_SECURITY|DESIGN_FAB_SERVICE|DESIGN_FAB_SUPPLY)) - target_design = D.type - -/datum/objective/download/update_explanation_text() - ..() - explanation_text = "Obtain a design for [target_design.name]." - -/datum/objective/download/check_completion() - var/obj/item/disk/data/dat_fukken_disk = new /obj/item/disk/data{storage = 100}(null) - - var/list/datum/mind/owners = get_owners() - for(var/datum/mind/owner in owners) - if(ismob(owner.current)) - var/mob/mob_owner = owner.current //Yeah if you get morphed and you eat a quantum tech disk with the RD's latest backup good on you soldier. - if(ishuman(mob_owner)) - var/mob/living/carbon/human/human_downloader = mob_owner - if(human_downloader && (human_downloader.stat != DEAD) && istype(human_downloader.wear_suit, /obj/item/clothing/suit/space/space_ninja)) - var/obj/item/clothing/suit/space/space_ninja/ninja_suit = human_downloader.wear_suit - dat_fukken_disk.write(DATA_IDX_DESIGNS, ninja_suit.stored_designs, TRUE) - - var/list/otherwise = mob_owner.get_contents() - for(var/obj/item/disk/data/checking in otherwise) - dat_fukken_disk.write(DATA_IDX_DESIGNS, checking.read(DATA_IDX_DESIGNS), TRUE) - - return locate(target_design) in dat_fukken_disk.read(DATA_IDX_DESIGNS) - -/datum/objective/download/admin_edit(mob/admin) - var/count = input(admin,"How many nodes ?","Nodes",target_amount) as num|null - if(count) - target_amount = count - update_explanation_text() diff --git a/modular_pariah/master_files/code/modules/antagonist/_common/antag_datum.dm b/modular_pariah/master_files/code/modules/antagonist/_common/antag_datum.dm index 4f2c2f152cc6..3aeb6c289a6c 100644 --- a/modular_pariah/master_files/code/modules/antagonist/_common/antag_datum.dm +++ b/modular_pariah/master_files/code/modules/antagonist/_common/antag_datum.dm @@ -1,115 +1,38 @@ -/// Chance that the traitor could roll hijack if the pop limit is met. -#define HIJACK_PROB 10 -/// Hijack is unavailable as a random objective below this player count. -#define HIJACK_MIN_PLAYERS 30 - -/// Chance the traitor gets a martyr objective instead of having to escape alive, as long as all the objectives are martyr compatible. -#define MARTYR_PROB 20 - +#define EXTRA_OBJECTIVE_PROB 40 /// Chance the traitor gets a kill objective. If this prob fails, they will get a steal objective instead. -#define KILL_PROB 50 +#define KILL_PROB 20 /// If a kill objective is rolled, chance that it is to destroy the AI. #define DESTROY_AI_PROB(denominator) (100 / denominator) -/// If the destroy AI objective doesn't roll, chance that we'll get a maroon instead. If this prob fails, they will get a generic assassinate objective instead. -#define MAROON_PROB 30 -/// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as martyr and hijack. +/// Generates a complete set of traitor objectives up to the traitor objective limit, including non-generic objectives such as hijack. /datum/antagonist/traitor/proc/forge_traitor_objectives() objectives.Cut() - var/objective_count = 0 - - if((GLOB.joined_player_list.len >= HIJACK_MIN_PLAYERS) && prob(HIJACK_PROB)) - is_hijacker = TRUE - objective_count++ - - var/objective_limit = CONFIG_GET(number/traitor_objectives_amount) - - // for(in...to) loops iterate inclusively, so to reach objective_limit we need to loop to objective_limit - 1 - // This does not give them 1 fewer objectives than intended. - for(var/i in objective_count to objective_limit - 1) - objectives += forge_single_generic_objective() - - -/// Adds a generic kill or steal objective to this datum's objective list. -/datum/antagonist/traitor/proc/forge_single_generic_objective() - if(prob(KILL_PROB)) - var/list/active_ais = active_ais() - if(active_ais.len && prob(DESTROY_AI_PROB(GLOB.joined_player_list.len))) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = owner - destroy_objective.find_target() - return destroy_objective - - if(prob(MAROON_PROB)) - var/datum/objective/maroon/maroon_objective = new - maroon_objective.owner = owner - maroon_objective.find_target() - return maroon_objective - - var/datum/objective/assassinate/kill_objective = new - kill_objective.owner = owner - kill_objective.find_target() - return kill_objective - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = owner - steal_objective.find_target() - return steal_objective - -/** - * ## forge_ending_objective - * - * Forges the endgame objective and adds it to this datum's objective list. - */ -/datum/antagonist/traitor/proc/forge_ending_objective() - if(is_hijacker) - ending_objective = new /datum/objective/hijack - ending_objective.owner = owner - objectives += ending_objective - return - - var/martyr_compatibility = TRUE - - for(var/datum/objective/traitor_objective in objectives) - if(!traitor_objective.martyr_compatible) - martyr_compatibility = FALSE - break - - if(martyr_compatibility && prob(MARTYR_PROB)) - ending_objective = new /datum/objective/martyr - ending_objective.owner = owner - objectives += ending_objective - return - - ending_objective = new /datum/objective/escape - ending_objective.owner = owner - objectives += ending_objective - -/// Forges a single escape objective and adds it to this datum's objective list. -/datum/antagonist/traitor/proc/forge_escape_objective() - var/is_martyr = prob(MARTYR_PROB) - var/martyr_compatibility = TRUE - - for(var/datum/objective/traitor_objective in objectives) - if(!traitor_objective.martyr_compatible) - martyr_compatibility = FALSE - break - - if(martyr_compatibility && is_martyr) - var/datum/objective/martyr/martyr_objective = new - martyr_objective.owner = owner - objectives += martyr_objective - return - - var/datum/objective/escape/escape_objective = new - escape_objective.owner = owner - objectives += escape_objective - + var/datum/objective/O = new /datum/objective/gimmick + O.owner = owner + objectives += O + + if(prob(EXTRA_OBJECTIVE_PROB)) + if(prob(KILL_PROB)) + var/list/active_ais = active_ais() + if(active_ais.len && prob(DESTROY_AI_PROB(GLOB.joined_player_list.len))) + O = new /datum/objective/destroy + O.owner = owner + O.find_target() + objectives += O + return + O = new /datum/objective/assassinate + O.owner = owner + O.find_target() + objectives += O + return + else + O = new /datum/objective/steal + O.owner = owner + O.find_target() + objectives += O + return -#undef HIJACK_PROB -#undef HIJACK_MIN_PLAYERS -#undef MARTYR_PROB #undef KILL_PROB #undef DESTROY_AI_PROB -#undef MAROON_PROB +#undef EXTRA_OBJECTIVE_PROB diff --git a/modular_pariah/master_files/code/modules/mod/mod_clothes.dm b/modular_pariah/master_files/code/modules/mod/mod_clothes.dm deleted file mode 100644 index 4cbf69cb21e9..000000000000 --- a/modular_pariah/master_files/code/modules/mod/mod_clothes.dm +++ /dev/null @@ -1,18 +0,0 @@ -// MODsuit-related overrides for our digitigrade sprites and such -/obj/item/clothing/head/mod - - worn_icon_snouted = 'modular_pariah/master_files/icons/mob/mod.dmi' - - -/obj/item/clothing/suit/mod - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - worn_icon_digitigrade = 'modular_pariah/master_files/icons/mob/mod.dmi' - - -/obj/item/clothing/gloves/mod - supports_variations_flags = NONE - - -/obj/item/clothing/shoes/mod - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION - worn_icon_digitigrade = 'modular_pariah/master_files/icons/mob/mod.dmi' diff --git a/modular_pariah/master_files/code/modules/mod/modules/mod.dm b/modular_pariah/master_files/code/modules/mod/modules/mod.dm deleted file mode 100644 index c1a2a9d87de3..000000000000 --- a/modular_pariah/master_files/code/modules/mod/modules/mod.dm +++ /dev/null @@ -1,52 +0,0 @@ -/obj/item/mod/module - /// The suit's supports_variations_flags, currently only for the chestplate and the helmet parts of the MODsuit. - var/suit_supports_variations_flags = NONE - /// Does this module have a separate head sprite? Useful for muzzled sprites - var/has_head_sprite = FALSE - /// Is the module's visuals head-only when active? Useful for visors and such, to avoid multiplying the amount of overlay with empty images - var/head_only_when_active = FALSE - /// Is the module's visuals head-only when inactive? Useful for visors and such, to avoid multiplying the amount of overlay with empty images - var/head_only_when_inactive = FALSE - - -/** - * Proc that handles the mutable_appearances of the module on the MODsuits - * - * Arguments: - * * standing - The mutable_appearance we're taking as a reference for this one, mainly to use its layer. - * * module_icon_state - The name of the icon_state we'll be using for the module on the MODsuit. - */ -/obj/item/mod/module/proc/handle_module_icon(mutable_appearance/standing, module_icon_state) - . = list() - if(mod.wearer) - if(mod.chestplate && (mod.chestplate.supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION) && (mod.wearer.dna.species.bodytype & BODYTYPE_DIGITIGRADE)) - suit_supports_variations_flags |= CLOTHING_DIGITIGRADE_VARIATION - - if(mod.helmet && (mod.helmet.supports_variations_flags & CLOTHING_SNOUTED_VARIATION) && (mod.wearer.dna.species.bodytype & BODYTYPE_SNOUTED)) - suit_supports_variations_flags |= CLOTHING_SNOUTED_VARIATION - - var/icon_to_use = 'icons/mob/clothing/modsuit/mod_modules.dmi' - var/icon_state_to_use = module_icon_state - var/add_overlay = TRUE - if(suit_supports_variations_flags && (supports_variations_flags & CLOTHING_DIGITIGRADE_VARIATION)) - icon_to_use = 'modular_pariah/master_files/icons/mob/mod.dmi' - icon_state_to_use = "[module_icon_state]_digi" - - if((active && head_only_when_active) | (!active && head_only_when_inactive)) - add_overlay = FALSE - - if(add_overlay) - var/mutable_appearance/module_icon = mutable_appearance(icon_to_use, icon_state_to_use, layer = standing.layer + 0.1) // Just changed the raw icon path to icon_to_use and the used_overlay to icon_state_to_use - module_icon.appearance_flags |= RESET_COLOR - . += module_icon - - if(has_head_sprite) - icon_to_use = 'modular_pariah/master_files/icons/mob/mod.dmi' - icon_state_to_use = "[module_icon_state]_head" - - if(suit_supports_variations_flags && (supports_variations_flags & CLOTHING_SNOUTED_VARIATION)) - icon_state_to_use = "[icon_state_to_use]_muzzled" - - var/mutable_appearance/additional_module_icon = mutable_appearance(icon_to_use, icon_state_to_use, layer = standing.layer + 0.1) - additional_module_icon.appearance_flags |= RESET_COLOR - . += additional_module_icon diff --git a/modular_pariah/master_files/code/modules/mod/modules/modules_antag.dm b/modular_pariah/master_files/code/modules/mod/modules/modules_antag.dm deleted file mode 100644 index fd22f6514943..000000000000 --- a/modular_pariah/master_files/code/modules/mod/modules/modules_antag.dm +++ /dev/null @@ -1,4 +0,0 @@ -/obj/item/mod/module/armor_booster - supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION | CLOTHING_SNOUTED_VARIATION - has_head_sprite = TRUE - head_only_when_active = TRUE diff --git a/modular_pariah/master_files/icons/obj/inflatable.dmi b/modular_pariah/master_files/icons/obj/inflatable.dmi index 403e39c6378c..159d79303727 100644 Binary files a/modular_pariah/master_files/icons/obj/inflatable.dmi and b/modular_pariah/master_files/icons/obj/inflatable.dmi differ diff --git a/modular_pariah/modules/aesthetics/stacks/stack_objects.dmi b/modular_pariah/modules/aesthetics/stacks/stack_objects.dmi index 415474587ab3..ab2fdf5fc695 100644 Binary files a/modular_pariah/modules/aesthetics/stacks/stack_objects.dmi and b/modular_pariah/modules/aesthetics/stacks/stack_objects.dmi differ diff --git a/modular_pariah/modules/alternative_job_titles/code/alt_job_titles.dm b/modular_pariah/modules/alternative_job_titles/code/alt_job_titles.dm index 9fe239963f26..6957b0634ea8 100644 --- a/modular_pariah/modules/alternative_job_titles/code/alt_job_titles.dm +++ b/modular_pariah/modules/alternative_job_titles/code/alt_job_titles.dm @@ -10,106 +10,83 @@ var/list/alt_titles = null // Heads - -/datum/job/research_director - alt_titles = list(JOB_RESEARCH_DIRECTOR, "Lead Researcher") - /datum/job/chief_engineer - alt_titles = list(JOB_CHIEF_ENGINEER, "Engineering Foreman", "Head of Engineering") + alt_titles = list(JOB_CHIEF_ENGINEER) /datum/job/chief_medical_officer - alt_titles = list(JOB_CHIEF_MEDICAL_OFFICER, "Head of Medical", "Senior Physician") - -/datum/job/head_of_personnel - alt_titles = list(JOB_HEAD_OF_PERSONNEL, "Personnel Manager", "Crew Overseer") + alt_titles = list(JOB_MEDICAL_DIRECTOR) /datum/job/head_of_security - alt_titles = list(JOB_HEAD_OF_SECURITY, "Security Commander", "Chief of Security") + alt_titles = list(JOB_SECURITY_MARSHAL) // Security /datum/job/security_officer - alt_titles = list("Security Officer", "Security Guard") + alt_titles = list(JOB_SECURITY_OFFICER, "Security Guard") /datum/job/warden - alt_titles = list("Warden", "Brig Officer", "Security Sergeant") + alt_titles = list(JOB_WARDEN) /datum/job/detective - alt_titles = list("Detective", "Forensic Technician") + alt_titles = list(JOB_DETECTIVE) /datum/job/prisoner - alt_titles = list("Prisoner", "Inmate") + alt_titles = list(JOB_PRISONER) // Medical /datum/job/doctor - alt_titles = list("Medical Doctor", "Surgeon", "Nurse", "Physician", "Medical Resident", "Medical Technician") + alt_titles = list(JOB_MEDICAL_DOCTOR, "Surgeon", "Physician") /datum/job/paramedic - alt_titles = list("Paramedic", "Emergency Medical Technician") + alt_titles = list(JOB_PARAMEDIC) /datum/job/chemist - alt_titles = list("Chemist", "Pharmacist", "Pharmacologist") + alt_titles = list(JOB_CHEMIST) /datum/job/virologist - alt_titles = list("Virologist", "Pathologist", "Microbiologist") + alt_titles = list(JOB_VIROLOGIST) /datum/job/psychologist - alt_titles = list("Psychologist", "Psychiatrist", "Therapist") - -// Science - -/datum/job/roboticist - alt_titles = list("Roboticist", "Biomechanical Engineer", "Mechatronic Engineer") - -/datum/job/scientist - alt_titles = list("Scientist", "Circuitry Designer", "Xenobiologist", "Cytologist", "Plasma Researcher", "Anomalist", "Ordnance Technician") - -/datum/job/geneticist - alt_titles = list("Geneticist", "Mutation Researcher") + alt_titles = list(JOB_PSYCHOLOGIST) // Engineering /datum/job/station_engineer - alt_titles = list("Station Engineer", "Maintenance Technician", "Electrician", "Engine Technician") + alt_titles = list(JOB_STATION_ENGINEER, "Maintenance Technician", "Electrician", "Engine Technician") /datum/job/atmospheric_technician - alt_titles = list("Atmospheric Technician", "Life Support Technician") + alt_titles = list(JOB_ATMOSPHERIC_TECHNICIAN) // Cargo /datum/job/quartermaster - alt_titles = list(JOB_QUARTERMASTER, "Deck Chief") + alt_titles = list(JOB_QUARTERMASTER) /datum/job/cargo_technician - alt_titles = list("Cargo Technician", "Deck Worker", "Mailman") + alt_titles = list(JOB_DECKHAND, "Mailman") /datum/job/shaft_miner - alt_titles = list("Shaft Miner", "Prospector") + alt_titles = list(JOB_PROSPECTOR) // Service /datum/job/cook - alt_titles = list("Cook", "Chef", "Culinary Artist") + alt_titles = list(JOB_COOK, "Chef", "Culinary Artist") /datum/job/bartender - alt_titles = list("Bartender", "Mixologist", "Barkeeper") + alt_titles = list(JOB_BARTENDER, "Mixologist", "Barkeeper") /datum/job/botanist - alt_titles = list("Botanist", "Hydroponicist", "Botanical Researcher") + alt_titles = list(JOB_BOTANIST) /datum/job/curator - alt_titles = list("Curator", "Librarian", "Journalist") + alt_titles = list(JOB_ARCHIVIST) /datum/job/janitor - alt_titles = list("Janitor", "Custodian", "Sanitation Technician") + alt_titles = list(JOB_JANITOR, "Custodian", "Sanitation Technician") /datum/job/chaplain - alt_titles = list("Chaplain", "Priest", "Preacher", "Reverend", "Oracle", "Pontifex", "Magister", "High Priest", "Imam", "Rabbi", "Monk", "Counselor") + alt_titles = list(JOB_CHAPLAIN, "Priest", "Preacher", "Reverend", "Oracle", "Pontifex", "Magister", "High Priest", "Imam", "Rabbi", "Monk", "Counselor") /datum/job/lawyer - alt_titles = list("Lawyer", "Human Resources Agent", "Defence Attorney", "Public Defender", "Prosecutor") - -// Misc - -/datum/job/assistant - alt_titles = list("Assistant", "Civilian", "Businessman", "Trader", "Off-Duty Crew") + alt_titles = list(JOB_LAWYER, "Human Resources Agent", "Defence Attorney", "Public Defender", "Prosecutor") diff --git a/modular_pariah/modules/autotransfer/code/autotransfer.dm b/modular_pariah/modules/autotransfer/code/autotransfer.dm index dbe129d050b6..82f16a076444 100644 --- a/modular_pariah/modules/autotransfer/code/autotransfer.dm +++ b/modular_pariah/modules/autotransfer/code/autotransfer.dm @@ -16,8 +16,8 @@ SUBSYSTEM_DEF(autotransfer) if(!init_vote) //Autotransfer voting disabled. can_fire = FALSE return ..() - starttime = world.realtime - targettime = starttime + init_vote + starttime = REALTIMEOFDAY + targettime = REALTIMEOFDAY + init_vote voteinterval = CONFIG_GET(number/vote_autotransfer_interval) maxvotes = CONFIG_GET(number/vote_autotransfer_maximum) return ..() @@ -28,10 +28,11 @@ SUBSYSTEM_DEF(autotransfer) curvotes = SSautotransfer.curvotes /datum/controller/subsystem/autotransfer/fire() - if(world.realtime < targettime) + if(REALTIMEOFDAY < targettime) return + if(maxvotes == NO_MAXVOTES_CAP || maxvotes > curvotes) - SSvote.initiate_vote("transfer","server") + SSvote.initiate_vote(/datum/vote/crew_transfer, "server") targettime = targettime + voteinterval curvotes++ else diff --git a/modular_pariah/modules/cryosleep/code/cryopod.dm b/modular_pariah/modules/cryosleep/code/cryopod.dm index 5fbd13aa6f3c..920b70487246 100644 --- a/modular_pariah/modules/cryosleep/code/cryopod.dm +++ b/modular_pariah/modules/cryosleep/code/cryopod.dm @@ -20,7 +20,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) // circuit = /obj/item/circuitboard/cryopodcontrol density = FALSE 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. + req_one_access = list(ACCESS_SECURITY) // Security can reclaim objects. var/mode = null /// Used for logging people entering cryosleep and important items they are carrying. @@ -81,7 +81,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) var/mob/living/living_user = user var/obj/item/card/id/id = living_user.get_idcard() if(id) - if((ACCESS_HEADS in id.access) || (ACCESS_ARMORY in id.access)) + if((ACCESS_MANAGEMENT in id.access) || (ACCESS_ARMORY in id.access)) item_retrieval_allowed = TRUE data["item_retrieval_allowed"] = item_retrieval_allowed @@ -219,45 +219,34 @@ GLOBAL_LIST_EMPTY(cryopod_computers) to_chat(mind.current, "
[span_userdanger("Your target is no longer within reach. Objective removed!")]") mind.announce_objectives() else if(istype(objective.target) && objective.target == mob_occupant.mind) - if(istype(objective, /datum/objective/contract)) - var/datum/contractor_hub/the_hub = GLOB.contractors[objective.owner] - if(!the_hub) - return - for(var/datum/syndicate_contract/affected_contract as anything in the_hub.assigned_contracts) - if(affected_contract.contract == objective) - affected_contract.generate(the_hub.assigned_targets) - the_hub.assigned_targets.Add(affected_contract.contract.target) - to_chat(objective.owner.current, "
[span_userdanger("Contract target out of reach. Contract rerolled.")]") - break + var/old_target = objective.target + objective.target = null + if(!objective) + return + objective.find_target() + if(!objective.target && objective.owner) + to_chat(objective.owner.current, "
[span_userdanger("Your target is no longer within reach. Objective removed!")]") + for(var/datum/antagonist/antag in objective.owner.antag_datums) + antag.objectives -= objective + if (!objective.team) + objective.update_explanation_text() + objective.owner.announce_objectives() + to_chat(objective.owner.current, "
[span_userdanger("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/old_target = objective.target - objective.target = null - if(!objective) - return - objective.find_target() - if(!objective.target && objective.owner) - to_chat(objective.owner.current, "
[span_userdanger("Your target is no longer within reach. Objective removed!")]") - for(var/datum/antagonist/antag in objective.owner.antag_datums) - antag.objectives -= objective - if (!objective.team) - objective.update_explanation_text() - objective.owner.announce_objectives() + var/list/objectivestoupdate + for(var/datum/mind/objective_owner in objective.get_owners()) + to_chat(objective_owner.current, "
[span_userdanger("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/update_target_objective in objective_owner.get_all_objectives()) + LAZYADD(objectivestoupdate, update_target_objective) + objectivestoupdate += objective.team.objectives + for(var/datum/objective/update_objective in objectivestoupdate) + if(update_objective.target != old_target || !istype(update_objective,objective.type)) + continue + update_objective.target = objective.target + update_objective.update_explanation_text() to_chat(objective.owner.current, "
[span_userdanger("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/objective_owner in objective.get_owners()) - to_chat(objective_owner.current, "
[span_userdanger("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/update_target_objective in objective_owner.get_all_objectives()) - LAZYADD(objectivestoupdate, update_target_objective) - objectivestoupdate += objective.team.objectives - for(var/datum/objective/update_objective in objectivestoupdate) - if(update_objective.target != old_target || !istype(update_objective,objective.type)) - continue - update_objective.target = objective.target - update_objective.update_explanation_text() - to_chat(objective.owner.current, "
[span_userdanger("You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!")]") - update_objective.owner.announce_objectives() - qdel(objective) + update_objective.owner.announce_objectives() + qdel(objective) /obj/machinery/cryopod/proc/should_preserve_item(obj/item/item) for(var/datum/objective_item/steal/possible_item in GLOB.possible_items) @@ -284,17 +273,8 @@ GLOBAL_LIST_EMPTY(cryopod_computers) crew_member["job"] = "N/A" // Delete them from datacore. - var/announce_rank = null - for(var/datum/data/record/medical_record as anything in GLOB.data_core.medical) - if(medical_record.fields["name"] == mob_occupant.real_name) - qdel(medical_record) - for(var/datum/data/record/security_record as anything in GLOB.data_core.security) - if(security_record.fields["name"] == mob_occupant.real_name) - qdel(security_record) - for(var/datum/data/record/general_record as anything in GLOB.data_core.general) - if(general_record.fields["name"] == mob_occupant.real_name) - announce_rank = general_record.fields["rank"] - qdel(general_record) + var/announce_rank = SSdatacore.get_record_by_name(mob_occupant.real_name, DATACORE_RECORDS_STATION)?.fields[DATACORE_RANK] + SSdatacore.demanifest(mob_occupant.real_name) var/obj/machinery/computer/cryopod/control_computer = control_computer_weakref?.resolve() if(!control_computer) @@ -309,8 +289,8 @@ GLOBAL_LIST_EMPTY(cryopod_computers) visible_message(span_notice("[src] hums and hisses as it moves [mob_occupant.real_name] into storage.")) - for(var/obj/item/item_content as anything in mob_occupant) - if(!istype(item_content) || HAS_TRAIT(item_content, TRAIT_NODROP)) + for(var/obj/item/item_content in mob_occupant) + if(!HAS_TRAIT(item_content, TRAIT_NODROP) || (item_content.item_flags & ABSTRACT)) continue if (issilicon(mob_occupant) && istype(item_content, /obj/item/mmi)) continue @@ -325,7 +305,7 @@ GLOBAL_LIST_EMPTY(cryopod_computers) open_machine() name = initial(name) -/obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user) +/obj/machinery/cryopod/MouseDroppedOn(mob/living/target, mob/user) if(!istype(target) || !can_interact(user) || !target.Adjacent(user) || !ismob(target) || isanimal(target) || !istype(user.loc, /turf) || target.buckled) return diff --git a/modular_pariah/modules/customization/game/objects/items/devices/ttsdevice.dm b/modular_pariah/modules/customization/game/objects/items/devices/ttsdevice.dm index 3bc437c3f5e7..b8876fbbe88e 100644 --- a/modular_pariah/modules/customization/game/objects/items/devices/ttsdevice.dm +++ b/modular_pariah/modules/customization/game/objects/items/devices/ttsdevice.dm @@ -13,7 +13,7 @@ visible_message("[user] starts typing on [src].", "You begin typing on [src].", "You hear faint, continuous mechanical clicking noises.") playsound(src, 'modular_pariah/master_files/sound/items/tts/started_type.ogg', 50, TRUE) var/input = stripped_input(user,"What would you like the device to say?", ,"", 500) - if(QDELETED(src) || !user.canUseTopic(src, BE_CLOSE)) + if(QDELETED(src) || !user.canUseTopic(src, USE_CLOSE)) return if(!input) visible_message("[user] stops typing on [src].", "You stop typing on [src].", "You hear the clicking noises stop.") diff --git a/modular_pariah/modules/customization/modules/clothing/ears/ears.dm b/modular_pariah/modules/customization/modules/clothing/ears/ears.dm index c8335476a23e..3086cda7efb5 100644 --- a/modular_pariah/modules/customization/modules/clothing/ears/ears.dm +++ b/modular_pariah/modules/customization/modules/clothing/ears/ears.dm @@ -14,9 +14,6 @@ /obj/item/clothing/ears/headphones/Initialize() . = ..() update_icon() - -/obj/item/clothing/ears/headphones/ComponentInitialize() - . = ..() AddElement(/datum/element/update_icon_updates_onmob) /obj/item/clothing/ears/headphones/update_icon_state() diff --git a/modular_pariah/modules/customization/modules/clothing/glasses/glasses.dm b/modular_pariah/modules/customization/modules/clothing/glasses/glasses.dm index 24f255a0571b..4e4e1be08dcf 100644 --- a/modular_pariah/modules/customization/modules/clothing/glasses/glasses.dm +++ b/modular_pariah/modules/customization/modules/clothing/glasses/glasses.dm @@ -2,11 +2,11 @@ var/can_switch_eye = FALSE //Having this default to false means that its easy to make sure this doesnt apply to any pre-existing items var/current_eye = "_R" //Added to the end of the icon_state to make this easy code-wise, L and R being the wearer's Left and Right -/obj/item/clothing/glasses/CtrlClick(mob/user) +/obj/item/clothing/glasses/CtrlClick(mob/user, list/params) . = ..() if(.) return - if(!user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY, FALSE, !iscyborg(user))) + if(!user.canUseTopic(src, USE_CLOSE|USE_DEXTERITY)) return else switcheye() @@ -36,8 +36,8 @@ to_chat(usr, span_notice("You adjust the eyepatch to wear it over your left eye.")) else if(current_eye == "_R") to_chat(usr, span_notice("You adjust the eyepatch to wear it over your right eye.")) - usr.update_worn_glasses() - usr.update_overlays() + + update_slot_icon() /obj/item/clothing/glasses/proc/eyepatch_do_switch() if(current_eye == "_L") diff --git a/modular_pariah/modules/customization/modules/clothing/head/jobs.dm b/modular_pariah/modules/customization/modules/clothing/head/jobs.dm index 8574c5d21f96..a68203631502 100644 --- a/modular_pariah/modules/customization/modules/clothing/head/jobs.dm +++ b/modular_pariah/modules/customization/modules/clothing/head/jobs.dm @@ -1,8 +1,8 @@ // This is for all the berets that /tg/ didn't want. You're welcome, they should look better. /obj/item/clothing/head/hos/beret - name = "head of security beret" - desc = "A robust beret for the Head of Security, for looking stylish while not sacrificing protection." + name = "security marshal beret" + desc = "A robust beret for the Security Marshal, for looking stylish while not sacrificing protection." icon_state = "beret_badge" greyscale_config = /datum/greyscale_config/beret_badge greyscale_config_worn = /datum/greyscale_config/beret_badge/worn @@ -20,7 +20,7 @@ greyscale_config = /datum/greyscale_config/beret_badge_fancy greyscale_config_worn = /datum/greyscale_config/beret_badge_fancy/worn greyscale_colors = "#3C485A#FF0000#00AEEF" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 50, WOUND = 6) + armor = list(BLUNT = 40, PUNCTURE = 30, SLASH = 0, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, FIRE = 30, ACID = 50) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyofficer @@ -90,13 +90,13 @@ greyscale_colors = "#FFFFFF#00FF00" /obj/item/clothing/head/beret/medical/cmo - name = "chief medical officer's beret" - desc = "A beret custom-fit to the Chief Medical Officer, repaired once or twice after Runtime got a hold of it." + name = "medical director's beret" + desc = "A beret custom-fit to the Medical Director, repaired once or twice after Runtime got a hold of it." greyscale_colors = "#3299CC#34CCEE" /obj/item/clothing/head/beret/medical/cmo/alt - name = "chief medical officer's beret" - desc = "A beret custom-fit to the Chief Medical Officer, repaired once or twice after Runtime got a hold of it. This one is made out of white fabric. Fancy." + name = "medical director's beret" + desc = "A beret custom-fit to the Medical Director, repaired once or twice after Runtime got a hold of it. This one is made out of white fabric. Fancy." greyscale_colors = "#FFFFFF#34CCEE" /obj/item/clothing/head/beret/science/fancy/robo diff --git a/modular_pariah/modules/customization/modules/food_and_drinks/recipes/drink_recipes.dm b/modular_pariah/modules/customization/modules/food_and_drinks/recipes/drink_recipes.dm index 9fd5675c592e..1ea36d1093c7 100644 --- a/modular_pariah/modules/customization/modules/food_and_drinks/recipes/drink_recipes.dm +++ b/modular_pariah/modules/customization/modules/food_and_drinks/recipes/drink_recipes.dm @@ -156,15 +156,15 @@ required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2) /datum/chemical_reaction/drink/milkshake - results = list(/datum.reagent/consumable/milkshake = 5) + results = list(/datum/reagent/consumable/milkshake = 5) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/ice = 2, /datum/reagent/consumable/cream = 2) /datum/chemical_reaction/drink/milkshake_chocolate - results = list(/datum.reagent/consumable/milkshake_chocolate = 5) - required_reagents = list(/datum/reagent/consumable/coco = 1, /datum.reagent/consumable/milkshake = 2, /datum/reagent/consumable/cream = 2) + results = list(/datum/reagent/consumable/milkshake_chocolate = 5) + required_reagents = list(/datum/reagent/consumable/coco = 1, /datum/reagent/consumable/milkshake = 2, /datum/reagent/consumable/cream = 2) /datum/chemical_reaction/drink/milkshake_strawberry - results = list(/datum.reagent/consumable/milkshake_strawberry = 5) + results = list(/datum/reagent/consumable/milkshake_strawberry = 5) required_reagents = list(/datum/reagent/consumable/berryjuice = 1, /datum/reagent/consumable/ice = 2, /datum/reagent/consumable/cream = 2) /datum/chemical_reaction/drink/beerbatter diff --git a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents.dm b/modular_pariah/modules/customization/modules/reagents/chemistry/reagents.dm deleted file mode 100644 index 71fa4edfb815..000000000000 --- a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/reagent - //What can process this? REAGENT_ORGANIC, REAGENT_SYNTHETIC, or REAGENT_ORGANIC | REAGENT_SYNTHETIC?. We'll assume by default that it affects organics. - var/process_flags = REAGENT_ORGANIC - - //The icon override used for glass sprites, needed for modularity - var/glass_icon = 'icons/obj/drinks.dmi' diff --git a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm deleted file mode 100644 index d1ade3382f23..000000000000 --- a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ /dev/null @@ -1,428 +0,0 @@ -// Modular Booze REAGENTS, see the following file for the mixes: modular_pariah\modules\customization\modules\food_and_drinks\recipes\drinks_recipes.dm -// ROBOT ALCOHOL PAST THIS POINT -// WOOO! - -/datum/reagent/consumable/ethanol/synthanol - name = "Synthanol" - description = "A runny liquid with conductive capacities. Its effects on synthetics are similar to those of alcohol on organics." - color = "#1BB1FF" - boozepwr = 50 - quality = DRINK_NICE - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' // This should cover anything synthanol related. Will have to individually tag others unless we make an object path for pariah drinks. - glass_icon_state = "synthanolglass" - glass_name = "glass of synthanol" - glass_desc = "The equivalent of alcohol for synthetic crewmembers. They'd find it awful if they had tastebuds too." - taste_description = "motor oil" - -/datum/reagent/consumable/ethanol/synthanol/on_mob_life(mob/living/carbon/C) - if(!(C.mob_biotypes & MOB_ROBOTIC)) - metabolization_rate = 3.6 //gets removed from organics very fast - if(prob(25)) - C.vomit(5, FALSE, FALSE) - return ..() - -/datum/reagent/consumable/ethanol/synthanol/expose_mob(mob/living/carbon/C, method=TOUCH, volume) - . = ..() - if(C.mob_biotypes & MOB_ROBOTIC) - return - if(method == INGEST) - to_chat(C, pick(span_danger("That was awful!"), span_danger("That was disgusting!"))) - -/datum/reagent/consumable/ethanol/synthanol/robottears - name = "Robot Tears" - description = "An oily substance that an IPC could technically consider a 'drink'." - color = "#363636" - boozepwr = 25 - glass_icon_state = "robottearsglass" - glass_name = "glass of robot tears" - glass_desc = "No robots were hurt in the making of this drink." - taste_description = "existential angst" - -/datum/reagent/consumable/ethanol/synthanol/trinary - name = "Trinary" - description = "A fruit drink meant only for synthetics, however that works." - color = "#ADB21f" - boozepwr = 20 - glass_icon_state = "trinaryglass" - glass_name = "glass of trinary" - glass_desc = "Colorful drink made for synthetic crewmembers. It doesn't seem like it would taste well." - taste_description = "modem static" - -/datum/reagent/consumable/ethanol/synthanol/servo - name = "Servo" - description = "A drink containing some organic ingredients, but meant only for synthetics." - color = "#5B3210" - boozepwr = 25 - glass_icon_state = "servoglass" - glass_name = "glass of servo" - glass_desc = "Chocolate - based drink made for IPCs. Not sure if anyone's actually tried out the recipe." - taste_description = "motor oil and cocoa" - -/datum/reagent/consumable/ethanol/synthanol/uplink - name = "Uplink" - description = "A potent mix of alcohol and synthanol. Will only work on synthetics." - color = "#E7AE04" - boozepwr = 15 - glass_icon_state = "uplinkglass" - glass_name = "glass of uplink" - glass_desc = "An exquisite mix of the finest liquoirs and synthanol. Meant only for synthetics." - taste_description = "a GUI in visual basic" - -/datum/reagent/consumable/ethanol/synthanol/synthncoke - name = "Synth 'n Coke" - description = "The classic drink adjusted for a robot's tastes." - color = "#7204E7" - boozepwr = 25 - glass_icon_state = "synthncokeglass" - glass_name = "glass of synth 'n coke" - glass_desc = "Classic drink altered to fit the tastes of a robot, contains de-rustifying properties. Bad idea to drink if you're made of carbon." - taste_description = "fizzy motor oil" - -/datum/reagent/consumable/ethanol/synthanol/synthignon - name = "Synthignon" - description = "Someone mixed wine and alcohol for robots. Hope you're proud of yourself." - color = "#D004E7" - boozepwr = 25 - glass_icon_state = "synthignonglass" - glass_name = "glass of synthignon" - glass_desc = "Someone mixed good wine and robot booze. Romantic, but atrocious." - taste_description = "fancy motor oil" - -// Other Booze - -/datum/reagent/consumable/ethanol/gunfire - name = "Gunfire" - description = "A drink that tastes like tiny explosions." - color = "#e4830d" - boozepwr = 40 - quality = DRINK_GOOD - taste_description = "tiny explosions" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "gunfire" - glass_name = "glass of gunfire" - glass_desc = "It pops constantly as you look at it, giving off tiny sparks." - -/datum/reagent/consumable/ethanol/gunfire/on_mob_life(mob/living/carbon/M) - if (prob(3)) - to_chat(M,span_notice("You feel the gunfire pop in your mouth.")) - return ..() - -/datum/reagent/consumable/ethanol/hellfire - name = "Hellfire" - description = "A nice drink that isn't quite as hot as it looks." - color = "#fb2203" - boozepwr = 60 - quality = DRINK_VERYGOOD - taste_description = "cold flames that lick at the top of your mouth" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "hellfire" - glass_name = "glass of hellfire" - glass_desc = "An amber colored drink that isn't quite as hot as it looks." - -/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30) - return ..() - -/datum/reagent/consumable/ethanol/sins_delight - name = "Sin's Delight" - description = "The drink smells like the seven sins." - color = "#330000" - boozepwr = 66 - quality = DRINK_FANTASTIC - taste_description = "overpowering sweetness with a touch of sourness, followed by iron and the sensation of a warm summer breeze" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "sins_delight" - glass_name = "glass of sin's delight" - glass_desc = "You can smell the seven sins rolling off the top of the glass." - -/datum/reagent/consumable/ethanol/strawberry_daiquiri - name = "Strawberry Daiquiri" - description = "Pink looking alcoholic drink." - boozepwr = 20 - color = "#FF4A74" - quality = DRINK_NICE - taste_description = "sweet strawberry, lime and the ocean breeze" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "strawberry_daiquiri" - glass_name = "glass of strawberry daiquiri" - glass_desc = "Pink looking drink with flowers and a big straw to sip it. Looks sweet and refreshing, perfect for warm days." - -/datum/reagent/consumable/ethanol/liz_fizz - name = "Liz Fizz" - description = "Triple citrus layered with some ice and cream." - boozepwr = 0 - color = "#D8FF59" - taste_description = "brain freezing sourness" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "liz_fizz" - glass_name = "glass of liz fizz" - glass_desc = "Looks like a citrus sherbet seperated in layers? Why would anyone want that is beyond you." - -/datum/reagent/consumable/ethanol/miami_vice - name = "Miami Vice" - description = "A drink layering Pina Colada and Strawberry Daiquiri" - boozepwr = 30 - color = "#D8FF59" - quality = DRINK_FANTASTIC - taste_description = "sweet and refreshing flavor, complemented with strawberries and coconut, and hints of citrus" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "miami_vice" - glass_name = "glass of miami vice" - glass_desc = "Strawberries and coconut, like yin and yang." - -/datum/reagent/consumable/ethanol/malibu_sunset - name = "Malibu Sunset" - description = "A drink consisting of creme de coconut and tropical juices" - boozepwr = 20 - color = "#FF9473" - quality = DRINK_NICE - taste_description = "coconut, with orange and grenadine accents" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "malibu_sunset" - glass_name = "glass of malibu sunset" - glass_desc = "Tropical looking drinks, with ice cubes hovering on the surface and grenadine coloring the bottom." - -/datum/reagent/consumable/ethanol/hotlime_miami - name = "Hotlime Miami" - description = "The essence of the 90's, if they were a bloody mess that is." - boozepwr = 40 - color = "#A7FAE8" - quality = DRINK_FANTASTIC - taste_description = "coconut and aesthetic violence" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "hotlime_miami" - glass_name = "glass of hotlime miami" - glass_desc = "This looks very aesthetically pleasing." - -/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M, delta_time, times_fired) - M.set_timed_status_effect(1.5 MINUTES * REM * delta_time, /datum/status_effect/drugginess) - M.stamina.adjust(2) - return ..() - -/datum/reagent/consumable/ethanol/coggrog - name = "Cog Grog" - description = "Now you can fill yourself with the power of Ratvar!" - color = rgb(255, 201, 49) - boozepwr = 10 - quality = DRINK_FANTASTIC - taste_description = "a brass taste with a hint of oil" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "coggrog" - glass_name = "glass of cog grog" - glass_desc = "Not even Ratvar's Four Generals could withstand this! Qevax Jryy!" - -/datum/reagent/consumable/ethanol/badtouch - name = "Bad Touch" - description = "A sour and vintage drink. Some say the inventor gets slapped a lot." - color = rgb(31, 181, 99) - boozepwr = 35 - quality = DRINK_GOOD - taste_description = "a slap to the face" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "badtouch" - glass_name = "glass of bad touch" - glass_desc = "We're nothing but mammals after all." - -/datum/reagent/consumable/ethanol/marsblast - name = "Marsblast" - description = "A spicy and manly drink in honor of the first colonists on Mars." - color = rgb(246, 143, 55) - boozepwr = 70 - quality = DRINK_FANTASTIC - taste_description = "hot red sand" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "marsblast" - glass_name = "glass of marsblast" - glass_desc = "One of these is enough to leave your face as red as the planet." - -/datum/reagent/consumable/ethanol/mercuryblast - name = "Mercuryblast" - description = "A sour burningly cold drink that's sure to chill the drinker." - color = rgb(29, 148, 213) - boozepwr = 40 - quality = DRINK_VERYGOOD - taste_description = "chills down your spine" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "mercuryblast" - glass_name = "glass of mercuryblast" - glass_desc = "No thermometers were harmed in the creation of this drink" - -/datum/reagent/consumable/ethanol/mercuryblast/on_mob_life(mob/living/carbon/M) - M.adjust_bodytemperature(-30 * TEMPERATURE_DAMAGE_COEFFICIENT, T0C) - return ..() - -/datum/reagent/consumable/ethanol/piledriver - name = "Piledriver" - description = "A bright drink that leaves you with a burning sensation." - color = rgb(241, 146, 59) - boozepwr = 45 - quality = DRINK_NICE - taste_description = "a fire in your throat" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "piledriver" - glass_name = "glass of piledriver" - glass_desc = "Not the only thing to leave your throat sore." - -/datum/reagent/consumable/ethanol/zenstar - name = "Zen Star" - description = "A sour and bland drink, rather dissapointing." - color = rgb(51, 87, 203) - boozepwr = 35 - quality = DRINK_NICE - taste_description = "dissapointment" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "zenstar" - glass_name = "glass of zen star" - glass_desc = "You'd think something so balanced would actually taste nice... you'd be dead wrong." - -// RACE SPECIFIC DRINKS - -/datum/reagent/consumable/ethanol/coldscales - name = "Coldscales" - color = "#5AEB52" //(90, 235, 82) - description = "A cold looking drink made for people with scales." - boozepwr = 50 //strong! - taste_description = "dead flies" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "coldscales" - glass_name = "glass of coldscales" - glass_desc = "A soft green drink that looks inviting!" - -/datum/reagent/consumable/ethanol/coldscales/on_mob_life(mob/living/carbon/M) - if(islizard(M)) - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/oil_drum - name = "Oil Drum" - color = "#000000" //(0, 0, 0) - description = "Industrial grade oil mixed with some ethanol to make it a drink. Somehow not known to be toxic." - boozepwr = 45 - taste_description = "oil spill" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "oil_drum" - glass_name = "drum of oil" - glass_desc = "A gray can of booze and oil..." - -/datum/reagent/consumable/ethanol/oil_drum/on_mob_life(mob/living/carbon/M) - if(MOB_ROBOTIC) - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/abduction_fruit - name = "Abduction Fruit" - color = "#DEFACD" //(222, 250, 205) - description = "Mixing of juices to make an alien taste." - boozepwr = 80 //Strong - taste_description = "grass and lime" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "abduction_fruit" - glass_name = "glass of abduction fruit" - glass_desc = "Mixed fruits that were never meant to be mixed..." - -/datum/reagent/consumable/ethanol/abduction_fruit/on_mob_life(mob/living/carbon/M) - if(isabductor(M)) //add xenohyrids to this at some point - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/mush_crush - name = "Mush Crush" - color = "#F5882A" //(222, 250, 205) - description = "Soil in a glass." - boozepwr = 5 //No booze really - taste_description = "dirt and iron" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "mush_crush" - glass_name = "glass of mush crush" - glass_desc = "Popular among people that want to grow their own food rather than drink the soil." - -/datum/reagent/consumable/ethanol/mush_crush/on_mob_life(mob/living/carbon/M) - if(ispodperson(M)) - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/hollow_bone - name = "Hollow Bone" - color = "#FCF7D4" //(252, 247, 212) - description = "Shockingly none-harmful mix of toxins and milk." - boozepwr = 15 - taste_description = "Milk and salt" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "hollow_bone" - glass_name = "skull of hollow bone" - glass_desc = "Mixing of milk and bone hurting juice for enjoyment for rather skinny people." - -/datum/reagent/consumable/ethanol/hollow_bone/on_mob_life(mob/living/carbon/M) - if(isplasmaman(M) || isskeleton(M)) - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/jell_wyrm - name = "Jell Wyrm" - color = "#FF6200" //(255, 98, 0) - description = "Horrible mix of Co2, toxins and heat. Meant for slime based life." - boozepwr = 40 - taste_description = "tropical sea" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "jell_wyrm" - glass_name = "glass of jell wyrm" - glass_desc = "A bubbly drink that is rather inviting to those that don't know who it's meant for." - -/datum/reagent/consumable/ethanol/jell_wyrm/on_mob_life(mob/living/carbon/M) - if(isjellyperson(M) || isslimeperson(M) || isluminescent(M)) - quality = RACE_DRINK - else - M.adjust_disgust(25) - M.adjustToxLoss(1, 0) //Low tox due to being carp + jell toxins. - return ..() - -/datum/reagent/consumable/ethanol/laval_spit //Yes Laval - name = "Laval Spit" - color = "#DE3009" //(222, 48, 9) - description = "Heat minerals and some mauna loa. Meant for rock based life." - boozepwr = 30 - taste_description = "tropical island" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "laval_spit" - glass_name = "glass of laval spit" - glass_desc = "Piping hot drink for those who can stomach the heat of lava." - -/datum/reagent/consumable/ethanol/laval_spit/on_mob_life(mob/living/carbon/M) - if(isgolem(M)) - quality = RACE_DRINK - else - M.adjust_disgust(25) - return ..() - -/datum/reagent/consumable/ethanol/appletini - name = "Appletini" - color = "#9bd1a9" //(155, 209, 169) - description = "The electric-green appley beverage nobody can turn down!" - boozepwr = 50 - taste_description = "Sweet and green" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "appletini" - glass_name = "glass of appletini" - glass_desc = "An appley beverage in a martini glass" - -/datum/reagent/consumable/ethanol/quadruple_sec/cityofsin //making this a subtype was some REAL JANK, but it saves me a headache, and it looks good! - name = "City of Sin" - color = "#eb9378" //(235, 147, 120) - description = "A smooth, fancy drink for people of ill repute" - boozepwr = 70 - taste_description = "Your own sins" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "cityofsin" - glass_name = "glass of city of sin" - glass_desc = "Looking at it makes you recall every mistake you’ve made." - chemical_flags = REAGENT_CAN_BE_SYNTHESIZED diff --git a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/drink_reagents.dm b/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/drink_reagents.dm deleted file mode 100644 index d2e05d8563b2..000000000000 --- a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/drink_reagents.dm +++ /dev/null @@ -1,92 +0,0 @@ -// Modular DRINK REAGENTS, see the following file for the mixes: modular_pariah\modules\customization\modules\food_and_drinks\recipes\drinks_recipes.dm - -/datum/reagent/consumable/pinkmilk - name = "Strawberry Milk" - description = "A drink of a bygone era of milk and artificial sweetener back on a rock." - color = "#f76aeb"//rgb(247, 106, 235) - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "pinkmilk" - quality = DRINK_VERYGOOD - taste_description = "sweet strawberry and milk cream" - glass_name = "tall glass of strawberry milk" - glass_desc = "Delicious flavored strawberry syrup mixed with milk." - -/datum/reagent/consumable/pinkmilk/on_mob_life(mob/living/carbon/M) - if(prob(15)) - to_chat(M, span_notice("[pick("You cant help to smile.","You feel nostalgia all of sudden.","You remember to relax.")]")) - ..() - . = 1 - -/datum/reagent/consumable/pinktea //Tiny Tim song - name = "Strawberry Tea" - description = "A timeless classic!" - color = "#f76aeb"//rgb(247, 106, 235) - glass_icon_state = "pinktea" - quality = DRINK_VERYGOOD - taste_description = "sweet tea with a hint of strawberry" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_name = "mug of strawberry tea" - glass_desc = "Delicious traditional tea flavored with strawberries." - -/datum/reagent/consumable/pinktea/on_mob_life(mob/living/carbon/M) - if(prob(10)) - to_chat(M, span_notice("[pick("Diamond skies where white deer fly.","Sipping strawberry tea.","Silver raindrops drift through timeless, Neverending June.","Crystal ... pearls free, with love!","Beaming love into me.")]")) - ..() - . = TRUE - -/datum/reagent/consumable/catnip_tea - name = "Catnip Tea" - description = "A sleepy and tasty catnip tea!" - color = "#101000" // rgb: 16, 16, 0 - taste_description = "sugar and catnip" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "catnip_tea" - glass_name = "glass of catnip tea" - glass_desc = "A purrfect drink for a cat." - -/datum/reagent/consumable/catnip_tea/on_mob_life(mob/living/carbon/M) - M.stamina.adjust(-3) - if(prob(20)) - M.emote("nya") - if(prob(20)) - to_chat(M, span_notice("[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]")) - ..() - -/datum/reagent/consumable/milkshake - name = "Milkshake" - description = "A delicious, frozen treat!" - color = "#ede9dd" //237, 233, 221 - taste_description = "richness and icecream" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "milkshake" - glass_name = "plastic cup of milkshake" - glass_desc = "Brings all the boys to the yard." - -/datum/reagent/consumable/milkshake_strawberry - name = "Strawberry Milkshake" - description = "A delicious, fruity treat!" - color = "#e39c91" //227, 156, 145 - taste_description = "strawberry and icecream" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "milkshake_strawberry" - glass_name = "plastic cup of stawberry milkshake" - glass_desc = "Best shared with friends." - -/datum/reagent/consumable/milkshake_chocolate - name = "Chocolate Milkshake" - description = "Heaven-sent chocolatey elixir." - color = "#997755" // 153,119,85 - taste_description = "richness and chocolate" - glass_icon = 'modular_pariah/master_files/icons/obj/drinks.dmi' - glass_icon_state = "milkshake_chocolate" - glass_name = "plastic cup of chocolate milkshake" - glass_desc = "Reminds you of someone, oddly enough." - -/datum/reagent/consumable/beerbatter - name = "Beer Batter" - description = "Probably not the greatest idea to drink...sludge." - color = "#f5f4e9" - taste_description = "flour and cheap booze" - glass_icon_state = "chocolatepudding" - glass_name = "glass of beer batter" - glass_desc = "Used in cooking, pure cholesterol, Scottish people eat it." diff --git a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm b/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm deleted file mode 100644 index c2d8b98547c9..000000000000 --- a/modular_pariah/modules/customization/modules/reagents/chemistry/reagents/other_reagents.dm +++ /dev/null @@ -1,13 +0,0 @@ -// Catnip -/datum/reagent/pax/catnip - name = "Catnip" - taste_description = "grass" - description = "A colourless liquid that makes people more peaceful and felines happier." - metabolization_rate = 1.75 * REAGENTS_METABOLISM - -/datum/reagent/pax/catnip/on_mob_life(mob/living/carbon/M) - if(prob(20)) - M.emote("nya") - if(prob(20)) - to_chat(M, span_notice("[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Mew")]")) - ..() diff --git a/modular_pariah/modules/hyposprays/code/hypospray_kits.dm b/modular_pariah/modules/hyposprays/code/hypospray_kits.dm index 2dcc339b2c57..20ea35d4d8a4 100644 --- a/modular_pariah/modules/hyposprays/code/hypospray_kits.dm +++ b/modular_pariah/modules/hyposprays/code/hypospray_kits.dm @@ -6,13 +6,10 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' slot_flags = ITEM_SLOT_BELT - throw_speed = 3 throw_range = 7 + var/empty = FALSE var/current_case = "firstaid" - var/static/list/case_designs - var/static/list/cmo_case_designs - var/cmo_case = FALSE //Code to give hypospray kits selectable paterns. /obj/item/storage/hypospraykit/examine(mob/living/user) @@ -21,10 +18,8 @@ /obj/item/storage/hypospraykit/Initialize() . = ..() - if(!length(case_designs)) - populate_case_designs() create_storage( - 12, + 5, canhold = typecacheof( list( /obj/item/hypospray/mkii, @@ -32,46 +27,29 @@ ) ) ) - update_icon_state() - update_icon() - - -/obj/item/storage/hypospraykit/Destroy() - for(var/obj/item in contents) - if(QDELING(loc)) - if(item.resistance_flags & INDESTRUCTIBLE) // Because we're not supposed to delete stuff that are indestructible, but I'm too lazy to do something more complex upstream now. Later, maybe. - item.forceMove(get_turf(src)) - . = ..() + update_appearance() +/obj/item/storage/hypospraykit/update_icon_state() + icon_state = "[current_case]-mini" + return ..() -/obj/item/storage/hypospraykit/proc/populate_case_designs() - case_designs = list( +/obj/item/storage/hypospraykit/proc/case_menu(mob/user) + var/casetype = list( "firstaid" = image(icon = src.icon, icon_state = "firstaid-mini"), "brute" = image(icon = src.icon, icon_state = "brute-mini"), "burn" = image(icon = src.icon, icon_state = "burn-mini"), "toxin" = image(icon = src.icon, icon_state = "toxin-mini"), "rad" = image(icon = src.icon, icon_state = "rad-mini"), "purple" = image(icon = src.icon, icon_state = "purple-mini"), - "oxy" = image(icon = src.icon, icon_state = "oxy-mini")) - cmo_case_designs = list( - "tactical" = image(icon= src.icon, icon_state = "tactical-mini")) - cmo_case_designs += case_designs - -/obj/item/storage/hypospraykit/update_icon_state() - . = ..() - icon_state = "[current_case]-mini" + "oxy" = image(icon = src.icon, icon_state = "oxy-mini") + ) -/obj/item/storage/hypospraykit/proc/case_menu(mob/user) - if(.) - return - var/casetype = cmo_case_designs - if(!src.cmo_case) - casetype = case_designs var/choice = show_radial_menu(user, src , casetype, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 42, require_near = TRUE) if(!choice) return FALSE + current_case = choice - update_icon() + update_appearance() /obj/item/storage/hypospraykit/proc/check_menu(mob/user) if(!istype(user)) @@ -102,13 +80,12 @@ desc = "A kit containing a deluxe hypospray and vials." icon_state = "tactical-mini" current_case = "tactical" - cmo_case = TRUE /obj/item/storage/hypospraykit/cmo/PopulateContents() if(empty) return new /obj/item/hypospray/mkii/cmo(src) - new /obj/item/reagent_containers/glass/vial/large/multiver(src) + new /obj/item/reagent_containers/glass/vial/large/dylovene(src) new /obj/item/reagent_containers/glass/vial/large/salglu(src) new /obj/item/reagent_containers/glass/vial/large/synthflesh(src) @@ -125,3 +102,15 @@ /obj/item/storage/box/hypospray/PopulateContents() for(var/i in 1 to 4) new /obj/item/storage/hypospraykit/empty(src) + +/obj/item/storage/hypospraykit/experimental + name = "experimental hypospray kit" + desc = "A kit containing an experimental hypospray and pre-loaded vials." + icon_state = "tactical-mini" + +/obj/item/storage/hypospraykit/PopulateContents() + new /obj/item/hypospray/mkii/cmo(src) + new /obj/item/reagent_containers/glass/vial/large/dylovene(src) + new /obj/item/reagent_containers/glass/vial/large/salglu(src) + new /obj/item/reagent_containers/glass/vial/large/tricordrazine(src) + new /obj/item/reagent_containers/glass/vial/large/meralyne(src) diff --git a/modular_pariah/modules/hyposprays/code/hyposprays_II.dm b/modular_pariah/modules/hyposprays/code/hyposprays_II.dm index c9051ed8e023..4212e6a13453 100644 --- a/modular_pariah/modules/hyposprays/code/hyposprays_II.dm +++ b/modular_pariah/modules/hyposprays/code/hyposprays_II.dm @@ -20,7 +20,7 @@ name = "hypospray mk.II" icon_state = "hypo2" icon = 'modular_pariah/modules/hyposprays/icons/hyposprays.dmi' - desc = "A new development from DeForest Medical, this hypospray takes 60-unit vials as the drug supply for easy swapping." + desc = "An experimental high-capacity refillable auto injector." w_class = WEIGHT_CLASS_TINY var/list/allowed_containers = list(/obj/item/reagent_containers/glass/vial/small) /// Is the hypospray only able to use small vials. Relates to the loaded overlays @@ -46,10 +46,9 @@ var/penetrates = null /obj/item/hypospray/mkii/cmo - name = "hypospray mk.II deluxe" + name = "hypospray mk.II" allowed_containers = list(/obj/item/reagent_containers/glass/vial/small, /obj/item/reagent_containers/glass/vial/large) icon_state = "cmo2" - desc = "The deluxe hypospray can take larger 120-unit vials. It also acts faster and can deliver more reagents per spray." resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF start_vial = /obj/item/reagent_containers/glass/vial/large/deluxe small_only = FALSE @@ -64,10 +63,13 @@ if(!spawnwithvial) update_appearance() return + if(start_vial) vial = new start_vial update_appearance() + AddElement(/datum/element/update_icon_updates_onmob, ITEM_SLOT_HANDS) + /obj/item/hypospray/mkii/update_overlays() . = ..() if(!vial) @@ -83,10 +85,6 @@ chem_loaded.color = vial.chem_color . += chem_loaded -/obj/item/hypospray/mkii/ComponentInitialize() - . = ..() - AddElement(/datum/element/update_icon_updates_onmob) - /obj/item/hypospray/mkii/update_icon_state() . = ..() var/icon_suffix = "-s" @@ -197,7 +195,7 @@ return if(iscarbon(injectee)) - var/obj/item/bodypart/affecting = injectee.get_bodypart(check_zone(user.zone_selected)) + var/obj/item/bodypart/affecting = injectee.get_bodypart(deprecise_zone(user.zone_selected)) if(!affecting) to_chat(user, span_warning("The limb is missing!")) return @@ -232,7 +230,7 @@ if(HYPO_INJECT) vial.reagents.trans_to(injectee, vial.amount_per_transfer_from_this, methods = INJECT) if(HYPO_SPRAY) - vial.reagents.trans_to(injectee, vial.amount_per_transfer_from_this, methods = PATCH) + vial.reagents.trans_to(injectee, vial.amount_per_transfer_from_this, methods = TOUCH) var/long_sound = vial.amount_per_transfer_from_this >= 15 playsound(loc, long_sound ? 'modular_pariah/modules/hyposprays/sound/hypospray_long.ogg' : pick('modular_pariah/modules/hyposprays/sound/hypospray.ogg','modular_pariah/modules/hyposprays/sound/hypospray2.ogg'), 50, 1, -1) diff --git a/modular_pariah/modules/hyposprays/code/hypovials.dm b/modular_pariah/modules/hyposprays/code/hypovials.dm index fb20d6b1ef22..c33b143e1a8e 100644 --- a/modular_pariah/modules/hyposprays/code/hypovials.dm +++ b/modular_pariah/modules/hyposprays/code/hypovials.dm @@ -12,28 +12,28 @@ var/chem_color //Used for hypospray overlay /obj/item/reagent_containers/glass/vial/update_overlays() - . = ..() - if(!fill_icon_thresholds) - return - if(reagents.total_volume) - var/fill_name = fill_icon_state? fill_icon_state : icon_state - var/fill_overlay = 10 - switch(round((reagents.total_volume / volume)*100)) - if(1 to 24) - fill_overlay = 10 - if(25 to 49) - fill_overlay = 25 - if(50 to 74) - fill_overlay = 50 - if(75 to 89) - fill_overlay = 75 - if(89 to 100) - fill_overlay = 100 - var/mutable_appearance/filling = mutable_appearance('modular_pariah/modules/hyposprays/icons/hypospray_fillings.dmi', "[fill_name][fill_overlay]") + . = ..() + if(!fill_icon_thresholds) + return + if(reagents.total_volume) + var/fill_name = fill_icon_state? fill_icon_state : icon_state + var/fill_overlay = 10 + switch(round((reagents.total_volume / volume)*100)) + if(1 to 24) + fill_overlay = 10 + if(25 to 49) + fill_overlay = 25 + if(50 to 74) + fill_overlay = 50 + if(75 to 89) + fill_overlay = 75 + if(89 to 100) + fill_overlay = 100 + var/mutable_appearance/filling = mutable_appearance('modular_pariah/modules/hyposprays/icons/hypospray_fillings.dmi', "[fill_name][fill_overlay]") - filling.color = mix_color_from_reagents(reagents.reagent_list) - chem_color = filling.color - . += filling + filling.color = mix_color_from_reagents(reagents.reagent_list) + chem_color = filling.color + . += filling /obj/item/reagent_containers/glass/vial/Initialize() . = ..() @@ -61,16 +61,24 @@ //Hypos that are in the CMO's kit round start /obj/item/reagent_containers/glass/vial/large/deluxe name = "deluxe hypovial" - list_reagents = list(/datum/reagent/medicine/omnizine = 20, /datum/reagent/medicine/leporazine = 20, /datum/reagent/medicine/atropine = 20) + list_reagents = list(/datum/reagent/medicine/tricordrazine = 40, /datum/reagent/medicine/leporazine = 40, /datum/reagent/medicine/atropine = 40) /obj/item/reagent_containers/glass/vial/large/salglu - name = "large green hypovial (salglu)" - list_reagents = list(/datum/reagent/medicine/salglu_solution = 60) + name = "large white hypovial (saline glucose)" + list_reagents = list(/datum/reagent/medicine/saline_glucose = 120) /obj/item/reagent_containers/glass/vial/large/synthflesh name = "large orange hypovial (synthflesh)" - list_reagents = list(/datum/reagent/medicine/c2/synthflesh = 60) + list_reagents = list(/datum/reagent/medicine/synthflesh = 120) + +/obj/item/reagent_containers/glass/vial/large/dylovene + name = "large green hypovial (dylovene)" + list_reagents = list(/datum/reagent/medicine/dylovene = 120) + +/obj/item/reagent_containers/glass/vial/large/tricordrazine + name = "large purple hypovial (tricordrazine)" + list_reagents = list(/datum/reagent/medicine/tricordrazine = 120) -/obj/item/reagent_containers/glass/vial/large/multiver - name = "large black hypovial (multiver)" - list_reagents = list(/datum/reagent/medicine/c2/multiver = 60) +/obj/item/reagent_containers/glass/vial/large/meralyne + name = "large red hypovial (meralyne)" + list_reagents = list(/datum/reagent/medicine/meralyne = 120) diff --git a/modular_pariah/modules/indicators/code/ssd_indicator.dm b/modular_pariah/modules/indicators/code/ssd_indicator.dm deleted file mode 100644 index 0bc5ea784937..000000000000 --- a/modular_pariah/modules/indicators/code/ssd_indicator.dm +++ /dev/null @@ -1,38 +0,0 @@ -GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('modular_pariah/modules/indicators/icons/ssd_indicator.dmi', "default0", FLY_LAYER)) - -/mob/living - var/ssd_indicator = FALSE - var/lastclienttime = 0 - -/mob/living/proc/set_ssd_indicator(var/state) - if(state == ssd_indicator) - return - ssd_indicator = state - if(ssd_indicator) - add_overlay(GLOB.ssd_indicator_overlay) - log_message("has went SSD and got their indicator!", LOG_ATTACK) - else - cut_overlay(GLOB.ssd_indicator_overlay) - log_message("is no longer SSD and lost their indicator!", LOG_ATTACK) - -/mob/living/Login() - . = ..() - set_ssd_indicator(FALSE) - -/mob/living/Logout() - lastclienttime = world.time - set_ssd_indicator(TRUE) - . = ..() - -//Temporary, look below for the reason -/mob/living/ghostize(can_reenter_corpse = TRUE) - . = ..() - set_ssd_indicator(FALSE) - -/* -//EDIT - TRANSFER CKEY IS NOT A THING ON THE TG CODEBASE, if things break too bad because of it, consider implementing it -//This proc should stop mobs from having the overlay when someone keeps jumping control of mobs, unfortunately it causes Aghosts to have their character without the SSD overlay, I wasn't able to find a better proc unfortunately -/mob/living/transfer_ckey(mob/new_mob, send_signal = TRUE) - ..() - set_ssd_indicator(FALSE) -*/ diff --git a/modular_pariah/modules/indicators/code/typing_indicator.dm b/modular_pariah/modules/indicators/code/typing_indicator.dm index a86bb051bdc6..115b16a1e7ab 100644 --- a/modular_pariah/modules/indicators/code/typing_indicator.dm +++ b/modular_pariah/modules/indicators/code/typing_indicator.dm @@ -15,6 +15,8 @@ GLOBAL_VAR_INIT(emote_indicator_overlay, mutable_appearance('modular_pariah/modu cut_overlay(GLOB.typing_indicator_overlay) cut_overlay(GLOB.emote_indicator_overlay) + UPDATE_OO_IF_PRESENT + /mob/living/key_down(_key, client/user) if(!typing_indicator && stat == CONSCIOUS) var/list/binds = user.prefs?.key_bindings_by_key[_key] diff --git a/modular_pariah/modules/indicators/icons/ssd_indicator.dmi b/modular_pariah/modules/indicators/icons/ssd_indicator.dmi deleted file mode 100644 index 3f7d100b6c67..000000000000 Binary files a/modular_pariah/modules/indicators/icons/ssd_indicator.dmi and /dev/null differ diff --git a/modular_pariah/modules/pixel_shift/code/pixel_shift.dm b/modular_pariah/modules/pixel_shift/code/pixel_shift.dm index ade0f8a950ea..58d5ff78b893 100644 --- a/modular_pariah/modules/pixel_shift/code/pixel_shift.dm +++ b/modular_pariah/modules/pixel_shift/code/pixel_shift.dm @@ -4,7 +4,7 @@ var/shifting //If we are in the shifting setting. /datum/keybinding/mob/pixel_shift - hotkey_keys = list("B") + hotkey_keys = list("J") name = "pixel_shift" full_name = "Pixel Shift" description = "Shift your characters offset." diff --git a/modular_pariah/modules/radiosound/code/headset.dm b/modular_pariah/modules/radiosound/code/headset.dm index 38152fe4a97e..6450bde8c016 100644 --- a/modular_pariah/modules/radiosound/code/headset.dm +++ b/modular_pariah/modules/radiosound/code/headset.dm @@ -8,6 +8,12 @@ radiosound = 'modular_pariah/modules/radiosound/sound/radio/security.ogg' /obj/item/radio/headset/talk_into(mob/living/M, message, channel, list/spans, datum/language/language, list/message_mods) + if(isnull(language)) + language = M?.get_selected_language() + + if(istype(language, /datum/language/visual)) + return + if(radiosound && listening) playsound(M, radiosound, rand(20, 30)) . = ..() diff --git a/modular_pariah/modules/tableflip/code/flipped_table.dm b/modular_pariah/modules/tableflip/code/flipped_table.dm deleted file mode 100644 index c8928db5e330..000000000000 --- a/modular_pariah/modules/tableflip/code/flipped_table.dm +++ /dev/null @@ -1,98 +0,0 @@ -/obj/structure/flippedtable - name = "flipped table" - desc = "A flipped table." - icon = 'modular_pariah/modules/tableflip/icons/flipped_tables.dmi' - icon_state = "metal-flipped" - anchored = TRUE - density = TRUE - layer = ABOVE_MOB_LAYER - opacity = FALSE - var/table_type = /obj/structure/table - -/obj/structure/flippedtable/Initialize() - . = ..() - - var/static/list/loc_connections = list( - COMSIG_ATOM_EXIT = PROC_REF(on_exit), - ) - - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/flippedtable/CanAllowThrough(atom/movable/mover, turf/target) - . = ..() - var/attempted_dir = get_dir(loc, target) - if(table_type == /obj/structure/table/glass) //Glass table, jolly ranchers pass - if(istype(mover) && (mover.pass_flags & PASSGLASS)) - return TRUE - if(istype(mover, /obj/projectile)) - var/obj/projectile/P = mover - //Lets through bullets shot from behind the cover of the table - if(P.trajectory && angle2dir_cardinal(P.trajectory.angle) == dir) - return TRUE - return FALSE - if(attempted_dir == dir) - return FALSE - else if(attempted_dir != dir) - return TRUE - -/obj/structure/flippedtable/proc/on_exit(datum/source, atom/movable/leaving, atom/new_location) - SIGNAL_HANDLER - - if(table_type == /obj/structure/table/glass) //Glass table, jolly ranchers pass - if(istype(leaving) && (leaving.pass_flags & PASSGLASS)) - return - - if(istype(leaving, /obj/projectile)) - return - - if(get_dir(leaving.loc, new_location) == dir) - return COMPONENT_ATOM_BLOCK_EXIT - -/obj/structure/flippedtable/CtrlShiftClick(mob/user) - . = ..() - if(!istype(user) || !user.can_interact_with(src)) - return FALSE - user.visible_message(span_danger("[user] starts flipping [src]!"), span_notice("You start flipping over the [src]!")) - if(do_after(user, max_integrity/4)) - var/obj/structure/table/T = new table_type(src.loc) - T.update_integrity(src.get_integrity()) - user.visible_message(span_danger("[user] flips over the [src]!"), span_notice("You flip over the [src]!")) - playsound(src, 'sound/items/trayhit2.ogg', 100) - qdel(src) - -//TABLES - -/obj/structure/table/CtrlShiftClick(mob/living/user) - . = ..() - if(!istype(user) || !user.can_interact_with(src) || isobserver(user)) - return - if(can_flip) - user.visible_message(span_danger("[user] starts flipping [src]!"), span_notice("You start flipping over the [src]!")) - if(do_after(user, max_integrity/4)) - var/obj/structure/flippedtable/T = new flipped_table_type(src.loc) - T.name = "flipped [src.name]" - T.desc = "[src.desc] It is flipped!" - T.icon_state = src.base_icon_state - var/new_dir = get_dir(user, T) - T.dir = new_dir - if(new_dir == NORTH) - T.layer = BELOW_MOB_LAYER - T.max_integrity = src.max_integrity - T.update_integrity(src.get_integrity()) - T.table_type = src.type - user.visible_message(span_danger("[user] flips over the [src]!"), span_notice("You flip over the [src]!")) - playsound(src, 'sound/items/trayhit2.ogg', 100) - qdel(src) - -/obj/structure/table - var/flipped_table_type = /obj/structure/flippedtable - var/can_flip = TRUE - -/obj/structure/table/rolling - can_flip = FALSE - -/obj/structure/table/reinforced - can_flip = FALSE - -/obj/structure/table/optable - can_flip = FALSE diff --git a/rust_g.dll b/rust_g.dll index 059c79e34029..30f63e72f4b1 100644 Binary files a/rust_g.dll and b/rust_g.dll differ diff --git a/sound/ambience/maintambience.ogg b/sound/ambience/maintambience.ogg index 1e98d9db13cb..4bbd39b8ba50 100644 Binary files a/sound/ambience/maintambience.ogg and b/sound/ambience/maintambience.ogg differ diff --git a/sound/creatures/hog/hogattack.ogg b/sound/creatures/hog/hogattack.ogg new file mode 100644 index 000000000000..176516d28c38 Binary files /dev/null and b/sound/creatures/hog/hogattack.ogg differ diff --git a/sound/creatures/hog/hogdeath.ogg b/sound/creatures/hog/hogdeath.ogg new file mode 100644 index 000000000000..ea44854d7289 Binary files /dev/null and b/sound/creatures/hog/hogdeath.ogg differ diff --git a/sound/creatures/hog/hoggrunt.ogg b/sound/creatures/hog/hoggrunt.ogg new file mode 100644 index 000000000000..80c61b20db9e Binary files /dev/null and b/sound/creatures/hog/hoggrunt.ogg differ diff --git a/sound/creatures/hog/hogscream.ogg b/sound/creatures/hog/hogscream.ogg new file mode 100644 index 000000000000..159160b8f355 Binary files /dev/null and b/sound/creatures/hog/hogscream.ogg differ diff --git a/sound/effects/autoinjector.ogg b/sound/effects/autoinjector.ogg new file mode 100644 index 000000000000..e4dd0331d0e4 Binary files /dev/null and b/sound/effects/autoinjector.ogg differ diff --git a/sound/effects/cig_light.ogg b/sound/effects/cig_light.ogg new file mode 100644 index 000000000000..48aef9c344a4 Binary files /dev/null and b/sound/effects/cig_light.ogg differ diff --git a/sound/effects/cig_snuff.ogg b/sound/effects/cig_snuff.ogg new file mode 100644 index 000000000000..a4c2ce35d541 Binary files /dev/null and b/sound/effects/cig_snuff.ogg differ diff --git a/sound/effects/footstep/asteroid1.ogg b/sound/effects/footstep/asteroid1.ogg index 1cb215dc7824..d60f73f50d62 100644 Binary files a/sound/effects/footstep/asteroid1.ogg and b/sound/effects/footstep/asteroid1.ogg differ diff --git a/sound/effects/footstep/asteroid2.ogg b/sound/effects/footstep/asteroid2.ogg index 331d0ef2417f..93a4652774da 100644 Binary files a/sound/effects/footstep/asteroid2.ogg and b/sound/effects/footstep/asteroid2.ogg differ diff --git a/sound/effects/footstep/asteroid3.ogg b/sound/effects/footstep/asteroid3.ogg index 90fbf251a0e3..20aee86df8ee 100644 Binary files a/sound/effects/footstep/asteroid3.ogg and b/sound/effects/footstep/asteroid3.ogg differ diff --git a/sound/effects/footstep/asteroid4.ogg b/sound/effects/footstep/asteroid4.ogg index 186ff17a4391..fce28d927d0b 100644 Binary files a/sound/effects/footstep/asteroid4.ogg and b/sound/effects/footstep/asteroid4.ogg differ diff --git a/sound/effects/footstep/asteroid5.ogg b/sound/effects/footstep/asteroid5.ogg deleted file mode 100644 index 0ea4c962d0df..000000000000 Binary files a/sound/effects/footstep/asteroid5.ogg and /dev/null differ diff --git a/sound/effects/footstep/carpet1.ogg b/sound/effects/footstep/carpet1.ogg index 2735a9bf3dce..f18e3e9dc0b8 100644 Binary files a/sound/effects/footstep/carpet1.ogg and b/sound/effects/footstep/carpet1.ogg differ diff --git a/sound/effects/footstep/carpet2.ogg b/sound/effects/footstep/carpet2.ogg index 07e5f2320aad..ac87246fb70f 100644 Binary files a/sound/effects/footstep/carpet2.ogg and b/sound/effects/footstep/carpet2.ogg differ diff --git a/sound/effects/footstep/carpet3.ogg b/sound/effects/footstep/carpet3.ogg index edb0193f6e22..0825a8cbca40 100644 Binary files a/sound/effects/footstep/carpet3.ogg and b/sound/effects/footstep/carpet3.ogg differ diff --git a/sound/effects/footstep/carpet4.ogg b/sound/effects/footstep/carpet4.ogg index c9598e2b7367..2dcde09d67b9 100644 Binary files a/sound/effects/footstep/carpet4.ogg and b/sound/effects/footstep/carpet4.ogg differ diff --git a/sound/effects/footstep/carpet5.ogg b/sound/effects/footstep/carpet5.ogg deleted file mode 100644 index 076818323ae9..000000000000 Binary files a/sound/effects/footstep/carpet5.ogg and /dev/null differ diff --git a/sound/effects/footstep/catwalk1.ogg b/sound/effects/footstep/catwalk1.ogg index 5d6ad7b4a00f..fd490fc17651 100644 Binary files a/sound/effects/footstep/catwalk1.ogg and b/sound/effects/footstep/catwalk1.ogg differ diff --git a/sound/effects/footstep/catwalk2.ogg b/sound/effects/footstep/catwalk2.ogg index 07a624dbe490..37f041036540 100644 Binary files a/sound/effects/footstep/catwalk2.ogg and b/sound/effects/footstep/catwalk2.ogg differ diff --git a/sound/effects/footstep/catwalk3.ogg b/sound/effects/footstep/catwalk3.ogg index acff22e3864f..e09a4f0d7f83 100644 Binary files a/sound/effects/footstep/catwalk3.ogg and b/sound/effects/footstep/catwalk3.ogg differ diff --git a/sound/effects/footstep/catwalk4.ogg b/sound/effects/footstep/catwalk4.ogg index 7235a6b9febe..f2b8c1c37e3a 100644 Binary files a/sound/effects/footstep/catwalk4.ogg and b/sound/effects/footstep/catwalk4.ogg differ diff --git a/sound/effects/footstep/catwalk5.ogg b/sound/effects/footstep/catwalk5.ogg deleted file mode 100644 index c33f248acd6c..000000000000 Binary files a/sound/effects/footstep/catwalk5.ogg and /dev/null differ diff --git a/sound/effects/footstep/crawl1.ogg b/sound/effects/footstep/crawl1.ogg index 61a73a58d0cd..912c6678cad2 100644 Binary files a/sound/effects/footstep/crawl1.ogg and b/sound/effects/footstep/crawl1.ogg differ diff --git a/sound/effects/footstep/floor1.ogg b/sound/effects/footstep/floor1.ogg index 1e3e15583996..6050556499db 100644 Binary files a/sound/effects/footstep/floor1.ogg and b/sound/effects/footstep/floor1.ogg differ diff --git a/sound/effects/footstep/floor2.ogg b/sound/effects/footstep/floor2.ogg index cce5a25d8293..e65614bb24b1 100644 Binary files a/sound/effects/footstep/floor2.ogg and b/sound/effects/footstep/floor2.ogg differ diff --git a/sound/effects/footstep/floor3.ogg b/sound/effects/footstep/floor3.ogg index 16ab67f729cb..882b3c516d84 100644 Binary files a/sound/effects/footstep/floor3.ogg and b/sound/effects/footstep/floor3.ogg differ diff --git a/sound/effects/footstep/floor4.ogg b/sound/effects/footstep/floor4.ogg index 9ef15430ff8c..f6452e3d45ec 100644 Binary files a/sound/effects/footstep/floor4.ogg and b/sound/effects/footstep/floor4.ogg differ diff --git a/sound/effects/footstep/floor5.ogg b/sound/effects/footstep/floor5.ogg deleted file mode 100644 index 0f6a66057deb..000000000000 Binary files a/sound/effects/footstep/floor5.ogg and /dev/null differ diff --git a/sound/effects/footstep/grass1.ogg b/sound/effects/footstep/grass1.ogg index 357547cd77a3..74b069d3f86b 100644 Binary files a/sound/effects/footstep/grass1.ogg and b/sound/effects/footstep/grass1.ogg differ diff --git a/sound/effects/footstep/grass2.ogg b/sound/effects/footstep/grass2.ogg index 75bf8657e8d9..a64957fe6a4c 100644 Binary files a/sound/effects/footstep/grass2.ogg and b/sound/effects/footstep/grass2.ogg differ diff --git a/sound/effects/footstep/grass3.ogg b/sound/effects/footstep/grass3.ogg index 04f82872b1d2..acb79479f2f8 100644 Binary files a/sound/effects/footstep/grass3.ogg and b/sound/effects/footstep/grass3.ogg differ diff --git a/sound/effects/footstep/grass4.ogg b/sound/effects/footstep/grass4.ogg index 6d736f2fb2d1..30198a21223b 100644 Binary files a/sound/effects/footstep/grass4.ogg and b/sound/effects/footstep/grass4.ogg differ diff --git a/sound/effects/footstep/hardbarefoot1.ogg b/sound/effects/footstep/hardbarefoot1.ogg index 261487219178..e173546dd5a6 100644 Binary files a/sound/effects/footstep/hardbarefoot1.ogg and b/sound/effects/footstep/hardbarefoot1.ogg differ diff --git a/sound/effects/footstep/hardbarefoot2.ogg b/sound/effects/footstep/hardbarefoot2.ogg index 7d89d96105b9..f664d9acd4bf 100644 Binary files a/sound/effects/footstep/hardbarefoot2.ogg and b/sound/effects/footstep/hardbarefoot2.ogg differ diff --git a/sound/effects/footstep/hardbarefoot3.ogg b/sound/effects/footstep/hardbarefoot3.ogg index 639751fab0f0..7ff2884ebb4f 100644 Binary files a/sound/effects/footstep/hardbarefoot3.ogg and b/sound/effects/footstep/hardbarefoot3.ogg differ diff --git a/sound/effects/footstep/hardbarefoot4.ogg b/sound/effects/footstep/hardbarefoot4.ogg index 9cf363a18cac..54cee9985900 100644 Binary files a/sound/effects/footstep/hardbarefoot4.ogg and b/sound/effects/footstep/hardbarefoot4.ogg differ diff --git a/sound/effects/footstep/hardbarefoot5.ogg b/sound/effects/footstep/hardbarefoot5.ogg deleted file mode 100644 index 72ebeca84d3d..000000000000 Binary files a/sound/effects/footstep/hardbarefoot5.ogg and /dev/null differ diff --git a/sound/effects/footstep/plating1.ogg b/sound/effects/footstep/plating1.ogg index 0df770e66387..af461a6bd1df 100644 Binary files a/sound/effects/footstep/plating1.ogg and b/sound/effects/footstep/plating1.ogg differ diff --git a/sound/effects/footstep/plating2.ogg b/sound/effects/footstep/plating2.ogg index 314b9133d255..15fcf5326771 100644 Binary files a/sound/effects/footstep/plating2.ogg and b/sound/effects/footstep/plating2.ogg differ diff --git a/sound/effects/footstep/plating3.ogg b/sound/effects/footstep/plating3.ogg index 5c571d77eb6b..2dfa243239d1 100644 Binary files a/sound/effects/footstep/plating3.ogg and b/sound/effects/footstep/plating3.ogg differ diff --git a/sound/effects/footstep/plating4.ogg b/sound/effects/footstep/plating4.ogg index 5953262764ba..d31a61ca4d84 100644 Binary files a/sound/effects/footstep/plating4.ogg and b/sound/effects/footstep/plating4.ogg differ diff --git a/sound/effects/footstep/plating5.ogg b/sound/effects/footstep/plating5.ogg deleted file mode 100644 index 4676a637a6d2..000000000000 Binary files a/sound/effects/footstep/plating5.ogg and /dev/null differ diff --git a/sound/effects/footstep/water1.ogg b/sound/effects/footstep/water1.ogg index f22cbf28482b..001fe3c091dd 100644 Binary files a/sound/effects/footstep/water1.ogg and b/sound/effects/footstep/water1.ogg differ diff --git a/sound/effects/footstep/water2.ogg b/sound/effects/footstep/water2.ogg index e2a47650c63a..3a97a3d69e10 100644 Binary files a/sound/effects/footstep/water2.ogg and b/sound/effects/footstep/water2.ogg differ diff --git a/sound/effects/footstep/water3.ogg b/sound/effects/footstep/water3.ogg index 97ce152a5ce2..b6e8f3d316d3 100644 Binary files a/sound/effects/footstep/water3.ogg and b/sound/effects/footstep/water3.ogg differ diff --git a/sound/effects/footstep/water4.ogg b/sound/effects/footstep/water4.ogg index 5778a52560d5..02a8d71f70e9 100644 Binary files a/sound/effects/footstep/water4.ogg and b/sound/effects/footstep/water4.ogg differ diff --git a/sound/effects/footstep/wood1.ogg b/sound/effects/footstep/wood1.ogg index c76fc423fc24..3ac214246897 100644 Binary files a/sound/effects/footstep/wood1.ogg and b/sound/effects/footstep/wood1.ogg differ diff --git a/sound/effects/footstep/wood2.ogg b/sound/effects/footstep/wood2.ogg index 71dc1aa9679a..ac5526816985 100644 Binary files a/sound/effects/footstep/wood2.ogg and b/sound/effects/footstep/wood2.ogg differ diff --git a/sound/effects/footstep/wood3.ogg b/sound/effects/footstep/wood3.ogg index bf86889006e9..3154b644928b 100644 Binary files a/sound/effects/footstep/wood3.ogg and b/sound/effects/footstep/wood3.ogg differ diff --git a/sound/effects/footstep/wood4.ogg b/sound/effects/footstep/wood4.ogg index 44734425ce68..ab2a9d0f6c76 100644 Binary files a/sound/effects/footstep/wood4.ogg and b/sound/effects/footstep/wood4.ogg differ diff --git a/sound/effects/footstep/wood5.ogg b/sound/effects/footstep/wood5.ogg deleted file mode 100644 index 5ad4fa81e77f..000000000000 Binary files a/sound/effects/footstep/wood5.ogg and /dev/null differ diff --git a/sound/effects/footstep/woodbarefoot1.ogg b/sound/effects/footstep/woodbarefoot1.ogg index bb66da770e36..debd4802f0c8 100644 Binary files a/sound/effects/footstep/woodbarefoot1.ogg and b/sound/effects/footstep/woodbarefoot1.ogg differ diff --git a/sound/effects/footstep/woodbarefoot2.ogg b/sound/effects/footstep/woodbarefoot2.ogg index 67397d868ee2..bebff9ee8c22 100644 Binary files a/sound/effects/footstep/woodbarefoot2.ogg and b/sound/effects/footstep/woodbarefoot2.ogg differ diff --git a/sound/effects/footstep/woodbarefoot3.ogg b/sound/effects/footstep/woodbarefoot3.ogg index 113a89003a65..ff8db4a6b7cc 100644 Binary files a/sound/effects/footstep/woodbarefoot3.ogg and b/sound/effects/footstep/woodbarefoot3.ogg differ diff --git a/sound/effects/footstep/woodbarefoot4.ogg b/sound/effects/footstep/woodbarefoot4.ogg index ccc2e82075b9..76f8214c6a66 100644 Binary files a/sound/effects/footstep/woodbarefoot4.ogg and b/sound/effects/footstep/woodbarefoot4.ogg differ diff --git a/sound/effects/footstep/woodbarefoot5.ogg b/sound/effects/footstep/woodbarefoot5.ogg deleted file mode 100644 index 6fbce27109ee..000000000000 Binary files a/sound/effects/footstep/woodbarefoot5.ogg and /dev/null differ diff --git a/sound/effects/glass_step_1.ogg b/sound/effects/glass_step_1.ogg new file mode 100644 index 000000000000..4c5af0b8ca31 Binary files /dev/null and b/sound/effects/glass_step_1.ogg differ diff --git a/sound/effects/glass_step_2.ogg b/sound/effects/glass_step_2.ogg new file mode 100644 index 000000000000..0ed01ca47717 Binary files /dev/null and b/sound/effects/glass_step_2.ogg differ diff --git a/sound/effects/inhale.ogg b/sound/effects/inhale.ogg new file mode 100644 index 000000000000..a55f4d88d6e5 Binary files /dev/null and b/sound/effects/inhale.ogg differ diff --git a/sound/effects/ladder.ogg b/sound/effects/ladder.ogg new file mode 100644 index 000000000000..7872c8a68a03 Binary files /dev/null and b/sound/effects/ladder.ogg differ diff --git a/sound/effects/ladder2.ogg b/sound/effects/ladder2.ogg new file mode 100644 index 000000000000..1af48947f97a Binary files /dev/null and b/sound/effects/ladder2.ogg differ diff --git a/sound/effects/ladder3.ogg b/sound/effects/ladder3.ogg new file mode 100644 index 000000000000..5d10cd6bcde9 Binary files /dev/null and b/sound/effects/ladder3.ogg differ diff --git a/sound/effects/ladder4.ogg b/sound/effects/ladder4.ogg new file mode 100644 index 000000000000..94790afb9f74 Binary files /dev/null and b/sound/effects/ladder4.ogg differ diff --git a/sound/effects/paint_1.ogg b/sound/effects/paint_1.ogg new file mode 100644 index 000000000000..fcf78feef409 Binary files /dev/null and b/sound/effects/paint_1.ogg differ diff --git a/sound/effects/paint_2.ogg b/sound/effects/paint_2.ogg new file mode 100644 index 000000000000..dba2183862a6 Binary files /dev/null and b/sound/effects/paint_2.ogg differ diff --git a/sound/effects/paint_3.ogg b/sound/effects/paint_3.ogg new file mode 100644 index 000000000000..6e20018a1cfc Binary files /dev/null and b/sound/effects/paint_3.ogg differ diff --git a/sound/effects/paint_4.ogg b/sound/effects/paint_4.ogg new file mode 100644 index 000000000000..760420d72a03 Binary files /dev/null and b/sound/effects/paint_4.ogg differ diff --git a/sound/effects/shieldbash.ogg b/sound/effects/shieldbash.ogg index 6fa8e9ad9131..8cf9efeadbd0 100644 Binary files a/sound/effects/shieldbash.ogg and b/sound/effects/shieldbash.ogg differ diff --git a/sound/effects/glass_step.ogg b/sound/effects/small_glass_break.ogg similarity index 100% rename from sound/effects/glass_step.ogg rename to sound/effects/small_glass_break.ogg diff --git a/sound/effects/sneedle.ogg b/sound/effects/sneedle.ogg new file mode 100644 index 000000000000..7db7d4c3c7ed Binary files /dev/null and b/sound/effects/sneedle.ogg differ diff --git a/sound/effects/splatter2.ogg b/sound/effects/splatter2.ogg new file mode 100644 index 000000000000..36c576e4f0f5 Binary files /dev/null and b/sound/effects/splatter2.ogg differ diff --git a/sound/effects/squelch1.ogg b/sound/effects/squelch1.ogg new file mode 100644 index 000000000000..6e00b7f8f3b4 Binary files /dev/null and b/sound/effects/squelch1.ogg differ diff --git a/sound/effects/stairs_step.ogg b/sound/effects/stairs_step.ogg new file mode 100644 index 000000000000..14f3d4963ed4 Binary files /dev/null and b/sound/effects/stairs_step.ogg differ diff --git a/sound/effects/swallow.ogg b/sound/effects/swallow.ogg new file mode 100644 index 000000000000..fc548f6282dd Binary files /dev/null and b/sound/effects/swallow.ogg differ diff --git a/sound/effects/syringe_extract.ogg b/sound/effects/syringe_extract.ogg new file mode 100644 index 000000000000..8de0cf0d0a0c Binary files /dev/null and b/sound/effects/syringe_extract.ogg differ diff --git a/sound/effects/wounds/splatter2.ogg b/sound/effects/wounds/splatter2.ogg new file mode 100644 index 000000000000..36c576e4f0f5 Binary files /dev/null and b/sound/effects/wounds/splatter2.ogg differ diff --git a/sound/effects/wounds/tendon_snap1.ogg b/sound/effects/wounds/tendon_snap1.ogg new file mode 100644 index 000000000000..a287bcb06621 Binary files /dev/null and b/sound/effects/wounds/tendon_snap1.ogg differ diff --git a/sound/effects/wounds/tendon_snap2.ogg b/sound/effects/wounds/tendon_snap2.ogg new file mode 100644 index 000000000000..ce66257f7a42 Binary files /dev/null and b/sound/effects/wounds/tendon_snap2.ogg differ diff --git a/sound/effects/wounds/tendon_snap3.ogg b/sound/effects/wounds/tendon_snap3.ogg new file mode 100644 index 000000000000..99584160420a Binary files /dev/null and b/sound/effects/wounds/tendon_snap3.ogg differ diff --git a/sound/health/flatline.ogg b/sound/health/flatline.ogg new file mode 100644 index 000000000000..9b276b36fe6a Binary files /dev/null and b/sound/health/flatline.ogg differ diff --git a/sound/items/countdown.ogg b/sound/items/countdown.ogg new file mode 100644 index 000000000000..bb19300ba945 Binary files /dev/null and b/sound/items/countdown.ogg differ diff --git a/sound/items/handling/generic_pickup.ogg b/sound/items/handling/generic_pickup.ogg new file mode 100644 index 000000000000..411a884b193e Binary files /dev/null and b/sound/items/handling/generic_pickup.ogg differ diff --git a/sound/items/healthanalyzer.ogg b/sound/items/healthanalyzer.ogg new file mode 100644 index 000000000000..84a05383befd Binary files /dev/null and b/sound/items/healthanalyzer.ogg differ diff --git a/sound/items/lighter1.ogg b/sound/items/lighter1.ogg new file mode 100644 index 000000000000..cce544509d58 Binary files /dev/null and b/sound/items/lighter1.ogg differ diff --git a/sound/items/lighter2.ogg b/sound/items/lighter2.ogg new file mode 100644 index 000000000000..5294ee751fee Binary files /dev/null and b/sound/items/lighter2.ogg differ diff --git a/sound/items/pp_megaphone.ogg b/sound/items/pp_megaphone.ogg new file mode 100644 index 000000000000..2f286f307e29 Binary files /dev/null and b/sound/items/pp_megaphone.ogg differ diff --git a/sound/items/sec_hud/inspect_close.mp3 b/sound/items/sec_hud/inspect_close.mp3 new file mode 100644 index 000000000000..f1113718771c Binary files /dev/null and b/sound/items/sec_hud/inspect_close.mp3 differ diff --git a/sound/items/sec_hud/inspect_highlight.mp3 b/sound/items/sec_hud/inspect_highlight.mp3 new file mode 100644 index 000000000000..79312654c5c4 Binary files /dev/null and b/sound/items/sec_hud/inspect_highlight.mp3 differ diff --git a/sound/items/sec_hud/inspect_loop.mp3 b/sound/items/sec_hud/inspect_loop.mp3 new file mode 100644 index 000000000000..48ab005dd14a Binary files /dev/null and b/sound/items/sec_hud/inspect_loop.mp3 differ diff --git a/sound/items/sec_hud/inspect_open.mp3 b/sound/items/sec_hud/inspect_open.mp3 new file mode 100644 index 000000000000..8bd1cb2463b4 Binary files /dev/null and b/sound/items/sec_hud/inspect_open.mp3 differ diff --git a/sound/items/sec_hud/inspect_perform.mp3 b/sound/items/sec_hud/inspect_perform.mp3 new file mode 100644 index 000000000000..26c8c9b4f1db Binary files /dev/null and b/sound/items/sec_hud/inspect_perform.mp3 differ diff --git a/sound/items/sec_hud/inspect_unhighlight.mp3 b/sound/items/sec_hud/inspect_unhighlight.mp3 new file mode 100644 index 000000000000..38e6e7dea5cc Binary files /dev/null and b/sound/items/sec_hud/inspect_unhighlight.mp3 differ diff --git a/sound/machines/access_denied_hl.ogg b/sound/machines/access_denied_hl.ogg new file mode 100644 index 000000000000..37f3eedf4e58 Binary files /dev/null and b/sound/machines/access_denied_hl.ogg differ diff --git a/sound/machines/cardreader_desert.ogg b/sound/machines/cardreader_desert.ogg new file mode 100644 index 000000000000..2e4db475a4de Binary files /dev/null and b/sound/machines/cardreader_desert.ogg differ diff --git a/sound/machines/cardreader_insert.ogg b/sound/machines/cardreader_insert.ogg new file mode 100644 index 000000000000..d2a4046472d3 Binary files /dev/null and b/sound/machines/cardreader_insert.ogg differ diff --git a/sound/machines/cardreader_read.ogg b/sound/machines/cardreader_read.ogg new file mode 100644 index 000000000000..f279956f4f65 Binary files /dev/null and b/sound/machines/cardreader_read.ogg differ diff --git a/sound/machines/cash_desert.ogg b/sound/machines/cash_desert.ogg new file mode 100644 index 000000000000..6b18c1f022e5 Binary files /dev/null and b/sound/machines/cash_desert.ogg differ diff --git a/sound/machines/cash_insert.ogg b/sound/machines/cash_insert.ogg new file mode 100644 index 000000000000..e893b961ca8f Binary files /dev/null and b/sound/machines/cash_insert.ogg differ diff --git a/sound/machines/deniedbeep.ogg b/sound/machines/deniedbeep.ogg index 1dde573a98d4..8f89566f9f5c 100644 Binary files a/sound/machines/deniedbeep.ogg and b/sound/machines/deniedbeep.ogg differ diff --git a/sound/machines/doors/airlock_close.ogg b/sound/machines/doors/airlock_close.ogg index 58a06817f008..f05f9b749740 100644 Binary files a/sound/machines/doors/airlock_close.ogg and b/sound/machines/doors/airlock_close.ogg differ diff --git a/sound/machines/doors/airlock_open.ogg b/sound/machines/doors/airlock_open.ogg index d47c40d3fcea..1e08411f7a76 100644 Binary files a/sound/machines/doors/airlock_open.ogg and b/sound/machines/doors/airlock_open.ogg differ diff --git a/sound/machines/doors/blastdoor_close.ogg b/sound/machines/doors/blastdoor_close.ogg index c48a0bd7d6f6..fc99dedc9b29 100644 Binary files a/sound/machines/doors/blastdoor_close.ogg and b/sound/machines/doors/blastdoor_close.ogg differ diff --git a/sound/machines/doors/blastdoor_open.ogg b/sound/machines/doors/blastdoor_open.ogg index 4f61ea2302af..491897f7bf56 100644 Binary files a/sound/machines/doors/blastdoor_open.ogg and b/sound/machines/doors/blastdoor_open.ogg differ diff --git a/sound/machines/ekg_alert.ogg b/sound/machines/ekg_alert.ogg new file mode 100644 index 000000000000..ecc04d4c0796 Binary files /dev/null and b/sound/machines/ekg_alert.ogg differ diff --git a/sound/machines/flatline.ogg b/sound/machines/flatline.ogg new file mode 100644 index 000000000000..422ae2657645 Binary files /dev/null and b/sound/machines/flatline.ogg differ diff --git a/sound/machines/medbayscanner.ogg b/sound/machines/medbayscanner.ogg new file mode 100644 index 000000000000..a3402e330460 Binary files /dev/null and b/sound/machines/medbayscanner.ogg differ diff --git a/sound/machines/quiet_beep.ogg b/sound/machines/quiet_beep.ogg new file mode 100644 index 000000000000..332d4095915f Binary files /dev/null and b/sound/machines/quiet_beep.ogg differ diff --git a/sound/machines/quiet_double_beep.ogg b/sound/machines/quiet_double_beep.ogg new file mode 100644 index 000000000000..ebfedbdf85e5 Binary files /dev/null and b/sound/machines/quiet_double_beep.ogg differ diff --git a/sound/storage/box.ogg b/sound/storage/box.ogg new file mode 100644 index 000000000000..9d25a761cc8b Binary files /dev/null and b/sound/storage/box.ogg differ diff --git a/sound/storage/briefcase.ogg b/sound/storage/briefcase.ogg new file mode 100644 index 000000000000..e841e03747cd Binary files /dev/null and b/sound/storage/briefcase.ogg differ diff --git a/sound/storage/pillbottle.ogg b/sound/storage/pillbottle.ogg new file mode 100644 index 000000000000..1c47fbeb73ff Binary files /dev/null and b/sound/storage/pillbottle.ogg differ diff --git a/sound/storage/smallbox.ogg b/sound/storage/smallbox.ogg new file mode 100644 index 000000000000..d4bb587a05fb Binary files /dev/null and b/sound/storage/smallbox.ogg differ diff --git a/sound/storage/toolbox.ogg b/sound/storage/toolbox.ogg new file mode 100644 index 000000000000..ec1ff0cde569 Binary files /dev/null and b/sound/storage/toolbox.ogg differ diff --git a/sound/storage/unzip.ogg b/sound/storage/unzip.ogg new file mode 100644 index 000000000000..f91345ebac3c Binary files /dev/null and b/sound/storage/unzip.ogg differ diff --git a/sound/structures/locker_close.ogg b/sound/structures/locker_close.ogg new file mode 100644 index 000000000000..86913e51a268 Binary files /dev/null and b/sound/structures/locker_close.ogg differ diff --git a/sound/structures/locker_open.ogg b/sound/structures/locker_open.ogg new file mode 100644 index 000000000000..4a254c2b0b80 Binary files /dev/null and b/sound/structures/locker_open.ogg differ diff --git a/sound/voice/breathing.ogg b/sound/voice/breathing.ogg new file mode 100644 index 000000000000..e11cbee8d62c Binary files /dev/null and b/sound/voice/breathing.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain1.ogg b/sound/voice/human/agony/fem_scream_pain1.ogg new file mode 100644 index 000000000000..5df637f86c2d Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain1.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain2.ogg b/sound/voice/human/agony/fem_scream_pain2.ogg new file mode 100644 index 000000000000..74954dfefc73 Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain2.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain3.ogg b/sound/voice/human/agony/fem_scream_pain3.ogg new file mode 100644 index 000000000000..d5b363c84dc4 Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain3.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain4.ogg b/sound/voice/human/agony/fem_scream_pain4.ogg new file mode 100644 index 000000000000..5ac9112305f4 Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain4.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain5.ogg b/sound/voice/human/agony/fem_scream_pain5.ogg new file mode 100644 index 000000000000..9358dc325885 Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain5.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain6.ogg b/sound/voice/human/agony/fem_scream_pain6.ogg new file mode 100644 index 000000000000..9d11e1ad1371 Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain6.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain7.ogg b/sound/voice/human/agony/fem_scream_pain7.ogg new file mode 100644 index 000000000000..c9e6c072c24c Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain7.ogg differ diff --git a/sound/voice/human/agony/fem_scream_pain8.ogg b/sound/voice/human/agony/fem_scream_pain8.ogg new file mode 100644 index 000000000000..209e4a35c4ee Binary files /dev/null and b/sound/voice/human/agony/fem_scream_pain8.ogg differ diff --git a/sound/voice/human/agony/male_scream_pain1.ogg b/sound/voice/human/agony/male_scream_pain1.ogg new file mode 100644 index 000000000000..e03ceeba1ea2 Binary files /dev/null and b/sound/voice/human/agony/male_scream_pain1.ogg differ diff --git a/sound/voice/human/agony/male_scream_pain2.ogg b/sound/voice/human/agony/male_scream_pain2.ogg new file mode 100644 index 000000000000..a4bc4c9de108 Binary files /dev/null and b/sound/voice/human/agony/male_scream_pain2.ogg differ diff --git a/sound/voice/human/agony/male_scream_pain3.ogg b/sound/voice/human/agony/male_scream_pain3.ogg new file mode 100644 index 000000000000..6a580d0a1d4b Binary files /dev/null and b/sound/voice/human/agony/male_scream_pain3.ogg differ diff --git a/sound/voice/human/femalescream_6.ogg b/sound/voice/human/femalescream_6.ogg new file mode 100644 index 000000000000..69f7366ead4e Binary files /dev/null and b/sound/voice/human/femalescream_6.ogg differ diff --git a/sound/voice/human/femalescream_7.ogg b/sound/voice/human/femalescream_7.ogg new file mode 100644 index 000000000000..f6c27e1211f1 Binary files /dev/null and b/sound/voice/human/femalescream_7.ogg differ diff --git a/sound/voice/human/malescream_4.ogg b/sound/voice/human/malescream_4.ogg index 62f787d4a7b5..efd7b7182a73 100644 Binary files a/sound/voice/human/malescream_4.ogg and b/sound/voice/human/malescream_4.ogg differ diff --git a/sound/voice/human/malescream_6.ogg b/sound/voice/human/malescream_6.ogg index bdf732c2212b..0972755fe172 100644 Binary files a/sound/voice/human/malescream_6.ogg and b/sound/voice/human/malescream_6.ogg differ diff --git a/sound/voice/human/malescream_7.ogg b/sound/voice/human/malescream_7.ogg new file mode 100644 index 000000000000..839689c874c4 Binary files /dev/null and b/sound/voice/human/malescream_7.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded1.ogg b/sound/voice/human/wounded/female_moan_wounded1.ogg new file mode 100644 index 000000000000..0e4226f19437 Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded1.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded2.ogg b/sound/voice/human/wounded/female_moan_wounded2.ogg new file mode 100644 index 000000000000..985d05b64648 Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded2.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded3.ogg b/sound/voice/human/wounded/female_moan_wounded3.ogg new file mode 100644 index 000000000000..b6b5e85194ab Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded3.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded4.ogg b/sound/voice/human/wounded/female_moan_wounded4.ogg new file mode 100644 index 000000000000..d5fdc9d40041 Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded4.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded5.ogg b/sound/voice/human/wounded/female_moan_wounded5.ogg new file mode 100644 index 000000000000..cebfff9dfd99 Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded5.ogg differ diff --git a/sound/voice/human/wounded/female_moan_wounded6.ogg b/sound/voice/human/wounded/female_moan_wounded6.ogg new file mode 100644 index 000000000000..34f8a00b9763 Binary files /dev/null and b/sound/voice/human/wounded/female_moan_wounded6.ogg differ diff --git a/sound/voice/human/wounded/male_moan_1.ogg b/sound/voice/human/wounded/male_moan_1.ogg new file mode 100644 index 000000000000..59cc27914305 Binary files /dev/null and b/sound/voice/human/wounded/male_moan_1.ogg differ diff --git a/sound/voice/human/wounded/male_moan_2.ogg b/sound/voice/human/wounded/male_moan_2.ogg new file mode 100644 index 000000000000..5a74e302ab5c Binary files /dev/null and b/sound/voice/human/wounded/male_moan_2.ogg differ diff --git a/sound/voice/human/wounded/male_moan_3.ogg b/sound/voice/human/wounded/male_moan_3.ogg new file mode 100644 index 000000000000..6bb917ef5d25 Binary files /dev/null and b/sound/voice/human/wounded/male_moan_3.ogg differ diff --git a/sound/voice/human/wounded/male_moan_4.ogg b/sound/voice/human/wounded/male_moan_4.ogg new file mode 100644 index 000000000000..82a021b0a945 Binary files /dev/null and b/sound/voice/human/wounded/male_moan_4.ogg differ diff --git a/sound/voice/human/wounded/male_moan_5.ogg b/sound/voice/human/wounded/male_moan_5.ogg new file mode 100644 index 000000000000..78e8eb9c8f66 Binary files /dev/null and b/sound/voice/human/wounded/male_moan_5.ogg differ diff --git a/sound/weapons/TargetOff.ogg b/sound/weapons/TargetOff.ogg new file mode 100644 index 000000000000..b8657aab27ed Binary files /dev/null and b/sound/weapons/TargetOff.ogg differ diff --git a/sound/weapons/TargetOn.ogg b/sound/weapons/TargetOn.ogg new file mode 100644 index 000000000000..93a2f68f326c Binary files /dev/null and b/sound/weapons/TargetOn.ogg differ diff --git a/sound/weapons/attack/punch.ogg b/sound/weapons/attack/punch.ogg new file mode 100644 index 000000000000..f84954dd3a35 Binary files /dev/null and b/sound/weapons/attack/punch.ogg differ diff --git a/sound/weapons/attack/punch_2.ogg b/sound/weapons/attack/punch_2.ogg new file mode 100644 index 000000000000..e2efc0b68a52 Binary files /dev/null and b/sound/weapons/attack/punch_2.ogg differ diff --git a/sound/weapons/attack/punch_3.ogg b/sound/weapons/attack/punch_3.ogg new file mode 100644 index 000000000000..001d29120e1e Binary files /dev/null and b/sound/weapons/attack/punch_3.ogg differ diff --git a/sound/weapons/attack/punch_4.ogg b/sound/weapons/attack/punch_4.ogg new file mode 100644 index 000000000000..16ec8f832c32 Binary files /dev/null and b/sound/weapons/attack/punch_4.ogg differ diff --git a/sound/weapons/block/block1.ogg b/sound/weapons/block/block1.ogg new file mode 100644 index 000000000000..c007baed2ae6 Binary files /dev/null and b/sound/weapons/block/block1.ogg differ diff --git a/sound/weapons/block/block2.ogg b/sound/weapons/block/block2.ogg new file mode 100644 index 000000000000..6487afc64fd9 Binary files /dev/null and b/sound/weapons/block/block2.ogg differ diff --git a/sound/weapons/block/block3.ogg b/sound/weapons/block/block3.ogg new file mode 100644 index 000000000000..ee7c4a57badb Binary files /dev/null and b/sound/weapons/block/block3.ogg differ diff --git a/sound/weapons/block/block_energy.ogg b/sound/weapons/block/block_energy.ogg new file mode 100644 index 000000000000..7358b291b39b Binary files /dev/null and b/sound/weapons/block/block_energy.ogg differ diff --git a/sound/weapons/block/block_shield.ogg b/sound/weapons/block/block_shield.ogg new file mode 100644 index 000000000000..86b0bda6fd9f Binary files /dev/null and b/sound/weapons/block/block_shield.ogg differ diff --git a/sound/weapons/block/metal_block_01.ogg b/sound/weapons/block/metal_block_01.ogg new file mode 100644 index 000000000000..6587f7445543 Binary files /dev/null and b/sound/weapons/block/metal_block_01.ogg differ diff --git a/sound/weapons/block/metal_block_02.ogg b/sound/weapons/block/metal_block_02.ogg new file mode 100644 index 000000000000..676aebe9988b Binary files /dev/null and b/sound/weapons/block/metal_block_02.ogg differ diff --git a/sound/weapons/block/metal_block_03.ogg b/sound/weapons/block/metal_block_03.ogg new file mode 100644 index 000000000000..2fa82ccd80b2 Binary files /dev/null and b/sound/weapons/block/metal_block_03.ogg differ diff --git a/sound/weapons/block/metal_block_04.ogg b/sound/weapons/block/metal_block_04.ogg new file mode 100644 index 000000000000..a1e5010111bb Binary files /dev/null and b/sound/weapons/block/metal_block_04.ogg differ diff --git a/sound/weapons/block/metal_block_05.ogg b/sound/weapons/block/metal_block_05.ogg new file mode 100644 index 000000000000..c66f20a9e48c Binary files /dev/null and b/sound/weapons/block/metal_block_05.ogg differ diff --git a/sound/weapons/block/metal_block_06.ogg b/sound/weapons/block/metal_block_06.ogg new file mode 100644 index 000000000000..1f9c10f5a74f Binary files /dev/null and b/sound/weapons/block/metal_block_06.ogg differ diff --git a/sound/weapons/block/parry.ogg b/sound/weapons/block/parry.ogg new file mode 100644 index 000000000000..f9d5638b85f7 Binary files /dev/null and b/sound/weapons/block/parry.ogg differ diff --git a/sound/weapons/parry.ogg b/sound/weapons/block/parry_metal.ogg similarity index 100% rename from sound/weapons/parry.ogg rename to sound/weapons/block/parry_metal.ogg diff --git a/sound/weapons/punchmiss.ogg b/sound/weapons/punchmiss.ogg index 4f1e0e99b24d..122c60c199c6 100644 Binary files a/sound/weapons/punchmiss.ogg and b/sound/weapons/punchmiss.ogg differ diff --git a/sound/weapons/swing/swing_01.ogg b/sound/weapons/swing/swing_01.ogg new file mode 100644 index 000000000000..8880abc44695 Binary files /dev/null and b/sound/weapons/swing/swing_01.ogg differ diff --git a/sound/weapons/swing/swing_02.ogg b/sound/weapons/swing/swing_02.ogg new file mode 100644 index 000000000000..1b61e43be6ac Binary files /dev/null and b/sound/weapons/swing/swing_02.ogg differ diff --git a/sound/weapons/swing/swing_03.ogg b/sound/weapons/swing/swing_03.ogg new file mode 100644 index 000000000000..2412e78d4efa Binary files /dev/null and b/sound/weapons/swing/swing_03.ogg differ diff --git a/sound/weapons/swing/swing_crowbar.ogg b/sound/weapons/swing/swing_crowbar.ogg new file mode 100644 index 000000000000..053ec3c74f84 Binary files /dev/null and b/sound/weapons/swing/swing_crowbar.ogg differ diff --git a/sound/weapons/swing/swing_crowbar2.ogg b/sound/weapons/swing/swing_crowbar2.ogg new file mode 100644 index 000000000000..70af0bd339bf Binary files /dev/null and b/sound/weapons/swing/swing_crowbar2.ogg differ diff --git a/sound/weapons/swing/swing_crowbar3.ogg b/sound/weapons/swing/swing_crowbar3.ogg new file mode 100644 index 000000000000..c7c02b068a63 Binary files /dev/null and b/sound/weapons/swing/swing_crowbar3.ogg differ diff --git a/strings/antagonist_flavor/thief_flavor.json b/strings/antagonist_flavor/thief_flavor.json deleted file mode 100644 index 05c2b3c3ed18..000000000000 --- a/strings/antagonist_flavor/thief_flavor.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "All Access Fan": { - "goal": "The maintenance scrawlings speak of a legend who collected all the ids, and ascended to Accessia, land of the... well, the scrawlings got a little too hard to read. But fuck it, you're going to collect them ALL. Even if that makes you a complete asshole. Examine IDs to see if they're from Central Command, thus good to steal!", - "introduction": "You're going to collect All the Access today." - }, - "Black Market Outfitter": { - "goal": "You've tapped into the black market, and it turns out you could get rich quick introducing some of Nanotrasen's guns to the dark web!", - "introduction": "You're a Black Market Outfitter." - }, - "Chronicler": { - "goal": "You're one who wants to protect and preserve heirlooms. Unfortunately, your crewmates don't understand the greater mission here, so you'll have to take their heirlooms without their permission. Hint: You can find out who has heirlooms at a medical records console.", - "introduction": "You're the Chronicler." - }, - "Deranged": { - "goal": "Nothing was the same after opening the Codex. You now know that the souls of the dead have forever been trapped by the Devil within their own mortal body. The only way to solve this is to collect them all, and have a tea party with them!", - "introduction": "You're Deranged." - }, - "Hoarder": { - "goal": "You have a pretty bad hoarding problem. But you have a real bad feeling about today, and you need to set up a stash for when it all goes down.", - "introduction": "You're a Hoarder." - }, - "Organ Market Collector": { - "goal": "Nanotrasen has top of the line medical resources handy, which means you could be making a pretty penny slipping some organs out of medical.", - "introduction": "You're an Organ Market Collector." - }, - "Thief": { - "goal": "For one reason or another, you're looking to steal something expensive today, and you've found a good target.", - "introduction": "You're a Thief." - } -} diff --git a/strings/antagonist_flavor/traitor_flavor.json b/strings/antagonist_flavor/traitor_flavor.json index 4f3fb162da8f..51d447ab83b8 100644 --- a/strings/antagonist_flavor/traitor_flavor.json +++ b/strings/antagonist_flavor/traitor_flavor.json @@ -1,115 +1,18 @@ { - "Animal Rights Consortium": { - "allies": "You may cooperate with other syndicate operatives if they support our cause. Maybe you can convince the Bee Liberation Front operatives to cooperate for once?", - "goal": "The creatures of this world must be freed from the iron grasp of Nanotrasen, and you are their only hope!", - "introduction": "You are the ARC Terrorist.", - "roundend_report": "was an activist from the Animal Rights Consortium.", - "ui_theme": "syndicate", - "uplink": "The Syndicate have graciously given one of their uplinks for your task." - }, - "Bee Liberation Front": { - "allies": "You may cooperate with other syndicate operatives if they support our cause. Maybe you can recruit an Animal Rights Consort to be useful for once?", - "goal": "We must prove ourselves to the Syndicate or we will not be able to join. Animal Rights Consort will roll us!", - "introduction": "You are the Bee Liberation Front Operative.", - "roundend_report": "was an activist of the Bee Liberation Front.", - "ui_theme": "syndicate", - "uplink": "The Syndicate have graciously given one of their uplinks to see if we are worthy." - }, - "Champions of Evil": { - "allies": "Anyone who sees as you see, feels as you feel, may join the Champions of Evil! That means the Syndicate, the self-serving, or even the insane, as long as it has a heart of darkness, it's cool with the Champions!", - "goal": "You've got some napkin-note-plans for some EVIL to do today. On the side, the Champions of Evil are always looking for more morally malodorous malefactors! Get some recruiting done!", - "introduction": "You are the Champion of Evil.", - "roundend_report": "was a Champion of Evil!", - "ui_theme": "neutral", - "uplink": "The Champions of Evil is well connected to the black market. Your uplink has been provided for utmost evil!" - }, - "Corporate Climber": { - "allies": "Death to the Syndicate.", - "goal": "Killing needlessly would make you some kind of traitor, or at least definitely seen as one. This is all just a means to an end.", - "introduction": "You are the Corporate Climber.", - "roundend_report": "was a corporate climber.", - "ui_theme": "neutral", - "uplink": "You have connections to the black market for the deeds. Knock off a few loose weights, and your climb will be so much smoother." - }, - "Cybersun Industries": { - "allies": "Fellow Cybersun operatives are to be trusted. Members of the MI13 organization can be trusted. All other syndicate operatives are not to be trusted.", - "goal": "Do not establish substantial presence on the designated facility, as larger incidents are harder to cover up.", - "introduction": "You are from Cybersun Industries.", - "roundend_report": "was a specialist from Cybersun Industries.", - "ui_theme": "syndicate", - "uplink": "You have been supplied the tools for the job in the form of a standard syndicate uplink." - }, - "Donk Corporation": { - "allies": "Members of Waffle Co. are to be killed on sight; they are not allowed to be on the station while we're around.", - "goal": "We do not approve of mindless killing of innocent workers; \"get in, get done, get out\" is our motto.", - "introduction": "You are the Donk Co. Traitor.", - "roundend_report": "was an employee from Donk Corporation.", - "ui_theme": "syndicate", - "uplink": "You have been provided with a standard uplink to accomplish your task." - }, "Gone Postal": { - "allies": "If the syndicate learns of your plan, they're going to kill you and take your uplink. Take no chances.", - "goal": "The preparations are finally complete. Today is the day you go postal. You're going to hijack the emergency shuttle and live a new life free of Nanotrasen.", + "allies": "None.", + "goal": "The preparations are finally complete. Today is the day you go postal.", "introduction": "You're going postal today.", "roundend_report": "simply went completely postal!", "ui_theme": "neutral", "uplink": "You've actually managed to steal a full uplink a month ago. This should certainly help accomplish your goals." }, - "Gorlex Marauders": { - "allies": "You may collaborate with any friends of the Syndicate coalition, but keep an eye on any of those Tiger punks if they do show up.", - "goal": "Getting noticed is not an issue, and you may use any level of ordinance to get the job done. That being said, do not make this sloppy by dragging in random slaughter.", - "introduction": "You are a Gorlex Marauder.", - "roundend_report": "was a Gorlex Marauder.", - "ui_theme": "syndicate", - "uplink": "You have been provided with a standard uplink to accomplish your task." - }, - "Internal Affairs Agent": { - "allies": "Death to the Syndicate. Killing infiltrators is a whole different kind of internal affair we fully approve of dealing with.", - "goal": "While you have a license to kill, unneeded property damage or loss of employee life will lead to your contract being terminated.", - "introduction": "You are the Internal Affairs Agent.", - "roundend_report": "was part of Nanotrasen Internal Affairs.", - "ui_theme": "ntos", - "uplink": "For the sake of plausible deniability, you have been equipped with an array of captured Syndicate weaponry available via uplink." - }, "Legal Trouble": { - "allies": "Death to the Syndicate.", + "allies": "None.", "goal": "Try to finish your to-do list, and don't get caught. If they find out what you're actually doing, this scandal will go galactic.", "introduction": "You are in legal trouble.", "roundend_report": "was in legal trouble.", "ui_theme": "neutral", "uplink": "You've connected to the black market to clean this mess up. If there's no evidence, there's no crime." - }, - "MI13": { - "allies": "You are the only operative we are sending, any others are fake. All other syndicate operatives are not to be trusted, with the exception of Cybersun operatives.", - "goal": "Avoid killing innocent personnel at all costs. You are not here to mindlessly kill people, as that would attract too much attention and is not our goal. Avoid detection at all costs.", - "introduction": "You are the MI13 Agent.", - "roundend_report": "was an MI13 agent.", - "ui_theme": "syndicate", - "uplink": "You have been provided with a standard uplink to accomplish your task." - }, - "Tiger Cooperative Fanatic": { - "allies": "Only the enlightened Tiger brethren can be trusted; all others must be expelled from this mortal realm!", - "goal": "Remember the teachings of Hy-lurgixon; kill first, ask questions later!", - "introduction": "You are the Tiger Cooperative Fanatic.", - "roundend_report": "was a Tiger Cooperative Fanatic.", - "ui_theme": "abductor", - "uplink": "You have been provided with a hy-lurgixon tome to prove yourself to the changeling hive. If you accomplish your tasks, you will be assimilated.", - "uplink_name": "hy-lurgixon tome" - }, - "Waffle Corporation": { - "allies": "Members of Donk Co. are to be killed on sight; they are not allowed to be on the station while we're around. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives.", - "goal": "You are not here for a stationwide demonstration. Again, other Waffle Co. Traitors may be, so watch out. Your job is to only accomplish your objectives.", - "introduction": "You are the Waffle Co. Traitor.", - "roundend_report": "was an employee from Waffle Corporation.", - "ui_theme": "syndicate", - "uplink": "You have been provided with a standard uplink to accomplish your task." - }, - "Waffle Corporation Terrorist": { - "allies": "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives.", - "goal": "Our investors need a demonstation of our pledge to destroying Nanotrasen. Let's give them a loud one!", - "introduction": "You are the Waffle Corporation Terrorist.", - "roundend_report": "was a terrorist from Waffle Corporation.", - "ui_theme": "syndicate", - "uplink": "You have been provided with a standard uplink to accomplish your task." } } diff --git a/strings/memories.json b/strings/memories.json index 10cda761ea40..8eabed4afc1b 100644 --- a/strings/memories.json +++ b/strings/memories.json @@ -135,7 +135,7 @@ "%MEMORIZER %MOOD as they wipe their nose." ], "account_names":[ - "The bank ID of %PROTAGONIST, %ACCOUNT_ID." + "The bank information of %PROTAGONIST, ID: %ACCOUNT_ID, PIN: %ACCOUNT_PIN." ], "account_starts":[ "%PROTAGONIST flexing their last brain cells, proudly showing their lucky numbers %ACCOUNT_ID.", diff --git a/strings/packetnet.json b/strings/packetnet.json new file mode 100644 index 000000000000..c8a2869b792b --- /dev/null +++ b/strings/packetnet.json @@ -0,0 +1,11 @@ +{ + "packet_field_names":[ + "adj_bat", + "tftp_file", + "clown_show_bullshit", + "tr069_data", + "gprs_admin", + "net_use", + "spline_transpose" + ] +} diff --git a/test.dmm b/test.dmm new file mode 100644 index 000000000000..20e1a8a33d31 --- /dev/null +++ b/test.dmm @@ -0,0 +1,16645 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"ab" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"ac" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"ae" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"ag" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"ah" = ( +/obj/machinery/computer/prisoner/management{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"al" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"an" = ( +/obj/structure/table/wood, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"ao" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"ap" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/belt/utility, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"aq" = ( +/obj/structure/weightmachine/weightlifter, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"ar" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_y = 6 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Prison Sanitarium"; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/turf/open/floor/iron/white, +/area/space) +"av" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet3"; + name = "Unit 3" + }, +/turf/open/floor/iron/freezer, +/area/space) +"ax" = ( +/obj/structure/extinguisher_cabinet/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"aB" = ( +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/iron/dark, +/area/space) +"aF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 2"; + name = "Cell 2 Locker" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"aH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"aM" = ( +/obj/effect/landmark/start/detective, +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/space) +"aO" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"aR" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/space) +"aT" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/space) +"aU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"aV" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/freezer, +/area/space) +"aW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Law Office Maintenance"; + req_access_txt = "38" + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"aY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "hosspace"; + name = "Space Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"aZ" = ( +/obj/machinery/requests_console/directional/south{ + department = "Mining"; + name = "Mining Requests Console" + }, +/turf/open/floor/iron, +/area/space) +"bb" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating/airless, +/area/space) +"bc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"bg" = ( +/obj/structure/toilet/greyscale{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron/white, +/area/space) +"bi" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"bj" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/conveyor{ + dir = 9; + id = "garbage" + }, +/turf/open/floor/plating, +/area/space) +"bl" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/space) +"br" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"bs" = ( +/obj/machinery/portable_atmospherics/canister/air, +/turf/open/floor/plating, +/area/space) +"bt" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"bu" = ( +/obj/structure/table/wood, +/obj/item/radio/intercom{ + broadcasting = 1; + dir = 8; + listening = 0; + name = "Station Intercom (Court)" + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"bv" = ( +/obj/structure/table, +/obj/item/storage/dice, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"bx" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/pen{ + pixel_x = 1; + pixel_y = 9 + }, +/obj/item/book/manual/wiki/security_space_law, +/obj/machinery/camera/directional/south{ + c_tag = "Security Post - Cargo" + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"bB" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) +"bC" = ( +/obj/machinery/door/airlock/grunge{ + name = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"bD" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"bE" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"bF" = ( +/obj/structure/table/wood, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/telephone/command, +/obj/machinery/power/data_terminal, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/space) +"bH" = ( +/obj/machinery/washing_machine, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/space) +"bO" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/obj/effect/landmark/start/head_of_security, +/turf/open/floor/wood, +/area/space) +"bS" = ( +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + dir = 1; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = -30 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"bT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"bX" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/machinery/requests_console/directional/north{ + department = "Law Office"; + name = "Lawyer Requests Console" + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/wood, +/area/space) +"bY" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, +/obj/structure/railing, +/turf/open/floor/plating, +/area/space) +"cc" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"cg" = ( +/obj/structure/closet/crate/trashcart, +/obj/effect/spawner/random/contraband/prison, +/obj/machinery/firealarm/directional/north, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/plating, +/area/space) +"ci" = ( +/obj/machinery/computer/prisoner/management{ + dir = 4 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/wood, +/area/space) +"cl" = ( +/obj/structure/closet/secure_closet/hos, +/obj/item/clothing/shoes/cowboy/black, +/obj/machinery/camera/directional/north{ + c_tag = "Head of Security's Office" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"cm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/space) +"cn" = ( +/obj/machinery/light_switch/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/freezer, +/area/space) +"cp" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/space) +"cq" = ( +/obj/machinery/airalarm/directional/east, +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/space) +"cr" = ( +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/space) +"ct" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/oil/slippery, +/obj/effect/decal/cleanable/blood/gibs/down, +/mob/living/simple_animal/bot/mulebot{ + name = "Leaping Rabbit" + }, +/turf/open/floor/plating, +/area/space) +"cv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/storage/belt/utility, +/obj/item/storage/toolbox/electrical, +/obj/item/radio/off, +/obj/item/hand_labeler, +/obj/machinery/airalarm/directional/east, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/iron, +/area/space) +"cw" = ( +/obj/machinery/conveyor_switch/oneway{ + dir = 8; + id = "garbage"; + name = "disposal conveyor" + }, +/turf/open/floor/plating, +/area/space) +"cx" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"cz" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 8; + pixel_x = 30 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/floor/iron, +/area/space) +"cB" = ( +/obj/machinery/rnd/production/fabricator/department/security, +/turf/open/floor/iron/dark, +/area/space) +"cE" = ( +/obj/structure/bed/dogbed, +/turf/open/floor/mud, +/area/space) +"cG" = ( +/obj/structure/table, +/obj/item/storage/medkit/regular, +/obj/item/reagent_containers/glass/bottle/epinephrine, +/obj/item/reagent_containers/glass/bottle/dylovene, +/obj/item/reagent_containers/syringe, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"cH" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/space) +"cI" = ( +/obj/structure/closet/secure_closet/brig, +/turf/open/floor/iron/dark, +/area/space) +"cJ" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"cL" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/space) +"cP" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"cQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"cU" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 5 + }, +/turf/open/floor/plating, +/area/space) +"de" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"df" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"dh" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/space) +"dl" = ( +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"dm" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "31; 48" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space) +"dn" = ( +/obj/structure/closet/secure_closet/evidence, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"do" = ( +/obj/structure/closet/emcloset, +/turf/open/floor/plating, +/area/space) +"dr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/east{ + c_tag = "Outer Vault"; + name = "storage wing camera" + }, +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/window, +/turf/open/floor/iron, +/area/space) +"ds" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door/directional/west{ + id = "Disposal Exit"; + name = "Disposal Vent Control"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/space) +"dt" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/space) +"du" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"dx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"dz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/small/maintenance/directional/north, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"dD" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"dH" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/bodycontainer/morgue, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"dI" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Firing Range"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/space) +"dJ" = ( +/obj/machinery/door_timer{ + id = "Cell 3"; + name = "Cell 3"; + pixel_x = 32; + pixel_y = -32 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"dK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/food/donut, +/turf/open/floor/plating, +/area/space) +"dL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"dM" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/turf/open/floor/iron, +/area/space) +"dN" = ( +/obj/structure/closet{ + name = "Evidence Closet 5" + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"dP" = ( +/obj/machinery/newscaster/directional/north, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical, +/obj/machinery/camera/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"dX" = ( +/obj/machinery/vending/assist, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron, +/area/space) +"dY" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/railing, +/turf/open/floor/plating, +/area/space) +"ea" = ( +/obj/machinery/door/airlock/external{ + name = "Solar Maintenance"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"eb" = ( +/obj/structure/rack, +/obj/item/clothing/suit/armor/riot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/riot{ + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/riot{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_y = -2 + }, +/obj/item/clothing/suit/armor/bulletproof{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + departmentType = 3; + name = "Security Requests Console" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"ed" = ( +/obj/effect/turf_decal/tile/brown/anticorner/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"ee" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"eg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail{ + dir = 2; + sortType = 29 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"eh" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/space) +"ei" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/space) +"en" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash/soap{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/iron/freezer, +/area/space) +"eo" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/space) +"es" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"et" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"eu" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/space) +"ew" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"eE" = ( +/obj/machinery/mass_driver/trash{ + dir = 8 + }, +/obj/machinery/light/small/directional/north, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"eF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"eG" = ( +/obj/structure/table, +/obj/item/storage/box/bodybags{ + pixel_x = 4; + pixel_y = 2 + }, +/obj/item/pen, +/obj/item/storage/box/prisoner, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/camera/directional/south{ + c_tag = "Prison Hallway Port"; + network = list("ss13","prison") + }, +/turf/open/floor/iron, +/area/space) +"eI" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"eJ" = ( +/obj/machinery/camera/directional/west{ + c_tag = "Security - Office - Port" + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"eK" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"eO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/space) +"eP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/space) +"eU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"eV" = ( +/turf/closed/wall/prepainted/daedalus, +/area/space) +"eW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/space) +"eY" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/turf/open/floor/iron/white, +/area/space) +"fc" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/space) +"fi" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/camera/directional/east{ + c_tag = "Prison Isolation Cell"; + network = list("ss13","prison","isolation") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/space) +"fk" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"fr" = ( +/obj/structure/punching_bag, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"fs" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"fu" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/space) +"fv" = ( +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"fx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/space) +"fC" = ( +/obj/item/paper_bin/carbon, +/obj/item/pen/fountain, +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/space) +"fE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/turf/open/floor/iron/dark, +/area/space) +"fJ" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet2"; + name = "Unit 2" + }, +/turf/open/floor/iron/freezer, +/area/space) +"fL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron, +/area/space) +"fP" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"fS" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"fT" = ( +/obj/structure/rack, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -5; + pixel_y = 7 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_y = 4 + }, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = 5; + pixel_y = 2 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Security - Office - Starboard" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/space) +"fV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 3"; + name = "Cell 3 Locker" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"fY" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"gd" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"ge" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"gh" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"gj" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/turf/open/floor/iron, +/area/space) +"gk" = ( +/obj/structure/table, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/hand_labeler{ + pixel_x = -8; + pixel_y = 10 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/evidence{ + pixel_x = 9; + pixel_y = 8 + }, +/obj/item/storage/box/prisoner{ + pixel_x = 9 + }, +/obj/machinery/recharger{ + pixel_x = -5; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"gm" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"gn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"go" = ( +/obj/machinery/firealarm/directional/west, +/obj/machinery/camera/directional/west{ + c_tag = "Restrooms" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/space) +"gq" = ( +/obj/machinery/camera{ + c_tag = "Warden's Office"; + dir = 10 + }, +/obj/structure/table, +/obj/machinery/button/door{ + desc = "Controls the shutters over the cell windows."; + id = "Secure Gate"; + name = "Cell Window Control"; + pixel_x = -6; + pixel_y = 7; + req_access_txt = "63"; + specialfunctions = 4 + }, +/obj/machinery/button/door{ + desc = "Controls the shutters over the brig windows."; + id = "briglockdown"; + name = "Brig Lockdown Control"; + pixel_x = 6; + pixel_y = 7; + req_access_txt = "63" + }, +/obj/machinery/button/door{ + desc = "Controls the blast doors in front of the prison wing."; + id = "Prison Gate"; + name = "Prison Wing Lockdown"; + pixel_y = -3; + req_access_txt = "2" + }, +/obj/item/key/security, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/iron, +/area/space) +"gs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"gv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/mob/living/simple_animal/bot/secbot/beepsky/officer, +/turf/open/floor/iron, +/area/space) +"gE" = ( +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/south{ + id = "PermaLockdown"; + name = "Panic Button"; + req_access_txt = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"gG" = ( +/obj/structure/closet, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/space) +"gK" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/space) +"gN" = ( +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space) +"gS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Evidence Storage"; + req_one_access_txt = "1;4" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"gT" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/item/tank/internals/oxygen, +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4, +/turf/open/floor/plating, +/area/space) +"gU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron/dark, +/area/space) +"gV" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_loot_count = 3; + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/space) +"gY" = ( +/obj/item/radio/intercom/prison/directional/north, +/turf/open/floor/iron, +/area/space) +"hb" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/space) +"hi" = ( +/obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/cobweb, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/space) +"hj" = ( +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + dir = 1; + icon_state = "right"; + name = "gas ports" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "justice gas pump" + }, +/turf/open/floor/iron/dark, +/area/space) +"hk" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"hl" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/obj/item/radio/intercom/directional/north, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"hn" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"hp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/space) +"hs" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/camera/directional/south{ + c_tag = "Prison Cell Block 1"; + network = list("ss13","prison") + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/space) +"hw" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron, +/area/space) +"hy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"hz" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"hA" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/turf/open/floor/iron/freezer, +/area/space) +"hB" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"hC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/space) +"hD" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "Security Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"hH" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"hI" = ( +/obj/machinery/holopad, +/turf/open/floor/iron, +/area/space) +"hJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/space) +"hP" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/space) +"hT" = ( +/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/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"hW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"hY" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + name = "Gear Room"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"hZ" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/freezer, +/area/space) +"ih" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"il" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/space) +"ip" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"ir" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security E.V.A. Storage"; + req_one_access_txt = "1;4" + }, +/turf/open/floor/iron, +/area/space) +"is" = ( +/obj/machinery/light/directional/west, +/obj/machinery/button/flasher{ + id = "IsolationFlash"; + pixel_x = -23; + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"it" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"iu" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Conveyor Access"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"iv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"iw" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"ix" = ( +/obj/machinery/door/airlock/grunge{ + name = "Prison Forestry" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/space) +"iJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/space) +"iL" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"iM" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/space) +"iN" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/light_switch/directional/south, +/obj/effect/mapping_helpers/burnt_floor, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"iP" = ( +/obj/structure/sign/warning/vacuum/external, +/turf/closed/wall/prepainted/daedalus, +/area/space) +"iT" = ( +/obj/structure/table/glass, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_y = 6 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"iV" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/space) +"iX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"iZ" = ( +/obj/structure/table/wood, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = 30 + }, +/obj/item/flashlight/lamp/green{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/restraints/handcuffs, +/turf/open/floor/carpet, +/area/space) +"jb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron, +/area/space) +"jc" = ( +/obj/structure/rack, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/item/storage/toolbox/emergency, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/space) +"jd" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light_switch/directional/south, +/turf/open/floor/iron/white, +/area/space) +"jf" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"jg" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/space) +"ji" = ( +/obj/machinery/computer/secure_data{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"jj" = ( +/obj/structure/easel, +/turf/open/floor/plating, +/area/space) +"jk" = ( +/obj/structure/table, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/side, +/area/space) +"jm" = ( +/obj/machinery/light_switch/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/closet/secure_closet/lethalshots, +/turf/open/floor/iron/dark, +/area/space) +"jn" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron, +/area/space) +"jo" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/holopad, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"jr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/space) +"js" = ( +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/grimy, +/area/space) +"jt" = ( +/obj/structure/chair, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"ju" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"jy" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"jz" = ( +/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/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"jA" = ( +/obj/machinery/power/solar_control{ + id = "foreport"; + name = "Port Bow Solar Control" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"jC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"jE" = ( +/obj/structure/bed/dogbed/mcgriff, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/firealarm/directional/west{ + pixel_y = 26 + }, +/mob/living/simple_animal/pet/dog/pug/mcgriff, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"jF" = ( +/obj/structure/table, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 10 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -2 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/clothing/shoes/sneakers/orange{ + pixel_x = -6; + pixel_y = -8 + }, +/obj/item/clothing/under/rank/prisoner{ + pixel_x = 8; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron, +/area/space) +"jH" = ( +/obj/structure/rack, +/obj/item/shield/riot{ + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/shield/riot, +/obj/item/shield/riot{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"jI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/space) +"jL" = ( +/obj/machinery/computer/security{ + dir = 1 + }, +/obj/item/paper/crumpled{ + info = "Hey, assholes. We don't need a couch in the meeting room, I threw it out the airlock. I don't care if it's real leather, go patrol like you're paid to do instead of cycling through cameras all shift!"; + name = "old, crumpled note" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"jN" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"jO" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"jP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/freezer, +/area/space) +"jR" = ( +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/white, +/area/space) +"jS" = ( +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/space) +"jT" = ( +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/right/directional/south{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/structure/table, +/turf/open/floor/iron, +/area/space) +"jZ" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"ka" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"kb" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/dark, +/area/space) +"kd" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"kf" = ( +/obj/machinery/computer/warrant{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"kh" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/space) +"ki" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/flasher/directional/east{ + id = "secentranceflasher" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"kj" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/structure/closet/crate/silvercrate, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"kn" = ( +/obj/structure/closet/secure_closet/injection{ + name = "educational injections"; + pixel_x = 2 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/space) +"kp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"kr" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"kv" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"ky" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"kz" = ( +/obj/machinery/camera/motion/directional/south{ + active_power_usage = 0; + c_tag = "Armory - External"; + network = list("security"); + use_power = 0 + }, +/turf/open/space/basic, +/area/space) +"kA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 10 + }, +/obj/machinery/modular_computer/console/preset/cargochat/security{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"kC" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"kE" = ( +/obj/machinery/light/small/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/east{ + id = "Prison Gate"; + name = "Prison Wing Lockdown"; + req_access_txt = "2" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"kG" = ( +/obj/machinery/vending/sustenance, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"kI" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"kR" = ( +/obj/effect/turf_decal/trimline/green/filled/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"kU" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"kW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"lb" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/drinkingglass, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron/white, +/area/space) +"ld" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "brig-entrance" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"lj" = ( +/obj/effect/landmark/secequipment, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, +/area/space) +"lk" = ( +/obj/structure/safe/floor, +/obj/item/food/fortunecookie, +/turf/open/floor/plating, +/area/space) +"lm" = ( +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/space) +"lp" = ( +/obj/machinery/door/airlock/engineering{ + name = "Port Bow Solar Access"; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"lq" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"lr" = ( +/obj/structure/toilet/greyscale{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"ls" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/space) +"lt" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"lw" = ( +/obj/structure/chair, +/obj/machinery/computer/security/telescreen/interrogation{ + dir = 4; + pixel_x = -30 + }, +/turf/open/floor/iron/grimy, +/area/space) +"lx" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space) +"ly" = ( +/obj/structure/closet, +/obj/item/clothing/gloves/color/fyellow, +/obj/effect/spawner/random/maintenance/two, +/obj/item/clothing/head/festive, +/turf/open/floor/plating, +/area/space) +"lD" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space, +/area/space) +"lE" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/grimy, +/area/space) +"lF" = ( +/obj/structure/closet/secure_closet{ + name = "contraband locker"; + req_access_txt = "3" + }, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/spawner/random/contraband/armory, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"lG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/iron, +/area/space) +"lH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door/directional/south{ + id = "prisonereducation"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"lJ" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/grimy, +/area/space) +"lK" = ( +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"lQ" = ( +/obj/machinery/computer/bank_machine, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"lR" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/paper/guides/jobs/hydroponics, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/effect/spawner/random/food_or_drink/seed{ + spawn_all_loot = 1; + spawn_random_offset = 1 + }, +/obj/effect/spawner/random/contraband/prison, +/turf/open/floor/iron, +/area/space) +"lS" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron, +/area/space) +"lU" = ( +/obj/machinery/door/airlock/security/glass{ + id_tag = "outerbrig"; + name = "Pig Pen"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"lX" = ( +/turf/open/floor/plating/airless, +/area/space) +"lY" = ( +/obj/effect/landmark/start/security_officer, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"lZ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/security/glass{ + id_tag = "innerbrig"; + name = "Brig"; + req_access_txt = "63" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/space) +"mc" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Brig"; + req_access_txt = "63; 42" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"mh" = ( +/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/firealarm/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"mk" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"mn" = ( +/obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"mo" = ( +/obj/structure/chair, +/turf/open/floor/iron/grimy, +/area/space) +"mq" = ( +/obj/machinery/space_heater, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"mr" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"mu" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/space) +"mw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"mx" = ( +/obj/structure/chair{ + name = "Judge" + }, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Courtroom" + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"mA" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating/airless, +/area/space) +"mB" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"mE" = ( +/obj/machinery/door/airlock/command{ + name = "Head of Security's Office"; + req_access_txt = "58" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/space) +"mG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"mI" = ( +/obj/structure/table, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/glass/bottle/chloralhydrate, +/obj/item/reagent_containers/glass/bottle/toxin{ + pixel_x = 6; + pixel_y = 8 + }, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = 5; + pixel_y = 1 + }, +/obj/item/reagent_containers/syringe, +/obj/item/reagent_containers/glass/bottle/facid{ + name = "fluorosulfuric acid bottle"; + pixel_x = -3; + pixel_y = 6 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = 5 + }, +/obj/item/reagent_containers/dropper, +/obj/machinery/airalarm/directional/west, +/obj/machinery/button/ignition{ + id = "executionburn"; + name = "Justice Ignition Switch"; + pixel_x = -25; + pixel_y = 36 + }, +/obj/item/assembly/signaler{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/machinery/button/flasher{ + id = "justiceflash"; + name = "Justice Flash Control"; + pixel_x = -36; + pixel_y = 36; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/button/door/directional/west{ + id = "executionfireblast"; + name = "Justice Area Lockdown"; + pixel_y = 24; + req_access_txt = "2" + }, +/obj/machinery/button/door/directional/west{ + id = "SecJusticeChamber"; + name = "Justice Vent Control"; + pixel_x = -36; + pixel_y = 24; + req_access_txt = "3" + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"mJ" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"mK" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"mL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"mM" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/latex, +/obj/item/clothing/mask/surgical, +/obj/item/reagent_containers/spray/cleaner, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/space) +"mO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"mQ" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"mT" = ( +/obj/machinery/door/window/brigdoor/security/holding{ + id = "Holding Cell"; + name = "Holding Cell" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"mU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/space) +"mV" = ( +/obj/machinery/nuclearbomb/selfdestruct, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"mW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"nc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"nf" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/flasher/directional/east{ + id = "holdingflash" + }, +/turf/open/floor/iron, +/area/space) +"ng" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"nj" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "hosspace"; + name = "Space Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"nk" = ( +/obj/structure/table, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/mask/gas/sechailer{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/assembly/flash/handheld{ + pixel_x = 6; + pixel_y = 13 + }, +/turf/open/floor/iron/dark, +/area/space) +"nl" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Detective Maintenance"; + req_access_txt = "4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"nm" = ( +/obj/structure/closet/secure_closet/security/cargo, +/obj/machinery/airalarm/directional/north, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"ns" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Brig Maintenance"; + req_one_access_txt = "63;12" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"nt" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"nv" = ( +/obj/structure/closet/emcloset, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/space) +"nw" = ( +/obj/structure/chair/stool/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"nx" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"ny" = ( +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"nB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/space) +"nD" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/space) +"nH" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"nI" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"nJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/grimy, +/area/space) +"nK" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"nO" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"nQ" = ( +/obj/machinery/light/small/directional/south, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"nU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"nV" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"nW" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + name = "Gear Room"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/space) +"nX" = ( +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/space) +"nZ" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 3"; + name = "Cell 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"oa" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Two"; + space_dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"og" = ( +/obj/structure/bed{ + dir = 4 + }, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"oi" = ( +/obj/structure/railing{ + dir = 6 + }, +/turf/open/floor/plating, +/area/space) +"oj" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/iron/white, +/area/space) +"ol" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plating, +/area/space) +"om" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/turf/open/floor/iron, +/area/space) +"oo" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=1-BrigCells"; + location = "0-SecurityDesk" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/space) +"op" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"oq" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/grass, +/area/space) +"ot" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space) +"oB" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/table/wood, +/obj/item/computer_hardware/hard_drive/role/detective, +/obj/item/folder/red{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/folder/red{ + pixel_x = -7 + }, +/obj/item/computer_hardware/hard_drive/role/detective, +/obj/item/computer_hardware/hard_drive/role/detective, +/obj/machinery/fax_machine, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/space) +"oC" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/space) +"oE" = ( +/obj/structure/window, +/obj/effect/decal/cleanable/food/flour, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"oF" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "brig shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"oI" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/north, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/item/healthanalyzer, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"oK" = ( +/obj/structure/table, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = -3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"oL" = ( +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=1.5-Fore-Central"; + location = "1-BrigCells" + }, +/turf/open/floor/iron, +/area/space) +"oQ" = ( +/obj/item/kirbyplants/random, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"oV" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/space) +"oW" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"oX" = ( +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"oZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/warning{ + dir = 8 + }, +/obj/machinery/computer/department_orders/security{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"pa" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/space) +"pc" = ( +/obj/structure/closet/crate, +/obj/item/food/breadslice/plain, +/obj/item/food/breadslice/plain, +/obj/item/food/breadslice/plain, +/obj/item/food/grown/potato, +/obj/item/food/grown/potato, +/obj/item/food/grown/onion, +/obj/item/food/grown/onion, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"pf" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"ph" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) +"pk" = ( +/obj/structure/table, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/iron/dark, +/area/space) +"pm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"po" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"pq" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"pv" = ( +/obj/machinery/airalarm/directional/south, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/space) +"pz" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/railing, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"pF" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"pH" = ( +/obj/machinery/light/small/directional/west, +/obj/structure/sink{ + pixel_y = 29 + }, +/mob/living/simple_animal/mouse/brown/tom, +/turf/open/floor/plating, +/area/space) +"pI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/space) +"pK" = ( +/obj/machinery/requests_console/directional/west{ + department = "Detective"; + name = "Detective Requests Console" + }, +/obj/machinery/light/small/directional/west, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/machinery/camera/directional/west{ + c_tag = "Detective's Office" + }, +/turf/open/floor/iron/grimy, +/area/space) +"pL" = ( +/obj/machinery/space_heater, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron/dark, +/area/space) +"pN" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/kirbyplants{ + icon_state = "plant-11"; + name = "tactical plant" + }, +/obj/structure/closet, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark, +/area/space) +"pO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"pP" = ( +/obj/structure/table, +/obj/item/implanter{ + pixel_x = 5; + pixel_y = 12 + }, +/obj/item/storage/box/evidence{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/toy/crayon/white{ + pixel_y = -4 + }, +/obj/item/toy/crayon/white{ + pixel_x = -5; + pixel_y = -4 + }, +/turf/open/floor/iron/dark, +/area/space) +"pR" = ( +/obj/structure/weightmachine/weightlifter, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"pW" = ( +/obj/structure/sink/kitchen{ + pixel_y = 28 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"pX" = ( +/obj/structure/filingcabinet, +/obj/item/folder/documents, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"qe" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"qf" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/space) +"qg" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"qh" = ( +/obj/structure/sign/gym/right/directional/south, +/turf/open/space/basic, +/area/space) +"qj" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/iron, +/area/space) +"qo" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/chair{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"qq" = ( +/obj/structure/table, +/obj/item/storage/box/hug{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/razor{ + pixel_x = -8; + pixel_y = 3 + }, +/turf/open/floor/iron, +/area/space) +"qu" = ( +/obj/structure/closet/crate/secure/weapon{ + desc = "A secure clothing crate."; + name = "formal uniform crate"; + req_access_txt = "3" + }, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/under/rank/security/officer/formal, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/suit/security/officer, +/obj/item/clothing/under/rank/security/warden/formal, +/obj/item/clothing/suit/security/warden, +/obj/item/clothing/under/rank/security/head_of_security/formal, +/obj/item/clothing/suit/security/hos, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navyofficer, +/obj/item/clothing/head/beret/sec/navywarden, +/obj/item/clothing/head/hos/beret/navyhos, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"qw" = ( +/obj/effect/spawner/random/structure/crate, +/obj/machinery/light/small/maintenance/directional/north, +/turf/open/floor/plating, +/area/space) +"qz" = ( +/obj/machinery/light/small/directional/north, +/obj/effect/landmark/blobstart, +/obj/machinery/camera/directional/north{ + c_tag = "Evidence Storage" + }, +/obj/item/storage/secure/safe/directional/north{ + name = "evidence safe" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"qA" = ( +/obj/machinery/light/directional/south, +/obj/effect/landmark/xeno_spawn, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"qC" = ( +/obj/structure/sign/warning/securearea{ + name = "\improper STAY CLEAR HEAVY MACHINERY" + }, +/turf/closed/wall/prepainted/daedalus, +/area/space) +"qF" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/rack, +/obj/machinery/camera/directional/south{ + c_tag = "Brig - Infirmary" + }, +/obj/item/clothing/under/rank/medical/scrubs/purple, +/obj/item/storage/medkit/regular, +/obj/item/healthanalyzer{ + pixel_y = -2 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"qH" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"qI" = ( +/obj/machinery/door/airlock/security{ + name = "Court Cell"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/dark, +/area/space) +"qL" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/west{ + id = "Toilet1"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/space) +"qM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/random/directional/north, +/turf/open/floor/plating, +/area/space) +"qO" = ( +/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/item/clothing/glasses/sunglasses, +/turf/open/floor/wood, +/area/space) +"qR" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/structure/sign/warning/vacuum{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/space) +"qS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/space) +"qT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"qU" = ( +/obj/structure/table/wood, +/obj/item/storage/secure/safe/directional/east, +/obj/machinery/computer/security/wooden_tv{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/machinery/button/door/directional/north{ + id = "detective_shutters"; + name = "detective's office shutters control"; + req_access_txt = "4" + }, +/turf/open/floor/carpet, +/area/space) +"qV" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"qY" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/prepainted/daedalus, +/area/space) +"ra" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"rg" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/start/assistant, +/obj/effect/landmark/start/hangover, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/obj/machinery/button/door/directional/west{ + id = "Toilet3"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/iron/freezer, +/area/space) +"rj" = ( +/obj/machinery/suit_storage_unit/hos, +/obj/item/radio/intercom/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"rp" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"rs" = ( +/obj/item/storage/secure/safe/directional/north{ + name = "armory safe A" + }, +/turf/open/floor/iron/dark, +/area/space) +"ry" = ( +/obj/docking_port/stationary/random{ + id = "pod_2_lavaland"; + name = "lavaland" + }, +/turf/open/space, +/area/space) +"rA" = ( +/obj/item/storage/secure/safe/hos{ + pixel_x = 36; + pixel_y = 28 + }, +/obj/machinery/status_display/evac/directional/north, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/space) +"rC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"rD" = ( +/obj/effect/spawner/structure/window/prepainted/daedalus, +/turf/open/floor/plating, +/area/space) +"rF" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"rH" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/pen, +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/photo_album/prison, +/obj/item/camera, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"rI" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/space) +"rL" = ( +/obj/structure/bookcase/random, +/turf/open/floor/iron, +/area/space) +"rM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"rN" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation Monitoring"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/grimy, +/area/space) +"rP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"rQ" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/structure/mirror/directional/east, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/freezer, +/area/space) +"rW" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/space) +"sa" = ( +/obj/effect/spawner/random/entertainment/arcade, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"sb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"sd" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"se" = ( +/obj/structure/rack, +/obj/item/toy/plush/lizard_plushie/green{ + name = "Given-As-Compensation" + }, +/turf/open/floor/plating, +/area/space) +"sn" = ( +/obj/machinery/computer/security/mining{ + dir = 4 + }, +/obj/machinery/light/directional/north, +/obj/item/radio/intercom/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"so" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/light/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"sq" = ( +/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/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"st" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/sparker/directional/west{ + id = "executionburn" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/space) +"sw" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/toy/beach_ball/holoball, +/turf/open/floor/iron, +/area/space) +"sy" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/item/radio/intercom/prison/directional/west, +/turf/open/floor/iron/white, +/area/space) +"sz" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"sA" = ( +/obj/machinery/photocopier{ + pixel_y = 3 + }, +/turf/open/floor/iron/dark, +/area/space) +"sE" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "PermaLockdown"; + name = "Lockdown Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"sL" = ( +/obj/structure/closet/secure_closet/warden, +/obj/item/gun/energy/laser, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"sN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"sP" = ( +/obj/structure/disposaloutlet{ + dir = 8; + name = "Prisoner Delivery" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"sQ" = ( +/obj/machinery/mineral/equipment_vendor, +/obj/effect/turf_decal/tile/brown/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"sT" = ( +/obj/effect/spawner/random/vending/colavend, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/wood, +/area/space) +"sV" = ( +/obj/structure/closet{ + name = "Evidence Closet 4" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"sY" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"sZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"ta" = ( +/obj/structure/table/wood, +/obj/item/taperecorder{ + pixel_x = 3 + }, +/obj/item/storage/box/evidence, +/obj/item/flashlight/seclite, +/turf/open/floor/iron/grimy, +/area/space) +"tb" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"td" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/small/directional/south, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/space) +"te" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"tg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"th" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"tk" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"tn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"tq" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"tr" = ( +/obj/machinery/power/terminal, +/obj/machinery/light/small/directional/east, +/obj/item/radio/intercom/directional/east, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/plating, +/area/space) +"tt" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/space) +"tw" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"tC" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/turf/open/floor/iron/dark, +/area/space) +"tQ" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + aiControlDisabled = 1; + id_tag = "prisonereducation"; + name = "Prisoner Education Chamber"; + req_access_txt = "3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"tS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron, +/area/space) +"tW" = ( +/obj/machinery/door/poddoor/shutters{ + id = "visitation"; + name = "Visitation Shutters" + }, +/obj/machinery/door/window/left/directional/south{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/table, +/turf/open/floor/iron, +/area/space) +"tX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/space) +"tZ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/space) +"ua" = ( +/obj/machinery/hydroponics/soil, +/obj/item/cultivator, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/south, +/turf/open/floor/grass, +/area/space) +"ub" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "Security Blast Door" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"ud" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"ue" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + dir = 2; + icon_state = "right"; + name = "Reception Window" + }, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Brig Control Desk"; + req_access_txt = "3" + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/item/storage/fancy/donut_box, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "briglockdown"; + name = "Warden Desk Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/showroomfloor, +/area/space) +"uf" = ( +/obj/structure/rack, +/obj/item/clothing/under/misc/mailman, +/obj/item/clothing/under/misc/vice_officer, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/space) +"uj" = ( +/obj/machinery/meter, +/obj/machinery/door/window/left/directional/west{ + dir = 1; + name = "gas ports" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron/dark, +/area/space) +"ul" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"um" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"up" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space) +"uv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"uB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"uC" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"uE" = ( +/obj/machinery/holopad/secure, +/turf/open/floor/iron/dark, +/area/space) +"uH" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"uJ" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/grass, +/area/space) +"uL" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"uM" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"uN" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"uP" = ( +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/item/clothing/gloves/color/fyellow, +/turf/open/floor/plating, +/area/space) +"uQ" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"uR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"uS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"uT" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/machinery/door/window/right/directional/east{ + base_state = "left"; + dir = 1; + icon_state = "left"; + name = "Danger: Conveyor Access"; + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/space) +"uU" = ( +/obj/structure/rack, +/obj/item/storage/box/firingpins{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/storage/box/firingpins, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"uW" = ( +/obj/structure/table, +/obj/item/storage/toolbox/emergency, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/space) +"uY" = ( +/obj/structure/bed/roller, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"va" = ( +/obj/machinery/computer/security/telescreen/interrogation{ + name = "isolation room monitor"; + network = list("isolation"); + pixel_y = 31 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"ve" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"vh" = ( +/obj/structure/chair, +/turf/open/floor/iron, +/area/space) +"vi" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/space) +"vl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron/white, +/area/space) +"vm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/space) +"vo" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/mud, +/area/space) +"vp" = ( +/obj/structure/table, +/obj/item/inspector{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/inspector{ + pixel_x = 5 + }, +/turf/open/floor/iron/dark, +/area/space) +"vr" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"vt" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/space) +"vu" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"vw" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/space) +"vB" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"vG" = ( +/obj/structure/sign/gym/directional/south, +/turf/open/space/basic, +/area/space) +"vH" = ( +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"vI" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron, +/area/space) +"vJ" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/dark, +/area/space) +"vO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"vP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/landmark/start/depsec/supply, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"vT" = ( +/obj/machinery/door/airlock/external{ + name = "Security External Airlock"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space) +"vU" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/space) +"vX" = ( +/obj/effect/spawner/random/trash/garbage{ + spawn_scatter_radius = 1 + }, +/turf/open/floor/plating, +/area/space) +"vY" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/obj/item/radio/intercom/prison/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"we" = ( +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating/airless, +/area/space) +"wg" = ( +/turf/open/floor/iron/dark/corner{ + dir = 4 + }, +/area/space) +"wk" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/space) +"wn" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes, +/turf/open/floor/carpet, +/area/space) +"wo" = ( +/obj/item/radio/intercom/directional/west, +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/sec/surgery{ + pixel_y = 5 + }, +/obj/item/clothing/mask/balaclava, +/obj/item/reagent_containers/spray/cleaner{ + pixel_x = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"wr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Secure Gear Storage"; + req_access_txt = "3" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"wt" = ( +/obj/machinery/biogenerator, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/space) +"wv" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"wx" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/space) +"wy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"wz" = ( +/obj/structure/disposalpipe/junction, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"wF" = ( +/mob/living/simple_animal/hostile/retaliate/hog/security, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/mud, +/area/space) +"wJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"wL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 6 + }, +/obj/machinery/light/directional/north, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/iron, +/area/space) +"wM" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/turf/open/floor/plating, +/area/space) +"wR" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"wS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron, +/area/space) +"wV" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"wW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Visitation" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"wY" = ( +/obj/machinery/mineral/stacking_machine{ + input_dir = 2 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"wZ" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 2"; + name = "Cell 2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"xb" = ( +/obj/structure/table/wood, +/obj/item/stamp/hos, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/wood, +/area/space) +"xi" = ( +/obj/item/target/syndicate, +/obj/structure/training_machine, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"xm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"xn" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet4"; + name = "Unit 4" + }, +/turf/open/floor/iron/freezer, +/area/space) +"xp" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "PermaLockdown"; + name = "Lockdown Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"xq" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/small/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"xr" = ( +/obj/structure/table/reinforced, +/obj/machinery/camera/directional/west{ + c_tag = "Prison Cafeteria"; + network = list("ss13","prison") + }, +/obj/item/food/energybar, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"xx" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/light/small/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/space) +"xz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"xC" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"xD" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"xL" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "detective_shutters"; + name = "detective's office shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"xN" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/mud, +/area/space) +"xO" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Prison Central"; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"xS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + name = "justice injector" + }, +/turf/open/floor/iron/dark, +/area/space) +"xV" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"xX" = ( +/obj/machinery/firealarm/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"xZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"ya" = ( +/turf/open/floor/iron/dark, +/area/space) +"yd" = ( +/obj/structure/filingcabinet, +/turf/open/floor/iron/grimy, +/area/space) +"yj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/rack, +/obj/item/assembly/timer, +/obj/effect/spawner/random/maintenance, +/obj/item/storage/box/shipping, +/obj/item/storage/toolbox/mechanical, +/obj/item/radio/off{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/wrench, +/turf/open/floor/iron, +/area/space) +"yl" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/space) +"yq" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"yu" = ( +/turf/open/floor/carpet, +/area/space) +"yv" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"yy" = ( +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"yB" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small/directional/east, +/obj/machinery/newscaster/directional/east, +/obj/effect/landmark/start/assistant, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/south{ + id = "Toilet4"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_y = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/space) +"yC" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"yD" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Brig Control"; + req_access_txt = "3" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"yG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"yJ" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/deck, +/turf/open/floor/iron, +/area/space) +"yL" = ( +/obj/effect/spawner/random/contraband/prison, +/obj/structure/closet/crate, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/radio/intercom/prison/directional/north, +/turf/open/floor/plating, +/area/space) +"yN" = ( +/obj/machinery/door/airlock/grunge{ + name = "Cell 3" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"yO" = ( +/obj/machinery/light/directional/south, +/obj/machinery/firealarm/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"yQ" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"yS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"yT" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/space) +"yV" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/dark/side{ + dir = 1 + }, +/area/space) +"za" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/space) +"zc" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/disposal/delivery_chute{ + dir = 4; + name = "Prisoner Transfer" + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/structure/plasticflaps/opaque{ + name = "Prisoner Transfer" + }, +/turf/open/floor/iron, +/area/space) +"zd" = ( +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/grimy, +/area/space) +"ze" = ( +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/structure/sign/departments/court{ + pixel_y = -32 + }, +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/space) +"zf" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/sign/warning/vacuum/external, +/turf/open/floor/plating, +/area/space) +"zg" = ( +/obj/machinery/computer/security/hos{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/space) +"zi" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"zt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"zx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"zA" = ( +/obj/structure/closet/secure_closet/miner, +/turf/open/floor/iron, +/area/space) +"zB" = ( +/obj/machinery/vending/cola/red, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"zE" = ( +/obj/machinery/light_switch/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/carpet, +/area/space) +"zF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"zG" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"zL" = ( +/obj/machinery/airalarm/directional/west, +/obj/structure/rack, +/obj/item/reagent_containers/glass/bottle/morphine, +/obj/item/storage/box/chemimp{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/storage/box/trackimp, +/obj/item/storage/lockbox/loyalty, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"zN" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"zO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"zP" = ( +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/iron, +/area/space) +"zQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron, +/area/space) +"zS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 10 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/space) +"zY" = ( +/obj/structure/filingcabinet/security{ + pixel_x = 4 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"Ab" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Af" = ( +/obj/structure/rack, +/obj/item/vending_refill/security, +/obj/item/storage/box/handcuffs, +/obj/item/storage/box/flashbangs{ + pixel_x = -2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"Ai" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"Aj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/space) +"Ak" = ( +/obj/machinery/door/airlock/grunge{ + name = "Cell 4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"Al" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Ao" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark/corner, +/area/space) +"Ap" = ( +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/space) +"Aq" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/camera/directional/east{ + c_tag = "Prison Workshop"; + network = list("ss13","prison") + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Au" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/space) +"Av" = ( +/obj/structure/bed/roller, +/obj/structure/bed/roller, +/obj/machinery/iv_drip, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/space) +"Ay" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Az" = ( +/obj/machinery/airalarm/directional/north, +/obj/machinery/light/directional/north, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"AA" = ( +/obj/structure/table, +/turf/open/floor/iron/dark, +/area/space) +"AC" = ( +/obj/machinery/holopad/secure, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/space) +"AE" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/status_display/evac/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"AL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"AM" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"AN" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"AO" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"AP" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron/freezer, +/area/space) +"AR" = ( +/obj/structure/table, +/obj/item/instrument/harmonica, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"AS" = ( +/obj/structure/reagent_dispensers/wall/peppertank/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Gear Room" + }, +/obj/machinery/vending/wardrobe/sec_wardrobe, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"AU" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"AV" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"AX" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"AZ" = ( +/obj/structure/sign/directions/security{ + dir = 1; + pixel_y = 8 + }, +/turf/closed/wall/prepainted/daedalus, +/area/space) +"Ba" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Bb" = ( +/obj/structure/chair{ + name = "Bailiff" + }, +/obj/item/radio/intercom/directional/north, +/turf/open/floor/iron, +/area/space) +"Bi" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Bl" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space) +"Bn" = ( +/obj/structure/rack, +/obj/item/restraints/handcuffs{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Bs" = ( +/obj/item/phone{ + desc = "Supposedly a direct line to Nanotrasen Central Command. It's not even plugged in."; + pixel_x = -3; + pixel_y = 3 + }, +/obj/item/cigbutt/cigarbutt{ + pixel_x = 5; + pixel_y = -1 + }, +/obj/structure/table/wood, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/grimy, +/area/space) +"By" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/pen/red, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + name = "Prison Monitor"; + network = list("prison"); + pixel_y = 30 + }, +/turf/open/floor/wood, +/area/space) +"Bz" = ( +/obj/effect/landmark/start/hangover, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/freezer, +/area/space) +"BB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/space) +"BD" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 2 + }, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"BG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"BI" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/landmark/start/security_officer, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"BJ" = ( +/obj/structure/chair, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/wood, +/area/space) +"BK" = ( +/obj/structure/rack, +/obj/item/gun/ballistic/shotgun/riot, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 6 + }, +/obj/item/gun/ballistic/shotgun/riot{ + pixel_y = 3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"BM" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/space) +"BN" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"BO" = ( +/obj/machinery/holopad, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/grimy, +/area/space) +"BQ" = ( +/obj/structure/table/wood, +/obj/item/paper_bin/carbon{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/item/book/manual/wiki/security_space_law, +/turf/open/floor/carpet, +/area/space) +"BR" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/space, +/area/space) +"BS" = ( +/obj/structure/urinal/directional/north, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/freezer, +/area/space) +"BT" = ( +/obj/structure/rack, +/obj/machinery/light/directional/west, +/obj/item/clothing/head/helmet/riot{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/riot{ + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/riot{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_y = -2 + }, +/obj/item/clothing/head/helmet/alt{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"BZ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + dir = 1; + sortType = 30 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Ca" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"Cd" = ( +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Ce" = ( +/obj/structure/rack, +/obj/item/clothing/suit/hazardvest, +/turf/open/floor/plating, +/area/space) +"Ch" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "16" + }, +/obj/structure/cable/yellow{ + icon_state = "18" + }, +/turf/open/floor/plating, +/area/space) +"Cj" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/structure/mirror/directional/east, +/turf/open/floor/iron/freezer, +/area/space) +"Cl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Cm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/flasher/directional/west{ + id = "Cell 3"; + pixel_y = -22 + }, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/iron, +/area/space) +"Co" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Cp" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"Ct" = ( +/obj/machinery/door/airlock/security{ + id_tag = "IsolationCell"; + name = "Isolation Cell"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Cy" = ( +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposaloutlet{ + dir = 4; + name = "Cargo Deliveries" + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"Cz" = ( +/obj/structure/table, +/obj/item/folder/red{ + pixel_x = 3 + }, +/obj/item/taperecorder{ + pixel_x = -3 + }, +/obj/item/storage/fancy/cigarettes, +/obj/item/assembly/flash/handheld, +/obj/item/reagent_containers/spray/pepper, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"CA" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/mud, +/area/space) +"CC" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"CG" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"CI" = ( +/obj/machinery/door/airlock/security{ + name = "Court Cell"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/space) +"CK" = ( +/obj/structure/table/reinforced, +/obj/item/flashlight, +/obj/item/analyzer{ + pixel_x = 7; + pixel_y = 3 + }, +/obj/item/assembly/signaler, +/obj/item/stack/rods{ + amount = 25 + }, +/obj/item/stack/cable_coil, +/obj/item/gps, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/gps, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron, +/area/space) +"CN" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/machinery/photocopier, +/turf/open/floor/carpet, +/area/space) +"CQ" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/space) +"CR" = ( +/obj/machinery/portable_atmospherics/canister/carbon_dioxide, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"CS" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"CU" = ( +/obj/effect/landmark/blobstart, +/obj/structure/closet/secure_closet/detective, +/turf/open/floor/iron/grimy, +/area/space) +"CW" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"CY" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/small/directional/west, +/obj/machinery/computer/pod/old/mass_driver_controller/trash{ + pixel_x = -24 + }, +/turf/open/floor/plating, +/area/space) +"CZ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"Db" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "garbage" + }, +/obj/machinery/recycler, +/turf/open/floor/plating, +/area/space) +"Dc" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/pestspawn, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Dd" = ( +/turf/closed/wall/r_wall/prepainted/daedalus, +/area/space) +"De" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) +"Dg" = ( +/obj/structure/chair/stool/directional/south, +/obj/item/radio/intercom/prison/directional/north, +/turf/open/floor/iron, +/area/space) +"Di" = ( +/obj/structure/closet/bombcloset/security, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Dk" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Dm" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/space) +"Do" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Dp" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/closet/crate/trashcart/laundry, +/obj/effect/spawner/random/contraband/prison, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/item/clothing/under/rank/prisoner/skirt, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/cafeteria, +/area/space) +"Dr" = ( +/obj/effect/turf_decal/tile/brown/half/contrasted, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron, +/area/space) +"Ds" = ( +/obj/structure/chair/stool/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Dx" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"Dz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"DA" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/wood, +/area/space) +"DD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Armory"; + req_access_txt = "3" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/delivery, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/space) +"DH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Vault Storage" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"DI" = ( +/turf/open/floor/mud, +/area/space) +"DK" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"DL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/camera/directional/north{ + c_tag = "Brig - Hallway - Port" + }, +/obj/machinery/light/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"DP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/carpet, +/area/space) +"DQ" = ( +/obj/machinery/light/small/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Security - EVA Storage" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"DS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/space) +"DT" = ( +/obj/structure/lattice, +/obj/structure/sign/warning/electricshock{ + pixel_y = -32 + }, +/turf/open/space/basic, +/area/space) +"DY" = ( +/obj/machinery/door/window/left/directional/west{ + dir = 4; + name = "Infirmary" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"Eb" = ( +/obj/structure/table, +/obj/machinery/light/dim/directional/south, +/turf/open/floor/iron, +/area/space) +"Ed" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Eh" = ( +/obj/machinery/computer/crew{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron, +/area/space) +"El" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Em" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=1"; + freq = 1400; + location = "Disposals" + }, +/obj/structure/plasticflaps, +/obj/machinery/door/window/right/directional/north{ + dir = 2; + name = "delivery door"; + req_access_txt = "31" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/turf/open/floor/plating, +/area/space) +"En" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/space) +"Eq" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/plating, +/area/space) +"Es" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/space) +"Eu" = ( +/turf/closed/wall/mineral/plastitanium, +/area/space) +"Ew" = ( +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/turf/open/space/basic, +/area/space) +"Ex" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Ey" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/white, +/area/space) +"EB" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"EC" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"ED" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/door/poddoor/shutters/window{ + id = "armory"; + name = "armory shutters" + }, +/turf/open/floor/iron/dark, +/area/space) +"EI" = ( +/turf/open/floor/iron/freezer, +/area/space) +"EJ" = ( +/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/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"EK" = ( +/obj/machinery/navbeacon{ + codes_txt = "delivery;dir=8"; + dir = 8; + freq = 1400; + location = "Security" + }, +/obj/structure/plasticflaps/opaque, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/space) +"EO" = ( +/obj/structure/table, +/obj/item/wirecutters, +/obj/item/screwdriver{ + pixel_x = -2; + pixel_y = 10 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/syndicatebomb/training, +/turf/open/floor/iron, +/area/space) +"ER" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"EV" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"EW" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"EY" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Fc" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/dark, +/area/space) +"Fd" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/space) +"Fg" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"Fi" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"Fj" = ( +/obj/structure/table, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/button/door{ + desc = "A door remote control switch for the exterior brig doors."; + id = "outerbrig"; + name = "Brig Exterior Door Control"; + normaldoorcontrol = 1; + pixel_x = 6; + pixel_y = 7; + req_access_txt = "63" + }, +/obj/machinery/button/flasher{ + id = "secentranceflasher"; + name = "Brig Entrance Flasher"; + pixel_y = -3; + req_access_txt = "1" + }, +/obj/machinery/button/door{ + desc = "A door remote control switch for the interior brig doors."; + id = "innerbrig"; + name = "Brig Interior Door Control"; + normaldoorcontrol = 1; + pixel_x = -6; + pixel_y = 7; + req_access_txt = "63" + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Fk" = ( +/obj/structure/closet/l3closet/security, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Fl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Fq" = ( +/obj/structure/table, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 5 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/white, +/area/space) +"Fr" = ( +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"Fs" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"Ft" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"Fv" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"Fx" = ( +/obj/structure/bed, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Fy" = ( +/obj/effect/decal/cleanable/blood/tracks{ + dir = 4 + }, +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/space) +"Fz" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"FA" = ( +/obj/machinery/computer/shuttle/mining{ + dir = 1; + req_access = null + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/space) +"FG" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"FK" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/space) +"FL" = ( +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"FO" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/white, +/area/space) +"FP" = ( +/obj/effect/spawner/random/engineering/vending_restock, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"FR" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"FW" = ( +/obj/structure/grille/broken, +/obj/item/bouquet/poppy, +/turf/open/floor/plating/airless, +/area/space) +"Ga" = ( +/obj/machinery/door/window{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/space) +"Gc" = ( +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"Gd" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Prison Sanitarium"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/white, +/area/space) +"Ge" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 11 + }, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Gf" = ( +/obj/effect/spawner/random/structure/grille, +/turf/open/floor/plating, +/area/space) +"Gg" = ( +/turf/open/floor/iron, +/area/space) +"Gk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Gl" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Gn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"Go" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"Gp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Gr" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"Gt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"Gu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/grimy, +/area/space) +"Gv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/light/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Gw" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/space) +"Gx" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/space) +"Gy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"GA" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/airalarm/directional/east, +/obj/machinery/flasher/directional/north{ + id = "IsolationFlash" + }, +/turf/open/floor/iron/white, +/area/space) +"GD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"GE" = ( +/turf/open/floor/plating, +/area/space) +"GH" = ( +/obj/structure/sign/warning/electricshock{ + pixel_x = 32 + }, +/turf/open/space/basic, +/area/space) +"GI" = ( +/obj/structure/urinal/directional/north, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/freezer, +/area/space) +"GK" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/space) +"GM" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/suit_storage_unit/mining, +/turf/open/floor/plating, +/area/space) +"GO" = ( +/obj/structure/rack, +/obj/item/radio/off{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/item/radio/off{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"GP" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"GT" = ( +/obj/machinery/firealarm/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"GV" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"GW" = ( +/obj/machinery/camera/motion/directional/south{ + c_tag = "Vault"; + network = list("vault") + }, +/obj/machinery/light/directional/south, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/space) +"GX" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "hosspace"; + name = "Space Shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"Ha" = ( +/obj/docking_port/stationary{ + dwidth = 1; + height = 4; + roundstart_template = /datum/map_template/shuttle/escape_pod/default; + width = 3 + }, +/turf/open/space/basic, +/area/space) +"Hb" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/item/radio/intercom/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Hg" = ( +/obj/machinery/door_timer{ + id = "Cell 2"; + name = "Cell 2"; + pixel_y = -32 + }, +/obj/effect/landmark/event_spawn, +/turf/open/floor/iron, +/area/space) +"Hi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/turf/open/floor/iron, +/area/space) +"Hj" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/iron, +/area/space) +"Hm" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/space) +"Ho" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"Hq" = ( +/obj/item/folder/red, +/obj/item/pen, +/obj/structure/table/glass, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 10 + }, +/obj/item/folder/white{ + pixel_x = -4; + pixel_y = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Ht" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Hu" = ( +/obj/item/toy/beach_ball/holoball, +/turf/open/floor/plating, +/area/space) +"Hv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/space) +"Hw" = ( +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/security/glass{ + name = "Security Office"; + req_one_access_txt = "1;4" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron/dark, +/area/space) +"Hy" = ( +/obj/effect/landmark/start/shaft_miner, +/turf/open/floor/iron, +/area/space) +"HA" = ( +/obj/effect/turf_decal/trimline/neutral/filled/corner{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"HB" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"HC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/light/directional/south, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"HE" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"HG" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"HH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron, +/area/space) +"HJ" = ( +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"HP" = ( +/obj/machinery/door/airlock{ + name = "Cleaning Closet" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"HS" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"HY" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/wood, +/area/space) +"HZ" = ( +/obj/machinery/recharge_station, +/turf/open/floor/iron/dark, +/area/space) +"Ib" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"Id" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Ie" = ( +/obj/effect/spawner/random/vending/snackvend, +/obj/machinery/light/directional/east, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/wood, +/area/space) +"Ig" = ( +/obj/machinery/conveyor{ + dir = 1; + id = "garbage" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Disposal Exit"; + name = "disposal exit vent" + }, +/turf/open/floor/plating, +/area/space) +"Ih" = ( +/obj/structure/bed, +/obj/item/bedsheet/red, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/iron/dark, +/area/space) +"Ij" = ( +/obj/item/stack/cable_coil/yellow, +/turf/open/floor/plating/airless, +/area/space) +"Im" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/white/line{ + dir = 1 + }, +/obj/item/radio/intercom/prison/directional/north, +/turf/open/floor/iron, +/area/space) +"In" = ( +/obj/structure/closet/secure_closet/courtroom, +/obj/machinery/light_switch/directional/north, +/obj/item/gavelblock, +/obj/item/gavelhammer, +/turf/open/floor/iron, +/area/space) +"Ip" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"It" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"Iu" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/iron, +/area/space) +"Iw" = ( +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Iz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"IA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/space) +"ID" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/structure/closet/crate/goldcrate, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"IE" = ( +/obj/structure/bed, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/machinery/light/small/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"IF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"IH" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/space) +"IJ" = ( +/obj/machinery/recharge_station, +/obj/effect/turf_decal/stripes/end{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"IM" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"IP" = ( +/obj/machinery/door/poddoor/massdriver_trash, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/space) +"IR" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/restraints/handcuffs, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/clothing/head/cone{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/dark, +/area/space) +"IT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"IU" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/camera/directional/north{ + c_tag = "Cargo Bay - Fore" + }, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/box/red, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"IX" = ( +/obj/effect/turf_decal/trimline/red/filled/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"IY" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating/airless, +/area/space) +"IZ" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Jg" = ( +/obj/structure/closet/crate, +/obj/item/reagent_containers/glass/bowl, +/obj/effect/spawner/random/contraband/prison, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/reagent_containers/glass/bowl, +/obj/item/kitchen/fork/plastic, +/obj/item/kitchen/fork/plastic, +/obj/item/kitchen/fork/plastic, +/obj/item/storage/box/drinkingglasses, +/obj/item/kitchen/spoon/plastic, +/obj/item/kitchen/spoon/plastic, +/obj/item/kitchen/spoon/plastic, +/obj/item/knife/plastic, +/obj/item/knife/plastic, +/obj/item/knife/plastic, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/bag/tray/cafeteria, +/obj/item/storage/box/drinkingglasses, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/space) +"Jh" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/space) +"Ji" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/light_switch/directional/east, +/obj/machinery/light/small/directional/east, +/turf/open/floor/plating, +/area/space) +"Jj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 9 + }, +/turf/open/floor/iron, +/area/space) +"Jm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"Jn" = ( +/obj/machinery/newscaster/directional/north, +/obj/structure/table/glass, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/glass/beaker{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/reagent_containers/dropper, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"Jt" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/camera/directional/west{ + c_tag = "Prison Cell Block 2"; + network = list("ss13","prison") + }, +/turf/open/floor/iron/white, +/area/space) +"Jv" = ( +/obj/machinery/flasher/portable, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"Jz" = ( +/obj/effect/turf_decal/trimline/green/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"JA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"JC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"JD" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"JG" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/closet, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/plating, +/area/space) +"JJ" = ( +/obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/wood, +/area/space) +"JK" = ( +/obj/machinery/light/directional/east, +/obj/structure/table, +/obj/machinery/recharger{ + pixel_x = 6; + pixel_y = 4 + }, +/obj/item/paper_bin{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = -11; + pixel_y = 7 + }, +/obj/item/hand_labeler{ + pixel_x = -10; + pixel_y = -6 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/computer/security/telescreen{ + desc = "Used for watching Prison Wing holding areas."; + dir = 8; + name = "Prison Monitor"; + network = list("prison"); + pixel_x = 30 + }, +/turf/open/floor/iron, +/area/space) +"JL" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Weapon Distribution"; + req_access_txt = "3" + }, +/obj/item/paper, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/left/directional/south{ + name = "Requests Window" + }, +/obj/item/pen, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/dark, +/area/space) +"JM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron/dark/side{ + dir = 4 + }, +/area/space) +"JN" = ( +/obj/machinery/door/airlock{ + id_tag = "Toilet1"; + name = "Unit 1" + }, +/turf/open/floor/iron/freezer, +/area/space) +"JV" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"JW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/wood, +/area/space) +"JX" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/obj/item/plant_analyzer, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/grass, +/area/space) +"JZ" = ( +/obj/item/storage/bag/trash, +/obj/machinery/airalarm/directional/west, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"Ka" = ( +/obj/machinery/light/small/directional/south, +/obj/item/radio/intercom/directional/south, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/grimy, +/area/space) +"Kc" = ( +/obj/machinery/door/airlock/mining/glass{ + name = "Mining Dock"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Kd" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Kh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/cafeteria, +/area/space) +"Kj" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) +"Kl" = ( +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"Km" = ( +/obj/structure/table, +/obj/item/storage/backpack/duffelbag/sec{ + pixel_y = 7 + }, +/obj/item/storage/backpack/duffelbag/sec, +/turf/open/floor/iron/dark, +/area/space) +"Kn" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"Kp" = ( +/obj/machinery/plate_press, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/space) +"Kq" = ( +/obj/structure/mirror/directional/west, +/obj/machinery/shower{ + dir = 4 + }, +/turf/open/floor/iron/freezer, +/area/space) +"Ku" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/wood, +/area/space) +"Kv" = ( +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space) +"Kw" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"KE" = ( +/obj/structure/closet{ + name = "Evidence Closet 2" + }, +/obj/machinery/airalarm/directional/west, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"KF" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/mud, +/area/space) +"KG" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"KK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"KM" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"KO" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/turf/open/floor/plating, +/area/space) +"KP" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/grass, +/area/space) +"KS" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"KT" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;63;48;50" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"KV" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"KW" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Disposal Access"; + req_access_txt = "12" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"KZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/wood, +/area/space) +"Li" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Lj" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"Ll" = ( +/obj/structure/chair, +/obj/machinery/light/directional/north, +/turf/open/floor/iron, +/area/space) +"Ln" = ( +/obj/machinery/power/solar{ + id = "foreport"; + name = "Fore-Port Solar Array" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/iron/solarpanel/airless, +/area/space) +"Ls" = ( +/obj/structure/rack, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/under/rank/prisoner, +/obj/item/clothing/shoes/sneakers/orange, +/obj/item/clothing/shoes/sneakers/orange, +/obj/item/clothing/shoes/sneakers/orange, +/obj/item/clothing/shoes/sneakers/orange, +/obj/item/clothing/shoes/sneakers/orange, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/item/restraints/handcuffs, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/south, +/turf/open/floor/iron, +/area/space) +"Lt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"Lu" = ( +/obj/structure/lattice/catwalk, +/obj/structure/marker_beacon/burgundy, +/turf/open/space/basic, +/area/space) +"Ly" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"LA" = ( +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/structure/disposaloutlet{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"LB" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"LC" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space) +"LE" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"LF" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible/layer4{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space) +"LJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"LK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"LL" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron/freezer, +/area/space) +"LO" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"LS" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"LU" = ( +/obj/structure/table/reinforced, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/item/radio/off{ + pixel_x = -11; + pixel_y = -3 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"LW" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/light/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"LZ" = ( +/obj/structure/rack, +/obj/item/storage/box/flashes{ + pixel_x = 3 + }, +/obj/item/storage/box/teargas{ + pixel_x = 1; + pixel_y = -2 + }, +/obj/item/gun/grenadelauncher, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"Mb" = ( +/obj/structure/bed/roller, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"Mi" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/white, +/area/space) +"Mj" = ( +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/newscaster/directional/south, +/obj/effect/landmark/blobstart, +/obj/effect/landmark/start/hangover, +/obj/machinery/button/door/directional/west{ + id = "Toilet2"; + name = "Lock Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/effect/spawner/random/trash/graffiti{ + pixel_x = -32; + spawn_loot_chance = 50 + }, +/turf/open/floor/iron/freezer, +/area/space) +"Mk" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/servingdish, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Mq" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Mr" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Ms" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"Mt" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"Mw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/freezer, +/area/space) +"MC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/space) +"MG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"MI" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"MJ" = ( +/obj/structure/lattice, +/obj/effect/spawner/random/structure/grille, +/turf/open/space/basic, +/area/space) +"MK" = ( +/obj/structure/table, +/obj/item/storage/bag/tray/cafeteria, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"ML" = ( +/obj/structure/table, +/obj/machinery/recharger{ + pixel_y = 4 + }, +/obj/machinery/newscaster/directional/east, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/iron/dark, +/area/space) +"MO" = ( +/obj/machinery/modular_computer/console/preset/id{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"MP" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/weightmachine/weightlifter, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"MQ" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"MR" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"MS" = ( +/obj/structure/filingcabinet, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"MT" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/landmark/navigate_destination, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"MU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Prison Laundry"; + network = list("ss13","prison") + }, +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/cafeteria, +/area/space) +"MY" = ( +/obj/structure/table, +/obj/item/poster/random_official{ + pixel_y = 13 + }, +/obj/item/poster/random_official{ + pixel_y = 5 + }, +/obj/item/poster/random_official, +/turf/open/floor/iron/dark, +/area/space) +"MZ" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Na" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/iron, +/area/space) +"Nb" = ( +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Nc" = ( +/obj/machinery/door/window/right/directional/east{ + base_state = "left"; + icon_state = "left"; + name = "Danger: Conveyor Access"; + req_access_txt = "12" + }, +/obj/machinery/conveyor/inverted{ + dir = 6; + id = "garbage" + }, +/turf/open/floor/plating, +/area/space) +"Nd" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"Ng" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"Ni" = ( +/obj/machinery/status_display/supply{ + pixel_y = 32 + }, +/obj/machinery/conveyor{ + dir = 5; + id = "QMLoad2" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"Nl" = ( +/obj/item/radio/intercom/directional/north, +/obj/machinery/light/directional/north, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Nn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"No" = ( +/obj/item/tank/internals/oxygen/red{ + pixel_x = -4; + pixel_y = -1 + }, +/obj/item/tank/internals/oxygen/red{ + pixel_x = 4; + pixel_y = -1 + }, +/obj/item/tank/internals/anesthetic{ + pixel_x = 2 + }, +/obj/item/storage/toolbox/mechanical, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas, +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/item/wrench, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, +/turf/open/floor/iron/dark, +/area/space) +"Nq" = ( +/obj/machinery/light/directional/south, +/obj/item/stack/sheet/cardboard{ + amount = 14 + }, +/obj/item/stack/package_wrap, +/turf/open/floor/iron, +/area/space) +"Nu" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/plating, +/area/space) +"Nw" = ( +/obj/vehicle/ridden/secway, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"Nx" = ( +/obj/structure/table, +/obj/machinery/microwave, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Ny" = ( +/obj/machinery/microwave{ + pixel_x = -3; + pixel_y = 6 + }, +/obj/structure/table, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"Nz" = ( +/obj/effect/landmark/start/lawyer, +/obj/structure/chair/office{ + dir = 4 + }, +/obj/item/radio/intercom/directional/west, +/turf/open/floor/wood, +/area/space) +"NA" = ( +/obj/structure/table/wood, +/obj/machinery/computer/med_data/laptop{ + dir = 1 + }, +/obj/machinery/light/small/directional/west, +/obj/machinery/button/door/directional/west{ + id = "hosprivacy"; + name = "Privacy Shutters Control" + }, +/turf/open/floor/wood, +/area/space) +"NC" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"ND" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "hosprivacy"; + name = "privacy shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"NF" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -18; + pixel_y = 3 + }, +/obj/item/paper_bin{ + pixel_x = 3; + pixel_y = 7 + }, +/obj/item/pen{ + pixel_x = 3; + pixel_y = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"NG" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/wood, +/area/space) +"NH" = ( +/obj/structure/table/reinforced, +/obj/structure/reagent_dispensers/servingdish, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/white, +/area/space) +"NI" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod Two"; + space_dir = 1 + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/space) +"NK" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/newscaster/directional/west, +/turf/open/floor/iron, +/area/space) +"NL" = ( +/obj/effect/turf_decal/trimline/blue/filled/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"NT" = ( +/obj/machinery/door/airlock{ + name = "Prison Showers" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/freezer, +/area/space) +"NU" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron/white, +/area/space) +"NW" = ( +/obj/structure/table, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"NZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/space) +"Oa" = ( +/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/tile/red/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"Ob" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/turf/open/floor/plating, +/area/space) +"Of" = ( +/obj/structure/rack, +/obj/item/gun/energy/e_gun/dragnet, +/obj/item/gun/energy/e_gun/dragnet, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 4 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/iron/dark, +/area/space) +"Oh" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/orange, +/obj/item/restraints/handcuffs, +/obj/item/reagent_containers/spray/pepper, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Oi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"Ok" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Ol" = ( +/obj/machinery/computer/med_data{ + dir = 8 + }, +/obj/machinery/newscaster/directional/east, +/turf/open/floor/carpet, +/area/space) +"Om" = ( +/obj/machinery/light/directional/west, +/obj/machinery/light_switch/directional/west, +/obj/effect/turf_decal/tile/red/half/contrasted, +/turf/open/floor/iron, +/area/space) +"Oo" = ( +/obj/structure/rack, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 5 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = 1 + }, +/obj/item/gun/energy/laser/practice{ + pixel_x = 2; + pixel_y = -2 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"Ot" = ( +/obj/effect/spawner/random/maintenance, +/obj/structure/closet, +/turf/open/floor/plating, +/area/space) +"Ow" = ( +/obj/machinery/light_switch/directional/north, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"Oz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Mining Dock Maintenance"; + req_access_txt = "48" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"OB" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 5 + }, +/obj/machinery/light_switch/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"OC" = ( +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/space) +"OF" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault{ + name = "Vault"; + req_access_txt = "53" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"OJ" = ( +/obj/structure/toilet/greyscale{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"OK" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Security Maintenance"; + req_one_access_txt = "1;4" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"ON" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Prison Cafeteria" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/white, +/area/space) +"OO" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/white, +/area/space) +"OR" = ( +/turf/open/space, +/area/space) +"OS" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 4; + sortType = 7 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"OT" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/light/directional/east, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/wood, +/area/space) +"OX" = ( +/obj/machinery/computer/security{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron, +/area/space) +"OY" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/space) +"OZ" = ( +/obj/structure/table, +/obj/machinery/airalarm/directional/north, +/obj/machinery/computer/med_data/laptop, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Pb" = ( +/obj/structure/sign/warning/pods{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Pe" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/white, +/area/space) +"Pj" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/pdapainter/security, +/turf/open/floor/iron/dark, +/area/space) +"Pk" = ( +/obj/structure/closet/crate, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/item/stack/license_plates/empty/fifty, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"Pm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Pr" = ( +/obj/effect/landmark/start/warden, +/obj/structure/chair/office, +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Pt" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/obj/structure/closet/secure_closet/security/sec, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"Pu" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "PermaLockdown"; + name = "Lockdown Shutters" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/door/airlock/security/glass{ + id_tag = "permaouter"; + name = "Permabrig Transfer"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"Px" = ( +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"PL" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"PN" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"PO" = ( +/obj/machinery/gulag_teleporter, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"PQ" = ( +/obj/effect/spawner/structure/window/reinforced/tinted/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"PT" = ( +/obj/machinery/computer/secure_data{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"PU" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"PY" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet/secure_closet/brig{ + id = "Cell 1"; + name = "Cell 1 Locker" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Qb" = ( +/obj/item/kirbyplants/random, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/iron, +/area/space) +"Qd" = ( +/obj/structure/table, +/obj/item/storage/fancy/cigarettes{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/item/folder/red{ + pixel_x = -5 + }, +/turf/open/floor/iron/dark, +/area/space) +"Qe" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/machinery/keycard_auth/directional/west, +/obj/machinery/requests_console/directional/north{ + announcementConsole = 1; + department = "Head of Security's Desk"; + departmentType = 5; + name = "Head of Security Requests Console" + }, +/obj/machinery/button/door/directional/north{ + id = "hosspace"; + name = "Space Shutters Control"; + pixel_x = -24 + }, +/turf/open/floor/wood, +/area/space) +"Qi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Qj" = ( +/obj/machinery/door/poddoor{ + id = "SecJusticeChamber"; + name = "Justice Vent" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"Ql" = ( +/obj/structure/urinal/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/space) +"Qm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"Qn" = ( +/obj/structure/chair/office, +/obj/machinery/requests_console/directional/north{ + department = "Security"; + departmentType = 3; + name = "Security Requests Console" + }, +/obj/effect/landmark/start/depsec/supply, +/turf/open/floor/iron, +/area/space) +"Qp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + icon_state = "right"; + name = "Shooting Range"; + dir = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Qu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/dark, +/area/space) +"Qw" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Qx" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Permabrig Visitation"; + req_access_txt = "2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/space) +"Qy" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/holohoop{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/white/line{ + dir = 4 + }, +/obj/machinery/camera/directional/east{ + c_tag = "Prison Yard"; + network = list("ss13","prison") + }, +/turf/open/floor/iron, +/area/space) +"QB" = ( +/obj/structure/rack, +/obj/item/gun/energy/ionrifle, +/obj/item/gun/energy/temperature/security, +/obj/item/clothing/suit/hooded/ablative, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/space) +"QE" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"QF" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/obj/effect/spawner/random/trash/garbage{ + spawn_loot_count = 3 + }, +/turf/open/floor/plating, +/area/space) +"QH" = ( +/obj/machinery/button/flasher{ + id = "visitorflash"; + pixel_x = -6; + pixel_y = 24 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/machinery/button/door/directional/north{ + id = "visitation"; + name = "Visitation Shutters"; + pixel_x = 6; + req_access_txt = "2" + }, +/turf/open/floor/iron, +/area/space) +"QJ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Visitation" + }, +/turf/open/floor/iron/white, +/area/space) +"QK" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/item/toy/plush/beeplushie{ + desc = "Maybe hugging this will make you feel better about yourself."; + name = "Therabee" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"QL" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"QN" = ( +/obj/effect/landmark/start/shaft_miner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"QO" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"QP" = ( +/obj/machinery/door/airlock/mining{ + name = "Mining Office"; + req_access_txt = "48" + }, +/obj/machinery/door/firedoor, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"QR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"QS" = ( +/obj/machinery/computer/security/labor{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"QU" = ( +/obj/item/clothing/suit/straight_jacket, +/obj/item/electropack, +/obj/structure/table, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"QV" = ( +/obj/machinery/hydroponics/soil, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/grass, +/area/space) +"QX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"Rf" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron, +/area/space) +"Rg" = ( +/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/tile/blue/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"Rh" = ( +/obj/machinery/power/smes, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"Ro" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Security Post - Cargo"; + req_access_txt = "63" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Rq" = ( +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Infirmary" + }, +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 4 + }, +/turf/open/floor/iron/white, +/area/space) +"Rr" = ( +/obj/structure/sink{ + dir = 8; + pixel_x = 12 + }, +/obj/structure/mirror/directional/east, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/space) +"Rt" = ( +/obj/structure/table/wood, +/obj/item/folder/red, +/obj/item/hand_labeler, +/obj/item/camera/detective, +/turf/open/floor/carpet, +/area/space) +"Rx" = ( +/obj/effect/landmark/pestspawn, +/turf/open/floor/plating, +/area/space) +"Rz" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"RB" = ( +/obj/machinery/door/window/right/directional/east{ + name = "Danger: Conveyor Access"; + req_access_txt = "12" + }, +/obj/machinery/conveyor/inverted{ + dir = 10; + id = "garbage" + }, +/turf/open/floor/plating, +/area/space) +"RE" = ( +/obj/structure/bed, +/obj/item/clothing/suit/straight_jacket, +/obj/item/clothing/glasses/blindfold, +/obj/item/clothing/mask/muzzle, +/obj/item/electropack, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"RF" = ( +/obj/structure/chair/stool/directional/west, +/obj/machinery/camera/directional/north{ + c_tag = "Prison Visitation"; + network = list("ss13","prison") + }, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"RG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"RK" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"RL" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/landmark/start/hangover, +/turf/open/floor/iron/freezer, +/area/space) +"RO" = ( +/obj/structure/extinguisher_cabinet/directional/east, +/obj/machinery/suit_storage_unit/security, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"RP" = ( +/obj/machinery/light_switch/directional/west, +/turf/open/floor/iron/grimy, +/area/space) +"RQ" = ( +/obj/structure/table, +/obj/structure/window, +/obj/item/reagent_containers/food/condiment/saltshaker{ + layer = 3.1; + pixel_x = -2; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + desc = "Often used to flavor food or make people sneeze. Fashionably moved to the left side of the table."; + pixel_x = -8; + pixel_y = 2 + }, +/obj/item/reagent_containers/food/condiment/enzyme{ + pixel_x = 9; + pixel_y = 3 + }, +/obj/item/book/manual/chef_recipes, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"RR" = ( +/obj/structure/closet{ + name = "Evidence Closet 1" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"RV" = ( +/obj/machinery/door/airlock/grunge{ + name = "Prison Workshop" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/firedoor, +/turf/open/floor/iron, +/area/space) +"RW" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/chair/stool/directional/north, +/turf/open/floor/iron, +/area/space) +"RX" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"RZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"Sa" = ( +/obj/structure/table, +/obj/structure/extinguisher_cabinet/directional/east, +/obj/effect/spawner/random/entertainment/dice, +/turf/open/floor/iron, +/area/space) +"Sb" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/obj/machinery/flasher/directional/north{ + id = "visitorflash" + }, +/turf/open/floor/iron, +/area/space) +"Sc" = ( +/obj/structure/closet{ + name = "Evidence Closet 3" + }, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"Se" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/bed, +/obj/item/bedsheet, +/obj/machinery/flasher/directional/west{ + id = "Cell 1" + }, +/turf/open/floor/iron, +/area/space) +"Sj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Sn" = ( +/turf/open/space/basic, +/area/space) +"Sr" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Ss" = ( +/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, +/obj/structure/closet/crate/secure{ + desc = "A secure crate containing various materials for building a customised test-site."; + name = "Firing Range Gear Crate"; + req_access_txt = "1" + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/iron/dark, +/area/space) +"St" = ( +/obj/structure/rack, +/obj/item/clothing/glasses/hud/security/sunglasses/gars{ + pixel_x = 3; + pixel_y = -2 + }, +/obj/item/clothing/glasses/hud/security/sunglasses/gars{ + pixel_x = 3; + pixel_y = 2 + }, +/obj/item/clothing/glasses/hud/security/sunglasses{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/glasses/hud/security/sunglasses{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/machinery/airalarm/directional/west, +/obj/machinery/camera/motion/directional/west{ + c_tag = "Armory - Internal" + }, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted, +/turf/open/floor/iron/dark, +/area/space) +"Sv" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/machinery/light_switch/directional/east, +/turf/open/floor/iron, +/area/space) +"Sx" = ( +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"Sy" = ( +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/space) +"Sz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"SB" = ( +/obj/machinery/portable_atmospherics/canister/nitrous_oxide, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"SC" = ( +/obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"SE" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"SF" = ( +/obj/structure/table, +/obj/effect/spawner/random/entertainment/deck, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -6; + pixel_y = 8 + }, +/turf/open/floor/iron, +/area/space) +"SH" = ( +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white, +/area/space) +"SL" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"SN" = ( +/obj/structure/rack, +/obj/item/restraints/handcuffs, +/obj/item/assembly/flash/handheld, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"SP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/plating, +/area/space) +"SQ" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/circuit/green{ + luminosity = 2 + }, +/area/space) +"SR" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"SS" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/freezer, +/area/space) +"SU" = ( +/obj/machinery/hydroponics/soil, +/obj/machinery/camera/directional/west{ + c_tag = "Prison Forestry"; + network = list("ss13","prison") + }, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/west, +/turf/open/floor/grass, +/area/space) +"SW" = ( +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"SX" = ( +/obj/effect/turf_decal/trimline/red/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/junction{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"Tg" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron/white, +/area/space) +"Th" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"Ti" = ( +/obj/machinery/door_timer{ + id = "Cell 1"; + name = "Cell 1"; + pixel_y = -32 + }, +/turf/open/floor/iron, +/area/space) +"Tj" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/warning/pods{ + pixel_y = 30 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Tk" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"To" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Tp" = ( +/obj/machinery/shower{ + dir = 8; + pixel_y = -4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/turf/open/floor/iron/freezer, +/area/space) +"Tq" = ( +/obj/effect/turf_decal/trimline/red/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Tr" = ( +/obj/machinery/flasher/portable, +/obj/item/radio/intercom/directional/east, +/obj/machinery/camera/directional/east{ + c_tag = "Security - Secure Gear Storage" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue/half/contrasted{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"Ts" = ( +/obj/structure/window/reinforced{ + dir = 1 + }, +/turf/open/floor/iron/grimy, +/area/space) +"Tx" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/camera/directional/north{ + c_tag = "Fore Primary Hallway Cells" + }, +/turf/open/floor/iron, +/area/space) +"Ty" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"Tz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/hangover, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"TB" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/grimy, +/area/space) +"TD" = ( +/obj/effect/landmark/xeno_spawn, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/plating, +/area/space) +"TE" = ( +/obj/item/kirbyplants/dead, +/turf/open/floor/iron, +/area/space) +"TJ" = ( +/obj/structure/table/reinforced, +/obj/item/kitchen/fork/plastic, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"TN" = ( +/obj/machinery/disposal/delivery_chute{ + dir = 4 + }, +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 1 + }, +/obj/machinery/door/window{ + base_state = "right"; + dir = 4; + icon_state = "right"; + layer = 3 + }, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"TO" = ( +/obj/effect/spawner/random/structure/grille, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating/airless, +/area/space) +"TQ" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/plating, +/area/space) +"TU" = ( +/obj/structure/closet/secure_closet/brig, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"TZ" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/freezer, +/area/space) +"Ub" = ( +/obj/structure/table, +/obj/item/storage/fancy/egg_box, +/obj/item/reagent_containers/food/condiment/flour, +/obj/item/reagent_containers/food/condiment/rice, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Uc" = ( +/obj/machinery/computer/security/mining{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Ud" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Ug" = ( +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Uh" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Ui" = ( +/obj/machinery/camera/directional/south{ + c_tag = "Prison Common Room"; + network = list("ss13","prison") + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Uk" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Court Cell"; + req_access_txt = "2" + }, +/turf/open/floor/iron/dark, +/area/space) +"Ul" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"Uo" = ( +/obj/effect/spawner/random/maintenance, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Us" = ( +/obj/machinery/firealarm/directional/west, +/obj/structure/rack, +/obj/item/storage/briefcase{ + pixel_x = -3; + pixel_y = 2 + }, +/obj/item/storage/secure/briefcase{ + pixel_x = 2; + pixel_y = -2 + }, +/turf/open/floor/iron/grimy, +/area/space) +"Ut" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/iv_drip, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/blue/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/white, +/area/space) +"Uu" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/plating, +/area/space) +"Uv" = ( +/obj/machinery/light/small/directional/north, +/obj/structure/sign/warning/vacuum/external{ + pixel_y = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space) +"Uw" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/airlock/maintenance{ + name = "Brig Infirmary Maintenance"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"UG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"UJ" = ( +/obj/structure/table, +/obj/item/storage/secure/briefcase{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/engineering/flashlight, +/turf/open/floor/iron/dark, +/area/space) +"UM" = ( +/obj/effect/turf_decal/trimline/blue/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"UN" = ( +/obj/item/radio/intercom/directional/east, +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"UO" = ( +/obj/machinery/door/airlock/security/glass{ + name = "N2O Storage"; + req_access_txt = "3" + }, +/turf/open/floor/iron/dark, +/area/space) +"UT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"UU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space) +"UV" = ( +/obj/structure/table, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = -13; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner/skirt{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/clothing/under/rank/prisoner{ + pixel_x = -2; + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"UX" = ( +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "12;63;48;50" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"UY" = ( +/obj/machinery/newscaster/directional/west, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"UZ" = ( +/obj/item/hand_labeler_refill, +/obj/structure/rack, +/turf/open/floor/plating, +/area/space) +"Va" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"Vc" = ( +/obj/machinery/door/window/left/directional/south{ + name = "Permabrig Kitchen" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/space) +"Ve" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Vf" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/iron, +/area/space) +"Vh" = ( +/obj/machinery/light/small/directional/east, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm/directional/east, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"Vj" = ( +/obj/machinery/computer/secure_data{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"Vl" = ( +/obj/item/reagent_containers/glass/bucket, +/obj/item/mop, +/obj/item/reagent_containers/glass/bottle/ammonia, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Vn" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"Vp" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Cargo Bay Bridge Access" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Vq" = ( +/obj/machinery/button/flasher{ + id = "secentranceflasher"; + name = "Brig Entrance Flasher"; + pixel_x = -6; + pixel_y = -38; + req_access_txt = "1" + }, +/obj/machinery/button/flasher{ + id = "holdingflash"; + name = "Holding Cell Flasher"; + pixel_x = 6; + pixel_y = -38; + req_access_txt = "1" + }, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable/yellow{ + icon_state = "1" + }, +/turf/open/floor/iron, +/area/space) +"Vs" = ( +/obj/structure/closet/secure_closet/miner, +/obj/machinery/camera/directional/north{ + c_tag = "Mining Dock" + }, +/turf/open/floor/iron, +/area/space) +"Vt" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Vu" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/left/directional/west{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Outer Window" + }, +/obj/machinery/door/window/brigdoor{ + dir = 8; + name = "Brig Control Desk"; + req_access_txt = "3" + }, +/obj/item/folder/red, +/obj/item/folder/red, +/obj/item/poster/random_official, +/obj/item/book/manual/wiki/security_space_law{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron/showroomfloor, +/area/space) +"Vw" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"Vx" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"Vy" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"VB" = ( +/obj/machinery/light_switch/directional/north, +/obj/effect/turf_decal/tile/brown/half/contrasted{ + dir = 4 + }, +/obj/structure/closet/wardrobe/miner, +/turf/open/floor/iron, +/area/space) +"VC" = ( +/obj/machinery/door/window/right/directional/east{ + base_state = "left"; + dir = 8; + icon_state = "left"; + name = "Security Delivery"; + req_access_txt = "1" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/space) +"VF" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Storage Room"; + req_access_txt = "12" + }, +/obj/effect/mapping_helpers/airlock/abandoned, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/plating, +/area/space) +"VH" = ( +/obj/structure/closet/emcloset, +/obj/machinery/light/directional/east, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/brown/half/contrasted, +/turf/open/floor/iron, +/area/space) +"VI" = ( +/obj/structure/chair/stool/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"VK" = ( +/obj/machinery/vending/tool, +/obj/machinery/light/directional/west, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"VP" = ( +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"VQ" = ( +/obj/machinery/vending/security, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/red/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron/dark, +/area/space) +"VX" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"VZ" = ( +/obj/machinery/holopad, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/trimline/red/filled/line, +/turf/open/floor/iron, +/area/space) +"Wc" = ( +/obj/machinery/seed_extractor, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/directional/north, +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"Wg" = ( +/obj/effect/turf_decal/bot_white/right, +/obj/machinery/ore_silo, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"Wj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Wl" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/turf/open/floor/iron, +/area/space) +"Wp" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Wr" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron, +/area/space) +"Wt" = ( +/obj/structure/table/wood, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/folder/blue, +/obj/item/stamp/law, +/turf/open/floor/wood, +/area/space) +"Wv" = ( +/obj/structure/table, +/obj/item/folder/red, +/obj/item/taperecorder, +/obj/item/radio/intercom/directional/south{ + broadcasting = 1; + frequency = 1423; + listening = 0; + name = "Interrogation Intercom" + }, +/turf/open/floor/iron/dark, +/area/space) +"WB" = ( +/obj/effect/mapping_helpers/burnt_floor, +/turf/open/floor/plating, +/area/space) +"WG" = ( +/obj/structure/table, +/obj/machinery/power/data_terminal, +/obj/machinery/telephone/security, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/iron/dark, +/area/space) +"WI" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 1 + }, +/turf/open/floor/iron, +/area/space) +"WK" = ( +/obj/machinery/light/small/directional/west, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/turf/open/floor/iron/dark, +/area/space) +"WM" = ( +/obj/structure/chair/office{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"WO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/turf/open/floor/iron, +/area/space) +"WP" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/structure/reagent_dispensers/wall/peppertank/directional/west, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark, +/area/space) +"WR" = ( +/obj/machinery/door/window/brigdoor{ + name = "Justice Chamber"; + req_access_txt = "3" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window/brigdoor{ + dir = 1; + name = "Justice Chamber"; + req_access_txt = "3" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id = "executionfireblast" + }, +/obj/effect/turf_decal/tile/red/fourcorners, +/obj/machinery/atmospherics/pipe/smart/manifold4w/general/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/dark, +/area/space) +"WU" = ( +/obj/machinery/conveyor_switch/oneway{ + id = "QMLoad2"; + name = "Unloading Conveyor"; + pixel_x = -13; + pixel_y = -4 + }, +/turf/open/floor/iron, +/area/space) +"WV" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/space) +"WY" = ( +/obj/structure/table, +/obj/item/storage/box/prisoner{ + pixel_y = 8 + }, +/obj/item/storage/box/prisoner, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 4 + }, +/turf/open/floor/iron, +/area/space) +"WZ" = ( +/obj/machinery/button/door/directional/south{ + id = "armory"; + name = "Armory Shutters"; + req_access_txt = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron/dark, +/area/space) +"Xe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock/mining{ + name = "Drone Bay"; + req_access_txt = "31" + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/plating, +/area/space) +"Xf" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/chair{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red/half/contrasted{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"Xi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/clothing/gloves/color/fyellow, +/obj/item/stack/cable_coil, +/turf/open/floor/iron, +/area/space) +"Xj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Xn" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Xq" = ( +/obj/structure/table, +/obj/item/folder/blue{ + pixel_x = -2; + pixel_y = 3 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"Xu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/carpet, +/area/space) +"Xz" = ( +/obj/effect/landmark/start/head_of_security, +/obj/structure/chair/comfy/black, +/turf/open/floor/iron/dark, +/area/space) +"XC" = ( +/obj/structure/rack, +/obj/effect/landmark/blobstart, +/obj/effect/spawner/random/trash/janitor_supplies, +/turf/open/floor/plating, +/area/space) +"XD" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/preopen{ + id = "briglockdown"; + name = "brig shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "8" + }, +/turf/open/floor/plating, +/area/space) +"XG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/flasher/directional/east{ + id = "justiceflash" + }, +/turf/open/floor/iron/dark, +/area/space) +"XH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Interrogation"; + req_access_txt = "63" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"XI" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/iron, +/area/space) +"XK" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "detective_shutters"; + name = "detective's office shutters" + }, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating, +/area/space) +"XM" = ( +/obj/machinery/light/floor/has_bulb, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"XN" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"XQ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white, +/area/space) +"XR" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/plating, +/area/space) +"XS" = ( +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/turf/open/floor/plating/airless, +/area/space) +"XX" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "2" + }, +/turf/open/floor/plating, +/area/space) +"Ya" = ( +/obj/machinery/mineral/stacking_unit_console{ + machinedir = 8; + pixel_x = 32 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"Yg" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Yi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "5" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron/dark, +/area/space) +"Yl" = ( +/obj/machinery/airalarm/directional/south, +/obj/machinery/light/directional/south, +/obj/machinery/camera/directional/south{ + c_tag = "Brig - Hallway - Starboard" + }, +/turf/open/floor/iron, +/area/space) +"Yn" = ( +/obj/machinery/camera/directional/north{ + c_tag = "Brig - Hallway - Entrance" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"Yo" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/event_spawn, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"Yu" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "4" + }, +/obj/structure/cable/yellow{ + icon_state = "132" + }, +/turf/open/floor/plating, +/area/space) +"Yx" = ( +/obj/effect/spawner/random/trash/mess, +/obj/effect/spawner/random/engineering/tracking_beacon, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/space) +"Yy" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/brown/warning{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/red{ + dir = 1 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron, +/area/space) +"YA" = ( +/obj/machinery/vending/wardrobe/det_wardrobe, +/turf/open/floor/iron/grimy, +/area/space) +"YF" = ( +/obj/machinery/firealarm/directional/east, +/obj/machinery/fax_machine, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/space) +"YH" = ( +/obj/machinery/light/directional/east, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron, +/area/space) +"YK" = ( +/obj/structure/safe, +/obj/item/storage/secure/briefcase{ + contents = newlist(/obj/item/clothing/suit/armor/vest,/obj/item/gun/ballistic/automatic/pistol,/obj/item/suppressor,/obj/item/melee/baton/telescopic,/obj/item/clothing/mask/balaclava,/obj/item/bodybag,/obj/item/soap/nanotrasen) + }, +/obj/item/storage/backpack/duffelbag/syndie/hitman, +/obj/item/card/id/advanced/silver/reaper, +/obj/item/lazarus_injector, +/obj/item/gun/energy/disabler, +/obj/item/gun/ballistic/revolver/russian, +/obj/item/ammo_box/a357, +/obj/item/clothing/neck/stethoscope, +/obj/item/book{ + desc = "An undeniably handy book."; + icon_state = "bookknock"; + name = "\improper A Simpleton's Guide to Safe-cracking with Stethoscopes" + }, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/space) +"YM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"YO" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/space) +"YQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/flasher/directional/west{ + id = "Cell 2"; + pixel_y = -22 + }, +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/iron, +/area/space) +"YS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "1" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/turf/open/floor/iron, +/area/space) +"YU" = ( +/obj/machinery/door/poddoor/preopen{ + id = "Prison Gate"; + name = "Security Blast Door" + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/iron, +/area/space) +"YV" = ( +/obj/machinery/door/airlock/grunge{ + name = "Cell 2" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"YY" = ( +/obj/structure/chair/stool/directional/north, +/obj/machinery/camera/autoname/directional/west, +/turf/open/floor/plating, +/area/space) +"YZ" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 6 + }, +/turf/open/floor/iron/white, +/area/space) +"Zc" = ( +/obj/structure/sign/poster/contraband/missing_gloves, +/turf/closed/wall/prepainted/daedalus, +/area/space) +"Ze" = ( +/obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating, +/area/space) +"Zh" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/window/reinforced, +/turf/open/floor/iron, +/area/space) +"Zj" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + id = "Cell 1"; + name = "Cell 1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/red/half/contrasted, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"Zn" = ( +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/carpet, +/area/space) +"Zo" = ( +/obj/effect/turf_decal/bot, +/mob/living/simple_animal/bot/secbot/beepsky/armsky, +/turf/open/floor/iron/dark, +/area/space) +"Zp" = ( +/obj/effect/turf_decal/trimline/red/filled/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Zq" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_one_access_txt = "1;4;38;12" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"Zr" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security/glass{ + name = "Prison Wing"; + req_access_txt = "1" + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/mapping_helpers/airlock/cyclelink_helper_multi{ + cycle_id = "perma-entrance" + }, +/turf/open/floor/iron, +/area/space) +"Zs" = ( +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "10" + }, +/turf/open/floor/iron, +/area/space) +"Zv" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/iron, +/area/space) +"Zw" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/structure/weightmachine/weightlifter, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/iron, +/area/space) +"Zy" = ( +/obj/machinery/camera/directional/east{ + c_tag = "Interrogation room"; + network = list("interrogation") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"Zz" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/dark, +/area/space) +"ZC" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space, +/area/space) +"ZG" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/security{ + name = "Detective's Office"; + req_access_txt = "4" + }, +/obj/effect/landmark/navigate_destination, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/obj/structure/cable/yellow{ + icon_state = "9" + }, +/turf/open/floor/iron, +/area/space) +"ZN" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/carpet, +/area/space) +"ZP" = ( +/obj/effect/spawner/structure/window/reinforced/prepainted/daedalus, +/obj/structure/cable/yellow{ + icon_state = "3" + }, +/turf/open/floor/plating, +/area/space) +"ZT" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4; + sortType = 2 + }, +/obj/structure/cable/yellow{ + icon_state = "6" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) +"ZW" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/item/weldingtool, +/obj/item/clothing/head/welding, +/turf/open/floor/iron, +/area/space) +"ZZ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/sign/poster/contraband/random/directional/north, +/obj/structure/cable/yellow{ + icon_state = "12" + }, +/turf/open/floor/catwalk_floor/iron_dark, +/area/space) + +(1,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +IH +IH +IH +IH +Sn +lX +Sn +IH +IH +IH +IH +Sn +Sn +Sn +Sn +Sn +Kj +Sn +Sn +eI +eI +wM +iM +qA +eV +Sn +Sn +Sn +eV +GM +jr +kr +eV +eI +eI +eI +eI +zf +"} +(2,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +eI +eI +eI +Ln +Ln +Ln +IH +IH +Ij +lX +IH +Ln +Ln +Ln +eI +eI +eI +eV +IP +eV +wM +eV +eV +eV +eV +mq +Gy +eV +eV +eV +wM +eV +eV +Kc +iP +eV +wM +eV +Sn +Sn +wM +"} +(3,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +IH +IH +IH +IH +Sn +lX +Sn +IH +IH +IH +IH +Sn +Sn +Sn +eV +eE +Ig +gV +qR +bj +LA +eV +eV +Vp +eV +eV +eV +zA +Gg +Dr +uR +ul +zP +FA +eV +wM +wM +wM +"} +(4,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +cr +cr +cr +IH +Sn +lX +Sn +IH +cr +cr +cr +Sn +Sn +Sn +wM +wM +eV +eV +eV +QF +Bl +Em +xD +HG +ot +nv +eV +Fd +Gg +uL +QN +Xj +Gg +Uc +eV +Ni +CW +CW +"} +(5,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +lX +Sn +eI +Sn +Sn +Sn +Sn +Sn +Sn +wM +cw +CY +ds +TN +Ob +kh +iu +eF +Ba +GE +df +eV +Vs +Gg +uL +Gg +Xj +aZ +eV +eV +IU +Gg +WU +"} +(6,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +lX +lX +lX +Sn +Sn +Sn +Sn +Sn +Sn +wM +jj +Yx +IA +uT +QF +Db +qC +Gf +Tk +eU +SR +eV +VB +hk +ed +QO +Cl +Sj +Ud +QP +MR +QO +QO +"} +(7,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +lX +Sn +Sn +Sn +Sn +Sn +Sn +wM +FP +wk +gs +wY +Nc +RB +eV +aT +Ba +tX +El +mW +xm +xm +kp +wv +wJ +uB +UN +KV +Wr +uB +tS +"} +(8,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +Ij +Sn +Sn +Sn +Sn +Sn +Sn +wM +gG +Ji +hH +Ya +Vh +eO +eV +jc +du +nc +eV +eV +eV +sQ +ud +Gg +Hy +Eb +eV +eV +wM +wM +Qb +"} +(9,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +Sn +Ul +Ul +Ul +Dd +Dd +Dd +Sn +lX +Sn +Sn +Sn +Sn +wM +eV +eV +eV +eV +KW +eV +eV +eV +eV +eV +Ba +nc +eV +ct +eV +VH +AN +SF +Sa +uW +eV +sn +Vj +ZP +ZP +"} +(10,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +eI +Sn +Sn +nO +Fi +oq +JX +SU +KP +Dd +Sn +XS +Sn +Sn +wM +wM +wM +jA +YY +iN +eV +ju +Gf +hi +Sy +Gf +oi +Ba +cU +Gf +Fy +eV +eV +Oz +eV +eV +eV +eV +Qn +vP +LU +wM +"} +(11,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +mA +MJ +MJ +MJ +MJ +MJ +MJ +MJ +TO +Sn +eI +Sn +Sn +Vn +wt +AX +EW +qe +rp +Dd +Sn +we +IY +IY +br +tk +ea +IT +TD +uC +lp +XN +jO +BN +hB +BN +hB +Yo +JA +En +Ap +eV +UZ +Rz +IJ +Gf +lk +eV +MS +kW +bx +eV +"} +(12,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Sn +Sn +Sn +eI +Sn +Sn +eI +Sn +eI +Sn +Sn +wV +Wc +Gg +Gg +ud +Jz +Dd +Dd +Sn +Sn +Sn +wM +wM +wM +XR +tr +Rh +qY +ol +GE +IF +ls +Vy +CQ +eV +Uo +bt +eV +eV +uQ +Rz +GE +Gf +Gf +eV +nm +bl +jn +Ro +"} +(13,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Sn +Sn +Sn +eI +Sn +Sn +eI +Sn +eI +Sn +Sn +Dd +lR +Ge +jN +kR +Jz +ua +Dd +aR +aR +MJ +MJ +MJ +wM +eV +eV +Dd +Dd +eV +eV +Xe +eV +eV +eV +eV +ZT +ih +PU +hB +PU +RG +wy +Ze +JG +eV +eV +eV +eV +eV +"} +(14,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Sn +Sn +Sn +Dd +Ul +Dd +Dd +Dd +Dd +Dd +Dd +Dd +eV +eV +eV +vY +Jz +QV +Ul +Sn +BR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +Mr +Uu +Kv +LC +do +eV +sZ +aU +Fl +PU +MQ +PU +Qw +eV +"} +(15,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Sn +Ul +Ul +Dd +rH +eV +pc +Jg +oE +kG +xr +NH +Mk +TJ +eV +OB +gm +uJ +vw +Sn +aR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +ju +eV +eV +eV +eV +eV +eV +eV +eV +eV +eV +Ot +UG +eV +"} +(16,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Sn +FG +Cd +UY +bE +eV +pW +ee +Vc +ee +yV +fY +te +jd +eV +zN +ix +eV +Dd +Dd +Dd +Dd +Dd +Dd +eI +eI +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +ju +eV +Sn +Sn +bB +Sn +Sn +bB +Sn +Sn +eV +Gf +UG +eV +"} +(17,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +Dd +rL +Gg +ud +eV +Nx +Ub +RQ +zB +FO +Fv +jt +NW +lq +DS +XQ +eV +OJ +WK +eV +OJ +WK +Dd +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +Gp +eV +bB +Dd +Dd +Dd +Dd +Dd +Dd +bB +eV +bY +Wj +dm +"} +(18,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Ul +Na +SL +Gg +Ui +eV +eV +Ul +eV +eV +lb +Fv +jt +MK +eV +LJ +sY +eV +Ih +LK +eV +Ih +LK +Dd +Sn +Sn +Sn +eI +Sn +Sn +eV +eV +eV +eV +eV +eV +Ex +eV +Sn +Dd +lQ +wR +ID +Wg +Dd +Sn +eV +eV +UX +eV +"} +(19,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +FG +QO +VI +nw +bE +Gg +oj +LE +eY +eV +eV +ON +eV +eV +eV +LJ +sY +eV +Ul +Ak +eV +Ul +yN +Dd +Dd +Sn +Sn +eI +Sn +Sn +eV +iM +se +Gf +uP +eV +vm +Jh +Sn +Dd +Ow +JD +JD +aB +lx +lq +XX +oQ +JC +eV +"} +(20,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +Dg +bv +yJ +Ds +Gg +kd +ER +iL +vl +NU +fP +NU +NU +sy +Th +xV +Hm +LE +fP +Jt +LE +fP +OO +Dd +Dd +Dd +Dd +Sn +Sn +eV +do +DK +vX +VP +eV +aH +tw +Sn +Dd +Az +mV +RZ +jI +OF +SC +DH +Cl +Gr +eV +"} +(21,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +lS +AR +lt +dD +cc +xO +Pe +It +zG +It +It +It +It +It +Dm +It +Mi +eP +It +EC +Gw +oV +iw +mU +Ih +OJ +Dd +Sn +Sn +wM +uf +NZ +HB +qV +VF +AO +tw +Sn +Dd +SQ +Lt +Lt +GW +lx +lq +MI +zQ +Gv +eV +"} +(22,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Ul +Gg +Iu +ag +ud +QR +eV +eV +NT +eV +eV +RV +eV +eV +eV +eV +eV +eV +aq +Gg +QR +hI +jf +sY +YV +Ip +ae +Dd +Sn +Sn +eV +ol +LF +eV +eV +eV +Nn +TQ +Sn +Dd +pX +EV +kj +YK +Dd +Sn +CZ +QO +dx +jy +"} +(23,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +FG +sa +Ao +ng +HJ +sP +eV +lm +qS +lm +eV +wS +rC +Kp +eV +pH +JZ +HP +Cp +Gg +fr +yl +jf +hs +eV +eV +eV +Dd +eI +eI +eV +eV +eV +eV +Ib +ns +hb +eV +bB +Dd +Dd +Dd +Dd +Dd +Dd +eI +wV +ZW +dr +Au +"} +(24,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +mA +DT +Dd +Dd +jk +Dp +Kh +xx +eV +aV +en +LL +eV +yL +cH +Nq +eV +cg +Vl +eV +pR +oX +JM +wg +jf +sY +bC +Ip +ae +Dd +Sn +Sn +Sn +eV +gT +HB +Ex +eV +eV +eV +Sn +Sn +Ew +Sn +Sn +Sn +Sn +Sn +eV +Zc +eV +rD +"} +(25,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +Dd +MU +bH +bH +eV +Tp +cp +gK +eV +Pk +Aq +Kp +eV +bs +yC +eV +wL +Ft +hW +nX +Ey +iw +mU +Ih +lr +Dd +Sn +Sn +GH +eV +qw +GE +Dc +Dd +Dd +Dd +Ul +Sn +Sn +Sn +Sn +Sn +Sn +Sn +lq +VK +dX +Xi +"} +(26,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +Dd +ac +hp +uv +nX +jf +yT +eV +eV +eV +Dd +SP +mU +Dd +Dd +eV +eV +Ex +Dd +Na +Gg +zN +Sn +Sn +vG +eV +eI +eI +eI +eV +dP +ap +jo +"} +(27,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Qj +eW +st +Va +OY +mI +WP +wo +CR +SB +Dd +Im +hp +uv +tZ +Ey +Kn +wW +hn +Lj +so +Tg +iv +eY +Dd +tC +lq +Wp +Dd +vh +Gg +ip +GD +il +qh +eV +Sn +Sn +Sn +eV +CK +yj +cv +"} +(28,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Qj +cP +RE +PN +AU +Cz +WM +AV +uj +No +Dd +ac +sw +uv +nX +RX +gn +QJ +gn +gn +ao +Gt +FR +YZ +Dd +tC +UO +Vt +Dd +Gg +Gg +Zw +Gg +wV +Sn +eI +Sn +Sn +eV +eV +eV +eV +eV +"} +(29,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Qj +mw +XG +xS +WR +Qm +fE +bT +hj +pL +Dd +zS +Qy +zF +nX +YM +Dd +Dd +Dd +Dd +Sb +zN +cQ +Dd +Dd +Dd +Dd +Uw +Dd +Ll +Gg +Xn +WV +Dd +Dd +Dd +Dd +Sn +eV +ew +um +qT +fS +"} +(30,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +FW +bb +bb +bb +Dd +Dd +Dd +Dd +Dd +Dd +sq +hC +lH +Dd +Dd +Dd +Dd +Dd +sE +xp +Pu +Dd +FL +kv +Dd +tW +lK +jT +Dd +mM +cG +dH +xq +Dd +Gg +zQ +MP +Rf +kC +Mw +vU +Dd +eV +eV +KT +Dd +wV +Dd +"} +(31,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +eI +eI +eI +eI +eI +Dd +bg +QK +Dd +kn +LW +eu +Dd +iT +og +Hq +Ul +zc +Gg +YM +Dd +uN +DQ +eV +RF +zN +Vw +eV +oI +mr +jR +EB +Dd +vh +Gg +YM +TE +Dd +Rr +Es +Dd +WI +Vf +LO +Dd +Sn +Sn +"} +(32,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +fu +SH +Dd +Dd +Dd +tQ +eV +Jn +yS +ny +Gd +Xj +Gg +YM +eV +RO +kv +eV +QH +UT +Ay +eV +OZ +yS +Mb +Ut +eV +lq +XX +lZ +Dd +Dd +Dd +Dd +Dd +WI +vI +ka +mU +Sn +Sn +"} +(33,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +GA +fi +NC +Ct +is +Ai +eV +ar +Fx +Av +zN +Xj +Gg +gE +eV +eV +ir +eV +lq +mO +Qx +eV +Fq +DY +Rq +qF +eV +Gg +yq +KM +Do +Ul +ei +Se +mG +RW +Gg +hy +Dd +Sn +Dd +"} +(34,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +lD +eI +Eu +Dd +Dd +Dd +vB +PQ +va +Xj +eV +lq +XX +XX +vi +UV +Fr +YM +YS +YU +KG +aa +Wl +al +et +NL +UM +jZ +UM +tb +hw +Gg +QR +PL +Cl +Zj +xz +PY +wx +WI +oL +MZ +Dd +bB +Dd +"} +(35,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +sb +Dd +Al +Xj +ax +SW +Ed +Oh +WY +jF +CC +HE +XX +hD +Ug +XX +QO +Zs +Cl +QO +QO +Vx +QO +Ms +Dk +rF +wz +RK +Ti +eV +Ch +mU +Dd +oC +Gg +LO +Dd +Sn +Dd +"} +(36,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +ry +Sn +Sn +Sn +Ha +NI +UU +oa +rM +Xj +Gg +Gg +Gg +Gg +Gg +Xj +YM +Xj +Zr +ub +kE +qg +Pb +YH +ve +vr +kI +Xj +Xj +Xj +Xj +Xj +Xj +tn +Gg +Yu +Qi +YQ +mG +RW +zQ +xX +Dd +Sn +Dd +"} +(37,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +nQ +Dd +uY +Cl +tt +Cl +CG +Cl +Cl +Cl +ky +eG +Dd +lx +Dd +Dd +eV +eV +eV +gS +eV +gk +QS +fv +PO +bD +Dd +DL +Cl +wZ +gh +aF +wx +WI +Gg +HC +Dd +Sn +Dd +"} +(38,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Lu +eI +Eu +Dd +Dd +Dd +Dd +Dd +QU +qq +eV +dl +eV +gY +Gg +nU +SN +mU +Dd +Sn +Sn +Dd +Sc +KE +RR +hT +Dd +Dd +Ul +Dd +Di +Fk +Dd +Tj +Hg +eV +Ch +mU +Dd +oC +Zv +rI +Dd +bB +Dd +"} +(39,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +De +Sn +Dd +fc +mU +Dd +Uv +eV +TU +Hj +TU +Mt +mU +Sn +Sn +Sn +Dd +qz +Fc +Kw +jz +lq +BT +FK +ED +pF +Xj +Xj +tn +Gg +Yu +Qi +Cm +mG +RW +ud +CS +Dd +Sn +Dd +"} +(40,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +vT +Dd +Dd +Dd +lq +IM +eI +eI +eI +eI +Dd +dn +dN +sV +zY +Dd +eb +mQ +ED +pF +mJ +pm +XI +dJ +nZ +QL +fV +wx +WI +ud +Cy +Dd +Sn +Sn +"} +(41,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +IH +IH +IH +Sn +Sn +Sn +Sn +eI +Sn +Sn +Sn +Dd +Dd +Dd +Dd +Dd +Dd +jH +WZ +Dd +Gl +Sr +Dd +SP +mU +Dd +SP +mU +Dd +Tx +CC +tq +mU +Sn +Sn +"} +(42,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +Sn +Sn +Dd +LZ +Of +EJ +Rg +St +Zo +Gx +Dd +Yn +Sr +Dd +jE +sL +gq +Yg +pv +Dd +WI +ud +Yy +Dd +Ul +Dd +"} +(43,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +ph +Sn +Sn +kz +Dd +rs +IX +Ca +IX +Ca +IX +Dx +JL +IZ +Sr +Ul +zt +Gg +QR +UT +Eh +oF +WI +XM +Uh +VX +qH +VX +"} +(44,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +Sn +Sn +Dd +Dd +hl +Go +HA +Go +HA +vJ +DD +zO +SX +yD +dL +xZ +Fj +po +Pr +ue +WI +CC +Sj +QO +Jm +QO +"} +(45,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +Sn +Sn +Sn +Dd +lF +Oa +QB +mh +BK +jm +wV +Tq +Sr +wV +SE +ah +JK +PT +OX +XD +WI +ud +cx +cx +AE +cx +"} +(46,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +up +Dd +lq +MI +Dd +Dd +Dd +SP +mU +Dd +Dd +Dd +Dd +Dd +Nl +Sr +Dd +Vu +mU +Dd +fc +mU +Dd +Ho +Cp +cx +AZ +eV +mc +"} +(47,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +Dd +uU +Af +zL +Dd +Pt +it +uM +ra +HZ +BB +IR +Ul +IZ +nt +NK +gv +Wl +gj +Jj +Hi +dM +zt +oo +cx +eV +In +Ve +"} +(48,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +MJ +Sn +lq +qu +es +iJ +tg +wr +tg +Hv +tg +Qu +tg +Yi +Gn +nW +pF +th +Dk +JV +Gg +lG +BG +VZ +oF +zt +Gg +cx +eV +Bb +Gg +"} +(49,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +pN +Jv +hz +Tr +Dd +gd +ML +sd +mQ +VQ +yy +AS +wV +oZ +kA +Xj +AL +Cl +ld +Mq +nK +ki +KK +YH +kf +eV +nD +fk +"} +(50,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +aR +eI +eV +eV +eV +eV +eV +Dd +lq +IM +Dd +Dd +Dd +Dd +lq +hY +eV +wV +eV +eV +Ul +eV +EY +jC +Vq +Dd +SP +mU +Dd +Dd +Dd +Dd +Dd +mk +bu +"} +(51,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +lq +WO +Oi +jb +Oi +fL +oW +Oo +Ss +Ul +BM +Wl +Wl +al +eJ +Wl +EO +eV +Nw +eV +GT +MT +Gg +Ul +bc +hp +Ls +Dd +kb +cI +Dd +mx +an +"} +(52,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Dd +ab +xi +QO +QO +Qp +kU +kU +Kl +dI +zO +mL +Ab +de +BI +Co +Sz +Om +mQ +Ul +IZ +Ht +Gg +tw +Iw +yv +eo +Dd +ya +cI +Dd +aO +uH +"} +(53,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +lq +fs +vO +HH +vO +Zh +oK +pa +td +eV +eV +jg +fx +pP +MY +Xq +Xf +op +hJ +Hw +BZ +HS +Cl +mT +QX +Iz +Nd +CI +ya +ya +Dd +nD +Sx +"} +(54,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +aR +eI +Dd +eV +eV +eV +eV +eV +eV +lU +eV +Dd +lj +yQ +ya +ya +ya +NF +To +Nb +ya +rW +GV +ud +Gg +tw +YO +nH +ze +Dd +IE +ya +qI +vu +qo +"} +(55,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +vt +MG +ya +Dd +lj +yQ +sA +AA +ya +UJ +To +Nb +cB +wV +Ly +ud +iV +tw +YO +nf +Dd +eV +eV +eV +eV +Fg +Uk +"} +(56,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +eV +vo +CA +dK +Ul +lj +yQ +Xz +pk +uE +ya +Gk +bS +eV +eV +Hb +ud +Yl +gN +Dd +Dd +Dd +pK +Ts +ta +eV +eV +eV +"} +(57,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +Ul +DI +wF +KF +Nu +lj +yQ +MO +fC +ya +WG +rP +lY +jL +Ul +Ok +uS +om +XK +Us +RP +zd +Gu +Ga +yd +eV +bX +Nz +"} +(58,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +FG +KF +xN +DI +LB +eV +mn +ya +ya +ya +Qd +To +QE +ji +vw +za +Fs +mB +ZG +Xu +Xu +DP +BO +Ts +CU +eV +By +Wt +"} +(59,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +eV +vo +DI +DI +wV +Ny +VX +Px +Km +nk +vp +iX +yO +eV +eV +Gg +Rf +qj +xL +wn +Rt +BQ +Ka +eV +eV +eV +qO +NG +"} +(60,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eV +cE +DI +DI +Dd +eK +zQ +nx +yG +nI +Kd +Bi +Dz +Bn +mU +cz +vr +hP +Dd +iZ +aM +yu +nJ +nl +Pm +eV +HY +dh +"} +(61,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +Dd +GX +Dd +Dd +BD +GP +OS +vr +Sv +pO +mK +Zp +GO +Dd +Dd +XH +Dd +Dd +qU +cq +Ol +YA +eV +zx +aW +OT +YF +"} +(62,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +Qe +zg +ci +Dd +ND +Dd +fT +JJ +Dd +VC +Dd +rN +Dd +Dd +gU +sz +ya +eV +eV +eV +eV +eV +eV +vH +eV +eV +eV +"} +(63,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +GX +Ku +dt +bO +NA +eh +Dd +BJ +KZ +Dd +EK +Dd +TB +lw +KO +ya +AM +ge +eV +dY +LS +jO +jO +jO +eg +jO +jO +Zq +"} +(64,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +nj +mu +bF +xb +DA +GK +mE +JW +nB +OK +xC +eV +lE +mo +KO +ya +Zz +Wv +eV +pz +pq +eV +eV +eV +eV +eV +eV +eV +"} +(65,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +Sn +aY +MC +ZN +AC +jS +zE +Dd +sT +Ie +Dd +ju +eV +lJ +mo +KO +ya +zi +Ng +eV +qM +sN +eV +rg +eV +Mj +eV +qL +eV +"} +(66,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +ZC +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +MJ +eI +Dd +rA +yu +Zn +cm +CN +Dd +Dd +Dd +Dd +ju +eV +Bs +js +eV +Gc +Zy +KS +eV +dz +Ba +eV +av +eV +fJ +eV +JN +eV +"} +(67,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +cl +rj +oB +Pj +Dd +Dd +ol +XC +eV +ZZ +eV +eV +eV +eV +eV +eV +eV +eV +qf +Fz +pf +Bz +go +pI +cn +EI +hA +"} +(68,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Dd +aY +Dd +Dd +Dd +Dd +ly +WB +GE +eV +Id +jO +jO +nV +jO +jO +jO +jO +jO +bi +Li +eV +Ql +pI +AP +Cj +rQ +hA +"} +(69,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +eV +cL +vX +GE +GE +DK +GE +eV +cJ +eV +eV +VF +eV +eV +eV +eV +eV +eV +eV +eV +BS +jP +eV +eV +eV +eV +"} +(70,1,1) = {" +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +OR +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +Sn +eI +Sn +eV +Eq +VP +Rx +Hu +Aj +qV +VF +Tz +eV +Ce +Ty +GE +VP +OC +eV +hZ +Kq +RL +eV +GI +SS +TZ +xn +yB +eV +"} diff --git a/tgui/.eslintignore b/tgui/.eslintignore index a59187b933ae..ae28a3fcf483 100644 --- a/tgui/.eslintignore +++ b/tgui/.eslintignore @@ -3,4 +3,4 @@ /**/*.bundle.* /**/*.chunk.* /**/*.hot-update.* -/packages/inferno/** +/public diff --git a/tgui/.eslintrc-sonar.yml b/tgui/.eslintrc-sonar.yml index 3cdd49f889e2..ebc57f72c008 100644 --- a/tgui/.eslintrc-sonar.yml +++ b/tgui/.eslintrc-sonar.yml @@ -1,26 +1 @@ -rules: - # radar/cognitive-complexity: error - radar/max-switch-cases: error - radar/no-all-duplicated-branches: error - radar/no-collapsible-if: error - radar/no-collection-size-mischeck: error - radar/no-duplicate-string: error - radar/no-duplicated-branches: error - radar/no-element-overwrite: error - radar/no-extra-arguments: error - radar/no-identical-conditions: error - radar/no-identical-expressions: error - radar/no-identical-functions: error - radar/no-inverted-boolean-check: error - radar/no-one-iteration-loop: error - radar/no-redundant-boolean: error - radar/no-redundant-jump: error - radar/no-same-line-conditional: error - radar/no-small-switch: error - radar/no-unused-collection: error - radar/no-use-of-empty-return-value: error - radar/no-useless-catch: error - radar/prefer-immediate-return: error - radar/prefer-object-literal: error - radar/prefer-single-boolean-return: error - radar/prefer-while: error +extends: 'plugin:sonarjs/recommended' diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index 24f6975e688d..573a3b417e04 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -10,14 +10,15 @@ env: browser: true node: true plugins: - - radar + - sonarjs - react - unused-imports + - eslint-plugin-simple-import-sort + - eslint-plugin-typescript-sort-keys settings: react: - version: '16.10' + version: '18.3.1' rules: - ## Possible Errors ## ---------------------------------------- ## Enforce “for” loop update clause moving the counter in the right @@ -290,219 +291,6 @@ rules: ## Disallow the use of variables before they are defined # no-use-before-define: error - ## Code style - ## ---------------------------------------- - ## Enforce linebreaks after opening and before closing array brackets - array-bracket-newline: [error, consistent] - ## Enforce consistent spacing inside array brackets - array-bracket-spacing: [error, never] - ## Enforce line breaks after each array element - # array-element-newline: error - ## Disallow or enforce spaces inside of blocks after opening block and - ## before closing block - block-spacing: [error, always] - ## Enforce consistent brace style for blocks - # brace-style: [error, stroustrup, { allowSingleLine: false }] - ## Enforce camelcase naming convention - # camelcase: error - ## Enforce or disallow capitalization of the first letter of a comment - # capitalized-comments: error - ## Require or disallow trailing commas - comma-dangle: [error, { - arrays: always-multiline, - objects: always-multiline, - imports: always-multiline, - exports: always-multiline, - functions: only-multiline, ## Optional on functions - }] - ## Enforce consistent spacing before and after commas - comma-spacing: [error, { before: false, after: true }] - ## Enforce consistent comma style - comma-style: [error, last] - ## Enforce consistent spacing inside computed property brackets - computed-property-spacing: [error, never] - ## Enforce consistent naming when capturing the current execution context - # consistent-this: error - ## Require or disallow newline at the end of files - # eol-last: error - ## Require or disallow spacing between function identifiers and their - ## invocations - func-call-spacing: [error, never] - ## Require function names to match the name of the variable or property - ## to which they are assigned - # func-name-matching: error - ## Require or disallow named function expressions - # func-names: error - ## Enforce the consistent use of either function declarations or expressions - func-style: [error, expression] - ## Enforce line breaks between arguments of a function call - # function-call-argument-newline: error - ## Enforce consistent line breaks inside function parentheses - ## NOTE: This rule does not honor a newline on opening paren. - # function-paren-newline: [error, never] - ## Disallow specified identifiers - # id-blacklist: error - ## Enforce minimum and maximum identifier lengths - # id-length: error - ## Require identifiers to match a specified regular expression - # id-match: error - ## Enforce the location of arrow function bodies - # implicit-arrow-linebreak: error - ## Enforce consistent indentation - indent: [error, 2, { SwitchCase: 1 }] - ## Enforce the consistent use of either double or single quotes in JSX - ## attributes - jsx-quotes: [error, prefer-double] - ## Enforce consistent spacing between keys and values in object literal - ## properties - key-spacing: [error, { beforeColon: false, afterColon: true }] - ## Enforce consistent spacing before and after keywords - keyword-spacing: [error, { before: true, after: true }] - ## Enforce position of line comments - # line-comment-position: error - ## Enforce consistent linebreak style - # linebreak-style: error - ## Require empty lines around comments - # lines-around-comment: error - ## Require or disallow an empty line between class members - # lines-between-class-members: error - ## Enforce a maximum depth that blocks can be nested - # max-depth: error - ## Enforce a maximum line length - max-len: [error, { - code: 80, - ## Ignore imports - ignorePattern: '^(import\s.+\sfrom\s|.*require\()', - ignoreUrls: true, - ignoreRegExpLiterals: true, - ignoreStrings: true, - }] - ## Enforce a maximum number of lines per file - # max-lines: error - ## Enforce a maximum number of line of code in a function - # max-lines-per-function: error - ## Enforce a maximum depth that callbacks can be nested - # max-nested-callbacks: error - ## Enforce a maximum number of parameters in function definitions - # max-params: error - ## Enforce a maximum number of statements allowed in function blocks - # max-statements: error - ## Enforce a maximum number of statements allowed per line - # max-statements-per-line: error - ## Enforce a particular style for multiline comments - # multiline-comment-style: error - ## Enforce newlines between operands of ternary expressions - # multiline-ternary: [error, always-multiline] - ## Require constructor names to begin with a capital letter - # new-cap: error - ## Enforce or disallow parentheses when invoking a constructor with no - ## arguments - # new-parens: error - ## Require a newline after each call in a method chain - # newline-per-chained-call: error - ## Disallow Array constructors - # no-array-constructor: error - ## Disallow bitwise operators - # no-bitwise: error - ## Disallow continue statements - # no-continue: error - ## Disallow inline comments after code - # no-inline-comments: error - ## Disallow if statements as the only statement in else blocks - # no-lonely-if: error - ## Disallow mixed binary operators - # no-mixed-operators: error - ## Disallow mixed spaces and tabs for indentation - no-mixed-spaces-and-tabs: error - ## Disallow use of chained assignment expressions - # no-multi-assign: error - ## Disallow multiple empty lines - # no-multiple-empty-lines: error - ## Disallow negated conditions - # no-negated-condition: error - ## Disallow nested ternary expressions - # no-nested-ternary: error - ## Disallow Object constructors - # no-new-object: error - ## Disallow the unary operators ++ and -- - # no-plusplus: error - ## Disallow specified syntax - # no-restricted-syntax: error - ## Disallow all tabs - # no-tabs: error - ## Disallow ternary operators - # no-ternary: error - ## Disallow trailing whitespace at the end of lines - # no-trailing-spaces: error - ## Disallow dangling underscores in identifiers - # no-underscore-dangle: error - ## Disallow ternary operators when simpler alternatives exist - # no-unneeded-ternary: error - ## Disallow whitespace before properties - no-whitespace-before-property: error - ## Enforce the location of single-line statements - # nonblock-statement-body-position: error - ## Enforce consistent line breaks inside braces - # object-curly-newline: [error, { multiline: true }] - ## Enforce consistent spacing inside braces - object-curly-spacing: [error, always] - ## Enforce placing object properties on separate lines - # object-property-newline: error - ## Enforce variables to be declared either together or separately in - ## functions - # one-var: error - ## Require or disallow newlines around variable declarations - # one-var-declaration-per-line: error - ## Require or disallow assignment operator shorthand where possible - # operator-assignment: error - ## Enforce consistent linebreak style for operators - operator-linebreak: [error, before] - ## Require or disallow padding within blocks - # padded-blocks: error - ## Require or disallow padding lines between statements - # padding-line-between-statements: error - ## Disallow using Object.assign with an object literal as the first - ## argument and prefer the use of object spread instead. - # prefer-object-spread: error - ## Require quotes around object literal property names - # quote-props: error - ## Enforce the consistent use of either backticks, double, or single quotes - # quotes: [error, single] - ## Require or disallow semicolons instead of ASI - semi: error - ## Enforce consistent spacing before and after semicolons - semi-spacing: [error, { before: false, after: true }] - ## Enforce location of semicolons - semi-style: [error, last] - ## Require object keys to be sorted - # sort-keys: error - ## Require variables within the same declaration block to be sorted - # sort-vars: error - ## Enforce consistent spacing before blocks - space-before-blocks: [error, always] - ## Enforce consistent spacing before function definition opening parenthesis - space-before-function-paren: [error, { - anonymous: always, - named: never, - asyncArrow: always, - }] - ## Enforce consistent spacing inside parentheses - space-in-parens: [error, never] - ## Require spacing around infix operators - # space-infix-ops: error - ## Enforce consistent spacing before or after unary operators - # space-unary-ops: error - ## Enforce consistent spacing after the // or /* in a comment - spaced-comment: [error, always] - ## Enforce spacing around colons of switch statements - switch-colon-spacing: [error, { before: false, after: true }] - ## Require or disallow spacing between template tags and their literals - template-tag-spacing: [error, never] - ## Require or disallow Unicode byte order mark (BOM) - # unicode-bom: [error, never] - ## Require parenthesis around regex literals - # wrap-regex: error - ## ES6 ## ---------------------------------------- ## Require braces around arrow function bodies @@ -647,7 +435,7 @@ rules: ## Enforce ES5 or ES6 class for React Components react/prefer-es6-class: error ## Enforce that props are read-only - react/prefer-read-only-props: error + react/prefer-read-only-props: off ## Enforce stateless React Components to be written as a pure function react/prefer-stateless-function: error ## Prevent missing props validation in a React component definition @@ -694,7 +482,7 @@ rules: react/jsx-closing-tag-location: error ## Enforce or disallow newlines inside of curly braces in JSX attributes and ## expressions (fixable) - react/jsx-curly-newline: error + #react/jsx-curly-newline: error ## Enforce or disallow spaces inside of curly braces in JSX attributes and ## expressions (fixable) react/jsx-curly-spacing: error @@ -707,11 +495,9 @@ rules: ## Enforce event handler naming conventions in JSX react/jsx-handler-names: error ## Validate JSX indentation (fixable) - react/jsx-indent: [error, 2, { - checkAttributes: true, - }] + #react/jsx-indent: [error, 2, { checkAttributes: true }] ## Validate props indentation in JSX (fixable) - react/jsx-indent-props: [error, 2] + #react/jsx-indent-props: [error, 2] ## Validate JSX has key prop when in array or iterator react/jsx-key: error ## Validate JSX maximum depth @@ -760,3 +546,11 @@ rules: ## Prevents the use of unused imports. ## This could be done by enabling no-unused-vars, but we're doing this for now unused-imports/no-unused-imports: error + + # Sorting + simple-import-sort/imports: error + simple-import-sort/exports: error + typescript-sort-keys/interface: error + typescript-sort-keys/string-enum: error + +extends: prettier diff --git a/tgui/.prettierignore b/tgui/.prettierignore new file mode 100644 index 000000000000..6b0296ceb475 --- /dev/null +++ b/tgui/.prettierignore @@ -0,0 +1,13 @@ +## NPM +/**/node_modules + +## Yarn +/.yarn +/yarn.lock +/.pnp.* + +.swcrc +/docs +/public +/packages/tgui-polyfill +/packages/tgfont/static diff --git a/tgui/.prettierrc.yml b/tgui/.prettierrc.yml index fe51f01cc4db..01769692264f 100644 --- a/tgui/.prettierrc.yml +++ b/tgui/.prettierrc.yml @@ -1,12 +1 @@ -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/.swcrc b/tgui/.swcrc new file mode 100644 index 000000000000..c0402a41f0bf --- /dev/null +++ b/tgui/.swcrc @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "loose": true, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + } +} diff --git a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs b/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs deleted file mode 100644 index 527659ff97f5..000000000000 --- a/tgui/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +++ /dev/null @@ -1,363 +0,0 @@ -/* eslint-disable */ -//prettier-ignore -module.exports = { -name: "@yarnpkg/plugin-interactive-tools", -factory: function (require) { -var plugin=(()=>{var PR=Object.create,J1=Object.defineProperty,MR=Object.defineProperties,FR=Object.getOwnPropertyDescriptor,LR=Object.getOwnPropertyDescriptors,RR=Object.getOwnPropertyNames,hh=Object.getOwnPropertySymbols,NR=Object.getPrototypeOf,Z4=Object.prototype.hasOwnProperty,aD=Object.prototype.propertyIsEnumerable;var dD=(i,u,f)=>u in i?J1(i,u,{enumerable:!0,configurable:!0,writable:!0,value:f}):i[u]=f,dt=(i,u)=>{for(var f in u||(u={}))Z4.call(u,f)&&dD(i,f,u[f]);if(hh)for(var f of hh(u))aD.call(u,f)&&dD(i,f,u[f]);return i},zn=(i,u)=>MR(i,LR(u)),BR=i=>J1(i,"__esModule",{value:!0});var Si=(i,u)=>{var f={};for(var c in i)Z4.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&hh)for(var c of hh(i))u.indexOf(c)<0&&aD.call(i,c)&&(f[c]=i[c]);return f};var Me=(i,u)=>()=>(u||i((u={exports:{}}).exports,u),u.exports),jR=(i,u)=>{for(var f in u)J1(i,f,{get:u[f],enumerable:!0})},UR=(i,u,f)=>{if(u&&typeof u=="object"||typeof u=="function")for(let c of RR(u))!Z4.call(i,c)&&c!=="default"&&J1(i,c,{get:()=>u[c],enumerable:!(f=FR(u,c))||f.enumerable});return i},Er=i=>UR(BR(J1(i!=null?PR(NR(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var ey=Me((YH,pD)=>{"use strict";var hD=Object.getOwnPropertySymbols,qR=Object.prototype.hasOwnProperty,zR=Object.prototype.propertyIsEnumerable;function WR(i){if(i==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(i)}function HR(){try{if(!Object.assign)return!1;var i=new String("abc");if(i[5]="de",Object.getOwnPropertyNames(i)[0]==="5")return!1;for(var u={},f=0;f<10;f++)u["_"+String.fromCharCode(f)]=f;var c=Object.getOwnPropertyNames(u).map(function(t){return u[t]});if(c.join("")!=="0123456789")return!1;var g={};return"abcdefghijklmnopqrst".split("").forEach(function(t){g[t]=t}),Object.keys(Object.assign({},g)).join("")==="abcdefghijklmnopqrst"}catch(t){return!1}}pD.exports=HR()?Object.assign:function(i,u){for(var f,c=WR(i),g,t=1;t{"use strict";var ty=ey(),as=typeof Symbol=="function"&&Symbol.for,Q1=as?Symbol.for("react.element"):60103,bR=as?Symbol.for("react.portal"):60106,GR=as?Symbol.for("react.fragment"):60107,VR=as?Symbol.for("react.strict_mode"):60108,YR=as?Symbol.for("react.profiler"):60114,$R=as?Symbol.for("react.provider"):60109,KR=as?Symbol.for("react.context"):60110,XR=as?Symbol.for("react.forward_ref"):60112,JR=as?Symbol.for("react.suspense"):60113,QR=as?Symbol.for("react.memo"):60115,ZR=as?Symbol.for("react.lazy"):60116,mD=typeof Symbol=="function"&&Symbol.iterator;function Z1(i){for(var u="https://reactjs.org/docs/error-decoder.html?invariant="+i,f=1;fmh.length&&mh.push(i)}function uy(i,u,f,c){var g=typeof i;(g==="undefined"||g==="boolean")&&(i=null);var t=!1;if(i===null)t=!0;else switch(g){case"string":case"number":t=!0;break;case"object":switch(i.$$typeof){case Q1:case bR:t=!0}}if(t)return f(c,i,u===""?"."+sy(i,0):u),1;if(t=0,u=u===""?".":u+":",Array.isArray(i))for(var C=0;C{"use strict";kD.exports=xD()});var AD=Me((ga,e2)=>{(function(){var i,u="4.17.21",f=200,c="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",g="Expected a function",t="Invalid `variable` option passed into `_.template`",C="__lodash_hash_undefined__",A=500,x="__lodash_placeholder__",D=1,L=2,N=4,j=1,$=2,h=1,re=2,ce=4,Q=8,oe=16,Se=32,me=64,De=128,J=256,Te=512,Oe=30,Le="...",ot=800,ct=16,Ue=1,be=2,At=3,Ot=1/0,Nt=9007199254740991,Je=17976931348623157e292,V=0/0,ne=4294967295,ge=ne-1,Z=ne>>>1,Ae=[["ary",De],["bind",h],["bindKey",re],["curry",Q],["curryRight",oe],["flip",Te],["partial",Se],["partialRight",me],["rearg",J]],at="[object Arguments]",it="[object Array]",Ft="[object AsyncFunction]",jt="[object Boolean]",hn="[object Date]",Un="[object DOMException]",Jt="[object Error]",Yt="[object Function]",cr="[object GeneratorFunction]",w="[object Map]",pt="[object Number]",Mn="[object Null]",Bn="[object Object]",Xn="[object Promise]",vr="[object Proxy]",gr="[object RegExp]",r0="[object Set]",Ci="[object String]",yo="[object Symbol]",Ds="[object Undefined]",Mu="[object WeakMap]",Gf="[object WeakSet]",iu="[object ArrayBuffer]",ou="[object DataView]",ol="[object Float32Array]",ul="[object Float64Array]",Es="[object Int8Array]",Uo="[object Int16Array]",sl="[object Int32Array]",Ss="[object Uint8Array]",Cs="[object Uint8ClampedArray]",Ti="[object Uint16Array]",Fu="[object Uint32Array]",ll=/\b__p \+= '';/g,fl=/\b(__p \+=) '' \+/g,cl=/(__e\(.*?\)|\b__t\)) \+\n'';/g,al=/&(?:amp|lt|gt|quot|#39);/g,Ui=/[&<>"']/g,Mr=RegExp(al.source),Ac=RegExp(Ui.source),of=/<%-([\s\S]+?)%>/g,Ts=/<%([\s\S]+?)%>/g,xs=/<%=([\s\S]+?)%>/g,dl=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,qi=/^\w*$/,qo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,kr=/[\\^$.*+?()[\]{}|]/g,Fr=RegExp(kr.source),si=/^\s+/,H0=/\s/,b0=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Bt=/\{\n\/\* \[wrapped with (.+)\] \*/,Lu=/,? & /,c0=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ru=/[()=,{}\[\]\/\s]/,ks=/\\(\\)?/g,As=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,uu=/\w*$/,wo=/^[-+]0x[0-9a-f]+$/i,zo=/^0b[01]+$/i,Os=/^\[object .+?Constructor\]$/,Is=/^0o[0-7]+$/i,uf=/^(?:0|[1-9]\d*)$/,_n=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Nu=/($^)/,Wo=/['\n\r\u2028\u2029\\]/g,su="\\ud800-\\udfff",Ps="\\u0300-\\u036f",pl="\\ufe20-\\ufe2f",Vf="\\u20d0-\\u20ff",hl=Ps+pl+Vf,Bu="\\u2700-\\u27bf",ju="a-z\\xdf-\\xf6\\xf8-\\xff",sf="\\xac\\xb1\\xd7\\xf7",ro="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",Ms="\\u2000-\\u206f",ml=" \\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",Uu="A-Z\\xc0-\\xd6\\xd8-\\xde",G0="\\ufe0e\\ufe0f",Fs=sf+ro+Ms+ml,tt="['\u2019]",zi="["+su+"]",lu="["+Fs+"]",Ho="["+hl+"]",O0="\\d+",vl="["+Bu+"]",gl="["+ju+"]",fu="[^"+su+Fs+O0+Bu+ju+Uu+"]",_l="\\ud83c[\\udffb-\\udfff]",Sn="(?:"+Ho+"|"+_l+")",gt="[^"+su+"]",en="(?:\\ud83c[\\udde6-\\uddff]){2}",I0="[\\ud800-\\udbff][\\udc00-\\udfff]",li="["+Uu+"]",qu="\\u200d",Wi="(?:"+gl+"|"+fu+")",zu="(?:"+li+"|"+fu+")",Wu="(?:"+tt+"(?:d|ll|m|re|s|t|ve))?",Ls="(?:"+tt+"(?:D|LL|M|RE|S|T|VE))?",fi=Sn+"?",e0="["+G0+"]?",io="(?:"+qu+"(?:"+[gt,en,I0].join("|")+")"+e0+fi+")*",D0="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",Do="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",i0=e0+fi+io,Rs="(?:"+[vl,en,I0].join("|")+")"+i0,a0="(?:"+[gt+Ho+"?",Ho,en,I0,zi].join("|")+")",Hu=RegExp(tt,"g"),V0=RegExp(Ho,"g"),bu=RegExp(_l+"(?="+_l+")|"+a0+i0,"g"),Ns=RegExp([li+"?"+gl+"+"+Wu+"(?="+[lu,li,"$"].join("|")+")",zu+"+"+Ls+"(?="+[lu,li+Wi,"$"].join("|")+")",li+"?"+Wi+"+"+Wu,li+"+"+Ls,Do,D0,O0,Rs].join("|"),"g"),bo=RegExp("["+qu+su+hl+G0+"]"),P0=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ln=["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"],lf=-1,nr={};nr[ol]=nr[ul]=nr[Es]=nr[Uo]=nr[sl]=nr[Ss]=nr[Cs]=nr[Ti]=nr[Fu]=!0,nr[at]=nr[it]=nr[iu]=nr[jt]=nr[ou]=nr[hn]=nr[Jt]=nr[Yt]=nr[w]=nr[pt]=nr[Bn]=nr[gr]=nr[r0]=nr[Ci]=nr[Mu]=!1;var rr={};rr[at]=rr[it]=rr[iu]=rr[ou]=rr[jt]=rr[hn]=rr[ol]=rr[ul]=rr[Es]=rr[Uo]=rr[sl]=rr[w]=rr[pt]=rr[Bn]=rr[gr]=rr[r0]=rr[Ci]=rr[yo]=rr[Ss]=rr[Cs]=rr[Ti]=rr[Fu]=!0,rr[Jt]=rr[Yt]=rr[Mu]=!1;var Go={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},Gu={"&":"&","<":"<",">":">",'"':""","'":"'"},yl={"&":"&","<":"<",">":">",""":'"',"'":"'"},cu={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bs=parseFloat,Vu=parseInt,M0=typeof global=="object"&&global&&global.Object===Object&&global,au=typeof self=="object"&&self&&self.Object===Object&&self,Lr=M0||au||Function("return this")(),F=typeof ga=="object"&&ga&&!ga.nodeType&&ga,R=F&&typeof e2=="object"&&e2&&!e2.nodeType&&e2,U=R&&R.exports===F,H=U&&M0.process,fe=function(){try{var ae=R&&R.require&&R.require("util").types;return ae||H&&H.binding&&H.binding("util")}catch(Be){}}(),ue=fe&&fe.isArrayBuffer,de=fe&&fe.isDate,W=fe&&fe.isMap,ve=fe&&fe.isRegExp,Fe=fe&&fe.isSet,Ge=fe&&fe.isTypedArray;function K(ae,Be,Ie){switch(Ie.length){case 0:return ae.call(Be);case 1:return ae.call(Be,Ie[0]);case 2:return ae.call(Be,Ie[0],Ie[1]);case 3:return ae.call(Be,Ie[0],Ie[1],Ie[2])}return ae.apply(Be,Ie)}function xe(ae,Be,Ie,ht){for(var mt=-1,wn=ae==null?0:ae.length;++mt-1}function wt(ae,Be,Ie){for(var ht=-1,mt=ae==null?0:ae.length;++ht-1;);return Ie}function js(ae,Be){for(var Ie=ae.length;Ie--&&Qe(Be,ae[Ie],0)>-1;);return Ie}function Dl(ae,Be){for(var Ie=ae.length,ht=0;Ie--;)ae[Ie]===Be&&++ht;return ht}var du=Cn(Go),Yu=Cn(Gu);function Us(ae){return"\\"+cu[ae]}function oo(ae,Be){return ae==null?i:ae[Be]}function Hi(ae){return bo.test(ae)}function qs(ae){return P0.test(ae)}function F0(ae){for(var Be,Ie=[];!(Be=ae.next()).done;)Ie.push(Be.value);return Ie}function Gr(ae){var Be=-1,Ie=Array(ae.size);return ae.forEach(function(ht,mt){Ie[++Be]=[mt,ht]}),Ie}function ir(ae,Be){return function(Ie){return ae(Be(Ie))}}function L0(ae,Be){for(var Ie=-1,ht=ae.length,mt=0,wn=[];++Ie-1}function Ju(a,p){var E=this.__data__,I=hf(E,a);return I<0?(++this.size,E.push([a,p])):E[I][1]=p,this}Z0.prototype.clear=df,Z0.prototype.delete=Ba,Z0.prototype.get=Oc,Z0.prototype.has=mu,Z0.prototype.set=Ju;function ei(a){var p=-1,E=a==null?0:a.length;for(this.clear();++p=p?a:p)),a}function vi(a,p,E,I,B,G){var te,se=p&D,Ee=p&L,$e=p&N;if(E&&(te=B?E(a,I,B,G):E(a)),te!==i)return te;if(!Jr(a))return a;var Ke=On(a);if(Ke){if(te=f1(a),!se)return Xr(a,te)}else{var nt=U0(a),Ct=nt==Yt||nt==cr;if(Eu(a))return Od(a,se);if(nt==Bn||nt==at||Ct&&!B){if(te=Ee||Ct?{}:zd(a),!se)return Ee?Zu(a,Wa(te,a)):j0(a,mf(te,a))}else{if(!rr[nt])return B?a:{};te=Wd(a,nt,se)}}G||(G=new co);var Gt=G.get(a);if(Gt)return Gt;G.set(a,te),kp(a)?a.forEach(function(dn){te.add(vi(dn,p,E,dn,a,G))}):Tp(a)&&a.forEach(function(dn,Yn){te.set(Yn,vi(dn,p,E,Yn,a,G))});var an=$e?Ee?Dn:r1:Ee?Yi:q0,qn=Ke?i:an(a);return je(qn||a,function(dn,Yn){qn&&(Yn=dn,dn=a[Yn]),xl(te,Yn,vi(dn,p,E,Yn,a,G))}),te}function Xf(a){var p=q0(a);return function(E){return Rc(E,a,p)}}function Rc(a,p,E){var I=E.length;if(a==null)return!I;for(a=$t(a);I--;){var B=E[I],G=p[B],te=a[B];if(te===i&&!(B in a)||!G(te))return!1}return!0}function Jf(a,p,E){if(typeof a!="function")throw new Yr(g);return wf(function(){a.apply(i,E)},p)}function ao(a,p,E,I){var B=-1,G=xt,te=!0,se=a.length,Ee=[],$e=p.length;if(!se)return Ee;E&&(p=lt(p,qr(E))),I?(G=wt,te=!1):p.length>=f&&(G=So,te=!1,p=new vu(p));e:for(;++BB?0:B+E),I=I===i||I>B?B:jn(I),I<0&&(I+=B),I=E>I?0:Ip(I);E0&&E(se)?p>1?k0(se,p-1,E,I,B):Rt(B,se):I||(B[B.length]=se)}return B}var v=ec(),m=ec(!0);function S(a,p){return a&&v(a,p,q0)}function O(a,p){return a&&m(a,p,q0)}function M(a,p){return st(p,function(E){return rs(a[E])})}function b(a,p){p=Gs(p,a);for(var E=0,I=p.length;a!=null&&Ep}function ut(a,p){return a!=null&&or.call(a,p)}function In(a,p){return a!=null&&p in $t(a)}function A0(a,p,E){return a>=kn(p,E)&&a=120&&Ke.length>=120)?new vu(te&&Ke):i}Ke=a[0];var nt=-1,Ct=se[0];e:for(;++nt-1;)se!==a&&C0.call(se,Ee,1),C0.call(a,Ee,1);return a}function jc(a,p){for(var E=a?p.length:0,I=E-1;E--;){var B=p[E];if(E==I||B!==G){var G=B;es(B)?C0.call(a,B,1):$a(a,B)}}return a}function Ga(a,p){return a+hu(Ai()*(p-a+1))}function Lm(a,p,E,I){for(var B=-1,G=wr(B0((p-a)/(E||1)),0),te=Ie(G);G--;)te[I?G:++B]=a,a+=E;return te}function Va(a,p){var E="";if(!a||p<1||p>Nt)return E;do p%2&&(E+=a),p=hu(p/2),p&&(a+=a);while(p);return E}function Wn(a,p){return m1(Gd(a,p,$i),a+"")}function wd(a){return Fc(Ef(a))}function Dd(a,p){var E=Ef(a);return Yc(E,mi(p,0,E.length))}function Ol(a,p,E,I){if(!Jr(a))return a;p=Gs(p,a);for(var B=-1,G=p.length,te=G-1,se=a;se!=null&&++BB?0:B+p),E=E>B?B:E,E<0&&(E+=B),B=p>E?0:E-p>>>0,p>>>=0;for(var G=Ie(B);++I>>1,te=a[G];te!==null&&!mo(te)&&(E?te<=p:te=f){var $e=p?null:bm(a);if($e)return Y0($e);te=!1,B=So,Ee=new vu}else Ee=p?[]:se;e:for(;++I=I?a:Oo(a,p,E)}var Ad=pu||function(a){return Lr.clearTimeout(a)};function Od(a,p){if(p)return a.slice();var E=a.length,I=Nr?Nr(E):new a.constructor(E);return a.copy(I),I}function Qa(a){var p=new a.constructor(a.byteLength);return new R0(p).set(new R0(a)),p}function jm(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.byteLength)}function Um(a){var p=new a.constructor(a.source,uu.exec(a));return p.lastIndex=a.lastIndex,p}function qm(a){return Wr?$t(Wr.call(a)):{}}function Id(a,p){var E=p?Qa(a.buffer):a.buffer;return new a.constructor(E,a.byteOffset,a.length)}function Pd(a,p){if(a!==p){var E=a!==i,I=a===null,B=a===a,G=mo(a),te=p!==i,se=p===null,Ee=p===p,$e=mo(p);if(!se&&!$e&&!G&&a>p||G&&te&&Ee&&!se&&!$e||I&&te&&Ee||!E&&Ee||!B)return 1;if(!I&&!G&&!$e&&a=se)return Ee;var $e=E[I];return Ee*($e=="desc"?-1:1)}}return a.index-p.index}function gf(a,p,E,I){for(var B=-1,G=a.length,te=E.length,se=-1,Ee=p.length,$e=wr(G-te,0),Ke=Ie(Ee+$e),nt=!I;++se1?E[B-1]:i,te=B>2?E[2]:i;for(G=a.length>3&&typeof G=="function"?(B--,G):i,te&&Ii(E[0],E[1],te)&&(G=B<3?i:G,B=1),p=$t(p);++I-1?B[G?p[te]:te]:i}}function Rd(a){return yu(function(p){var E=p.length,I=E,B=Qn.prototype.thru;for(a&&p.reverse();I--;){var G=p[I];if(typeof G!="function")throw new Yr(g);if(B&&!te&&Gc(G)=="wrapper")var te=new Qn([],!0)}for(I=te?I:E;++I1&&er.reverse(),Ke&&Eese))return!1;var $e=G.get(a),Ke=G.get(p);if($e&&Ke)return $e==p&&Ke==a;var nt=-1,Ct=!0,Gt=E&$?new vu:i;for(G.set(a,p),G.set(p,a);++nt1?"& ":"")+p[I],p=p.join(E>2?", ":" "),a.replace(b0,`{ -/* [wrapped with `+p+`] */ -`)}function Xm(a){return On(a)||Ll(a)||!!(di&&a&&a[di])}function es(a,p){var E=typeof a;return p=p==null?Nt:p,!!p&&(E=="number"||E!="symbol"&&uf.test(a))&&a>-1&&a%1==0&&a0){if(++p>=ot)return arguments[0]}else p=0;return a.apply(i,arguments)}}function Yc(a,p){var E=-1,I=a.length,B=I-1;for(p=p===i?I:p;++E1?a[p-1]:i;return E=typeof E=="function"?(a.pop(),E):i,sp(a,E)});function fp(a){var p=z(a);return p.__chain__=!0,p}function cp(a,p){return p(a),a}function Kc(a,p){return p(a)}var Wv=yu(function(a){var p=a.length,E=p?a[0]:0,I=this.__wrapped__,B=function(G){return Hs(G,a)};return p>1||this.__actions__.length||!(I instanceof nn)||!es(E)?this.thru(B):(I=I.slice(E,+E+(p?1:0)),I.__actions__.push({func:Kc,args:[B],thisArg:i}),new Qn(I,this.__chain__).thru(function(G){return p&&!G.length&&G.push(i),G}))});function Hv(){return fp(this)}function bv(){return new Qn(this.value(),this.__chain__)}function Gv(){this.__values__===i&&(this.__values__=Op(this.value()));var a=this.__index__>=this.__values__.length,p=a?i:this.__values__[this.__index__++];return{done:a,value:p}}function Vv(){return this}function Yv(a){for(var p,E=this;E instanceof Or;){var I=Jd(E);I.__index__=0,I.__values__=i,p?B.__wrapped__=I:p=I;var B=I;E=E.__wrapped__}return B.__wrapped__=a,p}function Ml(){var a=this.__wrapped__;if(a instanceof nn){var p=a;return this.__actions__.length&&(p=new nn(this)),p=p.reverse(),p.__actions__.push({func:Kc,args:[g1],thisArg:i}),new Qn(p,this.__chain__)}return this.thru(g1)}function Fl(){return xd(this.__wrapped__,this.__actions__)}var Xc=_f(function(a,p,E){or.call(a,E)?++a[E]:ti(a,E,1)});function $v(a,p,E){var I=On(a)?rt:Nc;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}function Kv(a,p){var E=On(a)?st:Qf;return E(a,cn(p,3))}var Xv=Ld(Qd),D1=Ld($c);function Jv(a,p){return k0(Jc(a,p),1)}function Qv(a,p){return k0(Jc(a,p),Ot)}function ap(a,p,E){return E=E===i?1:jn(E),k0(Jc(a,p),E)}function dp(a,p){var E=On(a)?je:$o;return E(a,cn(p,3))}function pp(a,p){var E=On(a)?Xe:kl;return E(a,cn(p,3))}var Zv=_f(function(a,p,E){or.call(a,E)?a[E].push(p):ti(a,E,[p])});function eg(a,p,E,I){a=Vi(a)?a:Ef(a),E=E&&!I?jn(E):0;var B=a.length;return E<0&&(E=wr(B+E,0)),ia(a)?E<=B&&a.indexOf(p,E)>-1:!!B&&Qe(a,p,E)>-1}var tg=Wn(function(a,p,E){var I=-1,B=typeof p=="function",G=Vi(a)?Ie(a.length):[];return $o(a,function(te){G[++I]=B?K(p,te,E):po(te,p,E)}),G}),hp=_f(function(a,p,E){ti(a,E,p)});function Jc(a,p){var E=On(a)?lt:vd;return E(a,cn(p,3))}function ng(a,p,E,I){return a==null?[]:(On(p)||(p=p==null?[]:[p]),E=I?i:E,On(E)||(E=E==null?[]:[E]),Oi(a,p,E))}var rg=_f(function(a,p,E){a[E?0:1].push(p)},function(){return[[],[]]});function mp(a,p,E){var I=On(a)?yn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,$o)}function ig(a,p,E){var I=On(a)?sn:bn,B=arguments.length<3;return I(a,cn(p,4),E,B,kl)}function og(a,p){var E=On(a)?st:Qf;return E(a,Zc(cn(p,3)))}function ug(a){var p=On(a)?Fc:wd;return p(a)}function sg(a,p,E){(E?Ii(a,p,E):p===i)?p=1:p=jn(p);var I=On(a)?Lc:Dd;return I(a,p)}function lg(a){var p=On(a)?Kf:Ao;return p(a)}function E1(a){if(a==null)return 0;if(Vi(a))return ia(a)?Rr(a):a.length;var p=U0(a);return p==w||p==r0?a.size:Zf(a).length}function fg(a,p,E){var I=On(a)?ar:Nm;return E&&Ii(a,p,E)&&(p=i),I(a,cn(p,3))}var cg=Wn(function(a,p){if(a==null)return[];var E=p.length;return E>1&&Ii(a,p[0],p[1])?p=[]:E>2&&Ii(p[0],p[1],p[2])&&(p=[p[0]]),Oi(a,k0(p,1),[])}),rc=Sl||function(){return Lr.Date.now()};function ag(a,p){if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){if(--a<1)return p.apply(this,arguments)}}function vp(a,p,E){return p=E?i:p,p=a&&p==null?a.length:p,Lt(a,De,i,i,i,i,p)}function gp(a,p){var E;if(typeof p!="function")throw new Yr(g);return a=jn(a),function(){return--a>0&&(E=p.apply(this,arguments)),a<=1&&(p=i),E}}var S1=Wn(function(a,p,E){var I=h;if(E.length){var B=L0(E,An(S1));I|=Se}return Lt(a,I,p,E,B)}),_p=Wn(function(a,p,E){var I=h|re;if(E.length){var B=L0(E,An(_p));I|=Se}return Lt(p,I,a,E,B)});function C1(a,p,E){p=E?i:p;var I=Lt(a,Q,i,i,i,i,i,p);return I.placeholder=C1.placeholder,I}function yp(a,p,E){p=E?i:p;var I=Lt(a,oe,i,i,i,i,i,p);return I.placeholder=yp.placeholder,I}function wp(a,p,E){var I,B,G,te,se,Ee,$e=0,Ke=!1,nt=!1,Ct=!0;if(typeof a!="function")throw new Yr(g);p=Fo(p)||0,Jr(E)&&(Ke=!!E.leading,nt="maxWait"in E,G=nt?wr(Fo(E.maxWait)||0,p):G,Ct="trailing"in E?!!E.trailing:Ct);function Gt(f0){var Jo=I,Su=B;return I=B=i,$e=f0,te=a.apply(Su,Jo),te}function an(f0){return $e=f0,se=wf(Yn,p),Ke?Gt(f0):te}function qn(f0){var Jo=f0-Ee,Su=f0-$e,Zp=p-Jo;return nt?kn(Zp,G-Su):Zp}function dn(f0){var Jo=f0-Ee,Su=f0-$e;return Ee===i||Jo>=p||Jo<0||nt&&Su>=G}function Yn(){var f0=rc();if(dn(f0))return er(f0);se=wf(Yn,qn(f0))}function er(f0){return se=i,Ct&&I?Gt(f0):(I=B=i,te)}function vo(){se!==i&&Ad(se),$e=0,I=Ee=B=se=i}function Pi(){return se===i?te:er(rc())}function Mi(){var f0=rc(),Jo=dn(f0);if(I=arguments,B=this,Ee=f0,Jo){if(se===i)return an(Ee);if(nt)return Ad(se),se=wf(Yn,p),Gt(Ee)}return se===i&&(se=wf(Yn,p)),te}return Mi.cancel=vo,Mi.flush=Pi,Mi}var dg=Wn(function(a,p){return Jf(a,1,p)}),Dp=Wn(function(a,p,E){return Jf(a,Fo(p)||0,E)});function pg(a){return Lt(a,Te)}function Qc(a,p){if(typeof a!="function"||p!=null&&typeof p!="function")throw new Yr(g);var E=function(){var I=arguments,B=p?p.apply(this,I):I[0],G=E.cache;if(G.has(B))return G.get(B);var te=a.apply(this,I);return E.cache=G.set(B,te)||G,te};return E.cache=new(Qc.Cache||ei),E}Qc.Cache=ei;function Zc(a){if(typeof a!="function")throw new Yr(g);return function(){var p=arguments;switch(p.length){case 0:return!a.call(this);case 1:return!a.call(this,p[0]);case 2:return!a.call(this,p[0],p[1]);case 3:return!a.call(this,p[0],p[1],p[2])}return!a.apply(this,p)}}function ea(a){return gp(2,a)}var hg=Bm(function(a,p){p=p.length==1&&On(p[0])?lt(p[0],qr(cn())):lt(k0(p,1),qr(cn()));var E=p.length;return Wn(function(I){for(var B=-1,G=kn(I.length,E);++B=p}),Ll=_i(function(){return arguments}())?_i:function(a){return n0(a)&&or.call(a,"callee")&&!N0.call(a,"callee")},On=Ie.isArray,x1=ue?qr(ue):Re;function Vi(a){return a!=null&&na(a.length)&&!rs(a)}function l0(a){return n0(a)&&Vi(a)}function kg(a){return a===!0||a===!1||n0(a)&&Ye(a)==jt}var Eu=pi||W1,Ag=de?qr(de):Ce;function Og(a){return n0(a)&&a.nodeType===1&&!ic(a)}function Cp(a){if(a==null)return!0;if(Vi(a)&&(On(a)||typeof a=="string"||typeof a.splice=="function"||Eu(a)||Df(a)||Ll(a)))return!a.length;var p=U0(a);if(p==w||p==r0)return!a.size;if(nc(a))return!Zf(a).length;for(var E in a)if(or.call(a,E))return!1;return!0}function Ig(a,p){return ze(a,p)}function Pg(a,p,E){E=typeof E=="function"?E:i;var I=E?E(a,p):i;return I===i?ze(a,p,i,E):!!I}function k1(a){if(!n0(a))return!1;var p=Ye(a);return p==Jt||p==Un||typeof a.message=="string"&&typeof a.name=="string"&&!ic(a)}function Mg(a){return typeof a=="number"&&Br(a)}function rs(a){if(!Jr(a))return!1;var p=Ye(a);return p==Yt||p==cr||p==Ft||p==vr}function A1(a){return typeof a=="number"&&a==jn(a)}function na(a){return typeof a=="number"&&a>-1&&a%1==0&&a<=Nt}function Jr(a){var p=typeof a;return a!=null&&(p=="object"||p=="function")}function n0(a){return a!=null&&typeof a=="object"}var Tp=W?qr(W):on;function Fg(a,p){return a===p||sr(a,p,Nn(p))}function Lg(a,p,E){return E=typeof E=="function"?E:i,sr(a,p,Nn(p),E)}function Rg(a){return xp(a)&&a!=+a}function Ng(a){if(Zm(a))throw new mt(c);return mn(a)}function Bg(a){return a===null}function O1(a){return a==null}function xp(a){return typeof a=="number"||n0(a)&&Ye(a)==pt}function ic(a){if(!n0(a)||Ye(a)!=Bn)return!1;var p=uo(a);if(p===null)return!0;var E=or.call(p,"constructor")&&p.constructor;return typeof E=="function"&&E instanceof E&&bi.call(E)==af}var ra=ve?qr(ve):pr;function jg(a){return A1(a)&&a>=-Nt&&a<=Nt}var kp=Fe?qr(Fe):Hr;function ia(a){return typeof a=="string"||!On(a)&&n0(a)&&Ye(a)==Ci}function mo(a){return typeof a=="symbol"||n0(a)&&Ye(a)==yo}var Df=Ge?qr(Ge):Vn;function Ap(a){return a===i}function Ug(a){return n0(a)&&U0(a)==Mu}function qg(a){return n0(a)&&Ye(a)==Gf}var zg=bc(Ha),Wg=bc(function(a,p){return a<=p});function Op(a){if(!a)return[];if(Vi(a))return ia(a)?Jn(a):Xr(a);if(u0&&a[u0])return F0(a[u0]());var p=U0(a),E=p==w?Gr:p==r0?Y0:Ef;return E(a)}function is(a){if(!a)return a===0?a:0;if(a=Fo(a),a===Ot||a===-Ot){var p=a<0?-1:1;return p*Je}return a===a?a:0}function jn(a){var p=is(a),E=p%1;return p===p?E?p-E:p:0}function Ip(a){return a?mi(jn(a),0,ne):0}function Fo(a){if(typeof a=="number")return a;if(mo(a))return V;if(Jr(a)){var p=typeof a.valueOf=="function"?a.valueOf():a;a=Jr(p)?p+"":p}if(typeof a!="string")return a===0?a:+a;a=E0(a);var E=zo.test(a);return E||Is.test(a)?Vu(a.slice(2),E?2:8):wo.test(a)?V:+a}function oa(a){return yi(a,Yi(a))}function Hg(a){return a?mi(jn(a),-Nt,Nt):a===0?a:0}function yr(a){return a==null?"":ho(a)}var Pp=Io(function(a,p){if(nc(p)||Vi(p)){yi(p,q0(p),a);return}for(var E in p)or.call(p,E)&&xl(a,E,p[E])}),Mp=Io(function(a,p){yi(p,Yi(p),a)}),ua=Io(function(a,p,E,I){yi(p,Yi(p),a,I)}),bg=Io(function(a,p,E,I){yi(p,q0(p),a,I)}),Gg=yu(Hs);function Vg(a,p){var E=dr(a);return p==null?E:mf(E,p)}var Fp=Wn(function(a,p){a=$t(a);var E=-1,I=p.length,B=I>2?p[2]:i;for(B&&Ii(p[0],p[1],B)&&(I=1);++E1),G}),yi(a,Dn(a),E),I&&(E=vi(E,D|L|N,Gm));for(var B=p.length;B--;)$a(E,p[B]);return E});function l_(a,p){return Bp(a,Zc(cn(p)))}var f_=yu(function(a,p){return a==null?{}:Fm(a,p)});function Bp(a,p){if(a==null)return{};var E=lt(Dn(a),function(I){return[I]});return p=cn(p),yd(a,E,function(I,B){return p(I,B[0])})}function c_(a,p,E){p=Gs(p,a);var I=-1,B=p.length;for(B||(B=1,a=i);++Ip){var I=a;a=p,p=I}if(E||a%1||p%1){var B=Ai();return kn(a+B*(p-a+Bs("1e-"+((B+"").length-1))),p)}return Ga(a,p)}var __=yf(function(a,p,E){return p=p.toLowerCase(),a+(E?Wp(p):p)});function Wp(a){return L1(yr(a).toLowerCase())}function Hp(a){return a=yr(a),a&&a.replace(_n,du).replace(V0,"")}function y_(a,p,E){a=yr(a),p=ho(p);var I=a.length;E=E===i?I:mi(jn(E),0,I);var B=E;return E-=p.length,E>=0&&a.slice(E,B)==p}function M1(a){return a=yr(a),a&&Ac.test(a)?a.replace(Ui,Yu):a}function w_(a){return a=yr(a),a&&Fr.test(a)?a.replace(kr,"\\$&"):a}var D_=yf(function(a,p,E){return a+(E?"-":"")+p.toLowerCase()}),bp=yf(function(a,p,E){return a+(E?" ":"")+p.toLowerCase()}),E_=Fd("toLowerCase");function S_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;if(!p||I>=p)return a;var B=(p-I)/2;return Hc(hu(B),E)+a+Hc(B0(B),E)}function C_(a,p,E){a=yr(a),p=jn(p);var I=p?Rr(a):0;return p&&I>>0,E?(a=yr(a),a&&(typeof p=="string"||p!=null&&!ra(p))&&(p=ho(p),!p&&Hi(a))?Vs(Jn(a),0,E):a.split(p,E)):[]}var I_=yf(function(a,p,E){return a+(E?" ":"")+L1(p)});function P_(a,p,E){return a=yr(a),E=E==null?0:mi(jn(E),0,a.length),p=ho(p),a.slice(E,E+p.length)==p}function M_(a,p,E){var I=z.templateSettings;E&&Ii(a,p,E)&&(p=i),a=yr(a),p=ua({},p,I,n1);var B=ua({},p.imports,I.imports,n1),G=q0(B),te=Eo(B,G),se,Ee,$e=0,Ke=p.interpolate||Nu,nt="__p += '",Ct=X0((p.escape||Nu).source+"|"+Ke.source+"|"+(Ke===xs?As:Nu).source+"|"+(p.evaluate||Nu).source+"|$","g"),Gt="//# sourceURL="+(or.call(p,"sourceURL")?(p.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++lf+"]")+` -`;a.replace(Ct,function(dn,Yn,er,vo,Pi,Mi){return er||(er=vo),nt+=a.slice($e,Mi).replace(Wo,Us),Yn&&(se=!0,nt+=`' + -__e(`+Yn+`) + -'`),Pi&&(Ee=!0,nt+=`'; -`+Pi+`; -__p += '`),er&&(nt+=`' + -((__t = (`+er+`)) == null ? '' : __t) + -'`),$e=Mi+dn.length,dn}),nt+=`'; -`;var an=or.call(p,"variable")&&p.variable;if(!an)nt=`with (obj) { -`+nt+` -} -`;else if(Ru.test(an))throw new mt(t);nt=(Ee?nt.replace(ll,""):nt).replace(fl,"$1").replace(cl,"$1;"),nt="function("+(an||"obj")+`) { -`+(an?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(se?", __e = _.escape":"")+(Ee?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+nt+`return __p -}`;var qn=$p(function(){return wn(G,Gt+"return "+nt).apply(i,te)});if(qn.source=nt,k1(qn))throw qn;return qn}function F_(a){return yr(a).toLowerCase()}function L_(a){return yr(a).toUpperCase()}function R_(a,p,E){if(a=yr(a),a&&(E||p===i))return E0(a);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=Jn(p),G=wl(I,B),te=js(I,B)+1;return Vs(I,G,te).join("")}function F1(a,p,E){if(a=yr(a),a&&(E||p===i))return a.slice(0,ai(a)+1);if(!a||!(p=ho(p)))return a;var I=Jn(a),B=js(I,Jn(p))+1;return Vs(I,0,B).join("")}function N_(a,p,E){if(a=yr(a),a&&(E||p===i))return a.replace(si,"");if(!a||!(p=ho(p)))return a;var I=Jn(a),B=wl(I,Jn(p));return Vs(I,B).join("")}function B_(a,p){var E=Oe,I=Le;if(Jr(p)){var B="separator"in p?p.separator:B;E="length"in p?jn(p.length):E,I="omission"in p?ho(p.omission):I}a=yr(a);var G=a.length;if(Hi(a)){var te=Jn(a);G=te.length}if(E>=G)return a;var se=E-Rr(I);if(se<1)return I;var Ee=te?Vs(te,0,se).join(""):a.slice(0,se);if(B===i)return Ee+I;if(te&&(se+=Ee.length-se),ra(B)){if(a.slice(se).search(B)){var $e,Ke=Ee;for(B.global||(B=X0(B.source,yr(uu.exec(B))+"g")),B.lastIndex=0;$e=B.exec(Ke);)var nt=$e.index;Ee=Ee.slice(0,nt===i?se:nt)}}else if(a.indexOf(ho(B),se)!=se){var Ct=Ee.lastIndexOf(B);Ct>-1&&(Ee=Ee.slice(0,Ct))}return Ee+I}function Vp(a){return a=yr(a),a&&Mr.test(a)?a.replace(al,o0):a}var j_=yf(function(a,p,E){return a+(E?" ":"")+p.toUpperCase()}),L1=Fd("toUpperCase");function Yp(a,p,E){return a=yr(a),p=E?i:p,p===i?qs(a)?cf(a):d0(a):a.match(p)||[]}var $p=Wn(function(a,p){try{return K(a,i,p)}catch(E){return k1(E)?E:new mt(E)}}),U_=yu(function(a,p){return je(p,function(E){E=Xo(E),ti(a,E,S1(a[E],a))}),a});function Kp(a){var p=a==null?0:a.length,E=cn();return a=p?lt(a,function(I){if(typeof I[1]!="function")throw new Yr(g);return[E(I[0]),I[1]]}):[],Wn(function(I){for(var B=-1;++BNt)return[];var E=ne,I=kn(a,ne);p=cn(p),a-=ne;for(var B=ci(I,p);++E0||p<0)?new nn(E):(a<0?E=E.takeRight(-a):a&&(E=E.drop(a)),p!==i&&(p=jn(p),E=p<0?E.dropRight(-p):E.take(p-a)),E)},nn.prototype.takeRightWhile=function(a){return this.reverse().takeWhile(a).reverse()},nn.prototype.toArray=function(){return this.take(ne)},S(nn.prototype,function(a,p){var E=/^(?:filter|find|map|reject)|While$/.test(p),I=/^(?:head|last)$/.test(p),B=z[I?"take"+(p=="last"?"Right":""):p],G=I||/^find/.test(p);!B||(z.prototype[p]=function(){var te=this.__wrapped__,se=I?[1]:arguments,Ee=te instanceof nn,$e=se[0],Ke=Ee||On(te),nt=function(Yn){var er=B.apply(z,Rt([Yn],se));return I&&Ct?er[0]:er};Ke&&E&&typeof $e=="function"&&$e.length!=1&&(Ee=Ke=!1);var Ct=this.__chain__,Gt=!!this.__actions__.length,an=G&&!Ct,qn=Ee&&!Gt;if(!G&&Ke){te=qn?te:new nn(this);var dn=a.apply(te,se);return dn.__actions__.push({func:Kc,args:[nt],thisArg:i}),new Qn(dn,Ct)}return an&&qn?a.apply(this,se):(dn=this.thru(nt),an?I?dn.value()[0]:dn.value():dn)})}),je(["pop","push","shift","sort","splice","unshift"],function(a){var p=$r[a],E=/^(?:push|sort|unshift)$/.test(a)?"tap":"thru",I=/^(?:pop|shift)$/.test(a);z.prototype[a]=function(){var B=arguments;if(I&&!this.__chain__){var G=this.value();return p.apply(On(G)?G:[],B)}return this[E](function(te){return p.apply(On(te)?te:[],B)})}}),S(nn.prototype,function(a,p){var E=z[p];if(E){var I=E.name+"";or.call(bt,I)||(bt[I]=[]),bt[I].push({name:p,func:E})}}),bt[zc(i,re).name]=[{name:"wrapper",func:i}],nn.prototype.clone=s0,nn.prototype.reverse=t0,nn.prototype.value=g0,z.prototype.at=Wv,z.prototype.chain=Hv,z.prototype.commit=bv,z.prototype.next=Gv,z.prototype.plant=Yv,z.prototype.reverse=Ml,z.prototype.toJSON=z.prototype.valueOf=z.prototype.value=Fl,z.prototype.first=z.prototype.head,u0&&(z.prototype[u0]=Vv),z},K0=$0();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Lr._=K0,define(function(){return K0})):R?((R.exports=K0)._=K0,F._=K0):Lr._=K0}).call(ga)});var ay=Me((XH,cy)=>{"use strict";var fr=cy.exports;cy.exports.default=fr;var Pr="[",t2="]",ya="\x07",vh=";",OD=process.env.TERM_PROGRAM==="Apple_Terminal";fr.cursorTo=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");return typeof u!="number"?Pr+(i+1)+"G":Pr+(u+1)+";"+(i+1)+"H"};fr.cursorMove=(i,u)=>{if(typeof i!="number")throw new TypeError("The `x` argument is required");let f="";return i<0?f+=Pr+-i+"D":i>0&&(f+=Pr+i+"C"),u<0?f+=Pr+-u+"A":u>0&&(f+=Pr+u+"B"),f};fr.cursorUp=(i=1)=>Pr+i+"A";fr.cursorDown=(i=1)=>Pr+i+"B";fr.cursorForward=(i=1)=>Pr+i+"C";fr.cursorBackward=(i=1)=>Pr+i+"D";fr.cursorLeft=Pr+"G";fr.cursorSavePosition=OD?"7":Pr+"s";fr.cursorRestorePosition=OD?"8":Pr+"u";fr.cursorGetPosition=Pr+"6n";fr.cursorNextLine=Pr+"E";fr.cursorPrevLine=Pr+"F";fr.cursorHide=Pr+"?25l";fr.cursorShow=Pr+"?25h";fr.eraseLines=i=>{let u="";for(let f=0;f[t2,"8",vh,vh,u,ya,i,t2,"8",vh,vh,ya].join("");fr.image=(i,u={})=>{let f=`${t2}1337;File=inline=1`;return u.width&&(f+=`;width=${u.width}`),u.height&&(f+=`;height=${u.height}`),u.preserveAspectRatio===!1&&(f+=";preserveAspectRatio=0"),f+":"+i.toString("base64")+ya};fr.iTerm={setCwd:(i=process.cwd())=>`${t2}50;CurrentDir=${i}${ya}`,annotation:(i,u={})=>{let f=`${t2}1337;`,c=typeof u.x!="undefined",g=typeof u.y!="undefined";if((c||g)&&!(c&&g&&typeof u.length!="undefined"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return i=i.replace(/\|/g,""),f+=u.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",u.length>0?f+=(c?[i,u.length,u.x,u.y]:[u.length,i]).join("|"):f+=i,f+ya}}});var PD=Me((JH,dy)=>{"use strict";var ID=(i,u)=>{for(let f of Reflect.ownKeys(u))Object.defineProperty(i,f,Object.getOwnPropertyDescriptor(u,f));return i};dy.exports=ID;dy.exports.default=ID});var FD=Me((QH,gh)=>{"use strict";var oN=PD(),_h=new WeakMap,MD=(i,u={})=>{if(typeof i!="function")throw new TypeError("Expected a function");let f,c=!1,g=0,t=i.displayName||i.name||"",C=function(...A){if(_h.set(C,++g),c){if(u.throw===!0)throw new Error(`Function \`${t}\` can only be called once`);return f}return c=!0,f=i.apply(this,A),i=null,f};return oN(C,i),_h.set(C,g),C};gh.exports=MD;gh.exports.default=MD;gh.exports.callCount=i=>{if(!_h.has(i))throw new Error(`The given function \`${i.name}\` is not wrapped by the \`onetime\` package`);return _h.get(i)}});var LD=Me((ZH,yh)=>{yh.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&yh.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&yh.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var vy=Me((eb,n2)=>{var uN=require("assert"),r2=LD(),sN=/^win/i.test(process.platform),wh=require("events");typeof wh!="function"&&(wh=wh.EventEmitter);var Bi;process.__signal_exit_emitter__?Bi=process.__signal_exit_emitter__:(Bi=process.__signal_exit_emitter__=new wh,Bi.count=0,Bi.emitted={});Bi.infinite||(Bi.setMaxListeners(Infinity),Bi.infinite=!0);n2.exports=function(i,u){uN.equal(typeof i,"function","a callback must be provided for exit handler"),i2===!1&&RD();var f="exit";u&&u.alwaysLast&&(f="afterexit");var c=function(){Bi.removeListener(f,i),Bi.listeners("exit").length===0&&Bi.listeners("afterexit").length===0&&py()};return Bi.on(f,i),c};n2.exports.unload=py;function py(){!i2||(i2=!1,r2.forEach(function(i){try{process.removeListener(i,hy[i])}catch(u){}}),process.emit=my,process.reallyExit=ND,Bi.count-=1)}function wa(i,u,f){Bi.emitted[i]||(Bi.emitted[i]=!0,Bi.emit(i,u,f))}var hy={};r2.forEach(function(i){hy[i]=function(){var f=process.listeners(i);f.length===Bi.count&&(py(),wa("exit",null,i),wa("afterexit",null,i),sN&&i==="SIGHUP"&&(i="SIGINT"),process.kill(process.pid,i))}});n2.exports.signals=function(){return r2};n2.exports.load=RD;var i2=!1;function RD(){i2||(i2=!0,Bi.count+=1,r2=r2.filter(function(i){try{return process.on(i,hy[i]),!0}catch(u){return!1}}),process.emit=fN,process.reallyExit=lN)}var ND=process.reallyExit;function lN(i){process.exitCode=i||0,wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),ND.call(process,process.exitCode)}var my=process.emit;function fN(i,u){if(i==="exit"){u!==void 0&&(process.exitCode=u);var f=my.apply(this,arguments);return wa("exit",process.exitCode,null),wa("afterexit",process.exitCode,null),f}else return my.apply(this,arguments)}});var jD=Me((tb,BD)=>{"use strict";var cN=FD(),aN=vy();BD.exports=cN(()=>{aN(()=>{process.stderr.write("[?25h")},{alwaysLast:!0})})});var gy=Me(Da=>{"use strict";var dN=jD(),Dh=!1;Da.show=(i=process.stderr)=>{!i.isTTY||(Dh=!1,i.write("[?25h"))};Da.hide=(i=process.stderr)=>{!i.isTTY||(dN(),Dh=!0,i.write("[?25l"))};Da.toggle=(i,u)=>{i!==void 0&&(Dh=i),Dh?Da.show(u):Da.hide(u)}});var WD=Me(o2=>{"use strict";var UD=o2&&o2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(o2,"__esModule",{value:!0});var qD=UD(ay()),zD=UD(gy()),pN=(i,{showCursor:u=!1}={})=>{let f=0,c="",g=!1,t=C=>{!u&&!g&&(zD.default.hide(),g=!0);let A=C+` -`;A!==c&&(c=A,i.write(qD.default.eraseLines(f)+A),f=A.split(` -`).length)};return t.clear=()=>{i.write(qD.default.eraseLines(f)),c="",f=0},t.done=()=>{c="",f=0,u||(zD.default.show(),g=!1)},t};o2.default={create:pN}});var bD=Me((ib,HD)=>{HD.exports=[{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"}}]});var YD=Me(ru=>{"use strict";var GD=bD(),nl=process.env;Object.defineProperty(ru,"_vendors",{value:GD.map(function(i){return i.constant})});ru.name=null;ru.isPR=null;GD.forEach(function(i){var u=Array.isArray(i.env)?i.env:[i.env],f=u.every(function(c){return VD(c)});if(ru[i.constant]=f,f)switch(ru.name=i.name,typeof i.pr){case"string":ru.isPR=!!nl[i.pr];break;case"object":"env"in i.pr?ru.isPR=i.pr.env in nl&&nl[i.pr.env]!==i.pr.ne:"any"in i.pr?ru.isPR=i.pr.any.some(function(c){return!!nl[c]}):ru.isPR=VD(i.pr);break;default:ru.isPR=null}});ru.isCI=!!(nl.CI||nl.CONTINUOUS_INTEGRATION||nl.BUILD_NUMBER||nl.RUN_ID||ru.name);function VD(i){return typeof i=="string"?!!nl[i]:Object.keys(i).every(function(u){return nl[u]===i[u]})}});var KD=Me((ub,$D)=>{"use strict";$D.exports=YD().isCI});var JD=Me((sb,XD)=>{"use strict";var hN=i=>{let u=new Set;do for(let f of Reflect.ownKeys(i))u.add([i,f]);while((i=Reflect.getPrototypeOf(i))&&i!==Object.prototype);return u};XD.exports=(i,{include:u,exclude:f}={})=>{let c=g=>{let t=C=>typeof C=="string"?g===C:C.test(g);return u?u.some(t):f?!f.some(t):!0};for(let[g,t]of hN(i.constructor.prototype)){if(t==="constructor"||!c(t))continue;let C=Reflect.getOwnPropertyDescriptor(g,t);C&&typeof C.value=="function"&&(i[t]=i[t].bind(i))}return i}});var iE=Me(Sr=>{"use strict";Object.defineProperty(Sr,"__esModule",{value:!0});var Ea,u2,Eh,Sh,_y;typeof window=="undefined"||typeof MessageChannel!="function"?(Sa=null,yy=null,wy=function(){if(Sa!==null)try{var i=Sr.unstable_now();Sa(!0,i),Sa=null}catch(u){throw setTimeout(wy,0),u}},QD=Date.now(),Sr.unstable_now=function(){return Date.now()-QD},Ea=function(i){Sa!==null?setTimeout(Ea,0,i):(Sa=i,setTimeout(wy,0))},u2=function(i,u){yy=setTimeout(i,u)},Eh=function(){clearTimeout(yy)},Sh=function(){return!1},_y=Sr.unstable_forceFrameRate=function(){}):(Ch=window.performance,Dy=window.Date,ZD=window.setTimeout,eE=window.clearTimeout,typeof console!="undefined"&&(tE=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof tE!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Ch=="object"&&typeof Ch.now=="function"?Sr.unstable_now=function(){return Ch.now()}:(nE=Dy.now(),Sr.unstable_now=function(){return Dy.now()-nE}),s2=!1,l2=null,Th=-1,Ey=5,Sy=0,Sh=function(){return Sr.unstable_now()>=Sy},_y=function(){},Sr.unstable_forceFrameRate=function(i){0>i||125kh(C,f))x!==void 0&&0>kh(x,C)?(i[c]=x,i[A]=f,c=A):(i[c]=C,i[t]=f,c=t);else if(x!==void 0&&0>kh(x,f))i[c]=x,i[A]=f,c=A;else break e}}return u}return null}function kh(i,u){var f=i.sortIndex-u.sortIndex;return f!==0?f:i.id-u.id}var ds=[],Nf=[],mN=1,_o=null,to=3,Oh=!1,pc=!1,f2=!1;function Ih(i){for(var u=Iu(Nf);u!==null;){if(u.callback===null)Ah(Nf);else if(u.startTime<=i)Ah(Nf),u.sortIndex=u.expirationTime,Ty(ds,u);else break;u=Iu(Nf)}}function xy(i){if(f2=!1,Ih(i),!pc)if(Iu(ds)!==null)pc=!0,Ea(ky);else{var u=Iu(Nf);u!==null&&u2(xy,u.startTime-i)}}function ky(i,u){pc=!1,f2&&(f2=!1,Eh()),Oh=!0;var f=to;try{for(Ih(u),_o=Iu(ds);_o!==null&&(!(_o.expirationTime>u)||i&&!Sh());){var c=_o.callback;if(c!==null){_o.callback=null,to=_o.priorityLevel;var g=c(_o.expirationTime<=u);u=Sr.unstable_now(),typeof g=="function"?_o.callback=g:_o===Iu(ds)&&Ah(ds),Ih(u)}else Ah(ds);_o=Iu(ds)}if(_o!==null)var t=!0;else{var C=Iu(Nf);C!==null&&u2(xy,C.startTime-u),t=!1}return t}finally{_o=null,to=f,Oh=!1}}function rE(i){switch(i){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var vN=_y;Sr.unstable_ImmediatePriority=1;Sr.unstable_UserBlockingPriority=2;Sr.unstable_NormalPriority=3;Sr.unstable_IdlePriority=5;Sr.unstable_LowPriority=4;Sr.unstable_runWithPriority=function(i,u){switch(i){case 1:case 2:case 3:case 4:case 5:break;default:i=3}var f=to;to=i;try{return u()}finally{to=f}};Sr.unstable_next=function(i){switch(to){case 1:case 2:case 3:var u=3;break;default:u=to}var f=to;to=u;try{return i()}finally{to=f}};Sr.unstable_scheduleCallback=function(i,u,f){var c=Sr.unstable_now();if(typeof f=="object"&&f!==null){var g=f.delay;g=typeof g=="number"&&0c?(i.sortIndex=g,Ty(Nf,i),Iu(ds)===null&&i===Iu(Nf)&&(f2?Eh():f2=!0,u2(xy,g-c))):(i.sortIndex=f,Ty(ds,i),pc||Oh||(pc=!0,Ea(ky))),i};Sr.unstable_cancelCallback=function(i){i.callback=null};Sr.unstable_wrapCallback=function(i){var u=to;return function(){var f=to;to=u;try{return i.apply(this,arguments)}finally{to=f}}};Sr.unstable_getCurrentPriorityLevel=function(){return to};Sr.unstable_shouldYield=function(){var i=Sr.unstable_now();Ih(i);var u=Iu(ds);return u!==_o&&_o!==null&&u!==null&&u.callback!==null&&u.startTime<=i&&u.expirationTime<_o.expirationTime||Sh()};Sr.unstable_requestPaint=vN;Sr.unstable_continueExecution=function(){pc||Oh||(pc=!0,Ea(ky))};Sr.unstable_pauseExecution=function(){};Sr.unstable_getFirstCallbackNode=function(){return Iu(ds)};Sr.unstable_Profiling=null});var Ay=Me((fb,oE)=>{"use strict";oE.exports=iE()});var uE=Me((cb,c2)=>{c2.exports=function i(u){"use strict";var f=ey(),c=lr(),g=Ay();function t(v){for(var m="https://reactjs.org/docs/error-decoder.html?invariant="+v,S=1;Sqo||(v.current=qi[qo],qi[qo]=null,qo--)}function Fr(v,m){qo++,qi[qo]=v.current,v.current=m}var si={},H0={current:si},b0={current:!1},Bt=si;function Lu(v,m){var S=v.type.contextTypes;if(!S)return si;var O=v.stateNode;if(O&&O.__reactInternalMemoizedUnmaskedChildContext===m)return O.__reactInternalMemoizedMaskedChildContext;var M={},b;for(b in S)M[b]=m[b];return O&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=m,v.__reactInternalMemoizedMaskedChildContext=M),M}function c0(v){return v=v.childContextTypes,v!=null}function Ru(v){kr(b0,v),kr(H0,v)}function ks(v){kr(b0,v),kr(H0,v)}function As(v,m,S){if(H0.current!==si)throw Error(t(168));Fr(H0,m,v),Fr(b0,S,v)}function uu(v,m,S){var O=v.stateNode;if(v=m.childContextTypes,typeof O.getChildContext!="function")return S;O=O.getChildContext();for(var M in O)if(!(M in v))throw Error(t(108,Oe(m)||"Unknown",M));return f({},S,{},O)}function wo(v){var m=v.stateNode;return m=m&&m.__reactInternalMemoizedMergedChildContext||si,Bt=H0.current,Fr(H0,m,v),Fr(b0,b0.current,v),!0}function zo(v,m,S){var O=v.stateNode;if(!O)throw Error(t(169));S?(m=uu(v,m,Bt),O.__reactInternalMemoizedMergedChildContext=m,kr(b0,v),kr(H0,v),Fr(H0,m,v)):kr(b0,v),Fr(b0,S,v)}var Os=g.unstable_runWithPriority,Is=g.unstable_scheduleCallback,uf=g.unstable_cancelCallback,_n=g.unstable_shouldYield,Nu=g.unstable_requestPaint,Wo=g.unstable_now,su=g.unstable_getCurrentPriorityLevel,Ps=g.unstable_ImmediatePriority,pl=g.unstable_UserBlockingPriority,Vf=g.unstable_NormalPriority,hl=g.unstable_LowPriority,Bu=g.unstable_IdlePriority,ju={},sf=Nu!==void 0?Nu:function(){},ro=null,Ms=null,ml=!1,Uu=Wo(),G0=1e4>Uu?Wo:function(){return Wo()-Uu};function Fs(){switch(su()){case Ps:return 99;case pl:return 98;case Vf:return 97;case hl:return 96;case Bu:return 95;default:throw Error(t(332))}}function tt(v){switch(v){case 99:return Ps;case 98:return pl;case 97:return Vf;case 96:return hl;case 95:return Bu;default:throw Error(t(332))}}function zi(v,m){return v=tt(v),Os(v,m)}function lu(v,m,S){return v=tt(v),Is(v,m,S)}function Ho(v){return ro===null?(ro=[v],Ms=Is(Ps,vl)):ro.push(v),ju}function O0(){if(Ms!==null){var v=Ms;Ms=null,uf(v)}vl()}function vl(){if(!ml&&ro!==null){ml=!0;var v=0;try{var m=ro;zi(99,function(){for(;v=m&&(ai=!0),v.firstContext=null)}function D0(v,m){if(zu!==v&&m!==!1&&m!==0)if((typeof m!="number"||m===1073741823)&&(zu=v,m=1073741823),m={context:v,observedBits:m,next:null},Wi===null){if(qu===null)throw Error(t(308));Wi=m,qu.dependencies={expirationTime:0,firstContext:m,responders:null}}else Wi=Wi.next=m;return Jt?v._currentValue:v._currentValue2}var Do=!1;function i0(v){return{baseState:v,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Rs(v){return{baseState:v.baseState,firstUpdate:v.firstUpdate,lastUpdate:v.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function a0(v,m){return{expirationTime:v,suspenseConfig:m,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function Hu(v,m){v.lastUpdate===null?v.firstUpdate=v.lastUpdate=m:(v.lastUpdate.next=m,v.lastUpdate=m)}function V0(v,m){var S=v.alternate;if(S===null){var O=v.updateQueue,M=null;O===null&&(O=v.updateQueue=i0(v.memoizedState))}else O=v.updateQueue,M=S.updateQueue,O===null?M===null?(O=v.updateQueue=i0(v.memoizedState),M=S.updateQueue=i0(S.memoizedState)):O=v.updateQueue=Rs(M):M===null&&(M=S.updateQueue=Rs(O));M===null||O===M?Hu(O,m):O.lastUpdate===null||M.lastUpdate===null?(Hu(O,m),Hu(M,m)):(Hu(O,m),M.lastUpdate=m)}function bu(v,m){var S=v.updateQueue;S=S===null?v.updateQueue=i0(v.memoizedState):Ns(v,S),S.lastCapturedUpdate===null?S.firstCapturedUpdate=S.lastCapturedUpdate=m:(S.lastCapturedUpdate.next=m,S.lastCapturedUpdate=m)}function Ns(v,m){var S=v.alternate;return S!==null&&m===S.updateQueue&&(m=v.updateQueue=Rs(m)),m}function bo(v,m,S,O,M,b){switch(S.tag){case 1:return v=S.payload,typeof v=="function"?v.call(b,O,M):v;case 3:v.effectTag=v.effectTag&-4097|64;case 0:if(v=S.payload,M=typeof v=="function"?v.call(b,O,M):v,M==null)break;return f({},O,M);case 2:Do=!0}return O}function P0(v,m,S,O,M){Do=!1,m=Ns(v,m);for(var b=m.baseState,ee=null,Ye=0,Ze=m.firstUpdate,ut=b;Ze!==null;){var In=Ze.expirationTime;Inpr?(Hr=mn,mn=null):Hr=mn.sibling;var Vn=jr(Re,mn,ze[pr],Et);if(Vn===null){mn===null&&(mn=Hr);break}v&&mn&&Vn.alternate===null&&m(Re,mn),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn,mn=Hr}if(pr===ze.length)return S(Re,mn),on;if(mn===null){for(;prpr?(Hr=mn,mn=null):Hr=mn.sibling;var ni=jr(Re,mn,Vn.value,Et);if(ni===null){mn===null&&(mn=Hr);break}v&&mn&&ni.alternate===null&&m(Re,mn),Ce=b(ni,Ce,pr),sr===null?on=ni:sr.sibling=ni,sr=ni,mn=Hr}if(Vn.done)return S(Re,mn),on;if(mn===null){for(;!Vn.done;pr++,Vn=ze.next())Vn=A0(Re,Vn.value,Et),Vn!==null&&(Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return on}for(mn=O(Re,mn);!Vn.done;pr++,Vn=ze.next())Vn=gi(mn,Re,pr,Vn.value,Et),Vn!==null&&(v&&Vn.alternate!==null&&mn.delete(Vn.key===null?pr:Vn.key),Ce=b(Vn,Ce,pr),sr===null?on=Vn:sr.sibling=Vn,sr=Vn);return v&&mn.forEach(function(Zf){return m(Re,Zf)}),on}return function(Re,Ce,ze,Et){var on=typeof ze=="object"&&ze!==null&&ze.type===L&&ze.key===null;on&&(ze=ze.props.children);var sr=typeof ze=="object"&&ze!==null;if(sr)switch(ze.$$typeof){case x:e:{for(sr=ze.key,on=Ce;on!==null;){if(on.key===sr)if(on.tag===7?ze.type===L:on.elementType===ze.type){S(Re,on.sibling),Ce=M(on,ze.type===L?ze.props.children:ze.props,Et),Ce.ref=au(Re,on,ze),Ce.return=Re,Re=Ce;break e}else{S(Re,on);break}else m(Re,on);on=on.sibling}ze.type===L?(Ce=mi(ze.props.children,Re.mode,Et,ze.key),Ce.return=Re,Re=Ce):(Et=Hs(ze.type,ze.key,ze.props,null,Re.mode,Et),Et.ref=au(Re,Ce,ze),Et.return=Re,Re=Et)}return ee(Re);case D:e:{for(on=ze.key;Ce!==null;){if(Ce.key===on)if(Ce.tag===4&&Ce.stateNode.containerInfo===ze.containerInfo&&Ce.stateNode.implementation===ze.implementation){S(Re,Ce.sibling),Ce=M(Ce,ze.children||[],Et),Ce.return=Re,Re=Ce;break e}else{S(Re,Ce);break}else m(Re,Ce);Ce=Ce.sibling}Ce=Xf(ze,Re.mode,Et),Ce.return=Re,Re=Ce}return ee(Re)}if(typeof ze=="string"||typeof ze=="number")return ze=""+ze,Ce!==null&&Ce.tag===6?(S(Re,Ce.sibling),Ce=M(Ce,ze,Et),Ce.return=Re,Re=Ce):(S(Re,Ce),Ce=vi(ze,Re.mode,Et),Ce.return=Re,Re=Ce),ee(Re);if(M0(ze))return po(Re,Ce,ze,Et);if(J(ze))return _i(Re,Ce,ze,Et);if(sr&&Lr(Re,ze),typeof ze=="undefined"&&!on)switch(Re.tag){case 1:case 0:throw Re=Re.type,Error(t(152,Re.displayName||Re.name||"Component"))}return S(Re,Ce)}}var R=F(!0),U=F(!1),H={},fe={current:H},ue={current:H},de={current:H};function W(v){if(v===H)throw Error(t(174));return v}function ve(v,m){Fr(de,m,v),Fr(ue,v,v),Fr(fe,H,v),m=Ot(m),kr(fe,v),Fr(fe,m,v)}function Fe(v){kr(fe,v),kr(ue,v),kr(de,v)}function Ge(v){var m=W(de.current),S=W(fe.current);m=Nt(S,v.type,m),S!==m&&(Fr(ue,v,v),Fr(fe,m,v))}function K(v){ue.current===v&&(kr(fe,v),kr(ue,v))}var xe={current:0};function je(v){for(var m=v;m!==null;){if(m.tag===13){var S=m.memoizedState;if(S!==null&&(S=S.dehydrated,S===null||ll(S)||fl(S)))return m}else if(m.tag===19&&m.memoizedProps.revealOrder!==void 0){if((m.effectTag&64)!=0)return m}else if(m.child!==null){m.child.return=m,m=m.child;continue}if(m===v)break;for(;m.sibling===null;){if(m.return===null||m.return===v)return null;m=m.return}m.sibling.return=m.return,m=m.sibling}return null}function Xe(v,m){return{responder:v,props:m}}var rt=C.ReactCurrentDispatcher,st=C.ReactCurrentBatchConfig,xt=0,wt=null,lt=null,Rt=null,yn=null,sn=null,ar=null,rn=0,Hn=null,d0=0,Cr=!1,He=null,Qe=0;function Ne(){throw Error(t(321))}function ft(v,m){if(m===null)return!1;for(var S=0;Srn&&(rn=In,pf(rn))):(Yf(In,Ze.suspenseConfig),b=Ze.eagerReducer===v?Ze.eagerState:v(b,Ze.action)),ee=Ze,Ze=Ze.next}while(Ze!==null&&Ze!==O);ut||(Ye=ee,M=b),Sn(b,m.memoizedState)||(ai=!0),m.memoizedState=b,m.baseUpdate=Ye,m.baseState=M,S.lastRenderedState=b}return[m.memoizedState,S.dispatch]}function ci(v){var m=Cn();return typeof v=="function"&&(v=v()),m.memoizedState=m.baseState=v,v=m.queue={last:null,dispatch:null,lastRenderedReducer:p0,lastRenderedState:v},v=v.dispatch=Us.bind(null,wt,v),[m.memoizedState,v]}function xi(v){return h0(p0,v)}function E0(v,m,S,O){return v={tag:v,create:m,destroy:S,deps:O,next:null},Hn===null?(Hn={lastEffect:null},Hn.lastEffect=v.next=v):(m=Hn.lastEffect,m===null?Hn.lastEffect=v.next=v:(S=m.next,m.next=v,v.next=S,Hn.lastEffect=v)),v}function qr(v,m,S,O){var M=Cn();d0|=v,M.memoizedState=E0(m,S,void 0,O===void 0?null:O)}function Eo(v,m,S,O){var M=bn();O=O===void 0?null:O;var b=void 0;if(lt!==null){var ee=lt.memoizedState;if(b=ee.destroy,O!==null&&ft(O,ee.deps)){E0(0,S,b,O);return}}d0|=v,M.memoizedState=E0(m,S,b,O)}function So(v,m){return qr(516,192,v,m)}function wl(v,m){return Eo(516,192,v,m)}function js(v,m){if(typeof m=="function")return v=v(),m(v),function(){m(null)};if(m!=null)return v=v(),m.current=v,function(){m.current=null}}function Dl(){}function du(v,m){return Cn().memoizedState=[v,m===void 0?null:m],v}function Yu(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(S.memoizedState=[v,m],v)}function Us(v,m,S){if(!(25>Qe))throw Error(t(301));var O=v.alternate;if(v===wt||O!==null&&O===wt)if(Cr=!0,v={expirationTime:xt,suspenseConfig:null,action:S,eagerReducer:null,eagerState:null,next:null},He===null&&(He=new Map),S=He.get(m),S===void 0)He.set(m,v);else{for(m=S;m.next!==null;)m=m.next;m.next=v}else{var M=g0(),b=nr.suspense;M=Kr(M,v,b),b={expirationTime:M,suspenseConfig:b,action:S,eagerReducer:null,eagerState:null,next:null};var ee=m.last;if(ee===null)b.next=b;else{var Ye=ee.next;Ye!==null&&(b.next=Ye),ee.next=b}if(m.last=b,v.expirationTime===0&&(O===null||O.expirationTime===0)&&(O=m.lastRenderedReducer,O!==null))try{var Ze=m.lastRenderedState,ut=O(Ze,S);if(b.eagerReducer=O,b.eagerState=ut,Sn(ut,Ze))return}catch(In){}finally{}_0(v,M)}}var oo={readContext:D0,useCallback:Ne,useContext:Ne,useEffect:Ne,useImperativeHandle:Ne,useLayoutEffect:Ne,useMemo:Ne,useReducer:Ne,useRef:Ne,useState:Ne,useDebugValue:Ne,useResponder:Ne,useDeferredValue:Ne,useTransition:Ne},Hi={readContext:D0,useCallback:du,useContext:D0,useEffect:So,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,qr(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return qr(4,36,v,m)},useMemo:function(v,m){var S=Cn();return m=m===void 0?null:m,v=v(),S.memoizedState=[v,m],v},useReducer:function(v,m,S){var O=Cn();return m=S!==void 0?S(m):m,O.memoizedState=O.baseState=m,v=O.queue={last:null,dispatch:null,lastRenderedReducer:v,lastRenderedState:m},v=v.dispatch=Us.bind(null,wt,v),[O.memoizedState,v]},useRef:function(v){var m=Cn();return v={current:v},m.memoizedState=v},useState:ci,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=ci(v),O=S[0],M=S[1];return So(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=ci(!1),S=m[0],O=m[1];return[du(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},qs={readContext:D0,useCallback:Yu,useContext:D0,useEffect:wl,useImperativeHandle:function(v,m,S){return S=S!=null?S.concat([v]):null,Eo(4,36,js.bind(null,m,v),S)},useLayoutEffect:function(v,m){return Eo(4,36,v,m)},useMemo:function(v,m){var S=bn();m=m===void 0?null:m;var O=S.memoizedState;return O!==null&&m!==null&&ft(m,O[1])?O[0]:(v=v(),S.memoizedState=[v,m],v)},useReducer:h0,useRef:function(){return bn().memoizedState},useState:xi,useDebugValue:Dl,useResponder:Xe,useDeferredValue:function(v,m){var S=xi(v),O=S[0],M=S[1];return wl(function(){g.unstable_next(function(){var b=st.suspense;st.suspense=m===void 0?null:m;try{M(v)}finally{st.suspense=b}})},[v,m]),O},useTransition:function(v){var m=xi(!1),S=m[0],O=m[1];return[Yu(function(M){O(!0),g.unstable_next(function(){var b=st.suspense;st.suspense=v===void 0?null:v;try{O(!1),M()}finally{st.suspense=b}})},[v,S]),S]}},F0=null,Gr=null,ir=!1;function L0(v,m){var S=xo(5,null,null,0);S.elementType="DELETED",S.type="DELETED",S.stateNode=m,S.return=v,S.effectTag=8,v.lastEffect!==null?(v.lastEffect.nextEffect=S,v.lastEffect=S):v.firstEffect=v.lastEffect=S}function Y0(v,m){switch(v.tag){case 5:return m=Ti(m,v.type,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 6:return m=Fu(m,v.pendingProps),m!==null?(v.stateNode=m,!0):!1;case 13:return!1;default:return!1}}function Co(v){if(ir){var m=Gr;if(m){var S=m;if(!Y0(v,m)){if(m=cl(S),!m||!Y0(v,m)){v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v;return}L0(F0,S)}F0=v,Gr=al(m)}else v.effectTag=v.effectTag&-1025|2,ir=!1,F0=v}}function $u(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;F0=v}function Vo(v){if(!w||v!==F0)return!1;if(!ir)return $u(v),ir=!0,!1;var m=v.type;if(v.tag!==5||m!=="head"&&m!=="body"&&!at(m,v.memoizedProps))for(m=Gr;m;)L0(v,m),m=cl(m);if($u(v),v.tag===13){if(!w)throw Error(t(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(t(317));Gr=Ac(v)}else Gr=F0?cl(v.stateNode):null;return!0}function Rr(){w&&(Gr=F0=null,ir=!1)}var Jn=C.ReactCurrentOwner,ai=!1;function o0(v,m,S,O){m.child=v===null?U(m,null,S,O):R(m,v.child,S,O)}function Vr(v,m,S,O,M){S=S.render;var b=m.ref;return io(m,M),O=St(v,m,S,O,b,M),v!==null&&!ai?(m.updateQueue=v.updateQueue,m.effectTag&=-517,v.expirationTime<=M&&(v.expirationTime=0),X0(v,m,M)):(m.effectTag|=1,o0(v,m,O,M),m.child)}function ff(v,m,S,O,M,b){if(v===null){var ee=S.type;return typeof ee=="function"&&!mf(ee)&&ee.defaultProps===void 0&&S.compare===null&&S.defaultProps===void 0?(m.tag=15,m.type=ee,cf(v,m,ee,O,M,b)):(v=Hs(S.type,null,O,null,m.mode,b),v.ref=m.ref,v.return=m,m.child=v)}return ee=v.child,Mm)&&Qn.set(v,m)))}}function Gi(v,m){v.expirationTimev?m:v)}function x0(v){if(v.lastExpiredTime!==0)v.callbackExpirationTime=1073741823,v.callbackPriority=99,v.callbackNode=Ho(Z0.bind(null,v));else{var m=fo(v),S=v.callbackNode;if(m===0)S!==null&&(v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90);else{var O=g0();if(m===1073741823?O=99:m===1||m===2?O=95:(O=10*(1073741821-m)-10*(1073741821-O),O=0>=O?99:250>=O?98:5250>=O?97:95),S!==null){var M=v.callbackPriority;if(v.callbackExpirationTime===m&&M>=O)return;S!==ju&&uf(S)}v.callbackExpirationTime=m,v.callbackPriority=O,m=m===1073741823?Ho(Z0.bind(null,v)):lu(O,Xu.bind(null,v),{timeout:10*(1073741821-m)-G0()}),v.callbackNode=m}}}function Xu(v,m){if(t0=0,m)return m=g0(),kl(v,m),x0(v),null;var S=fo(v);if(S!==0){if(m=v.callbackNode,(Kt&(Br|zr))!==Fn)throw Error(t(327));if(Ws(),v===X&&S===ye||mu(v,S),Y!==null){var O=Kt;Kt|=Br;var M=ei(v);do try{Ua();break}catch(Ye){Ju(v,Ye)}while(1);if(Wu(),Kt=O,B0.current=M,he===wr)throw m=We,mu(v,S),ao(v,S),x0(v),m;if(Y===null)switch(M=v.finishedWork=v.current.alternate,v.finishedExpirationTime=S,O=he,X=null,O){case lo:case wr:throw Error(t(345));case kn:kl(v,2=S){v.lastPingedTime=S,mu(v,S);break}}if(b=fo(v),b!==0&&b!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}v.timeoutHandle=jt(gu.bind(null,v),M);break}gu(v);break;case hi:if(ao(v,S),O=v.lastSuspendedTime,S===O&&(v.nextKnownPendingLevel=$f(M)),qt&&(M=v.lastPingedTime,M===0||M>=S)){v.lastPingedTime=S,mu(v,S);break}if(M=fo(v),M!==0&&M!==S)break;if(O!==0&&O!==S){v.lastPingedTime=O;break}if(Dt!==1073741823?O=10*(1073741821-Dt)-G0():et===1073741823?O=0:(O=10*(1073741821-et)-5e3,M=G0(),S=10*(1073741821-S)-M,O=M-O,0>O&&(O=0),O=(120>O?120:480>O?480:1080>O?1080:1920>O?1920:3e3>O?3e3:4320>O?4320:1960*Cl(O/1960))-O,S=O?O=0:(M=ee.busyDelayMs|0,b=G0()-(10*(1073741821-b)-(ee.timeoutMs|0||5e3)),O=b<=M?0:M+O-b),10 component higher in the tree to provide a loading indicator or placeholder to display.`+dl(M))}he!==Ai&&(he=kn),b=zs(b,M),Ze=O;do{switch(Ze.tag){case 3:ee=b,Ze.effectTag|=4096,Ze.expirationTime=m;var Ce=pu(Ze,ee,m);bu(Ze,Ce);break e;case 1:ee=b;var ze=Ze.type,Et=Ze.stateNode;if((Ze.effectTag&64)==0&&(typeof ze.getDerivedStateFromError=="function"||Et!==null&&typeof Et.componentDidCatch=="function"&&(Ar===null||!Ar.has(Et)))){Ze.effectTag|=4096,Ze.expirationTime=m;var on=Sl(Ze,ee,m);bu(Ze,on);break e}}Ze=Ze.return}while(Ze!==null)}Y=vu(Y)}catch(sr){m=sr;continue}break}while(1)}function ei(){var v=B0.current;return B0.current=oo,v===null?oo:v}function Yf(v,m){vZt&&(Zt=v)}function ja(){for(;Y!==null;)Y=Ic(Y)}function Ua(){for(;Y!==null&&!_n();)Y=Ic(Y)}function Ic(v){var m=Lc(v.alternate,v,ye);return v.memoizedProps=v.pendingProps,m===null&&(m=vu(v)),hu.current=null,m}function vu(v){Y=v;do{var m=Y.alternate;if(v=Y.return,(Y.effectTag&2048)==0){e:{var S=m;m=Y;var O=ye,M=m.pendingProps;switch(m.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:c0(m.type)&&Ru(m);break;case 3:Fe(m),ks(m),M=m.stateNode,M.pendingContext&&(M.context=M.pendingContext,M.pendingContext=null),(S===null||S.child===null)&&Vo(m)&&ki(m),$r(m);break;case 5:K(m);var b=W(de.current);if(O=m.type,S!==null&&m.stateNode!=null)m0(S,m,O,M,b),S.ref!==m.ref&&(m.effectTag|=128);else if(M){if(S=W(fe.current),Vo(m)){if(M=m,!w)throw Error(t(175));S=Ui(M.stateNode,M.type,M.memoizedProps,b,S,M),M.updateQueue=S,S=S!==null,S&&ki(m)}else{var ee=ne(O,M,b,S,m);Yr(ee,m,!1,!1),m.stateNode=ee,Z(ee,O,M,b,S)&&ki(m)}m.ref!==null&&(m.effectTag|=128)}else if(m.stateNode===null)throw Error(t(166));break;case 6:if(S&&m.stateNode!=null)Tn(S,m,S.memoizedProps,M);else{if(typeof M!="string"&&m.stateNode===null)throw Error(t(166));if(S=W(de.current),b=W(fe.current),Vo(m)){if(S=m,!w)throw Error(t(176));(S=Mr(S.stateNode,S.memoizedProps,S))&&ki(m)}else m.stateNode=Ft(M,S,b,m)}break;case 11:break;case 13:if(kr(xe,m),M=m.memoizedState,(m.effectTag&64)!=0){m.expirationTime=O;break e}M=M!==null,b=!1,S===null?m.memoizedProps.fallback!==void 0&&Vo(m):(O=S.memoizedState,b=O!==null,M||O===null||(O=S.child.sibling,O!==null&&(ee=m.firstEffect,ee!==null?(m.firstEffect=O,O.nextEffect=ee):(m.firstEffect=m.lastEffect=O,O.nextEffect=null),O.effectTag=8))),M&&!b&&(m.mode&2)!=0&&(S===null&&m.memoizedProps.unstable_avoidThisFallback!==!0||(xe.current&1)!=0?he===lo&&(he=T0):((he===lo||he===T0)&&(he=hi),Zt!==0&&X!==null&&(ao(X,ye),$o(X,Zt)))),cr&&M&&(m.effectTag|=4),Yt&&(M||b)&&(m.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Fe(m),$r(m);break;case 10:fi(m);break;case 9:break;case 14:break;case 17:c0(m.type)&&Ru(m);break;case 19:if(kr(xe,m),M=m.memoizedState,M===null)break;if(b=(m.effectTag&64)!=0,ee=M.rendering,ee===null){if(b)bi(M,!1);else if(he!==lo||S!==null&&(S.effectTag&64)!=0)for(S=m.child;S!==null;){if(ee=je(S),ee!==null){for(m.effectTag|=64,bi(M,!1),S=ee.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),M.lastEffect===null&&(m.firstEffect=null),m.lastEffect=M.lastEffect,S=O,M=m.child;M!==null;)b=M,O=S,b.effectTag&=2,b.nextEffect=null,b.firstEffect=null,b.lastEffect=null,ee=b.alternate,ee===null?(b.childExpirationTime=0,b.expirationTime=O,b.child=null,b.memoizedProps=null,b.memoizedState=null,b.updateQueue=null,b.dependencies=null):(b.childExpirationTime=ee.childExpirationTime,b.expirationTime=ee.expirationTime,b.child=ee.child,b.memoizedProps=ee.memoizedProps,b.memoizedState=ee.memoizedState,b.updateQueue=ee.updateQueue,O=ee.dependencies,b.dependencies=O===null?null:{expirationTime:O.expirationTime,firstContext:O.firstContext,responders:O.responders}),M=M.sibling;Fr(xe,xe.current&1|2,m),m=m.child;break e}S=S.sibling}}else{if(!b)if(S=je(ee),S!==null){if(m.effectTag|=64,b=!0,S=S.updateQueue,S!==null&&(m.updateQueue=S,m.effectTag|=4),bi(M,!0),M.tail===null&&M.tailMode==="hidden"&&!ee.alternate){m=m.lastEffect=M.lastEffect,m!==null&&(m.nextEffect=null);break}}else G0()>M.tailExpiration&&1M&&(M=O),ee>M&&(M=ee),b=b.sibling;S.childExpirationTime=M}if(m!==null)return m;v!==null&&(v.effectTag&2048)==0&&(v.firstEffect===null&&(v.firstEffect=Y.firstEffect),Y.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=Y.firstEffect),v.lastEffect=Y.lastEffect),1v?m:v}function gu(v){var m=Fs();return zi(99,co.bind(null,v,m)),null}function co(v,m){do Ws();while(dr!==null);if((Kt&(Br|zr))!==Fn)throw Error(t(327));var S=v.finishedWork,O=v.finishedExpirationTime;if(S===null)return null;if(v.finishedWork=null,v.finishedExpirationTime=0,S===v.current)throw Error(t(177));v.callbackNode=null,v.callbackExpirationTime=0,v.callbackPriority=90,v.nextKnownPendingLevel=0;var M=$f(S);if(v.firstPendingTime=M,O<=v.lastSuspendedTime?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:O<=v.firstSuspendedTime&&(v.firstSuspendedTime=O-1),O<=v.lastPingedTime&&(v.lastPingedTime=0),O<=v.lastExpiredTime&&(v.lastExpiredTime=0),v===X&&(Y=X=null,ye=0),1=S?mt(v,m,S):(Fr(xe,xe.current&1,m),m=X0(v,m,S),m!==null?m.sibling:null);Fr(xe,xe.current&1,m);break;case 19:if(O=m.childExpirationTime>=S,(v.effectTag&64)!=0){if(O)return $t(v,m,S);m.effectTag|=64}if(M=m.memoizedState,M!==null&&(M.rendering=null,M.tail=null),Fr(xe,xe.current,m),!O)return null}return X0(v,m,S)}ai=!1}}else ai=!1;switch(m.expirationTime=0,m.tag){case 2:if(O=m.type,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,M=Lu(m,H0.current),io(m,S),M=St(null,m,O,v,M,S),m.effectTag|=1,typeof M=="object"&&M!==null&&typeof M.render=="function"&&M.$$typeof===void 0){if(m.tag=1,Qt(),c0(O)){var b=!0;wo(m)}else b=!1;m.memoizedState=M.state!==null&&M.state!==void 0?M.state:null;var ee=O.getDerivedStateFromProps;typeof ee=="function"&&Go(m,O,ee,v),M.updater=Gu,m.stateNode=M,M._reactInternalFiber=m,Vu(m,O,v,S),m=Be(null,m,O,!0,b,S)}else m.tag=0,o0(null,m,M,S),m=m.child;return m;case 16:if(M=m.elementType,v!==null&&(v.alternate=null,m.alternate=null,m.effectTag|=2),v=m.pendingProps,Te(M),M._status!==1)throw M._result;switch(M=M._result,m.type=M,b=m.tag=Wa(M),v=I0(M,v),b){case 0:m=K0(null,m,M,v,S);break;case 1:m=ae(null,m,M,v,S);break;case 11:m=Vr(null,m,M,v,S);break;case 14:m=ff(null,m,M,I0(M.type,v),O,S);break;default:throw Error(t(306,M,""))}return m;case 0:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),K0(v,m,O,M,S);case 1:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),ae(v,m,O,M,S);case 3:if(Ie(m),O=m.updateQueue,O===null)throw Error(t(282));if(M=m.memoizedState,M=M!==null?M.element:null,P0(m,O,m.pendingProps,null,S),O=m.memoizedState.element,O===M)Rr(),m=X0(v,m,S);else{if((M=m.stateNode.hydrate)&&(w?(Gr=al(m.stateNode.containerInfo),F0=m,M=ir=!0):M=!1),M)for(S=U(m,null,O,S),m.child=S;S;)S.effectTag=S.effectTag&-3|1024,S=S.sibling;else o0(v,m,O,S),Rr();m=m.child}return m;case 5:return Ge(m),v===null&&Co(m),O=m.type,M=m.pendingProps,b=v!==null?v.memoizedProps:null,ee=M.children,at(O,M)?ee=null:b!==null&&at(O,b)&&(m.effectTag|=16),$0(v,m),m.mode&4&&S!==1&&it(O,M)?(m.expirationTime=m.childExpirationTime=1,m=null):(o0(v,m,ee,S),m=m.child),m;case 6:return v===null&&Co(m),null;case 13:return mt(v,m,S);case 4:return ve(m,m.stateNode.containerInfo),O=m.pendingProps,v===null?m.child=R(m,null,O,S):o0(v,m,O,S),m.child;case 11:return O=m.type,M=m.pendingProps,M=m.elementType===O?M:I0(O,M),Vr(v,m,O,M,S);case 7:return o0(v,m,m.pendingProps,S),m.child;case 8:return o0(v,m,m.pendingProps.children,S),m.child;case 12:return o0(v,m,m.pendingProps.children,S),m.child;case 10:e:{if(O=m.type._context,M=m.pendingProps,ee=m.memoizedProps,b=M.value,Ls(m,b),ee!==null){var Ye=ee.value;if(b=Sn(Ye,b)?0:(typeof O._calculateChangedBits=="function"?O._calculateChangedBits(Ye,b):1073741823)|0,b===0){if(ee.children===M.children&&!b0.current){m=X0(v,m,S);break e}}else for(Ye=m.child,Ye!==null&&(Ye.return=m);Ye!==null;){var Ze=Ye.dependencies;if(Ze!==null){ee=Ye.child;for(var ut=Ze.firstContext;ut!==null;){if(ut.context===O&&(ut.observedBits&b)!=0){Ye.tag===1&&(ut=a0(S,null),ut.tag=2,V0(Ye,ut)),Ye.expirationTime=m&&v<=m}function ao(v,m){var S=v.firstSuspendedTime,O=v.lastSuspendedTime;Sm||S===0)&&(v.lastSuspendedTime=m),m<=v.lastPingedTime&&(v.lastPingedTime=0),m<=v.lastExpiredTime&&(v.lastExpiredTime=0)}function $o(v,m){m>v.firstPendingTime&&(v.firstPendingTime=m);var S=v.firstSuspendedTime;S!==0&&(m>=S?v.firstSuspendedTime=v.lastSuspendedTime=v.nextKnownPendingLevel=0:m>=v.lastSuspendedTime&&(v.lastSuspendedTime=m+1),m>v.nextKnownPendingLevel&&(v.nextKnownPendingLevel=m))}function kl(v,m){var S=v.lastExpiredTime;(S===0||S>m)&&(v.lastExpiredTime=m)}function Nc(v){var m=v._reactInternalFiber;if(m===void 0)throw typeof v.render=="function"?Error(t(188)):Error(t(268,Object.keys(v)));return v=Ue(m),v===null?null:v.stateNode}function Al(v,m){v=v.memoizedState,v!==null&&v.dehydrated!==null&&v.retryTime{"use strict";sE.exports=uE()});var cE=Me((db,fE)=>{"use strict";var gN={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};fE.exports=gN});var hE=Me((pb,aE)=>{"use strict";var _N=Object.assign||function(i){for(var u=1;u"}}]),i}(),dE=function(){Ph(i,null,[{key:"fromJS",value:function(f){var c=f.width,g=f.height;return new i(c,g)}}]);function i(u,f){Iy(this,i),this.width=u,this.height=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.width,this.height)}},{key:"toString",value:function(){return""}}]),i}(),pE=function(){function i(u,f){Iy(this,i),this.unit=u,this.value=f}return Ph(i,[{key:"fromJS",value:function(f){f(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case ps.UNIT_POINT:return String(this.value);case ps.UNIT_PERCENT:return this.value+"%";case ps.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),i}();aE.exports=function(i,u){function f(C,A,x){var D=C[A];C[A]=function(){for(var L=arguments.length,N=Array(L),j=0;j1?N-1:0),$=1;$1&&arguments[1]!==void 0?arguments[1]:NaN,x=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,D=arguments.length>3&&arguments[3]!==void 0?arguments[3]:ps.DIRECTION_LTR;return C.call(this,A,x,D)}),_N({Config:u.Config,Node:u.Node,Layout:i("Layout",yN),Size:i("Size",dE),Value:i("Value",pE),getInstanceCount:function(){return u.getInstanceCount.apply(u,arguments)}},ps)}});var mE=Me((exports,module)=>{(function(i,u){typeof define=="function"&&define.amd?define([],function(){return u}):typeof module=="object"&&module.exports?module.exports=u:(i.nbind=i.nbind||{}).init=u})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(i,u){return function(){i&&i.apply(this,arguments);try{Module.ccall("nbind_init")}catch(f){u(f);return}u(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module!="undefined"?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;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof require=="function"&&!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);var nodeFS,nodePath;Module.read=function(u,f){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),u=nodePath.normalize(u);var c=nodeFS.readFileSync(u);return f?c:c.toString()},Module.readBinary=function(u){var f=Module.read(u,!0);return f.buffer||(f=new Uint8Array(f)),assert(f.buffer),f},Module.load=function(u){globalEval(read(u))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module!="undefined"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr!="undefined"&&(Module.printErr=printErr),typeof read!="undefined"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(u){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(u));var f=read(u,"binary");return assert(typeof f=="object"),f},typeof scriptArgs!="undefined"?Module.arguments=scriptArgs:typeof arguments!="undefined"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(i,u){quit(i)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.send(null),f.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(u){var f=new XMLHttpRequest;return f.open("GET",u,!1),f.responseType="arraybuffer",f.send(null),new Uint8Array(f.response)}),Module.readAsync=function(u,f,c){var g=new XMLHttpRequest;g.open("GET",u,!0),g.responseType="arraybuffer",g.onload=function(){g.status==200||g.status==0&&g.response?f(g.response):c()},g.onerror=c,g.send(null)},typeof arguments!="undefined"&&(Module.arguments=arguments),typeof console!="undefined")Module.print||(Module.print=function(u){console.log(u)}),Module.printErr||(Module.printErr=function(u){console.warn(u)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump!="undefined"?function(i){dump(i)}:function(i){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle=="undefined"&&(Module.setWindowTitle=function(i){document.title=i})}else throw"Unknown runtime environment. Where are we?";function globalEval(i){eval.call(null,i)}!Module.load&&Module.read&&(Module.load=function(u){globalEval(Module.read(u))}),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(i,u){throw u}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(i){return tempRet0=i,i},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(i){STACKTOP=i},getNativeTypeSize:function(i){switch(i){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(i[i.length-1]==="*")return Runtime.QUANTUM_SIZE;if(i[0]==="i"){var u=parseInt(i.substr(1));return assert(u%8==0),u/8}else return 0}}},getNativeFieldSize:function(i){return Math.max(Runtime.getNativeTypeSize(i),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(i,u){return u==="double"||u==="i64"?i&7&&(assert((i&7)==4),i+=4):assert((i&3)==0),i},getAlignSize:function(i,u,f){return!f&&(i=="i64"||i=="double")?8:i?Math.min(u||(i?Runtime.getNativeFieldSize(i):0),Runtime.QUANTUM_SIZE):Math.min(u,8)},dynCall:function(i,u,f){return f&&f.length?Module["dynCall_"+i].apply(null,[u].concat(f)):Module["dynCall_"+i].call(null,u)},functionPointers:[],addFunction:function(i){for(var u=0;u>2],f=(u+i+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=f,f>=TOTAL_MEMORY){var c=enlargeMemory();if(!c)return HEAP32[DYNAMICTOP_PTR>>2]=u,0}return u},alignMemory:function(i,u){var f=i=Math.ceil(i/(u||16))*(u||16);return f},makeBigInt:function(i,u,f){var c=f?+(i>>>0)+ +(u>>>0)*4294967296:+(i>>>0)+ +(u|0)*4294967296;return c},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(i,u){i||abort("Assertion failed: "+u)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(i){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(i){var u=Runtime.stackAlloc(i.length);return writeArrayToMemory(i,u),u},stringToC:function(i){var u=0;if(i!=null&&i!==0){var f=(i.length<<2)+1;u=Runtime.stackAlloc(f),stringToUTF8(i,u,f)}return u}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(u,f,c,g,t){var C=getCFunc(u),A=[],x=0;if(g)for(var D=0;D>0]=u;break;case"i8":HEAP8[i>>0]=u;break;case"i16":HEAP16[i>>1]=u;break;case"i32":HEAP32[i>>2]=u;break;case"i64":tempI64=[u>>>0,(tempDouble=u,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[i>>2]=tempI64[0],HEAP32[i+4>>2]=tempI64[1];break;case"float":HEAPF32[i>>2]=u;break;case"double":HEAPF64[i>>3]=u;break;default:abort("invalid type for setValue: "+f)}}Module.setValue=setValue;function getValue(i,u,f){switch(u=u||"i8",u.charAt(u.length-1)==="*"&&(u="i32"),u){case"i1":return HEAP8[i>>0];case"i8":return HEAP8[i>>0];case"i16":return HEAP16[i>>1];case"i32":return HEAP32[i>>2];case"i64":return HEAP32[i>>2];case"float":return HEAPF32[i>>2];case"double":return HEAPF64[i>>3];default:abort("invalid type for setValue: "+u)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;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;function allocate(i,u,f,c){var g,t;typeof i=="number"?(g=!0,t=i):(g=!1,t=i.length);var C=typeof u=="string"?u:null,A;if(f==ALLOC_NONE?A=c:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][f===void 0?ALLOC_STATIC:f](Math.max(t,C?1:u.length)),g){var c=A,x;for(assert((A&3)==0),x=A+(t&~3);c>2]=0;for(x=A+t;c>0]=0;return A}if(C==="i8")return i.subarray||i.slice?HEAPU8.set(i,A):HEAPU8.set(new Uint8Array(i),A),A;for(var D=0,L,N,j;D>0],f|=c,!(c==0&&!u||(g++,u&&g==u)););u||(u=g);var t="";if(f<128){for(var C=1024,A;u>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(i,i+Math.min(u,C))),t=t?t+A:A,i+=C,u-=C;return t}return Module.UTF8ToString(i)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(i){for(var u="";;){var f=HEAP8[i++>>0];if(!f)return u;u+=String.fromCharCode(f)}}Module.AsciiToString=AsciiToString;function stringToAscii(i,u){return writeAsciiToMemory(i,u,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(i,u){for(var f=u;i[f];)++f;if(f-u>16&&i.subarray&&UTF8Decoder)return UTF8Decoder.decode(i.subarray(u,f));for(var c,g,t,C,A,x,D="";;){if(c=i[u++],!c)return D;if(!(c&128)){D+=String.fromCharCode(c);continue}if(g=i[u++]&63,(c&224)==192){D+=String.fromCharCode((c&31)<<6|g);continue}if(t=i[u++]&63,(c&240)==224?c=(c&15)<<12|g<<6|t:(C=i[u++]&63,(c&248)==240?c=(c&7)<<18|g<<12|t<<6|C:(A=i[u++]&63,(c&252)==248?c=(c&3)<<24|g<<18|t<<12|C<<6|A:(x=i[u++]&63,c=(c&1)<<30|g<<24|t<<18|C<<12|A<<6|x))),c<65536)D+=String.fromCharCode(c);else{var L=c-65536;D+=String.fromCharCode(55296|L>>10,56320|L&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(i){return UTF8ArrayToString(HEAPU8,i)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(i,u,f,c){if(!(c>0))return 0;for(var g=f,t=f+c-1,C=0;C=55296&&A<=57343&&(A=65536+((A&1023)<<10)|i.charCodeAt(++C)&1023),A<=127){if(f>=t)break;u[f++]=A}else if(A<=2047){if(f+1>=t)break;u[f++]=192|A>>6,u[f++]=128|A&63}else if(A<=65535){if(f+2>=t)break;u[f++]=224|A>>12,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=2097151){if(f+3>=t)break;u[f++]=240|A>>18,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else if(A<=67108863){if(f+4>=t)break;u[f++]=248|A>>24,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}else{if(f+5>=t)break;u[f++]=252|A>>30,u[f++]=128|A>>24&63,u[f++]=128|A>>18&63,u[f++]=128|A>>12&63,u[f++]=128|A>>6&63,u[f++]=128|A&63}}return u[f]=0,f-g}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(i,u,f){return stringToUTF8Array(i,HEAPU8,u,f)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(i){for(var u=0,f=0;f=55296&&c<=57343&&(c=65536+((c&1023)<<10)|i.charCodeAt(++f)&1023),c<=127?++u:c<=2047?u+=2:c<=65535?u+=3:c<=2097151?u+=4:c<=67108863?u+=5:u+=6}return u}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):void 0;function demangle(i){var u=Module.___cxa_demangle||Module.__cxa_demangle;if(u){try{var f=i.substr(1),c=lengthBytesUTF8(f)+1,g=_malloc(c);stringToUTF8(f,g,c);var t=_malloc(4),C=u(g,0,0,t);if(getValue(t,"i32")===0&&C)return Pointer_stringify(C)}catch(A){}finally{g&&_free(g),t&&_free(t),C&&_free(C)}return i}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),i}function demangleAll(i){var u=/__Z[\w\d_]+/g;return i.replace(u,function(f){var c=demangle(f);return f===c?f:f+" ["+c+"]"})}function jsStackTrace(){var i=new Error;if(!i.stack){try{throw new Error(0)}catch(u){i=u}if(!i.stack)return"(no stack trace available)"}return i.stack.toString()}function stackTrace(){var i=jsStackTrace();return Module.extraStackTrace&&(i+=` -`+Module.extraStackTrace()),demangleAll(i)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;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()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var u=i.shift();if(typeof u=="function"){u();continue}var f=u.func;typeof f=="number"?u.arg===void 0?Module.dynCall_v(f):Module.dynCall_vi(f,u.arg):f(u.arg===void 0?null:u.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(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(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(i){__ATPRERUN__.unshift(i)}Module.addOnPreRun=addOnPreRun;function addOnInit(i){__ATINIT__.unshift(i)}Module.addOnInit=addOnInit;function addOnPreMain(i){__ATMAIN__.unshift(i)}Module.addOnPreMain=addOnPreMain;function addOnExit(i){__ATEXIT__.unshift(i)}Module.addOnExit=addOnExit;function addOnPostRun(i){__ATPOSTRUN__.unshift(i)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(i,u,f){var c=f>0?f:lengthBytesUTF8(i)+1,g=new Array(c),t=stringToUTF8Array(i,g,0,g.length);return u&&(g.length=t),g}Module.intArrayFromString=intArrayFromString;function intArrayToString(i){for(var u=[],f=0;f255&&(c&=255),u.push(String.fromCharCode(c))}return u.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(i,u,f){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var c,g;f&&(g=u+lengthBytesUTF8(i),c=HEAP8[g]),stringToUTF8(i,u,Infinity),f&&(HEAP8[g]=c)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(i,u){HEAP8.set(i,u)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(i,u,f){for(var c=0;c>0]=i.charCodeAt(c);f||(HEAP8[u>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function(u,f){var c=u>>>16,g=u&65535,t=f>>>16,C=f&65535;return g*C+(c*C+g*t<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(i){return froundBuffer[0]=i,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(i){i=i>>>0;for(var u=0;u<32;u++)if(i&1<<31-u)return u;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(i){return i<0?Math.ceil(i):Math.floor(i)}),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(i){return i}function addRunDependency(i){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(i){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var u=dependenciesFulfilled;dependenciesFulfilled=null,u()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(i,u,f,c,g,t,C,A){return _nbind.callbackSignatureList[i].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(i,u,f,c,g,t,C,A){return ASM_CONSTS[i](u,f,c,g,t,C,A)}function _emscripten_asm_const_iiiii(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiidddddd(i,u,f,c,g,t,C,A,x){return ASM_CONSTS[i](u,f,c,g,t,C,A,x)}function _emscripten_asm_const_iiididi(i,u,f,c,g,t,C){return ASM_CONSTS[i](u,f,c,g,t,C)}function _emscripten_asm_const_iiii(i,u,f,c){return ASM_CONSTS[i](u,f,c)}function _emscripten_asm_const_iiiid(i,u,f,c,g){return ASM_CONSTS[i](u,f,c,g)}function _emscripten_asm_const_iiiiii(i,u,f,c,g,t){return ASM_CONSTS[i](u,f,c,g,t)}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;STATICTOP+=16;function _atexit(i,u){__ATEXIT__.unshift({func:i,arg:u})}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(i,u,f,c){var g=arguments.length,t=g<3?u:c===null?c=Object.getOwnPropertyDescriptor(u,f):c,C;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")t=Reflect.decorate(i,u,f,c);else for(var A=i.length-1;A>=0;A--)(C=i[A])&&(t=(g<3?C(t):g>3?C(u,f,t):C(u,f))||t);return g>3&&t&&Object.defineProperty(u,f,t),t}function _defineHidden(i){return function(u,f){Object.defineProperty(u,f,{configurable:!1,enumerable:!1,value:i,writable:!0})}}var _nbind={};function __nbind_free_external(i){_nbind.externalList[i].dereference(i)}function __nbind_reference_external(i){_nbind.externalList[i].reference()}function _llvm_stackrestore(i){var u=_llvm_stacksave,f=u.LLVM_SAVEDSTACKS[i];u.LLVM_SAVEDSTACKS.splice(i,1),Runtime.stackRestore(f)}function __nbind_register_pool(i,u,f,c){_nbind.Pool.pageSize=i,_nbind.Pool.usedPtr=u/4,_nbind.Pool.rootPtr=f,_nbind.Pool.pagePtr=c/4,HEAP32[u/4]=16909060,HEAP8[u]==1&&(_nbind.bigEndian=!0),HEAP32[u/4]=0,_nbind.makeTypeKindTbl=(t={},t[1024]=_nbind.PrimitiveType,t[64]=_nbind.Int64Type,t[2048]=_nbind.BindClass,t[3072]=_nbind.BindClassPtr,t[4096]=_nbind.SharedClassPtr,t[5120]=_nbind.ArrayType,t[6144]=_nbind.ArrayType,t[7168]=_nbind.CStringType,t[9216]=_nbind.CallbackType,t[10240]=_nbind.BindType,t),_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 g=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});g.proto=Module,_nbind.BindClass.list.push(g);var t}function _emscripten_set_main_loop_timing(i,u){if(Browser.mainLoop.timingMode=i,Browser.mainLoop.timingValue=u,!Browser.mainLoop.func)return 1;if(i==0)Browser.mainLoop.scheduler=function(){var C=Math.max(0,Browser.mainLoop.tickStartTime+u-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,C)},Browser.mainLoop.method="timeout";else if(i==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(i==2){if(!window.setImmediate){let t=function(C){C.source===window&&C.data===c&&(C.stopPropagation(),f.shift()())};var g=t,f=[],c="setimmediate";window.addEventListener("message",t,!0),window.setImmediate=function(A){f.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:c})):window.postMessage(c,"*")}}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(i,u,f,c,g){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=i,Browser.mainLoop.arg=c;var t;typeof c!="undefined"?t=function(){Module.dynCall_vi(i,c)}:t=function(){Module.dynCall_v(i)};var C=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var x=Date.now(),D=Browser.mainLoop.queue.shift();if(D.func(D.arg),Browser.mainLoop.remainingBlockers){var L=Browser.mainLoop.remainingBlockers,N=L%1==0?L-1:Math.floor(L);D.counted?Browser.mainLoop.remainingBlockers=N:(N=N+.5,Browser.mainLoop.remainingBlockers=(8*L+N)/9)}if(console.log('main loop blocker "'+D.name+'" took '+(Date.now()-x)+" ms"),Browser.mainLoop.updateStatus(),C1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&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(t),!(C0?_emscripten_set_main_loop_timing(0,1e3/u):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),f)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 i=Browser.mainLoop.timingMode,u=Browser.mainLoop.timingValue,f=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(f,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(i,u),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var i=Module.statusMessage||"Please wait...",u=Browser.mainLoop.remainingBlockers,f=Browser.mainLoop.expectedBlockers;u?u=6;){var Le=J>>Te-6&63;Te-=6,De+=Se[Le]}return Te==2?(De+=Se[(J&3)<<4],De+=me+me):Te==4&&(De+=Se[(J&15)<<2],De+=me),De}h.src="data:audio/x-"+C.substr(-3)+";base64,"+Q(t),L(h)},h.src=$,Browser.safeSetTimeout(function(){L(h)},1e4)}else return N()},Module.preloadPlugins.push(u);function f(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var c=Module.canvas;c&&(c.requestPointerLock=c.requestPointerLock||c.mozRequestPointerLock||c.webkitRequestPointerLock||c.msRequestPointerLock||function(){},c.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},c.exitPointerLock=c.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",f,!1),document.addEventListener("mozpointerlockchange",f,!1),document.addEventListener("webkitpointerlockchange",f,!1),document.addEventListener("mspointerlockchange",f,!1),Module.elementPointerLock&&c.addEventListener("click",function(g){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),g.preventDefault())},!1))},createContext:function(i,u,f,c){if(u&&Module.ctx&&i==Module.canvas)return Module.ctx;var g,t;if(u){var C={antialias:!1,alpha:!1};if(c)for(var A in c)C[A]=c[A];t=GL.createContext(i,C),t&&(g=GL.getContext(t).GLctx)}else g=i.getContext("2d");return g?(f&&(u||assert(typeof GLctx=="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=g,u&&GL.makeContextCurrent(t),Module.useWebGL=u,Browser.moduleContextCreatedCallbacks.forEach(function(x){x()}),Browser.init()),g):null},destroyContext:function(i,u,f){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(i,u,f){Browser.lockPointer=i,Browser.resizeCanvas=u,Browser.vrDevice=f,typeof Browser.lockPointer=="undefined"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas=="undefined"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice=="undefined"&&(Browser.vrDevice=null);var c=Module.canvas;function g(){Browser.isFullscreen=!1;var C=c.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===C?(c.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},c.exitFullscreen=c.exitFullscreen.bind(document),Browser.lockPointer&&c.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(C.parentNode.insertBefore(c,C),C.parentNode.removeChild(C),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(c)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",g,!1),document.addEventListener("mozfullscreenchange",g,!1),document.addEventListener("webkitfullscreenchange",g,!1),document.addEventListener("MSFullscreenChange",g,!1));var t=document.createElement("div");c.parentNode.insertBefore(t,c),t.appendChild(c),t.requestFullscreen=t.requestFullscreen||t.mozRequestFullScreen||t.msRequestFullscreen||(t.webkitRequestFullscreen?function(){t.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(t.webkitRequestFullScreen?function(){t.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),f?t.requestFullscreen({vrDisplay:f}):t.requestFullscreen()},requestFullScreen:function(i,u,f){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(c,g,t){return Browser.requestFullscreen(c,g,t)},Browser.requestFullscreen(i,u,f)},nextRAF:0,fakeRequestAnimationFrame:function(i){var u=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=u+1e3/60;else for(;u+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var f=Math.max(Browser.nextRAF-u,0);setTimeout(i,f)},requestAnimationFrame:function(u){typeof window=="undefined"?Browser.fakeRequestAnimationFrame(u):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(u))},safeCallback:function(i){return function(){if(!ABORT)return i.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var i=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],i.forEach(function(u){u()})}},safeRequestAnimationFrame:function(i){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))})},safeSetTimeout:function(i,u){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?i():Browser.queuedAsyncCallbacks.push(i))},u)},safeSetInterval:function(i,u){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&i()},u)},getMimetype:function(i){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[i.substr(i.lastIndexOf(".")+1)]},getUserMedia:function(i){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(i)},getMovementX:function(i){return i.movementX||i.mozMovementX||i.webkitMovementX||0},getMovementY:function(i){return i.movementY||i.mozMovementY||i.webkitMovementY||0},getMouseWheelDelta:function(i){var u=0;switch(i.type){case"DOMMouseScroll":u=i.detail;break;case"mousewheel":u=i.wheelDelta;break;case"wheel":u=i.deltaY;break;default:throw"unrecognized mouse wheel event: "+i.type}return u},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(i){if(Browser.pointerLock)i.type!="mousemove"&&"mozMovementX"in i?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(i),Browser.mouseMovementY=Browser.getMovementY(i)),typeof SDL!="undefined"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var u=Module.canvas.getBoundingClientRect(),f=Module.canvas.width,c=Module.canvas.height,g=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset,t=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;if(i.type==="touchstart"||i.type==="touchend"||i.type==="touchmove"){var C=i.touch;if(C===void 0)return;var A=C.pageX-(g+u.left),x=C.pageY-(t+u.top);A=A*(f/u.width),x=x*(c/u.height);var D={x:A,y:x};if(i.type==="touchstart")Browser.lastTouches[C.identifier]=D,Browser.touches[C.identifier]=D;else if(i.type==="touchend"||i.type==="touchmove"){var L=Browser.touches[C.identifier];L||(L=D),Browser.lastTouches[C.identifier]=L,Browser.touches[C.identifier]=D}return}var N=i.pageX-(g+u.left),j=i.pageY-(t+u.top);N=N*(f/u.width),j=j*(c/u.height),Browser.mouseMovementX=N-Browser.mouseX,Browser.mouseMovementY=j-Browser.mouseY,Browser.mouseX=N,Browser.mouseY=j}},asyncLoad:function(i,u,f,c){var g=c?"":getUniqueRunDependency("al "+i);Module.readAsync(i,function(t){assert(t,'Loading data file "'+i+'" failed (no arrayBuffer).'),u(new Uint8Array(t)),g&&removeRunDependency(g)},function(t){if(f)f();else throw'Loading data file "'+i+'" failed.'}),g&&addRunDependency(g)},resizeListeners:[],updateResizeListeners:function(){var i=Module.canvas;Browser.resizeListeners.forEach(function(u){u(i.width,i.height)})},setCanvasSize:function(i,u,f){var c=Module.canvas;Browser.updateCanvasDimensions(c,i,u),f||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL!="undefined"){var i=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];i=i&~8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=i}Browser.updateResizeListeners()},updateCanvasDimensions:function(i,u,f){u&&f?(i.widthNative=u,i.heightNative=f):(u=i.widthNative,f=i.heightNative);var c=u,g=f;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(c/g>2];return u},getStr:function(){var i=Pointer_stringify(SYSCALLS.get());return i},get64:function(){var i=SYSCALLS.get(),u=SYSCALLS.get();return i>=0?assert(u===0):assert(u===-1),i},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD();return FS.close(f),0}catch(c){return(typeof FS=="undefined"||!(c instanceof FS.ErrnoError))&&abort(c),-c.errno}}function ___syscall54(i,u){SYSCALLS.varargs=u;try{return 0}catch(f){return(typeof FS=="undefined"||!(f instanceof FS.ErrnoError))&&abort(f),-f.errno}}function _typeModule(i){var u=[[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 f(x,D,L,N,j,$){if(D==1){var h=N&896;(h==128||h==256||h==384)&&(x="X const")}var re;return $?re=L.replace("X",x).replace("Y",j):re=x.replace("X",L).replace("Y",j),re.replace(/([*&]) (?=[*&])/g,"$1")}function c(x,D,L,N,j){throw new Error(x+" type "+L.replace("X",D+"?")+(N?" with flag "+N:"")+" in "+j)}function g(x,D,L,N,j,$,h,re){$===void 0&&($="X"),re===void 0&&(re=1);var ce=L(x);if(ce)return ce;var Q=N(x),oe=Q.placeholderFlag,Se=u[oe];h&&Se&&($=f(h[2],h[0],$,Se[0],"?",!0));var me;oe==0&&(me="Unbound"),oe>=10&&(me="Corrupt"),re>20&&(me="Deeply nested"),me&&c(me,x,$,oe,j||"?");var De=Q.paramList[0],J=g(De,D,L,N,j,$,Se,re+1),Te,Oe={flags:Se[0],id:x,name:"",paramList:[J]},Le=[],ot="?";switch(Q.placeholderFlag){case 1:Te=J.spec;break;case 2:if((J.flags&15360)==1024&&J.spec.ptrSize==1){Oe.flags=7168;break}case 3:case 6:case 5:Te=J.spec,(J.flags&15360)!=2048;break;case 8:ot=""+Q.paramList[1],Oe.paramList.push(Q.paramList[1]);break;case 9:for(var ct=0,Ue=Q.paramList[1];ct>2]=i),i}function _llvm_stacksave(){var i=_llvm_stacksave;return i.LLVM_SAVEDSTACKS||(i.LLVM_SAVEDSTACKS=[]),i.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),i.LLVM_SAVEDSTACKS.length-1}function ___syscall140(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.getStreamFromFD(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=SYSCALLS.get(),C=SYSCALLS.get(),A=g;return FS.llseek(f,A,C),HEAP32[t>>2]=f.position,f.getdents&&A===0&&C===0&&(f.getdents=null),0}catch(x){return(typeof FS=="undefined"||!(x instanceof FS.ErrnoError))&&abort(x),-x.errno}}function ___syscall146(i,u){SYSCALLS.varargs=u;try{var f=SYSCALLS.get(),c=SYSCALLS.get(),g=SYSCALLS.get(),t=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(L,N){var j=___syscall146.buffers[L];assert(j),N===0||N===10?((L===1?Module.print:Module.printErr)(UTF8ArrayToString(j,0)),j.length=0):j.push(N)});for(var C=0;C>2],x=HEAP32[c+(C*8+4)>>2],D=0;Di.pageSize/2||u>i.pageSize-f){var c=_nbind.typeNameTbl.NBind.proto;return c.lalloc(u)}else return HEAPU32[i.usedPtr]=f+u,i.rootPtr+f},i.lreset=function(u,f){var c=HEAPU32[i.pagePtr];if(c){var g=_nbind.typeNameTbl.NBind.proto;g.lreset(u,f)}else HEAPU32[i.usedPtr]=u},i}();_nbind.Pool=Pool;function constructType(i,u){var f=i==10240?_nbind.makeTypeNameTbl[u.name]||_nbind.BindType:_nbind.makeTypeKindTbl[i],c=new f(u);return typeIdTbl[u.id]=c,_nbind.typeNameTbl[u.name]=c,c}_nbind.constructType=constructType;function getType(i){return typeIdTbl[i]}_nbind.getType=getType;function queryType(i){var u=HEAPU8[i],f=_nbind.structureList[u][1];i/=4,f<0&&(++i,f=HEAPU32[i]+1);var c=Array.prototype.slice.call(HEAPU32.subarray(i+1,i+1+f));return u==9&&(c=[c[0],c.slice(1)]),{paramList:c,placeholderFlag:u}}_nbind.queryType=queryType;function getTypes(i,u){return i.map(function(f){return typeof f=="number"?_nbind.getComplexType(f,constructType,getType,queryType,u):_nbind.typeNameTbl[f]})}_nbind.getTypes=getTypes;function readTypeIdList(i,u){return Array.prototype.slice.call(HEAPU32,i/4,i/4+u)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(i){for(var u=i;HEAPU8[u++];);return String.fromCharCode.apply("",HEAPU8.subarray(i,u-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(i){var u={};if(i)for(;;){var f=HEAPU32[i/4];if(!f)break;u[readAsciiString(f)]=!0,i+=4}return u}_nbind.readPolicyList=readPolicyList;function getDynCall(i,u){var f={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},c=i.map(function(t){return f[t.name]||"i"}).join(""),g=Module["dynCall_"+c];if(!g)throw new Error("dynCall_"+c+" not found for "+u+"("+i.map(function(t){return t.name}).join(", ")+")");return g}_nbind.getDynCall=getDynCall;function addMethod(i,u,f,c){var g=i[u];i.hasOwnProperty(u)&&g?((g.arity||g.arity===0)&&(g=_nbind.makeOverloader(g,g.arity),i[u]=g),g.addMethod(f,c)):(f.arity=c,i[u]=f)}_nbind.addMethod=addMethod;function throwError(i){throw new Error(i)}_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(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.heap=HEAPU32,f.ptrSize=4,f}return u.prototype.needsWireRead=function(f){return!!this.wireRead||!!this.makeWireRead},u.prototype.needsWireWrite=function(f){return!!this.wireWrite||!!this.makeWireWrite},u}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(i){__extends(u,i);function u(f){var c=i.call(this,f)||this,g=f.flags&32?{32:HEAPF32,64:HEAPF64}:f.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return c.heap=g[f.ptrSize*8],c.ptrSize=f.ptrSize,c}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="number")return g;throw new Error("Type mismatch")}},u}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(i,u){if(i==null){if(u&&u.Nullable)return 0;throw new Error("Type mismatch")}if(u&&u.Strict){if(typeof i!="string")throw new Error("Type mismatch")}else i=i.toString();var f=Module.lengthBytesUTF8(i)+1,c=_nbind.Pool.lalloc(f);return Module.stringToUTF8Array(i,HEAPU8,c,f),c}_nbind.pushCString=pushCString;function popCString(i){return i===0?null:Module.Pointer_stringify(i)}_nbind.popCString=popCString;var CStringType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=popCString,f.wireWrite=pushCString,f.readResources=[_nbind.resources.pool],f.writeResources=[_nbind.resources.pool],f}return u.prototype.makeWireWrite=function(f,c){return function(g){return pushCString(g,c)}},u}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(i){__extends(u,i);function u(){var f=i!==null&&i.apply(this,arguments)||this;return f.wireRead=function(c){return!!c},f}return u.prototype.needsWireWrite=function(f){return!!f&&!!f.Strict},u.prototype.makeWireRead=function(f){return"!!("+f+")"},u.prototype.makeWireWrite=function(f,c){return c&&c.Strict&&function(g){if(typeof g=="boolean")return g;throw new Error("Type mismatch")}||f},u}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function i(){}return i.prototype.persist=function(){this.__nbindState|=1},i}();_nbind.Wrapper=Wrapper;function makeBound(i,u){var f=function(c){__extends(g,c);function g(t,C,A,x){var D=c.call(this)||this;if(!(D instanceof g))return new(Function.prototype.bind.apply(g,Array.prototype.concat.apply([null],arguments)));var L=C,N=A,j=x;if(t!==_nbind.ptrMarker){var $=D.__nbindConstructor.apply(D,arguments);L=4096|512,j=HEAPU32[$/4],N=HEAPU32[$/4+1]}var h={configurable:!0,enumerable:!1,value:null,writable:!1},re={__nbindFlags:L,__nbindPtr:N};j&&(re.__nbindShared=j,_nbind.mark(D));for(var ce=0,Q=Object.keys(re);ce>=1;var f=_nbind.valueList[i];return _nbind.valueList[i]=firstFreeValue,firstFreeValue=i,f}else{if(u)return _nbind.popShared(i,u);throw new Error("Invalid value slot "+i)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(i){return typeof i=="number"?i:pushValue(i)*4096+valueBase}function pop64(i){return i=3?C=Buffer.from(t):C=new Buffer(t),C.copy(c)}else getBuffer(c).set(t)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var i=0,u=dirtyList;i>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(i,u,f,c,g,t){try{Module.dynCall_viiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_vif(i,u,f){try{Module.dynCall_vif(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vid(i,u,f){try{Module.dynCall_vid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_fiff(i,u,f,c){try{return Module.dynCall_fiff(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_vi(i,u){try{Module.dynCall_vi(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_vii(i,u,f){try{Module.dynCall_vii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_ii(i,u){try{return Module.dynCall_ii(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viddi(i,u,f,c,g){try{Module.dynCall_viddi(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_vidd(i,u,f,c){try{Module.dynCall_vidd(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_iiii(i,u,f,c){try{return Module.dynCall_iiii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_diii(i,u,f,c){try{return Module.dynCall_diii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_di(i,u){try{return Module.dynCall_di(i,u)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_iid(i,u,f){try{return Module.dynCall_iid(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_iii(i,u,f){try{return Module.dynCall_iii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiddi(i,u,f,c,g,t){try{Module.dynCall_viiddi(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiiiii(i,u,f,c,g,t,C){try{Module.dynCall_viiiiii(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(i,u,f){try{return Module.dynCall_dii(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_i(i){try{return Module.dynCall_i(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_iiiiii(i,u,f,c,g,t){try{return Module.dynCall_iiiiii(i,u,f,c,g,t)}catch(C){if(typeof C!="number"&&C!=="longjmp")throw C;Module.setThrew(1,0)}}function invoke_viiid(i,u,f,c,g){try{Module.dynCall_viiid(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}function invoke_viififi(i,u,f,c,g,t,C){try{Module.dynCall_viififi(i,u,f,c,g,t,C)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(i,u,f,c){try{Module.dynCall_viii(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_v(i){try{Module.dynCall_v(i)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viid(i,u,f,c){try{Module.dynCall_viid(i,u,f,c)}catch(g){if(typeof g!="number"&&g!=="longjmp")throw g;Module.setThrew(1,0)}}function invoke_idd(i,u,f){try{return Module.dynCall_idd(i,u,f)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiii(i,u,f,c,g){try{Module.dynCall_viiii(i,u,f,c,g)}catch(t){if(typeof t!="number"&&t!=="longjmp")throw t;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:Infinity},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(i,u,f){var c=new i.Int8Array(f),g=new i.Int16Array(f),t=new i.Int32Array(f),C=new i.Uint8Array(f),A=new i.Uint16Array(f),x=new i.Uint32Array(f),D=new i.Float32Array(f),L=new i.Float64Array(f),N=u.DYNAMICTOP_PTR|0,j=u.tempDoublePtr|0,$=u.ABORT|0,h=u.STACKTOP|0,re=u.STACK_MAX|0,ce=u.cttz_i8|0,Q=u.___dso_handle|0,oe=0,Se=0,me=0,De=0,J=i.NaN,Te=i.Infinity,Oe=0,Le=0,ot=0,ct=0,Ue=0,be=0,At=i.Math.floor,Ot=i.Math.abs,Nt=i.Math.sqrt,Je=i.Math.pow,V=i.Math.cos,ne=i.Math.sin,ge=i.Math.tan,Z=i.Math.acos,Ae=i.Math.asin,at=i.Math.atan,it=i.Math.atan2,Ft=i.Math.exp,jt=i.Math.log,hn=i.Math.ceil,Un=i.Math.imul,Jt=i.Math.min,Yt=i.Math.max,cr=i.Math.clz32,w=i.Math.fround,pt=u.abort,Mn=u.assert,Bn=u.enlargeMemory,Xn=u.getTotalMemory,vr=u.abortOnCannotGrowMemory,gr=u.invoke_viiiii,r0=u.invoke_vif,Ci=u.invoke_vid,yo=u.invoke_fiff,Ds=u.invoke_vi,Mu=u.invoke_vii,Gf=u.invoke_ii,iu=u.invoke_viddi,ou=u.invoke_vidd,ol=u.invoke_iiii,ul=u.invoke_diii,Es=u.invoke_di,Uo=u.invoke_iid,sl=u.invoke_iii,Ss=u.invoke_viiddi,Cs=u.invoke_viiiiii,Ti=u.invoke_dii,Fu=u.invoke_i,ll=u.invoke_iiiiii,fl=u.invoke_viiid,cl=u.invoke_viififi,al=u.invoke_viii,Ui=u.invoke_v,Mr=u.invoke_viid,Ac=u.invoke_idd,of=u.invoke_viiii,Ts=u._emscripten_asm_const_iiiii,xs=u._emscripten_asm_const_iiidddddd,dl=u._emscripten_asm_const_iiiid,qi=u.__nbind_reference_external,qo=u._emscripten_asm_const_iiiiiiii,kr=u._removeAccessorPrefix,Fr=u._typeModule,si=u.__nbind_register_pool,H0=u.__decorate,b0=u._llvm_stackrestore,Bt=u.___cxa_atexit,Lu=u.__extends,c0=u.__nbind_get_value_object,Ru=u.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,ks=u._emscripten_set_main_loop_timing,As=u.__nbind_register_primitive,uu=u.__nbind_register_type,wo=u._emscripten_memcpy_big,zo=u.__nbind_register_function,Os=u.___setErrNo,Is=u.__nbind_register_class,uf=u.__nbind_finish,_n=u._abort,Nu=u._nbind_value,Wo=u._llvm_stacksave,su=u.___syscall54,Ps=u._defineHidden,pl=u._emscripten_set_main_loop,Vf=u._emscripten_get_now,hl=u.__nbind_register_callback_signature,Bu=u._emscripten_asm_const_iiiiii,ju=u.__nbind_free_external,sf=u._emscripten_asm_const_iiii,ro=u._emscripten_asm_const_iiididi,Ms=u.___syscall6,ml=u._atexit,Uu=u.___syscall140,G0=u.___syscall146,Fs=w(0);let tt=w(0);function zi(e){e=e|0;var n=0;return n=h,h=h+e|0,h=h+15&-16,n|0}function lu(){return h|0}function Ho(e){e=e|0,h=e}function O0(e,n){e=e|0,n=n|0,h=e,re=n}function vl(e,n){e=e|0,n=n|0,oe||(oe=e,Se=n)}function gl(e){e=e|0,be=e}function fu(){return be|0}function _l(){var e=0,n=0;vn(8104,8,400)|0,vn(8504,408,540)|0,e=9044,n=e+44|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));c[9088]=0,c[9089]=1,t[2273]=0,t[2274]=948,t[2275]=948,Bt(17,8104,Q|0)|0}function Sn(e){e=e|0,lf(e+948|0)}function gt(e){return e=w(e),((Ar(e)|0)&2147483647)>>>0>2139095040|0}function en(e,n,r){e=e|0,n=n|0,r=r|0;e:do if(t[e+(n<<3)+4>>2]|0)e=e+(n<<3)|0;else{if((n|2|0)==3?t[e+60>>2]|0:0){e=e+56|0;break}switch(n|0){case 0:case 2:case 4:case 5:{if(t[e+52>>2]|0){e=e+48|0;break e}break}default:}if(t[e+68>>2]|0){e=e+64|0;break}else{e=(n|1|0)==5?948:r;break}}while(0);return e|0}function I0(e){e=e|0;var n=0;return n=uh(1e3)|0,li(e,(n|0)!=0,2456),t[2276]=(t[2276]|0)+1,vn(n|0,8104,1e3)|0,c[e+2>>0]|0&&(t[n+4>>2]=2,t[n+12>>2]=4),t[n+976>>2]=e,n|0}function li(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,zs(e,5,3197,o)),h=s}function qu(){return I0(956)|0}function Wi(e){e=e|0;var n=0;return n=Tt(1e3)|0,zu(n,e),li(t[e+976>>2]|0,1,2456),t[2276]=(t[2276]|0)+1,t[n+944>>2]=0,n|0}function zu(e,n){e=e|0,n=n|0;var r=0;vn(e|0,n|0,948)|0,af(e+948|0,n+948|0),r=e+960|0,e=n+960|0,n=r+40|0;do t[r>>2]=t[e>>2],r=r+4|0,e=e+4|0;while((r|0)<(n|0))}function Wu(e){e=e|0;var n=0,r=0,o=0,s=0;if(n=e+944|0,r=t[n>>2]|0,r|0&&(Ls(r+948|0,e)|0,t[n>>2]=0),r=fi(e)|0,r|0){n=0;do t[(e0(e,n)|0)+944>>2]=0,n=n+1|0;while((n|0)!=(r|0))}r=e+948|0,o=t[r>>2]|0,s=e+952|0,n=t[s>>2]|0,(n|0)!=(o|0)&&(t[s>>2]=n+(~((n+-4-o|0)>>>2)<<2)),io(r),sh(e),t[2276]=(t[2276]|0)+-1}function Ls(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0;o=t[e>>2]|0,_=e+4|0,r=t[_>>2]|0,l=r;e:do if((o|0)==(r|0))s=o,d=4;else for(e=o;;){if((t[e>>2]|0)==(n|0)){s=e,d=4;break e}if(e=e+4|0,(e|0)==(r|0)){e=0;break}}while(0);return(d|0)==4&&((s|0)!=(r|0)?(o=s+4|0,e=l-o|0,n=e>>2,n&&(Y1(s|0,o|0,e|0)|0,r=t[_>>2]|0),e=s+(n<<2)|0,(r|0)==(e|0)||(t[_>>2]=r+(~((r+-4-e|0)>>>2)<<2)),e=1):e=0),e|0}function fi(e){return e=e|0,(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2|0}function e0(e,n){e=e|0,n=n|0;var r=0;return r=t[e+948>>2]|0,(t[e+952>>2]|0)-r>>2>>>0>n>>>0?e=t[r+(n<<2)>>2]|0:e=0,e|0}function io(e){e=e|0;var n=0,r=0,o=0,s=0;o=h,h=h+32|0,n=o,s=t[e>>2]|0,r=(t[e+4>>2]|0)-s|0,((t[e+8>>2]|0)-s|0)>>>0>r>>>0&&(s=r>>2,z(n,s,s,e+8|0),dr(e,n),Or(n)),h=o}function D0(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;k=fi(e)|0;do if(k|0){if((t[(e0(e,0)|0)+944>>2]|0)==(e|0)){if(!(Ls(e+948|0,n)|0))break;vn(n+400|0,8504,540)|0,t[n+944>>2]=0,ln(e);break}d=t[(t[e+976>>2]|0)+12>>2]|0,_=e+948|0,y=(d|0)==0,r=0,l=0;do o=t[(t[_>>2]|0)+(l<<2)>>2]|0,(o|0)==(n|0)?ln(e):(s=Wi(o)|0,t[(t[_>>2]|0)+(r<<2)>>2]=s,t[s+944>>2]=e,y||Q4[d&15](o,s,e,r),r=r+1|0),l=l+1|0;while((l|0)!=(k|0));if(r>>>0>>0){y=e+948|0,_=e+952|0,d=r,r=t[_>>2]|0;do l=(t[y>>2]|0)+(d<<2)|0,o=l+4|0,s=r-o|0,n=s>>2,n&&(Y1(l|0,o|0,s|0)|0,r=t[_>>2]|0),s=r,o=l+(n<<2)|0,(s|0)!=(o|0)&&(r=s+(~((s+-4-o|0)>>>2)<<2)|0,t[_>>2]=r),d=d+1|0;while((d|0)!=(k|0))}}while(0)}function Do(e){e=e|0;var n=0,r=0,o=0,s=0;i0(e,(fi(e)|0)==0,2491),i0(e,(t[e+944>>2]|0)==0,2545),n=e+948|0,r=t[n>>2]|0,o=e+952|0,s=t[o>>2]|0,(s|0)!=(r|0)&&(t[o>>2]=s+(~((s+-4-r|0)>>>2)<<2)),io(n),n=e+976|0,r=t[n>>2]|0,vn(e|0,8104,1e3)|0,c[r+2>>0]|0&&(t[e+4>>2]=2,t[e+12>>2]=4),t[n>>2]=r}function i0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;s=h,h=h+16|0,o=s,n||(t[o>>2]=r,wn(e,5,3197,o)),h=s}function Rs(){return t[2276]|0}function a0(){var e=0;return e=uh(20)|0,Hu((e|0)!=0,2592),t[2277]=(t[2277]|0)+1,t[e>>2]=t[239],t[e+4>>2]=t[240],t[e+8>>2]=t[241],t[e+12>>2]=t[242],t[e+16>>2]=t[243],e|0}function Hu(e,n){e=e|0,n=n|0;var r=0,o=0;o=h,h=h+16|0,r=o,e||(t[r>>2]=n,wn(0,5,3197,r)),h=o}function V0(e){e=e|0,sh(e),t[2277]=(t[2277]|0)+-1}function bu(e,n){e=e|0,n=n|0;var r=0;n?(i0(e,(fi(e)|0)==0,2629),r=1):(r=0,n=0),t[e+964>>2]=n,t[e+988>>2]=r}function Ns(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+8|0,s=o+4|0,d=o,t[s>>2]=n,i0(e,(t[n+944>>2]|0)==0,2709),i0(e,(t[e+964>>2]|0)==0,2763),bo(e),n=e+948|0,t[d>>2]=(t[n>>2]|0)+(r<<2),t[l>>2]=t[d>>2],P0(n,l,s)|0,t[(t[s>>2]|0)+944>>2]=e,ln(e),h=o}function bo(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;if(r=fi(e)|0,r|0?(t[(e0(e,0)|0)+944>>2]|0)!=(e|0):0){o=t[(t[e+976>>2]|0)+12>>2]|0,s=e+948|0,l=(o|0)==0,n=0;do d=t[(t[s>>2]|0)+(n<<2)>>2]|0,_=Wi(d)|0,t[(t[s>>2]|0)+(n<<2)>>2]=_,t[_+944>>2]=e,l||Q4[o&15](d,_,e,n),n=n+1|0;while((n|0)!=(r|0))}}function P0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0;Pe=h,h=h+64|0,P=Pe+52|0,_=Pe+48|0,q=Pe+28|0,we=Pe+24|0,le=Pe+20|0,ie=Pe,o=t[e>>2]|0,l=o,n=o+((t[n>>2]|0)-l>>2<<2)|0,o=e+4|0,s=t[o>>2]|0,d=e+8|0;do if(s>>>0<(t[d>>2]|0)>>>0){if((n|0)==(s|0)){t[n>>2]=t[r>>2],t[o>>2]=(t[o>>2]|0)+4;break}Qn(e,n,s,n+4|0),n>>>0<=r>>>0&&(r=(t[o>>2]|0)>>>0>r>>>0?r+4|0:r),t[n>>2]=t[r>>2]}else{o=(s-l>>2)+1|0,s=Q0(e)|0,s>>>0>>0&&$n(e),T=t[e>>2]|0,k=(t[d>>2]|0)-T|0,l=k>>1,z(ie,k>>2>>>0>>1>>>0?l>>>0>>0?o:l:s,n-T>>2,e+8|0),T=ie+8|0,o=t[T>>2]|0,l=ie+12|0,k=t[l>>2]|0,d=k,y=o;do if((o|0)==(k|0)){if(k=ie+4|0,o=t[k>>2]|0,ke=t[ie>>2]|0,s=ke,o>>>0<=ke>>>0){o=d-s>>1,o=(o|0)==0?1:o,z(q,o,o>>>2,t[ie+16>>2]|0),t[we>>2]=t[k>>2],t[le>>2]=t[T>>2],t[_>>2]=t[we>>2],t[P>>2]=t[le>>2],s0(q,_,P),o=t[ie>>2]|0,t[ie>>2]=t[q>>2],t[q>>2]=o,o=q+4|0,ke=t[k>>2]|0,t[k>>2]=t[o>>2],t[o>>2]=ke,o=q+8|0,ke=t[T>>2]|0,t[T>>2]=t[o>>2],t[o>>2]=ke,o=q+12|0,ke=t[l>>2]|0,t[l>>2]=t[o>>2],t[o>>2]=ke,Or(q),o=t[T>>2]|0;break}l=o,d=((l-s>>2)+1|0)/-2|0,_=o+(d<<2)|0,s=y-l|0,l=s>>2,l&&(Y1(_|0,o|0,s|0)|0,o=t[k>>2]|0),ke=_+(l<<2)|0,t[T>>2]=ke,t[k>>2]=o+(d<<2),o=ke}while(0);t[o>>2]=t[r>>2],t[T>>2]=(t[T>>2]|0)+4,n=nn(e,ie,n)|0,Or(ie)}while(0);return h=Pe,n|0}function ln(e){e=e|0;var n=0;do{if(n=e+984|0,c[n>>0]|0)break;c[n>>0]=1,D[e+504>>2]=w(J),e=t[e+944>>2]|0}while((e|0)!=0)}function lf(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function nr(e){return e=e|0,t[e+944>>2]|0}function rr(e){e=e|0,i0(e,(t[e+964>>2]|0)!=0,2832),ln(e)}function Go(e){return e=e|0,(c[e+984>>0]|0)!=0|0}function Gu(e,n){e=e|0,n=n|0,fL(e,n,400)|0&&(vn(e|0,n|0,400)|0,ln(e))}function yl(e){e=e|0;var n=tt;return n=w(D[e+44>>2]),e=gt(n)|0,w(e?w(0):n)}function cu(e){e=e|0;var n=tt;return n=w(D[e+48>>2]),gt(n)|0&&(n=c[(t[e+976>>2]|0)+2>>0]|0?w(1):w(0)),w(n)}function Bs(e,n){e=e|0,n=n|0,t[e+980>>2]=n}function Vu(e){return e=e|0,t[e+980>>2]|0}function M0(e,n){e=e|0,n=n|0;var r=0;r=e+4|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function au(e){return e=e|0,t[e+4>>2]|0}function Lr(e,n){e=e|0,n=n|0;var r=0;r=e+8|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function F(e){return e=e|0,t[e+8>>2]|0}function R(e,n){e=e|0,n=n|0;var r=0;r=e+12|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function U(e){return e=e|0,t[e+12>>2]|0}function H(e,n){e=e|0,n=n|0;var r=0;r=e+16|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function fe(e){return e=e|0,t[e+16>>2]|0}function ue(e,n){e=e|0,n=n|0;var r=0;r=e+20|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function de(e){return e=e|0,t[e+20>>2]|0}function W(e,n){e=e|0,n=n|0;var r=0;r=e+24|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function ve(e){return e=e|0,t[e+24>>2]|0}function Fe(e,n){e=e|0,n=n|0;var r=0;r=e+28|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Ge(e){return e=e|0,t[e+28>>2]|0}function K(e,n){e=e|0,n=n|0;var r=0;r=e+32|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function xe(e){return e=e|0,t[e+32>>2]|0}function je(e,n){e=e|0,n=n|0;var r=0;r=e+36|0,(t[r>>2]|0)!=(n|0)&&(t[r>>2]=n,ln(e))}function Xe(e){return e=e|0,t[e+36>>2]|0}function rt(e,n){e=e|0,n=w(n);var r=0;r=e+40|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function st(e,n){e=e|0,n=w(n);var r=0;r=e+44|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function xt(e,n){e=e|0,n=w(n);var r=0;r=e+48|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function wt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+52|0,s=e+56|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function lt(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+52|0,r=e+56|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function Rt(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+52|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function yn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function sn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+132+(n<<3)|0,n=e+132+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function ar(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+132+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function rn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Hn(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+60+(n<<3)|0,n=e+60+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function d0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+60+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function Cr(e,n){e=e|0,n=n|0;var r=0;r=e+60+(n<<3)+4|0,(t[r>>2]|0)!=3&&(D[e+60+(n<<3)>>2]=w(J),t[r>>2]=3,ln(e))}function He(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Qe(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=l?0:2,s=e+204+(n<<3)|0,n=e+204+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function Ne(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=n+204+(r<<3)|0,n=t[o+4>>2]|0,r=e,t[r>>2]=t[o>>2],t[r+4>>2]=n}function ft(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0,l=0;l=gt(r)|0,o=(l^1)&1,s=e+276+(n<<3)|0,n=e+276+(n<<3)+4|0,(l|w(D[s>>2])==r?(t[n>>2]|0)==(o|0):0)||(D[s>>2]=r,t[n>>2]=o,ln(e))}function St(e,n){return e=e|0,n=n|0,w(D[e+276+(n<<3)>>2])}function Qt(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+348|0,s=e+352|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Cn(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+348|0,r=e+352|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function bn(e){e=e|0;var n=0;n=e+352|0,(t[n>>2]|0)!=3&&(D[e+348>>2]=w(J),t[n>>2]=3,ln(e))}function p0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+348|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function h0(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+356|0,s=e+360|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function ci(e,n){e=e|0,n=w(n);var r=0,o=0;o=e+356|0,r=e+360|0,(w(D[o>>2])==n?(t[r>>2]|0)==2:0)||(D[o>>2]=n,o=gt(n)|0,t[r>>2]=o?3:2,ln(e))}function xi(e){e=e|0;var n=0;n=e+360|0,(t[n>>2]|0)!=3&&(D[e+356>>2]=w(J),t[n>>2]=3,ln(e))}function E0(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+356|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function qr(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Eo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+364|0,s=e+368|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function So(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+364|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function wl(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function js(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+372|0,s=e+376|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Dl(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+372|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function du(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Yu(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+380|0,s=e+384|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Us(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+380|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function oo(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=(l^1)&1,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function Hi(e,n){e=e|0,n=w(n);var r=0,o=0,s=0,l=0;l=gt(n)|0,r=l?0:2,o=e+388|0,s=e+392|0,(l|w(D[o>>2])==n?(t[s>>2]|0)==(r|0):0)||(D[o>>2]=n,t[s>>2]=r,ln(e))}function qs(e,n){e=e|0,n=n|0;var r=0,o=0;o=n+388|0,r=t[o+4>>2]|0,n=e,t[n>>2]=t[o>>2],t[n+4>>2]=r}function F0(e,n){e=e|0,n=w(n);var r=0;r=e+396|0,w(D[r>>2])!=n&&(D[r>>2]=n,ln(e))}function Gr(e){return e=e|0,w(D[e+396>>2])}function ir(e){return e=e|0,w(D[e+400>>2])}function L0(e){return e=e|0,w(D[e+404>>2])}function Y0(e){return e=e|0,w(D[e+408>>2])}function Co(e){return e=e|0,w(D[e+412>>2])}function $u(e){return e=e|0,w(D[e+416>>2])}function Vo(e){return e=e|0,w(D[e+420>>2])}function Rr(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+424+(n<<2)>>2])}function Jn(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+448+(n<<2)>>2])}function ai(e,n){switch(e=e|0,n=n|0,i0(e,(n|0)<6,2918),n|0){case 0:{n=(t[e+496>>2]|0)==2?5:4;break}case 2:{n=(t[e+496>>2]|0)==2?4:5;break}default:}return w(D[e+472+(n<<2)>>2])}function o0(e,n){e=e|0,n=n|0;var r=0,o=tt;return r=t[e+4>>2]|0,(r|0)==(t[n+4>>2]|0)?r?(o=w(D[e>>2]),e=w(Ot(w(o-w(D[n>>2]))))>2]=0,t[o+4>>2]=0,t[o+8>>2]=0,Ru(o|0,e|0,n|0,0),wn(e,3,(c[o+11>>0]|0)<0?t[o>>2]|0:o,r),ML(o),h=r}function $0(e,n,r,o){e=w(e),n=w(n),r=r|0,o=o|0;var s=tt;e=w(e*n),s=w(V4(e,w(1)));do if(Vr(s,w(0))|0)e=w(e-s);else{if(e=w(e-s),Vr(s,w(1))|0){e=w(e+w(1));break}if(r){e=w(e+w(1));break}o||(s>w(.5)?s=w(1):(o=Vr(s,w(.5))|0,s=w(o?1:0)),e=w(e+s))}while(0);return w(e/n)}function K0(e,n,r,o,s,l,d,_,y,k,T,P,q){e=e|0,n=w(n),r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,_=w(_),y=w(y),k=w(k),T=w(T),P=w(P),q=q|0;var we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt;return y>2]),le!=w(0)):0)?(Pe=w($0(n,le,0,0)),ke=w($0(o,le,0,0)),ie=w($0(l,le,0,0)),le=w($0(_,le,0,0))):(ie=l,Pe=n,le=_,ke=o),(s|0)==(e|0)?we=Vr(ie,Pe)|0:we=0,(d|0)==(r|0)?q=Vr(le,ke)|0:q=0,((we?0:(qe=w(n-T),!(ae(e,qe,y)|0)))?!(Be(e,qe,s,y)|0):0)?we=Ie(e,qe,s,l,y)|0:we=1,((q?0:(pe=w(o-P),!(ae(r,pe,k)|0)))?!(Be(r,pe,d,k)|0):0)?q=Ie(r,pe,d,_,k)|0:q=1,q=we&q),q|0}function ae(e,n,r){return e=e|0,n=w(n),r=w(r),(e|0)==1?e=Vr(n,r)|0:e=0,e|0}function Be(e,n,r,o){return e=e|0,n=w(n),r=r|0,o=w(o),(e|0)==2&(r|0)==0?n>=o?e=1:e=Vr(n,o)|0:e=0,e|0}function Ie(e,n,r,o,s){return e=e|0,n=w(n),r=r|0,o=w(o),s=w(s),(e|0)==2&(r|0)==2&o>n?s<=n?e=1:e=Vr(n,s)|0:e=0,e|0}function ht(e,n,r,o,s,l,d,_,y,k,T){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0,T=T|0;var P=0,q=0,we=0,le=0,ie=tt,Pe=tt,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=tt,Ki=tt,Xi=tt,Ji=0,Ro=0;zt=h,h=h+160|0,It=zt+152|0,Ht=zt+120|0,Ln=zt+104|0,pe=zt+72|0,le=zt+56|0,vt=zt+8|0,qe=zt,_e=(t[2279]|0)+1|0,t[2279]=_e,gn=e+984|0,((c[gn>>0]|0)!=0?(t[e+512>>2]|0)!=(t[2278]|0):0)?ke=4:(t[e+516>>2]|0)==(o|0)?Pn=0:ke=4,(ke|0)==4&&(t[e+520>>2]=0,t[e+924>>2]=-1,t[e+928>>2]=-1,D[e+932>>2]=w(-1),D[e+936>>2]=w(-1),Pn=1);e:do if(t[e+964>>2]|0)if(ie=w(mt(e,2,d)),Pe=w(mt(e,0,d)),P=e+916|0,Xi=w(D[P>>2]),Ki=w(D[e+920>>2]),Dr=w(D[e+932>>2]),K0(s,n,l,r,t[e+924>>2]|0,Xi,t[e+928>>2]|0,Ki,Dr,w(D[e+936>>2]),ie,Pe,T)|0)ke=22;else if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,Dr=w(D[P>>2]),Ki=w(D[e+524+(q*24|0)+4>>2]),Xi=w(D[e+524+(q*24|0)+16>>2]),K0(s,n,l,r,t[e+524+(q*24|0)+8>>2]|0,Dr,t[e+524+(q*24|0)+12>>2]|0,Ki,Xi,w(D[e+524+(q*24|0)+20>>2]),ie,Pe,T)|0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}else{if(y){if(P=e+916|0,!(Vr(w(D[P>>2]),n)|0)){ke=21;break}if(!(Vr(w(D[e+920>>2]),r)|0)){ke=21;break}if((t[e+924>>2]|0)!=(s|0)){ke=21;break}P=(t[e+928>>2]|0)==(l|0)?P:0,ke=22;break}if(we=t[e+520>>2]|0,!we)ke=21;else for(q=0;;){if(P=e+524+(q*24|0)|0,((Vr(w(D[P>>2]),n)|0?Vr(w(D[e+524+(q*24|0)+4>>2]),r)|0:0)?(t[e+524+(q*24|0)+8>>2]|0)==(s|0):0)?(t[e+524+(q*24|0)+12>>2]|0)==(l|0):0){ke=22;break e}if(q=q+1|0,q>>>0>=we>>>0){ke=21;break}}}while(0);do if((ke|0)==21)c[11697]|0?(P=0,ke=28):(P=0,ke=31);else if((ke|0)==22){if(q=(c[11697]|0)!=0,!((P|0)!=0&(Pn^1)))if(q){ke=28;break}else{ke=31;break}le=P+16|0,t[e+908>>2]=t[le>>2],we=P+20|0,t[e+912>>2]=t[we>>2],(c[11698]|0)==0|q^1||(t[qe>>2]=Gn(_e)|0,t[qe+4>>2]=_e,wn(e,4,2972,qe),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),s=$t(s,y)|0,l=$t(l,y)|0,Ro=+w(D[le>>2]),Ji=+w(D[we>>2]),t[vt>>2]=s,t[vt+4>>2]=l,L[vt+8>>3]=+n,L[vt+16>>3]=+r,L[vt+24>>3]=Ro,L[vt+32>>3]=Ji,t[vt+40>>2]=k,wn(e,4,2989,vt))}while(0);return(ke|0)==28&&(q=Gn(_e)|0,t[le>>2]=q,t[le+4>>2]=_e,t[le+8>>2]=Pn?3047:11699,wn(e,4,3038,le),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,ke=$t(l,y)|0,t[pe>>2]=vt,t[pe+4>>2]=ke,L[pe+8>>3]=+n,L[pe+16>>3]=+r,t[pe+24>>2]=k,wn(e,4,3049,pe),ke=31),(ke|0)==31&&(X0(e,n,r,o,s,l,d,_,y,T),c[11697]|0&&(q=t[2279]|0,vt=Gn(q)|0,t[Ln>>2]=vt,t[Ln+4>>2]=q,t[Ln+8>>2]=Pn?3047:11699,wn(e,4,3083,Ln),q=t[e+972>>2]|0,q|0&&Nl[q&127](e),vt=$t(s,y)|0,Ln=$t(l,y)|0,Ji=+w(D[e+908>>2]),Ro=+w(D[e+912>>2]),t[Ht>>2]=vt,t[Ht+4>>2]=Ln,L[Ht+8>>3]=Ji,L[Ht+16>>3]=Ro,t[Ht+24>>2]=k,wn(e,4,3092,Ht)),t[e+516>>2]=o,P||(q=e+520|0,P=t[q>>2]|0,(P|0)==16&&(c[11697]|0&&wn(e,4,3124,It),t[q>>2]=0,P=0),y?P=e+916|0:(t[q>>2]=P+1,P=e+524+(P*24|0)|0),D[P>>2]=n,D[P+4>>2]=r,t[P+8>>2]=s,t[P+12>>2]=l,t[P+16>>2]=t[e+908>>2],t[P+20>>2]=t[e+912>>2],P=0)),y&&(t[e+416>>2]=t[e+908>>2],t[e+420>>2]=t[e+912>>2],c[e+985>>0]=1,c[gn>>0]=0),t[2279]=(t[2279]|0)+-1,t[e+512>>2]=t[2278],h=zt,Pn|(P|0)==0|0}function mt(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(Tr(e,n,r)),w(o+w(R0(e,n,r)))}function wn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=h,h=h+16|0,s=l,t[s>>2]=o,e?o=t[e+976>>2]|0:o=0,Ku(o,e,n,r,s),h=l}function Gn(e){return e=e|0,(e>>>0>60?3201:3201+(60-e)|0)|0}function $t(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+32|0,r=s+12|0,o=s,t[r>>2]=t[254],t[r+4>>2]=t[255],t[r+8>>2]=t[256],t[o>>2]=t[257],t[o+4>>2]=t[258],t[o+8>>2]=t[259],(e|0)>2?e=11699:e=t[(n?o:r)+(e<<2)>>2]|0,h=s,e|0}function X0(e,n,r,o,s,l,d,_,y,k){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=l|0,d=w(d),_=w(_),y=y|0,k=k|0;var T=0,P=0,q=0,we=0,le=tt,ie=tt,Pe=tt,ke=tt,qe=tt,pe=tt,_e=tt,vt=0,Ln=0,Ht=0,It=tt,gn=tt,Pn=0,zt=tt,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=tt,Rf=tt,Zs=tt,el=tt,ss=tt,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=tt,tl=tt,ql=tt,zl=tt,Li=tt,Di=tt,ku=0,xr=tt,Wl=tt,Qi=tt,ls=tt,Zi=tt,fs=tt,Hl=0,bl=0,cs=tt,Ri=tt,Au=0,Gl=0,Vl=0,Yl=0,En=tt,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0,kt=tt,$l=0,Qr=0;Ou=h,h=h+16|0,Fi=Ou+12|0,nu=Ou+8|0,go=Ou+4|0,xu=Ou,i0(e,(s|0)==0|(gt(n)|0)^1,3326),i0(e,(l|0)==0|(gt(r)|0)^1,3406),Ei=so(e,o)|0,t[e+496>>2]=Ei,xn=N0(2,Ei)|0,Vt=N0(0,Ei)|0,D[e+440>>2]=w(Tr(e,xn,d)),D[e+444>>2]=w(R0(e,xn,d)),D[e+428>>2]=w(Tr(e,Vt,d)),D[e+436>>2]=w(R0(e,Vt,d)),D[e+464>>2]=w(C0(e,xn)),D[e+468>>2]=w(di(e,xn)),D[e+452>>2]=w(C0(e,Vt)),D[e+460>>2]=w(di(e,Vt)),D[e+488>>2]=w(u0(e,xn,d)),D[e+492>>2]=w(v0(e,xn,d)),D[e+476>>2]=w(u0(e,Vt,d)),D[e+484>>2]=w(v0(e,Vt,d));do if(t[e+964>>2]|0)To(e,n,r,s,l,d,_);else{if(eo=e+948|0,Ni=(t[e+952>>2]|0)-(t[eo>>2]|0)>>2,!Ni){pu(e,n,r,s,l,d,_);break}if(y?0:Sl(e,n,r,s,l,d,_)|0)break;bo(e),Tu=e+508|0,c[Tu>>0]=0,xn=N0(t[e+4>>2]|0,Ei)|0,Vt=Cl(xn,Ei)|0,br=Nr(xn)|0,Ff=t[e+8>>2]|0,Gl=e+28|0,us=(t[Gl>>2]|0)!=0,Zi=br?d:_,cs=br?_:d,Lf=w(B0(e,xn,d)),Rf=w(hu(e,xn,d)),le=w(B0(e,Vt,d)),fs=w(Fn(e,xn,d)),Ri=w(Fn(e,Vt,d)),Ht=br?s:l,Au=br?l:s,En=br?fs:Ri,qe=br?Ri:fs,ls=w(mt(e,2,d)),ke=w(mt(e,0,d)),ie=w(w(Tn(e+364|0,d))-En),Pe=w(w(Tn(e+380|0,d))-En),pe=w(w(Tn(e+372|0,_))-qe),_e=w(w(Tn(e+388|0,_))-qe),Zs=br?ie:pe,el=br?Pe:_e,ls=w(n-ls),n=w(ls-En),gt(n)|0?En=n:En=w(Ur(w(cc(n,Pe)),ie)),Wl=w(r-ke),n=w(Wl-qe),gt(n)|0?Qi=n:Qi=w(Ur(w(cc(n,_e)),pe)),ie=br?En:Qi,xr=br?Qi:En;e:do if((Ht|0)==1)for(o=0,P=0;;){if(T=e0(e,P)|0,!o)(w(Br(T))>w(0)?w(zr(T))>w(0):0)?o=T:o=0;else if(pi(T)|0){we=0;break e}if(P=P+1|0,P>>>0>=Ni>>>0){we=o;break}}else we=0;while(0);vt=we+500|0,Ln=we+504|0,o=0,T=0,n=w(0),q=0;do{if(P=t[(t[eo>>2]|0)+(q<<2)>>2]|0,(t[P+36>>2]|0)==1)lo(P),c[P+985>>0]=1,c[P+984>>0]=0;else{$r(P),y&&Yo(P,so(P,Ei)|0,ie,xr,En);do if((t[P+24>>2]|0)!=1)if((P|0)==(we|0)){t[vt>>2]=t[2278],D[Ln>>2]=w(0);break}else{wr(e,P,En,s,Qi,En,Qi,l,Ei,k);break}else T|0&&(t[T+960>>2]=P),t[P+960>>2]=0,T=P,o=(o|0)==0?P:o;while(0);Di=w(D[P+504>>2]),n=w(n+w(Di+w(mt(P,xn,En))))}q=q+1|0}while((q|0)!=(Ni|0));for(Xi=n>ie,ku=us&((Ht|0)==2&Xi)?1:Ht,Dr=(Au|0)==1,Ro=Dr&(y^1),kf=(ku|0)==1,Af=(ku|0)==2,Cu=976+(xn<<2)|0,Of=(Au|2|0)==2,Mf=Dr&(us^1),Js=1040+(Vt<<2)|0,Qs=1040+(xn<<2)|0,If=976+(Vt<<2)|0,Pf=(Au|0)!=1,Xi=us&((Ht|0)!=0&Xi),Ki=e+976|0,Dr=Dr^1,n=ie,Pn=0,Ji=0,Di=w(0),ss=w(0);;){e:do if(Pn>>>0>>0)for(Ln=t[eo>>2]|0,q=0,_e=w(0),pe=w(0),Pe=w(0),ie=w(0),P=0,T=0,we=Pn;;){if(vt=t[Ln+(we<<2)>>2]|0,(t[vt+36>>2]|0)!=1?(t[vt+940>>2]=Ji,(t[vt+24>>2]|0)!=1):0){if(ke=w(mt(vt,xn,En)),Kn=t[Cu>>2]|0,r=w(Tn(vt+380+(Kn<<3)|0,Zi)),qe=w(D[vt+504>>2]),r=w(cc(r,qe)),r=w(Ur(w(Tn(vt+364+(Kn<<3)|0,Zi)),r)),us&(q|0)!=0&w(ke+w(pe+r))>n){l=q,ke=_e,Ht=we;break e}ke=w(ke+r),r=w(pe+ke),ke=w(_e+ke),pi(vt)|0&&(Pe=w(Pe+w(Br(vt))),ie=w(ie-w(qe*w(zr(vt))))),T|0&&(t[T+960>>2]=vt),t[vt+960>>2]=0,q=q+1|0,T=vt,P=(P|0)==0?vt:P}else ke=_e,r=pe;if(we=we+1|0,we>>>0>>0)_e=ke,pe=r;else{l=q,Ht=we;break}}else l=0,ke=w(0),Pe=w(0),ie=w(0),P=0,Ht=Pn;while(0);Kn=Pe>w(0)&Pew(0)&ieel&((gt(el)|0)^1))n=el,Kn=51;else if(c[(t[Ki>>2]|0)+3>>0]|0)Kn=51;else{if(It!=w(0)?w(Br(e))!=w(0):0){Kn=53;break}n=ke,Kn=53}while(0);if((Kn|0)==51&&(Kn=0,gt(n)|0?Kn=53:(gn=w(n-ke),zt=n)),(Kn|0)==53&&(Kn=0,ke>2]|0,we=gnw(0),pe=w(gn/It),Pe=w(0),ke=w(0),n=w(0),T=P;do r=w(Tn(T+380+(q<<3)|0,Zi)),ie=w(Tn(T+364+(q<<3)|0,Zi)),ie=w(cc(r,w(Ur(ie,w(D[T+504>>2]))))),we?(r=w(ie*w(zr(T))),(r!=w(-0)?(kt=w(ie-w(qe*r)),Ul=w(kn(T,xn,kt,zt,En)),kt!=Ul):0)&&(Pe=w(Pe-w(Ul-ie)),n=w(n+r))):((vt?(tl=w(Br(T)),tl!=w(0)):0)?(kt=w(ie+w(pe*tl)),ql=w(kn(T,xn,kt,zt,En)),kt!=ql):0)&&(Pe=w(Pe-w(ql-ie)),ke=w(ke-tl)),T=t[T+960>>2]|0;while((T|0)!=0);if(n=w(_e+n),ie=w(gn+Pe),jl)n=w(0);else{qe=w(It+ke),we=t[Cu>>2]|0,vt=iew(0),qe=w(ie/qe),n=w(0);do{kt=w(Tn(P+380+(we<<3)|0,Zi)),Pe=w(Tn(P+364+(we<<3)|0,Zi)),Pe=w(cc(kt,w(Ur(Pe,w(D[P+504>>2]))))),vt?(kt=w(Pe*w(zr(P))),ie=w(-kt),kt!=w(-0)?(kt=w(pe*ie),ie=w(kn(P,xn,w(Pe+(Ln?ie:kt)),zt,En))):ie=Pe):(q?(zl=w(Br(P)),zl!=w(0)):0)?ie=w(kn(P,xn,w(Pe+w(qe*zl)),zt,En)):ie=Pe,n=w(n-w(ie-Pe)),ke=w(mt(P,xn,En)),r=w(mt(P,Vt,En)),ie=w(ie+ke),D[nu>>2]=ie,t[xu>>2]=1,Pe=w(D[P+396>>2]);e:do if(gt(Pe)|0){T=gt(xr)|0;do if(!T){if(Xi|(m0(P,Vt,xr)|0|Dr)||(T0(e,P)|0)!=4||(t[(hi(P,Vt)|0)+4>>2]|0)==3||(t[(Ai(P,Vt)|0)+4>>2]|0)==3)break;D[Fi>>2]=xr,t[go>>2]=1;break e}while(0);if(m0(P,Vt,xr)|0){T=t[P+992+(t[If>>2]<<2)>>2]|0,kt=w(r+w(Tn(T,xr))),D[Fi>>2]=kt,T=Pf&(t[T+4>>2]|0)==2,t[go>>2]=((gt(kt)|0|T)^1)&1;break}else{D[Fi>>2]=xr,t[go>>2]=T?0:2;break}}else kt=w(ie-ke),It=w(kt/Pe),kt=w(Pe*kt),t[go>>2]=1,D[Fi>>2]=w(r+(br?It:kt));while(0);Kt(P,xn,zt,En,xu,nu),Kt(P,Vt,xr,En,go,Fi);do if(m0(P,Vt,xr)|0?0:(T0(e,P)|0)==4){if((t[(hi(P,Vt)|0)+4>>2]|0)==3){T=0;break}T=(t[(Ai(P,Vt)|0)+4>>2]|0)!=3}else T=0;while(0);kt=w(D[nu>>2]),It=w(D[Fi>>2]),$l=t[xu>>2]|0,Qr=t[go>>2]|0,ht(P,br?kt:It,br?It:kt,Ei,br?$l:Qr,br?Qr:$l,En,Qi,y&(T^1),3488,k)|0,c[Tu>>0]=c[Tu>>0]|c[P+508>>0],P=t[P+960>>2]|0}while((P|0)!=0)}}else n=w(0);if(n=w(gn+n),Qr=n>0]=Qr|C[Tu>>0],Af&n>w(0)?(T=t[Cu>>2]|0,((t[e+364+(T<<3)+4>>2]|0)!=0?(Li=w(Tn(e+364+(T<<3)|0,Zi)),Li>=w(0)):0)?ie=w(Ur(w(0),w(Li-w(zt-n)))):ie=w(0)):ie=n,vt=Pn>>>0>>0,vt){we=t[eo>>2]|0,q=Pn,T=0;do P=t[we+(q<<2)>>2]|0,t[P+24>>2]|0||(T=((t[(hi(P,xn)|0)+4>>2]|0)==3&1)+T|0,T=T+((t[(Ai(P,xn)|0)+4>>2]|0)==3&1)|0),q=q+1|0;while((q|0)!=(Ht|0));T?(ke=w(0),r=w(0)):Kn=101}else Kn=101;e:do if((Kn|0)==101)switch(Kn=0,Ff|0){case 1:{T=0,ke=w(ie*w(.5)),r=w(0);break e}case 2:{T=0,ke=ie,r=w(0);break e}case 3:{if(l>>>0<=1){T=0,ke=w(0),r=w(0);break e}r=w((l+-1|0)>>>0),T=0,ke=w(0),r=w(w(Ur(ie,w(0)))/r);break e}case 5:{r=w(ie/w((l+1|0)>>>0)),T=0,ke=r;break e}case 4:{r=w(ie/w(l>>>0)),T=0,ke=w(r*w(.5));break e}default:{T=0,ke=w(0),r=w(0);break e}}while(0);if(n=w(Lf+ke),vt){Pe=w(ie/w(T|0)),q=t[eo>>2]|0,P=Pn,ie=w(0);do{T=t[q+(P<<2)>>2]|0;e:do if((t[T+36>>2]|0)!=1){switch(t[T+24>>2]|0){case 1:{if(X(T,xn)|0){if(!y)break e;kt=w(Y(T,xn,zt)),kt=w(kt+w(C0(e,xn))),kt=w(kt+w(Tr(T,xn,En))),D[T+400+(t[Qs>>2]<<2)>>2]=kt;break e}break}case 0:if(Qr=(t[(hi(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,y&&(Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(n+w(D[Qr>>2]))),Qr=(t[(Ai(T,xn)|0)+4>>2]|0)==3,kt=w(Pe+n),n=Qr?kt:n,Ro){kt=w(r+w(mt(T,xn,En))),ie=xr,n=w(n+w(kt+w(D[T+504>>2])));break e}else{n=w(n+w(r+w(ye(T,xn,En)))),ie=w(Ur(ie,w(ye(T,Vt,En))));break e}default:}y&&(kt=w(ke+w(C0(e,xn))),Qr=T+400+(t[Qs>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2])))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}else ie=w(0);if(r=w(Rf+n),Of?ke=w(w(kn(e,Vt,w(Ri+ie),cs,d))-Ri):ke=xr,Pe=w(w(kn(e,Vt,w(Ri+(Mf?xr:ie)),cs,d))-Ri),vt&y){P=Pn;do{q=t[(t[eo>>2]|0)+(P<<2)>>2]|0;do if((t[q+36>>2]|0)!=1){if((t[q+24>>2]|0)==1){if(X(q,Vt)|0){if(kt=w(Y(q,Vt,xr)),kt=w(kt+w(C0(e,Vt))),kt=w(kt+w(Tr(q,Vt,En))),T=t[Js>>2]|0,D[q+400+(T<<2)>>2]=kt,!(gt(kt)|0))break}else T=t[Js>>2]|0;kt=w(C0(e,Vt)),D[q+400+(T<<2)>>2]=w(kt+w(Tr(q,Vt,En)));break}T=T0(e,q)|0;do if((T|0)==4){if((t[(hi(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){Kn=139;break}if(m0(q,Vt,xr)|0){n=le;break}$l=t[q+908+(t[Cu>>2]<<2)>>2]|0,t[Fi>>2]=$l,n=w(D[q+396>>2]),Qr=gt(n)|0,ie=(t[j>>2]=$l,w(D[j>>2])),Qr?n=Pe:(gn=w(mt(q,Vt,En)),kt=w(ie/n),n=w(n*ie),n=w(gn+(br?kt:n))),D[nu>>2]=n,D[Fi>>2]=w(w(mt(q,xn,En))+ie),t[go>>2]=1,t[xu>>2]=1,Kt(q,xn,zt,En,go,Fi),Kt(q,Vt,xr,En,xu,nu),n=w(D[Fi>>2]),gn=w(D[nu>>2]),kt=br?n:gn,n=br?gn:n,Qr=((gt(kt)|0)^1)&1,ht(q,kt,n,Ei,Qr,((gt(n)|0)^1)&1,En,Qi,1,3493,k)|0,n=le}else Kn=139;while(0);e:do if((Kn|0)==139){Kn=0,n=w(ke-w(ye(q,Vt,En)));do if((t[(hi(q,Vt)|0)+4>>2]|0)==3){if((t[(Ai(q,Vt)|0)+4>>2]|0)!=3)break;n=w(le+w(Ur(w(0),w(n*w(.5)))));break e}while(0);if((t[(Ai(q,Vt)|0)+4>>2]|0)==3){n=le;break}if((t[(hi(q,Vt)|0)+4>>2]|0)==3){n=w(le+w(Ur(w(0),n)));break}switch(T|0){case 1:{n=le;break e}case 2:{n=w(le+w(n*w(.5)));break e}default:{n=w(le+n);break e}}}while(0);kt=w(Di+n),Qr=q+400+(t[Js>>2]<<2)|0,D[Qr>>2]=w(kt+w(D[Qr>>2]))}while(0);P=P+1|0}while((P|0)!=(Ht|0))}if(Di=w(Di+Pe),ss=w(Ur(ss,r)),l=Ji+1|0,Ht>>>0>=Ni>>>0)break;n=zt,Pn=Ht,Ji=l}do if(y){if(T=l>>>0>1,T?0:!(he(e)|0))break;if(!(gt(xr)|0)){n=w(xr-Di);e:do switch(t[e+12>>2]|0){case 3:{le=w(le+n),pe=w(0);break}case 2:{le=w(le+w(n*w(.5))),pe=w(0);break}case 4:{xr>Di?pe=w(n/w(l>>>0)):pe=w(0);break}case 7:if(xr>Di){le=w(le+w(n/w(l<<1>>>0))),pe=w(n/w(l>>>0)),pe=T?pe:w(0);break e}else{le=w(le+w(n*w(.5))),pe=w(0);break e}case 6:{pe=w(n/w(Ji>>>0)),pe=xr>Di&T?pe:w(0);break}default:pe=w(0)}while(0);if(l|0)for(vt=1040+(Vt<<2)|0,Ln=976+(Vt<<2)|0,we=0,P=0;;){e:do if(P>>>0>>0)for(ie=w(0),Pe=w(0),n=w(0),q=P;;){T=t[(t[eo>>2]|0)+(q<<2)>>2]|0;do if((t[T+36>>2]|0)!=1?(t[T+24>>2]|0)==0:0){if((t[T+940>>2]|0)!=(we|0))break e;if(We(T,Vt)|0&&(kt=w(D[T+908+(t[Ln>>2]<<2)>>2]),n=w(Ur(n,w(kt+w(mt(T,Vt,En)))))),(T0(e,T)|0)!=5)break;Li=w(et(T)),Li=w(Li+w(Tr(T,0,En))),kt=w(D[T+912>>2]),kt=w(w(kt+w(mt(T,0,En)))-Li),Li=w(Ur(Pe,Li)),kt=w(Ur(ie,kt)),ie=kt,Pe=Li,n=w(Ur(n,w(Li+kt)))}while(0);if(T=q+1|0,T>>>0>>0)q=T;else{q=T;break}}else Pe=w(0),n=w(0),q=P;while(0);if(qe=w(pe+n),r=le,le=w(le+qe),P>>>0>>0){ke=w(r+Pe),T=P;do{P=t[(t[eo>>2]|0)+(T<<2)>>2]|0;e:do if((t[P+36>>2]|0)!=1?(t[P+24>>2]|0)==0:0)switch(T0(e,P)|0){case 1:{kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 3:{kt=w(w(le-w(R0(P,Vt,En)))-w(D[P+908+(t[Ln>>2]<<2)>>2])),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 2:{kt=w(r+w(w(qe-w(D[P+908+(t[Ln>>2]<<2)>>2]))*w(.5))),D[P+400+(t[vt>>2]<<2)>>2]=kt;break e}case 4:{if(kt=w(r+w(Tr(P,Vt,En))),D[P+400+(t[vt>>2]<<2)>>2]=kt,m0(P,Vt,xr)|0||(br?(ie=w(D[P+908>>2]),n=w(ie+w(mt(P,xn,En))),Pe=qe):(Pe=w(D[P+912>>2]),Pe=w(Pe+w(mt(P,Vt,En))),n=qe,ie=w(D[P+908>>2])),Vr(n,ie)|0?Vr(Pe,w(D[P+912>>2]))|0:0))break e;ht(P,n,Pe,Ei,1,1,En,Qi,1,3501,k)|0;break e}case 5:{D[P+404>>2]=w(w(ke-w(et(P)))+w(Y(P,0,xr)));break e}default:break e}while(0);T=T+1|0}while((T|0)!=(q|0))}if(we=we+1|0,(we|0)==(l|0))break;P=q}}}while(0);if(D[e+908>>2]=w(kn(e,2,ls,d,d)),D[e+912>>2]=w(kn(e,0,Wl,_,d)),((ku|0)!=0?(Hl=t[e+32>>2]|0,bl=(ku|0)==2,!(bl&(Hl|0)!=2)):0)?bl&(Hl|0)==2&&(n=w(fs+zt),n=w(Ur(w(cc(n,w(Dt(e,xn,ss,Zi)))),fs)),Kn=198):(n=w(kn(e,xn,ss,Zi,d)),Kn=198),(Kn|0)==198&&(D[e+908+(t[976+(xn<<2)>>2]<<2)>>2]=n),((Au|0)!=0?(Vl=t[e+32>>2]|0,Yl=(Au|0)==2,!(Yl&(Vl|0)!=2)):0)?Yl&(Vl|0)==2&&(n=w(Ri+xr),n=w(Ur(w(cc(n,w(Dt(e,Vt,w(Ri+Di),cs)))),Ri)),Kn=204):(n=w(kn(e,Vt,w(Ri+Di),cs,d)),Kn=204),(Kn|0)==204&&(D[e+908+(t[976+(Vt<<2)>>2]<<2)>>2]=n),y){if((t[Gl>>2]|0)==2){P=976+(Vt<<2)|0,q=1040+(Vt<<2)|0,T=0;do we=e0(e,T)|0,t[we+24>>2]|0||($l=t[P>>2]|0,kt=w(D[e+908+($l<<2)>>2]),Qr=we+400+(t[q>>2]<<2)|0,kt=w(kt-w(D[Qr>>2])),D[Qr>>2]=w(kt-w(D[we+908+($l<<2)>>2]))),T=T+1|0;while((T|0)!=(Ni|0))}if(o|0){T=br?ku:s;do bt(e,o,En,T,Qi,Ei,k),o=t[o+960>>2]|0;while((o|0)!=0)}if(T=(xn|2|0)==3,P=(Vt|2|0)==3,T|P){o=0;do q=t[(t[eo>>2]|0)+(o<<2)>>2]|0,(t[q+36>>2]|0)!=1&&(T&&Zt(e,q,xn),P&&Zt(e,q,Vt)),o=o+1|0;while((o|0)!=(Ni|0))}}}while(0);h=Ou}function ki(e,n){e=e|0,n=w(n);var r=0;li(e,n>=w(0),3147),r=n==w(0),D[e+4>>2]=r?w(0):n}function Yr(e,n,r,o){e=e|0,n=w(n),r=w(r),o=o|0;var s=tt,l=tt,d=0,_=0,y=0;t[2278]=(t[2278]|0)+1,$r(e),m0(e,2,n)|0?(s=w(Tn(t[e+992>>2]|0,n)),y=1,s=w(s+w(mt(e,2,n)))):(s=w(Tn(e+380|0,n)),s>=w(0)?y=2:(y=((gt(n)|0)^1)&1,s=n)),m0(e,0,r)|0?(l=w(Tn(t[e+996>>2]|0,r)),_=1,l=w(l+w(mt(e,0,n)))):(l=w(Tn(e+388|0,r)),l>=w(0)?_=2:(_=((gt(r)|0)^1)&1,l=r)),d=e+976|0,(ht(e,s,l,o,y,_,n,r,1,3189,t[d>>2]|0)|0?(Yo(e,t[e+496>>2]|0,n,r,n),bi(e,w(D[(t[d>>2]|0)+4>>2]),w(0),w(0)),c[11696]|0):0)&&ff(e,7)}function $r(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;_=h,h=h+32|0,d=_+24|0,l=_+16|0,o=_+8|0,s=_,r=0;do n=e+380+(r<<3)|0,((t[e+380+(r<<3)+4>>2]|0)!=0?(y=n,k=t[y+4>>2]|0,T=o,t[T>>2]=t[y>>2],t[T+4>>2]=k,T=e+364+(r<<3)|0,k=t[T+4>>2]|0,y=s,t[y>>2]=t[T>>2],t[y+4>>2]=k,t[l>>2]=t[o>>2],t[l+4>>2]=t[o+4>>2],t[d>>2]=t[s>>2],t[d+4>>2]=t[s+4>>2],o0(l,d)|0):0)||(n=e+348+(r<<3)|0),t[e+992+(r<<2)>>2]=n,r=r+1|0;while((r|0)!=2);h=_}function m0(e,n,r){e=e|0,n=n|0,r=w(r);var o=0;switch(e=t[e+992+(t[976+(n<<2)>>2]<<2)>>2]|0,t[e+4>>2]|0){case 0:case 3:{e=0;break}case 1:{w(D[e>>2])>2])>2]|0){case 2:{n=w(w(w(D[e>>2])*n)/w(100));break}case 1:{n=w(D[e>>2]);break}default:n=w(J)}return w(n)}function Yo(e,n,r,o,s){e=e|0,n=n|0,r=w(r),o=w(o),s=w(s);var l=0,d=tt;n=t[e+944>>2]|0?n:1,l=N0(t[e+4>>2]|0,n)|0,n=Cl(l,n)|0,r=w(Wr(e,l,r)),o=w(Wr(e,n,o)),d=w(r+w(Tr(e,l,s))),D[e+400+(t[1040+(l<<2)>>2]<<2)>>2]=d,r=w(r+w(R0(e,l,s))),D[e+400+(t[1e3+(l<<2)>>2]<<2)>>2]=r,r=w(o+w(Tr(e,n,s))),D[e+400+(t[1040+(n<<2)>>2]<<2)>>2]=r,s=w(o+w(R0(e,n,s))),D[e+400+(t[1e3+(n<<2)>>2]<<2)>>2]=s}function bi(e,n,r,o){e=e|0,n=w(n),r=w(r),o=w(o);var s=0,l=0,d=tt,_=tt,y=0,k=0,T=tt,P=0,q=tt,we=tt,le=tt,ie=tt;if(n!=w(0)&&(s=e+400|0,ie=w(D[s>>2]),l=e+404|0,le=w(D[l>>2]),P=e+416|0,we=w(D[P>>2]),k=e+420|0,d=w(D[k>>2]),q=w(ie+r),T=w(le+o),o=w(q+we),_=w(T+d),y=(t[e+988>>2]|0)==1,D[s>>2]=w($0(ie,n,0,y)),D[l>>2]=w($0(le,n,0,y)),r=w(V4(w(we*n),w(1))),Vr(r,w(0))|0?l=0:l=(Vr(r,w(1))|0)^1,r=w(V4(w(d*n),w(1))),Vr(r,w(0))|0?s=0:s=(Vr(r,w(1))|0)^1,ie=w($0(o,n,y&l,y&(l^1))),D[P>>2]=w(ie-w($0(q,n,0,y))),ie=w($0(_,n,y&s,y&(s^1))),D[k>>2]=w(ie-w($0(T,n,0,y))),l=(t[e+952>>2]|0)-(t[e+948>>2]|0)>>2,l|0)){s=0;do bi(e0(e,s)|0,n,q,T),s=s+1|0;while((s|0)!=(l|0))}}function or(e,n,r,o,s){switch(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,r|0){case 5:case 0:{e=q8(t[489]|0,o,s)|0;break}default:e=AL(o,s)|0}return e|0}function zs(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;s=h,h=h+16|0,l=s,t[l>>2]=o,Ku(e,0,n,r,l),h=s}function Ku(e,n,r,o,s){if(e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,e=e|0?e:956,sD[t[e+8>>2]&1](e,n,r,o,s)|0,(r|0)==5)_n();else return}function J0(e,n,r){e=e|0,n=n|0,r=r|0,c[e+n>>0]=r&1}function af(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(S0(e,o),El(e,t[n>>2]|0,t[r>>2]|0,o))}function S0(e,n){e=e|0,n=n|0;var r=0;if((Q0(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function El(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function Q0(e){return e=e|0,1073741823}function Tr(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?e=e+92|0:e=en(e+60|0,t[1040+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function R0(e,n,r){return e=e|0,n=n|0,r=w(r),(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?e=e+100|0:e=en(e+60|0,t[1e3+(n<<2)>>2]|0,992)|0,w(uo(e,r))}function Nr(e){return e=e|0,(e|1|0)==3|0}function uo(e,n){return e=e|0,n=w(n),(t[e+4>>2]|0)==3?n=w(0):n=w(Tn(e,n)),w(n)}function so(e,n){return e=e|0,n=n|0,e=t[e>>2]|0,((e|0)==0?(n|0)>1?n:1:e)|0}function N0(e,n){e=e|0,n=n|0;var r=0;e:do if((n|0)==2){switch(e|0){case 2:{e=3;break e}case 3:break;default:{r=4;break e}}e=2}else r=4;while(0);return e|0}function C0(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+312>>2]|0)!=0:0)?(r=w(D[e+308>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1040+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function di(e,n){e=e|0,n=n|0;var r=tt;return((Nr(n)|0?(t[e+320>>2]|0)!=0:0)?(r=w(D[e+316>>2]),r>=w(0)):0)||(r=w(Ur(w(D[(en(e+276|0,t[1e3+(n<<2)>>2]|0,992)|0)>>2]),w(0)))),w(r)}function u0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+240>>2]|0)!=0:0)?(o=w(Tn(e+236|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1040+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function v0(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return((Nr(n)|0?(t[e+248>>2]|0)!=0:0)?(o=w(Tn(e+244|0,r)),o>=w(0)):0)||(o=w(Ur(w(Tn(en(e+204|0,t[1e3+(n<<2)>>2]|0,992)|0,r)),w(0)))),w(o)}function To(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt,P=tt,q=tt,we=0,le=0,ie=0;ie=h,h=h+16|0,we=ie,le=e+964|0,i0(e,(t[le>>2]|0)!=0,3519),_=w(Fn(e,2,n)),y=w(Fn(e,0,n)),k=w(mt(e,2,n)),T=w(mt(e,0,n)),gt(n)|0?P=n:P=w(Ur(w(0),w(w(n-k)-_))),gt(r)|0?q=r:q=w(Ur(w(0),w(w(r-T)-y))),(o|0)==1&(s|0)==1?(D[e+908>>2]=w(kn(e,2,w(n-k),l,l)),n=w(kn(e,0,w(r-T),d,l))):(lD[t[le>>2]&1](we,e,P,o,q,s),P=w(_+w(D[we>>2])),q=w(n-k),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?P:q,l,l)),q=w(y+w(D[we+4>>2])),n=w(r-T),n=w(kn(e,0,(s|2|0)==2?q:n,d,l))),D[e+912>>2]=n,h=ie}function pu(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=tt,y=tt,k=tt,T=tt;k=w(Fn(e,2,l)),_=w(Fn(e,0,l)),T=w(mt(e,2,l)),y=w(mt(e,0,l)),n=w(n-T),D[e+908>>2]=w(kn(e,2,(o|2|0)==2?k:n,l,l)),r=w(r-y),D[e+912>>2]=w(kn(e,0,(s|2|0)==2?_:r,d,l))}function Sl(e,n,r,o,s,l,d){e=e|0,n=w(n),r=w(r),o=o|0,s=s|0,l=w(l),d=w(d);var _=0,y=tt,k=tt;return _=(o|0)==2,((n<=w(0)&_?0:!(r<=w(0)&(s|0)==2))?!((o|0)==1&(s|0)==1):0)?e=0:(y=w(mt(e,0,l)),k=w(mt(e,2,l)),_=n>2]=w(kn(e,2,_?w(0):n,l,l)),n=w(r-y),_=r>2]=w(kn(e,0,_?w(0):n,d,l)),e=1),e|0}function Cl(e,n){return e=e|0,n=n|0,qt(e)|0?e=N0(2,n)|0:e=0,e|0}function B0(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(u0(e,n,r)),w(r+w(C0(e,n)))}function hu(e,n,r){return e=e|0,n=n|0,r=w(r),r=w(v0(e,n,r)),w(r+w(di(e,n)))}function Fn(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(B0(e,n,r)),w(o+w(hu(e,n,r)))}function pi(e){return e=e|0,t[e+24>>2]|0?e=0:w(Br(e))!=w(0)?e=1:e=w(zr(e))!=w(0),e|0}function Br(e){e=e|0;var n=tt;if(t[e+944>>2]|0){if(n=w(D[e+44>>2]),gt(n)|0)return n=w(D[e+40>>2]),e=n>w(0)&((gt(n)|0)^1),w(e?n:w(0))}else n=w(0);return w(n)}function zr(e){e=e|0;var n=tt,r=0,o=tt;do if(t[e+944>>2]|0){if(n=w(D[e+48>>2]),gt(n)|0){if(r=c[(t[e+976>>2]|0)+2>>0]|0,r<<24>>24==0?(o=w(D[e+40>>2]),o>24?w(1):w(0)}}else n=w(0);while(0);return w(n)}function lo(e){e=e|0;var n=0,r=0;if(pa(e+400|0,0,540)|0,c[e+985>>0]=1,bo(e),r=fi(e)|0,r|0){n=e+948|0,e=0;do lo(t[(t[n>>2]|0)+(e<<2)>>2]|0),e=e+1|0;while((e|0)!=(r|0))}}function wr(e,n,r,o,s,l,d,_,y,k){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=w(l),d=w(d),_=_|0,y=y|0,k=k|0;var T=0,P=tt,q=0,we=0,le=tt,ie=tt,Pe=0,ke=tt,qe=0,pe=tt,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0;Dr=h,h=h+16|0,Ln=Dr+12|0,Ht=Dr+8|0,It=Dr+4|0,gn=Dr,zt=N0(t[e+4>>2]|0,y)|0,_e=Nr(zt)|0,P=w(Tn(Ut(n)|0,_e?l:d)),vt=m0(n,2,l)|0,Pn=m0(n,0,d)|0;do if(gt(P)|0?0:!(gt(_e?r:s)|0)){if(T=n+504|0,!(gt(w(D[T>>2]))|0)&&(!(fn(t[n+976>>2]|0,0)|0)||(t[n+500>>2]|0)==(t[2278]|0)))break;D[T>>2]=w(Ur(P,w(Fn(n,zt,l))))}else q=7;while(0);do if((q|0)==7){if(qe=_e^1,!(qe|vt^1)){d=w(Tn(t[n+992>>2]|0,l)),D[n+504>>2]=w(Ur(d,w(Fn(n,2,l))));break}if(!(_e|Pn^1)){d=w(Tn(t[n+996>>2]|0,d)),D[n+504>>2]=w(Ur(d,w(Fn(n,0,l))));break}D[Ln>>2]=w(J),D[Ht>>2]=w(J),t[It>>2]=0,t[gn>>2]=0,ke=w(mt(n,2,l)),pe=w(mt(n,0,l)),vt?(le=w(ke+w(Tn(t[n+992>>2]|0,l))),D[Ln>>2]=le,t[It>>2]=1,we=1):(we=0,le=w(J)),Pn?(P=w(pe+w(Tn(t[n+996>>2]|0,d))),D[Ht>>2]=P,t[gn>>2]=1,T=1):(T=0,P=w(J)),q=t[e+32>>2]|0,_e&(q|0)==2?q=2:(gt(le)|0?!(gt(r)|0):0)&&(D[Ln>>2]=r,t[It>>2]=2,we=2,le=r),(((q|0)==2&qe?0:gt(P)|0)?!(gt(s)|0):0)&&(D[Ht>>2]=s,t[gn>>2]=2,T=2,P=s),ie=w(D[n+396>>2]),Pe=gt(ie)|0;do if(Pe)q=we;else{if((we|0)==1&qe){D[Ht>>2]=w(w(le-ke)/ie),t[gn>>2]=1,T=1,q=1;break}_e&(T|0)==1?(D[Ln>>2]=w(ie*w(P-pe)),t[It>>2]=1,T=1,q=1):q=we}while(0);Ki=gt(r)|0,we=(T0(e,n)|0)!=4,(_e|vt|((o|0)!=1|Ki)|(we|(q|0)==1)?0:(D[Ln>>2]=r,t[It>>2]=1,!Pe))&&(D[Ht>>2]=w(w(r-ke)/ie),t[gn>>2]=1,T=1),(Pn|qe|((_|0)!=1|(gt(s)|0))|(we|(T|0)==1)?0:(D[Ht>>2]=s,t[gn>>2]=1,!Pe))&&(D[Ln>>2]=w(ie*w(s-pe)),t[It>>2]=1),Kt(n,2,l,l,It,Ln),Kt(n,0,d,l,gn,Ht),r=w(D[Ln>>2]),s=w(D[Ht>>2]),ht(n,r,s,y,t[It>>2]|0,t[gn>>2]|0,l,d,0,3565,k)|0,d=w(D[n+908+(t[976+(zt<<2)>>2]<<2)>>2]),D[n+504>>2]=w(Ur(d,w(Fn(n,zt,l))))}while(0);t[n+500>>2]=t[2278],h=Dr}function kn(e,n,r,o,s){return e=e|0,n=n|0,r=w(r),o=w(o),s=w(s),o=w(Dt(e,n,r,o)),w(Ur(o,w(Fn(e,n,s))))}function T0(e,n){return e=e|0,n=n|0,n=n+20|0,n=t[((t[n>>2]|0)==0?e+16|0:n)>>2]|0,((n|0)==5?qt(t[e+4>>2]|0)|0:0)&&(n=1),n|0}function hi(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+96>>2]|0)!=0:0)?n=4:n=t[1040+(n<<2)>>2]|0,e+60+(n<<3)|0}function Ai(e,n){return e=e|0,n=n|0,(Nr(n)|0?(t[e+104>>2]|0)!=0:0)?n=5:n=t[1e3+(n<<2)>>2]|0,e+60+(n<<3)|0}function Kt(e,n,r,o,s,l){switch(e=e|0,n=n|0,r=w(r),o=w(o),s=s|0,l=l|0,r=w(Tn(e+380+(t[976+(n<<2)>>2]<<3)|0,r)),r=w(r+w(mt(e,n,o))),t[s>>2]|0){case 2:case 1:{s=gt(r)|0,o=w(D[l>>2]),D[l>>2]=s|o>2]=2,D[l>>2]=r);break}default:}}function X(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,4,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1040+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function Y(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,4,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1040+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function ye(e,n,r){e=e|0,n=n|0,r=w(r);var o=tt;return o=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),o=w(o+w(Tr(e,n,r))),w(o+w(R0(e,n,r)))}function he(e){e=e|0;var n=0,r=0,o=0;e:do if(qt(t[e+4>>2]|0)|0)n=0;else if((t[e+16>>2]|0)!=5)if(r=fi(e)|0,!r)n=0;else for(n=0;;){if(o=e0(e,n)|0,(t[o+24>>2]|0)==0?(t[o+20>>2]|0)==5:0){n=1;break e}if(n=n+1|0,n>>>0>=r>>>0){n=0;break}}else n=1;while(0);return n|0}function We(e,n){e=e|0,n=n|0;var r=tt;return r=w(D[e+908+(t[976+(n<<2)>>2]<<2)>>2]),r>=w(0)&((gt(r)|0)^1)|0}function et(e){e=e|0;var n=tt,r=0,o=0,s=0,l=0,d=0,_=0,y=tt;if(r=t[e+968>>2]|0,r)y=w(D[e+908>>2]),n=w(D[e+912>>2]),n=w(rD[r&0](e,y,n)),i0(e,(gt(n)|0)^1,3573);else{l=fi(e)|0;do if(l|0){for(r=0,s=0;;){if(o=e0(e,s)|0,t[o+940>>2]|0){d=8;break}if((t[o+24>>2]|0)!=1)if(_=(T0(e,o)|0)==5,_){r=o;break}else r=(r|0)==0?o:r;if(s=s+1|0,s>>>0>=l>>>0){d=8;break}}if((d|0)==8&&!r)break;return n=w(et(r)),w(n+w(D[r+404>>2]))}while(0);n=w(D[e+912>>2])}return w(n)}function Dt(e,n,r,o){e=e|0,n=n|0,r=w(r),o=w(o);var s=tt,l=0;return qt(n)|0?(n=1,l=3):Nr(n)|0?(n=0,l=3):(o=w(J),s=w(J)),(l|0)==3&&(s=w(Tn(e+364+(n<<3)|0,o)),o=w(Tn(e+380+(n<<3)|0,o))),l=o=w(0)&((gt(o)|0)^1)),r=l?o:r,l=s>=w(0)&((gt(s)|0)^1)&r>2]|0,l)|0,le=Cl(Pe,l)|0,ie=Nr(Pe)|0,P=w(mt(n,2,r)),q=w(mt(n,0,r)),m0(n,2,r)|0?_=w(P+w(Tn(t[n+992>>2]|0,r))):(X(n,2)|0?_t(n,2)|0:0)?(_=w(D[e+908>>2]),y=w(C0(e,2)),y=w(_-w(y+w(di(e,2)))),_=w(Y(n,2,r)),_=w(kn(n,2,w(y-w(_+w(_r(n,2,r)))),r,r))):_=w(J),m0(n,0,s)|0?y=w(q+w(Tn(t[n+996>>2]|0,s))):(X(n,0)|0?_t(n,0)|0:0)?(y=w(D[e+912>>2]),qe=w(C0(e,0)),qe=w(y-w(qe+w(di(e,0)))),y=w(Y(n,0,s)),y=w(kn(n,0,w(qe-w(y+w(_r(n,0,s)))),s,r))):y=w(J),k=gt(_)|0,T=gt(y)|0;do if(k^T?(we=w(D[n+396>>2]),!(gt(we)|0)):0)if(k){_=w(P+w(w(y-q)*we));break}else{qe=w(q+w(w(_-P)/we)),y=T?qe:y;break}while(0);T=gt(_)|0,k=gt(y)|0,T|k&&(pe=(T^1)&1,o=r>w(0)&((o|0)!=0&T),_=ie?_:o?r:_,ht(n,_,y,l,ie?pe:o?2:pe,T&(k^1)&1,_,y,0,3623,d)|0,_=w(D[n+908>>2]),_=w(_+w(mt(n,2,r))),y=w(D[n+912>>2]),y=w(y+w(mt(n,0,r)))),ht(n,_,y,l,1,1,_,y,1,3635,d)|0,(_t(n,Pe)|0?!(X(n,Pe)|0):0)?(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,Pe))),qe=w(qe-w(R0(n,Pe,r))),qe=w(qe-w(_r(n,Pe,ie?r:s))),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe):ke=21;do if((ke|0)==21){if(X(n,Pe)|0?0:(t[e+8>>2]|0)==1){pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe;break}(X(n,Pe)|0?0:(t[e+8>>2]|0)==2)&&(pe=t[976+(Pe<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(Pe<<2)>>2]<<2)>>2]=qe)}while(0);(_t(n,le)|0?!(X(n,le)|0):0)?(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),qe=w(qe-w(di(e,le))),qe=w(qe-w(R0(n,le,r))),qe=w(qe-w(_r(n,le,ie?s:r))),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe):ke=30;do if((ke|0)==30?!(X(n,le)|0):0){if((T0(e,n)|0)==2){pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(w(qe-w(D[n+908+(pe<<2)>>2]))*w(.5)),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe;break}pe=(T0(e,n)|0)==3,pe^(t[e+28>>2]|0)==2&&(pe=t[976+(le<<2)>>2]|0,qe=w(D[e+908+(pe<<2)>>2]),qe=w(qe-w(D[n+908+(pe<<2)>>2])),D[n+400+(t[1040+(le<<2)>>2]<<2)>>2]=qe)}while(0)}function Zt(e,n,r){e=e|0,n=n|0,r=r|0;var o=tt,s=0;s=t[976+(r<<2)>>2]|0,o=w(D[n+908+(s<<2)>>2]),o=w(w(D[e+908+(s<<2)>>2])-o),o=w(o-w(D[n+400+(t[1040+(r<<2)>>2]<<2)>>2])),D[n+400+(t[1e3+(r<<2)>>2]<<2)>>2]=o}function qt(e){return e=e|0,(e|1|0)==1|0}function Ut(e){e=e|0;var n=tt;switch(t[e+56>>2]|0){case 0:case 3:{n=w(D[e+40>>2]),n>w(0)&((gt(n)|0)^1)?e=c[(t[e+976>>2]|0)+2>>0]|0?1056:992:e=1056;break}default:e=e+52|0}return e|0}function fn(e,n){return e=e|0,n=n|0,(c[e+n>>0]|0)!=0|0}function _t(e,n){return e=e|0,n=n|0,e=e+132|0,(Nr(n)|0?(t[(en(e,5,948)|0)+4>>2]|0)!=0:0)?e=1:e=(t[(en(e,t[1e3+(n<<2)>>2]|0,948)|0)+4>>2]|0)!=0,e|0}function _r(e,n,r){e=e|0,n=n|0,r=w(r);var o=0,s=0;return e=e+132|0,(Nr(n)|0?(o=en(e,5,948)|0,(t[o+4>>2]|0)!=0):0)?s=4:(o=en(e,t[1e3+(n<<2)>>2]|0,948)|0,t[o+4>>2]|0?s=4:r=w(0)),(s|0)==4&&(r=w(Tn(o,r))),w(r)}function Wr(e,n,r){return e=e|0,n=n|0,r=w(r),X(e,n)|0?r=w(Y(e,n,r)):r=w(-w(_r(e,n,r))),w(r)}function Ar(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function z(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function dr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Or(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function Qn(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;if(d=e+4|0,_=t[d>>2]|0,s=_-o|0,l=s>>2,e=n+(l<<2)|0,e>>>0>>0){o=_;do t[o>>2]=t[e>>2],e=e+4|0,o=(t[d>>2]|0)+4|0,t[d>>2]=o;while(e>>>0>>0)}l|0&&Y1(_+(0-l<<2)|0,n|0,s|0)|0}function nn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return _=n+4|0,y=t[_>>2]|0,s=t[e>>2]|0,d=r,l=d-s|0,o=y+(0-(l>>2)<<2)|0,t[_>>2]=o,(l|0)>0&&vn(o|0,s|0,l|0)|0,s=e+4|0,l=n+8|0,o=(t[s>>2]|0)-d|0,(o|0)>0&&(vn(t[l>>2]|0,r|0,o|0)|0,t[l>>2]=(t[l>>2]|0)+(o>>>2<<2)),d=t[e>>2]|0,t[e>>2]=t[_>>2],t[_>>2]=d,d=t[s>>2]|0,t[s>>2]=t[l>>2],t[l>>2]=d,d=e+8|0,r=n+12|0,e=t[d>>2]|0,t[d>>2]=t[r>>2],t[r>>2]=e,t[n>>2]=t[_>>2],y|0}function s0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(d=t[n>>2]|0,l=t[r>>2]|0,(d|0)!=(l|0)){s=e+8|0,r=((l+-4-d|0)>>>2)+1|0,e=d,o=t[s>>2]|0;do t[o>>2]=t[e>>2],o=(t[s>>2]|0)+4|0,t[s>>2]=o,e=e+4|0;while((e|0)!=(l|0));t[n>>2]=d+(r<<2)}}function t0(){_l()}function g0(){var e=0;return e=Tt(4)|0,Kr(e),e|0}function Kr(e){e=e|0,t[e>>2]=a0()|0}function _0(e){e=e|0,e|0&&(Gi(e),Ve(e))}function Gi(e){e=e|0,V0(t[e>>2]|0)}function fo(e,n,r){e=e|0,n=n|0,r=r|0,J0(t[e>>2]|0,n,r)}function x0(e,n){e=e|0,n=w(n),ki(t[e>>2]|0,n)}function Xu(e,n){return e=e|0,n=n|0,fn(t[e>>2]|0,n)|0}function Z0(){var e=0;return e=Tt(8)|0,df(e,0),e|0}function df(e,n){e=e|0,n=n|0,n?n=I0(t[n>>2]|0)|0:n=qu()|0,t[e>>2]=n,t[e+4>>2]=0,Bs(n,e)}function Ba(e){e=e|0;var n=0;return n=Tt(8)|0,df(n,e),n|0}function Oc(e){e=e|0,e|0&&(mu(e),Ve(e))}function mu(e){e=e|0;var n=0;Wu(t[e>>2]|0),n=e+4|0,e=t[n>>2]|0,t[n>>2]=0,e|0&&(Ju(e),Ve(e))}function Ju(e){e=e|0,ei(e)}function ei(e){e=e|0,e=t[e>>2]|0,e|0&&ju(e|0)}function Yf(e){return e=e|0,Vu(e)|0}function pf(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),Do(t[e>>2]|0)}function ja(e,n){e=e|0,n=n|0,Gu(t[e>>2]|0,t[n>>2]|0)}function Ua(e,n){e=e|0,n=n|0,W(t[e>>2]|0,n)}function Ic(e,n,r){e=e|0,n=n|0,r=+r,yn(t[e>>2]|0,n,w(r))}function vu(e,n,r){e=e|0,n=n|0,r=+r,sn(t[e>>2]|0,n,w(r))}function $f(e,n){e=e|0,n=n|0,R(t[e>>2]|0,n)}function gu(e,n){e=e|0,n=n|0,H(t[e>>2]|0,n)}function co(e,n){e=e|0,n=n|0,ue(t[e>>2]|0,n)}function qa(e,n){e=e|0,n=n|0,M0(t[e>>2]|0,n)}function Ws(e,n){e=e|0,n=n|0,Fe(t[e>>2]|0,n)}function za(e,n){e=e|0,n=n|0,Lr(t[e>>2]|0,n)}function Pc(e,n,r){e=e|0,n=n|0,r=+r,rn(t[e>>2]|0,n,w(r))}function Qu(e,n,r){e=e|0,n=n|0,r=+r,Hn(t[e>>2]|0,n,w(r))}function Mc(e,n){e=e|0,n=n|0,Cr(t[e>>2]|0,n)}function Fc(e,n){e=e|0,n=n|0,K(t[e>>2]|0,n)}function Lc(e,n){e=e|0,n=n|0,je(t[e>>2]|0,n)}function Kf(e,n){e=e|0,n=+n,rt(t[e>>2]|0,w(n))}function Tl(e,n){e=e|0,n=+n,wt(t[e>>2]|0,w(n))}function xl(e,n){e=e|0,n=+n,lt(t[e>>2]|0,w(n))}function hf(e,n){e=e|0,n=+n,st(t[e>>2]|0,w(n))}function xo(e,n){e=e|0,n=+n,xt(t[e>>2]|0,w(n))}function mf(e,n){e=e|0,n=+n,Qt(t[e>>2]|0,w(n))}function Wa(e,n){e=e|0,n=+n,Cn(t[e>>2]|0,w(n))}function ti(e){e=e|0,bn(t[e>>2]|0)}function Hs(e,n){e=e|0,n=+n,h0(t[e>>2]|0,w(n))}function mi(e,n){e=e|0,n=+n,ci(t[e>>2]|0,w(n))}function vi(e){e=e|0,xi(t[e>>2]|0)}function Xf(e,n){e=e|0,n=+n,qr(t[e>>2]|0,w(n))}function Rc(e,n){e=e|0,n=+n,Eo(t[e>>2]|0,w(n))}function Jf(e,n){e=e|0,n=+n,wl(t[e>>2]|0,w(n))}function ao(e,n){e=e|0,n=+n,js(t[e>>2]|0,w(n))}function $o(e,n){e=e|0,n=+n,du(t[e>>2]|0,w(n))}function kl(e,n){e=e|0,n=+n,Yu(t[e>>2]|0,w(n))}function Nc(e,n){e=e|0,n=+n,oo(t[e>>2]|0,w(n))}function Al(e,n){e=e|0,n=+n,Hi(t[e>>2]|0,w(n))}function vf(e,n){e=e|0,n=+n,F0(t[e>>2]|0,w(n))}function Qf(e,n,r){e=e|0,n=n|0,r=+r,ft(t[e>>2]|0,n,w(r))}function k0(e,n,r){e=e|0,n=n|0,r=+r,He(t[e>>2]|0,n,w(r))}function v(e,n,r){e=e|0,n=n|0,r=+r,Qe(t[e>>2]|0,n,w(r))}function m(e){return e=e|0,ve(t[e>>2]|0)|0}function S(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,ar(s,t[n>>2]|0,r),O(e,s),h=o}function O(e,n){e=e|0,n=n|0,M(e,t[n+4>>2]|0,+w(D[n>>2]))}function M(e,n,r){e=e|0,n=n|0,r=+r,t[e>>2]=n,L[e+8>>3]=r}function b(e){return e=e|0,U(t[e>>2]|0)|0}function ee(e){return e=e|0,fe(t[e>>2]|0)|0}function Ye(e){return e=e|0,de(t[e>>2]|0)|0}function Ze(e){return e=e|0,au(t[e>>2]|0)|0}function ut(e){return e=e|0,Ge(t[e>>2]|0)|0}function In(e){return e=e|0,F(t[e>>2]|0)|0}function A0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,d0(s,t[n>>2]|0,r),O(e,s),h=o}function jr(e){return e=e|0,xe(t[e>>2]|0)|0}function gi(e){return e=e|0,Xe(t[e>>2]|0)|0}function po(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Rt(o,t[n>>2]|0),O(e,o),h=r}function _i(e){return e=e|0,+ +w(yl(t[e>>2]|0))}function Re(e){return e=e|0,+ +w(cu(t[e>>2]|0))}function Ce(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,p0(o,t[n>>2]|0),O(e,o),h=r}function ze(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,E0(o,t[n>>2]|0),O(e,o),h=r}function Et(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,So(o,t[n>>2]|0),O(e,o),h=r}function on(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Dl(o,t[n>>2]|0),O(e,o),h=r}function sr(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Us(o,t[n>>2]|0),O(e,o),h=r}function mn(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,qs(o,t[n>>2]|0),O(e,o),h=r}function pr(e){return e=e|0,+ +w(Gr(t[e>>2]|0))}function Hr(e,n){return e=e|0,n=n|0,+ +w(St(t[e>>2]|0,n))}function Vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Ne(s,t[n>>2]|0,r),O(e,s),h=o}function ni(e,n,r){e=e|0,n=n|0,r=r|0,Ns(t[e>>2]|0,t[n>>2]|0,r)}function Zf(e,n){e=e|0,n=n|0,D0(t[e>>2]|0,t[n>>2]|0)}function Pm(e){return e=e|0,fi(t[e>>2]|0)|0}function Ha(e){return e=e|0,e=nr(t[e>>2]|0)|0,e?e=Yf(e)|0:e=0,e|0}function vd(e,n){return e=e|0,n=n|0,e=e0(t[e>>2]|0,n)|0,e?e=Yf(e)|0:e=0,e|0}function gd(e,n){e=e|0,n=n|0;var r=0,o=0;o=Tt(4)|0,ba(o,n),r=e+4|0,n=t[r>>2]|0,t[r>>2]=o,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,1)}function ba(e,n){e=e|0,n=n|0,Oo(e,n)}function Bc(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Mm(_,Vu(n)|0,+r,o,+s,l),D[e>>2]=w(+L[_>>3]),D[e+4>>2]=w(+L[_+8>>3]),h=d}function Mm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0,_=0,y=0,k=0,T=0;d=h,h=h+32|0,T=d+8|0,k=d+20|0,y=d,_=d+16|0,L[T>>3]=r,t[k>>2]=o,L[y>>3]=s,t[_>>2]=l,_d(e,t[n+4>>2]|0,T,k,y,_),h=d}function _d(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0;d=h,h=h+16|0,_=d,Zo(_),n=Oi(n)|0,Fm(e,n,+L[r>>3],t[o>>2]|0,+L[s>>3],t[l>>2]|0),eu(_),h=d}function Oi(e){return e=e|0,t[e>>2]|0}function Fm(e,n,r,o,s,l){e=e|0,n=n|0,r=+r,o=o|0,s=+s,l=l|0;var d=0;d=ko(yd()|0)|0,r=+Ko(r),o=jc(o)|0,s=+Ko(s),Ga(e,ro(0,d|0,n|0,+r,o|0,+s,jc(l)|0)|0)}function yd(){var e=0;return c[7608]|0||(Ed(9120),e=7608,t[e>>2]=1,t[e+4>>2]=0),9120}function ko(e){return e=e|0,t[e+8>>2]|0}function Ko(e){return e=+e,+ +Ol(e)}function jc(e){return e=e|0,Dd(e)|0}function Ga(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=n,o&1?(Lm(r,0),c0(o|0,r|0)|0,Va(e,r),Wn(r)):(t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]),h=s}function Lm(e,n){e=e|0,n=n|0,wd(e,n),t[e+8>>2]=0,c[e+24>>0]=0}function Va(e,n){e=e|0,n=n|0,n=n+8|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2]}function Wn(e){e=e|0,c[e+24>>0]=0}function wd(e,n){e=e|0,n=n|0,t[e>>2]=n}function Dd(e){return e=e|0,e|0}function Ol(e){return e=+e,+e}function Ed(e){e=e|0,Ao(e,Rm()|0,4)}function Rm(){return 1064}function Ao(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=hl(n|0,r+1|0)|0}function Oo(e,n){e=e|0,n=n|0,n=t[n>>2]|0,t[e>>2]=n,qi(n|0)}function Nm(e){e=e|0;var n=0,r=0;r=e+4|0,n=t[r>>2]|0,t[r>>2]=0,n|0&&(Ju(n),Ve(n)),bu(t[e>>2]|0,0)}function Uc(e){e=e|0,rr(t[e>>2]|0)}function Ya(e){return e=e|0,Go(t[e>>2]|0)|0}function Sd(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,Yr(t[e>>2]|0,w(n),w(r),o)}function Cd(e){return e=e|0,+ +w(ir(t[e>>2]|0))}function ho(e){return e=e|0,+ +w(Y0(t[e>>2]|0))}function bs(e){return e=e|0,+ +w(L0(t[e>>2]|0))}function $a(e){return e=e|0,+ +w(Co(t[e>>2]|0))}function Td(e){return e=e|0,+ +w($u(t[e>>2]|0))}function qc(e){return e=e|0,+ +w(Vo(t[e>>2]|0))}function xd(e,n){e=e|0,n=n|0,L[e>>3]=+w(ir(t[n>>2]|0)),L[e+8>>3]=+w(Y0(t[n>>2]|0)),L[e+16>>3]=+w(L0(t[n>>2]|0)),L[e+24>>3]=+w(Co(t[n>>2]|0)),L[e+32>>3]=+w($u(t[n>>2]|0)),L[e+40>>3]=+w(Vo(t[n>>2]|0))}function Ka(e,n){return e=e|0,n=n|0,+ +w(Rr(t[e>>2]|0,n))}function kd(e,n){return e=e|0,n=n|0,+ +w(Jn(t[e>>2]|0,n))}function Xa(e,n){return e=e|0,n=n|0,+ +w(ai(t[e>>2]|0,n))}function Ja(){return Rs()|0}function Gs(){Bm(),Vs(),Ad(),Od(),Qa(),jm()}function Bm(){hO(11713,4938,1)}function Vs(){FA(10448)}function Ad(){hA(10408)}function Od(){Bk(10324)}function Qa(){Gx(10096)}function jm(){Um(9132)}function Um(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0,Ki=0,Xi=0,Ji=0,Ro=0,kf=0,Af=0,Cu=0,Of=0,Js=0,Qs=0,If=0,Pf=0,Mf=0,Kn=0,Tu=0,Ff=0,us=0,Lf=0,Rf=0,Zs=0,el=0,ss=0,Fi=0,nu=0,go=0,xu=0,jl=0,Ul=0,tl=0,ql=0,zl=0,Li=0,Di=0,ku=0,xr=0,Wl=0,Qi=0,ls=0,Zi=0,fs=0,Hl=0,bl=0,cs=0,Ri=0,Au=0,Gl=0,Vl=0,Yl=0,En=0,br=0,Ei=0,eo=0,Ni=0,xn=0,Vt=0,Ou=0;n=h,h=h+672|0,r=n+656|0,Ou=n+648|0,Vt=n+640|0,xn=n+632|0,Ni=n+624|0,eo=n+616|0,Ei=n+608|0,br=n+600|0,En=n+592|0,Yl=n+584|0,Vl=n+576|0,Gl=n+568|0,Au=n+560|0,Ri=n+552|0,cs=n+544|0,bl=n+536|0,Hl=n+528|0,fs=n+520|0,Zi=n+512|0,ls=n+504|0,Qi=n+496|0,Wl=n+488|0,xr=n+480|0,ku=n+472|0,Di=n+464|0,Li=n+456|0,zl=n+448|0,ql=n+440|0,tl=n+432|0,Ul=n+424|0,jl=n+416|0,xu=n+408|0,go=n+400|0,nu=n+392|0,Fi=n+384|0,ss=n+376|0,el=n+368|0,Zs=n+360|0,Rf=n+352|0,Lf=n+344|0,us=n+336|0,Ff=n+328|0,Tu=n+320|0,Kn=n+312|0,Mf=n+304|0,Pf=n+296|0,If=n+288|0,Qs=n+280|0,Js=n+272|0,Of=n+264|0,Cu=n+256|0,Af=n+248|0,kf=n+240|0,Ro=n+232|0,Ji=n+224|0,Xi=n+216|0,Ki=n+208|0,Dr=n+200|0,zt=n+192|0,Pn=n+184|0,gn=n+176|0,It=n+168|0,Ht=n+160|0,Ln=n+152|0,vt=n+144|0,_e=n+136|0,pe=n+128|0,qe=n+120|0,ke=n+112|0,Pe=n+104|0,ie=n+96|0,le=n+88|0,we=n+80|0,q=n+72|0,P=n+64|0,T=n+56|0,k=n+48|0,y=n+40|0,_=n+32|0,d=n+24|0,l=n+16|0,s=n+8|0,o=n,qm(e,3646),Id(e,3651,2)|0,Pd(e,3665,2)|0,zm(e,3682,18)|0,t[Ou>>2]=19,t[Ou+4>>2]=0,t[r>>2]=t[Ou>>2],t[r+4>>2]=t[Ou+4>>2],gf(e,3690,r)|0,t[Vt>>2]=1,t[Vt+4>>2]=0,t[r>>2]=t[Vt>>2],t[r+4>>2]=t[Vt+4>>2],Md(e,3696,r)|0,t[xn>>2]=2,t[xn+4>>2]=0,t[r>>2]=t[xn>>2],t[r+4>>2]=t[xn+4>>2],Xr(e,3706,r)|0,t[Ni>>2]=1,t[Ni+4>>2]=0,t[r>>2]=t[Ni>>2],t[r+4>>2]=t[Ni+4>>2],yi(e,3722,r)|0,t[eo>>2]=2,t[eo+4>>2]=0,t[r>>2]=t[eo>>2],t[r+4>>2]=t[eo+4>>2],yi(e,3734,r)|0,t[Ei>>2]=3,t[Ei+4>>2]=0,t[r>>2]=t[Ei>>2],t[r+4>>2]=t[Ei+4>>2],Xr(e,3753,r)|0,t[br>>2]=4,t[br+4>>2]=0,t[r>>2]=t[br>>2],t[r+4>>2]=t[br+4>>2],Xr(e,3769,r)|0,t[En>>2]=5,t[En+4>>2]=0,t[r>>2]=t[En>>2],t[r+4>>2]=t[En+4>>2],Xr(e,3783,r)|0,t[Yl>>2]=6,t[Yl+4>>2]=0,t[r>>2]=t[Yl>>2],t[r+4>>2]=t[Yl+4>>2],Xr(e,3796,r)|0,t[Vl>>2]=7,t[Vl+4>>2]=0,t[r>>2]=t[Vl>>2],t[r+4>>2]=t[Vl+4>>2],Xr(e,3813,r)|0,t[Gl>>2]=8,t[Gl+4>>2]=0,t[r>>2]=t[Gl>>2],t[r+4>>2]=t[Gl+4>>2],Xr(e,3825,r)|0,t[Au>>2]=3,t[Au+4>>2]=0,t[r>>2]=t[Au>>2],t[r+4>>2]=t[Au+4>>2],yi(e,3843,r)|0,t[Ri>>2]=4,t[Ri+4>>2]=0,t[r>>2]=t[Ri>>2],t[r+4>>2]=t[Ri+4>>2],yi(e,3853,r)|0,t[cs>>2]=9,t[cs+4>>2]=0,t[r>>2]=t[cs>>2],t[r+4>>2]=t[cs+4>>2],Xr(e,3870,r)|0,t[bl>>2]=10,t[bl+4>>2]=0,t[r>>2]=t[bl>>2],t[r+4>>2]=t[bl+4>>2],Xr(e,3884,r)|0,t[Hl>>2]=11,t[Hl+4>>2]=0,t[r>>2]=t[Hl>>2],t[r+4>>2]=t[Hl+4>>2],Xr(e,3896,r)|0,t[fs>>2]=1,t[fs+4>>2]=0,t[r>>2]=t[fs>>2],t[r+4>>2]=t[fs+4>>2],j0(e,3907,r)|0,t[Zi>>2]=2,t[Zi+4>>2]=0,t[r>>2]=t[Zi>>2],t[r+4>>2]=t[Zi+4>>2],j0(e,3915,r)|0,t[ls>>2]=3,t[ls+4>>2]=0,t[r>>2]=t[ls>>2],t[r+4>>2]=t[ls+4>>2],j0(e,3928,r)|0,t[Qi>>2]=4,t[Qi+4>>2]=0,t[r>>2]=t[Qi>>2],t[r+4>>2]=t[Qi+4>>2],j0(e,3948,r)|0,t[Wl>>2]=5,t[Wl+4>>2]=0,t[r>>2]=t[Wl>>2],t[r+4>>2]=t[Wl+4>>2],j0(e,3960,r)|0,t[xr>>2]=6,t[xr+4>>2]=0,t[r>>2]=t[xr>>2],t[r+4>>2]=t[xr+4>>2],j0(e,3974,r)|0,t[ku>>2]=7,t[ku+4>>2]=0,t[r>>2]=t[ku>>2],t[r+4>>2]=t[ku+4>>2],j0(e,3983,r)|0,t[Di>>2]=20,t[Di+4>>2]=0,t[r>>2]=t[Di>>2],t[r+4>>2]=t[Di+4>>2],gf(e,3999,r)|0,t[Li>>2]=8,t[Li+4>>2]=0,t[r>>2]=t[Li>>2],t[r+4>>2]=t[Li+4>>2],j0(e,4012,r)|0,t[zl>>2]=9,t[zl+4>>2]=0,t[r>>2]=t[zl>>2],t[r+4>>2]=t[zl+4>>2],j0(e,4022,r)|0,t[ql>>2]=21,t[ql+4>>2]=0,t[r>>2]=t[ql>>2],t[r+4>>2]=t[ql+4>>2],gf(e,4039,r)|0,t[tl>>2]=10,t[tl+4>>2]=0,t[r>>2]=t[tl>>2],t[r+4>>2]=t[tl+4>>2],j0(e,4053,r)|0,t[Ul>>2]=11,t[Ul+4>>2]=0,t[r>>2]=t[Ul>>2],t[r+4>>2]=t[Ul+4>>2],j0(e,4065,r)|0,t[jl>>2]=12,t[jl+4>>2]=0,t[r>>2]=t[jl>>2],t[r+4>>2]=t[jl+4>>2],j0(e,4084,r)|0,t[xu>>2]=13,t[xu+4>>2]=0,t[r>>2]=t[xu>>2],t[r+4>>2]=t[xu+4>>2],j0(e,4097,r)|0,t[go>>2]=14,t[go+4>>2]=0,t[r>>2]=t[go>>2],t[r+4>>2]=t[go+4>>2],j0(e,4117,r)|0,t[nu>>2]=15,t[nu+4>>2]=0,t[r>>2]=t[nu>>2],t[r+4>>2]=t[nu+4>>2],j0(e,4129,r)|0,t[Fi>>2]=16,t[Fi+4>>2]=0,t[r>>2]=t[Fi>>2],t[r+4>>2]=t[Fi+4>>2],j0(e,4148,r)|0,t[ss>>2]=17,t[ss+4>>2]=0,t[r>>2]=t[ss>>2],t[r+4>>2]=t[ss+4>>2],j0(e,4161,r)|0,t[el>>2]=18,t[el+4>>2]=0,t[r>>2]=t[el>>2],t[r+4>>2]=t[el+4>>2],j0(e,4181,r)|0,t[Zs>>2]=5,t[Zs+4>>2]=0,t[r>>2]=t[Zs>>2],t[r+4>>2]=t[Zs+4>>2],yi(e,4196,r)|0,t[Rf>>2]=6,t[Rf+4>>2]=0,t[r>>2]=t[Rf>>2],t[r+4>>2]=t[Rf+4>>2],yi(e,4206,r)|0,t[Lf>>2]=7,t[Lf+4>>2]=0,t[r>>2]=t[Lf>>2],t[r+4>>2]=t[Lf+4>>2],yi(e,4217,r)|0,t[us>>2]=3,t[us+4>>2]=0,t[r>>2]=t[us>>2],t[r+4>>2]=t[us+4>>2],Zu(e,4235,r)|0,t[Ff>>2]=1,t[Ff+4>>2]=0,t[r>>2]=t[Ff>>2],t[r+4>>2]=t[Ff+4>>2],_f(e,4251,r)|0,t[Tu>>2]=4,t[Tu+4>>2]=0,t[r>>2]=t[Tu>>2],t[r+4>>2]=t[Tu+4>>2],Zu(e,4263,r)|0,t[Kn>>2]=5,t[Kn+4>>2]=0,t[r>>2]=t[Kn>>2],t[r+4>>2]=t[Kn+4>>2],Zu(e,4279,r)|0,t[Mf>>2]=6,t[Mf+4>>2]=0,t[r>>2]=t[Mf>>2],t[r+4>>2]=t[Mf+4>>2],Zu(e,4293,r)|0,t[Pf>>2]=7,t[Pf+4>>2]=0,t[r>>2]=t[Pf>>2],t[r+4>>2]=t[Pf+4>>2],Zu(e,4306,r)|0,t[If>>2]=8,t[If+4>>2]=0,t[r>>2]=t[If>>2],t[r+4>>2]=t[If+4>>2],Zu(e,4323,r)|0,t[Qs>>2]=9,t[Qs+4>>2]=0,t[r>>2]=t[Qs>>2],t[r+4>>2]=t[Qs+4>>2],Zu(e,4335,r)|0,t[Js>>2]=2,t[Js+4>>2]=0,t[r>>2]=t[Js>>2],t[r+4>>2]=t[Js+4>>2],_f(e,4353,r)|0,t[Of>>2]=12,t[Of+4>>2]=0,t[r>>2]=t[Of>>2],t[r+4>>2]=t[Of+4>>2],Io(e,4363,r)|0,t[Cu>>2]=1,t[Cu+4>>2]=0,t[r>>2]=t[Cu>>2],t[r+4>>2]=t[Cu+4>>2],_u(e,4376,r)|0,t[Af>>2]=2,t[Af+4>>2]=0,t[r>>2]=t[Af>>2],t[r+4>>2]=t[Af+4>>2],_u(e,4388,r)|0,t[kf>>2]=13,t[kf+4>>2]=0,t[r>>2]=t[kf>>2],t[r+4>>2]=t[kf+4>>2],Io(e,4402,r)|0,t[Ro>>2]=14,t[Ro+4>>2]=0,t[r>>2]=t[Ro>>2],t[r+4>>2]=t[Ro+4>>2],Io(e,4411,r)|0,t[Ji>>2]=15,t[Ji+4>>2]=0,t[r>>2]=t[Ji>>2],t[r+4>>2]=t[Ji+4>>2],Io(e,4421,r)|0,t[Xi>>2]=16,t[Xi+4>>2]=0,t[r>>2]=t[Xi>>2],t[r+4>>2]=t[Xi+4>>2],Io(e,4433,r)|0,t[Ki>>2]=17,t[Ki+4>>2]=0,t[r>>2]=t[Ki>>2],t[r+4>>2]=t[Ki+4>>2],Io(e,4446,r)|0,t[Dr>>2]=18,t[Dr+4>>2]=0,t[r>>2]=t[Dr>>2],t[r+4>>2]=t[Dr+4>>2],Io(e,4458,r)|0,t[zt>>2]=3,t[zt+4>>2]=0,t[r>>2]=t[zt>>2],t[r+4>>2]=t[zt+4>>2],_u(e,4471,r)|0,t[Pn>>2]=1,t[Pn+4>>2]=0,t[r>>2]=t[Pn>>2],t[r+4>>2]=t[Pn+4>>2],ec(e,4486,r)|0,t[gn>>2]=10,t[gn+4>>2]=0,t[r>>2]=t[gn>>2],t[r+4>>2]=t[gn+4>>2],Zu(e,4496,r)|0,t[It>>2]=11,t[It+4>>2]=0,t[r>>2]=t[It>>2],t[r+4>>2]=t[It+4>>2],Zu(e,4508,r)|0,t[Ht>>2]=3,t[Ht+4>>2]=0,t[r>>2]=t[Ht>>2],t[r+4>>2]=t[Ht+4>>2],_f(e,4519,r)|0,t[Ln>>2]=4,t[Ln+4>>2]=0,t[r>>2]=t[Ln>>2],t[r+4>>2]=t[Ln+4>>2],Wm(e,4530,r)|0,t[vt>>2]=19,t[vt+4>>2]=0,t[r>>2]=t[vt>>2],t[r+4>>2]=t[vt+4>>2],Fd(e,4542,r)|0,t[_e>>2]=12,t[_e+4>>2]=0,t[r>>2]=t[_e>>2],t[r+4>>2]=t[_e+4>>2],yf(e,4554,r)|0,t[pe>>2]=13,t[pe+4>>2]=0,t[r>>2]=t[pe>>2],t[r+4>>2]=t[pe+4>>2],tc(e,4568,r)|0,t[qe>>2]=2,t[qe+4>>2]=0,t[r>>2]=t[qe>>2],t[r+4>>2]=t[qe+4>>2],Hm(e,4578,r)|0,t[ke>>2]=20,t[ke+4>>2]=0,t[r>>2]=t[ke>>2],t[r+4>>2]=t[ke+4>>2],Ld(e,4587,r)|0,t[Pe>>2]=22,t[Pe+4>>2]=0,t[r>>2]=t[Pe>>2],t[r+4>>2]=t[Pe+4>>2],gf(e,4602,r)|0,t[ie>>2]=23,t[ie+4>>2]=0,t[r>>2]=t[ie>>2],t[r+4>>2]=t[ie+4>>2],gf(e,4619,r)|0,t[le>>2]=14,t[le+4>>2]=0,t[r>>2]=t[le>>2],t[r+4>>2]=t[le+4>>2],Rd(e,4629,r)|0,t[we>>2]=1,t[we+4>>2]=0,t[r>>2]=t[we>>2],t[r+4>>2]=t[we+4>>2],zc(e,4637,r)|0,t[q>>2]=4,t[q+4>>2]=0,t[r>>2]=t[q>>2],t[r+4>>2]=t[q+4>>2],_u(e,4653,r)|0,t[P>>2]=5,t[P+4>>2]=0,t[r>>2]=t[P>>2],t[r+4>>2]=t[P+4>>2],_u(e,4669,r)|0,t[T>>2]=6,t[T+4>>2]=0,t[r>>2]=t[T>>2],t[r+4>>2]=t[T+4>>2],_u(e,4686,r)|0,t[k>>2]=7,t[k+4>>2]=0,t[r>>2]=t[k>>2],t[r+4>>2]=t[k+4>>2],_u(e,4701,r)|0,t[y>>2]=8,t[y+4>>2]=0,t[r>>2]=t[y>>2],t[r+4>>2]=t[y+4>>2],_u(e,4719,r)|0,t[_>>2]=9,t[_+4>>2]=0,t[r>>2]=t[_>>2],t[r+4>>2]=t[_+4>>2],_u(e,4736,r)|0,t[d>>2]=21,t[d+4>>2]=0,t[r>>2]=t[d>>2],t[r+4>>2]=t[d+4>>2],Nd(e,4754,r)|0,t[l>>2]=2,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],ec(e,4772,r)|0,t[s>>2]=3,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],ec(e,4790,r)|0,t[o>>2]=4,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],ec(e,4808,r)|0,h=n}function qm(e,n){e=e|0,n=n|0;var r=0;r=Nx()|0,t[e>>2]=r,Bx(r,n),Cf(t[e>>2]|0)}function Id(e,n,r){return e=e|0,n=n|0,r=r|0,Ex(e,Zn(n)|0,r,0),e|0}function Pd(e,n,r){return e=e|0,n=n|0,r=r|0,ux(e,Zn(n)|0,r,0),e|0}function zm(e,n,r){return e=e|0,n=n|0,r=r|0,V9(e,Zn(n)|0,r,0),e|0}function gf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],I9(e,n,s),h=o,e|0}function Md(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],vo(e,n,s),h=o,e|0}function Xr(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],a(e,n,s),h=o,e|0}function yi(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],n4(e,n,s),h=o,e|0}function j0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],b_(e,n,s),h=o,e|0}function Zu(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L_(e,n,s),h=o,e|0}function _f(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hp(e,n,s),h=o,e|0}function Io(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],e_(e,n,s),h=o,e|0}function _u(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ip(e,n,s),h=o,e|0}function ec(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ng(e,n,s),h=o,e|0}function Wm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],l0(e,n,s),h=o,e|0}function Fd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],hg(e,n,s),h=o,e|0}function yf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sg(e,n,s),h=o,e|0}function tc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Kv(e,n,s),h=o,e|0}function Hm(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y1(e,n,s),h=o,e|0}function Ld(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],wv(e,n,s),h=o,e|0}function Rd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],fv(e,n,s),h=o,e|0}function zc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Gd(e,n,s),h=o,e|0}function Nd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Wc(e,n,s),h=o,e|0}function Wc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Hc(e,r,s,1),h=o}function Zn(e){return e=e|0,e|0}function Hc(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Za()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Bd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,bc(l,o)|0,o),h=s}function Za(){var e=0,n=0;if(c[7616]|0||(yu(9136),Bt(24,9136,Q|0)|0,n=7616,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9136)|0)){e=9136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));yu(9136)}return 9136}function Bd(e){return e=e|0,0}function bc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Za()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],n1(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jd(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ur(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;d=h,h=h+32|0,q=d+24|0,P=d+20|0,y=d+16|0,T=d+12|0,k=d+8|0,_=d+4|0,we=d,t[P>>2]=n,t[y>>2]=r,t[T>>2]=o,t[k>>2]=s,t[_>>2]=l,l=e+28|0,t[we>>2]=t[l>>2],t[q>>2]=t[we>>2],e1(e+24|0,q,P,T,k,y,_)|0,t[l>>2]=t[t[l>>2]>>2],h=d}function e1(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,e=bm(n)|0,n=Tt(24)|0,t1(n+4|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0,t[d>>2]|0),t[n>>2]=t[e>>2],t[e>>2]=n,n|0}function bm(e){return e=e|0,t[e>>2]|0}function t1(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Lt(e,n){return e=e|0,n=n|0,n|e|0}function n1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Gm(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ud(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],n1(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Vm(e,_),Ym(_),h=k;return}}function Gm(e){return e=e|0,357913941}function Ud(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Vm(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ym(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function yu(e){e=e|0,Gc(e)}function r1(e){e=e|0,i1(e+24|0)}function Dn(e){return e=e|0,t[e>>2]|0}function i1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Gc(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,cn()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function An(){return 9228}function cn(){return 1140}function Vc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Il(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=$m(n,o)|0,h=r,n|0}function Nn(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,t[e>>2]=n,t[e+4>>2]=r,t[e+8>>2]=o,t[e+12>>2]=s,t[e+16>>2]=l}function Il(e){return e=e|0,(t[(Za()|0)+24>>2]|0)+(e*12|0)|0}function $m(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+48|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=o1(o)|0,h=s,o|0}function o1(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(u1()|0)|0,o?(s1(n,o),l1(r,n),qd(e,r),e=f1(n)|0):e=zd(e)|0,h=s,e|0}function u1(){var e=0;return c[7632]|0||(nc(9184),Bt(25,9184,Q|0)|0,e=7632,t[e>>2]=1,t[e+4>>2]=0),9184}function U0(e){return e=e|0,t[e+36>>2]|0}function s1(e,n){e=e|0,n=n|0,t[e>>2]=n,t[e+4>>2]=e,t[e+8>>2]=0}function l1(e,n){e=e|0,n=n|0,t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=0}function qd(e,n){e=e|0,n=n|0,Ii(n,e,e+8|0,e+16|0,e+24|0,e+32|0,e+40|0)|0}function f1(e){return e=e|0,t[(t[e+4>>2]|0)+8>>2]|0}function zd(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;y=h,h=h+16|0,r=y+4|0,o=y,s=Qo(8)|0,l=s,d=Tt(48)|0,_=d,n=_+48|0;do t[_>>2]=t[e>>2],_=_+4|0,e=e+4|0;while((_|0)<(n|0));return n=l+4|0,t[n>>2]=d,_=Tt(8)|0,d=t[n>>2]|0,t[o>>2]=0,t[r>>2]=t[o>>2],Wd(_,d,r),t[s>>2]=_,h=y,l|0}function Wd(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1092,t[r+12>>2]=n,t[e+4>>2]=r}function Km(e){e=e|0,da(e),Ve(e)}function Xm(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function es(e){e=e|0,Ve(e)}function Ii(e,n,r,o,s,l,d){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,l=c1(t[e>>2]|0,n,r,o,s,l,d)|0,d=e+4|0,t[(t[d>>2]|0)+8>>2]=l,t[(t[d>>2]|0)+8>>2]|0}function c1(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0;var _=0,y=0;return _=h,h=h+16|0,y=_,Zo(y),e=Oi(e)|0,d=Jm(e,+L[n>>3],+L[r>>3],+L[o>>3],+L[s>>3],+L[l>>3],+L[d>>3])|0,eu(y),h=_,d|0}function Jm(e,n,r,o,s,l,d){e=e|0,n=+n,r=+r,o=+o,s=+s,l=+l,d=+d;var _=0;return _=ko(a1()|0)|0,n=+Ko(n),r=+Ko(r),o=+Ko(o),s=+Ko(s),l=+Ko(l),xs(0,_|0,e|0,+n,+r,+o,+s,+l,+ +Ko(d))|0}function a1(){var e=0;return c[7624]|0||(Qm(9172),e=7624,t[e>>2]=1,t[e+4>>2]=0),9172}function Qm(e){e=e|0,Ao(e,Zm()|0,6)}function Zm(){return 1112}function nc(e){e=e|0,Ys(e)}function Hd(e){e=e|0,d1(e+24|0),bd(e+16|0)}function d1(e){e=e|0,tv(e)}function bd(e){e=e|0,ev(e)}function ev(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function tv(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function Ys(e){e=e|0;var n=0;t[e+16>>2]=0,t[e+20>>2]=0,n=e+24|0,t[n>>2]=0,t[e+28>>2]=n,t[e+36>>2]=0,c[e+40>>0]=0,c[e+41>>0]=0}function Gd(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Vd(e,r,s,0),h=o}function Vd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=p1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=h1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Yd(l,o)|0,o),h=s}function p1(){var e=0,n=0;if(c[7640]|0||(Xo(9232),Bt(26,9232,Q|0)|0,n=7640,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9232)|0)){e=9232,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Xo(9232)}return 9232}function h1(e){return e=e|0,0}function Yd(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=p1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],wf(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(m1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function wf(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function m1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=$d(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Kd(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],wf(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yc(e,_),Xd(_),h=k;return}}function $d(e){return e=e|0,357913941}function Kd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yc(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Xd(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Xo(e){e=e|0,Jd(e)}function Pl(e){e=e|0,nv(e+24|0)}function nv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Jd(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,rv()|0,3),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rv(){return 1144}function iv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,d=l+8|0,_=l,y=ov(e)|0,e=t[y+4>>2]|0,t[_>>2]=t[y>>2],t[_+4>>2]=e,t[d>>2]=t[_>>2],t[d+4>>2]=t[_+4>>2],uv(n,d,r,o,s),h=l}function ov(e){return e=e|0,(t[(p1()|0)+24>>2]|0)+(e*12|0)|0}function uv(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0;var l=0,d=0,_=0,y=0,k=0;k=h,h=h+16|0,d=k+2|0,_=k+1|0,y=k,l=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(l=t[(t[e>>2]|0)+l>>2]|0),wu(d,r),r=+Du(d,r),wu(_,o),o=+Du(_,o),ts(y,s),y=ns(y,s)|0,iD[l&1](e,r,o,y),h=k}function wu(e,n){e=e|0,n=+n}function Du(e,n){return e=e|0,n=+n,+ +lv(n)}function ts(e,n){e=e|0,n=n|0}function ns(e,n){return e=e|0,n=n|0,sv(n)|0}function sv(e){return e=e|0,e|0}function lv(e){return e=+e,+e}function fv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qd(e,r,s,1),h=o}function Qd(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=$c()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Zd(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cv(l,o)|0,o),h=s}function $c(){var e=0,n=0;if(c[7648]|0||(np(9268),Bt(27,9268,Q|0)|0,n=7648,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9268)|0)){e=9268,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));np(9268)}return 9268}function Zd(e){return e=e|0,0}function cv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=$c()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(av(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function av(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=tp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,dv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,pv(e,_),hv(_),h=k;return}}function tp(e){return e=e|0,357913941}function dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function pv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function hv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function np(e){e=e|0,Po(e)}function mv(e){e=e|0,vv(e+24|0)}function vv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Po(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,gv()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gv(){return 1160}function _v(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=yv(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=rp(n,o)|0,h=r,n|0}function yv(e){return e=e|0,(t[($c()|0)+24>>2]|0)+(e*12|0)|0}function rp(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ip(dc[r&31](e)|0)|0}function ip(e){return e=e|0,e&1|0}function wv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Dv(e,r,s,0),h=o}function Dv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=v1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=g1(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Ev(l,o)|0,o),h=s}function v1(){var e=0,n=0;if(c[7656]|0||(up(9304),Bt(28,9304,Q|0)|0,n=7656,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9304)|0)){e=9304,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));up(9304)}return 9304}function g1(e){return e=e|0,0}function Ev(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=v1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],op(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Sv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Sv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Cv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Tv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],op(l,o,r),t[y>>2]=(t[y>>2]|0)+12,xv(e,_),kv(_),h=k;return}}function Cv(e){return e=e|0,357913941}function Tv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function xv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kv(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function up(e){e=e|0,Iv(e)}function Av(e){e=e|0,Ov(e+24|0)}function Ov(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Iv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Pv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Pv(){return 1164}function Mv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Fv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Lv(n,s,r),h=o}function Fv(e){return e=e|0,(t[(v1()|0)+24>>2]|0)+(e*12|0)|0}function Lv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),$s(s,r),r=Ks(s,r)|0,Bl[o&31](e,r),Xs(s),h=l}function $s(e,n){e=e|0,n=n|0,Rv(e,n)}function Ks(e,n){return e=e|0,n=n|0,e|0}function Xs(e){e=e|0,Ju(e)}function Rv(e,n){e=e|0,n=n|0,_1(e,n)}function _1(e,n){e=e|0,n=n|0,t[e>>2]=n}function y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],sp(e,r,s,0),h=o}function sp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=w1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Nv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Bv(l,o)|0,o),h=s}function w1(){var e=0,n=0;if(c[7664]|0||(cp(9340),Bt(29,9340,Q|0)|0,n=7664,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9340)|0)){e=9340,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));cp(9340)}return 9340}function Nv(e){return e=e|0,0}function Bv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=w1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jv(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Uv(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,qv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,zv(e,_),fp(_),h=k;return}}function Uv(e){return e=e|0,357913941}function qv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function zv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function fp(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function cp(e){e=e|0,Hv(e)}function Kc(e){e=e|0,Wv(e+24|0)}function Wv(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Hv(e){e=e|0;var n=0;n=An()|0,Nn(e,2,4,n,bv()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function bv(){return 1180}function Gv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Vv(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=Yv(n,s,r)|0,h=o,r|0}function Vv(e){return e=e|0,(t[(w1()|0)+24>>2]|0)+(e*12|0)|0}function Yv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),Ml(s,r),s=Fl(s,r)|0,s=Xc(J4[o&15](e,s)|0)|0,h=l,s|0}function Ml(e,n){e=e|0,n=n|0}function Fl(e,n){return e=e|0,n=n|0,$v(n)|0}function Xc(e){return e=e|0,e|0}function $v(e){return e=e|0,e|0}function Kv(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Xv(e,r,s,0),h=o}function Xv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=D1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Jv(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Qv(l,o)|0,o),h=s}function D1(){var e=0,n=0;if(c[7672]|0||(hp(9376),Bt(30,9376,Q|0)|0,n=7672,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9376)|0)){e=9376,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));hp(9376)}return 9376}function Jv(e){return e=e|0,0}function Qv(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=D1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ap(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(dp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ap(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function dp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=pp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Zv(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ap(l,o,r),t[y>>2]=(t[y>>2]|0)+12,eg(e,_),tg(_),h=k;return}}function pp(e){return e=e|0,357913941}function Zv(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function eg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function tg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function hp(e){e=e|0,rg(e)}function Jc(e){e=e|0,ng(e+24|0)}function ng(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function rg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function mp(){return 1196}function ig(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=og(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=ug(n,o)|0,h=r,n|0}function og(e){return e=e|0,(t[(D1()|0)+24>>2]|0)+(e*12|0)|0}function ug(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Xc(dc[r&31](e)|0)|0}function sg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],lg(e,r,s,1),h=o}function lg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=fg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,cg(l,o)|0,o),h=s}function E1(){var e=0,n=0;if(c[7680]|0||(C1(9412),Bt(31,9412,Q|0)|0,n=7680,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9412)|0)){e=9412,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));C1(9412)}return 9412}function fg(e){return e=e|0,0}function cg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],rc(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(ag(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function rc(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function ag(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=vp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,gp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],rc(l,o,r),t[y>>2]=(t[y>>2]|0)+12,S1(e,_),_p(_),h=k;return}}function vp(e){return e=e|0,357913941}function gp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function S1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function _p(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function C1(e){e=e|0,dg(e)}function yp(e){e=e|0,wp(e+24|0)}function wp(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function dg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Dp(){return 1200}function pg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Qc(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=Zc(n,o)|0,h=r,n|0}function Qc(e){return e=e|0,(t[(E1()|0)+24>>2]|0)+(e*12|0)|0}function Zc(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),ea(dc[r&31](e)|0)|0}function ea(e){return e=e|0,e|0}function hg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],T1(e,r,s,0),h=o}function T1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=ta()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=mg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,vg(l,o)|0,o),h=s}function ta(){var e=0,n=0;if(c[7688]|0||(Sp(9448),Bt(32,9448,Q|0)|0,n=7688,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9448)|0)){e=9448,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Sp(9448)}return 9448}function mg(e){return e=e|0,0}function vg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=ta()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ep(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(gg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ep(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function gg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=_g(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,yg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ep(l,o,r),t[y>>2]=(t[y>>2]|0)+12,wg(e,_),Dg(_),h=k;return}}function _g(e){return e=e|0,357913941}function yg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function wg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Dg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Sp(e){e=e|0,Cg(e)}function Eg(e){e=e|0,Sg(e+24|0)}function Sg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Cg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Mo(){return 1204}function Tg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=xg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Ll(n,s,r),h=o}function xg(e){return e=e|0,(t[(ta()|0)+24>>2]|0)+(e*12|0)|0}function Ll(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),On(s,r),s=x1(s,r)|0,Bl[o&31](e,s),h=l}function On(e,n){e=e|0,n=n|0}function x1(e,n){return e=e|0,n=n|0,Vi(n)|0}function Vi(e){return e=e|0,e|0}function l0(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],kg(e,r,s,0),h=o}function kg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Eu()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Ag(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Og(l,o)|0,o),h=s}function Eu(){var e=0,n=0;if(c[7696]|0||(A1(9484),Bt(33,9484,Q|0)|0,n=7696,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9484)|0)){e=9484,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A1(9484)}return 9484}function Ag(e){return e=e|0,0}function Og(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Eu()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Cp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Ig(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Cp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Ig(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Pg(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,k1(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Cp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Mg(e,_),rs(_),h=k;return}}function Pg(e){return e=e|0,357913941}function k1(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Mg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function rs(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function A1(e){e=e|0,n0(e)}function na(e){e=e|0,Jr(e+24|0)}function Jr(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function n0(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Tp()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Tp(){return 1212}function Fg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Lg(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],Rg(n,l,r,o),h=s}function Lg(e){return e=e|0,(t[(Eu()|0)+24>>2]|0)+(e*12|0)|0}function Rg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),On(l,r),l=x1(l,r)|0,Ml(d,o),d=Fl(d,o)|0,X1[s&15](e,l,d),h=_}function Ng(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Bg(e,r,s,1),h=o}function Bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=O1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=xp(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,ic(l,o)|0,o),h=s}function O1(){var e=0,n=0;if(c[7704]|0||(Ap(9520),Bt(34,9520,Q|0)|0,n=7704,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9520)|0)){e=9520,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ap(9520)}return 9520}function xp(e){return e=e|0,0}function ic(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=O1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],ra(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(jg(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function ra(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function jg(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=kp(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,ia(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],ra(l,o,r),t[y>>2]=(t[y>>2]|0)+12,mo(e,_),Df(_),h=k;return}}function kp(e){return e=e|0,357913941}function ia(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function mo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Df(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ap(e){e=e|0,zg(e)}function Ug(e){e=e|0,qg(e+24|0)}function qg(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function zg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,Wg()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Wg(){return 1224}function Op(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;return s=h,h=h+16|0,l=s+8|0,d=s,_=is(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],o=+jn(n,l,r),h=s,+o}function is(e){return e=e|0,(t[(O1()|0)+24>>2]|0)+(e*12|0)|0}function jn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,d=+Ol(+uD[o&7](e,s)),h=l,+d}function Ip(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Fo(e,r,s,1),h=o}function Fo(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oa()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=Hg(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,yr(l,o)|0,o),h=s}function oa(){var e=0,n=0;if(c[7712]|0||(Fp(9556),Bt(35,9556,Q|0)|0,n=7712,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9556)|0)){e=9556,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fp(9556)}return 9556}function Hg(e){return e=e|0,0}function yr(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oa()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Pp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Mp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Pp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Mp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=ua(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,bg(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Pp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Gg(e,_),Vg(_),h=k;return}}function ua(e){return e=e|0,357913941}function bg(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Gg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Vg(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Fp(e){e=e|0,Kg(e)}function Yg(e){e=e|0,$g(e+24|0)}function $g(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Kg(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,Xg()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Xg(){return 1232}function Jg(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=Qg(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=+Zg(n,s),h=o,+r}function Qg(e){return e=e|0,(t[(oa()|0)+24>>2]|0)+(e*12|0)|0}function Zg(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),+ +Ol(+oD[r&15](e))}function e_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t_(e,r,s,1),h=o}function t_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=oc()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=n_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,I1(l,o)|0,o),h=s}function oc(){var e=0,n=0;if(c[7720]|0||(Rp(9592),Bt(36,9592,Q|0)|0,n=7720,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9592)|0)){e=9592,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Rp(9592)}return 9592}function n_(e){return e=e|0,0}function I1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=oc()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Lp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(r_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Lp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function r_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=i_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,q0(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Lp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,Yi(e,_),o_(_),h=k;return}}function i_(e){return e=e|0,357913941}function q0(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function Yi(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function o_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Rp(e){e=e|0,s_(e)}function u_(e){e=e|0,Np(e+24|0)}function Np(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function s_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,l_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function l_(){return 1276}function f_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=Bp(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=c_(n,o)|0,h=r,n|0}function Bp(e){return e=e|0,(t[(oc()|0)+24>>2]|0)+(e*12|0)|0}function c_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;return s=h,h=h+16|0,o=s,r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Bl[r&31](o,e),o=jp(o)|0,h=s,o|0}function jp(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(Up()|0)|0,o?(s1(n,o),l1(r,n),qp(e,r),e=f1(n)|0):e=zp(e)|0,h=s,e|0}function Up(){var e=0;return c[7736]|0||(Wp(9640),Bt(25,9640,Q|0)|0,e=7736,t[e>>2]=1,t[e+4>>2]=0),9640}function qp(e,n){e=e|0,n=n|0,Ef(n,e,e+8|0)|0}function zp(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(16)|0,t[_>>2]=t[e>>2],t[_+4>>2]=t[e+4>>2],t[_+8>>2]=t[e+8>>2],t[_+12>>2]=t[e+12>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(e,l,s),t[o>>2]=e,h=r,n|0}function P1(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1244,t[r+12>>2]=n,t[e+4>>2]=r}function a_(e){e=e|0,da(e),Ve(e)}function d_(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function p_(e){e=e|0,Ve(e)}function Ef(e,n,r){return e=e|0,n=n|0,r=r|0,n=h_(t[e>>2]|0,n,r)|0,r=e+4|0,t[(t[r>>2]|0)+8>>2]=n,t[(t[r>>2]|0)+8>>2]|0}function h_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return o=h,h=h+16|0,s=o,Zo(s),e=Oi(e)|0,r=m_(e,t[n>>2]|0,+L[r>>3])|0,eu(s),h=o,r|0}function m_(e,n,r){e=e|0,n=n|0,r=+r;var o=0;return o=ko(v_()|0)|0,n=jc(n)|0,dl(0,o|0,e|0,n|0,+ +Ko(r))|0}function v_(){var e=0;return c[7728]|0||(g_(9628),e=7728,t[e>>2]=1,t[e+4>>2]=0),9628}function g_(e){e=e|0,Ao(e,__()|0,2)}function __(){return 1264}function Wp(e){e=e|0,Ys(e)}function Hp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],y_(e,r,s,1),h=o}function y_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=M1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=w_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,D_(l,o)|0,o),h=s}function M1(){var e=0,n=0;if(c[7744]|0||(Gp(9684),Bt(37,9684,Q|0)|0,n=7744,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9684)|0)){e=9684,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gp(9684)}return 9684}function w_(e){return e=e|0,0}function D_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=M1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],bp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(E_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function bp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function E_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=S_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,C_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],bp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,T_(e,_),x_(_),h=k;return}}function S_(e){return e=e|0,357913941}function C_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function T_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function x_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Gp(e){e=e|0,O_(e)}function k_(e){e=e|0,A_(e+24|0)}function A_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function O_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,5,n,I_()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function I_(){return 1280}function P_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=M_(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=F_(n,s,r)|0,h=o,r|0}function M_(e){return e=e|0,(t[(M1()|0)+24>>2]|0)+(e*12|0)|0}function F_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return d=h,h=h+32|0,s=d,l=d+16|0,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(l,r),l=ns(l,r)|0,X1[o&15](s,e,l),l=jp(s)|0,h=d,l|0}function L_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],R_(e,r,s,1),h=o}function R_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=F1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=N_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B_(l,o)|0,o),h=s}function F1(){var e=0,n=0;if(c[7752]|0||(Kp(9720),Bt(38,9720,Q|0)|0,n=7752,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9720)|0)){e=9720,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Kp(9720)}return 9720}function N_(e){return e=e|0,0}function B_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=F1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Vp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(j_(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Vp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function j_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=L1(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Yp(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Vp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$p(e,_),U_(_),h=k;return}}function L1(e){return e=e|0,357913941}function Yp(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $p(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function U_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Kp(e){e=e|0,z_(e)}function q_(e){e=e|0,R1(e+24|0)}function R1(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,W_()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W_(){return 1288}function H_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;return r=h,h=h+16|0,o=r+8|0,s=r,l=$i(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],n=N1(n,o)|0,h=r,n|0}function $i(e){return e=e|0,(t[(F1()|0)+24>>2]|0)+(e*12|0)|0}function N1(e,n){e=e|0,n=n|0;var r=0;return r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Dd(dc[r&31](e)|0)|0}function b_(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],G_(e,r,s,0),h=o}function G_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=B1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=V_(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,j1(l,o)|0,o),h=s}function B1(){var e=0,n=0;if(c[7760]|0||(q1(9756),Bt(39,9756,Q|0)|0,n=7760,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9756)|0)){e=9756,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));q1(9756)}return 9756}function V_(e){return e=e|0,0}function j1(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=B1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Xp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(U1(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Xp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function U1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=Y_(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,$_(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Xp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,K_(e,_),X_(_),h=k;return}}function Y_(e){return e=e|0,357913941}function $_(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function K_(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function X_(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function q1(e){e=e|0,Z_(e)}function J_(e){e=e|0,Q_(e+24|0)}function Q_(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function Z_(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,z1()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function z1(){return 1292}function W1(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=e4(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],t4(n,s,r),h=o}function e4(e){return e=e|0,(t[(B1()|0)+24>>2]|0)+(e*12|0)|0}function t4(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),wu(s,r),r=+Du(s,r),nD[o&31](e,r),h=l}function n4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r4(e,r,s,0),h=o}function r4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=H1()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=i4(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,o4(l,o)|0,o),h=s}function H1(){var e=0,n=0;if(c[7768]|0||(Qp(9792),Bt(40,9792,Q|0)|0,n=7768,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9792)|0)){e=9792,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Qp(9792)}return 9792}function i4(e){return e=e|0,0}function o4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=H1()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Jp(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(u4(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Jp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function u4(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=s4(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,l4(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Jp(l,o,r),t[y>>2]=(t[y>>2]|0)+12,f4(e,_),c4(_),h=k;return}}function s4(e){return e=e|0,357913941}function l4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function f4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function c4(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Qp(e){e=e|0,p4(e)}function a4(e){e=e|0,d4(e+24|0)}function d4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function p4(e){e=e|0;var n=0;n=An()|0,Nn(e,2,1,n,h4()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function h4(){return 1300}function m4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=v4(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],g4(n,l,r,o),h=s}function v4(e){return e=e|0,(t[(H1()|0)+24>>2]|0)+(e*12|0)|0}function g4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,wu(d,o),o=+Du(d,o),cD[s&15](e,l,o),h=_}function a(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],p(e,r,s,0),h=o}function p(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=I(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,B(l,o)|0,o),h=s}function E(){var e=0,n=0;if(c[7776]|0||(nt(9828),Bt(41,9828,Q|0)|0,n=7776,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9828)|0)){e=9828,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));nt(9828)}return 9828}function I(e){return e=e|0,0}function B(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],G(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(te(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function G(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function te(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=se(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,Ee(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],G(l,o,r),t[y>>2]=(t[y>>2]|0)+12,$e(e,_),Ke(_),h=k;return}}function se(e){return e=e|0,357913941}function Ee(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function $e(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ke(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function nt(e){e=e|0,an(e)}function Ct(e){e=e|0,Gt(e+24|0)}function Gt(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function an(e){e=e|0;var n=0;n=An()|0,Nn(e,2,7,n,qn()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function qn(){return 1312}function dn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=Yn(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],er(n,s,r),h=o}function Yn(e){return e=e|0,(t[(E()|0)+24>>2]|0)+(e*12|0)|0}function er(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,Bl[o&31](e,s),h=l}function vo(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Pi(e,r,s,0),h=o}function Pi(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=Mi()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=f0(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,Jo(l,o)|0,o),h=s}function Mi(){var e=0,n=0;if(c[7784]|0||(kw(9864),Bt(42,9864,Q|0)|0,n=7784,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9864)|0)){e=9864,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));kw(9864)}return 9864}function f0(e){return e=e|0,0}function Jo(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=Mi()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Su(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(Zp(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Su(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function Zp(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=v9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,g9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Su(l,o,r),t[y>>2]=(t[y>>2]|0)+12,_9(e,_),y9(_),h=k;return}}function v9(e){return e=e|0,357913941}function g9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function _9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function y9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function kw(e){e=e|0,E9(e)}function w9(e){e=e|0,D9(e+24|0)}function D9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function E9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,8,n,S9()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function S9(){return 1320}function C9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=T9(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],x9(n,s,r),h=o}function T9(e){return e=e|0,(t[(Mi()|0)+24>>2]|0)+(e*12|0)|0}function x9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),k9(s,r),s=A9(s,r)|0,Bl[o&31](e,s),h=l}function k9(e,n){e=e|0,n=n|0}function A9(e,n){return e=e|0,n=n|0,O9(n)|0}function O9(e){return e=e|0,e|0}function I9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],P9(e,r,s,0),h=o}function P9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=_4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=M9(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,F9(l,o)|0,o),h=s}function _4(){var e=0,n=0;if(c[7792]|0||(Ow(9900),Bt(43,9900,Q|0)|0,n=7792,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9900)|0)){e=9900,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Ow(9900)}return 9900}function M9(e){return e=e|0,0}function F9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=_4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Aw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(L9(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Aw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function L9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=R9(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,N9(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Aw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,B9(e,_),j9(_),h=k;return}}function R9(e){return e=e|0,357913941}function N9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function B9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function j9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Ow(e){e=e|0,z9(e)}function U9(e){e=e|0,q9(e+24|0)}function q9(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function z9(e){e=e|0;var n=0;n=An()|0,Nn(e,2,22,n,W9()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function W9(){return 1344}function H9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0;r=h,h=h+16|0,o=r+8|0,s=r,l=b9(e)|0,e=t[l+4>>2]|0,t[s>>2]=t[l>>2],t[s+4>>2]=e,t[o>>2]=t[s>>2],t[o+4>>2]=t[s+4>>2],G9(n,o),h=r}function b9(e){return e=e|0,(t[(_4()|0)+24>>2]|0)+(e*12|0)|0}function G9(e,n){e=e|0,n=n|0;var r=0;r=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(r=t[(t[e>>2]|0)+r>>2]|0),Nl[r&127](e)}function V9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=y4()|0,e=Y9(r)|0,ur(l,n,s,e,$9(r,o)|0,o)}function y4(){var e=0,n=0;if(c[7800]|0||(Pw(9936),Bt(44,9936,Q|0)|0,n=7800,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9936)|0)){e=9936,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Pw(9936)}return 9936}function Y9(e){return e=e|0,e|0}function $9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=y4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Iw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(K9(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Iw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function K9(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=X9(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,J9(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Iw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Q9(e,s),Z9(s),h=_;return}}function X9(e){return e=e|0,536870911}function J9(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Q9(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Z9(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Pw(e){e=e|0,nx(e)}function ex(e){e=e|0,tx(e+24|0)}function tx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function nx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,23,n,Mo()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function rx(e,n){e=e|0,n=n|0,ox(t[(ix(e)|0)>>2]|0,n)}function ix(e){return e=e|0,(t[(y4()|0)+24>>2]|0)+(e<<3)|0}function ox(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,On(o,n),n=x1(o,n)|0,Nl[e&127](n),h=r}function ux(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=w4()|0,e=sx(r)|0,ur(l,n,s,e,lx(r,o)|0,o)}function w4(){var e=0,n=0;if(c[7808]|0||(Fw(9972),Bt(45,9972,Q|0)|0,n=7808,t[n>>2]=1,t[n+4>>2]=0),!(Dn(9972)|0)){e=9972,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Fw(9972)}return 9972}function sx(e){return e=e|0,e|0}function lx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=w4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Mw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(fx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Mw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function fx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=cx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,ax(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Mw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,dx(e,s),px(s),h=_;return}}function cx(e){return e=e|0,536870911}function ax(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function dx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function px(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Fw(e){e=e|0,vx(e)}function hx(e){e=e|0,mx(e+24|0)}function mx(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function vx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,9,n,gx()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function gx(){return 1348}function _x(e,n){return e=e|0,n=n|0,wx(t[(yx(e)|0)>>2]|0,n)|0}function yx(e){return e=e|0,(t[(w4()|0)+24>>2]|0)+(e<<3)|0}function wx(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,n=Xc(dc[e&31](n)|0)|0,h=r,n|0}function Lw(e,n){e=e|0,n=n|0}function Rw(e,n){return e=e|0,n=n|0,Dx(n)|0}function Dx(e){return e=e|0,e|0}function Ex(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=D4()|0,e=Sx(r)|0,ur(l,n,s,e,Cx(r,o)|0,o)}function D4(){var e=0,n=0;if(c[7816]|0||(Bw(10008),Bt(46,10008,Q|0)|0,n=7816,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10008)|0)){e=10008,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Bw(10008)}return 10008}function Sx(e){return e=e|0,e|0}function Cx(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=D4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Nw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(Tx(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Nw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function Tx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=xx(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,kx(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Nw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,Ax(e,s),Ox(s),h=_;return}}function xx(e){return e=e|0,536870911}function kx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function Ax(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function Ox(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Bw(e){e=e|0,Mx(e)}function Ix(e){e=e|0,Px(e+24|0)}function Px(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Mx(e){e=e|0;var n=0;n=An()|0,Nn(e,1,15,n,mp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Fx(e){return e=e|0,Rx(t[(Lx(e)|0)>>2]|0)|0}function Lx(e){return e=e|0,(t[(D4()|0)+24>>2]|0)+(e<<3)|0}function Rx(e){return e=e|0,Xc(ph[e&7]()|0)|0}function Nx(){var e=0;return c[7832]|0||(bx(10052),Bt(25,10052,Q|0)|0,e=7832,t[e>>2]=1,t[e+4>>2]=0),10052}function Bx(e,n){e=e|0,n=n|0,t[e>>2]=jx()|0,t[e+4>>2]=Ux()|0,t[e+12>>2]=n,t[e+8>>2]=qx()|0,t[e+32>>2]=2}function jx(){return 11709}function Ux(){return 1188}function qx(){return eh()|0}function zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Wx(r),Ve(r)):n|0&&(mu(n),Ve(n))}function Sf(e,n){return e=e|0,n=n|0,n&e|0}function Wx(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function eh(){var e=0;return c[7824]|0||(t[2511]=Hx()|0,t[2512]=0,e=7824,t[e>>2]=1,t[e+4>>2]=0),10044}function Hx(){return 0}function bx(e){e=e|0,Ys(e)}function Gx(e){e=e|0;var n=0,r=0,o=0,s=0,l=0;n=h,h=h+32|0,r=n+24|0,l=n+16|0,s=n+8|0,o=n,Vx(e,4827),Yx(e,4834,3)|0,$x(e,3682,47)|0,t[l>>2]=9,t[l+4>>2]=0,t[r>>2]=t[l>>2],t[r+4>>2]=t[l+4>>2],Kx(e,4841,r)|0,t[s>>2]=1,t[s+4>>2]=0,t[r>>2]=t[s>>2],t[r+4>>2]=t[s+4>>2],Xx(e,4871,r)|0,t[o>>2]=10,t[o+4>>2]=0,t[r>>2]=t[o>>2],t[r+4>>2]=t[o+4>>2],Jx(e,4891,r)|0,h=n}function Vx(e,n){e=e|0,n=n|0;var r=0;r=Ok()|0,t[e>>2]=r,Ik(r,n),Cf(t[e>>2]|0)}function Yx(e,n,r){return e=e|0,n=n|0,r=r|0,pk(e,Zn(n)|0,r,0),e|0}function $x(e,n,r){return e=e|0,n=n|0,r=r|0,Q7(e,Zn(n)|0,r,0),e|0}function Kx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],F7(e,n,s),h=o,e|0}function Xx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],h7(e,n,s),h=o,e|0}function Jx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=t[r+4>>2]|0,t[l>>2]=t[r>>2],t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Qx(e,n,s),h=o,e|0}function Qx(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],Zx(e,r,s,1),h=o}function Zx(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=E4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=e7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,t7(l,o)|0,o),h=s}function E4(){var e=0,n=0;if(c[7840]|0||(Uw(10100),Bt(48,10100,Q|0)|0,n=7840,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10100)|0)){e=10100,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Uw(10100)}return 10100}function e7(e){return e=e|0,0}function t7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=E4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],jw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(n7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function jw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function n7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=r7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,i7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],jw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,o7(e,_),u7(_),h=k;return}}function r7(e){return e=e|0,357913941}function i7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function o7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function u7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Uw(e){e=e|0,f7(e)}function s7(e){e=e|0,l7(e+24|0)}function l7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function f7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,6,n,c7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function c7(){return 1364}function a7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;return o=h,h=h+16|0,s=o+8|0,l=o,d=d7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],r=p7(n,s,r)|0,h=o,r|0}function d7(e){return e=e|0,(t[(E4()|0)+24>>2]|0)+(e*12|0)|0}function p7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),ts(s,r),s=ns(s,r)|0,s=ip(J4[o&15](e,s)|0)|0,h=l,s|0}function h7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],m7(e,r,s,0),h=o}function m7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=S4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=v7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,g7(l,o)|0,o),h=s}function S4(){var e=0,n=0;if(c[7848]|0||(zw(10136),Bt(49,10136,Q|0)|0,n=7848,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10136)|0)){e=10136,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));zw(10136)}return 10136}function v7(e){return e=e|0,0}function g7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=S4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],qw(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(_7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function qw(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function _7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=y7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,w7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],qw(l,o,r),t[y>>2]=(t[y>>2]|0)+12,D7(e,_),E7(_),h=k;return}}function y7(e){return e=e|0,357913941}function w7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function D7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function E7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function zw(e){e=e|0,T7(e)}function S7(e){e=e|0,C7(e+24|0)}function C7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function T7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,9,n,x7()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function x7(){return 1372}function k7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,s=o+8|0,l=o,d=A7(e)|0,e=t[d+4>>2]|0,t[l>>2]=t[d>>2],t[l+4>>2]=e,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],O7(n,s,r),h=o}function A7(e){return e=e|0,(t[(S4()|0)+24>>2]|0)+(e*12|0)|0}function O7(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=tt;l=h,h=h+16|0,s=l,o=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(o=t[(t[e>>2]|0)+o>>2]|0),I7(s,r),d=w(P7(s,r)),tD[o&1](e,d),h=l}function I7(e,n){e=e|0,n=+n}function P7(e,n){return e=e|0,n=+n,w(M7(n))}function M7(e){return e=+e,w(e)}function F7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,s=o+8|0,l=o,_=t[r>>2]|0,d=t[r+4>>2]|0,r=Zn(n)|0,t[l>>2]=_,t[l+4>>2]=d,t[s>>2]=t[l>>2],t[s+4>>2]=t[l+4>>2],L7(e,r,s,0),h=o}function L7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0,y=0,k=0,T=0;s=h,h=h+32|0,l=s+16|0,T=s+8|0,_=s,k=t[r>>2]|0,y=t[r+4>>2]|0,d=t[e>>2]|0,e=C4()|0,t[T>>2]=k,t[T+4>>2]=y,t[l>>2]=t[T>>2],t[l+4>>2]=t[T+4>>2],r=R7(l)|0,t[_>>2]=k,t[_+4>>2]=y,t[l>>2]=t[_>>2],t[l+4>>2]=t[_+4>>2],ur(d,n,e,r,N7(l,o)|0,o),h=s}function C4(){var e=0,n=0;if(c[7856]|0||(Hw(10172),Bt(50,10172,Q|0)|0,n=7856,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10172)|0)){e=10172,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Hw(10172)}return 10172}function R7(e){return e=e|0,0}function N7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0;return T=h,h=h+32|0,s=T+24|0,d=T+16|0,_=T,y=T+8|0,l=t[e>>2]|0,o=t[e+4>>2]|0,t[_>>2]=l,t[_+4>>2]=o,P=C4()|0,k=P+24|0,e=Lt(n,4)|0,t[y>>2]=e,n=P+28|0,r=t[n>>2]|0,r>>>0<(t[P+32>>2]|0)>>>0?(t[d>>2]=l,t[d+4>>2]=o,t[s>>2]=t[d>>2],t[s+4>>2]=t[d+4>>2],Ww(r,s,e),e=(t[n>>2]|0)+12|0,t[n>>2]=e):(B7(k,_,y),e=t[n>>2]|0),h=T,((e-(t[k>>2]|0)|0)/12|0)+-1|0}function Ww(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=t[n+4>>2]|0,t[e>>2]=t[n>>2],t[e+4>>2]=o,t[e+8>>2]=r}function B7(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;if(k=h,h=h+48|0,o=k+32|0,d=k+24|0,_=k,y=e+4|0,s=(((t[y>>2]|0)-(t[e>>2]|0)|0)/12|0)+1|0,l=j7(e)|0,l>>>0>>0)$n(e);else{T=t[e>>2]|0,q=((t[e+8>>2]|0)-T|0)/12|0,P=q<<1,U7(_,q>>>0>>1>>>0?P>>>0>>0?s:P:l,((t[y>>2]|0)-T|0)/12|0,e+8|0),y=_+8|0,l=t[y>>2]|0,s=t[n+4>>2]|0,r=t[r>>2]|0,t[d>>2]=t[n>>2],t[d+4>>2]=s,t[o>>2]=t[d>>2],t[o+4>>2]=t[d+4>>2],Ww(l,o,r),t[y>>2]=(t[y>>2]|0)+12,q7(e,_),z7(_),h=k;return}}function j7(e){return e=e|0,357913941}function U7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>357913941)_n();else{s=Tt(n*12|0)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r*12|0)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n*12|0)}function q7(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(((s|0)/-12|0)*12|0)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function z7(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~(((o+-12-n|0)>>>0)/12|0)*12|0)),e=t[e>>2]|0,e|0&&Ve(e)}function Hw(e){e=e|0,b7(e)}function W7(e){e=e|0,H7(e+24|0)}function H7(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~(((n+-12-o|0)>>>0)/12|0)*12|0)),Ve(r))}function b7(e){e=e|0;var n=0;n=An()|0,Nn(e,2,3,n,G7()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function G7(){return 1380}function V7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+8|0,d=s,_=Y7(e)|0,e=t[_+4>>2]|0,t[d>>2]=t[_>>2],t[d+4>>2]=e,t[l>>2]=t[d>>2],t[l+4>>2]=t[d+4>>2],$7(n,l,r,o),h=s}function Y7(e){return e=e|0,(t[(C4()|0)+24>>2]|0)+(e*12|0)|0}function $7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;_=h,h=h+16|0,l=_+1|0,d=_,s=t[n>>2]|0,n=t[n+4>>2]|0,e=e+(n>>1)|0,n&1&&(s=t[(t[e>>2]|0)+s>>2]|0),ts(l,r),l=ns(l,r)|0,K7(d,o),d=X7(d,o)|0,X1[s&15](e,l,d),h=_}function K7(e,n){e=e|0,n=n|0}function X7(e,n){return e=e|0,n=n|0,J7(n)|0}function J7(e){return e=e|0,(e|0)!=0|0}function Q7(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=T4()|0,e=Z7(r)|0,ur(l,n,s,e,ek(r,o)|0,o)}function T4(){var e=0,n=0;if(c[7864]|0||(Gw(10208),Bt(51,10208,Q|0)|0,n=7864,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10208)|0)){e=10208,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Gw(10208)}return 10208}function Z7(e){return e=e|0,e|0}function ek(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=T4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(bw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function bw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rk(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,bw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,ik(e,s),ok(s),h=_;return}}function nk(e){return e=e|0,536870911}function rk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function ik(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function ok(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Gw(e){e=e|0,lk(e)}function uk(e){e=e|0,sk(e+24|0)}function sk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,24,n,fk()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fk(){return 1392}function ck(e,n){e=e|0,n=n|0,dk(t[(ak(e)|0)>>2]|0,n)}function ak(e){return e=e|0,(t[(T4()|0)+24>>2]|0)+(e<<3)|0}function dk(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,Lw(o,n),n=Rw(o,n)|0,Nl[e&127](n),h=r}function pk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=x4()|0,e=hk(r)|0,ur(l,n,s,e,mk(r,o)|0,o)}function x4(){var e=0,n=0;if(c[7872]|0||(Yw(10244),Bt(52,10244,Q|0)|0,n=7872,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10244)|0)){e=10244,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));Yw(10244)}return 10244}function hk(e){return e=e|0,e|0}function mk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=x4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(Vw(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(vk(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function Vw(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function vk(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=gk(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,_k(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,Vw(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,yk(e,s),wk(s),h=_;return}}function gk(e){return e=e|0,536870911}function _k(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function yk(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function wk(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function Yw(e){e=e|0,Sk(e)}function Dk(e){e=e|0,Ek(e+24|0)}function Ek(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function Sk(e){e=e|0;var n=0;n=An()|0,Nn(e,1,16,n,Ck()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Ck(){return 1400}function Tk(e){return e=e|0,kk(t[(xk(e)|0)>>2]|0)|0}function xk(e){return e=e|0,(t[(x4()|0)+24>>2]|0)+(e<<3)|0}function kk(e){return e=e|0,Ak(ph[e&7]()|0)|0}function Ak(e){return e=e|0,e|0}function Ok(){var e=0;return c[7880]|0||(Nk(10280),Bt(25,10280,Q|0)|0,e=7880,t[e>>2]=1,t[e+4>>2]=0),10280}function Ik(e,n){e=e|0,n=n|0,t[e>>2]=Pk()|0,t[e+4>>2]=Mk()|0,t[e+12>>2]=n,t[e+8>>2]=Fk()|0,t[e+32>>2]=4}function Pk(){return 11711}function Mk(){return 1356}function Fk(){return eh()|0}function Lk(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(Rk(r),Ve(r)):n|0&&(Gi(n),Ve(n))}function Rk(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function Nk(e){e=e|0,Ys(e)}function Bk(e){e=e|0,jk(e,4920),Uk(e)|0,qk(e)|0}function jk(e,n){e=e|0,n=n|0;var r=0;r=Up()|0,t[e>>2]=r,sA(r,n),Cf(t[e>>2]|0)}function Uk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,Jk()|0),e|0}function qk(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,zk()|0),e|0}function zk(){var e=0;return c[7888]|0||($w(10328),Bt(53,10328,Q|0)|0,e=7888,t[e>>2]=1,t[e+4>>2]=0),Dn(10328)|0||$w(10328),10328}function uc(e,n){e=e|0,n=n|0,ur(e,0,n,0,0,0)}function $w(e){e=e|0,bk(e),sc(e,10)}function Wk(e){e=e|0,Hk(e+24|0)}function Hk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function bk(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,$k()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function Gk(e,n,r){e=e|0,n=n|0,r=+r,Vk(e,n,r)}function sc(e,n){e=e|0,n=n|0,t[e+20>>2]=n}function Vk(e,n,r){e=e|0,n=n|0,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+16|0,l=o+8|0,_=o+13|0,s=o,d=o+12|0,ts(_,n),t[l>>2]=ns(_,n)|0,wu(d,r),L[s>>3]=+Du(d,r),Yk(e,l,s),h=o}function Yk(e,n,r){e=e|0,n=n|0,r=r|0,M(e+8|0,t[n>>2]|0,+L[r>>3]),c[e+24>>0]=1}function $k(){return 1404}function Kk(e,n){return e=e|0,n=+n,Xk(e,n)|0}function Xk(e,n){e=e|0,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,l=o+4|0,d=o+8|0,_=o,s=Qo(8)|0,r=s,y=Tt(16)|0,ts(l,e),e=ns(l,e)|0,wu(d,n),M(y,e,+Du(d,n)),d=r+4|0,t[d>>2]=y,e=Tt(8)|0,d=t[d>>2]|0,t[_>>2]=0,t[l>>2]=t[_>>2],P1(e,d,l),t[s>>2]=e,h=o,r|0}function Jk(){var e=0;return c[7896]|0||(Kw(10364),Bt(54,10364,Q|0)|0,e=7896,t[e>>2]=1,t[e+4>>2]=0),Dn(10364)|0||Kw(10364),10364}function Kw(e){e=e|0,eA(e),sc(e,55)}function Qk(e){e=e|0,Zk(e+24|0)}function Zk(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function eA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,4,n,iA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function tA(e){e=e|0,nA(e)}function nA(e){e=e|0,rA(e)}function rA(e){e=e|0,Xw(e+8|0),c[e+24>>0]=1}function Xw(e){e=e|0,t[e>>2]=0,L[e+8>>3]=0}function iA(){return 1424}function oA(){return uA()|0}function uA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,Xw(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],P1(o,l,s),t[r>>2]=o,h=n,e|0}function sA(e,n){e=e|0,n=n|0,t[e>>2]=lA()|0,t[e+4>>2]=fA()|0,t[e+12>>2]=n,t[e+8>>2]=cA()|0,t[e+32>>2]=5}function lA(){return 11710}function fA(){return 1416}function cA(){return th()|0}function aA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dA(r),Ve(r)):n|0&&Ve(n)}function dA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function th(){var e=0;return c[7904]|0||(t[2600]=pA()|0,t[2601]=0,e=7904,t[e>>2]=1,t[e+4>>2]=0),10400}function pA(){return t[357]|0}function hA(e){e=e|0,mA(e,4926),vA(e)|0}function mA(e,n){e=e|0,n=n|0;var r=0;r=u1()|0,t[e>>2]=r,kA(r,n),Cf(t[e>>2]|0)}function vA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,gA()|0),e|0}function gA(){var e=0;return c[7912]|0||(Jw(10412),Bt(56,10412,Q|0)|0,e=7912,t[e>>2]=1,t[e+4>>2]=0),Dn(10412)|0||Jw(10412),10412}function Jw(e){e=e|0,wA(e),sc(e,57)}function _A(e){e=e|0,yA(e+24|0)}function yA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function wA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,5,n,CA()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function DA(e){e=e|0,EA(e)}function EA(e){e=e|0,SA(e)}function SA(e){e=e|0;var n=0,r=0;n=e+8|0,r=n+48|0;do t[n>>2]=0,n=n+4|0;while((n|0)<(r|0));c[e+56>>0]=1}function CA(){return 1432}function TA(){return xA()|0}function xA(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0;d=h,h=h+16|0,e=d+4|0,n=d,r=Qo(8)|0,o=r,s=Tt(48)|0,l=s,_=l+48|0;do t[l>>2]=0,l=l+4|0;while((l|0)<(_|0));return l=o+4|0,t[l>>2]=s,_=Tt(8)|0,l=t[l>>2]|0,t[n>>2]=0,t[e>>2]=t[n>>2],Wd(_,l,e),t[r>>2]=_,h=d,o|0}function kA(e,n){e=e|0,n=n|0,t[e>>2]=AA()|0,t[e+4>>2]=OA()|0,t[e+12>>2]=n,t[e+8>>2]=IA()|0,t[e+32>>2]=6}function AA(){return 11704}function OA(){return 1436}function IA(){return th()|0}function PA(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(MA(r),Ve(r)):n|0&&Ve(n)}function MA(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function FA(e){e=e|0,LA(e,4933),RA(e)|0,NA(e)|0}function LA(e,n){e=e|0,n=n|0;var r=0;r=uO()|0,t[e>>2]=r,sO(r,n),Cf(t[e>>2]|0)}function RA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,XA()|0),e|0}function NA(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,BA()|0),e|0}function BA(){var e=0;return c[7920]|0||(Qw(10452),Bt(58,10452,Q|0)|0,e=7920,t[e>>2]=1,t[e+4>>2]=0),Dn(10452)|0||Qw(10452),10452}function Qw(e){e=e|0,qA(e),sc(e,1)}function jA(e){e=e|0,UA(e+24|0)}function UA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function qA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,1,n,bA()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function zA(e,n,r){e=e|0,n=+n,r=+r,WA(e,n,r)}function WA(e,n,r){e=e|0,n=+n,r=+r;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,l=o+8|0,_=o+17|0,s=o,d=o+16|0,wu(_,n),L[l>>3]=+Du(_,n),wu(d,r),L[s>>3]=+Du(d,r),HA(e,l,s),h=o}function HA(e,n,r){e=e|0,n=n|0,r=r|0,Zw(e+8|0,+L[n>>3],+L[r>>3]),c[e+24>>0]=1}function Zw(e,n,r){e=e|0,n=+n,r=+r,L[e>>3]=n,L[e+8>>3]=r}function bA(){return 1472}function GA(e,n){return e=+e,n=+n,VA(e,n)|0}function VA(e,n){e=+e,n=+n;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+16|0,d=o+4|0,_=o+8|0,y=o,s=Qo(8)|0,r=s,l=Tt(16)|0,wu(d,e),e=+Du(d,e),wu(_,n),Zw(l,e,+Du(_,n)),_=r+4|0,t[_>>2]=l,l=Tt(8)|0,_=t[_>>2]|0,t[y>>2]=0,t[d>>2]=t[y>>2],e8(l,_,d),t[s>>2]=l,h=o,r|0}function e8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1452,t[r+12>>2]=n,t[e+4>>2]=r}function YA(e){e=e|0,da(e),Ve(e)}function $A(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function KA(e){e=e|0,Ve(e)}function XA(){var e=0;return c[7928]|0||(t8(10488),Bt(59,10488,Q|0)|0,e=7928,t[e>>2]=1,t[e+4>>2]=0),Dn(10488)|0||t8(10488),10488}function t8(e){e=e|0,ZA(e),sc(e,60)}function JA(e){e=e|0,QA(e+24|0)}function QA(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function ZA(e){e=e|0;var n=0;n=An()|0,Nn(e,5,6,n,rO()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function eO(e){e=e|0,tO(e)}function tO(e){e=e|0,nO(e)}function nO(e){e=e|0,n8(e+8|0),c[e+24>>0]=1}function n8(e){e=e|0,t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,t[e+12>>2]=0}function rO(){return 1492}function iO(){return oO()|0}function oO(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,o=Tt(16)|0,n8(o),l=e+4|0,t[l>>2]=o,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],e8(o,l,s),t[r>>2]=o,h=n,e|0}function uO(){var e=0;return c[7936]|0||(pO(10524),Bt(25,10524,Q|0)|0,e=7936,t[e>>2]=1,t[e+4>>2]=0),10524}function sO(e,n){e=e|0,n=n|0,t[e>>2]=lO()|0,t[e+4>>2]=fO()|0,t[e+12>>2]=n,t[e+8>>2]=cO()|0,t[e+32>>2]=7}function lO(){return 11700}function fO(){return 1484}function cO(){return th()|0}function aO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(dO(r),Ve(r)):n|0&&Ve(n)}function dO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function pO(e){e=e|0,Ys(e)}function hO(e,n,r){e=e|0,n=n|0,r=r|0,e=Zn(n)|0,n=mO(r)|0,r=vO(r,0)|0,VO(e,n,r,k4()|0,0)}function mO(e){return e=e|0,e|0}function vO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=k4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(i8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(SO(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k4(){var e=0,n=0;if(c[7944]|0||(r8(10568),Bt(61,10568,Q|0)|0,n=7944,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10568)|0)){e=10568,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));r8(10568)}return 10568}function r8(e){e=e|0,yO(e)}function gO(e){e=e|0,_O(e+24|0)}function _O(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yO(e){e=e|0;var n=0;n=An()|0,Nn(e,1,17,n,Dp()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wO(e){return e=e|0,EO(t[(DO(e)|0)>>2]|0)|0}function DO(e){return e=e|0,(t[(k4()|0)+24>>2]|0)+(e<<3)|0}function EO(e){return e=e|0,ea(ph[e&7]()|0)|0}function i8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function SO(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=CO(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,TO(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,i8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,xO(e,s),kO(s),h=_;return}}function CO(e){return e=e|0,536870911}function TO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function xO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function kO(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function AO(){OO()}function OO(){IO(10604)}function IO(e){e=e|0,PO(e,4955)}function PO(e,n){e=e|0,n=n|0;var r=0;r=MO()|0,t[e>>2]=r,FO(r,n),Cf(t[e>>2]|0)}function MO(){var e=0;return c[7952]|0||(WO(10612),Bt(25,10612,Q|0)|0,e=7952,t[e>>2]=1,t[e+4>>2]=0),10612}function FO(e,n){e=e|0,n=n|0,t[e>>2]=BO()|0,t[e+4>>2]=jO()|0,t[e+12>>2]=n,t[e+8>>2]=UO()|0,t[e+32>>2]=8}function Cf(e){e=e|0;var n=0,r=0;n=h,h=h+16|0,r=n,sa()|0,t[r>>2]=e,LO(10608,r),h=n}function sa(){return c[11714]|0||(t[2652]=0,Bt(62,10608,Q|0)|0,c[11714]=1),10608}function LO(e,n){e=e|0,n=n|0;var r=0;r=Tt(8)|0,t[r+4>>2]=t[n>>2],t[r>>2]=t[e>>2],t[e>>2]=r}function RO(e){e=e|0,NO(e)}function NO(e){e=e|0;var n=0,r=0;if(n=t[e>>2]|0,n|0)do r=n,n=t[n>>2]|0,Ve(r);while((n|0)!=0);t[e>>2]=0}function BO(){return 11715}function jO(){return 1496}function UO(){return eh()|0}function qO(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(zO(r),Ve(r)):n|0&&Ve(n)}function zO(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function WO(e){e=e|0,Ys(e)}function HO(e,n){e=e|0,n=n|0;var r=0,o=0;sa()|0,r=t[2652]|0;e:do if(r|0){for(;o=t[r+4>>2]|0,!(o|0?(U8(A4(o)|0,e)|0)==0:0);)if(r=t[r>>2]|0,!r)break e;bO(o,n)}while(0)}function A4(e){return e=e|0,t[e+12>>2]|0}function bO(e,n){e=e|0,n=n|0;var r=0;e=e+36|0,r=t[e>>2]|0,r|0&&(Ju(r),Ve(r)),r=Tt(4)|0,ba(r,n),t[e>>2]=r}function O4(){return c[11716]|0||(t[2664]=0,Bt(63,10656,Q|0)|0,c[11716]=1),10656}function o8(){var e=0;return c[11717]|0?e=t[2665]|0:(GO(),t[2665]=1504,c[11717]=1,e=1504),e|0}function GO(){c[11740]|0||(c[11718]=Lt(Lt(8,0)|0,0)|0,c[11719]=Lt(Lt(0,0)|0,0)|0,c[11720]=Lt(Lt(0,16)|0,0)|0,c[11721]=Lt(Lt(8,0)|0,0)|0,c[11722]=Lt(Lt(0,0)|0,0)|0,c[11723]=Lt(Lt(8,0)|0,0)|0,c[11724]=Lt(Lt(0,0)|0,0)|0,c[11725]=Lt(Lt(8,0)|0,0)|0,c[11726]=Lt(Lt(0,0)|0,0)|0,c[11727]=Lt(Lt(8,0)|0,0)|0,c[11728]=Lt(Lt(0,0)|0,0)|0,c[11729]=Lt(Lt(0,0)|0,32)|0,c[11730]=Lt(Lt(0,0)|0,32)|0,c[11740]=1)}function u8(){return 1572}function VO(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0;l=h,h=h+32|0,T=l+16|0,k=l+12|0,y=l+8|0,_=l+4|0,d=l,t[T>>2]=e,t[k>>2]=n,t[y>>2]=r,t[_>>2]=o,t[d>>2]=s,O4()|0,YO(10656,T,k,y,_,d),h=l}function YO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0;d=Tt(24)|0,t1(d+4|0,t[n>>2]|0,t[r>>2]|0,t[o>>2]|0,t[s>>2]|0,t[l>>2]|0),t[d>>2]=t[e>>2],t[e>>2]=d}function s8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0;if(qe=h,h=h+32|0,le=qe+20|0,ie=qe+8|0,Pe=qe+4|0,ke=qe,n=t[n>>2]|0,n|0){we=le+4|0,y=le+8|0,k=ie+4|0,T=ie+8|0,P=ie+8|0,q=le+8|0;do{if(d=n+4|0,_=I4(d)|0,_|0){if(s=b1(_)|0,t[le>>2]=0,t[we>>2]=0,t[y>>2]=0,o=(G1(_)|0)+1|0,$O(le,o),o|0)for(;o=o+-1|0,os(ie,t[s>>2]|0),l=t[we>>2]|0,l>>>0<(t[q>>2]|0)>>>0?(t[l>>2]=t[ie>>2],t[we>>2]=(t[we>>2]|0)+4):P4(le,ie),o;)s=s+4|0;o=V1(_)|0,t[ie>>2]=0,t[k>>2]=0,t[T>>2]=0;e:do if(t[o>>2]|0)for(s=0,l=0;;){if((s|0)==(l|0)?KO(ie,o):(t[s>>2]=t[o>>2],t[k>>2]=(t[k>>2]|0)+4),o=o+4|0,!(t[o>>2]|0))break e;s=t[k>>2]|0,l=t[P>>2]|0}while(0);t[Pe>>2]=nh(d)|0,t[ke>>2]=Dn(_)|0,XO(r,e,Pe,ke,le,ie),M4(ie),Rl(le)}n=t[n>>2]|0}while((n|0)!=0)}h=qe}function I4(e){return e=e|0,t[e+12>>2]|0}function b1(e){return e=e|0,t[e+12>>2]|0}function G1(e){return e=e|0,t[e+16>>2]|0}function $O(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+32|0,r=s,o=t[e>>2]|0,(t[e+8>>2]|0)-o>>2>>>0>>0&&(m8(r,n,(t[e+4>>2]|0)-o>>2,e+8|0),v8(e,r),g8(r)),h=s}function P4(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=h8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,m8(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,v8(e,r),g8(r),h=d;return}}function V1(e){return e=e|0,t[e+8>>2]|0}function KO(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;if(d=h,h=h+32|0,r=d,o=e+4|0,s=((t[o>>2]|0)-(t[e>>2]|0)>>2)+1|0,l=p8(e)|0,l>>>0>>0)$n(e);else{_=t[e>>2]|0,k=(t[e+8>>2]|0)-_|0,y=k>>1,mI(r,k>>2>>>0>>1>>>0?y>>>0>>0?s:y:l,(t[o>>2]|0)-_>>2,e+8|0),l=r+8|0,t[t[l>>2]>>2]=t[n>>2],t[l>>2]=(t[l>>2]|0)+4,vI(e,r),gI(r),h=d;return}}function nh(e){return e=e|0,t[e>>2]|0}function XO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JO(e,n,r,o,s,l)}function M4(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function Rl(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-4-o|0)>>>2)<<2)),Ve(r))}function JO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+48|0,T=d+40|0,_=d+32|0,P=d+24|0,y=d+12|0,k=d,Zo(_),e=Oi(e)|0,t[P>>2]=t[n>>2],r=t[r>>2]|0,o=t[o>>2]|0,F4(y,s),QO(k,l),t[T>>2]=t[P>>2],ZO(e,T,r,o,y,k),M4(k),Rl(y),eu(_),h=d}function F4(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(pI(e,o),hI(e,t[n>>2]|0,t[r>>2]|0,o))}function QO(e,n){e=e|0,n=n|0;var r=0,o=0;t[e>>2]=0,t[e+4>>2]=0,t[e+8>>2]=0,r=n+4|0,o=(t[r>>2]|0)-(t[n>>2]|0)>>2,o|0&&(aI(e,o),dI(e,t[n>>2]|0,t[r>>2]|0,o))}function ZO(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,T=d+28|0,P=d+24|0,_=d+12|0,y=d,k=ko(eI()|0)|0,t[P>>2]=t[n>>2],t[T>>2]=t[P>>2],n=lc(T)|0,r=l8(r)|0,o=L4(o)|0,t[_>>2]=t[s>>2],T=s+4|0,t[_+4>>2]=t[T>>2],P=s+8|0,t[_+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[s>>2]=0,s=R4(_)|0,t[y>>2]=t[l>>2],T=l+4|0,t[y+4>>2]=t[T>>2],P=l+8|0,t[y+8>>2]=t[P>>2],t[P>>2]=0,t[T>>2]=0,t[l>>2]=0,qo(0,k|0,e|0,n|0,r|0,o|0,s|0,tI(y)|0)|0,M4(y),Rl(_),h=d}function eI(){var e=0;return c[7968]|0||(fI(10708),e=7968,t[e>>2]=1,t[e+4>>2]=0),10708}function lc(e){return e=e|0,c8(e)|0}function l8(e){return e=e|0,f8(e)|0}function L4(e){return e=e|0,ea(e)|0}function R4(e){return e=e|0,rI(e)|0}function tI(e){return e=e|0,nI(e)|0}function nI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=f8(t[(t[e>>2]|0)+(n<<2)>>2]|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function f8(e){return e=e|0,e|0}function rI(e){e=e|0;var n=0,r=0,o=0;if(o=(t[e+4>>2]|0)-(t[e>>2]|0)|0,r=o>>2,o=Qo(o+4|0)|0,t[o>>2]=r,r|0){n=0;do t[o+4+(n<<2)>>2]=c8((t[e>>2]|0)+(n<<2)|0)|0,n=n+1|0;while((n|0)!=(r|0))}return o|0}function c8(e){e=e|0;var n=0,r=0,o=0,s=0;return s=h,h=h+32|0,n=s+12|0,r=s,o=U0(a8()|0)|0,o?(s1(n,o),l1(r,n),UF(e,r),e=f1(n)|0):e=iI(e)|0,h=s,e|0}function a8(){var e=0;return c[7960]|0||(lI(10664),Bt(25,10664,Q|0)|0,e=7960,t[e>>2]=1,t[e+4>>2]=0),10664}function iI(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,t[_>>2]=t[e>>2],l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function d8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1656,t[r+12>>2]=n,t[e+4>>2]=r}function oI(e){e=e|0,da(e),Ve(e)}function uI(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function sI(e){e=e|0,Ve(e)}function lI(e){e=e|0,Ys(e)}function fI(e){e=e|0,Ao(e,cI()|0,5)}function cI(){return 1676}function aI(e,n){e=e|0,n=n|0;var r=0;if((p8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function dI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function p8(e){return e=e|0,1073741823}function pI(e,n){e=e|0,n=n|0;var r=0;if((h8(e)|0)>>>0>>0&&$n(e),n>>>0>1073741823)_n();else{r=Tt(n<<2)|0,t[e+4>>2]=r,t[e>>2]=r,t[e+8>>2]=r+(n<<2);return}}function hI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,o=e+4|0,e=r-n|0,(e|0)>0&&(vn(t[o>>2]|0,n|0,e|0)|0,t[o>>2]=(t[o>>2]|0)+(e>>>2<<2))}function h8(e){return e=e|0,1073741823}function mI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function vI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function gI(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function m8(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>1073741823)_n();else{s=Tt(n<<2)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<2)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<2)}function v8(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>2)<<2)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function g8(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-4-n|0)>>>2)<<2)),e=t[e>>2]|0,e|0&&Ve(e)}function _I(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(ie=h,h=h+32|0,T=ie+20|0,P=ie+12|0,k=ie+16|0,q=ie+4|0,we=ie,le=ie+8|0,_=o8()|0,l=t[_>>2]|0,d=t[l>>2]|0,d|0)for(y=t[_+8>>2]|0,_=t[_+4>>2]|0;os(T,d),yI(e,T,_,y),l=l+4|0,d=t[l>>2]|0,d;)y=y+1|0,_=_+1|0;if(l=u8()|0,d=t[l>>2]|0,d|0)do os(T,d),t[P>>2]=t[l+4>>2],wI(n,T,P),l=l+8|0,d=t[l>>2]|0;while((d|0)!=0);if(l=t[(sa()|0)>>2]|0,l|0)do n=t[l+4>>2]|0,os(T,t[(la(n)|0)>>2]|0),t[P>>2]=A4(n)|0,DI(r,T,P),l=t[l>>2]|0;while((l|0)!=0);if(os(k,0),l=O4()|0,t[T>>2]=t[k>>2],s8(T,l,s),l=t[(sa()|0)>>2]|0,l|0){e=T+4|0,n=T+8|0,r=T+8|0;do{if(y=t[l+4>>2]|0,os(P,t[(la(y)|0)>>2]|0),EI(q,_8(y)|0),d=t[q>>2]|0,d|0){t[T>>2]=0,t[e>>2]=0,t[n>>2]=0;do os(we,t[(la(t[d+4>>2]|0)|0)>>2]|0),_=t[e>>2]|0,_>>>0<(t[r>>2]|0)>>>0?(t[_>>2]=t[we>>2],t[e>>2]=(t[e>>2]|0)+4):P4(T,we),d=t[d>>2]|0;while((d|0)!=0);SI(o,P,T),Rl(T)}t[le>>2]=t[P>>2],k=y8(y)|0,t[T>>2]=t[le>>2],s8(T,k,s),bd(q),l=t[l>>2]|0}while((l|0)!=0)}h=ie}function yI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,RI(e,n,r,o)}function wI(e,n,r){e=e|0,n=n|0,r=r|0,LI(e,n,r)}function la(e){return e=e|0,e|0}function DI(e,n,r){e=e|0,n=n|0,r=r|0,II(e,n,r)}function _8(e){return e=e|0,e+16|0}function EI(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(l=h,h=h+16|0,s=l+8|0,r=l,t[e>>2]=0,o=t[n>>2]|0,t[s>>2]=o,t[r>>2]=e,r=OI(r)|0,o|0){if(o=Tt(12)|0,d=(w8(s)|0)+4|0,e=t[d+4>>2]|0,n=o+4|0,t[n>>2]=t[d>>2],t[n+4>>2]=e,n=t[t[s>>2]>>2]|0,t[s>>2]=n,!n)e=o;else for(n=o;e=Tt(12)|0,y=(w8(s)|0)+4|0,_=t[y+4>>2]|0,d=e+4|0,t[d>>2]=t[y>>2],t[d+4>>2]=_,t[n>>2]=e,d=t[t[s>>2]>>2]|0,t[s>>2]=d,d;)n=e;t[e>>2]=t[r>>2],t[r>>2]=o}h=l}function SI(e,n,r){e=e|0,n=n|0,r=r|0,CI(e,n,r)}function y8(e){return e=e|0,e+24|0}function CI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+24|0,s=o+16|0,_=o+12|0,l=o,Zo(s),e=Oi(e)|0,t[_>>2]=t[n>>2],F4(l,r),t[d>>2]=t[_>>2],TI(e,d,l),Rl(l),eu(s),h=o}function TI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=h,h=h+32|0,d=o+16|0,_=o+12|0,s=o,l=ko(xI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,t[s>>2]=t[r>>2],d=r+4|0,t[s+4>>2]=t[d>>2],_=r+8|0,t[s+8>>2]=t[_>>2],t[_>>2]=0,t[d>>2]=0,t[r>>2]=0,Ts(0,l|0,e|0,n|0,R4(s)|0)|0,Rl(s),h=o}function xI(){var e=0;return c[7976]|0||(kI(10720),e=7976,t[e>>2]=1,t[e+4>>2]=0),10720}function kI(e){e=e|0,Ao(e,AI()|0,2)}function AI(){return 1732}function OI(e){return e=e|0,t[e>>2]|0}function w8(e){return e=e|0,t[e>>2]|0}function II(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function D8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+16|0,l=o+4|0,d=o,s=ko(PI()|0)|0,t[d>>2]=t[n>>2],t[l>>2]=t[d>>2],n=lc(l)|0,Ts(0,s|0,e|0,n|0,l8(r)|0)|0,h=o}function PI(){var e=0;return c[7984]|0||(MI(10732),e=7984,t[e>>2]=1,t[e+4>>2]=0),10732}function MI(e){e=e|0,Ao(e,FI()|0,2)}function FI(){return 1744}function LI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;o=h,h=h+32|0,l=o+16|0,s=o+8|0,d=o,Zo(s),e=Oi(e)|0,t[d>>2]=t[n>>2],r=t[r>>2]|0,t[l>>2]=t[d>>2],D8(e,l,r),eu(s),h=o}function RI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),e=Oi(e)|0,t[_>>2]=t[n>>2],r=c[r>>0]|0,o=c[o>>0]|0,t[d>>2]=t[_>>2],NI(e,d,r,o),eu(l),h=s}function NI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,d=s+4|0,_=s,l=ko(BI()|0)|0,t[_>>2]=t[n>>2],t[d>>2]=t[_>>2],n=lc(d)|0,r=fa(r)|0,Bu(0,l|0,e|0,n|0,r|0,fa(o)|0)|0,h=s}function BI(){var e=0;return c[7992]|0||(UI(10744),e=7992,t[e>>2]=1,t[e+4>>2]=0),10744}function fa(e){return e=e|0,jI(e)|0}function jI(e){return e=e|0,e&255|0}function UI(e){e=e|0,Ao(e,qI()|0,3)}function qI(){return 1756}function zI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;switch(q=h,h=h+32|0,_=q+8|0,y=q+4|0,k=q+20|0,T=q,_1(e,0),o=jF(n)|0,t[_>>2]=0,P=_+4|0,t[P>>2]=0,t[_+8>>2]=0,o<<24>>24){case 0:{c[k>>0]=0,WI(y,r,k),rh(e,y)|0,ei(y);break}case 8:{P=z4(n)|0,c[k>>0]=8,os(T,t[P+4>>2]|0),HI(y,r,k,T,P+8|0),rh(e,y)|0,ei(y);break}case 9:{if(l=z4(n)|0,n=t[l+4>>2]|0,n|0)for(d=_+8|0,s=l+12|0;n=n+-1|0,os(y,t[s>>2]|0),o=t[P>>2]|0,o>>>0<(t[d>>2]|0)>>>0?(t[o>>2]=t[y>>2],t[P>>2]=(t[P>>2]|0)+4):P4(_,y),n;)s=s+4|0;c[k>>0]=9,os(T,t[l+8>>2]|0),bI(y,r,k,T,_),rh(e,y)|0,ei(y);break}default:P=z4(n)|0,c[k>>0]=o,os(T,t[P+4>>2]|0),GI(y,r,k,T),rh(e,y)|0,ei(y)}Rl(_),h=q}function WI(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;o=h,h=h+16|0,s=o,Zo(s),n=Oi(n)|0,iP(e,n,c[r>>0]|0),eu(s),h=o}function rh(e,n){e=e|0,n=n|0;var r=0;return r=t[e>>2]|0,r|0&&ju(r|0),t[e>>2]=t[n>>2],t[n>>2]=0,e|0}function HI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+32|0,_=l+16|0,d=l+8|0,y=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[y>>2]=t[o>>2],s=t[s>>2]|0,t[_>>2]=t[y>>2],eP(e,n,r,_,s),eu(d),h=l}function bI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+24|0,d=l+16|0,k=l+12|0,_=l,Zo(d),n=Oi(n)|0,r=c[r>>0]|0,t[k>>2]=t[o>>2],F4(_,s),t[y>>2]=t[k>>2],XI(e,n,r,y,_),Rl(_),eu(d),h=l}function GI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+32|0,d=s+16|0,l=s+8|0,_=s,Zo(l),n=Oi(n)|0,r=c[r>>0]|0,t[_>>2]=t[o>>2],t[d>>2]=t[_>>2],VI(e,n,r,d),eu(l),h=s}function VI(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0,d=0,_=0;s=h,h=h+16|0,l=s+4|0,_=s,d=ko(YI()|0)|0,r=fa(r)|0,t[_>>2]=t[o>>2],t[l>>2]=t[_>>2],ih(e,Ts(0,d|0,n|0,r|0,lc(l)|0)|0),h=s}function YI(){var e=0;return c[8e3]|0||($I(10756),e=8e3,t[e>>2]=1,t[e+4>>2]=0),10756}function ih(e,n){e=e|0,n=n|0,_1(e,n)}function $I(e){e=e|0,Ao(e,KI()|0,2)}function KI(){return 1772}function XI(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0;l=h,h=h+32|0,y=l+16|0,k=l+12|0,d=l,_=ko(JI()|0)|0,r=fa(r)|0,t[k>>2]=t[o>>2],t[y>>2]=t[k>>2],o=lc(y)|0,t[d>>2]=t[s>>2],y=s+4|0,t[d+4>>2]=t[y>>2],k=s+8|0,t[d+8>>2]=t[k>>2],t[k>>2]=0,t[y>>2]=0,t[s>>2]=0,ih(e,Bu(0,_|0,n|0,r|0,o|0,R4(d)|0)|0),Rl(d),h=l}function JI(){var e=0;return c[8008]|0||(QI(10768),e=8008,t[e>>2]=1,t[e+4>>2]=0),10768}function QI(e){e=e|0,Ao(e,ZI()|0,3)}function ZI(){return 1784}function eP(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0;l=h,h=h+16|0,_=l+4|0,y=l,d=ko(tP()|0)|0,r=fa(r)|0,t[y>>2]=t[o>>2],t[_>>2]=t[y>>2],o=lc(_)|0,ih(e,Bu(0,d|0,n|0,r|0,o|0,L4(s)|0)|0),h=l}function tP(){var e=0;return c[8016]|0||(nP(10780),e=8016,t[e>>2]=1,t[e+4>>2]=0),10780}function nP(e){e=e|0,Ao(e,rP()|0,3)}function rP(){return 1800}function iP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;o=ko(oP()|0)|0,ih(e,sf(0,o|0,n|0,fa(r)|0)|0)}function oP(){var e=0;return c[8024]|0||(uP(10792),e=8024,t[e>>2]=1,t[e+4>>2]=0),10792}function uP(e){e=e|0,Ao(e,sP()|0,1)}function sP(){return 1816}function lP(){fP(),cP(),aP()}function fP(){t[2702]=K8(65536)|0}function cP(){PP(10856)}function aP(){dP(10816)}function dP(e){e=e|0,pP(e,5044),hP(e)|0}function pP(e,n){e=e|0,n=n|0;var r=0;r=a8()|0,t[e>>2]=r,TP(r,n),Cf(t[e>>2]|0)}function hP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,mP()|0),e|0}function mP(){var e=0;return c[8032]|0||(E8(10820),Bt(64,10820,Q|0)|0,e=8032,t[e>>2]=1,t[e+4>>2]=0),Dn(10820)|0||E8(10820),10820}function E8(e){e=e|0,_P(e),sc(e,25)}function vP(e){e=e|0,gP(e+24|0)}function gP(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function _P(e){e=e|0;var n=0;n=An()|0,Nn(e,5,18,n,EP()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function yP(e,n){e=e|0,n=n|0,wP(e,n)}function wP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;r=h,h=h+16|0,o=r,s=r+4|0,Ml(s,n),t[o>>2]=Fl(s,n)|0,DP(e,o),h=r}function DP(e,n){e=e|0,n=n|0,S8(e+4|0,t[n>>2]|0),c[e+8>>0]=1}function S8(e,n){e=e|0,n=n|0,t[e>>2]=n}function EP(){return 1824}function SP(e){return e=e|0,CP(e)|0}function CP(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0;return r=h,h=h+16|0,s=r+4|0,d=r,o=Qo(8)|0,n=o,_=Tt(4)|0,Ml(s,e),S8(_,Fl(s,e)|0),l=n+4|0,t[l>>2]=_,e=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],d8(e,l,s),t[o>>2]=e,h=r,n|0}function Qo(e){e=e|0;var n=0,r=0;return e=e+7&-8,(e>>>0<=32768?(n=t[2701]|0,e>>>0<=(65536-n|0)>>>0):0)?(r=(t[2702]|0)+n|0,t[2701]=n+e,e=r):(e=K8(e+8|0)|0,t[e>>2]=t[2703],t[2703]=e,e=e+8|0),e|0}function TP(e,n){e=e|0,n=n|0,t[e>>2]=xP()|0,t[e+4>>2]=kP()|0,t[e+12>>2]=n,t[e+8>>2]=AP()|0,t[e+32>>2]=9}function xP(){return 11744}function kP(){return 1832}function AP(){return th()|0}function OP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(IP(r),Ve(r)):n|0&&Ve(n)}function IP(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function PP(e){e=e|0,MP(e,5052),FP(e)|0,LP(e,5058,26)|0,RP(e,5069,1)|0,NP(e,5077,10)|0,BP(e,5087,19)|0,jP(e,5094,27)|0}function MP(e,n){e=e|0,n=n|0;var r=0;r=IF()|0,t[e>>2]=r,PF(r,n),Cf(t[e>>2]|0)}function FP(e){e=e|0;var n=0;return n=t[e>>2]|0,uc(n,vF()|0),e|0}function LP(e,n,r){return e=e|0,n=n|0,r=r|0,QM(e,Zn(n)|0,r,0),e|0}function RP(e,n,r){return e=e|0,n=n|0,r=r|0,BM(e,Zn(n)|0,r,0),e|0}function NP(e,n,r){return e=e|0,n=n|0,r=r|0,mM(e,Zn(n)|0,r,0),e|0}function BP(e,n,r){return e=e|0,n=n|0,r=r|0,eM(e,Zn(n)|0,r,0),e|0}function C8(e,n){e=e|0,n=n|0;var r=0,o=0;e:for(;;){for(r=t[2703]|0;;){if((r|0)==(n|0))break e;if(o=t[r>>2]|0,t[2703]=o,!r)r=o;else break}Ve(r)}t[2701]=e}function jP(e,n,r){return e=e|0,n=n|0,r=r|0,UP(e,Zn(n)|0,r,0),e|0}function UP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=N4()|0,e=qP(r)|0,ur(l,n,s,e,zP(r,o)|0,o)}function N4(){var e=0,n=0;if(c[8040]|0||(x8(10860),Bt(65,10860,Q|0)|0,n=8040,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10860)|0)){e=10860,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));x8(10860)}return 10860}function qP(e){return e=e|0,e|0}function zP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=N4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(T8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(WP(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function T8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function WP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=HP(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,bP(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,T8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,GP(e,s),VP(s),h=_;return}}function HP(e){return e=e|0,536870911}function bP(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function GP(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function VP(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function x8(e){e=e|0,KP(e)}function YP(e){e=e|0,$P(e+24|0)}function $P(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function KP(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,XP()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function XP(){return 1840}function JP(e,n,r){e=e|0,n=n|0,r=r|0,ZP(t[(QP(e)|0)>>2]|0,n,r)}function QP(e){return e=e|0,(t[(N4()|0)+24>>2]|0)+(e<<3)|0}function ZP(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+1|0,s=o,Ml(l,n),n=Fl(l,n)|0,Ml(s,r),r=Fl(s,r)|0,Bl[e&31](n,r),h=o}function eM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=B4()|0,e=tM(r)|0,ur(l,n,s,e,nM(r,o)|0,o)}function B4(){var e=0,n=0;if(c[8048]|0||(A8(10896),Bt(66,10896,Q|0)|0,n=8048,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10896)|0)){e=10896,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));A8(10896)}return 10896}function tM(e){return e=e|0,e|0}function nM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=B4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(k8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(rM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function k8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function rM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=iM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,oM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,k8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,uM(e,s),sM(s),h=_;return}}function iM(e){return e=e|0,536870911}function oM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function uM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function sM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function A8(e){e=e|0,cM(e)}function lM(e){e=e|0,fM(e+24|0)}function fM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function cM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,11,n,aM()|0,1),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function aM(){return 1852}function dM(e,n){return e=e|0,n=n|0,hM(t[(pM(e)|0)>>2]|0,n)|0}function pM(e){return e=e|0,(t[(B4()|0)+24>>2]|0)+(e<<3)|0}function hM(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Ml(o,n),n=Fl(o,n)|0,n=ea(dc[e&31](n)|0)|0,h=r,n|0}function mM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=j4()|0,e=vM(r)|0,ur(l,n,s,e,gM(r,o)|0,o)}function j4(){var e=0,n=0;if(c[8056]|0||(I8(10932),Bt(67,10932,Q|0)|0,n=8056,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10932)|0)){e=10932,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));I8(10932)}return 10932}function vM(e){return e=e|0,e|0}function gM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=j4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(O8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(_M(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function O8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function _M(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=yM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,wM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,O8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,DM(e,s),EM(s),h=_;return}}function yM(e){return e=e|0,536870911}function wM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function DM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function EM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function I8(e){e=e|0,TM(e)}function SM(e){e=e|0,CM(e+24|0)}function CM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function TM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,7,n,xM()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function xM(){return 1860}function kM(e,n,r){return e=e|0,n=n|0,r=r|0,OM(t[(AM(e)|0)>>2]|0,n,r)|0}function AM(e){return e=e|0,(t[(j4()|0)+24>>2]|0)+(e<<3)|0}function OM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0;return o=h,h=h+32|0,d=o+12|0,l=o+8|0,_=o,y=o+16|0,s=o+4|0,IM(y,n),PM(_,y,n),$s(s,r),r=Ks(s,r)|0,t[d>>2]=t[_>>2],X1[e&15](l,d,r),r=MM(l)|0,ei(l),Xs(s),h=o,r|0}function IM(e,n){e=e|0,n=n|0}function PM(e,n,r){e=e|0,n=n|0,r=r|0,FM(e,r)}function MM(e){return e=e|0,Oi(e)|0}function FM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0;s=h,h=h+16|0,r=s,o=n,o&1?(LM(r,0),c0(o|0,r|0)|0,RM(e,r),NM(r)):t[e>>2]=t[n>>2],h=s}function LM(e,n){e=e|0,n=n|0,wd(e,n),t[e+4>>2]=0,c[e+8>>0]=0}function RM(e,n){e=e|0,n=n|0,t[e>>2]=t[n+4>>2]}function NM(e){e=e|0,c[e+8>>0]=0}function BM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=U4()|0,e=jM(r)|0,ur(l,n,s,e,UM(r,o)|0,o)}function U4(){var e=0,n=0;if(c[8064]|0||(M8(10968),Bt(68,10968,Q|0)|0,n=8064,t[n>>2]=1,t[n+4>>2]=0),!(Dn(10968)|0)){e=10968,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));M8(10968)}return 10968}function jM(e){return e=e|0,e|0}function UM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=U4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(P8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(qM(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function P8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function qM(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=zM(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,WM(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,P8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,HM(e,s),bM(s),h=_;return}}function zM(e){return e=e|0,536870911}function WM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function HM(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function bM(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function M8(e){e=e|0,YM(e)}function GM(e){e=e|0,VM(e+24|0)}function VM(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function YM(e){e=e|0;var n=0;n=An()|0,Nn(e,1,1,n,$M()|0,5),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function $M(){return 1872}function KM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,JM(t[(XM(e)|0)>>2]|0,n,r,o,s,l)}function XM(e){return e=e|0,(t[(U4()|0)+24>>2]|0)+(e<<3)|0}function JM(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0;d=h,h=h+32|0,_=d+16|0,y=d+12|0,k=d+8|0,T=d+4|0,P=d,$s(_,n),n=Ks(_,n)|0,$s(y,r),r=Ks(y,r)|0,$s(k,o),o=Ks(k,o)|0,$s(T,s),s=Ks(T,s)|0,$s(P,l),l=Ks(P,l)|0,eD[e&1](n,r,o,s,l),Xs(P),Xs(T),Xs(k),Xs(y),Xs(_),h=d}function QM(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;l=t[e>>2]|0,s=q4()|0,e=ZM(r)|0,ur(l,n,s,e,eF(r,o)|0,o)}function q4(){var e=0,n=0;if(c[8072]|0||(L8(11004),Bt(69,11004,Q|0)|0,n=8072,t[n>>2]=1,t[n+4>>2]=0),!(Dn(11004)|0)){e=11004,n=e+36|0;do t[e>>2]=0,e=e+4|0;while((e|0)<(n|0));L8(11004)}return 11004}function ZM(e){return e=e|0,e|0}function eF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0,_=0,y=0;return _=h,h=h+16|0,s=_,l=_+4|0,t[s>>2]=e,y=q4()|0,d=y+24|0,n=Lt(n,4)|0,t[l>>2]=n,r=y+28|0,o=t[r>>2]|0,o>>>0<(t[y+32>>2]|0)>>>0?(F8(o,e,n),n=(t[r>>2]|0)+8|0,t[r>>2]=n):(tF(d,s,l),n=t[r>>2]|0),h=_,(n-(t[d>>2]|0)>>3)+-1|0}function F8(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,t[e+4>>2]=r}function tF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0;if(_=h,h=h+32|0,s=_,l=e+4|0,d=((t[l>>2]|0)-(t[e>>2]|0)>>3)+1|0,o=nF(e)|0,o>>>0>>0)$n(e);else{y=t[e>>2]|0,T=(t[e+8>>2]|0)-y|0,k=T>>2,rF(s,T>>3>>>0>>1>>>0?k>>>0>>0?d:k:o,(t[l>>2]|0)-y>>3,e+8|0),d=s+8|0,F8(t[d>>2]|0,t[n>>2]|0,t[r>>2]|0),t[d>>2]=(t[d>>2]|0)+8,iF(e,s),oF(s),h=_;return}}function nF(e){return e=e|0,536870911}function rF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0;t[e+12>>2]=0,t[e+16>>2]=o;do if(n)if(n>>>0>536870911)_n();else{s=Tt(n<<3)|0;break}else s=0;while(0);t[e>>2]=s,o=s+(r<<3)|0,t[e+8>>2]=o,t[e+4>>2]=o,t[e+12>>2]=s+(n<<3)}function iF(e,n){e=e|0,n=n|0;var r=0,o=0,s=0,l=0,d=0;o=t[e>>2]|0,d=e+4|0,l=n+4|0,s=(t[d>>2]|0)-o|0,r=(t[l>>2]|0)+(0-(s>>3)<<3)|0,t[l>>2]=r,(s|0)>0?(vn(r|0,o|0,s|0)|0,o=l,r=t[l>>2]|0):o=l,l=t[e>>2]|0,t[e>>2]=r,t[o>>2]=l,l=n+8|0,s=t[d>>2]|0,t[d>>2]=t[l>>2],t[l>>2]=s,l=e+8|0,d=n+12|0,e=t[l>>2]|0,t[l>>2]=t[d>>2],t[d>>2]=e,t[n>>2]=t[o>>2]}function oF(e){e=e|0;var n=0,r=0,o=0;n=t[e+4>>2]|0,r=e+8|0,o=t[r>>2]|0,(o|0)!=(n|0)&&(t[r>>2]=o+(~((o+-8-n|0)>>>3)<<3)),e=t[e>>2]|0,e|0&&Ve(e)}function L8(e){e=e|0,lF(e)}function uF(e){e=e|0,sF(e+24|0)}function sF(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function lF(e){e=e|0;var n=0;n=An()|0,Nn(e,1,12,n,fF()|0,2),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function fF(){return 1896}function cF(e,n,r){e=e|0,n=n|0,r=r|0,dF(t[(aF(e)|0)>>2]|0,n,r)}function aF(e){return e=e|0,(t[(q4()|0)+24>>2]|0)+(e<<3)|0}function dF(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;o=h,h=h+16|0,l=o+4|0,s=o,pF(l,n),n=hF(l,n)|0,$s(s,r),r=Ks(s,r)|0,Bl[e&31](n,r),Xs(s),h=o}function pF(e,n){e=e|0,n=n|0}function hF(e,n){return e=e|0,n=n|0,mF(n)|0}function mF(e){return e=e|0,e|0}function vF(){var e=0;return c[8080]|0||(R8(11040),Bt(70,11040,Q|0)|0,e=8080,t[e>>2]=1,t[e+4>>2]=0),Dn(11040)|0||R8(11040),11040}function R8(e){e=e|0,yF(e),sc(e,71)}function gF(e){e=e|0,_F(e+24|0)}function _F(e){e=e|0;var n=0,r=0,o=0;r=t[e>>2]|0,o=r,r|0&&(e=e+4|0,n=t[e>>2]|0,(n|0)!=(r|0)&&(t[e>>2]=n+(~((n+-8-o|0)>>>3)<<3)),Ve(r))}function yF(e){e=e|0;var n=0;n=An()|0,Nn(e,5,7,n,SF()|0,0),t[e+24>>2]=0,t[e+28>>2]=0,t[e+32>>2]=0}function wF(e){e=e|0,DF(e)}function DF(e){e=e|0,EF(e)}function EF(e){e=e|0,c[e+8>>0]=1}function SF(){return 1936}function CF(){return TF()|0}function TF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0;return n=h,h=h+16|0,s=n+4|0,d=n,r=Qo(8)|0,e=r,l=e+4|0,t[l>>2]=Tt(1)|0,o=Tt(8)|0,l=t[l>>2]|0,t[d>>2]=0,t[s>>2]=t[d>>2],xF(o,l,s),t[r>>2]=o,h=n,e|0}function xF(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]=n,r=Tt(16)|0,t[r+4>>2]=0,t[r+8>>2]=0,t[r>>2]=1916,t[r+12>>2]=n,t[e+4>>2]=r}function kF(e){e=e|0,da(e),Ve(e)}function AF(e){e=e|0,e=t[e+12>>2]|0,e|0&&Ve(e)}function OF(e){e=e|0,Ve(e)}function IF(){var e=0;return c[8088]|0||(BF(11076),Bt(25,11076,Q|0)|0,e=8088,t[e>>2]=1,t[e+4>>2]=0),11076}function PF(e,n){e=e|0,n=n|0,t[e>>2]=MF()|0,t[e+4>>2]=FF()|0,t[e+12>>2]=n,t[e+8>>2]=LF()|0,t[e+32>>2]=10}function MF(){return 11745}function FF(){return 1940}function LF(){return eh()|0}function RF(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,(Sf(o,896)|0)==512?r|0&&(NF(r),Ve(r)):n|0&&Ve(n)}function NF(e){e=e|0,e=t[e+4>>2]|0,e|0&&Tf(e)}function BF(e){e=e|0,Ys(e)}function os(e,n){e=e|0,n=n|0,t[e>>2]=n}function z4(e){return e=e|0,t[e>>2]|0}function jF(e){return e=e|0,c[t[e>>2]>>0]|0}function UF(e,n){e=e|0,n=n|0;var r=0,o=0;r=h,h=h+16|0,o=r,t[o>>2]=t[e>>2],qF(n,o)|0,h=r}function qF(e,n){e=e|0,n=n|0;var r=0;return r=zF(t[e>>2]|0,n)|0,n=e+4|0,t[(t[n>>2]|0)+8>>2]=r,t[(t[n>>2]|0)+8>>2]|0}function zF(e,n){e=e|0,n=n|0;var r=0,o=0;return r=h,h=h+16|0,o=r,Zo(o),e=Oi(e)|0,n=WF(e,t[n>>2]|0)|0,eu(o),h=r,n|0}function Zo(e){e=e|0,t[e>>2]=t[2701],t[e+4>>2]=t[2703]}function WF(e,n){e=e|0,n=n|0;var r=0;return r=ko(HF()|0)|0,sf(0,r|0,e|0,L4(n)|0)|0}function eu(e){e=e|0,C8(t[e>>2]|0,t[e+4>>2]|0)}function HF(){var e=0;return c[8096]|0||(bF(11120),e=8096,t[e>>2]=1,t[e+4>>2]=0),11120}function bF(e){e=e|0,Ao(e,GF()|0,1)}function GF(){return 1948}function VF(){YF()}function YF(){var e=0,n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;if(le=h,h=h+16|0,T=le+4|0,P=le,si(65536,10804,t[2702]|0,10812),r=o8()|0,n=t[r>>2]|0,e=t[n>>2]|0,e|0)for(o=t[r+8>>2]|0,r=t[r+4>>2]|0;As(e|0,C[r>>0]|0|0,c[o>>0]|0),n=n+4|0,e=t[n>>2]|0,e;)o=o+1|0,r=r+1|0;if(e=u8()|0,n=t[e>>2]|0,n|0)do uu(n|0,t[e+4>>2]|0),e=e+8|0,n=t[e>>2]|0;while((n|0)!=0);uu($F()|0,5167),k=sa()|0,e=t[k>>2]|0;e:do if(e|0){do KF(t[e+4>>2]|0),e=t[e>>2]|0;while((e|0)!=0);if(e=t[k>>2]|0,e|0){y=k;do{for(;s=e,e=t[e>>2]|0,s=t[s+4>>2]|0,!!(XF(s)|0);)if(t[P>>2]=y,t[T>>2]=t[P>>2],JF(k,T)|0,!e)break e;if(QF(s),y=t[y>>2]|0,n=N8(s)|0,l=Wo()|0,d=h,h=h+((1*(n<<2)|0)+15&-16)|0,_=h,h=h+((1*(n<<2)|0)+15&-16)|0,n=t[(_8(s)|0)>>2]|0,n|0)for(r=d,o=_;t[r>>2]=t[(la(t[n+4>>2]|0)|0)>>2],t[o>>2]=t[n+8>>2],n=t[n>>2]|0,n;)r=r+4|0,o=o+4|0;ie=la(s)|0,n=ZF(s)|0,r=N8(s)|0,o=eL(s)|0,Is(ie|0,n|0,d|0,_|0,r|0,o|0,A4(s)|0),b0(l|0)}while((e|0)!=0)}}while(0);if(e=t[(O4()|0)>>2]|0,e|0)do ie=e+4|0,k=I4(ie)|0,s=V1(k)|0,l=b1(k)|0,d=(G1(k)|0)+1|0,_=oh(k)|0,y=B8(ie)|0,k=Dn(k)|0,T=nh(ie)|0,P=W4(ie)|0,zo(0,s|0,l|0,d|0,_|0,y|0,k|0,T|0,P|0,H4(ie)|0),e=t[e>>2]|0;while((e|0)!=0);e=t[(sa()|0)>>2]|0;e:do if(e|0){t:for(;;){if(n=t[e+4>>2]|0,n|0?(q=t[(la(n)|0)>>2]|0,we=t[(y8(n)|0)>>2]|0,we|0):0){r=we;do{n=r+4|0,o=I4(n)|0;n:do if(o|0)switch(Dn(o)|0){case 0:break t;case 4:case 3:case 2:{_=V1(o)|0,y=b1(o)|0,k=(G1(o)|0)+1|0,T=oh(o)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,_|0,y|0,k|0,T|0,0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 1:{d=V1(o)|0,_=b1(o)|0,y=(G1(o)|0)+1|0,k=oh(o)|0,T=B8(n)|0,P=Dn(o)|0,ie=nh(n)|0,zo(q|0,d|0,_|0,y|0,k|0,T|0,P|0,ie|0,W4(n)|0,H4(n)|0);break n}case 5:{k=V1(o)|0,T=b1(o)|0,P=(G1(o)|0)+1|0,ie=oh(o)|0,zo(q|0,k|0,T|0,P|0,ie|0,tL(o)|0,Dn(o)|0,0,0,0);break n}default:break n}while(0);r=t[r>>2]|0}while((r|0)!=0)}if(e=t[e>>2]|0,!e)break e}_n()}while(0);uf(),h=le}function $F(){return 11703}function KF(e){e=e|0,c[e+40>>0]=0}function XF(e){return e=e|0,(c[e+40>>0]|0)!=0|0}function JF(e,n){return e=e|0,n=n|0,n=nL(n)|0,e=t[n>>2]|0,t[n>>2]=t[e>>2],Ve(e),t[n>>2]|0}function QF(e){e=e|0,c[e+40>>0]=1}function N8(e){return e=e|0,t[e+20>>2]|0}function ZF(e){return e=e|0,t[e+8>>2]|0}function eL(e){return e=e|0,t[e+32>>2]|0}function oh(e){return e=e|0,t[e+4>>2]|0}function B8(e){return e=e|0,t[e+4>>2]|0}function W4(e){return e=e|0,t[e+8>>2]|0}function H4(e){return e=e|0,t[e+16>>2]|0}function tL(e){return e=e|0,t[e+20>>2]|0}function nL(e){return e=e|0,t[e>>2]|0}function uh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0;vt=h,h=h+16|0,q=vt;do if(e>>>0<245){if(k=e>>>0<11?16:e+11&-8,e=k>>>3,P=t[2783]|0,r=P>>>e,r&3|0)return n=(r&1^1)+e|0,e=11172+(n<<1<<2)|0,r=e+8|0,o=t[r>>2]|0,s=o+8|0,l=t[s>>2]|0,(e|0)==(l|0)?t[2783]=P&~(1<>2]=e,t[r>>2]=l),_e=n<<3,t[o+4>>2]=_e|3,_e=o+_e+4|0,t[_e>>2]=t[_e>>2]|1,_e=s,h=vt,_e|0;if(T=t[2785]|0,k>>>0>T>>>0){if(r|0)return n=2<>>12&16,n=n>>>d,r=n>>>5&8,n=n>>>r,s=n>>>2&4,n=n>>>s,e=n>>>1&2,n=n>>>e,o=n>>>1&1,o=(r|d|s|e|o)+(n>>>o)|0,n=11172+(o<<1<<2)|0,e=n+8|0,s=t[e>>2]|0,d=s+8|0,r=t[d>>2]|0,(n|0)==(r|0)?(e=P&~(1<>2]=n,t[e>>2]=r,e=P),l=(o<<3)-k|0,t[s+4>>2]=k|3,o=s+k|0,t[o+4>>2]=l|1,t[o+l>>2]=l,T|0&&(s=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=s,t[n+12>>2]=s,t[s+8>>2]=n,t[s+12>>2]=r),t[2785]=l,t[2788]=o,_e=d,h=vt,_e|0;if(_=t[2784]|0,_){if(r=(_&0-_)+-1|0,d=r>>>12&16,r=r>>>d,l=r>>>5&8,r=r>>>l,y=r>>>2&4,r=r>>>y,o=r>>>1&2,r=r>>>o,e=r>>>1&1,e=t[11436+((l|d|y|o|e)+(r>>>e)<<2)>>2]|0,r=(t[e+4>>2]&-8)-k|0,o=t[e+16+(((t[e+16>>2]|0)==0&1)<<2)>>2]|0,!o)y=e,l=r;else{do d=(t[o+4>>2]&-8)-k|0,y=d>>>0>>0,r=y?d:r,e=y?o:e,o=t[o+16+(((t[o+16>>2]|0)==0&1)<<2)>>2]|0;while((o|0)!=0);y=e,l=r}if(d=y+k|0,y>>>0>>0){s=t[y+24>>2]|0,n=t[y+12>>2]|0;do if((n|0)==(y|0)){if(e=y+20|0,n=t[e>>2]|0,!n&&(e=y+16|0,n=t[e>>2]|0,!n)){r=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0,r=n}else r=t[y+8>>2]|0,t[r+12>>2]=n,t[n+8>>2]=r,r=n;while(0);do if(s|0){if(n=t[y+28>>2]|0,e=11436+(n<<2)|0,(y|0)==(t[e>>2]|0)){if(t[e>>2]=r,!r){t[2784]=_&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=s,n=t[y+16>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),n=t[y+20>>2]|0,n|0&&(t[r+20>>2]=n,t[n+24>>2]=r)}while(0);return l>>>0<16?(_e=l+k|0,t[y+4>>2]=_e|3,_e=y+_e+4|0,t[_e>>2]=t[_e>>2]|1):(t[y+4>>2]=k|3,t[d+4>>2]=l|1,t[d+l>>2]=l,T|0&&(o=t[2788]|0,n=T>>>3,r=11172+(n<<1<<2)|0,n=1<>2]|0):(t[2783]=P|n,n=r,e=r+8|0),t[e>>2]=o,t[n+12>>2]=o,t[o+8>>2]=n,t[o+12>>2]=r),t[2785]=l,t[2788]=d),_e=y+8|0,h=vt,_e|0}else P=k}else P=k}else P=k}else if(e>>>0<=4294967231)if(e=e+11|0,k=e&-8,y=t[2784]|0,y){o=0-k|0,e=e>>>8,e?k>>>0>16777215?_=31:(P=(e+1048320|0)>>>16&8,pe=e<>>16&4,pe=pe<>>16&2,_=14-(T|P|_)+(pe<<_>>>15)|0,_=k>>>(_+7|0)&1|_<<1):_=0,r=t[11436+(_<<2)>>2]|0;e:do if(!r)r=0,e=0,pe=57;else for(e=0,d=k<<((_|0)==31?0:25-(_>>>1)|0),l=0;;){if(s=(t[r+4>>2]&-8)-k|0,s>>>0>>0)if(s)e=r,o=s;else{e=r,o=0,s=r,pe=61;break e}if(s=t[r+20>>2]|0,r=t[r+16+(d>>>31<<2)>>2]|0,l=(s|0)==0|(s|0)==(r|0)?l:s,s=(r|0)==0,s){r=l,pe=57;break}else d=d<<((s^1)&1)}while(0);if((pe|0)==57){if((r|0)==0&(e|0)==0){if(e=2<<_,e=y&(e|0-e),!e){P=k;break}P=(e&0-e)+-1|0,d=P>>>12&16,P=P>>>d,l=P>>>5&8,P=P>>>l,_=P>>>2&4,P=P>>>_,T=P>>>1&2,P=P>>>T,r=P>>>1&1,e=0,r=t[11436+((l|d|_|T|r)+(P>>>r)<<2)>>2]|0}r?(s=r,pe=61):(_=e,d=o)}if((pe|0)==61)for(;;)if(pe=0,r=(t[s+4>>2]&-8)-k|0,P=r>>>0>>0,r=P?r:o,e=P?s:e,s=t[s+16+(((t[s+16>>2]|0)==0&1)<<2)>>2]|0,s)o=r,pe=61;else{_=e,d=r;break}if((_|0)!=0?d>>>0<((t[2785]|0)-k|0)>>>0:0){if(l=_+k|0,_>>>0>=l>>>0)return _e=0,h=vt,_e|0;s=t[_+24>>2]|0,n=t[_+12>>2]|0;do if((n|0)==(_|0)){if(e=_+20|0,n=t[e>>2]|0,!n&&(e=_+16|0,n=t[e>>2]|0,!n)){n=0;break}for(;;){if(r=n+20|0,o=t[r>>2]|0,o|0){n=o,e=r;continue}if(r=n+16|0,o=t[r>>2]|0,o)n=o,e=r;else break}t[e>>2]=0}else _e=t[_+8>>2]|0,t[_e+12>>2]=n,t[n+8>>2]=_e;while(0);do if(s){if(e=t[_+28>>2]|0,r=11436+(e<<2)|0,(_|0)==(t[r>>2]|0)){if(t[r>>2]=n,!n){o=y&~(1<>2]|0)!=(_|0)&1)<<2)>>2]=n,!n){o=y;break}t[n+24>>2]=s,e=t[_+16>>2]|0,e|0&&(t[n+16>>2]=e,t[e+24>>2]=n),e=t[_+20>>2]|0,e&&(t[n+20>>2]=e,t[e+24>>2]=n),o=y}else o=y;while(0);do if(d>>>0>=16){if(t[_+4>>2]=k|3,t[l+4>>2]=d|1,t[l+d>>2]=d,n=d>>>3,d>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=l,t[n+12>>2]=l,t[l+8>>2]=n,t[l+12>>2]=r;break}if(n=d>>>8,n?d>>>0>16777215?n=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=d>>>(n+7|0)&1|n<<1):n=0,r=11436+(n<<2)|0,t[l+28>>2]=n,e=l+16|0,t[e+4>>2]=0,t[e>>2]=0,e=1<>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}for(e=d<<((n|0)==31?0:25-(n>>>1)|0),r=t[r>>2]|0;;){if((t[r+4>>2]&-8|0)==(d|0)){pe=97;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=96;break}}if((pe|0)==96){t[o>>2]=l,t[l+24>>2]=r,t[l+12>>2]=l,t[l+8>>2]=l;break}else if((pe|0)==97){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=l,t[pe>>2]=l,t[l+8>>2]=_e,t[l+12>>2]=r,t[l+24>>2]=0;break}}else _e=d+k|0,t[_+4>>2]=_e|3,_e=_+_e+4|0,t[_e>>2]=t[_e>>2]|1;while(0);return _e=_+8|0,h=vt,_e|0}else P=k}else P=k;else P=-1;while(0);if(r=t[2785]|0,r>>>0>=P>>>0)return n=r-P|0,e=t[2788]|0,n>>>0>15?(_e=e+P|0,t[2788]=_e,t[2785]=n,t[_e+4>>2]=n|1,t[_e+n>>2]=n,t[e+4>>2]=P|3):(t[2785]=0,t[2788]=0,t[e+4>>2]=r|3,_e=e+r+4|0,t[_e>>2]=t[_e>>2]|1),_e=e+8|0,h=vt,_e|0;if(d=t[2786]|0,d>>>0>P>>>0)return qe=d-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0;if(t[2901]|0?e=t[2903]|0:(t[2903]=4096,t[2902]=4096,t[2904]=-1,t[2905]=-1,t[2906]=0,t[2894]=0,e=q&-16^1431655768,t[q>>2]=e,t[2901]=e,e=4096),_=P+48|0,y=P+47|0,l=e+y|0,s=0-e|0,k=l&s,k>>>0<=P>>>0||(e=t[2893]|0,e|0?(T=t[2891]|0,q=T+k|0,q>>>0<=T>>>0|q>>>0>e>>>0):0))return _e=0,h=vt,_e|0;e:do if(t[2894]&4)n=0,pe=133;else{r=t[2789]|0;t:do if(r){for(o=11580;e=t[o>>2]|0,!(e>>>0<=r>>>0?(ie=o+4|0,(e+(t[ie>>2]|0)|0)>>>0>r>>>0):0);)if(e=t[o+8>>2]|0,e)o=e;else{pe=118;break t}if(n=l-d&s,n>>>0<2147483647)if(e=xf(n|0)|0,(e|0)==((t[o>>2]|0)+(t[ie>>2]|0)|0)){if((e|0)!=(-1|0)){d=n,l=e,pe=135;break e}}else o=e,pe=126;else n=0}else pe=118;while(0);do if((pe|0)==118)if(r=xf(0)|0,(r|0)!=(-1|0)?(n=r,we=t[2902]|0,le=we+-1|0,n=((le&n|0)==0?0:(le+n&0-we)-n|0)+k|0,we=t[2891]|0,le=n+we|0,n>>>0>P>>>0&n>>>0<2147483647):0){if(ie=t[2893]|0,ie|0?le>>>0<=we>>>0|le>>>0>ie>>>0:0){n=0;break}if(e=xf(n|0)|0,(e|0)==(r|0)){d=n,l=r,pe=135;break e}else o=e,pe=126}else n=0;while(0);do if((pe|0)==126){if(r=0-n|0,!(_>>>0>n>>>0&(n>>>0<2147483647&(o|0)!=(-1|0))))if((o|0)==(-1|0)){n=0;break}else{d=n,l=o,pe=135;break e}if(e=t[2903]|0,e=y-n+e&0-e,e>>>0>=2147483647){d=n,l=o,pe=135;break e}if((xf(e|0)|0)==(-1|0)){xf(r|0)|0,n=0;break}else{d=e+n|0,l=o,pe=135;break e}}while(0);t[2894]=t[2894]|4,pe=133}while(0);if((((pe|0)==133?k>>>0<2147483647:0)?(qe=xf(k|0)|0,ie=xf(0)|0,Pe=ie-qe|0,ke=Pe>>>0>(P+40|0)>>>0,!((qe|0)==(-1|0)|ke^1|qe>>>0>>0&((qe|0)!=(-1|0)&(ie|0)!=(-1|0))^1)):0)&&(d=ke?Pe:n,l=qe,pe=135),(pe|0)==135){n=(t[2891]|0)+d|0,t[2891]=n,n>>>0>(t[2892]|0)>>>0&&(t[2892]=n),y=t[2789]|0;do if(y){for(n=11580;;){if(e=t[n>>2]|0,r=n+4|0,o=t[r>>2]|0,(l|0)==(e+o|0)){pe=145;break}if(s=t[n+8>>2]|0,s)n=s;else break}if(((pe|0)==145?(t[n+12>>2]&8|0)==0:0)?y>>>0>>0&y>>>0>=e>>>0:0){t[r>>2]=o+d,_e=y+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=y+_e|0,_e=(t[2786]|0)+(d-_e)|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905];break}for(l>>>0<(t[2787]|0)>>>0&&(t[2787]=l),r=l+d|0,n=11580;;){if((t[n>>2]|0)==(r|0)){pe=153;break}if(e=t[n+8>>2]|0,e)n=e;else break}if((pe|0)==153?(t[n+12>>2]&8|0)==0:0){t[n>>2]=l,T=n+4|0,t[T>>2]=(t[T>>2]|0)+d,T=l+8|0,T=l+((T&7|0)==0?0:0-T&7)|0,n=r+8|0,n=r+((n&7|0)==0?0:0-n&7)|0,k=T+P|0,_=n-T-P|0,t[T+4>>2]=P|3;do if((n|0)!=(y|0)){if((n|0)==(t[2788]|0)){_e=(t[2785]|0)+_|0,t[2785]=_e,t[2788]=k,t[k+4>>2]=_e|1,t[k+_e>>2]=_e;break}if(e=t[n+4>>2]|0,(e&3|0)==1){d=e&-8,o=e>>>3;e:do if(e>>>0<256)if(e=t[n+8>>2]|0,r=t[n+12>>2]|0,(r|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=r,t[r+8>>2]=e;break}else{l=t[n+24>>2]|0,e=t[n+12>>2]|0;do if((e|0)==(n|0)){if(o=n+16|0,r=o+4|0,e=t[r>>2]|0,!e)if(e=t[o>>2]|0,e)r=o;else{e=0;break}for(;;){if(o=e+20|0,s=t[o>>2]|0,s|0){e=s,r=o;continue}if(o=e+16|0,s=t[o>>2]|0,s)e=s,r=o;else break}t[r>>2]=0}else _e=t[n+8>>2]|0,t[_e+12>>2]=e,t[e+8>>2]=_e;while(0);if(!l)break;r=t[n+28>>2]|0,o=11436+(r<<2)|0;do if((n|0)!=(t[o>>2]|0)){if(t[l+16+(((t[l+16>>2]|0)!=(n|0)&1)<<2)>>2]=e,!e)break e}else{if(t[o>>2]=e,e|0)break;t[2784]=t[2784]&~(1<>2]=l,r=n+16|0,o=t[r>>2]|0,o|0&&(t[e+16>>2]=o,t[o+24>>2]=e),r=t[r+4>>2]|0,!r)break;t[e+20>>2]=r,t[r+24>>2]=e}while(0);n=n+d|0,s=d+_|0}else s=_;if(n=n+4|0,t[n>>2]=t[n>>2]&-2,t[k+4>>2]=s|1,t[k+s>>2]=s,n=s>>>3,s>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=k,t[n+12>>2]=k,t[k+8>>2]=n,t[k+12>>2]=r;break}n=s>>>8;do if(!n)n=0;else{if(s>>>0>16777215){n=31;break}pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,n=14-(qe|pe|n)+(_e<>>15)|0,n=s>>>(n+7|0)&1|n<<1}while(0);if(o=11436+(n<<2)|0,t[k+28>>2]=n,e=k+16|0,t[e+4>>2]=0,t[e>>2]=0,e=t[2784]|0,r=1<>2]=k,t[k+24>>2]=o,t[k+12>>2]=k,t[k+8>>2]=k;break}for(e=s<<((n|0)==31?0:25-(n>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){pe=194;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=193;break}}if((pe|0)==193){t[o>>2]=k,t[k+24>>2]=r,t[k+12>>2]=k,t[k+8>>2]=k;break}else if((pe|0)==194){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=k,t[pe>>2]=k,t[k+8>>2]=_e,t[k+12>>2]=r,t[k+24>>2]=0;break}}else _e=(t[2786]|0)+_|0,t[2786]=_e,t[2789]=k,t[k+4>>2]=_e|1;while(0);return _e=T+8|0,h=vt,_e|0}for(n=11580;e=t[n>>2]|0,!(e>>>0<=y>>>0?(_e=e+(t[n+4>>2]|0)|0,_e>>>0>y>>>0):0);)n=t[n+8>>2]|0;s=_e+-47|0,e=s+8|0,e=s+((e&7|0)==0?0:0-e&7)|0,s=y+16|0,e=e>>>0>>0?y:e,n=e+8|0,r=l+8|0,r=(r&7|0)==0?0:0-r&7,pe=l+r|0,r=d+-40-r|0,t[2789]=pe,t[2786]=r,t[pe+4>>2]=r|1,t[pe+r+4>>2]=40,t[2790]=t[2905],r=e+4|0,t[r>>2]=27,t[n>>2]=t[2895],t[n+4>>2]=t[2896],t[n+8>>2]=t[2897],t[n+12>>2]=t[2898],t[2895]=l,t[2896]=d,t[2898]=0,t[2897]=n,n=e+24|0;do pe=n,n=n+4|0,t[n>>2]=7;while((pe+8|0)>>>0<_e>>>0);if((e|0)!=(y|0)){if(l=e-y|0,t[r>>2]=t[r>>2]&-2,t[y+4>>2]=l|1,t[e>>2]=l,n=l>>>3,l>>>0<256){r=11172+(n<<1<<2)|0,e=t[2783]|0,n=1<>2]|0):(t[2783]=e|n,n=r,e=r+8|0),t[e>>2]=y,t[n+12>>2]=y,t[y+8>>2]=n,t[y+12>>2]=r;break}if(n=l>>>8,n?l>>>0>16777215?r=31:(pe=(n+1048320|0)>>>16&8,_e=n<>>16&4,_e=_e<>>16&2,r=14-(qe|pe|r)+(_e<>>15)|0,r=l>>>(r+7|0)&1|r<<1):r=0,o=11436+(r<<2)|0,t[y+28>>2]=r,t[y+20>>2]=0,t[s>>2]=0,n=t[2784]|0,e=1<>2]=y,t[y+24>>2]=o,t[y+12>>2]=y,t[y+8>>2]=y;break}for(e=l<<((r|0)==31?0:25-(r>>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(l|0)){pe=216;break}if(o=r+16+(e>>>31<<2)|0,n=t[o>>2]|0,n)e=e<<1,r=n;else{pe=215;break}}if((pe|0)==215){t[o>>2]=y,t[y+24>>2]=r,t[y+12>>2]=y,t[y+8>>2]=y;break}else if((pe|0)==216){pe=r+8|0,_e=t[pe>>2]|0,t[_e+12>>2]=y,t[pe>>2]=y,t[y+8>>2]=_e,t[y+12>>2]=r,t[y+24>>2]=0;break}}}else{_e=t[2787]|0,(_e|0)==0|l>>>0<_e>>>0&&(t[2787]=l),t[2895]=l,t[2896]=d,t[2898]=0,t[2792]=t[2901],t[2791]=-1,n=0;do _e=11172+(n<<1<<2)|0,t[_e+12>>2]=_e,t[_e+8>>2]=_e,n=n+1|0;while((n|0)!=32);_e=l+8|0,_e=(_e&7|0)==0?0:0-_e&7,pe=l+_e|0,_e=d+-40-_e|0,t[2789]=pe,t[2786]=_e,t[pe+4>>2]=_e|1,t[pe+_e+4>>2]=40,t[2790]=t[2905]}while(0);if(n=t[2786]|0,n>>>0>P>>>0)return qe=n-P|0,t[2786]=qe,_e=t[2789]|0,pe=_e+P|0,t[2789]=pe,t[pe+4>>2]=qe|1,t[_e+4>>2]=P|3,_e=_e+8|0,h=vt,_e|0}return t[(ca()|0)>>2]=12,_e=0,h=vt,_e|0}function sh(e){e=e|0;var n=0,r=0,o=0,s=0,l=0,d=0,_=0,y=0;if(!!e){r=e+-8|0,s=t[2787]|0,e=t[e+-4>>2]|0,n=e&-8,y=r+n|0;do if(e&1)_=r,d=r;else{if(o=t[r>>2]|0,!(e&3)||(d=r+(0-o)|0,l=o+n|0,d>>>0>>0))return;if((d|0)==(t[2788]|0)){if(e=y+4|0,n=t[e>>2]|0,(n&3|0)!=3){_=d,n=l;break}t[2785]=l,t[e>>2]=n&-2,t[d+4>>2]=l|1,t[d+l>>2]=l;return}if(r=o>>>3,o>>>0<256)if(e=t[d+8>>2]|0,n=t[d+12>>2]|0,(n|0)==(e|0)){t[2783]=t[2783]&~(1<>2]=n,t[n+8>>2]=e,_=d,n=l;break}s=t[d+24>>2]|0,e=t[d+12>>2]|0;do if((e|0)==(d|0)){if(r=d+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{e=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0}else _=t[d+8>>2]|0,t[_+12>>2]=e,t[e+8>>2]=_;while(0);if(s){if(n=t[d+28>>2]|0,r=11436+(n<<2)|0,(d|0)==(t[r>>2]|0)){if(t[r>>2]=e,!e){t[2784]=t[2784]&~(1<>2]|0)!=(d|0)&1)<<2)>>2]=e,!e){_=d,n=l;break}t[e+24>>2]=s,n=d+16|0,r=t[n>>2]|0,r|0&&(t[e+16>>2]=r,t[r+24>>2]=e),n=t[n+4>>2]|0,n?(t[e+20>>2]=n,t[n+24>>2]=e,_=d,n=l):(_=d,n=l)}else _=d,n=l}while(0);if(!(d>>>0>=y>>>0)&&(e=y+4|0,o=t[e>>2]|0,!!(o&1))){if(o&2)t[e>>2]=o&-2,t[_+4>>2]=n|1,t[d+n>>2]=n,s=n;else{if(e=t[2788]|0,(y|0)==(t[2789]|0)){if(y=(t[2786]|0)+n|0,t[2786]=y,t[2789]=_,t[_+4>>2]=y|1,(_|0)!=(e|0))return;t[2788]=0,t[2785]=0;return}if((y|0)==(e|0)){y=(t[2785]|0)+n|0,t[2785]=y,t[2788]=d,t[_+4>>2]=y|1,t[d+y>>2]=y;return}s=(o&-8)+n|0,r=o>>>3;do if(o>>>0<256)if(n=t[y+8>>2]|0,e=t[y+12>>2]|0,(e|0)==(n|0)){t[2783]=t[2783]&~(1<>2]=e,t[e+8>>2]=n;break}else{l=t[y+24>>2]|0,e=t[y+12>>2]|0;do if((e|0)==(y|0)){if(r=y+16|0,n=r+4|0,e=t[n>>2]|0,!e)if(e=t[r>>2]|0,e)n=r;else{r=0;break}for(;;){if(r=e+20|0,o=t[r>>2]|0,o|0){e=o,n=r;continue}if(r=e+16|0,o=t[r>>2]|0,o)e=o,n=r;else break}t[n>>2]=0,r=e}else r=t[y+8>>2]|0,t[r+12>>2]=e,t[e+8>>2]=r,r=e;while(0);if(l|0){if(e=t[y+28>>2]|0,n=11436+(e<<2)|0,(y|0)==(t[n>>2]|0)){if(t[n>>2]=r,!r){t[2784]=t[2784]&~(1<>2]|0)!=(y|0)&1)<<2)>>2]=r,!r)break;t[r+24>>2]=l,e=y+16|0,n=t[e>>2]|0,n|0&&(t[r+16>>2]=n,t[n+24>>2]=r),e=t[e+4>>2]|0,e|0&&(t[r+20>>2]=e,t[e+24>>2]=r)}}while(0);if(t[_+4>>2]=s|1,t[d+s>>2]=s,(_|0)==(t[2788]|0)){t[2785]=s;return}}if(e=s>>>3,s>>>0<256){r=11172+(e<<1<<2)|0,n=t[2783]|0,e=1<>2]|0):(t[2783]=n|e,e=r,n=r+8|0),t[n>>2]=_,t[e+12>>2]=_,t[_+8>>2]=e,t[_+12>>2]=r;return}e=s>>>8,e?s>>>0>16777215?e=31:(d=(e+1048320|0)>>>16&8,y=e<>>16&4,y=y<>>16&2,e=14-(l|d|e)+(y<>>15)|0,e=s>>>(e+7|0)&1|e<<1):e=0,o=11436+(e<<2)|0,t[_+28>>2]=e,t[_+20>>2]=0,t[_+16>>2]=0,n=t[2784]|0,r=1<>>1)|0),r=t[o>>2]|0;;){if((t[r+4>>2]&-8|0)==(s|0)){e=73;break}if(o=r+16+(n>>>31<<2)|0,e=t[o>>2]|0,e)n=n<<1,r=e;else{e=72;break}}if((e|0)==72){t[o>>2]=_,t[_+24>>2]=r,t[_+12>>2]=_,t[_+8>>2]=_;break}else if((e|0)==73){d=r+8|0,y=t[d>>2]|0,t[y+12>>2]=_,t[d>>2]=_,t[_+8>>2]=y,t[_+12>>2]=r,t[_+24>>2]=0;break}}else t[2784]=n|r,t[o>>2]=_,t[_+24>>2]=o,t[_+12>>2]=_,t[_+8>>2]=_;while(0);if(y=(t[2791]|0)+-1|0,t[2791]=y,!y)e=11588;else return;for(;e=t[e>>2]|0,e;)e=e+8|0;t[2791]=-1}}}function rL(){return 11628}function iL(e){e=e|0;var n=0,r=0;return n=h,h=h+16|0,r=n,t[r>>2]=sL(t[e+60>>2]|0)|0,e=lh(Ms(6,r|0)|0)|0,h=n,e|0}function j8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0;P=h,h=h+48|0,k=P+16|0,l=P,s=P+32|0,_=e+28|0,o=t[_>>2]|0,t[s>>2]=o,y=e+20|0,o=(t[y>>2]|0)-o|0,t[s+4>>2]=o,t[s+8>>2]=n,t[s+12>>2]=r,o=o+r|0,d=e+60|0,t[l>>2]=t[d>>2],t[l+4>>2]=s,t[l+8>>2]=2,l=lh(G0(146,l|0)|0)|0;e:do if((o|0)!=(l|0)){for(n=2;!((l|0)<0);)if(o=o-l|0,we=t[s+4>>2]|0,q=l>>>0>we>>>0,s=q?s+8|0:s,n=(q<<31>>31)+n|0,we=l-(q?we:0)|0,t[s>>2]=(t[s>>2]|0)+we,q=s+4|0,t[q>>2]=(t[q>>2]|0)-we,t[k>>2]=t[d>>2],t[k+4>>2]=s,t[k+8>>2]=n,l=lh(G0(146,k|0)|0)|0,(o|0)==(l|0)){T=3;break e}t[e+16>>2]=0,t[_>>2]=0,t[y>>2]=0,t[e>>2]=t[e>>2]|32,(n|0)==2?r=0:r=r-(t[s+4>>2]|0)|0}else T=3;while(0);return(T|0)==3&&(we=t[e+44>>2]|0,t[e+16>>2]=we+(t[e+48>>2]|0),t[_>>2]=we,t[y>>2]=we),h=P,r|0}function oL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;return s=h,h=h+32|0,l=s,o=s+20|0,t[l>>2]=t[e+60>>2],t[l+4>>2]=0,t[l+8>>2]=n,t[l+12>>2]=o,t[l+16>>2]=r,(lh(Uu(140,l|0)|0)|0)<0?(t[o>>2]=-1,e=-1):e=t[o>>2]|0,h=s,e|0}function lh(e){return e=e|0,e>>>0>4294963200&&(t[(ca()|0)>>2]=0-e,e=-1),e|0}function ca(){return(uL()|0)+64|0}function uL(){return b4()|0}function b4(){return 2084}function sL(e){return e=e|0,e|0}function lL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;return s=h,h=h+32|0,o=s,t[e+36>>2]=1,((t[e>>2]&64|0)==0?(t[o>>2]=t[e+60>>2],t[o+4>>2]=21523,t[o+8>>2]=s+16,su(54,o|0)|0):0)&&(c[e+75>>0]=-1),o=j8(e,n,r)|0,h=s,o|0}function U8(e,n){e=e|0,n=n|0;var r=0,o=0;if(r=c[e>>0]|0,o=c[n>>0]|0,r<<24>>24==0?1:r<<24>>24!=o<<24>>24)e=o;else{do e=e+1|0,n=n+1|0,r=c[e>>0]|0,o=c[n>>0]|0;while(!(r<<24>>24==0?1:r<<24>>24!=o<<24>>24));e=o}return(r&255)-(e&255)|0}function fL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0;e:do if(!r)e=0;else{for(;o=c[e>>0]|0,s=c[n>>0]|0,o<<24>>24==s<<24>>24;)if(r=r+-1|0,r)e=e+1|0,n=n+1|0;else{e=0;break e}e=(o&255)-(s&255)|0}while(0);return e|0}function q8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0;ie=h,h=h+224|0,T=ie+120|0,P=ie+80|0,we=ie,le=ie+136|0,o=P,s=o+40|0;do t[o>>2]=0,o=o+4|0;while((o|0)<(s|0));return t[T>>2]=t[r>>2],(G4(0,n,T,we,P)|0)<0?r=-1:((t[e+76>>2]|0)>-1?q=cL(e)|0:q=0,r=t[e>>2]|0,k=r&32,(c[e+74>>0]|0)<1&&(t[e>>2]=r&-33),o=e+48|0,t[o>>2]|0?r=G4(e,n,T,we,P)|0:(s=e+44|0,l=t[s>>2]|0,t[s>>2]=le,d=e+28|0,t[d>>2]=le,_=e+20|0,t[_>>2]=le,t[o>>2]=80,y=e+16|0,t[y>>2]=le+80,r=G4(e,n,T,we,P)|0,l&&(dh[t[e+36>>2]&7](e,0,0)|0,r=(t[_>>2]|0)==0?-1:r,t[s>>2]=l,t[o>>2]=0,t[y>>2]=0,t[d>>2]=0,t[_>>2]=0)),o=t[e>>2]|0,t[e>>2]=o|k,q|0&&aL(e),r=(o&32|0)==0?r:-1),h=ie,r|0}function G4(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0;zt=h,h=h+64|0,Ht=zt+16|0,It=zt,vt=zt+24|0,gn=zt+8|0,Pn=zt+20|0,t[Ht>>2]=n,qe=(e|0)!=0,pe=vt+40|0,_e=pe,vt=vt+39|0,Ln=gn+4|0,d=0,l=0,T=0;e:for(;;){do if((l|0)>-1)if((d|0)>(2147483647-l|0)){t[(ca()|0)>>2]=75,l=-1;break}else{l=d+l|0;break}while(0);if(d=c[n>>0]|0,d<<24>>24)_=n;else{ke=87;break}t:for(;;){switch(d<<24>>24){case 37:{d=_,ke=9;break t}case 0:{d=_;break t}default:}Pe=_+1|0,t[Ht>>2]=Pe,d=c[Pe>>0]|0,_=Pe}t:do if((ke|0)==9)for(;;){if(ke=0,(c[_+1>>0]|0)!=37)break t;if(d=d+1|0,_=_+2|0,t[Ht>>2]=_,(c[_>>0]|0)==37)ke=9;else break}while(0);if(d=d-n|0,qe&&ri(e,n,d),d|0){n=_;continue}y=_+1|0,d=(c[y>>0]|0)+-48|0,d>>>0<10?(Pe=(c[_+2>>0]|0)==36,ie=Pe?d:-1,T=Pe?1:T,y=Pe?_+3|0:y):ie=-1,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0;t:do if(_>>>0<32)for(k=0,P=d;;){if(d=1<<_,!(d&75913)){d=P;break t}if(k=d|k,y=y+1|0,t[Ht>>2]=y,d=c[y>>0]|0,_=(d<<24>>24)+-32|0,_>>>0>=32)break;P=d}else k=0;while(0);if(d<<24>>24==42){if(_=y+1|0,d=(c[_>>0]|0)+-48|0,d>>>0<10?(c[y+2>>0]|0)==36:0)t[s+(d<<2)>>2]=10,d=t[o+((c[_>>0]|0)+-48<<3)>>2]|0,T=1,y=y+3|0;else{if(T|0){l=-1;break}qe?(T=(t[r>>2]|0)+(4-1)&~(4-1),d=t[T>>2]|0,t[r>>2]=T+4,T=0,y=_):(d=0,T=0,y=_)}t[Ht>>2]=y,Pe=(d|0)<0,d=Pe?0-d|0:d,k=Pe?k|8192:k}else{if(d=z8(Ht)|0,(d|0)<0){l=-1;break}y=t[Ht>>2]|0}do if((c[y>>0]|0)==46){if((c[y+1>>0]|0)!=42){t[Ht>>2]=y+1,_=z8(Ht)|0,y=t[Ht>>2]|0;break}if(P=y+2|0,_=(c[P>>0]|0)+-48|0,_>>>0<10?(c[y+3>>0]|0)==36:0){t[s+(_<<2)>>2]=10,_=t[o+((c[P>>0]|0)+-48<<3)>>2]|0,y=y+4|0,t[Ht>>2]=y;break}if(T|0){l=-1;break e}qe?(Pe=(t[r>>2]|0)+(4-1)&~(4-1),_=t[Pe>>2]|0,t[r>>2]=Pe+4):_=0,t[Ht>>2]=P,y=P}else _=-1;while(0);for(le=0;;){if(((c[y>>0]|0)+-65|0)>>>0>57){l=-1;break e}if(Pe=y+1|0,t[Ht>>2]=Pe,P=c[(c[y>>0]|0)+-65+(5178+(le*58|0))>>0]|0,q=P&255,(q+-1|0)>>>0<8)le=q,y=Pe;else break}if(!(P<<24>>24)){l=-1;break}we=(ie|0)>-1;do if(P<<24>>24==19)if(we){l=-1;break e}else ke=49;else{if(we){t[s+(ie<<2)>>2]=q,we=o+(ie<<3)|0,ie=t[we+4>>2]|0,ke=It,t[ke>>2]=t[we>>2],t[ke+4>>2]=ie,ke=49;break}if(!qe){l=0;break e}W8(It,q,r)}while(0);if((ke|0)==49?(ke=0,!qe):0){d=0,n=Pe;continue}y=c[y>>0]|0,y=(le|0)!=0&(y&15|0)==3?y&-33:y,we=k&-65537,ie=(k&8192|0)==0?k:we;t:do switch(y|0){case 110:switch((le&255)<<24>>24){case 0:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 1:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 2:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}case 3:{g[t[It>>2]>>1]=l,d=0,n=Pe;continue e}case 4:{c[t[It>>2]>>0]=l,d=0,n=Pe;continue e}case 6:{t[t[It>>2]>>2]=l,d=0,n=Pe;continue e}case 7:{d=t[It>>2]|0,t[d>>2]=l,t[d+4>>2]=((l|0)<0)<<31>>31,d=0,n=Pe;continue e}default:{d=0,n=Pe;continue e}}case 112:{y=120,_=_>>>0>8?_:8,n=ie|8,ke=61;break}case 88:case 120:{n=ie,ke=61;break}case 111:{y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,q=pL(n,y,pe)|0,we=_e-q|0,k=0,P=5642,_=(ie&8|0)==0|(_|0)>(we|0)?_:we+1|0,we=ie,ke=67;break}case 105:case 100:if(y=It,n=t[y>>2]|0,y=t[y+4>>2]|0,(y|0)<0){n=fh(0,0,n|0,y|0)|0,y=be,k=It,t[k>>2]=n,t[k+4>>2]=y,k=1,P=5642,ke=66;break t}else{k=(ie&2049|0)!=0&1,P=(ie&2048|0)==0?(ie&1|0)==0?5642:5644:5643,ke=66;break t}case 117:{y=It,k=0,P=5642,n=t[y>>2]|0,y=t[y+4>>2]|0,ke=66;break}case 99:{c[vt>>0]=t[It>>2],n=vt,k=0,P=5642,q=pe,y=1,_=we;break}case 109:{y=hL(t[(ca()|0)>>2]|0)|0,ke=71;break}case 115:{y=t[It>>2]|0,y=y|0?y:5652,ke=71;break}case 67:{t[gn>>2]=t[It>>2],t[Ln>>2]=0,t[It>>2]=gn,q=-1,y=gn,ke=75;break}case 83:{n=t[It>>2]|0,_?(q=_,y=n,ke=75):(wi(e,32,d,0,ie),n=0,ke=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{d=vL(e,+L[It>>3],d,_,ie,y)|0,n=Pe;continue e}default:k=0,P=5642,q=pe,y=_,_=ie}while(0);t:do if((ke|0)==61)ie=It,le=t[ie>>2]|0,ie=t[ie+4>>2]|0,q=dL(le,ie,pe,y&32)|0,P=(n&8|0)==0|(le|0)==0&(ie|0)==0,k=P?0:2,P=P?5642:5642+(y>>4)|0,we=n,n=le,y=ie,ke=67;else if((ke|0)==66)q=aa(n,y,pe)|0,we=ie,ke=67;else if((ke|0)==71)ke=0,ie=mL(y,0,_)|0,le=(ie|0)==0,n=y,k=0,P=5642,q=le?y+_|0:ie,y=le?_:ie-y|0,_=we;else if((ke|0)==75){for(ke=0,P=y,n=0,_=0;k=t[P>>2]|0,!(!k||(_=H8(Pn,k)|0,(_|0)<0|_>>>0>(q-n|0)>>>0));)if(n=_+n|0,q>>>0>n>>>0)P=P+4|0;else break;if((_|0)<0){l=-1;break e}if(wi(e,32,d,n,ie),!n)n=0,ke=84;else for(k=0;;){if(_=t[y>>2]|0,!_){ke=84;break t}if(_=H8(Pn,_)|0,k=_+k|0,(k|0)>(n|0)){ke=84;break t}if(ri(e,Pn,_),k>>>0>=n>>>0){ke=84;break}else y=y+4|0}}while(0);if((ke|0)==67)ke=0,y=(n|0)!=0|(y|0)!=0,ie=(_|0)!=0|y,y=((y^1)&1)+(_e-q)|0,n=ie?q:pe,q=pe,y=ie?(_|0)>(y|0)?_:y:_,_=(_|0)>-1?we&-65537:we;else if((ke|0)==84){ke=0,wi(e,32,d,n,ie^8192),d=(d|0)>(n|0)?d:n,n=Pe;continue}le=q-n|0,we=(y|0)<(le|0)?le:y,ie=we+k|0,d=(d|0)<(ie|0)?ie:d,wi(e,32,d,ie,_),ri(e,P,k),wi(e,48,d,ie,_^65536),wi(e,48,we,le,0),ri(e,n,le),wi(e,32,d,ie,_^8192),n=Pe}e:do if((ke|0)==87&&!e)if(!T)l=0;else{for(l=1;n=t[s+(l<<2)>>2]|0,!!n;)if(W8(o+(l<<3)|0,n,r),l=l+1|0,(l|0)>=10){l=1;break e}for(;;){if(t[s+(l<<2)>>2]|0){l=-1;break e}if(l=l+1|0,(l|0)>=10){l=1;break}}}while(0);return h=zt,l|0}function cL(e){return e=e|0,0}function aL(e){e=e|0}function ri(e,n,r){e=e|0,n=n|0,r=r|0,t[e>>2]&32||TL(n,r,e)|0}function z8(e){e=e|0;var n=0,r=0,o=0;if(r=t[e>>2]|0,o=(c[r>>0]|0)+-48|0,o>>>0<10){n=0;do n=o+(n*10|0)|0,r=r+1|0,t[e>>2]=r,o=(c[r>>0]|0)+-48|0;while(o>>>0<10)}else n=0;return n|0}function W8(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;e:do if(n>>>0<=20)do switch(n|0){case 9:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,t[e>>2]=n;break e}case 10:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=((n|0)<0)<<31>>31;break e}case 11:{o=(t[r>>2]|0)+(4-1)&~(4-1),n=t[o>>2]|0,t[r>>2]=o+4,o=e,t[o>>2]=n,t[o+4>>2]=0;break e}case 12:{o=(t[r>>2]|0)+(8-1)&~(8-1),n=o,s=t[n>>2]|0,n=t[n+4>>2]|0,t[r>>2]=o+8,o=e,t[o>>2]=s,t[o+4>>2]=n;break e}case 13:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&65535)<<16>>16,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 14:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&65535,t[s+4>>2]=0;break e}case 15:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,o=(o&255)<<24>>24,s=e,t[s>>2]=o,t[s+4>>2]=((o|0)<0)<<31>>31;break e}case 16:{s=(t[r>>2]|0)+(4-1)&~(4-1),o=t[s>>2]|0,t[r>>2]=s+4,s=e,t[s>>2]=o&255,t[s+4>>2]=0;break e}case 17:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}case 18:{s=(t[r>>2]|0)+(8-1)&~(8-1),l=+L[s>>3],t[r>>2]=s+8,L[e>>3]=l;break e}default:break e}while(0);while(0)}function dL(e,n,r,o){if(e=e|0,n=n|0,r=r|0,o=o|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=C[5694+(e&15)>>0]|0|o,e=ch(e|0,n|0,4)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function pL(e,n,r){if(e=e|0,n=n|0,r=r|0,!((e|0)==0&(n|0)==0))do r=r+-1|0,c[r>>0]=e&7|48,e=ch(e|0,n|0,3)|0,n=be;while(!((e|0)==0&(n|0)==0));return r|0}function aa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if(n>>>0>0|(n|0)==0&e>>>0>4294967295){for(;o=K4(e|0,n|0,10,0)|0,r=r+-1|0,c[r>>0]=o&255|48,o=e,e=$4(e|0,n|0,10,0)|0,n>>>0>9|(n|0)==9&o>>>0>4294967295;)n=be;n=e}else n=e;if(n)for(;r=r+-1|0,c[r>>0]=(n>>>0)%10|0|48,!(n>>>0<10);)n=(n>>>0)/10|0;return r|0}function hL(e){return e=e|0,DL(e,t[(wL()|0)+188>>2]|0)|0}function mL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;l=n&255,o=(r|0)!=0;e:do if(o&(e&3|0)!=0)for(s=n&255;;){if((c[e>>0]|0)==s<<24>>24){d=6;break e}if(e=e+1|0,r=r+-1|0,o=(r|0)!=0,!(o&(e&3|0)!=0)){d=5;break}}else d=5;while(0);(d|0)==5&&(o?d=6:r=0);e:do if((d|0)==6&&(s=n&255,(c[e>>0]|0)!=s<<24>>24)){o=Un(l,16843009)|0;t:do if(r>>>0>3){for(;l=t[e>>2]^o,!((l&-2139062144^-2139062144)&l+-16843009|0);)if(e=e+4|0,r=r+-4|0,r>>>0<=3){d=11;break t}}else d=11;while(0);if((d|0)==11&&!r){r=0;break}for(;;){if((c[e>>0]|0)==s<<24>>24)break e;if(e=e+1|0,r=r+-1|0,!r){r=0;break}}}while(0);return(r|0?e:0)|0}function wi(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0;if(d=h,h=h+256|0,l=d,(r|0)>(o|0)&(s&73728|0)==0){if(s=r-o|0,pa(l|0,n|0,(s>>>0<256?s:256)|0)|0,s>>>0>255){n=r-o|0;do ri(e,l,256),s=s+-256|0;while(s>>>0>255);s=n&255}ri(e,l,s)}h=d}function H8(e,n){return e=e|0,n=n|0,e?e=_L(e,n,0)|0:e=0,e|0}function vL(e,n,r,o,s,l){e=e|0,n=+n,r=r|0,o=o|0,s=s|0,l=l|0;var d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0,ie=0,Pe=0,ke=0,qe=0,pe=0,_e=0,vt=0,Ln=0,Ht=0,It=0,gn=0,Pn=0,zt=0,Dr=0;Dr=h,h=h+560|0,y=Dr+8|0,Pe=Dr,zt=Dr+524|0,Pn=zt,k=Dr+512|0,t[Pe>>2]=0,gn=k+12|0,b8(n)|0,(be|0)<0?(n=-n,Ht=1,Ln=5659):(Ht=(s&2049|0)!=0&1,Ln=(s&2048|0)==0?(s&1|0)==0?5660:5665:5662),b8(n)|0,It=be&2146435072;do if(It>>>0<2146435072|(It|0)==2146435072&0<0){if(we=+gL(n,Pe)*2,d=we!=0,d&&(t[Pe>>2]=(t[Pe>>2]|0)+-1),qe=l|32,(qe|0)==97){le=l&32,q=(le|0)==0?Ln:Ln+9|0,P=Ht|2,d=12-o|0;do if(o>>>0>11|(d|0)==0)n=we;else{n=8;do d=d+-1|0,n=n*16;while((d|0)!=0);if((c[q>>0]|0)==45){n=-(n+(-we-n));break}else{n=we+n-n;break}}while(0);_=t[Pe>>2]|0,d=(_|0)<0?0-_|0:_,d=aa(d,((d|0)<0)<<31>>31,gn)|0,(d|0)==(gn|0)&&(d=k+11|0,c[d>>0]=48),c[d+-1>>0]=(_>>31&2)+43,T=d+-2|0,c[T>>0]=l+15,k=(o|0)<1,y=(s&8|0)==0,d=zt;do It=~~n,_=d+1|0,c[d>>0]=C[5694+It>>0]|le,n=(n-+(It|0))*16,((_-Pn|0)==1?!(y&(k&n==0)):0)?(c[_>>0]=46,d=d+2|0):d=_;while(n!=0);It=d-Pn|0,Pn=gn-T|0,gn=(o|0)!=0&(It+-2|0)<(o|0)?o+2|0:It,d=Pn+P+gn|0,wi(e,32,r,d,s),ri(e,q,P),wi(e,48,r,d,s^65536),ri(e,zt,It),wi(e,48,gn-It|0,0,0),ri(e,T,Pn),wi(e,32,r,d,s^8192);break}_=(o|0)<0?6:o,d?(d=(t[Pe>>2]|0)+-28|0,t[Pe>>2]=d,n=we*268435456):(n=we,d=t[Pe>>2]|0),It=(d|0)<0?y:y+288|0,y=It;do _e=~~n>>>0,t[y>>2]=_e,y=y+4|0,n=(n-+(_e>>>0))*1e9;while(n!=0);if((d|0)>0)for(k=It,P=y;;){if(T=(d|0)<29?d:29,d=P+-4|0,d>>>0>=k>>>0){y=0;do pe=X8(t[d>>2]|0,0,T|0)|0,pe=Y4(pe|0,be|0,y|0,0)|0,_e=be,ke=K4(pe|0,_e|0,1e9,0)|0,t[d>>2]=ke,y=$4(pe|0,_e|0,1e9,0)|0,d=d+-4|0;while(d>>>0>=k>>>0);y&&(k=k+-4|0,t[k>>2]=y)}for(y=P;!(y>>>0<=k>>>0);)if(d=y+-4|0,!(t[d>>2]|0))y=d;else break;if(d=(t[Pe>>2]|0)-T|0,t[Pe>>2]=d,(d|0)>0)P=y;else break}else k=It;if((d|0)<0){o=((_+25|0)/9|0)+1|0,ie=(qe|0)==102;do{if(le=0-d|0,le=(le|0)<9?le:9,k>>>0>>0){T=(1<>>le,q=0,d=k;do _e=t[d>>2]|0,t[d>>2]=(_e>>>le)+q,q=Un(_e&T,P)|0,d=d+4|0;while(d>>>0>>0);d=(t[k>>2]|0)==0?k+4|0:k,q?(t[y>>2]=q,k=d,d=y+4|0):(k=d,d=y)}else k=(t[k>>2]|0)==0?k+4|0:k,d=y;y=ie?It:k,y=(d-y>>2|0)>(o|0)?y+(o<<2)|0:d,d=(t[Pe>>2]|0)+le|0,t[Pe>>2]=d}while((d|0)<0);d=k,o=y}else d=k,o=y;if(_e=It,d>>>0>>0){if(y=(_e-d>>2)*9|0,T=t[d>>2]|0,T>>>0>=10){k=10;do k=k*10|0,y=y+1|0;while(T>>>0>=k>>>0)}}else y=0;if(ie=(qe|0)==103,ke=(_|0)!=0,k=_-((qe|0)!=102?y:0)+((ke&ie)<<31>>31)|0,(k|0)<(((o-_e>>2)*9|0)+-9|0)){if(k=k+9216|0,le=It+4+(((k|0)/9|0)+-1024<<2)|0,k=((k|0)%9|0)+1|0,(k|0)<9){T=10;do T=T*10|0,k=k+1|0;while((k|0)!=9)}else T=10;if(P=t[le>>2]|0,q=(P>>>0)%(T>>>0)|0,k=(le+4|0)==(o|0),k&(q|0)==0)k=le;else if(we=(((P>>>0)/(T>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,pe=(T|0)/2|0,n=q>>>0>>0?.5:k&(q|0)==(pe|0)?1:1.5,Ht&&(pe=(c[Ln>>0]|0)==45,n=pe?-n:n,we=pe?-we:we),k=P-q|0,t[le>>2]=k,we+n!=we){if(pe=k+T|0,t[le>>2]=pe,pe>>>0>999999999)for(y=le;k=y+-4|0,t[y>>2]=0,k>>>0>>0&&(d=d+-4|0,t[d>>2]=0),pe=(t[k>>2]|0)+1|0,t[k>>2]=pe,pe>>>0>999999999;)y=k;else k=le;if(y=(_e-d>>2)*9|0,P=t[d>>2]|0,P>>>0>=10){T=10;do T=T*10|0,y=y+1|0;while(P>>>0>=T>>>0)}}else k=le;k=k+4|0,k=o>>>0>k>>>0?k:o,pe=d}else k=o,pe=d;for(qe=k;;){if(qe>>>0<=pe>>>0){Pe=0;break}if(d=qe+-4|0,!(t[d>>2]|0))qe=d;else{Pe=1;break}}o=0-y|0;do if(ie)if(d=((ke^1)&1)+_|0,(d|0)>(y|0)&(y|0)>-5?(T=l+-1|0,_=d+-1-y|0):(T=l+-2|0,_=d+-1|0),d=s&8,d)le=d;else{if(Pe?(vt=t[qe+-4>>2]|0,(vt|0)!=0):0)if((vt>>>0)%10|0)k=0;else{k=0,d=10;do d=d*10|0,k=k+1|0;while(!((vt>>>0)%(d>>>0)|0|0))}else k=9;if(d=((qe-_e>>2)*9|0)+-9|0,(T|32|0)==102){le=d-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}else{le=d+y-k|0,le=(le|0)>0?le:0,_=(_|0)<(le|0)?_:le,le=0;break}}else T=l,le=s&8;while(0);if(ie=_|le,P=(ie|0)!=0&1,q=(T|32|0)==102,q)ke=0,d=(y|0)>0?y:0;else{if(d=(y|0)<0?o:y,d=aa(d,((d|0)<0)<<31>>31,gn)|0,k=gn,(k-d|0)<2)do d=d+-1|0,c[d>>0]=48;while((k-d|0)<2);c[d+-1>>0]=(y>>31&2)+43,d=d+-2|0,c[d>>0]=T,ke=d,d=k-d|0}if(d=Ht+1+_+P+d|0,wi(e,32,r,d,s),ri(e,Ln,Ht),wi(e,48,r,d,s^65536),q){T=pe>>>0>It>>>0?It:pe,le=zt+9|0,P=le,q=zt+8|0,k=T;do{if(y=aa(t[k>>2]|0,0,le)|0,(k|0)==(T|0))(y|0)==(le|0)&&(c[q>>0]=48,y=q);else if(y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}ri(e,y,P-y|0),k=k+4|0}while(k>>>0<=It>>>0);if(ie|0&&ri(e,5710,1),k>>>0>>0&(_|0)>0)for(;;){if(y=aa(t[k>>2]|0,0,le)|0,y>>>0>zt>>>0){pa(zt|0,48,y-Pn|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}if(ri(e,y,(_|0)<9?_:9),k=k+4|0,y=_+-9|0,k>>>0>>0&(_|0)>9)_=y;else{_=y;break}}wi(e,48,_+9|0,9,0)}else{if(ie=Pe?qe:pe+4|0,(_|0)>-1){Pe=zt+9|0,le=(le|0)==0,o=Pe,P=0-Pn|0,q=zt+8|0,T=pe;do{y=aa(t[T>>2]|0,0,Pe)|0,(y|0)==(Pe|0)&&(c[q>>0]=48,y=q);do if((T|0)==(pe|0)){if(k=y+1|0,ri(e,y,1),le&(_|0)<1){y=k;break}ri(e,5710,1),y=k}else{if(y>>>0<=zt>>>0)break;pa(zt|0,48,y+P|0)|0;do y=y+-1|0;while(y>>>0>zt>>>0)}while(0);Pn=o-y|0,ri(e,y,(_|0)>(Pn|0)?Pn:_),_=_-Pn|0,T=T+4|0}while(T>>>0>>0&(_|0)>-1)}wi(e,48,_+18|0,18,0),ri(e,ke,gn-ke|0)}wi(e,32,r,d,s^8192)}else zt=(l&32|0)!=0,d=Ht+3|0,wi(e,32,r,d,s&-65537),ri(e,Ln,Ht),ri(e,n!=n|!1?zt?5686:5690:zt?5678:5682,3),wi(e,32,r,d,s^8192);while(0);return h=Dr,((d|0)<(r|0)?r:d)|0}function b8(e){e=+e;var n=0;return L[j>>3]=e,n=t[j>>2]|0,be=t[j+4>>2]|0,n|0}function gL(e,n){return e=+e,n=n|0,+ +G8(e,n)}function G8(e,n){e=+e,n=n|0;var r=0,o=0,s=0;switch(L[j>>3]=e,r=t[j>>2]|0,o=t[j+4>>2]|0,s=ch(r|0,o|0,52)|0,s&2047){case 0:{e!=0?(e=+G8(e*18446744073709552e3,n),r=(t[n>>2]|0)+-64|0):r=0,t[n>>2]=r;break}case 2047:break;default:t[n>>2]=(s&2047)+-1022,t[j>>2]=r,t[j+4>>2]=o&-2146435073|1071644672,e=+L[j>>3]}return+e}function _L(e,n,r){e=e|0,n=n|0,r=r|0;do if(e){if(n>>>0<128){c[e>>0]=n,e=1;break}if(!(t[t[(yL()|0)+188>>2]>>2]|0))if((n&-128|0)==57216){c[e>>0]=n,e=1;break}else{t[(ca()|0)>>2]=84,e=-1;break}if(n>>>0<2048){c[e>>0]=n>>>6|192,c[e+1>>0]=n&63|128,e=2;break}if(n>>>0<55296|(n&-8192|0)==57344){c[e>>0]=n>>>12|224,c[e+1>>0]=n>>>6&63|128,c[e+2>>0]=n&63|128,e=3;break}if((n+-65536|0)>>>0<1048576){c[e>>0]=n>>>18|240,c[e+1>>0]=n>>>12&63|128,c[e+2>>0]=n>>>6&63|128,c[e+3>>0]=n&63|128,e=4;break}else{t[(ca()|0)>>2]=84,e=-1;break}}else e=1;while(0);return e|0}function yL(){return b4()|0}function wL(){return b4()|0}function DL(e,n){e=e|0,n=n|0;var r=0,o=0;for(o=0;;){if((C[5712+o>>0]|0)==(e|0)){e=2;break}if(r=o+1|0,(r|0)==87){r=5800,o=87,e=5;break}else o=r}if((e|0)==2&&(o?(r=5800,e=5):r=5800),(e|0)==5)for(;;){do e=r,r=r+1|0;while((c[e>>0]|0)!=0);if(o=o+-1|0,o)e=5;else break}return EL(r,t[n+20>>2]|0)|0}function EL(e,n){return e=e|0,n=n|0,SL(e,n)|0}function SL(e,n){return e=e|0,n=n|0,n?n=CL(t[n>>2]|0,t[n+4>>2]|0,e)|0:n=0,(n|0?n:e)|0}function CL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0;q=(t[e>>2]|0)+1794895138|0,l=fc(t[e+8>>2]|0,q)|0,o=fc(t[e+12>>2]|0,q)|0,s=fc(t[e+16>>2]|0,q)|0;e:do if((l>>>0>>2>>>0?(P=n-(l<<2)|0,o>>>0

>>0&s>>>0

>>0):0)?((s|o)&3|0)==0:0){for(P=o>>>2,T=s>>>2,k=0;;){if(_=l>>>1,y=k+_|0,d=y<<1,s=d+P|0,o=fc(t[e+(s<<2)>>2]|0,q)|0,s=fc(t[e+(s+1<<2)>>2]|0,q)|0,!(s>>>0>>0&o>>>0<(n-s|0)>>>0)){o=0;break e}if(c[e+(s+o)>>0]|0){o=0;break e}if(o=U8(r,e+s|0)|0,!o)break;if(o=(o|0)<0,(l|0)==1){o=0;break e}else k=o?k:y,l=o?_:l-_|0}o=d+T|0,s=fc(t[e+(o<<2)>>2]|0,q)|0,o=fc(t[e+(o+1<<2)>>2]|0,q)|0,o>>>0>>0&s>>>0<(n-o|0)>>>0?o=(c[e+(o+s)>>0]|0)==0?e+o|0:0:o=0}else o=0;while(0);return o|0}function fc(e,n){e=e|0,n=n|0;var r=0;return r=Z8(e|0)|0,((n|0)==0?e:r)|0}function TL(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0,_=0;o=r+16|0,s=t[o>>2]|0,s?l=5:xL(r)|0?o=0:(s=t[o>>2]|0,l=5);e:do if((l|0)==5){if(_=r+20|0,d=t[_>>2]|0,o=d,(s-d|0)>>>0>>0){o=dh[t[r+36>>2]&7](r,e,n)|0;break}t:do if((c[r+75>>0]|0)>-1){for(d=n;;){if(!d){l=0,s=e;break t}if(s=d+-1|0,(c[e+s>>0]|0)==10)break;d=s}if(o=dh[t[r+36>>2]&7](r,e,d)|0,o>>>0>>0)break e;l=d,s=e+d|0,n=n-d|0,o=t[_>>2]|0}else l=0,s=e;while(0);vn(o|0,s|0,n|0)|0,t[_>>2]=(t[_>>2]|0)+n,o=l+n|0}while(0);return o|0}function xL(e){e=e|0;var n=0,r=0;return n=e+74|0,r=c[n>>0]|0,c[n>>0]=r+255|r,n=t[e>>2]|0,n&8?(t[e>>2]=n|32,e=-1):(t[e+8>>2]=0,t[e+4>>2]=0,r=t[e+44>>2]|0,t[e+28>>2]=r,t[e+20>>2]=r,t[e+16>>2]=r+(t[e+48>>2]|0),e=0),e|0}function Ur(e,n){e=w(e),n=w(n);var r=0,o=0;r=V8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=V8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?n:e;break}else{e=e>2]=e,t[j>>2]|0|0}function cc(e,n){e=w(e),n=w(n);var r=0,o=0;r=Y8(e)|0;do if((r&2147483647)>>>0<=2139095040){if(o=Y8(n)|0,(o&2147483647)>>>0<=2139095040)if((o^r|0)<0){e=(r|0)<0?e:n;break}else{e=e>2]=e,t[j>>2]|0|0}function V4(e,n){e=w(e),n=w(n);var r=0,o=0,s=0,l=0,d=0,_=0,y=0,k=0;l=(D[j>>2]=e,t[j>>2]|0),_=(D[j>>2]=n,t[j>>2]|0),r=l>>>23&255,d=_>>>23&255,y=l&-2147483648,s=_<<1;e:do if((s|0)!=0?!((r|0)==255|((kL(n)|0)&2147483647)>>>0>2139095040):0){if(o=l<<1,o>>>0<=s>>>0)return n=w(e*w(0)),w((o|0)==(s|0)?n:e);if(r)o=l&8388607|8388608;else{if(r=l<<9,(r|0)>-1){o=r,r=0;do r=r+-1|0,o=o<<1;while((o|0)>-1)}else r=0;o=l<<1-r}if(d)_=_&8388607|8388608;else{if(l=_<<9,(l|0)>-1){s=0;do s=s+-1|0,l=l<<1;while((l|0)>-1)}else s=0;d=s,_=_<<1-s}s=o-_|0,l=(s|0)>-1;t:do if((r|0)>(d|0)){for(;;){if(l)if(s)o=s;else break;if(o=o<<1,r=r+-1|0,s=o-_|0,l=(s|0)>-1,(r|0)<=(d|0))break t}n=w(e*w(0));break e}while(0);if(l)if(s)o=s;else{n=w(e*w(0));break}if(o>>>0<8388608)do o=o<<1,r=r+-1|0;while(o>>>0<8388608);(r|0)>0?r=o+-8388608|r<<23:r=o>>>(1-r|0),n=(t[j>>2]=r|y,w(D[j>>2]))}else k=3;while(0);return(k|0)==3&&(n=w(e*n),n=w(n/n)),w(n)}function kL(e){return e=w(e),D[j>>2]=e,t[j>>2]|0|0}function AL(e,n){return e=e|0,n=n|0,q8(t[582]|0,e,n)|0}function $n(e){e=e|0,_n()}function da(e){e=e|0}function OL(e,n){return e=e|0,n=n|0,0}function IL(e){return e=e|0,($8(e+4|0)|0)==-1?(Nl[t[(t[e>>2]|0)+8>>2]&127](e),e=1):e=0,e|0}function $8(e){e=e|0;var n=0;return n=t[e>>2]|0,t[e>>2]=n+-1,n+-1|0}function Tf(e){e=e|0,IL(e)|0&&PL(e)}function PL(e){e=e|0;var n=0;n=e+8|0,((t[n>>2]|0)!=0?($8(n)|0)!=-1:0)||Nl[t[(t[e>>2]|0)+16>>2]&127](e)}function Tt(e){e=e|0;var n=0;for(n=(e|0)==0?1:e;e=uh(n)|0,!(e|0);){if(e=FL()|0,!e){e=0;break}fD[e&0]()}return e|0}function K8(e){return e=e|0,Tt(e)|0}function Ve(e){e=e|0,sh(e)}function ML(e){e=e|0,(c[e+11>>0]|0)<0&&Ve(t[e>>2]|0)}function FL(){var e=0;return e=t[2923]|0,t[2923]=e+0,e|0}function LL(){}function fh(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,o=n-o-(r>>>0>e>>>0|0)>>>0,be=o,e-r>>>0|0|0}function Y4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,r=e+r>>>0,be=n+o+(r>>>0>>0|0)>>>0,r|0|0}function pa(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0,d=0;if(l=e+r|0,n=n&255,(r|0)>=67){for(;e&3;)c[e>>0]=n,e=e+1|0;for(o=l&-4|0,s=o-64|0,d=n|n<<8|n<<16|n<<24;(e|0)<=(s|0);)t[e>>2]=d,t[e+4>>2]=d,t[e+8>>2]=d,t[e+12>>2]=d,t[e+16>>2]=d,t[e+20>>2]=d,t[e+24>>2]=d,t[e+28>>2]=d,t[e+32>>2]=d,t[e+36>>2]=d,t[e+40>>2]=d,t[e+44>>2]=d,t[e+48>>2]=d,t[e+52>>2]=d,t[e+56>>2]=d,t[e+60>>2]=d,e=e+64|0;for(;(e|0)<(o|0);)t[e>>2]=d,e=e+4|0}for(;(e|0)<(l|0);)c[e>>0]=n,e=e+1|0;return l-r|0}function X8(e,n,r){return e=e|0,n=n|0,r=r|0,(r|0)<32?(be=n<>>32-r,e<>>r,e>>>r|(n&(1<>>r-32|0)}function vn(e,n,r){e=e|0,n=n|0,r=r|0;var o=0,s=0,l=0;if((r|0)>=8192)return wo(e|0,n|0,r|0)|0;if(l=e|0,s=e+r|0,(e&3)==(n&3)){for(;e&3;){if(!r)return l|0;c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0,r=r-1|0}for(r=s&-4|0,o=r-64|0;(e|0)<=(o|0);)t[e>>2]=t[n>>2],t[e+4>>2]=t[n+4>>2],t[e+8>>2]=t[n+8>>2],t[e+12>>2]=t[n+12>>2],t[e+16>>2]=t[n+16>>2],t[e+20>>2]=t[n+20>>2],t[e+24>>2]=t[n+24>>2],t[e+28>>2]=t[n+28>>2],t[e+32>>2]=t[n+32>>2],t[e+36>>2]=t[n+36>>2],t[e+40>>2]=t[n+40>>2],t[e+44>>2]=t[n+44>>2],t[e+48>>2]=t[n+48>>2],t[e+52>>2]=t[n+52>>2],t[e+56>>2]=t[n+56>>2],t[e+60>>2]=t[n+60>>2],e=e+64|0,n=n+64|0;for(;(e|0)<(r|0);)t[e>>2]=t[n>>2],e=e+4|0,n=n+4|0}else for(r=s-4|0;(e|0)<(r|0);)c[e>>0]=c[n>>0]|0,c[e+1>>0]=c[n+1>>0]|0,c[e+2>>0]=c[n+2>>0]|0,c[e+3>>0]=c[n+3>>0]|0,e=e+4|0,n=n+4|0;for(;(e|0)<(s|0);)c[e>>0]=c[n>>0]|0,e=e+1|0,n=n+1|0;return l|0}function J8(e){e=e|0;var n=0;return n=c[ce+(e&255)>>0]|0,(n|0)<8?n|0:(n=c[ce+(e>>8&255)>>0]|0,(n|0)<8?n+8|0:(n=c[ce+(e>>16&255)>>0]|0,(n|0)<8?n+16|0:(c[ce+(e>>>24)>>0]|0)+24|0))}function Q8(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0;var l=0,d=0,_=0,y=0,k=0,T=0,P=0,q=0,we=0,le=0;if(T=e,y=n,k=y,d=r,q=o,_=q,!k)return l=(s|0)!=0,_?l?(t[s>>2]=e|0,t[s+4>>2]=n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0):(l&&(t[s>>2]=(T>>>0)%(d>>>0),t[s+4>>2]=0),q=0,s=(T>>>0)/(d>>>0)>>>0,be=q,s|0);l=(_|0)==0;do if(d){if(!l){if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=31){P=l+1|0,_=31-l|0,n=l-31>>31,d=P,e=T>>>(P>>>0)&n|k<<_,n=k>>>(P>>>0)&n,l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,q=0,s=0,be=q,s|0):(q=0,s=0,be=q,s|0)}if(l=d-1|0,l&d|0){_=(cr(d|0)|0)+33-(cr(k|0)|0)|0,le=64-_|0,P=32-_|0,y=P>>31,we=_-32|0,n=we>>31,d=_,e=P-1>>31&k>>>(we>>>0)|(k<>>(_>>>0))&n,n=n&k>>>(_>>>0),l=T<>>(we>>>0))&y|T<>31;break}return s|0&&(t[s>>2]=l&T,t[s+4>>2]=0),(d|0)==1?(we=y|n&0,le=e|0|0,be=we,le|0):(le=J8(d|0)|0,we=k>>>(le>>>0)|0,le=k<<32-le|T>>>(le>>>0)|0,be=we,le|0)}else{if(l)return s|0&&(t[s>>2]=(k>>>0)%(d>>>0),t[s+4>>2]=0),we=0,le=(k>>>0)/(d>>>0)>>>0,be=we,le|0;if(!T)return s|0&&(t[s>>2]=0,t[s+4>>2]=(k>>>0)%(_>>>0)),we=0,le=(k>>>0)/(_>>>0)>>>0,be=we,le|0;if(l=_-1|0,!(l&_))return s|0&&(t[s>>2]=e|0,t[s+4>>2]=l&k|n&0),we=0,le=k>>>((J8(_|0)|0)>>>0),be=we,le|0;if(l=(cr(_|0)|0)-(cr(k|0)|0)|0,l>>>0<=30){n=l+1|0,_=31-l|0,d=n,e=k<<_|T>>>(n>>>0),n=k>>>(n>>>0),l=0,_=T<<_;break}return s?(t[s>>2]=e|0,t[s+4>>2]=y|n&0,we=0,le=0,be=we,le|0):(we=0,le=0,be=we,le|0)}while(0);if(!d)k=_,y=0,_=0;else{P=r|0|0,T=q|o&0,k=Y4(P|0,T|0,-1,-1)|0,r=be,y=_,_=0;do o=y,y=l>>>31|y<<1,l=_|l<<1,o=e<<1|o>>>31|0,q=e>>>31|n<<1|0,fh(k|0,r|0,o|0,q|0)|0,le=be,we=le>>31|((le|0)<0?-1:0)<<1,_=we&1,e=fh(o|0,q|0,we&P|0,(((le|0)<0?-1:0)>>31|((le|0)<0?-1:0)<<1)&T|0)|0,n=be,d=d-1|0;while((d|0)!=0);k=y,y=0}return d=0,s|0&&(t[s>>2]=e,t[s+4>>2]=n),we=(l|0)>>>31|(k|d)<<1|(d<<1|l>>>31)&0|y,le=(l<<1|0>>>31)&-2|_,be=we,le|0}function $4(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,Q8(e,n,r,o,0)|0}function xf(e){e=e|0;var n=0,r=0;return r=e+15&-16|0,n=t[N>>2]|0,e=n+r|0,(r|0)>0&(e|0)<(n|0)|(e|0)<0?(vr()|0,Os(12),-1):(t[N>>2]=e,((e|0)>(Xn()|0)?(Bn()|0)==0:0)?(t[N>>2]=n,Os(12),-1):n|0)}function Y1(e,n,r){e=e|0,n=n|0,r=r|0;var o=0;if((n|0)<(e|0)&(e|0)<(n+r|0)){for(o=e,n=n+r|0,e=e+r|0;(r|0)>0;)e=e-1|0,n=n-1|0,r=r-1|0,c[e>>0]=c[n>>0]|0;e=o}else vn(e,n,r)|0;return e|0}function K4(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0;var s=0,l=0;return l=h,h=h+16|0,s=l|0,Q8(e,n,r,o,s)|0,h=l,be=t[s+4>>2]|0,t[s>>2]|0|0}function Z8(e){return e=e|0,(e&255)<<24|(e>>8&255)<<16|(e>>16&255)<<8|e>>>24|0}function RL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,eD[e&1](n|0,r|0,o|0,s|0,l|0)}function NL(e,n,r){e=e|0,n=n|0,r=w(r),tD[e&1](n|0,w(r))}function BL(e,n,r){e=e|0,n=n|0,r=+r,nD[e&31](n|0,+r)}function jL(e,n,r,o){return e=e|0,n=n|0,r=w(r),o=w(o),w(rD[e&0](n|0,w(r),w(o)))}function UL(e,n){e=e|0,n=n|0,Nl[e&127](n|0)}function qL(e,n,r){e=e|0,n=n|0,r=r|0,Bl[e&31](n|0,r|0)}function zL(e,n){return e=e|0,n=n|0,dc[e&31](n|0)|0}function WL(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,iD[e&1](n|0,+r,+o,s|0)}function HL(e,n,r,o){e=e|0,n=n|0,r=+r,o=+o,CR[e&1](n|0,+r,+o)}function bL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,dh[e&7](n|0,r|0,o|0)|0}function VL(e,n,r,o){return e=e|0,n=n|0,r=r|0,o=o|0,+TR[e&1](n|0,r|0,o|0)}function YL(e,n){return e=e|0,n=n|0,+oD[e&15](n|0)}function $L(e,n,r){return e=e|0,n=n|0,r=+r,xR[e&1](n|0,+r)|0}function KL(e,n,r){return e=e|0,n=n|0,r=r|0,J4[e&15](n|0,r|0)|0}function XL(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=+o,s=+s,l=l|0,kR[e&1](n|0,r|0,+o,+s,l|0)}function JL(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,d=d|0,AR[e&1](n|0,r|0,o|0,s|0,l|0,d|0)}function QL(e,n,r){return e=e|0,n=n|0,r=r|0,+uD[e&7](n|0,r|0)}function ZL(e){return e=e|0,ph[e&7]()|0}function eR(e,n,r,o,s,l){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,sD[e&1](n|0,r|0,o|0,s|0,l|0)|0}function tR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=+s,OR[e&1](n|0,r|0,o|0,+s)}function nR(e,n,r,o,s,l,d){e=e|0,n=n|0,r=r|0,o=w(o),s=s|0,l=w(l),d=d|0,lD[e&1](n|0,r|0,w(o),s|0,w(l),d|0)}function rR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,X1[e&15](n|0,r|0,o|0)}function iR(e){e=e|0,fD[e&0]()}function oR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,cD[e&15](n|0,r|0,+o)}function uR(e,n,r){return e=e|0,n=+n,r=+r,IR[e&1](+n,+r)|0}function sR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,Q4[e&15](n|0,r|0,o|0,s|0)}function lR(e,n,r,o,s){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(0)}function fR(e,n){e=e|0,n=w(n),pt(1)}function Lo(e,n){e=e|0,n=+n,pt(2)}function cR(e,n,r){return e=e|0,n=w(n),r=w(r),pt(3),tt}function tn(e){e=e|0,pt(4)}function $1(e,n){e=e|0,n=n|0,pt(5)}function tu(e){return e=e|0,pt(6),0}function aR(e,n,r,o){e=e|0,n=+n,r=+r,o=o|0,pt(7)}function dR(e,n,r){e=e|0,n=+n,r=+r,pt(8)}function pR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(9),0}function hR(e,n,r){return e=e|0,n=n|0,r=r|0,pt(10),0}function ac(e){return e=e|0,pt(11),0}function mR(e,n){return e=e|0,n=+n,pt(12),0}function K1(e,n){return e=e|0,n=n|0,pt(13),0}function vR(e,n,r,o,s){e=e|0,n=n|0,r=+r,o=+o,s=s|0,pt(14)}function gR(e,n,r,o,s,l){e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,l=l|0,pt(15)}function X4(e,n){return e=e|0,n=n|0,pt(16),0}function _R(){return pt(17),0}function yR(e,n,r,o,s){return e=e|0,n=n|0,r=r|0,o=o|0,s=s|0,pt(18),0}function wR(e,n,r,o){e=e|0,n=n|0,r=r|0,o=+o,pt(19)}function DR(e,n,r,o,s,l){e=e|0,n=n|0,r=w(r),o=o|0,s=w(s),l=l|0,pt(20)}function ah(e,n,r){e=e|0,n=n|0,r=r|0,pt(21)}function ER(){pt(22)}function ha(e,n,r){e=e|0,n=n|0,r=+r,pt(23)}function SR(e,n){return e=+e,n=+n,pt(24),0}function ma(e,n,r,o){e=e|0,n=n|0,r=r|0,o=o|0,pt(25)}var eD=[lR,_I],tD=[fR,x0],nD=[Lo,Kf,Tl,xl,hf,xo,mf,Wa,Hs,mi,Xf,Rc,Jf,ao,$o,kl,Nc,Al,vf,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo,Lo],rD=[cR],Nl=[tn,da,Km,Xm,es,a_,d_,p_,YA,$A,KA,oI,uI,sI,kF,AF,OF,Sn,Oc,pf,ti,vi,Nm,Uc,r1,Hd,Pl,mv,Av,Kc,Jc,yp,Eg,na,Ug,Yg,u_,k_,q_,J_,a4,Ct,w9,U9,ex,hx,Ix,_0,s7,S7,W7,uk,Dk,Wk,Qk,tA,_A,DA,jA,JA,eO,gO,RO,d1,vP,YP,lM,SM,GM,uF,gF,wF,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn,tn],Bl=[$1,ja,Ua,$f,gu,co,qa,Ws,za,Mc,Fc,Lc,po,Ce,ze,Et,on,sr,mn,Zf,gd,xd,H9,rx,ck,yP,HO,C8,$1,$1,$1,$1],dc=[tu,iL,Ba,m,b,ee,Ye,Ze,ut,In,jr,gi,Pm,Ha,Ya,Fx,Tk,wO,SP,Qo,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu,tu],iD=[aR,Sd],CR=[dR,zA],dh=[pR,j8,oL,lL,Gv,P_,a7,kM],TR=[hR,Op],oD=[ac,_i,Re,pr,Cd,ho,bs,$a,Td,qc,ac,ac,ac,ac,ac,ac],xR=[mR,Kk],J4=[K1,OL,vd,Vc,_v,ig,pg,f_,H_,_x,Xu,dM,K1,K1,K1,K1],kR=[vR,iv],AR=[gR,KM],uD=[X4,Hr,Ka,kd,Xa,Jg,X4,X4],ph=[_R,Ja,Z0,g0,oA,TA,iO,CF],sD=[yR,or],OR=[wR,m4],lD=[DR,Bc],X1=[ah,S,A0,Vn,ni,Mv,Tg,dn,C9,fo,zI,JP,cF,ah,ah,ah],fD=[ER],cD=[ha,Ic,vu,Pc,Qu,Qf,k0,v,W1,k7,Gk,ha,ha,ha,ha,ha],IR=[SR,GA],Q4=[ma,Fg,zx,V7,Lk,aA,PA,aO,qO,OP,RF,ma,ma,ma,ma,ma];return{_llvm_bswap_i32:Z8,dynCall_idd:uR,dynCall_i:ZL,_i64Subtract:fh,___udivdi3:$4,dynCall_vif:NL,setThrew:vl,dynCall_viii:rR,_bitshift64Lshr:ch,_bitshift64Shl:X8,dynCall_vi:UL,dynCall_viiddi:XL,dynCall_diii:VL,dynCall_iii:KL,_memset:pa,_sbrk:xf,_memcpy:vn,__GLOBAL__sub_I_Yoga_cpp:t0,dynCall_vii:qL,___uremdi3:K4,dynCall_vid:BL,stackAlloc:zi,_nbind_init:VF,getTempRet0:fu,dynCall_di:YL,dynCall_iid:$L,setTempRet0:gl,_i64Add:Y4,dynCall_fiff:jL,dynCall_iiii:bL,_emscripten_get_global_libc:rL,dynCall_viid:oR,dynCall_viiid:tR,dynCall_viififi:nR,dynCall_ii:zL,__GLOBAL__sub_I_Binding_cc:lP,dynCall_viiii:sR,dynCall_iiiiii:eR,stackSave:lu,dynCall_viiiii:RL,__GLOBAL__sub_I_nbind_cc:Gs,dynCall_vidd:HL,_free:sh,runPostSets:LL,dynCall_viiiiii:JL,establishStackSpace:O0,_memmove:Y1,stackRestore:Ho,_malloc:uh,__GLOBAL__sub_I_common_cc:AO,dynCall_viddi:WL,dynCall_dii:QL,dynCall_v:iR}}(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;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;function ExitStatus(i){this.name="ExitStatus",this.message="Program terminated with exit("+i+")",this.status=i}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function i(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=i)},Module.callMain=Module.callMain=function(u){u=u||[],ensureInitRuntime();var f=u.length+1;function c(){for(var x=0;x<4-1;x++)g.push(0)}var g=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];c();for(var t=0;t0||(preRun(),runDependencies>0)||Module.calledRun)return;function u(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(i),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),u()},1)):u()}Module.run=Module.run=run;function exit(i,u){u&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=i,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(i)),ENVIRONMENT_IS_NODE&&process.exit(i),Module.quit(i,new ExitStatus(i)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(i){Module.onAbort&&Module.onAbort(i),i!==void 0?(Module.print(i),Module.printErr(i),i=JSON.stringify(i)):i="",ABORT=!0,EXITSTATUS=1;var u=` -If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,f="abort("+i+") at "+stackTrace()+u;throw abortDecorators&&abortDecorators.forEach(function(c){f=c(f,i)}),f}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var hc=Me((hb,vE)=>{"use strict";var wN=hE(),DN=mE(),Py=!1,My=null;DN({},function(i,u){if(!Py){if(Py=!0,i)throw i;My=u}});if(!Py)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");vE.exports=wN(My.bind,My.lib)});var _E=Me((mb,gE)=>{"use strict";gE.exports=({onlyFirst:i=!1}={})=>{let u=["[\\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(u,i?void 0:"g")}});var Fy=Me((vb,yE)=>{"use strict";var EN=_E();yE.exports=i=>typeof i=="string"?i.replace(EN(),""):i});var Ry=Me((gb,Ly)=>{"use strict";var wE=i=>Number.isNaN(i)?!1:i>=4352&&(i<=4447||i===9001||i===9002||11904<=i&&i<=12871&&i!==12351||12880<=i&&i<=19903||19968<=i&&i<=42182||43360<=i&&i<=43388||44032<=i&&i<=55203||63744<=i&&i<=64255||65040<=i&&i<=65049||65072<=i&&i<=65131||65281<=i&&i<=65376||65504<=i&&i<=65510||110592<=i&&i<=110593||127488<=i&&i<=127569||131072<=i&&i<=262141);Ly.exports=wE;Ly.exports.default=wE});var EE=Me((_b,DE)=>{"use strict";DE.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}});var Mh=Me((yb,Ny)=>{"use strict";var SN=Fy(),CN=Ry(),TN=EE(),SE=i=>{if(i=i.replace(TN()," "),typeof i!="string"||i.length===0)return 0;i=SN(i);let u=0;for(let f=0;f=127&&c<=159||c>=768&&c<=879||(c>65535&&f++,u+=CN(c)?2:1)}return u};Ny.exports=SE;Ny.exports.default=SE});var jy=Me((wb,By)=>{"use strict";var xN=Mh(),CE=i=>{let u=0;for(let f of i.split(` -`))u=Math.max(u,xN(f));return u};By.exports=CE;By.exports.default=CE});var TE=Me(a2=>{"use strict";var kN=a2&&a2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(a2,"__esModule",{value:!0});var AN=kN(jy()),Uy={};a2.default=i=>{if(i.length===0)return{width:0,height:0};if(Uy[i])return Uy[i];let u=AN.default(i),f=i.split(` -`).length;return Uy[i]={width:u,height:f},{width:u,height:f}}});var xE=Me(d2=>{"use strict";var ON=d2&&d2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(d2,"__esModule",{value:!0});var hr=ON(hc()),IN=(i,u)=>{"position"in u&&i.setPositionType(u.position==="absolute"?hr.default.POSITION_TYPE_ABSOLUTE:hr.default.POSITION_TYPE_RELATIVE)},PN=(i,u)=>{"marginLeft"in u&&i.setMargin(hr.default.EDGE_START,u.marginLeft||0),"marginRight"in u&&i.setMargin(hr.default.EDGE_END,u.marginRight||0),"marginTop"in u&&i.setMargin(hr.default.EDGE_TOP,u.marginTop||0),"marginBottom"in u&&i.setMargin(hr.default.EDGE_BOTTOM,u.marginBottom||0)},MN=(i,u)=>{"paddingLeft"in u&&i.setPadding(hr.default.EDGE_LEFT,u.paddingLeft||0),"paddingRight"in u&&i.setPadding(hr.default.EDGE_RIGHT,u.paddingRight||0),"paddingTop"in u&&i.setPadding(hr.default.EDGE_TOP,u.paddingTop||0),"paddingBottom"in u&&i.setPadding(hr.default.EDGE_BOTTOM,u.paddingBottom||0)},FN=(i,u)=>{var f;"flexGrow"in u&&i.setFlexGrow((f=u.flexGrow)!==null&&f!==void 0?f:0),"flexShrink"in u&&i.setFlexShrink(typeof u.flexShrink=="number"?u.flexShrink:1),"flexDirection"in u&&(u.flexDirection==="row"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW),u.flexDirection==="row-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_ROW_REVERSE),u.flexDirection==="column"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN),u.flexDirection==="column-reverse"&&i.setFlexDirection(hr.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in u&&(typeof u.flexBasis=="number"?i.setFlexBasis(u.flexBasis):typeof u.flexBasis=="string"?i.setFlexBasisPercent(Number.parseInt(u.flexBasis,10)):i.setFlexBasis(NaN)),"alignItems"in u&&((u.alignItems==="stretch"||!u.alignItems)&&i.setAlignItems(hr.default.ALIGN_STRETCH),u.alignItems==="flex-start"&&i.setAlignItems(hr.default.ALIGN_FLEX_START),u.alignItems==="center"&&i.setAlignItems(hr.default.ALIGN_CENTER),u.alignItems==="flex-end"&&i.setAlignItems(hr.default.ALIGN_FLEX_END)),"alignSelf"in u&&((u.alignSelf==="auto"||!u.alignSelf)&&i.setAlignSelf(hr.default.ALIGN_AUTO),u.alignSelf==="flex-start"&&i.setAlignSelf(hr.default.ALIGN_FLEX_START),u.alignSelf==="center"&&i.setAlignSelf(hr.default.ALIGN_CENTER),u.alignSelf==="flex-end"&&i.setAlignSelf(hr.default.ALIGN_FLEX_END)),"justifyContent"in u&&((u.justifyContent==="flex-start"||!u.justifyContent)&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_START),u.justifyContent==="center"&&i.setJustifyContent(hr.default.JUSTIFY_CENTER),u.justifyContent==="flex-end"&&i.setJustifyContent(hr.default.JUSTIFY_FLEX_END),u.justifyContent==="space-between"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_BETWEEN),u.justifyContent==="space-around"&&i.setJustifyContent(hr.default.JUSTIFY_SPACE_AROUND))},LN=(i,u)=>{var f,c;"width"in u&&(typeof u.width=="number"?i.setWidth(u.width):typeof u.width=="string"?i.setWidthPercent(Number.parseInt(u.width,10)):i.setWidthAuto()),"height"in u&&(typeof u.height=="number"?i.setHeight(u.height):typeof u.height=="string"?i.setHeightPercent(Number.parseInt(u.height,10)):i.setHeightAuto()),"minWidth"in u&&(typeof u.minWidth=="string"?i.setMinWidthPercent(Number.parseInt(u.minWidth,10)):i.setMinWidth((f=u.minWidth)!==null&&f!==void 0?f:0)),"minHeight"in u&&(typeof u.minHeight=="string"?i.setMinHeightPercent(Number.parseInt(u.minHeight,10)):i.setMinHeight((c=u.minHeight)!==null&&c!==void 0?c:0))},RN=(i,u)=>{"display"in u&&i.setDisplay(u.display==="flex"?hr.default.DISPLAY_FLEX:hr.default.DISPLAY_NONE)},NN=(i,u)=>{if("borderStyle"in u){let f=typeof u.borderStyle=="string"?1:0;i.setBorder(hr.default.EDGE_TOP,f),i.setBorder(hr.default.EDGE_BOTTOM,f),i.setBorder(hr.default.EDGE_LEFT,f),i.setBorder(hr.default.EDGE_RIGHT,f)}};d2.default=(i,u={})=>{IN(i,u),PN(i,u),MN(i,u),FN(i,u),LN(i,u),RN(i,u),NN(i,u)}});var AE=Me((Sb,kE)=>{"use strict";kE.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]}});var qy=Me((Cb,OE)=>{var p2=AE(),IE={};for(let i of Object.keys(p2))IE[p2[i]]=i;var Xt={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"]}};OE.exports=Xt;for(let i of Object.keys(Xt)){if(!("channels"in Xt[i]))throw new Error("missing channels property: "+i);if(!("labels"in Xt[i]))throw new Error("missing channel labels property: "+i);if(Xt[i].labels.length!==Xt[i].channels)throw new Error("channel and label counts mismatch: "+i);let{channels:u,labels:f}=Xt[i];delete Xt[i].channels,delete Xt[i].labels,Object.defineProperty(Xt[i],"channels",{value:u}),Object.defineProperty(Xt[i],"labels",{value:f})}Xt.rgb.hsl=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(u,f,c),t=Math.max(u,f,c),C=t-g,A,x;t===g?A=0:u===t?A=(f-c)/C:f===t?A=2+(c-u)/C:c===t&&(A=4+(u-f)/C),A=Math.min(A*60,360),A<0&&(A+=360);let D=(g+t)/2;return t===g?x=0:D<=.5?x=C/(t+g):x=C/(2-t-g),[A,x*100,D*100]};Xt.rgb.hsv=function(i){let u,f,c,g,t,C=i[0]/255,A=i[1]/255,x=i[2]/255,D=Math.max(C,A,x),L=D-Math.min(C,A,x),N=function(j){return(D-j)/6/L+1/2};return L===0?(g=0,t=0):(t=L/D,u=N(C),f=N(A),c=N(x),C===D?g=c-f:A===D?g=1/3+u-c:x===D&&(g=2/3+f-u),g<0?g+=1:g>1&&(g-=1)),[g*360,t*100,D*100]};Xt.rgb.hwb=function(i){let u=i[0],f=i[1],c=i[2],g=Xt.rgb.hsl(i)[0],t=1/255*Math.min(u,Math.min(f,c));return c=1-1/255*Math.max(u,Math.max(f,c)),[g,t*100,c*100]};Xt.rgb.cmyk=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.min(1-u,1-f,1-c),t=(1-u-g)/(1-g)||0,C=(1-f-g)/(1-g)||0,A=(1-c-g)/(1-g)||0;return[t*100,C*100,A*100,g*100]};function BN(i,u){return(i[0]-u[0])**2+(i[1]-u[1])**2+(i[2]-u[2])**2}Xt.rgb.keyword=function(i){let u=IE[i];if(u)return u;let f=Infinity,c;for(let g of Object.keys(p2)){let t=p2[g],C=BN(i,t);C.04045?((u+.055)/1.055)**2.4:u/12.92,f=f>.04045?((f+.055)/1.055)**2.4:f/12.92,c=c>.04045?((c+.055)/1.055)**2.4:c/12.92;let g=u*.4124+f*.3576+c*.1805,t=u*.2126+f*.7152+c*.0722,C=u*.0193+f*.1192+c*.9505;return[g*100,t*100,C*100]};Xt.rgb.lab=function(i){let u=Xt.rgb.xyz(i),f=u[0],c=u[1],g=u[2];f/=95.047,c/=100,g/=108.883,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116,g=g>.008856?g**(1/3):7.787*g+16/116;let t=116*c-16,C=500*(f-c),A=200*(c-g);return[t,C,A]};Xt.hsl.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g,t,C;if(f===0)return C=c*255,[C,C,C];c<.5?g=c*(1+f):g=c+f-c*f;let A=2*c-g,x=[0,0,0];for(let D=0;D<3;D++)t=u+1/3*-(D-1),t<0&&t++,t>1&&t--,6*t<1?C=A+(g-A)*6*t:2*t<1?C=g:3*t<2?C=A+(g-A)*(2/3-t)*6:C=A,x[D]=C*255;return x};Xt.hsl.hsv=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=f,t=Math.max(c,.01);c*=2,f*=c<=1?c:2-c,g*=t<=1?t:2-t;let C=(c+f)/2,A=c===0?2*g/(t+g):2*f/(c+f);return[u,A*100,C*100]};Xt.hsv.rgb=function(i){let u=i[0]/60,f=i[1]/100,c=i[2]/100,g=Math.floor(u)%6,t=u-Math.floor(u),C=255*c*(1-f),A=255*c*(1-f*t),x=255*c*(1-f*(1-t));switch(c*=255,g){case 0:return[c,x,C];case 1:return[A,c,C];case 2:return[C,c,x];case 3:return[C,A,c];case 4:return[x,C,c];case 5:return[c,C,A]}};Xt.hsv.hsl=function(i){let u=i[0],f=i[1]/100,c=i[2]/100,g=Math.max(c,.01),t,C;C=(2-f)*c;let A=(2-f)*g;return t=f*g,t/=A<=1?A:2-A,t=t||0,C/=2,[u,t*100,C*100]};Xt.hwb.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100,g=f+c,t;g>1&&(f/=g,c/=g);let C=Math.floor(6*u),A=1-c;t=6*u-C,(C&1)!=0&&(t=1-t);let x=f+t*(A-f),D,L,N;switch(C){default:case 6:case 0:D=A,L=x,N=f;break;case 1:D=x,L=A,N=f;break;case 2:D=f,L=A,N=x;break;case 3:D=f,L=x,N=A;break;case 4:D=x,L=f,N=A;break;case 5:D=A,L=f,N=x;break}return[D*255,L*255,N*255]};Xt.cmyk.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g=i[3]/100,t=1-Math.min(1,u*(1-g)+g),C=1-Math.min(1,f*(1-g)+g),A=1-Math.min(1,c*(1-g)+g);return[t*255,C*255,A*255]};Xt.xyz.rgb=function(i){let u=i[0]/100,f=i[1]/100,c=i[2]/100,g,t,C;return g=u*3.2406+f*-1.5372+c*-.4986,t=u*-.9689+f*1.8758+c*.0415,C=u*.0557+f*-.204+c*1.057,g=g>.0031308?1.055*g**(1/2.4)-.055:g*12.92,t=t>.0031308?1.055*t**(1/2.4)-.055:t*12.92,C=C>.0031308?1.055*C**(1/2.4)-.055:C*12.92,g=Math.min(Math.max(0,g),1),t=Math.min(Math.max(0,t),1),C=Math.min(Math.max(0,C),1),[g*255,t*255,C*255]};Xt.xyz.lab=function(i){let u=i[0],f=i[1],c=i[2];u/=95.047,f/=100,c/=108.883,u=u>.008856?u**(1/3):7.787*u+16/116,f=f>.008856?f**(1/3):7.787*f+16/116,c=c>.008856?c**(1/3):7.787*c+16/116;let g=116*f-16,t=500*(u-f),C=200*(f-c);return[g,t,C]};Xt.lab.xyz=function(i){let u=i[0],f=i[1],c=i[2],g,t,C;t=(u+16)/116,g=f/500+t,C=t-c/200;let A=t**3,x=g**3,D=C**3;return t=A>.008856?A:(t-16/116)/7.787,g=x>.008856?x:(g-16/116)/7.787,C=D>.008856?D:(C-16/116)/7.787,g*=95.047,t*=100,C*=108.883,[g,t,C]};Xt.lab.lch=function(i){let u=i[0],f=i[1],c=i[2],g;g=Math.atan2(c,f)*360/2/Math.PI,g<0&&(g+=360);let C=Math.sqrt(f*f+c*c);return[u,C,g]};Xt.lch.lab=function(i){let u=i[0],f=i[1],g=i[2]/360*2*Math.PI,t=f*Math.cos(g),C=f*Math.sin(g);return[u,t,C]};Xt.rgb.ansi16=function(i,u=null){let[f,c,g]=i,t=u===null?Xt.rgb.hsv(i)[2]:u;if(t=Math.round(t/50),t===0)return 30;let C=30+(Math.round(g/255)<<2|Math.round(c/255)<<1|Math.round(f/255));return t===2&&(C+=60),C};Xt.hsv.ansi16=function(i){return Xt.rgb.ansi16(Xt.hsv.rgb(i),i[2])};Xt.rgb.ansi256=function(i){let u=i[0],f=i[1],c=i[2];return u===f&&f===c?u<8?16:u>248?231:Math.round((u-8)/247*24)+232:16+36*Math.round(u/255*5)+6*Math.round(f/255*5)+Math.round(c/255*5)};Xt.ansi16.rgb=function(i){let u=i%10;if(u===0||u===7)return i>50&&(u+=3.5),u=u/10.5*255,[u,u,u];let f=(~~(i>50)+1)*.5,c=(u&1)*f*255,g=(u>>1&1)*f*255,t=(u>>2&1)*f*255;return[c,g,t]};Xt.ansi256.rgb=function(i){if(i>=232){let t=(i-232)*10+8;return[t,t,t]}i-=16;let u,f=Math.floor(i/36)/5*255,c=Math.floor((u=i%36)/6)/5*255,g=u%6/5*255;return[f,c,g]};Xt.rgb.hex=function(i){let f=(((Math.round(i[0])&255)<<16)+((Math.round(i[1])&255)<<8)+(Math.round(i[2])&255)).toString(16).toUpperCase();return"000000".substring(f.length)+f};Xt.hex.rgb=function(i){let u=i.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!u)return[0,0,0];let f=u[0];u[0].length===3&&(f=f.split("").map(A=>A+A).join(""));let c=parseInt(f,16),g=c>>16&255,t=c>>8&255,C=c&255;return[g,t,C]};Xt.rgb.hcg=function(i){let u=i[0]/255,f=i[1]/255,c=i[2]/255,g=Math.max(Math.max(u,f),c),t=Math.min(Math.min(u,f),c),C=g-t,A,x;return C<1?A=t/(1-C):A=0,C<=0?x=0:g===u?x=(f-c)/C%6:g===f?x=2+(c-u)/C:x=4+(u-f)/C,x/=6,x%=1,[x*360,C*100,A*100]};Xt.hsl.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=f<.5?2*u*f:2*u*(1-f),g=0;return c<1&&(g=(f-.5*c)/(1-c)),[i[0],c*100,g*100]};Xt.hsv.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=u*f,g=0;return c<1&&(g=(f-c)/(1-c)),[i[0],c*100,g*100]};Xt.hcg.rgb=function(i){let u=i[0]/360,f=i[1]/100,c=i[2]/100;if(f===0)return[c*255,c*255,c*255];let g=[0,0,0],t=u%1*6,C=t%1,A=1-C,x=0;switch(Math.floor(t)){case 0:g[0]=1,g[1]=C,g[2]=0;break;case 1:g[0]=A,g[1]=1,g[2]=0;break;case 2:g[0]=0,g[1]=1,g[2]=C;break;case 3:g[0]=0,g[1]=A,g[2]=1;break;case 4:g[0]=C,g[1]=0,g[2]=1;break;default:g[0]=1,g[1]=0,g[2]=A}return x=(1-f)*c,[(f*g[0]+x)*255,(f*g[1]+x)*255,(f*g[2]+x)*255]};Xt.hcg.hsv=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u),g=0;return c>0&&(g=u/c),[i[0],g*100,c*100]};Xt.hcg.hsl=function(i){let u=i[1]/100,c=i[2]/100*(1-u)+.5*u,g=0;return c>0&&c<.5?g=u/(2*c):c>=.5&&c<1&&(g=u/(2*(1-c))),[i[0],g*100,c*100]};Xt.hcg.hwb=function(i){let u=i[1]/100,f=i[2]/100,c=u+f*(1-u);return[i[0],(c-u)*100,(1-c)*100]};Xt.hwb.hcg=function(i){let u=i[1]/100,f=i[2]/100,c=1-f,g=c-u,t=0;return g<1&&(t=(c-g)/(1-g)),[i[0],g*100,t*100]};Xt.apple.rgb=function(i){return[i[0]/65535*255,i[1]/65535*255,i[2]/65535*255]};Xt.rgb.apple=function(i){return[i[0]/255*65535,i[1]/255*65535,i[2]/255*65535]};Xt.gray.rgb=function(i){return[i[0]/100*255,i[0]/100*255,i[0]/100*255]};Xt.gray.hsl=function(i){return[0,0,i[0]]};Xt.gray.hsv=Xt.gray.hsl;Xt.gray.hwb=function(i){return[0,100,i[0]]};Xt.gray.cmyk=function(i){return[0,0,0,i[0]]};Xt.gray.lab=function(i){return[i[0],0,0]};Xt.gray.hex=function(i){let u=Math.round(i[0]/100*255)&255,c=((u<<16)+(u<<8)+u).toString(16).toUpperCase();return"000000".substring(c.length)+c};Xt.rgb.gray=function(i){return[(i[0]+i[1]+i[2])/3/255*100]}});var ME=Me((Tb,PE)=>{var Fh=qy();function jN(){let i={},u=Object.keys(Fh);for(let f=u.length,c=0;c{var zy=qy(),WN=ME(),Ca={},HN=Object.keys(zy);function bN(i){let u=function(...f){let c=f[0];return c==null?c:(c.length>1&&(f=c),i(f))};return"conversion"in i&&(u.conversion=i.conversion),u}function GN(i){let u=function(...f){let c=f[0];if(c==null)return c;c.length>1&&(f=c);let g=i(f);if(typeof g=="object")for(let t=g.length,C=0;C{Ca[i]={},Object.defineProperty(Ca[i],"channels",{value:zy[i].channels}),Object.defineProperty(Ca[i],"labels",{value:zy[i].labels});let u=WN(i);Object.keys(u).forEach(c=>{let g=u[c];Ca[i][c]=GN(g),Ca[i][c].raw=bN(g)})});FE.exports=Ca});var Rh=Me((kb,RE)=>{"use strict";var NE=(i,u)=>(...f)=>`[${i(...f)+u}m`,BE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};5;${c}m`},jE=(i,u)=>(...f)=>{let c=i(...f);return`[${38+u};2;${c[0]};${c[1]};${c[2]}m`},Lh=i=>i,UE=(i,u,f)=>[i,u,f],Ta=(i,u,f)=>{Object.defineProperty(i,u,{get:()=>{let c=f();return Object.defineProperty(i,u,{value:c,enumerable:!0,configurable:!0}),c},enumerable:!0,configurable:!0})},Wy,xa=(i,u,f,c)=>{Wy===void 0&&(Wy=LE());let g=c?10:0,t={};for(let[C,A]of Object.entries(Wy)){let x=C==="ansi16"?"ansi":C;C===u?t[x]=i(f,g):typeof A=="object"&&(t[x]=i(A[u],g))}return t};function VN(){let i=new Map,u={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]}};u.color.gray=u.color.blackBright,u.bgColor.bgGray=u.bgColor.bgBlackBright,u.color.grey=u.color.blackBright,u.bgColor.bgGrey=u.bgColor.bgBlackBright;for(let[f,c]of Object.entries(u)){for(let[g,t]of Object.entries(c))u[g]={open:`[${t[0]}m`,close:`[${t[1]}m`},c[g]=u[g],i.set(t[0],t[1]);Object.defineProperty(u,f,{value:c,enumerable:!1})}return Object.defineProperty(u,"codes",{value:i,enumerable:!1}),u.color.close="",u.bgColor.close="",Ta(u.color,"ansi",()=>xa(NE,"ansi16",Lh,!1)),Ta(u.color,"ansi256",()=>xa(BE,"ansi256",Lh,!1)),Ta(u.color,"ansi16m",()=>xa(jE,"rgb",UE,!1)),Ta(u.bgColor,"ansi",()=>xa(NE,"ansi16",Lh,!0)),Ta(u.bgColor,"ansi256",()=>xa(BE,"ansi256",Lh,!0)),Ta(u.bgColor,"ansi16m",()=>xa(jE,"rgb",UE,!0)),u}Object.defineProperty(RE,"exports",{enumerable:!0,get:VN})});var WE=Me((Ab,qE)=>{"use strict";var h2=Mh(),YN=Fy(),$N=Rh(),Hy=new Set(["","\x9B"]),KN=39,zE=i=>`${Hy.values().next().value}[${i}m`,XN=i=>i.split(" ").map(u=>h2(u)),by=(i,u,f)=>{let c=[...u],g=!1,t=h2(YN(i[i.length-1]));for(let[C,A]of c.entries()){let x=h2(A);if(t+x<=f?i[i.length-1]+=A:(i.push(A),t=0),Hy.has(A))g=!0;else if(g&&A==="m"){g=!1;continue}g||(t+=x,t===f&&C0&&i.length>1&&(i[i.length-2]+=i.pop())},JN=i=>{let u=i.split(" "),f=u.length;for(;f>0&&!(h2(u[f-1])>0);)f--;return f===u.length?i:u.slice(0,f).join(" ")+u.slice(f).join("")},QN=(i,u,f={})=>{if(f.trim!==!1&&i.trim()==="")return"";let c="",g="",t,C=XN(i),A=[""];for(let[x,D]of i.split(" ").entries()){f.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let L=h2(A[A.length-1]);if(x!==0&&(L>=u&&(f.wordWrap===!1||f.trim===!1)&&(A.push(""),L=0),(L>0||f.trim===!1)&&(A[A.length-1]+=" ",L++)),f.hard&&C[x]>u){let N=u-L,j=1+Math.floor((C[x]-N-1)/u);Math.floor((C[x]-1)/u)u&&L>0&&C[x]>0){if(f.wordWrap===!1&&Lu&&f.wordWrap===!1){by(A,D,u);continue}A[A.length-1]+=D}f.trim!==!1&&(A=A.map(JN)),c=A.join(` -`);for(let[x,D]of[...c].entries()){if(g+=D,Hy.has(D)){let N=parseFloat(/\d[^m]*/.exec(c.slice(x,x+4)));t=N===KN?null:N}let L=$N.codes.get(Number(t));t&&L&&(c[x+1]===` -`?g+=zE(L):D===` -`&&(g+=zE(t)))}return g};qE.exports=(i,u,f)=>String(i).normalize().replace(/\r\n/g,` -`).split(` -`).map(c=>QN(c,u,f)).join(` -`)});var GE=Me((Ob,HE)=>{"use strict";var bE="[\uD800-\uDBFF][\uDC00-\uDFFF]",ZN=i=>i&&i.exact?new RegExp(`^${bE}$`):new RegExp(bE,"g");HE.exports=ZN});var Gy=Me((Ib,VE)=>{"use strict";var eB=Ry(),tB=GE(),YE=Rh(),$E=["","\x9B"],Nh=i=>`${$E[0]}[${i}m`,KE=(i,u,f)=>{let c=[];i=[...i];for(let g of i){let t=g;g.match(";")&&(g=g.split(";")[0][0]+"0");let C=YE.codes.get(parseInt(g,10));if(C){let A=i.indexOf(C.toString());A>=0?i.splice(A,1):c.push(Nh(u?C:t))}else if(u){c.push(Nh(0));break}else c.push(Nh(t))}if(u&&(c=c.filter((g,t)=>c.indexOf(g)===t),f!==void 0)){let g=Nh(YE.codes.get(parseInt(f,10)));c=c.reduce((t,C)=>C===g?[C,...t]:[...t,C],[])}return c.join("")};VE.exports=(i,u,f)=>{let c=[...i.normalize()],g=[];f=typeof f=="number"?f:c.length;let t=!1,C,A=0,x="";for(let[D,L]of c.entries()){let N=!1;if($E.includes(L)){let j=/\d[^m]*/.exec(i.slice(D,D+18));C=j&&j.length>0?j[0]:void 0,Au&&A<=f)x+=L;else if(A===u&&!t&&C!==void 0)x=KE(g);else if(A>=f){x+=KE(g,!0,C);break}}return x}});var JE=Me((Pb,XE)=>{"use strict";var Bf=Gy(),nB=Mh();function Bh(i,u,f){if(i.charAt(u)===" ")return u;for(let c=1;c<=3;c++)if(f){if(i.charAt(u+c)===" ")return u+c}else if(i.charAt(u-c)===" ")return u-c;return u}XE.exports=(i,u,f)=>{f=dt({position:"end",preferTruncationOnSpace:!1},f);let{position:c,space:g,preferTruncationOnSpace:t}=f,C="\u2026",A=1;if(typeof i!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof i}`);if(typeof u!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof u}`);if(u<1)return"";if(u===1)return C;let x=nB(i);if(x<=u)return i;if(c==="start"){if(t){let D=Bh(i,x-u+1,!0);return C+Bf(i,D,x).trim()}return g===!0&&(C+=" ",A=2),C+Bf(i,x-u+A,x)}if(c==="middle"){g===!0&&(C=" "+C+" ",A=3);let D=Math.floor(u/2);if(t){let L=Bh(i,D),N=Bh(i,x-(u-D)+1,!0);return Bf(i,0,L)+C+Bf(i,N,x).trim()}return Bf(i,0,D)+C+Bf(i,x-(u-D)+A,x)}if(c==="end"){if(t){let D=Bh(i,u-1);return Bf(i,0,D)+C}return g===!0&&(C=" "+C,A=2),Bf(i,0,u-A)+C}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${c}`)}});var Yy=Me(m2=>{"use strict";var QE=m2&&m2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(m2,"__esModule",{value:!0});var rB=QE(WE()),iB=QE(JE()),Vy={};m2.default=(i,u,f)=>{let c=i+String(u)+String(f);if(Vy[c])return Vy[c];let g=i;if(f==="wrap"&&(g=rB.default(i,u,{trim:!1,hard:!0})),f.startsWith("truncate")){let t="end";f==="truncate-middle"&&(t="middle"),f==="truncate-start"&&(t="start"),g=iB.default(i,u,{position:t})}return Vy[c]=g,g}});var Ky=Me($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});var ZE=i=>{let u="";if(i.childNodes.length>0)for(let f of i.childNodes){let c="";f.nodeName==="#text"?c=f.nodeValue:((f.nodeName==="ink-text"||f.nodeName==="ink-virtual-text")&&(c=ZE(f)),c.length>0&&typeof f.internal_transform=="function"&&(c=f.internal_transform(c))),u+=c}return u};$y.default=ZE});var Xy=Me(Zr=>{"use strict";var v2=Zr&&Zr.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Zr,"__esModule",{value:!0});Zr.setTextNodeValue=Zr.createTextNode=Zr.setStyle=Zr.setAttribute=Zr.removeChildNode=Zr.insertBeforeNode=Zr.appendChildNode=Zr.createNode=Zr.TEXT_NAME=void 0;var oB=v2(hc()),e6=v2(TE()),uB=v2(xE()),sB=v2(Yy()),lB=v2(Ky());Zr.TEXT_NAME="#text";Zr.createNode=i=>{var u;let f={nodeName:i,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:i==="ink-virtual-text"?void 0:oB.default.Node.create()};return i==="ink-text"&&((u=f.yogaNode)===null||u===void 0||u.setMeasureFunc(fB.bind(null,f))),f};Zr.appendChildNode=(i,u)=>{var f;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i,i.childNodes.push(u),u.yogaNode&&((f=i.yogaNode)===null||f===void 0||f.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.insertBeforeNode=(i,u,f)=>{var c,g;u.parentNode&&Zr.removeChildNode(u.parentNode,u),u.parentNode=i;let t=i.childNodes.indexOf(f);if(t>=0){i.childNodes.splice(t,0,u),u.yogaNode&&((c=i.yogaNode)===null||c===void 0||c.insertChild(u.yogaNode,t));return}i.childNodes.push(u),u.yogaNode&&((g=i.yogaNode)===null||g===void 0||g.insertChild(u.yogaNode,i.yogaNode.getChildCount())),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.removeChildNode=(i,u)=>{var f,c;u.yogaNode&&((c=(f=u.parentNode)===null||f===void 0?void 0:f.yogaNode)===null||c===void 0||c.removeChild(u.yogaNode)),u.parentNode=null;let g=i.childNodes.indexOf(u);g>=0&&i.childNodes.splice(g,1),(i.nodeName==="ink-text"||i.nodeName==="ink-virtual-text")&&jh(i)};Zr.setAttribute=(i,u,f)=>{i.attributes[u]=f};Zr.setStyle=(i,u)=>{i.style=u,i.yogaNode&&uB.default(i.yogaNode,u)};Zr.createTextNode=i=>{let u={nodeName:"#text",nodeValue:i,yogaNode:void 0,parentNode:null,style:{}};return Zr.setTextNodeValue(u,i),u};var fB=function(i,u){var f,c;let g=i.nodeName==="#text"?i.nodeValue:lB.default(i),t=e6.default(g);if(t.width<=u||t.width>=1&&u>0&&u<1)return t;let C=(c=(f=i.style)===null||f===void 0?void 0:f.textWrap)!==null&&c!==void 0?c:"wrap",A=sB.default(g,u,C);return e6.default(A)},t6=i=>{var u;if(!(!i||!i.parentNode))return(u=i.yogaNode)!==null&&u!==void 0?u:t6(i.parentNode)},jh=i=>{let u=t6(i);u==null||u.markDirty()};Zr.setTextNodeValue=(i,u)=>{typeof u!="string"&&(u=String(u)),i.nodeValue=u,jh(i)}});var mc=Me((Rb,n6)=>{"use strict";n6.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:()=>{}}});var g2=Me((Nb,Jy)=>{"use strict";var{EMPTY_BUFFER:cB}=mc();function r6(i,u){if(i.length===0)return cB;if(i.length===1)return i[0];let f=Buffer.allocUnsafe(u),c=0;for(let g=0;g{"use strict";var l6=Symbol("kDone"),Qy=Symbol("kRun"),f6=class{constructor(u){this[l6]=()=>{this.pending--,this[Qy]()},this.concurrency=u||Infinity,this.jobs=[],this.pending=0}add(u){this.jobs.push(u),this[Qy]()}[Qy](){if(this.pending!==this.concurrency&&this.jobs.length){let u=this.jobs.shift();this.pending++,u(this[l6])}}};s6.exports=f6});var w2=Me((jb,a6)=>{"use strict";var _2=require("zlib"),d6=g2(),aB=c6(),{kStatusCode:p6,NOOP:dB}=mc(),pB=Buffer.from([0,0,255,255]),qh=Symbol("permessage-deflate"),Xl=Symbol("total-length"),y2=Symbol("callback"),jf=Symbol("buffers"),Zy=Symbol("error"),zh,h6=class{constructor(u,f,c){if(this._maxPayload=c|0,this._options=u||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!f,this._deflate=null,this._inflate=null,this.params=null,!zh){let g=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;zh=new aB(g)}}static get extensionName(){return"permessage-deflate"}offer(){let u={};return this._options.serverNoContextTakeover&&(u.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(u.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(u.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?u.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(u.client_max_window_bits=!0),u}accept(u){return u=this.normalizeParams(u),this.params=this._isServer?this.acceptAsServer(u):this.acceptAsClient(u),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let u=this._deflate[y2];this._deflate.close(),this._deflate=null,u&&u(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(u){let f=this._options,c=u.find(g=>!(f.serverNoContextTakeover===!1&&g.server_no_context_takeover||g.server_max_window_bits&&(f.serverMaxWindowBits===!1||typeof f.serverMaxWindowBits=="number"&&f.serverMaxWindowBits>g.server_max_window_bits)||typeof f.clientMaxWindowBits=="number"&&!g.client_max_window_bits));if(!c)throw new Error("None of the extension offers can be accepted");return f.serverNoContextTakeover&&(c.server_no_context_takeover=!0),f.clientNoContextTakeover&&(c.client_no_context_takeover=!0),typeof f.serverMaxWindowBits=="number"&&(c.server_max_window_bits=f.serverMaxWindowBits),typeof f.clientMaxWindowBits=="number"?c.client_max_window_bits=f.clientMaxWindowBits:(c.client_max_window_bits===!0||f.clientMaxWindowBits===!1)&&delete c.client_max_window_bits,c}acceptAsClient(u){let f=u[0];if(this._options.clientNoContextTakeover===!1&&f.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!f.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(f.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&f.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return f}normalizeParams(u){return u.forEach(f=>{Object.keys(f).forEach(c=>{let g=f[c];if(g.length>1)throw new Error(`Parameter "${c}" must have only a single value`);if(g=g[0],c==="client_max_window_bits"){if(g!==!0){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else if(c==="server_max_window_bits"){let t=+g;if(!Number.isInteger(t)||t<8||t>15)throw new TypeError(`Invalid value for parameter "${c}": ${g}`);g=t}else if(c==="client_no_context_takeover"||c==="server_no_context_takeover"){if(g!==!0)throw new TypeError(`Invalid value for parameter "${c}": ${g}`)}else throw new Error(`Unknown parameter "${c}"`);f[c]=g})}),u}decompress(u,f,c){zh.add(g=>{this._decompress(u,f,(t,C)=>{g(),c(t,C)})})}compress(u,f,c){zh.add(g=>{this._compress(u,f,(t,C)=>{g(),c(t,C)})})}_decompress(u,f,c){let g=this._isServer?"client":"server";if(!this._inflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._inflate=_2.createInflateRaw(zn(dt({},this._options.zlibInflateOptions),{windowBits:C})),this._inflate[qh]=this,this._inflate[Xl]=0,this._inflate[jf]=[],this._inflate.on("error",mB),this._inflate.on("data",m6)}this._inflate[y2]=c,this._inflate.write(u),f&&this._inflate.write(pB),this._inflate.flush(()=>{let t=this._inflate[Zy];if(t){this._inflate.close(),this._inflate=null,c(t);return}let C=d6.concat(this._inflate[jf],this._inflate[Xl]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[Xl]=0,this._inflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._inflate.reset()),c(null,C)})}_compress(u,f,c){let g=this._isServer?"server":"client";if(!this._deflate){let t=`${g}_max_window_bits`,C=typeof this.params[t]!="number"?_2.Z_DEFAULT_WINDOWBITS:this.params[t];this._deflate=_2.createDeflateRaw(zn(dt({},this._options.zlibDeflateOptions),{windowBits:C})),this._deflate[Xl]=0,this._deflate[jf]=[],this._deflate.on("error",dB),this._deflate.on("data",hB)}this._deflate[y2]=c,this._deflate.write(u),this._deflate.flush(_2.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let t=d6.concat(this._deflate[jf],this._deflate[Xl]);f&&(t=t.slice(0,t.length-4)),this._deflate[y2]=null,this._deflate[Xl]=0,this._deflate[jf]=[],f&&this.params[`${g}_no_context_takeover`]&&this._deflate.reset(),c(null,t)})}};a6.exports=h6;function hB(i){this[jf].push(i),this[Xl]+=i.length}function m6(i){if(this[Xl]+=i.length,this[qh]._maxPayload<1||this[Xl]<=this[qh]._maxPayload){this[jf].push(i);return}this[Zy]=new RangeError("Max payload size exceeded"),this[Zy][p6]=1009,this.removeListener("data",m6),this.reset()}function mB(i){this[qh]._inflate=null,i[p6]=1007,this[y2](i)}});var t3=Me((Ub,e3)=>{"use strict";function v6(i){return i>=1e3&&i<=1014&&i!==1004&&i!==1005&&i!==1006||i>=3e3&&i<=4999}function g6(i){let u=i.length,f=0;for(;f=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||i[f]===224&&(i[f+1]&224)==128||i[f]===237&&(i[f+1]&224)==160)return!1;f+=3}else if((i[f]&248)==240){if(f+3>=u||(i[f+1]&192)!=128||(i[f+2]&192)!=128||(i[f+3]&192)!=128||i[f]===240&&(i[f+1]&240)==128||i[f]===244&&i[f+1]>143||i[f]>244)return!1;f+=4}else return!1;return!0}try{let i=require("utf-8-validate");typeof i=="object"&&(i=i.Validation.isValidUTF8),e3.exports={isValidStatusCode:v6,isValidUTF8(u){return u.length<150?g6(u):i(u)}}}catch(i){e3.exports={isValidStatusCode:v6,isValidUTF8:g6}}});var i3=Me((qb,_6)=>{"use strict";var{Writable:vB}=require("stream"),y6=w2(),{BINARY_TYPES:gB,EMPTY_BUFFER:_B,kStatusCode:yB,kWebSocket:wB}=mc(),{concat:n3,toArrayBuffer:DB,unmask:EB}=g2(),{isValidStatusCode:SB,isValidUTF8:w6}=t3(),D2=0,D6=1,E6=2,S6=3,r3=4,CB=5,C6=class extends vB{constructor(u,f,c,g){super();this._binaryType=u||gB[0],this[wB]=void 0,this._extensions=f||{},this._isServer=!!c,this._maxPayload=g|0,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=D2,this._loop=!1}_write(u,f,c){if(this._opcode===8&&this._state==D2)return c();this._bufferedBytes+=u.length,this._buffers.push(u),this.startLoop(c)}consume(u){if(this._bufferedBytes-=u,u===this._buffers[0].length)return this._buffers.shift();if(u=c.length?f.set(this._buffers.shift(),g):(f.set(new Uint8Array(c.buffer,c.byteOffset,u),g),this._buffers[0]=c.slice(u)),u-=c.length}while(u>0);return f}startLoop(u){let f;this._loop=!0;do switch(this._state){case D2:f=this.getInfo();break;case D6:f=this.getPayloadLength16();break;case E6:f=this.getPayloadLength64();break;case S6:this.getMask();break;case r3:f=this.getData(u);break;default:this._loop=!1;return}while(this._loop);u(f)}getInfo(){if(this._bufferedBytes<2){this._loop=!1;return}let u=this.consume(2);if((u[0]&48)!=0)return this._loop=!1,ii(RangeError,"RSV2 and RSV3 must be clear",!0,1002);let f=(u[0]&64)==64;if(f&&!this._extensions[y6.extensionName])return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._fin=(u[0]&128)==128,this._opcode=u[0]&15,this._payloadLength=u[1]&127,this._opcode===0){if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(!this._fragmented)return this._loop=!1,ii(RangeError,"invalid opcode 0",!0,1002);this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented)return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);this._compressed=f}else if(this._opcode>7&&this._opcode<11){if(!this._fin)return this._loop=!1,ii(RangeError,"FIN must be set",!0,1002);if(f)return this._loop=!1,ii(RangeError,"RSV1 must be clear",!0,1002);if(this._payloadLength>125)return this._loop=!1,ii(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002)}else return this._loop=!1,ii(RangeError,`invalid opcode ${this._opcode}`,!0,1002);if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(u[1]&128)==128,this._isServer){if(!this._masked)return this._loop=!1,ii(RangeError,"MASK must be set",!0,1002)}else if(this._masked)return this._loop=!1,ii(RangeError,"MASK must be clear",!0,1002);if(this._payloadLength===126)this._state=D6;else if(this._payloadLength===127)this._state=E6;else return this.haveLength()}getPayloadLength16(){if(this._bufferedBytes<2){this._loop=!1;return}return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength()}getPayloadLength64(){if(this._bufferedBytes<8){this._loop=!1;return}let u=this.consume(8),f=u.readUInt32BE(0);return f>Math.pow(2,53-32)-1?(this._loop=!1,ii(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009)):(this._payloadLength=f*Math.pow(2,32)+u.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,ii(RangeError,"Max payload size exceeded",!1,1009);this._masked?this._state=S6:this._state=r3}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=r3}getData(u){let f=_B;if(this._payloadLength){if(this._bufferedBytes7)return this.controlMessage(f);if(this._compressed){this._state=CB,this.decompress(f,u);return}return f.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(f)),this.dataMessage()}decompress(u,f){this._extensions[y6.extensionName].decompress(u,this._fin,(g,t)=>{if(g)return f(g);if(t.length){if(this._messageLength+=t.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return f(ii(RangeError,"Max payload size exceeded",!1,1009));this._fragments.push(t)}let C=this.dataMessage();if(C)return f(C);this.startLoop(f)})}dataMessage(){if(this._fin){let u=this._messageLength,f=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let c;this._binaryType==="nodebuffer"?c=n3(f,u):this._binaryType==="arraybuffer"?c=DB(n3(f,u)):c=f,this.emit("message",c)}else{let c=n3(f,u);if(!w6(c))return this._loop=!1,ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("message",c.toString())}}this._state=D2}controlMessage(u){if(this._opcode===8)if(this._loop=!1,u.length===0)this.emit("conclude",1005,""),this.end();else{if(u.length===1)return ii(RangeError,"invalid payload length 1",!0,1002);{let f=u.readUInt16BE(0);if(!SB(f))return ii(RangeError,`invalid status code ${f}`,!0,1002);let c=u.slice(2);if(!w6(c))return ii(Error,"invalid UTF-8 sequence",!0,1007);this.emit("conclude",f,c.toString()),this.end()}}else this._opcode===9?this.emit("ping",u):this.emit("pong",u);this._state=D2}};_6.exports=C6;function ii(i,u,f,c){let g=new i(f?`Invalid WebSocket frame: ${u}`:u);return Error.captureStackTrace(g,ii),g[yB]=c,g}});var o3=Me((zb,T6)=>{"use strict";var{randomFillSync:TB}=require("crypto"),x6=w2(),{EMPTY_BUFFER:xB}=mc(),{isValidStatusCode:kB}=t3(),{mask:k6,toBuffer:Jl}=g2(),vc=Buffer.alloc(4),Ql=class{constructor(u,f){this._extensions=f||{},this._socket=u,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(u,f){let c=f.mask&&f.readOnly,g=f.mask?6:2,t=u.length;u.length>=65536?(g+=8,t=127):u.length>125&&(g+=2,t=126);let C=Buffer.allocUnsafe(c?u.length+g:g);return C[0]=f.fin?f.opcode|128:f.opcode,f.rsv1&&(C[0]|=64),C[1]=t,t===126?C.writeUInt16BE(u.length,2):t===127&&(C.writeUInt32BE(0,2),C.writeUInt32BE(u.length,6)),f.mask?(TB(vc,0,4),C[1]|=128,C[g-4]=vc[0],C[g-3]=vc[1],C[g-2]=vc[2],C[g-1]=vc[3],c?(k6(u,vc,C,g,u.length),[C]):(k6(u,vc,u,0,u.length),[C,u])):[C,u]}close(u,f,c,g){let t;if(u===void 0)t=xB;else{if(typeof u!="number"||!kB(u))throw new TypeError("First argument must be a valid error code number");if(f===void 0||f==="")t=Buffer.allocUnsafe(2),t.writeUInt16BE(u,0);else{let C=Buffer.byteLength(f);if(C>123)throw new RangeError("The message must not be greater than 123 bytes");t=Buffer.allocUnsafe(2+C),t.writeUInt16BE(u,0),t.write(f,2)}}this._deflating?this.enqueue([this.doClose,t,c,g]):this.doClose(t,c,g)}doClose(u,f,c){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:8,mask:f,readOnly:!1}),c)}ping(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,g,f,Jl.readOnly,c]):this.doPing(g,f,Jl.readOnly,c)}doPing(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:9,mask:f,readOnly:c}),g)}pong(u,f,c){let g=Jl(u);if(g.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,g,f,Jl.readOnly,c]):this.doPong(g,f,Jl.readOnly,c)}doPong(u,f,c,g){this.sendFrame(Ql.frame(u,{fin:!0,rsv1:!1,opcode:10,mask:f,readOnly:c}),g)}send(u,f,c){let g=Jl(u),t=this._extensions[x6.extensionName],C=f.binary?2:1,A=f.compress;if(this._firstFragment?(this._firstFragment=!1,A&&t&&(A=g.length>=t._threshold),this._compress=A):(A=!1,C=0),f.fin&&(this._firstFragment=!0),t){let x={fin:f.fin,rsv1:A,opcode:C,mask:f.mask,readOnly:Jl.readOnly};this._deflating?this.enqueue([this.dispatch,g,this._compress,x,c]):this.dispatch(g,this._compress,x,c)}else this.sendFrame(Ql.frame(g,{fin:f.fin,rsv1:!1,opcode:C,mask:f.mask,readOnly:Jl.readOnly}),c)}dispatch(u,f,c,g){if(!f){this.sendFrame(Ql.frame(u,c),g);return}let t=this._extensions[x6.extensionName];this._bufferedBytes+=u.length,this._deflating=!0,t.compress(u,c.fin,(C,A)=>{if(this._socket.destroyed){let x=new Error("The socket was closed while data was being compressed");typeof g=="function"&&g(x);for(let D=0;D{"use strict";var E2=class{constructor(u,f){this.target=f,this.type=u}},O6=class extends E2{constructor(u,f){super("message",f);this.data=u}},I6=class extends E2{constructor(u,f,c){super("close",c);this.wasClean=c._closeFrameReceived&&c._closeFrameSent,this.reason=f,this.code=u}},P6=class extends E2{constructor(u){super("open",u)}},M6=class extends E2{constructor(u,f){super("error",f);this.message=u.message,this.error=u}},AB={addEventListener(i,u,f){if(typeof u!="function")return;function c(x){u.call(this,new O6(x,this))}function g(x,D){u.call(this,new I6(x,D,this))}function t(x){u.call(this,new M6(x,this))}function C(){u.call(this,new P6(this))}let A=f&&f.once?"once":"on";i==="message"?(c._listener=u,this[A](i,c)):i==="close"?(g._listener=u,this[A](i,g)):i==="error"?(t._listener=u,this[A](i,t)):i==="open"?(C._listener=u,this[A](i,C)):this[A](i,u)},removeEventListener(i,u){let f=this.listeners(i);for(let c=0;c{"use strict";var S2=[0,0,0,0,0,0,0,0,0,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 rl(i,u,f){i[u]===void 0?i[u]=[f]:i[u].push(f)}function OB(i){let u=Object.create(null);if(i===void 0||i==="")return u;let f=Object.create(null),c=!1,g=!1,t=!1,C,A,x=-1,D=-1,L=0;for(;L{let f=i[u];return Array.isArray(f)||(f=[f]),f.map(c=>[u].concat(Object.keys(c).map(g=>{let t=c[g];return Array.isArray(t)||(t=[t]),t.map(C=>C===!0?g:`${g}=${C}`).join("; ")})).join("; ")).join(", ")}).join(", ")}L6.exports={format:IB,parse:OB}});var a3=Me((bb,R6)=>{"use strict";var PB=require("events"),MB=require("https"),FB=require("http"),N6=require("net"),LB=require("tls"),{randomBytes:RB,createHash:NB}=require("crypto"),{URL:s3}=require("url"),Uf=w2(),BB=i3(),jB=o3(),{BINARY_TYPES:B6,EMPTY_BUFFER:l3,GUID:UB,kStatusCode:qB,kWebSocket:No,NOOP:j6}=mc(),{addEventListener:zB,removeEventListener:WB}=F6(),{format:HB,parse:bB}=u3(),{toBuffer:GB}=g2(),U6=["CONNECTING","OPEN","CLOSING","CLOSED"],f3=[8,13],VB=30*1e3,mr=class extends PB{constructor(u,f,c){super();this._binaryType=B6[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage="",this._closeTimer=null,this._extensions={},this._protocol="",this._readyState=mr.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,u!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,Array.isArray(f)?f=f.join(", "):typeof f=="object"&&f!==null&&(c=f,f=void 0),q6(this,u,f,c)):this._isServer=!0}get binaryType(){return this._binaryType}set binaryType(u){!B6.includes(u)||(this._binaryType=u,this._receiver&&(this._receiver._binaryType=u))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(u,f,c){let g=new BB(this.binaryType,this._extensions,this._isServer,c);this._sender=new jB(u,this._extensions),this._receiver=g,this._socket=u,g[No]=this,u[No]=this,g.on("conclude",YB),g.on("drain",$B),g.on("error",KB),g.on("message",XB),g.on("ping",JB),g.on("pong",QB),u.setTimeout(0),u.setNoDelay(),f.length>0&&u.unshift(f),u.on("close",z6),u.on("data",Wh),u.on("end",W6),u.on("error",H6),this._readyState=mr.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[Uf.extensionName]&&this._extensions[Uf.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=mr.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(u,f){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let c="WebSocket was closed before the connection was established";return Zl(this,this._req,c)}if(this.readyState===mr.CLOSING){this._closeFrameSent&&this._closeFrameReceived&&this._socket.end();return}this._readyState=mr.CLOSING,this._sender.close(u,f,!this._isServer,c=>{c||(this._closeFrameSent=!0,this._closeFrameReceived&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),VB)}}ping(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.ping(u||l3,f,c)}pong(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof u=="function"?(c=u,u=f=void 0):typeof f=="function"&&(c=f,f=void 0),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}f===void 0&&(f=!this._isServer),this._sender.pong(u||l3,f,c)}send(u,f,c){if(this.readyState===mr.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof f=="function"&&(c=f,f={}),typeof u=="number"&&(u=u.toString()),this.readyState!==mr.OPEN){c3(this,u,c);return}let g=dt({binary:typeof u!="string",mask:!this._isServer,compress:!0,fin:!0},f);this._extensions[Uf.extensionName]||(g.compress=!1),this._sender.send(u||l3,g,c)}terminate(){if(this.readyState!==mr.CLOSED){if(this.readyState===mr.CONNECTING){let u="WebSocket was closed before the connection was established";return Zl(this,this._req,u)}this._socket&&(this._readyState=mr.CLOSING,this._socket.destroy())}}};U6.forEach((i,u)=>{let f={enumerable:!0,value:u};Object.defineProperty(mr.prototype,i,f),Object.defineProperty(mr,i,f)});["binaryType","bufferedAmount","extensions","protocol","readyState","url"].forEach(i=>{Object.defineProperty(mr.prototype,i,{enumerable:!0})});["open","error","close","message"].forEach(i=>{Object.defineProperty(mr.prototype,`on${i}`,{configurable:!0,enumerable:!0,get(){let u=this.listeners(i);for(let f=0;f{Zl(i,j,"Opening handshake has timed out")}),j.on("error",$=>{j===null||j.aborted||(j=i._req=null,i._readyState=mr.CLOSING,i.emit("error",$),i.emitClose())}),j.on("response",$=>{let h=$.headers.location,re=$.statusCode;if(h&&g.followRedirects&&re>=300&&re<400){if(++i._redirects>g.maxRedirects){Zl(i,j,"Maximum redirects exceeded");return}j.abort();let ce=new s3(h,u);q6(i,ce,f,c)}else i.emit("unexpected-response",j,$)||Zl(i,j,`Unexpected server response: ${$.statusCode}`)}),j.on("upgrade",($,h,re)=>{if(i.emit("upgrade",$),i.readyState!==mr.CONNECTING)return;j=i._req=null;let ce=NB("sha1").update(D+UB).digest("base64");if($.headers["sec-websocket-accept"]!==ce){Zl(i,h,"Invalid Sec-WebSocket-Accept header");return}let Q=$.headers["sec-websocket-protocol"],oe=(f||"").split(/, */),Se;if(!f&&Q?Se="Server sent a subprotocol but none was requested":f&&!Q?Se="Server sent no subprotocol":Q&&!oe.includes(Q)&&(Se="Server sent an invalid subprotocol"),Se){Zl(i,h,Se);return}if(Q&&(i._protocol=Q),N)try{let me=bB($.headers["sec-websocket-extensions"]);me[Uf.extensionName]&&(N.accept(me[Uf.extensionName]),i._extensions[Uf.extensionName]=N)}catch(me){Zl(i,h,"Invalid Sec-WebSocket-Extensions header");return}i.setSocket(h,re,g.maxPayload)})}function ZB(i){return i.path=i.socketPath,N6.connect(i)}function ej(i){return i.path=void 0,!i.servername&&i.servername!==""&&(i.servername=N6.isIP(i.host)?"":i.host),LB.connect(i)}function Zl(i,u,f){i._readyState=mr.CLOSING;let c=new Error(f);Error.captureStackTrace(c,Zl),u.setHeader?(u.abort(),u.socket&&!u.socket.destroyed&&u.socket.destroy(),u.once("abort",i.emitClose.bind(i)),i.emit("error",c)):(u.destroy(c),u.once("error",i.emit.bind(i,"error")),u.once("close",i.emitClose.bind(i)))}function c3(i,u,f){if(u){let c=GB(u).length;i._socket?i._sender._bufferedBytes+=c:i._bufferedAmount+=c}if(f){let c=new Error(`WebSocket is not open: readyState ${i.readyState} (${U6[i.readyState]})`);f(c)}}function YB(i,u){let f=this[No];f._socket.removeListener("data",Wh),f._socket.resume(),f._closeFrameReceived=!0,f._closeMessage=u,f._closeCode=i,i===1005?f.close():f.close(i,u)}function $B(){this[No]._socket.resume()}function KB(i){let u=this[No];u._socket.removeListener("data",Wh),u._readyState=mr.CLOSING,u._closeCode=i[qB],u.emit("error",i),u._socket.destroy()}function b6(){this[No].emitClose()}function XB(i){this[No].emit("message",i)}function JB(i){let u=this[No];u.pong(i,!u._isServer,j6),u.emit("ping",i)}function QB(i){this[No].emit("pong",i)}function z6(){let i=this[No];this.removeListener("close",z6),this.removeListener("end",W6),i._readyState=mr.CLOSING,i._socket.read(),i._receiver.end(),this.removeListener("data",Wh),this[No]=void 0,clearTimeout(i._closeTimer),i._receiver._writableState.finished||i._receiver._writableState.errorEmitted?i.emitClose():(i._receiver.on("error",b6),i._receiver.on("finish",b6))}function Wh(i){this[No]._receiver.write(i)||this.pause()}function W6(){let i=this[No];i._readyState=mr.CLOSING,i._receiver.end(),this.end()}function H6(){let i=this[No];this.removeListener("error",H6),this.on("error",j6),i&&(i._readyState=mr.CLOSING,this.destroy())}});var $6=Me((Gb,G6)=>{"use strict";var{Duplex:tj}=require("stream");function V6(i){i.emit("close")}function nj(){!this.destroyed&&this._writableState.finished&&this.destroy()}function Y6(i){this.removeListener("error",Y6),this.destroy(),this.listenerCount("error")===0&&this.emit("error",i)}function rj(i,u){let f=!0;function c(){f&&i._socket.resume()}i.readyState===i.CONNECTING?i.once("open",function(){i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c)}):(i._receiver.removeAllListeners("drain"),i._receiver.on("drain",c));let g=new tj(zn(dt({},u),{autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1}));return i.on("message",function(C){g.push(C)||(f=!1,i._socket.pause())}),i.once("error",function(C){g.destroyed||g.destroy(C)}),i.once("close",function(){g.destroyed||g.push(null)}),g._destroy=function(t,C){if(i.readyState===i.CLOSED){C(t),process.nextTick(V6,g);return}let A=!1;i.once("error",function(D){A=!0,C(D)}),i.once("close",function(){A||C(t),process.nextTick(V6,g)}),i.terminate()},g._final=function(t){if(i.readyState===i.CONNECTING){i.once("open",function(){g._final(t)});return}i._socket!==null&&(i._socket._writableState.finished?(t(),g._readableState.endEmitted&&g.destroy()):(i._socket.once("finish",function(){t()}),i.close()))},g._read=function(){i.readyState===i.OPEN&&!f&&(f=!0,i._receiver._writableState.needDrain||i._socket.resume())},g._write=function(t,C,A){if(i.readyState===i.CONNECTING){i.once("open",function(){g._write(t,C,A)});return}i.send(t,A)},g.on("end",nj),g.on("error",Y6),g}G6.exports=rj});var J6=Me((Vb,K6)=>{"use strict";var ij=require("events"),{createHash:oj}=require("crypto"),{createServer:uj,STATUS_CODES:d3}=require("http"),gc=w2(),sj=a3(),{format:lj,parse:fj}=u3(),{GUID:cj,kWebSocket:aj}=mc(),dj=/^[+/0-9A-Za-z]{22}==$/,X6=class extends ij{constructor(u,f){super();if(u=dt({maxPayload:100*1024*1024,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null},u),u.port==null&&!u.server&&!u.noServer)throw new TypeError('One of the "port", "server", or "noServer" options must be specified');if(u.port!=null?(this._server=uj((c,g)=>{let t=d3[426];g.writeHead(426,{"Content-Length":t.length,"Content-Type":"text/plain"}),g.end(t)}),this._server.listen(u.port,u.host,u.backlog,f)):u.server&&(this._server=u.server),this._server){let c=this.emit.bind(this,"connection");this._removeListeners=pj(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(g,t,C)=>{this.handleUpgrade(g,t,C,c)}})}u.perMessageDeflate===!0&&(u.perMessageDeflate={}),u.clientTracking&&(this.clients=new Set),this.options=u}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(u){if(u&&this.once("close",u),this.clients)for(let c of this.clients)c.terminate();let f=this._server;if(f&&(this._removeListeners(),this._removeListeners=this._server=null,this.options.port!=null)){f.close(()=>this.emit("close"));return}process.nextTick(hj,this)}shouldHandle(u){if(this.options.path){let f=u.url.indexOf("?");if((f!==-1?u.url.slice(0,f):u.url)!==this.options.path)return!1}return!0}handleUpgrade(u,f,c,g){f.on("error",p3);let t=u.headers["sec-websocket-key"]!==void 0?u.headers["sec-websocket-key"].trim():!1,C=+u.headers["sec-websocket-version"],A={};if(u.method!=="GET"||u.headers.upgrade.toLowerCase()!=="websocket"||!t||!dj.test(t)||C!==8&&C!==13||!this.shouldHandle(u))return Hh(f,400);if(this.options.perMessageDeflate){let x=new gc(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let D=fj(u.headers["sec-websocket-extensions"]);D[gc.extensionName]&&(x.accept(D[gc.extensionName]),A[gc.extensionName]=x)}catch(D){return Hh(f,400)}}if(this.options.verifyClient){let x={origin:u.headers[`${C===8?"sec-websocket-origin":"origin"}`],secure:!!(u.socket.authorized||u.socket.encrypted),req:u};if(this.options.verifyClient.length===2){this.options.verifyClient(x,(D,L,N,j)=>{if(!D)return Hh(f,L||401,N,j);this.completeUpgrade(t,A,u,f,c,g)});return}if(!this.options.verifyClient(x))return Hh(f,401)}this.completeUpgrade(t,A,u,f,c,g)}completeUpgrade(u,f,c,g,t,C){if(!g.readable||!g.writable)return g.destroy();if(g[aj])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");let A=oj("sha1").update(u+cj).digest("base64"),x=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${A}`],D=new sj(null),L=c.headers["sec-websocket-protocol"];if(L&&(L=L.split(",").map(mj),this.options.handleProtocols?L=this.options.handleProtocols(L,c):L=L[0],L&&(x.push(`Sec-WebSocket-Protocol: ${L}`),D._protocol=L)),f[gc.extensionName]){let N=f[gc.extensionName].params,j=lj({[gc.extensionName]:[N]});x.push(`Sec-WebSocket-Extensions: ${j}`),D._extensions=f}this.emit("headers",x,c),g.write(x.concat(`\r -`).join(`\r -`)),g.removeListener("error",p3),D.setSocket(g,t,this.options.maxPayload),this.clients&&(this.clients.add(D),D.on("close",()=>this.clients.delete(D))),C(D,c)}};K6.exports=X6;function pj(i,u){for(let f of Object.keys(u))i.on(f,u[f]);return function(){for(let c of Object.keys(u))i.removeListener(c,u[c])}}function hj(i){i.emit("close")}function p3(){this.destroy()}function Hh(i,u,f,c){i.writable&&(f=f||d3[u],c=dt({Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(f)},c),i.write(`HTTP/1.1 ${u} ${d3[u]}\r -`+Object.keys(c).map(g=>`${g}: ${c[g]}`).join(`\r -`)+`\r -\r -`+f)),i.removeListener("error",p3),i.destroy()}function mj(i){return i.trim()}});var Z6=Me((Yb,Q6)=>{"use strict";var C2=a3();C2.createWebSocketStream=$6();C2.Server=J6();C2.Receiver=i3();C2.Sender=o3();Q6.exports=C2});var eS=Me(bh=>{"use strict";var vj=bh&&bh.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(bh,"__esModule",{value:!0});var gj=vj(Z6()),T2=global;T2.WebSocket||(T2.WebSocket=gj.default);T2.window||(T2.window=global);T2.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}]});var tS=Me((Gh,h3)=>{(function(i,u){typeof Gh=="object"&&typeof h3=="object"?h3.exports=u():typeof define=="function"&&define.amd?define([],u):typeof Gh=="object"?Gh.ReactDevToolsBackend=u():i.ReactDevToolsBackend=u()})(window,function(){return function(i){var u={};function f(c){if(u[c])return u[c].exports;var g=u[c]={i:c,l:!1,exports:{}};return i[c].call(g.exports,g,g.exports,f),g.l=!0,g.exports}return f.m=i,f.c=u,f.d=function(c,g,t){f.o(c,g)||Object.defineProperty(c,g,{enumerable:!0,get:t})},f.r=function(c){typeof Symbol!="undefined"&&Symbol.toStringTag&&Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(c,"__esModule",{value:!0})},f.t=function(c,g){if(1&g&&(c=f(c)),8&g||4&g&&typeof c=="object"&&c&&c.__esModule)return c;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:c}),2&g&&typeof c!="string")for(var C in c)f.d(t,C,function(A){return c[A]}.bind(null,C));return t},f.n=function(c){var g=c&&c.__esModule?function(){return c.default}:function(){return c};return f.d(g,"a",g),g},f.o=function(c,g){return Object.prototype.hasOwnProperty.call(c,g)},f.p="",f(f.s=20)}([function(i,u,f){"use strict";i.exports=f(12)},function(i,u,f){"use strict";var c=Object.getOwnPropertySymbols,g=Object.prototype.hasOwnProperty,t=Object.prototype.propertyIsEnumerable;function C(A){if(A==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(A)}i.exports=function(){try{if(!Object.assign)return!1;var A=new String("abc");if(A[5]="de",Object.getOwnPropertyNames(A)[0]==="5")return!1;for(var x={},D=0;D<10;D++)x["_"+String.fromCharCode(D)]=D;if(Object.getOwnPropertyNames(x).map(function(N){return x[N]}).join("")!=="0123456789")return!1;var L={};return"abcdefghijklmnopqrst".split("").forEach(function(N){L[N]=N}),Object.keys(Object.assign({},L)).join("")==="abcdefghijklmnopqrst"}catch(N){return!1}}()?Object.assign:function(A,x){for(var D,L,N=C(A),j=1;j=J||Ft<0||Nt&&it-At>=ot}function Z(){var it=ce();if(ge(it))return Ae(it);Ue=setTimeout(Z,function(Ft){var jt=J-(Ft-be);return Nt?re(jt,ot-(Ft-At)):jt}(it))}function Ae(it){return Ue=void 0,Je&&Oe?V(it):(Oe=Le=void 0,ct)}function at(){var it=ce(),Ft=ge(it);if(Oe=arguments,Le=this,be=it,Ft){if(Ue===void 0)return ne(be);if(Nt)return Ue=setTimeout(Z,J),V(be)}return Ue===void 0&&(Ue=setTimeout(Z,J)),ct}return J=me(J)||0,oe(Te)&&(Ot=!!Te.leading,ot=(Nt="maxWait"in Te)?h(me(Te.maxWait)||0,J):ot,Je="trailing"in Te?!!Te.trailing:Je),at.cancel=function(){Ue!==void 0&&clearTimeout(Ue),At=0,Oe=be=Le=Ue=void 0},at.flush=function(){return Ue===void 0?ct:Ae(ce())},at}function oe(De){var J=g(De);return!!De&&(J=="object"||J=="function")}function Se(De){return g(De)=="symbol"||function(J){return!!J&&g(J)=="object"}(De)&&$.call(De)=="[object Symbol]"}function me(De){if(typeof De=="number")return De;if(Se(De))return NaN;if(oe(De)){var J=typeof De.valueOf=="function"?De.valueOf():De;De=oe(J)?J+"":J}if(typeof De!="string")return De===0?De:+De;De=De.replace(t,"");var Te=A.test(De);return Te||x.test(De)?D(De.slice(2),Te?2:8):C.test(De)?NaN:+De}i.exports=function(De,J,Te){var Oe=!0,Le=!0;if(typeof De!="function")throw new TypeError("Expected a function");return oe(Te)&&(Oe="leading"in Te?!!Te.leading:Oe,Le="trailing"in Te?!!Te.trailing:Le),Q(De,J,{leading:Oe,maxWait:J,trailing:Le})}}).call(this,f(4))},function(i,u,f){(function(c){function g(V){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(ne){return typeof ne}:function(ne){return ne&&typeof Symbol=="function"&&ne.constructor===Symbol&&ne!==Symbol.prototype?"symbol":typeof ne})(V)}var t;u=i.exports=h,t=(c===void 0?"undefined":g(c))==="object"&&c.env&&c.env.NODE_DEBUG&&/\bsemver\b/i.test(c.env.NODE_DEBUG)?function(){var V=Array.prototype.slice.call(arguments,0);V.unshift("SEMVER"),console.log.apply(console,V)}:function(){},u.SEMVER_SPEC_VERSION="2.0.0";var C=Number.MAX_SAFE_INTEGER||9007199254740991,A=u.re=[],x=u.src=[],D=u.tokens={},L=0;function N(V){D[V]=L++}N("NUMERICIDENTIFIER"),x[D.NUMERICIDENTIFIER]="0|[1-9]\\d*",N("NUMERICIDENTIFIERLOOSE"),x[D.NUMERICIDENTIFIERLOOSE]="[0-9]+",N("NONNUMERICIDENTIFIER"),x[D.NONNUMERICIDENTIFIER]="\\d*[a-zA-Z-][a-zA-Z0-9-]*",N("MAINVERSION"),x[D.MAINVERSION]="("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")\\.("+x[D.NUMERICIDENTIFIER]+")",N("MAINVERSIONLOOSE"),x[D.MAINVERSIONLOOSE]="("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")\\.("+x[D.NUMERICIDENTIFIERLOOSE]+")",N("PRERELEASEIDENTIFIER"),x[D.PRERELEASEIDENTIFIER]="(?:"+x[D.NUMERICIDENTIFIER]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASEIDENTIFIERLOOSE"),x[D.PRERELEASEIDENTIFIERLOOSE]="(?:"+x[D.NUMERICIDENTIFIERLOOSE]+"|"+x[D.NONNUMERICIDENTIFIER]+")",N("PRERELEASE"),x[D.PRERELEASE]="(?:-("+x[D.PRERELEASEIDENTIFIER]+"(?:\\."+x[D.PRERELEASEIDENTIFIER]+")*))",N("PRERELEASELOOSE"),x[D.PRERELEASELOOSE]="(?:-?("+x[D.PRERELEASEIDENTIFIERLOOSE]+"(?:\\."+x[D.PRERELEASEIDENTIFIERLOOSE]+")*))",N("BUILDIDENTIFIER"),x[D.BUILDIDENTIFIER]="[0-9A-Za-z-]+",N("BUILD"),x[D.BUILD]="(?:\\+("+x[D.BUILDIDENTIFIER]+"(?:\\."+x[D.BUILDIDENTIFIER]+")*))",N("FULL"),N("FULLPLAIN"),x[D.FULLPLAIN]="v?"+x[D.MAINVERSION]+x[D.PRERELEASE]+"?"+x[D.BUILD]+"?",x[D.FULL]="^"+x[D.FULLPLAIN]+"$",N("LOOSEPLAIN"),x[D.LOOSEPLAIN]="[v=\\s]*"+x[D.MAINVERSIONLOOSE]+x[D.PRERELEASELOOSE]+"?"+x[D.BUILD]+"?",N("LOOSE"),x[D.LOOSE]="^"+x[D.LOOSEPLAIN]+"$",N("GTLT"),x[D.GTLT]="((?:<|>)?=?)",N("XRANGEIDENTIFIERLOOSE"),x[D.XRANGEIDENTIFIERLOOSE]=x[D.NUMERICIDENTIFIERLOOSE]+"|x|X|\\*",N("XRANGEIDENTIFIER"),x[D.XRANGEIDENTIFIER]=x[D.NUMERICIDENTIFIER]+"|x|X|\\*",N("XRANGEPLAIN"),x[D.XRANGEPLAIN]="[v=\\s]*("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:\\.("+x[D.XRANGEIDENTIFIER]+")(?:"+x[D.PRERELEASE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGEPLAINLOOSE"),x[D.XRANGEPLAINLOOSE]="[v=\\s]*("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:\\.("+x[D.XRANGEIDENTIFIERLOOSE]+")(?:"+x[D.PRERELEASELOOSE]+")?"+x[D.BUILD]+"?)?)?",N("XRANGE"),x[D.XRANGE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAIN]+"$",N("XRANGELOOSE"),x[D.XRANGELOOSE]="^"+x[D.GTLT]+"\\s*"+x[D.XRANGEPLAINLOOSE]+"$",N("COERCE"),x[D.COERCE]="(^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])",N("COERCERTL"),A[D.COERCERTL]=new RegExp(x[D.COERCE],"g"),N("LONETILDE"),x[D.LONETILDE]="(?:~>?)",N("TILDETRIM"),x[D.TILDETRIM]="(\\s*)"+x[D.LONETILDE]+"\\s+",A[D.TILDETRIM]=new RegExp(x[D.TILDETRIM],"g"),N("TILDE"),x[D.TILDE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAIN]+"$",N("TILDELOOSE"),x[D.TILDELOOSE]="^"+x[D.LONETILDE]+x[D.XRANGEPLAINLOOSE]+"$",N("LONECARET"),x[D.LONECARET]="(?:\\^)",N("CARETTRIM"),x[D.CARETTRIM]="(\\s*)"+x[D.LONECARET]+"\\s+",A[D.CARETTRIM]=new RegExp(x[D.CARETTRIM],"g"),N("CARET"),x[D.CARET]="^"+x[D.LONECARET]+x[D.XRANGEPLAIN]+"$",N("CARETLOOSE"),x[D.CARETLOOSE]="^"+x[D.LONECARET]+x[D.XRANGEPLAINLOOSE]+"$",N("COMPARATORLOOSE"),x[D.COMPARATORLOOSE]="^"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+")$|^$",N("COMPARATOR"),x[D.COMPARATOR]="^"+x[D.GTLT]+"\\s*("+x[D.FULLPLAIN]+")$|^$",N("COMPARATORTRIM"),x[D.COMPARATORTRIM]="(\\s*)"+x[D.GTLT]+"\\s*("+x[D.LOOSEPLAIN]+"|"+x[D.XRANGEPLAIN]+")",A[D.COMPARATORTRIM]=new RegExp(x[D.COMPARATORTRIM],"g"),N("HYPHENRANGE"),x[D.HYPHENRANGE]="^\\s*("+x[D.XRANGEPLAIN]+")\\s+-\\s+("+x[D.XRANGEPLAIN]+")\\s*$",N("HYPHENRANGELOOSE"),x[D.HYPHENRANGELOOSE]="^\\s*("+x[D.XRANGEPLAINLOOSE]+")\\s+-\\s+("+x[D.XRANGEPLAINLOOSE]+")\\s*$",N("STAR"),x[D.STAR]="(<|>)?=?\\s*\\*";for(var j=0;j256||!(ne.loose?A[D.LOOSE]:A[D.FULL]).test(V))return null;try{return new h(V,ne)}catch(ge){return null}}function h(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof h){if(V.loose===ne.loose)return V;V=V.version}else if(typeof V!="string")throw new TypeError("Invalid Version: "+V);if(V.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof h))return new h(V,ne);t("SemVer",V,ne),this.options=ne,this.loose=!!ne.loose;var ge=V.trim().match(ne.loose?A[D.LOOSE]:A[D.FULL]);if(!ge)throw new TypeError("Invalid Version: "+V);if(this.raw=V,this.major=+ge[1],this.minor=+ge[2],this.patch=+ge[3],this.major>C||this.major<0)throw new TypeError("Invalid major version");if(this.minor>C||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>C||this.patch<0)throw new TypeError("Invalid patch version");ge[4]?this.prerelease=ge[4].split(".").map(function(Z){if(/^[0-9]+$/.test(Z)){var Ae=+Z;if(Ae>=0&&Ae=0;)typeof this.prerelease[ge]=="number"&&(this.prerelease[ge]++,ge=-2);ge===-1&&this.prerelease.push(0)}ne&&(this.prerelease[0]===ne?isNaN(this.prerelease[1])&&(this.prerelease=[ne,0]):this.prerelease=[ne,0]);break;default:throw new Error("invalid increment argument: "+V)}return this.format(),this.raw=this.version,this},u.inc=function(V,ne,ge,Z){typeof ge=="string"&&(Z=ge,ge=void 0);try{return new h(V,ge).inc(ne,Z).version}catch(Ae){return null}},u.diff=function(V,ne){if(me(V,ne))return null;var ge=$(V),Z=$(ne),Ae="";if(ge.prerelease.length||Z.prerelease.length){Ae="pre";var at="prerelease"}for(var it in ge)if((it==="major"||it==="minor"||it==="patch")&&ge[it]!==Z[it])return Ae+it;return at},u.compareIdentifiers=ce;var re=/^[0-9]+$/;function ce(V,ne){var ge=re.test(V),Z=re.test(ne);return ge&&Z&&(V=+V,ne=+ne),V===ne?0:ge&&!Z?-1:Z&&!ge?1:V0}function Se(V,ne,ge){return Q(V,ne,ge)<0}function me(V,ne,ge){return Q(V,ne,ge)===0}function De(V,ne,ge){return Q(V,ne,ge)!==0}function J(V,ne,ge){return Q(V,ne,ge)>=0}function Te(V,ne,ge){return Q(V,ne,ge)<=0}function Oe(V,ne,ge,Z){switch(ne){case"===":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V===ge;case"!==":return g(V)==="object"&&(V=V.version),g(ge)==="object"&&(ge=ge.version),V!==ge;case"":case"=":case"==":return me(V,ge,Z);case"!=":return De(V,ge,Z);case">":return oe(V,ge,Z);case">=":return J(V,ge,Z);case"<":return Se(V,ge,Z);case"<=":return Te(V,ge,Z);default:throw new TypeError("Invalid operator: "+ne)}}function Le(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof Le){if(V.loose===!!ne.loose)return V;V=V.value}if(!(this instanceof Le))return new Le(V,ne);t("comparator",V,ne),this.options=ne,this.loose=!!ne.loose,this.parse(V),this.semver===ot?this.value="":this.value=this.operator+this.semver.version,t("comp",this)}u.rcompareIdentifiers=function(V,ne){return ce(ne,V)},u.major=function(V,ne){return new h(V,ne).major},u.minor=function(V,ne){return new h(V,ne).minor},u.patch=function(V,ne){return new h(V,ne).patch},u.compare=Q,u.compareLoose=function(V,ne){return Q(V,ne,!0)},u.compareBuild=function(V,ne,ge){var Z=new h(V,ge),Ae=new h(ne,ge);return Z.compare(Ae)||Z.compareBuild(Ae)},u.rcompare=function(V,ne,ge){return Q(ne,V,ge)},u.sort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(ge,Z,ne)})},u.rsort=function(V,ne){return V.sort(function(ge,Z){return u.compareBuild(Z,ge,ne)})},u.gt=oe,u.lt=Se,u.eq=me,u.neq=De,u.gte=J,u.lte=Te,u.cmp=Oe,u.Comparator=Le;var ot={};function ct(V,ne){if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),V instanceof ct)return V.loose===!!ne.loose&&V.includePrerelease===!!ne.includePrerelease?V:new ct(V.raw,ne);if(V instanceof Le)return new ct(V.value,ne);if(!(this instanceof ct))return new ct(V,ne);if(this.options=ne,this.loose=!!ne.loose,this.includePrerelease=!!ne.includePrerelease,this.raw=V,this.set=V.split(/\s*\|\|\s*/).map(function(ge){return this.parseRange(ge.trim())},this).filter(function(ge){return ge.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+V);this.format()}function Ue(V,ne){for(var ge=!0,Z=V.slice(),Ae=Z.pop();ge&&Z.length;)ge=Z.every(function(at){return Ae.intersects(at,ne)}),Ae=Z.pop();return ge}function be(V){return!V||V.toLowerCase()==="x"||V==="*"}function At(V,ne,ge,Z,Ae,at,it,Ft,jt,hn,Un,Jt,Yt){return((ne=be(ge)?"":be(Z)?">="+ge+".0.0":be(Ae)?">="+ge+"."+Z+".0":">="+ne)+" "+(Ft=be(jt)?"":be(hn)?"<"+(+jt+1)+".0.0":be(Un)?"<"+jt+"."+(+hn+1)+".0":Jt?"<="+jt+"."+hn+"."+Un+"-"+Jt:"<="+Ft)).trim()}function Ot(V,ne,ge){for(var Z=0;Z0){var Ae=V[Z].semver;if(Ae.major===ne.major&&Ae.minor===ne.minor&&Ae.patch===ne.patch)return!0}return!1}return!0}function Nt(V,ne,ge){try{ne=new ct(ne,ge)}catch(Z){return!1}return ne.test(V)}function Je(V,ne,ge,Z){var Ae,at,it,Ft,jt;switch(V=new h(V,Z),ne=new ct(ne,Z),ge){case">":Ae=oe,at=Te,it=Se,Ft=">",jt=">=";break;case"<":Ae=Se,at=J,it=oe,Ft="<",jt="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(Nt(V,ne,Z))return!1;for(var hn=0;hn=0.0.0")),Jt=Jt||cr,Yt=Yt||cr,Ae(cr.semver,Jt.semver,Z)?Jt=cr:it(cr.semver,Yt.semver,Z)&&(Yt=cr)}),Jt.operator===Ft||Jt.operator===jt||(!Yt.operator||Yt.operator===Ft)&&at(V,Yt.semver)||Yt.operator===jt&&it(V,Yt.semver))return!1}return!0}Le.prototype.parse=function(V){var ne=this.options.loose?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],ge=V.match(ne);if(!ge)throw new TypeError("Invalid comparator: "+V);this.operator=ge[1]!==void 0?ge[1]:"",this.operator==="="&&(this.operator=""),ge[2]?this.semver=new h(ge[2],this.options.loose):this.semver=ot},Le.prototype.toString=function(){return this.value},Le.prototype.test=function(V){if(t("Comparator.test",V,this.options.loose),this.semver===ot||V===ot)return!0;if(typeof V=="string")try{V=new h(V,this.options)}catch(ne){return!1}return Oe(V,this.operator,this.semver,this.options)},Le.prototype.intersects=function(V,ne){if(!(V instanceof Le))throw new TypeError("a Comparator is required");var ge;if(ne&&g(ne)==="object"||(ne={loose:!!ne,includePrerelease:!1}),this.operator==="")return this.value===""||(ge=new ct(V.value,ne),Nt(this.value,ge,ne));if(V.operator==="")return V.value===""||(ge=new ct(this.value,ne),Nt(V.semver,ge,ne));var Z=!(this.operator!==">="&&this.operator!==">"||V.operator!==">="&&V.operator!==">"),Ae=!(this.operator!=="<="&&this.operator!=="<"||V.operator!=="<="&&V.operator!=="<"),at=this.semver.version===V.semver.version,it=!(this.operator!==">="&&this.operator!=="<="||V.operator!==">="&&V.operator!=="<="),Ft=Oe(this.semver,"<",V.semver,ne)&&(this.operator===">="||this.operator===">")&&(V.operator==="<="||V.operator==="<"),jt=Oe(this.semver,">",V.semver,ne)&&(this.operator==="<="||this.operator==="<")&&(V.operator===">="||V.operator===">");return Z||Ae||at&&it||Ft||jt},u.Range=ct,ct.prototype.format=function(){return this.range=this.set.map(function(V){return V.join(" ").trim()}).join("||").trim(),this.range},ct.prototype.toString=function(){return this.range},ct.prototype.parseRange=function(V){var ne=this.options.loose;V=V.trim();var ge=ne?A[D.HYPHENRANGELOOSE]:A[D.HYPHENRANGE];V=V.replace(ge,At),t("hyphen replace",V),V=V.replace(A[D.COMPARATORTRIM],"$1$2$3"),t("comparator trim",V,A[D.COMPARATORTRIM]),V=(V=(V=V.replace(A[D.TILDETRIM],"$1~")).replace(A[D.CARETTRIM],"$1^")).split(/\s+/).join(" ");var Z=ne?A[D.COMPARATORLOOSE]:A[D.COMPARATOR],Ae=V.split(" ").map(function(at){return function(it,Ft){return t("comp",it,Ft),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){t("caret",Jt,Yt);var cr=Yt.loose?A[D.CARETLOOSE]:A[D.CARET];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("caret",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=pt==="0"?">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+".0 <"+(+pt+1)+".0.0":Xn?(t("replaceCaret pr",Xn),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+(+pt+1)+".0.0"):(t("no pr"),vr=pt==="0"?Mn==="0"?">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+Mn+"."+(+Bn+1):">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0":">="+pt+"."+Mn+"."+Bn+" <"+(+pt+1)+".0.0"),t("caret return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("caret",it),it=function(jt,hn){return jt.trim().split(/\s+/).map(function(Un){return function(Jt,Yt){var cr=Yt.loose?A[D.TILDELOOSE]:A[D.TILDE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn){var vr;return t("tilde",Jt,w,pt,Mn,Bn,Xn),be(pt)?vr="":be(Mn)?vr=">="+pt+".0.0 <"+(+pt+1)+".0.0":be(Bn)?vr=">="+pt+"."+Mn+".0 <"+pt+"."+(+Mn+1)+".0":Xn?(t("replaceTilde pr",Xn),vr=">="+pt+"."+Mn+"."+Bn+"-"+Xn+" <"+pt+"."+(+Mn+1)+".0"):vr=">="+pt+"."+Mn+"."+Bn+" <"+pt+"."+(+Mn+1)+".0",t("tilde return",vr),vr})}(Un,hn)}).join(" ")}(it,Ft),t("tildes",it),it=function(jt,hn){return t("replaceXRanges",jt,hn),jt.split(/\s+/).map(function(Un){return function(Jt,Yt){Jt=Jt.trim();var cr=Yt.loose?A[D.XRANGELOOSE]:A[D.XRANGE];return Jt.replace(cr,function(w,pt,Mn,Bn,Xn,vr){t("xRange",Jt,w,pt,Mn,Bn,Xn,vr);var gr=be(Mn),r0=gr||be(Bn),Ci=r0||be(Xn),yo=Ci;return pt==="="&&yo&&(pt=""),vr=Yt.includePrerelease?"-0":"",gr?w=pt===">"||pt==="<"?"<0.0.0-0":"*":pt&&yo?(r0&&(Bn=0),Xn=0,pt===">"?(pt=">=",r0?(Mn=+Mn+1,Bn=0,Xn=0):(Bn=+Bn+1,Xn=0)):pt==="<="&&(pt="<",r0?Mn=+Mn+1:Bn=+Bn+1),w=pt+Mn+"."+Bn+"."+Xn+vr):r0?w=">="+Mn+".0.0"+vr+" <"+(+Mn+1)+".0.0"+vr:Ci&&(w=">="+Mn+"."+Bn+".0"+vr+" <"+Mn+"."+(+Bn+1)+".0"+vr),t("xRange return",w),w})}(Un,hn)}).join(" ")}(it,Ft),t("xrange",it),it=function(jt,hn){return t("replaceStars",jt,hn),jt.trim().replace(A[D.STAR],"")}(it,Ft),t("stars",it),it}(at,this.options)},this).join(" ").split(/\s+/);return this.options.loose&&(Ae=Ae.filter(function(at){return!!at.match(Z)})),Ae=Ae.map(function(at){return new Le(at,this.options)},this)},ct.prototype.intersects=function(V,ne){if(!(V instanceof ct))throw new TypeError("a Range is required");return this.set.some(function(ge){return Ue(ge,ne)&&V.set.some(function(Z){return Ue(Z,ne)&&ge.every(function(Ae){return Z.every(function(at){return Ae.intersects(at,ne)})})})})},u.toComparators=function(V,ne){return new ct(V,ne).set.map(function(ge){return ge.map(function(Z){return Z.value}).join(" ").trim().split(" ")})},ct.prototype.test=function(V){if(!V)return!1;if(typeof V=="string")try{V=new h(V,this.options)}catch(ge){return!1}for(var ne=0;ne":at.prerelease.length===0?at.patch++:at.prerelease.push(0),at.raw=at.format();case"":case">=":ge&&!oe(ge,at)||(ge=at);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+Ae.operator)}});return ge&&V.test(ge)?ge:null},u.validRange=function(V,ne){try{return new ct(V,ne).range||"*"}catch(ge){return null}},u.ltr=function(V,ne,ge){return Je(V,ne,"<",ge)},u.gtr=function(V,ne,ge){return Je(V,ne,">",ge)},u.outside=Je,u.prerelease=function(V,ne){var ge=$(V,ne);return ge&&ge.prerelease.length?ge.prerelease:null},u.intersects=function(V,ne,ge){return V=new ct(V,ge),ne=new ct(ne,ge),V.intersects(ne)},u.coerce=function(V,ne){if(V instanceof h)return V;if(typeof V=="number"&&(V=String(V)),typeof V!="string")return null;var ge=null;if((ne=ne||{}).rtl){for(var Z;(Z=A[D.COERCERTL].exec(V))&&(!ge||ge.index+ge[0].length!==V.length);)ge&&Z.index+Z[0].length===ge.index+ge[0].length||(ge=Z),A[D.COERCERTL].lastIndex=Z.index+Z[1].length+Z[2].length;A[D.COERCERTL].lastIndex=-1}else ge=V.match(A[D.COERCE]);return ge===null?null:$(ge[2]+"."+(ge[3]||"0")+"."+(ge[4]||"0"),ne)}}).call(this,f(5))},function(i,u){function f(g){return(f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(g)}var c;c=function(){return this}();try{c=c||new Function("return this")()}catch(g){(typeof window=="undefined"?"undefined":f(window))==="object"&&(c=window)}i.exports=c},function(i,u){var f,c,g=i.exports={};function t(){throw new Error("setTimeout has not been defined")}function C(){throw new Error("clearTimeout has not been defined")}function A(ce){if(f===setTimeout)return setTimeout(ce,0);if((f===t||!f)&&setTimeout)return f=setTimeout,setTimeout(ce,0);try{return f(ce,0)}catch(Q){try{return f.call(null,ce,0)}catch(oe){return f.call(this,ce,0)}}}(function(){try{f=typeof setTimeout=="function"?setTimeout:t}catch(ce){f=t}try{c=typeof clearTimeout=="function"?clearTimeout:C}catch(ce){c=C}})();var x,D=[],L=!1,N=-1;function j(){L&&x&&(L=!1,x.length?D=x.concat(D):N=-1,D.length&&$())}function $(){if(!L){var ce=A(j);L=!0;for(var Q=D.length;Q;){for(x=D,D=[];++N1)for(var oe=1;oethis[C])return De(this,this[h].get(Ue)),!1;var Je=this[h].get(Ue).value;return this[N]&&(this[j]||this[N](Ue,Je.value)),Je.now=Ot,Je.maxAge=At,Je.value=be,this[A]+=Nt-Je.length,Je.length=Nt,this.get(Ue),me(this),!0}var V=new J(Ue,be,Nt,Ot,At);return V.length>this[C]?(this[N]&&this[N](Ue,be),!1):(this[A]+=V.length,this[$].unshift(V),this[h].set(Ue,this[$].head),me(this),!0)}},{key:"has",value:function(Ue){if(!this[h].has(Ue))return!1;var be=this[h].get(Ue).value;return!Se(this,be)}},{key:"get",value:function(Ue){return oe(this,Ue,!0)}},{key:"peek",value:function(Ue){return oe(this,Ue,!1)}},{key:"pop",value:function(){var Ue=this[$].tail;return Ue?(De(this,Ue),Ue.value):null}},{key:"del",value:function(Ue){De(this,this[h].get(Ue))}},{key:"load",value:function(Ue){this.reset();for(var be=Date.now(),At=Ue.length-1;At>=0;At--){var Ot=Ue[At],Nt=Ot.e||0;if(Nt===0)this.set(Ot.k,Ot.v);else{var Je=Nt-be;Je>0&&this.set(Ot.k,Ot.v,Je)}}}},{key:"prune",value:function(){var Ue=this;this[h].forEach(function(be,At){return oe(Ue,At,!1)})}},{key:"max",set:function(Ue){if(typeof Ue!="number"||Ue<0)throw new TypeError("max must be a non-negative number");this[C]=Ue||1/0,me(this)},get:function(){return this[C]}},{key:"allowStale",set:function(Ue){this[D]=!!Ue},get:function(){return this[D]}},{key:"maxAge",set:function(Ue){if(typeof Ue!="number")throw new TypeError("maxAge must be a non-negative number");this[L]=Ue,me(this)},get:function(){return this[L]}},{key:"lengthCalculator",set:function(Ue){var be=this;typeof Ue!="function"&&(Ue=ce),Ue!==this[x]&&(this[x]=Ue,this[A]=0,this[$].forEach(function(At){At.length=be[x](At.value,At.key),be[A]+=At.length})),me(this)},get:function(){return this[x]}},{key:"length",get:function(){return this[A]}},{key:"itemCount",get:function(){return this[$].length}}])&&g(Le.prototype,ot),ct&&g(Le,ct),Oe}(),oe=function(Oe,Le,ot){var ct=Oe[h].get(Le);if(ct){var Ue=ct.value;if(Se(Oe,Ue)){if(De(Oe,ct),!Oe[D])return}else ot&&(Oe[re]&&(ct.value.now=Date.now()),Oe[$].unshiftNode(ct));return Ue.value}},Se=function(Oe,Le){if(!Le||!Le.maxAge&&!Oe[L])return!1;var ot=Date.now()-Le.now;return Le.maxAge?ot>Le.maxAge:Oe[L]&&ot>Oe[L]},me=function(Oe){if(Oe[A]>Oe[C])for(var Le=Oe[$].tail;Oe[A]>Oe[C]&&Le!==null;){var ot=Le.prev;De(Oe,Le),Le=ot}},De=function(Oe,Le){if(Le){var ot=Le.value;Oe[N]&&Oe[N](ot.key,ot.value),Oe[A]-=ot.length,Oe[h].delete(ot.key),Oe[$].removeNode(Le)}},J=function Oe(Le,ot,ct,Ue,be){c(this,Oe),this.key=Le,this.value=ot,this.length=ct,this.now=Ue,this.maxAge=be||0},Te=function(Oe,Le,ot,ct){var Ue=ot.value;Se(Oe,Ue)&&(De(Oe,ot),Oe[D]||(Ue=void 0)),Ue&&Le.call(ct,Ue.value,Ue.key,Oe)};i.exports=Q},function(i,u,f){(function(c){function g(t){return(g=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(C){return typeof C}:function(C){return C&&typeof Symbol=="function"&&C.constructor===Symbol&&C!==Symbol.prototype?"symbol":typeof C})(t)}i.exports=function(){if(typeof document=="undefined"||!document.addEventListener)return null;var t,C,A,x={};return x.copy=function(){var D=!1,L=null,N=!1;function j(){D=!1,L=null,N&&window.getSelection().removeAllRanges(),N=!1}return document.addEventListener("copy",function($){if(D){for(var h in L)$.clipboardData.setData(h,L[h]);$.preventDefault()}}),function($){return new Promise(function(h,re){D=!0,typeof $=="string"?L={"text/plain":$}:$ instanceof Node?L={"text/html":new XMLSerializer().serializeToString($)}:$ instanceof Object?L=$:re("Invalid data type. Must be string, DOM node, or an object mapping MIME types to strings."),function ce(Q){try{if(document.execCommand("copy"))j(),h();else{if(Q)throw j(),new Error("Unable to copy. Perhaps it's not available in your browser?");(function(){var oe=document.getSelection();if(!document.queryCommandEnabled("copy")&&oe.isCollapsed){var Se=document.createRange();Se.selectNodeContents(document.body),oe.removeAllRanges(),oe.addRange(Se),N=!0}})(),ce(!0)}}catch(oe){j(),re(oe)}}(!1)})}}(),x.paste=(A=!1,document.addEventListener("paste",function(D){if(A){A=!1,D.preventDefault();var L=t;t=null,L(D.clipboardData.getData(C))}}),function(D){return new Promise(function(L,N){A=!0,t=L,C=D||"text/plain";try{document.execCommand("paste")||(A=!1,N(new Error("Unable to paste. Pasting only works in Internet Explorer at the moment.")))}catch(j){A=!1,N(new Error(j))}})}),typeof ClipboardEvent=="undefined"&&window.clipboardData!==void 0&&window.clipboardData.setData!==void 0&&(function(D){function L(me,De){return function(){me.apply(De,arguments)}}function N(me){if(g(this)!="object")throw new TypeError("Promises must be constructed via new");if(typeof me!="function")throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],Q(me,L($,this),L(h,this))}function j(me){var De=this;return this._state===null?void this._deferreds.push(me):void oe(function(){var J=De._state?me.onFulfilled:me.onRejected;if(J!==null){var Te;try{Te=J(De._value)}catch(Oe){return void me.reject(Oe)}me.resolve(Te)}else(De._state?me.resolve:me.reject)(De._value)})}function $(me){try{if(me===this)throw new TypeError("A promise cannot be resolved with itself.");if(me&&(g(me)=="object"||typeof me=="function")){var De=me.then;if(typeof De=="function")return void Q(L(De,me),L($,this),L(h,this))}this._state=!0,this._value=me,re.call(this)}catch(J){h.call(this,J)}}function h(me){this._state=!1,this._value=me,re.call(this)}function re(){for(var me=0,De=this._deferreds.length;De>me;me++)j.call(this,this._deferreds[me]);this._deferreds=null}function ce(me,De,J,Te){this.onFulfilled=typeof me=="function"?me:null,this.onRejected=typeof De=="function"?De:null,this.resolve=J,this.reject=Te}function Q(me,De,J){var Te=!1;try{me(function(Oe){Te||(Te=!0,De(Oe))},function(Oe){Te||(Te=!0,J(Oe))})}catch(Oe){if(Te)return;Te=!0,J(Oe)}}var oe=N.immediateFn||typeof c=="function"&&c||function(me){setTimeout(me,1)},Se=Array.isArray||function(me){return Object.prototype.toString.call(me)==="[object Array]"};N.prototype.catch=function(me){return this.then(null,me)},N.prototype.then=function(me,De){var J=this;return new N(function(Te,Oe){j.call(J,new ce(me,De,Te,Oe))})},N.all=function(){var me=Array.prototype.slice.call(arguments.length===1&&Se(arguments[0])?arguments[0]:arguments);return new N(function(De,J){function Te(ot,ct){try{if(ct&&(g(ct)=="object"||typeof ct=="function")){var Ue=ct.then;if(typeof Ue=="function")return void Ue.call(ct,function(be){Te(ot,be)},J)}me[ot]=ct,--Oe==0&&De(me)}catch(be){J(be)}}if(me.length===0)return De([]);for(var Oe=me.length,Le=0;LeTe;Te++)me[Te].then(De,J)})},i.exports?i.exports=N:D.Promise||(D.Promise=N)}(this),x.copy=function(D){return new Promise(function(L,N){if(typeof D!="string"&&!("text/plain"in D))throw new Error("You must provide a text/plain type.");var j=typeof D=="string"?D:D["text/plain"];window.clipboardData.setData("Text",j)?L():N(new Error("Copying was rejected."))})},x.paste=function(){return new Promise(function(D,L){var N=window.clipboardData.getData("Text");N?D(N):L(new Error("Pasting was rejected."))})}),x}()}).call(this,f(13).setImmediate)},function(i,u,f){"use strict";i.exports=f(15)},function(i,u,f){"use strict";f.r(u),u.default=`:root { - /** - * IMPORTANT: When new theme variables are added below\u2013 also add them to SettingsContext updateThemeVariables() - */ - - /* Light theme */ - --light-color-attribute-name: #ef6632; - --light-color-attribute-name-not-editable: #23272f; - --light-color-attribute-name-inverted: rgba(255, 255, 255, 0.7); - --light-color-attribute-value: #1a1aa6; - --light-color-attribute-value-inverted: #ffffff; - --light-color-attribute-editable-value: #1a1aa6; - --light-color-background: #ffffff; - --light-color-background-hover: rgba(0, 136, 250, 0.1); - --light-color-background-inactive: #e5e5e5; - --light-color-background-invalid: #fff0f0; - --light-color-background-selected: #0088fa; - --light-color-button-background: #ffffff; - --light-color-button-background-focus: #ededed; - --light-color-button: #5f6673; - --light-color-button-disabled: #cfd1d5; - --light-color-button-active: #0088fa; - --light-color-button-focus: #23272f; - --light-color-button-hover: #23272f; - --light-color-border: #eeeeee; - --light-color-commit-did-not-render-fill: #cfd1d5; - --light-color-commit-did-not-render-fill-text: #000000; - --light-color-commit-did-not-render-pattern: #cfd1d5; - --light-color-commit-did-not-render-pattern-text: #333333; - --light-color-commit-gradient-0: #37afa9; - --light-color-commit-gradient-1: #63b19e; - --light-color-commit-gradient-2: #80b393; - --light-color-commit-gradient-3: #97b488; - --light-color-commit-gradient-4: #abb67d; - --light-color-commit-gradient-5: #beb771; - --light-color-commit-gradient-6: #cfb965; - --light-color-commit-gradient-7: #dfba57; - --light-color-commit-gradient-8: #efbb49; - --light-color-commit-gradient-9: #febc38; - --light-color-commit-gradient-text: #000000; - --light-color-component-name: #6a51b2; - --light-color-component-name-inverted: #ffffff; - --light-color-component-badge-background: rgba(0, 0, 0, 0.1); - --light-color-component-badge-background-inverted: rgba(255, 255, 255, 0.25); - --light-color-component-badge-count: #777d88; - --light-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --light-color-context-background: rgba(0,0,0,.9); - --light-color-context-background-hover: rgba(255, 255, 255, 0.1); - --light-color-context-background-selected: #178fb9; - --light-color-context-border: #3d424a; - --light-color-context-text: #ffffff; - --light-color-context-text-selected: #ffffff; - --light-color-dim: #777d88; - --light-color-dimmer: #cfd1d5; - --light-color-dimmest: #eff0f1; - --light-color-error-background: hsl(0, 100%, 97%); - --light-color-error-border: hsl(0, 100%, 92%); - --light-color-error-text: #ff0000; - --light-color-expand-collapse-toggle: #777d88; - --light-color-link: #0000ff; - --light-color-modal-background: rgba(255, 255, 255, 0.75); - --light-color-record-active: #fc3a4b; - --light-color-record-hover: #3578e5; - --light-color-record-inactive: #0088fa; - --light-color-scroll-thumb: #c2c2c2; - --light-color-scroll-track: #fafafa; - --light-color-search-match: yellow; - --light-color-search-match-current: #f7923b; - --light-color-selected-tree-highlight-active: rgba(0, 136, 250, 0.1); - --light-color-selected-tree-highlight-inactive: rgba(0, 0, 0, 0.05); - --light-color-shadow: rgba(0, 0, 0, 0.25); - --light-color-tab-selected-border: #0088fa; - --light-color-text: #000000; - --light-color-text-invalid: #ff0000; - --light-color-text-selected: #ffffff; - --light-color-toggle-background-invalid: #fc3a4b; - --light-color-toggle-background-on: #0088fa; - --light-color-toggle-background-off: #cfd1d5; - --light-color-toggle-text: #ffffff; - --light-color-tooltip-background: rgba(0, 0, 0, 0.9); - --light-color-tooltip-text: #ffffff; - - /* Dark theme */ - --dark-color-attribute-name: #9d87d2; - --dark-color-attribute-name-not-editable: #ededed; - --dark-color-attribute-name-inverted: #282828; - --dark-color-attribute-value: #cedae0; - --dark-color-attribute-value-inverted: #ffffff; - --dark-color-attribute-editable-value: yellow; - --dark-color-background: #282c34; - --dark-color-background-hover: rgba(255, 255, 255, 0.1); - --dark-color-background-inactive: #3d424a; - --dark-color-background-invalid: #5c0000; - --dark-color-background-selected: #178fb9; - --dark-color-button-background: #282c34; - --dark-color-button-background-focus: #3d424a; - --dark-color-button: #afb3b9; - --dark-color-button-active: #61dafb; - --dark-color-button-disabled: #4f5766; - --dark-color-button-focus: #a2e9fc; - --dark-color-button-hover: #ededed; - --dark-color-border: #3d424a; - --dark-color-commit-did-not-render-fill: #777d88; - --dark-color-commit-did-not-render-fill-text: #000000; - --dark-color-commit-did-not-render-pattern: #666c77; - --dark-color-commit-did-not-render-pattern-text: #ffffff; - --dark-color-commit-gradient-0: #37afa9; - --dark-color-commit-gradient-1: #63b19e; - --dark-color-commit-gradient-2: #80b393; - --dark-color-commit-gradient-3: #97b488; - --dark-color-commit-gradient-4: #abb67d; - --dark-color-commit-gradient-5: #beb771; - --dark-color-commit-gradient-6: #cfb965; - --dark-color-commit-gradient-7: #dfba57; - --dark-color-commit-gradient-8: #efbb49; - --dark-color-commit-gradient-9: #febc38; - --dark-color-commit-gradient-text: #000000; - --dark-color-component-name: #61dafb; - --dark-color-component-name-inverted: #282828; - --dark-color-component-badge-background: rgba(255, 255, 255, 0.25); - --dark-color-component-badge-background-inverted: rgba(0, 0, 0, 0.25); - --dark-color-component-badge-count: #8f949d; - --dark-color-component-badge-count-inverted: rgba(255, 255, 255, 0.7); - --dark-color-context-background: rgba(255,255,255,.9); - --dark-color-context-background-hover: rgba(0, 136, 250, 0.1); - --dark-color-context-background-selected: #0088fa; - --dark-color-context-border: #eeeeee; - --dark-color-context-text: #000000; - --dark-color-context-text-selected: #ffffff; - --dark-color-dim: #8f949d; - --dark-color-dimmer: #777d88; - --dark-color-dimmest: #4f5766; - --dark-color-error-background: #200; - --dark-color-error-border: #900; - --dark-color-error-text: #f55; - --dark-color-expand-collapse-toggle: #8f949d; - --dark-color-link: #61dafb; - --dark-color-modal-background: rgba(0, 0, 0, 0.75); - --dark-color-record-active: #fc3a4b; - --dark-color-record-hover: #a2e9fc; - --dark-color-record-inactive: #61dafb; - --dark-color-scroll-thumb: #afb3b9; - --dark-color-scroll-track: #313640; - --dark-color-search-match: yellow; - --dark-color-search-match-current: #f7923b; - --dark-color-selected-tree-highlight-active: rgba(23, 143, 185, 0.15); - --dark-color-selected-tree-highlight-inactive: rgba(255, 255, 255, 0.05); - --dark-color-shadow: rgba(0, 0, 0, 0.5); - --dark-color-tab-selected-border: #178fb9; - --dark-color-text: #ffffff; - --dark-color-text-invalid: #ff8080; - --dark-color-text-selected: #ffffff; - --dark-color-toggle-background-invalid: #fc3a4b; - --dark-color-toggle-background-on: #178fb9; - --dark-color-toggle-background-off: #777d88; - --dark-color-toggle-text: #ffffff; - --dark-color-tooltip-background: rgba(255, 255, 255, 0.9); - --dark-color-tooltip-text: #000000; - - /* Font smoothing */ - --light-font-smoothing: auto; - --dark-font-smoothing: antialiased; - --font-smoothing: auto; - - /* Compact density */ - --compact-font-size-monospace-small: 9px; - --compact-font-size-monospace-normal: 11px; - --compact-font-size-monospace-large: 15px; - --compact-font-size-sans-small: 10px; - --compact-font-size-sans-normal: 12px; - --compact-font-size-sans-large: 14px; - --compact-line-height-data: 18px; - --compact-root-font-size: 16px; - - /* Comfortable density */ - --comfortable-font-size-monospace-small: 10px; - --comfortable-font-size-monospace-normal: 13px; - --comfortable-font-size-monospace-large: 17px; - --comfortable-font-size-sans-small: 12px; - --comfortable-font-size-sans-normal: 14px; - --comfortable-font-size-sans-large: 16px; - --comfortable-line-height-data: 22px; - --comfortable-root-font-size: 20px; - - /* GitHub.com system fonts */ - --font-family-monospace: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, - Courier, monospace; - --font-family-sans: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, - Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol; - - /* Constant values shared between JS and CSS */ - --interaction-commit-size: 10px; - --interaction-label-width: 200px; -} -`},function(i,u,f){"use strict";function c(x){var D=this;if(D instanceof c||(D=new c),D.tail=null,D.head=null,D.length=0,x&&typeof x.forEach=="function")x.forEach(function(j){D.push(j)});else if(arguments.length>0)for(var L=0,N=arguments.length;L1)L=D;else{if(!this.head)throw new TypeError("Reduce of empty list with no initial value");N=this.head.next,L=this.head.value}for(var j=0;N!==null;j++)L=x(L,N.value,j),N=N.next;return L},c.prototype.reduceReverse=function(x,D){var L,N=this.tail;if(arguments.length>1)L=D;else{if(!this.tail)throw new TypeError("Reduce of empty list with no initial value");N=this.tail.prev,L=this.tail.value}for(var j=this.length-1;N!==null;j--)L=x(L,N.value,j),N=N.prev;return L},c.prototype.toArray=function(){for(var x=new Array(this.length),D=0,L=this.head;L!==null;D++)x[D]=L.value,L=L.next;return x},c.prototype.toArrayReverse=function(){for(var x=new Array(this.length),D=0,L=this.tail;L!==null;D++)x[D]=L.value,L=L.prev;return x},c.prototype.slice=function(x,D){(D=D||this.length)<0&&(D+=this.length),(x=x||0)<0&&(x+=this.length);var L=new c;if(Dthis.length&&(D=this.length);for(var N=0,j=this.head;j!==null&&Nthis.length&&(D=this.length);for(var N=this.length,j=this.tail;j!==null&&N>D;N--)j=j.prev;for(;j!==null&&N>x;N--,j=j.prev)L.push(j.value);return L},c.prototype.splice=function(x,D){x>this.length&&(x=this.length-1),x<0&&(x=this.length+x);for(var L=0,N=this.head;N!==null&&L=0&&(A._idleTimeoutId=setTimeout(function(){A._onTimeout&&A._onTimeout()},x))},f(14),u.setImmediate=typeof self!="undefined"&&self.setImmediate||c!==void 0&&c.setImmediate||this&&this.setImmediate,u.clearImmediate=typeof self!="undefined"&&self.clearImmediate||c!==void 0&&c.clearImmediate||this&&this.clearImmediate}).call(this,f(4))},function(i,u,f){(function(c,g){(function(t,C){"use strict";if(!t.setImmediate){var A,x,D,L,N,j=1,$={},h=!1,re=t.document,ce=Object.getPrototypeOf&&Object.getPrototypeOf(t);ce=ce&&ce.setTimeout?ce:t,{}.toString.call(t.process)==="[object process]"?A=function(Se){g.nextTick(function(){oe(Se)})}:function(){if(t.postMessage&&!t.importScripts){var Se=!0,me=t.onmessage;return t.onmessage=function(){Se=!1},t.postMessage("","*"),t.onmessage=me,Se}}()?(L="setImmediate$"+Math.random()+"$",N=function(Se){Se.source===t&&typeof Se.data=="string"&&Se.data.indexOf(L)===0&&oe(+Se.data.slice(L.length))},t.addEventListener?t.addEventListener("message",N,!1):t.attachEvent("onmessage",N),A=function(Se){t.postMessage(L+Se,"*")}):t.MessageChannel?((D=new MessageChannel).port1.onmessage=function(Se){oe(Se.data)},A=function(Se){D.port2.postMessage(Se)}):re&&"onreadystatechange"in re.createElement("script")?(x=re.documentElement,A=function(Se){var me=re.createElement("script");me.onreadystatechange=function(){oe(Se),me.onreadystatechange=null,x.removeChild(me),me=null},x.appendChild(me)}):A=function(Se){setTimeout(oe,0,Se)},ce.setImmediate=function(Se){typeof Se!="function"&&(Se=new Function(""+Se));for(var me=new Array(arguments.length-1),De=0;Dene;ne++)if((V=Q(Je,Ot,ne))!==-1){ce=ne,Ot=V;break e}Ot=-1}}e:{if(Je=Nt,(V=j().get(At.primitive))!==void 0){for(ne=0;neOt-Je?null:Nt.slice(Je,Ot-1))!==null){if(Ot=0,Le!==null){for(;OtOt;Le--)ot=Ue.pop()}for(Le=Nt.length-Ot-1;1<=Le;Le--)Ot=[],ot.push({id:null,isStateEditable:!1,name:Se(Nt[Le-1].functionName),value:void 0,subHooks:Ot}),Ue.push(ot),ot=Ot;Le=Nt}Ot=(Nt=At.primitive)==="Context"||Nt==="DebugValue"?null:ct++,ot.push({id:Ot,isStateEditable:Nt==="Reducer"||Nt==="State",name:Nt,value:At.value,subHooks:[]})}return function ge(Z,Ae){for(var at=[],it=0;it-1&&($=$.replace(/eval code/g,"eval").replace(/(\(eval at [^()]*)|(\),.*$)/g,""));var h=$.replace(/^\s+/,"").replace(/\(eval code/g,"("),re=h.match(/ (\((.+):(\d+):(\d+)\)$)/),ce=(h=re?h.replace(re[0],""):h).split(/\s+/).slice(1),Q=this.extractLocation(re?re[1]:ce.pop()),oe=ce.join(" ")||void 0,Se=["eval",""].indexOf(Q[0])>-1?void 0:Q[0];return new x({functionName:oe,fileName:Se,lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseFFOrSafari:function(j){return j.stack.split(` -`).filter(function($){return!$.match(N)},this).map(function($){if($.indexOf(" > eval")>-1&&($=$.replace(/ line (\d+)(?: > eval line \d+)* > eval:\d+:\d+/g,":$1")),$.indexOf("@")===-1&&$.indexOf(":")===-1)return new x({functionName:$});var h=/((.*".+"[^@]*)?[^@]*)(?:@)/,re=$.match(h),ce=re&&re[1]?re[1]:void 0,Q=this.extractLocation($.replace(h,""));return new x({functionName:ce,fileName:Q[0],lineNumber:Q[1],columnNumber:Q[2],source:$})},this)},parseOpera:function(j){return!j.stacktrace||j.message.indexOf(` -`)>-1&&j.message.split(` -`).length>j.stacktrace.split(` -`).length?this.parseOpera9(j):j.stack?this.parseOpera11(j):this.parseOpera10(j)},parseOpera9:function(j){for(var $=/Line (\d+).*script (?:in )?(\S+)/i,h=j.message.split(` -`),re=[],ce=2,Q=h.length;ce/,"$2").replace(/\([^)]*\)/g,"")||void 0;Q.match(/\(([^)]*)\)/)&&(h=Q.replace(/^[^(]+\(([^)]*)\)$/,"$1"));var Se=h===void 0||h==="[arguments not available]"?void 0:h.split(",");return new x({functionName:oe,args:Se,fileName:ce[0],lineNumber:ce[1],columnNumber:ce[2],source:$})},this)}}})=="function"?c.apply(u,g):c)===void 0||(i.exports=t)})()},function(i,u,f){var c,g,t;(function(C,A){"use strict";g=[],(t=typeof(c=function(){function x(oe){return oe.charAt(0).toUpperCase()+oe.substring(1)}function D(oe){return function(){return this[oe]}}var L=["isConstructor","isEval","isNative","isToplevel"],N=["columnNumber","lineNumber"],j=["fileName","functionName","source"],$=L.concat(N,j,["args"]);function h(oe){if(oe)for(var Se=0;Se<$.length;Se++)oe[$[Se]]!==void 0&&this["set"+x($[Se])](oe[$[Se]])}h.prototype={getArgs:function(){return this.args},setArgs:function(oe){if(Object.prototype.toString.call(oe)!=="[object Array]")throw new TypeError("Args must be an Array");this.args=oe},getEvalOrigin:function(){return this.evalOrigin},setEvalOrigin:function(oe){if(oe instanceof h)this.evalOrigin=oe;else{if(!(oe instanceof Object))throw new TypeError("Eval Origin must be an Object or StackFrame");this.evalOrigin=new h(oe)}},toString:function(){var oe=this.getFileName()||"",Se=this.getLineNumber()||"",me=this.getColumnNumber()||"",De=this.getFunctionName()||"";return this.getIsEval()?oe?"[eval] ("+oe+":"+Se+":"+me+")":"[eval]:"+Se+":"+me:De?De+" ("+oe+":"+Se+":"+me+")":oe+":"+Se+":"+me}},h.fromString=function(oe){var Se=oe.indexOf("("),me=oe.lastIndexOf(")"),De=oe.substring(0,Se),J=oe.substring(Se+1,me).split(","),Te=oe.substring(me+1);if(Te.indexOf("@")===0)var Oe=/@(.+?)(?::(\d+))?(?::(\d+))?$/.exec(Te,""),Le=Oe[1],ot=Oe[2],ct=Oe[3];return new h({functionName:De,args:J||void 0,fileName:Le,lineNumber:ot||void 0,columnNumber:ct||void 0})};for(var re=0;re1?de-1:0),ve=1;ve=0&&de.splice(W,1)}}}])&&c(R.prototype,U),H&&c(R,H),F}(),t=f(2),C=f.n(t);try{var A=f(9).default,x=function(F){var R=new RegExp("".concat(F,": ([0-9]+)")),U=A.match(R);return parseInt(U[1],10)};x("comfortable-line-height-data"),x("compact-line-height-data")}catch(F){}function D(F){try{return sessionStorage.getItem(F)}catch(R){return null}}function L(F){try{sessionStorage.removeItem(F)}catch(R){}}function N(F,R){try{return sessionStorage.setItem(F,R)}catch(U){}}var j=function(F,R){return F===R},$=f(1),h=f.n($);function re(F){return F.ownerDocument?F.ownerDocument.defaultView:null}function ce(F){var R=re(F);return R?R.frameElement:null}function Q(F){var R=me(F);return oe([F.getBoundingClientRect(),{top:R.borderTop,left:R.borderLeft,bottom:R.borderBottom,right:R.borderRight,width:0,height:0}])}function oe(F){return F.reduce(function(R,U){return R==null?U:{top:R.top+U.top,left:R.left+U.left,width:R.width,height:R.height,bottom:R.bottom+U.bottom,right:R.right+U.right}})}function Se(F,R){var U=ce(F);if(U&&U!==R){for(var H=[F.getBoundingClientRect()],fe=U,ue=!1;fe;){var de=Q(fe);if(H.push(de),fe=ce(fe),ue)break;fe&&re(fe)===R&&(ue=!0)}return oe(H)}return F.getBoundingClientRect()}function me(F){var R=window.getComputedStyle(F);return{borderLeft:parseInt(R.borderLeftWidth,10),borderRight:parseInt(R.borderRightWidth,10),borderTop:parseInt(R.borderTopWidth,10),borderBottom:parseInt(R.borderBottomWidth,10),marginLeft:parseInt(R.marginLeft,10),marginRight:parseInt(R.marginRight,10),marginTop:parseInt(R.marginTop,10),marginBottom:parseInt(R.marginBottom,10),paddingLeft:parseInt(R.paddingLeft,10),paddingRight:parseInt(R.paddingRight,10),paddingTop:parseInt(R.paddingTop,10),paddingBottom:parseInt(R.paddingBottom,10)}}function De(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return J(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return J(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function J(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);Ude.left+de.width&&(K=de.left+de.width-Ge-5),{style:{top:ve+="px",left:K+="px"}}}(R,U,{width:H.width,height:H.height});h()(this.tip.style,fe.style)}}]),F}(),Ue=function(){function F(){Te(this,F);var R=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.window=R;var U=window.__REACT_DEVTOOLS_TARGET_WINDOW__||window;this.tipBoundsWindow=U;var H=R.document;this.container=H.createElement("div"),this.container.style.zIndex="10000000",this.tip=new ct(H,this.container),this.rects=[],H.body.appendChild(this.container)}return Le(F,[{key:"remove",value:function(){this.tip.remove(),this.rects.forEach(function(R){R.remove()}),this.rects.length=0,this.container.parentNode&&this.container.parentNode.removeChild(this.container)}},{key:"inspect",value:function(R,U){for(var H=this,fe=R.filter(function(Xe){return Xe.nodeType===Node.ELEMENT_NODE});this.rects.length>fe.length;)this.rects.pop().remove();if(fe.length!==0){for(;this.rects.length1&&arguments[1]!==void 0?arguments[1]:j,je=void 0,Xe=[],rt=void 0,st=!1,xt=function(lt,Rt){return xe(lt,Xe[Rt])},wt=function(){for(var lt=arguments.length,Rt=Array(lt),yn=0;yn5&&arguments[5]!==void 0?arguments[5]:0,W=cl(F);switch(W){case"html_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.tagName,type:W};case"function":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:typeof F.name!="function"&&F.name?F.name:"function",type:W};case"string":return F.length<=500?F:F.slice(0,500)+"...";case"bigint":case"symbol":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"react_element":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:al(F)||"Unknown",type:W};case"array_buffer":case"data_view":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:W==="data_view"?"DataView":"ArrayBuffer",size:F.byteLength,type:W};case"array":return ue=fe(H),de>=2&&!ue?yo(W,!0,F,R,H):F.map(function(Ge,K){return Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)});case"html_all_collection":case"typed_array":case"iterator":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var ve={unserializable:!0,type:W,readonly:!0,size:W==="typed_array"?F.length:void 0,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.constructor&&F.constructor.name!=="Object"?F.constructor.name:""};return r0(F[Symbol.iterator])&&Array.from(F).forEach(function(Ge,K){return ve[K]=Ds(Ge,R,U,H.concat([K]),fe,ue?1:de+1)}),U.push(H),ve;case"opaque_iterator":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F[Symbol.toStringTag],type:W};case"date":case"regexp":return R.push(H),{inspectable:!1,preview_short:Mr(F,!1),preview_long:Mr(F,!0),name:F.toString(),type:W};case"object":if(ue=fe(H),de>=2&&!ue)return yo(W,!0,F,R,H);var Fe={};return Es(F).forEach(function(Ge){var K=Ge.toString();Fe[K]=Ds(F[Ge],R,U,H.concat([K]),fe,ue?1:de+1)}),Fe;case"infinity":case"nan":case"undefined":return R.push(H),{type:W};default:return F}}function Mu(F){return(Mu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Gf(F){return function(R){if(Array.isArray(R))return iu(R)}(F)||function(R){if(typeof Symbol!="undefined"&&Symbol.iterator in Object(R))return Array.from(R)}(F)||function(R,U){if(!!R){if(typeof R=="string")return iu(R,U);var H=Object.prototype.toString.call(R).slice(8,-1);if(H==="Object"&&R.constructor&&(H=R.constructor.name),H==="Map"||H==="Set")return Array.from(R);if(H==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(H))return iu(R,U)}}(F)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function iu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);UR.toString()?1:R.toString()>F.toString()?-1:0}function Es(F){for(var R=[],U=F,H=function(){var fe=[].concat(Gf(Object.keys(U)),Gf(Object.getOwnPropertySymbols(U))),ue=Object.getOwnPropertyDescriptors(U);fe.forEach(function(de){ue[de].enumerable&&R.push(de)}),U=Object.getPrototypeOf(U)};U!=null;)H();return R}function Uo(F){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Anonymous",U=ou.get(F);if(U!=null)return U;var H=R;return typeof F.displayName=="string"?H=F.displayName:typeof F.name=="string"&&F.name!==""&&(H=F.name),ou.set(F,H),H}var sl=0;function Ss(){return++sl}function Cs(F){var R=ol.get(F);if(R!==void 0)return R;for(var U=new Array(F.length),H=0;H1&&arguments[1]!==void 0?arguments[1]:50;return F.length>R?F.substr(0,R)+"\u2026":F}function Mr(F,R){if(F!=null&&hasOwnProperty.call(F,Ci.type))return R?F[Ci.preview_long]:F[Ci.preview_short];switch(cl(F)){case"html_element":return"<".concat(Ui(F.tagName.toLowerCase())," />");case"function":return Ui("\u0192 ".concat(typeof F.name=="function"?"":F.name,"() {}"));case"string":return'"'.concat(F,'"');case"bigint":return Ui(F.toString()+"n");case"regexp":case"symbol":return Ui(F.toString());case"react_element":return"<".concat(Ui(al(F)||"Unknown")," />");case"array_buffer":return"ArrayBuffer(".concat(F.byteLength,")");case"data_view":return"DataView(".concat(F.buffer.byteLength,")");case"array":if(R){for(var U="",H=0;H0&&(U+=", "),!((U+=Mr(F[H],!1)).length>50));H++);return"[".concat(Ui(U),"]")}var fe=hasOwnProperty.call(F,Ci.size)?F[Ci.size]:F.length;return"Array(".concat(fe,")");case"typed_array":var ue="".concat(F.constructor.name,"(").concat(F.length,")");if(R){for(var de="",W=0;W0&&(de+=", "),!((de+=F[W]).length>50));W++);return"".concat(ue," [").concat(Ui(de),"]")}return ue;case"iterator":var ve=F.constructor.name;if(R){for(var Fe=Array.from(F),Ge="",K=0;K0&&(Ge+=", "),Array.isArray(xe)){var je=Mr(xe[0],!0),Xe=Mr(xe[1],!1);Ge+="".concat(je," => ").concat(Xe)}else Ge+=Mr(xe,!1);if(Ge.length>50)break}return"".concat(ve,"(").concat(F.size,") {").concat(Ui(Ge),"}")}return"".concat(ve,"(").concat(F.size,")");case"opaque_iterator":return F[Symbol.toStringTag];case"date":return F.toString();case"object":if(R){for(var rt=Es(F).sort(ul),st="",xt=0;xt0&&(st+=", "),(st+="".concat(wt.toString(),": ").concat(Mr(F[wt],!1))).length>50)break}return"{".concat(Ui(st),"}")}return"{\u2026}";case"boolean":case"number":case"infinity":case"nan":case"null":case"undefined":return F;default:try{return Ui(""+F)}catch(lt){return"unserializable"}}}var Ac=f(7);function of(F){return(of=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Ts(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function xs(F){for(var R=1;R2&&arguments[2]!==void 0?arguments[2]:[];if(F!==null){var H=[],fe=[],ue=Ds(F,H,fe,U,R);return{data:ue,cleaned:H,unserializable:fe}}return null}function qo(F){var R,U,H=(R=F,U=new Set,JSON.stringify(R,function(de,W){if(of(W)==="object"&&W!==null){if(U.has(W))return;U.add(W)}return typeof W=="bigint"?W.toString()+"n":W})),fe=H===void 0?"undefined":H,ue=window.__REACT_DEVTOOLS_GLOBAL_HOOK__.clipboardCopyText;typeof ue=="function"?ue(fe).catch(function(de){}):Object(Ac.copy)(fe)}function kr(F,R){var U=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,H=R[U],fe=Array.isArray(F)?F.slice():xs({},F);return U+1===R.length?Array.isArray(fe)?fe.splice(H,1):delete fe[H]:fe[H]=kr(F[H],R,U+1),fe}function Fr(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);if(H+1===R.length){var de=U[H];ue[de]=ue[fe],Array.isArray(ue)?ue.splice(fe,1):delete ue[fe]}else ue[fe]=Fr(F[fe],R,U,H+1);return ue}function si(F,R,U){var H=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;if(H>=R.length)return U;var fe=R[H],ue=Array.isArray(F)?F.slice():xs({},F);return ue[fe]=si(F[fe],R,U,H+1),ue}var H0=f(8);function b0(F,R){var U=Object.keys(F);if(Object.getOwnPropertySymbols){var H=Object.getOwnPropertySymbols(F);R&&(H=H.filter(function(fe){return Object.getOwnPropertyDescriptor(F,fe).enumerable})),U.push.apply(U,H)}return U}function Bt(F){for(var R=1;R=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function As(F,R){if(F){if(typeof F=="string")return uu(F,R);var U=Object.prototype.toString.call(F).slice(8,-1);return U==="Object"&&F.constructor&&(U=F.constructor.name),U==="Map"||U==="Set"?Array.from(F):U==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(U)?uu(F,R):void 0}}function uu(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0){var et=ue(X);if(et!=null){var Dt,bt=ks(du);try{for(bt.s();!(Dt=bt.n()).done;)if(Dt.value.test(et))return!0}catch(fn){bt.e(fn)}finally{bt.f()}}}if(Y!=null&&Yu.size>0){var Zt,qt=Y.fileName,Ut=ks(Yu);try{for(Ut.s();!(Zt=Ut.n()).done;)if(Zt.value.test(qt))return!0}catch(fn){Ut.e(fn)}finally{Ut.f()}}return!1}function Gr(X){var Y=X.type;switch(X.tag){case Xe:case ar:return 1;case je:case rn:return 5;case wt:return 6;case lt:return 11;case yn:return 7;case Rt:case sn:case xt:return 9;case Hn:case Cr:return 8;case He:return 12;case Qe:return 13;default:switch(de(Y)){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 ir(X){if(Co.has(X))return X;var Y=X.alternate;return Y!=null&&Co.has(Y)?Y:(Co.add(X),X)}window.__REACT_DEVTOOLS_COMPONENT_FILTERS__!=null?qs(window.__REACT_DEVTOOLS_COMPONENT_FILTERS__):qs([{type:1,value:7,isEnabled:!0}]);var L0=new Map,Y0=new Map,Co=new Set,$u=new Map,Vo=new Map,Rr=-1;function Jn(X){if(!L0.has(X)){var Y=Ss();L0.set(X,Y),Y0.set(Y,X)}return L0.get(X)}function ai(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=Vr(X);ye!==null&&N0.set(Y,ye)}}}var o0={};function Vr(X){switch(Gr(X)){case 1:var Y=X.stateNode,ye=o0,he=o0;return Y!=null&&(Y.constructor&&Y.constructor.contextType!=null?he=Y.context:(ye=Y.context)&&Object.keys(ye).length===0&&(ye=o0)),[ye,he];default:return null}}function ff(X){switch(Gr(X)){case 1:if(N0!==null){var Y=Jn(ir(X)),ye=N0.has(Y)?N0.get(Y):null,he=Vr(X);if(ye==null||he==null)return null;var We=Ru(ye,2),et=We[0],Dt=We[1],bt=Ru(he,2),Zt=bt[0],qt=bt[1];if(Zt!==o0)return $0(et,Zt);if(qt!==o0)return Dt!==qt}}return null}function cf(X,Y){if(X==null||Y==null)return!1;if(Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))for(;Y!==null;){if(Y.memoizedState!==X.memoizedState)return!0;Y=Y.next,X=X.next}return!1}function $0(X,Y){if(X==null||Y==null||Y.hasOwnProperty("baseState")&&Y.hasOwnProperty("memoizedState")&&Y.hasOwnProperty("next")&&Y.hasOwnProperty("queue"))return null;var ye,he=[],We=ks(new Set([].concat(c0(Object.keys(X)),c0(Object.keys(Y)))));try{for(We.s();!(ye=We.n()).done;){var et=ye.value;X[et]!==Y[et]&&he.push(et)}}catch(Dt){We.e(Dt)}finally{We.f()}return he}function K0(X,Y){switch(Y.tag){case Xe:case je:case rt:case Hn:case Cr:return(zo(Y)&K)===K;default:return X.memoizedProps!==Y.memoizedProps||X.memoizedState!==Y.memoizedState||X.ref!==Y.ref}}var ae=[],Be=[],Ie=[],ht=[],mt=new Map,wn=0,Gn=null;function $t(X){ae.push(X)}function X0(X){if(ae.length!==0||Be.length!==0||Ie.length!==0||Gn!==null||u0){var Y=Be.length+Ie.length+(Gn===null?0:1),ye=new Array(3+wn+(Y>0?2+Y:0)+ae.length),he=0;if(ye[he++]=R,ye[he++]=Rr,ye[he++]=wn,mt.forEach(function(bt,Zt){ye[he++]=Zt.length;for(var qt=Cs(Zt),Ut=0;Ut0){ye[he++]=2,ye[he++]=Y;for(var We=Be.length-1;We>=0;We--)ye[he++]=Be[We];for(var et=0;et0?X.forEach(function(Y){F.emit("operations",Y)}):(Fn!==null&&(zr=!0),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),u0&&Y.memoizedInteractions!=null&&(uo={changeDescriptions:To?new Map:null,durations:[],commitTime:Os()-v0,interactions:Array.from(Y.memoizedInteractions).map(function(ye){return Bt(Bt({},ye),{},{timestamp:ye.timestamp-v0})}),maxActualDuration:0,priorityLevel:null}),$r(Y.current,null,!1,!1),X0(),Rr=-1}))},getBestMatchForTrackedPath:function(){if(Fn===null||pi===null)return null;for(var X=pi;X!==null&&F0(X);)X=X.return;return X===null?null:{id:Jn(ir(X)),isFullMatch:Br===Fn.length-1}},getDisplayNameForFiberID:function(X){var Y=Y0.get(X);return Y!=null?ue(Y):null},getFiberIDForNative:function(X){var Y=arguments.length>1&&arguments[1]!==void 0&&arguments[1],ye=U.findFiberByHostInstance(X);if(ye!=null){if(Y)for(;ye!==null&&F0(ye);)ye=ye.return;return Jn(ir(ye))}return null},getInstanceAndStyle:function(X){var Y=null,ye=null,he=J0(X);return he!==null&&(Y=he.stateNode,he.memoizedProps!==null&&(ye=he.memoizedProps.style)),{instance:Y,style:ye}},getOwnersList:function(X){var Y=J0(X);if(Y==null)return null;var ye=Y._debugOwner,he=[{displayName:ue(Y)||"Anonymous",id:X,type:Gr(Y)}];if(ye)for(var We=ye;We!==null;)he.unshift({displayName:ue(We)||"Anonymous",id:Jn(ir(We)),type:Gr(We)}),We=We._debugOwner||null;return he},getPathForElement:function(X){var Y=Y0.get(X);if(Y==null)return null;for(var ye=[];Y!==null;)ye.push(Ai(Y)),Y=Y.return;return ye.reverse(),ye},getProfilingData:function(){var X=[];if(pu===null)throw Error("getProfilingData() called before any profiling data was recorded");return pu.forEach(function(Y,ye){var he=[],We=[],et=new Map,Dt=new Map,bt=so!==null&&so.get(ye)||"Unknown";C0!=null&&C0.forEach(function(Zt,qt){di!=null&&di.get(qt)===ye&&We.push([qt,Zt])}),Y.forEach(function(Zt,qt){var Ut=Zt.changeDescriptions,fn=Zt.durations,_t=Zt.interactions,_r=Zt.maxActualDuration,Wr=Zt.priorityLevel,Ar=Zt.commitTime,z=[];_t.forEach(function(s0){et.has(s0.id)||et.set(s0.id,s0),z.push(s0.id);var t0=Dt.get(s0.id);t0!=null?t0.push(qt):Dt.set(s0.id,[qt])});for(var dr=[],Or=[],Qn=0;Qn1?kn.set(Ut,fn-1):kn.delete(Ut),wr.delete(Zt)}(Rr),Yr(ye,!1))}else T0(Rr,ye),$r(ye,null,!1,!1);if(u0&&We){var bt=pu.get(Rr);bt!=null?bt.push(uo):pu.set(Rr,[uo])}X0(),oo&&F.emit("traceUpdates",Hi),Rr=-1},handleCommitFiberUnmount:function(X){Yr(X,!1)},inspectElement:function(X,Y){if(Tr(X)){if(Y!=null){R0(Y);var ye=null;return Y[0]==="hooks"&&(ye="hooks"),{id:X,type:"hydrated-path",path:Y,value:qi(Ti(S0,Y),Nr(null,ye),Y)}}return{id:X,type:"no-change"}}if(El=!1,S0!==null&&S0.id===X||(Q0={}),(S0=af(X))===null)return{id:X,type:"not-found"};Y!=null&&R0(Y),function(We){var et=We.hooks,Dt=We.id,bt=We.props,Zt=Y0.get(Dt);if(Zt!=null){var qt=Zt.elementType,Ut=Zt.stateNode,fn=Zt.tag,_t=Zt.type;switch(fn){case Xe:case ar:case rn:H.$r=Ut;break;case je:H.$r={hooks:et,props:bt,type:_t};break;case wt:H.$r={props:bt,type:_t.render};break;case Hn:case Cr:H.$r={props:bt,type:qt!=null&&qt.type!=null?qt.type:_t};break;default:H.$r=null}}else console.warn('Could not find Fiber with id "'.concat(Dt,'"'))}(S0);var he=Bt({},S0);return he.context=qi(he.context,Nr("context",null)),he.hooks=qi(he.hooks,Nr("hooks","hooks")),he.props=qi(he.props,Nr("props",null)),he.state=qi(he.state,Nr("state",null)),{id:X,type:"full-data",value:he}},logElementToConsole:function(X){var Y=Tr(X)?S0:af(X);if(Y!==null){var ye=typeof console.groupCollapsed=="function";ye&&console.groupCollapsed("[Click to expand] %c<".concat(Y.displayName||"Component"," />"),"color: var(--dom-tag-name-color); font-weight: normal;"),Y.props!==null&&console.log("Props:",Y.props),Y.state!==null&&console.log("State:",Y.state),Y.hooks!==null&&console.log("Hooks:",Y.hooks);var he=zs(X);he!==null&&console.log("Nodes:",he),Y.source!==null&&console.log("Location:",Y.source),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),ye&&console.groupEnd()}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},prepareViewAttributeSource:function(X,Y){Tr(X)&&(window.$attribute=Ti(S0,Y))},prepareViewElementSource:function(X){var Y=Y0.get(X);if(Y!=null){var ye=Y.elementType,he=Y.tag,We=Y.type;switch(he){case Xe:case ar:case rn:case je:H.$type=We;break;case wt:H.$type=We.render;break;case Hn:case Cr:H.$type=ye!=null&&ye.type!=null?ye.type:We;break;default:H.$type=null}}else console.warn('Could not find Fiber with id "'.concat(X,'"'))},overrideSuspense:function(X,Y){if(typeof Eo!="function"||typeof So!="function")throw new Error("Expected overrideSuspense() to not get called for earlier React versions.");Y?(B0.add(X),B0.size===1&&Eo(hu)):(B0.delete(X),B0.size===0&&Eo(Cl));var ye=Y0.get(X);ye!=null&&So(ye)},overrideValueAtPath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),et.tag){case Xe:he.length===0?Dt.context=We:fl(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof p0=="function"&&p0(et,ye,he,We);break;case"props":switch(et.tag){case Xe:et.pendingProps=si(Dt.props,he,We),Dt.forceUpdate();break;default:typeof xi=="function"&&xi(et,he,We)}break;case"state":switch(et.tag){case Xe:fl(Dt.state,he,We),Dt.forceUpdate()}}}},renamePath:function(X,Y,ye,he,We){var et=J0(Y);if(et!==null){var Dt=et.stateNode;switch(X){case"context":switch(he=he.slice(1),We=We.slice(1),et.tag){case Xe:he.length===0||ll(Dt.context,he,We),Dt.forceUpdate()}break;case"hooks":typeof ci=="function"&&ci(et,ye,he,We);break;case"props":Dt===null?typeof qr=="function"&&qr(et,he,We):(et.pendingProps=Fr(Dt.props,he,We),Dt.forceUpdate());break;case"state":ll(Dt.state,he,We),Dt.forceUpdate()}}},renderer:U,setTraceUpdatesEnabled:function(X){oo=X},setTrackedPath:lo,startProfiling:Sl,stopProfiling:function(){u0=!1,To=!1},storeAsGlobal:function(X,Y,ye){if(Tr(X)){var he=Ti(S0,Y),We="$reactTemp".concat(ye);window[We]=he,console.log(We),console.log(he)}},updateComponentFilters:function(X){if(u0)throw Error("Cannot modify filter preferences while profiling");F.getFiberRoots(R).forEach(function(Y){Rr=Jn(ir(Y.current)),m0(Y.current),Yr(Y.current,!1),Rr=-1}),qs(X),kn.clear(),F.getFiberRoots(R).forEach(function(Y){T0(Rr=Jn(ir(Y.current)),Y.current),$r(Y.current,null,!1,!1),X0(Y),Rr=-1})}}}var _n;function Nu(F){return(Nu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function Wo(F,R,U){if(_n===void 0)try{throw Error()}catch(fe){var H=fe.stack.trim().match(/\n( *(at )?)/);_n=H&&H[1]||""}return` -`+_n+F}var su=!1;function Ps(F,R,U){if(!F||su)return"";var H,fe=Error.prepareStackTrace;Error.prepareStackTrace=void 0,su=!0;var ue=U.current;U.current=null;try{if(R){var de=function(){throw Error()};if(Object.defineProperty(de.prototype,"props",{set:function(){throw Error()}}),(typeof Reflect=="undefined"?"undefined":Nu(Reflect))==="object"&&Reflect.construct){try{Reflect.construct(de,[])}catch(xe){H=xe}Reflect.construct(F,[],de)}else{try{de.call()}catch(xe){H=xe}F.call(de.prototype)}}else{try{throw Error()}catch(xe){H=xe}F()}}catch(xe){if(xe&&H&&typeof xe.stack=="string"){for(var W=xe.stack.split(` -`),ve=H.stack.split(` -`),Fe=W.length-1,Ge=ve.length-1;Fe>=1&&Ge>=0&&W[Fe]!==ve[Ge];)Ge--;for(;Fe>=1&&Ge>=0;Fe--,Ge--)if(W[Fe]!==ve[Ge]){if(Fe!==1||Ge!==1)do if(Fe--,--Ge<0||W[Fe]!==ve[Ge])return` -`+W[Fe].replace(" at new "," at ");while(Fe>=1&&Ge>=0);break}}}finally{su=!1,Error.prepareStackTrace=fe,U.current=ue}var K=F?F.displayName||F.name:"";return K?Wo(K):""}function pl(F,R,U,H){return Ps(F,!1,H)}function Vf(F,R,U){var H=F.HostComponent,fe=F.LazyComponent,ue=F.SuspenseComponent,de=F.SuspenseListComponent,W=F.FunctionComponent,ve=F.IndeterminateComponent,Fe=F.SimpleMemoComponent,Ge=F.ForwardRef,K=F.Block,xe=F.ClassComponent;switch(R.tag){case H:return Wo(R.type);case fe:return Wo("Lazy");case ue:return Wo("Suspense");case de:return Wo("SuspenseList");case W:case ve:case Fe:return pl(R.type,0,0,U);case Ge:return pl(R.type.render,0,0,U);case K:return pl(R.type._render,0,0,U);case xe:return function(je,Xe,rt,st){return Ps(je,!0,st)}(R.type,0,0,U);default:return""}}function hl(F,R,U){try{var H="",fe=R;do H+=Vf(F,fe,U),fe=fe.return;while(fe);return H}catch(ue){return` -Error generating stack: `+ue.message+` -`+ue.stack}}function Bu(F,R){var U;if(typeof Symbol=="undefined"||F[Symbol.iterator]==null){if(Array.isArray(F)||(U=function(ve,Fe){if(!!ve){if(typeof ve=="string")return ju(ve,Fe);var Ge=Object.prototype.toString.call(ve).slice(8,-1);if(Ge==="Object"&&ve.constructor&&(Ge=ve.constructor.name),Ge==="Map"||Ge==="Set")return Array.from(ve);if(Ge==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(Ge))return ju(ve,Fe)}}(F))||R&&F&&typeof F.length=="number"){U&&(F=U);var H=0,fe=function(){};return{s:fe,n:function(){return H>=F.length?{done:!0}:{done:!1,value:F[H++]}},e:function(ve){throw ve},f:fe}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var ue,de=!0,W=!1;return{s:function(){U=F[Symbol.iterator]()},n:function(){var ve=U.next();return de=ve.done,ve},e:function(ve){W=!0,ue=ve},f:function(){try{de||U.return==null||U.return()}finally{if(W)throw ue}}}}function ju(F,R){(R==null||R>F.length)&&(R=F.length);for(var U=0,H=new Array(R);U0?Fe[Fe.length-1]:null,xe=K!==null&&(ro.test(K)||Ms.test(K));if(!xe){var je,Xe=Bu(ml.values());try{for(Xe.s();!(je=Xe.n()).done;){var rt=je.value,st=rt.currentDispatcherRef,xt=rt.getCurrentFiber,wt=rt.workTagMap,lt=xt();if(lt!=null){var Rt=hl(wt,lt,st);Rt!==""&&Fe.push(Rt);break}}}catch(yn){Xe.e(yn)}finally{Xe.f()}}}catch(yn){}ue.apply(void 0,Fe)};de.__REACT_DEVTOOLS_ORIGINAL_METHOD__=ue,Uu[fe]=de}catch(W){}})}}function O0(F){return(O0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(R){return typeof R}:function(R){return R&&typeof Symbol=="function"&&R.constructor===Symbol&&R!==Symbol.prototype?"symbol":typeof R})(F)}function vl(F,R){for(var U=0;UF.length)&&(R=F.length);for(var U=0,H=new Array(R);U1?W-1:0),Fe=1;Fe0?K[K.length-1]:0),K.push(St),W.set(Ne,Fe(ft._topLevelWrapper));try{var Qt=He.apply(this,Qe);return K.pop(),Qt}catch(bn){throw K=[],bn}finally{if(K.length===0){var Cn=W.get(Ne);if(Cn===void 0)throw new Error("Expected to find root ID.");yn(Cn)}}},performUpdateIfNecessary:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},receiveComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);var St=ln(Ne);try{var Qt=He.apply(this,Qe),Cn=ln(Ne);return Ge(St,Cn)||Xe(Ne,ft,Cn),K.pop(),Qt}catch(p0){throw K=[],p0}finally{if(K.length===0){var bn=W.get(Ne);if(bn===void 0)throw new Error("Expected to find root ID.");yn(bn)}}},unmountComponent:function(He,Qe){var Ne=Qe[0];if(P0(Ne)===9)return He.apply(this,Qe);var ft=Fe(Ne);K.push(ft);try{var St=He.apply(this,Qe);return K.pop(),function(Cn,bn){wt.push(bn),ue.delete(bn)}(0,ft),St}catch(Cn){throw K=[],Cn}finally{if(K.length===0){var Qt=W.get(Ne);if(Qt===void 0)throw new Error("Expected to find root ID.");yn(Qt)}}}}));var st=[],xt=new Map,wt=[],lt=0,Rt=null;function yn(He){if(st.length!==0||wt.length!==0||Rt!==null){var Qe=wt.length+(Rt===null?0:1),Ne=new Array(3+lt+(Qe>0?2+Qe:0)+st.length),ft=0;if(Ne[ft++]=R,Ne[ft++]=He,Ne[ft++]=lt,xt.forEach(function(Cn,bn){Ne[ft++]=bn.length;for(var p0=Cs(bn),h0=0;h00){Ne[ft++]=2,Ne[ft++]=Qe;for(var St=0;St"),"color: var(--dom-tag-name-color); font-weight: normal;"),Qe.props!==null&&console.log("Props:",Qe.props),Qe.state!==null&&console.log("State:",Qe.state),Qe.context!==null&&console.log("Context:",Qe.context);var ft=fe(He);ft!==null&&console.log("Node:",ft),(window.chrome||/firefox/i.test(navigator.userAgent))&&console.log("Right-click any value to save it as a global variable for further inspection."),Ne&&console.groupEnd()}else console.warn('Could not find element with id "'.concat(He,'"'))},overrideSuspense:function(){throw new Error("overrideSuspense not supported by this renderer")},overrideValueAtPath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":fl(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:si(bn.props,ft,St)}),a0(Cn);break;case"state":fl(Cn.state,ft,St),a0(Cn)}}},renamePath:function(He,Qe,Ne,ft,St){var Qt=ue.get(Qe);if(Qt!=null){var Cn=Qt._instance;if(Cn!=null)switch(He){case"context":ll(Cn.context,ft,St),a0(Cn);break;case"hooks":throw new Error("Hooks not supported by this renderer");case"props":var bn=Qt._currentElement;Qt._currentElement=V0(V0({},bn),{},{props:Fr(bn.props,ft,St)}),a0(Cn);break;case"state":ll(Cn.state,ft,St),a0(Cn)}}},prepareViewAttributeSource:function(He,Qe){var Ne=Cr(He);Ne!==null&&(window.$attribute=Ti(Ne,Qe))},prepareViewElementSource:function(He){var Qe=ue.get(He);if(Qe!=null){var Ne=Qe._currentElement;Ne!=null?H.$type=Ne.type:console.warn('Could not find element with id "'.concat(He,'"'))}else console.warn('Could not find instance with id "'.concat(He,'"'))},renderer:U,setTraceUpdatesEnabled:function(He){},setTrackedPath:function(He){},startProfiling:function(){},stopProfiling:function(){},storeAsGlobal:function(He,Qe,Ne){var ft=Cr(He);if(ft!==null){var St=Ti(ft,Qe),Qt="$reactTemp".concat(Ne);window[Qt]=St,console.log(Qt),console.log(St)}},updateComponentFilters:function(He){}}}function nr(F,R){var U=!1,H={bottom:0,left:0,right:0,top:0},fe=R[F];if(fe!=null){for(var ue=0,de=Object.keys(H);ue0?"development":"production";var st=Function.prototype.toString;if(rt.Mount&&rt.Mount._renderNewRootComponent){var xt=st.call(rt.Mount._renderNewRootComponent);return xt.indexOf("function")!==0?"production":xt.indexOf("storedMeasure")!==-1?"development":xt.indexOf("should be a pure function")!==-1?xt.indexOf("NODE_ENV")!==-1||xt.indexOf("development")!==-1||xt.indexOf("true")!==-1?"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"development":xt.indexOf("nextElement")!==-1||xt.indexOf("nextComponent")!==-1?"unminified":"outdated"}}catch(wt){}return"production"}(ve);try{var K=window.__REACT_DEVTOOLS_APPEND_COMPONENT_STACK__!==!1,xe=window.__REACT_DEVTOOLS_BREAK_ON_CONSOLE_ERRORS__===!0;(K||xe)&&(zi(ve),Ho({appendComponentStack:K,breakOnConsoleErrors:xe}))}catch(rt){}var je=F.__REACT_DEVTOOLS_ATTACH__;if(typeof je=="function"){var Xe=je(W,Fe,ve,F);W.rendererInterfaces.set(Fe,Xe)}return W.emit("renderer",{id:Fe,renderer:ve,reactBuildType:Ge}),Fe},on:function(ve,Fe){ue[ve]||(ue[ve]=[]),ue[ve].push(Fe)},off:function(ve,Fe){if(ue[ve]){var Ge=ue[ve].indexOf(Fe);Ge!==-1&&ue[ve].splice(Ge,1),ue[ve].length||delete ue[ve]}},sub:function(ve,Fe){return W.on(ve,Fe),function(){return W.off(ve,Fe)}},supportsFiber:!0,checkDCE:function(ve){try{Function.prototype.toString.call(ve).indexOf("^_^")>-1&&(U=!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(Fe){}},onCommitFiberUnmount:function(ve,Fe){var Ge=fe.get(ve);Ge!=null&&Ge.handleCommitFiberUnmount(Fe)},onCommitFiberRoot:function(ve,Fe,Ge){var K=W.getFiberRoots(ve),xe=Fe.current,je=K.has(Fe),Xe=xe.memoizedState==null||xe.memoizedState.element==null;je||Xe?je&&Xe&&K.delete(Fe):K.add(Fe);var rt=fe.get(ve);rt!=null&&rt.handleCommitFiberRoot(Fe,Ge)}};Object.defineProperty(F,"__REACT_DEVTOOLS_GLOBAL_HOOK__",{configurable:!1,enumerable:!1,get:function(){return W}})})(window);var M0=window.__REACT_DEVTOOLS_GLOBAL_HOOK__,au=[{type:1,value:7,isEnabled:!0}];function Lr(F){if(M0!=null){var R=F||{},U=R.host,H=U===void 0?"localhost":U,fe=R.nativeStyleEditorValidAttributes,ue=R.useHttps,de=ue!==void 0&&ue,W=R.port,ve=W===void 0?8097:W,Fe=R.websocket,Ge=R.resolveRNStyle,K=Ge===void 0?null:Ge,xe=R.isAppActive,je=de?"wss":"ws",Xe=null;if((xe===void 0?function(){return!0}:xe)()){var rt=null,st=[],xt=je+"://"+H+":"+ve,wt=Fe||new window.WebSocket(xt);wt.onclose=function(){rt!==null&&rt.emit("shutdown"),lt()},wt.onerror=function(){lt()},wt.onmessage=function(Rt){var yn;try{if(typeof Rt.data!="string")throw Error();yn=JSON.parse(Rt.data)}catch(sn){return void console.error("[React DevTools] Failed to parse JSON: "+Rt.data)}st.forEach(function(sn){try{sn(yn)}catch(ar){throw console.log("[React DevTools] Error calling listener",yn),console.log("error:",ar),ar}})},wt.onopen=function(){(rt=new Do({listen:function(rn){return st.push(rn),function(){var Hn=st.indexOf(rn);Hn>=0&&st.splice(Hn,1)}},send:function(rn,Hn,d0){wt.readyState===wt.OPEN?wt.send(JSON.stringify({event:rn,payload:Hn})):(rt!==null&&rt.shutdown(),lt())}})).addListener("inspectElement",function(rn){var Hn=rn.id,d0=rn.rendererID,Cr=Rt.rendererInterfaces[d0];if(Cr!=null){var He=Cr.findNativeNodesForFiberID(Hn);He!=null&&He[0]!=null&&Rt.emit("showNativeHighlight",He[0])}}),rt.addListener("updateComponentFilters",function(rn){au=rn}),window.__REACT_DEVTOOLS_COMPONENT_FILTERS__==null&&rt.send("overrideComponentFilters",au);var Rt=new I0(rt);if(Rt.addListener("shutdown",function(){M0.emit("shutdown")}),function(rn,Hn,d0){if(rn==null)return function(){};var Cr=[rn.sub("renderer-attached",function(Ne){var ft=Ne.id,St=(Ne.renderer,Ne.rendererInterface);Hn.setRendererInterface(ft,St),St.flushInitialOperations()}),rn.sub("unsupported-renderer-version",function(Ne){Hn.onUnsupportedRenderer(Ne)}),rn.sub("operations",Hn.onHookOperations),rn.sub("traceUpdates",Hn.onTraceUpdates)],He=function(Ne,ft){var St=rn.rendererInterfaces.get(Ne);St==null&&(typeof ft.findFiberByHostInstance=="function"?St=uf(rn,Ne,ft,d0):ft.ComponentTree&&(St=lf(rn,Ne,ft,d0)),St!=null&&rn.rendererInterfaces.set(Ne,St)),St!=null?rn.emit("renderer-attached",{id:Ne,renderer:ft,rendererInterface:St}):rn.emit("unsupported-renderer-version",Ne)};rn.renderers.forEach(function(Ne,ft){He(ft,Ne)}),Cr.push(rn.sub("renderer",function(Ne){var ft=Ne.id,St=Ne.renderer;He(ft,St)})),rn.emit("react-devtools",Hn),rn.reactDevtoolsAgent=Hn;var Qe=function(){Cr.forEach(function(Ne){return Ne()}),rn.rendererInterfaces.forEach(function(Ne){Ne.cleanup()}),rn.reactDevtoolsAgent=null};Hn.addListener("shutdown",Qe),Cr.push(function(){Hn.removeListener("shutdown",Qe)})}(M0,Rt,window),K!=null||M0.resolveRNStyle!=null)Gu(rt,Rt,K||M0.resolveRNStyle,fe||M0.nativeStyleEditorValidAttributes||null);else{var yn,sn,ar=function(){rt!==null&&Gu(rt,Rt,yn,sn)};M0.hasOwnProperty("resolveRNStyle")||Object.defineProperty(M0,"resolveRNStyle",{enumerable:!1,get:function(){return yn},set:function(rn){yn=rn,ar()}}),M0.hasOwnProperty("nativeStyleEditorValidAttributes")||Object.defineProperty(M0,"nativeStyleEditorValidAttributes",{enumerable:!1,get:function(){return sn},set:function(rn){sn=rn,ar()}})}}}else lt()}function lt(){Xe===null&&(Xe=setTimeout(function(){return Lr(F)},2e3))}}}])})});var rS=Me(nS=>{"use strict";Object.defineProperty(nS,"__esModule",{value:!0});eS();var _j=tS();_j.connectToDevTools()});var lS=Me(x2=>{"use strict";var iS=x2&&x2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(x2,"__esModule",{value:!0});var oS=Ay(),yj=iS(lE()),uS=iS(hc()),no=Xy();process.env.DEV==="true"&&rS();var sS=i=>{i==null||i.unsetMeasureFunc(),i==null||i.freeRecursive()};x2.default=yj.default({schedulePassiveEffects:oS.unstable_scheduleCallback,cancelPassiveEffects:oS.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:i=>{if(i.isStaticDirty){i.isStaticDirty=!1,typeof i.onImmediateRender=="function"&&i.onImmediateRender();return}typeof i.onRender=="function"&&i.onRender()},getChildHostContext:(i,u)=>{let f=i.isInsideText,c=u==="ink-text"||u==="ink-virtual-text";return f===c?i:{isInsideText:c}},shouldSetTextContent:()=>!1,createInstance:(i,u,f,c)=>{if(c.isInsideText&&i==="ink-box")throw new Error(" can\u2019t be nested inside component");let g=i==="ink-text"&&c.isInsideText?"ink-virtual-text":i,t=no.createNode(g);for(let[C,A]of Object.entries(u))C!=="children"&&(C==="style"?no.setStyle(t,A):C==="internal_transform"?t.internal_transform=A:C==="internal_static"?t.internal_static=!0:no.setAttribute(t,C,A));return t},createTextInstance:(i,u,f)=>{if(!f.isInsideText)throw new Error(`Text string "${i}" must be rendered inside component`);return no.createTextNode(i)},resetTextContent:()=>{},hideTextInstance:i=>{no.setTextNodeValue(i,"")},unhideTextInstance:(i,u)=>{no.setTextNodeValue(i,u)},getPublicInstance:i=>i,hideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_NONE)},unhideInstance:i=>{var u;(u=i.yogaNode)===null||u===void 0||u.setDisplay(uS.default.DISPLAY_FLEX)},appendInitialChild:no.appendChildNode,appendChild:no.appendChildNode,insertBefore:no.insertBeforeNode,finalizeInitialChildren:(i,u,f,c)=>(i.internal_static&&(c.isStaticDirty=!0,c.staticNode=i),!1),supportsMutation:!0,appendChildToContainer:no.appendChildNode,insertInContainerBefore:no.insertBeforeNode,removeChildFromContainer:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)},prepareUpdate:(i,u,f,c,g)=>{i.internal_static&&(g.isStaticDirty=!0);let t={},C=Object.keys(c);for(let A of C)if(c[A]!==f[A]){if(A==="style"&&typeof c.style=="object"&&typeof f.style=="object"){let D=c.style,L=f.style,N=Object.keys(D);for(let j of N){if(j==="borderStyle"||j==="borderColor"){if(typeof t.style!="object"){let $={};t.style=$}t.style.borderStyle=D.borderStyle,t.style.borderColor=D.borderColor}if(D[j]!==L[j]){if(typeof t.style!="object"){let $={};t.style=$}t.style[j]=D[j]}}continue}t[A]=c[A]}return t},commitUpdate:(i,u)=>{for(let[f,c]of Object.entries(u))f!=="children"&&(f==="style"?no.setStyle(i,c):f==="internal_transform"?i.internal_transform=c:f==="internal_static"?i.internal_static=!0:no.setAttribute(i,f,c))},commitTextUpdate:(i,u,f)=>{no.setTextNodeValue(i,f)},removeChild:(i,u)=>{no.removeChildNode(i,u),sS(u.yogaNode)}})});var cS=Me((Jb,fS)=>{"use strict";fS.exports=(i,u=1,f)=>{if(f=dt({indent:" ",includeEmptyLines:!1},f),typeof i!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof i}\``);if(typeof u!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof u}\``);if(typeof f.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof f.indent}\``);if(u===0)return i;let c=f.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return i.replace(c,f.indent.repeat(u))}});var aS=Me(k2=>{"use strict";var wj=k2&&k2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(k2,"__esModule",{value:!0});var Vh=wj(hc());k2.default=i=>i.getComputedWidth()-i.getComputedPadding(Vh.default.EDGE_LEFT)-i.getComputedPadding(Vh.default.EDGE_RIGHT)-i.getComputedBorder(Vh.default.EDGE_LEFT)-i.getComputedBorder(Vh.default.EDGE_RIGHT)});var pS=Me((Zb,dS)=>{dS.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var mS=Me((eG,m3)=>{"use strict";var hS=pS();m3.exports=hS;m3.exports.default=hS});var gS=Me((tG,vS)=>{"use strict";vS.exports=(i,u=process.argv)=>{let f=i.startsWith("-")?"":i.length===1?"-":"--",c=u.indexOf(f+i),g=u.indexOf("--");return c!==-1&&(g===-1||c{"use strict";var Dj=require("os"),yS=require("tty"),Pu=gS(),{env:oi}=process,qf;Pu("no-color")||Pu("no-colors")||Pu("color=false")||Pu("color=never")?qf=0:(Pu("color")||Pu("colors")||Pu("color=true")||Pu("color=always"))&&(qf=1);"FORCE_COLOR"in oi&&(oi.FORCE_COLOR==="true"?qf=1:oi.FORCE_COLOR==="false"?qf=0:qf=oi.FORCE_COLOR.length===0?1:Math.min(parseInt(oi.FORCE_COLOR,10),3));function v3(i){return i===0?!1:{level:i,hasBasic:!0,has256:i>=2,has16m:i>=3}}function g3(i,u){if(qf===0)return 0;if(Pu("color=16m")||Pu("color=full")||Pu("color=truecolor"))return 3;if(Pu("color=256"))return 2;if(i&&!u&&qf===void 0)return 0;let f=qf||0;if(oi.TERM==="dumb")return f;if(process.platform==="win32"){let c=Dj.release().split(".");return Number(c[0])>=10&&Number(c[2])>=10586?Number(c[2])>=14931?3:2:1}if("CI"in oi)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(c=>c in oi)||oi.CI_NAME==="codeship"?1:f;if("TEAMCITY_VERSION"in oi)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(oi.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in oi)return 1;if(oi.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in oi){let c=parseInt((oi.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(oi.TERM_PROGRAM){case"iTerm.app":return c>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(oi.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(oi.TERM)||"COLORTERM"in oi?1:f}function Ej(i){let u=g3(i,i&&i.isTTY);return v3(u)}_S.exports={supportsColor:Ej,stdout:v3(g3(!0,yS.isatty(1))),stderr:v3(g3(!0,yS.isatty(2)))}});var ES=Me((rG,DS)=>{"use strict";var Sj=(i,u,f)=>{let c=i.indexOf(u);if(c===-1)return i;let g=u.length,t=0,C="";do C+=i.substr(t,c-t)+u+f,t=c+g,c=i.indexOf(u,t);while(c!==-1);return C+=i.substr(t),C},Cj=(i,u,f,c)=>{let g=0,t="";do{let C=i[c-1]==="\r";t+=i.substr(g,(C?c-1:c)-g)+u+(C?`\r -`:` -`)+f,g=c+1,c=i.indexOf(` -`,g)}while(c!==-1);return t+=i.substr(g),t};DS.exports={stringReplaceAll:Sj,stringEncaseCRLFWithFirstIndex:Cj}});var kS=Me((iG,SS)=>{"use strict";var Tj=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,CS=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,xj=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,kj=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,Aj=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function TS(i){let u=i[0]==="u",f=i[1]==="{";return u&&!f&&i.length===5||i[0]==="x"&&i.length===3?String.fromCharCode(parseInt(i.slice(1),16)):u&&f?String.fromCodePoint(parseInt(i.slice(2,-1),16)):Aj.get(i)||i}function Oj(i,u){let f=[],c=u.trim().split(/\s*,\s*/g),g;for(let t of c){let C=Number(t);if(!Number.isNaN(C))f.push(C);else if(g=t.match(xj))f.push(g[2].replace(kj,(A,x,D)=>x?TS(x):D));else throw new Error(`Invalid Chalk template style argument: ${t} (in style '${i}')`)}return f}function Ij(i){CS.lastIndex=0;let u=[],f;for(;(f=CS.exec(i))!==null;){let c=f[1];if(f[2]){let g=Oj(c,f[2]);u.push([c].concat(g))}else u.push([c])}return u}function xS(i,u){let f={};for(let g of u)for(let t of g.styles)f[t[0]]=g.inverse?null:t.slice(1);let c=i;for(let[g,t]of Object.entries(f))if(!!Array.isArray(t)){if(!(g in c))throw new Error(`Unknown Chalk style: ${g}`);c=t.length>0?c[g](...t):c[g]}return c}SS.exports=(i,u)=>{let f=[],c=[],g=[];if(u.replace(Tj,(t,C,A,x,D,L)=>{if(C)g.push(TS(C));else if(x){let N=g.join("");g=[],c.push(f.length===0?N:xS(i,f)(N)),f.push({inverse:A,styles:Ij(x)})}else if(D){if(f.length===0)throw new Error("Found extraneous } in Chalk template literal");c.push(xS(i,f)(g.join(""))),g=[],f.pop()}else g.push(L)}),c.push(g.join("")),f.length>0){let t=`Chalk template literal is missing ${f.length} closing bracket${f.length===1?"":"s"} (\`}\`)`;throw new Error(t)}return c.join("")}});var Jh=Me((oG,AS)=>{"use strict";var A2=Rh(),{stdout:_3,stderr:y3}=wS(),{stringReplaceAll:Pj,stringEncaseCRLFWithFirstIndex:Mj}=ES(),{isArray:Yh}=Array,OS=["ansi","ansi","ansi256","ansi16m"],ka=Object.create(null),Fj=(i,u={})=>{if(u.level&&!(Number.isInteger(u.level)&&u.level>=0&&u.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let f=_3?_3.level:0;i.level=u.level===void 0?f:u.level},IS=class{constructor(u){return PS(u)}},PS=i=>{let u={};return Fj(u,i),u.template=(...f)=>MS(u.template,...f),Object.setPrototypeOf(u,$h.prototype),Object.setPrototypeOf(u.template,u),u.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},u.template.Instance=IS,u.template};function $h(i){return PS(i)}for(let[i,u]of Object.entries(A2))ka[i]={get(){let f=Kh(this,w3(u.open,u.close,this._styler),this._isEmpty);return Object.defineProperty(this,i,{value:f}),f}};ka.visible={get(){let i=Kh(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:i}),i}};var LS=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let i of LS)ka[i]={get(){let{level:u}=this;return function(...f){let c=w3(A2.color[OS[u]][i](...f),A2.color.close,this._styler);return Kh(this,c,this._isEmpty)}}};for(let i of LS){let u="bg"+i[0].toUpperCase()+i.slice(1);ka[u]={get(){let{level:f}=this;return function(...c){let g=w3(A2.bgColor[OS[f]][i](...c),A2.bgColor.close,this._styler);return Kh(this,g,this._isEmpty)}}}}var Lj=Object.defineProperties(()=>{},zn(dt({},ka),{level:{enumerable:!0,get(){return this._generator.level},set(i){this._generator.level=i}}})),w3=(i,u,f)=>{let c,g;return f===void 0?(c=i,g=u):(c=f.openAll+i,g=u+f.closeAll),{open:i,close:u,openAll:c,closeAll:g,parent:f}},Kh=(i,u,f)=>{let c=(...g)=>Yh(g[0])&&Yh(g[0].raw)?RS(c,MS(c,...g)):RS(c,g.length===1?""+g[0]:g.join(" "));return Object.setPrototypeOf(c,Lj),c._generator=i,c._styler=u,c._isEmpty=f,c},RS=(i,u)=>{if(i.level<=0||!u)return i._isEmpty?"":u;let f=i._styler;if(f===void 0)return u;let{openAll:c,closeAll:g}=f;if(u.indexOf("")!==-1)for(;f!==void 0;)u=Pj(u,f.close,f.open),f=f.parent;let t=u.indexOf(` -`);return t!==-1&&(u=Mj(u,g,c,t)),c+u+g},D3,MS=(i,...u)=>{let[f]=u;if(!Yh(f)||!Yh(f.raw))return u.join(" ");let c=u.slice(1),g=[f.raw[0]];for(let t=1;t{"use strict";var Rj=O2&&O2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(O2,"__esModule",{value:!0});var I2=Rj(Jh()),Nj=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,Bj=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,Qh=(i,u)=>u==="foreground"?i:"bg"+i[0].toUpperCase()+i.slice(1);O2.default=(i,u,f)=>{if(!u)return i;if(u in I2.default){let g=Qh(u,f);return I2.default[g](i)}if(u.startsWith("#")){let g=Qh("hex",f);return I2.default[g](u)(i)}if(u.startsWith("ansi")){let g=Bj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]);return I2.default[t](C)(i)}if(u.startsWith("rgb")||u.startsWith("hsl")||u.startsWith("hsv")||u.startsWith("hwb")){let g=Nj.exec(u);if(!g)return i;let t=Qh(g[1],f),C=Number(g[2]),A=Number(g[3]),x=Number(g[4]);return I2.default[t](C,A,x)(i)}return i}});var BS=Me(P2=>{"use strict";var NS=P2&&P2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(P2,"__esModule",{value:!0});var jj=NS(mS()),S3=NS(E3());P2.default=(i,u,f,c)=>{if(typeof f.style.borderStyle=="string"){let g=f.yogaNode.getComputedWidth(),t=f.yogaNode.getComputedHeight(),C=f.style.borderColor,A=jj.default[f.style.borderStyle],x=S3.default(A.topLeft+A.horizontal.repeat(g-2)+A.topRight,C,"foreground"),D=(S3.default(A.vertical,C,"foreground")+` -`).repeat(t-2),L=S3.default(A.bottomLeft+A.horizontal.repeat(g-2)+A.bottomRight,C,"foreground");c.write(i,u,x,{transformers:[]}),c.write(i,u+1,D,{transformers:[]}),c.write(i+g-1,u+1,D,{transformers:[]}),c.write(i,u+t-1,L,{transformers:[]})}}});var US=Me(M2=>{"use strict";var _c=M2&&M2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(M2,"__esModule",{value:!0});var Uj=_c(hc()),qj=_c(jy()),zj=_c(cS()),Wj=_c(Yy()),Hj=_c(aS()),bj=_c(Ky()),Gj=_c(BS()),Vj=(i,u)=>{var f;let c=(f=i.childNodes[0])===null||f===void 0?void 0:f.yogaNode;if(c){let g=c.getComputedLeft(),t=c.getComputedTop();u=` -`.repeat(t)+zj.default(u,g)}return u},jS=(i,u,f)=>{var c;let{offsetX:g=0,offsetY:t=0,transformers:C=[],skipStaticElements:A}=f;if(A&&i.internal_static)return;let{yogaNode:x}=i;if(x){if(x.getDisplay()===Uj.default.DISPLAY_NONE)return;let D=g+x.getComputedLeft(),L=t+x.getComputedTop(),N=C;if(typeof i.internal_transform=="function"&&(N=[i.internal_transform,...C]),i.nodeName==="ink-text"){let j=bj.default(i);if(j.length>0){let $=qj.default(j),h=Hj.default(x);if($>h){let re=(c=i.style.textWrap)!==null&&c!==void 0?c:"wrap";j=Wj.default(j,h,re)}j=Vj(i,j),u.write(D,L,j,{transformers:N})}return}if(i.nodeName==="ink-box"&&Gj.default(D,L,i,u),i.nodeName==="ink-root"||i.nodeName==="ink-box")for(let j of i.childNodes)jS(j,u,{offsetX:D,offsetY:L,transformers:N,skipStaticElements:A})}};M2.default=jS});var zS=Me((fG,qS)=>{"use strict";qS.exports=i=>{i=Object.assign({onlyFirst:!1},i);let u=["[\\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(u,i.onlyFirst?void 0:"g")}});var HS=Me((cG,C3)=>{"use strict";var Yj=zS(),WS=i=>typeof i=="string"?i.replace(Yj(),""):i;C3.exports=WS;C3.exports.default=WS});var VS=Me((aG,bS)=>{"use strict";var GS="[\uD800-\uDBFF][\uDC00-\uDFFF]";bS.exports=i=>i&&i.exact?new RegExp(`^${GS}$`):new RegExp(GS,"g")});var $S=Me((dG,T3)=>{"use strict";var $j=HS(),Kj=VS(),YS=i=>$j(i).replace(Kj()," ").length;T3.exports=YS;T3.exports.default=YS});var QS=Me(F2=>{"use strict";var KS=F2&&F2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(F2,"__esModule",{value:!0});var XS=KS(Gy()),Xj=KS($S()),JS=class{constructor(u){this.writes=[];let{width:f,height:c}=u;this.width=f,this.height=c}write(u,f,c,g){let{transformers:t}=g;!c||this.writes.push({x:u,y:f,text:c,transformers:t})}get(){let u=[];for(let c=0;cc.trimRight()).join(` -`),height:u.length}}};F2.default=JS});var t5=Me(L2=>{"use strict";var x3=L2&&L2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(L2,"__esModule",{value:!0});var Jj=x3(hc()),ZS=x3(US()),e5=x3(QS());L2.default=(i,u)=>{var f;if(i.yogaNode.setWidth(u),i.yogaNode){i.yogaNode.calculateLayout(void 0,void 0,Jj.default.DIRECTION_LTR);let c=new e5.default({width:i.yogaNode.getComputedWidth(),height:i.yogaNode.getComputedHeight()});ZS.default(i,c,{skipStaticElements:!0});let g;((f=i.staticNode)===null||f===void 0?void 0:f.yogaNode)&&(g=new e5.default({width:i.staticNode.yogaNode.getComputedWidth(),height:i.staticNode.yogaNode.getComputedHeight()}),ZS.default(i.staticNode,g,{skipStaticElements:!1}));let{output:t,height:C}=c.get();return{output:t,outputHeight:C,staticOutput:g?`${g.get().output} -`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var o5=Me((mG,n5)=>{"use strict";var r5=require("stream"),i5=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],k3={},Qj=i=>{let u=new r5.PassThrough,f=new r5.PassThrough;u.write=g=>i("stdout",g),f.write=g=>i("stderr",g);let c=new console.Console(u,f);for(let g of i5)k3[g]=console[g],console[g]=c[g];return()=>{for(let g of i5)console[g]=k3[g];k3={}}};n5.exports=Qj});var O3=Me(A3=>{"use strict";Object.defineProperty(A3,"__esModule",{value:!0});A3.default=new WeakMap});var P3=Me(I3=>{"use strict";Object.defineProperty(I3,"__esModule",{value:!0});var Zj=lr(),u5=Zj.createContext({exit:()=>{}});u5.displayName="InternalAppContext";I3.default=u5});var F3=Me(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});var eU=lr(),s5=eU.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});s5.displayName="InternalStdinContext";M3.default=s5});var R3=Me(L3=>{"use strict";Object.defineProperty(L3,"__esModule",{value:!0});var tU=lr(),l5=tU.createContext({stdout:void 0,write:()=>{}});l5.displayName="InternalStdoutContext";L3.default=l5});var B3=Me(N3=>{"use strict";Object.defineProperty(N3,"__esModule",{value:!0});var nU=lr(),f5=nU.createContext({stderr:void 0,write:()=>{}});f5.displayName="InternalStderrContext";N3.default=f5});var Zh=Me(j3=>{"use strict";Object.defineProperty(j3,"__esModule",{value:!0});var rU=lr(),c5=rU.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});c5.displayName="InternalFocusContext";j3.default=c5});var d5=Me((EG,a5)=>{"use strict";var iU=/[|\\{}()[\]^$+*?.-]/g;a5.exports=i=>{if(typeof i!="string")throw new TypeError("Expected a string");return i.replace(iU,"\\$&")}});var v5=Me((SG,p5)=>{"use strict";var oU=d5(),h5=[].concat(require("module").builtinModules,"bootstrap_node","node").map(i=>new RegExp(`(?:\\(${i}\\.js:\\d+:\\d+\\)$|^\\s*at ${i}\\.js:\\d+:\\d+$)`));h5.push(/\(internal\/[^:]+:\d+:\d+\)$/,/\s*at internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var em=class{constructor(u){u=dt({ignoredPackages:[]},u),"internals"in u||(u.internals=em.nodeInternals()),"cwd"in u||(u.cwd=process.cwd()),this._cwd=u.cwd.replace(/\\/g,"/"),this._internals=[].concat(u.internals,uU(u.ignoredPackages)),this._wrapCallSite=u.wrapCallSite||!1}static nodeInternals(){return[...h5]}clean(u,f=0){f=" ".repeat(f),Array.isArray(u)||(u=u.split(` -`)),!/^\s*at /.test(u[0])&&/^\s*at /.test(u[1])&&(u=u.slice(1));let c=!1,g=null,t=[];return u.forEach(C=>{if(C=C.replace(/\\/g,"/"),this._internals.some(x=>x.test(C)))return;let A=/^\s*at /.test(C);c?C=C.trimEnd().replace(/^(\s+)at /,"$1"):(C=C.trim(),A&&(C=C.slice(3))),C=C.replace(`${this._cwd}/`,""),C&&(A?(g&&(t.push(g),g=null),t.push(C)):(c=!0,g=C))}),t.map(C=>`${f}${C} -`).join("")}captureString(u,f=this.captureString){typeof u=="function"&&(f=u,u=Infinity);let{stackTraceLimit:c}=Error;u&&(Error.stackTraceLimit=u);let g={};Error.captureStackTrace(g,f);let{stack:t}=g;return Error.stackTraceLimit=c,this.clean(t)}capture(u,f=this.capture){typeof u=="function"&&(f=u,u=Infinity);let{prepareStackTrace:c,stackTraceLimit:g}=Error;Error.prepareStackTrace=(A,x)=>this._wrapCallSite?x.map(this._wrapCallSite):x,u&&(Error.stackTraceLimit=u);let t={};Error.captureStackTrace(t,f);let{stack:C}=t;return Object.assign(Error,{prepareStackTrace:c,stackTraceLimit:g}),C}at(u=this.at){let[f]=this.capture(1,u);if(!f)return{};let c={line:f.getLineNumber(),column:f.getColumnNumber()};m5(c,f.getFileName(),this._cwd),f.isConstructor()&&(c.constructor=!0),f.isEval()&&(c.evalOrigin=f.getEvalOrigin()),f.isNative()&&(c.native=!0);let g;try{g=f.getTypeName()}catch(A){}g&&g!=="Object"&&g!=="[object Object]"&&(c.type=g);let t=f.getFunctionName();t&&(c.function=t);let C=f.getMethodName();return C&&t!==C&&(c.method=C),c}parseLine(u){let f=u&&u.match(sU);if(!f)return null;let c=f[1]==="new",g=f[2],t=f[3],C=f[4],A=Number(f[5]),x=Number(f[6]),D=f[7],L=f[8],N=f[9],j=f[10]==="native",$=f[11]===")",h,re={};if(L&&(re.line=Number(L)),N&&(re.column=Number(N)),$&&D){let ce=0;for(let Q=D.length-1;Q>0;Q--)if(D.charAt(Q)===")")ce++;else if(D.charAt(Q)==="("&&D.charAt(Q-1)===" "&&(ce--,ce===-1&&D.charAt(Q-1)===" ")){let oe=D.slice(0,Q-1);D=D.slice(Q+1),g+=` (${oe}`;break}}if(g){let ce=g.match(lU);ce&&(g=ce[1],h=ce[2])}return m5(re,D,this._cwd),c&&(re.constructor=!0),t&&(re.evalOrigin=t,re.evalLine=A,re.evalColumn=x,re.evalFile=C&&C.replace(/\\/g,"/")),j&&(re.native=!0),g&&(re.function=g),h&&g!==h&&(re.method=h),re}};function m5(i,u,f){u&&(u=u.replace(/\\/g,"/"),u.startsWith(`${f}/`)&&(u=u.slice(f.length+1)),i.file=u)}function uU(i){if(i.length===0)return[];let u=i.map(f=>oU(f));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${u.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var sU=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),lU=/^(.*?) \[as (.*?)\]$/;p5.exports=em});var _5=Me((CG,g5)=>{"use strict";g5.exports=(i,u)=>i.replace(/^\t+/gm,f=>" ".repeat(f.length*(u||2)))});var w5=Me((TG,y5)=>{"use strict";var fU=_5(),cU=(i,u)=>{let f=[],c=i-u,g=i+u;for(let t=c;t<=g;t++)f.push(t);return f};y5.exports=(i,u,f)=>{if(typeof i!="string")throw new TypeError("Source code is missing.");if(!u||u<1)throw new TypeError("Line number must start from `1`.");if(i=fU(i).split(/\r?\n/),!(u>i.length))return f=dt({around:3},f),cU(u,f.around).filter(c=>i[c-1]!==void 0).map(c=>({line:c,value:i[c-1]}))}});var tm=Me(hs=>{"use strict";var aU=hs&&hs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),dU=hs&&hs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),pU=hs&&hs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&aU(u,i,f);return dU(u,i),u},hU=hs&&hs.__rest||function(i,u){var f={};for(var c in i)Object.prototype.hasOwnProperty.call(i,c)&&u.indexOf(c)<0&&(f[c]=i[c]);if(i!=null&&typeof Object.getOwnPropertySymbols=="function")for(var g=0,c=Object.getOwnPropertySymbols(i);g{var{children:f}=i,c=hU(i,["children"]);let g=Object.assign(Object.assign({},c),{marginLeft:c.marginLeft||c.marginX||c.margin||0,marginRight:c.marginRight||c.marginX||c.margin||0,marginTop:c.marginTop||c.marginY||c.margin||0,marginBottom:c.marginBottom||c.marginY||c.margin||0,paddingLeft:c.paddingLeft||c.paddingX||c.padding||0,paddingRight:c.paddingRight||c.paddingX||c.padding||0,paddingTop:c.paddingTop||c.paddingY||c.padding||0,paddingBottom:c.paddingBottom||c.paddingY||c.padding||0});return D5.default.createElement("ink-box",{ref:u,style:g},f)});U3.displayName="Box";U3.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};hs.default=U3});var W3=Me(R2=>{"use strict";var q3=R2&&R2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(R2,"__esModule",{value:!0});var mU=q3(lr()),Aa=q3(Jh()),E5=q3(E3()),z3=({color:i,backgroundColor:u,dimColor:f,bold:c,italic:g,underline:t,strikethrough:C,inverse:A,wrap:x,children:D})=>{if(D==null)return null;let L=N=>(f&&(N=Aa.default.dim(N)),i&&(N=E5.default(N,i,"foreground")),u&&(N=E5.default(N,u,"background")),c&&(N=Aa.default.bold(N)),g&&(N=Aa.default.italic(N)),t&&(N=Aa.default.underline(N)),C&&(N=Aa.default.strikethrough(N)),A&&(N=Aa.default.inverse(N)),N);return mU.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:x},internal_transform:L},D)};z3.displayName="Text";z3.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};R2.default=z3});var x5=Me(ms=>{"use strict";var vU=ms&&ms.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),gU=ms&&ms.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),_U=ms&&ms.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&vU(u,i,f);return gU(u,i),u},N2=ms&&ms.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(ms,"__esModule",{value:!0});var S5=_U(require("fs")),ui=N2(lr()),C5=N2(v5()),yU=N2(w5()),ef=N2(tm()),il=N2(W3()),T5=new C5.default({cwd:process.cwd(),internals:C5.default.nodeInternals()}),wU=({error:i})=>{let u=i.stack?i.stack.split(` -`).slice(1):void 0,f=u?T5.parseLine(u[0]):void 0,c,g=0;if((f==null?void 0:f.file)&&(f==null?void 0:f.line)&&S5.existsSync(f.file)){let t=S5.readFileSync(f.file,"utf8");if(c=yU.default(t,f.line),c)for(let{line:C}of c)g=Math.max(g,String(C).length)}return ui.default.createElement(ef.default,{flexDirection:"column",padding:1},ui.default.createElement(ef.default,null,ui.default.createElement(il.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),ui.default.createElement(il.default,null," ",i.message)),f&&ui.default.createElement(ef.default,{marginTop:1},ui.default.createElement(il.default,{dimColor:!0},f.file,":",f.line,":",f.column)),f&&c&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},c.map(({line:t,value:C})=>ui.default.createElement(ef.default,{key:t},ui.default.createElement(ef.default,{width:g+1},ui.default.createElement(il.default,{dimColor:t!==f.line,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0},String(t).padStart(g," "),":")),ui.default.createElement(il.default,{key:t,backgroundColor:t===f.line?"red":void 0,color:t===f.line?"white":void 0}," "+C)))),i.stack&&ui.default.createElement(ef.default,{marginTop:1,flexDirection:"column"},i.stack.split(` -`).slice(1).map(t=>{let C=T5.parseLine(t);return C?ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},C.function),ui.default.createElement(il.default,{dimColor:!0,color:"gray"}," ","(",C.file,":",C.line,":",C.column,")")):ui.default.createElement(ef.default,{key:t},ui.default.createElement(il.default,{dimColor:!0},"- "),ui.default.createElement(il.default,{dimColor:!0,bold:!0},t))})))};ms.default=wU});var A5=Me(vs=>{"use strict";var DU=vs&&vs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),EU=vs&&vs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),SU=vs&&vs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&DU(u,i,f);return EU(u,i),u},yc=vs&&vs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(vs,"__esModule",{value:!0});var wc=SU(lr()),k5=yc(gy()),CU=yc(P3()),TU=yc(F3()),xU=yc(R3()),kU=yc(B3()),AU=yc(Zh()),OU=yc(x5()),IU=" ",PU="",MU="",H3=class extends wc.PureComponent{constructor(){super(...arguments);this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=u=>{let{stdin:f}=this.props;if(!this.isRawModeSupported())throw f===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. -Read 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. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(f.setEncoding("utf8"),u){this.rawModeEnabledCount===0&&(f.addListener("data",this.handleInput),f.resume(),f.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount==0&&(f.setRawMode(!1),f.removeListener("data",this.handleInput),f.pause())},this.handleInput=u=>{u===""&&this.props.exitOnCtrlC&&this.handleExit(),u===MU&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(u===IU&&this.focusNext(),u===PU&&this.focusPrevious())},this.handleExit=u=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(u)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(u=>{let f=u.focusables[0].id;return{activeFocusId:this.findNextFocusable(u)||f}})},this.focusPrevious=()=>{this.setState(u=>{let f=u.focusables[u.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(u)||f}})},this.addFocusable=(u,{autoFocus:f})=>{this.setState(c=>{let g=c.activeFocusId;return!g&&f&&(g=u),{activeFocusId:g,focusables:[...c.focusables,{id:u,isActive:!0}]}})},this.removeFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.filter(c=>c.id!==u)}))},this.activateFocusable=u=>{this.setState(f=>({focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!0})}))},this.deactivateFocusable=u=>{this.setState(f=>({activeFocusId:f.activeFocusId===u?void 0:f.activeFocusId,focusables:f.focusables.map(c=>c.id!==u?c:{id:u,isActive:!1})}))},this.findNextFocusable=u=>{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f+1;c{let f=u.focusables.findIndex(c=>c.id===u.activeFocusId);for(let c=f-1;c>=0;c--)if(u.focusables[c].isActive)return u.focusables[c].id}}static getDerivedStateFromError(u){return{error:u}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return wc.default.createElement(CU.default.Provider,{value:{exit:this.handleExit}},wc.default.createElement(TU.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},wc.default.createElement(xU.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},wc.default.createElement(kU.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},wc.default.createElement(AU.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?wc.default.createElement(OU.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){k5.default.hide(this.props.stdout)}componentWillUnmount(){k5.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(u){this.handleExit(u)}};vs.default=H3;H3.displayName="InternalApp"});var M5=Me(gs=>{"use strict";var FU=gs&&gs.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),LU=gs&&gs.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),RU=gs&&gs.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&FU(u,i,f);return LU(u,i),u},_s=gs&&gs.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(gs,"__esModule",{value:!0});var NU=_s(lr()),O5=AD(),BU=_s(WD()),jU=_s(ay()),UU=_s(KD()),qU=_s(JD()),nm=_s(lS()),zU=_s(t5()),WU=_s(vy()),HU=_s(o5()),bU=RU(Xy()),GU=_s(O3()),VU=_s(A5()),Oa=process.env.CI==="false"?!1:UU.default,I5=()=>{},P5=class{constructor(u){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:f,outputHeight:c,staticOutput:g}=zU.default(this.rootNode,this.options.stdout.columns||80),t=g&&g!==` -`;if(this.options.debug){t&&(this.fullStaticOutput+=g),this.options.stdout.write(this.fullStaticOutput+f);return}if(Oa){t&&this.options.stdout.write(g),this.lastOutput=f;return}if(t&&(this.fullStaticOutput+=g),c>=this.options.stdout.rows){this.options.stdout.write(jU.default.clearTerminal+this.fullStaticOutput+f),this.lastOutput=f;return}t&&(this.log.clear(),this.options.stdout.write(g),this.log(f)),!t&&f!==this.lastOutput&&this.throttledLog(f),this.lastOutput=f},qU.default(this),this.options=u,this.rootNode=bU.createNode("ink-root"),this.rootNode.onRender=u.debug?this.onRender:O5.throttle(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=BU.default.create(u.stdout),this.throttledLog=u.debug?this.log:O5.throttle(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=nm.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=WU.default(this.unmount,{alwaysLast:!1}),process.env.DEV==="true"&&nm.default.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),u.patchConsole&&this.patchConsole(),Oa||(u.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{u.stdout.off("resize",this.onRender)})}render(u){let f=NU.default.createElement(VU.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},u);nm.default.updateContainer(f,this.container,null,I5)}writeToStdout(u){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(u+this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stdout.write(u);return}this.log.clear(),this.options.stdout.write(u),this.log(this.lastOutput)}}writeToStderr(u){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(u),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(Oa){this.options.stderr.write(u);return}this.log.clear(),this.options.stderr.write(u),this.log(this.lastOutput)}}unmount(u){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),Oa?this.options.stdout.write(this.lastOutput+` -`):this.options.debug||this.log.done(),this.isUnmounted=!0,nm.default.updateContainer(null,this.container,null,I5),GU.default.delete(this.options.stdout),u instanceof Error?this.rejectExitPromise(u):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((u,f)=>{this.resolveExitPromise=u,this.rejectExitPromise=f})),this.exitPromise}clear(){!Oa&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=HU.default((u,f)=>{u==="stdout"&&this.writeToStdout(f),u==="stderr"&&(f.startsWith("The above error occurred")||this.writeToStderr(f))}))}};gs.default=P5});var L5=Me(B2=>{"use strict";var F5=B2&&B2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(B2,"__esModule",{value:!0});var YU=F5(M5()),rm=F5(O3()),$U=require("stream"),JU=(i,u)=>{let f=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},KU(u)),c=XU(f.stdout,()=>new YU.default(f));return c.render(i),{rerender:c.render,unmount:()=>c.unmount(),waitUntilExit:c.waitUntilExit,cleanup:()=>rm.default.delete(f.stdout),clear:c.clear}};B2.default=JU;var KU=(i={})=>i instanceof $U.Stream?{stdout:i,stdin:process.stdin}:i,XU=(i,u)=>{let f;return rm.default.has(i)?f=rm.default.get(i):(f=u(),rm.default.set(i,f)),f}});var N5=Me(tf=>{"use strict";var QU=tf&&tf.__createBinding||(Object.create?function(i,u,f,c){c===void 0&&(c=f),Object.defineProperty(i,c,{enumerable:!0,get:function(){return u[f]}})}:function(i,u,f,c){c===void 0&&(c=f),i[c]=u[f]}),ZU=tf&&tf.__setModuleDefault||(Object.create?function(i,u){Object.defineProperty(i,"default",{enumerable:!0,value:u})}:function(i,u){i.default=u}),eq=tf&&tf.__importStar||function(i){if(i&&i.__esModule)return i;var u={};if(i!=null)for(var f in i)f!=="default"&&Object.hasOwnProperty.call(i,f)&&QU(u,i,f);return ZU(u,i),u};Object.defineProperty(tf,"__esModule",{value:!0});var j2=eq(lr()),R5=i=>{let{items:u,children:f,style:c}=i,[g,t]=j2.useState(0),C=j2.useMemo(()=>u.slice(g),[u,g]);j2.useLayoutEffect(()=>{t(u.length)},[u.length]);let A=C.map((D,L)=>f(D,g+L)),x=j2.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},c),[c]);return j2.default.createElement("ink-box",{internal_static:!0,style:x},A)};R5.displayName="Static";tf.default=R5});var j5=Me(U2=>{"use strict";var tq=U2&&U2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(U2,"__esModule",{value:!0});var nq=tq(lr()),B5=({children:i,transform:u})=>i==null?null:nq.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:u},i);B5.displayName="Transform";U2.default=B5});var q5=Me(q2=>{"use strict";var rq=q2&&q2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(q2,"__esModule",{value:!0});var iq=rq(lr()),U5=({count:i=1})=>iq.default.createElement("ink-text",null,` -`.repeat(i));U5.displayName="Newline";q2.default=U5});var H5=Me(z2=>{"use strict";var z5=z2&&z2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(z2,"__esModule",{value:!0});var oq=z5(lr()),uq=z5(tm()),W5=()=>oq.default.createElement(uq.default,{flexGrow:1});W5.displayName="Spacer";z2.default=W5});var im=Me(W2=>{"use strict";var sq=W2&&W2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(W2,"__esModule",{value:!0});var lq=lr(),fq=sq(F3()),cq=()=>lq.useContext(fq.default);W2.default=cq});var G5=Me(H2=>{"use strict";var aq=H2&&H2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(H2,"__esModule",{value:!0});var b5=lr(),dq=aq(im()),pq=(i,u={})=>{let{stdin:f,setRawMode:c,internal_exitOnCtrlC:g}=dq.default();b5.useEffect(()=>{if(u.isActive!==!1)return c(!0),()=>{c(!1)}},[u.isActive,c]),b5.useEffect(()=>{if(u.isActive===!1)return;let t=C=>{let A=String(C),x={upArrow:A==="",downArrow:A==="",leftArrow:A==="",rightArrow:A==="",pageDown:A==="[6~",pageUp:A==="[5~",return:A==="\r",escape:A==="",ctrl:!1,shift:!1,tab:A===" "||A==="",backspace:A==="\b",delete:A==="\x7F"||A==="[3~",meta:!1};A<=""&&!x.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),x.ctrl=!0),A.startsWith("")&&(A=A.slice(1),x.meta=!0);let D=A>="A"&&A<="Z",L=A>="\u0410"&&A<="\u042F";A.length===1&&(D||L)&&(x.shift=!0),x.tab&&A==="[Z"&&(x.shift=!0),(x.tab||x.backspace||x.delete)&&(A=""),(!(A==="c"&&x.ctrl)||!g)&&i(A,x)};return f==null||f.on("data",t),()=>{f==null||f.off("data",t)}},[u.isActive,f,g,i])};H2.default=pq});var V5=Me(b2=>{"use strict";var hq=b2&&b2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(b2,"__esModule",{value:!0});var mq=lr(),vq=hq(P3()),gq=()=>mq.useContext(vq.default);b2.default=gq});var Y5=Me(G2=>{"use strict";var _q=G2&&G2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(G2,"__esModule",{value:!0});var yq=lr(),wq=_q(R3()),Dq=()=>yq.useContext(wq.default);G2.default=Dq});var $5=Me(V2=>{"use strict";var Eq=V2&&V2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(V2,"__esModule",{value:!0});var Sq=lr(),Cq=Eq(B3()),Tq=()=>Sq.useContext(Cq.default);V2.default=Tq});var X5=Me(Y2=>{"use strict";var K5=Y2&&Y2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(Y2,"__esModule",{value:!0});var $2=lr(),xq=K5(Zh()),kq=K5(im()),Aq=({isActive:i=!0,autoFocus:u=!1}={})=>{let{isRawModeSupported:f,setRawMode:c}=kq.default(),{activeId:g,add:t,remove:C,activate:A,deactivate:x}=$2.useContext(xq.default),D=$2.useMemo(()=>Math.random().toString().slice(2,7),[]);return $2.useEffect(()=>(t(D,{autoFocus:u}),()=>{C(D)}),[D,u]),$2.useEffect(()=>{i?A(D):x(D)},[i,D]),$2.useEffect(()=>{if(!(!f||!i))return c(!0),()=>{c(!1)}},[i]),{isFocused:Boolean(D)&&g===D}};Y2.default=Aq});var J5=Me(K2=>{"use strict";var Oq=K2&&K2.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(K2,"__esModule",{value:!0});var Iq=lr(),Pq=Oq(Zh()),Mq=()=>{let i=Iq.useContext(Pq.default);return{enableFocus:i.enableFocus,disableFocus:i.disableFocus,focusNext:i.focusNext,focusPrevious:i.focusPrevious}};K2.default=Mq});var Q5=Me(b3=>{"use strict";Object.defineProperty(b3,"__esModule",{value:!0});b3.default=i=>{var u,f,c,g;return{width:(f=(u=i.yogaNode)===null||u===void 0?void 0:u.getComputedWidth())!==null&&f!==void 0?f:0,height:(g=(c=i.yogaNode)===null||c===void 0?void 0:c.getComputedHeight())!==null&&g!==void 0?g:0}}});var ys=Me(ji=>{"use strict";Object.defineProperty(ji,"__esModule",{value:!0});var Fq=L5();Object.defineProperty(ji,"render",{enumerable:!0,get:function(){return Fq.default}});var Lq=tm();Object.defineProperty(ji,"Box",{enumerable:!0,get:function(){return Lq.default}});var Rq=W3();Object.defineProperty(ji,"Text",{enumerable:!0,get:function(){return Rq.default}});var Nq=N5();Object.defineProperty(ji,"Static",{enumerable:!0,get:function(){return Nq.default}});var Bq=j5();Object.defineProperty(ji,"Transform",{enumerable:!0,get:function(){return Bq.default}});var jq=q5();Object.defineProperty(ji,"Newline",{enumerable:!0,get:function(){return jq.default}});var Uq=H5();Object.defineProperty(ji,"Spacer",{enumerable:!0,get:function(){return Uq.default}});var qq=G5();Object.defineProperty(ji,"useInput",{enumerable:!0,get:function(){return qq.default}});var zq=V5();Object.defineProperty(ji,"useApp",{enumerable:!0,get:function(){return zq.default}});var Wq=im();Object.defineProperty(ji,"useStdin",{enumerable:!0,get:function(){return Wq.default}});var Hq=Y5();Object.defineProperty(ji,"useStdout",{enumerable:!0,get:function(){return Hq.default}});var bq=$5();Object.defineProperty(ji,"useStderr",{enumerable:!0,get:function(){return bq.default}});var Gq=X5();Object.defineProperty(ji,"useFocus",{enumerable:!0,get:function(){return Gq.default}});var Vq=J5();Object.defineProperty(ji,"useFocusManager",{enumerable:!0,get:function(){return Vq.default}});var Yq=Q5();Object.defineProperty(ji,"measureElement",{enumerable:!0,get:function(){return Yq.default}})});var lC=Me(X2=>{"use strict";Object.defineProperty(X2,"__esModule",{value:!0});X2.UncontrolledTextInput=void 0;var oC=lr(),Y3=lr(),uC=ys(),Sc=Jh(),sC=({value:i,placeholder:u="",focus:f=!0,mask:c,highlightPastedText:g=!1,showCursor:t=!0,onChange:C,onSubmit:A})=>{let[{cursorOffset:x,cursorWidth:D},L]=Y3.useState({cursorOffset:(i||"").length,cursorWidth:0});Y3.useEffect(()=>{L(re=>{if(!f||!t)return re;let ce=i||"";return re.cursorOffset>ce.length-1?{cursorOffset:ce.length,cursorWidth:0}:re})},[i,f,t]);let N=g?D:0,j=c?c.repeat(i.length):i,$=j,h=u?Sc.grey(u):void 0;if(t&&f){h=u.length>0?Sc.inverse(u[0])+Sc.grey(u.slice(1)):Sc.inverse(" "),$=j.length>0?"":Sc.inverse(" ");let re=0;for(let ce of j)re>=x-N&&re<=x?$+=Sc.inverse(ce):$+=ce,re++;j.length>0&&x===j.length&&($+=Sc.inverse(" "))}return uC.useInput((re,ce)=>{if(ce.upArrow||ce.downArrow||ce.ctrl&&re==="c"||ce.tab||ce.shift&&ce.tab)return;if(ce.return){A&&A(i);return}let Q=x,oe=i,Se=0;ce.leftArrow?t&&Q--:ce.rightArrow?t&&Q++:ce.backspace||ce.delete?x>0&&(oe=i.slice(0,x-1)+i.slice(x,i.length),Q--):(oe=i.slice(0,x)+re+i.slice(x,i.length),Q+=re.length,re.length>1&&(Se=re.length)),x<0&&(Q=0),x>i.length&&(Q=i.length),L({cursorOffset:Q,cursorWidth:Se}),oe!==i&&C(oe)},{isActive:f}),oC.createElement(uC.Text,null,u?j.length>0?$:h:$)};X2.default=sC;X2.UncontrolledTextInput=i=>{let[u,f]=Y3.useState("");return oC.createElement(sC,Object.assign({},i,{value:u,onChange:f}))}});var cC=Me(pm=>{"use strict";Object.defineProperty(pm,"__esModule",{value:!0});function J2(i){let u=[...i.caches],f=u.shift();return f===void 0?fC():{get(c,g,t={miss:()=>Promise.resolve()}){return f.get(c,g,t).catch(()=>J2({caches:u}).get(c,g,t))},set(c,g){return f.set(c,g).catch(()=>J2({caches:u}).set(c,g))},delete(c){return f.delete(c).catch(()=>J2({caches:u}).delete(c))},clear(){return f.clear().catch(()=>J2({caches:u}).clear())}}}function fC(){return{get(i,u,f={miss:()=>Promise.resolve()}){return u().then(g=>Promise.all([g,f.miss(g)])).then(([g])=>g)},set(i,u){return Promise.resolve(u)},delete(i){return Promise.resolve()},clear(){return Promise.resolve()}}}pm.createFallbackableCache=J2;pm.createNullCache=fC});var dC=Me((fV,aC)=>{aC.exports=cC()});var pC=Me($3=>{"use strict";Object.defineProperty($3,"__esModule",{value:!0});function $q(i={serializable:!0}){let u={};return{get(f,c,g={miss:()=>Promise.resolve()}){let t=JSON.stringify(f);if(t in u)return Promise.resolve(i.serializable?JSON.parse(u[t]):u[t]);let C=c(),A=g&&g.miss||(()=>Promise.resolve());return C.then(x=>A(x)).then(()=>C)},set(f,c){return u[JSON.stringify(f)]=i.serializable?JSON.stringify(c):c,Promise.resolve(c)},delete(f){return delete u[JSON.stringify(f)],Promise.resolve()},clear(){return u={},Promise.resolve()}}}$3.createInMemoryCache=$q});var mC=Me((aV,hC)=>{hC.exports=pC()});var gC=Me(ws=>{"use strict";Object.defineProperty(ws,"__esModule",{value:!0});function Kq(i,u,f){let c={"x-algolia-api-key":f,"x-algolia-application-id":u};return{headers(){return i===K3.WithinHeaders?c:{}},queryParameters(){return i===K3.WithinQueryParameters?c:{}}}}function Xq(i){let u=0,f=()=>(u++,new Promise(c=>{setTimeout(()=>{c(i(f))},Math.min(100*u,1e3))}));return i(f)}function vC(i,u=(f,c)=>Promise.resolve()){return Object.assign(i,{wait(f){return vC(i.then(c=>Promise.all([u(c,f),c])).then(c=>c[1]))}})}function Jq(i){let u=i.length-1;for(u;u>0;u--){let f=Math.floor(Math.random()*(u+1)),c=i[u];i[u]=i[f],i[f]=c}return i}function Qq(i,u){return Object.keys(u!==void 0?u:{}).forEach(f=>{i[f]=u[f](i)}),i}function Zq(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}var ez="4.2.0",tz=i=>()=>i.transporter.requester.destroy(),K3={WithinQueryParameters:0,WithinHeaders:1};ws.AuthMode=K3;ws.addMethods=Qq;ws.createAuth=Kq;ws.createRetryablePromise=Xq;ws.createWaitablePromise=vC;ws.destroy=tz;ws.encode=Zq;ws.shuffle=Jq;ws.version=ez});var Q2=Me((pV,_C)=>{_C.exports=gC()});var yC=Me(X3=>{"use strict";Object.defineProperty(X3,"__esModule",{value:!0});var nz={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};X3.MethodEnum=nz});var Z2=Me((mV,wC)=>{wC.exports=yC()});var RC=Me(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});var DC=Z2();function J3(i,u){let f=i||{},c=f.data||{};return Object.keys(f).forEach(g=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(g)===-1&&(c[g]=f[g])}),{data:Object.entries(c).length>0?c:void 0,timeout:f.timeout||u,headers:f.headers||{},queryParameters:f.queryParameters||{},cacheable:f.cacheable}}var hm={Read:1,Write:2,Any:3},Ia={Up:1,Down:2,Timeouted:3},EC=2*60*1e3;function Q3(i,u=Ia.Up){return zn(dt({},i),{status:u,lastUpdate:Date.now()})}function SC(i){return i.status===Ia.Up||Date.now()-i.lastUpdate>EC}function CC(i){return i.status===Ia.Timeouted&&Date.now()-i.lastUpdate<=EC}function Z3(i){return{protocol:i.protocol||"https",url:i.url,accept:i.accept||hm.Any}}function rz(i,u){return Promise.all(u.map(f=>i.get(f,()=>Promise.resolve(Q3(f))))).then(f=>{let c=f.filter(A=>SC(A)),g=f.filter(A=>CC(A)),t=[...c,...g],C=t.length>0?t.map(A=>Z3(A)):u;return{getTimeout(A,x){return(g.length===0&&A===0?1:g.length+3+A)*x},statelessHosts:C}})}var iz=({isTimedOut:i,status:u})=>!i&&~~u==0,oz=i=>{let u=i.status;return i.isTimedOut||iz(i)||~~(u/100)!=2&&~~(u/100)!=4},uz=({status:i})=>~~(i/100)==2,sz=(i,u)=>oz(i)?u.onRetry(i):uz(i)?u.onSucess(i):u.onFail(i);function PC(i,u,f,c){let g=[],t=AC(f,c),C=OC(i,c),A=f.method,x=f.method!==DC.MethodEnum.Get?{}:dt(dt({},f.data),c.data),D=dt(dt(dt({"x-algolia-agent":i.userAgent.value},i.queryParameters),x),c.queryParameters),L=0,N=(j,$)=>{let h=j.pop();if(h===void 0)throw IC(ew(g));let re={data:t,headers:C,method:A,url:kC(h,f.path,D),connectTimeout:$(L,i.timeouts.connect),responseTimeout:$(L,c.timeout)},ce=oe=>{let Se={request:re,response:oe,host:h,triesLeft:j.length};return g.push(Se),Se},Q={onSucess:oe=>TC(oe),onRetry(oe){let Se=ce(oe);return oe.isTimedOut&&L++,Promise.all([i.logger.info("Retryable failure",tw(Se)),i.hostsCache.set(h,Q3(h,oe.isTimedOut?Ia.Timeouted:Ia.Down))]).then(()=>N(j,$))},onFail(oe){throw ce(oe),xC(oe,ew(g))}};return i.requester.send(re).then(oe=>sz(oe,Q))};return rz(i.hostsCache,u).then(j=>N([...j.statelessHosts].reverse(),j.getTimeout))}function lz(i){let{hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,hosts:x,queryParameters:D,headers:L}=i,N={hostsCache:u,logger:f,requester:c,requestsCache:g,responsesCache:t,timeouts:C,userAgent:A,headers:L,queryParameters:D,hosts:x.map(j=>Z3(j)),read(j,$){let h=J3($,N.timeouts.read),re=()=>PC(N,N.hosts.filter(oe=>(oe.accept&hm.Read)!=0),j,h);if((h.cacheable!==void 0?h.cacheable:j.cacheable)!==!0)return re();let Q={request:j,mappedRequestOptions:h,transporter:{queryParameters:N.queryParameters,headers:N.headers}};return N.responsesCache.get(Q,()=>N.requestsCache.get(Q,()=>N.requestsCache.set(Q,re()).then(oe=>Promise.all([N.requestsCache.delete(Q),oe]),oe=>Promise.all([N.requestsCache.delete(Q),Promise.reject(oe)])).then(([oe,Se])=>Se)),{miss:oe=>N.responsesCache.set(Q,oe)})},write(j,$){return PC(N,N.hosts.filter(h=>(h.accept&hm.Write)!=0),j,J3($,N.timeouts.write))}};return N}function fz(i){let u={value:`Algolia for JavaScript (${i})`,add(f){let c=`; ${f.segment}${f.version!==void 0?` (${f.version})`:""}`;return u.value.indexOf(c)===-1&&(u.value=`${u.value}${c}`),u}};return u}function TC(i){try{return JSON.parse(i.content)}catch(u){throw MC(u.message,i)}}function xC({content:i,status:u},f){let c=i;try{c=JSON.parse(i).message}catch(g){}return FC(c,u,f)}function cz(i,...u){let f=0;return i.replace(/%s/g,()=>encodeURIComponent(u[f++]))}function kC(i,u,f){let c=LC(f),g=`${i.protocol}://${i.url}/${u.charAt(0)==="/"?u.substr(1):u}`;return c.length&&(g+=`?${c}`),g}function LC(i){let u=f=>Object.prototype.toString.call(f)==="[object Object]"||Object.prototype.toString.call(f)==="[object Array]";return Object.keys(i).map(f=>cz("%s=%s",f,u(i[f])?JSON.stringify(i[f]):i[f])).join("&")}function AC(i,u){if(i.method===DC.MethodEnum.Get||i.data===void 0&&u.data===void 0)return;let f=Array.isArray(i.data)?i.data:dt(dt({},i.data),u.data);return JSON.stringify(f)}function OC(i,u){let f=dt(dt({},i.headers),u.headers),c={};return Object.keys(f).forEach(g=>{let t=f[g];c[g.toLowerCase()]=t}),c}function ew(i){return i.map(u=>tw(u))}function tw(i){let u=i.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return zn(dt({},i),{request:zn(dt({},i.request),{headers:dt(dt({},i.request.headers),u)})})}function FC(i,u,f){return{name:"ApiError",message:i,status:u,transporterStackTrace:f}}function MC(i,u){return{name:"DeserializationError",message:i,response:u}}function IC(i){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:i}}y0.CallEnum=hm;y0.HostStatusEnum=Ia;y0.createApiError=FC;y0.createDeserializationError=MC;y0.createMappedRequestOptions=J3;y0.createRetryError=IC;y0.createStatefulHost=Q3;y0.createStatelessHost=Z3;y0.createTransporter=lz;y0.createUserAgent=fz;y0.deserializeFailure=xC;y0.deserializeSuccess=TC;y0.isStatefulHostTimeouted=CC;y0.isStatefulHostUp=SC;y0.serializeData=AC;y0.serializeHeaders=OC;y0.serializeQueryParameters=LC;y0.serializeUrl=kC;y0.stackFrameWithoutCredentials=tw;y0.stackTraceWithoutCredentials=ew});var ed=Me((gV,NC)=>{NC.exports=RC()});var BC=Me(Hf=>{"use strict";Object.defineProperty(Hf,"__esModule",{value:!0});var Pa=Q2(),az=ed(),td=Z2(),dz=i=>{let u=i.region||"us",f=Pa.createAuth(Pa.AuthMode.WithinHeaders,i.appId,i.apiKey),c=az.createTransporter(zn(dt({hosts:[{url:`analytics.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g=i.appId;return Pa.addMethods({appId:g,transporter:c},i.methods)},pz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:"2/abtests",data:u},f),hz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Delete,path:Pa.encode("2/abtests/%s",u)},f),mz=i=>(u,f)=>i.transporter.read({method:td.MethodEnum.Get,path:Pa.encode("2/abtests/%s",u)},f),vz=i=>u=>i.transporter.read({method:td.MethodEnum.Get,path:"2/abtests"},u),gz=i=>(u,f)=>i.transporter.write({method:td.MethodEnum.Post,path:Pa.encode("2/abtests/%s/stop",u)},f);Hf.addABTest=pz;Hf.createAnalyticsClient=dz;Hf.deleteABTest=hz;Hf.getABTest=mz;Hf.getABTests=vz;Hf.stopABTest=gz});var UC=Me((yV,jC)=>{jC.exports=BC()});var zC=Me(nd=>{"use strict";Object.defineProperty(nd,"__esModule",{value:!0});var nw=Q2(),_z=ed(),qC=Z2(),yz=i=>{let u=i.region||"us",f=nw.createAuth(nw.AuthMode.WithinHeaders,i.appId,i.apiKey),c=_z.createTransporter(zn(dt({hosts:[{url:`recommendation.${u}.algolia.com`}]},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/json"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)}));return nw.addMethods({appId:i.appId,transporter:c},i.methods)},wz=i=>u=>i.transporter.read({method:qC.MethodEnum.Get,path:"1/strategies/personalization"},u),Dz=i=>(u,f)=>i.transporter.write({method:qC.MethodEnum.Post,path:"1/strategies/personalization",data:u},f);nd.createRecommendationClient=yz;nd.getPersonalizationStrategy=wz;nd.setPersonalizationStrategy=Dz});var HC=Me((DV,WC)=>{WC.exports=zC()});var nT=Me(yt=>{"use strict";Object.defineProperty(yt,"__esModule",{value:!0});var Wt=Q2(),jo=ed(),Rn=Z2(),Ez=require("crypto");function mm(i){let u=f=>i.request(f).then(c=>{if(i.batch!==void 0&&i.batch(c.hits),!i.shouldStop(c))return c.cursor?u({cursor:c.cursor}):u({page:(f.page||0)+1})});return u({})}var Sz=i=>{let u=i.appId,f=Wt.createAuth(i.authMode!==void 0?i.authMode:Wt.AuthMode.WithinHeaders,u,i.apiKey),c=jo.createTransporter(zn(dt({hosts:[{url:`${u}-dsn.algolia.net`,accept:jo.CallEnum.Read},{url:`${u}.algolia.net`,accept:jo.CallEnum.Write}].concat(Wt.shuffle([{url:`${u}-1.algolianet.com`},{url:`${u}-2.algolianet.com`},{url:`${u}-3.algolianet.com`}]))},i),{headers:dt(zn(dt({},f.headers()),{"content-type":"application/x-www-form-urlencoded"}),i.headers),queryParameters:dt(dt({},f.queryParameters()),i.queryParameters)})),g={transporter:c,appId:u,addAlgoliaAgent(t,C){c.userAgent.add({segment:t,version:C})},clearCache(){return Promise.all([c.requestsCache.clear(),c.responsesCache.clear()]).then(()=>{})}};return Wt.addMethods(g,i.methods)};function bC(){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 GC(){return{name:"ObjectNotFoundError",message:"Object not found."}}function VC(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Cz=i=>(u,f)=>{let A=f||{},{queryParameters:c}=A,g=Si(A,["queryParameters"]),t=dt({acl:u},c!==void 0?{queryParameters:c}:{}),C=(x,D)=>Wt.createRetryablePromise(L=>rd(i)(x.key,D).catch(N=>{if(N.status!==404)throw N;return L()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/keys",data:t},g),C)},Tz=i=>(u,f,c)=>{let g=jo.createMappedRequestOptions(c);return g.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:f}},g)},xz=i=>(u,f,c)=>i.transporter.write({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:u,cluster:f}},c),vm=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"copy",destination:f}},c),g)},kz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Rules]})),Az=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Settings]})),Oz=i=>(u,f,c)=>vm(i)(u,f,zn(dt({},c),{scope:[gm.Synonyms]})),Iz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).then(C).catch(A=>{if(A.status!==404)throw A}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/keys/%s",u)},f),c)},Pz=()=>(i,u)=>{let f=jo.serializeQueryParameters(u),c=Ez.createHmac("sha256",i).update(f).digest("hex");return Buffer.from(c+f).toString("base64")},rd=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/keys/%s",u)},f),Mz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/logs"},u),Fz=()=>i=>{let u=Buffer.from(i,"base64").toString("ascii"),f=/validUntil=(\d+)/,c=u.match(f);if(c===null)throw VC();return parseInt(c[1],10)-Math.round(new Date().getTime()/1e3)},Lz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/top"},u),Rz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/clusters/mapping/%s",u)},f),Nz=i=>u=>{let g=u||{},{retrieveMappings:f}=g,c=Si(g,["retrieveMappings"]);return f===!0&&(c.getClusters=!0),i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping/pending"},c)},id=i=>(u,f={})=>{let c={transporter:i.transporter,appId:i.appId,indexName:u};return Wt.addMethods(c,f.methods)},Bz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/keys"},u),jz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters"},u),Uz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/indexes"},u),qz=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:"1/clusters/mapping"},u),zz=i=>(u,f,c)=>{let g=(t,C)=>id(i)(u,{methods:{waitTask:z0}}).waitTask(t.taskID,C);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",u),data:{operation:"move",destination:f}},c),g)},Wz=i=>(u,f)=>{let c=(g,t)=>Promise.all(Object.keys(g.taskID).map(C=>id(i)(C,{methods:{waitTask:z0}}).waitTask(g.taskID[C],t)));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:u}},f),c)},Hz=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:u}},f),bz=i=>(u,f)=>{let c=u.map(g=>zn(dt({},g),{params:jo.serializeQueryParameters(g.params||{})}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:c},cacheable:!0},f)},Gz=i=>(u,f)=>Promise.all(u.map(c=>{let A=c.params,{facetName:g,facetQuery:t}=A,C=Si(A,["facetName","facetQuery"]);return id(i)(c.indexName,{methods:{searchForFacetValues:YC}}).searchForFacetValues(g,t,dt(dt({},f),C))})),Vz=i=>(u,f)=>{let c=jo.createMappedRequestOptions(f);return c.queryParameters["X-Algolia-User-ID"]=u,i.transporter.write({method:Rn.MethodEnum.Delete,path:"1/clusters/mapping"},c)},Yz=i=>(u,f)=>{let c=(g,t)=>Wt.createRetryablePromise(C=>rd(i)(u,t).catch(A=>{if(A.status!==404)throw A;return C()}));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/keys/%s/restore",u)},f),c)},$z=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:u}},f),Kz=i=>(u,f)=>{let c=Object.assign({},f),L=f||{},{queryParameters:g}=L,t=Si(L,["queryParameters"]),C=g?{queryParameters:g}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],x=N=>Object.keys(c).filter(j=>A.indexOf(j)!==-1).every(j=>N[j]===c[j]),D=(N,j)=>Wt.createRetryablePromise($=>rd(i)(u,j).then(h=>x(h)?Promise.resolve():$()));return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/keys/%s",u),data:C},t),D)},$C=i=>(u,f)=>{let c=(g,t)=>z0(i)(g.taskID,t);return Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/batch",i.indexName),data:{requests:u}},f),c)},Xz=i=>u=>mm(zn(dt({},u),{shouldStop:f=>f.cursor===void 0,request:f=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/browse",i.indexName),data:f},u)})),Jz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},Qz=i=>u=>{let f=dt({hitsPerPage:1e3},u);return mm(zn(dt({},f),{shouldStop:c=>c.hits.lengthzn(dt({},g),{hits:g.hits.map(t=>(delete t._highlightResult,t))}))}}))},_m=i=>(u,f,c)=>{let x=c||{},{batchSize:g}=x,t=Si(x,["batchSize"]),C={taskIDs:[],objectIDs:[]},A=(D=0)=>{let L=[],N;for(N=D;N({action:f,body:j})),t).then(j=>(C.objectIDs=C.objectIDs.concat(j.objectIDs),C.taskIDs.push(j.taskID),N++,A(N)))};return Wt.createWaitablePromise(A(),(D,L)=>Promise.all(D.taskIDs.map(N=>z0(i)(N,L))))},Zz=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/clear",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),eW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},tW=i=>u=>{let t=u||{},{forwardToReplicas:f}=t,c=Si(t,["forwardToReplicas"]),g=jo.createMappedRequestOptions(c);return f&&(g.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/clear",i.indexName)},g),(C,A)=>z0(i)(C.taskID,A))},nW=i=>(u,f)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/deleteByQuery",i.indexName),data:u},f),(c,g)=>z0(i)(c.taskID,g)),rW=i=>u=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s",i.indexName)},u),(f,c)=>z0(i)(f.taskID,c)),iW=i=>(u,f)=>Wt.createWaitablePromise(JC(i)([u],f).then(c=>({taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),JC=i=>(u,f)=>{let c=u.map(g=>({objectID:g}));return _m(i)(c,Cc.DeleteObject,f)},oW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},uW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},t),(A,x)=>z0(i)(A.taskID,x))},sW=i=>u=>QC(i)(u).then(()=>!0).catch(f=>{if(f.status!==404)throw f;return!1}),lW=i=>(u,f)=>{let x=f||{},{query:c,paginate:g}=x,t=Si(x,["query","paginate"]),C=0,A=()=>ZC(i)(c||"",zn(dt({},t),{page:C})).then(D=>{for(let[L,N]of Object.entries(D.hits))if(u(N))return{object:N,position:parseInt(L,10),page:C};if(C++,g===!1||C>=D.nbPages)throw GC();return A()});return A()},fW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/%s",i.indexName,u)},f),cW=()=>(i,u)=>{for(let[f,c]of Object.entries(i.hits))if(c.objectID===u)return parseInt(f,10);return-1},aW=i=>(u,f)=>{let C=f||{},{attributesToRetrieve:c}=C,g=Si(C,["attributesToRetrieve"]),t=u.map(A=>dt({indexName:i.indexName,objectID:A},c?{attributesToRetrieve:c}:{}));return i.transporter.read({method:Rn.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:t}},g)},dW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/rules/%s",i.indexName,u)},f),QC=i=>u=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:{getVersion:2}},u),pW=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/synonyms/%s",i.indexName,u)},f),eT=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Get,path:Wt.encode("1/indexes/%s/task/%s",i.indexName,u.toString())},f),hW=i=>(u,f)=>Wt.createWaitablePromise(tT(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),tT=i=>(u,f)=>{let C=f||{},{createIfNotExists:c}=C,g=Si(C,["createIfNotExists"]),t=c?Cc.PartialUpdateObject:Cc.PartialUpdateObjectNoCreate;return _m(i)(u,t,g)},mW=i=>(u,f)=>{let h=f||{},{safe:c,autoGenerateObjectIDIfNotExist:g,batchSize:t}=h,C=Si(h,["safe","autoGenerateObjectIDIfNotExist","batchSize"]),A=(re,ce,Q,oe)=>Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",re),data:{operation:Q,destination:ce}},oe),(Se,me)=>z0(i)(Se.taskID,me)),x=Math.random().toString(36).substring(7),D=`${i.indexName}_tmp_${x}`,L=rw({appId:i.appId,transporter:i.transporter,indexName:D}),N=[],j=A(i.indexName,D,"copy",zn(dt({},C),{scope:["settings","synonyms","rules"]}));N.push(j);let $=(c?j.wait(C):j).then(()=>{let re=L(u,zn(dt({},C),{autoGenerateObjectIDIfNotExist:g,batchSize:t}));return N.push(re),c?re.wait(C):re}).then(()=>{let re=A(D,i.indexName,"move",C);return N.push(re),c?re.wait(C):re}).then(()=>Promise.all(N)).then(([re,ce,Q])=>({objectIDs:ce.objectIDs,taskIDs:[re.taskID,...ce.taskIDs,Q.taskID]}));return Wt.createWaitablePromise($,(re,ce)=>Promise.all(N.map(Q=>Q.wait(ce))))},vW=i=>(u,f)=>iw(i)(u,zn(dt({},f),{clearExistingRules:!0})),gW=i=>(u,f)=>ow(i)(u,zn(dt({},f),{replaceExistingSynonyms:!0})),_W=i=>(u,f)=>Wt.createWaitablePromise(rw(i)([u],f).then(c=>({objectID:c.objectIDs[0],taskID:c.taskIDs[0]})),(c,g)=>z0(i)(c.taskID,g)),rw=i=>(u,f)=>{let C=f||{},{autoGenerateObjectIDIfNotExist:c}=C,g=Si(C,["autoGenerateObjectIDIfNotExist"]),t=c?Cc.AddObject:Cc.UpdateObject;if(t===Cc.UpdateObject){for(let A of u)if(A.objectID===void 0)return Wt.createWaitablePromise(Promise.reject(bC()))}return _m(i)(u,t,g)},yW=i=>(u,f)=>iw(i)([u],f),iw=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,clearExistingRules:g}=A,t=Si(A,["forwardToReplicas","clearExistingRules"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.clearExistingRules=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},wW=i=>(u,f)=>ow(i)([u],f),ow=i=>(u,f)=>{let A=f||{},{forwardToReplicas:c,replaceExistingSynonyms:g}=A,t=Si(A,["forwardToReplicas","replaceExistingSynonyms"]),C=jo.createMappedRequestOptions(t);return c&&(C.queryParameters.forwardToReplicas=1),g&&(C.queryParameters.replaceExistingSynonyms=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/batch",i.indexName),data:u},C),(x,D)=>z0(i)(x.taskID,D))},ZC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/query",i.indexName),data:{query:u},cacheable:!0},f),YC=i=>(u,f,c)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/facets/%s/query",i.indexName,u),data:{facetQuery:f},cacheable:!0},c),KC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/search",i.indexName),data:{query:u}},f),XC=i=>(u,f)=>i.transporter.read({method:Rn.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/search",i.indexName),data:{query:u}},f),DW=i=>(u,f)=>{let C=f||{},{forwardToReplicas:c}=C,g=Si(C,["forwardToReplicas"]),t=jo.createMappedRequestOptions(g);return c&&(t.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(i.transporter.write({method:Rn.MethodEnum.Put,path:Wt.encode("1/indexes/%s/settings",i.indexName),data:u},t),(A,x)=>z0(i)(A.taskID,x))},z0=i=>(u,f)=>Wt.createRetryablePromise(c=>eT(i)(u,f).then(g=>g.status!=="published"?c():void 0)),EW={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"},Cc={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject"},gm={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},SW={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},CW={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};yt.ApiKeyACLEnum=EW;yt.BatchActionEnum=Cc;yt.ScopeEnum=gm;yt.StrategyEnum=SW;yt.SynonymEnum=CW;yt.addApiKey=Cz;yt.assignUserID=Tz;yt.assignUserIDs=xz;yt.batch=$C;yt.browseObjects=Xz;yt.browseRules=Jz;yt.browseSynonyms=Qz;yt.chunkedBatch=_m;yt.clearObjects=Zz;yt.clearRules=eW;yt.clearSynonyms=tW;yt.copyIndex=vm;yt.copyRules=kz;yt.copySettings=Az;yt.copySynonyms=Oz;yt.createBrowsablePromise=mm;yt.createMissingObjectIDError=bC;yt.createObjectNotFoundError=GC;yt.createSearchClient=Sz;yt.createValidUntilNotFoundError=VC;yt.deleteApiKey=Iz;yt.deleteBy=nW;yt.deleteIndex=rW;yt.deleteObject=iW;yt.deleteObjects=JC;yt.deleteRule=oW;yt.deleteSynonym=uW;yt.exists=sW;yt.findObject=lW;yt.generateSecuredApiKey=Pz;yt.getApiKey=rd;yt.getLogs=Mz;yt.getObject=fW;yt.getObjectPosition=cW;yt.getObjects=aW;yt.getRule=dW;yt.getSecuredApiKeyRemainingValidity=Fz;yt.getSettings=QC;yt.getSynonym=pW;yt.getTask=eT;yt.getTopUserIDs=Lz;yt.getUserID=Rz;yt.hasPendingMappings=Nz;yt.initIndex=id;yt.listApiKeys=Bz;yt.listClusters=jz;yt.listIndices=Uz;yt.listUserIDs=qz;yt.moveIndex=zz;yt.multipleBatch=Wz;yt.multipleGetObjects=Hz;yt.multipleQueries=bz;yt.multipleSearchForFacetValues=Gz;yt.partialUpdateObject=hW;yt.partialUpdateObjects=tT;yt.removeUserID=Vz;yt.replaceAllObjects=mW;yt.replaceAllRules=vW;yt.replaceAllSynonyms=gW;yt.restoreApiKey=Yz;yt.saveObject=_W;yt.saveObjects=rw;yt.saveRule=yW;yt.saveRules=iw;yt.saveSynonym=wW;yt.saveSynonyms=ow;yt.search=ZC;yt.searchForFacetValues=YC;yt.searchRules=KC;yt.searchSynonyms=XC;yt.searchUserIDs=$z;yt.setSettings=DW;yt.updateApiKey=Kz;yt.waitTask=z0});var iT=Me((SV,rT)=>{rT.exports=nT()});var oT=Me(ym=>{"use strict";Object.defineProperty(ym,"__esModule",{value:!0});function TW(){return{debug(i,u){return Promise.resolve()},info(i,u){return Promise.resolve()},error(i,u){return Promise.resolve()}}}var xW={Debug:1,Info:2,Error:3};ym.LogLevelEnum=xW;ym.createNullLogger=TW});var sT=Me((TV,uT)=>{uT.exports=oT()});var cT=Me(uw=>{"use strict";Object.defineProperty(uw,"__esModule",{value:!0});var lT=require("http"),fT=require("https"),kW=require("url");function AW(){let i={keepAlive:!0},u=new lT.Agent(i),f=new fT.Agent(i);return{send(c){return new Promise(g=>{let t=kW.parse(c.url),C=t.query===null?t.pathname:`${t.pathname}?${t.query}`,A=dt({agent:t.protocol==="https:"?f:u,hostname:t.hostname,path:C,method:c.method,headers:c.headers},t.port!==void 0?{port:t.port||""}:{}),x=(t.protocol==="https:"?fT:lT).request(A,j=>{let $="";j.on("data",h=>$+=h),j.on("end",()=>{clearTimeout(L),clearTimeout(N),g({status:j.statusCode||0,content:$,isTimedOut:!1})})}),D=(j,$)=>setTimeout(()=>{x.abort(),g({status:0,content:$,isTimedOut:!0})},j*1e3),L=D(c.connectTimeout,"Connection timeout"),N;x.on("error",j=>{clearTimeout(L),clearTimeout(N),g({status:0,content:j.message,isTimedOut:!1})}),x.once("response",()=>{clearTimeout(L),N=D(c.responseTimeout,"Socket timeout")}),c.data!==void 0&&x.write(c.data),x.end()})},destroy(){return u.destroy(),f.destroy(),Promise.resolve()}}}uw.createNodeHttpRequester=AW});var dT=Me((kV,aT)=>{aT.exports=cT()});var vT=Me((AV,pT)=>{"use strict";var hT=dC(),OW=mC(),Ma=UC(),sw=Q2(),lw=HC(),Mt=iT(),IW=sT(),PW=dT(),MW=ed();function mT(i,u,f){let c={appId:i,apiKey:u,timeouts:{connect:2,read:5,write:30},requester:PW.createNodeHttpRequester(),logger:IW.createNullLogger(),responsesCache:hT.createNullCache(),requestsCache:hT.createNullCache(),hostsCache:OW.createInMemoryCache(),userAgent:MW.createUserAgent(sw.version).add({segment:"Node.js",version:process.versions.node})};return Mt.createSearchClient(zn(dt(dt({},c),f),{methods:{search:Mt.multipleQueries,searchForFacetValues:Mt.multipleSearchForFacetValues,multipleBatch:Mt.multipleBatch,multipleGetObjects:Mt.multipleGetObjects,multipleQueries:Mt.multipleQueries,copyIndex:Mt.copyIndex,copySettings:Mt.copySettings,copyRules:Mt.copyRules,copySynonyms:Mt.copySynonyms,moveIndex:Mt.moveIndex,listIndices:Mt.listIndices,getLogs:Mt.getLogs,listClusters:Mt.listClusters,multipleSearchForFacetValues:Mt.multipleSearchForFacetValues,getApiKey:Mt.getApiKey,addApiKey:Mt.addApiKey,listApiKeys:Mt.listApiKeys,updateApiKey:Mt.updateApiKey,deleteApiKey:Mt.deleteApiKey,restoreApiKey:Mt.restoreApiKey,assignUserID:Mt.assignUserID,assignUserIDs:Mt.assignUserIDs,getUserID:Mt.getUserID,searchUserIDs:Mt.searchUserIDs,listUserIDs:Mt.listUserIDs,getTopUserIDs:Mt.getTopUserIDs,removeUserID:Mt.removeUserID,hasPendingMappings:Mt.hasPendingMappings,generateSecuredApiKey:Mt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Mt.getSecuredApiKeyRemainingValidity,destroy:sw.destroy,initIndex:g=>t=>Mt.initIndex(g)(t,{methods:{batch:Mt.batch,delete:Mt.deleteIndex,getObject:Mt.getObject,getObjects:Mt.getObjects,saveObject:Mt.saveObject,saveObjects:Mt.saveObjects,search:Mt.search,searchForFacetValues:Mt.searchForFacetValues,waitTask:Mt.waitTask,setSettings:Mt.setSettings,getSettings:Mt.getSettings,partialUpdateObject:Mt.partialUpdateObject,partialUpdateObjects:Mt.partialUpdateObjects,deleteObject:Mt.deleteObject,deleteObjects:Mt.deleteObjects,deleteBy:Mt.deleteBy,clearObjects:Mt.clearObjects,browseObjects:Mt.browseObjects,getObjectPosition:Mt.getObjectPosition,findObject:Mt.findObject,exists:Mt.exists,saveSynonym:Mt.saveSynonym,saveSynonyms:Mt.saveSynonyms,getSynonym:Mt.getSynonym,searchSynonyms:Mt.searchSynonyms,browseSynonyms:Mt.browseSynonyms,deleteSynonym:Mt.deleteSynonym,clearSynonyms:Mt.clearSynonyms,replaceAllObjects:Mt.replaceAllObjects,replaceAllSynonyms:Mt.replaceAllSynonyms,searchRules:Mt.searchRules,getRule:Mt.getRule,deleteRule:Mt.deleteRule,saveRule:Mt.saveRule,saveRules:Mt.saveRules,replaceAllRules:Mt.replaceAllRules,browseRules:Mt.browseRules,clearRules:Mt.clearRules}}),initAnalytics:()=>g=>Ma.createAnalyticsClient(zn(dt(dt({},c),g),{methods:{addABTest:Ma.addABTest,getABTest:Ma.getABTest,getABTests:Ma.getABTests,stopABTest:Ma.stopABTest,deleteABTest:Ma.deleteABTest}})),initRecommendation:()=>g=>lw.createRecommendationClient(zn(dt(dt({},c),g),{methods:{getPersonalizationStrategy:lw.getPersonalizationStrategy,setPersonalizationStrategy:lw.setPersonalizationStrategy}}))}}))}mT.version=sw.version;pT.exports=mT});var _T=Me((OV,fw)=>{var gT=vT();fw.exports=gT;fw.exports.default=gT});var rf=Me(dw=>{"use strict";Object.defineProperty(dw,"__esModule",{value:!0});dw.default=kT;function kT(){}kT.prototype={diff:function(u,f){var c=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},g=c.callback;typeof c=="function"&&(g=c,c={}),this.options=c;var t=this;function C(re){return g?(setTimeout(function(){g(void 0,re)},0),!0):re}u=this.castInput(u),f=this.castInput(f),u=this.removeEmpty(this.tokenize(u)),f=this.removeEmpty(this.tokenize(f));var A=f.length,x=u.length,D=1,L=A+x,N=[{newPos:-1,components:[]}],j=this.extractCommon(N[0],f,u,0);if(N[0].newPos+1>=A&&j+1>=x)return C([{value:this.join(f),count:f.length}]);function $(){for(var re=-1*D;re<=D;re+=2){var ce=void 0,Q=N[re-1],oe=N[re+1],Se=(oe?oe.newPos:0)-re;Q&&(N[re-1]=void 0);var me=Q&&Q.newPos+1=A&&Se+1>=x)return C(LW(t,ce.components,f,u,t.useLongestToken));N[re]=ce}D++}if(g)(function re(){setTimeout(function(){if(D>L)return g();$()||re()},0)})();else for(;D<=L;){var h=$();if(h)return h}},pushComponent:function(u,f,c){var g=u[u.length-1];g&&g.added===f&&g.removed===c?u[u.length-1]={count:g.count+1,added:f,removed:c}:u.push({count:1,added:f,removed:c})},extractCommon:function(u,f,c,g){for(var t=f.length,C=c.length,A=u.newPos,x=A-g,D=0;A+1$.length?re:$}),D.value=i.join(L)}else D.value=i.join(f.slice(A,A+D.count));A+=D.count,D.added||(x+=D.count)}}var j=u[C-1];return C>1&&typeof j.value=="string"&&(j.added||j.removed)&&i.equals("",j.value)&&(u[C-2].value+=j.value,u.pop()),u}function RW(i){return{newPos:i.newPos,components:i.components.slice(0)}}});var OT=Me(ld=>{"use strict";Object.defineProperty(ld,"__esModule",{value:!0});ld.diffChars=NW;ld.characterDiff=void 0;var jW=BW(rf());function BW(i){return i&&i.__esModule?i:{default:i}}var AT=new jW.default;ld.characterDiff=AT;function NW(i,u,f){return AT.diff(i,u,f)}});var hw=Me(pw=>{"use strict";Object.defineProperty(pw,"__esModule",{value:!0});pw.generateOptions=UW;function UW(i,u){if(typeof i=="function")u.callback=i;else if(i)for(var f in i)i.hasOwnProperty(f)&&(u[f]=i[f]);return u}});var MT=Me(Fa=>{"use strict";Object.defineProperty(Fa,"__esModule",{value:!0});Fa.diffWords=qW;Fa.diffWordsWithSpace=zW;Fa.wordDiff=void 0;var HW=WW(rf()),bW=hw();function WW(i){return i&&i.__esModule?i:{default:i}}var IT=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,PT=/\S/,fd=new HW.default;Fa.wordDiff=fd;fd.equals=function(i,u){return this.options.ignoreCase&&(i=i.toLowerCase(),u=u.toLowerCase()),i===u||this.options.ignoreWhitespace&&!PT.test(i)&&!PT.test(u)};fd.tokenize=function(i){for(var u=i.split(/(\s+|[()[\]{}'"]|\b)/),f=0;f{"use strict";Object.defineProperty(La,"__esModule",{value:!0});La.diffLines=GW;La.diffTrimmedLines=VW;La.lineDiff=void 0;var $W=YW(rf()),KW=hw();function YW(i){return i&&i.__esModule?i:{default:i}}var Dm=new $W.default;La.lineDiff=Dm;Dm.tokenize=function(i){var u=[],f=i.split(/(\n|\r\n)/);f[f.length-1]||f.pop();for(var c=0;c{"use strict";Object.defineProperty(cd,"__esModule",{value:!0});cd.diffSentences=XW;cd.sentenceDiff=void 0;var QW=JW(rf());function JW(i){return i&&i.__esModule?i:{default:i}}var mw=new QW.default;cd.sentenceDiff=mw;mw.tokenize=function(i){return i.split(/(\S.+?[.!?])(?=\s+|$)/)};function XW(i,u,f){return mw.diff(i,u,f)}});var LT=Me(ad=>{"use strict";Object.defineProperty(ad,"__esModule",{value:!0});ad.diffCss=ZW;ad.cssDiff=void 0;var tH=eH(rf());function eH(i){return i&&i.__esModule?i:{default:i}}var vw=new tH.default;ad.cssDiff=vw;vw.tokenize=function(i){return i.split(/([{}:;,]|\s+)/)};function ZW(i,u,f){return vw.diff(i,u,f)}});var NT=Me(Ra=>{"use strict";Object.defineProperty(Ra,"__esModule",{value:!0});Ra.diffJson=nH;Ra.canonicalize=Sm;Ra.jsonDiff=void 0;var RT=rH(rf()),iH=Em();function rH(i){return i&&i.__esModule?i:{default:i}}function Cm(i){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Cm=function(f){return typeof f}:Cm=function(f){return f&&typeof Symbol=="function"&&f.constructor===Symbol&&f!==Symbol.prototype?"symbol":typeof f},Cm(i)}var oH=Object.prototype.toString,xc=new RT.default;Ra.jsonDiff=xc;xc.useLongestToken=!0;xc.tokenize=iH.lineDiff.tokenize;xc.castInput=function(i){var u=this.options,f=u.undefinedReplacement,c=u.stringifyReplacer,g=c===void 0?function(t,C){return typeof C=="undefined"?f:C}:c;return typeof i=="string"?i:JSON.stringify(Sm(i,null,null,g),g," ")};xc.equals=function(i,u){return RT.default.prototype.equals.call(xc,i.replace(/,([\r\n])/g,"$1"),u.replace(/,([\r\n])/g,"$1"))};function nH(i,u,f){return xc.diff(i,u,f)}function Sm(i,u,f,c,g){u=u||[],f=f||[],c&&(i=c(g,i));var t;for(t=0;t{"use strict";Object.defineProperty(dd,"__esModule",{value:!0});dd.diffArrays=uH;dd.arrayDiff=void 0;var lH=sH(rf());function sH(i){return i&&i.__esModule?i:{default:i}}var pd=new lH.default;dd.arrayDiff=pd;pd.tokenize=function(i){return i.slice()};pd.join=pd.removeEmpty=function(i){return i};function uH(i,u,f){return pd.diff(i,u,f)}});var Tm=Me(gw=>{"use strict";Object.defineProperty(gw,"__esModule",{value:!0});gw.parsePatch=fH;function fH(i){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},f=i.split(/\r\n|[\n\v\f\r\x85]/),c=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],g=[],t=0;function C(){var D={};for(g.push(D);t{"use strict";Object.defineProperty(_w,"__esModule",{value:!0});_w.default=cH;function cH(i,u,f){var c=!0,g=!1,t=!1,C=1;return function A(){if(c&&!t){if(g?C++:c=!1,i+C<=f)return C;t=!0}if(!g)return t||(c=!0),u<=i-C?-C++:(g=!0,A())}}});var zT=Me(xm=>{"use strict";Object.defineProperty(xm,"__esModule",{value:!0});xm.applyPatch=UT;xm.applyPatches=aH;var qT=Tm(),pH=dH(jT());function dH(i){return i&&i.__esModule?i:{default:i}}function UT(i,u){var f=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof u=="string"&&(u=(0,qT.parsePatch)(u)),Array.isArray(u)){if(u.length>1)throw new Error("applyPatch only works with a single input.");u=u[0]}var c=i.split(/\r\n|[\n\v\f\r\x85]/),g=i.match(/\r\n|[\n\v\f\r\x85]/g)||[],t=u.hunks,C=f.compareLine||function(Ot,Nt,Je,V){return Nt===V},A=0,x=f.fuzzFactor||0,D=0,L=0,N,j;function $(Ot,Nt){for(var Je=0;Je0?V[0]:" ",ge=V.length>0?V.substr(1):V;if(ne===" "||ne==="-"){if(!C(Nt+1,c[Nt],ne,ge)&&(A++,A>x))return!1;Nt++}}return!0}for(var h=0;h0?Le[0]:" ",ct=Le.length>0?Le.substr(1):Le,Ue=J.linedelimiters[Oe];if(ot===" ")Te++;else if(ot==="-")c.splice(Te,1),g.splice(Te,1);else if(ot==="+")c.splice(Te,0,ct),g.splice(Te,0,Ue),Te++;else if(ot==="\\"){var be=J.lines[Oe-1]?J.lines[Oe-1][0]:null;be==="+"?N=!0:be==="-"&&(j=!0)}}}if(N)for(;!c[c.length-1];)c.pop(),g.pop();else j&&(c.push(""),g.push(` -`));for(var At=0;At{"use strict";Object.defineProperty(hd,"__esModule",{value:!0});hd.structuredPatch=WT;hd.createTwoFilesPatch=HT;hd.createPatch=hH;var mH=Em();function yw(i){return _H(i)||gH(i)||vH()}function vH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function gH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function _H(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u0?x(J.lines.slice(-C.context)):[],L-=j.length,N-=j.length)}(De=j).push.apply(De,yw(me.map(function(At){return(Se.added?"+":"-")+At}))),Se.added?h+=me.length:$+=me.length}else{if(L)if(me.length<=C.context*2&&oe=A.length-2&&me.length<=C.context){var ct=/\n$/.test(f),Ue=/\n$/.test(c),be=me.length==0&&j.length>ot.oldLines;!ct&&be&&j.splice(ot.oldLines,0,"\\ No newline at end of file"),(!ct&&!be||!Ue)&&j.push("\\ No newline at end of file")}D.push(ot),L=0,N=0,j=[]}$+=me.length,h+=me.length}},ce=0;ce{"use strict";Object.defineProperty(km,"__esModule",{value:!0});km.arrayEqual=yH;km.arrayStartsWith=bT;function yH(i,u){return i.length!==u.length?!1:bT(i,u)}function bT(i,u){if(u.length>i.length)return!1;for(var f=0;f{"use strict";Object.defineProperty(Am,"__esModule",{value:!0});Am.calcLineCount=VT;Am.merge=wH;var DH=ww(),EH=Tm(),Dw=GT();function Na(i){return TH(i)||CH(i)||SH()}function SH(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function CH(i){if(Symbol.iterator in Object(i)||Object.prototype.toString.call(i)==="[object Arguments]")return Array.from(i)}function TH(i){if(Array.isArray(i)){for(var u=0,f=new Array(i.length);u{"use strict";Object.defineProperty(Cw,"__esModule",{value:!0});Cw.convertChangesToDMP=OH;function OH(i){for(var u=[],f,c,g=0;g{"use strict";Object.defineProperty(Tw,"__esModule",{value:!0});Tw.convertChangesToXML=IH;function IH(i){for(var u=[],f=0;f"):c.removed&&u.push(""),u.push(PH(c.value)),c.added?u.push(""):c.removed&&u.push("")}return u.join("")}function PH(i){var u=i;return u=u.replace(/&/g,"&"),u=u.replace(//g,">"),u=u.replace(/"/g,"""),u}});var f9=Me(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});Object.defineProperty(w0,"Diff",{enumerable:!0,get:function(){return MH.default}});Object.defineProperty(w0,"diffChars",{enumerable:!0,get:function(){return FH.diffChars}});Object.defineProperty(w0,"diffWords",{enumerable:!0,get:function(){return o9.diffWords}});Object.defineProperty(w0,"diffWordsWithSpace",{enumerable:!0,get:function(){return o9.diffWordsWithSpace}});Object.defineProperty(w0,"diffLines",{enumerable:!0,get:function(){return u9.diffLines}});Object.defineProperty(w0,"diffTrimmedLines",{enumerable:!0,get:function(){return u9.diffTrimmedLines}});Object.defineProperty(w0,"diffSentences",{enumerable:!0,get:function(){return LH.diffSentences}});Object.defineProperty(w0,"diffCss",{enumerable:!0,get:function(){return RH.diffCss}});Object.defineProperty(w0,"diffJson",{enumerable:!0,get:function(){return s9.diffJson}});Object.defineProperty(w0,"canonicalize",{enumerable:!0,get:function(){return s9.canonicalize}});Object.defineProperty(w0,"diffArrays",{enumerable:!0,get:function(){return NH.diffArrays}});Object.defineProperty(w0,"applyPatch",{enumerable:!0,get:function(){return l9.applyPatch}});Object.defineProperty(w0,"applyPatches",{enumerable:!0,get:function(){return l9.applyPatches}});Object.defineProperty(w0,"parsePatch",{enumerable:!0,get:function(){return BH.parsePatch}});Object.defineProperty(w0,"merge",{enumerable:!0,get:function(){return jH.merge}});Object.defineProperty(w0,"structuredPatch",{enumerable:!0,get:function(){return xw.structuredPatch}});Object.defineProperty(w0,"createTwoFilesPatch",{enumerable:!0,get:function(){return xw.createTwoFilesPatch}});Object.defineProperty(w0,"createPatch",{enumerable:!0,get:function(){return xw.createPatch}});Object.defineProperty(w0,"convertChangesToDMP",{enumerable:!0,get:function(){return UH.convertChangesToDMP}});Object.defineProperty(w0,"convertChangesToXML",{enumerable:!0,get:function(){return qH.convertChangesToXML}});var MH=zH(rf()),FH=OT(),o9=MT(),u9=Em(),LH=FT(),RH=LT(),s9=NT(),NH=BT(),l9=zT(),BH=Tm(),jH=n9(),xw=ww(),UH=r9(),qH=i9();function zH(i){return i&&i.__esModule?i:{default:i}}});var HH={};jR(HH,{default:()=>GH});var wT=Er(require("@yarnpkg/cli")),Tc=Er(require("@yarnpkg/core"));var Z5=Er(ys()),Dc=Er(lr()),om=(0,Dc.memo)(({active:i})=>{let u=(0,Dc.useMemo)(()=>i?"\u25C9":"\u25EF",[i]),f=(0,Dc.useMemo)(()=>i?"green":"yellow",[i]);return Dc.default.createElement(Z5.Text,{color:f},u)});var Wf=Er(ys()),Bo=Er(lr());var eC=Er(ys()),um=Er(lr());function zf({active:i},u,f){let{stdin:c}=(0,eC.useStdin)(),g=(0,um.useCallback)((t,C)=>u(t,C),f);(0,um.useEffect)(()=>{if(!(!i||!c))return c.on("keypress",g),()=>{c.off("keypress",g)}},[i,g,c])}var sm;(function(f){f.BEFORE="before",f.AFTER="after"})(sm||(sm={}));var tC=function({active:i},u,f){zf({active:i},(c,g)=>{g.name==="tab"&&(g.shift?u(sm.BEFORE):u(sm.AFTER))},f)};var lm=function(i,u,{active:f,minus:c,plus:g,set:t,loop:C=!0}){zf({active:f},(A,x)=>{let D=u.indexOf(i);switch(x.name){case c:{let L=D-1;if(C){t(u[(u.length+L)%u.length]);return}if(L<0)return;t(u[L])}break;case g:{let L=D+1;if(C){t(u[L%u.length]);return}if(L>=u.length)return;t(u[L])}break}},[u,i,g,t,C])};var fm=({active:i=!0,children:u=[],radius:f=10,size:c=1,loop:g=!0,onFocusRequest:t,willReachEnd:C})=>{let A=ce=>{if(ce.key===null)throw new Error("Expected all children to have a key");return ce.key},x=Bo.default.Children.map(u,ce=>A(ce)),D=x[0],[L,N]=(0,Bo.useState)(D),j=x.indexOf(L);(0,Bo.useEffect)(()=>{x.includes(L)||N(D)},[u]),(0,Bo.useEffect)(()=>{C&&j>=x.length-2&&C()},[j]),tC({active:i&&!!t},ce=>{t==null||t(ce)},[t]),lm(L,x,{active:i,minus:"up",plus:"down",set:N,loop:g});let $=j-f,h=j+f;h>x.length&&($-=h-x.length,h=x.length),$<0&&(h+=-$,$=0),h>=x.length&&(h=x.length-1);let re=[];for(let ce=$;ce<=h;++ce){let Q=x[ce],oe=i&&Q===L;re.push(Bo.default.createElement(Wf.Box,{key:Q,height:c},Bo.default.createElement(Wf.Box,{marginLeft:1,marginRight:1},Bo.default.createElement(Wf.Text,null,oe?Bo.default.createElement(Wf.Text,{color:"cyan",bold:!0},">"):" ")),Bo.default.createElement(Wf.Box,null,Bo.default.cloneElement(u[ce],{active:oe}))))}return Bo.default.createElement(Wf.Box,{flexDirection:"column",width:"100%"},re)};var cm=Er(lr());var nC=Er(ys()),nf=Er(lr()),rC=Er(require("readline")),G3=nf.default.createContext(null),iC=({children:i})=>{let{stdin:u,setRawMode:f}=(0,nC.useStdin)();(0,nf.useEffect)(()=>{f&&f(!0),u&&(0,rC.emitKeypressEvents)(u)},[u,f]);let[c,g]=(0,nf.useState)(new Map),t=(0,nf.useMemo)(()=>({getAll:()=>c,get:C=>c.get(C),set:(C,A)=>g(new Map([...c,[C,A]]))}),[c,g]);return nf.default.createElement(G3.Provider,{value:t,children:i})};function Ec(i,u){let f=(0,cm.useContext)(G3);if(f===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof i=="undefined")return f.getAll();let c=(0,cm.useCallback)(t=>{f.set(i,t)},[i,f.set]),g=f.get(i);return typeof g=="undefined"&&(g=u),[g,c]}var am=Er(ys()),V3=Er(lr());async function dm(i,u){let f,c=t=>{let{exit:C}=(0,am.useApp)();zf({active:!0},(A,x)=>{x.name==="return"&&(f=t,C())},[C,t])},{waitUntilExit:g}=(0,am.render)(V3.default.createElement(iC,null,V3.default.createElement(i,zn(dt({},u),{useSubmit:c}))));return await g(),f}var DT=Er(require("clipanion")),ET=Er(lC()),un=Er(ys()),Pt=Er(lr());var yT=Er(_T()),cw={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},FW=(0,yT.default)(cw.appId,cw.apiKey).initIndex(cw.indexName),aw=async(i,u=0)=>await FW.search(i,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:u,hitsPerPage:10});var od=["regular","dev","peer"],ud=class extends wT.BaseCommand{async execute(){let u=await Tc.Configuration.find(this.context.cwd,this.context.plugins),f=()=>Pt.default.createElement(un.Box,{flexDirection:"row"},Pt.default.createElement(un.Box,{flexDirection:"column",width:48},Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},""),"/",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to move between packages.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to select a package.")),Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," again to change the target."))),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),Pt.default.createElement(un.Box,{marginLeft:1},Pt.default.createElement(un.Text,null,"Press ",Pt.default.createElement(un.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),c=()=>Pt.default.createElement(Pt.default.Fragment,null,Pt.default.createElement(un.Box,{width:15},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Owner")),Pt.default.createElement(un.Box,{width:11},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Version")),Pt.default.createElement(un.Box,{width:10},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Downloads"))),g=()=>Pt.default.createElement(un.Box,{width:17},Pt.default.createElement(un.Text,{bold:!0,underline:!0,color:"gray"},"Target")),t=({hit:$,active:h})=>{let[re,ce]=Ec($.name,null);zf({active:h},(Se,me)=>{if(me.name!=="space")return;if(!re){ce(od[0]);return}let De=od.indexOf(re)+1;De===od.length?ce(null):ce(od[De])},[re,ce]);let Q=Tc.structUtils.parseIdent($.name),oe=Tc.structUtils.prettyIdent(u,Q);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:45},Pt.default.createElement(un.Text,{bold:!0,wrap:"wrap"},oe)),Pt.default.createElement(un.Box,{width:14,marginLeft:1},Pt.default.createElement(un.Text,{bold:!0,wrap:"truncate"},$.owner.name)),Pt.default.createElement(un.Box,{width:10,marginLeft:1},Pt.default.createElement(un.Text,{italic:!0,wrap:"truncate"},$.version)),Pt.default.createElement(un.Box,{width:16,marginLeft:1},Pt.default.createElement(un.Text,null,$.humanDownloadsLast30Days)))},C=({name:$,active:h})=>{let[re]=Ec($,null),ce=Tc.structUtils.parseIdent($);return Pt.default.createElement(un.Box,null,Pt.default.createElement(un.Box,{width:47},Pt.default.createElement(un.Text,{bold:!0}," - ",Tc.structUtils.prettyIdent(u,ce))),od.map(Q=>Pt.default.createElement(un.Box,{key:Q,width:14,marginLeft:1},Pt.default.createElement(un.Text,null," ",Pt.default.createElement(om,{active:re===Q})," ",Pt.default.createElement(un.Text,{bold:!0},Q)))))},A=()=>Pt.default.createElement(un.Box,{marginTop:1},Pt.default.createElement(un.Text,null,"Powered by Algolia.")),D=await dm(({useSubmit:$})=>{let h=Ec();$(h);let re=Array.from(h.keys()).filter(Le=>h.get(Le)!==null),[ce,Q]=(0,Pt.useState)(""),[oe,Se]=(0,Pt.useState)(0),[me,De]=(0,Pt.useState)([]),J=Le=>{Le.match(/\t| /)||Q(Le)},Te=async()=>{Se(0);let Le=await aw(ce);Le.query===ce&&De(Le.hits)},Oe=async()=>{let Le=await aw(ce,oe+1);Le.query===ce&&Le.page-1===oe&&(Se(Le.page),De([...me,...Le.hits]))};return(0,Pt.useEffect)(()=>{ce?Te():De([])},[ce]),Pt.default.createElement(un.Box,{flexDirection:"column"},Pt.default.createElement(f,null),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Text,{bold:!0},"Search: "),Pt.default.createElement(un.Box,{width:41},Pt.default.createElement(ET.default,{value:ce,onChange:J,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),Pt.default.createElement(c,null)),me.length?Pt.default.createElement(fm,{radius:2,loop:!1,children:me.map(Le=>Pt.default.createElement(t,{key:Le.name,hit:Le,active:!1})),willReachEnd:Oe}):Pt.default.createElement(un.Text,{color:"gray"},"Start typing..."),Pt.default.createElement(un.Box,{flexDirection:"row",marginTop:1},Pt.default.createElement(un.Box,{width:49},Pt.default.createElement(un.Text,{bold:!0},"Selected:")),Pt.default.createElement(g,null)),re.length?re.map(Le=>Pt.default.createElement(C,{key:Le,name:Le,active:!1})):Pt.default.createElement(un.Text,{color:"gray"},"No selected packages..."),Pt.default.createElement(A,null))},{});if(typeof D=="undefined")return 1;let L=Array.from(D.keys()).filter($=>D.get($)==="regular"),N=Array.from(D.keys()).filter($=>D.get($)==="dev"),j=Array.from(D.keys()).filter($=>D.get($)==="peer");return L.length&&await this.cli.run(["add",...L]),N.length&&await this.cli.run(["add","--dev",...N]),j&&await this.cli.run(["add","--peer",...j]),0}};ud.paths=[["search"]],ud.usage=DT.Command.Usage({category:"Interactive commands",description:"open the search interface",details:` - This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. - `,examples:[["Open the search window","yarn search"]]});var ST=ud;var Im=Er(require("@yarnpkg/cli")),W0=Er(require("@yarnpkg/core"));var sd=Er(ys()),bf=Er(lr());var CT=Er(ys()),TT=Er(lr()),wm=({length:i,active:u})=>{if(i===0)return null;let f=i>1?` ${"-".repeat(i-1)}`:" ";return TT.default.createElement(CT.Text,{dimColor:!u},f)};var xT=function({active:i,skewer:u,options:f,value:c,onChange:g,sizes:t=[]}){let C=f.filter(({label:x})=>!!x).map(({value:x})=>x),A=f.findIndex(x=>x.value===c&&x.label!="");return lm(c,C,{active:i,minus:"left",plus:"right",set:g}),bf.default.createElement(bf.default.Fragment,null,f.map(({label:x},D)=>{let L=D===A,N=t[D]-1||0,j=x.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),$=Math.max(0,N-j.length-2);return x?bf.default.createElement(sd.Box,{key:x,width:N,marginLeft:1},bf.default.createElement(sd.Text,{wrap:"truncate"},bf.default.createElement(om,{active:L})," ",x),u?bf.default.createElement(wm,{active:i,length:$}):null):bf.default.createElement(sd.Box,{key:`spacer-${D}`,width:N,marginLeft:1})}))};var c9=Er(require("@yarnpkg/plugin-essentials")),a9=Er(require("clipanion")),d9=Er(f9()),tr=Er(ys()),pn=Er(lr()),p9=Er(require("semver")),h9=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,WH=10,md=class extends Im.BaseCommand{async execute(){let u=await W0.Configuration.find(this.context.cwd,this.context.plugins),{project:f,workspace:c}=await W0.Project.find(u,this.context.cwd),g=await W0.Cache.find(u);if(!c)throw new Im.WorkspaceRequiredError(f.cwd,this.context.cwd);await f.restoreInstallState({restoreResolutions:!1});let t=(Q,oe)=>{let Se=(0,d9.diffWords)(Q,oe),me="";for(let De of Se)De.added?me+=W0.formatUtils.pretty(u,De.value,"green"):De.removed||(me+=De.value);return me},C=(Q,oe)=>{if(Q===oe)return oe;let Se=W0.structUtils.parseRange(Q),me=W0.structUtils.parseRange(oe),De=Se.selector.match(h9),J=me.selector.match(h9);if(!De||!J)return t(Q,oe);let Te=["gray","red","yellow","green","magenta"],Oe=null,Le="";for(let ot=1;ot{let me=await c9.suggestUtils.fetchDescriptorFrom(Q,Se,{project:f,cache:g,preserveModifier:oe,workspace:c});return me!==null?me.range:Q.range},x=async Q=>{let oe=p9.default.valid(Q.range)?`^${Q.range}`:Q.range,[Se,me]=await Promise.all([A(Q,Q.range,oe).catch(()=>null),A(Q,Q.range,"latest").catch(()=>null)]),De=[{value:null,label:Q.range}];return Se&&Se!==Q.range?De.push({value:Se,label:C(Q.range,Se)}):De.push({value:null,label:""}),me&&me!==Se&&me!==Q.range?De.push({value:me,label:C(Q.range,me)}):De.push({value:null,label:""}),De},D=()=>pn.default.createElement(tr.Box,{flexDirection:"row"},pn.default.createElement(tr.Box,{flexDirection:"column",width:49},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select packages.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},""),"/",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to select versions."))),pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to install.")),pn.default.createElement(tr.Box,{marginLeft:1},pn.default.createElement(tr.Text,null,"Press ",pn.default.createElement(tr.Text,{bold:!0,color:"cyanBright"},"")," to abort.")))),L=()=>pn.default.createElement(tr.Box,{flexDirection:"row",paddingTop:1,paddingBottom:1},pn.default.createElement(tr.Box,{width:50},pn.default.createElement(tr.Text,{bold:!0},pn.default.createElement(tr.Text,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Current")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Range")),pn.default.createElement(tr.Box,{width:17},pn.default.createElement(tr.Text,{bold:!0,underline:!0,color:"gray"},"Latest"))),N=({active:Q,descriptor:oe,suggestions:Se})=>{let[me,De]=Ec(oe.descriptorHash,null),J=W0.structUtils.stringifyIdent(oe),Te=Math.max(0,45-J.length);return pn.default.createElement(pn.default.Fragment,null,pn.default.createElement(tr.Box,null,pn.default.createElement(tr.Box,{width:45},pn.default.createElement(tr.Text,{bold:!0},W0.structUtils.prettyIdent(u,oe)),pn.default.createElement(wm,{active:Q,length:Te})),Se!==null?pn.default.createElement(xT,{active:Q,options:Se,value:me,skewer:!0,onChange:De,sizes:[17,17,17]}):pn.default.createElement(tr.Box,{marginLeft:2},pn.default.createElement(tr.Text,{color:"gray"},"Fetching suggestions..."))))},j=({dependencies:Q})=>{let[oe,Se]=(0,pn.useState)(null),me=(0,pn.useRef)(!0);return(0,pn.useEffect)(()=>()=>{me.current=!1}),(0,pn.useEffect)(()=>{Promise.all(Q.map(De=>x(De))).then(De=>{let J=Q.map((Te,Oe)=>{let Le=De[Oe];return[Te,Le]}).filter(([Te,Oe])=>Oe.filter(Le=>Le.label!=="").length>1);me.current&&Se(J)})},[]),oe?oe.length?pn.default.createElement(fm,{radius:WH,children:oe.map(([De,J])=>pn.default.createElement(N,{key:De.descriptorHash,active:!1,descriptor:De,suggestions:J}))}):pn.default.createElement(tr.Text,null,"No upgrades found"):pn.default.createElement(tr.Text,null,"Fetching suggestions...")},h=await dm(({useSubmit:Q})=>{Q(Ec());let oe=new Map;for(let me of f.workspaces)for(let De of["dependencies","devDependencies"])for(let J of me.manifest[De].values())f.tryWorkspaceByDescriptor(J)===null&&oe.set(J.descriptorHash,J);let Se=W0.miscUtils.sortMap(oe.values(),me=>W0.structUtils.stringifyDescriptor(me));return pn.default.createElement(tr.Box,{flexDirection:"column"},pn.default.createElement(D,null),pn.default.createElement(L,null),pn.default.createElement(j,{dependencies:Se}))},{});if(typeof h=="undefined")return 1;let re=!1;for(let Q of f.workspaces)for(let oe of["dependencies","devDependencies"]){let Se=Q.manifest[oe];for(let me of Se.values()){let De=h.get(me.descriptorHash);typeof De!="undefined"&&De!==null&&(Se.set(me.identHash,W0.structUtils.makeDescriptor(me,De)),re=!0)}}return re?(await W0.StreamReport.start({configuration:u,stdout:this.context.stdout,includeLogs:!this.context.quiet},async Q=>{await f.install({cache:g,report:Q})})).exitCode():0}};md.paths=[["upgrade-interactive"]],md.usage=a9.Command.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` - 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. - `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var m9=md;var bH={commands:[ST,m9]},GH=bH;return HH;})(); -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ -/** - * @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 - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-debug-tools.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. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * react-is.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. - */ -/** @license React v0.0.0-experimental-51a3aa6af - * 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. - */ -/** @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. - */ -/** @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. - */ -/** @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. - */ -return plugin; -} -}; diff --git a/tgui/.yarn/releases/yarn-3.1.1.cjs b/tgui/.yarn/releases/yarn-3.1.1.cjs deleted file mode 100644 index f5f2adca83b2..000000000000 --- a/tgui/.yarn/releases/yarn-3.1.1.cjs +++ /dev/null @@ -1,768 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var Mfe=Object.create,Vf=Object.defineProperty,Ofe=Object.defineProperties,Kfe=Object.getOwnPropertyDescriptor,Ufe=Object.getOwnPropertyDescriptors,Hfe=Object.getOwnPropertyNames,hE=Object.getOwnPropertySymbols,Gfe=Object.getPrototypeOf,eb=Object.prototype.hasOwnProperty,lO=Object.prototype.propertyIsEnumerable;var cO=(t,e,r)=>e in t?Vf(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,P=(t,e)=>{for(var r in e||(e={}))eb.call(e,r)&&cO(t,r,e[r]);if(hE)for(var r of hE(e))lO.call(e,r)&&cO(t,r,e[r]);return t},_=(t,e)=>Ofe(t,Ufe(e)),jfe=t=>Vf(t,"__esModule",{value:!0});var qr=(t,e)=>{var r={};for(var i in t)eb.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&hE)for(var i of hE(t))e.indexOf(i)<0&&lO.call(t,i)&&(r[i]=t[i]);return r},Yfe=(t,e)=>()=>(t&&(e=t(t=0)),e),E=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),it=(t,e)=>{for(var r in e)Vf(t,r,{get:e[r],enumerable:!0})},qfe=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Hfe(e))!eb.call(t,i)&&i!=="default"&&Vf(t,i,{get:()=>e[i],enumerable:!(r=Kfe(e,i))||r.enumerable});return t},ie=t=>qfe(jfe(Vf(t!=null?Mfe(Gfe(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var MO=E((i$e,FO)=>{FO.exports=NO;NO.sync=Ahe;var LO=require("fs");function lhe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var i=0;i{OO.exports=KO;KO.sync=che;var UO=require("fs");function KO(t,e,r){UO.stat(t,function(i,n){r(i,i?!1:HO(n,e))})}function che(t,e){return HO(UO.statSync(t),e)}function HO(t,e){return t.isFile()&&uhe(t,e)}function uhe(t,e){var r=t.mode,i=t.uid,n=t.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=r&c||r&l&&n===o||r&a&&i===s||r&u&&s===0;return g}});var YO=E((o$e,jO)=>{var s$e=require("fs"),xE;process.platform==="win32"||global.TESTING_WINDOWS?xE=MO():xE=GO();jO.exports=db;db.sync=ghe;function db(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){db(t,e||{},function(s,o){s?n(s):i(o)})})}xE(t,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),r(i,n)})}function ghe(t,e){try{return xE.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var XO=E((a$e,qO)=>{var eu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",JO=require("path"),fhe=eu?";":":",WO=YO(),zO=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),VO=(t,e)=>{let r=e.colon||fhe,i=t.match(/\//)||eu&&t.match(/\\/)?[""]:[...eu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=eu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=eu?n.split(r):[""];return eu&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},_O=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=VO(t,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(zO(t));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=JO.join(h,t),d=!h&&/^\.[\\\/]/.test(t)?t.slice(0,2)+p:p;u(l(d,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];WO(c+p,{pathExt:s},(d,m)=>{if(!d&&m)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return r?a(0).then(c=>r(null,c),r):a(0)},hhe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:i,pathExtExe:n}=VO(t,e),s=[];for(let o=0;o{"use strict";var ZO=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};Cb.exports=ZO;Cb.exports.default=ZO});var iK=E((l$e,eK)=>{"use strict";var tK=require("path"),phe=XO(),dhe=$O();function rK(t,e){let r=t.options.env||process.env,i=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch(a){}let o;try{o=phe.sync(t.command,{path:r[dhe({env:r})],pathExt:e?tK.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=tK.resolve(n?t.options.cwd:"",o)),o}function Che(t){return rK(t)||rK(t,!0)}eK.exports=Che});var nK=E((c$e,mb)=>{"use strict";var Eb=/([()\][%!^"`<>&|;, *?])/g;function mhe(t){return t=t.replace(Eb,"^$1"),t}function Ehe(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(Eb,"^$1"),e&&(t=t.replace(Eb,"^$1")),t}mb.exports.command=mhe;mb.exports.argument=Ehe});var oK=E((u$e,sK)=>{"use strict";sK.exports=/^#!(.*)/});var AK=E((g$e,aK)=>{"use strict";var Ihe=oK();aK.exports=(t="")=>{let e=t.match(Ihe);if(!e)return null;let[r,i]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var cK=E((f$e,lK)=>{"use strict";var Ib=require("fs"),yhe=AK();function whe(t){let e=150,r=Buffer.alloc(e),i;try{i=Ib.openSync(t,"r"),Ib.readSync(i,r,0,e,0),Ib.closeSync(i)}catch(n){}return yhe(r.toString())}lK.exports=whe});var hK=E((h$e,uK)=>{"use strict";var Bhe=require("path"),gK=iK(),fK=nK(),Qhe=cK(),bhe=process.platform==="win32",vhe=/\.(?:com|exe)$/i,She=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function xhe(t){t.file=gK(t);let e=t.file&&Qhe(t.file);return e?(t.args.unshift(t.file),t.command=e,gK(t)):t.file}function khe(t){if(!bhe)return t;let e=xhe(t),r=!vhe.test(e);if(t.options.forceShell||r){let i=She.test(e);t.command=Bhe.normalize(t.command),t.command=fK.command(t.command),t.args=t.args.map(s=>fK.argument(s,i));let n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Phe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let i={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?i:khe(i)}uK.exports=Phe});var CK=E((p$e,pK)=>{"use strict";var yb=process.platform==="win32";function wb(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function Dhe(t,e){if(!yb)return;let r=t.emit;t.emit=function(i,n){if(i==="exit"){let s=dK(n,e,"spawn");if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function dK(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawn"):null}function Rhe(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawnSync"):null}pK.exports={hookChildProcess:Dhe,verifyENOENT:dK,verifyENOENTSync:Rhe,notFoundError:wb}});var bb=E((d$e,tu)=>{"use strict";var mK=require("child_process"),Bb=hK(),Qb=CK();function EK(t,e,r){let i=Bb(t,e,r),n=mK.spawn(i.command,i.args,i.options);return Qb.hookChildProcess(n,i),n}function Fhe(t,e,r){let i=Bb(t,e,r),n=mK.spawnSync(i.command,i.args,i.options);return n.error=n.error||Qb.verifyENOENTSync(n.status,i),n}tu.exports=EK;tu.exports.spawn=EK;tu.exports.sync=Fhe;tu.exports._parse=Bb;tu.exports._enoent=Qb});var yK=E((y$e,IK)=>{"use strict";IK.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]}});var Nb=E((w$e,wK)=>{var gh=yK(),BK={};for(let t of Object.keys(gh))BK[gh[t]]=t;var Xe={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"]}};wK.exports=Xe;for(let t of Object.keys(Xe)){if(!("channels"in Xe[t]))throw new Error("missing channels property: "+t);if(!("labels"in Xe[t]))throw new Error("missing channel labels property: "+t);if(Xe[t].labels.length!==Xe[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=Xe[t];delete Xe[t].channels,delete Xe[t].labels,Object.defineProperty(Xe[t],"channels",{value:e}),Object.defineProperty(Xe[t],"labels",{value:r})}Xe.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(e,r,i),s=Math.max(e,r,i),o=s-n,a,l;s===n?a=0:e===s?a=(r-i)/o:r===s?a=2+(i-e)/o:i===s&&(a=4+(e-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};Xe.rgb.hsv=function(t){let e,r,i,n,s,o=t[0]/255,a=t[1]/255,l=t[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),r=g(a),i=g(l),o===c?n=i-r:a===c?n=1/3+e-i:l===c&&(n=2/3+r-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};Xe.rgb.hwb=function(t){let e=t[0],r=t[1],i=t[2],n=Xe.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(r,i));return i=1-1/255*Math.max(e,Math.max(r,i)),[n,s*100,i*100]};Xe.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(1-e,1-r,1-i),s=(1-e-n)/(1-n)||0,o=(1-r-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function The(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Xe.rgb.keyword=function(t){let e=BK[t];if(e)return e;let r=Infinity,i;for(let n of Object.keys(gh)){let s=gh[n],o=The(t,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+r*.3576+i*.1805,s=e*.2126+r*.7152+i*.0722,o=e*.0193+r*.1192+i*.9505;return[n*100,s*100,o*100]};Xe.rgb.lab=function(t){let e=Xe.rgb.xyz(t),r=e[0],i=e[1],n=e[2];r/=95.047,i/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(r-i),a=200*(i-n);return[s,o,a]};Xe.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n,s,o;if(r===0)return o=i*255,[o,o,o];i<.5?n=i*(1+r):n=i+r-i*r;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};Xe.hsl.hsv=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=r,s=Math.max(i,.01);i*=2,r*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+r)/2,a=i===0?2*n/(s+n):2*r/(i+r);return[e,a*100,o*100]};Xe.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-r),a=255*i*(1-r*s),l=255*i*(1-r*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};Xe.hsv.hsl=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=Math.max(i,.01),s,o;o=(2-r)*i;let a=(2-r)*n;return s=r*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};Xe.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n=r+i,s;n>1&&(r/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=r+s*(a-r),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=r;break;case 1:c=l,u=a,g=r;break;case 2:c=r,u=a,g=l;break;case 3:c=r,u=l,g=a;break;case 4:c=l,u=r,g=a;break;case 5:c=a,u=r,g=l;break}return[c*255,u*255,g*255]};Xe.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n=t[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,r*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};Xe.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n,s,o;return n=e*3.2406+r*-1.5372+i*-.4986,s=e*-.9689+r*1.8758+i*.0415,o=e*.0557+r*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};Xe.xyz.lab=function(t){let e=t[0],r=t[1],i=t[2];e/=95.047,r/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*r-16,s=500*(e-r),o=200*(r-i);return[n,s,o]};Xe.lab.xyz=function(t){let e=t[0],r=t[1],i=t[2],n,s,o;s=(e+16)/116,n=r/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};Xe.lab.lch=function(t){let e=t[0],r=t[1],i=t[2],n;n=Math.atan2(i,r)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(r*r+i*i);return[e,o,n]};Xe.lch.lab=function(t){let e=t[0],r=t[1],n=t[2]/360*2*Math.PI,s=r*Math.cos(n),o=r*Math.sin(n);return[e,s,o]};Xe.rgb.ansi16=function(t,e=null){let[r,i,n]=t,s=e===null?Xe.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};Xe.hsv.ansi16=function(t){return Xe.rgb.ansi16(Xe.hsv.rgb(t),t[2])};Xe.rgb.ansi256=function(t){let e=t[0],r=t[1],i=t[2];return e===r&&r===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(i/255*5)};Xe.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,i=(e&1)*r*255,n=(e>>1&1)*r*255,s=(e>>2&1)*r*255;return[i,n,s]};Xe.ansi256.rgb=function(t){if(t>=232){let s=(t-232)*10+8;return[s,s,s]}t-=16;let e,r=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,n=e%6/5*255;return[r,i,n]};Xe.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Xe.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let i=parseInt(r,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};Xe.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.max(Math.max(e,r),i),s=Math.min(Math.min(e,r),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(r-i)/o%6:n===r?l=2+(i-e)/o:l=4+(e-r)/o,l/=6,l%=1,[l*360,o*100,a*100]};Xe.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=r<.5?2*e*r:2*e*(1-r),n=0;return i<1&&(n=(r-.5*i)/(1-i)),[t[0],i*100,n*100]};Xe.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=e*r,n=0;return i<1&&(n=(r-i)/(1-i)),[t[0],i*100,n*100]};Xe.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100;if(r===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-r)*i,[(r*n[0]+l)*255,(r*n[1]+l)*255,(r*n[2]+l)*255]};Xe.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e),n=0;return i>0&&(n=e/i),[t[0],n*100,i*100]};Xe.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[t[0],n*100,i*100]};Xe.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e);return[t[0],(i-e)*100,(1-i)*100]};Xe.hwb.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=1-r,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[t[0],n*100,s*100]};Xe.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Xe.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Xe.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Xe.gray.hsl=function(t){return[0,0,t[0]]};Xe.gray.hsv=Xe.gray.hsl;Xe.gray.hwb=function(t){return[0,100,t[0]]};Xe.gray.cmyk=function(t){return[0,0,0,t[0]]};Xe.gray.lab=function(t){return[t[0],0,0]};Xe.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};Xe.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var bK=E((B$e,QK)=>{var kE=Nb();function Mhe(){let t={},e=Object.keys(kE);for(let r=e.length,i=0;i{var Lb=Nb(),Hhe=bK(),ru={},Ghe=Object.keys(Lb);function jhe(t){let e=function(...r){let i=r[0];return i==null?i:(i.length>1&&(r=i),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function Yhe(t){let e=function(...r){let i=r[0];if(i==null)return i;i.length>1&&(r=i);let n=t(r);if(typeof n=="object")for(let s=n.length,o=0;o{ru[t]={},Object.defineProperty(ru[t],"channels",{value:Lb[t].channels}),Object.defineProperty(ru[t],"labels",{value:Lb[t].labels});let e=Hhe(t);Object.keys(e).forEach(i=>{let n=e[i];ru[t][i]=Yhe(n),ru[t][i].raw=jhe(n)})});vK.exports=ru});var FK=E((b$e,xK)=>{"use strict";var kK=(t,e)=>(...r)=>`[${t(...r)+e}m`,PK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};5;${i}m`},DK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},PE=t=>t,RK=(t,e,r)=>[t,e,r],iu=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let i=r();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},Tb,nu=(t,e,r,i)=>{Tb===void 0&&(Tb=SK());let n=i?10:0,s={};for(let[o,a]of Object.entries(Tb)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=t(r,n):typeof a=="object"&&(s[l]=t(a[e],n))}return s};function qhe(){let t=new Map,e={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]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],t.set(s[0],s[1]);Object.defineProperty(e,r,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="",e.bgColor.close="",iu(e.color,"ansi",()=>nu(kK,"ansi16",PE,!1)),iu(e.color,"ansi256",()=>nu(PK,"ansi256",PE,!1)),iu(e.color,"ansi16m",()=>nu(DK,"rgb",RK,!1)),iu(e.bgColor,"ansi",()=>nu(kK,"ansi16",PE,!0)),iu(e.bgColor,"ansi256",()=>nu(PK,"ansi256",PE,!0)),iu(e.bgColor,"ansi16m",()=>nu(DK,"rgb",RK,!0)),e}Object.defineProperty(xK,"exports",{enumerable:!0,get:qhe})});var LK=E((v$e,NK)=>{"use strict";NK.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(r+t),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Jhe=require("os"),MK=require("tty"),Wn=LK(),{env:Wr}=process,tA;Wn("no-color")||Wn("no-colors")||Wn("color=false")||Wn("color=never")?tA=0:(Wn("color")||Wn("colors")||Wn("color=true")||Wn("color=always"))&&(tA=1);"FORCE_COLOR"in Wr&&(Wr.FORCE_COLOR==="true"?tA=1:Wr.FORCE_COLOR==="false"?tA=0:tA=Wr.FORCE_COLOR.length===0?1:Math.min(parseInt(Wr.FORCE_COLOR,10),3));function Mb(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function Ob(t,e){if(tA===0)return 0;if(Wn("color=16m")||Wn("color=full")||Wn("color=truecolor"))return 3;if(Wn("color=256"))return 2;if(t&&!e&&tA===void 0)return 0;let r=tA||0;if(Wr.TERM==="dumb")return r;if(process.platform==="win32"){let i=Jhe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in Wr)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in Wr)||Wr.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Wr)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Wr.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Wr)return 1;if(Wr.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Wr){let i=parseInt((Wr.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Wr.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Wr.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Wr.TERM)||"COLORTERM"in Wr?1:r}function Whe(t){let e=Ob(t,t&&t.isTTY);return Mb(e)}TK.exports={supportsColor:Whe,stdout:Mb(Ob(!0,MK.isatty(1))),stderr:Mb(Ob(!0,MK.isatty(2)))}});var UK=E((x$e,KK)=>{"use strict";var zhe=(t,e,r)=>{let i=t.indexOf(e);if(i===-1)return t;let n=e.length,s=0,o="";do o+=t.substr(s,i-s)+e+r,s=i+n,i=t.indexOf(e,s);while(i!==-1);return o+=t.substr(s),o},Vhe=(t,e,r,i)=>{let n=0,s="";do{let o=t[i-1]==="\r";s+=t.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+r,n=i+1,i=t.indexOf(` -`,n)}while(i!==-1);return s+=t.substr(n),s};KK.exports={stringReplaceAll:zhe,stringEncaseCRLFWithFirstIndex:Vhe}});var qK=E((k$e,HK)=>{"use strict";var _he=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,GK=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Xhe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Zhe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,$he=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function jK(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):$he.get(t)||t}function epe(t,e){let r=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))r.push(o);else if(n=s.match(Xhe))r.push(n[2].replace(Zhe,(a,l,c)=>l?jK(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${t}')`)}return r}function tpe(t){GK.lastIndex=0;let e=[],r;for(;(r=GK.exec(t))!==null;){let i=r[1];if(r[2]){let n=epe(i,r[2]);e.push([i].concat(n))}else e.push([i])}return e}function YK(t,e){let r={};for(let n of e)for(let s of n.styles)r[s[0]]=n.inverse?null:s.slice(1);let i=t;for(let[n,s]of Object.entries(r))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}HK.exports=(t,e)=>{let r=[],i=[],n=[];if(e.replace(_he,(s,o,a,l,c,u)=>{if(o)n.push(jK(o));else if(l){let g=n.join("");n=[],i.push(r.length===0?g:YK(t,r)(g)),r.push({inverse:a,styles:tpe(l)})}else if(c){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(YK(t,r)(n.join(""))),n=[],r.pop()}else n.push(u)}),i.push(n.join("")),r.length>0){let s=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var jb=E((P$e,JK)=>{"use strict";var fh=FK(),{stdout:Kb,stderr:Ub}=OK(),{stringReplaceAll:rpe,stringEncaseCRLFWithFirstIndex:ipe}=UK(),WK=["ansi","ansi","ansi256","ansi16m"],su=Object.create(null),npe=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=Kb?Kb.level:0;t.level=e.level===void 0?r:e.level},zK=class{constructor(e){return VK(e)}},VK=t=>{let e={};return npe(e,t),e.template=(...r)=>spe(e.template,...r),Object.setPrototypeOf(e,DE.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=zK,e.template};function DE(t){return VK(t)}for(let[t,e]of Object.entries(fh))su[t]={get(){let r=RE(this,Hb(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};su.visible={get(){let t=RE(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var _K=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of _K)su[t]={get(){let{level:e}=this;return function(...r){let i=Hb(fh.color[WK[e]][t](...r),fh.color.close,this._styler);return RE(this,i,this._isEmpty)}}};for(let t of _K){let e="bg"+t[0].toUpperCase()+t.slice(1);su[e]={get(){let{level:r}=this;return function(...i){let n=Hb(fh.bgColor[WK[r]][t](...i),fh.bgColor.close,this._styler);return RE(this,n,this._isEmpty)}}}}var ope=Object.defineProperties(()=>{},_(P({},su),{level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}})),Hb=(t,e,r)=>{let i,n;return r===void 0?(i=t,n=e):(i=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:i,closeAll:n,parent:r}},RE=(t,e,r)=>{let i=(...n)=>ape(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=ope,i._generator=t,i._styler=e,i._isEmpty=r,i},ape=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:i,closeAll:n}=r;if(e.indexOf("")!==-1)for(;r!==void 0;)e=rpe(e,r.close,r.open),r=r.parent;let s=e.indexOf(` -`);return s!==-1&&(e=ipe(e,n,i,s)),i+e+n},Gb,spe=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let i=e.slice(1),n=[r.raw[0]];for(let s=1;s{XK.exports=[{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:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{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:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{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:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{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",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{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"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var ml=E(Dn=>{"use strict";var $K=ZK(),ro=process.env;Object.defineProperty(Dn,"_vendors",{value:$K.map(function(t){return t.constant})});Dn.name=null;Dn.isPR=null;$K.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(i){return e1(i)});if(Dn[t.constant]=r,r)switch(Dn.name=t.name,typeof t.pr){case"string":Dn.isPR=!!ro[t.pr];break;case"object":"env"in t.pr?Dn.isPR=t.pr.env in ro&&ro[t.pr.env]!==t.pr.ne:"any"in t.pr?Dn.isPR=t.pr.any.some(function(i){return!!ro[i]}):Dn.isPR=e1(t.pr);break;default:Dn.isPR=null}});Dn.isCI=!!(ro.CI||ro.CONTINUOUS_INTEGRATION||ro.BUILD_NUMBER||ro.RUN_ID||Dn.name);function e1(t){return typeof t=="string"?!!ro[t]:Object.keys(t).every(function(e){return ro[e]===t[e]})}});var FE=E(zn=>{"use strict";zn.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;zn.find=(t,e)=>t.nodes.find(r=>r.type===e);zn.exceedsLimit=(t,e,r=1,i)=>i===!1||!zn.isInteger(t)||!zn.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=i;zn.escapeNode=(t,e=0,r)=>{let i=t.nodes[e];!i||(r&&i.type===r||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};zn.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0==0?(t.invalid=!0,!0):!1;zn.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0==0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;zn.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;zn.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);zn.flatten=(...t)=>{let e=[],r=i=>{for(let n=0;n{"use strict";var r1=FE();t1.exports=(t,e={})=>{let r=(i,n={})=>{let s=e.escapeInvalid&&r1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&r1.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=r(l);return a};return r(t)}});var n1=E((L$e,i1)=>{"use strict";i1.exports=function(t){return typeof t=="number"?t-t==0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var f1=E((T$e,s1)=>{"use strict";var o1=n1(),El=(t,e,r)=>{if(o1(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(o1(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=P({relaxZeros:!0},r);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=t+":"+e+"="+n+s+o+a;if(El.cache.hasOwnProperty(l))return El.cache[l].result;let c=Math.min(t,e),u=Math.max(t,e);if(Math.abs(c-u)===1){let d=t+"|"+e;return i.capture?`(${d})`:i.wrap===!1?d:`(?:${d})`}let g=A1(t)||A1(e),f={min:t,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let d=u<0?Math.abs(u):1;p=a1(d,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=a1(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Ape(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),El.cache[l]=f,f.result};function Ape(t,e,r){let i=Yb(t,e,"-",!1,r)||[],n=Yb(e,t,"",!1,r)||[],s=Yb(t,e,"-?",!0,r)||[];return i.concat(s).concat(n).join("|")}function cpe(t,e){let r=1,i=1,n=l1(t,r),s=new Set([e]);for(;t<=n&&n<=e;)s.add(n),r+=1,n=l1(t,r);for(n=c1(e+1,i)-1;t1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+u1(a.count),o=c+1;continue}r.isPadded&&(g=hpe(c,r,i)),u.string=g+u.pattern+u1(u.count),s.push(u),o=c+1,a=u}return s}function Yb(t,e,r,i,n){let s=[];for(let o of t){let{string:a}=o;!i&&!g1(e,"string",a)&&s.push(r+a),i&&g1(e,"string",a)&&s.push(r+a)}return s}function upe(t,e){let r=[];for(let i=0;ie?1:e>t?-1:0}function g1(t,e,r){return t.some(i=>i[e]===r)}function l1(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function c1(t,e){return t-t%Math.pow(10,e)}function u1(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function gpe(t,e,r){return`[${t}${e-t==1?"":"-"}${e}]`}function A1(t){return/^-?(0+)\d/.test(t)}function hpe(t,e,r){if(!e.isPadded)return t;let i=Math.abs(e.maxLen-String(t).length),n=r.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}El.cache={};El.clearCache=()=>El.cache={};s1.exports=El});var Wb=E((M$e,h1)=>{"use strict";var ppe=require("util"),p1=f1(),d1=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),dpe=t=>e=>t===!0?Number(e):String(e),qb=t=>typeof t=="number"||typeof t=="string"&&t!=="",ph=t=>Number.isInteger(+t),Jb=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},Cpe=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,mpe=(t,e,r)=>{if(e>0){let i=t[0]==="-"?"-":"";i&&(t=t.slice(1)),t=i+t.padStart(i?e-1:e,"0")}return r===!1?String(t):t},C1=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((o,a)=>oa?1:0),t.positives.sort((o,a)=>oa?1:0);let r=e.capture?"":"?:",i="",n="",s;return t.positives.length&&(i=t.positives.join("|")),t.negatives.length&&(n=`-(${r}${t.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${r}${s})`:s},m1=(t,e,r,i)=>{if(r)return p1(t,e,P({wrap:!1},i));let n=String.fromCharCode(t);if(t===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},E1=(t,e,r)=>{if(Array.isArray(t)){let i=r.wrap===!0,n=r.capture?"":"?:";return i?`(${n}${t.join("|")})`:t.join("|")}return p1(t,e,r)},I1=(...t)=>new RangeError("Invalid range arguments: "+ppe.inspect(...t)),y1=(t,e,r)=>{if(r.strictRanges===!0)throw I1([t,e]);return[]},Ipe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},ype=(t,e,r=1,i={})=>{let n=Number(t),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw I1([t,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(t),l=String(e),c=String(r);r=Math.max(Math.abs(r),1);let u=Jb(a)||Jb(l)||Jb(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Cpe(t,e,i)===!1,h=i.transform||dpe(f);if(i.toRegex&&r===1)return m1(C1(t,g),C1(e,g),!0,i);let p={negatives:[],positives:[]},d=B=>p[B<0?"negatives":"positives"].push(Math.abs(B)),m=[],I=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&r>1?d(n):m.push(mpe(h(n,I),g,f)),n=o?n-r:n+r,I++;return i.toRegex===!0?r>1?Epe(p,i):E1(m,null,P({wrap:!1},i)):m},wpe=(t,e,r=1,i={})=>{if(!ph(t)&&t.length>1||!ph(e)&&e.length>1)return y1(t,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${t}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&r===1)return m1(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-r:s+r,g++;return i.toRegex===!0?E1(u,null,{wrap:!1,options:i}):u},LE=(t,e,r,i={})=>{if(e==null&&qb(t))return[t];if(!qb(t)||!qb(e))return y1(t,e,i);if(typeof r=="function")return LE(t,e,1,{transform:r});if(d1(r))return LE(t,e,0,r);let n=P({},i);return n.capture===!0&&(n.wrap=!0),r=r||n.step||1,ph(r)?ph(t)&&ph(e)?ype(t,e,r,n):wpe(t,e,Math.max(Math.abs(r),1),n):r!=null&&!d1(r)?Ipe(r,n):LE(t,e,1,r)};h1.exports=LE});var Q1=E((O$e,w1)=>{"use strict";var Bpe=Wb(),B1=FE(),Qpe=(t,e={})=>{let r=(i,n={})=>{let s=B1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=B1.reduce(i.nodes),g=Bpe(...u,_(P({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=r(u,i);return c};return r(t)};w1.exports=Qpe});var S1=E((K$e,b1)=>{"use strict";var bpe=Wb(),v1=NE(),ou=FE(),Il=(t="",e="",r=!1)=>{let i=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?ou.flatten(e).map(n=>`{${n}}`):e;for(let n of t)if(Array.isArray(n))for(let s of n)i.push(Il(s,e,r));else for(let s of e)r===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Il(n,s,r):n+s);return ou.flatten(i)},vpe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Il(a.pop(),v1(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Il(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=ou.reduce(n.nodes);if(ou.exceedsLimit(...g,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=bpe(...g,e);f.length===0&&(f=v1(n,e)),a.push(Il(a.pop(),f)),n.nodes=[];return}let l=ou.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";x1.exports={MAX_LENGTH:1024*64,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:` -`,CHAR_NO_BREAK_SPACE:"\xA0",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:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var N1=E((H$e,P1)=>{"use strict";var Spe=NE(),{MAX_LENGTH:D1,CHAR_BACKSLASH:zb,CHAR_BACKTICK:xpe,CHAR_COMMA:kpe,CHAR_DOT:Ppe,CHAR_LEFT_PARENTHESES:Dpe,CHAR_RIGHT_PARENTHESES:Rpe,CHAR_LEFT_CURLY_BRACE:Fpe,CHAR_RIGHT_CURLY_BRACE:Npe,CHAR_LEFT_SQUARE_BRACKET:R1,CHAR_RIGHT_SQUARE_BRACKET:F1,CHAR_DOUBLE_QUOTE:Lpe,CHAR_SINGLE_QUOTE:Tpe,CHAR_NO_BREAK_SPACE:Mpe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ope}=k1(),Kpe=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},i=typeof r.maxLength=="number"?Math.min(D1,r.maxLength):D1;if(t.length>i)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${i})`);let n={type:"root",input:t,nodes:[]},s=[n],o=n,a=n,l=0,c=t.length,u=0,g=0,f,h={},p=()=>t[u++],d=m=>{if(m.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&m.type==="text"){a.value+=m.value;return}return o.nodes.push(m),m.parent=o,m.prev=a,a=m,m};for(d({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let m=o.nodes.shift();o.nodes=[m,{type:"text",value:Spe(o)}]}d({type:"comma",value:f}),o.commas++;continue}if(f===Ppe&&g>0&&o.commas===0){let m=o.nodes;if(g===0||m.length===0){d({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){m.pop();let I=m[m.length-1];I.value+=a.value+f,a=I,o.ranges--;continue}d({type:"dot",value:f});continue}d({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(B=>{B.nodes||(B.type==="open"&&(B.isOpen=!0),B.type==="close"&&(B.isClose=!0),B.nodes||(B.type="text"),B.invalid=!0)});let m=s[s.length-1],I=m.nodes.indexOf(o);m.nodes.splice(I,1,...o.nodes)}while(s.length>0);return d({type:"eos"}),n};P1.exports=Kpe});var M1=E((G$e,L1)=>{"use strict";var T1=NE(),Upe=Q1(),Hpe=S1(),Gpe=N1(),Rn=(t,e={})=>{let r=[];if(Array.isArray(t))for(let i of t){let n=Rn.create(i,e);Array.isArray(n)?r.push(...n):r.push(n)}else r=[].concat(Rn.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.parse=(t,e={})=>Gpe(t,e);Rn.stringify=(t,e={})=>typeof t=="string"?T1(Rn.parse(t,e),e):T1(t,e);Rn.compile=(t,e={})=>(typeof t=="string"&&(t=Rn.parse(t,e)),Upe(t,e));Rn.expand=(t,e={})=>{typeof t=="string"&&(t=Rn.parse(t,e));let r=Hpe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?Rn.compile(t,e):Rn.expand(t,e);L1.exports=Rn});var dh=E((j$e,O1)=>{"use strict";var jpe=require("path"),io="\\\\/",K1=`[^${io}]`,ea="\\.",Ype="\\+",qpe="\\?",TE="\\/",Jpe="(?=.)",U1="[^/]",Vb=`(?:${TE}|$)`,H1=`(?:^|${TE})`,_b=`${ea}{1,2}${Vb}`,Wpe=`(?!${ea})`,zpe=`(?!${H1}${_b})`,Vpe=`(?!${ea}{0,1}${Vb})`,_pe=`(?!${_b})`,Xpe=`[^.${TE}]`,Zpe=`${U1}*?`,G1={DOT_LITERAL:ea,PLUS_LITERAL:Ype,QMARK_LITERAL:qpe,SLASH_LITERAL:TE,ONE_CHAR:Jpe,QMARK:U1,END_ANCHOR:Vb,DOTS_SLASH:_b,NO_DOT:Wpe,NO_DOTS:zpe,NO_DOT_SLASH:Vpe,NO_DOTS_SLASH:_pe,QMARK_NO_DOT:Xpe,STAR:Zpe,START_ANCHOR:H1},$pe=_(P({},G1),{SLASH_LITERAL:`[${io}]`,QMARK:K1,STAR:`${K1}*?`,DOTS_SLASH:`${ea}{1,2}(?:[${io}]|$)`,NO_DOT:`(?!${ea})`,NO_DOTS:`(?!(?:^|[${io}])${ea}{1,2}(?:[${io}]|$))`,NO_DOT_SLASH:`(?!${ea}{0,1}(?:[${io}]|$))`,NO_DOTS_SLASH:`(?!${ea}{1,2}(?:[${io}]|$))`,QMARK_NO_DOT:`[^.${io}]`,START_ANCHOR:`(?:^|[${io}])`,END_ANCHOR:`(?:[${io}]|$)`}),ede={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"};O1.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:ede,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:jpe.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?$pe:G1}}});var Ch=E(cn=>{"use strict";var tde=require("path"),rde=process.platform==="win32",{REGEX_BACKSLASH:ide,REGEX_REMOVE_BACKSLASH:nde,REGEX_SPECIAL_CHARS:sde,REGEX_SPECIAL_CHARS_GLOBAL:ode}=dh();cn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);cn.hasRegexChars=t=>sde.test(t);cn.isRegexChar=t=>t.length===1&&cn.hasRegexChars(t);cn.escapeRegex=t=>t.replace(ode,"\\$1");cn.toPosixSlashes=t=>t.replace(ide,"/");cn.removeBackslashes=t=>t.replace(nde,e=>e==="\\"?"":e);cn.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};cn.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:rde===!0||tde.sep==="\\";cn.escapeLast=(t,e,r)=>{let i=t.lastIndexOf(e,r);return i===-1?t:t[i-1]==="\\"?cn.escapeLast(t,e,i-1):`${t.slice(0,i)}\\${t.slice(i)}`};cn.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};cn.wrapOutput=(t,e={},r={})=>{let i=r.contains?"":"^",n=r.contains?"":"$",s=`${i}(?:${t})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var X1=E((q$e,j1)=>{"use strict";var Y1=Ch(),{CHAR_ASTERISK:Xb,CHAR_AT:ade,CHAR_BACKWARD_SLASH:mh,CHAR_COMMA:Ade,CHAR_DOT:Zb,CHAR_EXCLAMATION_MARK:q1,CHAR_FORWARD_SLASH:J1,CHAR_LEFT_CURLY_BRACE:$b,CHAR_LEFT_PARENTHESES:ev,CHAR_LEFT_SQUARE_BRACKET:lde,CHAR_PLUS:cde,CHAR_QUESTION_MARK:W1,CHAR_RIGHT_CURLY_BRACE:ude,CHAR_RIGHT_PARENTHESES:z1,CHAR_RIGHT_SQUARE_BRACKET:gde}=dh(),V1=t=>t===J1||t===mh,_1=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?Infinity:1)},fde=(t,e)=>{let r=e||{},i=t.length-1,n=r.parts===!0||r.scanToEnd===!0,s=[],o=[],a=[],l=t,c=-1,u=0,g=0,f=!1,h=!1,p=!1,d=!1,m=!1,I=!1,B=!1,b=!1,R=!1,H=0,L,K,J={value:"",depth:0,isGlob:!1},ne=()=>c>=i,q=()=>l.charCodeAt(c+1),A=()=>(L=K,l.charCodeAt(++c));for(;c0&&(W=l.slice(0,u),l=l.slice(u),g-=u),V&&p===!0&&g>0?(V=l.slice(0,g),X=l.slice(g)):p===!0?(V="",X=l):V=l,V&&V!==""&&V!=="/"&&V!==l&&V1(V.charCodeAt(V.length-1))&&(V=V.slice(0,-1)),r.unescape===!0&&(X&&(X=Y1.removeBackslashes(X)),V&&B===!0&&(V=Y1.removeBackslashes(V)));let F={prefix:W,input:t,start:u,base:V,glob:X,isBrace:f,isBracket:h,isGlob:p,isExtglob:d,isGlobstar:m,negated:b};if(r.tokens===!0&&(F.maxDepth=0,V1(K)||o.push(J),F.tokens=o),r.parts===!0||r.tokens===!0){let D;for(let he=0;he{"use strict";var ME=dh(),Fn=Ch(),{MAX_LENGTH:OE,POSIX_REGEX_SOURCE:hde,REGEX_NON_SPECIAL_CHARS:pde,REGEX_SPECIAL_CHARS_BACKREF:dde,REPLACEMENTS:$1}=ME,Cde=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch(i){return t.map(n=>Fn.escapeRegex(n)).join("..")}return r},au=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,eU=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=$1[t]||t;let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OE,r.maxLength):OE,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:r.prepend||""},o=[s],a=r.capture?"":"?:",l=Fn.isWindows(e),c=ME.globChars(l),u=ME.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:d,NO_DOT:m,NO_DOT_SLASH:I,NO_DOTS_SLASH:B,QMARK:b,QMARK_NO_DOT:R,STAR:H,START_ANCHOR:L}=c,K=G=>`(${a}(?:(?!${L}${G.dot?d:g}).)*?)`,J=r.dot?"":m,ne=r.dot?b:R,q=r.bash===!0?K(r):H;r.capture&&(q=`(${q})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let A={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};t=Fn.removePrefix(t,A),n=t.length;let V=[],W=[],X=[],F=s,D,he=()=>A.index===n-1,pe=A.peek=(G=1)=>t[A.index+G],Ne=A.advance=()=>t[++A.index],Pe=()=>t.slice(A.index+1),qe=(G="",Ce=0)=>{A.consumed+=G,A.index+=Ce},re=G=>{A.output+=G.output!=null?G.output:G.value,qe(G.value)},se=()=>{let G=1;for(;pe()==="!"&&(pe(2)!=="("||pe(3)==="?");)Ne(),A.start++,G++;return G%2==0?!1:(A.negated=!0,A.start++,!0)},be=G=>{A[G]++,X.push(G)},ae=G=>{A[G]--,X.pop()},Ae=G=>{if(F.type==="globstar"){let Ce=A.braces>0&&(G.type==="comma"||G.type==="brace"),ee=G.extglob===!0||V.length&&(G.type==="pipe"||G.type==="paren");G.type!=="slash"&&G.type!=="paren"&&!Ce&&!ee&&(A.output=A.output.slice(0,-F.output.length),F.type="star",F.value="*",F.output=q,A.output+=F.output)}if(V.length&&G.type!=="paren"&&!u[G.value]&&(V[V.length-1].inner+=G.value),(G.value||G.output)&&re(G),F&&F.type==="text"&&G.type==="text"){F.value+=G.value,F.output=(F.output||"")+G.value;return}G.prev=F,o.push(G),F=G},De=(G,Ce)=>{let ee=_(P({},u[Ce]),{conditions:1,inner:""});ee.prev=F,ee.parens=A.parens,ee.output=A.output;let Ue=(r.capture?"(":"")+ee.open;be("parens"),Ae({type:G,value:Ce,output:A.output?"":p}),Ae({type:"paren",extglob:!0,value:Ne(),output:Ue}),V.push(ee)},$=G=>{let Ce=G.close+(r.capture?")":"");if(G.type==="negate"){let ee=q;G.inner&&G.inner.length>1&&G.inner.includes("/")&&(ee=K(r)),(ee!==q||he()||/^\)+$/.test(Pe()))&&(Ce=G.close=`)$))${ee}`),G.prev.type==="bos"&&(A.negatedExtglob=!0)}Ae({type:"paren",extglob:!0,value:D,output:Ce}),ae("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let G=!1,Ce=t.replace(dde,(ee,Ue,Oe,vt,dt,ri)=>vt==="\\"?(G=!0,ee):vt==="?"?Ue?Ue+vt+(dt?b.repeat(dt.length):""):ri===0?ne+(dt?b.repeat(dt.length):""):b.repeat(Oe.length):vt==="."?g.repeat(Oe.length):vt==="*"?Ue?Ue+vt+(dt?q:""):q:Ue?ee:`\\${ee}`);return G===!0&&(r.unescape===!0?Ce=Ce.replace(/\\/g,""):Ce=Ce.replace(/\\+/g,ee=>ee.length%2==0?"\\\\":ee?"\\":"")),Ce===t&&r.contains===!0?(A.output=t,A):(A.output=Fn.wrapOutput(Ce,A,e),A)}for(;!he();){if(D=Ne(),D==="\0")continue;if(D==="\\"){let ee=pe();if(ee==="/"&&r.bash!==!0||ee==="."||ee===";")continue;if(!ee){D+="\\",Ae({type:"text",value:D});continue}let Ue=/^\\+/.exec(Pe()),Oe=0;if(Ue&&Ue[0].length>2&&(Oe=Ue[0].length,A.index+=Oe,Oe%2!=0&&(D+="\\")),r.unescape===!0?D=Ne()||"":D+=Ne()||"",A.brackets===0){Ae({type:"text",value:D});continue}}if(A.brackets>0&&(D!=="]"||F.value==="["||F.value==="[^")){if(r.posix!==!1&&D===":"){let ee=F.value.slice(1);if(ee.includes("[")&&(F.posix=!0,ee.includes(":"))){let Ue=F.value.lastIndexOf("["),Oe=F.value.slice(0,Ue),vt=F.value.slice(Ue+2),dt=hde[vt];if(dt){F.value=Oe+dt,A.backtrack=!0,Ne(),!s.output&&o.indexOf(F)===1&&(s.output=p);continue}}}(D==="["&&pe()!==":"||D==="-"&&pe()==="]")&&(D=`\\${D}`),D==="]"&&(F.value==="["||F.value==="[^")&&(D=`\\${D}`),r.posix===!0&&D==="!"&&F.value==="["&&(D="^"),F.value+=D,re({value:D});continue}if(A.quotes===1&&D!=='"'){D=Fn.escapeRegex(D),F.value+=D,re({value:D});continue}if(D==='"'){A.quotes=A.quotes===1?0:1,r.keepQuotes===!0&&Ae({type:"text",value:D});continue}if(D==="("){be("parens"),Ae({type:"paren",value:D});continue}if(D===")"){if(A.parens===0&&r.strictBrackets===!0)throw new SyntaxError(au("opening","("));let ee=V[V.length-1];if(ee&&A.parens===ee.parens+1){$(V.pop());continue}Ae({type:"paren",value:D,output:A.parens?")":"\\)"}),ae("parens");continue}if(D==="["){if(r.nobracket===!0||!Pe().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));D=`\\${D}`}else be("brackets");Ae({type:"bracket",value:D});continue}if(D==="]"){if(r.nobracket===!0||F&&F.type==="bracket"&&F.value.length===1){Ae({type:"text",value:D,output:`\\${D}`});continue}if(A.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(au("opening","["));Ae({type:"text",value:D,output:`\\${D}`});continue}ae("brackets");let ee=F.value.slice(1);if(F.posix!==!0&&ee[0]==="^"&&!ee.includes("/")&&(D=`/${D}`),F.value+=D,re({value:D}),r.literalBrackets===!1||Fn.hasRegexChars(ee))continue;let Ue=Fn.escapeRegex(F.value);if(A.output=A.output.slice(0,-F.value.length),r.literalBrackets===!0){A.output+=Ue,F.value=Ue;continue}F.value=`(${a}${Ue}|${F.value})`,A.output+=F.value;continue}if(D==="{"&&r.nobrace!==!0){be("braces");let ee={type:"brace",value:D,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};W.push(ee),Ae(ee);continue}if(D==="}"){let ee=W[W.length-1];if(r.nobrace===!0||!ee){Ae({type:"text",value:D,output:D});continue}let Ue=")";if(ee.dots===!0){let Oe=o.slice(),vt=[];for(let dt=Oe.length-1;dt>=0&&(o.pop(),Oe[dt].type!=="brace");dt--)Oe[dt].type!=="dots"&&vt.unshift(Oe[dt].value);Ue=Cde(vt,r),A.backtrack=!0}if(ee.comma!==!0&&ee.dots!==!0){let Oe=A.output.slice(0,ee.outputIndex),vt=A.tokens.slice(ee.tokensIndex);ee.value=ee.output="\\{",D=Ue="\\}",A.output=Oe;for(let dt of vt)A.output+=dt.output||dt.value}Ae({type:"brace",value:D,output:Ue}),ae("braces"),W.pop();continue}if(D==="|"){V.length>0&&V[V.length-1].conditions++,Ae({type:"text",value:D});continue}if(D===","){let ee=D,Ue=W[W.length-1];Ue&&X[X.length-1]==="braces"&&(Ue.comma=!0,ee="|"),Ae({type:"comma",value:D,output:ee});continue}if(D==="/"){if(F.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),F=s;continue}Ae({type:"slash",value:D,output:h});continue}if(D==="."){if(A.braces>0&&F.type==="dot"){F.value==="."&&(F.output=g);let ee=W[W.length-1];F.type="dots",F.output+=D,F.value+=D,ee.dots=!0;continue}if(A.braces+A.parens===0&&F.type!=="bos"&&F.type!=="slash"){Ae({type:"text",value:D,output:g});continue}Ae({type:"dot",value:D,output:g});continue}if(D==="?"){if(!(F&&F.value==="(")&&r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("qmark",D);continue}if(F&&F.type==="paren"){let Ue=pe(),Oe=D;if(Ue==="<"&&!Fn.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(F.value==="("&&!/[!=<:]/.test(Ue)||Ue==="<"&&!/<([!=]|\w+>)/.test(Pe()))&&(Oe=`\\${D}`),Ae({type:"text",value:D,output:Oe});continue}if(r.dot!==!0&&(F.type==="slash"||F.type==="bos")){Ae({type:"qmark",value:D,output:R});continue}Ae({type:"qmark",value:D,output:b});continue}if(D==="!"){if(r.noextglob!==!0&&pe()==="("&&(pe(2)!=="?"||!/[!=<:]/.test(pe(3)))){De("negate",D);continue}if(r.nonegate!==!0&&A.index===0){se();continue}}if(D==="+"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("plus",D);continue}if(F&&F.value==="("||r.regex===!1){Ae({type:"plus",value:D,output:f});continue}if(F&&(F.type==="bracket"||F.type==="paren"||F.type==="brace")||A.parens>0){Ae({type:"plus",value:D});continue}Ae({type:"plus",value:f});continue}if(D==="@"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){Ae({type:"at",extglob:!0,value:D,output:""});continue}Ae({type:"text",value:D});continue}if(D!=="*"){(D==="$"||D==="^")&&(D=`\\${D}`);let ee=pde.exec(Pe());ee&&(D+=ee[0],A.index+=ee[0].length),Ae({type:"text",value:D});continue}if(F&&(F.type==="globstar"||F.star===!0)){F.type="star",F.star=!0,F.value+=D,F.output=q,A.backtrack=!0,A.globstar=!0,qe(D);continue}let G=Pe();if(r.noextglob!==!0&&/^\([^?]/.test(G)){De("star",D);continue}if(F.type==="star"){if(r.noglobstar===!0){qe(D);continue}let ee=F.prev,Ue=ee.prev,Oe=ee.type==="slash"||ee.type==="bos",vt=Ue&&(Ue.type==="star"||Ue.type==="globstar");if(r.bash===!0&&(!Oe||G[0]&&G[0]!=="/")){Ae({type:"star",value:D,output:""});continue}let dt=A.braces>0&&(ee.type==="comma"||ee.type==="brace"),ri=V.length&&(ee.type==="pipe"||ee.type==="paren");if(!Oe&&ee.type!=="paren"&&!dt&&!ri){Ae({type:"star",value:D,output:""});continue}for(;G.slice(0,3)==="/**";){let ii=t[A.index+4];if(ii&&ii!=="/")break;G=G.slice(3),qe("/**",3)}if(ee.type==="bos"&&he()){F.type="globstar",F.value+=D,F.output=K(r),A.output=F.output,A.globstar=!0,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&!vt&&he()){A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=K(r)+(r.strictSlashes?")":"|$)"),F.value+=D,A.globstar=!0,A.output+=ee.output+F.output,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&G[0]==="/"){let ii=G[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=`${K(r)}${h}|${h}${ii})`,F.value+=D,A.output+=ee.output+F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}if(ee.type==="bos"&&G[0]==="/"){F.type="globstar",F.value+=D,F.output=`(?:^|${h}|${K(r)}${h})`,A.output=F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-F.output.length),F.type="globstar",F.output=K(r),F.value+=D,A.output+=F.output,A.globstar=!0,qe(D);continue}let Ce={type:"star",value:D,output:q};if(r.bash===!0){Ce.output=".*?",(F.type==="bos"||F.type==="slash")&&(Ce.output=J+Ce.output),Ae(Ce);continue}if(F&&(F.type==="bracket"||F.type==="paren")&&r.regex===!0){Ce.output=D,Ae(Ce);continue}(A.index===A.start||F.type==="slash"||F.type==="dot")&&(F.type==="dot"?(A.output+=I,F.output+=I):r.dot===!0?(A.output+=B,F.output+=B):(A.output+=J,F.output+=J),pe()!=="*"&&(A.output+=p,F.output+=p)),Ae(Ce)}for(;A.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));A.output=Fn.escapeLast(A.output,"["),ae("brackets")}for(;A.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing",")"));A.output=Fn.escapeLast(A.output,"("),ae("parens")}for(;A.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","}"));A.output=Fn.escapeLast(A.output,"{"),ae("braces")}if(r.strictSlashes!==!0&&(F.type==="star"||F.type==="bracket")&&Ae({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let G of A.tokens)A.output+=G.output!=null?G.output:G.value,G.suffix&&(A.output+=G.suffix)}return A};eU.fastpaths=(t,e)=>{let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OE,r.maxLength):OE,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);t=$1[t]||t;let s=Fn.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=ME.globChars(s),d=r.dot?g:u,m=r.dot?f:u,I=r.capture?"":"?:",B={negated:!1,prefix:""},b=r.bash===!0?".*?":h;r.capture&&(b=`(${b})`);let R=J=>J.noglobstar===!0?b:`(${I}(?:(?!${p}${J.dot?c:o}).)*?)`,H=J=>{switch(J){case"*":return`${d}${l}${b}`;case".*":return`${o}${l}${b}`;case"*.*":return`${d}${b}${o}${l}${b}`;case"*/*":return`${d}${b}${a}${l}${m}${b}`;case"**":return d+R(r);case"**/*":return`(?:${d}${R(r)}${a})?${m}${l}${b}`;case"**/*.*":return`(?:${d}${R(r)}${a})?${m}${b}${o}${l}${b}`;case"**/.*":return`(?:${d}${R(r)}${a})?${o}${l}${b}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(J);if(!ne)return;let q=H(ne[1]);return q?q+o+ne[2]:void 0}}},L=Fn.removePrefix(t,B),K=H(L);return K&&r.strictSlashes!==!0&&(K+=`${a}?`),K};Z1.exports=eU});var iU=E((W$e,rU)=>{"use strict";var mde=require("path"),Ede=X1(),tv=tU(),rv=Ch(),Ide=dh(),yde=t=>t&&typeof t=="object"&&!Array.isArray(t),Dr=(t,e,r=!1)=>{if(Array.isArray(t)){let u=t.map(f=>Dr(f,e,r));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=yde(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=rv.isWindows(e),o=i?Dr.compileRe(t,e):Dr.makeRe(t,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=_(P({},e),{ignore:null,onMatch:null,onResult:null});l=Dr(n.ignore,u,r)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Dr.test(u,o,e,{glob:t,posix:s}),d={glob:t,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(d),f===!1?(d.isMatch=!1,g?d:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(d),d.isMatch=!1,g?d:!1):(typeof n.onMatch=="function"&&n.onMatch(d),g?d:!0)};return r&&(c.state=a),c};Dr.test=(t,e,r,{glob:i,posix:n}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let s=r||{},o=s.format||(n?rv.toPosixSlashes:null),a=t===i,l=a&&o?o(t):t;return a===!1&&(l=o?o(t):t,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Dr.matchBase(t,e,r,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Dr.matchBase=(t,e,r,i=rv.isWindows(r))=>(e instanceof RegExp?e:Dr.makeRe(e,r)).test(mde.basename(t));Dr.isMatch=(t,e,r)=>Dr(e,r)(t);Dr.parse=(t,e)=>Array.isArray(t)?t.map(r=>Dr.parse(r,e)):tv(t,_(P({},e),{fastpaths:!1}));Dr.scan=(t,e)=>Ede(t,e);Dr.compileRe=(t,e,r=!1,i=!1)=>{if(r===!0)return t.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${t.output})${o}`;t&&t.negated===!0&&(a=`^(?!${a}).*$`);let l=Dr.toRegex(a,e);return i===!0&&(l.state=t),l};Dr.makeRe=(t,e,r=!1,i=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let n=e||{},s={negated:!1,fastpaths:!0},o="",a;return t.startsWith("./")&&(t=t.slice(2),o=s.prefix="./"),n.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a=tv.fastpaths(t,e)),a===void 0?(s=tv(t,e),s.prefix=o+(s.prefix||"")):s.output=a,Dr.compileRe(s,e,r,i)};Dr.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Dr.constants=Ide;rU.exports=Dr});var iv=E((z$e,nU)=>{"use strict";nU.exports=iU()});var Nn=E((V$e,sU)=>{"use strict";var oU=require("util"),aU=M1(),no=iv(),nv=Ch(),AU=t=>typeof t=="string"&&(t===""||t==="./"),pr=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),r&&r.onResult&&r.onResult(u)};for(let u=0;u!i.has(u));if(r&&c.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};pr.match=pr;pr.matcher=(t,e)=>no(t,e);pr.isMatch=(t,e,r)=>no(e,r)(t);pr.any=pr.isMatch;pr.not=(t,e,r={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{r.onResult&&r.onResult(a),n.push(a.output)},o=pr(t,e,_(P({},r),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};pr.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);if(Array.isArray(e))return e.some(i=>pr.contains(t,i,r));if(typeof e=="string"){if(AU(t)||AU(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return pr.isMatch(t,e,_(P({},r),{contains:!0}))};pr.matchKeys=(t,e,r)=>{if(!nv.isObject(t))throw new TypeError("Expected the first argument to be an object");let i=pr(Object.keys(t),e,r),n={};for(let s of i)n[s]=t[s];return n};pr.some=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(i.some(o=>s(o)))return!0}return!1};pr.every=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(!i.every(o=>s(o)))return!1}return!0};pr.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);return[].concat(e).every(i=>no(i,r)(t))};pr.capture=(t,e,r)=>{let i=nv.isWindows(r),s=no.makeRe(String(t),_(P({},r),{capture:!0})).exec(i?nv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};pr.makeRe=(...t)=>no.makeRe(...t);pr.scan=(...t)=>no.scan(...t);pr.parse=(t,e)=>{let r=[];for(let i of[].concat(t||[]))for(let n of aU(String(i),e))r.push(no.parse(n,e));return r};pr.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:aU(t,e)};pr.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return pr.braces(t,_(P({},e),{expand:!0}))};sU.exports=pr});var cU=E((_$e,lU)=>{"use strict";lU.exports=({onlyFirst:t=!1}={})=>{let e=["[\\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(e,t?void 0:"g")}});var gU=E((X$e,uU)=>{"use strict";var wde=cU();uU.exports=t=>typeof t=="string"?t.replace(wde(),""):t});var lu={};it(lu,{KeyRelationship:()=>Bl,applyCascade:()=>fv,base64RegExp:()=>CU,colorStringAlphaRegExp:()=>dU,colorStringRegExp:()=>pU,computeKey:()=>rA,getPrintable:()=>Mr,hasExactLength:()=>wU,hasForbiddenKeys:()=>eCe,hasKeyRelationship:()=>pv,hasMaxLength:()=>Mde,hasMinLength:()=>Tde,hasMutuallyExclusiveKeys:()=>tCe,hasRequiredKeys:()=>$de,hasUniqueItems:()=>Ode,isArray:()=>xde,isAtLeast:()=>Hde,isAtMost:()=>Gde,isBase64:()=>Xde,isBoolean:()=>bde,isDate:()=>Sde,isDict:()=>Pde,isEnum:()=>Yi,isHexColor:()=>_de,isISO8601:()=>Vde,isInExclusiveRange:()=>Yde,isInInclusiveRange:()=>jde,isInstanceOf:()=>Rde,isInteger:()=>qde,isJSON:()=>Zde,isLiteral:()=>Bde,isLowerCase:()=>Jde,isNegative:()=>Kde,isNullable:()=>Lde,isNumber:()=>vde,isObject:()=>Dde,isOneOf:()=>Fde,isOptional:()=>Nde,isPositive:()=>Ude,isString:()=>gv,isTuple:()=>kde,isUUID4:()=>zde,isUnknown:()=>yU,isUpperCase:()=>Wde,iso8601RegExp:()=>uv,makeCoercionFn:()=>wl,makeSetter:()=>IU,makeTrait:()=>EU,makeValidator:()=>Ct,matchesRegExp:()=>hv,plural:()=>GE,pushError:()=>at,simpleKeyRegExp:()=>hU,uuid4RegExp:()=>mU});function Ct({test:t}){return EU(t)()}function Mr(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function rA(t,e){var r,i,n;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:hU.test(e)?`${(i=t==null?void 0:t.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=t==null?void 0:t.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wl(t,e){return r=>{let i=t[e];return t[e]=r,wl(t,e).bind(null,i)}}function IU(t,e){return r=>{t[e]=r}}function GE(t,e,r){return t===1?e:r}function at({errors:t,p:e}={},r){return t==null||t.push(`${e!=null?e:"."}: ${r}`),!1}function Bde(t){return Ct({test:(e,r)=>e!==t?at(r,`Expected a literal (got ${Mr(t)})`):!0})}function Yi(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return Ct({test:(i,n)=>r.has(i)?!0:at(n,`Expected a valid enumeration value (got ${Mr(i)})`)})}var hU,pU,dU,CU,mU,uv,EU,yU,gv,Qde,bde,vde,Sde,xde,kde,Pde,Dde,Rde,Fde,fv,Nde,Lde,Tde,Mde,wU,Ode,Kde,Ude,Hde,Gde,jde,Yde,qde,hv,Jde,Wde,zde,Vde,_de,Xde,Zde,$de,eCe,tCe,Bl,rCe,pv,Ss=Yfe(()=>{hU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,pU=/^#[0-9a-f]{6}$/i,dU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,CU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,mU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,uv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,EU=t=>()=>t;yU=()=>Ct({test:(t,e)=>!0});gv=()=>Ct({test:(t,e)=>typeof t!="string"?at(e,`Expected a string (got ${Mr(t)})`):!0});Qde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),bde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i=Qde.get(t);if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a boolean (got ${Mr(t)})`)}return!0}}),vde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===t)i=n;else return at(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a number (got ${Mr(t)})`)}return!0}}),Sde=()=>Ct({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"&&uv.test(t))i=new Date(t);else{let n;if(typeof t=="string"){let s;try{s=JSON.parse(t)}catch(o){}typeof s=="number"&&(n=s)}else typeof t=="number"&&(n=t);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return at(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a date (got ${Mr(t)})`)}return!0}}),xde=(t,{delimiter:e}={})=>Ct({test:(r,i)=>{var n;if(typeof r=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");r=r.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,r)])}if(!Array.isArray(r))return at(i,`Expected an array (got ${Mr(r)})`);let s=!0;for(let o=0,a=r.length;o{let r=wU(t.length);return Ct({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return at(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return at(n,`Expected a tuple (got ${Mr(i)})`);let o=r(i,Object.assign({},n));for(let a=0,l=i.length;aCt({test:(r,i)=>{if(typeof r!="object"||r===null)return at(i,`Expected an object (got ${Mr(r)})`);let n=Object.keys(r),s=!0;for(let o=0,a=n.length;o{let r=Object.keys(t);return Ct({test:(i,n)=>{if(typeof i!="object"||i===null)return at(n,`Expected an object (got ${Mr(i)})`);let s=new Set([...r,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(t,l)?t[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:rA(n,l),coercion:wl(i,l)}))&&a:e===null?a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),`Extraneous property (got ${Mr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:IU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Rde=t=>Ct({test:(e,r)=>e instanceof t?!0:at(r,`Expected an instance of ${t.name} (got ${Mr(e)})`)}),Fde=(t,{exclusive:e=!1}={})=>Ct({test:(r,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=t.length;c1?at(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fv=(t,e)=>Ct({test:(r,i)=>{var n,s;let o={value:r},a=typeof(i==null?void 0:i.coercions)!="undefined"?wl(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!t(r,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==r){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Nde=t=>Ct({test:(e,r)=>typeof e=="undefined"?!0:t(e,r)}),Lde=t=>Ct({test:(e,r)=>e===null?!0:t(e,r)}),Tde=t=>Ct({test:(e,r)=>e.length>=t?!0:at(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),Mde=t=>Ct({test:(e,r)=>e.length<=t?!0:at(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),wU=t=>Ct({test:(e,r)=>e.length!==t?at(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),Ode=({map:t}={})=>Ct({test:(e,r)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sCt({test:(t,e)=>t<=0?!0:at(e,`Expected to be negative (got ${t})`)}),Ude=()=>Ct({test:(t,e)=>t>=0?!0:at(e,`Expected to be positive (got ${t})`)}),Hde=t=>Ct({test:(e,r)=>e>=t?!0:at(r,`Expected to be at least ${t} (got ${e})`)}),Gde=t=>Ct({test:(e,r)=>e<=t?!0:at(r,`Expected to be at most ${t} (got ${e})`)}),jde=(t,e)=>Ct({test:(r,i)=>r>=t&&r<=e?!0:at(i,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),Yde=(t,e)=>Ct({test:(r,i)=>r>=t&&rCt({test:(e,r)=>e!==Math.round(e)?at(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:at(r,`Expected to be a safe integer (got ${e})`)}),hv=t=>Ct({test:(e,r)=>t.test(e)?!0:at(r,`Expected to match the pattern ${t.toString()} (got ${Mr(e)})`)}),Jde=()=>Ct({test:(t,e)=>t!==t.toLowerCase()?at(e,`Expected to be all-lowercase (got ${t})`):!0}),Wde=()=>Ct({test:(t,e)=>t!==t.toUpperCase()?at(e,`Expected to be all-uppercase (got ${t})`):!0}),zde=()=>Ct({test:(t,e)=>mU.test(t)?!0:at(e,`Expected to be a valid UUID v4 (got ${Mr(t)})`)}),Vde=()=>Ct({test:(t,e)=>uv.test(t)?!1:at(e,`Expected to be a valid ISO 8601 date string (got ${Mr(t)})`)}),_de=({alpha:t=!1})=>Ct({test:(e,r)=>(t?pU.test(e):dU.test(e))?!0:at(r,`Expected to be a valid hexadecimal color string (got ${Mr(e)})`)}),Xde=()=>Ct({test:(t,e)=>CU.test(t)?!0:at(e,`Expected to be a valid base 64 string (got ${Mr(t)})`)}),Zde=(t=yU())=>Ct({test:(e,r)=>{let i;try{i=JSON.parse(e)}catch(n){return at(r,`Expected to be a valid JSON string (got ${Mr(e)})`)}return t(i,r)}}),$de=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?at(i,`Missing required ${GE(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},eCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?at(i,`Forbidden ${GE(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?at(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Bl||(Bl={}));rCe={[Bl.Forbids]:{expect:!1,message:"forbids using"},[Bl.Requires]:{expect:!0,message:"requires using"}},pv=(t,e,r,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(r),o=rCe[e];return Ct({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(t)||n.has(a[t]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?at(l,`Property "${t}" ${o.message} ${GE(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var Sh=E(($et,OU)=>{var mCe="2.0.0",ECe=256,ICe=Number.MAX_SAFE_INTEGER||9007199254740991,yCe=16;OU.exports={SEMVER_SPEC_VERSION:mCe,MAX_LENGTH:ECe,MAX_SAFE_INTEGER:ICe,MAX_SAFE_COMPONENT_LENGTH:yCe}});var xh=E((ett,KU)=>{var wCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};KU.exports=wCe});var Ql=E((iA,UU)=>{var{MAX_SAFE_COMPONENT_LENGTH:yv}=Sh(),BCe=xh();iA=UU.exports={};var QCe=iA.re=[],Je=iA.src=[],We=iA.t={},bCe=0,mt=(t,e,r)=>{let i=bCe++;BCe(i,e),We[t]=i,Je[i]=e,QCe[i]=new RegExp(e,r?"g":void 0)};mt("NUMERICIDENTIFIER","0|[1-9]\\d*");mt("NUMERICIDENTIFIERLOOSE","[0-9]+");mt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");mt("MAINVERSION",`(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})`);mt("MAINVERSIONLOOSE",`(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})`);mt("PRERELEASEIDENTIFIER",`(?:${Je[We.NUMERICIDENTIFIER]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASEIDENTIFIERLOOSE",`(?:${Je[We.NUMERICIDENTIFIERLOOSE]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASE",`(?:-(${Je[We.PRERELEASEIDENTIFIER]}(?:\\.${Je[We.PRERELEASEIDENTIFIER]})*))`);mt("PRERELEASELOOSE",`(?:-?(${Je[We.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${Je[We.PRERELEASEIDENTIFIERLOOSE]})*))`);mt("BUILDIDENTIFIER","[0-9A-Za-z-]+");mt("BUILD",`(?:\\+(${Je[We.BUILDIDENTIFIER]}(?:\\.${Je[We.BUILDIDENTIFIER]})*))`);mt("FULLPLAIN",`v?${Je[We.MAINVERSION]}${Je[We.PRERELEASE]}?${Je[We.BUILD]}?`);mt("FULL",`^${Je[We.FULLPLAIN]}$`);mt("LOOSEPLAIN",`[v=\\s]*${Je[We.MAINVERSIONLOOSE]}${Je[We.PRERELEASELOOSE]}?${Je[We.BUILD]}?`);mt("LOOSE",`^${Je[We.LOOSEPLAIN]}$`);mt("GTLT","((?:<|>)?=?)");mt("XRANGEIDENTIFIERLOOSE",`${Je[We.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);mt("XRANGEIDENTIFIER",`${Je[We.NUMERICIDENTIFIER]}|x|X|\\*`);mt("XRANGEPLAIN",`[v=\\s]*(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:${Je[We.PRERELEASE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGEPLAINLOOSE",`[v=\\s]*(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:${Je[We.PRERELEASELOOSE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAIN]}$`);mt("XRANGELOOSE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAINLOOSE]}$`);mt("COERCE",`(^|[^\\d])(\\d{1,${yv}})(?:\\.(\\d{1,${yv}}))?(?:\\.(\\d{1,${yv}}))?(?:$|[^\\d])`);mt("COERCERTL",Je[We.COERCE],!0);mt("LONETILDE","(?:~>?)");mt("TILDETRIM",`(\\s*)${Je[We.LONETILDE]}\\s+`,!0);iA.tildeTrimReplace="$1~";mt("TILDE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAIN]}$`);mt("TILDELOOSE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("LONECARET","(?:\\^)");mt("CARETTRIM",`(\\s*)${Je[We.LONECARET]}\\s+`,!0);iA.caretTrimReplace="$1^";mt("CARET",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAIN]}$`);mt("CARETLOOSE",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("COMPARATORLOOSE",`^${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]})$|^$`);mt("COMPARATOR",`^${Je[We.GTLT]}\\s*(${Je[We.FULLPLAIN]})$|^$`);mt("COMPARATORTRIM",`(\\s*)${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]}|${Je[We.XRANGEPLAIN]})`,!0);iA.comparatorTrimReplace="$1$2$3";mt("HYPHENRANGE",`^\\s*(${Je[We.XRANGEPLAIN]})\\s+-\\s+(${Je[We.XRANGEPLAIN]})\\s*$`);mt("HYPHENRANGELOOSE",`^\\s*(${Je[We.XRANGEPLAINLOOSE]})\\s+-\\s+(${Je[We.XRANGEPLAINLOOSE]})\\s*$`);mt("STAR","(<|>)?=?\\s*\\*");mt("GTE0","^\\s*>=\\s*0.0.0\\s*$");mt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var kh=E((ttt,HU)=>{var vCe=["includePrerelease","loose","rtl"],SCe=t=>t?typeof t!="object"?{loose:!0}:vCe.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};HU.exports=SCe});var zE=E((rtt,GU)=>{var jU=/^[0-9]+$/,YU=(t,e)=>{let r=jU.test(t),i=jU.test(e);return r&&i&&(t=+t,e=+e),t===e?0:r&&!i?-1:i&&!r?1:tYU(e,t);GU.exports={compareIdentifiers:YU,rcompareIdentifiers:xCe}});var bi=E((itt,qU)=>{var VE=xh(),{MAX_LENGTH:JU,MAX_SAFE_INTEGER:_E}=Sh(),{re:WU,t:zU}=Ql(),kCe=kh(),{compareIdentifiers:Ph}=zE(),_n=class{constructor(e,r){if(r=kCe(r),e instanceof _n){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>JU)throw new TypeError(`version is longer than ${JU} characters`);VE("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let i=e.trim().match(r.loose?WU[zU.LOOSE]:WU[zU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>_E||this.major<0)throw new TypeError("Invalid major version");if(this.minor>_E||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>_E||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<_E)return s}return n}):this.prerelease=[],this.build=i[5]?i[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(VE("SemVer.compare",this.version,this.options,e),!(e instanceof _n)){if(typeof e=="string"&&e===this.version)return 0;e=new _n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof _n||(e=new _n(e,this.options)),Ph(this.major,e.major)||Ph(this.minor,e.minor)||Ph(this.patch,e.patch)}comparePre(e){if(e instanceof _n||(e=new _n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let r=0;do{let i=this.prerelease[r],n=e.prerelease[r];if(VE("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}compareBuild(e){e instanceof _n||(e=new _n(e,this.options));let r=0;do{let i=this.build[r],n=e.build[r];if(VE("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}inc(e,r){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",r),this.inc("pre",r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",r),this.inc("pre",r);break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}r&&(this.prerelease[0]===r?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};qU.exports=_n});var bl=E((ntt,VU)=>{var{MAX_LENGTH:PCe}=Sh(),{re:_U,t:XU}=Ql(),ZU=bi(),DCe=kh(),RCe=(t,e)=>{if(e=DCe(e),t instanceof ZU)return t;if(typeof t!="string"||t.length>PCe||!(e.loose?_U[XU.LOOSE]:_U[XU.FULL]).test(t))return null;try{return new ZU(t,e)}catch(i){return null}};VU.exports=RCe});var e2=E((stt,$U)=>{var FCe=bl(),NCe=(t,e)=>{let r=FCe(t,e);return r?r.version:null};$U.exports=NCe});var r2=E((ott,t2)=>{var LCe=bl(),TCe=(t,e)=>{let r=LCe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};t2.exports=TCe});var n2=E((att,i2)=>{var MCe=bi(),OCe=(t,e,r,i)=>{typeof r=="string"&&(i=r,r=void 0);try{return new MCe(t,r).inc(e,i).version}catch(n){return null}};i2.exports=OCe});var Xn=E((Att,s2)=>{var o2=bi(),KCe=(t,e,r)=>new o2(t,r).compare(new o2(e,r));s2.exports=KCe});var XE=E((ltt,a2)=>{var UCe=Xn(),HCe=(t,e,r)=>UCe(t,e,r)===0;a2.exports=HCe});var c2=E((ctt,A2)=>{var l2=bl(),GCe=XE(),jCe=(t,e)=>{if(GCe(t,e))return null;{let r=l2(t),i=l2(e),n=r.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in r)if((a==="major"||a==="minor"||a==="patch")&&r[a]!==i[a])return s+a;return o}};A2.exports=jCe});var g2=E((utt,u2)=>{var YCe=bi(),qCe=(t,e)=>new YCe(t,e).major;u2.exports=qCe});var h2=E((gtt,f2)=>{var JCe=bi(),WCe=(t,e)=>new JCe(t,e).minor;f2.exports=WCe});var d2=E((ftt,p2)=>{var zCe=bi(),VCe=(t,e)=>new zCe(t,e).patch;p2.exports=VCe});var m2=E((htt,C2)=>{var _Ce=bl(),XCe=(t,e)=>{let r=_Ce(t,e);return r&&r.prerelease.length?r.prerelease:null};C2.exports=XCe});var I2=E((ptt,E2)=>{var ZCe=Xn(),$Ce=(t,e,r)=>ZCe(e,t,r);E2.exports=$Ce});var w2=E((dtt,y2)=>{var eme=Xn(),tme=(t,e)=>eme(t,e,!0);y2.exports=tme});var ZE=E((Ctt,B2)=>{var Q2=bi(),rme=(t,e,r)=>{let i=new Q2(t,r),n=new Q2(e,r);return i.compare(n)||i.compareBuild(n)};B2.exports=rme});var v2=E((mtt,b2)=>{var ime=ZE(),nme=(t,e)=>t.sort((r,i)=>ime(r,i,e));b2.exports=nme});var x2=E((Ett,S2)=>{var sme=ZE(),ome=(t,e)=>t.sort((r,i)=>sme(i,r,e));S2.exports=ome});var Dh=E((Itt,k2)=>{var ame=Xn(),Ame=(t,e,r)=>ame(t,e,r)>0;k2.exports=Ame});var $E=E((ytt,P2)=>{var lme=Xn(),cme=(t,e,r)=>lme(t,e,r)<0;P2.exports=cme});var wv=E((wtt,D2)=>{var ume=Xn(),gme=(t,e,r)=>ume(t,e,r)!==0;D2.exports=gme});var eI=E((Btt,R2)=>{var fme=Xn(),hme=(t,e,r)=>fme(t,e,r)>=0;R2.exports=hme});var tI=E((Qtt,F2)=>{var pme=Xn(),dme=(t,e,r)=>pme(t,e,r)<=0;F2.exports=dme});var Bv=E((btt,N2)=>{var Cme=XE(),mme=wv(),Eme=Dh(),Ime=eI(),yme=$E(),wme=tI(),Bme=(t,e,r,i)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return Cme(t,r,i);case"!=":return mme(t,r,i);case">":return Eme(t,r,i);case">=":return Ime(t,r,i);case"<":return yme(t,r,i);case"<=":return wme(t,r,i);default:throw new TypeError(`Invalid operator: ${e}`)}};N2.exports=Bme});var T2=E((vtt,L2)=>{var Qme=bi(),bme=bl(),{re:rI,t:iI}=Ql(),vme=(t,e)=>{if(t instanceof Qme)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(rI[iI.COERCE]);else{let i;for(;(i=rI[iI.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||i.index+i[0].length!==r.index+r[0].length)&&(r=i),rI[iI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;rI[iI.COERCERTL].lastIndex=-1}return r===null?null:bme(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};L2.exports=vme});var O2=E((Stt,M2)=>{"use strict";M2.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Rh=E((xtt,K2)=>{"use strict";K2.exports=Pt;Pt.Node=vl;Pt.create=Pt;function Pt(t){var e=this;if(e instanceof Pt||(e=new Pt),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=e;else if(this.head)i=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)r=t(r,i.value,n),i=i.next;return r};Pt.prototype.reduceReverse=function(t,e){var r,i=this.tail;if(arguments.length>1)r=e;else if(this.tail)i=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)r=t(r,i.value,n),i=i.prev;return r};Pt.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Pt.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Pt.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Pt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>t;i--,n=n.prev)r.push(n.value);return r};Pt.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var i=0,n=this.head;n!==null&&i{"use strict";var Pme=Rh(),Sl=Symbol("max"),ra=Symbol("length"),uu=Symbol("lengthCalculator"),Fh=Symbol("allowStale"),xl=Symbol("maxAge"),ia=Symbol("dispose"),H2=Symbol("noDisposeOnSet"),si=Symbol("lruList"),ks=Symbol("cache"),G2=Symbol("updateAgeOnGet"),Qv=()=>1,j2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[Sl]=e.max||Infinity,i=e.length||Qv;if(this[uu]=typeof i!="function"?Qv:i,this[Fh]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xl]=e.maxAge||0,this[ia]=e.dispose,this[H2]=e.noDisposeOnSet||!1,this[G2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Sl]=e||Infinity,Nh(this)}get max(){return this[Sl]}set allowStale(e){this[Fh]=!!e}get allowStale(){return this[Fh]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xl]=e,Nh(this)}get maxAge(){return this[xl]}set lengthCalculator(e){typeof e!="function"&&(e=Qv),e!==this[uu]&&(this[uu]=e,this[ra]=0,this[si].forEach(r=>{r.length=this[uu](r.value,r.key),this[ra]+=r.length})),Nh(this)}get lengthCalculator(){return this[uu]}get length(){return this[ra]}get itemCount(){return this[si].length}rforEach(e,r){r=r||this;for(let i=this[si].tail;i!==null;){let n=i.prev;q2(this,e,i,r),i=n}}forEach(e,r){r=r||this;for(let i=this[si].head;i!==null;){let n=i.next;q2(this,e,i,r),i=n}}keys(){return this[si].toArray().map(e=>e.key)}values(){return this[si].toArray().map(e=>e.value)}reset(){this[ia]&&this[si]&&this[si].length&&this[si].forEach(e=>this[ia](e.key,e.value)),this[ks]=new Map,this[si]=new Pme,this[ra]=0}dump(){return this[si].map(e=>nI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[si]}set(e,r,i){if(i=i||this[xl],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[uu](r,e);if(this[ks].has(e)){if(s>this[Sl])return gu(this,this[ks].get(e)),!1;let l=this[ks].get(e).value;return this[ia]&&(this[H2]||this[ia](e,l.value)),l.now=n,l.maxAge=i,l.value=r,this[ra]+=s-l.length,l.length=s,this.get(e),Nh(this),!0}let o=new Y2(e,r,s,n,i);return o.length>this[Sl]?(this[ia]&&this[ia](e,r),!1):(this[ra]+=o.length,this[si].unshift(o),this[ks].set(e,this[si].head),Nh(this),!0)}has(e){if(!this[ks].has(e))return!1;let r=this[ks].get(e).value;return!nI(this,r)}get(e){return bv(this,e,!0)}peek(e){return bv(this,e,!1)}pop(){let e=this[si].tail;return e?(gu(this,e),e.value):null}del(e){gu(this,this[ks].get(e))}load(e){this.reset();let r=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-r;o>0&&this.set(n.k,n.v,o)}}}prune(){this[ks].forEach((e,r)=>bv(this,r,!1))}},bv=(t,e,r)=>{let i=t[ks].get(e);if(i){let n=i.value;if(nI(t,n)){if(gu(t,i),!t[Fh])return}else r&&(t[G2]&&(i.value.now=Date.now()),t[si].unshiftNode(i));return n.value}},nI=(t,e)=>{if(!e||!e.maxAge&&!t[xl])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[xl]&&r>t[xl]},Nh=t=>{if(t[ra]>t[Sl])for(let e=t[si].tail;t[ra]>t[Sl]&&e!==null;){let r=e.prev;gu(t,e),e=r}},gu=(t,e)=>{if(e){let r=e.value;t[ia]&&t[ia](r.key,r.value),t[ra]-=r.length,t[ks].delete(r.key),t[si].removeNode(e)}},Y2=class{constructor(e,r,i,n,s){this.key=e,this.value=r,this.length=i,this.now=n,this.maxAge=s||0}},q2=(t,e,r,i)=>{let n=r.value;nI(t,n)&&(gu(t,r),t[Fh]||(n=void 0)),n&&e.call(i,n.value,n.key,t)};U2.exports=j2});var Zn=E((Ptt,W2)=>{var fu=class{constructor(e,r){if(r=Dme(r),e instanceof fu)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new fu(e.raw,r);if(e instanceof vv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!V2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Tme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=z2.get(i);if(n)return n;let s=this.options.loose,o=s?vi[di.HYPHENRANGELOOSE]:vi[di.HYPHENRANGE];e=e.replace(o,Kme(this.options.includePrerelease)),Rr("hyphen replace",e),e=e.replace(vi[di.COMPARATORTRIM],Fme),Rr("comparator trim",e,vi[di.COMPARATORTRIM]),e=e.replace(vi[di.TILDETRIM],Nme),e=e.replace(vi[di.CARETTRIM],Lme),e=e.split(/\s+/).join(" ");let a=s?vi[di.COMPARATORLOOSE]:vi[di.COMPARATOR],l=e.split(" ").map(f=>Mme(f,this.options)).join(" ").split(/\s+/).map(f=>Ome(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new vv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(V2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return z2.set(i,g),g}intersects(e,r){if(!(e instanceof fu))throw new TypeError("a Range is required");return this.set.some(i=>_2(i,r)&&e.set.some(n=>_2(n,r)&&i.every(s=>n.every(o=>s.intersects(o,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Rme(e,this.options)}catch(r){return!1}for(let r=0;rt.value==="<0.0.0-0",Tme=t=>t.value==="",_2=(t,e)=>{let r=!0,i=t.slice(),n=i.pop();for(;r&&i.length;)r=i.every(s=>n.intersects(s,e)),n=i.pop();return r},Mme=(t,e)=>(Rr("comp",t,e),t=jme(t,e),Rr("caret",t),t=Gme(t,e),Rr("tildes",t),t=Yme(t,e),Rr("xrange",t),t=qme(t,e),Rr("stars",t),t),Ji=t=>!t||t.toLowerCase()==="x"||t==="*",Gme=(t,e)=>t.trim().split(/\s+/).map(r=>Jme(r,e)).join(" "),Jme=(t,e)=>{let r=e.loose?vi[di.TILDELOOSE]:vi[di.TILDE];return t.replace(r,(i,n,s,o,a)=>{Rr("tilde",t,i,n,s,o,a);let l;return Ji(n)?l="":Ji(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Ji(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Rr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Rr("tilde return",l),l})},jme=(t,e)=>t.trim().split(/\s+/).map(r=>Wme(r,e)).join(" "),Wme=(t,e)=>{Rr("caret",t,e);let r=e.loose?vi[di.CARETLOOSE]:vi[di.CARET],i=e.includePrerelease?"-0":"";return t.replace(r,(n,s,o,a,l)=>{Rr("caret",t,n,s,o,a,l);let c;return Ji(s)?c="":Ji(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Ji(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Rr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Rr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Rr("caret return",c),c})},Yme=(t,e)=>(Rr("replaceXRanges",t,e),t.split(/\s+/).map(r=>zme(r,e)).join(" ")),zme=(t,e)=>{t=t.trim();let r=e.loose?vi[di.XRANGELOOSE]:vi[di.XRANGE];return t.replace(r,(i,n,s,o,a,l)=>{Rr("xRange",t,i,n,s,o,a,l);let c=Ji(s),u=c||Ji(o),g=u||Ji(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Rr("xRange return",i),i})},qme=(t,e)=>(Rr("replaceStars",t,e),t.trim().replace(vi[di.STAR],"")),Ome=(t,e)=>(Rr("replaceGTE0",t,e),t.trim().replace(vi[e.includePrerelease?di.GTE0PRE:di.GTE0],"")),Kme=t=>(e,r,i,n,s,o,a,l,c,u,g,f,h)=>(Ji(i)?r="":Ji(n)?r=`>=${i}.0.0${t?"-0":""}`:Ji(s)?r=`>=${i}.${n}.0${t?"-0":""}`:o?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Ji(c)?l="":Ji(u)?l=`<${+c+1}.0.0-0`:Ji(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:t?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${r} ${l}`.trim()),Ume=(t,e,r)=>{for(let i=0;i0){let n=t[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Lh=E((Dtt,X2)=>{var Th=Symbol("SemVer ANY"),Mh=class{static get ANY(){return Th}constructor(e,r){if(r=Vme(r),e instanceof Mh){if(e.loose===!!r.loose)return e;e=e.value}xv("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Th?this.value="":this.value=this.operator+this.semver.version,xv("comp",this)}parse(e){let r=this.options.loose?Z2[$2.COMPARATORLOOSE]:Z2[$2.COMPARATOR],i=e.match(r);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new eH(i[2],this.options.loose):this.semver=Th}toString(){return this.value}test(e){if(xv("Comparator.test",e,this.options.loose),this.semver===Th||e===Th)return!0;if(typeof e=="string")try{e=new eH(e,this.options)}catch(r){return!1}return Sv(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof Mh))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new tH(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new tH(this.value,r).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=Sv(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=Sv(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};X2.exports=Mh;var Vme=kh(),{re:Z2,t:$2}=Ql(),Sv=Bv(),xv=xh(),eH=bi(),tH=Zn()});var Oh=E((Rtt,rH)=>{var _me=Zn(),Xme=(t,e,r)=>{try{e=new _me(e,r)}catch(i){return!1}return e.test(t)};rH.exports=Xme});var nH=E((Ftt,iH)=>{var Zme=Zn(),$me=(t,e)=>new Zme(t,e).set.map(r=>r.map(i=>i.value).join(" ").trim().split(" "));iH.exports=$me});var oH=E((Ntt,sH)=>{var eEe=bi(),tEe=Zn(),rEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new tEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new eEe(i,r))}),i};sH.exports=rEe});var AH=E((Ltt,aH)=>{var iEe=bi(),nEe=Zn(),sEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new nEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new iEe(i,r))}),i};aH.exports=sEe});var uH=E((Ttt,lH)=>{var kv=bi(),oEe=Zn(),cH=Dh(),aEe=(t,e)=>{t=new oEe(t,e);let r=new kv("0.0.0");if(t.test(r)||(r=new kv("0.0.0-0"),t.test(r)))return r;r=null;for(let i=0;i{let a=new kv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||cH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!r||cH(r,s))&&(r=s)}return r&&t.test(r)?r:null};lH.exports=aEe});var fH=E((Mtt,gH)=>{var AEe=Zn(),lEe=(t,e)=>{try{return new AEe(t,e).range||"*"}catch(r){return null}};gH.exports=lEe});var sI=E((Ott,hH)=>{var cEe=bi(),pH=Lh(),{ANY:uEe}=pH,gEe=Zn(),fEe=Oh(),dH=Dh(),CH=$E(),hEe=tI(),pEe=eI(),dEe=(t,e,r,i)=>{t=new cEe(t,i),e=new gEe(e,i);let n,s,o,a,l;switch(r){case">":n=dH,s=hEe,o=CH,a=">",l=">=";break;case"<":n=CH,s=pEe,o=dH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(fEe(t,e,i))return!1;for(let c=0;c{h.semver===uEe&&(h=new pH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(t,f.semver))return!1;if(f.operator===l&&o(t,f.semver))return!1}return!0};hH.exports=dEe});var EH=E((Ktt,mH)=>{var CEe=sI(),mEe=(t,e,r)=>CEe(t,e,">",r);mH.exports=mEe});var yH=E((Utt,IH)=>{var EEe=sI(),IEe=(t,e,r)=>EEe(t,e,"<",r);IH.exports=IEe});var QH=E((Htt,wH)=>{var BH=Zn(),yEe=(t,e,r)=>(t=new BH(t,r),e=new BH(e,r),t.intersects(e));wH.exports=yEe});var vH=E((Gtt,bH)=>{var wEe=Oh(),BEe=Xn();bH.exports=(t,e,r)=>{let i=[],n=null,s=null,o=t.sort((u,g)=>BEe(u,g,r));for(let u of o)wEe(u,e,r)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var xH=Zn(),oI=Lh(),{ANY:Pv}=oI,Kh=Oh(),Dv=Xn(),bEe=(t,e,r={})=>{if(t===e)return!0;t=new xH(t,r),e=new xH(e,r);let i=!1;e:for(let n of t.set){for(let s of e.set){let o=QEe(n,s,r);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},QEe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===Pv){if(e.length===1&&e[0].semver===Pv)return!0;r.includePrerelease?t=[new oI(">=0.0.0-0")]:t=[new oI(">=0.0.0")]}if(e.length===1&&e[0].semver===Pv){if(r.includePrerelease)return!0;e=[new oI(">=0.0.0")]}let i=new Set,n,s;for(let h of t)h.operator===">"||h.operator===">="?n=kH(n,h,r):h.operator==="<"||h.operator==="<="?s=PH(s,h,r):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=Dv(n.semver,s.semver,r),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Kh(h,String(n),r)||s&&!Kh(h,String(s),r))return null;for(let p of e)if(!Kh(h,String(p),r))return!1;return!0}let a,l,c,u,g=s&&!r.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=kH(n,h,r),a===h&&a!==n)return!1}else if(n.operator===">="&&!Kh(n.semver,String(h),r))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=PH(s,h,r),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Kh(s.semver,String(h),r))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},kH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i>0?t:i<0||e.operator===">"&&t.operator===">="?e:t},PH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i<0?t:i>0||e.operator==="<"&&t.operator==="<="?e:t};SH.exports=bEe});var Or=E((Ytt,RH)=>{var Rv=Ql();RH.exports={re:Rv.re,src:Rv.src,tokens:Rv.t,SEMVER_SPEC_VERSION:Sh().SEMVER_SPEC_VERSION,SemVer:bi(),compareIdentifiers:zE().compareIdentifiers,rcompareIdentifiers:zE().rcompareIdentifiers,parse:bl(),valid:e2(),clean:r2(),inc:n2(),diff:c2(),major:g2(),minor:h2(),patch:d2(),prerelease:m2(),compare:Xn(),rcompare:I2(),compareLoose:w2(),compareBuild:ZE(),sort:v2(),rsort:x2(),gt:Dh(),lt:$E(),eq:XE(),neq:wv(),gte:eI(),lte:tI(),cmp:Bv(),coerce:T2(),Comparator:Lh(),Range:Zn(),satisfies:Oh(),toComparators:nH(),maxSatisfying:oH(),minSatisfying:AH(),minVersion:uH(),validRange:fH(),outside:sI(),gtr:EH(),ltr:yH(),intersects:QH(),simplifyRange:vH(),subset:DH()}});var Uv=E(AI=>{"use strict";Object.defineProperty(AI,"__esModule",{value:!0});AI.VERSION=void 0;AI.VERSION="9.1.0"});var Dt=E((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(t,e,r){if(r||arguments.length===2)for(var i=0,n=e.length,s;i{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof lI=="object"&&lI.exports?lI.exports=e():t.regexpToAst=e()})(typeof self!="undefined"?self:YH,function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},t.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var d=this.disjunction();this.consumeChar("/");for(var m={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(m,"global");break;case"i":o(m,"ignoreCase");break;case"m":o(m,"multiLine");break;case"u":o(m,"unicode");break;case"y":o(m,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:m,value:d,loc:this.loc(0)}},t.prototype.disjunction=function(){var p=[],d=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(d)}},t.prototype.alternative=function(){for(var p=[],d=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(d)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var d;switch(this.popChar()){case"=":d="Lookahead";break;case"!":d="NegativeLookahead";break}a(d);var m=this.disjunction();return this.consumeChar(")"),{type:d,value:m,loc:this.loc(p)}}l()},t.prototype.quantifier=function(p){var d,m=this.idx;switch(this.popChar()){case"*":d={atLeast:0,atMost:Infinity};break;case"+":d={atLeast:1,atMost:Infinity};break;case"?":d={atLeast:0,atMost:1};break;case"{":var I=this.integerIncludingZero();switch(this.popChar()){case"}":d={atLeast:I,atMost:I};break;case",":var B;this.isDigit()?(B=this.integerIncludingZero(),d={atLeast:I,atMost:B}):d={atLeast:I,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&d===void 0)return;a(d);break}if(!(p===!0&&d===void 0))return a(d),this.peekChar(0)==="?"?(this.consumeChar("?"),d.greedy=!1):d.greedy=!0,d.type="Quantifier",d.loc=this.loc(m),d},t.prototype.atom=function(){var p,d=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(d),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` -`),n("\r"),n("\u2028"),n("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},t.prototype.characterClassEscape=function(){var p,d=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,d=!0;break;case"s":p=f;break;case"S":p=f,d=!0;break;case"w":p=g;break;case"W":p=g,d=!0;break}return a(p),{type:"Set",value:p,complement:d}},t.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` -`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var d=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:d}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},t.prototype.characterClass=function(){var p=[],d=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),d=!0);this.isClassAtom();){var m=this.classAtom(),I=m.type==="Character";if(I&&this.isRangeDash()){this.consumeChar("-");var B=this.classAtom(),b=B.type==="Character";if(b){if(B.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,r=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,d){p.length!==void 0?p.forEach(function(m){d.push(m)}):d.push(p)}function o(p,d){if(p[d]===!0)throw"duplicate flag "+d;p[d]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` -`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var d in p){var m=p[d];p.hasOwnProperty(d)&&(m.type!==void 0?this.visit(m):Array.isArray(m)&&m.forEach(function(I){this.visit(I)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var gI=E(Eu=>{"use strict";Object.defineProperty(Eu,"__esModule",{value:!0});Eu.clearRegExpParserCache=Eu.getRegExpAst=void 0;var FEe=cI(),uI={},NEe=new FEe.RegExpParser;function LEe(t){var e=t.toString();if(uI.hasOwnProperty(e))return uI[e];var r=NEe.pattern(e);return uI[e]=r,r}Eu.getRegExpAst=LEe;function TEe(){uI={}}Eu.clearRegExpParserCache=TEe});var VH=E(fn=>{"use strict";var MEe=fn&&fn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(fn,"__esModule",{value:!0});fn.canMatchCharCode=fn.firstCharOptimizedIndices=fn.getOptimizedStartCodesIndices=fn.failedOptimizationPrefixMsg=void 0;var qH=cI(),$n=Dt(),JH=gI(),sa=Hv(),WH="Complement Sets are not supported for first char optimization";fn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: -`;function OEe(t,e){e===void 0&&(e=!1);try{var r=(0,JH.getRegExpAst)(t),i=fI(r.value,{},r.flags.ignoreCase);return i}catch(s){if(s.message===WH)e&&(0,$n.PRINT_WARNING)(""+fn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+t.toString()+` > -`)+` Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,$n.PRINT_ERROR)(fn.failedOptimizationPrefixMsg+` -`+(" Failed parsing: < "+t.toString()+` > -`)+(" Using the regexp-to-ast library version: "+qH.VERSION+` -`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}fn.getOptimizedStartCodesIndices=OEe;function fI(t,e,r){switch(t.type){case"Disjunction":for(var i=0;i=sa.minOptimizationVal)for(var f=u.from>=sa.minOptimizationVal?u.from:sa.minOptimizationVal,h=u.to,p=(0,sa.charCodeToOptimizedIndex)(f),d=(0,sa.charCodeToOptimizedIndex)(h),m=p;m<=d;m++)e[m]=m}}});break;case"Group":fI(o.value,e,r);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&Gv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,$n.values)(e)}fn.firstCharOptimizedIndices=fI;function hI(t,e,r){var i=(0,sa.charCodeToOptimizedIndex)(t);e[i]=i,r===!0&&KEe(t,e)}function KEe(t,e){var r=String.fromCharCode(t),i=r.toUpperCase();if(i!==r){var n=(0,sa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=r.toLowerCase();if(s!==r){var n=(0,sa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function zH(t,e){return(0,$n.find)(t.value,function(r){if(typeof r=="number")return(0,$n.contains)(e,r);var i=r;return(0,$n.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function Gv(t){return t.quantifier&&t.quantifier.atLeast===0?!0:t.value?(0,$n.isArray)(t.value)?(0,$n.every)(t.value,Gv):Gv(t.value):!1}var UEe=function(t){MEe(e,t);function e(r){var i=t.call(this)||this;return i.targetCharCodes=r,i.found=!1,i}return e.prototype.visitChildren=function(r){if(this.found!==!0){switch(r.type){case"Lookahead":this.visitLookahead(r);return;case"NegativeLookahead":this.visitNegativeLookahead(r);return}t.prototype.visitChildren.call(this,r)}},e.prototype.visitCharacter=function(r){(0,$n.contains)(this.targetCharCodes,r.value)&&(this.found=!0)},e.prototype.visitSet=function(r){r.complement?zH(r,this.targetCharCodes)===void 0&&(this.found=!0):zH(r,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(qH.BaseRegExpVisitor);function HEe(t,e){if(e instanceof RegExp){var r=(0,JH.getRegExpAst)(e),i=new UEe(t);return i.visit(r),i.found}else return(0,$n.find)(e,function(n){return(0,$n.contains)(t,n.charCodeAt(0))})!==void 0}fn.canMatchCharCode=HEe});var Hv=E(je=>{"use strict";var _H=je&&je.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(je,"__esModule",{value:!0});je.charCodeToOptimizedIndex=je.minOptimizationVal=je.buildLineBreakIssueMessage=je.LineTerminatorOptimizedTester=je.isShortPattern=je.isCustomPattern=je.cloneEmptyGroups=je.performWarningRuntimeChecks=je.performRuntimeChecks=je.addStickyFlag=je.addStartOfInput=je.findUnreachablePatterns=je.findModesThatDoNotExist=je.findInvalidGroupType=je.findDuplicatePatterns=je.findUnsupportedFlags=je.findStartOfInputAnchor=je.findEmptyMatchRegExps=je.findEndOfInputAnchor=je.findInvalidPatterns=je.findMissingPatterns=je.validatePatterns=je.analyzeTokenTypes=je.enableSticky=je.disableSticky=je.SUPPORT_STICKY=je.MODES=je.DEFAULT_MODE=void 0;var XH=cI(),zt=Gh(),Ie=Dt(),Iu=VH(),ZH=gI(),ao="PATTERN";je.DEFAULT_MODE="defaultMode";je.MODES="modes";je.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function GEe(){je.SUPPORT_STICKY=!1}je.disableSticky=GEe;function jEe(){je.SUPPORT_STICKY=!0}je.enableSticky=jEe;function qEe(t,e){e=(0,Ie.defaults)(e,{useSticky:je.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:function(B,b){return b()}});var r=e.tracer;r("initCharCodeToOptimizedIndexMap",function(){YEe()});var i;r("Reject Lexer.NA",function(){i=(0,Ie.reject)(t,function(B){return B[ao]===zt.Lexer.NA})});var n=!1,s;r("Transform Patterns",function(){n=!1,s=(0,Ie.map)(i,function(B){var b=B[ao];if((0,Ie.isRegExp)(b)){var R=b.source;return R.length===1&&R!=="^"&&R!=="$"&&R!=="."&&!b.ignoreCase?R:R.length===2&&R[0]==="\\"&&!(0,Ie.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],R[1])?R[1]:e.useSticky?Yv(b):jv(b)}else{if((0,Ie.isFunction)(b))return n=!0,{exec:b};if((0,Ie.has)(b,"exec"))return n=!0,b;if(typeof b=="string"){if(b.length===1)return b;var H=b.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),L=new RegExp(H);return e.useSticky?Yv(L):jv(L)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;r("misc mapping",function(){o=(0,Ie.map)(i,function(B){return B.tokenTypeIdx}),a=(0,Ie.map)(i,function(B){var b=B.GROUP;if(b!==zt.Lexer.SKIPPED){if((0,Ie.isString)(b))return b;if((0,Ie.isUndefined)(b))return!1;throw Error("non exhaustive match")}}),l=(0,Ie.map)(i,function(B){var b=B.LONGER_ALT;if(b){var R=(0,Ie.isArray)(b)?(0,Ie.map)(b,function(H){return(0,Ie.indexOf)(i,H)}):[(0,Ie.indexOf)(i,b)];return R}}),c=(0,Ie.map)(i,function(B){return B.PUSH_MODE}),u=(0,Ie.map)(i,function(B){return(0,Ie.has)(B,"POP_MODE")})});var g;r("Line Terminator Handling",function(){var B=tG(e.lineTerminatorCharacters);g=(0,Ie.map)(i,function(b){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ie.map)(i,function(b){if((0,Ie.has)(b,"LINE_BREAKS"))return b.LINE_BREAKS;if(eG(b,B)===!1)return(0,Iu.canMatchCharCode)(B,b.PATTERN)}))});var f,h,p,d;r("Misc Mapping #2",function(){f=(0,Ie.map)(i,qv),h=(0,Ie.map)(s,$H),p=(0,Ie.reduce)(i,function(B,b){var R=b.GROUP;return(0,Ie.isString)(R)&&R!==zt.Lexer.SKIPPED&&(B[R]=[]),B},{}),d=(0,Ie.map)(s,function(B,b){return{pattern:s[b],longerAlt:l[b],canLineTerminator:g[b],isCustom:f[b],short:h[b],group:a[b],push:c[b],pop:u[b],tokenTypeIdx:o[b],tokenType:i[b]}})});var m=!0,I=[];return e.safeMode||r("First Char Optimization",function(){I=(0,Ie.reduce)(i,function(B,b,R){if(typeof b.PATTERN=="string"){var H=b.PATTERN.charCodeAt(0),L=Wv(H);Jv(B,L,d[R])}else if((0,Ie.isArray)(b.START_CHARS_HINT)){var K;(0,Ie.forEach)(b.START_CHARS_HINT,function(ne){var q=typeof ne=="string"?ne.charCodeAt(0):ne,A=Wv(q);K!==A&&(K=A,Jv(B,A,d[R]))})}else if((0,Ie.isRegExp)(b.PATTERN))if(b.PATTERN.unicode)m=!1,e.ensureOptimizations&&(0,Ie.PRINT_ERROR)(""+Iu.failedOptimizationPrefixMsg+(" Unable to analyze < "+b.PATTERN.toString()+` > pattern. -`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var J=(0,Iu.getOptimizedStartCodesIndices)(b.PATTERN,e.ensureOptimizations);(0,Ie.isEmpty)(J)&&(m=!1),(0,Ie.forEach)(J,function(ne){Jv(B,ne,d[R])})}else e.ensureOptimizations&&(0,Ie.PRINT_ERROR)(""+Iu.failedOptimizationPrefixMsg+(" TokenType: <"+b.name+`> is using a custom token pattern without providing parameter. -`)+` This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),m=!1;return B},[])}),r("ArrayPacking",function(){I=(0,Ie.packArray)(I)}),{emptyGroups:p,patternIdxToConfig:d,charCodeToPatternIdxToConfig:I,hasCustom:n,canBeOptimized:m}}je.analyzeTokenTypes=qEe;function WEe(t,e){var r=[],i=rG(t);r=r.concat(i.errors);var n=iG(i.valid),s=n.valid;return r=r.concat(n.errors),r=r.concat(JEe(s)),r=r.concat(nG(s)),r=r.concat(sG(s,e)),r=r.concat(oG(s)),r}je.validatePatterns=WEe;function JEe(t){var e=[],r=(0,Ie.filter)(t,function(i){return(0,Ie.isRegExp)(i[ao])});return e=e.concat(aG(r)),e=e.concat(lG(r)),e=e.concat(cG(r)),e=e.concat(uG(r)),e=e.concat(AG(r)),e}function rG(t){var e=(0,Ie.filter)(t,function(n){return!(0,Ie.has)(n,ao)}),r=(0,Ie.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:zt.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ie.difference)(t,e);return{errors:r,valid:i}}je.findMissingPatterns=rG;function iG(t){var e=(0,Ie.filter)(t,function(n){var s=n[ao];return!(0,Ie.isRegExp)(s)&&!(0,Ie.isFunction)(s)&&!(0,Ie.has)(s,"exec")&&!(0,Ie.isString)(s)}),r=(0,Ie.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:zt.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ie.difference)(t,e);return{errors:r,valid:i}}je.findInvalidPatterns=iG;var zEe=/[^\\][\$]/;function aG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ie.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return zEe.test(s.source)}}),i=(0,Ie.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findEndOfInputAnchor=aG;function AG(t){var e=(0,Ie.filter)(t,function(i){var n=i[ao];return n.test("")}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:zt.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return r}je.findEmptyMatchRegExps=AG;var VEe=/[^\\[][\^]|^\^/;function lG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ie.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return VEe.test(s.source)}}),i=(0,Ie.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: - Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findStartOfInputAnchor=lG;function cG(t){var e=(0,Ie.filter)(t,function(i){var n=i[ao];return n instanceof RegExp&&(n.multiline||n.global)}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:zt.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return r}je.findUnsupportedFlags=cG;function uG(t){var e=[],r=(0,Ie.map)(t,function(s){return(0,Ie.reduce)(t,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ie.contains)(e,a)&&a.PATTERN!==zt.Lexer.NA&&(e.push(a),o.push(a)),o},[])});r=(0,Ie.compact)(r);var i=(0,Ie.filter)(r,function(s){return s.length>1}),n=(0,Ie.map)(i,function(s){var o=(0,Ie.map)(s,function(l){return l.name}),a=(0,Ie.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:zt.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}je.findDuplicatePatterns=uG;function nG(t){var e=(0,Ie.filter)(t,function(i){if(!(0,Ie.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==zt.Lexer.SKIPPED&&n!==zt.Lexer.NA&&!(0,Ie.isString)(n)}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:zt.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return r}je.findInvalidGroupType=nG;function sG(t,e){var r=(0,Ie.filter)(t,function(n){return n.PUSH_MODE!==void 0&&!(0,Ie.contains)(e,n.PUSH_MODE)}),i=(0,Ie.map)(r,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:zt.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}je.findModesThatDoNotExist=sG;function oG(t){var e=[],r=(0,Ie.reduce)(t,function(i,n,s){var o=n.PATTERN;return o===zt.Lexer.NA||((0,Ie.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ie.isRegExp)(o)&&XEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ie.forEach)(t,function(i,n){(0,Ie.forEach)(r,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:zt.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}je.findUnreachablePatterns=oG;function _Ee(t,e){if((0,Ie.isRegExp)(e)){var r=e.exec(t);return r!==null&&r.index===0}else{if((0,Ie.isFunction)(e))return e(t,0,[],{});if((0,Ie.has)(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function XEe(t){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ie.find)(e,function(r){return t.source.indexOf(r)!==-1})===void 0}function jv(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:"+t.source+")",e)}je.addStartOfInput=jv;function Yv(t){var e=t.ignoreCase?"iy":"y";return new RegExp(""+t.source,e)}je.addStickyFlag=Yv;function ZEe(t,e,r){var i=[];return(0,Ie.has)(t,je.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.DEFAULT_MODE+`> property in its definition -`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ie.has)(t,je.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.MODES+`> property in its definition -`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ie.has)(t,je.MODES)&&(0,Ie.has)(t,je.DEFAULT_MODE)&&!(0,Ie.has)(t.modes,t.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+je.DEFAULT_MODE+": <"+t.defaultMode+`>which does not exist -`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ie.has)(t,je.MODES)&&(0,Ie.forEach)(t.modes,function(n,s){(0,Ie.forEach)(n,function(o,a){(0,Ie.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> -`),type:zt.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}je.performRuntimeChecks=ZEe;function $Ee(t,e,r){var i=[],n=!1,s=(0,Ie.compact)((0,Ie.flatten)((0,Ie.mapValues)(t.modes,function(l){return l}))),o=(0,Ie.reject)(s,function(l){return l[ao]===zt.Lexer.NA}),a=tG(r);return e&&(0,Ie.forEach)(o,function(l){var c=eG(l,a);if(c!==!1){var u=gG(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ie.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Iu.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:zt.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}je.performWarningRuntimeChecks=$Ee;function eIe(t){var e={},r=(0,Ie.keys)(t);return(0,Ie.forEach)(r,function(i){var n=t[i];if((0,Ie.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}je.cloneEmptyGroups=eIe;function qv(t){var e=t.PATTERN;if((0,Ie.isRegExp)(e))return!1;if((0,Ie.isFunction)(e))return!0;if((0,Ie.has)(e,"exec"))return!0;if((0,Ie.isString)(e))return!1;throw Error("non exhaustive match")}je.isCustomPattern=qv;function $H(t){return(0,Ie.isString)(t)&&t.length===1?t.charCodeAt(0):!1}je.isShortPattern=$H;je.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,r=this.lastIndex;r Token Type -`)+(" Root cause: "+e.errMsg+`. -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===zt.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. -`+(" The problem is in the <"+t.name+`> Token Type -`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}je.buildLineBreakIssueMessage=gG;function tG(t){var e=(0,Ie.map)(t,function(r){return(0,Ie.isString)(r)&&r.length>0?r.charCodeAt(0):r});return e}function Jv(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}je.minOptimizationVal=256;var pI=[];function Wv(t){return t255?255+~~(t/255):t}}});var yu=E(Bt=>{"use strict";Object.defineProperty(Bt,"__esModule",{value:!0});Bt.isTokenType=Bt.hasExtendingTokensTypesMapProperty=Bt.hasExtendingTokensTypesProperty=Bt.hasCategoriesProperty=Bt.hasShortKeyProperty=Bt.singleAssignCategoriesToksMap=Bt.assignCategoriesMapProp=Bt.assignCategoriesTokensProp=Bt.assignTokenDefaultProps=Bt.expandCategories=Bt.augmentTokenTypes=Bt.tokenIdxToClass=Bt.tokenShortNameIdx=Bt.tokenStructuredMatcherNoCategories=Bt.tokenStructuredMatcher=void 0;var Kr=Dt();function tIe(t,e){var r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}Bt.tokenStructuredMatcher=tIe;function rIe(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}Bt.tokenStructuredMatcherNoCategories=rIe;Bt.tokenShortNameIdx=1;Bt.tokenIdxToClass={};function iIe(t){var e=fG(t);hG(e),dG(e),pG(e),(0,Kr.forEach)(e,function(r){r.isParent=r.categoryMatches.length>0})}Bt.augmentTokenTypes=iIe;function fG(t){for(var e=(0,Kr.cloneArr)(t),r=t,i=!0;i;){r=(0,Kr.compact)((0,Kr.flatten)((0,Kr.map)(r,function(s){return s.CATEGORIES})));var n=(0,Kr.difference)(r,e);e=e.concat(n),(0,Kr.isEmpty)(n)?i=!1:r=n}return e}Bt.expandCategories=fG;function hG(t){(0,Kr.forEach)(t,function(e){CG(e)||(Bt.tokenIdxToClass[Bt.tokenShortNameIdx]=e,e.tokenTypeIdx=Bt.tokenShortNameIdx++),zv(e)&&!(0,Kr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),zv(e)||(e.CATEGORIES=[]),mG(e)||(e.categoryMatches=[]),EG(e)||(e.categoryMatchesMap={})})}Bt.assignTokenDefaultProps=hG;function pG(t){(0,Kr.forEach)(t,function(e){e.categoryMatches=[],(0,Kr.forEach)(e.categoryMatchesMap,function(r,i){e.categoryMatches.push(Bt.tokenIdxToClass[i].tokenTypeIdx)})})}Bt.assignCategoriesTokensProp=pG;function dG(t){(0,Kr.forEach)(t,function(e){Vv([],e)})}Bt.assignCategoriesMapProp=dG;function Vv(t,e){(0,Kr.forEach)(t,function(r){e.categoryMatchesMap[r.tokenTypeIdx]=!0}),(0,Kr.forEach)(e.CATEGORIES,function(r){var i=t.concat(e);(0,Kr.contains)(i,r)||Vv(i,r)})}Bt.singleAssignCategoriesToksMap=Vv;function CG(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.hasShortKeyProperty=CG;function zv(t){return(0,Kr.has)(t,"CATEGORIES")}Bt.hasCategoriesProperty=zv;function mG(t){return(0,Kr.has)(t,"categoryMatches")}Bt.hasExtendingTokensTypesProperty=mG;function EG(t){return(0,Kr.has)(t,"categoryMatchesMap")}Bt.hasExtendingTokensTypesMapProperty=EG;function nIe(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.isTokenType=nIe});var _v=E(dI=>{"use strict";Object.defineProperty(dI,"__esModule",{value:!0});dI.defaultLexerErrorProvider=void 0;dI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->"+t.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(t,e,r,i,n){return"unexpected character: ->"+t.charAt(e)+"<- at offset: "+e+","+(" skipped "+r+" characters.")}}});var Gh=E(Rl=>{"use strict";Object.defineProperty(Rl,"__esModule",{value:!0});Rl.Lexer=Rl.LexerDefinitionErrorType=void 0;var Ps=Hv(),Vt=Dt(),sIe=yu(),oIe=_v(),aIe=gI(),AIe;(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(AIe=Rl.LexerDefinitionErrorType||(Rl.LexerDefinitionErrorType={}));var jh={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:oIe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(jh);var lIe=function(){function t(e,r){var i=this;if(r===void 0&&(r=jh),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=(0,Vt.merge)(jh,r);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===jh.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Ps.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===jh.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,Vt.isArray)(e)?(s={modes:{}},s.modes[Ps.DEFAULT_MODE]=(0,Vt.cloneArr)(e),s[Ps.DEFAULT_MODE]=Ps.DEFAULT_MODE):(o=!1,s=(0,Vt.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Ps.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,Vt.forEach)(s.modes,function(u,g){s.modes[g]=(0,Vt.reject)(u,function(f){return(0,Vt.isUndefined)(f)})});var a=(0,Vt.keys)(s.modes);if((0,Vt.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.validatePatterns)(u,a))}),(0,Vt.isEmpty)(i.lexerDefinitionErrors)){(0,sIe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Ps.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,Vt.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,Vt.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,Vt.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+c)}(0,Vt.forEach)(i.lexerDefinitionWarning,function(u){(0,Vt.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Ps.SUPPORT_STICKY?(i.chopInput=Vt.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=Vt.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=Vt.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=Vt.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=Vt.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,Vt.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(r.ensureOptimizations&&!(0,Vt.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,aIe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,Vt.toFastProperties)(i)})})}return t.prototype.tokenize=function(e,r){if(r===void 0&&(r=this.defaultMode),!(0,Vt.isEmpty)(this.lexerDefinitionErrors)){var i=(0,Vt.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+n)}var s=this.tokenizeInternal(e,r);return s},t.prototype.tokenizeInternal=function(e,r){var i=this,n,s,o,a,l,c,u,g,f,h,p,d,m,I,B,b,R=e,H=R.length,L=0,K=0,J=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(J),q=[],A=this.trackStartLines?1:void 0,V=this.trackStartLines?1:void 0,W=(0,Ps.cloneEmptyGroups)(this.emptyGroups),X=this.trackStartLines,F=this.config.lineTerminatorsPattern,D=0,he=[],pe=[],Ne=[],Pe=[];Object.freeze(Pe);var qe=void 0;function re(){return he}function se(wr){var Ui=(0,Ps.charCodeToOptimizedIndex)(wr),ws=pe[Ui];return ws===void 0?Pe:ws}var be=function(wr){if(Ne.length===1&&wr.tokenType.PUSH_MODE===void 0){var Ui=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(wr);q.push({offset:wr.startOffset,line:wr.startLine!==void 0?wr.startLine:void 0,column:wr.startColumn!==void 0?wr.startColumn:void 0,length:wr.image.length,message:Ui})}else{Ne.pop();var ws=(0,Vt.last)(Ne);he=i.patternIdxToConfig[ws],pe=i.charCodeToPatternIdxToConfig[ws],D=he.length;var Tf=i.canModeBeOptimized[ws]&&i.config.safeMode===!1;pe&&Tf?qe=se:qe=re}};function ae(wr){Ne.push(wr),pe=this.charCodeToPatternIdxToConfig[wr],he=this.patternIdxToConfig[wr],D=he.length,D=he.length;var Ui=this.canModeBeOptimized[wr]&&this.config.safeMode===!1;pe&&Ui?qe=se:qe=re}ae.call(this,r);for(var Ae;Lc.length){c=a,u=g,Ae=Oe;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,d=this.createTokenInstance(c,L,p,Ae.tokenType,A,V,f),this.handlePayload(d,u),h===!1?K=this.addToken(ne,K,d):W[h].push(d)),e=this.chopInput(e,f),L=L+f,V=this.computeNewColumn(V,f),X===!0&&Ae.canLineTerminator===!0){var dt=0,ri=void 0,ii=void 0;F.lastIndex=0;do ri=F.test(c),ri===!0&&(ii=F.lastIndex-1,dt++);while(ri===!0);dt!==0&&(A=A+dt,V=f-ii,this.updateTokenEndLineColumnLocation(d,h,ii,dt,A,V,f))}this.handleModes(Ae,be,ae,d)}else{for(var an=L,yr=A,Ki=V,Qi=!1;!Qi&&L <"+e+">");var n=(0,Vt.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",t.NA=/NOT_APPLICABLE/,t}();Rl.Lexer=lIe});var nA=E(Ci=>{"use strict";Object.defineProperty(Ci,"__esModule",{value:!0});Ci.tokenMatcher=Ci.createTokenInstance=Ci.EOF=Ci.createToken=Ci.hasTokenLabel=Ci.tokenName=Ci.tokenLabel=void 0;var Ds=Dt(),cIe=Gh(),Xv=yu();function uIe(t){return IG(t)?t.LABEL:t.name}Ci.tokenLabel=uIe;function gIe(t){return t.name}Ci.tokenName=gIe;function IG(t){return(0,Ds.isString)(t.LABEL)&&t.LABEL!==""}Ci.hasTokenLabel=IG;var fIe="parent",yG="categories",wG="label",BG="group",QG="push_mode",bG="pop_mode",vG="longer_alt",SG="line_breaks",xG="start_chars_hint";function kG(t){return hIe(t)}Ci.createToken=kG;function hIe(t){var e=t.pattern,r={};if(r.name=t.name,(0,Ds.isUndefined)(e)||(r.PATTERN=e),(0,Ds.has)(t,fIe))throw`The parent property is no longer supported. -See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ds.has)(t,yG)&&(r.CATEGORIES=t[yG]),(0,Xv.augmentTokenTypes)([r]),(0,Ds.has)(t,wG)&&(r.LABEL=t[wG]),(0,Ds.has)(t,BG)&&(r.GROUP=t[BG]),(0,Ds.has)(t,bG)&&(r.POP_MODE=t[bG]),(0,Ds.has)(t,QG)&&(r.PUSH_MODE=t[QG]),(0,Ds.has)(t,vG)&&(r.LONGER_ALT=t[vG]),(0,Ds.has)(t,SG)&&(r.LINE_BREAKS=t[SG]),(0,Ds.has)(t,xG)&&(r.START_CHARS_HINT=t[xG]),r}Ci.EOF=kG({name:"EOF",pattern:cIe.Lexer.NA});(0,Xv.augmentTokenTypes)([Ci.EOF]);function pIe(t,e,r,i,n,s,o,a){return{image:e,startOffset:r,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}}Ci.createTokenInstance=pIe;function dIe(t,e){return(0,Xv.tokenStructuredMatcher)(t,e)}Ci.tokenMatcher=dIe});var hn=E(Tt=>{"use strict";var oa=Tt&&Tt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.serializeProduction=Tt.serializeGrammar=Tt.Terminal=Tt.Alternation=Tt.RepetitionWithSeparator=Tt.Repetition=Tt.RepetitionMandatoryWithSeparator=Tt.RepetitionMandatory=Tt.Option=Tt.Alternative=Tt.Rule=Tt.NonTerminal=Tt.AbstractProduction=void 0;var $t=Dt(),CIe=nA(),Ao=function(){function t(e){this._definition=e}return Object.defineProperty(t.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),t.prototype.accept=function(e){e.visit(this),(0,$t.forEach)(this.definition,function(r){r.accept(e)})},t}();Tt.AbstractProduction=Ao;var PG=function(t){oa(e,t);function e(r){var i=t.call(this,[])||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(r){},enumerable:!1,configurable:!0}),e.prototype.accept=function(r){r.visit(this)},e}(Ao);Tt.NonTerminal=PG;var DG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.orgText="",(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Rule=DG;var RG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.ignoreAmbiguities=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Alternative=RG;var FG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Option=FG;var NG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatory=NG;var LG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatoryWithSeparator=LG;var TG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Repetition=TG;var MG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionWithSeparator=MG;var OG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(r){this._definition=r},enumerable:!1,configurable:!0}),e}(Ao);Tt.Alternation=OG;var CI=function(){function t(e){this.idx=1,(0,$t.assign)(this,(0,$t.pick)(e,function(r){return r!==void 0}))}return t.prototype.accept=function(e){e.visit(this)},t}();Tt.Terminal=CI;function mIe(t){return(0,$t.map)(t,Yh)}Tt.serializeGrammar=mIe;function Yh(t){function e(s){return(0,$t.map)(s,Yh)}if(t instanceof PG){var r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return(0,$t.isString)(t.label)&&(r.label=t.label),r}else{if(t instanceof RG)return{type:"Alternative",definition:e(t.definition)};if(t instanceof FG)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof NG)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof LG)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Yh(new CI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof MG)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Yh(new CI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof TG)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof OG)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof CI){var i={type:"Terminal",name:t.terminalType.name,label:(0,CIe.tokenLabel)(t.terminalType),idx:t.idx};(0,$t.isString)(t.label)&&(i.terminalLabel=t.label);var n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(i.pattern=(0,$t.isRegExp)(n)?n.source:n),i}else{if(t instanceof DG)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}Tt.serializeProduction=Yh});var EI=E(mI=>{"use strict";Object.defineProperty(mI,"__esModule",{value:!0});mI.RestWalker=void 0;var Zv=Dt(),pn=hn(),EIe=function(){function t(){}return t.prototype.walk=function(e,r){var i=this;r===void 0&&(r=[]),(0,Zv.forEach)(e.definition,function(n,s){var o=(0,Zv.drop)(e.definition,s+1);if(n instanceof pn.NonTerminal)i.walkProdRef(n,o,r);else if(n instanceof pn.Terminal)i.walkTerminal(n,o,r);else if(n instanceof pn.Alternative)i.walkFlat(n,o,r);else if(n instanceof pn.Option)i.walkOption(n,o,r);else if(n instanceof pn.RepetitionMandatory)i.walkAtLeastOne(n,o,r);else if(n instanceof pn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,r);else if(n instanceof pn.RepetitionWithSeparator)i.walkManySep(n,o,r);else if(n instanceof pn.Repetition)i.walkMany(n,o,r);else if(n instanceof pn.Alternation)i.walkOr(n,o,r);else throw Error("non exhaustive match")})},t.prototype.walkTerminal=function(e,r,i){},t.prototype.walkProdRef=function(e,r,i){},t.prototype.walkFlat=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkOption=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkAtLeastOne=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkAtLeastOneSep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkMany=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkManySep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkOr=function(e,r,i){var n=this,s=r.concat(i);(0,Zv.forEach)(e.definition,function(o){var a=new pn.Alternative({definition:[o]});n.walk(a,s)})},t}();mI.RestWalker=EIe;function KG(t,e,r){var i=[new pn.Option({definition:[new pn.Terminal({terminalType:t.separator})].concat(t.definition)})],n=i.concat(e,r);return n}});var wu=E(II=>{"use strict";Object.defineProperty(II,"__esModule",{value:!0});II.GAstVisitor=void 0;var lo=hn(),IIe=function(){function t(){}return t.prototype.visit=function(e){var r=e;switch(r.constructor){case lo.NonTerminal:return this.visitNonTerminal(r);case lo.Alternative:return this.visitAlternative(r);case lo.Option:return this.visitOption(r);case lo.RepetitionMandatory:return this.visitRepetitionMandatory(r);case lo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(r);case lo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(r);case lo.Repetition:return this.visitRepetition(r);case lo.Alternation:return this.visitAlternation(r);case lo.Terminal:return this.visitTerminal(r);case lo.Rule:return this.visitRule(r);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(e){},t.prototype.visitAlternative=function(e){},t.prototype.visitOption=function(e){},t.prototype.visitRepetition=function(e){},t.prototype.visitRepetitionMandatory=function(e){},t.prototype.visitRepetitionMandatoryWithSeparator=function(e){},t.prototype.visitRepetitionWithSeparator=function(e){},t.prototype.visitAlternation=function(e){},t.prototype.visitTerminal=function(e){},t.prototype.visitRule=function(e){},t}();II.GAstVisitor=IIe});var Jh=E(Si=>{"use strict";var yIe=Si&&Si.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Si,"__esModule",{value:!0});Si.collectMethods=Si.DslMethodsCollectorVisitor=Si.getProductionDslName=Si.isBranchingProd=Si.isOptionalProd=Si.isSequenceProd=void 0;var qh=Dt(),dr=hn(),wIe=wu();function BIe(t){return t instanceof dr.Alternative||t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionMandatory||t instanceof dr.RepetitionMandatoryWithSeparator||t instanceof dr.RepetitionWithSeparator||t instanceof dr.Terminal||t instanceof dr.Rule}Si.isSequenceProd=BIe;function $v(t,e){e===void 0&&(e=[]);var r=t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionWithSeparator;return r?!0:t instanceof dr.Alternation?(0,qh.some)(t.definition,function(i){return $v(i,e)}):t instanceof dr.NonTerminal&&(0,qh.contains)(e,t)?!1:t instanceof dr.AbstractProduction?(t instanceof dr.NonTerminal&&e.push(t),(0,qh.every)(t.definition,function(i){return $v(i,e)})):!1}Si.isOptionalProd=$v;function QIe(t){return t instanceof dr.Alternation}Si.isBranchingProd=QIe;function bIe(t){if(t instanceof dr.NonTerminal)return"SUBRULE";if(t instanceof dr.Option)return"OPTION";if(t instanceof dr.Alternation)return"OR";if(t instanceof dr.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof dr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof dr.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof dr.Repetition)return"MANY";if(t instanceof dr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Si.getProductionDslName=bIe;var UG=function(t){yIe(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.separator="-",r.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},r}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(r){var i=r.terminalType.name+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitNonTerminal=function(r){var i=r.nonTerminalName+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitOption=function(r){this.dslMethods.option.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.dslMethods.repetitionWithSeparator.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.dslMethods.repetitionMandatory.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.dslMethods.repetitionMandatoryWithSeparator.push(r)},e.prototype.visitRepetition=function(r){this.dslMethods.repetition.push(r)},e.prototype.visitAlternation=function(r){this.dslMethods.alternation.push(r)},e}(wIe.GAstVisitor);Si.DslMethodsCollectorVisitor=UG;var yI=new UG;function vIe(t){yI.reset(),t.accept(yI);var e=yI.dslMethods;return yI.reset(),e}Si.collectMethods=vIe});var tS=E(co=>{"use strict";Object.defineProperty(co,"__esModule",{value:!0});co.firstForTerminal=co.firstForBranching=co.firstForSequence=co.first=void 0;var wI=Dt(),HG=hn(),eS=Jh();function BI(t){if(t instanceof HG.NonTerminal)return BI(t.referencedRule);if(t instanceof HG.Terminal)return YG(t);if((0,eS.isSequenceProd)(t))return GG(t);if((0,eS.isBranchingProd)(t))return jG(t);throw Error("non exhaustive match")}co.first=BI;function GG(t){for(var e=[],r=t.definition,i=0,n=r.length>i,s,o=!0;n&&o;)s=r[i],o=(0,eS.isOptionalProd)(s),e=e.concat(BI(s)),i=i+1,n=r.length>i;return(0,wI.uniq)(e)}co.firstForSequence=GG;function jG(t){var e=(0,wI.map)(t.definition,function(r){return BI(r)});return(0,wI.uniq)((0,wI.flatten)(e))}co.firstForBranching=jG;function YG(t){return[t.terminalType]}co.firstForTerminal=YG});var rS=E(QI=>{"use strict";Object.defineProperty(QI,"__esModule",{value:!0});QI.IN=void 0;QI.IN="_~IN~_"});var VG=E(es=>{"use strict";var SIe=es&&es.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(es,"__esModule",{value:!0});es.buildInProdFollowPrefix=es.buildBetweenProdsFollowPrefix=es.computeAllProdsFollows=es.ResyncFollowsWalker=void 0;var xIe=EI(),kIe=tS(),qG=Dt(),JG=rS(),PIe=hn(),zG=function(t){SIe(e,t);function e(r){var i=t.call(this)||this;return i.topProd=r,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(r,i,n){},e.prototype.walkProdRef=function(r,i,n){var s=WG(r.referencedRule,r.idx)+this.topProd.name,o=i.concat(n),a=new PIe.Alternative({definition:o}),l=(0,kIe.first)(a);this.follows[s]=l},e}(xIe.RestWalker);es.ResyncFollowsWalker=zG;function DIe(t){var e={};return(0,qG.forEach)(t,function(r){var i=new zG(r).startWalking();(0,qG.assign)(e,i)}),e}es.computeAllProdsFollows=DIe;function WG(t,e){return t.name+e+JG.IN}es.buildBetweenProdsFollowPrefix=WG;function RIe(t){var e=t.terminalType.name;return e+t.idx+JG.IN}es.buildInProdFollowPrefix=RIe});var Wh=E(aa=>{"use strict";Object.defineProperty(aa,"__esModule",{value:!0});aa.defaultGrammarValidatorErrorProvider=aa.defaultGrammarResolverErrorProvider=aa.defaultParserErrorProvider=void 0;var Bu=nA(),FIe=Dt(),Rs=Dt(),iS=hn(),_G=Jh();aa.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,r=t.actual,i=t.previous,n=t.ruleName,s=(0,Bu.hasTokenLabel)(e),o=s?"--> "+(0,Bu.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+r.image+"' <--";return a},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant,r=t.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,r=t.actual,i=t.previous,n=t.customUserDescription,s=t.ruleName,o="Expecting: ",a=(0,Rs.first)(r).image,l=` -but found: '`+a+"'";if(n)return o+n+l;var c=(0,Rs.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Rs.map)(c,function(h){return"["+(0,Rs.map)(h,function(p){return(0,Bu.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Rs.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: -`+g.join(` -`);return o+f+l},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,r=t.actual,i=t.customUserDescription,n=t.ruleName,s="Expecting: ",o=(0,Rs.first)(r).image,a=` -but found: '`+o+"'";if(i)return s+i+a;var l=(0,Rs.map)(e,function(u){return"["+(0,Rs.map)(u,function(g){return(0,Bu.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: - `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(aa.defaultParserErrorProvider);aa.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){var r="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+t.name+"<-";return r}};aa.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){function r(u){return u instanceof iS.Terminal?u.terminalType.name:u instanceof iS.NonTerminal?u.nonTerminalName:""}var i=t.name,n=(0,Rs.first)(e),s=n.idx,o=(0,_G.getProductionDslName)(n),a=r(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` - appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` -`),c},buildNamespaceConflictError:function(t){var e=`Namespace conflict found in grammar. -`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+t.name+`>. -`)+`To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous alternatives: <"+t.ambiguityIndices.join(" ,")+`> due to common lookahead prefix -`+("in inside <"+t.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`;return i},buildAlternationAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous Alternatives Detected: <"+t.ambiguityIndices.join(" ,")+"> in "+(" inside <"+t.topLevelRule.name+`> Rule, -`)+("<"+e+`> may appears as a prefix path in all these alternatives. -`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,i},buildEmptyRepetitionError:function(t){var e=(0,_G.getProductionDslName)(t.repetition);t.repetition.idx!==0&&(e+=t.repetition.idx);var r="The repetition <"+e+"> within Rule <"+t.topLevelRule.name+`> can never consume any tokens. -This could lead to an infinite loop.`;return r},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){var e="Ambiguous empty alternative: <"+(t.emptyChoiceIdx+1)+">"+(" in inside <"+t.topLevelRule.name+`> Rule. -`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(t){var e=`An Alternation cannot have more than 256 alternatives: -`+(" inside <"+t.topLevelRule.name+`> Rule. - has `+(t.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,r=FIe.map(t.leftRecursionPath,function(s){return s.name}),i=e+" --> "+r.concat([e]).join(" --> "),n=`Left Recursion found in grammar. -`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) -`)+(`without consuming any Tokens. The grammar path that causes this is: - `+i+` -`)+` To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;t.topLevelRule instanceof iS.Rule?e=t.topLevelRule.name:e=t.topLevelRule;var r="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+t.grammarName+"<-";return r}}});var $G=E(sA=>{"use strict";var NIe=sA&&sA.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(sA,"__esModule",{value:!0});sA.GastRefResolverVisitor=sA.resolveGrammar=void 0;var LIe=Tn(),XG=Dt(),TIe=wu();function MIe(t,e){var r=new ZG(t,e);return r.resolveRefs(),r.errors}sA.resolveGrammar=MIe;var ZG=function(t){NIe(e,t);function e(r,i){var n=t.call(this)||this;return n.nameToTopRule=r,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var r=this;(0,XG.forEach)((0,XG.values)(this.nameToTopRule),function(i){r.currTopLevel=i,i.accept(r)})},e.prototype.visitNonTerminal=function(r){var i=this.nameToTopRule[r.nonTerminalName];if(i)r.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,r);this.errors.push({message:n,type:LIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:r.nonTerminalName})}},e}(TIe.GAstVisitor);sA.GastRefResolverVisitor=ZG});var Vh=E(Br=>{"use strict";var Fl=Br&&Br.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Br,"__esModule",{value:!0});Br.nextPossibleTokensAfter=Br.possiblePathsFrom=Br.NextTerminalAfterAtLeastOneSepWalker=Br.NextTerminalAfterAtLeastOneWalker=Br.NextTerminalAfterManySepWalker=Br.NextTerminalAfterManyWalker=Br.AbstractNextTerminalAfterProductionWalker=Br.NextAfterTokenWalker=Br.AbstractNextPossibleTokensWalker=void 0;var ej=EI(),xt=Dt(),OIe=tS(),It=hn(),tj=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topProd=r,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,xt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,xt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(r,i){i===void 0&&(i=[]),this.found||t.prototype.walk.call(this,r,i)},e.prototype.walkProdRef=function(r,i,n){if(r.referencedRule.name===this.nextProductionName&&r.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(r.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,xt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(ej.RestWalker);Br.AbstractNextPossibleTokensWalker=tj;var KIe=function(t){Fl(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(r,i,n){if(this.isAtEndOfPath&&r.terminalType.name===this.nextTerminalName&&r.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new It.Alternative({definition:s});this.possibleTokTypes=(0,OIe.first)(o),this.found=!0}},e}(tj);Br.NextAfterTokenWalker=KIe;var zh=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topRule=r,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(ej.RestWalker);Br.AbstractNextTerminalAfterProductionWalker=zh;var UIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkMany=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkMany.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManyWalker=UIe;var HIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkManySep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkManySep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManySepWalker=HIe;var GIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOne.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneWalker=GIe;var jIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOneSep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneSepWalker=jIe;function rj(t,e,r){r===void 0&&(r=[]),r=(0,xt.cloneArr)(r);var i=[],n=0;function s(c){return c.concat((0,xt.drop)(t,n+1))}function o(c){var u=rj(s(c),e,r);return i.concat(u)}for(;r.length=0;W--){var X=I.definition[W],F={idx:p,def:X.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m};g.push(F),g.push(o)}else if(I instanceof It.Alternative)g.push({idx:p,def:I.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m});else if(I instanceof It.Rule)g.push(YIe(I,p,d,m));else throw Error("non exhaustive match")}}return u}Br.nextPossibleTokensAfter=qIe;function YIe(t,e,r,i){var n=(0,xt.cloneArr)(r);n.push(t.name);var s=(0,xt.cloneArr)(i);return s.push(1),{idx:e,def:t.definition,ruleStack:n,occurrenceStack:s}}});var _h=E(Gt=>{"use strict";var ij=Gt&&Gt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Gt,"__esModule",{value:!0});Gt.areTokenCategoriesNotUsed=Gt.isStrictPrefixOfPath=Gt.containsPath=Gt.getLookaheadPathsForOptionalProd=Gt.getLookaheadPathsForOr=Gt.lookAheadSequenceFromAlternatives=Gt.buildSingleAlternativeLookaheadFunction=Gt.buildAlternativesLookAheadFunc=Gt.buildLookaheadFuncForOptionalProd=Gt.buildLookaheadFuncForOr=Gt.getProdType=Gt.PROD_TYPE=void 0;var _t=Dt(),nj=Vh(),JIe=EI(),bI=yu(),oA=hn(),WIe=wu(),zr;(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(zr=Gt.PROD_TYPE||(Gt.PROD_TYPE={}));function zIe(t){if(t instanceof oA.Option)return zr.OPTION;if(t instanceof oA.Repetition)return zr.REPETITION;if(t instanceof oA.RepetitionMandatory)return zr.REPETITION_MANDATORY;if(t instanceof oA.RepetitionMandatoryWithSeparator)return zr.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof oA.RepetitionWithSeparator)return zr.REPETITION_WITH_SEPARATOR;if(t instanceof oA.Alternation)return zr.ALTERNATION;throw Error("non exhaustive match")}Gt.getProdType=zIe;function VIe(t,e,r,i,n,s){var o=sj(t,e,r),a=nS(o)?bI.tokenStructuredMatcherNoCategories:bI.tokenStructuredMatcher;return s(o,i,a,n)}Gt.buildLookaheadFuncForOr=VIe;function _Ie(t,e,r,i,n,s){var o=oj(t,e,n,r),a=nS(o)?bI.tokenStructuredMatcherNoCategories:bI.tokenStructuredMatcher;return s(o[0],a,i)}Gt.buildLookaheadFuncForOptionalProd=_Ie;function XIe(t,e,r,i){var n=t.length,s=(0,_t.every)(t,function(l){return(0,_t.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,_t.map)(l,function(b){return b.GATE}),u=0;u{"use strict";var aS=Mt&&Mt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Mt,"__esModule",{value:!0});Mt.checkPrefixAlternativesAmbiguities=Mt.validateSomeNonEmptyLookaheadPath=Mt.validateTooManyAlts=Mt.RepetionCollector=Mt.validateAmbiguousAlternationAlternatives=Mt.validateEmptyOrAlternative=Mt.getFirstNoneTerminal=Mt.validateNoLeftRecursion=Mt.validateRuleIsOverridden=Mt.validateRuleDoesNotAlreadyExist=Mt.OccurrenceValidationCollector=Mt.identifyProductionForDuplicates=Mt.validateGrammar=void 0;var jt=Dt(),Cr=Dt(),uo=Tn(),AS=Jh(),Qu=_h(),rye=Vh(),Fs=hn(),lS=wu();function sye(t,e,r,i,n){var s=jt.map(t,function(h){return iye(h,i)}),o=jt.map(t,function(h){return cS(h,h,i)}),a=[],l=[],c=[];(0,Cr.every)(o,Cr.isEmpty)&&(a=(0,Cr.map)(t,function(h){return uj(h,i)}),l=(0,Cr.map)(t,function(h){return gj(h,e,i)}),c=hj(t,e,i));var u=nye(t,r,i),g=(0,Cr.map)(t,function(h){return fj(h,i)}),f=(0,Cr.map)(t,function(h){return cj(h,t,n,i)});return jt.flatten(s.concat(c,o,a,l,u,g,f))}Mt.validateGrammar=sye;function iye(t,e){var r=new Cj;t.accept(r);var i=r.allProductions,n=jt.groupBy(i,pj),s=jt.pick(n,function(a){return a.length>1}),o=jt.map(jt.values(s),function(a){var l=jt.first(a),c=e.buildDuplicateFoundError(t,a),u=(0,AS.getProductionDslName)(l),g={message:c,type:uo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:l.idx},f=dj(l);return f&&(g.parameter=f),g});return o}function pj(t){return(0,AS.getProductionDslName)(t)+"_#_"+t.idx+"_#_"+dj(t)}Mt.identifyProductionForDuplicates=pj;function dj(t){return t instanceof Fs.Terminal?t.terminalType.name:t instanceof Fs.NonTerminal?t.nonTerminalName:""}var Cj=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitNonTerminal=function(r){this.allProductions.push(r)},e.prototype.visitOption=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e.prototype.visitAlternation=function(r){this.allProductions.push(r)},e.prototype.visitTerminal=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.OccurrenceValidationCollector=Cj;function cj(t,e,r,i){var n=[],s=(0,Cr.reduce)(e,function(a,l){return l.name===t.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});n.push({message:o,type:uo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return n}Mt.validateRuleDoesNotAlreadyExist=cj;function oye(t,e,r){var i=[],n;return jt.contains(e,t)||(n="Invalid rule override, rule: ->"+t+"<- cannot be overridden in the grammar: ->"+r+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:uo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),i}Mt.validateRuleIsOverridden=oye;function cS(t,e,r,i){i===void 0&&(i=[]);var n=[],s=Xh(e.definition);if(jt.isEmpty(s))return[];var o=t.name,a=jt.contains(s,t);a&&n.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:i}),type:uo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=jt.difference(s,i.concat([t])),c=jt.map(l,function(u){var g=jt.cloneArr(i);return g.push(u),cS(t,u,r,g)});return n.concat(jt.flatten(c))}Mt.validateNoLeftRecursion=cS;function Xh(t){var e=[];if(jt.isEmpty(t))return e;var r=jt.first(t);if(r instanceof Fs.NonTerminal)e.push(r.referencedRule);else if(r instanceof Fs.Alternative||r instanceof Fs.Option||r instanceof Fs.RepetitionMandatory||r instanceof Fs.RepetitionMandatoryWithSeparator||r instanceof Fs.RepetitionWithSeparator||r instanceof Fs.Repetition)e=e.concat(Xh(r.definition));else if(r instanceof Fs.Alternation)e=jt.flatten(jt.map(r.definition,function(o){return Xh(o.definition)}));else if(!(r instanceof Fs.Terminal))throw Error("non exhaustive match");var i=(0,AS.isOptionalProd)(r),n=t.length>1;if(i&&n){var s=jt.drop(t);return e.concat(Xh(s))}else return e}Mt.getFirstNoneTerminal=Xh;var uS=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.alternations=[],r}return e.prototype.visitAlternation=function(r){this.alternations.push(r)},e}(lS.GAstVisitor);function uj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){var a=jt.dropRight(o.definition),l=jt.map(a,function(c,u){var g=(0,rye.nextPossibleTokensAfter)([c],[],null,1);return jt.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:o,emptyChoiceIdx:u}),type:uo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(jt.compact(l))},[]);return n}Mt.validateEmptyOrAlternative=uj;function gj(t,e,r){var i=new uS;t.accept(i);var n=i.alternations;n=(0,Cr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=jt.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,Qu.getLookaheadPathsForOr)(l,t,c,a),g=aye(u,a,t,r),f=mj(u,a,t,r);return o.concat(g,f)},[]);return s}Mt.validateAmbiguousAlternationAlternatives=gj;var Ej=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.RepetionCollector=Ej;function fj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:o}),type:uo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:o.idx}),s},[]);return n}Mt.validateTooManyAlts=fj;function hj(t,e,r){var i=[];return(0,Cr.forEach)(t,function(n){var s=new Ej;n.accept(s);var o=s.allProductions;(0,Cr.forEach)(o,function(a){var l=(0,Qu.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,Qu.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Cr.isEmpty)((0,Cr.flatten)(f))){var h=r.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:uo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Mt.validateSomeNonEmptyLookaheadPath=hj;function aye(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Cr.forEach)(l,function(u){var g=[c];(0,Cr.forEach)(t,function(f,h){c!==h&&(0,Qu.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,Qu.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=jt.map(s,function(a){var l=(0,Cr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:uo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function mj(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(o,a,l){var c=(0,Cr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Cr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Cr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(bu,"__esModule",{value:!0});bu.validateGrammar=bu.resolveGrammar=void 0;var fS=Dt(),Aye=$G(),lye=gS(),Ij=Wh();function cye(t){t=(0,fS.defaults)(t,{errMsgProvider:Ij.defaultGrammarResolverErrorProvider});var e={};return(0,fS.forEach)(t.rules,function(r){e[r.name]=r}),(0,Aye.resolveGrammar)(e,t.errMsgProvider)}bu.resolveGrammar=cye;function uye(t){return t=(0,fS.defaults)(t,{errMsgProvider:Ij.defaultGrammarValidatorErrorProvider}),(0,lye.validateGrammar)(t.rules,t.maxLookahead,t.tokenTypes,t.errMsgProvider,t.grammarName)}bu.validateGrammar=uye});var vu=E(dn=>{"use strict";var Zh=dn&&dn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(dn,"__esModule",{value:!0});dn.EarlyExitException=dn.NotAllInputParsedException=dn.NoViableAltException=dn.MismatchedTokenException=dn.isRecognitionException=void 0;var gye=Dt(),wj="MismatchedTokenException",Bj="NoViableAltException",Qj="EarlyExitException",bj="NotAllInputParsedException",vj=[wj,Bj,Qj,bj];Object.freeze(vj);function fye(t){return(0,gye.contains)(vj,t.name)}dn.isRecognitionException=fye;var vI=function(t){Zh(e,t);function e(r,i){var n=this.constructor,s=t.call(this,r)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),hye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=wj,s}return e}(vI);dn.MismatchedTokenException=hye;var pye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Bj,s}return e}(vI);dn.NoViableAltException=pye;var dye=function(t){Zh(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.name=bj,n}return e}(vI);dn.NotAllInputParsedException=dye;var Cye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Qj,s}return e}(vI);dn.EarlyExitException=Cye});var pS=E(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.attemptInRepetitionRecovery=xi.Recoverable=xi.InRuleRecoveryException=xi.IN_RULE_RECOVERY_EXCEPTION=xi.EOF_FOLLOW_KEY=void 0;var SI=nA(),ts=Dt(),mye=vu(),Eye=rS(),Iye=Tn();xi.EOF_FOLLOW_KEY={};xi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function hS(t){this.name=xi.IN_RULE_RECOVERY_EXCEPTION,this.message=t}xi.InRuleRecoveryException=hS;hS.prototype=Error.prototype;var yye=function(){function t(){}return t.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,ts.has)(e,"recoveryEnabled")?e.recoveryEnabled:Iye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Sj)},t.prototype.getTokenToInsert=function(e){var r=(0,SI.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r},t.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},t.prototype.tryInRepetitionRecovery=function(e,r,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),d=new mye.MismatchedTokenException(p,u,s.LA(0));d.resyncedTokens=(0,ts.dropRight)(l),s.SAVE_ERROR(d)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,r);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},t.prototype.shouldInRepetitionRecoveryBeTried=function(e,r,i){return!(i===!1||e===void 0||r===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))},t.prototype.getFollowsForInRuleRecovery=function(e,r){var i=this.getCurrentGrammarPath(e,r),n=this.getNextPossibleTokenTypes(i);return n},t.prototype.tryInRuleRecovery=function(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new hS("sad sad panda")},t.prototype.canPerformInRuleRecovery=function(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)},t.prototype.canRecoverWithSingleTokenInsertion=function(e,r){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,ts.isEmpty)(r))return!1;var n=this.LA(1),s=(0,ts.find)(r,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},t.prototype.canRecoverWithSingleTokenDeletion=function(e){var r=this.tokenMatcher(this.LA(2),e);return r},t.prototype.isInCurrentRuleReSyncSet=function(e){var r=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(r);return(0,ts.contains)(i,e)},t.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),r=this.LA(1),i=2;;){var n=r.tokenType;if((0,ts.contains)(e,n))return n;r=this.LA(i),i++}},t.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return xi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(i)}},t.prototype.buildFullFollowKeyStack=function(){var e=this,r=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,ts.map)(r,function(n,s){return s===0?xi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(r[s-1])}})},t.prototype.flattenFollowSet=function(){var e=this,r=(0,ts.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,ts.flatten)(r)},t.prototype.getFollowSetFromFollowKey=function(e){if(e===xi.EOF_FOLLOW_KEY)return[SI.EOF];var r=e.ruleName+e.idxInCallingRule+Eye.IN+e.inRule;return this.resyncFollows[r]},t.prototype.addToResyncTokens=function(e,r){return this.tokenMatcher(e,SI.EOF)||r.push(e),r},t.prototype.reSyncTo=function(e){for(var r=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,r);return(0,ts.dropRight)(r)},t.prototype.attemptInRepetitionRecovery=function(e,r,i,n,s,o,a){},t.prototype.getCurrentGrammarPath=function(e,r){var i=this.getHumanReadableRuleStack(),n=(0,ts.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:r};return s},t.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,ts.map)(this.RULE_STACK,function(r){return e.shortRuleNameToFullName(r)})},t}();xi.Recoverable=yye;function Sj(t,e,r,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=SI.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(t,e,r,f)}xi.attemptInRepetitionRecovery=Sj});var xI=E(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.getKeyForAutomaticLookahead=Nt.AT_LEAST_ONE_SEP_IDX=Nt.MANY_SEP_IDX=Nt.AT_LEAST_ONE_IDX=Nt.MANY_IDX=Nt.OPTION_IDX=Nt.OR_IDX=Nt.BITS_FOR_ALT_IDX=Nt.BITS_FOR_RULE_IDX=Nt.BITS_FOR_OCCURRENCE_IDX=Nt.BITS_FOR_METHOD_TYPE=void 0;Nt.BITS_FOR_METHOD_TYPE=4;Nt.BITS_FOR_OCCURRENCE_IDX=8;Nt.BITS_FOR_RULE_IDX=12;Nt.BITS_FOR_ALT_IDX=8;Nt.OR_IDX=1<{"use strict";Object.defineProperty(kI,"__esModule",{value:!0});kI.LooksAhead=void 0;var Aa=_h(),Ns=Dt(),xj=Tn(),la=xI(),Nl=Jh(),Bye=function(){function t(){}return t.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,Ns.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:xj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,Ns.has)(e,"maxLookahead")?e.maxLookahead:xj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,Ns.isES2015MapSupported)()?new Map:[],(0,Ns.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(e){var r=this;(0,Ns.forEach)(e,function(i){r.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Nl.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,Ns.forEach)(s,function(g){var f=g.idx===0?"":g.idx;r.TRACE_INIT(""+(0,Nl.getProductionDslName)(g)+f,function(){var h=(0,Aa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||r.maxLookahead,g.hasPredicates,r.dynamicTokensEnabled,r.lookAheadBuilderForAlternatives),p=(0,la.getKeyForAutomaticLookahead)(r.fullRuleNameToShort[i.name],la.OR_IDX,g.idx);r.setLaFuncCache(p,h)})}),(0,Ns.forEach)(o,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_IDX,Aa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(a,function(g){r.computeLookaheadFunc(i,g.idx,la.OPTION_IDX,Aa.PROD_TYPE.OPTION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(l,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(c,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_SEP_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(u,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_SEP_IDX,Aa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))})})})},t.prototype.computeLookaheadFunc=function(e,r,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(r===0?"":r),function(){var l=(0,Aa.buildLookaheadFuncForOptionalProd)(r,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,la.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,r);a.setLaFuncCache(c,l)})},t.prototype.lookAheadBuilderForOptional=function(e,r,i){return(0,Aa.buildSingleAlternativeLookaheadFunction)(e,r,i)},t.prototype.lookAheadBuilderForAlternatives=function(e,r,i,n){return(0,Aa.buildAlternativesLookAheadFunc)(e,r,i,n)},t.prototype.getKeyForAutomaticLookahead=function(e,r){var i=this.getLastExplicitRuleShortName();return(0,la.getKeyForAutomaticLookahead)(i,e,r)},t.prototype.getLaFuncFromCache=function(e){},t.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},t.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},t.prototype.setLaFuncCache=function(e,r){},t.prototype.setLaFuncCacheUsingMap=function(e,r){this.lookAheadFuncsCache.set(e,r)},t.prototype.setLaFuncUsingObj=function(e,r){this.lookAheadFuncsCache[e]=r},t}();kI.LooksAhead=Bye});var Pj=E(go=>{"use strict";Object.defineProperty(go,"__esModule",{value:!0});go.addNoneTerminalToCst=go.addTerminalToCst=go.setNodeLocationFull=go.setNodeLocationOnlyOffset=void 0;function Qye(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";Object.defineProperty(aA,"__esModule",{value:!0});aA.defineNameProp=aA.functionName=aA.classNameFromInstance=void 0;var xye=Dt();function kye(t){return Dj(t.constructor)}aA.classNameFromInstance=kye;var Rj="name";function Dj(t){var e=t.name;return e||"anonymous"}aA.functionName=Dj;function Pye(t,e){var r=Object.getOwnPropertyDescriptor(t,Rj);return(0,xye.isUndefined)(r)||r.configurable?(Object.defineProperty(t,Rj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}aA.defineNameProp=Pye});var Mj=E(mi=>{"use strict";Object.defineProperty(mi,"__esModule",{value:!0});mi.validateRedundantMethods=mi.validateMissingCstMethods=mi.validateVisitor=mi.CstVisitorDefinitionError=mi.createBaseVisitorConstructorWithDefaults=mi.createBaseSemanticVisitorConstructor=mi.defaultVisit=void 0;var rs=Dt(),$h=dS();function Fj(t,e){for(var r=(0,rs.keys)(t),i=r.length,n=0;n: - `+(""+s.join(` - -`).replace(/\n/g,` - `)))}}};return r.prototype=i,r.prototype.constructor=r,r._RULE_NAMES=e,r}mi.createBaseSemanticVisitorConstructor=Dye;function Rye(t,e,r){var i=function(){};(0,$h.defineNameProp)(i,t+"BaseSemanticsWithDefaults");var n=Object.create(r.prototype);return(0,rs.forEach)(e,function(s){n[s]=Fj}),i.prototype=n,i.prototype.constructor=i,i}mi.createBaseVisitorConstructorWithDefaults=Rye;var CS;(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(CS=mi.CstVisitorDefinitionError||(mi.CstVisitorDefinitionError={}));function Nj(t,e){var r=Lj(t,e),i=Tj(t,e);return r.concat(i)}mi.validateVisitor=Nj;function Lj(t,e){var r=(0,rs.map)(e,function(i){if(!(0,rs.isFunction)(t[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+" CST Visitor.",type:CS.MISSING_METHOD,methodName:i}});return(0,rs.compact)(r)}mi.validateMissingCstMethods=Lj;var Fye=["constructor","visit","validateVisitor"];function Tj(t,e){var r=[];for(var i in t)(0,rs.isFunction)(t[i])&&!(0,rs.contains)(Fye,i)&&!(0,rs.contains)(e,i)&&r.push({msg:"Redundant visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+` CST Visitor -There is no Grammar Rule corresponding to this method's name. -`,type:CS.REDUNDANT_METHOD,methodName:i});return r}mi.validateRedundantMethods=Tj});var Kj=E(PI=>{"use strict";Object.defineProperty(PI,"__esModule",{value:!0});PI.TreeBuilder=void 0;var Su=Pj(),Ur=Dt(),Oj=Mj(),Nye=Tn(),Lye=function(){function t(){}return t.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Ur.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:Nye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Ur.NOOP,this.cstFinallyStateUpdate=Ur.NOOP,this.cstPostTerminal=Ur.NOOP,this.cstPostNonTerminal=Ur.NOOP,this.cstPostRule=Ur.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationFull,this.setNodeLocationFromNode=Su.setNodeLocationFull,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=Su.setNodeLocationOnlyOffset,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=Ur.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(e){var r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstInvocationStateUpdate=function(e,r){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},t.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},t.prototype.cstPostRuleFull=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?(i.endOffset=r.endOffset,i.endLine=r.endLine,i.endColumn=r.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?i.endOffset=r.endOffset:i.startOffset=NaN},t.prototype.cstPostTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addTerminalToCst)(i,r,e),this.setNodeLocationFromToken(i.location,r)},t.prototype.cstPostNonTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addNoneTerminalToCst)(i,r,e),this.setNodeLocationFromNode(i.location,e.location)},t.prototype.getBaseCstVisitorConstructor=function(){if((0,Ur.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Oj.createBaseSemanticVisitorConstructor)(this.className,(0,Ur.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Ur.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Oj.createBaseVisitorConstructorWithDefaults)(this.className,(0,Ur.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},t}();PI.TreeBuilder=Lye});var Hj=E(DI=>{"use strict";Object.defineProperty(DI,"__esModule",{value:!0});DI.LexerAdapter=void 0;var Uj=Tn(),Tye=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Uj.END_OF_FILE},t.prototype.LA=function(e){var r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Uj.END_OF_FILE:this.tokVector[r]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(e){this.currIdx=e},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();DI.LexerAdapter=Tye});var jj=E(RI=>{"use strict";Object.defineProperty(RI,"__esModule",{value:!0});RI.RecognizerApi=void 0;var Gj=Dt(),Mye=vu(),mS=Tn(),Oye=Wh(),Kye=gS(),Uye=hn(),Hye=function(){function t(){}return t.prototype.ACTION=function(e){return e.call(this)},t.prototype.consume=function(e,r,i){return this.consumeInternal(r,e,i)},t.prototype.subrule=function(e,r,i){return this.subruleInternal(r,e,i)},t.prototype.option=function(e,r){return this.optionInternal(r,e)},t.prototype.or=function(e,r){return this.orInternal(r,e)},t.prototype.many=function(e,r){return this.manyInternal(e,r)},t.prototype.atLeastOne=function(e,r){return this.atLeastOneInternal(e,r)},t.prototype.CONSUME=function(e,r){return this.consumeInternal(e,0,r)},t.prototype.CONSUME1=function(e,r){return this.consumeInternal(e,1,r)},t.prototype.CONSUME2=function(e,r){return this.consumeInternal(e,2,r)},t.prototype.CONSUME3=function(e,r){return this.consumeInternal(e,3,r)},t.prototype.CONSUME4=function(e,r){return this.consumeInternal(e,4,r)},t.prototype.CONSUME5=function(e,r){return this.consumeInternal(e,5,r)},t.prototype.CONSUME6=function(e,r){return this.consumeInternal(e,6,r)},t.prototype.CONSUME7=function(e,r){return this.consumeInternal(e,7,r)},t.prototype.CONSUME8=function(e,r){return this.consumeInternal(e,8,r)},t.prototype.CONSUME9=function(e,r){return this.consumeInternal(e,9,r)},t.prototype.SUBRULE=function(e,r){return this.subruleInternal(e,0,r)},t.prototype.SUBRULE1=function(e,r){return this.subruleInternal(e,1,r)},t.prototype.SUBRULE2=function(e,r){return this.subruleInternal(e,2,r)},t.prototype.SUBRULE3=function(e,r){return this.subruleInternal(e,3,r)},t.prototype.SUBRULE4=function(e,r){return this.subruleInternal(e,4,r)},t.prototype.SUBRULE5=function(e,r){return this.subruleInternal(e,5,r)},t.prototype.SUBRULE6=function(e,r){return this.subruleInternal(e,6,r)},t.prototype.SUBRULE7=function(e,r){return this.subruleInternal(e,7,r)},t.prototype.SUBRULE8=function(e,r){return this.subruleInternal(e,8,r)},t.prototype.SUBRULE9=function(e,r){return this.subruleInternal(e,9,r)},t.prototype.OPTION=function(e){return this.optionInternal(e,0)},t.prototype.OPTION1=function(e){return this.optionInternal(e,1)},t.prototype.OPTION2=function(e){return this.optionInternal(e,2)},t.prototype.OPTION3=function(e){return this.optionInternal(e,3)},t.prototype.OPTION4=function(e){return this.optionInternal(e,4)},t.prototype.OPTION5=function(e){return this.optionInternal(e,5)},t.prototype.OPTION6=function(e){return this.optionInternal(e,6)},t.prototype.OPTION7=function(e){return this.optionInternal(e,7)},t.prototype.OPTION8=function(e){return this.optionInternal(e,8)},t.prototype.OPTION9=function(e){return this.optionInternal(e,9)},t.prototype.OR=function(e){return this.orInternal(e,0)},t.prototype.OR1=function(e){return this.orInternal(e,1)},t.prototype.OR2=function(e){return this.orInternal(e,2)},t.prototype.OR3=function(e){return this.orInternal(e,3)},t.prototype.OR4=function(e){return this.orInternal(e,4)},t.prototype.OR5=function(e){return this.orInternal(e,5)},t.prototype.OR6=function(e){return this.orInternal(e,6)},t.prototype.OR7=function(e){return this.orInternal(e,7)},t.prototype.OR8=function(e){return this.orInternal(e,8)},t.prototype.OR9=function(e){return this.orInternal(e,9)},t.prototype.MANY=function(e){this.manyInternal(0,e)},t.prototype.MANY1=function(e){this.manyInternal(1,e)},t.prototype.MANY2=function(e){this.manyInternal(2,e)},t.prototype.MANY3=function(e){this.manyInternal(3,e)},t.prototype.MANY4=function(e){this.manyInternal(4,e)},t.prototype.MANY5=function(e){this.manyInternal(5,e)},t.prototype.MANY6=function(e){this.manyInternal(6,e)},t.prototype.MANY7=function(e){this.manyInternal(7,e)},t.prototype.MANY8=function(e){this.manyInternal(8,e)},t.prototype.MANY9=function(e){this.manyInternal(9,e)},t.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},t.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},t.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},t.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},t.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},t.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},t.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},t.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},t.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},t.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},t.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},t.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},t.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},t.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},t.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},t.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},t.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},t.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},t.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},t.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},t.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},t.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},t.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},t.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},t.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},t.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},t.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},t.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},t.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},t.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},t.prototype.RULE=function(e,r,i){if(i===void 0&&(i=mS.DEFAULT_RULE_CONFIG),(0,Gj.contains)(this.definedRulesNames,e)){var n=Oye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:mS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,r,i);return this[e]=o,o},t.prototype.OVERRIDE_RULE=function(e,r,i){i===void 0&&(i=mS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Kye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,r,i);return this[e]=s,s},t.prototype.BACKTRACK=function(e,r){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,r),!0}catch(n){if((0,Mye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,Uye.serializeGrammar)((0,Gj.values)(this.gastProductionsCache))},t}();RI.RecognizerApi=Hye});var Wj=E(FI=>{"use strict";Object.defineProperty(FI,"__esModule",{value:!0});FI.RecognizerEngine=void 0;var Er=Dt(),Mn=xI(),NI=vu(),Yj=_h(),xu=Vh(),qj=Tn(),Gye=pS(),Jj=nA(),ep=yu(),jye=dS(),Yye=function(){function t(){}return t.prototype.initRecognizerEngine=function(e,r){if(this.className=(0,jye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=ep.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Er.has)(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if((0,Er.isArray)(e)){if((0,Er.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if((0,Er.isArray)(e))this.tokensMap=(0,Er.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Er.has)(e,"modes")&&(0,Er.every)((0,Er.flatten)((0,Er.values)(e.modes)),ep.isTokenType)){var i=(0,Er.flatten)((0,Er.values)(e.modes)),n=(0,Er.uniq)(i);this.tokensMap=(0,Er.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Er.isObject)(e))this.tokensMap=(0,Er.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Jj.EOF;var s=(0,Er.every)((0,Er.values)(e),function(o){return(0,Er.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?ep.tokenStructuredMatcherNoCategories:ep.tokenStructuredMatcher,(0,ep.augmentTokenTypes)((0,Er.values)(this.tokensMap))},t.prototype.defineRule=function(e,r,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Er.has)(i,"resyncEnabled")?i.resyncEnabled:qj.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Er.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:qj.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<r},t.prototype.orInternal=function(e,r){var i=this.getKeyForAutomaticLookahead(Mn.OR_IDX,r),n=(0,Er.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(r,e.ERR_MSG)},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new NI.NotAllInputParsedException(r,e))}},t.prototype.subruleInternal=function(e,r,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,r,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},t.prototype.subruleInternalError=function(e,r,i){throw(0,NI.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:i),delete e.partialCstResult),e},t.prototype.consumeInternal=function(e,r,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,r,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},t.prototype.consumeInternalError=function(e,r,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new NI.MismatchedTokenException(n,r,s))},t.prototype.consumeInternalRecovery=function(e,r,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Gye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},t.prototype.saveRecogState=function(){var e=this.errors,r=(0,Er.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}},t.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(e,r,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r,e)},t.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},t.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},t.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Jj.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();FI.RecognizerEngine=Yye});var Vj=E(LI=>{"use strict";Object.defineProperty(LI,"__esModule",{value:!0});LI.ErrorHandler=void 0;var ES=vu(),IS=Dt(),zj=_h(),qye=Tn(),Jye=function(){function t(){}return t.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,IS.has)(e,"errorMessageProvider")?e.errorMessageProvider:qye.DEFAULT_PARSER_CONFIG.errorMessageProvider},t.prototype.SAVE_ERROR=function(e){if((0,ES.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,IS.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(t.prototype,"errors",{get:function(){return(0,IS.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),t.prototype.raiseEarlyExitException=function(e,r,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,zj.getLookaheadPathsForOptionalProd)(e,s,r,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new ES.EarlyExitException(u,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(e,r){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,zj.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new ES.NoViableAltException(c,this.LA(1),l))},t}();LI.ErrorHandler=Jye});var Zj=E(TI=>{"use strict";Object.defineProperty(TI,"__esModule",{value:!0});TI.ContentAssist=void 0;var _j=Vh(),Xj=Dt(),Wye=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(e,r){var i=this.gastProductionsCache[e];if((0,Xj.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,_j.nextPossibleTokensAfter)([i],r,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(e){var r=(0,Xj.first)(e.ruleStack),i=this.getGAstProductions(),n=i[r],s=new _j.NextAfterTokenWalker(n,e).startWalking();return s},t}();TI.ContentAssist=Wye});var oY=E(MI=>{"use strict";Object.defineProperty(MI,"__esModule",{value:!0});MI.GastRecorder=void 0;var Cn=Dt(),fo=hn(),zye=Gh(),$j=yu(),eY=nA(),Vye=Tn(),_ye=xI(),OI={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(OI);var tY=!0,rY=Math.pow(2,_ye.BITS_FOR_OCCURRENCE_IDX)-1,iY=(0,eY.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:zye.Lexer.NA});(0,$j.augmentTokenTypes)([iY]);var nY=(0,eY.createTokenInstance)(iY,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(nY);var Xye={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},$ye=function(){function t(){}return t.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var r=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)r(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},t.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var r=0;r<10;r++){var i=r>0?r:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(e){},t.prototype.BACKTRACK_RECORD=function(e,r){return function(){return!0}},t.prototype.LA_RECORD=function(e){return Vye.END_OF_FILE},t.prototype.topLevelRuleRecord=function(e,r){try{var i=new fo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),r.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},t.prototype.optionInternalRecord=function(e,r){return tp.call(this,fo.Option,e,r)},t.prototype.atLeastOneInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatory,r,e)},t.prototype.atLeastOneSepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatoryWithSeparator,r,e,tY)},t.prototype.manyInternalRecord=function(e,r){tp.call(this,fo.Repetition,r,e)},t.prototype.manySepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionWithSeparator,r,e,tY)},t.prototype.orInternalRecord=function(e,r){return Zye.call(this,e,r)},t.prototype.subruleInternalRecord=function(e,r,i){if(KI(r),!e||(0,Cn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=e.ruleName,a=new fo.NonTerminal({idx:r,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Xye:OI},t.prototype.consumeInternalRecord=function(e,r,i){if(KI(r),!(0,$j.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` - inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=new fo.Terminal({idx:r,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),nY},t}();MI.GastRecorder=$ye;function tp(t,e,r,i){i===void 0&&(i=!1),KI(r);var n=(0,Cn.peek)(this.recordingProdStack),s=(0,Cn.isFunction)(e)?e:e.DEF,o=new t({definition:[],idx:r});return i&&(o.separator=e.SEP),(0,Cn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),OI}function Zye(t,e){var r=this;KI(e);var i=(0,Cn.peek)(this.recordingProdStack),n=(0,Cn.isArray)(t)===!1,s=n===!1?t:t.DEF,o=new fo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});(0,Cn.has)(t,"MAX_LOOKAHEAD")&&(o.maxLookahead=t.MAX_LOOKAHEAD);var a=(0,Cn.some)(s,function(l){return(0,Cn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,Cn.forEach)(s,function(l){var c=new fo.Alternative({definition:[]});o.definition.push(c),(0,Cn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,Cn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),r.recordingProdStack.push(c),l.ALT.call(r),r.recordingProdStack.pop()}),OI}function sY(t){return t===0?"":""+t}function KI(t){if(t<0||t>rY){var e=new Error("Invalid DSL Method idx value: <"+t+`> - `+("Idx value must be a none negative value smaller than "+(rY+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var AY=E(UI=>{"use strict";Object.defineProperty(UI,"__esModule",{value:!0});UI.PerformanceTracer=void 0;var aY=Dt(),ewe=Tn(),twe=function(){function t(){}return t.prototype.initPerformanceTracer=function(e){if((0,aY.has)(e,"traceInitPerf")){var r=e.traceInitPerf,i=typeof r=="number";this.traceInitMaxIdent=i?r:Infinity,this.traceInitPerf=i?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ewe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,aY.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t}();UI.PerformanceTracer=twe});var lY=E(HI=>{"use strict";Object.defineProperty(HI,"__esModule",{value:!0});HI.applyMixins=void 0;function rwe(t,e){e.forEach(function(r){var i=r.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(t.prototype,n,s):t.prototype[n]=r.prototype[n]}})})}HI.applyMixins=rwe});var Tn=E(or=>{"use strict";var cY=or&&or.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(or,"__esModule",{value:!0});or.EmbeddedActionsParser=or.CstParser=or.Parser=or.EMPTY_ALT=or.ParserDefinitionErrorType=or.DEFAULT_RULE_CONFIG=or.DEFAULT_PARSER_CONFIG=or.END_OF_FILE=void 0;var Wi=Dt(),iwe=VG(),uY=nA(),gY=Wh(),fY=yj(),nwe=pS(),swe=kj(),owe=Kj(),awe=Hj(),Awe=jj(),lwe=Wj(),cwe=Vj(),uwe=Zj(),gwe=oY(),fwe=AY(),hwe=lY();or.END_OF_FILE=(0,uY.createTokenInstance)(uY.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(or.END_OF_FILE);or.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:gY.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});or.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var pwe;(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(pwe=or.ParserDefinitionErrorType||(or.ParserDefinitionErrorType={}));function dwe(t){return t===void 0&&(t=void 0),function(){return t}}or.EMPTY_ALT=dwe;var GI=function(){function t(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(r),i.initLexerAdapter(),i.initLooksAhead(r),i.initRecognizerEngine(e,r),i.initRecoverable(r),i.initTreeBuilder(r),i.initContentAssist(),i.initGastRecorder(r),i.initPerformanceTracer(r),(0,Wi.has)(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=(0,Wi.has)(r,"skipValidations")?r.skipValidations:or.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var r;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,Wi.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,Wi.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,fY.resolveGrammar)({rules:(0,Wi.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,Wi.isEmpty)(n)&&e.skipValidations===!1){var s=(0,fY.validateGrammar)({rules:(0,Wi.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,Wi.values)(e.tokensMap),errMsgProvider:gY.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,Wi.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,iwe.computeAllProdsFollows)((0,Wi.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,Wi.values)(e.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,Wi.isEmpty)(e.definitionErrors))throw r=(0,Wi.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: - `+r.join(` -------------------------------- -`))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();or.Parser=GI;(0,hwe.applyMixins)(GI,[nwe.Recoverable,swe.LooksAhead,owe.TreeBuilder,awe.LexerAdapter,lwe.RecognizerEngine,Awe.RecognizerApi,cwe.ErrorHandler,uwe.ContentAssist,gwe.GastRecorder,fwe.PerformanceTracer]);var Cwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!0,n=t.call(this,r,s)||this,n}return e}(GI);or.CstParser=Cwe;var mwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!1,n=t.call(this,r,s)||this,n}return e}(GI);or.EmbeddedActionsParser=mwe});var pY=E(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.createSyntaxDiagramsCode=void 0;var hY=Uv();function Ewe(t,e){var r=e===void 0?{}:e,i=r.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/":i,s=r.css,o=s===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/diagrams.css":s,a=` - - - - - -`,l=` - -`,c=` - - - - -`,u=` -

-`,g=` - -`,f=` - -`;return a+l+c+u+g+f}jI.createSyntaxDiagramsCode=Ewe});var mY=E(He=>{"use strict";Object.defineProperty(He,"__esModule",{value:!0});He.Parser=He.createSyntaxDiagramsCode=He.clearCache=He.GAstVisitor=He.serializeProduction=He.serializeGrammar=He.Terminal=He.Rule=He.RepetitionWithSeparator=He.RepetitionMandatoryWithSeparator=He.RepetitionMandatory=He.Repetition=He.Option=He.NonTerminal=He.Alternative=He.Alternation=He.defaultLexerErrorProvider=He.NoViableAltException=He.NotAllInputParsedException=He.MismatchedTokenException=He.isRecognitionException=He.EarlyExitException=He.defaultParserErrorProvider=He.tokenName=He.tokenMatcher=He.tokenLabel=He.EOF=He.createTokenInstance=He.createToken=He.LexerDefinitionErrorType=He.Lexer=He.EMPTY_ALT=He.ParserDefinitionErrorType=He.EmbeddedActionsParser=He.CstParser=He.VERSION=void 0;var Iwe=Uv();Object.defineProperty(He,"VERSION",{enumerable:!0,get:function(){return Iwe.VERSION}});var YI=Tn();Object.defineProperty(He,"CstParser",{enumerable:!0,get:function(){return YI.CstParser}});Object.defineProperty(He,"EmbeddedActionsParser",{enumerable:!0,get:function(){return YI.EmbeddedActionsParser}});Object.defineProperty(He,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return YI.ParserDefinitionErrorType}});Object.defineProperty(He,"EMPTY_ALT",{enumerable:!0,get:function(){return YI.EMPTY_ALT}});var dY=Gh();Object.defineProperty(He,"Lexer",{enumerable:!0,get:function(){return dY.Lexer}});Object.defineProperty(He,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return dY.LexerDefinitionErrorType}});var ku=nA();Object.defineProperty(He,"createToken",{enumerable:!0,get:function(){return ku.createToken}});Object.defineProperty(He,"createTokenInstance",{enumerable:!0,get:function(){return ku.createTokenInstance}});Object.defineProperty(He,"EOF",{enumerable:!0,get:function(){return ku.EOF}});Object.defineProperty(He,"tokenLabel",{enumerable:!0,get:function(){return ku.tokenLabel}});Object.defineProperty(He,"tokenMatcher",{enumerable:!0,get:function(){return ku.tokenMatcher}});Object.defineProperty(He,"tokenName",{enumerable:!0,get:function(){return ku.tokenName}});var ywe=Wh();Object.defineProperty(He,"defaultParserErrorProvider",{enumerable:!0,get:function(){return ywe.defaultParserErrorProvider}});var rp=vu();Object.defineProperty(He,"EarlyExitException",{enumerable:!0,get:function(){return rp.EarlyExitException}});Object.defineProperty(He,"isRecognitionException",{enumerable:!0,get:function(){return rp.isRecognitionException}});Object.defineProperty(He,"MismatchedTokenException",{enumerable:!0,get:function(){return rp.MismatchedTokenException}});Object.defineProperty(He,"NotAllInputParsedException",{enumerable:!0,get:function(){return rp.NotAllInputParsedException}});Object.defineProperty(He,"NoViableAltException",{enumerable:!0,get:function(){return rp.NoViableAltException}});var wwe=_v();Object.defineProperty(He,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return wwe.defaultLexerErrorProvider}});var ho=hn();Object.defineProperty(He,"Alternation",{enumerable:!0,get:function(){return ho.Alternation}});Object.defineProperty(He,"Alternative",{enumerable:!0,get:function(){return ho.Alternative}});Object.defineProperty(He,"NonTerminal",{enumerable:!0,get:function(){return ho.NonTerminal}});Object.defineProperty(He,"Option",{enumerable:!0,get:function(){return ho.Option}});Object.defineProperty(He,"Repetition",{enumerable:!0,get:function(){return ho.Repetition}});Object.defineProperty(He,"RepetitionMandatory",{enumerable:!0,get:function(){return ho.RepetitionMandatory}});Object.defineProperty(He,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionMandatoryWithSeparator}});Object.defineProperty(He,"RepetitionWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionWithSeparator}});Object.defineProperty(He,"Rule",{enumerable:!0,get:function(){return ho.Rule}});Object.defineProperty(He,"Terminal",{enumerable:!0,get:function(){return ho.Terminal}});var CY=hn();Object.defineProperty(He,"serializeGrammar",{enumerable:!0,get:function(){return CY.serializeGrammar}});Object.defineProperty(He,"serializeProduction",{enumerable:!0,get:function(){return CY.serializeProduction}});var Bwe=wu();Object.defineProperty(He,"GAstVisitor",{enumerable:!0,get:function(){return Bwe.GAstVisitor}});function Qwe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. - It performs no action other than printing this message. - Please avoid using it as it will be completely removed in the future`)}He.clearCache=Qwe;var bwe=pY();Object.defineProperty(He,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return bwe.createSyntaxDiagramsCode}});var vwe=function(){function t(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. -See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return t}();He.Parser=vwe});var yY=E((Trt,EY)=>{var qI=mY(),ca=qI.createToken,IY=qI.tokenMatcher,yS=qI.Lexer,Swe=qI.EmbeddedActionsParser;EY.exports=t=>{let e=ca({name:"LogicalOperator",pattern:yS.NA}),r=ca({name:"Or",pattern:/\|/,categories:e}),i=ca({name:"Xor",pattern:/\^/,categories:e}),n=ca({name:"And",pattern:/&/,categories:e}),s=ca({name:"Not",pattern:/!/}),o=ca({name:"LParen",pattern:/\(/}),a=ca({name:"RParen",pattern:/\)/}),l=ca({name:"Query",pattern:t}),u=[ca({name:"WhiteSpace",pattern:/\s+/,group:yS.SKIPPED}),r,i,n,o,a,s,e,l],g=new yS(u);class f extends Swe{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let m=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let I=m,B=this.CONSUME(e),b=this.SUBRULE2(this.atomicExpression);IY(B,r)?m=R=>I(R)||b(R):IY(B,i)?m=R=>!!(I(R)^b(R)):m=R=>I(R)&&b(R)}),m}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:d}=this.CONSUME(l);return m=>m(d)}},{ALT:()=>{this.CONSUME(s);let d=this.SUBRULE(this.atomicExpression);return m=>!d(m)}}])),this.RULE("parenthesisExpression",()=>{let d;return this.CONSUME(o),d=this.SUBRULE(this.expression),this.CONSUME(a),d}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var wY=E(JI=>{var xwe=yY();JI.makeParser=(t=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:r}=xwe(t),i=new r;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};JI.parse=JI.makeParser()});var QY=E((Ort,BY)=>{"use strict";BY.exports=(...t)=>[...new Set([].concat(...t))]});var wS=E((Krt,bY)=>{"use strict";var kwe=require("stream"),vY=kwe.PassThrough,Pwe=Array.prototype.slice;bY.exports=Dwe;function Dwe(){let t=[],e=!1,r=Pwe.call(arguments),i=r[r.length-1];i&&!Array.isArray(i)&&i.pipe==null?r.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=vY(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(WI,"__esModule",{value:!0});function Rwe(t){return t.reduce((e,r)=>[].concat(e,r),[])}WI.flatten=Rwe;function Fwe(t,e){let r=[[]],i=0;for(let n of t)e(n)?(i++,r[i]=[]):r[i].push(n);return r}WI.splitWhen=Fwe});var kY=E(BS=>{"use strict";Object.defineProperty(BS,"__esModule",{value:!0});function Nwe(t){return t.code==="ENOENT"}BS.isEnoentCodeError=Nwe});var DY=E(QS=>{"use strict";Object.defineProperty(QS,"__esModule",{value:!0});var PY=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Lwe(t,e){return new PY(t,e)}QS.createDirentFromStats=Lwe});var RY=E(Pu=>{"use strict";Object.defineProperty(Pu,"__esModule",{value:!0});var Twe=require("path"),Mwe=2,Owe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function Kwe(t){return t.replace(/\\/g,"/")}Pu.unixify=Kwe;function Uwe(t,e){return Twe.resolve(t,e)}Pu.makeAbsolute=Uwe;function Hwe(t){return t.replace(Owe,"\\$2")}Pu.escape=Hwe;function Gwe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(Mwe)}return t}Pu.removeLeadingDotSegment=Gwe});var NY=E((Yrt,FY)=>{FY.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var TY=E((qrt,LY)=>{var jwe=NY(),Ywe={"{":"}","(":")","[":"]"},qwe=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,Jwe=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;LY.exports=function(e,r){if(typeof e!="string"||e==="")return!1;if(jwe(e))return!0;var i=qwe,n;for(r&&r.strict===!1&&(i=Jwe);n=i.exec(e);){if(n[2])return!0;var s=n.index+n[0].length,o=n[1],a=o?Ywe[o]:null;if(o&&a){var l=e.indexOf(a,s);l!==-1&&(s=l+1)}e=e.slice(s)}return!1}});var OY=E((Jrt,MY)=>{"use strict";var Wwe=TY(),zwe=require("path").posix.dirname,Vwe=require("os").platform()==="win32",bS="/",_we=/\\/g,Xwe=/[\{\[].*[\}\]]$/,Zwe=/(^|[^\\])([\{\[]|\([^\)]+$)/,$we=/\\([\!\*\?\|\[\]\(\)\{\}])/g;MY.exports=function(e,r){var i=Object.assign({flipBackslashes:!0},r);i.flipBackslashes&&Vwe&&e.indexOf(bS)<0&&(e=e.replace(_we,bS)),Xwe.test(e)&&(e+=bS),e+="a";do e=zwe(e);while(Wwe(e)||Zwe.test(e));return e.replace($we,"$1")}});var WY=E(Hr=>{"use strict";Object.defineProperty(Hr,"__esModule",{value:!0});var eBe=require("path"),tBe=OY(),KY=Nn(),rBe=iv(),UY="**",iBe="\\",nBe=/[*?]|^!/,sBe=/\[.*]/,oBe=/(?:^|[^!*+?@])\(.*\|.*\)/,aBe=/[!*+?@]\(.*\)/,ABe=/{.*(?:,|\.\.).*}/;function GY(t,e={}){return!HY(t,e)}Hr.isStaticPattern=GY;function HY(t,e={}){return!!(e.caseSensitiveMatch===!1||t.includes(iBe)||nBe.test(t)||sBe.test(t)||oBe.test(t)||e.extglob!==!1&&aBe.test(t)||e.braceExpansion!==!1&&ABe.test(t))}Hr.isDynamicPattern=HY;function lBe(t){return zI(t)?t.slice(1):t}Hr.convertToPositivePattern=lBe;function cBe(t){return"!"+t}Hr.convertToNegativePattern=cBe;function zI(t){return t.startsWith("!")&&t[1]!=="("}Hr.isNegativePattern=zI;function jY(t){return!zI(t)}Hr.isPositivePattern=jY;function uBe(t){return t.filter(zI)}Hr.getNegativePatterns=uBe;function gBe(t){return t.filter(jY)}Hr.getPositivePatterns=gBe;function fBe(t){return tBe(t,{flipBackslashes:!1})}Hr.getBaseDirectory=fBe;function hBe(t){return t.includes(UY)}Hr.hasGlobStar=hBe;function YY(t){return t.endsWith("/"+UY)}Hr.endsWithSlashGlobStar=YY;function pBe(t){let e=eBe.basename(t);return YY(t)||GY(e)}Hr.isAffectDepthOfReadingPattern=pBe;function dBe(t){return t.reduce((e,r)=>e.concat(qY(r)),[])}Hr.expandPatternsWithBraceExpansion=dBe;function qY(t){return KY.braces(t,{expand:!0,nodupes:!0})}Hr.expandBraceExpansion=qY;function CBe(t,e){let r=rBe.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.parts.length===0?[t]:r.parts}Hr.getPatternParts=CBe;function JY(t,e){return KY.makeRe(t,e)}Hr.makeRe=JY;function mBe(t,e){return t.map(r=>JY(r,e))}Hr.convertPatternsToRe=mBe;function EBe(t,e){return e.some(r=>r.test(t))}Hr.matchAny=EBe});var VY=E(vS=>{"use strict";Object.defineProperty(vS,"__esModule",{value:!0});var IBe=wS();function yBe(t){let e=IBe(t);return t.forEach(r=>{r.once("error",i=>e.emit("error",i))}),e.once("close",()=>zY(t)),e.once("end",()=>zY(t)),e}vS.merge=yBe;function zY(t){t.forEach(e=>e.emit("close"))}});var _Y=E(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});function wBe(t){return typeof t=="string"}VI.isString=wBe;function BBe(t){return t===""}VI.isEmpty=BBe});var ga=E(ua=>{"use strict";Object.defineProperty(ua,"__esModule",{value:!0});var QBe=xY();ua.array=QBe;var bBe=kY();ua.errno=bBe;var vBe=DY();ua.fs=vBe;var SBe=RY();ua.path=SBe;var xBe=WY();ua.pattern=xBe;var kBe=VY();ua.stream=kBe;var PBe=_Y();ua.string=PBe});var tq=E(fa=>{"use strict";Object.defineProperty(fa,"__esModule",{value:!0});var Ll=ga();function DBe(t,e){let r=XY(t),i=ZY(t,e.ignore),n=r.filter(l=>Ll.pattern.isStaticPattern(l,e)),s=r.filter(l=>Ll.pattern.isDynamicPattern(l,e)),o=SS(n,i,!1),a=SS(s,i,!0);return o.concat(a)}fa.generate=DBe;function SS(t,e,r){let i=$Y(t);return"."in i?[xS(".",t,e,r)]:eq(i,e,r)}fa.convertPatternsToTasks=SS;function XY(t){return Ll.pattern.getPositivePatterns(t)}fa.getPositivePatterns=XY;function ZY(t,e){return Ll.pattern.getNegativePatterns(t).concat(e).map(Ll.pattern.convertToPositivePattern)}fa.getNegativePatternsAsPositive=ZY;function $Y(t){let e={};return t.reduce((r,i)=>{let n=Ll.pattern.getBaseDirectory(i);return n in r?r[n].push(i):r[n]=[i],r},e)}fa.groupPatternsByBaseDirectory=$Y;function eq(t,e,r){return Object.keys(t).map(i=>xS(i,t[i],e,r))}fa.convertPatternGroupsToTasks=eq;function xS(t,e,r,i){return{dynamic:i,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Ll.pattern.convertToNegativePattern))}}fa.convertPatternGroupToTask=xS});var iq=E(_I=>{"use strict";Object.defineProperty(_I,"__esModule",{value:!0});_I.read=void 0;function RBe(t,e,r){e.fs.lstat(t,(i,n)=>{if(i!==null){rq(r,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){kS(r,n);return}e.fs.stat(t,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){rq(r,s);return}kS(r,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),kS(r,o)})})}_I.read=RBe;function rq(t,e){t(e)}function kS(t,e){t(null,e)}});var nq=E(XI=>{"use strict";Object.defineProperty(XI,"__esModule",{value:!0});XI.read=void 0;function FBe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let i=e.fs.statSync(t);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw i}}XI.read=FBe});var sq=E(AA=>{"use strict";Object.defineProperty(AA,"__esModule",{value:!0});AA.createFileSystemAdapter=AA.FILE_SYSTEM_ADAPTER=void 0;var ZI=require("fs");AA.FILE_SYSTEM_ADAPTER={lstat:ZI.lstat,stat:ZI.stat,lstatSync:ZI.lstatSync,statSync:ZI.statSync};function NBe(t){return t===void 0?AA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},AA.FILE_SYSTEM_ADAPTER),t)}AA.createFileSystemAdapter=NBe});var aq=E(PS=>{"use strict";Object.defineProperty(PS,"__esModule",{value:!0});var LBe=sq(),oq=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=LBe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e!=null?e:r}};PS.default=oq});var Tl=E(lA=>{"use strict";Object.defineProperty(lA,"__esModule",{value:!0});lA.statSync=lA.stat=lA.Settings=void 0;var Aq=iq(),TBe=nq(),DS=aq();lA.Settings=DS.default;function MBe(t,e,r){if(typeof e=="function"){Aq.read(t,RS(),e);return}Aq.read(t,RS(e),r)}lA.stat=MBe;function OBe(t,e){let r=RS(e);return TBe.read(t,r)}lA.statSync=OBe;function RS(t={}){return t instanceof DS.default?t:new DS.default(t)}});var cq=E((iit,lq)=>{lq.exports=KBe;function KBe(t,e){var r,i,n,s=!0;Array.isArray(t)?(r=[],i=t.length):(n=Object.keys(t),r={},i=n.length);function o(l){function c(){e&&e(l,r),e=null}s?process.nextTick(c):c()}function a(l,c,u){r[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){t[l](function(c,u){a(l,c,u)})}):t.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var FS=E($I=>{"use strict";Object.defineProperty($I,"__esModule",{value:!0});$I.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var ey=process.versions.node.split(".");if(ey[0]===void 0||ey[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var uq=Number.parseInt(ey[0],10),UBe=Number.parseInt(ey[1],10),gq=10,HBe=10,GBe=uq>gq,jBe=uq===gq&&UBe>=HBe;$I.IS_SUPPORT_READDIR_WITH_FILE_TYPES=GBe||jBe});var hq=E(ty=>{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.createDirentFromStats=void 0;var fq=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function YBe(t,e){return new fq(t,e)}ty.createDirentFromStats=YBe});var NS=E(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.fs=void 0;var qBe=hq();ry.fs=qBe});var LS=E(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.joinPathSegments=void 0;function JBe(t,e,r){return t.endsWith(r)?t+e:t+r+e}iy.joinPathSegments=JBe});var Iq=E(cA=>{"use strict";Object.defineProperty(cA,"__esModule",{value:!0});cA.readdir=cA.readdirWithFileTypes=cA.read=void 0;var WBe=Tl(),pq=cq(),zBe=FS(),dq=NS(),Cq=LS();function VBe(t,e,r){if(!e.stats&&zBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){mq(t,e,r);return}Eq(t,e,r)}cA.read=VBe;function mq(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:Cq.joinPathSegments(t,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){TS(r,s);return}let o=s.map(a=>_Be(a,e));pq(o,(a,l)=>{if(a!==null){ny(r,a);return}TS(r,l)})})}cA.readdirWithFileTypes=mq;function _Be(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){r(i);return}r(null,t);return}t.dirent=dq.fs.createDirentFromStats(t.name,n),r(null,t)})}}function Eq(t,e,r){e.fs.readdir(t,(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(o=>{let a=Cq.joinPathSegments(t,o,e.pathSegmentSeparator);return l=>{WBe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:dq.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});pq(s,(o,a)=>{if(o!==null){ny(r,o);return}TS(r,a)})})}cA.readdir=Eq;function ny(t,e){t(e)}function TS(t,e){t(null,e)}});var bq=E(uA=>{"use strict";Object.defineProperty(uA,"__esModule",{value:!0});uA.readdir=uA.readdirWithFileTypes=uA.read=void 0;var XBe=Tl(),ZBe=FS(),yq=NS(),wq=LS();function $Be(t,e){return!e.stats&&ZBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Bq(t,e):Qq(t,e)}uA.read=$Be;function Bq(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:wq.joinPathSegments(t,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=yq.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}uA.readdirWithFileTypes=Bq;function Qq(t,e){return e.fs.readdirSync(t).map(i=>{let n=wq.joinPathSegments(t,i,e.pathSegmentSeparator),s=XBe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:yq.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}uA.readdir=Qq});var vq=E(gA=>{"use strict";Object.defineProperty(gA,"__esModule",{value:!0});gA.createFileSystemAdapter=gA.FILE_SYSTEM_ADAPTER=void 0;var Du=require("fs");gA.FILE_SYSTEM_ADAPTER={lstat:Du.lstat,stat:Du.stat,lstatSync:Du.lstatSync,statSync:Du.statSync,readdir:Du.readdir,readdirSync:Du.readdirSync};function e0e(t){return t===void 0?gA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},gA.FILE_SYSTEM_ADAPTER),t)}gA.createFileSystemAdapter=e0e});var xq=E(MS=>{"use strict";Object.defineProperty(MS,"__esModule",{value:!0});var t0e=require("path"),r0e=Tl(),i0e=vq(),Sq=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=i0e.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,t0e.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new r0e.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};MS.default=Sq});var sy=E(fA=>{"use strict";Object.defineProperty(fA,"__esModule",{value:!0});fA.Settings=fA.scandirSync=fA.scandir=void 0;var kq=Iq(),n0e=bq(),OS=xq();fA.Settings=OS.default;function s0e(t,e,r){if(typeof e=="function"){kq.read(t,KS(),e);return}kq.read(t,KS(e),r)}fA.scandir=s0e;function o0e(t,e){let r=KS(e);return n0e.read(t,r)}fA.scandirSync=o0e;function KS(t={}){return t instanceof OS.default?t:new OS.default(t)}});var Dq=E((fit,Pq)=>{"use strict";function a0e(t){var e=new t,r=e;function i(){var s=e;return s.next?e=s.next:(e=new t,r=e),s.next=null,s}function n(s){r.next=s,r=s}return{get:i,release:n}}Pq.exports=a0e});var Fq=E((hit,US)=>{"use strict";var A0e=Dq();function Rq(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var i=A0e(l0e),n=null,s=null,o=0,a=null,l={push:d,drain:po,saturated:po,pause:u,paused:!1,concurrency:r,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:m,empty:po,kill:B,killAndDrain:b,error:R};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,L=0;H;)H=H.next,L++;return L}function f(){for(var H=n,L=[];H;)L.push(H.value),H=H.next;return L}function h(){if(!!l.paused){l.paused=!1;for(var H=0;H{"use strict";Object.defineProperty(Co,"__esModule",{value:!0});Co.joinPathSegments=Co.replacePathSegmentSeparator=Co.isAppliedFilter=Co.isFatalError=void 0;function u0e(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}Co.isFatalError=u0e;function g0e(t,e){return t===null||t(e)}Co.isAppliedFilter=g0e;function f0e(t,e){return t.split(/[/\\]/).join(e)}Co.replacePathSegmentSeparator=f0e;function h0e(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}Co.joinPathSegments=h0e});var GS=E(HS=>{"use strict";Object.defineProperty(HS,"__esModule",{value:!0});var p0e=oy(),Nq=class{constructor(e,r){this._root=e,this._settings=r,this._root=p0e.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};HS.default=Nq});var YS=E(jS=>{"use strict";Object.defineProperty(jS,"__esModule",{value:!0});var d0e=require("events"),C0e=sy(),m0e=Fq(),ay=oy(),E0e=GS(),Lq=class extends E0e.default{constructor(e,r){super(e,r);this._settings=r,this._scandir=C0e.scandir,this._emitter=new d0e.EventEmitter,this._queue=m0e(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}get isDestroyed(){return this._isDestroyed}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,r){let i={directory:e,base:r};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){r(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!ay.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let i=e.path;r!==void 0&&(e.path=ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),ay.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};jS.default=Lq});var Mq=E(qS=>{"use strict";Object.defineProperty(qS,"__esModule",{value:!0});var I0e=YS(),Tq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new I0e.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{y0e(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{w0e(e,[...this._storage])}),this._reader.read()}};qS.default=Tq;function y0e(t,e){t(e)}function w0e(t,e){t(null,e)}});var Kq=E(JS=>{"use strict";Object.defineProperty(JS,"__esModule",{value:!0});var B0e=require("stream"),Q0e=YS(),Oq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Q0e.default(this._root,this._settings),this._stream=new B0e.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}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}};JS.default=Oq});var Hq=E(WS=>{"use strict";Object.defineProperty(WS,"__esModule",{value:!0});var b0e=sy(),Ay=oy(),v0e=GS(),Uq=class extends v0e.default{constructor(){super(...arguments);this._scandir=b0e.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,r)}catch(i){this._handleError(i)}}_handleError(e){if(!!Ay.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let i=e.path;r!==void 0&&(e.path=Ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Ay.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&Ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};WS.default=Uq});var jq=E(zS=>{"use strict";Object.defineProperty(zS,"__esModule",{value:!0});var S0e=Hq(),Gq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new S0e.default(this._root,this._settings)}read(){return this._reader.read()}};zS.default=Gq});var qq=E(VS=>{"use strict";Object.defineProperty(VS,"__esModule",{value:!0});var x0e=require("path"),k0e=sy(),Yq=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),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,x0e.sep),this.fsScandirSettings=new k0e.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};VS.default=Yq});var XS=E(mo=>{"use strict";Object.defineProperty(mo,"__esModule",{value:!0});mo.Settings=mo.walkStream=mo.walkSync=mo.walk=void 0;var Jq=Mq(),P0e=Kq(),D0e=jq(),_S=qq();mo.Settings=_S.default;function R0e(t,e,r){if(typeof e=="function"){new Jq.default(t,ly()).read(e);return}new Jq.default(t,ly(e)).read(r)}mo.walk=R0e;function F0e(t,e){let r=ly(e);return new D0e.default(t,r).read()}mo.walkSync=F0e;function N0e(t,e){let r=ly(e);return new P0e.default(t,r).read()}mo.walkStream=N0e;function ly(t={}){return t instanceof _S.default?t:new _S.default(t)}});var $S=E(ZS=>{"use strict";Object.defineProperty(ZS,"__esModule",{value:!0});var L0e=require("path"),T0e=Tl(),Wq=ga(),zq=class{constructor(e){this._settings=e,this._fsStatSettings=new T0e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return L0e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let i={name:r,path:r,dirent:Wq.fs.createDirentFromStats(r,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!Wq.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};ZS.default=zq});var tx=E(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var M0e=require("stream"),O0e=Tl(),K0e=XS(),U0e=$S(),Vq=class extends U0e.default{constructor(){super(...arguments);this._walkStream=K0e.walkStream,this._stat=O0e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let i=e.map(this._getFullEntryPath,this),n=new M0e.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],r).then(l=>{l!==null&&r.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,r)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((r,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?r(s):i(n))})}};ex.default=Vq});var Xq=E(rx=>{"use strict";Object.defineProperty(rx,"__esModule",{value:!0});var Ru=ga(),_q=class{constructor(e,r,i){this._patterns=e,this._settings=r,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Ru.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let i=this._getPatternSegments(r),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:r,segments:i,sections:n})}}_getPatternSegments(e){return Ru.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Ru.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Ru.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Ru.array.splitWhen(e,r=>r.dynamic&&Ru.pattern.hasGlobStar(r.pattern))}};rx.default=_q});var $q=E(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var H0e=Xq(),Zq=class extends H0e.default{match(e){let r=e.split("/"),i=r.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||r.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};ix.default=Zq});var tJ=E(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var cy=ga(),G0e=$q(),eJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,i){let n=this._getMatcher(r),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new G0e.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(cy.pattern.isAffectDepthOfReadingPattern);return cy.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,i,n){let s=this._getEntryLevel(e,r.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(r))return!1;let o=cy.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,r){let i=e.split("/").length;return r.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!cy.pattern.matchAny(e,r)}};nx.default=eJ});var iJ=E(sx=>{"use strict";Object.defineProperty(sx,"__esModule",{value:!0});var ip=ga(),rJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let i=ip.pattern.convertPatternsToRe(e,this._micromatchOptions),n=ip.pattern.convertPatternsToRe(r,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,r,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,r)&&!this._isMatchToPatterns(e.path,i)}_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,r){if(!this._settings.absolute)return!1;let i=ip.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,r)}_isMatchToPatterns(e,r){let i=ip.path.removeLeadingDotSegment(e);return ip.pattern.matchAny(i,r)}};sx.default=rJ});var sJ=E(ox=>{"use strict";Object.defineProperty(ox,"__esModule",{value:!0});var j0e=ga(),nJ=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return j0e.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};ox.default=nJ});var AJ=E(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var oJ=ga(),aJ=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=oJ.path.makeAbsolute(this._settings.cwd,r),r=oJ.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};ax.default=aJ});var uy=E(Ax=>{"use strict";Object.defineProperty(Ax,"__esModule",{value:!0});var Y0e=require("path"),q0e=tJ(),J0e=iJ(),W0e=sJ(),z0e=AJ(),lJ=class{constructor(e){this._settings=e,this.errorFilter=new W0e.default(this._settings),this.entryFilter=new J0e.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new q0e.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new z0e.default(this._settings)}_getRootDirectory(e){return Y0e.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,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}}};Ax.default=lJ});var uJ=E(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var V0e=tx(),_0e=uy(),cJ=class extends _0e.default{constructor(){super(...arguments);this._reader=new V0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(r,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};lx.default=cJ});var fJ=E(cx=>{"use strict";Object.defineProperty(cx,"__esModule",{value:!0});var X0e=require("stream"),Z0e=tx(),$0e=uy(),gJ=class extends $0e.default{constructor(){super(...arguments);this._reader=new Z0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(r,e,i),s=new X0e.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};cx.default=gJ});var pJ=E(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var eQe=Tl(),tQe=XS(),rQe=$S(),hJ=class extends rQe.default{constructor(){super(...arguments);this._walkSync=tQe.walkSync,this._statSync=eQe.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,r);o===null||!r.entryFilter(o)||i.push(o)}return i}_getEntry(e,r,i){try{let n=this._getStat(e);return this._makeEntry(n,r)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};ux.default=hJ});var CJ=E(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var iQe=pJ(),nQe=uy(),dJ=class extends nQe.default{constructor(){super(...arguments);this._reader=new iQe.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(r,e,i).map(i.transform)}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};gx.default=dJ});var EJ=E(np=>{"use strict";Object.defineProperty(np,"__esModule",{value:!0});var Fu=require("fs"),sQe=require("os"),oQe=sQe.cpus().length;np.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Fu.lstat,lstatSync:Fu.lstatSync,stat:Fu.stat,statSync:Fu.statSync,readdir:Fu.readdir,readdirSync:Fu.readdirSync};var mJ=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,oQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),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,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},np.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};np.default=mJ});var gy=E((Oit,IJ)=>{"use strict";var yJ=tq(),aQe=uJ(),AQe=fJ(),lQe=CJ(),fx=EJ(),Ml=ga();async function px(t,e){Nu(t);let r=hx(t,aQe.default,e),i=await Promise.all(r);return Ml.array.flatten(i)}(function(t){function e(o,a){Nu(o);let l=hx(o,lQe.default,a);return Ml.array.flatten(l)}t.sync=e;function r(o,a){Nu(o);let l=hx(o,AQe.default,a);return Ml.stream.merge(l)}t.stream=r;function i(o,a){Nu(o);let l=[].concat(o),c=new fx.default(a);return yJ.generate(l,c)}t.generateTasks=i;function n(o,a){Nu(o);let l=new fx.default(a);return Ml.pattern.isDynamicPattern(o,l)}t.isDynamicPattern=n;function s(o){return Nu(o),Ml.path.escape(o)}t.escapePath=s})(px||(px={}));function hx(t,e,r){let i=[].concat(t),n=new fx.default(r),s=yJ.generate(i,n),o=new e(n);return s.map(o.read,o)}function Nu(t){if(![].concat(t).every(i=>Ml.string.isString(i)&&!Ml.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}IJ.exports=px});var BJ=E(Ol=>{"use strict";var{promisify:cQe}=require("util"),wJ=require("fs");async function dx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await cQe(wJ[t])(r))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Cx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return wJ[t](r)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Ol.isFile=dx.bind(null,"stat","isFile");Ol.isDirectory=dx.bind(null,"stat","isDirectory");Ol.isSymlink=dx.bind(null,"lstat","isSymbolicLink");Ol.isFileSync=Cx.bind(null,"statSync","isFile");Ol.isDirectorySync=Cx.bind(null,"statSync","isDirectory");Ol.isSymlinkSync=Cx.bind(null,"lstatSync","isSymbolicLink")});var xJ=E((Uit,mx)=>{"use strict";var Kl=require("path"),QJ=BJ(),bJ=t=>t.length>1?`{${t.join(",")}}`:t[0],vJ=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return Kl.isAbsolute(r)?r:Kl.join(e,r)},uQe=(t,e)=>Kl.extname(t)?`**/${t}`:`**/${t}.${bJ(e)}`,SJ=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>Kl.posix.join(t,uQe(r,e.extensions))):e.files?e.files.map(r=>Kl.posix.join(t,`**/${r}`)):e.extensions?[Kl.posix.join(t,`**/*.${bJ(e.extensions)}`)]:[Kl.posix.join(t,"**")]};mx.exports=async(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async i=>await QJ.isDirectory(vJ(i,e.cwd))?SJ(i,e):i));return[].concat.apply([],r)};mx.exports.sync=(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(i=>QJ.isDirectorySync(vJ(i,e.cwd))?SJ(i,e):i);return[].concat.apply([],r)}});var TJ=E((Hit,kJ)=>{function PJ(t){return Array.isArray(t)?t:[t]}var gQe=/^\s+$/,fQe=/^\\!/,hQe=/^\\#/,pQe=/\r?\n/g,dQe=/^\.*\/|^\.+$/,Ex="/",DJ=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",CQe=(t,e,r)=>Object.defineProperty(t,e,{value:r}),mQe=/([0-z])-([0-z])/g,EQe=t=>t.replace(mQe,(e,r,i)=>r.charCodeAt(0)<=i.charCodeAt(0)?e:""),IQe=[[/\\?\s+$/,t=>t.indexOf("\\")===0?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,t=>`\\${t}`],[/\[([^\]/]*)($|\])/g,(t,e,r)=>r==="]"?`[${EQe(e)}]`:`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`],[/\\\\\\/g,()=>"\\"]],RJ=Object.create(null),yQe=(t,e,r)=>{let i=RJ[t];if(i)return i;let n=IQe.reduce((s,o)=>s.replace(o[0],o[1].bind(t)),t);return RJ[t]=r?new RegExp(n,"i"):new RegExp(n)},Ix=t=>typeof t=="string",wQe=t=>t&&Ix(t)&&!gQe.test(t)&&t.indexOf("#")!==0,BQe=t=>t.split(pQe),FJ=class{constructor(e,r,i,n){this.origin=e,this.pattern=r,this.negative=i,this.regex=n}},QQe=(t,e)=>{let r=t,i=!1;t.indexOf("!")===0&&(i=!0,t=t.substr(1)),t=t.replace(fQe,"!").replace(hQe,"#");let n=yQe(t,i,e);return new FJ(r,t,i,n)},bQe=(t,e)=>{throw new e(t)},ha=(t,e,r)=>Ix(t)?t?ha.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),NJ=t=>dQe.test(t);ha.isNotRelative=NJ;ha.convert=t=>t;var LJ=class{constructor({ignorecase:e=!0}={}){this._rules=[],this._ignorecase=e,CQe(this,DJ,!0),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[DJ]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(wQe(e)){let r=QQe(e,this._ignorecase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,PJ(Ix(e)?BQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!r)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,r,i,n){let s=e&&ha.convert(e);return ha(s,e,bQe),this._t(s,r,i,n)}_t(e,r,i,n){if(e in r)return r[e];if(n||(n=e.split(Ex)),n.pop(),!n.length)return r[e]=this._testOne(e,i);let s=this._t(n.join(Ex)+Ex,r,i,n);return r[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return PJ(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},fy=t=>new LJ(t),vQe=()=>!1,SQe=t=>ha(t&&ha.convert(t),t,vQe);fy.isPathValid=SQe;fy.default=fy;kJ.exports=fy;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");ha.convert=t;let e=/^[a-z]:\//i;ha.isNotRelative=r=>e.test(r)||NJ(r)}});var OJ=E((Git,MJ)=>{"use strict";MJ.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var qJ=E((jit,yx)=>{"use strict";var{promisify:xQe}=require("util"),KJ=require("fs"),pa=require("path"),UJ=gy(),kQe=TJ(),sp=OJ(),HJ=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],PQe=xQe(KJ.readFile),DQe=t=>e=>e.startsWith("!")?"!"+pa.posix.join(t,e.slice(1)):pa.posix.join(t,e),RQe=(t,e)=>{let r=sp(pa.relative(e.cwd,pa.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(DQe(r))},GJ=t=>{let e=kQe();for(let r of t)e.add(RQe(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},FQe=(t,e)=>{if(t=sp(t),pa.isAbsolute(e)){if(sp(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return pa.join(t,e)},jJ=(t,e)=>r=>t.ignores(sp(pa.relative(e,FQe(e,r.path||r)))),NQe=async(t,e)=>{let r=pa.join(e,t),i=await PQe(r,"utf8");return{cwd:e,filePath:r,content:i}},LQe=(t,e)=>{let r=pa.join(e,t),i=KJ.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:i}},YJ=({ignore:t=[],cwd:e=sp(process.cwd())}={})=>({ignore:t,cwd:e});yx.exports=async t=>{t=YJ(t);let e=await UJ("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(n=>NQe(n,t.cwd))),i=GJ(r);return jJ(i,t.cwd)};yx.exports.sync=t=>{t=YJ(t);let r=UJ.sync("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}).map(n=>LQe(n,t.cwd)),i=GJ(r);return jJ(i,t.cwd)}});var VJ=E((Yit,JJ)=>{"use strict";var{Transform:TQe}=require("stream"),wx=class extends TQe{constructor(){super({objectMode:!0})}},WJ=class extends wx{constructor(e){super();this._filter=e}_transform(e,r,i){this._filter(e)&&this.push(e),i()}},zJ=class extends wx{constructor(){super();this._pushed=new Set}_transform(e,r,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};JJ.exports={FilterStream:WJ,UniqueStream:zJ}});var vx=E((qit,Ul)=>{"use strict";var _J=require("fs"),hy=QY(),MQe=wS(),py=gy(),dy=xJ(),Bx=qJ(),{FilterStream:OQe,UniqueStream:KQe}=VJ(),XJ=()=>!1,ZJ=t=>t[0]==="!",UQe=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},HQe=(t={})=>{if(!t.cwd)return;let e;try{e=_J.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},GQe=t=>t.stats instanceof _J.Stats?t.path:t,Cy=(t,e)=>{t=hy([].concat(t)),UQe(t),HQe(e);let r=[];e=P({ignore:[],expandDirectories:!0},e);for(let[i,n]of t.entries()){if(ZJ(n))continue;let s=t.slice(i).filter(a=>ZJ(a)).map(a=>a.slice(1)),o=_(P({},e),{ignore:e.ignore.concat(s)});r.push({pattern:n,options:o})}return r},jQe=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r=_(P({},r),{files:t.options.expandDirectories}):typeof t.options.expandDirectories=="object"&&(r=P(P({},r),t.options.expandDirectories)),e(t.pattern,r)},Qx=(t,e)=>t.options.expandDirectories?jQe(t,e):[t.pattern],$J=t=>t&&t.gitignore?Bx.sync({cwd:t.cwd,ignore:t.ignore}):XJ,bx=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=dy.sync(r.ignore)),{pattern:e,options:r}};Ul.exports=async(t,e)=>{let r=Cy(t,e),i=async()=>e&&e.gitignore?Bx({cwd:e.cwd,ignore:e.ignore}):XJ,n=async()=>{let l=await Promise.all(r.map(async c=>{let u=await Qx(c,dy);return Promise.all(u.map(bx(c)))}));return hy(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>py(l.pattern,l.options)));return hy(...a).filter(l=>!s(GQe(l)))};Ul.exports.sync=(t,e)=>{let r=Cy(t,e),i=[];for(let o of r){let a=Qx(o,dy.sync).map(bx(o));i.push(...a)}let n=$J(e),s=[];for(let o of i)s=hy(s,py.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Ul.exports.stream=(t,e)=>{let r=Cy(t,e),i=[];for(let a of r){let l=Qx(a,dy.sync).map(bx(a));i.push(...l)}let n=$J(e),s=new OQe(a=>!n(a)),o=new KQe;return MQe(i.map(a=>py.stream(a.pattern,a.options))).pipe(s).pipe(o)};Ul.exports.generateGlobTasks=Cy;Ul.exports.hasMagic=(t,e)=>[].concat(t).some(r=>py.isDynamicPattern(r,e));Ul.exports.gitignore=Bx});var Ca=E((da,Dy)=>{"use strict";Object.defineProperty(da,"__esModule",{value:!0});var A3=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function ibe(t){return A3.includes(t)}var nbe=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...A3];function sbe(t){return nbe.includes(t)}var obe=["null","undefined","string","number","bigint","boolean","symbol"];function abe(t){return obe.includes(t)}function Hu(t){return e=>typeof e===t}var{toString:l3}=Object.prototype,mp=t=>{let e=l3.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&j.domElement(t))return"HTMLElement";if(sbe(e))return e},er=t=>e=>mp(e)===t;function j(t){if(t===null)return"null";switch(typeof t){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";default:}if(j.observable(t))return"Observable";if(j.array(t))return"Array";if(j.buffer(t))return"Buffer";let e=mp(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}j.undefined=Hu("undefined");j.string=Hu("string");var Abe=Hu("number");j.number=t=>Abe(t)&&!j.nan(t);j.bigint=Hu("bigint");j.function_=Hu("function");j.null_=t=>t===null;j.class_=t=>j.function_(t)&&t.toString().startsWith("class ");j.boolean=t=>t===!0||t===!1;j.symbol=Hu("symbol");j.numericString=t=>j.string(t)&&!j.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));j.array=(t,e)=>Array.isArray(t)?j.function_(e)?t.every(e):!0:!1;j.buffer=t=>{var e,r,i,n;return(n=(i=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||i===void 0?void 0:i.call(r,t))!==null&&n!==void 0?n:!1};j.nullOrUndefined=t=>j.null_(t)||j.undefined(t);j.object=t=>!j.null_(t)&&(typeof t=="object"||j.function_(t));j.iterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};j.asyncIterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};j.generator=t=>j.iterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.asyncGenerator=t=>j.asyncIterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.nativePromise=t=>er("Promise")(t);var lbe=t=>{var e,r;return j.function_((e=t)===null||e===void 0?void 0:e.then)&&j.function_((r=t)===null||r===void 0?void 0:r.catch)};j.promise=t=>j.nativePromise(t)||lbe(t);j.generatorFunction=er("GeneratorFunction");j.asyncGeneratorFunction=t=>mp(t)==="AsyncGeneratorFunction";j.asyncFunction=t=>mp(t)==="AsyncFunction";j.boundFunction=t=>j.function_(t)&&!t.hasOwnProperty("prototype");j.regExp=er("RegExp");j.date=er("Date");j.error=er("Error");j.map=t=>er("Map")(t);j.set=t=>er("Set")(t);j.weakMap=t=>er("WeakMap")(t);j.weakSet=t=>er("WeakSet")(t);j.int8Array=er("Int8Array");j.uint8Array=er("Uint8Array");j.uint8ClampedArray=er("Uint8ClampedArray");j.int16Array=er("Int16Array");j.uint16Array=er("Uint16Array");j.int32Array=er("Int32Array");j.uint32Array=er("Uint32Array");j.float32Array=er("Float32Array");j.float64Array=er("Float64Array");j.bigInt64Array=er("BigInt64Array");j.bigUint64Array=er("BigUint64Array");j.arrayBuffer=er("ArrayBuffer");j.sharedArrayBuffer=er("SharedArrayBuffer");j.dataView=er("DataView");j.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;j.urlInstance=t=>er("URL")(t);j.urlString=t=>{if(!j.string(t))return!1;try{return new URL(t),!0}catch(e){return!1}};j.truthy=t=>Boolean(t);j.falsy=t=>!t;j.nan=t=>Number.isNaN(t);j.primitive=t=>j.null_(t)||abe(typeof t);j.integer=t=>Number.isInteger(t);j.safeInteger=t=>Number.isSafeInteger(t);j.plainObject=t=>{if(l3.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};j.typedArray=t=>ibe(mp(t));var cbe=t=>j.safeInteger(t)&&t>=0;j.arrayLike=t=>!j.nullOrUndefined(t)&&!j.function_(t)&&cbe(t.length);j.inRange=(t,e)=>{if(j.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(j.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var ube=1,gbe=["innerHTML","ownerDocument","style","attributes","nodeValue"];j.domElement=t=>j.object(t)&&t.nodeType===ube&&j.string(t.nodeName)&&!j.plainObject(t)&&gbe.every(e=>e in t);j.observable=t=>{var e,r,i,n;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((n=(i=t)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};j.nodeStream=t=>j.object(t)&&j.function_(t.pipe)&&!j.observable(t);j.infinite=t=>t===Infinity||t===-Infinity;var c3=t=>e=>j.integer(e)&&Math.abs(e%2)===t;j.evenInteger=c3(0);j.oddInteger=c3(1);j.emptyArray=t=>j.array(t)&&t.length===0;j.nonEmptyArray=t=>j.array(t)&&t.length>0;j.emptyString=t=>j.string(t)&&t.length===0;j.nonEmptyString=t=>j.string(t)&&t.length>0;var fbe=t=>j.string(t)&&!/\S/.test(t);j.emptyStringOrWhitespace=t=>j.emptyString(t)||fbe(t);j.emptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length===0;j.nonEmptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length>0;j.emptySet=t=>j.set(t)&&t.size===0;j.nonEmptySet=t=>j.set(t)&&t.size>0;j.emptyMap=t=>j.map(t)&&t.size===0;j.nonEmptyMap=t=>j.map(t)&&t.size>0;j.propertyKey=t=>j.any([j.string,j.number,j.symbol],t);j.formData=t=>er("FormData")(t);j.urlSearchParams=t=>er("URLSearchParams")(t);var u3=(t,e,r)=>{if(!j.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};j.any=(t,...e)=>(j.array(t)?t:[t]).some(i=>u3(Array.prototype.some,i,e));j.all=(t,...e)=>u3(Array.prototype.every,t,e);var Te=(t,e,r,i={})=>{if(!t){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(r.map(o=>`\`${j(o)}\``))].join(", ")}`:`received value of type \`${j(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};da.assert={undefined:t=>Te(j.undefined(t),"undefined",t),string:t=>Te(j.string(t),"string",t),number:t=>Te(j.number(t),"number",t),bigint:t=>Te(j.bigint(t),"bigint",t),function_:t=>Te(j.function_(t),"Function",t),null_:t=>Te(j.null_(t),"null",t),class_:t=>Te(j.class_(t),"Class",t),boolean:t=>Te(j.boolean(t),"boolean",t),symbol:t=>Te(j.symbol(t),"symbol",t),numericString:t=>Te(j.numericString(t),"string with a number",t),array:(t,e)=>{Te(j.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Te(j.buffer(t),"Buffer",t),nullOrUndefined:t=>Te(j.nullOrUndefined(t),"null or undefined",t),object:t=>Te(j.object(t),"Object",t),iterable:t=>Te(j.iterable(t),"Iterable",t),asyncIterable:t=>Te(j.asyncIterable(t),"AsyncIterable",t),generator:t=>Te(j.generator(t),"Generator",t),asyncGenerator:t=>Te(j.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Te(j.nativePromise(t),"native Promise",t),promise:t=>Te(j.promise(t),"Promise",t),generatorFunction:t=>Te(j.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Te(j.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Te(j.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Te(j.boundFunction(t),"Function",t),regExp:t=>Te(j.regExp(t),"RegExp",t),date:t=>Te(j.date(t),"Date",t),error:t=>Te(j.error(t),"Error",t),map:t=>Te(j.map(t),"Map",t),set:t=>Te(j.set(t),"Set",t),weakMap:t=>Te(j.weakMap(t),"WeakMap",t),weakSet:t=>Te(j.weakSet(t),"WeakSet",t),int8Array:t=>Te(j.int8Array(t),"Int8Array",t),uint8Array:t=>Te(j.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Te(j.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Te(j.int16Array(t),"Int16Array",t),uint16Array:t=>Te(j.uint16Array(t),"Uint16Array",t),int32Array:t=>Te(j.int32Array(t),"Int32Array",t),uint32Array:t=>Te(j.uint32Array(t),"Uint32Array",t),float32Array:t=>Te(j.float32Array(t),"Float32Array",t),float64Array:t=>Te(j.float64Array(t),"Float64Array",t),bigInt64Array:t=>Te(j.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Te(j.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Te(j.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Te(j.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Te(j.dataView(t),"DataView",t),urlInstance:t=>Te(j.urlInstance(t),"URL",t),urlString:t=>Te(j.urlString(t),"string with a URL",t),truthy:t=>Te(j.truthy(t),"truthy",t),falsy:t=>Te(j.falsy(t),"falsy",t),nan:t=>Te(j.nan(t),"NaN",t),primitive:t=>Te(j.primitive(t),"primitive",t),integer:t=>Te(j.integer(t),"integer",t),safeInteger:t=>Te(j.safeInteger(t),"integer",t),plainObject:t=>Te(j.plainObject(t),"plain object",t),typedArray:t=>Te(j.typedArray(t),"TypedArray",t),arrayLike:t=>Te(j.arrayLike(t),"array-like",t),domElement:t=>Te(j.domElement(t),"HTMLElement",t),observable:t=>Te(j.observable(t),"Observable",t),nodeStream:t=>Te(j.nodeStream(t),"Node.js Stream",t),infinite:t=>Te(j.infinite(t),"infinite number",t),emptyArray:t=>Te(j.emptyArray(t),"empty array",t),nonEmptyArray:t=>Te(j.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Te(j.emptyString(t),"empty string",t),nonEmptyString:t=>Te(j.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Te(j.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Te(j.emptyObject(t),"empty object",t),nonEmptyObject:t=>Te(j.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Te(j.emptySet(t),"empty set",t),nonEmptySet:t=>Te(j.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Te(j.emptyMap(t),"empty map",t),nonEmptyMap:t=>Te(j.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Te(j.propertyKey(t),"PropertyKey",t),formData:t=>Te(j.formData(t),"FormData",t),urlSearchParams:t=>Te(j.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Te(j.evenInteger(t),"even integer",t),oddInteger:t=>Te(j.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Te(j.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Te(j.inRange(t,e),"in range",t),any:(t,...e)=>Te(j.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Te(j.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(j,{class:{value:j.class_},function:{value:j.function_},null:{value:j.null_}});Object.defineProperties(da.assert,{class:{value:da.assert.class_},function:{value:da.assert.function_},null:{value:da.assert.null_}});da.default=j;Dy.exports=j;Dy.exports.default=j;Dy.exports.assert=da.assert});var g3=E((gnt,Ux)=>{"use strict";var Hx=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},Ep=class{static fn(e){return(...r)=>new Ep((i,n,s)=>{r.push(s),e(...r).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,i)=>{this._reject=i;let n=a=>{this._isPending=!1,r(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,r){return this._promise.then(e,r)}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(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Hx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Ep.prototype,Promise.prototype);Ux.exports=Ep;Ux.exports.CancelError=Hx});var f3=E((Gx,jx)=>{"use strict";Object.defineProperty(Gx,"__esModule",{value:!0});var hbe=require("tls"),Yx=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let i=typeof r.connect=="function",n=typeof r.secureConnect=="function",s=typeof r.close=="function",o=()=>{i&&r.connect(),t instanceof hbe.TLSSocket&&n&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),s&&t.once("close",r.close)};t.writable&&!t.connecting?o():t.connecting?t.once("connect",o):t.destroyed&&s&&r.close(t._hadError)};Gx.default=Yx;jx.exports=Yx;jx.exports.default=Yx});var h3=E((qx,Jx)=>{"use strict";Object.defineProperty(qx,"__esModule",{value:!0});var pbe=f3(),dbe=Number(process.versions.node.split(".")[0]),Wx=t=>{let e={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}};t.timings=e;let r=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||dbe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),pbe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?i(t.socket):t.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?n():t.prependOnceListener("finish",n),t.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,r(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};qx.default=Wx;Jx.exports=Wx;Jx.exports.default=Wx});var y3=E((fnt,zx)=>{"use strict";var{V4MAPPED:Cbe,ADDRCONFIG:mbe,ALL:p3,promises:{Resolver:d3},lookup:Ebe}=require("dns"),{promisify:Vx}=require("util"),Ibe=require("os"),Gu=Symbol("cacheableLookupCreateConnection"),_x=Symbol("cacheableLookupInstance"),C3=Symbol("expires"),ybe=typeof p3=="number",m3=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},wbe=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},E3=()=>{let t=!1,e=!1;for(let r of Object.values(Ibe.networkInterfaces()))for(let i of r)if(!i.internal&&(i.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Bbe=t=>Symbol.iterator in t,I3={ttl:!0},Qbe={all:!0},Xx=class{constructor({cache:e=new Map,maxTtl:r=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new d3,lookup:o=Ebe}={}){if(this.maxTtl=r,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Vx(o),this._resolver instanceof d3?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Vx(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Vx(this._resolver.resolve6.bind(this._resolver))),this._iface=E3(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.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,r,i){if(typeof r=="function"?(i=r,r={}):typeof r=="number"&&(r={family:r}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(n=>{r.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let i=await this.query(e);if(r.family===6){let n=i.filter(s=>s.family===6);r.hints&Cbe&&(ybe&&r.hints&p3||n.length===0)?wbe(i):i=n}else r.family===4&&(i=i.filter(n=>n.family===4));if(r.hints&mbe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return r.all?i:i[0]}async query(e){let r=await this._cache.get(e);if(!r){let i=this._pending[e];if(i)r=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,r=await n}}return r=r.map(i=>P({},i)),r}async _resolve(e){let r=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,I3),this._resolve6(e,I3)].map(c=>r(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(r){return{entries:[],cacheTtl:0}}}async _set(e,r,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,r[C3]=Date.now()+i;try{await this._cache.set(e,r,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Bbe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Qbe);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let i=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,i),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[C3];n>=a?this._cache.delete(s):a("lookup"in r||(r.lookup=this.lookup),e[Gu](r,i))}uninstall(e){if(m3(e),e[Gu]){if(e[_x]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Gu],delete e[Gu],delete e[_x]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=E3(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};zx.exports=Xx;zx.exports.default=Xx});var Q3=E((hnt,Zx)=>{"use strict";var bbe=typeof URL=="undefined"?require("url").URL:URL,vbe="text/plain",Sbe="us-ascii",w3=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),xbe=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let i=r[1].split(";"),n=r[2],s=e?"":r[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Sbe)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==vbe)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},B3=(t,e)=>{if(e=P({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return xbe(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new bbe(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];w3(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])w3(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};Zx.exports=B3;Zx.exports.default=B3});var S3=E((pnt,b3)=>{b3.exports=v3;function v3(t,e){if(t&&e)return v3(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){r[i]=t[i]}),r;function r(){for(var i=new Array(arguments.length),n=0;n{var x3=S3();$x.exports=x3(Ry);$x.exports.strict=x3(k3);Ry.proto=Ry(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return Ry(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return k3(this)},configurable:!0})});function Ry(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function k3(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var tk=E((Cnt,P3)=>{var kbe=ek(),Pbe=function(){},Dbe=function(t){return t.setHeader&&typeof t.abort=="function"},Rbe=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},D3=function(t,e,r){if(typeof e=="function")return D3(t,null,e);e||(e={}),r=kbe(r||Pbe);var i=t._writableState,n=t._readableState,s=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,a=function(){t.writable||l()},l=function(){o=!1,s||r.call(t)},c=function(){s=!1,o||r.call(t)},u=function(p){r.call(t,p?new Error("exited with error code: "+p):null)},g=function(p){r.call(t,p)},f=function(){if(s&&!(n&&n.ended))return r.call(t,new Error("premature close"));if(o&&!(i&&i.ended))return r.call(t,new Error("premature close"))},h=function(){t.req.on("finish",l)};return Dbe(t)?(t.on("complete",l),t.on("abort",f),t.req?h():t.on("request",h)):o&&!i&&(t.on("end",a),t.on("close",a)),Rbe(t)&&t.on("exit",u),t.on("end",c),t.on("finish",l),e.error!==!1&&t.on("error",g),t.on("close",f),function(){t.removeListener("complete",l),t.removeListener("abort",f),t.removeListener("request",h),t.req&&t.req.removeListener("finish",l),t.removeListener("end",a),t.removeListener("close",a),t.removeListener("finish",l),t.removeListener("exit",u),t.removeListener("end",c),t.removeListener("error",g),t.removeListener("close",f)}};P3.exports=D3});var N3=E((mnt,R3)=>{var Fbe=ek(),Nbe=tk(),rk=require("fs"),Ip=function(){},Lbe=/^v?\.0/.test(process.version),Fy=function(t){return typeof t=="function"},Tbe=function(t){return!Lbe||!rk?!1:(t instanceof(rk.ReadStream||Ip)||t instanceof(rk.WriteStream||Ip))&&Fy(t.close)},Mbe=function(t){return t.setHeader&&Fy(t.abort)},Obe=function(t,e,r,i){i=Fbe(i);var n=!1;t.on("close",function(){n=!0}),Nbe(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Tbe(t))return t.close(Ip);if(Mbe(t))return t.abort();if(Fy(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},F3=function(t){t()},Kbe=function(t,e){return t.pipe(e)},Ube=function(){var t=Array.prototype.slice.call(arguments),e=Fy(t[t.length-1]||Ip)&&t.pop()||Ip;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,i=t.map(function(n,s){var o=s0;return Obe(n,o,a,function(l){r||(r=l),l&&i.forEach(F3),!o&&(i.forEach(F3),e(r))})});return t.reduce(Kbe)};R3.exports=Ube});var T3=E((Ent,L3)=>{"use strict";var{PassThrough:Hbe}=require("stream");L3.exports=t=>{t=P({},t);let{array:e}=t,{encoding:r}=t,i=r==="buffer",n=!1;e?n=!(r||i):r=r||"utf8",i&&(r=null);let s=new Hbe({objectMode:n});r&&s.setEncoding(r);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var M3=E((Int,ju)=>{"use strict";var Gbe=N3(),jbe=T3(),ik=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Ny(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=P({maxBuffer:Infinity},e);let{maxBuffer:r}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=Gbe(t,jbe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>r&&o(new ik)})}),i.getBufferedValue()}ju.exports=Ny;ju.exports.default=Ny;ju.exports.buffer=(t,e)=>Ny(t,_(P({},e),{encoding:"buffer"}));ju.exports.array=(t,e)=>Ny(t,_(P({},e),{array:!0}));ju.exports.MaxBufferError=ik});var K3=E((wnt,O3)=>{"use strict";var Ybe=[200,203,204,206,300,301,404,405,410,414,501],qbe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],Jbe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},Wbe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function nk(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let i of r){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function zbe(t){let e=[];for(let r in t){let i=t[r];e.push(i===!0?r:r+"="+i)}if(!!e.length)return e.join(", ")}O3.exports=class{constructor(e,r,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=nk(r.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=r.headers.vary?e.headers:null,this._reqcc=nk(e.headers["cache-control"]),o&&"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":zbe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!r.headers["cache-control"]&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&qbe.indexOf(this._status)!==-1&&!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"]||Ybe.indexOf(this._status)!==-1))}_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);let r=nk(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&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;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of r)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let i in e)Jbe[i]||(r[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete r[n]}if(r.warning){let i=r.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?r.warning=i.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let r=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||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);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(r-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}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||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,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);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let n=r["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?r["if-none-match"]=n.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),!r||!r.headers)throw Error("Response headers missing");let i=!1;if(r.status!==void 0&&r.status!=304?i=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in r.headers&&!Wbe[o]?r.headers[o]:this._resHeaders[o];let s=Object.assign({},r,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var Ly=E((Bnt,U3)=>{"use strict";U3.exports=t=>{let e={};for(let[r,i]of Object.entries(t))e[r.toLowerCase()]=i;return e}});var j3=E((Qnt,H3)=>{"use strict";var Vbe=require("stream").Readable,_be=Ly(),G3=class extends Vbe{constructor(e,r,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=_be(r),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};H3.exports=G3});var q3=E((bnt,Y3)=>{"use strict";var Xbe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];Y3.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Xbe));for(let i of r)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var W3=E((vnt,J3)=>{"use strict";var Zbe=require("stream").PassThrough,$be=q3(),eve=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Zbe;return $be(t,e),t.pipe(e)};J3.exports=eve});var z3=E(sk=>{sk.stringify=function t(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",i=Array.isArray(e);r=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(r+=","),n=!1,i?e[s]==null?r+="null":r+=t(e[s]):e[s]!==void 0&&(r+=t(s)+":"+t(e[s])))}return r+=i?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};sk.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Z3=E((xnt,V3)=>{"use strict";var tve=require("events"),_3=z3(),rve=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(require(e[r]))(t)}return new Map},X3=class extends tve{constructor(e,r){super();if(this.opts=Object.assign({namespace:"keyv",serialize:_3.stringify,deserialize:_3.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=rve(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return r&&r.raw?n:n.value}})}set(e,r,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return r={value:r,expires:s},this.opts.serialize(r)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};V3.exports=X3});var tW=E((knt,$3)=>{"use strict";var ive=require("events"),Ty=require("url"),nve=Q3(),sve=M3(),ok=K3(),eW=j3(),ove=Ly(),ave=W3(),Ave=Z3(),yo=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Ave({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,i)=>{let n;if(typeof r=="string")n=ak(Ty.parse(r)),r={};else if(r instanceof Ty.URL)n=ak(Ty.parse(r.toString())),r={};else{let[g,...f]=(r.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=ak(_(P({},r),{pathname:g,search:h}))}r=P(P({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},r),lve(n)),r.headers=ove(r.headers);let s=new ive,o=nve(Ty.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${r.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(m=>{h=()=>{f||(f=!0,m())}}),d=m=>{if(l&&!g.forceRefresh){m.status=m.statusCode;let B=ok.fromObject(l.cachePolicy).revalidatedPolicy(g,m);if(!B.modified){let b=B.policy.responseHeaders();m=new eW(l.statusCode,b,l.body,l.url),m.cachePolicy=B.policy,m.fromCache=!0}}m.fromCache||(m.cachePolicy=new ok(g,m,g),m.fromCache=!1);let I;g.cache&&m.cachePolicy.storable()?(I=ave(m),(async()=>{try{let B=sve.buffer(m);if(await Promise.race([p,new Promise(L=>m.once("end",L))]),f)return;let b=await B,R={cachePolicy:m.cachePolicy.toObject(),url:m.url,statusCode:m.fromCache?l.statusCode:m.statusCode,body:b},H=g.strictTtl?m.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,R,H)}catch(B){s.emit("error",new yo.CacheError(B))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(B){s.emit("error",new yo.CacheError(B))}})(),s.emit("response",I||m),typeof i=="function"&&i(I||m)};try{let m=e(g,d);m.once("error",h),m.once("abort",h),s.emit("request",m)}catch(m){s.emit("error",new yo.RequestError(m))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let d=ok.fromObject(p.cachePolicy);if(d.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let m=d.responseHeaders(),I=new eW(p.statusCode,m,p.body,p.url);I.cachePolicy=d,I.fromCache=!0,s.emit("response",I),typeof i=="function"&&i(I)}else l=p,h.headers=d.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new yo.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(r)}catch(h){r.automaticFailover&&!c&&u(r),s.emit("error",new yo.CacheError(h))}})(),s}}};function lve(t){let e=P({},t);return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function ak(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}yo.RequestError=class extends Error{constructor(t){super(t.message);this.name="RequestError",Object.assign(this,t)}};yo.CacheError=class extends Error{constructor(t){super(t.message);this.name="CacheError",Object.assign(this,t)}};$3.exports=yo});var iW=E((Pnt,rW)=>{"use strict";var cve=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];rW.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(cve)),i={};for(let n of r)n in e||(i[n]={get(){let s=t[n];return typeof s=="function"?s.bind(t):s},set(s){t[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var sW=E((Dnt,nW)=>{"use strict";var{Transform:uve,PassThrough:gve}=require("stream"),Ak=require("zlib"),fve=iW();nW.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof Ak.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let i=!0,n=new uve({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new gve({autoDestroy:!1,destroy(a,l){t.destroy(),l(a)}}),o=r?Ak.createBrotliDecompress():Ak.createUnzip();return o.once("error",a=>{if(i&&!t.readable){s.end();return}s.destroy(a)}),fve(t,s),t.pipe(n).pipe(o).pipe(s),s}});var lk=E((Rnt,oW)=>{"use strict";var aW=class{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,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);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)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};oW.exports=aW});var uk=E((Fnt,AW)=>{"use strict";var hve=require("events"),pve=require("tls"),dve=require("http2"),Cve=lk(),_i=Symbol("currentStreamsCount"),lW=Symbol("request"),ns=Symbol("cachedOriginSet"),Yu=Symbol("gracefullyClosing"),mve=["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"],Eve=(t,e,r)=>{let i=0,n=t.length;for(;i>>1;r(t[s],e)?i=s+1:n=s}return i},Ive=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,ck=(t,e)=>{for(let r of t)r[ns].lengthe[ns].includes(i))&&r[_i]+e[_i]<=e.remoteSettings.maxConcurrentStreams&&cW(r)},yve=(t,e)=>{for(let r of t)e[ns].lengthr[ns].includes(i))&&e[_i]+r[_i]<=r.remoteSettings.maxConcurrentStreams&&cW(e)},uW=({agent:t,isFree:e})=>{let r={};for(let i in t.sessions){let s=t.sessions[i].filter(o=>{let a=o[ma.kCurrentStreamsCount]{t[Yu]=!0,t[_i]===0&&t.close()},ma=class extends hve{constructor({timeout:e=6e4,maxSessions:r=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Cve({maxSize:n})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let i of mve)e[i]&&(r+=`:${e[i]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let i=this.queue[e][r];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(r),a=ma.normalizeOrigin(e,r&&r.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let d=p.remoteSettings.maxConcurrentStreams;if(d=d||p[Yu]||p.destroyed)continue;h||(g=d),m>f&&(h=p,f=m)}}if(h){if(i.length!==1){for(let{reject:p}of i){let d=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(d)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=dve.connect(e,P({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},r));f[_i]=0,f[Yu]=!1;let h=()=>f[_i]{this.tlsSessionCache.set(u,m)}),f.once("error",m=>{for(let{reject:I}of i)I(m);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let m=this.sessions[o];m.splice(m.indexOf(f),1),m.length===0&&delete this.sessions[o]}else{let m=new Error("Session closed without receiving a SETTINGS frame");m.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:I}of i)I(m);l()}this._tryToCreateNewSession(o,a)});let d=()=>{if(!(!(o in this.queue)||!h())){for(let m of f[ns])if(m in this.queue[o]){let{listeners:I}=this.queue[o][m];for(;I.length!==0&&h();)I.shift().resolve(f);let B=this.queue[o];if(B[m].listeners.length===0&&(delete B[m],Object.keys(B).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[ns]=f.originSet,!!h()&&(d(),ck(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let m=new Error("Agent has been destroyed");for(let I of i)I.reject(m);f.destroy();return}f[ns]=f.originSet;{let m=this.sessions;if(o in m){let I=m[o];I.splice(Eve(I,f,Ive),0,f)}else m[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),d(),l(),f[_i]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,r,i),i.length=0),f.on("remoteSettings",()=>{d(),ck(this.sessions[o],f)})}),f[lW]=f.request,f.request=(m,I)=>{if(f[Yu])throw new Error("The session is gracefully closing. No new streams are allowed.");let B=f[lW](m,I);return f.ref(),++f[_i],f[_i]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,B.once("close",()=>{if(p=h(),--f[_i],!f.destroyed&&!f.closed&&(yve(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let b=f[_i]===0;b&&f.unref(),b&&(this._freeSessionsCount>this.maxFreeSessions||f[Yu])?f.close():(ck(this.sessions[o],f),d())}}),B}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,r,i,n){return new Promise((s,o)=>{this.getSession(e,r,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,r){return ma.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof r.servername=="undefined"&&(r.servername=n),pve.connect(i,n,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[_i]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let i of r)i.destroy(e);for(let r of Object.values(this.queue))for(let i of Object.values(r))i.destroyed=!0;this.queue={}}get freeSessions(){return uW({agent:this,isFree:!0})}get busySessions(){return uW({agent:this,isFree:!1})}};ma.kCurrentStreamsCount=_i;ma.kGracefullyClosing=Yu;AW.exports={Agent:ma,globalAgent:new ma}});var gk=E((Nnt,gW)=>{"use strict";var{Readable:wve}=require("stream"),fW=class extends wve{constructor(e,r){super({highWaterMark:r,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,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};gW.exports=fW});var fk=E((Lnt,hW)=>{"use strict";hW.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var dW=E((Tnt,pW)=>{"use strict";pW.exports=(t,e,r)=>{for(let i of r)t.on(i,(...n)=>e.emit(i,...n))}});var mW=E((Mnt,CW)=>{"use strict";CW.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var IW=E((Knt,EW)=>{"use strict";var qu=(t,e,r)=>{EW.exports[e]=class extends t{constructor(...n){super(typeof r=="string"?r:r(n));this.name=`${super.name} [${e}]`,this.code=e}}};qu(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],i=Array.isArray(r);return i&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${i?"one of":"of"} type ${r}. Received ${typeof t[2]}`});qu(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);qu(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);qu(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);qu(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);qu(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var Ck=E((Unt,yW)=>{"use strict";var Bve=require("http2"),{Writable:Qve}=require("stream"),{Agent:wW,globalAgent:bve}=uk(),vve=gk(),Sve=fk(),xve=dW(),kve=mW(),{ERR_INVALID_ARG_TYPE:hk,ERR_INVALID_PROTOCOL:Pve,ERR_HTTP_HEADERS_SENT:BW,ERR_INVALID_HTTP_TOKEN:Dve,ERR_HTTP_INVALID_HEADER_VALUE:Rve,ERR_INVALID_CHAR:Fve}=IW(),{HTTP2_HEADER_STATUS:QW,HTTP2_HEADER_METHOD:bW,HTTP2_HEADER_PATH:vW,HTTP2_METHOD_CONNECT:Nve}=Bve.constants,Pi=Symbol("headers"),pk=Symbol("origin"),dk=Symbol("session"),SW=Symbol("options"),My=Symbol("flushedHeaders"),yp=Symbol("jobs"),Lve=/^[\^`\-\w!#$%&*+.|~]+$/,Tve=/[^\t\u0020-\u007E\u0080-\u00FF]/,xW=class extends Qve{constructor(e,r,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Sve(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(i=r,r=n?e:P({},e)):r=P(P({},e),r),r.h2session)this[dk]=r.h2session;else if(r.agent===!1)this.agent=new wW({maxFreeSessions:0});else if(typeof r.agent=="undefined"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new wW({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=bve;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new hk("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Pve(r.protocol,"https:");let s=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,o=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:a}=r;if(r.timeout=void 0,this[Pi]=Object.create(null),this[yp]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[l,c]of Object.entries(r.headers))this.setHeader(l,c);r.auth&&!("authorization"in this[Pi])&&(this[Pi].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[SW]=r,s===443?(this[pk]=`https://${o}`,":authority"in this[Pi]||(this[Pi][":authority"]=o)):(this[pk]=`https://${o}:${s}`,":authority"in this[Pi]||(this[Pi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[My]=!1}get method(){return this[Pi][bW]}set method(e){e&&(this[Pi][bW]=e.toUpperCase())}get path(){return this[Pi][vW]}set path(e){e&&(this[Pi][vW]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,r,i);this._request?n():this[yp].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[yp].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[My]||this.destroyed)return;this[My]=!0;let e=this.method===Nve,r=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||xve(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new vve(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[QW],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[QW]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[yp])o();this.emit("socket",this.socket)};if(this[dk])try{r(this[dk].request(this[Pi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[pk],this[SW],this[Pi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new hk("name","string",e);return this[Pi][e.toLowerCase()]}get headersSent(){return this[My]}removeHeader(e){if(typeof e!="string")throw new hk("name","string",e);if(this.headersSent)throw new BW("remove");delete this[Pi][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new BW("set");if(typeof e!="string"||!Lve.test(e)&&!kve(e))throw new Dve("Header name",e);if(typeof r=="undefined")throw new Rve(r,e);if(Tve.test(r))throw new Fve("header content",e);this[Pi][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let i=()=>this._request.setTimeout(e,r);return this._request?i():this[yp].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};yW.exports=xW});var PW=E((Hnt,kW)=>{"use strict";var Mve=require("tls");kW.exports=(t={})=>new Promise((e,r)=>{let i=Mve.connect(t,()=>{t.resolveSocket?(i.off("error",r),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})});var RW=E((Gnt,DW)=>{"use strict";var Ove=require("net");DW.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Ove.isIP(e)?"":e}});var LW=E((jnt,mk)=>{"use strict";var FW=require("http"),Ek=require("https"),Kve=PW(),Uve=lk(),Hve=Ck(),Gve=RW(),jve=fk(),Oy=new Uve({maxSize:100}),wp=new Map,NW=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{t.emit("free",e,r)};e.on("free",i);let n=()=>{t.removeSocket(e,r)};e.on("close",n);let s=()=>{t.removeSocket(e,r),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),t.emit("free",e,r)},Yve=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Oy.has(e)){if(wp.has(e))return(await wp.get(e)).alpnProtocol;let{path:r,agent:i}=t;t.path=t.socketPath;let n=Kve(t);wp.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Oy.set(e,o),t.path=r,o==="h2")s.destroy();else{let{globalAgent:a}=Ek,l=Ek.Agent.prototype.createConnection;i?i.createConnection===l?NW(i,s,t):s.destroy():a.createConnection===l?NW(a,s,t):s.destroy()}return wp.delete(e),o}catch(s){throw wp.delete(e),s}}return Oy.get(e)};mk.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=jve(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e=_(P(P({ALPNProtocols:["h2","http/1.1"]},t),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Gve(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Ek.globalAgent:FW.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await Yve(e)==="h2"?(n&&(e.agent=n.http2),new Hve(e,r)):FW.request(e,r)};mk.exports.protocolCache=Oy});var MW=E((Ynt,TW)=>{"use strict";var qve=require("http2"),Jve=uk(),Ik=Ck(),Wve=gk(),zve=LW(),Vve=(t,e,r)=>new Ik(t,e,r),_ve=(t,e,r)=>{let i=new Ik(t,e,r);return i.end(),i};TW.exports=_(P(_(P({},qve),{ClientRequest:Ik,IncomingMessage:Wve}),Jve),{request:Vve,get:_ve,auto:zve})});var wk=E(yk=>{"use strict";Object.defineProperty(yk,"__esModule",{value:!0});var OW=Ca();yk.default=t=>OW.default.nodeStream(t)&&OW.default.function_(t.getBoundary)});var GW=E(Bk=>{"use strict";Object.defineProperty(Bk,"__esModule",{value:!0});var KW=require("fs"),UW=require("util"),HW=Ca(),Xve=wk(),Zve=UW.promisify(KW.stat);Bk.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(HW.default.string(t))return Buffer.byteLength(t);if(HW.default.buffer(t))return t.length;if(Xve.default(t))return UW.promisify(t.getLength.bind(t))();if(t instanceof KW.ReadStream){let{size:r}=await Zve(t.path);return r===0?void 0:r}}});var bk=E(Qk=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});function $ve(t,e,r){let i={};for(let n of r)i[n]=(...s)=>{e.emit(n,...s)},t.on(n,i[n]);return()=>{for(let n of r)t.off(n,i[n])}}Qk.default=$ve});var jW=E(vk=>{"use strict";Object.defineProperty(vk,"__esModule",{value:!0});vk.default=()=>{let t=[];return{once(e,r,i){e.once(r,i),t.push({origin:e,event:r,fn:i})},unhandleAll(){for(let e of t){let{origin:r,event:i,fn:n}=e;r.removeListener(i,n)}t.length=0}}}});var qW=E(Bp=>{"use strict";Object.defineProperty(Bp,"__esModule",{value:!0});Bp.TimeoutError=void 0;var eSe=require("net"),tSe=jW(),YW=Symbol("reentry"),rSe=()=>{},Sk=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`);this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};Bp.TimeoutError=Sk;Bp.default=(t,e,r)=>{if(YW in t)return rSe;t[YW]=!0;let i=[],{once:n,unhandleAll:s}=tSe.default(),o=(g,f,h)=>{var p;let d=setTimeout(f,g,g,h);(p=d.unref)===null||p===void 0||p.call(d);let m=()=>{clearTimeout(d)};return i.push(m),m},{host:a,hostname:l}=r,c=(g,f)=>{t.destroy(new Sk(g,f))},u=()=>{for(let g of i)g();s()};if(t.once("error",g=>{if(u(),t.listenerCount("error")===0)throw g}),t.once("close",u),n(t,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};t.setTimeout(e.socket,g),i.push(()=>{t.removeListener("timeout",g)})}return n(t,"socket",g=>{var f;let{socketPath:h}=t;if(g.connecting){let p=Boolean(h!=null?h:eSe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let d=o(e.lookup,c,"lookup");n(g,"lookup",d)}if(typeof e.connect!="undefined"){let d=()=>o(e.connect,c,"connect");p?n(g,"connect",d()):n(g,"lookup",m=>{m===null&&n(g,"connect",d())})}typeof e.secureConnect!="undefined"&&r.protocol==="https:"&&n(g,"connect",()=>{let d=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",d)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(t,"upload-complete",p())}):n(t,"upload-complete",p())}}),typeof e.response!="undefined"&&n(t,"upload-complete",()=>{let g=o(e.response,c,"response");n(t,"response",g)}),u}});var WW=E(xk=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var JW=Ca();xk.default=t=>{t=t;let e={protocol:t.protocol,hostname:JW.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return JW.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var zW=E(kk=>{"use strict";Object.defineProperty(kk,"__esModule",{value:!0});var iSe=require("url"),nSe=["protocol","host","hostname","port","pathname","search"];kk.default=(t,e)=>{var r,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(i=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&i!==void 0?i:""}`}let n=new iSe.URL(t);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of nSe)e[s]&&(n[s]=e[s].toString());return n}});var _W=E(Pk=>{"use strict";Object.defineProperty(Pk,"__esModule",{value:!0});var VW=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};Pk.default=VW});var Rk=E(Dk=>{"use strict";Object.defineProperty(Dk,"__esModule",{value:!0});var sSe=async t=>{let e=[],r=0;for await(let i of t)e.push(i),r+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};Dk.default=sSe});var ZW=E(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});ql.dnsLookupIpVersionToFamily=ql.isDnsLookupIpVersion=void 0;var XW={auto:0,ipv4:4,ipv6:6};ql.isDnsLookupIpVersion=t=>t in XW;ql.dnsLookupIpVersionToFamily=t=>{if(ql.isDnsLookupIpVersion(t))return XW[t];throw new Error("Invalid DNS lookup IP version")}});var Fk=E(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.isResponseOk=void 0;Ky.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var e8=E(Nk=>{"use strict";Object.defineProperty(Nk,"__esModule",{value:!0});var $W=new Set;Nk.default=t=>{$W.has(t)||($W.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var t8=E(Lk=>{"use strict";Object.defineProperty(Lk,"__esModule",{value:!0});var ar=Ca(),oSe=(t,e)=>{if(ar.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");ar.assert.any([ar.default.string,ar.default.undefined],t.encoding),ar.assert.any([ar.default.boolean,ar.default.undefined],t.resolveBodyOnly),ar.assert.any([ar.default.boolean,ar.default.undefined],t.methodRewriting),ar.assert.any([ar.default.boolean,ar.default.undefined],t.isStream),ar.assert.any([ar.default.string,ar.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry=P({},e.retry):t.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},ar.default.object(r)?(t.retry=P(P({},t.retry),r),t.retry.methods=[...new Set(t.retry.methods.map(i=>i.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):ar.default.number(r)&&(t.retry.limit=r),ar.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(ar.default.number))),ar.default.object(t.pagination)){e&&(t.pagination=P(P({},e.pagination),t.pagination));let{pagination:i}=t;if(!ar.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!ar.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!ar.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!ar.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};Lk.default=oSe});var r8=E(Qp=>{"use strict";Object.defineProperty(Qp,"__esModule",{value:!0});Qp.retryAfterStatusCodes=void 0;Qp.retryAfterStatusCodes=new Set([413,429,503]);var aSe=({attemptCount:t,retryOptions:e,error:r,retryAfter:i})=>{if(t>e.limit)return 0;let n=e.methods.includes(r.options.method),s=e.errorCodes.includes(r.code),o=r.response&&e.statusCodes.includes(r.response.statusCode);if(!n||!s&&!o)return 0;if(r.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(r.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(t-1)*1e3+a};Qp.default=aSe});var vp=E(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});Rt.UnsupportedProtocolError=Rt.ReadError=Rt.TimeoutError=Rt.UploadError=Rt.CacheError=Rt.HTTPError=Rt.MaxRedirectsError=Rt.RequestError=Rt.setNonEnumerableProperties=Rt.knownHookEvents=Rt.withoutBody=Rt.kIsNormalizedAlready=void 0;var i8=require("util"),n8=require("stream"),ASe=require("fs"),dA=require("url"),s8=require("http"),Tk=require("http"),lSe=require("https"),cSe=h3(),uSe=y3(),o8=tW(),gSe=sW(),fSe=MW(),hSe=Ly(),ce=Ca(),pSe=GW(),a8=wk(),dSe=bk(),A8=qW(),CSe=WW(),l8=zW(),mSe=_W(),ESe=Rk(),c8=ZW(),ISe=Fk(),CA=e8(),ySe=t8(),wSe=r8(),Mk,Ei=Symbol("request"),Uy=Symbol("response"),Ju=Symbol("responseSize"),Wu=Symbol("downloadedSize"),zu=Symbol("bodySize"),Vu=Symbol("uploadedSize"),Hy=Symbol("serverResponsesPiped"),u8=Symbol("unproxyEvents"),g8=Symbol("isFromCache"),Ok=Symbol("cancelTimeouts"),f8=Symbol("startedReading"),_u=Symbol("stopReading"),Gy=Symbol("triggerRead"),mA=Symbol("body"),bp=Symbol("jobs"),h8=Symbol("originalResponse"),p8=Symbol("retryTimeout");Rt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var BSe=ce.default.string(process.versions.brotli);Rt.withoutBody=new Set(["GET","HEAD"]);Rt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function QSe(t){for(let e in t){let r=t[e];if(!ce.default.string(r)&&!ce.default.number(r)&&!ce.default.boolean(r)&&!ce.default.null_(r)&&!ce.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function bSe(t){return ce.default.object(t)&&!("statusCode"in t)}var Kk=new mSe.default,vSe=async t=>new Promise((e,r)=>{let i=n=>{r(n)};t.pending||e(),t.once("error",i),t.once("ready",()=>{t.off("error",i),e()})}),SSe=new Set([300,301,302,303,304,307,308]),xSe=["context","body","json","form"];Rt.setNonEnumerableProperties=(t,e)=>{let r={};for(let i of t)if(!!i)for(let n of xSe)n in i&&(r[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,r)};var _r=class extends Error{constructor(e,r,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,i instanceof Uk?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Uy]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,ce.default.string(r.stack)&&ce.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};Rt.RequestError=_r;var Hk=class extends _r{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};Rt.MaxRedirectsError=Hk;var Gk=class extends _r{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};Rt.HTTPError=Gk;var jk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="CacheError"}};Rt.CacheError=jk;var Yk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="UploadError"}};Rt.UploadError=Yk;var qk=class extends _r{constructor(e,r,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=r}};Rt.TimeoutError=qk;var jy=class extends _r{constructor(e,r){super(e.message,e,r);this.name="ReadError"}};Rt.ReadError=jy;var Jk=class extends _r{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};Rt.UnsupportedProtocolError=Jk;var kSe=["socket","connect","continue","information","upgrade","timeout"],Uk=class extends n8.Duplex{constructor(e,r={},i){super({autoDestroy:!1,highWaterMark:0});this[Wu]=0,this[Vu]=0,this.requestInitialized=!1,this[Hy]=new Set,this.redirects=[],this[_u]=!1,this[Gy]=!1,this[bp]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof Tk.IncomingMessage&&(this.options.headers=P(P({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=r;if((o||a||l)&&this._lockWrite(),Rt.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,i)}catch(c){ce.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof ASe.ReadStream&&await vSe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Ei])===null||c===void 0||c.destroy();return}for(let g of this[bp])g();this[bp].length=0,this.requestInitialized=!0}catch(u){if(u instanceof _r){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,r,i){var n,s,o,a,l;let c=r;if(ce.default.object(e)&&!ce.default.urlInstance(e))r=P(P(P({},i),e),r);else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r=P(P({},i),r),e!==void 0&&(r.url=e),ce.default.urlInstance(r.url)&&(r.url=new dA.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),ce.assert.any([ce.default.string,ce.default.undefined],r.method),ce.assert.any([ce.default.object,ce.default.undefined],r.headers),ce.assert.any([ce.default.string,ce.default.urlInstance,ce.default.undefined],r.prefixUrl),ce.assert.any([ce.default.object,ce.default.undefined],r.cookieJar),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.searchParams),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.cache),ce.assert.any([ce.default.object,ce.default.number,ce.default.undefined],r.timeout),ce.assert.any([ce.default.object,ce.default.undefined],r.context),ce.assert.any([ce.default.object,ce.default.undefined],r.hooks),ce.assert.any([ce.default.boolean,ce.default.undefined],r.decompress),ce.assert.any([ce.default.boolean,ce.default.undefined],r.ignoreInvalidCookies),ce.assert.any([ce.default.boolean,ce.default.undefined],r.followRedirect),ce.assert.any([ce.default.number,ce.default.undefined],r.maxRedirects),ce.assert.any([ce.default.boolean,ce.default.undefined],r.throwHttpErrors),ce.assert.any([ce.default.boolean,ce.default.undefined],r.http2),ce.assert.any([ce.default.boolean,ce.default.undefined],r.allowGetBody),ce.assert.any([ce.default.string,ce.default.undefined],r.localAddress),ce.assert.any([c8.isDnsLookupIpVersion,ce.default.undefined],r.dnsLookupIpVersion),ce.assert.any([ce.default.object,ce.default.undefined],r.https),ce.assert.any([ce.default.boolean,ce.default.undefined],r.rejectUnauthorized),r.https&&(ce.assert.any([ce.default.boolean,ce.default.undefined],r.https.rejectUnauthorized),ce.assert.any([ce.default.function_,ce.default.undefined],r.https.checkServerIdentity),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificateAuthority),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.key),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificate),ce.assert.any([ce.default.string,ce.default.undefined],r.https.passphrase),ce.assert.any([ce.default.string,ce.default.buffer,ce.default.array,ce.default.undefined],r.https.pfx)),ce.assert.any([ce.default.object,ce.default.undefined],r.cacheOptions),ce.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(i==null?void 0:i.headers)?r.headers=P({},r.headers):r.headers=hSe(P(P({},i==null?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!==(i==null?void 0:i.searchParams)){let h;if(ce.default.string(r.searchParams)||r.searchParams instanceof dA.URLSearchParams)h=new dA.URLSearchParams(r.searchParams);else{QSe(r.searchParams),h=new dA.URLSearchParams;for(let p in r.searchParams){let d=r.searchParams[p];d===null?h.append(p,""):d!==void 0&&h.append(p,d)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,d)=>{h.has(d)||h.append(d,p)}),r.searchParams=h}if(r.username=(s=r.username)!==null&&s!==void 0?s:"",r.password=(o=r.password)!==null&&o!==void 0?o:"",ce.default.undefined(r.prefixUrl)?r.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),ce.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=l8.default(r.prefixUrl+r.url,r)}else(ce.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=l8.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:h}=r;Object.defineProperty(r,"prefixUrl",{set:d=>{let m=r.url;if(!m.href.startsWith(d))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${d}: ${m.href}`);r.url=new dA.URL(d+m.href.slice(h.length)),h=d},get:()=>h});let{protocol:p}=r.url;if(p==="unix:"&&(p="http:",r.url=new dA.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),p!=="http:"&&p!=="https:")throw new Jk(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}let{cookieJar:u}=r;if(u){let{setCookie:h,getCookieString:p}=u;ce.assert.function_(h),ce.assert.function_(p),h.length===4&&p.length===0&&(h=i8.promisify(h.bind(r.cookieJar)),p=i8.promisify(p.bind(r.cookieJar)),r.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=r;if(g&&(Kk.has(g)||Kk.set(g,new o8((h,p)=>{let d=h[Ei](h,p);return ce.default.promise(d)&&(d.once=(m,I)=>{if(m==="error")d.catch(I);else if(m==="abort")(async()=>{try{(await d).once("abort",I)}catch(B){}})();else throw new Error(`Unknown HTTP2 promise event: ${m}`);return d}),d},g))),r.cacheOptions=P({},r.cacheOptions),r.dnsCache===!0)Mk||(Mk=new uSe.default),r.dnsCache=Mk;else if(!ce.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${ce.default(r.dnsCache)}`);ce.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout=P(P({},i.timeout),r.timeout):r.timeout=P({},r.timeout),r.context||(r.context={});let f=r.hooks===(i==null?void 0:i.hooks);r.hooks=P({},r.hooks);for(let h of Rt.knownHookEvents)if(h in r.hooks)if(ce.default.array(r.hooks[h]))r.hooks[h]=[...r.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${ce.default(r.hooks[h])}`);else r.hooks[h]=[];if(i&&!f)for(let h of Rt.knownHookEvents)i.hooks[h].length>0&&(r.hooks[h]=[...i.hooks[h],...r.hooks[h]]);if("family"in r&&CA.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(r.https=P(P({},i.https),r.https)),"rejectUnauthorized"in r&&CA.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&CA.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&CA.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&CA.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&CA.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&CA.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&CA.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(let h in r.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return r.maxRedirects=(l=r.maxRedirects)!==null&&l!==void 0?l:0,Rt.setNonEnumerableProperties([i,c],r),ySe.default(r,i)}_lockWrite(){let 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(){let{options:e}=this,{headers:r}=e,i=!ce.default.undefined(e.form),n=!ce.default.undefined(e.json),s=!ce.default.undefined(e.body),o=i||n||s,a=Rt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof n8.Readable)&&!ce.default.string(e.body)&&!ce.default.buffer(e.body)&&!a8.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!ce.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!ce.default.string(r["content-type"]);s?(a8.default(e.body)&&l&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[mA]=e.body):i?(l&&(r["content-type"]="application/x-www-form-urlencoded"),this[mA]=new dA.URLSearchParams(e.form).toString()):(l&&(r["content-type"]="application/json"),this[mA]=e.stringifyJson(e.json));let c=await pSe.default(this[mA],e.headers);ce.default.undefined(r["content-length"])&&ce.default.undefined(r["transfer-encoding"])&&!a&&!ce.default.undefined(c)&&(r["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[zu]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:i}=r;this[h8]=e,r.decompress&&(e=gSe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:s8.STATUS_CODES[n],s.url=r.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[g8]=s.isFromCache,this[Ju]=Number(e.headers["content-length"])||void 0,this[Uy]=e,e.once("end",()=>{this[Ju]=this[Wu],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new jy(a,this))}),e.once("aborted",()=>{this._beforeError(new jy({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(ce.default.object(r.cookieJar)&&o){let a=o.map(async l=>r.cookieJar.setCookie(l,i.toString()));r.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(r.followRedirect&&e.headers.location&&SSe.has(n)){if(e.resume(),this[Ei]&&(this[Ok](),delete this[Ei],this[u8]()),(n===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[mA]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new Hk(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new dA.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(c.username=r.username,c.password=r.password),this.redirects.push(u),r.url=c;for(let g of r.hooks.beforeRedirect)await g(r,s);this.emit("redirect",s,r),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(r.isStream&&r.throwHttpErrors&&!ISe.isResponseOk(s)){this._beforeError(new Gk(s));return}e.on("readable",()=>{this[Gy]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Hy])if(!a.headersSent){for(let l in e.headers){let c=r.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:i,url:n}=r;cSe.default(e),this[Ok]=A8.default(e,i,n);let s=r.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof A8.TimeoutError?new qk(l,this.timings,this):new _r(l.message,l,this),this._beforeError(l)}),this[u8]=dSe.default(e,this,kSe),this[Ei]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[mA],a=this.redirects.length===0?this:e;ce.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new Yk(l,this))})):(this._unlockWrite(),ce.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((i,n)=>{Object.assign(r,CSe.default(e)),delete r.url;let s,o=Kk.get(r.cache)(r,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});r.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,r,i,n,s;let{options:o}=this,{headers:a}=o;for(let I in a)if(ce.default.undefined(a[I]))delete a[I];else if(ce.default.null_(a[I]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${I}\` header`);if(o.decompress&&ce.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=BSe?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let I=await o.cookieJar.getCookieString(o.url.toString());ce.default.nonEmptyString(I)&&(o.headers.cookie=I)}for(let I of o.hooks.beforeRequest){let B=await I(o);if(!ce.default.undefined(B)){o.request=()=>B;break}}o.body&&this[mA]!==o.body&&(this[mA]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let I=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(I==null?void 0:I.groups){let{socketPath:B,path:b}=I.groups;Object.assign(o,{socketPath:B,path:b,host:""})}}let f=g.protocol==="https:",h;o.http2?h=fSe.auto:h=f?lSe.request:s8.request;let p=(e=o.request)!==null&&e!==void 0?e:h,d=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Ei]=p,delete o.request,delete o.timeout;let m=o;if(m.shared=(r=o.cacheOptions)===null||r===void 0?void 0:r.shared,m.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,m.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,m.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{m.family=c8.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(I){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(m.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(m.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(m.ca=o.https.certificateAuthority),o.https.certificate&&(m.cert=o.https.certificate),o.https.key&&(m.key=o.https.key),o.https.passphrase&&(m.passphrase=o.https.passphrase),o.https.pfx&&(m.pfx=o.https.pfx));try{let I=await d(g,m);ce.default.undefined(I)&&(I=h(g,m)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete m.rejectUnauthorized,o.https.checkServerIdentity&&delete m.checkServerIdentity,o.https.certificateAuthority&&delete m.ca,o.https.certificate&&delete m.cert,o.https.key&&delete m.key,o.https.passphrase&&delete m.passphrase,o.https.pfx&&delete m.pfx),bSe(I)?this._onRequest(I):this.writable?(this.once("finish",()=>{this._onResponse(I)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(I)}catch(I){throw I instanceof o8.CacheError?new jk(I,this):new _r(I.message,I,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new _r(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[_u])return;let{options:r}=this,i=this.retryCount+1;this[_u]=!0,e instanceof _r||(e=new _r(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await ESe.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await r.retry.calculateDelay({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:wSe.default({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new _r(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new _r(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[p8]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Gy]=!0;let e=this[Uy];if(e&&!this[_u]){e.readableLength&&(this[Gy]=!1);let r;for(;(r=e.read())!==null;){this[Wu]+=r.length,this[f8]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(r)}}}_write(e,r,i){let n=()=>{this._writeRequest(e,r,i)};this.requestInitialized?n():this[bp].push(n)}_writeRequest(e,r,i){this[Ei].destroyed||(this._progressCallbacks.push(()=>{this[Vu]+=Buffer.byteLength(e,r);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Ei].write(e,r,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ei in this)){e();return}if(this[Ei].destroyed){e();return}this[Ei].end(i=>{i||(this[zu]=this[Vu],this.emit("uploadProgress",this.uploadProgress),this[Ei].emit("upload-complete")),e(i)})};this.requestInitialized?r():this[bp].push(r)}_destroy(e,r){var i;this[_u]=!0,clearTimeout(this[p8]),Ei in this&&(this[Ok](),((i=this[Uy])===null||i===void 0?void 0:i.complete)||this[Ei].destroy()),e!==null&&!ce.default.undefined(e)&&!(e instanceof _r)&&(e=new _r(e.message,e,this)),r(e)}get _isAboutToError(){return this[_u]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,i;return((r=(e=this[Ei])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!((i=this[h8])===null||i===void 0?void 0:i.complete)}get socket(){var e,r;return(r=(e=this[Ei])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[Ju]?e=this[Wu]/this[Ju]:this[Ju]===this[Wu]?e=1:e=0,{percent:e,transferred:this[Wu],total:this[Ju]}}get uploadProgress(){let e;return this[zu]?e=this[Vu]/this[zu]:this[zu]===this[Vu]?e=1:e=0,{percent:e,transferred:this[Vu],total:this[zu]}}get timings(){var e;return(e=this[Ei])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[g8]}pipe(e,r){if(this[f8])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof Tk.ServerResponse&&this[Hy].add(e),super.pipe(e,r)}unpipe(e){return e instanceof Tk.ServerResponse&&this[Hy].delete(e),super.unpipe(e),this}};Rt.default=Uk});var Sp=E(Ms=>{"use strict";var PSe=Ms&&Ms.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),DSe=Ms&&Ms.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&PSe(e,t,r)};Object.defineProperty(Ms,"__esModule",{value:!0});Ms.CancelError=Ms.ParseError=void 0;var d8=vp(),C8=class extends d8.RequestError{constructor(e,r){let{options:i}=r.request;super(`${e.message} in "${i.url.toString()}"`,e,r.request);this.name="ParseError"}};Ms.ParseError=C8;var m8=class extends d8.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Ms.CancelError=m8;DSe(vp(),Ms)});var I8=E(Wk=>{"use strict";Object.defineProperty(Wk,"__esModule",{value:!0});var E8=Sp(),RSe=(t,e,r,i)=>{let{rawBody:n}=t;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":r(n.toString());if(e==="buffer")return n;throw new E8.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(s){throw new E8.ParseError(s,t)}};Wk.default=RSe});var zk=E(EA=>{"use strict";var FSe=EA&&EA.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),NSe=EA&&EA.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&FSe(e,t,r)};Object.defineProperty(EA,"__esModule",{value:!0});var LSe=require("events"),TSe=Ca(),MSe=g3(),Yy=Sp(),y8=I8(),w8=vp(),OSe=bk(),KSe=Rk(),B8=Fk(),USe=["request","response","redirect","uploadProgress","downloadProgress"];function Q8(t){let e,r,i=new LSe.EventEmitter,n=new MSe((o,a,l)=>{let c=u=>{let g=new w8.default(void 0,t);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Yy.CancelError(g))),e=g,g.once("response",async p=>{var d;if(p.retryCount=u,p.request.aborted)return;let m;try{m=await KSe.default(g),p.rawBody=m}catch(R){return}if(g._isAboutToError)return;let I=((d=p.headers["content-encoding"])!==null&&d!==void 0?d:"").toLowerCase(),B=["gzip","deflate","br"].includes(I),{options:b}=g;if(B&&!b.decompress)p.body=m;else try{p.body=y8.default(p,b.responseType,b.parseJson,b.encoding)}catch(R){if(p.body=m.toString(),B8.isResponseOk(p)){g._beforeError(R);return}}try{for(let[R,H]of b.hooks.afterResponse.entries())p=await H(p,async L=>{let K=w8.default.normalizeArguments(void 0,_(P({},L),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),b);K.hooks.afterResponse=K.hooks.afterResponse.slice(0,R);for(let ne of K.hooks.beforeRetry)await ne(K);let J=Q8(K);return l(()=>{J.catch(()=>{}),J.cancel()}),J})}catch(R){g._beforeError(new Yy.RequestError(R.message,R,g));return}if(!B8.isResponseOk(p)){g._beforeError(new Yy.HTTPError(p));return}r=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:d}=g;if(p instanceof Yy.HTTPError&&!d.throwHttpErrors){let{response:m}=p;o(g.options.resolveBodyOnly?m.body:m);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,d)=>{var m,I;if(h===((m=d.request)===null||m===void 0?void 0:m.options.body)&&TSe.default.nodeStream((I=d.request)===null||I===void 0?void 0:I.options.body)){f(d);return}c(p)}),OSe.default(g,i,USe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=r.request;return y8.default(r,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}EA.default=Q8;NSe(Sp(),EA)});var b8=E(Vk=>{"use strict";Object.defineProperty(Vk,"__esModule",{value:!0});var HSe=Sp();function GSe(t,...e){let r=(async()=>{if(t instanceof HSe.RequestError)try{for(let n of e)if(n)for(let s of n)t=await s(t)}catch(n){t=n}throw t})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}Vk.default=GSe});var x8=E(_k=>{"use strict";Object.defineProperty(_k,"__esModule",{value:!0});var v8=Ca();function S8(t){for(let e of Object.values(t))(v8.default.plainObject(e)||v8.default.array(e))&&S8(e);return Object.freeze(t)}_k.default=S8});var P8=E(k8=>{"use strict";Object.defineProperty(k8,"__esModule",{value:!0})});var Xk=E(ss=>{"use strict";var jSe=ss&&ss.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),YSe=ss&&ss.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&jSe(e,t,r)};Object.defineProperty(ss,"__esModule",{value:!0});ss.defaultHandler=void 0;var D8=Ca(),os=zk(),qSe=b8(),qy=vp(),JSe=x8(),WSe={RequestError:os.RequestError,CacheError:os.CacheError,ReadError:os.ReadError,HTTPError:os.HTTPError,MaxRedirectsError:os.MaxRedirectsError,TimeoutError:os.TimeoutError,ParseError:os.ParseError,CancelError:os.CancelError,UnsupportedProtocolError:os.UnsupportedProtocolError,UploadError:os.UploadError},zSe=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:Jy}=qy.default,R8=(...t)=>{let e;for(let r of t)e=Jy(void 0,r,e);return e},VSe=t=>t.isStream?new qy.default(void 0,t):os.default(t),_Se=t=>"defaults"in t&&"options"in t.defaults,XSe=["get","post","put","patch","head","delete"];ss.defaultHandler=(t,e)=>e(t);var F8=(t,e)=>{if(t)for(let r of t)r(e)},N8=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>t.handlers[l++](u,l===t.handlers.length?VSe:c);if(D8.default.plainObject(i)){let u=P(P({},i),n);qy.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{F8(t.options.hooks.init,n),F8((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Jy(i,n,s!=null?s:t.options);if(g[qy.kIsNormalizedAlready]=!0,u)throw new os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return qSe.default(u,t.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[t.options],s=[...t._rawHandlers],o;for(let a of i)_Se(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==ss.defaultHandler),s.length===0&&s.push(ss.defaultHandler),N8({options:R8(...n),handlers:s,mutableDefaults:Boolean(o)})};let r=async function*(i,n){let s=Jy(i,n,t.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!D8.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of r(i,n))s.push(o);return s},e.paginate.each=r,e.stream=(i,n)=>e(i,_(P({},n),{isStream:!0}));for(let i of XSe)e[i]=(n,s)=>e(n,_(P({},s),{method:i})),e.stream[i]=(n,s)=>e(n,_(P({},s),{method:i,isStream:!0}));return Object.assign(e,WSe),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:JSe.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=R8,e};ss.default=N8;YSe(P8(),ss)});var zy=E((Ea,Wy)=>{"use strict";var ZSe=Ea&&Ea.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),L8=Ea&&Ea.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&ZSe(e,t,r)};Object.defineProperty(Ea,"__esModule",{value:!0});var $Se=require("url"),T8=Xk(),exe={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:t})=>t},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:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let i of e){let n=i.split(";");if(n[1].includes("next")){r=n[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new $Se.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[T8.defaultHandler],mutableDefaults:!1},Zk=T8.default(exe);Ea.default=Zk;Wy.exports=Zk;Wy.exports.default=Zk;Wy.exports.__esModule=!0;L8(Xk(),Ea);L8(zk(),Ea)});var U8=E(Xu=>{"use strict";var fst=require("net"),txe=require("tls"),$k=require("http"),M8=require("https"),rxe=require("events"),hst=require("assert"),ixe=require("util");Xu.httpOverHttp=nxe;Xu.httpsOverHttp=sxe;Xu.httpOverHttps=oxe;Xu.httpsOverHttps=axe;function nxe(t){var e=new Ia(t);return e.request=$k.request,e}function sxe(t){var e=new Ia(t);return e.request=$k.request,e.createSocket=O8,e.defaultPort=443,e}function oxe(t){var e=new Ia(t);return e.request=M8.request,e}function axe(t){var e=new Ia(t);return e.request=M8.request,e.createSocket=O8,e.defaultPort=443,e}function Ia(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||$k.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=K8(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};Ia.prototype.createSocket=function(e,r){var i=this,n={};i.sockets.push(n);var s=eP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),IA("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){IA("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){IA("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return IA("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,r(f)}function u(g){o.removeAllListeners(),IA(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};Ia.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function O8(t,e){var r=this;Ia.prototype.createSocket.call(r,t,function(i){var n=t.request.getHeader("host"),s=eP({},r.options,{socket:i,servername:n?n.replace(/:.*$/,""):t.host}),o=txe.connect(0,s);r.sockets[r.sockets.indexOf(i)]=o,e(o)})}function K8(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function eP(t){for(var e=1,r=arguments.length;e{H8.exports=U8()});var b4=E((xot,sP)=>{var e4=Object.assign({},require("fs")),oe=typeof oe!="undefined"?oe:{},kp={},wA;for(wA in oe)oe.hasOwnProperty(wA)&&(kp[wA]=oe[wA]);var oP=[],t4="./this.program",r4=function(t,e){throw e},i4=!1,Wl=!0,Pp="";function dxe(t){return oe.locateFile?oe.locateFile(t,Pp):Pp+t}var Xy,aP,Zy,AP;Wl&&(i4?Pp=require("path").dirname(Pp)+"/":Pp=__dirname+"/",Xy=function(e,r){var i=s4(e);return i?r?i:i.toString():(Zy||(Zy=e4),AP||(AP=require("path")),e=AP.normalize(e),Zy.readFileSync(e,r?null:"utf8"))},aP=function(e){var r=Xy(e,!0);return r.buffer||(r=new Uint8Array(r)),n4(r.buffer),r},process.argv.length>1&&(t4=process.argv[1].replace(/\\/g,"/")),oP=process.argv.slice(2),typeof sP!="undefined"&&(sP.exports=oe),r4=function(t){process.exit(t)},oe.inspect=function(){return"[Emscripten Module object]"});var $y=oe.print||console.log.bind(console),Di=oe.printErr||console.warn.bind(console);for(wA in kp)kp.hasOwnProperty(wA)&&(oe[wA]=kp[wA]);kp=null;oe.arguments&&(oP=oe.arguments);oe.thisProgram&&(t4=oe.thisProgram);oe.quit&&(r4=oe.quit);var Cxe=16;function mxe(t,e){return e||(e=Cxe),Math.ceil(t/e)*e}var Exe=0,Ixe=function(t){Exe=t},lP;oe.wasmBinary&&(lP=oe.wasmBinary);var Pst=oe.noExitRuntime||!0;typeof WebAssembly!="object"&&Gr("no native wasm support detected");function yxe(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return Zi[t>>0];case"i8":return Zi[t>>0];case"i16":return cP[t>>1];case"i32":return _e[t>>2];case"i64":return _e[t>>2];case"float":return o4[t>>2];case"double":return a4[t>>3];default:Gr("invalid type for getValue: "+e)}return null}var ew,A4=!1,wxe;function n4(t,e){t||Gr("Assertion failed: "+e)}function l4(t){var e=oe["_"+t];return n4(e,"Cannot call unknown function "+t+", make sure it is exported"),e}function vxe(t,e,r,i,n){var s={string:function(h){var p=0;if(h!=null&&h!==0){var d=(h.length<<2)+1;p=g4(d),u4(h,p,d)}return p},array:function(h){var p=g4(h.length);return Bxe(h,p),p}};function o(h){return e==="string"?c4(h):e==="boolean"?Boolean(h):h}var a=l4(t),l=[],c=0;if(i)for(var u=0;u=i);)++n;if(n-e>16&&t.subarray&&f4)return f4.decode(t.subarray(e,n));for(var s="";e>10,56320|c&1023)}}return s}function c4(t,e){return t?Zu($u,t,e):""}function tw(t,e,r,i){if(!(i>0))return 0;for(var n=r,s=r+i-1,o=0;o=55296&&a<=57343){var l=t.charCodeAt(++o);a=65536+((a&1023)<<10)|l&1023}if(a<=127){if(r>=s)break;e[r++]=a}else if(a<=2047){if(r+1>=s)break;e[r++]=192|a>>6,e[r++]=128|a&63}else if(a<=65535){if(r+2>=s)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|a&63}else{if(r+3>=s)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|a&63}}return e[r]=0,r-n}function u4(t,e,r){return tw(t,$u,e,r)}function rw(t){for(var e=0,r=0;r=55296&&i<=57343&&(i=65536+((i&1023)<<10)|t.charCodeAt(++r)&1023),i<=127?++e:i<=2047?e+=2:i<=65535?e+=3:e+=4}return e}function uP(t){var e=rw(t)+1,r=h4(e);return r&&tw(t,Zi,r,e),r}function Bxe(t,e){Zi.set(t,e)}function xxe(t,e){return t%e>0&&(t+=e-t%e),t}var gP,Zi,$u,cP,kxe,_e,Pxe,o4,a4;function p4(t){gP=t,oe.HEAP8=Zi=new Int8Array(t),oe.HEAP16=cP=new Int16Array(t),oe.HEAP32=_e=new Int32Array(t),oe.HEAPU8=$u=new Uint8Array(t),oe.HEAPU16=kxe=new Uint16Array(t),oe.HEAPU32=Pxe=new Uint32Array(t),oe.HEAPF32=o4=new Float32Array(t),oe.HEAPF64=a4=new Float64Array(t)}var Dst=oe.INITIAL_MEMORY||16777216,fP,d4=[],C4=[],m4=[],Dxe=!1;function Fxe(){if(oe.preRun)for(typeof oe.preRun=="function"&&(oe.preRun=[oe.preRun]);oe.preRun.length;)Rxe(oe.preRun.shift());hP(d4)}function Nxe(){Dxe=!0,!oe.noFSInit&&!y.init.initialized&&y.init(),BA.init(),hP(C4)}function Txe(){if(oe.postRun)for(typeof oe.postRun=="function"&&(oe.postRun=[oe.postRun]);oe.postRun.length;)Lxe(oe.postRun.shift());hP(m4)}function Rxe(t){d4.unshift(t)}function Mxe(t){C4.unshift(t)}function Lxe(t){m4.unshift(t)}var zl=0,pP=null,Dp=null;function Oxe(t){return t}function E4(t){zl++,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl)}function dP(t){if(zl--,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl),zl==0&&(pP!==null&&(clearInterval(pP),pP=null),Dp)){var e=Dp;Dp=null,e()}}oe.preloadedImages={};oe.preloadedAudios={};function Gr(t){oe.onAbort&&oe.onAbort(t),t+="",Di(t),A4=!0,wxe=1,t="abort("+t+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(t);throw e}var I4="data:application/octet-stream;base64,";function y4(t){return t.startsWith(I4)}var Rp="data:application/octet-stream;base64,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AkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAeNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4cDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEUNACADKQMYQv///////////wBWDQAgAykDGFANASADKAIgDQELIAMoAiRBDGpBEkEAEBQgA0J/NwMoDAELIAMoAiQtADVBAXEEQCADQn83AygMAQsCfyMAQRBrIgAgAygCJDYCDCAAKAIMLQA0QQFxCwRAIANCADcDKAwBCyADKQMYUARAIANCADcDKAwBCyADQgA3AxADQCADKQMQIAMpAxhUBEAgAyADKAIkIAMoAiAgAykDEKdqIAMpAxggAykDEH1BARAhIgI3AwggAkIAUwRAIAMoAiRBAToANSADKQMQUARAIANCfzcDKAwECyADIAMpAxA3AygMAwsgAykDCFAEQCADKAIkQQE6ADQFIAMgAykDCCADKQMQfDcDEAwCCwsLIAMgAykDEDcDKAsgAykDKCECIANBMGokACACCzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRC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AkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILUgECf0GQlwEoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNACAAPwBBEHRLBEAgABATRQ0BC0GQlwEgADYCACABDwtBtJsBQTA2AgBBfwuNBQEDfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAEQCABKAIMKAIAEDEaIAEoAgwoAgAQGwsgASgCDCgCHBAVIAEoAgwoAiAQJSABKAIMKAIkECUgASgCDCgCUCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCEARAIABBADYCCANAIAAoAgggACgCDCgCAEkEQCAAKAIMKAIQIAAoAghBAnRqKAIABEAgACgCDCgCECAAKAIIQQJ0aigCACEDIwBBEGsiAiQAIAIgAzYCDANAIAIoAgwEQCACIAIoAgwoAhg2AgggAigCDBAVIAIgAigCCDYCDAwBCwsgAkEQaiQACyAAIAAoAghBAWo2AggMAQsLIAAoAgwoAhAQFQsgACgCDBAVCyAAQRBqJAAgASgCDCgCQARAIAFCADcDAANAIAEpAwAgASgCDCkDMFQEQCABKAIMKAJAIAEpAwCnQQR0ahBiIAEgASkDAEIBfDcDAAwBCwsgASgCDCgCQBAVCyABQgA3AwADQCABKQMAIAEoAgwoAkStVARAIAEoAgwoAkwgASkDAKdBAnRqKAIAIQIjAEEQayIAJAAgACACNgIMIAAoAgxBAToAKAJ/IwBBEGsiAiAAKAIMQQxqNgIMIAIoAgwoAgBFCwRAIAAoAgxBDGpBCEEAEBQLIABBEGokACABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAkwQFSABKAIMKAJUIQIjAEEQayIAJAAgACACNgIMIAAoAgwEQCAAKAIMKAIIBEAgACgCDCgCDCAAKAIMKAIIEQIACyAAKAIMEBULIABBEGokACABKAIMQQhqEDcgASgCDBAVCyABQRBqJAALjw4BAX8jAEEQayIDJAAgAyAANgIMIAMgATYCCCADIAI2AgQgAygCCCEBIAMoAgQhAiMAQSBrIgAgAygCDDYCGCAAIAE2AhQgACACNgIQIAAgACgCGEEQdjYCDCAAIAAoAhhB//8DcTYCGAJAIAAoAhBBAUYEQCAAIAAoAhQtAAAgACgCGGo2AhggACgCGEHx/wNPBEAgACAAKAIYQfH/A2s2AhgLIAAgACgCGCAAKAIMajYCDCAAKAIMQfH/A08EQCAAIAAoAgxB8f8DazYCDAsgACAAKAIYIAAoAgxBEHRyNgIcDAELIAAoAhRFBEAgAEEBNgIcDAELIAAoAhBBEEkEQANAIAAgACgCECIBQQFrNgIQIAEEQCAAIAAoAhQiAUEBajYCFCAAIAEtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMDAELCyAAKAIYQfH/A08EQCAAIAAoAhhB8f8DazYCGAsgACAAKAIMQfH/A3A2AgwgACAAKAIYIAAoAgxBEHRyNgIcDAELA0AgACgCEEGwK08EQCAAIAAoAhBBsCtrNgIQIABB2wI2AggDQCAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAkgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQALIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAwgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAOIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA8gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFEEQajYCFCAAIAAoAghBAWsiATYCCCABDQALIAAgACgCGEHx/wNwNgIYIAAgACgCDEHx/wNwNgIMDAELCyAAKAIQBEADQCAAKAIQQRBPBEAgACAAKAIQQRBrNgIQIAAgACgCFC0AACAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQABIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAIgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AAyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAEIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAUgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAHIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAggACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAKIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAsgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQANIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA4gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIUQRBqNgIUDAELCwNAIAAgACgCECIBQQFrNgIQIAEEQCAAIAAoAhQiAUEBajYCFCAAIAEtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMDAELCyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAsgACAAKAIYIAAoAgxBEHRyNgIcCyAAKAIcIQAgA0EQaiQAIAALhAEBAX8jAEEQayIBJAAgASAANgIIIAFB2AAQGCIANgIEAkAgAEUEQCABQQA2AgwMAQsCQCABKAIIBEAgASgCBCABKAIIQdgAEBkaDAELIAEoAgQQTwsgASgCBEEANgIAIAEoAgRBAToABSABIAEoAgQ2AgwLIAEoAgwhACABQRBqJAAgAAtvAQF/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNgIQIAMgAygCGCADKAIQrRAeNgIMAkAgAygCDEUEQCADQX82AhwMAQsgAygCDCADKAIUIAMoAhAQGRogA0EANgIcCyADKAIcGiADQSBqJAALogEBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCDCAEKQMQECkiADYCBAJAIABFBEAgBCgCCEEOQQAQFCAEQQA2AhwMAQsgBCgCGCAEKAIEKAIEIAQpAxAgBCgCCBBhQQBIBEAgBCgCBBAWIARBADYCHAwBCyAEIAQoAgQ2AhwLIAQoAhwhACAEQSBqJAAgAAugAQEBfyMAQSBrIgMkACADIAA2AhQgAyABNgIQIAMgAjcDCCADIAMoAhA2AgQCQCADKQMIQghUBEAgA0J/NwMYDAELIwBBEGsiACADKAIUNgIMIAAoAgwoAgAhACADKAIEIAA2AgAjAEEQayIAIAMoAhQ2AgwgACgCDCgCBCEAIAMoAgQgADYCBCADQgg3AxgLIAMpAxghAiADQSBqJAAgAgs/AQF/IwBBEGsiAiAANgIMIAIgATYCCCACKAIMBEAgAigCDCACKAIIKAIANgIAIAIoAgwgAigCCCgCBDYCBAsLgwECA38BfgJAIABCgICAgBBUBEAgACEFDAELA0AgAUEBayIBIAAgAEIKgCIFQgp+fadBMHI6AAAgAEL/////nwFWIQIgBSEAIAINAAsLIAWnIgIEQANAIAFBAWsiASACIAJBCm4iA0EKbGtBMHI6AAAgAkEJSyEEIAMhAiAEDQALCyABC7wCAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCCAEKAIIRQRAIAQgBCgCGEEIajYCCAsCQCAEKQMQIAQoAhgpAzBaBEAgBCgCCEESQQAQFCAEQQA2AhwMAQsCQCAEKAIMQQhxRQRAIAQoAhgoAkAgBCkDEKdBBHRqKAIEDQELIAQoAhgoAkAgBCkDEKdBBHRqKAIARQRAIAQoAghBEkEAEBQgBEEANgIcDAILAkAgBCgCGCgCQCAEKQMQp0EEdGotAAxBAXFFDQAgBCgCDEEIcQ0AIAQoAghBF0EAEBQgBEEANgIcDAILIAQgBCgCGCgCQCAEKQMQp0EEdGooAgA2AhwMAQsgBCAEKAIYKAJAIAQpAxCnQQR0aigCBDYCHAsgBCgCHCEAIARBIGokACAAC9kIAQJ/IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDAJAIAQoAhhFBEAgBCgCFARAIAQoAhRBADYCAAsgBEGQ2QA2AhwMAQsgBCgCEEHAAHFFBEAgBCgCGCgCCEUEQCAEKAIYQQAQOhoLAkACQAJAIAQoAhBBgAFxRQ0AIAQoAhgoAghBAUYNACAEKAIYKAIIQQJHDQELIAQoAhgoAghBBEcNAQsgBCgCGCgCDEUEQCAEKAIYKAIAIQEgBCgCGC8BBCECIAQoAhhBEGohAyAEKAIMIQUjAEEwayIAJAAgACABNgIoIAAgAjYCJCAAIAM2AiAgACAFNgIcIAAgACgCKDYCGAJAIAAoAiRFBEAgACgCIARAIAAoAiBBADYCAAsgAEEANgIsDAELIABBATYCECAAQQA2AgwDQCAAKAIMIAAoAiRJBEAjAEEQayIBIAAoAhggACgCDGotAABBAXRBkNUAai8BADYCCAJAIAEoAghBgAFJBEAgAUEBNgIMDAELIAEoAghBgBBJBEAgAUECNgIMDAELIAEoAghBgIAESQRAIAFBAzYCDAwBCyABQQQ2AgwLIAAgASgCDCAAKAIQajYCECAAIAAoAgxBAWo2AgwMAQsLIAAgACgCEBAYIgE2AhQgAUUEQCAAKAIcQQ5BABAUIABBADYCLAwBCyAAQQA2AgggAEEANgIMA0AgACgCDCAAKAIkSQRAIAAoAhQgACgCCGohAiMAQRBrIgEgACgCGCAAKAIMai0AAEEBdEGQ1QBqLwEANgIIIAEgAjYCBAJAIAEoAghBgAFJBEAgASgCBCABKAIIOgAAIAFBATYCDAwBCyABKAIIQYAQSQRAIAEoAgQgASgCCEEGdkEfcUHAAXI6AAAgASgCBCABKAIIQT9xQYABcjoAASABQQI2AgwMAQsgASgCCEGAgARJBEAgASgCBCABKAIIQQx2QQ9xQeABcjoAACABKAIEIAEoAghBBnZBP3FBgAFyOgABIAEoAgQgASgCCEE/cUGAAXI6AAIgAUEDNgIMDAELIAEoAgQgASgCCEESdkEHcUHwAXI6AAAgASgCBCABKAIIQQx2QT9xQYABcjoAASABKAIEIAEoAghBBnZBP3FBgAFyOgACIAEoAgQgASgCCEE/cUGAAXI6AAMgAUEENgIMCyAAIAEoAgwgACgCCGo2AgggACAAKAIMQQFqNgIMDAELCyAAKAIUIAAoAhBBAWtqQQA6AAAgACgCIARAIAAoAiAgACgCEEEBazYCAAsgACAAKAIUNgIsCyAAKAIsIQEgAEEwaiQAIAEhACAEKAIYIAA2AgwgAEUEQCAEQQA2AhwMBAsLIAQoAhQEQCAEKAIUIAQoAhgoAhA2AgALIAQgBCgCGCgCDDYCHAwCCwsgBCgCFARAIAQoAhQgBCgCGC8BBDYCAAsgBCAEKAIYKAIANgIcCyAEKAIcIQAgBEEgaiQAIAALOQEBfyMAQRBrIgEgADYCDEEAIQAgASgCDC0AAEEBcQR/IAEoAgwpAxAgASgCDCkDCFEFQQALQQFxC5wIAQt/IABFBEAgARAYDwsgAUFATwRAQbSbAUEwNgIAQQAPCwJ/QRAgAUELakF4cSABQQtJGyEGIABBCGsiBSgCBCIJQXhxIQQCQCAJQQNxRQRAQQAgBkGAAkkNAhogBkEEaiAETQRAIAUhAiAEIAZrQZifASgCAEEBdE0NAgtBAAwCCyAEIAVqIQcCQCAEIAZPBEAgBCAGayIDQRBJDQEgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAiADQQNyNgIEIAcgBygCBEEBcjYCBCACIAMQrAEMAQsgB0HQmwEoAgBGBEBBxJsBKAIAIARqIgQgBk0NAiAFIAlBAXEgBnJBAnI2AgQgBSAGaiIDIAQgBmsiAkEBcjYCBEHEmwEgAjYCAEHQmwEgAzYCAAwBCyAHQcybASgCAEYEQEHAmwEoAgAgBGoiAyAGSQ0CAkAgAyAGayICQRBPBEAgBSAJQQFxIAZyQQJyNgIEIAUgBmoiBCACQQFyNgIEIAMgBWoiAyACNgIAIAMgAygCBEF+cTYCBAwBCyAFIAlBAXEgA3JBAnI2AgQgAyAFaiICIAIoAgRBAXI2AgRBACECQQAhBAtBzJsBIAQ2AgBBwJsBIAI2AgAMAQsgBygCBCIDQQJxDQEgA0F4cSAEaiIKIAZJDQEgCiAGayEMAkAgA0H/AU0EQCAHKAIIIgQgA0EDdiICQQN0QeCbAWpGGiAEIAcoAgwiA0YEQEG4mwFBuJsBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBygCGCELAkAgByAHKAIMIghHBEAgBygCCCICQcibASgCAEkaIAIgCDYCDCAIIAI2AggMAQsCQCAHQRRqIgQoAgAiAg0AIAdBEGoiBCgCACICDQBBACEIDAELA0AgBCEDIAIiCEEUaiIEKAIAIgINACAIQRBqIQQgCCgCECICDQALIANBADYCAAsgC0UNAAJAIAcgBygCHCIDQQJ0QeidAWoiAigCAEYEQCACIAg2AgAgCA0BQbybAUG8mwEoAgBBfiADd3E2AgAMAgsgC0EQQRQgCygCECAHRhtqIAg2AgAgCEUNAQsgCCALNgIYIAcoAhAiAgRAIAggAjYCECACIAg2AhgLIAcoAhQiAkUNACAIIAI2AhQgAiAINgIYCyAMQQ9NBEAgBSAJQQFxIApyQQJyNgIEIAUgCmoiAiACKAIEQQFyNgIEDAELIAUgCUEBcSAGckECcjYCBCAFIAZqIgMgDEEDcjYCBCAFIApqIgIgAigCBEEBcjYCBCADIAwQrAELIAUhAgsgAgsiAgRAIAJBCGoPCyABEBgiBUUEQEEADwsgBSAAQXxBeCAAQQRrKAIAIgJBA3EbIAJBeHFqIgIgASABIAJLGxAZGiAAEBUgBQvvAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIILQAoQQFxBEAgAUF/NgIMDAELIAEoAggoAiRBA0YEQCABKAIIQQxqQRdBABAUIAFBfzYCDAwBCwJAIAEoAggoAiAEQAJ/IwBBEGsiACABKAIINgIMIAAoAgwpAxhCwACDUAsEQCABKAIIQQxqQR1BABAUIAFBfzYCDAwDCwwBCyABKAIIKAIABEAgASgCCCgCABBJQQBIBEAgASgCCEEMaiABKAIIKAIAEBcgAUF/NgIMDAMLCyABKAIIQQBCAEEAECFCAFMEQCABKAIIKAIABEAgASgCCCgCABAxGgsgAUF/NgIMDAILCyABKAIIQQA6ADQgASgCCEEAOgA1IwBBEGsiACABKAIIQQxqNgIMIAAoAgwEQCAAKAIMQQA2AgAgACgCDEEANgIECyABKAIIIgAgACgCIEEBajYCICABQQA2AgwLIAEoAgwhACABQRBqJAAgAAt1AgF/AX4jAEEQayIBJAAgASAANgIEAkAgASgCBC0AKEEBcQRAIAFCfzcDCAwBCyABKAIEKAIgRQRAIAEoAgRBDGpBEkEAEBQgAUJ/NwMIDAELIAEgASgCBEEAQgBBBxAhNwMICyABKQMIIQIgAUEQaiQAIAILnQEBAX8jAEEQayIBIAA2AggCQAJAAkAgASgCCEUNACABKAIIKAIgRQ0AIAEoAggoAiQNAQsgAUEBNgIMDAELIAEgASgCCCgCHDYCBAJAAkAgASgCBEUNACABKAIEKAIAIAEoAghHDQAgASgCBCgCBEG0/gBJDQAgASgCBCgCBEHT/gBNDQELIAFBATYCDAwBCyABQQA2AgwLIAEoAgwLgAEBA38jAEEQayICIAA2AgwgAiABNgIIIAIoAghBCHYhASACKAIMKAIIIQMgAigCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAToAACACKAIIQf8BcSEBIAIoAgwoAgghAyACKAIMIgIoAhQhACACIABBAWo2AhQgACADaiABOgAAC5kFAQF/IwBBQGoiBCQAIAQgADYCOCAEIAE3AzAgBCACNgIsIAQgAzYCKCAEQcgAEBgiADYCJAJAIABFBEAgBEEANgI8DAELIAQoAiRCADcDOCAEKAIkQgA3AxggBCgCJEIANwMwIAQoAiRBADYCACAEKAIkQQA2AgQgBCgCJEIANwMIIAQoAiRCADcDECAEKAIkQQA2AiggBCgCJEIANwMgAkAgBCkDMFAEQEEIEBghACAEKAIkIAA2AgQgAEUEQCAEKAIkEBUgBCgCKEEOQQAQFCAEQQA2AjwMAwsgBCgCJCgCBEIANwMADAELIAQoAiQgBCkDMEEAEMEBQQFxRQRAIAQoAihBDkEAEBQgBCgCJBAzIARBADYCPAwCCyAEQgA3AwggBEIANwMYIARCADcDEANAIAQpAxggBCkDMFQEQCAEKAI4IAQpAxinQQR0aikDCFBFBEAgBCgCOCAEKQMYp0EEdGooAgBFBEAgBCgCKEESQQAQFCAEKAIkEDMgBEEANgI8DAULIAQoAiQoAgAgBCkDEKdBBHRqIAQoAjggBCkDGKdBBHRqKAIANgIAIAQoAiQoAgAgBCkDEKdBBHRqIAQoAjggBCkDGKdBBHRqKQMINwMIIAQoAiQoAgQgBCkDGKdBA3RqIAQpAwg3AwAgBCAEKAI4IAQpAxinQQR0aikDCCAEKQMIfDcDCCAEIAQpAxBCAXw3AxALIAQgBCkDGEIBfDcDGAwBCwsgBCgCJCAEKQMQNwMIIAQoAiQgBCgCLAR+QgAFIAQoAiQpAwgLNwMYIAQoAiQoAgQgBCgCJCkDCKdBA3RqIAQpAwg3AwAgBCgCJCAEKQMINwMwCyAEIAQoAiQ2AjwLIAQoAjwhACAEQUBrJAAgAAueAQEBfyMAQSBrIgQkACAEIAA2AhggBCABNwMQIAQgAjYCDCAEIAM2AgggBCAEKAIYIAQpAxAgBCgCDCAEKAIIEEUiADYCBAJAIABFBEAgBEEANgIcDAELIAQgBCgCBCgCMEEAIAQoAgwgBCgCCBBGIgA2AgAgAEUEQCAEQQA2AhwMAQsgBCAEKAIANgIcCyAEKAIcIQAgBEEgaiQAIAAL8QEBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADoABCABKAIMQQA6AAUgASgCDEEBOgAGIAEoAgxBvwY7AQggASgCDEEKOwEKIAEoAgxBADsBDCABKAIMQX82AhAgASgCDEEANgIUIAEoAgxBADYCGCABKAIMQgA3AyAgASgCDEIANwMoIAEoAgxBADYCMCABKAIMQQA2AjQgASgCDEEANgI4IAEoAgxBADYCPCABKAIMQQA7AUAgASgCDEGAgNiNeDYCRCABKAIMQgA3A0ggASgCDEEAOwFQIAEoAgxBADsBUiABKAIMQQA2AlQL0hMBAX8jAEGwAWsiAyQAIAMgADYCqAEgAyABNgKkASADIAI2AqABIANBADYCkAEgAyADKAKkASgCMEEAEDo2ApQBIAMgAygCpAEoAjhBABA6NgKYAQJAAkACQAJAIAMoApQBQQJGBEAgAygCmAFBAUYNAQsgAygClAFBAUYEQCADKAKYAUECRg0BCyADKAKUAUECRw0BIAMoApgBQQJHDQELIAMoAqQBIgAgAC8BDEGAEHI7AQwMAQsgAygCpAEiACAALwEMQf/vA3E7AQwgAygClAFBAkYEQCADQfXgASADKAKkASgCMCADKAKoAUEIahCCATYCkAEgAygCkAFFBEAgA0F/NgKsAQwDCwsCQCADKAKgAUGAAnENACADKAKYAUECRw0AIANB9cYBIAMoAqQBKAI4IAMoAqgBQQhqEIIBNgJIIAMoAkhFBEAgAygCkAEQIyADQX82AqwBDAMLIAMoAkggAygCkAE2AgAgAyADKAJINgKQAQsLAkAgAygCpAEvAVJFBEAgAygCpAEiACAALwEMQf7/A3E7AQwMAQsgAygCpAEiACAALwEMQQFyOwEMCyADIAMoAqQBIAMoAqABEF5BAXE6AIYBIAMgAygCoAFBgApxQYAKRwR/IAMtAIYBBUEBC0EBcToAhwEgAwJ/QQEgAygCpAEvAVJBgQJGDQAaQQEgAygCpAEvAVJBggJGDQAaIAMoAqQBLwFSQYMCRgtBAXE6AIUBIAMtAIcBQQFxBEAgAyADQSBqQhwQKTYCHCADKAIcRQRAIAMoAqgBQQhqQQ5BABAUIAMoApABECMgA0F/NgKsAQwCCwJAIAMoAqABQYACcQRAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9YDQILIAMoAhwgAygCpAEpAygQLSADKAIcIAMoAqQBKQMgEC0MAQsCQAJAIAMoAqABQYAIcQ0AIAMoAqQBKQMgQv////8PVg0AIAMoAqQBKQMoQv////8PVg0AIAMoAqQBKQNIQv////8PWA0BCyADKAKkASkDKEL/////D1oEQCADKAIcIAMoAqQBKQMoEC0LIAMoAqQBKQMgQv////8PWgRAIAMoAhwgAygCpAEpAyAQLQsgAygCpAEpA0hC/////w9aBEAgAygCHCADKAKkASkDSBAtCwsLAn8jAEEQayIAIAMoAhw2AgwgACgCDC0AAEEBcUULBEAgAygCqAFBCGpBFEEAEBQgAygCHBAWIAMoApABECMgA0F/NgKsAQwCCyADQQECfyMAQRBrIgAgAygCHDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALp0H//wNxCyADQSBqQYAGEFE2AowBIAMoAhwQFiADKAKMASADKAKQATYCACADIAMoAowBNgKQAQsgAy0AhQFBAXEEQCADIANBFWpCBxApNgIQIAMoAhBFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILIAMoAhBBAhAfIAMoAhBBvRJBAhBAIAMoAhAgAygCpAEvAVJB/wFxEI4BIAMoAhAgAygCpAEoAhBB//8DcRAfAn8jAEEQayIAIAMoAhA2AgwgACgCDC0AAEEBcUULBEAgAygCqAFBCGpBFEEAEBQgAygCEBAWIAMoApABECMgA0F/NgKsAQwCCyADQYGyAkEHIANBFWpBgAYQUTYCDCADKAIQEBYgAygCDCADKAKQATYCACADIAMoAgw2ApABCyADIANB0ABqQi4QKSIANgJMIABFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAELIAMoAkxB8RJB9hIgAygCoAFBgAJxG0EEEEAgAygCoAFBgAJxRQRAIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCAtB//8DcRAfCyADKAJMIAMtAIYBQQFxBH9BLQUgAygCpAEvAQoLQf//A3EQHyADKAJMIAMoAqQBLwEMEB8CQCADLQCFAUEBcQRAIAMoAkxB4wAQHwwBCyADKAJMIAMoAqQBKAIQQf//A3EQHwsgAygCpAEoAhQgA0GeAWogA0GcAWoQgQEgAygCTCADLwGeARAfIAMoAkwgAy8BnAEQHwJAAkAgAy0AhQFBAXFFDQAgAygCpAEpAyhCFFoNACADKAJMQQAQIAwBCyADKAJMIAMoAqQBKAIYECALAkACQCADKAKgAUGAAnFBgAJHDQAgAygCpAEpAyBC/////w9UBEAgAygCpAEpAyhC/////w9UDQELIAMoAkxBfxAgIAMoAkxBfxAgDAELAkAgAygCpAEpAyBC/////w9UBEAgAygCTCADKAKkASkDIKcQIAwBCyADKAJMQX8QIAsCQCADKAKkASkDKEL/////D1QEQCADKAJMIAMoAqQBKQMopxAgDAELIAMoAkxBfxAgCwsgAygCTCADKAKkASgCMBBTQf//A3EQHyADIAMoAqQBKAI0IAMoAqABEIYBQf//A3EgAygCkAFBgAYQhgFB//8DcWo2AogBIAMoAkwgAygCiAFB//8DcRAfIAMoAqABQYACcUUEQCADKAJMIAMoAqQBKAI4EFNB//8DcRAfIAMoAkwgAygCpAEoAjxB//8DcRAfIAMoAkwgAygCpAEvAUAQHyADKAJMIAMoAqQBKAJEECACQCADKAKkASkDSEL/////D1QEQCADKAJMIAMoAqQBKQNIpxAgDAELIAMoAkxBfxAgCwsCfyMAQRBrIgAgAygCTDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAJMEBYgAygCkAEQIyADQX82AqwBDAELIAMoAqgBIANB0ABqAn4jAEEQayIAIAMoAkw2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACwsQNUEASARAIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCTBAWIAMoAqQBKAIwBEAgAygCqAEgAygCpAEoAjAQigFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABBEAgAygCqAEgAygCkAFBgAYQhQFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABECMgAygCpAEoAjQEQCADKAKoASADKAKkASgCNCADKAKgARCFAUEASARAIANBfzYCrAEMAgsLIAMoAqABQYACcUUEQCADKAKkASgCOARAIAMoAqgBIAMoAqQBKAI4EIoB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HCAAIAAoAhRBAWo2AhQMAQsLIAAoAggQR0EBcUUEQCAAKAIgQRRBABAUIAAoAggQFiAAQX82AiwMAQsgACgCCBAWIAAgACgCHDYCLAsgACgCLCECIABBMGokACADIAIiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFCADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC20BAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMAkAgBCgCGEUEQCAEQQA2AhwMAQsgBCAEKAIUIAQoAhAgBCgCDCAEKAIYQQhqEJIBNgIcCyAEKAIcIQAgBEEgaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAhGiABKAIMQQA2AiQLIAFBEGokAAumAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIIKAIABEAgAigCCCgCACACKAIEEGhBAEgEQCACKAIIQQxqIAIoAggoAgAQFyACQX82AgwMAgsLIAIoAgggAkEEakIEQRMQIUIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAuNCAIBfwF+IwBBkAFrIgMkACADIAA2AoQBIAMgATYCgAEgAyACNgJ8IAMQTwJAIAMoAoABKQMIQgBSBEAgAyADKAKAASgCACgCACkDSDcDYCADIAMoAoABKAIAKAIAKQNINwNoDAELIANCADcDYCADQgA3A2gLIANCADcDcAJAA0AgAykDcCADKAKAASkDCFQEQCADKAKAASgCACADKQNwp0EEdGooAgApA0ggAykDaFQEQCADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSDcDaAsgAykDaCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAyADKAKAASgCACADKQNwp0EEdGooAgApA0ggAygCgAEoAgAgAykDcKdBBHRqKAIAKQMgfCADKAKAASgCACADKQNwp0EEdGooAgAoAjAQU0H//wNxrXxCHnw3A1ggAykDWCADKQNgVgRAIAMgAykDWDcDYAsgAykDYCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAygChAEoAgAgAygCgAEoAgAgAykDcKdBBHRqKAIAKQNIQQAQJ0EASARAIAMoAnwgAygChAEoAgAQFyADQn83A4gBDAMLIAMgAygChAEoAgBBAEEBIAMoAnwQxgFCf1EEQCADEF0gA0J/NwOIAQwDCwJ/IAMoAoABKAIAIAMpA3CnQQR0aigCACEBIwBBEGsiACQAIAAgATYCCCAAIAM2AgQCQAJAAkAgACgCCC8BCiAAKAIELwEKSA0AIAAoAggoAhAgACgCBCgCEEcNACAAKAIIKAIUIAAoAgQoAhRHDQAgACgCCCgCMCAAKAIEKAIwEIsBDQELIABBfzYCDAwBCwJAAkAgACgCCCgCGCAAKAIEKAIYRw0AIAAoAggpAyAgACgCBCkDIFINACAAKAIIKQMoIAAoAgQpAyhRDQELAkACQCAAKAIELwEMQQhxRQ0AIAAoAgQoAhgNACAAKAIEKQMgQgBSDQAgACgCBCkDKFANAQsgAEF/NgIMDAILCyAAQQA2AgwLIAAoAgwhASAAQRBqJAAgAQsEQCADKAJ8QRVBABAUIAMQXSADQn83A4gBDAMFIAMoAoABKAIAIAMpA3CnQQR0aigCACgCNCADKAI0EIkBIQAgAygCgAEoAgAgAykDcKdBBHRqKAIAIAA2AjQgAygCgAEoAgAgAykDcKdBBHRqKAIAQQE6AAQgA0EANgI0IAMQXSADIAMpA3BCAXw3A3AMAgsACwsgAwJ+IAMpA2AgAykDaH1C////////////AFQEQCADKQNgIAMpA2h9DAELQv///////////wALNwOIAQsgAykDiAEhBCADQZABaiQAIAQL1AQBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAygCECEBIwBBEGsiACQAIAAgATYCCCAAQdgAEBg2AgQCQCAAKAIERQRAIAAoAghBDkEAEBQgAEEANgIMDAELIAAoAgghAiMAQRBrIgEkACABIAI2AgggAUEYEBgiAjYCBAJAIAJFBEAgASgCCEEOQQAQFCABQQA2AgwMAQsgASgCBEEANgIAIAEoAgRCADcDCCABKAIEQQA2AhAgASABKAIENgIMCyABKAIMIQIgAUEQaiQAIAAoAgQgAjYCUCACRQRAIAAoAgQQFSAAQQA2AgwMAQsgACgCBEEANgIAIAAoAgRBADYCBCMAQRBrIgEgACgCBEEIajYCDCABKAIMQQA2AgAgASgCDEEANgIEIAEoAgxBADYCCCAAKAIEQQA2AhggACgCBEEANgIUIAAoAgRBADYCHCAAKAIEQQA2AiQgACgCBEEANgIgIAAoAgRBADoAKCAAKAIEQgA3AzggACgCBEIANwMwIAAoAgRBADYCQCAAKAIEQQA2AkggACgCBEEANgJEIAAoAgRBADYCTCAAKAIEQQA2AlQgACAAKAIENgIMCyAAKAIMIQEgAEEQaiQAIAMgASIANgIMAkAgAEUEQCADQQA2AhwMAQsgAygCDCADKAIYNgIAIAMoAgwgAygCFDYCBCADKAIUQRBxBEAgAygCDCIAIAAoAhRBAnI2AhQgAygCDCIAIAAoAhhBAnI2AhgLIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC9UBAQF/IwBBIGsiBCQAIAQgADYCGCAEIAE3AxAgBCACNgIMIAQgAzYCCAJAAkAgBCkDEEL///////////8AVwRAIAQpAxBCgICAgICAgICAf1kNAQsgBCgCCEEEQT0QFCAEQX82AhwMAQsCfyAEKQMQIQEgBCgCDCEAIAQoAhgiAigCTEF/TARAIAIgASAAEKABDAELIAIgASAAEKABC0EASARAIAQoAghBBEG0mwEoAgAQFCAEQX82AhwMAQsgBEEANgIcCyAEKAIcIQAgBEEgaiQAIAALJABBACAAEAUiACAAQRtGGyIABH9BtJsBIAA2AgBBAAVBAAsaC3ABAX8jAEEQayIDJAAgAwJ/IAFBwABxRQRAQQAgAUGAgIQCcUGAgIQCRw0BGgsgAyACQQRqNgIMIAIoAgALNgIAIAAgAUGAgAJyIAMQECIAQYFgTwRAQbSbAUEAIABrNgIAQX8hAAsgA0EQaiQAIAALMwEBfwJ/IAAQByIBQWFGBEAgABARIQELIAFBgWBPCwR/QbSbAUEAIAFrNgIAQX8FIAELC2kBAn8CQCAAKAIUIAAoAhxNDQAgAEEAQQAgACgCJBEBABogACgCFA0AQX8PCyAAKAIEIgEgACgCCCICSQRAIAAgASACa6xBASAAKAIoEQ8AGgsgAEEANgIcIABCADcDECAAQgA3AgRBAAvaAwEGfyMAQRBrIgUkACAFIAI2AgwjAEGgAWsiBCQAIARBCGpBkIcBQZABEBkaIAQgADYCNCAEIAA2AhwgBEF+IABrIgNB/////wcgA0H/////B0kbIgY2AjggBCAAIAZqIgA2AiQgBCAANgIYIARBCGohACMAQdABayIDJAAgAyACNgLMASADQaABakEAQSgQMiADIAMoAswBNgLIAQJAQQAgASADQcgBaiADQdAAaiADQaABahBxQQBIDQAgACgCTEEATiEHIAAoAgAhAiAALABKQQBMBEAgACACQV9xNgIACyACQSBxIQgCfyAAKAIwBEAgACABIANByAFqIANB0ABqIANBoAFqEHEMAQsgAEHQADYCMCAAIANB0ABqNgIQIAAgAzYCHCAAIAM2AhQgACgCLCECIAAgAzYCLCAAIAEgA0HIAWogA0HQAGogA0GgAWoQcSACRQ0AGiAAQQBBACAAKAIkEQEAGiAAQQA2AjAgACACNgIsIABBADYCHCAAQQA2AhAgACgCFBogAEEANgIUQQALGiAAIAAoAgAgCHI2AgAgB0UNAAsgA0HQAWokACAGBEAgBCgCHCIAIAAgBCgCGEZrQQA6AAALIARBoAFqJAAgBUEQaiQAC4wSAg9/AX4jAEHQAGsiBSQAIAUgATYCTCAFQTdqIRMgBUE4aiEQQQAhAQNAAkAgDUEASA0AQf////8HIA1rIAFIBEBBtJsBQT02AgBBfyENDAELIAEgDWohDQsgBSgCTCIHIQECQAJAAkACQAJAAkACQAJAIAUCfwJAIActAAAiBgRAA0ACQAJAIAZB/wFxIgZFBEAgASEGDAELIAZBJUcNASABIQYDQCABLQABQSVHDQEgBSABQQJqIgg2AkwgBkEBaiEGIAEtAAIhDiAIIQEgDkElRg0ACwsgBiAHayEBIAAEQCAAIAcgARAiCyABDQ0gBSgCTCEBIAUoAkwsAAFBMGtBCk8NAyABLQACQSRHDQMgASwAAUEwayEPQQEhESABQQNqDAQLIAUgAUEBaiIINgJMIAEtAAEhBiAIIQEMAAsACyANIQsgAA0IIBFFDQJBASEBA0AgBCABQQJ0aigCACIABEAgAyABQQN0aiAAIAIQqAFBASELIAFBAWoiAUEKRw0BDAoLC0EBIQsgAUEKTw0IA0AgBCABQQJ0aigCAA0IIAFBAWoiAUEKRw0ACwwIC0F/IQ8gAUEBagsiATYCTEEAIQgCQCABLAAAIgxBIGsiBkEfSw0AQQEgBnQiBkGJ0QRxRQ0AA0ACQCAFIAFBAWoiCDYCTCABLAABIgxBIGsiAUEgTw0AQQEgAXQiAUGJ0QRxRQ0AIAEgBnIhBiAIIQEMAQsLIAghASAGIQgLAkAgDEEqRgRAIAUCfwJAIAEsAAFBMGtBCk8NACAFKAJMIgEtAAJBJEcNACABLAABQQJ0IARqQcABa0EKNgIAIAEsAAFBA3QgA2pBgANrKAIAIQpBASERIAFBA2oMAQsgEQ0IQQAhEUEAIQogAARAIAIgAigCACIBQQRqNgIAIAEoAgAhCgsgBSgCTEEBagsiATYCTCAKQX9KDQFBACAKayEKIAhBgMAAciEIDAELIAVBzABqEKcBIgpBAEgNBiAFKAJMIQELQX8hCQJAIAEtAABBLkcNACABLQABQSpGBEACQCABLAACQTBrQQpPDQAgBSgCTCIBLQADQSRHDQAgASwAAkECdCAEakHAAWtBCjYCACABLAACQQN0IANqQYADaygCACEJIAUgAUEEaiIBNgJMDAILIBENByAABH8gAiACKAIAIgFBBGo2AgAgASgCAAVBAAshCSAFIAUoAkxBAmoiATYCTAwBCyAFIAFBAWo2AkwgBUHMAGoQpwEhCSAFKAJMIQELQQAhBgNAIAYhEkF/IQsgASwAAEHBAGtBOUsNByAFIAFBAWoiDDYCTCABLAAAIQYgDCEBIAYgEkE6bGpB74IBai0AACIGQQFrQQhJDQALIAZBE0YNAiAGRQ0GIA9BAE4EQCAEIA9BAnRqIAY2AgAgBSADIA9BA3RqKQMANwNADAQLIAANAQtBACELDAULIAVBQGsgBiACEKgBIAUoAkwhDAwCCyAPQX9KDQMLQQAhASAARQ0ECyAIQf//e3EiDiAIIAhBgMAAcRshBkEAIQtBpAghDyAQIQgCQAJAAkACfwJAAkACQAJAAn8CQAJAAkACQAJAAkACQCAMQQFrLAAAIgFBX3EgASABQQ9xQQNGGyABIBIbIgFB2ABrDiEEEhISEhISEhIOEg8GDg4OEgYSEhISAgUDEhIJEgESEgQACwJAIAFBwQBrDgcOEgsSDg4OAAsgAUHTAEYNCQwRCyAFKQNAIRRBpAgMBQtBACEBAkACQAJAAkACQAJAAkAgEkH/AXEOCAABAgMEFwUGFwsgBSgCQCANNgIADBYLIAUoAkAgDTYCAAwVCyAFKAJAIA2sNwMADBQLIAUoAkAgDTsBAAwTCyAFKAJAIA06AAAMEgsgBSgCQCANNgIADBELIAUoAkAgDaw3AwAMEAsgCUEIIAlBCEsbIQkgBkEIciEGQfgAIQELIBAhByABQSBxIQ4gBSkDQCIUUEUEQANAIAdBAWsiByAUp0EPcUGAhwFqLQAAIA5yOgAAIBRCD1YhDCAUQgSIIRQgDA0ACwsgBSkDQFANAyAGQQhxRQ0DIAFBBHZBpAhqIQ9BAiELDAMLIBAhASAFKQNAIhRQRQRAA0AgAUEBayIBIBSnQQdxQTByOgAAIBRCB1YhByAUQgOIIRQgBw0ACwsgASEHIAZBCHFFDQIgCSAQIAdrIgFBAWogASAJSBshCQwCCyAFKQNAIhRCf1cEQCAFQgAgFH0iFDcDQEEBIQtBpAgMAQsgBkGAEHEEQEEBIQtBpQgMAQtBpghBpAggBkEBcSILGwshDyAUIBAQRCEHCyAGQf//e3EgBiAJQX9KGyEGAkAgBSkDQCIUQgBSDQAgCQ0AQQAhCSAQIQcMCgsgCSAUUCAQIAdraiIBIAEgCUgbIQkMCQsgBSgCQCIBQdgSIAEbIgdBACAJEKsBIgEgByAJaiABGyEIIA4hBiABIAdrIAkgARshCQwICyAJBEAgBSgCQAwCC0EAIQEgAEEgIApBACAGECYMAgsgBUEANgIMIAUgBSkDQD4CCCAFIAVBCGo2AkBBfyEJIAVBCGoLIQhBACEBAkADQCAIKAIAIgdFDQECQCAFQQRqIAcQqgEiB0EASCIODQAgByAJIAFrSw0AIAhBBGohCCAJIAEgB2oiAUsNAQwCCwtBfyELIA4NBQsgAEEgIAogASAGECYgAUUEQEEAIQEMAQtBACEIIAUoAkAhDANAIAwoAgAiB0UNASAFQQRqIAcQqgEiByAIaiIIIAFKDQEgACAFQQRqIAcQIiAMQQRqIQwgASAISw0ACwsgAEEgIAogASAGQYDAAHMQJiAKIAEgASAKSBshAQwFCyAAIAUrA0AgCiAJIAYgAUEXERkAIQEMBAsgBSAFKQNAPAA3QQEhCSATIQcgDiEGDAILQX8hCwsgBUHQAGokACALDwsgAEEgIAsgCCAHayIOIAkgCSAOSBsiDGoiCCAKIAggCkobIgEgCCAGECYgACAPIAsQIiAAQTAgASAIIAZBgIAEcxAmIABBMCAMIA5BABAmIAAgByAOECIgAEEgIAEgCCAGQYDAAHMQJgwACwALkAIBA38CQCABIAIoAhAiBAR/IAQFQQAhBAJ/IAIgAi0ASiIDQQFrIANyOgBKIAIoAgAiA0EIcQRAIAIgA0EgcjYCAEF/DAELIAJCADcCBCACIAIoAiwiAzYCHCACIAM2AhQgAiADIAIoAjBqNgIQQQALDQEgAigCEAsgAigCFCIFa0sEQCACIAAgASACKAIkEQEADwsCfyACLABLQX9KBEAgASEEA0AgASAEIgNFDQIaIAAgA0EBayIEai0AAEEKRw0ACyACIAAgAyACKAIkEQEAIgQgA0kNAiAAIANqIQAgAigCFCEFIAEgA2sMAQsgAQshBCAFIAAgBBAZGiACIAIoAhQgBGo2AhQgASEECyAEC0gCAX8BfiMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBCADKAIMQQhqEFchBCADQRBqJAAgBAt3AQF/IwBBEGsiASAANgIIIAFChSo3AwACQCABKAIIRQRAIAFBADYCDAwBCwNAIAEoAggtAAAEQCABIAEoAggtAACtIAEpAwBCIX58Qv////8PgzcDACABIAEoAghBAWo2AggMAQsLIAEgASkDAD4CDAsgASgCDAuHBQEBfyMAQTBrIgUkACAFIAA2AiggBSABNgIkIAUgAjcDGCAFIAM2AhQgBSAENgIQAkACQAJAIAUoAihFDQAgBSgCJEUNACAFKQMYQv///////////wBYDQELIAUoAhBBEkEAEBQgBUEAOgAvDAELIAUoAigoAgBFBEAgBSgCKEGAAiAFKAIQEFlBAXFFBEAgBUEAOgAvDAILCyAFIAUoAiQQdDYCDCAFIAUoAgwgBSgCKCgCAHA2AgggBSAFKAIoKAIQIAUoAghBAnRqKAIANgIEA0ACQCAFKAIERQ0AAkAgBSgCBCgCHCAFKAIMRw0AIAUoAiQgBSgCBCgCABBaDQACQAJAIAUoAhRBCHEEQCAFKAIEKQMIQn9SDQELIAUoAgQpAxBCf1ENAQsgBSgCEEEKQQAQFCAFQQA6AC8MBAsMAQsgBSAFKAIEKAIYNgIEDAELCyAFKAIERQRAIAVBIBAYIgA2AgQgAEUEQCAFKAIQQQ5BABAUIAVBADoALwwCCyAFKAIEIAUoAiQ2AgAgBSgCBCAFKAIoKAIQIAUoAghBAnRqKAIANgIYIAUoAigoAhAgBSgCCEECdGogBSgCBDYCACAFKAIEIAUoAgw2AhwgBSgCBEJ/NwMIIAUoAigiACAAKQMIQgF8NwMIAkAgBSgCKCIAKQMIuiAAKAIAuEQAAAAAAADoP6JkRQ0AIAUoAigoAgBBgICAgHhPDQAgBSgCKCAFKAIoKAIAQQF0IAUoAhAQWUEBcUUEQCAFQQA6AC8MAwsLCyAFKAIUQQhxBEAgBSgCBCAFKQMYNwMICyAFKAIEIAUpAxg3AxAgBUEBOgAvCyAFLQAvQQFxIQAgBUEwaiQAIAALWQIBfwF+AkACf0EAIABFDQAaIACtIAGtfiIDpyICIAAgAXJBgIAESQ0AGkF/IAIgA0IgiKcbCyICEBgiAEUNACAAQQRrLQAAQQNxRQ0AIABBACACEDILIAAL1BEBAX8jAEGwAWsiBiQAIAYgADYCqAEgBiABNgKkASAGIAI2AqABIAYgAzYCnAEgBiAENgKYASAGIAU2ApQBIAZBADYCkAEDQCAGKAKQAUEPS0UEQCAGQSBqIAYoApABQQF0akEAOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFPRQRAIAZBIGogBigCpAEgBigCjAFBAXRqLwEAQQF0aiIAIAAvAQBBAWo7AQAgBiAGKAKMAUEBajYCjAEMAQsLIAYgBigCmAEoAgA2AoABIAZBDzYChAEDQAJAIAYoAoQBQQFJDQAgBkEgaiAGKAKEAUEBdGovAQANACAGIAYoAoQBQQFrNgKEAQwBCwsgBigCgAEgBigChAFLBEAgBiAGKAKEATYCgAELAkAgBigChAFFBEAgBkHAADoAWCAGQQE6AFkgBkEAOwFaIAYoApwBIgEoAgAhACABIABBBGo2AgAgACAGQdgAaigBADYBACAGKAKcASIBKAIAIQAgASAAQQRqNgIAIAAgBkHYAGooAQA2AQAgBigCmAFBATYCACAGQQA2AqwBDAELIAZBATYCiAEDQAJAIAYoAogBIAYoAoQBTw0AIAZBIGogBigCiAFBAXRqLwEADQAgBiAGKAKIAUEBajYCiAEMAQsLIAYoAoABIAYoAogBSQRAIAYgBigCiAE2AoABCyAGQQE2AnQgBkEBNgKQAQNAIAYoApABQQ9NBEAgBiAGKAJ0QQF0NgJ0IAYgBigCdCAGQSBqIAYoApABQQF0ai8BAGs2AnQgBigCdEEASARAIAZBfzYCrAEMAwUgBiAGKAKQAUEBajYCkAEMAgsACwsCQCAGKAJ0QQBMDQAgBigCqAEEQCAGKAKEAUEBRg0BCyAGQX82AqwBDAELIAZBADsBAiAGQQE2ApABA0AgBigCkAFBD09FBEAgBigCkAFBAWpBAXQgBmogBigCkAFBAXQgBmovAQAgBkEgaiAGKAKQAUEBdGovAQBqOwEAIAYgBigCkAFBAWo2ApABDAELCyAGQQA2AowBA0AgBigCjAEgBigCoAFJBEAgBigCpAEgBigCjAFBAXRqLwEABEAgBigClAEhASAGKAKkASAGKAKMASICQQF0ai8BAEEBdCAGaiIDLwEAIQAgAyAAQQFqOwEAIABB//8DcUEBdCABaiACOwEACyAGIAYoAowBQQFqNgKMAQwBCwsCQAJAAkACQCAGKAKoAQ4CAAECCyAGIAYoApQBIgA2AkwgBiAANgJQIAZBFDYCSAwCCyAGQYDwADYCUCAGQcDwADYCTCAGQYECNgJIDAELIAZBgPEANgJQIAZBwPEANgJMIAZBADYCSAsgBkEANgJsIAZBADYCjAEgBiAGKAKIATYCkAEgBiAGKAKcASgCADYCVCAGIAYoAoABNgJ8IAZBADYCeCAGQX82AmAgBkEBIAYoAoABdDYCcCAGIAYoAnBBAWs2AlwCQAJAIAYoAqgBQQFGBEAgBigCcEHUBksNAQsgBigCqAFBAkcNASAGKAJwQdAETQ0BCyAGQQE2AqwBDAELA0AgBiAGKAKQASAGKAJ4azoAWQJAIAYoAkggBigClAEgBigCjAFBAXRqLwEAQQFqSwRAIAZBADoAWCAGIAYoApQBIAYoAowBQQF0ai8BADsBWgwBCwJAIAYoApQBIAYoAowBQQF0ai8BACAGKAJITwRAIAYgBigCTCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOgBYIAYgBigCUCAGKAKUASAGKAKMAUEBdGovAQAgBigCSGtBAXRqLwEAOwFaDAELIAZB4AA6AFggBkEAOwFaCwsgBkEBIAYoApABIAYoAnhrdDYCaCAGQQEgBigCfHQ2AmQgBiAGKAJkNgKIAQNAIAYgBigCZCAGKAJoazYCZCAGKAJUIAYoAmQgBigCbCAGKAJ4dmpBAnRqIAZB2ABqKAEANgEAIAYoAmQNAAsgBkEBIAYoApABQQFrdDYCaANAIAYoAmwgBigCaHEEQCAGIAYoAmhBAXY2AmgMAQsLAkAgBigCaARAIAYgBigCbCAGKAJoQQFrcTYCbCAGIAYoAmggBigCbGo2AmwMAQsgBkEANgJsCyAGIAYoAowBQQFqNgKMASAGQSBqIAYoApABQQF0aiIBLwEAQQFrIQAgASAAOwEAAkAgAEH//wNxRQRAIAYoApABIAYoAoQBRg0BIAYgBigCpAEgBigClAEgBigCjAFBAXRqLwEAQQF0ai8BADYCkAELAkAgBigCkAEgBigCgAFNDQAgBigCYCAGKAJsIAYoAlxxRg0AIAYoAnhFBEAgBiAGKAKAATYCeAsgBiAGKAJUIAYoAogBQQJ0ajYCVCAGIAYoApABIAYoAnhrNgJ8IAZBASAGKAJ8dDYCdANAAkAgBigChAEgBigCfCAGKAJ4ak0NACAGIAYoAnQgBkEgaiAGKAJ8IAYoAnhqQQF0ai8BAGs2AnQgBigCdEEATA0AIAYgBigCfEEBajYCfCAGIAYoAnRBAXQ2AnQMAQsLIAYgBigCcEEBIAYoAnx0ajYCcAJAAkAgBigCqAFBAUYEQCAGKAJwQdQGSw0BCyAGKAKoAUECRw0BIAYoAnBB0ARNDQELIAZBATYCrAEMBAsgBiAGKAJsIAYoAlxxNgJgIAYoApwBKAIAIAYoAmBBAnRqIAYoAnw6AAAgBigCnAEoAgAgBigCYEECdGogBigCgAE6AAEgBigCnAEoAgAgBigCYEECdGogBigCVCAGKAKcASgCAGtBAnU7AQILDAELCyAGKAJsBEAgBkHAADoAWCAGIAYoApABIAYoAnhrOgBZIAZBADsBWiAGKAJUIAYoAmxBAnRqIAZB2ABqKAEANgEACyAGKAKcASIAIAAoAgAgBigCcEECdGo2AgAgBigCmAEgBigCgAE2AgAgBkEANgKsAQsgBigCrAEhACAGQbABaiQAIAALsQIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADKAIYKAIENgIMIAMoAgwgAygCEEsEQCADIAMoAhA2AgwLAkAgAygCDEUEQCADQQA2AhwMAQsgAygCGCIAIAAoAgQgAygCDGs2AgQgAygCFCADKAIYKAIAIAMoAgwQGRoCQCADKAIYKAIcKAIYQQFGBEAgAygCGCgCMCADKAIUIAMoAgwQPiEAIAMoAhggADYCMAwBCyADKAIYKAIcKAIYQQJGBEAgAygCGCgCMCADKAIUIAMoAgwQGiEAIAMoAhggADYCMAsLIAMoAhgiACADKAIMIAAoAgBqNgIAIAMoAhgiACADKAIMIAAoAghqNgIIIAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC+0BAQF/IwBBEGsiASAANgIIAkACQAJAIAEoAghFDQAgASgCCCgCIEUNACABKAIIKAIkDQELIAFBATYCDAwBCyABIAEoAggoAhw2AgQCQAJAIAEoAgRFDQAgASgCBCgCACABKAIIRw0AIAEoAgQoAgRBKkYNASABKAIEKAIEQTlGDQEgASgCBCgCBEHFAEYNASABKAIEKAIEQckARg0BIAEoAgQoAgRB2wBGDQEgASgCBCgCBEHnAEYNASABKAIEKAIEQfEARg0BIAEoAgQoAgRBmgVGDQELIAFBATYCDAwBCyABQQA2AgwLIAEoAgwL0gQBAX8jAEEgayIDIAA2AhwgAyABNgIYIAMgAjYCFCADIAMoAhxB3BZqIAMoAhRBAnRqKAIANgIQIAMgAygCFEEBdDYCDANAAkAgAygCDCADKAIcKALQKEoNAAJAIAMoAgwgAygCHCgC0ChODQAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBOBEAgAygCGCADKAIcIAMoAgxBAnRqQeAWaigCAEECdGovAQAgAygCGCADKAIcQdwWaiADKAIMQQJ0aigCAEECdGovAQBHDQEgAygCHCADKAIMQQJ0akHgFmooAgAgAygCHEHYKGpqLQAAIAMoAhxB3BZqIAMoAgxBAnRqKAIAIAMoAhxB2Chqai0AAEoNAQsgAyADKAIMQQFqNgIMCyADKAIYIAMoAhBBAnRqLwEAIAMoAhggAygCHEHcFmogAygCDEECdGooAgBBAnRqLwEASA0AAkAgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEcNACADKAIQIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQAMAQsgAygCHEHcFmogAygCFEECdGogAygCHEHcFmogAygCDEECdGooAgA2AgAgAyADKAIMNgIUIAMgAygCDEEBdDYCDAwBCwsgAygCHEHcFmogAygCFEECdGogAygCEDYCAAvXEwEDfyMAQTBrIgIkACACIAA2AiwgAiABNgIoIAIgAigCKCgCADYCJCACIAIoAigoAggoAgA2AiAgAiACKAIoKAIIKAIMNgIcIAJBfzYCECACKAIsQQA2AtAoIAIoAixBvQQ2AtQoIAJBADYCGANAIAIoAhggAigCHEgEQAJAIAIoAiQgAigCGEECdGovAQAEQCACIAIoAhgiATYCECACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohACAEIAA2AtAoIABBAnQgA2ogATYCACACKAIYIAIoAixB2ChqakEAOgAADAELIAIoAiQgAigCGEECdGpBADsBAgsgAiACKAIYQQFqNgIYDAELCwNAIAIoAiwoAtAoQQJIBEACQCACKAIQQQJIBEAgAiACKAIQQQFqIgA2AhAMAQtBACEACyACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohASAEIAE2AtAoIAFBAnQgA2ogADYCACACIAA2AgwgAigCJCACKAIMQQJ0akEBOwEAIAIoAgwgAigCLEHYKGpqQQA6AAAgAigCLCIAIAAoAqgtQQFrNgKoLSACKAIgBEAgAigCLCIAIAAoAqwtIAIoAiAgAigCDEECdGovAQJrNgKsLQsMAQsLIAIoAiggAigCEDYCBCACIAIoAiwoAtAoQQJtNgIYA0AgAigCGEEBTgRAIAIoAiwgAigCJCACKAIYEHogAiACKAIYQQFrNgIYDAELCyACIAIoAhw2AgwDQCACIAIoAiwoAuAWNgIYIAIoAixB3BZqIQEgAigCLCIDKALQKCEAIAMgAEEBazYC0CggAigCLCAAQQJ0IAFqKAIANgLgFiACKAIsIAIoAiRBARB6IAIgAigCLCgC4BY2AhQgAigCGCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAhQhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIkIAIoAgxBAnRqIAIoAiQgAigCGEECdGovAQAgAigCJCACKAIUQQJ0ai8BAGo7AQAgAigCDCACKAIsQdgoamoCfyACKAIYIAIoAixB2Chqai0AACACKAIUIAIoAixB2Chqai0AAE4EQCACKAIYIAIoAixB2Chqai0AAAwBCyACKAIUIAIoAixB2Chqai0AAAtBAWo6AAAgAigCJCACKAIUQQJ0aiACKAIMIgA7AQIgAigCJCACKAIYQQJ0aiAAOwECIAIgAigCDCIAQQFqNgIMIAIoAiwgADYC4BYgAigCLCACKAIkQQEQeiACKAIsKALQKEECTg0ACyACKAIsKALgFiEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAighASMAQUBqIgAgAigCLDYCPCAAIAE2AjggACAAKAI4KAIANgI0IAAgACgCOCgCBDYCMCAAIAAoAjgoAggoAgA2AiwgACAAKAI4KAIIKAIENgIoIAAgACgCOCgCCCgCCDYCJCAAIAAoAjgoAggoAhA2AiAgAEEANgIEIABBADYCEANAIAAoAhBBD0wEQCAAKAI8QbwWaiAAKAIQQQF0akEAOwEAIAAgACgCEEEBajYCEAwBCwsgACgCNCAAKAI8QdwWaiAAKAI8KALUKEECdGooAgBBAnRqQQA7AQIgACAAKAI8KALUKEEBajYCHANAIAAoAhxBvQRIBEAgACAAKAI8QdwWaiAAKAIcQQJ0aigCADYCGCAAIAAoAjQgACgCNCAAKAIYQQJ0ai8BAkECdGovAQJBAWo2AhAgACgCECAAKAIgSgRAIAAgACgCIDYCECAAIAAoAgRBAWo2AgQLIAAoAjQgACgCGEECdGogACgCEDsBAiAAKAIYIAAoAjBMBEAgACgCPCAAKAIQQQF0akG8FmoiASABLwEAQQFqOwEAIABBADYCDCAAKAIYIAAoAiROBEAgACAAKAIoIAAoAhggACgCJGtBAnRqKAIANgIMCyAAIAAoAjQgACgCGEECdGovAQA7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EANAIAMpAxAgAykDCFpFBEAgAygCKCgCACADKQMQp0EEdGoQkAEgAyADKQMQQgF8NwMQDAELCyADKAIoIAMpAwgiATcDECADKAIoIAE3AwggA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALzAEBAX8jAEEgayICJAAgAiAANwMQIAIgATYCDCACQTAQGCIBNgIIAkAgAUUEQCACKAIMQQ5BABAUIAJBADYCHAwBCyACKAIIQQA2AgAgAigCCEIANwMQIAIoAghCADcDCCACKAIIQgA3AyAgAigCCEIANwMYIAIoAghBADYCKCACKAIIQQA6ACwgAigCCCACKQMQIAIoAgwQgwFBAXFFBEAgAigCCBAkIAJBADYCHAwBCyACIAIoAgg2AhwLIAIoAhwhASACQSBqJAAgAQvWAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIANBDGpCBBApNgIIAkAgAygCCEUEQCADQX82AhwMAQsDQCADKAIUBEAgAygCFCgCBCADKAIQcUGABnEEQCADKAIIQgAQLBogAygCCCADKAIULwEIEB8gAygCCCADKAIULwEKEB8CfyMAQRBrIgAgAygCCDYCDCAAKAIMLQAAQQFxRQsEQCADKAIYQQhqQRRBABAUIAMoAggQFiADQX82AhwMBAsgAygCGCADQQxqQgQQNUEASARAIAMoAggQFiADQX82AhwMBAsgAygCFC8BCgRAIAMoAhggAygCFCgCDCADKAIULwEKrRA1QQBIBEAgAygCCBAWIANBfzYCHAwFCwsLIAMgAygCFCgCADYCFAwBCwsgAygCCBAWIANBADYCHAsgAygCHCEAIANBIGokACAAC2gBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADsBBgNAIAIoAgwEQCACKAIMKAIEIAIoAghxQYAGcQRAIAIgAigCDC8BCiACLwEGQQRqajsBBgsgAiACKAIMKAIANgIMDAELCyACLwEGC/ABAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggAUEANgIEA0AgASgCDARAAkACQCABKAIMLwEIQfXGAUYNACABKAIMLwEIQfXgAUYNACABKAIMLwEIQYGyAkYNACABKAIMLwEIQQFHDQELIAEgASgCDCgCADYCACABKAIIIAEoAgxGBEAg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IAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCEASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQL0IWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJIQgQQHhogASgCSBAqBEAgASgCOEEBQQAQFCABQQA2AkwMAQsgASABKAJIEB1B//8Dca03AyggASABKAJIEB1B//8Dca03AyAgASkDICABKQMoUgRAIAEoAjhBE0EAEBQgAUEANgJMDAELIAEgASgCSBAqrTcDGCABIAEoAkgQKq03AxAgASkDECABKQMQIAEpAxh8VgRAIAEoAjhBBEEWEBQgAUEANgJMDAELIAEpAxAgASkDGHwgASkDQCABKQMIfFYEQCABKAI4QRVBABAUIAFBADYCTAwBCwJAIAEoAjxBBHFFDQAgASkDECABKQMYfCABKQNAIAEpAwh8UQ0AIAEoAjhBFUEAEBQgAUEANgJMDAELIAEgASkDICABKAI4EIQBIgU2AjQgBUUEQCABQQA2AkwMAQsgASgCNEEAOgAsIAEoAjQgASkDGDcDGCABKAI0IAEpAxA3AyAgASABKAI0NgJMCyABKAJMIQUgAUHQAGokACAAIAU2AlALIAAoAlBFBEAgAEEANgJsDAELIAAoAmQgACkDMEIUfBAsGiAAIAAoAmQQHTsBTiAAKAJQKQMgIAAoAlApAxh8IAApA1ggACkDMHxWBEAg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IAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEFwgAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQeBogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2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mwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgEL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQNwJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQcCABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQKwJ/IAEoAqQBBEAgASgCpAEQK0ECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEHAgASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMIQgSGIAgpAwAiA0I8iIQhAiAIKQMQIAgpAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIAhBIGokACACIAZCgICAgICAgICAf4OEvws5AwALrRcDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCQCABvSIYQn9XBEBBASESQa4IIRMgAZoiAb0hGAwBCyAEQYAQcQRAQQEhEkGxCCETDAELQbQIQa8IIARBAXEiEhshEyASRSEXCwJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECYgACATIBIQIiAAQeQLQbUSIAVBIHEiAxtBjw1BuRIgAxsgASABYhtBAxAiDAELIAlBEGohEAJAAn8CQCABIAlBLGoQqQEiASABoCIBRAAAAAAAAAAAYgRAIAkgCSgCLCIGQQFrNgIsIAVBIHIiFEHhAEcNAQwDCyAFQSByIhRB4QBGDQIgCSgCLCELQQYgAyADQQBIGwwBCyAJIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBQQYgAyADQQBIGwshCiAJQTBqIAlB0AJqIAtBAEgbIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQA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HCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCGCABKAIUSQtBAXENAAsgASgCKEGCAiABKAIUIAEoAhhrazYCYCABKAIoKAJgIAEoAigoAnRLBEAgASgCKCABKAIoKAJ0NgJgCwsLAkAgASgCKCgCYEEDTwRAIAEgASgCKCgCYEEDazoAEyABQQE7ARAgASgCKCICKAKkLSACKAKgLUEBdGogAS8BEDsBACABLQATIQMgASgCKCICKAKYLSEEIAIgAigCoC0iAkEBajYCoC0gAiAEaiADOgAAIAEgAS8BEEEBazsBECABKAIoIAEtABNB0N0Aai0AAEECdGpBmAlqIgIgAi8BAEEBajsBACABKAIoQYgTagJ/IAEvARBBgAJJBEAgAS8BEC0A0FkMAQsgAS8BEEEHdkGAAmotANBZC0ECdGoiAiACLwEAQQFqOwEAIAEgASgCKCgCoC0gASgCKCgCnC1BAWtGNgIgIAEoAigiAiACKAJ0IAEoAigoAmBrNgJ0IAEoAigiAiABKAIoKAJgIAIoAmxqNgJsIAEoAihBADYCYAwBCyABIAEoAigiAigCOCACKAJsai0AADoADyABKAIoIgIoAqQtIAIoAqAtQQF0akEAOwEAIAEtAA8hAyABKAIoIgIoApgtIQQgAiACKAKgLSICQQFqNgKgLSACIARqIAM6AAAgASgCKCABLQAPQQJ0aiICIAIvAZQBQQFqOwGUASABIAEoAigoAqAtIAEoAigoApwtQQFrRjYCICABKAIoIgIgAigCdEEBazYCdCABKAIoIgIgAigCbEEBajYCbAsgASgCIARAIAEoAigCfyABKAIoKAJcQQBOBEAgASgCKCgCOCABKAIoKAJcagwBC0EACyABKAIoKAJsIAEoAigoAlxrQQAQKCABKAIoIAEoAigoAmw2AlwgASgCKCgCABAcIAEoAigo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QCABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiQgASgCLCABKAIccUECdGooAQA2ARACQAJAA0AgASABLQARNgIMIAEgASgCLCABKAIMdjYCLCABIAEoAiggASgCDGs2AiggASABLQAQNgIMIAEoAgxFBEAgAS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgi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ZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AbmFuAC9kZXYvdXJhbmRvbQBpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2sAaW5jb3JyZWN0IGhlYWRlciBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAGluY29ycmVjdCBkYXRhIGNoZWNrAGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrAGhlYWRlciBjcmMgbWlzbWF0Y2gAaW5mAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABPcGVyYXRpb24gbm90IHN1cHBvcnRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAEVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQAQ29udGFpbmluZyB6aXAgYXJjaGl2ZSB3YXMgY2xvc2VkAENsb3NpbmcgemlwIGFyY2hpdmUgZmFpbGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAFVua25vd24gZXJyb3IgJWQAcmIAcitiAHJ3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CADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";y4(Rp)||(Rp=dxe(Rp));function Kxe(t){try{if(t==Rp&&lP)return new Uint8Array(lP);var e=s4(t);if(e)return e;if(aP)return aP(t);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(r){Gr(r)}}function Uxe(t,e){var r,i,n;try{n=Kxe(t),i=new WebAssembly.Module(n),r=new WebAssembly.Instance(i,e)}catch(o){var s=o.toString();throw Di("failed to compile wasm module: "+s),(s.includes("imported Memory")||s.includes("memory import"))&&Di("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)."),o}return[r,i]}function Gxe(){var t={a:Hxe};function e(n,s){var o=n.exports;oe.asm=o,ew=oe.asm.u,p4(ew.buffer),fP=oe.asm.za,Mxe(oe.asm.v),dP("wasm-instantiate")}if(E4("wasm-instantiate"),oe.instantiateWasm)try{var r=oe.instantiateWasm(t,e);return r}catch(n){return Di("Module.instantiateWasm callback failed with error: "+n),!1}var i=Uxe(Rp,t);return e(i[0]),oe.asm}var ai,ya;function hP(t){for(;t.length>0;){var e=t.shift();if(typeof e=="function"){e(oe);continue}var r=e.func;typeof r=="number"?e.arg===void 0?fP.get(r)():fP.get(r)(e.arg):r(e.arg===void 0?null:e.arg)}}function iw(t,e){var r=new Date(_e[t>>2]*1e3);_e[e>>2]=r.getUTCSeconds(),_e[e+4>>2]=r.getUTCMinutes(),_e[e+8>>2]=r.getUTCHours(),_e[e+12>>2]=r.getUTCDate(),_e[e+16>>2]=r.getUTCMonth(),_e[e+20>>2]=r.getUTCFullYear()-1900,_e[e+24>>2]=r.getUTCDay(),_e[e+36>>2]=0,_e[e+32>>2]=0;var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[e+28>>2]=n,iw.GMTString||(iw.GMTString=uP("GMT")),_e[e+40>>2]=iw.GMTString,e}function jxe(t,e){return iw(t,e)}var yt={splitPath:function(t){var e=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return e.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];n==="."?t.splice(i,1):n===".."?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e=t.charAt(0)==="/",r=t.substr(-1)==="/";return t=yt.normalizeArray(t.split("/").filter(function(i){return!!i}),!e).join("/"),!t&&!e&&(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=yt.splitPath(t),r=e[0],i=e[1];return!r&&!i?".":(i&&(i=i.substr(0,i.length-1)),r+i)},basename:function(t){if(t==="/")return"/";t=yt.normalize(t),t=t.replace(/\/$/,"");var e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)},extname:function(t){return yt.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return yt.normalize(t.join("/"))},join2:function(t,e){return yt.normalize(t+"/"+e)}};function Yxe(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}else if(Wl)try{var e=require("crypto");return function(){return e.randomBytes(1)[0]}}catch(r){}return function(){Gr("randomDevice")}}var wa={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:y.cwd();if(typeof i!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";t=i+"/"+t,e=i.charAt(0)==="/"}return t=yt.normalizeArray(t.split("/").filter(function(n){return!!n}),!e).join("/"),(e?"/":"")+t||"."},relative:function(t,e){t=wa.resolve(t).substr(1),e=wa.resolve(e).substr(1);function r(c){for(var u=0;u=0&&c[g]==="";g--);return u>g?[]:c.slice(u,g-u+1)}for(var i=r(t.split("/")),n=r(e.split("/")),s=Math.min(i.length,n.length),o=s,a=0;a0?e=i.slice(0,n).toString("utf-8"):e=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(e=window.prompt("Input: "),e!==null&&(e+=` -`)):typeof readline=="function"&&(e=readline(),e!==null&&(e+=` -`));if(!e)return null;t.input=CP(e,!0)}return t.input.shift()},put_char:function(t,e){e===null||e===10?($y(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&($y(Zu(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){e===null||e===10?(Di(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(Di(Zu(t.output,0)),t.output=[])}}};function mP(t){for(var e=mxe(t,65536),r=h4(e);t=e)){var i=1024*1024;e=Math.max(e,r*(r>>0),r!=0&&(e=Math.max(e,256));var n=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(n.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(e==0)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=y.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,y.isDir(t.mode)?e.size=4096:y.isFile(t.mode)?e.size=t.usedBytes:y.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){e.mode!==void 0&&(t.mode=e.mode),e.timestamp!==void 0&&(t.timestamp=e.timestamp),e.size!==void 0&&pt.resizeFileStorage(t,e.size)},lookup:function(t,e){throw y.genericErrors[44]},mknod:function(t,e,r,i){return pt.createNode(t,e,r,i)},rename:function(t,e,r){if(y.isDir(t.mode)){var i;try{i=y.lookupNode(e,r)}catch(s){}if(i)for(var n in i.contents)throw new y.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=y.lookupNode(t,e);for(var i in r.contents)throw new y.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)!t.contents.hasOwnProperty(r)||e.push(r);return e},symlink:function(t,e,r){var i=pt.createNode(t,e,511|40960,0);return i.link=r,i},readlink:function(t){if(!y.isLink(t.mode))throw new y.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,i,n){var s=t.node.contents;if(n>=t.node.usedBytes)return 0;var o=Math.min(t.node.usedBytes-n,i);if(o>8&&s.subarray)e.set(s.subarray(n,n+o),r);else for(var a=0;a0||i+r>2)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}return e.mode},realPath:function(t){for(var e=[];t.parent!==t;)e.push(t.name),t=t.parent;return e.push(t.mount.opts.root),e.reverse(),yt.join.apply(null,e)},flagsForNode:function(t){t&=~2097152,t&=~2048,t&=~32768,t&=~524288;var e=0;for(var r in tt.flagsForNodeMap)t&r&&(e|=tt.flagsForNodeMap[r],t^=r);if(t)throw new y.ErrnoError(28);return e},node_ops:{getattr:function(t){var e=tt.realPath(t),r;try{r=ft.lstatSync(e)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}return tt.isWindows&&!r.blksize&&(r.blksize=4096),tt.isWindows&&!r.blocks&&(r.blocks=(r.size+r.blksize-1)/r.blksize|0),{dev:r.dev,ino:r.ino,mode:r.mode,nlink:r.nlink,uid:r.uid,gid:r.gid,rdev:r.rdev,size:r.size,atime:r.atime,mtime:r.mtime,ctime:r.ctime,blksize:r.blksize,blocks:r.blocks}},setattr:function(t,e){var r=tt.realPath(t);try{if(e.mode!==void 0&&(ft.chmodSync(r,e.mode),t.mode=e.mode),e.timestamp!==void 0){var i=new Date(e.timestamp);ft.utimesSync(r,i,i)}e.size!==void 0&&ft.truncateSync(r,e.size)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},lookup:function(t,e){var r=yt.join2(tt.realPath(t),e),i=tt.getMode(r);return tt.createNode(t,e,i)},mknod:function(t,e,r,i){var n=tt.createNode(t,e,r,i),s=tt.realPath(n);try{y.isDir(n.mode)?ft.mkdirSync(s,n.mode):ft.writeFileSync(s,"",{mode:n.mode})}catch(o){throw o.code?new y.ErrnoError(tt.convertNodeCode(o)):o}return n},rename:function(t,e,r){var i=tt.realPath(t),n=yt.join2(tt.realPath(e),r);try{ft.renameSync(i,n)}catch(s){throw s.code?new y.ErrnoError(tt.convertNodeCode(s)):s}t.name=r},unlink:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.unlinkSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},rmdir:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.rmdirSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},readdir:function(t){var e=tt.realPath(t);try{return ft.readdirSync(e)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},symlink:function(t,e,r){var i=yt.join2(tt.realPath(t),e);try{ft.symlinkSync(r,i)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},readlink:function(t){var e=tt.realPath(t);try{return e=ft.readlinkSync(e),e=EP.relative(EP.resolve(t.mount.opts.root),e),e}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}}},stream_ops:{open:function(t){var e=tt.realPath(t.node);try{y.isFile(t.node.mode)&&(t.nfd=ft.openSync(e,tt.flagsForNode(t.flags)))}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},close:function(t){try{y.isFile(t.node.mode)&&t.nfd&&ft.closeSync(t.nfd)}catch(e){throw e.code?new y.ErrnoError(tt.convertNodeCode(e)):e}},read:function(t,e,r,i,n){if(i===0)return 0;try{return ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},write:function(t,e,r,i,n){try{return ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},llseek:function(t,e,r){var i=e;if(r===1)i+=t.position;else if(r===2&&y.isFile(t.node.mode))try{var n=ft.fstatSync(t.nfd);i+=n.size}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}if(i<0)throw new y.ErrnoError(28);return i},mmap:function(t,e,r,i,n,s){if(e!==0)throw new y.ErrnoError(28);if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);var o=mP(r);return tt.stream_ops.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);if(n&2)return 0;var s=tt.stream_ops.write(t,e,0,i,r,!1);return 0}}},w4={lookupPath:function(t){return{path:t,node:{mode:tt.getMode(t)}}},createStandardStreams:function(){y.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var t=1;t<3;t++)y.streams[t]={fd:t,nfd:t,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(t,e){y.isDir(t)?ft.mkdirSync(t,e):ft.writeFileSync(t,"",{mode:e})},mkdir:function(){ft.mkdirSync.apply(void 0,arguments)},symlink:function(){ft.symlinkSync.apply(void 0,arguments)},rename:function(){ft.renameSync.apply(void 0,arguments)},rmdir:function(){ft.rmdirSync.apply(void 0,arguments)},readdir:function(){ft.readdirSync.apply(void 0,arguments)},unlink:function(){ft.unlinkSync.apply(void 0,arguments)},readlink:function(){return ft.readlinkSync.apply(void 0,arguments)},stat:function(){return ft.statSync.apply(void 0,arguments)},lstat:function(){return ft.lstatSync.apply(void 0,arguments)},chmod:function(){ft.chmodSync.apply(void 0,arguments)},fchmod:function(){ft.fchmodSync.apply(void 0,arguments)},chown:function(){ft.chownSync.apply(void 0,arguments)},fchown:function(){ft.fchownSync.apply(void 0,arguments)},truncate:function(){ft.truncateSync.apply(void 0,arguments)},ftruncate:function(t,e){if(e<0)throw new y.ErrnoError(28);ft.ftruncateSync.apply(void 0,arguments)},utime:function(){ft.utimesSync.apply(void 0,arguments)},open:function(t,e,r,i){typeof e=="string"&&(e=Vl.modeStringToFlags(e));var n=ft.openSync(t,tt.flagsForNode(e),r),s=i!=null?i:y.nextfd(n),o={fd:s,nfd:n,position:0,path:t,flags:e,seekable:!0};return y.streams[s]=o,o},close:function(t){t.stream_ops||ft.closeSync(t.nfd),y.closeStream(t.fd)},llseek:function(t,e,r){if(t.stream_ops)return Vl.llseek(t,e,r);var i=e;if(r===1)i+=t.position;else if(r===2)i+=ft.fstatSync(t.nfd).size;else if(r!==0)throw new y.ErrnoError(eg.EINVAL);if(i<0)throw new y.ErrnoError(eg.EINVAL);return t.position=i,i},read:function(t,e,r,i,n){if(t.stream_ops)return Vl.read(t,e,r,i,n);var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},write:function(t,e,r,i,n){if(t.stream_ops)return Vl.write(t,e,r,i,n);t.flags&+"1024"&&y.llseek(t,0,+"2");var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},allocate:function(){throw new y.ErrnoError(eg.EOPNOTSUPP)},mmap:function(t,e,r,i,n,s){if(t.stream_ops)return Vl.mmap(t,e,r,i,n,s);if(e!==0)throw new y.ErrnoError(28);var o=mP(r);return y.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){return t.stream_ops?Vl.msync(t,e,r,i,n):(n&2||y.write(t,e,0,i,r),0)},munmap:function(){return 0},ioctl:function(){throw new y.ErrnoError(eg.ENOTTY)}},y={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,lookupPath:function(t,e){if(t=wa.resolve(y.cwd(),t),e=e||{},!t)return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var i in r)e[i]===void 0&&(e[i]=r[i]);if(e.recurse_count>8)throw new y.ErrnoError(32);for(var n=yt.normalizeArray(t.split("/").filter(function(f){return!!f}),!1),s=y.root,o="/",a=0;a40)throw new y.ErrnoError(32)}}return{path:o,node:s}},getPath:function(t){for(var e;;){if(y.isRoot(t)){var r=t.mount.mountpoint;return e?r[r.length-1]!=="/"?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:function(t,e){for(var r=0,i=0;i>>0)%y.nameTable.length},hashAddNode:function(t){var e=y.hashName(t.parent.id,t.name);t.name_next=y.nameTable[e],y.nameTable[e]=t},hashRemoveNode:function(t){var e=y.hashName(t.parent.id,t.name);if(y.nameTable[e]===t)y.nameTable[e]=t.name_next;else for(var r=y.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:function(t,e){var r=y.mayLookup(t);if(r)throw new y.ErrnoError(r,t);for(var i=y.hashName(t.id,e),n=y.nameTable[i];n;n=n.name_next){var s=n.name;if(n.parent.id===t.id&&s===e)return n}return y.lookup(t,e)},createNode:function(t,e,r,i){var n=new y.FSNode(t,e,r,i);return y.hashAddNode(n),n},destroyNode:function(t){y.hashRemoveNode(t)},isRoot:function(t){return t===t.parent},isMountpoint:function(t){return!!t.mounted},isFile:function(t){return(t&61440)==32768},isDir:function(t){return(t&61440)==16384},isLink:function(t){return(t&61440)==40960},isChrdev:function(t){return(t&61440)==8192},isBlkdev:function(t){return(t&61440)==24576},isFIFO:function(t){return(t&61440)==4096},isSocket:function(t){return(t&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(t){var e=y.flagModes[t];if(typeof e=="undefined")throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:function(t){var e=["r","w","rw"][t&3];return t&512&&(e+="w"),e},nodePermissions:function(t,e){return y.ignorePermissions?0:e.includes("r")&&!(t.mode&292)||e.includes("w")&&!(t.mode&146)||e.includes("x")&&!(t.mode&73)?2:0},mayLookup:function(t){var e=y.nodePermissions(t,"x");return e||(t.node_ops.lookup?0:2)},mayCreate:function(t,e){try{var r=y.lookupNode(t,e);return 20}catch(i){}return y.nodePermissions(t,"wx")},mayDelete:function(t,e,r){var i;try{i=y.lookupNode(t,e)}catch(s){return s.errno}var n=y.nodePermissions(t,"wx");if(n)return n;if(r){if(!y.isDir(i.mode))return 54;if(y.isRoot(i)||y.getPath(i)===y.cwd())return 10}else if(y.isDir(i.mode))return 31;return 0},mayOpen:function(t,e){return t?y.isLink(t.mode)?32:y.isDir(t.mode)&&(y.flagsToPermissionString(e)!=="r"||e&512)?31:y.nodePermissions(t,y.flagsToPermissionString(e)):44},MAX_OPEN_FDS:4096,nextfd:function(t,e){t=t||0,e=e||y.MAX_OPEN_FDS;for(var r=t;r<=e;r++)if(!y.streams[r])return r;throw new y.ErrnoError(33)},getStream:function(t){return y.streams[t]},createStream:function(t,e,r){y.FSStream||(y.FSStream=function(){},y.FSStream.prototype={object:{get:function(){return this.node},set:function(o){this.node=o}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var i=new y.FSStream;for(var n in t)i[n]=t[n];t=i;var s=y.nextfd(e,r);return t.fd=s,y.streams[s]=t,t},closeStream:function(t){y.streams[t]=null},chrdev_stream_ops:{open:function(t){var e=y.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:function(){throw new y.ErrnoError(70)}},major:function(t){return t>>8},minor:function(t){return t&255},makedev:function(t,e){return t<<8|e},registerDevice:function(t,e){y.devices[t]={stream_ops:e}},getDevice:function(t){return y.devices[t]},getMounts:function(t){for(var e=[],r=[t];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(t,e){typeof t=="function"&&(e=t,t=!1),y.syncFSRequests++,y.syncFSRequests>1&&Di("warning: "+y.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=y.getMounts(y.root.mount),i=0;function n(o){return y.syncFSRequests--,e(o)}function s(o){if(o)return s.errored?void 0:(s.errored=!0,n(o));++i>=r.length&&n(null)}r.forEach(function(o){if(!o.type.syncfs)return s(null);o.type.syncfs(o,t,s)})},mount:function(t,e,r){var i=r==="/",n=!r,s;if(i&&y.root)throw new y.ErrnoError(10);if(!i&&!n){var o=y.lookupPath(r,{follow_mount:!1});if(r=o.path,s=o.node,y.isMountpoint(s))throw new y.ErrnoError(10);if(!y.isDir(s.mode))throw new y.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},l=t.mount(a);return l.mount=a,a.root=l,i?y.root=l:s&&(s.mounted=a,s.mount&&s.mount.mounts.push(a)),l},unmount:function(t){var e=y.lookupPath(t,{follow_mount:!1});if(!y.isMountpoint(e.node))throw new y.ErrnoError(28);var r=e.node,i=r.mounted,n=y.getMounts(i);Object.keys(y.nameTable).forEach(function(o){for(var a=y.nameTable[o];a;){var l=a.name_next;n.includes(a.mount)&&y.destroyNode(a),a=l}}),r.mounted=null;var s=r.mount.mounts.indexOf(i);r.mount.mounts.splice(s,1)},lookup:function(t,e){return t.node_ops.lookup(t,e)},mknod:function(t,e,r){var i=y.lookupPath(t,{parent:!0}),n=i.node,s=yt.basename(t);if(!s||s==="."||s==="..")throw new y.ErrnoError(28);var o=y.mayCreate(n,s);if(o)throw new y.ErrnoError(o);if(!n.node_ops.mknod)throw new y.ErrnoError(63);return n.node_ops.mknod(n,s,e,r)},create:function(t,e){return e=e!==void 0?e:438,e&=4095,e|=32768,y.mknod(t,e,0)},mkdir:function(t,e){return e=e!==void 0?e:511,e&=511|512,e|=16384,y.mknod(t,e,0)},mkdirTree:function(t,e){for(var r=t.split("/"),i="",n=0;nthis.length-1||f<0)){var h=f%this.chunkSize,p=f/this.chunkSize|0;return this.getter(p)[h]}},s.prototype.setDataGetter=function(f){this.getter=f},s.prototype.cacheLength=function(){var f=new XMLHttpRequest;if(f.open("HEAD",r,!1),f.send(null),!(f.status>=200&&f.status<300||f.status===304))throw new Error("Couldn't load "+r+". Status: "+f.status);var h=Number(f.getResponseHeader("Content-length")),p,d=(p=f.getResponseHeader("Accept-Ranges"))&&p==="bytes",m=(p=f.getResponseHeader("Content-Encoding"))&&p==="gzip",I=1024*1024;d||(I=h);var B=function(R,H){if(R>H)throw new Error("invalid range ("+R+", "+H+") or no bytes requested!");if(H>h-1)throw new Error("only "+h+" bytes available! programmer error!");var L=new XMLHttpRequest;if(L.open("GET",r,!1),h!==I&&L.setRequestHeader("Range","bytes="+R+"-"+H),typeof Uint8Array!="undefined"&&(L.responseType="arraybuffer"),L.overrideMimeType&&L.overrideMimeType("text/plain; charset=x-user-defined"),L.send(null),!(L.status>=200&&L.status<300||L.status===304))throw new Error("Couldn't load "+r+". Status: "+L.status);return L.response!==void 0?new Uint8Array(L.response||[]):CP(L.responseText||"",!0)},b=this;b.setDataGetter(function(R){var H=R*I,L=(R+1)*I-1;if(L=Math.min(L,h-1),typeof b.chunks[R]=="undefined"&&(b.chunks[R]=B(H,L)),typeof b.chunks[R]=="undefined")throw new Error("doXHR failed!");return b.chunks[R]}),(m||!h)&&(I=h=1,h=this.getter(0).length,I=h,$y("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=h,this._chunkSize=I,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!i4)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var o=new s;Object.defineProperties(o,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:o}}else var a={isDevice:!1,url:r};var l=y.createFile(t,e,a,i,n);a.contents?l.contents=a.contents:a.url&&(l.contents=null,l.url=a.url),Object.defineProperties(l,{usedBytes:{get:function(){return this.contents.length}}});var c={},u=Object.keys(l.stream_ops);return u.forEach(function(g){var f=l.stream_ops[g];c[g]=function(){return y.forceLoadFile(l),f.apply(null,arguments)}}),c.read=function(f,h,p,d,m){y.forceLoadFile(l);var I=f.node.contents;if(m>=I.length)return 0;var B=Math.min(I.length-m,d);if(I.slice)for(var b=0;b>2]=i.dev,_e[r+4>>2]=0,_e[r+8>>2]=i.ino,_e[r+12>>2]=i.mode,_e[r+16>>2]=i.nlink,_e[r+20>>2]=i.uid,_e[r+24>>2]=i.gid,_e[r+28>>2]=i.rdev,_e[r+32>>2]=0,ya=[i.size>>>0,(ai=i.size,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+40>>2]=ya[0],_e[r+44>>2]=ya[1],_e[r+48>>2]=4096,_e[r+52>>2]=i.blocks,_e[r+56>>2]=i.atime.getTime()/1e3|0,_e[r+60>>2]=0,_e[r+64>>2]=i.mtime.getTime()/1e3|0,_e[r+68>>2]=0,_e[r+72>>2]=i.ctime.getTime()/1e3|0,_e[r+76>>2]=0,ya=[i.ino>>>0,(ai=i.ino,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+80>>2]=ya[0],_e[r+84>>2]=ya[1],0},doMsync:function(t,e,r,i,n){var s=$u.slice(t,t+r);y.msync(e,s,n,r,i)},doMkdir:function(t,e){return t=yt.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),y.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(e&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return y.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var i=y.readlink(t),n=Math.min(r,rw(i)),s=Zi[e+n];return u4(i,e,r+1),Zi[e+n]=s,n},doAccess:function(t,e){if(e&~7)return-28;var r,i=y.lookupPath(t,{follow:!0});if(r=i.node,!r)return-44;var n="";return e&4&&(n+="r"),e&2&&(n+="w"),e&1&&(n+="x"),n&&y.nodePermissions(r,n)?-2:0},doDup:function(t,e,r){var i=y.getStream(r);return i&&y.close(i),y.open(t,e,0,r,r).fd},doReadv:function(t,e,r,i){for(var n=0,s=0;s>2],a=_e[e+(s*8+4)>>2],l=y.read(t,Zi,o,a,i);if(l<0)return-1;if(n+=l,l>2],a=_e[e+(s*8+4)>>2],l=y.write(t,Zi,o,a,i);if(l<0)return-1;n+=l}return n},varargs:void 0,get:function(){Ot.varargs+=4;var t=_e[Ot.varargs-4>>2];return t},getStr:function(t){var e=c4(t);return e},getStreamFromFD:function(t){var e=y.getStream(t);if(!e)throw new y.ErrnoError(8);return e},get64:function(t,e){return t}};function qxe(t,e){try{return t=Ot.getStr(t),y.chmod(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function Wxe(t){return _e[Jxe()>>2]=t,t}function zxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 0:{var n=Ot.get();if(n<0)return-28;var s;return s=y.open(i.path,i.flags,0,n),s.fd}case 1:case 2:return 0;case 3:return i.flags;case 4:{var n=Ot.get();return i.flags|=n,0}case 12:{var n=Ot.get(),o=0;return cP[n+o>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Wxe(28),-1;default:return-28}}catch(a){return(typeof y=="undefined"||!(a instanceof y.ErrnoError))&&Gr(a),-a.errno}}function Vxe(t,e){try{var r=Ot.getStreamFromFD(t);return Ot.doStat(y.stat,r.path,e)}catch(i){return(typeof y=="undefined"||!(i instanceof y.ErrnoError))&&Gr(i),-i.errno}}function _xe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 21509:case 21505:return i.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return i.tty?0:-59;case 21519:{if(!i.tty)return-59;var n=Ot.get();return _e[n>>2]=0,0}case 21520:return i.tty?-28:-59;case 21531:{var n=Ot.get();return y.ioctl(i,e,n)}case 21523:return i.tty?0:-59;case 21524:return i.tty?0:-59;default:Gr("bad ioctl syscall "+e)}}catch(s){return(typeof y=="undefined"||!(s instanceof y.ErrnoError))&&Gr(s),-s.errno}}function Xxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStr(t),n=r?Ot.get():0,s=y.open(i,e,n);return s.fd}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),-o.errno}}function Zxe(t,e){try{return t=Ot.getStr(t),e=Ot.getStr(e),y.rename(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function $xe(t){try{return t=Ot.getStr(t),y.rmdir(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function eke(t,e){try{return t=Ot.getStr(t),Ot.doStat(y.stat,t,e)}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function tke(t){try{return t=Ot.getStr(t),y.unlink(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function rke(t,e,r){$u.copyWithin(t,e,e+r)}function ike(t){try{return ew.grow(t-gP.byteLength+65535>>>16),p4(ew.buffer),1}catch(e){}}function nke(t){var e=$u.length;t=t>>>0;var r=2147483648;if(t>r)return!1;for(var i=1;i<=4;i*=2){var n=e*(1+.2/i);n=Math.min(n,t+100663296);var s=Math.min(r,xxe(Math.max(t,n),65536)),o=ike(s);if(o)return!0}return!1}function ske(t){try{var e=Ot.getStreamFromFD(t);return y.close(e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),r.errno}}function oke(t,e){try{var r=Ot.getStreamFromFD(t),i=r.tty?2:y.isDir(r.mode)?3:y.isLink(r.mode)?7:4;return Zi[e>>0]=i,0}catch(n){return(typeof y=="undefined"||!(n instanceof y.ErrnoError))&&Gr(n),n.errno}}function ake(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doReadv(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function Ake(t,e,r,i,n){try{var s=Ot.getStreamFromFD(t),o=4294967296,a=r*o+(e>>>0),l=9007199254740992;return a<=-l||a>=l?-61:(y.llseek(s,a,i),ya=[s.position>>>0,(ai=s.position,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[n>>2]=ya[0],_e[n+4>>2]=ya[1],s.getdents&&a===0&&i===0&&(s.getdents=null),0)}catch(c){return(typeof y=="undefined"||!(c instanceof y.ErrnoError))&&Gr(c),c.errno}}function lke(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doWritev(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function cke(t){Ixe(t)}function uke(t){var e=Date.now()/1e3|0;return t&&(_e[t>>2]=e),e}function IP(){if(IP.called)return;IP.called=!0;var t=new Date().getFullYear(),e=new Date(t,0,1),r=new Date(t,6,1),i=e.getTimezoneOffset(),n=r.getTimezoneOffset(),s=Math.max(i,n);_e[fke()>>2]=s*60,_e[gke()>>2]=Number(i!=n);function o(g){var f=g.toTimeString().match(/\(([A-Za-z ]+)\)$/);return f?f[1]:"GMT"}var a=o(e),l=o(r),c=uP(a),u=uP(l);n>2]=c,_e[nw()+4>>2]=u):(_e[nw()>>2]=u,_e[nw()+4>>2]=c)}function hke(t){IP();var e=Date.UTC(_e[t+20>>2]+1900,_e[t+16>>2],_e[t+12>>2],_e[t+8>>2],_e[t+4>>2],_e[t>>2],0),r=new Date(e);_e[t+24>>2]=r.getUTCDay();var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[t+28>>2]=n,r.getTime()/1e3|0}var B4=function(t,e,r,i){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=y.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},sw=292|73,ow=146;Object.defineProperties(B4.prototype,{read:{get:function(){return(this.mode&sw)===sw},set:function(t){t?this.mode|=sw:this.mode&=~sw}},write:{get:function(){return(this.mode&ow)===ow},set:function(t){t?this.mode|=ow:this.mode&=~ow}},isFolder:{get:function(){return y.isDir(this.mode)}},isDevice:{get:function(){return y.isChrdev(this.mode)}}});y.FSNode=B4;y.staticInit();Wl&&(ft=e4,EP=require("path"),tt.staticInit());var ft,EP;if(Wl){Q4=function(t){return function(){try{return t.apply(this,arguments)}catch(e){throw e.code?new y.ErrnoError(eg[e.code]):e}}},Vl=Object.assign({},y);for(yP in w4)y[yP]=Q4(w4[yP])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");var Q4,Vl,yP;function CP(t,e,r){var i=r>0?r:rw(t)+1,n=new Array(i),s=tw(t,n,0,n.length);return e&&(n.length=s),n}var pke=typeof atob=="function"?atob:function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r="",i,n,s,o,a,l,c,u=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(u++)),a=e.indexOf(t.charAt(u++)),l=e.indexOf(t.charAt(u++)),c=e.indexOf(t.charAt(u++)),i=o<<2|a>>4,n=(a&15)<<4|l>>2,s=(l&3)<<6|c,r=r+String.fromCharCode(i),l!==64&&(r=r+String.fromCharCode(n)),c!==64&&(r=r+String.fromCharCode(s));while(u0||(Fxe(),zl>0))return;function e(){aw||(aw=!0,oe.calledRun=!0,!A4&&(Nxe(),oe.onRuntimeInitialized&&oe.onRuntimeInitialized(),Txe()))}oe.setStatus?(oe.setStatus("Running..."),setTimeout(function(){setTimeout(function(){oe.setStatus("")},1),e()},1)):e()}oe.run=wP;if(oe.preInit)for(typeof oe.preInit=="function"&&(oe.preInit=[oe.preInit]);oe.preInit.length>0;)oe.preInit.pop()();wP()});var x4=E((Dot,S4)=>{"use strict";function Cke(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function _l(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,_l)}Cke(_l,Error);_l.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ee=At(">>",!1),Ue=">&",Oe=At(">&",!1),vt=">",dt=At(">",!1),ri="<<<",ii=At("<<<",!1),an="<&",yr=At("<&",!1),Ki="<",Qi=At("<",!1),Go=function(C){return{type:"argument",segments:[].concat(...C)}},wr=function(C){return C},Ui="'",ws=At("'",!1),Tf=function(C){return[{type:"text",text:C}]},Mf='"',Rm=At('"',!1),Fm=function(C){return C},Nm=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},DQ=function(C){return{type:"shell",shell:C,quoted:!0}},RQ=function(C){return _(P({type:"variable"},C),{quoted:!0})},Of=function(C){return{type:"text",text:C}},FQ=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},NQ=function(C){return{type:"shell",shell:C,quoted:!1}},Lm=function(C){return _(P({type:"variable"},C),{quoted:!1})},LQ=function(C){return{type:"glob",pattern:C}},Va="\\",jo=At("\\",!1),Tm=/^[\\']/,Mm=Qs(["\\","'"],!1,!1),te=function(C){return C},Om=/^[^']/,Km=Qs(["'"],!0,!1),il=function(C){return C.join("")},Um=/^[\\$"]/,Hm=Qs(["\\","$",'"'],!1,!1),Kf=/^[^$"]/,Gm=Qs(["$",'"'],!0,!1),jm="\\0",TQ=At("\\0",!1),MQ=function(){return"\0"},Ym="\\a",qm=At("\\a",!1),Jm=function(){return"a"},Wm="\\b",zm=At("\\b",!1),Vm=function(){return"\b"},Uf="\\e",OQ=At("\\e",!1),KQ=function(){return""},_m="\\f",UQ=At("\\f",!1),HQ=function(){return"\f"},O="\\n",ht=At("\\n",!1),Vc=function(){return` -`},xn="\\r",Hf=At("\\r",!1),Ye=function(){return"\r"},nl="\\t",Xm=At("\\t",!1),MM=function(){return" "},GQ="\\v",OM=At("\\v",!1),fr=function(){return"\v"},Bs="\\x",jQ=At("\\x",!1),Zm=function(C){return String.fromCharCode(parseInt(C,16))},Yo="\\u",$m=At("\\u",!1),_a="\\U",et=At("\\U",!1),YQ=function(C){return String.fromCodePoint(parseInt(C,16))},eE=/^[0-9a-fA-f]/,tE=Qs([["0","9"],["a","f"],["A","f"]],!1,!1),Xa=Cfe(),sl="-",ol=At("-",!1),al="+",qo=At("+",!1),Al=".",qQ=At(".",!1),rE=function(C,Q,k){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+k.join(""))}},iE=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},JQ=function(C){return P({type:"variable"},C)},ll=function(C){return{type:"variable",name:C}},WQ=function(C){return C},nE="*",Gf=At("*",!1),_c="/",jf=At("/",!1),sE=function(C,Q,k){return{type:Q==="*"?"multiplication":"division",right:k}},cl=function(C,Q){return Q.reduce((k,N)=>P({left:k},N),C)},oE=function(C,Q,k){return{type:Q==="+"?"addition":"subtraction",right:k}},Yf="$((",Xc=At("$((",!1),xr="))",KM=At("))",!1),Jo=function(C){return C},Zs="$(",aE=At("$(",!1),Zc=function(C){return C},x="${",U=At("${",!1),le=":-",xe=At(":-",!1),Qe=function(C,Q){return{name:C,defaultValue:Q}},Ge=":-}",ct=At(":-}",!1),sr=function(C){return{name:C,defaultValue:[]}},Wo=function(C){return{name:C}},Afe="$",lfe=At("$",!1),cfe=function(C){return e.isGlobPattern(C)},ufe=function(C){return C},UM=/^[a-zA-Z0-9_]/,HM=Qs([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),GM=function(){return dfe()},jM=/^[$@*?#a-zA-Z0-9_\-]/,YM=Qs(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),gfe=/^[(){}<>$|&; \t"']/,ffe=Qs(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),hfe=/^[<>&; \t"']/,pfe=Qs(["<",">","&",";"," "," ",'"',"'"],!1,!1),qM=/^[ \t]/,JM=Qs([" "," "],!1,!1),w=0,Re=0,AE=[{line:1,column:1}],$s=0,zQ=[],we=0,lE;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function dfe(){return t.substring(Re,w)}function P_e(){return qf(Re,w)}function D_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),zM([Efe(C)],t.substring(Re,w),Q)}function R_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),Ife(C,Q)}function At(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function Qs(C,Q,k){return{type:"class",parts:C,inverted:Q,ignoreCase:k}}function Cfe(){return{type:"any"}}function mfe(){return{type:"end"}}function Efe(C){return{type:"other",description:C}}function WM(C){var Q=AE[C],k;if(Q)return Q;for(k=C-1;!AE[k];)k--;for(Q=AE[k],Q={line:Q.line,column:Q.column};k$s&&($s=w,zQ=[]),zQ.push(C))}function Ife(C,Q){return new _l(C,null,null,Q)}function zM(C,Q,k){return new _l(_l.buildMessage(C,Q),C,Q,k)}function VM(){var C,Q;return C=w,Q=Jf(),Q===r&&(Q=null),Q!==r&&(Re=C,Q=s(Q)),C=Q,C}function Jf(){var C,Q,k,N,Z;if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N!==r?(Z=yfe(),Z===r&&(Z=null),Z!==r?(Re=C,Q=o(Q,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;if(C===r)if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N===r&&(N=null),N!==r?(Re=C,Q=a(Q,N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function yfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Jf(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=l(k),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function _M(){var C;return t.charCodeAt(w)===59?(C=c,w++):(C=r,we===0&&ve(u)),C===r&&(t.charCodeAt(w)===38?(C=g,w++):(C=r,we===0&&ve(f))),C}function VQ(){var C,Q,k;return C=w,Q=XM(),Q!==r?(k=wfe(),k===r&&(k=null),k!==r?(Re=C,Q=h(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function wfe(){var C,Q,k,N,Z,Ee,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=VQ(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=p(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function Bfe(){var C;return t.substr(w,2)===d?(C=d,w+=2):(C=r,we===0&&ve(m)),C===r&&(t.substr(w,2)===I?(C=I,w+=2):(C=r,we===0&&ve(B))),C}function XM(){var C,Q,k;return C=w,Q=vfe(),Q!==r?(k=Qfe(),k===r&&(k=null),k!==r?(Re=C,Q=b(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function Qfe(){var C,Q,k,N,Z,Ee,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=XM(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=R(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function bfe(){var C;return t.substr(w,2)===H?(C=H,w+=2):(C=r,we===0&&ve(L)),C===r&&(t.charCodeAt(w)===124?(C=K,w++):(C=r,we===0&&ve(J))),C}function cE(){var C,Q,k,N,Z,Ee;if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r)if(N=$M(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(Re=C,Q=A(Q,N),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;else w=C,C=r;if(C===r)if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=V(Q),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function vfe(){var C,Q,k,N,Z,Ee,ot,ut,Tr,ni,Yn;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===40?(k=W,w++):(k=r,we===0&&ve(X)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();if(Ee!==r)if(t.charCodeAt(w)===41?(ot=F,w++):(ot=r,we===0&&ve(D)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=he(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===123?(k=pe,w++):(k=r,we===0&&ve(Ne)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();if(Ee!==r)if(t.charCodeAt(w)===125?(ot=Pe,w++):(ot=r,we===0&&ve(qe)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=re(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){for(k=[],N=cE();N!==r;)k.push(N),N=cE();if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r){if(Z=[],Ee=ZM(),Ee!==r)for(;Ee!==r;)Z.push(Ee),Ee=ZM();else Z=r;if(Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=se(k,Z),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r}else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=cE(),N!==r)for(;N!==r;)k.push(N),N=cE();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=be(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}}}return C}function Sfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=uE(),N!==r)for(;N!==r;)k.push(N),N=uE();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=ae(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r;return C}function ZM(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r?(k=Wf(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();Q!==r?(k=uE(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r)}return C}function Wf(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(De.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve($)),k===r&&(k=null),k!==r?(N=xfe(),N!==r?(Z=uE(),Z!==r?(Re=C,Q=G(k,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function xfe(){var C;return t.substr(w,2)===Ce?(C=Ce,w+=2):(C=r,we===0&&ve(ee)),C===r&&(t.substr(w,2)===Ue?(C=Ue,w+=2):(C=r,we===0&&ve(Oe)),C===r&&(t.charCodeAt(w)===62?(C=vt,w++):(C=r,we===0&&ve(dt)),C===r&&(t.substr(w,3)===ri?(C=ri,w+=3):(C=r,we===0&&ve(ii)),C===r&&(t.substr(w,2)===an?(C=an,w+=2):(C=r,we===0&&ve(yr)),C===r&&(t.charCodeAt(w)===60?(C=Ki,w++):(C=r,we===0&&ve(Qi))))))),C}function uE(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(k=$M(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C}function $M(){var C,Q,k;if(C=w,Q=[],k=eO(),k!==r)for(;k!==r;)Q.push(k),k=eO();else Q=r;return Q!==r&&(Re=C,Q=Go(Q)),C=Q,C}function eO(){var C,Q;return C=w,Q=kfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Pfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Dfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q)),C}function kfe(){var C,Q,k,N;return C=w,t.charCodeAt(w)===39?(Q=Ui,w++):(Q=r,we===0&&ve(ws)),Q!==r?(k=Rfe(),k!==r?(t.charCodeAt(w)===39?(N=Ui,w++):(N=r,we===0&&ve(ws)),N!==r?(Re=C,Q=Tf(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function Pfe(){var C,Q,k,N;if(C=w,t.charCodeAt(w)===34?(Q=Mf,w++):(Q=r,we===0&&ve(Rm)),Q!==r){for(k=[],N=tO();N!==r;)k.push(N),N=tO();k!==r?(t.charCodeAt(w)===34?(N=Mf,w++):(N=r,we===0&&ve(Rm)),N!==r?(Re=C,Q=Fm(k),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function Dfe(){var C,Q,k;if(C=w,Q=[],k=rO(),k!==r)for(;k!==r;)Q.push(k),k=rO();else Q=r;return Q!==r&&(Re=C,Q=Fm(Q)),C=Q,C}function tO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=Nm(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=DQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=RQ(Q)),C=Q,C===r&&(C=w,Q=Ffe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q))),C}function rO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=FQ(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=NQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=Lm(Q)),C=Q,C===r&&(C=w,Q=Lfe(),Q!==r&&(Re=C,Q=LQ(Q)),C=Q,C===r&&(C=w,Q=Nfe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q)))),C}function Rfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));k!==r;)Q.push(k),k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function Ffe(){var C,Q,k,N,Z;if(C=w,Q=[],k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm))))),k!==r)for(;k!==r;)Q.push(k),k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm)))));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function gE(){var C,Q;return C=w,t.substr(w,2)===jm?(Q=jm,w+=2):(Q=r,we===0&&ve(TQ)),Q!==r&&(Re=C,Q=MQ()),C=Q,C===r&&(C=w,t.substr(w,2)===Ym?(Q=Ym,w+=2):(Q=r,we===0&&ve(qm)),Q!==r&&(Re=C,Q=Jm()),C=Q,C===r&&(C=w,t.substr(w,2)===Wm?(Q=Wm,w+=2):(Q=r,we===0&&ve(zm)),Q!==r&&(Re=C,Q=Vm()),C=Q,C===r&&(C=w,t.substr(w,2)===Uf?(Q=Uf,w+=2):(Q=r,we===0&&ve(OQ)),Q!==r&&(Re=C,Q=KQ()),C=Q,C===r&&(C=w,t.substr(w,2)===_m?(Q=_m,w+=2):(Q=r,we===0&&ve(UQ)),Q!==r&&(Re=C,Q=HQ()),C=Q,C===r&&(C=w,t.substr(w,2)===O?(Q=O,w+=2):(Q=r,we===0&&ve(ht)),Q!==r&&(Re=C,Q=Vc()),C=Q,C===r&&(C=w,t.substr(w,2)===xn?(Q=xn,w+=2):(Q=r,we===0&&ve(Hf)),Q!==r&&(Re=C,Q=Ye()),C=Q,C===r&&(C=w,t.substr(w,2)===nl?(Q=nl,w+=2):(Q=r,we===0&&ve(Xm)),Q!==r&&(Re=C,Q=MM()),C=Q,C===r&&(C=w,t.substr(w,2)===GQ?(Q=GQ,w+=2):(Q=r,we===0&&ve(OM)),Q!==r&&(Re=C,Q=fr()),C=Q)))))))),C}function fE(){var C,Q,k,N,Z,Ee,ot,ut,Tr,ni,Yn,$Q;return C=w,t.substr(w,2)===Bs?(Q=Bs,w+=2):(Q=r,we===0&&ve(jQ)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(Z=[Z,Ee],N=Z):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===Yo?(Q=Yo,w+=2):(Q=r,we===0&&ve($m)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Z=[Z,Ee,ot,ut],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===_a?(Q=_a,w+=2):(Q=r,we===0&&ve(et)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Tr=An(),Tr!==r?(ni=An(),ni!==r?(Yn=An(),Yn!==r?($Q=An(),$Q!==r?(Z=[Z,Ee,ot,ut,Tr,ni,Yn,$Q],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=YQ(k),C=Q):(w=C,C=r)):(w=C,C=r))),C}function An(){var C;return eE.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(tE)),C}function Nfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r)),k!==r)for(;k!==r;)Q.push(k),k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function _Q(){var C,Q,k,N,Z,Ee;if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;if(k!==r)if(t.charCodeAt(w)===46?(N=Al,w++):(N=r,we===0&&ve(qQ)),N!==r){if(Z=[],De.test(t.charAt(w))?(Ee=t.charAt(w),w++):(Ee=r,we===0&&ve($)),Ee!==r)for(;Ee!==r;)Z.push(Ee),De.test(t.charAt(w))?(Ee=t.charAt(w),w++):(Ee=r,we===0&&ve($));else Z=r;Z!==r?(Re=C,Q=rE(Q,k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;if(C===r){if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;k!==r?(Re=C,Q=iE(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;if(C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=JQ(Q)),C=Q,C===r&&(C=w,Q=zf(),Q!==r&&(Re=C,Q=ll(Q)),C=Q,C===r)))if(C=w,t.charCodeAt(w)===40?(Q=W,w++):(Q=r,we===0&&ve(X)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(t.charCodeAt(w)===41?(Ee=F,w++):(Ee=r,we===0&&ve(D)),Ee!==r?(Re=C,Q=WQ(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r}return C}function XQ(){var C,Q,k,N,Z,Ee,ot,ut;if(C=w,Q=_Q(),Q!==r){for(k=[],N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ee=nE,w++):(Ee=r,we===0&&ve(Gf)),Ee===r&&(t.charCodeAt(w)===47?(Ee=_c,w++):(Ee=r,we===0&&ve(jf))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ee=nE,w++):(Ee=r,we===0&&ve(Gf)),Ee===r&&(t.charCodeAt(w)===47?(Ee=_c,w++):(Ee=r,we===0&&ve(jf))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function iO(){var C,Q,k,N,Z,Ee,ot,ut;if(C=w,Q=XQ(),Q!==r){for(k=[],N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ee=al,w++):(Ee=r,we===0&&ve(qo)),Ee===r&&(t.charCodeAt(w)===45?(Ee=sl,w++):(Ee=r,we===0&&ve(ol))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ee=al,w++):(Ee=r,we===0&&ve(qo)),Ee===r&&(t.charCodeAt(w)===45?(Ee=sl,w++):(Ee=r,we===0&&ve(ol))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function nO(){var C,Q,k,N,Z,Ee;if(C=w,t.substr(w,3)===Yf?(Q=Yf,w+=3):(Q=r,we===0&&ve(Xc)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(t.substr(w,2)===xr?(Ee=xr,w+=2):(Ee=r,we===0&&ve(KM)),Ee!==r?(Re=C,Q=Jo(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;return C}function sO(){var C,Q,k,N;return C=w,t.substr(w,2)===Zs?(Q=Zs,w+=2):(Q=r,we===0&&ve(aE)),Q!==r?(k=Jf(),k!==r?(t.charCodeAt(w)===41?(N=F,w++):(N=r,we===0&&ve(D)),N!==r?(Re=C,Q=Zc(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function ZQ(){var C,Q,k,N,Z,Ee;return C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,2)===le?(N=le,w+=2):(N=r,we===0&&ve(xe)),N!==r?(Z=Sfe(),Z!==r?(t.charCodeAt(w)===125?(Ee=Pe,w++):(Ee=r,we===0&&ve(qe)),Ee!==r?(Re=C,Q=Qe(k,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,3)===Ge?(N=Ge,w+=3):(N=r,we===0&&ve(ct)),N!==r?(Re=C,Q=sr(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.charCodeAt(w)===125?(N=Pe,w++):(N=r,we===0&&ve(qe)),N!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.charCodeAt(w)===36?(Q=Afe,w++):(Q=r,we===0&&ve(lfe)),Q!==r?(k=zf(),k!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)))),C}function Lfe(){var C,Q,k;return C=w,Q=Tfe(),Q!==r?(Re=w,k=cfe(Q),k?k=void 0:k=r,k!==r?(Re=C,Q=ufe(Q),C=Q):(w=C,C=r)):(w=C,C=r),C}function Tfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k!==r)for(;k!==r;)Q.push(k),k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r);else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function oO(){var C,Q,k;if(C=w,Q=[],UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM)),k!==r)for(;k!==r;)Q.push(k),UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function zf(){var C,Q,k;if(C=w,Q=[],jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM)),k!==r)for(;k!==r;)Q.push(k),jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function aO(){var C;return gfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(ffe)),C}function AO(){var C;return hfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(pfe)),C}function ke(){var C,Q;if(C=[],qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM)),Q!==r)for(;Q!==r;)C.push(Q),qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM));else C=r;return C}if(lE=n(),lE!==r&&w===t.length)return lE;throw lE!==r&&w{"use strict";function Eke(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Xl(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Xl)}Eke(Xl,Error);Xl.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=B,L=[]),L.push($))}function qe($,G){return new Xl($,null,null,G)}function re($,G,Ce){return new Xl(Xl.buildMessage($,G),$,G,Ce)}function se(){var $,G,Ce,ee;return $=B,G=be(),G!==r?(t.charCodeAt(B)===47?(Ce=s,B++):(Ce=r,K===0&&Pe(o)),Ce!==r?(ee=be(),ee!==r?(b=$,G=a(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=be(),G!==r&&(b=$,G=l(G)),$=G),$}function be(){var $,G,Ce,ee;return $=B,G=ae(),G!==r?(t.charCodeAt(B)===64?(Ce=c,B++):(Ce=r,K===0&&Pe(u)),Ce!==r?(ee=De(),ee!==r?(b=$,G=g(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=ae(),G!==r&&(b=$,G=f(G)),$=G),$}function ae(){var $,G,Ce,ee,Ue;return $=B,t.charCodeAt(B)===64?(G=c,B++):(G=r,K===0&&Pe(u)),G!==r?(Ce=Ae(),Ce!==r?(t.charCodeAt(B)===47?(ee=s,B++):(ee=r,K===0&&Pe(o)),ee!==r?(Ue=Ae(),Ue!==r?(b=$,G=h(),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=Ae(),G!==r&&(b=$,G=h()),$=G),$}function Ae(){var $,G,Ce;if($=B,G=[],p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d)),Ce!==r)for(;Ce!==r;)G.push(Ce),p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d));else G=r;return G!==r&&(b=$,G=h()),$=G,$}function De(){var $,G,Ce;if($=B,G=[],m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(I)),Ce!==r)for(;Ce!==r;)G.push(Ce),m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(I));else G=r;return G!==r&&(b=$,G=h()),$=G,$}if(J=n(),J!==r&&B===t.length)return J;throw J!==r&&B{"use strict";function F4(t){return typeof t=="undefined"||t===null}function yke(t){return typeof t=="object"&&t!==null}function wke(t){return Array.isArray(t)?t:F4(t)?[]:[t]}function Bke(t,e){var r,i,n,s;if(e)for(s=Object.keys(e),r=0,i=s.length;r{"use strict";function Lp(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Lp.prototype=Object.create(Error.prototype);Lp.prototype.constructor=Lp;Lp.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};N4.exports=Lp});var M4=E((Vot,L4)=>{"use strict";var T4=$l();function kP(t,e,r,i,n){this.name=t,this.buffer=e,this.position=r,this.line=i,this.column=n}kP.prototype.getSnippet=function(e,r){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,r=r||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>r/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;or/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),T4.repeat(" ",e)+i+a+s+` -`+T4.repeat(" ",e+this.position-n+i.length)+"^"};kP.prototype.toString=function(e){var r,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(i+=`: -`+r)),i};L4.exports=kP});var Xr=E((_ot,O4)=>{"use strict";var K4=ng(),vke=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Ske=["scalar","sequence","mapping"];function xke(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(i){e[String(i)]=r})}),e}function kke(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(vke.indexOf(r)===-1)throw new K4('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=xke(e.styleAliases||null),Ske.indexOf(this.kind)===-1)throw new K4('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}O4.exports=kke});var ec=E((Xot,U4)=>{"use strict";var H4=$l(),hw=ng(),Pke=Xr();function PP(t,e,r){var i=[];return t.include.forEach(function(n){r=PP(n,e,r)}),t[e].forEach(function(n){r.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),r.push(n)}),r.filter(function(n,s){return i.indexOf(s)===-1})}function Dke(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function i(n){t[n.kind][n.tag]=t.fallback[n.tag]=n}for(e=0,r=arguments.length;e{"use strict";var Rke=Xr();G4.exports=new Rke("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var q4=E(($ot,Y4)=>{"use strict";var Fke=Xr();Y4.exports=new Fke("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var W4=E((eat,J4)=>{"use strict";var Nke=Xr();J4.exports=new Nke("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var pw=E((tat,z4)=>{"use strict";var Lke=ec();z4.exports=new Lke({explicit:[j4(),q4(),W4()]})});var _4=E((rat,V4)=>{"use strict";var Tke=Xr();function Mke(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function Oke(){return null}function Kke(t){return t===null}V4.exports=new Tke("tag:yaml.org,2002:null",{kind:"scalar",resolve:Mke,construct:Oke,predicate:Kke,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var Z4=E((iat,X4)=>{"use strict";var Uke=Xr();function Hke(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function Gke(t){return t==="true"||t==="True"||t==="TRUE"}function jke(t){return Object.prototype.toString.call(t)==="[object Boolean]"}X4.exports=new Uke("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Hke,construct:Gke,predicate:jke,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var ez=E((nat,$4)=>{"use strict";var Yke=$l(),qke=Xr();function Jke(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Wke(t){return 48<=t&&t<=55}function zke(t){return 48<=t&&t<=57}function Vke(t){if(t===null)return!1;var e=t.length,r=0,i=!1,n;if(!e)return!1;if(n=t[r],(n==="-"||n==="+")&&(n=t[++r]),n==="0"){if(r+1===e)return!0;if(n=t[++r],n==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var iz=E((sat,tz)=>{"use strict";var rz=$l(),Zke=Xr(),$ke=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))$");function ePe(t){return!(t===null||!$ke.test(t)||t[t.length-1]==="_")}function tPe(t){var e,r,i,n;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),r*e):r*parseFloat(e,10)}var rPe=/^[-+]?[0-9]+e/;function iPe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(rz.isNegativeZero(t))return"-0.0";return r=t.toString(10),rPe.test(r)?r.replace("e",".e"):r}function nPe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!=0||rz.isNegativeZero(t))}tz.exports=new Zke("tag:yaml.org,2002:float",{kind:"scalar",resolve:ePe,construct:tPe,predicate:nPe,represent:iPe,defaultStyle:"lowercase"})});var DP=E((oat,nz)=>{"use strict";var sPe=ec();nz.exports=new sPe({include:[pw()],implicit:[_4(),Z4(),ez(),iz()]})});var RP=E((aat,sz)=>{"use strict";var oPe=ec();sz.exports=new oPe({include:[DP()]})});var lz=E((Aat,oz)=>{"use strict";var aPe=Xr(),az=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Az=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]))?))?$");function APe(t){return t===null?!1:az.exec(t)!==null||Az.exec(t)!==null}function lPe(t){var e,r,i,n,s,o,a,l=0,c=null,u,g,f;if(e=az.exec(t),e===null&&(e=Az.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(r,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(r,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function cPe(t){return t.toISOString()}oz.exports=new aPe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:APe,construct:lPe,instanceOf:Date,represent:cPe})});var uz=E((lat,cz)=>{"use strict";var uPe=Xr();function gPe(t){return t==="<<"||t===null}cz.exports=new uPe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:gPe})});var hz=E((cat,gz)=>{"use strict";var tc;try{fz=require,tc=fz("buffer").Buffer}catch(t){}var fz,fPe=Xr(),FP=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function hPe(t){if(t===null)return!1;var e,r,i=0,n=t.length,s=FP;for(r=0;r64)){if(e<0)return!1;i+=6}return i%8==0}function pPe(t){var e,r,i=t.replace(/[\r\n=]/g,""),n=i.length,s=FP,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return r=n%4*6,r===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):r===18?(a.push(o>>10&255),a.push(o>>2&255)):r===12&&a.push(o>>4&255),tc?tc.from?tc.from(a):new tc(a):a}function dPe(t){var e="",r=0,i,n,s=t.length,o=FP;for(i=0;i>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]),r=(r<<8)+t[i];return n=s%3,n===0?(e+=o[r>>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]):n===2?(e+=o[r>>10&63],e+=o[r>>4&63],e+=o[r<<2&63],e+=o[64]):n===1&&(e+=o[r>>2&63],e+=o[r<<4&63],e+=o[64],e+=o[64]),e}function CPe(t){return tc&&tc.isBuffer(t)}gz.exports=new fPe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:hPe,construct:pPe,predicate:CPe,represent:dPe})});var dz=E((uat,pz)=>{"use strict";var mPe=Xr(),EPe=Object.prototype.hasOwnProperty,IPe=Object.prototype.toString;function yPe(t){if(t===null)return!0;var e=[],r,i,n,s,o,a=t;for(r=0,i=a.length;r{"use strict";var BPe=Xr(),QPe=Object.prototype.toString;function bPe(t){if(t===null)return!0;var e,r,i,n,s,o=t;for(s=new Array(o.length),e=0,r=o.length;e{"use strict";var SPe=Xr(),xPe=Object.prototype.hasOwnProperty;function kPe(t){if(t===null)return!0;var e,r=t;for(e in r)if(xPe.call(r,e)&&r[e]!==null)return!1;return!0}function PPe(t){return t!==null?t:{}}Ez.exports=new SPe("tag:yaml.org,2002:set",{kind:"mapping",resolve:kPe,construct:PPe})});var og=E((hat,yz)=>{"use strict";var DPe=ec();yz.exports=new DPe({include:[RP()],implicit:[lz(),uz()],explicit:[hz(),dz(),mz(),Iz()]})});var Bz=E((pat,wz)=>{"use strict";var RPe=Xr();function FPe(){return!0}function NPe(){}function LPe(){return""}function TPe(t){return typeof t=="undefined"}wz.exports=new RPe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:FPe,construct:NPe,predicate:TPe,represent:LPe})});var bz=E((dat,Qz)=>{"use strict";var MPe=Xr();function OPe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),i="";return!(e[0]==="/"&&(r&&(i=r[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function KPe(t){var e=t,r=/\/([gim]*)$/.exec(t),i="";return e[0]==="/"&&(r&&(i=r[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function UPe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function HPe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}Qz.exports=new MPe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:OPe,construct:KPe,predicate:HPe,represent:UPe})});var xz=E((Cat,vz)=>{"use strict";var dw;try{Sz=require,dw=Sz("esprima")}catch(t){typeof window!="undefined"&&(dw=window.esprima)}var Sz,GPe=Xr();function jPe(t){if(t===null)return!1;try{var e="("+t+")",r=dw.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function YPe(t){var e="("+t+")",r=dw.parse(e,{range:!0}),i=[],n;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function qPe(t){return t.toString()}function JPe(t){return Object.prototype.toString.call(t)==="[object Function]"}vz.exports=new GPe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:jPe,construct:YPe,predicate:JPe,represent:qPe})});var Tp=E((mat,kz)=>{"use strict";var Pz=ec();kz.exports=Pz.DEFAULT=new Pz({include:[og()],explicit:[Bz(),bz(),xz()]})});var Vz=E((Eat,Mp)=>{"use strict";var Ba=$l(),Dz=ng(),WPe=M4(),Rz=og(),zPe=Tp(),QA=Object.prototype.hasOwnProperty,Cw=1,Fz=2,Nz=3,mw=4,NP=1,VPe=2,Lz=3,_Pe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,XPe=/[\x85\u2028\u2029]/,ZPe=/[,\[\]\{\}]/,Tz=/^(?:!|!!|![a-z\-]+!)$/i,Mz=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Oz(t){return Object.prototype.toString.call(t)}function wo(t){return t===10||t===13}function rc(t){return t===9||t===32}function yn(t){return t===9||t===32||t===10||t===13}function ag(t){return t===44||t===91||t===93||t===123||t===125}function $Pe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function eDe(t){return t===120?2:t===117?4:t===85?8:0}function tDe(t){return 48<=t&&t<=57?t-48:-1}function Kz(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` -`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function rDe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var Uz=new Array(256),Hz=new Array(256);for(var Ag=0;Ag<256;Ag++)Uz[Ag]=Kz(Ag)?1:0,Hz[Ag]=Kz(Ag);function iDe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||zPe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Gz(t,e){return new Dz(e,new WPe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function st(t,e){throw Gz(t,e)}function Ew(t,e){t.onWarning&&t.onWarning.call(null,Gz(t,e))}var jz={YAML:function(e,r,i){var n,s,o;e.version!==null&&st(e,"duplication of %YAML directive"),i.length!==1&&st(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&st(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&st(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&Ew(e,"unsupported YAML version of the document")},TAG:function(e,r,i){var n,s;i.length!==2&&st(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],Tz.test(n)||st(e,"ill-formed tag handle (first argument) of the TAG directive"),QA.call(e.tagMap,n)&&st(e,'there is a previously declared suffix for "'+n+'" tag handle'),Mz.test(s)||st(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function bA(t,e,r,i){var n,s,o,a;if(e1&&(t.result+=Ba.repeat(` -`,e-1))}function nDe(t,e,r){var i,n,s,o,a,l,c,u,g=t.kind,f=t.result,h;if(h=t.input.charCodeAt(t.position),yn(h)||ag(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n)))return!1;for(t.kind="scalar",t.result="",s=o=t.position,a=!1;h!==0;){if(h===58){if(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n))break}else if(h===35){if(i=t.input.charCodeAt(t.position-1),yn(i))break}else{if(t.position===t.lineStart&&Iw(t)||r&&ag(h))break;if(wo(h))if(l=t.line,c=t.lineStart,u=t.lineIndent,jr(t,!1,-1),t.lineIndent>=e){a=!0,h=t.input.charCodeAt(t.position);continue}else{t.position=o,t.line=l,t.lineStart=c,t.lineIndent=u;break}}a&&(bA(t,s,o,!1),TP(t,t.line-l),s=o=t.position,a=!1),rc(h)||(o=t.position+1),h=t.input.charCodeAt(++t.position)}return bA(t,s,o,!1),t.result?!0:(t.kind=g,t.result=f,!1)}function sDe(t,e){var r,i,n;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,i=n=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(bA(t,i,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)i=t.position,t.position++,n=t.position;else return!0;else wo(r)?(bA(t,i,n,!0),TP(t,jr(t,!1,e)),i=n=t.position):t.position===t.lineStart&&Iw(t)?st(t,"unexpected end of the document within a single quoted scalar"):(t.position++,n=t.position);st(t,"unexpected end of the stream within a single quoted scalar")}function oDe(t,e){var r,i,n,s,o,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=i=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return bA(t,r,t.position,!0),t.position++,!0;if(a===92){if(bA(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),wo(a))jr(t,!1,e);else if(a<256&&Uz[a])t.result+=Hz[a],t.position++;else if((o=eDe(a))>0){for(n=o,s=0;n>0;n--)a=t.input.charCodeAt(++t.position),(o=$Pe(a))>=0?s=(s<<4)+o:st(t,"expected hexadecimal character");t.result+=rDe(s),t.position++}else st(t,"unknown escape sequence");r=i=t.position}else wo(a)?(bA(t,r,i,!0),TP(t,jr(t,!1,e)),r=i=t.position):t.position===t.lineStart&&Iw(t)?st(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}st(t,"unexpected end of the stream within a double quoted scalar")}function aDe(t,e){var r=!0,i,n=t.tag,s,o=t.anchor,a,l,c,u,g,f={},h,p,d,m;if(m=t.input.charCodeAt(t.position),m===91)l=93,g=!1,s=[];else if(m===123)l=125,g=!0,s={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=s),m=t.input.charCodeAt(++t.position);m!==0;){if(jr(t,!0,e),m=t.input.charCodeAt(t.position),m===l)return t.position++,t.tag=n,t.anchor=o,t.kind=g?"mapping":"sequence",t.result=s,!0;r||st(t,"missed comma between flow collection entries"),p=h=d=null,c=u=!1,m===63&&(a=t.input.charCodeAt(t.position+1),yn(a)&&(c=u=!0,t.position++,jr(t,!0,e))),i=t.line,cg(t,e,Cw,!1,!0),p=t.tag,h=t.result,jr(t,!0,e),m=t.input.charCodeAt(t.position),(u||t.line===i)&&m===58&&(c=!0,m=t.input.charCodeAt(++t.position),jr(t,!0,e),cg(t,e,Cw,!1,!0),d=t.result),g?lg(t,s,f,p,h,d):c?s.push(lg(t,null,f,p,h,d)):s.push(h),jr(t,!0,e),m=t.input.charCodeAt(t.position),m===44?(r=!0,m=t.input.charCodeAt(++t.position)):r=!1}st(t,"unexpected end of the stream within a flow collection")}function ADe(t,e){var r,i,n=NP,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=t.input.charCodeAt(t.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(t.kind="scalar",t.result="";g!==0;)if(g=t.input.charCodeAt(++t.position),g===43||g===45)NP===n?n=g===43?Lz:VPe:st(t,"repeat of a chomping mode identifier");else if((u=tDe(g))>=0)u===0?st(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?st(t,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(rc(g)){do g=t.input.charCodeAt(++t.position);while(rc(g));if(g===35)do g=t.input.charCodeAt(++t.position);while(!wo(g)&&g!==0)}for(;g!==0;){for(LP(t),t.lineIndent=0,g=t.input.charCodeAt(t.position);(!o||t.lineIndenta&&(a=t.lineIndent),wo(g)){l++;continue}if(t.lineIndente)&&l!==0)st(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(cg(t,e,mw,!0,n)&&(p?f=t.result:h=t.result),p||(lg(t,c,u,g,f,h,s,o),g=f=h=null),jr(t,!0,-1),m=t.input.charCodeAt(t.position)),t.lineIndent>e&&m!==0)st(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),g=0,f=t.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+t.kind+'"'),h.resolve(t.result)?(t.result=h.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):st(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):st(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||u}function fDe(t){var e=t.position,r,i,n,s=!1,o;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(o=t.input.charCodeAt(t.position))!==0&&(jr(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||o!==37));){for(s=!0,o=t.input.charCodeAt(++t.position),r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);for(i=t.input.slice(r,t.position),n=[],i.length<1&&st(t,"directive name must not be less than one character in length");o!==0;){for(;rc(o);)o=t.input.charCodeAt(++t.position);if(o===35){do o=t.input.charCodeAt(++t.position);while(o!==0&&!wo(o));break}if(wo(o))break;for(r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(r,t.position))}o!==0&&LP(t),QA.call(jz,i)?jz[i](t,i,n):Ew(t,'unknown document directive "'+i+'"')}if(jr(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,jr(t,!0,-1)):s&&st(t,"directives end mark is expected"),cg(t,t.lineIndent-1,mw,!1,!0),jr(t,!0,-1),t.checkLineBreaks&&XPe.test(t.input.slice(e,t.position))&&Ew(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Iw(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,jr(t,!0,-1));return}if(t.position{"use strict";var Op=$l(),Kp=ng(),dDe=Tp(),CDe=og(),_z=Object.prototype.toString,Xz=Object.prototype.hasOwnProperty,mDe=9,Up=10,EDe=13,IDe=32,yDe=33,wDe=34,Zz=35,BDe=37,QDe=38,bDe=39,vDe=42,$z=44,SDe=45,e5=58,xDe=61,kDe=62,PDe=63,DDe=64,t5=91,r5=93,RDe=96,i5=123,FDe=124,n5=125,Ri={};Ri[0]="\\0";Ri[7]="\\a";Ri[8]="\\b";Ri[9]="\\t";Ri[10]="\\n";Ri[11]="\\v";Ri[12]="\\f";Ri[13]="\\r";Ri[27]="\\e";Ri[34]='\\"';Ri[92]="\\\\";Ri[133]="\\N";Ri[160]="\\_";Ri[8232]="\\L";Ri[8233]="\\P";var NDe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function LDe(t,e){var r,i,n,s,o,a,l;if(e===null)return{};for(r={},i=Object.keys(e),n=0,s=i.length;n0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}else{for(s=0;si&&t[g+1]!==" ",g=s);else if(!ug(o))return yw;a=s>0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}c=c||u&&s-g-1>i&&t[g+1]!==" "}return!l&&!c?f&&!n(t)?l5:c5:r>9&&A5(t)?yw:c?g5:u5}function jDe(t,e,r,i){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&NDe.indexOf(e)!==-1)return"'"+e+"'";var n=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-n),o=i||t.flowLevel>-1&&r>=t.flowLevel;function a(l){return MDe(t,l)}switch(UDe(e,o,t.indent,s,a)){case l5:return e;case c5:return"'"+e.replace(/'/g,"''")+"'";case u5:return"|"+f5(e,t.indent)+h5(o5(e,n));case g5:return">"+f5(e,t.indent)+h5(o5(HDe(e,s),n));case yw:return'"'+GDe(e,s)+'"';default:throw new Kp("impossible error: invalid scalar style")}}()}function f5(t,e){var r=A5(t)?String(e):"",i=t[t.length-1]===` -`,n=i&&(t[t.length-2]===` -`||t===` -`),s=n?"+":i?"":"-";return r+s+` -`}function h5(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function HDe(t,e){for(var r=/(\n+)([^\n]*)/g,i=function(){var c=t.indexOf(` -`);return c=c!==-1?c:t.length,r.lastIndex=c,p5(t.slice(0,c),e)}(),n=t[0]===` -`||t[0]===" ",s,o;o=r.exec(t);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+p5(l,e),n=s}return i}function p5(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=r.exec(t);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+t.slice(n,s),n=s+1),o=a;return l+=` -`,t.length-n>e&&o>n?l+=t.slice(n,o)+` -`+t.slice(o+1):l+=t.slice(n),l.slice(1)}function GDe(t){for(var e="",r,i,n,s=0;s=55296&&r<=56319&&(i=t.charCodeAt(s+1),i>=56320&&i<=57343)){e+=s5((r-55296)*1024+i-56320+65536),s++;continue}n=Ri[r],e+=!n&&ug(r)?t[s]:n||s5(r)}return e}function YDe(t,e,r){var i="",n=t.tag,s,o;for(s=0,o=r.length;s1024&&(u+="? "),u+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),!!ic(t,e,c,!1,!1)&&(u+=t.dump,i+=u));t.tag=n,t.dump="{"+i+"}"}function WDe(t,e,r,i){var n="",s=t.tag,o=Object.keys(r),a,l,c,u,g,f;if(t.sortKeys===!0)o.sort();else if(typeof t.sortKeys=="function")o.sort(t.sortKeys);else if(t.sortKeys)throw new Kp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(t.dump&&Up===t.dump.charCodeAt(0)?f+="?":f+="? "),f+=t.dump,g&&(f+=OP(t,e)),!!ic(t,e+1,u,!0,g)&&(t.dump&&Up===t.dump.charCodeAt(0)?f+=":":f+=": ",f+=t.dump,n+=f));t.tag=s,t.dump=n||"{}"}function d5(t,e,r){var i,n,s,o,a,l;for(n=r?t.explicitTypes:t.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');t.dump=i}return!0}return!1}function ic(t,e,r,i,n,s){t.tag=null,t.dump=r,d5(t,r,!1)||d5(t,r,!0);var o=_z.call(t.dump);i&&(i=t.flowLevel<0||t.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=t.duplicates.indexOf(r),c=l!==-1),(t.tag!==null&&t.tag!=="?"||c||t.indent!==2&&e>0)&&(n=!1),c&&t.usedDuplicates[l])t.dump="*ref_"+l;else{if(a&&c&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(t.dump).length!==0?(WDe(t,e,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(JDe(t,e,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump));else if(o==="[object Array]"){var u=t.noArrayIndent&&e>0?e-1:e;i&&t.dump.length!==0?(qDe(t,u,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(YDe(t,u,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump))}else if(o==="[object String]")t.tag!=="?"&&jDe(t,t.dump,e,s);else{if(t.skipInvalid)return!1;throw new Kp("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function zDe(t,e){var r=[],i=[],n,s;for(UP(t,r,i),n=0,s=i.length;n{"use strict";var ww=Vz(),E5=m5();function Bw(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Qr.exports.Type=Xr();Qr.exports.Schema=ec();Qr.exports.FAILSAFE_SCHEMA=pw();Qr.exports.JSON_SCHEMA=DP();Qr.exports.CORE_SCHEMA=RP();Qr.exports.DEFAULT_SAFE_SCHEMA=og();Qr.exports.DEFAULT_FULL_SCHEMA=Tp();Qr.exports.load=ww.load;Qr.exports.loadAll=ww.loadAll;Qr.exports.safeLoad=ww.safeLoad;Qr.exports.safeLoadAll=ww.safeLoadAll;Qr.exports.dump=E5.dump;Qr.exports.safeDump=E5.safeDump;Qr.exports.YAMLException=ng();Qr.exports.MINIMAL_SCHEMA=pw();Qr.exports.SAFE_SCHEMA=og();Qr.exports.DEFAULT_SCHEMA=Tp();Qr.exports.scan=Bw("scan");Qr.exports.parse=Bw("parse");Qr.exports.compose=Bw("compose");Qr.exports.addConstructor=Bw("addConstructor")});var w5=E((wat,y5)=>{"use strict";var _De=I5();y5.exports=_De});var Q5=E((Bat,B5)=>{"use strict";function XDe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function nc(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,nc)}XDe(nc,Error);nc.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[xe]:le})))},H=function(x){return x},L=function(x){return x},K=Yo("correct indentation"),J=" ",ne=fr(" ",!1),q=function(x){return x.length===Zc*aE},A=function(x){return x.length===(Zc+1)*aE},V=function(){return Zc++,!0},W=function(){return Zc--,!0},X=function(){return Xm()},F=Yo("pseudostring"),D=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,he=Bs(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),pe=/^[^\r\n\t ,\][{}:#"']/,Ne=Bs(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Pe=function(){return Xm().replace(/^ *| *$/g,"")},qe="--",re=fr("--",!1),se=/^[a-zA-Z\/0-9]/,be=Bs([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),ae=/^[^\r\n\t :,]/,Ae=Bs(["\r",` -`," "," ",":",","],!0,!1),De="null",$=fr("null",!1),G=function(){return null},Ce="true",ee=fr("true",!1),Ue=function(){return!0},Oe="false",vt=fr("false",!1),dt=function(){return!1},ri=Yo("string"),ii='"',an=fr('"',!1),yr=function(){return""},Ki=function(x){return x},Qi=function(x){return x.join("")},Go=/^[^"\\\0-\x1F\x7F]/,wr=Bs(['"',"\\",["\0",""],"\x7F"],!0,!1),Ui='\\"',ws=fr('\\"',!1),Tf=function(){return'"'},Mf="\\\\",Rm=fr("\\\\",!1),Fm=function(){return"\\"},Nm="\\/",DQ=fr("\\/",!1),RQ=function(){return"/"},Of="\\b",FQ=fr("\\b",!1),NQ=function(){return"\b"},Lm="\\f",LQ=fr("\\f",!1),Va=function(){return"\f"},jo="\\n",Tm=fr("\\n",!1),Mm=function(){return` -`},te="\\r",Om=fr("\\r",!1),Km=function(){return"\r"},il="\\t",Um=fr("\\t",!1),Hm=function(){return" "},Kf="\\u",Gm=fr("\\u",!1),jm=function(x,U,le,xe){return String.fromCharCode(parseInt(`0x${x}${U}${le}${xe}`))},TQ=/^[0-9a-fA-F]/,MQ=Bs([["0","9"],["a","f"],["A","F"]],!1,!1),Ym=Yo("blank space"),qm=/^[ \t]/,Jm=Bs([" "," "],!1,!1),Wm=Yo("white space"),zm=/^[ \t\n\r]/,Vm=Bs([" "," ",` -`,"\r"],!1,!1),Uf=`\r -`,OQ=fr(`\r -`,!1),KQ=` -`,_m=fr(` -`,!1),UQ="\r",HQ=fr("\r",!1),O=0,ht=0,Vc=[{line:1,column:1}],xn=0,Hf=[],Ye=0,nl;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Xm(){return t.substring(ht,O)}function MM(){return _a(ht,O)}function GQ(x,U){throw U=U!==void 0?U:_a(ht,O),eE([Yo(x)],t.substring(ht,O),U)}function OM(x,U){throw U=U!==void 0?U:_a(ht,O),YQ(x,U)}function fr(x,U){return{type:"literal",text:x,ignoreCase:U}}function Bs(x,U,le){return{type:"class",parts:x,inverted:U,ignoreCase:le}}function jQ(){return{type:"any"}}function Zm(){return{type:"end"}}function Yo(x){return{type:"other",description:x}}function $m(x){var U=Vc[x],le;if(U)return U;for(le=x-1;!Vc[le];)le--;for(U=Vc[le],U={line:U.line,column:U.column};lexn&&(xn=O,Hf=[]),Hf.push(x))}function YQ(x,U){return new nc(x,null,null,U)}function eE(x,U,le){return new nc(nc.buildMessage(x,U),x,U,le)}function tE(){var x;return x=ol(),x}function Xa(){var x,U,le;for(x=O,U=[],le=sl();le!==r;)U.push(le),le=sl();return U!==r&&(ht=x,U=s(U)),x=U,x}function sl(){var x,U,le,xe,Qe;return x=O,U=Al(),U!==r?(t.charCodeAt(O)===45?(le=o,O++):(le=r,Ye===0&&et(a)),le!==r?(xe=xr(),xe!==r?(Qe=qo(),Qe!==r?(ht=x,U=l(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x}function ol(){var x,U,le;for(x=O,U=[],le=al();le!==r;)U.push(le),le=al();return U!==r&&(ht=x,U=c(U)),x=U,x}function al(){var x,U,le,xe,Qe,Ge,ct,sr,Wo;if(x=O,U=xr(),U===r&&(U=null),U!==r){if(le=O,t.charCodeAt(O)===35?(xe=u,O++):(xe=r,Ye===0&&et(g)),xe!==r){if(Qe=[],Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r),Ge!==r)for(;Ge!==r;)Qe.push(Ge),Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r);else Qe=r;Qe!==r?(xe=[xe,Qe],le=xe):(O=le,le=r)}else O=le,le=r;if(le===r&&(le=null),le!==r){if(xe=[],Qe=Jo(),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=Jo();else xe=r;xe!==r?(ht=x,U=h(),x=U):(O=x,x=r)}else O=x,x=r}else O=x,x=r;if(x===r&&(x=O,U=Al(),U!==r?(le=JQ(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Al(),U!==r?(le=ll(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))){if(x=O,U=Al(),U!==r)if(le=ll(),le!==r)if(xe=xr(),xe!==r)if(Qe=nE(),Qe!==r){if(Ge=[],ct=Jo(),ct!==r)for(;ct!==r;)Ge.push(ct),ct=Jo();else Ge=r;Ge!==r?(ht=x,U=m(le,Qe),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;else O=x,x=r;else O=x,x=r;if(x===r)if(x=O,U=Al(),U!==r)if(le=ll(),le!==r){if(xe=[],Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=I,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=I,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r);else xe=r;xe!==r?(Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(t.charCodeAt(O)===58?(Ge=p,O++):(Ge=r,Ye===0&&et(d)),Ge!==r?(ct=xr(),ct===r&&(ct=null),ct!==r?(sr=qo(),sr!==r?(ht=x,U=R(le,xe,sr),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)}else O=x,x=r;else O=x,x=r}return x}function qo(){var x,U,le,xe,Qe,Ge,ct;if(x=O,U=O,Ye++,le=O,xe=Zs(),xe!==r?(Qe=qQ(),Qe!==r?(t.charCodeAt(O)===45?(Ge=o,O++):(Ge=r,Ye===0&&et(a)),Ge!==r?(ct=xr(),ct!==r?(xe=[xe,Qe,Ge,ct],le=xe):(O=le,le=r)):(O=le,le=r)):(O=le,le=r)):(O=le,le=r),Ye--,le!==r?(O=U,U=void 0):U=r,U!==r?(le=Jo(),le!==r?(xe=rE(),xe!==r?(Qe=Xa(),Qe!==r?(Ge=iE(),Ge!==r?(ht=x,U=H(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Zs(),U!==r?(le=rE(),le!==r?(xe=ol(),xe!==r?(Qe=iE(),Qe!==r?(ht=x,U=H(xe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))if(x=O,U=WQ(),U!==r){if(le=[],xe=Jo(),xe!==r)for(;xe!==r;)le.push(xe),xe=Jo();else le=r;le!==r?(ht=x,U=L(U),x=U):(O=x,x=r)}else O=x,x=r;return x}function Al(){var x,U,le;for(Ye++,x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=q(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),Ye--,x===r&&(U=r,Ye===0&&et(K)),x}function qQ(){var x,U,le;for(x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=A(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),x}function rE(){var x;return ht=O,x=V(),x?x=void 0:x=r,x}function iE(){var x;return ht=O,x=W(),x?x=void 0:x=r,x}function JQ(){var x;return x=cl(),x===r&&(x=Gf()),x}function ll(){var x,U,le;if(x=cl(),x===r){if(x=O,U=[],le=_c(),le!==r)for(;le!==r;)U.push(le),le=_c();else U=r;U!==r&&(ht=x,U=X()),x=U}return x}function WQ(){var x;return x=jf(),x===r&&(x=sE(),x===r&&(x=cl(),x===r&&(x=Gf()))),x}function nE(){var x;return x=jf(),x===r&&(x=cl(),x===r&&(x=_c())),x}function Gf(){var x,U,le,xe,Qe,Ge;if(Ye++,x=O,D.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(he)),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;return Ye--,x===r&&(U=r,Ye===0&&et(F)),x}function _c(){var x,U,le,xe,Qe;if(x=O,t.substr(O,2)===qe?(U=qe,O+=2):(U=r,Ye===0&&et(re)),U===r&&(U=null),U!==r)if(se.test(t.charAt(O))?(le=t.charAt(O),O++):(le=r,Ye===0&&et(be)),le!==r){for(xe=[],ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));Qe!==r;)xe.push(Qe),ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));xe!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;return x}function jf(){var x,U;return x=O,t.substr(O,4)===De?(U=De,O+=4):(U=r,Ye===0&&et($)),U!==r&&(ht=x,U=G()),x=U,x}function sE(){var x,U;return x=O,t.substr(O,4)===Ce?(U=Ce,O+=4):(U=r,Ye===0&&et(ee)),U!==r&&(ht=x,U=Ue()),x=U,x===r&&(x=O,t.substr(O,5)===Oe?(U=Oe,O+=5):(U=r,Ye===0&&et(vt)),U!==r&&(ht=x,U=dt()),x=U),x}function cl(){var x,U,le,xe;return Ye++,x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(t.charCodeAt(O)===34?(le=ii,O++):(le=r,Ye===0&&et(an)),le!==r?(ht=x,U=yr(),x=U):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(le=oE(),le!==r?(t.charCodeAt(O)===34?(xe=ii,O++):(xe=r,Ye===0&&et(an)),xe!==r?(ht=x,U=Ki(le),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)),Ye--,x===r&&(U=r,Ye===0&&et(ri)),x}function oE(){var x,U,le;if(x=O,U=[],le=Yf(),le!==r)for(;le!==r;)U.push(le),le=Yf();else U=r;return U!==r&&(ht=x,U=Qi(U)),x=U,x}function Yf(){var x,U,le,xe,Qe,Ge;return Go.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(wr)),x===r&&(x=O,t.substr(O,2)===Ui?(U=Ui,O+=2):(U=r,Ye===0&&et(ws)),U!==r&&(ht=x,U=Tf()),x=U,x===r&&(x=O,t.substr(O,2)===Mf?(U=Mf,O+=2):(U=r,Ye===0&&et(Rm)),U!==r&&(ht=x,U=Fm()),x=U,x===r&&(x=O,t.substr(O,2)===Nm?(U=Nm,O+=2):(U=r,Ye===0&&et(DQ)),U!==r&&(ht=x,U=RQ()),x=U,x===r&&(x=O,t.substr(O,2)===Of?(U=Of,O+=2):(U=r,Ye===0&&et(FQ)),U!==r&&(ht=x,U=NQ()),x=U,x===r&&(x=O,t.substr(O,2)===Lm?(U=Lm,O+=2):(U=r,Ye===0&&et(LQ)),U!==r&&(ht=x,U=Va()),x=U,x===r&&(x=O,t.substr(O,2)===jo?(U=jo,O+=2):(U=r,Ye===0&&et(Tm)),U!==r&&(ht=x,U=Mm()),x=U,x===r&&(x=O,t.substr(O,2)===te?(U=te,O+=2):(U=r,Ye===0&&et(Om)),U!==r&&(ht=x,U=Km()),x=U,x===r&&(x=O,t.substr(O,2)===il?(U=il,O+=2):(U=r,Ye===0&&et(Um)),U!==r&&(ht=x,U=Hm()),x=U,x===r&&(x=O,t.substr(O,2)===Kf?(U=Kf,O+=2):(U=r,Ye===0&&et(Gm)),U!==r?(le=Xc(),le!==r?(xe=Xc(),xe!==r?(Qe=Xc(),Qe!==r?(Ge=Xc(),Ge!==r?(ht=x,U=jm(le,xe,Qe,Ge),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)))))))))),x}function Xc(){var x;return TQ.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(MQ)),x}function xr(){var x,U;if(Ye++,x=[],qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm)),U!==r)for(;U!==r;)x.push(U),qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Ym)),x}function KM(){var x,U;if(Ye++,x=[],zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm)),U!==r)for(;U!==r;)x.push(U),zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Wm)),x}function Jo(){var x,U,le,xe,Qe,Ge;if(x=O,U=Zs(),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(U=[U,le],x=U):(O=x,x=r)}else O=x,x=r;return x}function Zs(){var x;return t.substr(O,2)===Uf?(x=Uf,O+=2):(x=r,Ye===0&&et(OQ)),x===r&&(t.charCodeAt(O)===10?(x=KQ,O++):(x=r,Ye===0&&et(_m)),x===r&&(t.charCodeAt(O)===13?(x=UQ,O++):(x=r,Ye===0&&et(HQ)))),x}let aE=2,Zc=0;if(nl=n(),nl!==r&&O===t.length)return nl;throw nl!==r&&O{var fRe=typeof global=="object"&&global&&global.Object===Object&&global;V5.exports=fRe});var Ks=E((Zat,_5)=>{var hRe=WP(),pRe=typeof self=="object"&&self&&self.Object===Object&&self,dRe=hRe||pRe||Function("return this")();_5.exports=dRe});var ac=E(($at,X5)=>{var CRe=Ks(),mRe=CRe.Symbol;X5.exports=mRe});var $5=E((eAt,Z5)=>{function ERe(t,e){for(var r=-1,i=t==null?0:t.length,n=Array(i);++r{var IRe=Array.isArray;e6.exports=IRe});var n6=E((rAt,t6)=>{var r6=ac(),i6=Object.prototype,yRe=i6.hasOwnProperty,wRe=i6.toString,Jp=r6?r6.toStringTag:void 0;function BRe(t){var e=yRe.call(t,Jp),r=t[Jp];try{t[Jp]=void 0;var i=!0}catch(s){}var n=wRe.call(t);return i&&(e?t[Jp]=r:delete t[Jp]),n}t6.exports=BRe});var o6=E((iAt,s6)=>{var QRe=Object.prototype,bRe=QRe.toString;function vRe(t){return bRe.call(t)}s6.exports=vRe});var Ac=E((nAt,a6)=>{var A6=ac(),SRe=n6(),xRe=o6(),kRe="[object Null]",PRe="[object Undefined]",l6=A6?A6.toStringTag:void 0;function DRe(t){return t==null?t===void 0?PRe:kRe:l6&&l6 in Object(t)?SRe(t):xRe(t)}a6.exports=DRe});var Qo=E((sAt,c6)=>{function RRe(t){return t!=null&&typeof t=="object"}c6.exports=RRe});var Nw=E((oAt,u6)=>{var FRe=Ac(),NRe=Qo(),LRe="[object Symbol]";function TRe(t){return typeof t=="symbol"||NRe(t)&&FRe(t)==LRe}u6.exports=TRe});var C6=E((aAt,g6)=>{var f6=ac(),MRe=$5(),ORe=As(),KRe=Nw(),URe=1/0,h6=f6?f6.prototype:void 0,p6=h6?h6.toString:void 0;function d6(t){if(typeof t=="string")return t;if(ORe(t))return MRe(t,d6)+"";if(KRe(t))return p6?p6.call(t):"";var e=t+"";return e=="0"&&1/t==-URe?"-0":e}g6.exports=d6});var gg=E((AAt,m6)=>{var HRe=C6();function GRe(t){return t==null?"":HRe(t)}m6.exports=GRe});var zP=E((lAt,E6)=>{function jRe(t,e,r){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var s=Array(n);++i{var YRe=zP();function qRe(t,e,r){var i=t.length;return r=r===void 0?i:r,!e&&r>=i?t:YRe(t,e,r)}I6.exports=qRe});var VP=E((uAt,w6)=>{var JRe="\\ud800-\\udfff",WRe="\\u0300-\\u036f",zRe="\\ufe20-\\ufe2f",VRe="\\u20d0-\\u20ff",_Re=WRe+zRe+VRe,XRe="\\ufe0e\\ufe0f",ZRe="\\u200d",$Re=RegExp("["+ZRe+JRe+_Re+XRe+"]");function eFe(t){return $Re.test(t)}w6.exports=eFe});var Q6=E((gAt,B6)=>{function tFe(t){return t.split("")}B6.exports=tFe});var R6=E((fAt,b6)=>{var v6="\\ud800-\\udfff",rFe="\\u0300-\\u036f",iFe="\\ufe20-\\ufe2f",nFe="\\u20d0-\\u20ff",sFe=rFe+iFe+nFe,oFe="\\ufe0e\\ufe0f",aFe="["+v6+"]",_P="["+sFe+"]",XP="\\ud83c[\\udffb-\\udfff]",AFe="(?:"+_P+"|"+XP+")",S6="[^"+v6+"]",x6="(?:\\ud83c[\\udde6-\\uddff]){2}",k6="[\\ud800-\\udbff][\\udc00-\\udfff]",lFe="\\u200d",P6=AFe+"?",D6="["+oFe+"]?",cFe="(?:"+lFe+"(?:"+[S6,x6,k6].join("|")+")"+D6+P6+")*",uFe=D6+P6+cFe,gFe="(?:"+[S6+_P+"?",_P,x6,k6,aFe].join("|")+")",fFe=RegExp(XP+"(?="+XP+")|"+gFe+uFe,"g");function hFe(t){return t.match(fFe)||[]}b6.exports=hFe});var N6=E((hAt,F6)=>{var pFe=Q6(),dFe=VP(),CFe=R6();function mFe(t){return dFe(t)?CFe(t):pFe(t)}F6.exports=mFe});var T6=E((pAt,L6)=>{var EFe=y6(),IFe=VP(),yFe=N6(),wFe=gg();function BFe(t){return function(e){e=wFe(e);var r=IFe(e)?yFe(e):void 0,i=r?r[0]:e.charAt(0),n=r?EFe(r,1).join(""):e.slice(1);return i[t]()+n}}L6.exports=BFe});var O6=E((dAt,M6)=>{var QFe=T6(),bFe=QFe("toUpperCase");M6.exports=bFe});var ZP=E((CAt,K6)=>{var vFe=gg(),SFe=O6();function xFe(t){return SFe(vFe(t).toLowerCase())}K6.exports=xFe});var H6=E((mAt,U6)=>{"use strict";U6.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Wp=E((EAt,$P)=>{"use strict";var kFe=H6(),G6=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,i=()=>{r--,e.length>0&&e.shift()()},n=(a,l,...c)=>{r++;let u=kFe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{rnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),o};$P.exports=G6;$P.exports.default=G6});var X6=E((FAt,Mw)=>{function PFe(){var t=0,e=1,r=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,d=15,m=16,I=17,B=0,b=1,R=2,H=3,L=4;function K(A,V){return 55296<=A.charCodeAt(V)&&A.charCodeAt(V)<=56319&&56320<=A.charCodeAt(V+1)&&A.charCodeAt(V+1)<=57343}function J(A,V){V===void 0&&(V=0);var W=A.charCodeAt(V);if(55296<=W&&W<=56319&&V=1){var X=A.charCodeAt(V-1),F=W;return 55296<=X&&X<=56319?(X-55296)*1024+(F-56320)+65536:F}return W}function ne(A,V,W){var X=[A].concat(V).concat([W]),F=X[X.length-2],D=W,he=X.lastIndexOf(p);if(he>1&&X.slice(1,he).every(function(Pe){return Pe==i})&&[i,h,I].indexOf(A)==-1)return R;var pe=X.lastIndexOf(n);if(pe>0&&X.slice(1,pe).every(function(Pe){return Pe==n})&&[f,n].indexOf(F)==-1)return X.filter(function(Pe){return Pe==n}).length%2==1?H:L;if(F==t&&D==e)return B;if(F==r||F==t||F==e)return D==p&&V.every(function(Pe){return Pe==i})?R:b;if(D==r||D==t||D==e)return b;if(F==o&&(D==o||D==a||D==c||D==u))return B;if((F==c||F==a)&&(D==a||D==l))return B;if((F==u||F==l)&&D==l)return B;if(D==i||D==d)return B;if(D==s)return B;if(F==f)return B;var Ne=X.indexOf(i)!=-1?X.lastIndexOf(i)-1:X.length-2;return[h,I].indexOf(X[Ne])!=-1&&X.slice(Ne+1,-1).every(function(Pe){return Pe==i})&&D==p||F==d&&[m,I].indexOf(D)!=-1?B:V.indexOf(n)!=-1?R:F==n&&D==n?B:b}this.nextBreak=function(A,V){if(V===void 0&&(V=0),V<0)return 0;if(V>=A.length-1)return A.length;for(var W=q(J(A,V)),X=[],F=V+1;F{var DFe=X6(),RFe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,FFe=new DFe;Z6.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=r-e,n="",s=0,o=0;for(;t.length>0;){let a=t.match(RFe)||[t,t,void 0],l=FFe.splitGraphemes(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),t=t.slice(a[0].length)}return n}});var fg=E((alt,f9)=>{"use strict";var h9=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"]]),olt=f9.exports=t=>t?Object.keys(t).map(e=>[h9.has(e)?h9.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var hg=E((Alt,p9)=>{"use strict";var JFe=require("events"),d9=require("stream"),_p=Rh(),C9=require("string_decoder").StringDecoder,va=Symbol("EOF"),Xp=Symbol("maybeEmitEnd"),xA=Symbol("emittedEnd"),Gw=Symbol("emittingEnd"),jw=Symbol("closed"),m9=Symbol("read"),iD=Symbol("flush"),E9=Symbol("flushChunk"),Bn=Symbol("encoding"),Sa=Symbol("decoder"),Yw=Symbol("flowing"),Zp=Symbol("paused"),$p=Symbol("resume"),rn=Symbol("bufferLength"),I9=Symbol("bufferPush"),nD=Symbol("bufferShift"),Ni=Symbol("objectMode"),Li=Symbol("destroyed"),y9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",WFe=y9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),zFe=y9&&Symbol.iterator||Symbol("iterator not implemented"),w9=t=>t==="end"||t==="finish"||t==="prefinish",VFe=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,_Fe=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t);p9.exports=class B9 extends d9{constructor(e){super();this[Yw]=!1,this[Zp]=!1,this.pipes=new _p,this.buffer=new _p,this[Ni]=e&&e.objectMode||!1,this[Ni]?this[Bn]=null:this[Bn]=e&&e.encoding||null,this[Bn]==="buffer"&&(this[Bn]=null),this[Sa]=this[Bn]?new C9(this[Bn]):null,this[va]=!1,this[xA]=!1,this[Gw]=!1,this[jw]=!1,this.writable=!0,this.readable=!0,this[rn]=0,this[Li]=!1}get bufferLength(){return this[rn]}get encoding(){return this[Bn]}set encoding(e){if(this[Ni])throw new Error("cannot set encoding in objectMode");if(this[Bn]&&e!==this[Bn]&&(this[Sa]&&this[Sa].lastNeed||this[rn]))throw new Error("cannot change encoding");this[Bn]!==e&&(this[Sa]=e?new C9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Sa].write(r)))),this[Bn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Ni]}set objectMode(e){this[Ni]=this[Ni]||!!e}write(e,r,i){if(this[va])throw new Error("write after end");return this[Li]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof r=="function"&&(i=r,r="utf8"),r||(r="utf8"),!this[Ni]&&!Buffer.isBuffer(e)&&(_Fe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):VFe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[Ni]&&!(r===this[Bn]&&!this[Sa].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Bn]&&(e=this[Sa].write(e)),this.flowing?(this[rn]!==0&&this[iD](!0),this.emit("data",e)):this[I9](e),this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Li])return null;try{return this[rn]===0||e===0||e>this[rn]?null:(this[Ni]&&(e=null),this.buffer.length>1&&!this[Ni]&&(this.encoding?this.buffer=new _p([Array.from(this.buffer).join("")]):this.buffer=new _p([Buffer.concat(Array.from(this.buffer),this[rn])])),this[m9](e||null,this.buffer.head.value))}finally{this[Xp]()}}[m9](e,r){return e===r.length||e===null?this[nD]():(this.buffer.head.value=r.slice(e),r=r.slice(0,e),this[rn]-=e),this.emit("data",r),!this.buffer.length&&!this[va]&&this.emit("drain"),r}end(e,r,i){return typeof e=="function"&&(i=e,e=null),typeof r=="function"&&(i=r,r="utf8"),e&&this.write(e,r),i&&this.once("end",i),this[va]=!0,this.writable=!1,(this.flowing||!this[Zp])&&this[Xp](),this}[$p](){this[Li]||(this[Zp]=!1,this[Yw]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[va]?this[Xp]():this.emit("drain"))}resume(){return this[$p]()}pause(){this[Yw]=!1,this[Zp]=!0}get destroyed(){return this[Li]}get flowing(){return this[Yw]}get paused(){return this[Zp]}[I9](e){return this[Ni]?this[rn]+=1:this[rn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[Ni]?this[rn]-=1:this[rn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[E9](this[nD]()));!e&&!this.buffer.length&&!this[va]&&this.emit("drain")}[E9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Li])return;let i=this[xA];r=r||{},e===process.stdout||e===process.stderr?r.end=!1:r.end=r.end!==!1;let n={dest:e,opts:r,ondrain:s=>this[$p]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[$p](),i&&n.opts.end&&n.dest.end(),e}addListener(e,r){return this.on(e,r)}on(e,r){try{return super.on(e,r)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[$p]():w9(e)&&this[xA]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[xA]}[Xp](){!this[Gw]&&!this[xA]&&!this[Li]&&this.buffer.length===0&&this[va]&&(this[Gw]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[jw]&&this.emit("close"),this[Gw]=!1)}emit(e,r){if(e!=="error"&&e!=="close"&&e!==Li&&this[Li])return;if(e==="data"){if(!r)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(r)===!1&&this.pause())}else if(e==="end"){if(this[xA]===!0)return;this[xA]=!0,this.readable=!1,this[Sa]&&(r=this[Sa].end(),r&&(this.pipes.forEach(n=>n.dest.write(r)),super.emit("data",r))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[jw]=!0,!this[xA]&&!this[Li]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=r,arguments.length>2)for(let n=2;n{e.push(i),this[Ni]||(e.dataLength+=i.length)}),r.then(()=>e)}concat(){return this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this[Bn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Li,()=>r(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>r(i))})}[WFe](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[va])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[va]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Li,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[zFe](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Li]?(e?this.emit("error",e):this.emit(Li),this):(this[Li]=!0,this.buffer=new _p,this[rn]=0,typeof this.close=="function"&&!this[jw]&&this.close(),e?this.emit("error",e):this.emit(Li),this)}static isStream(e){return!!e&&(e instanceof B9||e instanceof d9||e instanceof JFe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var b9=E((llt,Q9)=>{var XFe=require("zlib").constants||{ZLIB_VERNUM:4736};Q9.exports=Object.freeze(Object.assign(Object.create(null),{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,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,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,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},XFe))});var fD=E(Un=>{"use strict";var sD=require("assert"),kA=require("buffer").Buffer,v9=require("zlib"),uc=Un.constants=b9(),ZFe=hg(),S9=kA.concat,gc=Symbol("_superWrite"),ed=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},$Fe=Symbol("opts"),td=Symbol("flushFlag"),x9=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),tr=Symbol("handle"),qw=Symbol("onError"),pg=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),clt=Symbol("_defaultFullFlush"),cD=class extends ZFe{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[pg]=!1,this[lD]=!1,this[$Fe]=e,this[td]=e.flush,this[x9]=e.finishFlush;try{this[tr]=new v9[r](e)}catch(i){throw new ed(i)}this[qw]=i=>{this[pg]||(this[pg]=!0,this.close(),this.emit("error",i))},this[tr].on("error",i=>this[qw](new ed(i))),this.once("end",()=>this.close)}close(){this[tr]&&(this[tr].close(),this[tr]=null,this.emit("close"))}reset(){if(!this[pg])return sD(this[tr],"zlib binding closed"),this[tr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(kA.alloc(0),{[td]:e})))}end(e,r,i){return e&&this.write(e,r),this.flush(this[x9]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,r,i){if(typeof r=="function"&&(i=r,r="utf8"),typeof e=="string"&&(e=kA.from(e,r)),this[pg])return;sD(this[tr],"zlib binding closed");let n=this[tr]._handle,s=n.close;n.close=()=>{};let o=this[tr].close;this[tr].close=()=>{},kA.concat=c=>c;let a;try{let c=typeof e[td]=="number"?e[td]:this[td];a=this[tr]._processChunk(e,c),kA.concat=S9}catch(c){kA.concat=S9,this[qw](new ed(c))}finally{this[tr]&&(this[tr]._handle=n,n.close=s,this[tr].close=o,this[tr].removeAllListeners("error"))}this[tr]&&this[tr].on("error",c=>this[qw](new ed(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[gc](kA.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[tr].params(e,r)}finally{this[tr].flush=i}this[tr]&&(this[aD]=e,this[AD]=r)}}}},k9=class extends PA{constructor(e){super(e,"Deflate")}},P9=class extends PA{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),D9=class extends PA{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[gc](e){return this[uD]?(this[uD]=!1,e[9]=255,super[gc](e)):super[gc](e)}},R9=class extends PA{constructor(e){super(e,"Gunzip")}},F9=class extends PA{constructor(e){super(e,"DeflateRaw")}},N9=class extends PA{constructor(e){super(e,"InflateRaw")}},L9=class extends PA{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,r){e=e||{},e.flush=e.flush||uc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||uc.BROTLI_OPERATION_FINISH,super(e,r),this[oD]=uc.BROTLI_OPERATION_FLUSH}},T9=class extends gD{constructor(e){super(e,"BrotliCompress")}},M9=class extends gD{constructor(e){super(e,"BrotliDecompress")}};Un.Deflate=k9;Un.Inflate=P9;Un.Gzip=D9;Un.Gunzip=R9;Un.DeflateRaw=F9;Un.InflateRaw=N9;Un.Unzip=L9;typeof v9.BrotliCompress=="function"?(Un.BrotliCompress=T9,Un.BrotliDecompress=M9):Un.BrotliCompress=Un.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var rd=E(Jw=>{"use strict";Jw.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"]]);Jw.code=new Map(Array.from(Jw.name).map(t=>[t[1],t[0]]))});var id=E((plt,O9)=>{"use strict";var flt=rd(),eNe=hg(),hD=Symbol("slurp");O9.exports=class extends eNe{constructor(e,r,i){super();switch(this.pause(),this.extended=r,this.globalExtended=i,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=this.mode&4095),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,r&&this[hD](r),i&&this[hD](i,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-r),this.blockRemain=Math.max(0,n-r),this.ignore?!0:i>=r?super.write(e):super.write(e.slice(0,i))}[hD](e,r){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(r&&i==="path")&&(this[i]=e[i])}}});var H9=E(pD=>{"use strict";var dlt=pD.encode=(t,e)=>{if(Number.isSafeInteger(t))t<0?rNe(t,e):tNe(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},tNe=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},rNe=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var i=e.length;i>1;i--){var n=t&255;t=Math.floor(t/256),r?e[i-1]=K9(n):n===0?e[i-1]=0:(r=!0,e[i-1]=U9(n))}},Clt=pD.parse=t=>{var e=t[t.length-1],r=t[0],i;if(r===128)i=nNe(t.slice(1,t.length));else if(r===255)i=iNe(t);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},iNe=t=>{for(var e=t.length,r=0,i=!1,n=e-1;n>-1;n--){var s=t[n],o;i?o=K9(s):s===0?o=s:(i=!0,o=U9(s)),o!==0&&(r-=o*Math.pow(256,e-n-1))}return r},nNe=t=>{for(var e=t.length,r=0,i=e-1;i>-1;i--){var n=t[i];n!==0&&(r+=n*Math.pow(256,e-i-1))}return r},K9=t=>(255^t)&255,U9=t=>(255^t)+1&255});var Cg=E((Elt,G9)=>{"use strict";var dD=rd(),dg=require("path").posix,j9=H9(),CD=Symbol("slurp"),Hn=Symbol("type"),Y9=class{constructor(e,r,i,n){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[Hn]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,i,n):e&&this.set(e)}decode(e,r,i,n){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=fc(e,r,100),this.mode=DA(e,r+100,8),this.uid=DA(e,r+108,8),this.gid=DA(e,r+116,8),this.size=DA(e,r+124,12),this.mtime=mD(e,r+136,12),this.cksum=DA(e,r+148,12),this[CD](i),this[CD](n,!0),this[Hn]=fc(e,r+156,1),this[Hn]===""&&(this[Hn]="0"),this[Hn]==="0"&&this.path.substr(-1)==="/"&&(this[Hn]="5"),this[Hn]==="5"&&(this.size=0),this.linkpath=fc(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=fc(e,r+265,32),this.gname=fc(e,r+297,32),this.devmaj=DA(e,r+329,8),this.devmin=DA(e,r+337,8),e[r+475]!==0){let o=fc(e,r+345,155);this.path=o+"/"+this.path}else{let o=fc(e,r+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,r+476,12),this.ctime=mD(e,r+488,12)}let s=8*32;for(let o=r;o=r+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=sNe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=hc(e,r,100,s)||this.needPax,this.needPax=RA(e,r+100,8,this.mode)||this.needPax,this.needPax=RA(e,r+108,8,this.uid)||this.needPax,this.needPax=RA(e,r+116,8,this.gid)||this.needPax,this.needPax=RA(e,r+124,12,this.size)||this.needPax,this.needPax=ED(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Hn].charCodeAt(0),this.needPax=hc(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=hc(e,r+265,32,this.uname)||this.needPax,this.needPax=hc(e,r+297,32,this.gname)||this.needPax,this.needPax=RA(e,r+329,8,this.devmaj)||this.needPax,this.needPax=RA(e,r+337,8,this.devmin)||this.needPax,this.needPax=hc(e,r+345,i,o)||this.needPax,e[r+475]!==0?this.needPax=hc(e,r+345,155,o)||this.needPax:(this.needPax=hc(e,r+345,130,o)||this.needPax,this.needPax=ED(e,r+476,12,this.atime)||this.needPax,this.needPax=ED(e,r+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=r;l{let r=100,i=t,n="",s,o=dg.parse(t).root||".";if(Buffer.byteLength(i)r&&Buffer.byteLength(n)<=e?s=[i.substr(0,r-1),n,!0]:(i=dg.join(dg.basename(n),i),n=dg.dirname(n));while(n!==o&&!s);s||(s=[t.substr(0,r-1),"",!0])}return s},fc=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),mD=(t,e,r)=>oNe(DA(t,e,r)),oNe=t=>t===null?null:new Date(t*1e3),DA=(t,e,r)=>t[e]&128?j9.parse(t.slice(e,e+r)):aNe(t,e,r),ANe=t=>isNaN(t)?null:t,aNe=(t,e,r)=>ANe(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),lNe={12:8589934591,8:2097151},RA=(t,e,r,i)=>i===null?!1:i>lNe[r]||i<0?(j9.encode(i,t.slice(e,e+r)),!0):(cNe(t,e,r,i),!1),cNe=(t,e,r,i)=>t.write(uNe(i,r),e,r,"ascii"),uNe=(t,e)=>gNe(Math.floor(t).toString(8),e),gNe=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",ED=(t,e,r,i)=>i===null?!1:RA(t,e,r,i.getTime()/1e3),fNe=new Array(156).join("\0"),hc=(t,e,r,i)=>i===null?!1:(t.write(i+fNe,e,r,"utf8"),i.length!==Buffer.byteLength(i)||i.length>r);G9.exports=Y9});var zw=E((Ilt,q9)=>{"use strict";var hNe=Cg(),pNe=require("path"),Ww=class{constructor(e,r){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=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),i=512*Math.ceil(1+r/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new hNe({path:("PaxHeader/"+pNe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,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(n),n.write(e,512,r,"utf8");for(let s=r+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};Ww.parse=(t,e,r)=>new Ww(dNe(CNe(t),e),r);var dNe=(t,e)=>e?Object.keys(t).reduce((r,i)=>(r[i]=t[i],r),e):t,CNe=t=>t.replace(/\n$/,"").split(` -`).reduce(mNe,Object.create(null)),mNe=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return t;let s=i.join("=");return t[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,t};q9.exports=Ww});var Vw=E((ylt,J9)=>{"use strict";J9.exports=t=>class extends t{warn(e,r,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=r instanceof Error&&r.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(r instanceof Error&&(i=Object.assign(r,i),r=r.message),this.emit("warn",i.tarCode,r,i)):r instanceof Error?this.emit("error",Object.assign(r,i)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),i))}}});var yD=E((wlt,W9)=>{"use strict";var _w=["|","<",">","?",":"],ID=_w.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),ENe=new Map(_w.map((t,e)=>[t,ID[e]])),INe=new Map(ID.map((t,e)=>[t,_w[e]]));W9.exports={encode:t=>_w.reduce((e,r)=>e.split(r).join(ENe.get(r)),t),decode:t=>ID.reduce((e,r)=>e.split(r).join(INe.get(r)),t)}});var V9=E((Blt,z9)=>{"use strict";z9.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&~18),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var xD=E((xlt,_9)=>{"use strict";var X9=hg(),Z9=zw(),$9=Cg(),Qlt=id(),bo=require("fs"),mg=require("path"),blt=rd(),yNe=16*1024*1024,eV=Symbol("process"),tV=Symbol("file"),rV=Symbol("directory"),wD=Symbol("symlink"),iV=Symbol("hardlink"),nd=Symbol("header"),Xw=Symbol("read"),BD=Symbol("lstat"),Zw=Symbol("onlstat"),QD=Symbol("onread"),bD=Symbol("onreadlink"),vD=Symbol("openfile"),SD=Symbol("onopenfile"),pc=Symbol("close"),$w=Symbol("mode"),nV=Vw(),wNe=yD(),sV=V9(),eB=nV(class extends X9{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||yNe,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=r.cwd||process.cwd(),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(!this.preservePaths&&mg.win32.isAbsolute(e)){let n=mg.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=wNe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=r.absolute||mg.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[Zw](this.statCache.get(this.absolute)):this[BD]()}[BD](){bo.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[Zw](r)})}[Zw](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=BNe(e),this.emit("stat",e),this[eV]()}[eV](){switch(this.type){case"File":return this[tV]();case"Directory":return this[rV]();case"SymbolicLink":return this[wD]();default:return this.end()}}[$w](e){return sV(e,this.type==="Directory",this.portable)}[nd](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new $9({path:this.path,linkpath:this.linkpath,mode:this[$w](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 Z9({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)}[rV](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[nd](),this.end()}[wD](){bo.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[bD](r)})}[bD](e){this.linkpath=e.replace(/\\/g,"/"),this[nd](),this.end()}[iV](e){this.type="Link",this.linkpath=mg.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[nd](),this.end()}[tV](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[iV](r)}this.linkCache.set(e,this.absolute)}if(this[nd](),this.stat.size===0)return this.end();this[vD]()}[vD](){bo.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[SD](r)})}[SD](e){let r=512*Math.ceil(this.stat.size/512),i=Math.min(r,this.maxReadSize),n=Buffer.allocUnsafe(i);this[Xw](e,n,0,n.length,0,this.stat.size,r)}[Xw](e,r,i,n,s,o,a){bo.read(e,r,i,n,s,(l,c)=>{if(l)return this[pc](e,()=>this.emit("error",l));this[QD](e,r,i,n,s,o,a,c)})}[pc](e,r){bo.close(e,r)}[QD](e,r,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(r=Buffer.allocUnsafe(n),i=0),n=r.length-i,this[Xw](e,r,i,n,s,o,a)}}),oV=class extends eB{constructor(e,r){super(e,r)}[BD](){this[Zw](bo.lstatSync(this.absolute))}[wD](){this[bD](bo.readlinkSync(this.absolute))}[vD](){this[SD](bo.openSync(this.absolute,"r"))}[Xw](e,r,i,n,s,o,a){let l=!0;try{let c=bo.readSync(e,r,i,n,s);this[QD](e,r,i,n,s,o,a,c),l=!1}finally{if(l)try{this[pc](e,()=>{})}catch(c){}}}[pc](e,r){bo.closeSync(e),r()}},QNe=nV(class extends X9{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[$w](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:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(mg.isAbsolute(this.path)&&!this.preservePaths){let n=mg.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new $9({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}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new Z9({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)}[$w](e){return sV(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});eB.Sync=oV;eB.Tar=QNe;var BNe=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";_9.exports=eB});var AB=E((Plt,aV)=>{"use strict";var kD=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},bNe=hg(),vNe=fD(),SNe=id(),PD=xD(),xNe=PD.Sync,kNe=PD.Tar,PNe=Rh(),AV=Buffer.alloc(1024),tB=Symbol("onStat"),rB=Symbol("ended"),vo=Symbol("queue"),Eg=Symbol("current"),dc=Symbol("process"),iB=Symbol("processing"),lV=Symbol("processJob"),So=Symbol("jobs"),DD=Symbol("jobDone"),nB=Symbol("addFSEntry"),cV=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),sB=Symbol("onreaddir"),oB=Symbol("pipe"),uV=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),gV=Symbol("write"),TD=Symbol("ondrain"),aB=require("fs"),fV=require("path"),DNe=Vw(),MD=DNe(class extends bNe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",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[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new vNe.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[TD]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[vo]=new PNe,this[So]=0,this.jobs=+e.jobs||4,this[iB]=!1,this[rB]=!1}[gV](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[rB]=!0,this[dc](),this}write(e){if(this[rB])throw new Error("write after end");return e instanceof SNe?this[cV](e):this[nB](e),this.flowing}[cV](e){let r=fV.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,r,!1);i.entry=new kNe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[So]+=1,this[vo].push(i)}this[dc]()}[nB](e){let r=fV.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[vo].push(new kD(e,r)),this[dc]()}[RD](e){e.pending=!0,this[So]+=1;let r=this.follow?"stat":"lstat";aB[r](e.absolute,(i,n)=>{e.pending=!1,this[So]-=1,i?this.emit("error",i):this[tB](e,n)})}[tB](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[dc]()}[FD](e){e.pending=!0,this[So]+=1,aB.readdir(e.absolute,(r,i)=>{if(e.pending=!1,this[So]-=1,r)return this.emit("error",r);this[sB](e,i)})}[sB](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[dc]()}[dc](){if(!this[iB]){this[iB]=!0;for(let e=this[vo].head;e!==null&&this[So]this.warn(r,i,n),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}}[uV](e){this[So]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[TD](){this[Eg]&&this[Eg].entry&&this[Eg].entry.resume()}[oB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)});let r=e.entry,i=this.zip;i?r.on("data",n=>{i.write(n)||r.pause()}):r.on("data",n=>{super.write(n)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),hV=class extends MD{constructor(e){super(e);this[LD]=xNe}pause(){}resume(){}[RD](e){let r=this.follow?"statSync":"lstatSync";this[tB](e,aB[r](e.absolute))}[FD](e,r){this[sB](e,aB.readdirSync(e.absolute))}[oB](e){let r=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)}),i?r.on("data",n=>{i.write(n)}):r.on("data",n=>{super[gV](n)})}};MD.Sync=hV;aV.exports=MD});var bg=E(sd=>{"use strict";var RNe=hg(),FNe=require("events").EventEmitter,ls=require("fs"),lB=process.binding("fs"),Dlt=lB.writeBuffers,NNe=lB.FSReqWrap||lB.FSReqCallback,Ig=Symbol("_autoClose"),xo=Symbol("_close"),od=Symbol("_ended"),Jt=Symbol("_fd"),pV=Symbol("_finished"),Cc=Symbol("_flags"),OD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),cB=Symbol("_needDrain"),yg=Symbol("_onerror"),wg=Symbol("_onopen"),GD=Symbol("_onread"),mc=Symbol("_onwrite"),FA=Symbol("_open"),NA=Symbol("_path"),Ec=Symbol("_pos"),ko=Symbol("_queue"),Bg=Symbol("_read"),dV=Symbol("_readSize"),LA=Symbol("_reading"),uB=Symbol("_remain"),CV=Symbol("_size"),gB=Symbol("_write"),Qg=Symbol("_writing"),fB=Symbol("_defaultFlag"),jD=class extends RNe{constructor(e,r){if(r=r||{},super(r),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Jt]=typeof r.fd=="number"?r.fd:null,this[NA]=e,this[dV]=r.readSize||16*1024*1024,this[LA]=!1,this[CV]=typeof r.size=="number"?r.size:Infinity,this[uB]=this[CV],this[Ig]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Jt]=="number"?this[Bg]():this[FA]()}get fd(){return this[Jt]}get path(){return this[NA]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[FA](){ls.open(this[NA],"r",(e,r)=>this[wg](e,r))}[wg](e,r){e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[Bg]())}[UD](){return Buffer.allocUnsafe(Math.min(this[dV],this[uB]))}[Bg](){if(!this[LA]){this[LA]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[GD](null,0,e));ls.read(this[Jt],e,0,e.length,null,(r,i,n)=>this[GD](r,i,n))}}[GD](e,r,i){this[LA]=!1,e?this[yg](e):this[KD](r,i)&&this[Bg]()}[xo](){this[Ig]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}[yg](e){this[LA]=!0,this[xo](),this.emit("error",e)}[KD](e,r){let i=!1;return this[uB]-=e,e>0&&(i=super.write(ethis[wg](e,r))}[wg](e,r){this[fB]&&this[Cc]==="r+"&&e&&e.code==="ENOENT"?(this[Cc]="w",this[FA]()):e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[OD]())}end(e,r){e&&this.write(e,r),this[od]=!0,!this[Qg]&&!this[ko].length&&typeof this[Jt]=="number"&&this[mc](null,0)}write(e,r){return typeof e=="string"&&(e=new Buffer(e,r)),this[od]?(this.emit("error",new Error("write() after end()")),!1):this[Jt]===null||this[Qg]||this[ko].length?(this[ko].push(e),this[cB]=!0,!1):(this[Qg]=!0,this[gB](e),!0)}[gB](e){ls.write(this[Jt],e,0,e.length,this[Ec],(r,i)=>this[mc](r,i))}[mc](e,r){e?this[yg](e):(this[Ec]!==null&&(this[Ec]+=r),this[ko].length?this[OD]():(this[Qg]=!1,this[od]&&!this[pV]?(this[pV]=!0,this[xo](),this.emit("finish")):this[cB]&&(this[cB]=!1,this.emit("drain"))))}[OD](){if(this[ko].length===0)this[od]&&this[mc](null,0);else if(this[ko].length===1)this[gB](this[ko].pop());else{let e=this[ko];this[ko]=[],LNe(this[Jt],e,this[Ec],(r,i)=>this[mc](r,i))}}[xo](){this[Ig]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}},EV=class extends YD{[FA](){let e;try{e=ls.openSync(this[NA],this[Cc],this[HD])}catch(r){if(this[fB]&&this[Cc]==="r+"&&r&&r.code==="ENOENT")return this[Cc]="w",this[FA]();throw r}this[wg](null,e)}[xo](){if(this[Ig]&&typeof this[Jt]=="number"){try{ls.closeSync(this[Jt])}catch(e){}this[Jt]=null,this.emit("close")}}[gB](e){try{this[mc](null,ls.writeSync(this[Jt],e,0,e.length,this[Ec]))}catch(r){this[mc](r,0)}}},LNe=(t,e,r,i)=>{let n=(o,a)=>i(o,a,e),s=new NNe;s.oncomplete=n,lB.writeBuffers(t,e,r,s)};sd.ReadStream=jD;sd.ReadStreamSync=mV;sd.WriteStream=YD;sd.WriteStreamSync=EV});var ld=E((Llt,IV)=>{"use strict";var TNe=Vw(),Flt=require("path"),MNe=Cg(),ONe=require("events"),KNe=Rh(),UNe=1024*1024,HNe=id(),yV=zw(),GNe=fD(),qD=Buffer.from([31,139]),cs=Symbol("state"),Ic=Symbol("writeEntry"),xa=Symbol("readEntry"),JD=Symbol("nextEntry"),wV=Symbol("processEntry"),us=Symbol("extendedHeader"),ad=Symbol("globalExtendedHeader"),TA=Symbol("meta"),BV=Symbol("emitMeta"),Ar=Symbol("buffer"),ka=Symbol("queue"),yc=Symbol("ended"),QV=Symbol("emittedEnd"),wc=Symbol("emit"),Qn=Symbol("unzip"),hB=Symbol("consumeChunk"),pB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),bV=Symbol("consumeMeta"),vV=Symbol("consumeHeader"),dB=Symbol("consuming"),zD=Symbol("bufferConcat"),VD=Symbol("maybeEnd"),Ad=Symbol("writing"),MA=Symbol("aborted"),CB=Symbol("onDone"),Bc=Symbol("sawValidEntry"),mB=Symbol("sawNullBlock"),EB=Symbol("sawEOF"),jNe=t=>!0;IV.exports=TNe(class extends ONe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[Bc]=null,this.on(CB,r=>{(this[cs]==="begin"||this[Bc]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(CB,e.ondone):this.on(CB,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||UNe,this.filter=typeof e.filter=="function"?e.filter:jNe,this.writable=!0,this.readable=!1,this[ka]=new KNe,this[Ar]=null,this[xa]=null,this[Ic]=null,this[cs]="begin",this[TA]="",this[us]=null,this[ad]=null,this[yc]=!1,this[Qn]=null,this[MA]=!1,this[mB]=!1,this[EB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[vV](e,r){this[Bc]===null&&(this[Bc]=!1);let i;try{i=new MNe(e,r,this[us],this[ad])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[mB]?(this[EB]=!0,this[cs]==="begin"&&(this[cs]="header"),this[wc]("eof")):(this[mB]=!0,this[wc]("nullBlock"));else if(this[mB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[Ic]=new HNe(i,this[us],this[ad]);if(!this[Bc])if(s.remain){let o=()=>{s.invalid||(this[Bc]=!0)};s.on("end",o)}else this[Bc]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[wc]("ignoredEntry",s),this[cs]="ignore",s.resume()):s.size>0&&(this[TA]="",s.on("data",o=>this[TA]+=o),this[cs]="meta"):(this[us]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[wc]("ignoredEntry",s),this[cs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[cs]="body":(this[cs]="header",s.end()),this[xa]?this[ka].push(s):(this[ka].push(s),this[JD]())))}}}[wV](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[xa]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),r=!1)):(this[xa]=null,r=!1),r}[JD](){do;while(this[wV](this[ka].shift()));if(!this[ka].length){let e=this[xa];!e||e.flowing||e.size===e.remain?this[Ad]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,r){let i=this[Ic],n=i.blockRemain,s=n>=e.length&&r===0?e:e.slice(r,r+n);return i.write(s),i.blockRemain||(this[cs]="header",this[Ic]=null,i.end()),s.length}[bV](e,r){let i=this[Ic],n=this[WD](e,r);return this[Ic]||this[BV](i),n}[wc](e,r,i){!this[ka].length&&!this[xa]?this.emit(e,r,i):this[ka].push([e,r,i])}[BV](e){switch(this[wc]("meta",this[TA]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[us]=yV.parse(this[TA],this[us],!1);break;case"GlobalExtendedHeader":this[ad]=yV.parse(this[TA],this[ad],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[us]=this[us]||Object.create(null),this[us].path=this[TA].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[us]=this[us]||Object.create(null),this[us].linkpath=this[TA].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[MA]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[MA])return;if(this[Qn]===null&&e){if(this[Ar]&&(e=Buffer.concat([this[Ar],e]),this[Ar]=null),e.lengththis[hB](s)),this[Qn].on("error",s=>this.abort(s)),this[Qn].on("end",s=>{this[yc]=!0,this[hB]()}),this[Ad]=!0;let n=this[Qn][i?"end":"write"](e);return this[Ad]=!1,n}}this[Ad]=!0,this[Qn]?this[Qn].write(e):this[hB](e),this[Ad]=!1;let r=this[ka].length?!1:this[xa]?this[xa].flowing:!0;return!r&&!this[ka].length&&this[xa].once("drain",i=>this.emit("drain")),r}[zD](e){e&&!this[MA]&&(this[Ar]=this[Ar]?Buffer.concat([this[Ar],e]):e)}[VD](){if(this[yc]&&!this[QV]&&!this[MA]&&!this[dB]){this[QV]=!0;let e=this[Ic];if(e&&e.blockRemain){let r=this[Ar]?this[Ar].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Ar]&&e.write(this[Ar]),e.end()}this[wc](CB)}}[hB](e){if(this[dB])this[zD](e);else if(!e&&!this[Ar])this[VD]();else{if(this[dB]=!0,this[Ar]){this[zD](e);let r=this[Ar];this[Ar]=null,this[pB](r)}else this[pB](e);for(;this[Ar]&&this[Ar].length>=512&&!this[MA]&&!this[EB];){let r=this[Ar];this[Ar]=null,this[pB](r)}this[dB]=!1}(!this[Ar]||this[yc])&&this[VD]()}[pB](e){let r=0,i=e.length;for(;r+512<=i&&!this[MA]&&!this[EB];)switch(this[cs]){case"begin":case"header":this[vV](e,r),r+=512;break;case"ignore":case"body":r+=this[WD](e,r);break;case"meta":r+=this[bV](e,r);break;default:throw new Error("invalid state: "+this[cs])}r{"use strict";var YNe=fg(),xV=ld(),vg=require("fs"),qNe=bg(),kV=require("path"),Tlt=SV.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=YNe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&WNe(i,e),i.noResume||JNe(i),i.file&&i.sync?zNe(i):i.file?VNe(i,r):PV(i)},JNe=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},WNe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||kV.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(kV.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},zNe=t=>{let e=PV(t),r=t.file,i=!0,n;try{let s=vg.statSync(r),o=t.maxReadSize||16*1024*1024;if(s.size{let r=new xV(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("end",o),vg.stat(n,(l,c)=>{if(l)a(l);else{let u=new qNe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},PV=t=>new xV(t)});var TV=E((Ult,DV)=>{"use strict";var _Ne=fg(),yB=AB(),Olt=require("fs"),RV=bg(),FV=IB(),NV=require("path"),Klt=DV.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=_Ne(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?XNe(i,e):i.file?ZNe(i,e,r):i.sync?$Ne(i,e):eLe(i,e)},XNe=(t,e)=>{let r=new yB.Sync(t),i=new RV.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(i),LV(r,e)},ZNe=(t,e,r)=>{let i=new yB(t),n=new RV.WriteStream(t.file,{mode:t.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return _D(i,e),r?s.then(r,r):s},LV=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?FV({file:NV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},_D=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return FV({file:NV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>_D(t,e));t.add(r)}t.end()},$Ne=(t,e)=>{let r=new yB.Sync(t);return LV(r,e),r},eLe=(t,e)=>{let r=new yB(t);return _D(r,e),r}});var XD=E((jlt,MV)=>{"use strict";var tLe=fg(),OV=AB(),Hlt=ld(),gs=require("fs"),KV=bg(),UV=IB(),HV=require("path"),GV=Cg(),Glt=MV.exports=(t,e,r)=>{let i=tLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?rLe(i,e):iLe(i,e,r)},rLe=(t,e)=>{let r=new OV.Sync(t),i=!0,n,s;try{try{n=gs.openSync(t.file,"r+")}catch(l){if(l.code==="ENOENT")n=gs.openSync(t.file,"w+");else throw l}let o=gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,t.mtimeCache&&t.mtimeCache.set(l.path,l.mtime)}i=!1,nLe(t,r,s,n,e)}finally{if(i)try{gs.closeSync(n)}catch(o){}}},nLe=(t,e,r,i,n)=>{let s=new KV.WriteStreamSync(t.file,{fd:i,start:r});e.pipe(s),sLe(e,n)},iLe=(t,e,r)=>{e=Array.from(e);let i=new OV(t),n=(o,a,l)=>{let c=(p,d)=>{p?gs.close(o,m=>l(p)):l(null,d)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,d)=>{if(p)return c(p);if(g+=d,g<512&&d)return gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let m=new GV(f);if(!m.cksumValid)return c(null,u);let I=512*Math.ceil(m.size/512);if(u+I+512>a||(u+=I+512,u>=a))return c(null,u);t.mtimeCache&&t.mtimeCache.set(m.path,m.mtime),g=0,gs.read(o,f,0,512,u,h)};gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",gs.open(t.file,l,c);if(u)return a(u);gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,d)=>{if(p)return a(p);let m=new KV.WriteStream(t.file,{fd:g,start:d});i.pipe(m),m.on("error",a),m.on("close",o),jV(i,e)})})};gs.open(t.file,l,c)});return r?s.then(r,r):s},sLe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?UV({file:HV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},jV=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return UV({file:HV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>jV(t,e));t.add(r)}t.end()}});var qV=E((qlt,YV)=>{"use strict";var oLe=fg(),aLe=XD(),Ylt=YV.exports=(t,e,r)=>{let i=oLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),ALe(i),aLe(i,e,r)},ALe=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,i)=>e(r,i)&&!(t.mtimeCache.get(r)>i.mtime):(r,i)=>!(t.mtimeCache.get(r)>i.mtime)}});var zV=E((Jlt,JV)=>{var{promisify:WV}=require("util"),OA=require("fs"),lLe=t=>{if(!t)t={mode:511,fs:OA};else if(typeof t=="object")t=P({mode:511,fs:OA},t);else if(typeof t=="number")t={mode:t,fs:OA};else if(typeof t=="string")t={mode:parseInt(t,8),fs:OA};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||OA.mkdir,t.mkdirAsync=WV(t.mkdir),t.stat=t.stat||t.fs.stat||OA.stat,t.statAsync=WV(t.stat),t.statSync=t.statSync||t.fs.statSync||OA.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||OA.mkdirSync,t};JV.exports=lLe});var _V=E((Wlt,VV)=>{var cLe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:uLe,parse:gLe}=require("path"),fLe=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=uLe(t),cLe==="win32"){let e=/[*|"<>?:]/,{root:r}=gLe(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};VV.exports=fLe});var t7=E((zlt,XV)=>{var{dirname:ZV}=require("path"),$V=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(i=>i.isDirectory()?r:void 0,i=>i.code==="ENOENT"?$V(t,ZV(e),e):void 0),e7=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(i){return i.code==="ENOENT"?e7(t,ZV(e),e):void 0}};XV.exports={findMade:$V,findMadeSync:e7}});var eR=E((Vlt,r7)=>{var{dirname:i7}=require("path"),ZD=(t,e,r)=>{e.recursive=!1;let i=i7(t);return i===t?e.mkdirAsync(t,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(t,e).then(()=>r||t,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(t,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(t).then(s=>{if(s.isDirectory())return r;throw n},()=>{throw n})})},$D=(t,e,r)=>{let i=i7(t);if(e.recursive=!1,i===t)try{return e.mkdirSync(t,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(t,e),r||t}catch(n){if(n.code==="ENOENT")return $D(t,e,$D(i,e,r));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(t).isDirectory())throw n}catch(s){throw n}}};r7.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var o7=E((_lt,n7)=>{var{dirname:s7}=require("path"),{findMade:hLe,findMadeSync:pLe}=t7(),{mkdirpManual:dLe,mkdirpManualSync:CLe}=eR(),mLe=(t,e)=>(e.recursive=!0,s7(t)===t?e.mkdirAsync(t,e):hLe(e,t).then(i=>e.mkdirAsync(t,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return dLe(t,e);throw n}))),ELe=(t,e)=>{if(e.recursive=!0,s7(t)===t)return e.mkdirSync(t,e);let i=pLe(e,t);try{return e.mkdirSync(t,e),i}catch(n){if(n.code==="ENOENT")return CLe(t,e);throw n}};n7.exports={mkdirpNative:mLe,mkdirpNativeSync:ELe}});var c7=E((Xlt,a7)=>{var A7=require("fs"),ILe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=ILe.replace(/^v/,"").split("."),l7=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,yLe=l7?t=>t.mkdir===A7.mkdir:()=>!1,wLe=l7?t=>t.mkdirSync===A7.mkdirSync:()=>!1;a7.exports={useNative:yLe,useNativeSync:wLe}});var d7=E((Zlt,u7)=>{var Sg=zV(),xg=_V(),{mkdirpNative:g7,mkdirpNativeSync:f7}=o7(),{mkdirpManual:h7,mkdirpManualSync:p7}=eR(),{useNative:BLe,useNativeSync:QLe}=c7(),kg=(t,e)=>(t=xg(t),e=Sg(e),BLe(e)?g7(t,e):h7(t,e)),bLe=(t,e)=>(t=xg(t),e=Sg(e),QLe(e)?f7(t,e):p7(t,e));kg.sync=bLe;kg.native=(t,e)=>g7(xg(t),Sg(e));kg.manual=(t,e)=>h7(xg(t),Sg(e));kg.nativeSync=(t,e)=>f7(xg(t),Sg(e));kg.manualSync=(t,e)=>p7(xg(t),Sg(e));u7.exports=kg});var B7=E(($lt,C7)=>{"use strict";var fs=require("fs"),Qc=require("path"),vLe=fs.lchown?"lchown":"chown",SLe=fs.lchownSync?"lchownSync":"chownSync",m7=fs.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),E7=(t,e,r)=>{try{return fs[SLe](t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},xLe=(t,e,r)=>{try{return fs.chownSync(t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},kLe=m7?(t,e,r,i)=>n=>{!n||n.code!=="EISDIR"?i(n):fs.chown(t,e,r,i)}:(t,e,r,i)=>i,rR=m7?(t,e,r)=>{try{return E7(t,e,r)}catch(i){if(i.code!=="EISDIR")throw i;xLe(t,e,r)}}:(t,e,r)=>E7(t,e,r),PLe=process.version,I7=(t,e,r)=>fs.readdir(t,e,r),DLe=(t,e)=>fs.readdirSync(t,e);/^v4\./.test(PLe)&&(I7=(t,e,r)=>fs.readdir(t,r));var wB=(t,e,r,i)=>{fs[vLe](t,e,r,kLe(t,e,r,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},y7=(t,e,r,i,n)=>{if(typeof e=="string")return fs.lstat(Qc.resolve(t,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,y7(t,o,r,i,n)});if(e.isDirectory())iR(Qc.resolve(t,e.name),r,i,s=>{if(s)return n(s);let o=Qc.resolve(t,e.name);wB(o,r,i,n)});else{let s=Qc.resolve(t,e.name);wB(s,r,i,n)}},iR=(t,e,r,i)=>{I7(t,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return wB(t,e,r,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return wB(t,e,r,i)}};s.forEach(c=>y7(t,c,e,r,l))})},RLe=(t,e,r,i)=>{if(typeof e=="string")try{let n=fs.lstatSync(Qc.resolve(t,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&w7(Qc.resolve(t,e.name),r,i),rR(Qc.resolve(t,e.name),r,i)},w7=(t,e,r)=>{let i;try{i=DLe(t,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(t,e,r);throw n}return i&&i.length&&i.forEach(n=>RLe(t,n,e,r)),rR(t,e,r)};C7.exports=iR;iR.sync=w7});var S7=E((rct,nR)=>{"use strict";var Q7=d7(),hs=require("fs"),BB=require("path"),b7=B7(),sR=class extends Error{constructor(e,r){super("Cannot extract through symbolic link");this.path=r,this.symlink=e}get name(){return"SylinkError"}},cd=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'");this.path=e,this.code=r}get name(){return"CwdError"}},ect=nR.exports=(t,e,r)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(m,I)=>{m?r(m):(g.set(t,!0),I&&l?b7(I,o,a,B=>h(B)):s?hs.chmod(t,n,r):r())};if(g&&g.get(t)===!0)return h();if(t===f)return hs.stat(t,(m,I)=>{(m||!I.isDirectory())&&(m=new cd(t,m&&m.code||"ENOTDIR")),h(m)});if(c)return Q7(t,{mode:n}).then(m=>h(null,m),h);let d=BB.relative(f,t).split(/\/|\\/);QB(f,d,n,g,u,f,null,h)},QB=(t,e,r,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=t+"/"+l;if(i.get(c))return QB(c,e,r,i,n,s,o,a);hs.mkdir(c,r,v7(c,e,r,i,n,s,o,a))},v7=(t,e,r,i,n,s,o,a)=>l=>{if(l){if(l.path&&BB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new cd(s,l.code));hs.lstat(t,(c,u)=>{if(c)a(c);else if(u.isDirectory())QB(t,e,r,i,n,s,o,a);else if(n)hs.unlink(t,g=>{if(g)return a(g);hs.mkdir(t,r,v7(t,e,r,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(t,t+"/"+e.join("/")));a(l)}})}else o=o||t,QB(t,e,r,i,n,s,o,a)},tct=nR.exports.sync=(t,e)=>{let r=e.umask,i=e.mode|448,n=(i&r)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=m=>{u.set(t,!0),m&&a&&b7.sync(m,s,o),n&&hs.chmodSync(t,i)};if(u&&u.get(t)===!0)return f();if(t===g){let m=!1,I="ENOTDIR";try{m=hs.statSync(t).isDirectory()}catch(B){I=B.code}finally{if(!m)throw new cd(t,I)}f();return}if(l)return f(Q7.sync(t,i));let p=BB.relative(g,t).split(/\/|\\/),d=null;for(let m=p.shift(),I=g;m&&(I+="/"+m);m=p.shift())if(!u.get(I))try{hs.mkdirSync(I,i),d=d||I,u.set(I,!0)}catch(B){if(B.path&&BB.dirname(B.path)===g&&(B.code==="ENOTDIR"||B.code==="ENOENT"))return new cd(g,B.code);let b=hs.lstatSync(I);if(b.isDirectory()){u.set(I,!0);continue}else if(c){hs.unlinkSync(I),hs.mkdirSync(I,i),d=d||I,u.set(I,!0);continue}else if(b.isSymbolicLink())return new sR(I,I+"/"+p.join("/"))}return f(d)}});var P7=E((ict,x7)=>{var k7=require("assert");x7.exports=()=>{let t=new Map,e=new Map,{join:r}=require("path"),i=u=>r(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(r(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>t.get(f)),dirs:[...g.dirs].map(f=>t.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let d=t.get(p);k7.equal(d[0],u),d.length===1?t.delete(p):(d.shift(),typeof d[0]=="function"?h.add(d[0]):d[0].forEach(m=>h.add(m)))}),f.forEach(p=>{let d=t.get(p);k7(d[0]instanceof Set),d[0].size===1&&d.length===1?t.delete(p):d[0].size===1?(d.shift(),h.add(d[0])):d[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=t.get(h);p?p.push(g):t.set(h,[g])}),f.forEach(h=>{let p=t.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):t.set(h,[new Set([g])])}),a(g)}}}});var F7=E((nct,D7)=>{var FLe=process.env.__FAKE_PLATFORM__||process.platform,NLe=FLe==="win32",LLe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:TLe,O_TRUNC:MLe,O_WRONLY:OLe,UV_FS_O_FILEMAP:R7=0}=LLe.constants,KLe=NLe&&!!R7,ULe=512*1024,HLe=R7|MLe|TLe|OLe;D7.exports=KLe?t=>t"w"});var hR=E((Act,N7)=>{"use strict";var GLe=require("assert"),sct=require("events").EventEmitter,jLe=ld(),Ut=require("fs"),YLe=bg(),Pa=require("path"),oR=S7(),oct=oR.sync,L7=yD(),qLe=P7(),T7=Symbol("onEntry"),aR=Symbol("checkFs"),M7=Symbol("checkFs2"),AR=Symbol("isReusable"),Da=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),bB=Symbol("link"),O7=Symbol("symlink"),K7=Symbol("hardlink"),U7=Symbol("unsupported"),act=Symbol("unknown"),H7=Symbol("checkPath"),Pg=Symbol("mkdir"),nn=Symbol("onError"),vB=Symbol("pending"),G7=Symbol("pend"),Dg=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),ud=Symbol("doChown"),gd=Symbol("uid"),fd=Symbol("gid"),j7=require("crypto"),Y7=F7(),SB=()=>{throw new Error("sync function called cb somehow?!?")},JLe=(t,e)=>{if(process.platform!=="win32")return Ut.unlink(t,e);let r=t+".DELETE."+j7.randomBytes(16).toString("hex");Ut.rename(t,r,i=>{if(i)return e(i);Ut.unlink(r,e)})},WLe=t=>{if(process.platform!=="win32")return Ut.unlinkSync(t);let e=t+".DELETE."+j7.randomBytes(16).toString("hex");Ut.renameSync(t,e),Ut.unlinkSync(e)},q7=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,xB=class extends jLe{constructor(e){if(e||(e={}),e.ondone=r=>{this[uR]=!0,this[gR]()},super(e),this.reservations=qLe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[vB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")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;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0: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=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Pa.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[T7](r))}warn(e,r,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,r,i)}[gR](){this[uR]&&this[vB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[H7](e){if(this.strip){let r=e.path.split(/\/|\\/);if(r.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let r=e.path;if(r.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;if(Pa.win32.isAbsolute(r)){let i=Pa.win32.parse(r);e.path=r.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:r})}}if(this.win32){let r=Pa.win32.parse(e.path);e.path=r.root===""?L7.encode(e.path):r.root+L7.encode(e.path.substr(r.root.length))}return Pa.isAbsolute(e.path)?e.absolute=e.path:e.absolute=Pa.resolve(this.cwd,e.path),!0}[T7](e){if(!this[H7](e))return e.resume();switch(GLe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[U7](e)}}[nn](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[Dg](),r.resume())}[Pg](e,r,i){oR(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:r},i)}[ud](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[gd](e){return q7(this.uid,e.uid,this.processUid)}[fd](e){return q7(this.gid,e.gid,this.processGid)}[lR](e,r){let i=e.mode&4095||this.fmode,n=new YLe.WriteStream(e.absolute,{flags:Y7(e.size),mode:i,autoClose:!1});n.on("error",l=>this[nn](l,e));let s=1,o=l=>{if(l)return this[nn](l,e);--s==0&&Ut.close(n.fd,c=>{r(),c?this[nn](c,e):this[Dg]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;Ut.futimes(u,g,f,h=>h?Ut.utimes(c,g,f,p=>o(p&&h)):o())}if(this[ud](e)){s++;let g=this[gd](e),f=this[fd](e);Ut.fchown(u,g,f,h=>h?Ut.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,r){let i=e.mode&4095||this.dmode;this[Pg](e.absolute,i,n=>{if(n)return r(),this[nn](n,e);let s=1,o=a=>{--s==0&&(r(),this[Dg](),e.resume())};e.mtime&&!this.noMtime&&(s++,Ut.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[ud](e)&&(s++,Ut.chown(e.absolute,this[gd](e),this[fd](e),o)),o()})}[U7](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[O7](e,r){this[bB](e,e.linkpath,"symlink",r)}[K7](e,r){this[bB](e,Pa.resolve(this.cwd,e.linkpath),"link",r)}[G7](){this[vB]++}[Dg](){this[vB]--,this[gR]()}[fR](e){this[Dg](),e.resume()}[AR](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&process.platform!=="win32"}[aR](e){this[G7]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,i=>this[M7](e,i))}[M7](e,r){this[Pg](Pa.dirname(e.absolute),this.dmode,i=>{if(i)return r(),this[nn](i,e);Ut.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),r()):n||this[AR](e,s)?this[Da](null,e,r):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[Da](null,e,r):Ut.chmod(e.absolute,e.mode,o=>this[Da](o,e,r)):Ut.rmdir(e.absolute,o=>this[Da](o,e,r)):JLe(e.absolute,o=>this[Da](o,e,r))})})}[Da](e,r,i){if(e)return this[nn](e,r);switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](r,i);case"Link":return this[K7](r,i);case"SymbolicLink":return this[O7](r,i);case"Directory":case"GNUDumpDir":return this[cR](r,i)}}[bB](e,r,i,n){Ut[i](r,e.absolute,s=>{if(s)return this[nn](s,e);n(),this[Dg](),e.resume()})}},J7=class extends xB{constructor(e){super(e)}[aR](e){let r=this[Pg](Pa.dirname(e.absolute),this.dmode,SB);if(r)return this[nn](r,e);try{let i=Ut.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[Da](null,e,SB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&Ut.chmodSync(e.absolute,e.mode):Ut.rmdirSync(e.absolute):WLe(e.absolute),this[Da](null,e,SB)}catch(n){return this[nn](n,e)}}catch(i){return this[Da](null,e,SB)}}[lR](e,r){let i=e.mode&4095||this.fmode,n=l=>{let c;try{Ut.closeSync(o)}catch(u){c=u}(l||c)&&this[nn](l||c,e)},s,o;try{o=Ut.openSync(e.absolute,Y7(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.on("data",l=>{try{Ut.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{Ut.futimesSync(o,u,g)}catch(f){try{Ut.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[ud](e)){let u=this[gd](e),g=this[fd](e);try{Ut.fchownSync(o,u,g)}catch(f){try{Ut.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,r){let i=e.mode&4095||this.dmode,n=this[Pg](e.absolute,i);if(n)return this[nn](n,e);if(e.mtime&&!this.noMtime)try{Ut.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[ud](e))try{Ut.chownSync(e.absolute,this[gd](e),this[fd](e))}catch(s){}e.resume()}[Pg](e,r){try{return oR.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:r})}catch(i){return i}}[bB](e,r,i,n){try{Ut[i+"Sync"](r,e.absolute),e.resume()}catch(s){return this[nn](s,e)}}};xB.Sync=J7;N7.exports=xB});var X7=E((cct,W7)=>{"use strict";var zLe=fg(),kB=hR(),z7=require("fs"),V7=bg(),_7=require("path"),lct=W7.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=zLe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&VLe(i,e),i.file&&i.sync?_Le(i):i.file?XLe(i,r):i.sync?ZLe(i):$Le(i)},VLe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||_7.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(_7.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},_Le=t=>{let e=new kB.Sync(t),r=t.file,i=!0,n,s=z7.statSync(r),o=t.maxReadSize||16*1024*1024;new V7.ReadStreamSync(r,{readSize:o,size:s.size}).pipe(e)},XLe=(t,e)=>{let r=new kB(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("close",o),z7.stat(n,(l,c)=>{if(l)a(l);else{let u=new V7.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},ZLe=t=>new kB.Sync(t),$Le=t=>new kB(t)});var Z7=E($r=>{"use strict";$r.c=$r.create=TV();$r.r=$r.replace=XD();$r.t=$r.list=IB();$r.u=$r.update=qV();$r.x=$r.extract=X7();$r.Pack=AB();$r.Unpack=hR();$r.Parse=ld();$r.ReadEntry=id();$r.WriteEntry=xD();$r.Header=Cg();$r.Pax=zw();$r.types=rd()});var e_=E((gct,pR)=>{"use strict";var eTe=Object.prototype.hasOwnProperty,sn="~";function hd(){}Object.create&&(hd.prototype=Object.create(null),new hd().__proto__||(sn=!1));function tTe(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function $7(t,e,r,i,n){if(typeof r!="function")throw new TypeError("The listener must be a function");var s=new tTe(r,i||t,n),o=sn?sn+e:e;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],s]:t._events[o].push(s):(t._events[o]=s,t._eventsCount++),t}function PB(t,e){--t._eventsCount==0?t._events=new hd:delete t._events[e]}function Ti(){this._events=new hd,this._eventsCount=0}Ti.prototype.eventNames=function(){var e=[],r,i;if(this._eventsCount===0)return e;for(i in r=this._events)eTe.call(r,i)&&e.push(sn?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(r)):e};Ti.prototype.listeners=function(e){var r=sn?sn+e:e,i=this._events[r];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,s=i.length,o=new Array(s);n{"use strict";t_.exports=(t,e)=>(e=e||(()=>{}),t.then(r=>new Promise(i=>{i(e())}).then(()=>r),r=>new Promise(i=>{i(e())}).then(()=>{throw r})))});var n_=E((hct,DB)=>{"use strict";var rTe=r_(),dR=class extends Error{constructor(e){super(e);this.name="TimeoutError"}},i_=(t,e,r)=>new Promise((i,n)=>{if(typeof e!="number"||e<0)throw new TypeError("Expected `milliseconds` to be a positive number");if(e===Infinity){i(t);return}let s=setTimeout(()=>{if(typeof r=="function"){try{i(r())}catch(l){n(l)}return}let o=typeof r=="string"?r:`Promise timed out after ${e} milliseconds`,a=r instanceof Error?r:new dR(o);typeof t.cancel=="function"&&t.cancel(),n(a)},e);rTe(t.then(i,n),()=>{clearTimeout(s)})});DB.exports=i_;DB.exports.default=i_;DB.exports.TimeoutError=dR});var s_=E(CR=>{"use strict";Object.defineProperty(CR,"__esModule",{value:!0});function iTe(t,e,r){let i=0,n=t.length;for(;n>0;){let s=n/2|0,o=i+s;r(t[o],e)<=0?(i=++o,n-=s+1):n=s}return i}CR.default=iTe});var a_=E(mR=>{"use strict";Object.defineProperty(mR,"__esModule",{value:!0});var nTe=s_(),o_=class{constructor(){this._queue=[]}enqueue(e,r){r=Object.assign({priority:0},r);let i={priority:r.priority,run:e};if(this.size&&this._queue[this.size-1].priority>=r.priority){this._queue.push(i);return}let n=nTe.default(this._queue,i,(s,o)=>o.priority-s.priority);this._queue.splice(n,0,i)}dequeue(){let e=this._queue.shift();return e==null?void 0:e.run}filter(e){return this._queue.filter(r=>r.priority===e.priority).map(r=>r.run)}get size(){return this._queue.length}};mR.default=o_});var c_=E(ER=>{"use strict";Object.defineProperty(ER,"__esModule",{value:!0});var sTe=e_(),A_=n_(),oTe=a_(),RB=()=>{},aTe=new A_.TimeoutError,l_=class extends sTe{constructor(e){var r,i,n,s;super();if(this._intervalCount=0,this._intervalEnd=0,this._pendingCount=0,this._resolveEmpty=RB,this._resolveIdle=RB,e=Object.assign({carryoverConcurrencyCount:!1,intervalCap:Infinity,interval:0,concurrency:Infinity,autoStart:!0,queueClass:oTe.default},e),!(typeof e.intervalCap=="number"&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(i=(r=e.intervalCap)===null||r===void 0?void 0:r.toString())!==null&&i!==void 0?i:""}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(s=(n=e.interval)===null||n===void 0?void 0:n.toString())!==null&&s!==void 0?s:""}\` (${typeof e.interval})`);this._carryoverConcurrencyCount=e.carryoverConcurrencyCount,this._isIntervalIgnored=e.intervalCap===Infinity||e.interval===0,this._intervalCap=e.intervalCap,this._interval=e.interval,this._queue=new e.queueClass,this._queueClass=e.queueClass,this.concurrency=e.concurrency,this._timeout=e.timeout,this._throwOnTimeout=e.throwOnTimeout===!0,this._isPaused=e.autoStart===!1}get _doesIntervalAllowAnother(){return this._isIntervalIgnored||this._intervalCount{this._onResumeInterval()},r)),!0}return!1}_tryToStartAnother(){if(this._queue.size===0)return this._intervalId&&clearInterval(this._intervalId),this._intervalId=void 0,this._resolvePromises(),!1;if(!this._isPaused){let e=!this._isIntervalPaused();if(this._doesIntervalAllowAnother&&this._doesConcurrentAllowAnother){let r=this._queue.dequeue();return r?(this.emit("active"),r(),e&&this._initializeIntervalIfNeeded(),!0):!1}}return!1}_initializeIntervalIfNeeded(){this._isIntervalIgnored||this._intervalId!==void 0||(this._intervalId=setInterval(()=>{this._onInterval()},this._interval),this._intervalEnd=Date.now()+this._interval)}_onInterval(){this._intervalCount===0&&this._pendingCount===0&&this._intervalId&&(clearInterval(this._intervalId),this._intervalId=void 0),this._intervalCount=this._carryoverConcurrencyCount?this._pendingCount:0,this._processQueue()}_processQueue(){for(;this._tryToStartAnother(););}get concurrency(){return this._concurrency}set concurrency(e){if(!(typeof e=="number"&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this._concurrency=e,this._processQueue()}async add(e,r={}){return new Promise((i,n)=>{let s=async()=>{this._pendingCount++,this._intervalCount++;try{let o=this._timeout===void 0&&r.timeout===void 0?e():A_.default(Promise.resolve(e()),r.timeout===void 0?this._timeout:r.timeout,()=>{(r.throwOnTimeout===void 0?this._throwOnTimeout:r.throwOnTimeout)&&n(aTe)});i(await o)}catch(o){n(o)}this._next()};this._queue.enqueue(s,r),this._tryToStartAnother(),this.emit("add")})}async addAll(e,r){return Promise.all(e.map(async i=>this.add(i,r)))}start(){return this._isPaused?(this._isPaused=!1,this._processQueue(),this):this}pause(){this._isPaused=!0}clear(){this._queue=new this._queueClass}async onEmpty(){if(this._queue.size!==0)return new Promise(e=>{let r=this._resolveEmpty;this._resolveEmpty=()=>{r(),e()}})}async onIdle(){if(!(this._pendingCount===0&&this._queue.size===0))return new Promise(e=>{let r=this._resolveIdle;this._resolveIdle=()=>{r(),e()}})}get size(){return this._queue.size}sizeBy(e){return this._queue.filter(e).length}get pending(){return this._pendingCount}get isPaused(){return this._isPaused}get timeout(){return this._timeout}set timeout(e){this._timeout=e}};ER.default=l_});var p_=E((Ect,h_)=>{var yR;h_.exports.getContent=()=>(typeof yR=="undefined"&&(yR=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),yR)});var y_=E((wR,I_)=>{(function(t,e){typeof wR=="object"?I_.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(wR,function(){function t(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function r(n,s,o,a,l,c,u){var g="",f=0,h,p,d=a.slice(0);if(d.push([s,o])&&a.length>0&&(a.forEach(function(I,B){B>0&&(g+=(I[1]?" ":"\u2502")+" "),!p&&I[0]===s&&(p=!0)}),g+=t(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var m=e(s,c);m.forEach(function(I){h=++f===m.length,r(I,s[I],h,d,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;r(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return r(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var x_=E((Uct,bR)=>{"use strict";var pTe=t=>{let e=!1,r=!1,i=!1;for(let n=0;n{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(t)?t=t.map(n=>n.trim()).filter(n=>n.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=pTe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),r(t))};bR.exports=S_;bR.exports.default=S_});var Na=E(TR=>{"use strict";Object.defineProperty(TR,"__esModule",{value:!0});TR.default=L_;function L_(){}L_.prototype={diff:function(e,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(d){return n?(setTimeout(function(){n(void 0,d)},0),!0):d}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var a=r.length,l=e.length,c=1,u=a+l,g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],r,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(r),count:r.length}]);function h(){for(var d=-1*c;d<=c;d+=2){var m=void 0,I=g[d-1],B=g[d+1],b=(B?B.newPos:0)-d;I&&(g[d-1]=void 0);var R=I&&I.newPos+1=a&&b+1>=l)return o(yTe(s,m.components,r,e,s.useLongestToken));g[d]=m}c++}if(n)(function d(){setTimeout(function(){if(c>u)return n();h()||d()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,r,i){var n=e[e.length-1];n&&n.added===r&&n.removed===i?e[e.length-1]={count:n.count+1,added:r,removed:i}:e.push({count:1,added:r,removed:i})},extractCommon:function(e,r,i,n){for(var s=r.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?d:h}),c.value=t.join(u)}else c.value=t.join(r.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&t.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function wTe(t){return{newPos:t.newPos,components:t.components.slice(0)}}});var M_=E(Cd=>{"use strict";Object.defineProperty(Cd,"__esModule",{value:!0});Cd.diffChars=BTe;Cd.characterDiff=void 0;var bTe=QTe(Na());function QTe(t){return t&&t.__esModule?t:{default:t}}var T_=new bTe.default;Cd.characterDiff=T_;function BTe(t,e,r){return T_.diff(t,e,r)}});var OR=E(MR=>{"use strict";Object.defineProperty(MR,"__esModule",{value:!0});MR.generateOptions=vTe;function vTe(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}});var U_=E(Ng=>{"use strict";Object.defineProperty(Ng,"__esModule",{value:!0});Ng.diffWords=STe;Ng.diffWordsWithSpace=xTe;Ng.wordDiff=void 0;var PTe=kTe(Na()),DTe=OR();function kTe(t){return t&&t.__esModule?t:{default:t}}var O_=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,K_=/\S/,md=new PTe.default;Ng.wordDiff=md;md.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!K_.test(t)&&!K_.test(e)};md.tokenize=function(t){for(var e=t.split(/(\s+|[()[\]{}'"]|\b)/),r=0;r{"use strict";Object.defineProperty(Lg,"__esModule",{value:!0});Lg.diffLines=RTe;Lg.diffTrimmedLines=FTe;Lg.lineDiff=void 0;var LTe=NTe(Na()),TTe=OR();function NTe(t){return t&&t.__esModule?t:{default:t}}var OB=new LTe.default;Lg.lineDiff=OB;OB.tokenize=function(t){var e=[],r=t.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(var i=0;i{"use strict";Object.defineProperty(Ed,"__esModule",{value:!0});Ed.diffSentences=MTe;Ed.sentenceDiff=void 0;var KTe=OTe(Na());function OTe(t){return t&&t.__esModule?t:{default:t}}var KR=new KTe.default;Ed.sentenceDiff=KR;KR.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function MTe(t,e,r){return KR.diff(t,e,r)}});var G_=E(Id=>{"use strict";Object.defineProperty(Id,"__esModule",{value:!0});Id.diffCss=UTe;Id.cssDiff=void 0;var GTe=HTe(Na());function HTe(t){return t&&t.__esModule?t:{default:t}}var UR=new GTe.default;Id.cssDiff=UR;UR.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function UTe(t,e,r){return UR.diff(t,e,r)}});var Y_=E(Tg=>{"use strict";Object.defineProperty(Tg,"__esModule",{value:!0});Tg.diffJson=jTe;Tg.canonicalize=UB;Tg.jsonDiff=void 0;var j_=YTe(Na()),qTe=KB();function YTe(t){return t&&t.__esModule?t:{default:t}}function HB(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?HB=function(r){return typeof r}:HB=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},HB(t)}var JTe=Object.prototype.toString,bc=new j_.default;Tg.jsonDiff=bc;bc.useLongestToken=!0;bc.tokenize=qTe.lineDiff.tokenize;bc.castInput=function(t){var e=this.options,r=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o=="undefined"?r:o}:i;return typeof t=="string"?t:JSON.stringify(UB(t,null,null,n),n," ")};bc.equals=function(t,e){return j_.default.prototype.equals.call(bc,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function jTe(t,e,r){return bc.diff(t,e,r)}function UB(t,e,r,i,n){e=e||[],r=r||[],i&&(t=i(n,t));var s;for(s=0;s{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});yd.diffArrays=WTe;yd.arrayDiff=void 0;var VTe=zTe(Na());function zTe(t){return t&&t.__esModule?t:{default:t}}var wd=new VTe.default;yd.arrayDiff=wd;wd.tokenize=function(t){return t.slice()};wd.join=wd.removeEmpty=function(t){return t};function WTe(t,e,r){return wd.diff(t,e,r)}});var GB=E(HR=>{"use strict";Object.defineProperty(HR,"__esModule",{value:!0});HR.parsePatch=_Te;function _Te(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=t.split(/\r\n|[\n\v\f\r\x85]/),i=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],n=[],s=0;function o(){var c={};for(n.push(c);s{"use strict";Object.defineProperty(GR,"__esModule",{value:!0});GR.default=XTe;function XTe(t,e,r){var i=!0,n=!1,s=!1,o=1;return function a(){if(i&&!s){if(n?o++:i=!1,t+o<=r)return o;s=!0}if(!n)return s||(i=!0),e<=t-o?-o++:(n=!0,a())}}});var V_=E(jB=>{"use strict";Object.defineProperty(jB,"__esModule",{value:!0});jB.applyPatch=W_;jB.applyPatches=ZTe;var z_=GB(),eMe=$Te(J_());function $Te(t){return t&&t.__esModule?t:{default:t}}function W_(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof e=="string"&&(e=(0,z_.parsePatch)(e)),Array.isArray(e)){if(e.length>1)throw new Error("applyPatch only works with a single input.");e=e[0]}var i=t.split(/\r\n|[\n\v\f\r\x85]/),n=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],s=e.hunks,o=r.compareLine||function(F,D,he,pe){return D===pe},a=0,l=r.fuzzFactor||0,c=0,u=0,g,f;function h(F,D){for(var he=0;he0?pe[0]:" ",Pe=pe.length>0?pe.substr(1):pe;if(Ne===" "||Ne==="-"){if(!o(D+1,i[D],Ne,Pe)&&(a++,a>l))return!1;D++}}return!0}for(var p=0;p0?ne[0]:" ",A=ne.length>0?ne.substr(1):ne,V=L.linedelimiters[J];if(q===" ")K++;else if(q==="-")i.splice(K,1),n.splice(K,1);else if(q==="+")i.splice(K,0,A),n.splice(K,0,V),K++;else if(q==="\\"){var W=L.lines[J-1]?L.lines[J-1][0]:null;W==="+"?g=!0:W==="-"&&(f=!0)}}}if(g)for(;!i[i.length-1];)i.pop(),n.pop();else f&&(i.push(""),n.push(` -`));for(var X=0;X{"use strict";Object.defineProperty(Bd,"__esModule",{value:!0});Bd.structuredPatch=__;Bd.createTwoFilesPatch=X_;Bd.createPatch=tMe;var rMe=KB();function jR(t){return sMe(t)||nMe(t)||iMe()}function iMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function nMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function sMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0?l(L.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(H=f).push.apply(H,jR(R.map(function(X){return(b.added?"+":"-")+X}))),b.added?p+=R.length:h+=R.length}else{if(u)if(R.length<=o.context*2&&B=a.length-2&&R.length<=o.context){var A=/\n$/.test(r),V=/\n$/.test(i),W=R.length==0&&f.length>q.oldLines;!A&&W&&f.splice(q.oldLines,0,"\\ No newline at end of file"),(!A&&!W||!V)&&f.push("\\ No newline at end of file")}c.push(q),u=0,g=0,f=[]}h+=R.length,p+=R.length}},m=0;m{"use strict";Object.defineProperty(YB,"__esModule",{value:!0});YB.arrayEqual=oMe;YB.arrayStartsWith=Z_;function oMe(t,e){return t.length!==e.length?!1:Z_(t,e)}function Z_(t,e){if(e.length>t.length)return!1;for(var r=0;r{"use strict";Object.defineProperty(qB,"__esModule",{value:!0});qB.calcLineCount=eX;qB.merge=aMe;var AMe=YR(),lMe=GB(),qR=$_();function Mg(t){return gMe(t)||uMe(t)||cMe()}function cMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function uMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function gMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e{"use strict";Object.defineProperty(zR,"__esModule",{value:!0});zR.convertChangesToDMP=dMe;function dMe(t){for(var e=[],r,i,n=0;n{"use strict";Object.defineProperty(VR,"__esModule",{value:!0});VR.convertChangesToXML=CMe;function CMe(t){for(var e=[],r=0;r"):i.removed&&e.push(""),e.push(mMe(i.value)),i.added?e.push(""):i.removed&&e.push("")}return e.join("")}function mMe(t){var e=t;return e=e.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/"/g,"""),e}});var CX=E(br=>{"use strict";Object.defineProperty(br,"__esModule",{value:!0});Object.defineProperty(br,"Diff",{enumerable:!0,get:function(){return EMe.default}});Object.defineProperty(br,"diffChars",{enumerable:!0,get:function(){return IMe.diffChars}});Object.defineProperty(br,"diffWords",{enumerable:!0,get:function(){return fX.diffWords}});Object.defineProperty(br,"diffWordsWithSpace",{enumerable:!0,get:function(){return fX.diffWordsWithSpace}});Object.defineProperty(br,"diffLines",{enumerable:!0,get:function(){return hX.diffLines}});Object.defineProperty(br,"diffTrimmedLines",{enumerable:!0,get:function(){return hX.diffTrimmedLines}});Object.defineProperty(br,"diffSentences",{enumerable:!0,get:function(){return yMe.diffSentences}});Object.defineProperty(br,"diffCss",{enumerable:!0,get:function(){return wMe.diffCss}});Object.defineProperty(br,"diffJson",{enumerable:!0,get:function(){return pX.diffJson}});Object.defineProperty(br,"canonicalize",{enumerable:!0,get:function(){return pX.canonicalize}});Object.defineProperty(br,"diffArrays",{enumerable:!0,get:function(){return BMe.diffArrays}});Object.defineProperty(br,"applyPatch",{enumerable:!0,get:function(){return dX.applyPatch}});Object.defineProperty(br,"applyPatches",{enumerable:!0,get:function(){return dX.applyPatches}});Object.defineProperty(br,"parsePatch",{enumerable:!0,get:function(){return QMe.parsePatch}});Object.defineProperty(br,"merge",{enumerable:!0,get:function(){return bMe.merge}});Object.defineProperty(br,"structuredPatch",{enumerable:!0,get:function(){return _R.structuredPatch}});Object.defineProperty(br,"createTwoFilesPatch",{enumerable:!0,get:function(){return _R.createTwoFilesPatch}});Object.defineProperty(br,"createPatch",{enumerable:!0,get:function(){return _R.createPatch}});Object.defineProperty(br,"convertChangesToDMP",{enumerable:!0,get:function(){return vMe.convertChangesToDMP}});Object.defineProperty(br,"convertChangesToXML",{enumerable:!0,get:function(){return SMe.convertChangesToXML}});var EMe=xMe(Na()),IMe=M_(),fX=U_(),hX=KB(),yMe=H_(),wMe=G_(),pX=Y_(),BMe=q_(),dX=V_(),QMe=GB(),bMe=cX(),_R=YR(),vMe=uX(),SMe=gX();function xMe(t){return t&&t.__esModule?t:{default:t}}});var WB=E((agt,mX)=>{var kMe=As(),PMe=Nw(),DMe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,RMe=/^\w*$/;function FMe(t,e){if(kMe(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||PMe(t)?!0:RMe.test(t)||!DMe.test(t)||e!=null&&t in Object(e)}mX.exports=FMe});var Gs=E((Agt,EX)=>{function NMe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}EX.exports=NMe});var zB=E((lgt,IX)=>{var LMe=Ac(),TMe=Gs(),MMe="[object AsyncFunction]",OMe="[object Function]",KMe="[object GeneratorFunction]",UMe="[object Proxy]";function HMe(t){if(!TMe(t))return!1;var e=LMe(t);return e==OMe||e==KMe||e==MMe||e==UMe}IX.exports=HMe});var wX=E((cgt,yX)=>{var GMe=Ks(),jMe=GMe["__core-js_shared__"];yX.exports=jMe});var bX=E((ugt,BX)=>{var XR=wX(),QX=function(){var t=/[^.]+$/.exec(XR&&XR.keys&&XR.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function YMe(t){return!!QX&&QX in t}BX.exports=YMe});var ZR=E((ggt,vX)=>{var qMe=Function.prototype,JMe=qMe.toString;function WMe(t){if(t!=null){try{return JMe.call(t)}catch(e){}try{return t+""}catch(e){}}return""}vX.exports=WMe});var xX=E((fgt,SX)=>{var zMe=zB(),VMe=bX(),_Me=Gs(),XMe=ZR(),ZMe=/[\\^$.*+?()[\]{}|]/g,$Me=/^\[object .+?Constructor\]$/,eOe=Function.prototype,tOe=Object.prototype,rOe=eOe.toString,iOe=tOe.hasOwnProperty,nOe=RegExp("^"+rOe.call(iOe).replace(ZMe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function sOe(t){if(!_Me(t)||VMe(t))return!1;var e=zMe(t)?nOe:$Me;return e.test(XMe(t))}SX.exports=sOe});var PX=E((hgt,kX)=>{function oOe(t,e){return t==null?void 0:t[e]}kX.exports=oOe});var UA=E((pgt,DX)=>{var aOe=xX(),AOe=PX();function lOe(t,e){var r=AOe(t,e);return aOe(r)?r:void 0}DX.exports=lOe});var Qd=E((dgt,RX)=>{var cOe=UA(),uOe=cOe(Object,"create");RX.exports=uOe});var LX=E((Cgt,FX)=>{var NX=Qd();function gOe(){this.__data__=NX?NX(null):{},this.size=0}FX.exports=gOe});var MX=E((mgt,TX)=>{function fOe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}TX.exports=fOe});var KX=E((Egt,OX)=>{var hOe=Qd(),pOe="__lodash_hash_undefined__",dOe=Object.prototype,COe=dOe.hasOwnProperty;function mOe(t){var e=this.__data__;if(hOe){var r=e[t];return r===pOe?void 0:r}return COe.call(e,t)?e[t]:void 0}OX.exports=mOe});var HX=E((Igt,UX)=>{var EOe=Qd(),IOe=Object.prototype,yOe=IOe.hasOwnProperty;function wOe(t){var e=this.__data__;return EOe?e[t]!==void 0:yOe.call(e,t)}UX.exports=wOe});var jX=E((ygt,GX)=>{var BOe=Qd(),QOe="__lodash_hash_undefined__";function bOe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=BOe&&e===void 0?QOe:e,this}GX.exports=bOe});var qX=E((wgt,YX)=>{var vOe=LX(),SOe=MX(),xOe=KX(),kOe=HX(),POe=jX();function Og(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{function DOe(){this.__data__=[],this.size=0}JX.exports=DOe});var Kg=E((Qgt,zX)=>{function ROe(t,e){return t===e||t!==t&&e!==e}zX.exports=ROe});var bd=E((bgt,VX)=>{var FOe=Kg();function NOe(t,e){for(var r=t.length;r--;)if(FOe(t[r][0],e))return r;return-1}VX.exports=NOe});var XX=E((vgt,_X)=>{var LOe=bd(),TOe=Array.prototype,MOe=TOe.splice;function OOe(t){var e=this.__data__,r=LOe(e,t);if(r<0)return!1;var i=e.length-1;return r==i?e.pop():MOe.call(e,r,1),--this.size,!0}_X.exports=OOe});var $X=E((Sgt,ZX)=>{var KOe=bd();function UOe(t){var e=this.__data__,r=KOe(e,t);return r<0?void 0:e[r][1]}ZX.exports=UOe});var tZ=E((xgt,eZ)=>{var HOe=bd();function GOe(t){return HOe(this.__data__,t)>-1}eZ.exports=GOe});var iZ=E((kgt,rZ)=>{var jOe=bd();function YOe(t,e){var r=this.__data__,i=jOe(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}rZ.exports=YOe});var vd=E((Pgt,nZ)=>{var qOe=WX(),JOe=XX(),WOe=$X(),zOe=tZ(),VOe=iZ();function Ug(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var _Oe=UA(),XOe=Ks(),ZOe=_Oe(XOe,"Map");sZ.exports=ZOe});var AZ=E((Rgt,oZ)=>{var aZ=qX(),$Oe=vd(),eKe=VB();function tKe(){this.size=0,this.__data__={hash:new aZ,map:new(eKe||$Oe),string:new aZ}}oZ.exports=tKe});var cZ=E((Fgt,lZ)=>{function rKe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}lZ.exports=rKe});var Sd=E((Ngt,uZ)=>{var iKe=cZ();function nKe(t,e){var r=t.__data__;return iKe(e)?r[typeof e=="string"?"string":"hash"]:r.map}uZ.exports=nKe});var fZ=E((Lgt,gZ)=>{var sKe=Sd();function oKe(t){var e=sKe(this,t).delete(t);return this.size-=e?1:0,e}gZ.exports=oKe});var pZ=E((Tgt,hZ)=>{var aKe=Sd();function AKe(t){return aKe(this,t).get(t)}hZ.exports=AKe});var CZ=E((Mgt,dZ)=>{var lKe=Sd();function cKe(t){return lKe(this,t).has(t)}dZ.exports=cKe});var EZ=E((Ogt,mZ)=>{var uKe=Sd();function gKe(t,e){var r=uKe(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}mZ.exports=gKe});var _B=E((Kgt,IZ)=>{var fKe=AZ(),hKe=fZ(),pKe=pZ(),dKe=CZ(),CKe=EZ();function Hg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var wZ=_B(),mKe="Expected a function";function $R(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(mKe);var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=r.cache;if(s.has(n))return s.get(n);var o=t.apply(this,i);return r.cache=s.set(n,o)||s,o};return r.cache=new($R.Cache||wZ),r}$R.Cache=wZ;yZ.exports=$R});var bZ=E((Hgt,QZ)=>{var EKe=BZ(),IKe=500;function yKe(t){var e=EKe(t,function(i){return r.size===IKe&&r.clear(),i}),r=e.cache;return e}QZ.exports=yKe});var SZ=E((Ggt,vZ)=>{var wKe=bZ(),BKe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,QKe=/\\(\\)?/g,bKe=wKe(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(BKe,function(r,i,n,s){e.push(n?s.replace(QKe,"$1"):i||r)}),e});vZ.exports=bKe});var Gg=E((jgt,xZ)=>{var vKe=As(),SKe=WB(),xKe=SZ(),kKe=gg();function PKe(t,e){return vKe(t)?t:SKe(t,e)?[t]:xKe(kKe(t))}xZ.exports=PKe});var Sc=E((Ygt,kZ)=>{var DKe=Nw(),RKe=1/0;function FKe(t){if(typeof t=="string"||DKe(t))return t;var e=t+"";return e=="0"&&1/t==-RKe?"-0":e}kZ.exports=FKe});var xd=E((qgt,PZ)=>{var NKe=Gg(),LKe=Sc();function TKe(t,e){e=NKe(e,t);for(var r=0,i=e.length;t!=null&&r{var MKe=UA(),OKe=function(){try{var t=MKe(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();DZ.exports=OKe});var jg=E((Wgt,RZ)=>{var FZ=eF();function KKe(t,e,r){e=="__proto__"&&FZ?FZ(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}RZ.exports=KKe});var XB=E((zgt,NZ)=>{var UKe=jg(),HKe=Kg(),GKe=Object.prototype,jKe=GKe.hasOwnProperty;function YKe(t,e,r){var i=t[e];(!(jKe.call(t,e)&&HKe(i,r))||r===void 0&&!(e in t))&&UKe(t,e,r)}NZ.exports=YKe});var kd=E((Vgt,LZ)=>{var qKe=9007199254740991,JKe=/^(?:0|[1-9]\d*)$/;function WKe(t,e){var r=typeof t;return e=e==null?qKe:e,!!e&&(r=="number"||r!="symbol"&&JKe.test(t))&&t>-1&&t%1==0&&t{var zKe=XB(),VKe=Gg(),_Ke=kd(),MZ=Gs(),XKe=Sc();function ZKe(t,e,r,i){if(!MZ(t))return t;e=VKe(e,t);for(var n=-1,s=e.length,o=s-1,a=t;a!=null&&++n{var $Ke=xd(),e1e=tF(),t1e=Gg();function r1e(t,e,r){for(var i=-1,n=e.length,s={};++i{function i1e(t,e){return t!=null&&e in Object(t)}UZ.exports=i1e});var jZ=E(($gt,GZ)=>{var n1e=Ac(),s1e=Qo(),o1e="[object Arguments]";function a1e(t){return s1e(t)&&n1e(t)==o1e}GZ.exports=a1e});var Pd=E((eft,YZ)=>{var qZ=jZ(),A1e=Qo(),JZ=Object.prototype,l1e=JZ.hasOwnProperty,c1e=JZ.propertyIsEnumerable,u1e=qZ(function(){return arguments}())?qZ:function(t){return A1e(t)&&l1e.call(t,"callee")&&!c1e.call(t,"callee")};YZ.exports=u1e});var ZB=E((tft,WZ)=>{var g1e=9007199254740991;function f1e(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=g1e}WZ.exports=f1e});var rF=E((rft,zZ)=>{var h1e=Gg(),p1e=Pd(),d1e=As(),C1e=kd(),m1e=ZB(),E1e=Sc();function I1e(t,e,r){e=h1e(e,t);for(var i=-1,n=e.length,s=!1;++i{var y1e=HZ(),w1e=rF();function B1e(t,e){return t!=null&&w1e(t,e,y1e)}VZ.exports=B1e});var XZ=E((nft,_Z)=>{var Q1e=KZ(),b1e=iF();function v1e(t,e){return Q1e(t,e,function(r,i){return b1e(t,i)})}_Z.exports=v1e});var $B=E((sft,ZZ)=>{function S1e(t,e){for(var r=-1,i=e.length,n=t.length;++r{var e$=ac(),x1e=Pd(),k1e=As(),t$=e$?e$.isConcatSpreadable:void 0;function P1e(t){return k1e(t)||x1e(t)||!!(t$&&t&&t[t$])}$Z.exports=P1e});var s$=E((aft,i$)=>{var D1e=$B(),R1e=r$();function n$(t,e,r,i,n){var s=-1,o=t.length;for(r||(r=R1e),n||(n=[]);++s0&&r(a)?e>1?n$(a,e-1,r,i,n):D1e(n,a):i||(n[n.length]=a)}return n}i$.exports=n$});var a$=E((Aft,o$)=>{var F1e=s$();function N1e(t){var e=t==null?0:t.length;return e?F1e(t,1):[]}o$.exports=N1e});var l$=E((lft,A$)=>{function L1e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}A$.exports=L1e});var nF=E((cft,c$)=>{var T1e=l$(),u$=Math.max;function M1e(t,e,r){return e=u$(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,s=u$(i.length-e,0),o=Array(s);++n{function O1e(t){return function(){return t}}g$.exports=O1e});var e0=E((gft,h$)=>{function K1e(t){return t}h$.exports=K1e});var C$=E((fft,p$)=>{var U1e=f$(),d$=eF(),H1e=e0(),G1e=d$?function(t,e){return d$(t,"toString",{configurable:!0,enumerable:!1,value:U1e(e),writable:!0})}:H1e;p$.exports=G1e});var E$=E((hft,m$)=>{var j1e=800,Y1e=16,q1e=Date.now;function J1e(t){var e=0,r=0;return function(){var i=q1e(),n=Y1e-(i-r);if(r=i,n>0){if(++e>=j1e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}m$.exports=J1e});var sF=E((pft,I$)=>{var W1e=C$(),z1e=E$(),V1e=z1e(W1e);I$.exports=V1e});var w$=E((dft,y$)=>{var _1e=a$(),X1e=nF(),Z1e=sF();function $1e(t){return Z1e(X1e(t,void 0,_1e),t+"")}y$.exports=$1e});var Q$=E((Cft,B$)=>{var eUe=XZ(),tUe=w$(),rUe=tUe(function(t,e){return t==null?{}:eUe(t,e)});B$.exports=rUe});var M$=E((lpt,N$)=>{"use strict";var pF;try{pF=Map}catch(t){}var dF;try{dF=Set}catch(t){}function L$(t,e,r){if(!t||typeof t!="object"||typeof t=="function")return t;if(t.nodeType&&"cloneNode"in t)return t.cloneNode(!0);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t);if(Array.isArray(t))return t.map(T$);if(pF&&t instanceof pF)return new Map(Array.from(t.entries()));if(dF&&t instanceof dF)return new Set(Array.from(t.values()));if(t instanceof Object){e.push(t);var i=Object.create(t);r.push(i);for(var n in t){var s=e.findIndex(function(o){return o===t[n]});i[n]=s>-1?r[s]:L$(t[n],e,r)}return i}return t}function T$(t){return L$(t,[],[])}N$.exports=T$});var Nd=E(CF=>{"use strict";Object.defineProperty(CF,"__esModule",{value:!0});CF.default=uUe;var gUe=Object.prototype.toString,fUe=Error.prototype.toString,hUe=RegExp.prototype.toString,pUe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",dUe=/^Symbol\((.*)\)(.*)$/;function CUe(t){return t!=+t?"NaN":t===0&&1/t<0?"-0":""+t}function O$(t,e=!1){if(t==null||t===!0||t===!1)return""+t;let r=typeof t;if(r==="number")return CUe(t);if(r==="string")return e?`"${t}"`:t;if(r==="function")return"[Function "+(t.name||"anonymous")+"]";if(r==="symbol")return pUe.call(t).replace(dUe,"Symbol($1)");let i=gUe.call(t).slice(8,-1);return i==="Date"?isNaN(t.getTime())?""+t:t.toISOString(t):i==="Error"||t instanceof Error?"["+fUe.call(t)+"]":i==="RegExp"?hUe.call(t):null}function uUe(t,e){let r=O$(t,e);return r!==null?r:JSON.stringify(t,function(i,n){let s=O$(this[i],e);return s!==null?s:n},2)}});var La=E(ci=>{"use strict";Object.defineProperty(ci,"__esModule",{value:!0});ci.default=ci.array=ci.object=ci.boolean=ci.date=ci.number=ci.string=ci.mixed=void 0;var K$=mUe(Nd());function mUe(t){return t&&t.__esModule?t:{default:t}}var U$={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:({path:t,type:e,value:r,originalValue:i})=>{let n=i!=null&&i!==r,s=`${t} must be a \`${e}\` type, but the final value was: \`${(0,K$.default)(r,!0)}\``+(n?` (cast from the value \`${(0,K$.default)(i,!0)}\`).`:".");return r===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};ci.mixed=U$;var H$={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",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};ci.string=H$;var G$={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}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};ci.number=G$;var j$={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};ci.date=j$;var Y$={isValue:"${path} field must be ${value}"};ci.boolean=Y$;var q$={noUnknown:"${path} field has unspecified keys: ${unknown}"};ci.object=q$;var J$={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};ci.array=J$;var EUe=Object.assign(Object.create(null),{mixed:U$,string:H$,number:G$,date:j$,object:q$,array:J$,boolean:Y$});ci.default=EUe});var z$=E((gpt,W$)=>{var IUe=Object.prototype,yUe=IUe.hasOwnProperty;function wUe(t,e){return t!=null&&yUe.call(t,e)}W$.exports=wUe});var Ld=E((fpt,V$)=>{var BUe=z$(),QUe=rF();function bUe(t,e){return t!=null&&QUe(t,e,BUe)}V$.exports=bUe});var qg=E(n0=>{"use strict";Object.defineProperty(n0,"__esModule",{value:!0});n0.default=void 0;var vUe=t=>t&&t.__isYupSchema__;n0.default=vUe});var Z$=E(s0=>{"use strict";Object.defineProperty(s0,"__esModule",{value:!0});s0.default=void 0;var SUe=_$(Ld()),xUe=_$(qg());function _$(t){return t&&t.__esModule?t:{default:t}}var X$=class{constructor(e,r){if(this.refs=e,this.refs=e,typeof r=="function"){this.fn=r;return}if(!(0,SUe.default)(r,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!r.then&&!r.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=r,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,r){let i=this.refs.map(s=>s.getValue(r==null?void 0:r.value,r==null?void 0:r.parent,r==null?void 0:r.context)),n=this.fn.apply(e,i.concat(e,r));if(n===void 0||n===e)return e;if(!(0,xUe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(r)}},kUe=X$;s0.default=kUe});var EF=E(mF=>{"use strict";Object.defineProperty(mF,"__esModule",{value:!0});mF.default=PUe;function PUe(t){return t==null?[]:[].concat(t)}});var xc=E(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var DUe=$$(Nd()),RUe=$$(EF());function $$(t){return t&&t.__esModule?t:{default:t}}function IF(){return IF=Object.assign||function(t){for(var e=1;e(0,DUe.default)(r[s])):typeof e=="function"?e(r):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,r,i,n){super();this.name="ValidationError",this.value=r,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,RUe.default)(e).forEach(s=>{Td.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Td)}};o0.default=Td});var a0=E(yF=>{"use strict";Object.defineProperty(yF,"__esModule",{value:!0});yF.default=NUe;var wF=LUe(xc());function LUe(t){return t&&t.__esModule?t:{default:t}}var TUe=t=>{let e=!1;return(...r)=>{e||(e=!0,t(...r))}};function NUe(t,e){let{endEarly:r,tests:i,args:n,value:s,errors:o,sort:a,path:l}=t,c=TUe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new wF.default(o,s,l)):c(null,s);for(let f=0;f{function MUe(t){return function(e,r,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[t?a:++n];if(r(s[l],l,s)===!1)break}return e}}eee.exports=MUe});var BF=E((Ipt,ree)=>{var OUe=tee(),KUe=OUe();ree.exports=KUe});var nee=E((ypt,iee)=>{function UUe(t,e){for(var r=-1,i=Array(t);++r{function HUe(){return!1}see.exports=HUe});var Od=E((Md,Jg)=>{var GUe=Ks(),jUe=oee(),aee=typeof Md=="object"&&Md&&!Md.nodeType&&Md,Aee=aee&&typeof Jg=="object"&&Jg&&!Jg.nodeType&&Jg,YUe=Aee&&Aee.exports===aee,lee=YUe?GUe.Buffer:void 0,qUe=lee?lee.isBuffer:void 0,JUe=qUe||jUe;Jg.exports=JUe});var uee=E((Bpt,cee)=>{var WUe=Ac(),zUe=ZB(),VUe=Qo(),_Ue="[object Arguments]",XUe="[object Array]",ZUe="[object Boolean]",$Ue="[object Date]",e2e="[object Error]",t2e="[object Function]",r2e="[object Map]",i2e="[object Number]",n2e="[object Object]",s2e="[object RegExp]",o2e="[object Set]",a2e="[object String]",A2e="[object WeakMap]",l2e="[object ArrayBuffer]",c2e="[object DataView]",u2e="[object Float32Array]",g2e="[object Float64Array]",f2e="[object Int8Array]",h2e="[object Int16Array]",p2e="[object Int32Array]",d2e="[object Uint8Array]",C2e="[object Uint8ClampedArray]",m2e="[object Uint16Array]",E2e="[object Uint32Array]",lr={};lr[u2e]=lr[g2e]=lr[f2e]=lr[h2e]=lr[p2e]=lr[d2e]=lr[C2e]=lr[m2e]=lr[E2e]=!0;lr[_Ue]=lr[XUe]=lr[l2e]=lr[ZUe]=lr[c2e]=lr[$Ue]=lr[e2e]=lr[t2e]=lr[r2e]=lr[i2e]=lr[n2e]=lr[s2e]=lr[o2e]=lr[a2e]=lr[A2e]=!1;function I2e(t){return VUe(t)&&zUe(t.length)&&!!lr[WUe(t)]}cee.exports=I2e});var A0=E((Qpt,gee)=>{function y2e(t){return function(e){return t(e)}}gee.exports=y2e});var l0=E((Kd,Wg)=>{var w2e=WP(),fee=typeof Kd=="object"&&Kd&&!Kd.nodeType&&Kd,Ud=fee&&typeof Wg=="object"&&Wg&&!Wg.nodeType&&Wg,B2e=Ud&&Ud.exports===fee,QF=B2e&&w2e.process,Q2e=function(){try{var t=Ud&&Ud.require&&Ud.require("util").types;return t||QF&&QF.binding&&QF.binding("util")}catch(e){}}();Wg.exports=Q2e});var c0=E((bpt,hee)=>{var b2e=uee(),v2e=A0(),pee=l0(),dee=pee&&pee.isTypedArray,S2e=dee?v2e(dee):b2e;hee.exports=S2e});var bF=E((vpt,Cee)=>{var x2e=nee(),k2e=Pd(),P2e=As(),D2e=Od(),R2e=kd(),F2e=c0(),N2e=Object.prototype,L2e=N2e.hasOwnProperty;function T2e(t,e){var r=P2e(t),i=!r&&k2e(t),n=!r&&!i&&D2e(t),s=!r&&!i&&!n&&F2e(t),o=r||i||n||s,a=o?x2e(t.length,String):[],l=a.length;for(var c in t)(e||L2e.call(t,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||R2e(c,l)))&&a.push(c);return a}Cee.exports=T2e});var u0=E((Spt,mee)=>{var M2e=Object.prototype;function O2e(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||M2e;return t===r}mee.exports=O2e});var vF=E((xpt,Eee)=>{function K2e(t,e){return function(r){return t(e(r))}}Eee.exports=K2e});var yee=E((kpt,Iee)=>{var U2e=vF(),H2e=U2e(Object.keys,Object);Iee.exports=H2e});var Bee=E((Ppt,wee)=>{var G2e=u0(),j2e=yee(),Y2e=Object.prototype,q2e=Y2e.hasOwnProperty;function J2e(t){if(!G2e(t))return j2e(t);var e=[];for(var r in Object(t))q2e.call(t,r)&&r!="constructor"&&e.push(r);return e}wee.exports=J2e});var Hd=E((Dpt,Qee)=>{var W2e=zB(),z2e=ZB();function V2e(t){return t!=null&&z2e(t.length)&&!W2e(t)}Qee.exports=V2e});var zg=E((Rpt,bee)=>{var _2e=bF(),X2e=Bee(),Z2e=Hd();function $2e(t){return Z2e(t)?_2e(t):X2e(t)}bee.exports=$2e});var SF=E((Fpt,vee)=>{var eHe=BF(),tHe=zg();function rHe(t,e){return t&&eHe(t,e,tHe)}vee.exports=rHe});var xee=E((Npt,See)=>{var iHe=vd();function nHe(){this.__data__=new iHe,this.size=0}See.exports=nHe});var Pee=E((Lpt,kee)=>{function sHe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}kee.exports=sHe});var Ree=E((Tpt,Dee)=>{function oHe(t){return this.__data__.get(t)}Dee.exports=oHe});var Nee=E((Mpt,Fee)=>{function aHe(t){return this.__data__.has(t)}Fee.exports=aHe});var Tee=E((Opt,Lee)=>{var AHe=vd(),lHe=VB(),cHe=_B(),uHe=200;function gHe(t,e){var r=this.__data__;if(r instanceof AHe){var i=r.__data__;if(!lHe||i.length{var fHe=vd(),hHe=xee(),pHe=Pee(),dHe=Ree(),CHe=Nee(),mHe=Tee();function Vg(t){var e=this.__data__=new fHe(t);this.size=e.size}Vg.prototype.clear=hHe;Vg.prototype.delete=pHe;Vg.prototype.get=dHe;Vg.prototype.has=CHe;Vg.prototype.set=mHe;Mee.exports=Vg});var Kee=E((Upt,Oee)=>{var EHe="__lodash_hash_undefined__";function IHe(t){return this.__data__.set(t,EHe),this}Oee.exports=IHe});var Hee=E((Hpt,Uee)=>{function yHe(t){return this.__data__.has(t)}Uee.exports=yHe});var jee=E((Gpt,Gee)=>{var wHe=_B(),BHe=Kee(),QHe=Hee();function g0(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new wHe;++e{function bHe(t,e){for(var r=-1,i=t==null?0:t.length;++r{function vHe(t,e){return t.has(e)}Jee.exports=vHe});var xF=E((qpt,zee)=>{var SHe=jee(),xHe=qee(),kHe=Wee(),PHe=1,DHe=2;function RHe(t,e,r,i,n,s){var o=r&PHe,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(t),u=s.get(e);if(c&&u)return c==e&&u==t;var g=-1,f=!0,h=r&DHe?new SHe:void 0;for(s.set(t,e),s.set(e,t);++g{var FHe=Ks(),NHe=FHe.Uint8Array;Vee.exports=NHe});var Xee=E((Wpt,_ee)=>{function LHe(t){var e=-1,r=Array(t.size);return t.forEach(function(i,n){r[++e]=[n,i]}),r}_ee.exports=LHe});var $ee=E((zpt,Zee)=>{function THe(t){var e=-1,r=Array(t.size);return t.forEach(function(i){r[++e]=i}),r}Zee.exports=THe});var nte=E((Vpt,ete)=>{var tte=ac(),rte=kF(),MHe=Kg(),OHe=xF(),KHe=Xee(),UHe=$ee(),HHe=1,GHe=2,jHe="[object Boolean]",YHe="[object Date]",qHe="[object Error]",JHe="[object Map]",WHe="[object Number]",zHe="[object RegExp]",VHe="[object Set]",_He="[object String]",XHe="[object Symbol]",ZHe="[object ArrayBuffer]",$He="[object DataView]",ite=tte?tte.prototype:void 0,PF=ite?ite.valueOf:void 0;function eGe(t,e,r,i,n,s,o){switch(r){case $He:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ZHe:return!(t.byteLength!=e.byteLength||!s(new rte(t),new rte(e)));case jHe:case YHe:case WHe:return MHe(+t,+e);case qHe:return t.name==e.name&&t.message==e.message;case zHe:case _He:return t==e+"";case JHe:var a=KHe;case VHe:var l=i&HHe;if(a||(a=UHe),t.size!=e.size&&!l)return!1;var c=o.get(t);if(c)return c==e;i|=GHe,o.set(t,e);var u=OHe(a(t),a(e),i,n,s,o);return o.delete(t),u;case XHe:if(PF)return PF.call(t)==PF.call(e)}return!1}ete.exports=eGe});var DF=E((_pt,ste)=>{var tGe=$B(),rGe=As();function iGe(t,e,r){var i=e(t);return rGe(t)?i:tGe(i,r(t))}ste.exports=iGe});var ate=E((Xpt,ote)=>{function nGe(t,e){for(var r=-1,i=t==null?0:t.length,n=0,s=[];++r{function sGe(){return[]}Ate.exports=sGe});var f0=E(($pt,lte)=>{var oGe=ate(),aGe=RF(),AGe=Object.prototype,lGe=AGe.propertyIsEnumerable,cte=Object.getOwnPropertySymbols,cGe=cte?function(t){return t==null?[]:(t=Object(t),oGe(cte(t),function(e){return lGe.call(t,e)}))}:aGe;lte.exports=cGe});var FF=E((edt,ute)=>{var uGe=DF(),gGe=f0(),fGe=zg();function hGe(t){return uGe(t,fGe,gGe)}ute.exports=hGe});var hte=E((tdt,gte)=>{var fte=FF(),pGe=1,dGe=Object.prototype,CGe=dGe.hasOwnProperty;function mGe(t,e,r,i,n,s){var o=r&pGe,a=fte(t),l=a.length,c=fte(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:CGe.call(e,f)))return!1}var h=s.get(t),p=s.get(e);if(h&&p)return h==e&&p==t;var d=!0;s.set(t,e),s.set(e,t);for(var m=o;++g{var EGe=UA(),IGe=Ks(),yGe=EGe(IGe,"DataView");pte.exports=yGe});var mte=E((idt,Cte)=>{var wGe=UA(),BGe=Ks(),QGe=wGe(BGe,"Promise");Cte.exports=QGe});var Ite=E((ndt,Ete)=>{var bGe=UA(),vGe=Ks(),SGe=bGe(vGe,"Set");Ete.exports=SGe});var wte=E((sdt,yte)=>{var xGe=UA(),kGe=Ks(),PGe=xGe(kGe,"WeakMap");yte.exports=PGe});var jd=E((odt,Bte)=>{var NF=dte(),LF=VB(),TF=mte(),MF=Ite(),OF=wte(),Qte=Ac(),_g=ZR(),bte="[object Map]",DGe="[object Object]",vte="[object Promise]",Ste="[object Set]",xte="[object WeakMap]",kte="[object DataView]",RGe=_g(NF),FGe=_g(LF),NGe=_g(TF),LGe=_g(MF),TGe=_g(OF),kc=Qte;(NF&&kc(new NF(new ArrayBuffer(1)))!=kte||LF&&kc(new LF)!=bte||TF&&kc(TF.resolve())!=vte||MF&&kc(new MF)!=Ste||OF&&kc(new OF)!=xte)&&(kc=function(t){var e=Qte(t),r=e==DGe?t.constructor:void 0,i=r?_g(r):"";if(i)switch(i){case RGe:return kte;case FGe:return bte;case NGe:return vte;case LGe:return Ste;case TGe:return xte}return e});Bte.exports=kc});var Mte=E((adt,Pte)=>{var KF=Gd(),MGe=xF(),OGe=nte(),KGe=hte(),Dte=jd(),Rte=As(),Fte=Od(),UGe=c0(),HGe=1,Nte="[object Arguments]",Lte="[object Array]",h0="[object Object]",GGe=Object.prototype,Tte=GGe.hasOwnProperty;function jGe(t,e,r,i,n,s){var o=Rte(t),a=Rte(e),l=o?Lte:Dte(t),c=a?Lte:Dte(e);l=l==Nte?h0:l,c=c==Nte?h0:c;var u=l==h0,g=c==h0,f=l==c;if(f&&Fte(t)){if(!Fte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new KF),o||UGe(t)?MGe(t,e,r,i,n,s):OGe(t,e,l,r,i,n,s);if(!(r&HGe)){var h=u&&Tte.call(t,"__wrapped__"),p=g&&Tte.call(e,"__wrapped__");if(h||p){var d=h?t.value():t,m=p?e.value():e;return s||(s=new KF),n(d,m,r,i,s)}}return f?(s||(s=new KF),KGe(t,e,r,i,n,s)):!1}Pte.exports=jGe});var UF=E((Adt,Ote)=>{var YGe=Mte(),Kte=Qo();function Ute(t,e,r,i,n){return t===e?!0:t==null||e==null||!Kte(t)&&!Kte(e)?t!==t&&e!==e:YGe(t,e,r,i,Ute,n)}Ote.exports=Ute});var Gte=E((ldt,Hte)=>{var qGe=Gd(),JGe=UF(),WGe=1,zGe=2;function VGe(t,e,r,i){var n=r.length,s=n,o=!i;if(t==null)return!s;for(t=Object(t);n--;){var a=r[n];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++n{var _Ge=Gs();function XGe(t){return t===t&&!_Ge(t)}jte.exports=XGe});var qte=E((udt,Yte)=>{var ZGe=HF(),$Ge=zg();function eje(t){for(var e=$Ge(t),r=e.length;r--;){var i=e[r],n=t[i];e[r]=[i,n,ZGe(n)]}return e}Yte.exports=eje});var GF=E((gdt,Jte)=>{function tje(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}Jte.exports=tje});var zte=E((fdt,Wte)=>{var rje=Gte(),ije=qte(),nje=GF();function sje(t){var e=ije(t);return e.length==1&&e[0][2]?nje(e[0][0],e[0][1]):function(r){return r===t||rje(r,t,e)}}Wte.exports=sje});var p0=E((hdt,Vte)=>{var oje=xd();function aje(t,e,r){var i=t==null?void 0:oje(t,e);return i===void 0?r:i}Vte.exports=aje});var Xte=E((pdt,_te)=>{var Aje=UF(),lje=p0(),cje=iF(),uje=WB(),gje=HF(),fje=GF(),hje=Sc(),pje=1,dje=2;function Cje(t,e){return uje(t)&&gje(e)?fje(hje(t),e):function(r){var i=lje(r,t);return i===void 0&&i===e?cje(r,t):Aje(e,i,pje|dje)}}_te.exports=Cje});var $te=E((ddt,Zte)=>{function mje(t){return function(e){return e==null?void 0:e[t]}}Zte.exports=mje});var tre=E((Cdt,ere)=>{var Eje=xd();function Ije(t){return function(e){return Eje(e,t)}}ere.exports=Ije});var ire=E((mdt,rre)=>{var yje=$te(),wje=tre(),Bje=WB(),Qje=Sc();function bje(t){return Bje(t)?yje(Qje(t)):wje(t)}rre.exports=bje});var jF=E((Edt,nre)=>{var vje=zte(),Sje=Xte(),xje=e0(),kje=As(),Pje=ire();function Dje(t){return typeof t=="function"?t:t==null?xje:typeof t=="object"?kje(t)?Sje(t[0],t[1]):vje(t):Pje(t)}nre.exports=Dje});var YF=E((Idt,sre)=>{var Rje=jg(),Fje=SF(),Nje=jF();function Lje(t,e){var r={};return e=Nje(e,3),Fje(t,function(i,n,s){Rje(r,n,e(i,n,s))}),r}sre.exports=Lje});var Yd=E((ydt,ore)=>{"use strict";function Pc(t){this._maxSize=t,this.clear()}Pc.prototype.clear=function(){this._size=0,this._values=Object.create(null)};Pc.prototype.get=function(t){return this._values[t]};Pc.prototype.set=function(t,e){return this._size>=this._maxSize&&this.clear(),t in this._values||this._size++,this._values[t]=e};var Tje=/[^.^\]^[]+|(?=\[\]|\.\.)/g,are=/^\d+$/,Mje=/^\d/,Oje=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,Kje=/^\s*(['"]?)(.*?)(\1)\s*$/,qF=512,Are=new Pc(qF),lre=new Pc(qF),cre=new Pc(qF);ore.exports={Cache:Pc,split:WF,normalizePath:JF,setter:function(t){var e=JF(t);return lre.get(t)||lre.set(t,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(qd,"__esModule",{value:!0});qd.create=Yje;qd.default=void 0;var qje=Yd(),d0={context:"$",value:"."};function Yje(t,e){return new C0(t,e)}var C0=class{constructor(e,r={}){if(typeof e!="string")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]===d0.context,this.isValue=this.key[0]===d0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?d0.context:this.isValue?d0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,qje.getter)(this.path,!0),this.map=r.map}getValue(e,r,i){let n=this.isContext?i:this.isValue?e:r;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,r){return this.getValue(e,r==null?void 0:r.parent,r==null?void 0:r.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};qd.default=C0;C0.prototype.__isYupRef=!0});var ure=E(VF=>{"use strict";Object.defineProperty(VF,"__esModule",{value:!0});VF.default=Jje;var Wje=_F(YF()),m0=_F(xc()),zje=_F(Dc());function _F(t){return t&&t.__esModule?t:{default:t}}function E0(){return E0=Object.assign||function(t){for(var e=1;e=0)&&(r[n]=t[n]);return r}function Jje(t){function e(r,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=r,u=Vje(r,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=t,{parent:d,context:m}=a;function I(L){return zje.default.isRef(L)?L.getValue(n,d,m):L}function B(L={}){let K=(0,Wje.default)(E0({value:n,originalValue:l,label:o,path:L.path||s},h,L.params),I),J=new m0.default(m0.default.formatError(L.message||p,K),n,K.path,L.type||g);return J.params=K,J}let b=E0({path:s,parent:d,type:g,createError:B,resolve:I,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(b,n,b)).then(L=>{m0.default.isError(L)?i(L):L?i(null,L):i(B())})}catch(L){i(L)}return}let R;try{var H;if(R=f.call(b,n,b),typeof((H=R)==null?void 0:H.then)=="function")throw new Error(`Validation test of type: "${b.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(L){i(L);return}m0.default.isError(R)?i(R):R?i(null,R):i(B())}return e.OPTIONS=t,e}});var XF=E(Jd=>{"use strict";Object.defineProperty(Jd,"__esModule",{value:!0});Jd.getIn=gre;Jd.default=void 0;var _je=Yd(),Xje=t=>t.substr(0,t.length-1).substr(1);function gre(t,e,r,i=r){let n,s,o;return e?((0,_je.forEach)(e,(a,l,c)=>{let u=l?Xje(a):a;if(t=t.resolve({context:i,parent:n,value:r}),t.innerType){let g=c?parseInt(u,10):0;if(r&&g>=r.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=r,r=r&&r[g],t=t.innerType}if(!c){if(!t.fields||!t.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${t._type}")`);n=r,r=r&&r[u],t=t.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:t,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:t}}var Zje=(t,e,r,i)=>gre(t,e,r,i).schema,$je=Zje;Jd.default=$je});var hre=E(I0=>{"use strict";Object.defineProperty(I0,"__esModule",{value:!0});I0.default=void 0;var fre=eYe(Dc());function eYe(t){return t&&t.__esModule?t:{default:t}}var y0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let r of this.list)e.push(r);for(let[,r]of this.refs)e.push(r.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){fre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){fre.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,r){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(r(i.value)===e)return!0;return!1}clone(){let e=new y0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,r){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),r.list.forEach(n=>i.delete(n)),r.refs.forEach(n=>i.delete(n)),i}};I0.default=y0});var Ma=E(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var pre=Ta(M$()),Xg=La(),tYe=Ta(Z$()),dre=Ta(a0()),B0=Ta(ure()),Cre=Ta(Nd()),rYe=Ta(Dc()),iYe=XF(),nYe=Ta(EF()),mre=Ta(xc()),Ere=Ta(hre());function Ta(t){return t&&t.__esModule?t:{default:t}}function ds(){return ds=Object.assign||function(t){for(var e=1;e{this.typeError(Xg.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=ds({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let r=Object.create(Object.getPrototypeOf(this));return r.type=this.type,r._typeError=this._typeError,r._whitelistError=this._whitelistError,r._blacklistError=this._blacklistError,r._whitelist=this._whitelist.clone(),r._blacklist=this._blacklist.clone(),r.exclusiveTests=ds({},this.exclusiveTests),r.deps=[...this.deps],r.conditions=[...this.conditions],r.tests=[...this.tests],r.transforms=[...this.transforms],r.spec=(0,pre.default)(ds({},this.spec,e)),r}label(e){var r=this.clone();return r.spec.label=e,r}meta(...e){if(e.length===0)return this.spec.meta;let r=this.clone();return r.spec.meta=Object.assign(r.spec.meta||{},e[0]),r}withMutation(e){let r=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=r,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let r=this,i=e.clone(),n=ds({},r.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=r._typeError),i._whitelistError||(i._whitelistError=r._whitelistError),i._blacklistError||(i._blacklistError=r._blacklistError),i._whitelist=r._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=r._blacklist.merge(e._blacklist,e._whitelist),i.tests=r.tests,i.exclusiveTests=r.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let r=this;if(r.conditions.length){let i=r.conditions;r=r.clone(),r.conditions=[],r=i.reduce((n,s)=>s.resolve(n,e),r),r=r.resolve(e)}return r}cast(e,r={}){let i=this.resolve(ds({value:e},r)),n=i._cast(e,r);if(e!==void 0&&r.assert!==!1&&i.isType(n)!==!0){let s=(0,Cre.default)(e),o=(0,Cre.default)(n);throw new TypeError(`The value of ${r.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,r){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,r={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=r,u=e;l||(u=this._cast(u,ds({assert:!1},r)));let g={value:u,path:s,options:r,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,dre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,dre.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,r,i){let n=this.resolve(ds({},r,{value:e}));return typeof i=="function"?n._validate(e,r,i):new Promise((s,o)=>n._validate(e,r,(a,l)=>{a?o(a):s(l)}))}validateSync(e,r){let i=this.resolve(ds({},r,{value:e})),n;return i._validate(e,ds({},r,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,r){return this.validate(e,r).then(()=>!0,i=>{if(mre.default.isError(i))return!1;throw i})}isValidSync(e,r){try{return this.validateSync(e,r),!0}catch(i){if(mre.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,pre.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var r=this.clone();return r.spec.strict=e,r}_isPresent(e){return e!=null}defined(e=Xg.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(r){return r!==void 0}})}required(e=Xg.mixed.required){return this.clone({presence:"required"}).withMutation(r=>r.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(r=>r.OPTIONS.name!=="required"),e}nullable(e=!0){var r=this.clone({nullable:e!==!1});return r}transform(e){var r=this.clone();return r.transforms.push(e),r}test(...e){let r;if(e.length===1?typeof e[0]=="function"?r={test:e[0]}:r=e[0]:e.length===2?r={name:e[0],test:e[1]}:r={name:e[0],message:e[1],test:e[2]},r.message===void 0&&(r.message=Xg.mixed.default),typeof r.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,B0.default)(r),s=r.exclusive||r.name&&i.exclusiveTests[r.name]===!0;if(r.exclusive&&!r.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return r.name&&(i.exclusiveTests[r.name]=!!r.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===r.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,r){!Array.isArray(e)&&typeof e!="string"&&(r=e,e=".");let i=this.clone(),n=(0,nYe.default)(e).map(s=>new rYe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new tYe.default(n,r)),i}typeError(e){var r=this.clone();return r._typeError=(0,B0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),r}oneOf(e,r=Xg.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,B0.default)({message:r,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,r=Xg.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,B0.default)({message:r,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let r=this.clone();return r.spec.strip=e,r}describe(){let e=this.clone(),{label:r,meta:i}=e.spec;return{meta:i,label:r,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};w0.default=Do;Do.prototype.__isYupSchema__=!0;for(let t of["validate","validateSync"])Do.prototype[`${t}At`]=function(e,r,i={}){let{parent:n,parentPath:s,schema:o}=(0,iYe.getIn)(this,e,r,i.context);return o[t](n&&n[s],ds({},i,{parent:n,path:e}))};for(let t of["equals","is"])Do.prototype[t]=Do.prototype.oneOf;for(let t of["not","nope"])Do.prototype[t]=Do.prototype.notOneOf;Do.prototype.optional=Do.prototype.notRequired});var yre=E(Wd=>{"use strict";Object.defineProperty(Wd,"__esModule",{value:!0});Wd.create=Ire;Wd.default=void 0;var oYe=sYe(Ma());function sYe(t){return t&&t.__esModule?t:{default:t}}var ZF=oYe.default,aYe=ZF;Wd.default=aYe;function Ire(){return new ZF}Ire.prototype=ZF.prototype});var Zg=E(Q0=>{"use strict";Object.defineProperty(Q0,"__esModule",{value:!0});Q0.default=void 0;var AYe=t=>t==null;Q0.default=AYe});var vre=E(zd=>{"use strict";Object.defineProperty(zd,"__esModule",{value:!0});zd.create=wre;zd.default=void 0;var lYe=Bre(Ma()),Qre=La(),bre=Bre(Zg());function Bre(t){return t&&t.__esModule?t:{default:t}}function wre(){return new b0}var b0=class extends lYe.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(r){return(0,bre.default)(r)||r===!0}})}isFalse(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(r){return(0,bre.default)(r)||r===!1}})}};zd.default=b0;wre.prototype=b0.prototype});var kre=E(Vd=>{"use strict";Object.defineProperty(Vd,"__esModule",{value:!0});Vd.create=Sre;Vd.default=void 0;var Ro=La(),Oa=xre(Zg()),cYe=xre(Ma());function xre(t){return t&&t.__esModule?t:{default:t}}var uYe=/^((([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,gYe=/^((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,fYe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,hYe=t=>(0,Oa.default)(t)||t===t.trim(),pYe={}.toString();function Sre(){return new v0}var v0=class extends cYe.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let r=e!=null&&e.toString?e.toString():e;return r===pYe?e:r})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,r=Ro.string.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,Oa.default)(i)||i.length===this.resolve(e)}})}min(e,r=Ro.string.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Oa.default)(i)||i.length>=this.resolve(e)}})}max(e,r=Ro.string.max){return this.test({name:"max",exclusive:!0,message:r,params:{max:e},test(i){return(0,Oa.default)(i)||i.length<=this.resolve(e)}})}matches(e,r){let i=!1,n,s;return r&&(typeof r=="object"?{excludeEmptyString:i=!1,message:n,name:s}=r:n=r),this.test({name:s||"matches",message:n||Ro.string.matches,params:{regex:e},test:o=>(0,Oa.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=Ro.string.email){return this.matches(uYe,{name:"email",message:e,excludeEmptyString:!0})}url(e=Ro.string.url){return this.matches(gYe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=Ro.string.uuid){return this.matches(fYe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=Ro.string.trim){return this.transform(r=>r!=null?r.trim():r).test({message:e,name:"trim",test:hYe})}lowercase(e=Ro.string.lowercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toLowerCase()})}uppercase(e=Ro.string.uppercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toUpperCase()})}};Vd.default=v0;Sre.prototype=v0.prototype});var Rre=E(_d=>{"use strict";Object.defineProperty(_d,"__esModule",{value:!0});_d.create=Pre;_d.default=void 0;var Rc=La(),Fc=Dre(Zg()),dYe=Dre(Ma());function Dre(t){return t&&t.__esModule?t:{default:t}}var CYe=t=>t!=+t;function Pre(){return new S0}var S0=class extends dYe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let r=e;if(typeof r=="string"){if(r=r.replace(/\s/g,""),r==="")return NaN;r=+r}return this.isType(r)?r:parseFloat(r)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!CYe(e)}min(e,r=Rc.number.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Fc.default)(i)||i>=this.resolve(e)}})}max(e,r=Rc.number.max){return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,Fc.default)(i)||i<=this.resolve(e)}})}lessThan(e,r=Rc.number.lessThan){return this.test({message:r,name:"max",exclusive:!0,params:{less:e},test(i){return(0,Fc.default)(i)||ithis.resolve(e)}})}positive(e=Rc.number.positive){return this.moreThan(0,e)}negative(e=Rc.number.negative){return this.lessThan(0,e)}integer(e=Rc.number.integer){return this.test({name:"integer",message:e,test:r=>(0,Fc.default)(r)||Number.isInteger(r)})}truncate(){return this.transform(e=>(0,Fc.default)(e)?e:e|0)}round(e){var r,i=["ceil","floor","round","trunc"];if(e=((r=e)==null?void 0:r.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,Fc.default)(n)?n:Math[e](n))}};_d.default=S0;Pre.prototype=S0.prototype});var Fre=E($F=>{"use strict";Object.defineProperty($F,"__esModule",{value:!0});$F.default=mYe;var EYe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function mYe(t){var e=[1,4,5,6,7,10,11],r=0,i,n;if(n=EYe.exec(t)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(r=n[10]*60+n[11],n[9]==="+"&&(r=0-r)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+r,n[6],n[7]))}else i=Date.parse?Date.parse(t):NaN;return i}});var Tre=E(Xd=>{"use strict";Object.defineProperty(Xd,"__esModule",{value:!0});Xd.create=eN;Xd.default=void 0;var IYe=x0(Fre()),Nre=La(),Lre=x0(Zg()),yYe=x0(Dc()),wYe=x0(Ma());function x0(t){return t&&t.__esModule?t:{default:t}}var tN=new Date(""),BYe=t=>Object.prototype.toString.call(t)==="[object Date]";function eN(){return new Zd}var Zd=class extends wYe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,IYe.default)(e),isNaN(e)?tN:new Date(e))})})}_typeCheck(e){return BYe(e)&&!isNaN(e.getTime())}prepareParam(e,r){let i;if(yYe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${r}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,r=Nre.date.min){let i=this.prepareParam(e,"min");return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(n){return(0,Lre.default)(n)||n>=this.resolve(i)}})}max(e,r=Nre.date.max){var i=this.prepareParam(e,"max");return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(n){return(0,Lre.default)(n)||n<=this.resolve(i)}})}};Xd.default=Zd;Zd.INVALID_DATE=tN;eN.prototype=Zd.prototype;eN.INVALID_DATE=tN});var Ore=E((Ndt,Mre)=>{function QYe(t,e,r,i){var n=-1,s=t==null?0:t.length;for(i&&s&&(r=t[++n]);++n{function bYe(t){return function(e){return t==null?void 0:t[e]}}Kre.exports=bYe});var Gre=E((Tdt,Hre)=>{var vYe=Ure(),SYe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},xYe=vYe(SYe);Hre.exports=xYe});var Yre=E((Mdt,jre)=>{var kYe=Gre(),PYe=gg(),DYe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,RYe="\\u0300-\\u036f",FYe="\\ufe20-\\ufe2f",NYe="\\u20d0-\\u20ff",LYe=RYe+FYe+NYe,TYe="["+LYe+"]",MYe=RegExp(TYe,"g");function OYe(t){return t=PYe(t),t&&t.replace(DYe,kYe).replace(MYe,"")}jre.exports=OYe});var Jre=E((Odt,qre)=>{var KYe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function UYe(t){return t.match(KYe)||[]}qre.exports=UYe});var zre=E((Kdt,Wre)=>{var HYe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function GYe(t){return HYe.test(t)}Wre.exports=GYe});var fie=E((Udt,Vre)=>{var _re="\\ud800-\\udfff",jYe="\\u0300-\\u036f",YYe="\\ufe20-\\ufe2f",qYe="\\u20d0-\\u20ff",JYe=jYe+YYe+qYe,Xre="\\u2700-\\u27bf",Zre="a-z\\xdf-\\xf6\\xf8-\\xff",WYe="\\xac\\xb1\\xd7\\xf7",zYe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",VYe="\\u2000-\\u206f",_Ye=" \\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",$re="A-Z\\xc0-\\xd6\\xd8-\\xde",XYe="\\ufe0e\\ufe0f",eie=WYe+zYe+VYe+_Ye,tie="['\u2019]",rie="["+eie+"]",ZYe="["+JYe+"]",iie="\\d+",$Ye="["+Xre+"]",nie="["+Zre+"]",sie="[^"+_re+eie+iie+Xre+Zre+$re+"]",eqe="\\ud83c[\\udffb-\\udfff]",tqe="(?:"+ZYe+"|"+eqe+")",rqe="[^"+_re+"]",oie="(?:\\ud83c[\\udde6-\\uddff]){2}",aie="[\\ud800-\\udbff][\\udc00-\\udfff]",$g="["+$re+"]",iqe="\\u200d",Aie="(?:"+nie+"|"+sie+")",nqe="(?:"+$g+"|"+sie+")",lie="(?:"+tie+"(?:d|ll|m|re|s|t|ve))?",cie="(?:"+tie+"(?:D|LL|M|RE|S|T|VE))?",uie=tqe+"?",gie="["+XYe+"]?",sqe="(?:"+iqe+"(?:"+[rqe,oie,aie].join("|")+")"+gie+uie+")*",oqe="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",aqe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Aqe=gie+uie+sqe,lqe="(?:"+[$Ye,oie,aie].join("|")+")"+Aqe,cqe=RegExp([$g+"?"+nie+"+"+lie+"(?="+[rie,$g,"$"].join("|")+")",nqe+"+"+cie+"(?="+[rie,$g+Aie,"$"].join("|")+")",$g+"?"+Aie+"+"+lie,$g+"+"+cie,aqe,oqe,iie,lqe].join("|"),"g");function uqe(t){return t.match(cqe)||[]}Vre.exports=uqe});var pie=E((Hdt,hie)=>{var gqe=Jre(),fqe=zre(),hqe=gg(),pqe=fie();function dqe(t,e,r){return t=hqe(t),e=r?void 0:e,e===void 0?fqe(t)?pqe(t):gqe(t):t.match(e)||[]}hie.exports=dqe});var rN=E((Gdt,die)=>{var Cqe=Ore(),mqe=Yre(),Eqe=pie(),Iqe="['\u2019]",yqe=RegExp(Iqe,"g");function wqe(t){return function(e){return Cqe(Eqe(mqe(e).replace(yqe,"")),t,"")}}die.exports=wqe});var mie=E((jdt,Cie)=>{var Bqe=rN(),Qqe=Bqe(function(t,e,r){return t+(r?"_":"")+e.toLowerCase()});Cie.exports=Qqe});var Iie=E((Ydt,Eie)=>{var bqe=ZP(),vqe=rN(),Sqe=vqe(function(t,e,r){return e=e.toLowerCase(),t+(r?bqe(e):e)});Eie.exports=Sqe});var wie=E((qdt,yie)=>{var xqe=jg(),kqe=SF(),Pqe=jF();function Dqe(t,e){var r={};return e=Pqe(e,3),kqe(t,function(i,n,s){xqe(r,e(i,n,s),i)}),r}yie.exports=Dqe});var Qie=E((Jdt,iN)=>{iN.exports=function(t){return Bie(Rqe(t),t)};iN.exports.array=Bie;function Bie(t,e){var r=t.length,i=new Array(r),n={},s=r,o=Fqe(e),a=Nqe(t);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(t[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(d){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--r]=c}}}function Rqe(t){for(var e=new Set,r=0,i=t.length;r{"use strict";Object.defineProperty(nN,"__esModule",{value:!0});nN.default=Lqe;var Tqe=k0(Ld()),Mqe=k0(Qie()),Oqe=Yd(),Kqe=k0(Dc()),Uqe=k0(qg());function k0(t){return t&&t.__esModule?t:{default:t}}function Lqe(t,e=[]){let r=[],i=[];function n(s,o){var a=(0,Oqe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||r.push([o,a])}for(let s in t)if((0,Tqe.default)(t,s)){let o=t[s];~i.indexOf(s)||i.push(s),Kqe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,Uqe.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Mqe.default.array(i,r).reverse()}});var Sie=E(sN=>{"use strict";Object.defineProperty(sN,"__esModule",{value:!0});sN.default=Hqe;function vie(t,e){let r=Infinity;return t.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return r=n,!0}),r}function Hqe(t){return(e,r)=>vie(t,e)-vie(t,r)}});var Nie=E($d=>{"use strict";Object.defineProperty($d,"__esModule",{value:!0});$d.create=xie;$d.default=void 0;var kie=Fo(Ld()),Pie=Fo(mie()),Gqe=Fo(Iie()),jqe=Fo(wie()),Yqe=Fo(YF()),qqe=Yd(),Die=La(),Jqe=Fo(bie()),Rie=Fo(Sie()),Wqe=Fo(a0()),zqe=Fo(xc()),oN=Fo(Ma());function Fo(t){return t&&t.__esModule?t:{default:t}}function ef(){return ef=Object.assign||function(t){for(var e=1;eObject.prototype.toString.call(t)==="[object Object]";function Vqe(t,e){let r=Object.keys(t.fields);return Object.keys(e).filter(i=>r.indexOf(i)===-1)}var _qe=(0,Rie.default)([]),P0=class extends oN.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=_qe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return Fie(e)||typeof e=="function"}_cast(e,r={}){var i;let n=super._cast(e,r);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=r.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=ef({},r,{parent:l,__validating:r.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,kie.default)(n,g);if(f){let p,d=n[g];c.path=(r.path?`${r.path}.`:"")+g,f=f.resolve({value:d,context:r.context,parent:l});let m="spec"in f?f.spec:void 0,I=m==null?void 0:m.strict;if(m==null?void 0:m.strip){u=u||g in n;continue}p=!r.__validating||!I?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,r={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=r;o=[{schema:this,value:a},...o],r.__validating=!0,r.originalValue=a,r.from=o,super._validate(e,r,(u,g)=>{if(u){if(!zqe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Fie(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,d)=>{let m=h.indexOf(".")===-1?(r.path?`${r.path}.`:"")+h:`${r.path||""}["${h}"]`,I=this.fields[h];if(I&&"validate"in I){I.validate(g[h],ef({},r,{path:m,from:o,strict:!0,parent:g,originalValue:a[h]}),d);return}d(null)});(0,Wqe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:r.path},i)})}clone(e){let r=super.clone(e);return r.fields=ef({},this.fields),r._nodes=this._nodes,r._excludedEdges=this._excludedEdges,r._sortErrors=this._sortErrors,r}concat(e){let r=super.concat(e),i=r.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof oN.default&&s instanceof oN.default&&(i[n]=s.concat(o))}return r.withMutation(()=>r.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(r=>{let i=this.fields[r];e[r]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,r=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,Rie.default)(Object.keys(n)),r.length){Array.isArray(r[0])||(r=[r]);let s=r.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Jqe.default)(n,i._excludedEdges),i}pick(e){let r={};for(let i of e)this.fields[i]&&(r[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(r)))}omit(e){let r=this.clone(),i=r.fields;r.fields={};for(let n of e)delete i[n];return r.withMutation(()=>r.shape(i))}from(e,r,i){let n=(0,qqe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,kie.default)(s,e)&&(o=ef({},s),i||delete o[e],o[r]=n(s)),o})}noUnknown(e=!0,r=Die.object.noUnknown){typeof e=="string"&&(r=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:r,test(n){if(n==null)return!0;let s=Vqe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,r=Die.object.noUnknown){return this.noUnknown(!e,r)}transformKeys(e){return this.transform(r=>r&&(0,jqe.default)(r,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Gqe.default)}snakeCase(){return this.transformKeys(Pie.default)}constantCase(){return this.transformKeys(e=>(0,Pie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Yqe.default)(this.fields,r=>r.describe()),e}};$d.default=P0;function xie(t){return new P0(t)}xie.prototype=P0.prototype});var Tie=E(eC=>{"use strict";Object.defineProperty(eC,"__esModule",{value:!0});eC.create=Lie;eC.default=void 0;var aN=tf(Zg()),Xqe=tf(qg()),Zqe=tf(Nd()),AN=La(),$qe=tf(a0()),eJe=tf(xc()),tJe=tf(Ma());function tf(t){return t&&t.__esModule?t:{default:t}}function D0(){return D0=Object.assign||function(t){for(var e=1;e{this.transform(function(r){if(typeof r=="string")try{r=JSON.parse(r)}catch(i){r=null}return this.isType(r)?r:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,r){let i=super._cast(e,r);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,D0({},r,{path:`${r.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,r={},i){var n,s;let o=[],a=r.sync,l=r.path,c=this.innerType,u=(n=r.abortEarly)!=null?n:this.spec.abortEarly,g=(s=r.recursive)!=null?s:this.spec.recursive,f=r.originalValue!=null?r.originalValue:e;super._validate(e,r,(h,p)=>{if(h){if(!eJe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let d=new Array(p.length);for(let m=0;mc.validate(I,b,H)}(0,$qe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:d},i)})}clone(e){let r=super.clone(e);return r.innerType=this.innerType,r}concat(e){let r=super.concat(e);return r.innerType=this.innerType,e.innerType&&(r.innerType=r.innerType?r.innerType.concat(e.innerType):e.innerType),r}of(e){let r=this.clone();if(!(0,Xqe.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Zqe.default)(e));return r.innerType=e,r}length(e,r=AN.array.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,aN.default)(i)||i.length===this.resolve(e)}})}min(e,r){return r=r||AN.array.min,this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,aN.default)(i)||i.length>=this.resolve(e)}})}max(e,r){return r=r||AN.array.max,this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,aN.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,r)=>this._typeCheck(e)?e:r==null?[]:[].concat(r))}compact(e){let r=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(r):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};eC.default=R0;Lie.prototype=R0.prototype});var Mie=E(tC=>{"use strict";Object.defineProperty(tC,"__esModule",{value:!0});tC.create=rJe;tC.default=void 0;var nJe=iJe(qg());function iJe(t){return t&&t.__esModule?t:{default:t}}function rJe(t){return new lN(t)}var lN=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(r,i={})=>{let n=this.builder(r,i);if(!(0,nJe.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,r){return this._resolve(e,r).cast(e,r)}validate(e,r,i){return this._resolve(e,r).validate(e,r,i)}validateSync(e,r){return this._resolve(e,r).validateSync(e,r)}validateAt(e,r,i){return this._resolve(r,i).validateAt(e,r,i)}validateSyncAt(e,r,i){return this._resolve(r,i).validateSyncAt(e,r,i)}describe(){return null}isValid(e,r){return this._resolve(e,r).isValid(e,r)}isValidSync(e,r){return this._resolve(e,r).isValidSync(e,r)}},sJe=lN;tC.default=sJe});var Oie=E(cN=>{"use strict";Object.defineProperty(cN,"__esModule",{value:!0});cN.default=oJe;var AJe=aJe(La());function aJe(t){return t&&t.__esModule?t:{default:t}}function oJe(t){Object.keys(t).forEach(e=>{Object.keys(t[e]).forEach(r=>{AJe.default[e][r]=t[e][r]})})}});var gN=E(cr=>{"use strict";Object.defineProperty(cr,"__esModule",{value:!0});cr.addMethod=lJe;Object.defineProperty(cr,"MixedSchema",{enumerable:!0,get:function(){return Kie.default}});Object.defineProperty(cr,"mixed",{enumerable:!0,get:function(){return Kie.create}});Object.defineProperty(cr,"BooleanSchema",{enumerable:!0,get:function(){return uN.default}});Object.defineProperty(cr,"bool",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"boolean",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"StringSchema",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(cr,"string",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(cr,"NumberSchema",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(cr,"number",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(cr,"DateSchema",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(cr,"date",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(cr,"ObjectSchema",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(cr,"object",{enumerable:!0,get:function(){return jie.create}});Object.defineProperty(cr,"ArraySchema",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(cr,"array",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(cr,"ref",{enumerable:!0,get:function(){return cJe.create}});Object.defineProperty(cr,"lazy",{enumerable:!0,get:function(){return uJe.create}});Object.defineProperty(cr,"ValidationError",{enumerable:!0,get:function(){return gJe.default}});Object.defineProperty(cr,"reach",{enumerable:!0,get:function(){return fJe.default}});Object.defineProperty(cr,"isSchema",{enumerable:!0,get:function(){return qie.default}});Object.defineProperty(cr,"setLocale",{enumerable:!0,get:function(){return hJe.default}});Object.defineProperty(cr,"BaseSchema",{enumerable:!0,get:function(){return pJe.default}});var Kie=Nc(yre()),uN=Nc(vre()),Uie=Nc(kre()),Hie=Nc(Rre()),Gie=Nc(Tre()),jie=Nc(Nie()),Yie=Nc(Tie()),cJe=Dc(),uJe=Mie(),gJe=rC(xc()),fJe=rC(XF()),qie=rC(qg()),hJe=rC(Oie()),pJe=rC(Ma());function rC(t){return t&&t.__esModule?t:{default:t}}function Jie(){if(typeof WeakMap!="function")return null;var t=new WeakMap;return Jie=function(){return t},t}function Nc(t){if(t&&t.__esModule)return t;if(t===null||typeof t!="object"&&typeof t!="function")return{default:t};var e=Jie();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var s=i?Object.getOwnPropertyDescriptor(t,n):null;s&&(s.get||s.set)?Object.defineProperty(r,n,s):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function lJe(t,e,r){if(!t||!(0,qie.default)(t.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof r!="function")throw new TypeError("Method function must be provided");t.prototype[e]=r}});var Xie=E((gCt,nC)=>{"use strict";var mJe=process.env.TERM_PROGRAM==="Hyper",EJe=process.platform==="win32",zie=process.platform==="linux",fN={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Vie=Object.assign({},fN,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),_ie=Object.assign({},fN,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:zie?"\u25B8":"\u276F",pointerSmall:zie?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});nC.exports=EJe&&!mJe?Vie:_ie;Reflect.defineProperty(nC.exports,"common",{enumerable:!1,value:fN});Reflect.defineProperty(nC.exports,"windows",{enumerable:!1,value:Vie});Reflect.defineProperty(nC.exports,"other",{enumerable:!1,value:_ie})});var js=E((fCt,hN)=>{"use strict";var IJe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),yJe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Zie=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},r=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(t.enabled===!1)return s;if(t.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=r(t.styles[o[c]],a,l);return a},n=(s,o,a)=>{t.styles[s]=e({name:s,codes:o}),(t.keys[a]||(t.keys[a]=[])).push(s),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(c){t.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,t),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=yJe,t.hasColor=t.hasAnsi=s=>(t.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&t.ansiRegex.test(s)),t.alias=(s,o)=>{let a=typeof o=="string"?t[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),t.styles[s]=a,a.stack=[s]),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(l){t.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,t),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},t.theme=s=>{if(!IJe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))t.alias(o,s[o]);return t},t.alias("unstyle",s=>typeof s=="string"&&s!==""?(t.ansiRegex.lastIndex=0,s.replace(t.ansiRegex,"")):""),t.alias("noop",s=>s),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Xie(),t.define=n,t};hN.exports=Zie();hN.exports.create=Zie});var Mi=E(bt=>{"use strict";var wJe=Object.prototype.toString,Cs=js(),$ie=!1,pN=[],ene={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};bt.longest=(t,e)=>t.reduce((r,i)=>Math.max(r,e?i[e].length:i.length),0);bt.hasColor=t=>!!t&&Cs.hasColor(t);var N0=bt.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);bt.nativeType=t=>wJe.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");bt.isAsyncFn=t=>bt.nativeType(t)==="asyncfunction";bt.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";bt.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;bt.scrollDown=(t=[])=>[...t.slice(1),t[0]];bt.scrollUp=(t=[])=>[t.pop(),...t];bt.reorder=(t=[])=>{let e=t.slice();return e.sort((r,i)=>r.index>i.index?1:r.index{let i=t.length,n=r===i?0:r<0?i-1:r,s=t[e];t[e]=t[n],t[n]=s};bt.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};bt.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};bt.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:i=` -`+r,width:n=80}=e;n-=((i+r).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=t.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),r+c.join(i)};bt.unmute=t=>{let e=t.stack.find(i=>Cs.keys.color.includes(i));return e?Cs[e]:t.stack.find(i=>i.slice(2)==="bg")?Cs[e.slice(2)]:i=>i};bt.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";bt.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i));if(e){let i=Cs["bg"+bt.pascal(e)];return i?i.black:t}let r=t.stack.find(i=>i.slice(0,2)==="bg");return r?Cs[r.slice(2).toLowerCase()]||t:Cs.none};bt.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i)),r=t.stack.find(i=>i.slice(0,2)==="bg");if(e&&!r)return Cs[ene[e]||e];if(r){let i=r.slice(2).toLowerCase(),n=ene[i];return n&&Cs["bg"+bt.pascal(n)]||t}return Cs.none};bt.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=r<10?"0"+r:r;return n+":"+s+" "+i};bt.set=(t={},e="",r)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:r;return!bt.isObject(a)&&s{let i=t[e]==null?e.split(".").reduce((n,s)=>n&&n[s],t):t[e];return i==null?r:i};bt.mixin=(t,e)=>{if(!N0(t))return e;if(!N0(e))return t;for(let r of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,r);if(i.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&N0(i.value)){let n=Object.getOwnPropertyDescriptor(t,r);N0(n.value)?t[r]=bt.merge({},t[r],e[r]):Reflect.defineProperty(t,r,i)}else Reflect.defineProperty(t,r,i);else Reflect.defineProperty(t,r,i)}return t};bt.merge=(...t)=>{let e={};for(let r of t)bt.mixin(e,r);return e};bt.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let i of Object.keys(r)){let n=r[i];typeof n=="function"?bt.define(t,i,n.bind(e)):bt.define(t,i,n)}};bt.onExit=t=>{let e=(r,i)=>{$ie||($ie=!0,pN.forEach(n=>n()),r===!0&&process.exit(128+i))};pN.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),pN.push(t)};bt.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};bt.defineExport=(t,e,r)=>{let i;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():r()}})}});var tne=E(nf=>{"use strict";nf.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"};nf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};nf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};nf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};nf.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"}});var nne=E((dCt,rne)=>{"use strict";var ine=require("readline"),BJe=tne(),QJe=/^(?:\x1b)([a-zA-Z0-9])$/,bJe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,vJe={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"};function SJe(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function xJe(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var L0=(t="",e={})=>{let r,i=P({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t},e);if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=""+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=i.sequence||""),i.sequence=i.sequence||t||i.name,t==="\r")i.raw=void 0,i.name="return";else if(t===` -`)i.name="enter";else if(t===" ")i.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x7F"||t==="\b")i.name="backspace",i.meta=t.charAt(0)==="";else if(t===""||t==="")i.name="escape",i.meta=t.length===2;else if(t===" "||t===" ")i.name="space",i.meta=t.length===2;else if(t<="")i.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")i.name="number";else if(t.length===1&&t>="a"&&t<="z")i.name=t;else if(t.length===1&&t>="A"&&t<="Z")i.name=t.toLowerCase(),i.shift=!0;else if(r=QJe.exec(t))i.meta=!0,i.shift=/^[A-Z]$/.test(r[1]);else if(r=bJe.exec(t)){let n=[...t];n[0]===""&&n[1]===""&&(i.option=!0);let s=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=vJe[s],i.shift=SJe(s)||i.shift,i.ctrl=xJe(s)||i.ctrl}return i};L0.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let i=ine.createInterface({terminal:!0,input:r});ine.emitKeypressEvents(r,i);let n=(a,l)=>e(a,L0(a,l),i),s=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",n),i.resume(),()=>{r.isTTY&&r.setRawMode(s),r.removeListener("keypress",n),i.pause(),i.close()}};L0.action=(t,e,r)=>{let i=P(P({},BJe),r);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};rne.exports=L0});var one=E((CCt,sne)=>{"use strict";sne.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let i=e[r];typeof i=="number"&&(i={interval:i}),kJe(t,r,i)}};function kJe(t,e,r={}){let i=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=r.interval||120;i.frames=r.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,t.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),t.once("close",()=>i.stop()),i.stop}});var lne=E((mCt,ane)=>{"use strict";var{define:PJe,width:DJe}=Mi(),Ane=class{constructor(e){let r=e.options;PJe(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=DJe(r.stdout||process.stdout),Object.assign(this,r),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=P({},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 r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};ane.exports=Ane});var une=E((ECt,cne)=>{"use strict";var dN=Mi(),yi=js(),CN={default:yi.noop,noop:yi.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||dN.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||dN.complement(this.primary)},primary:yi.cyan,success:yi.green,danger:yi.magenta,strong:yi.bold,warning:yi.yellow,muted:yi.dim,disabled:yi.gray,dark:yi.dim.gray,underline:yi.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};CN.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(yi.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(yi.visible=t.styles.visible);let e=dN.merge({},CN,t.styles);delete e.merge;for(let r of Object.keys(yi))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});for(let r of Object.keys(yi.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});return e};cne.exports=CN});var fne=E((ICt,gne)=>{"use strict";var mN=process.platform==="win32",Ka=js(),RJe=Mi(),EN=_(P({},Ka.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Ka.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Ka.symbols.question,submitted:Ka.symbols.check,cancelled:Ka.symbols.cross},separator:{pending:Ka.symbols.pointerSmall,submitted:Ka.symbols.middot,cancelled:Ka.symbols.middot},radio:{off:mN?"( )":"\u25EF",on:mN?"(*)":"\u25C9",disabled:mN?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});EN.merge=t=>{let e=RJe.merge({},Ka.symbols,EN,t.symbols);return delete e.merge,e};gne.exports=EN});var pne=E((yCt,hne)=>{"use strict";var FJe=une(),NJe=fne(),LJe=Mi();hne.exports=t=>{t.options=LJe.merge({},t.options.theme,t.options),t.symbols=NJe.merge(t.options),t.styles=FJe.merge(t.options)}});var Ine=E((dne,Cne)=>{"use strict";var mne=process.env.TERM_PROGRAM==="Apple_Terminal",TJe=js(),IN=Mi(),Ys=Cne.exports=dne,Ir="[",Ene="\x07",yN=!1,HA=Ys.code={bell:Ene,beep:Ene,beginning:`${Ir}G`,down:`${Ir}J`,esc:Ir,getPosition:`${Ir}6n`,hide:`${Ir}?25l`,line:`${Ir}2K`,lineEnd:`${Ir}K`,lineStart:`${Ir}1K`,restorePosition:Ir+(mne?"8":"u"),savePosition:Ir+(mne?"7":"s"),screen:`${Ir}2J`,show:`${Ir}?25h`,up:`${Ir}1J`},Lc=Ys.cursor={get hidden(){return yN},hide(){return yN=!0,HA.hide},show(){return yN=!1,HA.show},forward:(t=1)=>`${Ir}${t}C`,backward:(t=1)=>`${Ir}${t}D`,nextLine:(t=1)=>`${Ir}E`.repeat(t),prevLine:(t=1)=>`${Ir}F`.repeat(t),up:(t=1)=>t?`${Ir}${t}A`:"",down:(t=1)=>t?`${Ir}${t}B`:"",right:(t=1)=>t?`${Ir}${t}C`:"",left:(t=1)=>t?`${Ir}${t}D`:"",to(t,e){return e?`${Ir}${e+1};${t+1}H`:`${Ir}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Lc.left(-t):t>0?Lc.right(t):"",r+=e<0?Lc.up(-e):e>0?Lc.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:i,input:n,prompt:s,size:o,value:a}=t;if(i=IN.isPrimitive(i)?String(i):"",n=IN.isPrimitive(n)?String(n):"",a=IN.isPrimitive(a)?String(a):"",o){let l=Ys.cursor.up(o)+Ys.cursor.to(s.length),c=n.length-r;return c>0&&(l+=Ys.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+r;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Ys.cursor.move(l)}}},wN=Ys.erase={screen:HA.screen,up:HA.up,down:HA.down,line:HA.line,lineEnd:HA.lineEnd,lineStart:HA.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return wN.line+Lc.to(0);let r=s=>[...TJe.unstyle(s)].length,i=t.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(r(s)-1,0)/e);return(wN.line+Lc.prevLine()).repeat(n-1)+wN.line+Lc.to(0)}});var sf=E((wCt,yne)=>{"use strict";var MJe=require("events"),wne=js(),BN=nne(),OJe=one(),KJe=lne(),UJe=pne(),bn=Mi(),Tc=Ine(),T0=class extends MJe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,UJe(this),OJe(this),this.state=new KJe(this),this.initial=[e.initial,e.default].find(r=>r!=null),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=GJe(this.options.margin),this.setMaxListeners(0),HJe(this)}async keypress(e,r={}){this.keypressed=!0;let i=BN.action(e,BN(e,r),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Tc.code.beep)}cursorHide(){this.stdout.write(Tc.cursor.hide()),bn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Tc.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Tc.cursor.down(e)+Tc.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:r,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=Tc.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:r,prompt:i}=this.state;i=wne.unstyle(i);let n=wne.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],f=(i+(r?" "+r:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let n=r.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=r&&r[e]!=null?r[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,r,i);return!g&&r&&r[e]?this.resolve(c,s,r,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,i=this.state;return i.timer=r,bn.isObject(e)&&(e=e[i.status]||e.pending),bn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return bn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,i=this.state;i.timer=r;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return bn.isObject(s)&&(s=s[i.status]||s.pending),bn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,r){let i=await this.element("pointer",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===r,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=bn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,r){let i=await this.element("indicator",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return bn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return bn.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 this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return bn.resolve(this,e,...r)}get base(){return T0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||bn.height(this.stdout,25)}get width(){return this.options.columns||bn.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:r}=this.state,i=[r,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function HJe(t){let e=n=>t[n]===void 0||typeof t[n]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(t.options)){if(r.includes(n)||/^on[A-Z]/.test(n))continue;let s=t.options[n];typeof s=="function"&&e(n)?i.includes(n)||(t[n]=s.bind(t)):typeof t[n]!="function"&&(t[n]=s)}}function GJe(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=r(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}yne.exports=T0});var bne=E((BCt,Bne)=>{"use strict";var jJe=Mi(),Qne={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return Qne.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};Bne.exports=(t,e={})=>{let r=jJe.merge({},Qne,e.roles);return r[t]||r.default}});var sC=E((QCt,vne)=>{"use strict";var YJe=js(),qJe=sf(),JJe=bne(),M0=Mi(),{reorder:QN,scrollUp:WJe,scrollDown:zJe,isObject:Sne,swap:VJe}=M0,xne=class extends qJe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");Sne(r)&&(r=Object.keys(r)),Array.isArray(r)?(i!=null&&(this.index=this.findIndex(i)),r.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(r=i),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,r,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=JJe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)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=r,e.cursor=0,M0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.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,YJe.unstyle(e.message).length));let o=P({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,i){let n=await this.toChoice(e,r,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,r,i){let n=P({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,r,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.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(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(n=>this.toggle(n,r));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return kne(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 r=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=QN(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=r(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=QN(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=QN(this.choices);return this.choices=r.slice(e).concat(r.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,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>r&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===r-1?this.alert():e>r&&i===r-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=WJe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=zJe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return 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){VJe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&r.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,r),i),{})}filter(e,r){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return r?o.map(a=>a[r]):o}find(e,r){if(Sne(e))return r?e[r]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return r?s[r]:s}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(o=>o.newChoice))return this.alert();let{reorder:r,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&r!==!1&&i!==!0&&(s=M0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(i=>i.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let i=this.find(r);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return kne(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:r,choices:i}=this,n=e.limit||this._limit||r.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&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&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function kne(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(M0.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let i=r.choices.filter(n=>!t.isDisabled(n));r.enabled=i.every(n=>n.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}vne.exports=xne});var GA=E((bCt,Pne)=>{"use strict";var _Je=sC(),bN=Mi(),Dne=class extends _Je{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);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,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let i=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!bN.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await this.indicator(e,r)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,r);o&&!bN.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,r),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?(bN.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let i=this.margin[0]+r.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}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:r}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(r),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};Pne.exports=Dne});var Nne=E((vCt,Rne)=>{"use strict";var XJe=GA(),ZJe=(t,e)=>{let r=t.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(r),o=e(i.slice(s,s+r.length));return s>=0?i.slice(0,s)+o+i.slice(s+r.length):i}},Fne=class extends XJe{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:r,input:i}=this.state;return this.input=i.slice(0,r)+e+i.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.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,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let i=e.toLowerCase();return r.filter(n=>n.message.toLowerCase().includes(i))}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(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=ZJe(this.input,e),i=this.choices;this.choices=i.map(n=>_(P({},n),{message:r(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};Rne.exports=Fne});var SN=E((SCt,Lne)=>{"use strict";var vN=Mi();Lne.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||t.styles.placeholder,l=vN.inverse(t.styles.primary),c=d=>l(t.styles.black(d)),u=r,g=" ",f=c(g);if(t.blink&&t.blink.off===!0&&(c=d=>d,f=""),s&&n===0&&i===""&&r==="")return c(g);if(s&&n===0&&(r===i||r===""))return c(i[0])+a(i.slice(1));i=vN.isPrimitive(i)?`${i}`:"",r=vN.isPrimitive(r)?`${r}`:"";let h=i&&i.startsWith(r)&&i!==r,p=h?c(i[r.length]):f;if(n!==r.length&&s===!0&&(u=r.slice(0,n)+c(r[n])+r.slice(n+1),p=""),s===!1&&(p=""),h){let d=t.styles.unstyle(u+p);return u+p+a(i.slice(d.length))}return u+p}});var O0=E((xCt,Tne)=>{"use strict";var $Je=js(),e3e=GA(),t3e=SN(),Mne=class extends e3e{constructor(e){super(_(P({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:i,input:n}=r;return r.value=r.input=n.slice(0,i)+e+n.slice(i),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:i}=e;return e.value=e.input=i.slice(0,r-1)+i.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:i}=e;if(i[r]===void 0)return this.alert();let n=`${i}`.slice(0,r)+`${i}`.slice(r+1);return e.value=e.input=n,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,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:i}=e;return r&&r.startsWith(i)&&i!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?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?"\u29BF":"\u2299"}async choiceSeparator(e,r){let i=await this.resolve(e.separator,this.state,e,r)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,d=this.index===r,m=e.validate||(()=>!0),I=await this.choiceSeparator(e,r),B=e.message;this.align==="right"&&(B=B.padStart(this.longest+1," ")),this.align==="left"&&(B=B.padEnd(this.longest+1," "));let b=this.values[a]=c||o,R=c?"success":"dark";await m.call(e,b,this.state)!==!0&&(R="danger");let L=n[R](await this.indicator(e,r))+(e.pad||""),K=this.indent(e),J=()=>[K,L,B+I,c,p].filter(Boolean).join(" ");if(i.submitted)return B=$Je.unstyle(B),c=g(c),p="",J();if(e.format)c=await e.format.call(this,c,e,r);else{let ne=this.styles.muted;c=t3e(this,{input:c,initial:o,pos:s,showCursor:d,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,b,e,r)),d&&(B=f(B)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),J()}async submit(){return this.value=this.values,super.base.submit.call(this)}};Tne.exports=Mne});var xN=E((kCt,One)=>{"use strict";var r3e=O0(),i3e=()=>{throw new Error("expected prompt to have a custom authenticate method")},Kne=(t=i3e)=>{class e extends r3e{constructor(i){super(i)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Kne(i)}}return e};One.exports=Kne()});var Gne=E((PCt,Une)=>{"use strict";var n3e=xN();function s3e(t,e){return t.username===this.options.username&&t.password===this.options.password}var Hne=(t=s3e)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class r extends n3e.create(t){constructor(n){super(_(P({},n),{choices:e}))}static create(n){return Hne(n)}}return r};Une.exports=Hne()});var K0=E((DCt,jne)=>{"use strict";var o3e=sf(),{isPrimitive:a3e,hasColor:A3e}=Mi(),Yne=class extends o3e{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:r,state:i}=this;return i.submitted?r.success(e):r.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 a3e(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return A3e(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(r),this.write([l,a,f].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};jne.exports=Yne});var Wne=E((RCt,qne)=>{"use strict";var l3e=K0(),Jne=class extends l3e{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};qne.exports=Jne});var _ne=E((FCt,zne)=>{"use strict";var c3e=GA(),u3e=O0(),of=u3e.prototype,Vne=class extends c3e{constructor(e){super(_(P({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():of.dispatch.call(this,e,r)}append(e,r){return of.append.call(this,e,r)}delete(e,r){return of.delete.call(this,e,r)}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?of.next.call(this):super.next()}prev(){return this.focused.editable?of.prev.call(this):super.prev()}async indicator(e,r){let i=e.indicator||"",n=e.editable?i:super.indicator(e,r);return await this.resolve(n,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?of.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let i=r.parent?this.value[r.parent.name]:this.value;if(r.editable?i=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(i=r.enabled===!0),e=await r.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};zne.exports=Vne});var Mc=E((NCt,Xne)=>{"use strict";var g3e=sf(),f3e=SN(),{isPrimitive:h3e}=Mi(),Zne=class extends g3e{constructor(e){super(e);this.initial=h3e(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let i=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!i||i.name!=="return")?this.append(` -`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:i}=this.state;this.input=`${i}`.slice(0,r)+e+`${i}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.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(e===0)return this.alert();let r=this.input.slice(0,e),i=this.input.slice(e),n=r.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,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=this.initial!=null?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 r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):f3e(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),i=await this.separator(),n=await this.message(),s=[r,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};Xne.exports=Zne});var ese=E((LCt,$ne)=>{"use strict";var p3e=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),U0=t=>p3e(t).filter(Boolean);$ne.exports=(t,e={},r="")=>{let{past:i=[],present:n=""}=e,s,o;switch(t){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:U0([r,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:U0([...s,r]),present:o};case"save":return{past:U0([...i,r]),present:""};case"remove":return o=U0(i.filter(a=>a!==r)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${t}"`)}}});var kN=E((TCt,tse)=>{"use strict";var d3e=Mc(),rse=ese(),ise=class extends d3e{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let i=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=rse(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=rse("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};tse.exports=ise});var ose=E((MCt,nse)=>{"use strict";var C3e=Mc(),sse=class extends C3e{format(){return""}};nse.exports=sse});var lse=E((OCt,ase)=>{"use strict";var m3e=Mc(),Ase=class extends m3e{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:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};ase.exports=Ase});var gse=E((KCt,cse)=>{"use strict";var E3e=GA(),use=class extends E3e{constructor(e){super(_(P({},e),{multiple:!0}))}};cse.exports=use});var PN=E((UCt,fse)=>{"use strict";var I3e=Mc(),hse=class extends I3e{constructor(e={}){super(P({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?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 r=e||this.minor,i=this.toNumber(this.input);return i>this.max+r?this.alert():(this.input=`${i+r}`,this.render())}down(e){let r=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};fse.exports=hse});var dse=E((HCt,pse)=>{pse.exports=PN()});var Ese=E((GCt,Cse)=>{"use strict";var y3e=Mc(),mse=class extends y3e{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Cse.exports=mse});var Bse=E((jCt,Ise)=>{"use strict";var w3e=js(),B3e=sC(),yse=Mi(),wse=class extends B3e{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||` - `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let i=0;i=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(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let r=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-r.join("").length,n=Math.round(i/(r.length-1)),o=r.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,r,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,i);let n=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let i=e.scale.map(s=>this.scaleIndicator(e,s,r)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await e.hint;s&&!yse.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,r),u=await this.renderScale(e,r),g=this.margin[1]+this.margin[3];this.scaleLength=w3e.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=yse.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),r=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...r.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(r),this.write([a,o,c,g,f].filter(Boolean).join(` -`)),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)}};Ise.exports=wse});var Sse=E((YCt,Qse)=>{"use strict";var bse=js(),Q3e=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",vse=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Q3e(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},b3e=async(t={},e={},r=i=>i)=>{let i=new Set,n=t.fields||[],s=t.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uR.name===I.key);I.field=n.find(R=>R.name===I.key),b||(b=new vse(I),a.push(b)),b.lines.push(I.line-1);continue}let d=o[o.length-1];d.type==="text"&&d.line===c?d.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};Qse.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),i=P(P({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await b3e(e,i),a=DN("result",t,e),l=DN("format",t,e),c=DN("validate",t,e,!0),u=t.isValue.bind(t);return async(g={},f=!1)=>{let h=0;g.required=r,g.items=s,g.keys=o,g.output="";let p=async(B,b,R,H)=>{let L=await c(B,b,R,H);return L===!1?"Invalid field "+R.name:L};for(let B of n){let b=B.value,R=B.key;if(B.type!=="template"){b&&(g.output+=b);continue}if(B.type==="template"){let H=s.find(q=>q.name===R);e.required===!0&&g.required.add(H.name);let L=[H.input,g.values[H.value],H.value,b].find(u),J=(H.field||{}).message||B.inner;if(f){let q=await p(g.values[R],g,H,h);if(q&&typeof q=="string"||q===!1){g.invalid.set(R,q);continue}g.invalid.delete(R);let A=await a(g.values[R],g,H,h);g.output+=bse.unstyle(A);continue}H.placeholder=!1;let ne=b;b=await l(b,g,H,h),L!==b?(g.values[R]=L,b=t.styles.typing(L),g.missing.delete(J)):(g.values[R]=void 0,L=`<${J}>`,b=t.styles.primary(L),H.placeholder=!0,g.required.has(R)&&g.missing.add(J)),g.missing.has(J)&&g.validating&&(b=t.styles.warning(L)),g.invalid.has(R)&&g.validating&&(b=t.styles.danger(L)),h===g.index&&(ne!==b?b=t.styles.underline(b):b=t.styles.heading(bse.unstyle(b))),h++}b&&(g.output+=b)}let d=g.output.split(` -`).map(B=>" "+B),m=s.length,I=0;for(let B of s)g.invalid.has(B.name)&&B.lines.forEach(b=>{d[b][0]===" "&&(d[b]=g.styles.danger(g.symbols.bullet)+d[b].slice(1))}),t.isValue(g.values[B.name])&&I++;return g.completed=(I/m*100).toFixed(0),g.output=d.join(` -`),g.output}};function DN(t,e,r,i){return(n,s,o,a)=>typeof o.field[t]=="function"?o.field[t].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var Pse=E((qCt,xse)=>{"use strict";var v3e=js(),S3e=Sse(),x3e=sf(),kse=class extends x3e{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await S3e(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={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${r}`,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 r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(B=>B!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=r[e]||"",d=await this.format(p),m=await this.footer();d&&(c+=" "+d),f&&!d&&this.state.completed===0&&(c+=" "+f),this.clear(n);let I=[u,c,h,m,g.trim()];this.write(I.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:r,keys:i,index:n}=this.state,s=r.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let o=v3e.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};xse.exports=kse});var Fse=E((JCt,Dse)=>{"use strict";var k3e="(Use + to sort)",P3e=GA(),Rse=class extends P3e{constructor(e){super(_(P({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,k3e].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let i=await super.renderChoice(e,r),n=this.symbols.identicalTo+" ",s=this.index===r&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${r+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Dse.exports=Rse});var Tse=E((WCt,Nse)=>{"use strict";var D3e=sC(),Lse=class extends D3e{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(i=>this.styles.muted(i)),this.state.header=r.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let i of r)i.scale=R3e(5,this.options),i.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],i=r.selected;return e.scale.forEach(n=>n.selected=!1),r.selected=!i,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,r){await this.onChoice(e,r);let i=this.index===r,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=b=>(b?this.styles.success("\u25C9"):"\u25EF")+o,u=r+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,r),h=this.indent(e),p=h+e.scale.map((b,R)=>c(R===e.scaleIdx)).join(a),d=b=>b===e.scaleIdx?g(b):b,m=h+e.scale.map((b,R)=>d(R)).join(l),I=()=>[u,f].filter(Boolean).join(" "),B=()=>[I(),p,m," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),m=this.styles.cyan(m)),B()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` -`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function R3e(t,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>P({},i));let r=[];for(let i=1;i{Mse.exports=kN()});var Hse=E((VCt,Kse)=>{"use strict";var F3e=K0(),Use=class extends F3e{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(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)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="",r){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=i=>this.styles.primary.underline(i);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,r=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([r,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};Kse.exports=Use});var Yse=E((_Ct,Gse)=>{"use strict";var N3e=GA(),jse=class extends N3e{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let i=await super.toChoices(e,r);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}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)}}};Gse.exports=jse});var Jse=E(RN=>{"use strict";var qse=Mi(),ti=(t,e)=>{qse.defineExport(RN,t,e),qse.defineExport(RN,t.toLowerCase(),e)};ti("AutoComplete",()=>Nne());ti("BasicAuth",()=>Gne());ti("Confirm",()=>Wne());ti("Editable",()=>_ne());ti("Form",()=>O0());ti("Input",()=>kN());ti("Invisible",()=>ose());ti("List",()=>lse());ti("MultiSelect",()=>gse());ti("Numeral",()=>dse());ti("Password",()=>Ese());ti("Scale",()=>Bse());ti("Select",()=>GA());ti("Snippet",()=>Pse());ti("Sort",()=>Fse());ti("Survey",()=>Tse());ti("Text",()=>Ose());ti("Toggle",()=>Hse());ti("Quiz",()=>Yse())});var zse=E((ZCt,Wse)=>{Wse.exports={ArrayPrompt:sC(),AuthPrompt:xN(),BooleanPrompt:K0(),NumberPrompt:PN(),StringPrompt:Mc()}});var aC=E(($Ct,Vse)=>{"use strict";var _se=require("assert"),FN=require("events"),jA=Mi(),No=class extends FN{constructor(e,r){super();this.options=jA.merge({},e),this.answers=P({},r)}register(e,r){if(jA.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}_se.equal(typeof r,"function","expected a function");let i=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[i]=r:this.prompts[i]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(jA.merge({},this.options,r))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=jA.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=jA;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];_se(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](r),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),r.autofill&&l!=null?(a.value=a.input=l,r.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}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||sf()}static get prompts(){return Jse()}static get types(){return zse()}static get prompt(){let e=(r,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(r)};return jA.mixinEmitter(e,new FN),e}};jA.mixinEmitter(No,new FN);var NN=No.prompts;for(let t of Object.keys(NN)){let e=t.toLowerCase(),r=i=>new NN[t](i).run();No.prompt[e]=r,No[e]=r,No[t]||Reflect.defineProperty(No,t,{get:()=>NN[t]})}var oC=t=>{jA.defineExport(No,t,()=>No.types[t])};oC("ArrayPrompt");oC("AuthPrompt");oC("BooleanPrompt");oC("NumberPrompt");oC("StringPrompt");Vse.exports=No});var loe=E((Gmt,Aoe)=>{function K3e(t,e){for(var r=-1,i=t==null?0:t.length;++r{var U3e=XB(),H3e=jg();function G3e(t,e,r,i){var n=!r;r||(r={});for(var s=-1,o=e.length;++s{var j3e=Af(),Y3e=zg();function q3e(t,e){return t&&j3e(e,Y3e(e),t)}uoe.exports=q3e});var hoe=E((qmt,foe)=>{function J3e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}foe.exports=J3e});var doe=E((Jmt,poe)=>{var W3e=Gs(),z3e=u0(),V3e=hoe(),_3e=Object.prototype,X3e=_3e.hasOwnProperty;function Z3e(t){if(!W3e(t))return V3e(t);var e=z3e(t),r=[];for(var i in t)i=="constructor"&&(e||!X3e.call(t,i))||r.push(i);return r}poe.exports=Z3e});var lf=E((Wmt,Coe)=>{var $3e=bF(),eWe=doe(),tWe=Hd();function rWe(t){return tWe(t)?$3e(t,!0):eWe(t)}Coe.exports=rWe});var Eoe=E((zmt,moe)=>{var iWe=Af(),nWe=lf();function sWe(t,e){return t&&iWe(e,nWe(e),t)}moe.exports=sWe});var UN=E((hC,cf)=>{var oWe=Ks(),Ioe=typeof hC=="object"&&hC&&!hC.nodeType&&hC,yoe=Ioe&&typeof cf=="object"&&cf&&!cf.nodeType&&cf,aWe=yoe&&yoe.exports===Ioe,woe=aWe?oWe.Buffer:void 0,Boe=woe?woe.allocUnsafe:void 0;function AWe(t,e){if(e)return t.slice();var r=t.length,i=Boe?Boe(r):new t.constructor(r);return t.copy(i),i}cf.exports=AWe});var HN=E((Vmt,Qoe)=>{function lWe(t,e){var r=-1,i=t.length;for(e||(e=Array(i));++r{var cWe=Af(),uWe=f0();function gWe(t,e){return cWe(t,uWe(t),e)}boe.exports=gWe});var H0=E((Xmt,Soe)=>{var fWe=vF(),hWe=fWe(Object.getPrototypeOf,Object);Soe.exports=hWe});var GN=E((Zmt,xoe)=>{var pWe=$B(),dWe=H0(),CWe=f0(),mWe=RF(),EWe=Object.getOwnPropertySymbols,IWe=EWe?function(t){for(var e=[];t;)pWe(e,CWe(t)),t=dWe(t);return e}:mWe;xoe.exports=IWe});var Poe=E(($mt,koe)=>{var yWe=Af(),wWe=GN();function BWe(t,e){return yWe(t,wWe(t),e)}koe.exports=BWe});var Roe=E((eEt,Doe)=>{var QWe=DF(),bWe=GN(),vWe=lf();function SWe(t){return QWe(t,vWe,bWe)}Doe.exports=SWe});var Noe=E((tEt,Foe)=>{var xWe=Object.prototype,kWe=xWe.hasOwnProperty;function PWe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&kWe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Foe.exports=PWe});var G0=E((rEt,Loe)=>{var Toe=kF();function DWe(t){var e=new t.constructor(t.byteLength);return new Toe(e).set(new Toe(t)),e}Loe.exports=DWe});var Ooe=E((iEt,Moe)=>{var RWe=G0();function FWe(t,e){var r=e?RWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Moe.exports=FWe});var Uoe=E((nEt,Koe)=>{var NWe=/\w*$/;function LWe(t){var e=new t.constructor(t.source,NWe.exec(t));return e.lastIndex=t.lastIndex,e}Koe.exports=LWe});var qoe=E((sEt,Hoe)=>{var Goe=ac(),joe=Goe?Goe.prototype:void 0,Yoe=joe?joe.valueOf:void 0;function TWe(t){return Yoe?Object(Yoe.call(t)):{}}Hoe.exports=TWe});var jN=E((oEt,Joe)=>{var MWe=G0();function OWe(t,e){var r=e?MWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Joe.exports=OWe});var zoe=E((aEt,Woe)=>{var KWe=G0(),UWe=Ooe(),HWe=Uoe(),GWe=qoe(),jWe=jN(),YWe="[object Boolean]",qWe="[object Date]",JWe="[object Map]",WWe="[object Number]",zWe="[object RegExp]",VWe="[object Set]",_We="[object String]",XWe="[object Symbol]",ZWe="[object ArrayBuffer]",$We="[object DataView]",e8e="[object Float32Array]",t8e="[object Float64Array]",r8e="[object Int8Array]",i8e="[object Int16Array]",n8e="[object Int32Array]",s8e="[object Uint8Array]",o8e="[object Uint8ClampedArray]",a8e="[object Uint16Array]",A8e="[object Uint32Array]";function l8e(t,e,r){var i=t.constructor;switch(e){case ZWe:return KWe(t);case YWe:case qWe:return new i(+t);case $We:return UWe(t,r);case e8e:case t8e:case r8e:case i8e:case n8e:case s8e:case o8e:case a8e:case A8e:return jWe(t,r);case JWe:return new i;case WWe:case _We:return new i(t);case zWe:return HWe(t);case VWe:return new i;case XWe:return GWe(t)}}Woe.exports=l8e});var Xoe=E((AEt,Voe)=>{var c8e=Gs(),_oe=Object.create,u8e=function(){function t(){}return function(e){if(!c8e(e))return{};if(_oe)return _oe(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();Voe.exports=u8e});var YN=E((lEt,Zoe)=>{var g8e=Xoe(),f8e=H0(),h8e=u0();function p8e(t){return typeof t.constructor=="function"&&!h8e(t)?g8e(f8e(t)):{}}Zoe.exports=p8e});var eae=E((cEt,$oe)=>{var d8e=jd(),C8e=Qo(),m8e="[object Map]";function E8e(t){return C8e(t)&&d8e(t)==m8e}$oe.exports=E8e});var nae=E((uEt,tae)=>{var I8e=eae(),y8e=A0(),rae=l0(),iae=rae&&rae.isMap,w8e=iae?y8e(iae):I8e;tae.exports=w8e});var oae=E((gEt,sae)=>{var B8e=jd(),Q8e=Qo(),b8e="[object Set]";function v8e(t){return Q8e(t)&&B8e(t)==b8e}sae.exports=v8e});var cae=E((fEt,aae)=>{var S8e=oae(),x8e=A0(),Aae=l0(),lae=Aae&&Aae.isSet,k8e=lae?x8e(lae):S8e;aae.exports=k8e});var pae=E((hEt,uae)=>{var P8e=Gd(),D8e=loe(),R8e=XB(),F8e=goe(),N8e=Eoe(),L8e=UN(),T8e=HN(),M8e=voe(),O8e=Poe(),K8e=FF(),U8e=Roe(),H8e=jd(),G8e=Noe(),j8e=zoe(),Y8e=YN(),q8e=As(),J8e=Od(),W8e=nae(),z8e=Gs(),V8e=cae(),_8e=zg(),X8e=lf(),Z8e=1,$8e=2,e4e=4,gae="[object Arguments]",t4e="[object Array]",r4e="[object Boolean]",i4e="[object Date]",n4e="[object Error]",fae="[object Function]",s4e="[object GeneratorFunction]",o4e="[object Map]",a4e="[object Number]",hae="[object Object]",A4e="[object RegExp]",l4e="[object Set]",c4e="[object String]",u4e="[object Symbol]",g4e="[object WeakMap]",f4e="[object ArrayBuffer]",h4e="[object DataView]",p4e="[object Float32Array]",d4e="[object Float64Array]",C4e="[object Int8Array]",m4e="[object Int16Array]",E4e="[object Int32Array]",I4e="[object Uint8Array]",y4e="[object Uint8ClampedArray]",w4e="[object Uint16Array]",B4e="[object Uint32Array]",rr={};rr[gae]=rr[t4e]=rr[f4e]=rr[h4e]=rr[r4e]=rr[i4e]=rr[p4e]=rr[d4e]=rr[C4e]=rr[m4e]=rr[E4e]=rr[o4e]=rr[a4e]=rr[hae]=rr[A4e]=rr[l4e]=rr[c4e]=rr[u4e]=rr[I4e]=rr[y4e]=rr[w4e]=rr[B4e]=!0;rr[n4e]=rr[fae]=rr[g4e]=!1;function j0(t,e,r,i,n,s){var o,a=e&Z8e,l=e&$8e,c=e&e4e;if(r&&(o=n?r(t,i,n,s):r(t)),o!==void 0)return o;if(!z8e(t))return t;var u=q8e(t);if(u){if(o=G8e(t),!a)return T8e(t,o)}else{var g=H8e(t),f=g==fae||g==s4e;if(J8e(t))return L8e(t,a);if(g==hae||g==gae||f&&!n){if(o=l||f?{}:Y8e(t),!a)return l?O8e(t,N8e(o,t)):M8e(t,F8e(o,t))}else{if(!rr[g])return n?t:{};o=j8e(t,g,a)}}s||(s=new P8e);var h=s.get(t);if(h)return h;s.set(t,o),V8e(t)?t.forEach(function(m){o.add(j0(m,e,r,m,t,s))}):W8e(t)&&t.forEach(function(m,I){o.set(I,j0(m,e,r,I,t,s))});var p=c?l?U8e:K8e:l?X8e:_8e,d=u?void 0:p(t);return D8e(d||t,function(m,I){d&&(I=m,m=t[I]),R8e(o,I,j0(m,e,r,I,t,s))}),o}uae.exports=j0});var qN=E((pEt,dae)=>{var Q4e=pae(),b4e=1,v4e=4;function S4e(t){return Q4e(t,b4e|v4e)}dae.exports=S4e});var mae=E((dEt,Cae)=>{var x4e=tF();function k4e(t,e,r){return t==null?t:x4e(t,e,r)}Cae.exports=k4e});var Qae=E((wEt,Bae)=>{function P4e(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}Bae.exports=P4e});var vae=E((BEt,bae)=>{var D4e=xd(),R4e=zP();function F4e(t,e){return e.length<2?t:D4e(t,R4e(e,0,-1))}bae.exports=F4e});var xae=E((QEt,Sae)=>{var N4e=Gg(),L4e=Qae(),T4e=vae(),M4e=Sc();function O4e(t,e){return e=N4e(e,t),t=T4e(t,e),t==null||delete t[M4e(L4e(e))]}Sae.exports=O4e});var Pae=E((bEt,kae)=>{var K4e=xae();function U4e(t,e){return t==null?!0:K4e(t,e)}kae.exports=U4e});var Kae=E((tIt,Oae)=>{Oae.exports={name:"@yarnpkg/cli",version:"3.1.1",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.0.1",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2",typescript:"^4.5.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},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-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var iL=E((SBt,QAe)=>{"use strict";QAe.exports=function(e,r){r===!0&&(r=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof r=="number"?n[r]:n}});var nL=E((xBt,bAe)=>{"use strict";var sze=iL();function vAe(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=sze(t);return t=t.substring(t.indexOf("://")+3),vAe(e)?!0:t.indexOf("@"){"use strict";var oze=iL(),aze=nL(),Aze=require("querystring");function lze(t){t=(t||"").trim();var e={protocols:oze(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},r=t.indexOf("://"),i=-1,n=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var o=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(aze(t)?e.protocol="ssh":((o==="/"||o==="~")&&(t=t.substring(2)),e.protocol="file"))),r!==-1&&(t=t.substring(r+3)),s=t.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=Aze.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}SAe.exports=lze});var DAe=E((PBt,kAe)=>{"use strict";var cze=typeof URL=="undefined"?require("url").URL:URL,PAe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t);kAe.exports=(t,e)=>{e=Object.assign({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripHash:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps")&&(e.forceHttp=e.normalizeHttps),Reflect.has(e,"normalizeHttp")&&(e.forceHttps=e.normalizeHttp),Reflect.has(e,"stripFragment")&&(e.stripHash=e.stripFragment),t=t.trim();let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new cze(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?![https?:]).)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];PAe(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])PAe(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}});var FAe=E((DBt,RAe)=>{"use strict";var uze=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},gze=xAe(),fze=DAe();function hze(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof t!="string"||!t.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":uze(e))!=="object"&&(e={stripFragment:!1}),t=fze(t,e));var r=gze(t);return r}RAe.exports=hze});var TAe=E((RBt,NAe)=>{"use strict";var pze=FAe(),LAe=nL();function dze(t){var e=pze(t);e.token="";var r=e.user.split(":");return r.length===2&&(r[1]==="x-oauth-basic"?e.token=r[0]:r[0]==="x-token-auth"&&(e.token=r[1])),LAe(e.protocols)||LAe(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}NAe.exports=dze});var OAe=E((FBt,MAe)=>{"use strict";var Cze=TAe();function sL(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=Cze(t),r=e.resource.split("."),i=null;switch(e.toString=function(l){return sL.stringify(this,l)},e.source=r.length>2?r.slice(1-r.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=r[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}sL.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",i=t.user||"git",n=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+i+"@"+t.resource+r+"/"+t.full_name+n:i+"@"+t.resource+":"+t.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+t.resource+r+"/"+t.full_name+n;case"http":case"https":var s=t.token?mze(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+s+t.resource+r+"/"+t.full_name+n;default:return t.href}};function mze(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}MAe.exports=sL});var NL=E((Obt,ole)=>{var Mze=jg(),Oze=Kg();function Kze(t,e,r){(r!==void 0&&!Oze(t[e],r)||r===void 0&&!(e in t))&&Mze(t,e,r)}ole.exports=Kze});var Ale=E((Kbt,ale)=>{var Uze=Hd(),Hze=Qo();function Gze(t){return Hze(t)&&Uze(t)}ale.exports=Gze});var ule=E((Ubt,lle)=>{var jze=Ac(),Yze=H0(),qze=Qo(),Jze="[object Object]",Wze=Function.prototype,zze=Object.prototype,cle=Wze.toString,Vze=zze.hasOwnProperty,_ze=cle.call(Object);function Xze(t){if(!qze(t)||jze(t)!=Jze)return!1;var e=Yze(t);if(e===null)return!0;var r=Vze.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&cle.call(r)==_ze}lle.exports=Xze});var LL=E((Hbt,gle)=>{function Zze(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}gle.exports=Zze});var hle=E((Gbt,fle)=>{var $ze=Af(),e5e=lf();function t5e(t){return $ze(t,e5e(t))}fle.exports=t5e});var Ile=E((jbt,ple)=>{var dle=NL(),r5e=UN(),i5e=jN(),n5e=HN(),s5e=YN(),Cle=Pd(),mle=As(),o5e=Ale(),a5e=Od(),A5e=zB(),l5e=Gs(),c5e=ule(),u5e=c0(),Ele=LL(),g5e=hle();function f5e(t,e,r,i,n,s,o){var a=Ele(t,r),l=Ele(e,r),c=o.get(l);if(c){dle(t,r,c);return}var u=s?s(a,l,r+"",t,e,o):void 0,g=u===void 0;if(g){var f=mle(l),h=!f&&a5e(l),p=!f&&!h&&u5e(l);u=l,f||h||p?mle(a)?u=a:o5e(a)?u=n5e(a):h?(g=!1,u=r5e(l,!0)):p?(g=!1,u=i5e(l,!0)):u=[]:c5e(l)||Cle(l)?(u=a,Cle(a)?u=g5e(a):(!l5e(a)||A5e(a))&&(u=s5e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),dle(t,r,u)}ple.exports=f5e});var Ble=E((Ybt,yle)=>{var h5e=Gd(),p5e=NL(),d5e=BF(),C5e=Ile(),m5e=Gs(),E5e=lf(),I5e=LL();function wle(t,e,r,i,n){t!==e&&d5e(e,function(s,o){if(n||(n=new h5e),m5e(s))C5e(t,e,o,r,wle,i,n);else{var a=i?i(I5e(t,o),s,o+"",t,e,n):void 0;a===void 0&&(a=s),p5e(t,o,a)}},E5e)}yle.exports=wle});var ble=E((qbt,Qle)=>{var y5e=e0(),w5e=nF(),B5e=sF();function Q5e(t,e){return B5e(w5e(t,e,y5e),t+"")}Qle.exports=Q5e});var Sle=E((Jbt,vle)=>{var b5e=Kg(),v5e=Hd(),S5e=kd(),x5e=Gs();function k5e(t,e,r){if(!x5e(r))return!1;var i=typeof e;return(i=="number"?v5e(r)&&S5e(e,r.length):i=="string"&&e in r)?b5e(r[e],t):!1}vle.exports=k5e});var kle=E((Wbt,xle)=>{var P5e=ble(),D5e=Sle();function R5e(t){return P5e(function(e,r){var i=-1,n=r.length,s=n>1?r[n-1]:void 0,o=n>2?r[2]:void 0;for(s=t.length>3&&typeof s=="function"?(n--,s):void 0,o&&D5e(r[0],r[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var F5e=Ble(),N5e=kle(),L5e=N5e(function(t,e,r){F5e(t,e,r)});Ple.exports=L5e});var Wle=E(($vt,Jle)=>{var VL;Jle.exports=()=>(typeof VL=="undefined"&&(VL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),VL)});var $le=E(XL=>{function pf(t,e){if(typeof t=="string")return t;if(t){let r,i;if(Array.isArray(t)){for(r=0;r0)return(f=pf(n[g],u))?f.replace("*",c.substring(g.length-1)):Gc(i,c,1)}return Gc(i,c)}}function l6e(t,e={}){let r=0,i,n=e.browser,s=e.fields||["module","main"];for(n&&!s.includes("browser")&&s.unshift("browser");r{var eT;nce.exports=()=>(typeof eT=="undefined"&&(eT=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),eT)});var gce=E((aT,AT)=>{(function(t){aT&&typeof aT=="object"&&typeof AT!="undefined"?AT.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window!="undefined"?window.isWindows=t():typeof global!="undefined"?global.isWindows=t():typeof self!="undefined"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var dce=E((Dxt,fce)=>{"use strict";lT.ifExists=E6e;var mf=require("util"),Es=require("path"),hce=gce(),I6e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,y6e={createPwshFile:!0,createCmdFile:hce(),fs:require("fs")},w6e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function pce(t){let e=P(P({},y6e),t),r=e.fs;return e.fs_={chmod:r.chmod?mf.promisify(r.chmod):async()=>{},mkdir:mf.promisify(r.mkdir),readFile:mf.promisify(r.readFile),stat:mf.promisify(r.stat),unlink:mf.promisify(r.unlink),writeFile:mf.promisify(r.writeFile)},e}async function lT(t,e,r){let i=pce(r);await i.fs_.stat(t),await B6e(t,e,i)}function E6e(t,e,r){return lT(t,e,r).catch(()=>{})}function Q6e(t,e){return e.fs_.unlink(t).catch(()=>{})}async function B6e(t,e,r){let i=await S6e(t,r);return await b6e(e,r),v6e(t,e,i,r)}function b6e(t,e){return e.fs_.mkdir(Es.dirname(t),{recursive:!0})}function v6e(t,e,r,i){let n=pce(i),s=[{generator:P6e,extension:""}];return n.createCmdFile&&s.push({generator:k6e,extension:".cmd"}),n.createPwshFile&&s.push({generator:D6e,extension:".ps1"}),Promise.all(s.map(o=>x6e(t,e+o.extension,r,o.generator,n)))}function R6e(t,e){return Q6e(t,e)}function N6e(t,e){return F6e(t,e)}async function S6e(t,e){let n=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(I6e);if(!n){let s=Es.extname(t).toLowerCase();return{program:w6e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function x6e(t,e,r,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[r.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:r.program,args:o}),await R6e(e,n),await n.fs_.writeFile(e,i(t,e,n),"utf8"),N6e(e,n)}function k6e(t,e,r){let n=Es.relative(Es.dirname(e),t).split("/").join("\\"),s=Es.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=r.prog,l=r.args||"",c=cT(r.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=r.progArgs?`${r.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function P6e(t,e,r){let i=Es.relative(Es.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=Es.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=r.args||"",l=cT(r.nodePath).posix;n?(s=`"$basedir/${r.prog}"`,i=o):(n=o,a="",i="");let c=r.progArgs?`${r.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=r.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function D6e(t,e,r){let i=Es.relative(Es.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=Es.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=r.args||"",c=cT(r.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${r.prog}$exe"`,i=a):(s=a,l="",i="");let f=r.progArgs?`${r.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${r.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return r.nodePath&&(h+=` else { - $env:NODE_PATH="${g}" -}`),o?h+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${f}$args - } else { - & ${o} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args - } else { - & ${s} ${l} ${i} ${f}$args - } - $ret=$LASTEXITCODE -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:h+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${f}$args -} else { - & ${s} ${l} ${i} ${f}$args -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,h}function F6e(t,e){return e.fs_.chmod(t,493)}function cT(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Es.delimiter):Array.from(t),r={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${s}`:s,r[i]={win32:n,posix:s}}return r}fce.exports=lT});var PT=E((fPt,Nce)=>{Nce.exports=require("stream")});var Oce=E((hPt,Lce)=>{"use strict";function Tce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function e9e(t){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(r){var i={data:r,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=r+i.data;return n}},{key:"concat",value:function(r){if(this.length===0)return iQ.alloc(0);for(var i=iQ.allocUnsafe(r>>>0),n=this.head,s=0;n;)o9e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(r,i){var n;return ro.length?o.length:r;if(a===o.length?s+=o:s+=o.slice(0,r),r-=a,r===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(r){var i=iQ.allocUnsafe(r),n=this.head,s=1;for(n.data.copy(i),r-=n.data.length;n=n.next;){var o=n.data,a=r>o.length?o.length:r;if(o.copy(i,i.length-r,0,a),r-=a,r===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:s9e,value:function(r,i){return DT(this,e9e({},i,{depth:0,customInspect:!1}))}}]),t}()});var FT=E((pPt,Kce)=>{"use strict";function a9e(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(RT,this,t)):process.nextTick(RT,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(s){!e&&s?r._writableState?r._writableState.errorEmitted?process.nextTick(nQ,r):(r._writableState.errorEmitted=!0,process.nextTick(Uce,r,s)):process.nextTick(Uce,r,s):e?(process.nextTick(nQ,r),e(s)):process.nextTick(nQ,r)}),this)}function Uce(t,e){RT(t,e),nQ(t)}function nQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function A9e(){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)}function RT(t,e){t.emit("error",e)}function l9e(t,e){var r=t._readableState,i=t._writableState;r&&r.autoDestroy||i&&i.autoDestroy?t.destroy(e):t.emit("error",e)}Kce.exports={destroy:a9e,undestroy:A9e,errorOrDestroy:l9e}});var VA=E((dPt,Hce)=>{"use strict";var Gce={};function Is(t,e,r){r||(r=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends r{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=r.name,n.prototype.code=t,Gce[t]=n}function jce(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(i=>String(i)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function c9e(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function u9e(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function g9e(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Is("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Is("ERR_INVALID_ARG_TYPE",function(t,e,r){let i;typeof e=="string"&&c9e(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(u9e(t," argument"))n=`The ${t} ${i} ${jce(e,"type")}`;else{let s=g9e(t,".")?"property":"argument";n=`The "${t}" ${s} ${i} ${jce(e,"type")}`}return n+=`. Received type ${typeof r}`,n},TypeError);Is("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Is("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Is("ERR_STREAM_PREMATURE_CLOSE","Premature close");Is("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Is("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Is("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Is("ERR_STREAM_WRITE_AFTER_END","write after end");Is("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Is("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Is("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");Hce.exports.codes=Gce});var NT=E((CPt,Yce)=>{"use strict";var f9e=VA().codes.ERR_INVALID_OPT_VALUE;function h9e(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function p9e(t,e,r,i){var n=h9e(e,i,r);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?r:"highWaterMark";throw new f9e(s,n)}return Math.floor(n)}return t.objectMode?16:16*1024}Yce.exports={getHighWaterMark:p9e}});var qce=E((mPt,LT)=>{typeof Object.create=="function"?LT.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:LT.exports=function(e,r){if(r){e.super_=r;var i=function(){};i.prototype=r.prototype,e.prototype=new i,e.prototype.constructor=e}}});var _A=E((EPt,TT)=>{try{if(MT=require("util"),typeof MT.inherits!="function")throw"";TT.exports=MT.inherits}catch(t){TT.exports=qce()}var MT});var Wce=E((IPt,Jce)=>{Jce.exports=require("util").deprecate});var UT=E((yPt,zce)=>{"use strict";zce.exports=Sr;function Vce(t){var e=this;this.next=null,this.entry=null,this.finish=function(){d9e(e,t)}}var If;Sr.WritableState=em;var C9e={deprecate:Wce()},_ce=PT(),sQ=require("buffer").Buffer,m9e=global.Uint8Array||function(){};function E9e(t){return sQ.from(t)}function I9e(t){return sQ.isBuffer(t)||t instanceof m9e}var OT=FT(),y9e=NT(),w9e=y9e.getHighWaterMark,XA=VA().codes,B9e=XA.ERR_INVALID_ARG_TYPE,Q9e=XA.ERR_METHOD_NOT_IMPLEMENTED,b9e=XA.ERR_MULTIPLE_CALLBACK,v9e=XA.ERR_STREAM_CANNOT_PIPE,S9e=XA.ERR_STREAM_DESTROYED,x9e=XA.ERR_STREAM_NULL_VALUES,k9e=XA.ERR_STREAM_WRITE_AFTER_END,P9e=XA.ERR_UNKNOWN_ENCODING,yf=OT.errorOrDestroy;_A()(Sr,_ce);function D9e(){}function em(t,e,r){If=If||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof If),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=w9e(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=t.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){R9e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Vce(this)}em.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(em.prototype,"buffer",{get:C9e.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}})();var oQ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(oQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Sr,Symbol.hasInstance,{value:function(e){return oQ.call(this,e)?!0:this!==Sr?!1:e&&e._writableState instanceof em}})):oQ=function(e){return e instanceof this};function Sr(t){If=If||Yc();var e=this instanceof If;if(!e&&!oQ.call(Sr,this))return new Sr(t);this._writableState=new em(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),_ce.call(this)}Sr.prototype.pipe=function(){yf(this,new v9e)};function F9e(t,e){var r=new k9e;yf(t,r),process.nextTick(e,r)}function N9e(t,e,r,i){var n;return r===null?n=new x9e:typeof r!="string"&&!e.objectMode&&(n=new B9e("chunk",["string","Buffer"],r)),n?(yf(t,n),process.nextTick(i,n),!1):!0}Sr.prototype.write=function(t,e,r){var i=this._writableState,n=!1,s=!i.objectMode&&I9e(t);return s&&!sQ.isBuffer(t)&&(t=E9e(t)),typeof e=="function"&&(r=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof r!="function"&&(r=D9e),i.ending?F9e(this,r):(s||N9e(this,i,t,r))&&(i.pendingcb++,n=L9e(this,i,s,t,e,r)),n};Sr.prototype.cork=function(){this._writableState.corked++};Sr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Xce(this,t))};Sr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new P9e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Sr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function T9e(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=sQ.from(e,r)),e}Object.defineProperty(Sr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function L9e(t,e,r,i,n,s){if(!r){var o=T9e(e,i,n);i!==o&&(r=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var j9e=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};eue.exports=Mo;var tue=HT(),GT=UT();_A()(Mo,tue);for(jT=j9e(GT.prototype),aQ=0;aQ{var lQ=require("buffer"),qa=lQ.Buffer;function iue(t,e){for(var r in t)e[r]=t[r]}qa.from&&qa.alloc&&qa.allocUnsafe&&qa.allocUnsafeSlow?rue.exports=lQ:(iue(lQ,YT),YT.Buffer=wf);function wf(t,e,r){return qa(t,e,r)}iue(qa,wf);wf.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return qa(t,e,r)};wf.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=qa(t);return e!==void 0?typeof r=="string"?i.fill(e,r):i.fill(e):i.fill(0),i};wf.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return qa(t)};wf.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return lQ.SlowBuffer(t)}});var WT=E(sue=>{"use strict";var qT=nue().Buffer,oue=qT.isEncoding||function(t){switch(t=""+t,t&&t.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 J9e(t){if(!t)return"utf8";for(var e;;)switch(t){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 t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function W9e(t){var e=J9e(t);if(typeof e!="string"&&(qT.isEncoding===oue||!oue(t)))throw new Error("Unknown encoding: "+t);return e||t}sue.StringDecoder=rm;function rm(t){this.encoding=W9e(t);var e;switch(this.encoding){case"utf16le":this.text=V9e,this.end=_9e,e=4;break;case"utf8":this.fillLast=z9e,e=4;break;case"base64":this.text=X9e,this.end=Z9e,e=3;break;default:this.write=$9e,this.end=eVe;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=qT.allocUnsafe(e)}rm.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function iVe(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:t.lastNeed=n-3),n):0))}function nVe(t,e,r){if((e[0]&192)!=128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return t.lastNeed=2,"\uFFFD"}}function z9e(t){var e=this.lastTotal-this.lastNeed,r=nVe(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function rVe(t,e){var r=iVe(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function tVe(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function V9e(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function _9e(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function X9e(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Z9e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function $9e(t){return t.toString(this.encoding)}function eVe(t){return t&&t.length?this.write(t):""}});var cQ=E((QPt,aue)=>{"use strict";var Aue=VA().codes.ERR_STREAM_PREMATURE_CLOSE;function sVe(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,i=new Array(r),n=0;n{"use strict";var uQ;function ZA(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var AVe=cQ(),$A=Symbol("lastResolve"),qc=Symbol("lastReject"),im=Symbol("error"),gQ=Symbol("ended"),Jc=Symbol("lastPromise"),zT=Symbol("handlePromise"),Wc=Symbol("stream");function el(t,e){return{value:t,done:e}}function lVe(t){var e=t[$A];if(e!==null){var r=t[Wc].read();r!==null&&(t[Jc]=null,t[$A]=null,t[qc]=null,e(el(r,!1)))}}function cVe(t){process.nextTick(lVe,t)}function uVe(t,e){return function(r,i){t.then(function(){if(e[gQ]){r(el(void 0,!0));return}e[zT](r,i)},i)}}var gVe=Object.getPrototypeOf(function(){}),fVe=Object.setPrototypeOf((uQ={get stream(){return this[Wc]},next:function(){var e=this,r=this[im];if(r!==null)return Promise.reject(r);if(this[gQ])return Promise.resolve(el(void 0,!0));if(this[Wc].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[im]?a(e[im]):o(el(void 0,!0))})});var i=this[Jc],n;if(i)n=new Promise(uVe(i,this));else{var s=this[Wc].read();if(s!==null)return Promise.resolve(el(s,!1));n=new Promise(this[zT])}return this[Jc]=n,n}},ZA(uQ,Symbol.asyncIterator,function(){return this}),ZA(uQ,"return",function(){var e=this;return new Promise(function(r,i){e[Wc].destroy(null,function(n){if(n){i(n);return}r(el(void 0,!0))})})}),uQ),gVe),hVe=function(e){var r,i=Object.create(fVe,(r={},ZA(r,Wc,{value:e,writable:!0}),ZA(r,$A,{value:null,writable:!0}),ZA(r,qc,{value:null,writable:!0}),ZA(r,im,{value:null,writable:!0}),ZA(r,gQ,{value:e._readableState.endEmitted,writable:!0}),ZA(r,zT,{value:function(s,o){var a=i[Wc].read();a?(i[Jc]=null,i[$A]=null,i[qc]=null,s(el(a,!1))):(i[$A]=s,i[qc]=o)},writable:!0}),r));return i[Jc]=null,AVe(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[qc];s!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,s(n)),i[im]=n;return}var o=i[$A];o!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,o(el(void 0,!0))),i[gQ]=!0}),e.on("readable",cVe.bind(null,i)),i};cue.exports=hVe});var pue=E((vPt,gue)=>{"use strict";function fue(t,e,r,i,n,s,o){try{var a=t[s](o),l=a.value}catch(c){r(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function pVe(t){return function(){var e=this,r=arguments;return new Promise(function(i,n){var s=t.apply(e,r);function o(l){fue(s,i,n,o,a,"next",l)}function a(l){fue(s,i,n,o,a,"throw",l)}o(void 0)})}}function hue(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function CVe(t){for(var e=1;e{"use strict";due.exports=kt;var Bf;kt.ReadableState=Cue;var SPt=require("events").EventEmitter,mue=function(e,r){return e.listeners(r).length},nm=PT(),fQ=require("buffer").Buffer,IVe=global.Uint8Array||function(){};function yVe(t){return fQ.from(t)}function wVe(t){return fQ.isBuffer(t)||t instanceof IVe}var VT=require("util"),Et;VT&&VT.debuglog?Et=VT.debuglog("stream"):Et=function(){};var BVe=Oce(),_T=FT(),QVe=NT(),bVe=QVe.getHighWaterMark,hQ=VA().codes,vVe=hQ.ERR_INVALID_ARG_TYPE,SVe=hQ.ERR_STREAM_PUSH_AFTER_EOF,xVe=hQ.ERR_METHOD_NOT_IMPLEMENTED,kVe=hQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Qf,XT,ZT;_A()(kt,nm);var sm=_T.errorOrDestroy,$T=["error","close","destroy","pause","resume"];function PVe(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function Cue(t,e,r){Bf=Bf||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof Bf),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=bVe(this,t,"readableHighWaterMark",r),this.buffer=new BVe,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=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Qf||(Qf=WT().StringDecoder),this.decoder=new Qf(t.encoding),this.encoding=t.encoding)}function kt(t){if(Bf=Bf||Yc(),!(this instanceof kt))return new kt(t);var e=this instanceof Bf;this._readableState=new Cue(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),nm.call(this)}Object.defineProperty(kt.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});kt.prototype.destroy=_T.destroy;kt.prototype._undestroy=_T.undestroy;kt.prototype._destroy=function(t,e){e(t)};kt.prototype.push=function(t,e){var r=this._readableState,i;return r.objectMode?i=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=fQ.from(t,e),e=""),i=!0),Eue(this,t,e,!1,i)};kt.prototype.unshift=function(t){return Eue(this,t,null,!0,!1)};function Eue(t,e,r,i,n){Et("readableAddChunk",e);var s=t._readableState;if(e===null)s.reading=!1,RVe(t,s);else{var o;if(n||(o=DVe(s,e)),o)sm(t,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==fQ.prototype&&(e=yVe(e)),i)s.endEmitted?sm(t,new kVe):eM(t,s,e,!0);else if(s.ended)sm(t,new SVe);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||e.length!==0?eM(t,s,e,!1):tM(t,s)):eM(t,s,e,!1)}else i||(s.reading=!1,tM(t,s))}return!s.ended&&(s.length=Iue?t=Iue:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function yue(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=FVe(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}kt.prototype.read=function(t){Et("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Et("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?rM(this):pQ(this),null;if(t=yue(t,e),t===0&&e.ended)return e.length===0&&rM(this),null;var i=e.needReadable;Et("need readable",i),(e.length===0||e.length-t0?n=wue(t,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&rM(this)),n!==null&&this.emit("data",n),n};function RVe(t,e){if(Et("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?pQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Bue(t)))}}function pQ(t){var e=t._readableState;Et("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Et("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Bue,t))}function Bue(t){var e=t._readableState;Et("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,iM(t)}function tM(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(NVe,t,e))}function NVe(t,e){for(;!e.reading&&!e.ended&&(e.length1&&Que(i.pipes,t)!==-1)&&!c&&(Et("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function f(m){Et("onerror",m),d(),t.removeListener("error",f),mue(t,"error")===0&&sm(t,m)}PVe(t,"error",f);function h(){t.removeListener("finish",p),d()}t.once("close",h);function p(){Et("onfinish"),t.removeListener("close",h),d()}t.once("finish",p);function d(){Et("unpipe"),r.unpipe(t)}return t.emit("pipe",r),i.flowing||(Et("pipe resume"),r.resume()),t};function LVe(t){return function(){var r=t._readableState;Et("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&mue(t,"data")&&(r.flowing=!0,iM(t))}}kt.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):t==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Et("on readable",i.length,i.reading),i.length?pQ(this):i.reading||process.nextTick(TVe,this)),r};kt.prototype.addListener=kt.prototype.on;kt.prototype.removeListener=function(t,e){var r=nm.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(bue,this),r};kt.prototype.removeAllListeners=function(t){var e=nm.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(bue,this),e};function bue(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function TVe(t){Et("readable nexttick read 0"),t.read(0)}kt.prototype.resume=function(){var t=this._readableState;return t.flowing||(Et("resume"),t.flowing=!t.readableListening,MVe(this,t)),t.paused=!1,this};function MVe(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(OVe,t,e))}function OVe(t,e){Et("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),iM(t),e.flowing&&!e.reading&&t.read(0)}kt.prototype.pause=function(){return Et("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Et("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function iM(t){var e=t._readableState;for(Et("flow",e.flowing);e.flowing&&t.read()!==null;);}kt.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;t.on("end",function(){if(Et("wrapped end"),r.decoder&&!r.ended){var o=r.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on("data",function(o){if(Et("wrapped data"),r.decoder&&(o=r.decoder.write(o)),!(r.objectMode&&o==null)&&!(!r.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,t.pause())}});for(var n in t)this[n]===void 0&&typeof t[n]=="function"&&(this[n]=function(a){return function(){return t[a].apply(t,arguments)}}(n));for(var s=0;s<$T.length;s++)t.on($T[s],this.emit.bind(this,$T[s]));return this._read=function(o){Et("wrapped _read",o),i&&(i=!1,t.resume())},this};typeof Symbol=="function"&&(kt.prototype[Symbol.asyncIterator]=function(){return XT===void 0&&(XT=uue()),XT(this)});Object.defineProperty(kt.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(kt.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(kt.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});kt._fromList=wue;Object.defineProperty(kt.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function wue(t,e){if(e.length===0)return null;var r;return e.objectMode?r=e.buffer.shift():!t||t>=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function rM(t){var e=t._readableState;Et("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(KVe,e,t))}function KVe(t,e){if(Et("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(kt.from=function(t,e){return ZT===void 0&&(ZT=pue()),ZT(kt,t,e)});function Que(t,e){for(var r=0,i=t.length;r{"use strict";vue.exports=Ja;var dQ=VA().codes,UVe=dQ.ERR_METHOD_NOT_IMPLEMENTED,HVe=dQ.ERR_MULTIPLE_CALLBACK,GVe=dQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,jVe=dQ.ERR_TRANSFORM_WITH_LENGTH_0,CQ=Yc();_A()(Ja,CQ);function YVe(t,e){var r=this._transformState;r.transforming=!1;var i=r.writecb;if(i===null)return this.emit("error",new HVe);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),i(t);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";xue.exports=om;var kue=nM();_A()(om,kue);function om(t){if(!(this instanceof om))return new om(t);kue.call(this,t)}om.prototype._transform=function(t,e,r){r(null,t)}});var Lue=E((DPt,Due)=>{"use strict";var sM;function JVe(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Rue=VA().codes,WVe=Rue.ERR_MISSING_ARGS,zVe=Rue.ERR_STREAM_DESTROYED;function Fue(t){if(t)throw t}function VVe(t){return t.setHeader&&typeof t.abort=="function"}function _Ve(t,e,r,i){i=JVe(i);var n=!1;t.on("close",function(){n=!0}),sM===void 0&&(sM=cQ()),sM(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,VVe(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();i(o||new zVe("pipe"))}}}function Nue(t){t()}function XVe(t,e){return t.pipe(e)}function ZVe(t){return!t.length||typeof t[t.length-1]!="function"?Fue:t.pop()}function $Ve(){for(var t=arguments.length,e=new Array(t),r=0;r0;return _Ve(o,l,c,function(u){n||(n=u),u&&s.forEach(Nue),!l&&(s.forEach(Nue),i(n))})});return e.reduce(XVe)}Due.exports=$Ve});var bf=E((ys,am)=>{var Am=require("stream");process.env.READABLE_STREAM==="disable"&&Am?(am.exports=Am.Readable,Object.assign(am.exports,Am),am.exports.Stream=Am):(ys=am.exports=HT(),ys.Stream=Am||ys,ys.Readable=ys,ys.Writable=UT(),ys.Duplex=Yc(),ys.Transform=nM(),ys.PassThrough=Pue(),ys.finished=cQ(),ys.pipeline=Lue())});var Oue=E((RPt,Tue)=>{"use strict";var{Buffer:_s}=require("buffer"),Mue=Symbol.for("BufferList");function nr(t){if(!(this instanceof nr))return new nr(t);nr._init.call(this,t)}nr._init=function(e){Object.defineProperty(this,Mue,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};nr.prototype._new=function(e){return new nr(e)};nr.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let i=0;ithis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};nr.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};nr.prototype.copy=function(e,r,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||_s.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&r||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:_s.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};nr.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let i=this._offset(e),n=this._offset(r),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};nr.prototype.toString=function(e,r,i){return this.slice(r,i).toString(e)};nr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};nr.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=t.length){let l=o.indexOf(t,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-t.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,t))return l;s++}s=0}return-1};nr.prototype._match=function(t,e){if(this.length-t{"use strict";var oM=bf().Duplex,e7e=_A(),lm=Oue();function Oi(t){if(!(this instanceof Oi))return new Oi(t);if(typeof t=="function"){this._callback=t;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),t=null}lm._init.call(this,t),oM.call(this)}e7e(Oi,oM);Object.assign(Oi.prototype,lm.prototype);Oi.prototype._new=function(e){return new Oi(e)};Oi.prototype._write=function(e,r,i){this._appendBuffer(e),typeof i=="function"&&i()};Oi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Oi.prototype.end=function(e){oM.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Oi.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Oi.prototype._isBufferList=function(e){return e instanceof Oi||e instanceof lm||Oi.isBufferList(e)};Oi.isBufferList=lm.isBufferList;mQ.exports=Oi;mQ.exports.BufferListStream=Oi;mQ.exports.BufferList=lm});var lM=E(vf=>{var t7e=Buffer.alloc,r7e="0000000000000000000",i7e="7777777777777777777",Uue="0".charCodeAt(0),Hue=Buffer.from("ustar\0","binary"),n7e=Buffer.from("00","binary"),s7e=Buffer.from("ustar ","binary"),o7e=Buffer.from(" \0","binary"),a7e=parseInt("7777",8),cm=257,aM=263,A7e=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},l7e=function(t){switch(t){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},c7e=function(t){switch(t){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},Gue=function(t,e,r,i){for(;re?i7e.slice(0,e)+" ":r7e.slice(0,e-t.length)+t+" "};function u7e(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],i=t.length-1;i>0;i--){var n=t[i];e?r.push(n):r.push(255-n)}var s=0,o=r.length;for(i=0;i=Math.pow(10,r)&&r++,e+r+t};vf.decodeLongPath=function(t,e){return Sf(t,0,t.length,e)};vf.encodePax=function(t){var e="";t.name&&(e+=AM(" path="+t.name+` -`)),t.linkname&&(e+=AM(" linkpath="+t.linkname+` -`));var r=t.pax;if(r)for(var i in r)e+=AM(" "+i+"="+r[i]+` -`);return Buffer.from(e)};vf.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var n=r.indexOf("/");if(n===-1)return null;i+=i?"/"+r.slice(0,n):r.slice(0,n),r=r.slice(n+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(tl(t.mode&a7e,6),100),e.write(tl(t.uid,6),108),e.write(tl(t.gid,6),116),e.write(tl(t.size,11),124),e.write(tl(t.mtime.getTime()/1e3|0,11),136),e[156]=Uue+c7e(t.type),t.linkname&&e.write(t.linkname,157),Hue.copy(e,cm),n7e.copy(e,aM),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(tl(t.devmajor||0,6),329),e.write(tl(t.devminor||0,6),337),i&&e.write(i,345),e.write(tl(jue(e),6),148),e)};vf.decode=function(t,e,r){var i=t[156]===0?0:t[156]-Uue,n=Sf(t,0,100,e),s=rl(t,100,8),o=rl(t,108,8),a=rl(t,116,8),l=rl(t,124,12),c=rl(t,136,12),u=l7e(i),g=t[157]===0?null:Sf(t,157,100,e),f=Sf(t,265,32),h=Sf(t,297,32),p=rl(t,329,8),d=rl(t,337,8),m=jue(t);if(m===8*32)return null;if(m!==rl(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(Hue.compare(t,cm,cm+6)===0)t[345]&&(n=Sf(t,345,155,e)+"/"+n);else if(!(s7e.compare(t,cm,cm+6)===0&&o7e.compare(t,aM,aM+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:d}}});var _ue=E((LPt,Yue)=>{var que=require("util"),g7e=Kue(),um=lM(),Jue=bf().Writable,Wue=bf().PassThrough,zue=function(){},Vue=function(t){return t&=511,t&&512-t},f7e=function(t,e){var r=new EQ(t,e);return r.end(),r},h7e=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},EQ=function(t,e){this._parent=t,this.offset=e,Wue.call(this,{autoDestroy:!1})};que.inherits(EQ,Wue);EQ.prototype.destroy=function(t){this._parent.destroy(t)};var Wa=function(t){if(!(this instanceof Wa))return new Wa(t);Jue.call(this,t),t=t||{},this._offset=0,this._buffer=g7e(),this._missing=0,this._partial=!1,this._onparse=zue,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 e=this,r=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=Vue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(Vue(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=um.decodePax(r.slice(0,f)),r.consume(f),s()},l=function(){var f=e._header.size;e._pax=um.decodePax(r.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=um.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(p){e.emit("error",p)}if(r.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=h7e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,f7e(e,f),n);return}e._stream=new EQ(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};que.inherits(Wa,Jue);Wa.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};Wa.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};Wa.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=zue,this._overflow?this._write(this._overflow,void 0,t):t()}};Wa.prototype._write=function(t,e,r){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(t.length&&(this._partial=!0),t.lengths&&(o=t.slice(s),t=t.slice(0,s)),i?i.end(t):n.append(t),this._overflow=o,this._onparse()}};Wa.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};Yue.exports=Wa});var Zue=E((TPt,Xue)=>{Xue.exports=require("fs").constants||require("constants")});var ige=E((MPt,$ue)=>{var xf=Zue(),ege=tk(),IQ=_A(),p7e=Buffer.alloc,tge=bf().Readable,kf=bf().Writable,d7e=require("string_decoder").StringDecoder,yQ=lM(),C7e=parseInt("755",8),m7e=parseInt("644",8),rge=p7e(1024),cM=function(){},uM=function(t,e){e&=511,e&&t.push(rge.slice(0,512-e))};function E7e(t){switch(t&xf.S_IFMT){case xf.S_IFBLK:return"block-device";case xf.S_IFCHR:return"character-device";case xf.S_IFDIR:return"directory";case xf.S_IFIFO:return"fifo";case xf.S_IFLNK:return"symlink"}return"file"}var wQ=function(t){kf.call(this),this.written=0,this._to=t,this._destroyed=!1};IQ(wQ,kf);wQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};wQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var BQ=function(){kf.call(this),this.linkname="",this._decoder=new d7e("utf-8"),this._destroyed=!1};IQ(BQ,kf);BQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};BQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var gm=function(){kf.call(this),this._destroyed=!1};IQ(gm,kf);gm.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};gm.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Oo=function(t){if(!(this instanceof Oo))return new Oo(t);tge.call(this,t),this._drain=cM,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};IQ(Oo,tge);Oo.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=cM);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=E7e(t.mode)),t.mode||(t.mode=t.type==="directory"?C7e:m7e),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var n=this.push(e);return uM(i,t.size),n?process.nextTick(r):this._drain=r,new gm}if(t.type==="symlink"&&!t.linkname){var s=new BQ;return ege(s,function(a){if(a)return i.destroy(),r(a);t.linkname=s.linkname,i._encode(t),r()}),s}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new gm;var o=new wQ(this);return this._stream=o,ege(o,function(a){if(i._stream=null,a)return i.destroy(),r(a);if(o.written!==t.size)return i.destroy(),r(new Error("size mismatch"));uM(i,t.size),i._finalizing&&i.finalize(),r()}),o}};Oo.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(rge),this.push(null))};Oo.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Oo.prototype._encode=function(t){if(!t.pax){var e=yQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};Oo.prototype._encodePax=function(t){var e=yQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(yQ.encode(r)),this.push(e),uM(this,e.length),r.size=t.size,r.type=t.type,this.push(yQ.encode(r))};Oo.prototype._read=function(t){var e=this._drain;this._drain=cM,e()};$ue.exports=Oo});var nge=E(gM=>{gM.extract=_ue();gM.pack=ige()});var Cge=E((oDt,fge)=>{"use strict";var Pf=class{constructor(e,r,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=r||{},this.__providers=pge(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return mM(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[i,n]of this.entries())e.call(r,n,i,this)}toJSON(){let e={};return this.forEach((r,i)=>{e[i]=r}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let r=e||this.__opts.other;if(r){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(r):R7e(n);for(let[o,a]of s)r(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Pf(this.__specs,this.__opts,pge(this.__providers).concat(e)),hge)}};try{let t=require("util");Pf.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch(t){}function F7e(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function mM(t,e,r){let i=t.__specs[e];if(r&&!i&&(!t.__opts.other||!t.__opts.other(e)))F7e(e);else{i||(i={});let n;for(let s of t.__providers){if(n=dge(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=dge(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(t):i.default:n}}function dge(t,e){let r;return e.__isFiggyPudding?r=mM(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var hge={has(t,e){return e in t.__specs&&mM(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Pf.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=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.")}};fge.exports=N7e;function N7e(t,e){function r(...i){return new Proxy(new Pf(t,e,i),hge)}return r}function pge(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function R7e(t){return Object.keys(t).map(e=>[e,t[e]])}});var Ige=E((aDt,Ko)=>{"use strict";var hm=require("crypto"),L7e=Cge(),T7e=require("stream").Transform,mge=["sha256","sha384","sha512"],M7e=/^[a-z0-9+/]+(?:=?=?)$/i,O7e=/^([^-]+)-([^?]+)([?\S*]*)$/,K7e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,U7e=/^[\x21-\x7E]+$/,on=L7e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>H7e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),zc=class{get isHash(){return!0}constructor(e,r){r=on(r);let i=!!r.strict;this.source=e.trim();let n=this.source.match(i?K7e:O7e);if(!n||i&&!mge.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=on(e),e.strict&&!(mge.some(i=>i===this.algorithm)&&this.digest.match(M7e)&&(this.options||[]).every(i=>i.match(U7e))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Df=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=on(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>zc.prototype.toString.call(n,e)).filter(n=>n.length).join(r)).filter(i=>i.length).join(r)}concat(e,r){r=on(r);let i=typeof e=="string"?e:pm(e,r);return Uo(`${this.toString(r)} ${i}`,r)}hexDigest(){return Uo(this,{single:!0}).hexDigest()}match(e,r){r=on(r);let i=Uo(e,r),n=i.pickAlgorithm(r);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=on(e);let r=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>r(n,s)||n)}};Ko.exports.parse=Uo;function Uo(t,e){if(e=on(e),typeof t=="string")return EM(t,e);if(t.algorithm&&t.digest){let r=new Df;return r[t.algorithm]=[t],EM(pm(r,e),e)}else return EM(pm(t,e),e)}function EM(t,e){return e.single?new zc(t,e):t.trim().split(/\s+/).reduce((r,i)=>{let n=new zc(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;r[s]||(r[s]=[]),r[s].push(n)}return r},new Df)}Ko.exports.stringify=pm;function pm(t,e){return e=on(e),t.algorithm&&t.digest?zc.prototype.toString.call(t,e):typeof t=="string"?pm(Uo(t,e),e):Df.prototype.toString.call(t,e)}Ko.exports.fromHex=G7e;function G7e(t,e,r){r=on(r);let i=r.options&&r.options.length?`?${r.options.join("?")}`:"";return Uo(`${e}-${Buffer.from(t,"hex").toString("base64")}${i}`,r)}Ko.exports.fromData=j7e;function j7e(t,e){e=on(e);let r=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((n,s)=>{let o=hm.createHash(s).update(t).digest("base64"),a=new zc(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new Df)}Ko.exports.fromStream=Y7e;function Y7e(t,e){e=on(e);let r=e.Promise||Promise,i=IM(e);return new r((n,s)=>{t.pipe(i),t.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}Ko.exports.checkData=q7e;function q7e(t,e,r){if(r=on(r),e=Uo(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(r),n=hm.createHash(i).update(t).digest("base64"),s=Uo({algorithm:i,digest:n}),o=s.match(e,r);if(o||!r.error)return o;if(typeof r.size=="number"&&t.length!==r.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${t.length}`);throw a.code="EBADSIZE",a.found=t.length,a.expected=r.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${t.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}Ko.exports.checkStream=J7e;function J7e(t,e,r){r=on(r);let i=r.Promise||Promise,n=IM(r.concat({integrity:e}));return new i((s,o)=>{t.pipe(n),t.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}Ko.exports.integrityStream=IM;function IM(t){t=on(t);let e=t.integrity&&Uo(t.integrity,t),r=e&&Object.keys(e).length,i=r&&e.pickAlgorithm(t),n=r&&e[i],s=Array.from(new Set(t.algorithms.concat(i?[i]:[]))),o=s.map(hm.createHash),a=0,l=new T7e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=t.options&&t.options.length?`?${t.options.join("?")}`:"",u=Uo(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),t),g=r&&u.match(e,t);if(typeof t.size=="number"&&a!==t.size){let f=new Error(`stream size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=t.size,f.sri=e,l.emit("error",f)}else if(t.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}Ko.exports.create=W7e;function W7e(t){t=on(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",i=e.map(hm.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new zc(`${a}-${l}${r}`,t);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new Df)}}}var z7e=new Set(hm.getHashes()),Ege=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>z7e.has(t));function H7e(t,e){return Ege.indexOf(t.toLowerCase())>=Ege.indexOf(e.toLowerCase())?t:e}});var Fd={};it(Fd,{BuildType:()=>Gn,Cache:()=>Qt,Configuration:()=>fe,DEFAULT_LOCK_FILENAME:()=>DR,DEFAULT_RC_FILENAME:()=>PR,FormatType:()=>ps,InstallMode:()=>li,LightReport:()=>Fa,LinkType:()=>gt,Manifest:()=>Ze,MessageName:()=>z,PackageExtensionStatus:()=>ki,PackageExtensionType:()=>oi,Project:()=>Ke,ProjectLookup:()=>KA,Report:()=>Xi,ReportError:()=>nt,SettingsType:()=>ge,StreamReport:()=>Fe,TAG_REGEXP:()=>Rg,TelemetryManager:()=>Rd,ThrowReport:()=>ei,VirtualFetcher:()=>dd,Workspace:()=>Dd,WorkspaceResolver:()=>Yr,YarnVersion:()=>Zr,execUtils:()=>hr,folderUtils:()=>Pb,formatUtils:()=>ue,hashUtils:()=>mn,httpUtils:()=>Zt,miscUtils:()=>de,scriptUtils:()=>Kt,semverUtils:()=>qt,structUtils:()=>S,tgzUtils:()=>Ai,treeUtils:()=>Hs});var hr={};it(hr,{EndStrategy:()=>Pn,execvp:()=>Nhe,pipevp:()=>to});var ch={};it(ch,{AliasFS:()=>Xo,CwdFS:()=>Ft,DEFAULT_COMPRESSION_LEVEL:()=>pl,FakeFS:()=>eA,Filename:()=>wt,JailFS:()=>Zo,LazyFS:()=>oh,LinkStrategy:()=>eh,NoFS:()=>bE,NodeFS:()=>Wt,PortablePath:()=>Se,PosixFS:()=>ah,ProxiedFS:()=>fi,VirtualFS:()=>Pr,ZipFS:()=>Jr,ZipOpenFS:()=>Jn,constants:()=>mr,extendFs:()=>SE,normalizeLineEndings:()=>ul,npath:()=>M,opendir:()=>wE,patchFs:()=>pb,ppath:()=>v,statUtils:()=>rb,toFilename:()=>kr,xfs:()=>T});var mr={};it(mr,{SAFE_TIME:()=>tb,S_IFDIR:()=>zo,S_IFLNK:()=>_o,S_IFMT:()=>kn,S_IFREG:()=>Vo});var kn=61440,zo=16384,Vo=32768,_o=40960,tb=456789e3;var rb={};it(rb,{BigIntStatsEntry:()=>Xf,DEFAULT_MODE:()=>_f,DirEntry:()=>uO,StatEntry:()=>Za,areStatsEqual:()=>nb,clearStats:()=>pE,convertToBigIntStats:()=>dE,makeDefaultStats:()=>Zf,makeEmptyStats:()=>Jfe});var ib=ie(require("util"));var _f=Vo|420,uO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Za=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=_f;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Xf=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(_f);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(kn))===BigInt(zo)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(kn))===BigInt(Vo)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(kn))===BigInt(_o)}};function Zf(){return new Za}function Jfe(){return pE(Zf())}function pE(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):ib.types.isDate(r)&&(t[e]=new Date(0))}return t}function dE(t){let e=new Xf;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let i=t[r];typeof i=="number"?e[r]=BigInt(i):ib.types.isDate(i)&&(e[r]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nb(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,i=e;return!(r.atimeNs!==i.atimeNs||r.mtimeNs!==i.mtimeNs||r.ctimeNs!==i.ctimeNs||r.birthtimeNs!==i.birthtimeNs)}var mE=ie(require("fs"));var $f=ie(require("path")),gO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(gO||(gO={}));var Se={root:"/",dot:"."},wt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},M=Object.create($f.default),v=Object.create($f.default.posix);M.cwd=()=>process.cwd();v.cwd=()=>sb(process.cwd());v.resolve=(...t)=>t.length>0&&v.isAbsolute(t[0])?$f.default.posix.resolve(...t):$f.default.posix.resolve(v.cwd(),...t);var fO=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};M.fromPortablePath=hO;M.toPortablePath=sb;M.contains=(t,e)=>fO(M,t,e);v.contains=(t,e)=>fO(v,t,e);var Wfe=/^([a-zA-Z]:.*)$/,zfe=/^\\\\(\.\\)?(.*)$/,Vfe=/^\/([a-zA-Z]:.*)$/,_fe=/^\/unc\/(\.dot\/)?(.*)$/;function hO(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(Vfe))t=e[1];else if(r=t.match(_fe))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function sb(t){if(process.platform!=="win32")return t;let e,r;return(e=t.match(Wfe))?t=`/${e[1]}`:(r=t.match(zfe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t.replace(/\\/g,"/")}function CE(t,e){return t===M?hO(e):sb(e)}function kr(t){if(M.parse(t).dir!==""||v.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var EE=new Date(tb*1e3),eh;(function(r){r.Allow="allow",r.ReadOnly="readOnly"})(eh||(eh={}));async function pO(t,e,r,i,n){let s=t.pathUtils.normalize(e),o=r.pathUtils.normalize(i),a=[],l=[],c=n.stableTime?{mtime:EE,atime:EE}:await r.lstatPromise(o);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[c.atime,c.mtime]});let u=typeof t.lutimesPromise=="function"?t.lutimesPromise.bind(t):t.utimesPromise.bind(t);await ob(a,l,u,t,s,r,o,n);for(let g of a)await g();await Promise.all(l.map(g=>g()))}async function ob(t,e,r,i,n,s,o,a){var f,h;let l=await Xfe(i,n),c=await s.lstatPromise(o),u=a.stableTime?{mtime:EE,atime:EE}:c,g;switch(!0){case c.isDirectory():g=await Zfe(t,e,r,i,n,l,s,o,c,a);break;case c.isFile():g=await $fe(t,e,r,i,n,l,s,o,c,a);break;case c.isSymbolicLink():g=await ehe(t,e,r,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(g||((f=l==null?void 0:l.mtime)==null?void 0:f.getTime())!==u.mtime.getTime()||((h=l==null?void 0:l.atime)==null?void 0:h.getTime())!==u.atime.getTime())&&(e.push(()=>r(n,u.atime,u.mtime)),g=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),g=!0),g}async function Xfe(t,e){try{return await t.lstatPromise(e)}catch(r){return null}}async function Zfe(t,e,r,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(t.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(f){if(f.code!=="EEXIST")throw f}}),u=!0);let g=await o.readdirPromise(a);if(c.stableSort)for(let f of g.sort())await ob(t,e,r,i,i.pathUtils.join(n,f),o,o.pathUtils.join(a,f),c)&&(u=!0);else(await Promise.all(g.map(async h=>{await ob(t,e,r,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),c)}))).some(h=>h)&&(u=!0);return u}var ab=new WeakMap;function Ab(t,e,r,i,n){return async()=>{await t.linkPromise(r,e),n===eh.ReadOnly&&(i.mode&=~146,await t.chmodPromise(e,i.mode))}}function the(t,e,r,i,n){let s=ab.get(t);return typeof s=="undefined"?async()=>{try{await t.copyFilePromise(r,e,mE.default.constants.COPYFILE_FICLONE_FORCE),ab.set(t,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")ab.set(t,!1),await Ab(t,e,r,i,n)();else throw o}}:s?async()=>t.copyFilePromise(r,e,mE.default.constants.COPYFILE_FICLONE_FORCE):Ab(t,e,r,i,n)}async function $fe(t,e,r,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?the(i,n,a,l,u):async()=>i.copyFilePromise(a,n,mE.default.constants.COPYFILE_FICLONE):u!==null?Ab(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return t.push(async()=>g()),!0}async function ehe(t,e,r,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;return t.push(async()=>{await i.symlinkPromise(CE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function qn(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function IE(t){return qn("EBUSY",t)}function th(t,e){return qn("ENOSYS",`${t}, ${e}`)}function $a(t){return qn("EINVAL",`invalid argument, ${t}`)}function Hi(t){return qn("EBADF",`bad file descriptor, ${t}`)}function bs(t){return qn("ENOENT",`no such file or directory, ${t}`)}function eo(t){return qn("ENOTDIR",`not a directory, ${t}`)}function rh(t){return qn("EISDIR",`illegal operation on a directory, ${t}`)}function yE(t){return qn("EEXIST",`file already exists, ${t}`)}function ln(t){return qn("EROFS",`read-only filesystem, ${t}`)}function dO(t){return qn("ENOTEMPTY",`directory not empty, ${t}`)}function CO(t){return qn("EOPNOTSUPP",`operation not supported, ${t}`)}function mO(){return qn("ERR_DIR_CLOSED","Directory handle was closed")}var lb=class extends Error{constructor(e,r){super(e);this.name="Libzip Error",this.code=r}};var EO=class{constructor(e,r,i={}){this.path=e;this.nextDirent=r;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw mO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e!="undefined"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}};function wE(t,e,r,i){let n=()=>{let s=r.shift();return typeof s=="undefined"?null:Object.assign(t.statSync(t.pathUtils.join(e,s)),{name:s})};return new EO(e,n,i)}var IO=ie(require("os"));var eA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(r)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:r=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(r){let o=await this.readdirPromise(e);await Promise.all(o.map(a=>this.removePromise(this.pathUtils.resolve(e,a))))}let s=0;do try{await this.rmdirPromise(e);break}catch(o){if(o.code==="EBUSY"||o.code==="ENOTEMPTY"){if(i===0)break;await new Promise(a=>setTimeout(a,s*100));continue}else throw o}while(s++{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} -`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} -`)}async preserveTimePromise(e,r){let i=await this.lstatPromise(e),n=await r();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,r){let i=this.lstatSync(e),n=r();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},gl=class extends eA{constructor(){super(v)}};function rhe(t){let e=t.match(/\r?\n/g);if(e===null)return IO.EOL;let r=e.filter(n=>n===`\r -`).length,i=e.length-r;return r>i?`\r -`:` -`}function ul(t,e){return e.replace(/\r?\n/g,rhe(t))}var $c=ie(require("fs")),cb=ie(require("stream")),QO=ie(require("util")),ub=ie(require("zlib"));var yO=ie(require("fs"));var Wt=class extends gl{constructor(e=yO.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Se.root}resolve(e){return v.resolve(e)}async openPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.open(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}openSync(e,r,i){return this.realFs.openSync(M.fromPortablePath(e),r,i)}async opendirPromise(e,r){return await new Promise((i,n)=>{typeof r!="undefined"?this.realFs.opendir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.opendir(M.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,r){let i=typeof r!="undefined"?this.realFs.opendirSync(M.fromPortablePath(e),r):this.realFs.opendirSync(M.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,r,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,r,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,r,i,n,s){return this.realFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return await new Promise((o,a)=>typeof r=="string"?this.realFs.write(e,r,i,this.makeCallback(o,a)):this.realFs.write(e,r,i,n,s,this.makeCallback(o,a)))}writeSync(e,r,i,n,s){return typeof r=="string"?this.realFs.writeSync(e,r,i):this.realFs.writeSync(e,r,i,n,s)}async closePromise(e){await new Promise((r,i)=>{this.realFs.close(e,this.makeCallback(r,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createReadStream(i,r)}createWriteStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createWriteStream(i,r)}async realpathPromise(e){return await new Promise((r,i)=>{this.realFs.realpath(M.fromPortablePath(e),{},this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}realpathSync(e){return M.toPortablePath(this.realFs.realpathSync(M.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(M.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(M.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((i,n)=>{this.realFs.access(M.fromPortablePath(e),r,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(M.fromPortablePath(e))}async statPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.stat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.stat(M.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,r){return r?this.realFs.statSync(M.fromPortablePath(e),r):this.realFs.statSync(M.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.fstat(e,r,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.lstat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.lstat(M.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,r){return r?this.realFs.lstatSync(M.fromPortablePath(e),r):this.realFs.lstatSync(M.fromPortablePath(e))}async chmodPromise(e,r){return await new Promise((i,n)=>{this.realFs.chmod(M.fromPortablePath(e),r,this.makeCallback(i,n))})}chmodSync(e,r){return this.realFs.chmodSync(M.fromPortablePath(e),r)}async chownPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.chown(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}chownSync(e,r,i){return this.realFs.chownSync(M.fromPortablePath(e),r,i)}async renamePromise(e,r){return await new Promise((i,n)=>{this.realFs.rename(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}renameSync(e,r){return this.realFs.renameSync(M.fromPortablePath(e),M.fromPortablePath(r))}async copyFilePromise(e,r,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(M.fromPortablePath(e),M.fromPortablePath(r),i,this.makeCallback(n,s))})}copyFileSync(e,r,i=0){return this.realFs.copyFileSync(M.fromPortablePath(e),M.fromPortablePath(r),i)}async appendFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFile(o,r,i,this.makeCallback(n,s)):this.realFs.appendFile(o,r,this.makeCallback(n,s))})}appendFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,r,i):this.realFs.appendFileSync(n,r)}async writeFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFile(o,r,i,this.makeCallback(n,s)):this.realFs.writeFile(o,r,this.makeCallback(n,s))})}writeFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,r,i):this.realFs.writeFileSync(n,r)}async unlinkPromise(e){return await new Promise((r,i)=>{this.realFs.unlink(M.fromPortablePath(e),this.makeCallback(r,i))})}unlinkSync(e){return this.realFs.unlinkSync(M.fromPortablePath(e))}async utimesPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.utimes(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}utimesSync(e,r,i){this.realFs.utimesSync(M.fromPortablePath(e),r,i)}async lutimesPromiseImpl(e,r,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,M.fromPortablePath(e),r,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,r,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,M.fromPortablePath(e),r,i)}async mkdirPromise(e,r){return await new Promise((i,n)=>{this.realFs.mkdir(M.fromPortablePath(e),r,this.makeCallback(i,n))})}mkdirSync(e,r){return this.realFs.mkdirSync(M.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.rmdir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.rmdir(M.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,r){return this.realFs.rmdirSync(M.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((i,n)=>{this.realFs.link(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}linkSync(e,r){return this.realFs.linkSync(M.fromPortablePath(e),M.fromPortablePath(r))}async symlinkPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.symlink(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i,this.makeCallback(n,s))})}symlinkSync(e,r,i){return this.realFs.symlinkSync(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i)}async readFilePromise(e,r){return await new Promise((i,n)=>{let s=typeof e=="string"?M.fromPortablePath(e):e;this.realFs.readFile(s,r,this.makeCallback(i,n))})}readFileSync(e,r){let i=typeof e=="string"?M.fromPortablePath(e):e;return this.realFs.readFileSync(i,r)}async readdirPromise(e,r){return await new Promise((i,n)=>{(r==null?void 0:r.withFileTypes)?this.realFs.readdir(M.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(M.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,r){return(r==null?void 0:r.withFileTypes)?this.realFs.readdirSync(M.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(M.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,i)=>{this.realFs.readlink(M.fromPortablePath(e),this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}readlinkSync(e){return M.toPortablePath(this.realFs.readlinkSync(M.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((i,n)=>{this.realFs.truncate(M.fromPortablePath(e),r,this.makeCallback(i,n))})}truncateSync(e,r){return this.realFs.truncateSync(M.fromPortablePath(e),r)}watch(e,r,i){return this.realFs.watch(M.fromPortablePath(e),r,i)}watchFile(e,r,i){return this.realFs.watchFile(M.fromPortablePath(e),r,i)}unwatchFile(e,r){return this.realFs.unwatchFile(M.fromPortablePath(e),r)}makeCallback(e,r){return(i,n)=>{i?r(i):e(n)}}};var wO=ie(require("events"));var fl;(function(r){r.Change="change",r.Stop="stop"})(fl||(fl={}));var hl;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(hl||(hl={}));function BO(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var ih=class extends wO.EventEmitter{constructor(e,r,{bigint:i=!1}={}){super();this.status=hl.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=r,this.bigint=i,this.lastStats=this.stat()}static create(e,r,i){let n=new ih(e,r,i);return n.start(),n}start(){BO(this.status,hl.Ready),this.status=hl.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(fl.Change,this.lastStats,this.lastStats)},3)}stop(){BO(this.status,hl.Running),this.status=hl.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(fl.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let r=this.bigint?new Xf:new Za;return pE(r)}}makeInterval(e){let r=setInterval(()=>{let i=this.stat(),n=this.lastStats;nb(i,n)||(this.lastStats=i,this.emit(fl.Change,i,n))},e.interval);return e.persistent?r:r.unref()}registerChangeListener(e,r){this.addListener(fl.Change,e),this.changeListeners.set(e,this.makeInterval(r))}unregisterChangeListener(e){this.removeListener(fl.Change,e);let r=this.changeListeners.get(e);typeof r!="undefined"&&clearInterval(r),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var BE=new WeakMap;function QE(t,e,r,i){let n,s,o,a;switch(typeof r){case"function":n=!1,s=!0,o=5007,a=r;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=r),a=i;break}let l=BE.get(t);typeof l=="undefined"&&BE.set(t,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=ih.create(t,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function nh(t,e,r){let i=BE.get(t);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof r=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function sh(t){let e=BE.get(t);if(typeof e!="undefined")for(let r of e.keys())nh(t,r)}var pl="mixed";function ihe(t){if(typeof t=="string"&&String(+t)===t)return+t;if(Number.isFinite(t))return t<0?Date.now()/1e3:t;if((0,QO.isDate)(t))return t.getTime()/1e3;throw new Error("Invalid time")}function bO(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Jr=class extends gl{constructor(e,r){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=r.libzip;let i=r;if(this.level=typeof i.level!="undefined"?i.level:pl,e!=null||(e=bO()),typeof e=="string"){let{baseFs:o=new Wt}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(r.stats)this.stats=r.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Zf();else throw o}else this.stats=Zf();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),r.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(M.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Se.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(r,r+e);return Buffer.from(n)}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw IE("archive closed, close");sh(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){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===_f?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,bO(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return v.resolve(Se.root,e)}async openPromise(e,r,i){return this.openSync(e,r,i)}openSync(e,r,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,r){return this.opendirSync(e,r)}opendirSync(e,r={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return wE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,r,i,n,s){return this.readSync(e,r,i,n,s)}readSync(e,r,i=0,n=r.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Hi("read");let a;s===-1||s===null?a=o.cursor:a=s;let l=this.readFileSync(o.p);l.copy(r,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,r,i,n,s){return typeof r=="string"?this.writeSync(e,r,s):this.writeSync(e,r,i,n,s)}writeSync(e,r,i,n,s){throw typeof this.fds.get(e)=="undefined"?Hi("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Hi("read");this.fds.delete(e)}createReadStream(e,{encoding:r}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cb.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,r);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:r}={}){if(this.readOnly)throw ln(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cb.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),r),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let r=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`lstat '${e}'`);return r}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw IE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=v.resolve(Se.root,e);return this.entries.has(i)||this.listings.has(i)}let r;try{r=this.resolveFilename(`stat '${e}'`,e)}catch(i){return!1}return this.entries.has(r)||this.listings.has(r)}async accessPromise(e,r){return this.accessSync(e,r)}accessSync(e,r=$c.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`access '${e}'`);if(this.readOnly&&r&$c.constants.W_OK)throw ln(`access '${e}'`)}async statPromise(e,r){return this.statSync(e,r)}statSync(e,r){let i=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`stat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,r)}async fstatPromise(e,r){return this.fstatSync(e,r)}fstatSync(e,r){let i=this.fds.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw bs(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw eo(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,r)}async lstatPromise(e,r){return this.lstatSync(e,r)}lstatSync(e,r){let i=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`lstat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,r)}statImpl(e,r,i={}){let n=this.entries.get(r);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,d=f,m=new Date(h),I=new Date(p),B=new Date(d),b=new Date(f),R=this.listings.has(r)?zo:this.isSymbolicLink(n)?_o:Vo,H=R===zo?493:420,L=R|this.getUnixMode(n,H)&511,K=this.libzip.struct.statCrc(s),J=Object.assign(new Za,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:m,birthtime:I,ctime:B,mtime:b,atimeMs:h,birthtimeMs:p,ctimeMs:d,mtimeMs:f,mode:L,crc:K});return i.bigint===!0?dE(J):J}if(this.listings.has(r)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),d=new Date(g),m=new Date(f),I=new Date(h),B=zo|493,b=0,R=Object.assign(new Za,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:d,ctime:m,mtime:I,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:B,crc:b});return i.bigint===!0?dE(R):R}throw new Error("Unreachable")}getUnixMode(e,r){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?r:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let r=this.listings.get(e);if(r)return r;let i=this.registerListing(v.dirname(e));return r=new Set,i.add(v.basename(e)),this.listings.set(e,r),r}registerEntry(e,r){this.registerListing(v.dirname(e)).add(v.basename(e)),this.entries.set(e,r)}unregisterListing(e){this.listings.delete(e);let r=this.listings.get(v.dirname(e));r==null||r.delete(v.basename(e))}unregisterEntry(e){this.unregisterListing(e);let r=this.entries.get(e);this.entries.delete(e),typeof r!="undefined"&&(this.fileSources.delete(r),this.isSymbolicLink(r)&&this.symlinkCount--)}deleteEntry(e,r){if(this.unregisterEntry(e),this.libzip.delete(this.zip,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,r,i=!0){if(!this.ready)throw IE(`archive closed, ${e}`);let n=v.resolve(Se.root,r);if(n==="/")return Se.root;let s=this.entries.get(n);if(i&&s!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(s)){let o=this.getFileSource(s).toString();return this.resolveFilename(e,v.resolve(v.dirname(n),o),!0)}else return n;for(;;){let o=this.resolveFilename(e,v.dirname(n),!0),a=this.listings.has(o),l=this.entries.has(o);if(!a&&!l)throw bs(e);if(!a)throw eo(e);if(n=v.resolve(o,v.basename(n)),!i||this.symlinkCount===0)break;let c=this.libzip.name.locate(this.zip,n.slice(1));if(c===-1)break;if(this.isSymbolicLink(c)){let u=this.getFileSource(c).toString();n=v.resolve(v.dirname(n),u)}else break}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,r);if(s===0)throw this.libzip.free(r),this.makeLibzipError(r);return s}allocateSource(e){let{buffer:r,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,r,i,0,!0);if(n===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,r){let i=Buffer.isBuffer(r)?r:Buffer.from(r),n=v.relative(Se.root,e),s=this.allocateSource(r);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a;if(this.level===0?a=this.libzip.ZIP_CM_STORE:a=this.libzip.ZIP_CM_DEFLATE,this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&kn)===_o}getFileSource(e,r={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(r.asyncDecompress)return new Promise((h,p)=>{ub.default.inflateRaw(f,(d,m)=>{d?p(d):(this.fileSources.set(e,m),h(m))})});{let h=ub.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async chmodPromise(e,r){return this.chmodSync(e,r)}chmodSync(e,r){if(this.readOnly)throw ln(`chmod '${e}'`);r&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Vo|0)&~511|r;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,r,i){return this.chownSync(e,r,i)}chownSync(e,r,i){throw new Error("Unimplemented")}async renamePromise(e,r){return this.renameSync(e,r)}renameSync(e,r){throw new Error("Unimplemented")}async copyFilePromise(e,r,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,r,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,r,i=0){if(this.readOnly)throw ln(`copyfile '${e} -> '${r}'`);if((i&$c.constants.COPYFILE_FICLONE_FORCE)!=0)throw th("unsupported clone operation",`copyfile '${e}' -> ${r}'`);let n=this.resolveFilename(`copyfile '${e} -> ${r}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw $a(`copyfile '${e}' -> '${r}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${r}'`,r),a=this.entries.get(o);if((i&($c.constants.COPYFILE_EXCL|$c.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw yE(`copyfile '${e}' -> '${r}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,r,i){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFilePromise(e,r,i)}appendFileSync(e,r,i={}){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFileSync(e,r,i)}fdToPath(e,r){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Hi(r);return i}async writeFilePromise(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([this.getFileSource(o),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,r){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw ln(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw rh(`open '${e}'`);let n=null,s=null;typeof r=="string"?n=r:typeof r=="object"&&({encoding:n=null,mode:s=null}=r);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw ln(`unlink '${e}'`);let r=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(r))throw rh(`unlink '${e}'`);let i=this.entries.get(r);if(typeof i=="undefined")throw $a(`unlink '${e}'`);this.deleteEntry(r,i)}async utimesPromise(e,r,i){return this.utimesSync(e,r,i)}utimesSync(e,r,i){if(this.readOnly)throw ln(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,r,i){return this.lutimesSync(e,r,i)}lutimesSync(e,r,i){if(this.readOnly)throw ln(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,r){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,ihe(r),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,r){return this.mkdirSync(e,r)}mkdirSync(e,{mode:r=493,recursive:i=!1}={}){if(i){this.mkdirpSync(e,{chmod:r});return}if(this.readOnly)throw ln(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw yE(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,r)}async rmdirPromise(e,r){return this.rmdirSync(e,r)}rmdirSync(e,{recursive:r=!1}={}){if(this.readOnly)throw ln(`rmdir '${e}'`);if(r){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw eo(`rmdir '${e}'`);if(n.size>0)throw dO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw $a(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let r=this.libzip.dir.add(this.zip,v.relative(Se.root,e));if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,r),r}async linkPromise(e,r){return this.linkSync(e,r)}linkSync(e,r){throw CO(`link '${e}' -> '${r}'`)}async symlinkPromise(e,r){return this.symlinkSync(e,r)}symlinkSync(e,r){if(this.readOnly)throw ln(`symlink '${e}' -> '${r}'`);let i=this.resolveFilename(`symlink '${e}' -> '${r}'`,r);if(this.listings.has(i))throw rh(`symlink '${e}' -> '${r}'`);if(this.entries.has(i))throw yE(`symlink '${e}' -> '${r}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(_o|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return r?i.toString(r):i}readFileSync(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=this.readFileBuffer(e);return r?i.toString(r):i}readFileBuffer(e,r={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`open '${e}'`);if(this.listings.has(i))throw rh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,r)}async readdirPromise(e,r){return this.readdirSync(e,r)}readdirSync(e,r){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`scandir '${e}'`);let s=[...n];return(r==null?void 0:r.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",v.join(e,o)),{name:o})):s}async readlinkPromise(e){let r=this.prepareReadlink(e);return(await this.getFileSource(r,{asyncDecompress:!0})).toString()}readlinkSync(e){let r=this.prepareReadlink(e);return this.getFileSource(r).toString()}prepareReadlink(e){let r=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(r))throw eo(`open '${e}'`);if(this.listings.has(r))throw $a(`readlink '${e}'`);let i=this.entries.get(r);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw $a(`readlink '${e}'`);return i}async truncatePromise(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(r,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(r,0);return s.copy(o),this.writeFileSync(e,o)}watch(e,r,i){let n;switch(typeof r){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=r);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,r,i){let n=v.resolve(Se.root,e);return QE(this,n,r,i)}unwatchFile(e,r){let i=v.resolve(Se.root,e);return nh(this,i,r)}};var fi=class extends eA{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,r,i){return this.baseFs.openPromise(this.mapToBase(e),r,i)}openSync(e,r,i){return this.baseFs.openSync(this.mapToBase(e),r,i)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,i,n,s){return await this.baseFs.readPromise(e,r,i,n,s)}readSync(e,r,i,n,s){return this.baseFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s)}writeSync(e,r,i,n,s){return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}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,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}async lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async chownPromise(e,r,i){return this.baseFs.chownPromise(this.mapToBase(e),r,i)}chownSync(e,r,i){return this.baseFs.chownSync(this.mapToBase(e),r,i)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),i)}copyFileSync(e,r,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),i)}async appendFilePromise(e,r,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,i)}appendFileSync(e,r,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,i)}async writeFilePromise(e,r,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,i)}writeFileSync(e,r,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,i){return this.baseFs.utimesPromise(this.mapToBase(e),r,i)}utimesSync(e,r,i){return this.baseFs.utimesSync(this.mapToBase(e),r,i)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,r){return r==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),r):this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return r==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),r):this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}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,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}watch(e,r,i){return this.baseFs.watch(this.mapToBase(e),r,i)}watchFile(e,r,i){return this.baseFs.watchFile(this.mapToBase(e),r,i)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Xo=class extends fi{constructor(e,{baseFs:r,pathUtils:i}){super(i);this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var Ft=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?v.normalize(e):this.baseFs.resolve(v.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var vO=Se.root,Zo=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.resolve(Se.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Se.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(vO,e));if(r.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(vO,this.pathUtils.relative(this.target,e))}};var oh=class extends fi{constructor(e,r){super(r);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}};var ze=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gb=class extends eA{constructor(){super(v)}getExtractHint(){throw ze()}getRealPath(){throw ze()}resolve(){throw ze()}async openPromise(){throw ze()}openSync(){throw ze()}async opendirPromise(){throw ze()}opendirSync(){throw ze()}async readPromise(){throw ze()}readSync(){throw ze()}async writePromise(){throw ze()}writeSync(){throw ze()}async closePromise(){throw ze()}closeSync(){throw ze()}createWriteStream(){throw ze()}createReadStream(){throw ze()}async realpathPromise(){throw ze()}realpathSync(){throw ze()}async readdirPromise(){throw ze()}readdirSync(){throw ze()}async existsPromise(e){throw ze()}existsSync(e){throw ze()}async accessPromise(){throw ze()}accessSync(){throw ze()}async statPromise(){throw ze()}statSync(){throw ze()}async fstatPromise(e){throw ze()}fstatSync(e){throw ze()}async lstatPromise(e){throw ze()}lstatSync(e){throw ze()}async chmodPromise(){throw ze()}chmodSync(){throw ze()}async chownPromise(){throw ze()}chownSync(){throw ze()}async mkdirPromise(){throw ze()}mkdirSync(){throw ze()}async rmdirPromise(){throw ze()}rmdirSync(){throw ze()}async linkPromise(){throw ze()}linkSync(){throw ze()}async symlinkPromise(){throw ze()}symlinkSync(){throw ze()}async renamePromise(){throw ze()}renameSync(){throw ze()}async copyFilePromise(){throw ze()}copyFileSync(){throw ze()}async appendFilePromise(){throw ze()}appendFileSync(){throw ze()}async writeFilePromise(){throw ze()}writeFileSync(){throw ze()}async unlinkPromise(){throw ze()}unlinkSync(){throw ze()}async utimesPromise(){throw ze()}utimesSync(){throw ze()}async readFilePromise(){throw ze()}readFileSync(){throw ze()}async readlinkPromise(){throw ze()}readlinkSync(){throw ze()}async truncatePromise(){throw ze()}truncateSync(){throw ze()}watch(){throw ze()}watchFile(){throw ze()}unwatchFile(){throw ze()}},bE=gb;bE.instance=new gb;var ah=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return M.fromPortablePath(e)}mapToBase(e){return M.toPortablePath(e)}};var nhe=/^[0-9]+$/,fb=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,she=/^([^/]+-)?[a-f0-9]+$/,Pr=class extends fi{static makeVirtualPath(e,r,i){if(v.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!v.basename(r).match(she))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=v.relative(v.dirname(e),i).split("/"),o=0;for(;o{let r=t.indexOf(e);if(r<=0)return null;let i=r;for(;r>=0&&(i=r+e.length,t[i]!==v.sep);){if(t[r-1]===v.sep)return null;r=t.indexOf(e,i)}return t.length>i&&t[i]!==v.sep?null:t.slice(0,i)},Jn=class extends gl{constructor({libzip:e,baseFs:r=new Wt,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=r,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,r){let i=new Jn(r);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,r){let i=this.nextFd++|$o;return this.fdMap.set(i,[e,r]),i}async openPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,r,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,r,i)))}openSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,r,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,r,i)))}async opendirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,r),async(i,{subPath:n})=>await i.opendirPromise(n,r),{requireSubpath:!1})}opendirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,r),(i,{subPath:n})=>i.opendirSync(n,r),{requireSubpath:!1})}async readPromise(e,r,i,n,s){if((e&$o)==0)return await this.baseFs.readPromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("read");let[a,l]=o;return await a.readPromise(l,r,i,n,s)}readSync(e,r,i,n,s){if((e&$o)==0)return this.baseFs.readSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("readSync");let[a,l]=o;return a.readSync(l,r,i,n,s)}async writePromise(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("write");let[a,l]=o;return typeof r=="string"?await a.writePromise(l,r,i):await a.writePromise(l,r,i,n,s)}writeSync(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("writeSync");let[a,l]=o;return typeof r=="string"?a.writeSync(l,r,i):a.writeSync(l,r,i,n,s)}async closePromise(e){if((e&$o)==0)return await this.baseFs.closePromise(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("close");this.fdMap.delete(e);let[i,n]=r;return await i.closePromise(n)}closeSync(e){if((e&$o)==0)return this.baseFs.closeSync(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("closeSync");this.fdMap.delete(e);let[i,n]=r;return i.closeSync(n)}createReadStream(e,r){return e===null?this.baseFs.createReadStream(e,r):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,r),(i,{subPath:n})=>i.createReadStream(n,r))}createWriteStream(e,r){return e===null?this.baseFs.createWriteStream(e,r):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,r),(i,{subPath:n})=>i.createWriteStream(n,r))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,await r.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,r.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(r,{subPath:i})=>await r.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(r,{subPath:i})=>r.existsSync(i))}async accessPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,r),async(i,{subPath:n})=>await i.accessPromise(n,r))}accessSync(e,r){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,r),(i,{subPath:n})=>i.accessSync(n,r))}async statPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,r),async(i,{subPath:n})=>await i.statPromise(n,r))}statSync(e,r){return this.makeCallSync(e,()=>this.baseFs.statSync(e,r),(i,{subPath:n})=>i.statSync(n,r))}async fstatPromise(e,r){if((e&$o)==0)return this.baseFs.fstatPromise(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstat");let[n,s]=i;return n.fstatPromise(s,r)}fstatSync(e,r){if((e&$o)==0)return this.baseFs.fstatSync(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let[n,s]=i;return n.fstatSync(s,r)}async lstatPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,r),async(i,{subPath:n})=>await i.lstatPromise(n,r))}lstatSync(e,r){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,r),(i,{subPath:n})=>i.lstatSync(n,r))}async chmodPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,r),async(i,{subPath:n})=>await i.chmodPromise(n,r))}chmodSync(e,r){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,r),(i,{subPath:n})=>i.chmodSync(n,r))}async chownPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,r,i),async(n,{subPath:s})=>await n.chownPromise(s,r,i))}chownSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,r,i),(n,{subPath:s})=>n.chownSync(s,r,i))}async renamePromise(e,r){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.renamePromise(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(r,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,r){return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.renameSync(e,r),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(r,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,r,i=0){let n=async(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.copyFilePromise(e,r,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(r,async()=>await n(s,o,this.baseFs,r),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,r,i=0){let n=(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.copyFileSync(e,r,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(r,()=>n(s,o,this.baseFs,r),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,r,i),async(n,{subPath:s})=>await n.appendFilePromise(s,r,i))}appendFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,r,i),(n,{subPath:s})=>n.appendFileSync(s,r,i))}async writeFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,r,i),async(n,{subPath:s})=>await n.writeFilePromise(s,r,i))}writeFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,r,i),(n,{subPath:s})=>n.writeFileSync(s,r,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(r,{subPath:i})=>await r.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(r,{subPath:i})=>r.unlinkSync(i))}async utimesPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,r,i),async(n,{subPath:s})=>await n.utimesPromise(s,r,i))}utimesSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,r,i),(n,{subPath:s})=>n.utimesSync(s,r,i))}async mkdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,r),async(i,{subPath:n})=>await i.mkdirPromise(n,r))}mkdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,r),(i,{subPath:n})=>i.mkdirSync(n,r))}async rmdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,r),async(i,{subPath:n})=>await i.rmdirPromise(n,r))}rmdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,r),(i,{subPath:n})=>i.rmdirSync(n,r))}async linkPromise(e,r){return await this.makeCallPromise(r,async()=>await this.baseFs.linkPromise(e,r),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,r){return this.makeCallSync(r,()=>this.baseFs.linkSync(e,r),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,r,i){return await this.makeCallPromise(r,async()=>await this.baseFs.symlinkPromise(e,r,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,r,i){return this.makeCallSync(r,()=>this.baseFs.symlinkSync(e,r,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,r){return this.makeCallPromise(e,async()=>{switch(r){case"utf8":return await this.baseFs.readFilePromise(e,r);default:return await this.baseFs.readFilePromise(e,r)}},async(i,{subPath:n})=>await i.readFilePromise(n,r))}readFileSync(e,r){return this.makeCallSync(e,()=>{switch(r){case"utf8":return this.baseFs.readFileSync(e,r);default:return this.baseFs.readFileSync(e,r)}},(i,{subPath:n})=>i.readFileSync(n,r))}async readdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,r),async(i,{subPath:n})=>await i.readdirPromise(n,r),{requireSubpath:!1})}readdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,r),(i,{subPath:n})=>i.readdirSync(n,r),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(r,{subPath:i})=>await r.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(r,{subPath:i})=>r.readlinkSync(i))}async truncatePromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,r),async(i,{subPath:n})=>await i.truncatePromise(n,r))}truncateSync(e,r){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,r),(i,{subPath:n})=>i.truncateSync(n,r))}watch(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,r,i),(n,{subPath:s})=>n.watch(s,r,i))}watchFile(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,r,i),()=>QE(this,e,r,i))}unwatchFile(e,r){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,r),()=>nh(this,e,r))}async makeCallPromise(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await r();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await r():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await r()}makeCallSync(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return r();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?r():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let r="";for(;;){let i=e.substr(r.length),n;if(!this.fileExtensions)n=SO(i,".zip");else for(let s of this.fileExtensions)if(n=SO(i,s),n)break;if(!n)return null;if(r=this.pathUtils.join(r,n),this.isZip.has(r)===!1){if(this.notZip.has(r))continue;try{if(!this.baseFs.lstatSync(r).isFile()){this.notZip.add(r);continue}}catch{return null}this.isZip.add(r)}return{archivePath:r,subPath:this.pathUtils.join(Se.root,e.substr(r.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let r=Date.now(),i=r+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(r>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-r).unref())}async getZipPromise(e,r){let i=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){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new Jr(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await r(n.zipFs)}finally{n.refCount-=1}}else{let n=new Jr(e,await i());try{return await r(n)}finally{n.saveAndClose()}}}getZipSync(e,r){let i=()=>({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={zipFs:new Jr(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,r(n.zipFs)}else{let n=new Jr(e,i());try{return r(n)}finally{n.saveAndClose()}}}};var lh=ie(require("util"));var vE=ie(require("url"));var hb=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof vE.URL?(0,vE.fileURLToPath)(e):e}};var ohe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),xO=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),ahe=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]);function pb(t,e){e=new hb(e);let r=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[lh.promisify.custom])!="undefined"&&(s[lh.promisify.custom]=o[lh.promisify.custom])};{r(t,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),r(t,"read",(i,n,...s)=>{let a=typeof s[s.length-1]=="function"?s.pop():()=>{};process.nextTick(()=>{e.readPromise(i,n,...s).then(l=>{a(null,l,n)},l=>{a(l,0,n)})})});for(let i of xO){let n=i.replace(/Promise$/,"");if(typeof t[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;r(t,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}});for(let i of ohe){let n=i;if(typeof t[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&r(t,n,s.bind(e))}t.realpathSync.native=t.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=t.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let o of xO){let a=o.replace(/Promise$/,"");if(typeof n[a]=="undefined")continue;let l=e[o];typeof l!="undefined"&&o!=="open"&&r(n,a,l.bind(e))}class s{constructor(a){this.fd=a}}for(let o of ahe){let a=o.replace(/Promise$/,""),l=e[o];typeof l!="undefined"&&r(s.prototype,a,function(...c){return l.call(e,this.fd,...c)})}r(n,"open",async(...o)=>{let a=await e.openPromise(...o);return new s(a)})}}t.read[lh.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n})}function SE(t,e){let r=Object.create(t);return pb(r,e),r}var kO=ie(require("os"));function PO(t){let e=M.toPortablePath(kO.default.tmpdir()),r=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return v.join(e,`${t}${r}`)}var vs=new Set,DO=!1;function RO(){DO||(DO=!0,process.once("exit",()=>{T.rmtempSync()}))}var T=Object.assign(new Wt,{detachTemp(t){vs.delete(t)},mktempSync(t){for(RO();;){let e=PO("xfs-");try{this.mkdirSync(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=this.realpathSync(e);if(vs.add(r),typeof t!="undefined")try{return t(r)}finally{if(vs.has(r)){vs.delete(r);try{this.removeSync(r)}catch{}}}else return r}},async mktempPromise(t){for(RO();;){let e=PO("xfs-");try{await this.mkdirPromise(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=await this.realpathPromise(e);if(vs.add(r),typeof t!="undefined")try{return await t(r)}finally{if(vs.has(r)){vs.delete(r);try{await this.removePromise(r)}catch{}}}else return r}},async rmtempPromise(){await Promise.all(Array.from(vs.values()).map(async t=>{try{await T.removePromise(t,{maxRetries:0}),vs.delete(t)}catch{}}))},rmtempSync(){for(let t of vs)try{T.removeSync(t),vs.delete(t)}catch{}}});var vb=ie(bb()),Pn;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(Pn||(Pn={}));function dl(t){return t!==null&&typeof t.fd=="number"}var Cl=new Set;function Sb(){}function xb(){for(let t of Cl)t.kill()}async function to(t,e,{cwd:r,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":dl(s)&&(c[0]=s),dl(o)&&(c[1]=o),dl(a)&&(c[2]=a);let u=(0,vb.default)(t,e,{cwd:M.fromPortablePath(r),env:_(P({},i),{PWD:M.fromPortablePath(r)}),stdio:c});Cl.add(u),Cl.size===1&&(process.on("SIGINT",Sb),process.on("SIGTERM",xb)),!dl(s)&&s!==null&&s.pipe(u.stdin),dl(o)||u.stdout.pipe(o,{end:!1}),dl(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))dl(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,d)=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:kb(p,d)}):h(p!==null?new Error(`Child "${t}" exited with exit code ${p}`):new Error(`Child "${t}" exited with signal ${d}`))})})}async function Nhe(t,e,{cwd:r,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=M.fromPortablePath(r);typeof i.PWD!="undefined"&&(i=_(P({},i),{PWD:c}));let u=(0,vb.default)(t,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",()=>{f()}),u.on("close",(h,p)=>{let d=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),m=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:kb(h,p),stdout:d,stderr:m}):f(Object.assign(new Error(`Child "${t}" exited with exit code ${h} - -${m}`),{code:kb(h,p),stdout:d,stderr:m}))})})}var Lhe=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function kb(t,e){let r=Lhe.get(e);return typeof r!="undefined"?128+r:t!=null?t:1}var Pb={};it(Pb,{getDefaultGlobalFolder:()=>Rb,getHomeFolder:()=>uh,isFolderInside:()=>Fb});var Db=ie(require("os"));function Rb(){if(process.platform==="win32"){let t=M.toPortablePath(process.env.LOCALAPPDATA||M.join((0,Db.homedir)(),"AppData","Local"));return v.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=M.toPortablePath(process.env.XDG_DATA_HOME);return v.resolve(t,"yarn/berry")}return v.resolve(uh(),".yarn/berry")}function uh(){return M.toPortablePath((0,Db.homedir)()||"/usr/local/share")}function Fb(t,e){let r=v.relative(e,t);return r&&!r.startsWith("..")&&!v.isAbsolute(r)}var ue={};it(ue,{LogLevel:()=>Ts,Style:()=>Gl,Type:()=>Le,addLogFilterSupport:()=>Cp,applyColor:()=>On,applyHyperlink:()=>Ku,applyStyle:()=>Py,json:()=>Uu,mark:()=>xx,pretty:()=>Ve,prettyField:()=>Yl,prettyList:()=>Kx,supportsColor:()=>xy,supportsHyperlinks:()=>Mx,tuple:()=>jl});var pp=ie(jb()),dp=ie(ml()),o3=ie(Nn()),a3=ie(gU());var z;(function(te){te[te.UNNAMED=0]="UNNAMED",te[te.EXCEPTION=1]="EXCEPTION",te[te.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",te[te.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",te[te.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",te[te.BUILD_DISABLED=5]="BUILD_DISABLED",te[te.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",te[te.MUST_BUILD=7]="MUST_BUILD",te[te.MUST_REBUILD=8]="MUST_REBUILD",te[te.BUILD_FAILED=9]="BUILD_FAILED",te[te.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",te[te.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",te[te.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",te[te.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",te[te.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",te[te.REMOTE_INVALID=15]="REMOTE_INVALID",te[te.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",te[te.RESOLUTION_PACK=17]="RESOLUTION_PACK",te[te.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",te[te.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",te[te.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",te[te.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",te[te.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",te[te.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",te[te.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",te[te.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",te[te.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",te[te.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",te[te.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",te[te.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",te[te.FETCH_FAILED=30]="FETCH_FAILED",te[te.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",te[te.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",te[te.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",te[te.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",te[te.NETWORK_ERROR=35]="NETWORK_ERROR",te[te.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",te[te.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",te[te.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",te[te.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",te[te.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",te[te.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",te[te.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",te[te.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",te[te.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",te[te.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",te[te.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",te[te.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",te[te.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",te[te.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",te[te.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",te[te.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",te[te.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",te[te.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",te[te.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",te[te.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",te[te.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",te[te.INVALID_MANIFEST=57]="INVALID_MANIFEST",te[te.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",te[te.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",te[te.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",te[te.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",te[te.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",te[te.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",te[te.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",te[te.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",te[te.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",te[te.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",te[te.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",te[te.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",te[te.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",te[te.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",te[te.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",te[te.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",te[te.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",te[te.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",te[te.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",te[te.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE"})(z||(z={}));function KE(t){return`YN${t.toString(10).padStart(4,"0")}`}var de={};it(de,{BufferStream:()=>OH,CachingStrategy:()=>Dl,DefaultStream:()=>KH,assertNever:()=>Lv,bufferStream:()=>Cu,buildIgnorePattern:()=>DEe,convertMapsToIndexableObjects:()=>aI,dynamicRequire:()=>mu,escapeRegExp:()=>SEe,getArrayWithDefault:()=>hu,getFactoryWithDefault:()=>na,getMapWithDefault:()=>pu,getSetWithDefault:()=>Pl,isIndexableObject:()=>Tv,isPathLike:()=>REe,isTaggedYarnVersion:()=>vEe,mapAndFilter:()=>kl,mapAndFind:()=>MH,overrideType:()=>Nv,parseBoolean:()=>Hh,parseOptionalBoolean:()=>jH,prettifyAsyncErrors:()=>du,prettifySyncErrors:()=>Mv,releaseAfterUseAsync:()=>kEe,replaceEnvVariables:()=>Ov,sortMap:()=>gn,tryParseOptionalBoolean:()=>Kv,validateEnum:()=>xEe});var vh={};it(vh,{Builtins:()=>Iv,Cli:()=>oo,Command:()=>ye,Option:()=>Y,UsageError:()=>me});var yl=0,Eh=1,Gi=2,sv="",hi="\0",Au=-1,ov=/^(-h|--help)(?:=([0-9]+))?$/,UE=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,fU=/^-[a-zA-Z]{2,}$/,av=/^([^=]+)=([\s\S]*)$/,Av=process.env.DEBUG_CLI==="1";var me=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ih=class extends Error{constructor(e,r){super();if(this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===r[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${lv(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${lv(e)}`}},cv=class extends Error{constructor(e,r){super();this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${lv(e)}`}},lv=t=>`While running ${t.filter(e=>e!==hi).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`;var yh=Symbol("clipanion/isOption");function ji(t){return _(P({},t),{[yh]:!0})}function so(t,e){return typeof t=="undefined"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function HE(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function wh(t,e){return e.length===1?new me(`${t}: ${HE(e[0],!0)}`):new me(`${t}: -${e.map(r=>` -- ${HE(r)}`).join("")}`)}function Bh(t,e,r){if(typeof r=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!r(e,{errors:i,coercions:n,coercion:s}))throw wh(`Invalid value for ${t}`,i);for(let[,a]of n)a();return e}var ye=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(typeof r!="undefined"){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(Ss(),lu)),a=o(n(s()),r),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw wh("Invalid option schema",l);for(let[,g]of c)g()}let i=await this.execute();return typeof i!="undefined"?i:0}};ye.isOption=yh;ye.Default=[];function un(t){Av&&console.log(t)}var BU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Au};function QU(){return{nodes:[qi(),qi(),qi()]}}function nCe(t){let e=QU(),r=[],i=e.nodes.length;for(let n of t){r.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=t.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)r(a);for(let[,{to:o}]of n.dynamics)r(o);for(let{to:o}of n.shortcuts)r(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=t.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};r(yl)}function oCe(t,{prefix:e=""}={}){if(Av){un(`${e}Nodes are:`);for(let r=0;rl!==Gi).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===Gi))throw new Ih(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=aCe(a)}if(i.length>0){un(" Results:");for(let s of i)un(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else un(" No results");return i}function ACe(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,hi)){for(let{to:r}of t.statics[hi])if(r===Eh)return!0}return!1}function cCe(t,e,r){let i=r&&e.length>0?[""]:[],n=vU(t,e,r),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let d=t.nodes[p],m=Object.keys(d.statics);for(let I of Object.keys(d.statics)){let B=m[0];for(let{to:b,reducer:R}of d.statics[B])R==="pushPath"&&(u||l.push(B),g.push(b))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=t.nodes[l],g=ACe(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==hi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===Gi)continue;let p=lCe(f,c);if(p!==null)for(let d of p)a([...i,d],l)}}return[...s].sort()}function gCe(t,e){let r=vU(t,[...e,hi]);return uCe(e,r.map(({state:i})=>i))}function aCe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function uCe(t,e){let r=e.filter(g=>g.selectedIndex!==null);if(r.length===0)throw new Error;let i=r.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ih(t,r.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=fCe(c);if(u.length>1)throw new cv(t,u.map(g=>g.candidateUsage));return u[0]}function fCe(t){let e=[],r=[];for(let i of t)i.selectedIndex===Au?r.push(i):e.push(i);return r.length>0&&e.push(_(P({},BU),{path:SU(...r.map(i=>i.path)),options:r.reduce((i,n)=>i.concat(n.options),[])})),e}function SU(t,e,...r){return e===void 0?Array.from(t):SU(t.filter((i,n)=>i===e[n]),...r)}function qi(){return{dynamics:[],shortcuts:[],statics:{}}}function bU(t){return t===Eh||t===Gi}function Cv(t,e=0){return{to:bU(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function iCe(t,e=0){let r=qi();for(let[i,n]of t.dynamics)r.dynamics.push([i,Cv(n,e)]);for(let i of t.shortcuts)r.shortcuts.push(Cv(i,e));for(let[i,n]of Object.entries(t.statics))r.statics[i]=n.map(s=>Cv(s,e));return r}function pi(t,e,r,i,n){t.nodes[e].dynamics.push([r,{to:i,reducer:n}])}function cu(t,e,r,i){t.nodes[e].shortcuts.push({to:r,reducer:i})}function ta(t,e,r,i,n){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:i,reducer:n})}function jE(t,e,r,i){if(Array.isArray(e)){let[n,...s]=e;return t[n](r,i,...s)}else return t[e](r,i)}function lCe(t,e){let r=Array.isArray(t)?YE[t[0]]:YE[t];if(typeof r.suggest=="undefined")return null;let i=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...i)}var YE={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,i)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&fU.test(e)&&[...e.slice(1)].every(i=>r.includes(`-${i}`)),isBoundOption:(t,e,r,i)=>{let n=e.match(av);return!t.ignoreOptions&&!!n&&UE.test(n[1])&&r.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&ov.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&UE.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!UE.test(e)};YE.isOption.suggest=(t,e,r=!0)=>r?null:[e];var dv={setCandidateState:(t,e,r)=>P(P({},t),r),setSelectedIndex:(t,e,r)=>_(P({},t),{selectedIndex:r}),pushBatch:(t,e)=>_(P({},t),{options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,i]=e.match(av);return _(P({},t),{options:t.options.concat({name:r,value:i})})},pushPath:(t,e)=>_(P({},t),{path:t.path.concat(e)}),pushPositional:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:Ln})}),pushTrue:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>_(P({},t),{options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let i=_(P({},t),{options:[...t.options]}),n=t.options[t.options.length-1];return n.value=((r=n.value)!==null&&r!==void 0?r:[]).concat([e]),i},setStringValue:(t,e)=>{let r=_(P({},t),{options:[...t.options]}),i=t.options[t.options.length-1];return i.value=e,r},inhibateOptions:t=>_(P({},t),{ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,i]=e.match(ov);return typeof i!="undefined"?_(P({},t),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):_(P({},t),{options:[{name:"-c",value:String(r)}]})},setError:(t,e,r)=>e===hi?_(P({},t),{errorMessage:`${r}.`}):_(P({},t),{errorMessage:`${r} ("${e}").`}),setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return _(P({},t),{errorMessage:`Not enough arguments to option ${r.name}.`})}},Ln=Symbol(),xU=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:i,proxy:n})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Ln)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Ln?this.arity.extra.push(e):this.arity.extra!==Ln&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Ln)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 i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Ln?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=QU(),r=yl,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);r=xs(e,qi()),ta(e,yl,sv,r,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=r;if(a.length>0){let f=xs(e,qi());cu(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=xs(e,qi());pi(e,l,"isHelp",f,["useHelp",this.cliIndex]),ta(e,f,hi,Eh,["setSelectedIndex",Au]),this.registerOptions(e,l)}this.arity.leading.length>0&&ta(e,l,hi,Gi,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&ta(e,h,hi,Gi,["setError","Not enough positional arguments"]),pi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Ln||this.arity.extra.length>0){let f=xs(e,qi());if(cu(e,c,f),this.arity.extra===Ln){let h=xs(e,qi());this.arity.proxy||this.registerOptions(e,h),pi(e,c,s,h,"pushExtraNoLimits"),pi(e,h,s,h,"pushExtraNoLimits"),cu(e,h,f)}else for(let h=0;h0&&ta(e,u,hi,Gi,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)pi(e,r,["isOption",s,i.hidden||s!==n],r,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&pi(e,r,["isNegatedOption",s],r,["pushFalse",s]);else{let s=xs(e,qi());for(let o of i.names)pi(e,r,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&egCe(i,n),suggest:(n,s)=>cCe(i,n,s)}}};var kU=80,mv=Array(kU).fill("\u2501");for(let t=0;t<=24;++t)mv[mv.length-t]=`[38;5;${232+t}m\u2501`;var Ev={header:t=>`\u2501\u2501\u2501 ${t}${t.length`${t}`,error:t=>`${t}`,code:t=>`${t}`},PU={header:t=>t,bold:t=>t,error:t=>t,code:t=>t};function hCe(t){let e=t.split(` -`),r=e.filter(n=>n.match(/\S/)),i=r.length>0?r.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function Vn(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` -`),t=hCe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),t=t.replace(/\n(\n)?\n*/g,"$1"),r&&(t=t.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),t?`${t} -`:""}var bh=class extends ye{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,r){let i=new bh(r);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let r=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var DU=Symbol("clipanion/errorCommand");function pCe(){return process.env.FORCE_COLOR==="0"?!1:!!(process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY)}var oo=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:i,enableColors:n=pCe()}={}){this.registrations=new Map,this.builder=new Qh({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=i,this.enableColors=n}static from(e,r={}){let i=new oo(r);for(let n of e)i.register(n);return i}register(e){var r;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[ye.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(r=e.paths)!==null&&r!==void 0?r:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:r,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case Au:return bh.from(n,r);default:{let{commandClass:s}=r[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[DU]=a,l}}break}}async run(e,r){let i;if(!Array.isArray(e))i=e;else try{i=this.process(e)}catch(s){return r.stdout.write(this.error(s)),1}if(i.help)return r.stdout.write(this.usage(i,{detailed:!0})),0;i.context=r,i.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(s,o)=>this.error(s,o),process:s=>this.process(s),run:(s,o)=>this.run(s,P(P({},r),o)),usage:(s,o)=>this.usage(s,o)};let n;try{n=await i.validateAndExecute().catch(s=>i.catch(s).then(()=>0))}catch(s){return r.stdout.write(this.error(s,{command:i})),1}return n}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:i}=this.builder.compile();return i(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Vn(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Vn(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Vn(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Vn(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return r}usage(e=null,{colored:r,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof ye?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Vn(l,{format:this.format(r),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(r).header("Usage")} -`,a+=` -`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(r).bold(n)}${g} -`,f.length>0){a+=` -`,a+=`${Ev.header("Options")} -`;let h=f.reduce((p,d)=>Math.max(p,d.definition.length),0);a+=` -`;for(let{definition:p,description:d}of f)a+=` ${this.format(r).bold(p.padEnd(h))} ${Vn(d,{format:this.format(r),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(r).header("Details")} -`,a+=` -`,a+=Vn(c,{format:this.format(r),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(r).header("Examples")} -`;for(let[h,p]of u)a+=` -`,a+=Vn(h,{format:this.format(r),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(r).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(r).bold(n)}${l} -`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Vn(f.usage.category,{format:this.format(r),paragraphs:!1}):null,d=l.get(p);typeof d=="undefined"&&l.set(p,d=[]);let{usage:m}=this.getUsageByIndex(h);d.push({commandClass:f,usage:m})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(r).header(`${this.binaryLabel}`)} -`:a+=`${this.format(r).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(r).bold(n)}${this.binaryName} -`):a+=`${this.format(r).bold(n)}${this.binaryName} -`;for(let f of c){let h=l.get(f).slice().sort((d,m)=>d.usage.localeCompare(m.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` -`,a+=`${this.format(r).header(`${p}`)} -`;for(let{commandClass:d,usage:m}of h){let I=d.usage.description||"undocumented";a+=` -`,a+=` ${this.format(r).bold(m)} -`,a+=` ${Vn(I,{format:this.format(r),paragraphs:!1})}`}}a+=` -`,a+=Vn("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return a}error(e,r){var i,{colored:n,command:s=(i=e[DU])!==null&&i!==void 0?i:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}getUsageByRegistration(e,r){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}format(e=this.enableColors){return e?Ev:PU}};oo.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr};var Iv={};it(Iv,{DefinitionsCommand:()=>qE,HelpCommand:()=>JE,VersionCommand:()=>WE});var qE=class extends ye{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};qE.paths=[["--clipanion=definitions"]];var JE=class extends ye{async execute(){this.context.stdout.write(this.cli.usage())}};JE.paths=[["-h"],["--help"]];var WE=class extends ye{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};WE.paths=[["-v"],["--version"]];var Y={};it(Y,{Array:()=>RU,Boolean:()=>FU,Counter:()=>NU,Proxy:()=>LU,Rest:()=>TU,String:()=>MU,applyValidator:()=>Bh,cleanValidationError:()=>HE,formatError:()=>wh,isOptionSymbol:()=>yh,makeCommandOption:()=>ji,rerouteArguments:()=>so});function RU(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function FU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function NU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function LU(t={}){return ji({definition(e,r){var i;e.addProxy({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){return i.positionals.map(({value:n})=>n)}})}function TU(t={}){return ji({definition(e,r){var i;e.addRest({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){let n=o=>{let a=i.positionals[o];return a.extra===Ln||a.extra===!1&&oo)}})}function dCe(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?Bh(g!=null?g:c,f,n.validator):f}})}function CCe(t={}){let{required:e=!0}=t;return ji({definition(r,i){var n;r.addPositional({name:(n=t.name)!==null&&n!==void 0?n:i,required:t.required})},transformer(r,i,n){var s;for(let o=0;oJSON.stringify(i)).join(", ")})`);return e}function kl(t,e){let r=[];for(let i of t){let n=e(i);n!==LH&&r.push(n)}return r}var LH=Symbol();kl.skip=LH;function MH(t,e){for(let r of t){let i=e(r);if(i!==TH)return i}}var TH=Symbol();MH.skip=TH;function Tv(t){return typeof t=="object"&&t!==null}function aI(t){if(t instanceof Map&&(t=Object.fromEntries(t)),Tv(t))for(let e of Object.keys(t)){let r=t[e];Tv(r)&&(t[e]=aI(r))}return t}function na(t,e,r){let i=t.get(e);return typeof i=="undefined"&&t.set(e,i=r()),i}function hu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=[]),r}function Pl(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Set),r}function pu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Map),r}async function kEe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function du(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function Mv(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Cu(t){return await new Promise((e,r)=>{let i=[];t.on("error",n=>{r(n)}),t.on("data",n=>{i.push(n)}),t.on("end",()=>{e(Buffer.concat(i))})})}var OH=class extends Fv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}},KH=class extends Fv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},Uh=eval("require");function UH(t){return Uh(M.fromPortablePath(t))}function HH(path){let physicalPath=M.fromPortablePath(path),currentCacheEntry=Uh.cache[physicalPath];delete Uh.cache[physicalPath];let result;try{result=UH(physicalPath);let freshCacheEntry=Uh.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{Uh.cache[physicalPath]=currentCacheEntry}return result}var GH=new Map;function PEe(t){let e=GH.get(t),r=T.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let i=HH(t);return GH.set(t,{mtime:r.mtimeMs,instance:i}),i}var Dl;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Dl||(Dl={}));function mu(t,{cachingStrategy:e=2}={}){switch(e){case 0:return HH(t);case 1:return PEe(t);case 2:return UH(t);default:throw new Error("Unsupported caching strategy")}}function gn(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(r.map(o=>s(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function DEe(t){return t.length===0?null:t.map(e=>`(${FH.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Ov(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new me(`Environment variable not found (${n})`)})}function Hh(t){switch(t){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 "${t}" as a boolean`)}}function jH(t){return typeof t=="undefined"?t:Hh(t)}function Kv(t){try{return jH(t)}catch{return null}}function REe(t){return!!(M.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}var S={};it(S,{areDescriptorsEqual:()=>i3,areIdentsEqual:()=>cp,areLocatorsEqual:()=>up,areVirtualPackagesEquivalent:()=>XQe,bindDescriptor:()=>VQe,bindLocator:()=>_Qe,convertDescriptorToLocator:()=>By,convertLocatorToDescriptor:()=>WQe,convertPackageToLocator:()=>zQe,convertToIdent:()=>JQe,convertToManifestRange:()=>ebe,copyPackage:()=>ap,devirtualizeDescriptor:()=>Ap,devirtualizeLocator:()=>lp,getIdentVendorPath:()=>Lx,isPackageCompatible:()=>Sy,isVirtualDescriptor:()=>hA,isVirtualLocator:()=>Io,makeDescriptor:()=>Yt,makeIdent:()=>Eo,makeLocator:()=>Vi,makeRange:()=>by,parseDescriptor:()=>pA,parseFileStyleRange:()=>ZQe,parseIdent:()=>En,parseLocator:()=>Hl,parseRange:()=>Tu,prettyDependent:()=>Nx,prettyDescriptor:()=>Xt,prettyIdent:()=>Vr,prettyLocator:()=>lt,prettyLocatorNoColors:()=>Rx,prettyRange:()=>yy,prettyReference:()=>fp,prettyResolution:()=>Fx,prettyWorkspace:()=>hp,renamePackage:()=>op,slugifyIdent:()=>Dx,slugifyLocator:()=>Mu,sortDescriptors:()=>Ou,stringifyDescriptor:()=>In,stringifyIdent:()=>St,stringifyLocator:()=>is,tryParseDescriptor:()=>gp,tryParseIdent:()=>n3,tryParseLocator:()=>Qy,virtualizeDescriptor:()=>kx,virtualizePackage:()=>Px});var Lu=ie(require("querystring")),e3=ie(Or()),t3=ie(wY());var mn={};it(mn,{checksumFile:()=>Ey,checksumPattern:()=>Iy,makeHash:()=>zi});var my=ie(require("crypto")),Sx=ie(vx());function zi(...t){let e=(0,my.createHash)("sha512"),r="";for(let i of t)typeof i=="string"?r+=i:i&&(r&&(e.update(r),r=""),e.update(i));return r&&e.update(r),e.digest("hex")}async function Ey(t,{baseFs:e,algorithm:r}={baseFs:T,algorithm:"sha512"}){let i=await e.openPromise(t,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,my.createHash)(r),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function Iy(t,{cwd:e}){let i=(await(0,Sx.default)(t,{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,Sx.default)([t,...i],{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=M.toPortablePath(a),u=await T.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await T.readlinkPromise(c))):u.isFile()&&l.push(await T.readFilePromise(c)),l.join("\0")})),o=(0,my.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var wy="virtual:",YQe=5,r3=/(os|cpu)=([a-z0-9_-]+)/,qQe=(0,t3.makeParser)(r3);function Eo(t,e){if(t==null?void 0:t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:zi(t,e),scope:t,name:e}}function Yt(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:zi(t.identHash,e),range:e}}function Vi(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:zi(t.identHash,e),reference:e}}function JQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function By(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function WQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function zQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function op(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function ap(t){return op(t,t)}function kx(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return Yt(t,`virtual:${e}#${t.range}`)}function Px(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return op(t,Vi(t,`virtual:${e}#${t.reference}`))}function hA(t){return t.range.startsWith(wy)}function Io(t){return t.reference.startsWith(wy)}function Ap(t){if(!hA(t))throw new Error("Not a virtual descriptor");return Yt(t,t.range.replace(/^[^#]*#/,""))}function lp(t){if(!Io(t))throw new Error("Not a virtual descriptor");return Vi(t,t.reference.replace(/^[^#]*#/,""))}function VQe(t,e){return t.range.includes("::")?t:Yt(t,`${t.range}::${Lu.default.stringify(e)}`)}function _Qe(t,e){return t.reference.includes("::")?t:Vi(t,`${t.reference}::${Lu.default.stringify(e)}`)}function cp(t,e){return t.identHash===e.identHash}function i3(t,e){return t.descriptorHash===e.descriptorHash}function up(t,e){return t.locatorHash===e.locatorHash}function XQe(t,e){if(!Io(t))throw new Error("Invalid package type");if(!Io(e))throw new Error("Invalid package type");if(!cp(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let i=e.dependencies.get(r.identHash);if(!i||!i3(r,i))return!1}return!0}function En(t){let e=n3(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function n3(t){let e=t.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,r,i]=e,n=typeof r!="undefined"?r:null;return Eo(n,i)}function pA(t,e=!1){let r=gp(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function gp(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid range (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Yt(Eo(o,n),a)}function Hl(t,e=!1){let r=Qy(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function Qy(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid reference (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Vi(Eo(o,n),a)}function Tu(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let i=typeof r[1]!="undefined"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof r[3]!="undefined"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${t})`);let s=typeof r[3]!="undefined"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),o=(e==null?void 0:e.parseSelector)?Lu.default.parse(s):s,a=typeof r[4]!="undefined"?Lu.default.parse(r[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ZQe(t,{protocol:e}){let{selector:r,params:i}=Tu(t,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Hl(i.locator,!0),path:r}}function s3(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function $Qe(t){return t===null?!1:Object.entries(t).length>0}function by({protocol:t,source:e,selector:r,params:i}){let n="";return t!==null&&(n+=`${t}`),e!==null&&(n+=`${s3(e)}#`),n+=s3(r),$Qe(i)&&(n+=`::${Lu.default.stringify(i)}`),n}function ebe(t){let{params:e,protocol:r,source:i,selector:n}=Tu(t);for(let s in e)s.startsWith("__")&&delete e[s];return by({protocol:r,source:i,params:e,selector:n})}function St(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function In(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function is(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function Dx(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function Mu(t){let{protocol:e,selector:r}=Tu(t.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=e3.default.valid(r),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=t.scope?`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`:`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`;return kr(a)}function Vr(t,e){return e.scope?`${Ve(t,`@${e.scope}/`,Le.SCOPE)}${Ve(t,e.name,Le.NAME)}`:`${Ve(t,e.name,Le.NAME)}`}function vy(t){if(t.startsWith(wy)){let e=vy(t.substr(t.indexOf("#")+1)),r=t.substr(wy.length,YQe);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function yy(t,e){return`${Ve(t,vy(e),Le.RANGE)}`}function Xt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.RANGE)}${yy(t,e.range)}`}function fp(t,e){return`${Ve(t,vy(e),Le.REFERENCE)}`}function lt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.REFERENCE)}${fp(t,e.reference)}`}function Rx(t){return`${St(t)}@${vy(t.reference)}`}function Ou(t){return gn(t,[e=>St(e),e=>e.range])}function hp(t,e){return Vr(t,e.locator)}function Fx(t,e,r){let i=hA(e)?Ap(e):e;return r===null?`${Xt(t,i)} \u2192 ${xx(t).Cross}`:i.identHash===r.identHash?`${Xt(t,i)} \u2192 ${fp(t,r.reference)}`:`${Xt(t,i)} \u2192 ${lt(t,r)}`}function Nx(t,e,r){return r===null?`${lt(t,e)}`:`${lt(t,e)} (via ${yy(t,r.range)})`}function Lx(t){return`node_modules/${St(t)}`}function Sy(t,e){return t.conditions?qQe(t.conditions,r=>{let[,i,n]=r.match(r3),s=e[i];return s?s.includes(n):!0}):!0}var gt;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(gt||(gt={}));var oi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(oi||(oi={}));var ki;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(ki||(ki={}));var Le={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING"},Gl;(function(e){e[e.BOLD=2]="BOLD"})(Gl||(Gl={}));var Tx=dp.default.GITHUB_ACTIONS?{level:2}:pp.default.supportsColor?{level:pp.default.supportsColor.level}:{level:0},xy=Tx.level!==0,Mx=xy&&!dp.default.GITHUB_ACTIONS&&!dp.default.CIRCLE&&!dp.default.GITLAB,Ox=new pp.default.Instance(Tx),tbe=new Map([[Le.NO_HINT,null],[Le.NULL,["#a853b5",129]],[Le.SCOPE,["#d75f00",166]],[Le.NAME,["#d7875f",173]],[Le.RANGE,["#00afaf",37]],[Le.REFERENCE,["#87afff",111]],[Le.NUMBER,["#ffd700",220]],[Le.PATH,["#d75fd7",170]],[Le.URL,["#d75fd7",170]],[Le.ADDED,["#5faf00",70]],[Le.REMOVED,["#d70000",160]],[Le.CODE,["#87afff",111]],[Le.SIZE,["#ffd700",220]]]),Ls=t=>t,ky={[Le.NUMBER]:Ls({pretty:(t,e)=>`${e}`,json:t=>t}),[Le.IDENT]:Ls({pretty:(t,e)=>Vr(t,e),json:t=>St(t)}),[Le.LOCATOR]:Ls({pretty:(t,e)=>lt(t,e),json:t=>is(t)}),[Le.DESCRIPTOR]:Ls({pretty:(t,e)=>Xt(t,e),json:t=>In(t)}),[Le.RESOLUTION]:Ls({pretty:(t,{descriptor:e,locator:r})=>Fx(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:In(t),locator:e!==null?is(e):null})}),[Le.DEPENDENT]:Ls({pretty:(t,{locator:e,descriptor:r})=>Nx(t,e,r),json:({locator:t,descriptor:e})=>({locator:is(t),descriptor:In(e)})}),[Le.PACKAGE_EXTENSION]:Ls({pretty:(t,e)=>{switch(e.type){case oi.Dependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"dependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependencyMeta:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependenciesMeta",Le.CODE)} \u27A4 ${Vr(t,En(e.selector))} \u27A4 ${On(t,e.key,Le.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case oi.Dependency:return`${St(t.parentDescriptor)} > ${St(t.descriptor)}`;case oi.PeerDependency:return`${St(t.parentDescriptor)} >> ${St(t.descriptor)}`;case oi.PeerDependencyMeta:return`${St(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Le.SETTING]:Ls({pretty:(t,e)=>(t.get(e),Ku(t,On(t,e,Le.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Le.DURATION]:Ls({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),i=Math.ceil((e-r*60*1e3)/1e3);return i===0?`${r}m`:`${r}m ${i}s`}else{let r=Math.floor(e/1e3),i=e-r*1e3;return i===0?`${r}s`:`${r}s ${i}ms`}},json:t=>t}),[Le.SIZE]:Ls({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],i=r.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return On(t,`${s} ${r[i-1]}`,Le.NUMBER)},json:t=>t}),[Le.PATH]:Ls({pretty:(t,e)=>On(t,M.fromPortablePath(e),Le.PATH),json:t=>M.fromPortablePath(t)})};function jl(t,e){return[e,t]}function Py(t,e,r){return t.get("enableColors")&&r&2&&(e=pp.default.bold(e)),e}function On(t,e,r){if(!t.get("enableColors"))return e;let i=tbe.get(r);if(i===null)return e;let n=typeof i=="undefined"?r:Tx.level>=3?i[0]:i[1],s=typeof n=="number"?Ox.ansi256(n):n.startsWith("#")?Ox.hex(n):Ox[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var rbe=!!process.env.KONSOLE_VERSION;function Ku(t,e,r){return t.get("enableHyperlinks")?rbe?`]8;;${r}\\${e}]8;;\\`:`]8;;${r}\x07${e}]8;;\x07`:e}function Ve(t,e,r){if(e===null)return On(t,"null",Le.NULL);if(Object.prototype.hasOwnProperty.call(ky,r))return ky[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return On(t,e,r)}function Kx(t,e,r,{separator:i=", "}={}){return[...e].map(n=>Ve(t,n,r)).join(i)}function Uu(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(ky,e))return Nv(e),ky[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function xx(t){return{Check:On(t,"\u2713","green"),Cross:On(t,"\u2718","red"),Question:On(t,"?","cyan")}}function Yl(t,{label:e,value:[r,i]}){return`${Ve(t,e,Le.CODE)}: ${Ve(t,r,i)}`}var Ts;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(Ts||(Ts={}));function Cp(t,{configuration:e}){let r=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of r){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let d=g.get("pattern");typeof d!="undefined"&&s.push([o3.default.matcher(d,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===z.UNNAMED)return h;let p=n.size>0||s.length>0?(0,a3.default)(f):f;if(n.size>0){let d=n.get(p);if(typeof d!="undefined")return d!=null?d:h}if(s.length>0){for(let[d,m]of s)if(d(p))return m!=null?m:h}if(i.size>0){let d=i.get(KE(g));if(typeof d!="undefined")return d!=null?d:h}return h},a=t.reportInfo,l=t.reportWarning,c=t.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case Ts.Info:a.call(g,f,h);break;case Ts.Warning:l.call(g,f!=null?f:z.UNNAMED,h);break;case Ts.Error:c.call(g,f!=null?f:z.UNNAMED,h);break}};t.reportInfo=function(...g){return u(this,...g,Ts.Info)},t.reportWarning=function(...g){return u(this,...g,Ts.Warning)},t.reportError=function(...g){return u(this,...g,Ts.Error)}}var Zt={};it(Zt,{Method:()=>Jl,RequestError:()=>z8.RequestError,del:()=>pxe,get:()=>fxe,getNetworkSettings:()=>Z8,post:()=>iP,put:()=>hxe,request:()=>xp});var q8=ie(zy()),J8=ie(require("https")),W8=ie(require("http")),tP=ie(Nn()),rP=ie(G8()),Vy=ie(require("url"));var j8=ie(require("stream")),Y8=ie(require("string_decoder"));var nt=class extends Error{constructor(e,r,i){super(r);this.reportExtra=i;this.reportCode=e}};function Axe(t){return typeof t.reportCode!="undefined"}var Xi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),r=l,c()},o=(l=0)=>{s(r+1)},a=async function*(){for(;r{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),r}};var z8=ie(zy()),V8=new Map,_8=new Map,lxe=new W8.Agent({keepAlive:!0}),cxe=new J8.Agent({keepAlive:!0});function X8(t){let e=new Vy.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),{proxy:r}}async function uxe(t){return na(_8,t,()=>T.readFilePromise(t).then(e=>(_8.set(t,e),e)))}function gxe({statusCode:t,statusMessage:e},r){let i=Ve(r,t,Le.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Ku(r,`${i}${e?` (${e})`:""}`,n)}async function _y(t,{configuration:e,customErrorMessage:r}){var i,n;try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=r==null?void 0:r(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof q8.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${Ve(e,"httpTimeout",Le.SETTING)})`);let a=new nt(z.NETWORK_ERROR,o,l=>{s.response&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Response Code",value:jl(Le.NO_HINT,gxe(s.response,e))})}`),s.request&&(l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Method",value:jl(Le.NO_HINT,s.request.options.method)})}`),l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request URL",value:jl(Le.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Redirects",value:jl(Le.NO_HINT,Kx(e,s.request.redirects,Le.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Retry Count",value:jl(Le.NO_HINT,`${Ve(e,s.request.retryCount,Le.NUMBER)} (can be increased via ${Ve(e,"httpRetry",Le.SETTING)})`)})}`)});throw a.originalError=s,a}}function Z8(t,e){let r=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0},n=Object.keys(i),s=typeof t=="string"?new Vy.URL(t):t;for(let[o,a]of r)if(tP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Jl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Jl||(Jl={}));async function xp(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=Jl.GET}){let a=typeof t=="string"?new Vy.URL(t):t,l=Z8(a,{configuration:r});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!tP.default.isMatch(a.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?rP.default.httpOverHttp(X8(l.httpProxy)):lxe,https:l.httpsProxy?rP.default.httpsOverHttp(X8(l.httpsProxy)):cxe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=r.get("httpTimeout"),f=r.get("httpRetry"),h=r.get("enableStrictSsl"),p=l.caFilePath,{default:d}=await Promise.resolve().then(()=>ie(zy())),m=p?await uxe(p):void 0,I=d.extend(P({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:m}},u));return r.getLimit("networkConcurrency")(()=>I(a))}async function fxe(t,n){var s=n,{configuration:e,jsonResponse:r}=s,i=qr(s,["configuration","jsonResponse"]);let o=na(V8,t,()=>_y(xp(t,null,P({configuration:e},i)),{configuration:e}).then(a=>(V8.set(t,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),r?JSON.parse(o.toString()):o}async function hxe(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.PUT})),i)).body}async function iP(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.POST})),i)).body}async function pxe(t,i){var n=i,{customErrorMessage:e}=n,r=qr(n,["customErrorMessage"]);return(await _y(xp(t,null,_(P({},r),{method:Jl.DELETE})),r)).body}var Kt={};it(Kt,{PackageManager:()=>tn,detectPackageManager:()=>a9,executePackageAccessibleBinary:()=>g9,executePackageScript:()=>Uw,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>qFe,executeWorkspaceLifecycleScript:()=>u9,executeWorkspaceScript:()=>c9,getPackageAccessibleBinaries:()=>Hw,getWorkspaceAccessibleBinaries:()=>l9,hasPackageScript:()=>GFe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Vp,maybeExecuteWorkspaceLifecycleScript:()=>YFe,prepareExternalProject:()=>HFe});var Fp={};it(Fp,{getLibzipPromise:()=>$i,getLibzipSync:()=>v4});var yA=["number","number"],nP;(function(D){D[D.ZIP_ER_OK=0]="ZIP_ER_OK",D[D.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",D[D.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",D[D.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",D[D.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",D[D.ZIP_ER_READ=5]="ZIP_ER_READ",D[D.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",D[D.ZIP_ER_CRC=7]="ZIP_ER_CRC",D[D.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",D[D.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",D[D.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",D[D.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",D[D.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",D[D.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",D[D.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",D[D.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",D[D.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",D[D.ZIP_ER_EOF=17]="ZIP_ER_EOF",D[D.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",D[D.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",D[D.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",D[D.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",D[D.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",D[D.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",D[D.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",D[D.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",D[D.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",D[D.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",D[D.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",D[D.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",D[D.ZIP_ER_TELL=30]="ZIP_ER_TELL",D[D.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(nP||(nP={}));var $8=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:nP,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:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,open:t.cwrap("zip_open","number",["string","number","number"]),openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...yA,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...yA,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...yA,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...yA,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...yA,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...yA,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...yA,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...yA,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}});var BP=null;function v4(){return BP===null&&(BP=$8(b4())),BP}async function $i(){return v4()}var jp={};it(jp,{ShellError:()=>as,execute:()=>Fw,globUtils:()=>bw});var Hp={};it(Hp,{parseResolution:()=>gw,parseShell:()=>Aw,parseSyml:()=>Ii,stringifyArgument:()=>SP,stringifyArgumentSegment:()=>xP,stringifyArithmeticExpression:()=>uw,stringifyCommand:()=>vP,stringifyCommandChain:()=>rg,stringifyCommandChainThen:()=>bP,stringifyCommandLine:()=>lw,stringifyCommandLineThen:()=>QP,stringifyEnvSegment:()=>cw,stringifyRedirectArgument:()=>Np,stringifyResolution:()=>fw,stringifyShell:()=>tg,stringifyShellLine:()=>tg,stringifySyml:()=>Qa,stringifyValueArgument:()=>ig});var k4=ie(x4());function Aw(t,e={isGlobPattern:()=>!1}){try{return(0,k4.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function tg(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:i},n)=>`${lw(r)}${i===";"?n!==t.length-1||e?";":"":" &"}`).join(" ")}function lw(t){return`${rg(t.chain)}${t.then?` ${QP(t.then)}`:""}`}function QP(t){return`${t.type} ${lw(t.line)}`}function rg(t){return`${vP(t)}${t.then?` ${bP(t.then)}`:""}`}function bP(t){return`${t.type} ${rg(t.chain)}`}function vP(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cw(e)).join(" ")} `:""}${t.args.map(e=>SP(e)).join(" ")}`;case"subshell":return`(${tg(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"group":return`{ ${tg(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cw(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cw(t){return`${t.name}=${t.args[0]?ig(t.args[0]):""}`}function SP(t){switch(t.type){case"redirection":return Np(t);case"argument":return ig(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Np(t){return`${t.subtype} ${t.args.map(e=>ig(e)).join(" ")}`}function ig(t){return t.segments.map(e=>xP(e)).join("")}function xP(t){let e=(i,n)=>n?`"${i}"`:i,r=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${tg(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue=="undefined"?`\${${t.name}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(i=>ig(i)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${uw(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function uw(t){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},r=(n,s)=>s?`( ${n} )`:n,i=n=>r(uw(n),!["number","variable"].includes(n.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${i(t.left)} ${e(t.type)} ${i(t.right)}`}}var R4=ie(D4());function gw(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,R4.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fw(t){let e="";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+="/"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var Qw=ie(w5()),b5=ie(Q5()),$De=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,v5=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],HP=class{constructor(e){this.data=e}};function S5(t){return t.match($De)?t:JSON.stringify(t)}function x5(t){return typeof t=="undefined"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>x5(t[e])):!1}function GP(t,e,r){if(t===null)return`null -`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} -`;if(typeof t=="string")return`${S5(t)} -`;if(Array.isArray(t)){if(t.length===0)return`[] -`;let i=" ".repeat(e);return` -${t.map(s=>`${i}- ${GP(s,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let i,n;t instanceof HP?(i=t.data,n=!1):(i=t,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=v5.indexOf(l),g=v5.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!x5(i[l])).map((l,c)=>{let u=i[l],g=S5(l),f=GP(u,e+1,!0),h=c>0||r?s:"";return f.startsWith(` -`)?`${h}${g}:${f}`:`${h}${g}: ${f}`}).join(e===0?` -`:"")||` -`;return r?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${t})`)}function Qa(t){try{let e=GP(t,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Qa.PreserveOrdering=HP;function eRe(t){return t.endsWith(` -`)||(t+=` -`),(0,b5.parse)(t)}var tRe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function rRe(t){if(tRe.test(t))return eRe(t);let e=(0,Qw.safeLoad)(t,{schema:Qw.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Ii(t){return rRe(t)}var U5=ie(jb()),H5=ie(require("os")),Kn=ie(require("stream")),G5=ie(require("util"));var as=class extends Error{constructor(e){super(e);this.name="ShellError"}};var bw={};it(bw,{fastGlobOptions:()=>D5,isBraceExpansion:()=>R5,isGlobPattern:()=>iRe,match:()=>nRe,micromatchOptions:()=>Sw});var k5=ie(gy()),P5=ie(require("fs")),vw=ie(Nn()),Sw={strictBrackets:!0},D5={onlyDirectories:!1,onlyFiles:!1};function iRe(t){if(!vw.default.scan(t,Sw).isGlob)return!1;try{vw.default.parse(t,Sw)}catch{return!1}return!0}function nRe(t,{cwd:e,baseFs:r}){return(0,k5.default)(t,_(P({},D5),{cwd:M.fromPortablePath(e),fs:SE(P5.default,new ah(r))}))}function R5(t){return vw.default.scan(t,Sw).isBrace}var F5=ie(bb()),Bo=ie(require("stream")),N5=ie(require("string_decoder")),wn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(wn||(wn={}));var sc=new Set;function jP(){}function YP(){for(let t of sc)t.kill()}function L5(t,e,r,i){return n=>{let s=n[0]instanceof Bo.Transform?"pipe":n[0],o=n[1]instanceof Bo.Transform?"pipe":n[1],a=n[2]instanceof Bo.Transform?"pipe":n[2],l=(0,F5.default)(t,e,_(P({},i),{stdio:[s,o,a]}));return sc.add(l),sc.size===1&&(process.on("SIGINT",jP),process.on("SIGTERM",YP)),n[0]instanceof Bo.Transform&&n[0].pipe(l.stdin),n[1]instanceof Bo.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof Bo.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),u.code){case"ENOENT":n[2].write(`command not found: ${t} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${t} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("exit",u=>{sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),c(u!==null?u:129)})})}}}function T5(t){return e=>{let r=e[0]==="pipe"?new Bo.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}var Os=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},M5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Gp=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:i,stderr:n}){let s=new Gp(null,e);return s.stdin=r,s.stdout=i,s.stderr=n,s}pipeTo(e,r=1){let i=new Gp(this,e),n=new M5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(r&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(r.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function xw(t,e){return Gp.start(t,e)}function O5(t,e=null){let r=new Bo.PassThrough,i=new N5.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",t(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&t(e!==null?`${e} ${s}`:s)}),r}function K5(t,{prefix:e}){return{stdout:O5(r=>t.stdout.write(`${r} -`),t.stdout.isTTY?e:null),stderr:O5(r=>t.stderr.write(`${r} -`),t.stderr.isTTY?e:null)}}var sRe=(0,G5.promisify)(setTimeout);var Fi;(function(r){r[r.Readable=1]="Readable",r[r.Writable=2]="Writable"})(Fi||(Fi={}));function j5(t,e,r){let i=new Kn.PassThrough({autoDestroy:!0});switch(t){case wn.STDIN:(e&1)==1&&r.stdin.pipe(i,{end:!1}),(e&2)==2&&r.stdin instanceof Kn.Writable&&i.pipe(r.stdin,{end:!1});break;case wn.STDOUT:(e&1)==1&&r.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stdout,{end:!1});break;case wn.STDERR:(e&1)==1&&r.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stderr,{end:!1});break;default:throw new as(`Bad file descriptor: "${t}"`)}return i}function kw(t,e={}){let r=P(P({},t),e);return r.environment=P(P({},t.environment),e.environment),r.variables=P(P({},t.variables),e.variables),r}var oRe=new Map([["cd",async([t=(0,H5.homedir)(),...e],r,i)=>{let n=v.resolve(i.cwd,M.toPortablePath(t));if(!(await r.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new as(`cd: no such file or directory: ${t}`):o})).isDirectory())throw new as(`cd: not a directory: ${t}`);return i.cwd=n,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${M.fromPortablePath(r.cwd)} -`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,i)=>i.exitCode=parseInt(t!=null?t:i.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} -`),0)],["sleep",async([t],e,r)=>{if(typeof t=="undefined")throw new as("sleep: missing operand");let i=Number(t);if(Number.isNaN(i))throw new as(`sleep: invalid time interval '${t}'`);return await sRe(1e3*i,0)}],["__ysh_run_procedure",async(t,e,r)=>{let i=r.procedures[t[0]];return await xw(i,{stdin:new Os(r.stdin),stdout:new Os(r.stdout),stderr:new Os(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let i=r.stdin,n=r.stdout,s=r.stderr,o=[],a=[],l=[],c=0;for(;t[c]!=="--";){let g=t[c++],{type:f,fd:h}=JSON.parse(g),p=B=>{switch(h){case null:case 0:o.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},d=B=>{switch(h){case null:case 1:a.push(B);break;case 2:l.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=Number(t[c++]),I=c+m;for(let B=c;Be.baseFs.createReadStream(v.resolve(r.cwd,M.toPortablePath(t[B]))));break;case"<<<":p(()=>{let b=new Kn.PassThrough;return process.nextTick(()=>{b.write(`${t[B]} -`),b.end()}),b});break;case"<&":p(()=>j5(Number(t[B]),1,r));break;case">":case">>":{let b=v.resolve(r.cwd,M.toPortablePath(t[B]));d(b==="/dev/null"?new Kn.Writable({autoDestroy:!0,emitClose:!0,write(R,H,L){setImmediate(L)}}):e.baseFs.createWriteStream(b,f===">>"?{flags:"a"}:void 0))}break;case">&":d(j5(Number(t[B]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new Kn.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new Kn.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new Kn.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await xw(Yp(t.slice(c+1),e,r),{stdin:new Os(i),stdout:new Os(n),stderr:new Os(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function aRe(t,e,r){let i=[],n=new Kn.PassThrough;return n.on("data",s=>i.push(s)),await Pw(t,e,kw(r,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function Y5(t,e,r){let i=t.map(async s=>{let o=await oc(s.args,e,r);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Dw(t){return t.match(/[^ \r\n\t]+/g)||[]}async function q5(t,e,r,i,n=i){switch(t.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(t.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Dw(s);for(let a=0;a=0&&st+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)};async function qp(t,e,r){if(t.type==="number"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: "${t.value}", only integers are allowed`)}else if(t.type==="variable"){let i=[];await q5(_(P({},t),{quoted:!0}),e,r,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?qp({type:"variable",name:i.join(" ")},e,r):qp({type:"number",value:n},e,r)}else return ARe[t.type](await qp(t.left,e,r),await qp(t.right,e,r))}async function oc(t,e,r){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of t){let g=!1;switch(u.type){case"redirection":{let f=await oc(u.args,e,r);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await aRe(f.shell,e,r);if(f.quoted)o(h);else{let p=Dw(h);for(let d=0;d0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Yp(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let i=M.fromPortablePath(r.cwd),n=r.environment;typeof n.PWD!="undefined"&&(n=_(P({},n),{PWD:i}));let[s,...o]=t;if(s==="command")return L5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return T5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=r;r.stdin=l,r.stdout=c,r.stderr=u;try{return await a(o,e,r)}finally{r.stdin=g,r.stdout=f,r.stderr=h}})}function lRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,kw(r,{stdin:n}));return{stdin:n,promise:s}}}function cRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,r);return{stdin:n,promise:s}}}function J5(t,e,r,i){if(e.length===0)return t;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=P({},i.procedures),i.procedures[n]=t,Yp([...e,"__ysh_run_procedure",n],r,i)}}async function W5(t,e,r){let i=t,n=null,s=null;for(;i;){let o=i.then?P({},r):r,a;switch(i.type){case"command":{let l=await oc(i.args,e,r),c=await Y5(i.envs,e,r);a=i.envs.length?Yp(l,e,kw(o,{environment:c})):Yp(l,e,o)}break;case"subshell":{let l=await oc(i.args,e,r),c=lRe(i.subshell,e,o);a=J5(c,l,e,o)}break;case"group":{let l=await oc(i.args,e,r),c=cRe(i.group,e,o);a=J5(c,l,e,o)}break;case"envs":{let l=await Y5(i.envs,e,r);o.environment=P(P({},o.environment),l),a=Yp(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=xw(a,{stdin:new Os(o.stdin),stdout:new Os(o.stdout),stderr:new Os(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,wn.STDOUT);break;case"|&":s=s.pipeTo(a,wn.STDOUT|wn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function uRe(t,e,r,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return U5.default.hex(a)}if(i){let s=r.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=K5(r,{prefix:l});return r.backgroundJobs.push(W5(t,e,kw(r,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${l}, '${o(rg(t))}' has ended -`)})),0}return await W5(t,e,r)}async function gRe(t,e,r,{background:i=!1}={}){let n,s=a=>{n=a,r.variables["?"]=String(a)},o=async a=>{try{return await uRe(a.chain,e,r,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof as))throw l;return r.stderr.write(`${l.message} -`),1}};for(s(await o(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":n===0&&s(await o(t.then.line));break;case"||":n!==0&&s(await o(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return n}async function Pw(t,e,r){let i=r.backgroundJobs;r.backgroundJobs=[];let n=0;for(let{command:s,type:o}of t){if(n=await gRe(s,e,r,{background:o==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(n)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=i,n}function z5(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>Rw(e));case"arithmetic":return qP(t.arithmetic);case"shell":return JP(t.shell);default:return!1}}function Rw(t){switch(t.type){case"redirection":return t.args.some(e=>Rw(e));case"argument":return t.segments.some(e=>z5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function qP(t){switch(t.type){case"variable":return z5(t);case"number":return!1;default:return qP(t.left)||qP(t.right)}}function JP(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let i;switch(r.type){case"subshell":i=JP(r.subshell);break;case"command":i=r.envs.some(n=>n.args.some(s=>Rw(s)))||r.args.some(n=>Rw(n));break}if(i)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Fw(t,e=[],{baseFs:r=new Wt,builtins:i={},cwd:n=M.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=bw}={}){let g={};for(let[p,d]of Object.entries(s))typeof d!="undefined"&&(g[p]=d);let f=new Map(oRe);for(let[p,d]of Object.entries(i))f.set(p,d);o===null&&(o=new Kn.PassThrough,o.end());let h=Aw(t,u);if(!JP(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let d=p.chain;for(;d.then;)d=d.then.chain;d.type==="command"&&(d.args=d.args.concat(e.map(m=>({type:"argument",segments:[{type:"text",text:m}]}))))}return await Pw(h,{args:e,baseFs:r,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var s9=ie(ZP()),o9=ie(Wp()),cc=ie(require("stream"));var J6=ie(Or());var zp=class{supportsDescriptor(e,r){return!!(e.range.startsWith(zp.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(zp.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.getWorkspaceByCwd(e.reference.slice(zp.protocol.length));return _(P({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:gt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},Yr=zp;Yr.protocol="workspace:";var qt={};it(qt,{SemVer:()=>j6.SemVer,satisfiesWithPrereleases:()=>lc,validRange:()=>Us});var Lw=ie(Or()),j6=ie(Or()),Y6=new Map;function lc(t,e,r=!1){if(!t)return!1;let i=`${e}${r}`,n=Y6.get(i);if(typeof n=="undefined")try{n=new Lw.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Y6.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Lw.default.SemVer(t,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var q6=new Map;function Us(t){if(t.indexOf(":")!==-1)return null;let e=q6.get(t);if(typeof e!="undefined")return e;try{e=new Lw.default.Range(t)}catch{e=null}return q6.set(t,e),e}var vA=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.type=null;this.packageManager=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:r=new Wt}={}){let i=v.join(e,"package.json");return await r.existsPromise(i)?await vA.fromFile(i,{baseFs:r}):null}static async find(e,{baseFs:r}={}){let i=await vA.tryFind(e,{baseFs:r});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:r=new Wt}={}){let i=new vA;return await i.loadFile(e,{baseFs:r}),i}static fromText(e){let r=new vA;return r.loadFromText(e),r}static isManifestFieldCompatible(e,r){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,r===s.slice(1))return!1}else if(i=!1,s===r)return!0;return n&&i}loadFromText(e){let r;try{r=JSON.parse(z6(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(r),this.indent=W6(e)}async loadFile(e,{baseFs:r=new Wt}){let i=await r.readFilePromise(e,"utf8"),n;try{n=JSON.parse(z6(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=W6(i)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=En(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=en(e.main):this.main=null,typeof e.module=="string"?this.module=en(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=en(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(en(s),typeof o=="string"?en(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,en(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.bin.set(s,en(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(Yr.protocol)&&!Us(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=Yt(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=pA(s),l=this.ensureDependencyMeta(a),c=Tw(o.built,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=Tw(o.optional,{yamlCompatibilityMode:r});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=Tw(o.unplugged,{yamlCompatibilityMode:r});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=pA(s),l=this.ensurePeerDependencyMeta(a),c=Tw(o.optional,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:gw(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=en(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=en(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=en(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(en(s),typeof o=="string"?en(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,en(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,en(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(en(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l);let c=Yt(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}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))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(V6("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(V6("cpu",this.cpu)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return vA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return vA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!J6.default.valid(e.range))throw new Error(`Invalid meta field range for '${In(e)}'`);let r=St(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(r);n||this.dependenciesMeta.set(r,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${In(e)}'`);let r=St(e),i=this.peerDependenciesMeta.get(r);return i||this.peerDependenciesMeta.set(r,i={}),i}setRawField(e,r,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=r,a=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=St(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&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(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=_(P({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(St(o)),l=!1;if(r&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Ou(i).map(o=>({[St(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Ou(n).map(o=>({[St(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Ou(this.devDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Ou(this.peerDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of gn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of gn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?In(Yt(En(o),l)):o,g=P({},c);r&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...gn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[fw(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},Ze=vA;Ze.fileName="package.json",Ze.allDependencies=["dependencies","devDependencies","peerDependencies"],Ze.hardDependencies=["dependencies","devDependencies"];function W6(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function z6(t){return t.charCodeAt(0)===65279?t.slice(1):t}function en(t){return t.replace(/\\/g,"/")}function Tw(t,{yamlCompatibilityMode:e}){return e?Kv(t):typeof t=="undefined"||typeof t=="boolean"?t:null}function _6(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let i=r%2==0?"":"!",n=e.slice(r);return`${i}${t}=${n}`}function V6(t,e){return e.length===1?_6(t,e[0]):`(${e.map(r=>_6(t,r)).join(" | ")})`}var e9=ie($6()),Ow=ie(ml());var t9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r9=80,NFe=new Set([z.FETCH_NOT_CACHED,z.UNUSED_CACHE_ENTRY]),LFe=5,SA=Ow.default.GITHUB_ACTIONS?{start:t=>`::group::${t} -`,end:t=>`::endgroup:: -`}:Ow.default.TRAVIS?{start:t=>`travis_fold:start:${t} -`,end:t=>`travis_fold:end:${t} -`}:Ow.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${t} -`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r`}:null,i9=new Date,TFe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,MFe=t=>t,Kw=MFe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),OFe=TFe&&Object.keys(Kw).find(t=>{let e=Kw[t];return!(e.date&&(e.date[0]!==i9.getDate()||e.date[1]!==i9.getMonth()+1))})||"default";function n9(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let n=KE(t===null?0:t);return!r&&t===null?Ve(e,n,"grey"):n}function eD(t,{configuration:e,json:r}){let i=n9(t,{configuration:e,json:r});if(!i||t===null||t===z.UNNAMED)return i;let n=z[t],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Ku(e,i,s)}var Fe=class extends Xi{constructor({configuration:e,stdout:r,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=LFe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;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=[];Cp(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...NFe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=r;let u=this.configuration.get("progressBarStyle")||OFe;if(!Object.prototype.hasOwnProperty.call(Kw,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Kw[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(process.stdout.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}static async start(e,r){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(z.UNNAMED,a)};try{await r(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,r){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof r!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(z.FETCH_NOT_CACHED,r)}startTimerSync(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startTimerPromise(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startCacheReport(e){let r=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{r!==null&&this.reportCacheChanges(r)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,r){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${Ve(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${r}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,r){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${r}`)}reportError(e,r){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${r}`,{truncate:!1})}reportProgress(e){let r=!1,i=Promise.resolve().then(async()=>{let s={progress:0,title:void 0};this.progress.set(e,{definition:s,lastScaledSize:-1}),this.refreshProgress(-1);for await(let{progress:o,title:a}of e)r||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{r||(r=!0,this.progress.delete(e),this.refreshProgress(1))};return _(P({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let r=Ve(this.configuration,Date.now()-this.startTime,Le.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${r}`:e;this.errorCount>0?this.reportError(z.UNNAMED,i):this.warningCount>0?this.reportWarning(z.UNNAMED,i):this.reportInfo(z.UNNAMED,i)}writeLine(e,{truncate:r}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:r})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:r}={}){this.forgettableLines=[],this.writeLine(e,{truncate:r})}writeLines(e,{truncate:r}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:r})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:r}){let i=this.cacheHitCount-e,n=this.cacheMissCount-r;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(z.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let r of e)r.committed=!0,r.action()}clearProgress({delta:e=0,clear:r=!1}){!this.configuration.get("enableProgressBars")||this.json||this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||r)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>r9&&(this.progressFrame=(this.progressFrame+1)%t9.length,this.progressTime=e);let r=t9[this.progressFrame];for(let i of this.progress.values()){let n=this.progressStyle.chars[0].repeat(i.lastScaledSize),s=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize),o=this.formatName(null),a=o?`${o}: `:"";this.stdout.write(`${Ve(this.configuration,"\u27A4","blueBright")} ${a}${r} ${n}${s} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},r9)}refreshProgress(e=0){let r=!1;if(this.progress.size===0)r=!0;else for(let i of this.progress.values()){let n=Math.trunc(this.progressMaxScaledSize*i.definition.progress),s=i.lastScaledSize;if(i.lastScaledSize=n,n!==s){r=!0;break}}r&&(this.clearProgress({delta:e}),this.writeProgress())}truncate(e,{truncate:r}={}){return this.configuration.get("enableProgressBars")||(r=!1),typeof r=="undefined"&&(r=this.configuration.get("preferTruncatedLines")),r&&(e=(0,e9.default)(e,0,process.stdout.columns-1)),e}formatName(e){return n9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Zr="3.1.1";var tn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(tn||(tn={}));async function ba(t,e,r,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await T.writeFilePromise(v.format({dir:t,name:e,ext:".cmd"}),n)}await T.writeFilePromise(v.join(t,e),`#!/bin/sh -exec "${r}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function a9(t){let e=await Ze.tryFind(t);if(e==null?void 0:e.packageManager){let i=Qy(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?tn.Yarn1:tn.Yarn2,reason:n};case"npm":return{packageManager:tn.Npm,reason:n};case"pnpm":return{packageManager:tn.Pnpm,reason:n}}}}let r;try{r=await T.readFilePromise(v.join(t,wt.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:tn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:tn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:T.existsSync(v.join(t,"package-lock.json"))?{packageManager:tn.Npm,reason:`found npm's "package-lock.json" lockfile`}:T.existsSync(v.join(t,"pnpm-lock.yaml"))?{packageManager:tn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Vp({project:t,locator:e,binFolder:r,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=M.fromPortablePath(r);n.BERRY_BIN_FOLDER=M.fromPortablePath(s);let o=process.env.COREPACK_ROOT?M.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([ba(r,"node",process.execPath),...Zr!==null?[ba(r,"run",process.execPath,[o,"run"]),ba(r,"yarn",process.execPath,[o]),ba(r,"yarnpkg",process.execPath,[o]),ba(r,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=M.fromPortablePath(t.configuration.startingCwd),n.PROJECT_CWD=M.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${s}${M.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${M.sep}yarn`,n.npm_node_execpath=`${s}${M.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let u=t.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=t.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=St(e),n.npm_package_version=g}let a=Zr!==null?`yarn/${Zr}`:`yarn/${mu("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),t&&await t.configuration.triggerHook(u=>u.setupScriptEnvironment,t,n,async(u,g,f)=>await ba(r,kr(u),g,f)),n}var KFe=2,UFe=(0,o9.default)(KFe);async function HFe(t,e,{configuration:r,report:i,workspace:n=null,locator:s=null}){await UFe(async()=>{await T.mktempPromise(async o=>{let a=v.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=r.getSubprocessStreams(a,{prefix:M.fromPortablePath(t),report:i}),g=s&&Io(s)?lp(s):s,f=g?is(g):"an external project";c.write(`Packing ${f} from sources -`);let h=await a9(t),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} - -`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=tn.Yarn2),await T.mktempPromise(async d=>{let m=await Vp({binFolder:d}),B=new Map([[tn.Yarn1,async()=>{let R=n!==null?["workspace",n]:[],H=await to("yarn",["set","version","classic","--only-if-needed"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;await T.appendFilePromise(v.join(t,".npmignore"),`/.yarn -`),c.write(` -`);let L=await to("yarn",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(L.code!==0)return L.code;c.write(` -`);let K=await to("yarn",[...R,"pack","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return K.code!==0?K.code:0}],[tn.Yarn2,async()=>{let R=n!==null?["workspace",n]:[];m.YARN_ENABLE_INLINE_BUILDS="1";let H=v.join(t,wt.lockfile);await T.existsPromise(H)||await T.writeFilePromise(H,"");let L=await to("yarn",[...R,"pack","--install-if-needed","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return L.code!==0?L.code:0}],[tn.Npm,async()=>{if(n!==null){let A=new cc.PassThrough,V=Cu(A);A.pipe(c,{end:!1});let W=await to("npm",["--version"],{cwd:t,env:m,stdin:l,stdout:A,stderr:u,end:Pn.Never});if(A.end(),W.code!==0)return c.end(),u.end(),W.code;let X=(await V).toString().trim();if(!lc(X,">=7.x")){let F=Eo(null,"npm"),D=Yt(F,X),he=Yt(F,">=7.x");throw new Error(`Workspaces aren't supported by ${Xt(r,D)}; please upgrade to ${Xt(r,he)} (npm has been detected as the primary package manager for ${Ve(r,t,Le.PATH)})`)}}let R=n!==null?["--workspace",n]:[];delete m.npm_config_user_agent;let H=await to("npm",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;let L=new cc.PassThrough,K=Cu(L);L.pipe(c);let J=await to("npm",["pack","--silent",...R],{cwd:t,env:m,stdin:l,stdout:L,stderr:u});if(J.code!==0)return J.code;let ne=(await K).toString().trim().replace(/^.*\n/s,""),q=v.resolve(t,M.toPortablePath(ne));return await T.renamePromise(q,e),0}]]).get(p);if(typeof B=="undefined")throw new Error("Assertion failed: Unsupported workflow");let b=await B();if(!(b===0||typeof b=="undefined"))throw T.detachTemp(o),new nt(z.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${b}, logs can be found here: ${Ve(r,a,Le.PATH)})`)})})})}async function GFe(t,e,{project:r}){let i=r.tryWorkspaceByLocator(t);if(i!==null)return tD(i,e);let n=r.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r.configuration,t)} not found in the project`);return await Jn.openPromise(async s=>{let o=r.configuration,a=r.configuration.getLinkers(),l={project:r,report:new Fe({stdout:new cc.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${lt(r.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new Ft(u,{baseFs:s});return(await Ze.find(Se.dot,{baseFs:g})).scripts.has(e)},{libzip:await $i()})}async function Uw(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await A9(t,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Fw(f,r,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(d=>d.wrapScriptExecution,h,n,t,e,{script:f,args:r,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{env:c,cwd:u}=await A9(t,{project:n,binFolder:l,cwd:i});return await Fw(e,r,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function jFe(t,{binFolder:e,cwd:r,lifecycleScript:i}){let n=await Vp({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await l9(t),([s,[,o]])=>ba(e,kr(s),process.execPath,[o]))),typeof r=="undefined"&&(r=v.dirname(await T.realpathPromise(v.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:n,cwd:r}}async function A9(t,{project:e,binFolder:r,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(t);if(s!==null)return jFe(s,{binFolder:r,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(t.locatorHash);if(!o)throw new Error(`Package for ${lt(e.configuration,t)} not found in the project`);return await Jn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Fe({stdout:new cc.PassThrough,configuration:l})},g=c.find(m=>m.supportsPackage(o,u));if(!g)throw new Error(`The package ${lt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Vp({project:e,locator:t,binFolder:r,lifecycleScript:n});await Promise.all(Array.from(await Hw(t,{project:e}),([m,[,I]])=>ba(r,kr(m),process.execPath,[I])));let h=await g.findPackageLocation(o,u),p=new Ft(h,{baseFs:a}),d=await Ze.find(Se.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:d,binFolder:r,env:f,cwd:i}},{libzip:await $i()})}async function c9(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o}){return await Uw(t.anchoredLocator,e,r,{cwd:i,project:t.project,stdin:n,stdout:s,stderr:o})}function tD(t,e){return t.manifest.scripts.has(e)}async function u9(t,e,{cwd:r,report:i}){let{configuration:n}=t.project,s=null;await T.mktempPromise(async o=>{let a=v.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${M.fromPortablePath(t.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:lt(n,t.anchoredLocator),header:l});i.reportInfo(z.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await c9(t,e,[],{cwd:r,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw T.detachTemp(o),new nt(z.LIFECYCLE_SCRIPT,`${(0,s9.default)(e)} script failed (exit code ${Ve(n,g,Le.NUMBER)}, logs can be found here: ${Ve(n,a,Le.PATH)}); run ${Ve(n,`yarn ${e}`,Le.CODE)} to investigate`)})}async function YFe(t,e,r){tD(t,e)&&await u9(t,e,r)}async function Hw(t,{project:e}){let r=e.configuration,i=new Map,n=e.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r,t)} not found in the project`);let s=new cc.Writable,o=r.getLinkers(),a={project:e,report:new Fe({configuration:r,stdout:s})},l=new Set([t.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${Xt(r,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return kl.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return kl.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return kl.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===kl.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,M.fromPortablePath(v.resolve(f,p))])}return i}async function l9(t){return await Hw(t.anchoredLocator,{project:t.project})}async function g9(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await Hw(t,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${lt(n.configuration,t)}`);return await T.mktempPromise(async g=>{let[,f]=u,h=await Vp({project:n,locator:t,binFolder:g});await Promise.all(Array.from(c,([d,[,m]])=>ba(h.BERRY_BIN_FOLDER,kr(d),process.execPath,[m])));let p;try{p=await to(process.execPath,[...l,f,...r],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await T.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function qFe(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await g9(t.anchoredLocator,e,r,{project:t.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Ai={};it(Ai,{convertToZip:()=>lTe,extractArchiveTo:()=>uTe,makeArchiveFromDirectory:()=>ATe});var d_=ie(require("stream")),C_=ie(Z7());var u_=ie(require("os")),g_=ie(c_()),f_=ie(require("worker_threads")),IR=class{constructor(e){this.source=e;this.pool=[];this.queue=new g_.default({concurrency:Math.max(1,(0,u_.cpus)().length)});let r=setTimeout(()=>{if(!(this.queue.size!==0||this.queue.pending!==0)){for(let i of this.pool)i.terminate();this.pool=[]}},1e3).unref();this.queue.on("idle",()=>{r.refresh()})}run(e){return this.queue.add(()=>{var i;let r=(i=this.pool.pop())!=null?i:new f_.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return r.ref(),new Promise((n,s)=>{let o=a=>{a!==0&&s(new Error(`Worker exited with code ${a}`))};r.once("message",a=>{this.pool.push(r),r.unref(),r.off("error",s),r.off("exit",o),n(a)}),r.once("error",s),r.once("exit",o),r.postMessage(e)})})}};var m_=ie(p_());async function ATe(t,{baseFs:e=new Wt,prefixPath:r=Se.root,compressionLevel:i,inMemory:n=!1}={}){let s=await $i(),o;if(n)o=new Jr(null,{libzip:s,level:i});else{let l=await T.mktempPromise(),c=v.join(l,"archive.zip");o=new Jr(c,{create:!0,libzip:s,level:i})}let a=v.resolve(Se.root,r);return await o.copyPromise(a,t,{baseFs:e,stableTime:!0,stableSort:!0}),o}var E_;async function lTe(t,e){let r=await T.mktempPromise(),i=v.join(r,"archive.zip");return E_||(E_=new IR((0,m_.getContent)())),await E_.run({tmpFile:i,tgz:t,opts:e}),new Jr(i,{libzip:await $i(),level:e.compressionLevel})}async function*cTe(t){let e=new C_.default.Parse,r=new d_.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{r.write(i)}),e.on("error",i=>{r.destroy(i)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let i of r){let n=i;yield n,n.resume()}}async function uTe(t,e,{stripComponents:r=0,prefixPath:i=Se.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=r)}for await(let a of cTe(t)){if(n(a))continue;let l=v.normalize(M.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=r)continue;let c=l.slice(r).join("/"),u=v.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.writeFileSync(u,await Cu(a),{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,mr.SAFE_TIME,mr.SAFE_TIME);break}}return e}var Hs={};it(Hs,{emitList:()=>gTe,emitTree:()=>b_,treeNodeToJson:()=>Q_,treeNodeToTreeify:()=>B_});var w_=ie(y_());function B_(t,{configuration:e}){let r={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Py(e,l,Gl.BOLD)),typeof c!="undefined"&&g.push(Ve(e,c[0],c[1])),g.length===0&&g.push(Py(e,`${a}`,Gl.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof t.children=="undefined")throw new Error("The root node must only contain children");return i(t.children,r),r}function Q_(t){let e=r=>{var s;if(typeof r.children=="undefined"){if(typeof r.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Uu(r.value[0],r.value[1])}let i=Array.isArray(r.children)?r.children.entries():Object.entries((s=r.children)!=null?s:{}),n=Array.isArray(r.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof r.value=="undefined"?n:{value:Uu(r.value[0],r.value[1]),children:n}};return e(t)}function gTe(t,{configuration:e,stdout:r,json:i}){let n=t.map(s=>({value:s}));b_({children:n},{configuration:e,stdout:r,json:i})}function b_(t,{configuration:e,stdout:r,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(t.children)?t.children.values():Object.values((o=t.children)!=null?o:{});for(let l of a)r.write(`${JSON.stringify(Q_(l))} -`);return}let s=(0,w_.asTree)(B_(t,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(s)}var v_=ie(require("crypto")),BR=ie(require("fs"));var fTe=8,Qt=class{constructor(e,{configuration:r,immutable:i=r.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,v_.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=i,this.check=n;let s=r.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=r.get("compressionLevel"),a=o!==pl?`c${o}`:"";this.cacheKey=[fTe,a].join("")}}static async find(e,{immutable:r,check:i}={}){let n=new Qt(e.get("cacheFolder"),{configuration:e,immutable:r,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Mu(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let n=hTe(r).slice(0,10);return`${Mu(e)}-${n}.zip`}getLocatorPath(e,r,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?v.resolve(this.cwd,this.getVersionFilename(e)):r===null||QR(r)!==this.cacheKey?null:v.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?v.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await T.existsPromise(this.cwd))throw new nt(z.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await T.mkdirPromise(this.cwd,{recursive:!0});let e=v.resolve(this.cwd,".gitignore");await T.changeFilePromise(e,`/.gitignore -*.flock -*.tmp -`)}(this.mirrorCwd||!this.immutable)&&await T.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=qr(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new Wt,g=()=>{let V=new Jr(null,{libzip:H}),W=v.join(Se.root,Lx(e));return V.mkdirSync(W,{recursive:!0}),V.writeJsonSync(v.join(W,wt.manifest),{name:St(e),mocked:!0}),V},f=async(V,W=null)=>{let X=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Ey(V)}`:r;if(W!==null){let F=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Ey(W)}`:r;if(X!==F)throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&X!==r){let F;switch(this.check?F="throw":QR(r)!==QR(X)?F="update":F=this.configuration.get("checksumBehavior"),F){case"ignore":return r;case"update":return X;default:case"throw":throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return X},h=async V=>{if(!s)throw new Error(`Cache check required but no loader configured for ${lt(this.configuration,e)}`);let W=await s(),X=W.getRealPath();return W.saveAndClose(),await T.chmodPromise(X,420),await f(V,X)},p=async()=>{if(c===null||!await T.existsPromise(c)){let V=await s(),W=V.getRealPath();return V.saveAndClose(),{source:"loader",path:W}}return{source:"mirror",path:c}},d=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${lt(this.configuration,e)}`);if(this.immutable)throw new nt(z.IMMUTABLE_CACHE,`Cache entry required but missing for ${lt(this.configuration,e)}`);let{path:V,source:W}=await p(),X=await f(V),F=this.getLocatorPath(e,X,o);if(!F)throw new Error("Assertion failed: Expected the cache path to be available");let D=[];W!=="mirror"&&c!==null&&D.push(async()=>{let pe=`${c}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,c)}),(!o.mirrorWriteOnly||c===null)&&D.push(async()=>{let pe=`${F}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,F)});let he=o.mirrorWriteOnly&&c!=null?c:F;return await Promise.all(D.map(pe=>pe())),[!1,he,X]},m=async()=>{let W=(async()=>{var Ne;let X=this.getLocatorPath(e,r,o),F=X!==null?await u.existsPromise(X):!1,D=!!((Ne=o.mockedPackages)==null?void 0:Ne.has(e.locatorHash))&&(!this.check||!F),he=D||F,pe=he?i:n;if(pe&&pe(),he){let Pe=null,qe=X;return D||(Pe=this.check?await h(qe):await f(qe)),[D,qe,Pe]}else return d()})();this.mutexes.set(e.locatorHash,W);try{return await W}finally{this.mutexes.delete(e.locatorHash)}};for(let V;V=this.mutexes.get(e.locatorHash);)await V;let[I,B,b]=await m();this.markedFiles.add(B);let R,H=await $i(),L=I?()=>g():()=>new Jr(B,{baseFs:u,libzip:H,readOnly:!0}),K=new oh(()=>Mv(()=>R=L(),V=>`Failed to open the cache entry for ${lt(this.configuration,e)}: ${V}`),v),J=new Xo(B,{baseFs:K,pathUtils:v}),ne=()=>{R==null||R.discardAndClose()},q=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:b;return[J,ne,q]}};function QR(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function hTe(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var F_=ie(x_()),NB=ie(ml());var N_=ie(Wp()),kR=ie(require("stream"));var k_={hooks:{reduceDependency:(t,e,r,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==St(r)||o.from&&o.from.description&&o.from.description!==r.reference||o.descriptor.fullName!==St(t)||o.descriptor.description&&o.descriptor.description!==t.range)continue;return n.bindDescriptor(Yt(t,a),e.topLevelWorkspace.anchoredLocator,s)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let i=hp(t.configuration,r);await t.configuration.triggerHook(n=>n.validateWorkspace,r,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let i of r.errors)e.reportWarning(z.INVALID_MANIFEST,i.message)}}};var vR=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));return i||null}getFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));if(!i)throw new nt(z.FETCHER_NOT_FOUND,`${lt(r.project.configuration,e)} isn't supported by any available fetcher`);return i}};var pd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,r,i)}async getSatisfying(e,r,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,r,i)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));return i||null}getResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));if(!i)throw new Error(`${Xt(r.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));return i||null}getResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));if(!i)throw new Error(`${lt(r.project.configuration,e)} isn't supported by any available resolver`);return i}};var P_=ie(Or());var Rg=/^(?!v)[a-z0-9._-]+$/i,SR=class{supportsDescriptor(e,r){return!!(Us(e.range)||Rg.test(e.range))}supportsLocator(e,r){return!!(P_.default.valid(e.reference)||Rg.test(e.reference))}shouldPersistResolution(e,r){return r.resolver.shouldPersistResolution(this.forwardLocator(e,r),r)}bindDescriptor(e,r,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),r,i)}getResolutionDependencies(e,r){return r.resolver.getResolutionDependencies(this.forwardDescriptor(e,r),r)}async getCandidates(e,r,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),r,i)}async getSatisfying(e,r,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),r,i)}async resolve(e,r){let i=await r.resolver.resolve(this.forwardLocator(e,r),r);return op(i,e)}forwardDescriptor(e,r){return Yt(e,`${r.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,r){return Vi(e,`${r.project.configuration.get("defaultProtocol")}${e.reference}`)}};var dd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n);return r.fetcher.getLocalPath(s,r)}async fetch(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n),o=await r.fetcher.fetch(s,r);return await this.ensureVirtualLink(e,o,r)}getLocatorFilename(e){return Mu(e)}async ensureVirtualLink(e,r,i){let n=r.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Pr.makeVirtualPath(s,o,n),l=new Xo(a,{baseFs:r.packageFs,pathUtils:v});return _(P({},r),{packageFs:l})}};var Fg=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Fg.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Fg.protocol)}supportsDescriptor(e,r){return Fg.isVirtualDescriptor(e)}supportsLocator(e,r){return Fg.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},FB=Fg;FB.protocol="virtual:";var xR=class{supports(e){return!!e.reference.startsWith(Yr.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let i=this.getWorkspace(e,r).cwd;return{packageFs:new Ft(i),prefixPath:Se.dot,localPath:i}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Yr.protocol.length))}};var D_=ie(require("module"));function R_(){return new Set(D_.default.builtinModules||Object.keys(process.binding("natives")))}var dTe=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),LB="yarn_",PR=".yarnrc.yml",DR="yarn.lock",CTe="********",ge;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(ge||(ge={}));var ps=Le,RR={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:ge.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:ge.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:ge.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:ge.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:ge.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:ge.ABSOLUTE_PATH,default:Rb()},cacheFolder:{description:"Folder where the cache files must be written",type:ge.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:ge.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:pl},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:ge.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:ge.STRING,default:DR},installStatePath:{description:"Path of the file where the install state will be persisted",type:ge.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:ge.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:ge.STRING,default:TB()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:ge.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:ge.BOOLEAN,default:xy,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:ge.BOOLEAN,default:Mx,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:ge.BOOLEAN,default:NB.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:ge.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:ge.BOOLEAN,default:!NB.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:ge.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:ge.BOOLEAN,default:NB.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:ge.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:ge.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:ge.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:ge.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:ge.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:ge.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:ge.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:ge.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:ge.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:ge.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:ge.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:ge.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:ge.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:ge.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:ge.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:ge.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:ge.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:ge.STRING,values:Object.values(Ts),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:ge.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:ge.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:ge.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:ge.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:ge.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:ge.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:ge.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:ge.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:ge.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:ge.MAP,valueDefinition:{description:"A range",type:ge.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:ge.MAP,valueDefinition:{description:"A semver range",type:ge.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:ge.MAP,valueDefinition:{description:"The peerDependency meta",type:ge.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:ge.BOOLEAN,default:!1}}}}}}}};function NR(t,e,r,i,n){if(i.isArray||i.type===ge.ANY&&Array.isArray(r))return Array.isArray(r)?r.map((s,o)=>FR(t,`${e}[${o}]`,s,i,n)):String(r).split(/,/).map(s=>FR(t,e,s,i,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return FR(t,e,r,i,n)}function FR(t,e,r,i,n){var a;switch(i.type){case ge.ANY:return r;case ge.SHAPE:return mTe(t,e,r,i,n);case ge.MAP:return ETe(t,e,r,i,n)}if(r===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(r))return r;let o=(()=>{if(i.type===ge.BOOLEAN&&typeof r!="string")return Hh(r);if(typeof r!="string")throw new Error(`Expected value (${r}) to be a string`);let l=Ov(r,{env:process.env});switch(i.type){case ge.ABSOLUTE_PATH:return v.resolve(n,M.toPortablePath(l));case ge.LOCATOR_LOOSE:return Hl(l,!1);case ge.NUMBER:return parseInt(l);case ge.LOCATOR:return Hl(l);case ge.BOOLEAN:return Hh(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function mTe(t,e,r,i,n){if(typeof r!="object"||Array.isArray(r))throw new me(`Object configuration settings "${e}" must be an object`);let s=LR(t,i,{ignoreArrays:!0});if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=`${e}.${o}`;if(!i.properties[o])throw new me(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,NR(t,l,a,i.properties[o],n))}return s}function ETe(t,e,r,i,n){let s=new Map;if(typeof r!="object"||Array.isArray(r))throw new me(`Map configuration settings "${e}" must be an object`);if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,NR(t,c,a,u,n))}return s}function LR(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case ge.SHAPE:{if(e.isArray&&!r)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,LR(t,s));return i}break;case ge.MAP:return e.isArray&&!r?[]:new Map;case ge.ABSOLUTE_PATH:return e.default===null?null:t.projectCwd===null?v.isAbsolute(e.default)?v.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>v.resolve(t.projectCwd,i)):v.resolve(t.projectCwd,e.default);default:return e.default}}function MB(t,e,r){if(e.type===ge.SECRET&&typeof t=="string"&&r.hideSecrets)return CTe;if(e.type===ge.ABSOLUTE_PATH&&typeof t=="string"&&r.getNativePaths)return M.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let i=[];for(let n of t)i.push(MB(n,e,r));return i}if(e.type===ge.MAP&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries())i.set(n,MB(s,e.valueDefinition,r));return i}if(e.type===ge.SHAPE&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries()){let o=e.properties[n];i.set(n,MB(s,o,r))}return i}return t}function ITe(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(LB)&&(e=(0,F_.default)(e.slice(LB.length)),t[e]=r);return t}function TB(){let t=`${LB}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return PR}var KA;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(KA||(KA={}));var Ra=class{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,r,i){let n=new Ra(e);typeof r!="undefined"&&!(r instanceof Map)&&(n.projectCwd=r),n.importSettings(RR);let s=typeof i!="undefined"?i:r instanceof Map?r:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,r,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=ITe();delete a.rcFilename;let l=await Ra.findRcFiles(e),c=await Ra.findHomeRcFile();if(c){let I=l.find(B=>B.path===c.path);I?I.strict=!1:l.push(_(P({},c),{strict:!1}))}let u=({ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R})=>({ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R}),g=L=>{var K=L,{ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R}=K,H=qr(K,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return H},f=new Ra(e);f.importSettings(u(RR)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:I,cwd:B,data:b}of l)f.useWithSource(I,u(b),B,{strict:!1});if(s){let I=f.get("yarnPath"),B=f.get("ignorePath");if(I!==null&&!B)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await Ra.findProjectCwd(e,h);break;case 1:p=await Ra.findProjectCwd(e,null);break;case 2:T.existsSync(v.join(e,"package.json"))?p=v.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(RR));let d=new Map([["@@core",k_]]),m=I=>"default"in I?I.default:I;if(r!==null){for(let R of r.plugins.keys())d.set(R,m(r.modules.get(R)));let I=new Map;for(let R of R_())I.set(R,()=>mu(R));for(let[R,H]of r.modules)I.set(R,()=>H);let B=new Set,b=async(R,H)=>{let{factory:L,name:K}=mu(R);if(B.has(K))return;let J=new Map(I),ne=A=>{if(J.has(A))return J.get(A)();throw new me(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},q=await du(async()=>m(await L(ne)),A=>`${A} (when initializing ${K}, defined in ${H})`);I.set(K,()=>q),B.add(K),d.set(K,q)};if(a.plugins)for(let R of a.plugins.split(";")){let H=v.resolve(e,M.toPortablePath(R));await b(H,"")}for(let{path:R,cwd:H,data:L}of l)if(!!o&&!!Array.isArray(L.plugins))for(let K of L.plugins){let J=typeof K!="string"?K.path:K,ne=v.resolve(H,M.toPortablePath(J));await b(ne,R)}}for(let[I,B]of d)f.activatePlugin(I,B);f.useWithSource("",g(a),e,{strict:n});for(let{path:I,cwd:B,data:b,strict:R}of l)f.useWithSource(I,g(b),B,{strict:R!=null?R:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let r=TB(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=v.join(s,r);if(T.existsSync(o)){let a=await T.readFilePromise(o,"utf8"),l;try{l=Ii(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new me(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=v.dirname(s)}return i}static async findHomeRcFile(){let e=TB(),r=uh(),i=v.join(r,e);if(T.existsSync(i)){let n=await T.readFilePromise(i,"utf8"),s=Ii(n);return{path:i,cwd:r,data:s}}return null}static async findProjectCwd(e,r){let i=null,n=e,s=null;for(;n!==s;){if(s=n,T.existsSync(v.join(s,"package.json"))&&(i=s),r!==null){if(T.existsSync(v.join(s,r))){i=s;break}}else if(i!==null)break;n=v.dirname(s)}return i}static async updateConfiguration(e,r){let i=TB(),n=v.join(e,i),s=T.existsSync(n)?Ii(await T.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof r=="function"){try{a=r(s)}catch{a=r({})}if(a===s)return}else{a=s;for(let l of Object.keys(r)){let c=s[l],u=r[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await T.changeFilePromise(n,Qa(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let r=uh();return await Ra.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration!="undefined"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,i]of Object.entries(e))if(i!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,i),this.values.set(r,LR(this,i))}}useWithSource(e,r,i,n){try{this.use(e,r,i,n)}catch(s){throw s.message+=` (in ${Ve(this,e,Le.PATH)})`,s}}use(e,r,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(r)]){if(typeof r[o]=="undefined"||o==="plugins"||e===""&&dTe.has(o))continue;if(o==="rcFilename")throw new me(`The rcFilename settings can only be set via ${`${LB}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new me(`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)&&!(s||l.type===ge.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=NR(this,o,r[o],l,i)}catch(u){throw u.message+=` in ${Ve(this,e,Le.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===ge.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),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:r=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new me(`Couldn't find a configuration settings named "${e}"`);return MB(n,s,{hideSecrets:r,getNativePaths:i})}getSubprocessStreams(e,{header:r,prefix:i,report:n}){let s,o,a=T.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${Ve(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${Ve(this,"STDERR","red")}`);s=new kR.PassThrough,s.pipe(l),s.pipe(a),o=new kR.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof r!="undefined"&&s.write(`${r} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let i of r.resolvers||[])e.push(new i);return new pd([new FB,new Yr,new SR,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let i of r.fetchers||[])e.push(new i);return new vR([new dd,new xR,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let i of r.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=this.get("supportedArchitectures"),r=e.get("os");r!==null&&(r=r.map(n=>n==="current"?process.platform:n));let i=e.get("cpu");return i!==null&&(i=i.map(n=>n==="current"?process.arch:n)),{os:r,cpu:i}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(i,n,{userProvided:s=!1}={})=>{if(!Us(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new Ze;o.load(n,{yamlCompatibilityMode:!0});let a=hu(e,i.identHash),l=[];a.push([i.range,l]);let c={status:ki.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(_(P({},c),{type:oi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(_(P({},c),{type:oi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(_(P({},c),{type:oi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,r);for(let[i,n]of this.get("packageExtensions"))r(pA(i,!0),aI(n),{userProvided:!0})}normalizePackage(e){let r=ap(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!lc(s,o))for(let l of a)switch(l.status===ki.Inactive&&(l.status=ki.Redundant),l.type){case oi.Dependency:typeof r.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.dependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependency:typeof r.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependencyMeta:{let c=r.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=ki.Active,na(r.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Lv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of r.peerDependenciesMeta.keys()){let o=En(s);r.peerDependencies.has(o.identHash)||r.peerDependencies.set(o.identHash,Yt(o,"*"))}for(let s of r.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=Eo("types",o),l=St(a);r.peerDependencies.has(a.identHash)||r.peerDependenciesMeta.has(l)||(r.peerDependencies.set(a.identHash,Yt(a,"*")),r.peerDependenciesMeta.set(l,{optional:!0}))}return r.dependencies=new Map(gn(r.dependencies,([,s])=>In(s))),r.peerDependencies=new Map(gn(r.peerDependencies,([,s])=>In(s))),r}getLimit(e){return na(this.limits,e,()=>(0,N_.default)(this.get(e)))}async triggerHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...r)}}async triggerMultipleHooks(e,r){for(let i of r)await this.triggerHook(e,...i)}async reduceHook(e,r,...i){let n=r;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...r);if(typeof o!="undefined")return o}return null}},fe=Ra;fe.telemetry=null;var Gn;(function(r){r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE"})(Gn||(Gn={}));var Fa=class extends Xi{constructor({configuration:e,stdout:r,suggestInstall:i=!0}){super();this.errorCount=0;Cp(this,{configuration:e}),this.configuration=e,this.stdout=r,this.suggestInstall=i}static async start(e,r){let i=new this(e);try{await r(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){this.errorCount+=1,this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${r} -`)}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var t0=ie(require("crypto")),v$=ie(CX()),r0=ie(Q$()),S$=ie(Wp()),x$=ie(Or()),lF=ie(require("util")),cF=ie(require("v8")),uF=ie(require("zlib"));var iUe=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,i)=>`${r}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>by({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],oF=class{constructor(){this.resolutions=null}async setup(e,{report:r}){let i=v.join(e.cwd,e.configuration.get("lockfileFilename"));if(!T.existsSync(i))return;let n=await T.readFilePromise(i,"utf8"),s=Ii(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=gp(a);if(!l){r.reportWarning(z.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}Us(l.range)&&(l=Yt(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of iUe){let d=u.match(h);if(d){g=p(c,...d);break}}if(!g){r.reportWarning(z.YARN_IMPORT_FAILED,`${Xt(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=Tu(l.range),p=gp(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,Vi(f,g))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var aF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(By(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){let n=i.project.originalPackages.get(By(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var AF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.resolver.bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var ei=class extends Xi{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){}};var b$=ie(vx());var Dd=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=r,this.cwd=e}async setup(){this.manifest=T.existsSync(v.join(this.cwd,Ze.fileName))?await Ze.find(this.cwd):new Ze,this.relativeCwd=v.relative(this.project.cwd,this.cwd)||Se.dot;let e=this.manifest.name?this.manifest.name:Eo(null,`${this.computeCandidateName()}-${zi(this.relativeCwd).substr(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=Vi(e,r),this.anchoredDescriptor=Yt(this.locator,`${Yr.protocol}${this.relativeCwd}`),this.anchoredLocator=Vi(this.locator,`${Yr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:s})=>s),n=await(0,b$.default)(i,{cwd:M.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let s of n){let o=v.resolve(this.cwd,M.toPortablePath(s));T.existsSync(v.join(o,"package.json"))&&this.workspacesCwds.add(o)}}accepts(e){var o;let r=e.indexOf(":"),i=r!==-1?e.slice(0,r+1):null,n=r!==-1?e.slice(r+1):e;if(i===Yr.protocol&&v.normalize(n)===this.relativeCwd||i===Yr.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=Us(n);return s?i===Yr.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${v.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||r.has(a)||(r.add(a),i(a))}};return i(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&up(c.anchoredLocator,n.anchoredLocator)}))&&!r.has(s)&&(r.add(s),i(s))};return i(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let i=this.project.workspacesByCwd.get(r);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=v.join(this.cwd,Ze.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await T.changeFilePromise(r,i,{automaticNewlines:!0}),this.manifest.raw=e}};var k$=5,nUe=1,sUe=/ *, */g,P$=/\/$/,oUe=32,aUe=(0,lF.promisify)(uF.default.gzip),AUe=(0,lF.promisify)(uF.default.gunzip),li;(function(r){r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build"})(li||(li={}));var gF={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},D$=t=>zi(`${nUe}`,t),Ke=class{constructor(e,{configuration:r}){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.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var c,u,g;if(!e.projectCwd)throw new me(`No project found in ${r}`);let i=e.projectCwd,n=r,s=null;for(;s!==e.projectCwd;){if(s=n,T.existsSync(v.join(s,wt.manifest))){i=s;break}n=v.dirname(s)}let o=new Ke(e.projectCwd,{configuration:e});(c=fe.telemetry)==null||c.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(u=fe.telemetry)==null||u.reportWorkspaceCount(o.workspaces.length),(g=fe.telemetry)==null||g.reportDependencyCount(o.workspaces.reduce((f,h)=>f+h.manifest.dependencies.size+h.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};throw new me(`The nearest package directory (${Ve(e,i,Le.PATH)}) doesn't seem to be part of the project declared in ${Ve(e,o.cwd,Le.PATH)}. - -- If the project directory is right, it might be that you forgot to list ${Ve(e,v.relative(o.cwd,i),Le.PATH)} as a workspace. -- If it isn't, it's likely because you have a yarn.lock or package.json file there, confusing the project root detection.`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(T.existsSync(e)){let n=await T.readFilePromise(e,"utf8");this.lockFileChecksum=D$(n);let s=Ii(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let r=e;e=[];for(let i of r){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let r=new Dd(e,{project:this});await r.setup();let i=this.workspacesByIdent.get(r.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${Vr(this.configuration,r.locator)}: ${M.fromPortablePath(e)} conflicts with ${M.fromPortablePath(i.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){v.isAbsolute(e)||(e=v.resolve(this.cwd,e)),e=v.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let i of this.workspaces)v.relative(i.cwd,e).startsWith("../")||r&&r.cwd.length>=i.cwd.length||(r=i);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r=="undefined"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Vr(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){let r=this.tryWorkspaceByIdent(e);return r===null||(hA(e)&&(e=Ap(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Xt(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Io(e)&&(e=lp(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${lt(this.configuration,e)})`);return r}refreshWorkspaceDependencies(){for(let e of this.workspaces){let r=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!r)throw new Error(`Assertion failed: Expected workspace ${hp(this.configuration,e)} (${Ve(this.configuration,v.join(e.cwd,wt.manifest),Le.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(r.dependencies)}}forgetResolution(e){let r=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&r(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,i]of e.dependencies)hA(i)&&e.dependencies.set(r,Ap(i))}getDependencyMeta(e,r){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(St(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),r===null||!x$.default.valid(r))return i;for(let[a,l]of s)a!==null&&a===r&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:r=!1}={}){let i=new ei,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(r&&(await o.findPackageLocation(a,s)).replace(P$,"")!==e.replace(P$,""))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();let r=e.resolver||this.configuration.makeResolver(),i=new oF;await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new AF(r)]:[i,r],s=new pd([new aF(r),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,d=new Set,m=[],I=async W=>{let X=await du(async()=>await s.resolve(W,a),D=>`${lt(this.configuration,W)}: ${D}`);if(!up(W,X))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${lt(this.configuration,W)} to ${lt(this.configuration,X)})`);g.set(X.locatorHash,X);let F=this.configuration.normalizePackage(X);for(let[D,he]of F.dependencies){let pe=await this.configuration.reduceHook(Pe=>Pe.reduceDependency,he,this,F,he,{resolver:s,resolveOptions:a});if(!cp(he,pe))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let Ne=s.bindDescriptor(pe,W,a);F.dependencies.set(D,Ne)}return m.push(Promise.all([...F.dependencies.values()].map(D=>H(D)))),c.set(F.locatorHash,F),F},B=async W=>{let X=f.get(W.locatorHash);if(typeof X!="undefined")return X;let F=Promise.resolve().then(()=>I(W));return f.set(W.locatorHash,F),F},b=async(W,X)=>{let F=await H(X);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,F.locatorHash),F},R=async W=>{let X=this.resolutionAliases.get(W.descriptorHash);if(typeof X!="undefined")return b(W,this.storedDescriptors.get(X));let F=s.getResolutionDependencies(W,a),D=new Map(await Promise.all(F.map(async Ne=>{let Pe=s.bindDescriptor(Ne,p,a),qe=await H(Pe);return d.add(qe.locatorHash),[Ne.descriptorHash,qe]}))),pe=(await du(async()=>await s.getCandidates(W,D,a),Ne=>`${Xt(this.configuration,W)}: ${Ne}`))[0];if(typeof pe=="undefined")throw new Error(`${Xt(this.configuration,W)}: No candidates found`);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,pe.locatorHash),B(pe)},H=W=>{let X=h.get(W.descriptorHash);if(typeof X!="undefined")return X;l.set(W.descriptorHash,W);let F=Promise.resolve().then(()=>R(W));return h.set(W.descriptorHash,F),F};for(let W of this.workspaces){let X=W.anchoredDescriptor;m.push(H(X))}for(;m.length>0;){let W=[...m];m.length=0,await Promise.all(W)}let L=new Set(this.resolutionAliases.values()),K=new Set(c.keys()),J=new Set,ne=new Map;lUe({project:this,report:e.report,accessibleLocators:J,volatileDescriptors:L,optionalBuilds:K,peerRequirements:ne,allDescriptors:l,allResolutions:u,allPackages:c});for(let W of d)K.delete(W);for(let W of L)l.delete(W),u.delete(W);let q=this.configuration.getSupportedArchitectures(),A=new Set,V=new Set;for(let W of c.values())W.conditions!=null&&(!K.has(W.locatorHash)||(Sy(W,q)||(Sy(W,{os:[process.platform],cpu:[process.arch]})&&e.report.reportWarningOnce(z.GHOST_ARCHITECTURE,`${lt(this.configuration,W)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ve(this.configuration,"supportedArchitectures",ps.SETTING)} setting`),V.add(W.locatorHash)),A.add(W.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=J,this.conditionalLocators=A,this.disabledLocators=V,this.originalPackages=g,this.optionalBuilds=K,this.peerRequirements=ne,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:r,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,cacheOptions:s},l=Array.from(new Set(gn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return is(h)}])));n===li.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Xi.progressViaCounter(l.length);r.reportProgress(u);let g=(0,S$.default)(oUe);if(await r.startCacheReport(async()=>{await Promise.all(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(Io(h))return;let p;try{p=await o.fetch(h,a)}catch(d){d.message=`${lt(this.configuration,h)}: ${d.message}`,r.reportExceptionOnce(d),c=d;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:r,fetcher:i,mode:n}){var A,V,W;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:r},u=new Map(l.map(X=>{let F=X.makeInstaller(c),D=F.getCustomDataKey(),he=this.installersCustomData.get(D);return typeof he!="undefined"&&F.attachCustomData(he),[X,F]})),g=new Map,f=new Map,h=new Map,p=new Map(await Promise.all([...this.accessibleLocators].map(async X=>{let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");return[X,await o.fetch(F,a)]}))),d=[];for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(typeof F=="undefined")throw new Error("Assertion failed: The locator should have been registered");let D=p.get(F.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let he=[],pe=Pe=>{he.push(Pe)},Ne=this.tryWorkspaceByLocator(F);if(Ne!==null){let Pe=[],{scripts:qe}=Ne.manifest;for(let se of["preinstall","install","postinstall"])qe.has(se)&&Pe.push([Gn.SCRIPT,se]);try{for(let[se,be]of u)if(se.supportsPackage(F,c)&&(await be.installPackage(F,D,{holdFetchResult:pe})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{he.length===0?(A=D.releaseFs)==null||A.call(D):d.push(Promise.all(he).catch(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}let re=v.join(D.packageFs.getRealPath(),D.prefixPath);f.set(F.locatorHash,re),!Io(F)&&Pe.length>0&&h.set(F.locatorHash,{directives:Pe,buildLocations:[re]})}else{let Pe=l.find(se=>se.supportsPackage(F,c));if(!Pe)throw new nt(z.LINKER_NOT_FOUND,`${lt(this.configuration,F)} isn't supported by any available linker`);let qe=u.get(Pe);if(!qe)throw new Error("Assertion failed: The installer should have been registered");let re;try{re=await qe.installPackage(F,D,{holdFetchResult:pe})}finally{he.length===0?(V=D.releaseFs)==null||V.call(D):d.push(Promise.all(he).then(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}g.set(F.locatorHash,Pe),f.set(F.locatorHash,re.packageLocation),re.buildDirective&&re.buildDirective.length>0&&re.packageLocation&&h.set(F.locatorHash,{directives:re.buildDirective,buildLocations:[re.packageLocation]})}}let m=new Map;for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");let D=this.tryWorkspaceByLocator(F)!==null,he=async(pe,Ne)=>{let Pe=f.get(F.locatorHash);if(typeof Pe=="undefined")throw new Error(`Assertion failed: The package (${lt(this.configuration,F)}) should have been registered`);let qe=[];for(let re of F.dependencies.values()){let se=this.storedResolutions.get(re.descriptorHash);if(typeof se=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,re)}, from ${lt(this.configuration,F)})should have been registered`);let be=this.storedPackages.get(se);if(typeof be=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);let ae=this.tryWorkspaceByLocator(be)===null?g.get(se):null;if(typeof ae=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);ae===pe||ae===null?f.get(be.locatorHash)!==null&&qe.push([re,be]):!D&&Pe!==null&&hu(m,se).push(Pe)}Pe!==null&&await Ne.attachInternalDependencies(F,qe)};if(D)for(let[pe,Ne]of u)pe.supportsPackage(F,c)&&await he(pe,Ne);else{let pe=g.get(F.locatorHash);if(!pe)throw new Error("Assertion failed: The linker should have been found");let Ne=u.get(pe);if(!Ne)throw new Error("Assertion failed: The installer should have been registered");await he(pe,Ne)}}for(let[X,F]of m){let D=this.storedPackages.get(X);if(!D)throw new Error("Assertion failed: The package should have been registered");let he=g.get(D.locatorHash);if(!he)throw new Error("Assertion failed: The linker should have been found");let pe=u.get(he);if(!pe)throw new Error("Assertion failed: The installer should have been registered");await pe.attachExternalDependents(D,F)}let I=new Map;for(let X of u.values()){let F=await X.finalizeInstall();for(let D of(W=F==null?void 0:F.records)!=null?W:[])h.set(D.locatorHash,{directives:D.buildDirective,buildLocations:D.buildLocations});typeof(F==null?void 0:F.customData)!="undefined"&&I.set(X.getCustomDataKey(),F.customData)}if(this.installersCustomData=I,await Promise.all(d),n===li.SkipBuild)return;let B=new Set(this.storedPackages.keys()),b=new Set(h.keys());for(let X of b)B.delete(X);let R=(0,t0.createHash)("sha512");R.update(process.versions.node),await this.configuration.triggerHook(X=>X.globalHashGeneration,this,X=>{R.update("\0"),R.update(X)});let H=R.digest("hex"),L=new Map,K=X=>{let F=L.get(X.locatorHash);if(typeof F!="undefined")return F;let D=this.storedPackages.get(X.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The package should have been registered");let he=(0,t0.createHash)("sha512");he.update(X.locatorHash),L.set(X.locatorHash,"");for(let pe of D.dependencies.values()){let Ne=this.storedResolutions.get(pe.descriptorHash);if(typeof Ne=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,pe)}) should have been registered`);let Pe=this.storedPackages.get(Ne);if(typeof Pe=="undefined")throw new Error("Assertion failed: The package should have been registered");he.update(K(Pe))}return F=he.digest("hex"),L.set(X.locatorHash,F),F},J=(X,F)=>{let D=(0,t0.createHash)("sha512");D.update(H),D.update(K(X));for(let he of F)D.update(he);return D.digest("hex")},ne=new Map,q=!1;for(;b.size>0;){let X=b.size,F=[];for(let D of b){let he=this.storedPackages.get(D);if(!he)throw new Error("Assertion failed: The package should have been registered");let pe=!0;for(let qe of he.dependencies.values()){let re=this.storedResolutions.get(qe.descriptorHash);if(!re)throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,qe)}) should have been registered`);if(b.has(re)){pe=!1;break}}if(!pe)continue;b.delete(D);let Ne=h.get(he.locatorHash);if(!Ne)throw new Error("Assertion failed: The build directive should have been registered");let Pe=J(he,Ne.buildLocations);if(this.storedBuildState.get(he.locatorHash)===Pe){ne.set(he.locatorHash,Pe);continue}q||(await this.persistInstallStateFile(),q=!0),this.storedBuildState.has(he.locatorHash)?r.reportInfo(z.MUST_REBUILD,`${lt(this.configuration,he)} must be rebuilt because its dependency tree changed`):r.reportInfo(z.MUST_BUILD,`${lt(this.configuration,he)} must be built because it never has been before or the last one failed`);for(let qe of Ne.buildLocations){if(!v.isAbsolute(qe))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${qe})`);F.push((async()=>{for(let[re,se]of Ne.directives){let be=`# This file contains the result of Yarn building a package (${is(he)}) -`;switch(re){case Gn.SCRIPT:be+=`# Script name: ${se} -`;break;case Gn.SHELLCODE:be+=`# Script code: ${se} -`;break}let ae=null;if(!await T.mktempPromise(async De=>{let $=v.join(De,"build.log"),{stdout:G,stderr:Ce}=this.configuration.getSubprocessStreams($,{header:be,prefix:lt(this.configuration,he),report:r}),ee;try{switch(re){case Gn.SCRIPT:ee=await Uw(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break;case Gn.SHELLCODE:ee=await rD(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break}}catch(Oe){Ce.write(Oe.stack),ee=1}if(G.end(),Ce.end(),ee===0)return ne.set(he.locatorHash,Pe),!0;T.detachTemp(De);let Ue=`${lt(this.configuration,he)} couldn't be built successfully (exit code ${Ve(this.configuration,ee,Le.NUMBER)}, logs can be found here: ${Ve(this.configuration,$,Le.PATH)})`;return this.optionalBuilds.has(he.locatorHash)?(r.reportInfo(z.BUILD_FAILED,Ue),ne.set(he.locatorHash,Pe),!0):(r.reportError(z.BUILD_FAILED,Ue),!1)}))return}})())}}if(await Promise.all(F),X===b.size){let D=Array.from(b).map(he=>{let pe=this.storedPackages.get(he);if(!pe)throw new Error("Assertion failed: The package should have been registered");return lt(this.configuration,pe)}).join(", ");r.reportError(z.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${D})`);break}}this.storedBuildState=ne}async install(e){var a,l;let r=this.configuration.get("nodeLinker");(a=fe.telemetry)==null||a.reportInstall(r),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=ki.Inactive;let i=v.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await T.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=Ve(this.configuration,g,Le.PACKAGE_EXTENSION);switch(g.status){case ki.Inactive:e.report.reportWarning(z.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case ki.Redundant:e.report.reportWarning(z.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=ul(n,this.generateLockfile());if(c!==n){let u=(0,v$.structuredPatch)(i,i,n,c);e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.ADDED)):f.startsWith("-")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.REMOVED)):e.report.reportInfo(null,Ve(this.configuration,f,"grey"))}throw e.report.reportSeparator(),new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===ki.Active&&((l=fe.telemetry)==null||l.reportPackageExtension(Uu(g,Le.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==li.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>Iy(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===li.UpdateLockfile){e.report.reportWarning(z.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${Ve(this.configuration,"mode=update-lockfile",Le.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>Iy(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let r={};r.__metadata={version:k$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>In(f)).sort().join(", "),c=new Ze;c.version=o.linkType===gt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof r.__metadata.cacheKey=="undefined"&&(r.__metadata.cacheKey=h),h===r.__metadata.cacheKey?u=p:u=g}r[l]=_(P({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:is(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Qa(r)}async persistLockfile(){let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r="";try{r=await T.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=ul(r,i);n!==r&&(await T.writeFilePromise(e,n),this.lockFileChecksum=D$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(gF))e.push(...o);let r=(0,r0.default)(this,e),i=cF.default.serialize(r),n=zi(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await T.mkdirPromise(v.dirname(s),{recursive:!0}),await T.writeFilePromise(s,await aUe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath");if(!T.existsSync(n)){r&&await this.applyLightResolution();return}let s=await AUe(await T.readFilePromise(n));this.installStateChecksum=zi(s);let o=cF.default.deserialize(s);e&&typeof o.installersCustomData!="undefined"&&(this.installersCustomData=o.installersCustomData),i&&Object.assign(this,(0,r0.default)(o,gF.restoreBuildState)),r&&(o.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,r0.default)(o,gF.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ei}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){let i=new Set([".gitignore"]);if(!Fb(e.cwd,this.cwd)||!await T.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await T.readdirPromise(e.cwd)){if(i.has(a))continue;let l=v.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?r.reportError(z.IMMUTABLE_CACHE,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:r.reportInfo(z.UNUSED_CACHE_ENTRY,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused - removing`),await T.removePromise(l)))}n&&s!==0&&r.reportInfo(z.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function lUe({project:t,allDescriptors:e,allResolutions:r,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,volatileDescriptors:o=new Set,peerRequirements:a=new Map,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,d=new Map,m=new Map,I=new Map(t.workspaces.map(q=>{let A=q.anchoredLocator.locatorHash,V=i.get(A);if(typeof V=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,ap(V)]})),B=()=>{let q=T.mktempSync(),A=v.join(q,"stacktrace.log"),V=String(g.length+1).length,W=g.map((X,F)=>`${`${F+1}.`.padStart(V," ")} ${is(X)} -`).join("");throw T.writeFileSync(A,W),T.detachTemp(q),new nt(z.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${M.fromPortablePath(A)}`)},b=q=>{let A=r.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let V=i.get(A);if(!V)throw new Error("Assertion failed: The package could not be found");return V},R=(q,A,V,{top:W,optional:X})=>{g.length>1e3&&B(),g.push(A);let F=H(q,A,V,{top:W,optional:X});return g.pop(),F},H=(q,A,V,{top:W,optional:X})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),X||s.delete(A.locatorHash);let F=i.get(A.locatorHash);if(!F){if(c)return;throw new Error(`Assertion failed: The package (${lt(t.configuration,A)}) should have been registered`)}let D=[],he=[],pe=[],Ne=[],Pe=[];for(let re of Array.from(F.dependencies.values())){if(F.peerDependencies.has(re.identHash)&&F.locatorHash!==W)continue;if(hA(re))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");o.delete(re.descriptorHash);let se=X;if(!se){let ee=F.dependenciesMeta.get(St(re));if(typeof ee!="undefined"){let Ue=ee.get(null);typeof Ue!="undefined"&&Ue.optional&&(se=!0)}}let be=r.get(re.descriptorHash);if(!be){if(c)continue;throw new Error(`Assertion failed: The resolution (${Xt(t.configuration,re)}) should have been registered`)}let ae=I.get(be)||i.get(be);if(!ae)throw new Error(`Assertion failed: The package (${be}, resolved from ${Xt(t.configuration,re)}) should have been registered`);if(ae.peerDependencies.size===0){R(re,ae,new Map,{top:W,optional:se});continue}let Ae=u.get(ae.locatorHash);typeof Ae=="number"&&Ae>=2&&B();let De,$,G=new Set,Ce;he.push(()=>{De=kx(re,A.locatorHash),$=Px(ae,A.locatorHash),F.dependencies.delete(re.identHash),F.dependencies.set(De.identHash,De),r.set(De.descriptorHash,$.locatorHash),e.set(De.descriptorHash,De),i.set($.locatorHash,$),D.push([ae,De,$])}),pe.push(()=>{var ee;Ce=new Map;for(let Ue of $.peerDependencies.values()){let Oe=F.dependencies.get(Ue.identHash);if(!Oe&&cp(A,Ue)&&(Oe=q),(!Oe||Oe.range==="missing:")&&$.dependencies.has(Ue.identHash)){$.peerDependencies.delete(Ue.identHash);continue}Oe||(Oe=Yt(Ue,"missing:")),$.dependencies.set(Oe.identHash,Oe),hA(Oe)&&Pl(p,Oe.descriptorHash).add($.locatorHash),f.set(Oe.identHash,Oe),Oe.range==="missing:"&&G.add(Oe.identHash),Ce.set(Ue.identHash,(ee=V.get(Ue.identHash))!=null?ee:$.locatorHash)}$.dependencies=new Map(gn($.dependencies,([Ue,Oe])=>St(Oe)))}),Ne.push(()=>{if(!i.has($.locatorHash))return;let ee=u.get(ae.locatorHash),Ue=typeof ee!="undefined"?ee+1:1;u.set(ae.locatorHash,Ue),R(De,$,Ce,{top:W,optional:se}),u.set(ae.locatorHash,Ue-1)}),Pe.push(()=>{let ee=F.dependencies.get(re.identHash);if(typeof ee=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let Ue=r.get(ee.descriptorHash);if(typeof Ue=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Pl(m,Ue).add(A.locatorHash),!!i.has($.locatorHash)){for(let Oe of $.peerDependencies.values()){let vt=Ce.get(Oe.identHash);if(typeof vt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");hu(pu(d,vt),St(Oe)).push($.locatorHash)}for(let Oe of G)$.dependencies.delete(Oe)}})}for(let re of[...he,...pe])re();let qe;do{qe=!0;for(let[re,se,be]of D){if(!i.has(be.locatorHash))continue;let ae=pu(h,re.locatorHash),Ae=zi(...[...be.dependencies.values()].map(Ce=>{let ee=Ce.range!=="missing:"?r.get(Ce.descriptorHash):"missing:";if(typeof ee=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${Xt(t.configuration,Ce)} to have been registered`);return ee===W?`${ee} (top)`:ee}),se.identHash),De=ae.get(Ae);if(typeof De=="undefined"){ae.set(Ae,se);continue}if(De===se)continue;qe=!1,i.delete(be.locatorHash),e.delete(se.descriptorHash),r.delete(se.descriptorHash),n.delete(be.locatorHash);let $=p.get(se.descriptorHash)||[],G=[F.locatorHash,...$];p.delete(se.descriptorHash);for(let Ce of G){let ee=i.get(Ce);typeof ee!="undefined"&&ee.dependencies.set(se.identHash,De)}}}while(!qe);for(let re of[...Ne,...Pe])re()};for(let q of t.workspaces){let A=q.anchoredLocator;o.delete(q.anchoredDescriptor.descriptorHash),R(q.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var L;(function(V){V[V.NotProvided=0]="NotProvided",V[V.NotCompatible=1]="NotCompatible"})(L||(L={}));let K=[];for(let[q,A]of m){let V=i.get(q);if(typeof V=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let W=d.get(q);if(typeof W!="undefined")for(let X of A){let F=i.get(X);if(typeof F!="undefined")for(let[D,he]of W){let pe=En(D);if(F.peerDependencies.has(pe.identHash))continue;let Ne=`p${zi(X,D,q).slice(0,5)}`;a.set(Ne,{subject:X,requested:pe,rootRequester:q,allRequesters:he});let Pe=V.dependencies.get(pe.identHash);if(typeof Pe!="undefined"){let qe=b(Pe),re=(ne=qe.version)!=null?ne:"0.0.0",se=new Set;for(let ae of he){let Ae=i.get(ae);if(typeof Ae=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let De=Ae.peerDependencies.get(pe.identHash);if(typeof De=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");se.add(De.range)}[...se].every(ae=>{if(ae.startsWith(Yr.protocol)){if(!t.tryWorkspaceByLocator(qe))return!1;ae=ae.slice(Yr.protocol.length),(ae==="^"||ae==="~")&&(ae="*")}return lc(re,ae)})||K.push({type:1,subject:F,requested:pe,requester:V,version:re,hash:Ne,requirementCount:he.length})}else{let qe=V.peerDependenciesMeta.get(D);(qe==null?void 0:qe.optional)||K.push({type:0,subject:F,requested:pe,requester:V,hash:Ne})}}}}let J=[q=>Rx(q.subject),q=>St(q.requested),q=>`${q.type}`];for(let q of gn(K,J))switch(q.type){case 0:l==null||l.reportWarning(z.MISSING_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} doesn't provide ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}), requested by ${Vr(t.configuration,q.requester)}`);break;case 1:{let A=q.requirementCount>1?"and some of its descendants request":"requests";l==null||l.reportWarning(z.INCOMPATIBLE_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} provides ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}) with version ${fp(t.configuration,q.version)}, which doesn't satisfy what ${Vr(t.configuration,q.requester)} ${A}`)}break}K.length>0&&(l==null||l.reportWarning(z.UNNAMED,`Some peer dependencies are incorrectly met; run ${Ve(t.configuration,"yarn explain peer-requirements ",Le.CODE)} for details, where ${Ve(t.configuration,"",Le.CODE)} is the six-letter p-prefixed code`))}var Po;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(Po||(Po={}));var Rd=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!T.existsSync(i),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue(Po.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(Po.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(Po.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(Po.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(Po.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(Po.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(Po.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(Po.DEPENDENCY_COUNT,String(e))}reportValue(e,r){Pl(this.values,e).add(r)}reportEnumerator(e,r){Pl(this.enumerators,e).add(zi(r))}reportHit(e,r="*"){let i=pu(this.hits,e),n=na(i,r,()=>0);i.set(r,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return v.join(e,"telemetry.json")}sendReport(e){var u,g,f;let r=this.getRegistryPath(),i;try{i=T.readJsonSync(r)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{T.mkdirSync(v.dirname(r),{recursive:!0}),T.writeJsonSync(r,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>iP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let d=p;d.userId=h,d.reportType="primary";for(let B of Object.keys((f=d.enumerators)!=null?f:{}))d.enumerators[B]=d.enumerators[B].length;c(d);let m=new Map,I=20;for(let[B,b]of Object.entries(d.values))b.length>0&&m.set(B,b.slice(0,I));for(;m.size>0;){let B={};B.userId=h,B.reportType="secondary",B.metrics={};for(let[b,R]of m)B.metrics[b]=R.shift(),R.length===0&&m.delete(b);c(B)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),r;try{r=T.readJsonSync(e)}catch{r={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=r.blocks=(a=r.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let d of this.hits.keys()){let m=s.hits=(c=s.hits)!=null?c:{},I=m[d]=(u=m[d])!=null?u:{};for(let[B,b]of this.hits.get(d))I[B]=((g=I[B])!=null?g:0)+b}for(let d of["values","enumerators"])for(let m of this[d].keys()){let I=s[d]=(f=s[d])!=null?f:{};I[m]=[...new Set([...(h=I[m])!=null?h:[],...(p=this[d].get(m))!=null?p:[]])]}T.mkdirSync(v.dirname(e),{recursive:!0}),T.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var fF=ie(require("child_process")),R$=ie(ml());var hF=ie(require("fs"));var Yg=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"]]]]);function cUe(t){let e=M.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,fF.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,fF.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function i0({binaryVersion:t,pluginConfiguration:e}){async function r(){let n=new oo({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var p,d,m,I,B;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(process.env.YARN_IGNORE_NODE!=="1"&&!qt.satisfiesWithPrereleases(s,o))throw new me(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let a=await fe.find(M.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),l=a.get("yarnPath"),c=a.get("ignorePath"),u=a.get("ignoreCwd"),g=M.toPortablePath(M.resolve(process.argv[1])),f=b=>T.readFilePromise(b).catch(()=>Buffer.of());if(!c&&!u&&await(async()=>l===g||Buffer.compare(...await Promise.all([f(l),f(g)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(l!==null&&!c)if(!T.existsSync(l))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${a.sources.get("yarnPath")}), but the specified location doesn't exist (${l}).`))),process.exitCode=1;else try{cUe(l)}catch(b){process.exitCode=b.code||1}else{c&&delete process.env.YARN_IGNORE_PATH,a.get("enableTelemetry")&&!R$.isCI&&process.stdout.isTTY&&(fe.telemetry=new Rd(a,"puba9cdc10ec5790a2cf4969dd413a47270")),(p=fe.telemetry)==null||p.reportVersion(t);for(let[L,K]of a.plugins.entries()){Yg.has((m=(d=L.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:d[1])!=null?m:"")&&((I=fe.telemetry)==null||I.reportPluginName(L));for(let J of K.commands||[])n.register(J)}let R=n.process(process.argv.slice(2));R.help||(B=fe.telemetry)==null||B.reportCommandName(R.path.join(" "));let H=R.cwd;if(typeof H!="undefined"&&!u){let L=(0,hF.realpathSync)(process.cwd()),K=(0,hF.realpathSync)(H);if(L!==K){process.chdir(H),await r();return}}await n.runExit(R,{cwd:M.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return r().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>T.rmtempPromise())}function F$(t){t.Command.Path=(...e)=>r=>{r.paths=r.paths||[],r.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])t.Command[e]=(...r)=>(i,n)=>{let s=t.Option[e](...r);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return t}var iC={};it(iC,{BaseCommand:()=>Be,WorkspaceRequiredError:()=>rt,getDynamicLibs:()=>Wie,getPluginConfiguration:()=>F0,main:()=>i0,openWorkspace:()=>rf,pluginCommands:()=>Yg});var Be=class extends ye{constructor(){super(...arguments);this.cwd=Y.String("--cwd",{hidden:!0})}};var rt=class extends me{constructor(e,r){let i=v.relative(e,r),n=v.join(e,Ze.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var dJe=ie(Or());Ss();var CJe=ie(gN()),Wie=()=>new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",vh],["semver",dJe],["typanion",lu],["yup",CJe]]);async function rf(t,e){let{project:r,workspace:i}=await Ke.find(t,e);if(!i)throw new rt(r.cwd,e);return i}var x_e=ie(Or());Ss();var k_e=ie(gN());var hL={};it(hL,{dedupeUtils:()=>zN,default:()=>Qze,suggestUtils:()=>LN});var WAe=ie(ml());var roe=ie(aC());Ss();var LN={};it(LN,{Modifier:()=>Lo,Strategy:()=>Fr,Target:()=>vr,WorkspaceModifier:()=>af,applyModifier:()=>Zse,extractDescriptorFromPath:()=>ON,extractRangeModifier:()=>Xse,fetchDescriptorFrom:()=>MN,findProjectDescriptors:()=>toe,getModifier:()=>AC,getSuggestedDescriptors:()=>lC,makeWorkspaceDescriptor:()=>eoe,toWorkspaceModifier:()=>$se});var TN=ie(Or()),L3e="workspace:",vr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(vr||(vr={}));var Lo;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(Lo||(Lo={}));var af;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(af||(af={}));var Fr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Fr||(Fr={}));function AC(t,e){return t.exact?Lo.EXACT:t.caret?Lo.CARET:t.tilde?Lo.TILDE:e.configuration.get("defaultSemverRangePrefix")}var T3e=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function Xse(t,{project:e}){let r=t.match(T3e);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Zse(t,e){let{protocol:r,source:i,params:n,selector:s}=S.parseRange(t.range);return TN.default.valid(s)&&(s=`${e}${t.range}`),S.makeDescriptor(t,S.makeRange({protocol:r,source:i,params:n,selector:s}))}function $se(t){switch(t){case Lo.CARET:return af.CARET;case Lo.TILDE:return af.TILDE;case Lo.EXACT:return af.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function eoe(t,e){return S.makeDescriptor(t.anchoredDescriptor,`${L3e}${$se(e)}`)}async function toe(t,{project:e,target:r}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(r===vr.PEER){let o=s.manifest.peerDependencies.get(t.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(t.identHash),a=s.manifest.devDependencies.get(t.identHash);r===vr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function ON(t,{cwd:e,workspace:r}){return await M3e(async i=>{v.isAbsolute(t)||(t=v.relative(r.cwd,v.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:n}=r,s=await MN(S.makeIdent(null,"archive"),t,{project:r.project,cache:i,workspace:r});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new ei,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,r.anchoredLocator,c),g=S.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await Ze.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return S.makeDescriptor(h.name,t)})}async function lC(t,{project:e,workspace:r,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(t.range!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${S.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof r!="undefined"&&r!==null&&r.manifest[n].get(t.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Fr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${S.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Fr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await toe(t,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===r.anchoredLocator.locatorHash&&o.includes(Fr.KEEP))continue;let d=`(originally used by ${S.prettyLocator(e.configuration,p[0])}`;d+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:d})}});break;case Fr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===t.identHash&&c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Fr.PROJECT:await g(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(t);if(h===null)return;let p=eoe(h,s);c.push({descriptor:p,name:`Attach ${S.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ue.pretty(e.configuration,h.relativeCwd,ue.Type.PATH)})`})});break;case Fr.LATEST:await g(async()=>{if(t.range!=="unknown")c.push({descriptor:t,name:`Use ${S.prettyRange(e.configuration,t.range)}`,reason:"(explicit range requested)"});else if(n===vr.PEER)c.push({descriptor:S.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ue.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await MN(t,"latest",{project:e,cache:i,workspace:r,preserveModifier:!1});h&&(h=Zse(h,s),c.push({descriptor:h,name:`Use ${S.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function MN(t,e,{project:r,cache:i,workspace:n,preserveModifier:s=!0}){let o=S.makeDescriptor(t,e),a=new ei,l=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),u={project:r,fetcher:l,cache:i,checksums:r.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=_(P({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:d,source:m,params:I,selector:B}=S.parseRange(S.convertToManifestRange(p.reference));if(d===r.configuration.get("defaultProtocol")&&(d=null),TN.default.valid(B)&&s!==!1){let b=typeof s=="string"?s:o.range;B=Xse(b,{project:r})+B}return S.makeDescriptor(p,S.makeRange({protocol:d,source:m,params:I,selector:B}))}async function M3e(t){return await T.mktempPromise(async e=>{let r=fe.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Qt(e,{configuration:r,check:!1,immutable:!1}))})}var cC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=Y.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=Y.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=Y.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=Y.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=Y.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=Y.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.silent=Y.Boolean("--silent",{hidden:!0});this.packages=Y.Rest()}async execute(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=[...s?[Fr.REUSE]:[],Fr.PROJECT,...this.cached?[Fr.CACHE]:[],Fr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async m=>{let I=m.match(/^\.{0,2}\//)?await ON(m,{cwd:this.context.cwd,workspace:i}):S.parseDescriptor(m),B=O3e(i,I,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),b=await lC(I,{project:r,workspace:i,cache:n,target:B,modifier:o,strategies:a,maxResults:l});return[I,b,B]})),u=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[I,{suggestions:B,rejections:b}]of c)if(B.filter(H=>H.descriptor!==null).length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),m.reportSeparator(),m.reportExceptionOnce(H)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:m},I]of c){let B,b=m.filter(K=>K.descriptor!==null),R=b[0].descriptor,H=b.every(K=>S.areDescriptorsEqual(K.descriptor,R));b.length===1||H?B=R:(g=!0,{answer:B}=await(0,roe.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:m.map(({descriptor:K,name:J,reason:ne})=>K?{name:J,hint:ne,descriptor:K}:{name:J,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result(K){return this.find(K,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let L=i.manifest[I].get(B.identHash);(typeof L=="undefined"||L.descriptorHash!==B.descriptorHash)&&(i.manifest[I].set(B.identHash,B),this.optional&&(I==="dependencies"?i.manifest.ensureDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0:I==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0)),typeof L=="undefined"?f.push([i,I,B,a]):h.push([i,I,L,B]))}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` -`),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};cC.paths=[["add"]],cC.usage=ye.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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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"]]});var ioe=cC;function O3e(t,e,{dev:r,peer:i,preferDev:n,optional:s}){let o=t.manifest[vr.REGULAR].has(e.identHash),a=t.manifest[vr.DEVELOPMENT].has(e.identHash),l=t.manifest[vr.PEER].has(e.identHash);if((r||i)&&o)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" 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 me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" 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||n)&&s)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?vr.PEER:r||n?vr.DEVELOPMENT:o?vr.REGULAR:a?vr.DEVELOPMENT:vr.REGULAR}var uC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);if(await r.restoreInstallState(),this.name){let o=(await Kt.getPackageAccessibleBinaries(i,{project:r})).get(this.name);if(!o)throw new me(`Couldn't find a binary named "${this.name}" for package "${S.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Kt.getPackageAccessibleBinaries(i,{project:r}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:S.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${S.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};uC.paths=[["bin"]],uC.usage=ye.Usage({description:"get the path to a binary script",details:` - 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. - - 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. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var noe=uC;var gC=class extends Be{constructor(){super(...arguments);this.mirror=Y.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=Y.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await Qt.find(e);return(await Fe.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&r.mirrorCwd!==null,s=!this.mirror;n&&(await T.removePromise(r.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await T.removePromise(r.cwd)})).exitCode()}};gC.paths=[["cache","clean"],["cache","clear"]],gC.usage=ye.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var soe=gC;var ooe=ie(p0()),KN=ie(require("util")),fC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=Y.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(r)=="undefined")throw new me(`Couldn't find a configuration settings named "${r}"`);let s=e.getSpecial(r,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=de.convertMapsToIndexableObjects(s),a=i?(0,ooe.default)(o,i):o,l=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();KN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,KN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};fC.paths=[["config","get"]],fC.usage=ye.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - 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. - `,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"]]});var aoe=fC;var Eae=ie(qN()),Iae=ie(p0()),yae=ie(mae()),JN=ie(require("util")),pC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String();this.value=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new me("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>fe.updateHomeConfiguration(h):h=>fe.updateConfiguration(r(),h))(h=>{if(n){let p=(0,Eae.default)(h);return(0,yae.default)(p,this.name,o),p}else return _(P({},h),{[i]:o})});let c=(await fe.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=de.convertMapsToIndexableObjects(c),g=n?(0,Iae.default)(u,n):u;return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{JN.inspect.styles.name="cyan",h.reportInfo(z.UNNAMED,`Successfully set ${this.name} to ${(0,JN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};pC.paths=[["config","set"]],pC.usage=ye.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,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"`]]});var wae=pC;var Dae=ie(qN()),Rae=ie(Ld()),Fae=ie(Pae()),dC=class extends Be{constructor(){super(...arguments);this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>fe.updateHomeConfiguration(l):l=>fe.updateConfiguration(r(),l);return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,Rae.default)(u,this.name))return l.reportWarning(z.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Dae.default)(u):P({},u);return(0,Fae.default)(g,this.name),g}),c||l.reportInfo(z.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};dC.paths=[["config","unset"]],dC.usage=ye.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var Nae=dC;var WN=ie(require("util")),CC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=Y.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(z.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=de.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(P({key:s,effective:a,source:l},o))}}else{let n=de.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,WN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,WN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};CC.paths=[["config"]],CC.usage=ye.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var Lae=CC;Ss();var zN={};it(zN,{Strategy:()=>Oc,acceptedStrategies:()=>H4e,dedupe:()=>VN});var Tae=ie(Nn()),Oc;(function(e){e.HIGHEST="highest"})(Oc||(Oc={}));var H4e=new Set(Object.values(Oc)),G4e={highest:async(t,e,{resolver:r,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of t.storedResolutions){let c=t.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);de.getSetWithDefault(o,c.identHash).add(l)}return Array.from(t.storedDescriptors.values(),async a=>{if(e.length&&!Tae.default.isMatch(S.stringifyIdent(a),e))return null;let l=t.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=t.originalPackages.get(l);if(typeof c=="undefined"||!r.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(m=>{let I=t.originalPackages.get(m);if(typeof I=="undefined")throw new Error(`Assertion failed: The package (${m}) should have been registered`);return I.reference}),f=await r.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,d=t.originalPackages.get(p);if(typeof d=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:d}})}};async function VN(t,{strategy:e,patterns:r,cache:i,report:n}){let{configuration:s}=t,o=new ei,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:t.storedChecksums,fetcher:l,project:t,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:t,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await G4e[e](t,r,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Xi.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(I=>I.then(B=>{if(B===null)return;p++;let{descriptor:b,currentPackage:R,updatedPackage:H}=B;n.reportInfo(z.UNNAMED,`${S.prettyDescriptor(s,b)} can be deduped from ${S.prettyLocator(s,R)} to ${S.prettyLocator(s,H)}`),n.reportJson({descriptor:S.stringifyDescriptor(b),currentResolution:S.stringifyLocator(R),updatedResolution:S.stringifyLocator(H)}),t.storedResolutions.set(b.descriptorHash,H.locatorHash)}).finally(()=>h.tick())));let d;switch(p){case 0:d="No packages";break;case 1:d="One package";break;default:d=`${p} packages`}let m=ue.pretty(s,e,ue.Type.CODE);return n.reportInfo(z.UNNAMED,`${d} can be deduped using the ${m} strategy`),p})}var mC=class extends Be{constructor(){super(...arguments);this.strategy=Y.String("-s,--strategy",Oc.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:Yi(Oc)});this.check=Y.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=await Qt.find(e);await r.restoreInstallState({restoreResolutions:!1});let n=0,s=await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await VN(r,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await r.install({cache:i,report:a,mode:this.mode})})).exitCode()}};mC.paths=[["dedupe"]],mC.usage=ye.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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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"]]});var Mae=mC;var Y0=class extends Be{async execute(){let{plugins:e}=await fe.find(this.context.cwd,this.context.plugins),r=[];for(let o of e){let{commands:a}=o[1];if(a){let c=oo.from(a).definitions();r.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=Kae()["@yarnpkg/builder"].bundles.standard;for(let o of r){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};Y0.paths=[["--clipanion=definitions"]];var Uae=Y0;var q0=class extends Be{async execute(){this.context.stdout.write(this.cli.usage(null))}};q0.paths=[["help"],["--help"],["-h"]];var Hae=q0;var _N=class extends Be{constructor(){super(...arguments);this.leadingArgument=Y.String();this.args=Y.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!S.tryParseIdent(this.leadingArgument)){let e=v.resolve(this.context.cwd,M.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Gae=_N;var J0=class extends Be{async execute(){this.context.stdout.write(`${Zr||""} -`)}};J0.paths=[["-v"],["--version"]];var jae=J0;var EC=class extends Be{constructor(){super(...arguments);this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState(),await Kt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:r})}};EC.paths=[["exec"]],EC.usage=ye.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - 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). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var Yae=EC;Ss();var IC=class extends Be{constructor(){super(...arguments);this.hash=Y.String({required:!1,validator:fv(gv(),[hv(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState({restoreResolutions:!1}),await r.applyLightResolution(),typeof this.hash!="undefined"?await j4e(this.hash,r,{stdout:this.context.stdout}):(await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>S.stringifyLocator(r.storedPackages.get(a.subject)),([,a])=>S.stringifyIdent(a.requested)];for(let[a,l]of de.sortMap(r.peerRequirements,s)){let c=r.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=r.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ue.pretty(e,a,ue.Type.CODE),h=S.prettyLocator(e,c),p=S.prettyIdent(e,l.requested),d=S.prettyIdent(e,u),m=l.allRequesters.length-1,I=`descendant${m===1?"":"s"}`,B=m>0?` and ${m} ${I}`:"",b=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${b} ${p} to ${d}${B}`)}})).exitCode()}};IC.paths=[["explain","peer-requirements"]],IC.usage=ye.Usage({description:"explain a set of peer requirements",details:` - 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. - - 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. - - 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. - - **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\`). - `,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"]]});var qae=IC;async function j4e(t,e,r){let{configuration:i}=e,n=e.peerRequirements.get(t);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Fe.start({configuration:i,stdout:r.stdout,includeFooter:!1},async o=>{var I,B;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(I=a.dependencies.get(n.requested.identHash))!=null?I:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(b=>{let R=e.storedPackages.get(b);if(typeof R=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let H=S.devirtualizeLocator(R),L=e.storedPackages.get(H.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let K=L.peerDependencies.get(n.requested.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:R,peerDependency:K}});if(g!==null){let b=f.every(({peerDependency:R})=>qt.satisfiesWithPrereleases(g.version,R.range));o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} provides ${S.prettyLocator(i,g)} with version ${S.prettyReference(i,(B=g.version)!=null?B:"")}, which ${b?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} doesn't provide ${S.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ue.mark(i),p=[];for(let{pkg:b,peerDependency:R}of de.sortMap(f,H=>S.stringifyLocator(H.pkg))){let L=(g!==null?qt.satisfiesWithPrereleases(g.version,R.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:S.stringifyLocator(b),prettyLocator:S.prettyLocator(i,b),prettyRange:S.prettyRange(i,R.range),mark:L})}let d=Math.max(...p.map(({stringifiedLocator:b})=>b.length)),m=Math.max(...p.map(({prettyRange:b})=>b.length));for(let{stringifiedLocator:b,prettyLocator:R,prettyRange:H,mark:L}of de.sortMap(p,({stringifiedLocator:K})=>K))o.reportInfo(null,`${R.padEnd(d+(R.length-b.length)," ")} \u2192 ${H.padEnd(m," ")} ${L}`);p.length>1&&(o.reportSeparator(),o.reportInfo(z.UNNAMED,`Note: these requirements start with ${S.prettyLocator(e.configuration,l)}`))})).exitCode()}var Jae=ie(Nn()),yC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=Y.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=Y.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=Y.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=Y.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=Y.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=Y.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i&&!this.all)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(b,{recursive:R})=>{let H=b.anchoredLocator.locatorHash,L=new Map,K=[H];for(;K.length>0;){let J=K.shift();if(L.has(J))continue;let ne=r.storedPackages.get(J);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(L.set(J,ne),S.isVirtualLocator(ne)&&K.push(S.devirtualizeLocator(ne).locatorHash),!(!R&&J!==H))for(let q of ne.dependencies.values()){let A=r.storedResolutions.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");K.push(A)}}return L.values()},a=({recursive:b})=>{let R=new Map;for(let H of r.workspaces)for(let L of o(H,{recursive:b}))R.set(L.locatorHash,L);return R.values()},l=({all:b,recursive:R})=>b&&R?r.storedPackages.values():b?a({recursive:R}):o(i,{recursive:R}),c=({all:b,recursive:R})=>{let H=l({all:b,recursive:R}),L=this.patterns.map(ne=>{let q=S.parseLocator(ne),A=Jae.default.makeRe(S.stringifyIdent(q)),V=S.isVirtualLocator(q),W=V?S.devirtualizeLocator(q):q;return X=>{let F=S.stringifyIdent(X);if(!A.test(F))return!1;if(q.reference==="unknown")return!0;let D=S.isVirtualLocator(X),he=D?S.devirtualizeLocator(X):X;return!(V&&D&&q.reference!==X.reference||W.reference!==he.reference)}}),K=de.sortMap([...H],ne=>S.stringifyLocator(ne));return{selection:K.filter(ne=>L.length===0||L.some(q=>q(ne))),sortedLookup:K}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new me("No package matched your request");let f=new Map;if(this.dependents)for(let b of g)for(let R of b.dependencies.values()){let H=r.storedResolutions.get(R.descriptorHash);if(typeof H=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");de.getArrayWithDefault(f,H).push(b)}let h=new Map;for(let b of g){if(!S.isVirtualLocator(b))continue;let R=S.devirtualizeLocator(b);de.getArrayWithDefault(h,R.locatorHash).push(b)}let p={},d={children:p},m=e.makeFetcher(),I={project:r,fetcher:m,cache:n,checksums:r.storedChecksums,report:new ei,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},B=[async(b,R,H)=>{var J,ne;if(!R.has("manifest"))return;let L=await m.fetch(b,I),K;try{K=await Ze.find(L.prefixPath,{baseFs:L.packageFs})}finally{(J=L.releaseFs)==null||J.call(L)}H("Manifest",{License:ue.tuple(ue.Type.NO_HINT,K.license),Homepage:ue.tuple(ue.Type.URL,(ne=K.raw.homepage)!=null?ne:null)})},async(b,R,H)=>{var A;if(!R.has("cache"))return;let L={mockedPackages:r.disabledLocators,unstablePackages:r.conditionalLocators},K=(A=r.storedChecksums.get(b.locatorHash))!=null?A:null,J=n.getLocatorPath(b,K,L),ne;if(J!==null)try{ne=T.statSync(J)}catch{}let q=typeof ne!="undefined"?[ne.size,ue.Type.SIZE]:void 0;H("Cache",{Checksum:ue.tuple(ue.Type.NO_HINT,K),Path:ue.tuple(ue.Type.PATH,J),Size:q})}];for(let b of u){let R=S.isVirtualLocator(b);if(!this.virtuals&&R)continue;let H={},L={value:[b,ue.Type.LOCATOR],children:H};if(p[S.stringifyLocator(b)]=L,this.nameOnly){delete L.children;continue}let K=h.get(b.locatorHash);typeof K!="undefined"&&(H.Instances={label:"Instances",value:ue.tuple(ue.Type.NUMBER,K.length)}),H.Version={label:"Version",value:ue.tuple(ue.Type.NO_HINT,b.version)};let J=(q,A)=>{let V={};if(H[q]=V,Array.isArray(A))V.children=A.map(W=>({value:W}));else{let W={};V.children=W;for(let[X,F]of Object.entries(A))typeof F!="undefined"&&(W[X]={label:X,value:F})}};if(!R){for(let q of B)await q(b,s,J);await e.triggerHook(q=>q.fetchPackageInfo,b,s,J)}b.bin.size>0&&!R&&J("Exported Binaries",[...b.bin.keys()].map(q=>ue.tuple(ue.Type.PATH,q)));let ne=f.get(b.locatorHash);typeof ne!="undefined"&&ne.length>0&&J("Dependents",ne.map(q=>ue.tuple(ue.Type.LOCATOR,q))),b.dependencies.size>0&&!R&&J("Dependencies",[...b.dependencies.values()].map(q=>{var W;let A=r.storedResolutions.get(q.descriptorHash),V=typeof A!="undefined"&&(W=r.storedPackages.get(A))!=null?W:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:V})})),b.peerDependencies.size>0&&R&&J("Peer dependencies",[...b.peerDependencies.values()].map(q=>{var X,F;let A=b.dependencies.get(q.identHash),V=typeof A!="undefined"&&(X=r.storedResolutions.get(A.descriptorHash))!=null?X:null,W=V!==null&&(F=r.storedPackages.get(V))!=null?F:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:W})}))}Hs.emitTree(d,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};yC.paths=[["info"]],yC.usage=ye.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"]]});var Wae=yC;var W0=ie(ml());Ss();var wC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=Y.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=Y.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=Y.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=Y.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.cacheFolder=Y.String("--cache-folder",{hidden:!0});this.frozenLockfile=Y.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=Y.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=Y.Boolean("--non-interactive",{hidden:!0});this.preferOffline=Y.Boolean("--prefer-offline",{hidden:!0});this.production=Y.Boolean("--production",{hidden:!0});this.registry=Y.String("--registry",{hidden:!0});this.silent=Y.Boolean("--silent",{hidden:!0});this.networkTimeout=Y.String("--network-timeout",{hidden:!0})}async execute(){var c;let e=await fe.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let r=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(u,{error:g})=>{let f=await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async h=>{g?h.reportError(z.DEPRECATED_CLI_SETTINGS,u):h.reportWarning(z.DEPRECATED_CLI_SETTINGS,u)});return f.hasErrors()?f.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let u=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.registry!="undefined"){let u=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(u!==null)return u}if(typeof this.preferOffline!="undefined"){let u=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.production!="undefined"){let u=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(u!==null)return u}if(typeof this.nonInteractive!="undefined"){let u=await i("The --non-interactive option is deprecated",{error:!r});if(u!==null)return u}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let u=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!W0.default.NETLIFY});if(u!==null)return u}let n=(c=this.immutable)!=null?c:e.get("enableImmutableInstalls");if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{await Y4e(e,n)&&(g.reportInfo(z.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let u=e.projectCwd,g;try{g=await T.readFilePromise(v.join(u,wt.lockfile),"utf8")}catch{}if(g==null?void 0:g.includes("yarn lockfile v1")){let f=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{h.reportInfo(z.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),h.reportSeparator(),e.use("",{nodeLinker:"node-modules"},u,{overwrite:!0}),await fe.updateConfiguration(u,{nodeLinker:"node-modules"})});if(f.hasErrors())return f.exitCode()}}if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{var f;((f=fe.telemetry)==null?void 0:f.isNew)&&(g.reportInfo(z.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),g.reportInfo(z.TELEMETRY_NOTICE,`Run ${ue.pretty(e,"yarn config set --home enableTelemetry 0",ue.Type.CODE)} to disable`),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}let{project:s,workspace:o}=await Ke.find(e,this.context.cwd),a=await Qt.find(e,{immutable:this.immutableCache,check:this.checkCache});if(!o)throw new rt(s.cwd,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async u=>{await s.install({cache:a,report:u,immutable:n,mode:this.mode})})).exitCode()}};wC.paths=[["install"],ye.Default],wC.usage=ye.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **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: ). - - - **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 the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **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. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - 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.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - 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). - - 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. - - 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. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` 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. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,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"]]});var zae=wC,q4e="|||||||",J4e=">>>>>>>",W4e="=======",Vae="<<<<<<<";async function Y4e(t,e){if(!t.projectCwd)return!1;let r=v.join(t.projectCwd,t.get("lockfileFilename"));if(!await T.existsPromise(r))return!1;let i=await T.readFilePromise(r,"utf8");if(!i.includes(Vae))return!1;if(e)throw new nt(z.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=z4e(i),o,a;try{o=Ii(n),a=Ii(s)}catch(c){throw new nt(z.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=P(P({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await T.changeFilePromise(r,Qa(l),{automaticNewlines:!0}),!0}function z4e(t){let e=[[],[]],r=t.split(/\r?\n/g),i=!1;for(;r.length>0;){let n=r.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Vae)){for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===W4e){i=!1;break}else if(i||s.startsWith(q4e)){i=!0;continue}else e[0].push(s)}for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(J4e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var BC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=Y.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=Y.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=v.resolve(this.context.cwd,M.toPortablePath(this.destination)),o=await fe.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await Ke.find(o,s);if(r.cwd===a.cwd)throw new me("Invalid destination; Can't link the project to itself");if(!l)throw new rt(a.cwd,s);let c=r.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new me("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new me("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=S.stringifyIdent(f.locator),p=this.relative?v.relative(r.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Fe.start({configuration:e,stdout:this.context.stdout},async f=>{await r.install({cache:n,report:f})})).exitCode()}};BC.paths=[["link"]],BC.usage=ye.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 ",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"]]});var _ae=BC;var QC=class extends Be{constructor(){super(...arguments);this.args=Y.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};QC.paths=[["node"]],QC.usage=ye.Usage({description:"run node with the hook already setup",details:` - 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). - - 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. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Xae=QC;var lAe=ie(require("os"));var rAe=ie(require("os"));var V4e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Kc(t){let e=await Zt.get(V4e,{configuration:t});return Ii(e.toString())}var bC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await Kc(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=qr(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(P({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};bC.paths=[["plugin","list"]],bC.usage=ye.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"]]});var Zae=bC;var $ae=ie(Or()),vC=class extends Be{constructor(){super(...arguments);this.onlyIfNeeded=Y.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let r=()=>{if(typeof Zr=="undefined")throw new me("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=r();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await eAe(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await eAe(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.version))i=`file://${M.resolve(this.version)}`;else if(qt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(qt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(qt.validRange(this.version))i=`https://repo.yarnpkg.com/${await _4e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new me(`Invalid version descriptor "${this.version}"`);return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,i,ps.URL)}`),a=await T.readFilePromise(M.toPortablePath(i.slice(o.length)))):(s.reportInfo(z.UNNAMED,`Retrieving ${ue.pretty(e,i,ps.PATH)}`),a=await Zt.get(i,{configuration:e})),await XN(e,null,a,{report:s})})).exitCode()}};vC.paths=[["set","version"]],vC.usage=ye.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\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["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"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Download the version used to invoke the command","$0 set version self"]]});var tAe=vC;async function _4e(t,e){let i=(await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(n=>qt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new me(`No matching release found for range ${ue.pretty(t,e,ue.Type.RANGE)}.`);return i[0]}async function eAe(t,e){let r=await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new me(`Tag ${ue.pretty(t,e,ue.Type.RANGE)} not found`);return r.latest[e]}async function XN(t,e,r,{report:i}){var g;e===null&&await T.mktempPromise(async f=>{let h=v.join(f,"yarn.cjs");await T.writeFilePromise(h,r);let{stdout:p}=await hr.execvp(process.execPath,[M.fromPortablePath(h),"--version"],{cwd:f,env:_(P({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!$ae.default.valid(e))throw new Error(`Invalid semver version. ${ue.pretty(t,"yarn --version",ue.Type.CODE)} returned: -${e}`)});let n=(g=t.projectCwd)!=null?g:t.startingCwd,s=v.resolve(n,".yarn/releases"),o=v.resolve(s,`yarn-${e}.cjs`),a=v.relative(t.startingCwd,o),l=v.relative(n,o),c=t.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(z.UNNAMED,`Saving the new release in ${ue.pretty(t,a,"magenta")}`),await T.removePromise(v.dirname(o)),await T.mkdirPromise(v.dirname(o),{recursive:!0}),await T.writeFilePromise(o,r,{mode:493}),u){await fe.updateConfiguration(n,{yarnPath:l});let f=await Ze.tryFind(n)||new Ze;e&&de.isTaggedYarnVersion(e)&&(f.packageManager=`yarn@${e}`);let h={};f.exportTo(h);let p=v.join(n,Ze.fileName),d=`${JSON.stringify(h,null,f.indent)} -`;await T.changeFilePromise(p,d,{automaticNewlines:!0})}}var X4e=/^[0-9]+$/;function iAe(t){return X4e.test(t)?`pull/${t}/head`:t}var Z4e=({repository:t,branch:e},r)=>[["git","init",M.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin",iAe(e)],["git","reset","--hard","FETCH_HEAD"]],$4e=({branch:t})=>[["git","fetch","origin",iAe(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],eze=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(i=>["--plugin",v.resolve(r,i)])),...e?["--no-minify"]:[],"|"]],SC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=Y.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=Y.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,rAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{await $N(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(z.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await xC(eze(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=v.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await T.readFilePromise(o);await XN(e,"sources",a,{report:s}),this.skipPlugins||await tze(this,{project:r,report:s,target:i})})).exitCode()}};SC.paths=[["set","version","from","sources"]],SC.usage=ye.Usage({description:"build Yarn from master",details:` - 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. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var nAe=SC;async function xC(t,{configuration:e,context:r,target:i}){for(let[n,...s]of t){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await hr.pipevp(n,s,{cwd:i,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${ue.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await hr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw r.stdout.write(a.stdout||a.stack),a}}}}async function $N(t,{configuration:e,report:r,target:i}){let n=!1;if(!t.force&&T.existsSync(v.join(i,".git"))){r.reportInfo(z.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await xC($4e(t),{configuration:e,context:t.context,target:i}),n=!0}catch(s){r.reportSeparator(),r.reportWarning(z.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo(z.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await T.removePromise(i),await T.mkdirPromise(i,{recursive:!0}),await xC(Z4e(t,i),{configuration:e,context:t.context,target:i}))}async function tze(t,{project:e,report:r,target:i}){let n=await Kc(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await ZN(o,t,{project:e,report:r,target:i})}var sAe=ie(Or()),oAe=ie(require("url")),aAe=ie(require("vm"));var kC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await Ke.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.name)){let a=v.resolve(this.context.cwd,M.toPortablePath(this.name));i.reportInfo(z.UNNAMED,`Reading ${ue.pretty(e,a,ue.Type.PATH)}`),s=v.relative(n.cwd,a),o=await T.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new oAe.URL(this.name)}catch{throw new nt(z.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=S.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!sAe.default.valid(l.reference))throw new nt(z.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=S.stringifyIdent(l),u=await Kc(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" 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).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Zr!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Zr}/`))}i.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,a,"green")}`),o=await Zt.get(a,{configuration:e})}await eL(s,o,{project:n,report:i})})).exitCode()}};kC.paths=[["plugin","import"]],kC.usage=ye.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - 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). - `,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"]]});var AAe=kC;async function eL(t,e,{project:r,report:i}){let{configuration:n}=r,s={},o={exports:s};(0,aAe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=v.resolve(r.cwd,l);i.reportInfo(z.UNNAMED,`Saving the new plugin in ${ue.pretty(n,l,"magenta")}`),await T.mkdirPromise(v.dirname(c),{recursive:!0}),await T.writeFilePromise(c,e);let u={path:l,spec:t};await fe.updateConfiguration(r.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let d=typeof p!="string"?p.path:p,m=v.resolve(r.cwd,M.toPortablePath(d)),{name:I}=de.dynamicRequire(m);I!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),_(P({},g),{plugins:f})})}var rze=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],PC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,lAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await Ke.find(e,this.context.cwd),o=S.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=S.stringifyIdent(o),l=await Kc(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" 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.`);let c=a;await $N(this,{configuration:e,report:n,target:r}),await ZN(c,this,{project:s,report:n,target:r})})).exitCode()}};PC.paths=[["plugin","import","from","sources"]],PC.usage=ye.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - 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. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,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"]]});var cAe=PC;async function ZN(t,{context:e,noMinify:r},{project:i,report:n,target:s}){let o=t.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(z.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await xC(rze({pluginName:o,noMinify:r},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=v.resolve(s,`packages/${o}/bundles/${t}.js`),c=await T.readFilePromise(l);await eL(t,c,{project:i,report:n})}var DC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=S.parseIdent(s);if(!e.plugins.has(s))throw new me(`${S.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=v.resolve(r.cwd,a);T.existsSync(l)&&(n.reportInfo(z.UNNAMED,`Removing ${ue.pretty(e,a,ue.Type.PATH)}...`),await T.removePromise(l)),n.reportInfo(z.UNNAMED,"Updating the configuration..."),await fe.updateConfiguration(r.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:_(P({},c),{plugins:u})})})).exitCode()}};DC.paths=[["plugin","remove"]],DC.usage=ye.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **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. - `,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"]]});var uAe=DC;var RC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};RC.paths=[["plugin","runtime"]],RC.usage=ye.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var gAe=RC;var FC=class extends Be{constructor(){super(...arguments);this.idents=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(S.parseIdent(a).identHash);if(await r.restoreInstallState({restoreResolutions:!1}),await r.resolveEverything({cache:n,report:new ei}),s.size>0)for(let a of r.storedPackages.values())s.has(a.identHash)&&r.storedBuildState.delete(a.locatorHash);else r.storedBuildState.clear();return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await r.install({cache:n,report:a})})).exitCode()}};FC.paths=[["rebuild"]],FC.usage=ye.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - 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). - - 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. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var fAe=FC;var tL=ie(Nn());Ss();var NC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=this.all?r.workspaces:[i],o=[vr.REGULAR,vr.DEVELOPMENT,vr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,d=S.parseIdent(h);for(let m of s){let I=[...m.manifest.peerDependenciesMeta.keys()];for(let B of(0,tL.default)(I,h))m.manifest.peerDependenciesMeta.delete(B),l=!0,p=!0;for(let B of o){let b=m.manifest.getForScope(B),R=[...b.values()].map(H=>S.stringifyIdent(H));for(let H of(0,tL.default)(R,S.stringifyIdent(d))){let{identHash:L}=S.parseIdent(H),K=b.get(L);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");m.manifest[B].delete(L),c.push([m,B,K]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new me(`${u} ${ue.prettyList(e,a,ps.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Fe.start({configuration:e,stdout:this.context.stdout},async p=>{await r.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};NC.paths=[["remove"]],NC.usage=ye.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` 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. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - 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. - `,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}'"]]});var hAe=NC;var pAe=ie(require("util")),z0=class extends Be{async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=de.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,pAe.inspect)(g,l)}`)})).exitCode()}};z0.paths=[["run"]];var dAe=z0;var LC=class extends Be{constructor(){super(...arguments);this.inspect=Y.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=Y.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=Y.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=Y.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=Y.Boolean("--silent",{hidden:!0});this.scriptName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i,locator:n}=await Ke.find(e,this.context.cwd);await r.restoreInstallState();let s=this.topLevel?r.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Kt.hasPackageScript(s,this.scriptName,{project:r}))return await Kt.executePackageScript(s,this.scriptName,this.args,{project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Kt.getPackageAccessibleBinaries(s,{project:r});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Kt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(r.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Kt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.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 me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new me("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Yg)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new me(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new me(`Couldn't find a script named "${this.scriptName}".`)}}};LC.paths=[["run"]],LC.usage=ye.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - 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. - - 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). - `,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"]]});var CAe=LC;var TC=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=Y.String();this.resolution=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(await r.restoreInstallState({restoreResolutions:!1}),!i)throw new rt(r.cwd,this.context.cwd);let s=S.parseDescriptor(this.descriptor,!0),o=S.makeDescriptor(s,this.resolution);return r.storedDescriptors.set(s.descriptorHash,s),r.storedDescriptors.set(o.descriptorHash,o),r.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};TC.paths=[["set","resolution"]],TC.usage=ye.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"]]});var mAe=TC;var EAe=ie(Nn()),MC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=r.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=v.resolve(this.context.cwd,M.toPortablePath(l));if(de.isPathLike(l)){let u=await fe.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await Ke.find(u,c);if(!f)throw new rt(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(S.stringifyIdent(h.locator));if(o.size===0)throw new me("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be unlinked");o.add(S.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,EAe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};MC.paths=[["unlink"]],MC.usage=ye.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var IAe=MC;var yAe=ie(aC()),rL=ie(Nn());Ss();var uf=class extends Be{constructor(){super(...arguments);this.interactive=Y.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=[...r.storedDescriptors.values()],o=s.map(u=>S.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(S.parseDescriptor(u).range!=="unknown")throw new me("Ranges aren't allowed when using --recursive");for(let g of(0,rL.default)(o,u)){let f=S.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)r.storedDescriptors.delete(u.descriptorHash),r.storedResolutions.delete(u.descriptorHash);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{await r.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=s?[Fr.KEEP,Fr.REUSE,Fr.PROJECT,Fr.LATEST]:[Fr.PROJECT,Fr.LATEST],l=[],c=[];for(let m of this.patterns){let I=!1,B=S.parseDescriptor(m);for(let b of r.workspaces)for(let R of[vr.REGULAR,vr.DEVELOPMENT]){let L=[...b.manifest.getForScope(R).values()].map(K=>S.stringifyIdent(K));for(let K of(0,rL.default)(L,S.stringifyIdent(B))){let J=S.parseIdent(K),ne=b.manifest[R].get(J.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let q=S.makeDescriptor(J,B.range);l.push(Promise.resolve().then(async()=>[b,R,ne,await lC(q,{project:r,workspace:b,cache:n,target:R,modifier:o,strategies:a})])),I=!0}}I||c.push(m)}if(c.length>1)throw new me(`Patterns ${ue.prettyList(e,c,ps.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new me(`Pattern ${ue.prettyList(e,c,ps.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[,,I,{suggestions:B,rejections:b}]of u){let R=B.filter(H=>H.descriptor!==null);if(R.length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let L=this.cli.error(H);r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range - -${L}`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${L}`)}else R.length>1&&!s&&m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[m,I,,{suggestions:B}]of u){let b,R=B.filter(J=>J.descriptor!==null),H=R[0].descriptor,L=R.every(J=>S.areDescriptorsEqual(J.descriptor,H));R.length===1||L?b=H:(f=!0,{answer:b}=await(0,yAe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${S.prettyWorkspace(e,m)} \u276F ${I}?`,choices:B.map(({descriptor:J,name:ne,reason:q})=>J?{name:ne,hint:q,descriptor:J}:{name:ne,hint:q,disabled:!0}),onCancel:()=>process.exit(130),result(J){return this.find(J,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let K=m.manifest[I].get(b.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if(K.descriptorHash!==b.descriptorHash)m.manifest[I].set(b.identHash,b),h.push([m,I,K,b]);else{let J=e.makeResolver(),ne={project:r,resolver:J},q=J.bindDescriptor(K,m.anchoredLocator,ne);r.forgetResolution(q)}}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` -`),(await Fe.start({configuration:e,stdout:this.context.stdout},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};uf.paths=[["up"]],uf.usage=ye.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 `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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'"]]}),uf.schema=[pv("recursive",Bl.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var wAe=uf;var OC=class extends Be{constructor(){super(...arguments);this.recursive=Y.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=Y.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=S.parseIdent(this.package).identHash,s=this.recursive?nze(r,n,{configuration:e,peers:this.peers}):ize(r,n,{configuration:e,peers:this.peers});Hs.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};OC.paths=[["why"]],OC.usage=ye.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - 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. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var BAe=OC;function ize(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.storedPackages.values(),a=>S.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=t.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=t.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=S.stringifyLocator(a);s[p]={value:[a,ue.Type.LOCATOR],children:l}}let h=S.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ue.Type.DEPENDENT]}}}return o}function nze(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.workspaces,f=>S.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let d=t.storedResolutions.get(p.descriptorHash);if(!d)throw new Error("Assertion failed: The resolution should have been registered");let m=t.storedPackages.get(d);if(!m)throw new Error("Assertion failed: The package should have been registered");a(m)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let d=p!==null?ue.tuple(ue.Type.DEPENDENT,{locator:f,descriptor:p}):ue.tuple(ue.Type.LOCATOR,f),m={},I={value:d,children:m},B=S.stringifyLocator(f);if(h[B]=I,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&t.tryWorkspaceByLocator(f))))for(let b of f.dependencies.values()){if(!i&&f.peerDependencies.has(b.identHash))continue;let R=t.storedResolutions.get(b.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let H=t.storedPackages.get(R);if(!H)throw new Error("Assertion failed: The package should have been registered");g(H,m,b)}};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var fL={};it(fL,{default:()=>wze,gitUtils:()=>Uc});var Uc={};it(Uc,{TreeishProtocols:()=>vn,clone:()=>cL,fetchBase:()=>jAe,fetchChangedFiles:()=>YAe,fetchChangedWorkspaces:()=>Ize,fetchRoot:()=>GAe,isGitUrl:()=>ff,lsRemote:()=>HAe,normalizeLocator:()=>AL,normalizeRepoUrl:()=>KC,resolveUrl:()=>lL,splitRepoUrl:()=>UC});var oL=ie(OAe()),gf=ie(require("querystring")),aL=ie(Or()),KAe=ie(require("url"));function UAe(){return _(P({},process.env),{GIT_SSH_COMMAND:"ssh -o BatchMode=yes"})}var Eze=[/^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\/(.+)?$/],vn;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(vn||(vn={}));function ff(t){return t?Eze.some(e=>!!t.match(e)):!1}function UC(t){t=KC(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:vn.Head,request:"HEAD"},extra:{}};let r=t.slice(0,e),i=t.slice(e+1);if(i.match(/^[a-z]+=/)){let n=gf.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(vn).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=vn.Head,a="HEAD");for(let l of Object.values(vn))delete n[l];return{repo:r,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:r,treeish:{protocol:s,request:o},extra:{}}}}function KC(t,{git:e=!1}={}){var r;if(t=t.replace(/^git\+https:/,"https:"),t=t.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"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){t=t.replace(/^git\+([^:]+):/,"$1:");let i;try{i=KAe.default.parse(t)}catch{i=null}i&&i.protocol==="ssh:"&&((r=i.path)==null?void 0:r.startsWith("/:"))&&(t=t.replace(/^ssh:\/\//,""))}return t}function AL(t){return S.makeLocator(t,KC(t.reference))}async function HAe(t,e){let r=KC(t,{git:!0});if(!Zt.getNetworkSettings(`https://${(0,oL.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let n;try{n=await hr.execvp("git",["ls-remote",r],{cwd:e.startingCwd,env:UAe(),strict:!0})}catch(l){throw l.message=`Listing the refs for ${t} failed`,l}let s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function lL(t,e){let{repo:r,treeish:{protocol:i,request:n},extra:s}=UC(t),o=await HAe(r,e),a=(c,u)=>{switch(c){case vn.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return gf.default.stringify(_(P({},s),{commit:u}))}case vn.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Semver:{let g=qt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,d])=>[aL.default.parse(p.slice(10)),d]).filter(p=>p[0]!==null)),h=aL.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return gf.default.stringify(_(P({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(vn.Commit,u))!==null||(g=l(vn.Tag,u))!==null||(g=l(vn.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${r}#${a(i,n)}`}async function cL(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:i,request:n}}=UC(t);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=KC(r,{git:!0});if(Zt.getNetworkSettings(`https://${(0,oL.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await T.mktempPromise(),a={cwd:o,env:UAe(),strict:!0};try{await hr.execvp("git",["clone","-c core.autocrlf=false",s,M.fromPortablePath(o)],a),await hr.execvp("git",["checkout",`${n}`],a)}catch(l){throw l.message=`Repository clone failed: ${l.message}`,l}return o})}async function GAe(t){let e=null,r,i=t;do r=i,await T.existsPromise(v.join(r,".git"))&&(e=r),i=v.dirname(r);while(e===null&&i!==r);return e}async function jAe(t,{baseRefs:e}){if(e.length===0)throw new me("Can't run this command with zero base refs specified.");let r=[];for(let a of e){let{code:l}=await hr.execvp("git",["merge-base",a,"HEAD"],{cwd:t});l===0&&r.push(a)}if(r.length===0)throw new me(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await hr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),n=i.trim(),{stdout:s}=await hr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:t,strict:!0}),o=s.trim();return{hash:n,title:o}}async function YAe(t,{base:e,project:r}){let i=de.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:n}=await hr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),{stdout:o}=await hr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!v.relative(r.cwd,c).match(i)):l}async function Ize({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new me("This command can only be run from within a Yarn project");let r=[v.resolve(e.cwd,e.configuration.get("cacheFolder")),v.resolve(e.cwd,e.configuration.get("installStatePath")),v.resolve(e.cwd,e.configuration.get("lockfileFilename")),v.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&r.push(o)});let i=await GAe(e.configuration.projectCwd);if(i==null)throw new me("This command can only be run on Git repositories");let n=await jAe(i,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),s=await YAe(i,{base:n.hash,project:e});return new Set(de.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?de.mapAndFilter.skip:r.some(l=>o.startsWith(l))?de.mapAndFilter.skip:a}))}var uL=class{supports(e,r){return ff(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,n=AL(e),s=new Map(r.checksums);s.set(n.locatorHash,i);let o=_(P({},r),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:S.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,r){return r.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let i=await cL(e.reference,r.project.configuration),n=UC(e.reference),s=v.join(i,"package.tgz");await Kt.prepareExternalProject(i,s,{configuration:r.project.configuration,report:r.report,workspace:n.extra.workspace,locator:e});let o=await T.readFilePromise(s);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}))}};var gL=class{supportsDescriptor(e,r){return ff(e.range)}supportsLocator(e,r){return ff(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=await lL(e.range,i.project.configuration);return[S.makeLocator(e,n)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var yze={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:ge.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:ge.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:ge.NUMBER,default:2}},fetchers:[uL],resolvers:[gL]};var wze=yze;var HC=class extends Be{constructor(){super(...arguments);this.since=Y.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Uc.fetchChangedWorkspaces({ref:this.since,project:r}):r.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of Ze.hardDependencies)for(let[h,p]of l.getForScope(f)){let d=r.tryWorkspaceByDescriptor(p);d===null?r.workspacesByIdent.has(h)&&g.add(p):u.add(d)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>S.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(P({location:a.relativeCwd,name:l.name?S.stringifyIdent(l.name):null},c))}})).exitCode()}};HC.paths=[["workspaces","list"]],HC.usage=ye.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - 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 "});var qAe=HC;var GC=class extends Be{constructor(){super(...arguments);this.workspaceName=Y.String();this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=r.workspaces,s=new Map(n.map(a=>{let l=S.convertToIdent(a.locator);return[S.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new me(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};GC.paths=[["workspace"]],GC.usage=ye.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,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"]]});var JAe=GC;var Bze={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:ge.BOOLEAN,default:WAe.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:ge.STRING,values:["^","~",""],default:Lo.CARET}},commands:[soe,aoe,wae,Nae,mAe,nAe,tAe,qAe,Uae,Hae,Gae,jae,ioe,noe,Lae,Mae,Yae,qae,Wae,zae,_ae,IAe,Xae,cAe,AAe,uAe,Zae,gAe,fAe,hAe,dAe,CAe,wAe,BAe,JAe]},Qze=Bze;var mL={};it(mL,{default:()=>vze});var Me={optional:!0},zAe=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Me}}],["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"]:Me,["postcss-jsx"]:Me,["postcss-less"]:Me,["postcss-markdown"]:Me,["postcss-scss"]:Me}}],["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"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Me}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Me}}],["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@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Me,"vue-template-compiler":Me}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.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:Me,"utf-8-validate":Me}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@*",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@*",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me,"vuetify-loader":Me}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Me}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Me}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Me,tinyliquid:Me,"liquid-node":Me,jade:Me,"then-jade":Me,dust:Me,"dustjs-helpers":Me,"dustjs-linkedin":Me,swig:Me,"swig-templates":Me,"razor-tmpl":Me,atpl:Me,liquor:Me,twig:Me,ejs:Me,eco:Me,jazz:Me,jqtpl:Me,hamljs:Me,hamlet:Me,whiskers:Me,"haml-coffee":Me,"hogan.js":Me,templayed:Me,handlebars:Me,underscore:Me,lodash:Me,pug:Me,"then-pug":Me,qejs:Me,walrus:Me,mustache:Me,just:Me,ect:Me,mote:Me,toffee:Me,dot:Me,"bracket-template":Me,ractive:Me,nunjucks:Me,htmling:Me,"babel-core":Me,plates:Me,"react-dom":Me,react:Me,"arc-templates":Me,vash:Me,slm:Me,marko:Me,teacup:Me,"coffee-script":Me,squirrelly:Me,twing:Me}}],["vue-loader@<=16.3.1",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@*",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@*",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@*",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@*",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Me}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Me}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Me,"webpack-command":Me}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Me}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Me}}]];var pL;function VAe(){return typeof pL=="undefined"&&(pL=require("zlib").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()),pL}var dL;function _Ae(){return typeof dL=="undefined"&&(dL=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),dL}var CL;function XAe(){return typeof CL=="undefined"&&(CL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),CL}var ZAe=new Map([[S.makeIdent(null,"fsevents").identHash,VAe],[S.makeIdent(null,"resolve").identHash,_Ae],[S.makeIdent(null,"typescript").identHash,XAe]]),bze={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,i]of zAe)e(S.parseDescriptor(r,!0),i)},getBuiltinPatch:async(t,e)=>{var s;let r="compat/";if(!e.startsWith(r))return;let i=S.parseIdent(e.slice(r.length)),n=(s=ZAe.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(t,e,r,i)=>typeof ZAe.get(t.identHash)=="undefined"?t:S.makeDescriptor(t,S.makeRange({protocol:"patch:",source:S.stringifyDescriptor(t),selector:`~builtin`,params:null}))}},vze=bze;var EL={};it(EL,{default:()=>xze});var V0=class extends Be{constructor(){super(...arguments);this.pkg=Y.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let r=S.parseIdent(this.command),i=S.makeIdent(r.scope,`create-${r.name}`);return this.cli.run(["dlx",...e,S.stringifyIdent(i),...this.args])}};V0.paths=[["create"]];var $Ae=V0;var jC=class extends Be{constructor(){super(...arguments);this.packages=Y.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){return fe.telemetry=null,await T.mktempPromise(async e=>{var p;let r=v.join(e,`dlx-${process.pid}`);await T.mkdirPromise(r),await T.writeFilePromise(v.join(r,"package.json"),`{} -`),await T.writeFilePromise(v.join(r,"yarn.lock"),"");let i=v.join(r,".yarnrc.yml"),n=await fe.findProjectCwd(this.context.cwd,wt.lockfile),s=!(await fe.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?v.join(n,".yarnrc.yml"):null;o!==null&&T.existsSync(o)?(await T.copyFilePromise(o,i),await fe.updateConfiguration(r,d=>{let m=_(P({},d),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(d.plugins)&&(m.plugins=d.plugins.map(I=>{let B=typeof I=="string"?I:I.path,b=M.isAbsolute(B)?B:M.resolve(M.fromPortablePath(n),B);return typeof I=="string"?b:{path:b,spec:I.spec}})),m})):await T.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=S.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:r,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await fe.find(r,this.context.plugins),{project:g,workspace:f}=await Ke.find(u,r);if(f===null)throw new rt(g.cwd,r);await g.restoreInstallState();let h=await Kt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Kt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};jC.paths=[["dlx"]],jC.usage=ye.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"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var ele=jC;var Sze={commands:[$Ae,ele]},xze=Sze;var xL={};it(xL,{default:()=>Dze,fileUtils:()=>IL});var hf=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,YC=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Nr="file:";var IL={};it(IL,{makeArchiveFromLocator:()=>_0,makeBufferFromLocator:()=>BL,makeLocator:()=>wL,makeSpec:()=>tle,parseSpec:()=>yL});function yL(t){let{params:e,selector:r}=S.parseRange(t),i=M.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?S.parseLocator(e.locator):null,path:i}}function tle({parentLocator:t,path:e,folderHash:r,protocol:i}){let n=t!==null?{locator:S.stringifyLocator(t)}:{},s=typeof r!="undefined"?{hash:r}:{};return S.makeRange({protocol:i,source:e,selector:e,params:P(P({},s),n)})}function wL(t,{parentLocator:e,path:r,folderHash:i,protocol:n}){return S.makeLocator(t,tle({parentLocator:e,path:r,folderHash:i,protocol:n}))}async function _0(t,{protocol:e,fetchOptions:r,inMemory:i=!1}){let{parentLocator:n,path:s}=S.parseFileStyleRange(t.reference,{protocol:e}),o=v.isAbsolute(s)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(n,r),a=o.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=v.join(a.prefixPath,s);return await de.releaseAfterUseAsync(async()=>await Ai.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:S.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function BL(t,{protocol:e,fetchOptions:r}){return(await _0(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var QL=class{supports(e,r){return!!e.reference.startsWith(Nr)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async fetchFromDisk(e,r){return _0(e,{protocol:Nr,fetchOptions:r})}};var kze=2,bL=class{supportsDescriptor(e,r){return e.range.match(hf)?!0:!!e.range.startsWith(Nr)}supportsLocator(e,r){return!!e.reference.startsWith(Nr)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=yL(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await BL(S.makeLocator(e,S.makeRange({protocol:Nr,source:n,selector:n,params:{locator:S.stringifyLocator(s)}})),{protocol:Nr,fetchOptions:i.fetchOptions}),a=mn.makeHash(`${kze}`,o).slice(0,6);return[wL(e,{parentLocator:s,path:n,folderHash:a,protocol:Nr})]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var vL=class{supports(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.join(o.prefixPath,n),c=await a.readFilePromise(l);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(c,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var SL=class{supportsDescriptor(e,r){return YC.test(e.range)?!!(e.range.startsWith(Nr)||hf.test(e.range)):!1}supportsLocator(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range;return n.startsWith(Nr)&&(n=n.slice(Nr.length)),[S.makeLocator(e,`${Nr}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var Pze={fetchers:[vL,QL],resolvers:[SL,bL]},Dze=Pze;var PL={};it(PL,{default:()=>Nze});var rle=ie(require("querystring")),ile=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function nle(t){return t?ile.some(e=>!!t.match(e)):!1}function sle(t){let e;for(let a of ile)if(e=t.match(a),e)break;if(!e)throw new Error(Rze(t));let[,r,i,n,s="master"]=e,{commit:o}=rle.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:r,username:i,reponame:n,treeish:s}}function Rze(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var kL=class{supports(e,r){return!!nle(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await T.mktempPromise(async n=>{let s=new Ft(n);await Ai.extractArchiveTo(i,s,{stripComponents:1});let o=Uc.splitRepoUrl(e.reference),a=v.join(n,"package.tgz");await Kt.prepareExternalProject(n,a,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let l=await T.readFilePromise(a);return await Ai.convertToZip(l,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:i,username:n,reponame:s,treeish:o}=sle(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var Fze={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let i=new kL;if(!i.supports(e,r))return null;try{return await i.fetch(e,r)}catch(n){return null}}}},Nze=Fze;var FL={};it(FL,{default:()=>Tze});var qC=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,JC=/^https?:/;var DL=class{supports(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(e.reference,{configuration:r.project.configuration});return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var RL=class{supportsDescriptor(e,r){return qC.test(e.range)?!!JC.test(e.range):!1}supportsLocator(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[S.convertDescriptorToLocator(e)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var Lze={fetchers:[DL],resolvers:[RL]},Tze=Lze;var ML={};it(ML,{default:()=>M5e});var Rle=ie(Dle()),TL=ie(require("util")),WC=class extends Be{constructor(){super(...arguments);this.private=Y.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=Y.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=Y.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=Y.Boolean("-2",!1,{hidden:!0});this.yes=Y.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=Y.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return r!==null?await this.executeProxy(e,r):await this.executeRegular(e)}async executeProxy(e,r){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new me("Cannot use the --install flag from within a project subdirectory");T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=v.join(this.context.cwd,e.get("lockfileFilename"));T.existsSync(i)||await T.writeFilePromise(i,"");let n=await this.cli.run(["set","version",r],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await T.mktempPromise(async o=>{let{code:a}=await hr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Kt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let r=null;try{r=(await Ke.find(e,this.context.cwd)).project}catch{r=null}T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=await Ze.tryFind(this.context.cwd)||new Ze,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:S.makeIdent(e.get("initScope"),v.basename(this.context.cwd)),i.packageManager=Zr&&de.isTaggedYarnVersion(Zr)?`yarn@${Zr}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await T.mkdirPromise(v.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),TL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,TL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=v.join(this.context.cwd,Ze.fileName);await T.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=v.join(this.context.cwd,"README.md");if(T.existsSync(a)||await T.writeFilePromise(a,`# ${S.stringifyIdent(i.name)} -`),!r||r.cwd===this.context.cwd){let c=v.join(this.context.cwd,wt.lockfile);T.existsSync(c)||await T.writeFilePromise(c,"");let g=["/.yarn/*","!/.yarn/patches","!/.yarn/plugins","!/.yarn/releases","!/.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(m=>`${m} -`).join(""),f=v.join(this.context.cwd,".gitignore");T.existsSync(f)||await T.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,Rle.default)(h,e.get("initEditorConfig"));let p=`root = true -`;for(let[m,I]of Object.entries(h)){p+=` -[${m}] -`;for(let[B,b]of Object.entries(I))p+=`${B.replace(/[A-Z]/g,H=>`_${H.toLowerCase()}`)} = ${b} -`}let d=v.join(this.context.cwd,".editorconfig");T.existsSync(d)||await T.writeFilePromise(d,p),T.existsSync(v.join(this.context.cwd,".git"))||await hr.execvp("git",["init"],{cwd:this.context.cwd})}}};WC.paths=[["init"]],WC.usage=ye.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"]]});var Fle=WC;var T5e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:ge.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}}},commands:[Fle]},M5e=T5e;var GL={};it(GL,{default:()=>K5e});var Ua="portal:",Ha="link:";var OL=class{supports(e,r){return!!e.reference.startsWith(Ua)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot}}};var KL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ua)}supportsLocator(e,r){return!!e.reference.startsWith(Ua)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ua.length);return[S.makeLocator(e,`${Ua}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var UL=class{supports(e,r){return!!e.reference.startsWith(Ha)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0}}};var HL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ha)}supportsLocator(e,r){return!!e.reference.startsWith(Ha)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ha.length);return[S.makeLocator(e,`${Ha}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){return _(P({},e),{version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var O5e={fetchers:[UL,OL],resolvers:[HL,KL]},K5e=O5e;var mT={};it(mT,{default:()=>Y6e});var Ga;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(Ga||(Ga={}));var jL=(t,e)=>`${t}@${e}`,Nle=(t,e)=>{let r=e.indexOf("#"),i=r>=0?e.substring(r+1):e;return jL(t,i)},qs;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(qs||(qs={}));var Tle=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||r>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:r,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=U5e(t,s),l=!1,c=0;do l=YL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=zC(a);if(YL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${zC(a)}`);let f=Lle(a);if(f)throw new Error(`${f}, after hoisting finished: -${zC(a)}`)}return s.debugLevel>=2&&console.log(zC(a)),H5e(a)},G5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())r.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),r},j5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of t)u=g.dependencies.get(c.name),u&&r.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),r},Mle=(t,e)=>{if(e.decoupled)return e;let{name:r,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:p,hoistedTo:d}=e,m={name:r,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:new Map(p),hoistedTo:new Map(d)},I=m.dependencies.get(r);return I&&I.ident==m.ident&&m.dependencies.set(r,m),t.dependencies.set(m.name,m),m},Y5e=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let n of t.dependencies.values())t.peerNames.has(n.name)||r.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!t.peerNames.has(s)){let a=r.get(s);a||(a=[],r.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return r},qL=t=>{let e=new Set,r=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!t.peerNames.has(s)){let o=t.dependencies.get(s);o&&!e.has(o)&&r(o,n)}e.add(i)}};for(let i of t.dependencies.values())t.peerNames.has(i.name)||r(i);return e},YL=(t,e,r,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=J5e(o),l=Y5e(o,a),c=t==o?new Map:n.fastLookupPossible?G5e(e):j5e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([d,m])=>[d,m[0]])),p=new Map;do{let d=q5e(t,e,r,c,h,l,i,p,n);d.isGraphChanged&&(f=!0),d.anotherRoundNeeded&&(g=!0),u=!1;for(let[m,I]of l)I.length>1&&!o.dependencies.has(m)&&(h.delete(m),I.shift(),h.set(m,I[0]),u=!0)}while(u);for(let d of o.dependencies.values())if(!o.peerNames.has(d.name)&&!r.has(d.locator)){r.add(d.locator);let m=YL(t,[...e,d],r,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),r.delete(d.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},W5e=(t,e,r,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(m=>wi(m)).join("\u2192")}`);let h=r[r.length-1],d=!(i.ident===h.ident);if(l&&!d&&(g="- self-reference"),d&&(d=!i.isWorkspace,l&&!d&&(g="- workspace")),d&&(d=!h.isWorkspace||h.hoistedFrom.has(i.name)||e.size===1,l&&!d&&(g=h.reasons.get(i.name))),d&&(d=!t.peerNames.has(i.name),l&&!d&&(g=`- cannot shadow peer: ${wi(t.originalDependencies.get(i.name).locator)} at ${u}`)),d){let m=!1,I=n.get(i.name);if(m=!I||I.ident===i.ident,l&&!m&&(g=`- filled by: ${wi(I.locator)} at ${u}`),m)for(let B=r.length-1;B>=1;B--){let R=r[B].dependencies.get(i.name);if(R&&R.ident!==i.ident){m=!1;let H=a.get(h);H||(H=new Set,a.set(h,H)),H.add(i.name),l&&(g=`- filled by ${wi(R.locator)} at ${r.slice(0,B).map(L=>wi(L.locator)).join("\u2192")}`);break}}d=m}if(d&&(d=s.get(i.name)===i.ident,l&&!d&&(g=`- filled by: ${wi(o.get(i.name)[0])} at ${u}`)),d){let m=!0,I=new Set(i.peerNames);for(let B=r.length-1;B>=1;B--){let b=r[B];for(let R of I){if(b.peerNames.has(R)&&b.originalDependencies.has(R))continue;let H=b.dependencies.get(R);H&&t.dependencies.get(R)!==H&&(B===r.length-1?f.add(H):(f=null,m=!1,l&&(g=`- peer dependency ${wi(H.locator)} from parent ${wi(b.locator)} was not hoisted to ${u}`))),I.delete(R)}if(!m)break}d=m}if(d&&!c)for(let m of i.hoistedDependencies.values()){let I=n.get(m.name);if(!I||m.ident!==I.ident){d=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${wi(m.locator)}, available: ${wi(I==null?void 0:I.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:d?0:1,reason:g}},q5e=(t,e,r,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(m,I,B,b)=>{if(u.has(B))return;let R=[...I,B.locator],H=new Map,L=new Map;for(let q of qL(B)){let A=W5e(c,r,[c,...m,B],q,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(L.set(q,A),A.isHoistable===2)for(let V of A.dependsOn){let W=H.get(V.name)||new Set;W.add(q.name),H.set(V.name,W)}}let K=new Set,J=(q,A,V)=>{if(!K.has(q)){K.add(q),L.set(q,{isHoistable:1,reason:V});for(let W of H.get(q.name)||[])J(B.dependencies.get(W),A,l.debugLevel>=2?`- peer dependency ${wi(q.locator)} from parent ${wi(B.locator)} was not hoisted`:"")}};for(let[q,A]of L)A.isHoistable===1&&J(q,A,A.reason);for(let q of L.keys())if(!K.has(q)){f=!0;let A=o.get(B);A&&A.has(q.name)&&(g=!0),B.dependencies.delete(q.name),B.hoistedDependencies.set(q.name,q),B.reasons.delete(q.name);let V=c.dependencies.get(q.name);if(l.debugLevel>=2){let W=Array.from(I).concat([B.locator]).map(F=>wi(F)).join("\u2192"),X=c.hoistedFrom.get(q.name);X||(X=[],c.hoistedFrom.set(q.name,X)),X.push(W),B.hoistedTo.set(q.name,Array.from(e).map(F=>wi(F.locator)).join("\u2192"))}if(!V)c.ident!==q.ident&&(c.dependencies.set(q.name,q),b.add(q));else for(let W of q.references)V.references.add(W)}if(l.check){let q=Lle(t);if(q)throw new Error(`${q}, after hoisting dependencies of ${[c,...m,B].map(A=>wi(A.locator)).join("\u2192")}: -${zC(t)}`)}let ne=qL(B);for(let q of ne)if(K.has(q)){let A=L.get(q);if((n.get(q.name)===q.ident||!B.reasons.has(q.name))&&A.isHoistable!==0&&B.reasons.set(q.name,A.reason),!q.isHoistBorder&&R.indexOf(q.locator)<0){u.add(B);let W=Mle(B,q);h([...m,B],[...I,B.locator],W,d),u.delete(B)}}},p,d=new Set(qL(c));do{p=d,d=new Set;for(let m of p){if(m.locator===c.locator||m.isHoistBorder)continue;let I=Mle(c,m);h([],Array.from(r),I,d)}}while(d.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},Lle=t=>{let e=[],r=new Set,i=new Set,n=(s,o,a)=>{if(r.has(s)||(r.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>wi(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,d=`${h?` hoisted to ${h}`:""}`,m=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${m} - broken require promise for ${c.name}${d}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${m} - broken require promise: no required dependency ${c.name}${d} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(t,t.dependencies,t),e.join(` -`)},U5e=(t,e)=>{let{identName:r,name:i,reference:n,peerNames:s}=t,o={name:i,references:new Set([n]),locator:jL(r,n),ident:Nle(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,isWorkspace:!0,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[t,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:d,peerNames:m,hoistPriority:I,isWorkspace:B}=c,b=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([d]),locator:jL(p,d),ident:Nle(p,d),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(m),reasons:new Map,decoupled:!0,isHoistBorder:b?b.has(h):!1,hoistPriority:I||0,isWorkspace:B||!1,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=d=>{if(!h.has(d)){h.add(d),d.decoupled=!1;for(let m of d.dependencies.values())d.peerNames.has(m.name)||p(m)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of t.dependencies)l(c,o);return o},JL=t=>t.substring(0,t.indexOf("@",1)),H5e=t=>{let e={name:t.name,identName:JL(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),i=(n,s,o)=>{let a=r.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:JL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){r.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);r.delete(n)}};for(let n of t.dependencies.values())i(n,t,e);return e},J5e=t=>{let e=new Map,r=new Set([t]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!r.has(a);if(n(a).dependents.add(o.ident),!l){r.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||s(t,o);return e},wi=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let i=t.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(r=`v:${r}`),n.startsWith("workspace")&&(r=`w:${r}`,n=""),`${r}${n?`@${n}`:""}`}else return`${r}`},Ole=5e4,zC=t=>{let e=0,r=(n,s,o="")=>{if(e>Ole||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name.localeCompare(u.name)),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+wi(u.locator)+(g?` ${g}`:"")+(u!==n&&h.length>0?`, hoisted from: ${h.join(", ")}`:"")} -`,l+=r(u,s,`${o}${cOle?` -Tree is too large, part of the tree has been dunped -`:"")};var Js;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Js||(Js={}));var Sn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Sn||(Sn={}));var Kle="node_modules",Hc="$wsroot$";var VC=(t,e)=>{let{packageTree:r,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=z5e(t,e),o=null;if(n.length===0){let a=Tle(r,{hoistingLimits:i});o=V5e(t,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},ms=t=>`${t.name}@${t.reference}`,WL=t=>{let e=new Map;for(let[r,i]of t.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((i,n)=>{let s=i.split(v.delimiter).length,o=n.split(v.delimiter).length;return s!==o?o-s:n.localeCompare(i)});return e},Ule=(t,e)=>{let r=S.isVirtualLocator(t)?S.devirtualizeLocator(t):t,i=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e;return S.areLocatorsEqual(r,i)},zL=(t,e,r,i)=>{if(t.linkType!==Js.SOFT)return!1;let n=M.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return v.contains(i,n)===null},_5e=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=M.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=t.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=ms(f);if(l.has(p))return;l.add(p);let d=t.getPackageInformation(f);if(d){let m=h?ms(h):"";if(ms(f)!==m&&d.linkType===Js.SOFT&&!zL(d,f,t,i)){let I=Hle(d,f,t);(!a.get(I)||f.reference.startsWith("workspace:"))&&a.set(I,f)}for(let[I,B]of d.packageDependencies)B!==null&&(d.packagePeers.has(I)||c(t.getLocator(I,B),f))}};for(let f of o)c(f,null);let u=i.split(v.sep);for(let f of a.values()){let h=t.getPackageInformation(f),d=M.toPortablePath(h.packageLocation.slice(0,-1)).split(v.sep).slice(u.length),m=s;for(let I of d){let B=m.children.get(I);B||(B={children:new Map},m.children.set(I,B)),m=B}m.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=ms(h),d=n.get(p);d||(d=new Set,n.set(p,d)),d.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},z5e=(t,e)=>{let r=[],i=!1,n=new Map,s=_5e(t),o=t.getPackageInformation(t.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=t.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=M.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,isWorkspace:!0},u=new Map,g=(h,p)=>`${ms(p)}:${h}`,f=(h,p,d,m,I,B,b,R)=>{var X,F;let H=g(h,d),L=u.get(H),K=!!L;!K&&d.name===a.name&&d.reference===a.reference&&(L=c,u.set(H,c));let J=zL(p,d,t,l);if(!L){let D=p.linkType===Js.SOFT&&d.name.endsWith(Hc);L={name:h,identName:d.name,reference:d.reference,dependencies:new Set,peerNames:D?new Set:p.packagePeers,isWorkspace:D},u.set(H,L)}let ne;if(J?ne=2:I.linkType===Js.SOFT?ne=1:ne=0,L.hoistPriority=Math.max(L.hoistPriority||0,ne),R&&!J){let D=ms({name:m.identName,reference:m.reference}),he=n.get(D)||new Set;n.set(D,he),he.add(L.name)}let q=new Map(p.packageDependencies);if(e.project){let D=e.project.workspacesByCwd.get(M.toPortablePath(p.packageLocation.slice(0,-1)));if(D){let he=new Set([...Array.from(D.manifest.peerDependencies.values(),pe=>S.stringifyIdent(pe)),...Array.from(D.manifest.peerDependenciesMeta.keys())]);for(let pe of he)q.has(pe)||(q.set(pe,B.get(pe)||null),L.peerNames.add(pe))}}let A=ms({name:d.name.replace(Hc,""),reference:d.reference}),V=s.get(A);if(V)for(let D of V)q.set(`${D.name}${Hc}`,D.reference);(p!==I||p.linkType!==Js.SOFT||!e.selfReferencesByCwd||e.selfReferencesByCwd.get(b))&&m.dependencies.add(L);let W=d!==a&&p.linkType===Js.SOFT&&!d.name.endsWith(Hc)&&!J;if(!K&&!W){let D=new Map;for(let[he,pe]of q)if(pe!==null){let Ne=t.getLocator(he,pe),Pe=t.getLocator(he.replace(Hc,""),pe),qe=t.getPackageInformation(Pe);if(qe===null)throw new Error("Assertion failed: Expected the package to have been registered");let re=zL(qe,Ne,t,l);if(e.validateExternalSoftLinks&&e.project&&re){qe.packageDependencies.size>0&&(i=!0);for(let[De,$]of qe.packageDependencies)if($!==null){let G=S.parseLocator(Array.isArray($)?`${$[0]}@${$[1]}`:`${De}@${$}`);if(ms(G)!==ms(Ne)){let Ce=q.get(De);if(Ce){let ee=S.parseLocator(Array.isArray(Ce)?`${Ce[0]}@${Ce[1]}`:`${De}@${Ce}`);Ule(ee,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with parent dependency ${S.prettyLocator(e.project.configuration,ee)}`})}else{let ee=D.get(De);if(ee){let Ue=ee.target,Oe=S.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${De}@${Ue}`);Ule(Oe,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with dependency ${S.prettyLocator(e.project.configuration,Oe)} from sibling portal ${S.prettyIdent(e.project.configuration,S.parseIdent(ee.portal.name))}`})}else D.set(De,{target:G.reference,portal:Ne})}}}}let se=(X=e.hoistingLimitsByCwd)==null?void 0:X.get(b),be=re?b:v.relative(l,M.toPortablePath(qe.packageLocation))||Se.dot,ae=(F=e.hoistingLimitsByCwd)==null?void 0:F.get(be),Ae=se===Sn.DEPENDENCIES||ae===Sn.DEPENDENCIES||ae===Sn.WORKSPACES;f(ms(Ne)===ms(d)?h:he,qe,Ne,L,p,q,be,Ae)}}};return f(a.name,o,a,c,o,o.packageDependencies,Se.dot,!1),{packageTree:c,hoistingLimits:n,errors:r,preserveSymlinksRequired:i}};function Hle(t,e,r){let i=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return M.toPortablePath(i||t.packageLocation)}function X5e(t,e,r){let i=e.getLocator(t.name.replace(Hc,""),t.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return r.pnpifyFs?(o=M.toPortablePath(n.packageLocation),s=Js.SOFT):(o=Hle(n,t,e),s=n.linkType),{linkType:s,target:o}}var V5e=(t,e,r)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=X5e(u,t,r);return{locator:ms(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:kr(g),name:kr(f)}:{scope:null,name:kr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),d={name:h.identName,reference:p[0]},{name:m,scope:I}=s(h.name),B=I?[I,m]:[m],b=v.join(g,Kle),R=v.join(b,...B),H=`${f}/${d.name}`,L=n(d,f,p.slice(1)),K=!1;if(L.linkType===Js.SOFT&&r.project){let J=r.project.workspacesByCwd.get(L.target.slice(0,-1));K=!!(J&&!J.manifest.name)}if(!h.name.endsWith(Hc)&&!K){let J=i.get(R);if(J){if(J.dirList)throw new Error(`Assertion failed: ${R} cannot merge dir node with leaf node`);{let V=S.parseLocator(J.locator),W=S.parseLocator(L.locator);if(J.linkType!==L.linkType)throw new Error(`Assertion failed: ${R} cannot merge nodes with different link types ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/${S.stringifyLocator(W)}`);if(V.identHash!==W.identHash)throw new Error(`Assertion failed: ${R} cannot merge nodes with different idents ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/s${S.stringifyLocator(W)}`);L.aliases=[...L.aliases,...J.aliases,S.parseLocator(J.locator).reference]}}i.set(R,L);let ne=R.split("/"),q=ne.indexOf(Kle),A=ne.length-1;for(;q>=0&&A>q;){let V=M.toPortablePath(ne.slice(0,A).join(v.sep)),W=kr(ne[A]),X=i.get(V);if(!X)i.set(V,{dirList:new Set([W])});else if(X.dirList){if(X.dirList.has(W))break;X.dirList.add(W)}A--}}a(h,L.linkType===Js.SOFT?L.target:R,H)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var oT={};it(oT,{PnpInstaller:()=>Cf,PnpLinker:()=>jc,default:()=>m6e,getPnpPath:()=>qA,jsInstallUtils:()=>Ws,pnpUtils:()=>nT,quotePathIfNeeded:()=>uce});var lce=ie(Or()),cce=ie(require("url"));var Gle;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Gle||(Gle={}));var Ht;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(Ht||(Ht={}));var jle={[Ht.DEFAULT]:{collapsed:!1,next:{["*"]:Ht.DEFAULT}},[Ht.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:Ht.FALLBACK_EXCLUSION_LIST,packageRegistryData:Ht.PACKAGE_REGISTRY_DATA,["*"]:Ht.DEFAULT}},[Ht.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:Ht.FALLBACK_EXCLUSION_ENTRIES}},[Ht.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.FALLBACK_EXCLUSION_DATA}},[Ht.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}},[Ht.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_REGISTRY_ENTRIES}},[Ht.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_STORE_DATA}},[Ht.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_STORE_ENTRIES}},[Ht.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_INFORMATION_DATA}},[Ht.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:Ht.PACKAGE_DEPENDENCIES,["*"]:Ht.DEFAULT}},[Ht.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_DEPENDENCY}},[Ht.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}}};function Z5e(t,e,r){let i="";i+="[";for(let n=0,s=t.length;ns(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function r6e(t){let e=new Map,r=_C(t.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of r){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function i6e(t){return _C(t.fallbackPool||[],([e])=>e)}function n6e(t){let e=[];for(let[r,i]of _C(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([r,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of _C(i,([g])=>g===null?"0":`1${g}`)){let g=[];r!==null&&s!==null&&!a.has(r)&&g.push([r,s]);for(let[p,d]of _C(a.entries(),([m])=>m))g.push([p,d]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function XC(t){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:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:r6e(t),fallbackPool:i6e(t),packageRegistryData:n6e(t)}}var zle=ie(Wle());function Vle(t,e){return[t?`${t} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," 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",`} -`,` -`,`var __non_webpack_module__ = module; -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,zle.default)()].join("")}function s6e(t){return JSON.stringify(t,null,2)}function o6e(t){return[`return hydrateRuntimeState(${qle(t)}, {basePath: basePath || __dirname}); -`].join("")}function a6e(t){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(t)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function _le(t){let e=XC(t),r=o6e(e);return Vle(t.shebang,r)}function Xle(t){let e=XC(t),r=a6e(t.dataLocation),i=Vle(t.shebang,r);return{dataFile:s6e(e),loaderFile:i}}var tce=ie(require("fs")),u6e=ie(require("path")),rce=ie(require("util"));function _L(t,{basePath:e}){let r=M.toPortablePath(e),i=v.resolve(r),n=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,s=new Map,o=new Map(t.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var b;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let d=(b=p.discardFromLookup)!=null?b:!1,m={name:g,reference:h},I=s.get(p.packageLocation);I?(I.discardFromLookup=I.discardFromLookup&&d,d||(I.locator=m)):s.set(p.packageLocation,{locator:m,discardFromLookup:d});let B=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:d,get packageLocation(){return B||(B=v.join(i,p.packageLocation))}}]}))])),a=new Map(t.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(t.fallbackPool),c=t.dependencyTreeRoots,u=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var df=ie(require("module")),ece=ie($le()),ZL=ie(require("util"));var ur;(function(l){l.API_ERROR="API_ERROR",l.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",l.MISSING_DEPENDENCY="MISSING_DEPENDENCY",l.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",l.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",l.INTERNAL="INTERNAL",l.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",l.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var c6e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ui(t,e,r={}){let i=c6e.has(t)?"MODULE_NOT_FOUND":t,n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:_(P({},n),{value:i}),pnpCode:_(P({},n),{value:t}),data:_(P({},n),{value:r})})}function YA(t){return M.normalize(M.fromPortablePath(t))}function $L(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=new Set(df.Module.builtinModules||Object.keys(process.binding("natives"))),s=re=>n.has(re)||re.startsWith("node:"),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,a=/^(\/|\.{1,2}(\/|$))/,l=/\/$/,c=/^\.{0,2}\//,u={name:null,reference:null},g=[],f=new Set;if(t.enableTopLevelFallback===!0&&g.push(u),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=t.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");g.push({name:re,reference:be})}}let{ignorePattern:h,packageRegistry:p,packageLocatorsByLocations:d}=t;function m(re,se){return{fn:re,args:se,error:null,result:null}}function I(re){var De,$,G,Ce,ee,Ue;let se=(G=($=(De=process.stderr)==null?void 0:De.hasColors)==null?void 0:$.call(De))!=null?G:process.stdout.isTTY,be=(Oe,vt)=>`[${Oe}m${vt}`,ae=re.error;console.error(ae?be("31;1",`\u2716 ${(Ce=re.error)==null?void 0:Ce.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let Oe of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,ZL.inspect)(Oe,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,ZL.inspect)(re.result,{colors:se,compact:!0})}`));let Ae=(Ue=(ee=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ee.slice(2))!=null?Ue:[];if(Ae.length>0){console.error();for(let Oe of Ae)console.error(` ${be("38;5;244",Oe)}`)}console.error()}function B(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let ae=m(re,be);try{return ae.result=se(...be)}catch(Ae){throw ae.error=Ae}finally{I(ae)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(ae){let Ae=m(re,be);throw Ae.error=ae,I(Ae),ae}}}return se}function b(re){let se=W(re);if(!se)throw ui(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function R(re){if(re.name===null)return!0;for(let se of t.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let H=new Set(["default","node","require"]);function L(re,se=H){let be=D(v.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ui(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ae}=b(be),Ae=v.join(ae,wt.manifest);if(!e.fakeFs.existsSync(Ae))return null;let De=JSON.parse(e.fakeFs.readFileSync(Ae,"utf8")),$=v.contains(ae,re);if($===null)throw ui(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");c.test($)||($=`./${$}`);let G=(0,ece.resolve)(De,v.normalize($),{conditions:se,unsafe:!0});return typeof G=="string"?v.join(ae,G):null}function K(re,se,{extensions:be}){let ae;try{se.push(re),ae=e.fakeFs.statSync(re)}catch(Ae){}if(ae&&!ae.isDirectory())return e.fakeFs.realpathSync(re);if(ae&&ae.isDirectory()){let Ae;try{Ae=JSON.parse(e.fakeFs.readFileSync(v.join(re,wt.manifest),"utf8"))}catch($){}let De;if(Ae&&Ae.main&&(De=v.resolve(re,Ae.main)),De&&De!==re){let $=K(De,se,{extensions:be});if($!==null)return $}}for(let Ae=0,De=be.length;Ae{let G=JSON.stringify($.name);if(ae.has(G))return;ae.add(G);let Ce=X($);for(let ee of Ce)if(b(ee).packagePeers.has(re))Ae(ee);else{let Oe=be.get(ee.name);typeof Oe=="undefined"&&be.set(ee.name,Oe=new Set),Oe.add(ee.reference)}};Ae(se);let De=[];for(let $ of[...be.keys()].sort())for(let G of[...be.get($)].sort())De.push({name:$,reference:G});return De}function D(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(q(re)&&!se)return null;let ae=v.relative(t.basePath,re);ae.match(a)||(ae=`./${ae}`),ae.endsWith("/")||(ae=`${ae}/`);do{let Ae=d.get(ae);if(typeof Ae=="undefined"||Ae.discardFromLookup&&!be){ae=ae.substring(0,ae.lastIndexOf("/",ae.length-2)+1);continue}return Ae.locator}while(ae!=="");return null}function he(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return M.toPortablePath(e.pnpapiResolution);if(be&&s(re))return null;let ae=YA(re),Ae=se&&YA(se);if(se&&q(se)&&(!v.isAbsolute(re)||D(re)===null)){let G=ne(re,se);if(G===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${ae}" -Required by: ${Ae} -`,{request:ae,issuer:Ae});return M.toPortablePath(G)}let De,$=re.match(o);if($){if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let[,G,Ce]=$,ee=D(se);if(!ee){let yr=ne(re,se);if(yr===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${ae}" -Required by: ${Ae} -`,{request:ae,issuer:Ae});return M.toPortablePath(yr)}let Oe=b(ee).packageDependencies.get(G),vt=null;if(Oe==null&&ee.name!==null){let yr=t.fallbackExclusionList.get(ee.name);if(!yr||!yr.has(ee.reference)){for(let Qi=0,Go=g.length;QiR(Ki))?dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${ee.name}@${ee.reference} (via ${Ae}) -${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} -`).join("")} -`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr}):dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${ee.name}@${ee.reference} (via ${Ae}) - -${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} -`).join("")} -`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr})}else Oe===void 0&&(!be&&s(re)?R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}. 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 ${G} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${Ae} -`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}. 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 ${G} isn't otherwise declared in ${ee.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${Ae} -`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}):R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${Ae} -`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${G}${G!==ae?` (via "${ae}")`:""} -Required by: ${ee.name}@${ee.reference} (via ${Ae}) -`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}));if(Oe==null){if(vt===null||dt===null)throw dt||new Error("Assertion failed: Expected an error to have been set");Oe=vt;let yr=dt.message.replace(/\n.*/g,"");dt.message=yr,!f.has(yr)&&i!==0&&(f.add(yr),process.emitWarning(dt))}let ri=Array.isArray(Oe)?{name:Oe[0],reference:Oe[1]}:{name:G,reference:Oe},ii=b(ri);if(!ii.packageLocation)throw ui(ur.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. - -Required package: ${ri.name}@${ri.reference}${ri.name!==ae?` (via "${ae}")`:""} -Required by: ${ee.name}@${ee.reference} (via ${Ae}) -`,{request:ae,issuer:Ae,dependencyLocator:Object.assign({},ri)});let an=ii.packageLocation;Ce?De=v.join(an,Ce):De=an}else if(v.isAbsolute(re))De=v.normalize(re);else{if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let G=v.resolve(se);se.match(l)?De=v.normalize(v.join(G,re)):De=v.normalize(v.join(v.dirname(G),re))}return v.normalize(De)}function pe(re,se,be=H){if(a.test(re))return se;let ae=L(se,be);return ae?v.normalize(ae):se}function Ne(re,{extensions:se=Object.keys(df.Module._extensions)}={}){let be=[],ae=K(re,be,{extensions:se});if(ae)return v.normalize(ae);{let Ae=YA(re),De=D(re);if(De){let{packageLocation:$}=b(De);if(!e.fakeFs.existsSync($)){let G=$.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${G} - -Missing package: ${De.name}@${De.reference} -Expected package location: ${YA($)} -`,{unqualifiedPath:Ae})}}throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed - none of those files can be found on the disk. - -Source path: ${Ae} -${be.map($=>`Not found: ${YA($)} -`).join("")}`,{unqualifiedPath:Ae})}}function Pe(re,se,{considerBuiltins:be,extensions:ae,conditions:Ae}={}){let De=he(re,se,{considerBuiltins:be});if(re==="pnpapi")return De;if(De===null)return null;let $=()=>se!==null?q(se):!1,G=(!be||!s(re))&&!$()?pe(re,De,Ae):De;try{return Ne(G,{extensions:ae})}catch(Ce){throw Ce.pnpCode==="QUALIFIED_PATH_RESOLUTION_FAILED"&&Object.assign(Ce.data,{request:YA(re),issuer:se&&YA(se)}),Ce}}function qe(re){let se=v.normalize(re),be=Pr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:A,topLevel:V,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of p)for(let ae of be.keys())se!==null&&ae!==null&&re.push({name:se,reference:ae});return re},getPackageInformation:re=>{let se=W(re);if(se===null)return null;let be=M.fromPortablePath(se.packageLocation);return _(P({},se),{packageLocation:be})},findPackageLocator:re=>D(M.toPortablePath(re)),resolveToUnqualified:B("resolveToUnqualified",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=he(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveUnqualified:B("resolveUnqualified",(re,se)=>M.fromPortablePath(Ne(M.toPortablePath(re),se))),resolveRequest:B("resolveRequest",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=Pe(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveVirtual:B("resolveVirtual",re=>{let se=qe(M.toPortablePath(re));return se!==null?M.fromPortablePath(se):null})}}var ISt=(0,rce.promisify)(tce.readFile);var ice=(t,e,r)=>{let i=XC(t),n=_L(i,{basePath:e}),s=M.join(e,wt.pnpCjs);return $L(n,{fakeFs:r,pnpapiResolution:s})};var tT=ie(sce());var Ws={};it(Ws,{checkAndReportManifestCompatibility:()=>oce,extractBuildScripts:()=>Z0,getExtractHint:()=>rT,hasBindingGyp:()=>iT});function oce(t,e,{configuration:r,report:i}){return S.isPackageCompatible(t,{os:[process.platform],cpu:[process.arch]})?!0:(i==null||i.reportWarningOnce(z.INCOMPATIBLE_ARCHITECTURE,`${S.prettyLocator(r,t)} The ${process.platform}-${process.arch} architecture is incompatible with this module, ${e} skipped.`),!1)}function Z0(t,e,r,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([Gn.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([Gn.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:t.linkType!==gt.HARD?(n==null||n.reportWarningOnce(z.SOFT_LINK_BUILD,`${S.prettyLocator(i,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(n==null||n.reportInfoOnce(z.BUILD_DISABLED,`${S.prettyLocator(i,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!r.built?(n==null||n.reportWarningOnce(z.DISABLED_BUILD_SCRIPTS,`${S.prettyLocator(i,t)} lists build scripts, but all build scripts have been disabled.`),[]):oce(t,"build",{configuration:i,report:n})?s:[]}var g6e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function rT(t){return t.packageFs.getExtractHint({relevantExtensions:g6e})}function iT(t){let e=v.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var nT={};it(nT,{getUnpluggedPath:()=>ZC});function ZC(t,{configuration:e}){return v.resolve(e.get("pnpUnpluggedFolder"),S.slugifyLocator(t))}var f6e=new Set([S.makeIdent(null,"nan").identHash,S.makeIdent(null,"node-gyp").identHash,S.makeIdent(null,"node-pre-gyp").identHash,S.makeIdent(null,"node-addon-api").identHash,S.makeIdent(null,"fsevents").identHash]),jc=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,r){return!(r.project.configuration.get("nodeLinker")!=="pnp"||r.project.configuration.get("pnpMode")!==this.mode)}async findPackageLocation(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})),s={name:S.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return M.toPortablePath(o.packageLocation)}async findPackageLocator(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))return null;let s=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})).findPackageLocator(M.fromPortablePath(e));return s?S.makeLocator(S.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Cf(e)}},Cf=class{constructor(e){this.opts=e;this.mode="strict";this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,r){let i=S.stringifyIdent(e),n=e.reference,s=!!this.opts.project.tryWorkspaceByLocator(e),o=S.isVirtualLocator(e),a=e.peerDependencies.size>0&&!o,l=!a&&!s,c=!a&&e.linkType!==gt.SOFT,u,g;if(l||c){let B=o?S.devirtualizeLocator(e):e;u=this.customData.store.get(B.locatorHash),typeof u=="undefined"&&(u=await h6e(r),e.linkType===gt.HARD&&this.customData.store.set(B.locatorHash,u)),u.manifest.type==="module"&&(this.isESMLoaderRequired=!0),g=this.opts.project.getDependencyMeta(B,e.version)}let f=l?Z0(e,u,g,{configuration:this.opts.project.configuration,report:this.opts.report}):[],h=c?await this.unplugPackageIfNeeded(e,u,r,g):r.packageFs;if(v.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let p=v.resolve(h.getRealPath(),r.prefixPath),d=sT(this.opts.project.cwd,p),m=new Map,I=new Set;if(o){for(let B of e.peerDependencies.values())m.set(S.stringifyIdent(B),null),I.add(S.stringifyIdent(B));if(!s){let B=S.devirtualizeLocator(e);this.virtualTemplates.set(B.locatorHash,{location:sT(this.opts.project.cwd,Pr.resolveVirtual(p)),locator:B})}}return de.getMapWithDefault(this.packageRegistry,i).set(n,{packageLocation:d,packageDependencies:m,packagePeers:I,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:p,buildDirective:f.length>0?f:null}}async attachInternalDependencies(e,r){let i=this.getPackageInformation(e);for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){for(let i of r)this.getDiskInformation(i).packageDependencies.set(S.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=qA(this.opts.project);if(T.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(z.UNNAMED,`Removing the old ${ue.pretty(this.opts.project.configuration,wt.pnpJs,ue.Type.PATH)} file. You might need to manually update existing references to reference the new ${ue.pretty(this.opts.project.configuration,wt.pnpCjs,ue.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ue.pretty(this.opts.project.configuration,"yarn sdks",ue.Type.CODE)}.`),await T.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await T.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await T.removePromise(e.cjs),await T.removePromise(this.opts.project.configuration.get("pnpDataPath")),await T.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())de.getMapWithDefault(this.packageRegistry,S.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:S.stringifyIdent(u),reference:u.reference})),n=r!=="none",s=[],o=new Map,a=de.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:S.stringifyIdent(u),reference:u.reference});return await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=qA(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(z.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await T.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=_le(e);await T.changeFilePromise(r.cjs,o,{automaticNewlines:!0,mode:493}),await T.removePromise(i)}else{let o=v.relative(v.dirname(r.cjs),i),{dataFile:a,loaderFile:l}=Xle(_(P({},e),{dataLocation:o}));await T.changeFilePromise(r.cjs,l,{automaticNewlines:!0,mode:493}),await T.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(z.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await T.changeFilePromise(r.esmLoader,(0,tT.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await T.removePromise(s);else for(let o of await T.readdirPromise(s)){let a=v.resolve(s,o);this.unpluggedPaths.has(a)||await T.removePromise(a)}}async locateNodeModules(e){let r=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=v.join(n.cwd,"node_modules");if(i&&i.test(v.relative(this.opts.project.cwd,n.cwd))||!T.existsSync(s))continue;let o=await T.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)r.push(s);else for(let l of a)r.push(v.join(s,l.name))}return r}async unplugPackageIfNeeded(e,r,i,n){return this.shouldBeUnplugged(e,r,n)?this.unplugPackage(e,i):i.packageFs}shouldBeUnplugged(e,r,i){return typeof i.unplugged!="undefined"?i.unplugged:f6e.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(Z0(e,r,i,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r){let i=ZC(e,{configuration:this.opts.project.configuration});if(this.opts.project.disabledLocators.has(e.locatorHash))return new Xo(i,{baseFs:r.packageFs,pathUtils:v});this.unpluggedPaths.add(i);let n=v.join(i,r.prefixPath,".ready");return await T.existsPromise(n)?new Ft(i):(this.opts.project.storedBuildState.delete(e.locatorHash),await T.mkdirPromise(i,{recursive:!0}),await T.copyPromise(i,Se.dot,{baseFs:r.packageFs,overwrite:!1}),await T.writeFilePromise(n,""),new Ft(i))}getPackageInformation(e){let r=S.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(r);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${S.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${S.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let r=de.getMapWithDefault(this.packageRegistry,"@@disk"),i=sT(this.opts.project.cwd,e);return de.getFactoryWithDefault(r,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1}))}};function sT(t,e){let r=v.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function h6e(t){var i;let e=(i=await Ze.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?i:new Ze,r=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())r.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:rT(t),hasBindingGyp:iT(t)}}}var ace=ie(Nn());var $C=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new me("This command can only be used if the `nodeLinker` option is set to `pnp`");await r.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=S.parseDescriptor(f),p=h.range!=="unknown"?h:S.makeDescriptor(h,"*");if(!qt.validRange(p.range))throw new me(`The range of the descriptor patterns must be a valid semver range (${S.prettyDescriptor(e,p)})`);return d=>{let m=S.stringifyIdent(d);return!ace.default.isMatch(m,S.stringifyIdent(p))||d.version&&!qt.satisfiesWithPrereleases(d.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of r.storedPackages.values())!r.tryWorkspaceByLocator(h)&&!S.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],d=(m,I)=>{if(!h.has(m.locatorHash)&&(h.add(m.locatorHash),!r.tryWorkspaceByLocator(m)&&o.some(B=>B(m))&&p.push(m),!(I>0&&!this.recursive)))for(let B of m.dependencies.values()){let b=r.storedResolutions.get(B.descriptorHash);if(!b)throw new Error("Assertion failed: The resolution should have been registered");let R=r.storedPackages.get(b);if(!R)throw new Error("Assertion failed: The package should have been registered");d(R,I+1)}};for(let m of f){let I=r.storedPackages.get(m.anchoredLocator.locatorHash);if(!I)throw new Error("Assertion failed: The package should have been registered");d(I,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(r.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new me(`Patterns ${ue.prettyList(e,s,ue.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new me(`Pattern ${ue.prettyList(e,s,ue.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=de.sortMap(c,f=>S.stringifyLocator(f)),(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let d=(h=p.version)!=null?h:"unknown",m=r.topLevelWorkspace.manifest.ensureDependencyMeta(S.makeDescriptor(p,d));m.unplugged=!0,f.reportInfo(z.UNNAMED,`Will unpack ${S.prettyLocator(e,p)} to ${ue.pretty(e,ZC(p,{configuration:e}),ue.Type.PATH)}`),f.reportJson({locator:S.stringifyLocator(p),version:d})}await r.topLevelWorkspace.persistManifest(),f.reportSeparator(),await r.install({cache:n,report:f})})).exitCode()}};$C.paths=[["unplug"]],$C.usage=ye.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 '*'"]]});var Ace=$C;var qA=t=>({cjs:v.join(t.cwd,wt.pnpCjs),cjsLegacy:v.join(t.cwd,wt.pnpJs),esmLoader:v.join(t.cwd,".pnp.loader.mjs")}),uce=t=>/\s/.test(t)?JSON.stringify(t):t;async function p6e(t,e,r){let i=qA(t),n=`--require ${uce(M.fromPortablePath(i.cjs))}`;if(T.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,cce.pathToFileURL)(M.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&lce.default.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(T.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function d6e(t,e){let r=qA(t);e(r.cjs),e(r.esmLoader),e(t.configuration.get("pnpDataPath")),e(t.configuration.get("pnpUnpluggedFolder"))}var C6e={hooks:{populateYarnPaths:d6e,setupScriptEnvironment:p6e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:ge.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:ge.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:ge.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:ge.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:ge.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:ge.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:ge.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:ge.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:ge.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[jc],commands:[Ace]},m6e=C6e;var Cce=ie(dce());var uT=ie(require("crypto")),mce=ie(require("fs")),Ece=1,gi="node_modules",gT=".bin",Ice=".yarn-state.yml",Bi;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Bi||(Bi={}));var fT=class{constructor(){this.installStateCache=new Map}supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="node-modules"}async findPackageLocation(e,r){let i=r.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(n===null)throw new me("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(S.stringifyLocator(e));if(!s){let a=new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=r.project.configuration.startingCwd;return s.locations.find(a=>v.contains(o,a))||s.locations[0]}async findPackageLocator(e,r){let i=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=$0(v.resolve(e),{skipPrefix:r.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return S.parseLocator(a)}makeInstaller(e){return new yce(e)}},yce=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,r){var u;let i=v.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await L6e(e,r),e.linkType===gt.HARD&&this.customData.store.set(e.locatorHash,n)),!Ws.checkAndReportManifestCompatibility(e,"link",{configuration:this.opts.project.configuration,report:this.opts.report}))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(S.stringifyIdent(e))||s.set(S.stringifyIdent(e),e.reference);let a=e;if(S.isVirtualLocator(e)){a=S.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(S.stringifyIdent(g),null),o.add(S.stringifyIdent(g))}let l={packageLocation:`${M.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=r.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,r){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),r=await hT(this.opts.project),i=this.opts.project.configuration.get("nmMode");(r===null||i!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i});let n=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=de.validateEnum(Sn,(d=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?d:h)}catch(m){let I=S.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(z.INVALID_MANIFEST,`${I}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Sn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(d=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?d:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:S.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:S.makeLocator(S.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(M.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:S.stringifyIdent(p),reference:p.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:f=>M.fromPortablePath(Pr.resolveVirtual(M.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=VC(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=WL(a);await T6e(r,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=S.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(wce(f))continue;let p=S.parseLocator(f),d=this.localStore.get(p.locatorHash);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(d.pkg))continue;let m=Ws.extractBuildScripts(d.pkg,d.customPackageData,d.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});m.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:m})}return c&&this.opts.report.reportWarning(z.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ue.pretty(this.opts.project.configuration,"--preserve-symlinks",ue.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function L6e(t,e){var n;let r=(n=await Ze.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new Ze,i=new Set(["preinstall","install","postinstall"]);for(let s of r.scripts.keys())i.has(s)||r.scripts.delete(s);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{extractHint:Ws.getExtractHint(e),hasBindingGyp:Ws.hasBindingGyp(e)}}}async function M6e(t,e,r,i){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,n+=`# cause your node_modules installation to become invalidated. -`,n+=` -`,n+=`__metadata: -`,n+=` version: ${Ece} -`,n+=` nmMode: ${i.value} -`;let s=Array.from(e.keys()).sort(),o=S.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let c of s){let u=e.get(c);n+=` -`,n+=`${JSON.stringify(c)}: -`,n+=` locations: -`;for(let g of u.locations){let f=v.contains(t.cwd,g);if(f===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` - ${JSON.stringify(f)} -`}if(u.aliases.length>0){n+=` aliases: -`;for(let g of u.aliases)n+=` - ${JSON.stringify(g)} -`}if(c===o&&r.size>0){n+=` bin: -`;for(let[g,f]of r){let h=v.contains(t.cwd,g);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` ${JSON.stringify(h)}: -`;for(let[p,d]of f){let m=v.relative(v.join(g,gi),d);n+=` ${JSON.stringify(p)}: ${JSON.stringify(m)} -`}}}}let a=t.cwd,l=v.join(a,gi,Ice);await T.changeFilePromise(l,n,{automaticNewlines:!0})}async function hT(t,{unrollAliases:e=!1}={}){let r=t.cwd,i=v.join(r,gi,Ice);if(!T.existsSync(i))return null;let n=Ii(await T.readFilePromise(i,"utf8"));if(n.__metadata.version>Ece)return null;let s=n.__metadata.nmMode||Bi.CLASSIC,o=new Map,a=new Map;delete n.__metadata;for(let[l,c]of Object.entries(n)){let u=c.locations.map(f=>v.join(r,f)),g=c.bin;if(g)for(let[f,h]of Object.entries(g)){let p=v.join(r,M.toPortablePath(f)),d=de.getMapWithDefault(a,p);for(let[m,I]of Object.entries(h))d.set(kr(m),M.toPortablePath([p,gi,I].join(v.delimiter)))}if(o.set(l,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:c.aliases||[]}),e&&c.aliases)for(let f of c.aliases){let{scope:h,name:p}=S.parseLocator(l),d=S.makeLocator(S.makeIdent(h,p),f),m=S.stringifyLocator(d);o.set(m,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:[]})}}return{locatorMap:o,binSymlinks:a,locationTree:Bce(o,{skipPrefix:t.cwd}),nmMode:s}}var Ef=async(t,e)=>{if(t.split(v.sep).indexOf(gi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop&&(await T.lstatPromise(t)).isSymbolicLink()){await T.unlinkPromise(t);return}let r=await T.readdirPromise(t,{withFileTypes:!0});for(let i of r){let n=v.join(t,kr(i.name));i.isDirectory()?(i.name!==gi||e&&e.innerLoop)&&await Ef(n,{innerLoop:!0,contentsOnly:!1}):await T.unlinkPromise(n)}e.contentsOnly||await T.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},Qce=4,$0=(t,{skipPrefix:e})=>{let r=v.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let i=r.split(v.sep).filter(l=>l!==""),n=i.indexOf(gi),s=i.slice(0,n).join(v.sep),o=v.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},Bce=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let i=()=>({children:new Map,linkType:gt.HARD});for(let[n,s]of t.entries()){if(s.linkType===gt.SOFT&&v.contains(e,s.target)!==null){let a=de.getFactoryWithDefault(r,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=$0(o,{skipPrefix:e}),c=de.getFactoryWithDefault(r,a,i);for(let u=0;u{let r;try{process.platform==="win32"&&(r=await T.lstatPromise(t))}catch(i){}process.platform=="win32"&&(!r||r.isDirectory())?await T.symlinkPromise(t,e,"junction"):await T.symlinkPromise(v.relative(v.dirname(e),t),e)};async function bce(t,e,r){let i=v.join(t,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));try{await T.writeFilePromise(i,r);try{await T.linkPromise(i,e)}catch(n){}}finally{await T.unlinkPromise(i)}}async function O6e({srcPath:t,dstPath:e,srcMode:r,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Bi.HARDLINKS_GLOBAL&&i&&o){let l=v.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await mn.checksumFile(l,{baseFs:T,algorithm:"sha1"})!==o){let g=v.join(i,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));await T.renamePromise(l,g);let f=await n.readFilePromise(t);await T.writeFilePromise(g,f);try{await T.linkPromise(g,l),await T.unlinkPromise(g)}catch(h){}}await T.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(t);await bce(i,l,u);try{await T.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Bi.HARDLINKS_LOCAL,await n.copyFilePromise(t,e))}}}else await n.copyFilePromise(t,e);let a=r&511;a!==420&&await T.chmodPromise(e,a)}var JA;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(JA||(JA={}));var K6e=async(t,e,{baseFs:r,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await T.mkdirPromise(t,{recursive:!0});let o=async(l=Se.dot)=>{let c=v.join(e,l),u=await r.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=v.join(l,f.name),p,d=v.join(c,f.name);if(f.isFile()){if(p={kind:JA.FILE,mode:(await r.lstatPromise(d)).mode},n.value===Bi.HARDLINKS_GLOBAL){let m=await mn.checksumFile(d,{baseFs:r,algorithm:"sha1"});p.digest=m}}else if(f.isDirectory())p={kind:JA.DIRECTORY};else if(f.isSymbolicLink())p={kind:JA.SYMLINK,symlinkTo:await r.readlinkPromise(d)};else throw new Error(`Unsupported file type (file: ${d}, mode: 0o${await r.statSync(d).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==gi){let m=await o(h);for(let[I,B]of m)g.set(I,B)}}return g},a;if(n.value===Bi.HARDLINKS_GLOBAL&&i&&s){let l=v.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await T.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await bce(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=v.join(e,l),g=v.join(t,l);c.kind===JA.DIRECTORY?await T.mkdirPromise(g,{recursive:!0}):c.kind===JA.FILE?await O6e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:r,globalHardlinksStore:i}):c.kind===JA.SYMLINK&&await pT(v.resolve(v.dirname(g),c.symlinkTo),g)}};function U6e(t,e){let r=new Map([...t]),i=new Map([...e]);for(let[n,s]of t){let o=v.join(n,gi);if(!T.existsSync(o)){s.children.delete(gi);for(let a of i.keys())v.contains(o,a)!==null&&i.delete(a)}}return{locationTree:r,binSymlinks:i}}function wce(t){let e=S.parseDescriptor(t);return S.isVirtualDescriptor(e)&&(e=S.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function H6e(t,e,r,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of t){let c=wce(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=v.join(l[0],f);f!==""&&T.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=v.contains(r,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let d=v.join(a,M.toPortablePath(p));u.set(kr(h),d)}for(let[h,p]of c.children){let d=v.join(a,h),m=o(d,d,p);m.size>0&&s.set(a,new Map([...s.get(a)||new Map,...m]))}}else for(let[f,h]of c.children){let p=o(v.join(a,f),l,h);for(let[d,m]of p)u.set(d,m)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var vce=(t,e)=>{if(!t||!e)return t===e;let r=S.parseLocator(t);S.isVirtualLocator(r)&&(r=S.devirtualizeLocator(r));let i=S.parseLocator(e);return S.isVirtualLocator(i)&&(i=S.devirtualizeLocator(i)),S.areLocatorsEqual(r,i)};function dT(t){return v.join(t.get("globalFolder"),"store")}async function T6e(t,e,{baseFs:r,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=v.join(i.cwd,gi),{locationTree:l,binSymlinks:c}=U6e(t.locationTree,t.binSymlinks),u=Bce(e,{skipPrefix:i.cwd}),g=[],f=async({srcDir:L,dstDir:K,linkType:J,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})=>{let V=(async()=>{try{J===gt.SOFT?(await T.mkdirPromise(v.dirname(K),{recursive:!0}),await pT(v.resolve(L),K)):await K6e(K,L,{baseFs:r,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})}catch(W){throw W.message=`While persisting ${L} -> ${K} ${W.message}`,W}finally{B.tick()}})().then(()=>g.splice(g.indexOf(V),1));g.push(V),g.length>Qce&&await Promise.race(g)},h=async(L,K,J)=>{let ne=(async()=>{let q=async(A,V,W)=>{try{W.innerLoop||await T.mkdirPromise(V,{recursive:!0});let X=await T.readdirPromise(A,{withFileTypes:!0});for(let F of X){if(!W.innerLoop&&F.name===gT)continue;let D=v.join(A,F.name),he=v.join(V,F.name);F.isDirectory()?(F.name!==gi||W&&W.innerLoop)&&(await T.mkdirPromise(he,{recursive:!0}),await q(D,he,_(P({},W),{innerLoop:!0}))):H.value===Bi.HARDLINKS_LOCAL||H.value===Bi.HARDLINKS_GLOBAL?await T.linkPromise(D,he):await T.copyFilePromise(D,he,mce.default.constants.COPYFILE_FICLONE)}}catch(X){throw W.innerLoop||(X.message=`While cloning ${A} -> ${V} ${X.message}`),X}finally{W.innerLoop||B.tick()}};await q(L,K,J)})().then(()=>g.splice(g.indexOf(ne),1));g.push(ne),g.length>Qce&&await Promise.race(g)},p=async(L,K,J)=>{if(!J)K.children.has(gi)&&await Ef(v.join(L,gi),{contentsOnly:!1}),await Ef(L,{contentsOnly:L===a});else for(let[ne,q]of K.children){let A=J.children.get(ne);await p(v.join(L,ne),q,A)}};for(let[L,K]of l){let J=u.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await p(v.join(L,ne),q,A)}}let d=async(L,K,J)=>{if(!J)K.children.has(gi)&&await Ef(v.join(L,gi),{contentsOnly:!0}),await Ef(L,{contentsOnly:K.linkType===gt.HARD});else{vce(K.locator,J.locator)||await Ef(L,{contentsOnly:K.linkType===gt.HARD});for(let[ne,q]of K.children){let A=J.children.get(ne);await d(v.join(L,ne),q,A)}}};for(let[L,K]of u){let J=l.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await d(v.join(L,ne),q,A)}}let m=new Map,I=[];for(let[L,{locations:K}]of t.locatorMap.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=u.get(ne),V=ne;if(A){for(let W of q)if(V=v.join(V,W),A=A.children.get(W),!A)break;if(A){let W=vce(A.locator,L),X=e.get(A.locator),F=X.target,D=V,he=X.linkType;if(W)m.has(F)||m.set(F,D);else if(F!==D){let pe=S.parseLocator(A.locator);S.isVirtualLocator(pe)&&(pe=S.devirtualizeLocator(pe)),I.push({srcDir:F,dstDir:D,linkType:he,realLocatorHash:pe.locatorHash})}}}}for(let[L,{locations:K}]of e.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=l.get(ne),V=u.get(ne),W=ne,X=e.get(L),F=S.parseLocator(L);S.isVirtualLocator(F)&&(F=S.devirtualizeLocator(F));let D=F.locatorHash,he=X.target,pe=J;if(he===pe)continue;let Ne=X.linkType;for(let Pe of q)V=V.children.get(Pe);if(!A)I.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});else for(let Pe of q)if(W=v.join(W,Pe),A=A.children.get(Pe),!A){I.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});break}}let B=Xi.progressViaCounter(I.length),b=n.reportProgress(B),R=i.configuration.get("nmMode"),H={value:R};try{let L=H.value===Bi.HARDLINKS_GLOBAL?`${dT(i.configuration)}/v1`:null;if(L&&!await T.existsPromise(L)){await T.mkdirpPromise(L);for(let J=0;J<256;J++)await T.mkdirPromise(v.join(L,J.toString(16).padStart(2,"0")))}for(let J of I)(J.linkType===gt.SOFT||!m.has(J.srcDir))&&(m.set(J.srcDir,J.dstDir),await f(_(P({},J),{globalHardlinksStore:L,nmMode:H,packageChecksum:o.get(J.realLocatorHash)||null})));await Promise.all(g),g.length=0;for(let J of I){let ne=m.get(J.srcDir);J.linkType!==gt.SOFT&&J.dstDir!==ne&&await h(ne,J.dstDir,{nmMode:H})}await Promise.all(g),await T.mkdirPromise(a,{recursive:!0});let K=await H6e(e,u,i.cwd,{loadManifest:s});await G6e(c,K,i.cwd),await M6e(i,e,K,H),R==Bi.HARDLINKS_GLOBAL&&H.value==Bi.HARDLINKS_LOCAL&&n.reportWarningOnce(z.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{b.stop()}}async function G6e(t,e,r){for(let i of t.keys()){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=v.join(i,gi,gT);await T.removePromise(n)}}for(let[i,n]of e){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=v.join(i,gi,gT),o=t.get(i)||new Map;await T.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await T.removePromise(v.join(s,a)),process.platform==="win32"&&await T.removePromise(v.join(s,kr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=v.join(s,a);c!==l&&(process.platform==="win32"?await(0,Cce.default)(M.fromPortablePath(l),M.fromPortablePath(u),{createPwshFile:!1}):(await T.removePromise(u),await pT(l,u),v.contains(r,await T.realpathPromise(l))!==null&&await T.chmodPromise(l,493)))}}}var CT=class extends jc{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new Sce(e)}},Sce=class extends Cf{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let r=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),i=ice(e,this.opts.project.cwd,r),{tree:n,errors:s}=VC(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=S.parseLocator(g.locator),h=S.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=v.join(this.opts.project.cwd,wt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=v.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=v.join(g,h),d=n.get(p);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in d)a(`${u}/${h}`,d);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var j6e={hooks:{cleanGlobalArtifacts:async t=>{let e=dT(t);await T.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:ge.STRING,values:[Sn.WORKSPACES,Sn.DEPENDENCIES,Sn.NONE],default:Sn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:ge.STRING,values:[Bi.CLASSIC,Bi.HARDLINKS_LOCAL,Bi.HARDLINKS_GLOBAL],default:Bi.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:ge.BOOLEAN,default:!0}},linkers:[fT,CT]},Y6e=j6e;var yM={};it(yM,{default:()=>Z7e,npmConfigUtils:()=>gr,npmHttpUtils:()=>Lt,npmPublishUtils:()=>Rf});var Rce=ie(Or());var ir="npm:";var Lt={};it(Lt,{AuthType:()=>jn,customPackageError:()=>W6e,del:()=>_6e,get:()=>zs,getIdentUrl:()=>zA,handleInvalidAuthenticationError:()=>WA,post:()=>z6e,put:()=>V6e});var Pce=ie(aC()),Dce=ie(require("url"));var gr={};it(gr,{RegistryType:()=>ja,getAuditRegistry:()=>q6e,getAuthConfiguration:()=>IT,getDefaultRegistry:()=>eQ,getPublishRegistry:()=>xce,getRegistryConfiguration:()=>kce,getScopeConfiguration:()=>ET,getScopeRegistry:()=>Ya,normalizeRegistry:()=>To});var ja;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(ja||(ja={}));function To(t){return t.replace(/\/$/,"")}function q6e(t,{configuration:e}){let r=e.get(ja.AUDIT_REGISTRY);return r!==null?To(r):xce(t,{configuration:e})}function xce(t,{configuration:e}){var r;return((r=t.publishConfig)==null?void 0:r.registry)?To(t.publishConfig.registry):t.name?Ya(t.name.scope,{configuration:e,type:ja.PUBLISH_REGISTRY}):eQ({configuration:e,type:ja.PUBLISH_REGISTRY})}function Ya(t,{configuration:e,type:r=ja.FETCH_REGISTRY}){let i=ET(t,{configuration:e});if(i===null)return eQ({configuration:e,type:r});let n=i.get(r);return n===null?eQ({configuration:e,type:r}):To(n)}function eQ({configuration:t,type:e=ja.FETCH_REGISTRY}){let r=t.get(e);return To(r!==null?r:t.get(ja.FETCH_REGISTRY))}function kce(t,{configuration:e}){let r=e.get("npmRegistries"),i=To(t),n=r.get(i);if(typeof n!="undefined")return n;let s=r.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function ET(t,{configuration:e}){if(t===null)return null;let i=e.get("npmScopes").get(t);return i||null}function IT(t,{configuration:e,ident:r}){let i=r&&ET(r.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:kce(t,{configuration:e})||e}var jn;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(jn||(jn={}));async function WA(t,{attemptedAs:e,registry:r,headers:i,configuration:n}){var s,o;if(((s=t.originalError)==null?void 0:s.name)==="HTTPError"&&((o=t.originalError)==null?void 0:o.response.statusCode)===401)throw new nt(z.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await J6e(r,i,{configuration:n})}`:`attempted as ${e}`})`)}function W6e(t){var e;return((e=t.response)==null?void 0:e.statusCode)===404?"Package not found":null}function zA(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function zs(t,a){var l=a,{configuration:e,headers:r,ident:i,authType:n,registry:s}=l,o=qr(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=Ya(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await tQ(s,{authType:n,configuration:e,ident:i});c&&(r=_(P({},r),{authorization:c}));try{return await Zt.get(t.charAt(0)==="/"?`${s}${t}`:t,P({configuration:e,headers:r},o))}catch(u){throw await WA(u,{registry:s,configuration:e,headers:r}),u}}async function z6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.post(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.post(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function V6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.put(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.put(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function _6e(t,l){var c=l,{attemptedAs:e,configuration:r,headers:i,ident:n,authType:s=3,registry:o}=c,a=qr(c,["attemptedAs","configuration","headers","ident","authType","registry"]);if(n&&typeof o=="undefined"&&(o=Ya(n.scope,{configuration:r})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let u=await tQ(o,{authType:s,configuration:r,ident:n});u&&(i=_(P({},i),{authorization:u}));try{return await Zt.del(o+t,P({configuration:r,headers:i},a))}catch(g){if(!wT(g))throw await WA(g,{attemptedAs:e,registry:o,configuration:r,headers:i}),g;let f=await yT(),h=P(P({},i),BT(f));try{return await Zt.del(`${o}${t}`,P({configuration:r,headers:h},a))}catch(p){throw await WA(p,{attemptedAs:e,registry:o,configuration:r,headers:i}),p}}}async function tQ(t,{authType:e=2,configuration:r,ident:i}){let n=IT(t,{configuration:r,ident:i}),s=X6e(n,e);if(!s)return null;let o=await r.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new nt(z.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function X6e(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function J6e(t,e,{configuration:r}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await Zt.get(new Dce.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function yT(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:t}=await(0,Pce.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return t}function wT(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function BT(t){return{["npm-otp"]:t}}var QT=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i,params:n}=S.parseRange(e.reference);return!(!Rce.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let{params:i}=S.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await zs(i.__archiveUrl,{configuration:r.project.configuration,ident:e});return await Ai.convertToZip(n,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var bT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!S.tryParseDescriptor(e.range.slice(ir.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){let i=S.parseDescriptor(e.range.slice(ir.length),!0);return r.resolver.getResolutionDependencies(i,r)}async getCandidates(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return await i.resolver.getCandidates(n,r,i)}async getSatisfying(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return i.resolver.getSatisfying(n,r,i)}resolve(e,r){throw new Error("Unreachable")}};var vT=ie(Or()),Fce=ie(require("url"));var Vs=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let i=new Fce.URL(e.reference);return!(!vT.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i;try{i=await zs(Vs.getLocatorUrl(e),{configuration:r.project.configuration,ident:e})}catch(n){i=await zs(Vs.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:r.project.configuration,ident:e})}return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:i}){let n=Ya(e.scope,{configuration:i}),s=Vs.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===n+s||r===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=vT.default.clean(e.reference.slice(ir.length));if(r===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${zA(e)}/-/${e.name}-${r}.tgz`}};var ST=ie(Or());var rQ=S.makeIdent(null,"node-gyp"),Z6e=/\b(node-gyp|prebuild-install)\b/,xT=class{supportsDescriptor(e,r){return e.range.startsWith(ir)?!!qt.validRange(e.range.slice(ir.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i}=S.parseRange(e.reference);return!!ST.default.valid(i)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);let s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=de.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new qt.SemVer(c);if(n.test(u))return u}catch{}return de.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=S.makeLocator(e,`${ir}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Vs.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:S.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);return de.mapAndFilter(r,s=>{try{let{selector:o}=S.parseRange(s,{requireProtocol:ir}),a=new qt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return de.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>S.makeLocator(e,s))}async resolve(e,r){let{selector:i}=S.parseRange(e.reference),n=ST.default.clean(i);if(n===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await zs(zA(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new Ze;if(o.load(s.versions[n]),!o.dependencies.has(rQ.identHash)&&!o.peerDependencies.has(rQ.identHash)){for(let a of o.scripts.values())if(a.match(Z6e)){o.dependencies.set(rQ.identHash,S.makeDescriptor(rQ,"latest")),r.report.reportWarningOnce(z.NODE_GYP_INJECTED,`${S.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}return typeof o.raw.deprecated=="string"&&r.report.reportWarningOnce(z.DEPRECATED_PACKAGE,`${S.prettyLocator(r.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),_(P({},e),{version:n,languageName:"node",linkType:gt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var kT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!Rg.test(e.range.slice(ir.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(ir.length),s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=S.makeLocator(e,`${ir}${a}`),c=s.versions[a].dist.tarball;return Vs.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[S.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Unreachable")}};var Rf={};it(Rf,{getGitHead:()=>_7e,makePublishBody:()=>V7e});var CM={};it(CM,{default:()=>D7e,packUtils:()=>za});var za={};it(za,{genPackList:()=>QQ,genPackStream:()=>dM,genPackageManifest:()=>age,hasPackScripts:()=>hM,prepareForPack:()=>pM});var fM=ie(Nn()),sge=ie(nge()),oge=ie(require("zlib")),I7e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],y7e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function hM(t){return!!(Kt.hasWorkspaceScript(t,"prepack")||Kt.hasWorkspaceScript(t,"postpack"))}async function pM(t,{report:e},r){await Kt.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let i=v.join(t.cwd,Ze.fileName);await T.existsPromise(i)&&await t.manifest.loadFile(i,{baseFs:T}),await r()}finally{await Kt.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function dM(t,e){var s,o;typeof e=="undefined"&&(e=await QQ(t));let r=new Set;for(let a of(o=(s=t.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)r.add(v.normalize(a));for(let a of t.manifest.bin.values())r.add(v.normalize(a));let i=sge.default.pack();process.nextTick(async()=>{for(let a of e){let l=v.normalize(a),c=v.resolve(t.cwd,l),u=v.join("package",l),g=await T.lstatPromise(c),f={name:u,mtime:new Date(mr.SAFE_TIME*1e3)},h=r.has(l)?493:420,p,d,m=new Promise((B,b)=>{p=B,d=b}),I=B=>{B?d(B):p()};if(g.isFile()){let B;l==="package.json"?B=Buffer.from(JSON.stringify(await age(t),null,2)):B=await T.readFilePromise(c),i.entry(_(P({},f),{mode:h,type:"file"}),B,I)}else g.isSymbolicLink()?i.entry(_(P({},f),{mode:h,type:"symlink",linkname:await T.readlinkPromise(c)}),I):I(new Error(`Unsupported file type ${g.mode} for ${M.fromPortablePath(l)}`));await m}i.finalize()});let n=(0,oge.createGzip)();return i.pipe(n),n}async function age(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function QQ(t){var g,f,h,p,d,m,I,B;let e=t.project,r=e.configuration,i={accept:[],reject:[]};for(let b of y7e)i.reject.push(b);for(let b of I7e)i.accept.push(b);i.reject.push(r.get("rcFilename"));let n=b=>{if(b===null||!b.startsWith(`${t.cwd}/`))return;let R=v.relative(t.cwd,b),H=v.resolve(Se.root,R);i.reject.push(H)};n(v.resolve(e.cwd,r.get("lockfileFilename"))),n(r.get("cacheFolder")),n(r.get("globalFolder")),n(r.get("installStatePath")),n(r.get("virtualFolder")),n(r.get("yarnPath")),await r.triggerHook(b=>b.populateYarnPaths,e,b=>{n(b)});for(let b of e.workspaces){let R=v.relative(t.cwd,b.cwd);R!==""&&!R.match(/^(\.\.)?\//)&&i.reject.push(`/${R}`)}let s={accept:[],reject:[]},o=(f=(g=t.manifest.publishConfig)==null?void 0:g.main)!=null?f:t.manifest.main,a=(p=(h=t.manifest.publishConfig)==null?void 0:h.module)!=null?p:t.manifest.module,l=(m=(d=t.manifest.publishConfig)==null?void 0:d.browser)!=null?m:t.manifest.browser,c=(B=(I=t.manifest.publishConfig)==null?void 0:I.bin)!=null?B:t.manifest.bin;o!=null&&s.accept.push(v.resolve(Se.root,o)),a!=null&&s.accept.push(v.resolve(Se.root,a)),typeof l=="string"&&s.accept.push(v.resolve(Se.root,l));for(let b of c.values())s.accept.push(v.resolve(Se.root,b));if(l instanceof Map)for(let[b,R]of l.entries())s.accept.push(v.resolve(Se.root,b)),typeof R=="string"&&s.accept.push(v.resolve(Se.root,R));let u=t.manifest.files!==null;if(u){s.reject.push("/*");for(let b of t.manifest.files)Age(s.accept,b,{cwd:Se.root})}return await w7e(t.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function w7e(t,{hasExplicitFileList:e,globalList:r,ignoreList:i}){let n=[],s=new Zo(t),o=[[Se.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!cge(a,{globalList:r,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Se.root)for(let d of u)g=g||d===".gitignore",f=f||d===".npmignore";let h=f?await lge(s,a,".npmignore"):g?await lge(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;cge(a,{globalList:r,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let d of u)o.push([v.resolve(a,d),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(v.relative(Se.root,a))}return n.sort()}async function lge(t,e,r){let i={accept:[],reject:[]},n=await t.readFilePromise(v.join(e,r),"utf8");for(let s of n.split(/\n/g))Age(i.reject,s,{cwd:e});return i}function B7e(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=v.resolve(e,t)),r&&(t=`!${t}`),t}function Age(t,e,{cwd:r}){let i=e.trim();i===""||i[0]==="#"||t.push(B7e(i,{cwd:r}))}function cge(t,{globalList:e,ignoreLists:r}){if(bQ(t,e.accept))return!1;if(bQ(t,e.reject))return!0;if(r!==null)for(let i of r){if(bQ(t,i.accept))return!1;if(bQ(t,i.reject))return!0}return!1}function bQ(t,e){let r=e,i=[];for(let n=0;n{await pM(i,{report:l},async()=>{l.reportJson({base:M.fromPortablePath(i.cwd)});let c=await QQ(i);for(let u of c)l.reportInfo(null,M.fromPortablePath(u)),l.reportJson({location:M.fromPortablePath(u)});if(!this.dryRun){let u=await dM(i,c),g=T.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(z.UNNAMED,`Package archive generated in ${ue.pretty(e,s,ue.Type.PATH)}`),l.reportJson({output:M.fromPortablePath(s)}))})).exitCode()}};fm.paths=[["pack"]],fm.usage=ye.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"]]});var gge=fm;function Q7e(t,{workspace:e}){let r=t.replace("%s",b7e(e)).replace("%v",v7e(e));return M.toPortablePath(r)}function b7e(t){return t.manifest.name!==null?S.slugifyIdent(t.manifest.name):"package"}function v7e(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var S7e=["dependencies","devDependencies","peerDependencies"],x7e="workspace:",k7e=(t,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of S7e)for(let o of t.manifest.getForScope(s).values()){let a=r.tryWorkspaceByDescriptor(o),l=S.parseRange(o.range);if(l.protocol===x7e)if(a===null){if(r.tryWorkspaceByIdent(o)===null)throw new nt(z.WORKSPACE_NOT_FOUND,`${S.prettyDescriptor(r.configuration,o)}: No local workspace found for this range`)}else{let c;S.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector,e[s][S.stringifyIdent(o)]=c}}},P7e={hooks:{beforeWorkspacePacking:k7e},commands:[gge]},D7e=P7e;var yge=ie(require("crypto")),wge=ie(Ige()),Bge=ie(require("url"));async function V7e(t,e,{access:r,tag:i,registry:n,gitHead:s}){let o=t.project.configuration,a=t.manifest.name,l=t.manifest.version,c=S.stringifyIdent(a),u=(0,yge.createHash)("sha1").update(e).digest("hex"),g=wge.default.fromData(e).toString();typeof r=="undefined"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?r=o.get("npmPublishAccess"):a.scope?r="restricted":r="public");let f=await za.genPackageManifest(t),h=`${c}-${l}.tgz`,p=new Bge.URL(`${To(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:r,["dist-tags"]:{[i]:l},versions:{[l]:_(P({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function _7e(t){try{let{stdout:e}=await hr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}var wM={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:ge.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:ge.SECRET,default:null}},Qge={npmAuditRegistry:{description:"Registry to query for audit reports",type:ge.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:ge.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.STRING,default:"https://registry.yarnpkg.com"}},X7e={configuration:_(P(P({},wM),Qge),{npmScopes:{description:"Settings per package scope",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:P(P({},wM),Qge)}},npmRegistries:{description:"Settings per registry",type:ge.MAP,normalizeKeys:To,valueDefinition:{description:"",type:ge.SHAPE,properties:P({},wM)}}}),fetchers:[QT,Vs],resolvers:[bT,xT,kT]},Z7e=X7e;var vM={};it(vM,{default:()=>a_e});Ss();var Ho;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ho||(Ho={}));var Xs;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(Xs||(Xs={}));var vQ=[Xs.Info,Xs.Low,Xs.Moderate,Xs.High,Xs.Critical];function bge(t,e){let r=[],i=new Set,n=o=>{i.has(o)||(i.add(o),r.push(o))};for(let o of e)n(o);let s=new Set;for(;r.length>0;){let o=r.shift(),a=t.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=t.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function $7e(t,e){return new Set([...t].filter(r=>!e.has(r)))}function e_e(t,e,{all:r}){let i=r?t.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=bge(t,l),g=bge(t,c);return $7e(g,u)}function vge(t){let e={};for(let r of t)e[S.stringifyIdent(r)]=S.parseRange(r.range).selector;return e}function Sge(t){if(typeof t=="undefined")return new Set;let e=vQ.indexOf(t),r=vQ.slice(e);return new Set(r)}function t_e(t,e){let r=Sge(e),i={};for(let n of r)i[n]=t[n];return i}function xge(t,e){var i;let r=t_e(t,e);for(let n of Object.keys(r))if((i=r[n])!=null?i:0>0)return!0;return!1}function kge(t,e){var s;let r={},i={children:r},n=Object.values(t.advisories);if(e!=null){let o=Sge(e);n=n.filter(a=>o.has(a.severity))}for(let o of de.sortMap(n,a=>a.module_name))r[o.module_name]={label:o.module_name,value:ue.tuple(ue.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ue.tuple(ue.Type.NO_HINT,o.title)},URL:{label:"URL",value:ue.tuple(ue.Type.URL,o.url)},Severity:{label:"Severity",value:ue.tuple(ue.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ue.tuple(ue.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ue.tuple(ue.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ue.tuple(ue.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ue.tuple(ue.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function Pge(t,e,{all:r,environment:i}){let n=r?t.workspaces:[e],s=[Ho.All,Ho.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ho.All,Ho.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return vge([...o,...l].filter(c=>S.parseRange(c.range).protocol===null))}function Dge(t,e,{all:r}){var s;let i=e_e(t,e,{all:r}),n={};for(let o of t.storedPackages.values())n[S.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:vge(o.dependencies.values()),dev:i.has(S.convertLocatorToDescriptor(o).descriptorHash)};return n}var dm=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=Y.String("--environment",Ho.All,{description:"Which environments to cover",validator:Yi(Ho)});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=Y.String("--severity",Xs.Info,{description:"Minimal severity requested for packages to be displayed",validator:Yi(Xs)})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=Pge(r,i,{all:this.all,environment:this.environment}),s=Dge(r,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=gr.getAuditRegistry(i.manifest,{configuration:e}),l,c=await Fa.start({configuration:e,stdout:this.context.stdout},async()=>{l=await Lt.post("/-/npm/v1/security/audits/quick",o,{authType:Lt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=xge(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(Hs.emitTree(kge(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(z.EXCEPTION,"No audit suggestions")})).exitCode()}};dm.paths=[["npm","audit"]],dm.usage=ye.Usage({description:"perform a vulnerability audit against the installed packages",details:` - 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). - - 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\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${vQ.map(e=>`\`${e}\``).join(", ")}. - - 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. - - 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. - `,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"]]});var Rge=dm;var BM=ie(Or()),QM=ie(require("util")),Cm=class extends Be{constructor(){super(...arguments);this.fields=Y.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let b=r.topLevelWorkspace;if(!b.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(b.cwd,wt.manifest))}`);c=S.makeDescriptor(b.manifest.name,"unknown")}else c=S.parseDescriptor(l);let u=Lt.getIdentUrl(c),g=bM(await Lt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:Lt.customPackageError})),f=Object.keys(g.versions).sort(BM.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],d=qt.validRange(c.range);if(d){let b=BM.default.maxSatisfying(f,d);b!==null?p=b:(a.reportWarning(z.UNNAMED,`Unmet range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else c.range!=="unknown"&&(a.reportWarning(z.UNNAMED,`Invalid range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let m=g.versions[p],I=_(P(P({},g),m),{version:p,versions:f}),B;if(i!==null){B={};for(let b of i){let R=I[b];if(typeof R!="undefined")B[b]=R;else{a.reportWarning(z.EXCEPTION,`The '${b}' field doesn't exist inside ${S.prettyIdent(e,c)}'s informations`),s=!0;continue}}}else this.json||(delete I.dist,delete I.readme,delete I.users),B=I;a.reportJson(B),this.json||n.push(B)}});QM.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,QM.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};Cm.paths=[["npm","info"]],Cm.usage=ye.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"]]});var Fge=Cm;function bM(t){if(Array.isArray(t)){let e=[];for(let r of t)r=bM(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let i=bM(t[r]);i&&(e[r]=i)}return e}else return t||null}var Nge=ie(aC()),mm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await i_e({registry:r,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await Lt.put(o,s,{attemptedAs:s.name,configuration:e,registry:r,jsonResponse:!0,authType:Lt.AuthType.NO_AUTH});return await r_e(r,a.token,{configuration:e,scope:this.scope}),n.reportInfo(z.UNNAMED,"Successfully logged in")})).exitCode()}};mm.paths=[["npm","login"]],mm.usage=ye.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"]]});var Lge=mm;async function SQ({scope:t,publish:e,configuration:r,cwd:i}){return t&&e?gr.getScopeRegistry(t,{configuration:r,type:gr.RegistryType.PUBLISH_REGISTRY}):t?gr.getScopeRegistry(t,{configuration:r}):e?gr.getPublishRegistry((await rf(r,i)).manifest,{configuration:r}):gr.getDefaultRegistry({configuration:r})}async function r_e(t,e,{configuration:r,scope:i}){let n=o=>a=>{let l=de.isIndexableObject(a)?a:{},c=l[o],u=de.isIndexableObject(c)?c:{};return _(P({},l),{[o]:_(P({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(t)};return await fe.updateHomeConfiguration(s)}async function i_e({registry:t,report:e,stdin:r,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(z.UNNAMED,`Logging in to ${t}`);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(z.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),e.reportSeparator();let{username:s,password:o}=await(0,Nge.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Ff=new Set(["npmAuthIdent","npmAuthToken"]),Em=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=Y.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=async()=>{var l;let n=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await fe.find(this.context.cwd,this.context.plugins),o=S.makeIdent((l=this.scope)!=null?l:null,"pkg");return!gr.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await n_e(),n.reportInfo(z.UNNAMED,"Successfully logged out from everything")),this.scope){await Tge("npmScopes",this.scope),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(z.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish});await Tge("npmRegistries",s),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(z.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};Em.paths=[["npm","logout"]],Em.usage=ye.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"]]});var Mge=Em;function s_e(t,e){let r=t[e];if(!de.isIndexableObject(r))return!1;let i=new Set(Object.keys(r));if([...Ff].every(s=>!i.has(s)))return!1;for(let s of Ff)i.delete(s);if(i.size===0)return t[e]=void 0,!0;let n=P({},r);for(let s of Ff)delete n[s];return t[e]=n,!0}async function n_e(){let t=e=>{let r=!1,i=de.isIndexableObject(e)?P({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,r=!0);for(let n of Object.keys(i))s_e(i,n)&&(r=!0);if(Object.keys(i).length!==0)return r?i:e};return await fe.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function Tge(t,e){return await fe.updateHomeConfiguration({[t]:r=>{let i=de.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(i,e))return r;let n=i[e],s=de.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Ff].every(l=>!o.has(l)))return r;for(let l of Ff)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:_(P({},i),{[e]:void 0});let a={};for(let l of Ff)a[l]=void 0;return _(P({},i),{[e]:P(P({},s),a)})}})}var Im=class extends Be{constructor(){super(...arguments);this.access=Y.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=Y.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=Y.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);if(i.manifest.private)throw new me("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new me("Workspaces must have valid names and versions to be published on an external registry");await r.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=gr.getPublishRegistry(i.manifest,{configuration:e});return(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await Lt.get(Lt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(z.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Kt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await za.prepareForPack(i,{report:l},async()=>{let g=await za.genPackList(i);for(let m of g)l.reportInfo(null,m);let f=await za.genPackStream(i,g),h=await de.bufferStream(f),p=await Rf.getGitHead(i.cwd),d=await Rf.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await Lt.put(Lt.getIdentUrl(n),d,{configuration:e,registry:o,ident:n,jsonResponse:!0})}),l.reportInfo(z.UNNAMED,"Package archive published")})).exitCode()}};Im.paths=[["npm","publish"]],Im.usage=ye.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"]]});var Oge=Im;var Uge=ie(Or());var ym=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=S.parseIdent(this.package);else{if(!i)throw new rt(r.cwd,this.context.cwd);if(!i.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(i.cwd,wt.manifest))}`);n=i.manifest.name}let s=await wm(n,e),a={children:de.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ue.tuple(ue.Type.RESOLUTION,{descriptor:S.makeDescriptor(n,l),locator:S.makeLocator(n,c)})}))};return Hs.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};ym.paths=[["npm","tag","list"]],ym.usage=ye.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Kge=ym;async function wm(t,e){let r=`/-/package${Lt.getIdentUrl(t)}/dist-tags`;return Lt.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:Lt.customPackageError})}var Bm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseDescriptor(this.package,!0),s=n.range;if(!Uge.default.valid(s))throw new me(`The range ${ue.pretty(e,n.range,ue.Type.RANGE)} must be a valid semver version`);let o=gr.getPublishRegistry(i.manifest,{configuration:e}),a=ue.pretty(e,n,ue.Type.IDENT),l=ue.pretty(e,s,ue.Type.RANGE),c=ue.pretty(e,this.tag,ue.Type.CODE);return(await Fe.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await wm(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(z.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(z.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};Bm.paths=[["npm","tag","add"]],Bm.usage=ye.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - 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. - `,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"]]});var Hge=Bm;var Qm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){if(this.tag==="latest")throw new me("The 'latest' tag cannot be removed.");let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseIdent(this.package),s=gr.getPublishRegistry(i.manifest,{configuration:e}),o=ue.pretty(e,this.tag,ue.Type.CODE),a=ue.pretty(e,n,ue.Type.IDENT),l=await wm(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new me(`${o} is not a tag of package ${a}`);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(z.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};Qm.paths=[["npm","tag","remove"]],Qm.usage=ye.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var Gge=Qm;var bm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r;return this.scope&&this.publish?r=gr.getScopeRegistry(this.scope,{configuration:e,type:gr.RegistryType.PUBLISH_REGISTRY}):this.scope?r=gr.getScopeRegistry(this.scope,{configuration:e}):this.publish?r=gr.getPublishRegistry((await rf(e,this.context.cwd)).manifest,{configuration:e}):r=gr.getDefaultRegistry({configuration:e}),(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await Lt.get("/-/whoami",{configuration:e,registry:r,authType:Lt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?S.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(z.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(z.UNNAMED,s.username)})).exitCode()}};bm.paths=[["npm","whoami"]],bm.usage=ye.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"]]});var jge=bm;var o_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:ge.STRING,default:null}},commands:[Rge,Fge,Lge,Mge,Oge,Hge,Kge,Gge,jge]},a_e=o_e;var NM={};it(NM,{default:()=>B_e,patchUtils:()=>SM});var SM={};it(SM,{applyPatchFile:()=>PQ,diffFolders:()=>DM,extractPackageToDisk:()=>PM,extractPatchFlags:()=>Xge,isParentRequired:()=>kM,loadPatchFiles:()=>km,makeDescriptor:()=>I_e,makeLocator:()=>xM,parseDescriptor:()=>Sm,parseLocator:()=>xm,parsePatchFile:()=>kQ});var vm=class extends Error{constructor(e,r){super(`Cannot apply hunk #${e+1}`);this.hunk=r}};var A_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function Nf(t){return v.relative(Se.root,v.resolve(Se.root,M.toPortablePath(t)))}function l_e(t){let e=t.trim().match(A_e);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var c_e=420,u_e=493,Lr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Lr||(Lr={}));var Yge=()=>({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}),g_e=t=>({header:l_e(t),parts:[]}),f_e={["@"]:"header",["-"]:Lr.Deletion,["+"]:Lr.Insertion,[" "]:Lr.Context,["\\"]:"pragma",undefined:Lr.Context};function p_e(t){let e=[],r=Yge(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),r.hunks.push(n),n=null)}function a(){o(),e.push(r),r=Yge()}for(let l=0;l0?"patch":"mode change",B=null;switch(I){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:Nf(u),toPath:Nf(g)}),B=g}break;case"file deletion":{let b=n||p;if(!b)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(l),hash:f})}break;case"file creation":{let b=s||d;if(!b)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(c),hash:h})}break;case"patch":case"mode change":B=d||s;break;default:de.assertNever(I);break}B&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:Nf(B),oldMode:xQ(o),newMode:xQ(a)}),B&&m&&m.length&&e.push({type:"patch",semverExclusivity:i,path:Nf(B),hunks:m,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function xQ(t){let e=parseInt(t,8)&511;if(e!==c_e&&e!==u_e)throw new Error(`Unexpected file mode string: ${t}`);return e}function kQ(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),d_e(p_e(e))}function h_e(t){let e=0,r=0;for(let{type:i,lines:n}of t.parts)switch(i){case Lr.Context:r+=n.length,e+=n.length;break;case Lr.Deletion:e+=n.length;break;case Lr.Insertion:r+=n.length;break;default:de.assertNever(i);break}if(e!==t.header.original.length||r!==t.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(t.header.original.length)} ${i(t.header.patched.length)} @@, got @@ ${i(e)} ${i(r)} @@)`)}}async function Lf(t,e,r){let i=await t.lstatPromise(e),n=await r();if(typeof n!="undefined"&&(e=n),t.lutimesPromise)await t.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await t.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function PQ(t,{baseFs:e=new Wt,dryRun:r=!1,version:i=null}={}){for(let n of t)if(!(n.semverExclusivity!==null&&i!==null&&!qt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(r){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Lf(e,v.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(r){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Lf(e,v.dirname(n.fromPath),async()=>{await Lf(e,v.dirname(n.toPath),async()=>{await Lf(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(v.dirname(n.path),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,mr.SAFE_TIME,mr.SAFE_TIME)}break;case"patch":await Lf(e,n.path,async()=>{await C_e(n,{baseFs:e,dryRun:r})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(qge(n.newMode)!==qge(o))continue;await Lf(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:de.assertNever(n);break}}function qge(t){return(t&64)>0}function Jge(t){return t.replace(/\s+$/,"")}function m_e(t,e){return Jge(t)===Jge(e)}async function C_e({hunks:t,path:e},{baseFs:r,dryRun:i=!1}){let n=await r.statSync(e).mode,o=(await r.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of t){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),d=Math.max(h,p),m=0,I=0,B=null;for(;m<=d;){if(m<=h&&(I=f-m,B=Wge(g,o,I),B!==null)){m=-m;break}if(m<=p&&(I=f+m,B=Wge(g,o,I),B!==null))break;m+=1}if(B===null)throw new vm(t.indexOf(g),g);a.push(B),l+=m,c=I+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:de.assertNever(f);break}await r.writeFilePromise(e,o.join(` -`),{mode:n})}function Wge(t,e,r){let i=[];for(let n of t.parts)switch(n.type){case Lr.Context:case Lr.Deletion:{for(let s of n.lines){let o=e[r];if(o==null||!m_e(o,s))return null;r+=1}n.type===Lr.Deletion&&(i.push({type:"splice",index:r-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Lr.Insertion:i.push({type:"splice",index:r,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:de.assertNever(n.type);break}return i}var E_e=/^builtin<([^>]+)>$/;function zge(t,e){let{source:r,selector:i,params:n}=S.parseRange(t);if(r===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>M.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?S.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(r);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function Sm(t){let i=zge(t.range,S.parseDescriptor),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceDescriptor:e})}function xm(t){let i=zge(t.reference,S.parseLocator),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceLocator:e})}function Vge({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:i,patchHash:n},s){let o=t!==null?{locator:S.stringifyLocator(t)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return S.makeRange({protocol:"patch:",source:s(e),selector:r.join("&"),params:P(P(P({},a),l),o)})}function I_e(t,{parentLocator:e,sourceDescriptor:r,patchPaths:i}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,patchPaths:i},S.stringifyDescriptor))}function xM(t,{parentLocator:e,sourcePackage:r,patchPaths:i,patchHash:n}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:i,patchHash:n},S.stringifyLocator))}function _ge({onAbsolute:t,onRelative:e,onBuiltin:r},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(E_e);return s!==null?r(s[1]):v.isAbsolute(i)?t(i):e(i)}function Xge(t){let e=t.startsWith("~");return e&&(t=t.slice(1)),{optional:e}}function kM(t){return _ge({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},t)}async function km(t,e,r){let i=t!==null?await r.fetcher.fetch(t,r):null,n=i&&i.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await de.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Xge(o),l=await _ge({onAbsolute:async()=>await T.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(v.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await r.project.configuration.firstHook(u=>u.getBuiltinPatch,r.project,c)},o);return _(P({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function PM(t,{cache:e,project:r}){let i=r.storedPackages.get(t.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=r.storedChecksums,s=new ei,o=r.configuration.makeFetcher(),a=await o.fetch(t,{cache:e,project:r,fetcher:o,checksums:n,report:s}),l=await T.mktempPromise(),c=v.join(l,"source"),u=v.join(l,"user"),g=v.join(l,".yarn-patch.json");return await Promise.all([T.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),T.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),T.writeJsonPromise(g,{locator:S.stringifyLocator(t),version:i.version})]),T.detachTemp(l),u}async function DM(t,e){let r=M.fromPortablePath(t).replace(/\\/g,"/"),i=M.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--text",r,i],{cwd:M.toPortablePath(process.cwd()),env:_(P({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=r.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${de.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${de.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(de.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(de.escapeRegExp(`${i}/`),"g"),"")}function Zge(t,{configuration:e,report:r}){for(let i of t.parts)for(let n of i.lines)switch(i.type){case Lr.Context:r.reportInfo(null,` ${ue.pretty(e,n,"grey")}`);break;case Lr.Deletion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`- ${ue.pretty(e,n,ue.Type.REMOVED)}`);break;case Lr.Insertion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`+ ${ue.pretty(e,n,ue.Type.ADDED)}`);break;default:de.assertNever(i.type)}}var RM=class{supports(e,r){return!!e.reference.startsWith("patch:")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async patchPackage(e,r){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=xm(e),a=await km(i,o,r),l=await T.mktempPromise(),c=v.join(l,"current.zip"),u=await r.fetcher.fetch(n,r),g=S.getIdentVendorPath(e),f=await $i(),h=new Jr(c,{libzip:f,create:!0,level:r.project.configuration.get("compressionLevel")});await de.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:d}of a){if(p===null)continue;let m=new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")}),I=new Ft(v.resolve(Se.root,g),{baseFs:m});try{await PQ(kQ(p),{baseFs:I,version:s})}catch(B){if(!(B instanceof vm))throw B;let b=r.project.configuration.get("enableInlineHunks"),R=!b&&!d?" (set enableInlineHunks for details)":"",H=`${S.prettyLocator(r.project.configuration,e)}: ${B.message}${R}`,L=K=>{!b||Zge(B.hunk,{configuration:r.project.configuration,report:K})};if(m.discardAndClose(),d){r.report.reportWarningOnce(z.PATCH_HUNK_FAILED,H,{reportExtra:L});continue}else throw new nt(z.PATCH_HUNK_FAILED,H,L)}m.saveAndClose()}return new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")})}};var y_e=3,FM=class{supportsDescriptor(e,r){return!!e.range.startsWith("patch:")}supportsLocator(e,r){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){let{patchPaths:n}=Sm(e);return n.every(s=>!kM(s))?e:S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:i}=Sm(e);return[i]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=Sm(e),a=await km(n,o,i.fetchOptions),l=r.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=mn.makeHash(`${y_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[xM(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){let{sourceLocator:i}=xm(e),n=await r.resolver.resolve(i,r);return P(P({},n),e)}};var Pm=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=v.resolve(this.context.cwd,M.toPortablePath(this.patchFolder)),s=v.join(n,"../source"),o=v.join(n,"../.yarn-patch.json");if(!T.existsSync(s))throw new me("The argument folder didn't get created by 'yarn patch'");let a=await DM(s,n),l=await T.readJsonPromise(o),c=S.parseLocator(l.locator,!0);if(!r.storedPackages.has(c.locatorHash))throw new me("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=v.join(u,S.slugifyLocator(c));await T.mkdirPromise(u,{recursive:!0}),await T.writeFilePromise(g,a);let f=v.relative(r.cwd,g);r.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:S.stringifyIdent(c),description:l.version}},reference:`patch:${S.stringifyLocator(c)}#${f}`}),await r.persist()}};Pm.paths=[["patch-commit"]],Pm.usage=ye.Usage({description:"generate a patch out of a directory",details:"\n This will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n Only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var $ge=Pm;var Dm=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=S.parseLocator(this.package);if(s.reference==="unknown"){let o=de.mapAndFilter([...r.storedPackages.values()],a=>a.identHash!==s.identHash?de.mapAndFilter.skip:S.isVirtualLocator(a)?de.mapAndFilter.skip:a);if(o.length===0)throw new me("No package found in the project for the given locator");if(o.length>1)throw new me(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${S.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!r.storedPackages.has(s.locatorHash))throw new me("No package found in the project for the given locator");await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await PM(s,{cache:n,project:r});o.reportJson({locator:S.stringifyLocator(s),path:M.fromPortablePath(a)}),o.reportInfo(z.UNNAMED,`Package ${S.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(z.UNNAMED,`You can now edit the following folder: ${ue.pretty(e,M.fromPortablePath(a),"magenta")}`),o.reportInfo(z.UNNAMED,`Once you are done run ${ue.pretty(e,`yarn patch-commit ${process.platform==="win32"?'"':""}${M.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};Dm.paths=[["patch"]],Dm.usage=ye.Usage({description:"prepare a package for patching",details:'\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 '});var efe=Dm;var w_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:ge.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[$ge,efe],fetchers:[RM],resolvers:[FM]},B_e=w_e;var TM={};it(TM,{default:()=>S_e});var tfe=ie(Wp()),LM=class{supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="pnpm"}async findPackageLocation(e,r){return nfe(e,{project:r.project})}async findPackageLocator(e,r){let i=ife(),n=r.project.installersCustomData.get(i);if(!n)throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=v.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new rfe(e)}},rfe=class{constructor(e){this.opts=e;this.asyncActions=new afe;this.packageLocations=new Map;this.customData={locatorByPath:new Map}}getCustomDataKey(){return ife()}attachCustomData(e){this.customData=e}async installPackage(e,r,i){switch(e.linkType){case gt.SOFT:return this.installPackageSoft(e,r,i);case gt.HARD:return this.installPackageHard(e,r,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,i){let n=v.resolve(r.packageFs.getRealPath(),r.prefixPath);return this.packageLocations.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,r,i){var u;let n=nfe(e,{project:this.opts.project});this.customData.locatorByPath.set(n,S.stringifyLocator(e)),this.packageLocations.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await T.mkdirPromise(n,{recursive:!0}),await T.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1})}));let o=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e,a={manifest:(u=await Ze.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?u:new Ze,misc:{hasBindingGyp:Ws.hasBindingGyp(r)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ws.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,r){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!ofe(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.packageLocations.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(e)})`);let s=v.join(n,wt.nodeModules);r.length>0&&await T.mkdirpPromise(s);let o=await Q_e(s),a=[];for(let[l,c]of r){let u=c;ofe(c,{project:this.opts.project})||(this.opts.report.reportWarning(z.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=S.devirtualizeLocator(c));let g=this.packageLocations.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(c)})`);let f=S.stringifyIdent(l),h=v.join(s,f),p=v.relative(v.dirname(h),g),d=o.get(f);o.delete(f),a.push(Promise.resolve().then(async()=>{if(d){if(d.isSymbolicLink()&&await T.readlinkPromise(h)===p)return;await T.removePromise(h)}await T.mkdirpPromise(v.dirname(h)),process.platform=="win32"?await T.symlinkPromise(g,h,"junction"):await T.symlinkPromise(p,h)}))}for(let l of o.keys())a.push(T.removePromise(v.join(s,l)));await Promise.all(a)}))}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=sfe(this.opts.project),r=new Set;for(let s of this.packageLocations.values())r.add(v.basename(s));let i;try{i=await T.readdirPromise(e)}catch{i=[]}let n=[];for(let s of i)r.has(s)||n.push(T.removePromise(v.join(e,s)));await Promise.all(n),await this.asyncActions.wait()}};function ife(){return JSON.stringify({name:"PnpmInstaller",version:1})}function sfe(t){return v.join(t.cwd,wt.nodeModules,".store")}function nfe(t,{project:e}){let r=S.slugifyLocator(t);return v.join(sfe(e),r)}function ofe(t,{project:e}){return!S.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Q_e(t){let e=new Map,r=[];try{r=await T.readdirPromise(t,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of r)if(!i.name.startsWith("."))if(i.name.startsWith("@"))for(let n of await T.readdirPromise(v.join(t,i.name),{withFileTypes:!0}))e.set(`${i.name}/${n.name}`,n);else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}function b_e(){let t,e;return{promise:new Promise((i,n)=>{t=i,e=n}),resolve:t,reject:e}}var afe=class{constructor(){this.deferred=new Map;this.promises=new Map;this.limit=(0,tfe.default)(10)}set(e,r){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=b_e());let n=this.limit(()=>r());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,r){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>r(i))}async wait(){await Promise.all(this.promises.values())}};var v_e={linkers:[LM]},S_e=v_e;var F0=()=>({modules:new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",F$(vh)],["semver",x_e],["typanion",lu],["yup",k_e],["@yarnpkg/plugin-essentials",hL],["@yarnpkg/plugin-compat",mL],["@yarnpkg/plugin-dlx",EL],["@yarnpkg/plugin-file",xL],["@yarnpkg/plugin-git",fL],["@yarnpkg/plugin-github",PL],["@yarnpkg/plugin-http",FL],["@yarnpkg/plugin-init",ML],["@yarnpkg/plugin-link",GL],["@yarnpkg/plugin-nm",mT],["@yarnpkg/plugin-npm",yM],["@yarnpkg/plugin-npm-cli",vM],["@yarnpkg/plugin-pack",CM],["@yarnpkg/plugin-patch",NM],["@yarnpkg/plugin-pnp",oT],["@yarnpkg/plugin-pnpm",TM]]),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-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});i0({binaryVersion:Zr||"",pluginConfiguration:F0()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ diff --git a/tgui/.yarn/releases/yarn-4.2.2.cjs b/tgui/.yarn/releases/yarn-4.2.2.cjs new file mode 100644 index 000000000000..ea34d01a49a2 --- /dev/null +++ b/tgui/.yarn/releases/yarn-4.2.2.cjs @@ -0,0 +1,894 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var $3e=Object.create;var LR=Object.defineProperty;var e_e=Object.getOwnPropertyDescriptor;var t_e=Object.getOwnPropertyNames;var r_e=Object.getPrototypeOf,n_e=Object.prototype.hasOwnProperty;var ve=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+t+'" is not supported')});var Et=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),zt=(t,e)=>{for(var r in e)LR(t,r,{get:e[r],enumerable:!0})},i_e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of t_e(e))!n_e.call(t,a)&&a!==r&&LR(t,a,{get:()=>e[a],enumerable:!(o=e_e(e,a))||o.enumerable});return t};var $e=(t,e,r)=>(r=t!=null?$3e(r_e(t)):{},i_e(e||!t||!t.__esModule?LR(r,"default",{value:t,enumerable:!0}):r,t));var vi={};zt(vi,{SAFE_TIME:()=>x7,S_IFDIR:()=>wD,S_IFLNK:()=>ID,S_IFMT:()=>Mu,S_IFREG:()=>qw});var Mu,wD,qw,ID,x7,k7=Et(()=>{Mu=61440,wD=16384,qw=32768,ID=40960,x7=456789e3});var tr={};zt(tr,{EBADF:()=>Io,EBUSY:()=>s_e,EEXIST:()=>A_e,EINVAL:()=>a_e,EISDIR:()=>u_e,ENOENT:()=>l_e,ENOSYS:()=>o_e,ENOTDIR:()=>c_e,ENOTEMPTY:()=>p_e,EOPNOTSUPP:()=>h_e,EROFS:()=>f_e,ERR_DIR_CLOSED:()=>NR});function Ll(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function s_e(t){return Ll("EBUSY",t)}function o_e(t,e){return Ll("ENOSYS",`${t}, ${e}`)}function a_e(t){return Ll("EINVAL",`invalid argument, ${t}`)}function Io(t){return Ll("EBADF",`bad file descriptor, ${t}`)}function l_e(t){return Ll("ENOENT",`no such file or directory, ${t}`)}function c_e(t){return Ll("ENOTDIR",`not a directory, ${t}`)}function u_e(t){return Ll("EISDIR",`illegal operation on a directory, ${t}`)}function A_e(t){return Ll("EEXIST",`file already exists, ${t}`)}function f_e(t){return Ll("EROFS",`read-only filesystem, ${t}`)}function p_e(t){return Ll("ENOTEMPTY",`directory not empty, ${t}`)}function h_e(t){return Ll("EOPNOTSUPP",`operation not supported, ${t}`)}function NR(){return Ll("ERR_DIR_CLOSED","Directory handle was closed")}var BD=Et(()=>{});var Ea={};zt(Ea,{BigIntStatsEntry:()=>ty,DEFAULT_MODE:()=>UR,DirEntry:()=>OR,StatEntry:()=>ey,areStatsEqual:()=>_R,clearStats:()=>vD,convertToBigIntStats:()=>d_e,makeDefaultStats:()=>Q7,makeEmptyStats:()=>g_e});function Q7(){return new ey}function g_e(){return vD(Q7())}function vD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):MR.types.isDate(r)&&(t[e]=new Date(0))}return t}function d_e(t){let e=new ty;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):MR.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function _R(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var MR,UR,OR,ey,ty,HR=Et(()=>{MR=$e(ve("util")),UR=33188,OR=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},ey=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=UR;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},ty=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(UR);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function w_e(t){let e,r;if(e=t.match(E_e))t=e[1];else if(r=t.match(C_e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function I_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(m_e))?t=`/${e[1]}`:(r=t.match(y_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function DD(t,e){return t===le?R7(e):qR(e)}var Gw,Bt,dr,le,z,F7,m_e,y_e,E_e,C_e,qR,R7,Ca=Et(()=>{Gw=$e(ve("path")),Bt={root:"/",dot:".",parent:".."},dr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},le=Object.create(Gw.default),z=Object.create(Gw.default.posix);le.cwd=()=>process.cwd();z.cwd=process.platform==="win32"?()=>qR(process.cwd()):process.cwd;process.platform==="win32"&&(z.resolve=(...t)=>t.length>0&&z.isAbsolute(t[0])?Gw.default.posix.resolve(...t):Gw.default.posix.resolve(z.cwd(),...t));F7=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};le.contains=(t,e)=>F7(le,t,e);z.contains=(t,e)=>F7(z,t,e);m_e=/^([a-zA-Z]:.*)$/,y_e=/^\/\/(\.\/)?(.*)$/,E_e=/^\/([a-zA-Z]:.*)$/,C_e=/^\/unc\/(\.dot\/)?(.*)$/;qR=process.platform==="win32"?I_e:t=>t,R7=process.platform==="win32"?w_e:t=>t;le.fromPortablePath=R7;le.toPortablePath=qR});async function PD(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function T7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:Mg,mtime:Mg}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await GR(A,p,t,n,r,u,{...a,didParentExist:!0});for(let I of A)await I();await Promise.all(p.map(I=>I()))}async function GR(t,e,r,o,a,n,u){let A=u.didParentExist?await L7(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:Mg,mtime:Mg}:p,I;switch(!0){case p.isDirectory():I=await v_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():I=await S_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():I=await b_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((I||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),I=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),I=!0)),I}async function L7(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function v_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(v){if(v.code!=="EEXIST")throw v}}),h=!0);let E=await n.readdirPromise(u),I=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let v of E.sort())await GR(t,e,r,r.pathUtils.join(o,v),n,n.pathUtils.join(u,v),I)&&(h=!0);else(await Promise.all(E.map(async x=>{await GR(t,e,r,r.pathUtils.join(o,x),n,n.pathUtils.join(u,x),I)}))).some(x=>x)&&(h=!0);return h}async function D_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),I=420,v=A.mode&511,x=`${E}${v!==I?v.toString(8):""}`,C=r.pathUtils.join(h.indexPath,E.slice(0,2),`${x}.dat`),R;(ue=>(ue[ue.Lock=0]="Lock",ue[ue.Rename=1]="Rename"))(R||={});let N=1,U=await L7(r,C);if(a){let ae=U&&a.dev===U.dev&&a.ino===U.ino,fe=U?.mtimeMs!==B_e;if(ae&&fe&&h.autoRepair&&(N=0,U=null),!ae)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let V=!U&&N===1?`${C}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,te=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(C,async()=>{let ae=await n.readFilePromise(u);await r.writeFilePromise(C,ae)}),N===1&&V)){let ae=await n.readFilePromise(u);await r.writeFilePromise(V,ae);try{await r.linkPromise(V,C)}catch(fe){if(fe.code==="EEXIST")te=!0,await r.unlinkPromise(V);else throw fe}}a||await r.linkPromise(C,o)}),e.push(async()=>{U||(await r.lutimesPromise(C,Mg,Mg),v!==I&&await r.chmodPromise(C,v)),V&&!te&&await r.unlinkPromise(V)}),!1}async function P_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function S_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="HardlinkFromIndex"?D_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):P_e(t,e,r,o,a,n,u,A,p)}async function b_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(DD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var Mg,B_e,jR=Et(()=>{Ca();Mg=new Date(456789e3*1e3),B_e=Mg.getTime()});function SD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new jw(e,a,o)}var jw,N7=Et(()=>{BD();jw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw NR()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function O7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var M7,ry,U7=Et(()=>{M7=ve("events");HR();ry=class extends M7.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new ry(r,o,a);return n.start(),n}start(){O7(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){O7(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let o=this.bigint?new ty:new ey;return vD(o)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;_R(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function ny(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=bD.get(t);typeof p>"u"&&bD.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=ry.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function Ug(t,e,r){let o=bD.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function _g(t){let e=bD.get(t);if(!(typeof e>"u"))for(let r of e.keys())Ug(t,r)}var bD,YR=Et(()=>{U7();bD=new WeakMap});function x_e(t){let e=t.match(/\r?\n/g);if(e===null)return H7.EOL;let r=e.filter(a=>a===`\r +`).length,o=e.length-r;return r>o?`\r +`:` +`}function Hg(t,e){return e.replace(/\r?\n/g,x_e(t))}var _7,H7,gf,Uu,qg=Et(()=>{_7=ve("crypto"),H7=ve("os");jR();Ca();gf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,_7.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;nsetTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await T7(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(DD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?Hg(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?Hg(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)} +`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)} +`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},Uu=class extends gf{constructor(){super(z)}}});var Ps,df=Et(()=>{qg();Ps=class extends gf{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,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}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,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}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,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var _u,q7=Et(()=>{df();_u=class extends Ps{constructor(r,{baseFs:o,pathUtils:a}){super(a);this.target=r,this.baseFs=o}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(r){return r}mapToBase(r){return r}}});function G7(t){let e=t;return typeof t.path=="string"&&(e.path=le.toPortablePath(t.path)),e}var j7,Tn,Gg=Et(()=>{j7=$e(ve("fs"));qg();Ca();Tn=class extends Uu{constructor(r=j7.default){super();this.realFs=r}getExtractHint(){return!1}getRealPath(){return Bt.root}resolve(r){return z.resolve(r)}async openPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.open(le.fromPortablePath(r),o,a,this.makeCallback(n,u))})}openSync(r,o,a){return this.realFs.openSync(le.fromPortablePath(r),o,a)}async opendirPromise(r,o){return await new Promise((a,n)=>{typeof o<"u"?this.realFs.opendir(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.opendir(le.fromPortablePath(r),this.makeCallback(a,n))}).then(a=>{let n=a;return Object.defineProperty(n,"path",{value:r,configurable:!0,writable:!0}),n})}opendirSync(r,o){let n=typeof o<"u"?this.realFs.opendirSync(le.fromPortablePath(r),o):this.realFs.opendirSync(le.fromPortablePath(r));return Object.defineProperty(n,"path",{value:r,configurable:!0,writable:!0}),n}async readPromise(r,o,a=0,n=0,u=-1){return await new Promise((A,p)=>{this.realFs.read(r,o,a,n,u,(h,E)=>{h?p(h):A(E)})})}readSync(r,o,a,n,u){return this.realFs.readSync(r,o,a,n,u)}async writePromise(r,o,a,n,u){return await new Promise((A,p)=>typeof o=="string"?this.realFs.write(r,o,a,this.makeCallback(A,p)):this.realFs.write(r,o,a,n,u,this.makeCallback(A,p)))}writeSync(r,o,a,n,u){return typeof o=="string"?this.realFs.writeSync(r,o,a):this.realFs.writeSync(r,o,a,n,u)}async closePromise(r){await new Promise((o,a)=>{this.realFs.close(r,this.makeCallback(o,a))})}closeSync(r){this.realFs.closeSync(r)}createReadStream(r,o){let a=r!==null?le.fromPortablePath(r):r;return this.realFs.createReadStream(a,o)}createWriteStream(r,o){let a=r!==null?le.fromPortablePath(r):r;return this.realFs.createWriteStream(a,o)}async realpathPromise(r){return await new Promise((o,a)=>{this.realFs.realpath(le.fromPortablePath(r),{},this.makeCallback(o,a))}).then(o=>le.toPortablePath(o))}realpathSync(r){return le.toPortablePath(this.realFs.realpathSync(le.fromPortablePath(r),{}))}async existsPromise(r){return await new Promise(o=>{this.realFs.exists(le.fromPortablePath(r),o)})}accessSync(r,o){return this.realFs.accessSync(le.fromPortablePath(r),o)}async accessPromise(r,o){return await new Promise((a,n)=>{this.realFs.access(le.fromPortablePath(r),o,this.makeCallback(a,n))})}existsSync(r){return this.realFs.existsSync(le.fromPortablePath(r))}async statPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.stat(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.stat(le.fromPortablePath(r),this.makeCallback(a,n))})}statSync(r,o){return o?this.realFs.statSync(le.fromPortablePath(r),o):this.realFs.statSync(le.fromPortablePath(r))}async fstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.fstat(r,o,this.makeCallback(a,n)):this.realFs.fstat(r,this.makeCallback(a,n))})}fstatSync(r,o){return o?this.realFs.fstatSync(r,o):this.realFs.fstatSync(r)}async lstatPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.lstat(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.lstat(le.fromPortablePath(r),this.makeCallback(a,n))})}lstatSync(r,o){return o?this.realFs.lstatSync(le.fromPortablePath(r),o):this.realFs.lstatSync(le.fromPortablePath(r))}async fchmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.fchmod(r,o,this.makeCallback(a,n))})}fchmodSync(r,o){return this.realFs.fchmodSync(r,o)}async chmodPromise(r,o){return await new Promise((a,n)=>{this.realFs.chmod(le.fromPortablePath(r),o,this.makeCallback(a,n))})}chmodSync(r,o){return this.realFs.chmodSync(le.fromPortablePath(r),o)}async fchownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.fchown(r,o,a,this.makeCallback(n,u))})}fchownSync(r,o,a){return this.realFs.fchownSync(r,o,a)}async chownPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.chown(le.fromPortablePath(r),o,a,this.makeCallback(n,u))})}chownSync(r,o,a){return this.realFs.chownSync(le.fromPortablePath(r),o,a)}async renamePromise(r,o){return await new Promise((a,n)=>{this.realFs.rename(le.fromPortablePath(r),le.fromPortablePath(o),this.makeCallback(a,n))})}renameSync(r,o){return this.realFs.renameSync(le.fromPortablePath(r),le.fromPortablePath(o))}async copyFilePromise(r,o,a=0){return await new Promise((n,u)=>{this.realFs.copyFile(le.fromPortablePath(r),le.fromPortablePath(o),a,this.makeCallback(n,u))})}copyFileSync(r,o,a=0){return this.realFs.copyFileSync(le.fromPortablePath(r),le.fromPortablePath(o),a)}async appendFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?le.fromPortablePath(r):r;a?this.realFs.appendFile(A,o,a,this.makeCallback(n,u)):this.realFs.appendFile(A,o,this.makeCallback(n,u))})}appendFileSync(r,o,a){let n=typeof r=="string"?le.fromPortablePath(r):r;a?this.realFs.appendFileSync(n,o,a):this.realFs.appendFileSync(n,o)}async writeFilePromise(r,o,a){return await new Promise((n,u)=>{let A=typeof r=="string"?le.fromPortablePath(r):r;a?this.realFs.writeFile(A,o,a,this.makeCallback(n,u)):this.realFs.writeFile(A,o,this.makeCallback(n,u))})}writeFileSync(r,o,a){let n=typeof r=="string"?le.fromPortablePath(r):r;a?this.realFs.writeFileSync(n,o,a):this.realFs.writeFileSync(n,o)}async unlinkPromise(r){return await new Promise((o,a)=>{this.realFs.unlink(le.fromPortablePath(r),this.makeCallback(o,a))})}unlinkSync(r){return this.realFs.unlinkSync(le.fromPortablePath(r))}async utimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.utimes(le.fromPortablePath(r),o,a,this.makeCallback(n,u))})}utimesSync(r,o,a){this.realFs.utimesSync(le.fromPortablePath(r),o,a)}async lutimesPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.lutimes(le.fromPortablePath(r),o,a,this.makeCallback(n,u))})}lutimesSync(r,o,a){this.realFs.lutimesSync(le.fromPortablePath(r),o,a)}async mkdirPromise(r,o){return await new Promise((a,n)=>{this.realFs.mkdir(le.fromPortablePath(r),o,this.makeCallback(a,n))})}mkdirSync(r,o){return this.realFs.mkdirSync(le.fromPortablePath(r),o)}async rmdirPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.rmdir(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.rmdir(le.fromPortablePath(r),this.makeCallback(a,n))})}rmdirSync(r,o){return this.realFs.rmdirSync(le.fromPortablePath(r),o)}async rmPromise(r,o){return await new Promise((a,n)=>{o?this.realFs.rm(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.rm(le.fromPortablePath(r),this.makeCallback(a,n))})}rmSync(r,o){return this.realFs.rmSync(le.fromPortablePath(r),o)}async linkPromise(r,o){return await new Promise((a,n)=>{this.realFs.link(le.fromPortablePath(r),le.fromPortablePath(o),this.makeCallback(a,n))})}linkSync(r,o){return this.realFs.linkSync(le.fromPortablePath(r),le.fromPortablePath(o))}async symlinkPromise(r,o,a){return await new Promise((n,u)=>{this.realFs.symlink(le.fromPortablePath(r.replace(/\/+$/,"")),le.fromPortablePath(o),a,this.makeCallback(n,u))})}symlinkSync(r,o,a){return this.realFs.symlinkSync(le.fromPortablePath(r.replace(/\/+$/,"")),le.fromPortablePath(o),a)}async readFilePromise(r,o){return await new Promise((a,n)=>{let u=typeof r=="string"?le.fromPortablePath(r):r;this.realFs.readFile(u,o,this.makeCallback(a,n))})}readFileSync(r,o){let a=typeof r=="string"?le.fromPortablePath(r):r;return this.realFs.readFileSync(a,o)}async readdirPromise(r,o){return await new Promise((a,n)=>{o?o.recursive&&process.platform==="win32"?o.withFileTypes?this.realFs.readdir(le.fromPortablePath(r),o,this.makeCallback(u=>a(u.map(G7)),n)):this.realFs.readdir(le.fromPortablePath(r),o,this.makeCallback(u=>a(u.map(le.toPortablePath)),n)):this.realFs.readdir(le.fromPortablePath(r),o,this.makeCallback(a,n)):this.realFs.readdir(le.fromPortablePath(r),this.makeCallback(a,n))})}readdirSync(r,o){return o?o.recursive&&process.platform==="win32"?o.withFileTypes?this.realFs.readdirSync(le.fromPortablePath(r),o).map(G7):this.realFs.readdirSync(le.fromPortablePath(r),o).map(le.toPortablePath):this.realFs.readdirSync(le.fromPortablePath(r),o):this.realFs.readdirSync(le.fromPortablePath(r))}async readlinkPromise(r){return await new Promise((o,a)=>{this.realFs.readlink(le.fromPortablePath(r),this.makeCallback(o,a))}).then(o=>le.toPortablePath(o))}readlinkSync(r){return le.toPortablePath(this.realFs.readlinkSync(le.fromPortablePath(r)))}async truncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.truncate(le.fromPortablePath(r),o,this.makeCallback(a,n))})}truncateSync(r,o){return this.realFs.truncateSync(le.fromPortablePath(r),o)}async ftruncatePromise(r,o){return await new Promise((a,n)=>{this.realFs.ftruncate(r,o,this.makeCallback(a,n))})}ftruncateSync(r,o){return this.realFs.ftruncateSync(r,o)}watch(r,o,a){return this.realFs.watch(le.fromPortablePath(r),o,a)}watchFile(r,o,a){return this.realFs.watchFile(le.fromPortablePath(r),o,a)}unwatchFile(r,o){return this.realFs.unwatchFile(le.fromPortablePath(r),o)}makeCallback(r,o){return(a,n)=>{a?o(a):r(n)}}}});var gn,Y7=Et(()=>{Gg();df();Ca();gn=class extends Ps{constructor(r,{baseFs:o=new Tn}={}){super(z);this.target=this.pathUtils.normalize(r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(r){return this.pathUtils.isAbsolute(r)?z.normalize(r):this.baseFs.resolve(z.join(this.target,r))}mapFromBase(r){return r}mapToBase(r){return this.pathUtils.isAbsolute(r)?r:this.pathUtils.join(this.target,r)}}});var W7,Hu,K7=Et(()=>{Gg();df();Ca();W7=Bt.root,Hu=class extends Ps{constructor(r,{baseFs:o=new Tn}={}){super(z);this.target=this.pathUtils.resolve(Bt.root,r),this.baseFs=o}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Bt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(r){let o=this.pathUtils.normalize(r);if(this.pathUtils.isAbsolute(r))return this.pathUtils.resolve(this.target,this.pathUtils.relative(W7,r));if(o.match(/^\.\.\/?/))throw new Error(`Resolving this path (${r}) would escape the jail`);return this.pathUtils.resolve(this.target,r)}mapFromBase(r){return this.pathUtils.resolve(W7,this.pathUtils.relative(this.target,r))}}});var iy,z7=Et(()=>{df();iy=class extends Ps{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var jg,wa,qp,V7=Et(()=>{jg=ve("fs");qg();Gg();YR();BD();Ca();wa=4278190080,qp=class extends Uu{constructor({baseFs:r=new Tn,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=jg.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:I}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=I,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(_g(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(_g(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&wa)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("read");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&wa)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("readSync");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="string"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("write");let[p,h]=A;return typeof o=="string"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&wa)!==this.magic)return typeof o=="string"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw Io("writeSync");let[p,h]=A;return typeof o=="string"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&wa)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Io("close");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&wa)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>"u")throw Io("closeSync");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=le.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fstat");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fstatSync");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fchmod");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&wa)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("fchmodSync");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Io("fchown");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&wa)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Io("fchownSync");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if((a&jg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&jg.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if((a&jg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&jg.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async rmPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,o),async(a,{subPath:n})=>await a.rmPromise(n,o))}rmSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,o),(a,{subPath:n})=>a.rmSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&wa)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("ftruncate");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&wa)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw Io("ftruncateSync");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>ny(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>Ug(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath==="/"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath==="/"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.lstatSync(o).mode&jg.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(Bt.root,r.substring(o.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[u,{childFs:A,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||A.hasOpenFileHandles?.())){if(o>=p){A.saveAndClose?.(),this.mountInstances.delete(u),n-=1;continue}else if(r===null||n<=0){a=p;break}A.saveAndClose?.(),this.mountInstances.delete(u),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await o(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await o(a)}finally{a.saveAndClose?.()}}}getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,o(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return o(a)}finally{a.saveAndClose?.()}}}}});var Zt,WR,Yw,J7=Et(()=>{qg();Ca();Zt=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),WR=class extends gf{constructor(){super(z)}getExtractHint(){throw Zt()}getRealPath(){throw Zt()}resolve(){throw Zt()}async openPromise(){throw Zt()}openSync(){throw Zt()}async opendirPromise(){throw Zt()}opendirSync(){throw Zt()}async readPromise(){throw Zt()}readSync(){throw Zt()}async writePromise(){throw Zt()}writeSync(){throw Zt()}async closePromise(){throw Zt()}closeSync(){throw Zt()}createWriteStream(){throw Zt()}createReadStream(){throw Zt()}async realpathPromise(){throw Zt()}realpathSync(){throw Zt()}async readdirPromise(){throw Zt()}readdirSync(){throw Zt()}async existsPromise(e){throw Zt()}existsSync(e){throw Zt()}async accessPromise(){throw Zt()}accessSync(){throw Zt()}async statPromise(){throw Zt()}statSync(){throw Zt()}async fstatPromise(e){throw Zt()}fstatSync(e){throw Zt()}async lstatPromise(e){throw Zt()}lstatSync(e){throw Zt()}async fchmodPromise(){throw Zt()}fchmodSync(){throw Zt()}async chmodPromise(){throw Zt()}chmodSync(){throw Zt()}async fchownPromise(){throw Zt()}fchownSync(){throw Zt()}async chownPromise(){throw Zt()}chownSync(){throw Zt()}async mkdirPromise(){throw Zt()}mkdirSync(){throw Zt()}async rmdirPromise(){throw Zt()}rmdirSync(){throw Zt()}async rmPromise(){throw Zt()}rmSync(){throw Zt()}async linkPromise(){throw Zt()}linkSync(){throw Zt()}async symlinkPromise(){throw Zt()}symlinkSync(){throw Zt()}async renamePromise(){throw Zt()}renameSync(){throw Zt()}async copyFilePromise(){throw Zt()}copyFileSync(){throw Zt()}async appendFilePromise(){throw Zt()}appendFileSync(){throw Zt()}async writeFilePromise(){throw Zt()}writeFileSync(){throw Zt()}async unlinkPromise(){throw Zt()}unlinkSync(){throw Zt()}async utimesPromise(){throw Zt()}utimesSync(){throw Zt()}async lutimesPromise(){throw Zt()}lutimesSync(){throw Zt()}async readFilePromise(){throw Zt()}readFileSync(){throw Zt()}async readlinkPromise(){throw Zt()}readlinkSync(){throw Zt()}async truncatePromise(){throw Zt()}truncateSync(){throw Zt()}async ftruncatePromise(e,r){throw Zt()}ftruncateSync(e,r){throw Zt()}watch(){throw Zt()}watchFile(){throw Zt()}unwatchFile(){throw Zt()}},Yw=WR;Yw.instance=new WR});var Gp,X7=Et(()=>{df();Ca();Gp=class extends Ps{constructor(r){super(le);this.baseFs=r}mapFromBase(r){return le.fromPortablePath(r)}mapToBase(r){return le.toPortablePath(r)}}});var k_e,KR,Q_e,mi,Z7=Et(()=>{Gg();df();Ca();k_e=/^[0-9]+$/,KR=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,Q_e=/^([^/]+-)?[a-f0-9]+$/,mi=class extends Ps{constructor({baseFs:r=new Tn}={}){super(z);this.baseFs=r}static makeVirtualPath(r,o,a){if(z.basename(r)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!z.basename(o).match(Q_e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let u=z.relative(z.dirname(r),a).split("/"),A=0;for(;A{zR=$e(ve("buffer")),$7=ve("url"),eY=ve("util");df();Ca();xD=class extends Ps{constructor(r){super(le);this.baseFs=r}mapFromBase(r){return r}mapToBase(r){if(typeof r=="string")return r;if(r instanceof URL)return(0,$7.fileURLToPath)(r);if(Buffer.isBuffer(r)){let o=r.toString();if(!F_e(r,o))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return o}throw new Error(`Unsupported path type: ${(0,eY.inspect)(r)}`)}}});var rY,Bo,mf,jp,kD,QD,sy,Lc,Nc,R_e,T_e,L_e,N_e,Ww,nY=Et(()=>{rY=ve("readline"),Bo=Symbol("kBaseFs"),mf=Symbol("kFd"),jp=Symbol("kClosePromise"),kD=Symbol("kCloseResolve"),QD=Symbol("kCloseReject"),sy=Symbol("kRefs"),Lc=Symbol("kRef"),Nc=Symbol("kUnref"),Ww=class{constructor(e,r){this[R_e]=1;this[T_e]=void 0;this[L_e]=void 0;this[N_e]=void 0;this[Bo]=r,this[mf]=e}get fd(){return this[mf]}async appendFile(e,r){try{this[Lc](this.appendFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Bo].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Nc]()}}async chown(e,r){try{return this[Lc](this.chown),await this[Bo].fchownPromise(this.fd,e,r)}finally{this[Nc]()}}async chmod(e){try{return this[Lc](this.chmod),await this[Bo].fchmodPromise(this.fd,e)}finally{this[Nc]()}}createReadStream(e){return this[Bo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Bo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,o,a){try{this[Lc](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??=0,o??=0,o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[Bo].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Nc]()}}async readFile(e){try{this[Lc](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[Bo].readFilePromise(this.fd,r)}finally{this[Nc]()}}readLines(e){return(0,rY.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Lc](this.stat),await this[Bo].fstatPromise(this.fd,e)}finally{this[Nc]()}}async truncate(e){try{return this[Lc](this.truncate),await this[Bo].ftruncatePromise(this.fd,e)}finally{this[Nc]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Lc](this.writeFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;await this[Bo].writeFilePromise(this.fd,e,o)}finally{this[Nc]()}}async write(...e){try{if(this[Lc](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Nc]()}}async writev(e,r){try{this[Lc](this.writev);let o=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Nc]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[mf]===-1)return Promise.resolve();if(this[jp])return this[jp];if(this[sy]--,this[sy]===0){let e=this[mf];this[mf]=-1,this[jp]=this[Bo].closePromise(e).finally(()=>{this[jp]=void 0})}else this[jp]=new Promise((e,r)=>{this[kD]=e,this[QD]=r}).finally(()=>{this[jp]=void 0,this[QD]=void 0,this[kD]=void 0});return this[jp]}[(Bo,mf,R_e=sy,T_e=jp,L_e=kD,N_e=QD,Lc)](e){if(this[mf]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[sy]++}[Nc](){if(this[sy]--,this[sy]===0){let e=this[mf];this[mf]=-1,this[Bo].closePromise(e).then(this[kD],this[QD])}}}});function Kw(t,e){e=new xD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?.[oy.promisify.custom]<"u"&&(n[oy.promisify.custom]=u[oy.promisify.custom])};{r(t,"exists",(o,...a)=>{let u=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,"read",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of iY){let a=o.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[o];if(typeof n>"u")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]=="function"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,"readSync",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of O_e){let a=o;if(typeof t[a]>"u")continue;let n=e[o];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of iY){let n=a.replace(/Promise$/,"");if(typeof o[n]>"u")continue;let u=e[a];typeof u>"u"||a!=="open"&&r(o,n,(A,...p)=>A instanceof Ww?A[n].apply(A,p):u.call(e,A,...p))}r(o,"open",async(...a)=>{let n=await e.openPromise(...a);return new Ww(n,e)})}t.read[oy.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[oy.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function FD(t,e){let r=Object.create(t);return Kw(r,e),r}var oy,O_e,iY,sY=Et(()=>{oy=ve("util");tY();nY();O_e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),iY=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function oY(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function aY(){if(VR)return VR;let t=le.toPortablePath(lY.default.tmpdir()),e=oe.realpathSync(t);return process.once("exit",()=>{oe.rmtempSync()}),VR={tmpdir:t,realTmpdir:e}}var lY,Oc,VR,oe,cY=Et(()=>{lY=$e(ve("os"));Gg();Ca();Oc=new Set,VR=null;oe=Object.assign(new Tn,{detachTemp(t){Oc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY("xfs-");try{this.mkdirSync(z.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=z.join(r,o);if(Oc.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Oc.has(a)){Oc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY("xfs-");try{await this.mkdirPromise(z.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=z.join(r,o);if(Oc.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Oc.has(a)){Oc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Oc.values()).map(async t=>{try{await oe.removePromise(t,{maxRetries:0}),Oc.delete(t)}catch{}}))},rmtempSync(){for(let t of Oc)try{oe.removeSync(t),Oc.delete(t)}catch{}}})});var zw={};zt(zw,{AliasFS:()=>_u,BasePortableFakeFS:()=>Uu,CustomDir:()=>jw,CwdFS:()=>gn,FakeFS:()=>gf,Filename:()=>dr,JailFS:()=>Hu,LazyFS:()=>iy,MountFS:()=>qp,NoFS:()=>Yw,NodeFS:()=>Tn,PortablePath:()=>Bt,PosixFS:()=>Gp,ProxiedFS:()=>Ps,VirtualFS:()=>mi,constants:()=>vi,errors:()=>tr,extendFs:()=>FD,normalizeLineEndings:()=>Hg,npath:()=>le,opendir:()=>SD,patchFs:()=>Kw,ppath:()=>z,setupCopyIndex:()=>PD,statUtils:()=>Ea,unwatchAllFiles:()=>_g,unwatchFile:()=>Ug,watchFile:()=>ny,xfs:()=>oe});var Pt=Et(()=>{k7();BD();HR();jR();N7();YR();qg();Ca();Ca();q7();qg();Y7();K7();z7();V7();J7();Gg();X7();df();Z7();sY();cY()});var hY=_((abt,pY)=>{pY.exports=fY;fY.sync=U_e;var uY=ve("fs");function M_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var o=0;o{yY.exports=dY;dY.sync=__e;var gY=ve("fs");function dY(t,e,r){gY.stat(t,function(o,a){r(o,o?!1:mY(a,e))})}function __e(t,e){return mY(gY.statSync(t),e)}function mY(t,e){return t.isFile()&&H_e(t,e)}function H_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=A|p,I=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return I}});var wY=_((ubt,CY)=>{var cbt=ve("fs"),RD;process.platform==="win32"||global.TESTING_WINDOWS?RD=hY():RD=EY();CY.exports=JR;JR.sync=q_e;function JR(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,a){JR(t,e||{},function(n,u){n?a(n):o(u)})})}RD(t,e||{},function(o,a){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function q_e(t,e){try{return RD.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var bY=_((Abt,SY)=>{var ay=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",IY=ve("path"),G_e=ay?";":":",BY=wY(),vY=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),DY=(t,e)=>{let r=e.colon||G_e,o=t.match(/\//)||ay&&t.match(/\\/)?[""]:[...ay?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=ay?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=ay?a.split(r):[""];return ay&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:a}},PY=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=DY(t,e),u=[],A=h=>new Promise((E,I)=>{if(h===o.length)return e.all&&u.length?E(u):I(vY(t));let v=o[h],x=/^".*"$/.test(v)?v.slice(1,-1):v,C=IY.join(x,t),R=!x&&/^\.[\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(R,h,0))}),p=(h,E,I)=>new Promise((v,x)=>{if(I===a.length)return v(A(E+1));let C=a[I];BY(h+C,{pathExt:n},(R,N)=>{if(!R&&N)if(e.all)u.push(h+C);else return v(h+C);return v(p(h,E,I+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},j_e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=DY(t,e),n=[];for(let u=0;u{"use strict";var xY=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};XR.exports=xY;XR.exports.default=xY});var TY=_((pbt,RY)=>{"use strict";var QY=ve("path"),Y_e=bY(),W_e=kY();function FY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=Y_e.sync(t.command,{path:r[W_e({env:r})],pathExt:e?QY.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=QY.resolve(a?t.options.cwd:"",u)),u}function K_e(t){return FY(t)||FY(t,!0)}RY.exports=K_e});var LY=_((hbt,$R)=>{"use strict";var ZR=/([()\][%!^"`<>&|;, *?])/g;function z_e(t){return t=t.replace(ZR,"^$1"),t}function V_e(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(ZR,"^$1"),e&&(t=t.replace(ZR,"^$1")),t}$R.exports.command=z_e;$R.exports.argument=V_e});var OY=_((gbt,NY)=>{"use strict";NY.exports=/^#!(.*)/});var UY=_((dbt,MY)=>{"use strict";var J_e=OY();MY.exports=(t="")=>{let e=t.match(J_e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?o:o?`${a} ${o}`:a}});var HY=_((mbt,_Y)=>{"use strict";var eT=ve("fs"),X_e=UY();function Z_e(t){let r=Buffer.alloc(150),o;try{o=eT.openSync(t,"r"),eT.readSync(o,r,0,150,0),eT.closeSync(o)}catch{}return X_e(r.toString())}_Y.exports=Z_e});var YY=_((ybt,jY)=>{"use strict";var $_e=ve("path"),qY=TY(),GY=LY(),e8e=HY(),t8e=process.platform==="win32",r8e=/\.(?:com|exe)$/i,n8e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function i8e(t){t.file=qY(t);let e=t.file&&e8e(t.file);return e?(t.args.unshift(t.file),t.command=e,qY(t)):t.file}function s8e(t){if(!t8e)return t;let e=i8e(t),r=!r8e.test(e);if(t.options.forceShell||r){let o=n8e.test(e);t.command=$_e.normalize(t.command),t.command=GY.command(t.command),t.args=t.args.map(n=>GY.argument(n,o));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function o8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:s8e(o)}jY.exports=o8e});var zY=_((Ebt,KY)=>{"use strict";var tT=process.platform==="win32";function rT(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function a8e(t,e){if(!tT)return;let r=t.emit;t.emit=function(o,a){if(o==="exit"){let n=WY(a,e,"spawn");if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function WY(t,e){return tT&&t===1&&!e.file?rT(e.original,"spawn"):null}function l8e(t,e){return tT&&t===1&&!e.file?rT(e.original,"spawnSync"):null}KY.exports={hookChildProcess:a8e,verifyENOENT:WY,verifyENOENTSync:l8e,notFoundError:rT}});var sT=_((Cbt,ly)=>{"use strict";var VY=ve("child_process"),nT=YY(),iT=zY();function JY(t,e,r){let o=nT(t,e,r),a=VY.spawn(o.command,o.args,o.options);return iT.hookChildProcess(a,o),a}function c8e(t,e,r){let o=nT(t,e,r),a=VY.spawnSync(o.command,o.args,o.options);return a.error=a.error||iT.verifyENOENTSync(a.status,o),a}ly.exports=JY;ly.exports.spawn=JY;ly.exports.sync=c8e;ly.exports._parse=nT;ly.exports._enoent=iT});var ZY=_((wbt,XY)=>{"use strict";function u8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Yg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Yg)}u8e(Yg,Error);Yg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I>",S=Br(">>",!1),y=">&",F=Br(">&",!1),J=">",X=Br(">",!1),Z="<<<",ie=Br("<<<",!1),be="<&",Le=Br("<&",!1),ot="<",dt=Br("<",!1),Gt=function(L){return{type:"argument",segments:[].concat(...L)}},$t=function(L){return L},bt="$'",an=Br("$'",!1),Qr="'",mr=Br("'",!1),br=function(L){return[{type:"text",text:L}]},Wr='""',Kn=Br('""',!1),Ls=function(){return{type:"text",text:""}},Ti='"',ps=Br('"',!1),io=function(L){return L},Si=function(L){return{type:"arithmetic",arithmetic:L,quoted:!0}},Ns=function(L){return{type:"shell",shell:L,quoted:!0}},so=function(L){return{type:"variable",...L,quoted:!0}},uc=function(L){return{type:"text",text:L}},uu=function(L){return{type:"arithmetic",arithmetic:L,quoted:!1}},cp=function(L){return{type:"shell",shell:L,quoted:!1}},up=function(L){return{type:"variable",...L,quoted:!1}},Os=function(L){return{type:"glob",pattern:L}},Dn=/^[^']/,oo=Cs(["'"],!0,!1),Ms=function(L){return L.join("")},yl=/^[^$"]/,El=Cs(["$",'"'],!0,!1),ao=`\\ +`,zn=Br(`\\ +`,!1),On=function(){return""},Li="\\",Mn=Br("\\",!1),_i=/^[\\$"`]/,rr=Cs(["\\","$",'"',"`"],!1,!1),Oe=function(L){return L},ii="\\a",Ua=Br("\\a",!1),hr=function(){return"a"},Ac="\\b",Au=Br("\\b",!1),fc=function(){return"\b"},Cl=/^[Ee]/,DA=Cs(["E","e"],!1,!1),fu=function(){return"\x1B"},Ce="\\f",Rt=Br("\\f",!1),pc=function(){return"\f"},Hi="\\n",pu=Br("\\n",!1),Yt=function(){return` +`},wl="\\r",PA=Br("\\r",!1),Ap=function(){return"\r"},hc="\\t",SA=Br("\\t",!1),Qn=function(){return" "},hi="\\v",gc=Br("\\v",!1),bA=function(){return"\v"},sa=/^[\\'"?]/,Ni=Cs(["\\","'",'"',"?"],!1,!1),_o=function(L){return String.fromCharCode(parseInt(L,16))},Ze="\\x",lo=Br("\\x",!1),dc="\\u",hu=Br("\\u",!1),qi="\\U",gu=Br("\\U",!1),xA=function(L){return String.fromCodePoint(parseInt(L,16))},Ha=/^[0-7]/,mc=Cs([["0","7"]],!1,!1),hs=/^[0-9a-fA-f]/,Ht=Cs([["0","9"],["a","f"],["A","f"]],!1,!1),Fn=Ag(),Ci="{}",oa=Br("{}",!1),co=function(){return"{}"},Us="-",aa=Br("-",!1),la="+",Ho=Br("+",!1),wi=".",gs=Br(".",!1),ds=function(L,K,re){return{type:"number",value:(L==="-"?-1:1)*parseFloat(K.join("")+"."+re.join(""))}},ms=function(L,K){return{type:"number",value:(L==="-"?-1:1)*parseInt(K.join(""))}},_s=function(L){return{type:"variable",...L}},Un=function(L){return{type:"variable",name:L}},Pn=function(L){return L},ys="*",We=Br("*",!1),tt="/",It=Br("/",!1),ir=function(L,K,re){return{type:K==="*"?"multiplication":"division",right:re}},$=function(L,K){return K.reduce((re,pe)=>({left:re,...pe}),L)},ye=function(L,K,re){return{type:K==="+"?"addition":"subtraction",right:re}},Ne="$((",pt=Br("$((",!1),ht="))",Tt=Br("))",!1),er=function(L){return L},$r="$(",Gi=Br("$(",!1),es=function(L){return L},bi="${",qo=Br("${",!1),kA=":-",QA=Br(":-",!1),fp=function(L,K){return{name:L,defaultValue:K}},sg=":-}",du=Br(":-}",!1),og=function(L){return{name:L,defaultValue:[]}},mu=":+",uo=Br(":+",!1),FA=function(L,K){return{name:L,alternativeValue:K}},yc=":+}",ca=Br(":+}",!1),ag=function(L){return{name:L,alternativeValue:[]}},Ec=function(L){return{name:L}},Sm="$",lg=Br("$",!1),ei=function(L){return e.isGlobPattern(L)},pp=function(L){return L},cg=/^[a-zA-Z0-9_]/,RA=Cs([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Hs=function(){return ug()},yu=/^[$@*?#a-zA-Z0-9_\-]/,qa=Cs(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),ji=/^[()}<>$|&; \t"']/,ua=Cs(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Eu=/^[<>&; \t"']/,Es=Cs(["<",">","&",";"," "," ",'"',"'"],!1,!1),Cc=/^[ \t]/,wc=Cs([" "," "],!1,!1),j=0,Dt=0,Il=[{line:1,column:1}],xi=0,Ic=[],ct=0,Cu;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function ug(){return t.substring(Dt,j)}function yw(){return Bc(Dt,j)}function TA(L,K){throw K=K!==void 0?K:Bc(Dt,j),hg([pg(L)],t.substring(Dt,j),K)}function hp(L,K){throw K=K!==void 0?K:Bc(Dt,j),bm(L,K)}function Br(L,K){return{type:"literal",text:L,ignoreCase:K}}function Cs(L,K,re){return{type:"class",parts:L,inverted:K,ignoreCase:re}}function Ag(){return{type:"any"}}function fg(){return{type:"end"}}function pg(L){return{type:"other",description:L}}function gp(L){var K=Il[L],re;if(K)return K;for(re=L-1;!Il[re];)re--;for(K=Il[re],K={line:K.line,column:K.column};rexi&&(xi=j,Ic=[]),Ic.push(L))}function bm(L,K){return new Yg(L,null,null,K)}function hg(L,K,re){return new Yg(Yg.buildMessage(L,K),L,K,re)}function gg(){var L,K,re;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(re=wu(),re===r&&(re=null),re!==r?(Dt=L,K=n(re),L=K):(j=L,L=r)):(j=L,L=r),L}function wu(){var L,K,re,pe,Je;if(L=j,K=Iu(),K!==r){for(re=[],pe=Qt();pe!==r;)re.push(pe),pe=Qt();re!==r?(pe=dg(),pe!==r?(Je=xm(),Je===r&&(Je=null),Je!==r?(Dt=L,K=u(K,pe,Je),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)}else j=L,L=r;if(L===r)if(L=j,K=Iu(),K!==r){for(re=[],pe=Qt();pe!==r;)re.push(pe),pe=Qt();re!==r?(pe=dg(),pe===r&&(pe=null),pe!==r?(Dt=L,K=A(K,pe),L=K):(j=L,L=r)):(j=L,L=r)}else j=L,L=r;return L}function xm(){var L,K,re,pe,Je;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=wu(),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();pe!==r?(Dt=L,K=p(re),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r;return L}function dg(){var L;return t.charCodeAt(j)===59?(L=h,j++):(L=r,ct===0&&Ct(E)),L===r&&(t.charCodeAt(j)===38?(L=I,j++):(L=r,ct===0&&Ct(v))),L}function Iu(){var L,K,re;return L=j,K=Aa(),K!==r?(re=Ew(),re===r&&(re=null),re!==r?(Dt=L,K=x(K,re),L=K):(j=L,L=r)):(j=L,L=r),L}function Ew(){var L,K,re,pe,Je,mt,fr;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=km(),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();if(pe!==r)if(Je=Iu(),Je!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=L,K=C(re,Je),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r;return L}function km(){var L;return t.substr(j,2)===R?(L=R,j+=2):(L=r,ct===0&&Ct(N)),L===r&&(t.substr(j,2)===U?(L=U,j+=2):(L=r,ct===0&&Ct(V))),L}function Aa(){var L,K,re;return L=j,K=mg(),K!==r?(re=vc(),re===r&&(re=null),re!==r?(Dt=L,K=te(K,re),L=K):(j=L,L=r)):(j=L,L=r),L}function vc(){var L,K,re,pe,Je,mt,fr;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=Bl(),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();if(pe!==r)if(Je=Aa(),Je!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=L,K=ae(re,Je),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r;return L}function Bl(){var L;return t.substr(j,2)===fe?(L=fe,j+=2):(L=r,ct===0&&Ct(ue)),L===r&&(t.charCodeAt(j)===124?(L=me,j++):(L=r,ct===0&&Ct(he))),L}function Bu(){var L,K,re,pe,Je,mt;if(L=j,K=wg(),K!==r)if(t.charCodeAt(j)===61?(re=Be,j++):(re=r,ct===0&&Ct(we)),re!==r)if(pe=Go(),pe!==r){for(Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();Je!==r?(Dt=L,K=g(K,pe),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r;else j=L,L=r;if(L===r)if(L=j,K=wg(),K!==r)if(t.charCodeAt(j)===61?(re=Be,j++):(re=r,ct===0&&Ct(we)),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();pe!==r?(Dt=L,K=Ee(K),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r;return L}function mg(){var L,K,re,pe,Je,mt,fr,Cr,yn,oi,Oi;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(t.charCodeAt(j)===40?(re=Pe,j++):(re=r,ct===0&&Ct(ce)),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();if(pe!==r)if(Je=wu(),Je!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(j)===41?(fr=ne,j++):(fr=r,ct===0&&Ct(ee)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=Ga();oi!==r;)yn.push(oi),oi=Ga();if(yn!==r){for(oi=[],Oi=Qt();Oi!==r;)oi.push(Oi),Oi=Qt();oi!==r?(Dt=L,K=Ie(Je,yn),L=K):(j=L,L=r)}else j=L,L=r}else j=L,L=r}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r;if(L===r){for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(t.charCodeAt(j)===123?(re=Fe,j++):(re=r,ct===0&&Ct(At)),re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();if(pe!==r)if(Je=wu(),Je!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(j)===125?(fr=H,j++):(fr=r,ct===0&&Ct(at)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=Ga();oi!==r;)yn.push(oi),oi=Ga();if(yn!==r){for(oi=[],Oi=Qt();Oi!==r;)oi.push(Oi),Oi=Qt();oi!==r?(Dt=L,K=Re(Je,yn),L=K):(j=L,L=r)}else j=L,L=r}else j=L,L=r}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r}else j=L,L=r;else j=L,L=r;if(L===r){for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){for(re=[],pe=Bu();pe!==r;)re.push(pe),pe=Bu();if(re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();if(pe!==r){if(Je=[],mt=dp(),mt!==r)for(;mt!==r;)Je.push(mt),mt=dp();else Je=r;if(Je!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=L,K=ke(re,Je),L=K):(j=L,L=r)}else j=L,L=r}else j=L,L=r}else j=L,L=r}else j=L,L=r;if(L===r){for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){if(re=[],pe=Bu(),pe!==r)for(;pe!==r;)re.push(pe),pe=Bu();else re=r;if(re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();pe!==r?(Dt=L,K=xe(re),L=K):(j=L,L=r)}else j=L,L=r}else j=L,L=r}}}return L}function LA(){var L,K,re,pe,Je;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){if(re=[],pe=mp(),pe!==r)for(;pe!==r;)re.push(pe),pe=mp();else re=r;if(re!==r){for(pe=[],Je=Qt();Je!==r;)pe.push(Je),Je=Qt();pe!==r?(Dt=L,K=He(re),L=K):(j=L,L=r)}else j=L,L=r}else j=L,L=r;return L}function dp(){var L,K,re;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r?(re=Ga(),re!==r?(Dt=L,K=Te(re),L=K):(j=L,L=r)):(j=L,L=r),L===r){for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();K!==r?(re=mp(),re!==r?(Dt=L,K=Te(re),L=K):(j=L,L=r)):(j=L,L=r)}return L}function Ga(){var L,K,re,pe,Je;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(Ve.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(qe)),re===r&&(re=null),re!==r?(pe=yg(),pe!==r?(Je=mp(),Je!==r?(Dt=L,K=b(re,pe,Je),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L}function yg(){var L;return t.substr(j,2)===w?(L=w,j+=2):(L=r,ct===0&&Ct(S)),L===r&&(t.substr(j,2)===y?(L=y,j+=2):(L=r,ct===0&&Ct(F)),L===r&&(t.charCodeAt(j)===62?(L=J,j++):(L=r,ct===0&&Ct(X)),L===r&&(t.substr(j,3)===Z?(L=Z,j+=3):(L=r,ct===0&&Ct(ie)),L===r&&(t.substr(j,2)===be?(L=be,j+=2):(L=r,ct===0&&Ct(Le)),L===r&&(t.charCodeAt(j)===60?(L=ot,j++):(L=r,ct===0&&Ct(dt))))))),L}function mp(){var L,K,re;for(L=j,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(re=Go(),re!==r?(Dt=L,K=Te(re),L=K):(j=L,L=r)):(j=L,L=r),L}function Go(){var L,K,re;if(L=j,K=[],re=ws(),re!==r)for(;re!==r;)K.push(re),re=ws();else K=r;return K!==r&&(Dt=L,K=Gt(K)),L=K,L}function ws(){var L,K;return L=j,K=Ii(),K!==r&&(Dt=L,K=$t(K)),L=K,L===r&&(L=j,K=Qm(),K!==r&&(Dt=L,K=$t(K)),L=K,L===r&&(L=j,K=Fm(),K!==r&&(Dt=L,K=$t(K)),L=K,L===r&&(L=j,K=jo(),K!==r&&(Dt=L,K=$t(K)),L=K))),L}function Ii(){var L,K,re,pe;return L=j,t.substr(j,2)===bt?(K=bt,j+=2):(K=r,ct===0&&Ct(an)),K!==r?(re=ln(),re!==r?(t.charCodeAt(j)===39?(pe=Qr,j++):(pe=r,ct===0&&Ct(mr)),pe!==r?(Dt=L,K=br(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L}function Qm(){var L,K,re,pe;return L=j,t.charCodeAt(j)===39?(K=Qr,j++):(K=r,ct===0&&Ct(mr)),K!==r?(re=Ep(),re!==r?(t.charCodeAt(j)===39?(pe=Qr,j++):(pe=r,ct===0&&Ct(mr)),pe!==r?(Dt=L,K=br(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L}function Fm(){var L,K,re,pe;if(L=j,t.substr(j,2)===Wr?(K=Wr,j+=2):(K=r,ct===0&&Ct(Kn)),K!==r&&(Dt=L,K=Ls()),L=K,L===r)if(L=j,t.charCodeAt(j)===34?(K=Ti,j++):(K=r,ct===0&&Ct(ps)),K!==r){for(re=[],pe=NA();pe!==r;)re.push(pe),pe=NA();re!==r?(t.charCodeAt(j)===34?(pe=Ti,j++):(pe=r,ct===0&&Ct(ps)),pe!==r?(Dt=L,K=io(re),L=K):(j=L,L=r)):(j=L,L=r)}else j=L,L=r;return L}function jo(){var L,K,re;if(L=j,K=[],re=yp(),re!==r)for(;re!==r;)K.push(re),re=yp();else K=r;return K!==r&&(Dt=L,K=io(K)),L=K,L}function NA(){var L,K;return L=j,K=jr(),K!==r&&(Dt=L,K=Si(K)),L=K,L===r&&(L=j,K=Cp(),K!==r&&(Dt=L,K=Ns(K)),L=K,L===r&&(L=j,K=Pc(),K!==r&&(Dt=L,K=so(K)),L=K,L===r&&(L=j,K=Eg(),K!==r&&(Dt=L,K=uc(K)),L=K))),L}function yp(){var L,K;return L=j,K=jr(),K!==r&&(Dt=L,K=uu(K)),L=K,L===r&&(L=j,K=Cp(),K!==r&&(Dt=L,K=cp(K)),L=K,L===r&&(L=j,K=Pc(),K!==r&&(Dt=L,K=up(K)),L=K,L===r&&(L=j,K=Cw(),K!==r&&(Dt=L,K=Os(K)),L=K,L===r&&(L=j,K=pa(),K!==r&&(Dt=L,K=uc(K)),L=K)))),L}function Ep(){var L,K,re;for(L=j,K=[],Dn.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(oo));re!==r;)K.push(re),Dn.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(oo));return K!==r&&(Dt=L,K=Ms(K)),L=K,L}function Eg(){var L,K,re;if(L=j,K=[],re=fa(),re===r&&(yl.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(El))),re!==r)for(;re!==r;)K.push(re),re=fa(),re===r&&(yl.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(El)));else K=r;return K!==r&&(Dt=L,K=Ms(K)),L=K,L}function fa(){var L,K,re;return L=j,t.substr(j,2)===ao?(K=ao,j+=2):(K=r,ct===0&&Ct(zn)),K!==r&&(Dt=L,K=On()),L=K,L===r&&(L=j,t.charCodeAt(j)===92?(K=Li,j++):(K=r,ct===0&&Ct(Mn)),K!==r?(_i.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(rr)),re!==r?(Dt=L,K=Oe(re),L=K):(j=L,L=r)):(j=L,L=r)),L}function ln(){var L,K,re;for(L=j,K=[],re=Ao(),re===r&&(Dn.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(oo)));re!==r;)K.push(re),re=Ao(),re===r&&(Dn.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(oo)));return K!==r&&(Dt=L,K=Ms(K)),L=K,L}function Ao(){var L,K,re;return L=j,t.substr(j,2)===ii?(K=ii,j+=2):(K=r,ct===0&&Ct(Ua)),K!==r&&(Dt=L,K=hr()),L=K,L===r&&(L=j,t.substr(j,2)===Ac?(K=Ac,j+=2):(K=r,ct===0&&Ct(Au)),K!==r&&(Dt=L,K=fc()),L=K,L===r&&(L=j,t.charCodeAt(j)===92?(K=Li,j++):(K=r,ct===0&&Ct(Mn)),K!==r?(Cl.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(DA)),re!==r?(Dt=L,K=fu(),L=K):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===Ce?(K=Ce,j+=2):(K=r,ct===0&&Ct(Rt)),K!==r&&(Dt=L,K=pc()),L=K,L===r&&(L=j,t.substr(j,2)===Hi?(K=Hi,j+=2):(K=r,ct===0&&Ct(pu)),K!==r&&(Dt=L,K=Yt()),L=K,L===r&&(L=j,t.substr(j,2)===wl?(K=wl,j+=2):(K=r,ct===0&&Ct(PA)),K!==r&&(Dt=L,K=Ap()),L=K,L===r&&(L=j,t.substr(j,2)===hc?(K=hc,j+=2):(K=r,ct===0&&Ct(SA)),K!==r&&(Dt=L,K=Qn()),L=K,L===r&&(L=j,t.substr(j,2)===hi?(K=hi,j+=2):(K=r,ct===0&&Ct(gc)),K!==r&&(Dt=L,K=bA()),L=K,L===r&&(L=j,t.charCodeAt(j)===92?(K=Li,j++):(K=r,ct===0&&Ct(Mn)),K!==r?(sa.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(Ni)),re!==r?(Dt=L,K=Oe(re),L=K):(j=L,L=r)):(j=L,L=r),L===r&&(L=OA()))))))))),L}function OA(){var L,K,re,pe,Je,mt,fr,Cr,yn,oi,Oi,Bg;return L=j,t.charCodeAt(j)===92?(K=Li,j++):(K=r,ct===0&&Ct(Mn)),K!==r?(re=ja(),re!==r?(Dt=L,K=_o(re),L=K):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===Ze?(K=Ze,j+=2):(K=r,ct===0&&Ct(lo)),K!==r?(re=j,pe=j,Je=ja(),Je!==r?(mt=si(),mt!==r?(Je=[Je,mt],pe=Je):(j=pe,pe=r)):(j=pe,pe=r),pe===r&&(pe=ja()),pe!==r?re=t.substring(re,j):re=pe,re!==r?(Dt=L,K=_o(re),L=K):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===dc?(K=dc,j+=2):(K=r,ct===0&&Ct(hu)),K!==r?(re=j,pe=j,Je=si(),Je!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(Je=[Je,mt,fr,Cr],pe=Je):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r),pe!==r?re=t.substring(re,j):re=pe,re!==r?(Dt=L,K=_o(re),L=K):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===qi?(K=qi,j+=2):(K=r,ct===0&&Ct(gu)),K!==r?(re=j,pe=j,Je=si(),Je!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(yn=si(),yn!==r?(oi=si(),oi!==r?(Oi=si(),Oi!==r?(Bg=si(),Bg!==r?(Je=[Je,mt,fr,Cr,yn,oi,Oi,Bg],pe=Je):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r)):(j=pe,pe=r),pe!==r?re=t.substring(re,j):re=pe,re!==r?(Dt=L,K=xA(re),L=K):(j=L,L=r)):(j=L,L=r)))),L}function ja(){var L;return Ha.test(t.charAt(j))?(L=t.charAt(j),j++):(L=r,ct===0&&Ct(mc)),L}function si(){var L;return hs.test(t.charAt(j))?(L=t.charAt(j),j++):(L=r,ct===0&&Ct(Ht)),L}function pa(){var L,K,re,pe,Je;if(L=j,K=[],re=j,t.charCodeAt(j)===92?(pe=Li,j++):(pe=r,ct===0&&Ct(Mn)),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r),re===r&&(re=j,t.substr(j,2)===Ci?(pe=Ci,j+=2):(pe=r,ct===0&&Ct(oa)),pe!==r&&(Dt=re,pe=co()),re=pe,re===r&&(re=j,pe=j,ct++,Je=Rm(),ct--,Je===r?pe=void 0:(j=pe,pe=r),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=j,t.charCodeAt(j)===92?(pe=Li,j++):(pe=r,ct===0&&Ct(Mn)),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r),re===r&&(re=j,t.substr(j,2)===Ci?(pe=Ci,j+=2):(pe=r,ct===0&&Ct(oa)),pe!==r&&(Dt=re,pe=co()),re=pe,re===r&&(re=j,pe=j,ct++,Je=Rm(),ct--,Je===r?pe=void 0:(j=pe,pe=r),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r)));else K=r;return K!==r&&(Dt=L,K=Ms(K)),L=K,L}function Dc(){var L,K,re,pe,Je,mt;if(L=j,t.charCodeAt(j)===45?(K=Us,j++):(K=r,ct===0&&Ct(aa)),K===r&&(t.charCodeAt(j)===43?(K=la,j++):(K=r,ct===0&&Ct(Ho))),K===r&&(K=null),K!==r){if(re=[],Ve.test(t.charAt(j))?(pe=t.charAt(j),j++):(pe=r,ct===0&&Ct(qe)),pe!==r)for(;pe!==r;)re.push(pe),Ve.test(t.charAt(j))?(pe=t.charAt(j),j++):(pe=r,ct===0&&Ct(qe));else re=r;if(re!==r)if(t.charCodeAt(j)===46?(pe=wi,j++):(pe=r,ct===0&&Ct(gs)),pe!==r){if(Je=[],Ve.test(t.charAt(j))?(mt=t.charAt(j),j++):(mt=r,ct===0&&Ct(qe)),mt!==r)for(;mt!==r;)Je.push(mt),Ve.test(t.charAt(j))?(mt=t.charAt(j),j++):(mt=r,ct===0&&Ct(qe));else Je=r;Je!==r?(Dt=L,K=ds(K,re,Je),L=K):(j=L,L=r)}else j=L,L=r;else j=L,L=r}else j=L,L=r;if(L===r){if(L=j,t.charCodeAt(j)===45?(K=Us,j++):(K=r,ct===0&&Ct(aa)),K===r&&(t.charCodeAt(j)===43?(K=la,j++):(K=r,ct===0&&Ct(Ho))),K===r&&(K=null),K!==r){if(re=[],Ve.test(t.charAt(j))?(pe=t.charAt(j),j++):(pe=r,ct===0&&Ct(qe)),pe!==r)for(;pe!==r;)re.push(pe),Ve.test(t.charAt(j))?(pe=t.charAt(j),j++):(pe=r,ct===0&&Ct(qe));else re=r;re!==r?(Dt=L,K=ms(K,re),L=K):(j=L,L=r)}else j=L,L=r;if(L===r&&(L=j,K=Pc(),K!==r&&(Dt=L,K=_s(K)),L=K,L===r&&(L=j,K=Ya(),K!==r&&(Dt=L,K=Un(K)),L=K,L===r)))if(L=j,t.charCodeAt(j)===40?(K=Pe,j++):(K=r,ct===0&&Ct(ce)),K!==r){for(re=[],pe=Qt();pe!==r;)re.push(pe),pe=Qt();if(re!==r)if(pe=ts(),pe!==r){for(Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();Je!==r?(t.charCodeAt(j)===41?(mt=ne,j++):(mt=r,ct===0&&Ct(ee)),mt!==r?(Dt=L,K=Pn(pe),L=K):(j=L,L=r)):(j=L,L=r)}else j=L,L=r;else j=L,L=r}else j=L,L=r}return L}function vl(){var L,K,re,pe,Je,mt,fr,Cr;if(L=j,K=Dc(),K!==r){for(re=[],pe=j,Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();if(Je!==r)if(t.charCodeAt(j)===42?(mt=ys,j++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(j)===47?(mt=tt,j++):(mt=r,ct===0&&Ct(It))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Dc(),Cr!==r?(Dt=pe,Je=ir(K,mt,Cr),pe=Je):(j=pe,pe=r)):(j=pe,pe=r)}else j=pe,pe=r;else j=pe,pe=r;for(;pe!==r;){for(re.push(pe),pe=j,Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();if(Je!==r)if(t.charCodeAt(j)===42?(mt=ys,j++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(j)===47?(mt=tt,j++):(mt=r,ct===0&&Ct(It))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Dc(),Cr!==r?(Dt=pe,Je=ir(K,mt,Cr),pe=Je):(j=pe,pe=r)):(j=pe,pe=r)}else j=pe,pe=r;else j=pe,pe=r}re!==r?(Dt=L,K=$(K,re),L=K):(j=L,L=r)}else j=L,L=r;return L}function ts(){var L,K,re,pe,Je,mt,fr,Cr;if(L=j,K=vl(),K!==r){for(re=[],pe=j,Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();if(Je!==r)if(t.charCodeAt(j)===43?(mt=la,j++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(j)===45?(mt=Us,j++):(mt=r,ct===0&&Ct(aa))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=vl(),Cr!==r?(Dt=pe,Je=ye(K,mt,Cr),pe=Je):(j=pe,pe=r)):(j=pe,pe=r)}else j=pe,pe=r;else j=pe,pe=r;for(;pe!==r;){for(re.push(pe),pe=j,Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();if(Je!==r)if(t.charCodeAt(j)===43?(mt=la,j++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(j)===45?(mt=Us,j++):(mt=r,ct===0&&Ct(aa))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=vl(),Cr!==r?(Dt=pe,Je=ye(K,mt,Cr),pe=Je):(j=pe,pe=r)):(j=pe,pe=r)}else j=pe,pe=r;else j=pe,pe=r}re!==r?(Dt=L,K=$(K,re),L=K):(j=L,L=r)}else j=L,L=r;return L}function jr(){var L,K,re,pe,Je,mt;if(L=j,t.substr(j,3)===Ne?(K=Ne,j+=3):(K=r,ct===0&&Ct(pt)),K!==r){for(re=[],pe=Qt();pe!==r;)re.push(pe),pe=Qt();if(re!==r)if(pe=ts(),pe!==r){for(Je=[],mt=Qt();mt!==r;)Je.push(mt),mt=Qt();Je!==r?(t.substr(j,2)===ht?(mt=ht,j+=2):(mt=r,ct===0&&Ct(Tt)),mt!==r?(Dt=L,K=er(pe),L=K):(j=L,L=r)):(j=L,L=r)}else j=L,L=r;else j=L,L=r}else j=L,L=r;return L}function Cp(){var L,K,re,pe;return L=j,t.substr(j,2)===$r?(K=$r,j+=2):(K=r,ct===0&&Ct(Gi)),K!==r?(re=wu(),re!==r?(t.charCodeAt(j)===41?(pe=ne,j++):(pe=r,ct===0&&Ct(ee)),pe!==r?(Dt=L,K=es(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L}function Pc(){var L,K,re,pe,Je,mt;return L=j,t.substr(j,2)===bi?(K=bi,j+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Ya(),re!==r?(t.substr(j,2)===kA?(pe=kA,j+=2):(pe=r,ct===0&&Ct(QA)),pe!==r?(Je=LA(),Je!==r?(t.charCodeAt(j)===125?(mt=H,j++):(mt=r,ct===0&&Ct(at)),mt!==r?(Dt=L,K=fp(re,Je),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===bi?(K=bi,j+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Ya(),re!==r?(t.substr(j,3)===sg?(pe=sg,j+=3):(pe=r,ct===0&&Ct(du)),pe!==r?(Dt=L,K=og(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===bi?(K=bi,j+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Ya(),re!==r?(t.substr(j,2)===mu?(pe=mu,j+=2):(pe=r,ct===0&&Ct(uo)),pe!==r?(Je=LA(),Je!==r?(t.charCodeAt(j)===125?(mt=H,j++):(mt=r,ct===0&&Ct(at)),mt!==r?(Dt=L,K=FA(re,Je),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===bi?(K=bi,j+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Ya(),re!==r?(t.substr(j,3)===yc?(pe=yc,j+=3):(pe=r,ct===0&&Ct(ca)),pe!==r?(Dt=L,K=ag(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.substr(j,2)===bi?(K=bi,j+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Ya(),re!==r?(t.charCodeAt(j)===125?(pe=H,j++):(pe=r,ct===0&&Ct(at)),pe!==r?(Dt=L,K=Ec(re),L=K):(j=L,L=r)):(j=L,L=r)):(j=L,L=r),L===r&&(L=j,t.charCodeAt(j)===36?(K=Sm,j++):(K=r,ct===0&&Ct(lg)),K!==r?(re=Ya(),re!==r?(Dt=L,K=Ec(re),L=K):(j=L,L=r)):(j=L,L=r)))))),L}function Cw(){var L,K,re;return L=j,K=Cg(),K!==r?(Dt=j,re=ei(K),re?re=void 0:re=r,re!==r?(Dt=L,K=pp(K),L=K):(j=L,L=r)):(j=L,L=r),L}function Cg(){var L,K,re,pe,Je;if(L=j,K=[],re=j,pe=j,ct++,Je=Ig(),ct--,Je===r?pe=void 0:(j=pe,pe=r),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r),re!==r)for(;re!==r;)K.push(re),re=j,pe=j,ct++,Je=Ig(),ct--,Je===r?pe=void 0:(j=pe,pe=r),pe!==r?(t.length>j?(Je=t.charAt(j),j++):(Je=r,ct===0&&Ct(Fn)),Je!==r?(Dt=re,pe=Oe(Je),re=pe):(j=re,re=r)):(j=re,re=r);else K=r;return K!==r&&(Dt=L,K=Ms(K)),L=K,L}function wg(){var L,K,re;if(L=j,K=[],cg.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(RA)),re!==r)for(;re!==r;)K.push(re),cg.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(RA));else K=r;return K!==r&&(Dt=L,K=Hs()),L=K,L}function Ya(){var L,K,re;if(L=j,K=[],yu.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(qa)),re!==r)for(;re!==r;)K.push(re),yu.test(t.charAt(j))?(re=t.charAt(j),j++):(re=r,ct===0&&Ct(qa));else K=r;return K!==r&&(Dt=L,K=Hs()),L=K,L}function Rm(){var L;return ji.test(t.charAt(j))?(L=t.charAt(j),j++):(L=r,ct===0&&Ct(ua)),L}function Ig(){var L;return Eu.test(t.charAt(j))?(L=t.charAt(j),j++):(L=r,ct===0&&Ct(Es)),L}function Qt(){var L,K;if(L=[],Cc.test(t.charAt(j))?(K=t.charAt(j),j++):(K=r,ct===0&&Ct(wc)),K!==r)for(;K!==r;)L.push(K),Cc.test(t.charAt(j))?(K=t.charAt(j),j++):(K=r,ct===0&&Ct(wc));else L=r;return L}if(Cu=a(),Cu!==r&&j===t.length)return Cu;throw Cu!==r&&j!1}){try{return(0,$Y.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function cy(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${ND(r)}${o===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function ND(t){return`${uy(t.chain)}${t.then?` ${oT(t.then)}`:""}`}function oT(t){return`${t.type} ${ND(t.line)}`}function uy(t){return`${lT(t)}${t.then?` ${aT(t.then)}`:""}`}function aT(t){return`${t.type} ${uy(t.chain)}`}function lT(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>TD(e)).join(" ")} `:""}${t.args.map(e=>cT(e)).join(" ")}`;case"subshell":return`(${cy(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Vw(e)).join(" ")}`:""}`;case"group":return`{ ${cy(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Vw(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>TD(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function TD(t){return`${t.name}=${t.args[0]?Wg(t.args[0]):""}`}function cT(t){switch(t.type){case"redirection":return Vw(t);case"argument":return Wg(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Vw(t){return`${t.subtype} ${t.args.map(e=>Wg(e)).join(" ")}`}function Wg(t){return t.segments.map(e=>uT(e)).join("")}function uT(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<>$|&;"'\n\t ]/)?o.match(/['\t\p{C}]/u)?o.match(/'/)?`"${o.replace(/["$\t\p{C}]/u,p8e)}"`:`$'${o.replace(/[\t\p{C}]/u,tW)}'`:`'${o}'`:o;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${cy(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(o=>Wg(o)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(o=>Wg(o)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${OD(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function OD(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(OD(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var $Y,eW,f8e,tW,p8e,rW=Et(()=>{$Y=$e(ZY());eW=new Map([["\f","\\f"],[` +`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),f8e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(eW,([t,e])=>[t,`"$'${e}'"`])]),tW=t=>eW.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,p8e=t=>f8e.get(t)??`"$'${tW(t)}'"`});var iW=_((Lbt,nW)=>{"use strict";function h8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Kg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Kg)}h8e(Kg,Error);Kg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;Ife&&(fe=V,ue=[]),ue.push(qe))}function at(qe,b){return new Kg(qe,null,null,b)}function Re(qe,b,w){return new Kg(Kg.buildMessage(qe,b),qe,b,w)}function ke(){var qe,b,w,S;return qe=V,b=xe(),b!==r?(t.charCodeAt(V)===47?(w=n,V++):(w=r,me===0&&H(u)),w!==r?(S=xe(),S!==r?(te=qe,b=A(b,S),qe=b):(V=qe,qe=r)):(V=qe,qe=r)):(V=qe,qe=r),qe===r&&(qe=V,b=xe(),b!==r&&(te=qe,b=p(b)),qe=b),qe}function xe(){var qe,b,w,S;return qe=V,b=He(),b!==r?(t.charCodeAt(V)===64?(w=h,V++):(w=r,me===0&&H(E)),w!==r?(S=Ve(),S!==r?(te=qe,b=I(b,S),qe=b):(V=qe,qe=r)):(V=qe,qe=r)):(V=qe,qe=r),qe===r&&(qe=V,b=He(),b!==r&&(te=qe,b=v(b)),qe=b),qe}function He(){var qe,b,w,S,y;return qe=V,t.charCodeAt(V)===64?(b=h,V++):(b=r,me===0&&H(E)),b!==r?(w=Te(),w!==r?(t.charCodeAt(V)===47?(S=n,V++):(S=r,me===0&&H(u)),S!==r?(y=Te(),y!==r?(te=qe,b=x(),qe=b):(V=qe,qe=r)):(V=qe,qe=r)):(V=qe,qe=r)):(V=qe,qe=r),qe===r&&(qe=V,b=Te(),b!==r&&(te=qe,b=x()),qe=b),qe}function Te(){var qe,b,w;if(qe=V,b=[],C.test(t.charAt(V))?(w=t.charAt(V),V++):(w=r,me===0&&H(R)),w!==r)for(;w!==r;)b.push(w),C.test(t.charAt(V))?(w=t.charAt(V),V++):(w=r,me===0&&H(R));else b=r;return b!==r&&(te=qe,b=x()),qe=b,qe}function Ve(){var qe,b,w;if(qe=V,b=[],N.test(t.charAt(V))?(w=t.charAt(V),V++):(w=r,me===0&&H(U)),w!==r)for(;w!==r;)b.push(w),N.test(t.charAt(V))?(w=t.charAt(V),V++):(w=r,me===0&&H(U));else b=r;return b!==r&&(te=qe,b=x()),qe=b,qe}if(he=a(),he!==r&&V===t.length)return he;throw he!==r&&V{sW=$e(iW())});var Vg=_((Obt,zg)=>{"use strict";function aW(t){return typeof t>"u"||t===null}function d8e(t){return typeof t=="object"&&t!==null}function m8e(t){return Array.isArray(t)?t:aW(t)?[]:[t]}function y8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r{"use strict";function Jw(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Jw.prototype=Object.create(Error.prototype);Jw.prototype.constructor=Jw;Jw.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};lW.exports=Jw});var AW=_((Ubt,uW)=>{"use strict";var cW=Vg();function AT(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}AT.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o="",a=this.position;a>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=" ... ",a+=5;break}for(n="",u=this.position;ur/2-1){n=" ... ",u-=5;break}return A=this.buffer.slice(a,u),cW.repeat(" ",e)+o+A+n+` +`+cW.repeat(" ",e+this.position-a+o.length)+"^"};AT.prototype.toString=function(e){var r,o="";return this.name&&(o+='in "'+this.name+'" '),o+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`: +`+r)),o};uW.exports=AT});var os=_((_bt,pW)=>{"use strict";var fW=Ay(),w8e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],I8e=["scalar","sequence","mapping"];function B8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function v8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(w8e.indexOf(r)===-1)throw new fW('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=B8e(e.styleAliases||null),I8e.indexOf(this.kind)===-1)throw new fW('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}pW.exports=v8e});var Jg=_((Hbt,gW)=>{"use strict";var hW=Vg(),_D=Ay(),D8e=os();function fT(t,e,r){var o=[];return t.include.forEach(function(a){r=fT(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function P8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var S8e=os();dW.exports=new S8e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var EW=_((Gbt,yW)=>{"use strict";var b8e=os();yW.exports=new b8e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var wW=_((jbt,CW)=>{"use strict";var x8e=os();CW.exports=new x8e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var HD=_((Ybt,IW)=>{"use strict";var k8e=Jg();IW.exports=new k8e({explicit:[mW(),EW(),wW()]})});var vW=_((Wbt,BW)=>{"use strict";var Q8e=os();function F8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function R8e(){return null}function T8e(t){return t===null}BW.exports=new Q8e("tag:yaml.org,2002:null",{kind:"scalar",resolve:F8e,construct:R8e,predicate:T8e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var PW=_((Kbt,DW)=>{"use strict";var L8e=os();function N8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function O8e(t){return t==="true"||t==="True"||t==="TRUE"}function M8e(t){return Object.prototype.toString.call(t)==="[object Boolean]"}DW.exports=new L8e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:N8e,construct:O8e,predicate:M8e,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var bW=_((zbt,SW)=>{"use strict";var U8e=Vg(),_8e=os();function H8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function q8e(t){return 48<=t&&t<=55}function G8e(t){return 48<=t&&t<=57}function j8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var QW=_((Vbt,kW)=>{"use strict";var xW=Vg(),K8e=os(),z8e=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))$");function V8e(t){return!(t===null||!z8e.test(t)||t[t.length-1]==="_")}function J8e(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var X8e=/^[-+]?[0-9]+e/;function Z8e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(xW.isNegativeZero(t))return"-0.0";return r=t.toString(10),X8e.test(r)?r.replace("e",".e"):r}function $8e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||xW.isNegativeZero(t))}kW.exports=new K8e("tag:yaml.org,2002:float",{kind:"scalar",resolve:V8e,construct:J8e,predicate:$8e,represent:Z8e,defaultStyle:"lowercase"})});var pT=_((Jbt,FW)=>{"use strict";var eHe=Jg();FW.exports=new eHe({include:[HD()],implicit:[vW(),PW(),bW(),QW()]})});var hT=_((Xbt,RW)=>{"use strict";var tHe=Jg();RW.exports=new tHe({include:[pT()]})});var OW=_((Zbt,NW)=>{"use strict";var rHe=os(),TW=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),LW=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]))?))?$");function nHe(t){return t===null?!1:TW.exec(t)!==null||LW.exec(t)!==null}function iHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,I,v;if(e=TW.exec(t),e===null&&(e=LW.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],I=+(e[11]||0),h=(E*60+I)*6e4,e[9]==="-"&&(h=-h)),v=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&v.setTime(v.getTime()-h),v}function sHe(t){return t.toISOString()}NW.exports=new rHe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:nHe,construct:iHe,instanceOf:Date,represent:sHe})});var UW=_(($bt,MW)=>{"use strict";var oHe=os();function aHe(t){return t==="<<"||t===null}MW.exports=new oHe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:aHe})});var qW=_((ext,HW)=>{"use strict";var Xg;try{_W=ve,Xg=_W("buffer").Buffer}catch{}var _W,lHe=os(),gT=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function cHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=gT;for(r=0;r64)){if(e<0)return!1;o+=6}return o%8===0}function uHe(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=gT,u=0,A=[];for(e=0;e>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),Xg?Xg.from?Xg.from(A):new Xg(A):A}function AHe(t){var e="",r=0,o,a,n=t.length,u=gT;for(o=0;o>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function fHe(t){return Xg&&Xg.isBuffer(t)}HW.exports=new lHe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:cHe,construct:uHe,predicate:fHe,represent:AHe})});var jW=_((rxt,GW)=>{"use strict";var pHe=os(),hHe=Object.prototype.hasOwnProperty,gHe=Object.prototype.toString;function dHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r{"use strict";var yHe=os(),EHe=Object.prototype.toString;function CHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e{"use strict";var IHe=os(),BHe=Object.prototype.hasOwnProperty;function vHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(BHe.call(r,e)&&r[e]!==null)return!1;return!0}function DHe(t){return t!==null?t:{}}KW.exports=new IHe("tag:yaml.org,2002:set",{kind:"mapping",resolve:vHe,construct:DHe})});var py=_((sxt,VW)=>{"use strict";var PHe=Jg();VW.exports=new PHe({include:[hT()],implicit:[OW(),UW()],explicit:[qW(),jW(),WW(),zW()]})});var XW=_((oxt,JW)=>{"use strict";var SHe=os();function bHe(){return!0}function xHe(){}function kHe(){return""}function QHe(t){return typeof t>"u"}JW.exports=new SHe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:bHe,construct:xHe,predicate:QHe,represent:kHe})});var $W=_((axt,ZW)=>{"use strict";var FHe=os();function RHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),o="";return!(e[0]==="/"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!=="/"))}function THe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function LHe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function NHe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}ZW.exports=new FHe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:RHe,construct:THe,predicate:NHe,represent:LHe})});var rK=_((lxt,tK)=>{"use strict";var qD;try{eK=ve,qD=eK("esprima")}catch{typeof window<"u"&&(qD=window.esprima)}var eK,OHe=os();function MHe(t){if(t===null)return!1;try{var e="("+t+")",r=qD.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function UHe(t){var e="("+t+")",r=qD.parse(e,{range:!0}),o=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,"return "+e.slice(a[0],a[1]))}function _He(t){return t.toString()}function HHe(t){return Object.prototype.toString.call(t)==="[object Function]"}tK.exports=new OHe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:MHe,construct:UHe,predicate:HHe,represent:_He})});var Xw=_((uxt,iK)=>{"use strict";var nK=Jg();iK.exports=nK.DEFAULT=new nK({include:[py()],explicit:[XW(),$W(),rK()]})});var BK=_((Axt,Zw)=>{"use strict";var yf=Vg(),AK=Ay(),qHe=AW(),fK=py(),GHe=Xw(),Wp=Object.prototype.hasOwnProperty,GD=1,pK=2,hK=3,jD=4,dT=1,jHe=2,sK=3,YHe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,WHe=/[\x85\u2028\u2029]/,KHe=/[,\[\]\{\}]/,gK=/^(?:!|!!|![a-z\-]+!)$/i,dK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function oK(t){return Object.prototype.toString.call(t)}function qu(t){return t===10||t===13}function $g(t){return t===9||t===32}function Ia(t){return t===9||t===32||t===10||t===13}function hy(t){return t===44||t===91||t===93||t===123||t===125}function zHe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function VHe(t){return t===120?2:t===117?4:t===85?8:0}function JHe(t){return 48<=t&&t<=57?t-48:-1}function aK(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` +`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function XHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var mK=new Array(256),yK=new Array(256);for(Zg=0;Zg<256;Zg++)mK[Zg]=aK(Zg)?1:0,yK[Zg]=aK(Zg);var Zg;function ZHe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||GHe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function EK(t,e){return new AK(e,new qHe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Sr(t,e){throw EK(t,e)}function YD(t,e){t.onWarning&&t.onWarning.call(null,EK(t,e))}var lK={YAML:function(e,r,o){var a,n,u;e.version!==null&&Sr(e,"duplication of %YAML directive"),o.length!==1&&Sr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),a===null&&Sr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&Sr(e,"unacceptable YAML version of the document"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&YD(e,"unsupported YAML version of the document")},TAG:function(e,r,o){var a,n;o.length!==2&&Sr(e,"TAG directive accepts exactly two arguments"),a=o[0],n=o[1],gK.test(a)||Sr(e,"ill-formed tag handle (first argument) of the TAG directive"),Wp.call(e.tagMap,a)&&Sr(e,'there is a previously declared suffix for "'+a+'" tag handle'),dK.test(n)||Sr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function Yp(t,e,r,o){var a,n,u,A;if(e1&&(t.result+=yf.repeat(` +`,e-1))}function $He(t,e,r){var o,a,n,u,A,p,h,E,I=t.kind,v=t.result,x;if(x=t.input.charCodeAt(t.position),Ia(x)||hy(x)||x===35||x===38||x===42||x===33||x===124||x===62||x===39||x===34||x===37||x===64||x===96||(x===63||x===45)&&(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&hy(a)))return!1;for(t.kind="scalar",t.result="",n=u=t.position,A=!1;x!==0;){if(x===58){if(a=t.input.charCodeAt(t.position+1),Ia(a)||r&&hy(a))break}else if(x===35){if(o=t.input.charCodeAt(t.position-1),Ia(o))break}else{if(t.position===t.lineStart&&WD(t)||r&&hy(x))break;if(qu(x))if(p=t.line,h=t.lineStart,E=t.lineIndent,Wi(t,!1,-1),t.lineIndent>=e){A=!0,x=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(Yp(t,n,u,!1),yT(t,t.line-p),n=u=t.position,A=!1),$g(x)||(u=t.position+1),x=t.input.charCodeAt(++t.position)}return Yp(t,n,u,!1),t.result?!0:(t.kind=I,t.result=v,!1)}function e6e(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Yp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else qu(r)?(Yp(t,o,a,!0),yT(t,Wi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&WD(t)?Sr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Sr(t,"unexpected end of the stream within a single quoted scalar")}function t6e(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return Yp(t,r,t.position,!0),t.position++,!0;if(A===92){if(Yp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),qu(A))Wi(t,!1,e);else if(A<256&&mK[A])t.result+=yK[A],t.position++;else if((u=VHe(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=zHe(A))>=0?n=(n<<4)+u:Sr(t,"expected hexadecimal character");t.result+=XHe(n),t.position++}else Sr(t,"unknown escape sequence");r=o=t.position}else qu(A)?(Yp(t,r,o,!0),yT(t,Wi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&WD(t)?Sr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,o=t.position)}Sr(t,"unexpected end of the stream within a double quoted scalar")}function r6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,I,v={},x,C,R,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,I=!1,n=[];else if(N===123)p=125,I=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(Wi(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=u,t.kind=I?"mapping":"sequence",t.result=n,!0;r||Sr(t,"missed comma between flow collection entries"),C=x=R=null,h=E=!1,N===63&&(A=t.input.charCodeAt(t.position+1),Ia(A)&&(h=E=!0,t.position++,Wi(t,!0,e))),o=t.line,dy(t,e,GD,!1,!0),C=t.tag,x=t.result,Wi(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===o)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),Wi(t,!0,e),dy(t,e,GD,!1,!0),R=t.result),I?gy(t,n,v,C,x,R):h?n.push(gy(t,null,v,C,x,R)):n.push(x),Wi(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Sr(t,"unexpected end of the stream within a flow collection")}function n6e(t,e){var r,o,a=dT,n=!1,u=!1,A=e,p=0,h=!1,E,I;if(I=t.input.charCodeAt(t.position),I===124)o=!1;else if(I===62)o=!0;else return!1;for(t.kind="scalar",t.result="";I!==0;)if(I=t.input.charCodeAt(++t.position),I===43||I===45)dT===a?a=I===43?sK:jHe:Sr(t,"repeat of a chomping mode identifier");else if((E=JHe(I))>=0)E===0?Sr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?Sr(t,"repeat of an indentation width identifier"):(A=e+E-1,u=!0);else break;if($g(I)){do I=t.input.charCodeAt(++t.position);while($g(I));if(I===35)do I=t.input.charCodeAt(++t.position);while(!qu(I)&&I!==0)}for(;I!==0;){for(mT(t),t.lineIndent=0,I=t.input.charCodeAt(t.position);(!u||t.lineIndentA&&(A=t.lineIndent),qu(I)){p++;continue}if(t.lineIndente)&&p!==0)Sr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(dy(t,e,jD,!0,a)&&(C?v=t.result:x=t.result),C||(gy(t,h,E,I,v,x,n,u),I=v=x=null),Wi(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Sr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),I=0,v=t.implicitTypes.length;I tag; it should be "'+x.kind+'", not "'+t.kind+'"'),x.resolve(t.result)?(t.result=x.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Sr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Sr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function l6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Wi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&Sr(t,"directive name must not be less than one character in length");u!==0;){for(;$g(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!qu(u));break}if(qu(u))break;for(r=t.position;u!==0&&!Ia(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&mT(t),Wp.call(lK,o)?lK[o](t,o,a):YD(t,'unknown document directive "'+o+'"')}if(Wi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Wi(t,!0,-1)):n&&Sr(t,"directives end mark is expected"),dy(t,t.lineIndent-1,jD,!1,!0),Wi(t,!0,-1),t.checkLineBreaks&&WHe.test(t.input.slice(e,t.position))&&YD(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&WD(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Wi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var o=CK(t,r);if(typeof e!="function")return o;for(var a=0,n=o.length;a"u"&&(r=e,e=null),wK(t,e,yf.extend({schema:fK},r))}function u6e(t,e){return IK(t,yf.extend({schema:fK},e))}Zw.exports.loadAll=wK;Zw.exports.load=IK;Zw.exports.safeLoadAll=c6e;Zw.exports.safeLoad=u6e});var WK=_((fxt,IT)=>{"use strict";var eI=Vg(),tI=Ay(),A6e=Xw(),f6e=py(),QK=Object.prototype.toString,FK=Object.prototype.hasOwnProperty,p6e=9,$w=10,h6e=13,g6e=32,d6e=33,m6e=34,RK=35,y6e=37,E6e=38,C6e=39,w6e=42,TK=44,I6e=45,LK=58,B6e=61,v6e=62,D6e=63,P6e=64,NK=91,OK=93,S6e=96,MK=123,b6e=124,UK=125,vo={};vo[0]="\\0";vo[7]="\\a";vo[8]="\\b";vo[9]="\\t";vo[10]="\\n";vo[11]="\\v";vo[12]="\\f";vo[13]="\\r";vo[27]="\\e";vo[34]='\\"';vo[92]="\\\\";vo[133]="\\N";vo[160]="\\_";vo[8232]="\\L";vo[8233]="\\P";var x6e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function k6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a0?t.charCodeAt(n-1):null,v=v&&PK(u,A)}else{for(n=0;no&&t[I+1]!==" ",I=n);else if(!my(u))return KD;A=n>0?t.charCodeAt(n-1):null,v=v&&PK(u,A)}h=h||E&&n-I-1>o&&t[I+1]!==" "}return!p&&!h?v&&!a(t)?HK:qK:r>9&&_K(t)?KD:h?jK:GK}function N6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&x6e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return F6e(t,p)}switch(L6e(e,u,t.indent,n,A)){case HK:return e;case qK:return"'"+e.replace(/'/g,"''")+"'";case GK:return"|"+SK(e,t.indent)+bK(DK(e,a));case jK:return">"+SK(e,t.indent)+bK(DK(O6e(e,n),a));case KD:return'"'+M6e(e,n)+'"';default:throw new tI("impossible error: invalid scalar style")}}()}function SK(t,e){var r=_K(t)?String(e):"",o=t[t.length-1]===` +`,a=o&&(t[t.length-2]===` +`||t===` +`),n=a?"+":o?"":"-";return r+n+` +`}function bK(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function O6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(` +`);return h=h!==-1?h:t.length,r.lastIndex=h,xK(t.slice(0,h),e)}(),a=t[0]===` +`||t[0]===" ",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===" ",o+=A+(!a&&!n&&p!==""?` +`:"")+xK(p,e),a=n}return o}function xK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p="";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=` +`+t.slice(a,n),a=n+1),u=A;return p+=` +`,t.length-a>e&&u>a?p+=t.slice(a,u)+` +`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function M6e(t){for(var e="",r,o,a,n=0;n=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=vK((r-55296)*1024+o-56320+65536),n++;continue}a=vo[r],e+=!a&&my(r)?t[n]:a||vK(r)}return e}function U6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),ed(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump="{"+o+"}"}function q6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,I,v;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys=="function")u.sort(t.sortKeys);else if(t.sortKeys)throw new tI("sortKeys must be a boolean or a function");for(A=0,p=u.length;A1024,I&&(t.dump&&$w===t.dump.charCodeAt(0)?v+="?":v+="? "),v+=t.dump,I&&(v+=ET(t,e)),ed(t,e+1,E,!0,I)&&(t.dump&&$w===t.dump.charCodeAt(0)?v+=":":v+=": ",v+=t.dump,a+=v));t.tag=n,t.dump=a||"{}"}function kK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n tag resolver accepts not "'+p+'" style');t.dump=o}return!0}return!1}function ed(t,e,r,o,a,n){t.tag=null,t.dump=r,kK(t,r,!1)||kK(t,r,!0);var u=QK.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u==="[object Object]"||u==="[object Array]",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u==="[object Object]")o&&Object.keys(t.dump).length!==0?(q6e(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(H6e(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(u==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(_6e(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(U6e(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(u==="[object String]")t.tag!=="?"&&N6e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new tI("unacceptable kind of an object to dump "+u)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function G6e(t,e){var r=[],o=[],a,n;for(CT(t,r,o),a=0,n=o.length;a{"use strict";var zD=BK(),KK=WK();function VD(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}ki.exports.Type=os();ki.exports.Schema=Jg();ki.exports.FAILSAFE_SCHEMA=HD();ki.exports.JSON_SCHEMA=pT();ki.exports.CORE_SCHEMA=hT();ki.exports.DEFAULT_SAFE_SCHEMA=py();ki.exports.DEFAULT_FULL_SCHEMA=Xw();ki.exports.load=zD.load;ki.exports.loadAll=zD.loadAll;ki.exports.safeLoad=zD.safeLoad;ki.exports.safeLoadAll=zD.safeLoadAll;ki.exports.dump=KK.dump;ki.exports.safeDump=KK.safeDump;ki.exports.YAMLException=Ay();ki.exports.MINIMAL_SCHEMA=HD();ki.exports.SAFE_SCHEMA=py();ki.exports.DEFAULT_SCHEMA=Xw();ki.exports.scan=VD("scan");ki.exports.parse=VD("parse");ki.exports.compose=VD("compose");ki.exports.addConstructor=VD("addConstructor")});var JK=_((hxt,VK)=>{"use strict";var Y6e=zK();VK.exports=Y6e});var ZK=_((gxt,XK)=>{"use strict";function W6e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function td(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,td)}W6e(td,Error);td.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I({[pt]:Ne})))},fe=function($){return $},ue=function($){return $},me=sa("correct indentation"),he=" ",Be=Qn(" ",!1),we=function($){return $.length===ir*It},g=function($){return $.length===(ir+1)*It},Ee=function(){return ir++,!0},Pe=function(){return ir--,!0},ce=function(){return PA()},ne=sa("pseudostring"),ee=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,Ie=hi(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Fe=/^[^\r\n\t ,\][{}:#"']/,At=hi(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),H=function(){return PA().replace(/^ *| *$/g,"")},at="--",Re=Qn("--",!1),ke=/^[a-zA-Z\/0-9]/,xe=hi([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),He=/^[^\r\n\t :,]/,Te=hi(["\r",` +`," "," ",":",","],!0,!1),Ve="null",qe=Qn("null",!1),b=function(){return null},w="true",S=Qn("true",!1),y=function(){return!0},F="false",J=Qn("false",!1),X=function(){return!1},Z=sa("string"),ie='"',be=Qn('"',!1),Le=function(){return""},ot=function($){return $},dt=function($){return $.join("")},Gt=/^[^"\\\0-\x1F\x7F]/,$t=hi(['"',"\\",["\0",""],"\x7F"],!0,!1),bt='\\"',an=Qn('\\"',!1),Qr=function(){return'"'},mr="\\\\",br=Qn("\\\\",!1),Wr=function(){return"\\"},Kn="\\/",Ls=Qn("\\/",!1),Ti=function(){return"/"},ps="\\b",io=Qn("\\b",!1),Si=function(){return"\b"},Ns="\\f",so=Qn("\\f",!1),uc=function(){return"\f"},uu="\\n",cp=Qn("\\n",!1),up=function(){return` +`},Os="\\r",Dn=Qn("\\r",!1),oo=function(){return"\r"},Ms="\\t",yl=Qn("\\t",!1),El=function(){return" "},ao="\\u",zn=Qn("\\u",!1),On=function($,ye,Ne,pt){return String.fromCharCode(parseInt(`0x${$}${ye}${Ne}${pt}`))},Li=/^[0-9a-fA-F]/,Mn=hi([["0","9"],["a","f"],["A","F"]],!1,!1),_i=sa("blank space"),rr=/^[ \t]/,Oe=hi([" "," "],!1,!1),ii=sa("white space"),Ua=/^[ \t\n\r]/,hr=hi([" "," ",` +`,"\r"],!1,!1),Ac=`\r +`,Au=Qn(`\r +`,!1),fc=` +`,Cl=Qn(` +`,!1),DA="\r",fu=Qn("\r",!1),Ce=0,Rt=0,pc=[{line:1,column:1}],Hi=0,pu=[],Yt=0,wl;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function PA(){return t.substring(Rt,Ce)}function Ap(){return _o(Rt,Ce)}function hc($,ye){throw ye=ye!==void 0?ye:_o(Rt,Ce),dc([sa($)],t.substring(Rt,Ce),ye)}function SA($,ye){throw ye=ye!==void 0?ye:_o(Rt,Ce),lo($,ye)}function Qn($,ye){return{type:"literal",text:$,ignoreCase:ye}}function hi($,ye,Ne){return{type:"class",parts:$,inverted:ye,ignoreCase:Ne}}function gc(){return{type:"any"}}function bA(){return{type:"end"}}function sa($){return{type:"other",description:$}}function Ni($){var ye=pc[$],Ne;if(ye)return ye;for(Ne=$-1;!pc[Ne];)Ne--;for(ye=pc[Ne],ye={line:ye.line,column:ye.column};Ne<$;)t.charCodeAt(Ne)===10?(ye.line++,ye.column=1):ye.column++,Ne++;return pc[$]=ye,ye}function _o($,ye){var Ne=Ni($),pt=Ni(ye);return{start:{offset:$,line:Ne.line,column:Ne.column},end:{offset:ye,line:pt.line,column:pt.column}}}function Ze($){CeHi&&(Hi=Ce,pu=[]),pu.push($))}function lo($,ye){return new td($,null,null,ye)}function dc($,ye,Ne){return new td(td.buildMessage($,ye),$,ye,Ne)}function hu(){var $;return $=xA(),$}function qi(){var $,ye,Ne;for($=Ce,ye=[],Ne=gu();Ne!==r;)ye.push(Ne),Ne=gu();return ye!==r&&(Rt=$,ye=n(ye)),$=ye,$}function gu(){var $,ye,Ne,pt,ht;return $=Ce,ye=hs(),ye!==r?(t.charCodeAt(Ce)===45?(Ne=u,Ce++):(Ne=r,Yt===0&&Ze(A)),Ne!==r?(pt=Pn(),pt!==r?(ht=mc(),ht!==r?(Rt=$,ye=p(ht),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$}function xA(){var $,ye,Ne;for($=Ce,ye=[],Ne=Ha();Ne!==r;)ye.push(Ne),Ne=Ha();return ye!==r&&(Rt=$,ye=h(ye)),$=ye,$}function Ha(){var $,ye,Ne,pt,ht,Tt,er,$r,Gi;if($=Ce,ye=Pn(),ye===r&&(ye=null),ye!==r){if(Ne=Ce,t.charCodeAt(Ce)===35?(pt=E,Ce++):(pt=r,Yt===0&&Ze(I)),pt!==r){if(ht=[],Tt=Ce,er=Ce,Yt++,$r=tt(),Yt--,$r===r?er=void 0:(Ce=er,er=r),er!==r?(t.length>Ce?($r=t.charAt(Ce),Ce++):($r=r,Yt===0&&Ze(v)),$r!==r?(er=[er,$r],Tt=er):(Ce=Tt,Tt=r)):(Ce=Tt,Tt=r),Tt!==r)for(;Tt!==r;)ht.push(Tt),Tt=Ce,er=Ce,Yt++,$r=tt(),Yt--,$r===r?er=void 0:(Ce=er,er=r),er!==r?(t.length>Ce?($r=t.charAt(Ce),Ce++):($r=r,Yt===0&&Ze(v)),$r!==r?(er=[er,$r],Tt=er):(Ce=Tt,Tt=r)):(Ce=Tt,Tt=r);else ht=r;ht!==r?(pt=[pt,ht],Ne=pt):(Ce=Ne,Ne=r)}else Ce=Ne,Ne=r;if(Ne===r&&(Ne=null),Ne!==r){if(pt=[],ht=We(),ht!==r)for(;ht!==r;)pt.push(ht),ht=We();else pt=r;pt!==r?(Rt=$,ye=x(),$=ye):(Ce=$,$=r)}else Ce=$,$=r}else Ce=$,$=r;if($===r&&($=Ce,ye=hs(),ye!==r?(Ne=oa(),Ne!==r?(pt=Pn(),pt===r&&(pt=null),pt!==r?(t.charCodeAt(Ce)===58?(ht=C,Ce++):(ht=r,Yt===0&&Ze(R)),ht!==r?(Tt=Pn(),Tt===r&&(Tt=null),Tt!==r?(er=mc(),er!==r?(Rt=$,ye=N(Ne,er),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,ye=hs(),ye!==r?(Ne=co(),Ne!==r?(pt=Pn(),pt===r&&(pt=null),pt!==r?(t.charCodeAt(Ce)===58?(ht=C,Ce++):(ht=r,Yt===0&&Ze(R)),ht!==r?(Tt=Pn(),Tt===r&&(Tt=null),Tt!==r?(er=mc(),er!==r?(Rt=$,ye=N(Ne,er),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r))){if($=Ce,ye=hs(),ye!==r)if(Ne=co(),Ne!==r)if(pt=Pn(),pt!==r)if(ht=aa(),ht!==r){if(Tt=[],er=We(),er!==r)for(;er!==r;)Tt.push(er),er=We();else Tt=r;Tt!==r?(Rt=$,ye=N(Ne,ht),$=ye):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r;else Ce=$,$=r;else Ce=$,$=r;if($===r)if($=Ce,ye=hs(),ye!==r)if(Ne=co(),Ne!==r){if(pt=[],ht=Ce,Tt=Pn(),Tt===r&&(Tt=null),Tt!==r?(t.charCodeAt(Ce)===44?(er=U,Ce++):(er=r,Yt===0&&Ze(V)),er!==r?($r=Pn(),$r===r&&($r=null),$r!==r?(Gi=co(),Gi!==r?(Rt=ht,Tt=te(Ne,Gi),ht=Tt):(Ce=ht,ht=r)):(Ce=ht,ht=r)):(Ce=ht,ht=r)):(Ce=ht,ht=r),ht!==r)for(;ht!==r;)pt.push(ht),ht=Ce,Tt=Pn(),Tt===r&&(Tt=null),Tt!==r?(t.charCodeAt(Ce)===44?(er=U,Ce++):(er=r,Yt===0&&Ze(V)),er!==r?($r=Pn(),$r===r&&($r=null),$r!==r?(Gi=co(),Gi!==r?(Rt=ht,Tt=te(Ne,Gi),ht=Tt):(Ce=ht,ht=r)):(Ce=ht,ht=r)):(Ce=ht,ht=r)):(Ce=ht,ht=r);else pt=r;pt!==r?(ht=Pn(),ht===r&&(ht=null),ht!==r?(t.charCodeAt(Ce)===58?(Tt=C,Ce++):(Tt=r,Yt===0&&Ze(R)),Tt!==r?(er=Pn(),er===r&&(er=null),er!==r?($r=mc(),$r!==r?(Rt=$,ye=ae(Ne,pt,$r),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r}return $}function mc(){var $,ye,Ne,pt,ht,Tt,er;if($=Ce,ye=Ce,Yt++,Ne=Ce,pt=tt(),pt!==r?(ht=Ht(),ht!==r?(t.charCodeAt(Ce)===45?(Tt=u,Ce++):(Tt=r,Yt===0&&Ze(A)),Tt!==r?(er=Pn(),er!==r?(pt=[pt,ht,Tt,er],Ne=pt):(Ce=Ne,Ne=r)):(Ce=Ne,Ne=r)):(Ce=Ne,Ne=r)):(Ce=Ne,Ne=r),Yt--,Ne!==r?(Ce=ye,ye=void 0):ye=r,ye!==r?(Ne=We(),Ne!==r?(pt=Fn(),pt!==r?(ht=qi(),ht!==r?(Tt=Ci(),Tt!==r?(Rt=$,ye=fe(ht),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,ye=tt(),ye!==r?(Ne=Fn(),Ne!==r?(pt=xA(),pt!==r?(ht=Ci(),ht!==r?(Rt=$,ye=fe(pt),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r),$===r))if($=Ce,ye=Us(),ye!==r){if(Ne=[],pt=We(),pt!==r)for(;pt!==r;)Ne.push(pt),pt=We();else Ne=r;Ne!==r?(Rt=$,ye=ue(ye),$=ye):(Ce=$,$=r)}else Ce=$,$=r;return $}function hs(){var $,ye,Ne;for(Yt++,$=Ce,ye=[],t.charCodeAt(Ce)===32?(Ne=he,Ce++):(Ne=r,Yt===0&&Ze(Be));Ne!==r;)ye.push(Ne),t.charCodeAt(Ce)===32?(Ne=he,Ce++):(Ne=r,Yt===0&&Ze(Be));return ye!==r?(Rt=Ce,Ne=we(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],$=ye):(Ce=$,$=r)):(Ce=$,$=r),Yt--,$===r&&(ye=r,Yt===0&&Ze(me)),$}function Ht(){var $,ye,Ne;for($=Ce,ye=[],t.charCodeAt(Ce)===32?(Ne=he,Ce++):(Ne=r,Yt===0&&Ze(Be));Ne!==r;)ye.push(Ne),t.charCodeAt(Ce)===32?(Ne=he,Ce++):(Ne=r,Yt===0&&Ze(Be));return ye!==r?(Rt=Ce,Ne=g(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],$=ye):(Ce=$,$=r)):(Ce=$,$=r),$}function Fn(){var $;return Rt=Ce,$=Ee(),$?$=void 0:$=r,$}function Ci(){var $;return Rt=Ce,$=Pe(),$?$=void 0:$=r,$}function oa(){var $;return $=ds(),$===r&&($=la()),$}function co(){var $,ye,Ne;if($=ds(),$===r){if($=Ce,ye=[],Ne=Ho(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=Ho();else ye=r;ye!==r&&(Rt=$,ye=ce()),$=ye}return $}function Us(){var $;return $=wi(),$===r&&($=gs(),$===r&&($=ds(),$===r&&($=la()))),$}function aa(){var $;return $=wi(),$===r&&($=ds(),$===r&&($=Ho())),$}function la(){var $,ye,Ne,pt,ht,Tt;if(Yt++,$=Ce,ee.test(t.charAt(Ce))?(ye=t.charAt(Ce),Ce++):(ye=r,Yt===0&&Ze(Ie)),ye!==r){for(Ne=[],pt=Ce,ht=Pn(),ht===r&&(ht=null),ht!==r?(Fe.test(t.charAt(Ce))?(Tt=t.charAt(Ce),Ce++):(Tt=r,Yt===0&&Ze(At)),Tt!==r?(ht=[ht,Tt],pt=ht):(Ce=pt,pt=r)):(Ce=pt,pt=r);pt!==r;)Ne.push(pt),pt=Ce,ht=Pn(),ht===r&&(ht=null),ht!==r?(Fe.test(t.charAt(Ce))?(Tt=t.charAt(Ce),Ce++):(Tt=r,Yt===0&&Ze(At)),Tt!==r?(ht=[ht,Tt],pt=ht):(Ce=pt,pt=r)):(Ce=pt,pt=r);Ne!==r?(Rt=$,ye=H(),$=ye):(Ce=$,$=r)}else Ce=$,$=r;return Yt--,$===r&&(ye=r,Yt===0&&Ze(ne)),$}function Ho(){var $,ye,Ne,pt,ht;if($=Ce,t.substr(Ce,2)===at?(ye=at,Ce+=2):(ye=r,Yt===0&&Ze(Re)),ye===r&&(ye=null),ye!==r)if(ke.test(t.charAt(Ce))?(Ne=t.charAt(Ce),Ce++):(Ne=r,Yt===0&&Ze(xe)),Ne!==r){for(pt=[],He.test(t.charAt(Ce))?(ht=t.charAt(Ce),Ce++):(ht=r,Yt===0&&Ze(Te));ht!==r;)pt.push(ht),He.test(t.charAt(Ce))?(ht=t.charAt(Ce),Ce++):(ht=r,Yt===0&&Ze(Te));pt!==r?(Rt=$,ye=H(),$=ye):(Ce=$,$=r)}else Ce=$,$=r;else Ce=$,$=r;return $}function wi(){var $,ye;return $=Ce,t.substr(Ce,4)===Ve?(ye=Ve,Ce+=4):(ye=r,Yt===0&&Ze(qe)),ye!==r&&(Rt=$,ye=b()),$=ye,$}function gs(){var $,ye;return $=Ce,t.substr(Ce,4)===w?(ye=w,Ce+=4):(ye=r,Yt===0&&Ze(S)),ye!==r&&(Rt=$,ye=y()),$=ye,$===r&&($=Ce,t.substr(Ce,5)===F?(ye=F,Ce+=5):(ye=r,Yt===0&&Ze(J)),ye!==r&&(Rt=$,ye=X()),$=ye),$}function ds(){var $,ye,Ne,pt;return Yt++,$=Ce,t.charCodeAt(Ce)===34?(ye=ie,Ce++):(ye=r,Yt===0&&Ze(be)),ye!==r?(t.charCodeAt(Ce)===34?(Ne=ie,Ce++):(Ne=r,Yt===0&&Ze(be)),Ne!==r?(Rt=$,ye=Le(),$=ye):(Ce=$,$=r)):(Ce=$,$=r),$===r&&($=Ce,t.charCodeAt(Ce)===34?(ye=ie,Ce++):(ye=r,Yt===0&&Ze(be)),ye!==r?(Ne=ms(),Ne!==r?(t.charCodeAt(Ce)===34?(pt=ie,Ce++):(pt=r,Yt===0&&Ze(be)),pt!==r?(Rt=$,ye=ot(Ne),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)),Yt--,$===r&&(ye=r,Yt===0&&Ze(Z)),$}function ms(){var $,ye,Ne;if($=Ce,ye=[],Ne=_s(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=_s();else ye=r;return ye!==r&&(Rt=$,ye=dt(ye)),$=ye,$}function _s(){var $,ye,Ne,pt,ht,Tt;return Gt.test(t.charAt(Ce))?($=t.charAt(Ce),Ce++):($=r,Yt===0&&Ze($t)),$===r&&($=Ce,t.substr(Ce,2)===bt?(ye=bt,Ce+=2):(ye=r,Yt===0&&Ze(an)),ye!==r&&(Rt=$,ye=Qr()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===mr?(ye=mr,Ce+=2):(ye=r,Yt===0&&Ze(br)),ye!==r&&(Rt=$,ye=Wr()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===Kn?(ye=Kn,Ce+=2):(ye=r,Yt===0&&Ze(Ls)),ye!==r&&(Rt=$,ye=Ti()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===ps?(ye=ps,Ce+=2):(ye=r,Yt===0&&Ze(io)),ye!==r&&(Rt=$,ye=Si()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===Ns?(ye=Ns,Ce+=2):(ye=r,Yt===0&&Ze(so)),ye!==r&&(Rt=$,ye=uc()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===uu?(ye=uu,Ce+=2):(ye=r,Yt===0&&Ze(cp)),ye!==r&&(Rt=$,ye=up()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===Os?(ye=Os,Ce+=2):(ye=r,Yt===0&&Ze(Dn)),ye!==r&&(Rt=$,ye=oo()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===Ms?(ye=Ms,Ce+=2):(ye=r,Yt===0&&Ze(yl)),ye!==r&&(Rt=$,ye=El()),$=ye,$===r&&($=Ce,t.substr(Ce,2)===ao?(ye=ao,Ce+=2):(ye=r,Yt===0&&Ze(zn)),ye!==r?(Ne=Un(),Ne!==r?(pt=Un(),pt!==r?(ht=Un(),ht!==r?(Tt=Un(),Tt!==r?(Rt=$,ye=On(Ne,pt,ht,Tt),$=ye):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)):(Ce=$,$=r)))))))))),$}function Un(){var $;return Li.test(t.charAt(Ce))?($=t.charAt(Ce),Ce++):($=r,Yt===0&&Ze(Mn)),$}function Pn(){var $,ye;if(Yt++,$=[],rr.test(t.charAt(Ce))?(ye=t.charAt(Ce),Ce++):(ye=r,Yt===0&&Ze(Oe)),ye!==r)for(;ye!==r;)$.push(ye),rr.test(t.charAt(Ce))?(ye=t.charAt(Ce),Ce++):(ye=r,Yt===0&&Ze(Oe));else $=r;return Yt--,$===r&&(ye=r,Yt===0&&Ze(_i)),$}function ys(){var $,ye;if(Yt++,$=[],Ua.test(t.charAt(Ce))?(ye=t.charAt(Ce),Ce++):(ye=r,Yt===0&&Ze(hr)),ye!==r)for(;ye!==r;)$.push(ye),Ua.test(t.charAt(Ce))?(ye=t.charAt(Ce),Ce++):(ye=r,Yt===0&&Ze(hr));else $=r;return Yt--,$===r&&(ye=r,Yt===0&&Ze(ii)),$}function We(){var $,ye,Ne,pt,ht,Tt;if($=Ce,ye=tt(),ye!==r){for(Ne=[],pt=Ce,ht=Pn(),ht===r&&(ht=null),ht!==r?(Tt=tt(),Tt!==r?(ht=[ht,Tt],pt=ht):(Ce=pt,pt=r)):(Ce=pt,pt=r);pt!==r;)Ne.push(pt),pt=Ce,ht=Pn(),ht===r&&(ht=null),ht!==r?(Tt=tt(),Tt!==r?(ht=[ht,Tt],pt=ht):(Ce=pt,pt=r)):(Ce=pt,pt=r);Ne!==r?(ye=[ye,Ne],$=ye):(Ce=$,$=r)}else Ce=$,$=r;return $}function tt(){var $;return t.substr(Ce,2)===Ac?($=Ac,Ce+=2):($=r,Yt===0&&Ze(Au)),$===r&&(t.charCodeAt(Ce)===10?($=fc,Ce++):($=r,Yt===0&&Ze(Cl)),$===r&&(t.charCodeAt(Ce)===13?($=DA,Ce++):($=r,Yt===0&&Ze(fu)))),$}let It=2,ir=0;if(wl=a(),wl!==r&&Ce===t.length)return wl;throw wl!==r&&Ce"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>rz(t[e])):!1}function BT(t,e,r){if(t===null)return`null +`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} +`;if(typeof t=="string")return`${ez(t)} +`;if(Array.isArray(t)){if(t.length===0)return`[] +`;let o=" ".repeat(e);return` +${t.map(n=>`${o}- ${BT(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[o,a]=t instanceof JD?[t.data,!1]:[t,!0],n=" ".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=$K.indexOf(p),I=$K.indexOf(h);return E===-1&&I===-1?ph?1:0:E!==-1&&I===-1?-1:E===-1&&I!==-1?1:E-I});let A=u.filter(p=>!rz(o[p])).map((p,h)=>{let E=o[p],I=ez(p),v=BT(E,e+1,!0),x=h>0||r?n:"",C=I.length>1024?`? ${I} +${x}:`:`${I}:`,R=v.startsWith(` +`)?v:` ${v}`;return`${x}${C}${R}`}).join(e===0?` +`:"")||` +`;return r?` +${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function Ba(t){try{let e=BT(t,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function V6e(t){return t.endsWith(` +`)||(t+=` +`),(0,tz.parse)(t)}function X6e(t){if(J6e.test(t))return V6e(t);let e=(0,XD.safeLoad)(t,{schema:XD.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Ki(t){return X6e(t)}var XD,tz,z6e,$K,JD,J6e,nz=Et(()=>{XD=$e(JK()),tz=$e(ZK()),z6e=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,$K=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],JD=class{constructor(e){this.data=e}};Ba.PreserveOrdering=JD;J6e=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var rI={};zt(rI,{parseResolution:()=>MD,parseShell:()=>LD,parseSyml:()=>Ki,stringifyArgument:()=>cT,stringifyArgumentSegment:()=>uT,stringifyArithmeticExpression:()=>OD,stringifyCommand:()=>lT,stringifyCommandChain:()=>uy,stringifyCommandChainThen:()=>aT,stringifyCommandLine:()=>ND,stringifyCommandLineThen:()=>oT,stringifyEnvSegment:()=>TD,stringifyRedirectArgument:()=>Vw,stringifyResolution:()=>UD,stringifyShell:()=>cy,stringifyShellLine:()=>cy,stringifySyml:()=>Ba,stringifyValueArgument:()=>Wg});var Nl=Et(()=>{rW();oW();nz()});var sz=_((Cxt,vT)=>{"use strict";var Z6e=t=>{let e=!1,r=!1,o=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=Z6e(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};vT.exports=iz;vT.exports.default=iz});var oz=_((wxt,$6e)=>{$6e.exports=[{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:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{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:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{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:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{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",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{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"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var rd=_(Za=>{"use strict";var lz=oz(),Gu=process.env;Object.defineProperty(Za,"_vendors",{value:lz.map(function(t){return t.constant})});Za.name=null;Za.isPR=null;lz.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return az(o)});if(Za[t.constant]=r,r)switch(Za.name=t.name,typeof t.pr){case"string":Za.isPR=!!Gu[t.pr];break;case"object":"env"in t.pr?Za.isPR=t.pr.env in Gu&&Gu[t.pr.env]!==t.pr.ne:"any"in t.pr?Za.isPR=t.pr.any.some(function(o){return!!Gu[o]}):Za.isPR=az(t.pr);break;default:Za.isPR=null}});Za.isCI=!!(Gu.CI||Gu.CONTINUOUS_INTEGRATION||Gu.BUILD_NUMBER||Gu.RUN_ID||Za.name);function az(t){return typeof t=="string"?!!Gu[t]:Object.keys(t).every(function(e){return Gu[e]===t[e]})}});var Hn,cn,nd,DT,ZD,cz,PT,ST,$D=Et(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(Hn||(Hn={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(cn||(cn={}));nd=-1,DT=/^(-h|--help)(?:=([0-9]+))?$/,ZD=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,cz=/^-[a-zA-Z]{2,}$/,PT=/^([^=]+)=([\s\S]*)$/,ST=process.env.DEBUG_CLI==="1"});var it,yy,eP,bT,tP=Et(()=>{$D();it=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},yy=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o} + +${this.candidates.map(({usage:a})=>`$ ${a}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${o} +${bT(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${bT(e)}`}},eP=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(` +`)} + +${bT(e)}`}},bT=t=>`While running ${t.filter(e=>e!==Hn.EndOfInput&&e!==Hn.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function eqe(t){let e=t.split(` +`),r=e.filter(a=>a.match(/\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(` +`)}function Do(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` +`),t=eqe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),t=t.replace(/\n(\n)?\n*/g,(o,a)=>a||" "),r&&(t=t.split(/\n/).map(o=>{let a=o.match(/^\s*[*-][\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(` +`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((u,A)=>" ".repeat(n)+(A===0?"- ":" ")+u).join(` +`)}).join(` + +`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t} +`:""}var xT,uz,Az,kT=Et(()=>{xT=Array(80).fill("\u2501");for(let t=0;t<=24;++t)xT[xT.length-t]=`\x1B[38;5;${232+t}m\u2501`;uz={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<80-5?` ${xT.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},Az={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Ko(t){return{...t,[nI]:!0}}function ju(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function rP(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,o,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=o!=="."||!e?`${o.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function iI(t,e){return e.length===1?new it(`${t}${rP(e[0],{mergeName:!0})}`):new it(`${t}: +${e.map(r=>` +- ${rP(r)}`).join("")}`)}function id(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw iI(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var nI,Ef=Et(()=>{tP();nI=Symbol("clipanion/isOption")});var zo={};zt(zo,{KeyRelationship:()=>Yu,TypeAssertionError:()=>zp,applyCascade:()=>aI,as:()=>Eqe,assert:()=>dqe,assertWithErrors:()=>mqe,cascade:()=>oP,fn:()=>Cqe,hasAtLeastOneKey:()=>OT,hasExactLength:()=>dz,hasForbiddenKeys:()=>Uqe,hasKeyRelationship:()=>cI,hasMaxLength:()=>Iqe,hasMinLength:()=>wqe,hasMutuallyExclusiveKeys:()=>_qe,hasRequiredKeys:()=>Mqe,hasUniqueItems:()=>Bqe,isArray:()=>nP,isAtLeast:()=>LT,isAtMost:()=>Pqe,isBase64:()=>Tqe,isBoolean:()=>lqe,isDate:()=>uqe,isDict:()=>pqe,isEnum:()=>Ks,isHexColor:()=>Rqe,isISO8601:()=>Fqe,isInExclusiveRange:()=>bqe,isInInclusiveRange:()=>Sqe,isInstanceOf:()=>gqe,isInteger:()=>NT,isJSON:()=>Lqe,isLiteral:()=>pz,isLowerCase:()=>xqe,isMap:()=>fqe,isNegative:()=>vqe,isNullable:()=>Oqe,isNumber:()=>RT,isObject:()=>hz,isOneOf:()=>TT,isOptional:()=>Nqe,isPartial:()=>hqe,isPayload:()=>cqe,isPositive:()=>Dqe,isRecord:()=>sP,isSet:()=>Aqe,isString:()=>Cy,isTuple:()=>iP,isUUID4:()=>Qqe,isUnknown:()=>FT,isUpperCase:()=>kqe,makeTrait:()=>gz,makeValidator:()=>Hr,matchesRegExp:()=>oI,softAssert:()=>yqe});function qn(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function Ey(t,e){if(t.length===0)return"nothing";if(t.length===1)return qn(t[0]);let r=t.slice(0,-1),o=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>qn(n)).join(", ")}${a}${qn(o)}`}function Kp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:tqe.test(e)?`${(o=t?.p)!==null&&o!==void 0?o:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function QT(t,e,r){return t===1?e:r}function pr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function oqe(t,e){return r=>{t[e]=r}}function Wu(t,e){return r=>{let o=t[e];return t[e]=r,Wu(t,e).bind(null,o)}}function sI(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}function FT(){return Hr({test:(t,e)=>!0})}function pz(t){return Hr({test:(e,r)=>e!==t?pr(r,`Expected ${qn(t)} (got ${qn(e)})`):!0})}function Cy(){return Hr({test:(t,e)=>typeof t!="string"?pr(e,`Expected a string (got ${qn(t)})`):!0})}function Ks(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),o=new Set(e);return o.size===1?pz([...o][0]):Hr({test:(a,n)=>o.has(a)?!0:r?pr(n,`Expected one of ${Ey(e,"or")} (got ${qn(a)})`):pr(n,`Expected a valid enumeration value (got ${qn(a)})`)})}function lqe(){return Hr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o=aqe.get(t);if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a boolean (got ${qn(t)})`)}return!0}})}function RT(){return Hr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)o=a;else return pr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a number (got ${qn(t)})`)}return!0}})}function cqe(t){return Hr({test:(e,r)=>{var o;if(typeof r?.coercions>"u")return pr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return pr(r,"Unbound coercion result");if(typeof e!="string")return pr(r,`Expected a string (got ${qn(e)})`);let a;try{a=JSON.parse(e)}catch{return pr(r,`Expected a JSON string (got ${qn(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Wu(n,"value")}))?(r.coercions.push([(o=r.p)!==null&&o!==void 0?o:".",r.coercion.bind(null,n.value)]),!0):!1}})}function uqe(){return Hr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return pr(e,"Unbound coercion result");let o;if(typeof t=="string"&&fz.test(t))o=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return pr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a date (got ${qn(t)})`)}return!0}})}function nP(t,{delimiter:e}={}){return Hr({test:(r,o)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof o?.coercions<"u"){if(typeof o?.coercion>"u")return pr(o,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return pr(o,`Expected an array (got ${qn(r)})`);let u=!0;for(let A=0,p=r.length;A{var n,u;if(Object.getPrototypeOf(o).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");let A=[...o],p=[...o];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,I)=>E!==A[I])?new Set(p):o;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",sI(a.coercion,o,h)]),!0}else{let A=!0;for(let p of o)if(A=t(p,Object.assign({},a))&&A,!A&&a?.errors==null)break;return A}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");let A={value:o};return r(o,Object.assign(Object.assign({},a),{coercion:Wu(A,"value")}))?(a.coercions.push([(u=a.p)!==null&&u!==void 0?u:".",sI(a.coercion,o,()=>new Set(A.value))]),!0):!1}return pr(a,`Expected a set (got ${qn(o)})`)}})}function fqe(t,e){let r=nP(iP([t,e])),o=sP(e,{keys:t});return Hr({test:(a,n)=>{var u,A,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return pr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let I=()=>E.some((v,x)=>v[0]!==h[x][0]||v[1]!==h[x][1])?new Map(E):a;return n.coercions.push([(u=n.p)!==null&&u!==void 0?u:".",sI(n.coercion,a,I)]),!0}else{let h=!0;for(let[E,I]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(I,Object.assign(Object.assign({},n),{p:Kp(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return pr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(A=n.p)!==null&&A!==void 0?A:".",sI(n.coercion,a,()=>new Map(h.value))]),!0):!1:o(a,Object.assign(Object.assign({},n),{coercion:Wu(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",sI(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return pr(n,`Expected a map (got ${qn(a)})`)}})}function iP(t,{delimiter:e}={}){let r=dz(t.length);return Hr({test:(o,a)=>{var n;if(typeof o=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)])}if(!Array.isArray(o))return pr(a,`Expected a tuple (got ${qn(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;A{var n;if(Array.isArray(o)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?pr(a,"Unbound coercion result"):r(o,Object.assign(Object.assign({},a),{coercion:void 0}))?(o=Object.fromEntries(o),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)]),!0):!1;if(typeof o!="object"||o===null)return pr(a,`Expected an object (got ${qn(o)})`);let u=Object.keys(o),A=!0;for(let p=0,h=u.length;p{if(typeof a!="object"||a===null)return pr(n,`Expected an object (got ${qn(a)})`);let u=new Set([...r,...Object.keys(a)]),A={},p=!0;for(let h of u){if(h==="constructor"||h==="__proto__")p=pr(Object.assign(Object.assign({},n),{p:Kp(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,I=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(I,Object.assign(Object.assign({},n),{p:Kp(n,h),coercion:Wu(a,h)}))&&p:e===null?p=pr(Object.assign(Object.assign({},n),{p:Kp(n,h)}),`Extraneous property (got ${qn(I)})`):Object.defineProperty(A,h,{enumerable:!0,get:()=>I,set:oqe(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(A,n)&&p),p}});return Object.assign(o,{properties:t})}function hqe(t){return hz(t,{extra:sP(FT())})}function gz(t){return()=>t}function Hr({test:t}){return gz(t)()}function dqe(t,e){if(!e(t))throw new zp}function mqe(t,e){let r=[];if(!e(t,{errors:r}))throw new zp({errors:r})}function yqe(t,e){}function Eqe(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}let u={value:t},A=Wu(u,"value"),p=[];if(!e(t,{errors:n,coercion:A,coercions:p})){if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?u.value:{value:u.value,errors:void 0}}function Cqe(t,e){let r=iP(t);return(...o)=>{if(!r(o))throw new zp;return e(...o)}}function wqe(t){return Hr({test:(e,r)=>e.length>=t?!0:pr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function Iqe(t){return Hr({test:(e,r)=>e.length<=t?!0:pr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function dz(t){return Hr({test:(e,r)=>e.length!==t?pr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function Bqe({map:t}={}){return Hr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;nt<=0?!0:pr(e,`Expected to be negative (got ${t})`)})}function Dqe(){return Hr({test:(t,e)=>t>=0?!0:pr(e,`Expected to be positive (got ${t})`)})}function LT(t){return Hr({test:(e,r)=>e>=t?!0:pr(r,`Expected to be at least ${t} (got ${e})`)})}function Pqe(t){return Hr({test:(e,r)=>e<=t?!0:pr(r,`Expected to be at most ${t} (got ${e})`)})}function Sqe(t,e){return Hr({test:(r,o)=>r>=t&&r<=e?!0:pr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function bqe(t,e){return Hr({test:(r,o)=>r>=t&&re!==Math.round(e)?pr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?pr(r,`Expected to be a safe integer (got ${e})`):!0})}function oI(t){return Hr({test:(e,r)=>t.test(e)?!0:pr(r,`Expected to match the pattern ${t.toString()} (got ${qn(e)})`)})}function xqe(){return Hr({test:(t,e)=>t!==t.toLowerCase()?pr(e,`Expected to be all-lowercase (got ${t})`):!0})}function kqe(){return Hr({test:(t,e)=>t!==t.toUpperCase()?pr(e,`Expected to be all-uppercase (got ${t})`):!0})}function Qqe(){return Hr({test:(t,e)=>sqe.test(t)?!0:pr(e,`Expected to be a valid UUID v4 (got ${qn(t)})`)})}function Fqe(){return Hr({test:(t,e)=>fz.test(t)?!0:pr(e,`Expected to be a valid ISO 8601 date string (got ${qn(t)})`)})}function Rqe({alpha:t=!1}){return Hr({test:(e,r)=>(t?rqe.test(e):nqe.test(e))?!0:pr(r,`Expected to be a valid hexadecimal color string (got ${qn(e)})`)})}function Tqe(){return Hr({test:(t,e)=>iqe.test(t)?!0:pr(e,`Expected to be a valid base 64 string (got ${qn(t)})`)})}function Lqe(t=FT()){return Hr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return pr(r,`Expected to be a valid JSON string (got ${qn(e)})`)}return t(o,r)}})}function oP(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Hr({test:(o,a)=>{var n,u;let A={value:o},p=typeof a?.coercions<"u"?Wu(A,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(o,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,I]of h)E.push(I());try{if(typeof a?.coercions<"u"){if(A.value!==o){if(typeof a?.coercion>"u")return pr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,A.value)])}(u=a?.coercions)===null||u===void 0||u.push(...h)}return r.every(I=>I(A.value,a))}finally{for(let I of E)I()}}})}function aI(t,...e){let r=Array.isArray(e[0])?e[0]:e;return oP(t,r)}function Nqe(t){return Hr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function Oqe(t){return Hr({test:(e,r)=>e===null?!0:t(e,r)})}function Mqe(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)||p.push(h);return p.length>0?pr(u,`Missing required ${QT(p.length,"property","properties")} ${Ey(p,"and")}`):!0}})}function OT(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>Object.keys(n).some(h=>a(o,h,n))?!0:pr(u,`Missing at least one property from ${Ey(Array.from(o),"or")}`)})}function Uqe(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>0?pr(u,`Forbidden ${QT(p.length,"property","properties")} ${Ey(p,"and")}`):!0}})}function _qe(t,e){var r;let o=new Set(t),a=lI[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>1?pr(u,`Mutually exclusive properties ${Ey(p,"and")}`):!0}})}function cI(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==void 0?a:[]),A=lI[(n=o?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=Hqe[e],E=e===Yu.Forbids?"or":"and";return Hr({test:(I,v)=>{let x=new Set(Object.keys(I));if(!A(x,t,I)||u.has(I[t]))return!0;let C=[];for(let R of p)(A(x,R,I)&&!u.has(I[R]))!==h.expect&&C.push(R);return C.length>=1?pr(v,`Property "${t}" ${h.message} ${QT(C.length,"property","properties")} ${Ey(C,E)}`):!0}})}var tqe,rqe,nqe,iqe,sqe,fz,aqe,gqe,TT,zp,lI,Yu,Hqe,$a=Et(()=>{tqe=/^[a-zA-Z_][a-zA-Z0-9_]*$/;rqe=/^#[0-9a-f]{6}$/i,nqe=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,iqe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,sqe=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,fz=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;aqe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);gqe=t=>Hr({test:(e,r)=>e instanceof t?!0:pr(r,`Expected an instance of ${t.name} (got ${qn(e)})`)}),TT=(t,{exclusive:e=!1}={})=>Hr({test:(r,o)=>{var a,n,u;let A=[],p=typeof o?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?pr(o,`Expected to match exactly a single predicate (matched ${A.join(", ")})`):(u=o?.errors)===null||u===void 0||u.push(...p),!1}});zp=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=` +`;for(let o of e)r+=` +- ${o}`}super(r)}};lI={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Yu||(Yu={}));Hqe={[Yu.Forbids]:{expect:!1,message:"forbids using"},[Yu.Requires]:{expect:!0,message:"requires using"}}});var nt,Vp=Et(()=>{Ef();nt=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>($a(),zo)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw iI("Invalid option schema",p);for(let[,I]of h)I()}else if(r!=null)throw new Error("Invalid command schema");let o=await this.execute();return typeof o<"u"?o:0}};nt.isOption=nI;nt.Default=[]});function va(t){ST&&console.log(t)}function yz(){let t={nodes:[]};for(let e=0;e{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let I of h)E.some(({to:v})=>I.to===v)||E.push(I)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:I}])=>p===E&&h.to===I)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(cn.InitialNode)}function jqe(t,{prefix:e=""}={}){if(ST){va(`${e}Nodes are:`);for(let r=0;rE!==cn.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===cn.ErrorNode))throw new yy(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));o=Kqe(h)}if(o.length>0){va(" Results:");for(let n of o)va(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else va(" No results");return o}function Wqe(t,e,{endToken:r=Hn.EndOfInput}={}){let o=Yqe(t,[...e,r]);return zqe(e,o.map(({state:a})=>a))}function Kqe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function zqe(t,e){let r=e.filter(v=>v.selectedIndex!==null),o=r.filter(v=>!v.partial);if(o.length>0&&(r=o),r.length===0)throw new Error;let a=r.filter(v=>v.selectedIndex===nd||v.requiredOptions.every(x=>x.some(C=>v.options.find(R=>R.name===C))));if(a.length===0)throw new yy(t,r.map(v=>({usage:v.candidateUsage,reason:null})));let n=0;for(let v of a)v.path.length>n&&(n=v.path.length);let u=a.filter(v=>v.path.length===n),A=v=>v.positionals.filter(({extra:x})=>!x).length+v.options.length,p=u.map(v=>({state:v,positionalCount:A(v)})),h=0;for(let{positionalCount:v}of p)v>h&&(h=v);let E=p.filter(({positionalCount:v})=>v===h).map(({state:v})=>v),I=Vqe(E);if(I.length>1)throw new eP(t,I.map(v=>v.candidateUsage));return I[0]}function Vqe(t){let e=[],r=[];for(let o of t)o.selectedIndex===nd?r.push(o):e.push(o);return r.length>0&&e.push({...mz,path:Ez(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function Ez(t,e,...r){return e===void 0?Array.from(t):Ez(t.filter((o,a)=>o===e[a]),...r)}function el(){return{dynamics:[],shortcuts:[],statics:{}}}function Cz(t){return t===cn.SuccessNode||t===cn.ErrorNode}function MT(t,e=0){return{to:Cz(t.to)?t.to:t.to>=cn.CustomNode?t.to+e-cn.CustomNode+1:t.to+e,reducer:t.reducer}}function Jqe(t,e=0){let r=el();for(let[o,a]of t.dynamics)r.dynamics.push([o,MT(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(MT(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>MT(n,e));return r}function Ss(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function wy(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function Vo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function aP(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,o,a,...u)}else return t[e](r,o,a)}var mz,Xqe,UT,tl,_T,Iy,lP=Et(()=>{$D();tP();mz={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:nd,partial:!1,tokens:[]};Xqe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===o,isBatchOption:(t,e,r,o)=>!t.ignoreOptions&&cz.test(e)&&[...e.slice(1)].every(a=>o.has(`-${a}`)),isBoundOption:(t,e,r,o,a)=>{let n=e.match(PT);return!t.ignoreOptions&&!!n&&ZD.test(n[1])&&o.has(n[1])&&a.filter(u=>u.nameSet.includes(n[1])).every(u=>u.allowBinding)},isNegatedOption:(t,e,r,o)=>!t.ignoreOptions&&e===`--no-${o.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&DT.test(e),isUnsupportedOption:(t,e,r,o)=>!t.ignoreOptions&&e.startsWith("-")&&ZD.test(e)&&!o.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!ZD.test(e)},UT={setCandidateState:(t,e,r,o)=>({...t,...o}),setSelectedIndex:(t,e,r,o)=>({...t,selectedIndex:o}),setPartialIndex:(t,e,r,o)=>({...t,selectedIndex:o,partial:!0}),pushBatch:(t,e,r,o)=>{let a=t.options.slice(),n=t.tokens.slice();for(let u=1;u{let[,o,a]=e.match(PT),n=t.options.concat({name:o,value:a}),u=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,o.length],option:o},{segmentIndex:r,type:"assign",slice:[o.length,o.length+1]},{segmentIndex:r,type:"value",slice:[o.length+1,o.length+a.length+1]}]);return{...t,options:n,tokens:u}},pushPath:(t,e,r)=>{let o=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:o,tokens:a}},pushPositional:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtra:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:tl}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushTrue:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,o)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var o;let a=t.options[t.options.length-1],n=t.options.slice(),u=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((o=a.value)!==null&&o!==void 0?o:[]).concat([e]),{...t,options:n,tokens:u}},setStringValue:(t,e,r)=>{let o=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return o.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,o)=>{let[,,a]=e.match(DT);return typeof a<"u"?{...t,options:[{name:"-c",value:String(o)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(o)}]}},setError:(t,e,r,o)=>e===Hn.EndOfInput||e===Hn.EndOfPartialInput?{...t,errorMessage:`${o}.`}:{...t,errorMessage:`${o} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},tl=Symbol(),_T=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===tl)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==tl?this.arity.extra.push(e):this.arity.extra!==tl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===tl)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 o=0;o1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);let A=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,A);this.options.push({preferredName:A,nameSet:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{preferredName:u,nameSet:A,arity:p,hidden:h,description:E,required:I}of this.options){if(h)continue;let v=[];for(let C=0;C`:`[${x}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===tl?o.push("..."):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=yz(),r=cn.InitialNode,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.nameSet);r=Mc(e,el()),Vo(e,cn.InitialNode,Hn.StartOfInput,r,["setCandidateState",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let v=Mc(e,el());wy(e,p,v),this.registerOptions(e,v),p=v}for(let v=0;v0||!this.arity.proxy){let v=Mc(e,el());Ss(e,p,"isHelp",v,["useHelp",this.cliIndex]),Ss(e,v,"always",v,"pushExtra"),Vo(e,v,Hn.EndOfInput,cn.SuccessNode,["setSelectedIndex",nd]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Vo(e,p,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,p,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let v=0;v0||v+1!==this.arity.leading.length)&&(Vo(e,x,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,x,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex])),Ss(e,h,"isNotOptionLike",x,"pushPositional"),h=x}let E=h;if(this.arity.extra===tl||this.arity.extra.length>0){let v=Mc(e,el());if(wy(e,h,v),this.arity.extra===tl){let x=Mc(e,el());this.arity.proxy||this.registerOptions(e,x),Ss(e,h,n,x,"pushExtraNoLimits"),Ss(e,x,n,x,"pushExtraNoLimits"),wy(e,x,v)}else for(let x=0;x0)&&this.registerOptions(e,C),Ss(e,E,n,C,"pushExtra"),wy(e,C,v),E=C}E=v}this.arity.trailing.length>0&&(Vo(e,E,Hn.EndOfInput,cn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,E,Hn.EndOfPartialInput,cn.SuccessNode,["setPartialIndex",this.cliIndex]));let I=E;for(let v=0;v=0&&e{let u=n?Hn.EndOfPartialInput:Hn.EndOfInput;return Wqe(o,a,{endToken:u})}}}}});function Iz(){return cP.default&&"getColorDepth"in cP.default.WriteStream.prototype?cP.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function Bz(t){let e=wz;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=ve("async_hooks");e=wz=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var cP,wz,vz=Et(()=>{cP=$e(ve("tty"),1)});var By,Dz=Et(()=>{Vp();By=class extends nt{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new By(r);o.path=e.path;for(let a of e.options)switch(a.name){case"-c":o.commands.push(Number(a.value));break;case"-i":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}}});async function bz(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=kz(t);return as.from(r,e).runExit(o,a)}async function xz(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=kz(t);return as.from(r,e).run(o,a)}function kz(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof nt||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof nt||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function Sz(t){return t()}var Pz,as,Qz=Et(()=>{$D();lP();kT();vz();Vp();Dz();Pz=Symbol("clipanion/errorCommand");as=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new Iy({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new as(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[nt.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<"u")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:u,process:A}=this.builder.compile(),p=A(o,{partial:n}),h={...as.defaultContext,...a};switch(p.selectedIndex){case nd:{let E=By.from(p,u);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=u[p.selectedIndex],I=this.registrations.get(E);if(typeof I>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let v=new E;v.context=h,v.tokens=p.tokens,v.path=p.path;try{for(let[x,{transformer:C}]of I.specs.entries())v[x]=C(I.builder,x,p,h);return v}catch(x){throw x[Pz]=v,x}}break}}async run(e,r){var o,a;let n,u={...as.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,I)=>this.error(E,I),format:E=>this.format(E),process:(E,I)=>this.process(E,{...u,...I}),run:(E,I)=>this.run(E,{...u,...I}),usage:(E,I)=>this.usage(E,I)};let p=this.enableCapture&&(a=Bz(u))!==null&&a!==void 0?a:Sz,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),u=typeof e.usage.category<"u"?Do(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,A=typeof e.usage.description<"u"?Do(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?Do(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,I])=>[Do(E,{format:this.format(r),paragraphs:!1}),I.replace(/\$0/g,this.binaryName)]):void 0;return{path:o,usage:a,category:u,description:A,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations.keys()){let a=this.definition(o,{colored:e});!a||r.push(a)}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(x=>x.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof nt?e.constructor:e,A="";if(u)if(o){let{description:p="",details:h="",examples:E=[]}=u.usage||{};p!==""&&(A+=Do(p,{format:this.format(r),paragraphs:!1}).replace(/^./,x=>x.toUpperCase()),A+=` +`),(h!==""||E.length>0)&&(A+=`${this.format(r).header("Usage")} +`,A+=` +`);let{usage:I,options:v}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${I} +`,v.length>0){A+=` +`,A+=`${this.format(r).header("Options")} +`;let x=v.reduce((C,R)=>Math.max(C,R.definition.length),0);A+=` +`;for(let{definition:C,description:R}of v)A+=` ${this.format(r).bold(C.padEnd(x))} ${Do(R,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(A+=` +`,A+=`${this.format(r).header("Details")} +`,A+=` +`,A+=Do(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=` +`,A+=`${this.format(r).header("Examples")} +`;for(let[x,C]of E)A+=` +`,A+=Do(x,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p} +`}else{let p=new Map;for(let[v,{index:x}]of this.registrations.entries()){if(typeof v.usage>"u")continue;let C=typeof v.usage.category<"u"?Do(v.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(C);typeof R>"u"&&p.set(C,R=[]);let{usage:N}=this.getUsageByIndex(x);R.push({commandClass:v,usage:N})}let h=Array.from(p.keys()).sort((v,x)=>v===null?-1:x===null?1:v.localeCompare(x,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",I=typeof this.binaryVersion<"u";E||I?(E&&I?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)} +`:A+=`${this.format(r).header(`${this.binaryVersion}`)} +`,A+=` ${this.format(r).bold(a)}${this.binaryName} +`):A+=`${this.format(r).bold(a)}${this.binaryName} +`;for(let v of h){let x=p.get(v).slice().sort((R,N)=>R.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),C=v!==null?v.trim():"General commands";A+=` +`,A+=`${this.format(r).header(`${C}`)} +`;for(let{commandClass:R,usage:N}of x){let U=R.usage.description||"undocumented";A+=` +`,A+=` ${this.format(r).bold(N)} +`,A+=` ${Do(U,{format:this.format(r),paragraphs:!1})}`}}A+=` +`,A+=Do("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[Pz])!==null&&o!==void 0?o:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u="",A=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");A==="Error"&&(A="Internal Error"),u+=`${this.format(a).error(A)}: ${e.message} +`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(u+=` +`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\n/,"")} +`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:as.defaultContext.colorDepth>1)?uz:Az}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};as.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:Iz()}});var uI,Fz=Et(()=>{Vp();uI=class extends nt{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};uI.paths=[["--clipanion=definitions"]]});var AI,Rz=Et(()=>{Vp();AI=class extends nt{async execute(){this.context.stdout.write(this.cli.usage())}};AI.paths=[["-h"],["--help"]]});function uP(t={}){return Ko({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var HT=Et(()=>{Ef()});var fI,Tz=Et(()=>{Vp();HT();fI=class extends nt{constructor(){super(...arguments),this.args=uP()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} +`)}};fI.paths=[["--clipanion=tokens"]]});var pI,Lz=Et(()=>{Vp();pI=class extends nt{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};pI.paths=[["-v"],["--version"]]});var qT={};zt(qT,{DefinitionsCommand:()=>uI,HelpCommand:()=>AI,TokensCommand:()=>fI,VersionCommand:()=>pI});var Nz=Et(()=>{Fz();Rz();Tz();Lz()});function Oz(t,e,r){let[o,a]=ju(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Ko({definition(p){p.addOption({names:u,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let I,v=typeof o<"u"?[...o]:void 0;for(let{name:x,value:C}of E.options)!A.has(x)||(I=x,v=v??[],v.push(C));return typeof v<"u"?id(I??h,v,a.validator):v}})}var Mz=Et(()=>{Ef()});function Uz(t,e,r){let[o,a]=ju(e,r??{}),n=t.split(","),u=new Set(n);return Ko({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)!u.has(I)||(E=v);return E}})}var _z=Et(()=>{Ef()});function Hz(t,e,r){let[o,a]=ju(e,r??{}),n=t.split(","),u=new Set(n);return Ko({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)!u.has(I)||(E??(E=0),v?E+=1:E=0);return E}})}var qz=Et(()=>{Ef()});function Gz(t={}){return Ko({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===tl||A.extra===!1&&uu)}})}var jz=Et(()=>{lP();Ef()});function Zqe(t,e,r){let[o,a]=ju(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Ko({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,I){let v,x=o;typeof a.env<"u"&&I.env[a.env]&&(v=a.env,x=I.env[a.env]);for(let{name:C,value:R}of E.options)!A.has(C)||(v=C,x=R);return typeof x=="string"?id(v??h,x,a.validator):x}})}function $qe(t={}){let{required:e=!0}=t;return Ko({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u{lP();Ef()});var ge={};zt(ge,{Array:()=>Oz,Boolean:()=>Uz,Counter:()=>Hz,Proxy:()=>uP,Rest:()=>Gz,String:()=>Yz,applyValidator:()=>id,cleanValidationError:()=>rP,formatError:()=>iI,isOptionSymbol:()=>nI,makeCommandOption:()=>Ko,rerouteArguments:()=>ju});var Kz=Et(()=>{Ef();HT();Mz();_z();qz();jz();Wz()});var hI={};zt(hI,{Builtins:()=>qT,Cli:()=>as,Command:()=>nt,Option:()=>ge,UsageError:()=>it,formatMarkdownish:()=>Do,run:()=>xz,runExit:()=>bz});var qt=Et(()=>{tP();kT();Vp();Qz();Nz();Kz()});var zz=_((bkt,eGe)=>{eGe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var Zz=_((xkt,Cf)=>{var Vz=ve("fs"),jT=ve("path"),tGe=ve("os"),rGe=ve("crypto"),nGe=zz(),YT=nGe.version,iGe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function sGe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,` +`);let o;for(;(o=iGe.exec(r))!=null;){let a=o[1],n=o[2]||"";n=n.trim();let u=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),u==='"'&&(n=n.replace(/\\n/g,` +`),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function oGe(t){let e=Xz(t),r=bs.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let o=Jz(t).split(","),a=o.length,n;for(let u=0;u=a)throw A}return bs.parse(n)}function aGe(t){console.log(`[dotenv@${YT}][INFO] ${t}`)}function lGe(t){console.log(`[dotenv@${YT}][WARN] ${t}`)}function GT(t){console.log(`[dotenv@${YT}][DEBUG] ${t}`)}function Jz(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function cGe(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):A}let o=r.password;if(!o)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,u=t.parsed[n];if(!u)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:u,key:o}}function Xz(t){let e=jT.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function uGe(t){return t[0]==="~"?jT.join(tGe.homedir(),t.slice(1)):t}function AGe(t){aGe("Loading env from encrypted .env.vault");let e=bs._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),bs.populate(r,e,t),{parsed:e}}function fGe(t){let e=jT.resolve(process.cwd(),".env"),r="utf8",o=Boolean(t&&t.debug);t&&(t.path!=null&&(e=uGe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=bs.parse(Vz.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),bs.populate(n,a,t),{parsed:a}}catch(a){return o&>(`Failed to load ${e} ${a.message}`),{error:a}}}function pGe(t){let e=Xz(t);return Jz(t).length===0?bs.configDotenv(t):Vz.existsSync(e)?bs._configVault(t):(lGe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),bs.configDotenv(t))}function hGe(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,"base64"),a=o.slice(0,12),n=o.slice(-16);o=o.slice(12,-16);try{let u=rGe.createDecipheriv("aes-256-gcm",r,a);return u.setAuthTag(n),`${u.update(o)}${u.final()}`}catch(u){let A=u instanceof RangeError,p=u.message==="Invalid key length",h=u.message==="Unsupported state or unable to authenticate data";if(A||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",u.code),console.error("Error: ",u.message),u}}function gGe(t,e,r={}){let o=Boolean(r&&r.debug),a=Boolean(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),o&>(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var bs={configDotenv:fGe,_configVault:AGe,_parseVault:oGe,config:pGe,decrypt:hGe,parse:sGe,populate:gGe};Cf.exports.configDotenv=bs.configDotenv;Cf.exports._configVault=bs._configVault;Cf.exports._parseVault=bs._parseVault;Cf.exports.config=bs.config;Cf.exports.decrypt=bs.decrypt;Cf.exports.parse=bs.parse;Cf.exports.populate=bs.populate;Cf.exports=bs});var eV=_((kkt,$z)=>{"use strict";$z.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var sd=_((Qkt,WT)=>{"use strict";var dGe=eV(),tV=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=dGe(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{rnew Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};WT.exports=tV;WT.exports.default=tV});function Ku(t){return`YN${t.toString(10).padStart(4,"0")}`}function AP(t){let e=Number(t.slice(2));if(typeof wr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var wr,fP=Et(()=>{wr=(Oe=>(Oe[Oe.UNNAMED=0]="UNNAMED",Oe[Oe.EXCEPTION=1]="EXCEPTION",Oe[Oe.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Oe[Oe.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Oe[Oe.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Oe[Oe.BUILD_DISABLED=5]="BUILD_DISABLED",Oe[Oe.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Oe[Oe.MUST_BUILD=7]="MUST_BUILD",Oe[Oe.MUST_REBUILD=8]="MUST_REBUILD",Oe[Oe.BUILD_FAILED=9]="BUILD_FAILED",Oe[Oe.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Oe[Oe.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Oe[Oe.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Oe[Oe.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Oe[Oe.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Oe[Oe.REMOTE_INVALID=15]="REMOTE_INVALID",Oe[Oe.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Oe[Oe.RESOLUTION_PACK=17]="RESOLUTION_PACK",Oe[Oe.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Oe[Oe.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Oe[Oe.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Oe[Oe.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Oe[Oe.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Oe[Oe.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Oe[Oe.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Oe[Oe.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Oe[Oe.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Oe[Oe.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Oe[Oe.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Oe[Oe.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Oe[Oe.FETCH_FAILED=30]="FETCH_FAILED",Oe[Oe.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Oe[Oe.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Oe[Oe.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Oe[Oe.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Oe[Oe.NETWORK_ERROR=35]="NETWORK_ERROR",Oe[Oe.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Oe[Oe.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Oe[Oe.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Oe[Oe.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Oe[Oe.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Oe[Oe.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Oe[Oe.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Oe[Oe.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Oe[Oe.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Oe[Oe.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Oe[Oe.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Oe[Oe.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Oe[Oe.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Oe[Oe.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Oe[Oe.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Oe[Oe.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Oe[Oe.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Oe[Oe.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Oe[Oe.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Oe[Oe.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Oe[Oe.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Oe[Oe.INVALID_MANIFEST=57]="INVALID_MANIFEST",Oe[Oe.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Oe[Oe.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Oe[Oe.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Oe[Oe.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Oe[Oe.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Oe[Oe.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Oe[Oe.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Oe[Oe.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Oe[Oe.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Oe[Oe.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Oe[Oe.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Oe[Oe.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Oe[Oe.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Oe[Oe.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Oe[Oe.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Oe[Oe.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Oe[Oe.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Oe[Oe.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Oe[Oe.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Oe[Oe.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Oe[Oe.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Oe[Oe.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Oe[Oe.NETWORK_DISABLED=80]="NETWORK_DISABLED",Oe[Oe.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Oe[Oe.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Oe[Oe.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Oe[Oe.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Oe[Oe.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Oe[Oe.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Oe[Oe.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Oe[Oe.VERSION_NOTICE=88]="VERSION_NOTICE",Oe[Oe.TIPS_NOTICE=89]="TIPS_NOTICE",Oe[Oe.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Oe))(wr||{})});var gI=_((Rkt,rV)=>{var mGe="2.0.0",yGe=Number.MAX_SAFE_INTEGER||9007199254740991,EGe=16,CGe=256-6,wGe=["major","premajor","minor","preminor","patch","prepatch","prerelease"];rV.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:EGe,MAX_SAFE_BUILD_LENGTH:CGe,MAX_SAFE_INTEGER:yGe,RELEASE_TYPES:wGe,SEMVER_SPEC_VERSION:mGe,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var dI=_((Tkt,nV)=>{var IGe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};nV.exports=IGe});var vy=_((wf,iV)=>{var{MAX_SAFE_COMPONENT_LENGTH:KT,MAX_SAFE_BUILD_LENGTH:BGe,MAX_LENGTH:vGe}=gI(),DGe=dI();wf=iV.exports={};var PGe=wf.re=[],SGe=wf.safeRe=[],lr=wf.src=[],cr=wf.t={},bGe=0,zT="[a-zA-Z0-9-]",xGe=[["\\s",1],["\\d",vGe],[zT,BGe]],kGe=t=>{for(let[e,r]of xGe)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Vr=(t,e,r)=>{let o=kGe(e),a=bGe++;DGe(t,a,e),cr[t]=a,lr[a]=e,PGe[a]=new RegExp(e,r?"g":void 0),SGe[a]=new RegExp(o,r?"g":void 0)};Vr("NUMERICIDENTIFIER","0|[1-9]\\d*");Vr("NUMERICIDENTIFIERLOOSE","\\d+");Vr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${zT}*`);Vr("MAINVERSION",`(${lr[cr.NUMERICIDENTIFIER]})\\.(${lr[cr.NUMERICIDENTIFIER]})\\.(${lr[cr.NUMERICIDENTIFIER]})`);Vr("MAINVERSIONLOOSE",`(${lr[cr.NUMERICIDENTIFIERLOOSE]})\\.(${lr[cr.NUMERICIDENTIFIERLOOSE]})\\.(${lr[cr.NUMERICIDENTIFIERLOOSE]})`);Vr("PRERELEASEIDENTIFIER",`(?:${lr[cr.NUMERICIDENTIFIER]}|${lr[cr.NONNUMERICIDENTIFIER]})`);Vr("PRERELEASEIDENTIFIERLOOSE",`(?:${lr[cr.NUMERICIDENTIFIERLOOSE]}|${lr[cr.NONNUMERICIDENTIFIER]})`);Vr("PRERELEASE",`(?:-(${lr[cr.PRERELEASEIDENTIFIER]}(?:\\.${lr[cr.PRERELEASEIDENTIFIER]})*))`);Vr("PRERELEASELOOSE",`(?:-?(${lr[cr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${lr[cr.PRERELEASEIDENTIFIERLOOSE]})*))`);Vr("BUILDIDENTIFIER",`${zT}+`);Vr("BUILD",`(?:\\+(${lr[cr.BUILDIDENTIFIER]}(?:\\.${lr[cr.BUILDIDENTIFIER]})*))`);Vr("FULLPLAIN",`v?${lr[cr.MAINVERSION]}${lr[cr.PRERELEASE]}?${lr[cr.BUILD]}?`);Vr("FULL",`^${lr[cr.FULLPLAIN]}$`);Vr("LOOSEPLAIN",`[v=\\s]*${lr[cr.MAINVERSIONLOOSE]}${lr[cr.PRERELEASELOOSE]}?${lr[cr.BUILD]}?`);Vr("LOOSE",`^${lr[cr.LOOSEPLAIN]}$`);Vr("GTLT","((?:<|>)?=?)");Vr("XRANGEIDENTIFIERLOOSE",`${lr[cr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Vr("XRANGEIDENTIFIER",`${lr[cr.NUMERICIDENTIFIER]}|x|X|\\*`);Vr("XRANGEPLAIN",`[v=\\s]*(${lr[cr.XRANGEIDENTIFIER]})(?:\\.(${lr[cr.XRANGEIDENTIFIER]})(?:\\.(${lr[cr.XRANGEIDENTIFIER]})(?:${lr[cr.PRERELEASE]})?${lr[cr.BUILD]}?)?)?`);Vr("XRANGEPLAINLOOSE",`[v=\\s]*(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${lr[cr.XRANGEIDENTIFIERLOOSE]})(?:${lr[cr.PRERELEASELOOSE]})?${lr[cr.BUILD]}?)?)?`);Vr("XRANGE",`^${lr[cr.GTLT]}\\s*${lr[cr.XRANGEPLAIN]}$`);Vr("XRANGELOOSE",`^${lr[cr.GTLT]}\\s*${lr[cr.XRANGEPLAINLOOSE]}$`);Vr("COERCE",`(^|[^\\d])(\\d{1,${KT}})(?:\\.(\\d{1,${KT}}))?(?:\\.(\\d{1,${KT}}))?(?:$|[^\\d])`);Vr("COERCERTL",lr[cr.COERCE],!0);Vr("LONETILDE","(?:~>?)");Vr("TILDETRIM",`(\\s*)${lr[cr.LONETILDE]}\\s+`,!0);wf.tildeTrimReplace="$1~";Vr("TILDE",`^${lr[cr.LONETILDE]}${lr[cr.XRANGEPLAIN]}$`);Vr("TILDELOOSE",`^${lr[cr.LONETILDE]}${lr[cr.XRANGEPLAINLOOSE]}$`);Vr("LONECARET","(?:\\^)");Vr("CARETTRIM",`(\\s*)${lr[cr.LONECARET]}\\s+`,!0);wf.caretTrimReplace="$1^";Vr("CARET",`^${lr[cr.LONECARET]}${lr[cr.XRANGEPLAIN]}$`);Vr("CARETLOOSE",`^${lr[cr.LONECARET]}${lr[cr.XRANGEPLAINLOOSE]}$`);Vr("COMPARATORLOOSE",`^${lr[cr.GTLT]}\\s*(${lr[cr.LOOSEPLAIN]})$|^$`);Vr("COMPARATOR",`^${lr[cr.GTLT]}\\s*(${lr[cr.FULLPLAIN]})$|^$`);Vr("COMPARATORTRIM",`(\\s*)${lr[cr.GTLT]}\\s*(${lr[cr.LOOSEPLAIN]}|${lr[cr.XRANGEPLAIN]})`,!0);wf.comparatorTrimReplace="$1$2$3";Vr("HYPHENRANGE",`^\\s*(${lr[cr.XRANGEPLAIN]})\\s+-\\s+(${lr[cr.XRANGEPLAIN]})\\s*$`);Vr("HYPHENRANGELOOSE",`^\\s*(${lr[cr.XRANGEPLAINLOOSE]})\\s+-\\s+(${lr[cr.XRANGEPLAINLOOSE]})\\s*$`);Vr("STAR","(<|>)?=?\\s*\\*");Vr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Vr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var pP=_((Lkt,sV)=>{var QGe=Object.freeze({loose:!0}),FGe=Object.freeze({}),RGe=t=>t?typeof t!="object"?QGe:t:FGe;sV.exports=RGe});var VT=_((Nkt,lV)=>{var oV=/^[0-9]+$/,aV=(t,e)=>{let r=oV.test(t),o=oV.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:taV(e,t);lV.exports={compareIdentifiers:aV,rcompareIdentifiers:TGe}});var Po=_((Okt,fV)=>{var hP=dI(),{MAX_LENGTH:cV,MAX_SAFE_INTEGER:gP}=gI(),{safeRe:uV,t:AV}=vy(),LGe=pP(),{compareIdentifiers:Dy}=VT(),rl=class{constructor(e,r){if(r=LGe(r),e instanceof rl){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>cV)throw new TypeError(`version is longer than ${cV} characters`);hP("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?uV[AV.LOOSE]:uV[AV.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>gP||this.major<0)throw new TypeError("Invalid major version");if(this.minor>gP||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>gP||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&o===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];o===!1&&(n=[r]),Dy(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};fV.exports=rl});var od=_((Mkt,hV)=>{var pV=Po(),NGe=(t,e,r=!1)=>{if(t instanceof pV)return t;try{return new pV(t,e)}catch(o){if(!r)return null;throw o}};hV.exports=NGe});var dV=_((Ukt,gV)=>{var OGe=od(),MGe=(t,e)=>{let r=OGe(t,e);return r?r.version:null};gV.exports=MGe});var yV=_((_kt,mV)=>{var UGe=od(),_Ge=(t,e)=>{let r=UGe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};mV.exports=_Ge});var wV=_((Hkt,CV)=>{var EV=Po(),HGe=(t,e,r,o,a)=>{typeof r=="string"&&(a=o,o=r,r=void 0);try{return new EV(t instanceof EV?t.version:t,r).inc(e,o,a).version}catch{return null}};CV.exports=HGe});var vV=_((qkt,BV)=>{var IV=od(),qGe=(t,e)=>{let r=IV(t,null,!0),o=IV(e,null,!0),a=r.compare(o);if(a===0)return null;let n=a>0,u=n?r:o,A=n?o:r,p=!!u.prerelease.length;if(!!A.prerelease.length&&!p)return!A.patch&&!A.minor?"major":u.patch?"patch":u.minor?"minor":"major";let E=p?"pre":"";return r.major!==o.major?E+"major":r.minor!==o.minor?E+"minor":r.patch!==o.patch?E+"patch":"prerelease"};BV.exports=qGe});var PV=_((Gkt,DV)=>{var GGe=Po(),jGe=(t,e)=>new GGe(t,e).major;DV.exports=jGe});var bV=_((jkt,SV)=>{var YGe=Po(),WGe=(t,e)=>new YGe(t,e).minor;SV.exports=WGe});var kV=_((Ykt,xV)=>{var KGe=Po(),zGe=(t,e)=>new KGe(t,e).patch;xV.exports=zGe});var FV=_((Wkt,QV)=>{var VGe=od(),JGe=(t,e)=>{let r=VGe(t,e);return r&&r.prerelease.length?r.prerelease:null};QV.exports=JGe});var Ol=_((Kkt,TV)=>{var RV=Po(),XGe=(t,e,r)=>new RV(t,r).compare(new RV(e,r));TV.exports=XGe});var NV=_((zkt,LV)=>{var ZGe=Ol(),$Ge=(t,e,r)=>ZGe(e,t,r);LV.exports=$Ge});var MV=_((Vkt,OV)=>{var eje=Ol(),tje=(t,e)=>eje(t,e,!0);OV.exports=tje});var dP=_((Jkt,_V)=>{var UV=Po(),rje=(t,e,r)=>{let o=new UV(t,r),a=new UV(e,r);return o.compare(a)||o.compareBuild(a)};_V.exports=rje});var qV=_((Xkt,HV)=>{var nje=dP(),ije=(t,e)=>t.sort((r,o)=>nje(r,o,e));HV.exports=ije});var jV=_((Zkt,GV)=>{var sje=dP(),oje=(t,e)=>t.sort((r,o)=>sje(o,r,e));GV.exports=oje});var mI=_(($kt,YV)=>{var aje=Ol(),lje=(t,e,r)=>aje(t,e,r)>0;YV.exports=lje});var mP=_((eQt,WV)=>{var cje=Ol(),uje=(t,e,r)=>cje(t,e,r)<0;WV.exports=uje});var JT=_((tQt,KV)=>{var Aje=Ol(),fje=(t,e,r)=>Aje(t,e,r)===0;KV.exports=fje});var XT=_((rQt,zV)=>{var pje=Ol(),hje=(t,e,r)=>pje(t,e,r)!==0;zV.exports=hje});var yP=_((nQt,VV)=>{var gje=Ol(),dje=(t,e,r)=>gje(t,e,r)>=0;VV.exports=dje});var EP=_((iQt,JV)=>{var mje=Ol(),yje=(t,e,r)=>mje(t,e,r)<=0;JV.exports=yje});var ZT=_((sQt,XV)=>{var Eje=JT(),Cje=XT(),wje=mI(),Ije=yP(),Bje=mP(),vje=EP(),Dje=(t,e,r,o)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return Eje(t,r,o);case"!=":return Cje(t,r,o);case">":return wje(t,r,o);case">=":return Ije(t,r,o);case"<":return Bje(t,r,o);case"<=":return vje(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};XV.exports=Dje});var $V=_((oQt,ZV)=>{var Pje=Po(),Sje=od(),{safeRe:CP,t:wP}=vy(),bje=(t,e)=>{if(t instanceof Pje)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(CP[wP.COERCE]);else{let o;for(;(o=CP[wP.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||o.index+o[0].length!==r.index+r[0].length)&&(r=o),CP[wP.COERCERTL].lastIndex=o.index+o[1].length+o[2].length;CP[wP.COERCERTL].lastIndex=-1}return r===null?null:Sje(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};ZV.exports=bje});var tJ=_((aQt,eJ)=>{"use strict";eJ.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var IP=_((lQt,rJ)=>{"use strict";rJ.exports=Cn;Cn.Node=ad;Cn.create=Cn;function Cn(t){var e=this;if(e instanceof Cn||(e=new Cn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};Cn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};Cn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Cn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Cn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Cn;if(ethis.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&othis.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};Cn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o{"use strict";var Fje=IP(),ld=Symbol("max"),Bf=Symbol("length"),Py=Symbol("lengthCalculator"),EI=Symbol("allowStale"),cd=Symbol("maxAge"),If=Symbol("dispose"),nJ=Symbol("noDisposeOnSet"),xs=Symbol("lruList"),Uc=Symbol("cache"),sJ=Symbol("updateAgeOnGet"),$T=()=>1,tL=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[ld]=e.max||1/0,o=e.length||$T;if(this[Py]=typeof o!="function"?$T:o,this[EI]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[cd]=e.maxAge||0,this[If]=e.dispose,this[nJ]=e.noDisposeOnSet||!1,this[sJ]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[ld]=e||1/0,yI(this)}get max(){return this[ld]}set allowStale(e){this[EI]=!!e}get allowStale(){return this[EI]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[cd]=e,yI(this)}get maxAge(){return this[cd]}set lengthCalculator(e){typeof e!="function"&&(e=$T),e!==this[Py]&&(this[Py]=e,this[Bf]=0,this[xs].forEach(r=>{r.length=this[Py](r.value,r.key),this[Bf]+=r.length})),yI(this)}get lengthCalculator(){return this[Py]}get length(){return this[Bf]}get itemCount(){return this[xs].length}rforEach(e,r){r=r||this;for(let o=this[xs].tail;o!==null;){let a=o.prev;iJ(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[xs].head;o!==null;){let a=o.next;iJ(this,e,o,r),o=a}}keys(){return this[xs].toArray().map(e=>e.key)}values(){return this[xs].toArray().map(e=>e.value)}reset(){this[If]&&this[xs]&&this[xs].length&&this[xs].forEach(e=>this[If](e.key,e.value)),this[Uc]=new Map,this[xs]=new Fje,this[Bf]=0}dump(){return this[xs].map(e=>BP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[xs]}set(e,r,o){if(o=o||this[cd],o&&typeof o!="number")throw new TypeError("maxAge must be a number");let a=o?Date.now():0,n=this[Py](r,e);if(this[Uc].has(e)){if(n>this[ld])return Sy(this,this[Uc].get(e)),!1;let p=this[Uc].get(e).value;return this[If]&&(this[nJ]||this[If](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[Bf]+=n-p.length,p.length=n,this.get(e),yI(this),!0}let u=new rL(e,r,n,a,o);return u.length>this[ld]?(this[If]&&this[If](e,r),!1):(this[Bf]+=u.length,this[xs].unshift(u),this[Uc].set(e,this[xs].head),yI(this),!0)}has(e){if(!this[Uc].has(e))return!1;let r=this[Uc].get(e).value;return!BP(this,r)}get(e){return eL(this,e,!0)}peek(e){return eL(this,e,!1)}pop(){let e=this[xs].tail;return e?(Sy(this,e),e.value):null}del(e){Sy(this,this[Uc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[Uc].forEach((e,r)=>eL(this,r,!1))}},eL=(t,e,r)=>{let o=t[Uc].get(e);if(o){let a=o.value;if(BP(t,a)){if(Sy(t,o),!t[EI])return}else r&&(t[sJ]&&(o.value.now=Date.now()),t[xs].unshiftNode(o));return a.value}},BP=(t,e)=>{if(!e||!e.maxAge&&!t[cd])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[cd]&&r>t[cd]},yI=t=>{if(t[Bf]>t[ld])for(let e=t[xs].tail;t[Bf]>t[ld]&&e!==null;){let r=e.prev;Sy(t,e),e=r}},Sy=(t,e)=>{if(e){let r=e.value;t[If]&&t[If](r.key,r.value),t[Bf]-=r.length,t[Uc].delete(r.key),t[xs].removeNode(e)}},rL=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},iJ=(t,e,r,o)=>{let a=r.value;BP(t,a)&&(Sy(t,r),t[EI]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};oJ.exports=tL});var Ml=_((uQt,AJ)=>{var ud=class{constructor(e,r){if(r=Tje(r),e instanceof ud)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new ud(e.raw,r);if(e instanceof nL)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!cJ(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&Hje(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){let o=((this.options.includePrerelease&&Uje)|(this.options.loose&&_je))+":"+e,a=lJ.get(o);if(a)return a;let n=this.options.loose,u=n?Da[Jo.HYPHENRANGELOOSE]:Da[Jo.HYPHENRANGE];e=e.replace(u,Xje(this.options.includePrerelease)),ci("hyphen replace",e),e=e.replace(Da[Jo.COMPARATORTRIM],Nje),ci("comparator trim",e),e=e.replace(Da[Jo.TILDETRIM],Oje),ci("tilde trim",e),e=e.replace(Da[Jo.CARETTRIM],Mje),ci("caret trim",e);let A=e.split(" ").map(I=>qje(I,this.options)).join(" ").split(/\s+/).map(I=>Jje(I,this.options));n&&(A=A.filter(I=>(ci("loose invalid filter",I,this.options),!!I.match(Da[Jo.COMPARATORLOOSE])))),ci("range list",A);let p=new Map,h=A.map(I=>new nL(I,this.options));for(let I of h){if(cJ(I))return[I];p.set(I.value,I)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return lJ.set(o,E),E}intersects(e,r){if(!(e instanceof ud))throw new TypeError("a Range is required");return this.set.some(o=>uJ(o,r)&&e.set.some(a=>uJ(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Lje(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",Hje=t=>t.value==="",uJ=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},qje=(t,e)=>(ci("comp",t,e),t=Yje(t,e),ci("caret",t),t=Gje(t,e),ci("tildes",t),t=Kje(t,e),ci("xrange",t),t=Vje(t,e),ci("stars",t),t),Xo=t=>!t||t.toLowerCase()==="x"||t==="*",Gje=(t,e)=>t.trim().split(/\s+/).map(r=>jje(r,e)).join(" "),jje=(t,e)=>{let r=e.loose?Da[Jo.TILDELOOSE]:Da[Jo.TILDE];return t.replace(r,(o,a,n,u,A)=>{ci("tilde",t,o,a,n,u,A);let p;return Xo(a)?p="":Xo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Xo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(ci("replaceTilde pr",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,ci("tilde return",p),p})},Yje=(t,e)=>t.trim().split(/\s+/).map(r=>Wje(r,e)).join(" "),Wje=(t,e)=>{ci("caret",t,e);let r=e.loose?Da[Jo.CARETLOOSE]:Da[Jo.CARET],o=e.includePrerelease?"-0":"";return t.replace(r,(a,n,u,A,p)=>{ci("caret",t,a,n,u,A,p);let h;return Xo(n)?h="":Xo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:Xo(A)?n==="0"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(ci("replaceCaret pr",p),n==="0"?u==="0"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(ci("no pr"),n==="0"?u==="0"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),ci("caret return",h),h})},Kje=(t,e)=>(ci("replaceXRanges",t,e),t.split(/\s+/).map(r=>zje(r,e)).join(" ")),zje=(t,e)=>{t=t.trim();let r=e.loose?Da[Jo.XRANGELOOSE]:Da[Jo.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{ci("xRange",t,o,a,n,u,A,p);let h=Xo(n),E=h||Xo(u),I=E||Xo(A),v=I;return a==="="&&v&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?o="<0.0.0-0":o="*":a&&v?(E&&(u=0),A=0,a===">"?(a=">=",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a==="<="&&(a="<",E?n=+n+1:u=+u+1),a==="<"&&(p="-0"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:I&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),ci("xRange return",o),o})},Vje=(t,e)=>(ci("replaceStars",t,e),t.trim().replace(Da[Jo.STAR],"")),Jje=(t,e)=>(ci("replaceGTE0",t,e),t.trim().replace(Da[e.includePrerelease?Jo.GTE0PRE:Jo.GTE0],"")),Xje=t=>(e,r,o,a,n,u,A,p,h,E,I,v,x)=>(Xo(o)?r="":Xo(a)?r=`>=${o}.0.0${t?"-0":""}`:Xo(n)?r=`>=${o}.${a}.0${t?"-0":""}`:u?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Xo(h)?p="":Xo(E)?p=`<${+h+1}.0.0-0`:Xo(I)?p=`<${h}.${+E+1}.0-0`:v?p=`<=${h}.${E}.${I}-${v}`:t?p=`<${h}.${E}.${+I+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),Zje=(t,e,r)=>{for(let o=0;o0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var CI=_((AQt,mJ)=>{var wI=Symbol("SemVer ANY"),by=class{static get ANY(){return wI}constructor(e,r){if(r=fJ(r),e instanceof by){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),sL("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===wI?this.value="":this.value=this.operator+this.semver.version,sL("comp",this)}parse(e){let r=this.options.loose?pJ[hJ.COMPARATORLOOSE]:pJ[hJ.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:"",this.operator==="="&&(this.operator=""),o[2]?this.semver=new gJ(o[2],this.options.loose):this.semver=wI}toString(){return this.value}test(e){if(sL("Comparator.test",e,this.options.loose),this.semver===wI||e===wI)return!0;if(typeof e=="string")try{e=new gJ(e,this.options)}catch{return!1}return iL(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof by))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new dJ(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new dJ(this.value,r).test(e.semver):(r=fJ(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||iL(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||iL(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};mJ.exports=by;var fJ=pP(),{safeRe:pJ,t:hJ}=vy(),iL=ZT(),sL=dI(),gJ=Po(),dJ=Ml()});var II=_((fQt,yJ)=>{var $je=Ml(),e9e=(t,e,r)=>{try{e=new $je(e,r)}catch{return!1}return e.test(t)};yJ.exports=e9e});var CJ=_((pQt,EJ)=>{var t9e=Ml(),r9e=(t,e)=>new t9e(t,e).set.map(r=>r.map(o=>o.value).join(" ").trim().split(" "));EJ.exports=r9e});var IJ=_((hQt,wJ)=>{var n9e=Po(),i9e=Ml(),s9e=(t,e,r)=>{let o=null,a=null,n=null;try{n=new i9e(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new n9e(o,r))}),o};wJ.exports=s9e});var vJ=_((gQt,BJ)=>{var o9e=Po(),a9e=Ml(),l9e=(t,e,r)=>{let o=null,a=null,n=null;try{n=new a9e(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new o9e(o,r))}),o};BJ.exports=l9e});var SJ=_((dQt,PJ)=>{var oL=Po(),c9e=Ml(),DJ=mI(),u9e=(t,e)=>{t=new c9e(t,e);let r=new oL("0.0.0");if(t.test(r)||(r=new oL("0.0.0-0"),t.test(r)))return r;r=null;for(let o=0;o{let A=new oL(u.semver.version);switch(u.operator){case">":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case"":case">=":(!n||DJ(A,n))&&(n=A);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||DJ(r,n))&&(r=n)}return r&&t.test(r)?r:null};PJ.exports=u9e});var xJ=_((mQt,bJ)=>{var A9e=Ml(),f9e=(t,e)=>{try{return new A9e(t,e).range||"*"}catch{return null}};bJ.exports=f9e});var vP=_((yQt,RJ)=>{var p9e=Po(),FJ=CI(),{ANY:h9e}=FJ,g9e=Ml(),d9e=II(),kJ=mI(),QJ=mP(),m9e=EP(),y9e=yP(),E9e=(t,e,r,o)=>{t=new p9e(t,o),e=new g9e(e,o);let a,n,u,A,p;switch(r){case">":a=kJ,n=m9e,u=QJ,A=">",p=">=";break;case"<":a=QJ,n=y9e,u=kJ,A="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(d9e(t,e,o))return!1;for(let h=0;h{x.semver===h9e&&(x=new FJ(">=0.0.0")),I=I||x,v=v||x,a(x.semver,I.semver,o)?I=x:u(x.semver,v.semver,o)&&(v=x)}),I.operator===A||I.operator===p||(!v.operator||v.operator===A)&&n(t,v.semver))return!1;if(v.operator===p&&u(t,v.semver))return!1}return!0};RJ.exports=E9e});var LJ=_((EQt,TJ)=>{var C9e=vP(),w9e=(t,e,r)=>C9e(t,e,">",r);TJ.exports=w9e});var OJ=_((CQt,NJ)=>{var I9e=vP(),B9e=(t,e,r)=>I9e(t,e,"<",r);NJ.exports=B9e});var _J=_((wQt,UJ)=>{var MJ=Ml(),v9e=(t,e,r)=>(t=new MJ(t,r),e=new MJ(e,r),t.intersects(e,r));UJ.exports=v9e});var qJ=_((IQt,HJ)=>{var D9e=II(),P9e=Ol();HJ.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,I)=>P9e(E,I,r));for(let E of u)D9e(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,I]of o)E===I?A.push(E):!I&&E===u[0]?A.push("*"):I?E===u[0]?A.push(`<=${I}`):A.push(`${E} - ${I}`):A.push(`>=${E}`);let p=A.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var GJ=Ml(),lL=CI(),{ANY:aL}=lL,BI=II(),cL=Ol(),S9e=(t,e,r={})=>{if(t===e)return!0;t=new GJ(t,r),e=new GJ(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=x9e(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},b9e=[new lL(">=0.0.0-0")],jJ=[new lL(">=0.0.0")],x9e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===aL){if(e.length===1&&e[0].semver===aL)return!0;r.includePrerelease?t=b9e:t=jJ}if(e.length===1&&e[0].semver===aL){if(r.includePrerelease)return!0;e=jJ}let o=new Set,a,n;for(let x of t)x.operator===">"||x.operator===">="?a=YJ(a,x,r):x.operator==="<"||x.operator==="<="?n=WJ(n,x,r):o.add(x.semver);if(o.size>1)return null;let u;if(a&&n){if(u=cL(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let x of o){if(a&&!BI(x,String(a),r)||n&&!BI(x,String(n),r))return null;for(let C of e)if(!BI(x,String(C),r))return!1;return!0}let A,p,h,E,I=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,v=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;I&&I.prerelease.length===1&&n.operator==="<"&&I.prerelease[0]===0&&(I=!1);for(let x of e){if(E=E||x.operator===">"||x.operator===">=",h=h||x.operator==="<"||x.operator==="<=",a){if(v&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===v.major&&x.semver.minor===v.minor&&x.semver.patch===v.patch&&(v=!1),x.operator===">"||x.operator===">="){if(A=YJ(a,x,r),A===x&&A!==a)return!1}else if(a.operator===">="&&!BI(a.semver,String(x),r))return!1}if(n){if(I&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===I.major&&x.semver.minor===I.minor&&x.semver.patch===I.patch&&(I=!1),x.operator==="<"||x.operator==="<="){if(p=WJ(n,x,r),p===x&&p!==n)return!1}else if(n.operator==="<="&&!BI(n.semver,String(x),r))return!1}if(!x.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||v||I)},YJ=(t,e,r)=>{if(!t)return e;let o=cL(t.semver,e.semver,r);return o>0?t:o<0||e.operator===">"&&t.operator===">="?e:t},WJ=(t,e,r)=>{if(!t)return e;let o=cL(t.semver,e.semver,r);return o<0?t:o>0||e.operator==="<"&&t.operator==="<="?e:t};KJ.exports=S9e});var Jn=_((vQt,XJ)=>{var uL=vy(),VJ=gI(),k9e=Po(),JJ=VT(),Q9e=od(),F9e=dV(),R9e=yV(),T9e=wV(),L9e=vV(),N9e=PV(),O9e=bV(),M9e=kV(),U9e=FV(),_9e=Ol(),H9e=NV(),q9e=MV(),G9e=dP(),j9e=qV(),Y9e=jV(),W9e=mI(),K9e=mP(),z9e=JT(),V9e=XT(),J9e=yP(),X9e=EP(),Z9e=ZT(),$9e=$V(),e5e=CI(),t5e=Ml(),r5e=II(),n5e=CJ(),i5e=IJ(),s5e=vJ(),o5e=SJ(),a5e=xJ(),l5e=vP(),c5e=LJ(),u5e=OJ(),A5e=_J(),f5e=qJ(),p5e=zJ();XJ.exports={parse:Q9e,valid:F9e,clean:R9e,inc:T9e,diff:L9e,major:N9e,minor:O9e,patch:M9e,prerelease:U9e,compare:_9e,rcompare:H9e,compareLoose:q9e,compareBuild:G9e,sort:j9e,rsort:Y9e,gt:W9e,lt:K9e,eq:z9e,neq:V9e,gte:J9e,lte:X9e,cmp:Z9e,coerce:$9e,Comparator:e5e,Range:t5e,satisfies:r5e,toComparators:n5e,maxSatisfying:i5e,minSatisfying:s5e,minVersion:o5e,validRange:a5e,outside:l5e,gtr:c5e,ltr:u5e,intersects:A5e,simplifyRange:f5e,subset:p5e,SemVer:k9e,re:uL.re,src:uL.src,tokens:uL.t,SEMVER_SPEC_VERSION:VJ.SEMVER_SPEC_VERSION,RELEASE_TYPES:VJ.RELEASE_TYPES,compareIdentifiers:JJ.compareIdentifiers,rcompareIdentifiers:JJ.rcompareIdentifiers}});var $J=_((DQt,ZJ)=>{"use strict";function h5e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Ad(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ad)}h5e(Ad,Error);Ad.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",I;for(I=0;I0){for(I=1,v=1;I{switch(Le[1]){case"|":return be|Le[3];case"&":return be&Le[3];case"^":return be^Le[3]}},Z)},v="!",x=Re("!",!1),C=function(Z){return!Z},R="(",N=Re("(",!1),U=")",V=Re(")",!1),te=function(Z){return Z},ae=/^[^ \t\n\r()!|&\^]/,fe=ke([" "," ",` +`,"\r","(",")","!","|","&","^"],!0,!1),ue=function(Z){return e.queryPattern.test(Z)},me=function(Z){return e.checkFn(Z)},he=Te("whitespace"),Be=/^[ \t\n\r]/,we=ke([" "," ",` +`,"\r"],!1,!1),g=0,Ee=0,Pe=[{line:1,column:1}],ce=0,ne=[],ee=0,Ie;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function Fe(){return t.substring(Ee,g)}function At(){return qe(Ee,g)}function H(Z,ie){throw ie=ie!==void 0?ie:qe(Ee,g),S([Te(Z)],t.substring(Ee,g),ie)}function at(Z,ie){throw ie=ie!==void 0?ie:qe(Ee,g),w(Z,ie)}function Re(Z,ie){return{type:"literal",text:Z,ignoreCase:ie}}function ke(Z,ie,be){return{type:"class",parts:Z,inverted:ie,ignoreCase:be}}function xe(){return{type:"any"}}function He(){return{type:"end"}}function Te(Z){return{type:"other",description:Z}}function Ve(Z){var ie=Pe[Z],be;if(ie)return ie;for(be=Z-1;!Pe[be];)be--;for(ie=Pe[be],ie={line:ie.line,column:ie.column};bece&&(ce=g,ne=[]),ne.push(Z))}function w(Z,ie){return new Ad(Z,null,null,ie)}function S(Z,ie,be){return new Ad(Ad.buildMessage(Z,ie),Z,ie,be)}function y(){var Z,ie,be,Le,ot,dt,Gt,$t;if(Z=g,ie=F(),ie!==r){for(be=[],Le=g,ot=X(),ot!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,ee===0&&b(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,ee===0&&b(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,ee===0&&b(E)))),dt!==r?(Gt=X(),Gt!==r?($t=F(),$t!==r?(ot=[ot,dt,Gt,$t],Le=ot):(g=Le,Le=r)):(g=Le,Le=r)):(g=Le,Le=r)):(g=Le,Le=r);Le!==r;)be.push(Le),Le=g,ot=X(),ot!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,ee===0&&b(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,ee===0&&b(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,ee===0&&b(E)))),dt!==r?(Gt=X(),Gt!==r?($t=F(),$t!==r?(ot=[ot,dt,Gt,$t],Le=ot):(g=Le,Le=r)):(g=Le,Le=r)):(g=Le,Le=r)):(g=Le,Le=r);be!==r?(Ee=Z,ie=I(ie,be),Z=ie):(g=Z,Z=r)}else g=Z,Z=r;return Z}function F(){var Z,ie,be,Le,ot,dt;return Z=g,t.charCodeAt(g)===33?(ie=v,g++):(ie=r,ee===0&&b(x)),ie!==r?(be=F(),be!==r?(Ee=Z,ie=C(be),Z=ie):(g=Z,Z=r)):(g=Z,Z=r),Z===r&&(Z=g,t.charCodeAt(g)===40?(ie=R,g++):(ie=r,ee===0&&b(N)),ie!==r?(be=X(),be!==r?(Le=y(),Le!==r?(ot=X(),ot!==r?(t.charCodeAt(g)===41?(dt=U,g++):(dt=r,ee===0&&b(V)),dt!==r?(Ee=Z,ie=te(Le),Z=ie):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r)):(g=Z,Z=r),Z===r&&(Z=J())),Z}function J(){var Z,ie,be,Le,ot;if(Z=g,ie=X(),ie!==r){if(be=g,Le=[],ae.test(t.charAt(g))?(ot=t.charAt(g),g++):(ot=r,ee===0&&b(fe)),ot!==r)for(;ot!==r;)Le.push(ot),ae.test(t.charAt(g))?(ot=t.charAt(g),g++):(ot=r,ee===0&&b(fe));else Le=r;Le!==r?be=t.substring(be,g):be=Le,be!==r?(Ee=g,Le=ue(be),Le?Le=void 0:Le=r,Le!==r?(Ee=Z,ie=me(be),Z=ie):(g=Z,Z=r)):(g=Z,Z=r)}else g=Z,Z=r;return Z}function X(){var Z,ie;for(ee++,Z=[],Be.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,ee===0&&b(we));ie!==r;)Z.push(ie),Be.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,ee===0&&b(we));return ee--,Z===r&&(ie=r,ee===0&&b(he)),Z}if(Ie=a(),Ie!==r&&g===t.length)return Ie;throw Ie!==r&&g{var{parse:d5e}=$J();DP.makeParser=(t=/[a-z]+/)=>(e,r)=>d5e(e,{queryPattern:t,checkFn:r});DP.parse=DP.makeParser()});var rX=_((SQt,tX)=>{"use strict";tX.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]}});var AL=_((bQt,iX)=>{var vI=rX(),nX={};for(let t of Object.keys(vI))nX[vI[t]]=t;var Ar={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"]}};iX.exports=Ar;for(let t of Object.keys(Ar)){if(!("channels"in Ar[t]))throw new Error("missing channels property: "+t);if(!("labels"in Ar[t]))throw new Error("missing channel labels property: "+t);if(Ar[t].labels.length!==Ar[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=Ar[t];delete Ar[t].channels,delete Ar[t].labels,Object.defineProperty(Ar[t],"channels",{value:e}),Object.defineProperty(Ar[t],"labels",{value:r})}Ar.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};Ar.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),I=function(v){return(h-v)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=I(u),r=I(A),o=I(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};Ar.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=Ar.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};Ar.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function m5e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Ar.rgb.keyword=function(t){let e=nX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(vI)){let n=vI[a],u=m5e(t,n);u.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};Ar.rgb.lab=function(t){let e=Ar.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};Ar.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};Ar.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};Ar.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};Ar.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};Ar.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,(u&1)!==0&&(n=1-n);let p=r+n*(A-r),h,E,I;switch(u){default:case 6:case 0:h=A,E=p,I=r;break;case 1:h=p,E=A,I=r;break;case 2:h=r,E=A,I=p;break;case 3:h=r,E=p,I=A;break;case 4:h=p,E=r,I=A;break;case 5:h=A,E=r,I=p;break}return[h*255,E*255,I*255]};Ar.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};Ar.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};Ar.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};Ar.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};Ar.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};Ar.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};Ar.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?Ar.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};Ar.hsv.ansi16=function(t){return Ar.rgb.ansi16(Ar.hsv.rgb(t),t[2])};Ar.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};Ar.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};Ar.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};Ar.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Ar.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(A=>A+A).join(""));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};Ar.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};Ar.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};Ar.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};Ar.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};Ar.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};Ar.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};Ar.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};Ar.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};Ar.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Ar.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Ar.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Ar.gray.hsl=function(t){return[0,0,t[0]]};Ar.gray.hsv=Ar.gray.hsl;Ar.gray.hwb=function(t){return[0,100,t[0]]};Ar.gray.cmyk=function(t){return[0,0,0,t[0]]};Ar.gray.lab=function(t){return[t[0],0,0]};Ar.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(o.length)+o};Ar.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var oX=_((xQt,sX)=>{var PP=AL();function y5e(){let t={},e=Object.keys(PP);for(let r=e.length,o=0;o{var fL=AL(),I5e=oX(),xy={},B5e=Object.keys(fL);function v5e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function D5e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a=="object")for(let n=a.length,u=0;u{xy[t]={},Object.defineProperty(xy[t],"channels",{value:fL[t].channels}),Object.defineProperty(xy[t],"labels",{value:fL[t].labels});let e=I5e(t);Object.keys(e).forEach(o=>{let a=e[o];xy[t][o]=D5e(a),xy[t][o].raw=v5e(a)})});aX.exports=xy});var DI=_((QQt,pX)=>{"use strict";var cX=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,uX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};5;${o}m`},AX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},SP=t=>t,fX=(t,e,r)=>[t,e,r],ky=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},pL,Qy=(t,e,r,o)=>{pL===void 0&&(pL=lX());let a=o?10:0,n={};for(let[u,A]of Object.entries(pL)){let p=u==="ansi16"?"ansi":u;u===e?n[p]=t(r,a):typeof A=="object"&&(n[p]=t(A[e],a))}return n};function P5e(){let t=new Map,e={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]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",ky(e.color,"ansi",()=>Qy(cX,"ansi16",SP,!1)),ky(e.color,"ansi256",()=>Qy(uX,"ansi256",SP,!1)),ky(e.color,"ansi16m",()=>Qy(AX,"rgb",fX,!1)),ky(e.bgColor,"ansi",()=>Qy(cX,"ansi16",SP,!0)),ky(e.bgColor,"ansi256",()=>Qy(uX,"ansi256",SP,!0)),ky(e.bgColor,"ansi16m",()=>Qy(AX,"rgb",fX,!0)),e}Object.defineProperty(pX,"exports",{enumerable:!0,get:P5e})});var gX=_((FQt,hX)=>{"use strict";hX.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),a=e.indexOf("--");return o!==-1&&(a===-1||o{"use strict";var S5e=ve("os"),dX=ve("tty"),Ul=gX(),{env:ls}=process,Jp;Ul("no-color")||Ul("no-colors")||Ul("color=false")||Ul("color=never")?Jp=0:(Ul("color")||Ul("colors")||Ul("color=true")||Ul("color=always"))&&(Jp=1);"FORCE_COLOR"in ls&&(ls.FORCE_COLOR==="true"?Jp=1:ls.FORCE_COLOR==="false"?Jp=0:Jp=ls.FORCE_COLOR.length===0?1:Math.min(parseInt(ls.FORCE_COLOR,10),3));function hL(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function gL(t,e){if(Jp===0)return 0;if(Ul("color=16m")||Ul("color=full")||Ul("color=truecolor"))return 3;if(Ul("color=256"))return 2;if(t&&!e&&Jp===void 0)return 0;let r=Jp||0;if(ls.TERM==="dumb")return r;if(process.platform==="win32"){let o=S5e.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in ls)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(o=>o in ls)||ls.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in ls)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(ls.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in ls)return 1;if(ls.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in ls){let o=parseInt((ls.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(ls.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(ls.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ls.TERM)||"COLORTERM"in ls?1:r}function b5e(t){let e=gL(t,t&&t.isTTY);return hL(e)}mX.exports={supportsColor:b5e,stdout:hL(gL(!0,dX.isatty(1))),stderr:hL(gL(!0,dX.isatty(2)))}});var EX=_((TQt,yX)=>{"use strict";var x5e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},k5e=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};yX.exports={stringReplaceAll:x5e,stringEncaseCRLFWithFirstIndex:k5e}});var vX=_((LQt,BX)=>{"use strict";var Q5e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,CX=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,F5e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,R5e=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,T5e=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function IX(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):T5e.get(t)||t}function L5e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(F5e))r.push(a[2].replace(R5e,(A,p,h)=>p?IX(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function N5e(t){CX.lastIndex=0;let e=[],r;for(;(r=CX.exec(t))!==null;){let o=r[1];if(r[2]){let a=L5e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function wX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}BX.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(Q5e,(n,u,A,p,h,E)=>{if(u)a.push(IX(u));else if(p){let I=a.join("");a=[],o.push(r.length===0?I:wX(t,r)(I)),r.push({inverse:A,styles:N5e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(wX(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var IL=_((NQt,bX)=>{"use strict";var PI=DI(),{stdout:yL,stderr:EL}=dL(),{stringReplaceAll:O5e,stringEncaseCRLFWithFirstIndex:M5e}=EX(),DX=["ansi","ansi","ansi256","ansi16m"],Fy=Object.create(null),U5e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=yL?yL.level:0;t.level=e.level===void 0?r:e.level},CL=class{constructor(e){return PX(e)}},PX=t=>{let e={};return U5e(e,t),e.template=(...r)=>q5e(e.template,...r),Object.setPrototypeOf(e,bP.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=CL,e.template};function bP(t){return PX(t)}for(let[t,e]of Object.entries(PI))Fy[t]={get(){let r=xP(this,wL(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Fy.visible={get(){let t=xP(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var SX=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of SX)Fy[t]={get(){let{level:e}=this;return function(...r){let o=wL(PI.color[DX[e]][t](...r),PI.color.close,this._styler);return xP(this,o,this._isEmpty)}}};for(let t of SX){let e="bg"+t[0].toUpperCase()+t.slice(1);Fy[e]={get(){let{level:r}=this;return function(...o){let a=wL(PI.bgColor[DX[r]][t](...o),PI.bgColor.close,this._styler);return xP(this,a,this._isEmpty)}}}}var _5e=Object.defineProperties(()=>{},{...Fy,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),wL=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},xP=(t,e,r)=>{let o=(...a)=>H5e(o,a.length===1?""+a[0]:a.join(" "));return o.__proto__=_5e,o._generator=t,o._styler=e,o._isEmpty=r,o},H5e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=O5e(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=M5e(e,a,o,n)),o+e+a},mL,q5e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";_l.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;_l.find=(t,e)=>t.nodes.find(r=>r.type===e);_l.exceedsLimit=(t,e,r=1,o)=>o===!1||!_l.isInteger(t)||!_l.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;_l.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];!o||(r&&o.type===r||o.type==="open"||o.type==="close")&&o.escaped!==!0&&(o.value="\\"+o.value,o.escaped=!0)};_l.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0===0?(t.invalid=!0,!0):!1;_l.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0===0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;_l.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;_l.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);_l.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a{"use strict";var xX=kP();kX.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&xX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A="";if(o.value)return(n||u)&&xX.isOpenOrClose(o)?"\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var FX=_((UQt,QX)=>{"use strict";QX.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var HX=_((_Qt,_X)=>{"use strict";var RX=FX(),fd=(t,e,r)=>{if(RX(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(RX(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};typeof o.strictZeros=="boolean"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+":"+e+"="+a+n+u+A;if(fd.cache.hasOwnProperty(p))return fd.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let R=t+"|"+e;return o.capture?`(${R})`:o.wrap===!1?R:`(?:${R})`}let I=UX(t)||UX(e),v={min:t,max:e,a:h,b:E},x=[],C=[];if(I&&(v.isPadded=I,v.maxLen=String(v.max).length),h<0){let R=E<0?Math.abs(E):1;C=TX(R,Math.abs(h),v,o),h=v.a=0}return E>=0&&(x=TX(h,E,v,o)),v.negatives=C,v.positives=x,v.result=G5e(C,x,o),o.capture===!0?v.result=`(${v.result})`:o.wrap!==!1&&x.length+C.length>1&&(v.result=`(?:${v.result})`),fd.cache[p]=v,v.result};function G5e(t,e,r){let o=BL(t,e,"-",!1,r)||[],a=BL(e,t,"",!1,r)||[],n=BL(t,e,"-?",!0,r)||[];return o.concat(n).concat(a).join("|")}function j5e(t,e){let r=1,o=1,a=NX(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=NX(t,r);for(a=OX(e+1,o)-1;t1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+MX(A.count),u=h+1;continue}r.isPadded&&(I=V5e(h,r,o)),E.string=I+E.pattern+MX(E.count),n.push(E),u=h+1,A=E}return n}function BL(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!LX(e,"string",A)&&n.push(r+A),o&&LX(e,"string",A)&&n.push(r+A)}return n}function W5e(t,e){let r=[];for(let o=0;oe?1:e>t?-1:0}function LX(t,e,r){return t.some(o=>o[e]===r)}function NX(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function OX(t,e){return t-t%Math.pow(10,e)}function MX(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function z5e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function UX(t){return/^-?(0+)\d/.test(t)}function V5e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${o}}`:`0{${o}}`}}fd.cache={};fd.clearCache=()=>fd.cache={};_X.exports=fd});var PL=_((HQt,VX)=>{"use strict";var J5e=ve("util"),jX=HX(),qX=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),X5e=t=>e=>t===!0?Number(e):String(e),vL=t=>typeof t=="number"||typeof t=="string"&&t!=="",bI=t=>Number.isInteger(+t),DL=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},Z5e=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,$5e=(t,e,r)=>{if(e>0){let o=t[0]==="-"?"-":"";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,"0")}return r===!1?String(t):t},GX=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((u,A)=>uA?1:0),t.positives.sort((u,A)=>uA?1:0);let r=e.capture?"":"?:",o="",a="",n;return t.positives.length&&(o=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},YX=(t,e,r,o)=>{if(r)return jX(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},WX=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?"":"?:";return o?`(${a}${t.join("|")})`:t.join("|")}return jX(t,e,r)},KX=(...t)=>new RangeError("Invalid range arguments: "+J5e.inspect(...t)),zX=(t,e,r)=>{if(r.strictRanges===!0)throw KX([t,e]);return[]},t7e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},r7e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw KX([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=DL(A)||DL(p)||DL(h),I=E?Math.max(A.length,p.length,h.length):0,v=E===!1&&Z5e(t,e,o)===!1,x=o.transform||X5e(v);if(o.toRegex&&r===1)return YX(GX(t,I),GX(e,I),!0,o);let C={negatives:[],positives:[]},R=V=>C[V<0?"negatives":"positives"].push(Math.abs(V)),N=[],U=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?R(a):N.push($5e(x(a,U),I,v)),a=u?a-r:a+r,U++;return o.toRegex===!0?r>1?e7e(C,o):WX(N,null,{wrap:!1,...o}):N},n7e=(t,e,r=1,o={})=>{if(!bI(t)&&t.length>1||!bI(e)&&e.length>1)return zX(t,e,o);let a=o.transform||(v=>String.fromCharCode(v)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return YX(p,h,!1,o);let E=[],I=0;for(;A?n>=u:n<=u;)E.push(a(n,I)),n=A?n-r:n+r,I++;return o.toRegex===!0?WX(E,null,{wrap:!1,options:o}):E},FP=(t,e,r,o={})=>{if(e==null&&vL(t))return[t];if(!vL(t)||!vL(e))return zX(t,e,o);if(typeof r=="function")return FP(t,e,1,{transform:r});if(qX(r))return FP(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,bI(r)?bI(t)&&bI(e)?r7e(t,e,r,a):n7e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!qX(r)?t7e(r,a):FP(t,e,1,r)};VX.exports=FP});var ZX=_((qQt,XX)=>{"use strict";var i7e=PL(),JX=kP(),s7e=(t,e={})=>{let r=(o,a={})=>{let n=JX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type==="open")return A?p+o.value:"(";if(o.type==="close")return A?p+o.value:")";if(o.type==="comma")return o.prev.type==="comma"?"":A?o.value:"|";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=JX.reduce(o.nodes),I=i7e(...E,{...e,wrap:!1,toRegex:!0});if(I.length!==0)return E.length>1&&I.length>1?`(${I})`:I}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};XX.exports=s7e});var tZ=_((GQt,eZ)=>{"use strict";var o7e=PL(),$X=QP(),Ry=kP(),pd=(t="",e="",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Ry.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(pd(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),o.push(Array.isArray(n)?pd(a,n,r):a+n);return Ry.flatten(o)},a7e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(pd(A.pop(),$X(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){A.push(pd(A.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let I=Ry.reduce(a.nodes);if(Ry.exceedsLimit(...I,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let v=o7e(...I,e);v.length===0&&(v=$X(a,e)),A.push(pd(A.pop(),v)),a.nodes=[];return}let p=Ry.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let I=0;I{"use strict";rZ.exports={MAX_LENGTH:1024*64,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:` +`,CHAR_NO_BREAK_SPACE:"\xA0",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:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var lZ=_((YQt,aZ)=>{"use strict";var l7e=QP(),{MAX_LENGTH:iZ,CHAR_BACKSLASH:SL,CHAR_BACKTICK:c7e,CHAR_COMMA:u7e,CHAR_DOT:A7e,CHAR_LEFT_PARENTHESES:f7e,CHAR_RIGHT_PARENTHESES:p7e,CHAR_LEFT_CURLY_BRACE:h7e,CHAR_RIGHT_CURLY_BRACE:g7e,CHAR_LEFT_SQUARE_BRACKET:sZ,CHAR_RIGHT_SQUARE_BRACKET:oZ,CHAR_DOUBLE_QUOTE:d7e,CHAR_SINGLE_QUOTE:m7e,CHAR_NO_BREAK_SPACE:y7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:E7e}=nZ(),C7e=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},o=typeof r.maxLength=="number"?Math.min(iZ,r.maxLength):iZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:"root",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,I=0,v,x={},C=()=>t[E++],R=N=>{if(N.type==="text"&&A.type==="dot"&&(A.type="text"),A&&A.type==="text"&&N.type==="text"){A.value+=N.value;return}return u.nodes.push(N),N.parent=u,N.prev=A,A=N,N};for(R({type:"bos"});E0){if(u.ranges>0){u.ranges=0;let N=u.nodes.shift();u.nodes=[N,{type:"text",value:l7e(u)}]}R({type:"comma",value:v}),u.commas++;continue}if(v===A7e&&I>0&&u.commas===0){let N=u.nodes;if(I===0||N.length===0){R({type:"text",value:v});continue}if(A.type==="dot"){if(u.range=[],A.value+=v,A.type="range",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type="text";continue}u.ranges++,u.args=[];continue}if(A.type==="range"){N.pop();let U=N[N.length-1];U.value+=A.value+v,A=U,u.ranges--;continue}R({type:"dot",value:v});continue}R({type:"text",value:v})}do if(u=n.pop(),u.type!=="root"){u.nodes.forEach(V=>{V.nodes||(V.type==="open"&&(V.isOpen=!0),V.type==="close"&&(V.isClose=!0),V.nodes||(V.type="text"),V.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(u);N.nodes.splice(U,1,...u.nodes)}while(n.length>0);return R({type:"eos"}),a};aZ.exports=C7e});var AZ=_((WQt,uZ)=>{"use strict";var cZ=QP(),w7e=ZX(),I7e=tZ(),B7e=lZ(),nl=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=nl.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(nl.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};nl.parse=(t,e={})=>B7e(t,e);nl.stringify=(t,e={})=>cZ(typeof t=="string"?nl.parse(t,e):t,e);nl.compile=(t,e={})=>(typeof t=="string"&&(t=nl.parse(t,e)),w7e(t,e));nl.expand=(t,e={})=>{typeof t=="string"&&(t=nl.parse(t,e));let r=I7e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};nl.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?nl.compile(t,e):nl.expand(t,e);uZ.exports=nl});var xI=_((KQt,dZ)=>{"use strict";var v7e=ve("path"),zu="\\\\/",fZ=`[^${zu}]`,vf="\\.",D7e="\\+",P7e="\\?",RP="\\/",S7e="(?=.)",pZ="[^/]",bL=`(?:${RP}|$)`,hZ=`(?:^|${RP})`,xL=`${vf}{1,2}${bL}`,b7e=`(?!${vf})`,x7e=`(?!${hZ}${xL})`,k7e=`(?!${vf}{0,1}${bL})`,Q7e=`(?!${xL})`,F7e=`[^.${RP}]`,R7e=`${pZ}*?`,gZ={DOT_LITERAL:vf,PLUS_LITERAL:D7e,QMARK_LITERAL:P7e,SLASH_LITERAL:RP,ONE_CHAR:S7e,QMARK:pZ,END_ANCHOR:bL,DOTS_SLASH:xL,NO_DOT:b7e,NO_DOTS:x7e,NO_DOT_SLASH:k7e,NO_DOTS_SLASH:Q7e,QMARK_NO_DOT:F7e,STAR:R7e,START_ANCHOR:hZ},T7e={...gZ,SLASH_LITERAL:`[${zu}]`,QMARK:fZ,STAR:`${fZ}*?`,DOTS_SLASH:`${vf}{1,2}(?:[${zu}]|$)`,NO_DOT:`(?!${vf})`,NO_DOTS:`(?!(?:^|[${zu}])${vf}{1,2}(?:[${zu}]|$))`,NO_DOT_SLASH:`(?!${vf}{0,1}(?:[${zu}]|$))`,NO_DOTS_SLASH:`(?!${vf}{1,2}(?:[${zu}]|$))`,QMARK_NO_DOT:`[^.${zu}]`,START_ANCHOR:`(?:^|[${zu}])`,END_ANCHOR:`(?:[${zu}]|$)`},L7e={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"};dZ.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:L7e,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:v7e.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?T7e:gZ}}});var kI=_(Pa=>{"use strict";var N7e=ve("path"),O7e=process.platform==="win32",{REGEX_BACKSLASH:M7e,REGEX_REMOVE_BACKSLASH:U7e,REGEX_SPECIAL_CHARS:_7e,REGEX_SPECIAL_CHARS_GLOBAL:H7e}=xI();Pa.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);Pa.hasRegexChars=t=>_7e.test(t);Pa.isRegexChar=t=>t.length===1&&Pa.hasRegexChars(t);Pa.escapeRegex=t=>t.replace(H7e,"\\$1");Pa.toPosixSlashes=t=>t.replace(M7e,"/");Pa.removeBackslashes=t=>t.replace(U7e,e=>e==="\\"?"":e);Pa.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};Pa.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:O7e===!0||N7e.sep==="\\";Pa.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]==="\\"?Pa.escapeLast(t,e,o-1):`${t.slice(0,o)}\\${t.slice(o)}`};Pa.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};Pa.wrapOutput=(t,e={},r={})=>{let o=r.contains?"":"^",a=r.contains?"":"$",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var vZ=_((VQt,BZ)=>{"use strict";var mZ=kI(),{CHAR_ASTERISK:kL,CHAR_AT:q7e,CHAR_BACKWARD_SLASH:QI,CHAR_COMMA:G7e,CHAR_DOT:QL,CHAR_EXCLAMATION_MARK:FL,CHAR_FORWARD_SLASH:IZ,CHAR_LEFT_CURLY_BRACE:RL,CHAR_LEFT_PARENTHESES:TL,CHAR_LEFT_SQUARE_BRACKET:j7e,CHAR_PLUS:Y7e,CHAR_QUESTION_MARK:yZ,CHAR_RIGHT_CURLY_BRACE:W7e,CHAR_RIGHT_PARENTHESES:EZ,CHAR_RIGHT_SQUARE_BRACKET:K7e}=xI(),CZ=t=>t===IZ||t===QI,wZ=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},z7e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,I=0,v=!1,x=!1,C=!1,R=!1,N=!1,U=!1,V=!1,te=!1,ae=!1,fe=!1,ue=0,me,he,Be={value:"",depth:0,isGlob:!1},we=()=>h>=o,g=()=>p.charCodeAt(h+1),Ee=()=>(me=he,p.charCodeAt(++h));for(;h0&&(ce=p.slice(0,E),p=p.slice(E),I-=E),Pe&&C===!0&&I>0?(Pe=p.slice(0,I),ne=p.slice(I)):C===!0?(Pe="",ne=p):Pe=p,Pe&&Pe!==""&&Pe!=="/"&&Pe!==p&&CZ(Pe.charCodeAt(Pe.length-1))&&(Pe=Pe.slice(0,-1)),r.unescape===!0&&(ne&&(ne=mZ.removeBackslashes(ne)),Pe&&V===!0&&(Pe=mZ.removeBackslashes(Pe)));let ee={prefix:ce,input:t,start:E,base:Pe,glob:ne,isBrace:v,isBracket:x,isGlob:C,isExtglob:R,isGlobstar:N,negated:te,negatedExtglob:ae};if(r.tokens===!0&&(ee.maxDepth=0,CZ(he)||u.push(Be),ee.tokens=u),r.parts===!0||r.tokens===!0){let Ie;for(let Fe=0;Fe{"use strict";var TP=xI(),il=kI(),{MAX_LENGTH:LP,POSIX_REGEX_SOURCE:V7e,REGEX_NON_SPECIAL_CHARS:J7e,REGEX_SPECIAL_CHARS_BACKREF:X7e,REPLACEMENTS:DZ}=TP,Z7e=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>il.escapeRegex(a)).join("..")}return r},Ty=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,LL=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=DZ[t]||t;let r={...e},o=typeof r.maxLength=="number"?Math.min(LP,r.maxLength):LP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:"bos",value:"",output:r.prepend||""},u=[n],A=r.capture?"":"?:",p=il.isWindows(e),h=TP.globChars(p),E=TP.extglobChars(h),{DOT_LITERAL:I,PLUS_LITERAL:v,SLASH_LITERAL:x,ONE_CHAR:C,DOTS_SLASH:R,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:V,QMARK:te,QMARK_NO_DOT:ae,STAR:fe,START_ANCHOR:ue}=h,me=b=>`(${A}(?:(?!${ue}${b.dot?R:I}).)*?)`,he=r.dot?"":N,Be=r.dot?te:ae,we=r.bash===!0?me(r):fe;r.capture&&(we=`(${we})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=il.removePrefix(t,g),a=t.length;let Ee=[],Pe=[],ce=[],ne=n,ee,Ie=()=>g.index===a-1,Fe=g.peek=(b=1)=>t[g.index+b],At=g.advance=()=>t[++g.index]||"",H=()=>t.slice(g.index+1),at=(b="",w=0)=>{g.consumed+=b,g.index+=w},Re=b=>{g.output+=b.output!=null?b.output:b.value,at(b.value)},ke=()=>{let b=1;for(;Fe()==="!"&&(Fe(2)!=="("||Fe(3)==="?");)At(),g.start++,b++;return b%2===0?!1:(g.negated=!0,g.start++,!0)},xe=b=>{g[b]++,ce.push(b)},He=b=>{g[b]--,ce.pop()},Te=b=>{if(ne.type==="globstar"){let w=g.braces>0&&(b.type==="comma"||b.type==="brace"),S=b.extglob===!0||Ee.length&&(b.type==="pipe"||b.type==="paren");b.type!=="slash"&&b.type!=="paren"&&!w&&!S&&(g.output=g.output.slice(0,-ne.output.length),ne.type="star",ne.value="*",ne.output=we,g.output+=ne.output)}if(Ee.length&&b.type!=="paren"&&(Ee[Ee.length-1].inner+=b.value),(b.value||b.output)&&Re(b),ne&&ne.type==="text"&&b.type==="text"){ne.value+=b.value,ne.output=(ne.output||"")+b.value;return}b.prev=ne,u.push(b),ne=b},Ve=(b,w)=>{let S={...E[w],conditions:1,inner:""};S.prev=ne,S.parens=g.parens,S.output=g.output;let y=(r.capture?"(":"")+S.open;xe("parens"),Te({type:b,value:w,output:g.output?"":C}),Te({type:"paren",extglob:!0,value:At(),output:y}),Ee.push(S)},qe=b=>{let w=b.close+(r.capture?")":""),S;if(b.type==="negate"){let y=we;if(b.inner&&b.inner.length>1&&b.inner.includes("/")&&(y=me(r)),(y!==we||Ie()||/^\)+$/.test(H()))&&(w=b.close=`)$))${y}`),b.inner.includes("*")&&(S=H())&&/^\.[^\\/.]+$/.test(S)){let F=LL(S,{...e,fastpaths:!1}).output;w=b.close=`)${F})${y})`}b.prev.type==="bos"&&(g.negatedExtglob=!0)}Te({type:"paren",extglob:!0,value:ee,output:w}),He("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let b=!1,w=t.replace(X7e,(S,y,F,J,X,Z)=>J==="\\"?(b=!0,S):J==="?"?y?y+J+(X?te.repeat(X.length):""):Z===0?Be+(X?te.repeat(X.length):""):te.repeat(F.length):J==="."?I.repeat(F.length):J==="*"?y?y+J+(X?we:""):we:y?S:`\\${S}`);return b===!0&&(r.unescape===!0?w=w.replace(/\\/g,""):w=w.replace(/\\+/g,S=>S.length%2===0?"\\\\":S?"\\":"")),w===t&&r.contains===!0?(g.output=t,g):(g.output=il.wrapOutput(w,g,e),g)}for(;!Ie();){if(ee=At(),ee==="\0")continue;if(ee==="\\"){let S=Fe();if(S==="/"&&r.bash!==!0||S==="."||S===";")continue;if(!S){ee+="\\",Te({type:"text",value:ee});continue}let y=/^\\+/.exec(H()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(ee+="\\")),r.unescape===!0?ee=At():ee+=At(),g.brackets===0){Te({type:"text",value:ee});continue}}if(g.brackets>0&&(ee!=="]"||ne.value==="["||ne.value==="[^")){if(r.posix!==!1&&ee===":"){let S=ne.value.slice(1);if(S.includes("[")&&(ne.posix=!0,S.includes(":"))){let y=ne.value.lastIndexOf("["),F=ne.value.slice(0,y),J=ne.value.slice(y+2),X=V7e[J];if(X){ne.value=F+X,g.backtrack=!0,At(),!n.output&&u.indexOf(ne)===1&&(n.output=C);continue}}}(ee==="["&&Fe()!==":"||ee==="-"&&Fe()==="]")&&(ee=`\\${ee}`),ee==="]"&&(ne.value==="["||ne.value==="[^")&&(ee=`\\${ee}`),r.posix===!0&&ee==="!"&&ne.value==="["&&(ee="^"),ne.value+=ee,Re({value:ee});continue}if(g.quotes===1&&ee!=='"'){ee=il.escapeRegex(ee),ne.value+=ee,Re({value:ee});continue}if(ee==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&Te({type:"text",value:ee});continue}if(ee==="("){xe("parens"),Te({type:"paren",value:ee});continue}if(ee===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Ty("opening","("));let S=Ee[Ee.length-1];if(S&&g.parens===S.parens+1){qe(Ee.pop());continue}Te({type:"paren",value:ee,output:g.parens?")":"\\)"}),He("parens");continue}if(ee==="["){if(r.nobracket===!0||!H().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Ty("closing","]"));ee=`\\${ee}`}else xe("brackets");Te({type:"bracket",value:ee});continue}if(ee==="]"){if(r.nobracket===!0||ne&&ne.type==="bracket"&&ne.value.length===1){Te({type:"text",value:ee,output:`\\${ee}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Ty("opening","["));Te({type:"text",value:ee,output:`\\${ee}`});continue}He("brackets");let S=ne.value.slice(1);if(ne.posix!==!0&&S[0]==="^"&&!S.includes("/")&&(ee=`/${ee}`),ne.value+=ee,Re({value:ee}),r.literalBrackets===!1||il.hasRegexChars(S))continue;let y=il.escapeRegex(ne.value);if(g.output=g.output.slice(0,-ne.value.length),r.literalBrackets===!0){g.output+=y,ne.value=y;continue}ne.value=`(${A}${y}|${ne.value})`,g.output+=ne.value;continue}if(ee==="{"&&r.nobrace!==!0){xe("braces");let S={type:"brace",value:ee,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};Pe.push(S),Te(S);continue}if(ee==="}"){let S=Pe[Pe.length-1];if(r.nobrace===!0||!S){Te({type:"text",value:ee,output:ee});continue}let y=")";if(S.dots===!0){let F=u.slice(),J=[];for(let X=F.length-1;X>=0&&(u.pop(),F[X].type!=="brace");X--)F[X].type!=="dots"&&J.unshift(F[X].value);y=Z7e(J,r),g.backtrack=!0}if(S.comma!==!0&&S.dots!==!0){let F=g.output.slice(0,S.outputIndex),J=g.tokens.slice(S.tokensIndex);S.value=S.output="\\{",ee=y="\\}",g.output=F;for(let X of J)g.output+=X.output||X.value}Te({type:"brace",value:ee,output:y}),He("braces"),Pe.pop();continue}if(ee==="|"){Ee.length>0&&Ee[Ee.length-1].conditions++,Te({type:"text",value:ee});continue}if(ee===","){let S=ee,y=Pe[Pe.length-1];y&&ce[ce.length-1]==="braces"&&(y.comma=!0,S="|"),Te({type:"comma",value:ee,output:S});continue}if(ee==="/"){if(ne.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",u.pop(),ne=n;continue}Te({type:"slash",value:ee,output:x});continue}if(ee==="."){if(g.braces>0&&ne.type==="dot"){ne.value==="."&&(ne.output=I);let S=Pe[Pe.length-1];ne.type="dots",ne.output+=ee,ne.value+=ee,S.dots=!0;continue}if(g.braces+g.parens===0&&ne.type!=="bos"&&ne.type!=="slash"){Te({type:"text",value:ee,output:I});continue}Te({type:"dot",value:ee,output:I});continue}if(ee==="?"){if(!(ne&&ne.value==="(")&&r.noextglob!==!0&&Fe()==="("&&Fe(2)!=="?"){Ve("qmark",ee);continue}if(ne&&ne.type==="paren"){let y=Fe(),F=ee;if(y==="<"&&!il.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ne.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(H()))&&(F=`\\${ee}`),Te({type:"text",value:ee,output:F});continue}if(r.dot!==!0&&(ne.type==="slash"||ne.type==="bos")){Te({type:"qmark",value:ee,output:ae});continue}Te({type:"qmark",value:ee,output:te});continue}if(ee==="!"){if(r.noextglob!==!0&&Fe()==="("&&(Fe(2)!=="?"||!/[!=<:]/.test(Fe(3)))){Ve("negate",ee);continue}if(r.nonegate!==!0&&g.index===0){ke();continue}}if(ee==="+"){if(r.noextglob!==!0&&Fe()==="("&&Fe(2)!=="?"){Ve("plus",ee);continue}if(ne&&ne.value==="("||r.regex===!1){Te({type:"plus",value:ee,output:v});continue}if(ne&&(ne.type==="bracket"||ne.type==="paren"||ne.type==="brace")||g.parens>0){Te({type:"plus",value:ee});continue}Te({type:"plus",value:v});continue}if(ee==="@"){if(r.noextglob!==!0&&Fe()==="("&&Fe(2)!=="?"){Te({type:"at",extglob:!0,value:ee,output:""});continue}Te({type:"text",value:ee});continue}if(ee!=="*"){(ee==="$"||ee==="^")&&(ee=`\\${ee}`);let S=J7e.exec(H());S&&(ee+=S[0],g.index+=S[0].length),Te({type:"text",value:ee});continue}if(ne&&(ne.type==="globstar"||ne.star===!0)){ne.type="star",ne.star=!0,ne.value+=ee,ne.output=we,g.backtrack=!0,g.globstar=!0,at(ee);continue}let b=H();if(r.noextglob!==!0&&/^\([^?]/.test(b)){Ve("star",ee);continue}if(ne.type==="star"){if(r.noglobstar===!0){at(ee);continue}let S=ne.prev,y=S.prev,F=S.type==="slash"||S.type==="bos",J=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!F||b[0]&&b[0]!=="/")){Te({type:"star",value:ee,output:""});continue}let X=g.braces>0&&(S.type==="comma"||S.type==="brace"),Z=Ee.length&&(S.type==="pipe"||S.type==="paren");if(!F&&S.type!=="paren"&&!X&&!Z){Te({type:"star",value:ee,output:""});continue}for(;b.slice(0,3)==="/**";){let ie=t[g.index+4];if(ie&&ie!=="/")break;b=b.slice(3),at("/**",3)}if(S.type==="bos"&&Ie()){ne.type="globstar",ne.value+=ee,ne.output=me(r),g.output=ne.output,g.globstar=!0,at(ee);continue}if(S.type==="slash"&&S.prev.type!=="bos"&&!J&&Ie()){g.output=g.output.slice(0,-(S.output+ne.output).length),S.output=`(?:${S.output}`,ne.type="globstar",ne.output=me(r)+(r.strictSlashes?")":"|$)"),ne.value+=ee,g.globstar=!0,g.output+=S.output+ne.output,at(ee);continue}if(S.type==="slash"&&S.prev.type!=="bos"&&b[0]==="/"){let ie=b[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(S.output+ne.output).length),S.output=`(?:${S.output}`,ne.type="globstar",ne.output=`${me(r)}${x}|${x}${ie})`,ne.value+=ee,g.output+=S.output+ne.output,g.globstar=!0,at(ee+At()),Te({type:"slash",value:"/",output:""});continue}if(S.type==="bos"&&b[0]==="/"){ne.type="globstar",ne.value+=ee,ne.output=`(?:^|${x}|${me(r)}${x})`,g.output=ne.output,g.globstar=!0,at(ee+At()),Te({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-ne.output.length),ne.type="globstar",ne.output=me(r),ne.value+=ee,g.output+=ne.output,g.globstar=!0,at(ee);continue}let w={type:"star",value:ee,output:we};if(r.bash===!0){w.output=".*?",(ne.type==="bos"||ne.type==="slash")&&(w.output=he+w.output),Te(w);continue}if(ne&&(ne.type==="bracket"||ne.type==="paren")&&r.regex===!0){w.output=ee,Te(w);continue}(g.index===g.start||ne.type==="slash"||ne.type==="dot")&&(ne.type==="dot"?(g.output+=U,ne.output+=U):r.dot===!0?(g.output+=V,ne.output+=V):(g.output+=he,ne.output+=he),Fe()!=="*"&&(g.output+=C,ne.output+=C)),Te(w)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing","]"));g.output=il.escapeLast(g.output,"["),He("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing",")"));g.output=il.escapeLast(g.output,"("),He("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ty("closing","}"));g.output=il.escapeLast(g.output,"{"),He("braces")}if(r.strictSlashes!==!0&&(ne.type==="star"||ne.type==="bracket")&&Te({type:"maybe_slash",value:"",output:`${x}?`}),g.backtrack===!0){g.output="";for(let b of g.tokens)g.output+=b.output!=null?b.output:b.value,b.suffix&&(g.output+=b.suffix)}return g};LL.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength=="number"?Math.min(LP,r.maxLength):LP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=DZ[t]||t;let n=il.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:I,NO_DOTS_SLASH:v,STAR:x,START_ANCHOR:C}=TP.globChars(n),R=r.dot?I:E,N=r.dot?v:E,U=r.capture?"":"?:",V={negated:!1,prefix:""},te=r.bash===!0?".*?":x;r.capture&&(te=`(${te})`);let ae=he=>he.noglobstar===!0?te:`(${U}(?:(?!${C}${he.dot?h:u}).)*?)`,fe=he=>{switch(he){case"*":return`${R}${p}${te}`;case".*":return`${u}${p}${te}`;case"*.*":return`${R}${te}${u}${p}${te}`;case"*/*":return`${R}${te}${A}${p}${N}${te}`;case"**":return R+ae(r);case"**/*":return`(?:${R}${ae(r)}${A})?${N}${p}${te}`;case"**/*.*":return`(?:${R}${ae(r)}${A})?${N}${te}${u}${p}${te}`;case"**/.*":return`(?:${R}${ae(r)}${A})?${u}${p}${te}`;default:{let Be=/^(.*?)\.(\w+)$/.exec(he);if(!Be)return;let we=fe(Be[1]);return we?we+u+Be[2]:void 0}}},ue=il.removePrefix(t,V),me=fe(ue);return me&&r.strictSlashes!==!0&&(me+=`${A}?`),me};PZ.exports=LL});var xZ=_((XQt,bZ)=>{"use strict";var $7e=ve("path"),eYe=vZ(),NL=SZ(),OL=kI(),tYe=xI(),rYe=t=>t&&typeof t=="object"&&!Array.isArray(t),Mi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(v=>Mi(v,e,r));return v=>{for(let x of E){let C=x(v);if(C)return C}return!1}}let o=rYe(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!o)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=OL.isWindows(e),u=o?Mi.compileRe(t,e):Mi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Mi(a.ignore,E,r)}let h=(E,I=!1)=>{let{isMatch:v,match:x,output:C}=Mi.test(E,u,e,{glob:t,posix:n}),R={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:x,isMatch:v};return typeof a.onResult=="function"&&a.onResult(R),v===!1?(R.isMatch=!1,I?R:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(R),R.isMatch=!1,I?R:!1):(typeof a.onMatch=="function"&&a.onMatch(R),I?R:!0)};return r&&(h.state=A),h};Mi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},u=n.format||(a?OL.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Mi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:Boolean(A),match:A,output:p}};Mi.matchBase=(t,e,r,o=OL.isWindows(r))=>(e instanceof RegExp?e:Mi.makeRe(e,r)).test($7e.basename(t));Mi.isMatch=(t,e,r)=>Mi(e,r)(t);Mi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Mi.parse(r,e)):NL(t,{...e,fastpaths:!1});Mi.scan=(t,e)=>eYe(t,e);Mi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",u=a.contains?"":"$",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Mi.toRegex(A,e);return o===!0&&(p.state=t),p};Mi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=NL.fastpaths(t,e)),a.output||(a=NL(t,e)),Mi.compileRe(a,e,r,o)};Mi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Mi.constants=tYe;bZ.exports=Mi});var QZ=_((ZQt,kZ)=>{"use strict";kZ.exports=xZ()});var Zo=_(($Qt,LZ)=>{"use strict";var RZ=ve("util"),TZ=AZ(),Vu=QZ(),ML=kI(),FZ=t=>t===""||t==="./",yi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};yi.match=yi;yi.matcher=(t,e)=>Vu(t,e);yi.isMatch=(t,e,r)=>Vu(e,r)(t);yi.any=yi.isMatch;yi.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(yi(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};yi.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${RZ.inspect(t)}"`);if(Array.isArray(e))return e.some(o=>yi.contains(t,o,r));if(typeof e=="string"){if(FZ(t)||FZ(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return yi.isMatch(t,e,{...r,contains:!0})};yi.matchKeys=(t,e,r)=>{if(!ML.isObject(t))throw new TypeError("Expected the first argument to be an object");let o=yi(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};yi.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Vu(String(a),r);if(o.some(u=>n(u)))return!0}return!1};yi.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Vu(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};yi.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${RZ.inspect(t)}"`);return[].concat(e).every(o=>Vu(o,r)(t))};yi.capture=(t,e,r)=>{let o=ML.isWindows(r),n=Vu.makeRe(String(t),{...r,capture:!0}).exec(o?ML.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?"":u)};yi.makeRe=(...t)=>Vu.makeRe(...t);yi.scan=(...t)=>Vu.scan(...t);yi.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of TZ(String(o),e))r.push(Vu.parse(a,e));return r};yi.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:TZ(t,e)};yi.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return yi.braces(t,{...e,expand:!0})};LZ.exports=yi});var OZ=_((eFt,NZ)=>{"use strict";NZ.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var NP=_((tFt,MZ)=>{"use strict";var nYe=OZ();MZ.exports=t=>typeof t=="string"?t.replace(nYe(),""):t});var _Z=_((rFt,UZ)=>{function iYe(){this.__data__=[],this.size=0}UZ.exports=iYe});var Ly=_((nFt,HZ)=>{function sYe(t,e){return t===e||t!==t&&e!==e}HZ.exports=sYe});var FI=_((iFt,qZ)=>{var oYe=Ly();function aYe(t,e){for(var r=t.length;r--;)if(oYe(t[r][0],e))return r;return-1}qZ.exports=aYe});var jZ=_((sFt,GZ)=>{var lYe=FI(),cYe=Array.prototype,uYe=cYe.splice;function AYe(t){var e=this.__data__,r=lYe(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():uYe.call(e,r,1),--this.size,!0}GZ.exports=AYe});var WZ=_((oFt,YZ)=>{var fYe=FI();function pYe(t){var e=this.__data__,r=fYe(e,t);return r<0?void 0:e[r][1]}YZ.exports=pYe});var zZ=_((aFt,KZ)=>{var hYe=FI();function gYe(t){return hYe(this.__data__,t)>-1}KZ.exports=gYe});var JZ=_((lFt,VZ)=>{var dYe=FI();function mYe(t,e){var r=this.__data__,o=dYe(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}VZ.exports=mYe});var RI=_((cFt,XZ)=>{var yYe=_Z(),EYe=jZ(),CYe=WZ(),wYe=zZ(),IYe=JZ();function Ny(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var BYe=RI();function vYe(){this.__data__=new BYe,this.size=0}ZZ.exports=vYe});var t$=_((AFt,e$)=>{function DYe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}e$.exports=DYe});var n$=_((fFt,r$)=>{function PYe(t){return this.__data__.get(t)}r$.exports=PYe});var s$=_((pFt,i$)=>{function SYe(t){return this.__data__.has(t)}i$.exports=SYe});var UL=_((hFt,o$)=>{var bYe=typeof global=="object"&&global&&global.Object===Object&&global;o$.exports=bYe});var Hl=_((gFt,a$)=>{var xYe=UL(),kYe=typeof self=="object"&&self&&self.Object===Object&&self,QYe=xYe||kYe||Function("return this")();a$.exports=QYe});var hd=_((dFt,l$)=>{var FYe=Hl(),RYe=FYe.Symbol;l$.exports=RYe});var f$=_((mFt,A$)=>{var c$=hd(),u$=Object.prototype,TYe=u$.hasOwnProperty,LYe=u$.toString,TI=c$?c$.toStringTag:void 0;function NYe(t){var e=TYe.call(t,TI),r=t[TI];try{t[TI]=void 0;var o=!0}catch{}var a=LYe.call(t);return o&&(e?t[TI]=r:delete t[TI]),a}A$.exports=NYe});var h$=_((yFt,p$)=>{var OYe=Object.prototype,MYe=OYe.toString;function UYe(t){return MYe.call(t)}p$.exports=UYe});var gd=_((EFt,m$)=>{var g$=hd(),_Ye=f$(),HYe=h$(),qYe="[object Null]",GYe="[object Undefined]",d$=g$?g$.toStringTag:void 0;function jYe(t){return t==null?t===void 0?GYe:qYe:d$&&d$ in Object(t)?_Ye(t):HYe(t)}m$.exports=jYe});var sl=_((CFt,y$)=>{function YYe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}y$.exports=YYe});var OP=_((wFt,E$)=>{var WYe=gd(),KYe=sl(),zYe="[object AsyncFunction]",VYe="[object Function]",JYe="[object GeneratorFunction]",XYe="[object Proxy]";function ZYe(t){if(!KYe(t))return!1;var e=WYe(t);return e==VYe||e==JYe||e==zYe||e==XYe}E$.exports=ZYe});var w$=_((IFt,C$)=>{var $Ye=Hl(),eWe=$Ye["__core-js_shared__"];C$.exports=eWe});var v$=_((BFt,B$)=>{var _L=w$(),I$=function(){var t=/[^.]+$/.exec(_L&&_L.keys&&_L.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function tWe(t){return!!I$&&I$ in t}B$.exports=tWe});var HL=_((vFt,D$)=>{var rWe=Function.prototype,nWe=rWe.toString;function iWe(t){if(t!=null){try{return nWe.call(t)}catch{}try{return t+""}catch{}}return""}D$.exports=iWe});var S$=_((DFt,P$)=>{var sWe=OP(),oWe=v$(),aWe=sl(),lWe=HL(),cWe=/[\\^$.*+?()[\]{}|]/g,uWe=/^\[object .+?Constructor\]$/,AWe=Function.prototype,fWe=Object.prototype,pWe=AWe.toString,hWe=fWe.hasOwnProperty,gWe=RegExp("^"+pWe.call(hWe).replace(cWe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function dWe(t){if(!aWe(t)||oWe(t))return!1;var e=sWe(t)?gWe:uWe;return e.test(lWe(t))}P$.exports=dWe});var x$=_((PFt,b$)=>{function mWe(t,e){return t?.[e]}b$.exports=mWe});var Xp=_((SFt,k$)=>{var yWe=S$(),EWe=x$();function CWe(t,e){var r=EWe(t,e);return yWe(r)?r:void 0}k$.exports=CWe});var MP=_((bFt,Q$)=>{var wWe=Xp(),IWe=Hl(),BWe=wWe(IWe,"Map");Q$.exports=BWe});var LI=_((xFt,F$)=>{var vWe=Xp(),DWe=vWe(Object,"create");F$.exports=DWe});var L$=_((kFt,T$)=>{var R$=LI();function PWe(){this.__data__=R$?R$(null):{},this.size=0}T$.exports=PWe});var O$=_((QFt,N$)=>{function SWe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}N$.exports=SWe});var U$=_((FFt,M$)=>{var bWe=LI(),xWe="__lodash_hash_undefined__",kWe=Object.prototype,QWe=kWe.hasOwnProperty;function FWe(t){var e=this.__data__;if(bWe){var r=e[t];return r===xWe?void 0:r}return QWe.call(e,t)?e[t]:void 0}M$.exports=FWe});var H$=_((RFt,_$)=>{var RWe=LI(),TWe=Object.prototype,LWe=TWe.hasOwnProperty;function NWe(t){var e=this.__data__;return RWe?e[t]!==void 0:LWe.call(e,t)}_$.exports=NWe});var G$=_((TFt,q$)=>{var OWe=LI(),MWe="__lodash_hash_undefined__";function UWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=OWe&&e===void 0?MWe:e,this}q$.exports=UWe});var Y$=_((LFt,j$)=>{var _We=L$(),HWe=O$(),qWe=U$(),GWe=H$(),jWe=G$();function Oy(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var W$=Y$(),YWe=RI(),WWe=MP();function KWe(){this.size=0,this.__data__={hash:new W$,map:new(WWe||YWe),string:new W$}}K$.exports=KWe});var J$=_((OFt,V$)=>{function zWe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}V$.exports=zWe});var NI=_((MFt,X$)=>{var VWe=J$();function JWe(t,e){var r=t.__data__;return VWe(e)?r[typeof e=="string"?"string":"hash"]:r.map}X$.exports=JWe});var $$=_((UFt,Z$)=>{var XWe=NI();function ZWe(t){var e=XWe(this,t).delete(t);return this.size-=e?1:0,e}Z$.exports=ZWe});var tee=_((_Ft,eee)=>{var $We=NI();function eKe(t){return $We(this,t).get(t)}eee.exports=eKe});var nee=_((HFt,ree)=>{var tKe=NI();function rKe(t){return tKe(this,t).has(t)}ree.exports=rKe});var see=_((qFt,iee)=>{var nKe=NI();function iKe(t,e){var r=nKe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}iee.exports=iKe});var UP=_((GFt,oee)=>{var sKe=z$(),oKe=$$(),aKe=tee(),lKe=nee(),cKe=see();function My(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var uKe=RI(),AKe=MP(),fKe=UP(),pKe=200;function hKe(t,e){var r=this.__data__;if(r instanceof uKe){var o=r.__data__;if(!AKe||o.length{var gKe=RI(),dKe=$Z(),mKe=t$(),yKe=n$(),EKe=s$(),CKe=lee();function Uy(t){var e=this.__data__=new gKe(t);this.size=e.size}Uy.prototype.clear=dKe;Uy.prototype.delete=mKe;Uy.prototype.get=yKe;Uy.prototype.has=EKe;Uy.prototype.set=CKe;cee.exports=Uy});var Aee=_((WFt,uee)=>{var wKe="__lodash_hash_undefined__";function IKe(t){return this.__data__.set(t,wKe),this}uee.exports=IKe});var pee=_((KFt,fee)=>{function BKe(t){return this.__data__.has(t)}fee.exports=BKe});var gee=_((zFt,hee)=>{var vKe=UP(),DKe=Aee(),PKe=pee();function HP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new vKe;++e{function SKe(t,e){for(var r=-1,o=t==null?0:t.length;++r{function bKe(t,e){return t.has(e)}yee.exports=bKe});var qL=_((XFt,Cee)=>{var xKe=gee(),kKe=mee(),QKe=Eee(),FKe=1,RKe=2;function TKe(t,e,r,o,a,n){var u=r&FKe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var I=-1,v=!0,x=r&RKe?new xKe:void 0;for(n.set(t,e),n.set(e,t);++I{var LKe=Hl(),NKe=LKe.Uint8Array;wee.exports=NKe});var Bee=_(($Ft,Iee)=>{function OKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}Iee.exports=OKe});var Dee=_((eRt,vee)=>{function MKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}vee.exports=MKe});var kee=_((tRt,xee)=>{var Pee=hd(),See=jL(),UKe=Ly(),_Ke=qL(),HKe=Bee(),qKe=Dee(),GKe=1,jKe=2,YKe="[object Boolean]",WKe="[object Date]",KKe="[object Error]",zKe="[object Map]",VKe="[object Number]",JKe="[object RegExp]",XKe="[object Set]",ZKe="[object String]",$Ke="[object Symbol]",eze="[object ArrayBuffer]",tze="[object DataView]",bee=Pee?Pee.prototype:void 0,YL=bee?bee.valueOf:void 0;function rze(t,e,r,o,a,n,u){switch(r){case tze:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case eze:return!(t.byteLength!=e.byteLength||!n(new See(t),new See(e)));case YKe:case WKe:case VKe:return UKe(+t,+e);case KKe:return t.name==e.name&&t.message==e.message;case JKe:case ZKe:return t==e+"";case zKe:var A=HKe;case XKe:var p=o&GKe;if(A||(A=qKe),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=jKe,u.set(t,e);var E=_Ke(A(t),A(e),o,a,n,u);return u.delete(t),E;case $Ke:if(YL)return YL.call(t)==YL.call(e)}return!1}xee.exports=rze});var qP=_((rRt,Qee)=>{function nze(t,e){for(var r=-1,o=e.length,a=t.length;++r{var ize=Array.isArray;Fee.exports=ize});var WL=_((iRt,Ree)=>{var sze=qP(),oze=ql();function aze(t,e,r){var o=e(t);return oze(t)?o:sze(o,r(t))}Ree.exports=aze});var Lee=_((sRt,Tee)=>{function lze(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r{function cze(){return[]}Nee.exports=cze});var GP=_((aRt,Mee)=>{var uze=Lee(),Aze=KL(),fze=Object.prototype,pze=fze.propertyIsEnumerable,Oee=Object.getOwnPropertySymbols,hze=Oee?function(t){return t==null?[]:(t=Object(t),uze(Oee(t),function(e){return pze.call(t,e)}))}:Aze;Mee.exports=hze});var _ee=_((lRt,Uee)=>{function gze(t,e){for(var r=-1,o=Array(t);++r{function dze(t){return t!=null&&typeof t=="object"}Hee.exports=dze});var Gee=_((uRt,qee)=>{var mze=gd(),yze=Ju(),Eze="[object Arguments]";function Cze(t){return yze(t)&&mze(t)==Eze}qee.exports=Cze});var OI=_((ARt,Wee)=>{var jee=Gee(),wze=Ju(),Yee=Object.prototype,Ize=Yee.hasOwnProperty,Bze=Yee.propertyIsEnumerable,vze=jee(function(){return arguments}())?jee:function(t){return wze(t)&&Ize.call(t,"callee")&&!Bze.call(t,"callee")};Wee.exports=vze});var zee=_((fRt,Kee)=>{function Dze(){return!1}Kee.exports=Dze});var UI=_((MI,_y)=>{var Pze=Hl(),Sze=zee(),Xee=typeof MI=="object"&&MI&&!MI.nodeType&&MI,Vee=Xee&&typeof _y=="object"&&_y&&!_y.nodeType&&_y,bze=Vee&&Vee.exports===Xee,Jee=bze?Pze.Buffer:void 0,xze=Jee?Jee.isBuffer:void 0,kze=xze||Sze;_y.exports=kze});var _I=_((pRt,Zee)=>{var Qze=9007199254740991,Fze=/^(?:0|[1-9]\d*)$/;function Rze(t,e){var r=typeof t;return e=e??Qze,!!e&&(r=="number"||r!="symbol"&&Fze.test(t))&&t>-1&&t%1==0&&t{var Tze=9007199254740991;function Lze(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=Tze}$ee.exports=Lze});var tte=_((gRt,ete)=>{var Nze=gd(),Oze=jP(),Mze=Ju(),Uze="[object Arguments]",_ze="[object Array]",Hze="[object Boolean]",qze="[object Date]",Gze="[object Error]",jze="[object Function]",Yze="[object Map]",Wze="[object Number]",Kze="[object Object]",zze="[object RegExp]",Vze="[object Set]",Jze="[object String]",Xze="[object WeakMap]",Zze="[object ArrayBuffer]",$ze="[object DataView]",eVe="[object Float32Array]",tVe="[object Float64Array]",rVe="[object Int8Array]",nVe="[object Int16Array]",iVe="[object Int32Array]",sVe="[object Uint8Array]",oVe="[object Uint8ClampedArray]",aVe="[object Uint16Array]",lVe="[object Uint32Array]",ui={};ui[eVe]=ui[tVe]=ui[rVe]=ui[nVe]=ui[iVe]=ui[sVe]=ui[oVe]=ui[aVe]=ui[lVe]=!0;ui[Uze]=ui[_ze]=ui[Zze]=ui[Hze]=ui[$ze]=ui[qze]=ui[Gze]=ui[jze]=ui[Yze]=ui[Wze]=ui[Kze]=ui[zze]=ui[Vze]=ui[Jze]=ui[Xze]=!1;function cVe(t){return Mze(t)&&Oze(t.length)&&!!ui[Nze(t)]}ete.exports=cVe});var YP=_((dRt,rte)=>{function uVe(t){return function(e){return t(e)}}rte.exports=uVe});var WP=_((HI,Hy)=>{var AVe=UL(),nte=typeof HI=="object"&&HI&&!HI.nodeType&&HI,qI=nte&&typeof Hy=="object"&&Hy&&!Hy.nodeType&&Hy,fVe=qI&&qI.exports===nte,zL=fVe&&AVe.process,pVe=function(){try{var t=qI&&qI.require&&qI.require("util").types;return t||zL&&zL.binding&&zL.binding("util")}catch{}}();Hy.exports=pVe});var KP=_((mRt,ote)=>{var hVe=tte(),gVe=YP(),ite=WP(),ste=ite&&ite.isTypedArray,dVe=ste?gVe(ste):hVe;ote.exports=dVe});var VL=_((yRt,ate)=>{var mVe=_ee(),yVe=OI(),EVe=ql(),CVe=UI(),wVe=_I(),IVe=KP(),BVe=Object.prototype,vVe=BVe.hasOwnProperty;function DVe(t,e){var r=EVe(t),o=!r&&yVe(t),a=!r&&!o&&CVe(t),n=!r&&!o&&!a&&IVe(t),u=r||o||a||n,A=u?mVe(t.length,String):[],p=A.length;for(var h in t)(e||vVe.call(t,h))&&!(u&&(h=="length"||a&&(h=="offset"||h=="parent")||n&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||wVe(h,p)))&&A.push(h);return A}ate.exports=DVe});var zP=_((ERt,lte)=>{var PVe=Object.prototype;function SVe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||PVe;return t===r}lte.exports=SVe});var JL=_((CRt,cte)=>{function bVe(t,e){return function(r){return t(e(r))}}cte.exports=bVe});var Ate=_((wRt,ute)=>{var xVe=JL(),kVe=xVe(Object.keys,Object);ute.exports=kVe});var pte=_((IRt,fte)=>{var QVe=zP(),FVe=Ate(),RVe=Object.prototype,TVe=RVe.hasOwnProperty;function LVe(t){if(!QVe(t))return FVe(t);var e=[];for(var r in Object(t))TVe.call(t,r)&&r!="constructor"&&e.push(r);return e}fte.exports=LVe});var GI=_((BRt,hte)=>{var NVe=OP(),OVe=jP();function MVe(t){return t!=null&&OVe(t.length)&&!NVe(t)}hte.exports=MVe});var VP=_((vRt,gte)=>{var UVe=VL(),_Ve=pte(),HVe=GI();function qVe(t){return HVe(t)?UVe(t):_Ve(t)}gte.exports=qVe});var XL=_((DRt,dte)=>{var GVe=WL(),jVe=GP(),YVe=VP();function WVe(t){return GVe(t,YVe,jVe)}dte.exports=WVe});var Ete=_((PRt,yte)=>{var mte=XL(),KVe=1,zVe=Object.prototype,VVe=zVe.hasOwnProperty;function JVe(t,e,r,o,a,n){var u=r&KVe,A=mte(t),p=A.length,h=mte(e),E=h.length;if(p!=E&&!u)return!1;for(var I=p;I--;){var v=A[I];if(!(u?v in e:VVe.call(e,v)))return!1}var x=n.get(t),C=n.get(e);if(x&&C)return x==e&&C==t;var R=!0;n.set(t,e),n.set(e,t);for(var N=u;++I{var XVe=Xp(),ZVe=Hl(),$Ve=XVe(ZVe,"DataView");Cte.exports=$Ve});var Bte=_((bRt,Ite)=>{var eJe=Xp(),tJe=Hl(),rJe=eJe(tJe,"Promise");Ite.exports=rJe});var Dte=_((xRt,vte)=>{var nJe=Xp(),iJe=Hl(),sJe=nJe(iJe,"Set");vte.exports=sJe});var Ste=_((kRt,Pte)=>{var oJe=Xp(),aJe=Hl(),lJe=oJe(aJe,"WeakMap");Pte.exports=lJe});var jI=_((QRt,Tte)=>{var ZL=wte(),$L=MP(),eN=Bte(),tN=Dte(),rN=Ste(),Rte=gd(),qy=HL(),bte="[object Map]",cJe="[object Object]",xte="[object Promise]",kte="[object Set]",Qte="[object WeakMap]",Fte="[object DataView]",uJe=qy(ZL),AJe=qy($L),fJe=qy(eN),pJe=qy(tN),hJe=qy(rN),dd=Rte;(ZL&&dd(new ZL(new ArrayBuffer(1)))!=Fte||$L&&dd(new $L)!=bte||eN&&dd(eN.resolve())!=xte||tN&&dd(new tN)!=kte||rN&&dd(new rN)!=Qte)&&(dd=function(t){var e=Rte(t),r=e==cJe?t.constructor:void 0,o=r?qy(r):"";if(o)switch(o){case uJe:return Fte;case AJe:return bte;case fJe:return xte;case pJe:return kte;case hJe:return Qte}return e});Tte.exports=dd});var qte=_((FRt,Hte)=>{var nN=_P(),gJe=qL(),dJe=kee(),mJe=Ete(),Lte=jI(),Nte=ql(),Ote=UI(),yJe=KP(),EJe=1,Mte="[object Arguments]",Ute="[object Array]",JP="[object Object]",CJe=Object.prototype,_te=CJe.hasOwnProperty;function wJe(t,e,r,o,a,n){var u=Nte(t),A=Nte(e),p=u?Ute:Lte(t),h=A?Ute:Lte(e);p=p==Mte?JP:p,h=h==Mte?JP:h;var E=p==JP,I=h==JP,v=p==h;if(v&&Ote(t)){if(!Ote(e))return!1;u=!0,E=!1}if(v&&!E)return n||(n=new nN),u||yJe(t)?gJe(t,e,r,o,a,n):dJe(t,e,p,r,o,a,n);if(!(r&EJe)){var x=E&&_te.call(t,"__wrapped__"),C=I&&_te.call(e,"__wrapped__");if(x||C){var R=x?t.value():t,N=C?e.value():e;return n||(n=new nN),a(R,N,r,o,n)}}return v?(n||(n=new nN),mJe(t,e,r,o,a,n)):!1}Hte.exports=wJe});var Wte=_((RRt,Yte)=>{var IJe=qte(),Gte=Ju();function jte(t,e,r,o,a){return t===e?!0:t==null||e==null||!Gte(t)&&!Gte(e)?t!==t&&e!==e:IJe(t,e,r,o,jte,a)}Yte.exports=jte});var zte=_((TRt,Kte)=>{var BJe=Wte();function vJe(t,e){return BJe(t,e)}Kte.exports=vJe});var iN=_((LRt,Vte)=>{var DJe=Xp(),PJe=function(){try{var t=DJe(Object,"defineProperty");return t({},"",{}),t}catch{}}();Vte.exports=PJe});var XP=_((NRt,Xte)=>{var Jte=iN();function SJe(t,e,r){e=="__proto__"&&Jte?Jte(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}Xte.exports=SJe});var sN=_((ORt,Zte)=>{var bJe=XP(),xJe=Ly();function kJe(t,e,r){(r!==void 0&&!xJe(t[e],r)||r===void 0&&!(e in t))&&bJe(t,e,r)}Zte.exports=kJe});var ere=_((MRt,$te)=>{function QJe(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}$te.exports=QJe});var rre=_((URt,tre)=>{var FJe=ere(),RJe=FJe();tre.exports=RJe});var oN=_((YI,Gy)=>{var TJe=Hl(),ore=typeof YI=="object"&&YI&&!YI.nodeType&&YI,nre=ore&&typeof Gy=="object"&&Gy&&!Gy.nodeType&&Gy,LJe=nre&&nre.exports===ore,ire=LJe?TJe.Buffer:void 0,sre=ire?ire.allocUnsafe:void 0;function NJe(t,e){if(e)return t.slice();var r=t.length,o=sre?sre(r):new t.constructor(r);return t.copy(o),o}Gy.exports=NJe});var ZP=_((_Rt,lre)=>{var are=jL();function OJe(t){var e=new t.constructor(t.byteLength);return new are(e).set(new are(t)),e}lre.exports=OJe});var aN=_((HRt,cre)=>{var MJe=ZP();function UJe(t,e){var r=e?MJe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}cre.exports=UJe});var $P=_((qRt,ure)=>{function _Je(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r{var HJe=sl(),Are=Object.create,qJe=function(){function t(){}return function(e){if(!HJe(e))return{};if(Are)return Are(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();fre.exports=qJe});var eS=_((jRt,hre)=>{var GJe=JL(),jJe=GJe(Object.getPrototypeOf,Object);hre.exports=jJe});var lN=_((YRt,gre)=>{var YJe=pre(),WJe=eS(),KJe=zP();function zJe(t){return typeof t.constructor=="function"&&!KJe(t)?YJe(WJe(t)):{}}gre.exports=zJe});var mre=_((WRt,dre)=>{var VJe=GI(),JJe=Ju();function XJe(t){return JJe(t)&&VJe(t)}dre.exports=XJe});var cN=_((KRt,Ere)=>{var ZJe=gd(),$Je=eS(),eXe=Ju(),tXe="[object Object]",rXe=Function.prototype,nXe=Object.prototype,yre=rXe.toString,iXe=nXe.hasOwnProperty,sXe=yre.call(Object);function oXe(t){if(!eXe(t)||ZJe(t)!=tXe)return!1;var e=$Je(t);if(e===null)return!0;var r=iXe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&yre.call(r)==sXe}Ere.exports=oXe});var uN=_((zRt,Cre)=>{function aXe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}Cre.exports=aXe});var tS=_((VRt,wre)=>{var lXe=XP(),cXe=Ly(),uXe=Object.prototype,AXe=uXe.hasOwnProperty;function fXe(t,e,r){var o=t[e];(!(AXe.call(t,e)&&cXe(o,r))||r===void 0&&!(e in t))&&lXe(t,e,r)}wre.exports=fXe});var md=_((JRt,Ire)=>{var pXe=tS(),hXe=XP();function gXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n{function dXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}Bre.exports=dXe});var Pre=_((ZRt,Dre)=>{var mXe=sl(),yXe=zP(),EXe=vre(),CXe=Object.prototype,wXe=CXe.hasOwnProperty;function IXe(t){if(!mXe(t))return EXe(t);var e=yXe(t),r=[];for(var o in t)o=="constructor"&&(e||!wXe.call(t,o))||r.push(o);return r}Dre.exports=IXe});var jy=_(($Rt,Sre)=>{var BXe=VL(),vXe=Pre(),DXe=GI();function PXe(t){return DXe(t)?BXe(t,!0):vXe(t)}Sre.exports=PXe});var xre=_((eTt,bre)=>{var SXe=md(),bXe=jy();function xXe(t){return SXe(t,bXe(t))}bre.exports=xXe});var Lre=_((tTt,Tre)=>{var kre=sN(),kXe=oN(),QXe=aN(),FXe=$P(),RXe=lN(),Qre=OI(),Fre=ql(),TXe=mre(),LXe=UI(),NXe=OP(),OXe=sl(),MXe=cN(),UXe=KP(),Rre=uN(),_Xe=xre();function HXe(t,e,r,o,a,n,u){var A=Rre(t,r),p=Rre(e,r),h=u.get(p);if(h){kre(t,r,h);return}var E=n?n(A,p,r+"",t,e,u):void 0,I=E===void 0;if(I){var v=Fre(p),x=!v&&LXe(p),C=!v&&!x&&UXe(p);E=p,v||x||C?Fre(A)?E=A:TXe(A)?E=FXe(A):x?(I=!1,E=kXe(p,!0)):C?(I=!1,E=QXe(p,!0)):E=[]:MXe(p)||Qre(p)?(E=A,Qre(A)?E=_Xe(A):(!OXe(A)||NXe(A))&&(E=RXe(p))):I=!1}I&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),kre(t,r,E)}Tre.exports=HXe});var Mre=_((rTt,Ore)=>{var qXe=_P(),GXe=sN(),jXe=rre(),YXe=Lre(),WXe=sl(),KXe=jy(),zXe=uN();function Nre(t,e,r,o,a){t!==e&&jXe(e,function(n,u){if(a||(a=new qXe),WXe(n))YXe(t,e,u,r,Nre,o,a);else{var A=o?o(zXe(t,u),n,u+"",t,e,a):void 0;A===void 0&&(A=n),GXe(t,u,A)}},KXe)}Ore.exports=Nre});var AN=_((nTt,Ure)=>{function VXe(t){return t}Ure.exports=VXe});var Hre=_((iTt,_re)=>{function JXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}_re.exports=JXe});var fN=_((sTt,Gre)=>{var XXe=Hre(),qre=Math.max;function ZXe(t,e,r){return e=qre(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=qre(o.length-e,0),u=Array(n);++a{function $Xe(t){return function(){return t}}jre.exports=$Xe});var zre=_((aTt,Kre)=>{var eZe=Yre(),Wre=iN(),tZe=AN(),rZe=Wre?function(t,e){return Wre(t,"toString",{configurable:!0,enumerable:!1,value:eZe(e),writable:!0})}:tZe;Kre.exports=rZe});var Jre=_((lTt,Vre)=>{var nZe=800,iZe=16,sZe=Date.now;function oZe(t){var e=0,r=0;return function(){var o=sZe(),a=iZe-(o-r);if(r=o,a>0){if(++e>=nZe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}Vre.exports=oZe});var pN=_((cTt,Xre)=>{var aZe=zre(),lZe=Jre(),cZe=lZe(aZe);Xre.exports=cZe});var $re=_((uTt,Zre)=>{var uZe=AN(),AZe=fN(),fZe=pN();function pZe(t,e){return fZe(AZe(t,e,uZe),t+"")}Zre.exports=pZe});var tne=_((ATt,ene)=>{var hZe=Ly(),gZe=GI(),dZe=_I(),mZe=sl();function yZe(t,e,r){if(!mZe(r))return!1;var o=typeof e;return(o=="number"?gZe(r)&&dZe(e,r.length):o=="string"&&e in r)?hZe(r[e],t):!1}ene.exports=yZe});var nne=_((fTt,rne)=>{var EZe=$re(),CZe=tne();function wZe(t){return EZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n=="function"?(a--,n):void 0,u&&CZe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o{var IZe=Mre(),BZe=nne(),vZe=BZe(function(t,e,r,o){IZe(t,e,r,o)});ine.exports=vZe});var _e={};zt(_e,{AsyncActions:()=>dN,BufferStream:()=>gN,CachingStrategy:()=>mne,DefaultStream:()=>mN,allSettledSafe:()=>_c,assertNever:()=>EN,bufferStream:()=>zy,buildIgnorePattern:()=>QZe,convertMapsToIndexableObjects:()=>nS,dynamicRequire:()=>Df,escapeRegExp:()=>PZe,getArrayWithDefault:()=>Yy,getFactoryWithDefault:()=>al,getMapWithDefault:()=>Wy,getSetWithDefault:()=>yd,groupBy:()=>IN,isIndexableObject:()=>hN,isPathLike:()=>FZe,isTaggedYarnVersion:()=>DZe,makeDeferred:()=>hne,mapAndFilter:()=>ol,mapAndFind:()=>KI,mergeIntoTarget:()=>Ene,overrideType:()=>SZe,parseBoolean:()=>zI,parseInt:()=>Vy,parseOptionalBoolean:()=>yne,plural:()=>rS,prettifyAsyncErrors:()=>Ky,prettifySyncErrors:()=>CN,releaseAfterUseAsync:()=>xZe,replaceEnvVariables:()=>iS,sortMap:()=>ks,toMerged:()=>RZe,tryParseOptionalBoolean:()=>wN,validateEnum:()=>bZe});function DZe(t){return!!(Ane.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function rS(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}function PZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function SZe(t){}function EN(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function bZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new it(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(", ")})`);return e}function ol(t,e){let r=[];for(let o of t){let a=e(o);a!==fne&&r.push(a)}return r}function KI(t,e){for(let r of t){let o=e(r);if(o!==pne)return o}}function hN(t){return typeof t=="object"&&t!==null}async function _c(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status==="rejected")throw o.reason;r.push(o.value)}return r}function nS(t){if(t instanceof Map&&(t=Object.fromEntries(t)),hN(t))for(let e of Object.keys(t)){let r=t[e];hN(r)&&(t[e]=nS(r))}return t}function al(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}function Yy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function yd(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function Wy(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function xZe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function Ky(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function CN(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function zy(t){return await new Promise((e,r)=>{let o=[];t.on("error",a=>{r(a)}),t.on("data",a=>{o.push(a)}),t.on("end",()=>{e(Buffer.concat(o))})})}function hne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function gne(t){return WI(le.fromPortablePath(t))}function dne(path){let physicalPath=le.fromPortablePath(path),currentCacheEntry=WI.cache[physicalPath];delete WI.cache[physicalPath];let result;try{result=gne(physicalPath);let freshCacheEntry=WI.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{WI.cache[physicalPath]=currentCacheEntry}return result}function kZe(t){let e=one.get(t),r=oe.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let o=dne(t);return one.set(t,{mtime:r.mtimeMs,instance:o}),o}function Df(t,{cachingStrategy:e=2}={}){switch(e){case 0:return dne(t);case 1:return kZe(t);case 2:return gne(t);default:throw new Error("Unsupported caching strategy")}}function ks(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function QZe(t){return t.length===0?null:t.map(e=>`(${cne.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function iS(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.hasOwn(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new it(`Environment variable not found (${a})`)})}function zI(t){switch(t){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 "${t}" as a boolean`)}}function yne(t){return typeof t>"u"?t:zI(t)}function wN(t){try{return yne(t)}catch{return null}}function FZe(t){return!!(le.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function Ene(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,lne.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,ane.default)(h,p))||u.push(p);return u}});return n}function RZe(...t){return Ene({},...t)}function IN(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[a]??=[],r[a].push(o)}return r}function Vy(t){return typeof t=="string"?Number.parseInt(t,10):t}var ane,lne,cne,une,Ane,yN,fne,pne,gN,dN,mN,WI,one,mne,Gl=Et(()=>{Pt();qt();ane=$e(zte()),lne=$e(sne()),cne=$e(Zo()),une=$e(sd()),Ane=$e(Jn()),yN=ve("stream");fne=Symbol();ol.skip=fne;pne=Symbol();KI.skip=pne;gN=class extends yN.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};dN=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,une.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=hne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},mN=class extends yN.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},WI=eval("require");one=new Map;mne=(o=>(o[o.NoCache=0]="NoCache",o[o.FsTime=1]="FsTime",o[o.Node=2]="Node",o))(mne||{})});var Jy,BN,vN,Cne=Et(()=>{Jy=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))(Jy||{}),BN=(o=>(o.Dependency="Dependency",o.PeerDependency="PeerDependency",o.PeerDependencyMeta="PeerDependencyMeta",o))(BN||{}),vN=(o=>(o.Inactive="inactive",o.Redundant="redundant",o.Active="active",o))(vN||{})});var de={};zt(de,{LogLevel:()=>cS,Style:()=>oS,Type:()=>yt,addLogFilterSupport:()=>XI,applyColor:()=>zs,applyHyperlink:()=>Zy,applyStyle:()=>Ed,json:()=>Cd,jsonOrPretty:()=>NZe,mark:()=>xN,pretty:()=>Ut,prettyField:()=>Xu,prettyList:()=>bN,prettyTruncatedLocatorList:()=>lS,stripAnsi:()=>Xy.default,supportsColor:()=>aS,supportsHyperlinks:()=>SN,tuple:()=>Hc});function wne(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let o=1024**r;return`${Math.floor(t*100/o)/100} ${e[r-1]}`}function Hc(t,e){return[e,t]}function Ed(t,e,r){return t.get("enableColors")&&r&2&&(e=JI.default.bold(e)),e}function zs(t,e,r){if(!t.get("enableColors"))return e;let o=TZe.get(r);if(o===null)return e;let a=typeof o>"u"?r:PN.level>=3?o[0]:o[1],n=typeof a=="number"?DN.ansi256(a):a.startsWith("#")?DN.hex(a):DN[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function Zy(t,e,r){return t.get("enableHyperlinks")?LZe?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Ut(t,e,r){if(e===null)return zs(t,"null",yt.NULL);if(Object.hasOwn(sS,r))return sS[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return zs(t,e,r)}function bN(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Ut(t,a,r)).join(o)}function Cd(t,e){if(t===null)return null;if(Object.hasOwn(sS,e))return sS[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function NZe(t,e,[r,o]){return t?Cd(r,o):Ut(e,r,o)}function xN(t){return{Check:zs(t,"\u2713","green"),Cross:zs(t,"\u2718","red"),Question:zs(t,"?","cyan")}}function Xu(t,{label:e,value:[r,o]}){return`${Ut(t,e,yt.CODE)}: ${Ut(t,r,o)}`}function lS(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${qr(t,h)}, `,I=kN(h).length+2;if(o.length>0&&nh).join("").slice(0,-2);let u="X".repeat(a.length.toString().length),A=`and ${u} more.`,p=a.length;for(;o.length>1&&nh).join(""),A.replace(u,Ut(t,p,yt.NUMBER))].join("")}function XI(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=new Map,n=[];for(let I of r){let v=I.get("level");if(typeof v>"u")continue;let x=I.get("code");typeof x<"u"&&o.set(x,v);let C=I.get("text");typeof C<"u"&&a.set(C,v);let R=I.get("pattern");typeof R<"u"&&n.push([Ine.default.matcher(R,{contains:!0}),v])}n.reverse();let u=(I,v,x)=>{if(I===null||I===0)return x;let C=a.size>0||n.length>0?(0,Xy.default)(v):v;if(a.size>0){let R=a.get(C);if(typeof R<"u")return R??x}if(n.length>0){for(let[R,N]of n)if(R(C))return N??x}if(o.size>0){let R=o.get(Ku(I));if(typeof R<"u")return R??x}return x},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(I,v,x,C){switch(u(v,x,C)){case"info":A.call(I,v,x);break;case"warning":p.call(I,v??0,x);break;case"error":h.call(I,v??0,x);break}};t.reportInfo=function(...I){return E(this,...I,"info")},t.reportWarning=function(...I){return E(this,...I,"warning")},t.reportError=function(...I){return E(this,...I,"error")}}var JI,VI,Ine,Xy,Bne,yt,oS,PN,aS,SN,DN,TZe,So,sS,LZe,cS,jl=Et(()=>{Pt();JI=$e(IL()),VI=$e(rd());qt();Ine=$e(Zo()),Xy=$e(NP()),Bne=ve("util");fP();bo();yt={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},oS=(e=>(e[e.BOLD=2]="BOLD",e))(oS||{}),PN=VI.default.GITHUB_ACTIONS?{level:2}:JI.default.supportsColor?{level:JI.default.supportsColor.level}:{level:0},aS=PN.level!==0,SN=aS&&!VI.default.GITHUB_ACTIONS&&!VI.default.CIRCLE&&!VI.default.GITLAB,DN=new JI.default.Instance(PN),TZe=new Map([[yt.NO_HINT,null],[yt.NULL,["#a853b5",129]],[yt.SCOPE,["#d75f00",166]],[yt.NAME,["#d7875f",173]],[yt.RANGE,["#00afaf",37]],[yt.REFERENCE,["#87afff",111]],[yt.NUMBER,["#ffd700",220]],[yt.PATH,["#d75fd7",170]],[yt.URL,["#d75fd7",170]],[yt.ADDED,["#5faf00",70]],[yt.REMOVED,["#ff3131",160]],[yt.CODE,["#87afff",111]],[yt.SIZE,["#ffd700",220]]]),So=t=>t;sS={[yt.ID]:So({pretty:(t,e)=>typeof e=="number"?zs(t,`${e}`,yt.NUMBER):zs(t,e,yt.CODE),json:t=>t}),[yt.INSPECT]:So({pretty:(t,e)=>(0,Bne.inspect)(e,{depth:1/0,colors:t.get("enableColors"),compact:!0,breakLength:1/0}),json:t=>t}),[yt.NUMBER]:So({pretty:(t,e)=>zs(t,`${e}`,yt.NUMBER),json:t=>t}),[yt.IDENT]:So({pretty:(t,e)=>cs(t,e),json:t=>fn(t)}),[yt.LOCATOR]:So({pretty:(t,e)=>qr(t,e),json:t=>ba(t)}),[yt.DESCRIPTOR]:So({pretty:(t,e)=>Gn(t,e),json:t=>Sa(t)}),[yt.RESOLUTION]:So({pretty:(t,{descriptor:e,locator:r})=>ZI(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:Sa(t),locator:e!==null?ba(e):null})}),[yt.DEPENDENT]:So({pretty:(t,{locator:e,descriptor:r})=>QN(t,e,r),json:({locator:t,descriptor:e})=>({locator:ba(t),descriptor:Sa(e)})}),[yt.PACKAGE_EXTENSION]:So({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${zs(t,"dependencies",yt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependency":return`${cs(t,e.parentDescriptor)} \u27A4 ${zs(t,"peerDependencies",yt.CODE)} \u27A4 ${cs(t,e.descriptor)}`;case"PeerDependencyMeta":return`${cs(t,e.parentDescriptor)} \u27A4 ${zs(t,"peerDependenciesMeta",yt.CODE)} \u27A4 ${cs(t,Vs(e.selector))} \u27A4 ${zs(t,e.key,yt.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${fn(t.parentDescriptor)} > ${fn(t.descriptor)}`;case"PeerDependency":return`${fn(t.parentDescriptor)} >> ${fn(t.descriptor)}`;case"PeerDependencyMeta":return`${fn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[yt.SETTING]:So({pretty:(t,e)=>(t.get(e),Zy(t,zs(t,e,yt.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[yt.DURATION]:So({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[yt.SIZE]:So({pretty:(t,e)=>zs(t,wne(e),yt.NUMBER),json:t=>t}),[yt.SIZE_DIFF]:So({pretty:(t,e)=>{let r=e>=0?"+":"-",o=r==="+"?yt.REMOVED:yt.ADDED;return zs(t,`${r} ${wne(Math.max(Math.abs(e),1))}`,o)},json:t=>t}),[yt.PATH]:So({pretty:(t,e)=>zs(t,le.fromPortablePath(e),yt.PATH),json:t=>le.fromPortablePath(t)}),[yt.MARKDOWN]:So({pretty:(t,{text:e,format:r,paragraphs:o})=>Do(e,{format:r,paragraphs:o}),json:({text:t})=>t}),[yt.MARKDOWN_INLINE]:So({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(r,o,a)=>Ut(t,o+a+o,yt.CODE)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,o,a)=>Ed(t,a,2)),e),json:t=>t})};LZe=!!process.env.KONSOLE_VERSION;cS=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(cS||{})});var vne=_($y=>{"use strict";Object.defineProperty($y,"__esModule",{value:!0});$y.splitWhen=$y.flatten=void 0;function OZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}$y.flatten=OZe;function MZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}$y.splitWhen=MZe});var Dne=_(uS=>{"use strict";Object.defineProperty(uS,"__esModule",{value:!0});uS.isEnoentCodeError=void 0;function UZe(t){return t.code==="ENOENT"}uS.isEnoentCodeError=UZe});var Pne=_(AS=>{"use strict";Object.defineProperty(AS,"__esModule",{value:!0});AS.createDirentFromStats=void 0;var FN=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function _Ze(t,e){return new FN(t,e)}AS.createDirentFromStats=_Ze});var Sne=_(Zu=>{"use strict";Object.defineProperty(Zu,"__esModule",{value:!0});Zu.removeLeadingDotSegment=Zu.escape=Zu.makeAbsolute=Zu.unixify=void 0;var HZe=ve("path"),qZe=2,GZe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function jZe(t){return t.replace(/\\/g,"/")}Zu.unixify=jZe;function YZe(t,e){return HZe.resolve(t,e)}Zu.makeAbsolute=YZe;function WZe(t){return t.replace(GZe,"\\$2")}Zu.escape=WZe;function KZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(qZe)}return t}Zu.removeLeadingDotSegment=KZe});var xne=_((bTt,bne)=>{bne.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Fne=_((xTt,Qne)=>{var zZe=xne(),kne={"{":"}","(":")","[":"]"},VZe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;ee&&(u===-1||u>o||(u=t.indexOf("\\",e),u===-1||u>o)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(u=t.indexOf("\\",e),u===-1||u>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(u=t.indexOf("\\",e),u===-1||u>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(u=t.indexOf("\\",r),u===-1||u>n))))return!0;if(t[e]==="\\"){var A=t[e+1];e+=2;var p=kne[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},JZe=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var XZe=Fne(),ZZe=ve("path").posix.dirname,$Ze=ve("os").platform()==="win32",RN="/",e$e=/\\/g,t$e=/[\{\[].*[\}\]]$/,r$e=/(^|[^\\])([\{\[]|\([^\)]+$)/,n$e=/\\([\!\*\?\|\[\]\(\)\{\}])/g;Rne.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&$Ze&&e.indexOf(RN)<0&&(e=e.replace(e$e,RN)),t$e.test(e)&&(e+=RN),e+="a";do e=ZZe(e);while(XZe(e)||r$e.test(e));return e.replace(n$e,"$1")}});var qne=_(Gr=>{"use strict";Object.defineProperty(Gr,"__esModule",{value:!0});Gr.matchAny=Gr.convertPatternsToRe=Gr.makeRe=Gr.getPatternParts=Gr.expandBraceExpansion=Gr.expandPatternsWithBraceExpansion=Gr.isAffectDepthOfReadingPattern=Gr.endsWithSlashGlobStar=Gr.hasGlobStar=Gr.getBaseDirectory=Gr.isPatternRelatedToParentDirectory=Gr.getPatternsOutsideCurrentDirectory=Gr.getPatternsInsideCurrentDirectory=Gr.getPositivePatterns=Gr.getNegativePatterns=Gr.isPositivePattern=Gr.isNegativePattern=Gr.convertToNegativePattern=Gr.convertToPositivePattern=Gr.isDynamicPattern=Gr.isStaticPattern=void 0;var i$e=ve("path"),s$e=Tne(),TN=Zo(),Lne="**",o$e="\\",a$e=/[*?]|^!/,l$e=/\[[^[]*]/,c$e=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,u$e=/[!*+?@]\([^(]*\)/,A$e=/,|\.\./;function Nne(t,e={}){return!One(t,e)}Gr.isStaticPattern=Nne;function One(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(o$e)||a$e.test(t)||l$e.test(t)||c$e.test(t)||e.extglob!==!1&&u$e.test(t)||e.braceExpansion!==!1&&f$e(t))}Gr.isDynamicPattern=One;function f$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let o=t.slice(e,r);return A$e.test(o)}function p$e(t){return fS(t)?t.slice(1):t}Gr.convertToPositivePattern=p$e;function h$e(t){return"!"+t}Gr.convertToNegativePattern=h$e;function fS(t){return t.startsWith("!")&&t[1]!=="("}Gr.isNegativePattern=fS;function Mne(t){return!fS(t)}Gr.isPositivePattern=Mne;function g$e(t){return t.filter(fS)}Gr.getNegativePatterns=g$e;function d$e(t){return t.filter(Mne)}Gr.getPositivePatterns=d$e;function m$e(t){return t.filter(e=>!LN(e))}Gr.getPatternsInsideCurrentDirectory=m$e;function y$e(t){return t.filter(LN)}Gr.getPatternsOutsideCurrentDirectory=y$e;function LN(t){return t.startsWith("..")||t.startsWith("./..")}Gr.isPatternRelatedToParentDirectory=LN;function E$e(t){return s$e(t,{flipBackslashes:!1})}Gr.getBaseDirectory=E$e;function C$e(t){return t.includes(Lne)}Gr.hasGlobStar=C$e;function Une(t){return t.endsWith("/"+Lne)}Gr.endsWithSlashGlobStar=Une;function w$e(t){let e=i$e.basename(t);return Une(t)||Nne(e)}Gr.isAffectDepthOfReadingPattern=w$e;function I$e(t){return t.reduce((e,r)=>e.concat(_ne(r)),[])}Gr.expandPatternsWithBraceExpansion=I$e;function _ne(t){return TN.braces(t,{expand:!0,nodupes:!0})}Gr.expandBraceExpansion=_ne;function B$e(t,e){let{parts:r}=TN.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}Gr.getPatternParts=B$e;function Hne(t,e){return TN.makeRe(t,e)}Gr.makeRe=Hne;function v$e(t,e){return t.map(r=>Hne(r,e))}Gr.convertPatternsToRe=v$e;function D$e(t,e){return e.some(r=>r.test(t))}Gr.matchAny=D$e});var Wne=_((FTt,Yne)=>{"use strict";var P$e=ve("stream"),Gne=P$e.PassThrough,S$e=Array.prototype.slice;Yne.exports=b$e;function b$e(){let t=[],e=S$e.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=Gne(o);function A(){for(let E=0,I=arguments.length;E0||(r=!1,p())}function x(C){function R(){C.removeListener("merge2UnpipeEnd",R),C.removeListener("end",R),n&&C.removeListener("error",N),v()}function N(U){u.emit("error",U)}if(C._readableState.endEmitted)return v();C.on("merge2UnpipeEnd",R),C.on("end",R),n&&C.on("error",N),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C{"use strict";Object.defineProperty(pS,"__esModule",{value:!0});pS.merge=void 0;var x$e=Wne();function k$e(t){let e=x$e(t);return t.forEach(r=>{r.once("error",o=>e.emit("error",o))}),e.once("close",()=>Kne(t)),e.once("end",()=>Kne(t)),e}pS.merge=k$e;function Kne(t){t.forEach(e=>e.emit("close"))}});var Vne=_(eE=>{"use strict";Object.defineProperty(eE,"__esModule",{value:!0});eE.isEmpty=eE.isString=void 0;function Q$e(t){return typeof t=="string"}eE.isString=Q$e;function F$e(t){return t===""}eE.isEmpty=F$e});var Pf=_(xo=>{"use strict";Object.defineProperty(xo,"__esModule",{value:!0});xo.string=xo.stream=xo.pattern=xo.path=xo.fs=xo.errno=xo.array=void 0;var R$e=vne();xo.array=R$e;var T$e=Dne();xo.errno=T$e;var L$e=Pne();xo.fs=L$e;var N$e=Sne();xo.path=N$e;var O$e=qne();xo.pattern=O$e;var M$e=zne();xo.stream=M$e;var U$e=Vne();xo.string=U$e});var Zne=_(ko=>{"use strict";Object.defineProperty(ko,"__esModule",{value:!0});ko.convertPatternGroupToTask=ko.convertPatternGroupsToTasks=ko.groupPatternsByBaseDirectory=ko.getNegativePatternsAsPositive=ko.getPositivePatterns=ko.convertPatternsToTasks=ko.generate=void 0;var Sf=Pf();function _$e(t,e){let r=Jne(t),o=Xne(t,e.ignore),a=r.filter(p=>Sf.pattern.isStaticPattern(p,e)),n=r.filter(p=>Sf.pattern.isDynamicPattern(p,e)),u=NN(a,o,!1),A=NN(n,o,!0);return u.concat(A)}ko.generate=_$e;function NN(t,e,r){let o=[],a=Sf.pattern.getPatternsOutsideCurrentDirectory(t),n=Sf.pattern.getPatternsInsideCurrentDirectory(t),u=ON(a),A=ON(n);return o.push(...MN(u,e,r)),"."in A?o.push(UN(".",n,e,r)):o.push(...MN(A,e,r)),o}ko.convertPatternsToTasks=NN;function Jne(t){return Sf.pattern.getPositivePatterns(t)}ko.getPositivePatterns=Jne;function Xne(t,e){return Sf.pattern.getNegativePatterns(t).concat(e).map(Sf.pattern.convertToPositivePattern)}ko.getNegativePatternsAsPositive=Xne;function ON(t){let e={};return t.reduce((r,o)=>{let a=Sf.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}ko.groupPatternsByBaseDirectory=ON;function MN(t,e,r){return Object.keys(t).map(o=>UN(o,t[o],e,r))}ko.convertPatternGroupsToTasks=MN;function UN(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Sf.pattern.convertToNegativePattern))}}ko.convertPatternGroupToTask=UN});var eie=_(tE=>{"use strict";Object.defineProperty(tE,"__esModule",{value:!0});tE.removeDuplicateSlashes=tE.transform=void 0;var H$e=/(?!^)\/{2,}/g;function q$e(t){return t.map(e=>$ne(e))}tE.transform=q$e;function $ne(t){return t.replace(H$e,"/")}tE.removeDuplicateSlashes=$ne});var rie=_(hS=>{"use strict";Object.defineProperty(hS,"__esModule",{value:!0});hS.read=void 0;function G$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){tie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){_N(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){tie(r,n);return}_N(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),_N(r,u)})})}hS.read=G$e;function tie(t,e){t(e)}function _N(t,e){t(null,e)}});var nie=_(gS=>{"use strict";Object.defineProperty(gS,"__esModule",{value:!0});gS.read=void 0;function j$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}gS.read=j$e});var iie=_(Zp=>{"use strict";Object.defineProperty(Zp,"__esModule",{value:!0});Zp.createFileSystemAdapter=Zp.FILE_SYSTEM_ADAPTER=void 0;var dS=ve("fs");Zp.FILE_SYSTEM_ADAPTER={lstat:dS.lstat,stat:dS.stat,lstatSync:dS.lstatSync,statSync:dS.statSync};function Y$e(t){return t===void 0?Zp.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},Zp.FILE_SYSTEM_ADAPTER),t)}Zp.createFileSystemAdapter=Y$e});var sie=_(qN=>{"use strict";Object.defineProperty(qN,"__esModule",{value:!0});var W$e=iie(),HN=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=W$e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};qN.default=HN});var wd=_($p=>{"use strict";Object.defineProperty($p,"__esModule",{value:!0});$p.statSync=$p.stat=$p.Settings=void 0;var oie=rie(),K$e=nie(),GN=sie();$p.Settings=GN.default;function z$e(t,e,r){if(typeof e=="function"){oie.read(t,jN(),e);return}oie.read(t,jN(e),r)}$p.stat=z$e;function V$e(t,e){let r=jN(e);return K$e.read(t,r)}$p.statSync=V$e;function jN(t={}){return t instanceof GN.default?t:new GN.default(t)}});var lie=_((GTt,aie)=>{aie.exports=J$e;function J$e(t,e){var r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?process.nextTick(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,I){A(h,E,I)})}):u(null),n=!1}});var YN=_(yS=>{"use strict";Object.defineProperty(yS,"__esModule",{value:!0});yS.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var mS=process.versions.node.split(".");if(mS[0]===void 0||mS[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var cie=Number.parseInt(mS[0],10),X$e=Number.parseInt(mS[1],10),uie=10,Z$e=10,$$e=cie>uie,eet=cie===uie&&X$e>=Z$e;yS.IS_SUPPORT_READDIR_WITH_FILE_TYPES=$$e||eet});var Aie=_(ES=>{"use strict";Object.defineProperty(ES,"__esModule",{value:!0});ES.createDirentFromStats=void 0;var WN=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function tet(t,e){return new WN(t,e)}ES.createDirentFromStats=tet});var KN=_(CS=>{"use strict";Object.defineProperty(CS,"__esModule",{value:!0});CS.fs=void 0;var ret=Aie();CS.fs=ret});var zN=_(wS=>{"use strict";Object.defineProperty(wS,"__esModule",{value:!0});wS.joinPathSegments=void 0;function net(t,e,r){return t.endsWith(r)?t+e:t+r+e}wS.joinPathSegments=net});var mie=_(eh=>{"use strict";Object.defineProperty(eh,"__esModule",{value:!0});eh.readdir=eh.readdirWithFileTypes=eh.read=void 0;var iet=wd(),fie=lie(),set=YN(),pie=KN(),hie=zN();function oet(t,e,r){if(!e.stats&&set.IS_SUPPORT_READDIR_WITH_FILE_TYPES){gie(t,e,r);return}die(t,e,r)}eh.read=oet;function gie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){IS(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:hie.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){VN(r,n);return}let u=n.map(A=>aet(A,e));fie(u,(A,p)=>{if(A!==null){IS(r,A);return}VN(r,p)})})}eh.readdirWithFileTypes=gie;function aet(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=pie.fs.createDirentFromStats(t.name,a),r(null,t)})}}function die(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){IS(r,o);return}let n=a.map(u=>{let A=hie.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{iet.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let I={name:u,path:A,dirent:pie.fs.createDirentFromStats(u,E)};e.stats&&(I.stats=E),p(null,I)})}});fie(n,(u,A)=>{if(u!==null){IS(r,u);return}VN(r,A)})})}eh.readdir=die;function IS(t,e){t(e)}function VN(t,e){t(null,e)}});var Iie=_(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.readdir=th.readdirWithFileTypes=th.read=void 0;var cet=wd(),uet=YN(),yie=KN(),Eie=zN();function Aet(t,e){return!e.stats&&uet.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Cie(t,e):wie(t,e)}th.read=Aet;function Cie(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:Eie.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=yie.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}th.readdirWithFileTypes=Cie;function wie(t,e){return e.fs.readdirSync(t).map(o=>{let a=Eie.joinPathSegments(t,o,e.pathSegmentSeparator),n=cet.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:yie.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}th.readdir=wie});var Bie=_(rh=>{"use strict";Object.defineProperty(rh,"__esModule",{value:!0});rh.createFileSystemAdapter=rh.FILE_SYSTEM_ADAPTER=void 0;var rE=ve("fs");rh.FILE_SYSTEM_ADAPTER={lstat:rE.lstat,stat:rE.stat,lstatSync:rE.lstatSync,statSync:rE.statSync,readdir:rE.readdir,readdirSync:rE.readdirSync};function fet(t){return t===void 0?rh.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},rh.FILE_SYSTEM_ADAPTER),t)}rh.createFileSystemAdapter=fet});var vie=_(XN=>{"use strict";Object.defineProperty(XN,"__esModule",{value:!0});var pet=ve("path"),het=wd(),get=Bie(),JN=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=get.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,pet.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new het.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};XN.default=JN});var BS=_(nh=>{"use strict";Object.defineProperty(nh,"__esModule",{value:!0});nh.Settings=nh.scandirSync=nh.scandir=void 0;var Die=mie(),det=Iie(),ZN=vie();nh.Settings=ZN.default;function met(t,e,r){if(typeof e=="function"){Die.read(t,$N(),e);return}Die.read(t,$N(e),r)}nh.scandir=met;function yet(t,e){let r=$N(e);return det.read(t,r)}nh.scandirSync=yet;function $N(t={}){return t instanceof ZN.default?t:new ZN.default(t)}});var Sie=_(($Tt,Pie)=>{"use strict";function Eet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}Pie.exports=Eet});var xie=_((eLt,eO)=>{"use strict";var Cet=Sie();function bie(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var o=Cet(wet),a=null,n=null,u=0,A=null,p={push:R,drain:Yl,saturated:Yl,pause:E,paused:!1,concurrency:r,running:h,resume:x,idle:C,length:I,getQueue:v,unshift:N,empty:Yl,kill:V,killAndDrain:te,error:ae};return p;function h(){return u}function E(){p.paused=!0}function I(){for(var fe=a,ue=0;fe;)fe=fe.next,ue++;return ue}function v(){for(var fe=a,ue=[];fe;)ue.push(fe.value),fe=fe.next;return ue}function x(){if(!!p.paused){p.paused=!1;for(var fe=0;fe{"use strict";Object.defineProperty($u,"__esModule",{value:!0});$u.joinPathSegments=$u.replacePathSegmentSeparator=$u.isAppliedFilter=$u.isFatalError=void 0;function Bet(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}$u.isFatalError=Bet;function vet(t,e){return t===null||t(e)}$u.isAppliedFilter=vet;function Det(t,e){return t.split(/[/\\]/).join(e)}$u.replacePathSegmentSeparator=Det;function Pet(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}$u.joinPathSegments=Pet});var nO=_(rO=>{"use strict";Object.defineProperty(rO,"__esModule",{value:!0});var bet=vS(),tO=class{constructor(e,r){this._root=e,this._settings=r,this._root=bet.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};rO.default=tO});var oO=_(sO=>{"use strict";Object.defineProperty(sO,"__esModule",{value:!0});var xet=ve("events"),ket=BS(),Qet=xie(),DS=vS(),Fet=nO(),iO=class extends Fet.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=ket.scandir,this._emitter=new xet.EventEmitter,this._queue=Qet(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}get isDestroyed(){return this._isDestroyed}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,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!DS.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=DS.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),DS.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&DS.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};sO.default=iO});var kie=_(lO=>{"use strict";Object.defineProperty(lO,"__esModule",{value:!0});var Ret=oO(),aO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Ret.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{Tet(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{Let(e,this._storage)}),this._reader.read()}};lO.default=aO;function Tet(t,e){t(e)}function Let(t,e){t(null,e)}});var Qie=_(uO=>{"use strict";Object.defineProperty(uO,"__esModule",{value:!0});var Net=ve("stream"),Oet=oO(),cO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Oet.default(this._root,this._settings),this._stream=new Net.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}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}};uO.default=cO});var Fie=_(fO=>{"use strict";Object.defineProperty(fO,"__esModule",{value:!0});var Met=BS(),PS=vS(),Uet=nO(),AO=class extends Uet.default{constructor(){super(...arguments),this._scandir=Met.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(!!PS.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=PS.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),PS.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&PS.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};fO.default=AO});var Rie=_(hO=>{"use strict";Object.defineProperty(hO,"__esModule",{value:!0});var _et=Fie(),pO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new _et.default(this._root,this._settings)}read(){return this._reader.read()}};hO.default=pO});var Tie=_(dO=>{"use strict";Object.defineProperty(dO,"__esModule",{value:!0});var Het=ve("path"),qet=BS(),gO=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),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,Het.sep),this.fsScandirSettings=new qet.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};dO.default=gO});var bS=_(eA=>{"use strict";Object.defineProperty(eA,"__esModule",{value:!0});eA.Settings=eA.walkStream=eA.walkSync=eA.walk=void 0;var Lie=kie(),Get=Qie(),jet=Rie(),mO=Tie();eA.Settings=mO.default;function Yet(t,e,r){if(typeof e=="function"){new Lie.default(t,SS()).read(e);return}new Lie.default(t,SS(e)).read(r)}eA.walk=Yet;function Wet(t,e){let r=SS(e);return new jet.default(t,r).read()}eA.walkSync=Wet;function Ket(t,e){let r=SS(e);return new Get.default(t,r).read()}eA.walkStream=Ket;function SS(t={}){return t instanceof mO.default?t:new mO.default(t)}});var xS=_(EO=>{"use strict";Object.defineProperty(EO,"__esModule",{value:!0});var zet=ve("path"),Vet=wd(),Nie=Pf(),yO=class{constructor(e){this._settings=e,this._fsStatSettings=new Vet.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return zet.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Nie.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Nie.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};EO.default=yO});var IO=_(wO=>{"use strict";Object.defineProperty(wO,"__esModule",{value:!0});var Jet=ve("stream"),Xet=wd(),Zet=bS(),$et=xS(),CO=class extends $et.default{constructor(){super(...arguments),this._walkStream=Zet.walkStream,this._stat=Xet.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new Jet.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};wO.default=CO});var Oie=_(vO=>{"use strict";Object.defineProperty(vO,"__esModule",{value:!0});var ett=bS(),ttt=xS(),rtt=IO(),BO=class extends ttt.default{constructor(){super(...arguments),this._walkAsync=ett.walk,this._readerStream=new rtt.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once("error",u),a.on("data",A=>o.push(A)),a.once("end",()=>n(o))})}};vO.default=BO});var Mie=_(PO=>{"use strict";Object.defineProperty(PO,"__esModule",{value:!0});var nE=Pf(),DO=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){let e=nE.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let o=this._getPatternSegments(r),a=this._splitSegmentsIntoSections(o);this._storage.push({complete:a.length<=1,pattern:r,segments:o,sections:a})}}_getPatternSegments(e){return nE.pattern.getPatternParts(e,this._micromatchOptions).map(o=>nE.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:nE.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return nE.array.splitWhen(e,r=>r.dynamic&&nE.pattern.hasGlobStar(r.pattern))}};PO.default=DO});var Uie=_(bO=>{"use strict";Object.defineProperty(bO,"__esModule",{value:!0});var ntt=Mie(),SO=class extends ntt.default{match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};bO.default=SO});var _ie=_(kO=>{"use strict";Object.defineProperty(kO,"__esModule",{value:!0});var kS=Pf(),itt=Uie(),xO=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new itt.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(kS.pattern.isAffectDepthOfReadingPattern);return kS.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=kS.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e.split("/").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!kS.pattern.matchAny(e,r)}};kO.default=xO});var Hie=_(FO=>{"use strict";Object.defineProperty(FO,"__esModule",{value:!0});var Id=Pf(),QO=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=Id.pattern.convertPatternsToRe(e,this._micromatchOptions),a=Id.pattern.convertPatternsToRe(r,this._micromatchOptions);return n=>this._filter(n,o,a)}_filter(e,r,o){if(this._settings.unique&&this._isDuplicateEntry(e)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e.path,o))return!1;let a=this._settings.baseNameMatch?e.name:e.path,n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(e.path,o,n);return this._settings.unique&&u&&this._createIndexRecord(e),u}_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,r){if(!this._settings.absolute)return!1;let o=Id.path.makeAbsolute(this._settings.cwd,e);return Id.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=Id.path.removeLeadingDotSegment(e),n=Id.pattern.matchAny(a,r);return!n&&o?Id.pattern.matchAny(a+"/",r):n}};FO.default=QO});var qie=_(TO=>{"use strict";Object.defineProperty(TO,"__esModule",{value:!0});var stt=Pf(),RO=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return stt.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};TO.default=RO});var jie=_(NO=>{"use strict";Object.defineProperty(NO,"__esModule",{value:!0});var Gie=Pf(),LO=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Gie.path.makeAbsolute(this._settings.cwd,r),r=Gie.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};NO.default=LO});var QS=_(MO=>{"use strict";Object.defineProperty(MO,"__esModule",{value:!0});var ott=ve("path"),att=_ie(),ltt=Hie(),ctt=qie(),utt=jie(),OO=class{constructor(e){this._settings=e,this.errorFilter=new ctt.default(this._settings),this.entryFilter=new ltt.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new att.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new utt.default(this._settings)}_getRootDirectory(e){return ott.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,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}}};MO.default=OO});var Yie=_(_O=>{"use strict";Object.defineProperty(_O,"__esModule",{value:!0});var Att=Oie(),ftt=QS(),UO=class extends ftt.default{constructor(){super(...arguments),this._reader=new Att.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};_O.default=UO});var Wie=_(qO=>{"use strict";Object.defineProperty(qO,"__esModule",{value:!0});var ptt=ve("stream"),htt=IO(),gtt=QS(),HO=class extends gtt.default{constructor(){super(...arguments),this._reader=new htt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new ptt.Readable({objectMode:!0,read:()=>{}});return a.once("error",u=>n.emit("error",u)).on("data",u=>n.emit("data",o.transform(u))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};qO.default=HO});var Kie=_(jO=>{"use strict";Object.defineProperty(jO,"__esModule",{value:!0});var dtt=wd(),mtt=bS(),ytt=xS(),GO=class extends ytt.default{constructor(){super(...arguments),this._walkSync=mtt.walkSync,this._statSync=dtt.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};jO.default=GO});var zie=_(WO=>{"use strict";Object.defineProperty(WO,"__esModule",{value:!0});var Ett=Kie(),Ctt=QS(),YO=class extends Ctt.default{constructor(){super(...arguments),this._reader=new Ett.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};WO.default=YO});var Vie=_(sE=>{"use strict";Object.defineProperty(sE,"__esModule",{value:!0});sE.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var iE=ve("fs"),wtt=ve("os"),Itt=Math.max(wtt.cpus().length,1);sE.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:iE.lstat,lstatSync:iE.lstatSync,stat:iE.stat,statSync:iE.statSync,readdir:iE.readdir,readdirSync:iE.readdirSync};var KO=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,Itt),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,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},sE.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};sE.default=KO});var RS=_((DLt,Zie)=>{"use strict";var Jie=Zne(),Xie=eie(),Btt=Yie(),vtt=Wie(),Dtt=zie(),zO=Vie(),Bd=Pf();async function VO(t,e){oE(t);let r=JO(t,Btt.default,e),o=await Promise.all(r);return Bd.array.flatten(o)}(function(t){function e(u,A){oE(u);let p=JO(u,Dtt.default,A);return Bd.array.flatten(p)}t.sync=e;function r(u,A){oE(u);let p=JO(u,vtt.default,A);return Bd.stream.merge(p)}t.stream=r;function o(u,A){oE(u);let p=Xie.transform([].concat(u)),h=new zO.default(A);return Jie.generate(p,h)}t.generateTasks=o;function a(u,A){oE(u);let p=new zO.default(A);return Bd.pattern.isDynamicPattern(u,p)}t.isDynamicPattern=a;function n(u){return oE(u),Bd.path.escape(u)}t.escapePath=n})(VO||(VO={}));function JO(t,e,r){let o=Xie.transform([].concat(t)),a=new zO.default(r),n=Jie.generate(o,a),u=new e(a);return n.map(u.read,u)}function oE(t){if(![].concat(t).every(o=>Bd.string.isString(o)&&!Bd.string.isEmpty(o)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}Zie.exports=VO});var wn={};zt(wn,{checksumFile:()=>LS,checksumPattern:()=>NS,makeHash:()=>Js});function Js(...t){let e=(0,TS.createHash)("sha512"),r="";for(let o of t)typeof o=="string"?r+=o:o&&(r&&(e.update(r),r=""),e.update(o));return r&&e.update(r),e.digest("hex")}async function LS(t,{baseFs:e,algorithm:r}={baseFs:oe,algorithm:"sha512"}){let o=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,TS.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await e.closePromise(o)}}async function NS(t,{cwd:e}){let o=(await(0,XO.default)(t,{cwd:le.fromPortablePath(e),onlyDirectories:!0})).map(A=>`${A}/**/*`),a=await(0,XO.default)([t,...o],{cwd:le.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=le.toPortablePath(A),E=await oe.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await oe.readlinkPromise(h))):E.isFile()&&p.push(await oe.readFilePromise(h)),p.join("\0")})),u=(0,TS.createHash)("sha512");for(let A of n)u.update(A);return u.digest("hex")}var TS,XO,ih=Et(()=>{Pt();TS=ve("crypto"),XO=$e(RS())});var W={};zt(W,{areDescriptorsEqual:()=>nse,areIdentsEqual:()=>n1,areLocatorsEqual:()=>i1,areVirtualPackagesEquivalent:()=>Ttt,bindDescriptor:()=>Ftt,bindLocator:()=>Rtt,convertDescriptorToLocator:()=>OS,convertLocatorToDescriptor:()=>$O,convertPackageToLocator:()=>xtt,convertToIdent:()=>btt,convertToManifestRange:()=>jtt,copyPackage:()=>e1,devirtualizeDescriptor:()=>t1,devirtualizeLocator:()=>r1,ensureDevirtualizedDescriptor:()=>ktt,ensureDevirtualizedLocator:()=>Qtt,getIdentVendorPath:()=>nM,isPackageCompatible:()=>qS,isVirtualDescriptor:()=>bf,isVirtualLocator:()=>qc,makeDescriptor:()=>In,makeIdent:()=>tA,makeLocator:()=>Qs,makeRange:()=>_S,parseDescriptor:()=>sh,parseFileStyleRange:()=>qtt,parseIdent:()=>Vs,parseLocator:()=>xf,parseRange:()=>vd,prettyDependent:()=>QN,prettyDescriptor:()=>Gn,prettyIdent:()=>cs,prettyLocator:()=>qr,prettyLocatorNoColors:()=>kN,prettyRange:()=>cE,prettyReference:()=>o1,prettyResolution:()=>ZI,prettyWorkspace:()=>a1,renamePackage:()=>eM,slugifyIdent:()=>ZO,slugifyLocator:()=>lE,sortDescriptors:()=>uE,stringifyDescriptor:()=>Sa,stringifyIdent:()=>fn,stringifyLocator:()=>ba,tryParseDescriptor:()=>s1,tryParseIdent:()=>ise,tryParseLocator:()=>US,tryParseRange:()=>Htt,virtualizeDescriptor:()=>tM,virtualizePackage:()=>rM});function tA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:Js(t,e),scope:t,name:e}}function In(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:Js(t.identHash,e),range:e}}function Qs(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:Js(t.identHash,e),reference:e}}function btt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function OS(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function $O(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function xtt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function eM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function e1(t){return eM(t,t)}function tM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return In(t,`virtual:${e}#${t.range}`)}function rM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return eM(t,Qs(t,`virtual:${e}#${t.reference}`))}function bf(t){return t.range.startsWith($I)}function qc(t){return t.reference.startsWith($I)}function t1(t){if(!bf(t))throw new Error("Not a virtual descriptor");return In(t,t.range.replace(MS,""))}function r1(t){if(!qc(t))throw new Error("Not a virtual descriptor");return Qs(t,t.reference.replace(MS,""))}function ktt(t){return bf(t)?In(t,t.range.replace(MS,"")):t}function Qtt(t){return qc(t)?Qs(t,t.reference.replace(MS,"")):t}function Ftt(t,e){return t.range.includes("::")?t:In(t,`${t.range}::${aE.default.stringify(e)}`)}function Rtt(t,e){return t.reference.includes("::")?t:Qs(t,`${t.reference}::${aE.default.stringify(e)}`)}function n1(t,e){return t.identHash===e.identHash}function nse(t,e){return t.descriptorHash===e.descriptorHash}function i1(t,e){return t.locatorHash===e.locatorHash}function Ttt(t,e){if(!qc(t))throw new Error("Invalid package type");if(!qc(e))throw new Error("Invalid package type");if(!n1(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!nse(r,o))return!1}return!0}function Vs(t){let e=ise(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function ise(t){let e=t.match(Ltt);if(!e)return null;let[,r,o]=e;return tA(typeof r<"u"?r:null,o)}function sh(t,e=!1){let r=s1(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function s1(t,e=!1){let r=e?t.match(Ntt):t.match(Ott);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return In(tA(u,a),A)}function xf(t,e=!1){let r=US(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function US(t,e=!1){let r=e?t.match(Mtt):t.match(Utt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return Qs(tA(u,a),A)}function vd(t,e){let r=t.match(_tt);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<"u"?r[1]:null;if(typeof e?.requireProtocol=="string"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if(e?.requireProtocol&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e?.parseSelector?aE.default.parse(n):n,A=typeof r[4]<"u"?aE.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function Htt(t,e){try{return vd(t,e)}catch{return null}}function qtt(t,{protocol:e}){let{selector:r,params:o}=vd(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:xf(o.locator,!0),path:r}}function $ie(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A"),t=t.replaceAll("#","%23"),t}function Gtt(t){return t===null?!1:Object.entries(t).length>0}function _S({protocol:t,source:e,selector:r,params:o}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${$ie(e)}#`),a+=$ie(r),Gtt(o)&&(a+=`::${aE.default.stringify(o)}`),a}function jtt(t){let{params:e,protocol:r,source:o,selector:a}=vd(t);for(let n in e)n.startsWith("__")&&delete e[n];return _S({protocol:r,source:o,params:e,selector:a})}function fn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function Sa(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function ba(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function ZO(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function lE(t){let{protocol:e,selector:r}=vd(t.reference),o=e!==null?e.replace(Ytt,""):"exotic",a=ese.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10;return t.scope?`${ZO(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${ZO(t)}-${n}-${t.locatorHash.slice(0,u)}`}function cs(t,e){return e.scope?`${Ut(t,`@${e.scope}/`,yt.SCOPE)}${Ut(t,e.name,yt.NAME)}`:`${Ut(t,e.name,yt.NAME)}`}function HS(t){if(t.startsWith($I)){let e=HS(t.substring(t.indexOf("#")+1)),r=t.substring($I.length,$I.length+Ptt);return`${e} [${r}]`}else return t.replace(Wtt,"?[...]")}function cE(t,e){return`${Ut(t,HS(e),yt.RANGE)}`}function Gn(t,e){return`${cs(t,e)}${Ut(t,"@",yt.RANGE)}${cE(t,e.range)}`}function o1(t,e){return`${Ut(t,HS(e),yt.REFERENCE)}`}function qr(t,e){return`${cs(t,e)}${Ut(t,"@",yt.REFERENCE)}${o1(t,e.reference)}`}function kN(t){return`${fn(t)}@${HS(t.reference)}`}function uE(t){return ks(t,[e=>fn(e),e=>e.range])}function a1(t,e){return cs(t,e.anchoredLocator)}function ZI(t,e,r){let o=bf(e)?t1(e):e;return r===null?`${Gn(t,o)} \u2192 ${xN(t).Cross}`:o.identHash===r.identHash?`${Gn(t,o)} \u2192 ${o1(t,r.reference)}`:`${Gn(t,o)} \u2192 ${qr(t,r)}`}function QN(t,e,r){return r===null?`${qr(t,e)}`:`${qr(t,e)} (via ${cE(t,r.range)})`}function nM(t){return`node_modules/${fn(t)}`}function qS(t,e){return t.conditions?Stt(t.conditions,r=>{let[,o,a]=r.match(rse),n=e[o];return n?n.includes(a):!0}):!0}var aE,ese,tse,$I,Ptt,rse,Stt,MS,Ltt,Ntt,Ott,Mtt,Utt,_tt,Ytt,Wtt,bo=Et(()=>{aE=$e(ve("querystring")),ese=$e(Jn()),tse=$e(eX());jl();ih();Gl();bo();$I="virtual:",Ptt=5,rse=/(os|cpu|libc)=([a-z0-9_-]+)/,Stt=(0,tse.makeParser)(rse);MS=/^[^#]*#/;Ltt=/^(?:@([^/]+?)\/)?([^@/]+)$/;Ntt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,Ott=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;Mtt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,Utt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;_tt=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;Ytt=/:$/;Wtt=/\?.*/});var sse,ose=Et(()=>{bo();sse={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==fn(r)||e.configuration.normalizeLocator(Qs(Vs(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==fn(t)||e.configuration.normalizeDependency(In(xf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(In(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=a1(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var l1,Xn,Dd=Et(()=>{l1=class{supportsDescriptor(e,r){return!!(e.range.startsWith(l1.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(l1.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(l1.protocol.length));return{...e,version:o.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}},Xn=l1;Xn.protocol="workspace:"});var kr={};zt(kr,{SemVer:()=>Ase.SemVer,clean:()=>ztt,getComparator:()=>cse,mergeComparators:()=>iM,satisfiesWithPrereleases:()=>kf,simplifyRanges:()=>sM,stringifyComparator:()=>use,validRange:()=>xa});function kf(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=ase.get(o);if(typeof a>"u")try{a=new oh.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{ase.set(o,a||null)}else if(a===null)return!1;let n;try{n=new oh.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function xa(t){if(t.indexOf(":")!==-1)return null;let e=lse.get(t);if(typeof e<"u")return e;try{e=new oh.default.Range(t)}catch{e=null}return lse.set(t,e),e}function ztt(t){let e=Ktt.exec(t);return e?e[1]:null}function cse(t){if(t.semver===oh.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case"":return{gt:[">=",t.semver],lt:["<=",t.semver]};case">":case">=":return{gt:[t.operator,t.semver],lt:null};case"<":case"<=":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function iM(t){if(t.length===0)return null;let e=null,r=null;for(let o of t){if(o.gt){let a=e!==null?oh.default.compare(o.gt[1],e[1]):null;(a===null||a>0||a===0&&o.gt[0]===">")&&(e=o.gt)}if(o.lt){let a=r!==null?oh.default.compare(o.lt[1],r[1]):null;(a===null||a<0||a===0&&o.lt[0]==="<")&&(r=o.lt)}}if(e&&r){let o=oh.default.compare(e[1],r[1]);if(o===0&&(e[0]===">"||r[0]==="<")||o>0)return null}return{gt:e,lt:r}}function use(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===">="&&t.lt[0]==="<"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(" "):"*"}function sM(t){let e=t.map(o=>xa(o).set.map(a=>a.map(n=>cse(n)))),r=e.shift().map(o=>iM(o)).filter(o=>o!==null);for(let o of e){let a=[];for(let n of r)for(let u of o){let A=iM([n,...u]);A!==null&&a.push(A)}r=a}return r.length===0?null:r.map(o=>use(o)).join(" || ")}var oh,Ase,ase,lse,Ktt,Qf=Et(()=>{oh=$e(Jn()),Ase=$e(Jn()),ase=new Map;lse=new Map;Ktt=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function fse(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function pse(t){return t.charCodeAt(0)===65279?t.slice(1):t}function $o(t){return t.replace(/\\/g,"/")}function GS(t,{yamlCompatibilityMode:e}){return e?wN(t):typeof t>"u"||typeof t=="boolean"?t:null}function hse(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o=r%2===0?"":"!",a=e.slice(r);return`${o}${t}=${a}`}function oM(t,e){return e.length===1?hse(t,e[0]):`(${e.map(r=>hse(t,r)).join(" | ")})`}var gse,AE,Ot,fE=Et(()=>{Pt();Nl();gse=$e(Jn());Dd();Gl();Qf();bo();AE=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=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:r=new Tn}={}){let o=z.join(e,"package.json");try{return await AE.fromFile(o,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await AE.tryFind(e,{baseFs:r});if(o===null)throw new Error("Manifest not found");return o}static async fromFile(e,{baseFs:r=new Tn}={}){let o=new AE;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new AE;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(pse(e)||"{}")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=fse(e)}async loadFile(e,{baseFs:r=new Tn}){let o=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(pse(o)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=fse(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name=="string")try{this.name=Vs(e.name)}catch{o.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!="string"?o.push(new Error("Parsing failed for the 'os' field")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!="string"?o.push(new Error("Parsing failed for the 'cpu' field")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!="string"?o.push(new Error("Parsing failed for the 'libc' field")):n.push(u)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=$o(e.main):this.main=null,typeof e.module=="string"?this.module=$o(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=$o(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set($o(n),typeof u=="string"?$o(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")e.bin.trim()===""?o.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,$o(e.bin)):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!="string"||u.trim()===""){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=Vs(n);this.bin.set(A.name,$o(u))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!="string"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Vs(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Vs(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=Vs(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!="string"||!u.startsWith(Xn.protocol)&&!xa(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u="*");let p=In(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=sh(n),p=this.ensureDependencyMeta(A),h=GS(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=GS(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let I=GS(u.unplugged,{yamlCompatibilityMode:r});if(I===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:I})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=sh(n),p=this.ensurePeerDependencyMeta(A),h=GS(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!="string"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:MD(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=$o(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=$o(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=$o(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set($o(n),typeof u=="string"?$o(u):u)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,$o(e.publishConfig.bin)]]):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,$o(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){o.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add($o(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error("Invalid selfReferences definition, must be a boolean value")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Vs(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p);let h=In(A,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}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))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(oM("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(oM("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(oM("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!gse.default.valid(e.range))throw new Error(`Invalid meta field range for '${Sa(e)}'`);let r=fn(e),o=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Sa(e)}'`);let r=fn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=fn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&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(n=>({[n]:this.bin.get(n)}))):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:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(fn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...uE(o).map(n=>({[fn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...uE(a).map(n=>({[fn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...uE(this.devDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...uE(this.peerDependencies.values()).map(n=>({[fn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of ks(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of ks(u.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=A!==null?Sa(In(Vs(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...ks(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[UD(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}},Ot=AE;Ot.fileName="package.json",Ot.allDependencies=["dependencies","devDependencies","peerDependencies"],Ot.hardDependencies=["dependencies","devDependencies"]});var mse=_((_Lt,dse)=>{var Vtt=Hl(),Jtt=function(){return Vtt.Date.now()};dse.exports=Jtt});var Ese=_((HLt,yse)=>{var Xtt=/\s/;function Ztt(t){for(var e=t.length;e--&&Xtt.test(t.charAt(e)););return e}yse.exports=Ztt});var wse=_((qLt,Cse)=>{var $tt=Ese(),ert=/^\s+/;function trt(t){return t&&t.slice(0,$tt(t)+1).replace(ert,"")}Cse.exports=trt});var pE=_((GLt,Ise)=>{var rrt=gd(),nrt=Ju(),irt="[object Symbol]";function srt(t){return typeof t=="symbol"||nrt(t)&&rrt(t)==irt}Ise.exports=srt});var Pse=_((jLt,Dse)=>{var ort=wse(),Bse=sl(),art=pE(),vse=0/0,lrt=/^[-+]0x[0-9a-f]+$/i,crt=/^0b[01]+$/i,urt=/^0o[0-7]+$/i,Art=parseInt;function frt(t){if(typeof t=="number")return t;if(art(t))return vse;if(Bse(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Bse(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=ort(t);var r=crt.test(t);return r||urt.test(t)?Art(t.slice(2),r?2:8):lrt.test(t)?vse:+t}Dse.exports=frt});var xse=_((YLt,bse)=>{var prt=sl(),aM=mse(),Sse=Pse(),hrt="Expected a function",grt=Math.max,drt=Math.min;function mrt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,I=!1,v=!0;if(typeof t!="function")throw new TypeError(hrt);e=Sse(e)||0,prt(r)&&(E=!!r.leading,I="maxWait"in r,n=I?grt(Sse(r.maxWait)||0,e):n,v="trailing"in r?!!r.trailing:v);function x(ue){var me=o,he=a;return o=a=void 0,h=ue,u=t.apply(he,me),u}function C(ue){return h=ue,A=setTimeout(U,e),E?x(ue):u}function R(ue){var me=ue-p,he=ue-h,Be=e-me;return I?drt(Be,n-he):Be}function N(ue){var me=ue-p,he=ue-h;return p===void 0||me>=e||me<0||I&&he>=n}function U(){var ue=aM();if(N(ue))return V(ue);A=setTimeout(U,R(ue))}function V(ue){return A=void 0,v&&o?x(ue):(o=a=void 0,u)}function te(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function ae(){return A===void 0?u:V(aM())}function fe(){var ue=aM(),me=N(ue);if(o=arguments,a=this,p=ue,me){if(A===void 0)return C(p);if(I)return clearTimeout(A),A=setTimeout(U,e),x(p)}return A===void 0&&(A=setTimeout(U,e)),u}return fe.cancel=te,fe.flush=ae,fe}bse.exports=mrt});var lM=_((WLt,kse)=>{var yrt=xse(),Ert=sl(),Crt="Expected a function";function wrt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new TypeError(Crt);return Ert(r)&&(o="leading"in r?!!r.leading:o,a="trailing"in r?!!r.trailing:a),yrt(t,e,{leading:o,maxWait:e,trailing:a})}kse.exports=wrt});function Brt(t){return typeof t.reportCode<"u"}var Qse,Fse,Rse,Irt,Jt,Xs,Wl=Et(()=>{Qse=$e(lM()),Fse=ve("stream"),Rse=ve("string_decoder"),Irt=15,Jt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Xs=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r{r=u}),a=(0,Qse.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/Irt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),o?.reportExtra?.(this))}reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),o?.reportExtra?.(this))}reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),o?.reportExtra?.(this))}reportExceptionOnce(e){Brt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new Fse.PassThrough,o=new Rse.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var hE,cM=Et(()=>{Wl();bo();hE=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new Jt(11,`${qr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var Pd,uM=Et(()=>{bo();Pd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${Gn(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${qr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var gE,AM=Et(()=>{Pt();bo();gE=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Qs(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Qs(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return lE(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get("virtualFolder"),u=this.getLocatorFilename(e),A=mi.makeVirtualPath(n,u,a),p=new _u(A,{baseFs:r.packageFs,pathUtils:z});return{...r,packageFs:p}}}});var dE,c1,Tse=Et(()=>{dE=class{static isVirtualDescriptor(e){return!!e.range.startsWith(dE.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(dE.protocol)}supportsDescriptor(e,r){return dE.isVirtualDescriptor(e)}supportsLocator(e,r){return dE.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},c1=dE;c1.protocol="virtual:"});var mE,fM=Et(()=>{Pt();Dd();mE=class{supports(e){return!!e.reference.startsWith(Xn.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new gn(o),prefixPath:Bt.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Xn.protocol.length))}}});function u1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Lse(t){return typeof t>"u"?3:u1(t)?0:Array.isArray(t)?1:2}function gM(t,e){return Object.hasOwn(t,e)}function Drt(t){return u1(t)&&gM(t,"onConflict")&&typeof t.onConflict=="string"}function Prt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!Drt(t))return{onConflict:"default",value:t};if(gM(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function Nse(t,e){let r=u1(t)&&gM(t,e)?t[e]:void 0;return Prt(r)}function yE(t,e){return[t,e,Ose]}function dM(t){return Array.isArray(t)?t[2]===Ose:!1}function pM(t,e){if(u1(t)){let r={};for(let o of Object.keys(t))r[o]=pM(t[o],e);return yE(e,r)}return Array.isArray(t)?yE(e,t.map(r=>pM(r,e))):yE(e,t)}function hM(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[I,v]=t[E],{onConflict:x,value:C}=Nse(v,r),R=Lse(C);if(R!==3){if(n??=R,R!==n||x==="hardReset"){p=A;break}if(R===2)return yE(I,C);if(u.unshift([I,C]),x==="reset"){p=E;break}x==="extend"&&E===o&&(o=0),A=E}}if(typeof n>"u")return null;let h=u.map(([E])=>E).join(", ");switch(n){case 1:return yE(h,new Array().concat(...u.map(([E,I])=>I.map(v=>pM(v,E)))));case 0:{let E=Object.assign({},...u.map(([,R])=>R)),I=Object.keys(E),v={},x=t.map(([R,N])=>[R,Nse(N,r).value]),C=vrt(x,([R,N])=>{let U=Lse(N);return U!==0&&U!==3});if(C!==-1){let R=x.slice(C+1);for(let N of I)v[N]=hM(R,e,N,0,R.length)}else for(let R of I)v[R]=hM(x,e,R,p,x.length);return yE(h,v)}default:throw new Error("Assertion failed: Non-extendable value type")}}function Mse(t){return hM(t.map(([e,r])=>[e,{["."]:r}]),[],".",0,t.length)}function A1(t){return dM(t)?t[1]:t}function jS(t){let e=dM(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>jS(r));if(u1(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=jS(a);return r}return e}function mM(t){return dM(t)?t[0]:null}var vrt,Ose,Use=Et(()=>{vrt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};Ose=Symbol()});var YS={};zt(YS,{getDefaultGlobalFolder:()=>EM,getHomeFolder:()=>EE,isFolderInside:()=>CM});function EM(){if(process.platform==="win32"){let t=le.toPortablePath(process.env.LOCALAPPDATA||le.join((0,yM.homedir)(),"AppData","Local"));return z.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=le.toPortablePath(process.env.XDG_DATA_HOME);return z.resolve(t,"yarn/berry")}return z.resolve(EE(),".yarn/berry")}function EE(){return le.toPortablePath((0,yM.homedir)()||"/usr/local/share")}function CM(t,e){let r=z.relative(e,t);return r&&!r.startsWith("..")&&!z.isAbsolute(r)}var yM,WS=Et(()=>{Pt();yM=ve("os")});var Gse=_(CE=>{"use strict";var sNt=ve("net"),brt=ve("tls"),wM=ve("http"),_se=ve("https"),xrt=ve("events"),oNt=ve("assert"),krt=ve("util");CE.httpOverHttp=Qrt;CE.httpsOverHttp=Frt;CE.httpOverHttps=Rrt;CE.httpsOverHttps=Trt;function Qrt(t){var e=new Ff(t);return e.request=wM.request,e}function Frt(t){var e=new Ff(t);return e.request=wM.request,e.createSocket=Hse,e.defaultPort=443,e}function Rrt(t){var e=new Ff(t);return e.request=_se.request,e}function Trt(t){var e=new Ff(t);return e.request=_se.request,e.createSocket=Hse,e.defaultPort=443,e}function Ff(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||wM.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(o,a,n,u){for(var A=qse(a,n,u),p=0,h=e.requests.length;p=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on("free",p),A.on("close",h),A.on("agentRemove",h),e.onSocket(A);function p(){n.emit("free",A,u)}function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListener("close",h),A.removeListener("agentRemove",h)}})};Ff.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=IM({},o.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),ah("making CONNECT request");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once("response",A),u.once("upgrade",p),u.once("connect",h),u.once("error",E),u.end();function A(I){I.upgrade=!0}function p(I,v,x){process.nextTick(function(){h(I,v,x)})}function h(I,v,x){if(u.removeAllListeners(),v.removeAllListeners(),I.statusCode!==200){ah("tunneling socket could not be established, statusCode=%d",I.statusCode),v.destroy();var C=new Error("tunneling socket could not be established, statusCode="+I.statusCode);C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}if(x.length>0){ah("got illegal response body from proxy"),v.destroy();var C=new Error("got illegal response body from proxy");C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}return ah("tunneling connection has established"),o.sockets[o.sockets.indexOf(a)]=v,r(v)}function E(I){u.removeAllListeners(),ah(`tunneling socket could not be established, cause=%s +`,I.message,I.stack);var v=new Error("tunneling socket could not be established, cause="+I.message);v.code="ECONNRESET",e.request.emit("error",v),o.removeSocket(a)}};Ff.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function Hse(t,e){var r=this;Ff.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader("host"),n=IM({},r.options,{socket:o,servername:a?a.replace(/:.*$/,""):t.host}),u=brt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function qse(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function IM(t){for(var e=1,r=arguments.length;e{jse.exports=Gse()});var Tf=_((Rf,KS)=>{"use strict";Object.defineProperty(Rf,"__esModule",{value:!0});var Wse=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Lrt(t){return Wse.includes(t)}var Nrt=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Blob","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Wse];function Ort(t){return Nrt.includes(t)}var Mrt=["null","undefined","string","number","bigint","boolean","symbol"];function Urt(t){return Mrt.includes(t)}function wE(t){return e=>typeof e===t}var{toString:Kse}=Object.prototype,f1=t=>{let e=Kse.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&Se.domElement(t))return"HTMLElement";if(Ort(e))return e},Zn=t=>e=>f1(e)===t;function Se(t){if(t===null)return"null";switch(typeof t){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";default:}if(Se.observable(t))return"Observable";if(Se.array(t))return"Array";if(Se.buffer(t))return"Buffer";let e=f1(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Se.undefined=wE("undefined");Se.string=wE("string");var _rt=wE("number");Se.number=t=>_rt(t)&&!Se.nan(t);Se.bigint=wE("bigint");Se.function_=wE("function");Se.null_=t=>t===null;Se.class_=t=>Se.function_(t)&&t.toString().startsWith("class ");Se.boolean=t=>t===!0||t===!1;Se.symbol=wE("symbol");Se.numericString=t=>Se.string(t)&&!Se.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Se.array=(t,e)=>Array.isArray(t)?Se.function_(e)?t.every(e):!0:!1;Se.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};Se.blob=t=>Zn("Blob")(t);Se.nullOrUndefined=t=>Se.null_(t)||Se.undefined(t);Se.object=t=>!Se.null_(t)&&(typeof t=="object"||Se.function_(t));Se.iterable=t=>{var e;return Se.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Se.asyncIterable=t=>{var e;return Se.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Se.generator=t=>{var e,r;return Se.iterable(t)&&Se.function_((e=t)===null||e===void 0?void 0:e.next)&&Se.function_((r=t)===null||r===void 0?void 0:r.throw)};Se.asyncGenerator=t=>Se.asyncIterable(t)&&Se.function_(t.next)&&Se.function_(t.throw);Se.nativePromise=t=>Zn("Promise")(t);var Hrt=t=>{var e,r;return Se.function_((e=t)===null||e===void 0?void 0:e.then)&&Se.function_((r=t)===null||r===void 0?void 0:r.catch)};Se.promise=t=>Se.nativePromise(t)||Hrt(t);Se.generatorFunction=Zn("GeneratorFunction");Se.asyncGeneratorFunction=t=>f1(t)==="AsyncGeneratorFunction";Se.asyncFunction=t=>f1(t)==="AsyncFunction";Se.boundFunction=t=>Se.function_(t)&&!t.hasOwnProperty("prototype");Se.regExp=Zn("RegExp");Se.date=Zn("Date");Se.error=Zn("Error");Se.map=t=>Zn("Map")(t);Se.set=t=>Zn("Set")(t);Se.weakMap=t=>Zn("WeakMap")(t);Se.weakSet=t=>Zn("WeakSet")(t);Se.int8Array=Zn("Int8Array");Se.uint8Array=Zn("Uint8Array");Se.uint8ClampedArray=Zn("Uint8ClampedArray");Se.int16Array=Zn("Int16Array");Se.uint16Array=Zn("Uint16Array");Se.int32Array=Zn("Int32Array");Se.uint32Array=Zn("Uint32Array");Se.float32Array=Zn("Float32Array");Se.float64Array=Zn("Float64Array");Se.bigInt64Array=Zn("BigInt64Array");Se.bigUint64Array=Zn("BigUint64Array");Se.arrayBuffer=Zn("ArrayBuffer");Se.sharedArrayBuffer=Zn("SharedArrayBuffer");Se.dataView=Zn("DataView");Se.enumCase=(t,e)=>Object.values(e).includes(t);Se.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Se.urlInstance=t=>Zn("URL")(t);Se.urlString=t=>{if(!Se.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Se.truthy=t=>Boolean(t);Se.falsy=t=>!t;Se.nan=t=>Number.isNaN(t);Se.primitive=t=>Se.null_(t)||Urt(typeof t);Se.integer=t=>Number.isInteger(t);Se.safeInteger=t=>Number.isSafeInteger(t);Se.plainObject=t=>{if(Kse.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Se.typedArray=t=>Lrt(f1(t));var qrt=t=>Se.safeInteger(t)&&t>=0;Se.arrayLike=t=>!Se.nullOrUndefined(t)&&!Se.function_(t)&&qrt(t.length);Se.inRange=(t,e)=>{if(Se.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Se.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Grt=1,jrt=["innerHTML","ownerDocument","style","attributes","nodeValue"];Se.domElement=t=>Se.object(t)&&t.nodeType===Grt&&Se.string(t.nodeName)&&!Se.plainObject(t)&&jrt.every(e=>e in t);Se.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)["@@observable"])===null||a===void 0?void 0:a.call(o)):!1};Se.nodeStream=t=>Se.object(t)&&Se.function_(t.pipe)&&!Se.observable(t);Se.infinite=t=>t===1/0||t===-1/0;var zse=t=>e=>Se.integer(e)&&Math.abs(e%2)===t;Se.evenInteger=zse(0);Se.oddInteger=zse(1);Se.emptyArray=t=>Se.array(t)&&t.length===0;Se.nonEmptyArray=t=>Se.array(t)&&t.length>0;Se.emptyString=t=>Se.string(t)&&t.length===0;var Yrt=t=>Se.string(t)&&!/\S/.test(t);Se.emptyStringOrWhitespace=t=>Se.emptyString(t)||Yrt(t);Se.nonEmptyString=t=>Se.string(t)&&t.length>0;Se.nonEmptyStringAndNotWhitespace=t=>Se.string(t)&&!Se.emptyStringOrWhitespace(t);Se.emptyObject=t=>Se.object(t)&&!Se.map(t)&&!Se.set(t)&&Object.keys(t).length===0;Se.nonEmptyObject=t=>Se.object(t)&&!Se.map(t)&&!Se.set(t)&&Object.keys(t).length>0;Se.emptySet=t=>Se.set(t)&&t.size===0;Se.nonEmptySet=t=>Se.set(t)&&t.size>0;Se.emptyMap=t=>Se.map(t)&&t.size===0;Se.nonEmptyMap=t=>Se.map(t)&&t.size>0;Se.propertyKey=t=>Se.any([Se.string,Se.number,Se.symbol],t);Se.formData=t=>Zn("FormData")(t);Se.urlSearchParams=t=>Zn("URLSearchParams")(t);var Vse=(t,e,r)=>{if(!Se.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};Se.any=(t,...e)=>(Se.array(t)?t:[t]).some(o=>Vse(Array.prototype.some,o,e));Se.all=(t,...e)=>Vse(Array.prototype.every,t,e);var Mt=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\`${Se(u)}\``))].join(", ")}`:`received value of type \`${Se(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Rf.assert={undefined:t=>Mt(Se.undefined(t),"undefined",t),string:t=>Mt(Se.string(t),"string",t),number:t=>Mt(Se.number(t),"number",t),bigint:t=>Mt(Se.bigint(t),"bigint",t),function_:t=>Mt(Se.function_(t),"Function",t),null_:t=>Mt(Se.null_(t),"null",t),class_:t=>Mt(Se.class_(t),"Class",t),boolean:t=>Mt(Se.boolean(t),"boolean",t),symbol:t=>Mt(Se.symbol(t),"symbol",t),numericString:t=>Mt(Se.numericString(t),"string with a number",t),array:(t,e)=>{Mt(Se.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Mt(Se.buffer(t),"Buffer",t),blob:t=>Mt(Se.blob(t),"Blob",t),nullOrUndefined:t=>Mt(Se.nullOrUndefined(t),"null or undefined",t),object:t=>Mt(Se.object(t),"Object",t),iterable:t=>Mt(Se.iterable(t),"Iterable",t),asyncIterable:t=>Mt(Se.asyncIterable(t),"AsyncIterable",t),generator:t=>Mt(Se.generator(t),"Generator",t),asyncGenerator:t=>Mt(Se.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Mt(Se.nativePromise(t),"native Promise",t),promise:t=>Mt(Se.promise(t),"Promise",t),generatorFunction:t=>Mt(Se.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Mt(Se.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Mt(Se.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Mt(Se.boundFunction(t),"Function",t),regExp:t=>Mt(Se.regExp(t),"RegExp",t),date:t=>Mt(Se.date(t),"Date",t),error:t=>Mt(Se.error(t),"Error",t),map:t=>Mt(Se.map(t),"Map",t),set:t=>Mt(Se.set(t),"Set",t),weakMap:t=>Mt(Se.weakMap(t),"WeakMap",t),weakSet:t=>Mt(Se.weakSet(t),"WeakSet",t),int8Array:t=>Mt(Se.int8Array(t),"Int8Array",t),uint8Array:t=>Mt(Se.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Mt(Se.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Mt(Se.int16Array(t),"Int16Array",t),uint16Array:t=>Mt(Se.uint16Array(t),"Uint16Array",t),int32Array:t=>Mt(Se.int32Array(t),"Int32Array",t),uint32Array:t=>Mt(Se.uint32Array(t),"Uint32Array",t),float32Array:t=>Mt(Se.float32Array(t),"Float32Array",t),float64Array:t=>Mt(Se.float64Array(t),"Float64Array",t),bigInt64Array:t=>Mt(Se.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Mt(Se.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Mt(Se.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Mt(Se.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Mt(Se.dataView(t),"DataView",t),enumCase:(t,e)=>Mt(Se.enumCase(t,e),"EnumCase",t),urlInstance:t=>Mt(Se.urlInstance(t),"URL",t),urlString:t=>Mt(Se.urlString(t),"string with a URL",t),truthy:t=>Mt(Se.truthy(t),"truthy",t),falsy:t=>Mt(Se.falsy(t),"falsy",t),nan:t=>Mt(Se.nan(t),"NaN",t),primitive:t=>Mt(Se.primitive(t),"primitive",t),integer:t=>Mt(Se.integer(t),"integer",t),safeInteger:t=>Mt(Se.safeInteger(t),"integer",t),plainObject:t=>Mt(Se.plainObject(t),"plain object",t),typedArray:t=>Mt(Se.typedArray(t),"TypedArray",t),arrayLike:t=>Mt(Se.arrayLike(t),"array-like",t),domElement:t=>Mt(Se.domElement(t),"HTMLElement",t),observable:t=>Mt(Se.observable(t),"Observable",t),nodeStream:t=>Mt(Se.nodeStream(t),"Node.js Stream",t),infinite:t=>Mt(Se.infinite(t),"infinite number",t),emptyArray:t=>Mt(Se.emptyArray(t),"empty array",t),nonEmptyArray:t=>Mt(Se.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Mt(Se.emptyString(t),"empty string",t),emptyStringOrWhitespace:t=>Mt(Se.emptyStringOrWhitespace(t),"empty string or whitespace",t),nonEmptyString:t=>Mt(Se.nonEmptyString(t),"non-empty string",t),nonEmptyStringAndNotWhitespace:t=>Mt(Se.nonEmptyStringAndNotWhitespace(t),"non-empty string and not whitespace",t),emptyObject:t=>Mt(Se.emptyObject(t),"empty object",t),nonEmptyObject:t=>Mt(Se.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Mt(Se.emptySet(t),"empty set",t),nonEmptySet:t=>Mt(Se.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Mt(Se.emptyMap(t),"empty map",t),nonEmptyMap:t=>Mt(Se.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Mt(Se.propertyKey(t),"PropertyKey",t),formData:t=>Mt(Se.formData(t),"FormData",t),urlSearchParams:t=>Mt(Se.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Mt(Se.evenInteger(t),"even integer",t),oddInteger:t=>Mt(Se.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Mt(Se.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Mt(Se.inRange(t,e),"in range",t),any:(t,...e)=>Mt(Se.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Mt(Se.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(Se,{class:{value:Se.class_},function:{value:Se.function_},null:{value:Se.null_}});Object.defineProperties(Rf.assert,{class:{value:Rf.assert.class_},function:{value:Rf.assert.function_},null:{value:Rf.assert.null_}});Rf.default=Se;KS.exports=Se;KS.exports.default=Se;KS.exports.assert=Rf.assert});var Jse=_((cNt,BM)=>{"use strict";var zS=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},IE=class{static fn(e){return(...r)=>new IE((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}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(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new zS(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(IE.prototype,Promise.prototype);BM.exports=IE;BM.exports.CancelError=zS});var Xse=_((DM,PM)=>{"use strict";Object.defineProperty(DM,"__esModule",{value:!0});function Wrt(t){return t.encrypted}var vM=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let o=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",u=()=>{o&&r.connect(),Wrt(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once("connect",u):t.destroyed&&n&&r.close(t._hadError)};DM.default=vM;PM.exports=vM;PM.exports.default=vM});var Zse=_((bM,xM)=>{"use strict";Object.defineProperty(bM,"__esModule",{value:!0});var Krt=Xse(),zrt=Number(process.versions.node.split(".")[0]),SM=t=>{let e={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}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||zrt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener("lookup",A),Krt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener("lookup",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener("socket",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};bM.default=SM;xM.exports=SM;xM.exports.default=SM});var soe=_((uNt,FM)=>{"use strict";var{V4MAPPED:Vrt,ADDRCONFIG:Jrt,ALL:ioe,promises:{Resolver:$se},lookup:Xrt}=ve("dns"),{promisify:kM}=ve("util"),Zrt=ve("os"),BE=Symbol("cacheableLookupCreateConnection"),QM=Symbol("cacheableLookupInstance"),eoe=Symbol("expires"),$rt=typeof ioe=="number",toe=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},ent=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},roe=()=>{let t=!1,e=!1;for(let r of Object.values(Zrt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},tnt=t=>Symbol.iterator in t,noe={ttl:!0},rnt={all:!0},VS=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new $se,lookup:u=Xrt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=kM(u),this._resolver instanceof $se?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=kM(this._resolver.resolve4.bind(this._resolver)),this._resolve6=kM(this._resolver.resolve6.bind(this._resolver))),this._iface=roe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.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,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r={family:r}),!o)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&Vrt&&($rt&&r.hints&ioe||a.length===0)?ent(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&Jrt){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,noe),this._resolve6(e,noe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[eoe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}tnt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,rnt);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[eoe];a>=A?this._cache.delete(n):A("lookup"in r||(r.lookup=this.lookup),e[BE](r,o))}uninstall(e){if(toe(e),e[BE]){if(e[QM]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[BE],delete e[BE],delete e[QM]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=roe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};FM.exports=VS;FM.exports.default=VS});var loe=_((ANt,RM)=>{"use strict";var nnt=typeof URL>"u"?ve("url").URL:URL,int="text/plain",snt="us-ascii",ooe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),ont=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(";"),a=r[2],n=e?"":r[3],u=!1;o[o.length-1]==="base64"&&(o.pop(),u=!0);let A=(o.shift()||"").toLowerCase(),h=[...o.map(E=>{let[I,v=""]=E.split("=").map(x=>x.trim());return I==="charset"&&(v=v.toLowerCase(),v===snt)?"":`${I}${v?`=${v}`:""}`}).filter(Boolean)];return u&&h.push("base64"),(h.length!==0||A&&A!==int)&&h.unshift(A),`data:${h.join(";")},${u?a.trim():a}${n?`#${n}`:""}`},aoe=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return ont(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new nnt(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,u)=>/^(?!\/)/g.test(u)?`${u}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),u=n[n.length-1];ooe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])ooe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};RM.exports=aoe;RM.exports.default=aoe});var Aoe=_((fNt,uoe)=>{uoe.exports=coe;function coe(t,e){if(t&&e)return coe(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a{var foe=Aoe();TM.exports=foe(JS);TM.exports.strict=foe(poe);JS.proto=JS(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return JS(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return poe(this)},configurable:!0})});function JS(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function poe(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var NM=_((hNt,goe)=>{var ant=LM(),lnt=function(){},cnt=function(t){return t.setHeader&&typeof t.abort=="function"},unt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},hoe=function(t,e,r){if(typeof e=="function")return hoe(t,null,e);e||(e={}),r=ant(r||lnt);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error("exited with error code: "+C):null)},I=function(C){r.call(t,C)},v=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(u&&!(o&&o.ended))return r.call(t,new Error("premature close"))},x=function(){t.req.on("finish",p)};return cnt(t)?(t.on("complete",p),t.on("abort",v),t.req?x():t.on("request",x)):u&&!o&&(t.on("end",A),t.on("close",A)),unt(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",I),t.on("close",v),function(){t.removeListener("complete",p),t.removeListener("abort",v),t.removeListener("request",x),t.req&&t.req.removeListener("finish",p),t.removeListener("end",A),t.removeListener("close",A),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",I),t.removeListener("close",v)}};goe.exports=hoe});var yoe=_((gNt,moe)=>{var Ant=LM(),fnt=NM(),OM=ve("fs"),p1=function(){},pnt=/^v?\.0/.test(process.version),XS=function(t){return typeof t=="function"},hnt=function(t){return!pnt||!OM?!1:(t instanceof(OM.ReadStream||p1)||t instanceof(OM.WriteStream||p1))&&XS(t.close)},gnt=function(t){return t.setHeader&&XS(t.abort)},dnt=function(t,e,r,o){o=Ant(o);var a=!1;t.on("close",function(){a=!0}),fnt(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,hnt(t))return t.close(p1);if(gnt(t))return t.abort();if(XS(t.destroy))return t.destroy();o(u||new Error("stream was destroyed"))}}},doe=function(t){t()},mnt=function(t,e){return t.pipe(e)},ynt=function(){var t=Array.prototype.slice.call(arguments),e=XS(t[t.length-1]||p1)&&t.pop()||p1;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,o=t.map(function(a,n){var u=n0;return dnt(a,u,A,function(p){r||(r=p),p&&o.forEach(doe),!u&&(o.forEach(doe),e(r))})});return t.reduce(mnt)};moe.exports=ynt});var Coe=_((dNt,Eoe)=>{"use strict";var{PassThrough:Ent}=ve("stream");Eoe.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r==="buffer",a=!1;e?a=!(r||o):r=r||"utf8",o&&(r=null);let n=new Ent({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on("data",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(""),n.getBufferedLength=()=>u,n}});var woe=_((mNt,vE)=>{"use strict";var Cnt=yoe(),wnt=Coe(),ZS=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function $S(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=Cnt(t,wnt(e),A=>{if(A){u(A);return}a()}),o.on("data",()=>{o.getBufferedLength()>r&&u(new ZS)})}),o.getBufferedValue()}vE.exports=$S;vE.exports.default=$S;vE.exports.buffer=(t,e)=>$S(t,{...e,encoding:"buffer"});vE.exports.array=(t,e)=>$S(t,{...e,array:!0});vE.exports.MaxBufferError=ZS});var Boe=_((ENt,Ioe)=>{"use strict";var Int=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),Bnt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),vnt=new Set([500,502,503,504]),Dnt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},Pnt={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Sd(t){let e=parseInt(t,10);return isFinite(e)?e:0}function Snt(t){return t?vnt.has(t.status):!0}function MM(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let o of r){let[a,n]=o.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^"|"$/g,"")}return e}function bnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"="+o)}if(!!e.length)return e.join(", ")}Ioe.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=MM(r.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=r.headers.vary?e.headers:null,this._reqcc=MM(e.headers["cache-control"]),u&&"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":bnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&Bnt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||Int.has(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);let r=MM(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&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;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)Dnt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\s*,\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return Sd(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return Sd(this._rescc["s-maxage"])}if(this._rescc["max-age"])return Sd(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||oo)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+Sd(this._rescc["stale-if-error"]),o=e+Sd(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Sd(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Sd(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,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);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Snt(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?o=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!Pnt[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var eb=_((CNt,voe)=>{"use strict";voe.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var Poe=_((wNt,Doe)=>{"use strict";var xnt=ve("stream").Readable,knt=eb(),UM=class extends xnt{constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(o instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=knt(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};Doe.exports=UM});var boe=_((INt,Soe)=>{"use strict";var Qnt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];Soe.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Qnt));for(let o of r)o in e||(e[o]=typeof t[o]=="function"?t[o].bind(t):t[o])}});var koe=_((BNt,xoe)=>{"use strict";var Fnt=ve("stream").PassThrough,Rnt=boe(),Tnt=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Fnt;return Rnt(t,e),t.pipe(e)};xoe.exports=Tnt});var Qoe=_(_M=>{_M.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",o=Array.isArray(e);r=o?"[":"{";var a=!0;for(var n in e){var u=typeof e[n]=="function"||!o&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=","),a=!1,o?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=o?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};_M.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Loe=_((DNt,Toe)=>{"use strict";var Lnt=ve("events"),Foe=Qoe(),Nnt=t=>{let e={redis:"@keyv/redis",rediss:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql",etcd:"@keyv/etcd",offline:"@keyv/offline",tiered:"@keyv/tiered"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(ve(e[r]))(t)}return new Map},Roe=["sqlite","postgres","mysql","mongo","redis","tiered"],HM=class extends Lnt{constructor(e,{emitErrors:r=!0,...o}={}){if(super(),this.opts={namespace:"keyv",serialize:Foe.stringify,deserialize:Foe.parse,...typeof e=="string"?{uri:e}:e,...o},!this.opts.store){let n={...this.opts};this.opts.store=Nnt(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on=="function"&&r&&this.opts.store.on("error",n=>this.emit("error",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[u,A]of typeof n=="function"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(A);if(!(this.opts.store.namespace&&!u.includes(this.opts.store.namespace))){if(typeof p.expires=="number"&&Date.now()>p.expires){this.delete(u);continue}yield[this._getKeyUnprefix(u),p.value]}}};typeof this.opts.store[Symbol.iterator]=="function"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator=="function"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return Roe.includes(this.opts.store.opts.dialect)||Roe.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(":").splice(1).join(":")}get(e,r){let{store:o}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&o.getMany===void 0){let u=[];for(let A of n)u.push(Promise.resolve().then(()=>o.get(A)).then(p=>typeof p=="string"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires=="number"&&Date.now()>p.expires?this.delete(A).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(u).then(A=>{let p=[];for(let h of A)p.push(h.value);return p})}return Promise.resolve().then(()=>a?o.getMany(n):o.get(n)).then(u=>typeof u=="string"?this.opts.deserialize(u):this.opts.compression?this.opts.deserialize(u):u).then(u=>{if(u!=null)return a?u.map((A,p)=>{if(typeof A=="string"&&(A=this.opts.deserialize(A)),A!=null){if(typeof A.expires=="number"&&Date.now()>A.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?A:A.value}}):typeof u.expires=="number"&&Date.now()>u.expires?this.delete(e).then(()=>{}):r&&r.raw?u:u.value})}set(e,r,o){let a=this._getKeyPrefix(e);typeof o>"u"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let u=typeof o=="number"?Date.now()+o:null;return typeof r=="symbol"&&this.emit("error","symbol cannot be serialized"),r={value:r,expires:u},this.opts.serialize(r)}).then(u=>n.set(a,u,o)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let u of a)n.push(r.delete(u));return Promise.allSettled(n).then(u=>u.every(A=>A.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let o=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(o))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:o}=this.opts;return Promise.resolve().then(async()=>typeof o.has=="function"?o.has(r):await o.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect=="function")return e.disconnect()}};Toe.exports=HM});var Moe=_((SNt,Ooe)=>{"use strict";var Ont=ve("events"),tb=ve("url"),Mnt=loe(),Unt=woe(),qM=Boe(),Noe=Poe(),_nt=eb(),Hnt=koe(),qnt=Loe(),Gc=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new qnt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=GM(tb.parse(r)),r={};else if(r instanceof tb.URL)a=GM(tb.parse(r.toString())),r={};else{let[I,...v]=(r.path||"").split("?"),x=v.length>0?`?${v.join("?")}`:"";a=GM({...r,pathname:I,search:x})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Gnt(a)},r.headers=_nt(r.headers);let n=new Ont,u=Mnt(tb.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=I=>{h=!0;let v=!1,x,C=new Promise(N=>{x=()=>{v||(v=!0,N())}}),R=N=>{if(p&&!I.forceRefresh){N.status=N.statusCode;let V=qM.fromObject(p.cachePolicy).revalidatedPolicy(I,N);if(!V.modified){let te=V.policy.responseHeaders();N=new Noe(p.statusCode,te,p.body,p.url),N.cachePolicy=V.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new qM(I,N,I),N.fromCache=!1);let U;I.cache&&N.cachePolicy.storable()?(U=Hnt(N),(async()=>{try{let V=Unt.buffer(N);if(await Promise.race([C,new Promise(ue=>N.once("end",ue))]),v)return;let te=await V,ae={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:te},fe=I.strictTtl?N.cachePolicy.timeToLive():void 0;I.maxTtl&&(fe=fe?Math.min(fe,I.maxTtl):I.maxTtl),await this.cache.set(A,ae,fe)}catch(V){n.emit("error",new Gc.CacheError(V))}})()):I.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(V){n.emit("error",new Gc.CacheError(V))}})(),n.emit("response",U||N),typeof o=="function"&&o(U||N)};try{let N=e(I,R);N.once("error",x),N.once("abort",x),n.emit("request",N)}catch(N){n.emit("error",new Gc.RequestError(N))}};return(async()=>{let I=async x=>{await Promise.resolve();let C=x.cache?await this.cache.get(A):void 0;if(typeof C>"u")return E(x);let R=qM.fromObject(C.cachePolicy);if(R.satisfiesWithoutRevalidation(x)&&!x.forceRefresh){let N=R.responseHeaders(),U=new Noe(C.statusCode,N,C.body,C.url);U.cachePolicy=R,U.fromCache=!0,n.emit("response",U),typeof o=="function"&&o(U)}else p=C,x.headers=R.revalidationHeaders(x),E(x)},v=x=>n.emit("error",new Gc.CacheError(x));this.cache.once("error",v),n.on("response",()=>this.cache.removeListener("error",v));try{await I(r)}catch(x){r.automaticFailover&&!h&&E(r),n.emit("error",new Gc.CacheError(x))}})(),n}}};function Gnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function GM(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}Gc.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};Gc.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};Ooe.exports=Gc});var _oe=_((kNt,Uoe)=>{"use strict";var jnt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];Uoe.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(jnt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var qoe=_((QNt,Hoe)=>{"use strict";var{Transform:Ynt,PassThrough:Wnt}=ve("stream"),jM=ve("zlib"),Knt=_oe();Hoe.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof jM.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let o=!0,a=new Ynt({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new Wnt({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?jM.createBrotliDecompress():jM.createUnzip();return u.once("error",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Knt(t,n),t.pipe(a).pipe(u).pipe(n),n}});var WM=_((FNt,Goe)=>{"use strict";var YM=class{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,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);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)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Goe.exports=YM});var zM=_((RNt,Koe)=>{"use strict";var znt=ve("events"),Vnt=ve("tls"),Jnt=ve("http2"),Xnt=WM(),ea=Symbol("currentStreamsCount"),joe=Symbol("request"),Kl=Symbol("cachedOriginSet"),DE=Symbol("gracefullyClosing"),Znt=["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"],$nt=(t,e,r)=>{let o=0,a=t.length;for(;o>>1;r(t[n],e)?o=n+1:a=n}return o},eit=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,KM=(t,e)=>{for(let r of t)r[Kl].lengthe[Kl].includes(o))&&r[ea]+e[ea]<=e.remoteSettings.maxConcurrentStreams&&Woe(r)},tit=(t,e)=>{for(let r of t)e[Kl].lengthr[Kl].includes(o))&&e[ea]+r[ea]<=r.remoteSettings.maxConcurrentStreams&&Woe(e)},Yoe=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[rA.kCurrentStreamsCount]{t[DE]=!0,t[ea]===0&&t.close()},rA=class extends znt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Xnt({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let o of Znt)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=rA.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(u in this.sessions){let E=this.sessions[u],I=-1,v=-1,x;for(let C of E){let R=C.remoteSettings.maxConcurrentStreams;if(R=R||C[DE]||C.destroyed)continue;x||(I=R),N>v&&(x=C,v=N)}}if(x){if(o.length!==1){for(let{reject:C}of o){let R=new Error(`Expected the length of listeners to be 1, got ${o.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);C(R)}return}o[0].resolve(x);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,I=!1;try{let v=Jnt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});v[ea]=0,v[DE]=!1;let x=()=>v[ea]{this.tlsSessionCache.set(E,N)}),v.once("error",N=>{for(let{reject:U}of o)U(N);this.tlsSessionCache.delete(E)}),v.setTimeout(this.timeout,()=>{v.destroy()}),v.once("close",()=>{if(I){C&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[u];N.splice(N.indexOf(v),1),N.length===0&&delete this.sessions[u]}else{let N=new Error("Session closed without receiving a SETTINGS frame");N.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of o)U(N);p()}this._tryToCreateNewSession(u,A)});let R=()=>{if(!(!(u in this.queue)||!x())){for(let N of v[Kl])if(N in this.queue[u]){let{listeners:U}=this.queue[u][N];for(;U.length!==0&&x();)U.shift().resolve(v);let V=this.queue[u];if(V[N].listeners.length===0&&(delete V[N],Object.keys(V).length===0)){delete this.queue[u];break}if(!x())break}}};v.on("origin",()=>{v[Kl]=v.originSet,x()&&(R(),KM(this.sessions[u],v))}),v.once("remoteSettings",()=>{if(v.ref(),v.unref(),this._sessionsCount++,h.destroyed){let N=new Error("Agent has been destroyed");for(let U of o)U.reject(N);v.destroy();return}v[Kl]=v.originSet;{let N=this.sessions;if(u in N){let U=N[u];U.splice($nt(U,v,eit),0,v)}else N[u]=[v]}this._freeSessionsCount+=1,I=!0,this.emit("session",v),R(),p(),v[ea]===0&&this._freeSessionsCount>this.maxFreeSessions&&v.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),v.on("remoteSettings",()=>{R(),KM(this.sessions[u],v)})}),v[joe]=v.request,v.request=(N,U)=>{if(v[DE])throw new Error("The session is gracefully closing. No new streams are allowed.");let V=v[joe](N,U);return v.ref(),++v[ea],v[ea]===v.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,V.once("close",()=>{if(C=x(),--v[ea],!v.destroyed&&!v.closed&&(tit(this.sessions[u],v),x()&&!v.closed)){C||(this._freeSessionsCount++,C=!0);let te=v[ea]===0;te&&v.unref(),te&&(this._freeSessionsCount>this.maxFreeSessions||v[DE])?v.close():(KM(this.sessions[u],v),R())}}),V}}catch(v){for(let x of o)x.reject(v);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return rA.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),Vnt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ea]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return Yoe({agent:this,isFree:!0})}get busySessions(){return Yoe({agent:this,isFree:!1})}};rA.kCurrentStreamsCount=ea;rA.kGracefullyClosing=DE;Koe.exports={Agent:rA,globalAgent:new rA}});var JM=_((TNt,zoe)=>{"use strict";var{Readable:rit}=ve("stream"),VM=class extends rit{constructor(e,r){super({highWaterMark:r,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,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};zoe.exports=VM});var XM=_((LNt,Voe)=>{"use strict";Voe.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var Xoe=_((NNt,Joe)=>{"use strict";Joe.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var $oe=_((ONt,Zoe)=>{"use strict";Zoe.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var tae=_((UNt,eae)=>{"use strict";var PE=(t,e,r)=>{eae.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};PE(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${o?"one of":"of"} type ${r}. Received ${typeof t[2]}`});PE(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);PE(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);PE(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);PE(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);PE(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var r4=_((_Nt,lae)=>{"use strict";var nit=ve("http2"),{Writable:iit}=ve("stream"),{Agent:rae,globalAgent:sit}=zM(),oit=JM(),ait=XM(),lit=Xoe(),cit=$oe(),{ERR_INVALID_ARG_TYPE:ZM,ERR_INVALID_PROTOCOL:uit,ERR_HTTP_HEADERS_SENT:nae,ERR_INVALID_HTTP_TOKEN:Ait,ERR_HTTP_INVALID_HEADER_VALUE:fit,ERR_INVALID_CHAR:pit}=tae(),{HTTP2_HEADER_STATUS:iae,HTTP2_HEADER_METHOD:sae,HTTP2_HEADER_PATH:oae,HTTP2_METHOD_CONNECT:hit}=nit.constants,Qo=Symbol("headers"),$M=Symbol("origin"),e4=Symbol("session"),aae=Symbol("options"),rb=Symbol("flushedHeaders"),h1=Symbol("jobs"),git=/^[\^`\-\w!#$%&*+.|~]+$/,dit=/[^\t\u0020-\u007E\u0080-\u00FF]/,t4=class extends iit{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=ait(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[e4]=r.h2session;else if(r.agent===!1)this.agent=new rae({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new rae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=sit;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new ZM("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new uit(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[Qo]=Object.create(null),this[h1]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[Qo])&&(this[Qo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[aae]=r,n===443?(this[$M]=`https://${u}`,":authority"in this[Qo]||(this[Qo][":authority"]=u)):(this[$M]=`https://${u}:${n}`,":authority"in this[Qo]||(this[Qo][":authority"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once("response",o),this[rb]=!1}get method(){return this[Qo][sae]}set method(e){e&&(this[Qo][sae]=e.toUpperCase())}get path(){return this[Qo][oae]}set path(e){e&&(this[Qo][oae]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[h1].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[h1].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[rb]||this.destroyed)return;this[rb]=!0;let e=this.method===hit,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||lit(o,this,["timeout","continue","close","error"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once("finish",()=>{u(...A)})};o.once("response",a((u,A,p)=>{let h=new oit(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[iae],h.headers=u,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,o,Buffer.alloc(0))?this.emit("close"):o.destroy()):(o.on("data",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),o.once("headers",a(u=>this.emit("information",{statusCode:u[iae]}))),o.once("trailers",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[h1])u();this.emit("socket",this.socket)};if(this[e4])try{r(this[e4].request(this[Qo]))}catch(o){this.emit("error",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[$M],this[aae],this[Qo]))}catch(o){this.emit("error",o)}}}getHeader(e){if(typeof e!="string")throw new ZM("name","string",e);return this[Qo][e.toLowerCase()]}get headersSent(){return this[rb]}removeHeader(e){if(typeof e!="string")throw new ZM("name","string",e);if(this.headersSent)throw new nae("remove");delete this[Qo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new nae("set");if(typeof e!="string"||!git.test(e)&&!cit(e))throw new Ait("Header name",e);if(typeof r>"u")throw new fit(r,e);if(dit.test(r))throw new pit("header content",e);this[Qo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[h1].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};lae.exports=t4});var uae=_((HNt,cae)=>{"use strict";var mit=ve("tls");cae.exports=(t={},e=mit.connect)=>new Promise((r,o)=>{let a=!1,n,u=async()=>{await p,n.off("timeout",A),n.off("error",o),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit("timeout"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},A=async()=>{a=!0,u()},p=(async()=>{try{n=await e(t,u),n.on("error",o),n.once("timeout",A)}catch(h){o(h)}})()})});var fae=_((qNt,Aae)=>{"use strict";var yit=ve("net");Aae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),yit.isIP(e)?"":e}});var gae=_((GNt,i4)=>{"use strict";var pae=ve("http"),n4=ve("https"),Eit=uae(),Cit=WM(),wit=r4(),Iit=fae(),Bit=XM(),nb=new Cit({maxSize:100}),g1=new Map,hae=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit("free",e,r)};e.on("free",o);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",o),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},vit=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!nb.has(e)){if(g1.has(e))return(await g1.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Eit(t);g1.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(nb.set(e,u),t.path=r,u==="h2")n.destroy();else{let{globalAgent:A}=n4,p=n4.Agent.prototype.createConnection;o?o.createConnection===p?hae(o,n,t):n.destroy():A.createConnection===p?hae(A,n,t):n.destroy()}return g1.delete(e),u}catch(n){throw g1.delete(e),n}}return nb.get(e)};i4.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=Bit(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let o=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Iit(e),e.port=e.port||(o?443:80),e._defaultAgent=o?n4.globalAgent:pae.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[o?"https":"http"]}return o&&await vit(e)==="h2"?(a&&(e.agent=a.http2),new wit(e,r)):pae.request(e,r)};i4.exports.protocolCache=nb});var mae=_((jNt,dae)=>{"use strict";var Dit=ve("http2"),Pit=zM(),s4=r4(),Sit=JM(),bit=gae(),xit=(t,e,r)=>new s4(t,e,r),kit=(t,e,r)=>{let o=new s4(t,e,r);return o.end(),o};dae.exports={...Dit,ClientRequest:s4,IncomingMessage:Sit,...Pit,request:xit,get:kit,auto:bit}});var a4=_(o4=>{"use strict";Object.defineProperty(o4,"__esModule",{value:!0});var yae=Tf();o4.default=t=>yae.default.nodeStream(t)&&yae.default.function_(t.getBoundary)});var Iae=_(l4=>{"use strict";Object.defineProperty(l4,"__esModule",{value:!0});var Cae=ve("fs"),wae=ve("util"),Eae=Tf(),Qit=a4(),Fit=wae.promisify(Cae.stat);l4.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(Eae.default.string(t))return Buffer.byteLength(t);if(Eae.default.buffer(t))return t.length;if(Qit.default(t))return wae.promisify(t.getLength.bind(t))();if(t instanceof Cae.ReadStream){let{size:r}=await Fit(t.path);return r===0?void 0:r}}});var u4=_(c4=>{"use strict";Object.defineProperty(c4,"__esModule",{value:!0});function Rit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}c4.default=Rit});var Bae=_(A4=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0});A4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var Dae=_(d1=>{"use strict";Object.defineProperty(d1,"__esModule",{value:!0});d1.TimeoutError=void 0;var Tit=ve("net"),Lit=Bae(),vae=Symbol("reentry"),Nit=()=>{},ib=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};d1.TimeoutError=ib;d1.default=(t,e,r)=>{if(vae in t)return Nit;t[vae]=!0;let o=[],{once:a,unhandleAll:n}=Lit.default(),u=(I,v,x)=>{var C;let R=setTimeout(v,I,I,x);(C=R.unref)===null||C===void 0||C.call(R);let N=()=>{clearTimeout(R)};return o.push(N),N},{host:A,hostname:p}=r,h=(I,v)=>{t.destroy(new ib(I,v))},E=()=>{for(let I of o)I();n()};if(t.once("error",I=>{if(E(),t.listenerCount("error")===0)throw I}),t.once("close",E),a(t,"response",I=>{a(I,"end",E)}),typeof e.request<"u"&&u(e.request,h,"request"),typeof e.socket<"u"){let I=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,I),o.push(()=>{t.removeListener("timeout",I)})}return a(t,"socket",I=>{var v;let{socketPath:x}=t;if(I.connecting){let C=Boolean(x??Tit.isIP((v=p??A)!==null&&v!==void 0?v:"")!==0);if(typeof e.lookup<"u"&&!C&&typeof I.address().address>"u"){let R=u(e.lookup,h,"lookup");a(I,"lookup",R)}if(typeof e.connect<"u"){let R=()=>u(e.connect,h,"connect");C?a(I,"connect",R()):a(I,"lookup",N=>{N===null&&a(I,"connect",R())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(I,"connect",()=>{let R=u(e.secureConnect,h,"secureConnect");a(I,"secureConnect",R)})}if(typeof e.send<"u"){let C=()=>u(e.send,h,"send");I.connecting?a(I,"connect",()=>{a(t,"upload-complete",C())}):a(t,"upload-complete",C())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let I=u(e.response,h,"response");a(t,"response",I)}),E}});var Sae=_(f4=>{"use strict";Object.defineProperty(f4,"__esModule",{value:!0});var Pae=Tf();f4.default=t=>{t=t;let e={protocol:t.protocol,hostname:Pae.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return Pae.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var bae=_(p4=>{"use strict";Object.defineProperty(p4,"__esModule",{value:!0});var Oit=ve("url"),Mit=["protocol","host","hostname","port","pathname","search"];p4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:""}`}let a=new Oit.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of Mit)e[n]&&(a[n]=e[n].toString());return a}});var xae=_(g4=>{"use strict";Object.defineProperty(g4,"__esModule",{value:!0});var h4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};g4.default=h4});var m4=_(d4=>{"use strict";Object.defineProperty(d4,"__esModule",{value:!0});var Uit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};d4.default=Uit});var Qae=_(bd=>{"use strict";Object.defineProperty(bd,"__esModule",{value:!0});bd.dnsLookupIpVersionToFamily=bd.isDnsLookupIpVersion=void 0;var kae={auto:0,ipv4:4,ipv6:6};bd.isDnsLookupIpVersion=t=>t in kae;bd.dnsLookupIpVersionToFamily=t=>{if(bd.isDnsLookupIpVersion(t))return kae[t];throw new Error("Invalid DNS lookup IP version")}});var y4=_(sb=>{"use strict";Object.defineProperty(sb,"__esModule",{value:!0});sb.isResponseOk=void 0;sb.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Rae=_(E4=>{"use strict";Object.defineProperty(E4,"__esModule",{value:!0});var Fae=new Set;E4.default=t=>{Fae.has(t)||(Fae.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var Tae=_(C4=>{"use strict";Object.defineProperty(C4,"__esModule",{value:!0});var Ai=Tf(),_it=(t,e)=>{if(Ai.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Ai.assert.any([Ai.default.string,Ai.default.undefined],t.encoding),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.resolveBodyOnly),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.methodRewriting),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.isStream),Ai.assert.any([Ai.default.string,Ai.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ai.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Ai.default.number(r)&&(t.retry.limit=r),Ai.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Ai.default.number))),Ai.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!Ai.default.function_(o.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Ai.default.function_(o.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Ai.default.function_(o.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Ai.default.function_(o.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};C4.default=_it});var Lae=_(m1=>{"use strict";Object.defineProperty(m1,"__esModule",{value:!0});m1.retryAfterStatusCodes=void 0;m1.retryAfterStatusCodes=new Set([413,429,503]);var Hit=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};m1.default=Hit});var C1=_(Bn=>{"use strict";Object.defineProperty(Bn,"__esModule",{value:!0});Bn.UnsupportedProtocolError=Bn.ReadError=Bn.TimeoutError=Bn.UploadError=Bn.CacheError=Bn.HTTPError=Bn.MaxRedirectsError=Bn.RequestError=Bn.setNonEnumerableProperties=Bn.knownHookEvents=Bn.withoutBody=Bn.kIsNormalizedAlready=void 0;var Nae=ve("util"),Oae=ve("stream"),qit=ve("fs"),lh=ve("url"),Mae=ve("http"),w4=ve("http"),Git=ve("https"),jit=Zse(),Yit=soe(),Uae=Moe(),Wit=qoe(),Kit=mae(),zit=eb(),st=Tf(),Vit=Iae(),_ae=a4(),Jit=u4(),Hae=Dae(),Xit=Sae(),qae=bae(),Zit=xae(),$it=m4(),Gae=Qae(),est=y4(),ch=Rae(),tst=Tae(),rst=Lae(),I4,Zs=Symbol("request"),lb=Symbol("response"),SE=Symbol("responseSize"),bE=Symbol("downloadedSize"),xE=Symbol("bodySize"),kE=Symbol("uploadedSize"),ob=Symbol("serverResponsesPiped"),jae=Symbol("unproxyEvents"),Yae=Symbol("isFromCache"),B4=Symbol("cancelTimeouts"),Wae=Symbol("startedReading"),QE=Symbol("stopReading"),ab=Symbol("triggerRead"),uh=Symbol("body"),y1=Symbol("jobs"),Kae=Symbol("originalResponse"),zae=Symbol("retryTimeout");Bn.kIsNormalizedAlready=Symbol("isNormalizedAlready");var nst=st.default.string(process.versions.brotli);Bn.withoutBody=new Set(["GET","HEAD"]);Bn.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function ist(t){for(let e in t){let r=t[e];if(!st.default.string(r)&&!st.default.number(r)&&!st.default.boolean(r)&&!st.default.null_(r)&&!st.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function sst(t){return st.default.object(t)&&!("statusCode"in t)}var v4=new Zit.default,ost=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once("error",o),t.once("ready",()=>{t.off("error",o),e()})}),ast=new Set([300,301,302,303,304,307,308]),lst=["context","body","json","form"];Bn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(!!o)for(let a of lst)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var zi=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,o instanceof db?(Object.defineProperty(this,"request",{enumerable:!1,value:o}),Object.defineProperty(this,"response",{enumerable:!1,value:o[lb]}),Object.defineProperty(this,"options",{enumerable:!1,value:o.options})):Object.defineProperty(this,"options",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,st.default.string(r.stack)&&st.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(` +`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(` +`)}${A.reverse().join(` +`)}`}}};Bn.RequestError=zi;var ub=class extends zi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};Bn.MaxRedirectsError=ub;var Ab=class extends zi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};Bn.HTTPError=Ab;var fb=class extends zi{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};Bn.CacheError=fb;var pb=class extends zi{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};Bn.UploadError=pb;var hb=class extends zi{constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.event=e.event,this.timings=r}};Bn.TimeoutError=hb;var E1=class extends zi{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};Bn.ReadError=E1;var gb=class extends zi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};Bn.UnsupportedProtocolError=gb;var cst=["socket","connect","continue","information","upgrade","timeout"],db=class extends Oae.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[bE]=0,this[kE]=0,this.requestInitialized=!1,this[ob]=new Set,this.redirects=[],this[QE]=!1,this[ab]=!1,this[y1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof w4.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),Bn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){st.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof qit.ReadStream&&await ost(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[Zs])===null||h===void 0||h.destroy();return}for(let I of this[y1])I();this[y1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof zi){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(st.default.object(e)&&!st.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...o,...r},e!==void 0&&(r.url=e),st.default.urlInstance(r.url)&&(r.url=new lh.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),st.assert.any([st.default.string,st.default.undefined],r.method),st.assert.any([st.default.object,st.default.undefined],r.headers),st.assert.any([st.default.string,st.default.urlInstance,st.default.undefined],r.prefixUrl),st.assert.any([st.default.object,st.default.undefined],r.cookieJar),st.assert.any([st.default.object,st.default.string,st.default.undefined],r.searchParams),st.assert.any([st.default.object,st.default.string,st.default.undefined],r.cache),st.assert.any([st.default.object,st.default.number,st.default.undefined],r.timeout),st.assert.any([st.default.object,st.default.undefined],r.context),st.assert.any([st.default.object,st.default.undefined],r.hooks),st.assert.any([st.default.boolean,st.default.undefined],r.decompress),st.assert.any([st.default.boolean,st.default.undefined],r.ignoreInvalidCookies),st.assert.any([st.default.boolean,st.default.undefined],r.followRedirect),st.assert.any([st.default.number,st.default.undefined],r.maxRedirects),st.assert.any([st.default.boolean,st.default.undefined],r.throwHttpErrors),st.assert.any([st.default.boolean,st.default.undefined],r.http2),st.assert.any([st.default.boolean,st.default.undefined],r.allowGetBody),st.assert.any([st.default.string,st.default.undefined],r.localAddress),st.assert.any([Gae.isDnsLookupIpVersion,st.default.undefined],r.dnsLookupIpVersion),st.assert.any([st.default.object,st.default.undefined],r.https),st.assert.any([st.default.boolean,st.default.undefined],r.rejectUnauthorized),r.https&&(st.assert.any([st.default.boolean,st.default.undefined],r.https.rejectUnauthorized),st.assert.any([st.default.function_,st.default.undefined],r.https.checkServerIdentity),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.certificateAuthority),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.key),st.assert.any([st.default.string,st.default.object,st.default.array,st.default.undefined],r.https.certificate),st.assert.any([st.default.string,st.default.undefined],r.https.passphrase),st.assert.any([st.default.string,st.default.buffer,st.default.array,st.default.undefined],r.https.pfx)),st.assert.any([st.default.object,st.default.undefined],r.cacheOptions),st.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===o?.headers?r.headers={...r.headers}:r.headers=zit({...o?.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!==o?.searchParams){let x;if(st.default.string(r.searchParams)||r.searchParams instanceof lh.URLSearchParams)x=new lh.URLSearchParams(r.searchParams);else{ist(r.searchParams),x=new lh.URLSearchParams;for(let C in r.searchParams){let R=r.searchParams[C];R===null?x.append(C,""):R!==void 0&&x.append(C,R)}}(a=o?.searchParams)===null||a===void 0||a.forEach((C,R)=>{x.has(R)||x.append(R,C)}),r.searchParams=x}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(u=r.password)!==null&&u!==void 0?u:"",st.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o?.prefixUrl)!==null&&A!==void 0?A:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),st.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=qae.default(r.prefixUrl+r.url,r)}else(st.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=qae.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:x}=r;Object.defineProperty(r,"prefixUrl",{set:R=>{let N=r.url;if(!N.href.startsWith(R))throw new Error(`Cannot change \`prefixUrl\` from ${x} to ${R}: ${N.href}`);r.url=new lh.URL(R+N.href.slice(x.length)),x=R},get:()=>x});let{protocol:C}=r.url;if(C==="unix:"&&(C="http:",r.url=new lh.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!=="http:"&&C!=="https:")throw new gb(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}let{cookieJar:E}=r;if(E){let{setCookie:x,getCookieString:C}=E;st.assert.function_(x),st.assert.function_(C),x.length===4&&C.length===0&&(x=Nae.promisify(x.bind(r.cookieJar)),C=Nae.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:x,getCookieString:C})}let{cache:I}=r;if(I&&(v4.has(I)||v4.set(I,new Uae((x,C)=>{let R=x[Zs](x,C);return st.default.promise(R)&&(R.once=(N,U)=>{if(N==="error")R.catch(U);else if(N==="abort")(async()=>{try{(await R).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return R}),R},I))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)I4||(I4=new Yit.default),r.dnsCache=I4;else if(!st.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${st.default(r.dnsCache)}`);st.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let v=r.hooks===o?.hooks;r.hooks={...r.hooks};for(let x of Bn.knownHookEvents)if(x in r.hooks)if(st.default.array(r.hooks[x]))r.hooks[x]=[...r.hooks[x]];else throw new TypeError(`Parameter \`${x}\` must be an Array, got ${st.default(r.hooks[x])}`);else r.hooks[x]=[];if(o&&!v)for(let x of Bn.knownHookEvents)o.hooks[x].length>0&&(r.hooks[x]=[...o.hooks[x],...r.hooks[x]]);if("family"in r&&ch.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),o?.https&&(r.https={...o.https,...r.https}),"rejectUnauthorized"in r&&ch.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&ch.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&ch.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&ch.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&ch.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&ch.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&ch.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(let x in r.agent)if(x!=="http"&&x!=="https"&&x!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${x}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Bn.setNonEnumerableProperties([o,h],r),tst.default(r,o)}_lockWrite(){let 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(){let{options:e}=this,{headers:r}=e,o=!st.default.undefined(e.form),a=!st.default.undefined(e.json),n=!st.default.undefined(e.body),u=o||a||n,A=Bn.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof Oae.Readable)&&!st.default.string(e.body)&&!st.default.buffer(e.body)&&!_ae.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(o&&!st.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!st.default.string(r["content-type"]);n?(_ae.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[uh]=e.body):o?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[uh]=new lh.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[uh]=e.stringifyJson(e.json));let h=await Vit.default(this[uh],e.headers);st.default.undefined(r["content-length"])&&st.default.undefined(r["transfer-encoding"])&&!A&&!st.default.undefined(h)&&(r["content-length"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[xE]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Kae]=e,r.decompress&&(e=Wit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:Mae.STATUS_CODES[a],n.url=r.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[Yae]=n.isFromCache,this[SE]=Number(e.headers["content-length"])||void 0,this[lb]=e,e.once("end",()=>{this[SE]=this[bE],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",A=>{e.destroy(),this._beforeError(new E1(A,this))}),e.once("aborted",()=>{this._beforeError(new E1({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let u=e.headers["set-cookie"];if(st.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&ast.has(a)){if(e.resume(),this[Zs]&&(this[B4](),delete this[Zs],this[jae]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[uh]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new ub(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new lh.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let I of r.hooks.beforeRedirect)await I(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!est.isResponseOk(n)){this._beforeError(new Ab(n));return}e.on("readable",()=>{this[ab]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let A of this[ob])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;jit.default(e),this[B4]=Hae.default(e,o,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof Hae.TimeoutError?new hb(p,this.timings,this):new zi(p.message,p,this),this._beforeError(p)}),this[jae]=Jit.default(e,this,cst),this[Zs]=e,this.emit("uploadProgress",this.uploadProgress);let u=this[uh],A=this.redirects.length===0?this:e;st.default.nodeStream(u)?(u.pipe(A),u.once("error",p=>{this._beforeError(new pb(p,this))})):(this._unlockWrite(),st.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,Xit.default(e)),delete r.url;let n,u=v4.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",A),o(A)});r.url=e,u.once("error",a),u.once("request",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let U in A)if(st.default.undefined(A[U]))delete A[U];else if(st.default.null_(A[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(u.decompress&&st.default.undefined(A["accept-encoding"])&&(A["accept-encoding"]=nst?"gzip, deflate, br":"gzip, deflate"),u.cookieJar){let U=await u.cookieJar.getCookieString(u.url.toString());st.default.nonEmptyString(U)&&(u.headers.cookie=U)}for(let U of u.hooks.beforeRequest){let V=await U(u);if(!st.default.undefined(V)){u.request=()=>V;break}}u.body&&this[uh]!==u.body&&(this[uh]=u.body);let{agent:p,request:h,timeout:E,url:I}=u;if(u.dnsCache&&!("lookup"in u)&&(u.lookup=u.dnsCache.lookup),I.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${I.pathname}${I.search}`);if(U?.groups){let{socketPath:V,path:te}=U.groups;Object.assign(u,{socketPath:V,path:te,host:""})}}let v=I.protocol==="https:",x;u.http2?x=Kit.auto:x=v?Git.request:Mae.request;let C=(e=u.request)!==null&&e!==void 0?e:x,R=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[v?"https":"http"]),u[Zs]=C,delete u.request,delete u.timeout;let N=u;if(N.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,N.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{N.family=Gae.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}u.https&&("rejectUnauthorized"in u.https&&(N.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(N.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(N.ca=u.https.certificateAuthority),u.https.certificate&&(N.cert=u.https.certificate),u.https.key&&(N.key=u.https.key),u.https.passphrase&&(N.passphrase=u.https.passphrase),u.https.pfx&&(N.pfx=u.https.pfx));try{let U=await R(I,N);st.default.undefined(U)&&(U=x(I,N)),u.request=h,u.timeout=E,u.agent=p,u.https&&("rejectUnauthorized"in u.https&&delete N.rejectUnauthorized,u.https.checkServerIdentity&&delete N.checkServerIdentity,u.https.certificateAuthority&&delete N.ca,u.https.certificate&&delete N.cert,u.https.key&&delete N.key,u.https.passphrase&&delete N.passphrase,u.https.pfx&&delete N.pfx),sst(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof Uae.CacheError?new fb(U,this):new zi(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new zi(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[QE])return;let{options:r}=this,o=this.retryCount+1;this[QE]=!0,e instanceof zi||(e=new zi(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await $it.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let u;try{let A;n&&"retry-after"in n.headers&&(A=Number(n.headers["retry-after"]),Number.isNaN(A)?(A=Date.parse(n.headers["retry-after"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:rst.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new zi(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new zi(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",o,e))};this[zae]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[ab]=!0;let e=this[lb];if(e&&!this[QE]){e.readableLength&&(this[ab]=!1);let r;for(;(r=e.read())!==null;){this[bE]+=r.length,this[Wae]=!0;let o=this.downloadProgress;o.percent<1&&this.emit("downloadProgress",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[y1].push(a)}_writeRequest(e,r,o){this[Zs].destroyed||(this._progressCallbacks.push(()=>{this[kE]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[Zs].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Zs in this)){e();return}if(this[Zs].destroyed){e();return}this[Zs].end(o=>{o||(this[xE]=this[kE],this.emit("uploadProgress",this.uploadProgress),this[Zs].emit("upload-complete")),e(o)})};this.requestInitialized?r():this[y1].push(r)}_destroy(e,r){var o;this[QE]=!0,clearTimeout(this[zae]),Zs in this&&(this[B4](),!((o=this[lb])===null||o===void 0)&&o.complete||this[Zs].destroy()),e!==null&&!st.default.undefined(e)&&!(e instanceof zi)&&(e=new zi(e.message,e,this)),r(e)}get _isAboutToError(){return this[QE]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[Zs])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Kae])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[Zs])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[SE]?e=this[bE]/this[SE]:this[SE]===this[bE]?e=1:e=0,{percent:e,transferred:this[bE],total:this[SE]}}get uploadProgress(){let e;return this[xE]?e=this[kE]/this[xE]:this[xE]===this[kE]?e=1:e=0,{percent:e,transferred:this[kE],total:this[xE]}}get timings(){var e;return(e=this[Zs])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[Yae]}pipe(e,r){if(this[Wae])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof w4.ServerResponse&&this[ob].add(e),super.pipe(e,r)}unpipe(e){return e instanceof w4.ServerResponse&&this[ob].delete(e),super.unpipe(e),this}};Bn.default=db});var w1=_(jc=>{"use strict";var ust=jc&&jc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),Ast=jc&&jc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&ust(e,t,r)};Object.defineProperty(jc,"__esModule",{value:!0});jc.CancelError=jc.ParseError=void 0;var Vae=C1(),D4=class extends Vae.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.url.toString()}"`,e,r.request),this.name="ParseError"}};jc.ParseError=D4;var P4=class extends Vae.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};jc.CancelError=P4;Ast(C1(),jc)});var Xae=_(S4=>{"use strict";Object.defineProperty(S4,"__esModule",{value:!0});var Jae=w1(),fst=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(o);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new Jae.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new Jae.ParseError(n,t)}};S4.default=fst});var b4=_(Ah=>{"use strict";var pst=Ah&&Ah.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),hst=Ah&&Ah.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&pst(e,t,r)};Object.defineProperty(Ah,"__esModule",{value:!0});var gst=ve("events"),dst=Tf(),mst=Jse(),mb=w1(),Zae=Xae(),$ae=C1(),yst=u4(),Est=m4(),ele=y4(),Cst=["request","response","redirect","uploadProgress","downloadProgress"];function tle(t){let e,r,o=new gst.EventEmitter,a=new mst((u,A,p)=>{let h=E=>{let I=new $ae.default(void 0,t);I.retryCount=E,I._noPipe=!0,p(()=>I.destroy()),p.shouldReject=!1,p(()=>A(new mb.CancelError(I))),e=I,I.once("response",async C=>{var R;if(C.retryCount=E,C.request.aborted)return;let N;try{N=await Est.default(I),C.rawBody=N}catch{return}if(I._isAboutToError)return;let U=((R=C.headers["content-encoding"])!==null&&R!==void 0?R:"").toLowerCase(),V=["gzip","deflate","br"].includes(U),{options:te}=I;if(V&&!te.decompress)C.body=N;else try{C.body=Zae.default(C,te.responseType,te.parseJson,te.encoding)}catch(ae){if(C.body=N.toString(),ele.isResponseOk(C)){I._beforeError(ae);return}}try{for(let[ae,fe]of te.hooks.afterResponse.entries())C=await fe(C,async ue=>{let me=$ae.default.normalizeArguments(void 0,{...ue,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},te);me.hooks.afterResponse=me.hooks.afterResponse.slice(0,ae);for(let Be of me.hooks.beforeRetry)await Be(me);let he=tle(me);return p(()=>{he.catch(()=>{}),he.cancel()}),he})}catch(ae){I._beforeError(new mb.RequestError(ae.message,ae,I));return}if(!ele.isResponseOk(C)){I._beforeError(new mb.HTTPError(C));return}r=C,u(I.options.resolveBodyOnly?C.body:C)});let v=C=>{if(a.isCanceled)return;let{options:R}=I;if(C instanceof mb.HTTPError&&!R.throwHttpErrors){let{response:N}=C;u(I.options.resolveBodyOnly?N.body:N);return}A(C)};I.once("error",v);let x=I.options.body;I.once("retry",(C,R)=>{var N,U;if(x===((N=R.request)===null||N===void 0?void 0:N.options.body)&&dst.default.nodeStream((U=R.request)===null||U===void 0?void 0:U.options.body)){v(R);return}h(C)}),yst.default(I,o,Cst)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return Zae.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}Ah.default=tle;hst(w1(),Ah)});var rle=_(x4=>{"use strict";Object.defineProperty(x4,"__esModule",{value:!0});var wst=w1();function Ist(t,...e){let r=(async()=>{if(t instanceof wst.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}x4.default=Ist});var sle=_(k4=>{"use strict";Object.defineProperty(k4,"__esModule",{value:!0});var nle=Tf();function ile(t){for(let e of Object.values(t))(nle.default.plainObject(e)||nle.default.array(e))&&ile(e);return Object.freeze(t)}k4.default=ile});var ale=_(ole=>{"use strict";Object.defineProperty(ole,"__esModule",{value:!0})});var Q4=_(Vl=>{"use strict";var Bst=Vl&&Vl.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),vst=Vl&&Vl.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Bst(e,t,r)};Object.defineProperty(Vl,"__esModule",{value:!0});Vl.defaultHandler=void 0;var lle=Tf(),zl=b4(),Dst=rle(),Eb=C1(),Pst=sle(),Sst={RequestError:zl.RequestError,CacheError:zl.CacheError,ReadError:zl.ReadError,HTTPError:zl.HTTPError,MaxRedirectsError:zl.MaxRedirectsError,TimeoutError:zl.TimeoutError,ParseError:zl.ParseError,CancelError:zl.CancelError,UnsupportedProtocolError:zl.UnsupportedProtocolError,UploadError:zl.UploadError},bst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:yb}=Eb.default,cle=(...t)=>{let e;for(let r of t)e=yb(void 0,r,e);return e},xst=t=>t.isStream?new Eb.default(void 0,t):zl.default(t),kst=t=>"defaults"in t&&"options"in t.defaults,Qst=["get","post","put","patch","head","delete"];Vl.defaultHandler=(t,e)=>e(t);var ule=(t,e)=>{if(t)for(let r of t)r(e)},Ale=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:I}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=I}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?xst:h);if(lle.default.plainObject(o)){let E={...o,...a};Eb.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{ule(t.options.hooks.init,a),ule((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(v){E=v}let I=yb(o,a,n??t.options);if(I[Eb.kIsNormalizedAlready]=!0,E)throw new zl.RequestError(E.message,E,I);return h(I)}catch(E){if(a.isStream)throw E;return Dst.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)kst(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),"handlers"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==Vl.defaultHandler),n.length===0&&n.push(Vl.defaultHandler),Ale({options:cle(...a),handlers:n,mutableDefaults:Boolean(u)})};let r=async function*(o,a){let n=yb(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!lle.default.object(u))throw new TypeError("`options.pagination` must be implemented");let A=[],{countLimit:p}=u,h=0;for(;h{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of Qst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,Sst),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:Pst.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=cle,e};Vl.default=Ale;vst(ale(),Vl)});var hle=_((Lf,Cb)=>{"use strict";var Fst=Lf&&Lf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),fle=Lf&&Lf.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Fst(e,t,r)};Object.defineProperty(Lf,"__esModule",{value:!0});var Rst=ve("url"),ple=Q4(),Tst={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:t})=>t},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:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let o of e){let a=o.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Rst.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[ple.defaultHandler],mutableDefaults:!1},F4=ple.default(Tst);Lf.default=F4;Cb.exports=F4;Cb.exports.default=F4;Cb.exports.__esModule=!0;fle(Q4(),Lf);fle(b4(),Lf)});var nn={};zt(nn,{Method:()=>wle,del:()=>Ust,get:()=>N4,getNetworkSettings:()=>Cle,post:()=>O4,put:()=>Mst,request:()=>I1});function mle(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function R4(t){return al(dle,t,()=>oe.readFilePromise(t).then(e=>(dle.set(t,e),e)))}function Ost({statusCode:t,statusMessage:e},r){let o=Ut(r,t,yt.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Zy(r,`${o}${e?` (${e})`:""}`,a)}async function wb(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(o){if(o.name!=="HTTPError")throw o;let a=r?.(o,e)??o.response.body?.error;a==null&&(o.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=o.message),o.code==="ETIMEDOUT"&&o.event==="socket"&&(a+=`(can be increased via ${Ut(e,"httpTimeout",yt.SETTING)})`);let n=new Jt(35,a,u=>{o.response&&u.reportError(35,` ${Xu(e,{label:"Response Code",value:Hc(yt.NO_HINT,Ost(o.response,e))})}`),o.request&&(u.reportError(35,` ${Xu(e,{label:"Request Method",value:Hc(yt.NO_HINT,o.request.options.method)})}`),u.reportError(35,` ${Xu(e,{label:"Request URL",value:Hc(yt.URL,o.request.requestUrl)})}`)),o.request.redirects.length>0&&u.reportError(35,` ${Xu(e,{label:"Request Redirects",value:Hc(yt.NO_HINT,bN(e,o.request.redirects,yt.URL))})}`),o.request.retryCount===o.request.options.retry.limit&&u.reportError(35,` ${Xu(e,{label:"Request Retry Count",value:Hc(yt.NO_HINT,`${Ut(e,o.request.retryCount,yt.NUMBER)} (can be increased via ${Ut(e,"httpRetry",yt.SETTING)})`)})}`)});throw n.originalError=o,n}}function Cle(t,e){let r=[...e.configuration.get("networkSettings")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t=="string"?new URL(t):t;for(let[u,A]of r)if(L4.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>"u"&&(o[p]=h)}for(let u of a)typeof o[u]>"u"&&(o[u]=e.configuration.get(u));return o}async function I1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET",wrapNetworkRequest:A}){let p={target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u},h=async()=>await _st(t,e,p),E=typeof A<"u"?await A(h,p):h;return await(await r.reduceHook(v=>v.wrapNetworkRequest,E,p))()}async function N4(t,{configuration:e,jsonResponse:r,customErrorMessage:o,wrapNetworkRequest:a,...n}){let u=()=>wb(I1(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:o}).then(p=>p.body),A=await(typeof a<"u"?u():al(gle,t,()=>u().then(p=>(gle.set(t,p),p))));return r?JSON.parse(A.toString()):A}async function Mst(t,e,{customErrorMessage:r,...o}){return(await wb(I1(t,e,{...o,method:"PUT"}),{customErrorMessage:r,configuration:o.configuration})).body}async function O4(t,e,{customErrorMessage:r,...o}){return(await wb(I1(t,e,{...o,method:"POST"}),{customErrorMessage:r,configuration:o.configuration})).body}async function Ust(t,{customErrorMessage:e,...r}){return(await wb(I1(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function _st(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=typeof t=="string"?new URL(t):t,p=Cle(A,{configuration:r});if(p.enableNetwork===!1)throw new Jt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol==="http:"&&!L4.default.isMatch(A.hostname,r.get("unsafeHttpWhitelist")))throw new Jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?T4.default.httpOverHttp(mle(p.httpProxy)):Lst,https:p.httpsProxy?T4.default.httpsOverHttp(mle(p.httpsProxy)):Nst},headers:o,method:u};E.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?E.body=e:E.json=e);let I=r.get("httpTimeout"),v=r.get("httpRetry"),x=r.get("enableStrictSsl"),C=p.httpsCaFilePath,R=p.httpsCertFilePath,N=p.httpsKeyFilePath,{default:U}=await Promise.resolve().then(()=>$e(hle())),V=C?await R4(C):void 0,te=R?await R4(R):void 0,ae=N?await R4(N):void 0,fe=U.extend({timeout:{socket:I},retry:v,https:{rejectUnauthorized:x,certificateAuthority:V,certificate:te,key:ae},...E});return r.getLimit("networkConcurrency")(()=>fe(A))}var yle,Ele,L4,T4,gle,dle,Lst,Nst,wle,Ib=Et(()=>{Pt();yle=ve("https"),Ele=ve("http"),L4=$e(Zo()),T4=$e(Yse());Wl();jl();Gl();gle=new Map,dle=new Map,Lst=new Ele.Agent({keepAlive:!0}),Nst=new yle.Agent({keepAlive:!0});wle=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(wle||{})});var Vi={};zt(Vi,{availableParallelism:()=>U4,getArchitecture:()=>B1,getArchitectureName:()=>Yst,getArchitectureSet:()=>M4,getCaller:()=>Vst,major:()=>Hst,openUrl:()=>qst});function jst(){if(process.platform==="darwin"||process.platform==="win32")return null;let t;try{t=oe.readFileSync(Gst)}catch{}if(typeof t<"u"){if(t&&(t.includes("GLIBC")||t.includes("libc")))return"glibc";if(t&&t.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],o=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return KI(r,a=>{let n=a.match(o);if(!n)return KI.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function B1(){return Ble=Ble??{os:process.platform,cpu:process.arch,libc:jst()}}function Yst(t=B1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function M4(){let t=B1();return vle=vle??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function zst(t){let e=Wst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,o=e[2]&&e[2].indexOf("eval")===0,a=Kst.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function Vst(){let e=new Error().stack.split(` +`)[3];return zst(e)}function U4(){return typeof Bb.default.availableParallelism<"u"?Bb.default.availableParallelism():Math.max(1,Bb.default.cpus().length)}var Bb,Hst,Ile,qst,Gst,Ble,vle,Wst,Kst,vb=Et(()=>{Pt();Bb=$e(ve("os"));Db();Gl();Hst=Number(process.versions.node.split(".")[0]),Ile=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),qst=typeof Ile<"u"?async t=>{try{return await _4(Ile,[t],{cwd:z.cwd()}),!0}catch{return!1}}:void 0,Gst="/usr/bin/ldd";Wst=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Kst=/\((\S*)(?::(\d+))(?::(\d+))\)/});function Y4(t,e,r,o,a){let n=A1(r);if(o.isArray||o.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>H4(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>H4(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return H4(t,e,r,o,a)}function H4(t,e,r,o,a){let n=A1(r);switch(o.type){case"ANY":return jS(n);case"SHAPE":return $st(t,e,r,o,a);case"MAP":return eot(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if(o.values?.includes(n))return n;let A=(()=>{if(o.type==="BOOLEAN"&&typeof n!="string")return zI(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${e}" to be a string, got ${typeof n}`);let p=iS(n,{env:t.env});switch(o.type){case"ABSOLUTE_PATH":{let h=a,E=mM(r);return E&&E[0]!=="<"&&(h=z.dirname(E)),z.resolve(h,le.toPortablePath(p))}case"LOCATOR_LOOSE":return xf(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return xf(p);case"BOOLEAN":return zI(p);default:return p}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(", ")}`);return A}function $st(t,e,r,o,a){let n=A1(r);if(typeof n!="object"||Array.isArray(n))throw new it(`Object configuration settings "${e}" must be an object`);let u=W4(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new it(`Unrecognized configuration settings found: ${e}.${A} - run "yarn config -v" to see the list of settings supported in Yarn`);u.set(A,Y4(t,h,p,o.properties[A],a))}return u}function eot(t,e,r,o,a){let n=A1(r),u=new Map;if(typeof n!="object"||Array.isArray(n))throw new it(`Map configuration settings "${e}" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,I=o.valueDefinition;u.set(h,Y4(t,E,p,I,a))}return u}function W4(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,W4(t,n));return o}case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(o=>z.normalize(o)):z.isAbsolute(e.default)?z.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>z.resolve(t.projectCwd,o)):z.resolve(t.projectCwd,e.default);default:return e.default}}function Sb(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return Zst;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return le.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(Sb(a,e,r));return o}if(e.type==="MAP"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=Sb(n,e.valueDefinition,r);typeof u<"u"&&o.set(a,u)}return o}if(e.type==="SHAPE"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a],A=Sb(n,u,r);typeof A<"u"&&o.set(a,A)}return o}return t}function tot(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(bb)&&(e=(0,Ple.default)(e.slice(bb.length)),t[e]=r);return t}function G4(){let t=`${bb}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return j4}async function Dle(t){try{return await oe.readFilePromise(t)}catch{return Buffer.of()}}async function rot(t,e){return Buffer.compare(...await Promise.all([Dle(t),Dle(e)]))===0}async function not(t,e){let[r,o]=await Promise.all([oe.statPromise(t),oe.statPromise(e)]);return r.dev===o.dev&&r.ino===o.ino}async function sot({configuration:t,selfPath:e}){let r=t.get("yarnPath");return t.get("ignorePath")||r===null||r===e||await iot(r,e)?null:r}var Ple,Nf,Sle,ble,xle,q4,Jst,v1,Xst,FE,bb,j4,Zst,D1,kle,xb,Pb,iot,nA,Ke,P1=Et(()=>{Pt();Nl();Ple=$e(sz()),Nf=$e(rd());qt();Sle=$e(Zz()),ble=ve("module"),xle=$e(sd()),q4=ve("stream");ose();fE();cM();uM();AM();Tse();fM();Dd();Use();WS();jl();ih();Ib();Gl();vb();Qf();bo();Jst=function(){if(!Nf.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=le.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=oe.readJsonSync(t)}catch{return!1}return!(!("repository"in e)||!e.repository||(e.repository.private??!0))}(),v1=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),Xst=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","zipDataEpilogue","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreCwd"]),FE=/^(?!v)[a-z0-9._-]+$/i,bb="yarn_",j4=".yarnrc.yml",Zst="********",D1=(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",E))(D1||{}),kle=yt,xb=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(xb||{}),Pb={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:EM()},cacheFolder:{description:"Folder where the cache files must be written",type:"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:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"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:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:G4()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:aS,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:SN,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Nf.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Nf.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Nf.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:U4()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(cS),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"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:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Nf.isPR&&Jst,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"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:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"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:"BOOLEAN",default:!1}}}}}}}};iot=process.platform==="win32"?rot:not;nA=class{constructor(e){this.isCI=Nf.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static create(e,r,o){let a=new nA(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(Pb);let n=typeof o<"u"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){let u=tot();delete u.rcFilename;let A=new nA(e),p=await nA.findRcFiles(e),h=await nA.findFolderRcFile(EE());h&&(p.find(me=>me.path===h.path)||p.unshift(h));let E=Mse(p.map(ue=>[ue.path,ue.data])),I=Bt.dot,v=new Set(Object.keys(Pb)),x=({yarnPath:ue,ignorePath:me,injectEnvironmentFiles:he})=>({yarnPath:ue,ignorePath:me,injectEnvironmentFiles:he}),C=({yarnPath:ue,ignorePath:me,injectEnvironmentFiles:he,...Be})=>{let we={};for(let[g,Ee]of Object.entries(Be))v.has(g)&&(we[g]=Ee);return we},R=({yarnPath:ue,ignorePath:me,...he})=>{let Be={};for(let[we,g]of Object.entries(he))v.has(we)||(Be[we]=g);return Be};if(A.importSettings(x(Pb)),A.useWithSource("",x(u),e,{strict:!1}),E){let[ue,me]=E;A.useWithSource(ue,x(me),I,{strict:!1})}if(a){if(await sot({configuration:A,selfPath:a})!==null)return A;A.useWithSource("",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let N=await nA.findProjectCwd(e);A.startingCwd=e,A.projectCwd=N;let U=Object.assign(Object.create(null),process.env);A.env=U;let V=await Promise.all(A.get("injectEnvironmentFiles").map(async ue=>{let me=ue.endsWith("?")?await oe.readFilePromise(ue.slice(0,-1),"utf8").catch(()=>""):await oe.readFilePromise(ue,"utf8");return(0,Sle.parse)(me)}));for(let ue of V)for(let[me,he]of Object.entries(ue))A.env[me]=iS(he,{env:U});if(A.importSettings(C(Pb)),A.useWithSource("",C(u),e,{strict:o}),E){let[ue,me]=E;A.useWithSource(ue,C(me),I,{strict:o})}let te=ue=>"default"in ue?ue.default:ue,ae=new Map([["@@core",sse]]);if(r!==null)for(let ue of r.plugins.keys())ae.set(ue,te(r.modules.get(ue)));for(let[ue,me]of ae)A.activatePlugin(ue,me);let fe=new Map([]);if(r!==null){let ue=new Map;for(let Be of ble.builtinModules)ue.set(Be,()=>Df(Be));for(let[Be,we]of r.modules)ue.set(Be,()=>we);let me=new Set,he=async(Be,we)=>{let{factory:g,name:Ee}=Df(Be);if(!g||me.has(Ee))return;let Pe=new Map(ue),ce=ee=>{if(Pe.has(ee))return Pe.get(ee)();throw new it(`This plugin cannot access the package referenced via ${ee} which is neither a builtin, nor an exposed entry`)},ne=await Ky(async()=>te(await g(ce)),ee=>`${ee} (when initializing ${Ee}, defined in ${we})`);ue.set(Ee,()=>ne),me.add(Ee),fe.set(Ee,ne)};if(u.plugins)for(let Be of u.plugins.split(";")){let we=z.resolve(e,le.toPortablePath(Be));await he(we,"")}for(let{path:Be,cwd:we,data:g}of p)if(!!n&&!!Array.isArray(g.plugins))for(let Ee of g.plugins){let Pe=typeof Ee!="string"?Ee.path:Ee,ce=Ee?.spec??"",ne=Ee?.checksum??"";if(v1.has(ce))continue;let ee=z.resolve(we,le.toPortablePath(Pe));if(!await oe.existsPromise(ee)){if(!ce){let At=Ut(A,z.basename(ee,".cjs"),yt.NAME),H=Ut(A,".gitignore",yt.NAME),at=Ut(A,A.values.get("rcFilename"),yt.NAME),Re=Ut(A,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",yt.URL);throw new it(`Missing source for the ${At} plugin - please try to remove the plugin from ${at} then reinstall it manually. This error usually occurs because ${H} is incorrect, check ${Re} to make sure your plugin folder isn't gitignored.`)}if(!ce.match(/^https?:/)){let At=Ut(A,z.basename(ee,".cjs"),yt.NAME),H=Ut(A,A.values.get("rcFilename"),yt.NAME);throw new it(`Failed to recognize the source for the ${At} plugin - please try to delete the plugin from ${H} then reinstall it manually.`)}let Ie=await N4(ce,{configuration:A}),Fe=Js(Ie);if(ne&&ne!==Fe){let At=Ut(A,z.basename(ee,".cjs"),yt.NAME),H=Ut(A,A.values.get("rcFilename"),yt.NAME),at=Ut(A,`yarn plugin import ${ce}`,yt.CODE);throw new it(`Failed to fetch the ${At} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${H} then run ${at} to reimport it.`)}await oe.mkdirPromise(z.dirname(ee),{recursive:!0}),await oe.writeFilePromise(ee,Ie)}await he(ee,Be)}}for(let[ue,me]of fe)A.activatePlugin(ue,me);if(A.useWithSource("",R(u),e,{strict:o}),E){let[ue,me]=E;A.useWithSource(ue,R(me),I,{strict:o})}return A.get("enableGlobalCache")&&(A.values.set("cacheFolder",`${A.get("globalFolder")}/cache`),A.sources.set("cacheFolder","")),A}static async findRcFiles(e){let r=G4(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=z.join(n,r);if(oe.existsSync(u)){let A=await oe.readFilePromise(u,"utf8"),p;try{p=Ki(A)}catch{let E="";throw A.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(E=" (in particular, make sure you list the colons after each key name)"),new it(`Parse error when loading ${u}; please check it's proper Yaml${E}`)}o.unshift({path:u,cwd:n,data:p})}a=z.dirname(n)}return o}static async findFolderRcFile(e){let r=z.join(e,dr.rc),o;try{o=await oe.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=Ki(o);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o,oe.existsSync(z.join(a,dr.lockfile)))return a;oe.existsSync(z.join(a,dr.manifest))&&(r=a),o=z.dirname(a)}return r}static async updateConfiguration(e,r,o={}){let a=G4(),n=z.join(e,a),u=oe.existsSync(n)?Ki(await oe.readFilePromise(n,"utf8")):{},A=!1,p;if(typeof r=="function"){try{p=r(u)}catch{p=r({})}if(p===u)return!1}else{p=u;for(let h of Object.keys(r)){let E=u[h],I=r[h],v;if(typeof I=="function")try{v=I(E)}catch{v=I(void 0)}else v=I;E!==v&&(v===nA.deleteProperty?delete p[h]:p[h]=v,A=!0)}if(!A)return!1}return await oe.changeFilePromise(n,Ba(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await nA.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!="string"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=EE();return await nA.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,o),this.values.set(r,W4(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Ut(this,e,yt.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let u of["enableStrictSettings",...Object.keys(r)]){let A=r[u],p=mM(A);if(p&&(e=p),typeof A>"u"||u==="plugins"||e===""&&Xst.has(u))continue;if(u==="rcFilename")throw new it(`The rcFilename settings can only be set via ${`${bb}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let I=EE(),v=e[0]!=="<"?z.dirname(e):null;if(a&&!(v!==null?I===v:!1))throw new it(`Unrecognized or legacy configuration settings found: ${u} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=Y4(this,u,A,h,o)}catch(I){throw I.message+=` in ${Ut(this,e,yt.PATH)}`,I}if(u==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let I=this.values.get(u);this.values.set(u,new Map(n?[...I,...E]:[...E,...I])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let I=this.values.get(u);this.values.set(u,n?[...I,...E]:[...E,...I]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new it(`Couldn't find a configuration settings named "${e}"`);return Sb(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=oe.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${o} ${Ut(this,"STDOUT","green")}`),h=a.createStreamReporter(`${o} ${Ut(this,"STDERR","red")}`);n=new q4.PassThrough,n.pipe(p),n.pipe(A),u=new q4.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<"u"&&n.write(`${r} +`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new Pd([new c1,new Xn,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new hE([new gE,new mE,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=B1(),r=this.get("supportedArchitectures"),o=r.get("os");o!==null&&(o=o.map(u=>u==="current"?e.os:u));let a=r.get("cpu");a!==null&&(a=a.map(u=>u==="current"?e.cpu:u));let n=r.get("libc");return n!==null&&(n=ol(n,u=>u==="current"?e.libc??ol.skip:u)),{os:o,cpu:a,libc:n}}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!xa(o.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let u=new Ot;u.load(a,{yamlCompatibilityMode:!0});let A=Yy(e,o.identHash),p=[];A.push([o.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,I]of u.peerDependenciesMeta)for(let[v,x]of Object.entries(I))p.push({...h,type:"PeerDependencyMeta",selector:E,key:v,value:x})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get("packageExtensions"))r(sh(o,!0),nS(a),{userProvided:!0});return e}normalizeLocator(e){return xa(e.reference)?Qs(e,`${this.get("defaultProtocol")}${e.reference}`):FE.test(e.reference)?Qs(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return xa(e.range)?In(e,`${this.get("defaultProtocol")}${e.range}`):FE.test(e.range)?In(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e,{packageExtensions:r}){let o=e1(e),a=r.get(e.identHash);if(typeof a<"u"){let u=e.version;if(u!==null){for(let[A,p]of a)if(!!kf(u,A))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof o.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof o.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=o.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",al(o.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:EN(h)}}}let n=u=>u.scope?`${u.scope}__${u.name}`:`${u.name}`;for(let u of o.peerDependenciesMeta.keys()){let A=Vs(u);o.peerDependencies.has(A.identHash)||o.peerDependencies.set(A.identHash,In(A,"*"))}for(let u of o.peerDependencies.values()){if(u.scope==="types")continue;let A=n(u),p=tA("types",A),h=fn(p);o.peerDependencies.has(p.identHash)||o.peerDependenciesMeta.has(h)||(o.peerDependencies.set(p.identHash,In(p,"*")),o.peerDependenciesMeta.set(h,{optional:!0}))}return o.dependencies=new Map(ks(o.dependencies,([,u])=>Sa(u))),o.peerDependencies=new Map(ks(o.peerDependencies,([,u])=>Sa(u))),o}getLimit(e){return al(this.limits,e,()=>(0,xle.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);!n||await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);!A||(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<"u")return u}return null}},Ke=nA;Ke.deleteProperty=Symbol(),Ke.telemetry=null});var Ur={};zt(Ur,{EndStrategy:()=>J4,ExecError:()=>kb,PipeError:()=>S1,execvp:()=>_4,pipevp:()=>Yc});function xd(t){return t!==null&&typeof t.fd=="number"}function K4(){}function z4(){for(let t of kd)t.kill()}async function Yc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":xd(n)&&(h[0]=n),xd(u)&&(h[1]=u),xd(A)&&(h[2]=A);let E=(0,V4.default)(t,e,{cwd:le.fromPortablePath(r),env:{...o,PWD:le.fromPortablePath(r)},stdio:h});kd.add(E),kd.size===1&&(process.on("SIGINT",K4),process.on("SIGTERM",z4)),!xd(n)&&n!==null&&n.pipe(E.stdin),xd(u)||E.stdout.pipe(u,{end:!1}),xd(A)||E.stderr.pipe(A,{end:!1});let I=()=>{for(let v of new Set([u,A]))xd(v)||v.end()};return new Promise((v,x)=>{E.on("error",C=>{kd.delete(E),kd.size===0&&(process.off("SIGINT",K4),process.off("SIGTERM",z4)),(p===2||p===1)&&I(),x(C)}),E.on("close",(C,R)=>{kd.delete(E),kd.size===0&&(process.off("SIGINT",K4),process.off("SIGTERM",z4)),(p===2||p===1&&C!==0)&&I(),C===0||!a?v({code:X4(C,R)}):x(new S1({fileName:t,code:C,signal:R}))})})}async function _4(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:n=!1}){let u=["ignore","pipe","pipe"],A=[],p=[],h=le.fromPortablePath(r);typeof o.PWD<"u"&&(o={...o,PWD:h});let E=(0,V4.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on("data",I=>{A.push(I)}),E.stderr.on("data",I=>{p.push(I)}),await new Promise((I,v)=>{E.on("error",x=>{let C=Ke.create(r),R=Ut(C,t,yt.PATH);v(new Jt(1,`Process ${R} failed to spawn`,N=>{N.reportError(1,` ${Xu(C,{label:"Thrown Error",value:Hc(yt.NO_HINT,x.message)})}`)}))}),E.on("close",(x,C)=>{let R=a==="buffer"?Buffer.concat(A):Buffer.concat(A).toString(a),N=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);x===0||!n?I({code:X4(x,C),stdout:R,stderr:N}):v(new kb({fileName:t,code:x,signal:C,stdout:R,stderr:N}))})})}function X4(t,e){let r=oot.get(e);return typeof r<"u"?128+r:t??1}function aot(t,e,{configuration:r,report:o}){o.reportError(1,` ${Xu(r,t!==null?{label:"Exit Code",value:Hc(yt.NUMBER,t)}:{label:"Exit Signal",value:Hc(yt.CODE,e)})}`)}var V4,J4,S1,kb,kd,oot,Db=Et(()=>{Pt();V4=$e(sT());P1();Wl();jl();J4=(o=>(o[o.Never=0]="Never",o[o.ErrorCode=1]="ErrorCode",o[o.Always=2]="Always",o))(J4||{}),S1=class extends Jt{constructor({fileName:r,code:o,signal:a}){let n=Ke.create(z.cwd()),u=Ut(n,r,yt.PATH);super(1,`Child ${u} reported an error`,A=>{aot(o,a,{configuration:n,report:A})});this.code=X4(o,a)}},kb=class extends S1{constructor({fileName:r,code:o,signal:a,stdout:n,stderr:u}){super({fileName:r,code:o,signal:a});this.stdout=n,this.stderr=u}};kd=new Set;oot=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function Fle(t){Qle=t}function b1(){return typeof Z4>"u"&&(Z4=Qle()),Z4}var Z4,Qle,$4=Et(()=>{Qle=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var Rle=_((Qb,tU)=>{var lot=Object.assign({},ve("fs")),eU=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},o,a;r.ready=new Promise(function(We,tt){o=We,a=tt});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p="./this.program",h=function(We,tt){throw tt},E=!1,I=!0,v="";function x(We){return r.locateFile?r.locateFile(We,v):v+We}var C,R,N,U;I&&(E?v=ve("path").dirname(v)+"/":v=__dirname+"/",C=function(tt,It){var ir=ii(tt);return ir?It?ir:ir.toString():(N||(N=lot),U||(U=ve("path")),tt=U.normalize(tt),N.readFileSync(tt,It?null:"utf8"))},R=function(tt){var It=C(tt,!0);return It.buffer||(It=new Uint8Array(It)),Ee(It.buffer),It},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),A=process.argv.slice(2),h=function(We){process.exit(We)},r.inspect=function(){return"[Emscripten Module object]"});var V=r.print||console.log.bind(console),te=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var ae=0,fe=function(We){ae=We},ue;r.wasmBinary&&(ue=r.wasmBinary);var me=r.noExitRuntime||!0;typeof WebAssembly!="object"&&Ti("no native wasm support detected");function he(We,tt,It){switch(tt=tt||"i8",tt.charAt(tt.length-1)==="*"&&(tt="i32"),tt){case"i1":return He[We>>0];case"i8":return He[We>>0];case"i16":return up((We>>1)*2);case"i32":return Os((We>>2)*4);case"i64":return Os((We>>2)*4);case"float":return uu((We>>2)*4);case"double":return cp((We>>3)*8);default:Ti("invalid type for getValue: "+tt)}return null}var Be,we=!1,g;function Ee(We,tt){We||Ti("Assertion failed: "+tt)}function Pe(We){var tt=r["_"+We];return Ee(tt,"Cannot call unknown function "+We+", make sure it is exported"),tt}function ce(We,tt,It,ir,$){var ye={string:function(es){var bi=0;if(es!=null&&es!==0){var qo=(es.length<<2)+1;bi=Un(qo),At(es,bi,qo)}return bi},array:function(es){var bi=Un(es.length);return Re(es,bi),bi}};function Ne(es){return tt==="string"?Ie(es):tt==="boolean"?Boolean(es):es}var pt=Pe(We),ht=[],Tt=0;if(ir)for(var er=0;er=It)&&Te[ir];)++ir;return ee.decode(Te.subarray(We,ir))}function Fe(We,tt,It,ir){if(!(ir>0))return 0;for(var $=It,ye=It+ir-1,Ne=0;Ne=55296&&pt<=57343){var ht=We.charCodeAt(++Ne);pt=65536+((pt&1023)<<10)|ht&1023}if(pt<=127){if(It>=ye)break;tt[It++]=pt}else if(pt<=2047){if(It+1>=ye)break;tt[It++]=192|pt>>6,tt[It++]=128|pt&63}else if(pt<=65535){if(It+2>=ye)break;tt[It++]=224|pt>>12,tt[It++]=128|pt>>6&63,tt[It++]=128|pt&63}else{if(It+3>=ye)break;tt[It++]=240|pt>>18,tt[It++]=128|pt>>12&63,tt[It++]=128|pt>>6&63,tt[It++]=128|pt&63}}return tt[It]=0,It-$}function At(We,tt,It){return Fe(We,Te,tt,It)}function H(We){for(var tt=0,It=0;It=55296&&ir<=57343&&(ir=65536+((ir&1023)<<10)|We.charCodeAt(++It)&1023),ir<=127?++tt:ir<=2047?tt+=2:ir<=65535?tt+=3:tt+=4}return tt}function at(We){var tt=H(We)+1,It=Ni(tt);return It&&Fe(We,He,It,tt),It}function Re(We,tt){He.set(We,tt)}function ke(We,tt){return We%tt>0&&(We+=tt-We%tt),We}var xe,He,Te,Ve,qe,b,w,S,y,F;function J(We){xe=We,r.HEAP_DATA_VIEW=F=new DataView(We),r.HEAP8=He=new Int8Array(We),r.HEAP16=Ve=new Int16Array(We),r.HEAP32=b=new Int32Array(We),r.HEAPU8=Te=new Uint8Array(We),r.HEAPU16=qe=new Uint16Array(We),r.HEAPU32=w=new Uint32Array(We),r.HEAPF32=S=new Float32Array(We),r.HEAPF64=y=new Float64Array(We)}var X=r.INITIAL_MEMORY||16777216,Z,ie=[],be=[],Le=[],ot=!1;function dt(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)bt(r.preRun.shift());oo(ie)}function Gt(){ot=!0,oo(be)}function $t(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Qr(r.postRun.shift());oo(Le)}function bt(We){ie.unshift(We)}function an(We){be.unshift(We)}function Qr(We){Le.unshift(We)}var mr=0,br=null,Wr=null;function Kn(We){mr++,r.monitorRunDependencies&&r.monitorRunDependencies(mr)}function Ls(We){if(mr--,r.monitorRunDependencies&&r.monitorRunDependencies(mr),mr==0&&(br!==null&&(clearInterval(br),br=null),Wr)){var tt=Wr;Wr=null,tt()}}r.preloadedImages={},r.preloadedAudios={};function Ti(We){r.onAbort&&r.onAbort(We),We+="",te(We),we=!0,g=1,We="abort("+We+"). Build with -s ASSERTIONS=1 for more info.";var tt=new WebAssembly.RuntimeError(We);throw a(tt),tt}var ps="data:application/octet-stream;base64,";function io(We){return We.startsWith(ps)}var Si="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";io(Si)||(Si=x(Si));function Ns(We){try{if(We==Si&&ue)return new Uint8Array(ue);var tt=ii(We);if(tt)return tt;if(R)return R(We);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(It){Ti(It)}}function so(We,tt){var It,ir,$;try{$=Ns(We),ir=new WebAssembly.Module($),It=new WebAssembly.Instance(ir,tt)}catch(Ne){var ye=Ne.toString();throw te("failed to compile wasm module: "+ye),(ye.includes("imported Memory")||ye.includes("memory import"))&&te("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)."),Ne}return[It,ir]}function uc(){var We={a:Ua};function tt($,ye){var Ne=$.exports;r.asm=Ne,Be=r.asm.g,J(Be.buffer),Z=r.asm.W,an(r.asm.h),Ls("wasm-instantiate")}if(Kn("wasm-instantiate"),r.instantiateWasm)try{var It=r.instantiateWasm(We,tt);return It}catch($){return te("Module.instantiateWasm callback failed with error: "+$),!1}var ir=so(Si,We);return tt(ir[0]),r.asm}function uu(We){return F.getFloat32(We,!0)}function cp(We){return F.getFloat64(We,!0)}function up(We){return F.getInt16(We,!0)}function Os(We){return F.getInt32(We,!0)}function Dn(We,tt){F.setInt32(We,tt,!0)}function oo(We){for(;We.length>0;){var tt=We.shift();if(typeof tt=="function"){tt(r);continue}var It=tt.func;typeof It=="number"?tt.arg===void 0?Z.get(It)():Z.get(It)(tt.arg):It(tt.arg===void 0?null:tt.arg)}}function Ms(We,tt){var It=new Date(Os((We>>2)*4)*1e3);Dn((tt>>2)*4,It.getUTCSeconds()),Dn((tt+4>>2)*4,It.getUTCMinutes()),Dn((tt+8>>2)*4,It.getUTCHours()),Dn((tt+12>>2)*4,It.getUTCDate()),Dn((tt+16>>2)*4,It.getUTCMonth()),Dn((tt+20>>2)*4,It.getUTCFullYear()-1900),Dn((tt+24>>2)*4,It.getUTCDay()),Dn((tt+36>>2)*4,0),Dn((tt+32>>2)*4,0);var ir=Date.UTC(It.getUTCFullYear(),0,1,0,0,0,0),$=(It.getTime()-ir)/(1e3*60*60*24)|0;return Dn((tt+28>>2)*4,$),Ms.GMTString||(Ms.GMTString=at("GMT")),Dn((tt+40>>2)*4,Ms.GMTString),tt}function yl(We,tt){return Ms(We,tt)}function El(We,tt,It){Te.copyWithin(We,tt,tt+It)}function ao(We){try{return Be.grow(We-xe.byteLength+65535>>>16),J(Be.buffer),1}catch{}}function zn(We){var tt=Te.length;We=We>>>0;var It=2147483648;if(We>It)return!1;for(var ir=1;ir<=4;ir*=2){var $=tt*(1+.2/ir);$=Math.min($,We+100663296);var ye=Math.min(It,ke(Math.max(We,$),65536)),Ne=ao(ye);if(Ne)return!0}return!1}function On(We){fe(We)}function Li(We){var tt=Date.now()/1e3|0;return We&&Dn((We>>2)*4,tt),tt}function Mn(){if(Mn.called)return;Mn.called=!0;var We=new Date().getFullYear(),tt=new Date(We,0,1),It=new Date(We,6,1),ir=tt.getTimezoneOffset(),$=It.getTimezoneOffset(),ye=Math.max(ir,$);Dn((ds()>>2)*4,ye*60),Dn((gs()>>2)*4,Number(ir!=$));function Ne($r){var Gi=$r.toTimeString().match(/\(([A-Za-z ]+)\)$/);return Gi?Gi[1]:"GMT"}var pt=Ne(tt),ht=Ne(It),Tt=at(pt),er=at(ht);$>2)*4,Tt),Dn((wi()+4>>2)*4,er)):(Dn((wi()>>2)*4,er),Dn((wi()+4>>2)*4,Tt))}function _i(We){Mn();var tt=Date.UTC(Os((We+20>>2)*4)+1900,Os((We+16>>2)*4),Os((We+12>>2)*4),Os((We+8>>2)*4),Os((We+4>>2)*4),Os((We>>2)*4),0),It=new Date(tt);Dn((We+24>>2)*4,It.getUTCDay());var ir=Date.UTC(It.getUTCFullYear(),0,1,0,0,0,0),$=(It.getTime()-ir)/(1e3*60*60*24)|0;return Dn((We+28>>2)*4,$),It.getTime()/1e3|0}var rr=typeof atob=="function"?atob:function(We){var tt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",It="",ir,$,ye,Ne,pt,ht,Tt,er=0;We=We.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Ne=tt.indexOf(We.charAt(er++)),pt=tt.indexOf(We.charAt(er++)),ht=tt.indexOf(We.charAt(er++)),Tt=tt.indexOf(We.charAt(er++)),ir=Ne<<2|pt>>4,$=(pt&15)<<4|ht>>2,ye=(ht&3)<<6|Tt,It=It+String.fromCharCode(ir),ht!==64&&(It=It+String.fromCharCode($)),Tt!==64&&(It=It+String.fromCharCode(ye));while(er0||(dt(),mr>0))return;function tt(){Pn||(Pn=!0,r.calledRun=!0,!we&&(Gt(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),$t()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),tt()},1)):tt()}if(r.run=ys,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return ys(),e}}();typeof Qb=="object"&&typeof tU=="object"?tU.exports=eU:typeof define=="function"&&define.amd?define([],function(){return eU}):typeof Qb=="object"&&(Qb.createModule=eU)});var Of,Tle,Lle,Nle=Et(()=>{Of=["number","number"],Tle=(ee=>(ee[ee.ZIP_ER_OK=0]="ZIP_ER_OK",ee[ee.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",ee[ee.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",ee[ee.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",ee[ee.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",ee[ee.ZIP_ER_READ=5]="ZIP_ER_READ",ee[ee.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",ee[ee.ZIP_ER_CRC=7]="ZIP_ER_CRC",ee[ee.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",ee[ee.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",ee[ee.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",ee[ee.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",ee[ee.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",ee[ee.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",ee[ee.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",ee[ee.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",ee[ee.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",ee[ee.ZIP_ER_EOF=17]="ZIP_ER_EOF",ee[ee.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",ee[ee.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",ee[ee.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",ee[ee.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",ee[ee.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",ee[ee.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",ee[ee.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",ee[ee.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",ee[ee.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",ee[ee.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",ee[ee.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",ee[ee.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",ee[ee.ZIP_ER_TELL=30]="ZIP_ER_TELL",ee[ee.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",ee))(Tle||{}),Lle=t=>({get HEAPU8(){return t.HEAPU8},errors:Tle,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,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:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...Of,"number","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...Of,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...Of,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...Of,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...Of,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...Of,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...Of,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...Of,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...Of,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"])},struct:{statS:t.cwrap("zipstruct_statS","number",[]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function rU(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==z.sep);){if(t[r-1]===z.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==z.sep?null:t.slice(0,o)}var Jl,Ole=Et(()=>{Pt();Pt();iA();Jl=class extends qp{static async openPromise(e,r){let o=new Jl(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>"u"?A=>rU(A,".zip"):A=>{for(let p of r){let h=rU(A,p);if(h)return h}return null},n=(A,p)=>new Ji(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new Ji(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function cot(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(Mle.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function Fb(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var ta,nU,Mle,iU,Ule,Rb,Ji,sU=Et(()=>{Pt();Pt();Pt();Pt();Pt();Pt();ta=ve("fs"),nU=ve("stream"),Mle=ve("util"),iU=$e(ve("zlib"));$4();Ule="mixed";Rb=class extends Error{constructor(r,o){super(r);this.name="Libzip Error",this.code=o}},Ji=class extends Uu{constructor(r,o={}){super();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;let a=o;if(this.level=typeof a.level<"u"?a.level:Ule,r??=Fb(),typeof r=="string"){let{baseFs:A=new Tn}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code==="ENOENT"&&a.create)this.stats=Ea.makeDefaultStats();else throw A}else this.stats=Ea.makeDefaultStats();this.libzip=b1();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r=="string"&&(r=a.create?Fb():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,"i32")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(Bt.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;Ar)throw new Error("Overread");let n=Buffer.from(this.libzip.HEAPU8.subarray(o,o+r));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(n=Buffer.concat([n,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),n}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),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.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===Ea.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return z.resolve(Bt.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw tr.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw tr.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,"r");return SD(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>"u")throw tr.EBADF("read");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?tr.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw tr.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new nU.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw tr.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),u=Object.assign(new nU.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on("data",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw tr.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw tr.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=z.resolve(Bt.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=ta.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw tr.ENOENT(`access '${r}'`);if(this.readOnly&&o&ta.constants.W_OK)throw tr.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw tr.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw tr.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw tr.EBADF("fstatSync");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw tr.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(u))throw tr.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw tr.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw tr.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,I=512,v=Math.ceil(E/I),x=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=x,R=x,N=x,U=new Date(C),V=new Date(R),te=new Date(N),ae=new Date(x),fe=this.listings.has(o)?ta.constants.S_IFDIR:this.isSymbolicLink(n)?ta.constants.S_IFLNK:ta.constants.S_IFREG,ue=fe===ta.constants.S_IFDIR?493:420,me=fe|this.getUnixMode(n,ue)&511,he=this.libzip.struct.statCrc(u),Be=Object.assign(new Ea.StatEntry,{uid:p,gid:h,size:E,blksize:I,blocks:v,atime:U,birthtime:V,ctime:te,mtime:ae,atimeMs:C,birthtimeMs:R,ctimeMs:N,mtimeMs:x,mode:me,crc:he});return a.bigint===!0?Ea.convertToBigIntStats(Be):Be}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,I=this.stats.mtimeMs,v=this.stats.mtimeMs,x=this.stats.mtimeMs,C=this.stats.mtimeMs,R=new Date(I),N=new Date(v),U=new Date(x),V=new Date(C),te=ta.constants.S_IFDIR|493,ae=0,fe=Object.assign(new Ea.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:R,birthtime:N,ctime:U,mtime:V,atimeMs:I,birthtimeMs:v,ctimeMs:x,mtimeMs:C,mode:te,crc:ae});return a.bigint===!0?Ea.convertToBigIntStats(fe):fe}throw new Error("Unreachable")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(z.dirname(r)).add(z.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(z.dirname(r)).add(z.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r),this.listings.get(z.dirname(r))?.delete(z.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>"u")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw tr.EBUSY(`archive closed, ${r}`);let u=z.resolve(Bt.root,o);if(u==="/")return Bt.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,z.resolve(z.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,z.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw tr.ENOENT(r)}if(!h)throw tr.ENOTDIR(r);if(u=z.resolve(p,z.basename(u)),!a||this.symlinkCount===0)break;let I=this.libzip.name.locate(this.zip,u.slice(1),0);if(I===-1)break;if(this.isSymbolicLink(I)){let v=this.getFileSource(I).toString();u=z.resolve(z.dirname(u),v)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=z.relative(Bt.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&ta.constants.S_IFMT)===ta.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let I=this.libzip.fread(E,h,A,0);if(I===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(IA)throw new Error("Overread");let v=this.libzip.HEAPU8.subarray(h,h+A),x=Buffer.from(v);if(p===0)return this.fileSources.set(r,x),x;if(o.asyncDecompress)return new Promise((C,R)=>{iU.default.inflateRaw(x,(N,U)=>{N?R(N):(this.fileSources.set(r,U),C(U))})});{let C=iU.default.inflateRawSync(x);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmod"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw tr.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,ta.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fchown"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error("Unimplemented")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error("Unimplemented")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw tr.EROFS(`copyfile '${r} -> '${o}'`);if((a&ta.constants.COPYFILE_FICLONE_FORCE)!==0)throw tr.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>"u")throw tr.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if((a&(ta.constants.COPYFILE_EXCL|ta.constants.COPYFILE_FICLONE_FORCE))!==0&&typeof p<"u")throw tr.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw tr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw tr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>"u")throw tr.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw tr.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw tr.EISDIR(`open '${r}'`);let n=null,u=null;typeof o=="string"?n=o:typeof o=="object"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw tr.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw tr.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>"u")throw tr.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw tr.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw tr.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,a,0,cot(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw tr.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw tr.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw tr.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw tr.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw tr.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw tr.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}async rmPromise(r,o){return this.rmSync(r,o)}rmSync(r,{recursive:o=!1}={}){if(this.readOnly)throw tr.EROFS(`rm '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw tr.ENOTDIR(`rm '${r}'`);if(n.size>0)throw tr.ENOTEMPTY(`rm '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw tr.EINVAL(`rm '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,z.relative(Bt.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw tr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw tr.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw tr.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw tr.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(ta.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw tr.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw tr.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw tr.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw tr.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw tr.ENOTDIR(`scandir '${r}'`);if(o?.recursive)if(o?.withFileTypes){let u=Array.from(n,A=>Object.assign(this.statImpl("lstat",z.join(r,A)),{name:A,path:Bt.dot}));for(let A of u){if(!A.isDirectory())continue;let p=z.join(A.path,A.name),h=this.listings.get(z.join(a,p));for(let E of h)u.push(Object.assign(this.statImpl("lstat",z.join(r,p,E)),{name:E,path:p}))}return u}else{let u=[...n];for(let A of u){let p=this.listings.get(z.join(a,A));if(!(typeof p>"u"))for(let h of p)u.push(z.join(A,h))}return u}else return o?.withFileTypes?Array.from(n,u=>Object.assign(this.statImpl("lstat",z.join(r,u)),{name:u,path:void 0})):[...n]}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw tr.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(o))throw tr.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw tr.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw tr.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw tr.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw tr.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,"ftruncate"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),o)}watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=z.resolve(Bt.root,r);return ny(this,n,o,a)}unwatchFile(r,o){let a=z.resolve(Bt.root,r);return Ug(this,a,o)}}});function Hle(t,e,r=Buffer.alloc(0),o){let a=new Ji(r),n=I=>I===e||I.startsWith(`${e}/`)?I.slice(0,e.length):null,u=async(I,v)=>()=>a,A=(I,v)=>a,p={...t},h=new Tn(p),E=new qp({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o?.typeCheck});return Kw(_le.default,new Gp(E)),a}var _le,qle=Et(()=>{Pt();_le=$e(ve("fs"));sU()});var Gle=Et(()=>{Ole();sU();qle()});var x1={};zt(x1,{DEFAULT_COMPRESSION_LEVEL:()=>Ule,LibzipError:()=>Rb,ZipFS:()=>Ji,ZipOpenFS:()=>Jl,getArchivePart:()=>rU,getLibzipPromise:()=>Aot,getLibzipSync:()=>uot,makeEmptyArchive:()=>Fb,mountMemoryDrive:()=>Hle});function uot(){return b1()}async function Aot(){return b1()}var jle,iA=Et(()=>{$4();jle=$e(Rle());Nle();Gle();Fle(()=>{let t=(0,jle.default)();return Lle(t)})});var RE,Yle=Et(()=>{Pt();qt();k1();RE=class extends nt{constructor(){super(...arguments);this.cwd=ge.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await TE(r,[],{cwd:le.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}};RE.usage={description:"run a command using yarn's portable shell",details:` + This command will run a command using Yarn's portable shell. + + Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. + + Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. + + Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. + + For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. + `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}});var ll,Wle=Et(()=>{ll=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var Nb={};zt(Nb,{fastGlobOptions:()=>Vle,isBraceExpansion:()=>oU,isGlobPattern:()=>fot,match:()=>pot,micromatchOptions:()=>Lb});function fot(t){if(!Tb.default.scan(t,Lb).isGlob)return!1;try{Tb.default.parse(t,Lb)}catch{return!1}return!0}function pot(t,{cwd:e,baseFs:r}){return(0,Kle.default)(t,{...Vle,cwd:le.fromPortablePath(e),fs:FD(zle.default,new Gp(r))})}function oU(t){return Tb.default.scan(t,Lb).isBrace}var Kle,zle,Tb,Lb,Vle,Jle=Et(()=>{Pt();Kle=$e(RS()),zle=$e(ve("fs")),Tb=$e(Zo()),Lb={strictBrackets:!0},Vle={onlyDirectories:!1,onlyFiles:!1}});function aU(){}function lU(){for(let t of Qd)t.kill()}function ece(t,e,r,o){return a=>{let n=a[0]instanceof sA.Transform?"pipe":a[0],u=a[1]instanceof sA.Transform?"pipe":a[1],A=a[2]instanceof sA.Transform?"pipe":a[2],p=(0,Zle.default)(t,e,{...o,stdio:[n,u,A]});return Qd.add(p),Qd.size===1&&(process.on("SIGINT",aU),process.on("SIGTERM",lU)),a[0]instanceof sA.Transform&&a[0].pipe(p.stdin),a[1]instanceof sA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof sA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(Qd.delete(p),Qd.size===0&&(process.off("SIGINT",aU),process.off("SIGTERM",lU)),E.code){case"ENOENT":a[2].write(`command not found: ${t} +`),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} +`),h(128);break;default:a[2].write(`uncaught error: ${E.message} +`),h(1);break}}),p.on("close",E=>{Qd.delete(p),Qd.size===0&&(process.off("SIGINT",aU),process.off("SIGTERM",lU)),h(E!==null?E:129)})})}}}function tce(t){return e=>{let r=e[0]==="pipe"?new sA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function Ob(t,e){return LE.start(t,e)}function Xle(t,e=null){let r=new sA.PassThrough,o=new $le.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` +`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function rce(t,{prefix:e}){return{stdout:Xle(r=>t.stdout.write(`${r} +`),t.stdout.isTTY?e:null),stderr:Xle(r=>t.stderr.write(`${r} +`),t.stderr.isTTY?e:null)}}var Zle,sA,$le,Qd,Xl,cU,LE,uU=Et(()=>{Zle=$e(sT()),sA=ve("stream"),$le=ve("string_decoder"),Qd=new Set;Xl=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},cU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},LE=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new LE(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new LE(this,e),a=new cU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var T1={};zt(T1,{EntryCommand:()=>RE,ShellError:()=>ll,execute:()=>TE,globUtils:()=>Nb});function nce(t,e,r){let o=new cl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof cl.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new ll(`Bad file descriptor: "${t}"`)}return o}function Ub(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function got(t,e,r){let o=[],a=new cl.PassThrough;return a.on("data",n=>o.push(n)),await _b(t,e,Ub(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\r\n]+$/,"")}async function ice(t,e,r){let o=t.map(async n=>{let u=await Fd(n.args,e,r);return{name:n.name,value:u.join(" ")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function Mb(t){return t.match(/[^ \r\n\t]+/g)||[]}async function uce(t,e,r,o,a=o){switch(t.name){case"$":o(String(process.pid));break;case"#":o(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=Mb(n);for(let A=0;A=0&&n"u"&&(t.defaultValue?u=(await Fd(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(u="")),typeof u>"u")throw A?new ll(`Unbound argument #${n}`):new ll(`Unbound variable "${t.name}"`);if(t.quoted)o(u);else{let p=Mb(u);for(let E=0;Eo.push(n));let a=Number(o.join(" "));return Number.isNaN(a)?Q1({type:"variable",name:o.join(" ")},e,r):Q1({type:"number",value:a},e,r)}else return dot[t.type](await Q1(t.left,e,r),await Q1(t.right,e,r))}async function Fd(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{u(E),A()},h=(E,I,v)=>{let x=JSON.stringify({type:E,fd:I}),C=o.get(x);typeof C>"u"&&o.set(x,C=[]),C.push(v)};for(let E of t){let I=!1;switch(E.type){case"redirection":{let v=await Fd(E.args,e,r);for(let x of v)h(E.subtype,E.fd,x)}break;case"argument":for(let v of E.segments)switch(v.type){case"text":u(v.text);break;case"glob":u(v.pattern),I=!0;break;case"shell":{let x=await got(v.shell,e,r);if(v.quoted)u(x);else{let C=Mb(x);for(let R=0;R"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let x=await e.glob.match(v,{cwd:r.cwd,baseFs:e.baseFs});if(x.length===0){let C=oU(v)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new ll(`No matches found: "${v}"${C}`)}for(let C of x.sort())p(C)}}if(o.size>0){let E=[];for(let[I,v]of o.entries())E.splice(E.length,0,I,String(v.length),...v);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function F1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=le.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:o});let[n,...u]=t;if(n==="command")return ece(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return tce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:I,stdout:v,stderr:x}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=I,r.stdout=v,r.stderr=x}})}function mot(t,e,r){return o=>{let a=new cl.PassThrough,n=_b(t,e,Ub(r,{stdin:a}));return{stdin:a,promise:n}}}function yot(t,e,r){return o=>{let a=new cl.PassThrough,n=_b(t,e,r);return{stdin:a,promise:n}}}function sce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,F1([...e,"__ysh_run_procedure",a],r,o)}}async function oce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case"command":{let p=await Fd(o.args,e,r),h=await ice(o.envs,e,r);A=o.envs.length?F1(p,e,Ub(u,{environment:h})):F1(p,e,u)}break;case"subshell":{let p=await Fd(o.args,e,r),h=mot(o.subshell,e,u);A=sce(h,p,e,u)}break;case"group":{let p=await Fd(o.args,e,r),h=yot(o.group,e,u);A=sce(h,p,e,u)}break;case"envs":{let p=await ice(o.envs,e,r);u.environment={...u.environment,...p},A=F1(["true"],e,u)}break}if(typeof A>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=Ob(A,{stdin:new Xl(u.stdin),stdout:new Xl(u.stdout),stderr:new Xl(u.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(A,1);break;case"|&":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Eot(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[n%u.length];return ace.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=rce(r,{prefix:p});return r.backgroundJobs.push(oce(t,e,Ub(r,{stdout:h,stderr:E})).catch(I=>E.write(`${I.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(uy(t))}' has ended +`)})),0}return await oce(t,e,r)}async function Cot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables["?"]=String(A)},u=async A=>{try{return await Eot(A.chain,e,r,{background:o&&typeof A.then>"u"})}catch(p){if(!(p instanceof ll))throw p;return r.stderr.write(`${p.message} +`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await u(t.then.line));break;case"||":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function _b(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await Cot(n,e,r,{background:u==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function Ace(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>R1(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>R1(e));case"arithmetic":return AU(t.arithmetic);case"shell":return fU(t.shell);default:return!1}}function R1(t){switch(t.type){case"redirection":return t.args.some(e=>R1(e));case"argument":return t.segments.some(e=>Ace(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function AU(t){switch(t.type){case"variable":return Ace(t);case"number":return!1;default:return AU(t.left)||AU(t.right)}}function fU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case"subshell":o=fU(r.subshell);break;case"command":o=r.envs.some(a=>a.args.some(n=>R1(n)))||r.args.some(a=>R1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function TE(t,e=[],{baseFs:r=new Tn,builtins:o={},cwd:a=le.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=Nb}={}){let I={};for(let[C,R]of Object.entries(n))typeof R<"u"&&(I[C]=R);let v=new Map(hot);for(let[C,R]of Object.entries(o))v.set(C,R);u===null&&(u=new cl.PassThrough,u.end());let x=LD(t,E);if(!fU(x)&&x.length>0&&e.length>0){let{command:C}=x[x.length-1];for(;C.then;)C=C.then.line;let R=C.chain;for(;R.then;)R=R.then.chain;R.type==="command"&&(R.args=R.args.concat(e.map(N=>({type:"argument",segments:[{type:"text",text:N}]}))))}return await _b(x,{args:e,baseFs:r,builtins:v,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:I,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var ace,lce,cl,cce,hot,dot,k1=Et(()=>{Pt();Nl();ace=$e(IL()),lce=ve("os"),cl=ve("stream"),cce=ve("timers/promises");Yle();Wle();Jle();uU();uU();hot=new Map([["cd",async([t=(0,lce.homedir)(),...e],r,o)=>{let a=z.resolve(o.cwd,le.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code==="ENOENT"?new ll(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new ll(`cd: not a directory: ${t}`);return o.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${le.fromPortablePath(r.cwd)} +`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} +`),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new ll("sleep: missing operand");let o=Number(t);if(Number.isNaN(o))throw new ll(`sleep: invalid time interval '${t}'`);return await(0,cce.setTimeout)(1e3*o,0)}],["__ysh_run_procedure",async(t,e,r)=>{let o=r.procedures[t[0]];return await Ob(o,{stdin:new Xl(r.stdin),stdout:new Xl(r.stdout),stderr:new Xl(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!=="--";){let I=t[h++],{type:v,fd:x}=JSON.parse(I),C=V=>{switch(x){case null:case 0:u.push(V);break;default:throw new Error(`Unsupported file descriptor: "${x}"`)}},R=V=>{switch(x){case null:case 1:A.push(V);break;case 2:p.push(V);break;default:throw new Error(`Unsupported file descriptor: "${x}"`)}},N=Number(t[h++]),U=h+N;for(let V=h;Ve.baseFs.createReadStream(z.resolve(r.cwd,le.toPortablePath(t[V]))));break;case"<<<":C(()=>{let te=new cl.PassThrough;return process.nextTick(()=>{te.write(`${t[V]} +`),te.end()}),te});break;case"<&":C(()=>nce(Number(t[V]),1,r));break;case">":case">>":{let te=z.resolve(r.cwd,le.toPortablePath(t[V]));R(te==="/dev/null"?new cl.Writable({autoDestroy:!0,emitClose:!0,write(ae,fe,ue){setImmediate(ue)}}):e.baseFs.createWriteStream(te,v===">>"?{flags:"a"}:void 0))}break;case">&":R(nce(Number(t[V]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${v}"`)}}if(u.length>0){let I=new cl.PassThrough;o=I;let v=x=>{if(x===u.length)I.end();else{let C=u[x]();C.pipe(I,{end:!1}),C.on("end",()=>{v(x+1)})}};v(0)}if(A.length>0){let I=new cl.PassThrough;a=I;for(let v of A)I.pipe(v)}if(p.length>0){let I=new cl.PassThrough;n=I;for(let v of p)I.pipe(v)}let E=await Ob(F1(t.slice(h+1),e,r),{stdin:new Xl(o),stdout:new Xl(a),stderr:new Xl(n)}).run();return await Promise.all(A.map(I=>new Promise((v,x)=>{I.on("error",C=>{x(C)}),I.on("close",()=>{v()}),I.end()}))),await Promise.all(p.map(I=>new Promise((v,x)=>{I.on("error",C=>{x(C)}),I.on("close",()=>{v()}),I.end()}))),E}]]);dot={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Hb=_((n4t,fce)=>{function wot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r{var pce=hd(),Iot=Hb(),Bot=ql(),vot=pE(),Dot=1/0,hce=pce?pce.prototype:void 0,gce=hce?hce.toString:void 0;function dce(t){if(typeof t=="string")return t;if(Bot(t))return Iot(t,dce)+"";if(vot(t))return gce?gce.call(t):"";var e=t+"";return e=="0"&&1/t==-Dot?"-0":e}mce.exports=dce});var L1=_((s4t,Ece)=>{var Pot=yce();function Sot(t){return t==null?"":Pot(t)}Ece.exports=Sot});var pU=_((o4t,Cce)=>{function bot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o{var xot=pU();function kot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:xot(t,e,r)}wce.exports=kot});var hU=_((l4t,Bce)=>{var Qot="\\ud800-\\udfff",Fot="\\u0300-\\u036f",Rot="\\ufe20-\\ufe2f",Tot="\\u20d0-\\u20ff",Lot=Fot+Rot+Tot,Not="\\ufe0e\\ufe0f",Oot="\\u200d",Mot=RegExp("["+Oot+Qot+Lot+Not+"]");function Uot(t){return Mot.test(t)}Bce.exports=Uot});var Dce=_((c4t,vce)=>{function _ot(t){return t.split("")}vce.exports=_ot});var Rce=_((u4t,Fce)=>{var Pce="\\ud800-\\udfff",Hot="\\u0300-\\u036f",qot="\\ufe20-\\ufe2f",Got="\\u20d0-\\u20ff",jot=Hot+qot+Got,Yot="\\ufe0e\\ufe0f",Wot="["+Pce+"]",gU="["+jot+"]",dU="\\ud83c[\\udffb-\\udfff]",Kot="(?:"+gU+"|"+dU+")",Sce="[^"+Pce+"]",bce="(?:\\ud83c[\\udde6-\\uddff]){2}",xce="[\\ud800-\\udbff][\\udc00-\\udfff]",zot="\\u200d",kce=Kot+"?",Qce="["+Yot+"]?",Vot="(?:"+zot+"(?:"+[Sce,bce,xce].join("|")+")"+Qce+kce+")*",Jot=Qce+kce+Vot,Xot="(?:"+[Sce+gU+"?",gU,bce,xce,Wot].join("|")+")",Zot=RegExp(dU+"(?="+dU+")|"+Xot+Jot,"g");function $ot(t){return t.match(Zot)||[]}Fce.exports=$ot});var Lce=_((A4t,Tce)=>{var eat=Dce(),tat=hU(),rat=Rce();function nat(t){return tat(t)?rat(t):eat(t)}Tce.exports=nat});var Oce=_((f4t,Nce)=>{var iat=Ice(),sat=hU(),oat=Lce(),aat=L1();function lat(t){return function(e){e=aat(e);var r=sat(e)?oat(e):void 0,o=r?r[0]:e.charAt(0),a=r?iat(r,1).join(""):e.slice(1);return o[t]()+a}}Nce.exports=lat});var Uce=_((p4t,Mce)=>{var cat=Oce(),uat=cat("toUpperCase");Mce.exports=uat});var mU=_((h4t,_ce)=>{var Aat=L1(),fat=Uce();function pat(t){return fat(Aat(t).toLowerCase())}_ce.exports=pat});var Hce=_((g4t,qb)=>{function hat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,I=11,v=12,x=13,C=14,R=15,N=16,U=17,V=0,te=1,ae=2,fe=3,ue=4;function me(g,Ee){return 55296<=g.charCodeAt(Ee)&&g.charCodeAt(Ee)<=56319&&56320<=g.charCodeAt(Ee+1)&&g.charCodeAt(Ee+1)<=57343}function he(g,Ee){Ee===void 0&&(Ee=0);var Pe=g.charCodeAt(Ee);if(55296<=Pe&&Pe<=56319&&Ee=1){var ce=g.charCodeAt(Ee-1),ne=Pe;return 55296<=ce&&ce<=56319?(ce-55296)*1024+(ne-56320)+65536:ne}return Pe}function Be(g,Ee,Pe){var ce=[g].concat(Ee).concat([Pe]),ne=ce[ce.length-2],ee=Pe,Ie=ce.lastIndexOf(C);if(Ie>1&&ce.slice(1,Ie).every(function(H){return H==o})&&[o,x,U].indexOf(g)==-1)return ae;var Fe=ce.lastIndexOf(a);if(Fe>0&&ce.slice(1,Fe).every(function(H){return H==a})&&[v,a].indexOf(ne)==-1)return ce.filter(function(H){return H==a}).length%2==1?fe:ue;if(ne==t&&ee==e)return V;if(ne==r||ne==t||ne==e)return ee==C&&Ee.every(function(H){return H==o})?ae:te;if(ee==r||ee==t||ee==e)return te;if(ne==u&&(ee==u||ee==A||ee==h||ee==E))return V;if((ne==h||ne==A)&&(ee==A||ee==p))return V;if((ne==E||ne==p)&&ee==p)return V;if(ee==o||ee==R)return V;if(ee==n)return V;if(ne==v)return V;var At=ce.indexOf(o)!=-1?ce.lastIndexOf(o)-1:ce.length-2;return[x,U].indexOf(ce[At])!=-1&&ce.slice(At+1,-1).every(function(H){return H==o})&&ee==C||ne==R&&[N,U].indexOf(ee)!=-1?V:Ee.indexOf(a)!=-1?ae:ne==a&&ee==a?V:te}this.nextBreak=function(g,Ee){if(Ee===void 0&&(Ee=0),Ee<0)return 0;if(Ee>=g.length-1)return g.length;for(var Pe=we(he(g,Ee)),ce=[],ne=Ee+1;ne{var gat=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,Gb;function dat(){if(Gb)return Gb;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return Gb=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=Hce(),e=new t;return Gb=r=>e.splitGraphemes(r)}}qce.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let o=r-e,a="",n=0,u=0;for(;t.length>0;){let A=t.match(gat)||[t,t,void 0],p=dat()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(""),n+=h,u+=E,typeof A[2]<"u"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});var rn,N1=Et(()=>{rn=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.2.2"});function Vce(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Ku(t===null?0:t);return!r&&t===null?Ut(e,a,"grey"):a}function yU(t,{configuration:e,json:r}){let o=Vce(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=wr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return Zy(e,o,n)}async function NE({configuration:t,stdout:e,forceError:r},o){let a=await Lt.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let u=!1,A=!1;for(let p of o)typeof p.option<"u"&&(p.error||r?(A=!0,n.reportError(50,p.message)):(u=!0,n.reportWarning(50,p.message)),p.callback?.());u&&!A&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Kce,jb,mat,jce,Yce,fh,zce,Wce,yat,Eat,Yb,Cat,Lt,O1=Et(()=>{Kce=$e(Gce()),jb=$e(rd());fP();Wl();N1();jl();mat="\xB7",jce=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Yce=80,fh=jb.default.GITHUB_ACTIONS?{start:t=>`::group::${t} +`,end:t=>`::endgroup:: +`}:jb.default.TRAVIS?{start:t=>`travis_fold:start:${t} +`,end:t=>`travis_fold:end:${t} +`}:jb.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} +`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,zce=fh!==null,Wce=new Date,yat=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Eat=t=>t,Yb=Eat({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),Cat=yat&&Object.keys(Yb).find(t=>{let e=Yb[t];return!(e.date&&(e.date[0]!==Wce.getDate()||e.date[1]!==Wce.getMonth()+1))})||"default";Lt=class extends Xs{constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=!1,includeNames:u=!0,includePrefix:A=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:I=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(XI(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=u,this.includePrefix=A,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=I,this.json=a,this.stdout=o,r.get("enableProgressBars")&&!a&&o.isTTY&&o.columns>22){let v=r.get("progressBarStyle")||Cat;if(!Object.hasOwn(Yb,v))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Yb[v];let x=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*x/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!="string"){let h=u;u=h.message,A=A??h.name}let p=typeof A<"u"?`${A}: ${u}`:u;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,Ed(r.configuration,`Yarn ${rn}`,2));try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,o-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,fh!==null&&!this.json&&this.includeInfos&&this.stdout.write(fh.start(r))},reportFooter:A=>{if(this.indent-=1,fh!==null&&!this.json&&this.includeInfos){this.stdout.write(fh.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&A>200?this.reportInfo(null,`\u2514 Completed in ${Ut(this.configuration,A,yt.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof o=="function"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",u=`${this.formatPrefix(n,"blueBright")}${o}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${o}`)}reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,o)),this.reportErrorImpl(r,o)}reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"redBright")}${o}`,{truncate:!1})}reportFold(r,o){if(!fh)return;let a=`${fh.start(r)}${o}${fh.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let o=Ut(this.configuration,Date.now()-this.startTime,yt.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})} +`),this.writeProgress()}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})} +`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Yce&&(this.progressFrame=(this.progressFrame+1)%jce.length,this.progressTime=r);let o=jce[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Ut(this.configuration,"\u27A4","blueBright")} ${A}${o}${n}${p} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Yce)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>"u"&&(o=this.configuration.get("preferTruncatedLines")),o&&(r=(0,Kce.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?Vce(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,o){return this.includePrefix?`${Ut(this.configuration,"\u27A4",o)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?yU(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${mat} `}}});var un={};zt(un,{PackageManager:()=>Zce,detectPackageManager:()=>$ce,executePackageAccessibleBinary:()=>iue,executePackageScript:()=>Wb,executePackageShellcode:()=>EU,executeWorkspaceAccessibleBinary:()=>Sat,executeWorkspaceLifecycleScript:()=>rue,executeWorkspaceScript:()=>tue,getPackageAccessibleBinaries:()=>Kb,getWorkspaceAccessibleBinaries:()=>nue,hasPackageScript:()=>vat,hasWorkspaceScript:()=>CU,isNodeScript:()=>wU,makeScriptEnv:()=>M1,maybeExecuteWorkspaceLifecycleScript:()=>Pat,prepareExternalProject:()=>Bat});async function ph(t,e,r,o=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${o.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await oe.writeFilePromise(z.format({dir:t,name:e,ext:".cmd"}),a)}await oe.writeFilePromise(z.join(t,e),`#!/bin/sh +exec "${r}" ${o.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function $ce(t){let e=await Ot.tryFind(t);if(e?.packageManager){let o=US(e.packageManager);if(o?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(".");switch(o.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await oe.readFilePromise(z.join(t,dr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:oe.existsSync(z.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:oe.existsSync(z.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function M1({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let u={};for(let[E,I]of Object.entries(n))typeof I<"u"&&(u[E.toLowerCase()!=="path"?E:"PATH"]=I);let A=le.fromPortablePath(r);u.BERRY_BIN_FOLDER=le.fromPortablePath(A);let p=process.env.COREPACK_ROOT&&!o?le.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([ph(r,"node",process.execPath),...rn!==null?[ph(r,"run",process.execPath,[p,"run"]),ph(r,"yarn",process.execPath,[p]),ph(r,"yarnpkg",process.execPath,[p]),ph(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),t&&(u.INIT_CWD=le.fromPortablePath(t.configuration.startingCwd),u.PROJECT_CWD=le.fromPortablePath(t.cwd)),u.PATH=u.PATH?`${A}${le.delimiter}${u.PATH}`:`${A}`,u.npm_execpath=`${A}${le.sep}yarn`,u.npm_node_execpath=`${A}${le.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let E=t.tryWorkspaceByLocator(e),I=E?E.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";u.npm_package_name=fn(e),u.npm_package_version=I;let v;if(E)v=E.cwd;else{let x=t.storedPackages.get(e.locatorHash);if(!x)throw new Error(`Package for ${qr(t.configuration,e)} not found in the project`);let C=t.configuration.getLinkers(),R={project:t,report:new Lt({stdout:new hh.PassThrough,configuration:t.configuration})},N=C.find(U=>U.supportsPackage(x,R));if(!N)throw new Error(`The package ${qr(t.configuration,x)} isn't supported by any of the available linkers`);v=await N.findPackageLocation(x,R)}u.npm_package_json=le.fromPortablePath(z.join(v,dr.manifest))}let h=rn!==null?`yarn/${rn}`:`yarn/${Df("@yarnpkg/core").version}-core`;return u.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(u.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,u,async(E,I,v)=>await ph(r,E,I,v)),u}async function Bat(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await Iat(async()=>{await oe.mktempPromise(async u=>{let A=z.join(u,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:le.fromPortablePath(t),report:o}),I=n&&qc(n)?r1(n):n,v=I?ba(I):"an external project";h.write(`Packing ${v} from sources +`);let x=await $ce(t),C;x!==null?(h.write(`Using ${x.packageManager} for bootstrap. Reason: ${x.reason} + +`),C=x.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn + +`),C="Yarn");let R=C==="Yarn"&&!x?.packageManagerField;await oe.mktempPromise(async N=>{let U=await M1({binFolder:N,ignoreCorepack:R}),te=new Map([["Yarn Classic",async()=>{let fe=a!==null?["workspace",a]:[],ue=z.join(t,dr.manifest),me=await oe.readFilePromise(ue),he=await Yc(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(he.code!==0)return he.code;await oe.writeFilePromise(ue,me),await oe.appendFilePromise(z.join(t,".npmignore"),`/.yarn +`),h.write(` +`),delete U.NODE_ENV;let Be=await Yc("yarn",["install"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(Be.code!==0)return Be.code;h.write(` +`);let we=await Yc("yarn",[...fe,"pack","--filename",le.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return we.code!==0?we.code:0}],["Yarn",async()=>{let fe=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let ue=z.join(t,dr.lockfile);await oe.existsPromise(ue)||await oe.writeFilePromise(ue,"");let me=await Yc("yarn",[...fe,"pack","--install-if-needed","--filename",le.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return me.code!==0?me.code:0}],["npm",async()=>{if(a!==null){let Ee=new hh.PassThrough,Pe=zy(Ee);Ee.pipe(h,{end:!1});let ce=await Yc("npm",["--version"],{cwd:t,env:U,stdin:p,stdout:Ee,stderr:E,end:0});if(Ee.end(),ce.code!==0)return h.end(),E.end(),ce.code;let ne=(await Pe).toString().trim();if(!kf(ne,">=7.x")){let ee=tA(null,"npm"),Ie=In(ee,ne),Fe=In(ee,">=7.x");throw new Error(`Workspaces aren't supported by ${Gn(r,Ie)}; please upgrade to ${Gn(r,Fe)} (npm has been detected as the primary package manager for ${Ut(r,t,yt.PATH)})`)}}let fe=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let ue=await Yc("npm",["install","--legacy-peer-deps"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(ue.code!==0)return ue.code;let me=new hh.PassThrough,he=zy(me);me.pipe(h);let Be=await Yc("npm",["pack","--silent",...fe],{cwd:t,env:U,stdin:p,stdout:me,stderr:E});if(Be.code!==0)return Be.code;let we=(await he).toString().trim().replace(/^.*\n/s,""),g=z.resolve(t,le.toPortablePath(we));return await oe.renamePromise(g,e),0}]]).get(C);if(typeof te>"u")throw new Error("Assertion failed: Unsupported workflow");let ae=await te();if(!(ae===0||typeof ae>"u"))throw oe.detachTemp(u),new Jt(58,`Packing the package failed (exit code ${ae}, logs can be found here: ${Ut(r,A,yt.PATH)})`)})})})}async function vat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return CU(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${qr(r.configuration,t)} not found in the project`);return await Jl.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Lt({stdout:new hh.PassThrough,configuration:u})},h=A.find(x=>x.supportsPackage(a,p));if(!h)throw new Error(`The package ${qr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),I=new gn(E,{baseFs:n});return(await Ot.find(Bt.dot,{baseFs:I})).scripts.has(e)})}async function Wb(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{manifest:h,env:E,cwd:I}=await eue(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),v=h.scripts.get(e);if(typeof v>"u")return 1;let x=async()=>await TE(v,r,{cwd:I,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(R=>R.wrapScriptExecution,x,a,t,e,{script:v,args:r,cwd:I,env:E,stdin:n,stdout:u,stderr:A}))()})}async function EU(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{env:h,cwd:E}=await eue(t,{project:a,binFolder:p,cwd:o});return await TE(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function Dat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await M1({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await IU(e,await nue(t)),typeof r>"u"&&(r=z.dirname(await oe.realpathPromise(z.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function eue(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return Dat(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${qr(e.configuration,t)} not found in the project`);return await Jl.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Lt({stdout:new hh.PassThrough,configuration:p})},I=h.find(N=>N.supportsPackage(u,E));if(!I)throw new Error(`The package ${qr(e.configuration,u)} isn't supported by any of the available linkers`);let v=await M1({project:e,locator:t,binFolder:r,lifecycleScript:a});await IU(r,await Kb(t,{project:e}));let x=await I.findPackageLocation(u,E),C=new gn(x,{baseFs:A}),R=await Ot.find(Bt.dot,{baseFs:C});return typeof o>"u"&&(o=x),{manifest:R,binFolder:r,env:v,cwd:o}})}async function tue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await Wb(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function CU(t,e){return t.manifest.scripts.has(e)}async function rue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await oe.mktempPromise(async u=>{let A=z.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${le.fromPortablePath(t.cwd)}") +`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:qr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the "${e}" lifecycle script`);let I=await tue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),I!==0)throw oe.detachTemp(u),new Jt(36,`${(0,Jce.default)(e)} script failed (exit code ${Ut(a,I,yt.NUMBER)}, logs can be found here: ${Ut(a,A,yt.PATH)}); run ${Ut(a,`yarn ${e}`,yt.CODE)} to investigate`)})}async function Pat(t,e,r){CU(t,e)&&await rue(t,e,r)}function wU(t){let e=z.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0;if(e===".exe"||e===".bin")return!1;let r=Buffer.alloc(4),o;try{o=oe.openSync(t,"r")}catch{return!0}try{oe.readSync(o,r,0,r.length,0)}finally{oe.closeSync(o)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function Kb(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${qr(r,t)} not found in the project`);let n=new hh.Writable,u=r.getLinkers(),A={project:e,report:new Lt({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let I=e.storedResolutions.get(E.descriptorHash);if(!I)throw new Error(`Assertion failed: The resolution (${Gn(r,E)}) should have been registered`);p.add(I)}let h=await Promise.all(Array.from(p,async E=>{let I=e.storedPackages.get(E);if(!I)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(I.bin.size===0)return ol.skip;let v=u.find(C=>C.supportsPackage(I,A));if(!v)return ol.skip;let x=null;try{x=await v.findPackageLocation(I,A)}catch(C){if(C.code==="LOCATOR_NOT_INSTALLED")return ol.skip;throw C}return{dependency:I,packageLocation:x}}));for(let E of h){if(E===ol.skip)continue;let{dependency:I,packageLocation:v}=E;for(let[x,C]of I.bin){let R=z.resolve(v,C);o.set(x,[I,le.fromPortablePath(R),wU(R)])}}return o}async function nue(t){return await Kb(t.anchoredLocator,{project:t.project})}async function IU(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?ph(t,r,process.execPath,[o]):ph(t,r,o,[])))}async function iue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await Kb(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${qr(a.configuration,t)}`);return await oe.mktempPromise(async I=>{let[,v]=E,x=await M1({project:a,locator:t,binFolder:I});await IU(x.BERRY_BIN_FOLDER,h);let C=wU(le.toPortablePath(v))?Yc(process.execPath,[...p,v,...r],{cwd:o,env:x,stdin:n,stdout:u,stderr:A}):Yc(v,r,{cwd:o,env:x,stdin:n,stdout:u,stderr:A}),R;try{R=await C}finally{await oe.removePromise(x.BERRY_BIN_FOLDER)}return R.code})}async function Sat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await iue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var Jce,Xce,hh,Zce,wat,Iat,BU=Et(()=>{Pt();Pt();iA();k1();Jce=$e(mU()),Xce=$e(sd()),hh=ve("stream");fE();Wl();O1();N1();Db();jl();Gl();Qf();bo();Zce=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))(Zce||{});wat=2,Iat=(0,Xce.default)(wat)});var OE=_((O4t,oue)=>{"use strict";var sue=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"]]);oue.exports=t=>t?Object.keys(t).map(e=>[sue.has(e)?sue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var UE=_((M4t,gue)=>{"use strict";var aue=typeof process=="object"&&process?process:{stdout:null,stderr:null},bat=ve("events"),lue=ve("stream"),cue=ve("string_decoder").StringDecoder,Mf=Symbol("EOF"),Uf=Symbol("maybeEmitEnd"),gh=Symbol("emittedEnd"),zb=Symbol("emittingEnd"),U1=Symbol("emittedError"),Vb=Symbol("closed"),uue=Symbol("read"),Jb=Symbol("flush"),Aue=Symbol("flushChunk"),ka=Symbol("encoding"),_f=Symbol("decoder"),Xb=Symbol("flowing"),_1=Symbol("paused"),ME=Symbol("resume"),Fs=Symbol("bufferLength"),vU=Symbol("bufferPush"),DU=Symbol("bufferShift"),Fo=Symbol("objectMode"),Ro=Symbol("destroyed"),PU=Symbol("emitData"),fue=Symbol("emitEnd"),SU=Symbol("emitEnd2"),Hf=Symbol("async"),H1=t=>Promise.resolve().then(t),pue=global._MP_NO_ITERATOR_SYMBOLS_!=="1",xat=pue&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),kat=pue&&Symbol.iterator||Symbol("iterator not implemented"),Qat=t=>t==="end"||t==="finish"||t==="prefinish",Fat=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,Rat=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),Zb=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[ME](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},bU=class extends Zb{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};gue.exports=class hue extends lue{constructor(e){super(),this[Xb]=!1,this[_1]=!1,this.pipes=[],this.buffer=[],this[Fo]=e&&e.objectMode||!1,this[Fo]?this[ka]=null:this[ka]=e&&e.encoding||null,this[ka]==="buffer"&&(this[ka]=null),this[Hf]=e&&!!e.async||!1,this[_f]=this[ka]?new cue(this[ka]):null,this[Mf]=!1,this[gh]=!1,this[zb]=!1,this[Vb]=!1,this[U1]=null,this.writable=!0,this.readable=!0,this[Fs]=0,this[Ro]=!1}get bufferLength(){return this[Fs]}get encoding(){return this[ka]}set encoding(e){if(this[Fo])throw new Error("cannot set encoding in objectMode");if(this[ka]&&e!==this[ka]&&(this[_f]&&this[_f].lastNeed||this[Fs]))throw new Error("cannot change encoding");this[ka]!==e&&(this[_f]=e?new cue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[_f].write(r)))),this[ka]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Fo]}set objectMode(e){this[Fo]=this[Fo]||!!e}get async(){return this[Hf]}set async(e){this[Hf]=this[Hf]||!!e}write(e,r,o){if(this[Mf])throw new Error("write after end");if(this[Ro])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(o=r,r="utf8"),r||(r="utf8");let a=this[Hf]?H1:n=>n();return!this[Fo]&&!Buffer.isBuffer(e)&&(Rat(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):Fat(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[Fo]?(this.flowing&&this[Fs]!==0&&this[Jb](!0),this.flowing?this.emit("data",e):this[vU](e),this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing):e.length?(typeof e=="string"&&!(r===this[ka]&&!this[_f].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[ka]&&(e=this[_f].write(e)),this.flowing&&this[Fs]!==0&&this[Jb](!0),this.flowing?this.emit("data",e):this[vU](e),this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing):(this[Fs]!==0&&this.emit("readable"),o&&a(o),this.flowing)}read(e){if(this[Ro])return null;if(this[Fs]===0||e===0||e>this[Fs])return this[Uf](),null;this[Fo]&&(e=null),this.buffer.length>1&&!this[Fo]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[Fs])]);let r=this[uue](e||null,this.buffer[0]);return this[Uf](),r}[uue](e,r){return e===r.length||e===null?this[DU]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Fs]-=e),this.emit("data",r),!this.buffer.length&&!this[Mf]&&this.emit("drain"),r}end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function"&&(o=r,r="utf8"),e&&this.write(e,r),o&&this.once("end",o),this[Mf]=!0,this.writable=!1,(this.flowing||!this[_1])&&this[Uf](),this}[ME](){this[Ro]||(this[_1]=!1,this[Xb]=!0,this.emit("resume"),this.buffer.length?this[Jb]():this[Mf]?this[Uf]():this.emit("drain"))}resume(){return this[ME]()}pause(){this[Xb]=!1,this[_1]=!0}get destroyed(){return this[Ro]}get flowing(){return this[Xb]}get paused(){return this[_1]}[vU](e){this[Fo]?this[Fs]+=1:this[Fs]+=e.length,this.buffer.push(e)}[DU](){return this.buffer.length&&(this[Fo]?this[Fs]-=1:this[Fs]-=this.buffer[0].length),this.buffer.shift()}[Jb](e){do;while(this[Aue](this[DU]()));!e&&!this.buffer.length&&!this[Mf]&&this.emit("drain")}[Aue](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Ro])return;let o=this[gh];return r=r||{},e===aue.stdout||e===aue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new bU(this,e,r):new Zb(this,e,r)),this[Hf]?H1(()=>this[ME]()):this[ME]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[ME]():e==="readable"&&this[Fs]!==0?super.emit("readable"):Qat(e)&&this[gh]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[U1]&&(this[Hf]?H1(()=>r.call(this,this[U1])):r.call(this,this[U1])),o}get emittedEnd(){return this[gh]}[Uf](){!this[zb]&&!this[gh]&&!this[Ro]&&this.buffer.length===0&&this[Mf]&&(this[zb]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[Vb]&&this.emit("close"),this[zb]=!1)}emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==Ro&&this[Ro])return;if(e==="data")return r?this[Hf]?H1(()=>this[PU](r)):this[PU](r):!1;if(e==="end")return this[fue]();if(e==="close"){if(this[Vb]=!0,!this[gh]&&!this[Ro])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[U1]=r;let n=super.emit("error",r);return this[Uf](),n}else if(e==="resume"){let n=super.emit("resume");return this[Uf](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Uf](),a}[PU](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Uf](),r}[fue](){this[gh]||(this[gh]=!0,this.readable=!1,this[Hf]?H1(()=>this[SU]()):this[SU]())}[SU](){if(this[_f]){let r=this[_f].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[Fo]||(e.dataLength=0);let r=this.promise();return this.on("data",o=>{e.push(o),this[Fo]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[Fo]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Fo]?Promise.reject(new Error("cannot concat in objectMode")):this[ka]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Ro,()=>r(new Error("stream destroyed"))),this.on("error",o=>r(o)),this.on("end",()=>e())})}[xat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Mf])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener("data",u),this.removeListener("end",A),a(h)},u=h=>{this.removeListener("error",n),this.removeListener("end",A),this.pause(),o({value:h,done:!!this[Mf]})},A=()=>{this.removeListener("error",n),this.removeListener("data",u),o({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,o=h,this.once(Ro,p),this.once("error",n),this.once("end",A),this.once("data",u)})}}}[kat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Ro]?(e?this.emit("error",e):this.emit(Ro),this):(this[Ro]=!0,this.buffer.length=0,this[Fs]=0,typeof this.close=="function"&&!this[Vb]&&this.close(),e?this.emit("error",e):this.emit(Ro),this)}static isStream(e){return!!e&&(e instanceof hue||e instanceof lue||e instanceof bat&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var mue=_((U4t,due)=>{var Tat=ve("zlib").constants||{ZLIB_VERNUM:4736};due.exports=Object.freeze(Object.assign(Object.create(null),{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,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,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,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Tat))});var jU=_(ul=>{"use strict";var RU=ve("assert"),dh=ve("buffer").Buffer,Cue=ve("zlib"),Rd=ul.constants=mue(),Lat=UE(),yue=dh.concat,Td=Symbol("_superWrite"),HE=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},Nat=Symbol("opts"),q1=Symbol("flushFlag"),Eue=Symbol("finishFlushFlag"),GU=Symbol("fullFlushFlag"),ti=Symbol("handle"),$b=Symbol("onError"),_E=Symbol("sawError"),xU=Symbol("level"),kU=Symbol("strategy"),QU=Symbol("ended"),_4t=Symbol("_defaultFullFlush"),ex=class extends Lat{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[_E]=!1,this[QU]=!1,this[Nat]=e,this[q1]=e.flush,this[Eue]=e.finishFlush;try{this[ti]=new Cue[r](e)}catch(o){throw new HE(o)}this[$b]=o=>{this[_E]||(this[_E]=!0,this.close(),this.emit("error",o))},this[ti].on("error",o=>this[$b](new HE(o))),this.once("end",()=>this.close)}close(){this[ti]&&(this[ti].close(),this[ti]=null,this.emit("close"))}reset(){if(!this[_E])return RU(this[ti],"zlib binding closed"),this[ti].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[GU]),this.write(Object.assign(dh.alloc(0),{[q1]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[Eue]),this[QU]=!0,super.end(null,null,o)}get ended(){return this[QU]}write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&&(e=dh.from(e,r)),this[_E])return;RU(this[ti],"zlib binding closed");let a=this[ti]._handle,n=a.close;a.close=()=>{};let u=this[ti].close;this[ti].close=()=>{},dh.concat=h=>h;let A;try{let h=typeof e[q1]=="number"?e[q1]:this[q1];A=this[ti]._processChunk(e,h),dh.concat=yue}catch(h){dh.concat=yue,this[$b](new HE(h))}finally{this[ti]&&(this[ti]._handle=a,a.close=n,this[ti].close=u,this[ti].removeAllListeners("error"))}this[ti]&&this[ti].on("error",h=>this[$b](new HE(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[Td](dh.from(A[0]));for(let h=1;h{this.flush(a),n()};try{this[ti].params(e,r)}finally{this[ti].flush=o}this[ti]&&(this[xU]=e,this[kU]=r)}}}},TU=class extends qf{constructor(e){super(e,"Deflate")}},LU=class extends qf{constructor(e){super(e,"Inflate")}},FU=Symbol("_portable"),NU=class extends qf{constructor(e){super(e,"Gzip"),this[FU]=e&&!!e.portable}[Td](e){return this[FU]?(this[FU]=!1,e[9]=255,super[Td](e)):super[Td](e)}},OU=class extends qf{constructor(e){super(e,"Gunzip")}},MU=class extends qf{constructor(e){super(e,"DeflateRaw")}},UU=class extends qf{constructor(e){super(e,"InflateRaw")}},_U=class extends qf{constructor(e){super(e,"Unzip")}},tx=class extends ex{constructor(e,r){e=e||{},e.flush=e.flush||Rd.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Rd.BROTLI_OPERATION_FINISH,super(e,r),this[GU]=Rd.BROTLI_OPERATION_FLUSH}},HU=class extends tx{constructor(e){super(e,"BrotliCompress")}},qU=class extends tx{constructor(e){super(e,"BrotliDecompress")}};ul.Deflate=TU;ul.Inflate=LU;ul.Gzip=NU;ul.Gunzip=OU;ul.DeflateRaw=MU;ul.InflateRaw=UU;ul.Unzip=_U;typeof Cue.BrotliCompress=="function"?(ul.BrotliCompress=HU,ul.BrotliDecompress=qU):ul.BrotliCompress=ul.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var qE=_((G4t,wue)=>{var Oat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;wue.exports=Oat!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var rx=_((Y4t,Iue)=>{"use strict";var Mat=UE(),YU=qE(),WU=Symbol("slurp");Iue.exports=class extends Mat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,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=YU(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),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=YU(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[WU](r),o&&this[WU](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[WU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(this[o]=o==="path"||o==="linkpath"?YU(e[o]):e[o])}}});var KU=_(nx=>{"use strict";nx.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"]]);nx.code=new Map(Array.from(nx.name).map(t=>[t[1],t[0]]))});var Pue=_((K4t,Due)=>{"use strict";var Uat=(t,e)=>{if(Number.isSafeInteger(t))t<0?Hat(t,e):_at(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},_at=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Hat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=Bue(a):a===0?e[o-1]=0:(r=!0,e[o-1]=vue(a))}},qat=t=>{let e=t[0],r=e===128?jat(t.slice(1,t.length)):e===255?Gat(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},Gat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=Bue(n):n===0?u=n:(o=!0,u=vue(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},jat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},Bue=t=>(255^t)&255,vue=t=>(255^t)+1&255;Due.exports={encode:Uat,parse:qat}});var jE=_((z4t,bue)=>{"use strict";var zU=KU(),GE=ve("path").posix,Sue=Pue(),VU=Symbol("slurp"),Al=Symbol("type"),ZU=class{constructor(e,r,o,a){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[Al]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Ld(e,r,100),this.mode=mh(e,r+100,8),this.uid=mh(e,r+108,8),this.gid=mh(e,r+116,8),this.size=mh(e,r+124,12),this.mtime=JU(e,r+136,12),this.cksum=mh(e,r+148,12),this[VU](o),this[VU](a,!0),this[Al]=Ld(e,r+156,1),this[Al]===""&&(this[Al]="0"),this[Al]==="0"&&this.path.substr(-1)==="/"&&(this[Al]="5"),this[Al]==="5"&&(this.size=0),this.linkpath=Ld(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Ld(e,r+265,32),this.gname=Ld(e,r+297,32),this.devmaj=mh(e,r+329,8),this.devmin=mh(e,r+337,8),e[r+475]!==0){let u=Ld(e,r+345,155);this.path=u+"/"+this.path}else{let u=Ld(e,r+345,130);u&&(this.path=u+"/"+this.path),this.atime=JU(e,r+476,12),this.ctime=JU(e,r+488,12)}let n=8*32;for(let u=r;u=r+512))throw new Error("need 512 bytes for header");let o=this.ctime||this.atime?130:155,a=Yat(this.path||"",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=Nd(e,r,100,n)||this.needPax,this.needPax=yh(e,r+100,8,this.mode)||this.needPax,this.needPax=yh(e,r+108,8,this.uid)||this.needPax,this.needPax=yh(e,r+116,8,this.gid)||this.needPax,this.needPax=yh(e,r+124,12,this.size)||this.needPax,this.needPax=XU(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Al].charCodeAt(0),this.needPax=Nd(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Nd(e,r+265,32,this.uname)||this.needPax,this.needPax=Nd(e,r+297,32,this.gname)||this.needPax,this.needPax=yh(e,r+329,8,this.devmaj)||this.needPax,this.needPax=yh(e,r+337,8,this.devmin)||this.needPax,this.needPax=Nd(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=Nd(e,r+345,155,u)||this.needPax:(this.needPax=Nd(e,r+345,130,u)||this.needPax,this.needPax=XU(e,r+476,12,this.atime)||this.needPax,this.needPax=XU(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p{let o=t,a="",n,u=GE.parse(t).root||".";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=GE.dirname(o),o=GE.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,100-1),a,!0]:(o=GE.join(GE.basename(a),o),a=GE.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,100-1),"",!0])}return n},Ld=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),JU=(t,e,r)=>Wat(mh(t,e,r)),Wat=t=>t===null?null:new Date(t*1e3),mh=(t,e,r)=>t[e]&128?Sue.parse(t.slice(e,e+r)):zat(t,e,r),Kat=t=>isNaN(t)?null:t,zat=(t,e,r)=>Kat(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),Vat={12:8589934591,8:2097151},yh=(t,e,r,o)=>o===null?!1:o>Vat[r]||o<0?(Sue.encode(o,t.slice(e,e+r)),!0):(Jat(t,e,r,o),!1),Jat=(t,e,r,o)=>t.write(Xat(o,r),e,r,"ascii"),Xat=(t,e)=>Zat(Math.floor(t).toString(8),e),Zat=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",XU=(t,e,r,o)=>o===null?!1:yh(t,e,r,o.getTime()/1e3),$at=new Array(156).join("\0"),Nd=(t,e,r,o)=>o===null?!1:(t.write(o+$at,e,r,"utf8"),o.length!==Buffer.byteLength(o)||o.length>r);bue.exports=ZU});var ix=_((V4t,xue)=>{"use strict";var elt=jE(),tlt=ve("path"),G1=class{constructor(e,r){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=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new elt({path:("PaxHeader/"+tlt.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,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(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+o}};G1.parse=(t,e,r)=>new G1(rlt(nlt(t),e),r);var rlt=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,nlt=t=>t.replace(/\n$/,"").split(` +`).reduce(ilt,Object.create(null)),ilt=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let o=e.split("="),a=o.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=o.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};xue.exports=G1});var YE=_((J4t,kue)=>{kue.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var sx=_((X4t,Que)=>{"use strict";Que.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit("warn",o.tarCode,r,o)):r instanceof Error?this.emit("error",Object.assign(r,o)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),o))}}});var e3=_(($4t,Fue)=>{"use strict";var ox=["|","<",">","?",":"],$U=ox.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),slt=new Map(ox.map((t,e)=>[t,$U[e]])),olt=new Map($U.map((t,e)=>[t,ox[e]]));Fue.exports={encode:t=>ox.reduce((e,r)=>e.split(r).join(slt.get(r)),t),decode:t=>$U.reduce((e,r)=>e.split(r).join(olt.get(r)),t)}});var t3=_((eUt,Tue)=>{var{isAbsolute:alt,parse:Rue}=ve("path").win32;Tue.exports=t=>{let e="",r=Rue(t);for(;alt(t)||r.root;){let o=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(o.length),e+=o,r=Rue(t)}return[e,t]}});var Nue=_((tUt,Lue)=>{"use strict";Lue.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var A3=_((iUt,Jue)=>{"use strict";var Gue=UE(),jue=ix(),Yue=jE(),aA=ve("fs"),Oue=ve("path"),oA=qE(),llt=YE(),Wue=(t,e)=>e?(t=oA(t).replace(/^\.(\/|$)/,""),llt(e)+"/"+t):oA(t),clt=16*1024*1024,Mue=Symbol("process"),Uue=Symbol("file"),_ue=Symbol("directory"),n3=Symbol("symlink"),Hue=Symbol("hardlink"),j1=Symbol("header"),ax=Symbol("read"),i3=Symbol("lstat"),lx=Symbol("onlstat"),s3=Symbol("onread"),o3=Symbol("onreadlink"),a3=Symbol("openfile"),l3=Symbol("onopenfile"),Eh=Symbol("close"),cx=Symbol("mode"),c3=Symbol("awaitDrain"),r3=Symbol("ondrain"),lA=Symbol("prefix"),que=Symbol("hadError"),Kue=sx(),ult=e3(),zue=t3(),Vue=Nue(),ux=Kue(class extends Gue{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=oA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||clt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=oA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?oA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=zue(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=ult.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=oA(r.absolute||Oue.resolve(this.cwd,e)),this.path===""&&(this.path="./"),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[lx](this.statCache.get(this.absolute)):this[i3]()}emit(e,...r){return e==="error"&&(this[que]=!0),super.emit(e,...r)}[i3](){aA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[lx](r)})}[lx](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=flt(e),this.emit("stat",e),this[Mue]()}[Mue](){switch(this.type){case"File":return this[Uue]();case"Directory":return this[_ue]();case"SymbolicLink":return this[n3]();default:return this.end()}}[cx](e){return Vue(e,this.type==="Directory",this.portable)}[lA](e){return Wue(e,this.prefix)}[j1](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new Yue({path:this[lA](this.path),linkpath:this.type==="Link"?this[lA](this.linkpath):this.linkpath,mode:this[cx](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&&super.write(new jue({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[lA](this.path),linkpath:this.type==="Link"?this[lA](this.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()),super.write(this.header.block)}[_ue](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[j1](),this.end()}[n3](){aA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[o3](r)})}[o3](e){this.linkpath=oA(e),this[j1](),this.end()}[Hue](e){this.type="Link",this.linkpath=oA(Oue.relative(this.cwd,e)),this.stat.size=0,this[j1](),this.end()}[Uue](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[Hue](r)}this.linkCache.set(e,this.absolute)}if(this[j1](),this.stat.size===0)return this.end();this[a3]()}[a3](){aA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[l3](r)})}[l3](e){if(this.fd=e,this[que])return this[Eh]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[ax]()}[ax](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;aA.read(e,r,o,a,n,(u,A)=>{if(u)return this[Eh](()=>this.emit("error",u));this[s3](A)})}[Eh](e){aA.close(this.fd,e)}[s3](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Eh](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Eh](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[r3]())}[c3](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[ax]()}}),u3=class extends ux{[i3](){this[lx](aA.lstatSync(this.absolute))}[n3](){this[o3](aA.readlinkSync(this.absolute))}[a3](){this[l3](aA.openSync(this.absolute,"r"))}[ax](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=aA.readSync(r,o,a,n,u);this[s3](A),e=!1}finally{if(e)try{this[Eh](()=>{})}catch{}}}[c3](e){e()}[Eh](e){aA.closeSync(this.fd),e()}},Alt=Kue(class extends Gue{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=oA(e.path),this.mode=this[cx](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:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=oA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=zue(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new Yue({path:this[lA](this.path),linkpath:this.type==="Link"?this[lA](this.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}),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new jue({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[lA](this.path),linkpath:this.type==="Link"?this[lA](this.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)}[lA](e){return Wue(e,this.prefix)}[cx](e){return Vue(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});ux.Sync=u3;ux.Tar=Alt;var flt=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";Jue.exports=ux});var Ex=_((oUt,nAe)=>{"use strict";var mx=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},plt=UE(),hlt=jU(),glt=rx(),C3=A3(),dlt=C3.Sync,mlt=C3.Tar,ylt=IP(),Xue=Buffer.alloc(1024),px=Symbol("onStat"),Ax=Symbol("ended"),cA=Symbol("queue"),WE=Symbol("current"),Od=Symbol("process"),fx=Symbol("processing"),Zue=Symbol("processJob"),uA=Symbol("jobs"),f3=Symbol("jobDone"),hx=Symbol("addFSEntry"),$ue=Symbol("addTarEntry"),d3=Symbol("stat"),m3=Symbol("readdir"),gx=Symbol("onreaddir"),dx=Symbol("pipe"),eAe=Symbol("entry"),p3=Symbol("entryOpt"),y3=Symbol("writeEntryClass"),rAe=Symbol("write"),h3=Symbol("ondrain"),yx=ve("fs"),tAe=ve("path"),Elt=sx(),g3=qE(),w3=Elt(class extends plt{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=g3(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[y3]=C3,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new hlt.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[h3]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[h3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[cA]=new ylt,this[uA]=0,this.jobs=+e.jobs||4,this[fx]=!1,this[Ax]=!1}[rAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[Ax]=!0,this[Od](),this}write(e){if(this[Ax])throw new Error("write after end");return e instanceof glt?this[$ue](e):this[hx](e),this.flowing}[$ue](e){let r=g3(tAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new mx(e.path,r,!1);o.entry=new mlt(e,this[p3](o)),o.entry.on("end",a=>this[f3](o)),this[uA]+=1,this[cA].push(o)}this[Od]()}[hx](e){let r=g3(tAe.resolve(this.cwd,e));this[cA].push(new mx(e,r)),this[Od]()}[d3](e){e.pending=!0,this[uA]+=1;let r=this.follow?"stat":"lstat";yx[r](e.absolute,(o,a)=>{e.pending=!1,this[uA]-=1,o?this.emit("error",o):this[px](e,a)})}[px](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[Od]()}[m3](e){e.pending=!0,this[uA]+=1,yx.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[uA]-=1,r)return this.emit("error",r);this[gx](e,o)})}[gx](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[Od]()}[Od](){if(!this[fx]){this[fx]=!0;for(let e=this[cA].head;e!==null&&this[uA]this.warn(r,o,a),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,prefix:this.prefix}}[eAe](e){this[uA]+=1;try{return new this[y3](e.path,this[p3](e)).on("end",()=>this[f3](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[h3](){this[WE]&&this[WE].entry&&this[WE].entry.resume()}[dx](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[hx](u+a)});let r=e.entry,o=this.zip;o?r.on("data",a=>{o.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),E3=class extends w3{constructor(e){super(e),this[y3]=dlt}pause(){}resume(){}[d3](e){let r=this.follow?"statSync":"lstatSync";this[px](e,yx[r](e.absolute))}[m3](e,r){this[gx](e,yx.readdirSync(e.absolute))}[dx](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[hx](u+a)}),o?r.on("data",a=>{o.write(a)}):r.on("data",a=>{super[rAe](a)})}};w3.Sync=E3;nAe.exports=w3});var eC=_(W1=>{"use strict";var Clt=UE(),wlt=ve("events").EventEmitter,Qa=ve("fs"),v3=Qa.writev;if(!v3){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;v3=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var ZE=Symbol("_autoClose"),Wc=Symbol("_close"),Y1=Symbol("_ended"),jn=Symbol("_fd"),iAe=Symbol("_finished"),wh=Symbol("_flags"),I3=Symbol("_flush"),D3=Symbol("_handleChunk"),P3=Symbol("_makeBuf"),vx=Symbol("_mode"),Cx=Symbol("_needDrain"),JE=Symbol("_onerror"),$E=Symbol("_onopen"),B3=Symbol("_onread"),zE=Symbol("_onwrite"),Ih=Symbol("_open"),Gf=Symbol("_path"),Md=Symbol("_pos"),AA=Symbol("_queue"),VE=Symbol("_read"),sAe=Symbol("_readSize"),Ch=Symbol("_reading"),wx=Symbol("_remain"),oAe=Symbol("_size"),Ix=Symbol("_write"),KE=Symbol("_writing"),Bx=Symbol("_defaultFlag"),XE=Symbol("_errored"),Dx=class extends Clt{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[XE]=!1,this[jn]=typeof r.fd=="number"?r.fd:null,this[Gf]=e,this[sAe]=r.readSize||16*1024*1024,this[Ch]=!1,this[oAe]=typeof r.size=="number"?r.size:1/0,this[wx]=this[oAe],this[ZE]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[jn]=="number"?this[VE]():this[Ih]()}get fd(){return this[jn]}get path(){return this[Gf]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ih](){Qa.open(this[Gf],"r",(e,r)=>this[$E](e,r))}[$E](e,r){e?this[JE](e):(this[jn]=r,this.emit("open",r),this[VE]())}[P3](){return Buffer.allocUnsafe(Math.min(this[sAe],this[wx]))}[VE](){if(!this[Ch]){this[Ch]=!0;let e=this[P3]();if(e.length===0)return process.nextTick(()=>this[B3](null,0,e));Qa.read(this[jn],e,0,e.length,null,(r,o,a)=>this[B3](r,o,a))}}[B3](e,r,o){this[Ch]=!1,e?this[JE](e):this[D3](r,o)&&this[VE]()}[Wc](){if(this[ZE]&&typeof this[jn]=="number"){let e=this[jn];this[jn]=null,Qa.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[JE](e){this[Ch]=!0,this[Wc](),this.emit("error",e)}[D3](e,r){let o=!1;return this[wx]-=e,e>0&&(o=super.write(ethis[$E](e,r))}[$E](e,r){this[Bx]&&this[wh]==="r+"&&e&&e.code==="ENOENT"?(this[wh]="w",this[Ih]()):e?this[JE](e):(this[jn]=r,this.emit("open",r),this[I3]())}end(e,r){return e&&this.write(e,r),this[Y1]=!0,!this[KE]&&!this[AA].length&&typeof this[jn]=="number"&&this[zE](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[Y1]?(this.emit("error",new Error("write() after end()")),!1):this[jn]===null||this[KE]||this[AA].length?(this[AA].push(e),this[Cx]=!0,!1):(this[KE]=!0,this[Ix](e),!0)}[Ix](e){Qa.write(this[jn],e,0,e.length,this[Md],(r,o)=>this[zE](r,o))}[zE](e,r){e?this[JE](e):(this[Md]!==null&&(this[Md]+=r),this[AA].length?this[I3]():(this[KE]=!1,this[Y1]&&!this[iAe]?(this[iAe]=!0,this[Wc](),this.emit("finish")):this[Cx]&&(this[Cx]=!1,this.emit("drain"))))}[I3](){if(this[AA].length===0)this[Y1]&&this[zE](null,0);else if(this[AA].length===1)this[Ix](this[AA].pop());else{let e=this[AA];this[AA]=[],v3(this[jn],e,this[Md],(r,o)=>this[zE](r,o))}}[Wc](){if(this[ZE]&&typeof this[jn]=="number"){let e=this[jn];this[jn]=null,Qa.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},b3=class extends Px{[Ih](){let e;if(this[Bx]&&this[wh]==="r+")try{e=Qa.openSync(this[Gf],this[wh],this[vx])}catch(r){if(r.code==="ENOENT")return this[wh]="w",this[Ih]();throw r}else e=Qa.openSync(this[Gf],this[wh],this[vx]);this[$E](null,e)}[Wc](){if(this[ZE]&&typeof this[jn]=="number"){let e=this[jn];this[jn]=null,Qa.closeSync(e),this.emit("close")}}[Ix](e){let r=!0;try{this[zE](null,Qa.writeSync(this[jn],e,0,e.length,this[Md])),r=!1}finally{if(r)try{this[Wc]()}catch{}}}};W1.ReadStream=Dx;W1.ReadStreamSync=S3;W1.WriteStream=Px;W1.WriteStreamSync=b3});var Rx=_((cUt,pAe)=>{"use strict";var Ilt=sx(),Blt=jE(),vlt=ve("events"),Dlt=IP(),Plt=1024*1024,Slt=rx(),aAe=ix(),blt=jU(),x3=Buffer.from([31,139]),Zl=Symbol("state"),Ud=Symbol("writeEntry"),jf=Symbol("readEntry"),k3=Symbol("nextEntry"),lAe=Symbol("processEntry"),$l=Symbol("extendedHeader"),K1=Symbol("globalExtendedHeader"),Bh=Symbol("meta"),cAe=Symbol("emitMeta"),fi=Symbol("buffer"),Yf=Symbol("queue"),_d=Symbol("ended"),uAe=Symbol("emittedEnd"),Hd=Symbol("emit"),Fa=Symbol("unzip"),Sx=Symbol("consumeChunk"),bx=Symbol("consumeChunkSub"),Q3=Symbol("consumeBody"),AAe=Symbol("consumeMeta"),fAe=Symbol("consumeHeader"),xx=Symbol("consuming"),F3=Symbol("bufferConcat"),R3=Symbol("maybeEnd"),z1=Symbol("writing"),vh=Symbol("aborted"),kx=Symbol("onDone"),qd=Symbol("sawValidEntry"),Qx=Symbol("sawNullBlock"),Fx=Symbol("sawEOF"),xlt=t=>!0;pAe.exports=Ilt(class extends vlt{constructor(e){e=e||{},super(e),this.file=e.file||"",this[qd]=null,this.on(kx,r=>{(this[Zl]==="begin"||this[qd]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(kx,e.ondone):this.on(kx,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||Plt,this.filter=typeof e.filter=="function"?e.filter:xlt,this.writable=!0,this.readable=!1,this[Yf]=new Dlt,this[fi]=null,this[jf]=null,this[Ud]=null,this[Zl]="begin",this[Bh]="",this[$l]=null,this[K1]=null,this[_d]=!1,this[Fa]=null,this[vh]=!1,this[Qx]=!1,this[Fx]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[fAe](e,r){this[qd]===null&&(this[qd]=!1);let o;try{o=new Blt(e,r,this[$l],this[K1])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(o.nullBlock)this[Qx]?(this[Fx]=!0,this[Zl]==="begin"&&(this[Zl]="header"),this[Hd]("eof")):(this[Qx]=!0,this[Hd]("nullBlock"));else if(this[Qx]=!1,!o.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:o});else if(!o.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:o});else{let n=this[Ud]=new Slt(o,this[$l],this[K1]);if(!this[qd])if(n.remain){let u=()=>{n.invalid||(this[qd]=!0)};n.on("end",u)}else this[qd]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Hd]("ignoredEntry",n),this[Zl]="ignore",n.resume()):n.size>0&&(this[Bh]="",n.on("data",u=>this[Bh]+=u),this[Zl]="meta"):(this[$l]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Hd]("ignoredEntry",n),this[Zl]=n.remain?"ignore":"header",n.resume()):(n.remain?this[Zl]="body":(this[Zl]="header",n.end()),this[jf]?this[Yf].push(n):(this[Yf].push(n),this[k3]())))}}}[lAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[jf]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",o=>this[k3]()),r=!1)):(this[jf]=null,r=!1),r}[k3](){do;while(this[lAe](this[Yf].shift()));if(!this[Yf].length){let e=this[jf];!e||e.flowing||e.size===e.remain?this[z1]||this.emit("drain"):e.once("drain",o=>this.emit("drain"))}}[Q3](e,r){let o=this[Ud],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[Zl]="header",this[Ud]=null,o.end()),n.length}[AAe](e,r){let o=this[Ud],a=this[Q3](e,r);return this[Ud]||this[cAe](o),a}[Hd](e,r,o){!this[Yf].length&&!this[jf]?this.emit(e,r,o):this[Yf].push([e,r,o])}[cAe](e){switch(this[Hd]("meta",this[Bh]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[$l]=aAe.parse(this[Bh],this[$l],!1);break;case"GlobalExtendedHeader":this[K1]=aAe.parse(this[Bh],this[K1],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[$l]=this[$l]||Object.create(null),this[$l].path=this[Bh].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[$l]=this[$l]||Object.create(null),this[$l].linkpath=this[Bh].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[vh]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[vh])return;if(this[Fa]===null&&e){if(this[fi]&&(e=Buffer.concat([this[fi],e]),this[fi]=null),e.lengththis[Sx](n)),this[Fa].on("error",n=>this.abort(n)),this[Fa].on("end",n=>{this[_d]=!0,this[Sx]()}),this[z1]=!0;let a=this[Fa][o?"end":"write"](e);return this[z1]=!1,a}}this[z1]=!0,this[Fa]?this[Fa].write(e):this[Sx](e),this[z1]=!1;let r=this[Yf].length?!1:this[jf]?this[jf].flowing:!0;return!r&&!this[Yf].length&&this[jf].once("drain",o=>this.emit("drain")),r}[F3](e){e&&!this[vh]&&(this[fi]=this[fi]?Buffer.concat([this[fi],e]):e)}[R3](){if(this[_d]&&!this[uAe]&&!this[vh]&&!this[xx]){this[uAe]=!0;let e=this[Ud];if(e&&e.blockRemain){let r=this[fi]?this[fi].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[fi]&&e.write(this[fi]),e.end()}this[Hd](kx)}}[Sx](e){if(this[xx])this[F3](e);else if(!e&&!this[fi])this[R3]();else{if(this[xx]=!0,this[fi]){this[F3](e);let r=this[fi];this[fi]=null,this[bx](r)}else this[bx](e);for(;this[fi]&&this[fi].length>=512&&!this[vh]&&!this[Fx];){let r=this[fi];this[fi]=null,this[bx](r)}this[xx]=!1}(!this[fi]||this[_d])&&this[R3]()}[bx](e){let r=0,o=e.length;for(;r+512<=o&&!this[vh]&&!this[Fx];)switch(this[Zl]){case"begin":case"header":this[fAe](e,r),r+=512;break;case"ignore":case"body":r+=this[Q3](e,r);break;case"meta":r+=this[AAe](e,r);break;default:throw new Error("invalid state: "+this[Zl])}r{"use strict";var klt=OE(),gAe=Rx(),tC=ve("fs"),Qlt=eC(),hAe=ve("path"),T3=YE();mAe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=klt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Rlt(o,e),o.noResume||Flt(o),o.file&&o.sync?Tlt(o):o.file?Llt(o,r):dAe(o)};var Flt=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Rlt=(t,e)=>{let r=new Map(e.map(n=>[T3(n),!0])),o=t.filter,a=(n,u)=>{let A=u||hAe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(hAe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(T3(n)):n=>a(T3(n))},Tlt=t=>{let e=dAe(t),r=t.file,o=!0,a;try{let n=tC.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size{let r=new gAe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("end",u),tC.stat(a,(p,h)=>{if(p)A(p);else{let E=new Qlt.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},dAe=t=>new gAe(t)});var BAe=_((AUt,IAe)=>{"use strict";var Nlt=OE(),Lx=Ex(),yAe=eC(),EAe=Tx(),CAe=ve("path");IAe.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let o=Nlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return o.file&&o.sync?Olt(o,e):o.file?Mlt(o,e,r):o.sync?Ult(o,e):_lt(o,e)};var Olt=(t,e)=>{let r=new Lx.Sync(t),o=new yAe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),wAe(r,e)},Mlt=(t,e,r)=>{let o=new Lx(t),a=new yAe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on("error",A),a.on("close",u),o.on("error",A)});return L3(o,e),r?n.then(r,r):n},wAe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?EAe({file:CAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},L3=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return EAe({file:CAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>L3(t,e));t.add(r)}t.end()},Ult=(t,e)=>{let r=new Lx.Sync(t);return wAe(r,e),r},_lt=(t,e)=>{let r=new Lx(t);return L3(r,e),r}});var N3=_((fUt,kAe)=>{"use strict";var Hlt=OE(),vAe=Ex(),fl=ve("fs"),DAe=eC(),PAe=Tx(),SAe=ve("path"),bAe=jE();kAe.exports=(t,e,r)=>{let o=Hlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),o.sync?qlt(o,e):jlt(o,e,r)};var qlt=(t,e)=>{let r=new vAe.Sync(t),o=!0,a,n;try{try{a=fl.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=fl.openSync(t.file,"w+");else throw p}let u=fl.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;nu.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,Glt(t,r,n,a,e)}finally{if(o)try{fl.closeSync(a)}catch{}}},Glt=(t,e,r,o,a)=>{let n=new DAe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),Ylt(e,a)},jlt=(t,e,r)=>{e=Array.from(e);let o=new vAe(t),a=(u,A,p)=>{let h=(C,R)=>{C?fl.close(u,N=>p(C)):p(null,R)},E=0;if(A===0)return h(null,0);let I=0,v=Buffer.alloc(512),x=(C,R)=>{if(C)return h(C);if(I+=R,I<512&&R)return fl.read(u,v,I,v.length-I,E+I,x);if(E===0&&v[0]===31&&v[1]===139)return h(new Error("cannot append to compressed archives"));if(I<512)return h(null,E);let N=new bAe(v);if(!N.cksumValid)return h(null,E);let U=512*Math.ceil(N.size/512);if(E+U+512>A||(E+=U+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(N.path,N.mtime),I=0,fl.read(u,v,0,512,E,x)};fl.read(u,v,0,512,E,x)},n=new Promise((u,A)=>{o.on("error",A);let p="r+",h=(E,I)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",fl.open(t.file,p,h);if(E)return A(E);fl.fstat(I,(v,x)=>{if(v)return fl.close(I,()=>A(v));a(I,x.size,(C,R)=>{if(C)return A(C);let N=new DAe.WriteStream(t.file,{fd:I,start:R});o.pipe(N),N.on("error",A),N.on("close",u),xAe(o,e)})})};fl.open(t.file,p,h)});return r?n.then(r,r):n},Ylt=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?PAe({file:SAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},xAe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return PAe({file:SAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>xAe(t,e));t.add(r)}t.end()}});var FAe=_((pUt,QAe)=>{"use strict";var Wlt=OE(),Klt=N3();QAe.exports=(t,e,r)=>{let o=Wlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),zlt(o),Klt(o,e,r)};var zlt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var LAe=_((hUt,TAe)=>{var{promisify:RAe}=ve("util"),Dh=ve("fs"),Vlt=t=>{if(!t)t={mode:511,fs:Dh};else if(typeof t=="object")t={mode:511,fs:Dh,...t};else if(typeof t=="number")t={mode:t,fs:Dh};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Dh};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Dh.mkdir,t.mkdirAsync=RAe(t.mkdir),t.stat=t.stat||t.fs.stat||Dh.stat,t.statAsync=RAe(t.stat),t.statSync=t.statSync||t.fs.statSync||Dh.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Dh.mkdirSync,t};TAe.exports=Vlt});var OAe=_((gUt,NAe)=>{var Jlt=process.platform,{resolve:Xlt,parse:Zlt}=ve("path"),$lt=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=Xlt(t),Jlt==="win32"){let e=/[*|"<>?:]/,{root:r}=Zlt(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};NAe.exports=$lt});var qAe=_((dUt,HAe)=>{var{dirname:MAe}=ve("path"),UAe=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code==="ENOENT"?UAe(t,MAe(e),e):void 0),_Ae=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code==="ENOENT"?_Ae(t,MAe(e),e):void 0}};HAe.exports={findMade:UAe,findMadeSync:_Ae}});var U3=_((mUt,jAe)=>{var{dirname:GAe}=ve("path"),O3=(t,e,r)=>{e.recursive=!1;let o=GAe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return O3(o,e).then(n=>O3(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},M3=(t,e,r)=>{let o=GAe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return M3(t,e,M3(o,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};jAe.exports={mkdirpManual:O3,mkdirpManualSync:M3}});var KAe=_((yUt,WAe)=>{var{dirname:YAe}=ve("path"),{findMade:ect,findMadeSync:tct}=qAe(),{mkdirpManual:rct,mkdirpManualSync:nct}=U3(),ict=(t,e)=>(e.recursive=!0,YAe(t)===t?e.mkdirAsync(t,e):ect(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code==="ENOENT")return rct(t,e);throw a}))),sct=(t,e)=>{if(e.recursive=!0,YAe(t)===t)return e.mkdirSync(t,e);let o=tct(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code==="ENOENT")return nct(t,e);throw a}};WAe.exports={mkdirpNative:ict,mkdirpNativeSync:sct}});var XAe=_((EUt,JAe)=>{var zAe=ve("fs"),oct=process.version,_3=oct.replace(/^v/,"").split("."),VAe=+_3[0]>10||+_3[0]==10&&+_3[1]>=12,act=VAe?t=>t.mkdir===zAe.mkdir:()=>!1,lct=VAe?t=>t.mkdirSync===zAe.mkdirSync:()=>!1;JAe.exports={useNative:act,useNativeSync:lct}});var nfe=_((CUt,rfe)=>{var rC=LAe(),nC=OAe(),{mkdirpNative:ZAe,mkdirpNativeSync:$Ae}=KAe(),{mkdirpManual:efe,mkdirpManualSync:tfe}=U3(),{useNative:cct,useNativeSync:uct}=XAe(),iC=(t,e)=>(t=nC(t),e=rC(e),cct(e)?ZAe(t,e):efe(t,e)),Act=(t,e)=>(t=nC(t),e=rC(e),uct(e)?$Ae(t,e):tfe(t,e));iC.sync=Act;iC.native=(t,e)=>ZAe(nC(t),rC(e));iC.manual=(t,e)=>efe(nC(t),rC(e));iC.nativeSync=(t,e)=>$Ae(nC(t),rC(e));iC.manualSync=(t,e)=>tfe(nC(t),rC(e));rfe.exports=iC});var ufe=_((wUt,cfe)=>{"use strict";var ec=ve("fs"),Gd=ve("path"),fct=ec.lchown?"lchown":"chown",pct=ec.lchownSync?"lchownSync":"chownSync",sfe=ec.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),ife=(t,e,r)=>{try{return ec[pct](t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},hct=(t,e,r)=>{try{return ec.chownSync(t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},gct=sfe?(t,e,r,o)=>a=>{!a||a.code!=="EISDIR"?o(a):ec.chown(t,e,r,o)}:(t,e,r,o)=>o,H3=sfe?(t,e,r)=>{try{return ife(t,e,r)}catch(o){if(o.code!=="EISDIR")throw o;hct(t,e,r)}}:(t,e,r)=>ife(t,e,r),dct=process.version,ofe=(t,e,r)=>ec.readdir(t,e,r),mct=(t,e)=>ec.readdirSync(t,e);/^v4\./.test(dct)&&(ofe=(t,e,r)=>ec.readdir(t,r));var Nx=(t,e,r,o)=>{ec[fct](t,e,r,gct(t,e,r,a=>{o(a&&a.code!=="ENOENT"?a:null)}))},afe=(t,e,r,o,a)=>{if(typeof e=="string")return ec.lstat(Gd.resolve(t,e),(n,u)=>{if(n)return a(n.code!=="ENOENT"?n:null);u.name=e,afe(t,u,r,o,a)});if(e.isDirectory())q3(Gd.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Gd.resolve(t,e.name);Nx(u,r,o,a)});else{let n=Gd.resolve(t,e.name);Nx(n,r,o,a)}},q3=(t,e,r,o)=>{ofe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return o();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return o(a)}if(a||!n.length)return Nx(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return Nx(t,e,r,o)}};n.forEach(h=>afe(t,h,e,r,p))})},yct=(t,e,r,o)=>{if(typeof e=="string")try{let a=ec.lstatSync(Gd.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&lfe(Gd.resolve(t,e.name),r,o),H3(Gd.resolve(t,e.name),r,o)},lfe=(t,e,r)=>{let o;try{o=mct(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return H3(t,e,r);throw a}return o&&o.length&&o.forEach(a=>yct(t,a,e,r)),H3(t,e,r)};cfe.exports=q3;q3.sync=lfe});var hfe=_((IUt,G3)=>{"use strict";var Afe=nfe(),tc=ve("fs"),Ox=ve("path"),ffe=ufe(),Kc=qE(),Mx=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},Ux=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},_x=(t,e)=>t.get(Kc(e)),V1=(t,e,r)=>t.set(Kc(e),r),Ect=(t,e)=>{tc.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new Ux(t,r&&r.code||"ENOTDIR")),e(r)})};G3.exports=(t,e,r)=>{t=Kc(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u=="number"&&typeof A=="number"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,I=e.cache,v=Kc(e.cwd),x=(N,U)=>{N?r(N):(V1(I,t,!0),U&&p?ffe(U,u,A,V=>x(V)):n?tc.chmod(t,a,r):r())};if(I&&_x(I,t)===!0)return x();if(t===v)return Ect(t,x);if(h)return Afe(t,{mode:a}).then(N=>x(null,N),x);let R=Kc(Ox.relative(v,t)).split("/");Hx(v,R,a,I,E,v,null,x)};var Hx=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=Kc(Ox.resolve(t+"/"+p));if(_x(o,h))return Hx(h,e,r,o,a,n,u,A);tc.mkdir(h,r,pfe(h,e,r,o,a,n,u,A))},pfe=(t,e,r,o,a,n,u,A)=>p=>{p?tc.lstat(t,(h,E)=>{if(h)h.path=h.path&&Kc(h.path),A(h);else if(E.isDirectory())Hx(t,e,r,o,a,n,u,A);else if(a)tc.unlink(t,I=>{if(I)return A(I);tc.mkdir(t,r,pfe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new Mx(t,t+"/"+e.join("/")));A(p)}}):(u=u||t,Hx(t,e,r,o,a,n,u,A))},Cct=t=>{let e=!1,r="ENOTDIR";try{e=tc.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new Ux(t,r)}};G3.exports.sync=(t,e)=>{t=Kc(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n=="number"&&typeof u=="number"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,I=Kc(e.cwd),v=N=>{V1(E,t,!0),N&&A&&ffe.sync(N,n,u),a&&tc.chmodSync(t,o)};if(E&&_x(E,t)===!0)return v();if(t===I)return Cct(I),v();if(p)return v(Afe.sync(t,o));let C=Kc(Ox.relative(I,t)).split("/"),R=null;for(let N=C.shift(),U=I;N&&(U+="/"+N);N=C.shift())if(U=Kc(Ox.resolve(U)),!_x(E,U))try{tc.mkdirSync(U,o),R=R||U,V1(E,U,!0)}catch{let te=tc.lstatSync(U);if(te.isDirectory()){V1(E,U,!0);continue}else if(h){tc.unlinkSync(U),tc.mkdirSync(U,o),R=R||U,V1(E,U,!0);continue}else if(te.isSymbolicLink())return new Mx(U,U+"/"+C.join("/"))}return v(R)}});var Y3=_((BUt,gfe)=>{var j3=Object.create(null),{hasOwnProperty:wct}=Object.prototype;gfe.exports=t=>(wct.call(j3,t)||(j3[t]=t.normalize("NFKD")),j3[t])});var Efe=_((vUt,yfe)=>{var dfe=ve("assert"),Ict=Y3(),Bct=YE(),{join:mfe}=ve("path"),vct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Dct=vct==="win32";yfe.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((I,v)=>(I.length&&(v=mfe(I[I.length-1],v)),I.push(v||"/"),I),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(I=>t.get(I)),dirs:[...E.dirs].map(I=>t.get(I))}},n=h=>{let{paths:E,dirs:I}=a(h);return E.every(v=>v[0]===h)&&I.every(v=>v[0]instanceof Set&&v[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:I}=e.get(h),v=new Set;return E.forEach(x=>{let C=t.get(x);dfe.equal(C[0],h),C.length===1?t.delete(x):(C.shift(),typeof C[0]=="function"?v.add(C[0]):C[0].forEach(R=>v.add(R)))}),I.forEach(x=>{let C=t.get(x);dfe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(x):C[0].size===1?(C.shift(),v.add(C[0])):C[0].delete(h)}),o.delete(h),v.forEach(x=>u(x)),!0};return{check:n,reserve:(h,E)=>{h=Dct?["win32 parallelization disabled"]:h.map(v=>Ict(Bct(mfe(v))).toLowerCase());let I=new Set(h.map(v=>r(v)).reduce((v,x)=>v.concat(x)));return e.set(E,{dirs:I,paths:h}),h.forEach(v=>{let x=t.get(v);x?x.push(E):t.set(v,[E])}),I.forEach(v=>{let x=t.get(v);x?x[x.length-1]instanceof Set?x[x.length-1].add(E):x.push(new Set([E])):t.set(v,[new Set([E])])}),u(E)}}}});var Ife=_((DUt,wfe)=>{var Pct=process.platform,Sct=Pct==="win32",bct=global.__FAKE_TESTING_FS__||ve("fs"),{O_CREAT:xct,O_TRUNC:kct,O_WRONLY:Qct,UV_FS_O_FILEMAP:Cfe=0}=bct.constants,Fct=Sct&&!!Cfe,Rct=512*1024,Tct=Cfe|kct|xct|Qct;wfe.exports=Fct?t=>t"w"});var e_=_((PUt,Nfe)=>{"use strict";var Lct=ve("assert"),Nct=Rx(),vn=ve("fs"),Oct=eC(),Wf=ve("path"),Rfe=hfe(),Bfe=e3(),Mct=Efe(),Uct=t3(),pl=qE(),_ct=YE(),Hct=Y3(),vfe=Symbol("onEntry"),z3=Symbol("checkFs"),Dfe=Symbol("checkFs2"),jx=Symbol("pruneCache"),V3=Symbol("isReusable"),rc=Symbol("makeFs"),J3=Symbol("file"),X3=Symbol("directory"),Yx=Symbol("link"),Pfe=Symbol("symlink"),Sfe=Symbol("hardlink"),bfe=Symbol("unsupported"),xfe=Symbol("checkPath"),Ph=Symbol("mkdir"),To=Symbol("onError"),qx=Symbol("pending"),kfe=Symbol("pend"),sC=Symbol("unpend"),W3=Symbol("ended"),K3=Symbol("maybeClose"),Z3=Symbol("skip"),J1=Symbol("doChown"),X1=Symbol("uid"),Z1=Symbol("gid"),$1=Symbol("checkedCwd"),Tfe=ve("crypto"),Lfe=Ife(),qct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,e2=qct==="win32",Gct=(t,e)=>{if(!e2)return vn.unlink(t,e);let r=t+".DELETE."+Tfe.randomBytes(16).toString("hex");vn.rename(t,r,o=>{if(o)return e(o);vn.unlink(r,e)})},jct=t=>{if(!e2)return vn.unlinkSync(t);let e=t+".DELETE."+Tfe.randomBytes(16).toString("hex");vn.renameSync(t,e),vn.unlinkSync(e)},Qfe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Ffe=t=>Hct(_ct(pl(t))).toLowerCase(),Yct=(t,e)=>{e=Ffe(e);for(let r of t.keys()){let o=Ffe(r);(o===e||o.indexOf(e+"/")===0)&&t.delete(r)}},Wct=t=>{for(let e of t.keys())t.delete(e)},t2=class extends Nct{constructor(e){if(e||(e={}),e.ondone=r=>{this[W3]=!0,this[K3]()},super(e),this[$1]=!1,this.reservations=Mct(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[qx]=0,this[W3]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")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;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0: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=e.forceChown===!0,this.win32=!!e.win32||e2,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=pl(Wf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[vfe](r))}warn(e,r,o={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(o.recoverable=!1),super.warn(e,r,o)}[K3](){this[W3]&&this[qx]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[xfe](e){if(this.strip){let r=pl(e.path).split("/");if(r.length=this.strip)e.linkpath=o.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=pl(e.path),o=r.split("/");if(o.includes("..")||e2&&/^[a-z]:\.\.$/i.test(o[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=Uct(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Wf.isAbsolute(e.path)?e.absolute=pl(Wf.resolve(e.path)):e.absolute=pl(Wf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:pl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Wf.win32.parse(e.absolute);e.absolute=r+Bfe.encode(e.absolute.substr(r.length));let{root:o}=Wf.win32.parse(e.path);e.path=o+Bfe.encode(e.path.substr(o.length))}return!0}[vfe](e){if(!this[xfe](e))return e.resume();switch(Lct.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[z3](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[bfe](e)}}[To](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[sC](),r.resume())}[Ph](e,r,o){Rfe(pl(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:r,noChmod:this.noChmod},o)}[J1](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[X1](e){return Qfe(this.uid,e.uid,this.processUid)}[Z1](e){return Qfe(this.gid,e.gid,this.processGid)}[J3](e,r){let o=e.mode&4095||this.fmode,a=new Oct.WriteStream(e.absolute,{flags:Lfe(e.size),mode:o,autoClose:!1});a.on("error",p=>{a.fd&&vn.close(a.fd,()=>{}),a.write=()=>!0,this[To](p,e),r()});let n=1,u=p=>{if(p){a.fd&&vn.close(a.fd,()=>{}),this[To](p,e),r();return}--n===0&&vn.close(a.fd,h=>{h?this[To](h,e):this[sC](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let I=e.atime||new Date,v=e.mtime;vn.futimes(E,I,v,x=>x?vn.utimes(h,I,v,C=>u(C&&x)):u())}if(this[J1](e)){n++;let I=this[X1](e),v=this[Z1](e);vn.fchown(E,I,v,x=>x?vn.chown(h,I,v,C=>u(C&&x)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",p=>{this[To](p,e),r()}),e.pipe(A)),A.pipe(a)}[X3](e,r){let o=e.mode&4095||this.dmode;this[Ph](e.absolute,o,a=>{if(a){this[To](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[sC](),e.resume())};e.mtime&&!this.noMtime&&(n++,vn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[J1](e)&&(n++,vn.chown(e.absolute,this[X1](e),this[Z1](e),u)),u()})}[bfe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Pfe](e,r){this[Yx](e,e.linkpath,"symlink",r)}[Sfe](e,r){let o=pl(Wf.resolve(this.cwd,e.linkpath));this[Yx](e,o,"link",r)}[kfe](){this[qx]++}[sC](){this[qx]--,this[K3]()}[Z3](e){this[sC](),e.resume()}[V3](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!e2}[z3](e){this[kfe]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[Dfe](e,o))}[jx](e){e.type==="SymbolicLink"?Wct(this.dirCache):e.type!=="Directory"&&Yct(this.dirCache,e.absolute)}[Dfe](e,r){this[jx](e);let o=A=>{this[jx](e),r(A)},a=()=>{this[Ph](this.cwd,this.dmode,A=>{if(A){this[To](A,e),o();return}this[$1]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=pl(Wf.dirname(e.absolute));if(A!==this.cwd)return this[Ph](A,this.dmode,p=>{if(p){this[To](p,e),o();return}u()})}u()},u=()=>{vn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[Z3](e),o();return}if(A||this[V3](e,p))return this[rc](null,e,o);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=I=>this[rc](I,e,o);return h?vn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return vn.rmdir(e.absolute,h=>this[rc](h,e,o))}if(e.absolute===this.cwd)return this[rc](null,e,o);Gct(e.absolute,h=>this[rc](h,e,o))})};this[$1]?n():a()}[rc](e,r,o){if(e){this[To](e,r),o();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[J3](r,o);case"Link":return this[Sfe](r,o);case"SymbolicLink":return this[Pfe](r,o);case"Directory":case"GNUDumpDir":return this[X3](r,o)}}[Yx](e,r,o,a){vn[o](r,e.absolute,n=>{n?this[To](n,e):(this[sC](),e.resume()),a()})}},Gx=t=>{try{return[null,t()]}catch(e){return[e,null]}},$3=class extends t2{[rc](e,r){return super[rc](e,r,()=>{})}[z3](e){if(this[jx](e),!this[$1]){let n=this[Ph](this.cwd,this.dmode);if(n)return this[To](n,e);this[$1]=!0}if(e.absolute!==this.cwd){let n=pl(Wf.dirname(e.absolute));if(n!==this.cwd){let u=this[Ph](n,this.dmode);if(u)return this[To](u,e)}}let[r,o]=Gx(()=>vn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[Z3](e);if(r||this[V3](e,o))return this[rc](null,e);if(o.isDirectory()){if(e.type==="Directory"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?Gx(()=>{vn.chmodSync(e.absolute,e.mode)}):[];return this[rc](A,e)}let[n]=Gx(()=>vn.rmdirSync(e.absolute));this[rc](n,e)}let[a]=e.absolute===this.cwd?[]:Gx(()=>jct(e.absolute));this[rc](a,e)}[J3](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{vn.closeSync(n)}catch(h){p=h}(A||p)&&this[To](A||p,e),r()},n;try{n=vn.openSync(e.absolute,Lfe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on("error",A=>this[To](A,e)),e.pipe(u)),u.on("data",A=>{try{vn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on("end",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{vn.futimesSync(n,h,E)}catch(I){try{vn.utimesSync(e.absolute,h,E)}catch{p=I}}}if(this[J1](e)){let h=this[X1](e),E=this[Z1](e);try{vn.fchownSync(n,h,E)}catch(I){try{vn.chownSync(e.absolute,h,E)}catch{p=p||I}}}a(p)})}[X3](e,r){let o=e.mode&4095||this.dmode,a=this[Ph](e.absolute,o);if(a){this[To](a,e),r();return}if(e.mtime&&!this.noMtime)try{vn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[J1](e))try{vn.chownSync(e.absolute,this[X1](e),this[Z1](e))}catch{}r(),e.resume()}[Ph](e,r){try{return Rfe.sync(pl(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:r})}catch(o){return o}}[Yx](e,r,o,a){try{vn[o+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[To](n,e)}}};t2.Sync=$3;Nfe.exports=t2});var Hfe=_((SUt,_fe)=>{"use strict";var Kct=OE(),Wx=e_(),Mfe=ve("fs"),Ufe=eC(),Ofe=ve("path"),t_=YE();_fe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Kct(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&zct(o,e),o.file&&o.sync?Vct(o):o.file?Jct(o,r):o.sync?Xct(o):Zct(o)};var zct=(t,e)=>{let r=new Map(e.map(n=>[t_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||Ofe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(Ofe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(t_(n)):n=>a(t_(n))},Vct=t=>{let e=new Wx.Sync(t),r=t.file,o=Mfe.statSync(r),a=t.maxReadSize||16*1024*1024;new Ufe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},Jct=(t,e)=>{let r=new Wx(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("close",u),Mfe.stat(a,(p,h)=>{if(p)A(p);else{let E=new Ufe.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},Xct=t=>new Wx.Sync(t),Zct=t=>new Wx(t)});var qfe=_(us=>{"use strict";us.c=us.create=BAe();us.r=us.replace=N3();us.t=us.list=Tx();us.u=us.update=FAe();us.x=us.extract=Hfe();us.Pack=Ex();us.Unpack=e_();us.Parse=Rx();us.ReadEntry=rx();us.WriteEntry=A3();us.Header=jE();us.Pax=ix();us.types=KU()});var r_,Gfe,Sh,r2,n2,jfe=Et(()=>{r_=$e(sd()),Gfe=ve("worker_threads"),Sh=Symbol("kTaskInfo"),r2=class{constructor(e,r){this.fn=e;this.limit=(0,r_.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},n2=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,r_.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let o=this.workers.pop();o?o.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Gfe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[Sh])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[Sh].resolve(r),e[Sh]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{e[Sh]?.reject(r),e[Sh]=null}),e.on("exit",r=>{r!==0&&e[Sh]?.reject(new Error(`Worker exited with code ${r}`)),e[Sh]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[Sh]={resolve:o,reject:a},r.postMessage(e)})})}}});var Wfe=_((QUt,Yfe)=>{var n_;Yfe.exports.getContent=()=>(typeof n_>"u"&&(n_=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),n_)});var Xi={};zt(Xi,{convertToZip:()=>rut,convertToZipWorker:()=>o_,extractArchiveTo:()=>Xfe,getDefaultTaskPool:()=>Vfe,getTaskPoolForConfiguration:()=>Jfe,makeArchiveFromDirectory:()=>tut});function $ct(t,e){switch(t){case"async":return new r2(o_,{poolSize:e});case"workers":return new n2((0,s_.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function Vfe(){return typeof i_>"u"&&(i_=$ct("workers",Vi.availableParallelism())),i_}function Jfe(t){return typeof t>"u"?Vfe():al(eut,t,()=>{let e=t.get("taskPoolMode"),r=t.get("taskPoolConcurrency");switch(e){case"async":return new r2(o_,{poolSize:r});case"workers":return new n2((0,s_.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function o_(t){let{tmpFile:e,tgz:r,compressionLevel:o,extractBufferOpts:a}=t,n=new Ji(e,{create:!0,level:o,stats:Ea.makeDefaultStats()}),u=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await Xfe(u,n,a),n.saveAndClose(),e}async function tut(t,{baseFs:e=new Tn,prefixPath:r=Bt.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new Ji(null,{level:o});else{let A=await oe.mktempPromise(),p=z.join(A,"archive.zip");n=new Ji(p,{create:!0,level:o})}let u=z.resolve(Bt.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function rut(t,e={}){let r=await oe.mktempPromise(),o=z.join(r,"archive.zip"),a=e.compressionLevel??e.configuration?.get("compressionLevel")??"mixed",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??Jfe(e.configuration)).run({tmpFile:o,tgz:t,compressionLevel:a,extractBufferOpts:n}),new Ji(o,{level:e.compressionLevel})}async function*nut(t){let e=new zfe.default.Parse,r=new Kfe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",o=>{r.write(o)}),e.on("error",o=>{r.destroy(o)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function Xfe(t,e,{stripComponents:r=0,prefixPath:o=Bt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let u=n.path.split(/\//g);return!!(u.some(A=>A==="..")||u.length<=r)}for await(let n of nut(t)){if(a(n))continue;let u=z.normalize(le.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(u.length<=r)continue;let A=u.slice(r).join("/"),p=z.join(o,A),h=420;switch((n.type==="Directory"||((n.mode??0)&73)!==0)&&(h|=73),n.type){case"Directory":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.writeFileSync(p,await zy(n),{mode:h}),e.utimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(z.dirname(p),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,vi.SAFE_TIME,vi.SAFE_TIME);break}}return e}var Kfe,zfe,s_,i_,eut,Zfe=Et(()=>{Ye();Pt();iA();Kfe=ve("stream"),zfe=$e(qfe());jfe();Gl();s_=$e(Wfe());eut=new WeakMap});var epe=_((a_,$fe)=>{(function(t,e){typeof a_=="object"?$fe.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(a_,function(){function t(a,n){var u=n?"\u2514":"\u251C";return a?u+="\u2500 ":u+="\u2500\u2500\u2510",u}function e(a,n){var u=[];for(var A in a)!a.hasOwnProperty(A)||n&&typeof a[A]=="function"||u.push(A);return u}function r(a,n,u,A,p,h,E){var I="",v=0,x,C,R=A.slice(0);if(R.push([n,u])&&A.length>0&&(A.forEach(function(U,V){V>0&&(I+=(U[1]?" ":"\u2502")+" "),!C&&U[0]===n&&(C=!0)}),I+=t(a,u)+a,p&&(typeof n!="object"||n instanceof Date)&&(I+=": "+n),C&&(I+=" (circular ref.)"),E(I)),!C&&typeof n=="object"){var N=e(n,h);N.forEach(function(U){x=++v===N.length,r(U,n[U],x,R,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!="function"?u:!1;r(".",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A="";return r(".",a,!1,[],n,u,function(p){A+=p+` +`}),A},o})});var $s={};zt($s,{emitList:()=>iut,emitTree:()=>ipe,treeNodeToJson:()=>npe,treeNodeToTreeify:()=>rpe});function rpe(t,{configuration:e}){let r={},o=0,a=(n,u)=>{let A=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of A){if(!h)continue;let{label:E,value:I,children:v}=h,x=[];typeof E<"u"&&x.push(Ed(e,E,2)),typeof I<"u"&&x.push(Ut(e,I[0],I[1])),x.length===0&&x.push(Ed(e,`${p}`,2));let C=x.join(": ").trim(),R=`\0${o++}\0`,N=u[`${R}${C}`]={};typeof v<"u"&&a(v,N)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return a(t.children,r),r}function npe(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Cd(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)u&&(a[sut(n)]=e(u));return typeof r.value>"u"?a:{value:Cd(r.value[0],r.value[1]),children:a}};return e(t)}function iut(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));ipe({children:a},{configuration:e,stdout:r,json:o})}function ipe(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)A&&r.write(`${JSON.stringify(npe(A))} +`);return}let n=(0,tpe.asTree)(rpe(t,{configuration:e}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function sut(t){return typeof t=="string"?t.replace(/^\0[0-9]+\0/,""):t}var tpe,spe=Et(()=>{tpe=$e(epe());jl()});function i2(t){let e=t.match(out);if(!e?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var ope,l_,c_,Kx,Nr,out,u_=Et(()=>{Ye();Pt();Pt();iA();ope=ve("crypto"),l_=$e(ve("fs"));Wl();ih();Gl();bo();c_=Vy(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),Kx=Vy(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Nr=class{constructor(e,{configuration:r,immutable:o=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,ope.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let{cacheSpec:n,cacheKey:u}=Nr.getCacheKey(r);this.cacheSpec=n,this.cacheKey=u}static async find(e,{immutable:r,check:o}={}){let a=new Nr(e.get("cacheFolder"),{configuration:e,immutable:r,check:o});return await a.setup(),a}static getCacheKey(e){let r=e.get("compressionLevel"),o=r!=="mixed"?`c${r}`:"";return{cacheKey:[Kx,o].join(""),cacheSpec:o}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${lE(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=i2(r).hash.slice(0,10);return`${lE(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:o}=i2(e);if(r===null||r{let he=new Ji,Be=z.join(Bt.root,nM(e));return he.mkdirSync(Be,{recursive:!0}),he.writeJsonSync(z.join(Be,dr.manifest),{name:fn(e),mocked:!0}),he},E=async(he,{isColdHit:Be,controlPath:we=null})=>{if(we===null&&u.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!Be?i2(r).cacheKey:this.cacheKey,Ee=!u.skipIntegrityCheck||!r?`${g}/${await LS(he)}`:r;if(we!==null){let ce=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await LS(we)}`:r;if(Ee!==ce)throw new Jt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let Pe=null;switch(r!==null&&Ee!==r&&(this.check?Pe="throw":i2(r).cacheKey!==i2(Ee).cacheKey?Pe="update":Pe=this.configuration.get("checksumBehavior")),Pe){case null:case"update":return{isValid:!0,hash:Ee};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new Jt(18,"The remote archive doesn't match the expected checksum")}},I=async he=>{if(!n)throw new Error(`Cache check required but no loader configured for ${qr(this.configuration,e)}`);let Be=await n(),we=Be.getRealPath();Be.saveAndClose(),await oe.chmodPromise(we,420);let g=await E(he,{controlPath:we,isColdHit:!1});if(!g.isValid)throw new Error("Assertion failed: Expected a valid checksum");return g.hash},v=async()=>{if(A===null||!await oe.existsPromise(A)){let he=await n(),Be=he.getRealPath();return he.saveAndClose(),{source:"loader",path:Be}}return{source:"mirror",path:A}},x=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${qr(this.configuration,e)}`);if(this.immutable)throw new Jt(56,`Cache entry required but missing for ${qr(this.configuration,e)}`);let{path:he,source:Be}=await v(),{hash:we}=await E(he,{isColdHit:!0}),g=this.getLocatorPath(e,we),Ee=[];Be!=="mirror"&&A!==null&&Ee.push(async()=>{let ce=`${A}${this.cacheId}`;await oe.copyFilePromise(he,ce,l_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(ce,420),await oe.renamePromise(ce,A)}),(!u.mirrorWriteOnly||A===null)&&Ee.push(async()=>{let ce=`${g}${this.cacheId}`;await oe.copyFilePromise(he,ce,l_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(ce,420),await oe.renamePromise(ce,g)});let Pe=u.mirrorWriteOnly?A??g:g;return await Promise.all(Ee.map(ce=>ce())),[!1,Pe,we]},C=async()=>{let Be=(async()=>{let we=u.unstablePackages?.has(e.locatorHash),g=we||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,Ee=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,Pe=!!u.mockedPackages?.has(e.locatorHash)&&(!this.check||!Ee),ce=Pe||Ee,ne=ce?o:a;if(ne&&ne(),ce){let ee=null,Ie=g;if(!Pe)if(this.check)ee=await I(Ie);else{let Fe=await E(Ie,{isColdHit:!1});if(Fe.isValid)ee=Fe.hash;else return x()}return[Pe,Ie,ee]}else{if(this.immutable&&we)throw new Jt(56,`Cache entry required but missing for ${qr(this.configuration,e)}; consider defining ${de.pretty(this.configuration,"supportedArchitectures",de.Type.CODE)} to cache packages for multiple systems`);return x()}})();this.mutexes.set(e.locatorHash,Be);try{return await Be}finally{this.mutexes.delete(e.locatorHash)}};for(let he;he=this.mutexes.get(e.locatorHash);)await he;let[R,N,U]=await C();R||this.markedFiles.add(N);let V,te=R?()=>h():()=>new Ji(N,{baseFs:p,readOnly:!0}),ae=new iy(()=>CN(()=>V=te(),he=>`Failed to open the cache entry for ${qr(this.configuration,e)}: ${he}`),z),fe=new _u(N,{baseFs:ae,pathUtils:z}),ue=()=>{V?.discardAndClose()},me=u.unstablePackages?.has(e.locatorHash)?null:U;return[fe,ue,me]}},out=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var zx,ape=Et(()=>{zx=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(zx||{})});var aut,oC,A_=Et(()=>{Pt();Nl();Qf();bo();aut=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>_S({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],oC=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=z.join(e.cwd,dr.lockfile);if(!oe.existsSync(o))return;let a=await oe.readFilePromise(o,"utf8"),n=Ki(a);if(Object.hasOwn(n,"__metadata"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=s1(A);if(!p){r.reportWarning(14,`Failed to parse the string "${A}" into a proper descriptor`);continue}let h=xa(p.range)?In(p,`npm:${p.range}`):p,{version:E,resolved:I}=n[A];if(!I)continue;let v;for(let[C,R]of aut){let N=I.match(C);if(N){v=R(E,...N);break}}if(!v){r.reportWarning(14,`${Gn(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${I}")`);continue}let x=h;try{let C=vd(h.range),R=s1(C.selector,!0);R&&(x=R)}catch{}u.set(h.descriptorHash,Qs(x,v))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=$O(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var fA,lpe=Et(()=>{Wl();O1();jl();fA=class extends Xs{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;XI(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o=="function"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o=="function"?o:a)()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${o} +`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,o){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(r){return yU(r,{configuration:this.configuration,json:!1})}}});var aC,f_=Et(()=>{bo();aC=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(OS(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(OS(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return o}}});function Kf(){}function lut(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;nx.length?R:x}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var v=e[u-1];return u>1&&typeof v.value=="string"&&(v.added||v.removed)&&t.equals("",v.value)&&(e[u-2].value+=v.value,e.pop()),e}function cut(t){return{newPos:t.newPos,components:t.components.slice(0)}}function uut(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function Ape(t,e,r){return r=uut(r,{ignoreWhitespace:!0}),m_.diff(t,e,r)}function Aut(t,e,r){return y_.diff(t,e,r)}function Vx(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Vx=function(e){return typeof e}:Vx=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Vx(t)}function p_(t){return hut(t)||gut(t)||dut(t)||mut()}function hut(t){if(Array.isArray(t))return h_(t)}function gut(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function dut(t,e){if(!!t){if(typeof t=="string")return h_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return h_(t,e)}}function h_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r"u"&&(u.context=4);var A=Aut(r,o,u);if(!A)return;A.push({value:"",lines:[]});function p(U){return U.map(function(V){return" "+V})}for(var h=[],E=0,I=0,v=[],x=1,C=1,R=function(V){var te=A[V],ae=te.lines||te.value.replace(/\n$/,"").split(` +`);if(te.lines=ae,te.added||te.removed){var fe;if(!E){var ue=A[V-1];E=x,I=C,ue&&(v=u.context>0?p(ue.lines.slice(-u.context)):[],E-=v.length,I-=v.length)}(fe=v).push.apply(fe,p_(ae.map(function(ce){return(te.added?"+":"-")+ce}))),te.added?C+=ae.length:x+=ae.length}else{if(E)if(ae.length<=u.context*2&&V=A.length-2&&ae.length<=u.context){var g=/\n$/.test(r),Ee=/\n$/.test(o),Pe=ae.length==0&&v.length>we.oldLines;!g&&Pe&&r.length>0&&v.splice(we.oldLines,0,"\\ No newline at end of file"),(!g&&!Pe||!Ee)&&v.push("\\ No newline at end of file")}h.push(we),E=0,I=0,v=[]}x+=ae.length,C+=ae.length}},N=0;N{Kf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o=="function"&&(a=o,o={}),this.options=o;var n=this;function u(R){return a?(setTimeout(function(){a(void 0,R)},0),!0):R}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var I=[{newPos:-1,components:[]}],v=this.extractCommon(I[0],r,e,0);if(I[0].newPos+1>=A&&v+1>=p)return u([{value:this.join(r),count:r.length}]);function x(){for(var R=-1*h;R<=h;R+=2){var N=void 0,U=I[R-1],V=I[R+1],te=(V?V.newPos:0)-R;U&&(I[R-1]=void 0);var ae=U&&U.newPos+1=A&&te+1>=p)return u(lut(n,N.components,r,e,n.useLongestToken));I[R]=N}h++}if(a)(function R(){setTimeout(function(){if(h>E)return a();x()||R()},0)})();else for(;h<=E;){var C=x();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1"u"?r:u}:o;return typeof t=="string"?t:JSON.stringify(g_(t,null,null,a),a," ")};s2.equals=function(t,e){return Kf.prototype.equals.call(s2,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};d_=new Kf;d_.tokenize=function(t){return t.slice()};d_.join=d_.removeEmpty=function(t){return t}});var hpe=_((o3t,ppe)=>{var Eut=ql(),Cut=pE(),wut=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Iut=/^\w*$/;function But(t,e){if(Eut(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||Cut(t)?!0:Iut.test(t)||!wut.test(t)||e!=null&&t in Object(e)}ppe.exports=But});var mpe=_((a3t,dpe)=>{var gpe=UP(),vut="Expected a function";function C_(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(vut);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(C_.Cache||gpe),r}C_.Cache=gpe;dpe.exports=C_});var Epe=_((l3t,ype)=>{var Dut=mpe(),Put=500;function Sut(t){var e=Dut(t,function(o){return r.size===Put&&r.clear(),o}),r=e.cache;return e}ype.exports=Sut});var w_=_((c3t,Cpe)=>{var but=Epe(),xut=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,kut=/\\(\\)?/g,Qut=but(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(xut,function(r,o,a,n){e.push(a?n.replace(kut,"$1"):o||r)}),e});Cpe.exports=Qut});var jd=_((u3t,wpe)=>{var Fut=ql(),Rut=hpe(),Tut=w_(),Lut=L1();function Nut(t,e){return Fut(t)?t:Rut(t,e)?[t]:Tut(Lut(t))}wpe.exports=Nut});var lC=_((A3t,Ipe)=>{var Out=pE(),Mut=1/0;function Uut(t){if(typeof t=="string"||Out(t))return t;var e=t+"";return e=="0"&&1/t==-Mut?"-0":e}Ipe.exports=Uut});var Jx=_((f3t,Bpe)=>{var _ut=jd(),Hut=lC();function qut(t,e){e=_ut(e,t);for(var r=0,o=e.length;t!=null&&r{var Gut=tS(),jut=jd(),Yut=_I(),vpe=sl(),Wut=lC();function Kut(t,e,r,o){if(!vpe(t))return t;e=jut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a{var zut=Jx(),Vut=I_(),Jut=jd();function Xut(t,e,r){for(var o=-1,a=e.length,n={};++o{function Zut(t,e){return t!=null&&e in Object(t)}bpe.exports=Zut});var B_=_((d3t,kpe)=>{var $ut=jd(),eAt=OI(),tAt=ql(),rAt=_I(),nAt=jP(),iAt=lC();function sAt(t,e,r){e=$ut(e,t);for(var o=-1,a=e.length,n=!1;++o{var oAt=xpe(),aAt=B_();function lAt(t,e){return t!=null&&aAt(t,e,oAt)}Qpe.exports=lAt});var Tpe=_((y3t,Rpe)=>{var cAt=Spe(),uAt=Fpe();function AAt(t,e){return cAt(t,e,function(r,o){return uAt(t,o)})}Rpe.exports=AAt});var Mpe=_((E3t,Ope)=>{var Lpe=hd(),fAt=OI(),pAt=ql(),Npe=Lpe?Lpe.isConcatSpreadable:void 0;function hAt(t){return pAt(t)||fAt(t)||!!(Npe&&t&&t[Npe])}Ope.exports=hAt});var Hpe=_((C3t,_pe)=>{var gAt=qP(),dAt=Mpe();function Upe(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=dAt),a||(a=[]);++n0&&r(A)?e>1?Upe(A,e-1,r,o,a):gAt(a,A):o||(a[a.length]=A)}return a}_pe.exports=Upe});var Gpe=_((w3t,qpe)=>{var mAt=Hpe();function yAt(t){var e=t==null?0:t.length;return e?mAt(t,1):[]}qpe.exports=yAt});var v_=_((I3t,jpe)=>{var EAt=Gpe(),CAt=fN(),wAt=pN();function IAt(t){return wAt(CAt(t,void 0,EAt),t+"")}jpe.exports=IAt});var D_=_((B3t,Ype)=>{var BAt=Tpe(),vAt=v_(),DAt=vAt(function(t,e){return t==null?{}:BAt(t,e)});Ype.exports=DAt});var Xx,Wpe=Et(()=>{Wl();Xx=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var Qi,P_=Et(()=>{Wl();Qi=class extends Xs{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r=="function"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r=="function"?r:o)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Kpe,cC,S_=Et(()=>{Pt();Kpe=$e(RS());fE();Dd();jl();ih();Qf();bo();cC=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Ot.tryFind(this.cwd)??new Ot,this.relativeCwd=z.relative(this.project.cwd,this.cwd)||Bt.dot;let e=this.manifest.name?this.manifest.name:tA(null,`${this.computeCandidateName()}-${Js(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=In(e,`${Xn.protocol}${this.relativeCwd}`),this.anchoredLocator=Qs(e,`${Xn.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let o=await(0,Kpe.default)(r,{cwd:le.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});o.sort(),await o.reduce(async(a,n)=>{let u=z.resolve(this.cwd,le.toPortablePath(n)),A=await oe.existsPromise(z.join(u,"package.json"));await a,A&&this.workspacesCwds.add(u)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${a1(this.project.configuration,this)} (${Ut(this.project.configuration,z.join(this.cwd,dr.manifest),yt.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===Xn.protocol&&z.normalize(a)===this.relativeCwd||o===Xn.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=xa(a);return n?o===Xn.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${z.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Ot.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ot.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&i1(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let o of r.workspacesCwds){let a=this.project.workspacesByCwd.get(o);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=z.join(this.cwd,Ot.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)} +`;await oe.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function QAt({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,peerWarnings:A=[],volatileDescriptors:p=new Set}){let h=new Map,E=[],I=new Map,v=new Map,x=new Map,C=new Map,R=new Map,N=new Map(t.workspaces.map(ue=>{let me=ue.anchoredLocator.locatorHash,he=o.get(me);if(typeof he>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[me,e1(he)]})),U=()=>{let ue=oe.mktempSync(),me=z.join(ue,"stacktrace.log"),he=String(E.length+1).length,Be=E.map((we,g)=>`${`${g+1}.`.padStart(he," ")} ${ba(we)} +`).join("");throw oe.writeFileSync(me,Be),oe.detachTemp(ue),new Jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${le.fromPortablePath(me)}`)},V=ue=>{let me=r.get(ue.descriptorHash);if(typeof me>"u")throw new Error("Assertion failed: The resolution should have been registered");let he=o.get(me);if(!he)throw new Error("Assertion failed: The package could not be found");return he},te=(ue,me,he,{top:Be,optional:we})=>{E.length>1e3&&U(),E.push(me);let g=ae(ue,me,he,{top:Be,optional:we});return E.pop(),g},ae=(ue,me,he,{top:Be,optional:we})=>{if(we||n.delete(me.locatorHash),a.has(me.locatorHash))return;a.add(me.locatorHash);let g=o.get(me.locatorHash);if(!g)throw new Error(`Assertion failed: The package (${qr(t.configuration,me)}) should have been registered`);let Ee=[],Pe=[],ce=[],ne=[],ee=[];for(let Fe of Array.from(g.dependencies.values())){if(g.peerDependencies.has(Fe.identHash)&&g.locatorHash!==Be)continue;if(bf(Fe))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");p.delete(Fe.descriptorHash);let At=we;if(!At){let Te=g.dependenciesMeta.get(fn(Fe));if(typeof Te<"u"){let Ve=Te.get(null);typeof Ve<"u"&&Ve.optional&&(At=!0)}}let H=r.get(Fe.descriptorHash);if(!H)throw new Error(`Assertion failed: The resolution (${Gn(t.configuration,Fe)}) should have been registered`);let at=N.get(H)||o.get(H);if(!at)throw new Error(`Assertion failed: The package (${H}, resolved from ${Gn(t.configuration,Fe)}) should have been registered`);if(at.peerDependencies.size===0){te(Fe,at,new Map,{top:Be,optional:At});continue}let Re,ke,xe=new Set,He;Pe.push(()=>{Re=tM(Fe,me.locatorHash),ke=rM(at,me.locatorHash),g.dependencies.delete(Fe.identHash),g.dependencies.set(Re.identHash,Re),r.set(Re.descriptorHash,ke.locatorHash),e.set(Re.descriptorHash,Re),o.set(ke.locatorHash,ke),Ee.push([at,Re,ke])}),ce.push(()=>{He=new Map;for(let Te of ke.peerDependencies.values()){let Ve=g.dependencies.get(Te.identHash);if(!Ve&&n1(me,Te)&&(ue.identHash===me.identHash?Ve=ue:(Ve=In(me,ue.range),e.set(Ve.descriptorHash,Ve),r.set(Ve.descriptorHash,me.locatorHash),p.delete(Ve.descriptorHash))),(!Ve||Ve.range==="missing:")&&ke.dependencies.has(Te.identHash)){ke.peerDependencies.delete(Te.identHash);continue}Ve||(Ve=In(Te,"missing:")),ke.dependencies.set(Ve.identHash,Ve),bf(Ve)&&yd(x,Ve.descriptorHash).add(ke.locatorHash),I.set(Ve.identHash,Ve),Ve.range==="missing:"&&xe.add(Ve.identHash),He.set(Te.identHash,he.get(Te.identHash)??ke.locatorHash)}ke.dependencies=new Map(ks(ke.dependencies,([Te,Ve])=>fn(Ve)))}),ne.push(()=>{if(!o.has(ke.locatorHash))return;let Te=h.get(at.locatorHash);typeof Te=="number"&&Te>=2&&U();let Ve=h.get(at.locatorHash),qe=typeof Ve<"u"?Ve+1:1;h.set(at.locatorHash,qe),te(Re,ke,He,{top:Be,optional:At}),h.set(at.locatorHash,qe-1)}),ee.push(()=>{let Te=g.dependencies.get(Fe.identHash);if(typeof Te>"u")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let Ve=r.get(Te.descriptorHash);if(typeof Ve>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");if(yd(R,Ve).add(me.locatorHash),!!o.has(ke.locatorHash)){for(let qe of ke.peerDependencies.values()){let b=He.get(qe.identHash);if(typeof b>"u")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Yy(Wy(C,b),fn(qe)).push(ke.locatorHash)}for(let qe of xe)ke.dependencies.delete(qe)}})}for(let Fe of[...Pe,...ce])Fe();let Ie;do{Ie=!0;for(let[Fe,At,H]of Ee){let at=Wy(v,Fe.locatorHash),Re=Js(...[...H.dependencies.values()].map(Te=>{let Ve=Te.range!=="missing:"?r.get(Te.descriptorHash):"missing:";if(typeof Ve>"u")throw new Error(`Assertion failed: Expected the resolution for ${Gn(t.configuration,Te)} to have been registered`);return Ve===Be?`${Ve} (top)`:Ve}),At.identHash),ke=at.get(Re);if(typeof ke>"u"){at.set(Re,At);continue}if(ke===At)continue;o.delete(H.locatorHash),e.delete(At.descriptorHash),r.delete(At.descriptorHash),a.delete(H.locatorHash);let xe=x.get(At.descriptorHash)||[],He=[g.locatorHash,...xe];x.delete(At.descriptorHash);for(let Te of He){let Ve=o.get(Te);typeof Ve>"u"||(Ve.dependencies.get(At.identHash).descriptorHash!==ke.descriptorHash&&(Ie=!1),Ve.dependencies.set(At.identHash,ke))}}}while(!Ie);for(let Fe of[...ne,...ee])Fe()};for(let ue of t.workspaces){let me=ue.anchoredLocator;p.delete(ue.anchoredDescriptor.descriptorHash),te(ue.anchoredDescriptor,me,new Map,{top:me.locatorHash,optional:!1})}let fe=new Map;for(let[ue,me]of R){let he=o.get(ue);if(typeof he>"u")throw new Error("Assertion failed: Expected the root to be registered");let Be=C.get(ue);if(!(typeof Be>"u"))for(let we of me){let g=o.get(we);if(!(typeof g>"u")&&!!t.tryWorkspaceByLocator(g))for(let[Ee,Pe]of Be){let ce=Vs(Ee);if(g.peerDependencies.has(ce.identHash))continue;let ne=`p${Js(we,Ee,ue).slice(0,5)}`;u.set(ne,{subject:we,requested:ce,rootRequester:ue,allRequesters:Pe});let ee=he.dependencies.get(ce.identHash);if(typeof ee<"u"){let Ie=V(ee),Fe=Ie.version??"0.0.0",At=new Set;for(let at of Pe){let Re=o.get(at);if(typeof Re>"u")throw new Error("Assertion failed: Expected the link to be registered");let ke=Re.peerDependencies.get(ce.identHash);if(typeof ke>"u")throw new Error("Assertion failed: Expected the ident to be registered");At.add(ke.range)}if(![...At].every(at=>{if(at.startsWith(Xn.protocol)){if(!t.tryWorkspaceByLocator(Ie))return!1;at=at.slice(Xn.protocol.length),(at==="^"||at==="~")&&(at="*")}return kf(Fe,at)})){let at=al(fe,Ie.locatorHash,()=>({type:2,requested:ce,subject:Ie,dependents:new Map,requesters:new Map,links:new Map,version:Fe,hash:`p${Ie.locatorHash.slice(0,5)}`}));at.dependents.set(g.locatorHash,g),at.requesters.set(he.locatorHash,he);for(let Re of Pe)at.links.set(Re,o.get(Re));A.push({type:1,subject:g,requested:ce,requester:he,version:Fe,hash:ne,requirementCount:Pe.length})}}else he.peerDependenciesMeta.get(Ee)?.optional||A.push({type:0,subject:g,requested:ce,requester:he,hash:ne})}}}A.push(...fe.values())}function FAt(t,e){let r=IN(t.peerWarnings,"type"),o=r[2]?.map(n=>{let u=Array.from(n.links.values(),E=>{let I=t.storedPackages.get(E.locatorHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the package to be registered");let v=I.peerDependencies.get(n.requested.identHash);if(typeof v>"u")throw new Error("Assertion failed: Expected the ident to be registered");return v.range}),A=n.links.size>1?"and other dependencies request":"requests",p=sM(u),h=p?cE(t.configuration,p):Ut(t.configuration,"but they have non-overlapping ranges!","redBright");return`${cs(t.configuration,n.requested)} is listed by your project with version ${o1(t.configuration,n.version)}, which doesn't satisfy what ${cs(t.configuration,n.requesters.values().next().value)} (${Ut(t.configuration,n.hash,yt.CODE)}) ${A} (${h}).`})??[],a=r[0]?.map(n=>`${qr(t.configuration,n.subject)} doesn't provide ${cs(t.configuration,n.requested)} (${Ut(t.configuration,n.hash,yt.CODE)}), requested by ${cs(t.configuration,n.requester)}.`)??[];e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met; run ${Ut(t.configuration,"yarn explain peer-requirements ",yt.CODE)} for details, where ${Ut(t.configuration,"",yt.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of ks(o,u=>Xy.default(u)))e.reportWarning(60,n);for(let n of ks(a,u=>Xy.default(u)))e.reportWarning(2,n)})}var Zx,$x,ek,Jpe,k_,x_,Q_,tk,PAt,SAt,zpe,bAt,xAt,kAt,hl,b_,rk,Vpe,St,Xpe=Et(()=>{Pt();Pt();Nl();qt();Zx=ve("crypto");E_();$x=$e(D_()),ek=$e(sd()),Jpe=$e(Jn()),k_=ve("util"),x_=$e(ve("v8")),Q_=$e(ve("zlib"));u_();P1();A_();f_();fE();uM();Wl();Wpe();O1();P_();Dd();S_();WS();jl();ih();Gl();vb();BU();Qf();bo();tk=Vy(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),PAt=3,SAt=/ *, */g,zpe=/\/$/,bAt=32,xAt=(0,k_.promisify)(Q_.default.gzip),kAt=(0,k_.promisify)(Q_.default.gunzip),hl=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(hl||{}),b_={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},rk=(o=>(o[o.NotProvided=0]="NotProvided",o[o.NotCompatible=1]="NotCompatible",o[o.NotCompatibleAggregate=2]="NotCompatibleAggregate",o))(rk||{}),Vpe=t=>Js(`${PAt}`,t),St=class{constructor(e,{configuration:r}){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.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new it(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,oe.existsSync(z.join(n,dr.manifest))){o=n;break}a=z.dirname(n)}let u=new St(e.projectCwd,{configuration:e});Ke.telemetry?.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),Ke.telemetry?.reportWorkspaceCount(u.workspaces.length),Ke.telemetry?.reportDependencyCount(u.workspaces.reduce((C,R)=>C+R.manifest.dependencies.size+R.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Ut(e,u.cwd,yt.PATH),E=Ut(e,z.relative(u.cwd,o),yt.PATH),I=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,v=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,x=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new it(`The nearest package directory (${Ut(e,o,yt.PATH)}) doesn't seem to be part of the project declared in ${Ut(e,u.cwd,yt.PATH)}. + +${[I,v,x].join(` +`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=z.join(this.cwd,dr.lockfile),r=this.configuration.get("defaultLanguageName");if(oe.existsSync(e)){let o=await oe.readFilePromise(e,"utf8");this.lockFileChecksum=Vpe(o);let a=Ki(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=xf(p.resolution,!0),E=new Ot;E.load(p,{yamlCompatibilityMode:!0});let I=E.version,v=E.languageName||r,x=p.linkType.toUpperCase(),C=p.conditions??null,R=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,V=E.peerDependenciesMeta,te=E.bin;if(p.checksum!=null){let fe=typeof u<"u"&&!p.checksum.includes("/")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,fe)}let ae={...h,version:I,languageName:v,linkType:x,conditions:C,dependencies:R,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:V,bin:te};this.originalPackages.set(ae.locatorHash,ae);for(let fe of A.split(SAt)){let ue=sh(fe);n<=6&&(ue=this.configuration.normalizeDependency(ue),ue=In(ue,ue.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(ue.descriptorHash,ue),this.storedResolutions.set(ue.descriptorHash,h.locatorHash)}}}else o.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,ek.default)(4),o=async(a,n)=>{if(e.has(n))return a;e.add(n);let u=new cC(n,{project:this});await r(()=>u.setup());let A=a.then(()=>{this.addWorkspace(u)});return Array.from(u.workspacesCwds).reduce(o,A)};await o(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${cs(this.configuration,e.anchoredLocator)}: ${le.fromPortablePath(e.cwd)} conflicts with ${le.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){z.isAbsolute(e)||(e=z.resolve(this.cwd,e)),e=z.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)z.relative(o.cwd,e).startsWith("../")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${cs(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(Xn.protocol)){let o=e.range.slice(Xn.protocol.length);if(o!=="^"&&o!=="~"&&o!=="*"&&!xa(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(bf(e)&&(e=t1(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Gn(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(qc(e)&&(e=r1(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${qr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if("descriptorHash"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let o=new Set(this.storedResolutions.values());typeof r<"u"&&!o.has(r)&&this.deleteLocator(r)}if("locatorHash"in e){this.deleteLocator(e.locatorHash);for(let[r,o]of this.storedResolutions)o===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[o,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(o)}for(let o of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(o,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(o.locatorHash);let n=r.get(o.locatorHash);if(n){r.delete(o.locatorHash);for(let u of n)this.deleteDescriptor(u)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)bf(o)&&e.dependencies.set(r,t1(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(fn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!Jpe.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new Qi,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(zpe,"")!==e.replace(zpe,""))continue;return A}}return null}async loadUserConfig(){let e=z.join(this.cwd,".pnp.cjs");await oe.existsPromise(e)&&Df(e).setup();let r=z.join(this.cwd,"yarn.config.cjs");return await oe.existsPromise(r)?Df(r):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[u,A]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,A,this,n,A,{resolver:r,resolveOptions:o});if(!n1(A,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,o);n.dependencies.set(u,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),o=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new oC(a);await n.setup(this,{report:e.report});let u=e.lockfileOnly?[new Xx(a)]:[n,a],A=new Pd([new aC(a),...u]),p=new Pd([...u]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:A}:{project:this,report:e.report,resolver:A,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},I=new Map,v=new Map,x=new Map,C=new Map,R=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,V=new Set,te=[],ae=M4(),fe=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Xs.progressViaTitle(),async ce=>{let ne=async H=>{let at=await Ky(async()=>await A.resolve(H,E),He=>`${qr(this.configuration,H)}: ${He}`);if(!i1(H,at))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${qr(this.configuration,H)} to ${qr(this.configuration,at)})`);C.set(at.locatorHash,at),!r.delete(at.locatorHash)&&!this.tryWorkspaceByLocator(at)&&o.push(at);let ke=await this.preparePackage(at,{resolver:A,resolveOptions:E}),xe=_c([...ke.dependencies.values()].map(He=>At(He)));return te.push(xe),xe.catch(()=>{}),v.set(ke.locatorHash,ke),ke},ee=async H=>{let at=R.get(H.locatorHash);if(typeof at<"u")return at;let Re=Promise.resolve().then(()=>ne(H));return R.set(H.locatorHash,Re),Re},Ie=async(H,at)=>{let Re=await At(at);return I.set(H.descriptorHash,H),x.set(H.descriptorHash,Re.locatorHash),Re},Fe=async H=>{ce.setTitle(Gn(this.configuration,H));let at=this.resolutionAliases.get(H.descriptorHash);if(typeof at<"u")return Ie(H,this.storedDescriptors.get(at));let Re=A.getResolutionDependencies(H,E),ke=Object.fromEntries(await _c(Object.entries(Re).map(async([Te,Ve])=>{let qe=A.bindDescriptor(Ve,U,E),b=await At(qe);return V.add(b.locatorHash),[Te,b]}))),He=(await Ky(async()=>await A.getCandidates(H,ke,E),Te=>`${Gn(this.configuration,H)}: ${Te}`))[0];if(typeof He>"u")throw new Jt(82,`${Gn(this.configuration,H)}: No candidates found`);if(e.checkResolutions){let{locators:Te}=await p.getSatisfying(H,ke,[He],{...E,resolver:p});if(!Te.find(Ve=>Ve.locatorHash===He.locatorHash))throw new Jt(78,`Invalid resolution ${ZI(this.configuration,H,He)}`)}return I.set(H.descriptorHash,H),x.set(H.descriptorHash,He.locatorHash),ee(He)},At=H=>{let at=N.get(H.descriptorHash);if(typeof at<"u")return at;I.set(H.descriptorHash,H);let Re=Promise.resolve().then(()=>Fe(H));return N.set(H.descriptorHash,Re),Re};for(let H of this.workspaces){let at=H.anchoredDescriptor;te.push(At(at))}for(;te.length>0;){let H=[...te];te.length=0,await _c(H)}});let ue=ol(r.values(),ce=>this.tryWorkspaceByLocator(ce)?ol.skip:ce);if(o.length>0||ue.length>0){let ce=new Set(this.workspaces.flatMap(H=>{let at=v.get(H.anchoredLocator.locatorHash);if(!at)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(at.dependencies.values(),Re=>{let ke=x.get(Re.descriptorHash);if(!ke)throw new Error("Assertion failed: The resolution should have been registered");return ke})})),ne=H=>ce.has(H.locatorHash)?"0":"1",ee=H=>ba(H),Ie=ks(o,[ne,ee]),Fe=ks(ue,[ne,ee]),At=e.report.getRecommendedLength();Ie.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"+",yt.ADDED)} ${lS(this.configuration,Ie,At)}`),Fe.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"-",yt.REMOVED)} ${lS(this.configuration,Fe,At)}`)}let me=new Set(this.resolutionAliases.values()),he=new Set(v.keys()),Be=new Set,we=new Map,g=[];QAt({project:this,accessibleLocators:Be,volatileDescriptors:me,optionalBuilds:he,peerRequirements:we,peerWarnings:g,allDescriptors:I,allResolutions:x,allPackages:v});for(let ce of V)he.delete(ce);for(let ce of me)I.delete(ce),x.delete(ce);let Ee=new Set,Pe=new Set;for(let ce of v.values())ce.conditions!=null&&(!he.has(ce.locatorHash)||(qS(ce,fe)||(qS(ce,ae)&&e.report.reportWarningOnce(77,`${qr(this.configuration,ce)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ut(this.configuration,"supportedArchitectures",yt.SETTING)} setting`),Pe.add(ce.locatorHash)),Ee.add(ce.locatorHash)));this.storedResolutions=x,this.storedDescriptors=I,this.storedPackages=v,this.accessibleLocators=Be,this.conditionalLocators=Ee,this.disabledLocators=Pe,this.originalPackages=C,this.optionalBuilds=he,this.peerRequirements=we,this.peerWarnings=g}async fetchEverything({cache:e,report:r,fetcher:o,mode:a,persistProject:n=!0}){let u={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},A=o||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:r,cacheOptions:u},h=Array.from(new Set(ks(this.storedResolutions.values(),[C=>{let R=this.storedPackages.get(C);if(!R)throw new Error("Assertion failed: The locator should have been registered");return ba(R)}])));a==="update-lockfile"&&(h=h.filter(C=>!this.storedChecksums.has(C)));let E=!1,I=Xs.progressViaCounter(h.length);await r.reportProgress(I);let v=(0,ek.default)(bAt);if(await _c(h.map(C=>v(async()=>{let R=this.storedPackages.get(C);if(!R)throw new Error("Assertion failed: The locator should have been registered");if(qc(R))return;let N;try{N=await A.fetch(R,p)}catch(U){U.message=`${qr(this.configuration,R)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(R.locatorHash,N.checksum):this.storedChecksums.delete(R.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{I.tick()}))),E)throw E;let x=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||x){let R=(await Promise.all([...r.cacheMisses].map(async ue=>{let me=this.storedPackages.get(ue),he=this.storedChecksums.get(ue)??null,Be=e.getLocatorPath(me,he);return(await oe.statPromise(Be)).size}))).reduce((ue,me)=>ue+me,0)-(x?.size??0),N=r.cacheMisses.size,U=x?.count??0,V=`${rS(N,{zero:"No new packages",one:"A package was",more:`${Ut(this.configuration,N,yt.NUMBER)} packages were`})} added to the project`,te=`${rS(U,{zero:"none were",one:"one was",more:`${Ut(this.configuration,U,yt.NUMBER)} were`})} removed`,ae=R!==0?` (${Ut(this.configuration,R,yt.SIZE_DIFF)})`:"",fe=U>0?N>0?`${V}, and ${te}${ae}.`:`${V}, but ${te}${ae}.`:`${V}${ae}.`;r.reportInfo(13,fe)}}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(ce=>{let ne=ce.makeInstaller(h),ee=ce.getCustomDataKey(),Ie=this.linkersCustomData.get(ee);return typeof Ie<"u"&&ne.attachCustomData(Ie),[ce,ne]})),I=new Map,v=new Map,x=new Map,C=new Map(await _c([...this.accessibleLocators].map(async ce=>{let ne=this.storedPackages.get(ce);if(!ne)throw new Error("Assertion failed: The locator should have been registered");return[ce,await u.fetch(ne,A)]}))),R=[],N=new Set,U=[];for(let ce of this.accessibleLocators){let ne=this.storedPackages.get(ce);if(typeof ne>"u")throw new Error("Assertion failed: The locator should have been registered");let ee=C.get(ne.locatorHash);if(typeof ee>"u")throw new Error("Assertion failed: The fetch result should have been registered");let Ie=[],Fe=H=>{Ie.push(H)},At=this.tryWorkspaceByLocator(ne);if(At!==null){let H=[],{scripts:at}=At.manifest;for(let ke of["preinstall","install","postinstall"])at.has(ke)&&H.push({type:0,script:ke});try{for(let[ke,xe]of E)if(ke.supportsPackage(ne,h)&&(await xe.installPackage(ne,ee,{holdFetchResult:Fe})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{Ie.length===0?ee.releaseFs?.():R.push(_c(Ie).catch(()=>{}).then(()=>{ee.releaseFs?.()}))}let Re=z.join(ee.packageFs.getRealPath(),ee.prefixPath);v.set(ne.locatorHash,Re),!qc(ne)&&H.length>0&&x.set(ne.locatorHash,{buildDirectives:H,buildLocations:[Re]})}else{let H=p.find(ke=>ke.supportsPackage(ne,h));if(!H)throw new Jt(12,`${qr(this.configuration,ne)} isn't supported by any available linker`);let at=E.get(H);if(!at)throw new Error("Assertion failed: The installer should have been registered");let Re;try{Re=await at.installPackage(ne,ee,{holdFetchResult:Fe})}finally{Ie.length===0?ee.releaseFs?.():R.push(_c(Ie).then(()=>{}).then(()=>{ee.releaseFs?.()}))}I.set(ne.locatorHash,H),v.set(ne.locatorHash,Re.packageLocation),Re.buildRequest&&Re.packageLocation&&(Re.buildRequest.skipped?(N.add(ne.locatorHash),this.skippedBuilds.has(ne.locatorHash)||U.push([ne,Re.buildRequest.explain])):x.set(ne.locatorHash,{buildDirectives:Re.buildRequest.directives,buildLocations:[Re.packageLocation]}))}}let V=new Map;for(let ce of this.accessibleLocators){let ne=this.storedPackages.get(ce);if(!ne)throw new Error("Assertion failed: The locator should have been registered");let ee=this.tryWorkspaceByLocator(ne)!==null,Ie=async(Fe,At)=>{let H=v.get(ne.locatorHash);if(typeof H>"u")throw new Error(`Assertion failed: The package (${qr(this.configuration,ne)}) should have been registered`);let at=[];for(let Re of ne.dependencies.values()){let ke=this.storedResolutions.get(Re.descriptorHash);if(typeof ke>"u")throw new Error(`Assertion failed: The resolution (${Gn(this.configuration,Re)}, from ${qr(this.configuration,ne)})should have been registered`);let xe=this.storedPackages.get(ke);if(typeof xe>"u")throw new Error(`Assertion failed: The package (${ke}, resolved from ${Gn(this.configuration,Re)}) should have been registered`);let He=this.tryWorkspaceByLocator(xe)===null?I.get(ke):null;if(typeof He>"u")throw new Error(`Assertion failed: The package (${ke}, resolved from ${Gn(this.configuration,Re)}) should have been registered`);He===Fe||He===null?v.get(xe.locatorHash)!==null&&at.push([Re,xe]):!ee&&H!==null&&Yy(V,ke).push(H)}H!==null&&await At.attachInternalDependencies(ne,at)};if(ee)for(let[Fe,At]of E)Fe.supportsPackage(ne,h)&&await Ie(Fe,At);else{let Fe=I.get(ne.locatorHash);if(!Fe)throw new Error("Assertion failed: The linker should have been found");let At=E.get(Fe);if(!At)throw new Error("Assertion failed: The installer should have been registered");await Ie(Fe,At)}}for(let[ce,ne]of V){let ee=this.storedPackages.get(ce);if(!ee)throw new Error("Assertion failed: The package should have been registered");let Ie=I.get(ee.locatorHash);if(!Ie)throw new Error("Assertion failed: The linker should have been found");let Fe=E.get(Ie);if(!Fe)throw new Error("Assertion failed: The installer should have been registered");await Fe.attachExternalDependents(ee,ne)}let te=new Map;for(let[ce,ne]of E){let ee=await ne.finalizeInstall();for(let Ie of ee?.records??[])Ie.buildRequest.skipped?(N.add(Ie.locator.locatorHash),this.skippedBuilds.has(Ie.locator.locatorHash)||U.push([Ie.locator,Ie.buildRequest.explain])):x.set(Ie.locator.locatorHash,{buildDirectives:Ie.buildRequest.directives,buildLocations:Ie.buildLocations});typeof ee?.customData<"u"&&te.set(ce.getCustomDataKey(),ee.customData)}if(this.linkersCustomData=te,await _c(R),a==="skip-build")return;for(let[,ce]of ks(U,([ne])=>ba(ne)))ce(r);let ae=new Set(this.storedPackages.keys()),fe=new Set(x.keys());for(let ce of fe)ae.delete(ce);let ue=(0,Zx.createHash)("sha512");ue.update(process.versions.node),await this.configuration.triggerHook(ce=>ce.globalHashGeneration,this,ce=>{ue.update("\0"),ue.update(ce)});let me=ue.digest("hex"),he=new Map,Be=ce=>{let ne=he.get(ce.locatorHash);if(typeof ne<"u")return ne;let ee=this.storedPackages.get(ce.locatorHash);if(typeof ee>"u")throw new Error("Assertion failed: The package should have been registered");let Ie=(0,Zx.createHash)("sha512");Ie.update(ce.locatorHash),he.set(ce.locatorHash,"");for(let Fe of ee.dependencies.values()){let At=this.storedResolutions.get(Fe.descriptorHash);if(typeof At>"u")throw new Error(`Assertion failed: The resolution (${Gn(this.configuration,Fe)}) should have been registered`);let H=this.storedPackages.get(At);if(typeof H>"u")throw new Error("Assertion failed: The package should have been registered");Ie.update(Be(H))}return ne=Ie.digest("hex"),he.set(ce.locatorHash,ne),ne},we=(ce,ne)=>{let ee=(0,Zx.createHash)("sha512");ee.update(me),ee.update(Be(ce));for(let Ie of ne)ee.update(Ie);return ee.digest("hex")},g=new Map,Ee=!1,Pe=ce=>{let ne=new Set([ce.locatorHash]);for(let ee of ne){let Ie=this.storedPackages.get(ee);if(!Ie)throw new Error("Assertion failed: The package should have been registered");for(let Fe of Ie.dependencies.values()){let At=this.storedResolutions.get(Fe.descriptorHash);if(!At)throw new Error(`Assertion failed: The resolution (${Gn(this.configuration,Fe)}) should have been registered`);if(At!==ce.locatorHash&&fe.has(At))return!1;let H=this.storedPackages.get(At);if(!H)throw new Error("Assertion failed: The package should have been registered");let at=this.tryWorkspaceByLocator(H);if(at){if(at.anchoredLocator.locatorHash!==ce.locatorHash&&fe.has(at.anchoredLocator.locatorHash))return!1;ne.add(at.anchoredLocator.locatorHash)}ne.add(At)}}return!0};for(;fe.size>0;){let ce=fe.size,ne=[];for(let ee of fe){let Ie=this.storedPackages.get(ee);if(!Ie)throw new Error("Assertion failed: The package should have been registered");if(!Pe(Ie))continue;let Fe=x.get(Ie.locatorHash);if(!Fe)throw new Error("Assertion failed: The build directive should have been registered");let At=we(Ie,Fe.buildLocations);if(this.storedBuildState.get(Ie.locatorHash)===At){g.set(Ie.locatorHash,At),fe.delete(ee);continue}Ee||(await this.persistInstallStateFile(),Ee=!0),this.storedBuildState.has(Ie.locatorHash)?r.reportInfo(8,`${qr(this.configuration,Ie)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${qr(this.configuration,Ie)} must be built because it never has been before or the last one failed`);let H=Fe.buildLocations.map(async at=>{if(!z.isAbsolute(at))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${at})`);for(let Re of Fe.buildDirectives){let ke=`# This file contains the result of Yarn building a package (${ba(Ie)}) +`;switch(Re.type){case 0:ke+=`# Script name: ${Re.script} +`;break;case 1:ke+=`# Script code: ${Re.script} +`;break}let xe=null;if(!await oe.mktempPromise(async Te=>{let Ve=z.join(Te,"build.log"),{stdout:qe,stderr:b}=this.configuration.getSubprocessStreams(Ve,{header:ke,prefix:qr(this.configuration,Ie),report:r}),w;try{switch(Re.type){case 0:w=await Wb(Ie,Re.script,[],{cwd:at,project:this,stdin:xe,stdout:qe,stderr:b});break;case 1:w=await EU(Ie,Re.script,[],{cwd:at,project:this,stdin:xe,stdout:qe,stderr:b});break}}catch(F){b.write(F.stack),w=1}if(qe.end(),b.end(),w===0)return!0;oe.detachTemp(Te);let S=`${qr(this.configuration,Ie)} couldn't be built successfully (exit code ${Ut(this.configuration,w,yt.NUMBER)}, logs can be found here: ${Ut(this.configuration,Ve,yt.PATH)})`,y=this.optionalBuilds.has(Ie.locatorHash);return y?r.reportInfo(9,S):r.reportError(9,S),zce&&r.reportFold(le.fromPortablePath(Ve),oe.readFileSync(Ve,"utf8")),y}))return!1}return!0});ne.push(...H,Promise.allSettled(H).then(at=>{fe.delete(ee),at.every(Re=>Re.status==="fulfilled"&&Re.value===!0)&&g.set(Ie.locatorHash,At)}))}if(await _c(ne),ce===fe.size){let ee=Array.from(fe).map(Ie=>{let Fe=this.storedPackages.get(Ie);if(!Fe)throw new Error("Assertion failed: The package should have been registered");return qr(this.configuration,Fe)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ee})`);break}}this.storedBuildState=g,this.skippedBuilds=N}async installWithNewReport(e,r){return(await Lt.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get("nodeLinker");Ke.telemetry?.reportInstall(r);let o=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&e.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),o=!0}})}),o)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,I]of E)for(let v of I)v.status="inactive";let n=z.join(this.cwd,dr.lockfile),u=null;if(e.immutable)try{u=await oe.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new Jt(28,"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()=>{FAt(this,e.report);for(let[,E]of a)for(let[,I]of E)for(let v of I)if(v.userProvided){let x=Ut(this.configuration,v,yt.PACKAGE_EXTENSION);switch(v.status){case"inactive":e.report.reportWarning(68,`${x}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${x}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(u!==null){let E=Hg(u,this.generateLockfile());if(E!==u){let I=fpe(n,n,u,E,void 0,void 0,{maxEditLength:100});if(I){e.report.reportSeparator();for(let v of I.hunks){e.report.reportInfo(null,`@@ -${v.oldStart},${v.oldLines} +${v.newStart},${v.newLines} @@`);for(let x of v.lines)x.startsWith("+")?e.report.reportError(28,Ut(this.configuration,x,yt.ADDED)):x.startsWith("-")?e.report.reportError(28,Ut(this.configuration,x,yt.REMOVED)):e.report.reportInfo(null,Ut(this.configuration,x,"grey"))}e.report.reportSeparator()}throw new Jt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,I]of E)for(let v of I)v.userProvided&&v.status==="active"&&Ke.telemetry?.reportPackageExtension(Cd(v,yt.PACKAGE_EXTENSION));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e)});let A=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(A.map(async E=>NS(E,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Ut(this.configuration,"mode=update-lockfile",yt.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(A.map(async I=>NS(I,{cwd:this.cwd})));for(let I=0;I{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,u]of this.storedResolutions.entries()){let A=e.get(u);A||e.set(u,A=new Set),A.add(n)}let r={},{cacheKey:o}=Nr.getCacheKey(this.configuration);r.__metadata={version:tk,cacheKey:o};for(let[n,u]of e.entries()){let A=this.originalPackages.get(n);if(!A)continue;let p=[];for(let I of u){let v=this.storedDescriptors.get(I);if(!v)throw new Error("Assertion failed: The descriptor should have been registered");p.push(v)}let h=p.map(I=>Sa(I)).sort().join(", "),E=new Ot;E.version=A.linkType==="HARD"?A.version:"0.0.0-use.local",E.languageName=A.languageName,E.dependencies=new Map(A.dependencies),E.peerDependencies=new Map(A.peerDependencies),E.dependenciesMeta=new Map(A.dependenciesMeta),E.peerDependenciesMeta=new Map(A.peerDependenciesMeta),E.bin=new Map(A.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:A.linkType.toLowerCase(),resolution:ba(A),checksum:this.storedChecksums.get(A.locatorHash),conditions:A.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Ba(r)}async persistLockfile(){let e=z.join(this.cwd,dr.lockfile),r="";try{r=await oe.readFilePromise(e,"utf8")}catch{}let o=this.generateLockfile(),a=Hg(r,o);a!==r&&(await oe.writeFilePromise(e,a),this.lockFileChecksum=Vpe(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(b_))e.push(...u);let r=(0,$x.default)(this,e),o=x_.default.serialize(r),a=Js(o);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await oe.mkdirPromise(z.dirname(n),{recursive:!0}),await oe.writeFilePromise(n,await xAt(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let u=await kAt(await oe.readFilePromise(a));n=x_.default.deserialize(u),this.installStateChecksum=Js(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,$x.default)(n,b_.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,$x.default)(n,b_.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Qi}),await this.persistInstallStateFile()}async persist(){let e=(0,ek.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let o=new Set([".gitignore"]);if(!CM(e.cwd,this.cwd)||!await oe.existsPromise(e.cwd))return null;let a=[];for(let u of await oe.readdirPromise(e.cwd)){if(o.has(u))continue;let A=z.resolve(e.cwd,u);e.markedFiles.has(A)||(e.immutable?r.reportError(56,`${Ut(this.configuration,z.basename(A),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(oe.lstatPromise(A).then(async p=>(await oe.removePromise(A),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((u,A)=>u+A,0)}}}});function RAt(t){let o=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),u=n+a,A=t.state.lastTips??o*864e5,p=A+864e5+8*36e5-t.timeZone,h=u<=t.timeNow,E=p<=t.timeNow,I=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(I={},I.lastUpdate=h?t.timeNow:n,I.lastTips=A,I.blocks=h?{}:t.state.blocks,I.displayedTips=t.state.displayedTips),{nextState:I,triggerUpdate:h,triggerTips:E,nextTips:E?o*864e5:A}}var uC,Zpe=Et(()=>{Pt();N1();ih();Ib();Gl();Qf();uC=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let o=this.getRegistryPath();this.isNew=!oe.existsSync(o),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),o=A=>A&&rn?kf(rn,A):!1,a=e.map((A,p)=>p).filter(A=>e[A]&&o(e[A]?.selector));if(a.length===0)return null;let n=a.filter(A=>!r.has(A));if(n.length===0){let A=Math.floor(a.length*.2);this.displayedTips=A>0?this.displayedTips.slice(-A):[],n=a.filter(p=>!r.has(p))}let u=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(u),this.commitTips(),e[u]}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){yd(this.values,e).add(r)}reportEnumerator(e,r){yd(this.enumerators,e).add(Js(r))}reportHit(e,r="*"){let o=Wy(this.hits,e),a=al(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return z.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),o;try{o=oe.readJsonSync(r)}catch{o={}}let{nextState:a,triggerUpdate:n,triggerTips:u,nextTips:A}=RAt({state:o,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=A,this.displayedTips=o.displayedTips??[],a!==null)try{oe.mkdirSync(z.dirname(r),{recursive:!0}),oe.writeJsonSync(r,a)}catch{return!1}if(u&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=o.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=I=>O4(h,I,{configuration:this.configuration}).catch(()=>{});for(let[I,v]of Object.entries(o.blocks??{})){if(Object.keys(v).length===0)continue;let x=v;x.userId=I,x.reportType="primary";for(let N of Object.keys(x.enumerators??{}))x.enumerators[N]=x.enumerators[N].length;E(x);let C=new Map,R=20;for(let[N,U]of Object.entries(x.values))U.length>0&&C.set(N,U.slice(0,R));for(;C.size>0;){let N={};N.userId=I,N.reportType="secondary",N.metrics={};for(let[U,V]of C)N.metrics[U]=V.shift(),V.length===0&&C.delete(U);E(N)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=oe.readJsonSync(e)}catch{r={}}let o=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of["values","enumerators"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),oe.mkdirSync(z.dirname(e),{recursive:!0}),oe.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var o2={};zt(o2,{BuildDirectiveType:()=>zx,CACHE_CHECKPOINT:()=>c_,CACHE_VERSION:()=>Kx,Cache:()=>Nr,Configuration:()=>Ke,DEFAULT_RC_FILENAME:()=>j4,FormatType:()=>kle,InstallMode:()=>hl,LEGACY_PLUGINS:()=>v1,LOCKFILE_VERSION:()=>tk,LegacyMigrationResolver:()=>oC,LightReport:()=>fA,LinkType:()=>Jy,LockfileResolver:()=>aC,Manifest:()=>Ot,MessageName:()=>wr,MultiFetcher:()=>hE,PackageExtensionStatus:()=>vN,PackageExtensionType:()=>BN,PeerWarningType:()=>rk,Project:()=>St,Report:()=>Xs,ReportError:()=>Jt,SettingsType:()=>D1,StreamReport:()=>Lt,TAG_REGEXP:()=>FE,TelemetryManager:()=>uC,ThrowReport:()=>Qi,VirtualFetcher:()=>gE,WindowsLinkType:()=>xb,Workspace:()=>cC,WorkspaceFetcher:()=>mE,WorkspaceResolver:()=>Xn,YarnVersion:()=>rn,execUtils:()=>Ur,folderUtils:()=>YS,formatUtils:()=>de,hashUtils:()=>wn,httpUtils:()=>nn,miscUtils:()=>_e,nodeUtils:()=>Vi,parseMessageName:()=>AP,reportOptionDeprecations:()=>NE,scriptUtils:()=>un,semverUtils:()=>kr,stringifyMessageName:()=>Ku,structUtils:()=>W,tgzUtils:()=>Xi,treeUtils:()=>$s});var Ye=Et(()=>{Db();WS();jl();ih();Ib();Gl();vb();BU();Qf();bo();Zfe();spe();u_();P1();P1();ape();A_();lpe();f_();fE();fP();cM();Xpe();Wl();O1();Zpe();P_();AM();fM();Dd();S_();N1();Cne()});var ihe=_((z_t,l2)=>{"use strict";var LAt=process.env.TERM_PROGRAM==="Hyper",NAt=process.platform==="win32",the=process.platform==="linux",F_={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},rhe=Object.assign({},F_,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),nhe=Object.assign({},F_,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:the?"\u25B8":"\u276F",pointerSmall:the?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});l2.exports=NAt&&!LAt?rhe:nhe;Reflect.defineProperty(l2.exports,"common",{enumerable:!1,value:F_});Reflect.defineProperty(l2.exports,"windows",{enumerable:!1,value:rhe});Reflect.defineProperty(l2.exports,"other",{enumerable:!1,value:nhe})});var zc=_((V_t,R_)=>{"use strict";var OAt=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),MAt=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,she=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let u=n.open=`\x1B[${n.codes[0]}m`,A=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let I=u+h+A;return E?I.replace(/\r*\n/g,`${A}$&${u}`):I},n},r=(n,u,A)=>typeof n=="function"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let A=""+n,p=A.includes(` +`),h=u.length;for(h>0&&u.includes("unstyle")&&(u=[...new Set(["unstyle",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=MAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u=="string"?t[u]:u;if(typeof A!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!OAt(n))throw new TypeError("Expected theme to be an object");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=ihe(),t.define=a,t};R_.exports=she();R_.exports.create=she});var Lo=_(sn=>{"use strict";var UAt=Object.prototype.toString,nc=zc(),ohe=!1,T_=[],ahe={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};sn.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);sn.hasColor=t=>!!t&&nc.hasColor(t);var ik=sn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);sn.nativeType=t=>UAt.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");sn.isAsyncFn=t=>sn.nativeType(t)==="asyncfunction";sn.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";sn.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;sn.scrollDown=(t=[])=>[...t.slice(1),t[0]];sn.scrollUp=(t=[])=>[t.pop(),...t];sn.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};sn.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};sn.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};sn.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:o=` +`+r,width:a=80}=e,n=(o+r).match(/[^\S\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,"g"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(o)};sn.unmute=t=>{let e=t.stack.find(o=>nc.keys.color.includes(o));return e?nc[e]:t.stack.find(o=>o.slice(2)==="bg")?nc[e.slice(2)]:o=>o};sn.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";sn.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>nc.keys.color.includes(o));if(e){let o=nc["bg"+sn.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)==="bg");return r?nc[r.slice(2).toLowerCase()]||t:nc.none};sn.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>nc.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)==="bg");if(e&&!r)return nc[ahe[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=ahe[o];return a&&nc["bg"+sn.pascal(a)]||t}return nc.none};sn.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+o};sn.set=(t={},e="",r)=>e.split(".").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!sn.isObject(A)&&n{let o=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return o??r};sn.mixin=(t,e)=>{if(!ik(t))return e;if(!ik(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&ik(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);ik(a.value)?t[r]=sn.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};sn.merge=(...t)=>{let e={};for(let r of t)sn.mixin(e,r);return e};sn.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a=="function"?sn.define(t,o,a.bind(e)):sn.define(t,o,a)}};sn.onExit=t=>{let e=(r,o)=>{ohe||(ohe=!0,T_.forEach(a=>a()),r===!0&&process.exit(128+o))};T_.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),T_.push(t)};sn.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};sn.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var lhe=_(hC=>{"use strict";hC.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"};hC.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};hC.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};hC.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};hC.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"}});var Ahe=_((Z_t,uhe)=>{"use strict";var che=ve("readline"),_At=lhe(),HAt=/^(?:\x1b)([a-zA-Z0-9])$/,qAt=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,GAt={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"};function jAt(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function YAt(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var sk=(t="",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=o.sequence||""),o.sequence=o.sequence||t||o.name,t==="\r")o.raw=void 0,o.name="return";else if(t===` +`)o.name="enter";else if(t===" ")o.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")o.name="backspace",o.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")o.name="escape",o.meta=t.length===2;else if(t===" "||t==="\x1B ")o.name="space",o.meta=t.length===2;else if(t<="")o.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),o.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")o.name="number";else if(t.length===1&&t>="a"&&t<="z")o.name=t;else if(t.length===1&&t>="A"&&t<="Z")o.name=t.toLowerCase(),o.shift=!0;else if(r=HAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=qAt.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=GAt[n],o.shift=jAt(n)||o.shift,o.ctrl=YAt(n)||o.ctrl}return o};sk.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let o=che.createInterface({terminal:!0,input:r});che.emitKeypressEvents(r,o);let a=(A,p)=>e(A,sk(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),o.pause(),o.close()}};sk.action=(t,e,r)=>{let o={..._At,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};uhe.exports=sk});var phe=_(($_t,fhe)=>{"use strict";fhe.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let o=e[r];typeof o=="number"&&(o={interval:o}),WAt(t,r,o)}};function WAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,"interval",{value:n}),t.once("close",()=>o.stop()),o.stop}});var ghe=_((e8t,hhe)=>{"use strict";var{define:KAt,width:zAt}=Lo(),L_=class{constructor(e){let r=e.options;KAt(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=zAt(r.stdout||process.stdout),Object.assign(this,r),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 r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};hhe.exports=L_});var mhe=_((t8t,dhe)=>{"use strict";var N_=Lo(),eo=zc(),O_={default:eo.noop,noop:eo.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||N_.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||N_.complement(this.primary)},primary:eo.cyan,success:eo.green,danger:eo.magenta,strong:eo.bold,warning:eo.yellow,muted:eo.dim,disabled:eo.gray,dark:eo.dim.gray,underline:eo.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};O_.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(eo.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(eo.visible=t.styles.visible);let e=N_.merge({},O_,t.styles);delete e.merge;for(let r of Object.keys(eo))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});for(let r of Object.keys(eo.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});return e};dhe.exports=O_});var Ehe=_((r8t,yhe)=>{"use strict";var M_=process.platform==="win32",zf=zc(),VAt=Lo(),U_={...zf.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:zf.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:zf.symbols.question,submitted:zf.symbols.check,cancelled:zf.symbols.cross},separator:{pending:zf.symbols.pointerSmall,submitted:zf.symbols.middot,cancelled:zf.symbols.middot},radio:{off:M_?"( )":"\u25EF",on:M_?"(*)":"\u25C9",disabled:M_?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};U_.merge=t=>{let e=VAt.merge({},zf.symbols,U_,t.symbols);return delete e.merge,e};yhe.exports=U_});var whe=_((n8t,Che)=>{"use strict";var JAt=mhe(),XAt=Ehe(),ZAt=Lo();Che.exports=t=>{t.options=ZAt.merge({},t.options.theme,t.options),t.symbols=XAt.merge(t.options),t.styles=JAt.merge(t.options)}});var Phe=_((vhe,Dhe)=>{"use strict";var Ihe=process.env.TERM_PROGRAM==="Apple_Terminal",$At=zc(),__=Lo(),Vc=Dhe.exports=vhe,Di="\x1B[",Bhe="\x07",H_=!1,bh=Vc.code={bell:Bhe,beep:Bhe,beginning:`${Di}G`,down:`${Di}J`,esc:Di,getPosition:`${Di}6n`,hide:`${Di}?25l`,line:`${Di}2K`,lineEnd:`${Di}K`,lineStart:`${Di}1K`,restorePosition:Di+(Ihe?"8":"u"),savePosition:Di+(Ihe?"7":"s"),screen:`${Di}2J`,show:`${Di}?25h`,up:`${Di}1J`},Yd=Vc.cursor={get hidden(){return H_},hide(){return H_=!0,bh.hide},show(){return H_=!1,bh.show},forward:(t=1)=>`${Di}${t}C`,backward:(t=1)=>`${Di}${t}D`,nextLine:(t=1)=>`${Di}E`.repeat(t),prevLine:(t=1)=>`${Di}F`.repeat(t),up:(t=1)=>t?`${Di}${t}A`:"",down:(t=1)=>t?`${Di}${t}B`:"",right:(t=1)=>t?`${Di}${t}C`:"",left:(t=1)=>t?`${Di}${t}D`:"",to(t,e){return e?`${Di}${e+1};${t+1}H`:`${Di}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Yd.left(-t):t>0?Yd.right(t):"",r+=e<0?Yd.up(-e):e>0?Yd.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=__.isPrimitive(o)?String(o):"",a=__.isPrimitive(a)?String(a):"",A=__.isPrimitive(A)?String(A):"",u){let p=Vc.cursor.up(u)+Vc.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Vc.cursor.left(h)),p}if(A||e){let p=!a&&!!o?-o.length:-a.length+r;return e&&(p-=e.length),a===""&&o&&!n.includes(o)&&(p+=o.length),Vc.cursor.move(p)}}},q_=Vc.erase={screen:bh.screen,up:bh.up,down:bh.down,line:bh.line,lineEnd:bh.lineEnd,lineStart:bh.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return q_.line+Yd.to(0);let r=n=>[...$At.unstyle(n)].length,o=t.split(/\r?\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(q_.line+Yd.prevLine()).repeat(a-1)+q_.line+Yd.to(0)}});var gC=_((i8t,bhe)=>{"use strict";var eft=ve("events"),She=zc(),G_=Ahe(),tft=phe(),rft=ghe(),nft=whe(),Ra=Lo(),Wd=Phe(),c2=class extends eft{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,nft(this),tft(this),this.state=new rft(this),this.initial=[e.initial,e.default].find(r=>r!=null),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=sft(this.options.margin),this.setMaxListeners(0),ift(this)}async keypress(e,r={}){this.keypressed=!0;let o=G_.action(e,G_(e,r),this.options.actions);this.state.keypress=o,this.emit("keypress",e,o),this.emit("state",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Wd.code.beep)}cursorHide(){this.stdout.write(Wd.cursor.hide()),Ra.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Wd.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Wd.cursor.down(e)+Wd.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n="",input:u="",value:A=""}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Wd.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=She.unstyle(o);let a=She.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(` +`),h=p[0],E=p[p.length-1],v=(o+(r?" "+r:"")).length,x=ve.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let I=await this.resolve(E,n,r,o);return!I&&r&&r[e]?this.resolve(h,n,r,o):I}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Ra.isObject(e)&&(e=e[o.status]||e.pending),Ra.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Ra.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Ra.isObject(n)&&(n=n[o.status]||n.pending),Ra.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element("pointer",e,r);if(typeof o=="string"&&Ra.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?"on":"off"]||o,this.state),p=Ra.hasColor(A)?A:u(A);return n?p:" ".repeat(A.length)}}async indicator(e,r){let o=await this.element("indicator",e,r);if(typeof o=="string"&&Ra.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?"on":"off"]||o;return Ra.hasColor(A)?A:u(A)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Ra.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 this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Ra.resolve(this,e,...r)}get base(){return c2.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Ra.height(this.stdout,25)}get width(){return this.options.columns||Ra.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:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function ift(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function sft(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` +`:" ",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push("")}return o}bhe.exports=c2});var Qhe=_((s8t,khe)=>{"use strict";var oft=Lo(),xhe={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return xhe.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};khe.exports=(t,e={})=>{let r=oft.merge({},xhe,e.roles);return r[t]||r.default}});var u2=_((o8t,The)=>{"use strict";var aft=zc(),lft=gC(),cft=Qhe(),ok=Lo(),{reorder:j_,scrollUp:uft,scrollDown:Aft,isObject:Fhe,swap:fft}=ok,Y_=class extends lft{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(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");Fhe(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u=="function"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=cft(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)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=r,e.cursor=0,ok.define(e,"parent",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+" ":e.indent||""),e.path=o?o.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,aft.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.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(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return Rhe(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 r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=j_(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(I=>!h.includes(I));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num="",o(p)};if(n==="0"||n.length===1&&Number(n+"0")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=j_(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=j_(this.choices);return this.choices=r.slice(e).concat(r.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,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=uft(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=Aft(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return 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){fft(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(o=>e[o]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e=="function"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if(Fhe(e))return r?e[r]:e;let a=typeof e=="function"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}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(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=ok.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return Rhe(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:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&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&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function Rhe(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(ok.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}The.exports=Y_});var xh=_((a8t,Lhe)=>{"use strict";var pft=u2(),W_=Lo(),K_=class extends pft{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);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,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!W_.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),u=await this.resolve(e.hint,this.state,e,r);u&&!W_.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(W_.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let o=this.margin[0]+r.join(` +`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(` +`)}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:r}=this.state,o="",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,""].join(" "),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,I].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Lhe.exports=K_});var Ohe=_((l8t,Nhe)=>{"use strict";var hft=xh(),gft=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},z_=class extends hft{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:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.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,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}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(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=gft(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};Nhe.exports=z_});var J_=_((c8t,Mhe)=>{"use strict";var V_=Lo();Mhe.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:o="",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=V_.inverse(t.styles.primary),h=R=>p(t.styles.black(R)),E=r,I=" ",v=h(I);if(t.blink&&t.blink.off===!0&&(h=R=>R,v=""),n&&a===0&&o===""&&r==="")return h(I);if(n&&a===0&&(r===o||r===""))return h(o[0])+A(o.slice(1));o=V_.isPrimitive(o)?`${o}`:"",r=V_.isPrimitive(r)?`${r}`:"";let x=o&&o.startsWith(r)&&o!==r,C=x?h(o[r.length]):v;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=""),n===!1&&(C=""),x){let R=t.styles.unstyle(E+C);return E+C+A(o.slice(R.length))}return E+C}});var ak=_((u8t,Uhe)=>{"use strict";var dft=zc(),mft=xh(),yft=J_(),X_=class extends mft{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+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,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?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?"\u29BF":"\u2299"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||":";return o?" "+this.styles.disabled(o):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u="",name:A,hint:p,input:h=""}=e,{muted:E,submitted:I,primary:v,danger:x}=a,C=p,R=this.index===r,N=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),V=e.message;this.align==="right"&&(V=V.padStart(this.longest+1," ")),this.align==="left"&&(V=V.padEnd(this.longest+1," "));let te=this.values[A]=h||u,ae=h?"success":"dark";await N.call(e,te,this.state)!==!0&&(ae="danger");let fe=a[ae],ue=fe(await this.indicator(e,r))+(e.pad||""),me=this.indent(e),he=()=>[me,ue,V+U,h,C].filter(Boolean).join(" ");if(o.submitted)return V=dft.unstyle(V),h=I(h),C="",he();if(e.format)h=await e.format.call(this,h,e,r);else{let Be=this.styles.muted;h=yft(this,{input:h,initial:u,pos:n,showCursor:R,color:Be})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,te,e,r)),R&&(V=v(V)),e.error?h+=(h?" ":"")+x(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),he()}async submit(){return this.value=this.values,super.base.submit.call(this)}};Uhe.exports=X_});var Z_=_((A8t,Hhe)=>{"use strict";var Eft=ak(),Cft=()=>{throw new Error("expected prompt to have a custom authenticate method")},_he=(t=Cft)=>{class e extends Eft{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return _he(o)}}return e};Hhe.exports=_he()});var jhe=_((f8t,Ghe)=>{"use strict";var wft=Z_();function Ift(t,e){return t.username===this.options.username&&t.password===this.options.password}var qhe=(t=Ift)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends wft.create(t){constructor(a){super({...a,choices:e})}static create(a){return qhe(a)}}return r};Ghe.exports=qhe()});var lk=_((p8t,Yhe)=>{"use strict";var Bft=gC(),{isPrimitive:vft,hasColor:Dft}=Lo(),$_=class extends Bft{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:r,state:o}=this;return o.submitted?r.success(e):r.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 vft(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return Dft(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(" ");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),I=await this.error()||await this.hint(),v=await this.footer();I&&!A.includes(I)&&(E+=" "+I),A+=" "+E,this.clear(r),this.write([p,A,v].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};Yhe.exports=$_});var Khe=_((h8t,Whe)=>{"use strict";var Pft=lk(),e8=class extends Pft{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};Whe.exports=e8});var Vhe=_((g8t,zhe)=>{"use strict";var Sft=xh(),bft=ak(),dC=bft.prototype,t8=class extends Sft{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():dC.dispatch.call(this,e,r)}append(e,r){return dC.append.call(this,e,r)}delete(e,r){return dC.delete.call(this,e,r)}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?dC.next.call(this):super.next()}prev(){return this.focused.editable?dC.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||"",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?dC.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};zhe.exports=t8});var Kd=_((d8t,Jhe)=>{"use strict";var xft=gC(),kft=J_(),{isPrimitive:Qft}=Lo(),r8=class extends xft{constructor(e){super(e),this.initial=Qft(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!o||o.name!=="return")?this.append(` +`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.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(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=o,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=this.initial!=null?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 r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):kft(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(" ");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=" "+p),n+=" "+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(` +`)),this.restore()}};Jhe.exports=r8});var Zhe=_((m8t,Xhe)=>{"use strict";var Fft=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),ck=t=>Fft(t).filter(Boolean);Xhe.exports=(t,e={},r="")=>{let{past:o=[],present:a=""}=e,n,u;switch(t){case"prev":case"undo":return n=o.slice(0,o.length-1),u=o[o.length-1]||"",{past:ck([r,...n]),present:u};case"next":case"redo":return n=o.slice(1),u=o[0]||"",{past:ck([...n,r]),present:u};case"save":return{past:ck([...o,r]),present:""};case"remove":return u=ck(o.filter(A=>A!==r)),a="",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var i8=_((y8t,e0e)=>{"use strict";var Rft=Kd(),$he=Zhe(),n8=class extends Rft{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=$he(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=$he("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};e0e.exports=n8});var r0e=_((E8t,t0e)=>{"use strict";var Tft=Kd(),s8=class extends Tft{format(){return""}};t0e.exports=s8});var i0e=_((C8t,n0e)=>{"use strict";var Lft=Kd(),o8=class extends Lft{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:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};n0e.exports=o8});var o0e=_((w8t,s0e)=>{"use strict";var Nft=xh(),a8=class extends Nft{constructor(e){super({...e,multiple:!0})}};s0e.exports=a8});var c8=_((I8t,a0e)=>{"use strict";var Oft=Kd(),l8=class extends Oft{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=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?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 r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return othis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};a0e.exports=l8});var c0e=_((B8t,l0e)=>{l0e.exports=c8()});var A0e=_((v8t,u0e)=>{"use strict";var Mft=Kd(),u8=class extends Mft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};u0e.exports=u8});var h0e=_((D8t,p0e)=>{"use strict";var Uft=zc(),_ft=u2(),f0e=Lo(),A8=class extends _ft{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||` + `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o=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(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(o=>` ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(` +`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join("").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),A=" ".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!f0e.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\s+$/,"").padEnd(this.widths[0]," "),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),I=this.margin[1]+this.margin[3];this.scaleLength=Uft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-I.length);let x=f0e.wordWrap(h,{width:this.widths[0],newline:A}).split(` +`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),x=x.map(C=>this.styles.info(C))),x[0]+=E,this.linebreak&&x.push(""),[p+a,x.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(" "))].join(` +`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u="";this.options.promptLine!==!1&&(u=[o,n,a,""].join(" "),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),I=await this.renderChoices(),v=await this.footer(),x=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=" "+E),e&&!p&&!I.trim()&&this.multiple&&x!=null&&(u+=this.styles.danger(x)),this.clear(r),this.write([A,u,h,I,v].filter(Boolean).join(` +`)),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)}};p0e.exports=A8});var m0e=_((P8t,d0e)=>{"use strict";var g0e=zc(),Hft=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",p8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Hft(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},qft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,I=()=>n[++E],v=()=>n[E+1],x=C=>{C.line=h,u.push(C)};for(x({type:"bos",value:""});Eae.name===U.key);U.field=a.find(ae=>ae.name===U.key),te||(te=new p8(U),A.push(te)),te.lines.push(U.line-1);continue}let R=u[u.length-1];R.type==="text"&&R.line===h?R.value+=C:x({type:"text",value:C})}return x({type:"eos",value:""}),{input:n,tabstops:u,unique:o,keys:p,items:A}};d0e.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await qft(e,o),A=f8("result",t,e),p=f8("format",t,e),h=f8("validate",t,e,!0),E=t.isValue.bind(t);return async(I={},v=!1)=>{let x=0;I.required=r,I.items=n,I.keys=u,I.output="";let C=async(V,te,ae,fe)=>{let ue=await h(V,te,ae,fe);return ue===!1?"Invalid field "+ae.name:ue};for(let V of a){let te=V.value,ae=V.key;if(V.type!=="template"){te&&(I.output+=te);continue}if(V.type==="template"){let fe=n.find(we=>we.name===ae);e.required===!0&&I.required.add(fe.name);let ue=[fe.input,I.values[fe.value],fe.value,te].find(E),he=(fe.field||{}).message||V.inner;if(v){let we=await C(I.values[ae],I,fe,x);if(we&&typeof we=="string"||we===!1){I.invalid.set(ae,we);continue}I.invalid.delete(ae);let g=await A(I.values[ae],I,fe,x);I.output+=g0e.unstyle(g);continue}fe.placeholder=!1;let Be=te;te=await p(te,I,fe,x),ue!==te?(I.values[ae]=ue,te=t.styles.typing(ue),I.missing.delete(he)):(I.values[ae]=void 0,ue=`<${he}>`,te=t.styles.primary(ue),fe.placeholder=!0,I.required.has(ae)&&I.missing.add(he)),I.missing.has(he)&&I.validating&&(te=t.styles.warning(ue)),I.invalid.has(ae)&&I.validating&&(te=t.styles.danger(ue)),x===I.index&&(Be!==te?te=t.styles.underline(te):te=t.styles.heading(g0e.unstyle(te))),x++}te&&(I.output+=te)}let R=I.output.split(` +`).map(V=>" "+V),N=n.length,U=0;for(let V of n)I.invalid.has(V.name)&&V.lines.forEach(te=>{R[te][0]===" "&&(R[te]=I.styles.danger(I.symbols.bullet)+R[te].slice(1))}),t.isValue(I.values[V.name])&&U++;return I.completed=(U/N*100).toFixed(0),I.output=R.join(` +`),I.output}};function f8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]=="function"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var E0e=_((S8t,y0e)=>{"use strict";var Gft=zc(),jft=m0e(),Yft=gC(),h8=class extends Yft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await jft(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={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,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 r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,` +`].find(V=>V!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),I=await this.error()||"",v=await this.hint()||"",x=o?"":await this.interpolate(this.state),C=this.state.key=r[e]||"",R=await this.format(C),N=await this.footer();R&&(h+=" "+R),v&&!R&&this.state.completed===0&&(h+=" "+v),this.clear(a);let U=[E,h,x,N,I.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A="";for(let[p,h]of e)A+=`Invalid ${p}: ${h} +`;return this.state.error=A,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let u=Gft.unstyle(o).split(` +`).map(A=>A.slice(1)).join(` +`);return this.value={values:a,result:u},super.submit()}};y0e.exports=h8});var w0e=_((b8t,C0e)=>{"use strict";var Wft="(Use + to sort)",Kft=xh(),g8=class extends Kft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Wft].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};C0e.exports=g8});var B0e=_((x8t,I0e)=>{"use strict";var zft=u2(),d8=class extends zft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=Vft(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,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,r){await this.onChoice(e,r);let o=this.index===r,a=this.term==="Hyper",n=a?9:8,u=a?"":" ",A=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=te=>(te?this.styles.success("\u25C9"):"\u25EF")+u,E=r+1+".",I=o?this.styles.heading:this.styles.noop,v=await this.resolve(e.message,this.state,e,r),x=this.indent(e),C=x+e.scale.map((te,ae)=>h(ae===e.scaleIdx)).join(A),R=te=>te===e.scaleIdx?I(te):te,N=x+e.scale.map((te,ae)=>R(ae)).join(p),U=()=>[E,v].filter(Boolean).join(" "),V=()=>[U(),C,N," "].filter(Boolean).join(` +`);return o&&(C=this.styles.cyan(C),N=this.styles.cyan(N)),V()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` +`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(" ");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();(p||!h)&&(u+=" "+p),h&&!u.includes(h)&&(u+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,I].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function Vft(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o{v0e.exports=i8()});var S0e=_((Q8t,P0e)=>{"use strict";var Jft=lk(),m8=class extends Jft{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(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)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="",r){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=o=>this.styles.primary.underline(o);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,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(" ");this.state.prompt=h,A&&!h.includes(A)&&(h+=" "+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};P0e.exports=m8});var x0e=_((F8t,b0e)=>{"use strict";var Xft=xh(),y8=class extends Xft{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>o.length)throw new Error("Please specify the index of the correct answer from the list of choices");return o}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)}}};b0e.exports=y8});var Q0e=_(E8=>{"use strict";var k0e=Lo(),As=(t,e)=>{k0e.defineExport(E8,t,e),k0e.defineExport(E8,t.toLowerCase(),e)};As("AutoComplete",()=>Ohe());As("BasicAuth",()=>jhe());As("Confirm",()=>Khe());As("Editable",()=>Vhe());As("Form",()=>ak());As("Input",()=>i8());As("Invisible",()=>r0e());As("List",()=>i0e());As("MultiSelect",()=>o0e());As("Numeral",()=>c0e());As("Password",()=>A0e());As("Scale",()=>h0e());As("Select",()=>xh());As("Snippet",()=>E0e());As("Sort",()=>w0e());As("Survey",()=>B0e());As("Text",()=>D0e());As("Toggle",()=>S0e());As("Quiz",()=>x0e())});var R0e=_((T8t,F0e)=>{F0e.exports={ArrayPrompt:u2(),AuthPrompt:Z_(),BooleanPrompt:lk(),NumberPrompt:c8(),StringPrompt:Kd()}});var f2=_((L8t,L0e)=>{"use strict";var T0e=ve("assert"),w8=ve("events"),kh=Lo(),Jc=class extends w8{constructor(e,r){super(),this.options=kh.merge({},e),this.answers={...r}}register(e,r){if(kh.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}T0e.equal(typeof r,"function","expected a function");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(kh.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=kh.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=kh;if(typeof o=="function"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];T0e(this.prompts[o],`Prompt "${o}" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on("submit",E=>{this.emit("answer",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill==="show"&&await A.submit()):p=A.value=await A.run(),p}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||gC()}static get prompts(){return Q0e()}static get types(){return R0e()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return kh.mixinEmitter(e,new w8),e}};kh.mixinEmitter(Jc,new w8);var C8=Jc.prompts;for(let t of Object.keys(C8)){let e=t.toLowerCase(),r=o=>new C8[t](o).run();Jc.prompt[e]=r,Jc[e]=r,Jc[t]||Reflect.defineProperty(Jc,t,{get:()=>C8[t]})}var A2=t=>{kh.defineExport(Jc,t,()=>Jc.types[t])};A2("ArrayPrompt");A2("AuthPrompt");A2("BooleanPrompt");A2("NumberPrompt");A2("StringPrompt");L0e.exports=Jc});var d2=_((mHt,q0e)=>{var npt=Jx();function ipt(t,e,r){var o=t==null?void 0:npt(t,e);return o===void 0?r:o}q0e.exports=ipt});var Y0e=_((BHt,j0e)=>{function spt(t,e){for(var r=-1,o=t==null?0:t.length;++r{var opt=md(),apt=VP();function lpt(t,e){return t&&opt(e,apt(e),t)}W0e.exports=lpt});var V0e=_((DHt,z0e)=>{var cpt=md(),upt=jy();function Apt(t,e){return t&&cpt(e,upt(e),t)}z0e.exports=Apt});var X0e=_((PHt,J0e)=>{var fpt=md(),ppt=GP();function hpt(t,e){return fpt(t,ppt(t),e)}J0e.exports=hpt});var S8=_((SHt,Z0e)=>{var gpt=qP(),dpt=eS(),mpt=GP(),ypt=KL(),Ept=Object.getOwnPropertySymbols,Cpt=Ept?function(t){for(var e=[];t;)gpt(e,mpt(t)),t=dpt(t);return e}:ypt;Z0e.exports=Cpt});var ege=_((bHt,$0e)=>{var wpt=md(),Ipt=S8();function Bpt(t,e){return wpt(t,Ipt(t),e)}$0e.exports=Bpt});var b8=_((xHt,tge)=>{var vpt=WL(),Dpt=S8(),Ppt=jy();function Spt(t){return vpt(t,Ppt,Dpt)}tge.exports=Spt});var nge=_((kHt,rge)=>{var bpt=Object.prototype,xpt=bpt.hasOwnProperty;function kpt(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&xpt.call(t,"index")&&(r.index=t.index,r.input=t.input),r}rge.exports=kpt});var sge=_((QHt,ige)=>{var Qpt=ZP();function Fpt(t,e){var r=e?Qpt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}ige.exports=Fpt});var age=_((FHt,oge)=>{var Rpt=/\w*$/;function Tpt(t){var e=new t.constructor(t.source,Rpt.exec(t));return e.lastIndex=t.lastIndex,e}oge.exports=Tpt});var fge=_((RHt,Age)=>{var lge=hd(),cge=lge?lge.prototype:void 0,uge=cge?cge.valueOf:void 0;function Lpt(t){return uge?Object(uge.call(t)):{}}Age.exports=Lpt});var hge=_((THt,pge)=>{var Npt=ZP(),Opt=sge(),Mpt=age(),Upt=fge(),_pt=aN(),Hpt="[object Boolean]",qpt="[object Date]",Gpt="[object Map]",jpt="[object Number]",Ypt="[object RegExp]",Wpt="[object Set]",Kpt="[object String]",zpt="[object Symbol]",Vpt="[object ArrayBuffer]",Jpt="[object DataView]",Xpt="[object Float32Array]",Zpt="[object Float64Array]",$pt="[object Int8Array]",eht="[object Int16Array]",tht="[object Int32Array]",rht="[object Uint8Array]",nht="[object Uint8ClampedArray]",iht="[object Uint16Array]",sht="[object Uint32Array]";function oht(t,e,r){var o=t.constructor;switch(e){case Vpt:return Npt(t);case Hpt:case qpt:return new o(+t);case Jpt:return Opt(t,r);case Xpt:case Zpt:case $pt:case eht:case tht:case rht:case nht:case iht:case sht:return _pt(t,r);case Gpt:return new o;case jpt:case Kpt:return new o(t);case Ypt:return Mpt(t);case Wpt:return new o;case zpt:return Upt(t)}}pge.exports=oht});var dge=_((LHt,gge)=>{var aht=jI(),lht=Ju(),cht="[object Map]";function uht(t){return lht(t)&&aht(t)==cht}gge.exports=uht});var Cge=_((NHt,Ege)=>{var Aht=dge(),fht=YP(),mge=WP(),yge=mge&&mge.isMap,pht=yge?fht(yge):Aht;Ege.exports=pht});var Ige=_((OHt,wge)=>{var hht=jI(),ght=Ju(),dht="[object Set]";function mht(t){return ght(t)&&hht(t)==dht}wge.exports=mht});var Pge=_((MHt,Dge)=>{var yht=Ige(),Eht=YP(),Bge=WP(),vge=Bge&&Bge.isSet,Cht=vge?Eht(vge):yht;Dge.exports=Cht});var x8=_((UHt,kge)=>{var wht=_P(),Iht=Y0e(),Bht=tS(),vht=K0e(),Dht=V0e(),Pht=oN(),Sht=$P(),bht=X0e(),xht=ege(),kht=XL(),Qht=b8(),Fht=jI(),Rht=nge(),Tht=hge(),Lht=lN(),Nht=ql(),Oht=UI(),Mht=Cge(),Uht=sl(),_ht=Pge(),Hht=VP(),qht=jy(),Ght=1,jht=2,Yht=4,Sge="[object Arguments]",Wht="[object Array]",Kht="[object Boolean]",zht="[object Date]",Vht="[object Error]",bge="[object Function]",Jht="[object GeneratorFunction]",Xht="[object Map]",Zht="[object Number]",xge="[object Object]",$ht="[object RegExp]",e0t="[object Set]",t0t="[object String]",r0t="[object Symbol]",n0t="[object WeakMap]",i0t="[object ArrayBuffer]",s0t="[object DataView]",o0t="[object Float32Array]",a0t="[object Float64Array]",l0t="[object Int8Array]",c0t="[object Int16Array]",u0t="[object Int32Array]",A0t="[object Uint8Array]",f0t="[object Uint8ClampedArray]",p0t="[object Uint16Array]",h0t="[object Uint32Array]",ri={};ri[Sge]=ri[Wht]=ri[i0t]=ri[s0t]=ri[Kht]=ri[zht]=ri[o0t]=ri[a0t]=ri[l0t]=ri[c0t]=ri[u0t]=ri[Xht]=ri[Zht]=ri[xge]=ri[$ht]=ri[e0t]=ri[t0t]=ri[r0t]=ri[A0t]=ri[f0t]=ri[p0t]=ri[h0t]=!0;ri[Vht]=ri[bge]=ri[n0t]=!1;function Ak(t,e,r,o,a,n){var u,A=e&Ght,p=e&jht,h=e&Yht;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!Uht(t))return t;var E=Nht(t);if(E){if(u=Rht(t),!A)return Sht(t,u)}else{var I=Fht(t),v=I==bge||I==Jht;if(Oht(t))return Pht(t,A);if(I==xge||I==Sge||v&&!a){if(u=p||v?{}:Lht(t),!A)return p?xht(t,Dht(u,t)):bht(t,vht(u,t))}else{if(!ri[I])return a?t:{};u=Tht(t,I,A)}}n||(n=new wht);var x=n.get(t);if(x)return x;n.set(t,u),_ht(t)?t.forEach(function(N){u.add(Ak(N,e,r,N,t,n))}):Mht(t)&&t.forEach(function(N,U){u.set(U,Ak(N,e,r,U,t,n))});var C=h?p?Qht:kht:p?qht:Hht,R=E?void 0:C(t);return Iht(R||t,function(N,U){R&&(U=N,N=t[U]),Bht(u,U,Ak(N,e,r,U,t,n))}),u}kge.exports=Ak});var k8=_((_Ht,Qge)=>{var g0t=x8(),d0t=1,m0t=4;function y0t(t){return g0t(t,d0t|m0t)}Qge.exports=y0t});var Q8=_((HHt,Fge)=>{var E0t=I_();function C0t(t,e,r){return t==null?t:E0t(t,e,r)}Fge.exports=C0t});var Oge=_((KHt,Nge)=>{var w0t=Object.prototype,I0t=w0t.hasOwnProperty;function B0t(t,e){return t!=null&&I0t.call(t,e)}Nge.exports=B0t});var Uge=_((zHt,Mge)=>{var v0t=Oge(),D0t=B_();function P0t(t,e){return t!=null&&D0t(t,e,v0t)}Mge.exports=P0t});var Hge=_((VHt,_ge)=>{function S0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}_ge.exports=S0t});var Gge=_((JHt,qge)=>{var b0t=Jx(),x0t=pU();function k0t(t,e){return e.length<2?t:b0t(t,x0t(e,0,-1))}qge.exports=k0t});var R8=_((XHt,jge)=>{var Q0t=jd(),F0t=Hge(),R0t=Gge(),T0t=lC();function L0t(t,e){return e=Q0t(e,t),t=R0t(t,e),t==null||delete t[T0t(F0t(e))]}jge.exports=L0t});var T8=_((ZHt,Yge)=>{var N0t=R8();function O0t(t,e){return t==null?!0:N0t(t,e)}Yge.exports=O0t});var Jge=_((S6t,_0t)=>{_0t.exports={name:"@yarnpkg/cli",version:"4.2.2",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^3.2.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},peerDependencies:{"@yarnpkg/core":"workspace:^"},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",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var G8=_((i9t,lde)=>{"use strict";lde.exports=function(e,r){r===!0&&(r=0);var o="";if(typeof e=="string")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var ude=_((s9t,cde)=>{"use strict";var sgt=G8();function ogt(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=sgt(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}cde.exports=ogt});var pde=_((o9t,fde)=>{"use strict";var agt=ude();function lgt(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var cgt=lgt(agt),ugt="text/plain",Agt="us-ascii",Ade=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),fgt=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(";");n=e?"":n;let A=!1;u[u.length-1]==="base64"&&(u.pop(),A=!0);let p=(u.shift()||"").toLowerCase(),E=[...u.map(I=>{let[v,x=""]=I.split("=").map(C=>C.trim());return v==="charset"&&(x=x.toLowerCase(),x===Agt)?"":`${v}${x?`=${x}`:""}`}).filter(Boolean)];return A&&E.push("base64"),(E.length>0||p&&p!==ugt)&&E.unshift(p),`data:${E.join(";")},${A?a.trim():a}${n?`#${n}`:""}`};function pgt(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return fgt(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let u=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,A=0,p="";for(;;){let E=u.exec(a.pathname);if(!E)break;let I=E[0],v=E.index,x=a.pathname.slice(A,v);p+=x.replace(/\/{2,}/g,"/"),p+=I,A=v+I.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split("/"),A=u[u.length-1];Ade(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])Ade(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var j8=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!="string"||!t.trim())&&o("Invalid url."),t.length>j8.MAX_INPUT_LENGTH&&o("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=pgt(t,e));let a=cgt.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o("URL parsing failed.")}return a};j8.MAX_INPUT_LENGTH=2048;fde.exports=j8});var dde=_((a9t,gde)=>{"use strict";var hgt=G8();function hde(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=hgt(t);if(t=t.substring(t.indexOf("://")+3),hde(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var ggt=pde(),mde=dde();function dgt(t){var e=ggt(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),mde(e.protocols)||e.protocols.length===0&&mde(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}yde.exports=dgt});var wde=_((c9t,Cde)=>{"use strict";var mgt=Ede();function Y8(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=mgt(t),o=r.resource.split("."),a=null;switch(r.toString=function(N){return Y8.stringify(this,N)},r.source=o.length>2?o.slice(1-o.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=o[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var u=a.indexOf("-",2),A=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),I=a.indexOf("raw",2),v=a.indexOf("edit",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:I>0?I-1:v>0?v-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var x=a.length>n&&a[n+1]==="-"?n+1:n;a.length>x+2&&["raw","src","blob","tree","edit"].indexOf(a[x+1])>=0&&(r.filepathtype=a[x+1],r.ref=a[x+2],a.length>x+3&&(r.filepath=a.slice(x+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var C=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,R=C.exec(r.pathname);return R!=null&&(r.source="bitbucket-server",R[1]==="users"?r.owner="~"+R[2]:r.owner=R[2],r.organization=r.owner,r.name=R[3],a=R[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}Y8.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",o=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+o+"@"+t.resource+r+"/"+t.full_name+a:o+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+o+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?ygt(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+Egt(t)+a;default:return t.href}};function ygt(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function Egt(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}Cde.exports=Y8});var Ode=_((q5t,Nde)=>{var kgt=Hb(),Qgt=$P(),Fgt=ql(),Rgt=pE(),Tgt=w_(),Lgt=lC(),Ngt=L1();function Ogt(t){return Fgt(t)?kgt(t,Lgt):Rgt(t)?[t]:Qgt(Tgt(Ngt(t)))}Nde.exports=Ogt});function Hgt(t,e){return e===1&&_gt.has(t[0])}function B2(t){let e=Array.isArray(t)?t:(0,_de.default)(t);return e.map((o,a)=>Mgt.test(o)?`[${o}]`:Ugt.test(o)&&!Hgt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join("").replace(/^\./,"")}function qgt(t,e){let r=[];if(e.methodName!==null&&r.push(de.pretty(t,e.methodName,de.Type.CODE)),e.file!==null){let o=[];o.push(de.pretty(t,e.file,de.Type.PATH)),e.line!==null&&(o.push(de.pretty(t,e.line,de.Type.NUMBER)),e.column!==null&&o.push(de.pretty(t,e.column,de.Type.NUMBER))),r.push(`(${o.join(de.pretty(t,":","grey"))})`)}return r.join(" ")}function gk(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){let a=new Map,n=new Map,u=[...r.keys()].map(A=>[A,new Map]);for(let[A,p]of[...u,...e]){let h=r.get(A)?.map(x=>({text:x,fixable:!1}))??[],E=!1,I=t.getWorkspaceByCwd(A),v=I.manifest.exportTo({});for(let[x,C]of p){if(C.size>1){let R=[...C].map(([N,U])=>{let V=de.pretty(t.configuration,N,de.Type.INSPECT),te=U.size>0?qgt(t.configuration,U.values().next().value):null;return te!==null?` +${V} at ${te}`:` +${V}`}).join("");h.push({text:`Conflict detected in constraint targeting ${de.pretty(t.configuration,x,de.Type.CODE)}; conflicting values are:${R}`,fixable:!1})}else{let[[R]]=C,N=(0,Mde.default)(v,x);if(JSON.stringify(N)===JSON.stringify(R))continue;if(!o){let U=typeof N>"u"?`Missing field ${de.pretty(t.configuration,x,de.Type.CODE)}; expected ${de.pretty(t.configuration,R,de.Type.INSPECT)}`:typeof R>"u"?`Extraneous field ${de.pretty(t.configuration,x,de.Type.CODE)} currently set to ${de.pretty(t.configuration,N,de.Type.INSPECT)}`:`Invalid field ${de.pretty(t.configuration,x,de.Type.CODE)}; expected ${de.pretty(t.configuration,R,de.Type.INSPECT)}, found ${de.pretty(t.configuration,N,de.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof R>"u"?(0,Hde.default)(v,x):(0,Ude.default)(v,x,R),E=!0}E&&a.set(I,v)}h.length>0&&n.set(I,h)}return{changedWorkspaces:a,remainingErrors:n}}function qde(t,{configuration:e}){let r={children:[]};for(let[o,a]of t){let n=[];for(let A of a){let p=A.text.split(/\n/);A.fixable&&(p[0]=`${de.pretty(e,"\u2699","gray")} ${p[0]}`),n.push({value:de.tuple(de.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:de.tuple(de.Type.NO_HINT,h)}))})}let u={value:de.tuple(de.Type.LOCATOR,o.anchoredLocator),children:_e.sortMap(n,A=>A.value[1])};r.children.push(u)}return r.children=_e.sortMap(r.children,o=>o.value[1]),r}var Mde,Ude,_de,Hde,wC,Mgt,Ugt,_gt,v2=Et(()=>{Ye();Mde=$e(d2()),Ude=$e(Q8()),_de=$e(Ode()),Hde=$e(T8()),wC=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.hasOwn(e,r)?e[r]:void 0;if(typeof o>"u")continue;_e.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let I of a)E.has(I)||a.delete(I);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<"u"?Object.hasOwn(u,A)&&u[A]===p:Object.hasOwn(u,A)===!1))return!1;return!0})),n}},Mgt=/^[0-9]+$/,Ugt=/^[a-zA-Z0-9_]+$/,_gt=new Set(["scripts",...Ot.allDependencies])});var Gde=_((e7t,sH)=>{var Ggt;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else{var p=new t.type.Term("length",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;I--)E[I].equals(E[I-1])&&E.splice(I,1);for(var v=new t.type.Term("[]"),I=E.length-1;I>=0;I--)v=new t.type.Term(".",[E[I],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"msort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h=u;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=p.sort(t.compare),I=new t.type.Term("[]"),v=E.length-1;v>=0;v--)I=new t.type.Term(".",[E[v],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,A])),a.substitution,a)])}}},"keysort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h,E=u;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){o.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type("list",u,n.indicator));else{for(var I=p.sort(t.compare),v=new t.type.Term("[]"),x=I.length-1;x>=0;x--)v=new t.type.Term(".",[new t.type.Term("-",[I[x],I[x].pair]),v]),delete I[x].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,A])),a.substitution,a)])}}},"take/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator==="./2";)E.push(I.args[0]),I=I.args[1],h--;if(h===0){for(var v=new t.type.Term("[]"),h=E.length-1;h>=0;h--)v=new t.type.Term(".",[E[h],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[v,p])),a.substitution,a)])}}},"drop/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator==="./2";)E.push(I.args[0]),I=I.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,p])),a.substitution,a)])}},"reverse/2":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type("list",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,I=new t.type.Term("[]",[]);E.indicator==="./2";)I=new t.type.Term(".",[E.args[0],I]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[I,p?A:u])),a.substitution,a)])}},"list_to_set/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=[],I=new t.type.Term("[]",[]),v,x=0;x=0;x--)I=new t.type.Term(".",[E[x],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[A,I])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof sH<"u"?sH.exports=function(o){t=o,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(Ggt)});var ime=_(Yr=>{"use strict";var em=process.platform==="win32",oH="aes-256-cbc",jgt="sha256",Wde="The current environment doesn't support interactive reading from TTY.",Yn=ve("fs"),jde=process.binding("tty_wrap").TTY,lH=ve("child_process"),u0=ve("path"),cH={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Jf="none",Zc,BC,Yde=!1,c0,mk,aH,Ygt=0,hH="",$d=[],yk,Kde=!1,uH=!1,D2=!1;function zde(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(o){return"#"+o.charCodeAt(0)+";"})}return mk.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&o.push("--"+a):r[a]==="string"&&t[a]&&o.push("--"+a,e(t[a]))}),o}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function Wgt(t,e){function r(U){var V,te="",ae;for(aH=aH||ve("os").tmpdir();;){V=u0.join(aH,U+te);try{ae=Yn.openSync(V,"wx")}catch(fe){if(fe.code==="EEXIST"){te++;continue}else throw fe}Yn.closeSync(ae);break}return V}var o,a,n,u={},A,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),I=r("readline-sync.exit"),v=r("readline-sync.done"),x=ve("crypto"),C,R,N;C=x.createHash(jgt),C.update(""+process.pid+Ygt+++Math.random()),N=C.digest("hex"),R=x.createDecipher(oH,N),o=zde(t),em?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+c0+"%Q%"+o.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+I+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+oH+"%Q% %Q%"+N+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+v+"%Q%"]):(a="/bin/sh",n=["-c",'("'+c0+'"'+o.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+I+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+oH+'" "'+N+'" >"'+h+'"; echo 1 >"'+v+'"']),D2&&D2("_execFileSync",o);try{lH.spawn(a,n,e)}catch(U){u.error=new Error(U.message),u.error.method="_execFileSync - spawn",u.error.program=a,u.error.args=n}for(;Yn.readFileSync(v,{encoding:t.encoding}).trim()!=="1";);return(A=Yn.readFileSync(I,{encoding:t.encoding}).trim())==="0"?u.input=R.update(Yn.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+R.final(t.encoding):(p=Yn.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(Wde+(p?` +`+p:"")),u.error.method="_execFileSync",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Yn.unlinkSync(h),Yn.unlinkSync(E),Yn.unlinkSync(I),Yn.unlinkSync(v),u}function Kgt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(c0||(em?process.env.PSModulePath?(c0="powershell.exe",mk=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(c0="cscript.exe",mk=["//nologo",__dirname+"\\read.cs.js"]):(c0="/bin/sh",mk=[__dirname+"/read.sh"])),em&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),lH.execFileSync){e=zde(t),D2&&D2("execFileSync",e);try{r.input=lH.execFileSync(c0,e,a)}catch(n){o=n.stderr?(n.stderr+"").trim():"",r.error=new Error(Wde+(o?` +`+o:"")),r.error.method="execFileSync",r.error.program=c0,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=Wgt(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function AH(t){var e="",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=Kgt(t);if(n.error)throw n.error;return n.input}return uH&&uH(t),function(){var n,u,A;function p(){return n||(n=process.binding("fs"),u=process.binding("constants")),n}if(typeof Jf=="string")if(Jf=null,em){if(A=function(h){var E=h.replace(/^\D+/,"").split("."),I=0;return(E[0]=+E[0])&&(I+=E[0]*1e4),(E[1]=+E[1])&&(I+=E[1]*100),(E[2]=+E[2])&&(I+=E[2]),I}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Jf=process.stdin.fd,BC=process.stdin._handle;else try{Jf=p().open("CONIN$",u.O_RDWR,parseInt("0666",8)),BC=new jde(Jf,!0)}catch{}if(process.stdout.isTTY)Zc=process.stdout.fd;else{try{Zc=Yn.openSync("\\\\.\\CON","w")}catch{}if(typeof Zc!="number")try{Zc=p().open("CONOUT$",u.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Jf=Yn.openSync("/dev/tty","r"),BC=process.stdin._handle}catch{}}else try{Jf=Yn.openSync("/dev/tty","r"),BC=new jde(Jf,!1)}catch{}if(process.stdout.isTTY)Zc=process.stdout.fd;else try{Zc=Yn.openSync("/dev/tty","w")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,I,v;yk="";function x(C){return C===Yde?!0:BC.setRawMode(C)!==0?!1:(Yde=C,!0)}if(Kde||!BC||typeof Zc!="number"&&(t.display||!A)){e=a();return}if(t.display&&(Yn.writeSync(Zc,t.display),t.display=""),!t.displayOnly){if(!x(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=Yn.readSync(Jf,p,0,h)}catch(C){if(C.code!=="EOF"){x(!1),e+=a();return}}if(E>0?(I=p.toString(t.encoding,0,E),yk+=I):(I=` +`,yk+=String.fromCharCode(0)),I&&typeof(v=(I.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(I=v,n=!0),I&&(I=I.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),I&&u&&(I=I.replace(u,"")),I&&(A||(t.hideEchoBack?t.mask&&Yn.writeSync(Zc,new Array(I.length+1).join(t.mask)):Yn.writeSync(Zc,I)),e+=I),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Yn.writeSync(Zc,` +`),x(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` +`),t.encoding),t.displayOnly?"":hH=t.keepWhitespace||t.keyIn?e:e.trim()}function zgt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function gH(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function Rs(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(cH),t.unshift(cH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(!!a.hasOwnProperty(n))switch(u=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":u=u!=null?u+"":"",u&&n!=="limitMessage"&&(u=u.replace(/[\r\n]/g,"")),o[n]=u;break;case"bufferSize":!isNaN(u=parseInt(u,10))&&typeof u=="number"&&(o[n]=u);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":o[n]=!!u;break;case"limit":case"trueValue":case"falseValue":o[n]=zgt(u,function(A){var p=typeof A;return p==="string"||p==="number"||p==="function"||A instanceof RegExp}).map(function(A){return typeof A=="string"?A.replace(/[\r\n]/g,""):A});break;case"print":case"phContent":case"preCheck":o[n]=typeof u=="function"?u:void 0;break;case"prompt":case"display":o[n]=u??"";break}})),o},{})}function fH(t,e,r){return e.some(function(o){var a=typeof o;return a==="string"?r?t===o:t.toLowerCase()===o.toLowerCase():a==="number"?parseFloat(t)===o:a==="function"?o(t):o instanceof RegExp?o.test(t):!1})}function dH(t,e){var r=u0.normalize(em?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=u0.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+gH(r)+"(?=\\/|\\\\|$)",em?"i":""),"~")}function vC(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",o=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(u,A,p,h,E,I){var v;return A||typeof(v=e(E))!="string"?p:v?(h||"")+v+(I||""):""}return t.replace(o,n).replace(a,n)}function Vde(t,e,r){var o,a=[],n=-1,u=0,A="",p;function h(E,I){return I.length>3?(E.push(I[0]+"..."+I[I.length-1]),p=!0):I.length&&(E=E.concat(I)),E}return o=t.reduce(function(E,I){return E.concat((I+"").split(""))},[]).reduce(function(E,I){var v,x;return e||(I=I.toLowerCase()),v=/^\d$/.test(I)?1:/^[A-Z]$/.test(I)?2:/^[a-z]$/.test(I)?3:0,r&&v===0?A+=I:(x=I.charCodeAt(0),v&&v===n&&x===u+1?a.push(I):(E=h(E,a),a=[I],n=v),u=x),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function Jde(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function Xde(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":o=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=Vde(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A==="string"||A==="number"}),r=Jde(o,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=hH;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=u0.basename(r):t==="cwdHome"&&(r=dH(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(u){return u.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=$d[$d.length-n]||"")}return r}function Zde(t){var e=/^(.)-(.)$/.exec(t),r="",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o +And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(x){return x==="charlist"?r.text:x==="length"?o+"..."+a:null}}),u,A,p,h,E,I,v;for(e=e||{},u=vC(e.charlist?e.charlist+"":"$",Zde),(isNaN(o=parseInt(e.min,10))||typeof o!="number")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+gH(u)+"]{"+o+","+a+"}$"),r=Vde([u],n.caseSensitive,!0),r.text=Jde(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!v;)n.limit=h,n.limitMessage=E,I=Yr.question(t,n),n.limit=[I,""],n.limitMessage=p,v=Yr.question(A,n);return I};function tme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o=="number"}return Yr.question(t,Rs({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),o}Yr.questionInt=function(t,e){return tme(t,e,function(r){return parseInt(r,10)})};Yr.questionFloat=function(t,e){return tme(t,e,parseFloat)};Yr.questionPath=function(t,e){var r,o="",a=Rs({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=dH(n,!0),o="";function h(E){E.split(/\/|\\/).reduce(function(I,v){var x=u0.resolve(I+=v+u0.sep);if(!Yn.existsSync(x))Yn.mkdirSync(x);else if(!Yn.statSync(x).isDirectory())throw new Error("Non directory already exists: "+x);return I},"")}try{if(u=Yn.existsSync(n),r=u?Yn.realpathSync(n):u0.resolve(n),!e.hasOwnProperty("exists")&&!u||typeof e.exists=="boolean"&&e.exists!==u)return o=(u?"Already exists":"No such file or directory")+": "+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(u0.dirname(r)),Yn.closeSync(Yn.openSync(r,"w"))),r=Yn.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Yn.statSync(r),e.isFile&&!A.isFile())return o="Not file: "+r,!1;if(e.isDirectory&&!A.isDirectory())return o="Not directory: "+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o="Size "+A.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(o=p),!1}catch(E){return o=E+"",!1}return!0},phContent:function(n){return n==="error"?o:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),Yr.question(t,a),r};function rme(t,e){var r={},o={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=pH(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty("_")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=pH(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}Yr.promptCL=function(t,e){var r=Rs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=rme(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,Yr.prompt(r),o.args};Yr.promptLoop=function(t,e){for(var r=Rs({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(Yr.prompt(r)););};Yr.promptCLLoop=function(t,e){var r=Rs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=rme(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;Yr.prompt(r),!o.hRes;);};Yr.promptSimShell=function(t){return Yr.prompt(Rs({hideEchoBack:!1,history:!0},t,{prompt:function(){return em?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function nme(t,e,r){var o;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),o=Yr.keyIn(t,Rs(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof o=="boolean"?o:""}Yr.keyInYN=function(t,e){return nme(t,e)};Yr.keyInYNStrict=function(t,e){return nme(t,e,"yn")};Yr.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),Yr.keyIn(t,Rs({limit:null},e,{hideEchoBack:!0,mask:""}))};Yr.keyInSelect=function(t,e,r){var o=Rs({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},u=49,A=` +`;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+="["+E+"] "+(p+"").trim()+` +`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,A+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` +`),o.limit=a,A+=` +`,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),A+=e),n[Yr.keyIn(A,o).toLowerCase()]};Yr.getRawInput=function(){return yk};function P2(t,e){var r;return e.length&&(r={},r[t]=e[0]),Yr.setDefaultOptions(r)[t]}Yr.setPrint=function(){return P2("print",arguments)};Yr.setPrompt=function(){return P2("prompt",arguments)};Yr.setEncoding=function(){return P2("encoding",arguments)};Yr.setMask=function(){return P2("mask",arguments)};Yr.setBufferSize=function(){return P2("bufferSize",arguments)}});var mH=_((r7t,gl)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(w,S,y){var F=tau_file_system.files[w];if(!F){if(y==="read")return null;F={path:w,text:"",type:S,get:function(J,X){return X===this.text.length||X>this.text.length?"end_of_file":this.text.substring(X,X+J)},put:function(J,X){return X==="end_of_file"?(this.text+=J,!0):X==="past_end_of_file"?null:(this.text=this.text.substring(0,X)+J+this.text.substring(X+J.length),!0)},get_byte:function(J){if(J==="end_of_stream")return-1;var X=Math.floor(J/2);if(this.text.length<=X)return-1;var Z=n(this.text[Math.floor(J/2)],0);return J%2===0?Z&255:Z/256>>>0},put_byte:function(J,X){var Z=X==="end_of_stream"?this.text.length:Math.floor(X/2);if(this.text.length>>0,ie=(ie&255)<<8|J&255):(ie=ie&255,ie=(J&255)<<8|ie&255),this.text.length===Z?this.text+=u(ie):this.text=this.text.substring(0,Z)+u(ie)+this.text.substring(Z+1),!0},flush:function(){return!0},close:function(){var J=tau_file_system.files[this.path];return J?!0:null}},tau_file_system.files[w]=F}return y==="write"&&(F.text=""),F}},tau_user_input={buffer:"",get:function(w,S){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function N(w,S){return w.get_flag("char_conversion").id==="on"?S.replace(/./g,function(y){return w.get_char_conversion(y)}):S}function U(w){this.thread=w,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var S,y=0,F=0,J=0,X=[],Z=!1;if(w){var ie=this.tokens[w-1];y=ie.len,S=N(this.thread,this.text.substr(ie.len)),F=ie.line,J=ie.start}else S=this.text;if(/^\s*$/.test(S))return null;for(;S!=="";){var be=[],Le=!1;if(/^\n/.exec(S)!==null){F++,J=0,y++,S=S.replace(/\n/,""),Z=!0;continue}for(var ot in R)if(R.hasOwnProperty(ot)){var dt=R[ot].exec(S);dt&&be.push({value:dt[0],name:ot,matches:dt})}if(!be.length)return this.set_last_tokens([{value:S,matches:[],name:"lexical",line:F,start:J}]);var ie=r(be,function(Qr,mr){return Qr.value.length>=mr.value.length?Qr:mr});switch(ie.start=J,ie.line=F,S=S.replace(ie.value,""),J+=ie.value.length,y+=ie.value.length,ie.name){case"atom":ie.raw=ie.value,ie.value.charAt(0)==="'"&&(ie.value=v(ie.value.substr(1,ie.value.length-2),"'"),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence"));break;case"number":ie.float=ie.value.substring(0,2)!=="0x"&&ie.value.match(/[.eE]/)!==null&&ie.value!=="0'.",ie.value=C(ie.value),ie.blank=Le;break;case"string":var Gt=ie.value.charAt(0);ie.value=v(ie.value.substr(1,ie.value.length-2),Gt),ie.value===null&&(ie.name="lexical",ie.value="unknown escape sequence");break;case"whitespace":var $t=X[X.length-1];$t&&($t.space=!0),Le=!0;continue;case"r_bracket":X.length>0&&X[X.length-1].name==="l_bracket"&&(ie=X.pop(),ie.name="atom",ie.value="{}",ie.raw="{}",ie.space=!1);break;case"r_brace":X.length>0&&X[X.length-1].name==="l_brace"&&(ie=X.pop(),ie.name="atom",ie.value="[]",ie.raw="[]",ie.space=!1);break}ie.len=y,X.push(ie),Le=!1}var bt=this.set_last_tokens(X);return bt.length===0?null:bt};function V(w,S,y,F,J){if(!S[y])return{type:A,value:b.error.syntax(S[y-1],"expression expected",!0)};var X;if(F==="0"){var Z=S[y];switch(Z.name){case"number":return{type:p,len:y+1,value:new b.type.Num(Z.value,Z.float)};case"variable":return{type:p,len:y+1,value:new b.type.Var(Z.value)};case"string":var ie;switch(w.get_flag("double_quotes").id){case"atom":ie=new H(Z.value,[]);break;case"codes":ie=new H("[]",[]);for(var be=Z.value.length-1;be>=0;be--)ie=new H(".",[new b.type.Num(n(Z.value,be),!1),ie]);break;case"chars":ie=new H("[]",[]);for(var be=Z.value.length-1;be>=0;be--)ie=new H(".",[new b.type.Term(Z.value.charAt(be),[]),ie]);break}return{type:p,len:y+1,value:ie};case"l_paren":var bt=V(w,S,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:S[bt.len]&&S[bt.len].name==="r_paren"?(bt.len++,bt):{type:A,derived:!0,value:b.error.syntax(S[bt.len]?S[bt.len]:S[bt.len-1],") or operator expected",!S[bt.len])};case"l_bracket":var bt=V(w,S,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:S[bt.len]&&S[bt.len].name==="r_bracket"?(bt.len++,bt.value=new H("{}",[bt.value]),bt):{type:A,derived:!0,value:b.error.syntax(S[bt.len]?S[bt.len]:S[bt.len-1],"} or operator expected",!S[bt.len])}}var Le=te(w,S,y,J);return Le.type===p||Le.derived||(Le=ae(w,S,y),Le.type===p||Le.derived)?Le:{type:A,derived:!1,value:b.error.syntax(S[y],"unexpected token")}}var ot=w.__get_max_priority(),dt=w.__get_next_priority(F),Gt=y;if(S[y].name==="atom"&&S[y+1]&&(S[y].space||S[y+1].name!=="l_paren")){var Z=S[y++],$t=w.__lookup_operator_classes(F,Z.value);if($t&&$t.indexOf("fy")>-1){var bt=V(w,S,y,F,J);if(bt.type!==A)return Z.value==="-"&&!Z.space&&b.type.is_number(bt.value)?{value:new b.type.Num(-bt.value.value,bt.value.is_float),len:bt.len,type:p}:{value:new b.type.Term(Z.value,[bt.value]),len:bt.len,type:p};X=bt}else if($t&&$t.indexOf("fx")>-1){var bt=V(w,S,y,dt,J);if(bt.type!==A)return{value:new b.type.Term(Z.value,[bt.value]),len:bt.len,type:p};X=bt}}y=Gt;var bt=V(w,S,y,dt,J);if(bt.type===p){y=bt.len;var Z=S[y];if(S[y]&&(S[y].name==="atom"&&w.__lookup_operator_classes(F,Z.value)||S[y].name==="bar"&&w.__lookup_operator_classes(F,"|"))){var an=dt,Qr=F,$t=w.__lookup_operator_classes(F,Z.value);if($t.indexOf("xf")>-1)return{value:new b.type.Term(Z.value,[bt.value]),len:++bt.len,type:p};if($t.indexOf("xfx")>-1){var mr=V(w,S,y+1,an,J);return mr.type===p?{value:new b.type.Term(Z.value,[bt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if($t.indexOf("xfy")>-1){var mr=V(w,S,y+1,Qr,J);return mr.type===p?{value:new b.type.Term(Z.value,[bt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if(bt.type!==A)for(;;){y=bt.len;var Z=S[y];if(Z&&Z.name==="atom"&&w.__lookup_operator_classes(F,Z.value)){var $t=w.__lookup_operator_classes(F,Z.value);if($t.indexOf("yf")>-1)bt={value:new b.type.Term(Z.value,[bt.value]),len:++y,type:p};else if($t.indexOf("yfx")>-1){var mr=V(w,S,++y,an,J);if(mr.type===A)return mr.derived=!0,mr;y=mr.len,bt={value:new b.type.Term(Z.value,[bt.value,mr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:b.error.syntax(S[bt.len-1],"operator expected")};return bt}return bt}function te(w,S,y,F){if(!S[y]||S[y].name==="atom"&&S[y].raw==="."&&!F&&(S[y].space||!S[y+1]||S[y+1].name!=="l_paren"))return{type:A,derived:!1,value:b.error.syntax(S[y-1],"unfounded token")};var J=S[y],X=[];if(S[y].name==="atom"&&S[y].raw!==","){if(y++,S[y-1].space)return{type:p,len:y,value:new b.type.Term(J.value,X)};if(S[y]&&S[y].name==="l_paren"){if(S[y+1]&&S[y+1].name==="r_paren")return{type:A,derived:!0,value:b.error.syntax(S[y+1],"argument expected")};var Z=V(w,S,++y,"999",!0);if(Z.type===A)return Z.derived?Z:{type:A,derived:!0,value:b.error.syntax(S[y]?S[y]:S[y-1],"argument expected",!S[y])};for(X.push(Z.value),y=Z.len;S[y]&&S[y].name==="atom"&&S[y].value===",";){if(Z=V(w,S,y+1,"999",!0),Z.type===A)return Z.derived?Z:{type:A,derived:!0,value:b.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};X.push(Z.value),y=Z.len}if(S[y]&&S[y].name==="r_paren")y++;else return{type:A,derived:!0,value:b.error.syntax(S[y]?S[y]:S[y-1],", or ) expected",!S[y])}}return{type:p,len:y,value:new b.type.Term(J.value,X)}}return{type:A,derived:!1,value:b.error.syntax(S[y],"term expected")}}function ae(w,S,y){if(!S[y])return{type:A,derived:!1,value:b.error.syntax(S[y-1],"[ expected")};if(S[y]&&S[y].name==="l_brace"){var F=V(w,S,++y,"999",!0),J=[F.value],X=void 0;if(F.type===A)return S[y]&&S[y].name==="r_brace"?{type:p,len:y+1,value:new b.type.Term("[]",[])}:{type:A,derived:!0,value:b.error.syntax(S[y],"] expected")};for(y=F.len;S[y]&&S[y].name==="atom"&&S[y].value===",";){if(F=V(w,S,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:b.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};J.push(F.value),y=F.len}var Z=!1;if(S[y]&&S[y].name==="bar"){if(Z=!0,F=V(w,S,y+1,"999",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:b.error.syntax(S[y+1]?S[y+1]:S[y],"argument expected",!S[y+1])};X=F.value,y=F.len}return S[y]&&S[y].name==="r_brace"?{type:p,len:y+1,value:g(J,X)}:{type:A,derived:!0,value:b.error.syntax(S[y]?S[y]:S[y-1],Z?"] expected":", or | or ] expected",!S[y])}}return{type:A,derived:!1,value:b.error.syntax(S[y],"list expected")}}function fe(w,S,y){var F=S[y].line,J=V(w,S,y,w.__get_max_priority(),!1),X=null,Z;if(J.type!==A)if(y=J.len,S[y]&&S[y].name==="atom"&&S[y].raw===".")if(y++,b.type.is_term(J.value)){if(J.value.indicator===":-/2"?(X=new b.type.Rule(J.value.args[0],we(J.value.args[1])),Z={value:X,len:y,type:p}):J.value.indicator==="-->/2"?(X=he(new b.type.Rule(J.value.args[0],J.value.args[1]),w),X.body=we(X.body),Z={value:X,len:y,type:b.type.is_rule(X)?p:A}):(X=new b.type.Rule(J.value,null),Z={value:X,len:y,type:p}),X){var ie=X.singleton_variables();ie.length>0&&w.throw_warning(b.warning.singleton(ie,X.head.indicator,F))}return Z}else return{type:A,value:b.error.syntax(S[y],"callable expected")};else return{type:A,value:b.error.syntax(S[y]?S[y]:S[y-1],". or operator expected")};return J}function ue(w,S,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),J={},X;F.new_text(S);var Z=0,ie=F.get_tokens(Z);do{if(ie===null||!ie[Z])break;var be=fe(w,ie,Z);if(be.type===A)return new H("throw",[be.value]);if(be.value.body===null&&be.value.head.indicator==="?-/1"){var Le=new Ve(w.session);Le.add_goal(be.value.head.args[0]),Le.answer(function(dt){b.type.is_error(dt)?w.throw_warning(dt.args[0]):(dt===!1||dt===null)&&w.throw_warning(b.warning.failed_goal(be.value.head.args[0],be.len))}),Z=be.len;var ot=!0}else if(be.value.body===null&&be.value.head.indicator===":-/1"){var ot=w.run_directive(be.value.head.args[0]);Z=be.len,be.value.head.args[0].indicator==="char_conversion/2"&&(ie=F.get_tokens(Z),Z=0)}else{X=be.value.head.indicator,y.reconsult!==!1&&J[X]!==!0&&!w.is_multifile_predicate(X)&&(w.session.rules[X]=a(w.session.rules[X]||[],function(Gt){return Gt.dynamic}),J[X]=!0);var ot=w.add_rule(be.value,y);Z=be.len}if(!ot)return ot}while(!0);return!0}function me(w,S){var y=new U(w);y.new_text(S);var F=0;do{var J=y.get_tokens(F);if(J===null)break;var X=V(w,J,0,w.__get_max_priority(),!1);if(X.type!==A){var Z=X.len,ie=Z;if(J[Z]&&J[Z].name==="atom"&&J[Z].raw===".")w.add_goal(we(X.value));else{var be=J[Z];return new H("throw",[b.error.syntax(be||J[Z-1],". or operator expected",!be)])}F=X.len+1}else return new H("throw",[X.value])}while(!0);return!0}function he(w,S){w=w.rename(S);var y=S.next_free_variable(),F=Be(w.body,y,S);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new H(w.head.id,w.head.args),w)}function Be(w,S,y){var F;if(b.type.is_term(w)&&w.indicator==="!/0")return{value:w,variable:S,error:!1};if(b.type.is_term(w)&&w.indicator===",/2"){var J=Be(w.args[0],S,y);if(J.error)return J;var X=Be(w.args[1],J.variable,y);return X.error?X:{value:new H(",",[J.value,X.value]),variable:X.variable,error:!1}}else{if(b.type.is_term(w)&&w.indicator==="{}/1")return{value:w.args[0],variable:S,error:!1};if(b.type.is_empty_list(w))return{value:new H("true",[]),variable:S,error:!1};if(b.type.is_list(w)){F=y.next_free_variable();for(var Z=w,ie;Z.indicator==="./2";)ie=Z,Z=Z.args[1];return b.type.is_variable(Z)?{value:b.error.instantiation("DCG"),variable:S,error:!0}:b.type.is_empty_list(Z)?(ie.args[1]=F,{value:new H("=",[S,w]),variable:F,error:!1}):{value:b.error.type("list",w,"DCG"),variable:S,error:!0}}else return b.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([S,F]),w=new H(w.id,w.args),{value:w,variable:F,error:!1}):{value:b.error.type("callable",w,"DCG"),variable:S,error:!0}}}function we(w){return b.type.is_variable(w)?new H("call",[w]):b.type.is_term(w)&&[",/2",";/2","->/2"].indexOf(w.indicator)!==-1?new H(w.id,[we(w.args[0]),we(w.args[1])]):w}function g(w,S){for(var y=S||new b.type.Term("[]",[]),F=w.length-1;F>=0;F--)y=new b.type.Term(".",[w[F],y]);return y}function Ee(w,S){for(var y=w.length-1;y>=0;y--)w[y]===S&&w.splice(y,1)}function Pe(w){for(var S={},y=[],F=0;F=0;S--)if(w.charAt(S)==="/")return new H("/",[new H(w.substring(0,S)),new Fe(parseInt(w.substring(S+1)),!1)])}function Ie(w){this.id=w}function Fe(w,S){this.is_float=S!==void 0?S:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var At=0;function H(w,S,y){this.ref=y||++At,this.id=w,this.args=S||[],this.indicator=w+"/"+this.args.length}var at=0;function Re(w,S,y,F,J,X){this.id=at++,this.stream=w,this.mode=S,this.alias=y,this.type=F!==void 0?F:"text",this.reposition=J!==void 0?J:!0,this.eof_action=X!==void 0?X:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function ke(w){w=w||{},this.links=w}function xe(w,S,y){S=S||new ke,y=y||null,this.goal=w,this.substitution=S,this.parent=y}function He(w,S,y){this.head=w,this.body=S,this.dynamic=y||!1}function Te(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new Ve(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Re(typeof gl<"u"&&gl.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Re(typeof gl<"u"&&gl.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof gl<"u"&&gl.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(S){return S.substitution},this.format_error=function(S){return S.goal},this.flag={bounded:b.flag.bounded.value,max_integer:b.flag.max_integer.value,min_integer:b.flag.min_integer.value,integer_rounding_function:b.flag.integer_rounding_function.value,char_conversion:b.flag.char_conversion.value,debug:b.flag.debug.value,max_arity:b.flag.max_arity.value,unknown:b.flag.unknown.value,double_quotes:b.flag.double_quotes.value,occurs_check:b.flag.occurs_check.value,dialect:b.flag.dialect.value,version_data:b.flag.version_data.value,nodejs:b.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function Ve(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function qe(w,S,y){this.id=w,this.rules=S,this.exports=y,b.module[w]=this}qe.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},Ie.prototype.unify=function(w,S){if(S&&e(w.variables(),this.id)!==-1&&!b.type.is_variable(w))return null;var y={};return y[this.id]=w,new ke(y)},Fe.prototype.unify=function(w,S){return b.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new ke:null},H.prototype.unify=function(w,S){if(b.type.is_term(w)&&this.indicator===w.indicator){for(var y=new ke,F=0;F=0){var F=this.args[0].value,J=Math.floor(F/26),X=F%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[X]+(J!==0?J:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(w)+"}";case"./2":for(var Z="["+this.args[0].toString(w),ie=this.args[1];ie.indicator==="./2";)Z+=", "+ie.args[0].toString(w),ie=ie.args[1];return ie.indicator!=="[]/0"&&(Z+="|"+ie.toString(w)),Z+="]",Z;case",/2":return"("+this.args[0].toString(w)+", "+this.args[1].toString(w)+")";default:var be=this.id,Le=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Le===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(be)&&be!=="{}"&&be!=="[]"&&(be="'"+x(be)+"'"),be+(this.args.length?"("+o(this.args,function($t){return $t.toString(w)}).join(", ")+")":"");var ot=Le.priority>S.priority||Le.priority===S.priority&&(Le.class==="xfy"&&this.indicator!==S.indicator||Le.class==="yfx"&&this.indicator!==S.indicator||this.indicator===S.indicator&&Le.class==="yfx"&&y==="right"||this.indicator===S.indicator&&Le.class==="xfy"&&y==="left");Le.indicator=this.indicator;var dt=ot?"(":"",Gt=ot?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Le.class)!==-1?dt+be+" "+this.args[0].toString(w,Le)+Gt:["yf","xf"].indexOf(Le.class)!==-1?dt+this.args[0].toString(w,Le)+" "+be+Gt:dt+this.args[0].toString(w,Le,"left")+" "+this.id+" "+this.args[1].toString(w,Le,"right")+Gt}},Re.prototype.toString=function(w){return"("+this.id+")"},ke.prototype.toString=function(w){var S="{";for(var y in this.links)!this.links.hasOwnProperty(y)||(S!=="{"&&(S+=", "),S+=y+"/"+this.links[y].toString(w));return S+="}",S},xe.prototype.toString=function(w){return this.goal===null?"<"+this.substitution.toString(w)+">":"<"+this.goal.toString(w)+", "+this.substitution.toString(w)+">"},He.prototype.toString=function(w){return this.body?this.head.toString(w)+" :- "+this.body.toString(w)+".":this.head.toString(w)+"."},Te.prototype.toString=function(w){for(var S="",y=0;y=0;J--)F=new H(".",[S[J],F]);return F}return new H(this.id,o(this.args,function(X){return X.apply(w)}),this.ref)},Re.prototype.apply=function(w){return this},He.prototype.apply=function(w){return new He(this.head.apply(w),this.body!==null?this.body.apply(w):null)},ke.prototype.apply=function(w){var S,y={};for(S in this.links)!this.links.hasOwnProperty(S)||(y[S]=this.links[S].apply(w));return new ke(y)},H.prototype.select=function(){for(var w=this;w.indicator===",/2";)w=w.args[0];return w},H.prototype.replace=function(w){return this.indicator===",/2"?this.args[0].indicator===",/2"?new H(",",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new H(",",[w,this.args[1]]):w},H.prototype.search=function(w){if(b.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var S=0;SS&&F0&&(S=this.head_point().substitution.domain());e(S,b.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id==="_")return new Ie(b.format_variable(this.session.rename));this.session.renamed_variables[w.id]=b.format_variable(this.session.rename)}return new Ie(this.session.renamed_variables[w.id])},Te.prototype.next_free_variable=function(){return this.thread.next_free_variable()},Ve.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());e(w,b.format_variable(this.session.rename))!==-1;)this.session.rename++;return new Ie(b.format_variable(this.session.rename))},Te.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},Ve.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},Te.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},Ve.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},Te.prototype.prepend=function(w){return this.thread.prepend(w)},Ve.prototype.prepend=function(w){for(var S=w.length-1;S>=0;S--)this.points.push(w[S])},Te.prototype.success=function(w,S){return this.thread.success(w,S)},Ve.prototype.success=function(w,y){var y=typeof y>"u"?w:y;this.prepend([new xe(w.goal.replace(null),w.substitution,y)])},Te.prototype.throw_error=function(w){return this.thread.throw_error(w)},Ve.prototype.throw_error=function(w){this.prepend([new xe(new H("throw",[w]),new ke,null,null)])},Te.prototype.step_rule=function(w,S){return this.thread.step_rule(w,S)},Ve.prototype.step_rule=function(w,S){var y=S.indicator;if(w==="user"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:e(this.session.modules,w)===-1?[]:[w],J=0;J1)&&this.again()},Te.prototype.answers=function(w,S,y){return this.thread.answers(w,S,y)},Ve.prototype.answers=function(w,S,y){var F=S||1e3,J=this;if(S<=0){y&&y();return}this.answer(function(X){w(X),X!==!1?setTimeout(function(){J.answers(w,S-1,y)},1):y&&y()})},Te.prototype.again=function(w){return this.thread.again(w)},Ve.prototype.again=function(w){for(var S,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!b.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var J=this.__calls.shift();this.current_limit<=0?J(null):this.points.length===0?J(!1):b.type.is_error(this.head_point().goal)?(S=this.session.format_error(this.points.pop()),this.points=[],J(S)):(this.debugger&&this.debugger_states.push(this.head_point()),S=this.session.format_success(this.points.pop()),J(S))}},Te.prototype.unfold=function(w){if(w.body===null)return!1;var S=w.head,y=w.body,F=y.select(),J=new Ve(this),X=[];J.add_goal(F),J.step();for(var Z=J.points.length-1;Z>=0;Z--){var ie=J.points[Z],be=S.apply(ie.substitution),Le=y.replace(ie.goal);Le!==null&&(Le=Le.apply(ie.substitution)),X.push(new He(be,Le))}var ot=this.rules[S.indicator],dt=e(ot,w);return X.length>0&&dt!==-1?(ot.splice.apply(ot,[dt,1].concat(X)),!0):!1},Ve.prototype.unfold=function(w){return this.session.unfold(w)},Ie.prototype.interpret=function(w){return b.error.instantiation(w.level)},Fe.prototype.interpret=function(w){return this},H.prototype.interpret=function(w){return b.type.is_unitary_list(this)?this.args[0].interpret(w):b.operate(w,this)},Ie.prototype.compare=function(w){return this.idw.id?1:0},Fe.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.valuew.value)return 1},H.prototype.compare=function(w){if(this.args.lengthw.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var S=0;SF)return 1;if(w.constructor===Fe){if(w.is_float&&S.is_float)return 0;if(w.is_float)return-1;if(S.is_float)return 1}return 0},is_substitution:function(w){return w instanceof ke},is_state:function(w){return w instanceof xe},is_rule:function(w){return w instanceof He},is_variable:function(w){return w instanceof Ie},is_stream:function(w){return w instanceof Re},is_anonymous_var:function(w){return w instanceof Ie&&w.id==="_"},is_callable:function(w){return w instanceof H},is_number:function(w){return w instanceof Fe},is_integer:function(w){return w instanceof Fe&&!w.is_float},is_float:function(w){return w instanceof Fe&&w.is_float},is_term:function(w){return w instanceof H},is_atom:function(w){return w instanceof H&&w.args.length===0},is_ground:function(w){if(w instanceof Ie)return!1;if(w instanceof H){for(var S=0;S0},is_list:function(w){return w instanceof H&&(w.indicator==="[]/0"||w.indicator==="./2")},is_empty_list:function(w){return w instanceof H&&w.indicator==="[]/0"},is_non_empty_list:function(w){return w instanceof H&&w.indicator==="./2"},is_fully_list:function(w){for(;w instanceof H&&w.indicator==="./2";)w=w.args[1];return w instanceof Ie||w instanceof H&&w.indicator==="[]/0"},is_instantiated_list:function(w){for(;w instanceof H&&w.indicator==="./2";)w=w.args[1];return w instanceof H&&w.indicator==="[]/0"},is_unitary_list:function(w){return w instanceof H&&w.indicator==="./2"&&w.args[1]instanceof H&&w.args[1].indicator==="[]/0"},is_character:function(w){return w instanceof H&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof Fe&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof Fe&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof H&&b.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof H&&b.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof H&&b.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof H&&w.indicator==="throw/1"},is_predicate_indicator:function(w){return w instanceof H&&w.indicator==="//2"&&w.args[0]instanceof H&&w.args[0].args.length===0&&w.args[1]instanceof Fe&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof H&&w.args.length===0&&b.flag[w.id]!==void 0},is_value_flag:function(w,S){if(!b.type.is_flag(w))return!1;for(var y in b.flag[w.id].allowed)if(!!b.flag[w.id].allowed.hasOwnProperty(y)&&b.flag[w.id].allowed[y].equals(S))return!0;return!1},is_io_mode:function(w){return b.type.is_atom(w)&&["read","write","append"].indexOf(w.id)!==-1},is_stream_option:function(w){return b.type.is_term(w)&&(w.indicator==="alias/1"&&b.type.is_atom(w.args[0])||w.indicator==="reposition/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="type/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary")||w.indicator==="eof_action/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))},is_stream_position:function(w){return b.type.is_integer(w)&&w.value>=0||b.type.is_atom(w)&&(w.id==="end_of_stream"||w.id==="past_end_of_stream")},is_stream_property:function(w){return b.type.is_term(w)&&(w.indicator==="input/0"||w.indicator==="output/0"||w.indicator==="alias/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0]))||w.indicator==="file_name/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0]))||w.indicator==="position/1"&&(b.type.is_variable(w.args[0])||b.type.is_stream_position(w.args[0]))||w.indicator==="reposition/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))||w.indicator==="type/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary"))||w.indicator==="mode/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0])&&(w.args[0].id==="read"||w.args[0].id==="write"||w.args[0].id==="append"))||w.indicator==="eof_action/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))||w.indicator==="end_of_stream/1"&&(b.type.is_variable(w.args[0])||b.type.is_atom(w.args[0])&&(w.args[0].id==="at"||w.args[0].id==="past"||w.args[0].id==="not")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return b.type.is_term(w)&&["variables/1","variable_names/1","singletons/1"].indexOf(w.indicator)!==-1},is_write_option:function(w){return b.type.is_term(w)&&(w.indicator==="quoted/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="ignore_ops/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="numbervars/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))},is_close_option:function(w){return b.type.is_term(w)&&w.indicator==="force/1"&&b.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")},is_modifiable_flag:function(w){return b.type.is_flag(w)&&b.flag[w.id].changeable},is_module:function(w){return w instanceof H&&w.indicator==="library/1"&&w.args[0]instanceof H&&w.args[0].args.length===0&&b.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(w){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(w,S){return w}},"-/1":{type_args:null,type_result:null,fn:function(w,S){return-w}},"\\/1":{type_args:!1,type_result:!1,fn:function(w,S){return~w}},"abs/1":{type_args:null,type_result:null,fn:function(w,S){return Math.abs(w)}},"sign/1":{type_args:null,type_result:null,fn:function(w,S){return Math.sign(w)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(w,S){return parseInt(w)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(w,S){return w-parseInt(w)}},"float/1":{type_args:null,type_result:!0,fn:function(w,S){return parseFloat(w)}},"floor/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.floor(w)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(w,S){return parseInt(w)}},"round/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.round(w)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(w,S){return Math.ceil(w)}},"sin/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.sin(w)}},"cos/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.cos(w)}},"tan/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.tan(w)}},"asin/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.asin(w)}},"acos/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.acos(w)}},"atan/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.atan(w)}},"atan2/2":{type_args:null,type_result:!0,fn:function(w,S,y){return Math.atan2(w,S)}},"exp/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.exp(w)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(w,S){return Math.sqrt(w)}},"log/1":{type_args:null,type_result:!0,fn:function(w,S){return w>0?Math.log(w):b.error.evaluation("undefined",S.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(w,S,y){return w+S}},"-/2":{type_args:null,type_result:null,fn:function(w,S,y){return w-S}},"*/2":{type_args:null,type_result:null,fn:function(w,S,y){return w*S}},"//2":{type_args:null,type_result:!0,fn:function(w,S,y){return S?w/S:b.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?parseInt(w/S):b.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(w,S,y){return Math.pow(w,S)}},"^/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.pow(w,S)}},"<>/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w>>S}},"/\\/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w&S}},"\\//2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w|S}},"xor/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return w^S}},"rem/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?w%S:b.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(w,S,y){return S?w-parseInt(w/S)*S:b.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.max(w,S)}},"min/2":{type_args:null,type_result:null,fn:function(w,S,y){return Math.min(w,S)}}}},directive:{"dynamic/1":function(w,S){var y=S.args[0];if(b.type.is_variable(y))w.throw_error(b.error.instantiation(S.indicator));else if(!b.type.is_compound(y)||y.indicator!=="//2")w.throw_error(b.error.type("predicate_indicator",y,S.indicator));else if(b.type.is_variable(y.args[0])||b.type.is_variable(y.args[1]))w.throw_error(b.error.instantiation(S.indicator));else if(!b.type.is_atom(y.args[0]))w.throw_error(b.error.type("atom",y.args[0],S.indicator));else if(!b.type.is_integer(y.args[1]))w.throw_error(b.error.type("integer",y.args[1],S.indicator));else{var F=S.args[0].args[0].id+"/"+S.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},"multifile/1":function(w,S){var y=S.args[0];b.type.is_variable(y)?w.throw_error(b.error.instantiation(S.indicator)):!b.type.is_compound(y)||y.indicator!=="//2"?w.throw_error(b.error.type("predicate_indicator",y,S.indicator)):b.type.is_variable(y.args[0])||b.type.is_variable(y.args[1])?w.throw_error(b.error.instantiation(S.indicator)):b.type.is_atom(y.args[0])?b.type.is_integer(y.args[1])?w.session.multifile_predicates[S.args[0].args[0].id+"/"+S.args[0].args[1].value]=!0:w.throw_error(b.error.type("integer",y.args[1],S.indicator)):w.throw_error(b.error.type("atom",y.args[0],S.indicator))},"set_prolog_flag/2":function(w,S){var y=S.args[0],F=S.args[1];b.type.is_variable(y)||b.type.is_variable(F)?w.throw_error(b.error.instantiation(S.indicator)):b.type.is_atom(y)?b.type.is_flag(y)?b.type.is_value_flag(y,F)?b.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(b.error.permission("modify","flag",y)):w.throw_error(b.error.domain("flag_value",new H("+",[y,F]),S.indicator)):w.throw_error(b.error.domain("prolog_flag",y,S.indicator)):w.throw_error(b.error.type("atom",y,S.indicator))},"use_module/1":function(w,S){var y=S.args[0];if(b.type.is_variable(y))w.throw_error(b.error.instantiation(S.indicator));else if(!b.type.is_term(y))w.throw_error(b.error.type("term",y,S.indicator));else if(b.type.is_module(y)){var F=y.args[0].id;e(w.session.modules,F)===-1&&w.session.modules.push(F)}},"char_conversion/2":function(w,S){var y=S.args[0],F=S.args[1];b.type.is_variable(y)||b.type.is_variable(F)?w.throw_error(b.error.instantiation(S.indicator)):b.type.is_character(y)?b.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(b.error.type("character",F,S.indicator)):w.throw_error(b.error.type("character",y,S.indicator))},"op/3":function(w,S){var y=S.args[0],F=S.args[1],J=S.args[2];if(b.type.is_variable(y)||b.type.is_variable(F)||b.type.is_variable(J))w.throw_error(b.error.instantiation(S.indicator));else if(!b.type.is_integer(y))w.throw_error(b.error.type("integer",y,S.indicator));else if(!b.type.is_atom(F))w.throw_error(b.error.type("atom",F,S.indicator));else if(!b.type.is_atom(J))w.throw_error(b.error.type("atom",J,S.indicator));else if(y.value<0||y.value>1200)w.throw_error(b.error.domain("operator_priority",y,S.indicator));else if(J.id===",")w.throw_error(b.error.permission("modify","operator",J,S.indicator));else if(J.id==="|"&&(y.value<1001||F.id.length!==3))w.throw_error(b.error.permission("modify","operator",J,S.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(F.id)===-1)w.throw_error(b.error.domain("operator_specifier",F,S.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var Z in w.session.__operators)if(!!w.session.__operators.hasOwnProperty(Z)){var ie=w.session.__operators[Z][J.id];ie&&(e(ie,"fx")!==-1&&(X.prefix={priority:Z,type:"fx"}),e(ie,"fy")!==-1&&(X.prefix={priority:Z,type:"fy"}),e(ie,"xf")!==-1&&(X.postfix={priority:Z,type:"xf"}),e(ie,"yf")!==-1&&(X.postfix={priority:Z,type:"yf"}),e(ie,"xfx")!==-1&&(X.infix={priority:Z,type:"xfx"}),e(ie,"xfy")!==-1&&(X.infix={priority:Z,type:"xfy"}),e(ie,"yfx")!==-1&&(X.infix={priority:Z,type:"yfx"}))}var be;switch(F.id){case"fy":case"fx":be="prefix";break;case"yf":case"xf":be="postfix";break;default:be="infix";break}if(((X.prefix&&be==="prefix"||X.postfix&&be==="postfix"||X.infix&&be==="infix")&&X[be].type!==F.id||X.infix&&be==="postfix"||X.postfix&&be==="infix")&&y.value!==0)w.throw_error(b.error.permission("create","operator",J,S.indicator));else return X[be]&&(Ee(w.session.__operators[X[be].priority][J.id],F.id),w.session.__operators[X[be].priority][J.id].length===0&&delete w.session.__operators[X[be].priority][J.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][J.id]||(w.session.__operators[y.value][J.id]=[]),w.session.__operators[y.value][J.id].push(F.id)),!0}}},predicate:{"op/3":function(w,S,y){b.directive["op/3"](w,y)&&w.success(S)},"current_op/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2],Z=[];for(var ie in w.session.__operators)for(var be in w.session.__operators[ie])for(var Le=0;Le/2"){var F=w.points,J=w.session.format_success,X=w.session.format_error;w.session.format_success=function(Le){return Le.substitution},w.session.format_error=function(Le){return Le.goal},w.points=[new xe(y.args[0].args[0],S.substitution,S)];var Z=function(Le){w.points=F,w.session.format_success=J,w.session.format_error=X,Le===!1?w.prepend([new xe(S.goal.replace(y.args[1]),S.substitution,S)]):b.type.is_error(Le)?w.throw_error(Le.args[0]):Le===null?(w.prepend([S]),w.__calls.shift()(null)):w.prepend([new xe(S.goal.replace(y.args[0].args[1]).apply(Le),S.substitution.apply(Le),S)])};w.__calls.unshift(Z)}else{var ie=new xe(S.goal.replace(y.args[0]),S.substitution,S),be=new xe(S.goal.replace(y.args[1]),S.substitution,S);w.prepend([ie,be])}},"!/0":function(w,S,y){var F,J,X=[];for(F=S,J=null;F.parent!==null&&F.parent.goal.search(y);)if(J=F,F=F.parent,F.goal!==null){var Z=F.goal.select();if(Z&&Z.id==="call"&&Z.search(y)){F=J;break}}for(var ie=w.points.length-1;ie>=0;ie--){for(var be=w.points[ie],Le=be.parent;Le!==null&&Le!==F.parent;)Le=Le.parent;Le===null&&Le!==F.parent&&X.push(be)}w.points=X.reverse(),w.success(S)},"\\+/1":function(w,S,y){var F=y.args[0];b.type.is_variable(F)?w.throw_error(b.error.instantiation(w.level)):b.type.is_callable(F)?w.prepend([new xe(S.goal.replace(new H(",",[new H(",",[new H("call",[F]),new H("!",[])]),new H("fail",[])])),S.substitution,S),new xe(S.goal.replace(null),S.substitution,S)]):w.throw_error(b.error.type("callable",F,w.level))},"->/2":function(w,S,y){var F=S.goal.replace(new H(",",[y.args[0],new H(",",[new H("!"),y.args[1]])]));w.prepend([new xe(F,S.substitution,S)])},"fail/0":function(w,S,y){},"false/0":function(w,S,y){},"true/0":function(w,S,y){w.success(S)},"call/1":ne(1),"call/2":ne(2),"call/3":ne(3),"call/4":ne(4),"call/5":ne(5),"call/6":ne(6),"call/7":ne(7),"call/8":ne(8),"once/1":function(w,S,y){var F=y.args[0];w.prepend([new xe(S.goal.replace(new H(",",[new H("call",[F]),new H("!",[])])),S.substitution,S)])},"forall/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H("\\+",[new H(",",[new H("call",[F]),new H("\\+",[new H("call",[J])])])])),S.substitution,S)])},"repeat/0":function(w,S,y){w.prepend([new xe(S.goal.replace(null),S.substitution,S),S])},"throw/1":function(w,S,y){b.type.is_variable(y.args[0])?w.throw_error(b.error.instantiation(w.level)):w.throw_error(y.args[0])},"catch/3":function(w,S,y){var F=w.points;w.points=[],w.prepend([new xe(y.args[0],S.substitution,S)]);var J=w.session.format_success,X=w.session.format_error;w.session.format_success=function(ie){return ie.substitution},w.session.format_error=function(ie){return ie.goal};var Z=function(ie){var be=w.points;if(w.points=F,w.session.format_success=J,w.session.format_error=X,b.type.is_error(ie)){for(var Le=[],ot=w.points.length-1;ot>=0;ot--){for(var $t=w.points[ot],dt=$t.parent;dt!==null&&dt!==S.parent;)dt=dt.parent;dt===null&&dt!==S.parent&&Le.push($t)}w.points=Le;var Gt=w.get_flag("occurs_check").indicator==="true/0",$t=new xe,bt=b.unify(ie.args[0],y.args[1],Gt);bt!==null?($t.substitution=S.substitution.apply(bt),$t.goal=S.goal.replace(y.args[2]).apply(bt),$t.parent=S,w.prepend([$t])):w.throw_error(ie.args[0])}else if(ie!==!1){for(var an=ie===null?[]:[new xe(S.goal.apply(ie).replace(null),S.substitution.apply(ie),S)],Qr=[],ot=be.length-1;ot>=0;ot--){Qr.push(be[ot]);var mr=be[ot].goal!==null?be[ot].goal.select():null;if(b.type.is_term(mr)&&mr.indicator==="!/0")break}var br=o(Qr,function(Wr){return Wr.goal===null&&(Wr.goal=new H("true",[])),Wr=new xe(S.goal.replace(new H("catch",[Wr.goal,y.args[1],y.args[2]])),S.substitution.apply(Wr.substitution),Wr.parent),Wr.exclude=y.args[0].variables(),Wr}).reverse();w.prepend(br),w.prepend(an),ie===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift(Z)},"=/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",J=new xe,X=b.unify(y.args[0],y.args[1],F);X!==null&&(J.goal=S.goal.apply(X).replace(null),J.substitution=S.substitution.apply(X),J.parent=S,w.prepend([J]))},"unify_with_occurs_check/2":function(w,S,y){var F=new xe,J=b.unify(y.args[0],y.args[1],!0);J!==null&&(F.goal=S.goal.apply(J).replace(null),F.substitution=S.substitution.apply(J),F.parent=S,w.prepend([F]))},"\\=/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",J=b.unify(y.args[0],y.args[1],F);J===null&&w.success(S)},"subsumes_term/2":function(w,S,y){var F=w.get_flag("occurs_check").indicator==="true/0",J=b.unify(y.args[1],y.args[0],F);J!==null&&y.args[1].apply(J).equals(y.args[1])&&w.success(S)},"findall/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(J))w.throw_error(b.error.type("callable",J,y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_list(X))w.throw_error(b.error.type("list",X,y.indicator));else{var Z=w.next_free_variable(),ie=new H(",",[J,new H("=",[Z,F])]),be=w.points,Le=w.session.limit,ot=w.session.format_success;w.session.format_success=function($t){return $t.substitution},w.add_goal(ie,!0,S);var dt=[],Gt=function($t){if($t!==!1&&$t!==null&&!b.type.is_error($t))w.__calls.unshift(Gt),dt.push($t.links[Z.id]),w.session.limit=w.current_limit;else if(w.points=be,w.session.limit=Le,w.session.format_success=ot,b.type.is_error($t))w.throw_error($t.args[0]);else if(w.current_limit>0){for(var bt=new H("[]"),an=dt.length-1;an>=0;an--)bt=new H(".",[dt[an],bt]);w.prepend([new xe(S.goal.replace(new H("=",[X,bt])),S.substitution,S)])}};w.__calls.unshift(Gt)}},"bagof/3":function(w,S,y){var F,J=y.args[0],X=y.args[1],Z=y.args[2];if(b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(X))w.throw_error(b.error.type("callable",X,y.indicator));else if(!b.type.is_variable(Z)&&!b.type.is_list(Z))w.throw_error(b.error.type("list",Z,y.indicator));else{var ie=w.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(J.variables());for(var Le=X.variables().filter(function(br){return e(be,br)===-1}),ot=new H("[]"),dt=Le.length-1;dt>=0;dt--)ot=new H(".",[new Ie(Le[dt]),ot]);var Gt=new H(",",[X,new H("=",[ie,new H(",",[ot,J])])]),$t=w.points,bt=w.session.limit,an=w.session.format_success;w.session.format_success=function(br){return br.substitution},w.add_goal(Gt,!0,S);var Qr=[],mr=function(br){if(br!==!1&&br!==null&&!b.type.is_error(br)){w.__calls.unshift(mr);var Wr=!1,Kn=br.links[ie.id].args[0],Ls=br.links[ie.id].args[1];for(var Ti in Qr)if(!!Qr.hasOwnProperty(Ti)){var ps=Qr[Ti];if(ps.variables.equals(Kn)){ps.answers.push(Ls),Wr=!0;break}}Wr||Qr.push({variables:Kn,answers:[Ls]}),w.session.limit=w.current_limit}else if(w.points=$t,w.session.limit=bt,w.session.format_success=an,b.type.is_error(br))w.throw_error(br.args[0]);else if(w.current_limit>0){for(var io=[],Si=0;Si=0;so--)Ns=new H(".",[br[so],Ns]);io.push(new xe(S.goal.replace(new H(",",[new H("=",[ot,Qr[Si].variables]),new H("=",[Z,Ns])])),S.substitution,S))}w.prepend(io)}};w.__calls.unshift(mr)}},"setof/3":function(w,S,y){var F,J=y.args[0],X=y.args[1],Z=y.args[2];if(b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(X))w.throw_error(b.error.type("callable",X,y.indicator));else if(!b.type.is_variable(Z)&&!b.type.is_list(Z))w.throw_error(b.error.type("list",Z,y.indicator));else{var ie=w.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(J.variables());for(var Le=X.variables().filter(function(br){return e(be,br)===-1}),ot=new H("[]"),dt=Le.length-1;dt>=0;dt--)ot=new H(".",[new Ie(Le[dt]),ot]);var Gt=new H(",",[X,new H("=",[ie,new H(",",[ot,J])])]),$t=w.points,bt=w.session.limit,an=w.session.format_success;w.session.format_success=function(br){return br.substitution},w.add_goal(Gt,!0,S);var Qr=[],mr=function(br){if(br!==!1&&br!==null&&!b.type.is_error(br)){w.__calls.unshift(mr);var Wr=!1,Kn=br.links[ie.id].args[0],Ls=br.links[ie.id].args[1];for(var Ti in Qr)if(!!Qr.hasOwnProperty(Ti)){var ps=Qr[Ti];if(ps.variables.equals(Kn)){ps.answers.push(Ls),Wr=!0;break}}Wr||Qr.push({variables:Kn,answers:[Ls]}),w.session.limit=w.current_limit}else if(w.points=$t,w.session.limit=bt,w.session.format_success=an,b.type.is_error(br))w.throw_error(br.args[0]);else if(w.current_limit>0){for(var io=[],Si=0;Si=0;so--)Ns=new H(".",[br[so],Ns]);io.push(new xe(S.goal.replace(new H(",",[new H("=",[ot,Qr[Si].variables]),new H("=",[Z,Ns])])),S.substitution,S))}w.prepend(io)}};w.__calls.unshift(mr)}},"functor/3":function(w,S,y){var F,J=y.args[0],X=y.args[1],Z=y.args[2];if(b.type.is_variable(J)&&(b.type.is_variable(X)||b.type.is_variable(Z)))w.throw_error(b.error.instantiation("functor/3"));else if(!b.type.is_variable(Z)&&!b.type.is_integer(Z))w.throw_error(b.error.type("integer",y.args[2],"functor/3"));else if(!b.type.is_variable(X)&&!b.type.is_atomic(X))w.throw_error(b.error.type("atomic",y.args[1],"functor/3"));else if(b.type.is_integer(X)&&b.type.is_integer(Z)&&Z.value!==0)w.throw_error(b.error.type("atom",y.args[1],"functor/3"));else if(b.type.is_variable(J)){if(y.args[2].value>=0){for(var ie=[],be=0;be0&&F<=y.args[1].args.length){var J=new H("=",[y.args[1].args[F-1],y.args[2]]);w.prepend([new xe(S.goal.replace(J),S.substitution,S)])}}},"=../2":function(w,S,y){var F;if(b.type.is_variable(y.args[0])&&(b.type.is_variable(y.args[1])||b.type.is_non_empty_list(y.args[1])&&b.type.is_variable(y.args[1].args[0])))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_fully_list(y.args[1]))w.throw_error(b.error.type("list",y.args[1],y.indicator));else if(b.type.is_variable(y.args[0])){if(!b.type.is_variable(y.args[1])){var X=[];for(F=y.args[1].args[1];F.indicator==="./2";)X.push(F.args[0]),F=F.args[1];b.type.is_variable(y.args[0])&&b.type.is_variable(F)?w.throw_error(b.error.instantiation(y.indicator)):X.length===0&&b.type.is_compound(y.args[1].args[0])?w.throw_error(b.error.type("atomic",y.args[1].args[0],y.indicator)):X.length>0&&(b.type.is_compound(y.args[1].args[0])||b.type.is_number(y.args[1].args[0]))?w.throw_error(b.error.type("atom",y.args[1].args[0],y.indicator)):X.length===0?w.prepend([new xe(S.goal.replace(new H("=",[y.args[1].args[0],y.args[0]],S)),S.substitution,S)]):w.prepend([new xe(S.goal.replace(new H("=",[new H(y.args[1].args[0].id,X),y.args[0]])),S.substitution,S)])}}else{if(b.type.is_atomic(y.args[0]))F=new H(".",[y.args[0],new H("[]")]);else{F=new H("[]");for(var J=y.args[0].args.length-1;J>=0;J--)F=new H(".",[y.args[0].args[J],F]);F=new H(".",[new H(y.args[0].id),F])}w.prepend([new xe(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S)])}},"copy_term/2":function(w,S,y){var F=y.args[0].rename(w);w.prepend([new xe(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S.parent)])},"term_variables/2":function(w,S,y){var F=y.args[0],J=y.args[1];if(!b.type.is_fully_list(J))w.throw_error(b.error.type("list",J,y.indicator));else{var X=g(o(Pe(F.variables()),function(Z){return new Ie(Z)}));w.prepend([new xe(S.goal.replace(new H("=",[J,X])),S.substitution,S)])}},"clause/2":function(w,S,y){if(b.type.is_variable(y.args[0]))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(y.args[0]))w.throw_error(b.error.type("callable",y.args[0],y.indicator));else if(!b.type.is_variable(y.args[1])&&!b.type.is_callable(y.args[1]))w.throw_error(b.error.type("callable",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var J in w.session.rules[y.args[0].indicator])if(!!w.session.rules[y.args[0].indicator].hasOwnProperty(J)){var X=w.session.rules[y.args[0].indicator][J];w.session.renamed_variables={},X=X.rename(w),X.body===null&&(X.body=new H("true"));var Z=new H(",",[new H("=",[X.head,y.args[0]]),new H("=",[X.body,y.args[1]])]);F.push(new xe(S.goal.replace(Z),S.substitution,S))}w.prepend(F)}else w.throw_error(b.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(w,S,y){var F=y.args[0];if(!b.type.is_variable(F)&&(!b.type.is_compound(F)||F.indicator!=="//2"))w.throw_error(b.error.type("predicate_indicator",F,y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_variable(F.args[0])&&!b.type.is_atom(F.args[0]))w.throw_error(b.error.type("atom",F.args[0],y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_variable(F.args[1])&&!b.type.is_integer(F.args[1]))w.throw_error(b.error.type("integer",F.args[1],y.indicator));else{var J=[];for(var X in w.session.rules)if(!!w.session.rules.hasOwnProperty(X)){var Z=X.lastIndexOf("/"),ie=X.substr(0,Z),be=parseInt(X.substr(Z+1,X.length-(Z+1))),Le=new H("/",[new H(ie),new Fe(be,!1)]),ot=new H("=",[Le,F]);J.push(new xe(S.goal.replace(ot),S.substitution,S))}w.prepend(J)}},"asserta/1":function(w,S,y){if(b.type.is_variable(y.args[0]))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(y.args[0]))w.throw_error(b.error.type("callable",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=we(y.args[0].args[1])):(F=y.args[0],J=null),b.type.is_callable(F)?J!==null&&!b.type.is_callable(J)?w.throw_error(b.error.type("callable",J,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new He(F,J,!0)].concat(w.session.rules[F.indicator]),w.success(S)):w.throw_error(b.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(b.error.type("callable",F,y.indicator))}},"assertz/1":function(w,S,y){if(b.type.is_variable(y.args[0]))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(y.args[0]))w.throw_error(b.error.type("callable",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=we(y.args[0].args[1])):(F=y.args[0],J=null),b.type.is_callable(F)?J!==null&&!b.type.is_callable(J)?w.throw_error(b.error.type("callable",J,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new He(F,J,!0)),w.success(S)):w.throw_error(b.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(b.error.type("callable",F,y.indicator))}},"retract/1":function(w,S,y){if(b.type.is_variable(y.args[0]))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_callable(y.args[0]))w.throw_error(b.error.type("callable",y.args[0],y.indicator));else{var F,J;if(y.args[0].indicator===":-/2"?(F=y.args[0].args[0],J=y.args[0].args[1]):(F=y.args[0],J=new H("true")),typeof S.retract>"u")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var X=[],Z=0;Zw.get_flag("max_arity").value)w.throw_error(b.error.representation("max_arity",y.indicator));else{var F=y.args[0].args[0].id+"/"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(S)):w.throw_error(b.error.permission("modify","static_procedure",F,y.indicator))}},"atom_length/2":function(w,S,y){if(b.type.is_variable(y.args[0]))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_atom(y.args[0]))w.throw_error(b.error.type("atom",y.args[0],y.indicator));else if(!b.type.is_variable(y.args[1])&&!b.type.is_integer(y.args[1]))w.throw_error(b.error.type("integer",y.args[1],y.indicator));else if(b.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(b.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var F=new Fe(y.args[0].id.length,!1);w.prepend([new xe(S.goal.replace(new H("=",[F,y.args[1]])),S.substitution,S)])}},"atom_concat/3":function(w,S,y){var F,J,X=y.args[0],Z=y.args[1],ie=y.args[2];if(b.type.is_variable(ie)&&(b.type.is_variable(X)||b.type.is_variable(Z)))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_atom(X))w.throw_error(b.error.type("atom",X,y.indicator));else if(!b.type.is_variable(Z)&&!b.type.is_atom(Z))w.throw_error(b.error.type("atom",Z,y.indicator));else if(!b.type.is_variable(ie)&&!b.type.is_atom(ie))w.throw_error(b.error.type("atom",ie,y.indicator));else{var be=b.type.is_variable(X),Le=b.type.is_variable(Z);if(!be&&!Le)J=new H("=",[ie,new H(X.id+Z.id)]),w.prepend([new xe(S.goal.replace(J),S.substitution,S)]);else if(be&&!Le)F=ie.id.substr(0,ie.id.length-Z.id.length),F+Z.id===ie.id&&(J=new H("=",[X,new H(F)]),w.prepend([new xe(S.goal.replace(J),S.substitution,S)]));else if(Le&&!be)F=ie.id.substr(X.id.length),X.id+F===ie.id&&(J=new H("=",[Z,new H(F)]),w.prepend([new xe(S.goal.replace(J),S.substitution,S)]));else{for(var ot=[],dt=0;dt<=ie.id.length;dt++){var Gt=new H(ie.id.substr(0,dt)),$t=new H(ie.id.substr(dt));J=new H(",",[new H("=",[Gt,X]),new H("=",[$t,Z])]),ot.push(new xe(S.goal.replace(J),S.substitution,S))}w.prepend(ot)}}},"sub_atom/5":function(w,S,y){var F,J=y.args[0],X=y.args[1],Z=y.args[2],ie=y.args[3],be=y.args[4];if(b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_integer(X))w.throw_error(b.error.type("integer",X,y.indicator));else if(!b.type.is_variable(Z)&&!b.type.is_integer(Z))w.throw_error(b.error.type("integer",Z,y.indicator));else if(!b.type.is_variable(ie)&&!b.type.is_integer(ie))w.throw_error(b.error.type("integer",ie,y.indicator));else if(b.type.is_integer(X)&&X.value<0)w.throw_error(b.error.domain("not_less_than_zero",X,y.indicator));else if(b.type.is_integer(Z)&&Z.value<0)w.throw_error(b.error.domain("not_less_than_zero",Z,y.indicator));else if(b.type.is_integer(ie)&&ie.value<0)w.throw_error(b.error.domain("not_less_than_zero",ie,y.indicator));else{var Le=[],ot=[],dt=[];if(b.type.is_variable(X))for(F=0;F<=J.id.length;F++)Le.push(F);else Le.push(X.value);if(b.type.is_variable(Z))for(F=0;F<=J.id.length;F++)ot.push(F);else ot.push(Z.value);if(b.type.is_variable(ie))for(F=0;F<=J.id.length;F++)dt.push(F);else dt.push(ie.value);var Gt=[];for(var $t in Le)if(!!Le.hasOwnProperty($t)){F=Le[$t];for(var bt in ot)if(!!ot.hasOwnProperty(bt)){var an=ot[bt],Qr=J.id.length-F-an;if(e(dt,Qr)!==-1&&F+an+Qr===J.id.length){var mr=J.id.substr(F,an);if(J.id===J.id.substr(0,F)+mr+J.id.substr(F+an,Qr)){var br=new H("=",[new H(mr),be]),Wr=new H("=",[X,new Fe(F)]),Kn=new H("=",[Z,new Fe(an)]),Ls=new H("=",[ie,new Fe(Qr)]),Ti=new H(",",[new H(",",[new H(",",[Wr,Kn]),Ls]),br]);Gt.push(new xe(S.goal.replace(Ti),S.substitution,S))}}}}w.prepend(Gt)}},"atom_chars/2":function(w,S,y){var F=y.args[0],J=y.args[1];if(b.type.is_variable(F)&&b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_atom(F))w.throw_error(b.error.type("atom",F,y.indicator));else if(b.type.is_variable(F)){for(var ie=J,be=b.type.is_variable(F),Le="";ie.indicator==="./2";){if(b.type.is_character(ie.args[0]))Le+=ie.args[0].id;else if(b.type.is_variable(ie.args[0])&&be){w.throw_error(b.error.instantiation(y.indicator));return}else if(!b.type.is_variable(ie.args[0])){w.throw_error(b.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}b.type.is_variable(ie)&&be?w.throw_error(b.error.instantiation(y.indicator)):!b.type.is_empty_list(ie)&&!b.type.is_variable(ie)?w.throw_error(b.error.type("list",J,y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[new H(Le),F])),S.substitution,S)])}else{for(var X=new H("[]"),Z=F.id.length-1;Z>=0;Z--)X=new H(".",[new H(F.id.charAt(Z)),X]);w.prepend([new xe(S.goal.replace(new H("=",[J,X])),S.substitution,S)])}},"atom_codes/2":function(w,S,y){var F=y.args[0],J=y.args[1];if(b.type.is_variable(F)&&b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_atom(F))w.throw_error(b.error.type("atom",F,y.indicator));else if(b.type.is_variable(F)){for(var ie=J,be=b.type.is_variable(F),Le="";ie.indicator==="./2";){if(b.type.is_character_code(ie.args[0]))Le+=u(ie.args[0].value);else if(b.type.is_variable(ie.args[0])&&be){w.throw_error(b.error.instantiation(y.indicator));return}else if(!b.type.is_variable(ie.args[0])){w.throw_error(b.error.representation("character_code",y.indicator));return}ie=ie.args[1]}b.type.is_variable(ie)&&be?w.throw_error(b.error.instantiation(y.indicator)):!b.type.is_empty_list(ie)&&!b.type.is_variable(ie)?w.throw_error(b.error.type("list",J,y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[new H(Le),F])),S.substitution,S)])}else{for(var X=new H("[]"),Z=F.id.length-1;Z>=0;Z--)X=new H(".",[new Fe(n(F.id,Z),!1),X]);w.prepend([new xe(S.goal.replace(new H("=",[J,X])),S.substitution,S)])}},"char_code/2":function(w,S,y){var F=y.args[0],J=y.args[1];if(b.type.is_variable(F)&&b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_character(F))w.throw_error(b.error.type("character",F,y.indicator));else if(!b.type.is_variable(J)&&!b.type.is_integer(J))w.throw_error(b.error.type("integer",J,y.indicator));else if(!b.type.is_variable(J)&&!b.type.is_character_code(J))w.throw_error(b.error.representation("character_code",y.indicator));else if(b.type.is_variable(J)){var X=new Fe(n(F.id,0),!1);w.prepend([new xe(S.goal.replace(new H("=",[X,J])),S.substitution,S)])}else{var Z=new H(u(J.value));w.prepend([new xe(S.goal.replace(new H("=",[Z,F])),S.substitution,S)])}},"number_chars/2":function(w,S,y){var F,J=y.args[0],X=y.args[1];if(b.type.is_variable(J)&&b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(J)&&!b.type.is_number(J))w.throw_error(b.error.type("number",J,y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_list(X))w.throw_error(b.error.type("list",X,y.indicator));else{var Z=b.type.is_variable(J);if(!b.type.is_variable(X)){var ie=X,be=!0;for(F="";ie.indicator==="./2";){if(b.type.is_character(ie.args[0]))F+=ie.args[0].id;else if(b.type.is_variable(ie.args[0]))be=!1;else if(!b.type.is_variable(ie.args[0])){w.throw_error(b.error.type("character",ie.args[0],y.indicator));return}ie=ie.args[1]}if(be=be&&b.type.is_empty_list(ie),!b.type.is_empty_list(ie)&&!b.type.is_variable(ie)){w.throw_error(b.error.type("list",X,y.indicator));return}if(!be&&Z){w.throw_error(b.error.instantiation(y.indicator));return}else if(be)if(b.type.is_variable(ie)&&Z){w.throw_error(b.error.instantiation(y.indicator));return}else{var Le=w.parse(F),ot=Le.value;!b.type.is_number(ot)||Le.tokens[Le.tokens.length-1].space?w.throw_error(b.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[J,ot])),S.substitution,S)]);return}}if(!Z){F=J.toString();for(var dt=new H("[]"),Gt=F.length-1;Gt>=0;Gt--)dt=new H(".",[new H(F.charAt(Gt)),dt]);w.prepend([new xe(S.goal.replace(new H("=",[X,dt])),S.substitution,S)])}}},"number_codes/2":function(w,S,y){var F,J=y.args[0],X=y.args[1];if(b.type.is_variable(J)&&b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(J)&&!b.type.is_number(J))w.throw_error(b.error.type("number",J,y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_list(X))w.throw_error(b.error.type("list",X,y.indicator));else{var Z=b.type.is_variable(J);if(!b.type.is_variable(X)){var ie=X,be=!0;for(F="";ie.indicator==="./2";){if(b.type.is_character_code(ie.args[0]))F+=u(ie.args[0].value);else if(b.type.is_variable(ie.args[0]))be=!1;else if(!b.type.is_variable(ie.args[0])){w.throw_error(b.error.type("character_code",ie.args[0],y.indicator));return}ie=ie.args[1]}if(be=be&&b.type.is_empty_list(ie),!b.type.is_empty_list(ie)&&!b.type.is_variable(ie)){w.throw_error(b.error.type("list",X,y.indicator));return}if(!be&&Z){w.throw_error(b.error.instantiation(y.indicator));return}else if(be)if(b.type.is_variable(ie)&&Z){w.throw_error(b.error.instantiation(y.indicator));return}else{var Le=w.parse(F),ot=Le.value;!b.type.is_number(ot)||Le.tokens[Le.tokens.length-1].space?w.throw_error(b.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[J,ot])),S.substitution,S)]);return}}if(!Z){F=J.toString();for(var dt=new H("[]"),Gt=F.length-1;Gt>=0;Gt--)dt=new H(".",[new Fe(n(F,Gt),!1),dt]);w.prepend([new xe(S.goal.replace(new H("=",[X,dt])),S.substitution,S)])}}},"upcase_atom/2":function(w,S,y){var F=y.args[0],J=y.args[1];b.type.is_variable(F)?w.throw_error(b.error.instantiation(y.indicator)):b.type.is_atom(F)?!b.type.is_variable(J)&&!b.type.is_atom(J)?w.throw_error(b.error.type("atom",J,y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[J,new H(F.id.toUpperCase(),[])])),S.substitution,S)]):w.throw_error(b.error.type("atom",F,y.indicator))},"downcase_atom/2":function(w,S,y){var F=y.args[0],J=y.args[1];b.type.is_variable(F)?w.throw_error(b.error.instantiation(y.indicator)):b.type.is_atom(F)?!b.type.is_variable(J)&&!b.type.is_atom(J)?w.throw_error(b.error.type("atom",J,y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[J,new H(F.id.toLowerCase(),[])])),S.substitution,S)]):w.throw_error(b.error.type("atom",F,y.indicator))},"atomic_list_concat/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H("atomic_list_concat",[F,new H("",[]),J])),S.substitution,S)])},"atomic_list_concat/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(b.type.is_variable(J)||b.type.is_variable(F)&&b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_list(F))w.throw_error(b.error.type("list",F,y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_atom(X))w.throw_error(b.error.type("atom",X,y.indicator));else if(b.type.is_variable(X)){for(var ie="",be=F;b.type.is_term(be)&&be.indicator==="./2";){if(!b.type.is_atom(be.args[0])&&!b.type.is_number(be.args[0])){w.throw_error(b.error.type("atomic",be.args[0],y.indicator));return}ie!==""&&(ie+=J.id),b.type.is_atom(be.args[0])?ie+=be.args[0].id:ie+=""+be.args[0].value,be=be.args[1]}ie=new H(ie,[]),b.type.is_variable(be)?w.throw_error(b.error.instantiation(y.indicator)):!b.type.is_term(be)||be.indicator!=="[]/0"?w.throw_error(b.error.type("list",F,y.indicator)):w.prepend([new xe(S.goal.replace(new H("=",[ie,X])),S.substitution,S)])}else{var Z=g(o(X.id.split(J.id),function(Le){return new H(Le,[])}));w.prepend([new xe(S.goal.replace(new H("=",[Z,F])),S.substitution,S)])}},"@=/2":function(w,S,y){b.compare(y.args[0],y.args[1])>0&&w.success(S)},"@>=/2":function(w,S,y){b.compare(y.args[0],y.args[1])>=0&&w.success(S)},"compare/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(!b.type.is_variable(F)&&!b.type.is_atom(F))w.throw_error(b.error.type("atom",F,y.indicator));else if(b.type.is_atom(F)&&["<",">","="].indexOf(F.id)===-1)w.throw_error(b.type.domain("order",F,y.indicator));else{var Z=b.compare(J,X);Z=Z===0?"=":Z===-1?"<":">",w.prepend([new xe(S.goal.replace(new H("=",[F,new H(Z,[])])),S.substitution,S)])}},"is/2":function(w,S,y){var F=y.args[1].interpret(w);b.type.is_number(F)?w.prepend([new xe(S.goal.replace(new H("=",[y.args[0],F],w.level)),S.substitution,S)]):w.throw_error(F)},"between/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(b.type.is_variable(F)||b.type.is_variable(J))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_integer(F))w.throw_error(b.error.type("integer",F,y.indicator));else if(!b.type.is_integer(J))w.throw_error(b.error.type("integer",J,y.indicator));else if(!b.type.is_variable(X)&&!b.type.is_integer(X))w.throw_error(b.error.type("integer",X,y.indicator));else if(b.type.is_variable(X)){var Z=[new xe(S.goal.replace(new H("=",[X,F])),S.substitution,S)];F.value=X.value&&w.success(S)},"succ/2":function(w,S,y){var F=y.args[0],J=y.args[1];b.type.is_variable(F)&&b.type.is_variable(J)?w.throw_error(b.error.instantiation(y.indicator)):!b.type.is_variable(F)&&!b.type.is_integer(F)?w.throw_error(b.error.type("integer",F,y.indicator)):!b.type.is_variable(J)&&!b.type.is_integer(J)?w.throw_error(b.error.type("integer",J,y.indicator)):!b.type.is_variable(F)&&F.value<0?w.throw_error(b.error.domain("not_less_than_zero",F,y.indicator)):!b.type.is_variable(J)&&J.value<0?w.throw_error(b.error.domain("not_less_than_zero",J,y.indicator)):(b.type.is_variable(J)||J.value>0)&&(b.type.is_variable(F)?w.prepend([new xe(S.goal.replace(new H("=",[F,new Fe(J.value-1,!1)])),S.substitution,S)]):w.prepend([new xe(S.goal.replace(new H("=",[J,new Fe(F.value+1,!1)])),S.substitution,S)]))},"=:=/2":function(w,S,y){var F=b.arithmetic_compare(w,y.args[0],y.args[1]);b.type.is_term(F)?w.throw_error(F):F===0&&w.success(S)},"=\\=/2":function(w,S,y){var F=b.arithmetic_compare(w,y.args[0],y.args[1]);b.type.is_term(F)?w.throw_error(F):F!==0&&w.success(S)},"/2":function(w,S,y){var F=b.arithmetic_compare(w,y.args[0],y.args[1]);b.type.is_term(F)?w.throw_error(F):F>0&&w.success(S)},">=/2":function(w,S,y){var F=b.arithmetic_compare(w,y.args[0],y.args[1]);b.type.is_term(F)?w.throw_error(F):F>=0&&w.success(S)},"var/1":function(w,S,y){b.type.is_variable(y.args[0])&&w.success(S)},"atom/1":function(w,S,y){b.type.is_atom(y.args[0])&&w.success(S)},"atomic/1":function(w,S,y){b.type.is_atomic(y.args[0])&&w.success(S)},"compound/1":function(w,S,y){b.type.is_compound(y.args[0])&&w.success(S)},"integer/1":function(w,S,y){b.type.is_integer(y.args[0])&&w.success(S)},"float/1":function(w,S,y){b.type.is_float(y.args[0])&&w.success(S)},"number/1":function(w,S,y){b.type.is_number(y.args[0])&&w.success(S)},"nonvar/1":function(w,S,y){b.type.is_variable(y.args[0])||w.success(S)},"ground/1":function(w,S,y){y.variables().length===0&&w.success(S)},"acyclic_term/1":function(w,S,y){for(var F=S.substitution.apply(S.substitution),J=y.args[0].variables(),X=0;X0?bt[bt.length-1]:null,bt!==null&&(Gt=V(w,bt,0,w.__get_max_priority(),!1))}if(Gt.type===p&&Gt.len===bt.length-1&&an.value==="."){Gt=Gt.value.rename(w);var Qr=new H("=",[J,Gt]);if(ie.variables){var mr=g(o(Pe(Gt.variables()),function(br){return new Ie(br)}));Qr=new H(",",[Qr,new H("=",[ie.variables,mr])])}if(ie.variable_names){var mr=g(o(Pe(Gt.variables()),function(Wr){var Kn;for(Kn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Kn)&&w.session.renamed_variables[Kn]===Wr)break;return new H("=",[new H(Kn,[]),new Ie(Wr)])}));Qr=new H(",",[Qr,new H("=",[ie.variable_names,mr])])}if(ie.singletons){var mr=g(o(new He(Gt,null).singleton_variables(),function(Wr){var Kn;for(Kn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Kn)&&w.session.renamed_variables[Kn]===Wr)break;return new H("=",[new H(Kn,[]),new Ie(Wr)])}));Qr=new H(",",[Qr,new H("=",[ie.singletons,mr])])}w.prepend([new xe(S.goal.replace(Qr),S.substitution,S)])}else Gt.type===p?w.throw_error(b.error.syntax(bt[Gt.len],"unexpected token",!1)):w.throw_error(Gt.value)}}},"write/1":function(w,S,y){var F=y.args[0];w.prepend([new xe(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write",[new Ie("S"),F])])),S.substitution,S)])},"write/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("false",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),S.substitution,S)])},"writeq/1":function(w,S,y){var F=y.args[0];w.prepend([new xe(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("writeq",[new Ie("S"),F])])),S.substitution,S)])},"writeq/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("false")]),new H(".",[new H("numbervars",[new H("true")]),new H("[]",[])])])])])),S.substitution,S)])},"write_canonical/1":function(w,S,y){var F=y.args[0];w.prepend([new xe(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write_canonical",[new Ie("S"),F])])),S.substitution,S)])},"write_canonical/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H("write_term",[F,J,new H(".",[new H("quoted",[new H("true",[])]),new H(".",[new H("ignore_ops",[new H("true")]),new H(".",[new H("numbervars",[new H("false")]),new H("[]",[])])])])])),S.substitution,S)])},"write_term/2":function(w,S,y){var F=y.args[0],J=y.args[1];w.prepend([new xe(S.goal.replace(new H(",",[new H("current_output",[new Ie("S")]),new H("write_term",[new Ie("S"),F,J])])),S.substitution,S)])},"write_term/3":function(w,S,y){var F=y.args[0],J=y.args[1],X=y.args[2],Z=b.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(b.type.is_variable(F)||b.type.is_variable(X))w.throw_error(b.error.instantiation(y.indicator));else if(!b.type.is_list(X))w.throw_error(b.error.type("list",X,y.indicator));else if(!b.type.is_stream(F)&&!b.type.is_atom(F))w.throw_error(b.error.domain("stream_or_alias",F,y.indicator));else if(!b.type.is_stream(Z)||Z.stream===null)w.throw_error(b.error.existence("stream",F,y.indicator));else if(Z.input)w.throw_error(b.error.permission("output","stream",F,y.indicator));else if(Z.type==="binary")w.throw_error(b.error.permission("output","binary_stream",F,y.indicator));else if(Z.position==="past_end_of_stream"&&Z.eof_action==="error")w.throw_error(b.error.permission("output","past_end_of_stream",F,y.indicator));else{for(var ie={},be=X,Le;b.type.is_term(be)&&be.indicator==="./2";){if(Le=be.args[0],b.type.is_variable(Le)){w.throw_error(b.error.instantiation(y.indicator));return}else if(!b.type.is_write_option(Le)){w.throw_error(b.error.domain("write_option",Le,y.indicator));return}ie[Le.id]=Le.args[0].id==="true",be=be.args[1]}if(be.indicator!=="[]/0"){b.type.is_variable(be)?w.throw_error(b.error.instantiation(y.indicator)):w.throw_error(b.error.type("list",X,y.indicator));return}else{ie.session=w.session;var ot=J.toString(ie);Z.stream.put(ot,Z.position),typeof Z.position=="number"&&(Z.position+=ot.length),w.success(S)}}},"halt/0":function(w,S,y){w.points=[]},"halt/1":function(w,S,y){var F=y.args[0];b.type.is_variable(F)?w.throw_error(b.error.instantiation(y.indicator)):b.type.is_integer(F)?w.points=[]:w.throw_error(b.error.type("integer",F,y.indicator))},"current_prolog_flag/2":function(w,S,y){var F=y.args[0],J=y.args[1];if(!b.type.is_variable(F)&&!b.type.is_atom(F))w.throw_error(b.error.type("atom",F,y.indicator));else if(!b.type.is_variable(F)&&!b.type.is_flag(F))w.throw_error(b.error.domain("prolog_flag",F,y.indicator));else{var X=[];for(var Z in b.flag)if(!!b.flag.hasOwnProperty(Z)){var ie=new H(",",[new H("=",[new H(Z),F]),new H("=",[w.get_flag(Z),J])]);X.push(new xe(S.goal.replace(ie),S.substitution,S))}w.prepend(X)}},"set_prolog_flag/2":function(w,S,y){var F=y.args[0],J=y.args[1];b.type.is_variable(F)||b.type.is_variable(J)?w.throw_error(b.error.instantiation(y.indicator)):b.type.is_atom(F)?b.type.is_flag(F)?b.type.is_value_flag(F,J)?b.type.is_modifiable_flag(F)?(w.session.flag[F.id]=J,w.success(S)):w.throw_error(b.error.permission("modify","flag",F)):w.throw_error(b.error.domain("flag_value",new H("+",[F,J]),y.indicator)):w.throw_error(b.error.domain("prolog_flag",F,y.indicator)):w.throw_error(b.error.type("atom",F,y.indicator))}},flag:{bounded:{allowed:[new H("true"),new H("false")],value:new H("true"),changeable:!1},max_integer:{allowed:[new Fe(Number.MAX_SAFE_INTEGER)],value:new Fe(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Fe(Number.MIN_SAFE_INTEGER)],value:new Fe(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new H("down"),new H("toward_zero")],value:new H("toward_zero"),changeable:!1},char_conversion:{allowed:[new H("on"),new H("off")],value:new H("on"),changeable:!0},debug:{allowed:[new H("on"),new H("off")],value:new H("off"),changeable:!0},max_arity:{allowed:[new H("unbounded")],value:new H("unbounded"),changeable:!1},unknown:{allowed:[new H("error"),new H("fail"),new H("warning")],value:new H("error"),changeable:!0},double_quotes:{allowed:[new H("chars"),new H("codes"),new H("atom")],value:new H("codes"),changeable:!0},occurs_check:{allowed:[new H("false"),new H("true")],value:new H("false"),changeable:!0},dialect:{allowed:[new H("tau")],value:new H("tau"),changeable:!1},version_data:{allowed:[new H("tau",[new Fe(t.major,!1),new Fe(t.minor,!1),new Fe(t.patch,!1),new H(t.status)])],value:new H("tau",[new Fe(t.major,!1),new Fe(t.minor,!1),new Fe(t.patch,!1),new H(t.status)]),changeable:!1},nodejs:{allowed:[new H("yes"),new H("no")],value:new H(typeof gl<"u"&&gl.exports?"yes":"no"),changeable:!1}},unify:function(w,S,y){y=y===void 0?!1:y;for(var F=[{left:w,right:S}],J={};F.length!==0;){var X=F.pop();if(w=X.left,S=X.right,b.type.is_term(w)&&b.type.is_term(S)){if(w.indicator!==S.indicator)return null;for(var Z=0;ZJ.value?1:0:J}else return F},operate:function(w,S){if(b.type.is_operator(S)){for(var y=b.type.is_operator(S),F=[],J,X=!1,Z=0;Zw.get_flag("max_integer").value||J0?w.start+w.matches[0].length:w.start,J=y?new H("token_not_found"):new H("found",[new H(w.value.toString())]),X=new H(".",[new H("line",[new Fe(w.line+1)]),new H(".",[new H("column",[new Fe(F+1)]),new H(".",[J,new H("[]",[])])])]);return new H("error",[new H("syntax_error",[new H(S)]),X])},syntax_by_predicate:function(w,S){return new H("error",[new H("syntax_error",[new H(w)]),ee(S)])}},warning:{singleton:function(w,S,y){for(var F=new H("[]"),J=w.length-1;J>=0;J--)F=new H(".",[new Ie(w[J]),F]);return new H("warning",[new H("singleton_variables",[F,ee(S)]),new H(".",[new H("line",[new Fe(y,!1)]),new H("[]")])])},failed_goal:function(w,S){return new H("warning",[new H("failed_goal",[w]),new H(".",[new H("line",[new Fe(S,!1)]),new H("[]")])])}},format_variable:function(w){return"_"+w},format_answer:function(w,S,F){S instanceof Te&&(S=S.thread);var F=F||{};if(F.session=S?S.session:void 0,b.type.is_error(w))return"uncaught exception: "+w.args[0].toString();if(w===!1)return"false.";if(w===null)return"limit exceeded ;";var J=0,X="";if(b.type.is_substitution(w)){var Z=w.domain(!0);w=w.filter(function(Le,ot){return!b.type.is_variable(ot)||Z.indexOf(ot.id)!==-1&&Le!==ot.id})}for(var ie in w.links)!w.links.hasOwnProperty(ie)||(J++,X!==""&&(X+=", "),X+=ie.toString(F)+" = "+w.links[ie].toString(F));var be=typeof S>"u"||S.points.length>0?" ;":".";return J===0?"true"+be:X+be},flatten_error:function(w){if(!b.type.is_error(w))return null;w=w.args[0];var S={};return S.type=w.args[0].id,S.thrown=S.type==="syntax_error"?null:w.args[1].id,S.expected=null,S.found=null,S.representation=null,S.existence=null,S.existence_type=null,S.line=null,S.column=null,S.permission_operation=null,S.permission_type=null,S.evaluation_type=null,S.type==="type_error"||S.type==="domain_error"?(S.expected=w.args[0].args[0].id,S.found=w.args[0].args[1].toString()):S.type==="syntax_error"?w.args[1].indicator==="./2"?(S.expected=w.args[0].args[0].id,S.found=w.args[1].args[1].args[1].args[0],S.found=S.found.id==="token_not_found"?S.found.id:S.found.args[0].id,S.line=w.args[1].args[0].args[0].value,S.column=w.args[1].args[1].args[0].args[0].value):S.thrown=w.args[1].id:S.type==="permission_error"?(S.found=w.args[0].args[2].toString(),S.permission_operation=w.args[0].args[0].id,S.permission_type=w.args[0].args[1].id):S.type==="evaluation_error"?S.evaluation_type=w.args[0].args[0].id:S.type==="representation_error"?S.representation=w.args[0].args[0].id:S.type==="existence_error"&&(S.existence=w.args[0].args[1].toString(),S.existence_type=w.args[0].args[0].id),S},create:function(w){return new b.type.Session(w)}};typeof gl<"u"?gl.exports=b:window.pl=b})()});function sme(t,e,r){t.prepend(r.map(o=>new Ta.default.type.State(e.goal.replace(o),e.substitution,e)))}function yH(t){let e=ame.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function lme(t,e){ame.set(t,e),t.consult(`:- use_module(library(${Xgt.id})).`)}var EH,Ta,ome,A0,Vgt,Jgt,ame,Xgt,cme=Et(()=>{Ye();EH=$e(d2()),Ta=$e(mH()),ome=$e(ve("vm")),{is_atom:A0,is_variable:Vgt,is_instantiated_list:Jgt}=Ta.default.type;ame=new WeakMap;Xgt=new Ta.default.type.Module("constraints",{["project_workspaces_by_descriptor/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!A0(o)||!A0(a)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let u=W.parseIdent(o.id),A=W.makeDescriptor(u,a.id),h=yH(t).tryWorkspaceByDescriptor(A);Vgt(n)&&h!==null&&sme(t,e,[new Ta.default.type.Term("=",[n,new Ta.default.type.Term(String(h.relativeCwd))])]),A0(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},["workspace_field/3"]:(t,e,r)=>{let[o,a,n]=r.args;if(!A0(o)||!A0(a)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let A=yH(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,EH.default)(A.manifest.raw,a.id);typeof p>"u"||sme(t,e,[new Ta.default.type.Term("=",[n,new Ta.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},["workspace_field_test/3"]:(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new Ta.default.type.State(e.goal.replace(new Ta.default.type.Term("workspace_field_test",[o,a,n,new Ta.default.type.Term("[]",[])])),e.substitution,e)])},["workspace_field_test/4"]:(t,e,r)=>{let[o,a,n,u]=r.args;if(!A0(o)||!A0(a)||!A0(n)||!Jgt(u)){t.throw_error(Ta.default.error.instantiation(r.indicator));return}let p=yH(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,EH.default)(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[v,x]of u.toJavaScript().entries())E[`$${v}`]=x;ome.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var b2={};zt(b2,{Constraints:()=>S2,DependencyType:()=>pme});function to(t){if(t instanceof DC.default.type.Num)return t.value;if(t instanceof DC.default.type.Term)switch(t.indicator){case"throw/1":return to(t.args[0]);case"error/1":return to(t.args[0]);case"error/2":if(t.args[0]instanceof DC.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(to(t.args[0]),...to(t.args[1]));{let e=to(t.args[0]);return e.message+=` (in ${to(t.args[1])})`,e}case"syntax_error/1":return new Jt(43,`Syntax error: ${to(t.args[0])}`);case"existence_error/2":return new Jt(44,`Existence error: ${to(t.args[0])} ${to(t.args[1])} not found`);case"instantiation_error/0":return new Jt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:to(t.args[0])};case"column/1":return{column:to(t.args[0])};case"found/1":return{found:to(t.args[0])};case"./2":return[to(t.args[0])].concat(to(t.args[1]));case"//2":return`${to(t.args[0])}/${to(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function Ame(t){let e;try{e=to(t)}catch(r){throw typeof r=="string"?new Jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function tm(t){return t.id==="null"?null:`${t.toJavaScript()}`}function Zgt(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function f0(t){return typeof t=="string"?`'${t}'`:"[]"}var fme,DC,pme,ume,CH,S2,x2=Et(()=>{Ye();Ye();Pt();fme=$e(Gde()),DC=$e(mH());v2();cme();(0,fme.default)(DC.default);pme=(o=>(o.Dependencies="dependencies",o.DevDependencies="devDependencies",o.PeerDependencies="peerDependencies",o))(pme||{}),ume=["dependencies","devDependencies","peerDependencies"];CH=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=DC.default.create(o),lme(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw Ame(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new Jt(79,"Resolution limit exceeded");if(!o)break;if(o.id==="throw")throw Ame(o);yield o}}};S2=class{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");oe.existsSync(r)&&(this.source=oe.readFileSync(r,"utf8"))}static async find(e){return new S2(e)}getProjectDatabase(){let e="";for(let r of ume)e+=`dependency_type(${r}). +`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${f0(o)}). +`,e+=`workspace_ident(${f0(o)}, ${f0(W.stringifyIdent(r.anchoredLocator))}). +`,e+=`workspace_version(${f0(o)}, ${f0(r.manifest.version)}). +`;for(let a of ume)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${f0(o)}, ${f0(W.stringifyIdent(n))}, ${f0(n.range)}, ${a}). +`}return e+=`workspace(_) :- false. +`,e+=`workspace_ident(_, _) :- false. +`,e+=`workspace_version(_, _) :- false. +`,e+=`workspace_has_dependency(_, _, _, _) :- false. +`,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. +`,e+=`gen_enforced_field(_, _, _) :- false. +`,e}get fullSource(){return`${this.getProjectDatabase()} +${this.source} +${this.getDeclarations()}`}createSession(){return new CH(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=B2([A,W.stringifyIdent(n)]),h=_e.getMapWithDefault(o,a.cwd);_e.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=B2(n),p=_e.getMapWithDefault(o,a.cwd);_e.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=z.resolve(this.project.cwd,tm(o.links.WorkspaceCwd)),n=tm(o.links.DependencyIdent),u=tm(o.links.DependencyRange),A=tm(o.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=W.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return _e.sortMap(r,[({dependencyRange:o})=>o!==null?"0":"1",({workspace:o})=>W.stringifyIdent(o.anchoredLocator),({dependencyIdent:o})=>W.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=z.resolve(this.project.cwd,tm(o.links.WorkspaceCwd)),n=tm(o.links.FieldPath),u=Zgt(o.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return _e.sortMap(r,[({workspace:o})=>W.stringifyIdent(o.anchoredLocator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!=="_"&&(a[n]=tm(u));yield a}}}});var Ime=_(Ik=>{"use strict";Object.defineProperty(Ik,"__esModule",{value:!0});function j2(t){let e=[...t.caches],r=e.shift();return r===void 0?wme():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>j2({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>j2({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>j2({caches:e}).delete(o))},clear(){return r.clear().catch(()=>j2({caches:e}).clear())}}}function wme(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}Ik.createFallbackableCache=j2;Ik.createNullCache=wme});var vme=_((FWt,Bme)=>{Bme.exports=Ime()});var Dme=_(TH=>{"use strict";Object.defineProperty(TH,"__esModule",{value:!0});function mdt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}TH.createInMemoryCache=mdt});var Sme=_((TWt,Pme)=>{Pme.exports=Dme()});var xme=_($c=>{"use strict";Object.defineProperty($c,"__esModule",{value:!0});function ydt(t,e,r){let o={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===LH.WithinHeaders?o:{}},queryParameters(){return t===LH.WithinQueryParameters?o:{}}}}function Edt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function bme(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return bme(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function Cdt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function wdt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function Idt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var Bdt="4.22.1",vdt=t=>()=>t.transporter.requester.destroy(),LH={WithinQueryParameters:0,WithinHeaders:1};$c.AuthMode=LH;$c.addMethods=wdt;$c.createAuth=ydt;$c.createRetryablePromise=Edt;$c.createWaitablePromise=bme;$c.destroy=vdt;$c.encode=Idt;$c.shuffle=Cdt;$c.version=Bdt});var Y2=_((NWt,kme)=>{kme.exports=xme()});var Qme=_(NH=>{"use strict";Object.defineProperty(NH,"__esModule",{value:!0});var Ddt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};NH.MethodEnum=Ddt});var W2=_((MWt,Fme)=>{Fme.exports=Qme()});var Kme=_(Fi=>{"use strict";Object.defineProperty(Fi,"__esModule",{value:!0});var Tme=W2();function OH(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var K2={Read:1,Write:2,Any:3},xC={Up:1,Down:2,Timeouted:3},Lme=2*60*1e3;function UH(t,e=xC.Up){return{...t,status:e,lastUpdate:Date.now()}}function Nme(t){return t.status===xC.Up||Date.now()-t.lastUpdate>Lme}function Ome(t){return t.status===xC.Timeouted&&Date.now()-t.lastUpdate<=Lme}function _H(t){return typeof t=="string"?{protocol:"https",url:t,accept:K2.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||K2.Any}}function Pdt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(UH(r))))).then(r=>{let o=r.filter(A=>Nme(A)),a=r.filter(A=>Ome(A)),n=[...o,...a],u=n.length>0?n.map(A=>_H(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Sdt=({isTimedOut:t,status:e})=>!t&&~~e===0,bdt=t=>{let e=t.status;return t.isTimedOut||Sdt(t)||~~(e/100)!==2&&~~(e/100)!==4},xdt=({status:t})=>~~(t/100)===2,kdt=(t,e)=>bdt(t)?e.onRetry(t):xdt(t)?e.onSuccess(t):e.onFail(t);function Rme(t,e,r,o){let a=[],n=qme(r,o),u=Gme(t,o),A=r.method,p=r.method!==Tme.MethodEnum.Get?{}:{...r.data,...o.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,I=(v,x)=>{let C=v.pop();if(C===void 0)throw Wme(MH(a));let R={data:n,headers:u,method:A,url:_me(C,r.path,h),connectTimeout:x(E,t.timeouts.connect),responseTimeout:x(E,o.timeout)},N=V=>{let te={request:R,response:V,host:C,triesLeft:v.length};return a.push(te),te},U={onSuccess:V=>Mme(V),onRetry(V){let te=N(V);return V.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",HH(te)),t.hostsCache.set(C,UH(C,V.isTimedOut?xC.Timeouted:xC.Down))]).then(()=>I(v,x))},onFail(V){throw N(V),Ume(V,MH(a))}};return t.requester.send(R).then(V=>kdt(V,U))};return Pdt(t.hostsCache,e).then(v=>I([...v.statelessHosts].reverse(),v.getTimeout))}function Qdt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,I={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(v=>_H(v)),read(v,x){let C=OH(x,I.timeouts.read),R=()=>Rme(I,I.hosts.filter(V=>(V.accept&K2.Read)!==0),v,C);if((C.cacheable!==void 0?C.cacheable:v.cacheable)!==!0)return R();let U={request:v,mappedRequestOptions:C,transporter:{queryParameters:I.queryParameters,headers:I.headers}};return I.responsesCache.get(U,()=>I.requestsCache.get(U,()=>I.requestsCache.set(U,R()).then(V=>Promise.all([I.requestsCache.delete(U),V]),V=>Promise.all([I.requestsCache.delete(U),Promise.reject(V)])).then(([V,te])=>te)),{miss:V=>I.responsesCache.set(U,V)})},write(v,x){return Rme(I,I.hosts.filter(C=>(C.accept&K2.Write)!==0),v,OH(x,I.timeouts.write))}};return I}function Fdt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function Mme(t){try{return JSON.parse(t.content)}catch(e){throw Yme(e.message,t)}}function Ume({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return jme(o,e,r)}function Rdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function _me(t,e,r){let o=Hme(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function Hme(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Rdt("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function qme(t,e){if(t.method===Tme.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function Gme(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function MH(t){return t.map(e=>HH(e))}function HH(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function jme(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function Yme(t,e){return{name:"DeserializationError",message:t,response:e}}function Wme(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}Fi.CallEnum=K2;Fi.HostStatusEnum=xC;Fi.createApiError=jme;Fi.createDeserializationError=Yme;Fi.createMappedRequestOptions=OH;Fi.createRetryError=Wme;Fi.createStatefulHost=UH;Fi.createStatelessHost=_H;Fi.createTransporter=Qdt;Fi.createUserAgent=Fdt;Fi.deserializeFailure=Ume;Fi.deserializeSuccess=Mme;Fi.isStatefulHostTimeouted=Ome;Fi.isStatefulHostUp=Nme;Fi.serializeData=qme;Fi.serializeHeaders=Gme;Fi.serializeQueryParameters=Hme;Fi.serializeUrl=_me;Fi.stackFrameWithoutCredentials=HH;Fi.stackTraceWithoutCredentials=MH});var z2=_((_Wt,zme)=>{zme.exports=Kme()});var Vme=_(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});var kC=Y2(),Tdt=z2(),V2=W2(),Ldt=t=>{let e=t.region||"us",r=kC.createAuth(kC.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Tdt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return kC.addMethods({appId:a,transporter:o},t.methods)},Ndt=t=>(e,r)=>t.transporter.write({method:V2.MethodEnum.Post,path:"2/abtests",data:e},r),Odt=t=>(e,r)=>t.transporter.write({method:V2.MethodEnum.Delete,path:kC.encode("2/abtests/%s",e)},r),Mdt=t=>(e,r)=>t.transporter.read({method:V2.MethodEnum.Get,path:kC.encode("2/abtests/%s",e)},r),Udt=t=>e=>t.transporter.read({method:V2.MethodEnum.Get,path:"2/abtests"},e),_dt=t=>(e,r)=>t.transporter.write({method:V2.MethodEnum.Post,path:kC.encode("2/abtests/%s/stop",e)},r);y0.addABTest=Ndt;y0.createAnalyticsClient=Ldt;y0.deleteABTest=Odt;y0.getABTest=Mdt;y0.getABTests=Udt;y0.stopABTest=_dt});var Xme=_((qWt,Jme)=>{Jme.exports=Vme()});var $me=_(J2=>{"use strict";Object.defineProperty(J2,"__esModule",{value:!0});var qH=Y2(),Hdt=z2(),Zme=W2(),qdt=t=>{let e=t.region||"us",r=qH.createAuth(qH.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Hdt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return qH.addMethods({appId:t.appId,transporter:o},t.methods)},Gdt=t=>e=>t.transporter.read({method:Zme.MethodEnum.Get,path:"1/strategies/personalization"},e),jdt=t=>(e,r)=>t.transporter.write({method:Zme.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);J2.createPersonalizationClient=qdt;J2.getPersonalizationStrategy=Gdt;J2.setPersonalizationStrategy=jdt});var tye=_((jWt,eye)=>{eye.exports=$me()});var gye=_(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});var jt=Y2(),La=z2(),Ir=W2(),Ydt=ve("crypto");function Bk(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var Wdt=t=>{let e=t.appId,r=jt.createAuth(t.authMode!==void 0?t.authMode:jt.AuthMode.WithinHeaders,e,t.apiKey),o=La.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:La.CallEnum.Read},{url:`${e}.algolia.net`,accept:La.CallEnum.Write}].concat(jt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return jt.addMethods(a,t.methods)};function rye(){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 nye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function iye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Kdt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>jt.createRetryablePromise(h=>X2(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:"1/keys",data:n},a),u)},zdt=t=>(e,r,o)=>{let a=La.createMappedRequestOptions(o);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Ir.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},Vdt=t=>(e,r,o)=>t.transporter.write({method:Ir.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},o),Jdt=t=>(e,r)=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(o,a)=>QC(t)(o.taskID,a)),vk=t=>(e,r,o)=>{let a=(n,u)=>Z2(t)(e,{methods:{waitTask:Zi}}).waitTask(n.taskID,u);return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},o),a)},Xdt=t=>(e,r,o)=>vk(t)(e,r,{...o,scope:[Pk.Rules]}),Zdt=t=>(e,r,o)=>vk(t)(e,r,{...o,scope:[Pk.Settings]}),$dt=t=>(e,r,o)=>vk(t)(e,r,{...o,scope:[Pk.Synonyms]}),emt=t=>(e,r)=>e.method===Ir.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),tmt=t=>(e,r)=>{let o=(a,n)=>jt.createRetryablePromise(u=>X2(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:jt.encode("1/keys/%s",e)},r),o)},rmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>QC(t)(n.taskID,u))},nmt=()=>(t,e)=>{let r=La.serializeQueryParameters(e),o=Ydt.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(o+r).toString("base64")},X2=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/keys/%s",e)},r),sye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/task/%s",e.toString())},r),imt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),smt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/logs"},e),omt=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,o=e.match(r);if(o===null)throw iye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},amt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping/top"},e),lmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/clusters/mapping/%s",e)},r),cmt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping/pending"},o)},Z2=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return jt.addMethods(o,r.methods)},umt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/keys"},e),Amt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters"},e),fmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/indexes"},e),pmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:"1/clusters/mapping"},e),hmt=t=>(e,r,o)=>{let a=(n,u)=>Z2(t)(e,{methods:{waitTask:Zi}}).waitTask(n.taskID,u);return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},o),a)},gmt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>Z2(t)(u,{methods:{waitTask:Zi}}).waitTask(a.taskID[u],n)));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),o)},dmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),mmt=t=>(e,r)=>{let o=e.map(a=>({...a,params:La.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)},ymt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return Z2(t)(o.indexName,{methods:{searchForFacetValues:fye}}).searchForFacetValues(a,n,{...r,...u})})),Emt=t=>(e,r)=>{let o=La.createMappedRequestOptions(r);return o.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Ir.MethodEnum.Delete,path:"1/clusters/mapping"},o)},Cmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>QC(t)(n.taskID,u))},wmt=t=>(e,r)=>{let o=(a,n)=>jt.createRetryablePromise(u=>X2(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/keys/%s/restore",e)},r),o)},Imt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>QC(t)(n.taskID,u))},Bmt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},o),vmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),Dmt=t=>(e,r)=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(o,a)=>QC(t)(o.taskID,a)),Pmt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(o).filter(I=>A.indexOf(I)!==-1).every(I=>{if(Array.isArray(E[I])&&Array.isArray(o[I])){let v=E[I];return v.length===o[I].length&&v.every((x,C)=>x===o[I][C])}else return E[I]===o[I]}),h=(E,I)=>jt.createRetryablePromise(v=>X2(t)(e,I).then(x=>p(x)?Promise.resolve():v()));return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:jt.encode("1/keys/%s",e),data:u},n),h)},QC=t=>(e,r)=>jt.createRetryablePromise(o=>sye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),oye=t=>(e,r)=>{let o=(a,n)=>Zi(t)(a.taskID,n);return jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),o)},Smt=t=>e=>Bk({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),bmt=t=>e=>{let r={hitsPerPage:1e3,...e};return Bk({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},xmt=t=>e=>{let r={hitsPerPage:1e3,...e};return Bk({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Dk=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:I})),n).then(I=>(u.objectIDs=u.objectIDs.concat(I.objectIDs),u.taskIDs.push(I.taskID),E++,A(E)))};return jt.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>Zi(t)(E,h))))},kmt=t=>e=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/clear",t.indexName)},e),(r,o)=>Zi(t)(r.taskID,o)),Qmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=La.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,u)=>Zi(t)(n.taskID,u))},Fmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=La.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,u)=>Zi(t)(n.taskID,u))},Rmt=t=>(e,r)=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(o,a)=>Zi(t)(o.taskID,a)),Tmt=t=>e=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:jt.encode("1/indexes/%s",t.indexName)},e),(r,o)=>Zi(t)(r.taskID,o)),Lmt=t=>(e,r)=>jt.createWaitablePromise(aye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),aye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return Dk(t)(o,im.DeleteObject,r)},Nmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=La.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:jt.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(u,A)=>Zi(t)(u.taskID,A))},Omt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=La.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:jt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(u,A)=>Zi(t)(u.taskID,A))},Mmt=t=>e=>lye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Umt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),_mt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>Aye(t)(o||"",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw nye();return A()});return A()},Hmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/indexes/%s/%s",t.indexName,e)},r),qmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},Gmt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:Ir.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},jmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),lye=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),Ymt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),cye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:jt.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),Wmt=t=>(e,r)=>jt.createWaitablePromise(uye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),uye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?im.PartialUpdateObject:im.PartialUpdateObjectNoCreate;return Dk(t)(e,n,a)},Kmt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,R,N,U)=>jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/operation",C),data:{operation:N,destination:R}},U),(V,te)=>Zi(t)(V.taskID,te)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=GH({appId:t.appId,transporter:t.transporter,indexName:h}),I=[],v=A(t.indexName,h,"copy",{...u,scope:["settings","synonyms","rules"]});I.push(v);let x=(o?v.wait(u):v).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return I.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,"move",u);return I.push(C),o?C.wait(u):C}).then(()=>Promise.all(I)).then(([C,R,N])=>({objectIDs:R.objectIDs,taskIDs:[C.taskID,...R.taskIDs,N.taskID]}));return jt.createWaitablePromise(x,(C,R)=>Promise.all(I.map(N=>N.wait(R))))},zmt=t=>(e,r)=>jH(t)(e,{...r,clearExistingRules:!0}),Vmt=t=>(e,r)=>YH(t)(e,{...r,clearExistingSynonyms:!0}),Jmt=t=>(e,r)=>jt.createWaitablePromise(GH(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>Zi(t)(o.taskID,a)),GH=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?im.AddObject:im.UpdateObject;if(n===im.UpdateObject){for(let u of e)if(u.objectID===void 0)return jt.createWaitablePromise(Promise.reject(rye()))}return Dk(t)(e,n,a)},Xmt=t=>(e,r)=>jH(t)([e],r),jH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=La.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/rules/batch",t.indexName),data:e},u),(A,p)=>Zi(t)(A.taskID,p))},Zmt=t=>(e,r)=>YH(t)([e],r),YH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=La.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},A),(p,h)=>Zi(t)(p.taskID,h))},Aye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),fye=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),pye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),hye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:jt.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),$mt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=La.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),jt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:jt.encode("1/indexes/%s/settings",t.indexName),data:e},n),(u,A)=>Zi(t)(u.taskID,A))},Zi=t=>(e,r)=>jt.createRetryablePromise(o=>cye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),eyt={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",Inference:"inference",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},im={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},Pk={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},tyt={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},ryt={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Ft.ApiKeyACLEnum=eyt;Ft.BatchActionEnum=im;Ft.ScopeEnum=Pk;Ft.StrategyEnum=tyt;Ft.SynonymEnum=ryt;Ft.addApiKey=Kdt;Ft.assignUserID=zdt;Ft.assignUserIDs=Vdt;Ft.batch=oye;Ft.browseObjects=Smt;Ft.browseRules=bmt;Ft.browseSynonyms=xmt;Ft.chunkedBatch=Dk;Ft.clearDictionaryEntries=Jdt;Ft.clearObjects=kmt;Ft.clearRules=Qmt;Ft.clearSynonyms=Fmt;Ft.copyIndex=vk;Ft.copyRules=Xdt;Ft.copySettings=Zdt;Ft.copySynonyms=$dt;Ft.createBrowsablePromise=Bk;Ft.createMissingObjectIDError=rye;Ft.createObjectNotFoundError=nye;Ft.createSearchClient=Wdt;Ft.createValidUntilNotFoundError=iye;Ft.customRequest=emt;Ft.deleteApiKey=tmt;Ft.deleteBy=Rmt;Ft.deleteDictionaryEntries=rmt;Ft.deleteIndex=Tmt;Ft.deleteObject=Lmt;Ft.deleteObjects=aye;Ft.deleteRule=Nmt;Ft.deleteSynonym=Omt;Ft.exists=Mmt;Ft.findAnswers=Umt;Ft.findObject=_mt;Ft.generateSecuredApiKey=nmt;Ft.getApiKey=X2;Ft.getAppTask=sye;Ft.getDictionarySettings=imt;Ft.getLogs=smt;Ft.getObject=Hmt;Ft.getObjectPosition=qmt;Ft.getObjects=Gmt;Ft.getRule=jmt;Ft.getSecuredApiKeyRemainingValidity=omt;Ft.getSettings=lye;Ft.getSynonym=Ymt;Ft.getTask=cye;Ft.getTopUserIDs=amt;Ft.getUserID=lmt;Ft.hasPendingMappings=cmt;Ft.initIndex=Z2;Ft.listApiKeys=umt;Ft.listClusters=Amt;Ft.listIndices=fmt;Ft.listUserIDs=pmt;Ft.moveIndex=hmt;Ft.multipleBatch=gmt;Ft.multipleGetObjects=dmt;Ft.multipleQueries=mmt;Ft.multipleSearchForFacetValues=ymt;Ft.partialUpdateObject=Wmt;Ft.partialUpdateObjects=uye;Ft.removeUserID=Emt;Ft.replaceAllObjects=Kmt;Ft.replaceAllRules=zmt;Ft.replaceAllSynonyms=Vmt;Ft.replaceDictionaryEntries=Cmt;Ft.restoreApiKey=wmt;Ft.saveDictionaryEntries=Imt;Ft.saveObject=Jmt;Ft.saveObjects=GH;Ft.saveRule=Xmt;Ft.saveRules=jH;Ft.saveSynonym=Zmt;Ft.saveSynonyms=YH;Ft.search=Aye;Ft.searchDictionaryEntries=Bmt;Ft.searchForFacetValues=fye;Ft.searchRules=pye;Ft.searchSynonyms=hye;Ft.searchUserIDs=vmt;Ft.setDictionarySettings=Dmt;Ft.setSettings=$mt;Ft.updateApiKey=Pmt;Ft.waitAppTask=QC;Ft.waitTask=Zi});var mye=_((WWt,dye)=>{dye.exports=gye()});var yye=_(Sk=>{"use strict";Object.defineProperty(Sk,"__esModule",{value:!0});function nyt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var iyt={Debug:1,Info:2,Error:3};Sk.LogLevelEnum=iyt;Sk.createNullLogger=nyt});var Cye=_((zWt,Eye)=>{Eye.exports=yye()});var vye=_(WH=>{"use strict";Object.defineProperty(WH,"__esModule",{value:!0});var wye=ve("http"),Iye=ve("https"),syt=ve("url"),Bye={keepAlive:!0},oyt=new wye.Agent(Bye),ayt=new Iye.Agent(Bye);function lyt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||oyt,n=r||t||ayt;return{send(u){return new Promise(A=>{let p=syt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||""}:{}},I=(p.protocol==="https:"?Iye:wye).request(E,R=>{let N=[];R.on("data",U=>{N=N.concat(U)}),R.on("end",()=>{clearTimeout(x),clearTimeout(C),A({status:R.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),v=(R,N)=>setTimeout(()=>{I.abort(),A({status:0,content:N,isTimedOut:!0})},R*1e3),x=v(u.connectTimeout,"Connection timeout"),C;I.on("error",R=>{clearTimeout(x),clearTimeout(C),A({status:0,content:R.message,isTimedOut:!1})}),I.once("response",()=>{clearTimeout(x),C=v(u.responseTimeout,"Socket timeout")}),u.data!==void 0&&I.write(u.data),I.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}WH.createNodeHttpRequester=lyt});var Pye=_((JWt,Dye)=>{Dye.exports=vye()});var kye=_((XWt,xye)=>{"use strict";var Sye=vme(),cyt=Sme(),FC=Xme(),zH=Y2(),KH=tye(),_t=mye(),uyt=Cye(),Ayt=Pye(),fyt=z2();function bye(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:Ayt.createNodeHttpRequester(),logger:uyt.createNullLogger(),responsesCache:Sye.createNullCache(),requestsCache:Sye.createNullCache(),hostsCache:cyt.createInMemoryCache(),userAgent:fyt.createUserAgent(zH.version).add({segment:"Node.js",version:process.versions.node})},a={...o,...r},n=()=>u=>KH.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:KH.getPersonalizationStrategy,setPersonalizationStrategy:KH.setPersonalizationStrategy}});return _t.createSearchClient({...a,methods:{search:_t.multipleQueries,searchForFacetValues:_t.multipleSearchForFacetValues,multipleBatch:_t.multipleBatch,multipleGetObjects:_t.multipleGetObjects,multipleQueries:_t.multipleQueries,copyIndex:_t.copyIndex,copySettings:_t.copySettings,copyRules:_t.copyRules,copySynonyms:_t.copySynonyms,moveIndex:_t.moveIndex,listIndices:_t.listIndices,getLogs:_t.getLogs,listClusters:_t.listClusters,multipleSearchForFacetValues:_t.multipleSearchForFacetValues,getApiKey:_t.getApiKey,addApiKey:_t.addApiKey,listApiKeys:_t.listApiKeys,updateApiKey:_t.updateApiKey,deleteApiKey:_t.deleteApiKey,restoreApiKey:_t.restoreApiKey,assignUserID:_t.assignUserID,assignUserIDs:_t.assignUserIDs,getUserID:_t.getUserID,searchUserIDs:_t.searchUserIDs,listUserIDs:_t.listUserIDs,getTopUserIDs:_t.getTopUserIDs,removeUserID:_t.removeUserID,hasPendingMappings:_t.hasPendingMappings,generateSecuredApiKey:_t.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:_t.getSecuredApiKeyRemainingValidity,destroy:zH.destroy,clearDictionaryEntries:_t.clearDictionaryEntries,deleteDictionaryEntries:_t.deleteDictionaryEntries,getDictionarySettings:_t.getDictionarySettings,getAppTask:_t.getAppTask,replaceDictionaryEntries:_t.replaceDictionaryEntries,saveDictionaryEntries:_t.saveDictionaryEntries,searchDictionaryEntries:_t.searchDictionaryEntries,setDictionarySettings:_t.setDictionarySettings,waitAppTask:_t.waitAppTask,customRequest:_t.customRequest,initIndex:u=>A=>_t.initIndex(u)(A,{methods:{batch:_t.batch,delete:_t.deleteIndex,findAnswers:_t.findAnswers,getObject:_t.getObject,getObjects:_t.getObjects,saveObject:_t.saveObject,saveObjects:_t.saveObjects,search:_t.search,searchForFacetValues:_t.searchForFacetValues,waitTask:_t.waitTask,setSettings:_t.setSettings,getSettings:_t.getSettings,partialUpdateObject:_t.partialUpdateObject,partialUpdateObjects:_t.partialUpdateObjects,deleteObject:_t.deleteObject,deleteObjects:_t.deleteObjects,deleteBy:_t.deleteBy,clearObjects:_t.clearObjects,browseObjects:_t.browseObjects,getObjectPosition:_t.getObjectPosition,findObject:_t.findObject,exists:_t.exists,saveSynonym:_t.saveSynonym,saveSynonyms:_t.saveSynonyms,getSynonym:_t.getSynonym,searchSynonyms:_t.searchSynonyms,browseSynonyms:_t.browseSynonyms,deleteSynonym:_t.deleteSynonym,clearSynonyms:_t.clearSynonyms,replaceAllObjects:_t.replaceAllObjects,replaceAllSynonyms:_t.replaceAllSynonyms,searchRules:_t.searchRules,getRule:_t.getRule,deleteRule:_t.deleteRule,saveRule:_t.saveRule,saveRules:_t.saveRules,replaceAllRules:_t.replaceAllRules,browseRules:_t.browseRules,clearRules:_t.clearRules}}),initAnalytics:()=>u=>FC.createAnalyticsClient({...o,...u,methods:{addABTest:FC.addABTest,getABTest:FC.getABTest,getABTests:FC.getABTests,stopABTest:FC.stopABTest,deleteABTest:FC.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(u))}})}bye.version=zH.version;xye.exports=bye});var JH=_((ZWt,VH)=>{var Qye=kye();VH.exports=Qye;VH.exports.default=Qye});var $H=_((eKt,Tye)=>{"use strict";var Rye=Object.getOwnPropertySymbols,hyt=Object.prototype.hasOwnProperty,gyt=Object.prototype.propertyIsEnumerable;function dyt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function myt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}Tye.exports=myt()?Object.assign:function(t,e){for(var r,o=dyt(t),a,n=1;n{"use strict";var i6=$H(),eu=typeof Symbol=="function"&&Symbol.for,$2=eu?Symbol.for("react.element"):60103,yyt=eu?Symbol.for("react.portal"):60106,Eyt=eu?Symbol.for("react.fragment"):60107,Cyt=eu?Symbol.for("react.strict_mode"):60108,wyt=eu?Symbol.for("react.profiler"):60114,Iyt=eu?Symbol.for("react.provider"):60109,Byt=eu?Symbol.for("react.context"):60110,vyt=eu?Symbol.for("react.forward_ref"):60112,Dyt=eu?Symbol.for("react.suspense"):60113,Pyt=eu?Symbol.for("react.memo"):60115,Syt=eu?Symbol.for("react.lazy"):60116,Lye=typeof Symbol=="function"&&Symbol.iterator;function eB(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;rbk.length&&bk.push(t)}function t6(t,e,r,o){var a=typeof t;(a==="undefined"||a==="boolean")&&(t=null);var n=!1;if(t===null)n=!0;else switch(a){case"string":case"number":n=!0;break;case"object":switch(t.$$typeof){case $2:case yyt:n=!0}}if(n)return r(o,t,e===""?"."+e6(t,0):e),1;if(n=0,e=e===""?".":e+":",Array.isArray(t))for(var u=0;u{"use strict";Kye.exports=Wye()});var u6=_((nKt,c6)=>{"use strict";var An=c6.exports;c6.exports.default=An;var Nn="\x1B[",tB="\x1B]",TC="\x07",xk=";",zye=process.env.TERM_PROGRAM==="Apple_Terminal";An.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?Nn+(t+1)+"G":Nn+(e+1)+";"+(t+1)+"H"};An.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=Nn+-t+"D":t>0&&(r+=Nn+t+"C"),e<0?r+=Nn+-e+"A":e>0&&(r+=Nn+e+"B"),r};An.cursorUp=(t=1)=>Nn+t+"A";An.cursorDown=(t=1)=>Nn+t+"B";An.cursorForward=(t=1)=>Nn+t+"C";An.cursorBackward=(t=1)=>Nn+t+"D";An.cursorLeft=Nn+"G";An.cursorSavePosition=zye?"\x1B7":Nn+"s";An.cursorRestorePosition=zye?"\x1B8":Nn+"u";An.cursorGetPosition=Nn+"6n";An.cursorNextLine=Nn+"E";An.cursorPrevLine=Nn+"F";An.cursorHide=Nn+"?25l";An.cursorShow=Nn+"?25h";An.eraseLines=t=>{let e="";for(let r=0;r[tB,"8",xk,xk,e,TC,t,tB,"8",xk,xk,TC].join("");An.image=(t,e={})=>{let r=`${tB}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+TC};An.iTerm={setCwd:(t=process.cwd())=>`${tB}50;CurrentDir=${t}${TC}`,annotation:(t,e={})=>{let r=`${tB}1337;`,o=typeof e.x<"u",a=typeof e.y<"u";if((o||a)&&!(o&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+TC}}});var Jye=_((iKt,A6)=>{"use strict";var Vye=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};A6.exports=Vye;A6.exports.default=Vye});var Zye=_((sKt,Qk)=>{"use strict";var Ryt=Jye(),kk=new WeakMap,Xye=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0,a=t.displayName||t.name||"",n=function(...u){if(kk.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return Ryt(n,t),kk.set(n,o),n};Qk.exports=Xye;Qk.exports.default=Xye;Qk.exports.callCount=t=>{if(!kk.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return kk.get(t)}});var $ye=_((oKt,Fk)=>{Fk.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&Fk.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&Fk.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var h6=_((aKt,OC)=>{var Ei=global.process,sm=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};sm(Ei)?(eEe=ve("assert"),LC=$ye(),tEe=/^win/i.test(Ei.platform),rB=ve("events"),typeof rB!="function"&&(rB=rB.EventEmitter),Ei.__signal_exit_emitter__?Ts=Ei.__signal_exit_emitter__:(Ts=Ei.__signal_exit_emitter__=new rB,Ts.count=0,Ts.emitted={}),Ts.infinite||(Ts.setMaxListeners(1/0),Ts.infinite=!0),OC.exports=function(t,e){if(!sm(global.process))return function(){};eEe.equal(typeof t,"function","a callback must be provided for exit handler"),NC===!1&&f6();var r="exit";e&&e.alwaysLast&&(r="afterexit");var o=function(){Ts.removeListener(r,t),Ts.listeners("exit").length===0&&Ts.listeners("afterexit").length===0&&Rk()};return Ts.on(r,t),o},Rk=function(){!NC||!sm(global.process)||(NC=!1,LC.forEach(function(e){try{Ei.removeListener(e,Tk[e])}catch{}}),Ei.emit=Lk,Ei.reallyExit=p6,Ts.count-=1)},OC.exports.unload=Rk,om=function(e,r,o){Ts.emitted[e]||(Ts.emitted[e]=!0,Ts.emit(e,r,o))},Tk={},LC.forEach(function(t){Tk[t]=function(){if(!!sm(global.process)){var r=Ei.listeners(t);r.length===Ts.count&&(Rk(),om("exit",null,t),om("afterexit",null,t),tEe&&t==="SIGHUP"&&(t="SIGINT"),Ei.kill(Ei.pid,t))}}}),OC.exports.signals=function(){return LC},NC=!1,f6=function(){NC||!sm(global.process)||(NC=!0,Ts.count+=1,LC=LC.filter(function(e){try{return Ei.on(e,Tk[e]),!0}catch{return!1}}),Ei.emit=nEe,Ei.reallyExit=rEe)},OC.exports.load=f6,p6=Ei.reallyExit,rEe=function(e){!sm(global.process)||(Ei.exitCode=e||0,om("exit",Ei.exitCode,null),om("afterexit",Ei.exitCode,null),p6.call(Ei,Ei.exitCode))},Lk=Ei.emit,nEe=function(e,r){if(e==="exit"&&sm(global.process)){r!==void 0&&(Ei.exitCode=r);var o=Lk.apply(this,arguments);return om("exit",Ei.exitCode,null),om("afterexit",Ei.exitCode,null),o}else return Lk.apply(this,arguments)}):OC.exports=function(){return function(){}};var eEe,LC,tEe,rB,Ts,Rk,om,Tk,NC,f6,p6,rEe,Lk,nEe});var sEe=_((lKt,iEe)=>{"use strict";var Tyt=Zye(),Lyt=h6();iEe.exports=Tyt(()=>{Lyt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var g6=_(MC=>{"use strict";var Nyt=sEe(),Nk=!1;MC.show=(t=process.stderr)=>{!t.isTTY||(Nk=!1,t.write("\x1B[?25h"))};MC.hide=(t=process.stderr)=>{!t.isTTY||(Nyt(),Nk=!0,t.write("\x1B[?25l"))};MC.toggle=(t,e)=>{t!==void 0&&(Nk=t),Nk?MC.show(e):MC.hide(e)}});var cEe=_(nB=>{"use strict";var lEe=nB&&nB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nB,"__esModule",{value:!0});var oEe=lEe(u6()),aEe=lEe(g6()),Oyt=(t,{showCursor:e=!1}={})=>{let r=0,o="",a=!1,n=u=>{!e&&!a&&(aEe.default.hide(),a=!0);let A=u+` +`;A!==o&&(o=A,t.write(oEe.default.eraseLines(r)+A),r=A.split(` +`).length)};return n.clear=()=>{t.write(oEe.default.eraseLines(r)),o="",r=0},n.done=()=>{o="",r=0,e||(aEe.default.show(),a=!1)},n};nB.default={create:Oyt}});var uEe=_((AKt,Myt)=>{Myt.exports=[{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"}}]});var pEe=_(dl=>{"use strict";var fEe=uEe(),hA=process.env;Object.defineProperty(dl,"_vendors",{value:fEe.map(function(t){return t.constant})});dl.name=null;dl.isPR=null;fEe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return AEe(o)});if(dl[t.constant]=r,r)switch(dl.name=t.name,typeof t.pr){case"string":dl.isPR=!!hA[t.pr];break;case"object":"env"in t.pr?dl.isPR=t.pr.env in hA&&hA[t.pr.env]!==t.pr.ne:"any"in t.pr?dl.isPR=t.pr.any.some(function(o){return!!hA[o]}):dl.isPR=AEe(t.pr);break;default:dl.isPR=null}});dl.isCI=!!(hA.CI||hA.CONTINUOUS_INTEGRATION||hA.BUILD_NUMBER||hA.RUN_ID||dl.name);function AEe(t){return typeof t=="string"?!!hA[t]:Object.keys(t).every(function(e){return hA[e]===t[e]})}});var gEe=_((pKt,hEe)=>{"use strict";hEe.exports=pEe().isCI});var mEe=_((hKt,dEe)=>{"use strict";var Uyt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};dEe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u=="string"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of Uyt(t.constructor.prototype)){if(n==="constructor"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value=="function"&&(t[n]=t[n].bind(t))}return t}});var vEe=_(kn=>{"use strict";Object.defineProperty(kn,"__esModule",{value:!0});var _C,oB,Hk,qk,I6;typeof window>"u"||typeof MessageChannel!="function"?(UC=null,d6=null,m6=function(){if(UC!==null)try{var t=kn.unstable_now();UC(!0,t),UC=null}catch(e){throw setTimeout(m6,0),e}},yEe=Date.now(),kn.unstable_now=function(){return Date.now()-yEe},_C=function(t){UC!==null?setTimeout(_C,0,t):(UC=t,setTimeout(m6,0))},oB=function(t,e){d6=setTimeout(t,e)},Hk=function(){clearTimeout(d6)},qk=function(){return!1},I6=kn.unstable_forceFrameRate=function(){}):(Ok=window.performance,y6=window.Date,EEe=window.setTimeout,CEe=window.clearTimeout,typeof console<"u"&&(wEe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),typeof wEe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")),typeof Ok=="object"&&typeof Ok.now=="function"?kn.unstable_now=function(){return Ok.now()}:(IEe=y6.now(),kn.unstable_now=function(){return y6.now()-IEe}),iB=!1,sB=null,Mk=-1,E6=5,C6=0,qk=function(){return kn.unstable_now()>=C6},I6=function(){},kn.unstable_forceFrameRate=function(t){0>t||125_k(u,r))p!==void 0&&0>_k(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>_k(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function _k(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var tu=[],E0=[],_yt=1,na=null,No=3,jk=!1,am=!1,aB=!1;function Yk(t){for(var e=ic(E0);e!==null;){if(e.callback===null)Gk(E0);else if(e.startTime<=t)Gk(E0),e.sortIndex=e.expirationTime,B6(tu,e);else break;e=ic(E0)}}function v6(t){if(aB=!1,Yk(t),!am)if(ic(tu)!==null)am=!0,_C(D6);else{var e=ic(E0);e!==null&&oB(v6,e.startTime-t)}}function D6(t,e){am=!1,aB&&(aB=!1,Hk()),jk=!0;var r=No;try{for(Yk(e),na=ic(tu);na!==null&&(!(na.expirationTime>e)||t&&!qk());){var o=na.callback;if(o!==null){na.callback=null,No=na.priorityLevel;var a=o(na.expirationTime<=e);e=kn.unstable_now(),typeof a=="function"?na.callback=a:na===ic(tu)&&Gk(tu),Yk(e)}else Gk(tu);na=ic(tu)}if(na!==null)var n=!0;else{var u=ic(E0);u!==null&&oB(v6,u.startTime-e),n=!1}return n}finally{na=null,No=r,jk=!1}}function BEe(t){switch(t){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var Hyt=I6;kn.unstable_ImmediatePriority=1;kn.unstable_UserBlockingPriority=2;kn.unstable_NormalPriority=3;kn.unstable_IdlePriority=5;kn.unstable_LowPriority=4;kn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=No;No=t;try{return e()}finally{No=r}};kn.unstable_next=function(t){switch(No){case 1:case 2:case 3:var e=3;break;default:e=No}var r=No;No=e;try{return t()}finally{No=r}};kn.unstable_scheduleCallback=function(t,e,r){var o=kn.unstable_now();if(typeof r=="object"&&r!==null){var a=r.delay;a=typeof a=="number"&&0o?(t.sortIndex=a,B6(E0,t),ic(tu)===null&&t===ic(E0)&&(aB?Hk():aB=!0,oB(v6,a-o))):(t.sortIndex=r,B6(tu,t),am||jk||(am=!0,_C(D6))),t};kn.unstable_cancelCallback=function(t){t.callback=null};kn.unstable_wrapCallback=function(t){var e=No;return function(){var r=No;No=e;try{return t.apply(this,arguments)}finally{No=r}}};kn.unstable_getCurrentPriorityLevel=function(){return No};kn.unstable_shouldYield=function(){var t=kn.unstable_now();Yk(t);var e=ic(tu);return e!==na&&na!==null&&e!==null&&e.callback!==null&&e.startTime<=t&&e.expirationTime{"use strict";DEe.exports=vEe()});var PEe=_((mKt,lB)=>{lB.exports=function t(e){"use strict";var r=$H(),o=on(),a=P6();function n(P){for(var D="https://reactjs.org/docs/error-decoder.html?invariant="+P,T=1;Tao||(P.current=El[ao],El[ao]=null,ao--)}function On(P,D){ao++,El[ao]=P.current,P.current=D}var Li={},Mn={current:Li},_i={current:!1},rr=Li;function Oe(P,D){var T=P.type.contextTypes;if(!T)return Li;var q=P.stateNode;if(q&&q.__reactInternalMemoizedUnmaskedChildContext===D)return q.__reactInternalMemoizedMaskedChildContext;var Y={},Ae;for(Ae in T)Y[Ae]=D[Ae];return q&&(P=P.stateNode,P.__reactInternalMemoizedUnmaskedChildContext=D,P.__reactInternalMemoizedMaskedChildContext=Y),Y}function ii(P){return P=P.childContextTypes,P!=null}function Ua(P){zn(_i,P),zn(Mn,P)}function hr(P){zn(_i,P),zn(Mn,P)}function Ac(P,D,T){if(Mn.current!==Li)throw Error(n(168));On(Mn,D,P),On(_i,T,P)}function Au(P,D,T){var q=P.stateNode;if(P=D.childContextTypes,typeof q.getChildContext!="function")return T;q=q.getChildContext();for(var Y in q)if(!(Y in P))throw Error(n(108,he(D)||"Unknown",Y));return r({},T,{},q)}function fc(P){var D=P.stateNode;return D=D&&D.__reactInternalMemoizedMergedChildContext||Li,rr=Mn.current,On(Mn,D,P),On(_i,_i.current,P),!0}function Cl(P,D,T){var q=P.stateNode;if(!q)throw Error(n(169));T?(D=Au(P,D,rr),q.__reactInternalMemoizedMergedChildContext=D,zn(_i,P),zn(Mn,P),On(Mn,D,P)):zn(_i,P),On(_i,T,P)}var DA=a.unstable_runWithPriority,fu=a.unstable_scheduleCallback,Ce=a.unstable_cancelCallback,Rt=a.unstable_shouldYield,pc=a.unstable_requestPaint,Hi=a.unstable_now,pu=a.unstable_getCurrentPriorityLevel,Yt=a.unstable_ImmediatePriority,wl=a.unstable_UserBlockingPriority,PA=a.unstable_NormalPriority,Ap=a.unstable_LowPriority,hc=a.unstable_IdlePriority,SA={},Qn=pc!==void 0?pc:function(){},hi=null,gc=null,bA=!1,sa=Hi(),Ni=1e4>sa?Hi:function(){return Hi()-sa};function _o(){switch(pu()){case Yt:return 99;case wl:return 98;case PA:return 97;case Ap:return 96;case hc:return 95;default:throw Error(n(332))}}function Ze(P){switch(P){case 99:return Yt;case 98:return wl;case 97:return PA;case 96:return Ap;case 95:return hc;default:throw Error(n(332))}}function lo(P,D){return P=Ze(P),DA(P,D)}function dc(P,D,T){return P=Ze(P),fu(P,D,T)}function hu(P){return hi===null?(hi=[P],gc=fu(Yt,gu)):hi.push(P),SA}function qi(){if(gc!==null){var P=gc;gc=null,Ce(P)}gu()}function gu(){if(!bA&&hi!==null){bA=!0;var P=0;try{var D=hi;lo(99,function(){for(;P=D&&(Go=!0),P.firstContext=null)}function ms(P,D){if(aa!==P&&D!==!1&&D!==0)if((typeof D!="number"||D===1073741823)&&(aa=P,D=1073741823),D={context:P,observedBits:D,next:null},Us===null){if(co===null)throw Error(n(308));Us=D,co.dependencies={expirationTime:0,firstContext:D,responders:null}}else Us=Us.next=D;return b?P._currentValue:P._currentValue2}var _s=!1;function Un(P){return{baseState:P,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Pn(P){return{baseState:P.baseState,firstUpdate:P.firstUpdate,lastUpdate:P.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function ys(P,D){return{expirationTime:P,suspenseConfig:D,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function We(P,D){P.lastUpdate===null?P.firstUpdate=P.lastUpdate=D:(P.lastUpdate.next=D,P.lastUpdate=D)}function tt(P,D){var T=P.alternate;if(T===null){var q=P.updateQueue,Y=null;q===null&&(q=P.updateQueue=Un(P.memoizedState))}else q=P.updateQueue,Y=T.updateQueue,q===null?Y===null?(q=P.updateQueue=Un(P.memoizedState),Y=T.updateQueue=Un(T.memoizedState)):q=P.updateQueue=Pn(Y):Y===null&&(Y=T.updateQueue=Pn(q));Y===null||q===Y?We(q,D):q.lastUpdate===null||Y.lastUpdate===null?(We(q,D),We(Y,D)):(We(q,D),Y.lastUpdate=D)}function It(P,D){var T=P.updateQueue;T=T===null?P.updateQueue=Un(P.memoizedState):ir(P,T),T.lastCapturedUpdate===null?T.firstCapturedUpdate=T.lastCapturedUpdate=D:(T.lastCapturedUpdate.next=D,T.lastCapturedUpdate=D)}function ir(P,D){var T=P.alternate;return T!==null&&D===T.updateQueue&&(D=P.updateQueue=Pn(D)),D}function $(P,D,T,q,Y,Ae){switch(T.tag){case 1:return P=T.payload,typeof P=="function"?P.call(Ae,q,Y):P;case 3:P.effectTag=P.effectTag&-4097|64;case 0:if(P=T.payload,Y=typeof P=="function"?P.call(Ae,q,Y):P,Y==null)break;return r({},q,Y);case 2:_s=!0}return q}function ye(P,D,T,q,Y){_s=!1,D=ir(P,D);for(var Ae=D.baseState,De=null,vt=0,wt=D.firstUpdate,xt=Ae;wt!==null;){var _r=wt.expirationTime;_rbn?(ai=Fr,Fr=null):ai=Fr.sibling;var tn=di(rt,Fr,ft[bn],Wt);if(tn===null){Fr===null&&(Fr=ai);break}P&&Fr&&tn.alternate===null&&D(rt,Fr),ze=Ae(tn,ze,bn),Sn===null?vr=tn:Sn.sibling=tn,Sn=tn,Fr=ai}if(bn===ft.length)return T(rt,Fr),vr;if(Fr===null){for(;bnbn?(ai=Fr,Fr=null):ai=Fr.sibling;var ho=di(rt,Fr,tn.value,Wt);if(ho===null){Fr===null&&(Fr=ai);break}P&&Fr&&ho.alternate===null&&D(rt,Fr),ze=Ae(ho,ze,bn),Sn===null?vr=ho:Sn.sibling=ho,Sn=ho,Fr=ai}if(tn.done)return T(rt,Fr),vr;if(Fr===null){for(;!tn.done;bn++,tn=ft.next())tn=is(rt,tn.value,Wt),tn!==null&&(ze=Ae(tn,ze,bn),Sn===null?vr=tn:Sn.sibling=tn,Sn=tn);return vr}for(Fr=q(rt,Fr);!tn.done;bn++,tn=ft.next())tn=po(Fr,rt,bn,tn.value,Wt),tn!==null&&(P&&tn.alternate!==null&&Fr.delete(tn.key===null?bn:tn.key),ze=Ae(tn,ze,bn),Sn===null?vr=tn:Sn.sibling=tn,Sn=tn);return P&&Fr.forEach(function(vF){return D(rt,vF)}),vr}return function(rt,ze,ft,Wt){var vr=typeof ft=="object"&&ft!==null&&ft.type===E&&ft.key===null;vr&&(ft=ft.props.children);var Sn=typeof ft=="object"&&ft!==null;if(Sn)switch(ft.$$typeof){case p:e:{for(Sn=ft.key,vr=ze;vr!==null;){if(vr.key===Sn)if(vr.tag===7?ft.type===E:vr.elementType===ft.type){T(rt,vr.sibling),ze=Y(vr,ft.type===E?ft.props.children:ft.props,Wt),ze.ref=QA(rt,vr,ft),ze.return=rt,rt=ze;break e}else{T(rt,vr);break}else D(rt,vr);vr=vr.sibling}ft.type===E?(ze=xu(ft.props.children,rt.mode,Wt,ft.key),ze.return=rt,rt=ze):(Wt=qm(ft.type,ft.key,ft.props,null,rt.mode,Wt),Wt.ref=QA(rt,ze,ft),Wt.return=rt,rt=Wt)}return De(rt);case h:e:{for(vr=ft.key;ze!==null;){if(ze.key===vr)if(ze.tag===4&&ze.stateNode.containerInfo===ft.containerInfo&&ze.stateNode.implementation===ft.implementation){T(rt,ze.sibling),ze=Y(ze,ft.children||[],Wt),ze.return=rt,rt=ze;break e}else{T(rt,ze);break}else D(rt,ze);ze=ze.sibling}ze=Rw(ft,rt.mode,Wt),ze.return=rt,rt=ze}return De(rt)}if(typeof ft=="string"||typeof ft=="number")return ft=""+ft,ze!==null&&ze.tag===6?(T(rt,ze.sibling),ze=Y(ze,ft,Wt),ze.return=rt,rt=ze):(T(rt,ze),ze=Fw(ft,rt.mode,Wt),ze.return=rt,rt=ze),De(rt);if(kA(ft))return zA(rt,ze,ft,Wt);if(ue(ft))return Yo(rt,ze,ft,Wt);if(Sn&&fp(rt,ft),typeof ft>"u"&&!vr)switch(rt.tag){case 1:case 0:throw rt=rt.type,Error(n(152,rt.displayName||rt.name||"Component"))}return T(rt,ze)}}var du=sg(!0),og=sg(!1),mu={},uo={current:mu},FA={current:mu},yc={current:mu};function ca(P){if(P===mu)throw Error(n(174));return P}function ag(P,D){On(yc,D,P),On(FA,P,P),On(uo,mu,P),D=ne(D),zn(uo,P),On(uo,D,P)}function Ec(P){zn(uo,P),zn(FA,P),zn(yc,P)}function Sm(P){var D=ca(yc.current),T=ca(uo.current);D=ee(T,P.type,D),T!==D&&(On(FA,P,P),On(uo,D,P))}function lg(P){FA.current===P&&(zn(uo,P),zn(FA,P))}var ei={current:0};function pp(P){for(var D=P;D!==null;){if(D.tag===13){var T=D.memoizedState;if(T!==null&&(T=T.dehydrated,T===null||Ns(T)||so(T)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if((D.effectTag&64)!==0)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===P)break;for(;D.sibling===null;){if(D.return===null||D.return===P)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}function cg(P,D){return{responder:P,props:D}}var RA=u.ReactCurrentDispatcher,Hs=u.ReactCurrentBatchConfig,yu=0,qa=null,ji=null,ua=null,Eu=null,Es=null,Cc=null,wc=0,j=null,Dt=0,Il=!1,xi=null,Ic=0;function ct(){throw Error(n(321))}function Cu(P,D){if(D===null)return!1;for(var T=0;Twc&&(wc=_r,Hm(wc))):(Sw(_r,wt.suspenseConfig),Ae=wt.eagerReducer===P?wt.eagerState:P(Ae,wt.action)),De=wt,wt=wt.next}while(wt!==null&&wt!==q);xt||(vt=De,Y=Ae),hs(Ae,D.memoizedState)||(Go=!0),D.memoizedState=Ae,D.baseUpdate=vt,D.baseState=Y,T.lastRenderedState=Ae}return[D.memoizedState,T.dispatch]}function Ag(P){var D=TA();return typeof P=="function"&&(P=P()),D.memoizedState=D.baseState=P,P=D.queue={last:null,dispatch:null,lastRenderedReducer:Br,lastRenderedState:P},P=P.dispatch=dg.bind(null,qa,P),[D.memoizedState,P]}function fg(P){return Cs(Br,P)}function pg(P,D,T,q){return P={tag:P,create:D,destroy:T,deps:q,next:null},j===null?(j={lastEffect:null},j.lastEffect=P.next=P):(D=j.lastEffect,D===null?j.lastEffect=P.next=P:(T=D.next,D.next=P,P.next=T,j.lastEffect=P)),P}function gp(P,D,T,q){var Y=TA();Dt|=P,Y.memoizedState=pg(D,T,void 0,q===void 0?null:q)}function Bc(P,D,T,q){var Y=hp();q=q===void 0?null:q;var Ae=void 0;if(ji!==null){var De=ji.memoizedState;if(Ae=De.destroy,q!==null&&Cu(q,De.deps)){pg(0,T,Ae,q);return}}Dt|=P,Y.memoizedState=pg(D,T,Ae,q)}function Ct(P,D){return gp(516,192,P,D)}function bm(P,D){return Bc(516,192,P,D)}function hg(P,D){if(typeof D=="function")return P=P(),D(P),function(){D(null)};if(D!=null)return P=P(),D.current=P,function(){D.current=null}}function gg(){}function wu(P,D){return TA().memoizedState=[P,D===void 0?null:D],P}function xm(P,D){var T=hp();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&Cu(D,q[1])?q[0]:(T.memoizedState=[P,D],P)}function dg(P,D,T){if(!(25>Ic))throw Error(n(301));var q=P.alternate;if(P===qa||q!==null&&q===qa)if(Il=!0,P={expirationTime:yu,suspenseConfig:null,action:T,eagerReducer:null,eagerState:null,next:null},xi===null&&(xi=new Map),T=xi.get(D),T===void 0)xi.set(D,P);else{for(D=T;D.next!==null;)D=D.next;D.next=P}else{var Y=ga(),Ae=ht.suspense;Y=qA(Y,P,Ae),Ae={expirationTime:Y,suspenseConfig:Ae,action:T,eagerReducer:null,eagerState:null,next:null};var De=D.last;if(De===null)Ae.next=Ae;else{var vt=De.next;vt!==null&&(Ae.next=vt),De.next=Ae}if(D.last=Ae,P.expirationTime===0&&(q===null||q.expirationTime===0)&&(q=D.lastRenderedReducer,q!==null))try{var wt=D.lastRenderedState,xt=q(wt,T);if(Ae.eagerReducer=q,Ae.eagerState=xt,hs(xt,wt))return}catch{}finally{}bc(P,Y)}}var Iu={readContext:ms,useCallback:ct,useContext:ct,useEffect:ct,useImperativeHandle:ct,useLayoutEffect:ct,useMemo:ct,useReducer:ct,useRef:ct,useState:ct,useDebugValue:ct,useResponder:ct,useDeferredValue:ct,useTransition:ct},Ew={readContext:ms,useCallback:wu,useContext:ms,useEffect:Ct,useImperativeHandle:function(P,D,T){return T=T!=null?T.concat([P]):null,gp(4,36,hg.bind(null,D,P),T)},useLayoutEffect:function(P,D){return gp(4,36,P,D)},useMemo:function(P,D){var T=TA();return D=D===void 0?null:D,P=P(),T.memoizedState=[P,D],P},useReducer:function(P,D,T){var q=TA();return D=T!==void 0?T(D):D,q.memoizedState=q.baseState=D,P=q.queue={last:null,dispatch:null,lastRenderedReducer:P,lastRenderedState:D},P=P.dispatch=dg.bind(null,qa,P),[q.memoizedState,P]},useRef:function(P){var D=TA();return P={current:P},D.memoizedState=P},useState:Ag,useDebugValue:gg,useResponder:cg,useDeferredValue:function(P,D){var T=Ag(P),q=T[0],Y=T[1];return Ct(function(){a.unstable_next(function(){var Ae=Hs.suspense;Hs.suspense=D===void 0?null:D;try{Y(P)}finally{Hs.suspense=Ae}})},[P,D]),q},useTransition:function(P){var D=Ag(!1),T=D[0],q=D[1];return[wu(function(Y){q(!0),a.unstable_next(function(){var Ae=Hs.suspense;Hs.suspense=P===void 0?null:P;try{q(!1),Y()}finally{Hs.suspense=Ae}})},[P,T]),T]}},km={readContext:ms,useCallback:xm,useContext:ms,useEffect:bm,useImperativeHandle:function(P,D,T){return T=T!=null?T.concat([P]):null,Bc(4,36,hg.bind(null,D,P),T)},useLayoutEffect:function(P,D){return Bc(4,36,P,D)},useMemo:function(P,D){var T=hp();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&Cu(D,q[1])?q[0]:(P=P(),T.memoizedState=[P,D],P)},useReducer:Cs,useRef:function(){return hp().memoizedState},useState:fg,useDebugValue:gg,useResponder:cg,useDeferredValue:function(P,D){var T=fg(P),q=T[0],Y=T[1];return bm(function(){a.unstable_next(function(){var Ae=Hs.suspense;Hs.suspense=D===void 0?null:D;try{Y(P)}finally{Hs.suspense=Ae}})},[P,D]),q},useTransition:function(P){var D=fg(!1),T=D[0],q=D[1];return[xm(function(Y){q(!0),a.unstable_next(function(){var Ae=Hs.suspense;Hs.suspense=P===void 0?null:P;try{q(!1),Y()}finally{Hs.suspense=Ae}})},[P,T]),T]}},Aa=null,vc=null,Bl=!1;function Bu(P,D){var T=Pl(5,null,null,0);T.elementType="DELETED",T.type="DELETED",T.stateNode=D,T.return=P,T.effectTag=8,P.lastEffect!==null?(P.lastEffect.nextEffect=T,P.lastEffect=T):P.firstEffect=P.lastEffect=T}function mg(P,D){switch(P.tag){case 5:return D=io(D,P.type,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 6:return D=Si(D,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function LA(P){if(Bl){var D=vc;if(D){var T=D;if(!mg(P,D)){if(D=uc(T),!D||!mg(P,D)){P.effectTag=P.effectTag&-1025|2,Bl=!1,Aa=P;return}Bu(Aa,T)}Aa=P,vc=uu(D)}else P.effectTag=P.effectTag&-1025|2,Bl=!1,Aa=P}}function dp(P){for(P=P.return;P!==null&&P.tag!==5&&P.tag!==3&&P.tag!==13;)P=P.return;Aa=P}function Ga(P){if(!y||P!==Aa)return!1;if(!Bl)return dp(P),Bl=!0,!1;var D=P.type;if(P.tag!==5||D!=="head"&&D!=="body"&&!ke(D,P.memoizedProps))for(D=vc;D;)Bu(P,D),D=uc(D);if(dp(P),P.tag===13){if(!y)throw Error(n(316));if(P=P.memoizedState,P=P!==null?P.dehydrated:null,!P)throw Error(n(317));vc=Os(P)}else vc=Aa?uc(P.stateNode):null;return!0}function yg(){y&&(vc=Aa=null,Bl=!1)}var mp=u.ReactCurrentOwner,Go=!1;function ws(P,D,T,q){D.child=P===null?og(D,null,T,q):du(D,P.child,T,q)}function Ii(P,D,T,q,Y){T=T.render;var Ae=D.ref;return ds(D,Y),q=ug(P,D,T,q,Ae,Y),P!==null&&!Go?(D.updateQueue=P.updateQueue,D.effectTag&=-517,P.expirationTime<=Y&&(P.expirationTime=0),si(P,D,Y)):(D.effectTag|=1,ws(P,D,q,Y),D.child)}function Qm(P,D,T,q,Y,Ae){if(P===null){var De=T.type;return typeof De=="function"&&!Qw(De)&&De.defaultProps===void 0&&T.compare===null&&T.defaultProps===void 0?(D.tag=15,D.type=De,Fm(P,D,De,q,Y,Ae)):(P=qm(T.type,null,q,null,D.mode,Ae),P.ref=D.ref,P.return=D,D.child=P)}return De=P.child,YD)&&HA.set(P,D)))}}function Pg(P,D){P.expirationTimeP?D:P)}function fo(P){if(P.lastExpiredTime!==0)P.callbackExpirationTime=1073741823,P.callbackPriority=99,P.callbackNode=hu(Pw.bind(null,P));else{var D=_m(P),T=P.callbackNode;if(D===0)T!==null&&(P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90);else{var q=ga();if(D===1073741823?q=99:D===1||D===2?q=95:(q=10*(1073741821-D)-10*(1073741821-q),q=0>=q?99:250>=q?98:5250>=q?97:95),T!==null){var Y=P.callbackPriority;if(P.callbackExpirationTime===D&&Y>=q)return;T!==SA&&Ce(T)}P.callbackExpirationTime=D,P.callbackPriority=q,D=D===1073741823?hu(Pw.bind(null,P)):dc(q,Wv.bind(null,P),{timeout:10*(1073741821-D)-Ni()}),P.callbackNode=D}}}function Wv(P,D){if(Um=0,D)return D=ga(),Gm(P,D),fo(P),null;var T=_m(P);if(T!==0){if(D=P.callbackNode,(yr&(rs|qs))!==En)throw Error(n(327));if(vp(),P===gi&&T===ns||Su(P,T),Or!==null){var q=yr;yr|=rs;var Y=jA(P);do try{pF();break}catch(vt){GA(P,vt)}while(1);if(la(),yr=q,wp.current=Y,Yi===Lm)throw D=Nm,Su(P,T),KA(P,T),fo(P),D;if(Or===null)switch(Y=P.finishedWork=P.current.alternate,P.finishedExpirationTime=T,q=Yi,gi=null,q){case vu:case Lm:throw Error(n(345));case Bi:Gm(P,2=T){P.lastPingedTime=T,Su(P,T);break}}if(Ae=_m(P),Ae!==0&&Ae!==T)break;if(q!==0&&q!==T){P.lastPingedTime=q;break}P.timeoutHandle=Te(bu.bind(null,P),Y);break}bu(P);break;case Dl:if(KA(P,T),q=P.lastSuspendedTime,T===q&&(P.nextKnownPendingLevel=bw(Y)),UA&&(Y=P.lastPingedTime,Y===0||Y>=T)){P.lastPingedTime=T,Su(P,T);break}if(Y=_m(P),Y!==0&&Y!==T)break;if(q!==0&&q!==T){P.lastPingedTime=q;break}if(MA!==1073741823?q=10*(1073741821-MA)-Ni():Wa===1073741823?q=0:(q=10*(1073741821-Wa)-5e3,Y=Ni(),T=10*(1073741821-T)-Y,q=Y-q,0>q&&(q=0),q=(120>q?120:480>q?480:1080>q?1080:1920>q?1920:3e3>q?3e3:4320>q?4320:1960*ww(q/1960))-q,T=q?q=0:(Y=De.busyDelayMs|0,Ae=Ni()-(10*(1073741821-Ae)-(De.timeoutMs|0||5e3)),q=Ae<=Y?0:Y+q-Ae),10 component higher in the tree to provide a loading indicator or placeholder to display.`+yl(Y))}Yi!==Sc&&(Yi=Bi),Ae=Cg(Ae,Y),wt=q;do{switch(wt.tag){case 3:De=Ae,wt.effectTag|=4096,wt.expirationTime=D;var ze=jv(wt,De,D);It(wt,ze);break e;case 1:De=Ae;var ft=wt.type,Wt=wt.stateNode;if((wt.effectTag&64)===0&&(typeof ft.getDerivedStateFromError=="function"||Wt!==null&&typeof Wt.componentDidCatch=="function"&&(Pu===null||!Pu.has(Wt)))){wt.effectTag|=4096,wt.expirationTime=D;var vr=Yv(wt,De,D);It(wt,vr);break e}}wt=wt.return}while(wt!==null)}Or=Jv(Or)}catch(Sn){D=Sn;continue}break}while(1)}function jA(){var P=wp.current;return wp.current=Iu,P===null?Iu:P}function Sw(P,D){PIp&&(Ip=P)}function fF(){for(;Or!==null;)Or=Vv(Or)}function pF(){for(;Or!==null&&!Rt();)Or=Vv(Or)}function Vv(P){var D=Zv(P.alternate,P,ns);return P.memoizedProps=P.pendingProps,D===null&&(D=Jv(P)),Iw.current=null,D}function Jv(P){Or=P;do{var D=Or.alternate;if(P=Or.return,(Or.effectTag&2048)===0){e:{var T=D;D=Or;var q=ns,Y=D.pendingProps;switch(D.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:ii(D.type)&&Ua(D);break;case 3:Ec(D),hr(D),Y=D.stateNode,Y.pendingContext&&(Y.context=Y.pendingContext,Y.pendingContext=null),(T===null||T.child===null)&&Ga(D)&&pa(D),vl(D);break;case 5:lg(D);var Ae=ca(yc.current);if(q=D.type,T!==null&&D.stateNode!=null)ts(T,D,q,Y,Ae),T.ref!==D.ref&&(D.effectTag|=128);else if(Y){if(T=ca(uo.current),Ga(D)){if(Y=D,!y)throw Error(n(175));T=cp(Y.stateNode,Y.type,Y.memoizedProps,Ae,T,Y),Y.updateQueue=T,T=T!==null,T&&pa(D)}else{var De=At(q,Y,Ae,T,D);Dc(De,D,!1,!1),D.stateNode=De,at(De,q,Y,Ae,T)&&pa(D)}D.ref!==null&&(D.effectTag|=128)}else if(D.stateNode===null)throw Error(n(166));break;case 6:if(T&&D.stateNode!=null)jr(T,D,T.memoizedProps,Y);else{if(typeof Y!="string"&&D.stateNode===null)throw Error(n(166));if(T=ca(yc.current),Ae=ca(uo.current),Ga(D)){if(T=D,!y)throw Error(n(176));(T=up(T.stateNode,T.memoizedProps,T))&&pa(D)}else D.stateNode=He(Y,T,Ae,D)}break;case 11:break;case 13:if(zn(ei,D),Y=D.memoizedState,(D.effectTag&64)!==0){D.expirationTime=q;break e}Y=Y!==null,Ae=!1,T===null?D.memoizedProps.fallback!==void 0&&Ga(D):(q=T.memoizedState,Ae=q!==null,Y||q===null||(q=T.child.sibling,q!==null&&(De=D.firstEffect,De!==null?(D.firstEffect=q,q.nextEffect=De):(D.firstEffect=D.lastEffect=q,q.nextEffect=null),q.effectTag=8))),Y&&!Ae&&(D.mode&2)!==0&&(T===null&&D.memoizedProps.unstable_avoidThisFallback!==!0||(ei.current&1)!==0?Yi===vu&&(Yi=ha):((Yi===vu||Yi===ha)&&(Yi=Dl),Ip!==0&&gi!==null&&(KA(gi,ns),eD(gi,Ip)))),S&&Y&&(D.effectTag|=4),w&&(Y||Ae)&&(D.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Ec(D),vl(D);break;case 10:wi(D);break;case 9:break;case 14:break;case 17:ii(D.type)&&Ua(D);break;case 19:if(zn(ei,D),Y=D.memoizedState,Y===null)break;if(Ae=(D.effectTag&64)!==0,De=Y.rendering,De===null){if(Ae)Pc(Y,!1);else if(Yi!==vu||T!==null&&(T.effectTag&64)!==0)for(T=D.child;T!==null;){if(De=pp(T),De!==null){for(D.effectTag|=64,Pc(Y,!1),T=De.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),Y.lastEffect===null&&(D.firstEffect=null),D.lastEffect=Y.lastEffect,T=q,Y=D.child;Y!==null;)Ae=Y,q=T,Ae.effectTag&=2,Ae.nextEffect=null,Ae.firstEffect=null,Ae.lastEffect=null,De=Ae.alternate,De===null?(Ae.childExpirationTime=0,Ae.expirationTime=q,Ae.child=null,Ae.memoizedProps=null,Ae.memoizedState=null,Ae.updateQueue=null,Ae.dependencies=null):(Ae.childExpirationTime=De.childExpirationTime,Ae.expirationTime=De.expirationTime,Ae.child=De.child,Ae.memoizedProps=De.memoizedProps,Ae.memoizedState=De.memoizedState,Ae.updateQueue=De.updateQueue,q=De.dependencies,Ae.dependencies=q===null?null:{expirationTime:q.expirationTime,firstContext:q.firstContext,responders:q.responders}),Y=Y.sibling;On(ei,ei.current&1|2,D),D=D.child;break e}T=T.sibling}}else{if(!Ae)if(T=pp(De),T!==null){if(D.effectTag|=64,Ae=!0,T=T.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),Pc(Y,!0),Y.tail===null&&Y.tailMode==="hidden"&&!De.alternate){D=D.lastEffect=Y.lastEffect,D!==null&&(D.nextEffect=null);break}}else Ni()>Y.tailExpiration&&1Y&&(Y=q),De>Y&&(Y=De),Ae=Ae.sibling;T.childExpirationTime=Y}if(D!==null)return D;P!==null&&(P.effectTag&2048)===0&&(P.firstEffect===null&&(P.firstEffect=Or.firstEffect),Or.lastEffect!==null&&(P.lastEffect!==null&&(P.lastEffect.nextEffect=Or.firstEffect),P.lastEffect=Or.lastEffect),1P?D:P}function bu(P){var D=_o();return lo(99,hF.bind(null,P,D)),null}function hF(P,D){do vp();while(vg!==null);if((yr&(rs|qs))!==En)throw Error(n(327));var T=P.finishedWork,q=P.finishedExpirationTime;if(T===null)return null;if(P.finishedWork=null,P.finishedExpirationTime=0,T===P.current)throw Error(n(177));P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90,P.nextKnownPendingLevel=0;var Y=bw(T);if(P.firstPendingTime=Y,q<=P.lastSuspendedTime?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:q<=P.firstSuspendedTime&&(P.firstSuspendedTime=q-1),q<=P.lastPingedTime&&(P.lastPingedTime=0),q<=P.lastExpiredTime&&(P.lastExpiredTime=0),P===gi&&(Or=gi=null,ns=0),1=T?ln(P,D,T):(On(ei,ei.current&1,D),D=si(P,D,T),D!==null?D.sibling:null);On(ei,ei.current&1,D);break;case 19:if(q=D.childExpirationTime>=T,(P.effectTag&64)!==0){if(q)return ja(P,D,T);D.effectTag|=64}if(Y=D.memoizedState,Y!==null&&(Y.rendering=null,Y.tail=null),On(ei,ei.current,D),!q)return null}return si(P,D,T)}Go=!1}}else Go=!1;switch(D.expirationTime=0,D.tag){case 2:if(q=D.type,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,Y=Oe(D,Mn.current),ds(D,T),Y=ug(null,D,q,P,Y,T),D.effectTag|=1,typeof Y=="object"&&Y!==null&&typeof Y.render=="function"&&Y.$$typeof===void 0){if(D.tag=1,yw(),ii(q)){var Ae=!0;fc(D)}else Ae=!1;D.memoizedState=Y.state!==null&&Y.state!==void 0?Y.state:null;var De=q.getDerivedStateFromProps;typeof De=="function"&&er(D,q,De,P),Y.updater=$r,D.stateNode=Y,Y._reactInternalFiber=D,qo(D,q,P,T),D=Ep(null,D,q,!0,Ae,T)}else D.tag=0,ws(null,D,Y,T),D=D.child;return D;case 16:if(Y=D.elementType,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,me(Y),Y._status!==1)throw Y._result;switch(Y=Y._result,D.type=Y,Ae=D.tag=wF(Y),P=Ci(Y,P),Ae){case 0:D=NA(null,D,Y,P,T);break;case 1:D=yp(null,D,Y,P,T);break;case 11:D=Ii(null,D,Y,P,T);break;case 14:D=Qm(null,D,Y,Ci(Y.type,P),q,T);break;default:throw Error(n(306,Y,""))}return D;case 0:return q=D.type,Y=D.pendingProps,Y=D.elementType===q?Y:Ci(q,Y),NA(P,D,q,Y,T);case 1:return q=D.type,Y=D.pendingProps,Y=D.elementType===q?Y:Ci(q,Y),yp(P,D,q,Y,T);case 3:if(Eg(D),q=D.updateQueue,q===null)throw Error(n(282));if(Y=D.memoizedState,Y=Y!==null?Y.element:null,ye(D,q,D.pendingProps,null,T),q=D.memoizedState.element,q===Y)yg(),D=si(P,D,T);else{if((Y=D.stateNode.hydrate)&&(y?(vc=uu(D.stateNode.containerInfo),Aa=D,Y=Bl=!0):Y=!1),Y)for(T=og(D,null,q,T),D.child=T;T;)T.effectTag=T.effectTag&-3|1024,T=T.sibling;else ws(P,D,q,T),yg();D=D.child}return D;case 5:return Sm(D),P===null&&LA(D),q=D.type,Y=D.pendingProps,Ae=P!==null?P.memoizedProps:null,De=Y.children,ke(q,Y)?De=null:Ae!==null&&ke(q,Ae)&&(D.effectTag|=16),jo(P,D),D.mode&4&&T!==1&&xe(q,Y)?(D.expirationTime=D.childExpirationTime=1,D=null):(ws(P,D,De,T),D=D.child),D;case 6:return P===null&&LA(D),null;case 13:return ln(P,D,T);case 4:return ag(D,D.stateNode.containerInfo),q=D.pendingProps,P===null?D.child=du(D,null,q,T):ws(P,D,q,T),D.child;case 11:return q=D.type,Y=D.pendingProps,Y=D.elementType===q?Y:Ci(q,Y),Ii(P,D,q,Y,T);case 7:return ws(P,D,D.pendingProps,T),D.child;case 8:return ws(P,D,D.pendingProps.children,T),D.child;case 12:return ws(P,D,D.pendingProps.children,T),D.child;case 10:e:{if(q=D.type._context,Y=D.pendingProps,De=D.memoizedProps,Ae=Y.value,Ho(D,Ae),De!==null){var vt=De.value;if(Ae=hs(vt,Ae)?0:(typeof q._calculateChangedBits=="function"?q._calculateChangedBits(vt,Ae):1073741823)|0,Ae===0){if(De.children===Y.children&&!_i.current){D=si(P,D,T);break e}}else for(vt=D.child,vt!==null&&(vt.return=D);vt!==null;){var wt=vt.dependencies;if(wt!==null){De=vt.child;for(var xt=wt.firstContext;xt!==null;){if(xt.context===q&&(xt.observedBits&Ae)!==0){vt.tag===1&&(xt=ys(T,null),xt.tag=2,tt(vt,xt)),vt.expirationTime"u")return!1;var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(D.isDisabled||!D.supportsFiber)return!0;try{var T=D.inject(P);xw=function(q){try{D.onCommitFiberRoot(T,q,void 0,(q.current.effectTag&64)===64)}catch{}},kw=function(q){try{D.onCommitFiberUnmount(T,q)}catch{}}}catch{}return!0}function CF(P,D,T,q){this.tag=P,this.key=T,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=q,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Pl(P,D,T,q){return new CF(P,D,T,q)}function Qw(P){return P=P.prototype,!(!P||!P.isReactComponent)}function wF(P){if(typeof P=="function")return Qw(P)?1:0;if(P!=null){if(P=P.$$typeof,P===N)return 11;if(P===te)return 14}return 2}function WA(P,D){var T=P.alternate;return T===null?(T=Pl(P.tag,D,P.key,P.mode),T.elementType=P.elementType,T.type=P.type,T.stateNode=P.stateNode,T.alternate=P,P.alternate=T):(T.pendingProps=D,T.effectTag=0,T.nextEffect=null,T.firstEffect=null,T.lastEffect=null),T.childExpirationTime=P.childExpirationTime,T.expirationTime=P.expirationTime,T.child=P.child,T.memoizedProps=P.memoizedProps,T.memoizedState=P.memoizedState,T.updateQueue=P.updateQueue,D=P.dependencies,T.dependencies=D===null?null:{expirationTime:D.expirationTime,firstContext:D.firstContext,responders:D.responders},T.sibling=P.sibling,T.index=P.index,T.ref=P.ref,T}function qm(P,D,T,q,Y,Ae){var De=2;if(q=P,typeof P=="function")Qw(P)&&(De=1);else if(typeof P=="string")De=5;else e:switch(P){case E:return xu(T.children,Y,Ae,D);case R:De=8,Y|=7;break;case I:De=8,Y|=1;break;case v:return P=Pl(12,T,D,Y|8),P.elementType=v,P.type=v,P.expirationTime=Ae,P;case U:return P=Pl(13,T,D,Y),P.type=U,P.elementType=U,P.expirationTime=Ae,P;case V:return P=Pl(19,T,D,Y),P.elementType=V,P.expirationTime=Ae,P;default:if(typeof P=="object"&&P!==null)switch(P.$$typeof){case x:De=10;break e;case C:De=9;break e;case N:De=11;break e;case te:De=14;break e;case ae:De=16,q=null;break e}throw Error(n(130,P==null?P:typeof P,""))}return D=Pl(De,T,D,Y),D.elementType=P,D.type=q,D.expirationTime=Ae,D}function xu(P,D,T,q){return P=Pl(7,P,q,D),P.expirationTime=T,P}function Fw(P,D,T){return P=Pl(6,P,null,D),P.expirationTime=T,P}function Rw(P,D,T){return D=Pl(4,P.children!==null?P.children:[],P.key,D),D.expirationTime=T,D.stateNode={containerInfo:P.containerInfo,pendingChildren:null,implementation:P.implementation},D}function IF(P,D,T){this.tag=D,this.current=null,this.containerInfo=P,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=qe,this.pendingContext=this.context=null,this.hydrate=T,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function $v(P,D){var T=P.firstSuspendedTime;return P=P.lastSuspendedTime,T!==0&&T>=D&&P<=D}function KA(P,D){var T=P.firstSuspendedTime,q=P.lastSuspendedTime;TD||T===0)&&(P.lastSuspendedTime=D),D<=P.lastPingedTime&&(P.lastPingedTime=0),D<=P.lastExpiredTime&&(P.lastExpiredTime=0)}function eD(P,D){D>P.firstPendingTime&&(P.firstPendingTime=D);var T=P.firstSuspendedTime;T!==0&&(D>=T?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:D>=P.lastSuspendedTime&&(P.lastSuspendedTime=D+1),D>P.nextKnownPendingLevel&&(P.nextKnownPendingLevel=D))}function Gm(P,D){var T=P.lastExpiredTime;(T===0||T>D)&&(P.lastExpiredTime=D)}function tD(P){var D=P._reactInternalFiber;if(D===void 0)throw typeof P.render=="function"?Error(n(188)):Error(n(268,Object.keys(P)));return P=Ee(D),P===null?null:P.stateNode}function rD(P,D){P=P.memoizedState,P!==null&&P.dehydrated!==null&&P.retryTime{"use strict";SEe.exports=PEe()});var kEe=_((EKt,xEe)=>{"use strict";var qyt={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};xEe.exports=qyt});var TEe=_((CKt,REe)=>{"use strict";var Gyt=Object.assign||function(t){for(var e=1;e"}}]),t}(),QEe=function(){Wk(t,null,[{key:"fromJS",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){b6(this,t),this.width=e,this.height=r}return Wk(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),FEe=function(){function t(e,r){b6(this,t),this.unit=e,this.value=r}return Wk(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case ru.UNIT_POINT:return String(this.value);case ru.UNIT_PERCENT:return this.value+"%";case ru.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();REe.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,I=Array(E),v=0;v1?I-1:0),x=1;x1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:ru.DIRECTION_LTR;return u.call(this,A,p,h)}),Gyt({Config:e.Config,Node:e.Node,Layout:t("Layout",jyt),Size:t("Size",QEe),Value:t("Value",FEe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},ru)}});var LEe=_((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?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;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof ve=="function"&&!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);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},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),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")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&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!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(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){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(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;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;function allocate(t,e,r,o){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e=="string"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o>2]=0;for(p=A+n;o>0]=0;return A}if(u==="i8")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,I,v;h>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h="";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,"i32")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+" ["+o+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` +`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;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)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;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()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(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(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(o&=255),e.push(String.fromCharCode(o))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),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(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}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;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}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(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_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 a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,"*")}}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(t,e,r,o,a){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=t,Browser.mainLoop.arg=o;var n;typeof o<"u"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,I=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=I:(I=I+.5,Browser.mainLoop.remainingBlockers=(8*E+I)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&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(n),!(u0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)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 t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(x){Runtime.warnOnce("Blob constructor present but fails: "+x+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var I=Browser.URLObject.createObjectURL(h),v=new Image;v.onload=function(){assert(v.complete,"Image "+u+" could not be decoded");var C=document.createElement("canvas");C.width=v.width,C.height=v.height;var R=C.getContext("2d");R.drawImage(v,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(I),A&&A(n)},v.onerror=function(C){console.log("Image "+I+" could not be decoded"),p&&p()},v.src=I},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,u,A,p){var h=!1;function E(R){h||(h=!0,Module.preloadedAudios[u]=R,A&&A(n))}function I(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var v=new Blob([n],{type:Browser.getMimetype(u)})}catch{return I()}var x=Browser.URLObject.createObjectURL(v),C=new Audio;C.addEventListener("canplaythrough",function(){E(C)},!1),C.onerror=function(N){if(h)return;console.log("warning: browser could not fully decode audio "+u+", trying slower base64 approach");function U(V){for(var te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ae="=",fe="",ue=0,me=0,he=0;he=6;){var Be=ue>>me-6&63;me-=6,fe+=te[Be]}return me==2?(fe+=te[(ue&3)<<4],fe+=ae+ae):me==4&&(fe+=te[(ue&15)<<2],fe+=ae),fe}C.src="data:audio/x-"+u.substr(-3)+";base64,"+U(n),E(C)},C.src=x,Browser.safeSetTimeout(function(){E(C)},1e4)}else return I()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.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&&o.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type==="touchstart")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var I=t.pageX-(a+e.left),v=t.pageY-(n+e.top);I=I*(r/e.width),v=v*(o/e.height),Browser.mouseMovementX=I-Browser.mouseX,Browser.mouseMovementY=v-Browser.mouseY,Browser.mouseX=I,Browser.mouseY=v}},asyncLoad:function(t,e,r,o){var a=o?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>"u"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[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 r(p,h,E,I,v,x){if(h==1){var C=I&896;(C==128||C==256||C==384)&&(p="X const")}var R;return x?R=E.replace("X",p).replace("Y",v):R=p.replace("X",E).replace("Y",v),R.replace(/([*&]) (?=[*&])/g,"$1")}function o(p,h,E,I,v){throw new Error(p+" type "+E.replace("X",h+"?")+(I?" with flag "+I:"")+" in "+v)}function a(p,h,E,I,v,x,C,R){x===void 0&&(x="X"),R===void 0&&(R=1);var N=E(p);if(N)return N;var U=I(p),V=U.placeholderFlag,te=e[V];C&&te&&(x=r(C[2],C[0],x,te[0],"?",!0));var ae;V==0&&(ae="Unbound"),V>=10&&(ae="Corrupt"),R>20&&(ae="Deeply nested"),ae&&o(ae,p,x,V,v||"?");var fe=U.paramList[0],ue=a(fe,h,E,I,v,x,te,R+1),me,he={flags:te[0],id:p,name:"",paramList:[ue]},Be=[],we="?";switch(U.placeholderFlag){case 1:me=ue.spec;break;case 2:if((ue.flags&15360)==1024&&ue.spec.ptrSize==1){he.flags=7168;break}case 3:case 6:case 5:me=ue.spec,ue.flags&15360;break;case 8:we=""+U.paramList[1],he.paramList.push(U.paramList[1]);break;case 9:for(var g=0,Ee=U.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,I){var v=___syscall146.buffers[E];assert(v),I===0||I===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(v,0)),v.length=0):v.push(I)});for(var u=0;u>2],p=HEAP32[o+(u*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},o=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+o];if(!a)throw new Error("dynCall_"+o+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_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(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,I=A,v=p;if(n!==_nbind.ptrMarker){var x=h.__nbindConstructor.apply(h,arguments);E=4608,v=HEAPU32[x/4],I=HEAPU32[x/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},R={__nbindFlags:E,__nbindPtr:I};v&&(R.__nbindShared=v,_nbind.mark(h));for(var N=0,U=Object.keys(R);N>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,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(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),I=e.DYNAMICTOP_PTR|0,v=e.tempDoublePtr|0,x=e.ABORT|0,C=e.STACKTOP|0,R=e.STACK_MAX|0,N=e.cttz_i8|0,U=e.___dso_handle|0,V=0,te=0,ae=0,fe=0,ue=t.NaN,me=t.Infinity,he=0,Be=0,we=0,g=0,Ee=0,Pe=0,ce=t.Math.floor,ne=t.Math.abs,ee=t.Math.sqrt,Ie=t.Math.pow,Fe=t.Math.cos,At=t.Math.sin,H=t.Math.tan,at=t.Math.acos,Re=t.Math.asin,ke=t.Math.atan,xe=t.Math.atan2,He=t.Math.exp,Te=t.Math.log,Ve=t.Math.ceil,qe=t.Math.imul,b=t.Math.min,w=t.Math.max,S=t.Math.clz32,y=t.Math.fround,F=e.abort,J=e.assert,X=e.enlargeMemory,Z=e.getTotalMemory,ie=e.abortOnCannotGrowMemory,be=e.invoke_viiiii,Le=e.invoke_vif,ot=e.invoke_vid,dt=e.invoke_fiff,Gt=e.invoke_vi,$t=e.invoke_vii,bt=e.invoke_ii,an=e.invoke_viddi,Qr=e.invoke_vidd,mr=e.invoke_iiii,br=e.invoke_diii,Wr=e.invoke_di,Kn=e.invoke_iid,Ls=e.invoke_iii,Ti=e.invoke_viiddi,ps=e.invoke_viiiiii,io=e.invoke_dii,Si=e.invoke_i,Ns=e.invoke_iiiiii,so=e.invoke_viiid,uc=e.invoke_viififi,uu=e.invoke_viii,cp=e.invoke_v,up=e.invoke_viid,Os=e.invoke_idd,Dn=e.invoke_viiii,oo=e._emscripten_asm_const_iiiii,Ms=e._emscripten_asm_const_iiidddddd,yl=e._emscripten_asm_const_iiiid,El=e.__nbind_reference_external,ao=e._emscripten_asm_const_iiiiiiii,zn=e._removeAccessorPrefix,On=e._typeModule,Li=e.__nbind_register_pool,Mn=e.__decorate,_i=e._llvm_stackrestore,rr=e.___cxa_atexit,Oe=e.__extends,ii=e.__nbind_get_value_object,Ua=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,hr=e._emscripten_set_main_loop_timing,Ac=e.__nbind_register_primitive,Au=e.__nbind_register_type,fc=e._emscripten_memcpy_big,Cl=e.__nbind_register_function,DA=e.___setErrNo,fu=e.__nbind_register_class,Ce=e.__nbind_finish,Rt=e._abort,pc=e._nbind_value,Hi=e._llvm_stacksave,pu=e.___syscall54,Yt=e._defineHidden,wl=e._emscripten_set_main_loop,PA=e._emscripten_get_now,Ap=e.__nbind_register_callback_signature,hc=e._emscripten_asm_const_iiiiii,SA=e.__nbind_free_external,Qn=e._emscripten_asm_const_iiii,hi=e._emscripten_asm_const_iiididi,gc=e.___syscall6,bA=e._atexit,sa=e.___syscall140,Ni=e.___syscall146,_o=y(0);let Ze=y(0);function lo(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function dc(){return C|0}function hu(s){s=s|0,C=s}function qi(s,l){s=s|0,l=l|0,C=s,R=l}function gu(s,l){s=s|0,l=l|0,V||(V=s,te=l)}function xA(s){s=s|0,Pe=s}function Ha(){return Pe|0}function mc(){var s=0,l=0;Dr(8104,8,400)|0,Dr(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,rr(17,8104,U|0)|0}function hs(s){s=s|0,pt(s+948|0)}function Ht(s){return s=y(s),((Pu(s)|0)&2147483647)>>>0>2139095040|0}function Fn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(0);return s|0}function Ci(s){s=s|0;var l=0;return l=pD(1e3)|0,oa(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Dr(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function oa(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,Cg(s,5,3197,f)),C=d}function co(){return Ci(956)|0}function Us(s){s=s|0;var l=0;return l=Kt(1e3)|0,aa(l,s),oa(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function aa(s,l){s=s|0,l=l|0;var c=0;Dr(s|0,l|0,948)|0,Rm(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function la(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Ho(c+948|0,s)|0,n[l>>2]=0),c=wi(s)|0,c|0){l=0;do n[(gs(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),ds(c),hD(s),n[2276]=(n[2276]|0)+-1}function Ho(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0;f=n[s>>2]|0,k=s+4|0,c=n[k>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(0);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(Mw(d|0,f|0,s|0)|0,c=n[k>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[k>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function wi(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function gs(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function ds(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,Bp(l,d,d,s+8|0),vg(s,l),_A(l)),C=f}function ms(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0;M=wi(s)|0;do if(M|0){if((n[(gs(s,0)|0)+944>>2]|0)==(s|0)){if(!(Ho(s+948|0,l)|0))break;Dr(l+400|0,8504,540)|0,n[l+944>>2]=0,Ne(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,k=s+948|0,Q=(B|0)==0,c=0,m=0;do f=n[(n[k>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?Ne(s):(d=Us(f)|0,n[(n[k>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,Q||TR[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(M|0));if(c>>>0>>0){Q=s+948|0,k=s+952|0,B=c,c=n[k>>2]|0;do m=(n[Q>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(Mw(m|0,f|0,d|0)|0,c=n[k>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[k>>2]=c),B=B+1|0;while((B|0)!=(M|0))}}while(0)}function _s(s){s=s|0;var l=0,c=0,f=0,d=0;Un(s,(wi(s)|0)==0,2491),Un(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),ds(l),l=s+976|0,c=n[l>>2]|0,Dr(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function Un(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,Ao(s,5,3197,f)),C=d}function Pn(){return n[2276]|0}function ys(){var s=0;return s=pD(20)|0,We((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function We(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,Ao(0,5,3197,c)),C=f}function tt(s){s=s|0,hD(s),n[2277]=(n[2277]|0)+-1}function It(s,l){s=s|0,l=l|0;var c=0;l?(Un(s,(wi(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function ir(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,Un(s,(n[l+944>>2]|0)==0,2709),Un(s,(n[s+964>>2]|0)==0,2763),$(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],ye(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,Ne(s),C=f}function $(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;if(c=wi(s)|0,c|0&&(n[(gs(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=Us(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=s,m||TR[f&15](B,k,s,l),l=l+1|0;while((l|0)!=(c|0))}}function ye(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0;et=C,C=C+64|0,G=et+52|0,k=et+48|0,se=et+28|0,je=et+24|0,Me=et+20|0,Qe=et,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}HA(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=L(s)|0,d>>>0>>0&&Jr(s),O=n[s>>2]|0,M=(n[B>>2]|0)-O|0,m=M>>1,Bp(Qe,M>>2>>>0>>1>>>0?m>>>0>>0?f:m:d,l-O>>2,s+8|0),O=Qe+8|0,f=n[O>>2]|0,m=Qe+12|0,M=n[m>>2]|0,B=M,Q=f;do if((f|0)==(M|0)){if(M=Qe+4|0,f=n[M>>2]|0,Xe=n[Qe>>2]|0,d=Xe,f>>>0<=Xe>>>0){f=B-d>>1,f=(f|0)==0?1:f,Bp(se,f,f>>>2,n[Qe+16>>2]|0),n[je>>2]=n[M>>2],n[Me>>2]=n[O>>2],n[k>>2]=n[je>>2],n[G>>2]=n[Me>>2],Dw(se,k,G),f=n[Qe>>2]|0,n[Qe>>2]=n[se>>2],n[se>>2]=f,f=se+4|0,Xe=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Xe,f=se+8|0,Xe=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Xe,f=se+12|0,Xe=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Xe,_A(se),f=n[O>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,k=f+(B<<2)|0,d=Q-m|0,m=d>>2,m&&(Mw(k|0,f|0,d|0)|0,f=n[M>>2]|0),Xe=k+(m<<2)|0,n[O>>2]=Xe,n[M>>2]=f+(B<<2),f=Xe}while(0);n[f>>2]=n[c>>2],n[O>>2]=(n[O>>2]|0)+4,l=Dg(s,Qe,l)|0,_A(Qe)}while(0);return C=et,l|0}function Ne(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(ue),s=n[s+944>>2]|0}while((s|0)!=0)}function pt(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function ht(s){return s=s|0,n[s+944>>2]|0}function Tt(s){s=s|0,Un(s,(n[s+964>>2]|0)!=0,2832),Ne(s)}function er(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function $r(s,l){s=s|0,l=l|0,FUe(s,l,400)|0&&(Dr(s|0,l|0,400)|0,Ne(s))}function Gi(s){s=s|0;var l=Ze;return l=y(h[s+44>>2]),s=Ht(l)|0,y(s?y(0):l)}function es(s){s=s|0;var l=Ze;return l=y(h[s+48>>2]),Ht(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function bi(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function qo(s){return s=s|0,n[s+980>>2]|0}function kA(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function QA(s){return s=s|0,n[s+4>>2]|0}function fp(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function sg(s){return s=s|0,n[s+8>>2]|0}function du(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function og(s){return s=s|0,n[s+12>>2]|0}function mu(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function uo(s){return s=s|0,n[s+16>>2]|0}function FA(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function yc(s){return s=s|0,n[s+20>>2]|0}function ca(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function ag(s){return s=s|0,n[s+24>>2]|0}function Ec(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Sm(s){return s=s|0,n[s+28>>2]|0}function lg(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function ei(s){return s=s|0,n[s+32>>2]|0}function pp(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function cg(s){return s=s|0,n[s+36>>2]|0}function RA(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function Hs(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function yu(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function qa(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function ji(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Ne(s))}function ua(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Eu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Es(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Cc(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function j(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Il(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(ue),n[c>>2]=3,Ne(s))}function xi(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Ic(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function ct(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function Cu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function ug(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function yw(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function TA(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Ne(s))}function hp(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(ue),n[l>>2]=3,Ne(s))}function Br(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Cs(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Ag(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Ne(s))}function fg(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(ue),n[l>>2]=3,Ne(s))}function pg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function gp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Bc(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Ct(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function bm(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function hg(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function gg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function wu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function xm(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function dg(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Iu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Ew(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function km(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Aa(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function vc(s){return s=s|0,y(h[s+396>>2])}function Bl(s){return s=s|0,y(h[s+400>>2])}function Bu(s){return s=s|0,y(h[s+404>>2])}function mg(s){return s=s|0,y(h[s+408>>2])}function LA(s){return s=s|0,y(h[s+412>>2])}function dp(s){return s=s|0,y(h[s+416>>2])}function Ga(s){return s=s|0,y(h[s+420>>2])}function yg(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function mp(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function Go(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function ws(s,l){s=s|0,l=l|0;var c=0,f=Ze;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ne(y(f-y(h[l>>2]))))>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,Ua(f|0,s|0,l|0,0),Ao(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),t3e(f),C=c}function jo(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=Ze;s=y(s*l),d=y(bR(s,y(1)));do if(Ii(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),Ii(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=Ii(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(0);return y(s/l)}function NA(s,l,c,f,d,m,B,k,Q,M,O,G,se){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,k=y(k),Q=y(Q),M=y(M),O=y(O),G=y(G),se=se|0;var je=0,Me=Ze,Qe=Ze,et=Ze,Xe=Ze,lt=Ze,Ue=Ze;return Q>2]),Me!=y(0))?(et=y(jo(l,Me,0,0)),Xe=y(jo(f,Me,0,0)),Qe=y(jo(m,Me,0,0)),Me=y(jo(k,Me,0,0))):(Qe=m,et=l,Me=k,Xe=f),(d|0)==(s|0)?je=Ii(Qe,et)|0:je=0,(B|0)==(c|0)?se=Ii(Me,Xe)|0:se=0,!je&&(lt=y(l-O),!(yp(s,lt,Q)|0))&&!(Ep(s,lt,d,Q)|0)?je=Eg(s,lt,d,m,Q)|0:je=1,!se&&(Ue=y(f-G),!(yp(c,Ue,M)|0))&&!(Ep(c,Ue,B,M)|0)?se=Eg(c,Ue,B,k,M)|0:se=1,se=je&se),se|0}function yp(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=Ii(l,c)|0:s=0,s|0}function Ep(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=Ii(l,f)|0:s=0,s|0}function Eg(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=Ii(l,d)|0:s=0,s|0}function fa(s,l,c,f,d,m,B,k,Q,M,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,M=M|0,O=O|0;var G=0,se=0,je=0,Me=0,Qe=Ze,et=Ze,Xe=0,lt=0,Ue=0,Ge=0,Nt=0,Mr=0,ar=0,Xt=0,Pr=0,Lr=0,sr=0,xn=Ze,go=Ze,mo=Ze,yo=0,ya=0;sr=C,C=C+160|0,Xt=sr+152|0,ar=sr+120|0,Mr=sr+104|0,Ue=sr+72|0,Me=sr+56|0,Nt=sr+8|0,lt=sr,Ge=(n[2279]|0)+1|0,n[2279]=Ge,Pr=s+984|0,(o[Pr>>0]|0)!=0&&(n[s+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[s+516>>2]|0)==(f|0)?Lr=0:Xe=4,(Xe|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Lr=1);e:do if(n[s+964>>2]|0)if(Qe=y(ln(s,2,B)),et=y(ln(s,0,B)),G=s+916|0,mo=y(h[G>>2]),go=y(h[s+920>>2]),xn=y(h[s+932>>2]),NA(d,l,m,c,n[s+924>>2]|0,mo,n[s+928>>2]|0,go,xn,y(h[s+936>>2]),Qe,et,O)|0)Xe=22;else if(je=n[s+520>>2]|0,!je)Xe=21;else for(se=0;;){if(G=s+524+(se*24|0)|0,xn=y(h[G>>2]),go=y(h[s+524+(se*24|0)+4>>2]),mo=y(h[s+524+(se*24|0)+16>>2]),NA(d,l,m,c,n[s+524+(se*24|0)+8>>2]|0,xn,n[s+524+(se*24|0)+12>>2]|0,go,mo,y(h[s+524+(se*24|0)+20>>2]),Qe,et,O)|0){Xe=22;break e}if(se=se+1|0,se>>>0>=je>>>0){Xe=21;break}}else{if(Q){if(G=s+916|0,!(Ii(y(h[G>>2]),l)|0)){Xe=21;break}if(!(Ii(y(h[s+920>>2]),c)|0)){Xe=21;break}if((n[s+924>>2]|0)!=(d|0)){Xe=21;break}G=(n[s+928>>2]|0)==(m|0)?G:0,Xe=22;break}if(je=n[s+520>>2]|0,!je)Xe=21;else for(se=0;;){if(G=s+524+(se*24|0)|0,Ii(y(h[G>>2]),l)|0&&Ii(y(h[s+524+(se*24|0)+4>>2]),c)|0&&(n[s+524+(se*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(se*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(se=se+1|0,se>>>0>=je>>>0){Xe=21;break}}}while(0);do if((Xe|0)==21)o[11697]|0?(G=0,Xe=28):(G=0,Xe=31);else if((Xe|0)==22){if(se=(o[11697]|0)!=0,!((G|0)!=0&(Lr^1)))if(se){Xe=28;break}else{Xe=31;break}Me=G+16|0,n[s+908>>2]=n[Me>>2],je=G+20|0,n[s+912>>2]=n[je>>2],(o[11698]|0)==0|se^1||(n[lt>>2]=OA(Ge)|0,n[lt+4>>2]=Ge,Ao(s,4,2972,lt),se=n[s+972>>2]|0,se|0&&tf[se&127](s),d=ja(d,Q)|0,m=ja(m,Q)|0,ya=+y(h[Me>>2]),yo=+y(h[je>>2]),n[Nt>>2]=d,n[Nt+4>>2]=m,E[Nt+8>>3]=+l,E[Nt+16>>3]=+c,E[Nt+24>>3]=ya,E[Nt+32>>3]=yo,n[Nt+40>>2]=M,Ao(s,4,2989,Nt))}while(0);return(Xe|0)==28&&(se=OA(Ge)|0,n[Me>>2]=se,n[Me+4>>2]=Ge,n[Me+8>>2]=Lr?3047:11699,Ao(s,4,3038,Me),se=n[s+972>>2]|0,se|0&&tf[se&127](s),Nt=ja(d,Q)|0,Xe=ja(m,Q)|0,n[Ue>>2]=Nt,n[Ue+4>>2]=Xe,E[Ue+8>>3]=+l,E[Ue+16>>3]=+c,n[Ue+24>>2]=M,Ao(s,4,3049,Ue),Xe=31),(Xe|0)==31&&(si(s,l,c,f,d,m,B,k,Q,O),o[11697]|0&&(se=n[2279]|0,Nt=OA(se)|0,n[Mr>>2]=Nt,n[Mr+4>>2]=se,n[Mr+8>>2]=Lr?3047:11699,Ao(s,4,3083,Mr),se=n[s+972>>2]|0,se|0&&tf[se&127](s),Nt=ja(d,Q)|0,Mr=ja(m,Q)|0,yo=+y(h[s+908>>2]),ya=+y(h[s+912>>2]),n[ar>>2]=Nt,n[ar+4>>2]=Mr,E[ar+8>>3]=yo,E[ar+16>>3]=ya,n[ar+24>>2]=M,Ao(s,4,3092,ar)),n[s+516>>2]=f,G||(se=s+520|0,G=n[se>>2]|0,(G|0)==16&&(o[11697]|0&&Ao(s,4,3124,Xt),n[se>>2]=0,G=0),Q?G=s+916|0:(n[se>>2]=G+1,G=s+524+(G*24|0)|0),h[G>>2]=l,h[G+4>>2]=c,n[G+8>>2]=d,n[G+12>>2]=m,n[G+16>>2]=n[s+908>>2],n[G+20>>2]=n[s+912>>2],G=0)),Q&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[Pr>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=sr,Lr|(G|0)==0|0}function ln(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(K(s,l,c)),y(f+y(re(s,l,c)))}function Ao(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,wg(f,s,l,c,d),C=m}function OA(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function ja(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function si(s,l,c,f,d,m,B,k,Q,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,M=M|0;var O=0,G=0,se=0,je=0,Me=Ze,Qe=Ze,et=Ze,Xe=Ze,lt=Ze,Ue=Ze,Ge=Ze,Nt=0,Mr=0,ar=0,Xt=Ze,Pr=Ze,Lr=0,sr=Ze,xn=0,go=0,mo=0,yo=0,ya=0,Rp=0,Tp=0,xl=0,Lp=0,Ru=0,Tu=0,Np=0,Op=0,Mp=0,Xr=0,kl=0,Up=0,kc=0,_p=Ze,Hp=Ze,Lu=Ze,Nu=Ze,Qc=Ze,Gs=0,Xa=0,Wo=0,Ql=0,nf=0,sf=Ze,Ou=Ze,of=Ze,af=Ze,js=Ze,vs=Ze,Fl=0,Rn=Ze,lf=Ze,Eo=Ze,Fc=Ze,Co=Ze,Rc=Ze,cf=0,uf=0,Tc=Ze,Ys=Ze,Rl=0,Af=0,ff=0,pf=0,xr=Ze,Vn=0,Ds=0,wo=0,Ws=0,Rr=0,ur=0,Tl=0,Vt=Ze,hf=0,li=0;Tl=C,C=C+16|0,Gs=Tl+12|0,Xa=Tl+8|0,Wo=Tl+4|0,Ql=Tl,Un(s,(d|0)==0|(Ht(l)|0)^1,3326),Un(s,(m|0)==0|(Ht(c)|0)^1,3406),Ds=mt(s,f)|0,n[s+496>>2]=Ds,Rr=fr(2,Ds)|0,ur=fr(0,Ds)|0,h[s+440>>2]=y(K(s,Rr,B)),h[s+444>>2]=y(re(s,Rr,B)),h[s+428>>2]=y(K(s,ur,B)),h[s+436>>2]=y(re(s,ur,B)),h[s+464>>2]=y(Cr(s,Rr)),h[s+468>>2]=y(yn(s,Rr)),h[s+452>>2]=y(Cr(s,ur)),h[s+460>>2]=y(yn(s,ur)),h[s+488>>2]=y(oi(s,Rr,B)),h[s+492>>2]=y(Oi(s,Rr,B)),h[s+476>>2]=y(oi(s,ur,B)),h[s+484>>2]=y(Oi(s,ur,B));do if(n[s+964>>2]|0)Bg(s,l,c,d,m,B,k);else{if(wo=s+948|0,Ws=(n[s+952>>2]|0)-(n[wo>>2]|0)>>2,!Ws){jv(s,l,c,d,m,B,k);break}if(!Q&&Yv(s,l,c,d,m,B,k)|0)break;$(s),kl=s+508|0,o[kl>>0]=0,Rr=fr(n[s+4>>2]|0,Ds)|0,ur=ww(Rr,Ds)|0,Vn=pe(Rr)|0,Up=n[s+8>>2]|0,Af=s+28|0,kc=(n[Af>>2]|0)!=0,Co=Vn?B:k,Tc=Vn?k:B,_p=y(wp(s,Rr,B)),Hp=y(Iw(s,Rr,B)),Me=y(wp(s,ur,B)),Rc=y(En(s,Rr,B)),Ys=y(En(s,ur,B)),ar=Vn?d:m,Rl=Vn?m:d,xr=Vn?Rc:Ys,lt=Vn?Ys:Rc,Fc=y(ln(s,2,B)),Xe=y(ln(s,0,B)),Qe=y(y(jr(s+364|0,B))-xr),et=y(y(jr(s+380|0,B))-xr),Ue=y(y(jr(s+372|0,k))-lt),Ge=y(y(jr(s+388|0,k))-lt),Lu=Vn?Qe:Ue,Nu=Vn?et:Ge,Fc=y(l-Fc),l=y(Fc-xr),Ht(l)|0?xr=l:xr=y(_n(y(Lg(l,et)),Qe)),lf=y(c-Xe),l=y(lf-lt),Ht(l)|0?Eo=l:Eo=y(_n(y(Lg(l,Ge)),Ue)),Qe=Vn?xr:Eo,Rn=Vn?Eo:xr;e:do if((ar|0)==1)for(f=0,G=0;;){if(O=gs(s,G)|0,!f)y(rs(O))>y(0)&&y(qs(O))>y(0)?f=O:f=0;else if(Tm(O)|0){je=0;break e}if(G=G+1|0,G>>>0>=Ws>>>0){je=f;break}}else je=0;while(0);Nt=je+500|0,Mr=je+504|0,f=0,O=0,l=y(0),se=0;do{if(G=n[(n[wo>>2]|0)+(se<<2)>>2]|0,(n[G+36>>2]|0)==1)vu(G),o[G+985>>0]=1,o[G+984>>0]=0;else{vl(G),Q&&Cp(G,mt(G,Ds)|0,Qe,Rn,xr);do if((n[G+24>>2]|0)!=1)if((G|0)==(je|0)){n[Nt>>2]=n[2278],h[Mr>>2]=y(0);break}else{Lm(s,G,xr,d,Eo,xr,Eo,m,Ds,M);break}else O|0&&(n[O+960>>2]=G),n[G+960>>2]=0,O=G,f=(f|0)==0?G:f;while(0);vs=y(h[G+504>>2]),l=y(l+y(vs+y(ln(G,Rr,xr))))}se=se+1|0}while((se|0)!=(Ws|0));for(mo=l>Qe,Fl=kc&((ar|0)==2&mo)?1:ar,xn=(Rl|0)==1,ya=xn&(Q^1),Rp=(Fl|0)==1,Tp=(Fl|0)==2,xl=976+(Rr<<2)|0,Lp=(Rl|2|0)==2,Mp=xn&(kc^1),Ru=1040+(ur<<2)|0,Tu=1040+(Rr<<2)|0,Np=976+(ur<<2)|0,Op=(Rl|0)!=1,mo=kc&((ar|0)!=0&mo),go=s+976|0,xn=xn^1,l=Qe,Lr=0,yo=0,vs=y(0),Qc=y(0);;){e:do if(Lr>>>0>>0)for(Mr=n[wo>>2]|0,se=0,Ge=y(0),Ue=y(0),et=y(0),Qe=y(0),G=0,O=0,je=Lr;;){if(Nt=n[Mr+(je<<2)>>2]|0,(n[Nt+36>>2]|0)!=1&&(n[Nt+940>>2]=yo,(n[Nt+24>>2]|0)!=1)){if(Xe=y(ln(Nt,Rr,xr)),Xr=n[xl>>2]|0,c=y(jr(Nt+380+(Xr<<3)|0,Co)),lt=y(h[Nt+504>>2]),c=y(Lg(c,lt)),c=y(_n(y(jr(Nt+364+(Xr<<3)|0,Co)),c)),kc&(se|0)!=0&y(Xe+y(Ue+c))>l){m=se,Xe=Ge,ar=je;break e}Xe=y(Xe+c),c=y(Ue+Xe),Xe=y(Ge+Xe),Tm(Nt)|0&&(et=y(et+y(rs(Nt))),Qe=y(Qe-y(lt*y(qs(Nt))))),O|0&&(n[O+960>>2]=Nt),n[Nt+960>>2]=0,se=se+1|0,O=Nt,G=(G|0)==0?Nt:G}else Xe=Ge,c=Ue;if(je=je+1|0,je>>>0>>0)Ge=Xe,Ue=c;else{m=se,ar=je;break}}else m=0,Xe=y(0),et=y(0),Qe=y(0),G=0,ar=Lr;while(0);Xr=et>y(0)&ety(0)&QeNu&((Ht(Nu)|0)^1))l=Nu,Xr=51;else if(o[(n[go>>2]|0)+3>>0]|0)Xr=51;else{if(Xt!=y(0)&&y(rs(s))!=y(0)){Xr=53;break}l=Xe,Xr=53}while(0);if((Xr|0)==51&&(Xr=0,Ht(l)|0?Xr=53:(Pr=y(l-Xe),sr=l)),(Xr|0)==53&&(Xr=0,Xe>2]|0,je=Pry(0),Ue=y(Pr/Xt),et=y(0),Xe=y(0),l=y(0),O=G;do c=y(jr(O+380+(se<<3)|0,Co)),Qe=y(jr(O+364+(se<<3)|0,Co)),Qe=y(Lg(c,y(_n(Qe,y(h[O+504>>2]))))),je?(c=y(Qe*y(qs(O))),c!=y(-0)&&(Vt=y(Qe-y(lt*c)),sf=y(Bi(O,Rr,Vt,sr,xr)),Vt!=sf)&&(et=y(et-y(sf-Qe)),l=y(l+c))):Nt&&(Ou=y(rs(O)),Ou!=y(0))&&(Vt=y(Qe+y(Ue*Ou)),of=y(Bi(O,Rr,Vt,sr,xr)),Vt!=of)&&(et=y(et-y(of-Qe)),Xe=y(Xe-Ou)),O=n[O+960>>2]|0;while((O|0)!=0);if(l=y(Ge+l),Qe=y(Pr+et),nf)l=y(0);else{lt=y(Xt+Xe),je=n[xl>>2]|0,Nt=Qey(0),lt=y(Qe/lt),l=y(0);do{Vt=y(jr(G+380+(je<<3)|0,Co)),et=y(jr(G+364+(je<<3)|0,Co)),et=y(Lg(Vt,y(_n(et,y(h[G+504>>2]))))),Nt?(Vt=y(et*y(qs(G))),Qe=y(-Vt),Vt!=y(-0)?(Vt=y(Ue*Qe),Qe=y(Bi(G,Rr,y(et+(Mr?Qe:Vt)),sr,xr))):Qe=et):se&&(af=y(rs(G)),af!=y(0))?Qe=y(Bi(G,Rr,y(et+y(lt*af)),sr,xr)):Qe=et,l=y(l-y(Qe-et)),Xe=y(ln(G,Rr,xr)),c=y(ln(G,ur,xr)),Qe=y(Qe+Xe),h[Xa>>2]=Qe,n[Ql>>2]=1,et=y(h[G+396>>2]);e:do if(Ht(et)|0){O=Ht(Rn)|0;do if(!O){if(mo|(ts(G,ur,Rn)|0|xn)||(ha(s,G)|0)!=4||(n[(Dl(G,ur)|0)+4>>2]|0)==3||(n[(Sc(G,ur)|0)+4>>2]|0)==3)break;h[Gs>>2]=Rn,n[Wo>>2]=1;break e}while(0);if(ts(G,ur,Rn)|0){O=n[G+992+(n[Np>>2]<<2)>>2]|0,Vt=y(c+y(jr(O,Rn))),h[Gs>>2]=Vt,O=Op&(n[O+4>>2]|0)==2,n[Wo>>2]=((Ht(Vt)|0|O)^1)&1;break}else{h[Gs>>2]=Rn,n[Wo>>2]=O?0:2;break}}else Vt=y(Qe-Xe),Xt=y(Vt/et),Vt=y(et*Vt),n[Wo>>2]=1,h[Gs>>2]=y(c+(Vn?Xt:Vt));while(0);yr(G,Rr,sr,xr,Ql,Xa),yr(G,ur,Rn,xr,Wo,Gs);do if(!(ts(G,ur,Rn)|0)&&(ha(s,G)|0)==4){if((n[(Dl(G,ur)|0)+4>>2]|0)==3){O=0;break}O=(n[(Sc(G,ur)|0)+4>>2]|0)!=3}else O=0;while(0);Vt=y(h[Xa>>2]),Xt=y(h[Gs>>2]),hf=n[Ql>>2]|0,li=n[Wo>>2]|0,fa(G,Vn?Vt:Xt,Vn?Xt:Vt,Ds,Vn?hf:li,Vn?li:hf,xr,Eo,Q&(O^1),3488,M)|0,o[kl>>0]=o[kl>>0]|o[G+508>>0],G=n[G+960>>2]|0}while((G|0)!=0)}}else l=y(0);if(l=y(Pr+l),li=l>0]=li|u[kl>>0],Tp&l>y(0)?(O=n[xl>>2]|0,(n[s+364+(O<<3)+4>>2]|0)!=0&&(js=y(jr(s+364+(O<<3)|0,Co)),js>=y(0))?Qe=y(_n(y(0),y(js-y(sr-l)))):Qe=y(0)):Qe=l,Nt=Lr>>>0>>0,Nt){je=n[wo>>2]|0,se=Lr,O=0;do G=n[je+(se<<2)>>2]|0,n[G+24>>2]|0||(O=((n[(Dl(G,Rr)|0)+4>>2]|0)==3&1)+O|0,O=O+((n[(Sc(G,Rr)|0)+4>>2]|0)==3&1)|0),se=se+1|0;while((se|0)!=(ar|0));O?(Xe=y(0),c=y(0)):Xr=101}else Xr=101;e:do if((Xr|0)==101)switch(Xr=0,Up|0){case 1:{O=0,Xe=y(Qe*y(.5)),c=y(0);break e}case 2:{O=0,Xe=Qe,c=y(0);break e}case 3:{if(m>>>0<=1){O=0,Xe=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),O=0,Xe=y(0),c=y(y(_n(Qe,y(0)))/c);break e}case 5:{c=y(Qe/y((m+1|0)>>>0)),O=0,Xe=c;break e}case 4:{c=y(Qe/y(m>>>0)),O=0,Xe=y(c*y(.5));break e}default:{O=0,Xe=y(0),c=y(0);break e}}while(0);if(l=y(_p+Xe),Nt){et=y(Qe/y(O|0)),se=n[wo>>2]|0,G=Lr,Qe=y(0);do{O=n[se+(G<<2)>>2]|0;e:do if((n[O+36>>2]|0)!=1){switch(n[O+24>>2]|0){case 1:{if(gi(O,Rr)|0){if(!Q)break e;Vt=y(Or(O,Rr,sr)),Vt=y(Vt+y(Cr(s,Rr))),Vt=y(Vt+y(K(O,Rr,xr))),h[O+400+(n[Tu>>2]<<2)>>2]=Vt;break e}break}case 0:if(li=(n[(Dl(O,Rr)|0)+4>>2]|0)==3,Vt=y(et+l),l=li?Vt:l,Q&&(li=O+400+(n[Tu>>2]<<2)|0,h[li>>2]=y(l+y(h[li>>2]))),li=(n[(Sc(O,Rr)|0)+4>>2]|0)==3,Vt=y(et+l),l=li?Vt:l,ya){Vt=y(c+y(ln(O,Rr,xr))),Qe=Rn,l=y(l+y(Vt+y(h[O+504>>2])));break e}else{l=y(l+y(c+y(ns(O,Rr,xr)))),Qe=y(_n(Qe,y(ns(O,ur,xr))));break e}default:}Q&&(Vt=y(Xe+y(Cr(s,Rr))),li=O+400+(n[Tu>>2]<<2)|0,h[li>>2]=y(Vt+y(h[li>>2])))}while(0);G=G+1|0}while((G|0)!=(ar|0))}else Qe=y(0);if(c=y(Hp+l),Lp?Xe=y(y(Bi(s,ur,y(Ys+Qe),Tc,B))-Ys):Xe=Rn,et=y(y(Bi(s,ur,y(Ys+(Mp?Rn:Qe)),Tc,B))-Ys),Nt&Q){G=Lr;do{se=n[(n[wo>>2]|0)+(G<<2)>>2]|0;do if((n[se+36>>2]|0)!=1){if((n[se+24>>2]|0)==1){if(gi(se,ur)|0){if(Vt=y(Or(se,ur,Rn)),Vt=y(Vt+y(Cr(s,ur))),Vt=y(Vt+y(K(se,ur,xr))),O=n[Ru>>2]|0,h[se+400+(O<<2)>>2]=Vt,!(Ht(Vt)|0))break}else O=n[Ru>>2]|0;Vt=y(Cr(s,ur)),h[se+400+(O<<2)>>2]=y(Vt+y(K(se,ur,xr)));break}O=ha(s,se)|0;do if((O|0)==4){if((n[(Dl(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if((n[(Sc(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if(ts(se,ur,Rn)|0){l=Me;break}hf=n[se+908+(n[xl>>2]<<2)>>2]|0,n[Gs>>2]=hf,l=y(h[se+396>>2]),li=Ht(l)|0,Qe=(n[v>>2]=hf,y(h[v>>2])),li?l=et:(Pr=y(ln(se,ur,xr)),Vt=y(Qe/l),l=y(l*Qe),l=y(Pr+(Vn?Vt:l))),h[Xa>>2]=l,h[Gs>>2]=y(y(ln(se,Rr,xr))+Qe),n[Wo>>2]=1,n[Ql>>2]=1,yr(se,Rr,sr,xr,Wo,Gs),yr(se,ur,Rn,xr,Ql,Xa),l=y(h[Gs>>2]),Pr=y(h[Xa>>2]),Vt=Vn?l:Pr,l=Vn?Pr:l,li=((Ht(Vt)|0)^1)&1,fa(se,Vt,l,Ds,li,((Ht(l)|0)^1)&1,xr,Eo,1,3493,M)|0,l=Me}else Xr=139;while(0);e:do if((Xr|0)==139){Xr=0,l=y(Xe-y(ns(se,ur,xr)));do if((n[(Dl(se,ur)|0)+4>>2]|0)==3){if((n[(Sc(se,ur)|0)+4>>2]|0)!=3)break;l=y(Me+y(_n(y(0),y(l*y(.5)))));break e}while(0);if((n[(Sc(se,ur)|0)+4>>2]|0)==3){l=Me;break}if((n[(Dl(se,ur)|0)+4>>2]|0)==3){l=y(Me+y(_n(y(0),l)));break}switch(O|0){case 1:{l=Me;break e}case 2:{l=y(Me+y(l*y(.5)));break e}default:{l=y(Me+l);break e}}}while(0);Vt=y(vs+l),li=se+400+(n[Ru>>2]<<2)|0,h[li>>2]=y(Vt+y(h[li>>2]))}while(0);G=G+1|0}while((G|0)!=(ar|0))}if(vs=y(vs+et),Qc=y(_n(Qc,c)),m=yo+1|0,ar>>>0>=Ws>>>0)break;l=sr,Lr=ar,yo=m}do if(Q){if(O=m>>>0>1,!O&&!(Yi(s)|0))break;if(!(Ht(Rn)|0)){l=y(Rn-vs);e:do switch(n[s+12>>2]|0){case 3:{Me=y(Me+l),Ue=y(0);break}case 2:{Me=y(Me+y(l*y(.5))),Ue=y(0);break}case 4:{Rn>vs?Ue=y(l/y(m>>>0)):Ue=y(0);break}case 7:if(Rn>vs){Me=y(Me+y(l/y(m<<1>>>0))),Ue=y(l/y(m>>>0)),Ue=O?Ue:y(0);break e}else{Me=y(Me+y(l*y(.5))),Ue=y(0);break e}case 6:{Ue=y(l/y(yo>>>0)),Ue=Rn>vs&O?Ue:y(0);break}default:Ue=y(0)}while(0);if(m|0)for(Nt=1040+(ur<<2)|0,Mr=976+(ur<<2)|0,je=0,G=0;;){e:do if(G>>>0>>0)for(Qe=y(0),et=y(0),l=y(0),se=G;;){O=n[(n[wo>>2]|0)+(se<<2)>>2]|0;do if((n[O+36>>2]|0)!=1&&(n[O+24>>2]|0)==0){if((n[O+940>>2]|0)!=(je|0))break e;if(Nm(O,ur)|0&&(Vt=y(h[O+908+(n[Mr>>2]<<2)>>2]),l=y(_n(l,y(Vt+y(ln(O,ur,xr)))))),(ha(s,O)|0)!=5)break;js=y(Wa(O)),js=y(js+y(K(O,0,xr))),Vt=y(h[O+912>>2]),Vt=y(y(Vt+y(ln(O,0,xr)))-js),js=y(_n(et,js)),Vt=y(_n(Qe,Vt)),Qe=Vt,et=js,l=y(_n(l,y(js+Vt)))}while(0);if(O=se+1|0,O>>>0>>0)se=O;else{se=O;break}}else et=y(0),l=y(0),se=G;while(0);if(lt=y(Ue+l),c=Me,Me=y(Me+lt),G>>>0>>0){Xe=y(c+et),O=G;do{G=n[(n[wo>>2]|0)+(O<<2)>>2]|0;e:do if((n[G+36>>2]|0)!=1&&(n[G+24>>2]|0)==0)switch(ha(s,G)|0){case 1:{Vt=y(c+y(K(G,ur,xr))),h[G+400+(n[Nt>>2]<<2)>>2]=Vt;break e}case 3:{Vt=y(y(Me-y(re(G,ur,xr)))-y(h[G+908+(n[Mr>>2]<<2)>>2])),h[G+400+(n[Nt>>2]<<2)>>2]=Vt;break e}case 2:{Vt=y(c+y(y(lt-y(h[G+908+(n[Mr>>2]<<2)>>2]))*y(.5))),h[G+400+(n[Nt>>2]<<2)>>2]=Vt;break e}case 4:{if(Vt=y(c+y(K(G,ur,xr))),h[G+400+(n[Nt>>2]<<2)>>2]=Vt,ts(G,ur,Rn)|0||(Vn?(Qe=y(h[G+908>>2]),l=y(Qe+y(ln(G,Rr,xr))),et=lt):(et=y(h[G+912>>2]),et=y(et+y(ln(G,ur,xr))),l=lt,Qe=y(h[G+908>>2])),Ii(l,Qe)|0&&Ii(et,y(h[G+912>>2]))|0))break e;fa(G,l,et,Ds,1,1,xr,Eo,1,3501,M)|0;break e}case 5:{h[G+404>>2]=y(y(Xe-y(Wa(G)))+y(Or(G,0,Rn)));break e}default:break e}while(0);O=O+1|0}while((O|0)!=(se|0))}if(je=je+1|0,(je|0)==(m|0))break;G=se}}}while(0);if(h[s+908>>2]=y(Bi(s,2,Fc,B,B)),h[s+912>>2]=y(Bi(s,0,lf,k,B)),(Fl|0)!=0&&(cf=n[s+32>>2]|0,uf=(Fl|0)==2,!(uf&(cf|0)!=2))?uf&(cf|0)==2&&(l=y(Rc+sr),l=y(_n(y(Lg(l,y(MA(s,Rr,Qc,Co)))),Rc)),Xr=198):(l=y(Bi(s,Rr,Qc,Co,B)),Xr=198),(Xr|0)==198&&(h[s+908+(n[976+(Rr<<2)>>2]<<2)>>2]=l),(Rl|0)!=0&&(ff=n[s+32>>2]|0,pf=(Rl|0)==2,!(pf&(ff|0)!=2))?pf&(ff|0)==2&&(l=y(Ys+Rn),l=y(_n(y(Lg(l,y(MA(s,ur,y(Ys+vs),Tc)))),Ys)),Xr=204):(l=y(Bi(s,ur,y(Ys+vs),Tc,B)),Xr=204),(Xr|0)==204&&(h[s+908+(n[976+(ur<<2)>>2]<<2)>>2]=l),Q){if((n[Af>>2]|0)==2){G=976+(ur<<2)|0,se=1040+(ur<<2)|0,O=0;do je=gs(s,O)|0,n[je+24>>2]|0||(hf=n[G>>2]|0,Vt=y(h[s+908+(hf<<2)>>2]),li=je+400+(n[se>>2]<<2)|0,Vt=y(Vt-y(h[li>>2])),h[li>>2]=y(Vt-y(h[je+908+(hf<<2)>>2]))),O=O+1|0;while((O|0)!=(Ws|0))}if(f|0){O=Vn?Fl:d;do Om(s,f,xr,O,Eo,Ds,M),f=n[f+960>>2]|0;while((f|0)!=0)}if(O=(Rr|2|0)==3,G=(ur|2|0)==3,O|G){f=0;do se=n[(n[wo>>2]|0)+(f<<2)>>2]|0,(n[se+36>>2]|0)!=1&&(O&&Ip(s,se,Rr),G&&Ip(s,se,ur)),f=f+1|0;while((f|0)!=(Ws|0))}}}while(0);C=Tl}function pa(s,l){s=s|0,l=y(l);var c=0;oa(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function Dc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=Ze,m=Ze,B=0,k=0,Q=0;n[2278]=(n[2278]|0)+1,vl(s),ts(s,2,l)|0?(d=y(jr(n[s+992>>2]|0,l)),Q=1,d=y(d+y(ln(s,2,l)))):(d=y(jr(s+380|0,l)),d>=y(0)?Q=2:(Q=((Ht(l)|0)^1)&1,d=l)),ts(s,0,c)|0?(m=y(jr(n[s+996>>2]|0,c)),k=1,m=y(m+y(ln(s,0,l)))):(m=y(jr(s+388|0,c)),m>=y(0)?k=2:(k=((Ht(c)|0)^1)&1,m=c)),B=s+976|0,fa(s,d,m,f,Q,k,l,c,1,3189,n[B>>2]|0)|0&&(Cp(s,n[s+496>>2]|0,l,c,l),Pc(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&Qm(s,7)}function vl(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;k=C,C=C+32|0,B=k+24|0,m=k+16|0,f=k+8|0,d=k,c=0;do l=s+380+(c<<3)|0,(n[s+380+(c<<3)+4>>2]|0)!=0&&(Q=l,M=n[Q+4>>2]|0,O=f,n[O>>2]=n[Q>>2],n[O+4>>2]=M,O=s+364+(c<<3)|0,M=n[O+4>>2]|0,Q=d,n[Q>>2]=n[O>>2],n[Q+4>>2]=M,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],ws(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=k}function ts(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])>2])>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(ue)}return y(l)}function Cp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=Ze;l=n[s+944>>2]|0?l:1,m=fr(n[s+4>>2]|0,l)|0,l=ww(m,l)|0,c=y(Mm(s,m,c)),f=y(Mm(s,l,f)),B=y(c+y(K(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(re(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(K(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(re(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function Pc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=Ze,k=Ze,Q=0,M=0,O=Ze,G=0,se=Ze,je=Ze,Me=Ze,Qe=Ze;if(l!=y(0)&&(d=s+400|0,Qe=y(h[d>>2]),m=s+404|0,Me=y(h[m>>2]),G=s+416|0,je=y(h[G>>2]),M=s+420|0,B=y(h[M>>2]),se=y(Qe+c),O=y(Me+f),f=y(se+je),k=y(O+B),Q=(n[s+988>>2]|0)==1,h[d>>2]=y(jo(Qe,l,0,Q)),h[m>>2]=y(jo(Me,l,0,Q)),c=y(bR(y(je*l),y(1))),Ii(c,y(0))|0?m=0:m=(Ii(c,y(1))|0)^1,c=y(bR(y(B*l),y(1))),Ii(c,y(0))|0?d=0:d=(Ii(c,y(1))|0)^1,Qe=y(jo(f,l,Q&m,Q&(m^1))),h[G>>2]=y(Qe-y(jo(se,l,0,Q))),Qe=y(jo(k,l,Q&d,Q&(d^1))),h[M>>2]=y(Qe-y(jo(O,l,0,Q))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do Pc(gs(s,d)|0,l,se,O),d=d+1|0;while((d|0)!=(m|0))}}function Cw(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=i7(n[489]|0,f,d)|0;break}default:s=XUe(f,d)|0}return s|0}function Cg(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,wg(s,0,l,c,m),C=d}function wg(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,D7[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Rt();else return}function Ya(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Rm(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(Ig(s,f),Qt(s,n[l>>2]|0,n[c>>2]|0,f))}function Ig(s,l){s=s|0,l=l|0;var c=0;if((L(s)|0)>>>0>>0&&Jr(s),l>>>0>1073741823)Rt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function Qt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function L(s){return s=s|0,1073741823}function K(s,l,c){return s=s|0,l=l|0,c=y(c),pe(l)|0&&(n[s+96>>2]|0)!=0?s=s+92|0:s=Fn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Je(s,c))}function re(s,l,c){return s=s|0,l=l|0,c=y(c),pe(l)|0&&(n[s+104>>2]|0)!=0?s=s+100|0:s=Fn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Je(s,c))}function pe(s){return s=s|0,(s|1|0)==3|0}function Je(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(jr(s,l)),y(l)}function mt(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,((s|0)==0?(l|0)>1?l:1:s)|0}function fr(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(0);return s|0}function Cr(s,l){s=s|0,l=l|0;var c=Ze;return pe(l)|0&&(n[s+312>>2]|0)!=0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function yn(s,l){s=s|0,l=l|0;var c=Ze;return pe(l)|0&&(n[s+320>>2]|0)!=0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function oi(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return pe(l)|0&&(n[s+240>>2]|0)!=0&&(f=y(jr(s+236|0,c)),f>=y(0))||(f=y(_n(y(jr(Fn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function Oi(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return pe(l)|0&&(n[s+248>>2]|0)!=0&&(f=y(jr(s+244|0,c)),f>=y(0))||(f=y(_n(y(jr(Fn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function Bg(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,Q=Ze,M=Ze,O=Ze,G=Ze,se=Ze,je=0,Me=0,Qe=0;Qe=C,C=C+16|0,je=Qe,Me=s+964|0,Un(s,(n[Me>>2]|0)!=0,3519),k=y(En(s,2,l)),Q=y(En(s,0,l)),M=y(ln(s,2,l)),O=y(ln(s,0,l)),Ht(l)|0?G=l:G=y(_n(y(0),y(y(l-M)-k))),Ht(c)|0?se=c:se=y(_n(y(0),y(y(c-O)-Q))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Bi(s,2,y(l-M),m,m)),l=y(Bi(s,0,y(c-O),B,m))):(P7[n[Me>>2]&1](je,s,G,f,se,d),G=y(k+y(h[je>>2])),se=y(l-M),h[s+908>>2]=y(Bi(s,2,(f|2|0)==2?G:se,m,m)),se=y(Q+y(h[je+4>>2])),l=y(c-O),l=y(Bi(s,0,(d|2|0)==2?se:l,B,m))),h[s+912>>2]=l,C=Qe}function jv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,Q=Ze,M=Ze,O=Ze;M=y(En(s,2,m)),k=y(En(s,0,m)),O=y(ln(s,2,m)),Q=y(ln(s,0,m)),l=y(l-O),h[s+908>>2]=y(Bi(s,2,(f|2|0)==2?M:l,m,m)),c=y(c-Q),h[s+912>>2]=y(Bi(s,0,(d|2|0)==2?k:c,B,m))}function Yv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=0,Q=Ze,M=Ze;return k=(f|0)==2,!(l<=y(0)&k)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(Q=y(ln(s,0,m)),M=y(ln(s,2,m)),k=l>2]=y(Bi(s,2,k?y(0):l,m,m)),l=y(c-Q),k=c>2]=y(Bi(s,0,k?y(0):l,B,m)),s=1),s|0}function ww(s,l){return s=s|0,l=l|0,UA(s)|0?s=fr(2,l)|0:s=0,s|0}function wp(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(oi(s,l,c)),y(c+y(Cr(s,l)))}function Iw(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(Oi(s,l,c)),y(c+y(yn(s,l)))}function En(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(wp(s,l,c)),y(f+y(Iw(s,l,c)))}function Tm(s){return s=s|0,n[s+24>>2]|0?s=0:y(rs(s))!=y(0)?s=1:s=y(qs(s))!=y(0),s|0}function rs(s){s=s|0;var l=Ze;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),Ht(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((Ht(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function qs(s){s=s|0;var l=Ze,c=0,f=Ze;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),Ht(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,c<<24>>24==0&&(f=y(h[s+40>>2]),f>24?y(1):y(0)}}else l=y(0);while(0);return y(l)}function vu(s){s=s|0;var l=0,c=0;if(Xm(s+400|0,0,540)|0,o[s+985>>0]=1,$(s),c=wi(s)|0,c|0){l=s+948|0,s=0;do vu(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function Lm(s,l,c,f,d,m,B,k,Q,M){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),k=k|0,Q=Q|0,M=M|0;var O=0,G=Ze,se=0,je=0,Me=Ze,Qe=Ze,et=0,Xe=Ze,lt=0,Ue=Ze,Ge=0,Nt=0,Mr=0,ar=0,Xt=0,Pr=0,Lr=0,sr=0,xn=0,go=0;xn=C,C=C+16|0,Mr=xn+12|0,ar=xn+8|0,Xt=xn+4|0,Pr=xn,sr=fr(n[s+4>>2]|0,Q)|0,Ge=pe(sr)|0,G=y(jr(Bw(l)|0,Ge?m:B)),Nt=ts(l,2,m)|0,Lr=ts(l,0,B)|0;do if(!(Ht(G)|0)&&!(Ht(Ge?c:d)|0)){if(O=l+504|0,!(Ht(y(h[O>>2]))|0)&&(!(vw(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[O>>2]=y(_n(G,y(En(l,sr,m))))}else se=7;while(0);do if((se|0)==7){if(lt=Ge^1,!(lt|Nt^1)){B=y(jr(n[l+992>>2]|0,m)),h[l+504>>2]=y(_n(B,y(En(l,2,m))));break}if(!(Ge|Lr^1)){B=y(jr(n[l+996>>2]|0,B)),h[l+504>>2]=y(_n(B,y(En(l,0,m))));break}h[Mr>>2]=y(ue),h[ar>>2]=y(ue),n[Xt>>2]=0,n[Pr>>2]=0,Xe=y(ln(l,2,m)),Ue=y(ln(l,0,m)),Nt?(Me=y(Xe+y(jr(n[l+992>>2]|0,m))),h[Mr>>2]=Me,n[Xt>>2]=1,je=1):(je=0,Me=y(ue)),Lr?(G=y(Ue+y(jr(n[l+996>>2]|0,B))),h[ar>>2]=G,n[Pr>>2]=1,O=1):(O=0,G=y(ue)),se=n[s+32>>2]|0,Ge&(se|0)==2?se=2:Ht(Me)|0&&!(Ht(c)|0)&&(h[Mr>>2]=c,n[Xt>>2]=2,je=2,Me=c),!((se|0)==2<)&&Ht(G)|0&&!(Ht(d)|0)&&(h[ar>>2]=d,n[Pr>>2]=2,O=2,G=d),Qe=y(h[l+396>>2]),et=Ht(Qe)|0;do if(et)se=je;else{if((je|0)==1<){h[ar>>2]=y(y(Me-Xe)/Qe),n[Pr>>2]=1,O=1,se=1;break}Ge&(O|0)==1?(h[Mr>>2]=y(Qe*y(G-Ue)),n[Xt>>2]=1,O=1,se=1):se=je}while(0);go=Ht(c)|0,je=(ha(s,l)|0)!=4,!(Ge|Nt|((f|0)!=1|go)|(je|(se|0)==1))&&(h[Mr>>2]=c,n[Xt>>2]=1,!et)&&(h[ar>>2]=y(y(c-Xe)/Qe),n[Pr>>2]=1,O=1),!(Lr|lt|((k|0)!=1|(Ht(d)|0))|(je|(O|0)==1))&&(h[ar>>2]=d,n[Pr>>2]=1,!et)&&(h[Mr>>2]=y(Qe*y(d-Ue)),n[Xt>>2]=1),yr(l,2,m,m,Xt,Mr),yr(l,0,B,m,Pr,ar),c=y(h[Mr>>2]),d=y(h[ar>>2]),fa(l,c,d,Q,n[Xt>>2]|0,n[Pr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(sr<<2)>>2]<<2)>>2]),h[l+504>>2]=y(_n(B,y(En(l,sr,m))))}while(0);n[l+500>>2]=n[2278],C=xn}function Bi(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(MA(s,l,c,f)),y(_n(f,y(En(s,l,d))))}function ha(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[((n[l>>2]|0)==0?s+16|0:l)>>2]|0,(l|0)==5&&UA(n[s+4>>2]|0)|0&&(l=1),l|0}function Dl(s,l){return s=s|0,l=l|0,pe(l)|0&&(n[s+96>>2]|0)!=0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function Sc(s,l){return s=s|0,l=l|0,pe(l)|0&&(n[s+104>>2]|0)!=0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function yr(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(jr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(ln(s,l,f))),n[d>>2]|0){case 2:case 1:{d=Ht(c)|0,f=y(h[m>>2]),h[m>>2]=d|f>2]=2,h[m>>2]=c);break}default:}}function gi(s,l){return s=s|0,l=l|0,s=s+132|0,pe(l)|0&&(n[(Fn(s,4,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Fn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Or(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,pe(l)|0&&(f=Fn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(jr(f,c))),y(c)}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(K(s,l,c))),y(f+y(re(s,l,c)))}function Yi(s){s=s|0;var l=0,c=0,f=0;e:do if(UA(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=wi(s)|0,!c)l=0;else for(l=0;;){if(f=gs(s,l)|0,(n[f+24>>2]|0)==0&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(0);return l|0}function Nm(s,l){s=s|0,l=l|0;var c=Ze;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((Ht(c)|0)^1)|0}function Wa(s){s=s|0;var l=Ze,c=0,f=0,d=0,m=0,B=0,k=0,Q=Ze;if(c=n[s+968>>2]|0,c)Q=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(w7[c&0](s,Q,l)),Un(s,(Ht(l)|0)^1,3573);else{m=wi(s)|0;do if(m|0){for(c=0,d=0;;){if(f=gs(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(k=(ha(s,f)|0)==5,k){c=f;break}else c=(c|0)==0?f:c;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(Wa(c)),y(l+y(h[c+404>>2]))}while(0);l=y(h[s+912>>2])}return y(l)}function MA(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=Ze,m=0;return UA(l)|0?(l=1,m=3):pe(l)|0?(l=0,m=3):(f=y(ue),d=y(ue)),(m|0)==3&&(d=y(jr(s+364+(l<<3)|0,f)),f=y(jr(s+380+(l<<3)|0,f))),m=f=y(0)&((Ht(f)|0)^1)),c=m?f:c,m=d>=y(0)&((Ht(d)|0)^1)&c>2]|0,m)|0,Me=ww(et,m)|0,Qe=pe(et)|0,G=y(ln(l,2,c)),se=y(ln(l,0,c)),ts(l,2,c)|0?k=y(G+y(jr(n[l+992>>2]|0,c))):gi(l,2)|0&&or(l,2)|0?(k=y(h[s+908>>2]),Q=y(Cr(s,2)),Q=y(k-y(Q+y(yn(s,2)))),k=y(Or(l,2,c)),k=y(Bi(l,2,y(Q-y(k+y(Du(l,2,c)))),c,c))):k=y(ue),ts(l,0,d)|0?Q=y(se+y(jr(n[l+996>>2]|0,d))):gi(l,0)|0&&or(l,0)|0?(Q=y(h[s+912>>2]),lt=y(Cr(s,0)),lt=y(Q-y(lt+y(yn(s,0)))),Q=y(Or(l,0,d)),Q=y(Bi(l,0,y(lt-y(Q+y(Du(l,0,d)))),d,c))):Q=y(ue),M=Ht(k)|0,O=Ht(Q)|0;do if(M^O&&(je=y(h[l+396>>2]),!(Ht(je)|0)))if(M){k=y(G+y(y(Q-se)*je));break}else{lt=y(se+y(y(k-G)/je)),Q=O?lt:Q;break}while(0);O=Ht(k)|0,M=Ht(Q)|0,O|M&&(Ue=(O^1)&1,f=c>y(0)&((f|0)!=0&O),k=Qe?k:f?c:k,fa(l,k,Q,m,Qe?Ue:f?2:Ue,O&(M^1)&1,k,Q,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(ln(l,2,c))),Q=y(h[l+912>>2]),Q=y(Q+y(ln(l,0,c)))),fa(l,k,Q,m,1,1,k,Q,1,3635,B)|0,or(l,et)|0&&!(gi(l,et)|0)?(Ue=n[976+(et<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(lt-y(h[l+908+(Ue<<2)>>2])),lt=y(lt-y(yn(s,et))),lt=y(lt-y(re(l,et,c))),lt=y(lt-y(Du(l,et,Qe?c:d))),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=lt):Xe=21;do if((Xe|0)==21){if(!(gi(l,et)|0)&&(n[s+8>>2]|0)==1){Ue=n[976+(et<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(y(lt-y(h[l+908+(Ue<<2)>>2]))*y(.5)),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=lt;break}!(gi(l,et)|0)&&(n[s+8>>2]|0)==2&&(Ue=n[976+(et<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(lt-y(h[l+908+(Ue<<2)>>2])),h[l+400+(n[1040+(et<<2)>>2]<<2)>>2]=lt)}while(0);or(l,Me)|0&&!(gi(l,Me)|0)?(Ue=n[976+(Me<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(lt-y(h[l+908+(Ue<<2)>>2])),lt=y(lt-y(yn(s,Me))),lt=y(lt-y(re(l,Me,c))),lt=y(lt-y(Du(l,Me,Qe?d:c))),h[l+400+(n[1040+(Me<<2)>>2]<<2)>>2]=lt):Xe=30;do if((Xe|0)==30&&!(gi(l,Me)|0)){if((ha(s,l)|0)==2){Ue=n[976+(Me<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(y(lt-y(h[l+908+(Ue<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Me<<2)>>2]<<2)>>2]=lt;break}Ue=(ha(s,l)|0)==3,Ue^(n[s+28>>2]|0)==2&&(Ue=n[976+(Me<<2)>>2]|0,lt=y(h[s+908+(Ue<<2)>>2]),lt=y(lt-y(h[l+908+(Ue<<2)>>2])),h[l+400+(n[1040+(Me<<2)>>2]<<2)>>2]=lt)}while(0)}function Ip(s,l,c){s=s|0,l=l|0,c=c|0;var f=Ze,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function UA(s){return s=s|0,(s|1|0)==1|0}function Bw(s){s=s|0;var l=Ze;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((Ht(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function vw(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function or(s,l){return s=s|0,l=l|0,s=s+132|0,pe(l)|0&&(n[(Fn(s,5,948)|0)+4>>2]|0)!=0?s=1:s=(n[(Fn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Du(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,pe(l)|0&&(f=Fn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(jr(f,c))),y(c)}function Mm(s,l,c){return s=s|0,l=l|0,c=y(c),gi(s,l)|0?c=y(Or(s,l,c)):c=y(-y(Du(s,l,c))),y(c)}function Pu(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function Bp(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Kt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function vg(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _A(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function HA(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;if(B=s+4|0,k=n[B>>2]|0,d=k-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0>>0){f=k;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0>>0)}m|0&&Mw(k+(0-m<<2)|0,l|0,d|0)|0}function Dg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return k=l+4|0,Q=n[k>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=Q+(0-(m>>2)<<2)|0,n[k>>2]=f,(m|0)>0&&Dr(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(Dr(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[k>>2],Q|0}function Dw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function Um(){mc()}function ga(){var s=0;return s=Kt(4)|0,qA(s),s|0}function qA(s){s=s|0,n[s>>2]=ys()|0}function bc(s){s=s|0,s|0&&(Pg(s),gt(s))}function Pg(s){s=s|0,tt(n[s>>2]|0)}function _m(s,l,c){s=s|0,l=l|0,c=c|0,Ya(n[s>>2]|0,l,c)}function fo(s,l){s=s|0,l=y(l),pa(n[s>>2]|0,l)}function Wv(s,l){return s=s|0,l=l|0,vw(n[s>>2]|0,l)|0}function Pw(){var s=0;return s=Kt(8)|0,Kv(s,0),s|0}function Kv(s,l){s=s|0,l=l|0,l?l=Ci(n[l>>2]|0)|0:l=co()|0,n[s>>2]=l,n[s+4>>2]=0,bi(l,s)}function AF(s){s=s|0;var l=0;return l=Kt(8)|0,Kv(l,s),l|0}function zv(s){s=s|0,s|0&&(Su(s),gt(s))}function Su(s){s=s|0;var l=0;la(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(GA(s),gt(s))}function GA(s){s=s|0,jA(s)}function jA(s){s=s|0,s=n[s>>2]|0,s|0&&SA(s|0)}function Sw(s){return s=s|0,qo(s)|0}function Hm(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(GA(l),gt(l)),_s(n[s>>2]|0)}function fF(s,l){s=s|0,l=l|0,$r(n[s>>2]|0,n[l>>2]|0)}function pF(s,l){s=s|0,l=l|0,ca(n[s>>2]|0,l)}function Vv(s,l,c){s=s|0,l=l|0,c=+c,Eu(n[s>>2]|0,l,y(c))}function Jv(s,l,c){s=s|0,l=l|0,c=+c,Es(n[s>>2]|0,l,y(c))}function bw(s,l){s=s|0,l=l|0,du(n[s>>2]|0,l)}function bu(s,l){s=s|0,l=l|0,mu(n[s>>2]|0,l)}function hF(s,l){s=s|0,l=l|0,FA(n[s>>2]|0,l)}function gF(s,l){s=s|0,l=l|0,kA(n[s>>2]|0,l)}function vp(s,l){s=s|0,l=l|0,Ec(n[s>>2]|0,l)}function dF(s,l){s=s|0,l=l|0,fp(n[s>>2]|0,l)}function Xv(s,l,c){s=s|0,l=l|0,c=+c,wc(n[s>>2]|0,l,y(c))}function YA(s,l,c){s=s|0,l=l|0,c=+c,j(n[s>>2]|0,l,y(c))}function mF(s,l){s=s|0,l=l|0,Il(n[s>>2]|0,l)}function yF(s,l){s=s|0,l=l|0,lg(n[s>>2]|0,l)}function Zv(s,l){s=s|0,l=l|0,pp(n[s>>2]|0,l)}function xw(s,l){s=s|0,l=+l,RA(n[s>>2]|0,y(l))}function kw(s,l){s=s|0,l=+l,qa(n[s>>2]|0,y(l))}function EF(s,l){s=s|0,l=+l,ji(n[s>>2]|0,y(l))}function CF(s,l){s=s|0,l=+l,Hs(n[s>>2]|0,y(l))}function Pl(s,l){s=s|0,l=+l,yu(n[s>>2]|0,y(l))}function Qw(s,l){s=s|0,l=+l,yw(n[s>>2]|0,y(l))}function wF(s,l){s=s|0,l=+l,TA(n[s>>2]|0,y(l))}function WA(s){s=s|0,hp(n[s>>2]|0)}function qm(s,l){s=s|0,l=+l,Cs(n[s>>2]|0,y(l))}function xu(s,l){s=s|0,l=+l,Ag(n[s>>2]|0,y(l))}function Fw(s){s=s|0,fg(n[s>>2]|0)}function Rw(s,l){s=s|0,l=+l,gp(n[s>>2]|0,y(l))}function IF(s,l){s=s|0,l=+l,Bc(n[s>>2]|0,y(l))}function $v(s,l){s=s|0,l=+l,bm(n[s>>2]|0,y(l))}function KA(s,l){s=s|0,l=+l,hg(n[s>>2]|0,y(l))}function eD(s,l){s=s|0,l=+l,wu(n[s>>2]|0,y(l))}function Gm(s,l){s=s|0,l=+l,xm(n[s>>2]|0,y(l))}function tD(s,l){s=s|0,l=+l,Iu(n[s>>2]|0,y(l))}function rD(s,l){s=s|0,l=+l,Ew(n[s>>2]|0,y(l))}function jm(s,l){s=s|0,l=+l,Aa(n[s>>2]|0,y(l))}function nD(s,l,c){s=s|0,l=l|0,c=+c,Cu(n[s>>2]|0,l,y(c))}function BF(s,l,c){s=s|0,l=l|0,c=+c,xi(n[s>>2]|0,l,y(c))}function P(s,l,c){s=s|0,l=l|0,c=+c,Ic(n[s>>2]|0,l,y(c))}function D(s){return s=s|0,ag(n[s>>2]|0)|0}function T(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Cc(d,n[l>>2]|0,c),q(s,d),C=f}function q(s,l){s=s|0,l=l|0,Y(s,n[l+4>>2]|0,+y(h[l>>2]))}function Y(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function Ae(s){return s=s|0,og(n[s>>2]|0)|0}function De(s){return s=s|0,uo(n[s>>2]|0)|0}function vt(s){return s=s|0,yc(n[s>>2]|0)|0}function wt(s){return s=s|0,QA(n[s>>2]|0)|0}function xt(s){return s=s|0,Sm(n[s>>2]|0)|0}function _r(s){return s=s|0,sg(n[s>>2]|0)|0}function is(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Dt(d,n[l>>2]|0,c),q(s,d),C=f}function di(s){return s=s|0,ei(n[s>>2]|0)|0}function po(s){return s=s|0,cg(n[s>>2]|0)|0}function zA(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ua(f,n[l>>2]|0),q(s,f),C=c}function Yo(s){return s=s|0,+ +y(Gi(n[s>>2]|0))}function rt(s){return s=s|0,+ +y(es(n[s>>2]|0))}function ze(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Br(f,n[l>>2]|0),q(s,f),C=c}function ft(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,pg(f,n[l>>2]|0),q(s,f),C=c}function Wt(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Ct(f,n[l>>2]|0),q(s,f),C=c}function vr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,gg(f,n[l>>2]|0),q(s,f),C=c}function Sn(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,dg(f,n[l>>2]|0),q(s,f),C=c}function Fr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,km(f,n[l>>2]|0),q(s,f),C=c}function bn(s){return s=s|0,+ +y(vc(n[s>>2]|0))}function ai(s,l){return s=s|0,l=l|0,+ +y(ug(n[s>>2]|0,l))}function tn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,ct(d,n[l>>2]|0,c),q(s,d),C=f}function ho(s,l,c){s=s|0,l=l|0,c=c|0,ir(n[s>>2]|0,n[l>>2]|0,c)}function vF(s,l){s=s|0,l=l|0,ms(n[s>>2]|0,n[l>>2]|0)}function tve(s){return s=s|0,wi(n[s>>2]|0)|0}function rve(s){return s=s|0,s=ht(n[s>>2]|0)|0,s?s=Sw(s)|0:s=0,s|0}function nve(s,l){return s=s|0,l=l|0,s=gs(n[s>>2]|0,l)|0,s?s=Sw(s)|0:s=0,s|0}function ive(s,l){s=s|0,l=l|0;var c=0,f=0;f=Kt(4)|0,Jj(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(GA(l),gt(l)),It(n[s>>2]|0,1)}function Jj(s,l){s=s|0,l=l|0,dve(s,l)}function sve(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,ove(k,qo(l)|0,+c,f,+d,m),h[s>>2]=y(+E[k>>3]),h[s+4>>2]=y(+E[k+8>>3]),C=B}function ove(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,k=0,Q=0,M=0,O=0;B=C,C=C+32|0,O=B+8|0,M=B+20|0,Q=B,k=B+16|0,E[O>>3]=c,n[M>>2]=f,E[Q>>3]=d,n[k>>2]=m,ave(s,n[l+4>>2]|0,O,M,Q,k),C=B}function ave(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,za(k),l=da(l)|0,lve(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),Va(k),C=B}function da(s){return s=s|0,n[s>>2]|0}function lve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=Sl(cve()|0)|0,c=+VA(c),f=DF(f)|0,d=+VA(d),uve(s,hi(0,B|0,l|0,+c,f|0,+d,DF(m)|0)|0)}function cve(){var s=0;return o[7608]|0||(hve(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function Sl(s){return s=s|0,n[s+8>>2]|0}function VA(s){return s=+s,+ +PF(s)}function DF(s){return s=s|0,Zj(s)|0}function uve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(Ave(c,0),ii(f|0,c|0)|0,fve(s,c),pve(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function Ave(s,l){s=s|0,l=l|0,Xj(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function fve(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function pve(s){s=s|0,o[s+24>>0]=0}function Xj(s,l){s=s|0,l=l|0,n[s>>2]=l}function Zj(s){return s=s|0,s|0}function PF(s){return s=+s,+s}function hve(s){s=s|0,bl(s,gve()|0,4)}function gve(){return 1064}function bl(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=Ap(l|0,c+1|0)|0}function dve(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,El(l|0)}function mve(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(GA(l),gt(l)),It(n[s>>2]|0,0)}function yve(s){s=s|0,Tt(n[s>>2]|0)}function Eve(s){return s=s|0,er(n[s>>2]|0)|0}function Cve(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,Dc(n[s>>2]|0,y(l),y(c),f)}function wve(s){return s=s|0,+ +y(Bl(n[s>>2]|0))}function Ive(s){return s=s|0,+ +y(mg(n[s>>2]|0))}function Bve(s){return s=s|0,+ +y(Bu(n[s>>2]|0))}function vve(s){return s=s|0,+ +y(LA(n[s>>2]|0))}function Dve(s){return s=s|0,+ +y(dp(n[s>>2]|0))}function Pve(s){return s=s|0,+ +y(Ga(n[s>>2]|0))}function Sve(s,l){s=s|0,l=l|0,E[s>>3]=+y(Bl(n[l>>2]|0)),E[s+8>>3]=+y(mg(n[l>>2]|0)),E[s+16>>3]=+y(Bu(n[l>>2]|0)),E[s+24>>3]=+y(LA(n[l>>2]|0)),E[s+32>>3]=+y(dp(n[l>>2]|0)),E[s+40>>3]=+y(Ga(n[l>>2]|0))}function bve(s,l){return s=s|0,l=l|0,+ +y(yg(n[s>>2]|0,l))}function xve(s,l){return s=s|0,l=l|0,+ +y(mp(n[s>>2]|0,l))}function kve(s,l){return s=s|0,l=l|0,+ +y(Go(n[s>>2]|0,l))}function Qve(){return Pn()|0}function Fve(){Rve(),Tve(),Lve(),Nve(),Ove(),Mve()}function Rve(){OLe(11713,4938,1)}function Tve(){rLe(10448)}function Lve(){OTe(10408)}function Nve(){oTe(10324)}function Ove(){hFe(10096)}function Mve(){Uve(9132)}function Uve(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0,lt=0,Ue=0,Ge=0,Nt=0,Mr=0,ar=0,Xt=0,Pr=0,Lr=0,sr=0,xn=0,go=0,mo=0,yo=0,ya=0,Rp=0,Tp=0,xl=0,Lp=0,Ru=0,Tu=0,Np=0,Op=0,Mp=0,Xr=0,kl=0,Up=0,kc=0,_p=0,Hp=0,Lu=0,Nu=0,Qc=0,Gs=0,Xa=0,Wo=0,Ql=0,nf=0,sf=0,Ou=0,of=0,af=0,js=0,vs=0,Fl=0,Rn=0,lf=0,Eo=0,Fc=0,Co=0,Rc=0,cf=0,uf=0,Tc=0,Ys=0,Rl=0,Af=0,ff=0,pf=0,xr=0,Vn=0,Ds=0,wo=0,Ws=0,Rr=0,ur=0,Tl=0;l=C,C=C+672|0,c=l+656|0,Tl=l+648|0,ur=l+640|0,Rr=l+632|0,Ws=l+624|0,wo=l+616|0,Ds=l+608|0,Vn=l+600|0,xr=l+592|0,pf=l+584|0,ff=l+576|0,Af=l+568|0,Rl=l+560|0,Ys=l+552|0,Tc=l+544|0,uf=l+536|0,cf=l+528|0,Rc=l+520|0,Co=l+512|0,Fc=l+504|0,Eo=l+496|0,lf=l+488|0,Rn=l+480|0,Fl=l+472|0,vs=l+464|0,js=l+456|0,af=l+448|0,of=l+440|0,Ou=l+432|0,sf=l+424|0,nf=l+416|0,Ql=l+408|0,Wo=l+400|0,Xa=l+392|0,Gs=l+384|0,Qc=l+376|0,Nu=l+368|0,Lu=l+360|0,Hp=l+352|0,_p=l+344|0,kc=l+336|0,Up=l+328|0,kl=l+320|0,Xr=l+312|0,Mp=l+304|0,Op=l+296|0,Np=l+288|0,Tu=l+280|0,Ru=l+272|0,Lp=l+264|0,xl=l+256|0,Tp=l+248|0,Rp=l+240|0,ya=l+232|0,yo=l+224|0,mo=l+216|0,go=l+208|0,xn=l+200|0,sr=l+192|0,Lr=l+184|0,Pr=l+176|0,Xt=l+168|0,ar=l+160|0,Mr=l+152|0,Nt=l+144|0,Ge=l+136|0,Ue=l+128|0,lt=l+120|0,Xe=l+112|0,et=l+104|0,Qe=l+96|0,Me=l+88|0,je=l+80|0,se=l+72|0,G=l+64|0,O=l+56|0,M=l+48|0,Q=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,_ve(s,3646),Hve(s,3651,2)|0,qve(s,3665,2)|0,Gve(s,3682,18)|0,n[Tl>>2]=19,n[Tl+4>>2]=0,n[c>>2]=n[Tl>>2],n[c+4>>2]=n[Tl+4>>2],Tw(s,3690,c)|0,n[ur>>2]=1,n[ur+4>>2]=0,n[c>>2]=n[ur>>2],n[c+4>>2]=n[ur+4>>2],jve(s,3696,c)|0,n[Rr>>2]=2,n[Rr+4>>2]=0,n[c>>2]=n[Rr>>2],n[c+4>>2]=n[Rr+4>>2],ku(s,3706,c)|0,n[Ws>>2]=1,n[Ws+4>>2]=0,n[c>>2]=n[Ws>>2],n[c+4>>2]=n[Ws+4>>2],Sg(s,3722,c)|0,n[wo>>2]=2,n[wo+4>>2]=0,n[c>>2]=n[wo>>2],n[c+4>>2]=n[wo+4>>2],Sg(s,3734,c)|0,n[Ds>>2]=3,n[Ds+4>>2]=0,n[c>>2]=n[Ds>>2],n[c+4>>2]=n[Ds+4>>2],ku(s,3753,c)|0,n[Vn>>2]=4,n[Vn+4>>2]=0,n[c>>2]=n[Vn>>2],n[c+4>>2]=n[Vn+4>>2],ku(s,3769,c)|0,n[xr>>2]=5,n[xr+4>>2]=0,n[c>>2]=n[xr>>2],n[c+4>>2]=n[xr+4>>2],ku(s,3783,c)|0,n[pf>>2]=6,n[pf+4>>2]=0,n[c>>2]=n[pf>>2],n[c+4>>2]=n[pf+4>>2],ku(s,3796,c)|0,n[ff>>2]=7,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],ku(s,3813,c)|0,n[Af>>2]=8,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],ku(s,3825,c)|0,n[Rl>>2]=3,n[Rl+4>>2]=0,n[c>>2]=n[Rl>>2],n[c+4>>2]=n[Rl+4>>2],Sg(s,3843,c)|0,n[Ys>>2]=4,n[Ys+4>>2]=0,n[c>>2]=n[Ys>>2],n[c+4>>2]=n[Ys+4>>2],Sg(s,3853,c)|0,n[Tc>>2]=9,n[Tc+4>>2]=0,n[c>>2]=n[Tc>>2],n[c+4>>2]=n[Tc+4>>2],ku(s,3870,c)|0,n[uf>>2]=10,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],ku(s,3884,c)|0,n[cf>>2]=11,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],ku(s,3896,c)|0,n[Rc>>2]=1,n[Rc+4>>2]=0,n[c>>2]=n[Rc>>2],n[c+4>>2]=n[Rc+4>>2],Is(s,3907,c)|0,n[Co>>2]=2,n[Co+4>>2]=0,n[c>>2]=n[Co>>2],n[c+4>>2]=n[Co+4>>2],Is(s,3915,c)|0,n[Fc>>2]=3,n[Fc+4>>2]=0,n[c>>2]=n[Fc>>2],n[c+4>>2]=n[Fc+4>>2],Is(s,3928,c)|0,n[Eo>>2]=4,n[Eo+4>>2]=0,n[c>>2]=n[Eo>>2],n[c+4>>2]=n[Eo+4>>2],Is(s,3948,c)|0,n[lf>>2]=5,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],Is(s,3960,c)|0,n[Rn>>2]=6,n[Rn+4>>2]=0,n[c>>2]=n[Rn>>2],n[c+4>>2]=n[Rn+4>>2],Is(s,3974,c)|0,n[Fl>>2]=7,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],Is(s,3983,c)|0,n[vs>>2]=20,n[vs+4>>2]=0,n[c>>2]=n[vs>>2],n[c+4>>2]=n[vs+4>>2],Tw(s,3999,c)|0,n[js>>2]=8,n[js+4>>2]=0,n[c>>2]=n[js>>2],n[c+4>>2]=n[js+4>>2],Is(s,4012,c)|0,n[af>>2]=9,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],Is(s,4022,c)|0,n[of>>2]=21,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],Tw(s,4039,c)|0,n[Ou>>2]=10,n[Ou+4>>2]=0,n[c>>2]=n[Ou>>2],n[c+4>>2]=n[Ou+4>>2],Is(s,4053,c)|0,n[sf>>2]=11,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],Is(s,4065,c)|0,n[nf>>2]=12,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],Is(s,4084,c)|0,n[Ql>>2]=13,n[Ql+4>>2]=0,n[c>>2]=n[Ql>>2],n[c+4>>2]=n[Ql+4>>2],Is(s,4097,c)|0,n[Wo>>2]=14,n[Wo+4>>2]=0,n[c>>2]=n[Wo>>2],n[c+4>>2]=n[Wo+4>>2],Is(s,4117,c)|0,n[Xa>>2]=15,n[Xa+4>>2]=0,n[c>>2]=n[Xa>>2],n[c+4>>2]=n[Xa+4>>2],Is(s,4129,c)|0,n[Gs>>2]=16,n[Gs+4>>2]=0,n[c>>2]=n[Gs>>2],n[c+4>>2]=n[Gs+4>>2],Is(s,4148,c)|0,n[Qc>>2]=17,n[Qc+4>>2]=0,n[c>>2]=n[Qc>>2],n[c+4>>2]=n[Qc+4>>2],Is(s,4161,c)|0,n[Nu>>2]=18,n[Nu+4>>2]=0,n[c>>2]=n[Nu>>2],n[c+4>>2]=n[Nu+4>>2],Is(s,4181,c)|0,n[Lu>>2]=5,n[Lu+4>>2]=0,n[c>>2]=n[Lu>>2],n[c+4>>2]=n[Lu+4>>2],Sg(s,4196,c)|0,n[Hp>>2]=6,n[Hp+4>>2]=0,n[c>>2]=n[Hp>>2],n[c+4>>2]=n[Hp+4>>2],Sg(s,4206,c)|0,n[_p>>2]=7,n[_p+4>>2]=0,n[c>>2]=n[_p>>2],n[c+4>>2]=n[_p+4>>2],Sg(s,4217,c)|0,n[kc>>2]=3,n[kc+4>>2]=0,n[c>>2]=n[kc>>2],n[c+4>>2]=n[kc+4>>2],JA(s,4235,c)|0,n[Up>>2]=1,n[Up+4>>2]=0,n[c>>2]=n[Up>>2],n[c+4>>2]=n[Up+4>>2],SF(s,4251,c)|0,n[kl>>2]=4,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],JA(s,4263,c)|0,n[Xr>>2]=5,n[Xr+4>>2]=0,n[c>>2]=n[Xr>>2],n[c+4>>2]=n[Xr+4>>2],JA(s,4279,c)|0,n[Mp>>2]=6,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],JA(s,4293,c)|0,n[Op>>2]=7,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],JA(s,4306,c)|0,n[Np>>2]=8,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],JA(s,4323,c)|0,n[Tu>>2]=9,n[Tu+4>>2]=0,n[c>>2]=n[Tu>>2],n[c+4>>2]=n[Tu+4>>2],JA(s,4335,c)|0,n[Ru>>2]=2,n[Ru+4>>2]=0,n[c>>2]=n[Ru>>2],n[c+4>>2]=n[Ru+4>>2],SF(s,4353,c)|0,n[Lp>>2]=12,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],bg(s,4363,c)|0,n[xl>>2]=1,n[xl+4>>2]=0,n[c>>2]=n[xl>>2],n[c+4>>2]=n[xl+4>>2],XA(s,4376,c)|0,n[Tp>>2]=2,n[Tp+4>>2]=0,n[c>>2]=n[Tp>>2],n[c+4>>2]=n[Tp+4>>2],XA(s,4388,c)|0,n[Rp>>2]=13,n[Rp+4>>2]=0,n[c>>2]=n[Rp>>2],n[c+4>>2]=n[Rp+4>>2],bg(s,4402,c)|0,n[ya>>2]=14,n[ya+4>>2]=0,n[c>>2]=n[ya>>2],n[c+4>>2]=n[ya+4>>2],bg(s,4411,c)|0,n[yo>>2]=15,n[yo+4>>2]=0,n[c>>2]=n[yo>>2],n[c+4>>2]=n[yo+4>>2],bg(s,4421,c)|0,n[mo>>2]=16,n[mo+4>>2]=0,n[c>>2]=n[mo>>2],n[c+4>>2]=n[mo+4>>2],bg(s,4433,c)|0,n[go>>2]=17,n[go+4>>2]=0,n[c>>2]=n[go>>2],n[c+4>>2]=n[go+4>>2],bg(s,4446,c)|0,n[xn>>2]=18,n[xn+4>>2]=0,n[c>>2]=n[xn>>2],n[c+4>>2]=n[xn+4>>2],bg(s,4458,c)|0,n[sr>>2]=3,n[sr+4>>2]=0,n[c>>2]=n[sr>>2],n[c+4>>2]=n[sr+4>>2],XA(s,4471,c)|0,n[Lr>>2]=1,n[Lr+4>>2]=0,n[c>>2]=n[Lr>>2],n[c+4>>2]=n[Lr+4>>2],iD(s,4486,c)|0,n[Pr>>2]=10,n[Pr+4>>2]=0,n[c>>2]=n[Pr>>2],n[c+4>>2]=n[Pr+4>>2],JA(s,4496,c)|0,n[Xt>>2]=11,n[Xt+4>>2]=0,n[c>>2]=n[Xt>>2],n[c+4>>2]=n[Xt+4>>2],JA(s,4508,c)|0,n[ar>>2]=3,n[ar+4>>2]=0,n[c>>2]=n[ar>>2],n[c+4>>2]=n[ar+4>>2],SF(s,4519,c)|0,n[Mr>>2]=4,n[Mr+4>>2]=0,n[c>>2]=n[Mr>>2],n[c+4>>2]=n[Mr+4>>2],Yve(s,4530,c)|0,n[Nt>>2]=19,n[Nt+4>>2]=0,n[c>>2]=n[Nt>>2],n[c+4>>2]=n[Nt+4>>2],Wve(s,4542,c)|0,n[Ge>>2]=12,n[Ge+4>>2]=0,n[c>>2]=n[Ge>>2],n[c+4>>2]=n[Ge+4>>2],Kve(s,4554,c)|0,n[Ue>>2]=13,n[Ue+4>>2]=0,n[c>>2]=n[Ue>>2],n[c+4>>2]=n[Ue+4>>2],zve(s,4568,c)|0,n[lt>>2]=2,n[lt+4>>2]=0,n[c>>2]=n[lt>>2],n[c+4>>2]=n[lt+4>>2],Vve(s,4578,c)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[c>>2]=n[Xe>>2],n[c+4>>2]=n[Xe+4>>2],Jve(s,4587,c)|0,n[et>>2]=22,n[et+4>>2]=0,n[c>>2]=n[et>>2],n[c+4>>2]=n[et+4>>2],Tw(s,4602,c)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[c>>2]=n[Qe>>2],n[c+4>>2]=n[Qe+4>>2],Tw(s,4619,c)|0,n[Me>>2]=14,n[Me+4>>2]=0,n[c>>2]=n[Me>>2],n[c+4>>2]=n[Me+4>>2],Xve(s,4629,c)|0,n[je>>2]=1,n[je+4>>2]=0,n[c>>2]=n[je>>2],n[c+4>>2]=n[je+4>>2],Zve(s,4637,c)|0,n[se>>2]=4,n[se+4>>2]=0,n[c>>2]=n[se>>2],n[c+4>>2]=n[se+4>>2],XA(s,4653,c)|0,n[G>>2]=5,n[G+4>>2]=0,n[c>>2]=n[G>>2],n[c+4>>2]=n[G+4>>2],XA(s,4669,c)|0,n[O>>2]=6,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],XA(s,4686,c)|0,n[M>>2]=7,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],XA(s,4701,c)|0,n[Q>>2]=8,n[Q+4>>2]=0,n[c>>2]=n[Q>>2],n[c+4>>2]=n[Q+4>>2],XA(s,4719,c)|0,n[k>>2]=9,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],XA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],$ve(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],iD(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],iD(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],iD(s,4808,c)|0,C=l}function _ve(s,l){s=s|0,l=l|0;var c=0;c=sFe()|0,n[s>>2]=c,oFe(c,l),kp(n[s>>2]|0)}function Hve(s,l,c){return s=s|0,l=l|0,c=c|0,YQe(s,pn(l)|0,c,0),s|0}function qve(s,l,c){return s=s|0,l=l|0,c=c|0,xQe(s,pn(l)|0,c,0),s|0}function Gve(s,l,c){return s=s|0,l=l|0,c=c|0,gQe(s,pn(l)|0,c,0),s|0}function Tw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$ke(s,l,d),C=f,s|0}function jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Tke(s,l,d),C=f,s|0}function ku(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],yke(s,l,d),C=f,s|0}function Sg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rke(s,l,d),C=f,s|0}function Is(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],_xe(s,l,d),C=f,s|0}function JA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vxe(s,l,d),C=f,s|0}function SF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lxe(s,l,d),C=f,s|0}function bg(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Tbe(s,l,d),C=f,s|0}function XA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ybe(s,l,d),C=f,s|0}function iD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rbe(s,l,d),C=f,s|0}function Yve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],_Se(s,l,d),C=f,s|0}function Wve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vSe(s,l,d),C=f,s|0}function Kve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cSe(s,l,d),C=f,s|0}function zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],zPe(s,l,d),C=f,s|0}function Vve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QPe(s,l,d),C=f,s|0}function Jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hPe(s,l,d),C=f,s|0}function Xve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZDe(s,l,d),C=f,s|0}function Zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TDe(s,l,d),C=f,s|0}function $ve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eDe(s,l,d),C=f,s|0}function eDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tDe(s,c,d,1),C=f}function pn(s){return s=s|0,s|0}function tDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=bF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=rDe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,nDe(m,f)|0,f),C=d}function bF(){var s=0,l=0;if(o[7616]|0||(t9(9136),rr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t9(9136)}return 9136}function rDe(s){return s=s|0,0}function nDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=bF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],e9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(oDe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function hn(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0;B=C,C=C+32|0,se=B+24|0,G=B+20|0,Q=B+16|0,O=B+12|0,M=B+8|0,k=B+4|0,je=B,n[G>>2]=l,n[Q>>2]=c,n[O>>2]=f,n[M>>2]=d,n[k>>2]=m,m=s+28|0,n[je>>2]=n[m>>2],n[se>>2]=n[je>>2],iDe(s+24|0,se,G,O,M,Q,k)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function iDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=sDe(l)|0,l=Kt(24)|0,$j(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function sDe(s){return s=s|0,n[s>>2]|0}function $j(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function gr(s,l){return s=s|0,l=l|0,l|s|0}function e9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function oDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=aDe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,lDe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],e9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,cDe(s,k),uDe(k),C=M;return}}function aDe(s){return s=s|0,357913941}function lDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function cDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function uDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function t9(s){s=s|0,pDe(s)}function ADe(s){s=s|0,fDe(s+24|0)}function Tr(s){return s=s|0,n[s>>2]|0}function fDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function pDe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,3,l,hDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Kr(){return 9228}function hDe(){return 1140}function gDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=dDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=mDe(l,f)|0,C=c,l|0}function zr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function dDe(s){return s=s|0,(n[(bF()|0)+24>>2]|0)+(s*12|0)|0}function mDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),rf[c&31](f,s),f=yDe(f)|0,C=d,f|0}function yDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=xF(r9()|0)|0,f?(kF(l,f),QF(c,l),EDe(s,c),s=FF(l)|0):s=CDe(s)|0,C=d,s|0}function r9(){var s=0;return o[7632]|0||(kDe(9184),rr(25,9184,U|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function xF(s){return s=s|0,n[s+36>>2]|0}function kF(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function QF(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function EDe(s,l){s=s|0,l=l|0,vDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function FF(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function CDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;Q=C,C=C+16|0,c=Q+4|0,f=Q,d=Ka(8)|0,m=d,B=Kt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[s>>2],k=k+4|0,s=s+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Kt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],n9(k,B,c),n[d>>2]=k,C=Q,m|0}function n9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function wDe(s){s=s|0,Jm(s),gt(s)}function IDe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function BDe(s){s=s|0,gt(s)}function vDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=DDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function DDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var k=0,Q=0;return k=C,C=C+16|0,Q=k,za(Q),s=da(s)|0,B=PDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Va(Q),C=k,B|0}function PDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var k=0;return k=Sl(SDe()|0)|0,l=+VA(l),c=+VA(c),f=+VA(f),d=+VA(d),m=+VA(m),Ms(0,k|0,s|0,+l,+c,+f,+d,+m,+ +VA(B))|0}function SDe(){var s=0;return o[7624]|0||(bDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function bDe(s){s=s|0,bl(s,xDe()|0,6)}function xDe(){return 1112}function kDe(s){s=s|0,Dp(s)}function QDe(s){s=s|0,i9(s+24|0),s9(s+16|0)}function i9(s){s=s|0,RDe(s)}function s9(s){s=s|0,FDe(s)}function FDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function RDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function Dp(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function TDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],LDe(s,c,d,0),C=f}function LDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=RF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=NDe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,ODe(m,f)|0,f),C=d}function RF(){var s=0,l=0;if(o[7640]|0||(a9(9232),rr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a9(9232)}return 9232}function NDe(s){return s=s|0,0}function ODe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=RF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],o9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(MDe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function o9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function MDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=UDe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,_De(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],o9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,HDe(s,k),qDe(k),C=M;return}}function UDe(s){return s=s|0,357913941}function _De(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function HDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function a9(s){s=s|0,YDe(s)}function GDe(s){s=s|0,jDe(s+24|0)}function jDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function YDe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,1,l,WDe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function WDe(){return 1144}function KDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,B=m+8|0,k=m,Q=zDe(s)|0,s=n[Q+4>>2]|0,n[k>>2]=n[Q>>2],n[k+4>>2]=s,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],VDe(l,B,c,f,d),C=m}function zDe(s){return s=s|0,(n[(RF()|0)+24>>2]|0)+(s*12|0)|0}function VDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0,M=0;M=C,C=C+16|0,B=M+2|0,k=M+1|0,Q=M,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),Qu(B,c),c=+Fu(B,c),Qu(k,f),f=+Fu(k,f),ZA(Q,d),Q=$A(Q,d)|0,I7[m&1](s,c,f,Q),C=M}function Qu(s,l){s=s|0,l=+l}function Fu(s,l){return s=s|0,l=+l,+ +XDe(l)}function ZA(s,l){s=s|0,l=l|0}function $A(s,l){return s=s|0,l=l|0,JDe(l)|0}function JDe(s){return s=s|0,s|0}function XDe(s){return s=+s,+s}function ZDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$De(s,c,d,1),C=f}function $De(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=TF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ePe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,tPe(m,f)|0,f),C=d}function TF(){var s=0,l=0;if(o[7648]|0||(c9(9268),rr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));c9(9268)}return 9268}function ePe(s){return s=s|0,0}function tPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=TF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],l9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(rPe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function l9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function rPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=nPe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,iPe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],l9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,sPe(s,k),oPe(k),C=M;return}}function nPe(s){return s=s|0,357913941}function iPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function sPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function oPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function c9(s){s=s|0,cPe(s)}function aPe(s){s=s|0,lPe(s+24|0)}function lPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function cPe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,4,l,uPe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function uPe(){return 1160}function APe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=fPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=pPe(l,f)|0,C=c,l|0}function fPe(s){return s=s|0,(n[(TF()|0)+24>>2]|0)+(s*12|0)|0}function pPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),u9(Og[c&31](s)|0)|0}function u9(s){return s=s|0,s&1|0}function hPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gPe(s,c,d,0),C=f}function gPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=LF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dPe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,mPe(m,f)|0,f),C=d}function LF(){var s=0,l=0;if(o[7656]|0||(f9(9304),rr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));f9(9304)}return 9304}function dPe(s){return s=s|0,0}function mPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=LF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],A9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(yPe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function A9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function yPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=EPe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,CPe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],A9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,wPe(s,k),IPe(k),C=M;return}}function EPe(s){return s=s|0,357913941}function CPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function wPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function IPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function f9(s){s=s|0,DPe(s)}function BPe(s){s=s|0,vPe(s+24|0)}function vPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function DPe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,5,l,PPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function PPe(){return 1164}function SPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=bPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xPe(l,d,c),C=f}function bPe(s){return s=s|0,(n[(LF()|0)+24>>2]|0)+(s*12|0)|0}function xPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Pp(d,c),c=Sp(d,c)|0,rf[f&31](s,c),bp(d),C=m}function Pp(s,l){s=s|0,l=l|0,kPe(s,l)}function Sp(s,l){return s=s|0,l=l|0,s|0}function bp(s){s=s|0,GA(s)}function kPe(s,l){s=s|0,l=l|0,NF(s,l)}function NF(s,l){s=s|0,l=l|0,n[s>>2]=l}function QPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],FPe(s,c,d,0),C=f}function FPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=OF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=RPe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,TPe(m,f)|0,f),C=d}function OF(){var s=0,l=0;if(o[7664]|0||(h9(9340),rr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));h9(9340)}return 9340}function RPe(s){return s=s|0,0}function TPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=OF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],p9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(LPe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function p9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function LPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=NPe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,OPe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],p9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,MPe(s,k),UPe(k),C=M;return}}function NPe(s){return s=s|0,357913941}function OPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function MPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function UPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function h9(s){s=s|0,qPe(s)}function _Pe(s){s=s|0,HPe(s+24|0)}function HPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function qPe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,4,l,GPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function GPe(){return 1180}function jPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=YPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=WPe(l,d,c)|0,C=f,c|0}function YPe(s){return s=s|0,(n[(OF()|0)+24>>2]|0)+(s*12|0)|0}function WPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),xg(d,c),d=kg(d,c)|0,d=sD(RR[f&15](s,d)|0)|0,C=m,d|0}function xg(s,l){s=s|0,l=l|0}function kg(s,l){return s=s|0,l=l|0,KPe(l)|0}function sD(s){return s=s|0,s|0}function KPe(s){return s=s|0,s|0}function zPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],VPe(s,c,d,0),C=f}function VPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=MF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=JPe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,XPe(m,f)|0,f),C=d}function MF(){var s=0,l=0;if(o[7672]|0||(d9(9376),rr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));d9(9376)}return 9376}function JPe(s){return s=s|0,0}function XPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=MF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],g9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ZPe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function g9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ZPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=$Pe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,eSe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],g9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,tSe(s,k),rSe(k),C=M;return}}function $Pe(s){return s=s|0,357913941}function eSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function tSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function rSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function d9(s){s=s|0,sSe(s)}function nSe(s){s=s|0,iSe(s+24|0)}function iSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function sSe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,5,l,m9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function m9(){return 1196}function oSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=aSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=lSe(l,f)|0,C=c,l|0}function aSe(s){return s=s|0,(n[(MF()|0)+24>>2]|0)+(s*12|0)|0}function lSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),sD(Og[c&31](s)|0)|0}function cSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uSe(s,c,d,1),C=f}function uSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=UF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ASe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,fSe(m,f)|0,f),C=d}function UF(){var s=0,l=0;if(o[7680]|0||(E9(9412),rr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));E9(9412)}return 9412}function ASe(s){return s=s|0,0}function fSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=UF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],y9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(pSe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function y9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function pSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=hSe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,gSe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],y9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,dSe(s,k),mSe(k),C=M;return}}function hSe(s){return s=s|0,357913941}function gSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function dSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function mSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function E9(s){s=s|0,CSe(s)}function ySe(s){s=s|0,ESe(s+24|0)}function ESe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function CSe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,6,l,C9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function C9(){return 1200}function wSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=ISe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=BSe(l,f)|0,C=c,l|0}function ISe(s){return s=s|0,(n[(UF()|0)+24>>2]|0)+(s*12|0)|0}function BSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),oD(Og[c&31](s)|0)|0}function oD(s){return s=s|0,s|0}function vSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DSe(s,c,d,0),C=f}function DSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=_F()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=PSe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,SSe(m,f)|0,f),C=d}function _F(){var s=0,l=0;if(o[7688]|0||(I9(9448),rr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));I9(9448)}return 9448}function PSe(s){return s=s|0,0}function SSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=_F()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],w9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(bSe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function w9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function bSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=xSe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,kSe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],w9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,QSe(s,k),FSe(k),C=M;return}}function xSe(s){return s=s|0,357913941}function kSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function QSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function FSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function I9(s){s=s|0,LSe(s)}function RSe(s){s=s|0,TSe(s+24|0)}function TSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function LSe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,6,l,B9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function B9(){return 1204}function NSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=OSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MSe(l,d,c),C=f}function OSe(s){return s=s|0,(n[(_F()|0)+24>>2]|0)+(s*12|0)|0}function MSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),HF(d,c),d=qF(d,c)|0,rf[f&31](s,d),C=m}function HF(s,l){s=s|0,l=l|0}function qF(s,l){return s=s|0,l=l|0,USe(l)|0}function USe(s){return s=s|0,s|0}function _Se(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],HSe(s,c,d,0),C=f}function HSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=GF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=qSe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,GSe(m,f)|0,f),C=d}function GF(){var s=0,l=0;if(o[7696]|0||(D9(9484),rr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));D9(9484)}return 9484}function qSe(s){return s=s|0,0}function GSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=GF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],v9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jSe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function v9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=YSe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,WSe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],v9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,KSe(s,k),zSe(k),C=M;return}}function YSe(s){return s=s|0,357913941}function WSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function KSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function zSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function D9(s){s=s|0,XSe(s)}function VSe(s){s=s|0,JSe(s+24|0)}function JSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function XSe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,1,l,ZSe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ZSe(){return 1212}function $Se(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=ebe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],tbe(l,m,c,f),C=d}function ebe(s){return s=s|0,(n[(GF()|0)+24>>2]|0)+(s*12|0)|0}function tbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),HF(m,c),m=qF(m,c)|0,xg(B,f),B=kg(B,f)|0,Hw[d&15](s,m,B),C=k}function rbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nbe(s,c,d,1),C=f}function nbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=jF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ibe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,sbe(m,f)|0,f),C=d}function jF(){var s=0,l=0;if(o[7704]|0||(S9(9520),rr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));S9(9520)}return 9520}function ibe(s){return s=s|0,0}function sbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=jF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],P9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(obe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function P9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function obe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=abe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,lbe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],P9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,cbe(s,k),ube(k),C=M;return}}function abe(s){return s=s|0,357913941}function lbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function cbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ube(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function S9(s){s=s|0,pbe(s)}function Abe(s){s=s|0,fbe(s+24|0)}function fbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function pbe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,1,l,hbe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hbe(){return 1224}function gbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;return d=C,C=C+16|0,m=d+8|0,B=d,k=dbe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+mbe(l,m,c),C=d,+f}function dbe(s){return s=s|0,(n[(jF()|0)+24>>2]|0)+(s*12|0)|0}function mbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,B=+PF(+v7[f&7](s,d)),C=m,+B}function ybe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ebe(s,c,d,1),C=f}function Ebe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=YF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Cbe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,wbe(m,f)|0,f),C=d}function YF(){var s=0,l=0;if(o[7712]|0||(x9(9556),rr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));x9(9556)}return 9556}function Cbe(s){return s=s|0,0}function wbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=YF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],b9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Ibe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function b9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Ibe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Bbe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,vbe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],b9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Dbe(s,k),Pbe(k),C=M;return}}function Bbe(s){return s=s|0,357913941}function vbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Dbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Pbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function x9(s){s=s|0,xbe(s)}function Sbe(s){s=s|0,bbe(s+24|0)}function bbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function xbe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,5,l,kbe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kbe(){return 1232}function Qbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=Fbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+Rbe(l,d),C=f,+c}function Fbe(s){return s=s|0,(n[(YF()|0)+24>>2]|0)+(s*12|0)|0}function Rbe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +PF(+B7[c&15](s))}function Tbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Lbe(s,c,d,1),C=f}function Lbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=WF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Nbe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Obe(m,f)|0,f),C=d}function WF(){var s=0,l=0;if(o[7720]|0||(Q9(9592),rr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Q9(9592)}return 9592}function Nbe(s){return s=s|0,0}function Obe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=WF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],k9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Mbe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function k9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Mbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Ube(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,_be(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],k9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Hbe(s,k),qbe(k),C=M;return}}function Ube(s){return s=s|0,357913941}function _be(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Hbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function Q9(s){s=s|0,Ybe(s)}function Gbe(s){s=s|0,jbe(s+24|0)}function jbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Ybe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,7,l,Wbe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Wbe(){return 1276}function Kbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=zbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Vbe(l,f)|0,C=c,l|0}function zbe(s){return s=s|0,(n[(WF()|0)+24>>2]|0)+(s*12|0)|0}function Vbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),rf[c&31](f,s),f=F9(f)|0,C=d,f|0}function F9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=xF(R9()|0)|0,f?(kF(l,f),QF(c,l),Jbe(s,c),s=FF(l)|0):s=Xbe(s)|0,C=d,s|0}function R9(){var s=0;return o[7736]|0||(axe(9640),rr(25,9640,U|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function Jbe(s,l){s=s|0,l=l|0,txe(l,s,s+8|0)|0}function Xbe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ka(8)|0,l=f,k=Kt(16)|0,n[k>>2]=n[s>>2],n[k+4>>2]=n[s+4>>2],n[k+8>>2]=n[s+8>>2],n[k+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],KF(s,m,d),n[f>>2]=s,C=c,l|0}function KF(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function Zbe(s){s=s|0,Jm(s),gt(s)}function $be(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function exe(s){s=s|0,gt(s)}function txe(s,l,c){return s=s|0,l=l|0,c=c|0,l=rxe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function rxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,za(d),s=da(s)|0,c=nxe(s,n[l>>2]|0,+E[c>>3])|0,Va(d),C=f,c|0}function nxe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=Sl(ixe()|0)|0,l=DF(l)|0,yl(0,f|0,s|0,l|0,+ +VA(c))|0}function ixe(){var s=0;return o[7728]|0||(sxe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function sxe(s){s=s|0,bl(s,oxe()|0,2)}function oxe(){return 1264}function axe(s){s=s|0,Dp(s)}function lxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cxe(s,c,d,1),C=f}function cxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=zF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=uxe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Axe(m,f)|0,f),C=d}function zF(){var s=0,l=0;if(o[7744]|0||(L9(9684),rr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));L9(9684)}return 9684}function uxe(s){return s=s|0,0}function Axe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=zF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],T9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(fxe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function T9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function fxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=pxe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,hxe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],T9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,gxe(s,k),dxe(k),C=M;return}}function pxe(s){return s=s|0,357913941}function hxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function gxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function L9(s){s=s|0,Exe(s)}function mxe(s){s=s|0,yxe(s+24|0)}function yxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Exe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,5,l,Cxe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Cxe(){return 1280}function wxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=Ixe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=Bxe(l,d,c)|0,C=f,c|0}function Ixe(s){return s=s|0,(n[(zF()|0)+24>>2]|0)+(s*12|0)|0}function Bxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(m,c),m=$A(m,c)|0,Hw[f&15](d,s,m),m=F9(d)|0,C=B,m|0}function vxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Dxe(s,c,d,1),C=f}function Dxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=VF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Pxe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Sxe(m,f)|0,f),C=d}function VF(){var s=0,l=0;if(o[7752]|0||(O9(9720),rr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));O9(9720)}return 9720}function Pxe(s){return s=s|0,0}function Sxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=VF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],N9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(bxe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function N9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function bxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=xxe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,kxe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],N9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Qxe(s,k),Fxe(k),C=M;return}}function xxe(s){return s=s|0,357913941}function kxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Qxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Fxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function O9(s){s=s|0,Lxe(s)}function Rxe(s){s=s|0,Txe(s+24|0)}function Txe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Lxe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,8,l,Nxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Nxe(){return 1288}function Oxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=Mxe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Uxe(l,f)|0,C=c,l|0}function Mxe(s){return s=s|0,(n[(VF()|0)+24>>2]|0)+(s*12|0)|0}function Uxe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),Zj(Og[c&31](s)|0)|0}function _xe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Hxe(s,c,d,0),C=f}function Hxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=JF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=qxe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Gxe(m,f)|0,f),C=d}function JF(){var s=0,l=0;if(o[7760]|0||(U9(9756),rr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));U9(9756)}return 9756}function qxe(s){return s=s|0,0}function Gxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=JF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],M9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jxe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function M9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Yxe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,Wxe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],M9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Kxe(s,k),zxe(k),C=M;return}}function Yxe(s){return s=s|0,357913941}function Wxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Kxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function zxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function U9(s){s=s|0,Xxe(s)}function Vxe(s){s=s|0,Jxe(s+24|0)}function Jxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Xxe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,8,l,Zxe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Zxe(){return 1292}function $xe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=eke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tke(l,d,c),C=f}function eke(s){return s=s|0,(n[(JF()|0)+24>>2]|0)+(s*12|0)|0}function tke(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Qu(d,c),c=+Fu(d,c),C7[f&31](s,c),C=m}function rke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nke(s,c,d,0),C=f}function nke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=XF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ike(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,ske(m,f)|0,f),C=d}function XF(){var s=0,l=0;if(o[7768]|0||(H9(9792),rr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H9(9792)}return 9792}function ike(s){return s=s|0,0}function ske(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=XF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(oke(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function oke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=ake(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,lke(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,cke(s,k),uke(k),C=M;return}}function ake(s){return s=s|0,357913941}function lke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function cke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function uke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function H9(s){s=s|0,pke(s)}function Ake(s){s=s|0,fke(s+24|0)}function fke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function pke(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,1,l,hke()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hke(){return 1300}function gke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=dke(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],mke(l,m,c,f),C=d}function dke(s){return s=s|0,(n[(XF()|0)+24>>2]|0)+(s*12|0)|0}function mke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),ZA(m,c),m=$A(m,c)|0,Qu(B,f),f=+Fu(B,f),b7[d&15](s,m,f),C=k}function yke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Eke(s,c,d,0),C=f}function Eke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=ZF()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Cke(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,wke(m,f)|0,f),C=d}function ZF(){var s=0,l=0;if(o[7776]|0||(G9(9828),rr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));G9(9828)}return 9828}function Cke(s){return s=s|0,0}function wke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=ZF()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],q9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Ike(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function q9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Bke(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,vke(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],q9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Dke(s,k),Pke(k),C=M;return}}function Bke(s){return s=s|0,357913941}function vke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Dke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Pke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function G9(s){s=s|0,xke(s)}function Ske(s){s=s|0,bke(s+24|0)}function bke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function xke(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,7,l,kke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kke(){return 1312}function Qke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Fke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Rke(l,d,c),C=f}function Fke(s){return s=s|0,(n[(ZF()|0)+24>>2]|0)+(s*12|0)|0}function Rke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,rf[f&31](s,d),C=m}function Tke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Lke(s,c,d,0),C=f}function Lke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=$F()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Nke(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Oke(m,f)|0,f),C=d}function $F(){var s=0,l=0;if(o[7784]|0||(Y9(9864),rr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Y9(9864)}return 9864}function Nke(s){return s=s|0,0}function Oke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=$F()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],j9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Mke(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function j9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Mke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Uke(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,_ke(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],j9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Hke(s,k),qke(k),C=M;return}}function Uke(s){return s=s|0,357913941}function _ke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Hke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function Y9(s){s=s|0,Yke(s)}function Gke(s){s=s|0,jke(s+24|0)}function jke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Yke(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,8,l,Wke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Wke(){return 1320}function Kke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=zke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Vke(l,d,c),C=f}function zke(s){return s=s|0,(n[($F()|0)+24>>2]|0)+(s*12|0)|0}function Vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Jke(d,c),d=Xke(d,c)|0,rf[f&31](s,d),C=m}function Jke(s,l){s=s|0,l=l|0}function Xke(s,l){return s=s|0,l=l|0,Zke(l)|0}function Zke(s){return s=s|0,s|0}function $ke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eQe(s,c,d,0),C=f}function eQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=eR()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=tQe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,rQe(m,f)|0,f),C=d}function eR(){var s=0,l=0;if(o[7792]|0||(K9(9900),rr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));K9(9900)}return 9900}function tQe(s){return s=s|0,0}function rQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=eR()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],W9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(nQe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function W9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function nQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=iQe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,sQe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],W9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,oQe(s,k),aQe(k),C=M;return}}function iQe(s){return s=s|0,357913941}function sQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function oQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function aQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function K9(s){s=s|0,uQe(s)}function lQe(s){s=s|0,cQe(s+24|0)}function cQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function uQe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,22,l,AQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function AQe(){return 1344}function fQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=pQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],hQe(l,f),C=c}function pQe(s){return s=s|0,(n[(eR()|0)+24>>2]|0)+(s*12|0)|0}function hQe(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&127](s)}function gQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=tR()|0,s=dQe(c)|0,hn(m,l,d,s,mQe(c,f)|0,f)}function tR(){var s=0,l=0;if(o[7800]|0||(V9(9936),rr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));V9(9936)}return 9936}function dQe(s){return s=s|0,s|0}function mQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=tR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(z9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(yQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function yQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=EQe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,CQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,z9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,wQe(s,d),IQe(d),C=k;return}}function EQe(s){return s=s|0,536870911}function CQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function wQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function IQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function V9(s){s=s|0,DQe(s)}function BQe(s){s=s|0,vQe(s+24|0)}function vQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function DQe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,23,l,B9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function PQe(s,l){s=s|0,l=l|0,bQe(n[(SQe(s)|0)>>2]|0,l)}function SQe(s){return s=s|0,(n[(tR()|0)+24>>2]|0)+(s<<3)|0}function bQe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,HF(f,l),l=qF(f,l)|0,tf[s&127](l),C=c}function xQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=rR()|0,s=kQe(c)|0,hn(m,l,d,s,QQe(c,f)|0,f)}function rR(){var s=0,l=0;if(o[7808]|0||(X9(9972),rr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Tr(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));X9(9972)}return 9972}function kQe(s){return s=s|0,s|0}function QQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=rR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(J9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(FQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function J9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function FQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=RQe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,TQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,J9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,LQe(s,d),NQe(d),C=k;return}}function RQe(s){return s=s|0,536870911}function TQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function LQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function NQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function X9(s){s=s|0,UQe(s)}function OQe(s){s=s|0,MQe(s+24|0)}function MQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function UQe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,9,l,_Qe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function _Qe(){return 1348}function HQe(s,l){return s=s|0,l=l|0,GQe(n[(qQe(s)|0)>>2]|0,l)|0}function qQe(s){return s=s|0,(n[(rR()|0)+24>>2]|0)+(s<<3)|0}function GQe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,Z9(f,l),l=$9(f,l)|0,l=sD(Og[s&31](l)|0)|0,C=c,l|0}function Z9(s,l){s=s|0,l=l|0}function $9(s,l){return s=s|0,l=l|0,jQe(l)|0}function jQe(s){return s=s|0,s|0}function YQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=nR()|0,s=WQe(c)|0,hn(m,l,d,s,KQe(c,f)|0,f)}function nR(){var s=0,l=0;if(o[7816]|0||(t5(10008),rr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t5(10008)}return 10008}function WQe(s){return s=s|0,s|0}function KQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=nR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(e5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(zQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function e5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function zQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=VQe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,JQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,e5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,XQe(s,d),ZQe(d),C=k;return}}function VQe(s){return s=s|0,536870911}function JQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function XQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ZQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function t5(s){s=s|0,tFe(s)}function $Qe(s){s=s|0,eFe(s+24|0)}function eFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function tFe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,15,l,m9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function rFe(s){return s=s|0,iFe(n[(nFe(s)|0)>>2]|0)|0}function nFe(s){return s=s|0,(n[(nR()|0)+24>>2]|0)+(s<<3)|0}function iFe(s){return s=s|0,sD(CD[s&7]()|0)|0}function sFe(){var s=0;return o[7832]|0||(pFe(10052),rr(25,10052,U|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function oFe(s,l){s=s|0,l=l|0,n[s>>2]=aFe()|0,n[s+4>>2]=lFe()|0,n[s+12>>2]=l,n[s+8>>2]=cFe()|0,n[s+32>>2]=2}function aFe(){return 11709}function lFe(){return 1188}function cFe(){return aD()|0}function uFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(AFe(c),gt(c)):l|0&&(Su(l),gt(l))}function xp(s,l){return s=s|0,l=l|0,l&s|0}function AFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function aD(){var s=0;return o[7824]|0||(n[2511]=fFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function fFe(){return 0}function pFe(s){s=s|0,Dp(s)}function hFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,gFe(s,4827),dFe(s,4834,3)|0,mFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],yFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],EFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],CFe(s,4891,c)|0,C=l}function gFe(s,l){s=s|0,l=l|0;var c=0;c=ZRe()|0,n[s>>2]=c,$Re(c,l),kp(n[s>>2]|0)}function dFe(s,l,c){return s=s|0,l=l|0,c=c|0,NRe(s,pn(l)|0,c,0),s|0}function mFe(s,l,c){return s=s|0,l=l|0,c=c|0,wRe(s,pn(l)|0,c,0),s|0}function yFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rRe(s,l,d),C=f,s|0}function EFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],OFe(s,l,d),C=f,s|0}function CFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wFe(s,l,d),C=f,s|0}function wFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],IFe(s,c,d,1),C=f}function IFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=iR()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=BFe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,vFe(m,f)|0,f),C=d}function iR(){var s=0,l=0;if(o[7840]|0||(n5(10100),rr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));n5(10100)}return 10100}function BFe(s){return s=s|0,0}function vFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=iR()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],r5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(DFe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function r5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function DFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=PFe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,SFe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],r5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,bFe(s,k),xFe(k),C=M;return}}function PFe(s){return s=s|0,357913941}function SFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function xFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function n5(s){s=s|0,FFe(s)}function kFe(s){s=s|0,QFe(s+24|0)}function QFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function FFe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,6,l,RFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function RFe(){return 1364}function TFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=LFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=NFe(l,d,c)|0,C=f,c|0}function LFe(s){return s=s|0,(n[(iR()|0)+24>>2]|0)+(s*12|0)|0}function NFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),ZA(d,c),d=$A(d,c)|0,d=u9(RR[f&15](s,d)|0)|0,C=m,d|0}function OFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MFe(s,c,d,0),C=f}function MFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=sR()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=UFe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,_Fe(m,f)|0,f),C=d}function sR(){var s=0,l=0;if(o[7848]|0||(s5(10136),rr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s5(10136)}return 10136}function UFe(s){return s=s|0,0}function _Fe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=sR()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],i5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(HFe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function i5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function HFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=qFe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,GFe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],i5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,jFe(s,k),YFe(k),C=M;return}}function qFe(s){return s=s|0,357913941}function GFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function jFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function s5(s){s=s|0,zFe(s)}function WFe(s){s=s|0,KFe(s+24|0)}function KFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function zFe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,9,l,VFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VFe(){return 1372}function JFe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=XFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZFe(l,d,c),C=f}function XFe(s){return s=s|0,(n[(sR()|0)+24>>2]|0)+(s*12|0)|0}function ZFe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=Ze;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),$Fe(d,c),B=y(eRe(d,c)),E7[f&1](s,B),C=m}function $Fe(s,l){s=s|0,l=+l}function eRe(s,l){return s=s|0,l=+l,y(tRe(l))}function tRe(s){return s=+s,y(s)}function rRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nRe(s,c,d,0),C=f}function nRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=oR()|0,n[O>>2]=M,n[O+4>>2]=Q,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=iRe(m)|0,n[k>>2]=M,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,sRe(m,f)|0,f),C=d}function oR(){var s=0,l=0;if(o[7856]|0||(a5(10172),rr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a5(10172)}return 10172}function iRe(s){return s=s|0,0}function sRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,Q=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,G=oR()|0,M=G+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=G+28|0,c=n[l>>2]|0,c>>>0<(n[G+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],o5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(oRe(M,k,Q),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function o5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function oRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=aRe(s)|0,m>>>0>>0)Jr(s);else{O=n[s>>2]|0,se=((n[s+8>>2]|0)-O|0)/12|0,G=se<<1,lRe(k,se>>>0>>1>>>0?G>>>0>>0?d:G:m,((n[Q>>2]|0)-O|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],o5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,cRe(s,k),uRe(k),C=M;return}}function aRe(s){return s=s|0,357913941}function lRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Rt();else{d=Kt(l*12|0)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function cRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function uRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&>(s)}function a5(s){s=s|0,pRe(s)}function ARe(s){s=s|0,fRe(s+24|0)}function fRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function pRe(s){s=s|0;var l=0;l=Kr()|0,zr(s,2,3,l,hRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hRe(){return 1380}function gRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=dRe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],mRe(l,m,c,f),C=d}function dRe(s){return s=s|0,(n[(oR()|0)+24>>2]|0)+(s*12|0)|0}function mRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),ZA(m,c),m=$A(m,c)|0,yRe(B,f),B=ERe(B,f)|0,Hw[d&15](s,m,B),C=k}function yRe(s,l){s=s|0,l=l|0}function ERe(s,l){return s=s|0,l=l|0,CRe(l)|0}function CRe(s){return s=s|0,(s|0)!=0|0}function wRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=aR()|0,s=IRe(c)|0,hn(m,l,d,s,BRe(c,f)|0,f)}function aR(){var s=0,l=0;if(o[7864]|0||(c5(10208),rr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));c5(10208)}return 10208}function IRe(s){return s=s|0,s|0}function BRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=aR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(l5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(vRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function l5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function vRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=DRe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,PRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,l5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,SRe(s,d),bRe(d),C=k;return}}function DRe(s){return s=s|0,536870911}function PRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function SRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function bRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function c5(s){s=s|0,QRe(s)}function xRe(s){s=s|0,kRe(s+24|0)}function kRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function QRe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,24,l,FRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function FRe(){return 1392}function RRe(s,l){s=s|0,l=l|0,LRe(n[(TRe(s)|0)>>2]|0,l)}function TRe(s){return s=s|0,(n[(aR()|0)+24>>2]|0)+(s<<3)|0}function LRe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Z9(f,l),l=$9(f,l)|0,tf[s&127](l),C=c}function NRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=lR()|0,s=ORe(c)|0,hn(m,l,d,s,MRe(c,f)|0,f)}function lR(){var s=0,l=0;if(o[7872]|0||(A5(10244),rr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));A5(10244)}return 10244}function ORe(s){return s=s|0,s|0}function MRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=lR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(u5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(URe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function u5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function URe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=_Re(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,HRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,u5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,qRe(s,d),GRe(d),C=k;return}}function _Re(s){return s=s|0,536870911}function HRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function qRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function GRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function A5(s){s=s|0,WRe(s)}function jRe(s){s=s|0,YRe(s+24|0)}function YRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function WRe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,16,l,KRe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function KRe(){return 1400}function zRe(s){return s=s|0,JRe(n[(VRe(s)|0)>>2]|0)|0}function VRe(s){return s=s|0,(n[(lR()|0)+24>>2]|0)+(s<<3)|0}function JRe(s){return s=s|0,XRe(CD[s&7]()|0)|0}function XRe(s){return s=s|0,s|0}function ZRe(){var s=0;return o[7880]|0||(sTe(10280),rr(25,10280,U|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function $Re(s,l){s=s|0,l=l|0,n[s>>2]=eTe()|0,n[s+4>>2]=tTe()|0,n[s+12>>2]=l,n[s+8>>2]=rTe()|0,n[s+32>>2]=4}function eTe(){return 11711}function tTe(){return 1356}function rTe(){return aD()|0}function nTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(iTe(c),gt(c)):l|0&&(Pg(l),gt(l))}function iTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function sTe(s){s=s|0,Dp(s)}function oTe(s){s=s|0,aTe(s,4920),lTe(s)|0,cTe(s)|0}function aTe(s,l){s=s|0,l=l|0;var c=0;c=R9()|0,n[s>>2]=c,kTe(c,l),kp(n[s>>2]|0)}function lTe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,CTe()|0),s|0}function cTe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,uTe()|0),s|0}function uTe(){var s=0;return o[7888]|0||(f5(10328),rr(53,10328,U|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),Tr(10328)|0||f5(10328),10328}function Qg(s,l){s=s|0,l=l|0,hn(s,0,l,0,0,0)}function f5(s){s=s|0,pTe(s),Fg(s,10)}function ATe(s){s=s|0,fTe(s+24|0)}function fTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function pTe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,1,l,mTe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hTe(s,l,c){s=s|0,l=l|0,c=+c,gTe(s,l,c)}function Fg(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function gTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,m=f+8|0,k=f+13|0,d=f,B=f+12|0,ZA(k,l),n[m>>2]=$A(k,l)|0,Qu(B,c),E[d>>3]=+Fu(B,c),dTe(s,m,d),C=f}function dTe(s,l,c){s=s|0,l=l|0,c=c|0,Y(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function mTe(){return 1404}function yTe(s,l){return s=s|0,l=+l,ETe(s,l)|0}function ETe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,k=f,d=Ka(8)|0,c=d,Q=Kt(16)|0,ZA(m,s),s=$A(m,s)|0,Qu(B,l),Y(Q,s,+Fu(B,l)),B=c+4|0,n[B>>2]=Q,s=Kt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],KF(s,B,m),n[d>>2]=s,C=f,c|0}function CTe(){var s=0;return o[7896]|0||(p5(10364),rr(54,10364,U|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),Tr(10364)|0||p5(10364),10364}function p5(s){s=s|0,BTe(s),Fg(s,55)}function wTe(s){s=s|0,ITe(s+24|0)}function ITe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function BTe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,4,l,STe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function vTe(s){s=s|0,DTe(s)}function DTe(s){s=s|0,PTe(s)}function PTe(s){s=s|0,h5(s+8|0),o[s+24>>0]=1}function h5(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function STe(){return 1424}function bTe(){return xTe()|0}function xTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ka(8)|0,s=c,f=Kt(16)|0,h5(f),m=s+4|0,n[m>>2]=f,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],KF(f,m,d),n[c>>2]=f,C=l,s|0}function kTe(s,l){s=s|0,l=l|0,n[s>>2]=QTe()|0,n[s+4>>2]=FTe()|0,n[s+12>>2]=l,n[s+8>>2]=RTe()|0,n[s+32>>2]=5}function QTe(){return 11710}function FTe(){return 1416}function RTe(){return lD()|0}function TTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(LTe(c),gt(c)):l|0&>(l)}function LTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function lD(){var s=0;return o[7904]|0||(n[2600]=NTe()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function NTe(){return n[357]|0}function OTe(s){s=s|0,MTe(s,4926),UTe(s)|0}function MTe(s,l){s=s|0,l=l|0;var c=0;c=r9()|0,n[s>>2]=c,JTe(c,l),kp(n[s>>2]|0)}function UTe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,_Te()|0),s|0}function _Te(){var s=0;return o[7912]|0||(g5(10412),rr(56,10412,U|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),Tr(10412)|0||g5(10412),10412}function g5(s){s=s|0,GTe(s),Fg(s,57)}function HTe(s){s=s|0,qTe(s+24|0)}function qTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function GTe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,5,l,KTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function jTe(s){s=s|0,YTe(s)}function YTe(s){s=s|0,WTe(s)}function WTe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function KTe(){return 1432}function zTe(){return VTe()|0}function VTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Ka(8)|0,f=c,d=Kt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=f+4|0,n[m>>2]=d,k=Kt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],n9(k,m,s),n[c>>2]=k,C=B,f|0}function JTe(s,l){s=s|0,l=l|0,n[s>>2]=XTe()|0,n[s+4>>2]=ZTe()|0,n[s+12>>2]=l,n[s+8>>2]=$Te()|0,n[s+32>>2]=6}function XTe(){return 11704}function ZTe(){return 1436}function $Te(){return lD()|0}function eLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(tLe(c),gt(c)):l|0&>(l)}function tLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function rLe(s){s=s|0,nLe(s,4933),iLe(s)|0,sLe(s)|0}function nLe(s,l){s=s|0,l=l|0;var c=0;c=xLe()|0,n[s>>2]=c,kLe(c,l),kp(n[s>>2]|0)}function iLe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,ELe()|0),s|0}function sLe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,oLe()|0),s|0}function oLe(){var s=0;return o[7920]|0||(d5(10452),rr(58,10452,U|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),Tr(10452)|0||d5(10452),10452}function d5(s){s=s|0,cLe(s),Fg(s,1)}function aLe(s){s=s|0,lLe(s+24|0)}function lLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function cLe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,1,l,pLe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function uLe(s,l,c){s=s|0,l=+l,c=+c,ALe(s,l,c)}function ALe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,m=f+8|0,k=f+17|0,d=f,B=f+16|0,Qu(k,l),E[m>>3]=+Fu(k,l),Qu(B,c),E[d>>3]=+Fu(B,c),fLe(s,m,d),C=f}function fLe(s,l,c){s=s|0,l=l|0,c=c|0,m5(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function m5(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function pLe(){return 1472}function hLe(s,l){return s=+s,l=+l,gLe(s,l)|0}function gLe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,B=f+4|0,k=f+8|0,Q=f,d=Ka(8)|0,c=d,m=Kt(16)|0,Qu(B,s),s=+Fu(B,s),Qu(k,l),m5(m,s,+Fu(k,l)),k=c+4|0,n[k>>2]=m,m=Kt(8)|0,k=n[k>>2]|0,n[Q>>2]=0,n[B>>2]=n[Q>>2],y5(m,k,B),n[d>>2]=m,C=f,c|0}function y5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function dLe(s){s=s|0,Jm(s),gt(s)}function mLe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function yLe(s){s=s|0,gt(s)}function ELe(){var s=0;return o[7928]|0||(E5(10488),rr(59,10488,U|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),Tr(10488)|0||E5(10488),10488}function E5(s){s=s|0,ILe(s),Fg(s,60)}function CLe(s){s=s|0,wLe(s+24|0)}function wLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function ILe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,6,l,PLe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function BLe(s){s=s|0,vLe(s)}function vLe(s){s=s|0,DLe(s)}function DLe(s){s=s|0,C5(s+8|0),o[s+24>>0]=1}function C5(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function PLe(){return 1492}function SLe(){return bLe()|0}function bLe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ka(8)|0,s=c,f=Kt(16)|0,C5(f),m=s+4|0,n[m>>2]=f,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],y5(f,m,d),n[c>>2]=f,C=l,s|0}function xLe(){var s=0;return o[7936]|0||(NLe(10524),rr(25,10524,U|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function kLe(s,l){s=s|0,l=l|0,n[s>>2]=QLe()|0,n[s+4>>2]=FLe()|0,n[s+12>>2]=l,n[s+8>>2]=RLe()|0,n[s+32>>2]=7}function QLe(){return 11700}function FLe(){return 1484}function RLe(){return lD()|0}function TLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(LLe(c),gt(c)):l|0&>(l)}function LLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function NLe(s){s=s|0,Dp(s)}function OLe(s,l,c){s=s|0,l=l|0,c=c|0,s=pn(l)|0,l=MLe(c)|0,c=ULe(c,0)|0,gNe(s,l,c,cR()|0,0)}function MLe(s){return s=s|0,s|0}function ULe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=cR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(I5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(WLe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function cR(){var s=0,l=0;if(o[7944]|0||(w5(10568),rr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));w5(10568)}return 10568}function w5(s){s=s|0,qLe(s)}function _Le(s){s=s|0,HLe(s+24|0)}function HLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function qLe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,17,l,C9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function GLe(s){return s=s|0,YLe(n[(jLe(s)|0)>>2]|0)|0}function jLe(s){return s=s|0,(n[(cR()|0)+24>>2]|0)+(s<<3)|0}function YLe(s){return s=s|0,oD(CD[s&7]()|0)|0}function I5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function WLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=KLe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,zLe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,I5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,VLe(s,d),JLe(d),C=k;return}}function KLe(s){return s=s|0,536870911}function zLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function VLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function JLe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function XLe(){ZLe()}function ZLe(){$Le(10604)}function $Le(s){s=s|0,eNe(s,4955)}function eNe(s,l){s=s|0,l=l|0;var c=0;c=tNe()|0,n[s>>2]=c,rNe(c,l),kp(n[s>>2]|0)}function tNe(){var s=0;return o[7952]|0||(ANe(10612),rr(25,10612,U|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function rNe(s,l){s=s|0,l=l|0,n[s>>2]=oNe()|0,n[s+4>>2]=aNe()|0,n[s+12>>2]=l,n[s+8>>2]=lNe()|0,n[s+32>>2]=8}function kp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,Ym()|0,n[c>>2]=s,nNe(10608,c),C=l}function Ym(){return o[11714]|0||(n[2652]=0,rr(62,10608,U|0)|0,o[11714]=1),10608}function nNe(s,l){s=s|0,l=l|0;var c=0;c=Kt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function iNe(s){s=s|0,sNe(s)}function sNe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while((l|0)!=0);n[s>>2]=0}function oNe(){return 11715}function aNe(){return 1496}function lNe(){return aD()|0}function cNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(uNe(c),gt(c)):l|0&>(l)}function uNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function ANe(s){s=s|0,Dp(s)}function fNe(s,l){s=s|0,l=l|0;var c=0,f=0;Ym()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&(n7(uR(f)|0,s)|0)==0);)if(c=n[c>>2]|0,!c)break e;pNe(f,l)}while(0)}function uR(s){return s=s|0,n[s+12>>2]|0}function pNe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(GA(c),gt(c)),c=Kt(4)|0,Jj(c,l),n[s>>2]=c}function AR(){return o[11716]|0||(n[2664]=0,rr(63,10656,U|0)|0,o[11716]=1),10656}function B5(){var s=0;return o[11717]|0?s=n[2665]|0:(hNe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function hNe(){o[11740]|0||(o[11718]=gr(gr(8,0)|0,0)|0,o[11719]=gr(gr(0,0)|0,0)|0,o[11720]=gr(gr(0,16)|0,0)|0,o[11721]=gr(gr(8,0)|0,0)|0,o[11722]=gr(gr(0,0)|0,0)|0,o[11723]=gr(gr(8,0)|0,0)|0,o[11724]=gr(gr(0,0)|0,0)|0,o[11725]=gr(gr(8,0)|0,0)|0,o[11726]=gr(gr(0,0)|0,0)|0,o[11727]=gr(gr(8,0)|0,0)|0,o[11728]=gr(gr(0,0)|0,0)|0,o[11729]=gr(gr(0,0)|0,32)|0,o[11730]=gr(gr(0,0)|0,32)|0,o[11740]=1)}function v5(){return 1572}function gNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0,O=0;m=C,C=C+32|0,O=m+16|0,M=m+12|0,Q=m+8|0,k=m+4|0,B=m,n[O>>2]=s,n[M>>2]=l,n[Q>>2]=c,n[k>>2]=f,n[B>>2]=d,AR()|0,dNe(10656,O,M,Q,k,B),C=m}function dNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Kt(24)|0,$j(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function D5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0,lt=0;if(lt=C,C=C+32|0,Me=lt+20|0,Qe=lt+8|0,et=lt+4|0,Xe=lt,l=n[l>>2]|0,l|0){je=Me+4|0,Q=Me+8|0,M=Qe+4|0,O=Qe+8|0,G=Qe+8|0,se=Me+8|0;do{if(B=l+4|0,k=fR(B)|0,k|0){if(d=Lw(k)|0,n[Me>>2]=0,n[je>>2]=0,n[Q>>2]=0,f=(Nw(k)|0)+1|0,mNe(Me,f),f|0)for(;f=f+-1|0,xc(Qe,n[d>>2]|0),m=n[je>>2]|0,m>>>0<(n[se>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[je>>2]=(n[je>>2]|0)+4):pR(Me,Qe),f;)d=d+4|0;f=Ow(k)|0,n[Qe>>2]=0,n[M>>2]=0,n[O>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?yNe(Qe,f):(n[d>>2]=n[f>>2],n[M>>2]=(n[M>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[M>>2]|0,m=n[G>>2]|0}while(0);n[et>>2]=cD(B)|0,n[Xe>>2]=Tr(k)|0,ENe(c,s,et,Xe,Me,Qe),hR(Qe),ef(Me)}l=n[l>>2]|0}while((l|0)!=0)}C=lt}function fR(s){return s=s|0,n[s+12>>2]|0}function Lw(s){return s=s|0,n[s+12>>2]|0}function Nw(s){return s=s|0,n[s+16>>2]|0}function mNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0>>0&&(R5(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),T5(s,c),L5(c)),C=d}function pR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=F5(s)|0,m>>>0>>0)Jr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,Q=M>>1,R5(c,M>>2>>>0>>1>>>0?Q>>>0>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,T5(s,c),L5(c),C=B;return}}function Ow(s){return s=s|0,n[s+8>>2]|0}function yNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=Q5(s)|0,m>>>0>>0)Jr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,Q=M>>1,MNe(c,M>>2>>>0>>1>>>0?Q>>>0>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,UNe(s,c),_Ne(c),C=B;return}}function cD(s){return s=s|0,n[s>>2]|0}function ENe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,CNe(s,l,c,f,d,m)}function hR(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function ef(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function CNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,M=0,O=0,G=0;B=C,C=C+48|0,O=B+40|0,k=B+32|0,G=B+24|0,Q=B+12|0,M=B,za(k),s=da(s)|0,n[G>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,gR(Q,d),wNe(M,m),n[O>>2]=n[G>>2],INe(s,O,c,f,Q,M),hR(M),ef(Q),Va(k),C=B}function gR(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(NNe(s,f),ONe(s,n[l>>2]|0,n[c>>2]|0,f))}function wNe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(TNe(s,f),LNe(s,n[l>>2]|0,n[c>>2]|0,f))}function INe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,M=0,O=0,G=0;B=C,C=C+32|0,O=B+28|0,G=B+24|0,k=B+12|0,Q=B,M=Sl(BNe()|0)|0,n[G>>2]=n[l>>2],n[O>>2]=n[G>>2],l=Rg(O)|0,c=P5(c)|0,f=dR(f)|0,n[k>>2]=n[d>>2],O=d+4|0,n[k+4>>2]=n[O>>2],G=d+8|0,n[k+8>>2]=n[G>>2],n[G>>2]=0,n[O>>2]=0,n[d>>2]=0,d=mR(k)|0,n[Q>>2]=n[m>>2],O=m+4|0,n[Q+4>>2]=n[O>>2],G=m+8|0,n[Q+8>>2]=n[G>>2],n[G>>2]=0,n[O>>2]=0,n[m>>2]=0,ao(0,M|0,s|0,l|0,c|0,f|0,d|0,vNe(Q)|0)|0,hR(Q),ef(k),C=B}function BNe(){var s=0;return o[7968]|0||(FNe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function Rg(s){return s=s|0,b5(s)|0}function P5(s){return s=s|0,S5(s)|0}function dR(s){return s=s|0,oD(s)|0}function mR(s){return s=s|0,PNe(s)|0}function vNe(s){return s=s|0,DNe(s)|0}function DNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Ka(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=S5(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function S5(s){return s=s|0,s|0}function PNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Ka(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=b5((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function b5(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=xF(x5()|0)|0,f?(kF(l,f),QF(c,l),lUe(s,c),s=FF(l)|0):s=SNe(s)|0,C=d,s|0}function x5(){var s=0;return o[7960]|0||(QNe(10664),rr(25,10664,U|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function SNe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ka(8)|0,l=f,k=Kt(4)|0,n[k>>2]=n[s>>2],m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],k5(s,m,d),n[f>>2]=s,C=c,l|0}function k5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function bNe(s){s=s|0,Jm(s),gt(s)}function xNe(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function kNe(s){s=s|0,gt(s)}function QNe(s){s=s|0,Dp(s)}function FNe(s){s=s|0,bl(s,RNe()|0,5)}function RNe(){return 1676}function TNe(s,l){s=s|0,l=l|0;var c=0;if((Q5(s)|0)>>>0>>0&&Jr(s),l>>>0>1073741823)Rt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function LNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function Q5(s){return s=s|0,1073741823}function NNe(s,l){s=s|0,l=l|0;var c=0;if((F5(s)|0)>>>0>>0&&Jr(s),l>>>0>1073741823)Rt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function ONe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function F5(s){return s=s|0,1073741823}function MNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Kt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function UNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _Ne(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function R5(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Rt();else{d=Kt(l<<2)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function T5(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function L5(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&>(s)}function HNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0;if(Qe=C,C=C+32|0,O=Qe+20|0,G=Qe+12|0,M=Qe+16|0,se=Qe+4|0,je=Qe,Me=Qe+8|0,k=B5()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(Q=n[k+8>>2]|0,k=n[k+4>>2]|0;xc(O,B),qNe(s,O,k,Q),m=m+4|0,B=n[m>>2]|0,B;)Q=Q+1|0,k=k+1|0;if(m=v5()|0,B=n[m>>2]|0,B|0)do xc(O,B),n[G>>2]=n[m+4>>2],GNe(l,O,G),m=m+8|0,B=n[m>>2]|0;while((B|0)!=0);if(m=n[(Ym()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,xc(O,n[(Wm(l)|0)>>2]|0),n[G>>2]=uR(l)|0,jNe(c,O,G),m=n[m>>2]|0;while((m|0)!=0);if(xc(M,0),m=AR()|0,n[O>>2]=n[M>>2],D5(O,m,d),m=n[(Ym()|0)>>2]|0,m|0){s=O+4|0,l=O+8|0,c=O+8|0;do{if(Q=n[m+4>>2]|0,xc(G,n[(Wm(Q)|0)>>2]|0),YNe(se,N5(Q)|0),B=n[se>>2]|0,B|0){n[O>>2]=0,n[s>>2]=0,n[l>>2]=0;do xc(je,n[(Wm(n[B+4>>2]|0)|0)>>2]|0),k=n[s>>2]|0,k>>>0<(n[c>>2]|0)>>>0?(n[k>>2]=n[je>>2],n[s>>2]=(n[s>>2]|0)+4):pR(O,je),B=n[B>>2]|0;while((B|0)!=0);WNe(f,G,O),ef(O)}n[Me>>2]=n[G>>2],M=O5(Q)|0,n[O>>2]=n[Me>>2],D5(O,M,d),s9(se),m=n[m>>2]|0}while((m|0)!=0)}C=Qe}function qNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,iOe(s,l,c,f)}function GNe(s,l,c){s=s|0,l=l|0,c=c|0,nOe(s,l,c)}function Wm(s){return s=s|0,s|0}function jNe(s,l,c){s=s|0,l=l|0,c=c|0,$Ne(s,l,c)}function N5(s){return s=s|0,s+16|0}function YNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=ZNe(c)|0,f|0){if(f=Kt(12)|0,B=(M5(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Kt(12)|0,Q=(M5(d)|0)+4|0,k=n[Q+4>>2]|0,B=s+4|0,n[B>>2]=n[Q>>2],n[B+4>>2]=k,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function WNe(s,l,c){s=s|0,l=l|0,c=c|0,KNe(s,l,c)}function O5(s){return s=s|0,s+24|0}function KNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,k=f+12|0,m=f,za(d),s=da(s)|0,n[k>>2]=n[l>>2],gR(m,c),n[B>>2]=n[k>>2],zNe(s,B,m),ef(m),Va(d),C=f}function zNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+16|0,k=f+12|0,d=f,m=Sl(VNe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=Rg(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],k=c+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[c>>2]=0,oo(0,m|0,s|0,l|0,mR(d)|0)|0,ef(d),C=f}function VNe(){var s=0;return o[7976]|0||(JNe(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function JNe(s){s=s|0,bl(s,XNe()|0,2)}function XNe(){return 1732}function ZNe(s){return s=s|0,n[s>>2]|0}function M5(s){return s=s|0,n[s>>2]|0}function $Ne(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],U5(s,m,c),Va(d),C=f}function U5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=Sl(eOe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=Rg(m)|0,oo(0,d|0,s|0,l|0,P5(c)|0)|0,C=f}function eOe(){var s=0;return o[7984]|0||(tOe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function tOe(s){s=s|0,bl(s,rOe()|0,2)}function rOe(){return 1744}function nOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=da(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],U5(s,m,c),Va(d),C=f}function iOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,za(m),s=da(s)|0,n[k>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[k>>2],sOe(s,B,c,f),Va(m),C=d}function sOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,B=d+4|0,k=d,m=Sl(oOe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=Rg(B)|0,c=Km(c)|0,hc(0,m|0,s|0,l|0,c|0,Km(f)|0)|0,C=d}function oOe(){var s=0;return o[7992]|0||(lOe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function Km(s){return s=s|0,aOe(s)|0}function aOe(s){return s=s|0,s&255|0}function lOe(s){s=s|0,bl(s,cOe()|0,3)}function cOe(){return 1756}function uOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;switch(se=C,C=C+32|0,k=se+8|0,Q=se+4|0,M=se+20|0,O=se,NF(s,0),f=aUe(l)|0,n[k>>2]=0,G=k+4|0,n[G>>2]=0,n[k+8>>2]=0,f<<24>>24){case 0:{o[M>>0]=0,AOe(Q,c,M),uD(s,Q)|0,jA(Q);break}case 8:{G=BR(l)|0,o[M>>0]=8,xc(O,n[G+4>>2]|0),fOe(Q,c,M,O,G+8|0),uD(s,Q)|0,jA(Q);break}case 9:{if(m=BR(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,xc(Q,n[d>>2]|0),f=n[G>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[Q>>2],n[G>>2]=(n[G>>2]|0)+4):pR(k,Q),l;)d=d+4|0;o[M>>0]=9,xc(O,n[m+8>>2]|0),pOe(Q,c,M,O,k),uD(s,Q)|0,jA(Q);break}default:G=BR(l)|0,o[M>>0]=f,xc(O,n[G+4>>2]|0),hOe(Q,c,M,O),uD(s,Q)|0,jA(Q)}ef(k),C=se}function AOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,za(d),l=da(l)|0,SOe(s,l,o[c>>0]|0),Va(d),C=f}function uD(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&SA(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function fOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+32|0,k=m+16|0,B=m+8|0,Q=m,za(B),l=da(l)|0,c=o[c>>0]|0,n[Q>>2]=n[f>>2],d=n[d>>2]|0,n[k>>2]=n[Q>>2],BOe(s,l,c,k,d),Va(B),C=m}function pOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0;m=C,C=C+32|0,Q=m+24|0,B=m+16|0,M=m+12|0,k=m,za(B),l=da(l)|0,c=o[c>>0]|0,n[M>>2]=n[f>>2],gR(k,d),n[Q>>2]=n[M>>2],EOe(s,l,c,Q,k),ef(k),Va(B),C=m}function hOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,za(m),l=da(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],n[B>>2]=n[k>>2],gOe(s,l,c,B),Va(m),C=d}function gOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+4|0,k=d,B=Sl(dOe()|0)|0,c=Km(c)|0,n[k>>2]=n[f>>2],n[m>>2]=n[k>>2],AD(s,oo(0,B|0,l|0,c|0,Rg(m)|0)|0),C=d}function dOe(){var s=0;return o[8e3]|0||(mOe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function AD(s,l){s=s|0,l=l|0,NF(s,l)}function mOe(s){s=s|0,bl(s,yOe()|0,2)}function yOe(){return 1772}function EOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0;m=C,C=C+32|0,Q=m+16|0,M=m+12|0,B=m,k=Sl(COe()|0)|0,c=Km(c)|0,n[M>>2]=n[f>>2],n[Q>>2]=n[M>>2],f=Rg(Q)|0,n[B>>2]=n[d>>2],Q=d+4|0,n[B+4>>2]=n[Q>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[Q>>2]=0,n[d>>2]=0,AD(s,hc(0,k|0,l|0,c|0,f|0,mR(B)|0)|0),ef(B),C=m}function COe(){var s=0;return o[8008]|0||(wOe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function wOe(s){s=s|0,bl(s,IOe()|0,3)}function IOe(){return 1784}function BOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,k=m+4|0,Q=m,B=Sl(vOe()|0)|0,c=Km(c)|0,n[Q>>2]=n[f>>2],n[k>>2]=n[Q>>2],f=Rg(k)|0,AD(s,hc(0,B|0,l|0,c|0,f|0,dR(d)|0)|0),C=m}function vOe(){var s=0;return o[8016]|0||(DOe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function DOe(s){s=s|0,bl(s,POe()|0,3)}function POe(){return 1800}function SOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=Sl(bOe()|0)|0,AD(s,Qn(0,f|0,l|0,Km(c)|0)|0)}function bOe(){var s=0;return o[8024]|0||(xOe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function xOe(s){s=s|0,bl(s,kOe()|0,1)}function kOe(){return 1816}function QOe(){FOe(),ROe(),TOe()}function FOe(){n[2702]=p7(65536)|0}function ROe(){eMe(10856)}function TOe(){LOe(10816)}function LOe(s){s=s|0,NOe(s,5044),OOe(s)|0}function NOe(s,l){s=s|0,l=l|0;var c=0;c=x5()|0,n[s>>2]=c,zOe(c,l),kp(n[s>>2]|0)}function OOe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,MOe()|0),s|0}function MOe(){var s=0;return o[8032]|0||(_5(10820),rr(64,10820,U|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),Tr(10820)|0||_5(10820),10820}function _5(s){s=s|0,HOe(s),Fg(s,25)}function UOe(s){s=s|0,_Oe(s+24|0)}function _Oe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function HOe(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,18,l,YOe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qOe(s,l){s=s|0,l=l|0,GOe(s,l)}function GOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,xg(d,l),n[f>>2]=kg(d,l)|0,jOe(s,f),C=c}function jOe(s,l){s=s|0,l=l|0,H5(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function H5(s,l){s=s|0,l=l|0,n[s>>2]=l}function YOe(){return 1824}function WOe(s){return s=s|0,KOe(s)|0}function KOe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Ka(8)|0,l=f,k=Kt(4)|0,xg(d,s),H5(k,kg(d,s)|0),m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],k5(s,m,d),n[f>>2]=s,C=c,l|0}function Ka(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=p7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function zOe(s,l){s=s|0,l=l|0,n[s>>2]=VOe()|0,n[s+4>>2]=JOe()|0,n[s+12>>2]=l,n[s+8>>2]=XOe()|0,n[s+32>>2]=9}function VOe(){return 11744}function JOe(){return 1832}function XOe(){return lD()|0}function ZOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&($Oe(c),gt(c)):l|0&>(l)}function $Oe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function eMe(s){s=s|0,tMe(s,5052),rMe(s)|0,nMe(s,5058,26)|0,iMe(s,5069,1)|0,sMe(s,5077,10)|0,oMe(s,5087,19)|0,aMe(s,5094,27)|0}function tMe(s,l){s=s|0,l=l|0;var c=0;c=$4e()|0,n[s>>2]=c,eUe(c,l),kp(n[s>>2]|0)}function rMe(s){s=s|0;var l=0;return l=n[s>>2]|0,Qg(l,U4e()|0),s|0}function nMe(s,l,c){return s=s|0,l=l|0,c=c|0,w4e(s,pn(l)|0,c,0),s|0}function iMe(s,l,c){return s=s|0,l=l|0,c=c|0,o4e(s,pn(l)|0,c,0),s|0}function sMe(s,l,c){return s=s|0,l=l|0,c=c|0,MMe(s,pn(l)|0,c,0),s|0}function oMe(s,l,c){return s=s|0,l=l|0,c=c|0,BMe(s,pn(l)|0,c,0),s|0}function q5(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}gt(c)}n[2701]=s}function aMe(s,l,c){return s=s|0,l=l|0,c=c|0,lMe(s,pn(l)|0,c,0),s|0}function lMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=yR()|0,s=cMe(c)|0,hn(m,l,d,s,uMe(c,f)|0,f)}function yR(){var s=0,l=0;if(o[8040]|0||(j5(10860),rr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j5(10860)}return 10860}function cMe(s){return s=s|0,s|0}function uMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=yR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(G5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(AMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function G5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function AMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=fMe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,pMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,G5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,hMe(s,d),gMe(d),C=k;return}}function fMe(s){return s=s|0,536870911}function pMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function hMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function gMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function j5(s){s=s|0,yMe(s)}function dMe(s){s=s|0,mMe(s+24|0)}function mMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function yMe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,11,l,EMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function EMe(){return 1840}function CMe(s,l,c){s=s|0,l=l|0,c=c|0,IMe(n[(wMe(s)|0)>>2]|0,l,c)}function wMe(s){return s=s|0,(n[(yR()|0)+24>>2]|0)+(s<<3)|0}function IMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,xg(m,l),l=kg(m,l)|0,xg(d,c),c=kg(d,c)|0,rf[s&31](l,c),C=f}function BMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=ER()|0,s=vMe(c)|0,hn(m,l,d,s,DMe(c,f)|0,f)}function ER(){var s=0,l=0;if(o[8048]|0||(W5(10896),rr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W5(10896)}return 10896}function vMe(s){return s=s|0,s|0}function DMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=ER()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(Y5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(PMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function Y5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function PMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=SMe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,bMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,Y5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,xMe(s,d),kMe(d),C=k;return}}function SMe(s){return s=s|0,536870911}function bMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function xMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function W5(s){s=s|0,RMe(s)}function QMe(s){s=s|0,FMe(s+24|0)}function FMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function RMe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,11,l,TMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TMe(){return 1852}function LMe(s,l){return s=s|0,l=l|0,OMe(n[(NMe(s)|0)>>2]|0,l)|0}function NMe(s){return s=s|0,(n[(ER()|0)+24>>2]|0)+(s<<3)|0}function OMe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,xg(f,l),l=kg(f,l)|0,l=oD(Og[s&31](l)|0)|0,C=c,l|0}function MMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=CR()|0,s=UMe(c)|0,hn(m,l,d,s,_Me(c,f)|0,f)}function CR(){var s=0,l=0;if(o[8056]|0||(z5(10932),rr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));z5(10932)}return 10932}function UMe(s){return s=s|0,s|0}function _Me(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=CR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(K5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(HMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function K5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function HMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=qMe(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,GMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,K5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,jMe(s,d),YMe(d),C=k;return}}function qMe(s){return s=s|0,536870911}function GMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function jMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function z5(s){s=s|0,zMe(s)}function WMe(s){s=s|0,KMe(s+24|0)}function KMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function zMe(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,7,l,VMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VMe(){return 1860}function JMe(s,l,c){return s=s|0,l=l|0,c=c|0,ZMe(n[(XMe(s)|0)>>2]|0,l,c)|0}function XMe(s){return s=s|0,(n[(CR()|0)+24>>2]|0)+(s<<3)|0}function ZMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,k=f,Q=f+16|0,d=f+4|0,$Me(Q,l),e4e(k,Q,l),Pp(d,c),c=Sp(d,c)|0,n[B>>2]=n[k>>2],Hw[s&15](m,B,c),c=t4e(m)|0,jA(m),bp(d),C=f,c|0}function $Me(s,l){s=s|0,l=l|0}function e4e(s,l,c){s=s|0,l=l|0,c=c|0,r4e(s,c)}function t4e(s){return s=s|0,da(s)|0}function r4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(n4e(c,0),ii(f|0,c|0)|0,i4e(s,c),s4e(c)):n[s>>2]=n[l>>2],C=d}function n4e(s,l){s=s|0,l=l|0,Xj(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function i4e(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function s4e(s){s=s|0,o[s+8>>0]=0}function o4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=wR()|0,s=a4e(c)|0,hn(m,l,d,s,l4e(c,f)|0,f)}function wR(){var s=0,l=0;if(o[8064]|0||(J5(10968),rr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Tr(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));J5(10968)}return 10968}function a4e(s){return s=s|0,s|0}function l4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=wR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(V5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(c4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function V5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function c4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=u4e(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,A4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,V5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,f4e(s,d),p4e(d),C=k;return}}function u4e(s){return s=s|0,536870911}function A4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function f4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function p4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function J5(s){s=s|0,d4e(s)}function h4e(s){s=s|0,g4e(s+24|0)}function g4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function d4e(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,1,l,m4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function m4e(){return 1872}function y4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,C4e(n[(E4e(s)|0)>>2]|0,l,c,f,d,m)}function E4e(s){return s=s|0,(n[(wR()|0)+24>>2]|0)+(s<<3)|0}function C4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,M=0,O=0,G=0;B=C,C=C+32|0,k=B+16|0,Q=B+12|0,M=B+8|0,O=B+4|0,G=B,Pp(k,l),l=Sp(k,l)|0,Pp(Q,c),c=Sp(Q,c)|0,Pp(M,f),f=Sp(M,f)|0,Pp(O,d),d=Sp(O,d)|0,Pp(G,m),m=Sp(G,m)|0,y7[s&1](l,c,f,d,m),bp(G),bp(O),bp(M),bp(Q),bp(k),C=B}function w4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=IR()|0,s=I4e(c)|0,hn(m,l,d,s,B4e(c,f)|0,f)}function IR(){var s=0,l=0;if(o[8072]|0||(Z5(11004),rr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Tr(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Z5(11004)}return 11004}function I4e(s){return s=s|0,s|0}function B4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=IR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(X5(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(v4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function X5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function v4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=D4e(s)|0,f>>>0>>0)Jr(s);else{Q=n[s>>2]|0,O=(n[s+8>>2]|0)-Q|0,M=O>>2,P4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,X5(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,S4e(s,d),b4e(d),C=k;return}}function D4e(s){return s=s|0,536870911}function P4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Rt();else{d=Kt(l<<3)|0;break}else d=0;while(0);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function S4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function b4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&>(s)}function Z5(s){s=s|0,Q4e(s)}function x4e(s){s=s|0,k4e(s+24|0)}function k4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function Q4e(s){s=s|0;var l=0;l=Kr()|0,zr(s,1,12,l,F4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function F4e(){return 1896}function R4e(s,l,c){s=s|0,l=l|0,c=c|0,L4e(n[(T4e(s)|0)>>2]|0,l,c)}function T4e(s){return s=s|0,(n[(IR()|0)+24>>2]|0)+(s<<3)|0}function L4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,N4e(m,l),l=O4e(m,l)|0,Pp(d,c),c=Sp(d,c)|0,rf[s&31](l,c),bp(d),C=f}function N4e(s,l){s=s|0,l=l|0}function O4e(s,l){return s=s|0,l=l|0,M4e(l)|0}function M4e(s){return s=s|0,s|0}function U4e(){var s=0;return o[8080]|0||($5(11040),rr(70,11040,U|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),Tr(11040)|0||$5(11040),11040}function $5(s){s=s|0,q4e(s),Fg(s,71)}function _4e(s){s=s|0,H4e(s+24|0)}function H4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function q4e(s){s=s|0;var l=0;l=Kr()|0,zr(s,5,7,l,W4e()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function G4e(s){s=s|0,j4e(s)}function j4e(s){s=s|0,Y4e(s)}function Y4e(s){s=s|0,o[s+8>>0]=1}function W4e(){return 1936}function K4e(){return z4e()|0}function z4e(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Ka(8)|0,s=c,m=s+4|0,n[m>>2]=Kt(1)|0,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],V4e(f,m,d),n[c>>2]=f,C=l,s|0}function V4e(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function J4e(s){s=s|0,Jm(s),gt(s)}function X4e(s){s=s|0,s=n[s+12>>2]|0,s|0&>(s)}function Z4e(s){s=s|0,gt(s)}function $4e(){var s=0;return o[8088]|0||(oUe(11076),rr(25,11076,U|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function eUe(s,l){s=s|0,l=l|0,n[s>>2]=tUe()|0,n[s+4>>2]=rUe()|0,n[s+12>>2]=l,n[s+8>>2]=nUe()|0,n[s+32>>2]=10}function tUe(){return 11745}function rUe(){return 1940}function nUe(){return aD()|0}function iUe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(xp(f,896)|0)==512?c|0&&(sUe(c),gt(c)):l|0&>(l)}function sUe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Qp(s)}function oUe(s){s=s|0,Dp(s)}function xc(s,l){s=s|0,l=l|0,n[s>>2]=l}function BR(s){return s=s|0,n[s>>2]|0}function aUe(s){return s=s|0,o[n[s>>2]>>0]|0}function lUe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],cUe(l,f)|0,C=c}function cUe(s,l){s=s|0,l=l|0;var c=0;return c=uUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function uUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,za(f),s=da(s)|0,l=AUe(s,n[l>>2]|0)|0,Va(f),C=c,l|0}function za(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function AUe(s,l){s=s|0,l=l|0;var c=0;return c=Sl(fUe()|0)|0,Qn(0,c|0,s|0,dR(l)|0)|0}function Va(s){s=s|0,q5(n[s>>2]|0,n[s+4>>2]|0)}function fUe(){var s=0;return o[8096]|0||(pUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function pUe(s){s=s|0,bl(s,hUe()|0,1)}function hUe(){return 1948}function gUe(){dUe()}function dUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0;if(Me=C,C=C+16|0,O=Me+4|0,G=Me,Li(65536,10804,n[2702]|0,10812),c=B5()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;Ac(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=v5()|0,l=n[s>>2]|0,l|0)do Au(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while((l|0)!=0);Au(mUe()|0,5167),M=Ym()|0,s=n[M>>2]|0;e:do if(s|0){do yUe(n[s+4>>2]|0),s=n[s>>2]|0;while((s|0)!=0);if(s=n[M>>2]|0,s|0){Q=M;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(EUe(d)|0);)if(n[G>>2]=Q,n[O>>2]=n[G>>2],CUe(M,O)|0,!s)break e;if(wUe(d),Q=n[Q>>2]|0,l=e7(d)|0,m=Hi()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,k=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(N5(d)|0)>>2]|0,l|0)for(c=B,f=k;n[c>>2]=n[(Wm(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Qe=Wm(d)|0,l=IUe(d)|0,c=e7(d)|0,f=BUe(d)|0,fu(Qe|0,l|0,B|0,k|0,c|0,f|0,uR(d)|0),_i(m|0)}while((s|0)!=0)}}while(0);if(s=n[(AR()|0)>>2]|0,s|0)do Qe=s+4|0,M=fR(Qe)|0,d=Ow(M)|0,m=Lw(M)|0,B=(Nw(M)|0)+1|0,k=fD(M)|0,Q=t7(Qe)|0,M=Tr(M)|0,O=cD(Qe)|0,G=vR(Qe)|0,Cl(0,d|0,m|0,B|0,k|0,Q|0,M|0,O|0,G|0,DR(Qe)|0),s=n[s>>2]|0;while((s|0)!=0);s=n[(Ym()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(se=n[(Wm(l)|0)>>2]|0,je=n[(O5(l)|0)>>2]|0,je|0)){c=je;do{l=c+4|0,f=fR(l)|0;r:do if(f|0)switch(Tr(f)|0){case 0:break t;case 4:case 3:case 2:{k=Ow(f)|0,Q=Lw(f)|0,M=(Nw(f)|0)+1|0,O=fD(f)|0,G=Tr(f)|0,Qe=cD(l)|0,Cl(se|0,k|0,Q|0,M|0,O|0,0,G|0,Qe|0,vR(l)|0,DR(l)|0);break r}case 1:{B=Ow(f)|0,k=Lw(f)|0,Q=(Nw(f)|0)+1|0,M=fD(f)|0,O=t7(l)|0,G=Tr(f)|0,Qe=cD(l)|0,Cl(se|0,B|0,k|0,Q|0,M|0,O|0,G|0,Qe|0,vR(l)|0,DR(l)|0);break r}case 5:{M=Ow(f)|0,O=Lw(f)|0,G=(Nw(f)|0)+1|0,Qe=fD(f)|0,Cl(se|0,M|0,O|0,G|0,Qe|0,vUe(f)|0,Tr(f)|0,0,0,0);break r}default:break r}while(0);c=n[c>>2]|0}while((c|0)!=0)}if(s=n[s>>2]|0,!s)break e}Rt()}while(0);Ce(),C=Me}function mUe(){return 11703}function yUe(s){s=s|0,o[s+40>>0]=0}function EUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function CUe(s,l){return s=s|0,l=l|0,l=DUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],gt(s),n[l>>2]|0}function wUe(s){s=s|0,o[s+40>>0]=1}function e7(s){return s=s|0,n[s+20>>2]|0}function IUe(s){return s=s|0,n[s+8>>2]|0}function BUe(s){return s=s|0,n[s+32>>2]|0}function fD(s){return s=s|0,n[s+4>>2]|0}function t7(s){return s=s|0,n[s+4>>2]|0}function vR(s){return s=s|0,n[s+8>>2]|0}function DR(s){return s=s|0,n[s+16>>2]|0}function vUe(s){return s=s|0,n[s+20>>2]|0}function DUe(s){return s=s|0,n[s>>2]|0}function pD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0,lt=0,Ue=0,Ge=0,Nt=0;Nt=C,C=C+16|0,se=Nt;do if(s>>>0<245){if(M=s>>>0<11?16:s+11&-8,s=M>>>3,G=n[2783]|0,c=G>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=G&~(1<>2]=s,n[c>>2]=m),Ge=l<<3,n[f+4>>2]=Ge|3,Ge=f+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1,Ge=d,C=Nt,Ge|0;if(O=n[2785]|0,M>>>0>O>>>0){if(c|0)return l=2<>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=G&~(1<>2]=l,n[s>>2]=c,s=G),m=(f<<3)-M|0,n[d+4>>2]=M|3,f=d+M|0,n[f+4>>2]=m|1,n[f+m>>2]=m,O|0&&(d=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,Ge=B,C=Nt,Ge|0;if(k=n[2784]|0,k){if(c=(k&0-k)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,Q=c>>>2&4,c=c>>>Q,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|Q|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-M|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)Q=s,m=c;else{do B=(n[f+4>>2]&-8)-M|0,Q=B>>>0>>0,c=Q?B:c,s=Q?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while((f|0)!=0);Q=s,m=c}if(B=Q+M|0,Q>>>0>>0){d=n[Q+24>>2]|0,l=n[Q+12>>2]|0;do if((l|0)==(Q|0)){if(s=Q+20|0,l=n[s>>2]|0,!l&&(s=Q+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[Q+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(0);do if(d|0){if(l=n[Q+28>>2]|0,s=11436+(l<<2)|0,(Q|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=k&~(1<>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[Q+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[Q+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(0);return m>>>0<16?(Ge=m+M|0,n[Q+4>>2]=Ge|3,Ge=Q+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1):(n[Q+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,O|0&&(f=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=G|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),Ge=Q+8|0,C=Nt,Ge|0}else G=M}else G=M}else G=M}else if(s>>>0<=4294967231)if(s=s+11|0,M=s&-8,Q=n[2784]|0,Q){f=0-M|0,s=s>>>8,s?M>>>0>16777215?k=31:(G=(s+1048320|0)>>>16&8,Ue=s<>>16&4,Ue=Ue<>>16&2,k=14-(O|G|k)+(Ue<>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,c=n[11436+(k<<2)>>2]|0;e:do if(!c)c=0,s=0,Ue=57;else for(s=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-M|0,d>>>0>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,Ue=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,Ue=57;break}else B=B<<((d^1)&1)}while(0);if((Ue|0)==57){if((c|0)==0&(s|0)==0){if(s=2<>>12&16,G=G>>>B,m=G>>>5&8,G=G>>>m,k=G>>>2&4,G=G>>>k,O=G>>>1&2,G=G>>>O,c=G>>>1&1,s=0,c=n[11436+((m|B|k|O|c)+(G>>>c)<<2)>>2]|0}c?(d=c,Ue=61):(k=s,B=f)}if((Ue|0)==61)for(;;)if(Ue=0,c=(n[d+4>>2]&-8)-M|0,G=c>>>0>>0,c=G?c:f,s=G?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,Ue=61;else{k=s,B=c;break}if((k|0)!=0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return Ge=0,C=Nt,Ge|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else Ge=n[k+8>>2]|0,n[Ge+12>>2]=l,n[l+8>>2]=Ge;while(0);do if(d){if(s=n[k+28>>2]|0,c=11436+(s<<2)|0,(k|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=Q&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){f=Q;break}n[l+24>>2]=d,s=n[k+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[k+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=Q}else f=Q;while(0);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(Ue=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,l=14-(lt|Ue|l)+(Ge<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){Ue=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=96;break}}if((Ue|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((Ue|0)==97){Ue=c+8|0,Ge=n[Ue>>2]|0,n[Ge+12>>2]=m,n[Ue>>2]=m,n[m+8>>2]=Ge,n[m+12>>2]=c,n[m+24>>2]=0;break}}else Ge=B+M|0,n[k+4>>2]=Ge|3,Ge=k+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1;while(0);return Ge=k+8|0,C=Nt,Ge|0}else G=M}else G=M;else G=-1;while(0);if(c=n[2785]|0,c>>>0>=G>>>0)return l=c-G|0,s=n[2788]|0,l>>>0>15?(Ge=s+G|0,n[2788]=Ge,n[2785]=l,n[Ge+4>>2]=l|1,n[Ge+l>>2]=l,n[s+4>>2]=G|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,Ge=s+c+4|0,n[Ge>>2]=n[Ge>>2]|1),Ge=s+8|0,C=Nt,Ge|0;if(B=n[2786]|0,B>>>0>G>>>0)return lt=B-G|0,n[2786]=lt,Ge=n[2789]|0,Ue=Ge+G|0,n[2789]=Ue,n[Ue+4>>2]=lt|1,n[Ge+4>>2]=G|3,Ge=Ge+8|0,C=Nt,Ge|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=se&-16^1431655768,n[se>>2]=s,n[2901]=s,s=4096),k=G+48|0,Q=G+47|0,m=s+Q|0,d=0-s|0,M=m&d,M>>>0<=G>>>0||(s=n[2893]|0,s|0&&(O=n[2891]|0,se=O+M|0,se>>>0<=O>>>0|se>>>0>s>>>0)))return Ge=0,C=Nt,Ge|0;e:do if(n[2894]&4)l=0,Ue=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Qe=f+4|0,(s+(n[Qe>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{Ue=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=Fp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Qe>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,Ue=135;break e}}else f=s,Ue=126;else l=0}else Ue=118;while(0);do if((Ue|0)==118)if(c=Fp(0)|0,(c|0)!=-1&&(l=c,je=n[2902]|0,Me=je+-1|0,l=((Me&l|0)==0?0:(Me+l&0-je)-l|0)+M|0,je=n[2891]|0,Me=l+je|0,l>>>0>G>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Me>>>0<=je>>>0|Me>>>0>Qe>>>0){l=0;break}if(s=Fp(l|0)|0,(s|0)==(c|0)){B=l,m=c,Ue=135;break e}else f=s,Ue=126}else l=0;while(0);do if((Ue|0)==126){if(c=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,Ue=135;break e}if(s=n[2903]|0,s=Q-l+s&0-s,s>>>0>=2147483647){B=l,m=f,Ue=135;break e}if((Fp(s|0)|0)==-1){Fp(c|0)|0,l=0;break}else{B=s+l|0,m=f,Ue=135;break e}}while(0);n[2894]=n[2894]|4,Ue=133}while(0);if((Ue|0)==133&&M>>>0<2147483647&&(lt=Fp(M|0)|0,Qe=Fp(0)|0,et=Qe-lt|0,Xe=et>>>0>(G+40|0)>>>0,!((lt|0)==-1|Xe^1|lt>>>0>>0&((lt|0)!=-1&(Qe|0)!=-1)^1))&&(B=Xe?et:l,m=lt,Ue=135),(Ue|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),Q=n[2789]|0;do if(Q){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){Ue=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((Ue|0)==145&&(n[l+12>>2]&8|0)==0&&Q>>>0>>0&Q>>>0>=s>>>0){n[c>>2]=f+B,Ge=Q+8|0,Ge=(Ge&7|0)==0?0:0-Ge&7,Ue=Q+Ge|0,Ge=(n[2786]|0)+(B-Ge)|0,n[2789]=Ue,n[2786]=Ge,n[Ue+4>>2]=Ge|1,n[Ue+Ge+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){Ue=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((Ue|0)==153&&(n[l+12>>2]&8|0)==0){n[l>>2]=m,O=l+4|0,n[O>>2]=(n[O>>2]|0)+B,O=m+8|0,O=m+((O&7|0)==0?0:0-O&7)|0,l=c+8|0,l=c+((l&7|0)==0?0:0-l&7)|0,M=O+G|0,k=l-O-G|0,n[O+4>>2]=G|3;do if((l|0)!=(Q|0)){if((l|0)==(n[2788]|0)){Ge=(n[2785]|0)+k|0,n[2785]=Ge,n[2788]=M,n[M+4>>2]=Ge|1,n[M+Ge>>2]=Ge;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else Ge=n[l+8>>2]|0,n[Ge+12>>2]=s,n[s+8>>2]=Ge;while(0);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(0);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}Ue=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,l=14-(lt|Ue|l)+(Ge<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(0);if(f=11436+(l<<2)|0,n[M+28>>2]=l,s=M+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<>2]=M,n[M+24>>2]=f,n[M+12>>2]=M,n[M+8>>2]=M;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){Ue=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=193;break}}if((Ue|0)==193){n[f>>2]=M,n[M+24>>2]=c,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((Ue|0)==194){Ue=c+8|0,Ge=n[Ue>>2]|0,n[Ge+12>>2]=M,n[Ue>>2]=M,n[M+8>>2]=Ge,n[M+12>>2]=c,n[M+24>>2]=0;break}}else Ge=(n[2786]|0)+k|0,n[2786]=Ge,n[2789]=M,n[M+4>>2]=Ge|1;while(0);return Ge=O+8|0,C=Nt,Ge|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=Q>>>0&&(Ge=s+(n[l+4>>2]|0)|0,Ge>>>0>Q>>>0));)l=n[l+8>>2]|0;d=Ge+-47|0,s=d+8|0,s=d+((s&7|0)==0?0:0-s&7)|0,d=Q+16|0,s=s>>>0>>0?Q:s,l=s+8|0,c=m+8|0,c=(c&7|0)==0?0:0-c&7,Ue=m+c|0,c=B+-40-c|0,n[2789]=Ue,n[2786]=c,n[Ue+4>>2]=c|1,n[Ue+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do Ue=l,l=l+4|0,n[l>>2]=7;while((Ue+8|0)>>>0>>0);if((s|0)!=(Q|0)){if(m=s-Q|0,n[c>>2]=n[c>>2]&-2,n[Q+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=Q,n[l+12>>2]=Q,n[Q+8>>2]=l,n[Q+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(Ue=(l+1048320|0)>>>16&8,Ge=l<>>16&4,Ge=Ge<>>16&2,c=14-(lt|Ue|c)+(Ge<>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[Q+28>>2]=c,n[Q+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<>2]=Q,n[Q+24>>2]=f,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){Ue=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{Ue=215;break}}if((Ue|0)==215){n[f>>2]=Q,n[Q+24>>2]=c,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}else if((Ue|0)==216){Ue=c+8|0,Ge=n[Ue>>2]|0,n[Ge+12>>2]=Q,n[Ue>>2]=Q,n[Q+8>>2]=Ge,n[Q+12>>2]=c,n[Q+24>>2]=0;break}}}else{Ge=n[2787]|0,(Ge|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do Ge=11172+(l<<1<<2)|0,n[Ge+12>>2]=Ge,n[Ge+8>>2]=Ge,l=l+1|0;while((l|0)!=32);Ge=m+8|0,Ge=(Ge&7|0)==0?0:0-Ge&7,Ue=m+Ge|0,Ge=B+-40-Ge|0,n[2789]=Ue,n[2786]=Ge,n[Ue+4>>2]=Ge|1,n[Ue+Ge+4>>2]=40,n[2790]=n[2905]}while(0);if(l=n[2786]|0,l>>>0>G>>>0)return lt=l-G|0,n[2786]=lt,Ge=n[2789]|0,Ue=Ge+G|0,n[2789]=Ue,n[Ue+4>>2]=lt|1,n[Ge+4>>2]=G|3,Ge=Ge+8|0,C=Nt,Ge|0}return n[(zm()|0)>>2]=12,Ge=0,C=Nt,Ge|0}function hD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(!!s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,Q=c+l|0;do if(s&1)k=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(s=Q+4|0,l=n[s>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=s,k=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=s,n[s+8>>2]=k;while(0);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){k=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(0);if(!(B>>>0>=Q>>>0)&&(s=Q+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(Q|0)==(n[2789]|0)){if(Q=(n[2786]|0)+l|0,n[2786]=Q,n[2789]=k,n[k+4>>2]=Q|1,(k|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((Q|0)==(s|0)){Q=(n[2785]|0)+l|0,n[2785]=Q,n[2788]=B,n[k+4>>2]=Q|1,n[B+Q>>2]=Q;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[Q+8>>2]|0,s=n[Q+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=s,n[s+8>>2]=l;break}else{m=n[Q+24>>2]|0,s=n[Q+12>>2]|0;do if((s|0)==(Q|0)){if(c=Q+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[Q+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(0);if(m|0){if(s=n[Q+28>>2]|0,l=11436+(s<<2)|0,(Q|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=Q+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(0);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=k,n[s+12>>2]=k,n[k+8>>2]=s,n[k+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,Q=s<>>16&4,Q=Q<>>16&2,s=14-(m|B|s)+(Q<>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[k+28>>2]=s,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,c=1<>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((s|0)==73){B=c+8|0,Q=n[B>>2]|0,n[Q+12>>2]=k,n[B>>2]=k,n[k+8>>2]=Q,n[k+12>>2]=c,n[k+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;while(0);if(Q=(n[2791]|0)+-1|0,n[2791]=Q,!Q)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function PUe(){return 11628}function SUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=kUe(n[s+60>>2]|0)|0,s=gD(gc(6,c|0)|0)|0,C=l,s|0}function r7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0;G=C,C=C+48|0,M=G+16|0,m=G,d=G+32|0,k=s+28|0,f=n[k>>2]|0,n[d>>2]=f,Q=s+20|0,f=(n[Q>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=gD(Ni(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,je=n[d+4>>2]|0,se=m>>>0>je>>>0,d=se?d+8|0:d,l=(se<<31>>31)+l|0,je=m-(se?je:0)|0,n[d>>2]=(n[d>>2]|0)+je,se=d+4|0,n[se>>2]=(n[se>>2]|0)-je,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=gD(Ni(146,M|0)|0)|0,(f|0)==(m|0)){O=3;break e}n[s+16>>2]=0,n[k>>2]=0,n[Q>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else O=3;while(0);return(O|0)==3&&(je=n[s+44>>2]|0,n[s+16>>2]=je+(n[s+48>>2]|0),n[k>>2]=je,n[Q>>2]=je),C=G,c|0}function bUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(gD(sa(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function gD(s){return s=s|0,s>>>0>4294963200&&(n[(zm()|0)>>2]=0-s,s=-1),s|0}function zm(){return(xUe()|0)+64|0}function xUe(){return PR()|0}function PR(){return 2084}function kUe(s){return s=s|0,s|0}function QUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,(n[s>>2]&64|0)==0&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,pu(54,f|0)|0)&&(o[s+75>>0]=-1),f=r7(s,l,c)|0,C=d,f|0}function n7(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,c<<24>>24==0||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(c<<24>>24==0||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function FUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(0);return s|0}function i7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0;Qe=C,C=C+224|0,O=Qe+120|0,G=Qe+80|0,je=Qe,Me=Qe+136|0,f=G,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[O>>2]=n[c>>2],(SR(0,l,O,je,G)|0)<0?c=-1:((n[s+76>>2]|0)>-1?se=RUe(s)|0:se=0,c=n[s>>2]|0,M=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=SR(s,l,O,je,G)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Me,B=s+28|0,n[B>>2]=Me,k=s+20|0,n[k>>2]=Me,n[f>>2]=80,Q=s+16|0,n[Q>>2]=Me+80,c=SR(s,l,O,je,G)|0,m&&(ED[n[s+36>>2]&7](s,0,0)|0,c=(n[k>>2]|0)==0?-1:c,n[d>>2]=m,n[f>>2]=0,n[Q>>2]=0,n[B>>2]=0,n[k>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|M,se|0&&TUe(s),c=(f&32|0)==0?c:-1),C=Qe,c|0}function SR(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0,lt=0,Ue=0,Ge=0,Nt=0,Mr=0,ar=0,Xt=0,Pr=0,Lr=0,sr=0;sr=C,C=C+64|0,ar=sr+16|0,Xt=sr,Nt=sr+24|0,Pr=sr+8|0,Lr=sr+20|0,n[ar>>2]=l,lt=(s|0)!=0,Ue=Nt+40|0,Ge=Ue,Nt=Nt+39|0,Mr=Pr+4|0,B=0,m=0,O=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(zm()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(0);if(B=o[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}et=k+1|0,n[ar>>2]=et,B=o[et>>0]|0,k=et}t:do if((Xe|0)==9)for(;;){if(Xe=0,(o[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[ar>>2]=k,(o[k>>0]|0)==37)Xe=9;else break}while(0);if(B=B-l|0,lt&&ss(s,l,B),B|0){l=k;continue}Q=k+1|0,B=(o[Q>>0]|0)+-48|0,B>>>0<10?(et=(o[k+2>>0]|0)==36,Qe=et?B:-1,O=et?1:O,Q=et?k+3|0:Q):Qe=-1,n[ar>>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,G=B;;){if(B=1<>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;G=B}else M=0;while(0);if(B<<24>>24==42){if(k=Q+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10&&(o[Q+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[k>>0]|0)+-48<<3)>>2]|0,O=1,Q=Q+3|0;else{if(O|0){m=-1;break}lt?(O=(n[c>>2]|0)+(4-1)&~(4-1),B=n[O>>2]|0,n[c>>2]=O+4,O=0,Q=k):(B=0,O=0,Q=k)}n[ar>>2]=Q,et=(B|0)<0,B=et?0-B|0:B,M=et?M|8192:M}else{if(B=s7(ar)|0,(B|0)<0){m=-1;break}Q=n[ar>>2]|0}do if((o[Q>>0]|0)==46){if((o[Q+1>>0]|0)!=42){n[ar>>2]=Q+1,k=s7(ar)|0,Q=n[ar>>2]|0;break}if(G=Q+2|0,k=(o[G>>0]|0)+-48|0,k>>>0<10&&(o[Q+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[f+((o[G>>0]|0)+-48<<3)>>2]|0,Q=Q+4|0,n[ar>>2]=Q;break}if(O|0){m=-1;break e}lt?(et=(n[c>>2]|0)+(4-1)&~(4-1),k=n[et>>2]|0,n[c>>2]=et+4):k=0,n[ar>>2]=G,Q=G}else k=-1;while(0);for(Me=0;;){if(((o[Q>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(et=Q+1|0,n[ar>>2]=et,G=o[(o[Q>>0]|0)+-65+(5178+(Me*58|0))>>0]|0,se=G&255,(se+-1|0)>>>0<8)Me=se,Q=et;else break}if(!(G<<24>>24)){m=-1;break}je=(Qe|0)>-1;do if(G<<24>>24==19)if(je){m=-1;break e}else Xe=49;else{if(je){n[d+(Qe<<2)>>2]=se,je=f+(Qe<<3)|0,Qe=n[je+4>>2]|0,Xe=Xt,n[Xe>>2]=n[je>>2],n[Xe+4>>2]=Qe,Xe=49;break}if(!lt){m=0;break e}o7(Xt,se,c)}while(0);if((Xe|0)==49&&(Xe=0,!lt)){B=0,l=et;continue}Q=o[Q>>0]|0,Q=(Me|0)!=0&(Q&15|0)==3?Q&-33:Q,je=M&-65537,Qe=(M&8192|0)==0?M:je;t:do switch(Q|0){case 110:switch((Me&255)<<24>>24){case 0:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 1:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 2:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}case 3:{a[n[Xt>>2]>>1]=m,B=0,l=et;continue e}case 4:{o[n[Xt>>2]>>0]=m,B=0,l=et;continue e}case 6:{n[n[Xt>>2]>>2]=m,B=0,l=et;continue e}case 7:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=et;continue e}default:{B=0,l=et;continue e}}case 112:{Q=120,k=k>>>0>8?k:8,l=Qe|8,Xe=61;break}case 88:case 120:{l=Qe,Xe=61;break}case 111:{Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,se=NUe(l,Q,Ue)|0,je=Ge-se|0,M=0,G=5642,k=(Qe&8|0)==0|(k|0)>(je|0)?k:je+1|0,je=Qe,Xe=67;break}case 105:case 100:if(Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,(Q|0)<0){l=dD(0,0,l|0,Q|0)|0,Q=Pe,M=Xt,n[M>>2]=l,n[M+4>>2]=Q,M=1,G=5642,Xe=66;break t}else{M=(Qe&2049|0)!=0&1,G=(Qe&2048|0)==0?(Qe&1|0)==0?5642:5644:5643,Xe=66;break t}case 117:{Q=Xt,M=0,G=5642,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,Xe=66;break}case 99:{o[Nt>>0]=n[Xt>>2],l=Nt,M=0,G=5642,se=Ue,Q=1,k=je;break}case 109:{Q=OUe(n[(zm()|0)>>2]|0)|0,Xe=71;break}case 115:{Q=n[Xt>>2]|0,Q=Q|0?Q:5652,Xe=71;break}case 67:{n[Pr>>2]=n[Xt>>2],n[Mr>>2]=0,n[Xt>>2]=Pr,se=-1,Q=Pr,Xe=75;break}case 83:{l=n[Xt>>2]|0,k?(se=k,Q=l,Xe=75):(Bs(s,32,B,0,Qe),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=UUe(s,+E[Xt>>3],B,k,Qe,Q)|0,l=et;continue e}default:M=0,G=5642,se=Ue,Q=k,k=Qe}while(0);t:do if((Xe|0)==61)Qe=Xt,Me=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,se=LUe(Me,Qe,Ue,Q&32)|0,G=(l&8|0)==0|(Me|0)==0&(Qe|0)==0,M=G?0:2,G=G?5642:5642+(Q>>4)|0,je=l,l=Me,Q=Qe,Xe=67;else if((Xe|0)==66)se=Vm(l,Q,Ue)|0,je=Qe,Xe=67;else if((Xe|0)==71)Xe=0,Qe=MUe(Q,0,k)|0,Me=(Qe|0)==0,l=Q,M=0,G=5642,se=Me?Q+k|0:Qe,Q=Me?k:Qe-Q|0,k=je;else if((Xe|0)==75){for(Xe=0,G=Q,l=0,k=0;M=n[G>>2]|0,!(!M||(k=a7(Lr,M)|0,(k|0)<0|k>>>0>(se-l|0)>>>0));)if(l=k+l|0,se>>>0>l>>>0)G=G+4|0;else break;if((k|0)<0){m=-1;break e}if(Bs(s,32,B,l,Qe),!l)l=0,Xe=84;else for(M=0;;){if(k=n[Q>>2]|0,!k){Xe=84;break t}if(k=a7(Lr,k)|0,M=k+M|0,(M|0)>(l|0)){Xe=84;break t}if(ss(s,Lr,k),M>>>0>=l>>>0){Xe=84;break}else Q=Q+4|0}}while(0);if((Xe|0)==67)Xe=0,Q=(l|0)!=0|(Q|0)!=0,Qe=(k|0)!=0|Q,Q=((Q^1)&1)+(Ge-se)|0,l=Qe?se:Ue,se=Ue,Q=Qe?(k|0)>(Q|0)?k:Q:k,k=(k|0)>-1?je&-65537:je;else if((Xe|0)==84){Xe=0,Bs(s,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=et;continue}Me=se-l|0,je=(Q|0)<(Me|0)?Me:Q,Qe=je+M|0,B=(B|0)<(Qe|0)?Qe:B,Bs(s,32,B,Qe,k),ss(s,G,M),Bs(s,48,B,Qe,k^65536),Bs(s,48,je,Me,0),ss(s,l,Me),Bs(s,32,B,Qe,k^8192),l=et}e:do if((Xe|0)==87&&!s)if(!O)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(o7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(0);return C=sr,m|0}function RUe(s){return s=s|0,0}function TUe(s){s=s|0}function ss(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||zUe(l,c,s)|0}function s7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function o7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+(4-1)&~(4-1),l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+(8-1)&~(8-1),l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+(4-1)&~(4-1),f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+(8-1)&~(8-1),m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(0);while(0)}function LUe(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=mD(s|0,l|0,4)|0,l=Pe;while(!((s|0)==0&(l|0)==0));return c|0}function NUe(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=mD(s|0,l|0,3)|0,l=Pe;while(!((s|0)==0&(l|0)==0));return c|0}function Vm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=QR(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=kR(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=Pe;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function OUe(s){return s=s|0,jUe(s,n[(GUe()|0)+188>>2]|0)|0}function MUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(0);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=qe(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(0);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(0);return(c|0?s:0)|0}function Bs(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,Xm(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do ss(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}ss(s,m,d)}C=B}function a7(s,l){return s=s|0,l=l|0,s?s=HUe(s,l,0)|0:s=0,s|0}function UUe(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0,Qe=0,et=0,Xe=0,lt=0,Ue=0,Ge=0,Nt=0,Mr=0,ar=0,Xt=0,Pr=0,Lr=0,sr=0,xn=0;xn=C,C=C+560|0,Q=xn+8|0,et=xn,sr=xn+524|0,Lr=sr,M=xn+512|0,n[et>>2]=0,Pr=M+12|0,l7(l)|0,(Pe|0)<0?(l=-l,ar=1,Mr=5659):(ar=(d&2049|0)!=0&1,Mr=(d&2048|0)==0?(d&1|0)==0?5660:5665:5662),l7(l)|0,Xt=Pe&2146435072;do if(Xt>>>0<2146435072|(Xt|0)==2146435072&0<0){if(je=+_Ue(l,et)*2,B=je!=0,B&&(n[et>>2]=(n[et>>2]|0)+-1),lt=m|32,(lt|0)==97){Me=m&32,se=(Me|0)==0?Mr:Mr+9|0,G=ar|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=je;else{l=8;do B=B+-1|0,l=l*16;while((B|0)!=0);if((o[se>>0]|0)==45){l=-(l+(-je-l));break}else{l=je+l-l;break}}while(0);k=n[et>>2]|0,B=(k|0)<0?0-k|0:k,B=Vm(B,((B|0)<0)<<31>>31,Pr)|0,(B|0)==(Pr|0)&&(B=M+11|0,o[B>>0]=48),o[B+-1>>0]=(k>>31&2)+43,O=B+-2|0,o[O>>0]=m+15,M=(f|0)<1,Q=(d&8|0)==0,B=sr;do Xt=~~l,k=B+1|0,o[B>>0]=u[5694+Xt>>0]|Me,l=(l-+(Xt|0))*16,(k-Lr|0)==1&&!(Q&(M&l==0))?(o[k>>0]=46,B=B+2|0):B=k;while(l!=0);Xt=B-Lr|0,Lr=Pr-O|0,Pr=(f|0)!=0&(Xt+-2|0)<(f|0)?f+2|0:Xt,B=Lr+G+Pr|0,Bs(s,32,c,B,d),ss(s,se,G),Bs(s,48,c,B,d^65536),ss(s,sr,Xt),Bs(s,48,Pr-Xt|0,0,0),ss(s,O,Lr),Bs(s,32,c,B,d^8192);break}k=(f|0)<0?6:f,B?(B=(n[et>>2]|0)+-28|0,n[et>>2]=B,l=je*268435456):(l=je,B=n[et>>2]|0),Xt=(B|0)<0?Q:Q+288|0,Q=Xt;do Ge=~~l>>>0,n[Q>>2]=Ge,Q=Q+4|0,l=(l-+(Ge>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=Xt,G=Q;;){if(O=(B|0)<29?B:29,B=G+-4|0,B>>>0>=M>>>0){Q=0;do Ue=h7(n[B>>2]|0,0,O|0)|0,Ue=xR(Ue|0,Pe|0,Q|0,0)|0,Ge=Pe,Xe=QR(Ue|0,Ge|0,1e9,0)|0,n[B>>2]=Xe,Q=kR(Ue|0,Ge|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);Q&&(M=M+-4|0,n[M>>2]=Q)}for(Q=G;!(Q>>>0<=M>>>0);)if(B=Q+-4|0,!(n[B>>2]|0))Q=B;else break;if(B=(n[et>>2]|0)-O|0,n[et>>2]=B,(B|0)>0)G=Q;else break}else M=Xt;if((B|0)<0){f=((k+25|0)/9|0)+1|0,Qe=(lt|0)==102;do{if(Me=0-B|0,Me=(Me|0)<9?Me:9,M>>>0>>0){O=(1<>>Me,se=0,B=M;do Ge=n[B>>2]|0,n[B>>2]=(Ge>>>Me)+se,se=qe(Ge&O,G)|0,B=B+4|0;while(B>>>0>>0);B=(n[M>>2]|0)==0?M+4|0:M,se?(n[Q>>2]=se,M=B,B=Q+4|0):(M=B,B=Q)}else M=(n[M>>2]|0)==0?M+4|0:M,B=Q;Q=Qe?Xt:M,Q=(B-Q>>2|0)>(f|0)?Q+(f<<2)|0:B,B=(n[et>>2]|0)+Me|0,n[et>>2]=B}while((B|0)<0);B=M,f=Q}else B=M,f=Q;if(Ge=Xt,B>>>0>>0){if(Q=(Ge-B>>2)*9|0,O=n[B>>2]|0,O>>>0>=10){M=10;do M=M*10|0,Q=Q+1|0;while(O>>>0>=M>>>0)}}else Q=0;if(Qe=(lt|0)==103,Xe=(k|0)!=0,M=k-((lt|0)!=102?Q:0)+((Xe&Qe)<<31>>31)|0,(M|0)<(((f-Ge>>2)*9|0)+-9|0)){if(M=M+9216|0,Me=Xt+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){O=10;do O=O*10|0,M=M+1|0;while((M|0)!=9)}else O=10;if(G=n[Me>>2]|0,se=(G>>>0)%(O>>>0)|0,M=(Me+4|0)==(f|0),M&(se|0)==0)M=Me;else if(je=(((G>>>0)/(O>>>0)|0)&1|0)==0?9007199254740992:9007199254740994,Ue=(O|0)/2|0,l=se>>>0>>0?.5:M&(se|0)==(Ue|0)?1:1.5,ar&&(Ue=(o[Mr>>0]|0)==45,l=Ue?-l:l,je=Ue?-je:je),M=G-se|0,n[Me>>2]=M,je+l!=je){if(Ue=M+O|0,n[Me>>2]=Ue,Ue>>>0>999999999)for(Q=Me;M=Q+-4|0,n[Q>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),Ue=(n[M>>2]|0)+1|0,n[M>>2]=Ue,Ue>>>0>999999999;)Q=M;else M=Me;if(Q=(Ge-B>>2)*9|0,G=n[B>>2]|0,G>>>0>=10){O=10;do O=O*10|0,Q=Q+1|0;while(G>>>0>=O>>>0)}}else M=Me;M=M+4|0,M=f>>>0>M>>>0?M:f,Ue=B}else M=f,Ue=B;for(lt=M;;){if(lt>>>0<=Ue>>>0){et=0;break}if(B=lt+-4|0,!(n[B>>2]|0))lt=B;else{et=1;break}}f=0-Q|0;do if(Qe)if(B=((Xe^1)&1)+k|0,(B|0)>(Q|0)&(Q|0)>-5?(O=m+-1|0,k=B+-1-Q|0):(O=m+-2|0,k=B+-1|0),B=d&8,B)Me=B;else{if(et&&(Nt=n[lt+-4>>2]|0,(Nt|0)!=0))if((Nt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Nt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((lt-Ge>>2)*9|0)+-9|0,(O|32|0)==102){Me=B-M|0,Me=(Me|0)>0?Me:0,k=(k|0)<(Me|0)?k:Me,Me=0;break}else{Me=B+Q-M|0,Me=(Me|0)>0?Me:0,k=(k|0)<(Me|0)?k:Me,Me=0;break}}else O=m,Me=d&8;while(0);if(Qe=k|Me,G=(Qe|0)!=0&1,se=(O|32|0)==102,se)Xe=0,B=(Q|0)>0?Q:0;else{if(B=(Q|0)<0?f:Q,B=Vm(B,((B|0)<0)<<31>>31,Pr)|0,M=Pr,(M-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((M-B|0)<2);o[B+-1>>0]=(Q>>31&2)+43,B=B+-2|0,o[B>>0]=O,Xe=B,B=M-B|0}if(B=ar+1+k+G+B|0,Bs(s,32,c,B,d),ss(s,Mr,ar),Bs(s,48,c,B,d^65536),se){O=Ue>>>0>Xt>>>0?Xt:Ue,Me=sr+9|0,G=Me,se=sr+8|0,M=O;do{if(Q=Vm(n[M>>2]|0,0,Me)|0,(M|0)==(O|0))(Q|0)==(Me|0)&&(o[se>>0]=48,Q=se);else if(Q>>>0>sr>>>0){Xm(sr|0,48,Q-Lr|0)|0;do Q=Q+-1|0;while(Q>>>0>sr>>>0)}ss(s,Q,G-Q|0),M=M+4|0}while(M>>>0<=Xt>>>0);if(Qe|0&&ss(s,5710,1),M>>>0>>0&(k|0)>0)for(;;){if(Q=Vm(n[M>>2]|0,0,Me)|0,Q>>>0>sr>>>0){Xm(sr|0,48,Q-Lr|0)|0;do Q=Q+-1|0;while(Q>>>0>sr>>>0)}if(ss(s,Q,(k|0)<9?k:9),M=M+4|0,Q=k+-9|0,M>>>0>>0&(k|0)>9)k=Q;else{k=Q;break}}Bs(s,48,k+9|0,9,0)}else{if(Qe=et?lt:Ue+4|0,(k|0)>-1){et=sr+9|0,Me=(Me|0)==0,f=et,G=0-Lr|0,se=sr+8|0,O=Ue;do{Q=Vm(n[O>>2]|0,0,et)|0,(Q|0)==(et|0)&&(o[se>>0]=48,Q=se);do if((O|0)==(Ue|0)){if(M=Q+1|0,ss(s,Q,1),Me&(k|0)<1){Q=M;break}ss(s,5710,1),Q=M}else{if(Q>>>0<=sr>>>0)break;Xm(sr|0,48,Q+G|0)|0;do Q=Q+-1|0;while(Q>>>0>sr>>>0)}while(0);Lr=f-Q|0,ss(s,Q,(k|0)>(Lr|0)?Lr:k),k=k-Lr|0,O=O+4|0}while(O>>>0>>0&(k|0)>-1)}Bs(s,48,k+18|0,18,0),ss(s,Xe,Pr-Xe|0)}Bs(s,32,c,B,d^8192)}else sr=(m&32|0)!=0,B=ar+3|0,Bs(s,32,c,B,d&-65537),ss(s,Mr,ar),ss(s,l!=l|!1?sr?5686:5690:sr?5678:5682,3),Bs(s,32,c,B,d^8192);while(0);return C=xn,((B|0)<(c|0)?c:B)|0}function l7(s){s=+s;var l=0;return E[v>>3]=s,l=n[v>>2]|0,Pe=n[v+4>>2]|0,l|0}function _Ue(s,l){return s=+s,l=l|0,+ +c7(s,l)}function c7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[v>>3]=s,c=n[v>>2]|0,f=n[v+4>>2]|0,d=mD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+c7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[v>>2]=c,n[v+4>>2]=f&-2146435073|1071644672,s=+E[v>>3]}return+s}function HUe(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(qUe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(zm()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(zm()|0)>>2]=84,s=-1;break}}else s=1;while(0);return s|0}function qUe(){return PR()|0}function GUe(){return PR()|0}function jUe(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while((o[s>>0]|0)!=0);if(f=f+-1|0,f)s=5;else break}return YUe(c,n[l+20>>2]|0)|0}function YUe(s,l){return s=s|0,l=l|0,WUe(s,l)|0}function WUe(s,l){return s=s|0,l=l|0,l?l=KUe(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function KUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0;se=(n[s>>2]|0)+1794895138|0,m=Tg(n[s+8>>2]|0,se)|0,f=Tg(n[s+12>>2]|0,se)|0,d=Tg(n[s+16>>2]|0,se)|0;e:do if(m>>>0>>2>>>0&&(G=l-(m<<2)|0,f>>>0>>0&d>>>0>>0)&&((d|f)&3|0)==0){for(G=f>>>2,O=d>>>2,M=0;;){if(k=m>>>1,Q=M+k|0,B=Q<<1,d=B+G|0,f=Tg(n[s+(d<<2)>>2]|0,se)|0,d=Tg(n[s+(d+1<<2)>>2]|0,se)|0,!(d>>>0>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=n7(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else M=f?M:Q,m=f?k:m-k|0}f=B+O|0,d=Tg(n[s+(f<<2)>>2]|0,se)|0,f=Tg(n[s+(f+1<<2)>>2]|0,se)|0,f>>>0>>0&d>>>0<(l-f|0)>>>0?f=(o[s+(f+d)>>0]|0)==0?s+f|0:0:f=0}else f=0;while(0);return f|0}function Tg(s,l){s=s|0,l=l|0;var c=0;return c=m7(s|0)|0,((l|0)==0?s:c)|0}function zUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=c+16|0,d=n[f>>2]|0,d?m=5:VUe(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(k=c+20|0,B=n[k>>2]|0,f=B,(d-B|0)>>>0>>0){f=ED[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=ED[n[c+36>>2]&7](c,s,B)|0,f>>>0>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[k>>2]|0}else m=0,d=s;while(0);Dr(f|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,f=m+l|0}while(0);return f|0}function VUe(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function _n(s,l){s=y(s),l=y(l);var c=0,f=0;c=u7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=u7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s>2]=s,n[v>>2]|0|0}function Lg(s,l){s=y(s),l=y(l);var c=0,f=0;c=A7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=A7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s>2]=s,n[v>>2]|0|0}function bR(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,M=0;m=(h[v>>2]=s,n[v>>2]|0),k=(h[v>>2]=l,n[v>>2]|0),c=m>>>23&255,B=k>>>23&255,Q=m&-2147483648,d=k<<1;e:do if((d|0)!=0&&!((c|0)==255|((JUe(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=f-k|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-k|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(0);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[v>>2]=c|Q,y(h[v>>2]))}else M=3;while(0);return(M|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function JUe(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function XUe(s,l){return s=s|0,l=l|0,i7(n[582]|0,s,l)|0}function Jr(s){s=s|0,Rt()}function Jm(s){s=s|0}function ZUe(s,l){return s=s|0,l=l|0,0}function $Ue(s){return s=s|0,(f7(s+4|0)|0)==-1?(tf[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function f7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function Qp(s){s=s|0,$Ue(s)|0&&e3e(s)}function e3e(s){s=s|0;var l=0;l=s+8|0,(n[l>>2]|0)!=0&&(f7(l)|0)!=-1||tf[n[(n[s>>2]|0)+16>>2]&127](s)}function Kt(s){s=s|0;var l=0;for(l=(s|0)==0?1:s;s=pD(l)|0,!(s|0);){if(s=r3e()|0,!s){s=0;break}S7[s&0]()}return s|0}function p7(s){return s=s|0,Kt(s)|0}function gt(s){s=s|0,hD(s)}function t3e(s){s=s|0,(o[s+11>>0]|0)<0&>(n[s>>2]|0)}function r3e(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function n3e(){}function dD(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,Pe=f,s-c>>>0|0|0}function xR(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,Pe=l+f+(c>>>0>>0|0)>>>0,c|0|0}function Xm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function h7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(Pe=l<>>32-c,s<>>c,s>>>c|(l&(1<>>c-32|0)}function Dr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return fc(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function g7(s){s=s|0;var l=0;return l=o[N+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[N+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[N+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[N+(s>>>24)>>0]|0)+24|0))}function d7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,M=0,O=0,G=0,se=0,je=0,Me=0;if(O=s,Q=l,M=Q,B=c,se=f,k=se,!M)return m=(d|0)!=0,k?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,se=0,d=0,Pe=se,d|0):(se=0,d=0,Pe=se,d|0):(m&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),se=0,d=(O>>>0)/(B>>>0)>>>0,Pe=se,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(S(k|0)|0)-(S(M|0)|0)|0,m>>>0<=31){G=m+1|0,k=31-m|0,l=m-31>>31,B=G,s=O>>>(G>>>0)&l|M<>>(G>>>0)&l,m=0,k=O<>2]=s|0,n[d+4>>2]=Q|l&0,se=0,d=0,Pe=se,d|0):(se=0,d=0,Pe=se,d|0)}if(m=B-1|0,m&B|0){k=(S(B|0)|0)+33-(S(M|0)|0)|0,Me=64-k|0,G=32-k|0,Q=G>>31,je=k-32|0,l=je>>31,B=k,s=G-1>>31&M>>>(je>>>0)|(M<>>(k>>>0))&l,l=l&M>>>(k>>>0),m=O<>>(je>>>0))&Q|O<>31;break}return d|0&&(n[d>>2]=m&O,n[d+4>>2]=0),(B|0)==1?(je=Q|l&0,Me=s|0|0,Pe=je,Me|0):(Me=g7(B|0)|0,je=M>>>(Me>>>0)|0,Me=M<<32-Me|O>>>(Me>>>0)|0,Pe=je,Me|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),je=0,Me=(M>>>0)/(B>>>0)>>>0,Pe=je,Me|0;if(!O)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(k>>>0)),je=0,Me=(M>>>0)/(k>>>0)>>>0,Pe=je,Me|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&M|l&0),je=0,Me=M>>>((g7(k|0)|0)>>>0),Pe=je,Me|0;if(m=(S(k|0)|0)-(S(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,s=M<>>(l>>>0),l=M>>>(l>>>0),m=0,k=O<>2]=s|0,n[d+4>>2]=Q|l&0,je=0,Me=0,Pe=je,Me|0):(je=0,Me=0,Pe=je,Me|0)}while(0);if(!B)M=k,Q=0,k=0;else{G=c|0|0,O=se|f&0,M=xR(G|0,O|0,-1,-1)|0,c=Pe,Q=k,k=0;do f=Q,Q=m>>>31|Q<<1,m=k|m<<1,f=s<<1|f>>>31|0,se=s>>>31|l<<1|0,dD(M|0,c|0,f|0,se|0)|0,Me=Pe,je=Me>>31|((Me|0)<0?-1:0)<<1,k=je&1,s=dD(f|0,se|0,je&G|0,(((Me|0)<0?-1:0)>>31|((Me|0)<0?-1:0)<<1)&O|0)|0,l=Pe,B=B-1|0;while((B|0)!=0);M=Q,Q=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),je=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|Q,Me=(m<<1|0>>>31)&-2|k,Pe=je,Me|0}function kR(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,d7(s,l,c,f,0)|0}function Fp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[I>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(ie()|0,DA(12),-1):(n[I>>2]=s,(s|0)>(Z()|0)&&(X()|0)==0?(n[I>>2]=l,DA(12),-1):l|0)}function Mw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else Dr(s,l,c)|0;return s|0}function QR(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,d7(s,l,c,f,d)|0,C=m,Pe=n[d+4>>2]|0,n[d>>2]|0|0}function m7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function i3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,y7[s&1](l|0,c|0,f|0,d|0,m|0)}function s3e(s,l,c){s=s|0,l=l|0,c=y(c),E7[s&1](l|0,y(c))}function o3e(s,l,c){s=s|0,l=l|0,c=+c,C7[s&31](l|0,+c)}function a3e(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(w7[s&0](l|0,y(c),y(f)))}function l3e(s,l){s=s|0,l=l|0,tf[s&127](l|0)}function c3e(s,l,c){s=s|0,l=l|0,c=c|0,rf[s&31](l|0,c|0)}function u3e(s,l){return s=s|0,l=l|0,Og[s&31](l|0)|0}function A3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,I7[s&1](l|0,+c,+f,d|0)}function f3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,W3e[s&1](l|0,+c,+f)}function p3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,ED[s&7](l|0,c|0,f|0)|0}function h3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+K3e[s&1](l|0,c|0,f|0)}function g3e(s,l){return s=s|0,l=l|0,+B7[s&15](l|0)}function d3e(s,l,c){return s=s|0,l=l|0,c=+c,z3e[s&1](l|0,+c)|0}function m3e(s,l,c){return s=s|0,l=l|0,c=c|0,RR[s&15](l|0,c|0)|0}function y3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,V3e[s&1](l|0,c|0,+f,+d,m|0)}function E3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,J3e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function C3e(s,l,c){return s=s|0,l=l|0,c=c|0,+v7[s&7](l|0,c|0)}function w3e(s){return s=s|0,CD[s&7]()|0}function I3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,D7[s&1](l|0,c|0,f|0,d|0,m|0)|0}function B3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,X3e[s&1](l|0,c|0,f|0,+d)}function v3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,P7[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function D3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,Hw[s&15](l|0,c|0,f|0)}function P3e(s){s=s|0,S7[s&0]()}function S3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,b7[s&15](l|0,c|0,+f)}function b3e(s,l,c){return s=s|0,l=+l,c=+c,Z3e[s&1](+l,+c)|0}function x3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,TR[s&15](l|0,c|0,f|0,d|0)}function k3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(0)}function Q3e(s,l){s=s|0,l=y(l),F(1)}function ma(s,l){s=s|0,l=+l,F(2)}function F3e(s,l,c){return s=s|0,l=y(l),c=y(c),F(3),Ze}function Er(s){s=s|0,F(4)}function Uw(s,l){s=s|0,l=l|0,F(5)}function Ja(s){return s=s|0,F(6),0}function R3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,F(7)}function T3e(s,l,c){s=s|0,l=+l,c=+c,F(8)}function L3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(9),0}function N3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(10),0}function Ng(s){return s=s|0,F(11),0}function O3e(s,l){return s=s|0,l=+l,F(12),0}function _w(s,l){return s=s|0,l=l|0,F(13),0}function M3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,F(14)}function U3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,F(15)}function FR(s,l){return s=s|0,l=l|0,F(16),0}function _3e(){return F(17),0}function H3e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(18),0}function q3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,F(19)}function G3e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,F(20)}function yD(s,l,c){s=s|0,l=l|0,c=c|0,F(21)}function j3e(){F(22)}function Zm(s,l,c){s=s|0,l=l|0,c=+c,F(23)}function Y3e(s,l){return s=+s,l=+l,F(24),0}function $m(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,F(25)}var y7=[k3e,HNe],E7=[Q3e,fo],C7=[ma,xw,kw,EF,CF,Pl,Qw,wF,qm,xu,Rw,IF,$v,KA,eD,Gm,tD,rD,jm,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma,ma],w7=[F3e],tf=[Er,Jm,wDe,IDe,BDe,Zbe,$be,exe,dLe,mLe,yLe,bNe,xNe,kNe,J4e,X4e,Z4e,hs,zv,Hm,WA,Fw,mve,yve,ADe,QDe,GDe,aPe,BPe,_Pe,nSe,ySe,RSe,VSe,Abe,Sbe,Gbe,mxe,Rxe,Vxe,Ake,Ske,Gke,lQe,BQe,OQe,$Qe,bc,kFe,WFe,ARe,xRe,jRe,ATe,wTe,vTe,HTe,jTe,aLe,CLe,BLe,_Le,iNe,i9,UOe,dMe,QMe,WMe,h4e,x4e,_4e,G4e,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er],rf=[Uw,fF,pF,bw,bu,hF,gF,vp,dF,mF,yF,Zv,zA,ze,ft,Wt,vr,Sn,Fr,vF,ive,Sve,fQe,PQe,RRe,qOe,fNe,q5,Uw,Uw,Uw,Uw],Og=[Ja,SUe,AF,D,Ae,De,vt,wt,xt,_r,di,po,tve,rve,Eve,rFe,zRe,GLe,WOe,Ka,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja,Ja],I7=[R3e,Cve],W3e=[T3e,uLe],ED=[L3e,r7,bUe,QUe,jPe,wxe,TFe,JMe],K3e=[N3e,gbe],B7=[Ng,Yo,rt,bn,wve,Ive,Bve,vve,Dve,Pve,Ng,Ng,Ng,Ng,Ng,Ng],z3e=[O3e,yTe],RR=[_w,ZUe,nve,gDe,APe,oSe,wSe,Kbe,Oxe,HQe,Wv,LMe,_w,_w,_w,_w],V3e=[M3e,KDe],J3e=[U3e,y4e],v7=[FR,ai,bve,xve,kve,Qbe,FR,FR],CD=[_3e,Qve,Pw,ga,bTe,zTe,SLe,K4e],D7=[H3e,Cw],X3e=[q3e,gke],P7=[G3e,sve],Hw=[yD,T,is,tn,ho,SPe,NSe,Qke,Kke,_m,uOe,CMe,R4e,yD,yD,yD],S7=[j3e],b7=[Zm,Vv,Jv,Xv,YA,nD,BF,P,$xe,JFe,hTe,Zm,Zm,Zm,Zm,Zm],Z3e=[Y3e,hLe],TR=[$m,$Se,uFe,gRe,nTe,TTe,eLe,TLe,cNe,ZOe,iUe,$m,$m,$m,$m,$m];return{_llvm_bswap_i32:m7,dynCall_idd:b3e,dynCall_i:w3e,_i64Subtract:dD,___udivdi3:kR,dynCall_vif:s3e,setThrew:gu,dynCall_viii:D3e,_bitshift64Lshr:mD,_bitshift64Shl:h7,dynCall_vi:l3e,dynCall_viiddi:y3e,dynCall_diii:h3e,dynCall_iii:m3e,_memset:Xm,_sbrk:Fp,_memcpy:Dr,__GLOBAL__sub_I_Yoga_cpp:Um,dynCall_vii:c3e,___uremdi3:QR,dynCall_vid:o3e,stackAlloc:lo,_nbind_init:gUe,getTempRet0:Ha,dynCall_di:g3e,dynCall_iid:d3e,setTempRet0:xA,_i64Add:xR,dynCall_fiff:a3e,dynCall_iiii:p3e,_emscripten_get_global_libc:PUe,dynCall_viid:S3e,dynCall_viiid:B3e,dynCall_viififi:v3e,dynCall_ii:u3e,__GLOBAL__sub_I_Binding_cc:QOe,dynCall_viiii:x3e,dynCall_iiiiii:I3e,stackSave:dc,dynCall_viiiii:i3e,__GLOBAL__sub_I_nbind_cc:Fve,dynCall_vidd:f3e,_free:hD,runPostSets:n3e,dynCall_viiiiii:E3e,establishStackSpace:qi,_memmove:Mw,stackRestore:hu,_malloc:pD,__GLOBAL__sub_I_common_cc:XLe,dynCall_viddi:A3e,dynCall_dii:C3e,dynCall_v:P3e}}(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;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;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<4-1;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];o();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` +If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var lm=_((IKt,NEe)=>{"use strict";var Yyt=TEe(),Wyt=LEe(),x6=!1,k6=null;Wyt({},function(t,e){if(!x6){if(x6=!0,t)throw t;k6=e}});if(!x6)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");NEe.exports=Yyt(k6.bind,k6.lib)});var F6=_((BKt,Q6)=>{"use strict";var OEe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);Q6.exports=OEe;Q6.exports.default=OEe});var UEe=_((vKt,MEe)=>{"use strict";MEe.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}});var Kk=_((DKt,R6)=>{"use strict";var Kyt=NP(),zyt=F6(),Vyt=UEe(),_Ee=t=>{if(typeof t!="string"||t.length===0||(t=Kyt(t),t.length===0))return 0;t=t.replace(Vyt()," ");let e=0;for(let r=0;r=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=zyt(o)?2:1)}return e};R6.exports=_Ee;R6.exports.default=_Ee});var L6=_((PKt,T6)=>{"use strict";var Jyt=Kk(),HEe=t=>{let e=0;for(let r of t.split(` +`))e=Math.max(e,Jyt(r));return e};T6.exports=HEe;T6.exports.default=HEe});var qEe=_(cB=>{"use strict";var Xyt=cB&&cB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cB,"__esModule",{value:!0});var Zyt=Xyt(L6()),N6={};cB.default=t=>{if(t.length===0)return{width:0,height:0};if(N6[t])return N6[t];let e=Zyt.default(t),r=t.split(` +`).length;return N6[t]={width:e,height:r},{width:e,height:r}}});var GEe=_(uB=>{"use strict";var $yt=uB&&uB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uB,"__esModule",{value:!0});var dn=$yt(lm()),eEt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?dn.default.POSITION_TYPE_ABSOLUTE:dn.default.POSITION_TYPE_RELATIVE)},tEt=(t,e)=>{"marginLeft"in e&&t.setMargin(dn.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(dn.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(dn.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(dn.default.EDGE_BOTTOM,e.marginBottom||0)},rEt=(t,e)=>{"paddingLeft"in e&&t.setPadding(dn.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(dn.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(dn.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(dn.default.EDGE_BOTTOM,e.paddingBottom||0)},nEt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(dn.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(dn.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(dn.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(dn.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(dn.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(dn.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(dn.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(dn.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(dn.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_AROUND))},iEt=(t,e)=>{var r,o;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},sEt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?dn.default.DISPLAY_FLEX:dn.default.DISPLAY_NONE)},oEt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(dn.default.EDGE_TOP,r),t.setBorder(dn.default.EDGE_BOTTOM,r),t.setBorder(dn.default.EDGE_LEFT,r),t.setBorder(dn.default.EDGE_RIGHT,r)}};uB.default=(t,e={})=>{eEt(t,e),tEt(t,e),rEt(t,e),nEt(t,e),iEt(t,e),sEt(t,e),oEt(t,e)}});var WEe=_((xKt,YEe)=>{"use strict";var AB=Kk(),aEt=NP(),lEt=DI(),M6=new Set(["\x1B","\x9B"]),cEt=39,jEe=t=>`${M6.values().next().value}[${t}m`,uEt=t=>t.split(" ").map(e=>AB(e)),O6=(t,e,r)=>{let o=[...e],a=!1,n=AB(aEt(t[t.length-1]));for(let[u,A]of o.entries()){let p=AB(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),M6.has(A))a=!0;else if(a&&A==="m"){a=!1;continue}a||(n+=p,n===r&&u0&&t.length>1&&(t[t.length-2]+=t.pop())},AEt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(AB(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},fEt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let o="",a="",n,u=uEt(t),A=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=AB(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(""),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=" ",E++)),r.hard&&u[p]>e){let I=e-E,v=1+Math.floor((u[p]-I-1)/e);Math.floor((u[p]-1)/e)e&&E>0&&u[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){O6(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(AEt)),o=A.join(` +`);for(let[p,h]of[...o].entries()){if(a+=h,M6.has(h)){let I=parseFloat(/\d[^m]*/.exec(o.slice(p,p+4)));n=I===cEt?null:I}let E=lEt.codes.get(Number(n));n&&E&&(o[p+1]===` +`?a+=jEe(E):h===` +`&&(a+=jEe(n)))}return a};YEe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` +`).split(` +`).map(o=>fEt(o,e,r)).join(` +`)});var VEe=_((kKt,zEe)=>{"use strict";var KEe="[\uD800-\uDBFF][\uDC00-\uDFFF]",pEt=t=>t&&t.exact?new RegExp(`^${KEe}$`):new RegExp(KEe,"g");zEe.exports=pEt});var U6=_((QKt,$Ee)=>{"use strict";var hEt=F6(),gEt=VEe(),JEe=DI(),ZEe=["\x1B","\x9B"],zk=t=>`${ZEe[0]}[${t}m`,XEe=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let u=JEe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(zk(e?u:n))}else if(e){o.push(zk(0));break}else o.push(zk(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=zk(JEe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join("")};$Ee.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r=="number"?r:o.length;let n=!1,u,A=0,p="";for(let[h,E]of o.entries()){let I=!1;if(ZEe.includes(E)){let v=/\d[^m]*/.exec(t.slice(h,h+18));u=v&&v.length>0?v[0]:void 0,Ae&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=XEe(a);else if(A>=r){p+=XEe(a,!0,u);break}}return p}});var tCe=_((FKt,eCe)=>{"use strict";var C0=U6(),dEt=Kk();function Vk(t,e,r){if(t.charAt(e)===" ")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===" ")return e+o}else if(t.charAt(e-o)===" ")return e-o;return e}eCe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u="\u2026",A=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return u;let p=dEt(t);if(p<=e)return t;if(o==="start"){if(n){let h=Vk(t,p-e+1,!0);return u+C0(t,h,p).trim()}return a===!0&&(u+=" ",A=2),u+C0(t,p-e+A,p)}if(o==="middle"){a===!0&&(u=" "+u+" ",A=3);let h=Math.floor(e/2);if(n){let E=Vk(t,h),I=Vk(t,p-(e-h)+1,!0);return C0(t,0,E)+u+C0(t,I,p).trim()}return C0(t,0,h)+u+C0(t,p-(e-h)+A,p)}if(o==="end"){if(n){let h=Vk(t,e-1);return C0(t,0,h)+u}return a===!0&&(u=" "+u,A=2),C0(t,0,e-A)+u}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${o}`)}});var H6=_(fB=>{"use strict";var rCe=fB&&fB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(fB,"__esModule",{value:!0});var mEt=rCe(WEe()),yEt=rCe(tCe()),_6={};fB.default=(t,e,r)=>{let o=t+String(e)+String(r);if(_6[o])return _6[o];let a=t;if(r==="wrap"&&(a=mEt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=yEt.default(t,e,{position:n})}return _6[o]=a,a}});var G6=_(q6=>{"use strict";Object.defineProperty(q6,"__esModule",{value:!0});var nCe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let o="";r.nodeName==="#text"?o=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(o=nCe(r)),o.length>0&&typeof r.internal_transform=="function"&&(o=r.internal_transform(o))),e+=o}return e};q6.default=nCe});var j6=_(pi=>{"use strict";var pB=pi&&pi.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pi,"__esModule",{value:!0});pi.setTextNodeValue=pi.createTextNode=pi.setStyle=pi.setAttribute=pi.removeChildNode=pi.insertBeforeNode=pi.appendChildNode=pi.createNode=pi.TEXT_NAME=void 0;var EEt=pB(lm()),iCe=pB(qEe()),CEt=pB(GEe()),wEt=pB(H6()),IEt=pB(G6());pi.TEXT_NAME="#text";pi.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:EEt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(BEt.bind(null,r))),r};pi.appendChildNode=(t,e)=>{var r;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Jk(t)};pi.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Jk(t)};pi.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&Jk(t)};pi.setAttribute=(t,e,r)=>{t.attributes[e]=r};pi.setStyle=(t,e)=>{t.style=e,t.yogaNode&&CEt.default(t.yogaNode,e)};pi.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return pi.setTextNodeValue(e,t),e};var BEt=function(t,e){var r,o;let a=t.nodeName==="#text"?t.nodeValue:IEt.default(t),n=iCe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:"wrap",A=wEt.default(a,e,u);return iCe.default(A)},sCe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:sCe(t.parentNode)},Jk=t=>{let e=sCe(t);e?.markDirty()};pi.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,Jk(t)}});var uCe=_(hB=>{"use strict";var cCe=hB&&hB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hB,"__esModule",{value:!0});var oCe=P6(),vEt=cCe(bEe()),aCe=cCe(lm()),Oo=j6(),lCe=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};hB.default=vEt.default({schedulePassiveEffects:oCe.unstable_scheduleCallback,cancelPassiveEffects:oCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e==="ink-text"||e==="ink-virtual-text";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&o.isInsideText?"ink-virtual-text":t,n=Oo.createNode(a);for(let[u,A]of Object.entries(e))u!=="children"&&(u==="style"?Oo.setStyle(n,A):u==="internal_transform"?n.internal_transform=A:u==="internal_static"?n.internal_static=!0:Oo.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return Oo.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{Oo.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{Oo.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(aCe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(aCe.default.DISPLAY_FLEX)},appendInitialChild:Oo.appendChildNode,appendChild:Oo.appendChildNode,insertBefore:Oo.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:Oo.appendChildNode,insertInContainerBefore:Oo.insertBeforeNode,removeChildFromContainer:(t,e)=>{Oo.removeChildNode(t,e),lCe(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A==="style"&&typeof o.style=="object"&&typeof r.style=="object"){let h=o.style,E=r.style,I=Object.keys(h);for(let v of I){if(v==="borderStyle"||v==="borderColor"){if(typeof n.style!="object"){let x={};n.style=x}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[v]!==E[v]){if(typeof n.style!="object"){let x={};n.style=x}n.style[v]=h[v]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!=="children"&&(r==="style"?Oo.setStyle(t,o):r==="internal_transform"?t.internal_transform=o:r==="internal_static"?t.internal_static=!0:Oo.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{Oo.setTextNodeValue(t,r)},removeChild:(t,e)=>{Oo.removeChildNode(t,e),lCe(e.yogaNode)}})});var fCe=_((OKt,ACe)=>{"use strict";ACe.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var pCe=_(gB=>{"use strict";var DEt=gB&&gB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(gB,"__esModule",{value:!0});var Xk=DEt(lm());gB.default=t=>t.getComputedWidth()-t.getComputedPadding(Xk.default.EDGE_LEFT)-t.getComputedPadding(Xk.default.EDGE_RIGHT)-t.getComputedBorder(Xk.default.EDGE_LEFT)-t.getComputedBorder(Xk.default.EDGE_RIGHT)});var hCe=_((UKt,PEt)=>{PEt.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var dCe=_((_Kt,Y6)=>{"use strict";var gCe=hCe();Y6.exports=gCe;Y6.exports.default=gCe});var yCe=_((HKt,mCe)=>{"use strict";var SEt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},bEt=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r +`:` +`)+r,a=o+1,o=t.indexOf(` +`,a)}while(o!==-1);return n+=t.substr(a),n};mCe.exports={stringReplaceAll:SEt,stringEncaseCRLFWithFirstIndex:bEt}});var BCe=_((qKt,ICe)=>{"use strict";var xEt=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,ECe=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,kEt=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,QEt=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,FEt=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function wCe(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):FEt.get(t)||t}function REt(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(kEt))r.push(a[2].replace(QEt,(A,p,h)=>p?wCe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function TEt(t){ECe.lastIndex=0;let e=[],r;for(;(r=ECe.exec(t))!==null;){let o=r[1];if(r[2]){let a=REt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function CCe(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(!!Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}ICe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(xEt,(n,u,A,p,h,E)=>{if(u)a.push(wCe(u));else if(p){let I=a.join("");a=[],o.push(r.length===0?I:CCe(t,r)(I)),r.push({inverse:A,styles:TEt(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(CCe(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var rQ=_((GKt,xCe)=>{"use strict";var dB=DI(),{stdout:K6,stderr:z6}=dL(),{stringReplaceAll:LEt,stringEncaseCRLFWithFirstIndex:NEt}=yCe(),{isArray:Zk}=Array,DCe=["ansi","ansi","ansi256","ansi16m"],HC=Object.create(null),OEt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=K6?K6.level:0;t.level=e.level===void 0?r:e.level},V6=class{constructor(e){return PCe(e)}},PCe=t=>{let e={};return OEt(e,t),e.template=(...r)=>bCe(e.template,...r),Object.setPrototypeOf(e,$k.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=V6,e.template};function $k(t){return PCe(t)}for(let[t,e]of Object.entries(dB))HC[t]={get(){let r=eQ(this,J6(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};HC.visible={get(){let t=eQ(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var SCe=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of SCe)HC[t]={get(){let{level:e}=this;return function(...r){let o=J6(dB.color[DCe[e]][t](...r),dB.color.close,this._styler);return eQ(this,o,this._isEmpty)}}};for(let t of SCe){let e="bg"+t[0].toUpperCase()+t.slice(1);HC[e]={get(){let{level:r}=this;return function(...o){let a=J6(dB.bgColor[DCe[r]][t](...o),dB.bgColor.close,this._styler);return eQ(this,a,this._isEmpty)}}}}var MEt=Object.defineProperties(()=>{},{...HC,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),J6=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},eQ=(t,e,r)=>{let o=(...a)=>Zk(a[0])&&Zk(a[0].raw)?vCe(o,bCe(o,...a)):vCe(o,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(o,MEt),o._generator=t,o._styler=e,o._isEmpty=r,o},vCe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=LEt(e,r.close,r.open),r=r.parent;let n=e.indexOf(` +`);return n!==-1&&(e=NEt(e,a,o,n)),o+e+a},W6,bCe=(t,...e)=>{let[r]=e;if(!Zk(r)||!Zk(r.raw))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";var UEt=yB&&yB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(yB,"__esModule",{value:!0});var mB=UEt(rQ()),_Et=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,HEt=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,nQ=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);yB.default=(t,e,r)=>{if(!e)return t;if(e in mB.default){let a=nQ(e,r);return mB.default[a](t)}if(e.startsWith("#")){let a=nQ("hex",r);return mB.default[a](e)(t)}if(e.startsWith("ansi")){let a=HEt.exec(e);if(!a)return t;let n=nQ(a[1],r),u=Number(a[2]);return mB.default[n](u)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=_Et.exec(e);if(!a)return t;let n=nQ(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return mB.default[n](u,A,p)(t)}return t}});var QCe=_(EB=>{"use strict";var kCe=EB&&EB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(EB,"__esModule",{value:!0});var qEt=kCe(dCe()),Z6=kCe(X6());EB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=qEt.default[r.style.borderStyle],p=Z6.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,"foreground"),h=(Z6.default(A.vertical,u,"foreground")+` +`).repeat(n-2),E=Z6.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,"foreground");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var RCe=_(CB=>{"use strict";var cm=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,"__esModule",{value:!0});var GEt=cm(lm()),jEt=cm(L6()),YEt=cm(fCe()),WEt=cm(H6()),KEt=cm(pCe()),zEt=cm(G6()),VEt=cm(QCe()),JEt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=` +`.repeat(n)+YEt.default(e,a)}return e},FCe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===GEt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),I=u;if(typeof t.internal_transform=="function"&&(I=[t.internal_transform,...u]),t.nodeName==="ink-text"){let v=zEt.default(t);if(v.length>0){let x=jEt.default(v),C=KEt.default(p);if(x>C){let R=(o=t.style.textWrap)!==null&&o!==void 0?o:"wrap";v=WEt.default(v,C,R)}v=JEt(t,v),e.write(h,E,v,{transformers:I})}return}if(t.nodeName==="ink-box"&&VEt.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let v of t.childNodes)FCe(v,e,{offsetX:h,offsetY:E,transformers:I,skipStaticElements:A})}};CB.default=FCe});var LCe=_((KKt,TCe)=>{"use strict";TCe.exports=t=>{t=Object.assign({onlyFirst:!1},t);let e=["[\\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(e,t.onlyFirst?void 0:"g")}});var OCe=_((zKt,$6)=>{"use strict";var XEt=LCe(),NCe=t=>typeof t=="string"?t.replace(XEt(),""):t;$6.exports=NCe;$6.exports.default=NCe});var _Ce=_((VKt,UCe)=>{"use strict";var MCe="[\uD800-\uDBFF][\uDC00-\uDFFF]";UCe.exports=t=>t&&t.exact?new RegExp(`^${MCe}$`):new RegExp(MCe,"g")});var qCe=_((JKt,eq)=>{"use strict";var ZEt=OCe(),$Et=_Ce(),HCe=t=>ZEt(t).replace($Et()," ").length;eq.exports=HCe;eq.exports.default=HCe});var YCe=_(wB=>{"use strict";var jCe=wB&&wB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(wB,"__esModule",{value:!0});var GCe=jCe(U6()),eCt=jCe(qCe()),tq=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;!o||this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;oo.trimRight()).join(` +`),height:e.length}}};wB.default=tq});var zCe=_(IB=>{"use strict";var rq=IB&&IB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(IB,"__esModule",{value:!0});var tCt=rq(lm()),WCe=rq(RCe()),KCe=rq(YCe());IB.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,tCt.default.DIRECTION_LTR);let o=new KCe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});WCe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new KCe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),WCe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output} +`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var ZCe=_(($Kt,XCe)=>{"use strict";var VCe=ve("stream"),JCe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],nq={},rCt=t=>{let e=new VCe.PassThrough,r=new VCe.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let o=new console.Console(e,r);for(let a of JCe)nq[a]=console[a],console[a]=o[a];return()=>{for(let a of JCe)console[a]=nq[a];nq={}}};XCe.exports=rCt});var sq=_(iq=>{"use strict";Object.defineProperty(iq,"__esModule",{value:!0});iq.default=new WeakMap});var aq=_(oq=>{"use strict";Object.defineProperty(oq,"__esModule",{value:!0});var nCt=on(),$Ce=nCt.createContext({exit:()=>{}});$Ce.displayName="InternalAppContext";oq.default=$Ce});var cq=_(lq=>{"use strict";Object.defineProperty(lq,"__esModule",{value:!0});var iCt=on(),ewe=iCt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});ewe.displayName="InternalStdinContext";lq.default=ewe});var Aq=_(uq=>{"use strict";Object.defineProperty(uq,"__esModule",{value:!0});var sCt=on(),twe=sCt.createContext({stdout:void 0,write:()=>{}});twe.displayName="InternalStdoutContext";uq.default=twe});var pq=_(fq=>{"use strict";Object.defineProperty(fq,"__esModule",{value:!0});var oCt=on(),rwe=oCt.createContext({stderr:void 0,write:()=>{}});rwe.displayName="InternalStderrContext";fq.default=rwe});var iQ=_(hq=>{"use strict";Object.defineProperty(hq,"__esModule",{value:!0});var aCt=on(),nwe=aCt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});nwe.displayName="InternalFocusContext";hq.default=nwe});var swe=_((ozt,iwe)=>{"use strict";var lCt=/[|\\{}()[\]^$+*?.-]/g;iwe.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(lCt,"\\$&")}});var cwe=_((azt,lwe)=>{"use strict";var cCt=swe(),uCt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",awe=[].concat(ve("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));awe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var BB=class{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=BB.nodeInternals()),"cwd"in e||(e.cwd=uCt),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,ACt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...awe]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` +`)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\/g,"/"),this._internals.some(p=>p.test(u)))return;let A=/^\s*at /.test(u);o?u=u.trimEnd().replace(/^(\s+)at /,"$1"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,""),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u} +`).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};owe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(fCt);if(!r)return null;let o=r[1]==="new",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],I=r[9],v=r[10]==="native",x=r[11]===")",C,R={};if(E&&(R.line=Number(E)),I&&(R.column=Number(I)),x&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")N++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(N--,N===-1&&h.charAt(U-1)===" ")){let V=h.slice(0,U-1);h=h.slice(U+1),a+=` (${V}`;break}}if(a){let N=a.match(pCt);N&&(a=N[1],C=N[2])}return owe(R,h,this._cwd),o&&(R.constructor=!0),n&&(R.evalOrigin=n,R.evalLine=A,R.evalColumn=p,R.evalFile=u&&u.replace(/\\/g,"/")),v&&(R.native=!0),a&&(R.function=a),C&&a!==C&&(R.method=C),R}};function owe(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function ACt(t){if(t.length===0)return[];let e=t.map(r=>cCt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var fCt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),pCt=/^(.*?) \[as (.*?)\]$/;lwe.exports=BB});var Awe=_((lzt,uwe)=>{"use strict";uwe.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var pwe=_((czt,fwe)=>{"use strict";var hCt=Awe(),gCt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};fwe.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=hCt(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},gCt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var sQ=_(nu=>{"use strict";var dCt=nu&&nu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),mCt=nu&&nu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),yCt=nu&&nu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&dCt(e,t,r);return mCt(e,t),e},ECt=nu&&nu.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(t);a{var{children:r}=t,o=ECt(t,["children"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return hwe.default.createElement("ink-box",{ref:e,style:a},r)});gq.displayName="Box";gq.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};nu.default=gq});var yq=_(vB=>{"use strict";var dq=vB&&vB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(vB,"__esModule",{value:!0});var CCt=dq(on()),qC=dq(rQ()),gwe=dq(X6()),mq=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=I=>(r&&(I=qC.default.dim(I)),t&&(I=gwe.default(I,t,"foreground")),e&&(I=gwe.default(I,e,"background")),o&&(I=qC.default.bold(I)),a&&(I=qC.default.italic(I)),n&&(I=qC.default.underline(I)),u&&(I=qC.default.strikethrough(I)),A&&(I=qC.default.inverse(I)),I);return CCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};mq.displayName="Text";mq.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};vB.default=mq});var Ewe=_(iu=>{"use strict";var wCt=iu&&iu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ICt=iu&&iu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),BCt=iu&&iu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&wCt(e,t,r);return ICt(e,t),e},DB=iu&&iu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(iu,"__esModule",{value:!0});var dwe=BCt(ve("fs")),fs=DB(on()),mwe=DB(cwe()),vCt=DB(pwe()),Zf=DB(sQ()),gA=DB(yq()),ywe=new mwe.default({cwd:process.cwd(),internals:mwe.default.nodeInternals()}),DCt=({error:t})=>{let e=t.stack?t.stack.split(` +`).slice(1):void 0,r=e?ywe.parseLine(e[0]):void 0,o,a=0;if(r?.file&&r?.line&&dwe.existsSync(r.file)){let n=dwe.readFileSync(r.file,"utf8");if(o=vCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return fs.default.createElement(Zf.default,{flexDirection:"column",padding:1},fs.default.createElement(Zf.default,null,fs.default.createElement(gA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),fs.default.createElement(gA.default,null," ",t.message)),r&&fs.default.createElement(Zf.default,{marginTop:1},fs.default.createElement(gA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&o&&fs.default.createElement(Zf.default,{marginTop:1,flexDirection:"column"},o.map(({line:n,value:u})=>fs.default.createElement(Zf.default,{key:n},fs.default.createElement(Zf.default,{width:a+1},fs.default.createElement(gA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),fs.default.createElement(gA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+u)))),t.stack&&fs.default.createElement(Zf.default,{marginTop:1,flexDirection:"column"},t.stack.split(` +`).slice(1).map(n=>{let u=ywe.parseLine(n);return u?fs.default.createElement(Zf.default,{key:n},fs.default.createElement(gA.default,{dimColor:!0},"- "),fs.default.createElement(gA.default,{dimColor:!0,bold:!0},u.function),fs.default.createElement(gA.default,{dimColor:!0,color:"gray"}," ","(",u.file,":",u.line,":",u.column,")")):fs.default.createElement(Zf.default,{key:n},fs.default.createElement(gA.default,{dimColor:!0},"- "),fs.default.createElement(gA.default,{dimColor:!0,bold:!0},n))})))};iu.default=DCt});var wwe=_(su=>{"use strict";var PCt=su&&su.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),SCt=su&&su.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),bCt=su&&su.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&PCt(e,t,r);return SCt(e,t),e},Am=su&&su.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(su,"__esModule",{value:!0});var um=bCt(on()),Cwe=Am(g6()),xCt=Am(aq()),kCt=Am(cq()),QCt=Am(Aq()),FCt=Am(pq()),RCt=Am(iQ()),TCt=Am(Ewe()),LCt=" ",NCt="\x1B[Z",OCt="\x1B",oQ=class extends um.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. +Read 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. +Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===OCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===LCt&&this.focusNext(),e===NCt&&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=>{let r=e.focusables[0].id;return{activeFocusId:this.findNextFocusable(e)||r}})},this.focusPrevious=()=>{this.setState(e=>{let r=e.focusables[e.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(e)||r}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r+1;o{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r-1;o>=0;o--)if(e.focusables[o].isActive)return e.focusables[o].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return um.default.createElement(xCt.default.Provider,{value:{exit:this.handleExit}},um.default.createElement(kCt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},um.default.createElement(QCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},um.default.createElement(FCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},um.default.createElement(RCt.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?um.default.createElement(TCt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){Cwe.default.hide(this.props.stdout)}componentWillUnmount(){Cwe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};su.default=oQ;oQ.displayName="InternalApp"});var vwe=_(ou=>{"use strict";var MCt=ou&&ou.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),UCt=ou&&ou.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),_Ct=ou&&ou.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&MCt(e,t,r);return UCt(e,t),e},au=ou&&ou.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ou,"__esModule",{value:!0});var HCt=au(on()),Iwe=lM(),qCt=au(cEe()),GCt=au(u6()),jCt=au(gEe()),YCt=au(mEe()),Eq=au(uCe()),WCt=au(zCe()),KCt=au(h6()),zCt=au(ZCe()),VCt=_Ct(j6()),JCt=au(sq()),XCt=au(wwe()),GC=process.env.CI==="false"?!1:jCt.default,Bwe=()=>{},Cq=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=WCt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` +`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(GC){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(GCt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},YCt.default(this),this.options=e,this.rootNode=VCt.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:Iwe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=qCt.default.create(e.stdout),this.throttledLog=e.debug?this.log:Iwe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=Eq.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=KCt.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),GC||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=HCt.default.createElement(XCt.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);Eq.default.updateContainer(r,this.container,null,Bwe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(GC){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(GC){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),GC?this.options.stdout.write(this.lastOutput+` +`):this.options.debug||this.log.done(),this.isUnmounted=!0,Eq.default.updateContainer(null,this.container,null,Bwe),JCt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!GC&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=zCt.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};ou.default=Cq});var Pwe=_(PB=>{"use strict";var Dwe=PB&&PB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(PB,"__esModule",{value:!0});var ZCt=Dwe(vwe()),aQ=Dwe(sq()),$Ct=ve("stream"),ewt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},twt(e)),o=rwt(r.stdout,()=>new ZCt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>aQ.default.delete(r.stdout),clear:o.clear}};PB.default=ewt;var twt=(t={})=>t instanceof $Ct.Stream?{stdout:t,stdin:process.stdin}:t,rwt=(t,e)=>{let r;return aQ.default.has(t)?r=aQ.default.get(t):(r=e(),aQ.default.set(t,r)),r}});var bwe=_($f=>{"use strict";var nwt=$f&&$f.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),iwt=$f&&$f.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),swt=$f&&$f.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&nwt(e,t,r);return iwt(e,t),e};Object.defineProperty($f,"__esModule",{value:!0});var SB=swt(on()),Swe=t=>{let{items:e,children:r,style:o}=t,[a,n]=SB.useState(0),u=SB.useMemo(()=>e.slice(a),[e,a]);SB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=SB.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},o),[o]);return SB.default.createElement("ink-box",{internal_static:!0,style:p},A)};Swe.displayName="Static";$f.default=Swe});var kwe=_(bB=>{"use strict";var owt=bB&&bB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(bB,"__esModule",{value:!0});var awt=owt(on()),xwe=({children:t,transform:e})=>t==null?null:awt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);xwe.displayName="Transform";bB.default=xwe});var Fwe=_(xB=>{"use strict";var lwt=xB&&xB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xB,"__esModule",{value:!0});var cwt=lwt(on()),Qwe=({count:t=1})=>cwt.default.createElement("ink-text",null,` +`.repeat(t));Qwe.displayName="Newline";xB.default=Qwe});var Lwe=_(kB=>{"use strict";var Rwe=kB&&kB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kB,"__esModule",{value:!0});var uwt=Rwe(on()),Awt=Rwe(sQ()),Twe=()=>uwt.default.createElement(Awt.default,{flexGrow:1});Twe.displayName="Spacer";kB.default=Twe});var lQ=_(QB=>{"use strict";var fwt=QB&&QB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(QB,"__esModule",{value:!0});var pwt=on(),hwt=fwt(cq()),gwt=()=>pwt.useContext(hwt.default);QB.default=gwt});var Owe=_(FB=>{"use strict";var dwt=FB&&FB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(FB,"__esModule",{value:!0});var Nwe=on(),mwt=dwt(lQ()),ywt=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=mwt.default();Nwe.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),Nwe.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A==="\x1B[A",downArrow:A==="\x1B[B",leftArrow:A==="\x1B[D",rightArrow:A==="\x1B[C",pageDown:A==="\x1B[6~",pageUp:A==="\x1B[5~",return:A==="\r",escape:A==="\x1B",ctrl:!1,shift:!1,tab:A===" "||A==="\x1B[Z",backspace:A==="\b",delete:A==="\x7F"||A==="\x1B[3~",meta:!1};A<=""&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+"a".charCodeAt(0)-1),p.ctrl=!0),A.startsWith("\x1B")&&(A=A.slice(1),p.meta=!0);let h=A>="A"&&A<="Z",E=A>="\u0410"&&A<="\u042F";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=""),(!(A==="c"&&p.ctrl)||!a)&&t(A,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[e.isActive,r,a,t])};FB.default=ywt});var Mwe=_(RB=>{"use strict";var Ewt=RB&&RB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(RB,"__esModule",{value:!0});var Cwt=on(),wwt=Ewt(aq()),Iwt=()=>Cwt.useContext(wwt.default);RB.default=Iwt});var Uwe=_(TB=>{"use strict";var Bwt=TB&&TB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(TB,"__esModule",{value:!0});var vwt=on(),Dwt=Bwt(Aq()),Pwt=()=>vwt.useContext(Dwt.default);TB.default=Pwt});var _we=_(LB=>{"use strict";var Swt=LB&&LB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(LB,"__esModule",{value:!0});var bwt=on(),xwt=Swt(pq()),kwt=()=>bwt.useContext(xwt.default);LB.default=kwt});var qwe=_(OB=>{"use strict";var Hwe=OB&&OB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(OB,"__esModule",{value:!0});var NB=on(),Qwt=Hwe(iQ()),Fwt=Hwe(lQ()),Rwt=({isActive:t=!0,autoFocus:e=!1}={})=>{let{isRawModeSupported:r,setRawMode:o}=Fwt.default(),{activeId:a,add:n,remove:u,activate:A,deactivate:p}=NB.useContext(Qwt.default),h=NB.useMemo(()=>Math.random().toString().slice(2,7),[]);return NB.useEffect(()=>(n(h,{autoFocus:e}),()=>{u(h)}),[h,e]),NB.useEffect(()=>{t?A(h):p(h)},[t,h]),NB.useEffect(()=>{if(!(!r||!t))return o(!0),()=>{o(!1)}},[t]),{isFocused:Boolean(h)&&a===h}};OB.default=Rwt});var Gwe=_(MB=>{"use strict";var Twt=MB&&MB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(MB,"__esModule",{value:!0});var Lwt=on(),Nwt=Twt(iQ()),Owt=()=>{let t=Lwt.useContext(Nwt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious}};MB.default=Owt});var jwe=_(wq=>{"use strict";Object.defineProperty(wq,"__esModule",{value:!0});wq.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var sc=_(ro=>{"use strict";Object.defineProperty(ro,"__esModule",{value:!0});var Mwt=Pwe();Object.defineProperty(ro,"render",{enumerable:!0,get:function(){return Mwt.default}});var Uwt=sQ();Object.defineProperty(ro,"Box",{enumerable:!0,get:function(){return Uwt.default}});var _wt=yq();Object.defineProperty(ro,"Text",{enumerable:!0,get:function(){return _wt.default}});var Hwt=bwe();Object.defineProperty(ro,"Static",{enumerable:!0,get:function(){return Hwt.default}});var qwt=kwe();Object.defineProperty(ro,"Transform",{enumerable:!0,get:function(){return qwt.default}});var Gwt=Fwe();Object.defineProperty(ro,"Newline",{enumerable:!0,get:function(){return Gwt.default}});var jwt=Lwe();Object.defineProperty(ro,"Spacer",{enumerable:!0,get:function(){return jwt.default}});var Ywt=Owe();Object.defineProperty(ro,"useInput",{enumerable:!0,get:function(){return Ywt.default}});var Wwt=Mwe();Object.defineProperty(ro,"useApp",{enumerable:!0,get:function(){return Wwt.default}});var Kwt=lQ();Object.defineProperty(ro,"useStdin",{enumerable:!0,get:function(){return Kwt.default}});var zwt=Uwe();Object.defineProperty(ro,"useStdout",{enumerable:!0,get:function(){return zwt.default}});var Vwt=_we();Object.defineProperty(ro,"useStderr",{enumerable:!0,get:function(){return Vwt.default}});var Jwt=qwe();Object.defineProperty(ro,"useFocus",{enumerable:!0,get:function(){return Jwt.default}});var Xwt=Gwe();Object.defineProperty(ro,"useFocusManager",{enumerable:!0,get:function(){return Xwt.default}});var Zwt=jwe();Object.defineProperty(ro,"measureElement",{enumerable:!0,get:function(){return Zwt.default}})});var Bq={};zt(Bq,{Gem:()=>Iq});var Ywe,fm,Iq,cQ=Et(()=>{Ywe=$e(sc()),fm=$e(on()),Iq=(0,fm.memo)(({active:t})=>{let e=(0,fm.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,fm.useMemo)(()=>t?"green":"yellow",[t]);return fm.default.createElement(Ywe.Text,{color:r},e)})});var Kwe={};zt(Kwe,{useKeypress:()=>pm});function pm({active:t},e,r){let{stdin:o}=(0,Wwe.useStdin)(),a=(0,uQ.useCallback)((n,u)=>e(n,u),r);(0,uQ.useEffect)(()=>{if(!(!t||!o))return o.on("keypress",a),()=>{o.off("keypress",a)}},[t,a,o])}var Wwe,uQ,UB=Et(()=>{Wwe=$e(sc()),uQ=$e(on())});var Vwe={};zt(Vwe,{FocusRequest:()=>zwe,useFocusRequest:()=>vq});var zwe,vq,Dq=Et(()=>{UB();zwe=(r=>(r.BEFORE="before",r.AFTER="after",r))(zwe||{}),vq=function({active:t},e,r){pm({active:t},(o,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var Jwe={};zt(Jwe,{useListInput:()=>_B});var _B,AQ=Et(()=>{UB();_B=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){pm({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var fQ={};zt(fQ,{ScrollableItems:()=>$wt});var w0,Na,$wt,pQ=Et(()=>{w0=$e(sc()),Na=$e(on());Dq();AQ();$wt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=N=>{if(N.key===null)throw new Error("Expected all children to have a key");return N.key},p=Na.default.Children.map(e,N=>A(N)),h=p[0],[E,I]=(0,Na.useState)(h),v=p.indexOf(E);(0,Na.useEffect)(()=>{p.includes(E)||I(h)},[e]),(0,Na.useEffect)(()=>{u&&v>=p.length-2&&u()},[v]),vq({active:t&&!!n},N=>{n?.(N)},[n]),_B(E,p,{active:t,minus:"up",plus:"down",set:I,loop:a});let x=v-r,C=v+r;C>p.length&&(x-=C-p.length,C=p.length),x<0&&(C+=-x,x=0),C>=p.length&&(C=p.length-1);let R=[];for(let N=x;N<=C;++N){let U=p[N],V=t&&U===E;R.push(Na.default.createElement(w0.Box,{key:U,height:o},Na.default.createElement(w0.Box,{marginLeft:1,marginRight:1},Na.default.createElement(w0.Text,null,V?Na.default.createElement(w0.Text,{color:"cyan",bold:!0},">"):" ")),Na.default.createElement(w0.Box,null,Na.default.cloneElement(e[N],{active:V}))))}return Na.default.createElement(w0.Box,{flexDirection:"column",width:"100%"},R)}});var Xwe,ep,Zwe,Pq,$we,Sq=Et(()=>{Xwe=$e(sc()),ep=$e(on()),Zwe=ve("readline"),Pq=ep.default.createContext(null),$we=({children:t})=>{let{stdin:e,setRawMode:r}=(0,Xwe.useStdin)();(0,ep.useEffect)(()=>{r&&r(!0),e&&(0,Zwe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,ep.useState)(new Map),n=(0,ep.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return ep.default.createElement(Pq.Provider,{value:n,children:t})}});var bq={};zt(bq,{useMinistore:()=>eIt});function eIt(t,e){let r=(0,hQ.useContext)(Pq);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let o=(0,hQ.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,o]}var hQ,xq=Et(()=>{hQ=$e(on());Sq()});var dQ={};zt(dQ,{renderForm:()=>tIt});async function tIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,gQ.useApp)();pm({active:!0},(E,I)=>{I.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,gQ.render)(kq.default.createElement($we,null,kq.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var gQ,kq,mQ=Et(()=>{gQ=$e(sc()),kq=$e(on());Sq();UB()});var nIe=_(HB=>{"use strict";Object.defineProperty(HB,"__esModule",{value:!0});HB.UncontrolledTextInput=void 0;var tIe=on(),Qq=on(),eIe=sc(),hm=rQ(),rIe=({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=Qq.useState({cursorOffset:(t||"").length,cursorWidth:0});Qq.useEffect(()=>{E(R=>{if(!r||!n)return R;let N=t||"";return R.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:R})},[t,r,n]);let I=a?h:0,v=o?o.repeat(t.length):t,x=v,C=e?hm.grey(e):void 0;if(n&&r){C=e.length>0?hm.inverse(e[0])+hm.grey(e.slice(1)):hm.inverse(" "),x=v.length>0?"":hm.inverse(" ");let R=0;for(let N of v)R>=p-I&&R<=p?x+=hm.inverse(N):x+=N,R++;v.length>0&&p===v.length&&(x+=hm.inverse(" "))}return eIe.useInput((R,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&R==="c"||N.tab||N.shift&&N.tab)return;if(N.return){A&&A(t);return}let U=p,V=t,te=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(V=t.slice(0,p-1)+t.slice(p,t.length),U--):(V=t.slice(0,p)+R+t.slice(p,t.length),U+=R.length,R.length>1&&(te=R.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:te}),V!==t&&u(V)},{isActive:r}),tIe.createElement(eIe.Text,null,e?v.length>0?x:C:x)};HB.default=rIe;HB.UncontrolledTextInput=t=>{let[e,r]=Qq.useState("");return tIe.createElement(rIe,Object.assign({},t,{value:e,onChange:r}))}});var oIe={};zt(oIe,{Pad:()=>Fq});var iIe,sIe,Fq,Rq=Et(()=>{iIe=$e(sc()),sIe=$e(on()),Fq=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return sIe.default.createElement(iIe.Text,{dimColor:!e},r)}});var aIe={};zt(aIe,{ItemOptions:()=>rIt});var GB,B0,rIt,lIe=Et(()=>{GB=$e(sc()),B0=$e(on());AQ();cQ();Rq();rIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!="");return _B(o,u,{active:t,minus:"left",plus:"right",set:a}),B0.default.createElement(B0.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,I=n[h]-1||0,v=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),x=Math.max(0,I-v.length-2);return p?B0.default.createElement(GB.Box,{key:p,width:I,marginLeft:1},B0.default.createElement(GB.Text,{wrap:"truncate"},B0.default.createElement(Iq,{active:E})," ",p),e?B0.default.createElement(Fq,{active:t,length:x}):null):B0.default.createElement(GB.Box,{key:`spacer-${h}`,width:I,marginLeft:1})}))}});var vIe=_((XVt,BIe)=>{var qq;BIe.exports=()=>(typeof qq>"u"&&(qq=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),qq)});var YIe=_((IJt,jIe)=>{var Xq=Symbol("arg flag"),Oa=class extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,Oa.prototype)}};function sv(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new Oa("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new Oa("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(A[0]!=="-")throw new Oa(`argument key must start with '-' but found: '${A}'`,"ARG_CONFIG_NONOPT_KEY");if(A.length===1)throw new Oa(`argument key must have a name; singular '-' keys are not allowed: ${A}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[A]=="string"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(I,v,x=[])=>(x.push(E(I,v,x[x.length-1])),x),h=E===Boolean||E[Xq]===!0}else if(typeof p=="function")h=p===Boolean||p[Xq]===!0;else throw new Oa(`type missing or not a function or valid array type: ${A}`,"ARG_CONFIG_VAD_TYPE");if(A[1]!=="-"&&A.length>2)throw new Oa(`short argument keys (with a single hyphen) must have only one character: ${A}`,"ARG_CONFIG_SHORTOPT_TOOLONG");u[A]=[p,h]}for(let A=0,p=e.length;A0){a._=a._.concat(e.slice(A));break}if(h==="--"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(I=>`-${I}`);for(let I=0;I1&&e[A+1][0]==="-"&&!(e[A+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(N===Number||typeof BigInt<"u"&&N===BigInt))){let V=x===R?"":` (alias for ${R})`;throw new Oa(`option requires argument: ${x}${V}`,"ARG_MISSING_REQUIRED_LONGARG")}a[R]=N(e[A+1],R,a[R]),++A}else a[R]=N(C,R,a[R])}}else a._.push(h)}return a}sv.flag=t=>(t[Xq]=!0,t);sv.COUNT=sv.flag((t,e,r)=>(r||0)+1);sv.ArgError=Oa;jIe.exports=sv});var $Ie=_((ZJt,ZIe)=>{var tG;ZIe.exports=()=>(typeof tG>"u"&&(tG=ve("zlib").brotliDecompressSync(Buffer.from("W6cWIYpg4+CAx/MhGBUlnXWIAMsC3pB/VC8EqaqhUbS2Y/UDkZvxDTqLEB9ngDs5Ij2i30/NeprqW8YyX4tnrFY8PZwv5Urs7VwIEeTXXn3/3z9fJ06DyVop3U4vTqkezRNXrHyJEfBY3DLhUp07yxR/mmwO6WW6KCJtmeQj70ppT2kRgefTraqaYFozPP6JVdeZBdYkaxXE71tbqieYRt4mG/DZM/9oVd3U6/VcoIxoVSu7zjHo03sUw/OETtP8Rzy/3jftVSQB6yJVrkylJP7ORnKhSlGw6D63T3EMZomB0QeIwjru9+S35nb3fW8MZlkDkFsil/zGukjeZPHGP1QYkZTNYmm0LAOEHePe0bYcI2OurirJcc8pEmACWI/T/xP2IHNslGKbkSVw2h/i/v9MZ6s6t/+1hRBCgBBS1tb7XjLt7Fg/lk0gIWP1FdD7MX0f+eI3Q+yKNzgIOI6RtP1zdEAp3oUy22rgT0ai7rJi8lNmnyMmuxMnaQ1mfYtXwkouphWDob9sR8vjyd6aEGLr3Ek+RywqeF/6Gl+87DkWyMk5+zd1VtbJrw48IiR6JvP+HfJ8TCU6XPuxwOd32CHq5W9P+pTHQoyoDlzwAmeVt/I0LMUBFmzJ9mT4djmVrAOcNJG/AK3IWn2uOzArOYn5vwzwEyDHWOZILTrA/v6ggB/k4+2SXE1QdnfJO1Ib/5QzZMW2dvbqmXdqUhR3gBXSn930ewsIjdFDwsvyCwp6ucTVVkf82RT648J1246FceYU47eoQN5CmDAeVcmXzZCHY+oAj1IUCrLHjZTZeijhisMdAKCtsmLosAUWPYCy78Tkjm6lCB/zVnTMFZUsYP8+TD6YeTp5JxU/lwojYD3pgFr0I92s1PL9bTK9y7fivNDeekxPEW8w3wHc4LwdPOn+slqtodxIia6mp/gqlAOsnQI+52IkTGjOBmfeZFci5ITiVUCfFk7aIyDhx7MpXNnLtMQdjMBVXDMFOGqtVofqoKSk4upobpNUP7p+31V2rmm4LQimfGIrh8ptRU3weXffr5yRbuWENQ+w09Uj/EM8+fdAPQ0unf1/PKvaSSJ69fJ5vbCGt3csWjQksrmVOXzbbnVn761Btfo8+hX64G4pYvkwxtOYutw8+JEpdy9++3LPBcaBHrzuVv3S5RpL/tiLsGYRelJUC2PdJoHQ5GkYhmAKhe/Czh6gRnswF6m81nwF5gN8DBbakO+PwSBbnT4Tt6th5hhVM4D9XlXlbymqbyjsocl3pP2NnOMEZB2UB8tAr0iWIjkF1yLpxVd6SD7JofnnM6S+AqgfZ1ebfej5Z5eQhEuHl18IK/q8XMRyeU7d8pMpwKI2onS3+i1NmbdJTaRq07Id8k1vsL2v/BtFW3KJvZvzOHrBwjqbl6aC1tUQ++aWtQ3EQHnFd6Fj5FajpGFntwUFZ2RwyR1I2pS3ImdK83ebU/9dCVTfSwJ9riN5+Yz3ApYdNWv+WSQZbdDXkd9Lx393fLXEe+GF1ouMDpMXFBmQlRdm4MAqdd72nJ0F5FObKrh2dT2dYEIROQGRHBIc1EAumcxKvU+Ha9fdPkp5OxyQjuwx2Pz4FCxGEZ02klqaFtvicDKnsflyywHi0EjVJUT9ipdiCsVdHIk9PAVke59xY11OXptIusVJm8bfRHwfno9q7AwXv5ta/AepfHD19Zi8oto8Eeocwhs+sXMuCWMnqBxKkeMCXSqcHdVVN9koTwAIjPTgnZEcTr1H1FAsAnG6mlexKYR6Q2P8YizerxlNUsITZWXm5gjetDIrJrmlO6X6z0HOSzn8E2O/gGJ7kLiqTmXwznFrxj3RMKIhAgICCKOVP5mf7tbsUeNj1XZRCMgiaN8HEYOYZCwt9drnSePkKKen4eRsgnbINiCuA0YfvlBE9J2IYRJlqVqjhxRGw6bMRwAsFldZxEfa+r1ERd3fd24YuHnH9dqVXiK0VSd6n3v8YVw6mSNdDiJluK989YxQntCTt/5a1Nai/b45OlcpIbqtWyqtWVskTc00El/bUG76UGC8xZlDG7vJetkITTdV+546PBoCPplnO78QVZxHBJk+lLw397D617B0RXXNPb/K9BVTIjKPBINaEOqPoKYa+Yooq8YWqWyRsjfiFq0jKnpiigvMaZV2EiXngInyHgjQVo1NKeCi9X3G6mJ/Wp7f8hA6Rm5SZUtzllRDrug/yowwe2kTqdbYVWvIZHAZlO9Dxqd0SN9RxFqZEKJwjxWjQC9N9UecPzDoEfjawaLIXCjqXNVF169nMl8R9TTpoQHO3qpEDrHFlCvLvOrZcYOrEg+Ao3b+R4zaJ7w6hrlRQOzMWXzH4+AdY1Yf24fjrv2cZySCLpYd6EK5N7w8ao/5q0MWvFswYBpl+DNCy3PTpIospSspkXSkE4DRy76lN0DsV3MZLOW4G4VIuJp8kHnEjaVjLT7JBuUggpeBdYPHEhvZ7zRjaJt7l+DbmmTSWeKTG3icovNq4hXr6IuUJM5pmvl0DTWbPinxzAvY7vI0xP3iVu+F6YGO4/z7HMVAF22BWDJnVJAT4TQVxwUaS9xA8NlWNJQyj747I4zcC+X9GSIeueYRXGt3VpyntavtULYj0szYbHjyeETfG/04NVd3AeKVJmKM/FXRMjaWytq8Vqd73a5IcNAO6S8D+Yr1dl0wfl/y+ZDnJTA7kVS7Pa3MW2bhFD1WO1s6Ok4an/N0Kf0K74IkRkTYx+FqlcIUTarsw9a+64dKkDXnKDXNX8tn0dql77IBnESmt2wxgj/g8xok7zvRS8Oh3w/qshBt9ggxlQWjxVfhKyP3iloAPy3lgOsxEnUK2qOq7db6JsVX0dX1oi7f1peiQbEWwAHb+QBgoHVPdH3vxvIO5JBLM8e/x4WIy+ICGw3UTOPpnC2Jg/fCvtQyVuVUp9gEFVcUomDtGVeMAvDkTa4CidPsARQm0ps55StFr7CmKd14/eGdy4532dw+x3M+M7ZeIhKTm1KALAR8FVN2aXnhALaUECCfXuWlWlV4a5gXFqFl7Z1lnSjRLujAERt7Yhl+fI/QcTdeTT215hlLHezGyb0dZVqkKaMWJF4SSc88z4aisBi92LUuUFO5mlnKDP5y+RN1VfzVjIjyHf16bCy8Co6TxR0tOiW2cIQlBCkz62h1nxB4/sn2SvMs+TeEF5bJze2TeH71OA3sSjmrHdHrbsNM/PJMnreJOHPOS7msAupKRc9izqHTaenvEAd7z5xAItcS5Q9WPH4BkCpBNcpZzdmcypzsq4K6iq5ImI7aMoxYA0H3zw8ksy/jW4V1KDzuD2qZ+6/Spb2mmWlh2L0grJ34h+cHlDeNn/cOIzTrtV8NvL7xXm1uxqi32FbdkxmtTQnLPpP/ysjyabYdCfXt5sxGWtrlp1JRATj+skhOacz5w8lWEO/2YDb84gu2NG4/iVkFbTlN7di5xtk/gsd+HfiLkjccvmaz4yxFkjx5zJqHptIE813Y9rQrHMXpu/QbwPkdtQTH39pdV9eGqMUz50sGgNATUMfC3WlDS6GLaGVdGk5ntsKxEyBWLXrA1A7H35grWjiYid521WtveEGEwXwaeqTG2WOCdl1Q7Isrtry38o13PwXzpAOGKZ++t6Njb2HakuSVVOEmEfC3KXj73DfVNrecM7O0F7P6AOA+fUeaDQBCeJfbVymfcP7+vht0ImZyzG/1p9uwKcep+9dwboz3sf8WxAx8wqOrr4DTZHvMeSznJypSdP33ey7ojoXlMxsL4MrC7BPlIOEue79UWcLzywkOKKF/ch+RJooVTjmYA36m6DCWSI/qnyv9Hn0VRmKJCNh/kXVrlqLoLR96q8sQCYXqLhq62UP1Zt48hwTi2oAZw3bxb+is1XXDtCsbc/jMOXCxzSQgsmTvmAF0TcdywDfxJnHmbTG+/CZb4ppKicrFZzSF1dQsWE26IDGTKLMtmLr0hIR9ID6WgO/TLCqNzGqfj0WtZvBvLAlVmaN548ud0NxP7ysLp0ubaGcte39ZZZy8vUZjiuep/qDzFpXG5bXF5teCH4bJYUv6jzzdHX/o580FTWwJw0VOC2eL1liQV9On3tKo7N7mL/6EBJoEG/1AJs62YTtzGV/AAJ/Hl2Poc2ufubPOl4B7n71zynpi/a1EsvI0hhOStZ8MVXM9SZfE1qUpnOZlsDcVxUUVHGMyA42SdTulHDGsux63gGFzZmVq8WcayRAD81W3gm7Nfwze1jeCtiscIJirbFvHdMJaFiubl4148wzY3BL00bn0l0B5fNqeaLvhnJXi7llLWC3YUGelbrAhotK7AL0GugTzxhP033ux1a6HtM0pe1IgPps4L0dKPAPJM0kDcVg5qzy/1QqaFuouukzJmki4BoMSZBNx4TSGqqtk8zX+eqDbQHLCkEk/O4fyRbRw14YswJTlW3ds61BhZOeXwgKuzerFKyXiHANHKAKEb//r5F7lfHj7T9S9zvAkQe93l3sCYLPP5MzeCr+ve4zb3Z+lWa83baFTaQ/H3syzRPSAKNzZ7Iq1OFwu4icvvie+KNIpNiTmpR49BO+RBGoOWT4cWg6dCI09S3pocJoC/ZOhTWklNFHvTnr1yns4R6mAIHwZ4fV2ncVOQGFpnV5ooGT38pwHxJeiaPidi68xMEOIMymsS7qauRky7aZtTBuXKFEPtW9LnSJ27iycSyqsjQ1caF0KZ42CeUzvvJPbE1rQib8Inr04fKT39gj7bSbusYhjeCt/1VzYdKEaXG/uHrDPmMAHqu2cIv1ubyG/7s9Z1u3VaJJ8Ef8wbt6crrY/ebjjts8gPcZbc7/Y0C+u53xqq1+9O03pZ5qw5olcgS4eFkmWlkVjuevkl7HykQzJAHQYCLw0BeUblF2gyTMcdZp8TLsiAnvxVJ1gw9YEutrrKFT90nmsGgORO+sAl1Val387XwV+lWdhJBS0cF03bpD3m6Od8kU7sSd+iP+jD7x/cvpuJPxjIaPaL5DQrzLc2dSLN8mdPC0wY7TXIG7l2bOwHz6nCbW3za+sPM2hJkQcYlGcMDM4eRIhcViSL51bEY7zTkDVexr4qtkzshnCWzlX5vVwPTPmhKznQYrHvryoSk6i+38WzFPBee9SMLouCB0z4Qo5xSUBHDl9YXa7YEavvSudP6MwlF1dWL6J82RckgdCyvCKo3PNteIa/0/5rZ0ujiL0Met73jxIqRDLm7ONPDjD2d3ayHr4sKHdfGNO/YgbbH3hfB1WqRysdcmHjZv7AqHPdSnR4bc+5QuaxvI34fz0EPdKXb03sw8P90ge+96TzDgYX5/bOLvY/u5rrJKzbW0tT1r6qxZHfLbMLoPWyK+jEaurDdokoBQljtIiZ+Xs/dhZgkF7g5Re8Mnt072FiFDVGw/GmDVbDZBC31dCfw4dnXpVu6EdhpCRyL5pmuLapRvOJ2azei+NxsK1N9Az/p2otzHBbofjxsy4p5KZyX1lGT9v3umT3l4OF3/i5JTJ7iXN6XG0B2fM3zfaOQOvUhBNuP5MY5SI7Qq5WJp0JhuyS40YBvOKG47KZRTJvqdRNPKaMjsdbbmlhfPe1e6iZzaL80Jr4RsWPuezNn/tsWmR0wYk1XMoV8B2qbOQY8vQ2xfS8WdAuACvcmX5Hqc248eYaS2V3btLafd+bJBSyqL+a0DHJDb2T2rUbqy3kTaY7t9TgFKLg0PkurStpKqN8gWQ0IFtEcgb9eo6iY9og7h31z0TRntHFTR2p6hUldL142x+glp3oyR6wPixnPf6kxKhGq4e7mCSwpF0f6VMxwm4ilu/3HqCt/ljx8Tk2CXRGldQLb3n9h15/GYeMxcnBNflPq5GsfKE3jaoWjGQxfDJbfayFlkdbxgjWhIuTa5fyJzL82A/Du9cyOYVuPJkWntwUEb1+zhVvj8sny+/2RiUjk3aqTlYBuKdCLDv02c/AOj4Vwd3JLa+Mt7deqHlSvk+MZpC0L+f4GCKHGplToxABq37kcD6TjDIdSnueTvShnu2lp1U6uV3NzJevYpDNBpNFomqIdQ1TTNnkUU+98GxTUyBVHbn8WNeuVDU3IXNEoJioei2Uy/MEWYBo1yQwTkcTdqEQbhsQQE2v+Zw+jVOClZUI1IAt7JSfT1O3tvFw0avXq80O6BVZpbDha1ycIAh24saESmKNbwSeyIEqO7O+8mp/ZWDWp6U1d1sb9AElV+E5Iko9yYQS8kj+oD6TAzrWzur1pmFmDjg+3SQQKggPMwOio3ok0rGe5KxKscj5hJp9IqUPIll9UrQdtWYIMT1nLSFIxZJzHcAhsQS+T/37qqi61CPB2rVGPuywDc3myDIRQURmSZRpf9zRHJvIxLwj3Z8WqNatDYjkz4HRojCw3IdOtOGkdfMo0+hLUmBxxWDVRVTnS9IDo5h4I0Ia7coerSE6//OtGfg8yUmvV2yqMw5NPmduRcpIpntLTd00DkV7zOcFG99ELdfO7nzUqt8tKPkqq0OzVkAX7cMlQDZnOelAOKtOxHC9LG4/ZyOEZYQKY0oZnIXowfU7Xmu5/sMZva5VdbmMMQ7GTjojC4GoLuGXpzXzNtr5e019ZbavXb/w26MbFqAeKdyRU8IPUTEox+eHQ8cctlGVMhAL8j51exofk/ch+/32Vkyc/lgIyApYDVKrTviHCri2Q/PngcOubwzamSmNyINcm/zS3BO8amdt8u921WXF4Dld2DZWtEzipXUqzN3PREFTL/Oa5MmlRSMllpa4+U+2ucLIC8hHkeaaDOelMxYW6/ZyWN2Q00sAYnTQU7hU6Msa29VOUoQbGt8Psj7qBhRkgcgoIfkpAHdd/O9Loe3Ca++wahvcJ7brGhclRjWbm4l4tEzvOUm8jk9qhvrSS6TibDzZYKLdMMxVyE5APYd/XcuG3sO3p7e29N7y5J4om07grTN9lAY3ETmwx1H3s8qj2eUxzPNo2wSTZpJNYU0ZTQu2dwCKKZERNTbDmDyoyMNML2jv2cVp+AtFd5h0umenHO6vC3Q7tnlQuSxeOq0pAIbsxv431HzIBUZyiU6FNcHL0c2n52GQfXK12HOcl6YolaelgrzGbEJkWnRi/FB/OerkM7RS2/X0Qsg3ZVYYGsmJ4Z7KCOw9+AGN7++DuLqO7y4M/WP0fht4wRBbzuZuHgJ2hk6YgBTOVVGiIdqBohkxk02jzI8vsO6QNM3WF1vAN03PzrnbehNiWvvvOZzUFOgORUgGZQGCPzSJkCIuuPBnQEWlgah2oUHdgIrKqQMPQydtocs3v98U5JZrFuS3eRSntw2vxmeDAElSZVdqXH92VA8uw3fK+fGfcXEFN4w+2QkO/M2Mifd0Fr0i1jZnEwLqdtXUUyh1UKdz4TyNf7toj1f4fIyNk8Pnw17AE6g1hzjCc1MgpOFOhKPW/NUbSvOK2Su5roAy2ShsXPLc7RaOokCT3yRgSAt5HtOJco786HyEFfEbxBuscKIzU5HuavGhvOzCEMf65BEExrT5Rqz0ONo1c7dI28zkQrnkTBkc0U0NJsZamVwa35/w/0njElZnOxdRwRc0bRz1r+uSP8y869fRRgrq3HlSLxgp3VRlD2JlinDTIj2SK6EpmyZC0nCFIwvhC5rp9beNAoipCSGpijFQFj21+gWwh0ScvR6F72mn6XlCaY/9e+oXryENiHteRwqrJ4zP4T12oW08ThMX8mHHv5WIDa8FTZMWhEaxE5swOHJVmjox3zMx3zkWBxlSk6Hbv6hHoLfj75V/E/QGFPEg1P6qinXSHU71KNIxEw4sgpdwASWei0lzDdIJIDM4vn5Vx0tSmN/Rh+IKqWm3K+YM6dPmfXE5hLRp9T/paQXBr85DRAta2wJwoZ1u4u3fXIlMxLQG6b2ByjHVD6qdlXyCqh4YcnEP6c7SHR10dZnkITjXa6yZosQA305M/9QvkYXblwdYMY7GM53pAAwkPR153JUU98RQ92HXV26vsBrggbS8mNgoRhUinMgFU2FnFiBzh/PQKLFl+zSVlKcB0JHOk2FP3OWHjBNJXVAupP9quj8rq7QmAohDy0i6EgjZsNGpANdWXdy+UiwkSU9f3BH3LaAjdqf6jmgEAZiBM+D67+1ebn+h7z9t3p7ft7+u7w9vbd17Vx/PgYaRK7PsPoav6BqNH5fY6iFhEkWfW3iyEk9Tui1iv1SAp1IQCYTtaYyqPuNXwoYiqGjl41WCzpy1Iovcm1o/wwqFfaGPnNljY0bvRz7Gtc0wei5dWtg+wU+yJZmsFFdora0TPpuLe/oDxizX/Ra37ZAYbNHV+WNIx6PoIQTxjwa1z2Y0t84e8xXTynS9Jlt60xP03Tvq8YvJun5mI9kLP/KNvs8+F5MVwXzyxB34an1byS54o34936LfvbfgE58y0tf+HM7IPfvIZ6mluyI9Mt5lL6Eh1syIFU1kbZSTv3SIzlTVXHZi4/Ypfdv9/aE3p7e237ZFL/YtnmVQ0InrOVeAidVOfXLv6x/CG2jugNDt6LpF/AhL5ZA2tO0m2nNSTM1Jn1xJn/KUs3aSXiZwwbiIlNcaIw864tQ2cUNWrUFtEOv/R5tvPZ3NHrpLmtGtaHQL0yULwFyMd/oS8Hsfg9srvOQ7bOTfXmQ1QvpLOarPPwDGxXvZWG4eubPP3+iaWj1O4Me/f2c4zjwr3rw5vaueMJ6aTA7NjKuib6ubj47+vb452hdeFoE4Y2aUSPkfHtkNFWPqTGbqGu6me6/iPJG2ZXk7ZsLoNA6D+qM0f2x+gKXbD7mMbWulOunmka7elD76Zca1jLiz4/hHGyvOAN9ed6lCh54sxhgqBphmUe/vIcpmo2oTOjC8pRzbqoykper9EuKVAZ6uUz6ZTU5Ww0xRVOSrb/MJqnS1Cn7y27SRFMjGstw1kMwEpOspTx2yXZFtJWnz7sbS39wjMdoSyVMusEke3+Kf24UrqO677fgbNNuerVb/rt/udX+ypBosNMy1e2mKIccuFx88T0UP/63202PtjeQAdgqMfvuR8xLOntNZ8SnddrgLvP6FyXy58iEfubLE3wGzLAxQoX5DW9EwADLfrKa76zIZ9Wqq76AUWZ0fxS2EZBX384XMcHxG6eWOXV9LCjsaCQRgxP6JOvWT3HzBxQELLQXZBrp4mG1SG/I2I7l8LQv1E+7GPDv9slEMcWsK4XlDe0KipstFOb17lobxrIzzJDpsa52PgqSaz1mi3irRT+Tz/fWAQs+mJ7Faz8ywGLcniiYZa0V+KObrMsyVDk7eOsJ9B5AVToOYF36xbf2n5w977ARz5zboMPTB0Hvhqv1Ru1W6YHIEAP4p6czzRCaaJl84cowWW8CFHBRA9289T5WmRhQI0gcxdA2KVChH9SeqC9cF6KPojNSFVvC9k2WbXsaHCQaLnph7Utjw+8OV82Wgphv225ZjD0PeIY0wDe0JwT09bK0dQfKoHWtrxK2I0gT0c92w+MIKUgr04xH6Ii6x8P1pHwQXvg1xuwq+4ul86HP/iY8mExg6sNbSSggmfgtXQQaowqPchn9bcLPDcTc3+5Bt6x7rSGCvFSKMd5Va/CZUArQ7bg5MFwwVXXSlZCb5RqM4fcj4vWNSFRRcMkvsl6d3DbZNSmsLMSAPOTJSMk50ifdeqOgW9Y1+qkzJnWXsBgYWBl4VsNmvoYQv+iIz21j0dCv5fIWEzwqeJ2r5wiTcvwauopE5wJ7suVZBFVUZV2fGan1/piiQi6HaHkTH//ti/cZNBZsiSFiivC7v4taml6VtHIrvC3AD7/ECFf9C90xRlBcIqH+l6H4l3atqlM6YMy+SjTBJbUq/nsA5YOPsSd/DKAu8CE0F/5U7MABb0EL3eTCnEPquhP07hITv98sfsW1ryfOj3x6HOMsqxJ7UMgQGiy/cpaJjW4A8nox77xBBz8RmNrJR9iZQ+agsPFygnMX9Ex0nFald8RGR4wDKEXco12zZ4k12o1SlEmhm4ZeGUkiq3mWGv7cGMsXTiabEjMLjDRdyWmMlt6JcOLlcfFkUZ7Zt7GN0AizlsE6hDsHk84WeUmJINe5LM1X3OGfkK8YBjXujv6TnODzkY7kSo1L8RG5RRYgYYXlBClg165Qe+E/rHDWewLWFDOHPqEnsG4agremad0JaNXtiKantQGXci6XR4exkrEhvIn7Cv3ntwvR8XaOCWknWU5rHXnz9//qaPCuo8nibroevyXVOBJhcGWAA/ooZMvs8jkfP9ucnht7Ele/xpXv3ky28mKFElb9Sgfz1Qi2s86DS+hVv05By8qdB1SaVVHL+qVjydw9NHxoO9KbdW5tZCN4zzM/EipCRQlfGKJTPvPE5fnHZVU5/xbbl6eXLdbUJoSEJjfU9rIUs6bTQ0NFTluuTjTqOM7emv7x3f7L5o90U6oa/afkuS6d0M6rziEwxlY6+7h8NTKe0zY70+q4k0VTXE/5foYKynDK/sW+V722V83yKRotUk7iUn0qt8ILc6jPsVmD7N0TlrXPrQKLoDlZ3JMCXVTsCE7yri+ZgDG71sAWRBftqqGrcIqi6V3sLxh3n0i1FoVyd/VOktNq1vSnbKKx50Z1zl6rdUXsEbCcK2LTulSyxZ4FWQJtWxYrc7cfKkhSKTyg85n5z2OJoQP6SToJGEvdTgYSgeGMago/H6R4QKjKARju31mAghNCS5OFy4C7VIWCkdKCBxvbshKol6x/B+8uQh5Pc+4AlTHS0n332ZefKEI+xh6/sttO+io8US/Vs9Paienk9Nl0DF30eDFQrtmZe7DPUQ7khlMurZgturuypn1UEl4UzAI+pM4zHRYheD4RCIi4rDbE7s0yuaQ4a6o/FscR0V7/ABrK75f0N+rVSvuJgIJGV8q5/cw7O90aVHL6bYGKXds9uDy/6mzZPc1h1zSdphEheMGGAmJDrA8UD/6Lljd9F0eRYUbEv1uCQDNdRoro1rZ2cT78yvzAMlf8PtAa9MTDOXhbxYLhdHvQIKye03RqKd4kcL67uYXxazQC6CvhyFpQ98ZuZbYgu2HevgfLU9eNSl1tpI/5BfAqxk7RfQyX2jZfBYtQKZ2nr+XXXTBrt3Hn0uDTijEi844bDPpVKfMNi597n5dcPu7DSUXqo6g1p6wNBBAogPPNr4yY/hBAxJM/dIQEGAUoFfazeGpJVPxZXw0TVEHza9zQmoQPT+kHjNbTBTbC5UfLBzi5KbJBG4odKWoOzc+jlTV7JeKw1XMo7OrNsCEkKj+U1qUg+r1ScjHvPFI+gAFfzZNJU/iSj92xl6mWe7z73TXUe/nqD8c1dPAZxl0nC9xepk/KF+8unyzx7kIhc/pAQDuNWD7YDPzeJGDnMg2tPa6DVrXrCsIiv7RolTJ2oNRoUVaHX3YV0+3SjF+rNAaRbeiY5nQKru8ppUzzWiBU48QBKpr0nNhZYSq/+ucmgbNvYtf5f1Thmti4fd2aCENSKpfdqMZK58tsE+wr9cuhyxdQAzqLKgfTROl+4TiTzhAUBmjAh/JtjP+bNFYZIQSptXDGlrzXQrCLRZULj2oN/wiC6lmZvQgDi7VHBuyLF4RzrDq0Ha+6D0yND6o/WM+aTCKXVmJGPJaNXa/mMcTP90UftgeKCNZsDe9FlYvgLAJ02gOlbEaw6Y23MGuTbcWugNm6d1/q16h6CYRJ/QpC9ONlBjr2N5vm99ySvktjE1HhyoqPZFTxyxfyekzsf+VU8MMSQ4+aL9Eu0PzrtJXpYYMuM2CuHn9fLciMON55C4l6lcPxho+j9HUFHVXhOeWRcVdYzsJurBQmLmL+AeGW+WpNcce+XiP8MZZhhwcpS8TdKi2E9dG8jxiw7ys9xfgoOcdeX6G6Rb6spOqsMS/Jfbf/UmkhQIF+KLaLv++oW7sbKFZM6IyKAKoz6/9fvNQVH+shNZB8uiYd7H86Ly1YKhOzTxZJjVlDRhq51bRAf3nZQdPCj4JGHgfyNGul6nVXjIIfhKrie+xYFoCh6d5LFIPdVfCXBzVgstvdTyMCEKkUZNLvpAmKLDdWEr8pZL5jC2VUF021au6m1aJNzO2Ve+foiU7rfL+wSk1arvt1TirAAO1UbRsLHYn6KnAsGvSlynKrClOncSkXobmkEg9YHlqUcCMC57wIncpkzC3ELe0eBcpOJVo4cOas10cxgvRyTBRCnAfcEiAwg/G7pwz8enJNoPp2GuFAG9bGhDCEUkSXsCdki0kVFPaQWlA4oT9pADqmsqlkT6Hxs258yvGGEweUqA/LMopR1A3u1xs1z3rmjgXRueFWrjnIsYWurV0xVNS3FklW7DoKb6uiIpC+UG5KMfBVAMao60Lh72RseL+ujruUgoLdxX17oPSQUnFI6YaN2T43LEZlSk2WoxkHdzyFVJJ1MIVnvwtUuwjsL5s6oNXcGgc8B9DkD4JmNX4LYdNpewHROCd6SpOCq2a1EZxJeCGerQt3NYiXGuRiBau0wx2nQb74x8rGu5I7veC16QJfOO/wKltxhamICAxq1JLj8JJnfF7TiRMH/Qe7EN0JhWd+wFWOiKNJ9u1n0ms6hT17ri8GrmjdkhbQcY6/mv496Lu8BRZKfpmbGscoUqi8/UEnxZWLUFAK0iActTgSglX1YIvqZqmCd8sApgEBkqwj/c7vrlxL+Lh2A4yoVAmiYHeSxJb5UjuiuX7WEnyATemJRxway+k4TscbIy+GYExweGxN6PAtcu/wzlMS9Smwyd00pYzPhPSdd2+FaPWWez3069NU3PEUT+mUT/HUnuMdin1mfr6hhkVj5/hDLKeWK1Z8kITOcIGVcxcFDPJGBTZlrPOCPuUqPks4Cxkpq73foh2g4xhd0aYYfbH03VXHn+Po2VHyu4jSXhNWQmNSUpgOZ6oBnhbK7k+RrG3IAnFLHobN6cOwOa3OfcONe5V50WYh4dvVOOUGxHBDNPC7RBFk75GKyKjlaS5Jy9LM7E5T1sBe30EpgiqO+CAH6ONUCgbb16R1gN3L956hWMTvpfWXUDRX+uDWL4f6BEDYuJAyvSRHsdBHMpTtF7Sf498JqDBtpbSiDCKRx4Gx/vnx3MK2f3DyvwNnHXZjc9gYNovNGxs3NsvNmxs3N34vBLC52bQrWW8b583ajAvrzGa/2AO7cIQ2rz91HQzoXWme+k6tUI40lXH4tDLomxajVY2e2ZDgfDfiwqi5oZDaprAcI1YHk1qxYwEI0U9ZcBz4rthxyUrp9nQO/fnZVV3HZ2M2AZq93EzM7qrT2wCILfZt4AT17jDkrRcPdXjlaG2GYpmMirBhh+ssmwBQ1ZdO/9nezfGxUE2A1FOFQ9Dk4RP6WtKtLp2GC4oHmTjYkTxuCrIHs3If6fJw3+w8BlHn/l3FF2y5ZH2sKKCy8gElTNr7xaQdxqVMVdjeTbiHtve18NgAJ/MHoY6LKBrGglxx3Fw2E0DXrOZw8H0//7c0pXxR9CDepsrQWXXBCCkPkKPj2hTEgzDjc09LR6zF63YQdblFHUSfueiFQHvk+oLeCtpAFlmvrzxPgqqlShghp9iJwysOKzCBpFTsOnBsHaJy1SvVt8MPG9ddqHslKcViHeum1RJJ/OVPl4plBmjazseWa4vmmiMBWgic8rp0qSJ+XKsWRyXV+qxOY8nOq2QYvfZ6Xp06kSmWpiZANF3D+OGCSNAVooJFjJATGuXVme2UwspXtl4g0KhSE5zZl47rVrVocvOkuMBB2hPAIMJvznAlJ/lgzALrFkBwRmScSLu8hg6c3QDgGfrISYyPGiWuCdOtMe3ClEpTy6eYW14xIr+y3TF0woNPh68ClIunmqyM/VeENgFYunWfIpdW8z83WXg+EZJeBQ++OwxlvNYIkzGb4ZOL/SM8KMQIOvGXl3g9cPMhBI+61ohWMnPOqOXIUvgOBdjROUG1tw669hlzXDnQd3/dGz1pF/NcNXext56n/rScJgs7eamXXQ9DE8T2tIuvYIS7jEq6UlLUDpV+/dHyt9gfxsQDWDo8ML4pgNRkh6bzcpeUe3Hg94Xir2sZ01585SVA4y61A2yYV5EczP5NWyw1S9Kr1ChH6SBPo1zBEiq1jMzHb/n4n/WajbljzLKrl85sc8YG28epSsXiuuVyDTq/rzz7aY3wOw6PQfAfWxojBOlfNzJy9fwpNKzNJ69G9nLZq8o0DYnRpAXqpdOlueuXe/KKj3lNY9bwkuLegoHRRS7l1yZcK9fmMXzh10LFL8Zm5RRglv8m3ka+x04j7uThsK9sDVZCZofHFJ4Lucb2p8LfQkVHw++wh4uvVM/E6uoloKZm9mB3bGWfyOP760fHLL5o65cqMF0HeZRb23phWroicxsRS18PJugOi4IOt42IvLPvxw0cUHddBz7KuqqPCwsZfFcLHfMGcwHq41I7cUvwB6O7s2orSA1W14V25ZkpLBEnzfUYe8fsgj7v2dRg+XEs5NVV10EgN/wVdCzl2MDvAECsL1UPvvsSJwshy1evElM3qcn1SXeucLZ+UX07MvuXoVPYChs2lk2AkfNBk7oRGJzFga+TQsjSefT0tEZ9vpxBAMu4JvNxrYpf1gJK1Np+tr2IjZDRfJqIEGQbGNtheAe5Nm6XwaSBDxeRkCqLYFlokVIn5NomktFrmo788PgkLhw9l+UkKusif1GirF6PlAOJxlilOcNETJZY9IF80n/52HF2AmhzCrS48KtYaubFZP7IZ849zd1nnzr5hou55QDzTWY04O1Hd8up2hZDGR7YvVMJ8A5LUnTbNtJ1+G7ika6OiLjb/DiK8gc/vbjZ2z4ZfHGYP38siw5BRm3UxP2lnDmry595zeEVwI9eW2g6rgS39Wv5igauoJemASWiqdvERpV/yQ9RjglYzkNFOQ8SznpDT8DDsrwFdpFjgVzYSdMk89Z2LVUYbGUtm8tWCFt1Eo5xR3Mz4QMum2tX6+EhkvMW5skjdKDgR6ztLEvcFAf0E3Jz0K+Gc/ZzvX+23aZMgbTgA3InD+EOad8GfCynzxRGpnv78IePQWlVnSaTty8lXPx5rurAOmHGPDg3YtGSjI28ARjc7d/Rl3TrzA+/lAGVC3YZ0uPkYDE6QRHsPasdro3tnEUkofohYdyjHwQ5/pC5fX7A/4qL8RVcrggLhrNNyTbzekt4HGOM9FabPZYbngFk46K2wRpmHf85TG0jN8zXNCTyrnWqh9+vaVrCItFKSbEGPIv44ojIlWvjHNmX4zxY1OgpOvUSC8oA79uHZJIDPGeFxxFspuw6xIFLqZGp18iRgDdrbgNMXvLcj1BmWQTXxOAp6xv2bQiT9QirjFhYVZyWKVCC4ESuFsjhAWxn4AN9wXlfhMI2HZTQbVuMsKvavMUteEG3Uwu8IDcgdbidWVbrwNW4WXr5a/wWTpr4oWPbTxoAPlt1C0ijs5IlLLo7HlurH1CKfqPWaLkTYjyOTdu+qeOeppT4po39hN6ZZqkLfXuU1SidlOUhMVt5En5baue4Vl4D/py5WYTcGAq7rsW6kyTkam6tPoWDBiQevXuHRcA0LwxEJiih1LJU/8qALGHDkTlix6lAZYUHCIhLXKUjlvK9EG5E8uChLBei4n5snK/K3b6aa3kaKp6wNq1P6K+ca52LIMqCZQtnxwsjk/7qY8YiGI9szC9fYhMw9HZuLA0IUXSEr06jXygerQMyOpGjnOWUevTJsvQzFL0Wolo5bpl2H/inVP6dvpXhjoxtHQVKI3kIyuhf/C1duRk26jB3WjyiDd9ddmxtLIg3PbIqV5LYXy+4tCC8Hu2iNzn1eqDby41XGs0Rh5hkGGQARw+lkAEsk3592qx87S2cdd8pqtfptXuhc/0f8/N1gIuMTw5aVkubXHSk/zhL/jR06emTZY4CyK2pwvpNd1bgUPgJhrpd+lP/txgRwFUZV1VlEWAHlQxRkbKIYKptordSAjLuuc+Ywu/h/UBQz3YyAxdvdvSeDz6acsstUeaduxGgySFon0ardOdWsi998tz067ZbZ6dXY71KDvp7PvEbcX8/HtVXGZu86OlhmchsW7nlnM85zwPkyw73SjkxOdbRbEaZRkFOfM2QH2XFaFKBTzHcaRcmWQo=","base64")).toString()),tG)});var i1e=_((aG,lG)=>{(function(t){aG&&typeof aG=="object"&&typeof lG<"u"?lG.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var l1e=_((JXt,a1e)=>{"use strict";cG.ifExists=$It;var YC=ve("util"),oc=ve("path"),s1e=i1e(),JIt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,XIt={createPwshFile:!0,createCmdFile:s1e(),fs:ve("fs")},ZIt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function o1e(t){let e={...XIt,...t},r=e.fs;return e.fs_={chmod:r.chmod?YC.promisify(r.chmod):async()=>{},mkdir:YC.promisify(r.mkdir),readFile:YC.promisify(r.readFile),stat:YC.promisify(r.stat),unlink:YC.promisify(r.unlink),writeFile:YC.promisify(r.writeFile)},e}async function cG(t,e,r){let o=o1e(r);await o.fs_.stat(t),await t1t(t,e,o)}function $It(t,e,r){return cG(t,e,r).catch(()=>{})}function e1t(t,e){return e.fs_.unlink(t).catch(()=>{})}async function t1t(t,e,r){let o=await o1t(t,r);return await r1t(e,r),n1t(t,e,o,r)}function r1t(t,e){return e.fs_.mkdir(oc.dirname(t),{recursive:!0})}function n1t(t,e,r,o){let a=o1e(o),n=[{generator:c1t,extension:""}];return a.createCmdFile&&n.push({generator:l1t,extension:".cmd"}),a.createPwshFile&&n.push({generator:u1t,extension:".ps1"}),Promise.all(n.map(u=>a1t(t,e+u.extension,r,u.generator,a)))}function i1t(t,e){return e1t(t,e)}function s1t(t,e){return A1t(t,e)}async function o1t(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(JIt);if(!a){let n=oc.extname(t).toLowerCase();return{program:ZIt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function a1t(t,e,r,o,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",u=[r.additionalArgs,n].filter(A=>A).join(" ");return a=Object.assign({},a,{prog:r.program,args:u}),await i1t(e,a),await a.fs_.writeFile(e,o(t,e,a),"utf8"),s1t(e,a)}function l1t(t,e,r){let a=oc.relative(oc.dirname(e),t).split("/").join("\\"),n=oc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,u,A=r.prog,p=r.args||"",h=uG(r.nodePath).win32;A?(u=`"%~dp0\\${A}.exe"`,a=n):(A=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",I=h?`@SET NODE_PATH=${h}\r +`:"";return u?I+=`@IF EXIST ${u} (\r + ${u} ${p} ${a} ${E}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${A} ${p} ${a} ${E}%*\r +)\r +`:I+=`@${A} ${p} ${a} ${E}%*\r +`,I}function c1t(t,e,r){let o=oc.relative(oc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;o=o.split("\\").join("/");let u=oc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,A=r.args||"",p=uG(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,o=u):(a=u,A="",o="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,I=r.nodePath?`export NODE_PATH="${p}" +`:"";return n?E+=`${I}if [ -x ${n} ]; then + exec ${n} ${A} ${o} ${h}"$@" +else + exec ${a} ${A} ${o} ${h}"$@" +fi +`:E+=`${I}${a} ${A} ${o} ${h}"$@" +exit $? +`,E}function u1t(t,e,r){let o=oc.relative(oc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,u;o=o.split("\\").join("/");let A=oc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,p=r.args||"",h=uG(r.nodePath),E=h.win32,I=h.posix;n?(u=`"$basedir/${r.prog}$exe"`,o=A):(n=A,p="",o="");let v=r.progArgs?`${r.progArgs.join(" ")} `:"",x=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${E}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return r.nodePath&&(x+=` else { + $env:NODE_PATH="${I}" +}`),u?x+=` +$ret=0 +if (Test-Path ${u}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${u} ${p} ${o} ${v}$args + } else { + & ${u} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args + } else { + & ${n} ${p} ${o} ${v}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:x+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${n} ${p} ${o} ${v}$args +} else { + & ${n} ${p} ${o} ${v}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,x}function A1t(t,e){return e.fs_.chmod(t,493)}function uG(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(oc.delimiter):Array.from(t),r={};for(let o=0;o`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}a1e.exports=cG});var vG=_((m$t,x1e)=>{x1e.exports=ve("stream")});var R1e=_((y$t,F1e)=>{"use strict";function k1e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function M1t(t){for(var e=1;e0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var o=this.head,a=""+o.data;o=o.next;)a+=r+o.data;return a}},{key:"concat",value:function(r){if(this.length===0)return xQ.alloc(0);for(var o=xQ.allocUnsafe(r>>>0),a=this.head,n=0;a;)Y1t(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:"consume",value:function(r,o){var a;return ru.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var o=xQ.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:j1t,value:function(r,o){return DG(this,M1t({},o,{depth:0,customInspect:!1}))}}]),t}()});var SG=_((E$t,L1e)=>{"use strict";function W1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(PG,this,t)):process.nextTick(PG,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(kQ,r):(r._writableState.errorEmitted=!0,process.nextTick(T1e,r,n)):process.nextTick(T1e,r,n):e?(process.nextTick(kQ,r),e(n)):process.nextTick(kQ,r)}),this)}function T1e(t,e){PG(t,e),kQ(t)}function kQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function K1t(){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)}function PG(t,e){t.emit("error",e)}function z1t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit("error",e)}L1e.exports={destroy:W1t,undestroy:K1t,errorOrDestroy:z1t}});var F0=_((C$t,M1e)=>{"use strict";var O1e={};function lc(t,e,r){r||(r=Error);function o(n,u,A){return typeof e=="string"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,O1e[t]=a}function N1e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function V1t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function J1t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function X1t(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}lc("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);lc("ERR_INVALID_ARG_TYPE",function(t,e,r){let o;typeof e=="string"&&V1t(e,"not ")?(o="must not be",e=e.replace(/^not /,"")):o="must be";let a;if(J1t(t," argument"))a=`The ${t} ${o} ${N1e(e,"type")}`;else{let n=X1t(t,".")?"property":"argument";a=`The "${t}" ${n} ${o} ${N1e(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);lc("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");lc("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});lc("ERR_STREAM_PREMATURE_CLOSE","Premature close");lc("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});lc("ERR_MULTIPLE_CALLBACK","Callback called multiple times");lc("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");lc("ERR_STREAM_WRITE_AFTER_END","write after end");lc("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);lc("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);lc("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");M1e.exports.codes=O1e});var bG=_((w$t,U1e)=>{"use strict";var Z1t=F0().codes.ERR_INVALID_OPT_VALUE;function $1t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function e2t(t,e,r,o){var a=$1t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:"highWaterMark";throw new Z1t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}U1e.exports={getHighWaterMark:e2t}});var _1e=_((I$t,xG)=>{typeof Object.create=="function"?xG.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:xG.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var R0=_((B$t,QG)=>{try{if(kG=ve("util"),typeof kG.inherits!="function")throw"";QG.exports=kG.inherits}catch{QG.exports=_1e()}var kG});var q1e=_((v$t,H1e)=>{H1e.exports=ve("util").deprecate});var TG=_((D$t,z1e)=>{"use strict";z1e.exports=Ri;function j1e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){S2t(e,t)}}var JC;Ri.WritableState=mv;var t2t={deprecate:q1e()},Y1e=vG(),FQ=ve("buffer").Buffer,r2t=global.Uint8Array||function(){};function n2t(t){return FQ.from(t)}function i2t(t){return FQ.isBuffer(t)||t instanceof r2t}var RG=SG(),s2t=bG(),o2t=s2t.getHighWaterMark,T0=F0().codes,a2t=T0.ERR_INVALID_ARG_TYPE,l2t=T0.ERR_METHOD_NOT_IMPLEMENTED,c2t=T0.ERR_MULTIPLE_CALLBACK,u2t=T0.ERR_STREAM_CANNOT_PIPE,A2t=T0.ERR_STREAM_DESTROYED,f2t=T0.ERR_STREAM_NULL_VALUES,p2t=T0.ERR_STREAM_WRITE_AFTER_END,h2t=T0.ERR_UNKNOWN_ENCODING,XC=RG.errorOrDestroy;R0()(Ri,Y1e);function g2t(){}function mv(t,e,r){JC=JC||Cm(),t=t||{},typeof r!="boolean"&&(r=e instanceof JC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=o2t(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){I2t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new j1e(this)}mv.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(mv.prototype,"buffer",{get:t2t.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var QQ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(QQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Ri,Symbol.hasInstance,{value:function(e){return QQ.call(this,e)?!0:this!==Ri?!1:e&&e._writableState instanceof mv}})):QQ=function(e){return e instanceof this};function Ri(t){JC=JC||Cm();var e=this instanceof JC;if(!e&&!QQ.call(Ri,this))return new Ri(t);this._writableState=new mv(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),Y1e.call(this)}Ri.prototype.pipe=function(){XC(this,new u2t)};function d2t(t,e){var r=new p2t;XC(t,r),process.nextTick(e,r)}function m2t(t,e,r,o){var a;return r===null?a=new f2t:typeof r!="string"&&!e.objectMode&&(a=new a2t("chunk",["string","Buffer"],r)),a?(XC(t,a),process.nextTick(o,a),!1):!0}Ri.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&i2t(t);return n&&!FQ.isBuffer(t)&&(t=n2t(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=o.defaultEncoding),typeof r!="function"&&(r=g2t),o.ending?d2t(this,r):(n||m2t(this,o,t,r))&&(o.pendingcb++,a=E2t(this,o,n,t,e,r)),a};Ri.prototype.cork=function(){this._writableState.corked++};Ri.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&W1e(this,t))};Ri.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new h2t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Ri.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function y2t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=FQ.from(e,r)),e}Object.defineProperty(Ri.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function E2t(t,e,r,o,a,n){if(!r){var u=y2t(e,o,a);o!==u&&(r=!0,a="buffer",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length{"use strict";var b2t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};J1e.exports=EA;var V1e=OG(),NG=TG();R0()(EA,V1e);for(LG=b2t(NG.prototype),RQ=0;RQ{var LQ=ve("buffer"),sp=LQ.Buffer;function X1e(t,e){for(var r in t)e[r]=t[r]}sp.from&&sp.alloc&&sp.allocUnsafe&&sp.allocUnsafeSlow?Z1e.exports=LQ:(X1e(LQ,MG),MG.Buffer=ZC);function ZC(t,e,r){return sp(t,e,r)}X1e(sp,ZC);ZC.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return sp(t,e,r)};ZC.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var o=sp(t);return e!==void 0?typeof r=="string"?o.fill(e,r):o.fill(e):o.fill(0),o};ZC.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return sp(t)};ZC.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return LQ.SlowBuffer(t)}});var HG=_(t2e=>{"use strict";var _G=$1e().Buffer,e2e=_G.isEncoding||function(t){switch(t=""+t,t&&t.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 Q2t(t){if(!t)return"utf8";for(var e;;)switch(t){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 t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function F2t(t){var e=Q2t(t);if(typeof e!="string"&&(_G.isEncoding===e2e||!e2e(t)))throw new Error("Unknown encoding: "+t);return e||t}t2e.StringDecoder=yv;function yv(t){this.encoding=F2t(t);var e;switch(this.encoding){case"utf16le":this.text=M2t,this.end=U2t,e=4;break;case"utf8":this.fillLast=L2t,e=4;break;case"base64":this.text=_2t,this.end=H2t,e=3;break;default:this.write=q2t,this.end=G2t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=_G.allocUnsafe(e)}yv.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function R2t(t,e,r){var o=e.length-1;if(o=0?(a>0&&(t.lastNeed=a-1),a):--o=0?(a>0&&(t.lastNeed=a-2),a):--o=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function T2t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function L2t(t){var e=this.lastTotal-this.lastNeed,r=T2t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function N2t(t,e){var r=R2t(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString("utf8",e,o)}function O2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function M2t(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function U2t(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function _2t(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function H2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function q2t(t){return t.toString(this.encoding)}function G2t(t){return t&&t.length?this.write(t):""}});var NQ=_((b$t,i2e)=>{"use strict";var r2e=F0().codes.ERR_STREAM_PREMATURE_CLOSE;function j2t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a{"use strict";var OQ;function L0(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var K2t=NQ(),N0=Symbol("lastResolve"),wm=Symbol("lastReject"),Ev=Symbol("error"),MQ=Symbol("ended"),Im=Symbol("lastPromise"),qG=Symbol("handlePromise"),Bm=Symbol("stream");function O0(t,e){return{value:t,done:e}}function z2t(t){var e=t[N0];if(e!==null){var r=t[Bm].read();r!==null&&(t[Im]=null,t[N0]=null,t[wm]=null,e(O0(r,!1)))}}function V2t(t){process.nextTick(z2t,t)}function J2t(t,e){return function(r,o){t.then(function(){if(e[MQ]){r(O0(void 0,!0));return}e[qG](r,o)},o)}}var X2t=Object.getPrototypeOf(function(){}),Z2t=Object.setPrototypeOf((OQ={get stream(){return this[Bm]},next:function(){var e=this,r=this[Ev];if(r!==null)return Promise.reject(r);if(this[MQ])return Promise.resolve(O0(void 0,!0));if(this[Bm].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[Ev]?A(e[Ev]):u(O0(void 0,!0))})});var o=this[Im],a;if(o)a=new Promise(J2t(o,this));else{var n=this[Bm].read();if(n!==null)return Promise.resolve(O0(n,!1));a=new Promise(this[qG])}return this[Im]=a,a}},L0(OQ,Symbol.asyncIterator,function(){return this}),L0(OQ,"return",function(){var e=this;return new Promise(function(r,o){e[Bm].destroy(null,function(a){if(a){o(a);return}r(O0(void 0,!0))})})}),OQ),X2t),$2t=function(e){var r,o=Object.create(Z2t,(r={},L0(r,Bm,{value:e,writable:!0}),L0(r,N0,{value:null,writable:!0}),L0(r,wm,{value:null,writable:!0}),L0(r,Ev,{value:null,writable:!0}),L0(r,MQ,{value:e._readableState.endEmitted,writable:!0}),L0(r,qG,{value:function(n,u){var A=o[Bm].read();A?(o[Im]=null,o[N0]=null,o[wm]=null,n(O0(A,!1))):(o[N0]=n,o[wm]=u)},writable:!0}),r));return o[Im]=null,K2t(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=o[wm];n!==null&&(o[Im]=null,o[N0]=null,o[wm]=null,n(a)),o[Ev]=a;return}var u=o[N0];u!==null&&(o[Im]=null,o[N0]=null,o[wm]=null,u(O0(void 0,!0))),o[MQ]=!0}),e.on("readable",V2t.bind(null,o)),o};s2e.exports=$2t});var u2e=_((k$t,c2e)=>{"use strict";function a2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function eBt(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){a2e(n,o,a,u,A,"next",p)}function A(p){a2e(n,o,a,u,A,"throw",p)}u(void 0)})}}function l2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function tBt(t){for(var e=1;e{"use strict";C2e.exports=mn;var $C;mn.ReadableState=h2e;var Q$t=ve("events").EventEmitter,p2e=function(e,r){return e.listeners(r).length},wv=vG(),UQ=ve("buffer").Buffer,sBt=global.Uint8Array||function(){};function oBt(t){return UQ.from(t)}function aBt(t){return UQ.isBuffer(t)||t instanceof sBt}var GG=ve("util"),en;GG&&GG.debuglog?en=GG.debuglog("stream"):en=function(){};var lBt=R1e(),JG=SG(),cBt=bG(),uBt=cBt.getHighWaterMark,_Q=F0().codes,ABt=_Q.ERR_INVALID_ARG_TYPE,fBt=_Q.ERR_STREAM_PUSH_AFTER_EOF,pBt=_Q.ERR_METHOD_NOT_IMPLEMENTED,hBt=_Q.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,ew,jG,YG;R0()(mn,wv);var Cv=JG.errorOrDestroy,WG=["error","close","destroy","pause","resume"];function gBt(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function h2e(t,e,r){$C=$C||Cm(),t=t||{},typeof r!="boolean"&&(r=e instanceof $C),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=uBt(this,t,"readableHighWaterMark",r),this.buffer=new lBt,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=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(ew||(ew=HG().StringDecoder),this.decoder=new ew(t.encoding),this.encoding=t.encoding)}function mn(t){if($C=$C||Cm(),!(this instanceof mn))return new mn(t);var e=this instanceof $C;this._readableState=new h2e(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),wv.call(this)}Object.defineProperty(mn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});mn.prototype.destroy=JG.destroy;mn.prototype._undestroy=JG.undestroy;mn.prototype._destroy=function(t,e){e(t)};mn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=UQ.from(t,e),e=""),o=!0),g2e(this,t,e,!1,o)};mn.prototype.unshift=function(t){return g2e(this,t,null,!0,!1)};function g2e(t,e,r,o,a){en("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,yBt(t,n);else{var u;if(a||(u=dBt(n,e)),u)Cv(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==UQ.prototype&&(e=oBt(e)),o)n.endEmitted?Cv(t,new hBt):KG(t,n,e,!0);else if(n.ended)Cv(t,new fBt);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?KG(t,n,e,!1):VG(t,n)):KG(t,n,e,!1)}else o||(n.reading=!1,VG(t,n))}return!n.ended&&(n.length=A2e?t=A2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function f2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=mBt(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}mn.prototype.read=function(t){en("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return en("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?zG(this):HQ(this),null;if(t=f2e(t,e),t===0&&e.ended)return e.length===0&&zG(this),null;var o=e.needReadable;en("need readable",o),(e.length===0||e.length-t0?a=y2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&zG(this)),a!==null&&this.emit("data",a),a};function yBt(t,e){if(en("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?HQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,d2e(t)))}}function HQ(t){var e=t._readableState;en("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(en("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(d2e,t))}function d2e(t){var e=t._readableState;en("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,XG(t)}function VG(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(EBt,t,e))}function EBt(t,e){for(;!e.reading&&!e.ended&&(e.length1&&E2e(o.pipes,t)!==-1)&&!h&&(en("false write response, pause",o.awaitDrain),o.awaitDrain++),r.pause())}function v(N){en("onerror",N),R(),t.removeListener("error",v),p2e(t,"error")===0&&Cv(t,N)}gBt(t,"error",v);function x(){t.removeListener("finish",C),R()}t.once("close",x);function C(){en("onfinish"),t.removeListener("close",x),R()}t.once("finish",C);function R(){en("unpipe"),r.unpipe(t)}return t.emit("pipe",r),o.flowing||(en("pipe resume"),r.resume()),t};function CBt(t){return function(){var r=t._readableState;en("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&p2e(t,"data")&&(r.flowing=!0,XG(t))}}mn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,o.flowing!==!1&&this.resume()):t==="readable"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,en("on readable",o.length,o.reading),o.length?HQ(this):o.reading||process.nextTick(wBt,this)),r};mn.prototype.addListener=mn.prototype.on;mn.prototype.removeListener=function(t,e){var r=wv.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(m2e,this),r};mn.prototype.removeAllListeners=function(t){var e=wv.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(m2e,this),e};function m2e(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function wBt(t){en("readable nexttick read 0"),t.read(0)}mn.prototype.resume=function(){var t=this._readableState;return t.flowing||(en("resume"),t.flowing=!t.readableListening,IBt(this,t)),t.paused=!1,this};function IBt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(BBt,t,e))}function BBt(t,e){en("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),XG(t),e.flowing&&!e.reading&&t.read(0)}mn.prototype.pause=function(){return en("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(en("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function XG(t){var e=t._readableState;for(en("flow",e.flowing);e.flowing&&t.read()!==null;);}mn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on("end",function(){if(en("wrapped end"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on("data",function(u){if(en("wrapped data"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function zG(t){var e=t._readableState;en("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(vBt,e,t))}function vBt(t,e){if(en("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(mn.from=function(t,e){return YG===void 0&&(YG=u2e()),YG(mn,t,e)});function E2e(t,e){for(var r=0,o=t.length;r{"use strict";I2e.exports=op;var qQ=F0().codes,DBt=qQ.ERR_METHOD_NOT_IMPLEMENTED,PBt=qQ.ERR_MULTIPLE_CALLBACK,SBt=qQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,bBt=qQ.ERR_TRANSFORM_WITH_LENGTH_0,GQ=Cm();R0()(op,GQ);function xBt(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit("error",new PBt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";v2e.exports=Iv;var B2e=ZG();R0()(Iv,B2e);function Iv(t){if(!(this instanceof Iv))return new Iv(t);B2e.call(this,t)}Iv.prototype._transform=function(t,e,r){r(null,t)}});var k2e=_((L$t,x2e)=>{"use strict";var $G;function QBt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var b2e=F0().codes,FBt=b2e.ERR_MISSING_ARGS,RBt=b2e.ERR_STREAM_DESTROYED;function P2e(t){if(t)throw t}function TBt(t){return t.setHeader&&typeof t.abort=="function"}function LBt(t,e,r,o){o=QBt(o);var a=!1;t.on("close",function(){a=!0}),$G===void 0&&($G=NQ()),$G(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,TBt(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();o(u||new RBt("pipe"))}}}function S2e(t){t()}function NBt(t,e){return t.pipe(e)}function OBt(t){return!t.length||typeof t[t.length-1]!="function"?P2e:t.pop()}function MBt(){for(var t=arguments.length,e=new Array(t),r=0;r0;return LBt(u,p,h,function(E){a||(a=E),E&&n.forEach(S2e),!p&&(n.forEach(S2e),o(a))})});return e.reduce(NBt)}x2e.exports=MBt});var tw=_((cc,vv)=>{var Bv=ve("stream");process.env.READABLE_STREAM==="disable"&&Bv?(vv.exports=Bv.Readable,Object.assign(vv.exports,Bv),vv.exports.Stream=Bv):(cc=vv.exports=OG(),cc.Stream=Bv||cc,cc.Readable=cc,cc.Writable=TG(),cc.Duplex=Cm(),cc.Transform=ZG(),cc.PassThrough=D2e(),cc.finished=NQ(),cc.pipeline=k2e())});var R2e=_((N$t,F2e)=>{"use strict";var{Buffer:cu}=ve("buffer"),Q2e=Symbol.for("BufferList");function ni(t){if(!(this instanceof ni))return new ni(t);ni._init.call(this,t)}ni._init=function(e){Object.defineProperty(this,Q2e,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};ni.prototype._new=function(e){return new ni(e)};ni.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;othis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};ni.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};ni.prototype.copy=function(e,r,o,a){if((typeof o!="number"||o<0)&&(o=0),(typeof a!="number"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||cu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:cu.concat(this._bufs,this.length);for(let I=0;Iv)this._bufs[I].copy(e,h,E),h+=v;else{this._bufs[I].copy(e,h,E,E+p),h+=v;break}p-=v,E&&(E=0)}return e.length>h?e.slice(0,h):e};ni.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};ni.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};ni.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};ni.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};ni.prototype._match=function(t,e){if(this.length-t{"use strict";var ej=tw().Duplex,UBt=R0(),Dv=R2e();function Uo(t){if(!(this instanceof Uo))return new Uo(t);if(typeof t=="function"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on("pipe",function(o){o.on("error",e)}),this.on("unpipe",function(o){o.removeListener("error",e)}),t=null}Dv._init.call(this,t),ej.call(this)}UBt(Uo,ej);Object.assign(Uo.prototype,Dv.prototype);Uo.prototype._new=function(e){return new Uo(e)};Uo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o=="function"&&o()};Uo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Uo.prototype.end=function(e){ej.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Uo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Uo.prototype._isBufferList=function(e){return e instanceof Uo||e instanceof Dv||Uo.isBufferList(e)};Uo.isBufferList=Dv.isBufferList;jQ.exports=Uo;jQ.exports.BufferListStream=Uo;jQ.exports.BufferList=Dv});var nj=_(nw=>{var _Bt=Buffer.alloc,HBt="0000000000000000000",qBt="7777777777777777777",L2e="0".charCodeAt(0),N2e=Buffer.from("ustar\0","binary"),GBt=Buffer.from("00","binary"),jBt=Buffer.from("ustar ","binary"),YBt=Buffer.from(" \0","binary"),WBt=parseInt("7777",8),Pv=257,rj=263,KBt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},zBt=function(t){switch(t){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},VBt=function(t){switch(t){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},O2e=function(t,e,r,o){for(;re?qBt.slice(0,e)+" ":HBt.slice(0,e-t.length)+t+" "};function JBt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o=Math.pow(10,r)&&r++,e+r+t};nw.decodeLongPath=function(t,e){return rw(t,0,t.length,e)};nw.encodePax=function(t){var e="";t.name&&(e+=tj(" path="+t.name+` +`)),t.linkname&&(e+=tj(" linkpath="+t.linkname+` +`));var r=t.pax;if(r)for(var o in r)e+=tj(" "+o+"="+r[o]+` +`);return Buffer.from(e)};nw.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;o+=o?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(M0(t.mode&WBt,6),100),e.write(M0(t.uid,6),108),e.write(M0(t.gid,6),116),e.write(M0(t.size,11),124),e.write(M0(t.mtime.getTime()/1e3|0,11),136),e[156]=L2e+VBt(t.type),t.linkname&&e.write(t.linkname,157),N2e.copy(e,Pv),GBt.copy(e,rj),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(M0(t.devmajor||0,6),329),e.write(M0(t.devminor||0,6),337),o&&e.write(o,345),e.write(M0(M2e(e),6),148),e)};nw.decode=function(t,e,r){var o=t[156]===0?0:t[156]-L2e,a=rw(t,0,100,e),n=U0(t,100,8),u=U0(t,108,8),A=U0(t,116,8),p=U0(t,124,12),h=U0(t,136,12),E=zBt(o),I=t[157]===0?null:rw(t,157,100,e),v=rw(t,265,32),x=rw(t,297,32),C=U0(t,329,8),R=U0(t,337,8),N=M2e(t);if(N===8*32)return null;if(N!==U0(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(N2e.compare(t,Pv,Pv+6)===0)t[345]&&(a=rw(t,345,155,e)+"/"+a);else if(!(jBt.compare(t,Pv,Pv+6)===0&&YBt.compare(t,rj,rj+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return o===0&&a&&a[a.length-1]==="/"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:I,uname:v,gname:x,devmajor:C,devminor:R}}});var Y2e=_((U$t,j2e)=>{var _2e=ve("util"),XBt=T2e(),Sv=nj(),H2e=tw().Writable,q2e=tw().PassThrough,G2e=function(){},U2e=function(t){return t&=511,t&&512-t},ZBt=function(t,e){var r=new YQ(t,e);return r.end(),r},$Bt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},YQ=function(t,e){this._parent=t,this.offset=e,q2e.call(this,{autoDestroy:!1})};_2e.inherits(YQ,q2e);YQ.prototype.destroy=function(t){this._parent.destroy(t)};var ap=function(t){if(!(this instanceof ap))return new ap(t);H2e.call(this,t),t=t||{},this._offset=0,this._buffer=XBt(),this._missing=0,this._partial=!1,this._onparse=G2e,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 e=this,r=e._buffer,o=function(){e._continue()},a=function(v){if(e._locked=!1,v)return e.destroy(v);e._stream||o()},n=function(){e._stream=null;var v=U2e(e._header.size);v?e._parse(v,u):e._parse(512,I),e._locked||o()},u=function(){e._buffer.consume(U2e(e._header.size)),e._parse(512,I),o()},A=function(){var v=e._header.size;e._paxGlobal=Sv.decodePax(r.slice(0,v)),r.consume(v),n()},p=function(){var v=e._header.size;e._pax=Sv.decodePax(r.slice(0,v)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(v),n()},h=function(){var v=e._header.size;this._gnuLongPath=Sv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},E=function(){var v=e._header.size;this._gnuLongLinkPath=Sv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},I=function(){var v=e._offset,x;try{x=e._header=Sv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit("error",C)}if(r.consume(512),!x){e._parse(512,I),o();return}if(x.type==="gnu-long-path"){e._parse(x.size,h),o();return}if(x.type==="gnu-long-link-path"){e._parse(x.size,E),o();return}if(x.type==="pax-global-header"){e._parse(x.size,A),o();return}if(x.type==="pax-header"){e._parse(x.size,p),o();return}if(e._gnuLongPath&&(x.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(x.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=x=$Bt(x,e._pax),e._pax=null),e._locked=!0,!x.size||x.type==="directory"){e._parse(512,I),e.emit("entry",x,ZBt(e,v),a);return}e._stream=new YQ(e,v),e.emit("entry",x,e._stream,a),e._parse(x.size,n),o()};this._onheader=I,this._parse(512,I)};_2e.inherits(ap,H2e);ap.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};ap.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};ap.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=G2e,this._overflow?this._write(this._overflow,void 0,t):t()}};ap.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};ap.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};j2e.exports=ap});var K2e=_((_$t,W2e)=>{W2e.exports=ve("fs").constants||ve("constants")});var Z2e=_((H$t,X2e)=>{var iw=K2e(),z2e=NM(),KQ=R0(),evt=Buffer.alloc,V2e=tw().Readable,sw=tw().Writable,tvt=ve("string_decoder").StringDecoder,WQ=nj(),rvt=parseInt("755",8),nvt=parseInt("644",8),J2e=evt(1024),sj=function(){},ij=function(t,e){e&=511,e&&t.push(J2e.slice(0,512-e))};function ivt(t){switch(t&iw.S_IFMT){case iw.S_IFBLK:return"block-device";case iw.S_IFCHR:return"character-device";case iw.S_IFDIR:return"directory";case iw.S_IFIFO:return"fifo";case iw.S_IFLNK:return"symlink"}return"file"}var zQ=function(t){sw.call(this),this.written=0,this._to=t,this._destroyed=!1};KQ(zQ,sw);zQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};zQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var VQ=function(){sw.call(this),this.linkname="",this._decoder=new tvt("utf-8"),this._destroyed=!1};KQ(VQ,sw);VQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};VQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var bv=function(){sw.call(this),this._destroyed=!1};KQ(bv,sw);bv.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};bv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var CA=function(t){if(!(this instanceof CA))return new CA(t);V2e.call(this,t),this._drain=sj,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};KQ(CA,V2e);CA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=sj);var o=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=ivt(t.mode)),t.mode||(t.mode=t.type==="directory"?rvt:nvt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return ij(o,t.size),a?process.nextTick(r):this._drain=r,new bv}if(t.type==="symlink"&&!t.linkname){var n=new VQ;return z2e(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new bv;var u=new zQ(this);return this._stream=u,z2e(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error("size mismatch"));ij(o,t.size),o._finalizing&&o.finalize(),r()}),u}};CA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(J2e),this.push(null))};CA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};CA.prototype._encode=function(t){if(!t.pax){var e=WQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};CA.prototype._encodePax=function(t){var e=WQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(WQ.encode(r)),this.push(e),ij(this,e.length),r.size=t.size,r.type=t.type,this.push(WQ.encode(r))};CA.prototype._read=function(t){var e=this._drain;this._drain=sj,e()};X2e.exports=CA});var $2e=_(oj=>{oj.extract=Y2e();oj.pack=Z2e()});var ABe=_((aer,uBe)=>{"use strict";var vm=class{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]=="string"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=lBe(o.filter(a=>a!=null&&typeof a=="object")),this.__isFiggyPudding=!0}get(e){return fj(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):Evt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new vm(this.__specs,this.__opts,lBe(this.__providers).concat(e)),cBe)}};try{let t=ve("util");vm.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch{}function mvt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function fj(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))mvt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=aBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=aBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default=="function"?o.default(t):o.default:a}}function aBe(t,e){let r;return e.__isFiggyPudding?r=fj(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var cBe={has(t,e){return e in t.__specs&&fj(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in vm.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=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.")}};uBe.exports=yvt;function yvt(t,e){function r(...o){return new Proxy(new vm(t,e,o),cBe)}return r}function lBe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function Evt(t){return Object.keys(t).map(e=>[e,t[e]])}});var hBe=_((ler,BA)=>{"use strict";var kv=ve("crypto"),Cvt=ABe(),wvt=ve("stream").Transform,fBe=["sha256","sha384","sha512"],Ivt=/^[a-z0-9+/]+(?:=?=?)$/i,Bvt=/^([^-]+)-([^?]+)([?\S*]*)$/,vvt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,Dvt=/^[\x21-\x7E]+$/,ia=Cvt({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>Rvt},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),H0=class{get isHash(){return!0}constructor(e,r){r=ia(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?vvt:Bvt);if(!a||o&&!fBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let 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=ia(e),e.strict&&!(fBe.some(o=>o===this.algorithm)&&this.digest.match(Ivt)&&(this.options||[]).every(o=>o.match(Dvt))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Dm=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=ia(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(o=>this[o].map(a=>H0.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=ia(r);let o=typeof e=="string"?e:xv(e,r);return IA(`${this.toString(r)} ${o}`,r)}hexDigest(){return IA(this,{single:!0}).hexDigest()}match(e,r){r=ia(r);let o=IA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=ia(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};BA.exports.parse=IA;function IA(t,e){if(e=ia(e),typeof t=="string")return pj(t,e);if(t.algorithm&&t.digest){let r=new Dm;return r[t.algorithm]=[t],pj(xv(r,e),e)}else return pj(xv(t,e),e)}function pj(t,e){return e.single?new H0(t,e):t.trim().split(/\s+/).reduce((r,o)=>{let a=new H0(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new Dm)}BA.exports.stringify=xv;function xv(t,e){return e=ia(e),t.algorithm&&t.digest?H0.prototype.toString.call(t,e):typeof t=="string"?xv(IA(t,e),e):Dm.prototype.toString.call(t,e)}BA.exports.fromHex=Pvt;function Pvt(t,e,r){r=ia(r);let o=r.options&&r.options.length?`?${r.options.join("?")}`:"";return IA(`${e}-${Buffer.from(t,"hex").toString("base64")}${o}`,r)}BA.exports.fromData=Svt;function Svt(t,e){e=ia(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((a,n)=>{let u=kv.createHash(n).update(t).digest("base64"),A=new H0(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new Dm)}BA.exports.fromStream=bvt;function bvt(t,e){e=ia(e);let r=e.Promise||Promise,o=hj(e);return new r((a,n)=>{t.pipe(o),t.on("error",n),o.on("error",n);let u;o.on("integrity",A=>{u=A}),o.on("end",()=>a(u)),o.on("data",()=>{})})}BA.exports.checkData=xvt;function xvt(t,e,r){if(r=ia(r),e=IA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let o=e.pickAlgorithm(r),a=kv.createHash(o).update(t).digest("base64"),n=IA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size=="number"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${t.length}`);throw A.code="EBADSIZE",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code="EINTEGRITY",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}BA.exports.checkStream=kvt;function kvt(t,e,r){r=ia(r);let o=r.Promise||Promise,a=hj(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on("error",u),a.on("error",u);let A;a.on("verified",p=>{A=p}),a.on("end",()=>n(A)),a.on("data",()=>{})})}BA.exports.integrityStream=hj;function hj(t){t=ia(t);let e=t.integrity&&IA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(kv.createHash),A=0,p=new wvt({transform(h,E,I){A+=h.length,u.forEach(v=>v.update(h,E)),I(null,h,E)}}).on("end",()=>{let h=t.options&&t.options.length?`?${t.options.join("?")}`:"",E=IA(u.map((v,x)=>`${n[x]}-${v.digest("base64")}${h}`).join(" "),t),I=r&&E.match(e,t);if(typeof t.size=="number"&&A!==t.size){let v=new Error(`stream size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${A}`);v.code="EBADSIZE",v.found=A,v.expected=t.size,v.sri=e,p.emit("error",v)}else if(t.integrity&&!I){let v=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);v.code="EINTEGRITY",v.found=E,v.expected=a,v.algorithm=o,v.sri=e,p.emit("error",v)}else p.emit("size",A),p.emit("integrity",E),I&&p.emit("verified",I)});return p}BA.exports.create=Qvt;function Qvt(t){t=ia(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",o=e.map(kv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest("base64"),h=new H0(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new Dm)}}}var Fvt=new Set(kv.getHashes()),pBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>Fvt.has(t));function Rvt(t,e){return pBe.indexOf(t.toLowerCase())>=pBe.indexOf(e.toLowerCase())?t:e}});var GBe=_((Air,qBe)=>{var RDt=cN();function TDt(t){return RDt(t)?void 0:t}qBe.exports=TDt});var YBe=_((fir,jBe)=>{var LDt=Hb(),NDt=x8(),ODt=R8(),MDt=jd(),UDt=md(),_Dt=GBe(),HDt=v_(),qDt=b8(),GDt=1,jDt=2,YDt=4,WDt=HDt(function(t,e){var r={};if(t==null)return r;var o=!1;e=LDt(e,function(n){return n=MDt(n,t),o||(o=n.length>1),n}),UDt(t,qDt(t),r),o&&(r=NDt(r,GDt|jDt|YDt,_Dt));for(var a=e.length;a--;)ODt(r,e[a]);return r});jBe.exports=WDt});Pt();Ye();Pt();var JBe=ve("child_process"),XBe=$e(rd());qt();var AC=new Map([]);var a2={};zt(a2,{BaseCommand:()=>ut,WorkspaceRequiredError:()=>nr,getCli:()=>ehe,getDynamicLibs:()=>$pe,getPluginConfiguration:()=>pC,openWorkspace:()=>fC,pluginCommands:()=>AC,runExit:()=>nk});qt();var ut=class extends nt{constructor(){super(...arguments);this.cwd=ge.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new it("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ye();Pt();qt();var nr=class extends it{constructor(e,r){let o=z.relative(e,r),a=z.join(e,Ot.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ye();Pt();iA();Nl();k1();qt();var TAt=$e(Jn());$a();var $pe=()=>new Map([["@yarnpkg/cli",a2],["@yarnpkg/core",o2],["@yarnpkg/fslib",zw],["@yarnpkg/libzip",x1],["@yarnpkg/parsers",rI],["@yarnpkg/shell",T1],["clipanion",hI],["semver",TAt],["typanion",zo]]);Ye();async function fC(t,e){let{project:r,workspace:o}=await St.find(t,e);if(!o)throw new nr(r.cwd,e);return o}Ye();Pt();iA();Nl();k1();qt();var tPt=$e(Jn());$a();var $8={};zt($8,{AddCommand:()=>Qh,BinCommand:()=>Fh,CacheCleanCommand:()=>Rh,ClipanionCommand:()=>zd,ConfigCommand:()=>Oh,ConfigGetCommand:()=>Th,ConfigSetCommand:()=>Lh,ConfigUnsetCommand:()=>Nh,DedupeCommand:()=>Mh,EntryCommand:()=>mC,ExecCommand:()=>Uh,ExplainCommand:()=>qh,ExplainPeerRequirementsCommand:()=>_h,HelpCommand:()=>Vd,InfoCommand:()=>Gh,LinkCommand:()=>Yh,NodeCommand:()=>Wh,PluginCheckCommand:()=>Kh,PluginImportCommand:()=>Jh,PluginImportSourcesCommand:()=>Xh,PluginListCommand:()=>zh,PluginRemoveCommand:()=>Zh,PluginRuntimeCommand:()=>$h,RebuildCommand:()=>e0,RemoveCommand:()=>t0,RunCommand:()=>r0,RunIndexCommand:()=>Zd,SetResolutionCommand:()=>n0,SetVersionCommand:()=>Hh,SetVersionSourcesCommand:()=>Vh,UnlinkCommand:()=>i0,UpCommand:()=>Vf,VersionCommand:()=>Jd,WhyCommand:()=>s0,WorkspaceCommand:()=>l0,WorkspacesListCommand:()=>a0,YarnCommand:()=>jh,dedupeUtils:()=>pk,default:()=>Sgt,suggestUtils:()=>Xc});var Qde=$e(rd());Ye();Ye();Ye();qt();var H0e=$e(f2());$a();var Xc={};zt(Xc,{Modifier:()=>B8,Strategy:()=>uk,Target:()=>p2,WorkspaceModifier:()=>N0e,applyModifier:()=>ept,extractDescriptorFromPath:()=>v8,extractRangeModifier:()=>O0e,fetchDescriptorFrom:()=>D8,findProjectDescriptors:()=>_0e,getModifier:()=>h2,getSuggestedDescriptors:()=>g2,makeWorkspaceDescriptor:()=>U0e,toWorkspaceModifier:()=>M0e});Ye();Ye();Pt();var I8=$e(Jn()),Zft="workspace:",p2=(o=>(o.REGULAR="dependencies",o.DEVELOPMENT="devDependencies",o.PEER="peerDependencies",o))(p2||{}),B8=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="",o))(B8||{}),N0e=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="*",o))(N0e||{}),uk=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(uk||{});function h2(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var $ft=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function O0e(t,{project:e}){let r=t.match($ft);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function ept(t,e){let{protocol:r,source:o,params:a,selector:n}=W.parseRange(t.range);return I8.default.valid(n)&&(n=`${e}${t.range}`),W.makeDescriptor(t,W.makeRange({protocol:r,source:o,params:a,selector:n}))}function M0e(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function U0e(t,e){return W.makeDescriptor(t.anchoredDescriptor,`${Zft}${M0e(e)}`)}async function _0e(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r==="peerDependencies"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function v8(t,{cwd:e,workspace:r}){return await tpt(async o=>{z.isAbsolute(t)||(t=z.relative(r.cwd,z.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await D8(W.makeIdent(null,"archive"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let u=new Qi,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),I=W.convertDescriptorToLocator(E),v=await p.fetch(I,h),x=await Ot.find(v.prefixPath,{baseFs:v.packageFs});if(!x.name)throw new Error("Target path doesn't have a name");return W.makeDescriptor(x.name,t)})}async function g2(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!=="unknown"?n||kr.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,"latest"]:["unknown",t.range]:["unknown","latest"];if(h!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${W.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let I=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,v=[],x=[],C=async R=>{try{await R()}catch(N){x.push(N)}};for(let R of A){if(v.length>=p)break;switch(R){case"keep":await C(async()=>{I&&v.push({descriptor:I,name:`Keep ${W.prettyDescriptor(e.configuration,I)}`,reason:"(no changes)"})});break;case"reuse":await C(async()=>{for(let{descriptor:N,locators:U}of(await _0e(t,{project:e,target:a})).values()){if(U.length===1&&U[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes("keep"))continue;let V=`(originally used by ${W.prettyLocator(e.configuration,U[0])}`;V+=U.length>1?` and ${U.length-1} other${U.length>2?"s":""})`:")",v.push({descriptor:N,name:`Reuse ${W.prettyDescriptor(e.configuration,N)}`,reason:V})}});break;case"cache":await C(async()=>{for(let N of e.storedDescriptors.values())N.identHash===t.identHash&&v.push({descriptor:N,name:`Reuse ${W.prettyDescriptor(e.configuration,N)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let N=e.tryWorkspaceByIdent(t);if(N===null)return;let U=U0e(N,u);v.push({descriptor:U,name:`Attach ${W.prettyDescriptor(e.configuration,U)}`,reason:`(local workspace at ${de.pretty(e.configuration,N.relativeCwd,de.Type.PATH)})`})});break;case"latest":{let N=e.configuration.get("enableNetwork"),U=e.configuration.get("enableOfflineMode");await C(async()=>{if(a==="peerDependencies")v.push({descriptor:W.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!N&&!U)v.push({descriptor:null,name:"Resolve from latest",reason:de.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let V=await D8(t,E,{project:e,cache:o,workspace:r,modifier:u});V&&v.push({descriptor:V,name:`Use ${W.prettyDescriptor(e.configuration,V)}`,reason:`(resolved from ${U?"the cache":"latest"})`})}})}break}}return{suggestions:v.slice(0,p),rejections:x.slice(0,p)}}async function D8(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(W.makeDescriptor(t,e)),p=new Qi,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),I={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},v={...I,resolver:E,fetchOptions:I},x=E.bindDescriptor(A,a.anchoredLocator,v),C=await E.getCandidates(x,{},v);if(C.length===0)return null;let R=C[0],{protocol:N,source:U,params:V,selector:te}=W.parseRange(W.convertToManifestRange(R.reference));if(N===r.configuration.get("defaultProtocol")&&(N=null),I8.default.valid(te)){let ae=te;if(typeof u<"u")te=u+te;else if(n!==!1){let me=typeof n=="string"?n:A.range;te=O0e(me,{project:r})+te}let fe=W.makeDescriptor(R,W.makeRange({protocol:N,source:U,params:V,selector:te}));(await E.getCandidates(r.configuration.normalizeDependency(fe),{},v)).length!==1&&(te=ae)}return W.makeDescriptor(R,W.makeRange({protocol:N,source:U,params:V,selector:te}))}async function tpt(t){return await oe.mktempPromise(async e=>{let r=Ke.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Nr(e,{configuration:r,check:!1,immutable:!1}))})}var Qh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=ge.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=ge.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=ge.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=ge.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=ge.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=ge.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Ks(hl)});this.silent=ge.Boolean("--silent",{hidden:!0});this.packages=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=A||r.get("preferReuse"),h=h2(this,o),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(U=>typeof U<"u"),I=A?1/0:1,v=await Promise.all(this.packages.map(async U=>{let V=U.match(/^\.{0,2}\//)?await v8(U,{cwd:this.context.cwd,workspace:a}):W.tryParseDescriptor(U),te=U.match(/^(https?:|git@github)/);if(te)throw new it(`It seems you are trying to add a package using a ${de.pretty(r,`${te[0]}...`,de.Type.RANGE)} url; we now require package names to be explicitly specified. +Try running the command again with the package name prefixed: ${de.pretty(r,"yarn add",de.Type.CODE)} ${de.pretty(r,W.makeDescriptor(W.makeIdent(null,"my-package"),`${te[0]}...`),de.Type.DESCRIPTOR)}`);if(!V)throw new it(`The ${de.pretty(r,U,de.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let ae=rpt(a,V,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(ae.map(async ue=>{let me=await g2(V,{project:o,workspace:a,cache:n,fixed:u,target:ue,modifier:h,strategies:E,maxResults:I});return{request:V,suggestedDescriptors:me,target:ue}}))})).then(U=>U.flat()),x=await fA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async U=>{for(let{request:V,suggestedDescriptors:{suggestions:te,rejections:ae}}of v)if(te.filter(ue=>ue.descriptor!==null).length===0){let[ue]=ae;if(typeof ue>"u")throw new Error("Assertion failed: Expected an error to have been set");o.configuration.get("enableNetwork")?U.reportError(27,`${W.prettyDescriptor(r,V)} can't be resolved to a satisfying range`):U.reportError(27,`${W.prettyDescriptor(r,V)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),U.reportSeparator(),U.reportExceptionOnce(ue)}});if(x.hasErrors())return x.exitCode();let C=!1,R=[],N=[];for(let{suggestedDescriptors:{suggestions:U},target:V}of v){let te,ae=U.filter(he=>he.descriptor!==null),fe=ae[0].descriptor,ue=ae.every(he=>W.areDescriptorsEqual(he.descriptor,fe));ae.length===1||ue?te=fe:(C=!0,{answer:te}=await(0,H0e.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:U.map(({descriptor:he,name:Be,reason:we})=>he?{name:Be,hint:we,descriptor:he}:{name:Be,hint:we,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let me=a.manifest[V].get(te.identHash);(typeof me>"u"||me.descriptorHash!==te.descriptorHash)&&(a.manifest[V].set(te.identHash,te),this.optional&&(V==="dependencies"?a.manifest.ensureDependencyMeta({...te,range:"unknown"}).optional=!0:V==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...te,range:"unknown"}).optional=!0)),typeof me>"u"?R.push([a,V,te,E]):N.push([a,V,me,te]))}return await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyAddition,R),await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyReplacement,N),C&&this.context.stdout.write(` +`),await o.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};Qh.paths=[["add"]],Qh.usage=nt.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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/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"]]});function rpt(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest["dependencies"].has(e.identHash),A=t.manifest["devDependencies"].has(e.identHash),p=t.manifest["peerDependencies"].has(e.identHash);if((r||o)&&u)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" 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||a)&&n)throw new it(`Package "${W.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:A?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ye();Ye();qt();var Fh=class extends ut{constructor(){super(...arguments);this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=ge.String({required:!1})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await un.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new it(`Couldn't find a binary named "${this.name}" for package "${W.prettyLocator(r,a)}"`);let[,p]=A;return this.context.stdout.write(`${p} +`),0}return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await un.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,I)=>Math.max(E,I.length),0);for(let[E,[I,v]]of A)u.reportJson({name:E,source:W.stringifyIdent(I),path:v});if(this.verbose)for(let[E,[I]]of A)u.reportInfo(null,`${E.padEnd(h," ")} ${W.prettyLocator(r,I)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};Fh.paths=[["bin"]],Fh.usage=nt.Usage({description:"get the path to a binary script",details:` + 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. + + 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. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});Ye();Pt();qt();var Rh=class extends ut{constructor(){super(...arguments);this.mirror=ge.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=ge.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await Nr.find(r);return(await Lt.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await oe.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await oe.removePromise(o.cwd)})).exitCode()}};Rh.paths=[["cache","clean"],["cache","clear"]],Rh.usage=nt.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});Ye();qt();var G0e=$e(d2()),P8=ve("util"),Th=class extends ut{constructor(){super(...arguments);this.why=ge.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=ge.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(o)>"u")throw new it(`Couldn't find a configuration settings named "${o}"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=_e.convertMapsToIndexableObjects(u),p=a?(0,G0e.default)(A,a):A,h=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} +`),h.exitCode();P8.inspect.styles.name="cyan",this.context.stdout.write(`${(0,P8.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} +`)}return h.exitCode()}};Th.paths=[["config","get"]],Th.usage=nt.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + 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. + `,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"]]});Ye();qt();var Rge=$e(k8()),Tge=$e(d2()),Lge=$e(Q8()),F8=ve("util"),Lh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String();this.value=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new it("This setting only affects the file it's in, and thus cannot be set from the CLI");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>Ke.updateHomeConfiguration(C):C=>Ke.updateConfiguration(o(),C))(C=>{if(n){let R=(0,Rge.default)(C);return(0,Lge.default)(R,this.name,A),R}else return{...C,[a]:A}});let E=(await Ke.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),I=_e.convertMapsToIndexableObjects(E),v=n?(0,Tge.default)(I,n):I;return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{F8.inspect.styles.name="cyan",C.reportInfo(0,`Successfully set ${this.name} to ${(0,F8.inspect)(v,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Lh.paths=[["config","set"]],Lh.usage=nt.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,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"`]]});Ye();qt();var Wge=$e(k8()),Kge=$e(Uge()),zge=$e(T8()),Nh=class extends ut{constructor(){super(...arguments);this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);let A=this.home?h=>Ke.updateHomeConfiguration(h):h=>Ke.updateConfiguration(o(),h);return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(I=>{if(!(0,Kge.default)(I,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,I;let v=n?(0,Wge.default)(I):{...I};return(0,zge.default)(v,this.name),v}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Nh.paths=[["config","unset"]],Nh.usage=nt.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});Ye();Pt();qt();var fk=ve("util"),Oh=class extends ut{constructor(){super(...arguments);this.noDefaults=ge.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=ge.Boolean("-v,--verbose",{hidden:!0});this.why=ge.Boolean("--why",{hidden:!0});this.names=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins,{strict:!1}),o=await NE({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(o!==null)return o;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async A=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)A.reportError(34,`Invalid configuration key "${p}" in ${h}`);A.reportSeparator()}if(this.json)for(let p of a){let h=r.settings.get(p);typeof h>"u"&&A.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),I=r.sources.get(p)??"",v=I&&I[0]!=="<"?le.fromPortablePath(I):I;A.reportJson({key:p,effective:E,source:v,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let I of a){if(this.noDefaults&&!r.sources.has(I))continue;let v=r.settings.get(I),x=r.sources.get(I)??"",C=r.getSpecial(I,{hideSecrets:!0,getNativePaths:!0}),R={Description:{label:"Description",value:de.tuple(de.Type.MARKDOWN,{text:v.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:de.tuple(x[0]==="<"?de.Type.CODE:de.Type.PATH,x)}};h[I]={value:de.tuple(de.Type.CODE,I),children:R};let N=(U,V)=>{for(let[te,ae]of V)if(ae instanceof Map){let fe={};U[te]={children:fe},N(fe,ae)}else U[te]={label:te,value:de.tuple(de.Type.NO_HINT,(0,fk.inspect)(ae,p))}};C instanceof Map?N(R,C):R.Value={label:"Value",value:de.tuple(de.Type.NO_HINT,(0,fk.inspect)(C,p))}}a.length!==1&&(n=void 0),$s.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let A=a[0],p=(0,fk.inspect)(r.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` +`),this.context.stdout.write(`${p} +`)}return u.exitCode()}};Oh.paths=[["config"]],Oh.usage=nt.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});Ye();qt();$a();var pk={};zt(pk,{Strategy:()=>m2,acceptedStrategies:()=>M0t,dedupe:()=>L8});Ye();Ye();var Vge=$e(Zo()),m2=(e=>(e.HIGHEST="highest",e))(m2||{}),M0t=new Set(Object.values(m2)),U0t={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);_e.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(_e.mapAndFilter(t.storedDescriptors.values(),p=>W.isVirtualDescriptor(p)?_e.mapAndFilter.skip:[p.descriptorHash,_e.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let I=t.originalPackages.get(E);if(typeof I>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let v=r.getResolutionDependencies(p,a),x=Object.fromEntries(await _e.allSettledSafe(Object.entries(v).map(async([te,ae])=>{let fe=A.get(ae.descriptorHash);if(typeof fe>"u")throw new Error(`Assertion failed: The descriptor (${ae.descriptorHash}) should have been registered`);let ue=await fe.promise;if(!ue)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[te,ue.updatedPackage]})));if(e.length&&!Vge.default.isMatch(W.stringifyIdent(p),e)||!r.shouldPersistResolution(I,a))return I;let C=u.get(p.identHash);if(typeof C>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return I;let R=[...C].map(te=>{let ae=t.originalPackages.get(te);if(typeof ae>"u")throw new Error(`Assertion failed: The package (${te}) should have been registered`);return ae}),N=await r.getSatisfying(p,x,R,a),U=N.locators?.[0];if(typeof U>"u"||!N.sorted)return I;let V=t.originalPackages.get(U.locatorHash);if(typeof V>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return V}).then(async v=>{let x=await t.preparePackage(v,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:I,updatedPackage:v,resolvedPackage:x})}).catch(v=>{h.reject(v)})}return[...A.values()].map(p=>p.promise)}};async function L8(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new Qi,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let I=U0t[e],v=await I(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),x=Xs.progressViaCounter(v.length);await a.reportProgress(x);let C=0;await Promise.all(v.map(U=>U.then(V=>{if(V===null||V.currentPackage.locatorHash===V.updatedPackage.locatorHash)return;C++;let{descriptor:te,currentPackage:ae,updatedPackage:fe}=V;a.reportInfo(0,`${W.prettyDescriptor(n,te)} can be deduped from ${W.prettyLocator(n,ae)} to ${W.prettyLocator(n,fe)}`),a.reportJson({descriptor:W.stringifyDescriptor(te),currentResolution:W.stringifyLocator(ae),updatedResolution:W.stringifyLocator(fe)}),t.storedResolutions.set(te.descriptorHash,fe.locatorHash)}).finally(()=>x.tick())));let R;switch(C){case 0:R="No packages";break;case 1:R="One package";break;default:R=`${C} packages`}let N=de.pretty(n,e,de.Type.CODE);return a.reportInfo(0,`${R} can be deduped using the ${N} strategy`),C})}var Mh=class extends ut{constructor(){super(...arguments);this.strategy=ge.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:Ks(m2)});this.check=ge.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Ks(hl)});this.patterns=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=await Nr.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await L8(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Mh.paths=[["dedupe"]],Mh.usage=nt.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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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"]]});Ye();qt();var zd=class extends ut{async execute(){let{plugins:e}=await Ke.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=as.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(" ").slice(1).join()===A.split(" ").slice(1).join(),n=Jge()["@yarnpkg/builder"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)} +`)}};zd.paths=[["--clipanion=definitions"]];var Vd=class extends ut{async execute(){this.context.stdout.write(this.cli.usage(null))}};Vd.paths=[["help"],["--help"],["-h"]];Ye();Pt();qt();var mC=class extends ut{constructor(){super(...arguments);this.leadingArgument=ge.String();this.args=ge.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!W.tryParseIdent(this.leadingArgument)){let r=z.resolve(this.context.cwd,le.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ye();var Jd=class extends ut{async execute(){this.context.stdout.write(`${rn||""} +`)}};Jd.paths=[["-v"],["--version"]];Ye();Ye();qt();var Uh=class extends ut{constructor(){super(...arguments);this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await St.find(r,this.context.cwd);return await o.restoreInstallState(),await un.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};Uh.paths=[["exec"]],Uh.usage=nt.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + 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). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});Ye();qt();$a();var _h=class extends ut{constructor(){super(...arguments);this.hash=ge.String({validator:oP(Cy(),[oI(/^p[0-9a-f]{5}$/)])})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),await H0t(this.hash,o,{stdout:this.context.stdout})}};_h.paths=[["explain","peer-requirements"]],_h.usage=nt.Usage({description:"explain a set of peer requirements",details:` + 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. + + 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. + + 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. + + **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\`). + `,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"]]});async function H0t(t,e,r){let o=e.peerWarnings.find(n=>n.hash===t);if(typeof o>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Lt.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async n=>{let u=de.mark(e.configuration);switch(o.type){case 2:{n.reportInfo(0,`We have a problem with ${de.pretty(e.configuration,o.requested,de.Type.IDENT)}, which is provided with version ${W.prettyReference(e.configuration,o.version)}.`),n.reportInfo(0,"It is needed by the following direct dependencies of workspaces in your project:"),n.reportSeparator();for(let h of o.requesters.values()){let E=e.storedPackages.get(h.locatorHash);if(!E)throw new Error("Assertion failed: Expected the package to be registered");let I=E?.peerDependencies.get(o.requested.identHash);if(!I)throw new Error("Assertion failed: Expected the package to list the peer dependency");let v=kr.satisfiesWithPrereleases(o.version,I.range)?u.Check:u.Cross;n.reportInfo(null,` ${v} ${W.prettyLocator(e.configuration,h)} (via ${W.prettyRange(e.configuration,I.range)})`)}let A=[...o.links.values()].filter(h=>!o.requesters.has(h.locatorHash));if(A.length>0){n.reportSeparator(),n.reportInfo(0,`However, those packages themselves have more dependencies listing ${W.prettyIdent(e.configuration,o.requested)} as peer dependency:`),n.reportSeparator();for(let h of A){let E=e.storedPackages.get(h.locatorHash);if(!E)throw new Error("Assertion failed: Expected the package to be registered");let I=E?.peerDependencies.get(o.requested.identHash);if(!I)throw new Error("Assertion failed: Expected the package to list the peer dependency");let v=kr.satisfiesWithPrereleases(o.version,I.range)?u.Check:u.Cross;n.reportInfo(null,` ${v} ${W.prettyLocator(e.configuration,h)} (via ${W.prettyRange(e.configuration,I.range)})`)}}let p=Array.from(o.links.values(),h=>{let E=e.storedPackages.get(h.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: Expected the package to be registered");let I=E.peerDependencies.get(o.requested.identHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the ident to be registered");return I.range});if(p.length>1){let h=kr.simplifyRanges(p);n.reportSeparator(),h===null?(n.reportInfo(0,"Unfortunately, put together, we found no single range that can satisfy all those peer requirements."),n.reportInfo(0,`Your best option may be to try to upgrade some dependencies with ${de.pretty(e.configuration,"yarn up",de.Type.CODE)}, or silence the warning via ${de.pretty(e.configuration,"logFilters",de.Type.CODE)}.`)):n.reportInfo(0,`Put together, the final range we computed is ${de.pretty(e.configuration,h,de.Type.RANGE)}`)}}break;default:n.reportInfo(0,`The ${de.pretty(e.configuration,"yarn explain peer-requirements",de.Type.CODE)} command doesn't support this warning type yet.`);break}})).exitCode()}Ye();qt();$a();Ye();Ye();Pt();qt();var Xge=$e(Jn()),Hh=class extends ut{constructor(){super(...arguments);this.useYarnPath=ge.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=ge.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let A=r.sources.get("yarnPath");if(!A)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(z.contains(p,A))return 0}let o=()=>{if(typeof rn>"u")throw new it("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\{\}/g,p)});if(this.version==="self")a={url:o(),version:rn??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await y2(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await y2(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||le.isAbsolute(this.version))a={url:`file://${z.resolve(le.toPortablePath(this.version))}`,version:"file"};else if(kr.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(kr.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(kr.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await q0t(r,this.version));else throw new it(`Invalid version descriptor "${this.version}"`);return(await Lt.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${de.pretty(r,a.url,de.Type.PATH)}`),await oe.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${de.pretty(r,a.url,de.Type.URL)}`),await nn.get(a.url,{configuration:r}))};await N8(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};Hh.paths=[["set","version"]],Hh.usage=nt.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over 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 different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["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"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]});async function q0t(t,e){let o=(await nn.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>kr.satisfiesWithPrereleases(a,e));if(o.length===0)throw new it(`No matching release found for range ${de.pretty(t,e,de.Type.RANGE)}.`);return o[0]}async function y2(t,e){let r=await nn.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new it(`Tag ${de.pretty(t,e,de.Type.RANGE)} not found`);return r.latest[e]}async function N8(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let te=await u();await oe.mktempPromise(async ae=>{let fe=z.join(ae,"yarn.cjs");await oe.writeFilePromise(fe,te);let{stdout:ue}=await Ur.execvp(process.execPath,[le.fromPortablePath(fe),"--version"],{cwd:ae,env:{...t.env,YARN_IGNORE_PATH:"1"}});if(e=ue.trim(),!Xge.default.valid(e))throw new Error(`Invalid semver version. ${de.pretty(t,"yarn --version",de.Type.CODE)} returned: +${e}`)})}let A=t.projectCwd??t.startingCwd,p=z.resolve(A,".yarn/releases"),h=z.resolve(p,`yarn-${e}.cjs`),E=z.relative(t.startingCwd,h),I=_e.isTaggedYarnVersion(e),v=t.get("yarnPath"),x=!I,C=x||!!v||!!a;if(a===!1){if(x)throw new Jt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${de.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${de.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),C=!0);if(C){let te=await u();o.reportInfo(0,`Saving the new release in ${de.pretty(t,E,"magenta")}`),await oe.removePromise(z.dirname(h)),await oe.mkdirPromise(z.dirname(h),{recursive:!0}),await oe.writeFilePromise(h,te,{mode:493}),await Ke.updateConfiguration(A,{yarnPath:z.relative(A,h)})}else await oe.removePromise(z.dirname(h)),await Ke.updateConfiguration(A,{yarnPath:Ke.deleteProperty});let R=await Ot.tryFind(A)||new Ot;R.packageManager=`yarn@${I?e:await y2(t,"stable")}`;let N={};R.exportTo(N);let U=z.join(A,Ot.fileName),V=`${JSON.stringify(N,null,R.indent)} +`;return await oe.changeFilePromise(U,V,{automaticNewlines:!0}),{bundleVersion:e}}function Zge(t){return wr[AP(t)]}var G0t=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function j0t(t){let r=`https://repo.yarnpkg.com/${_e.isTaggedYarnVersion(rn)?rn:await y2(t,"canary")}/packages/gatsby/content/advanced/error-codes.md`,o=await nn.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(G0t),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=Zge(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var qh=class extends ut{constructor(){super(...arguments);this.code=ge.String({required:!1,validator:aI(Cy(),[oI(/^YN[0-9]{4}$/)])});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let o=Zge(this.code),a=de.pretty(r,o,de.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await j0t(r)).get(this.code),p=typeof A<"u"?de.jsonOrPretty(this.json,r,de.tuple(de.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. + +You can help us by editing this page on GitHub \u{1F642}: +${de.jsonOrPretty(this.json,r,de.tuple(de.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md"))} +`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})} +`):this.context.stdout.write(`${n} + +${p} +`)}else{let o={children:_e.mapAndFilter(Object.entries(wr),([a,n])=>Number.isNaN(Number(a))?_e.mapAndFilter.skip:{label:Ku(Number(a)),value:de.tuple(de.Type.CODE,n)})};$s.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};qh.paths=[["explain"]],qh.usage=nt.Usage({description:"explain an error code",details:` + When the code argument is specified, this command prints its name and its details. + + When used without arguments, this command lists all error codes and their names. + `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]});Ye();Pt();qt();var $ge=$e(Zo()),Gh=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=ge.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=ge.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=ge.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=ge.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=ge.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=ge.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a&&!this.all)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add("cache"),this.dependents&&u.add("dependents"),this.manifest&&u.add("manifest");let A=(ae,{recursive:fe})=>{let ue=ae.anchoredLocator.locatorHash,me=new Map,he=[ue];for(;he.length>0;){let Be=he.shift();if(me.has(Be))continue;let we=o.storedPackages.get(Be);if(typeof we>"u")throw new Error("Assertion failed: Expected the package to be registered");if(me.set(Be,we),W.isVirtualLocator(we)&&he.push(W.devirtualizeLocator(we).locatorHash),!(!fe&&Be!==ue))for(let g of we.dependencies.values()){let Ee=o.storedResolutions.get(g.descriptorHash);if(typeof Ee>"u")throw new Error("Assertion failed: Expected the resolution to be registered");he.push(Ee)}}return me.values()},p=({recursive:ae})=>{let fe=new Map;for(let ue of o.workspaces)for(let me of A(ue,{recursive:ae}))fe.set(me.locatorHash,me);return fe.values()},h=({all:ae,recursive:fe})=>ae&&fe?o.storedPackages.values():ae?p({recursive:fe}):A(a,{recursive:fe}),E=({all:ae,recursive:fe})=>{let ue=h({all:ae,recursive:fe}),me=this.patterns.map(we=>{let g=W.parseLocator(we),Ee=$ge.default.makeRe(W.stringifyIdent(g)),Pe=W.isVirtualLocator(g),ce=Pe?W.devirtualizeLocator(g):g;return ne=>{let ee=W.stringifyIdent(ne);if(!Ee.test(ee))return!1;if(g.reference==="unknown")return!0;let Ie=W.isVirtualLocator(ne),Fe=Ie?W.devirtualizeLocator(ne):ne;return!(Pe&&Ie&&g.reference!==ne.reference||ce.reference!==Fe.reference)}}),he=_e.sortMap([...ue],we=>W.stringifyLocator(we));return{selection:he.filter(we=>me.length===0||me.some(g=>g(we))),sortedLookup:he}},{selection:I,sortedLookup:v}=E({all:this.all,recursive:this.recursive});if(I.length===0)throw new it("No package matched your request");let x=new Map;if(this.dependents)for(let ae of v)for(let fe of ae.dependencies.values()){let ue=o.storedResolutions.get(fe.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: Expected the resolution to be registered");_e.getArrayWithDefault(x,ue).push(ae)}let C=new Map;for(let ae of v){if(!W.isVirtualLocator(ae))continue;let fe=W.devirtualizeLocator(ae);_e.getArrayWithDefault(C,fe.locatorHash).push(ae)}let R={},N={children:R},U=r.makeFetcher(),V={project:o,fetcher:U,cache:n,checksums:o.storedChecksums,report:new Qi,cacheOptions:{skipIntegrityCheck:!0}},te=[async(ae,fe,ue)=>{if(!fe.has("manifest"))return;let me=await U.fetch(ae,V),he;try{he=await Ot.find(me.prefixPath,{baseFs:me.packageFs})}finally{me.releaseFs?.()}ue("Manifest",{License:de.tuple(de.Type.NO_HINT,he.license),Homepage:de.tuple(de.Type.URL,he.raw.homepage??null)})},async(ae,fe,ue)=>{if(!fe.has("cache"))return;let me=o.storedChecksums.get(ae.locatorHash)??null,he=n.getLocatorPath(ae,me),Be;if(he!==null)try{Be=await oe.statPromise(he)}catch{}let we=typeof Be<"u"?[Be.size,de.Type.SIZE]:void 0;ue("Cache",{Checksum:de.tuple(de.Type.NO_HINT,me),Path:de.tuple(de.Type.PATH,he),Size:we})}];for(let ae of I){let fe=W.isVirtualLocator(ae);if(!this.virtuals&&fe)continue;let ue={},me={value:[ae,de.Type.LOCATOR],children:ue};if(R[W.stringifyLocator(ae)]=me,this.nameOnly){delete me.children;continue}let he=C.get(ae.locatorHash);typeof he<"u"&&(ue.Instances={label:"Instances",value:de.tuple(de.Type.NUMBER,he.length)}),ue.Version={label:"Version",value:de.tuple(de.Type.NO_HINT,ae.version)};let Be=(g,Ee)=>{let Pe={};if(ue[g]=Pe,Array.isArray(Ee))Pe.children=Ee.map(ce=>({value:ce}));else{let ce={};Pe.children=ce;for(let[ne,ee]of Object.entries(Ee))typeof ee>"u"||(ce[ne]={label:ne,value:ee})}};if(!fe){for(let g of te)await g(ae,u,Be);await r.triggerHook(g=>g.fetchPackageInfo,ae,u,Be)}ae.bin.size>0&&!fe&&Be("Exported Binaries",[...ae.bin.keys()].map(g=>de.tuple(de.Type.PATH,g)));let we=x.get(ae.locatorHash);typeof we<"u"&&we.length>0&&Be("Dependents",we.map(g=>de.tuple(de.Type.LOCATOR,g))),ae.dependencies.size>0&&!fe&&Be("Dependencies",[...ae.dependencies.values()].map(g=>{let Ee=o.storedResolutions.get(g.descriptorHash),Pe=typeof Ee<"u"?o.storedPackages.get(Ee)??null:null;return de.tuple(de.Type.RESOLUTION,{descriptor:g,locator:Pe})})),ae.peerDependencies.size>0&&fe&&Be("Peer dependencies",[...ae.peerDependencies.values()].map(g=>{let Ee=ae.dependencies.get(g.identHash),Pe=typeof Ee<"u"?o.storedResolutions.get(Ee.descriptorHash)??null:null,ce=Pe!==null?o.storedPackages.get(Pe)??null:null;return de.tuple(de.Type.RESOLUTION,{descriptor:g,locator:ce})}))}$s.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Gh.paths=[["info"]],Gh.usage=nt.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"]]});Ye();Pt();Nl();var hk=$e(rd());qt();var O8=$e(Jn());$a();var Y0t=[{selector:t=>t===-1,name:"nodeLinker",value:"node-modules"},{selector:t=>t!==-1&&t<8,name:"enableGlobalCache",value:!1},{selector:t=>t!==-1&&t<8,name:"compressionLevel",value:"mixed"}],jh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=ge.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=ge.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=ge.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=ge.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=ge.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=ge.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Ks(hl)});this.cacheFolder=ge.String("--cache-folder",{hidden:!0});this.frozenLockfile=ge.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=ge.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=ge.Boolean("--non-interactive",{hidden:!0});this.preferOffline=ge.Boolean("--prefer-offline",{hidden:!0});this.production=ge.Boolean("--production",{hidden:!0});this.registry=ge.String("--registry",{hidden:!0});this.silent=ge.Boolean("--silent",{hidden:!0});this.networkTimeout=ge.String("--network-timeout",{hidden:!0})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await NE({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!hk.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!hk.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!o},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!hk.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new it(`${de.pretty(r,"--immutable",de.Type.CODE)} and ${de.pretty(r,"--immutable-cache",de.Type.CODE)} cannot be used with ${de.pretty(r,"--mode=update-lockfile",de.Type.CODE)}`);let u=(this.immutable??r.get("enableImmutableInstalls"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let R=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await z0t(r,u)&&(N.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await K0t(r,u)&&(N.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&N.reportSeparator()});if(R.hasErrors())return R.exitCode()}if(r.projectCwd!==null){let R=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(Ke.telemetry?.isNew)Ke.telemetry.commitTips(),N.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),N.reportInfo(65,`Run ${de.pretty(r,"yarn config set --home enableTelemetry 0",de.Type.CODE)} to disable`),N.reportSeparator();else if(Ke.telemetry?.shouldShowTips){let U=await nn.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let V=null;if(rn!==null){let ae=O8.default.prerelease(rn)?"canary":"stable",fe=U.latest[ae];O8.default.gt(fe,rn)&&(V=[ae,fe])}if(V)Ke.telemetry.commitTips(),N.reportInfo(88,`${de.applyStyle(r,`A new ${V[0]} version of Yarn is available:`,de.Style.BOLD)} ${W.prettyReference(r,V[1])}!`),N.reportInfo(88,`Upgrade now by running ${de.pretty(r,`yarn set version ${V[1]}`,de.Type.CODE)}`),N.reportSeparator();else{let te=Ke.telemetry.selectTip(U.tips);te&&(N.reportInfo(89,de.pretty(r,te.message,de.Type.MARKDOWN_INLINE)),te.url&&N.reportInfo(89,`Learn more at ${te.url}`),N.reportSeparator())}}}});if(R.hasErrors())return R.exitCode()}let{project:p,workspace:h}=await St.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let R=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let V of Y0t)V.selector(E)&&typeof r.sources.get(V.name)>"u"&&(r.use("",{[V.name]:V.value},p.cwd,{overwrite:!0}),U[V.name]=V.value);Object.keys(U).length>0&&(await Ke.updateConfiguration(p.cwd,U),N.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),N.reportSeparator())});if(R.hasErrors())return R.exitCode()}let I=await Nr.find(r,{immutable:A,check:this.checkCache});if(!h)throw new nr(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let v=r.get("enableHardenedMode");v&&typeof r.sources.get("enableHardenedMode")>"u"&&await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{R.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),R.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${de.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),R.reportSeparator()}),(this.refreshLockfile??v)&&(p.lockfileNeedsRefresh=!0);let x=this.checkResolutions??v;return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async R=>{await p.install({cache:I,report:R,immutable:u,checkResolutions:x,mode:this.mode})})).exitCode()}};jh.paths=[["install"],nt.Default],jh.usage=nt.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into 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 the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` 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. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\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.cjs` 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 (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` 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 `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\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 `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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"]]});var W0t="<<<<<<<";async function K0t(t,e){if(!t.projectCwd)return!1;let r=z.join(t.projectCwd,dr.lockfile);if(!await oe.existsPromise(r)||!(await oe.readFilePromise(r,"utf8")).includes(W0t))return!1;if(e)throw new Jt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Ur.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Ur.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await Ur.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new Jt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async A=>{let p=await Ur.execvp("git",["show",`${A}:./${dr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new Jt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Ki(p.stdout)}catch{throw new Jt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(A=>!!A.__metadata);for(let A of n){if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=W.parseDescriptor(p,!0),E=t.normalizeDependency(h),I=W.stringifyDescriptor(E);I!==p&&(A[I]=A[p],delete A[p])}for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=A[p].checksum;typeof h=="string"&&h.includes("/")||(A[p].checksum=`${A.__metadata.cacheKey}/${h}`)}}let u=Object.assign({},...n);u.__metadata.version=`${Math.min(...n.map(A=>parseInt(A.__metadata.version??0)))}`,u.__metadata.cacheKey="merged";for(let[A,p]of Object.entries(u))typeof p=="string"&&delete u[A];return await oe.changeFilePromise(r,Ba(u),{automaticNewlines:!0}),!0}async function z0t(t,e){if(!t.projectCwd)return!1;let r=[],o=z.join(t.projectCwd,".yarn/plugins/@yarnpkg");return await Ke.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let u=n.filter(A=>{if(!A.path)return!0;let p=z.resolve(t.projectCwd,A.path),h=v1.has(A.spec)&&z.contains(o,p);return h&&r.push(p),!h});return u.length===0?Ke.deleteProperty:u.length===n.length?n:u}},{immutable:e})?(await Promise.all(r.map(async n=>{await oe.removePromise(n)})),!0):!1}Ye();Pt();qt();var Yh=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=ge.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=ge.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let p of this.destinations){let h=z.resolve(this.context.cwd,le.toPortablePath(p)),E=await Ke.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await St.find(E,h);if(o.cwd===I.cwd)throw new it(`Invalid destination '${p}'; Can't link the project to itself`);if(!v)throw new nr(I.cwd,h);if(this.all){let x=!1;for(let C of I.workspaces)C.manifest.name&&(!C.manifest.private||this.private)&&(A.push(C),x=!0);if(!x)throw new it(`No workspace found to be linked in the target project: ${p}`)}else{if(!v.manifest.name)throw new it(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(v.manifest.private&&!this.private)throw new it(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);A.push(v)}}for(let p of A){let h=W.stringifyIdent(p.anchoredLocator),E=this.relative?z.relative(o.cwd,p.cwd):p.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Yh.paths=[["link"]],Yh.usage=nt.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 ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});qt();var Wh=class extends ut{constructor(){super(...arguments);this.args=ge.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};Wh.paths=[["node"]],Wh.usage=nt.Usage({description:"run node with the hook already setup",details:` + 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). + + 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. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});Ye();qt();var Kh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await Ke.findRcFiles(this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let u of o)if(!!u.data?.plugins)for(let A of u.data.plugins){if(!A.checksum||!A.spec.match(/^https?:/))continue;let p=await nn.get(A.spec,{configuration:r}),h=wn.makeHash(p);if(A.checksum===h)continue;let E=de.pretty(r,A.path,de.Type.PATH),I=de.pretty(r,A.spec,de.Type.URL),v=`${E} is different from the file provided by ${I}`;n.reportJson({...A,newChecksum:h}),n.reportError(0,v)}})).exitCode()}};Kh.paths=[["plugin","check"]],Kh.usage=nt.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` + Check only the plugins from https. + + If this command detects any plugin differences in the CI environment, it will throw an error. + `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]});Ye();Ye();Pt();qt();var ide=ve("os");Ye();Pt();qt();var ede=ve("os");Ye();Nl();qt();var V0t="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Xd(t,e){let r=await nn.get(V0t,{configuration:t}),o=Ki(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||kr.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var zh=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Xd(r,rn);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=" [experimental]"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};zh.paths=[["plugin","list"]],zh.usage=nt.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"]]});var J0t=/^[0-9]+$/,X0t=process.platform==="win32";function tde(t){return J0t.test(t)?`pull/${t}/head`:t}var Z0t=({repository:t,branch:e},r)=>[["git","init",le.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",tde(e)],["git","reset","--hard","FETCH_HEAD"]],$0t=({branch:t})=>[["git","fetch","origin","--depth=1",tde(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],egt=({plugins:t,noMinify:e},r,o)=>[["yarn","build:cli",...new Array().concat(...t.map(a=>["--plugin",z.resolve(o,a)])),...e?["--no-minify"]:[],"|"],[X0t?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",le.fromPortablePath(r),"|"]],Vh=class extends ut{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=ge.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=ge.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.installPath<"u"?z.resolve(this.context.cwd,le.toPortablePath(this.installPath)):z.resolve(le.toPortablePath((0,ede.tmpdir)()),"yarnpkg-sources",wn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{await M8(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,"Building a fresh bundle"),u.reportSeparator();let A=await Ur.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=z.join(a,`packages/yarnpkg-cli/bundles/yarn-${A.stdout.trim()}.js`);oe.existsSync(p)||(await E2(egt(this,p,a),{configuration:r,context:this.context,target:a}),u.reportSeparator());let h=await oe.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await N8(r,null,async()=>h,{report:u});this.skipPlugins||await tgt(this,E,{project:o,report:u,target:a})}})).exitCode()}};Vh.paths=[["set","version","from","sources"]],Vh.usage=nt.Usage({description:"build Yarn from master",details:` + 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. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});async function E2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]==="|";if(u&&n.pop(),u)await Ur.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${de.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} +`);try{await Ur.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function M8(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&oe.existsSync(z.join(o,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await E2($0t(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await oe.removePromise(o),await oe.mkdirPromise(o,{recursive:!0}),await E2(Z0t(t,o),{configuration:e,context:t.context,target:o}))}async function tgt(t,e,{project:r,report:o,target:a}){let n=await Xd(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())!u.has(A)||await U8(A,t,{project:r,report:o,target:a})}Ye();Ye();Pt();qt();var rde=$e(Jn()),nde=ve("vm");var Jh=class extends ut{constructor(){super(...arguments);this.name=ge.String();this.checksum=ge.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await St.find(r,this.context.cwd),u,A;if(this.name.match(/^\.{0,2}[\\/]/)||le.isAbsolute(this.name)){let p=z.resolve(this.context.cwd,le.toPortablePath(this.name));a.reportInfo(0,`Reading ${de.pretty(r,p,de.Type.PATH)}`),u=z.relative(n.cwd,p),A=await oe.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new Jt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=W.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!rde.default.valid(h.reference))throw new Jt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=W.stringifyIdent(h),I=await Xd(r,rn);if(!Object.hasOwn(I,E)){let v=`Couldn't find a plugin named ${W.prettyIdent(r,h)} on the remote registry. +`;throw r.plugins.has(E)?v+=`A plugin named ${W.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:v+=`Note that only the plugins referenced on our website (${de.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",de.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${de.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",de.Type.URL)}).`,new Jt(51,v)}u=E,p=I[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):rn!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${rn}/`))}a.reportInfo(0,`Downloading ${de.pretty(r,p,"green")}`),A=await nn.get(p,{configuration:r})}await _8(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};Jh.paths=[["plugin","import"]],Jh.usage=nt.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. + + 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). + `,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"]]});async function _8(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,nde.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=z.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${de.pretty(n,h,"magenta")}`),await oe.mkdirPromise(z.dirname(E),{recursive:!0}),await oe.writeFilePromise(E,e);let I={path:h,spec:t};r&&(I.checksum=wn.makeHash(e)),await Ke.addPlugin(o.cwd,[I])}var rgt=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],Xh=class extends ut{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<"u"?z.resolve(this.context.cwd,le.toPortablePath(this.installPath)):z.resolve(le.toPortablePath((0,ide.tmpdir)()),"yarnpkg-sources",wn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await St.find(r,this.context.cwd),A=W.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=W.stringifyIdent(A),h=await Xd(r,rn);if(!Object.hasOwn(h,p))throw new Jt(51,`Couldn't find a plugin named "${p}" 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.`);let E=p;await M8(this,{configuration:r,report:n,target:o}),await U8(E,this,{project:u,report:n,target:o})})).exitCode()}};Xh.paths=[["plugin","import","from","sources"]],Xh.usage=nt.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + 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. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,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"]]});async function U8(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\//,""),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await E2(rgt({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=z.resolve(n,`packages/${u}/bundles/${t}.js`),h=await oe.readFilePromise(p);await _8(t,h,{project:o,report:a})}Ye();Pt();qt();var Zh=class extends ut{constructor(){super(...arguments);this.name=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=W.parseIdent(u);if(!r.plugins.has(u))throw new it(`${W.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=z.resolve(o.cwd,p);oe.existsSync(h)&&(n.reportInfo(0,`Removing ${de.pretty(r,p,de.Type.PATH)}...`),await oe.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await Ke.updateConfiguration(o.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let I=E.filter(v=>v.path!==p);return I.length===0?Ke.deleteProperty:I.length===E.length?E:I}})})).exitCode()}};Zh.paths=[["plugin","remove"]],Zh.usage=nt.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **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. + `,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"]]});Ye();qt();var $h=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=" [builtin]"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};$h.paths=[["plugin","runtime"]],$h.usage=nt.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});Ye();Ye();qt();var e0=class extends ut{constructor(){super(...arguments);this.idents=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);let u=new Set;for(let A of this.idents)u.add(W.parseIdent(A).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new Qi}),u.size>0)for(let A of o.storedPackages.values())u.has(A.identHash)&&(o.storedBuildState.delete(A.locatorHash),o.skippedBuilds.delete(A.locatorHash));else o.storedBuildState.clear(),o.skippedBuilds.clear();return await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};e0.paths=[["rebuild"]],e0.usage=nt.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + 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). + + 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. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});Ye();Ye();Ye();qt();var H8=$e(Zo());$a();var t0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Ks(hl)});this.patterns=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let C of this.patterns){let R=!1,N=W.parseIdent(C);for(let U of u){let V=[...U.manifest.peerDependenciesMeta.keys()];for(let te of(0,H8.default)(V,C))U.manifest.peerDependenciesMeta.delete(te),h=!0,R=!0;for(let te of A){let ae=U.manifest.getForScope(te),fe=[...ae.values()].map(ue=>W.stringifyIdent(ue));for(let ue of(0,H8.default)(fe,W.stringifyIdent(N))){let{identHash:me}=W.parseIdent(ue),he=ae.get(me);if(typeof he>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[te].delete(me),E.push([U,te,he]),h=!0,R=!0}}}R||p.push(C)}let I=p.length>1?"Patterns":"Pattern",v=p.length>1?"don't":"doesn't",x=this.all?"any":"this";if(p.length>0)throw new it(`${I} ${de.prettyList(r,p,de.Type.CODE)} ${v} match any packages referenced by ${x} workspace`);return h?(await r.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,E),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};t0.paths=[["remove"]],t0.usage=nt.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter 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. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + 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. + `,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}'"]]});Ye();Ye();qt();var sde=ve("util"),Zd=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async u=>{let A=a.manifest.scripts,p=_e.sortMap(A.keys(),I=>I),h={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},E=p.reduce((I,v)=>Math.max(I,v.length),0);for(let[I,v]of A.entries())u.reportInfo(null,`${I.padEnd(E," ")} ${(0,sde.inspect)(v,h)}`),u.reportJson({name:I,script:v})})).exitCode()}};Zd.paths=[["run"]];Ye();Ye();qt();var r0=class extends ut{constructor(){super(...arguments);this.inspect=ge.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=ge.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=ge.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=ge.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=ge.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=ge.Boolean("--silent",{hidden:!0});this.scriptName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await St.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await un.hasPackageScript(u,this.scriptName,{project:o}))return await un.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await un.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await un.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(o.workspaces.map(async I=>I.manifest.scripts.has(this.scriptName)?I:null))).filter(I=>I!==null);if(E.length===1)return await un.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${W.prettyLocator(r,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 it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${W.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new it("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,I]of AC)for(let v of I)if(h.length>=v.length&&JSON.stringify(h.slice(0,v.length))===JSON.stringify(v))throw new it(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new it(`Couldn't find a script named "${this.scriptName}".`)}}};r0.paths=[["run"]],r0.usage=nt.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - 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. + + 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). + `,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"]]});Ye();Ye();qt();var n0=class extends ut{constructor(){super(...arguments);this.descriptor=ge.String();this.resolution=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new nr(o.cwd,this.context.cwd);let u=W.parseDescriptor(this.descriptor,!0),A=W.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};n0.paths=[["set","resolution"]],n0.usage=nt.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, edit the `resolutions` field in 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"]]});Ye();Pt();qt();var ode=$e(Zo()),i0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of u.manifest.resolutions)h.startsWith("portal:")&&A.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=z.resolve(this.context.cwd,le.toPortablePath(p));if(_e.isPathLike(p)){let E=await Ke.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await St.find(E,h);if(!v)throw new nr(I.cwd,h);if(this.all){for(let x of I.workspaces)x.manifest.name&&A.add(W.stringifyIdent(x.anchoredLocator));if(A.size===0)throw new it("No workspace found to be unlinked in the target project")}else{if(!v.manifest.name)throw new it("The target workspace doesn't have a name and thus cannot be unlinked");A.add(W.stringifyIdent(v.anchoredLocator))}}else{let E=[...u.manifest.resolutions.map(({pattern:I})=>I.descriptor.fullName)];for(let I of(0,ode.default)(E,p))A.add(I)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:p})=>!A.has(p.descriptor.fullName)),await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};i0.paths=[["unlink"]],i0.usage=nt.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});Ye();Ye();Ye();qt();var ade=$e(f2()),q8=$e(Zo());$a();var Vf=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:Ks(hl)});this.patterns=ge.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(E=>W.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(W.parseDescriptor(E).range!=="unknown")throw new it("Ranges aren't allowed when using --recursive");for(let I of(0,q8.default)(A,E)){let v=W.parseIdent(I);p.add(v.identHash)}}let h=u.filter(E=>p.has(E.identHash));for(let E of h)o.storedDescriptors.delete(E.descriptorHash),o.storedResolutions.delete(E.descriptorHash);return await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=this.interactive??r.get("preferInteractive"),p=h2(this,o),h=A?["keep","reuse","project","latest"]:["project","latest"],E=[],I=[];for(let N of this.patterns){let U=!1,V=W.parseDescriptor(N),te=W.stringifyIdent(V);for(let ae of o.workspaces)for(let fe of["dependencies","devDependencies"]){let me=[...ae.manifest.getForScope(fe).values()].map(Be=>W.stringifyIdent(Be)),he=te==="*"?me:(0,q8.default)(me,te);for(let Be of he){let we=W.parseIdent(Be),g=ae.manifest[fe].get(we.identHash);if(typeof g>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let Ee=W.makeDescriptor(we,V.range);E.push(Promise.resolve().then(async()=>[ae,fe,g,await g2(Ee,{project:o,workspace:ae,cache:n,target:fe,fixed:u,modifier:p,strategies:h})])),U=!0}}U||I.push(N)}if(I.length>1)throw new it(`Patterns ${de.prettyList(r,I,de.Type.CODE)} don't match any packages referenced by any workspace`);if(I.length>0)throw new it(`Pattern ${de.prettyList(r,I,de.Type.CODE)} doesn't match any packages referenced by any workspace`);let v=await Promise.all(E),x=await fA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:V,rejections:te}]of v){let ae=V.filter(fe=>fe.descriptor!==null);if(ae.length===0){let[fe]=te;if(typeof fe>"u")throw new Error("Assertion failed: Expected an error to have been set");let ue=this.cli.error(fe);o.configuration.get("enableNetwork")?N.reportError(27,`${W.prettyDescriptor(r,U)} can't be resolved to a satisfying range + +${ue}`):N.reportError(27,`${W.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${ue}`)}else ae.length>1&&!A&&N.reportError(27,`${W.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(x.hasErrors())return x.exitCode();let C=!1,R=[];for(let[N,U,,{suggestions:V}]of v){let te,ae=V.filter(he=>he.descriptor!==null),fe=ae[0].descriptor,ue=ae.every(he=>W.areDescriptorsEqual(he.descriptor,fe));ae.length===1||ue?te=fe:(C=!0,{answer:te}=await(0,ade.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${W.prettyWorkspace(r,N)} \u276F ${U}?`,choices:V.map(({descriptor:he,name:Be,reason:we})=>he?{name:Be,hint:we,descriptor:he}:{name:Be,hint:we,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let me=N.manifest[U].get(te.identHash);if(typeof me>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(me.descriptorHash!==te.descriptorHash)N.manifest[U].set(te.identHash,te),R.push([N,U,me,te]);else{let he=r.makeResolver(),Be={project:o,resolver:he},we=r.normalizeDependency(me),g=he.bindDescriptor(we,N.anchoredLocator,Be);o.forgetResolution(g)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,R),C&&this.context.stdout.write(` +`),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Vf.paths=[["up"]],Vf.usage=nt.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 `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\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 If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter 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\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\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'"]]}),Vf.schema=[cI("recursive",Yu.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];Ye();Ye();Ye();qt();var s0=class extends ut{constructor(){super(...arguments);this.recursive=ge.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=ge.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=W.parseIdent(this.package).identHash,u=this.recursive?igt(o,n,{configuration:r,peers:this.peers}):ngt(o,n,{configuration:r,peers:this.peers});$s.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};s0.paths=[["why"]],s0.usage=nt.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + 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. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});function ngt(t,e,{configuration:r,peers:o}){let a=_e.sortMap(t.storedPackages.values(),A=>W.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let I=t.storedResolutions.get(E.descriptorHash);if(!I)throw new Error("Assertion failed: The resolution should have been registered");let v=t.storedPackages.get(I);if(!v)throw new Error("Assertion failed: The package should have been registered");if(v.identHash!==e)continue;{let C=W.stringifyLocator(A);n[C]={value:[A,de.Type.LOCATOR],children:p}}let x=W.stringifyLocator(v);p[x]={value:[{descriptor:E,locator:v},de.Type.DEPENDENT]}}}return u}function igt(t,e,{configuration:r,peers:o}){let a=_e.sortMap(t.workspaces,v=>W.stringifyLocator(v.anchoredLocator)),n=new Set,u=new Set,A=v=>{if(n.has(v.locatorHash))return u.has(v.locatorHash);if(n.add(v.locatorHash),v.identHash===e)return u.add(v.locatorHash),!0;let x=!1;v.identHash===e&&(x=!0);for(let C of v.dependencies.values()){if(!o&&v.peerDependencies.has(C.identHash))continue;let R=t.storedResolutions.get(C.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let N=t.storedPackages.get(R);if(!N)throw new Error("Assertion failed: The package should have been registered");A(N)&&(x=!0)}return x&&u.add(v.locatorHash),x};for(let v of a)A(v.anchoredPackage);let p=new Set,h={},E={children:h},I=(v,x,C)=>{if(!u.has(v.locatorHash))return;let R=C!==null?de.tuple(de.Type.DEPENDENT,{locator:v,descriptor:C}):de.tuple(de.Type.LOCATOR,v),N={},U={value:R,children:N},V=W.stringifyLocator(v);if(x[V]=U,!(C!==null&&t.tryWorkspaceByLocator(v))&&!p.has(v.locatorHash)){p.add(v.locatorHash);for(let te of v.dependencies.values()){if(!o&&v.peerDependencies.has(te.identHash))continue;let ae=t.storedResolutions.get(te.descriptorHash);if(!ae)throw new Error("Assertion failed: The resolution should have been registered");let fe=t.storedPackages.get(ae);if(!fe)throw new Error("Assertion failed: The package should have been registered");I(fe,N,te)}}};for(let v of a)I(v.anchoredPackage,h,null);return E}Ye();var Z8={};zt(Z8,{GitFetcher:()=>w2,GitResolver:()=>I2,default:()=>Dgt,gitUtils:()=>ra});Ye();Pt();var ra={};zt(ra,{TreeishProtocols:()=>C2,clone:()=>X8,fetchBase:()=>xde,fetchChangedFiles:()=>kde,fetchChangedWorkspaces:()=>Bgt,fetchRoot:()=>bde,isGitUrl:()=>CC,lsRemote:()=>Sde,normalizeLocator:()=>Igt,normalizeRepoUrl:()=>yC,resolveUrl:()=>J8,splitRepoUrl:()=>o0,validateRepoUrl:()=>V8});Ye();Pt();qt();var vde=$e(wde()),Dde=$e(mU()),EC=$e(ve("querystring")),K8=$e(Jn());function W8(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function Ide(t){try{return new URL(t)}catch{return}}function Cgt(t){let e=W8(t,"@","#"),r=W8(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),W8(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Bde(t){return Ide(t)||Ide(Cgt(t))}function yC(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Bde(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function Pde(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var wgt=[/^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\/(.+)?$/],C2=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(C2||{});function CC(t){return t?wgt.some(e=>!!t.match(e)):!1}function o0(t){t=yC(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=EC.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(C2).find(p=>Object.hasOwn(a,p)),[u,A]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(C2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(":"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function Igt(t){return W.makeLocator(t,yC(t.reference))}function V8(t,{configuration:e}){let r=yC(t,{git:!0});if(!nn.getNetworkSettings(`https://${(0,vde.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function Sde(t,e){let r=V8(t,{configuration:e}),o=await z8("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:Pde()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function J8(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=o0(t),u=await Sde(r,e),A=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return EC.default.stringify({...n,commit:E})}case"head":{let I=u.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof I>"u")throw new Error(`Unknown head ("${E}")`);return EC.default.stringify({...n,commit:I})}case"tag":{let I=u.get(`refs/tags/${E}`);if(typeof I>"u")throw new Error(`Unknown tag ("${E}")`);return EC.default.stringify({...n,commit:I})}case"semver":{let I=kr.validRange(E);if(!I)throw new Error(`Invalid range ("${E}")`);let v=new Map([...u.entries()].filter(([C])=>C.startsWith("refs/tags/")).map(([C,R])=>[K8.default.parse(C.slice(10)),R]).filter(C=>C[0]!==null)),x=K8.default.maxSatisfying([...v.keys()],I);if(x===null)throw new Error(`No matching range ("${E}")`);return EC.default.stringify({...n,commit:v.get(x)})}case null:{let I;if((I=p("commit",E))!==null||(I=p("tag",E))!==null||(I=p("head",E))!==null)return I;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return yC(`${r}#${A(o,a)}`)}async function X8(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=o0(t);if(o!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=V8(r,{configuration:e}),u=await oe.mktempPromise(),A={cwd:u,env:Pde()};return await z8("cloning the repository",["clone","-c core.autocrlf=false",n,le.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await z8("switching branch",["checkout",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function bde(t){let e,r=t;do{if(e=r,await oe.existsPromise(z.join(e,".git")))return e;r=z.dirname(e)}while(r!==e);return null}async function xde(t,{baseRefs:e}){if(e.length===0)throw new it("Can't run this command with zero base refs specified.");let r=[];for(let A of e){let{code:p}=await Ur.execvp("git",["merge-base",A,"HEAD"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new it(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:o}=await Ur.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Ur.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function kde(t,{base:e,project:r}){let o=_e.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Ur.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>z.resolve(t,le.toPortablePath(h))),{stdout:u}=await Ur.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),A=u.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>z.resolve(t,le.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!z.relative(r.cwd,h).match(o)):p}async function Bgt({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let r=[z.resolve(e.cwd,dr.lockfile),z.resolve(e.cwd,e.configuration.get("cacheFolder")),z.resolve(e.cwd,e.configuration.get("installStatePath")),z.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await bde(e.configuration.projectCwd);if(o==null)throw new it("This command can only be run on Git repositories");let a=await xde(o,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await kde(o,{base:a.hash,project:e});return new Set(_e.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?_e.mapAndFilter.skip:r.some(p=>u.startsWith(p))?_e.mapAndFilter.skip:A}))}async function z8(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Ur.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof Ur.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new Jt(1,`Failed ${t}`,p=>{p.reportError(1,` ${de.prettyField(o,{label:"Repository URL",value:de.tuple(de.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,I]=h;E=E.toLowerCase();let v=E==="error"?"Error":`${(0,Dde.default)(E)} Error`;p.reportError(1,` ${de.prettyField(o,{label:v,value:de.tuple(de.Type.NO_HINT,I)})}`)}u?.(p)})}}var w2=class{supports(e,r){return CC(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,o);let n={...r,checksums:a},u=await this.downloadHosted(e,n);if(u!==null)return u;let[A,p,h]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:A,releaseFs:p,prefixPath:W.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=await X8(e.reference,r.project.configuration),a=o0(e.reference),n=z.join(o,"package.tgz");await un.prepareExternalProject(o,n,{configuration:r.project.configuration,report:r.report,workspace:a.extra.workspace,locator:e});let u=await oe.readFilePromise(n);return await _e.releaseAfterUseAsync(async()=>await Xi.convertToZip(u,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1}))}};Ye();Ye();var I2=class{supportsDescriptor(e,r){return CC(e.range)}supportsLocator(e,r){return CC(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await J8(e.range,o.project.configuration);return[W.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=o0(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=o0(A.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var vgt={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[w2],resolvers:[I2]};var Dgt=vgt;qt();var a0=class extends ut{constructor(){super(...arguments);this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=ge.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await ra.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let I=new Set,v=new Set;for(let x of Ot.hardDependencies)for(let[C,R]of h.getForScope(x)){let N=o.tryWorkspaceByDescriptor(R);N===null?o.workspacesByIdent.has(C)&&v.add(R):I.add(N)}E={workspaceDependencies:Array.from(I).map(x=>x.relativeCwd),mismatchedWorkspaceDependencies:Array.from(v).map(x=>W.stringifyDescriptor(x))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?W.stringifyIdent(h.name):null,...E})}})).exitCode()}};a0.paths=[["workspaces","list"]],a0.usage=nt.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - 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 "});Ye();Ye();qt();var l0=class extends ut{constructor(){super(...arguments);this.workspaceName=ge.String();this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[W.stringifyIdent(p.anchoredLocator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new it(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${p.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};l0.paths=[["workspace"]],l0.usage=nt.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,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"]]});var Pgt={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:Qde.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[Rh,Th,Lh,Nh,n0,Vh,Hh,a0,zd,Vd,mC,Jd,Qh,Fh,Oh,Mh,Uh,_h,qh,Gh,jh,Yh,i0,Wh,Kh,Xh,Jh,Zh,zh,$h,e0,t0,Zd,r0,Vf,s0,l0]},Sgt=Pgt;var iH={};zt(iH,{default:()=>xgt});Ye();var kt={optional:!0},eH=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:kt}}],["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"]:kt,["postcss-jsx"]:kt,["postcss-less"]:kt,["postcss-markdown"]:kt,["postcss-scss"]:kt}}],["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"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:kt}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:kt}}],["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@<=0.5.2",{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@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:kt,"vue-template-compiler":kt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.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:kt,"utf-8-validate":kt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt,"vuetify-loader":kt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":kt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":kt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:kt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:kt,tinyliquid:kt,"liquid-node":kt,jade:kt,"then-jade":kt,dust:kt,"dustjs-helpers":kt,"dustjs-linkedin":kt,swig:kt,"swig-templates":kt,"razor-tmpl":kt,atpl:kt,liquor:kt,twig:kt,ejs:kt,eco:kt,jazz:kt,jqtpl:kt,hamljs:kt,hamlet:kt,whiskers:kt,"haml-coffee":kt,"hogan.js":kt,templayed:kt,handlebars:kt,underscore:kt,lodash:kt,pug:kt,"then-pug":kt,qejs:kt,walrus:kt,mustache:kt,just:kt,ect:kt,mote:kt,toffee:kt,dot:kt,"bracket-template":kt,ractive:kt,nunjucks:kt,htmling:kt,"babel-core":kt,plates:kt,"react-dom":kt,react:kt,"arc-templates":kt,vash:kt,slm:kt,marko:kt,teacup:kt,"coffee-script":kt,squirrelly:kt,twing:kt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":kt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":kt,vue:kt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:kt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:kt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":kt,"webpack-command":kt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":kt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":kt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:kt,jimp:kt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":kt,"eslint-import-resolver-typescript":kt,"eslint-import-resolver-webpack":kt,"@typescript-eslint/parser":kt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":kt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":kt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x <10.0.2",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.7"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:kt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:kt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{["vue-template-compiler"]:"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{["@parcel/core"]:"*"}}],["parcel@*",{peerDependenciesMeta:{["@parcel/core"]:kt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@<5.0.0",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:kt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:kt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:kt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":kt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}],["vite-plugin-vuetify@<=1.0.2",{peerDependencies:{vue:"^3.0.0"}}],["webpack-plugin-vuetify@<=2.0.1",{peerDependencies:{vue:"^3.2.6"}}],["eslint-import-resolver-vite@<2.0.1",{dependencies:{debug:"^4.3.4",resolve:"^1.22.8"}}]];var tH;function Fde(){return typeof tH>"u"&&(tH=ve("zlib").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()),tH}var rH;function Rde(){return typeof rH>"u"&&(rH=ve("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),rH}var nH;function Tde(){return typeof nH>"u"&&(nH=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),nH}var Lde=new Map([[W.makeIdent(null,"fsevents").identHash,Fde],[W.makeIdent(null,"resolve").identHash,Rde],[W.makeIdent(null,"typescript").identHash,Tde]]),bgt={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of eH)e(W.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{let r="compat/";if(!e.startsWith(r))return;let o=W.parseIdent(e.slice(r.length)),a=Lde.get(o.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,o)=>typeof Lde.get(t.identHash)>"u"?t:W.makeDescriptor(t,W.makeRange({protocol:"patch:",source:W.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},xgt=bgt;var wH={};zt(wH,{ConstraintsCheckCommand:()=>g0,ConstraintsQueryCommand:()=>p0,ConstraintsSourceCommand:()=>h0,default:()=>rdt});Ye();Ye();v2();var IC=class{constructor(e){this.project=e}createEnvironment(){let e=new wC(["cwd","ident"]),r=new wC(["workspace","type","ident"]),o=new wC(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,u=new Map;for(let A of this.project.storedPackages.values()){let p=Array.from(A.peerDependencies.values(),h=>[W.stringifyIdent(h),h.range]);n.set(A.locatorHash,{workspace:null,ident:W.stringifyIdent(A),version:A.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional===!0))})}for(let A of this.project.storedPackages.values()){let p=n.get(A.locatorHash);p.dependencies=new Map(Array.from(A.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let I=n.get(E);if(typeof I>"u")throw new Error("Assertion failed: The package should have been registered");return[W.stringifyIdent(h),I]})),p.dependencies.delete(p.ident)}for(let A of this.project.workspaces){let p=W.stringifyIdent(A.anchoredLocator),h=A.manifest.exportTo({}),E=n.get(A.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let I=(R,N,{caller:U=Vi.getCaller()}={})=>{let V=B2(R),te=_e.getMapWithDefault(a.manifestUpdates,A.cwd),ae=_e.getMapWithDefault(te,V),fe=_e.getSetWithDefault(ae,N);U!==null&&fe.add(U)},v=R=>I(R,void 0,{caller:Vi.getCaller()}),x=R=>{_e.getArrayWithDefault(a.reportedErrors,A.cwd).push(R)},C=e.insert({cwd:A.relativeCwd,ident:p,manifest:h,pkg:E,set:I,unset:v,error:x});u.set(A,C);for(let R of Ot.allDependencies)for(let N of A.manifest[R].values()){let U=W.stringifyIdent(N),V=()=>{I([R,U],void 0,{caller:Vi.getCaller()})},te=fe=>{I([R,U],fe,{caller:Vi.getCaller()})},ae=null;if(R!=="peerDependencies"&&(R!=="dependencies"||!A.manifest.devDependencies.has(N.identHash))){let fe=A.anchoredPackage.dependencies.get(N.identHash);if(fe){if(typeof fe>"u")throw new Error("Assertion failed: The dependency should have been registered");let ue=this.project.storedResolutions.get(fe.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: The resolution should have been registered");let me=n.get(ue);if(typeof me>"u")throw new Error("Assertion failed: The package should have been registered");ae=me}}r.insert({workspace:C,ident:U,range:N.range,type:R,resolution:ae,update:te,delete:V,error:x})}}for(let A of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(A);if(!p)continue;let h=u.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(A.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:e,dependencies:r,packages:o,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},o=await this.project.loadUserConfig();return o?.constraints?(await o.constraints(r),e.result):null}};Ye();Ye();qt();var p0=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=ge.String()}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(x2(),b2)),o=await Ke.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(".")||(u=`${u}.`),(await Lt.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),I=E.length,v=E.reduce((x,[C])=>Math.max(x,C.length),0);for(let x=0;x(x2(),b2)),o=await Ke.find(this.context.cwd,this.context.plugins),{project:a}=await St.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};h0.paths=[["constraints","source"]],h0.usage=nt.Usage({category:"Constraints-related commands",description:"print the source code for the constraints",details:"\n This command will print the Prolog source code used by the constraints engine. Adding the `-v,--verbose` flag will print the *full* source code, including the fact database automatically compiled from the workspace manifests.\n ",examples:[["Prints the source code","yarn constraints source"],["Print the source code and the fact database","yarn constraints source -v"]]});Ye();Ye();qt();v2();var g0=class extends ut{constructor(){super(...arguments);this.fix=ge.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd);await o.restoreInstallState();let a=await o.loadUserConfig(),n;if(a?.constraints)n=new IC(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(x2(),b2));n=await h.find(o)}let u,A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:I,remainingErrors:v}=gk(o,E,{fix:this.fix}),x=[];for(let[C,R]of I){let N=C.manifest.indent;C.manifest=new Ot,C.manifest.indent=N,C.manifest.load(R),x.push(C.persistManifest())}if(await Promise.all(x),!(I.size>0&&h>1)){u=qde(v,{configuration:r}),A=!1,p=!0;for(let[,C]of v)for(let R of C)R.fixable?A=!0:p=!1}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${de.pretty(r,"yarn constraints --fix",de.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${de.pretty(r,"yarn constraints --fix",de.Type.CODE)}`;await Lt.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=_e.sortMap(u.children,h=>h.value[1]),$s.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};g0.paths=[["constraints"]],g0.usage=nt.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` + This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. + + If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. + + For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. + `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]});v2();var tdt={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[p0,h0,g0],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),o;if(r?.constraints)o=new IC(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(x2(),b2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=gk(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[u,A]of n)for(let p of A)e(84,`${de.pretty(t.configuration,u.anchoredLocator,de.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${de.pretty(t.configuration,"yarn constraints",de.Type.CODE)} for more details`)}}},rdt=tdt;var IH={};zt(IH,{CreateCommand:()=>rm,DlxCommand:()=>d0,default:()=>idt});Ye();qt();var rm=class extends ut{constructor(){super(...arguments);this.pkg=ge.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let o=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=W.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?W.makeIdent(a.scope,`create-${a.name}`):W.makeIdent(null,`create-${a.name}`),u=W.stringifyIdent(n);return a.range!=="unknown"&&(u+=`@${a.range}`),this.cli.run(["dlx",...r,u,...this.args])}};rm.paths=[["create"]];Ye();Ye();Pt();qt();var d0=class extends ut{constructor(){super(...arguments);this.packages=ge.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}async execute(){return Ke.telemetry=null,await oe.mktempPromise(async r=>{let o=z.join(r,`dlx-${process.pid}`);await oe.mkdirPromise(o),await oe.writeFilePromise(z.join(o,"package.json"),`{} +`),await oe.writeFilePromise(z.join(o,"yarn.lock"),"");let a=z.join(o,".yarnrc.yml"),n=await Ke.findProjectCwd(this.context.cwd),A={enableGlobalCache:!(await Ke.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Ku(68),level:de.LogLevel.Discard}]},p=n!==null?z.join(n,".yarnrc.yml"):null;p!==null&&oe.existsSync(p)?(await oe.copyFilePromise(p,a),await Ke.updateConfiguration(o,N=>{let U=_e.toMerged(N,A);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(V=>{let te=typeof V=="string"?V:V.path,ae=le.isAbsolute(te)?te:le.resolve(le.fromPortablePath(n),te);return typeof V=="string"?ae:{path:ae,spec:V.spec}})),U})):await oe.writeJsonPromise(a,A);let h=this.packages??[this.command],E=W.parseDescriptor(this.command).name,I=await this.cli.run(["add","--fixed","--",...h],{cwd:o,quiet:this.quiet});if(I!==0)return I;this.quiet||this.context.stdout.write(` +`);let v=await Ke.find(o,this.context.plugins),{project:x,workspace:C}=await St.find(v,o);if(C===null)throw new nr(x.cwd,o);await x.restoreInstallState();let R=await un.getWorkspaceAccessibleBinaries(C);return R.has(E)===!1&&R.size===1&&typeof this.packages>"u"&&(E=Array.from(R)[0][0]),await un.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:R,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};d0.paths=[["dlx"]],d0.usage=nt.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"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var ndt={commands:[rm,d0]},idt=ndt;var DH={};zt(DH,{ExecFetcher:()=>Q2,ExecResolver:()=>F2,default:()=>adt,execUtils:()=>Ek});Ye();Ye();Pt();var pA="exec:";var Ek={};zt(Ek,{loadGeneratorFile:()=>k2,makeLocator:()=>vH,makeSpec:()=>hme,parseSpec:()=>BH});Ye();Pt();function BH(t){let{params:e,selector:r}=W.parseRange(t),o=le.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?W.parseLocator(e.locator):null,path:o}}function hme({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:W.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return W.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function vH(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return W.makeLocator(t,hme({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function k2(t,e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(t,{protocol:e}),n=z.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.join(u.prefixPath,a);return await A.readFilePromise(p,"utf8")}var Q2=class{supports(e,r){return!!e.reference.startsWith(pA)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:pA});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await k2(e.reference,pA,r);return oe.mktempPromise(async a=>{let n=z.join(a,"generator.js");return await oe.writeFilePromise(n,o),oe.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!oe.existsSync(z.join(u,"build")))throw new Error("The script should have generated a build directory");return await Xi.makeArchiveFromDirectory(z.join(u,"build"),{prefixPath:W.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,o,a){return await oe.mktempPromise(async n=>{let u=await un.makeScriptEnv({project:a.project,binFolder:n}),A=z.join(e,"runtime.js");return await oe.mktempPromise(async p=>{let h=z.join(p,"buildfile.log"),E=z.join(e,"generator"),I=z.join(e,"build");await oe.mkdirPromise(E),await oe.mkdirPromise(I);let v={tempDir:le.fromPortablePath(E),buildDir:le.fromPortablePath(I),locator:W.stringifyLocator(r)};await oe.writeFilePromise(A,` + // Expose 'Module' as a global variable + Object.defineProperty(global, 'Module', { + get: () => require('module'), + configurable: true, + enumerable: false, + }); + + // Expose non-hidden built-in modules as global variables + for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { + Object.defineProperty(global, name, { + get: () => require(name), + configurable: true, + enumerable: false, + }); + } + + // Expose the 'execEnv' global variable + Object.defineProperty(global, 'execEnv', { + value: { + ...${JSON.stringify(v)}, + }, + enumerable: true, + }); + `);let x=u.NODE_OPTIONS||"",C=/\s*--require\s+\S*\.pnp\.c?js\s*/g;x=x.replace(C," ").trim(),u.NODE_OPTIONS=x;let{stdout:R,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${W.stringifyLocator(r)}) +`,prefix:W.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Ur.pipevp(process.execPath,["--require",le.fromPortablePath(A),le.fromPortablePath(o),W.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:R,stderr:N});if(U!==0)throw oe.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${de.pretty(a.project.configuration,h,de.Type.PATH)})`)})})}};Ye();Ye();var sdt=2,F2=class{supportsDescriptor(e,r){return!!e.range.startsWith(pA)}supportsLocator(e,r){return!!e.reference.startsWith(pA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=BH(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await k2(W.makeRange({protocol:pA,source:a,selector:a,params:{locator:W.stringifyLocator(n)}}),pA,o.fetchOptions),A=wn.makeHash(`${sdt}`,u).slice(0,6);return[vH(e,{parentLocator:n,path:a,generatorHash:A,protocol:pA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var odt={fetchers:[Q2],resolvers:[F2]},adt=odt;var SH={};zt(SH,{FileFetcher:()=>N2,FileResolver:()=>O2,TarballFileFetcher:()=>M2,TarballFileResolver:()=>U2,default:()=>udt,fileUtils:()=>nm});Ye();Pt();var PC=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,R2=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Ui="file:";var nm={};zt(nm,{fetchArchiveFromLocator:()=>L2,makeArchiveFromLocator:()=>Ck,makeBufferFromLocator:()=>PH,makeLocator:()=>SC,makeSpec:()=>gme,parseSpec:()=>T2});Ye();Pt();function T2(t){let{params:e,selector:r}=W.parseRange(t),o=le.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?W.parseLocator(e.locator):null,path:o}}function gme({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:W.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return W.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function SC(t,{parentLocator:e,path:r,hash:o,protocol:a}){return W.makeLocator(t,gme({parentLocator:e,path:r,hash:o,protocol:a}))}async function L2(t,e){let{parentLocator:r,path:o}=W.parseFileStyleRange(t.reference,{protocol:Ui}),a=z.isAbsolute(o)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=z.join(n.prefixPath,o);return await _e.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function Ck(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=W.parseFileStyleRange(t.reference,{protocol:e}),u=z.isAbsolute(n)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=z.join(A.prefixPath,n);return await _e.releaseAfterUseAsync(async()=>await Xi.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:W.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:o}),A.releaseFs)}async function PH(t,{protocol:e,fetchOptions:r}){return(await Ck(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var N2=class{supports(e,r){return!!e.reference.startsWith(Ui)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:Ui});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return Ck(e,{protocol:Ui,fetchOptions:r})}};Ye();Ye();var ldt=2,O2=class{supportsDescriptor(e,r){return e.range.match(PC)?!0:!!e.range.startsWith(Ui)}supportsLocator(e,r){return!!e.reference.startsWith(Ui)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return PC.test(e.range)&&(e=W.makeDescriptor(e,`${Ui}${e.range}`)),W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=T2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await PH(W.makeLocator(e,W.makeRange({protocol:Ui,source:a,selector:a,params:{locator:W.stringifyLocator(n)}})),{protocol:Ui,fetchOptions:o.fetchOptions}),A=wn.makeHash(`${ldt}`,u).slice(0,6);return[SC(e,{parentLocator:n,path:a,hash:A,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ye();var M2=class{supports(e,r){return R2.test(e.reference)?!!e.reference.startsWith(Ui):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await L2(e,r);return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();Ye();Ye();var U2=class{supportsDescriptor(e,r){return R2.test(e.range)?!!(e.range.startsWith(Ui)||PC.test(e.range)):!1}supportsLocator(e,r){return R2.test(e.reference)?!!e.reference.startsWith(Ui):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return PC.test(e.range)&&(e=W.makeDescriptor(e,`${Ui}${e.range}`)),W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=T2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=SC(e,{parentLocator:n,path:a,hash:"",protocol:Ui}),A=await L2(u,o.fetchOptions),p=wn.makeHash(A).slice(0,6);return[SC(e,{parentLocator:n,path:a,hash:p,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var cdt={fetchers:[M2,N2],resolvers:[U2,O2]},udt=cdt;var kH={};zt(kH,{GithubFetcher:()=>_2,default:()=>fdt,githubUtils:()=>wk});Ye();Pt();var wk={};zt(wk,{invalidGithubUrlMessage:()=>yme,isGithubUrl:()=>bH,parseGithubUrl:()=>xH});var dme=$e(ve("querystring")),mme=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function bH(t){return t?mme.some(e=>!!t.match(e)):!1}function xH(t){let e;for(let A of mme)if(e=t.match(A),e)break;if(!e)throw new Error(yme(t));let[,r,o,a,n="master"]=e,{commit:u}=dme.default.parse(n);return n=u||n.replace(/[^:]*:/,""),{auth:r,username:o,reponame:a,treeish:n}}function yme(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var _2=class{supports(e,r){return!!bH(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await nn.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await oe.mktempPromise(async a=>{let n=new gn(a);await Xi.extractArchiveTo(o,n,{stripComponents:1});let u=ra.splitRepoUrl(e.reference),A=z.join(a,"package.tgz");await un.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await oe.readFilePromise(A);return await Xi.convertToZip(p,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=xH(e.reference);return`https://${o?`${o}@`:""}github.com/${a}/${n}/archive/${u}.tar.gz`}};var Adt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new _2;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},fdt=Adt;var QH={};zt(QH,{TarballHttpFetcher:()=>q2,TarballHttpResolver:()=>G2,default:()=>hdt});Ye();function H2(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!=="http:"&&e.protocol!=="https:"||!e.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var q2=class{supports(e,r){return H2(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await nn.get(e.reference,{configuration:r.project.configuration});return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();Ye();var G2=class{supportsDescriptor(e,r){return H2(e.range)}supportsLocator(e,r){return H2(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[W.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var pdt={fetchers:[q2],resolvers:[G2]},hdt=pdt;var FH={};zt(FH,{InitCommand:()=>m0,default:()=>ddt});Ye();Ye();Pt();qt();var m0=class extends ut{constructor(){super(...arguments);this.private=ge.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=ge.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=ge.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=ge.String("-n,--name",{description:"Initialize a package with the given name"});this.usev2=ge.Boolean("-2",!1,{hidden:!0});this.yes=ge.Boolean("-y,--yes",{hidden:!0})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new it("Cannot use the --install flag from within a project subdirectory");oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=z.join(this.context.cwd,dr.lockfile);oe.existsSync(a)||await oe.writeFilePromise(a,"");let n=await this.cli.run(["set","version",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push("-p"),this.workspace&&u.push("-w"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push("-y"),await oe.mktempPromise(async A=>{let{code:p}=await Ur.pipevp("yarn",["init",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await un.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await St.find(r,this.context.cwd)).project}catch{o=null}oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Ot.tryFind(this.context.cwd),n=a??new Ot,u=Object.fromEntries(r.get("initFields").entries());n.load(u),n.name=n.name??W.makeIdent(r.get("initScope"),this.name??z.basename(this.context.cwd)),n.packageManager=rn&&_e.isTaggedYarnVersion(rn)?`yarn@${rn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await oe.mkdirPromise(z.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let A={};n.exportTo(A);let p=z.join(this.context.cwd,Ot.fileName);await oe.changeFilePromise(p,`${JSON.stringify(A,null,2)} +`,{automaticNewlines:!0});let h=[p],E=z.join(this.context.cwd,"README.md");if(oe.existsSync(E)||(await oe.writeFilePromise(E,`# ${W.stringifyIdent(n.name)} +`),h.push(E)),!o||o.cwd===this.context.cwd){let I=z.join(this.context.cwd,dr.lockfile);oe.existsSync(I)||(await oe.writeFilePromise(I,""),h.push(I));let x=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(fe=>`${fe} +`).join(""),C=z.join(this.context.cwd,".gitignore");oe.existsSync(C)||(await oe.writeFilePromise(C,x),h.push(C));let N=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(fe=>`${fe} +`).join(""),U=z.join(this.context.cwd,".gitattributes");oe.existsSync(U)||(await oe.writeFilePromise(U,N),h.push(U));let V={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};_e.mergeIntoTarget(V,r.get("initEditorConfig"));let te=`root = true +`;for(let[fe,ue]of Object.entries(V)){te+=` +[${fe}] +`;for(let[me,he]of Object.entries(ue)){let Be=me.replace(/[A-Z]/g,we=>`_${we.toLowerCase()}`);te+=`${Be} = ${he} +`}}let ae=z.join(this.context.cwd,".editorconfig");oe.existsSync(ae)||(await oe.writeFilePromise(ae,te),h.push(ae)),await this.cli.run(["install"],{quiet:!0}),oe.existsSync(z.join(this.context.cwd,".git"))||(await Ur.execvp("git",["init"],{cwd:this.context.cwd}),await Ur.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Ur.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};m0.paths=[["init"]],m0.usage=nt.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"]]});var gdt={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[m0]},ddt=gdt;var Tq={};zt(Tq,{SearchCommand:()=>I0,UpgradeInteractiveCommand:()=>v0,default:()=>iIt});Ye();var Cme=$e(ve("os"));function bC({stdout:t}){if(Cme.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}qt();var Fye=$e(JH()),XH={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},pyt=(0,Fye.default)(XH.appId,XH.apiKey).initIndex(XH.indexName),ZH=async(t,e=0)=>await pyt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var qB=["regular","dev","peer"],I0=class extends ut{async execute(){bC(this.context);let{Gem:e}=await Promise.resolve().then(()=>(cQ(),Bq)),{ScrollableItems:r}=await Promise.resolve().then(()=>(pQ(),fQ)),{useKeypress:o}=await Promise.resolve().then(()=>(UB(),Kwe)),{useMinistore:a}=await Promise.resolve().then(()=>(xq(),bq)),{renderForm:n}=await Promise.resolve().then(()=>(mQ(),dQ)),{default:u}=await Promise.resolve().then(()=>$e(nIe())),{Box:A,Text:p}=await Promise.resolve().then(()=>$e(sc())),{default:h,useEffect:E,useState:I}=await Promise.resolve().then(()=>$e(on())),v=await Ke.find(this.context.cwd,this.context.plugins),x=()=>h.createElement(A,{flexDirection:"row"},h.createElement(A,{flexDirection:"column",width:48},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),R=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),N=({hit:he,active:Be})=>{let[we,g]=a(he.name,null);o({active:Be},(ce,ne)=>{if(ne.name!=="space")return;if(!we){g(qB[0]);return}let ee=qB.indexOf(we)+1;ee===qB.length?g(null):g(qB[ee])},[we,g]);let Ee=W.parseIdent(he.name),Pe=W.prettyIdent(v,Ee);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},Pe)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},he.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},he.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,he.humanDownloadsLast30Days)))},U=({name:he,active:Be})=>{let[we]=a(he,null),g=W.parseIdent(he);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0}," - ",W.prettyIdent(v,g))),qB.map(Ee=>h.createElement(A,{key:Ee,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:we===Ee})," ",h.createElement(p,{bold:!0},Ee)))))},V=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),ae=await n(({useSubmit:he})=>{let Be=a();he(Be);let we=Array.from(Be.keys()).filter(H=>Be.get(H)!==null),[g,Ee]=I(""),[Pe,ce]=I(0),[ne,ee]=I([]),Ie=H=>{H.match(/\t| /)||Ee(H)},Fe=async()=>{ce(0);let H=await ZH(g);H.query===g&&ee(H.hits)},At=async()=>{let H=await ZH(g,Pe+1);H.query===g&&H.page-1===Pe&&(ce(H.page),ee([...ne,...H.hits]))};return E(()=>{g?Fe():ee([])},[g]),h.createElement(A,{flexDirection:"column"},h.createElement(x,null),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:Ie,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(C,null)),ne.length?h.createElement(r,{radius:2,loop:!1,children:ne.map(H=>h.createElement(N,{key:H.name,hit:H,active:!1})),willReachEnd:At}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(R,null)),we.length?we.map(H=>h.createElement(U,{key:H,name:H,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(V,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ae>"u")return 1;let fe=Array.from(ae.keys()).filter(he=>ae.get(he)==="regular"),ue=Array.from(ae.keys()).filter(he=>ae.get(he)==="dev"),me=Array.from(ae.keys()).filter(he=>ae.get(he)==="peer");return fe.length&&await this.cli.run(["add",...fe]),ue.length&&await this.cli.run(["add","--dev",...ue]),me&&await this.cli.run(["add","--peer",...me]),0}};I0.paths=[["search"]],I0.usage=nt.Usage({category:"Interactive commands",description:"open the search interface",details:` + This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. + `,examples:[["Open the search window","yarn search"]]});Ye();qt();E_();var uIe=$e(Jn()),cIe=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/,AIe=(t,e)=>t.length>0?[t.slice(0,e)].concat(AIe(t.slice(e),e)):[],v0=class extends ut{async execute(){bC(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(lIe(),aIe)),{Pad:r}=await Promise.resolve().then(()=>(Rq(),oIe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(pQ(),fQ)),{useMinistore:a}=await Promise.resolve().then(()=>(xq(),bq)),{renderForm:n}=await Promise.resolve().then(()=>(mQ(),dQ)),{Box:u,Text:A}=await Promise.resolve().then(()=>$e(sc())),{default:p,useEffect:h,useRef:E,useState:I}=await Promise.resolve().then(()=>$e(on())),v=await Ke.find(this.context.cwd,this.context.plugins),{project:x,workspace:C}=await St.find(v,this.context.cwd),R=await Nr.find(v);if(!C)throw new nr(x.cwd,this.context.cwd);await x.restoreInstallState({restoreResolutions:!1});let N=this.context.stdout.rows-7,U=(Ee,Pe)=>{let ce=Ape(Ee,Pe),ne="";for(let ee of ce)ee.added?ne+=de.pretty(v,ee.value,"green"):ee.removed||(ne+=ee.value);return ne},V=(Ee,Pe)=>{if(Ee===Pe)return Pe;let ce=W.parseRange(Ee),ne=W.parseRange(Pe),ee=ce.selector.match(cIe),Ie=ne.selector.match(cIe);if(!ee||!Ie)return U(Ee,Pe);let Fe=["gray","red","yellow","green","magenta"],At=null,H="";for(let at=1;at{let ne=await Xc.fetchDescriptorFrom(Ee,ce,{project:x,cache:R,preserveModifier:Pe,workspace:C});return ne!==null?ne.range:Ee.range},ae=async Ee=>{let Pe=uIe.default.valid(Ee.range)?`^${Ee.range}`:Ee.range,[ce,ne]=await Promise.all([te(Ee,Ee.range,Pe).catch(()=>null),te(Ee,Ee.range,"latest").catch(()=>null)]),ee=[{value:null,label:Ee.range}];return ce&&ce!==Ee.range?ee.push({value:ce,label:V(Ee.range,ce)}):ee.push({value:null,label:""}),ne&&ne!==ce&&ne!==Ee.range?ee.push({value:ne,label:V(Ee.range,ne)}):ee.push({value:null,label:""}),ee},fe=()=>p.createElement(u,{flexDirection:"row"},p.createElement(u,{flexDirection:"column",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(u,{flexDirection:"column"},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to abort.")))),ue=()=>p.createElement(u,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Latest"))),me=({active:Ee,descriptor:Pe,suggestions:ce})=>{let[ne,ee]=a(Pe.descriptorHash,null),Ie=W.stringifyIdent(Pe),Fe=Math.max(0,45-Ie.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},W.prettyIdent(v,Pe)),p.createElement(r,{active:Ee,length:Fe})),p.createElement(e,{active:Ee,options:ce,value:ne,skewer:!0,onChange:ee,sizes:[17,17,17]})))},he=({dependencies:Ee})=>{let[Pe,ce]=I(Ee.map(()=>null)),ne=E(!0),ee=async Ie=>{let Fe=await ae(Ie);return Fe.filter(At=>At.label!=="").length<=1?null:{descriptor:Ie,suggestions:Fe}};return h(()=>()=>{ne.current=!1},[]),h(()=>{let Ie=Math.trunc(N*1.75),Fe=Ee.slice(0,Ie),At=Ee.slice(Ie),H=AIe(At,N),at=Fe.map(ee).reduce(async(Re,ke)=>{await Re;let xe=await ke;xe!==null&&(!ne.current||ce(He=>{let Te=He.findIndex(qe=>qe===null),Ve=[...He];return Ve[Te]=xe,Ve}))},Promise.resolve());H.reduce((Re,ke)=>Promise.all(ke.map(xe=>Promise.resolve().then(()=>ee(xe)))).then(async xe=>{xe=xe.filter(He=>He!==null),await Re,ne.current&&ce(He=>{let Te=He.findIndex(Ve=>Ve===null);return He.slice(0,Te).concat(xe).concat(He.slice(Te+xe.length))})}),at).then(()=>{ne.current&&ce(Re=>Re.filter(ke=>ke!==null))})},[]),Pe.length?p.createElement(o,{radius:N>>1,children:Pe.map((Ie,Fe)=>Ie!==null?p.createElement(me,{key:Fe,active:!1,descriptor:Ie.descriptor,suggestions:Ie.suggestions}):p.createElement(A,{key:Fe},"Loading..."))}):p.createElement(A,null,"No upgrades found")},we=await n(({useSubmit:Ee})=>{Ee(a());let Pe=new Map;for(let ne of x.workspaces)for(let ee of["dependencies","devDependencies"])for(let Ie of ne.manifest[ee].values())x.tryWorkspaceByDescriptor(Ie)===null&&(Ie.range.startsWith("link:")||Pe.set(Ie.descriptorHash,Ie));let ce=_e.sortMap(Pe.values(),ne=>W.stringifyDescriptor(ne));return p.createElement(u,{flexDirection:"column"},p.createElement(fe,null),p.createElement(ue,null),p.createElement(he,{dependencies:ce}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof we>"u")return 1;let g=!1;for(let Ee of x.workspaces)for(let Pe of["dependencies","devDependencies"]){let ce=Ee.manifest[Pe];for(let ne of ce.values()){let ee=we.get(ne.descriptorHash);typeof ee<"u"&&ee!==null&&(ce.set(ne.identHash,W.makeDescriptor(ne,ee)),g=!0)}}return g?await x.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:R}):0}};v0.paths=[["upgrade-interactive"]],v0.usage=nt.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` + 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. + `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]});var nIt={commands:[I0,v0]},iIt=nIt;var Lq={};zt(Lq,{LinkFetcher:()=>jB,LinkResolver:()=>YB,PortalFetcher:()=>WB,PortalResolver:()=>KB,default:()=>oIt});Ye();Pt();var tp="portal:",rp="link:";var jB=class{supports(e,r){return!!e.reference.startsWith(rp)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:rp});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:rp}),n=z.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Hu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0}}};Ye();Pt();var YB=class{supportsDescriptor(e,r){return!!e.range.startsWith(rp)}supportsLocator(e,r){return!!e.reference.startsWith(rp)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(rp.length);return[W.makeLocator(e,`${rp}${le.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ye();Pt();var WB=class{supports(e,r){return!!e.reference.startsWith(tp)}getLocalPath(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:tp});if(z.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:z.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=W.parseFileStyleRange(e.reference,{protocol:tp}),n=z.isAbsolute(a)?{packageFs:new gn(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=z.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,localPath:p}:{packageFs:new Hu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot}}};Ye();Ye();Pt();var KB=class{supportsDescriptor(e,r){return!!e.range.startsWith(tp)}supportsLocator(e,r){return!!e.reference.startsWith(tp)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(tp.length);return[W.makeLocator(e,`${tp}${le.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await _e.releaseAfterUseAsync(async()=>await Ot.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var sIt={fetchers:[jB,WB],resolvers:[YB,KB]},oIt=sIt;var yG={};zt(yG,{NodeModulesLinker:()=>lv,NodeModulesMode:()=>hG,PnpLooseLinker:()=>cv,default:()=>I1t});Pt();Ye();Pt();Pt();var Oq=(t,e)=>`${t}@${e}`,fIe=(t,e)=>{let r=e.indexOf("#"),o=r>=0?e.substring(r+1):e;return Oq(t,o)};var gIe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=pIt(t,n),p=!1,h=0;do p=Mq(A,[A],new Set([A.locator]),new Map,n).anotherRoundNeeded,n.fastLookupPossible=!1,h++;while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=zB(A);if(Mq(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${E}, next tree: +${zB(A)}`);let v=dIe(A);if(v)throw new Error(`${v}, after hoisting finished: +${zB(A)}`)}return n.debugLevel>=2&&console.log(zB(A)),hIt(A)},aIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},lIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let I of t)E=I.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},pIe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:I,hoistPriority:v,dependencyKind:x,hoistedFrom:C,hoistedTo:R}=e,N={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:I,hoistPriority:v,dependencyKind:x,hoistedFrom:new Map(C),hoistedTo:new Map(R)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),t.dependencies.set(N.name,N),N},cIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);return A.hoistPriority!==u.hoistPriority?A.hoistPriority-u.hoistPriority:A.peerDependents.size!==u.peerDependents.size?A.peerDependents.size-u.peerDependents.size:A.dependents.size-u.dependents.size});for(let a of o){let n=a.substring(0,a.indexOf("@",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Nq=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},Mq=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=gIt(u),p=cIt(u,A),h=t==u?new Map:a.fastLookupPossible?aIt(e):lIt(e),E,I=!1,v=!1,x=new Map(Array.from(p.entries()).map(([R,N])=>[R,N[0]])),C=new Map;do{let R=fIt(t,e,r,h,x,p,o,C,a);R.isGraphChanged&&(v=!0),R.anotherRoundNeeded&&(I=!0),E=!1;for(let[N,U]of p)U.length>1&&!u.dependencies.has(N)&&(x.delete(N),U.shift(),x.set(N,U[0]),E=!0)}while(E);for(let R of u.dependencies.values())if(!u.peerNames.has(R.name)&&!r.has(R.locator)){r.add(R.locator);let N=Mq(t,[...e,R],r,C,a);N.isGraphChanged&&(v=!0),N.anotherRoundNeeded&&(I=!0),r.delete(R.locator)}return{anotherRoundNeeded:I,isGraphChanged:v}},uIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},AIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,I=null,v=new Set;p&&(E=`${Array.from(e).map(N=>no(N)).join("\u2192")}`);let x=r[r.length-1],R=!(o.ident===x.ident);if(p&&!R&&(I="- self-reference"),R&&(R=o.dependencyKind!==1,p&&!R&&(I="- workspace")),R&&o.dependencyKind===2&&(R=!uIt(o),p&&!R&&(I="- external soft link with unhoisted dependencies")),R&&(R=x.dependencyKind!==1||x.hoistedFrom.has(o.name)||e.size===1,p&&!R&&(I=x.reasons.get(o.name))),R&&(R=!t.peerNames.has(o.name),p&&!R&&(I=`- cannot shadow peer: ${no(t.originalDependencies.get(o.name).locator)} at ${E}`)),R){let N=!1,U=a.get(o.name);if(N=!U||U.ident===o.ident,p&&!N&&(I=`- filled by: ${no(U.locator)} at ${E}`),N)for(let V=r.length-1;V>=1;V--){let ae=r[V].dependencies.get(o.name);if(ae&&ae.ident!==o.ident){N=!1;let fe=A.get(x);fe||(fe=new Set,A.set(x,fe)),fe.add(o.name),p&&(I=`- filled by ${no(ae.locator)} at ${r.slice(0,V).map(ue=>no(ue.locator)).join("\u2192")}`);break}}R=N}if(R&&(R=n.get(o.name)===o.ident,p&&!R&&(I=`- filled by: ${no(u.get(o.name)[0])} at ${E}`)),R){let N=!0,U=new Set(o.peerNames);for(let V=r.length-1;V>=1;V--){let te=r[V];for(let ae of U){if(te.peerNames.has(ae)&&te.originalDependencies.has(ae))continue;let fe=te.dependencies.get(ae);fe&&t.dependencies.get(ae)!==fe&&(V===r.length-1?v.add(fe):(v=null,N=!1,p&&(I=`- peer dependency ${no(fe.locator)} from parent ${no(te.locator)} was not hoisted to ${E}`))),U.delete(ae)}if(!N)break}R=N}if(R&&!h)for(let N of o.hoistedDependencies.values()){let U=a.get(N.name)||t.dependencies.get(N.name);if(!U||N.ident!==U.ident){R=!1,p&&(I=`- previously hoisted dependency mismatch, needed: ${no(N.locator)}, available: ${no(U?.locator)}`);break}}return v!==null&&v.size>0?{isHoistable:2,dependsOn:v,reason:I}:{isHoistable:R?0:1,reason:I}},yQ=t=>`${t.name}@${t.locator}`,fIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,I=!1,v=!1,x=(U,V,te,ae,fe)=>{if(E.has(ae))return;let ue=[...V,yQ(ae)],me=[...te,yQ(ae)],he=new Map,Be=new Map;for(let ce of Nq(ae)){let ne=AIt(h,r,[h,...U,ae],ce,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(Be.set(ce,ne),ne.isHoistable===2)for(let ee of ne.dependsOn){let Ie=he.get(ee.name)||new Set;Ie.add(ce.name),he.set(ee.name,Ie)}}let we=new Set,g=(ce,ne,ee)=>{if(!we.has(ce)){we.add(ce),Be.set(ce,{isHoistable:1,reason:ee});for(let Ie of he.get(ce.name)||[])g(ae.dependencies.get(Ie),ne,p.debugLevel>=2?`- peer dependency ${no(ce.locator)} from parent ${no(ae.locator)} was not hoisted`:"")}};for(let[ce,ne]of Be)ne.isHoistable===1&&g(ce,ne,ne.reason);let Ee=!1;for(let ce of Be.keys())if(!we.has(ce)){v=!0;let ne=u.get(ae);ne&&ne.has(ce.name)&&(I=!0),Ee=!0,ae.dependencies.delete(ce.name),ae.hoistedDependencies.set(ce.name,ce),ae.reasons.delete(ce.name);let ee=h.dependencies.get(ce.name);if(p.debugLevel>=2){let Ie=Array.from(V).concat([ae.locator]).map(At=>no(At)).join("\u2192"),Fe=h.hoistedFrom.get(ce.name);Fe||(Fe=[],h.hoistedFrom.set(ce.name,Fe)),Fe.push(Ie),ae.hoistedTo.set(ce.name,Array.from(e).map(At=>no(At.locator)).join("\u2192"))}if(!ee)h.ident!==ce.ident&&(h.dependencies.set(ce.name,ce),fe.add(ce));else for(let Ie of ce.references)ee.references.add(Ie)}if(ae.dependencyKind===2&&Ee&&(I=!0),p.check){let ce=dIe(t);if(ce)throw new Error(`${ce}, after hoisting dependencies of ${[h,...U,ae].map(ne=>no(ne.locator)).join("\u2192")}: +${zB(t)}`)}let Pe=Nq(ae);for(let ce of Pe)if(we.has(ce)){let ne=Be.get(ce);if((a.get(ce.name)===ce.ident||!ae.reasons.has(ce.name))&&ne.isHoistable!==0&&ae.reasons.set(ce.name,ne.reason),!ce.isHoistBorder&&me.indexOf(yQ(ce))<0){E.add(ae);let Ie=pIe(ae,ce);x([...U,ae],ue,me,Ie,R),E.delete(ae)}}},C,R=new Set(Nq(h)),N=Array.from(e).map(U=>yQ(U));do{C=R,R=new Set;for(let U of C){if(U.locator===h.locator||U.isHoistBorder)continue;let V=pIe(h,U);x([],Array.from(r),N,V,R)}}while(R.size>0);return{anotherRoundNeeded:I,isGraphChanged:v}},dIe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),I=()=>`${Array.from(o).concat([n]).map(v=>no(v.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let v=u.get(h.name);(v!==E||!v||v.ident!==h.ident)&&e.push(`${I()} - broken peer promise: expected ${h.ident} but found ${v&&v.ident}`)}else{let v=A.hoistedFrom.get(n.name),x=n.hoistedTo.get(h.name),C=`${v?` hoisted from ${v.join(", ")}`:""}`,R=`${x?` hoisted to ${x}`:""}`,N=`${I()}${C}`;E?E.ident!==h.ident&&e.push(`${N} - broken require promise for ${h.name}${R}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${N} - broken require promise: no required dependency ${h.name}${R} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(` +`)},pIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Oq(r,a),ident:fIe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let I=A.get(h),v=!!I;if(!I){let{name:x,identName:C,reference:R,peerNames:N,hoistPriority:U,dependencyKind:V}=h,te=e.hoistingLimits.get(E.locator);I={name:x,references:new Set([R]),locator:Oq(C,R),ident:fIe(C,R),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:te?te.has(x):!1,hoistPriority:U||0,dependencyKind:V||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,I)}if(E.dependencies.set(h.name,I),E.originalDependencies.set(h.name,I),v){let x=new Set,C=R=>{if(!x.has(R)){x.add(R),R.decoupled=!1;for(let N of R.dependencies.values())R.peerNames.has(N.name)||C(N)}};C(I)}else for(let x of h.dependencies)p(x,I)};for(let h of t.dependencies)p(h,u);return u},Uq=t=>t.substring(0,t.indexOf("@",1)),hIt=t=>{let e={name:t.name,identName:Uq(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:I}=a;p={name:h,identName:Uq(I),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},gIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let I=a(E);I.hoistPriority=Math.max(I.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?I.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},no=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let o=t.substring(e+1);if(o==="workspace:.")return".";if(o){let a=(o.indexOf("#")>0?o.split("#")[1]:o).replace("npm:","");return o.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`},hIe=5e4,zB=t=>{let e=0,r=(a,n,u="")=>{if(e>hIe||n.has(a))return"";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(v!==E.name?`a:${E.name}:`:"")+no(E.locator)+(I?` ${I}`:"")} +`,p+=r(E,n,`${u}${hhIe?` +Tree is too large, part of the tree has been dunped +`:"")};var VB=(o=>(o.WORKSPACES="workspaces",o.DEPENDENCIES="dependencies",o.NONE="none",o))(VB||{}),mIe="node_modules",D0="$wsroot$";var JB=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=mIt(t,e),u=null;if(a.length===0){let A=gIe(r,{hoistingLimits:o});u=EIt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},dA=t=>`${t.name}@${t.reference}`,Hq=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(z.delimiter).length,u=a.split(z.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},yIe=(t,e)=>{let r=W.isVirtualLocator(t)?W.devirtualizeLocator(t):t,o=W.isVirtualLocator(e)?W.devirtualizeLocator(e):e;return W.areLocatorsEqual(r,o)},_q=(t,e,r,o)=>{if(t.linkType!=="SOFT")return!1;let a=le.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return z.contains(o,a)===null},dIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let o=le.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(v,x)=>{let C=dA(v);if(p.has(C))return;p.add(C);let R=t.getPackageInformation(v);if(R){let N=x?dA(x):"";if(dA(v)!==N&&R.linkType==="SOFT"&&!v.reference.startsWith("link:")&&!_q(R,v,t,o)){let U=EIe(R,v,t);(!A.get(U)||v.reference.startsWith("workspace:"))&&A.set(U,v)}for(let[U,V]of R.packageDependencies)V!==null&&(R.packagePeers.has(U)||h(t.getLocator(U,V),v))}};for(let v of u)h(v,null);let E=o.split(z.sep);for(let v of A.values()){let x=t.getPackageInformation(v),R=le.toPortablePath(x.packageLocation.slice(0,-1)).split(z.sep).slice(E.length),N=n;for(let U of R){let V=N.children.get(U);V||(V={children:new Map},N.children.set(U,V)),N=V}N.workspaceLocator=v}let I=(v,x)=>{if(v.workspaceLocator){let C=dA(x),R=a.get(C);R||(R=new Set,a.set(C,R)),R.add(v.workspaceLocator)}for(let C of v.children.values())I(C,v.workspaceLocator||x)};for(let v of n.children.values())I(v,n.workspaceLocator);return a},mIt=(t,e)=>{let r=[],o=!1,a=new Map,n=dIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=le.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,I=(x,C)=>`${dA(C)}:${x}`,v=(x,C,R,N,U,V,te,ae)=>{let fe=I(x,R),ue=E.get(fe),me=!!ue;!me&&R.name===A.name&&R.reference===A.reference&&(ue=h,E.set(fe,h));let he=_q(C,R,t,p);if(!ue){let ce=0;he?ce=2:C.linkType==="SOFT"&&R.name.endsWith(D0)&&(ce=1),ue={name:x,identName:R.name,reference:R.reference,dependencies:new Set,peerNames:ce===1?new Set:C.packagePeers,dependencyKind:ce},E.set(fe,ue)}let Be;if(he?Be=2:U.linkType==="SOFT"?Be=1:Be=0,ue.hoistPriority=Math.max(ue.hoistPriority||0,Be),ae&&!he){let ce=dA({name:N.identName,reference:N.reference}),ne=a.get(ce)||new Set;a.set(ce,ne),ne.add(ue.name)}let we=new Map(C.packageDependencies);if(e.project){let ce=e.project.workspacesByCwd.get(le.toPortablePath(C.packageLocation.slice(0,-1)));if(ce){let ne=new Set([...Array.from(ce.manifest.peerDependencies.values(),ee=>W.stringifyIdent(ee)),...Array.from(ce.manifest.peerDependenciesMeta.keys())]);for(let ee of ne)we.has(ee)||(we.set(ee,V.get(ee)||null),ue.peerNames.add(ee))}}let g=dA({name:R.name.replace(D0,""),reference:R.reference}),Ee=n.get(g);if(Ee)for(let ce of Ee)we.set(`${ce.name}${D0}`,ce.reference);(C!==U||C.linkType!=="SOFT"||!he&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(te)))&&N.dependencies.add(ue);let Pe=R!==A&&C.linkType==="SOFT"&&!R.name.endsWith(D0)&&!he;if(!me&&!Pe){let ce=new Map;for(let[ne,ee]of we)if(ee!==null){let Ie=t.getLocator(ne,ee),Fe=t.getLocator(ne.replace(D0,""),ee),At=t.getPackageInformation(Fe);if(At===null)throw new Error("Assertion failed: Expected the package to have been registered");let H=_q(At,Ie,t,p);if(e.validateExternalSoftLinks&&e.project&&H){At.packageDependencies.size>0&&(o=!0);for(let[He,Te]of At.packageDependencies)if(Te!==null){let Ve=W.parseLocator(Array.isArray(Te)?`${Te[0]}@${Te[1]}`:`${He}@${Te}`);if(dA(Ve)!==dA(Ie)){let qe=we.get(He);if(qe){let b=W.parseLocator(Array.isArray(qe)?`${qe[0]}@${qe[1]}`:`${He}@${qe}`);yIe(b,Ve)||r.push({messageName:71,text:`Cannot link ${W.prettyIdent(e.project.configuration,W.parseIdent(Ie.name))} into ${W.prettyLocator(e.project.configuration,W.parseLocator(`${R.name}@${R.reference}`))} dependency ${W.prettyLocator(e.project.configuration,Ve)} conflicts with parent dependency ${W.prettyLocator(e.project.configuration,b)}`})}else{let b=ce.get(He);if(b){let w=b.target,S=W.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${He}@${w}`);yIe(S,Ve)||r.push({messageName:71,text:`Cannot link ${W.prettyIdent(e.project.configuration,W.parseIdent(Ie.name))} into ${W.prettyLocator(e.project.configuration,W.parseLocator(`${R.name}@${R.reference}`))} dependency ${W.prettyLocator(e.project.configuration,Ve)} conflicts with dependency ${W.prettyLocator(e.project.configuration,S)} from sibling portal ${W.prettyIdent(e.project.configuration,W.parseIdent(b.portal.name))}`})}else ce.set(He,{target:Ve.reference,portal:Ie})}}}}let at=e.hoistingLimitsByCwd?.get(te),Re=H?te:z.relative(p,le.toPortablePath(At.packageLocation))||Bt.dot,ke=e.hoistingLimitsByCwd?.get(Re);v(ne,At,Ie,ue,C,we,Re,at==="dependencies"||ke==="dependencies"||ke==="workspaces")}}};return v(A.name,u,A,h,u,u.packageDependencies,Bt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function EIe(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return le.toPortablePath(o||t.packageLocation)}function yIt(t,e,r){let o=e.getLocator(t.name.replace(D0,""),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:le.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:EIe(a,t,e)}}var EIt=(t,e,r)=>{let o=new Map,a=(E,I,v)=>{let{linkType:x,target:C}=yIt(E,t,r);return{locator:dA(E),nodePath:I,target:C,linkType:x,aliases:v}},n=E=>{let[I,v]=E.split("/");return v?{scope:I,name:v}:{scope:null,name:I}},u=new Set,A=(E,I,v)=>{if(u.has(E))return;u.add(E);let x=Array.from(E.references).sort().join("#");for(let C of E.dependencies){let R=Array.from(C.references).sort().join("#");if(C.identName===E.identName.replace(D0,"")&&R===x)continue;let N=Array.from(C.references).sort(),U={name:C.identName,reference:N[0]},{name:V,scope:te}=n(C.name),ae=te?[te,V]:[V],fe=z.join(I,mIe),ue=z.join(fe,...ae),me=`${v}/${U.name}`,he=a(U,v,N.slice(1)),Be=!1;if(he.linkType==="SOFT"&&r.project){let we=r.project.workspacesByCwd.get(he.target.slice(0,-1));Be=!!(we&&!we.manifest.name)}if(!C.name.endsWith(D0)&&!Be){let we=o.get(ue);if(we){if(we.dirList)throw new Error(`Assertion failed: ${ue} cannot merge dir node with leaf node`);{let Pe=W.parseLocator(we.locator),ce=W.parseLocator(he.locator);if(we.linkType!==he.linkType)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different link types ${we.nodePath}/${W.stringifyLocator(Pe)} and ${v}/${W.stringifyLocator(ce)}`);if(Pe.identHash!==ce.identHash)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different idents ${we.nodePath}/${W.stringifyLocator(Pe)} and ${v}/s${W.stringifyLocator(ce)}`);he.aliases=[...he.aliases,...we.aliases,W.parseLocator(we.locator).reference]}}o.set(ue,he);let g=ue.split("/"),Ee=g.indexOf(mIe);for(let Pe=g.length-1;Ee>=0&&Pe>Ee;Pe--){let ce=le.toPortablePath(g.slice(0,Pe).join(z.sep)),ne=g[Pe],ee=o.get(ce);if(!ee)o.set(ce,{dirList:new Set([ne])});else if(ee.dirList){if(ee.dirList.has(ne))break;ee.dirList.add(ne)}}}A(C,he.linkType==="SOFT"?he.target:ue,me)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return o.set(h,p),A(e,h,""),o};Ye();Ye();Pt();Pt();iA();Nl();var oG={};zt(oG,{PnpInstaller:()=>mm,PnpLinker:()=>b0,UnplugCommand:()=>k0,default:()=>VIt,getPnpPath:()=>x0,jsInstallUtils:()=>yA,pnpUtils:()=>av,quotePathIfNeeded:()=>n1e});Pt();var r1e=ve("url");Ye();Ye();Pt();Pt();var CIe={["DEFAULT"]:{collapsed:!1,next:{["*"]:"DEFAULT"}},["TOP_LEVEL"]:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA",["*"]:"DEFAULT"}},["FALLBACK_EXCLUSION_LIST"]:{collapsed:!1,next:{["*"]:"FALLBACK_EXCLUSION_ENTRIES"}},["FALLBACK_EXCLUSION_ENTRIES"]:{collapsed:!0,next:{["*"]:"FALLBACK_EXCLUSION_DATA"}},["FALLBACK_EXCLUSION_DATA"]:{collapsed:!0,next:{["*"]:"DEFAULT"}},["PACKAGE_REGISTRY_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_REGISTRY_ENTRIES"}},["PACKAGE_REGISTRY_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_STORE_DATA"}},["PACKAGE_STORE_DATA"]:{collapsed:!1,next:{["*"]:"PACKAGE_STORE_ENTRIES"}},["PACKAGE_STORE_ENTRIES"]:{collapsed:!0,next:{["*"]:"PACKAGE_INFORMATION_DATA"}},["PACKAGE_INFORMATION_DATA"]:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES",["*"]:"DEFAULT"}},["PACKAGE_DEPENDENCIES"]:{collapsed:!1,next:{["*"]:"PACKAGE_DEPENDENCY"}},["PACKAGE_DEPENDENCY"]:{collapsed:!0,next:{["*"]:"DEFAULT"}}};function CIt(t,e,r){let o="";o+="[";for(let a=0,n=t.length;a"u"||(A!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=EQ(p,h,e,r).replace(/^ +/g,""),A+=1)}return a+="}",a}function BIt(t,e,r){let o=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ +`;let u=0;for(let A=0,p=o.length;A"u"||(u!==0&&(n+=",",n+=` +`),n+=a,n+=JSON.stringify(h),n+=": ",n+=EQ(h,E,e,a).replace(/^ +/g,""),u+=1)}return u!==0&&(n+=` +`),n+=r,n+="}",n}function EQ(t,e,r,o){let{next:a}=CIe[r],n=a[t]||a["*"];return wIe(e,n,o)}function wIe(t,e,r){let{collapsed:o}=CIe[e];return Array.isArray(t)?o?CIt(t,e,r):wIt(t,e,r):typeof t=="object"&&t!==null?o?IIt(t,e,r):BIt(t,e,r):JSON.stringify(t)}function IIe(t){return wIe(t,"TOP_LEVEL","")}function XB(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function vIt(t){let e=new Map,r=XB(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>"u"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function DIt(t){return XB(t.fallbackPool||[],([e])=>e)}function PIt(t){let e=[];for(let[r,o]of XB(t.packageRegistry,([a])=>a===null?"0":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of XB(o,([I])=>I===null?"0":`1${I}`)){let I=[];r!==null&&n!==null&&!A.has(r)&&I.push([r,n]);for(let[C,R]of XB(A.entries(),([N])=>N))I.push([C,R]);let v=p&&p.size>0?Array.from(p):void 0,x=E||void 0;a.push([n,{packageLocation:u,packageDependencies:I,packagePeers:v,linkType:h,discardFromLookup:x}])}}return e}function ZB(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:vIt(t),fallbackPool:DIt(t),packageRegistryData:PIt(t)}}var DIe=$e(vIe());function PIe(t,e){return[t?`${t} +`:"",`/* eslint-disable */ +`,`// @ts-nocheck +`,`"use strict"; +`,` +`,e,` +`,(0,DIe.default)()].join("")}function SIt(t){return JSON.stringify(t,null,2)}function bIt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ +`)}'`}function xIt(t){return[`const RAW_RUNTIME_STATE = +`,`${bIt(IIe(t))}; + +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +`,`} +`].join("")}function kIt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,` const fs = require('fs'); +`,` const path = require('path'); +`,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(dr.pnpData)}); +`,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); +`,`} +`].join("")}function SIe(t){let e=ZB(t),r=xIt(e);return PIe(t.shebang,r)}function bIe(t){let e=ZB(t),r=kIt(),o=PIe(t.shebang,r);return{dataFile:SIt(e),loaderFile:o}}Pt();function Gq(t,{basePath:e}){let r=le.toPortablePath(e),o=z.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([I,v])=>[I,new Map(v.map(([x,C])=>{if(I===null!=(x===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let R=C.discardFromLookup??!1,N={name:I,reference:x},U=n.get(C.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&R,R||(U.locator=N)):n.set(C.packageLocation,{locator:N,discardFromLookup:R});let V=null;return[x,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:R,get packageLocation(){return V||(V=z.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([I,v])=>[I,new Set(v)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}Pt();Pt();var ip=ve("module"),dm=ve("url"),$q=ve("util");var Mo=ve("url");var FIe=$e(ve("assert"));var jq=Array.isArray,$B=JSON.stringify,ev=Object.getOwnPropertyNames,gm=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Yq=(t,e)=>RegExp.prototype.exec.call(t,e),Wq=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),P0=(t,...e)=>String.prototype.endsWith.apply(t,e),Kq=(t,...e)=>String.prototype.includes.apply(t,e),zq=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),tv=(t,...e)=>String.prototype.indexOf.apply(t,e),xIe=(t,...e)=>String.prototype.replace.apply(t,e),S0=(t,...e)=>String.prototype.slice.apply(t,e),mA=(t,...e)=>String.prototype.startsWith.apply(t,e),kIe=Map,QIe=JSON.parse;function rv(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var RIe=rv("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),Vq=rv("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),TIe=rv("ERR_INVALID_PACKAGE_TARGET",(t,e,r,o=!1,a=void 0)=>{let n=typeof r=="string"&&!o&&r.length&&!mA(r,"./");return e==="."?((0,FIe.default)(o===!1),`Invalid "exports" main target ${$B(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${o?"imports":"exports"}" target ${$B(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),nv=rv("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),LIe=rv("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var wQ=ve("url");function NIe(t,e){let r=Object.create(null);for(let o=0;oe):t+e}iv(r,t,o,u,a)}Yq(MIe,S0(t,2))!==null&&iv(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(".",o).pathname;if(mA(h,E)||iv(r,t,o,u,a),e==="")return p;if(Yq(MIe,e)!==null){let I=n?xIe(r,"*",()=>e):r+e;RIt(I,o,u,a)}return n?new URL(Wq(UIe,p.href,()=>e)):new URL(e,p)}function LIt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function jC(t,e,r,o,a,n,u,A){if(typeof e=="string")return TIt(e,r,o,t,a,n,u,A);if(jq(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function NIt(t,e,r){if(typeof t=="string"||jq(t))return!0;if(typeof t!="object"||t===null)return!1;let o=ev(t),a=!1,n=0;for(let u=0;u=h.length&&P0(e,I)&&HIe(n,h)===1&&zq(h,"*")===E&&(n=h,u=S0(e,E,e.length-I.length))}}if(n){let p=r[n],h=jC(t,p,u,n,o,!0,!1,a);return h==null&&Jq(e,t,o),h}Jq(e,t,o)}function GIe({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t==="#"||mA(t,"#/")||P0(t,"/")){let u="is not a valid internal imports specifier name";throw new Vq(t,u,(0,Mo.fileURLToPath)(e))}let a,n=OIe(e,o);if(n.exists){a=(0,Mo.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(gm(u,t)&&!Kq(t,"*")){let A=jC(a,u[t],"",t,e,!1,!0,r);if(A!=null)return A}else{let A="",p,h=ev(u);for(let E=0;E=I.length&&P0(t,x)&&HIe(A,I)===1&&zq(I,"*")===v&&(A=I,p=S0(t,v,t.length-x.length))}}if(A){let E=u[A],I=jC(a,E,p,A,e,!0,!0,r);if(I!=null)return I}}}FIt(t,a,e)}Pt();var MIt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function $i(t,e,r={},o){o??=MIt.has(t)?"MODULE_NOT_FOUND":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function lu(t){return le.normalize(le.fromPortablePath(t))}var KIe=$e(YIe());function zIe(t){return UIt(),Zq[t]}var Zq;function UIt(){Zq||(Zq={"--conditions":[],...WIe(_It()),...WIe(process.execArgv)})}function WIe(t){return(0,KIe.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function _It(){let t=[],e=HIt(process.env.NODE_OPTIONS||"",t);return t.length,e}function HIt(t,e){let r=[],o=!1,a=!0;for(let n=0;nparseInt(t,10)),VIe=Ma>19||Ma===19&&np>=2||Ma===18&&np>=13,vJt=Ma===20&&np<6||Ma===19&&np>=3,DJt=Ma>19||Ma===19&&np>=6,PJt=Ma>=21||Ma===20&&np>=10||Ma===18&&np>=19,SJt=Ma>=21||Ma===20&&np>=10||Ma===18&&np>=20,bJt=Ma>=22;function JIe(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>le.fromPortablePath(mi.resolveVirtual(le.toPortablePath(e)))),VIe)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function eG(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,u=/\/$/,A=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Re of["react-scripts","gatsby"]){let ke=t.packageRegistry.get(Re);if(ke)for(let xe of ke.keys()){if(xe===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Re,reference:xe})}}let{ignorePattern:I,packageRegistry:v,packageLocatorsByLocations:x}=t;function C(Re,ke){return{fn:Re,args:ke,error:null,result:null}}function R(Re){let ke=process.stderr?.hasColors?.()??process.stdout.isTTY,xe=(Ve,qe)=>`\x1B[${Ve}m${qe}\x1B[0m`,He=Re.error;console.error(He?xe("31;1",`\u2716 ${Re.error?.message.replace(/\n.*/s,"")}`):xe("33;1","\u203C Resolution")),Re.args.length>0&&console.error();for(let Ve of Re.args)console.error(` ${xe("37;1","In \u2190")} ${(0,$q.inspect)(Ve,{colors:ke,compact:!0})}`);Re.result&&(console.error(),console.error(` ${xe("37;1","Out \u2192")} ${(0,$q.inspect)(Re.result,{colors:ke,compact:!0})}`));let Te=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(Te.length>0){console.error();for(let Ve of Te)console.error(` ${xe("38;5;244",Ve)}`)}console.error()}function N(Re,ke){if(e.allowDebug===!1)return ke;if(Number.isFinite(o)){if(o>=2)return(...xe)=>{let He=C(Re,xe);try{return He.result=ke(...xe)}catch(Te){throw He.error=Te}finally{R(He)}};if(o>=1)return(...xe)=>{try{return ke(...xe)}catch(He){let Te=C(Re,xe);throw Te.error=He,R(Te),He}}}return ke}function U(Re){let ke=g(Re);if(!ke)throw $i("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return ke}function V(Re){if(Re.name===null)return!0;for(let ke of t.dependencyTreeRoots)if(ke.name===Re.name&&ke.reference===Re.reference)return!0;return!1}let te=new Set(["node","require",...zIe("--conditions")]);function ae(Re,ke=te,xe){let He=ce(z.join(Re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(He===null)throw $i("INTERNAL",`The locator that owns the "${Re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:Te}=U(He),Ve=z.join(Te,dr.manifest);if(!e.fakeFs.existsSync(Ve))return null;let qe=JSON.parse(e.fakeFs.readFileSync(Ve,"utf8"));if(qe.exports==null)return null;let b=z.contains(Te,Re);if(b===null)throw $i("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");b!=="."&&!A.test(b)&&(b=`./${b}`);try{let w=qIe({packageJSONUrl:(0,dm.pathToFileURL)(le.fromPortablePath(Ve)),packageSubpath:b,exports:qe.exports,base:xe?(0,dm.pathToFileURL)(le.fromPortablePath(xe)):null,conditions:ke});return le.toPortablePath((0,dm.fileURLToPath)(w))}catch(w){throw $i("EXPORTS_RESOLUTION_FAILED",w.message,{unqualifiedPath:lu(Re),locator:He,pkgJson:qe,subpath:lu(b),conditions:ke},w.code)}}function fe(Re,ke,{extensions:xe}){let He;try{ke.push(Re),He=e.fakeFs.statSync(Re)}catch{}if(He&&!He.isDirectory())return e.fakeFs.realpathSync(Re);if(He&&He.isDirectory()){let Te;try{Te=JSON.parse(e.fakeFs.readFileSync(z.join(Re,dr.manifest),"utf8"))}catch{}let Ve;if(Te&&Te.main&&(Ve=z.resolve(Re,Te.main)),Ve&&Ve!==Re){let qe=fe(Ve,ke,{extensions:xe});if(qe!==null)return qe}}for(let Te=0,Ve=xe.length;Te{let b=JSON.stringify(qe.name);if(He.has(b))return;He.add(b);let w=Ee(qe);for(let S of w)if(U(S).packagePeers.has(Re))Te(S);else{let F=xe.get(S.name);typeof F>"u"&&xe.set(S.name,F=new Set),F.add(S.reference)}};Te(ke);let Ve=[];for(let qe of[...xe.keys()].sort())for(let b of[...xe.get(qe)].sort())Ve.push({name:qe,reference:b});return Ve}function ce(Re,{resolveIgnored:ke=!1,includeDiscardFromLookup:xe=!1}={}){if(he(Re)&&!ke)return null;let He=z.relative(t.basePath,Re);He.match(n)||(He=`./${He}`),He.endsWith("/")||(He=`${He}/`);do{let Te=x.get(He);if(typeof Te>"u"||Te.discardFromLookup&&!xe){He=He.substring(0,He.lastIndexOf("/",He.length-2)+1);continue}return Te.locator}while(He!=="");return null}function ne(Re){try{return e.fakeFs.readFileSync(le.toPortablePath(Re),"utf8")}catch(ke){if(ke.code==="ENOENT")return;throw ke}}function ee(Re,ke,{considerBuiltins:xe=!0}={}){if(Re.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Re==="pnpapi")return le.toPortablePath(e.pnpapiResolution);if(xe&&(0,ip.isBuiltin)(Re))return null;let He=lu(Re),Te=ke&&lu(ke);if(ke&&he(ke)&&(!z.isAbsolute(Re)||ce(Re)===null)){let b=me(Re,ke);if(b===!1)throw $i("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${He}" +Required by: ${Te} +`,{request:He,issuer:Te});return le.toPortablePath(b)}let Ve,qe=Re.match(a);if(qe){if(!ke)throw $i("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:He,issuer:Te});let[,b,w]=qe,S=ce(ke);if(!S){let Le=me(Re,ke);if(Le===!1)throw $i("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${He}" +Required by: ${Te} +`,{request:He,issuer:Te});return le.toPortablePath(Le)}let F=U(S).packageDependencies.get(b),J=null;if(F==null&&S.name!==null){let Le=t.fallbackExclusionList.get(S.name);if(!Le||!Le.has(S.reference)){for(let dt=0,Gt=h.length;dtV(ot))?X=$i("MISSING_PEER_DEPENDENCY",`${S.name} tried to access ${b} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +${Le.map(ot=>`Ancestor breaking the chain: ${ot.name}@${ot.reference} +`).join("")} +`,{request:He,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:b,brokenAncestors:Le}):X=$i("MISSING_PEER_DEPENDENCY",`${S.name} tried to access ${b} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) + +${Le.map(ot=>`Ancestor breaking the chain: ${ot.name}@${ot.reference} +`).join("")} +`,{request:He,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:b,brokenAncestors:Le})}else F===void 0&&(!xe&&(0,ip.isBuiltin)(Re)?V(S)?X=$i("UNDECLARED_DEPENDENCY",`Your application tried to access ${b}. 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 ${b} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${Te} +`,{request:He,issuer:Te,dependencyName:b}):X=$i("UNDECLARED_DEPENDENCY",`${S.name} tried to access ${b}. 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 ${b} isn't otherwise declared in ${S.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${Te} +`,{request:He,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:b}):V(S)?X=$i("UNDECLARED_DEPENDENCY",`Your application tried to access ${b}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${Te} +`,{request:He,issuer:Te,dependencyName:b}):X=$i("UNDECLARED_DEPENDENCY",`${S.name} tried to access ${b}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${b}${b!==He?` (via "${He}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +`,{request:He,issuer:Te,issuerLocator:Object.assign({},S),dependencyName:b}));if(F==null){if(J===null||X===null)throw X||new Error("Assertion failed: Expected an error to have been set");F=J;let Le=X.message.replace(/\n.*/g,"");X.message=Le,!E.has(Le)&&o!==0&&(E.add(Le),process.emitWarning(X))}let Z=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:b,reference:F},ie=U(Z);if(!ie.packageLocation)throw $i("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. + +Required package: ${Z.name}@${Z.reference}${Z.name!==He?` (via "${He}")`:""} +Required by: ${S.name}@${S.reference} (via ${Te}) +`,{request:He,issuer:Te,dependencyLocator:Object.assign({},Z)});let be=ie.packageLocation;w?Ve=z.join(be,w):Ve=be}else if(z.isAbsolute(Re))Ve=z.normalize(Re);else{if(!ke)throw $i("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:He,issuer:Te});let b=z.resolve(ke);ke.match(u)?Ve=z.normalize(z.join(b,Re)):Ve=z.normalize(z.join(z.dirname(b),Re))}return z.normalize(Ve)}function Ie(Re,ke,xe=te,He){if(n.test(Re))return ke;let Te=ae(ke,xe,He);return Te?z.normalize(Te):ke}function Fe(Re,{extensions:ke=Object.keys(ip.Module._extensions)}={}){let xe=[],He=fe(Re,xe,{extensions:ke});if(He)return z.normalize(He);{JIe(xe.map(qe=>le.fromPortablePath(qe)));let Te=lu(Re),Ve=ce(Re);if(Ve){let{packageLocation:qe}=U(Ve),b=!0;try{e.fakeFs.accessSync(qe)}catch(w){if(w?.code==="ENOENT")b=!1;else{let S=(w?.message??w??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${S}). + +Missing package: ${Ve.name}@${Ve.reference} +Expected package location: ${lu(qe)} +`,{unqualifiedPath:Te,extensions:ke})}}if(!b){let w=qe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`${w} + +Missing package: ${Ve.name}@${Ve.reference} +Expected package location: ${lu(qe)} +`,{unqualifiedPath:Te,extensions:ke})}}throw $i("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${Te} +${xe.map(qe=>`Not found: ${lu(qe)} +`).join("")}`,{unqualifiedPath:Te,extensions:ke})}}function At(Re,ke,xe){if(!ke)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let He=GIe({name:Re,base:(0,dm.pathToFileURL)(le.fromPortablePath(ke)),conditions:xe.conditions??te,readFileSyncFn:ne});if(He instanceof URL)return Fe(le.toPortablePath((0,dm.fileURLToPath)(He)),{extensions:xe.extensions});if(He.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return H(He,ke,xe)}function H(Re,ke,xe={}){try{if(Re.startsWith("#"))return At(Re,ke,xe);let{considerBuiltins:He,extensions:Te,conditions:Ve}=xe,qe=ee(Re,ke,{considerBuiltins:He});if(Re==="pnpapi")return qe;if(qe===null)return null;let b=()=>ke!==null?he(ke):!1,w=(!He||!(0,ip.isBuiltin)(Re))&&!b()?Ie(Re,qe,Ve,ke):qe;return Fe(w,{extensions:Te})}catch(He){throw Object.hasOwn(He,"pnpCode")&&Object.assign(He.data,{request:lu(Re),issuer:ke&&lu(ke)}),He}}function at(Re){let ke=z.normalize(Re),xe=mi.resolveVirtual(ke);return xe!==ke?xe:null}return{VERSIONS:Be,topLevel:we,getLocator:(Re,ke)=>Array.isArray(ke)?{name:ke[0],reference:ke[1]}:{name:Re,reference:ke},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Re=[];for(let[ke,xe]of v)for(let He of xe.keys())ke!==null&&He!==null&&Re.push({name:ke,reference:He});return Re},getPackageInformation:Re=>{let ke=g(Re);if(ke===null)return null;let xe=le.fromPortablePath(ke.packageLocation);return{...ke,packageLocation:xe}},findPackageLocator:Re=>ce(le.toPortablePath(Re)),resolveToUnqualified:N("resolveToUnqualified",(Re,ke,xe)=>{let He=ke!==null?le.toPortablePath(ke):null,Te=ee(le.toPortablePath(Re),He,xe);return Te===null?null:le.fromPortablePath(Te)}),resolveUnqualified:N("resolveUnqualified",(Re,ke)=>le.fromPortablePath(Fe(le.toPortablePath(Re),ke))),resolveRequest:N("resolveRequest",(Re,ke,xe)=>{let He=ke!==null?le.toPortablePath(ke):null,Te=H(le.toPortablePath(Re),He,xe);return Te===null?null:le.fromPortablePath(Te)}),resolveVirtual:N("resolveVirtual",Re=>{let ke=at(le.toPortablePath(Re));return ke!==null?le.fromPortablePath(ke):null})}}Pt();var XIe=(t,e,r)=>{let o=ZB(t),a=Gq(o,{basePath:e}),n=le.join(e,dr.pnpCjs);return eG(a,{fakeFs:r,pnpapiResolution:n})};var rG=$e($Ie());qt();var yA={};zt(yA,{checkManifestCompatibility:()=>e1e,extractBuildRequest:()=>IQ,getExtractHint:()=>nG,hasBindingGyp:()=>iG});Ye();Pt();function e1e(t){return W.isPackageCompatible(t,Vi.getArchitectureSet())}function IQ(t,e,r,{configuration:o}){let a=[];for(let n of["preinstall","install","postinstall"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:t.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${W.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${W.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!o.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${W.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`)}:e1e(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${W.prettyLocator(o,t)} The ${Vi.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var GIt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function nG(t){return t.packageFs.getExtractHint({relevantExtensions:GIt})}function iG(t){let e=z.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var av={};zt(av,{getUnpluggedPath:()=>ov});Ye();Pt();function ov(t,{configuration:e}){return z.resolve(e.get("pnpUnpluggedFolder"),W.slugifyLocator(t))}var jIt=new Set([W.makeIdent(null,"open").identHash,W.makeIdent(null,"opn").identHash]),b0=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let o=x0(r.project).cjs;if(!oe.existsSync(o))throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=_e.getFactoryWithDefault(this.pnpCache,o,()=>_e.dynamicRequire(o,{cachingStrategy:_e.CachingStrategy.FsTime})),n={name:W.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return le.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=x0(r.project).cjs;if(!oe.existsSync(o))return null;let n=_e.getFactoryWithDefault(this.pnpCache,o,()=>_e.dynamicRequire(o,{cachingStrategy:_e.CachingStrategy.FsTime})).findPackageLocator(le.fromPortablePath(e));return n?W.makeLocator(W.parseIdent(n.name),n.reference):null}makeInstaller(e){return new mm(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},mm=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new _e.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=W.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=W.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!=="SOFT",I,v;if(h||E){let te=A?W.devirtualizeLocator(e):e;I=this.customData.store.get(te.locatorHash),typeof I>"u"&&(I=await YIt(r),e.linkType==="HARD"&&this.customData.store.set(te.locatorHash,I)),I.manifest.type==="module"&&(this.isESMLoaderRequired=!0),v=this.opts.project.getDependencyMeta(te,e.version)}let x=h?IQ(e,I,v,{configuration:this.opts.project.configuration}):null,C=E?await this.unplugPackageIfNeeded(e,I,r,v,o):r.packageFs;if(z.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let R=z.resolve(C.getRealPath(),r.prefixPath),N=sG(this.opts.project.cwd,R),U=new Map,V=new Set;if(A){for(let te of e.peerDependencies.values())U.set(W.stringifyIdent(te),null),V.add(W.stringifyIdent(te));if(!u){let te=W.devirtualizeLocator(e);this.virtualTemplates.set(te.locatorHash,{location:sG(this.opts.project.cwd,mi.resolveVirtual(R)),locator:te})}}return _e.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:V,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:R,buildRequest:x}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=W.areIdentsEqual(a,n)?n.reference:[W.stringifyIdent(n),n.reference];o.packageDependencies.set(W.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(W.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=x0(this.opts.project);if(this.isEsmEnabled()||await oe.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await oe.removePromise(e.cjs),await oe.removePromise(e.data),await oe.removePromise(e.esmLoader),await oe.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:E,location:I}of this.virtualTemplates.values())_e.getMapWithDefault(this.packageRegistry,W.stringifyIdent(E)).set(E.reference,{packageLocation:I,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:W.stringifyIdent(E),reference:E.reference})),a=r!=="none",n=[],u=new Map,A=_e.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:W.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=x0(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of o)await oe.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=SIe(e);await oe.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await oe.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=bIe(e);await oe.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await oe.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await oe.changeFilePromise(r.esmLoader,(0,rG.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await oe.removePromise(a);else for(let n of await oe.readdirPromise(a)){let u=z.resolve(a,n);this.unpluggedPaths.has(u)||await oe.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=z.join(a.cwd,"node_modules");if(o&&o.test(z.relative(this.opts.project.cwd,a.cwd))||!oe.existsSync(n))continue;let u=await oe.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(A.length===u.length)r.push(n);else for(let p of A)r.push(z.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<"u"?o.unplugged:jIt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(IQ(e,r,o,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,o){let a=ov(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new _u(a,{baseFs:r.packageFs,pathUtils:z}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=z.join(a,r.prefixPath,".ready");await oe.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await oe.mkdirPromise(a,{recursive:!0}),await oe.copyPromise(a,Bt.dot,{baseFs:r.packageFs,overwrite:!1}),await oe.writeFilePromise(n,""))})),new gn(a))}getPackageInformation(e){let r=W.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${W.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${W.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=_e.getMapWithDefault(this.packageRegistry,"@@disk"),o=sG(this.opts.project.cwd,e);return _e.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function sG(t,e){let r=z.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function YIt(t){let e=await Ot.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Ot,r=new Set(["preinstall","install","postinstall"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:nG(t),hasBindingGyp:iG(t)}}}Ye();Ye();qt();var t1e=$e(Zo());var k0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new it("This command can only be used if the `nodeLinker` option is set to `pnp`");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(x=>{let C=W.parseDescriptor(x),R=C.range!=="unknown"?C:W.makeDescriptor(C,"*");if(!kr.validRange(R.range))throw new it(`The range of the descriptor patterns must be a valid semver range (${W.prettyDescriptor(r,R)})`);return N=>{let U=W.stringifyIdent(N);return!t1e.default.isMatch(U,W.stringifyIdent(R))||N.version&&!kr.satisfiesWithPrereleases(N.version,R.range)?!1:(u.delete(x),!0)}}),p=()=>{let x=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!W.isVirtualLocator(C)&&A.some(R=>R(C))&&x.push(C);return x},h=x=>{let C=new Set,R=[],N=(U,V)=>{if(C.has(U.locatorHash))return;let te=!!o.tryWorkspaceByLocator(U);if(!(V>0&&!this.recursive&&te)&&(C.add(U.locatorHash),!o.tryWorkspaceByLocator(U)&&A.some(ae=>ae(U))&&R.push(U),!(V>0&&!this.recursive)))for(let ae of U.dependencies.values()){let fe=o.storedResolutions.get(ae.descriptorHash);if(!fe)throw new Error("Assertion failed: The resolution should have been registered");let ue=o.storedPackages.get(fe);if(!ue)throw new Error("Assertion failed: The package should have been registered");N(ue,V+1)}};for(let U of x)N(U.anchoredPackage,0);return R},E,I;if(this.all&&this.recursive?(E=p(),I="the project"):this.all?(E=h(o.workspaces),I="any workspace"):(E=h([a]),I="this workspace"),u.size>1)throw new it(`Patterns ${de.prettyList(r,u,de.Type.CODE)} don't match any packages referenced by ${I}`);if(u.size>0)throw new it(`Pattern ${de.prettyList(r,u,de.Type.CODE)} doesn't match any packages referenced by ${I}`);E=_e.sortMap(E,x=>W.stringifyLocator(x));let v=await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async x=>{for(let C of E){let R=C.version??"unknown",N=o.topLevelWorkspace.manifest.ensureDependencyMeta(W.makeDescriptor(C,R));N.unplugged=!0,x.reportInfo(0,`Will unpack ${W.prettyLocator(r,C)} to ${de.pretty(r,ov(C,{configuration:r}),de.Type.PATH)}`),x.reportJson({locator:W.stringifyLocator(C),version:R})}await o.topLevelWorkspace.persistManifest(),this.json||x.reportSeparator()});return v.hasErrors()?v.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};k0.paths=[["unplug"]],k0.usage=nt.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 '*'"]]});var x0=t=>({cjs:z.join(t.cwd,dr.pnpCjs),data:z.join(t.cwd,dr.pnpData),esmLoader:z.join(t.cwd,dr.pnpEsmLoader)}),n1e=t=>/\s/.test(t)?JSON.stringify(t):t;async function WIt(t,e,r){let o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=(e.NODE_OPTIONS??"").replace(o," ").replace(a," ").trim();if(t.configuration.get("nodeLinker")!=="pnp"){e.NODE_OPTIONS=n||void 0;return}let u=x0(t),A=`--require ${n1e(le.fromPortablePath(u.cjs))}`;oe.existsSync(u.esmLoader)&&(A=`${A} --experimental-loader ${(0,r1e.pathToFileURL)(le.fromPortablePath(u.esmLoader)).href}`),oe.existsSync(u.cjs)&&(e.NODE_OPTIONS=n?`${A} ${n}`:A)}async function KIt(t,e){let r=x0(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var zIt={hooks:{populateYarnPaths:KIt,setupScriptEnvironment:WIt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[b0],commands:[k0]},VIt=zIt;var A1e=$e(l1e());qt();var pG=$e(ve("crypto")),f1e=$e(ve("fs")),p1e=1,Pi="node_modules",BQ=".bin",h1e=".yarn-state.yml",f1t=1e3,hG=(o=>(o.CLASSIC="classic",o.HARDLINKS_LOCAL="hardlinks-local",o.HARDLINKS_GLOBAL="hardlinks-global",o))(hG||{}),lv=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await _e.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await fG(r.project,{unrollAliases:!0}));if(a===null)throw new it("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(W.stringifyLocator(e));if(!n){let p=new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let u=n.locations.sort((p,h)=>p.split(z.sep).length-h.split(z.sep).length),A=z.join(r.project.configuration.startingCwd,Pi);return u.find(p=>z.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await _e.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await fG(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=vQ(z.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return W.parseLocator(A)}makeInstaller(e){return new AG(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},AG=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=z.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await p1t(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!W.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,u=new Set;n.has(W.stringifyIdent(e))||n.set(W.stringifyIdent(e),e.reference);let A=e;if(W.isVirtualLocator(e)){A=W.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(W.stringifyIdent(E),null),u.add(W.stringifyIdent(E))}let p={packageLocation:`${le.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildRequest:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let u=W.areIdentsEqual(a,n)?n.reference:[W.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(W.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new mi({baseFs:new Jl({maxOpenFiles:80,readOnlyArchives:!0})}),r=await fG(this.opts.project),o=this.opts.project.configuration.get("nmMode");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(v=>{let x=this.opts.project.configuration.get("nmHoistingLimits");try{x=_e.validateEnum(VB,v.manifest.installConfig?.hoistingLimits??x)}catch{let R=W.prettyWorkspace(this.opts.project.configuration,v);this.opts.report.reportWarning(57,`${R}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(VB).join(", ")}, using default: "${x}"`)}return[v.relativeCwd,x]})),n=new Map(this.opts.project.workspaces.map(v=>{let x=this.opts.project.configuration.get("nmSelfReferences");return x=v.manifest.installConfig?.selfReferences??x,[v.relativeCwd,x]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(v,x)=>Array.isArray(x)?{name:x[0],reference:x[1]}:{name:v,reference:x},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(v=>{let x=v.anchoredLocator;return{name:W.stringifyIdent(x),reference:x.reference}}),getPackageInformation:v=>{let x=v.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:W.makeLocator(W.parseIdent(v.name),v.reference),C=this.localStore.get(x.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return C.pnpNode},findPackageLocator:v=>{let x=this.opts.project.tryWorkspaceByCwd(le.toPortablePath(v));if(x!==null){let C=x.anchoredLocator;return{name:W.stringifyIdent(C),reference:C.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:v=>le.fromPortablePath(mi.resolveVirtual(le.toPortablePath(v)))},{tree:A,errors:p,preserveSymlinksRequired:h}=JB(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:v,text:x}of p)this.opts.report.reportError(v,x);return}let E=Hq(A);await E1t(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async v=>{let x=W.parseLocator(v),C=this.localStore.get(x.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the slot to exist");return C.customPackageData.manifest}});let I=[];for(let[v,x]of E.entries()){if(y1e(v))continue;let C=W.parseLocator(v),R=this.localStore.get(C.locatorHash);if(typeof R>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(R.pkg))continue;let N=yA.extractBuildRequest(R.pkg,R.customPackageData,R.dependencyMeta,{configuration:this.opts.project.configuration});!N||I.push({buildLocations:x.locations,locator:C,buildRequest:N})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${de.pretty(this.opts.project.configuration,"--preserve-symlinks",de.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:I}}};async function p1t(t,e){let r=await Ot.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Ot,o=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:yA.hasBindingGyp(e)}}}async function h1t(t,e,r,o,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,n+=`# cause your node_modules installation to become invalidated. +`,n+=` +`,n+=`__metadata: +`,n+=` version: ${p1e} +`,n+=` nmMode: ${o.value} +`;let u=Array.from(e.keys()).sort(),A=W.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let I=e.get(E);n+=` +`,n+=`${JSON.stringify(E)}: +`,n+=` locations: +`;for(let v of I.locations){let x=z.contains(t.cwd,v);if(x===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` - ${JSON.stringify(x)} +`}if(I.aliases.length>0){n+=` aliases: +`;for(let v of I.aliases)n+=` - ${JSON.stringify(v)} +`}if(E===A&&r.size>0){n+=` bin: +`;for(let[v,x]of r){let C=z.contains(t.cwd,v);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=` ${JSON.stringify(C)}: +`;for(let[R,N]of x){let U=z.relative(z.join(v,Pi),N);n+=` ${JSON.stringify(R)}: ${JSON.stringify(U)} +`}}}}let p=t.cwd,h=z.join(p,Pi,h1e);a&&await oe.removePromise(h),await oe.changeFilePromise(h,n,{automaticNewlines:!0})}async function fG(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=z.join(r,Pi,h1e),a;try{a=await oe.statPromise(o)}catch{}if(!a)return null;let n=Ki(await oe.readFilePromise(o,"utf8"));if(n.__metadata.version>p1e)return null;let u=n.__metadata.nmMode||"classic",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let I=E.locations.map(x=>z.join(r,x)),v=E.bin;if(v)for(let[x,C]of Object.entries(v)){let R=z.join(r,le.toPortablePath(x)),N=_e.getMapWithDefault(p,R);for(let[U,V]of Object.entries(C))N.set(U,le.toPortablePath([R,Pi,V].join(z.sep)))}if(A.set(h,{target:Bt.dot,linkType:"HARD",locations:I,aliases:E.aliases||[]}),e&&E.aliases)for(let x of E.aliases){let{scope:C,name:R}=W.parseLocator(h),N=W.makeLocator(W.makeIdent(C,R),x),U=W.stringifyLocator(N);A.set(U,{target:Bt.dot,linkType:"HARD",locations:I,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:g1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var WC=async(t,e)=>{if(t.split(z.sep).indexOf(Pi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop){let o=e.allowSymlink?await oe.statPromise(t):await oe.lstatPromise(t);if(e.allowSymlink&&!o.isDirectory()||!e.allowSymlink&&o.isSymbolicLink()){await oe.unlinkPromise(t);return}}let r=await oe.readdirPromise(t,{withFileTypes:!0});for(let o of r){let a=z.join(t,o.name);o.isDirectory()?(o.name!==Pi||e&&e.innerLoop)&&await WC(a,{innerLoop:!0,contentsOnly:!1}):await oe.unlinkPromise(a)}e.contentsOnly||await oe.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},c1e=4,vQ=(t,{skipPrefix:e})=>{let r=z.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(z.sep).filter(p=>p!==""),a=o.indexOf(Pi),n=o.slice(0,a).join(z.sep),u=z.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},g1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&z.contains(e,n.target)!==null){let A=_e.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=vQ(u,{skipPrefix:e}),h=_e.getFactoryWithDefault(r,A,o);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let o;try{o=await oe.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await oe.symlinkPromise(t,e,"junction");return}}await oe.symlinkPromise(z.relative(z.dirname(e),t),e)};async function d1e(t,e,r){let o=z.join(t,`${pG.default.randomBytes(16).toString("hex")}.tmp`);try{await oe.writeFilePromise(o,r);try{await oe.linkPromise(o,e)}catch{}}finally{await oe.unlinkPromise(o)}}async function g1t({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind===m1e.FILE){if(n.value==="hardlinks-global"&&o&&r.digest){let A=z.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await oe.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs(o.FILE="file",o.DIRECTORY="directory",o.SYMLINK="symlink",o))(m1e||{}),d1t=async(t,e,{baseFs:r,globalHardlinksStore:o,nmMode:a,windowsLinkType:n,packageChecksum:u})=>{await oe.mkdirPromise(t,{recursive:!0});let A=async(E=Bt.dot)=>{let I=z.join(e,E),v=await r.readdirPromise(I,{withFileTypes:!0}),x=new Map;for(let C of v){let R=z.join(E,C.name),N,U=z.join(I,C.name);if(C.isFile()){if(N={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let V=await wn.checksumFile(U,{baseFs:r,algorithm:"sha1"});N.digest=V}}else if(C.isDirectory())N={kind:"directory"};else if(C.isSymbolicLink())N={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(x.set(R,N),C.isDirectory()&&R!==Pi){let V=await A(R);for(let[te,ae]of V)x.set(te,ae)}}return x},p;if(a.value==="hardlinks-global"&&o&&u){let E=z.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await oe.readFilePromise(E,"utf8"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,I]of p){let v=z.join(e,E),x=z.join(t,E);if(I.kind==="directory")await oe.mkdirPromise(x,{recursive:!0});else if(I.kind==="file"){let C=I.mtimeMs;await g1t({srcPath:v,dstPath:x,entry:I,nmMode:a,baseFs:r,globalHardlinksStore:o}),I.mtimeMs!==C&&(h=!0)}else I.kind==="symlink"&&await gG(z.resolve(z.dirname(x),I.symlinkTo),x,n)}if(a.value==="hardlinks-global"&&o&&h&&u){let E=z.join(o,u.substring(0,2),`${u.substring(2)}.json`);await oe.removePromise(E),await d1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function m1t(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,I,v,x)=>{let C=!0,R=z.join(h,E),N=new Set;if(E===Pi||E.startsWith("@")){let V;try{V=oe.statSync(R)}catch{}C=!!V,V?V.mtimeMs>r?(A=!0,N=new Set(oe.readdirSync(R))):N=new Set(I.children.get(E).children.keys()):A=!0;let te=e.get(h);if(te){let ae=z.join(h,Pi,BQ),fe;try{fe=oe.statSync(ae)}catch{}if(!fe)A=!0;else if(fe.mtimeMs>r){A=!0;let ue=new Set(oe.readdirSync(ae)),me=new Map;n.set(h,me);for(let[he,Be]of te)ue.has(he)&&me.set(he,Be)}else n.set(h,te)}}else C=x.has(E);let U=I.children.get(E);if(C){let{linkType:V,locator:te}=U,ae={children:new Map,linkType:V,locator:te};if(v.children.set(E,ae),te){let fe=_e.getSetWithDefault(u,te);fe.add(R),u.set(te,fe)}for(let fe of U.children.keys())p(R,fe,U,ae,N)}else U.locator&&o.storedBuildState.delete(W.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:I,locator:v}=E,x={children:new Map,linkType:I,locator:v};if(a.set(h,x),v){let C=_e.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(Pi)&&p(h,Pi,E,x,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function y1e(t){let e=W.parseDescriptor(t);return W.isVirtualDescriptor(e)&&(e=W.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function y1t(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=y1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[I,v]of h.bin){let x=z.join(p[0],v);v!==""&&oe.existsSync(x)&&E.set(I,v)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,I=z.contains(r,A);if(h.locator&&I!==null){let v=a.get(h.locator);for(let[x,C]of v){let R=z.join(A,le.toPortablePath(C));E.set(x,R)}for(let[x,C]of h.children){let R=z.join(A,x),N=u(R,R,C);N.size>0&&n.set(A,new Map([...n.get(A)||new Map,...N]))}}else for(let[v,x]of h.children){let C=u(z.join(A,v),p,x);for(let[R,N]of C)E.set(R,N)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var u1e=(t,e)=>{if(!t||!e)return t===e;let r=W.parseLocator(t);W.isVirtualLocator(r)&&(r=W.devirtualizeLocator(r));let o=W.parseLocator(e);return W.isVirtualLocator(o)&&(o=W.devirtualizeLocator(o)),W.areLocatorsEqual(r,o)};function dG(t){return z.join(t.get("globalFolder"),"store")}async function E1t(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=z.join(o.cwd,Pi),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:I}=m1t(t.locationTree,t.binSymlinks,t.mtimeMs,o),v=g1e(e,{skipPrefix:o.cwd}),x=[],C=async({srcDir:Be,dstDir:we,linkType:g,globalHardlinksStore:Ee,nmMode:Pe,windowsLinkType:ce,packageChecksum:ne})=>{let ee=(async()=>{try{g==="SOFT"?(await oe.mkdirPromise(z.dirname(we),{recursive:!0}),await gG(z.resolve(Be),we,ce)):await d1t(we,Be,{baseFs:r,globalHardlinksStore:Ee,nmMode:Pe,windowsLinkType:ce,packageChecksum:ne})}catch(Ie){throw Ie.message=`While persisting ${Be} -> ${we} ${Ie.message}`,Ie}finally{ae.tick()}})().then(()=>x.splice(x.indexOf(ee),1));x.push(ee),x.length>c1e&&await Promise.race(x)},R=async(Be,we,g)=>{let Ee=(async()=>{let Pe=async(ce,ne,ee)=>{try{ee.innerLoop||await oe.mkdirPromise(ne,{recursive:!0});let Ie=await oe.readdirPromise(ce,{withFileTypes:!0});for(let Fe of Ie){if(!ee.innerLoop&&Fe.name===BQ)continue;let At=z.join(ce,Fe.name),H=z.join(ne,Fe.name);Fe.isDirectory()?(Fe.name!==Pi||ee&&ee.innerLoop)&&(await oe.mkdirPromise(H,{recursive:!0}),await Pe(At,H,{...ee,innerLoop:!0})):me.value==="hardlinks-local"||me.value==="hardlinks-global"?await oe.linkPromise(At,H):await oe.copyFilePromise(At,H,f1e.default.constants.COPYFILE_FICLONE)}}catch(Ie){throw ee.innerLoop||(Ie.message=`While cloning ${ce} -> ${ne} ${Ie.message}`),Ie}finally{ee.innerLoop||ae.tick()}};await Pe(Be,we,g)})().then(()=>x.splice(x.indexOf(Ee),1));x.push(Ee),x.length>c1e&&await Promise.race(x)},N=async(Be,we,g)=>{if(g)for(let[Ee,Pe]of we.children){let ce=g.children.get(Ee);await N(z.join(Be,Ee),Pe,ce)}else{we.children.has(Pi)&&await WC(z.join(Be,Pi),{contentsOnly:!1});let Ee=z.basename(Be)===Pi&&v.has(z.join(z.dirname(Be),z.sep));await WC(Be,{contentsOnly:Be===A,allowSymlink:Ee})}};for(let[Be,we]of p){let g=v.get(Be);for(let[Ee,Pe]of we.children){if(Ee===".")continue;let ce=g&&g.children.get(Ee),ne=z.join(Be,Ee);await N(ne,Pe,ce)}}let U=async(Be,we,g)=>{if(g){u1e(we.locator,g.locator)||await WC(Be,{contentsOnly:we.linkType==="HARD"});for(let[Ee,Pe]of we.children){let ce=g.children.get(Ee);await U(z.join(Be,Ee),Pe,ce)}}else{we.children.has(Pi)&&await WC(z.join(Be,Pi),{contentsOnly:!0});let Ee=z.basename(Be)===Pi&&v.has(z.join(z.dirname(Be),z.sep));await WC(Be,{contentsOnly:we.linkType==="HARD",allowSymlink:Ee})}};for(let[Be,we]of v){let g=p.get(Be);for(let[Ee,Pe]of we.children){if(Ee===".")continue;let ce=g&&g.children.get(Ee);await U(z.join(Be,Ee),Pe,ce)}}let V=new Map,te=[];for(let[Be,we]of E)for(let g of we){let{locationRoot:Ee,segments:Pe}=vQ(g,{skipPrefix:o.cwd}),ce=v.get(Ee),ne=Ee;if(ce){for(let ee of Pe)if(ne=z.join(ne,ee),ce=ce.children.get(ee),!ce)break;if(ce){let ee=u1e(ce.locator,Be),Ie=e.get(ce.locator),Fe=Ie.target,At=ne,H=Ie.linkType;if(ee)V.has(Fe)||V.set(Fe,At);else if(Fe!==At){let at=W.parseLocator(ce.locator);W.isVirtualLocator(at)&&(at=W.devirtualizeLocator(at)),te.push({srcDir:Fe,dstDir:At,linkType:H,realLocatorHash:at.locatorHash})}}}}for(let[Be,{locations:we}]of e.entries())for(let g of we){let{locationRoot:Ee,segments:Pe}=vQ(g,{skipPrefix:o.cwd}),ce=p.get(Ee),ne=v.get(Ee),ee=Ee,Ie=e.get(Be),Fe=W.parseLocator(Be);W.isVirtualLocator(Fe)&&(Fe=W.devirtualizeLocator(Fe));let At=Fe.locatorHash,H=Ie.target,at=g;if(H===at)continue;let Re=Ie.linkType;for(let ke of Pe)ne=ne.children.get(ke);if(!ce)te.push({srcDir:H,dstDir:at,linkType:Re,realLocatorHash:At});else for(let ke of Pe)if(ee=z.join(ee,ke),ce=ce.children.get(ke),!ce){te.push({srcDir:H,dstDir:at,linkType:Re,realLocatorHash:At});break}}let ae=Xs.progressViaCounter(te.length),fe=a.reportProgress(ae),ue=o.configuration.get("nmMode"),me={value:ue},he=o.configuration.get("winLinkType");try{let Be=me.value==="hardlinks-global"?`${dG(o.configuration)}/v1`:null;if(Be&&!await oe.existsPromise(Be)){await oe.mkdirpPromise(Be);for(let g=0;g<256;g++)await oe.mkdirPromise(z.join(Be,g.toString(16).padStart(2,"0")))}for(let g of te)(g.linkType==="SOFT"||!V.has(g.srcDir))&&(V.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:Be,nmMode:me,windowsLinkType:he,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(x),x.length=0;for(let g of te){let Ee=V.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==Ee&&await R(Ee,g.dstDir,{nmMode:me})}await Promise.all(x),await oe.mkdirPromise(A,{recursive:!0});let we=await y1t(e,v,o.cwd,{loadManifest:n});await C1t(h,we,o.cwd,he),await h1t(o,e,we,me,{installChangedByUser:I}),ue=="hardlinks-global"&&me.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{fe.stop()}}async function C1t(t,e,r,o){for(let a of t.keys()){if(z.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=z.join(a,Pi,BQ);await oe.removePromise(n)}}for(let[a,n]of e){if(z.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=z.join(a,Pi,BQ),A=t.get(a)||new Map;await oe.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await oe.removePromise(z.join(u,p)),process.platform==="win32"&&await oe.removePromise(z.join(u,`${p}.cmd`)));for(let[p,h]of n){let E=A.get(p),I=z.join(u,p);E!==h&&(process.platform==="win32"?await(0,A1e.default)(le.fromPortablePath(h),le.fromPortablePath(I),{createPwshFile:!1}):(await oe.removePromise(I),await gG(h,I,o),z.contains(r,await oe.realpathPromise(h))!==null&&await oe.chmodPromise(h,493)))}}}Ye();Pt();iA();var cv=class extends b0{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new mG(r)}},mG=class extends mm{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let o=new mi({baseFs:new Jl({maxOpenFiles:80,readOnlyArchives:!0})}),a=XIe(r,this.opts.project.cwd,o),{tree:n,errors:u}=JB(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:I,text:v}of u)this.opts.report.reportError(I,v);return}let A=new Map;r.fallbackPool=A;let p=(I,v)=>{let x=W.parseLocator(v.locator),C=W.stringifyIdent(x);C===I?A.set(I,x.reference):A.set(I,[C,x.reference])},h=z.join(this.opts.project.cwd,dr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let I of E.dirList){let v=z.join(h,I),x=n.get(v);if(typeof x>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in x)p(I,x);else for(let C of x.dirList){let R=z.join(v,C),N=n.get(R);if(typeof N>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in N)p(`${I}/${C}`,N);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var w1t={hooks:{cleanGlobalArtifacts:async t=>{let e=dG(t);await oe.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[lv,cv]},I1t=w1t;var dj={};zt(dj,{NpmHttpFetcher:()=>fv,NpmRemapResolver:()=>pv,NpmSemverFetcher:()=>ml,NpmSemverResolver:()=>hv,NpmTagResolver:()=>gv,default:()=>Ovt,npmConfigUtils:()=>$n,npmHttpUtils:()=>Zr,npmPublishUtils:()=>ow});Ye();var P1e=$e(Jn());var Wn="npm:";var Zr={};zt(Zr,{AuthType:()=>B1e,customPackageError:()=>ym,del:()=>T1t,get:()=>Em,getIdentUrl:()=>DQ,getPackageMetadata:()=>VC,handleInvalidAuthenticationError:()=>Q0,post:()=>F1t,put:()=>R1t});Ye();Ye();Pt();var wG=$e(f2()),w1e=$e(D_()),I1e=$e(Jn());var $n={};zt($n,{RegistryType:()=>E1e,getAuditRegistry:()=>B1t,getAuthConfiguration:()=>CG,getDefaultRegistry:()=>uv,getPublishRegistry:()=>v1t,getRegistryConfiguration:()=>C1e,getScopeConfiguration:()=>EG,getScopeRegistry:()=>KC,normalizeRegistry:()=>ac});var E1e=(o=>(o.AUDIT_REGISTRY="npmAuditRegistry",o.FETCH_REGISTRY="npmRegistryServer",o.PUBLISH_REGISTRY="npmPublishRegistry",o))(E1e||{});function ac(t){return t.replace(/\/$/,"")}function B1t({configuration:t}){return uv({configuration:t,type:"npmAuditRegistry"})}function v1t(t,{configuration:e}){return t.publishConfig?.registry?ac(t.publishConfig.registry):t.name?KC(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):uv({configuration:e,type:"npmPublishRegistry"})}function KC(t,{configuration:e,type:r="npmRegistryServer"}){let o=EG(t,{configuration:e});if(o===null)return uv({configuration:e,type:r});let a=o.get(r);return a===null?uv({configuration:e,type:r}):ac(a)}function uv({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return ac(r!==null?r:t.get("npmRegistryServer"))}function C1e(t,{configuration:e}){let r=e.get("npmRegistries"),o=ac(t),a=r.get(o);if(typeof a<"u")return a;let n=r.get(o.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}function EG(t,{configuration:e}){if(t===null)return null;let o=e.get("npmScopes").get(t);return o||null}function CG(t,{configuration:e,ident:r}){let o=r&&EG(r.scope,{configuration:e});return o?.get("npmAuthIdent")||o?.get("npmAuthToken")?o:C1e(t,{configuration:e})||e}var B1e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(B1e||{});async function Q0(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){if(SQ(t))throw new Jt(41,"Invalid OTP token");if(t.originalError?.name==="HTTPError"&&t.originalError?.response.statusCode===401)throw new Jt(41,`Invalid authentication (${typeof e!="string"?`as ${await N1t(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function ym(t,e){let r=t.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${de.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function DQ(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var v1e=new Map,D1t=new Map;async function P1t(t){return await _e.getFactoryWithDefault(v1e,t,async()=>{let e=null;try{e=await oe.readJsonPromise(t)}catch{}return e})}async function S1t(t,e,{configuration:r,cached:o,registry:a,headers:n,version:u,...A}){return await _e.getFactoryWithDefault(D1t,t,async()=>await Em(DQ(e),{...A,customErrorMessage:ym,configuration:r,registry:a,ident:e,headers:{...n,["If-None-Match"]:o?.etag,["If-Modified-Since"]:o?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(o===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...h,body:o.metadata}}let E=b1t(JSON.parse(h.body.toString())),I={metadata:E,etag:h.headers.etag,lastModified:h.headers["last-modified"]};return v1e.set(t,Promise.resolve(I)),Promise.resolve().then(async()=>{let v=`${t}-${process.pid}.tmp`;await oe.mkdirPromise(z.dirname(v),{recursive:!0}),await oe.writeJsonPromise(v,I,{compact:!0}),await oe.renamePromise(v,t)}).catch(()=>{}),{...h,body:E}}}))}async function VC(t,{cache:e,project:r,registry:o,headers:a,version:n,...u}){let{configuration:A}=r;o=Av(A,{ident:t,registry:o});let p=k1t(A,o),h=z.join(p,`${W.slugifyIdent(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await P1t(h),E)){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(A.get("enableOfflineMode")){let I=structuredClone(E.metadata),v=new Set;if(e){for(let C of Object.keys(I.versions)){let R=W.makeLocator(t,`npm:${C}`),N=e.getLocatorMirrorPath(R);(!N||!oe.existsSync(N))&&(delete I.versions[C],v.add(C))}let x=I["dist-tags"].latest;if(v.has(x)){let C=Object.keys(E.metadata.versions).sort(I1e.default.compare),R=C.indexOf(x);for(;v.has(C[R])&&R>=0;)R-=1;R>=0?I["dist-tags"].latest=C[R]:delete I["dist-tags"].latest}}return I}}return await S1t(h,t,{...u,configuration:A,cached:E,registry:o,headers:a,version:n})}var D1e=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function b1t(t){return{"dist-tags":t["dist-tags"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,(0,w1e.default)(r,D1e)]))}}var x1t=wn.makeHash(...D1e).slice(0,6);function k1t(t,e){let r=Q1t(t),o=new URL(e);return z.join(r,x1t,o.hostname)}function Q1t(t){return z.join(t.get("globalFolder"),"metadata/npm")}async function Em(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){n=Av(e,{ident:o,registry:n}),o&&o.scope&&typeof a>"u"&&(a=1);let A=await PQ(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await nn.get(t.charAt(0)==="/"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await Q0(p,{registry:n,configuration:e,headers:r}),p}}async function F1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=Av(o,{ident:n,registry:A});let E=await PQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...zC(p)});try{return await nn.post(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!SQ(I)||p)throw await Q0(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await IG(I,{configuration:o});let v={...a,...zC(p)};try{return await nn.post(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(x){throw await Q0(x,{attemptedAs:r,registry:A,configuration:o,headers:a}),x}}}async function R1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=Av(o,{ident:n,registry:A});let E=await PQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...zC(p)});try{return await nn.put(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!SQ(I))throw await Q0(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await IG(I,{configuration:o});let v={...a,...zC(p)};try{return await nn.put(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(x){throw await Q0(x,{attemptedAs:r,registry:A,configuration:o,headers:a}),x}}}async function T1t(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){u=Av(r,{ident:a,registry:u});let h=await PQ(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...zC(A)});try{return await nn.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!SQ(E)||A)throw await Q0(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await IG(E,{configuration:r});let I={...o,...zC(A)};try{return await nn.del(`${u}${t}`,{configuration:r,headers:I,...p})}catch(v){throw await Q0(v,{attemptedAs:e,registry:u,configuration:r,headers:o}),v}}}function Av(t,{ident:e,registry:r}){if(typeof r>"u"&&e)return KC(e.scope,{configuration:t});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return ac(r)}async function PQ(t,{authType:e=2,configuration:r,ident:o}){let a=CG(t,{configuration:r,ident:o}),n=L1t(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get("npmAuthToken"))return`Bearer ${a.get("npmAuthToken")}`;if(a.get("npmAuthIdent")){let A=a.get("npmAuthIdent");return A.includes(":")?`Basic ${Buffer.from(A).toString("base64")}`:`Basic ${A}`}if(n&&e!==1)throw new Jt(33,"No authentication configured for request");return null}function L1t(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function N1t(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await nn.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function IG(t,{configuration:e}){let r=t.originalError?.response.headers["npm-notice"];if(r&&(await Lt.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,de.pretty(e,"$1",de.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&Vi.openUrl){let{openNow:u}=await(0,wG.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});u&&(await Vi.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` +`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:o}=await(0,wG.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` +`),o}function SQ(t){if(t.originalError?.name!=="HTTPError")return!1;try{return(t.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function zC(t){return{["npm-otp"]:t}}var fv=class{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o,params:a}=W.parseRange(e.reference);return!(!P1e.default.valid(o)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=W.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await Em(o.__archiveUrl,{customErrorMessage:ym,configuration:r.project.configuration,ident:e});return await Xi.convertToZip(a,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}};Ye();var pv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!W.tryParseDescriptor(e.range.slice(Wn.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(W.parseDescriptor(e.range.slice(Wn.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error("Unreachable")}};Ye();Ye();var S1e=$e(Jn());var ml=class{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let o=new URL(e.reference);return!(!S1e.default.valid(o.pathname)||o.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await Em(ml.getLocatorUrl(e),{customErrorMessage:ym,configuration:r.project.configuration,ident:e})}catch{o=await Em(ml.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:ym,configuration:r.project.configuration,ident:e})}return await Xi.convertToZip(o,{configuration:r.project.configuration,prefixPath:W.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=KC(e.scope,{configuration:o}),n=ml.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=kr.clean(e.reference.slice(Wn.length));if(r===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");return`${DQ(e)}/-/${e.name}-${r}.tgz`}};Ye();Ye();Ye();var BG=$e(Jn());var bQ=W.makeIdent(null,"node-gyp"),O1t=/\b(node-gyp|prebuild-install)\b/,hv=class{supportsDescriptor(e,r){return e.range.startsWith(Wn)?!!kr.validRange(e.range.slice(Wn.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o}=W.parseRange(e.reference);return!!BG.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=kr.validRange(e.range.slice(Wn.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);let n=await VC(e,{cache:o.fetchOptions?.cache,project:o.project,version:BG.default.valid(a.raw)?a.raw:void 0}),u=_e.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new kr.SemVer(h);if(a.test(E))return E}catch{}return _e.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=W.makeLocator(e,`${Wn}${h.raw}`),I=n.versions[h.raw].dist.tarball;return ml.isConventionalTarballUrl(E,I,{configuration:o.project.configuration})?E:W.bindLocator(E,{__archiveUrl:I})})}async getSatisfying(e,r,o,a){let n=kr.validRange(e.range.slice(Wn.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);return{locators:_e.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return _e.mapAndFilter.skip;let h=W.tryParseRange(p.reference,{requireProtocol:Wn});if(!h)return _e.mapAndFilter.skip;let E=new kr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:_e.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=W.parseRange(e.reference),a=kr.clean(o);if(a===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await VC(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new Jt(16,`Registry failed to return reference "${a}"`);let u=new Ot;if(u.load(n.versions[a]),!u.dependencies.has(bQ.identHash)&&!u.peerDependencies.has(bQ.identHash)){for(let A of u.scripts.values())if(A.match(O1t)){u.dependencies.set(bQ.identHash,W.makeDescriptor(bQ,"latest"));break}}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ye();Ye();var b1e=$e(Jn());var gv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!FE.test(e.range.slice(Wn.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Wn.length),n=await VC(e,{cache:o.fetchOptions?.cache,project:o.project});if(!Object.hasOwn(n,"dist-tags"))throw new Jt(15,'Registry returned invalid data - missing "dist-tags" field');let u=n["dist-tags"];if(!Object.hasOwn(u,a))throw new Jt(16,`Registry failed to return tag "${a}"`);let A=u[a],p=W.makeLocator(e,`${Wn}${A}`),h=n.versions[A].dist.tarball;return ml.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[W.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){let n=[];for(let u of o){if(u.identHash!==e.identHash)continue;let A=W.tryParseRange(u.reference,{requireProtocol:Wn});if(!(!A||!b1e.default.valid(A.selector))){if(A.params?.__archiveUrl){let p=W.makeRange({protocol:Wn,selector:A.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(W.makeDescriptor(e,p),r,a);if(u.reference!==h.reference)continue}n.push(u)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var ow={};zt(ow,{getGitHead:()=>Lvt,getPublishAccess:()=>mBe,getReadmeContent:()=>yBe,makePublishBody:()=>Tvt});Ye();Ye();Pt();var Aj={};zt(Aj,{PackCommand:()=>_0,default:()=>dvt,packUtils:()=>wA});Ye();Ye();Ye();Pt();qt();var wA={};zt(wA,{genPackList:()=>XQ,genPackStream:()=>uj,genPackageManifest:()=>sBe,hasPackScripts:()=>lj,prepareForPack:()=>cj});Ye();Pt();var aj=$e(Zo()),nBe=$e($2e()),iBe=ve("zlib"),svt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],ovt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function lj(t){return!!(un.hasWorkspaceScript(t,"prepack")||un.hasWorkspaceScript(t,"postpack"))}async function cj(t,{report:e},r){await un.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let o=z.join(t.cwd,Ot.fileName);await oe.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:oe}),await r()}finally{await un.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function uj(t,e){typeof e>"u"&&(e=await XQ(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(z.normalize(n));for(let n of t.manifest.bin.values())r.add(z.normalize(n));let o=nBe.default.pack();process.nextTick(async()=>{for(let n of e){let u=z.normalize(n),A=z.resolve(t.cwd,u),p=z.join("package",u),h=await oe.lstatPromise(A),E={name:p,mtime:new Date(vi.SAFE_TIME*1e3)},I=r.has(u)?493:420,v,x,C=new Promise((N,U)=>{v=N,x=U}),R=N=>{N?x(N):v()};if(h.isFile()){let N;u==="package.json"?N=Buffer.from(JSON.stringify(await sBe(t),null,2)):N=await oe.readFilePromise(A),o.entry({...E,mode:I,type:"file"},N,R)}else h.isSymbolicLink()?o.entry({...E,mode:I,type:"symlink",linkname:await oe.readlinkPromise(A)},R):R(new Error(`Unsupported file type ${h.mode} for ${le.fromPortablePath(u)}`));await C}o.finalize()});let a=(0,iBe.createGzip)();return o.pipe(a),a}async function sBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function XQ(t){let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let I of ovt)o.reject.push(I);for(let I of svt)o.accept.push(I);o.reject.push(r.get("rcFilename"));let a=I=>{if(I===null||!I.startsWith(`${t.cwd}/`))return;let v=z.relative(t.cwd,I),x=z.resolve(Bt.root,v);o.reject.push(x)};a(z.resolve(e.cwd,dr.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(I=>I.populateYarnPaths,e,I=>{a(I)});for(let I of e.workspaces){let v=z.relative(t.cwd,I.cwd);v!==""&&!v.match(/^(\.\.)?\//)&&o.reject.push(`/${v}`)}let n={accept:[],reject:[]},u=t.manifest.publishConfig?.main??t.manifest.main,A=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;u!=null&&n.accept.push(z.resolve(Bt.root,u)),A!=null&&n.accept.push(z.resolve(Bt.root,A)),typeof p=="string"&&n.accept.push(z.resolve(Bt.root,p));for(let I of h.values())n.accept.push(z.resolve(Bt.root,I));if(p instanceof Map)for(let[I,v]of p.entries())n.accept.push(z.resolve(Bt.root,I)),typeof v=="string"&&n.accept.push(z.resolve(Bt.root,v));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let I of t.manifest.files)oBe(n.accept,I,{cwd:Bt.root})}return await avt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function avt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new Hu(t),u=[[Bt.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!tBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),I=!1,v=!1;if(!e||A!==Bt.root)for(let R of E)I=I||R===".gitignore",v=v||R===".npmignore";let x=v?await eBe(n,A,".npmignore"):I?await eBe(n,A,".gitignore"):null,C=x!==null?[x].concat(p):p;tBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:["**/*"]}]);for(let R of E)u.push([z.resolve(A,R),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(z.relative(Bt.root,A))}return a.sort()}async function eBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(z.join(e,r),"utf8");for(let n of a.split(/\n/g))oBe(o.reject,n,{cwd:e});return o}function lvt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=z.resolve(e,t)),r&&(t=`!${t}`),t}function oBe(t,e,{cwd:r}){let o=e.trim();o===""||o[0]==="#"||t.push(lvt(o,{cwd:r}))}function tBe(t,{globalList:e,ignoreLists:r}){let o=JQ(t,e.accept);if(o!==0)return o===2;let a=JQ(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=JQ(t,n.accept);if(u!==0)return u===2;let A=JQ(t,n.reject);if(A!==0)return A===1}return!1}function JQ(t,e){let r=e,o=[];for(let a=0;a{await cj(a,{report:p},async()=>{p.reportJson({base:le.fromPortablePath(a.cwd)});let h=await XQ(a);for(let E of h)p.reportInfo(null,le.fromPortablePath(E)),p.reportJson({location:le.fromPortablePath(E)});if(!this.dryRun){let E=await uj(a,h),I=oe.createWriteStream(u);E.pipe(I),await new Promise(v=>{I.on("finish",v)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${de.pretty(r,u,de.Type.PATH)}`),p.reportJson({output:le.fromPortablePath(u)}))})).exitCode()}};_0.paths=[["pack"]],_0.usage=nt.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"]]});function cvt(t,{workspace:e}){let r=t.replace("%s",uvt(e)).replace("%v",Avt(e));return le.toPortablePath(r)}function uvt(t){return t.manifest.name!==null?W.slugifyIdent(t.manifest.name):"package"}function Avt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var fvt=["dependencies","devDependencies","peerDependencies"],pvt="workspace:",hvt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of fvt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=W.parseRange(a.range);if(u.protocol===pvt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Jt(21,`${W.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;W.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector==="*"?A=n.manifest.version??"0.0.0":u.selector==="~"||u.selector==="^"?A=`${u.selector}${n.manifest.version??"0.0.0"}`:A=u.selector;let p=o==="dependencies"?W.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":o;e[h][W.stringifyIdent(a)]=A}}},gvt={hooks:{beforeWorkspacePacking:hvt},commands:[_0]},dvt=gvt;var gBe=ve("crypto"),dBe=$e(hBe());async function Tvt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.manifest.name,A=t.manifest.version,p=W.stringifyIdent(u),h=(0,gBe.createHash)("sha1").update(e).digest("hex"),E=dBe.default.fromData(e).toString(),I=r??mBe(t,u),v=await yBe(t),x=await wA.genPackageManifest(t),C=`${p}-${A}.tgz`,R=new URL(`${ac(a)}/${p}/-/${C}`);return{_id:p,_attachments:{[C]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:p,access:I,["dist-tags"]:{[o]:A},versions:{[A]:{...x,_id:`${p}@${A}`,name:p,version:A,gitHead:n,dist:{shasum:h,integrity:E,tarball:R.toString()}}},readme:v}}async function Lvt(t){try{let{stdout:e}=await Ur.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}function mBe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?t.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):e.scope?"restricted":"public"}async function yBe(t){let e=le.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${W.stringifyIdent(r)} +`;try{a=await oe.readFilePromise(e,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var gj={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},EBe={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},Nvt={configuration:{...gj,...EBe,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...gj,...EBe}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:ac,valueDefinition:{description:"",type:"SHAPE",properties:{...gj}}}},fetchers:[fv,ml],resolvers:[pv,hv,gv]},Ovt=Nvt;var Dj={};zt(Dj,{NpmAuditCommand:()=>q0,NpmInfoCommand:()=>G0,NpmLoginCommand:()=>j0,NpmLogoutCommand:()=>Y0,NpmPublishCommand:()=>W0,NpmTagAddCommand:()=>z0,NpmTagListCommand:()=>K0,NpmTagRemoveCommand:()=>V0,NpmWhoamiCommand:()=>J0,default:()=>jvt,npmAuditTypes:()=>Rv,npmAuditUtils:()=>ZQ});Ye();Ye();qt();var wj=$e(Zo());$a();var Rv={};zt(Rv,{Environment:()=>Qv,Severity:()=>Fv});var Qv=(o=>(o.All="all",o.Production="production",o.Development="development",o))(Qv||{}),Fv=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(Fv||{});var ZQ={};zt(ZQ,{allSeverities:()=>aw,getPackages:()=>Cj,getReportTree:()=>yj,getSeverityInclusions:()=>mj,getTopLevelDependencies:()=>Ej});Ye();var CBe=$e(Jn());var aw=["info","low","moderate","high","critical"];function mj(t){if(typeof t>"u")return new Set(aw);let e=aw.indexOf(t),r=aw.slice(e);return new Set(r)}function yj(t){let e={},r={children:e};for(let[o,a]of _e.sortMap(Object.entries(t),n=>n[0]))for(let n of _e.sortMap(a,u=>`${u.id}`))e[`${o}/${n.id}`]={value:de.tuple(de.Type.IDENT,W.parseIdent(o)),children:{ID:typeof n.id<"u"&&{label:"ID",value:de.tuple(de.Type.ID,n.id)},Issue:{label:"Issue",value:de.tuple(de.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:de.tuple(de.Type.URL,n.url)},Severity:{label:"Severity",value:de.tuple(de.Type.NO_HINT,n.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:de.tuple(de.Type.RANGE,n.vulnerable_versions)},["Tree Versions"]:{label:"Tree Versions",children:[...n.versions].sort(CBe.default.compare).map(u=>({value:de.tuple(de.Type.REFERENCE,u)}))},Dependents:{label:"Dependents",children:_e.sortMap(n.dependents,u=>W.stringifyLocator(u)).map(u=>({value:de.tuple(de.Type.LOCATOR,u)}))}}};return r}function Ej(t,e,{all:r,environment:o}){let a=[],n=r?t.workspaces:[e],u=["all","production"].includes(o),A=["all","development"].includes(o);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!A:!u)||a.push({workspace:p,dependency:h});return a}function Cj(t,e,{recursive:r}){let o=new Map,a=new Set,n=[],u=(A,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");if(W.ensureDevirtualizedLocator(E).reference.startsWith("npm:")&&E.version!==null){let v=W.stringifyIdent(E),x=_e.getMapWithDefault(o,v);_e.getArrayWithDefault(x,E.version).push(A)}if(r)for(let v of E.dependencies.values())n.push([E,v])};for(let{workspace:A,dependency:p}of e)n.push([A.anchoredLocator,p]);for(;n.length>0;){let[A,p]=n.shift();u(A,p)}return o}var q0=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=ge.String("--environment","all",{description:"Which environments to cover",validator:Ks(Qv)});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=ge.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=ge.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:Ks(Fv)});this.excludes=ge.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=ge.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=Ej(o,a,{all:this.all,environment:this.environment}),u=Cj(o,n,{recursive:this.recursive}),A=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[N,U]of u)A.some(V=>wj.default.isMatch(N,V))||(p[N]=[...U.keys()]);let h=$n.getAuditRegistry({configuration:r}),E,I=await fA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=Zr.post("/-/npm/v1/security/advisories/bulk",p,{authType:Zr.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([te,ae])=>{let fe=await Zr.getPackageMetadata(W.parseIdent(te),{project:o});return _e.mapAndFilter(ae,ue=>{let{deprecated:me}=fe.versions[ue];return me?[te,ue,me]:_e.mapAndFilter.skip})})),V=await N;for(let[te,ae,fe]of U.flat(1))Object.hasOwn(V,te)&&V[te].some(ue=>kr.satisfiesWithPrereleases(ae,ue.vulnerable_versions))||(V[te]??=[],V[te].push({id:`${te} (deprecation)`,title:fe.trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:ae}));E=V});if(I.hasErrors())return I.exitCode();let v=mj(this.severity),x=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),C=Object.create(null);for(let[N,U]of Object.entries(E)){let V=U.filter(te=>!wj.default.isMatch(`${te.id}`,x)&&v.has(te.severity));V.length>0&&(C[N]=V.map(te=>{let ae=u.get(N);if(typeof ae>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let fe=[...ae.keys()].filter(me=>kr.satisfiesWithPrereleases(me,te.vulnerable_versions)),ue=new Map;for(let me of fe)for(let he of ae.get(me))ue.set(he.locatorHash,he);return{...te,versions:fe,dependents:[...ue.values()]}}))}let R=Object.keys(C).length>0;return R?($s.emitTree(yj(C),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,"No audit suggestions")}),R?1:0)}};q0.paths=[["npm","audit"]],q0.usage=nt.Usage({description:"perform a vulnerability audit against the installed packages",details:` + 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). + + 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\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${aw.map(r=>`\`${r}\``).join(", ")}. + + 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. + + If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. + + If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` to get more information as to who depends on them. + `,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"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]});Ye();Ye();Pt();qt();var Ij=$e(Jn()),Bj=ve("util"),G0=class extends ut{constructor(){super(...arguments);this.fields=ge.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],u=!1,A=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let ae=o.topLevelWorkspace;if(!ae.manifest.name)throw new it(`Missing ${de.pretty(r,"name",de.Type.CODE)} field in ${le.fromPortablePath(z.join(ae.cwd,dr.manifest))}`);E=W.makeDescriptor(ae.manifest.name,"unknown")}else E=W.parseDescriptor(h);let I=Zr.getIdentUrl(E),v=vj(await Zr.get(I,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:Zr.customPackageError})),x=Object.keys(v.versions).sort(Ij.default.compareLoose),R=v["dist-tags"].latest||x[x.length-1],N=kr.validRange(E.range);if(N){let ae=Ij.default.maxSatisfying(x,N);ae!==null?R=ae:(p.reportWarning(0,`Unmet range ${W.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.hasOwn(v["dist-tags"],E.range)?R=v["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${W.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let U=v.versions[R],V={...v,...U,version:R,versions:x},te;if(a!==null){te={};for(let ae of a){let fe=V[ae];if(typeof fe<"u")te[ae]=fe;else{p.reportWarning(1,`The ${de.pretty(r,ae,de.Type.CODE)} field doesn't exist inside ${W.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete V.dist,delete V.readme,delete V.users),te=V;p.reportJson(te),this.json||n.push(te)}});Bj.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,Bj.inspect)(p,{depth:1/0,colors:!0,compact:!1})} +`);return A.exitCode()}};G0.paths=[["npm","info"]],G0.usage=nt.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches 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 or to the corresponding tagged version. 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 information.\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 all available information about react@next","yarn npm info react@next"],["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"]]});function vj(t){if(Array.isArray(t)){let e=[];for(let r of t)r=vj(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let o=vj(t[r]);o&&(e[r]=o)}return e}else return t||null}Ye();Ye();qt();var wBe=$e(f2()),j0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=ge.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await $Q({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Lt.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await _vt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=await Mvt(o,u,r);return await Uvt(o,A,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};j0.paths=[["npm","login"]],j0.usage=nt.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"]]});async function $Q({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?$n.getScopeRegistry(t,{configuration:r,type:$n.RegistryType.PUBLISH_REGISTRY}):t?$n.getScopeRegistry(t,{configuration:r}):e?$n.getPublishRegistry((await fC(r,o)).manifest,{configuration:r}):$n.getDefaultRegistry({configuration:r})}async function Mvt(t,e,r){let o=`/-/user/org.couchdb.user:${encodeURIComponent(e.name)}`,a={_id:`org.couchdb.user:${e.name}`,name:e.name,password:e.password,type:"user",roles:[],date:new Date().toISOString()},n={attemptedAs:e.name,configuration:r,registry:t,jsonResponse:!0,authType:Zr.AuthType.NO_AUTH};try{return(await Zr.put(o,a,n)).token}catch(E){if(!(E.originalError?.name==="HTTPError"&&E.originalError?.response.statusCode===409))throw E}let u={...n,authType:Zr.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${e.name}:${e.password}`).toString("base64")}`}},A=await Zr.get(o,u);for(let[E,I]of Object.entries(A))(!a[E]||E==="roles")&&(a[E]=I);let p=`${o}/-rev/${a._rev}`;return(await Zr.put(p,a,u)).token}async function Uvt(t,e,{alwaysAuth:r,scope:o}){let a=u=>A=>{let p=_e.isIndexableObject(A)?A:{},h=p[u],E=_e.isIndexableObject(h)?h:{};return{...p,[u]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await Ke.updateHomeConfiguration(n)}async function _vt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${de.pretty(t,e,de.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"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(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||"",password:t.env.YARN_INJECT_NPM_PASSWORD||""};let u=await(0,wBe.prompt)([{type:"input",name:"name",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),u}Ye();Ye();qt();var lw=new Set(["npmAuthIdent","npmAuthToken"]),Y0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=ge.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await $Q({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await Ke.find(this.context.cwd,this.context.plugins),A=W.makeIdent(this.scope??null,"pkg");return!$n.getAuthConfiguration(n,{configuration:u,ident:A}).get("npmAuthToken")};return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await qvt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await IBe("npmScopes",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let u=await $Q({configuration:r,cwd:this.context.cwd,publish:this.publish});await IBe("npmRegistries",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};Y0.paths=[["npm","logout"]],Y0.usage=nt.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"]]});function Hvt(t,e){let r=t[e];if(!_e.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...lw].every(n=>!o.has(n)))return!1;for(let n of lw)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of lw)delete a[n];return t[e]=a,!0}async function qvt(){let t=e=>{let r=!1,o=_e.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))Hvt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await Ke.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function IBe(t,e){return await Ke.updateHomeConfiguration({[t]:r=>{let o=_e.isIndexableObject(r)?r:{};if(!Object.hasOwn(o,e))return r;let a=o[e],n=_e.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...lw].every(p=>!u.has(p)))return r;for(let p of lw)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of lw)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ye();qt();var W0=class extends ut{constructor(){super(...arguments);this.access=ge.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=ge.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=ge.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=ge.String("--otp",{description:"The OTP token to use with the command"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);if(a.manifest.private)throw new it("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new it("Workspaces must have valid names and versions to be published on an external registry");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=$n.getPublishRegistry(a.manifest,{configuration:r});return(await Lt.start({configuration:r,stdout:this.context.stdout},async h=>{if(this.tolerateRepublish)try{let E=await Zr.get(Zr.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(E.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await un.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await wA.prepareForPack(a,{report:h},async()=>{let E=await wA.genPackList(a);for(let R of E)h.reportInfo(null,R);let I=await wA.genPackStream(a,E),v=await _e.bufferStream(I),x=await ow.getGitHead(a.cwd),C=await ow.makePublishBody(a,v,{access:this.access,tag:this.tag,registry:A,gitHead:x});await Zr.put(Zr.getIdentUrl(n),C,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,"Package archive published")})).exitCode()}};W0.paths=[["npm","publish"]],W0.usage=nt.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 overridden 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"]]});Ye();qt();var BBe=$e(Jn());Ye();Pt();qt();var K0=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String({required:!1})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n;if(typeof this.package<"u")n=W.parseIdent(this.package);else{if(!a)throw new nr(o.cwd,this.context.cwd);if(!a.manifest.name)throw new it(`Missing 'name' field in ${le.fromPortablePath(z.join(a.cwd,dr.manifest))}`);n=a.manifest.name}let u=await Tv(n,r),p={children:_e.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:de.tuple(de.Type.RESOLUTION,{descriptor:W.makeDescriptor(n,h),locator:W.makeLocator(n,E)})}))};return $s.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};K0.paths=[["npm","tag","list"]],K0.usage=nt.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});async function Tv(t,e){let r=`/-/package${Zr.getIdentUrl(t)}/dist-tags`;return Zr.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:Zr.customPackageError})}var z0=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);let n=W.parseDescriptor(this.package,!0),u=n.range;if(!BBe.default.valid(u))throw new it(`The range ${de.pretty(r,n.range,de.Type.RANGE)} must be a valid semver version`);let A=$n.getPublishRegistry(a.manifest,{configuration:r}),p=de.pretty(r,n,de.Type.IDENT),h=de.pretty(r,u,de.Type.RANGE),E=de.pretty(r,this.tag,de.Type.CODE);return(await Lt.start({configuration:r,stdout:this.context.stdout},async v=>{let x=await Tv(n,r);Object.hasOwn(x,this.tag)&&x[this.tag]===u&&v.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${Zr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Zr.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),v.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};z0.paths=[["npm","tag","add"]],z0.usage=nt.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + 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. + `,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"]]});Ye();qt();var V0=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}async execute(){if(this.tag==="latest")throw new it("The 'latest' tag cannot be removed.");let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);let n=W.parseIdent(this.package),u=$n.getPublishRegistry(a.manifest,{configuration:r}),A=de.pretty(r,this.tag,de.Type.CODE),p=de.pretty(r,n,de.Type.IDENT),h=await Tv(n,r);if(!Object.hasOwn(h,this.tag))throw new it(`${A} is not a tag of package ${p}`);return(await Lt.start({configuration:r,stdout:this.context.stdout},async I=>{let v=`/-/package${Zr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Zr.del(v,{configuration:r,registry:u,ident:n,jsonResponse:!0}),I.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};V0.paths=[["npm","tag","remove"]],V0.usage=nt.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});Ye();Ye();qt();var J0=class extends ut{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=$n.getScopeRegistry(this.scope,{configuration:r,type:$n.RegistryType.PUBLISH_REGISTRY}):this.scope?o=$n.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=$n.getPublishRegistry((await fC(r,this.context.cwd)).manifest,{configuration:r}):o=$n.getDefaultRegistry({configuration:r}),(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u;try{u=await Zr.get("/-/whoami",{configuration:r,registry:o,authType:Zr.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?W.makeIdent(this.scope,""):void 0})}catch(A){if(A.response?.statusCode===401||A.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw A}n.reportInfo(0,u.username)})).exitCode()}};J0.paths=[["npm","whoami"]],J0.usage=nt.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"]]});var Gvt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[q0,G0,j0,Y0,W0,z0,K0,V0,J0]},jvt=Gvt;var Fj={};zt(Fj,{PatchCommand:()=>$0,PatchCommitCommand:()=>Z0,PatchFetcher:()=>Uv,PatchResolver:()=>_v,default:()=>lDt,patchUtils:()=>Pm});Ye();Ye();Pt();iA();var Pm={};zt(Pm,{applyPatchFile:()=>tF,diffFolders:()=>kj,ensureUnpatchedDescriptor:()=>Pj,ensureUnpatchedLocator:()=>nF,extractPackageToDisk:()=>xj,extractPatchFlags:()=>kBe,isParentRequired:()=>bj,isPatchDescriptor:()=>rF,isPatchLocator:()=>X0,loadPatchFiles:()=>Mv,makeDescriptor:()=>iF,makeLocator:()=>Sj,makePatchHash:()=>Qj,parseDescriptor:()=>Nv,parseLocator:()=>Ov,parsePatchFile:()=>Lv,unpatchDescriptor:()=>sDt,unpatchLocator:()=>oDt});Ye();Pt();Ye();Pt();var Yvt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function cw(t){return z.relative(Bt.root,z.resolve(Bt.root,le.toPortablePath(t)))}function Wvt(t){let e=t.trim().match(Yvt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var Kvt=420,zvt=493;var vBe=()=>({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}),Vvt=t=>({header:Wvt(t),parts:[]}),Jvt={["@"]:"header",["-"]:"deletion",["+"]:"insertion",[" "]:"context",["\\"]:"pragma",undefined:"context"};function Xvt(t){let e=[],r=vBe(),o="parsing header",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=vBe()}for(let p=0;p0?"patch":"mode change",V=null;switch(U){case"rename":{if(!E||!I)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:o,fromPath:cw(E),toPath:cw(I)}),V=I}break;case"file deletion":{let te=a||C;if(!te)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:o,hunk:N&&N[0]||null,path:cw(te),mode:eF(p),hash:v})}break;case"file creation":{let te=n||R;if(!te)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:o,hunk:N&&N[0]||null,path:cw(te),mode:eF(h),hash:x})}break;case"patch":case"mode change":V=R||n;break;default:_e.assertNever(U);break}V&&u&&A&&u!==A&&e.push({type:"mode change",semverExclusivity:o,path:cw(V),oldMode:eF(u),newMode:eF(A)}),V&&N&&N.length&&e.push({type:"patch",semverExclusivity:o,path:cw(V),hunks:N,beforeHash:v,afterHash:x})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function eF(t){let e=parseInt(t,8)&511;if(e!==Kvt&&e!==zvt)throw new Error(`Unexpected file mode string: ${t}`);return e}function Lv(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),Zvt(Xvt(e))}function $vt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:_e.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ye();Pt();var uw=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function Aw(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function tF(t,{baseFs:e=new Tn,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!kr.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await Aw(e,z.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await Aw(e,z.dirname(a.fromPath),async()=>{await Aw(e,z.dirname(a.toPath),async()=>{await Aw(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` +`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(z.dirname(a.path),{chmod:493,utimes:[vi.SAFE_TIME,vi.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,vi.SAFE_TIME,vi.SAFE_TIME)}break;case"patch":await Aw(e,a.path,async()=>{await rDt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let u=(await e.statPromise(a.path)).mode;if(DBe(a.newMode)!==DBe(u))continue;await Aw(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:_e.assertNever(a);break}}function DBe(t){return(t&64)>0}function PBe(t){return t.replace(/\s+$/,"")}function tDt(t,e){return PBe(t)===PBe(e)}async function rDt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,"utf8")).split(/\n/),A=[],p=0,h=0;for(let I of t){let v=Math.max(h,I.header.patched.start+p),x=Math.max(0,v-h),C=Math.max(0,u.length-v-I.header.original.length),R=Math.max(x,C),N=0,U=0,V=null;for(;N<=R;){if(N<=x&&(U=v-N,V=SBe(I,u,U),V!==null)){N=-N;break}if(N<=C&&(U=v+N,V=SBe(I,u,U),V!==null))break;N+=1}if(V===null)throw new uw(t.indexOf(I),I);A.push(V),p+=N,h=U+I.header.original.length}if(o)return;let E=0;for(let I of A)for(let v of I)switch(v.type){case"splice":{let x=v.index+E;u.splice(x,v.numToDelete,...v.linesToInsert),E+=v.linesToInsert.length-v.numToDelete}break;case"pop":u.pop();break;case"push":u.push(v.line);break;default:_e.assertNever(v);break}await r.writeFilePromise(e,u.join(` +`),{mode:a})}function SBe(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let u=e[r];if(u==null||!tDt(u,n))return null;r+=1}a.type==="deletion"&&(o.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:"push",line:""}))}break;case"insertion":o.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:"pop"});break;default:_e.assertNever(a.type);break}return o}var iDt=/^builtin<([^>]+)>$/;function fw(t,e){let{protocol:r,source:o,selector:a,params:n}=W.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(o===null)throw new Error("Patch locators must explicitly define their source");let u=a?a.split(/&/).map(E=>le.toPortablePath(E)):[],A=n&&typeof n.locator=="string"?W.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function rF(t){return t.range.startsWith("patch:")}function X0(t){return t.reference.startsWith("patch:")}function Nv(t){let{sourceItem:e,...r}=fw(t.range,W.parseDescriptor);return{...r,sourceDescriptor:e}}function Ov(t){let{sourceItem:e,...r}=fw(t.reference,W.parseLocator);return{...r,sourceLocator:e}}function sDt(t){let{sourceItem:e}=fw(t.range,W.parseDescriptor);return e}function oDt(t){let{sourceItem:e}=fw(t.reference,W.parseLocator);return e}function Pj(t){if(!rF(t))return t;let{sourceItem:e}=fw(t.range,W.parseDescriptor);return e}function nF(t){if(!X0(t))return t;let{sourceItem:e}=fw(t.reference,W.parseLocator);return e}function bBe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:W.stringifyLocator(t)}:{},A=typeof o<"u"?{version:o}:{},p=typeof a<"u"?{hash:a}:{};return W.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...A,...p,...u}})}function iF(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return W.makeDescriptor(t,bBe({parentLocator:e,sourceItem:r,patchPaths:o},W.stringifyDescriptor))}function Sj(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return W.makeLocator(t,bBe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},W.stringifyLocator))}function xBe({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let u=a.match(iDt);return u!==null?o(u[1]):a.startsWith("~/")?r(a.slice(2)):z.isAbsolute(a)?t(a):e(a)}function kBe(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function bj(t){return xBe({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function Mv(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new gn(Bt.root),prefixPath:z.relative(Bt.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await _e.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=kBe(u),p=await xBe({onAbsolute:async h=>await oe.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(z.join(a.prefixPath,h),"utf8")},onProject:async h=>await oe.readFilePromise(z.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source=="string"&&(u.source=u.source.replace(/\r\n?/g,` +`));return n}async function xj(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=nF(t),n=r.storedChecksums,u=new Qi,A=await oe.mktempPromise(),p=z.join(A,"source"),h=z.join(A,"user"),E=z.join(A,".yarn-patch.json"),I=r.configuration.makeFetcher(),v=[];try{let x,C;if(t.locatorHash===a.locatorHash){let R=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u});v.push(()=>R.releaseFs?.()),x=R,C=R}else x=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>x.releaseFs?.()),C=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>C.releaseFs?.());await Promise.all([oe.copyPromise(p,x.prefixPath,{baseFs:x.packageFs}),oe.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),oe.writeJsonPromise(E,{locator:W.stringifyLocator(t),version:o.version})])}finally{for(let x of v)x()}return oe.detachTemp(A),h}async function kj(t,e){let r=le.fromPortablePath(t).replace(/\\/g,"/"),o=le.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Ur.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,o],{cwd:le.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${n}`);let u=r.startsWith("/")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${_e.escapeRegExp(`/${u(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${_e.escapeRegExp(`/${u(o)}/`)}`,"g"),"$1/").replace(new RegExp(_e.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(_e.escapeRegExp(`${o}/`),"g"),"")}function Qj(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=Lv(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!kr.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return wn.makeHash(`${3}`,...r).slice(0,6)}Ye();function QBe(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case"context":r.reportInfo(null,` ${de.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${de.pretty(e,a,de.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${de.pretty(e,a,de.Type.ADDED)}`);break;default:_e.assertNever(o.type)}}var Uv=class{supports(e,r){return!!X0(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${W.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:W.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=Ov(e),A=await Mv(o,u,r),p=await oe.mktempPromise(),h=z.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),I=W.getIdentVendorPath(e),v=new Ji(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await _e.releaseAfterUseAsync(async()=>{await v.copyPromise(I,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),v.saveAndClose();for(let{source:x,optional:C}of A){if(x===null)continue;let R=new Ji(h,{level:r.project.configuration.get("compressionLevel")}),N=new gn(z.resolve(Bt.root,I),{baseFs:R});try{await tF(Lv(x),{baseFs:N,version:n})}catch(U){if(!(U instanceof uw))throw U;let V=r.project.configuration.get("enableInlineHunks"),te=!V&&!C?" (set enableInlineHunks for details)":"",ae=`${W.prettyLocator(r.project.configuration,e)}: ${U.message}${te}`,fe=ue=>{!V||QBe(U.hunk,{configuration:r.project.configuration,report:ue})};if(R.discardAndClose(),C){r.report.reportWarningOnce(66,ae,{reportExtra:fe});continue}else throw new Jt(66,ae,fe)}R.saveAndClose()}return new Ji(h,{level:r.project.configuration.get("compressionLevel")})}};Ye();var _v=class{supportsDescriptor(e,r){return!!rF(e)}supportsLocator(e,r){return!!X0(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=Nv(e);return a.every(n=>!bj(n))?e:W.bindDescriptor(e,{locator:W.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=Nv(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=Nv(e),u=await Mv(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=Qj(u,A.version);return[Sj(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=Ov(e);return{...await r.resolver.resolve(o,r),...e}}};Ye();Pt();qt();var Z0=class extends ut{constructor(){super(...arguments);this.save=ge.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=z.resolve(this.context.cwd,le.toPortablePath(this.patchFolder)),u=z.join(n,"../source"),A=z.join(n,"../.yarn-patch.json");if(!oe.existsSync(u))throw new it("The argument folder didn't get created by 'yarn patch'");let p=await kj(u,n),h=await oe.readJsonPromise(A),E=W.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new it("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let I=r.get("patchFolder"),v=z.join(I,`${W.slugifyLocator(E)}.patch`);await oe.mkdirPromise(I,{recursive:!0}),await oe.writeFilePromise(v,p);let x=[],C=new Map;for(let R of o.storedPackages.values()){if(W.isVirtualLocator(R))continue;let N=R.dependencies.get(E.identHash);if(!N)continue;let U=W.ensureDevirtualizedDescriptor(N),V=Pj(U),te=o.storedResolutions.get(V.descriptorHash);if(!te)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!o.storedPackages.get(te))throw new Error("Assertion failed: Expected the package to have been registered");let fe=o.tryWorkspaceByLocator(R);if(fe)x.push(fe);else{let ue=o.originalPackages.get(R.locatorHash);if(!ue)throw new Error("Assertion failed: Expected the original package to have been registered");let me=ue.dependencies.get(N.identHash);if(!me)throw new Error("Assertion failed: Expected the original dependency to have been registered");C.set(me.descriptorHash,me)}}for(let R of x)for(let N of Ot.hardDependencies){let U=R.manifest[N].get(E.identHash);if(!U)continue;let V=iF(U,{parentLocator:null,sourceDescriptor:W.convertLocatorToDescriptor(E),patchPaths:[z.join(dr.home,z.relative(o.cwd,v))]});R.manifest[N].set(U.identHash,V)}for(let R of C.values()){let N=iF(R,{parentLocator:null,sourceDescriptor:W.convertLocatorToDescriptor(E),patchPaths:[z.join(dr.home,z.relative(o.cwd,v))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:W.stringifyIdent(N),description:R.range}},reference:N.range})}await o.persist()}};Z0.paths=[["patch-commit"]],Z0.usage=nt.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});Ye();Pt();qt();var $0=class extends ut{constructor(){super(...arguments);this.update=ge.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=W.parseLocator(this.package);if(u.reference==="unknown"){let A=_e.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?_e.mapAndFilter.skip:W.isVirtualLocator(p)?_e.mapAndFilter.skip:X0(p)!==this.update?_e.mapAndFilter.skip:p);if(A.length===0)throw new it("No package found in the project for the given locator");if(A.length>1)throw new it(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${A.map(p=>` +- ${W.prettyLocator(r,p)}`).join("")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new it("No package found in the project for the given locator");await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=nF(u),h=await xj(u,{cache:n,project:o});A.reportJson({locator:W.stringifyLocator(p),path:le.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";A.reportInfo(0,`Package ${W.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${de.pretty(r,le.fromPortablePath(h),"magenta")}`),A.reportInfo(0,`Once you are done run ${de.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${le.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};$0.paths=[["patch"]],$0.usage=nt.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "});var aDt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[Z0,$0],fetchers:[Uv],resolvers:[_v]},lDt=aDt;var Lj={};zt(Lj,{PnpmLinker:()=>Hv,default:()=>pDt});Ye();Pt();qt();var Hv=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new it(`Couldn't find ${W.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${de.pretty(r.project.configuration,`${r.project.cwd}/package.json`,de.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=z.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new Rj(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},Rj=class{constructor(e){this.opts=e;this.asyncActions=new _e.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=PD(oe,{indexPath:z.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,o);case"HARD":return this.installPackageHard(e,r,o)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,o){let a=z.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?z.join(a,dr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,o){let a=cDt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,W.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await oe.mkdirPromise(n,{recursive:!0}),await oe.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=W.isVirtualLocator(e)?W.devirtualizeLocator(e):e,p={manifest:await Ot.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Ot,misc:{hasBindingGyp:yA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=yA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!FBe(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${W.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;!a||this.asyncActions.reduce(e.locatorHash,async n=>{await oe.mkdirPromise(a,{recursive:!0});let u=await uDt(a),A=new Map(u),p=[n],h=(I,v)=>{let x=v;FBe(v,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),x=W.devirtualizeLocator(v));let C=this.customData.pathsByLocator.get(x.locatorHash);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${W.stringifyLocator(v)})`);let R=W.stringifyIdent(I),N=z.join(a,R),U=z.relative(z.dirname(N),C.packageLocation),V=A.get(R);A.delete(R),p.push(Promise.resolve().then(async()=>{if(V){if(V.isSymbolicLink()&&await oe.readlinkPromise(N)===U)return;await oe.removePromise(N)}await oe.mkdirpPromise(z.dirname(N)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await oe.symlinkPromise(C.packageLocation,N,"junction"):await oe.symlinkPromise(U,N)}))},E=!1;for(let[I,v]of r)I.identHash===e.identHash&&(E=!0),h(I,v);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(W.convertLocatorToDescriptor(e),e),p.push(ADt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=TBe(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await oe.removePromise(e);else{let r;try{r=new Set(await oe.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=z.contains(e,o);if(a===null)continue;let[n]=a.split(z.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await oe.removePromise(z.join(e,o))}))}return await this.asyncActions.wait(),await Tj(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await Tj(RBe(this.opts.project)),{customData:this.customData}}};function RBe(t){return z.join(t.cwd,dr.nodeModules)}function TBe(t){return z.join(RBe(t),".store")}function cDt(t,{project:e}){let r=W.slugifyLocator(t),o=TBe(e),a=z.join(o,r,"package"),n=z.join(o,r,dr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function FBe(t,{project:e}){return!W.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function uDt(t){let e=new Map,r=[];try{r=await oe.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!=="ENOENT")throw o}try{for(let o of r)if(!o.name.startsWith("."))if(o.name.startsWith("@")){let a=await oe.readdirPromise(z.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!=="ENOENT")throw o}return e}async function ADt(t,e){let r=[],o=new Set;for(let a of e.keys()){r.push(oe.removePromise(z.join(t,a)));let n=W.tryParseIdent(a)?.scope;n&&o.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...o].map(a=>Tj(z.join(t,a)))))}async function Tj(t){try{await oe.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var fDt={linkers:[Hv]},pDt=fDt;var qj={};zt(qj,{StageCommand:()=>eg,default:()=>vDt,stageUtils:()=>oF});Ye();Pt();qt();Ye();Pt();var oF={};zt(oF,{ActionType:()=>Nj,checkConsensus:()=>sF,expandDirectory:()=>Uj,findConsensus:()=>_j,findVcsRoot:()=>Oj,genCommitMessage:()=>Hj,getCommitPrefix:()=>LBe,isYarnFile:()=>Mj});Pt();var Nj=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(Nj||{});async function Oj(t,{marker:e}){do if(!oe.existsSync(z.join(t,e)))t=z.dirname(t);else return t;while(t!=="/");return null}function Mj(t,{roots:e,names:r}){if(r.has(z.basename(t)))return!0;do if(!e.has(t))t=z.dirname(t);else return!0;while(t!=="/");return!1}function Uj(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=oe.readdirSync(o);for(let n of a){let u=z.resolve(o,n);oe.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function sF(t,e){let r=0,o=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:o+=1);return r>=o}function _j(t){let e=sF(t,/^(\w\(\w+\):\s*)?\w+s/),r=sF(t,/^(\w\(\w+\):\s*)?[A-Z]/),o=sF(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function LBe(t){return t.useComponent?"chore(yarn): ":""}var hDt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function Hj(t,e){let r=LBe(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=hDt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+="s");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(", ")}`}var gDt="Commit generated via `yarn stage`",dDt=11;async function NBe(t){let{code:e,stdout:r}=await Ur.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function mDt(t,e){let r=[],o=e.filter(h=>z.basename(h.path)==="package.json");for(let{action:h,path:E}of o){let I=z.relative(t,E);if(h===4){let v=await NBe(t),{stdout:x}=await Ur.execvp("git",["show",`${v}:${I}`],{cwd:t,strict:!0}),C=await Ot.fromText(x),R=await Ot.fromFile(E),N=new Map([...R.dependencies,...R.devDependencies]),U=new Map([...C.dependencies,...C.devDependencies]);for(let[V,te]of U){let ae=W.stringifyIdent(te),fe=N.get(V);fe?fe.range!==te.range&&r.push([4,`${ae} to ${fe.range}`]):r.push([3,ae])}for(let[V,te]of N)U.has(V)||r.push([2,W.stringifyIdent(te)])}else if(h===0){let v=await Ot.fromFile(E);v.name?r.push([0,W.stringifyIdent(v.name)]):r.push([0,"a package"])}else if(h===1){let v=await NBe(t),{stdout:x}=await Ur.execvp("git",["show",`${v}:${I}`],{cwd:t,strict:!0}),C=await Ot.fromText(x);C.name?r.push([1,W.stringifyIdent(C.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Ur.execvp("git",["log",`-${dDt}`,"--pretty=format:%s"],{cwd:t}),u=a===0?n.split(/\n/g).filter(h=>h!==""):[],A=_j(u);return Hj(A,r)}var yDt={[0]:[" A ","?? "],[4]:[" M "],[1]:[" D "]},EDt={[0]:["A "],[4]:["M "],[1]:["D "]},OBe={async findRoot(t){return await Oj(t,{marker:".git"})},async filterChanges(t,e,r,o){let{stdout:a}=await Ur.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),u=o?.staged?EDt:yDt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=z.resolve(t,p.slice(3));if(!o?.staged&&h==="?? "&&p.endsWith("/"))return Uj(E).map(I=>({action:0,path:I}));{let v=[0,4,1].find(x=>u[x].includes(h));return v!==void 0?[{action:v,path:E}]:[]}})).filter(p=>Mj(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await mDt(t,e)},async makeStage(t,e){let r=e.map(o=>le.fromPortablePath(o.path));await Ur.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>le.fromPortablePath(a.path));await Ur.execvp("git",["add","-N","--",...o],{cwd:t,strict:!0}),await Ur.execvp("git",["commit","-m",`${r} + +${gDt} +`,"--",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>le.fromPortablePath(o.path));await Ur.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var CDt=[OBe],eg=class extends ut{constructor(){super(...arguments);this.commit=ge.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=ge.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=ge.Boolean("-u,--update",!1,{hidden:!0})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await St.find(r,this.context.cwd),{driver:a,root:n}=await wDt(o.cwd),u=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(I=>I.populateYarnPaths,o,I=>{u.push(I)});let A=new Set;for(let I of u)for(let v of IDt(n,I))A.add(v);let p=new Set([r.get("rcFilename"),dr.lockfile,dr.manifest]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} +`);else for(let I of h)this.context.stdout.write(`${le.fromPortablePath(I.path)} +`);else if(this.reset){let I=await a.filterChanges(n,A,p,{staged:!0});I.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,I)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};eg.paths=[["stage"]],eg.usage=nt.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]});async function wDt(t){let e=null,r=null;for(let o of CDt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new it("No stage driver has been found for your current project");return{driver:e,root:r}}function IDt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=oe.statSync(e)}catch{break}if(o.isSymbolicLink())e=z.resolve(z.dirname(e),oe.readlinkSync(e));else break}return r}var BDt={commands:[eg]},vDt=BDt;var Gj={};zt(Gj,{default:()=>FDt});Ye();Ye();Pt();var _Be=$e(Jn());Ye();var MBe=$e(JH()),DDt="e8e1bd300d860104bb8c58453ffa1eb4",PDt="OFCNCOG2CU",UBe=async(t,e)=>{let r=W.stringifyIdent(t),a=SDt(e).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},SDt=t=>(0,MBe.default)(PDt,DDt,{requester:{async send(r){try{let o=await nn.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var HBe=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,bDt=async(t,e,r,o)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??(oe.existsSync(z.join(t.cwd,"tsconfig.json"))||oe.existsSync(z.join(a.cwd,"tsconfig.json")))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new Qi};if(!await UBe(r,n))return;let E=HBe(r),I=W.parseRange(r.range).selector;if(!kr.validRange(I)){let N=n.normalizeDependency(r),U=await A.getCandidates(N,{},p);I=W.parseRange(U[0].reference).selector}let v=_Be.default.coerce(I);if(v===null)return;let x=`${Xc.Modifier.CARET}${v.major}`,C=W.makeDescriptor(W.makeIdent("types",E),x),R=_e.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,V=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&V!==r.descriptorHash)return _e.mapAndFind.skip;let te=[];for(let ae of Ot.allDependencies){let fe=N.manifest[ae].get(C.identHash);typeof fe>"u"||te.push([ae,fe])}return te.length===0?_e.mapAndFind.skip:te});if(typeof R<"u")for(let[N,U]of R)t.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(C);if((await A.getCandidates(N,{},p)).length===0)return}catch{return}t.manifest[Xc.Target.DEVELOPMENT].set(C.identHash,C)}},xDt=async(t,e,r)=>{if(r.scope==="types")return;let{project:o}=t,{configuration:a}=o;if(!(a.get("tsEnableAutoTypes")??(oe.existsSync(z.join(t.cwd,"tsconfig.json"))||oe.existsSync(z.join(o.cwd,"tsconfig.json")))))return;let u=HBe(r),A=W.makeIdent("types",u);for(let p of Ot.allDependencies)typeof t.manifest[p].get(A.identHash)>"u"||t.manifest[p].delete(A.identHash)},kDt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},QDt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:bDt,afterWorkspaceDependencyRemoval:xDt,beforeWorkspacePacking:kDt}},FDt=QDt;var zj={};zt(zj,{VersionApplyCommand:()=>tg,VersionCheckCommand:()=>rg,VersionCommand:()=>ng,default:()=>XDt,versionUtils:()=>dw});Ye();Ye();qt();var dw={};zt(dw,{Decision:()=>hw,applyPrerelease:()=>KBe,applyReleases:()=>Kj,applyStrategy:()=>lF,clearVersionFiles:()=>jj,getUndecidedDependentWorkspaces:()=>Gv,getUndecidedWorkspaces:()=>aF,openVersionFile:()=>gw,requireMoreDecisions:()=>zDt,resolveVersionFiles:()=>qv,suggestStrategy:()=>Wj,updateVersionFiles:()=>Yj,validateReleaseDecision:()=>pw});Ye();Pt();Nl();qt();var WBe=$e(YBe()),vA=$e(Jn()),KDt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,hw=(u=>(u.UNDECIDED="undecided",u.DECLINE="decline",u.MAJOR="major",u.MINOR="minor",u.PATCH="patch",u.PRERELEASE="prerelease",u))(hw||{});function pw(t){let e=vA.default.valid(t);return e||_e.validateEnum((0,WBe.default)(hw,"UNDECIDED"),t)}async function qv(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get("deferredVersionFolder");if(!oe.existsSync(o))return r;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=z.join(o,n),A=await oe.readFilePromise(u,"utf8"),p=Ki(A);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let I=W.parseIdent(h),v=t.tryWorkspaceByIdent(I);if(v===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${z.basename(u)} references ${h})`);if(v.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${W.prettyLocator(t.configuration,v.anchoredLocator)})`);let x=v.manifest.raw.stableVersion??v.manifest.version,C=r.get(v),R=lF(x,pw(E));if(R===null)throw new Error(`Assertion failed: Expected ${x} to support being bumped via strategy ${E}`);let N=typeof C<"u"?vA.default.gt(R,C)?R:C:R;r.set(v,N)}}return e&&(r=new Map([...r].map(([n,u])=>[n,KBe(u,{current:n.manifest.version,prerelease:e})]))),r}async function jj(t){let e=t.configuration.get("deferredVersionFolder");!oe.existsSync(e)||await oe.removePromise(e)}async function Yj(t,e){let r=new Set(e),o=t.configuration.get("deferredVersionFolder");if(!oe.existsSync(o))return;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=z.join(o,n),A=await oe.readFilePromise(u,"utf8"),p=Ki(A),h=p?.releases;if(!!h){for(let E of Object.keys(h)){let I=W.parseIdent(E),v=t.tryWorkspaceByIdent(I);(v===null||r.has(v))&&delete p.releases[E]}Object.keys(p.releases).length>0?await oe.changeFilePromise(u,Ba(new Ba.PreserveOrdering(p))):await oe.unlinkPromise(u)}}}async function gw(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let o=await ra.fetchRoot(r.projectCwd),a=o!==null?await ra.fetchBase(o,{baseRefs:r.get("changesetBaseRefs")}):null,n=o!==null?await ra.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get("deferredVersionFolder"),A=n.filter(x=>z.contains(u,x)!==null);if(A.length>1)throw new it(`Your current branch contains multiple versioning files; this isn't supported: +- ${A.map(x=>le.fromPortablePath(x)).join(` +- `)}`);let p=new Set(_e.mapAndFilter(n,x=>{let C=t.tryWorkspaceByFilePath(x);return C===null?_e.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:z.join(u,`${wn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=oe.existsSync(h)?await oe.readFilePromise(h,"utf8"):"{}",I=Ki(E),v=new Map;for(let x of I.declined||[]){let C=W.parseIdent(x),R=t.getWorkspaceByIdent(C);v.set(R,"decline")}for(let[x,C]of Object.entries(I.releases||{})){let R=W.parseIdent(x),N=t.getWorkspaceByIdent(R);v.set(N,pw(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(x=>x.manifest.version!==null)),releases:v,async saveAll(){let x={},C=[],R=[];for(let N of t.workspaces){if(N.manifest.version===null)continue;let U=W.stringifyIdent(N.anchoredLocator),V=v.get(N);V==="decline"?C.push(U):typeof V<"u"?x[U]=pw(V):p.has(N)&&R.push(U)}await oe.mkdirPromise(z.dirname(h),{recursive:!0}),await oe.changeFilePromise(h,Ba(new Ba.PreserveOrdering({releases:Object.keys(x).length>0?x:void 0,declined:C.length>0?C:void 0,undecided:R.length>0?R:void 0})))}}}function zDt(t){return aF(t).size>0||Gv(t).length>0}function aF(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function Gv(t,{include:e=new Set}={}){let r=[],o=new Map(_e.mapAndFilter([...t.releases],([n,u])=>u==="decline"?_e.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(_e.mapAndFilter([...t.releases],([n,u])=>u!=="decline"?_e.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of Ot.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function Wj(t,e){let r=vA.default.clean(e);for(let o of Object.values(hw))if(o!=="undecided"&&o!=="decline"&&vA.default.inc(t,o)===r)return o;return null}function lF(t,e){if(vA.default.valid(e))return e;if(t===null)throw new it(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!vA.default.valid(t))throw new it(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=vA.default.inc(t,e);if(r===null)throw new it(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function Kj(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of Ot.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;_e.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,vA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?W.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${W.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:le.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>"u"))for(let[h,E,I]of p){let v=h.manifest[E].get(I);if(typeof v>"u")throw new Error("Assertion failed: The dependency should have existed");let x=v.range,C=!1;if(x.startsWith(Xn.protocol)&&(x=x.slice(Xn.protocol.length),C=!0,x===a.relativeCwd))continue;let R=x.match(KDt);if(!R){r.reportWarning(0,`Couldn't auto-upgrade range ${x} (in ${W.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let N=`${R[1]}${n}`;C&&(N=`${Xn.protocol}${N}`);let U=W.makeDescriptor(v,N);h.manifest[E].set(I,U)}}}var VDt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function KBe(t,{current:e,prerelease:r}){let o=new vA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\./g);for(let p of A){let h=VDt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(".")}`}var tg=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=ge.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=ge.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=ge.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);if(!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await qv(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let I=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let v of I){let x=h.get(v);typeof x<"u"&&E.set(v,x)}}if(E.size===0){let I=h.size>0?" Did you want to add --all?":"";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${I}`);return}Kj(o,E,{report:A}),this.dryRun||(p||(this.all?await jj(o):await Yj(o,[...E.keys()])),A.reportSeparator())});return this.dryRun||u.hasErrors()?u.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};tg.paths=[["version","apply"]],tg.usage=nt.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` + This command will apply the deferred version changes and remove their definitions from the repository. + + Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%n\`) will be used on all new versions and the version definitions will be kept as-is. + + By default only the current workspace will be bumped, but you can configure this behavior by using one of: + + - \`--recursive\` to also apply the version bump on its dependencies + - \`--all\` to apply the version bump on all packages in the repository + + Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. + `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]});Ye();Pt();qt();var cF=$e(Jn());var rg=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){bC(this.context);let{Gem:r}=await Promise.resolve().then(()=>(cQ(),Bq)),{ScrollableItems:o}=await Promise.resolve().then(()=>(pQ(),fQ)),{FocusRequest:a}=await Promise.resolve().then(()=>(Dq(),Vwe)),{useListInput:n}=await Promise.resolve().then(()=>(AQ(),Jwe)),{renderForm:u}=await Promise.resolve().then(()=>(mQ(),dQ)),{Box:A,Text:p}=await Promise.resolve().then(()=>$e(sc())),{default:h,useCallback:E,useState:I}=await Promise.resolve().then(()=>$e(on())),v=await Ke.find(this.context.cwd,this.context.plugins),{project:x,workspace:C}=await St.find(v,this.context.cwd);if(!C)throw new nr(x.cwd,this.context.cwd);await x.restoreInstallState();let R=await gw(x);if(R===null||R.releaseRoots.size===0)return 0;if(R.root===null)throw new it("This command can only be run on Git repositories");let N=()=>h.createElement(A,{flexDirection:"row",paddingBottom:1},h.createElement(A,{flexDirection:"column",width:60},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:me,active:he,decision:Be,setDecision:we})=>{let g=me.manifest.raw.stableVersion??me.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${W.prettyLocator(v,me.anchoredLocator)})`);if(cF.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let Ee=["undecided","decline","patch","minor","major"];n(Be,Ee,{active:he,minus:"left",plus:"right",set:we});let Pe=Be==="undecided"?h.createElement(p,{color:"yellow"},g):Be==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},cF.default.valid(Be)?Be:cF.default.inc(g,Be)));return h.createElement(A,{flexDirection:"column"},h.createElement(A,null,h.createElement(p,null,W.prettyLocator(v,me.anchoredLocator)," - ",Pe)),h.createElement(A,null,Ee.map(ce=>h.createElement(A,{key:ce,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:ce===Be})," ",ce)))))},V=me=>{let he=new Set(R.releaseRoots),Be=new Map([...me].filter(([we])=>he.has(we)));for(;;){let we=Gv({project:R.project,releases:Be}),g=!1;if(we.length>0){for(let[Ee]of we)if(!he.has(Ee)){he.add(Ee),g=!0;let Pe=me.get(Ee);typeof Pe<"u"&&Be.set(Ee,Pe)}}if(!g)break}return{relevantWorkspaces:he,relevantReleases:Be}},te=()=>{let[me,he]=I(()=>new Map(R.releases)),Be=E((we,g)=>{let Ee=new Map(me);g!=="undecided"?Ee.set(we,g):Ee.delete(we);let{relevantReleases:Pe}=V(Ee);he(Pe)},[me,he]);return[me,Be]},ae=({workspaces:me,releases:he})=>{let Be=[];Be.push(`${me.size} total`);let we=0,g=0;for(let Ee of me){let Pe=he.get(Ee);typeof Pe>"u"?g+=1:Pe!=="decline"&&(we+=1)}return Be.push(`${we} release${we===1?"":"s"}`),Be.push(`${g} remaining`),h.createElement(p,{color:"yellow"},Be.join(", "))},ue=await u(({useSubmit:me})=>{let[he,Be]=te();me(he);let{relevantWorkspaces:we}=V(he),g=new Set([...we].filter(ne=>!R.releaseRoots.has(ne))),[Ee,Pe]=I(0),ce=E(ne=>{switch(ne){case a.BEFORE:Pe(Ee-1);break;case a.AFTER:Pe(Ee+1);break}},[Ee,Pe]);return h.createElement(A,{flexDirection:"column"},h.createElement(N,null),h.createElement(A,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(A,{flexDirection:"column",marginTop:1,paddingLeft:2},[...R.changedFiles].map(ne=>h.createElement(A,{key:ne},h.createElement(p,null,h.createElement(p,{color:"grey"},le.fromPortablePath(R.root)),le.sep,le.relative(le.fromPortablePath(R.root),le.fromPortablePath(ne)))))),R.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(ae,{workspaces:R.releaseRoots,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:Ee%2===0,radius:1,size:2,onFocusRequest:ce},[...R.releaseRoots].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:he.get(ne)||"undecided",setDecision:ee=>Be(ne,ee)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(A,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(ae,{workspaces:g,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:Ee%2===1,radius:2,size:2,onFocusRequest:ce},[...g].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:he.get(ne)||"undecided",setDecision:ee=>Be(ne,ee)}))))):null)},{versionFile:R},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ue>"u")return 1;R.releases.clear();for(let[me,he]of ue)R.releases.set(me,he);await R.saveAll()}async executeStandard(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await gw(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new it("This command can only be run on Git repositories");if(u.reportInfo(0,`Your PR was started right after ${de.pretty(r,A.baseHash.slice(0,7),"yellow")} ${de.pretty(r,A.baseTitle,"magenta")}`),A.changedFiles.size>0){u.reportInfo(0,"You have changed the following files since then:"),u.reportSeparator();for(let v of A.changedFiles)u.reportInfo(null,`${de.pretty(r,le.fromPortablePath(A.root),"gray")}${le.sep}${le.relative(le.fromPortablePath(A.root),le.fromPortablePath(v))}`)}let p=!1,h=!1,E=aF(A);if(E.size>0){p||u.reportSeparator();for(let v of E)u.reportError(0,`${W.prettyLocator(r,v.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let I=Gv(A);for(let[v,x]of I)h||u.reportSeparator(),u.reportError(0,`${W.prettyLocator(r,v.anchoredLocator)} doesn't have a release strategy attached, but depends on ${W.prettyWorkspace(r,x)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),u.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};rg.paths=[["version","check"]],rg.usage=nt.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]});Ye();qt();var uF=$e(Jn());var ng=class extends ut{constructor(){super(...arguments);this.deferred=ge.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=ge.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=ge.String()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!a)throw new nr(o.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=uF.default.valid(this.strategy),A=this.strategy==="decline",p;if(u)if(a.manifest.version!==null){let E=Wj(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new it("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!uF.default.valid(E))throw new it(`Can't bump the version (${E}) if it's not valid semver`)}p=pw(this.strategy)}if(!n){let I=(await qv(o)).get(a);if(typeof I<"u"&&p!=="decline"){let v=lF(a.manifest.version,p);if(uF.default.lt(v,I))throw new it(`Can't bump the version to one that would be lower than the current deferred one (${I})`)}}let h=await gw(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};ng.paths=[["version"]],ng.usage=nt.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]});var JDt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[tg,rg,ng]},XDt=JDt;var Vj={};zt(Vj,{WorkspacesFocusCommand:()=>ig,WorkspacesForeachCommand:()=>lp,default:()=>ePt});Ye();Ye();qt();var ig=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=ge.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=ge.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=ge.Rest()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd),n=await Nr.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new nr(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(A=>o.getWorkspaceByIdent(W.parseIdent(A))));for(let A of u)for(let p of this.production?["dependencies"]:Ot.hardDependencies)for(let h of A.manifest.getForScope(p).values()){let E=o.tryWorkspaceByDescriptor(h);E!==null&&u.add(E)}for(let A of o.workspaces)u.has(A)?this.production&&A.manifest.devDependencies.clear():(A.manifest.installConfig=A.manifest.installConfig||{},A.manifest.installConfig.selfReferences=!1,A.manifest.dependencies.clear(),A.manifest.devDependencies.clear(),A.manifest.peerDependencies.clear(),A.manifest.scripts.clear());return await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};ig.paths=[["workspaces","focus"]],ig.usage=nt.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "});Ye();Ye();Ye();qt();var mw=$e(Zo()),VBe=$e(sd());$a();var lp=class extends ut{constructor(){super(...arguments);this.from=ge.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=ge.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=ge.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=ge.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=ge.Counter("-v,--verbose",{description:"Increase level of logging verbosity up to 2 times"});this.parallel=ge.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=ge.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=ge.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:TT([Ks(["unlimited"]),aI(RT(),[NT(),LT(1)])])});this.topological=ge.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=ge.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=ge.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=ge.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=ge.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=ge.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=ge.String();this.args=ge.Proxy()}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await St.find(r,this.context.cwd);if(!this.all&&!a)throw new nr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new it("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let A=we=>{!this.dryRun||this.context.stdout.write(`${we} +`)},p=()=>{let we=this.from.map(g=>mw.default.matcher(g));return o.workspaces.filter(g=>{let Ee=W.stringifyIdent(g.anchoredLocator),Pe=g.relativeCwd;return we.some(ce=>ce(Ee)||ce(Pe))})},h=[];if(this.since?(A("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await ra.fetchChangedWorkspaces({ref:this.since,project:o}))):this.from?(A("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(A("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(A("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(A("Option --all is set; selecting all workspaces"),h=[...o.workspaces]),this.dryRun&&!this.all){for(let we of h)A(` +- ${we.relativeCwd} + ${W.prettyLocator(r,we.anchoredLocator)}`);h.length>0&&A("")}let E;if(this.recursive?this.since?(A("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(we=>[...we.getRecursiveWorkspaceDependents()]).flat())):(A("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(we=>[...we.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(A("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(we=>[...we.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let we of E)A(` +- ${we.relativeCwd} + ${W.prettyLocator(r,we.anchoredLocator)}`);let I=[],v=!1;if(u?.includes(":")){for(let we of o.workspaces)if(we.manifest.scripts.has(u)&&(v=!v,v===!1))break}for(let we of h){if(u&&!we.manifest.scripts.has(u)&&!v&&!(await un.getWorkspaceAccessibleBinaries(we)).has(u)){A(`Excluding ${we.relativeCwd} because it doesn't have a "${u}" script`);continue}if(!(u===r.env.npm_lifecycle_event&&we.cwd===a.cwd)){if(this.include.length>0&&!mw.default.isMatch(W.stringifyIdent(we.anchoredLocator),this.include)&&!mw.default.isMatch(we.relativeCwd,this.include)){A(`Excluding ${we.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(mw.default.isMatch(W.stringifyIdent(we.anchoredLocator),this.exclude)||mw.default.isMatch(we.relativeCwd,this.exclude))){A(`Excluding ${we.relativeCwd} because it matches the --include filter`);continue}if(this.publicOnly&&we.manifest.private===!0){A(`Excluding ${we.relativeCwd} because it's a private workspace and --no-private was set`);continue}I.push(we)}}if(this.dryRun)return 0;let x=this.verbose??(this.context.stdout.isTTY?1/0:0),C=x>0,R=x>1,N=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(Vi.availableParallelism()/2):1,U=N===1?!1:this.parallel,V=U?this.interlaced:!0,te=(0,VBe.default)(N),ae=new Map,fe=new Set,ue=0,me=null,he=!1,Be=await Lt.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async we=>{let g=async(Ee,{commandIndex:Pe})=>{if(he)return-1;!U&&R&&Pe>1&&we.reportSeparator();let ce=ZDt(Ee,{configuration:r,label:C,commandIndex:Pe}),[ne,ee]=zBe(we,{prefix:ce,interlaced:V}),[Ie,Fe]=zBe(we,{prefix:ce,interlaced:V});try{R&&we.reportInfo(null,`${ce?`${ce} `:""}Process started`);let At=Date.now(),H=await this.cli.run([this.commandName,...this.args],{cwd:Ee.cwd,stdout:ne,stderr:Ie})||0;ne.end(),Ie.end(),await ee,await Fe;let at=Date.now();if(R){let Re=r.get("enableTimers")?`, completed in ${de.pretty(r,at-At,de.Type.DURATION)}`:"";we.reportInfo(null,`${ce?`${ce} `:""}Process exited (exit code ${H})${Re}`)}return H===130&&(he=!0,me=H),H}catch(At){throw ne.end(),Ie.end(),await ee,await Fe,At}};for(let Ee of I)ae.set(Ee.anchoredLocator.locatorHash,Ee);for(;ae.size>0&&!we.hasErrors();){let Ee=[];for(let[ne,ee]of ae){if(fe.has(ee.anchoredDescriptor.descriptorHash))continue;let Ie=!0;if(this.topological||this.topologicalDev){let Fe=this.topologicalDev?new Map([...ee.manifest.dependencies,...ee.manifest.devDependencies]):ee.manifest.dependencies;for(let At of Fe.values()){let H=o.tryWorkspaceByDescriptor(At);if(Ie=H===null||!ae.has(H.anchoredLocator.locatorHash),!Ie)break}}if(!!Ie&&(fe.add(ee.anchoredDescriptor.descriptorHash),Ee.push(te(async()=>{let Fe=await g(ee,{commandIndex:++ue});return ae.delete(ne),fe.delete(ee.anchoredDescriptor.descriptorHash),Fe})),!U))break}if(Ee.length===0){let ne=Array.from(ae.values()).map(ee=>W.prettyLocator(r,ee.anchoredLocator)).join(", ");we.reportError(3,`Dependency cycle detected (${ne})`);return}let ce=(await Promise.all(Ee)).find(ne=>ne!==0);me===null&&(me=typeof ce<"u"?1:me),(this.topological||this.topologicalDev)&&typeof ce<"u"&&we.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return me!==null?me:Be.exitCode()}};lp.paths=[["workspaces","foreach"]],lp.usage=nt.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (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 The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]}),lp.schema=[cI("all",Yu.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),OT(["all","recursive","since","worktree"],{missingIf:"undefined"})];function zBe(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new _e.DefaultStream;a.pipe(o,{end:!1}),a.on("finish",()=>{o.end()});let n=new Promise(A=>{o.on("finish",()=>{A(a.active)})});if(r)return[a,n];let u=new _e.BufferStream;return u.pipe(a,{end:!1}),u.on("finish",()=>{a.end()}),[u,n]}function ZDt(t,{configuration:e,commandIndex:r,label:o}){if(!o)return null;let n=`[${W.stringifyIdent(t.anchoredLocator)}]:`,u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[r%u.length];return de.pretty(e,n,A)}var $Dt={commands:[ig,lp]},ePt=$Dt;var pC=()=>({modules:new Map([["@yarnpkg/cli",a2],["@yarnpkg/core",o2],["@yarnpkg/fslib",zw],["@yarnpkg/libzip",x1],["@yarnpkg/parsers",rI],["@yarnpkg/shell",T1],["clipanion",hI],["semver",tPt],["typanion",zo],["@yarnpkg/plugin-essentials",$8],["@yarnpkg/plugin-compat",iH],["@yarnpkg/plugin-constraints",wH],["@yarnpkg/plugin-dlx",IH],["@yarnpkg/plugin-exec",DH],["@yarnpkg/plugin-file",SH],["@yarnpkg/plugin-git",Z8],["@yarnpkg/plugin-github",kH],["@yarnpkg/plugin-http",QH],["@yarnpkg/plugin-init",FH],["@yarnpkg/plugin-interactive-tools",Tq],["@yarnpkg/plugin-link",Lq],["@yarnpkg/plugin-nm",yG],["@yarnpkg/plugin-npm",dj],["@yarnpkg/plugin-npm-cli",Dj],["@yarnpkg/plugin-pack",Aj],["@yarnpkg/plugin-patch",Fj],["@yarnpkg/plugin-pnp",oG],["@yarnpkg/plugin-pnpm",Lj],["@yarnpkg/plugin-stage",qj],["@yarnpkg/plugin-typescript",Gj],["@yarnpkg/plugin-version",zj],["@yarnpkg/plugin-workspace-tools",Vj]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});function ZBe({cwd:t,pluginConfiguration:e}){let r=new as({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:rn??""});return Object.assign(r,{defaultContext:{...as.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function rPt(t){if(_e.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,o=">=18.12.0";if(kr.satisfiesWithPrereleases(r,o))return!0;let a=new it(`This tool requires a Node version compatible with ${o} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return as.defaultContext.stdout.write(t.error(a)),!1}async function $Be({selfPath:t,pluginConfiguration:e}){return await Ke.find(le.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function nPt(t,e,{yarnPath:r}){if(!oe.existsSync(r))return t.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let o={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,JBe.execFileSync)(process.execPath,[le.fromPortablePath(r),...e],o)}catch(a){return a.status??1}return 0}function iPt(t,e){let r=null,o=e;return e.length>=2&&e[0]==="--cwd"?(r=le.toPortablePath(e[1]),o=e.slice(2)):e.length>=1&&e[0].startsWith("--cwd=")?(r=le.toPortablePath(e[0].slice(6)),o=e.slice(1)):e[0]==="add"&&e[e.length-2]==="--cwd"&&(r=le.toPortablePath(e[e.length-1]),o=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?z.resolve(r):z.cwd(),o}function sPt(t,{configuration:e}){if(!e.get("enableTelemetry")||XBe.isCI||!process.stdout.isTTY)return;Ke.telemetry=new uC(e,"puba9cdc10ec5790a2cf4969dd413a47270");let o=/^@yarnpkg\/plugin-(.*)$/;for(let a of e.plugins.keys())AC.has(a.match(o)?.[1]??"")&&Ke.telemetry?.reportPluginName(a);t.binaryVersion&&Ke.telemetry.reportVersion(t.binaryVersion)}function eve(t,{configuration:e}){for(let r of e.plugins.values())for(let o of r.commands||[])t.register(o)}async function oPt(t,e,{selfPath:r,pluginConfiguration:o}){if(!rPt(t))return 1;let a=await $Be({selfPath:r,pluginConfiguration:o}),n=a.get("yarnPath"),u=a.get("ignorePath");if(n&&!u)return nPt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let A=iPt(t,e);sPt(t,{configuration:a}),eve(t,{configuration:a});let p=t.process(A,t.defaultContext);return p.help||Ke.telemetry?.reportCommandName(p.path.join(" ")),await t.run(p,t.defaultContext)}async function ehe({cwd:t=z.cwd(),pluginConfiguration:e=pC()}={}){let r=ZBe({cwd:t,pluginConfiguration:e}),o=await $Be({pluginConfiguration:e,selfPath:null});return eve(r,{configuration:o}),r}async function nk(t,{cwd:e=z.cwd(),selfPath:r,pluginConfiguration:o}){let a=ZBe({cwd:e,pluginConfiguration:o});try{process.exitCode=await oPt(a,t,{selfPath:r,pluginConfiguration:o})}catch(n){as.defaultContext.stdout.write(a.error(n)),process.exitCode=1}finally{await oe.rmtempPromise()}}nk(process.argv.slice(2),{cwd:z.cwd(),selfPath:le.toPortablePath(le.resolve(process.argv[1])),pluginConfiguration:pC()});})(); +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ +/** + @license + Copyright (c) 2015, Rebecca Turner + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + 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. + */ +/** + @license + Copyright Joyent, Inc. and other Node contributors. + + 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. +*/ +/** + @license + Copyright Node.js contributors. All rights reserved. + + 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. +*/ +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + 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. +*/ +/** @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. + */ +/** @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. + */ +/** @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. + */ diff --git a/tgui/.yarn/sdks/eslint/bin/eslint.js b/tgui/.yarn/sdks/eslint/bin/eslint.js index 4d327a49a06d..9ef98e400b47 100644 --- a/tgui/.yarn/sdks/eslint/bin/eslint.js +++ b/tgui/.yarn/sdks/eslint/bin/eslint.js @@ -1,13 +1,13 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { diff --git a/tgui/.yarn/sdks/eslint/lib/api.js b/tgui/.yarn/sdks/eslint/lib/api.js index 97a052442a86..653b22bae06f 100644 --- a/tgui/.yarn/sdks/eslint/lib/api.js +++ b/tgui/.yarn/sdks/eslint/lib/api.js @@ -1,20 +1,20 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { - // Setup the environment to be able to require eslint/lib/api.js + // Setup the environment to be able to require eslint require(absPnpApiPath).setup(); } } -// Defer to the real eslint/lib/api.js your application uses -module.exports = absRequire(`eslint/lib/api.js`); +// Defer to the real eslint your application uses +module.exports = absRequire(`eslint`); diff --git a/tgui/.yarn/sdks/eslint/lib/unsupported-api.js b/tgui/.yarn/sdks/eslint/lib/unsupported-api.js new file mode 100644 index 000000000000..30fdf158b475 --- /dev/null +++ b/tgui/.yarn/sdks/eslint/lib/unsupported-api.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/use-at-your-own-risk + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint/use-at-your-own-risk your application uses +module.exports = absRequire(`eslint/use-at-your-own-risk`); diff --git a/tgui/.yarn/sdks/eslint/package.json b/tgui/.yarn/sdks/eslint/package.json index 744a77321030..263cd3d500b2 100644 --- a/tgui/.yarn/sdks/eslint/package.json +++ b/tgui/.yarn/sdks/eslint/package.json @@ -1,6 +1,14 @@ { "name": "eslint", - "version": "7.32.0-sdk", + "version": "8.57.0-sdk", "main": "./lib/api.js", - "type": "commonjs" + "type": "commonjs", + "bin": { + "eslint": "./bin/eslint.js" + }, + "exports": { + "./package.json": "./package.json", + ".": "./lib/api.js", + "./use-at-your-own-risk": "./lib/unsupported-api.js" + } } diff --git a/tgui/.yarn/sdks/prettier/bin/prettier.cjs b/tgui/.yarn/sdks/prettier/bin/prettier.cjs new file mode 100644 index 000000000000..5efad688e739 --- /dev/null +++ b/tgui/.yarn/sdks/prettier/bin/prettier.cjs @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier/bin/prettier.cjs + require(absPnpApiPath).setup(); + } +} + +// Defer to the real prettier/bin/prettier.cjs your application uses +module.exports = absRequire(`prettier/bin/prettier.cjs`); diff --git a/tgui/.yarn/sdks/prettier/index.cjs b/tgui/.yarn/sdks/prettier/index.cjs new file mode 100644 index 000000000000..8758e367a725 --- /dev/null +++ b/tgui/.yarn/sdks/prettier/index.cjs @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier + require(absPnpApiPath).setup(); + } +} + +// Defer to the real prettier your application uses +module.exports = absRequire(`prettier`); diff --git a/tgui/.yarn/sdks/prettier/package.json b/tgui/.yarn/sdks/prettier/package.json new file mode 100644 index 000000000000..e23d5316d948 --- /dev/null +++ b/tgui/.yarn/sdks/prettier/package.json @@ -0,0 +1,7 @@ +{ + "name": "prettier", + "version": "3.3.0-sdk", + "main": "./index.cjs", + "type": "commonjs", + "bin": "./bin/prettier.cjs" +} diff --git a/tgui/.yarn/sdks/typescript/bin/tsc b/tgui/.yarn/sdks/typescript/bin/tsc index 5608e5743072..454b950b7e8f 100644 --- a/tgui/.yarn/sdks/typescript/bin/tsc +++ b/tgui/.yarn/sdks/typescript/bin/tsc @@ -1,13 +1,13 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { diff --git a/tgui/.yarn/sdks/typescript/bin/tsserver b/tgui/.yarn/sdks/typescript/bin/tsserver index cd7d557d523d..d7a605684df9 100644 --- a/tgui/.yarn/sdks/typescript/bin/tsserver +++ b/tgui/.yarn/sdks/typescript/bin/tsserver @@ -1,13 +1,13 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { diff --git a/tgui/.yarn/sdks/typescript/lib/tsc.js b/tgui/.yarn/sdks/typescript/lib/tsc.js index 16042d01d4fe..2f62fc96c0a0 100644 --- a/tgui/.yarn/sdks/typescript/lib/tsc.js +++ b/tgui/.yarn/sdks/typescript/lib/tsc.js @@ -1,13 +1,13 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { diff --git a/tgui/.yarn/sdks/typescript/lib/tsserver.js b/tgui/.yarn/sdks/typescript/lib/tsserver.js index 4d90f3879d03..ed800750cc18 100644 --- a/tgui/.yarn/sdks/typescript/lib/tsserver.js +++ b/tgui/.yarn/sdks/typescript/lib/tsserver.js @@ -1,13 +1,20 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsserver.js + require(absPnpApiPath).setup(); + } +} const moduleWrapper = tsserver => { if (!process.versions.pnp) { @@ -18,6 +25,7 @@ const moduleWrapper = tsserver => { const pnpApi = require(`pnpapi`); const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const isPortal = str => str.startsWith("portal:/"); const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { @@ -30,7 +38,7 @@ const moduleWrapper = tsserver => { function toEditorPath(str) { // We add the `zip:` prefix to both `.zip/` paths and virtual paths - if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || isVirtual(str))) { + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { // We also take the opportunity to turn virtual paths into physical ones; // this makes it much easier to work with workspaces that list peer // dependencies, since otherwise Ctrl+Click would bring us to the virtual @@ -44,7 +52,7 @@ const moduleWrapper = tsserver => { const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; if (resolved) { const locator = pnpApi.findPackageLocator(resolved); - if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { str = resolved; } } @@ -60,10 +68,34 @@ const moduleWrapper = tsserver => { // // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 // - case `vscode`: { + // 2021-10-08: VSCode changed the format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + // 2022-04-06: VSCode changed the format in 1.66. + // Before | ^/zip//c:/foo/bar.zip/package.json + // After | ^/zip/c:/foo/bar.zip/package.json + // + // 2022-05-06: VSCode changed the format in 1.68 + // Before | ^/zip/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { str = `^zip:${str}`; } break; + case `vscode <1.66`: { + str = `^/zip/${str}`; + } break; + + case `vscode <1.68`: { + str = `^/zip${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + // To make "go to definition" work, // We have to resolve the actual file system path from virtual path // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) @@ -77,13 +109,15 @@ const moduleWrapper = tsserver => { // everything else is up to neovim case `neovim`: { str = normalize(resolved).replace(/\.zip\//, `.zip::`); - str = `zipfile:${str}`; + str = `zipfile://${str}`; } break; default: { str = `zip:${str}`; } break; } + } else { + str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`); } } @@ -91,9 +125,28 @@ const moduleWrapper = tsserver => { } function fromEditorPath(str) { - return process.platform === `win32` - ? str.replace(/^\^?zip:\//, ``) - : str.replace(/^\^?zip:/, ``); + switch (hostInfo) { + case `coc-nvim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for neovim is in format of zipfile:////.yarn/... + return str.replace(/^zipfile:\/\//, ``); + } break; + + case `vscode`: + default: { + return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) + } break; + } } // Force enable 'allowLocalPluginLoads' @@ -119,8 +172,9 @@ const moduleWrapper = tsserver => { let hostInfo = `unknown`; Object.assign(Session.prototype, { - onMessage(/** @type {string} */ message) { - const parsedMessage = JSON.parse(message) + onMessage(/** @type {string | object} */ message) { + const isStringMessage = typeof message === 'string'; + const parsedMessage = isStringMessage ? JSON.parse(message) : message; if ( parsedMessage != null && @@ -129,11 +183,32 @@ const moduleWrapper = tsserver => { typeof parsedMessage.arguments.hostInfo === `string` ) { hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { + const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( + // The RegExp from https://semver.org/ but without the caret at the start + /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ + ) ?? []).map(Number) + + if (major === 1) { + if (minor < 61) { + hostInfo += ` <1.61`; + } else if (minor < 66) { + hostInfo += ` <1.66`; + } else if (minor < 68) { + hostInfo += ` <1.68`; + } + } + } } - return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { - return typeof value === `string` ? fromEditorPath(value) : value; - })); + const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { + return typeof value === 'string' ? fromEditorPath(value) : value; + }); + + return originalOnMessage.call( + this, + isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) + ); }, send(/** @type {any} */ msg) { @@ -146,11 +221,11 @@ const moduleWrapper = tsserver => { return tsserver; }; -if (existsSync(absPnpApiPath)) { - if (!process.versions.pnp) { - // Setup the environment to be able to require typescript/lib/tsserver.js - require(absPnpApiPath).setup(); - } +const [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10)); +// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well. +// Ref https://github.com/microsoft/TypeScript/pull/55326 +if (major > 5 || (major === 5 && minor >= 5)) { + moduleWrapper(absRequire(`typescript`)); } // Defer to the real typescript/lib/tsserver.js your application uses diff --git a/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js b/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js index c3de4ff5d705..4d99766952f5 100644 --- a/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js +++ b/tgui/.yarn/sdks/typescript/lib/tsserverlibrary.js @@ -1,13 +1,20 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsserverlibrary.js + require(absPnpApiPath).setup(); + } +} const moduleWrapper = tsserver => { if (!process.versions.pnp) { @@ -18,6 +25,7 @@ const moduleWrapper = tsserver => { const pnpApi = require(`pnpapi`); const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const isPortal = str => str.startsWith("portal:/"); const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { @@ -30,7 +38,7 @@ const moduleWrapper = tsserver => { function toEditorPath(str) { // We add the `zip:` prefix to both `.zip/` paths and virtual paths - if (isAbsolute(str) && !str.match(/^\^zip:/) && (str.match(/\.zip\//) || isVirtual(str))) { + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { // We also take the opportunity to turn virtual paths into physical ones; // this makes it much easier to work with workspaces that list peer // dependencies, since otherwise Ctrl+Click would bring us to the virtual @@ -44,7 +52,7 @@ const moduleWrapper = tsserver => { const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; if (resolved) { const locator = pnpApi.findPackageLocator(resolved); - if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + if (locator && (dependencyTreeRoots.has(`${locator.name}@${locator.reference}`) || isPortal(locator.reference))) { str = resolved; } } @@ -60,10 +68,34 @@ const moduleWrapper = tsserver => { // // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 // - case `vscode`: { + // 2021-10-08: VSCode changed the format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + // 2022-04-06: VSCode changed the format in 1.66. + // Before | ^/zip//c:/foo/bar.zip/package.json + // After | ^/zip/c:/foo/bar.zip/package.json + // + // 2022-05-06: VSCode changed the format in 1.68 + // Before | ^/zip/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { str = `^zip:${str}`; } break; + case `vscode <1.66`: { + str = `^/zip/${str}`; + } break; + + case `vscode <1.68`: { + str = `^/zip${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + // To make "go to definition" work, // We have to resolve the actual file system path from virtual path // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) @@ -77,13 +109,15 @@ const moduleWrapper = tsserver => { // everything else is up to neovim case `neovim`: { str = normalize(resolved).replace(/\.zip\//, `.zip::`); - str = `zipfile:${str}`; + str = `zipfile://${str}`; } break; default: { str = `zip:${str}`; } break; } + } else { + str = str.replace(/^\/?/, process.platform === `win32` ? `` : `/`); } } @@ -91,9 +125,28 @@ const moduleWrapper = tsserver => { } function fromEditorPath(str) { - return process.platform === `win32` - ? str.replace(/^\^?zip:\//, ``) - : str.replace(/^\^?zip:/, ``); + switch (hostInfo) { + case `coc-nvim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for neovim is in format of zipfile:////.yarn/... + return str.replace(/^zipfile:\/\//, ``); + } break; + + case `vscode`: + default: { + return str.replace(/^\^?(zip:|\/zip(\/ts-nul-authority)?)\/+/, process.platform === `win32` ? `` : `/`) + } break; + } } // Force enable 'allowLocalPluginLoads' @@ -119,8 +172,9 @@ const moduleWrapper = tsserver => { let hostInfo = `unknown`; Object.assign(Session.prototype, { - onMessage(/** @type {string} */ message) { - const parsedMessage = JSON.parse(message) + onMessage(/** @type {string | object} */ message) { + const isStringMessage = typeof message === 'string'; + const parsedMessage = isStringMessage ? JSON.parse(message) : message; if ( parsedMessage != null && @@ -129,11 +183,32 @@ const moduleWrapper = tsserver => { typeof parsedMessage.arguments.hostInfo === `string` ) { hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK) { + const [, major, minor] = (process.env.VSCODE_IPC_HOOK.match( + // The RegExp from https://semver.org/ but without the caret at the start + /(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/ + ) ?? []).map(Number) + + if (major === 1) { + if (minor < 61) { + hostInfo += ` <1.61`; + } else if (minor < 66) { + hostInfo += ` <1.66`; + } else if (minor < 68) { + hostInfo += ` <1.68`; + } + } + } } - return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { - return typeof value === `string` ? fromEditorPath(value) : value; - })); + const processedMessageJSON = JSON.stringify(parsedMessage, (key, value) => { + return typeof value === 'string' ? fromEditorPath(value) : value; + }); + + return originalOnMessage.call( + this, + isStringMessage ? processedMessageJSON : JSON.parse(processedMessageJSON) + ); }, send(/** @type {any} */ msg) { @@ -146,11 +221,11 @@ const moduleWrapper = tsserver => { return tsserver; }; -if (existsSync(absPnpApiPath)) { - if (!process.versions.pnp) { - // Setup the environment to be able to require typescript/lib/tsserverlibrary.js - require(absPnpApiPath).setup(); - } +const [major, minor] = absRequire(`typescript/package.json`).version.split(`.`, 2).map(value => parseInt(value, 10)); +// In TypeScript@>=5.5 the tsserver uses the public TypeScript API so that needs to be patched as well. +// Ref https://github.com/microsoft/TypeScript/pull/55326 +if (major > 5 || (major === 5 && minor >= 5)) { + moduleWrapper(absRequire(`typescript`)); } // Defer to the real typescript/lib/tsserverlibrary.js your application uses diff --git a/tgui/.yarn/sdks/typescript/lib/typescript.js b/tgui/.yarn/sdks/typescript/lib/typescript.js index cbdbf1500fbe..b5f4db25bee6 100644 --- a/tgui/.yarn/sdks/typescript/lib/typescript.js +++ b/tgui/.yarn/sdks/typescript/lib/typescript.js @@ -1,20 +1,20 @@ #!/usr/bin/env node const {existsSync} = require(`fs`); -const {createRequire, createRequireFromPath} = require(`module`); +const {createRequire} = require(`module`); const {resolve} = require(`path`); const relPnpApiPath = "../../../../.pnp.cjs"; const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); +const absRequire = createRequire(absPnpApiPath); if (existsSync(absPnpApiPath)) { if (!process.versions.pnp) { - // Setup the environment to be able to require typescript/lib/typescript.js + // Setup the environment to be able to require typescript require(absPnpApiPath).setup(); } } -// Defer to the real typescript/lib/typescript.js your application uses -module.exports = absRequire(`typescript/lib/typescript.js`); +// Defer to the real typescript your application uses +module.exports = absRequire(`typescript`); diff --git a/tgui/.yarn/sdks/typescript/package.json b/tgui/.yarn/sdks/typescript/package.json index ea85e133e822..bedc36522526 100644 --- a/tgui/.yarn/sdks/typescript/package.json +++ b/tgui/.yarn/sdks/typescript/package.json @@ -1,6 +1,10 @@ { "name": "typescript", - "version": "4.3.5-sdk", + "version": "5.4.3-sdk", "main": "./lib/typescript.js", - "type": "commonjs" + "type": "commonjs", + "bin": { + "tsc": "./bin/tsc", + "tsserver": "./bin/tsserver" + } } diff --git a/tgui/.yarnrc.yml b/tgui/.yarnrc.yml index 53846c71f318..85c70fcacc5f 100644 --- a/tgui/.yarnrc.yml +++ b/tgui/.yarnrc.yml @@ -1,3 +1,5 @@ +compressionLevel: 0 + enableScripts: false logFilters: @@ -6,14 +8,8 @@ logFilters: - code: YN0062 level: discard -plugins: - - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs - spec: "@yarnpkg/plugin-interactive-tools" - pnpEnableEsmLoader: false -preferAggregateCacheInfo: true - preferInteractive: true -yarnPath: .yarn/releases/yarn-3.1.1.cjs +yarnPath: .yarn/releases/yarn-4.2.2.cjs diff --git a/tgui/README.md b/tgui/README.md index e87130243429..1bae91fd1325 100644 --- a/tgui/README.md +++ b/tgui/README.md @@ -16,10 +16,9 @@ If you are completely new to frontend and prefer to **learn by doing**, start wi ### Guides -This project uses **Inferno** - a very fast UI rendering engine with a similar API to React. Take your time to read these guides: +This project uses React. Take your time to read the guide: -- [React guide](https://reactjs.org/docs/hello-world.html) -- [Inferno documentation](https://infernojs.org/docs/guides/components) - highlights differences with React. +- [React guide](https://react.dev/learn) If you were already familiar with an older, Ractive-based tgui, and want to translate concepts between old and new tgui, read this [interface conversion guide](docs/converting-old-tgui-interfaces.md). @@ -71,6 +70,7 @@ However, if you want finer control over the installation or build process, you w - `tools/build/build tgui-clean` - Clean up tgui folder. > With Juke Build, you can run multiple targets together, e.g.: +> > ``` > tools/build/build tgui tgui-lint tgui-tsc tgui-test > ``` @@ -137,7 +137,7 @@ Press `F12` or click the green bug to open the KitchenSink interface. This inter playground to test various tgui components. **Layout Debugger.** -Press `F11` to toggle the *layout debugger*. It will show outlines of +Press `F11` to toggle the _layout debugger_. It will show outlines of all tgui elements, which makes it easy to understand how everything comes together, and can reveal certain layout bugs which are not normally visible. diff --git a/tgui/babel.config.js b/tgui/babel.config.js deleted file mode 100644 index d8ddb75721db..000000000000 --- a/tgui/babel.config.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -const createBabelConfig = options => { - const { presets = [], plugins = [], removeConsole } = options; - return { - presets: [ - [require.resolve('@babel/preset-typescript'), { - allowDeclareFields: true, - }], - [require.resolve('@babel/preset-env'), { - modules: 'commonjs', - useBuiltIns: 'entry', - corejs: '3', - spec: false, - loose: true, - targets: [], - }], - ...presets, - ].filter(Boolean), - plugins: [ - [require.resolve('@babel/plugin-proposal-class-properties'), { - loose: true, - }], - require.resolve('@babel/plugin-transform-jscript'), - require.resolve('babel-plugin-inferno'), - removeConsole && require.resolve('babel-plugin-transform-remove-console'), - require.resolve('common/string.babel-plugin.cjs'), - ...plugins, - ].filter(Boolean), - }; -}; - -module.exports = api => { - api.cache(true); - const mode = process.env.NODE_ENV; - return createBabelConfig({ mode }); -}; - -module.exports.createBabelConfig = createBabelConfig; diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md index bccdc59661d8..5501680e30aa 100644 --- a/tgui/docs/component-reference.md +++ b/tgui/docs/component-reference.md @@ -65,17 +65,13 @@ it is used a lot in this framework. **Event handlers.** Event handlers are callbacks that you can attack to various element to -listen for browser events. Inferno supports camelcase (`onClick`) and -lowercase (`onclick`) event names. - -- Camel case names are what's called *synthetic* events, and are the -**preferred way** of handling events in React, for efficiency and -performance reasons. Please read -[Inferno Event Handling](https://infernojs.org/docs/guides/event-handling) -to understand what this is about. -- Lower case names are native browser events and should be used sparingly, -for example when you need an explicit IE8 support. **DO NOT** use -lowercase event handlers unless you really know what you are doing. +listen for browser events. React supports camelcase (`onClick`) event names. + +- Camel case names are what's called _synthetic_ events, and are the + **preferred way** of handling events in React, for efficiency and + performance reasons. Please read + [React Event Handling](https://react.dev/learn/responding-to-events) + to understand what this is about. ## `tgui/components` @@ -87,13 +83,13 @@ This component provides animations for numeric values. - `value: number` - Value to animate. - `initial: number` - Initial value to use in animation when element -first appears. If you set initial to `0` for example, number will always -animate starting from `0`, and if omitted, it will not play an initial -animation. + first appears. If you set initial to `0` for example, number will always + animate starting from `0`, and if omitted, it will not play an initial + animation. - `format: value => value` - Output formatter. - Example: `value => Math.round(value)`. - `children: (formattedValue, rawValue) => any` - Pull the animated number to -animate more complex things deeper in the DOM tree. + animate more complex things deeper in the DOM tree. - Example: `(_, value) => ` ### `BlockQuote` @@ -129,9 +125,7 @@ To workaround this problem, the Box children accept a render props function. This way, `Button` can pull out the `className` generated by the `Box`. ```jsx - - {props => + ``` @@ -409,17 +399,17 @@ effectively places the last flex item to the very end of the flex container. - See inherited props: [Box](#box) - ~~`spacing: number`~~ - **Removed in tgui 4.3**, -use [Stack](#stack) instead. + use [Stack](#stack) instead. - `inline: boolean` - Makes flexbox container inline, with similar behavior -to an `inline` property on a `Box`. + to an `inline` property on a `Box`. - `direction: string` - This establishes the main-axis, thus defining the -direction flex items are placed in the flex container. + direction flex items are placed in the flex container. - `row` (default) - left to right. - `row-reverse` - right to left. - `column` - top to bottom. - `column-reverse` - bottom to top. - `wrap: string` - By default, flex items will all try to fit onto one line. -You can change that and allow the items to wrap as needed with this property. + You can change that and allow the items to wrap as needed with this property. - `nowrap` (default) - all flex items will be on one line - `wrap` - flex items will wrap onto multiple lines, from top to bottom. - `wrap-reverse` - flex items will wrap onto multiple lines from bottom to top. @@ -430,22 +420,22 @@ You can change that and allow the items to wrap as needed with this property. - `center` - items are centered on the cross axis. - `baseline` - items are aligned such as their baselines align. - `justify: string` - This defines the alignment along the main axis. -It helps distribute extra free space leftover when either all the flex -items on a line are inflexible, or are flexible but have reached their -maximum size. It also exerts some control over the alignment of items -when they overflow the line. + It helps distribute extra free space leftover when either all the flex + items on a line are inflexible, or are flexible but have reached their + maximum size. It also exerts some control over the alignment of items + when they overflow the line. - `flex-start` (default) - items are packed toward the start of the - flex-direction. + flex-direction. - `flex-end` - items are packed toward the end of the flex-direction. - `space-between` - items are evenly distributed in the line; first item is - on the start line, last item on the end line + on the start line, last item on the end line - `space-around` - items are evenly distributed in the line with equal space - around them. Note that visually the spaces aren't equal, since all the items - have equal space on both sides. The first item will have one unit of space - against the container edge, but two units of space between the next item - because that next item has its own spacing that applies. + around them. Note that visually the spaces aren't equal, since all the items + have equal space on both sides. The first item will have one unit of space + against the container edge, but two units of space between the next item + because that next item has its own spacing that applies. - `space-evenly` - items are distributed so that the spacing between any two - items (and the space to the edges) is equal. + items (and the space to the edges) is equal. - TBD (not all properties are supported in IE11). ### `Flex.Item` @@ -454,24 +444,24 @@ when they overflow the line. - See inherited props: [Box](#box) - `order: number` - By default, flex items are laid out in the source order. -However, the order property controls the order in which they appear in the -flex container. + However, the order property controls the order in which they appear in the + flex container. - `grow: number | boolean` - This defines the ability for a flex item to grow -if necessary. It accepts a unitless value that serves as a proportion. It -dictates what amount of the available space inside the flex container the -item should take up. This number is unit-less and is relative to other -siblings. + if necessary. It accepts a unitless value that serves as a proportion. It + dictates what amount of the available space inside the flex container the + item should take up. This number is unit-less and is relative to other + siblings. - `shrink: number | boolean` - This defines the ability for a flex item to -shrink if necessary. Inverse of `grow`. + shrink if necessary. Inverse of `grow`. - `basis: number | string` - This defines the default size of an element -before any flex-related calculations are done. Has to be a length -(e.g. `20%`, `5rem`), an `auto` or `content` keyword. + before any flex-related calculations are done. Has to be a length + (e.g. `20%`, `5rem`), an `auto` or `content` keyword. - **Important:** IE11 flex is buggy, and auto width/height calculations - can sometimes end up in a circular dependency. This usually happens, when - working with tables inside flex (they have wacky internal widths and such). - Setting basis to `0` breaks the loop and fixes all of the problems. + can sometimes end up in a circular dependency. This usually happens, when + working with tables inside flex (they have wacky internal widths and such). + Setting basis to `0` breaks the loop and fixes all of the problems. - `align: string` - This allows the default alignment (or the one specified by -align-items) to be overridden for individual flex items. See: [Flex](#flex). + align-items) to be overridden for individual flex items. See: [Flex](#flex). ### `Grid` @@ -487,14 +477,10 @@ Example: ```jsx -
- Hello world! -
+
Hello world!
-
- Hello world! -
+
Hello world!
``` @@ -520,6 +506,7 @@ Renders one of the FontAwesome icons of your choice. To smoothen the transition from v4 to v5, we have added a v4 semantic to transform names with `-o` suffixes to FA Regular icons. For example: + - `square` will get transformed to `fas square` - `square-o` will get transformed to `far square` @@ -528,10 +515,10 @@ transform names with `-o` suffixes to FA Regular icons. For example: - See inherited props: [Box](#box) - `name: string` - Icon name. - `size: number` - Icon size. `1` is normal size, `2` is two times bigger. -Fractional numbers are supported. + Fractional numbers are supported. - `rotation: number` - Icon rotation, in degrees. - `spin: boolean` - Whether an icon should be spinning. Good for load -indicators. + indicators. ### `Icon.Stack` @@ -561,12 +548,12 @@ A basic text input, which allow users to enter text into a UI. - See inherited props: [Box](#box) - `value: string` - Value of an input. - `placeholder: string` - Text placed into Input box when it's empty, -otherwise nothing. Clears automatically when focused. + otherwise nothing. Clears automatically when focused. - `fluid: boolean` - Fill all available horizontal space. - `selfClear: boolean` - Clear after hitting enter, as well as remain focused -when this happens. Useful for things like chat inputs. + when this happens. Useful for things like chat inputs. - `onChange: (e, value) => void` - An event, which fires when you commit -the text by either unfocusing the input box, or by pressing the Enter key. + the text by either unfocusing the input box, or by pressing the Enter key. - `onInput: (e, value) => void` - An event, which fires on every keypress. ### `Knob` @@ -582,30 +569,30 @@ Single click opens an input box to manually type in a number. - `animated: boolean` - Animates the value if it was changed externally. - `bipolar: boolean` - Knob can be bipolar or unipolar. - `size: number` - Relative size of the knob. `1` is normal size, `2` is two -times bigger. Fractional numbers are supported. + times bigger. Fractional numbers are supported. - `color: string` - Color of the outer ring around the knob. - `value: number` - Value itself, controls the position of the cursor. - `unit: string` - Unit to display to the right of value. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `fillValue: number` - If set, this value will be used to set the fill -percentage of the outer ring independently of the main value. + percentage of the outer ring independently of the main value. - `ranges: { color: [from, to] }` - Applies a `color` to the outer ring around -the knob based on whether the value lands in the range between `from` and `to`. -See an example of this prop in [ProgressBar](#progressbar). + the knob based on whether the value lands in the range between `from` and `to`. + See an example of this prop in [ProgressBar](#progressbar). - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `LabeledControls` @@ -633,9 +620,7 @@ column is labels, and second column is content. ```jsx - - Content - + Content ``` @@ -644,13 +629,7 @@ to perform some sort of action), there is a way to do that: ```jsx - - Click me! - - )}> + Click me!}> Content @@ -664,7 +643,7 @@ to perform some sort of action), there is a way to do that: **Props:** -- `label: string|InfernoNode` - Item label. +- `label: ReactNode` - Item label. - `color: string` - Sets the color of the text. - `buttons: any` - Buttons to render aside the content. - `children: any` - Content of this labeled item. @@ -677,9 +656,7 @@ Example: ```jsx - - Content - + Content ``` @@ -725,22 +702,22 @@ to fine tune the value, or single click it to manually type a number. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `width: string|number` - Width of the element, in `Box` units or pixels. - `height: string|numer` - Height of the element, in `Box` units or pixels. - `lineHeight: string|number` - lineHeight of the element, in `Box` units or pixels. - `fontSize: string|number` - fontSize of the element, in `Box` units or pixels. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `Popper` @@ -748,7 +725,7 @@ Popper lets you position elements so that they don't go out of the bounds of the **Props:** -- `popperContent: InfernoNode` - The content that will be put inside the popper. +- `popperContent: ReactNode` - The content that will be put inside the popper. - `options?: { ... }` - An object of options to pass to `createPopper`. See [https://popper.js.org/docs/v2/constructors/#options], but the one you want most is `placement`. Valid placements are "bottom", "top", "left", and "right". You can affix "-start" and "-end" to achieve something like top left or top right respectively. You can also use "auto" (with an optional "-start" or "-end"), where a best fit will be chosen. - `additionalStyles: { ... }` - A map of CSS styles to add to the element that will contain the popper. @@ -769,18 +746,19 @@ Usage of `ranges` prop: average: [0.25, 0.5], bad: [-Infinity, 0.25], }} - value={0.6} /> + value={0.6} +/> ``` **Props:** - `value: number` - Current progress as a floating point number between -`minValue` (default: 0) and `maxValue` (default: 1). Determines the -percentage and how filled the bar is. + `minValue` (default: 0) and `maxValue` (default: 1). Determines the + percentage and how filled the bar is. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `ranges: { color: [from, to] }` - Applies a `color` to the progress bar -based on whether the value lands in the range between `from` and `to`. + based on whether the value lands in the range between `from` and `to`. - `color: string` - Color of the progress bar. Can take any of the following formats: - `#ffffff` - Hex format - `rgb(r,g,b) / rgba(r,g,b,a)` - RGB format @@ -798,13 +776,14 @@ The RoundGauge component provides a visual representation of a single metric, as value={tankPressure} minValue={0} maxValue={pressureLimit} - alertAfter={pressureLimit * 0.70} + alertAfter={pressureLimit * 0.7} ranges={{ - "good": [0, pressureLimit * 0.70], - "average": [pressureLimit * 0.70, pressureLimit * 0.85], - "bad": [pressureLimit * 0.85, pressureLimit], + good: [0, pressureLimit * 0.7], + average: [pressureLimit * 0.7, pressureLimit * 0.85], + bad: [pressureLimit * 0.85, pressureLimit], }} - format={formatPressure} /> + format={formatPressure} +/> ``` The alert on the gauge is optional, and will only be shown if the `alertAfter` prop is defined. When defined, the alert will begin to flash the respective color upon which the needle currently rests, as defined in the `ranges` prop. @@ -832,22 +811,14 @@ clearly indicates hierarchy. Section can also be titled to clearly define its purpose. ```jsx -
- Here you can order supply crates. -
+
Here you can order supply crates.
``` If you want to have a button on the right side of an section title (for example, to perform some sort of action), there is a way to do that: ```jsx -
- Send shuttle - - )}> +
Send shuttle}> Here you can order supply crates.
``` @@ -881,23 +852,23 @@ Single click opens an input box to manually type in a number. - `minValue: number` - Lowest possible value. - `maxValue: number` - Highest possible value. - `fillValue: number` - If set, this value will be used to set the fill -percentage of the progress bar filler independently of the main value. + percentage of the progress bar filler independently of the main value. - `ranges: { color: [from, to] }` - Applies a `color` to the slider -based on whether the value lands in the range between `from` and `to`. -See an example of this prop in [ProgressBar](#progressbar). + based on whether the value lands in the range between `from` and `to`. + See an example of this prop in [ProgressBar](#progressbar). - `step: number` (default: 1) - Adjust value by this amount when -dragging the input. + dragging the input. - `stepPixelSize: number` (default: 1) - Screen distance mouse needs -to travel to adjust value by one `step`. + to travel to adjust value by one `step`. - `format: value => value` - Format value using this function before -displaying it. + displaying it. - `suppressFlicker: number` - A number in milliseconds, for which the input -will hold off from updating while events propagate through the backend. -Default is about 250ms, increase it if you still see flickering. + will hold off from updating while events propagate through the backend. + Default is about 250ms, increase it if you still see flickering. - `onChange: (e, value) => void` - An event, which fires when you release -the input, or successfully enter a number. + the input, or successfully enter a number. - `onDrag: (e, value) => void` - An event, which fires about every 500ms -when you drag the input up and down, on release and on manual editing. + when you drag the input up and down, on release and on manual editing. ### `Stack` @@ -913,13 +884,9 @@ Stacks can be vertical by adding a `vertical` property. ```jsx - - Button description - + Button description - + ``` @@ -934,9 +901,7 @@ Make sure to use the `fill` property. -
- Sidebar -
+
Sidebar
@@ -946,9 +911,7 @@ Make sure to use the `fill` property.
-
- Bottom pane -
+
Bottom pane
@@ -980,9 +943,7 @@ Example: ```jsx - - Hello world! - + Hello world! Label @@ -1011,7 +972,7 @@ A straight forward mapping to `
` element. - See inherited props: [Box](#box) - `collapsing: boolean` - Collapses table cell to the smallest possible size, -and stops any text inside from wrapping. + and stops any text inside from wrapping. ### `Tabs` @@ -1047,9 +1008,7 @@ Tabs also support a vertical configuration. This is usually paired with ```jsx - - ... - + ... Tab content. @@ -1063,9 +1022,7 @@ component: ```jsx
- - ... - + ... ... other things ...
``` @@ -1075,9 +1032,9 @@ component: - See inherited props: [Box](#box) - `fluid: boolean` - If true, tabs will take all available horizontal space. - `fill: boolean` - Similarly to `fill` on [Section](#section), tabs will fill -all available vertical space. Only makes sense in a vertical configuration. + all available vertical space. Only makes sense in a vertical configuration. - `vertical: boolean` - Use a vertical configuration, where tabs will be -stacked vertically. + stacked vertically. - `children: Tab[]` - This component only accepts tabs as its children. ### `Tabs.Tab` @@ -1089,8 +1046,8 @@ a lot of `Button` props. - See inherited props: [Button](#button) - `altSelection` - Whether the tab buttons select via standard select (color -change) or by adding a white indicator to the selected tab. -Intended for usage on interfaces where tab color has relevance. + change) or by adding a white indicator to the selected tab. + Intended for usage on interfaces where tab color has relevance. - `icon: string` - Tab icon. - `children: any` - Tab text. - `onClick: function` - Called when element is clicked. @@ -1107,9 +1064,7 @@ Usage: ```jsx - - Sample text. - + Sample text. ``` @@ -1117,7 +1072,7 @@ Usage: - `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. + Fragments or other elements are **not** supported. ## `tgui/layouts` @@ -1131,9 +1086,7 @@ Example: ```jsx - - Hello, world! - + Hello, world! ``` @@ -1148,9 +1101,9 @@ Example: - `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 -putting your content into [Window.Content](#windowcontent). + 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 + putting your content into [Window.Content](#windowcontent). ### `Window.Content` diff --git a/tgui/global.d.ts b/tgui/global.d.ts index c2e7b5ad00bc..d10df8803657 100644 --- a/tgui/global.d.ts +++ b/tgui/global.d.ts @@ -41,36 +41,6 @@ type ByondType = { */ windowId: string; - /** - * True if javascript is running in BYOND. - */ - IS_BYOND: boolean; - - /** - * Version of Trident engine of Internet Explorer. Null if N/A. - */ - TRIDENT: number | null; - - /** - * 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; - /** * If `true`, unhandled errors and common mistakes result in a blue screen * of death, which stops this window from handling incoming messages and diff --git a/tgui/jest.config.js b/tgui/jest.config.js index e654f0089b84..d8b4ac3e41a8 100644 --- a/tgui/jest.config.js +++ b/tgui/jest.config.js @@ -4,13 +4,11 @@ module.exports = { '/packages/**/__tests__/*.{js,ts,tsx}', '/packages/**/*.{spec,test}.{js,ts,tsx}', ], - testPathIgnorePatterns: [ - '/packages/tgui-bench', - ], + testPathIgnorePatterns: ['/packages/tgui-bench'], testEnvironment: 'jsdom', testRunner: require.resolve('jest-circus/runner'), transform: { - '^.+\\.(js|cjs|ts|tsx)$': require.resolve('babel-jest'), + '^.+\\.(js|cjs|ts|tsx)$': require.resolve('@swc/jest'), }, moduleFileExtensions: ['js', 'cjs', 'ts', 'tsx', 'json'], resetMocks: true, diff --git a/tgui/package.json b/tgui/package.json index 3fb2d7f0cb09..354ffbd757ce 100644 --- a/tgui/package.json +++ b/tgui/package.json @@ -1,8 +1,8 @@ { "private": true, "name": "tgui-workspace", - "version": "4.3.0", - "packageManager": "yarn@3.1.1", + "version": "5.0.1", + "packageManager": "yarn@4.2.2", "workspaces": [ "packages/*" ], @@ -11,50 +11,50 @@ "tgui:analyze": "webpack --analyze", "tgui:dev": "node --experimental-modules packages/tgui-dev-server/index.js", "tgui:lint": "eslint packages --ext .js,.cjs,.ts,.tsx", + "tgui:prettier": "prettier --check .", "tgui:sonar": "eslint packages --ext .js,.cjs,.ts,.tsx -c .eslintrc-sonar.yml", "tgui:tsc": "tsc", "tgui:test": "jest --watch", "tgui:test-simple": "CI=true jest --color", "tgui:test-ci": "CI=true jest --color --collect-coverage", - "tgui:bench": "webpack --env TGUI_BENCH=1 && node packages/tgui-bench/index.js" + "tgui:bench": "webpack --env TGUI_BENCH=1 && node packages/tgui-bench/index.js", + "tgui:prettier-fix": "prettier --write .", + "tgui:eslint-fix": "eslint --fix packages --ext .js,.jsx,.cjs,.ts,.tsx" }, "dependencies": { - "@babel/core": "^7.15.0", - "@babel/eslint-parser": "^7.15.0", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-transform-jscript": "^7.14.5", - "@babel/preset-env": "^7.15.0", - "@babel/preset-typescript": "^7.15.0", - "@types/jest": "^27.0.1", - "@types/jsdom": "^16.2.13", - "@types/node": "^14.17.9", - "@types/webpack": "^5.28.0", - "@types/webpack-env": "^1.16.2", - "@typescript-eslint/parser": "^4.29.1", - "babel-jest": "^27.0.6", - "babel-loader": "^8.2.2", - "babel-plugin-inferno": "^6.3.0", - "babel-plugin-transform-remove-console": "^6.9.4", + "@swc/core": "^1.5.25", + "@swc/jest": "^0.2.36", + "@types/jest": "^29.5.12", + "@types/jsdom": "^21.1.7", + "@types/node": "^20.14.1", + "@types/webpack": "^5.28.5", + "@types/webpack-env": "^1.18.5", + "@typescript-eslint/parser": "^7.12.0", "common": "workspace:*", - "css-loader": "^5.2.7", - "eslint": "^7.32.0", - "eslint-plugin-radar": "^0.2.1", - "eslint-plugin-react": "^7.24.0", - "eslint-plugin-unused-imports": "^1.1.4", + "css-loader": "^7.1.2", + "esbuild-loader": "^4.1.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-react": "^7.34.2", + "eslint-plugin-simple-import-sort": "^12.1.0", + "eslint-plugin-sonarjs": "^1.0.3", + "eslint-plugin-typescript-sort-keys": "^3.2.0", + "eslint-plugin-unused-imports": "^3.2.0", "file-loader": "^6.2.0", - "inferno": "^7.4.8", - "jest": "^27.0.6", - "jest-circus": "^27.0.6", - "jsdom": "^16.7.0", - "mini-css-extract-plugin": "^1.6.2", - "sass": "^1.37.5", - "sass-loader": "^11.1.1", - "style-loader": "^2.0.0", - "terser-webpack-plugin": "^5.1.4", - "typescript": "^4.3.5", + "jest": "^29.7.0", + "jest-circus": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "jsdom": "^24.1.0", + "mini-css-extract-plugin": "^2.9.0", + "prettier": "^3.3.0", + "sass": "^1.77.4", + "sass-loader": "^14.2.1", + "style-loader": "^4.0.0", + "swc-loader": "^0.2.6", + "typescript": "5.4.3", "url-loader": "^4.1.1", - "webpack": "^5.75.0", - "webpack-bundle-analyzer": "^4.4.2", - "webpack-cli": "^4.7.2" + "webpack": "^5.91.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-cli": "^5.1.4" } } diff --git a/tgui/packages/common/collections.spec.ts b/tgui/packages/common/collections.spec.ts index 58eff7f354c9..ef35a95cb3ea 100644 --- a/tgui/packages/common/collections.spec.ts +++ b/tgui/packages/common/collections.spec.ts @@ -1,20 +1,20 @@ -import { range, zip } from "./collections"; +import { range, zip } from './collections'; // Type assertions, these will lint if the types are wrong. -const _zip1: [string, number] = zip(["a"], [1])[0]; +const _zip1: [string, number] = zip(['a'], [1])[0]; -describe("range", () => { - test("range(0, 5)", () => { +describe('range', () => { + test('range(0, 5)', () => { expect(range(0, 5)).toEqual([0, 1, 2, 3, 4]); }); }); -describe("zip", () => { +describe('zip', () => { test("zip(['a', 'b', 'c'], [1, 2, 3, 4])", () => { - expect(zip(["a", "b", "c"], [1, 2, 3, 4])).toEqual([ - ["a", 1], - ["b", 2], - ["c", 3], + expect(zip(['a', 'b', 'c'], [1, 2, 3, 4])).toEqual([ + ['a', 1], + ['b', 2], + ['c', 3], ]); }); }); diff --git a/tgui/packages/common/collections.ts b/tgui/packages/common/collections.ts index 5ab378070f0b..ab00ad4cacbf 100644 --- a/tgui/packages/common/collections.ts +++ b/tgui/packages/common/collections.ts @@ -14,40 +14,33 @@ * * @returns {any[]} */ -export const filter = (iterateeFn: ( - input: T, - index: number, - collection: T[], -) => boolean) => - (collection: T[]): T[] => { - if (collection === null || collection === undefined) { - return collection; - } - if (Array.isArray(collection)) { - const result: T[] = []; - for (let i = 0; i < collection.length; i++) { - const item = collection[i]; - if (iterateeFn(item, i, collection)) { - result.push(item); - } +export const filter = + (iterateeFn: (input: T, index: number, collection: T[]) => boolean) => + (collection: T[]): T[] => { + if (collection === null || collection === undefined) { + return collection; + } + if (Array.isArray(collection)) { + const result: T[] = []; + for (let i = 0; i < collection.length; i++) { + const item = collection[i]; + if (iterateeFn(item, i, collection)) { + result.push(item); } - return result; } - throw new Error(`filter() can't iterate on type ${typeof collection}`); - }; + return result; + } + throw new Error(`filter() can't iterate on type ${typeof collection}`); + }; type MapFunction = { - (iterateeFn: ( - value: T, - index: number, - collection: T[], - ) => U): (collection: T[]) => U[]; - - (iterateeFn: ( - value: T, - index: K, - collection: Record, - ) => U): (collection: Record) => U[]; + ( + iterateeFn: (value: T, index: number, collection: T[]) => U, + ): (collection: T[]) => U[]; + + ( + iterateeFn: (value: T, index: K, collection: Record) => U, + ): (collection: Record) => U[]; }; /** @@ -58,7 +51,8 @@ type MapFunction = { * If collection is 'null' or 'undefined', it will be returned "as is" * without emitting any errors (which can be useful in some cases). */ -export const map: MapFunction = (iterateeFn) => +export const map: MapFunction = + (iterateeFn) => (collection: T[]): U[] => { if (collection === null || collection === undefined) { return collection; @@ -81,9 +75,10 @@ export const map: MapFunction = (iterateeFn) => * Given a collection, will run each element through an iteratee function. * Will then filter out undefined values. */ -export const filterMap = (collection: T[], iterateeFn: ( - value: T -) => U | undefined): U[] => { +export const filterMap = ( + collection: T[], + iterateeFn: (value: T) => U | undefined, +): U[] => { const finalCollection: U[] = []; for (const value of collection) { @@ -119,22 +114,22 @@ const COMPARATOR = (objA, objB) => { * * Iteratees are called with one argument (value). */ -export const sortBy = ( - ...iterateeFns: ((input: T) => unknown)[] -) => (array: T[]): T[] => { +export const sortBy = + (...iterateeFns: ((input: T) => unknown)[]) => + (array: T[]): T[] => { if (!Array.isArray(array)) { return array; } let length = array.length; // Iterate over the array to collect criteria to sort it by let mappedArray: { - criteria: unknown[], - value: T, + criteria: unknown[]; + value: T; }[] = []; for (let i = 0; i < length; i++) { const value = array[i]; mappedArray.push({ - criteria: iterateeFns.map(fn => fn(value)), + criteria: iterateeFns.map((fn) => fn(value)), value, }); } @@ -163,15 +158,14 @@ export const range = (start: number, end: number): number[] => /** * A fast implementation of reduce. */ -export const reduce = (reducerFn, initialValue) => array => { +export const reduce = (reducerFn, initialValue) => (array) => { const length = array.length; let i; let result; if (initialValue === undefined) { i = 1; result = array[0]; - } - else { + } else { i = 0; result = initialValue; } @@ -192,15 +186,14 @@ export const reduce = (reducerFn, initialValue) => array => { * is determined by the order they occur in the array. The iteratee is * invoked with one argument: value. */ -export const uniqBy = ( - iterateeFn?: (value: T) => unknown -) => (array: T[]): T[] => { +export const uniqBy = + (iterateeFn?: (value: T) => unknown) => + (array: T[]): T[] => { const { length } = array; const result: T[] = []; const seen: unknown[] = iterateeFn ? [] : result; let index = -1; - outer: - while (++index < length) { + outer: while (++index < length) { let value: T | 0 = array[index]; const computed = iterateeFn ? iterateeFn(value) : value; if (computed === computed) { @@ -214,8 +207,7 @@ export const uniqBy = ( seen.push(computed); } result.push(value); - } - else if (!seen.includes(computed)) { + } else if (!seen.includes(computed)) { if (seen !== result) { seen.push(computed); } @@ -261,7 +253,8 @@ export const zip = (...arrays: T): Zip => { * specify how grouped values should be combined. The iteratee is * invoked with the elements of each group. */ -export const zipWith = (iterateeFn: (...values: T[]) => U) => +export const zipWith = + (iterateeFn: (...values: T[]) => U) => (...arrays: T[][]): U[] => { return map((values: T[]) => iterateeFn(...values))(zip(...arrays)); }; @@ -301,9 +294,9 @@ const binarySearch = ( return compare > insertingKey ? middle : middle + 1; }; -export const binaryInsertWith = (getKey: (value: T) => U): - ((collection: readonly T[], value: T) => T[]) => -{ +export const binaryInsertWith = ( + getKey: (value: T) => U, +): ((collection: readonly T[], value: T) => T[]) => { return (collection, value) => { const copy = [...collection]; copy.splice(binarySearch(getKey, collection, value), 0, value); diff --git a/tgui/packages/common/color.js b/tgui/packages/common/color.js index 2aadae8d6bdf..fffd452ddb83 100644 --- a/tgui/packages/common/color.js +++ b/tgui/packages/common/color.js @@ -27,23 +27,23 @@ export class Color { /** * Creates a color from the CSS hex color notation. */ -Color.fromHex = hex => ( +Color.fromHex = (hex) => new Color( parseInt(hex.substr(1, 2), 16), parseInt(hex.substr(3, 2), 16), - parseInt(hex.substr(5, 2), 16)) -); + parseInt(hex.substr(5, 2), 16), + ); /** * Linear interpolation of two colors. */ -Color.lerp = (c1, c2, n) => ( +Color.lerp = (c1, c2, n) => new Color( (c2.r - c1.r) * n + c1.r, (c2.g - c1.g) * n + c1.g, (c2.b - c1.b) * n + c1.b, - (c2.a - c1.a) * n + c1.a) -); + (c2.a - c1.a) * n + c1.a, + ); /** * Loops up the color in the provided list of colors diff --git a/tgui/packages/common/events.js b/tgui/packages/common/events.js index 6d590a34453b..7eeff511aa56 100644 --- a/tgui/packages/common/events.js +++ b/tgui/packages/common/events.js @@ -19,10 +19,9 @@ export class EventEmitter { if (!listeners) { throw new Error(`There is no listeners for "${name}"`); } - this.listeners[name] = listeners - .filter(existingListener => { - return existingListener !== listener; - }); + this.listeners[name] = listeners.filter((existingListener) => { + return existingListener !== listener; + }); } emit(name, ...params) { diff --git a/tgui/packages/common/fp.js b/tgui/packages/common/fp.js index 7aa00a00f3ee..b8da91e52f09 100644 --- a/tgui/packages/common/fp.js +++ b/tgui/packages/common/fp.js @@ -9,19 +9,20 @@ * functions, where each successive invocation is supplied the return * value of the previous. */ -export const flow = (...funcs) => (input, ...rest) => { - let output = input; - for (let func of funcs) { - // Recurse into the array of functions - if (Array.isArray(func)) { - output = flow(...func)(output, ...rest); +export const flow = + (...funcs) => + (input, ...rest) => { + let output = input; + for (let func of funcs) { + // Recurse into the array of functions + if (Array.isArray(func)) { + output = flow(...func)(output, ...rest); + } else if (func) { + output = func(output, ...rest); + } } - else if (func) { - output = func(output, ...rest); - } - } - return output; -}; + return output; + }; /** * Composes single-argument functions from right to left. @@ -37,11 +38,14 @@ export const flow = (...funcs) => (input, ...rest) => { */ export const compose = (...funcs) => { if (funcs.length === 0) { - return arg => arg; + return (arg) => arg; } if (funcs.length === 1) { return funcs[0]; } - return funcs.reduce((a, b) => (value, ...rest) => - a(b(value, ...rest), ...rest)); + return funcs.reduce( + (a, b) => + (value, ...rest) => + a(b(value, ...rest), ...rest), + ); }; diff --git a/tgui/packages/common/keys.ts b/tgui/packages/common/keys.ts new file mode 100644 index 000000000000..3e913151707f --- /dev/null +++ b/tgui/packages/common/keys.ts @@ -0,0 +1,58 @@ +/** + * ### Key codes. + * event.keyCode is deprecated, use this reference instead. + * + * Handles modifier keys (Shift, Alt, Control) and arrow keys. + * + * For alphabetical keys, use the actual character (e.g. 'a') instead of the key code. + * Don't access Esc or Escape directly, use isEscape() instead + * + * Something isn't here that you want? Just add it: + * @url https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values + * @usage + * ```ts + * import { KEY } from 'tgui/common/keys'; + * + * if (event.key === KEY.Enter) { + * // do something + * } + * ``` + * + * + */ +export enum KEY { + Alt = 'Alt', + Backspace = 'Backspace', + Control = 'Control', + Delete = 'Delete', + Down = 'ArrowDown', + End = 'End', + Enter = 'Enter', + Esc = 'Esc', + Escape = 'Escape', + Home = 'Home', + Insert = 'Insert', + Left = 'ArrowLeft', + PageDown = 'PageDown', + PageUp = 'PageUp', + Right = 'ArrowRight', + Shift = 'Shift', + Space = ' ', + Tab = 'Tab', + Up = 'ArrowUp', +} + +/** + * ### isEscape + * + * Checks if the user has hit the 'ESC' key on their keyboard. + * There's a weirdness in BYOND where this could be either the string + * 'Escape' or 'Esc' depending on the browser. This function handles + * both cases. + * + * @param key - the key to check, typically from event.key + * @returns true if key is Escape or Esc, false otherwise + */ +export function isEscape(key: string): boolean { + return key === KEY.Esc || key === KEY.Escape; +} diff --git a/tgui/packages/common/math.ts b/tgui/packages/common/math.ts index 97e6b60b2ed4..9dc1d6556936 100644 --- a/tgui/packages/common/math.ts +++ b/tgui/packages/common/math.ts @@ -14,7 +14,7 @@ export const clamp = (value, min, max) => { /** * Limits a number between 0 and 1. */ -export const clamp01 = value => { +export const clamp01 = (value) => { return value < 0 ? 0 : value > 1 ? 1 : value; }; @@ -69,9 +69,7 @@ export const toFixed = (value, fractionDigits = 0) => { * Range is an array of two numbers, for example: [0, 15]. */ export const inRange = (value, range) => { - return range - && value >= range[0] - && value <= range[1]; + return range && value >= range[0] && value <= range[1]; }; /** @@ -92,7 +90,7 @@ export const keyOfMatchingRange = (value, ranges) => { /** * Get number of digits following the decimal point in a number */ -export const numberOfDecimalDigits = value => { +export const numberOfDecimalDigits = (value) => { if (Math.floor(value) !== value) { return value.toString().split('.')[1].length || 0; } diff --git a/tgui/packages/common/package.json b/tgui/packages/common/package.json index 54d73251a65a..f269009bd797 100644 --- a/tgui/packages/common/package.json +++ b/tgui/packages/common/package.json @@ -1,5 +1,5 @@ { "private": true, "name": "common", - "version": "4.3.0" + "version": "5.0.1" } diff --git a/tgui/packages/common/perf.js b/tgui/packages/common/perf.js index 8414971f93b0..c2d6cb27db15 100644 --- a/tgui/packages/common/perf.js +++ b/tgui/packages/common/perf.js @@ -48,10 +48,15 @@ const measure = (markerNameA, markerNameB) => { } }; -const formatDuration = duration => { +const formatDuration = (duration) => { const durationInFrames = duration / FRAME_DURATION; - return duration.toFixed(duration < 10 ? 1 : 0) + 'ms ' - + '(' + durationInFrames.toFixed(2) + ' frames)'; + return ( + duration.toFixed(duration < 10 ? 1 : 0) + + 'ms ' + + '(' + + durationInFrames.toFixed(2) + + ' frames)' + ); }; export const perf = { diff --git a/tgui/packages/common/react.ts b/tgui/packages/common/react.ts index c8a08f04934b..938a1e303a16 100644 --- a/tgui/packages/common/react.ts +++ b/tgui/packages/common/react.ts @@ -24,7 +24,7 @@ export const classes = (classNames: (string | BooleanLike)[]) => { */ export const normalizeChildren = (children: T | T[]) => { if (Array.isArray(children)) { - return children.flat().filter(value => value) as T[]; + return children.flat().filter((value) => value) as T[]; } if (typeof children === 'object') { return [children]; @@ -51,22 +51,11 @@ export const shallowDiffers = (a: object, b: object) => { 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'; + return value !== undefined && value !== null && typeof value !== 'boolean'; }; /** diff --git a/tgui/packages/common/redux.js b/tgui/packages/common/redux.js index ebed11f166b2..782b5f319aaa 100644 --- a/tgui/packages/common/redux.js +++ b/tgui/packages/common/redux.js @@ -20,11 +20,11 @@ export const createStore = (reducer, enhancer) => { const getState = () => currentState; - const subscribe = listener => { + const subscribe = (listener) => { listeners.push(listener); }; - const dispatch = action => { + const dispatch = (action) => { currentState = reducer(currentState, action); for (let i = 0; i < listeners.length; i++) { listeners[i](); @@ -49,27 +49,29 @@ export const createStore = (reducer, enhancer) => { * actions. */ export const applyMiddleware = (...middlewares) => { - return createStore => (reducer, ...args) => { - const store = createStore(reducer, ...args); - - let dispatch = () => { - throw new Error( - 'Dispatching while constructing your middleware is not allowed.'); - }; - - const storeApi = { - getState: store.getState, - dispatch: (action, ...args) => dispatch(action, ...args), + return (createStore) => + (reducer, ...args) => { + const store = createStore(reducer, ...args); + + let dispatch = () => { + throw new Error( + 'Dispatching while constructing your middleware is not allowed.', + ); + }; + + const storeApi = { + getState: store.getState, + dispatch: (action, ...args) => dispatch(action, ...args), + }; + + const chain = middlewares.map((middleware) => middleware(storeApi)); + dispatch = compose(...chain)(store.dispatch); + + return { + ...store, + dispatch, + }; }; - - const chain = middlewares.map(middleware => middleware(storeApi)); - dispatch = compose(...chain)(store.dispatch); - - return { - ...store, - dispatch, - }; - }; }; /** @@ -80,7 +82,7 @@ export const applyMiddleware = (...middlewares) => { * in the state that are not present in the reducers object. This function * is also more flexible than the redux counterpart. */ -export const combineReducers = reducersObj => { +export const combineReducers = (reducersObj) => { const keys = Object.keys(reducersObj); let hasChanged = false; return (prevState = {}, action) => { @@ -94,9 +96,7 @@ export const combineReducers = reducersObj => { nextState[key] = nextDomainState; } } - return hasChanged - ? nextState - : prevState; + return hasChanged ? nextState : prevState; }; }; @@ -136,18 +136,6 @@ export const createAction = (type, prepare = null) => { }; actionCreator.toString = () => '' + type; actionCreator.type = type; - actionCreator.match = action => action.type === type; + actionCreator.match = (action) => action.type === type; return actionCreator; }; - - -// Implementation specific -// -------------------------------------------------------- - -export const useDispatch = context => { - return context.store.dispatch; -}; - -export const useSelector = (context, selector) => { - return selector(context.store.getState()); -}; diff --git a/tgui/packages/common/storage.js b/tgui/packages/common/storage.js index 83dc6d99c1cc..af735769c140 100644 --- a/tgui/packages/common/storage.js +++ b/tgui/packages/common/storage.js @@ -10,18 +10,17 @@ export const IMPL_MEMORY = 0; export const IMPL_LOCAL_STORAGE = 1; export const IMPL_INDEXED_DB = 2; -const INDEXED_DB_VERSION = 1; -const INDEXED_DB_NAME = 'tgui'; -const INDEXED_DB_STORE_NAME = 'storage-v1'; +const INDEXED_DB_VERSION = 2; +const INDEXED_DB_NAME = 'tgui-daedalus'; +const INDEXED_DB_STORE_NAME = 'daedalus-storage-v1'; const READ_ONLY = 'readonly'; const READ_WRITE = 'readwrite'; -const testGeneric = testFn => () => { +const testGeneric = (testFn) => () => { try { return Boolean(testFn()); - } - catch { + } catch { return false; } }; @@ -29,14 +28,15 @@ const testGeneric = testFn => () => { // Localstorage can sometimes throw an error, even if DOM storage is not // disabled in IE11 settings. // See: https://superuser.com/questions/1080011 -const testLocalStorage = testGeneric(() => ( - window.localStorage && window.localStorage.getItem -)); +const testLocalStorage = testGeneric( + () => window.localStorage && window.localStorage.getItem, +); -const testIndexedDb = testGeneric(() => ( - (window.indexedDB || window.msIndexedDB) - && (window.IDBTransaction || window.msIDBTransaction) -)); +const testIndexedDb = testGeneric( + () => + (window.indexedDB || window.msIndexedDB) && + (window.IDBTransaction || window.msIDBTransaction), +); class MemoryBackend { constructor() { @@ -96,8 +96,7 @@ class IndexedDbBackend { req.onupgradeneeded = () => { try { req.result.createObjectStore(INDEXED_DB_STORE_NAME); - } - catch (err) { + } catch (err) { reject(new Error('Failed to upgrade IDB: ' + req.error)); } }; @@ -109,9 +108,11 @@ class IndexedDbBackend { } getStore(mode) { - return this.dbPromise.then(db => db - .transaction(INDEXED_DB_STORE_NAME, mode) - .objectStore(INDEXED_DB_STORE_NAME)); + return this.dbPromise.then((db) => + db + .transaction(INDEXED_DB_STORE_NAME, mode) + .objectStore(INDEXED_DB_STORE_NAME), + ); } async get(key) { @@ -161,8 +162,7 @@ class StorageProxy { const backend = new IndexedDbBackend(); await backend.dbPromise; return backend; - } - catch {} + } catch {} } if (testLocalStorage()) { return new LocalStorageBackend(); diff --git a/tgui/packages/common/string.babel-plugin.cjs b/tgui/packages/common/string.babel-plugin.cjs deleted file mode 100644 index 68295aefcf84..000000000000 --- a/tgui/packages/common/string.babel-plugin.cjs +++ /dev/null @@ -1,73 +0,0 @@ -/** - * This plugin saves overall about 10KB on the final bundle size, so it's - * sort of worth it. - * - * We are using a .cjs extension because: - * - * 1. Webpack CLI only supports CommonJS modules; - * 2. tgui-dev-server supports both, but we still need to signal NodeJS - * to import it as a CommonJS module, hence .cjs extension. - * - * We need to copy-paste the whole "multiline" function because we can't - * synchronously import an ES module from a CommonJS module. - * - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -/** - * Removes excess whitespace and indentation from the string. - */ -const multiline = str => { - const lines = str.split('\n'); - // Determine base indentation - let minIndent; - for (let line of lines) { - for (let indent = 0; indent < line.length; indent++) { - const char = line[indent]; - if (char !== ' ') { - if (minIndent === undefined || indent < minIndent) { - minIndent = indent; - } - break; - } - } - } - if (!minIndent) { - minIndent = 0; - } - // Remove this base indentation and trim the resulting string - // from both ends. - return lines - .map(line => line.substr(minIndent).trimRight()) - .join('\n') - .trim(); -}; - -const StringPlugin = ref => { - return { - visitor: { - TaggedTemplateExpression: path => { - if (path.node.tag.name === 'multiline') { - const { quasi } = path.node; - if (quasi.expressions.length > 0) { - throw new Error('Multiline tag does not support expressions!'); - } - if (quasi.quasis.length > 1) { - throw new Error('Quasis is longer than 1'); - } - const { value } = quasi.quasis[0]; - value.raw = multiline(value.raw); - value.cooked = multiline(value.cooked); - path.replaceWith(quasi); - } - }, - }, - }; -}; - -module.exports = { - __esModule: true, - default: StringPlugin, -}; diff --git a/tgui/packages/common/string.js b/tgui/packages/common/string.js index 16a0921a2559..f13b23592e9f 100644 --- a/tgui/packages/common/string.js +++ b/tgui/packages/common/string.js @@ -4,39 +4,6 @@ * @license MIT */ -/** - * Removes excess whitespace and indentation from the string. - */ -export const multiline = str => { - if (Array.isArray(str)) { - // Small stub to allow usage as a template tag - return multiline(str.join('')); - } - const lines = str.split('\n'); - // Determine base indentation - let minIndent; - for (let line of lines) { - for (let indent = 0; indent < line.length; indent++) { - const char = line[indent]; - if (char !== ' ') { - if (minIndent === undefined || indent < minIndent) { - minIndent = indent; - } - break; - } - } - } - if (!minIndent) { - minIndent = 0; - } - // Remove this base indentation and trim the resulting string - // from both ends. - return lines - .map(line => line.substr(minIndent).trimRight()) - .join('\n') - .trim(); -}; - /** * Creates a glob pattern matcher. * @@ -44,12 +11,12 @@ export const multiline = str => { * * Example: createGlobPattern('*@domain')('user@domain') === true */ -export const createGlobPattern = pattern => { - const escapeString = str => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); - const regex = new RegExp('^' - + pattern.split(/\*+/).map(escapeString).join('.*') - + '$'); - return str => regex.test(str); +export const createGlobPattern = (pattern) => { + const escapeString = (str) => str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); + const regex = new RegExp( + '^' + pattern.split(/\*+/).map(escapeString).join('.*') + '$', + ); + return (str) => regex.test(str); }; /** @@ -64,7 +31,7 @@ export const createGlobPattern = pattern => { */ export const createSearch = (searchText, stringifier) => { const preparedSearchText = searchText.toLowerCase().trim(); - return obj => { + return (obj) => { if (!preparedSearchText) { return true; } @@ -72,13 +39,11 @@ export const createSearch = (searchText, stringifier) => { if (!str) { return false; } - return str - .toLowerCase() - .includes(preparedSearchText); + return str.toLowerCase().includes(preparedSearchText); }; }; -export const capitalize = str => { +export const capitalize = (str) => { // Handle array if (Array.isArray(str)) { return str.map(capitalize); @@ -87,7 +52,7 @@ export const capitalize = str => { return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); }; -export const toTitleCase = str => { +export const toTitleCase = (str) => { // Handle array if (Array.isArray(str)) { return str.map(toTitleCase); @@ -99,19 +64,38 @@ export const toTitleCase = str => { // Handle string const WORDS_UPPER = ['Id', 'Tv']; const WORDS_LOWER = [ - 'A', 'An', 'And', 'As', 'At', 'But', 'By', 'For', 'For', 'From', 'In', - 'Into', 'Near', 'Nor', 'Of', 'On', 'Onto', 'Or', 'The', 'To', 'With', + 'A', + 'An', + 'And', + 'As', + 'At', + 'But', + 'By', + 'For', + 'For', + 'From', + 'In', + 'Into', + 'Near', + 'Nor', + 'Of', + 'On', + 'Onto', + 'Or', + 'The', + 'To', + 'With', ]; - let currentStr = str.replace(/([^\W_]+[^\s-]*) */g, str => { + let currentStr = str.replace(/([^\W_]+[^\s-]*) */g, (str) => { return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase(); }); for (let word of WORDS_LOWER) { const regex = new RegExp('\\s' + word + '\\s', 'g'); - currentStr = currentStr.replace(regex, str => str.toLowerCase()); + currentStr = currentStr.replace(regex, (str) => str.toLowerCase()); } for (let word of WORDS_UPPER) { const regex = new RegExp('\\b' + word + '\\b', 'g'); - currentStr = currentStr.replace(regex, str => str.toLowerCase()); + currentStr = currentStr.replace(regex, (str) => str.toLowerCase()); } return currentStr; }; @@ -122,7 +106,7 @@ export const toTitleCase = str => { * @param {String} str Encoded HTML string * @return {String} Decoded HTML string */ -export const decodeHtmlEntities = str => { +export const decodeHtmlEntities = (str) => { if (!str) { return str; } @@ -133,30 +117,32 @@ export const decodeHtmlEntities = str => { quot: '"', lt: '<', gt: '>', - apos: '\'', + apos: "'", }; - return str - // Newline tags - .replace(/
/gi, '\n') - .replace(/<\/?[a-z0-9-_]+[^>]*>/gi, '') - // Basic entities - .replace(translate_re, (match, entity) => translate[entity]) - // Decimal entities - .replace(/&#?([0-9]+);/gi, (match, numStr) => { - const num = parseInt(numStr, 10); - return String.fromCharCode(num); - }) - // Hex entities - .replace(/&#x?([0-9a-f]+);/gi, (match, numStr) => { - const num = parseInt(numStr, 16); - return String.fromCharCode(num); - }); + return ( + str + // Newline tags + .replace(/
/gi, '\n') + .replace(/<\/?[a-z0-9-_]+[^>]*>/gi, '') + // Basic entities + .replace(translate_re, (match, entity) => translate[entity]) + // Decimal entities + .replace(/&#?([0-9]+);/gi, (match, numStr) => { + const num = parseInt(numStr, 10); + return String.fromCharCode(num); + }) + // Hex entities + .replace(/&#x?([0-9a-f]+);/gi, (match, numStr) => { + const num = parseInt(numStr, 16); + return String.fromCharCode(num); + }) + ); }; /** * Converts an object into a query string, */ -export const buildQueryString = obj => Object.keys(obj) - .map(key => encodeURIComponent(key) - + '=' + encodeURIComponent(obj[key])) - .join('&'); +export const buildQueryString = (obj) => + Object.keys(obj) + .map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])) + .join('&'); diff --git a/tgui/packages/common/timer.js b/tgui/packages/common/timer.js index 1177071b9c62..0b1c68199e9f 100644 --- a/tgui/packages/common/timer.js +++ b/tgui/packages/common/timer.js @@ -33,6 +33,5 @@ export const debounce = (fn, time, immediate = false) => { * * @param {number} time */ -export const sleep = time => ( - new Promise(resolve => setTimeout(resolve, time)) -); +export const sleep = (time) => + new Promise((resolve) => setTimeout(resolve, time)); diff --git a/tgui/packages/common/types.ts b/tgui/packages/common/types.ts index a92ac122d9fe..e68aadbdb11c 100644 --- a/tgui/packages/common/types.ts +++ b/tgui/packages/common/types.ts @@ -1,5 +1,8 @@ /** * Returns the arguments of a function F as an array. */ -export type ArgumentsOf - = F extends (...args: infer A) => unknown ? A : never; +export type ArgumentsOf = F extends ( + ...args: infer A +) => unknown + ? A + : never; diff --git a/tgui/packages/common/uuid.js b/tgui/packages/common/uuid.js index 7721af64949b..f2eb4bb98f4e 100644 --- a/tgui/packages/common/uuid.js +++ b/tgui/packages/common/uuid.js @@ -11,9 +11,9 @@ */ export const createUuid = () => { let d = new Date().getTime(); - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = (d + Math.random() * 16) % 16 | 0; d = Math.floor(d / 16); - return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); + return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16); }); }; diff --git a/tgui/packages/common/vector.js b/tgui/packages/common/vector.js index c3ac350a4e8e..b1f85f7429db 100644 --- a/tgui/packages/common/vector.js +++ b/tgui/packages/common/vector.js @@ -32,17 +32,17 @@ export const vecDivide = (...vecs) => { }; export const vecScale = (vec, n) => { - return map(x => x * n)(vec); + return map((x) => x * n)(vec); }; -export const vecInverse = vec => { - return map(x => -x)(vec); +export const vecInverse = (vec) => { + return map((x) => -x)(vec); }; -export const vecLength = vec => { +export const vecLength = (vec) => { return Math.sqrt(reduce(ADD)(zipWith(MUL)(vec, vec))); }; -export const vecNormalize = vec => { +export const vecNormalize = (vec) => { return vecDivide(vec, vecLength(vec)); }; diff --git a/tgui/packages/tgfont/icons/ATTRIBUTIONS.md b/tgui/packages/tgfont/icons/ATTRIBUTIONS.md index 2f218388d364..0491b90e726e 100644 --- a/tgui/packages/tgfont/icons/ATTRIBUTIONS.md +++ b/tgui/packages/tgfont/icons/ATTRIBUTIONS.md @@ -1,6 +1,8 @@ bad-touch.svg contains: + - hug by Phạm Thanh Lộc from the Noun Project - Fight by Rudez Studio from the Noun Project prosthetic-leg.svg contains: + - prosthetic leg by Gan Khoon Lay from the Noun Project diff --git a/tgui/packages/tgfont/mkdist.cjs b/tgui/packages/tgfont/mkdist.cjs index 5c628becf992..85634bd265d9 100644 --- a/tgui/packages/tgfont/mkdist.cjs +++ b/tgui/packages/tgfont/mkdist.cjs @@ -10,5 +10,4 @@ process.chdir(__dirname); // Silently make a dist folder try { require('fs').mkdirSync('dist'); -} -catch (err) {} +} catch (err) {} diff --git a/tgui/packages/tgfont/package.json b/tgui/packages/tgfont/package.json index 9459aa129696..cff5a9f61497 100644 --- a/tgui/packages/tgfont/package.json +++ b/tgui/packages/tgfont/package.json @@ -6,6 +6,6 @@ "tgfont:build": "node mkdist.cjs && fantasticon --config config.cjs" }, "dependencies": { - "fantasticon": "^1.2.2" + "fantasticon": "^3.0.0" } } diff --git a/tgui/packages/tgui-bench/entrypoint.tsx b/tgui/packages/tgui-bench/entrypoint.tsx index d72aa60a667e..48dcd3dcce11 100644 --- a/tgui/packages/tgui-bench/entrypoint.tsx +++ b/tgui/packages/tgui-bench/entrypoint.tsx @@ -4,8 +4,10 @@ * @license MIT */ -import { setupGlobalEvents } from 'tgui/events'; import 'tgui/styles/main.scss'; + +import { setupGlobalEvents } from 'tgui/events'; + import Benchmark from './lib/benchmark'; const sendMessage = (obj: any) => { @@ -62,8 +64,7 @@ const setupApp = async () => { } suite.run(); }); - } - catch (error) { + } catch (error) { sendMessage({ type: 'error', error }); } } diff --git a/tgui/packages/tgui-bench/index.js b/tgui/packages/tgui-bench/index.js index ac3d8c9cce09..9f6aee20996d 100644 --- a/tgui/packages/tgui-bench/index.js +++ b/tgui/packages/tgui-bench/index.js @@ -27,7 +27,8 @@ const setup = async () => { assets += `\n`; const publicDir = path.resolve(__dirname, '../../public'); - const page = fs.readFileSync(path.join(publicDir, 'tgui.html'), 'utf-8') + const page = fs + .readFileSync(path.join(publicDir, 'tgui.html'), 'utf-8') .replace('\n', assets); server.register(require('fastify-static'), { @@ -67,8 +68,7 @@ const setup = async () => { try { await server.listen(3002, '0.0.0.0'); - } - catch (err) { + } catch (err) { console.error(err); process.exit(1); } diff --git a/tgui/packages/tgui-bench/lib/benchmark.d.ts b/tgui/packages/tgui-bench/lib/benchmark.d.ts index 7f3310005f77..3eac568d4184 100644 --- a/tgui/packages/tgui-bench/lib/benchmark.d.ts +++ b/tgui/packages/tgui-bench/lib/benchmark.d.ts @@ -27,7 +27,7 @@ declare class Benchmark { static reduce( arr: T[], callback: (accumulator: K, value: T) => K, - thisArg?: any + thisArg?: any, ): K; static options: Benchmark.Options; diff --git a/tgui/packages/tgui-bench/lib/benchmark.js b/tgui/packages/tgui-bench/lib/benchmark.js index 1e76cec70870..335934833024 100644 --- a/tgui/packages/tgui-bench/lib/benchmark.js +++ b/tgui/packages/tgui-bench/lib/benchmark.js @@ -7,7 +7,7 @@ * Manually stripped from useless junk by /tg/station13 maintainers. * Available under MIT license */ -module.exports = (function() { +module.exports = function () { 'use strict'; /** Used as a safe reference for `undefined` in pre ES5 environments. */ @@ -15,8 +15,8 @@ module.exports = (function() { /** Used to determine if values are of the language type Object. */ var objectTypes = { - 'function': true, - 'object': true + function: true, + object: true, }; /** Used as a reference to the global object. */ @@ -36,18 +36,33 @@ module.exports = (function() { /** Used to assign default `context` object properties. */ var contextProps = [ - 'Array', 'Date', 'Function', 'Math', 'Object', 'RegExp', 'String', '_', - 'clearTimeout', 'chrome', 'chromium', 'document', 'navigator', 'phantom', - 'platform', 'process', 'runtime', 'setTimeout' + 'Array', + 'Date', + 'Function', + 'Math', + 'Object', + 'RegExp', + 'String', + '_', + 'clearTimeout', + 'chrome', + 'chromium', + 'document', + 'navigator', + 'phantom', + 'platform', + 'process', + 'runtime', + 'setTimeout', ]; /** Used to avoid hz of Infinity. */ var divisors = { - '1': 4096, - '2': 512, - '3': 64, - '4': 8, - '5': 0 + 1: 4096, + 2: 512, + 3: 64, + 4: 8, + 5: 0, }; /** @@ -55,12 +70,37 @@ module.exports = (function() { * For more info see http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm. */ var tTable = { - '1': 12.706, '2': 4.303, '3': 3.182, '4': 2.776, '5': 2.571, '6': 2.447, - '7': 2.365, '8': 2.306, '9': 2.262, '10': 2.228, '11': 2.201, '12': 2.179, - '13': 2.16, '14': 2.145, '15': 2.131, '16': 2.12, '17': 2.11, '18': 2.101, - '19': 2.093, '20': 2.086, '21': 2.08, '22': 2.074, '23': 2.069, '24': 2.064, - '25': 2.06, '26': 2.056, '27': 2.052, '28': 2.048, '29': 2.045, '30': 2.042, - 'infinity': 1.96 + 1: 12.706, + 2: 4.303, + 3: 3.182, + 4: 2.776, + 5: 2.571, + 6: 2.447, + 7: 2.365, + 8: 2.306, + 9: 2.262, + 10: 2.228, + 11: 2.201, + 12: 2.179, + 13: 2.16, + 14: 2.145, + 15: 2.131, + 16: 2.12, + 17: 2.11, + 18: 2.101, + 19: 2.093, + 20: 2.086, + 21: 2.08, + 22: 2.074, + 23: 2.069, + 24: 2.064, + 25: 2.06, + 26: 2.056, + 27: 2.052, + 28: 2.048, + 29: 2.045, + 30: 2.042, + infinity: 1.96, }; /** @@ -68,32 +108,64 @@ module.exports = (function() { * For more info see http://www.saburchill.com/IBbiology/stats/003.html. */ var uTable = { - '5': [0, 1, 2], - '6': [1, 2, 3, 5], - '7': [1, 3, 5, 6, 8], - '8': [2, 4, 6, 8, 10, 13], - '9': [2, 4, 7, 10, 12, 15, 17], - '10': [3, 5, 8, 11, 14, 17, 20, 23], - '11': [3, 6, 9, 13, 16, 19, 23, 26, 30], - '12': [4, 7, 11, 14, 18, 22, 26, 29, 33, 37], - '13': [4, 8, 12, 16, 20, 24, 28, 33, 37, 41, 45], - '14': [5, 9, 13, 17, 22, 26, 31, 36, 40, 45, 50, 55], - '15': [5, 10, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64], - '16': [6, 11, 15, 21, 26, 31, 37, 42, 47, 53, 59, 64, 70, 75], - '17': [6, 11, 17, 22, 28, 34, 39, 45, 51, 57, 63, 67, 75, 81, 87], - '18': [7, 12, 18, 24, 30, 36, 42, 48, 55, 61, 67, 74, 80, 86, 93, 99], - '19': [7, 13, 19, 25, 32, 38, 45, 52, 58, 65, 72, 78, 85, 92, 99, 106, 113], - '20': [8, 14, 20, 27, 34, 41, 48, 55, 62, 69, 76, 83, 90, 98, 105, 112, 119, 127], - '21': [8, 15, 22, 29, 36, 43, 50, 58, 65, 73, 80, 88, 96, 103, 111, 119, 126, 134, 142], - '22': [9, 16, 23, 30, 38, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 141, 150, 158], - '23': [9, 17, 24, 32, 40, 48, 56, 64, 73, 81, 89, 98, 106, 115, 123, 132, 140, 149, 157, 166, 175], - '24': [10, 17, 25, 33, 42, 50, 59, 67, 76, 85, 94, 102, 111, 120, 129, 138, 147, 156, 165, 174, 183, 192], - '25': [10, 18, 27, 35, 44, 53, 62, 71, 80, 89, 98, 107, 117, 126, 135, 145, 154, 163, 173, 182, 192, 201, 211], - '26': [11, 19, 28, 37, 46, 55, 64, 74, 83, 93, 102, 112, 122, 132, 141, 151, 161, 171, 181, 191, 200, 210, 220, 230], - '27': [11, 20, 29, 38, 48, 57, 67, 77, 87, 97, 107, 118, 125, 138, 147, 158, 168, 178, 188, 199, 209, 219, 230, 240, 250], - '28': [12, 21, 30, 40, 50, 60, 70, 80, 90, 101, 111, 122, 132, 143, 154, 164, 175, 186, 196, 207, 218, 228, 239, 250, 261, 272], - '29': [13, 22, 32, 42, 52, 62, 73, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 238, 249, 260, 271, 282, 294], - '30': [13, 23, 33, 43, 54, 65, 76, 87, 98, 109, 120, 131, 143, 154, 166, 177, 189, 200, 212, 223, 235, 247, 258, 270, 282, 293, 305, 317] + 5: [0, 1, 2], + 6: [1, 2, 3, 5], + 7: [1, 3, 5, 6, 8], + 8: [2, 4, 6, 8, 10, 13], + 9: [2, 4, 7, 10, 12, 15, 17], + 10: [3, 5, 8, 11, 14, 17, 20, 23], + 11: [3, 6, 9, 13, 16, 19, 23, 26, 30], + 12: [4, 7, 11, 14, 18, 22, 26, 29, 33, 37], + 13: [4, 8, 12, 16, 20, 24, 28, 33, 37, 41, 45], + 14: [5, 9, 13, 17, 22, 26, 31, 36, 40, 45, 50, 55], + 15: [5, 10, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64], + 16: [6, 11, 15, 21, 26, 31, 37, 42, 47, 53, 59, 64, 70, 75], + 17: [6, 11, 17, 22, 28, 34, 39, 45, 51, 57, 63, 67, 75, 81, 87], + 18: [7, 12, 18, 24, 30, 36, 42, 48, 55, 61, 67, 74, 80, 86, 93, 99], + 19: [7, 13, 19, 25, 32, 38, 45, 52, 58, 65, 72, 78, 85, 92, 99, 106, 113], + 20: [ + 8, 14, 20, 27, 34, 41, 48, 55, 62, 69, 76, 83, 90, 98, 105, 112, 119, 127, + ], + 21: [ + 8, 15, 22, 29, 36, 43, 50, 58, 65, 73, 80, 88, 96, 103, 111, 119, 126, + 134, 142, + ], + 22: [ + 9, 16, 23, 30, 38, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, + 141, 150, 158, + ], + 23: [ + 9, 17, 24, 32, 40, 48, 56, 64, 73, 81, 89, 98, 106, 115, 123, 132, 140, + 149, 157, 166, 175, + ], + 24: [ + 10, 17, 25, 33, 42, 50, 59, 67, 76, 85, 94, 102, 111, 120, 129, 138, 147, + 156, 165, 174, 183, 192, + ], + 25: [ + 10, 18, 27, 35, 44, 53, 62, 71, 80, 89, 98, 107, 117, 126, 135, 145, 154, + 163, 173, 182, 192, 201, 211, + ], + 26: [ + 11, 19, 28, 37, 46, 55, 64, 74, 83, 93, 102, 112, 122, 132, 141, 151, 161, + 171, 181, 191, 200, 210, 220, 230, + ], + 27: [ + 11, 20, 29, 38, 48, 57, 67, 77, 87, 97, 107, 118, 125, 138, 147, 158, 168, + 178, 188, 199, 209, 219, 230, 240, 250, + ], + 28: [ + 12, 21, 30, 40, 50, 60, 70, 80, 90, 101, 111, 122, 132, 143, 154, 164, + 175, 186, 196, 207, 218, 228, 239, 250, 261, 272, + ], + 29: [ + 13, 22, 32, 42, 52, 62, 73, 83, 94, 105, 116, 127, 138, 149, 160, 171, + 182, 193, 204, 215, 226, 238, 249, 260, 271, 282, 294, + ], + 30: [ + 13, 23, 33, 43, 54, 65, 76, 87, 98, 109, 120, 131, 143, 154, 166, 177, + 189, 200, 212, 223, 235, 247, 258, 270, 282, 293, 305, 317, + ], }; /*--------------------------------------------------------------------------*/ @@ -108,7 +180,7 @@ module.exports = (function() { */ function runInContext(context) { // Exit early if unable to acquire lodash. - var _ = context && context._ || require('lodash') || root._; + var _ = (context && context._) || require('lodash') || root._; if (!_) { Benchmark.runInContext = runInContext; return Benchmark; @@ -117,36 +189,38 @@ module.exports = (function() { // after built-in constructors like `Object`, for the creation of literals. // ES5 clears this up by stating that literals must use built-in constructors. // See http://es5.github.io/#x11.1.5. - context = context ? _.defaults(root.Object(), context, _.pick(root, contextProps)) : root; + context = context + ? _.defaults(root.Object(), context, _.pick(root, contextProps)) + : root; /** Native constructor references. */ var Array = context.Array, - Date = context.Date, - Function = context.Function, - Math = context.Math, - Object = context.Object, - RegExp = context.RegExp, - String = context.String; + Date = context.Date, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String; /** Used for `Array` and `Object` method references. */ var arrayRef = [], - objectProto = Object.prototype; + objectProto = Object.prototype; /** Native method shortcuts. */ var abs = Math.abs, - clearTimeout = context.clearTimeout, - floor = Math.floor, - log = Math.log, - max = Math.max, - min = Math.min, - pow = Math.pow, - push = arrayRef.push, - setTimeout = context.setTimeout, - shift = arrayRef.shift, - slice = arrayRef.slice, - sqrt = Math.sqrt, - toString = objectProto.toString, - unshift = arrayRef.unshift; + clearTimeout = context.clearTimeout, + floor = Math.floor, + log = Math.log, + max = Math.max, + min = Math.min, + pow = Math.pow, + push = arrayRef.push, + setTimeout = context.setTimeout, + shift = arrayRef.shift, + slice = arrayRef.slice, + sqrt = Math.sqrt, + toString = objectProto.toString, + unshift = arrayRef.unshift; /** Detect DOM document object. */ var doc = isHostType(context, 'document') && context.document; @@ -172,15 +246,17 @@ module.exports = (function() { */ var support = {}; - (function() { - + (function () { /** * Detect if running in a browser environment. * * @memberOf Benchmark.support * @type boolean */ - support.browser = doc && isHostType(context, 'navigator') && !isHostType(context, 'phantom'); + support.browser = + doc && + isHostType(context, 'navigator') && + !isHostType(context, 'phantom'); /** * Detect if the Timers API exists. @@ -188,7 +264,9 @@ module.exports = (function() { * @memberOf Benchmark.support * @type boolean */ - support.timeout = isHostType(context, 'setTimeout') && isHostType(context, 'clearTimeout'); + support.timeout = + isHostType(context, 'setTimeout') && + isHostType(context, 'clearTimeout'); /** * Detect if function decompilation is support. @@ -202,15 +280,22 @@ module.exports = (function() { // See http://webk.it/11609 for more details. // Firefox 3.6 and Opera 9.25 strip grouping parentheses from `Function#toString` results. // See http://bugzil.la/559438 for more details. - support.decompilation = Function( - ('return (' + (function(x) { return { 'x': '' + (1 + x) + '', 'y': 0 }; }) + ')') - // Avoid issues with code added by Istanbul. - .replace(/__cov__[^;]+;/g, '') - )()(0).x === '1'; - } catch(e) { + support.decompilation = + Function( + ( + 'return (' + + function (x) { + return { x: '' + (1 + x) + '', y: 0 }; + } + + ')' + ) + // Avoid issues with code added by Istanbul. + .replace(/__cov__[^;]+;/g, ''), + )()(0).x === '1'; + } catch (e) { support.decompilation = false; } - }()); + })(); /** * Timer object used by `clock()` and `Deferred#resolve`. @@ -219,7 +304,6 @@ module.exports = (function() { * @type Object */ var timer = { - /** * The timer namespace object or constructor. * @@ -227,7 +311,7 @@ module.exports = (function() { * @memberOf timer * @type {Function|Object} */ - 'ns': Date, + ns: Date, /** * Starts the deferred timer. @@ -236,7 +320,7 @@ module.exports = (function() { * @memberOf timer * @param {Object} deferred The deferred instance. */ - 'start': null, // Lazy defined in `clock()`. + start: null, // Lazy defined in `clock()`. /** * Stops the deferred timer. @@ -245,7 +329,7 @@ module.exports = (function() { * @memberOf timer * @param {Object} deferred The deferred instance. */ - 'stop': null // Lazy defined in `clock()`. + stop: null, // Lazy defined in `clock()`. }; /*------------------------------------------------------------------------*/ @@ -342,19 +426,16 @@ module.exports = (function() { if (_.isPlainObject(name)) { // 1 argument (options). options = name; - } - else if (_.isFunction(name)) { + } else if (_.isFunction(name)) { // 2 arguments (fn, options). options = fn; fn = name; - } - else if (_.isPlainObject(fn)) { + } else if (_.isPlainObject(fn)) { // 2 arguments (name, options). options = fn; fn = null; bench.name = name; - } - else { + } else { // 3 arguments (name, fn [, options]). bench.name = name; } @@ -395,8 +476,12 @@ module.exports = (function() { if (type instanceof Event) { return type; } - return (event instanceof Event) - ? _.assign(event, { 'timeStamp': _.now() }, typeof type == 'string' ? { 'type': type } : type) + return event instanceof Event + ? _.assign( + event, + { timeStamp: _.now() }, + typeof type == 'string' ? { type: type } : type, + ) : new Event(type); } @@ -470,9 +555,9 @@ module.exports = (function() { * @param {*} value The value to clone. * @returns {*} The cloned value. */ - var cloneDeep = _.partial(_.cloneDeepWith, _, function(value) { + var cloneDeep = _.partial(_.cloneDeepWith, _, function (value) { // Only clone primitives, arrays, and plain objects. - return (_.isObject(value) && !_.isArray(value) && !_.isPlainObject(value)) + return _.isObject(value) && !_.isArray(value) && !_.isPlainObject(value) ? value : undefined; }); @@ -487,19 +572,31 @@ module.exports = (function() { */ function createFunction() { // Lazy define. - createFunction = function(args, body) { + createFunction = function (args, body) { var result, - anchor = freeDefine ? freeDefine.amd : Benchmark, - prop = uid + 'createFunction'; - - runScript((freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '=function(' + args + '){' + body + '}'); + anchor = freeDefine ? freeDefine.amd : Benchmark, + prop = uid + 'createFunction'; + + runScript( + (freeDefine ? 'define.amd.' : 'Benchmark.') + + prop + + '=function(' + + args + + '){' + + body + + '}', + ); result = anchor[prop]; delete anchor[prop]; return result; }; // Fix JaegerMonkey bug. // For more information see http://bugzil.la/639720. - createFunction = support.browser && (createFunction('', 'return"' + uid + '"') || _.noop)() == uid ? createFunction : Function; + createFunction = + support.browser && + (createFunction('', 'return"' + uid + '"') || _.noop)() == uid + ? createFunction + : Function; return createFunction.apply(null, arguments); } @@ -533,8 +630,11 @@ module.exports = (function() { * @returns {string} The argument name. */ function getFirstArgument(fn) { - return (!_.has(fn, 'toString') && - (/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(fn) || 0)[1]) || ''; + return ( + (!_.has(fn, 'toString') && + (/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(fn) || 0)[1]) || + '' + ); } /** @@ -545,9 +645,11 @@ module.exports = (function() { * @returns {number} The mean. */ function getMean(sample) { - return (_.reduce(sample, function(sum, x) { - return sum + x; - }) / sample.length) || 0; + return ( + _.reduce(sample, function (sum, x) { + return sum + x; + }) / sample.length || 0 + ); } /** @@ -569,7 +671,9 @@ module.exports = (function() { result = (result || '').replace(/^\s+|\s+$/g, ''); // Detect strings containing only the "use strict" directive. - return /^(?:\/\*+[\w\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test(result) + return /^(?:\/\*+[\w\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test( + result, + ) ? '' : result; } @@ -601,7 +705,9 @@ module.exports = (function() { return false; } var type = typeof object[property]; - return !rePrimitive.test(type) && (type != 'object' || !!object[property]); + return ( + !rePrimitive.test(type) && (type != 'object' || !!object[property]) + ); } /** @@ -612,7 +718,10 @@ module.exports = (function() { * @returns {boolean} Returns `true` if the value can be coerced, else `false`. */ function isStringable(value) { - return _.isString(value) || (_.has(value, 'toString') && _.isFunction(value.toString)); + return ( + _.isString(value) || + (_.has(value, 'toString') && _.isFunction(value.toString)) + ); } /** @@ -623,11 +732,15 @@ module.exports = (function() { */ function runScript(code) { var anchor = freeDefine ? define.amd : Benchmark, - script = doc.createElement('script'), - sibling = doc.getElementsByTagName('script')[0], - parent = sibling.parentNode, - prop = uid + 'runScript', - prefix = '(' + (freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '||function(){})();'; + script = doc.createElement('script'), + sibling = doc.getElementsByTagName('script')[0], + parent = sibling.parentNode, + prop = uid + 'runScript', + prefix = + '(' + + (freeDefine ? 'define.amd.' : 'Benchmark.') + + prop + + '||function(){})();'; // Firefox 2.0.0.2 cannot use script injection as intended because it executes // asynchronously, but that's OK because script injection is only used to avoid @@ -636,8 +749,10 @@ module.exports = (function() { // Remove the inserted script *before* running the code to avoid differences // in the expected script element count/order of the document. script.appendChild(doc.createTextNode(prefix + code)); - anchor[prop] = function() { destroyElement(script); }; - } catch(e) { + anchor[prop] = function () { + destroyElement(script); + }; + } catch (e) { parent = parent.cloneNode(false); sibling = null; script.text = code; @@ -654,13 +769,17 @@ module.exports = (function() { * @param {Object} [options={}] Options object. */ function setOptions(object, options) { - options = object.options = _.assign({}, cloneDeep(object.constructor.options), cloneDeep(options)); + options = object.options = _.assign( + {}, + cloneDeep(object.constructor.options), + cloneDeep(options), + ); - _.forOwn(options, function(value, key) { + _.forOwn(options, function (value, key) { if (value != null) { // Add event listeners. if (/^on[A-Z]/.test(key)) { - _.each(key.split(' '), function(key) { + _.each(key.split(' '), function (key) { object.on(key.slice(2).toLowerCase(), value); }); } else if (!_.has(object, key)) { @@ -679,22 +798,22 @@ module.exports = (function() { */ function resolve() { var deferred = this, - clone = deferred.benchmark, - bench = clone._original; + clone = deferred.benchmark, + bench = clone._original; if (bench.aborted) { // cycle() -> clone cycle/complete event -> compute()'s invoked bench.run() cycle/complete. deferred.teardown(); clone.running = false; cycle(deferred); - } - else if (++deferred.cycles < clone.count) { + } else if (++deferred.cycles < clone.count) { clone.compiled.call(deferred, context, timer); - } - else { + } else { timer.stop(deferred); deferred.teardown(); - delay(clone, function() { cycle(deferred); }); + delay(clone, function () { + cycle(deferred); + }); } } @@ -727,18 +846,21 @@ module.exports = (function() { function filter(array, callback) { if (callback === 'successful') { // Callback to exclude those that are errored, unrun, or have hz of Infinity. - callback = function(bench) { + callback = function (bench) { return bench.cycles && _.isFinite(bench.hz) && !bench.error; }; - } - else if (callback === 'fastest' || callback === 'slowest') { + } else if (callback === 'fastest' || callback === 'slowest') { // Get successful, sort by period + margin of error, and filter fastest/slowest. - var result = filter(array, 'successful').sort(function(a, b) { - a = a.stats; b = b.stats; - return (a.mean + a.moe > b.mean + b.moe ? 1 : -1) * (callback === 'fastest' ? 1 : -1); + var result = filter(array, 'successful').sort(function (a, b) { + a = a.stats; + b = b.stats; + return ( + (a.mean + a.moe > b.mean + b.moe ? 1 : -1) * + (callback === 'fastest' ? 1 : -1) + ); }); - return _.filter(result, function(bench) { + return _.filter(result, function (bench) { return result[0].compare(bench) == 0; }); } @@ -755,8 +877,10 @@ module.exports = (function() { */ function formatNumber(number) { number = String(number).split('.'); - return number[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') + - (number[1] ? '.' + number[1] : ''); + return ( + number[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') + + (number[1] ? '.' + number[1] : '') + ); } /** @@ -800,19 +924,19 @@ module.exports = (function() { */ function invoke(benches, name) { var args, - bench, - queued, - index = -1, - eventProps = { 'currentTarget': benches }, - options = { 'onStart': _.noop, 'onCycle': _.noop, 'onComplete': _.noop }, - result = _.toArray(benches); + bench, + queued, + index = -1, + eventProps = { currentTarget: benches }, + options = { onStart: _.noop, onCycle: _.noop, onComplete: _.noop }, + result = _.toArray(benches); /** * Invokes the method of the current object and if synchronous, fetches the next. */ function execute() { var listeners, - async = isAsync(bench); + async = isAsync(bench); if (async) { // Use `getNext` as the first listener. @@ -821,7 +945,9 @@ module.exports = (function() { listeners.splice(0, 0, listeners.pop()); } // Execute method. - result[index] = _.isFunction(bench && bench[name]) ? bench[name].apply(bench, args) : undefined; + result[index] = _.isFunction(bench && bench[name]) + ? bench[name].apply(bench, args) + : undefined; // If synchronous return `true` until finished. return !async && getNext(); } @@ -831,8 +957,8 @@ module.exports = (function() { */ function getNext(event) { var cycleEvent, - last = bench, - async = isAsync(last); + last = bench, + async = isAsync(last); if (async) { last.off('complete', getNext); @@ -849,12 +975,10 @@ module.exports = (function() { bench = queued ? benches[0] : result[index]; if (isAsync(bench)) { delay(bench, execute); - } - else if (async) { + } else if (async) { // Resume execution if previously asynchronous but now synchronous. while (execute()) {} - } - else { + } else { // Continue synchronous execution. return true; } @@ -879,8 +1003,13 @@ module.exports = (function() { function isAsync(object) { // Avoid using `instanceof` here because of IE memory leak issues with host objects. var async = args[0] && args[0].async; - return name == 'run' && (object instanceof Benchmark) && - ((async == null ? object.options.async : async) && support.timeout || object.defer); + return ( + name == 'run' && + object instanceof Benchmark && + (((async == null ? object.options.async : async) && + support.timeout) || + object.defer) + ); } /** @@ -906,7 +1035,9 @@ module.exports = (function() { // 2 arguments (array, options). options = _.assign(options, name); name = options.name; - args = _.isArray(args = 'args' in options ? options.args : []) ? args : [args]; + args = _.isArray((args = 'args' in options ? options.args : [])) + ? args + : [args]; queued = options.queued; } // Start iterating over the array. @@ -918,7 +1049,7 @@ module.exports = (function() { options.onStart.call(benches, Event(eventProps)); // End early if the suite was aborted in an "onStart" listener. - if (name == 'run' && (benches instanceof Suite) && benches.aborted) { + if (name == 'run' && benches instanceof Suite && benches.aborted) { // Emit "cycle" event. eventProps.type = 'cycle'; options.onCycle.call(benches, Event(eventProps)); @@ -950,11 +1081,11 @@ module.exports = (function() { */ function join(object, separator1, separator2) { var result = [], - length = (object = Object(object)).length, - arrayLike = length === length >>> 0; + length = (object = Object(object)).length, + arrayLike = length === length >>> 0; separator2 || (separator2 = ': '); - _.each(object, function(value, key) { + _.each(object, function (value, key) { result.push(arrayLike ? value : key + separator2 + value); }); return result.join(separator1 || ','); @@ -971,8 +1102,8 @@ module.exports = (function() { */ function abortSuite() { var event, - suite = this, - resetting = calledBy.resetSuite; + suite = this, + resetting = calledBy.resetSuite; if (suite.running) { event = Event('abort'); @@ -1031,10 +1162,10 @@ module.exports = (function() { */ function add(name, fn, options) { var suite = this, - bench = new Benchmark(name, fn, options), - event = Event({ 'type': 'add', 'target': bench }); + bench = new Benchmark(name, fn, options), + event = Event({ type: 'add', target: bench }); - if (suite.emit(event), !event.cancelled) { + if ((suite.emit(event), !event.cancelled)) { suite.push(bench); } return suite; @@ -1050,14 +1181,15 @@ module.exports = (function() { */ function cloneSuite(options) { var suite = this, - result = new suite.constructor(_.assign({}, suite.options, options)); + result = new suite.constructor(_.assign({}, suite.options, options)); // Copy own properties. - _.forOwn(suite, function(value, key) { + _.forOwn(suite, function (value, key) { if (!_.has(result, key)) { - result[key] = value && _.isFunction(value.clone) - ? value.clone() - : cloneDeep(value); + result[key] = + value && _.isFunction(value.clone) + ? value.clone() + : cloneDeep(value); } }); return result; @@ -1073,7 +1205,7 @@ module.exports = (function() { */ function filterSuite(callback) { var suite = this, - result = new suite.constructor(suite.options); + result = new suite.constructor(suite.options); result.push.apply(result, filter(suite, callback)); return result; @@ -1088,8 +1220,8 @@ module.exports = (function() { */ function resetSuite() { var event, - suite = this, - aborting = calledBy.abortSuite; + suite = this, + aborting = calledBy.abortSuite; if (suite.running && !aborting) { // No worries, `resetSuite()` is called within `abortSuite()`. @@ -1098,8 +1230,10 @@ module.exports = (function() { delete calledBy.resetSuite; } // Reset if the state has changed. - else if ((suite.aborted || suite.running) && - (suite.emit(event = Event('reset')), !event.cancelled)) { + else if ( + (suite.aborted || suite.running) && + (suite.emit((event = Event('reset'))), !event.cancelled) + ) { suite.aborted = suite.running = false; if (!aborting) { invoke(suite, 'reset'); @@ -1131,24 +1265,24 @@ module.exports = (function() { options || (options = {}); invoke(suite, { - 'name': 'run', - 'args': options, - 'queued': options.queued, - 'onStart': function(event) { + name: 'run', + args: options, + queued: options.queued, + onStart: function (event) { suite.emit(event); }, - 'onCycle': function(event) { + onCycle: function (event) { var bench = event.target; if (bench.error) { - suite.emit({ 'type': 'error', 'target': bench }); + suite.emit({ type: 'error', target: bench }); } suite.emit(event); event.aborted = suite.aborted; }, - 'onComplete': function(event) { + onComplete: function (event) { suite.running = false; suite.emit(event); - } + }, }); return suite; } @@ -1165,17 +1299,20 @@ module.exports = (function() { */ function emit(type) { var listeners, - object = this, - event = Event(type), - events = object.events, - args = (arguments[0] = event, arguments); + object = this, + event = Event(type), + events = object.events, + args = ((arguments[0] = event), arguments); event.currentTarget || (event.currentTarget = object); event.target || (event.target = object); delete event.result; - if (events && (listeners = _.has(events, event.type) && events[event.type])) { - _.each(listeners.slice(), function(listener) { + if ( + events && + (listeners = _.has(events, event.type) && events[event.type]) + ) { + _.each(listeners.slice(), function (listener) { if ((event.result = listener.apply(object, args)) === false) { event.cancelled = true; } @@ -1195,7 +1332,7 @@ module.exports = (function() { */ function listeners(type) { var object = this, - events = object.events || (object.events = {}); + events = object.events || (object.events = {}); return _.has(events, type) ? events[type] : (events[type] = []); } @@ -1228,12 +1365,12 @@ module.exports = (function() { */ function off(type, listener) { var object = this, - events = object.events; + events = object.events; if (!events) { return object; } - _.each(type ? type.split(' ') : events, function(listeners, type) { + _.each(type ? type.split(' ') : events, function (listeners, type) { var index; if (typeof listeners == 'string') { type = listeners; @@ -1270,13 +1407,12 @@ module.exports = (function() { */ function on(type, listener) { var object = this, - events = object.events || (object.events = {}); + events = object.events || (object.events = {}); - _.each(type.split(' '), function(type) { - (_.has(events, type) - ? events[type] - : (events[type] = []) - ).push(listener); + _.each(type.split(' '), function (type) { + (_.has(events, type) ? events[type] : (events[type] = [])).push( + listener, + ); }); return object; } @@ -1291,8 +1427,8 @@ module.exports = (function() { */ function abort() { var event, - bench = this, - resetting = calledBy.reset; + bench = this, + resetting = calledBy.reset; if (bench.running) { event = Event('abort'); @@ -1330,13 +1466,17 @@ module.exports = (function() { */ function clone(options) { var bench = this, - result = new bench.constructor(_.assign({}, bench, options)); + result = new bench.constructor(_.assign({}, bench, options)); // Correct the `options` object. - result.options = _.assign({}, cloneDeep(bench.options), cloneDeep(options)); + result.options = _.assign( + {}, + cloneDeep(bench.options), + cloneDeep(options), + ); // Copy own custom properties. - _.forOwn(bench, function(value, key) { + _.forOwn(bench, function (value, key) { if (!_.has(result, key)) { result[key] = cloneDeep(value); } @@ -1360,31 +1500,42 @@ module.exports = (function() { return 0; } var critical, - zStat, - sample1 = bench.stats.sample, - sample2 = other.stats.sample, - size1 = sample1.length, - size2 = sample2.length, - maxSize = max(size1, size2), - minSize = min(size1, size2), - u1 = getU(sample1, sample2), - u2 = getU(sample2, sample1), - u = min(u1, u2); + zStat, + sample1 = bench.stats.sample, + sample2 = other.stats.sample, + size1 = sample1.length, + size2 = sample2.length, + maxSize = max(size1, size2), + minSize = min(size1, size2), + u1 = getU(sample1, sample2), + u2 = getU(sample2, sample1), + u = min(u1, u2); function getScore(xA, sampleB) { - return _.reduce(sampleB, function(total, xB) { - return total + (xB > xA ? 0 : xB < xA ? 1 : 0.5); - }, 0); + return _.reduce( + sampleB, + function (total, xB) { + return total + (xB > xA ? 0 : xB < xA ? 1 : 0.5); + }, + 0, + ); } function getU(sampleA, sampleB) { - return _.reduce(sampleA, function(total, xA) { - return total + getScore(xA, sampleB); - }, 0); + return _.reduce( + sampleA, + function (total, xA) { + return total + getScore(xA, sampleB); + }, + 0, + ); } function getZ(u) { - return (u - ((size1 * size2) / 2)) / sqrt((size1 * size2 * (size1 + size2 + 1)) / 12); + return ( + (u - (size1 * size2) / 2) / + sqrt((size1 * size2 * (size1 + size2 + 1)) / 12) + ); } // Reject the null hypothesis the two samples come from the // same population (i.e. have the same median) if... @@ -1415,22 +1566,26 @@ module.exports = (function() { return bench; } var event, - index = 0, - changes = [], - queue = []; + index = 0, + changes = [], + queue = []; // A non-recursive solution to check if properties have changed. // For more information see http://www.jslab.dk/articles/non.recursive.preorder.traversal.part4. var data = { - 'destination': bench, - 'source': _.assign({}, cloneDeep(bench.constructor.prototype), cloneDeep(bench.options)) + destination: bench, + source: _.assign( + {}, + cloneDeep(bench.constructor.prototype), + cloneDeep(bench.options), + ), }; do { - _.forOwn(data.source, function(value, key) { + _.forOwn(data.source, function (value, key) { var changed, - destination = data.destination, - currValue = destination[key]; + destination = data.destination, + currValue = destination[key]; // Skip pseudo private properties like `_timerId` which could be a // Java object in environments like RingoJS. @@ -1455,21 +1610,30 @@ module.exports = (function() { } // Register a changed object. if (changed) { - changes.push({ 'destination': destination, 'key': key, 'value': currValue }); + changes.push({ + destination: destination, + key: key, + value: currValue, + }); } - queue.push({ 'destination': currValue, 'source': value }); + queue.push({ destination: currValue, source: value }); } // Register a changed primitive. - else if (value !== currValue && !(value == null || _.isFunction(value))) { - changes.push({ 'destination': destination, 'key': key, 'value': value }); + else if ( + value !== currValue && + !(value == null || _.isFunction(value)) + ) { + changes.push({ destination: destination, key: key, value: value }); } }); - } - while ((data = queue[index++])); + } while ((data = queue[index++])); // If changed emit the `reset` event and if it isn't cancelled reset the benchmark. - if (changes.length && (bench.emit(event = Event('reset')), !event.cancelled)) { - _.each(changes, function(data) { + if ( + changes.length && + (bench.emit((event = Event('reset'))), !event.cancelled) + ) { + _.each(changes, function (data) { data.destination[data.key] = data.value; }); } @@ -1485,13 +1649,13 @@ module.exports = (function() { */ function toStringBench() { var bench = this, - error = bench.error, - hz = bench.hz, - id = bench.id, - stats = bench.stats, - size = stats.sample.length, - pm = '\xb1', - result = bench.name || (_.isNaN(id) ? id : ''); + error = bench.error, + hz = bench.hz, + id = bench.id, + stats = bench.stats, + size = stats.sample.length, + pm = '\xb1', + result = bench.name || (_.isNaN(id) ? id : ''); if (error) { var errorStr; @@ -1501,13 +1665,23 @@ module.exports = (function() { errorStr = join(error); } else { // Error#name and Error#message properties are non-enumerable. - errorStr = join(_.assign({ 'name': error.name, 'message': error.message }, error)); + errorStr = join( + _.assign({ name: error.name, message: error.message }, error), + ); } result += ': ' + errorStr; - } - else { - result += ' x ' + formatNumber(hz.toFixed(hz < 100 ? 2 : 0)) + ' ops/sec ' + pm + - stats.rme.toFixed(2) + '% (' + size + ' run' + (size == 1 ? '' : 's') + ' sampled)'; + } else { + result += + ' x ' + + formatNumber(hz.toFixed(hz < 100 ? 2 : 0)) + + ' ops/sec ' + + pm + + stats.rme.toFixed(2) + + '% (' + + size + + ' run' + + (size == 1 ? '' : 's') + + ' sampled)'; } return result; } @@ -1523,11 +1697,11 @@ module.exports = (function() { */ function clock() { var options = Benchmark.options, - templateData = {}, - timers = [{ 'ns': timer.ns, 'res': max(0.0015, getRes('ms')), 'unit': 'ms' }]; + templateData = {}, + timers = [{ ns: timer.ns, res: max(0.0015, getRes('ms')), unit: 'ms' }]; // Lazy define for hi-res timers. - clock = function(clone) { + clock = function (clone) { var deferred; if (clone instanceof Deferred) { @@ -1535,15 +1709,21 @@ module.exports = (function() { clone = deferred.benchmark; } var bench = clone._original, - stringable = isStringable(bench.fn), - count = bench.count = clone.count, - decompilable = stringable || (support.decompilation && (clone.setup !== _.noop || clone.teardown !== _.noop)), - id = bench.id, - name = bench.name || (typeof id == 'number' ? '' : id), - result = 0; + stringable = isStringable(bench.fn), + count = (bench.count = clone.count), + decompilable = + stringable || + (support.decompilation && + (clone.setup !== _.noop || clone.teardown !== _.noop)), + id = bench.id, + name = + bench.name || (typeof id == 'number' ? '' : id), + result = 0; // Init `minTime` if needed. - clone.minTime = bench.minTime || (bench.minTime = bench.options.minTime = options.minTime); + clone.minTime = + bench.minTime || + (bench.minTime = bench.options.minTime = options.minTime); // Compile in setup/teardown functions and the test loop. // Create a new compiled test, instead of using the cached `bench.compiled`, @@ -1562,38 +1742,46 @@ module.exports = (function() { 't#.start(d#);' + // and then execute `deferred.fn` and return a dummy object. '}d#.fn();return{uid:"${uid}"}' - : 'var r#,s#,m#=this,f#=m#.fn,i#=m#.count,n#=t#.ns;${setup}\n${begin};' + 'while(i#--){${fn}\n}${end};${teardown}\nreturn{elapsed:r#,uid:"${uid}"}'; - var compiled = bench.compiled = clone.compiled = createCompiled(bench, decompilable, deferred, funcBody), - isEmpty = !(templateData.fn || stringable); + var compiled = + (bench.compiled = + clone.compiled = + createCompiled(bench, decompilable, deferred, funcBody)), + isEmpty = !(templateData.fn || stringable); try { if (isEmpty) { // Firefox may remove dead code from `Function#toString` results. // For more information see http://bugzil.la/536085. - throw new Error('The test "' + name + '" is empty. This may be the result of dead code removal.'); - } - else if (!deferred) { + throw new Error( + 'The test "' + + name + + '" is empty. This may be the result of dead code removal.', + ); + } else if (!deferred) { // Pretest to determine if compiled code exits early, usually by a // rogue `return` statement, by checking for a return object with the uid. bench.count = 1; - compiled = decompilable && (compiled.call(bench, context, timer) || {}).uid == templateData.uid && compiled; + compiled = + decompilable && + (compiled.call(bench, context, timer) || {}).uid == + templateData.uid && + compiled; bench.count = count; } - } catch(e) { + } catch (e) { compiled = null; clone.error = e || new Error(String(e)); bench.count = count; } // Fallback when a test exits early or errors during pretest. if (!compiled && !deferred && !isEmpty) { - funcBody = ( - stringable || (decompilable && !clone.error) + funcBody = + (stringable || (decompilable && !clone.error) ? 'function f#(){${fn}\n}var r#,s#,m#=this,i#=m#.count' - : 'var r#,s#,m#=this,f#=m#.fn,i#=m#.count' - ) + + : 'var r#,s#,m#=this,f#=m#.fn,i#=m#.count') + ',n#=t#.ns;${setup}\n${begin};m#.f#=f#;while(i#--){m#.f#()}${end};' + 'delete m#.f#;${teardown}\nreturn{elapsed:r#}'; @@ -1605,8 +1793,7 @@ module.exports = (function() { compiled.call(bench, context, timer); bench.count = count; delete clone.error; - } - catch(e) { + } catch (e) { bench.count = count; if (!clone.error) { clone.error = e || new Error(String(e)); @@ -1615,7 +1802,10 @@ module.exports = (function() { } // If no errors run the full test loop. if (!clone.error) { - compiled = bench.compiled = clone.compiled = createCompiled(bench, decompilable, deferred, funcBody); + compiled = + bench.compiled = + clone.compiled = + createCompiled(bench, decompilable, deferred, funcBody); result = compiled.call(deferred || bench, context, timer).elapsed; } return result; @@ -1628,65 +1818,68 @@ module.exports = (function() { */ function createCompiled(bench, decompilable, deferred, body) { var fn = bench.fn, - fnArg = deferred ? getFirstArgument(fn) || 'deferred' : ''; + fnArg = deferred ? getFirstArgument(fn) || 'deferred' : ''; templateData.uid = uid + uidCounter++; _.assign(templateData, { - 'setup': decompilable ? getSource(bench.setup) : interpolate('m#.setup()'), - 'fn': decompilable ? getSource(fn) : interpolate('m#.fn(' + fnArg + ')'), - 'fnArg': fnArg, - 'teardown': decompilable ? getSource(bench.teardown) : interpolate('m#.teardown()') + setup: decompilable + ? getSource(bench.setup) + : interpolate('m#.setup()'), + fn: decompilable + ? getSource(fn) + : interpolate('m#.fn(' + fnArg + ')'), + fnArg: fnArg, + teardown: decompilable + ? getSource(bench.teardown) + : interpolate('m#.teardown()'), }); // Use API of chosen timer. if (timer.unit == 'ns') { _.assign(templateData, { - 'begin': interpolate('s#=n#()'), - 'end': interpolate('r#=n#(s#);r#=r#[0]+(r#[1]/1e9)') + begin: interpolate('s#=n#()'), + end: interpolate('r#=n#(s#);r#=r#[0]+(r#[1]/1e9)'), }); - } - else if (timer.unit == 'us') { + } else if (timer.unit == 'us') { if (timer.ns.stop) { _.assign(templateData, { - 'begin': interpolate('s#=n#.start()'), - 'end': interpolate('r#=n#.microseconds()/1e6') + begin: interpolate('s#=n#.start()'), + end: interpolate('r#=n#.microseconds()/1e6'), }); } else { _.assign(templateData, { - 'begin': interpolate('s#=n#()'), - 'end': interpolate('r#=(n#()-s#)/1e6') + begin: interpolate('s#=n#()'), + end: interpolate('r#=(n#()-s#)/1e6'), }); } - } - else if (timer.ns.now) { + } else if (timer.ns.now) { _.assign(templateData, { - 'begin': interpolate('s#=n#.now()'), - 'end': interpolate('r#=(n#.now()-s#)/1e3') + begin: interpolate('s#=n#.now()'), + end: interpolate('r#=(n#.now()-s#)/1e3'), }); - } - else { + } else { _.assign(templateData, { - 'begin': interpolate('s#=new n#().getTime()'), - 'end': interpolate('r#=(new n#().getTime()-s#)/1e3') + begin: interpolate('s#=new n#().getTime()'), + end: interpolate('r#=(new n#().getTime()-s#)/1e3'), }); } // Define `timer` methods. timer.start = createFunction( interpolate('o#'), - interpolate('var n#=this.ns,${begin};o#.elapsed=0;o#.timeStamp=s#') + interpolate('var n#=this.ns,${begin};o#.elapsed=0;o#.timeStamp=s#'), ); timer.stop = createFunction( interpolate('o#'), - interpolate('var n#=this.ns,s#=o#.timeStamp,${end};o#.elapsed=r#') + interpolate('var n#=this.ns,s#=o#.timeStamp,${end};o#.elapsed=r#'), ); // Create compiled test. return createFunction( interpolate('window,t#'), 'var global = window, clearTimeout = global.clearTimeout, setTimeout = global.setTimeout;\n' + - interpolate(body) + interpolate(body), ); } @@ -1695,11 +1888,11 @@ module.exports = (function() { */ function getRes(unit) { var measured, - begin, - count = 30, - divisor = 1e3, - ns = timer.ns, - sample = []; + begin, + count = 30, + divisor = 1e3, + ns = timer.ns, + sample = []; // Get average smallest measurable time. while (count--) { @@ -1712,18 +1905,17 @@ module.exports = (function() { begin = ns(); while (!(measured = ns() - begin)) {} } - } - else if (unit == 'ns') { + } else if (unit == 'ns') { divisor = 1e9; - begin = (begin = ns())[0] + (begin[1] / divisor); - while (!(measured = ((measured = ns())[0] + (measured[1] / divisor)) - begin)) {} + begin = (begin = ns())[0] + begin[1] / divisor; + while ( + !(measured = (measured = ns())[0] + measured[1] / divisor - begin) + ) {} divisor = 1; - } - else if (ns.now) { + } else if (ns.now) { begin = ns.now(); while (!(measured = ns.now() - begin)) {} - } - else { + } else { begin = new ns().getTime(); while (!(measured = new ns().getTime() - begin)) {} } @@ -1744,7 +1936,9 @@ module.exports = (function() { */ function interpolate(string) { // Replaces all occurrences of `#` with a unique number and template tokens with content. - return _.template(string.replace(/\#/g, /\d+/.exec(templateData.uid)))(templateData); + return _.template(string.replace(/\#/g, /\d+/.exec(templateData.uid)))( + templateData, + ); } /*----------------------------------------------------------------------*/ @@ -1753,14 +1947,17 @@ module.exports = (function() { // enable benchmarking via the --enable-benchmarking command // line switch in at least Chrome 7 to use chrome.Interval try { - if ((timer.ns = new (context.chrome || context.chromium).Interval)) { - timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' }); + if ((timer.ns = new (context.chrome || context.chromium).Interval())) { + timers.push({ ns: timer.ns, res: getRes('us'), unit: 'us' }); } - } catch(e) {} + } catch (e) {} // Detect Node.js's nanosecond resolution timer available in Node.js >= 0.8. - if (processObject && typeof (timer.ns = processObject.hrtime) == 'function') { - timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' }); + if ( + processObject && + typeof (timer.ns = processObject.hrtime) == 'function' + ) { + timers.push({ ns: timer.ns, res: getRes('ns'), unit: 'ns' }); } // Pick timer with highest resolution. timer = _.minBy(timers, 'res'); @@ -1788,25 +1985,27 @@ module.exports = (function() { options || (options = {}); var async = options.async, - elapsed = 0, - initCount = bench.initCount, - minSamples = bench.minSamples, - queue = [], - sample = bench.stats.sample; + elapsed = 0, + initCount = bench.initCount, + minSamples = bench.minSamples, + queue = [], + sample = bench.stats.sample; /** * Adds a clone to the queue. */ function enqueue() { - queue.push(bench.clone({ - '_original': bench, - 'events': { - 'abort': [update], - 'cycle': [update], - 'error': [update], - 'start': [update] - } - })); + queue.push( + bench.clone({ + _original: bench, + events: { + abort: [update], + cycle: [update], + error: [update], + start: [update], + }, + }), + ); } /** @@ -1814,14 +2013,13 @@ module.exports = (function() { */ function update(event) { var clone = this, - type = event.type; + type = event.type; if (bench.running) { if (type == 'start') { // Note: `clone.minTime` prop is inited in `clock()`. clone.count = bench.initCount; - } - else { + } else { if (type == 'error') { bench.error = clone.error; } @@ -1845,20 +2043,24 @@ module.exports = (function() { */ function evaluate(event) { var critical, - df, - mean, - moe, - rme, - sd, - sem, - variance, - clone = event.target, - done = bench.aborted, - now = _.now(), - size = sample.push(clone.times.period), - maxedOut = size >= minSamples && (elapsed += now - clone.times.timeStamp) / 1e3 > bench.maxTime, - times = bench.times, - varOf = function(sum, x) { return sum + pow(x - mean, 2); }; + df, + mean, + moe, + rme, + sd, + sem, + variance, + clone = event.target, + done = bench.aborted, + now = _.now(), + size = sample.push(clone.times.period), + maxedOut = + size >= minSamples && + (elapsed += now - clone.times.timeStamp) / 1e3 > bench.maxTime, + times = bench.times, + varOf = function (sum, x) { + return sum + pow(x - mean, 2); + }; // Exit early for aborted or unclockable tests. if (done || clone.hz == Infinity) { @@ -1884,12 +2086,12 @@ module.exports = (function() { rme = (moe / mean) * 100 || 0; _.assign(bench.stats, { - 'deviation': sd, - 'mean': mean, - 'moe': moe, - 'rme': rme, - 'sem': sem, - 'variance': variance + deviation: sd, + mean: mean, + moe: moe, + rme: rme, + sem: sem, + variance: variance, }); // Abort the cycle loop when the minimum sample size has been collected @@ -1921,11 +2123,13 @@ module.exports = (function() { // Init queue and begin. enqueue(); invoke(queue, { - 'name': 'run', - 'args': { 'async': async }, - 'queued': true, - 'onCycle': evaluate, - 'onComplete': function() { bench.emit('complete'); } + name: 'run', + args: { async: async }, + queued: true, + onCycle: evaluate, + onComplete: function () { + bench.emit('complete'); + }, }); } @@ -1947,15 +2151,15 @@ module.exports = (function() { clone = clone.benchmark; } var clocked, - cycles, - divisor, - event, - minTime, - period, - async = options.async, - bench = clone._original, - count = clone.count, - times = clone.times; + cycles, + divisor, + event, + minTime, + period, + async = options.async, + bench = clone._original, + count = clone.count, + times = clone.times; // Continue, if not aborted between cycles. if (clone.running) { @@ -2015,12 +2219,13 @@ module.exports = (function() { if (deferred) { clone.compiled.call(deferred, context, timer); } else if (async) { - delay(clone, function() { cycle(clone, options); }); + delay(clone, function () { + cycle(clone, options); + }); } else { cycle(clone); } - } - else { + } else { // Fix TraceMonkey bug associated with clock fallbacks. // For more information see http://bugzil.la/509069. if (support.browser) { @@ -2049,7 +2254,7 @@ module.exports = (function() { */ function run(options) { var bench = this, - event = Event('start'); + event = Event('start'); // Set `running` to `false` so `reset()` won't call `abort()`. bench.running = false; @@ -2061,7 +2266,12 @@ module.exports = (function() { bench.emit(event); if (!event.cancelled) { - options = { 'async': ((options = options && options.async) == null ? bench.async : options) && support.timeout }; + options = { + async: + ((options = options && options.async) == null + ? bench.async + : options) && support.timeout, + }; // For clones created within `compute()`. if (bench._original) { @@ -2088,7 +2298,6 @@ module.exports = (function() { // making it non-writable in the process, unless it is the first property // assigned by for-in loop of `_.assign()`. _.assign(Benchmark, { - /** * The default options copied by benchmark instances. * @@ -2096,8 +2305,7 @@ module.exports = (function() { * @memberOf Benchmark * @type Object */ - 'options': { - + options: { /** * A flag to indicate that benchmark cycles will execute asynchronously * by default. @@ -2105,7 +2313,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type boolean */ - 'async': false, + async: false, /** * A flag to indicate that the benchmark clock is deferred. @@ -2113,14 +2321,14 @@ module.exports = (function() { * @memberOf Benchmark.options * @type boolean */ - 'defer': false, + defer: false, /** * The delay between test cycles (secs). * @memberOf Benchmark.options * @type number */ - 'delay': 0.005, + delay: 0.005, /** * Displayed by `Benchmark#toString` when a `name` is not available @@ -2129,7 +2337,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type string */ - 'id': undefined, + id: undefined, /** * The default number of times to execute a test on a benchmark's first cycle. @@ -2137,7 +2345,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type number */ - 'initCount': 1, + initCount: 1, /** * The maximum time a benchmark is allowed to run before finishing (secs). @@ -2147,7 +2355,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type number */ - 'maxTime': 5, + maxTime: 5, /** * The minimum sample size required to perform statistical analysis. @@ -2155,7 +2363,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type number */ - 'minSamples': 5, + minSamples: 5, /** * The time needed to reduce the percent uncertainty of measurement to 1% (secs). @@ -2163,7 +2371,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type number */ - 'minTime': 0, + minTime: 0, /** * The name of the benchmark. @@ -2171,7 +2379,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type string */ - 'name': undefined, + name: undefined, /** * An event listener called when the benchmark is aborted. @@ -2179,7 +2387,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onAbort': undefined, + onAbort: undefined, /** * An event listener called when the benchmark completes running. @@ -2187,7 +2395,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onComplete': undefined, + onComplete: undefined, /** * An event listener called after each run cycle. @@ -2195,7 +2403,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onCycle': undefined, + onCycle: undefined, /** * An event listener called when a test errors. @@ -2203,7 +2411,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onError': undefined, + onError: undefined, /** * An event listener called when the benchmark is reset. @@ -2211,7 +2419,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onReset': undefined, + onReset: undefined, /** * An event listener called when the benchmark starts running. @@ -2219,7 +2427,7 @@ module.exports = (function() { * @memberOf Benchmark.options * @type Function */ - 'onStart': undefined + onStart: undefined, }, /** @@ -2230,19 +2438,21 @@ module.exports = (function() { * @memberOf Benchmark * @type Object */ - 'platform': context.platform || require('platform') || ({ - 'description': context.navigator && context.navigator.userAgent || null, - 'layout': null, - 'product': null, - 'name': null, - 'manufacturer': null, - 'os': null, - 'prerelease': null, - 'version': null, - 'toString': function() { - return this.description || ''; - } - }), + platform: context.platform || + require('platform') || { + description: + (context.navigator && context.navigator.userAgent) || null, + layout: null, + product: null, + name: null, + manufacturer: null, + os: null, + prerelease: null, + version: null, + toString: function () { + return this.description || ''; + }, + }, /** * The semantic version number. @@ -2251,34 +2461,36 @@ module.exports = (function() { * @memberOf Benchmark * @type string */ - 'version': '2.1.2' + version: '2.1.2', }); _.assign(Benchmark, { - 'filter': filter, - 'formatNumber': formatNumber, - 'invoke': invoke, - 'join': join, - 'runInContext': runInContext, - 'support': support + filter: filter, + formatNumber: formatNumber, + invoke: invoke, + join: join, + runInContext: runInContext, + support: support, }); // Add lodash methods to Benchmark. - _.each(['each', 'forEach', 'forOwn', 'has', 'indexOf', 'map', 'reduce'], function(methodName) { - Benchmark[methodName] = _[methodName]; - }); + _.each( + ['each', 'forEach', 'forOwn', 'has', 'indexOf', 'map', 'reduce'], + function (methodName) { + Benchmark[methodName] = _[methodName]; + }, + ); /*------------------------------------------------------------------------*/ _.assign(Benchmark.prototype, { - /** * The number of times a test was executed. * * @memberOf Benchmark * @type number */ - 'count': 0, + count: 0, /** * The number of cycles performed while benchmarking. @@ -2286,7 +2498,7 @@ module.exports = (function() { * @memberOf Benchmark * @type number */ - 'cycles': 0, + cycles: 0, /** * The number of executions per second. @@ -2294,7 +2506,7 @@ module.exports = (function() { * @memberOf Benchmark * @type number */ - 'hz': 0, + hz: 0, /** * The compiled test function. @@ -2302,7 +2514,7 @@ module.exports = (function() { * @memberOf Benchmark * @type {Function|string} */ - 'compiled': undefined, + compiled: undefined, /** * The error object if the test failed. @@ -2310,7 +2522,7 @@ module.exports = (function() { * @memberOf Benchmark * @type Object */ - 'error': undefined, + error: undefined, /** * The test to benchmark. @@ -2318,7 +2530,7 @@ module.exports = (function() { * @memberOf Benchmark * @type {Function|string} */ - 'fn': undefined, + fn: undefined, /** * A flag to indicate if the benchmark is aborted. @@ -2326,7 +2538,7 @@ module.exports = (function() { * @memberOf Benchmark * @type boolean */ - 'aborted': false, + aborted: false, /** * A flag to indicate if the benchmark is running. @@ -2334,7 +2546,7 @@ module.exports = (function() { * @memberOf Benchmark * @type boolean */ - 'running': false, + running: false, /** * Compiled into the test and executed immediately **before** the test loop. @@ -2397,7 +2609,7 @@ module.exports = (function() { * }()) * }()) */ - 'setup': _.noop, + setup: _.noop, /** * Compiled into the test and executed immediately **after** the test loop. @@ -2405,7 +2617,7 @@ module.exports = (function() { * @memberOf Benchmark * @type {Function|string} */ - 'teardown': _.noop, + teardown: _.noop, /** * An object of stats including mean, margin or error, and standard deviation. @@ -2413,15 +2625,14 @@ module.exports = (function() { * @memberOf Benchmark * @type Object */ - 'stats': { - + stats: { /** * The margin of error. * * @memberOf Benchmark#stats * @type number */ - 'moe': 0, + moe: 0, /** * The relative margin of error (expressed as a percentage of the mean). @@ -2429,7 +2640,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type number */ - 'rme': 0, + rme: 0, /** * The standard error of the mean. @@ -2437,7 +2648,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type number */ - 'sem': 0, + sem: 0, /** * The sample standard deviation. @@ -2445,7 +2656,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type number */ - 'deviation': 0, + deviation: 0, /** * The sample arithmetic mean (secs). @@ -2453,7 +2664,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type number */ - 'mean': 0, + mean: 0, /** * The array of sampled periods. @@ -2461,7 +2672,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type Array */ - 'sample': [], + sample: [], /** * The sample variance. @@ -2469,7 +2680,7 @@ module.exports = (function() { * @memberOf Benchmark#stats * @type number */ - 'variance': 0 + variance: 0, }, /** @@ -2478,15 +2689,14 @@ module.exports = (function() { * @memberOf Benchmark * @type Object */ - 'times': { - + times: { /** * The time taken to complete the last cycle (secs). * * @memberOf Benchmark#times * @type number */ - 'cycle': 0, + cycle: 0, /** * The time taken to complete the benchmark (secs). @@ -2494,7 +2704,7 @@ module.exports = (function() { * @memberOf Benchmark#times * @type number */ - 'elapsed': 0, + elapsed: 0, /** * The time taken to execute the test once (secs). @@ -2502,7 +2712,7 @@ module.exports = (function() { * @memberOf Benchmark#times * @type number */ - 'period': 0, + period: 0, /** * A timestamp of when the benchmark started (ms). @@ -2510,34 +2720,33 @@ module.exports = (function() { * @memberOf Benchmark#times * @type number */ - 'timeStamp': 0 - } + timeStamp: 0, + }, }); _.assign(Benchmark.prototype, { - 'abort': abort, - 'clone': clone, - 'compare': compare, - 'emit': emit, - 'listeners': listeners, - 'off': off, - 'on': on, - 'reset': reset, - 'run': run, - 'toString': toStringBench + abort: abort, + clone: clone, + compare: compare, + emit: emit, + listeners: listeners, + off: off, + on: on, + reset: reset, + run: run, + toString: toStringBench, }); /*------------------------------------------------------------------------*/ _.assign(Deferred.prototype, { - /** * The deferred benchmark instance. * * @memberOf Benchmark.Deferred * @type Object */ - 'benchmark': null, + benchmark: null, /** * The number of deferred cycles performed while benchmarking. @@ -2545,7 +2754,7 @@ module.exports = (function() { * @memberOf Benchmark.Deferred * @type number */ - 'cycles': 0, + cycles: 0, /** * The time taken to complete the deferred benchmark (secs). @@ -2553,7 +2762,7 @@ module.exports = (function() { * @memberOf Benchmark.Deferred * @type number */ - 'elapsed': 0, + elapsed: 0, /** * A timestamp of when the deferred benchmark started (ms). @@ -2561,24 +2770,23 @@ module.exports = (function() { * @memberOf Benchmark.Deferred * @type number */ - 'timeStamp': 0 + timeStamp: 0, }); _.assign(Deferred.prototype, { - 'resolve': resolve + resolve: resolve, }); /*------------------------------------------------------------------------*/ _.assign(Event.prototype, { - /** * A flag to indicate if the emitters listener iteration is aborted. * * @memberOf Benchmark.Event * @type boolean */ - 'aborted': false, + aborted: false, /** * A flag to indicate if the default action is cancelled. @@ -2586,7 +2794,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type boolean */ - 'cancelled': false, + cancelled: false, /** * The object whose listeners are currently being processed. @@ -2594,7 +2802,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type Object */ - 'currentTarget': undefined, + currentTarget: undefined, /** * The return value of the last executed listener. @@ -2602,7 +2810,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type Mixed */ - 'result': undefined, + result: undefined, /** * The object to which the event was originally emitted. @@ -2610,7 +2818,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type Object */ - 'target': undefined, + target: undefined, /** * A timestamp of when the event was created (ms). @@ -2618,7 +2826,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type number */ - 'timeStamp': 0, + timeStamp: 0, /** * The event type. @@ -2626,7 +2834,7 @@ module.exports = (function() { * @memberOf Benchmark.Event * @type string */ - 'type': '' + type: '', }); /*------------------------------------------------------------------------*/ @@ -2639,27 +2847,25 @@ module.exports = (function() { * @type Object */ Suite.options = { - /** * The name of the suite. * * @memberOf Benchmark.Suite.options * @type string */ - 'name': undefined + name: undefined, }; /*------------------------------------------------------------------------*/ _.assign(Suite.prototype, { - /** * The number of benchmarks in the suite. * * @memberOf Benchmark.Suite * @type number */ - 'length': 0, + length: 0, /** * A flag to indicate if the suite is aborted. @@ -2667,7 +2873,7 @@ module.exports = (function() { * @memberOf Benchmark.Suite * @type boolean */ - 'aborted': false, + aborted: false, /** * A flag to indicate if the suite is running. @@ -2675,60 +2881,63 @@ module.exports = (function() { * @memberOf Benchmark.Suite * @type boolean */ - 'running': false + running: false, }); _.assign(Suite.prototype, { - 'abort': abortSuite, - 'add': add, - 'clone': cloneSuite, - 'emit': emit, - 'filter': filterSuite, - 'join': arrayRef.join, - 'listeners': listeners, - 'off': off, - 'on': on, - 'pop': arrayRef.pop, - 'push': push, - 'reset': resetSuite, - 'run': runSuite, - 'reverse': arrayRef.reverse, - 'shift': shift, - 'slice': slice, - 'sort': arrayRef.sort, - 'splice': arrayRef.splice, - 'unshift': unshift + abort: abortSuite, + add: add, + clone: cloneSuite, + emit: emit, + filter: filterSuite, + join: arrayRef.join, + listeners: listeners, + off: off, + on: on, + pop: arrayRef.pop, + push: push, + reset: resetSuite, + run: runSuite, + reverse: arrayRef.reverse, + shift: shift, + slice: slice, + sort: arrayRef.sort, + splice: arrayRef.splice, + unshift: unshift, }); /*------------------------------------------------------------------------*/ // Expose Deferred, Event, and Suite. _.assign(Benchmark, { - 'Deferred': Deferred, - 'Event': Event, - 'Suite': Suite + Deferred: Deferred, + Event: Event, + Suite: Suite, }); /*------------------------------------------------------------------------*/ // Add lodash methods as Suite methods. - _.each(['each', 'forEach', 'indexOf', 'map', 'reduce'], function(methodName) { - var func = _[methodName]; - Suite.prototype[methodName] = function() { - var args = [this]; - push.apply(args, arguments); - return func.apply(_, args); - }; - }); + _.each( + ['each', 'forEach', 'indexOf', 'map', 'reduce'], + function (methodName) { + var func = _[methodName]; + Suite.prototype[methodName] = function () { + var args = [this]; + push.apply(args, arguments); + return func.apply(_, args); + }; + }, + ); // Avoid array-like object bugs with `Array#shift` and `Array#splice` // in Firefox < 10 and IE < 9. - _.each(['pop', 'shift', 'splice'], function(methodName) { + _.each(['pop', 'shift', 'splice'], function (methodName) { var func = arrayRef[methodName]; - Suite.prototype[methodName] = function() { + Suite.prototype[methodName] = function () { var value = this, - result = func.apply(value, arguments); + result = func.apply(value, arguments); if (value.length === 0) { delete value[0]; @@ -2739,7 +2948,7 @@ module.exports = (function() { // Avoid buggy `Array#unshift` in IE < 8 which doesn't return the new // length of the array. - Suite.prototype.unshift = function() { + Suite.prototype.unshift = function () { var value = this; unshift.apply(value, arguments); return value.length; @@ -2755,5 +2964,4 @@ module.exports = (function() { window.Benchmark = Benchmark; return Benchmark; - -}.call(this)); +}.call(this); diff --git a/tgui/packages/tgui-bench/package.json b/tgui/packages/tgui-bench/package.json index 55458d7fa99b..f91396bb3fb8 100644 --- a/tgui/packages/tgui-bench/package.json +++ b/tgui/packages/tgui-bench/package.json @@ -1,15 +1,15 @@ { "private": true, "name": "tgui-bench", - "version": "4.3.0", + "version": "5.0.1", "dependencies": { + "@types/node": "^20.14.1", "common": "workspace:*", - "fastify": "^3.20.2", - "fastify-static": "^4.2.3", - "inferno": "^7.4.8", - "inferno-vnode-flags": "^7.4.8", + "fastify": "^4.27.0", + "fastify-static": "^4.7.0", "lodash": "^4.17.21", "platform": "^1.3.6", + "react": "^18.3.1", "tgui": "workspace:*" } } diff --git a/tgui/packages/tgui-bench/tests/Button.test.tsx b/tgui/packages/tgui-bench/tests/Button.test.tsx index e3472cbbbfae..70e7219d4437 100644 --- a/tgui/packages/tgui-bench/tests/Button.test.tsx +++ b/tgui/packages/tgui-bench/tests/Button.test.tsx @@ -1,4 +1,3 @@ -import { linkEvent } from 'inferno'; import { Button } from 'tgui/components'; import { createRenderer } from 'tgui/renderer'; @@ -7,40 +6,19 @@ const render = createRenderer(); const handleClick = () => undefined; export const SingleButton = () => { - const node = ( - - ); + const node = ; render(node); }; export const SingleButtonWithCallback = () => { - const node = ( - - ); - render(node); -}; - -export const SingleButtonWithLinkEvent = () => { - const node = ( - - ); + const node = ; render(node); }; export const ListOfButtons = () => { const nodes: JSX.Element[] = []; for (let i = 0; i < 100; i++) { - const node = ( - - ); + const node = ; nodes.push(node); } render(
{nodes}
); @@ -59,19 +37,6 @@ export const ListOfButtonsWithCallback = () => { render(
{nodes}
); }; -export const ListOfButtonsWithLinkEvent = () => { - const nodes: JSX.Element[] = []; - for (let i = 0; i < 100; i++) { - const node = ( - - ); - nodes.push(node); - } - render(
{nodes}
); -}; - export const ListOfButtonsWithIcons = () => { const nodes: JSX.Element[] = []; for (let i = 0; i < 100; i++) { diff --git a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx index b588f306f76a..3497c41e8fa0 100644 --- a/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx +++ b/tgui/packages/tgui-bench/tests/DisposalUnit.test.tsx @@ -1,19 +1,19 @@ -import { backendUpdate } from 'tgui/backend'; +import { backendUpdate, setGlobalStore } from 'tgui/backend'; import { DisposalUnit } from 'tgui/interfaces/DisposalUnit'; import { createRenderer } from 'tgui/renderer'; -import { configureStore, StoreProvider } from 'tgui/store'; +import { configureStore } from 'tgui/store'; const store = configureStore({ sideEffets: false }); const renderUi = createRenderer((dataJson: string) => { - store.dispatch(backendUpdate({ - data: Byond.parseJson(dataJson), - })); - return ( - - - + setGlobalStore(store); + + store.dispatch( + backendUpdate({ + data: Byond.parseJson(dataJson), + }), ); + return ; }); export const data = JSON.stringify({ diff --git a/tgui/packages/tgui-bench/tests/Flex.test.tsx b/tgui/packages/tgui-bench/tests/Flex.test.tsx index e81ebc6f611b..66c039a19083 100644 --- a/tgui/packages/tgui-bench/tests/Flex.test.tsx +++ b/tgui/packages/tgui-bench/tests/Flex.test.tsx @@ -6,9 +6,7 @@ const render = createRenderer(); export const Default = () => { const node = ( - - Text {Math.random()} - + Text {Math.random()} Text {Math.random()} diff --git a/tgui/packages/tgui-bench/tests/Stack.test.tsx b/tgui/packages/tgui-bench/tests/Stack.test.tsx index 952dba20294e..ce7f5599e721 100644 --- a/tgui/packages/tgui-bench/tests/Stack.test.tsx +++ b/tgui/packages/tgui-bench/tests/Stack.test.tsx @@ -6,9 +6,7 @@ const render = createRenderer(); export const Default = () => { const node = ( - - Text {Math.random()} - + Text {Math.random()} Text {Math.random()} diff --git a/tgui/packages/tgui-bench/tests/Tooltip.test.tsx b/tgui/packages/tgui-bench/tests/Tooltip.test.tsx index b953fc911d22..9dae16f5c030 100644 --- a/tgui/packages/tgui-bench/tests/Tooltip.test.tsx +++ b/tgui/packages/tgui-bench/tests/Tooltip.test.tsx @@ -1,5 +1,5 @@ -import { Box, Tooltip } from "tgui/components"; -import { createRenderer } from "tgui/renderer"; +import { Box, Tooltip } from 'tgui/components'; +import { createRenderer } from 'tgui/renderer'; const render = createRenderer(); @@ -12,7 +12,7 @@ export const ListOfTooltips = () => { Tooltip #{i} - + , ); } diff --git a/tgui/packages/tgui-dev-server/dreamseeker.js b/tgui/packages/tgui-dev-server/dreamseeker.js index 21ad32e06451..741a7e71960d 100644 --- a/tgui/packages/tgui-dev-server/dreamseeker.js +++ b/tgui/packages/tgui-dev-server/dreamseeker.js @@ -6,6 +6,7 @@ import { exec } from 'child_process'; import { promisify } from 'util'; + import { createLogger } from './logging.js'; import { require } from './require.js'; @@ -25,11 +26,13 @@ export class DreamSeeker { topic(params = {}) { const query = Object.keys(params) - .map(key => encodeURIComponent(key) - + '=' + encodeURIComponent(params[key])) + .map( + (key) => + encodeURIComponent(key) + '=' + encodeURIComponent(params[key]), + ) .join('&'); logger.log( - `topic call at ${this.client.defaults.baseURL + '/dummy?' + query}` + `topic call at ${this.client.defaults.baseURL + '/dummy?' + query}`, ); return this.client.get('/dummy?' + query); } @@ -39,7 +42,7 @@ export class DreamSeeker { * @param {number[]} pids * @returns {DreamSeeker[]} */ -DreamSeeker.getInstancesByPids = async pids => { +DreamSeeker.getInstancesByPids = async (pids) => { if (process.platform !== 'win32') { return []; } @@ -49,8 +52,7 @@ DreamSeeker.getInstancesByPids = async pids => { const instance = instanceByPid.get(pid); if (instance) { instances.push(instance); - } - else { + } else { pidsToResolve.push(pid); } } @@ -86,12 +88,10 @@ DreamSeeker.getInstancesByPids = async pids => { instances.push(instance); instanceByPid.set(pid, instance); } - } - catch (err) { + } catch (err) { if (err.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER') { logger.error(err.message, err.code); - } - else { + } else { logger.error(err); } return []; @@ -100,4 +100,4 @@ DreamSeeker.getInstancesByPids = async pids => { return instances; }; -const plural = (word, n) => n !== 1 ? word + 's' : word; +const plural = (word, n) => (n !== 1 ? word + 's' : word); diff --git a/tgui/packages/tgui-dev-server/index.js b/tgui/packages/tgui-dev-server/index.js index 199e93d83632..85489ebb0499 100644 --- a/tgui/packages/tgui-dev-server/index.js +++ b/tgui/packages/tgui-dev-server/index.js @@ -4,8 +4,8 @@ * @license MIT */ -import { createCompiler } from './webpack.js'; import { reloadByondCache } from './reloader.js'; +import { createCompiler } from './webpack.js'; const noHot = process.argv.includes('--no-hot'); const noTmp = process.argv.includes('--no-tmp'); diff --git a/tgui/packages/tgui-dev-server/link/client.cjs b/tgui/packages/tgui-dev-server/link/client.cjs index fe75314acd3a..a4f703aee68a 100644 --- a/tgui/packages/tgui-dev-server/link/client.cjs +++ b/tgui/packages/tgui-dev-server/link/client.cjs @@ -23,7 +23,7 @@ const ensureConnection = () => { socket.send(msg); } }; - socket.onmessage = event => { + socket.onmessage = (event) => { const msg = JSON.parse(event.data); for (let subscriber of subscribers) { subscriber(msg); @@ -37,14 +37,14 @@ if (process.env.NODE_ENV !== 'production') { window.onunload = () => socket && socket.close(); } -const subscribe = fn => subscribers.push(fn); +const subscribe = (fn) => subscribers.push(fn); /** * A json serializer which handles circular references and other junk. */ -const serializeObject = obj => { +const serializeObject = (obj) => { let refs = []; - const primitiveReviver = value => { + const primitiveReviver = (value) => { if (typeof value === 'number' && !Number.isFinite(value)) { return { __number__: String(value), @@ -68,9 +68,9 @@ const serializeObject = obj => { } refs.push(value); // Error object - const isError = value instanceof Error || ( - value.code && value.message && value.message.includes('Error') - ); + const isError = + value instanceof Error || + (value.code && value.message && value.message.includes('Error')); if (isError) { return { __error__: true, @@ -91,7 +91,7 @@ const serializeObject = obj => { return json; }; -const sendMessage = msg => { +const sendMessage = (msg) => { if (process.env.NODE_ENV !== 'production') { const json = serializeObject(msg); // Send message using WebSocket @@ -99,8 +99,7 @@ const sendMessage = msg => { ensureConnection(); if (socket.readyState === WebSocket.OPEN) { socket.send(json); - } - else { + } else { // Keep only 100 latest messages in the queue if (queue.length > 100) { queue.shift(); @@ -130,19 +129,20 @@ const sendLogEntry = (level, ns, ...args) => { args, }, }); - } - catch (err) {} + } catch (err) {} } }; const setupHotReloading = () => { - if (process.env.NODE_ENV !== 'production' - && process.env.WEBPACK_HMR_ENABLED - && window.WebSocket) { + if ( + process.env.NODE_ENV !== 'production' && + process.env.WEBPACK_HMR_ENABLED && + window.WebSocket + ) { if (module.hot) { ensureConnection(); sendLogEntry(0, null, 'setting up hot reloading'); - subscribe(msg => { + subscribe((msg) => { const { type } = msg; sendLogEntry(0, null, 'received', type); if (type === 'hotUpdate') { @@ -157,10 +157,10 @@ const setupHotReloading = () => { ignoreDeclined: true, ignoreErrored: true, }) - .then(modules => { + .then((modules) => { sendLogEntry(0, null, 'outdated modules', modules); }) - .catch(err => { + .catch((err) => { sendLogEntry(0, null, 'reload error', err); }); } diff --git a/tgui/packages/tgui-dev-server/link/retrace.js b/tgui/packages/tgui-dev-server/link/retrace.js index c10ba9cb173c..083ddb37d1c1 100644 --- a/tgui/packages/tgui-dev-server/link/retrace.js +++ b/tgui/packages/tgui-dev-server/link/retrace.js @@ -6,6 +6,7 @@ import fs from 'fs'; import { basename } from 'path'; + import { createLogger } from '../logging.js'; import { require } from '../require.js'; import { resolveGlob } from '../util.js'; @@ -18,7 +19,7 @@ const logger = createLogger('retrace'); const { SourceMapConsumer } = SourceMap; const sourceMaps = []; -export const loadSourceMaps = async bundleDir => { +export const loadSourceMaps = async (bundleDir) => { // Destroy and garbage collect consumers while (sourceMaps.length !== 0) { const { consumer } = sourceMaps.shift(); @@ -30,29 +31,29 @@ export const loadSourceMaps = async bundleDir => { try { const file = basename(path).replace('.map', ''); const consumer = await new SourceMapConsumer( - JSON.parse(fs.readFileSync(path, 'utf8'))); + JSON.parse(fs.readFileSync(path, 'utf8')), + ); sourceMaps.push({ file, consumer }); - } - catch (err) { + } catch (err) { logger.error(err); } } logger.log(`loaded ${sourceMaps.length} source maps`); }; -export const retrace = stack => { +export const retrace = (stack) => { if (typeof stack !== 'string') { logger.log('ERROR: Stack is not a string!', stack); return stack; } const header = stack.split(/\n\s.*at/)[0]; const mappedStack = parseStackTrace(stack) - .map(frame => { + .map((frame) => { if (!frame.file) { return frame; } // Find the correct source map - const sourceMap = sourceMaps.find(sourceMap => { + const sourceMap = sourceMaps.find((sourceMap) => { return frame.file.includes(sourceMap.file); }); if (!sourceMap) { @@ -72,7 +73,7 @@ export const retrace = stack => { column: mappedFrame.column, }; }) - .map(frame => { + .map((frame) => { // Stringify the frame const { file, methodName, lineNumber } = frame; if (!file) { diff --git a/tgui/packages/tgui-dev-server/link/server.js b/tgui/packages/tgui-dev-server/link/server.js index 87a8a5911bc0..a5d9a225f513 100644 --- a/tgui/packages/tgui-dev-server/link/server.js +++ b/tgui/packages/tgui-dev-server/link/server.js @@ -6,6 +6,7 @@ import http from 'http'; import { inspect } from 'util'; + import { createLogger, directLog } from '../logging.js'; import { require } from '../require.js'; import { loadSourceMaps, retrace } from './retrace.js'; @@ -32,9 +33,9 @@ class LinkServer { setupWebSocketLink() { const port = 3000; this.wss = new WebSocket.Server({ port }); - this.wss.on('connection', ws => { + this.wss.on('connection', (ws) => { logger.log('client connected'); - ws.on('message', json => { + ws.on('message', (json) => { const msg = deserializeObject(json); this.handleLinkMessage(ws, msg); }); @@ -51,7 +52,7 @@ class LinkServer { this.httpServer = http.createServer((req, res) => { if (req.method === 'POST') { let body = ''; - req.on('data', chunk => { + req.on('data', (chunk) => { body += chunk.toString(); }); req.on('end', () => { @@ -76,16 +77,19 @@ class LinkServer { if (level <= 0 && !DEBUG) { return; } - directLog(ns, ...args.map(arg => { - if (typeof arg === 'object') { - return inspect(arg, { - depth: Infinity, - colors: true, - compact: 8, - }); - } - return arg; - })); + directLog( + ns, + ...args.map((arg) => { + if (typeof arg === 'object') { + return inspect(arg, { + depth: Infinity, + colors: true, + compact: 8, + }); + } + return arg; + }), + ); return; } if (type === 'relay') { @@ -117,7 +121,7 @@ class LinkServer { } } -const deserializeObject = str => { +const deserializeObject = (str) => { return JSON.parse(str, (key, value) => { if (typeof value === 'object' && value !== null) { if (value.__undefined__) { diff --git a/tgui/packages/tgui-dev-server/logging.js b/tgui/packages/tgui-dev-server/logging.js index 0dc222ae3d73..143c96b97aba 100644 --- a/tgui/packages/tgui-dev-server/logging.js +++ b/tgui/packages/tgui-dev-server/logging.js @@ -11,8 +11,7 @@ const isNode = process && process.release && process.release.name === 'node'; let isChrome = false; try { isChrome = window.navigator.userAgent.toLowerCase().includes('chrome'); -} -catch {} +} catch {} // Timestamping function const getTimestamp = () => { @@ -32,7 +31,7 @@ const getPrefix = (() => { bright: '\x1b[37;1m', reset: '\x1b[0m', }; - return ns => [ + return (ns) => [ `${ESC.dimmed}${getTimestamp()} ${ESC.bright}${ns}${ESC.reset}`, ]; } @@ -42,21 +41,19 @@ const getPrefix = (() => { dimmed: 'color: #888', bright: 'font-weight: bold', }; - return ns => [ + return (ns) => [ `%c${getTimestamp()}%c ${ns}`, styles.dimmed, styles.bright, ]; } - return ns => [ - `${getTimestamp()} ${ns}`, - ]; + return (ns) => [`${getTimestamp()} ${ns}`]; })(); /** * Creates a logger object. */ -export const createLogger = ns => ({ +export const createLogger = (ns) => ({ log: (...args) => console.log(...getPrefix(ns), ...args), trace: (...args) => console.trace(...getPrefix(ns), ...args), debug: (...args) => console.debug(...getPrefix(ns), ...args), diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json index 8ee0e019ee0a..e9567c9d3219 100644 --- a/tgui/packages/tgui-dev-server/package.json +++ b/tgui/packages/tgui-dev-server/package.json @@ -1,13 +1,13 @@ { "private": true, "name": "tgui-dev-server", - "version": "4.3.0", + "version": "5.0.1", "type": "module", "dependencies": { - "axios": "^0.21.1", - "glob": "^7.1.7", - "source-map": "^0.7.3", + "axios": "^1.7.2", + "glob": "^7.2.3", + "source-map": "^0.7.4", "stacktrace-parser": "^0.1.10", - "ws": "^7.5.3" + "ws": "^8.17.0" } } diff --git a/tgui/packages/tgui-dev-server/reloader.js b/tgui/packages/tgui-dev-server/reloader.js index ef7aee06ed17..f9c1a31a6ca8 100644 --- a/tgui/packages/tgui-dev-server/reloader.js +++ b/tgui/packages/tgui-dev-server/reloader.js @@ -7,6 +7,7 @@ import fs from 'fs'; import os from 'os'; import { basename } from 'path'; + import { DreamSeeker } from './dreamseeker.js'; import { createLogger } from './logging.js'; import { resolveGlob, resolvePath } from './util.js'; @@ -50,14 +51,9 @@ export const findCacheRoot = async () => { // Query the Windows Registry if (process.platform === 'win32') { logger.log('querying windows registry'); - let userpath = await regQuery( - 'HKCU\\Software\\Dantom\\BYOND', - 'userpath'); + let userpath = await regQuery('HKCU\\Software\\Dantom\\BYOND', 'userpath'); if (userpath) { - cacheRoot = userpath - .replace(/\\$/, '') - .replace(/\\/g, '/') - + '/cache'; + cacheRoot = userpath.replace(/\\$/, '').replace(/\\/g, '/') + '/cache'; onCacheRootFound(cacheRoot); return cacheRoot; } @@ -65,11 +61,13 @@ export const findCacheRoot = async () => { logger.log('found no cache directories'); }; -const onCacheRootFound = cacheRoot => { +const onCacheRootFound = (cacheRoot) => { logger.log(`found cache at '${cacheRoot}'`); + // Plant a dummy browser window file, byond 514 stuff. + fs.closeSync(fs.openSync(cacheRoot + '/dummy', 'w')); }; -export const reloadByondCache = async bundleDir => { +export const reloadByondCache = async (bundleDir) => { const cacheRoot = await findCacheRoot(); if (!cacheRoot) { return; @@ -81,18 +79,24 @@ export const reloadByondCache = async bundleDir => { return; } // Get dreamseeker instances - const pids = cacheDirs.map(cacheDir => ( - parseInt(cacheDir.split('/cache/tmp').pop(), 10) - )); + const pids = cacheDirs.map((cacheDir) => + parseInt(cacheDir.split('/cache/tmp').pop(), 10), + ); const dssPromise = DreamSeeker.getInstancesByPids(pids); // Copy assets - const assets = await resolveGlob(bundleDir, './*.+(bundle|chunk|hot-update).*'); + const assets = await resolveGlob( + bundleDir, + './*.+(bundle|chunk|hot-update).*', + ); for (let cacheDir of cacheDirs) { // Clear garbage - const garbage = await resolveGlob(cacheDir, './*.+(bundle|chunk|hot-update).*'); + const garbage = await resolveGlob( + cacheDir, + './*.+(bundle|chunk|hot-update).*', + ); try { // Plant a dummy browser window file - // we'll be using this to avoid world topic + // we'll be using this to avoid world topic for 515 fs.closeSync(fs.openSync(cacheDir + '/dummy', 'w')); for (let file of garbage) { fs.unlinkSync(file); @@ -103,8 +107,7 @@ export const reloadByondCache = async bundleDir => { fs.writeFileSync(destination, fs.readFileSync(asset)); } logger.log(`copied ${assets.length} files to '${cacheDir}'`); - } - catch (err) { + } catch (err) { logger.error(`failed copying to '${cacheDir}'`); logger.error(err); } diff --git a/tgui/packages/tgui-dev-server/util.js b/tgui/packages/tgui-dev-server/util.js index 0fc255ed6744..13fbef3b21b7 100644 --- a/tgui/packages/tgui-dev-server/util.js +++ b/tgui/packages/tgui-dev-server/util.js @@ -6,6 +6,7 @@ import fs from 'fs'; import path from 'path'; + import { require } from './require.js'; const globPkg = require('glob'); @@ -19,14 +20,14 @@ export const resolveGlob = (...sections) => { const unsafePaths = globPkg.sync(path.resolve(...sections), { strict: false, silent: true, + windowsPathsNoEscape: true, }); const safePaths = []; for (let path of unsafePaths) { try { fs.statSync(path); safePaths.push(path); - } - catch {} + } catch {} } return safePaths; }; diff --git a/tgui/packages/tgui-dev-server/webpack.js b/tgui/packages/tgui-dev-server/webpack.js index 8cba68afcba5..e4fbdeb9f1e2 100644 --- a/tgui/packages/tgui-dev-server/webpack.js +++ b/tgui/packages/tgui-dev-server/webpack.js @@ -7,6 +7,7 @@ import fs from 'fs'; import { createRequire } from 'module'; import { dirname } from 'path'; + import { loadSourceMaps, setupLink } from './link/server.js'; import { createLogger } from './logging.js'; import { reloadByondCache } from './reloader.js'; @@ -18,7 +19,7 @@ const logger = createLogger('webpack'); * @param {any} config * @return {WebpackCompiler} */ -export const createCompiler = async options => { +export const createCompiler = async (options) => { const compiler = new WebpackCompiler(); await compiler.setup(options); return compiler; @@ -57,7 +58,7 @@ class WebpackCompiler { logger.log('compiling'); }); // Start reloading when it's finished - compiler.hooks.done.tap('tgui-dev-server', async stats => { + compiler.hooks.done.tap('tgui-dev-server', async (stats) => { // Load source maps await loadSourceMaps(this.bundleDir); // Reload cache @@ -77,7 +78,7 @@ class WebpackCompiler { stats .toString(this.config.devServer.stats) .split('\n') - .forEach(line => logger.log(line)); + .forEach((line) => logger.log(line)); }); } } diff --git a/tgui/packages/tgui-dev-server/winreg.js b/tgui/packages/tgui-dev-server/winreg.js index 669e2aad55d6..4f66d715950b 100644 --- a/tgui/packages/tgui-dev-server/winreg.js +++ b/tgui/packages/tgui-dev-server/winreg.js @@ -8,6 +8,7 @@ import { exec } from 'child_process'; import { promisify } from 'util'; + import { createLogger } from './logging.js'; const logger = createLogger('winreg'); @@ -30,17 +31,14 @@ export const regQuery = async (path, key) => { logger.error('could not find the end of the line'); return null; } - const indexOfValue = stdout.indexOf( - ' ', - indexOfKey + keyPattern.length); + const indexOfValue = stdout.indexOf(' ', indexOfKey + keyPattern.length); if (indexOfValue === -1) { logger.error('could not find the start of the key value'); return null; } const value = stdout.substring(indexOfValue + 4, indexOfEol); return value; - } - catch (err) { + } catch (err) { logger.error(err); return null; } diff --git a/tgui/packages/tgui-panel/Notifications.js b/tgui/packages/tgui-panel/Notifications.js deleted file mode 100644 index a64ddd8e306e..000000000000 --- a/tgui/packages/tgui-panel/Notifications.js +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { Flex } from 'tgui/components'; - -export const Notifications = props => { - const { children } = props; - return ( -
- {children} -
- ); -}; - -const NotificationsItem = props => { - const { - rightSlot, - children, - } = props; - return ( - - - {children} - - {rightSlot && ( - - {rightSlot} - - )} - - ); -}; - -Notifications.Item = NotificationsItem; diff --git a/tgui/packages/tgui-panel/Notifications.jsx b/tgui/packages/tgui-panel/Notifications.jsx new file mode 100644 index 000000000000..2b92995287fa --- /dev/null +++ b/tgui/packages/tgui-panel/Notifications.jsx @@ -0,0 +1,28 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { Flex } from 'tgui/components'; + +export const Notifications = (props) => { + const { children } = props; + return
{children}
; +}; + +const NotificationsItem = (props) => { + const { rightSlot, children } = props; + return ( + + + {children} + + {rightSlot && ( + {rightSlot} + )} + + ); +}; + +Notifications.Item = NotificationsItem; diff --git a/tgui/packages/tgui-panel/Panel.js b/tgui/packages/tgui-panel/Panel.js deleted file mode 100644 index a09875e9b2f3..000000000000 --- a/tgui/packages/tgui-panel/Panel.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { Button, Section, Stack } from 'tgui/components'; -import { Pane } from 'tgui/layouts'; -import { NowPlayingWidget, useAudio } from './audio'; -import { ChatPanel, ChatTabs } from './chat'; -import { useGame } from './game'; -import { Notifications } from './Notifications'; -import { PingIndicator } from './ping'; -import { ReconnectButton } from './reconnect'; -import { SettingsPanel, useSettings } from './settings'; - -export const Panel = (props, context) => { - // IE8-10: Needs special treatment due to missing Flex support - if (Byond.IS_LTE_IE10) { - return ( - - ); - } - const audio = useAudio(context); - const settings = useSettings(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 ( - - ); - } - } - return ( - - - -
- - - - - - - - -
-
- {audio.visible && ( - -
- -
-
- )} - {settings.visible && ( - - - - )} - -
- - - - - {game.connectionLostAt && ( - }> - You are either AFK, experiencing lag or the connection - has closed. - - )} - {game.roundRestartedAt && ( - - The connection has been closed because the server is - restarting. Please wait while you automatically reconnect. - - )} - -
-
-
-
- ); -}; - -const HoboPanel = (props, context) => { - const settings = useSettings(context); - return ( - - - - {settings.visible && ( - - ) || ( - - )} - - - ); -}; diff --git a/tgui/packages/tgui-panel/Panel.tsx b/tgui/packages/tgui-panel/Panel.tsx new file mode 100644 index 000000000000..2813b636574d --- /dev/null +++ b/tgui/packages/tgui-panel/Panel.tsx @@ -0,0 +1,102 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { Button, Section, Stack } from 'tgui/components'; +import { Pane } from 'tgui/layouts'; + +import { NowPlayingWidget, useAudio } from './audio'; +import { ChatPanel, ChatTabs } from './chat'; +import { useGame } from './game'; +import { Notifications } from './Notifications'; +import { PingIndicator } from './ping'; +import { ReconnectButton } from './reconnect'; +import { SettingsPanel, useSettings } from './settings'; + +export const Panel = (props) => { + const audio = useAudio(); + const settings = useSettings(); + const game = useGame(); + if (process.env.NODE_ENV !== 'production') { + const { useDebug, KitchenSink } = require('tgui/debug'); + const debug = useDebug(); + if (debug.kitchenSink) { + return ; + } + } + + return ( + + + +
+ + + + + + + + +
+
+ {audio.visible && ( + +
+ +
+
+ )} + {settings.visible && ( + + + + )} + +
+ + + + + {game.connectionLostAt && ( + }> + You are either AFK, experiencing lag or the connection has + closed. + + )} + {game.roundRestartedAt && ( + + The connection has been closed because the server is + restarting. Please wait while you automatically reconnect. + + )} + +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js b/tgui/packages/tgui-panel/audio/NowPlayingWidget.js deleted file mode 100644 index e4fe04eed167..000000000000 --- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { toFixed } from 'common/math'; -import { useDispatch, useSelector } from 'common/redux'; -import { Button, Flex, Knob } from 'tgui/components'; -import { useSettings } from '../settings'; -import { selectAudio } from './selectors'; - -export const NowPlayingWidget = (props, context) => { - const audio = useSelector(context, selectAudio); - const dispatch = useDispatch(context); - const settings = useSettings(context); - const title = audio.meta?.title; - return ( - - {audio.playing && ( - <> - - Now playing: - - - {title || 'Unknown Track'} - - - ) || ( - - Nothing to play. - - )} - {audio.playing && ( - - -
-
- -
- {MESSAGE_TYPES - .filter(typeDef => !typeDef.important && !typeDef.admin) - .map(typeDef => ( - dispatch(toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }))}> - {typeDef.name} - - ))} - - {MESSAGE_TYPES - .filter(typeDef => !typeDef.important && typeDef.admin) - .map(typeDef => ( - dispatch(toggleAcceptedType({ - pageId: page.id, - type: typeDef.type, - }))}> - {typeDef.name} - - ))} - -
- - ); -}; diff --git a/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx new file mode 100644 index 000000000000..67028168f8e8 --- /dev/null +++ b/tgui/packages/tgui-panel/chat/ChatPageSettings.jsx @@ -0,0 +1,100 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { useDispatch, useSelector } from 'tgui/backend'; +import { + Button, + Collapsible, + Divider, + Input, + Section, + Stack, +} from 'tgui/components'; + +import { removeChatPage, toggleAcceptedType, updateChatPage } from './actions'; +import { MESSAGE_TYPES } from './constants'; +import { selectCurrentChatPage } from './selectors'; + +export const ChatPageSettings = (props) => { + const page = useSelector(selectCurrentChatPage); + const dispatch = useDispatch(); + return ( +
+ + + + dispatch( + updateChatPage({ + pageId: page.id, + name: value, + }), + ) + } + /> + + + + + + +
+ {MESSAGE_TYPES.filter( + (typeDef) => !typeDef.important && !typeDef.admin, + ).map((typeDef) => ( + + dispatch( + toggleAcceptedType({ + pageId: page.id, + type: typeDef.type, + }), + ) + } + > + {typeDef.name} + + ))} + + {MESSAGE_TYPES.filter( + (typeDef) => !typeDef.important && typeDef.admin, + ).map((typeDef) => ( + + dispatch( + toggleAcceptedType({ + pageId: page.id, + type: typeDef.type, + }), + ) + } + > + {typeDef.name} + + ))} + +
+
+ ); +}; diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.js b/tgui/packages/tgui-panel/chat/ChatPanel.js deleted file mode 100644 index 0a5deaf9febe..000000000000 --- a/tgui/packages/tgui-panel/chat/ChatPanel.js +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { shallowDiffers } from 'common/react'; -import { Component, createRef } from 'inferno'; -import { Button } from 'tgui/components'; -import { chatRenderer } from './renderer'; - -export class ChatPanel extends Component { - constructor() { - super(); - this.ref = createRef(); - this.state = { - scrollTracking: true, - }; - this.handleScrollTrackingChange = value => this.setState({ - scrollTracking: value, - }); - } - - componentDidMount() { - chatRenderer.mount(this.ref.current); - chatRenderer.events.on('scrollTrackingChanged', - this.handleScrollTrackingChange); - this.componentDidUpdate(); - } - - componentWillUnmount() { - chatRenderer.events.off('scrollTrackingChanged', - this.handleScrollTrackingChange); - } - - componentDidUpdate(prevProps) { - requestAnimationFrame(() => { - chatRenderer.ensureScrollTracking(); - }); - const shouldUpdateStyle = ( - !prevProps || shallowDiffers(this.props, prevProps) - ); - if (shouldUpdateStyle) { - chatRenderer.assignStyle({ - 'width': '100%', - 'white-space': 'pre-wrap', - 'font-size': this.props.fontSize, - 'line-height': this.props.lineHeight, - }); - } - } - - render() { - const { - scrollTracking, - } = this.state; - return ( - <> -
- {!scrollTracking && ( - - )} - - ); - } -} diff --git a/tgui/packages/tgui-panel/chat/ChatPanel.jsx b/tgui/packages/tgui-panel/chat/ChatPanel.jsx new file mode 100644 index 000000000000..845c16127565 --- /dev/null +++ b/tgui/packages/tgui-panel/chat/ChatPanel.jsx @@ -0,0 +1,75 @@ +/** + * @file + * @copyright 2020 Aleksej Komarov + * @license MIT + */ + +import { shallowDiffers } from 'common/react'; +import { Component, createRef } from 'react'; +import { Button } from 'tgui/components'; + +import { chatRenderer } from './renderer'; + +export class ChatPanel extends Component { + constructor(props) { + super(props); + this.ref = createRef(); + this.state = { + scrollTracking: true, + }; + this.handleScrollTrackingChange = (value) => + this.setState({ + scrollTracking: value, + }); + } + + componentDidMount() { + chatRenderer.mount(this.ref.current); + chatRenderer.events.on( + 'scrollTrackingChanged', + this.handleScrollTrackingChange, + ); + this.componentDidUpdate(); + } + + componentWillUnmount() { + chatRenderer.events.off( + 'scrollTrackingChanged', + this.handleScrollTrackingChange, + ); + } + + componentDidUpdate(prevProps) { + requestAnimationFrame(() => { + chatRenderer.ensureScrollTracking(); + }); + const shouldUpdateStyle = + !prevProps || shallowDiffers(this.props, prevProps); + if (shouldUpdateStyle) { + chatRenderer.assignStyle({ + width: '100%', + 'white-space': 'pre-wrap', + 'font-size': this.props.fontSize, + 'line-height': this.props.lineHeight, + }); + } + } + + render() { + const { scrollTracking } = this.state; + return ( + <> +
+ {!scrollTracking && ( + + )} + + ); + } +} diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.js b/tgui/packages/tgui-panel/chat/ChatTabs.js deleted file mode 100644 index a0e6cc59e523..000000000000 --- a/tgui/packages/tgui-panel/chat/ChatTabs.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { useDispatch, useSelector } from 'common/redux'; -import { Box, Tabs, Flex, Button } from 'tgui/components'; -import { changeChatPage, addChatPage } from './actions'; -import { selectChatPages, selectCurrentChatPage } from './selectors'; -import { openChatSettings } from '../settings/actions'; - -const UnreadCountWidget = ({ value }) => ( - - {Math.min(value, 99)} - -); - -export const ChatTabs = (props, context) => { - const pages = useSelector(context, selectChatPages); - const currentPage = useSelector(context, selectCurrentChatPage); - const dispatch = useDispatch(context); - return ( - - - - {pages.map(page => ( - 0 && ( - - )} - onClick={() => dispatch(changeChatPage({ - pageId: page.id, - }))}> - {page.name} - - ))} - - - - - diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.js b/tgui/packages/tgui-panel/settings/SettingsPanel.js deleted file mode 100644 index 01df419ce21f..000000000000 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.js +++ /dev/null @@ -1,195 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { toFixed } from 'common/math'; -import { useLocalState } from 'tgui/backend'; -import { useDispatch, useSelector } from 'common/redux'; -import { Box, Button, ColorBox, Divider, Dropdown, Flex, Input, LabeledList, NumberInput, Section, Stack, Tabs, TextArea } from 'tgui/components'; -import { ChatPageSettings } from '../chat'; -import { rebuildChat, saveChatToDisk } from '../chat/actions'; -import { THEMES } from '../themes'; -import { changeSettingsTab, updateSettings } from './actions'; -import { FONTS, SETTINGS_TABS } from './constants'; -import { selectActiveTab, selectSettings } from './selectors'; - -export const SettingsPanel = (props, context) => { - const activeTab = useSelector(context, selectActiveTab); - const dispatch = useDispatch(context); - return ( - - -
- - {SETTINGS_TABS.map(tab => ( - dispatch(changeSettingsTab({ - tabId: tab.id, - }))}> - {tab.name} - - ))} - -
-
- - {activeTab === 'general' && ( - - )} - {activeTab === 'chatPage' && ( - - )} - -
- ); -}; - -export const SettingsGeneral = (props, context) => { - const { - theme, - fontFamily, - fontSize, - lineHeight, - highlightText, - highlightColor, - matchWord, - matchCase, - } = useSelector(context, selectSettings); - const dispatch = useDispatch(context); - const [freeFont, setFreeFont] = useLocalState(context, "freeFont", false); - return ( -
- - - dispatch(updateSettings({ - theme: value, - }))} /> - - - - - {!freeFont && ( - dispatch(updateSettings({ - fontFamily: value, - }))} /> - ) || ( - dispatch(updateSettings({ - fontFamily: value, - }))} - /> - )} - - -
- - - - - - - )} - {!!(cardholder && show_imprint) && ( -
-
- )} - {!!removable_media.length && ( -
- - {removable_media.map(device => ( - - -
-
- )} - {!!pai && ( -
- - - -
-
- )} -
- - {programs.map(program => ( - - -
-
- {!!disk && ( -
act('PC_Eject_Disk', { name: "job disk" })} /> - )}> - - {disk_programs.map(program => ( - - -
-
- )} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosMain.jsx b/tgui/packages/tgui/interfaces/NtosMain.jsx new file mode 100644 index 000000000000..4b2b95aff8d3 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosMain.jsx @@ -0,0 +1,258 @@ +import { useBackend } from '../backend'; +import { Button, ColorBox, Section, Table } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosMain = (props) => { + const { act, data } = useBackend(); + const { + device_theme, + show_imprint, + programs = [], + has_light, + light_on, + comp_light_color, + removable_media = [], + cardholder, + login = [], + proposed_login = [], + disk, + disk_name, + disk_programs = [], + pai, + } = data; + return ( + + + {!!has_light && ( +
+ + +
+ )} + {!!(cardholder && show_imprint) && ( +
+
+ )} + {!!removable_media.length && ( +
+ + {removable_media.map((device) => ( + + +
+
+ )} + {!!pai && ( +
+ + + +
+
+ )} +
+ + {programs.map((program) => ( + + +
+
+ {!!disk && ( +
act('PC_Eject_Disk', { name: 'job disk' })} + /> + } + > + + {disk_programs.map((program) => ( + + +
+
+ )} +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosMessenger.js b/tgui/packages/tgui/interfaces/NtosMessenger.js deleted file mode 100644 index ddc200558613..000000000000 --- a/tgui/packages/tgui/interfaces/NtosMessenger.js +++ /dev/null @@ -1,220 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, Dimmer, Icon, Section, Stack } from '../components'; -import { NtosWindow } from '../layouts'; - -const NoIDDimmer = (props, context) => { - const { act, data } = useBackend(context); - const { owner } = data; - return ( - - - - - - - - - - - - - Please imprint an ID to continue. - - - - - - ); -}; - -export const NtosMessenger = (props, context) => { - const { act, data } = useBackend(context); - const { - owner, - messages = [], - ringer_status, - sending_and_receiving, - messengers = [], - viewing_messages, - sortByJob, - canSpam, - isSilicon, - photo, - virus_attach, - sending_virus, - } = data; - if (viewing_messages) { - return ( - - - -
-
- {messages.map(message => ( - -
- - {message.outgoing ? ( - "(OUTGOING)" - ) : ( - "(INCOMING)" - )} - - {message.outgoing ? ( - - {message.name + " (" + message.job + ")"} - - ) : ( -
-
- - {message.contents} - - {!!message.photo && ( - - )} -
-
- ))} -
-
-
- ); - } - return ( - - - -
- - - SpaceMessenger V6.4.7 - - - Bringing you spy-proof communications since 2467. - -
-
- -
- -
-
- {!!photo && ( - -
- - Current Photo -
-
- -
-
- )} - -
- - Detected Messengers -
-
- -
- - {messengers.map(messenger => ( - - ))} - - {!!canSpam && ( -
-
- {(!owner && !isSilicon) && ( - - )} -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosMessenger.jsx b/tgui/packages/tgui/interfaces/NtosMessenger.jsx new file mode 100644 index 000000000000..1b0f12f0f0ad --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosMessenger.jsx @@ -0,0 +1,198 @@ +import { useBackend } from '../backend'; +import { Box, Button, Dimmer, Icon, Section, Stack } from '../components'; +import { NtosWindow } from '../layouts'; + +const NoIDDimmer = (props) => { + const { act, data } = useBackend(); + const { owner } = data; + return ( + + + + + + + + + + + + + Please imprint an ID to continue. + + + + + + ); +}; + +export const NtosMessenger = (props) => { + const { act, data } = useBackend(); + const { + owner, + messages = [], + ringer_status, + sending_and_receiving, + messengers = [], + viewing_messages, + sortByJob, + canSpam, + isSilicon, + virus_attach, + sending_virus, + } = data; + if (viewing_messages) { + return ( + + + +
+
+ {messages.map((message) => ( + +
+ + {message.outgoing ? '(OUTGOING)' : '(INCOMING)'} + + {/* Automated or outgoing, don't give a reply link, as + * the reply address may not actually be valid. + */} + {message.outgoing || message.automated ? ( + {message.name + ' (' + message.job + ')'} + ) : ( +
+
+ {message.contents} +
+
+ ))} +
+
+
+ ); + } + return ( + + + +
+ + + SpaceMessenger V6.4.7 + + + Bringing you spy-proof communications since 2467. + +
+
+ +
+ +
+
+ +
+ + Detected Messengers +
+
+ +
+ + {messengers.map((messenger) => ( + + ))} + + {!!canSpam && ( +
+
+ {!owner && !isSilicon && } +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosNetChat.js b/tgui/packages/tgui/interfaces/NtosNetChat.js deleted file mode 100644 index 9a573a44ad7d..000000000000 --- a/tgui/packages/tgui/interfaces/NtosNetChat.js +++ /dev/null @@ -1,309 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, Dimmer, Icon, Input, Section, Stack } from '../components'; -import { NtosWindow } from '../layouts'; - -// byond defines for the program state -const CLIENT_ONLINE = 2; -const CLIENT_AWAY = 1; -const CLIENT_OFFLINE = 0; - -const STATUS2TEXT = { - 0: "Offline", - 1: "Away", - 2: "Online", -}; - -const NoChannelDimmer = (props, context) => { - const { act, data } = useBackend(context); - const { owner } = data; - return ( - - - - - - - - - - - - - - - - - Click a channel to start chatting! - - - (If you're new, you may wannaa set your name in the bottom left!) - - - - ); -}; - -export const NtosNetChat = (props, context) => { - const { act, data } = useBackend(context); - const { - title, - can_admin, - adminmode, - authed, - username, - active_channel, - is_operator, - strong, - selfref, - all_channels = [], - clients = [], - messages = [], - } = data; - const in_channel = (active_channel !== null); - const authorized = (authed || adminmode); - // this list has cliented ordered from their status. online > away > offline - const displayed_clients = clients.sort((clientA, clientB) => { - if (clientA.operator) { - return -1; - } - if (clientB.operator) { - return 1; - } - return clientB.status - clientA.status; - }); - const client_color = (client) => { - if (client.operator) { - return "green"; - } - switch (client.status) { - case CLIENT_ONLINE: - return "white"; - case CLIENT_AWAY: - return "yellow"; - case CLIENT_OFFLINE: - default: - return "label"; - } - }; - // client from this computer! - const this_client = clients.find(client => client.ref === selfref); - return ( - - - - -
- - - act('PRG_newchannel', { - new_channel_name: value, - })} /> - {all_channels.map(channel => ( -
-
- - - - -
- {in_channel && ( - authorized ? ( - messages.map(message => ( - - {message.msg} - - )) - ) : ( - - - - THIS CHANNEL IS PASSWORD PROTECTED - - - INPUT PASSWORD TO ACCESS - - - ) - ) || ( - - )} -
-
- {!!in_channel && ( - act('PRG_speak', { - message: value, - })} /> - )} -
-
- {!!in_channel && ( - <> - - - - -
- - {displayed_clients.map(client => ( - - - {client.name} - - {client !== this_client && ( - <> - -
-
-
- - Settings for {title}: - - - {!!(in_channel && authorized) && ( - <> - act('PRG_savelog', { - log_name: value, - })} /> - act('PRG_leavechannel')} /> - - )} - {!!(is_operator && authed) && ( - <> - act('PRG_deletechannel')} /> - act('PRG_renamechannel', { - new_name: value, - })} /> - act('PRG_setpassword', { - new_password: value, - })} /> - - )} - -
-
-
- - )} -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosNetChat.jsx b/tgui/packages/tgui/interfaces/NtosNetChat.jsx new file mode 100644 index 000000000000..5cd37ca0ec55 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosNetChat.jsx @@ -0,0 +1,329 @@ +import { useBackend } from '../backend'; +import { + Box, + Button, + Dimmer, + Icon, + Input, + Section, + Stack, +} from '../components'; +import { NtosWindow } from '../layouts'; + +// byond defines for the program state +const CLIENT_ONLINE = 2; +const CLIENT_AWAY = 1; +const CLIENT_OFFLINE = 0; + +const STATUS2TEXT = { + 0: 'Offline', + 1: 'Away', + 2: 'Online', +}; + +const NoChannelDimmer = (props) => { + const { act, data } = useBackend(); + const { owner } = data; + return ( + + + + + + + + + + + + + + + + + Click a channel to start chatting! + + + (If you're new, you may wannaa set your name in the bottom left!) + + + + ); +}; + +export const NtosNetChat = (props) => { + const { act, data } = useBackend(); + const { + title, + can_admin, + adminmode, + authed, + username, + active_channel, + is_operator, + strong, + selfref, + all_channels = [], + clients = [], + messages = [], + } = data; + const in_channel = active_channel !== null; + const authorized = authed || adminmode; + // this list has cliented ordered from their status. online > away > offline + const displayed_clients = clients.sort((clientA, clientB) => { + if (clientA.operator) { + return -1; + } + if (clientB.operator) { + return 1; + } + return clientB.status - clientA.status; + }); + const client_color = (client) => { + if (client.operator) { + return 'green'; + } + switch (client.status) { + case CLIENT_ONLINE: + return 'white'; + case CLIENT_AWAY: + return 'yellow'; + case CLIENT_OFFLINE: + default: + return 'label'; + } + }; + // client from this computer! + const this_client = clients.find((client) => client.ref === selfref); + return ( + + + + +
+ + + + act('PRG_newchannel', { + new_channel_name: value, + }) + } + /> + {all_channels.map((channel) => ( +
+
+ + + + +
+ {(in_channel && + (authorized ? ( + messages.map((message) => ( + {message.msg} + )) + ) : ( + + + + THIS CHANNEL IS PASSWORD PROTECTED + + INPUT PASSWORD TO ACCESS + + ))) || } +
+
+ {!!in_channel && ( + + act('PRG_speak', { + message: value, + }) + } + /> + )} +
+
+ {!!in_channel && ( + <> + + + + +
+ + {displayed_clients.map((client) => ( + + + {client.name} + + {client !== this_client && ( + <> + +
+
+
+ Settings for {title}: + + {!!(in_channel && authorized) && ( + <> + + act('PRG_savelog', { + log_name: value, + }) + } + /> + act('PRG_leavechannel')} + /> + + )} + {!!(is_operator && authed) && ( + <> + act('PRG_deletechannel')} + /> + + act('PRG_renamechannel', { + new_name: value, + }) + } + /> + + act('PRG_setpassword', { + new_password: value, + }) + } + /> + + )} + +
+
+
+ + )} +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosNetDos.js b/tgui/packages/tgui/interfaces/NtosNetDos.js deleted file mode 100644 index f694638a6e81..000000000000 --- a/tgui/packages/tgui/interfaces/NtosNetDos.js +++ /dev/null @@ -1,116 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, LabeledList, NoticeBox, Section } from '../components'; -import { NtosWindow } from '../layouts'; - -export const NtosNetDos = (props, context) => { - return ( - - - - - - ); -}; - -export const NtosNetDosContent = (props, context) => { - const { act, data } = useBackend(context); - - const { - relays = [], - focus, - target, - speed, - overload, - capacity, - error, - } = data; - - if (error) { - return ( - <> - - {error} - - - - - - act('rewrite', { - abstract: value, - })} - /> - - - - - - act('select_file', { - selected_uid: fileList[ordfile_name], - })} - /> - - - - - - - - - - - - - act('select_experiment', { - selected_expath: expList[experiment_name], - })} - /> - - - - - - - - - - - - String(number))} - displayText={tier ? String(tier) : '-'} - onSelected={(new_tier) => - act('select_tier', { - selected_tier: Number(new_tier), - })} - /> - - - - - - - - - - - - - act('select_partner', { - selected_partner: allowedPartners[new_partner], - })} - /> - - - - - - - - - - -
- - - - - - {' Cooperation: '} -
{gains[coopIndex - 1]}
-
- - - - - {' Funding: '} -
{gains[fundingIndex - 1]}
-
-
-
-
- - ); -}; - -const PaperBrowser = (props, context) => { - const { act, data } = useBackend(context); - const { publishedPapers, coopIndex, fundingIndex } = data; - if (publishedPapers.length === 0) { - return No Published Papers! ; - } else { - return publishedPapers.map((paper) => ( - -
- - - {paper['experimentName'] + ' - ' + paper['tier']} - - - {paper['author'] + (paper.etAlia ? ' et al.' : '')} - - - {paper['partner']} - - - - - {paper['gains'][coopIndex - 1]} - - - {paper['gains'][fundingIndex - 1]} - - - - - {paper['abstract']} - - -
-
- )); - } -}; -const ExperimentBrowser = (props, context) => { - const { act, data } = useBackend(context); - const { experimentInformation = [] } = data; - return experimentInformation.map((experiment) => ( -
- {experiment.description} -
- - {Object.keys(experiment.target).map((tier) => ( - - {experiment.target[tier] + ' ' + experiment.suffix} - - ))} - -
- )); -}; - -const PartnersBrowser = (props, context) => { - const { act, data } = useBackend(context); - const { - partnersInformation, - coopIndex, - fundingIndex, - purchaseableBoosts = [], - relations = [], - visibleNodes = [], - } = data; - return partnersInformation.map((partner) => ( -
- - - - {partner.flufftext} - - - {relations[partner.path]} - - - {partner.multipliers[coopIndex - 1] + 'x'} - - - {partner.multipliers[fundingIndex - 1] + 'x'} - - - {partner.acceptedExperiments.map((experiment_name) => ( - {experiment_name} - ))} - - - - {partner.boostedNodes.map((node) => ( - - - {visibleNodes.includes(node.id) - ? node.name - : 'Unknown Technology'} - - -
-
-
-
-
- )); -}; - -export const NtosScipaperContent = (props, context) => { - const { act, data } = useBackend(context); - const { currentTab } = data; - return ( - <> - - - act('change_tab', { - new_tab: 1, - })}> - {'Publish Papers'} - - - act('change_tab', { - new_tab: 2, - })}> - {'View Previous Publications'} - - - act('change_tab', { - new_tab: 3, - })}> - {'View Available Experiments'} - - - act('change_tab', { - new_tab: 4, - })}> - {'View Scientific Partners'} - - - {currentTab === 1 && } - {currentTab === 2 && } - {currentTab === 3 && } - {currentTab === 4 && } - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosScipaper.jsx b/tgui/packages/tgui/interfaces/NtosScipaper.jsx new file mode 100644 index 000000000000..2b08947363b7 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosScipaper.jsx @@ -0,0 +1,412 @@ +import { useBackend } from '../backend'; +import { + BlockQuote, + Box, + Button, + Collapsible, + Dropdown, + Icon, + Input, + LabeledList, + NoticeBox, + Section, + Stack, + Table, + Tabs, + Tooltip, +} from '../components'; +import { TableCell, TableRow } from '../components/Table'; +import { NtosWindow } from '../layouts'; + +export const NtosScipaper = (props) => { + return ( + + + + + + ); +}; + +const PaperPublishing = (props) => { + const { act, data } = useBackend(); + const { + title, + author, + etAlia, + abstract, + fileList = [], + expList = [], + allowedTiers = [], + allowedPartners = [], + gains, + selectedFile, + selectedExperiment, + tier, + selectedPartner, + coopIndex, + fundingIndex, + } = data; + return ( + <> +
+ + + + act('rewrite', { + title: value, + }) + } + /> + + + + act('rewrite', { + author: value, + }) + } + /> + + + + + act('rewrite', { + abstract: value, + }) + } + /> + + + + + + act('select_file', { + selected_uid: fileList[ordfile_name], + }) + } + /> + + + + + + + + + + + + + act('select_experiment', { + selected_expath: expList[experiment_name], + }) + } + /> + + + + + + + + + + + + String(number))} + displayText={tier ? String(tier) : '-'} + onSelected={(new_tier) => + act('select_tier', { + selected_tier: Number(new_tier), + }) + } + /> + + + + + + + + + + + + + act('select_partner', { + selected_partner: allowedPartners[new_partner], + }) + } + /> + + + + + + + + + +
+
+ + + + + + {' Cooperation: '} +
{gains[coopIndex - 1]}
+
+ + + + + {' Funding: '} +
{gains[fundingIndex - 1]}
+
+
+
+
+ + ); +}; + +const PaperBrowser = (props) => { + const { act, data } = useBackend(); + const { publishedPapers, coopIndex, fundingIndex } = data; + if (publishedPapers.length === 0) { + return No Published Papers! ; + } else { + return publishedPapers.map((paper) => ( + +
+ + + {paper['experimentName'] + ' - ' + paper['tier']} + + + {paper['author'] + (paper.etAlia ? ' et al.' : '')} + + + {paper['partner']} + + + + + {paper['gains'][coopIndex - 1]} + + + {paper['gains'][fundingIndex - 1]} + + + + + {paper['abstract']} + + +
+
+ )); + } +}; +const ExperimentBrowser = (props) => { + const { act, data } = useBackend(); + const { experimentInformation = [] } = data; + return experimentInformation.map((experiment) => ( +
+ {experiment.description} +
+ + {Object.keys(experiment.target).map((tier) => ( + + {experiment.target[tier] + ' ' + experiment.suffix} + + ))} + +
+ )); +}; + +const PartnersBrowser = (props) => { + const { act, data } = useBackend(); + const { + partnersInformation, + coopIndex, + fundingIndex, + purchaseableBoosts = [], + relations = [], + visibleNodes = [], + } = data; + return partnersInformation.map((partner) => ( +
+ + + + {partner.flufftext} + + + {relations[partner.path]} + + + {partner.multipliers[coopIndex - 1] + 'x'} + + + {partner.multipliers[fundingIndex - 1] + 'x'} + + + {partner.acceptedExperiments.map((experiment_name) => ( + {experiment_name} + ))} + + + + {partner.boostedNodes.map((node) => ( + + + {visibleNodes.includes(node.id) + ? node.name + : 'Unknown Technology'} + + +
+
+
+
+
+ )); +}; + +export const NtosScipaperContent = (props) => { + const { act, data } = useBackend(); + const { currentTab } = data; + return ( + <> + + + act('change_tab', { + new_tab: 1, + }) + } + > + {'Publish Papers'} + + + act('change_tab', { + new_tab: 2, + }) + } + > + {'View Previous Publications'} + + + act('change_tab', { + new_tab: 3, + }) + } + > + {'View Available Experiments'} + + + act('change_tab', { + new_tab: 4, + }) + } + > + {'View Scientific Partners'} + + + {currentTab === 1 && } + {currentTab === 2 && } + {currentTab === 3 && } + {currentTab === 4 && } + + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.js b/tgui/packages/tgui/interfaces/NtosSecurEye.js deleted file mode 100644 index c5780b3efb37..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSecurEye.js +++ /dev/null @@ -1,54 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, ByondUi } from '../components'; -import { NtosWindow } from '../layouts'; -import { prevNextCamera, selectCameras, CameraConsoleContent } from './CameraConsole'; - -export const NtosSecurEye = (props, context) => { - const { act, data, config } = useBackend(context); - const { PC_device_theme, mapRef, activeCamera } = data; - const cameras = selectCameras(data.cameras); - const [ - prevCameraName, - nextCameraName, - ] = prevNextCamera(cameras, activeCamera); - return ( - - -
- -
-
-
- Camera: - {activeCamera - && activeCamera.name - || '—'} -
-
-
- -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSecurEye.jsx b/tgui/packages/tgui/interfaces/NtosSecurEye.jsx new file mode 100644 index 000000000000..6b8ce63477ce --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSecurEye.jsx @@ -0,0 +1,60 @@ +import { useBackend } from '../backend'; +import { Button, ByondUi } from '../components'; +import { NtosWindow } from '../layouts'; +import { + CameraConsoleContent, + prevNextCamera, + selectCameras, +} from './CameraConsole'; + +export const NtosSecurEye = (props) => { + const { act, data, config } = useBackend(); + const { PC_device_theme, mapRef, activeCamera } = data; + const cameras = selectCameras(data.cameras); + const [prevCameraName, nextCameraName] = prevNextCamera( + cameras, + activeCamera, + ); + return ( + + +
+ +
+
+
+ Camera: + {(activeCamera && activeCamera.name) || '—'} +
+
+
+ +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosShipping.js b/tgui/packages/tgui/interfaces/NtosShipping.js deleted file mode 100644 index 5769827dfa6d..000000000000 --- a/tgui/packages/tgui/interfaces/NtosShipping.js +++ /dev/null @@ -1,72 +0,0 @@ -import { useBackend } from '../backend'; -import { Box, Button, LabeledList, Section } from '../components'; -import { NtosWindow } from '../layouts'; - -export const NtosShipping = (props, context) => { - const { act, data } = useBackend(context); - return ( - - -
act('ejectid')} /> - )}> - - - {data.current_user || "N/A"} - - - {data.card_owner || "N/A"} - - - {data.has_printer ? data.paperamt : "N/A"} - - - {data.barcode_split}% - - -
-
- -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosShipping.jsx b/tgui/packages/tgui/interfaces/NtosShipping.jsx new file mode 100644 index 000000000000..6302c77be780 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosShipping.jsx @@ -0,0 +1,76 @@ +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, Section } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosShipping = (props) => { + const { act, data } = useBackend(); + return ( + + +
act('ejectid')} + /> + } + > + + + {data.current_user || 'N/A'} + + + {data.card_owner || 'N/A'} + + + {data.has_printer ? data.paperamt : 'N/A'} + + + {data.barcode_split}% + + +
+
+ +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSignaler.js b/tgui/packages/tgui/interfaces/NtosSignaler.js deleted file mode 100644 index 5f948c85470e..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSignaler.js +++ /dev/null @@ -1,14 +0,0 @@ -import { SignalerContent } from './Signaler'; -import { NtosWindow } from '../layouts'; - -export const NtosSignaler = (props, context) => { - return ( - - - - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSignaler.jsx b/tgui/packages/tgui/interfaces/NtosSignaler.jsx new file mode 100644 index 000000000000..c04ee3c7e36e --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSignaler.jsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { SignalerContent } from './Signaler'; + +export const NtosSignaler = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSkillTracker.js b/tgui/packages/tgui/interfaces/NtosSkillTracker.js deleted file mode 100644 index 4bc719ffb54d..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSkillTracker.js +++ /dev/null @@ -1,87 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, Section, Table, BlockQuote, ProgressBar, AnimatedNumber } from '../components'; -import { NtosWindow } from '../layouts'; - -export const NtosSkillTracker = (props, context) => { - const { act, data } = useBackend(context); - const { - skills = {}, - } = data; - return ( - - -
- {skills.map((skill, idx) => ( -
-
- {skill.desc} -
-
- - - - Level - - - Level Progress - - - Overall Progress - - - - - {skill.lvl_name} - - - {skill.progress_percent ? ( - - % - - ) : ('—')} - - - {skill.overall_percent ? ( - - % - - ) : ('—')} - - - {!!skill.reward && ( - - - - - - )} -
-
-
- ))} -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSkillTracker.jsx b/tgui/packages/tgui/interfaces/NtosSkillTracker.jsx new file mode 100644 index 000000000000..fd42d35ae746 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSkillTracker.jsx @@ -0,0 +1,93 @@ +import { useBackend } from '../backend'; +import { + AnimatedNumber, + BlockQuote, + Button, + ProgressBar, + Section, + Table, +} from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosSkillTracker = (props) => { + const { act, data } = useBackend(); + const { skills = {} } = data; + return ( + + +
+ {skills.map((skill, idx) => ( +
+
{skill.desc}
+
+ + + + Level + + Level Progress + Overall Progress + + + + {skill.lvl_name} + + + {skill.progress_percent ? ( + + + % + + ) : ( + '—' + )} + + + {skill.overall_percent ? ( + + + % + + ) : ( + '—' + )} + + + {!!skill.reward && ( + + + + + + )} +
+
+
+ ))} +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js deleted file mode 100644 index e39a38dd7373..000000000000 --- a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.js +++ /dev/null @@ -1,14 +0,0 @@ -import { NtosWindow } from '../layouts'; -import { StationAlertConsoleContent } from './StationAlertConsole'; - -export const NtosStationAlertConsole = () => { - return ( - - - - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosStationAlertConsole.jsx b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.jsx new file mode 100644 index 000000000000..a3c9ae8f00f9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosStationAlertConsole.jsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { StationAlertConsoleContent } from './StationAlertConsole'; + +export const NtosStationAlertConsole = () => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosStatus.js b/tgui/packages/tgui/interfaces/NtosStatus.js deleted file mode 100644 index 64ad2e81e30c..000000000000 --- a/tgui/packages/tgui/interfaces/NtosStatus.js +++ /dev/null @@ -1,45 +0,0 @@ -import { useBackend } from '../backend'; -import { NtosWindow } from '../layouts'; -import { Input, Section, Button } from '../components'; - -export const NtosStatus = (props, context) => { - const { act, data } = useBackend(context); - const { - upper, - lower, - } = data; - - return ( - - -
- act('stat_update', { - position: "upper", - text: value, - })} - /> -
- act('stat_update', { - position: "lower", - text: value, - })} - /> -
-
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosStatus.jsx b/tgui/packages/tgui/interfaces/NtosStatus.jsx new file mode 100644 index 000000000000..9b54f2b69657 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosStatus.jsx @@ -0,0 +1,44 @@ +import { useBackend } from '../backend'; +import { Button, Input, Section } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosStatus = (props) => { + const { act, data } = useBackend(); + const { upper, lower } = data; + + return ( + + +
+ + act('stat_update', { + position: 'upper', + text: value, + }) + } + /> +
+ + act('stat_update', { + position: 'lower', + text: value, + }) + } + /> +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js b/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js deleted file mode 100644 index 6ec5fe5e398d..000000000000 --- a/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.js +++ /dev/null @@ -1,14 +0,0 @@ -import { NtosWindow } from '../layouts'; -import { SupermatterMonitorContent } from './SupermatterMonitor'; - -export const NtosSupermatterMonitor = (props, context) => { - return ( - - - - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.jsx b/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.jsx new file mode 100644 index 000000000000..cf921706b96b --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSupermatterMonitor.jsx @@ -0,0 +1,12 @@ +import { NtosWindow } from '../layouts'; +import { SupermatterMonitorContent } from './SupermatterMonitor'; + +export const NtosSupermatterMonitor = (props) => { + return ( + + + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/NuclearBomb.js b/tgui/packages/tgui/interfaces/NuclearBomb.js deleted file mode 100644 index 0a4a3324b143..000000000000 --- a/tgui/packages/tgui/interfaces/NuclearBomb.js +++ /dev/null @@ -1,128 +0,0 @@ -import { classes } from 'common/react'; -import { useBackend } from '../backend'; -import { Box, Button, Flex, Grid, Icon } from '../components'; -import { Window } from '../layouts'; - -// This ui is so many manual overrides and !important tags -// and hand made width sets that changing pretty much anything -// is going to require a lot of tweaking it get it looking correct again -// I'm sorry, but it looks bangin -const NukeKeypad = (props, context) => { - const { act } = useBackend(context); - const keypadKeys = [ - ['1', '4', '7', 'C'], - ['2', '5', '8', '0'], - ['3', '6', '9', 'E'], - ]; - return ( - - - {keypadKeys.map(keyColumn => ( - - {keyColumn.map(key => ( - - ); -}; - -export const Orbit = (props, context) => { - const { act, data } = useBackend(context); - const { - alive, - antagonists, - dead, - ghosts, - misc, - npcs, - } = data; - - const [searchText, setSearchText] = useLocalState(context, "searchText", ""); - const [autoObserve, setAutoObserve] = useLocalState(context, "autoObserve", false); - - const collatedAntagonists = {}; - for (const antagonist of antagonists) { - if (collatedAntagonists[antagonist.antag] === undefined) { - collatedAntagonists[antagonist.antag] = []; - } - collatedAntagonists[antagonist.antag].push(antagonist); - } - - const sortedAntagonists = Object.entries(collatedAntagonists); - sortedAntagonists.sort((a, b) => { - return compareString(a[0], b[0]); - }); - - const orbitMostRelevant = searchText => { - for (const source of [ - sortedAntagonists.map(([_, antags]) => antags), - alive, ghosts, dead, npcs, misc, - ]) { - const member = source - .filter(searchFor(searchText)) - .sort(compareNumberedText)[0]; - if (member !== undefined) { - act("orbit", { - ref: member.ref, - auto_observe: autoObserve, - }); - break; - } - } - }; - - return ( - - -
- - - - - - setSearchText(value)} - onEnter={(_, value) => orbitMostRelevant(value)} /> - - - - - -
- {antagonists.length > 0 && ( -
- {sortedAntagonists.map(([name, antags]) => ( -
- {antags - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map(antag => ( - - ))} -
- ))} -
- )} - -
- {alive - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map(thing => ( - - ))} -
- -
- {ghosts - .filter(searchFor(searchText)) - .sort(compareNumberedText) - .map(thing => ( - - ))} -
- - - - - - -
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/Orbit.jsx b/tgui/packages/tgui/interfaces/Orbit.jsx new file mode 100644 index 000000000000..af87dd93dd39 --- /dev/null +++ b/tgui/packages/tgui/interfaces/Orbit.jsx @@ -0,0 +1,247 @@ +import { createSearch } from 'common/string'; + +import { resolveAsset } from '../assets'; +import { useBackend, useLocalState } from '../backend'; +import { + Box, + Button, + Divider, + Flex, + Icon, + Input, + Section, +} from '../components'; +import { Window } from '../layouts'; + +const PATTERN_NUMBER = / \(([0-9]+)\)$/; + +const searchFor = (searchText) => + createSearch(searchText, (thing) => thing.name); + +const compareString = (a, b) => (a < b ? -1 : a > b); + +const compareNumberedText = (a, b) => { + const aName = a.name; + const bName = b.name; + + // Check if aName and bName are the same except for a number at the end + // e.g. Medibot (2) and Medibot (3) + const aNumberMatch = aName.match(PATTERN_NUMBER); + const bNumberMatch = bName.match(PATTERN_NUMBER); + + if ( + aNumberMatch && + bNumberMatch && + aName.replace(PATTERN_NUMBER, '') === bName.replace(PATTERN_NUMBER, '') + ) { + const aNumber = parseInt(aNumberMatch[1], 10); + const bNumber = parseInt(bNumberMatch[1], 10); + + return aNumber - bNumber; + } + + return compareString(aName, bName); +}; + +const BasicSection = (props) => { + const { act } = useBackend(); + const { searchText, source, title, autoObserve } = props; + + const things = source.filter(searchFor(searchText)); + things.sort(compareNumberedText); + return ( + source.length > 0 && ( +
+ {things.map((thing) => ( +
+ ) + ); +}; + +const OrbitedButton = (props) => { + const { act } = useBackend(); + const { color, thing, autoObserve } = props; + + return ( + + ); +}; + +export const Orbit = (props) => { + const { act, data } = useBackend(); + const { alive, antagonists, dead, ghosts, misc, npcs } = data; + + const [searchText, setSearchText] = useLocalState('searchText', ''); + const [autoObserve, setAutoObserve] = useLocalState('autoObserve', true); + + const collatedAntagonists = {}; + for (const antagonist of antagonists) { + if (collatedAntagonists[antagonist.antag] === undefined) { + collatedAntagonists[antagonist.antag] = []; + } + collatedAntagonists[antagonist.antag].push(antagonist); + } + + const sortedAntagonists = Object.entries(collatedAntagonists); + sortedAntagonists.sort((a, b) => { + return compareString(a[0], b[0]); + }); + + const orbitMostRelevant = (searchText) => { + for (const source of [ + sortedAntagonists.map(([_, antags]) => antags), + alive, + ghosts, + dead, + npcs, + misc, + ]) { + const member = source + .filter(searchFor(searchText)) + .sort(compareNumberedText)[0]; + if (member !== undefined) { + act('orbit', { + ref: member.ref, + auto_observe: autoObserve, + }); + break; + } + } + }; + + return ( + + +
+ + + + + + setSearchText(value)} + onEnter={(_, value) => orbitMostRelevant(value)} + /> + + + + + +
+ {antagonists.length > 0 && ( +
+ {sortedAntagonists.map(([name, antags]) => ( +
+ {antags + .filter(searchFor(searchText)) + .sort(compareNumberedText) + .map((antag) => ( + + ))} +
+ ))} +
+ )} + +
+ {alive + .filter(searchFor(searchText)) + .sort(compareNumberedText) + .map((thing) => ( + + ))} +
+ +
+ {ghosts + .filter(searchFor(searchText)) + .sort(compareNumberedText) + .map((thing) => ( + + ))} +
+ + + + + + +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/OreBox.js b/tgui/packages/tgui/interfaces/OreBox.js deleted file mode 100644 index 326385e7066d..000000000000 --- a/tgui/packages/tgui/interfaces/OreBox.js +++ /dev/null @@ -1,55 +0,0 @@ -import { toTitleCase } from 'common/string'; -import { Box, Button, Section, Table } from '../components'; -import { useBackend } from '../backend'; -import { Window } from '../layouts'; - -export const OreBox = (props, context) => { - const { act, data } = useBackend(context); - const { materials } = data; - return ( - - -
act('removeall')} /> - )}> - - - - Ore - - - Amount - - - {materials.map(material => ( - - - {toTitleCase(material.name)} - - - - {material.amount} - - - - ))} -
-
-
- - All ores will be placed in here when you are wearing a mining - stachel on your belt or in a pocket while dragging the ore box. -
- Gibtonite is not accepted. -
-
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/OreBox.jsx b/tgui/packages/tgui/interfaces/OreBox.jsx new file mode 100644 index 000000000000..57b77c42dccd --- /dev/null +++ b/tgui/packages/tgui/interfaces/OreBox.jsx @@ -0,0 +1,47 @@ +import { toTitleCase } from 'common/string'; + +import { useBackend } from '../backend'; +import { Box, Button, Section, Table } from '../components'; +import { Window } from '../layouts'; + +export const OreBox = (props) => { + const { act, data } = useBackend(); + const { materials } = data; + return ( + + +
act('removeall')} />} + > + + + Ore + + Amount + + + {materials.map((material) => ( + + {toTitleCase(material.name)} + + + {material.amount} + + + + ))} +
+
+
+ + All ores will be placed in here when you are wearing a mining + stachel on your belt or in a pocket while dragging the ore box. +
+ Gibtonite is not accepted. +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js b/tgui/packages/tgui/interfaces/OreRedemptionMachine.js deleted file mode 100644 index 90edb693b37d..000000000000 --- a/tgui/packages/tgui/interfaces/OreRedemptionMachine.js +++ /dev/null @@ -1,144 +0,0 @@ -import { toTitleCase } from 'common/string'; -import { useBackend, useLocalState } from '../backend'; -import { BlockQuote, Box, Button, NumberInput, Section, Table } from '../components'; -import { Window } from '../layouts'; - -export const OreRedemptionMachine = (props, context) => { - const { act, data } = useBackend(context); - const { - unclaimedPoints, - materials, - alloys, - diskDesigns, - hasDisk, - } = data; - return ( - - -
-
- This machine only accepts ore.
- Gibtonite and Slag are not accepted. -
- - - Unclaimed points: - - {unclaimedPoints} -
-
- {hasDisk && ( - <> - -
-
- - {materials.map(material => ( - act('Release', { - id: material.id, - sheets: amount, - })} /> - ))} -
-
-
- - {alloys.map(material => ( - act('Smelt', { - id: material.id, - sheets: amount, - })} /> - ))} -
-
-
-
- ); -}; - - -const MaterialRow = (props, context) => { - const { material, onRelease } = props; - - const [ - amount, - setAmount, - ] = useLocalState(context, "amount" + material.name, 1); - - const amountAvailable = Math.floor(material.amount); - return ( - - - {toTitleCase(material.name).replace('Alloy', '')} - - - - {material.value && material.value + ' cr'} - - - - - {amountAvailable} sheets - - - - setAmount(value)} /> - - - {currItem?.sprite && ( - <> - - act("clear", { slot })} /> - - )} - - - {currItem?.name || "Empty"} - -
- ); -}; diff --git a/tgui/packages/tgui/interfaces/OutfitEditor.jsx b/tgui/packages/tgui/interfaces/OutfitEditor.jsx new file mode 100644 index 000000000000..442fe67d1a3c --- /dev/null +++ b/tgui/packages/tgui/interfaces/OutfitEditor.jsx @@ -0,0 +1,174 @@ +import { useBackend } from '../backend'; +import { Box, Button, Icon, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +export const OutfitEditor = (props) => { + const { act, data } = useBackend(); + const { outfit, saveable, dummy64 } = data; + return ( + + + +
+ +
+
+
+ ); +}; + +const OutfitSlot = (props) => { + const { act, data } = useBackend(); + const { name, icon, iconRot, slot } = props; + const { outfit } = data; + const currItem = outfit[slot]; + return ( + + + + {currItem?.sprite && ( + <> + + act('clear', { slot })} + /> + + )} + + + {currItem?.name || 'Empty'} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/OutfitManager.js b/tgui/packages/tgui/interfaces/OutfitManager.js deleted file mode 100644 index ed7b835897f1..000000000000 --- a/tgui/packages/tgui/interfaces/OutfitManager.js +++ /dev/null @@ -1,82 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, Section, Stack } from '../components'; -import { Window } from '../layouts'; - -export const OutfitManager = (props, context) => { - const { act, data } = useBackend(context); - const { outfits } = data; - return ( - - -
-
-
-
- ); -}; - diff --git a/tgui/packages/tgui/interfaces/OutfitManager.jsx b/tgui/packages/tgui/interfaces/OutfitManager.jsx new file mode 100644 index 000000000000..3ad3b8b36d9f --- /dev/null +++ b/tgui/packages/tgui/interfaces/OutfitManager.jsx @@ -0,0 +1,87 @@ +import { useBackend } from '../backend'; +import { Button, Section, Stack } from '../components'; +import { Window } from '../layouts'; + +export const OutfitManager = (props) => { + const { act, data } = useBackend(); + const { outfits } = data; + return ( + + +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/PaiCard.tsx b/tgui/packages/tgui/interfaces/PaiCard.tsx index 2ddaa648c991..6f1ed29491cc 100644 --- a/tgui/packages/tgui/interfaces/PaiCard.tsx +++ b/tgui/packages/tgui/interfaces/PaiCard.tsx @@ -1,6 +1,13 @@ import { BooleanLike } from '../../common/react'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, LabeledList, NoticeBox, Section, Stack } from '../components'; +import { + Box, + Button, + LabeledList, + NoticeBox, + Section, + Stack, +} from '../components'; import { Window } from '../layouts'; type PaiCardData = { @@ -22,12 +29,12 @@ type Pai = { laws: string; master: string; name: string; - transmit: BooleanLike; receive: BooleanLike; + transmit: BooleanLike; }; -export const PaiCard = (_, context) => { - const { data } = useBackend(context); +export const PaiCard = (_) => { + const { data } = useBackend(); const { pai } = data; return ( @@ -38,10 +45,10 @@ export const PaiCard = (_, context) => { }; /** Gives a list of candidates as cards */ -const PaiDownload = (_, context) => { - const { act, data } = useBackend(context); +const PaiDownload = (_) => { + const { act, data } = useBackend(); const { candidates = [] } = data; - const [tabInChar, setTabInChar] = useLocalState(context, 'tab', true); + const [tabInChar, setTabInChar] = useLocalState('tab', true); const onClick = () => { setTabInChar(!tabInChar); }; @@ -54,21 +61,24 @@ const PaiDownload = (_, context) => { )} } fill scrollable - title="pAI Candidates"> + title="pAI Candidates" + > {!candidates.length ? ( None found! ) : ( @@ -94,32 +104,35 @@ const PaiDownload = (_, context) => { * had to make the comments and descriptions a separate tab. * In longer entries, it is much more readable. */ -const CandidateDisplay = (props, context) => { - const { act } = useBackend(context); +const CandidateDisplay = (props) => { + const { act } = useBackend(); const { candidate, index, tabInChar } = props; const { comments, description, key, name } = candidate; return ( + background: '#111111', + border: '1px solid #4972a1', + borderRadius: '5px', + padding: '1rem', + }} + >
act('download', { key })} - tooltip="Accepts this pAI candidate."> + tooltip="Accepts this pAI candidate." + > Download } fill height={12} scrollable - title={'Candidate ' + index}> + title={'Candidate ' + index} + > Name: {name || 'Randomized Name'} @@ -132,8 +145,8 @@ const CandidateDisplay = (props, context) => { }; /** Once a pAI has been loaded, you can alter its settings here */ -const PaiOptions = (_, context) => { - const { act, data } = useBackend(context); +const PaiOptions = (_) => { + const { act, data } = useBackend(); const { pai } = data; const { can_holo, dna, emagged, laws, master, name, transmit, receive } = pai; @@ -153,7 +166,8 @@ const PaiOptions = (_, context) => { @@ -161,7 +175,8 @@ const PaiOptions = (_, context) => { @@ -169,7 +184,8 @@ const PaiOptions = (_, context) => { diff --git a/tgui/packages/tgui/interfaces/PaiInterface.tsx b/tgui/packages/tgui/interfaces/PaiInterface.tsx index 19641ab81d6c..39ee5c0e57ee 100644 --- a/tgui/packages/tgui/interfaces/PaiInterface.tsx +++ b/tgui/packages/tgui/interfaces/PaiInterface.tsx @@ -1,5 +1,17 @@ import { useBackend, useLocalState } from '../backend'; -import { Box, Button, LabeledList, Icon, NoticeBox, ProgressBar, Section, Stack, Table, Tabs, Tooltip } from '../components'; +import { + Box, + Button, + Icon, + LabeledList, + NoticeBox, + ProgressBar, + Section, + Stack, + Table, + Tabs, + Tooltip, +} from '../components'; import { Window } from '../layouts'; type PaiInterfaceData = { @@ -23,8 +35,8 @@ type Available = { }; type Master = { - name: string; dna: string; + name: string; }; type PDA = { @@ -82,8 +94,7 @@ const SOFTWARE_DESC = { 'security HUD': 'Allows you to view security records using an overlay HUD.', 'loudness booster': 'Synthesizes instruments, plays sounds and imported songs.', - 'newscaster': - 'A tool that allows you to broadcast news to other crew members.', + newscaster: 'A tool that allows you to broadcast news to other crew members.', 'door jack': 'A tool that allows you to open doors.', 'encryption keys': 'A tool that allows you to decrypt and speak on other radio frequencies.', @@ -92,19 +103,19 @@ const SOFTWARE_DESC = { }; const ICON_MAP = { - 'angry': 'angry', - 'cat': 'cat', + angry: 'angry', + cat: 'cat', 'extremely-happy': 'grin-beam', - 'laugh': 'grin-squint', - 'happy': 'smile', - 'off': 'power-off', - 'sad': 'frown', - 'sunglasses': 'sun', - 'what': 'question', + laugh: 'grin-squint', + happy: 'smile', + off: 'power-off', + sad: 'frown', + sunglasses: 'sun', + what: 'question', }; -export const PaiInterface = (_, context) => { - const [tab, setTab] = useLocalState(context, 'tab', 1); +export const PaiInterface = (_) => { + const [tab, setTab] = useLocalState('tab', 1); const setTabHandler = (tab: number) => { setTab(tab); }; @@ -137,25 +148,29 @@ const TabDisplay = (props) => { onTabClick(Tab.System)} - selected={tab === Tab.System}> + selected={tab === Tab.System} + > System onTabClick(Tab.Directive)} - selected={tab === Tab.Directive}> + selected={tab === Tab.Directive} + > Directives onTabClick(Tab.Installed)} - selected={tab === Tab.Installed}> + selected={tab === Tab.Installed} + > Installed onTabClick(Tab.Available)} - selected={tab === Tab.Available}> + selected={tab === Tab.Available} + > Download @@ -176,8 +191,8 @@ const SystemDisplay = () => { }; /** Renders some ASCII art. Changes to red on emag. */ -const SystemWallpaper = (_, context) => { - const { data } = useBackend(context); +const SystemWallpaper = (_) => { + const { data } = useBackend(); const { emagged } = data; const owner = !emagged ? 'NANOTRASEN' : ' SYNDICATE'; @@ -221,8 +236,8 @@ const SystemWallpaper = (_, context) => { /** Displays master info. * You can check their DNA and change your image here. */ -const SystemInfo = (_, context) => { - const { act, data } = useBackend(context); +const SystemInfo = (_) => { + const { act, data } = useBackend(); const { image, master } = data; return ( @@ -233,20 +248,23 @@ const SystemInfo = (_, context) => { disabled={!master.dna} icon="dna" onClick={() => act('check_dna')} - tooltip="Verifies your master's DNA. Must be carried in hand."> + tooltip="Verifies your master's DNA. Must be carried in hand." + > Verify } fill scrollable - title="System Info"> + title="System Info" + > {master.name || 'None.'} @@ -258,8 +276,8 @@ const SystemInfo = (_, context) => { }; /** Shows the hardcoded PAI info along with any supplied orders. */ -const DirectiveDisplay = (_, context) => { - const { data } = useBackend(context); +const DirectiveDisplay = (_) => { + const { data } = useBackend(); const { directives, master } = data; return ( @@ -284,7 +302,7 @@ const DirectiveDisplay = (_, context) => { Serve your master. - {directives} + {directives} )} @@ -298,12 +316,8 @@ const DirectiveDisplay = (_, context) => { * another section that displays the selected installed * software info. */ -const InstalledDisplay = (_, context) => { - const [installSelected, setInstallSelected] = useLocalState( - context, - 'software', - '' - ); +const InstalledDisplay = (_) => { + const [installSelected, setInstallSelected] = useLocalState('software', ''); const onInstallHandler = (software: string) => { setInstallSelected(software); }; @@ -321,8 +335,8 @@ const InstalledDisplay = (_, context) => { }; /** Iterates over installed software to render buttons. */ -const InstalledSoftware = (props, context) => { - const { data } = useBackend(context); +const InstalledSoftware = (props) => { + const { data } = useBackend(); const { installed = [] } = data; const { onInstallClick } = props; @@ -335,7 +349,7 @@ const InstalledSoftware = (props, context) => { return ( ); @@ -363,8 +377,10 @@ const InstalledInfo = (props) => { !software ? 'Select a Program' : software.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => - letter.toUpperCase()) - }> + letter.toUpperCase(), + ) + } + > {software && ( {SOFTWARE_DESC[software] || ''} @@ -379,8 +395,8 @@ const InstalledInfo = (props) => { }; /** Todo: Remove this entirely when records get a TGUI interface themselves */ -const RecordsDisplay = (props, context) => { - const { act, data } = useBackend(context); +const RecordsDisplay = (props) => { + const { act, data } = useBackend(); const { record_type } = props; const { records = [], refresh_spam } = data; const convertedRecords: CrewRecord[] = records[record_type]; @@ -394,7 +410,8 @@ const RecordsDisplay = (props, context) => { @@ -404,7 +421,8 @@ const RecordsDisplay = (props, context) => { } fill - scrollable> + scrollable + > {convertedRecords?.map((record) => { return ; @@ -450,8 +468,8 @@ const RecordRow = (props) => { /** Once a software is selected, generates custom buttons or a default * power toggle. */ -const SoftwareButtons = (props, context) => { - const { act, data } = useBackend(context); +const SoftwareButtons = (props) => { + const { act, data } = useBackend(); const { door_jack, languages, pda } = data; const { software } = props; @@ -462,19 +480,22 @@ const SoftwareButtons = (props, context) => { @@ -485,20 +506,23 @@ const SoftwareButtons = (props, context) => { @@ -508,17 +532,20 @@ const SoftwareButtons = (props, context) => { <> @@ -529,7 +556,8 @@ const SoftwareButtons = (props, context) => { ); @@ -538,7 +566,8 @@ const SoftwareButtons = (props, context) => { ); @@ -551,15 +580,16 @@ const AvailableDisplay = () => { buttons={} fill scrollable - title="Available Software"> + title="Available Software" + > ); }; /** Displays the remaining RAM left as a progressbar. */ -const AvailableMemory = (_, context) => { - const { data } = useBackend(context); +const AvailableMemory = (_) => { + const { data } = useBackend(); const { ram } = data; return ( @@ -588,8 +618,8 @@ const AvailableMemory = (_, context) => { /** A list of available software. * creates table rows for each, like a vendor. */ -const AvailableSoftware = (_, context) => { - const { data } = useBackend(context); +const AvailableSoftware = (_) => { + const { data } = useBackend(); const { available } = data; const convertedList: Available[] = Object.entries(available).map((key) => { return { name: key[0], value: key[1] }; @@ -605,8 +635,8 @@ const AvailableSoftware = (_, context) => { }; /** A row for an individual software listing. */ -const AvailableRow = (props, context) => { - const { act, data } = useBackend(context); +const AvailableRow = (props) => { + const { act, data } = useBackend(); const { ram } = data; const { installed } = data; const { software } = props; @@ -634,7 +664,8 @@ const AvailableRow = (props, context) => { mb={0.5} disabled={ram < software.value || purchased} onClick={() => act('buy', { selection: software.name })} - tooltip={SOFTWARE_DESC[software.name] || ''}> + tooltip={SOFTWARE_DESC[software.name] || ''} + > diff --git a/tgui/packages/tgui/interfaces/PaiSubmit.tsx b/tgui/packages/tgui/interfaces/PaiSubmit.tsx index 01762b52f653..66c80b11a7a3 100644 --- a/tgui/packages/tgui/interfaces/PaiSubmit.tsx +++ b/tgui/packages/tgui/interfaces/PaiSubmit.tsx @@ -19,9 +19,9 @@ const PAI_RULES = `You are expected to role play to some degree. Keep in mind: Not entering information may lead to you not being selected. Press submit to alert pAI cards of your candidacy.`; -export const PaiSubmit = (_, context) => { - const { data } = useBackend(context); - const [input, setInput] = useLocalState(context, 'input', { +export const PaiSubmit = (_) => { + const { data } = useBackend(); + const [input, setInput] = useLocalState('input', { comments: data.comments || '', description: data.description || '', name: data.name || '', @@ -113,8 +113,8 @@ const InputDisplay = (props) => { }; /** Gives the user a submit button */ -const ButtonsDisplay = (props, context) => { - const { act } = useBackend(context); +const ButtonsDisplay = (props) => { + const { act } = useBackend(); const { input } = props; return ( @@ -123,14 +123,16 @@ const ButtonsDisplay = (props, context) => { @@ -139,7 +141,9 @@ const ButtonsDisplay = (props, context) => { onClick={() => act('submit', { candidate: input, - })}> + }) + } + > SUBMIT diff --git a/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx b/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx index d2d6e42ef3de..08a943c28cf7 100644 --- a/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx +++ b/tgui/packages/tgui/interfaces/PaintingAdminPanel.tsx @@ -1,7 +1,9 @@ import { decodeHtmlEntities } from 'common/string'; + import { resolveAsset } from '../assets'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, LabeledList, Section, Table } from '../components'; +import { Image } from '../components/Image'; import { Window } from '../layouts'; type PaintingAdminPanelData = { @@ -9,82 +11,134 @@ type PaintingAdminPanelData = { }; type PaintingData = { - md5: string, - title: string, - creator_ckey: string, - creator_name: string | null, - creation_date: Date | null, - creation_round_id: number | null, - patron_ckey: string | null, - patron_name: string | null, - credit_value: number, - width: number, - height: number, - ref: string, - tags: string[] | null, - medium: string | null -} + creation_date: Date | null; + creation_round_id: number | null; + creator_ckey: string; + creator_name: string | null; + credit_value: number; + height: number; + md5: string; + medium: string | null; + patron_ckey: string | null; + patron_name: string | null; + ref: string; + tags: string[] | null; + title: string; + width: number; +}; -export const PaintingAdminPanel = (props, context) => { - const { act, data } = useBackend(context); - const [chosenPaintingRef, setChosenPaintingRef] = useLocalState(context, 'chosenPainting', null); - const { - paintings, - } = data; - const chosenPainting = paintings.find(p => p.ref === chosenPaintingRef); +export const PaintingAdminPanel = (props) => { + const { act, data } = useBackend(); + const [chosenPaintingRef, setChosenPaintingRef] = useLocalState< + string | null + >('chosenPainting', null); + const { paintings } = data; + const chosenPainting = paintings.find((p) => p.ref === chosenPaintingRef); return ( - + {chosenPainting && ( -
setChosenPaintingRef(null)}>Close}> - setChosenPaintingRef(null)}>Close + } + > + + verticalAlign: 'middle', + }} + /> - {decodeHtmlEntities(chosenPainting.title)} - + { + setChosenPaintingRef(null); + act('delete', { ref: chosenPainting.ref }); + }} + > + Delete + +
)} @@ -96,23 +150,21 @@ export const PaintingAdminPanel = (props, context) => { Preview Actions - {paintings.map(painting => ( - - + {paintings.map((painting) => ( + + {decodeHtmlEntities(painting.title)} {painting.creator_ckey} - + + - ); - })} + return ( + + ); + })} ); }; /** Displays info for the loaded blood, if any */ -const SpecimenDisplay = (_, context) => { - const { act, data } = useBackend(context); - const [tab, setTab] = useLocalState(context, 'tab', 0); +const SpecimenDisplay = (_) => { + const { act, data } = useBackend(); + const [tab, setTab] = useLocalState('tab', 0); const { is_ready, viruses = [] } = data; const virus = viruses[tab]; const setTabHandler = (index: number) => { @@ -271,18 +286,19 @@ const SpecimenDisplay = (_, context) => { onClick={() => act('create_culture_bottle', { index: virus.index, - })} + }) + } /> - }> + } + > - {virus?.symptoms - && } + {virus?.symptoms && } @@ -292,8 +308,8 @@ const SpecimenDisplay = (_, context) => { /** Virus Tab display - changes the tab for virus info * Whenever the tab changes, the virus info is updated */ -const VirusTabs = (props: TabsProps, context) => { - const { data } = useBackend(context); +const VirusTabs = (props: TabsProps) => { + const { data } = useBackend(); const { tab, tabHandler } = props; const { viruses = [] } = data; @@ -304,7 +320,8 @@ const VirusTabs = (props: TabsProps, context) => { tabHandler(index)} - key={virus.name}> + key={virus.name} + > {virus.name} ); @@ -337,8 +354,8 @@ const VirusDisplay = (props: VirusDisplayProps) => { }; /** Displays the description, name and other info for the virus. */ -const VirusTextInfo = (props: VirusInfoProps, context) => { - const { act } = useBackend(context); +const VirusTextInfo = (props: VirusInfoProps) => { + const { act } = useBackend(); const { virus } = props; return ( @@ -352,7 +369,8 @@ const VirusTextInfo = (props: VirusInfoProps, context) => { act('rename_disease', { index: virus.index, name: value, - })} + }) + } /> ) : ( {virus.name} @@ -383,14 +401,16 @@ const VirusTraitInfo = (props: VirusInfoProps) => { + label="Resistance" + > {virus.resistance} + label="Stage speed" + > {virus.stage_speed} @@ -402,7 +422,8 @@ const VirusTraitInfo = (props: VirusInfoProps) => { + label="Transmissibility" + > {virus.transmission} @@ -457,14 +478,16 @@ const SymptomTraitInfo = (props: SymptomInfoProps) => { + label="Resistance" + > {symptom.resistance} + label="Stage Speed" + > {symptom.stage_speed} @@ -476,7 +499,8 @@ const SymptomTraitInfo = (props: SymptomInfoProps) => { + label="Transmission" + > {symptom.transmission} diff --git a/tgui/packages/tgui/interfaces/PaperSheet.js b/tgui/packages/tgui/interfaces/PaperSheet.js deleted file mode 100644 index 7994a992995e..000000000000 --- a/tgui/packages/tgui/interfaces/PaperSheet.js +++ /dev/null @@ -1,665 +0,0 @@ -/** - * @file - * @copyright 2020 WarlockD (https://github.com/warlockd) - * @author Original WarlockD (https://github.com/warlockd) - * @author Changes stylemistake - * @author Changes ThePotato97 - * @author Changes Ghommie - * @author Changes Timberpoes - * @license MIT - */ - -import { classes } from 'common/react'; -import { Component } from 'inferno'; -import { marked } from 'marked'; -import { useBackend } from '../backend'; -import { Box, Flex, Tabs, TextArea } from '../components'; -import { Window } from '../layouts'; -import { clamp } from 'common/math'; -import { sanitizeText } from '../sanitize'; -const MAX_PAPER_LENGTH = 5000; // Question, should we send this with ui_data? - -// Hacky, yes, works?...yes -const textWidth = (text, font, fontsize) => { - // default font height is 12 in tgui - font = fontsize + "x " + font; - const c = document.createElement('canvas'); - const ctx = c.getContext("2d"); - ctx.font = font; - const width = ctx.measureText(text).width; - return width; -}; - -const setFontinText = (text, font, color, bold=false) => { - return "" + text + ""; -}; - -const createIDHeader = index => { - return "paperfield_" + index; -}; -// To make a field you do a [_______] or however long the field is -// we will then output a TEXT input for it that hopefully covers -// the exact amount of spaces -const field_regex = /\[(_+)\]/g; -const field_tag_regex = /\[paperfield_\d+)"(.*?)\/>\]/gm; -const sign_regex = /%s(?:ign)?(?=\\s|$)?/igm; - -const createInputField = (length, width, font, - fontsize, color, id) => { - return "[]"; -}; - -const createFields = (txt, font, fontsize, color, counter) => { - const ret_text = txt.replace(field_regex, (match, p1, offset, string) => { - const width = textWidth(match, font, fontsize) + "px"; - return createInputField(p1.length, - width, font, fontsize, color, createIDHeader(counter++)); - }); - return { - counter, - text: ret_text, - }; -}; - -const signDocument = (txt, color, user) => { - return txt.replace(sign_regex, () => { - return setFontinText(user, "Times New Roman", color, true); - }); -}; - -const run_marked_default = value => { - // Override function, any links and images should - // kill any other marked tokens we don't want here - const walkTokens = token => { - switch (token.type) { - case 'url': - case 'autolink': - case 'reflink': - case 'link': - case 'image': - token.type = 'text'; - // Once asset system is up change to some default image - // or rewrite for icon images - token.href = ""; - break; - } - }; - return marked(value, { - breaks: true, - smartypants: true, - smartLists: true, - walkTokens, - // Once assets are fixed might need to change this for them - baseUrl: 'thisshouldbreakhttp', - }); -}; - -/* -** This gets the field, and finds the dom object and sees if -** the user has typed something in. If so, it replaces, -** the dom object, in txt with the value, spaces so it -** fits the [] format and saves the value into a object -** There may be ways to optimize this in javascript but -** doing this in byond is nightmarish. -** -** It returns any values that were saved and a corrected -** html code or null if nothing was updated -*/ -const checkAllFields = (txt, font, color, user_name, bold=false) => { - let matches; - let values = {}; - let replace = []; - // I know its tempting to wrap ALL this in a .replace - // HOWEVER the user might not of entered anything - // if thats the case we are rebuilding the entire string - // for nothing, if nothing is entered, txt is just returned - while ((matches = field_tag_regex.exec(txt)) !== null) { - const full_match = matches[0]; - const id = matches.groups.id; - if (id) { - const dom = document.getElementById(id); - // make sure we got data, and kill any html that might - // be in it - const dom_text = dom && dom.value ? dom.value : ""; - if (dom_text.length === 0) { - continue; - } - const sanitized_text = sanitizeText(dom.value.trim(), []); - if (sanitized_text.length === 0) { - continue; - } - // this is easier than doing a bunch of text manipulations - const target = dom.cloneNode(true); - // in case they sign in a field - if (sanitized_text.match(sign_regex)) { - target.style.fontFamily = "Times New Roman"; - bold = true; - target.defaultValue = user_name; - } - else { - target.style.fontFamily = font; - target.defaultValue = sanitized_text; - } - if (bold) { - target.style.fontWeight = "bold"; - } - target.style.color = color; - target.disabled = true; - const wrap = document.createElement('div'); - wrap.appendChild(target); - values[id] = sanitized_text; // save the data - replace.push({ value: "[" + wrap.innerHTML + "]", raw_text: full_match }); - } - } - if (replace.length > 0) { - for (const o of replace) { - - txt = txt.replace(o.raw_text, o.value); - } - } - return { text: txt, fields: values }; -}; - -const pauseEvent = e => { - if (e.stopPropagation) { e.stopPropagation(); } - if (e.preventDefault) { e.preventDefault(); } - e.cancelBubble=true; - e.returnValue=false; - return false; -}; - -const Stamp = (props, context) => { - const { - image, - opacity, - } = props; - const stamp_transform = { - 'left': image.x + 'px', - 'top': image.y + 'px', - 'transform': 'rotate(' + image.rotate + 'deg)', - 'opacity': opacity || 1.0, - }; - return ( -
- ); -}; - - -const setInputReadonly = (text, readonly) => { - return readonly - ? text.replace(/ { - const { - value = "", - stamps = [], - backgroundColor, - readOnly, - } = props; - const stamp_list = stamps; - const text_html = { - __html: '' - + setInputReadonly(value, readOnly) - + '', - }; - return ( - - - {stamp_list.map((o, i) => ( - - ))} - - ); -}; - -// again, need the states for dragging and such -class PaperSheetStamper extends Component { - constructor(props, context) { - super(props, context); - this.state = { - x: 0, - y: 0, - rotate: 0, - }; - this.style = null; - this.handleMouseMove = e => { - const pos = this.findStampPosition(e); - if (!pos) { return; } - // center offset of stamp & rotate - pauseEvent(e); - this.setState({ x: pos[0], y: pos[1], rotate: pos[2] }); - }; - this.handleMouseClick = e => { - if (e.pageY <= 30) { return; } - const { act, data } = useBackend(this.context); - const stamp_obj = { - x: this.state.x, y: this.state.y, r: this.state.rotate, - stamp_class: this.props.stamp_class, - stamp_icon_state: data.stamp_icon_state, - }; - act("stamp", stamp_obj); - }; - } - - findStampPosition(e) { - let rotating; - const windowRef = document.querySelector('.Layout__content'); - if (e.shiftKey) { - rotating = true; - } - - if (document.getElementById("stamp")) - { - const stamp = document.getElementById("stamp"); - const stampHeight = stamp.clientHeight; - const stampWidth = stamp.clientWidth; - - const currentHeight = rotating ? this.state.y : e.pageY - - windowRef.scrollTop - stampHeight; - const currentWidth = rotating ? this.state.x : e.pageX - (stampWidth / 2); - - const widthMin = 0; - const heightMin = 0; - - const widthMax = (windowRef.clientWidth) - ( - stampWidth); - const heightMax = (windowRef.clientHeight - windowRef.scrollTop) - ( - stampHeight); - - const radians = Math.atan2( - e.pageX - currentWidth, - e.pageY - currentHeight - ); - - const rotate = rotating ? (radians * (180 / Math.PI) * -1) - : this.state.rotate; - - const pos = [ - clamp(currentWidth, widthMin, widthMax), - clamp(currentHeight, heightMin, heightMax), - rotate, - ]; - return pos; - } - } - - componentDidMount() { - document.addEventListener("mousemove", this.handleMouseMove); - document.addEventListener("click", this.handleMouseClick); - } - - componentWillUnmount() { - document.removeEventListener("mousemove", this.handleMouseMove); - document.removeEventListener("click", this.handleMouseClick); - } - - render() { - const { - value, - stamp_class, - stamps, - } = this.props; - const stamp_list = stamps || []; - const current_pos = { - sprite: stamp_class, - x: this.state.x, - y: this.state.y, - rotate: this.state.rotate, - }; - return ( - <> - - - - ); - } -} - -// This creates the html from marked text as well as the form fields -const createPreview = ( - value, - text, - do_fields = false, - field_counter, - color, - font, - user_name, - is_crayon = false, -) => { - const out = { text: text }; - // check if we are adding to paper, if not - // we still have to check if someone entered something - // into the fields - value = value.trim(); - if (value.length > 0) { - // First lets make sure it ends in a new line - value += value[value.length] === "\n" ? " \n" : "\n \n"; - // Second, we sanitize the text of html - const sanitized_text = sanitizeText(value); - const signed_text = signDocument(sanitized_text, color, user_name); - // Third we replace the [__] with fields as markedjs fucks them up - const fielded_text = createFields( - signed_text, font, 12, color, field_counter); - // Fourth, parse the text using markup - const formatted_text = run_marked_default(fielded_text.text); - // Fifth, we wrap the created text in the pin color, and font. - // crayon is bold ( tags), maybe make fountain pin italic? - const fonted_text = setFontinText( - formatted_text, font, color, is_crayon); - out.text += fonted_text; - out.field_counter = fielded_text.counter; - } - if (do_fields) { - // finally we check all the form fields to see - // if any data was entered by the user and - // if it was return the data and modify the text - const final_processing = checkAllFields( - out.text, font, color, user_name, is_crayon); - out.text = final_processing.text; - out.form_fields = final_processing.fields; - } - return out; -}; - -// ugh. So have to turn this into a full -// component too if I want to keep updates -// low and keep the weird flashing down -class PaperSheetEdit extends Component { - constructor(props, context) { - super(props, context); - this.state = { - previewSelected: "Preview", - old_text: props.value || "", - counter: props.counter || 0, - textarea_text: "", - combined_text: props.value || "", - }; - } - - createPreviewFromData(value, do_fields = false) { - const { data } = useBackend(this.context); - return createPreview(value, - this.state.old_text, - do_fields, - this.state.counter, - data.pen_color, - data.pen_font, - data.edit_usr, - data.is_crayon, - ); - } - onInputHandler(e, value) { - if (value !== this.state.textarea_text) { - const combined_length = this.state.old_text.length - + this.state.textarea_text.length; - if (combined_length > MAX_PAPER_LENGTH) { - if ((combined_length - MAX_PAPER_LENGTH) >= value.length) { - // Basically we cannot add any more text to the paper - value = ''; - } else { - value = value.substr(0, value.length - - (combined_length - MAX_PAPER_LENGTH)); - } - // we check again to save an update - if (value === this.state.textarea_text) { - // Do nothing - return; - } - } - this.setState(() => ({ - textarea_text: value, - combined_text: this.createPreviewFromData(value), - })); - } - } - // the final update send to byond, final upkeep - finalUpdate(new_text) { - const { act } = useBackend(this.context); - const final_processing = this.createPreviewFromData(new_text, true); - act('save', final_processing); - this.setState(() => { return { - textarea_text: "", - previewSelected: "save", - combined_text: final_processing.text, - old_text: final_processing.text, - counter: final_processing.field_counter, - }; }); - // byond should switch us to readonly mode from here - } - - render() { - const { - textColor, - fontFamily, - stamps, - backgroundColor, - } = this.props; - return ( - - - - this.setState({ previewSelected: "Edit" })}> - Edit - - this.setState(() => { - const new_state = { - previewSelected: "Preview", - textarea_text: this.state.textarea_text, - combined_text: this.createPreviewFromData( - this.state.textarea_text).text, - }; - return new_state; - })}> - Preview - - { - if (this.state.previewSelected === "confirm") { - this.finalUpdate(this.state.textarea_text); - } - else if (this.state.previewSelected === "Edit") { - this.setState(() => { - const new_state = { - previewSelected: "confirm", - textarea_text: this.state.textarea_text, - combined_text: this.createPreviewFromData( - this.state.textarea_text).text, - }; - return new_state; - }); - } - else { - this.setState({ previewSelected: "confirm" }); - } - }}> - {this.state.previewSelected === "confirm" ? "Confirm" : "Save"} - - - - - {this.state.previewSelected === "Edit" && ( -